ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzlhYjAKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsOTkgQEAKKyMgRWNsaXBzZQorLmNsYXNzcGF0aAorLnByb2plY3QKKy5zZXR0aW5ncy8KKworIyBNYXZlbgorbG9nLwordGFyZ2V0LworCisjIFBhY2thZ2UgRmlsZXMgIworKi5qYXIKKyoud2FyCisqLmVhcgorCisjIE90aGVyCisqLmNsYXNzCisqLm9yaWcKK2NhdGFsb2ctdWkvLioKK2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdHNjb25maWcuanNvbgorY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9yZWZlcmVuY2VzLnRzCitjYXRhbG9nLXVpL2FwcC9zY3JpcHRzLyoqLyouanMKK2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvKiovKi5qcy5tYXAKKworIyBjYXRhbG9nLXVpCitjYXRhbG9nLXVpL2FwcC8qKi8qLmNzcworY2F0YWxvZy11aS8uZWRpdG9yY29uZmlnCitjYXRhbG9nLXVpLy5qc2hpbnRyYworY2F0YWxvZy11aS8ueW8tcmMuanNvbgorY2F0YWxvZy11aS9hcHAvcm9ib3RzLnR4dAorY2F0YWxvZy11aS9ub2RlX21vZHVsZXMvCitjYXRhbG9nLXVpL2Jvd2VyX2NvbXBvbmVudHMvCitjYXRhbG9nLXVpL2FwcC90c2NvbmZpZy5qc29uCisKKworY2F0YWxvZy1iZS8uY2hlY2tzdHlsZQorY2F0YWxvZy1iZS9iaW4vCitjYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKK2NhdGFsb2ctYnVpbGRlcnMvc3JjL3Rlc3QvamF2YS9jb20vYXR0L3Rsdi9zZGMvYmUvYnVpbGRlcnMvdG9zY2EvdDEKK2E0Yy8KK2NhdGFsb2ctdWkvKi50bXAudHh0CitjYXRhbG9nLWRhby9iaW4vCitjYXRhbG9nLXVpL2Rpc3QKK2NhdGFsb2ctYnVpbGRlcnMvYmluLworY29tbW9uLWFwcC1hcGkvYmluLworZGF0YS9jb21wdXRlLnBuZworZGF0YS9sb2FkYmFsYW5jZXIucG5nCitkYXRhL215c3FsLnBuZworZGF0YS9uZXR3b3JrLnBuZworZGF0YS9ub3JtYXRpdmUtdHlwZXMtYmxvY2tTdG9yYWdlLnltbAorZGF0YS9ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZS55bWwKK2RhdGEvbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlLnltbAorZGF0YS9ub3JtYXRpdmUtdHlwZXMtREJNUy55bWwKK2RhdGEvbm9ybWF0aXZlLXR5cGVzLW5ldHdvcmsueW1sCitkYXRhL25vcm1hdGl2ZS10eXBlcy1vYmplY3RTdG9yYWdlLnltbAorZGF0YS9ub3JtYXRpdmUtdHlwZXMtcm9vdC55bWwKK2RhdGEvbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50LnltbAorZGF0YS9ub3JtYXRpdmUtdHlwZXMtd2ViQXBwbGljYXRpb24ueW1sCitkYXRhL25vcm1hdGl2ZS10eXBlcy13ZWJTZXJ2ZXIueW1sCitkYXRhL29iamVjdHN0b3JlLnBuZworZGF0YS9yZWxhdGlvbmFsX2RiLnBuZworZGF0YS9yb290LnBuZworZGF0YS9yb3V0ZXIucG5nCitkYXRhL3NvZnR3YXJlLnBuZworZGF0YS92b2x1bWUucG5nCitjYXRhbG9nLXVpL2FwcC9kaXN0LyoKK2NhdGFsb2ctZmUvc3JjL21haW4vd2ViYXBwLyoKK2NhdGFsb2ctZmUvYmluCishY2F0YWxvZy1mZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi8KKyFjYXRhbG9nLWZlL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi8KK3VpLWNpLy50ZXJuLXByb2plY3QKK2NhdGFsb2ctYmUvZGF0YS8qCitjaS9zcmMvbWFpbi9qYXZhL2NvbS9hdHQvdGx2L3NkYy9jaS90ZXN0cy9leGVjdXRlL1NoYXlQcmFjdGljZVRlc3RzLmphdmEKK2NpL3NyYy9tYWluL2phdmEvY29tL2F0dC90bHYvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvU2hheVByYWN0aWNlVGVzdHMuamF2YQorLm1ldGFkYXRhLyoKKy5tZXRhZGF0YS8qCisuaWRlYS8qCisqLmltbAorY2F0YWxvZy11aS9ucG0tZGVidWcubG9nCitzZG5jLXRlc3RzL2xvZ3Mvd29yZG5pay5sb2cKK2Rpc3RyaWJ1dGlvbi1jaS9sb2dzLyoKK3ZhZ3JhbnQtYXNkYy1hbGwtaW4tb25lLworY2F0YWxvZy11aS90ZXN0cy9Db3ZlcmFnZS8qCitjYXRhbG9nLXVpL0Nocm9tZSoKK2NhdGFsb2ctdWkvUGhhbnRvbUpTXzEuOS44XyhXaW5kb3dzXzdfMC4wLjApLyoKKworLm1ldGFkYXRhLworYmluLworVmFncmFudGZpbGUKK3NkbmMtdGVzdHMvdGVzdC1vdXRwdXQvKgorc2RuYy10ZXN0cy1uZXctZnJhbWUtd29yay90ZXN0LW91dHB1dC8qCit1aS1jaS90ZXN0LW91dHB1dC8qCisKKworc2RuYy10ZXN0cy1uZXctZnJhbWUtd29yay90ZXN0LW91dHB1dC8qKgorYXNkYy10ZXN0cy90ZXN0LW91dHB1dC8qKgorCithc2RjLWNoZWYvY29va2Jvb2tzL0RlcGxveS1TRGFuZEMvYXR0cmlidXRlcy92ZXJzaW9uLnJiCithc2RjLXRlc3RzL0V4dGVudFJlcG9ydC9BU0RDX0NJX0V4dGVudF9SZXBvcnQuaHRtbAorCmRpZmYgLS1naXQgYS8uZ2l0cmV2aWV3IGIvLmdpdHJldmlldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjEwNTRiCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdHJldmlldwpAQCAtMCwwICsxLDQgQEAKK1tnZXJyaXRdCitob3N0PWdlcnJpdC5vcGVuZWNvbXAub3JnCitwb3J0PTI5NDE4Citwcm9qZWN0PXNkYy5naXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8ucHlkZXZwcm9qZWN0IGIvLnB5ZGV2cHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU5ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvLnB5ZGV2cHJvamVjdApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPD9lY2xpcHNlLXB5ZGV2IHZlcnNpb249IjEuMCI/PjxweWRldl9wcm9qZWN0PgorPHB5ZGV2X3Byb3BlcnR5IG5hbWU9Im9yZy5weXRob24ucHlkZXYuUFlUSE9OX1BST0pFQ1RfSU5URVJQUkVURVIiPkRlZmF1bHQ8L3B5ZGV2X3Byb3BlcnR5PgorPHB5ZGV2X3Byb3BlcnR5IG5hbWU9Im9yZy5weXRob24ucHlkZXYuUFlUSE9OX1BST0pFQ1RfVkVSU0lPTiI+cHl0aG9uIDIuNzwvcHlkZXZfcHJvcGVydHk+Cis8L3B5ZGV2X3Byb2plY3Q+CmRpZmYgLS1naXQgYS9MSUNFTlNFLlRYVCBiL0xJQ0VOU0UuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OWRlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFLlRYVApAQCAtMCwwICsxLDI0IEBACisvKgorKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogQ29weXJpZ2h0IMKpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuCisqIENvcHlyaWdodCDCqSAyMDE3IEFtZG9jcworKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogRUNPTVAgYW5kIE9wZW5FQ09NUCBhcmUgdHJhZGVtYXJrcworKiBhbmQgc2VydmljZSBtYXJrcyBvZiBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4KKyoKKyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NzQ1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWQKQEAgLTAsMCArMSwxNjUgQEAKKyMgT3BlbkVDT01QIFNEQworCistLS0KKy0tLQorCisKKyMgSW50cm9kdWN0aW9uCisKK09wZW5FQ09NUCBTREMgaXMgZGVsaXZlcmVkIHdpdGggNSBEb2NrZXIgY29udGFpbmVyczoKKzEuIHNkYy1GRQktIGZyb250ZW5kIFNEQyBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIGpldHR5IHNlcnZlcgorMi4gc2RjLUJFCS0gYmFja2VuZCBTREMgYXBwbGljYXRpb24gcnVubmluZyBvbiBqZXR0eSBzZXJ2ZXIKKzMuIHNkYy1rYm4JLSBob3N0aW5nIGtpYmFuYSBhcHBsaWNhdGlvbgorNC4gc2RjLWNzCS0gaG9zdGluZyBjYXNzYW5kcmEKKzUuIHNkYy1lcwktIGhvc3RpbmcgZWxhc3RpYyBzZWFyY2gKKworQWxsIGNvbnRhaW5lcnMgcnVucyBvbiB0aGUgc2FtZSBtYWNoaW5lIGFuZCBjYW4gYmUgc3RhcnRlZCBieSBydW5uaW4gdGhlIGNvbW1hbmQ6CisvZGF0YS9zY3JpcHRzL2RvY2tlcl9ydW4uc2ggLWUgPGVudmlyb25tZW50IG5hbWU+IC1yIDxyZWxlYXNlPiAtcCA8ZG9ja2VyLWh1Yi1wb3J0PgorRXhhbXBsZTogL2RhdGEvc2NyaXB0cy9kb2NrZXJfcnVuLnNoIC1lIE9TLUVURS1ERlcgLXAgNTEyMjAKKworCisjIENvbXBpbGluZyBTREMKKworU0RDIGlzIGJ1aWx0IGZyb20gc2V2ZXJhbCBwcm9qZWN0cywgd2hpbGUgInNkYy1tYWluIiBjb250YWlucyB0aGUgbWFpbiBwb20ueG1sIGZvciBhbGwgcHJvamVjdDoKKy0gY2F0YWxvZy1iZQkJLSBiYWNrZW5kIGNvZGUKKy0gY2F0YWxvZy1mZQkJLSBmcm9udGVuZCBqYXZhIGNvZGUgKHNlcnZsZXQsIHByb3h5KQorLSBjYXRhbG9nLWRhbwkJLSBkYXRhYmFzZSBsYXllcgorLSBjYXRhbG9nLW1vZGVsCQktIGRhdGEgbW9kZWwgb2YgdGhlIGFwcGxpY2F0aW9uCistIGNhdGFsb2ctdWkJCS0gZnJvbnQgZW5kIGNvZGUgKGphdmFzY3JpcHQsIGh0bWwsIGNzcykKKy0gY29tbW9uLWFwcC1hcGkJLSBjb21tb24gY29kZSBmb3IgZnJvbnRlbmQgYW5kIGJhY2tlbmQKKy0gY29tbW9uLWJlCQkJLSB1dGlsaXRpZXMsIGRhdGF0eXBlcyBhbmQgZW51bXMKKy0gc2VjdXJpdHktdXRpbHMJLSBoYW5kbGUgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIG9mIHBhc3N3b3JkcworCitTREMgcHJvamVjdHMgY2FuIGJlIGNvbXBpbGVkIGVhc2lseSB1c2luZyBtYXZlbiBjb21tYW5kOiBgbXZuIGNsZWFuIGluc3RhbGxgLiAKK0luIG9yZGVyIHRvIGJ1aWxkIGFsbCBwcm9qZWN0cywgZW50ZXIgdG8gc2RjLW1haW4gcHJvamVjdCBhbmQgcnVuIHRoZSBjb21tYW5kOiBgbXZuIGNsZWFuIGluc3RhbGxgLgorQnkgZGVmYXVsdCB1bml0IHRlc3Qgd2lsbCBydW4gd2hlbiBjb21waWxpbmcKKworKiogaWdvciAqKgorRG9ja2VyIGNvbnRhaW5lcnMgYXJlIGJ1aWxkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9maWxlIAorYC1QIGRvY2tlciAtRGRvY2tlci5idWlsZEFyZy5jaGVmX3JlcG9fYnJhbmNoX25hbWU9YnVnZml4L2V4dGVybmFsX2FkcmVzcyAtRGRvY2tlci5idWlsZEFyZy5jaGVmX3JlcG9fZ2l0X3VzZXJuYW1lPWdpdCAtRGRvY2tlci5idWlsZEFyZy5jaGVmX3JlcG9fYWRkcmVzcz0yMy4yNTMuMTQ5LjE3NS9TREMgLURkb2NrZXIuYnVpbGRBcmcuY2hlZl9yZXBvX2dpdF9uYW1lPWNoZWYtcmVwb2AKKworCisjIEdldHRpbmcgdGhlIGNvbnRhaW5lcnMKKworKioqdG8gYmUgY2hhbmdlZCBmb3IgcnJlbGVhc2UqKiogT3BlbkVDT01QIFNEQyBjb250YWluZXJzIGFyZSBzdG9yZWQgb24gdGhlIFJhY2tzcGFjZSBOZXh1cyBEb2NrZXIgUmVnaXN0cnkKKworVGhlIGZvbGxvd2luZyBEb2NrZXIgaW1hZ2VzIGFyZSB0aGUgYWN0dWFsIGRlcGxveW1lbnQgaW1hZ2VzIHVzZWQgZm9yIHJ1bm5pbmcgU0RDCisKK3wgTmFtZSAgICB8IFRhZyAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgc2RjLUZFICB8IDE2MTAuMi4xNiB8IENvbnRhaW5zIEpldHR5ICsgT3BlbkpESyArIFNEQyBmcm9udGVuZCBjb2RlICsgKiozcmQgcGFydHkgamFycyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgc2RjLUJFICB8IDE2MTAuMi4xNiB8IENvbnRhaW5zIEpldHR5ICsgT3BlbkpESyArIFNEQyBiYWNrZW5kIGNvZGUgKyAqKjNyZCBwYXJ0eSBqYXJzKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgc2RjLWtibiB8IDE2MTAuMi4xNiB8IENvbnRhaW5zIG5vZGVKcyArIEtpYmFuYSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgc2RjLWNzICB8IDE2MTAuMi4xNiB8IE9wZW5KREsgKyBDb250YWlucyBjYXNzYW5kcmEgYXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgc2RjLWVzICB8IDE2MTAuMi4xNiB8IEVsYXN0aWMgc2VhcmNoIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworCisqKioqKioqKioqKioqKioqKioqKioqKiBJc3JhZWwgKioqKioqKioqKioqKioqKioqKioqKioqCisjIFN0YXJ0aW5nIFNEQworVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBzdGFydCBPcGVuRUNPTVAgU0RDOgorVEJEIC0gSXNyYWVsCisKKyMgQWNjZXNzaW5nIFNEQworU0RDIFVJIGNhbiBiZSBhY2Nlc3NlZCBmcm9tOgorCisjIyMgRWNvbXAgcG9ydGFsCitMb2dpbiB0byBlY29tcCBwb3J0YWwgVVJMIHdpdGggdXNlciB0aGF0IGhhcyBwZXJtaXNzaW9uIGZvciBTREMgYXBwbGljYXRpb24uCitEZWZpbmUgaW4geW91ciBob3N0cyBmaWxlIHRoZSBmb2xsb3dpbmc6Cis8aXAgYWRkcmVzcyBvZiBTREMgYXBwbGljYXRpb24+IHNkYy5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnCis8aXAgYWRkcmVzcyBvZiBFY29tcCBwb3J0YWwgVVJMPiBwb3J0YWwuYXBpLnNpbXBsZWRlbW8ub3BlbmVjb21wLm9yZworT3BlbiBicm93c2VyIGFuZCBuYXZpZ2F0ZSB0bzogaHR0cDovL3BvcnRhbC5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnOjg5ODkvRUNPTVBQT1JUQUwvbG9naW4uaHRtCisKKyMjIyBXZWJzZWFsIHNpbXVsYXRvcgorVGhpcyBvcHRpb25zIGlzIGZvciBkZXZlbG9wZXJzIHRvIHJ1biBsb2NhbGx5IFNEQworMS4gQnVpbGQgd2ViIHNpbXVsYXRvciBXQVIgZmlsZTogcnVuIGBtdm4gY2xlYW4gaW5zdGFsbGAgb24gcHJvamVjdCAid2Vic2VhbCBzaW11bGF0b3IiLiBUaGlzIHdpbGwgZ2VuZXJhdGUgd2FyIGZpbGUgKFdTU2ltdWxhdG9yLndhcikgaW4gdGhlIHRhcmdldCBmb2xkZXIuCisyLiBDb3B5IHRoZSB3YXIgdG86IC9ob21lL3ZhZ3JhbnQvd2Vic2VhbC1zaW11bGF0b3Ivd2ViYXBwcworMy4gQWRkIHVzZXJzIHRvIHNpbXVsYXRvcjogb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgLSAvaG9tZS92YWdyYW50L3dlYnNlYWwtc2ltdWxhdG9yL2NvbmZpZy93ZWJzZWFsLmNvbmYgYW5kIGFkZCBuZXcgdXNlciB0byB0aGUgdXNlciBsaXN0LgorICAgTm90ZTogWW91IG5lZWQgdG8gZGVmaW5lIHRoZSB1c2VyIGluIHRoZSBTREMgYXMgd2VsbC4KKzQuIFJlc3RhcnQgdGhlIHNpbXVsYXRvcjoKKyAgIFN0b3AgdGhlIHNpbXVsYXRvcjogc3RvcFdlYnNlYWxTaW11bGF0b3Iuc2gKKyAgIFN0YXJ0IHRoZSBzaW11bGF0b3I6IHN0YXJ0V2Vic2VhbFNpbXVsYXRvci5zaAorNS4gRW50ZXIgdG8gVUk6IGh0dHA6Ly88aXAgYWRkcmVzcz46ODI4NS9zZGMxL2xvZ2luCisKKyMjIyBTREMgaW1wb3J0IG5vcm1hdGl2ZXMgZnJvbSBDTEkKK1NEQyBuZWVkcyB0byB3b3JrIHdpdGggcHJlZGVmaW5lZCBiYXNpYyBub3JtYXRpdmVzLCBpbiBvcmRlciB0byB1cGRhdGUgdGhlIGRhdGFiYXNlIHdpdGggdGhlIG5vcm1hdGl2ZXMgbmVlZCB0bzoKKzEuIEZyb20gY2F0YWxvZy1iZSBwcm9qZWN0IGNvcHk6CisgICBzcmNcbWFpblxyZXNvdXJjZXNcaW1wb3J0XHRvc2NhIC0+IHRvIDxtYWNoaW5lIGlwIGFkZHJlc3M+OmNhdGFsb2ctYmUvaW1wb3J0L3Rvc2NhCisgICBzcmNcbWFpblxyZXNvdXJjZXNcc2NyaXB0c1xpbXBvcnRcdG9zY2EgLT50byA8bWFjaGluZSBpcCBhZGRyZXNzPjpjYXRhbG9nLWJlL3NjcmlwdHMvaW1wb3J0L3Rvc2NhCisyLiBjZCBjYXRhbG9nLWJlL3NjcmlwdHMvaW1wb3J0L3Rvc2NhCiszLiBSdW46IHB5dGhvbiBpbXBvcnROb3JtYXRpdmVBbGwucHkKKzQuIFdhaXQgdW50aWwgYWxsIG5vcm1hdGl2ZXMgYXJlIGxvYWRlZCB0byB0aGUgZGF0YWJhc2UKKworCisjIyMgU0RDIEFQSXMKK1RCRAorCisjIyMjIyBNYWluIEFQSSBlbmRwb2ludHMgaW4gdGhlIGZpcnN0IG9wZW4gc291cmNlIHJlbGVhc2UgCisKKy0gKioqdG8gYmUgY29tcGxldGVkKioqIEFQSUhhbmRsZXIgaGVhbHRoIGNoZWNrcworVEJECisKKyMgQ29uZmlndXJhdGlvbiBvZiBTREMKK1RCRAorCitIZXJlIGFyZSB0aGUgbWFpbiBwYXJhbWV0ZXJzIHlvdSBjb3VsZCBjaGFuZ2U6IAorVEJECisKK1RoZSBjcmVkZW50aWFscyBhcmUgZGVmaW5lZCBpbiAyIHBsYWNlczoKK1RCRAorCisjIExvZ2dpbmcKK1RCRAorCisjIyMgSmV0dHkKK1RCRAorCisjIyMgRGVidWdpbmcKK1RCRAorCisjIFRlc3RpbmcgU0RDIEZ1bmN0aW9uYWxpdGllcworVEJECisKKyMjIyBGcm9udGVuZCBMb2NhbCBFbnYgLSBvbmJvYXJkaW5nCisKK1N0ZXBzOgorLS0tLS0tCitJbnN0YWxsIG5vZGVqcyAmIGd1bHAKKzEuIGRvd25sb2FkIG5vZGVqcyBmcm9tIGhlcmU6IGh0dHBzOi8vbm9kZWpzLm9yZy9lbi8gKHRha2UgdGhlICJjdXJyZW50IiB2ZXJzaW9uIHdpdGggbGF0ZXN0IGZlYXR1cmVzKSAmIGluc3RhbGwgaXQuCisyLiBpbnN0YWxsIGd1bHAgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IG5wbSBpbnN0YWxsIC0tZ2xvYmFsIGd1bHAtY2xpCisKK0luc3RhbGwgRE9YLVVJIGE6CistLS0tLS0tLS0tLS0tLS0tLQorMS4gcHVsbCBmb3IgbGF0ZXN0IGNoYW5nZXMKKzIuIGdvIHRvIGZvbGRlciBkb3gtc2VxdWVuY2UtZGlhZ3JhbS11aQorMy4gcnVuIG5wbSBpbnN0YWxsCis0LiB3YWl0IGZvciBpdC4uLgorNS4gZ28gdG8gZm9sZGVyIGRveC11aQorNi4gcnVuIG5wbSBpbnN0YWxsCis3LiBjcmVhdGUgYSBjb3B5IG9mIGRldkNvbmZpZy5kZWZhdWx0cy5qc29uIGZpbGUgYW5kIG5hbWUgaXQgZGV2Q29uZmlnLmpzb24gKHdlIGFscmVhZHkgY29uZmlndXJlZCBnaXQgdG8gaWdub3JlIGl0IHNvIGl0IHdpbGwgbm90IGJlIHB1c2hlZCkKKzguIGluIHRoYXQgZmlsZSwgcG9wdWxhdGUgdGhlIGZpZWxkcyBvZiB0aGUgSVAgYWRkcmVzc2VzIG9mIHlvdXIgQkUgbWFjaGluZSB5b3UnZCBsaWtlIHRvIGNvbm5lY3QgKHBheSBhdHRlbnRpb24sIGl0IGlzIGEgSlNPTiBmaWxlKTogRm9yIGV4YW1wbGUgaHR0cDovLzxob3N0Pjo8cG9ydD4KKzkuIGFmdGVyIGV2ZXJ5dGhpbmcgd2FzIHN1Y2Nlc3NmdWwsIHJ1biBndWxwCisxMC4gYWZ0ZXIgc2VydmVyIHdhcyB1cCwgeW91ciBmYXZvcml0ZSBVSSB3aWxsIHdhaXQgZm9yIHlvdSBhdDogaHR0cDovL2xvY2FsaG9zdDo5MDAwL3NkYzEvcHJveHktZGVzaWduZXIxIy9vbmJvYXJkVmVuZG9yCisKK1Ryb3VibGVzaG9vdGluZzoKKy0tLS0tLS0tLS0tLS0tLS0KK3wgUHJvYmxlbSAgICAgICAgICAgICAgICAgICAgICAgfCAgIFdoeSBpcyB0aGlzIGhhcHBlbmluZyB8IFNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBucG0gY2Fubm90IHJlYWNoIGRlc3RpbmF0aW9uICB8IG9uYm9hcmRpbmcgcHJveHkgICAgICAgIHwgV2hlbiB3aXRoaW4gb25ib2FyZGluZyBuZXR3b3JrLCB5b3Ugc2hvdWxkIHNldCBvbmJvYXJkaW5nIHByb3h5IHRvIE5QTSBhcyB0aGUgZm9sbG93aW5nOiAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IG5wbSBjb25maWcgc2V0IHByb3h5IGh0dHA6Ly9nZW5wcm94eTo4MDgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBucG0gY29uZmlnIHNldCBodHRwcy1wcm94eSBodHRwOi8vZ2VucHJveHk6ODA4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgZ2l0IHByb3RvY29sIGlzIGJsb2NrZWQgICAgICAgfCBvbmJvYXJkaW5nIG5ldHdvcmsgICAgICB8IFdoZW4gd2l0aGluIG9uYm9hcmRpbmcgbmV0d29yaywgeW91IHNob3VsZCBzZXQgZ2xvYmFsbHkgdGhhdCB3aGVuIGdpdCAgICAgICAgICAgICAgICAgICAgICB8Cit8IGFuZCBjYW5ub3QgY29ubmVjdCAgICAgICAgICAgIHwgcnVsZXMgZm9yIHByb3RvY29scyAgICAgfCBwcm90b2NvbCBpcyB1c2VkLCB0aGVuIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAiaHR0cHMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2l0IGNvbmZpZyAtLWdsb2JhbCB1cmwuImh0dHBzOi8vIi5pbnN0ZWFkT2YgZ2l0Oi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgR2V0dGluZyBIZWxwCisKKyoqKiB0byBiZSBjb21wbGV0ZWQgb24gcnJlbGVhc2UgKioqCisKK1NEQ0BsaXN0cy5vcGVuZWNvbXAub3JnCisKK1NEQyBKYXZhZG9jIGFuZCBNYXZlbiBzaXRlCisgCisqKiogdG8gYmUgY29tcGxldGVkIG9uIHJyZWxlYXNlICoqKgorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzLy5naXRpZ25vcmUgYi9hc2RjLXRlc3RzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NjM3MQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQgQEAKKy90YXJnZXQKKy9idWlsZC8KKy9iaW4vCisvdGFyZ2V0LwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9wb20ueG1sIGIvYXNkYy10ZXN0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzQ2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3BvbS54bWwKQEAgLTAsMCArMSwzNjcgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8YXJ0aWZhY3RJZD5hc2RjLXRlc3RzPC9hcnRpZmFjdElkPgorCQorCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5zZGMtbWFpbjwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJPC9wYXJlbnQ+CisJCisJCisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjQuMTI8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnRlc3RuZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRlc3RuZzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjYuOS4xMDwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20ucmVsZXZhbnRjb2RlczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmV4dGVudHJlcG9ydHM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjQxLjA8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4xMC4xOTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udHlwZXNhZmU8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb25maWc8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjAuMjwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4yLjE3PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5qY3JhZnQuanNjaDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbS5zcHJpbmdzb3VyY2UuY29tLmpjcmFmdC5qc2NoPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MC4xLjQxPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9uLWFwcC1hcGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2NvbW1vbi1hcHAtYXBpLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjLmJlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9uLWJlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtjb21tb24tYmUudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTwhLS0gQ0hFQ0sgQ0FUTE9HIE1PREVMIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjLmJlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2F0YWxvZy1tb2RlbDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y2F0YWxvZy1tb2RlbC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSBjYXRhbG9nIGRhbyAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhdGFsb2ctZGFvPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtjYXRhbG9nLWRhby52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZnVuY3Rpb25hbGphdmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5mdW5jdGlvbmFsamF2YTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8IS0tIENBU1NBTkRSQSAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZGF0YXN0YXguY2Fzc2FuZHJhPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLWRyaXZlci1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtjYXNzYW5kcmEuZHJpdmVyLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTwhLS0gQ0FTU0FORFJBIEVORCAtLT4KKwkKKwkJCisJCTwhLS0gc2xmNGogKyBsb2diYWNrIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZ2JhY2stY2xhc3NpYzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZ2JhY2stY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5qc29uLXNpbXBsZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpzb24tc2ltcGxlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBGaWxlIGNoYW5nZXMgbGlzdGVuZXIgLS0+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtamNpLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTwhLS0gR3NvbiAtLT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3NvbjwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSBTbmFrZSBZYW1sIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy55YW1sPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c25ha2V5YW1sPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8IS0tIGh0dHAgY2xpZW50IC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisgICAgICAgIAorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwbWltZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PiAgCisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi41PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSBodHRwIGNvcmUgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmh0dHBjb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8IS0tIFRJVEFOIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS50aGlua2F1cmVsaXVzLnRpdGFuPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGl0YW4tY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7dGl0YW4udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8ZXhjbHVzaW9ucz4KKwkJCQk8ZXhjbHVzaW9uPgorCQkJCQk8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgorCQkJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQk8L2V4Y2x1c2lvbnM+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLnRoaW5rYXVyZWxpdXMudGl0YW48L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD50aXRhbi1jYXNzYW5kcmE8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3RpdGFuLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKwkJCQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJPC9leGNsdXNpb25zPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1tYXBwZXItYXNsPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS45LjI8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMy4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmphY2tzb24tY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMy4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c2RjLWRpc3RyaWJ1dGlvbi1jbGllbnQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLmVjb21wc2Rrb3M8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5lY29tcEZXPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtlY29tcC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuanNvbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpzb248L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yMDA5MDIxMTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCTwvZGVwZW5kZW5jaWVzPgorCQorCQorCTxidWlsZD4KKwkJPHBsdWdpbnM+CisJCQkKKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c2tpcD50cnVlPC9za2lwPgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorCisJCQk8IS0tICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQk8IS0tICBDcmVhdGUgdGhlIEpBUiBmaWxlIHdpdGggaXRzIGRlcGVuZGVuY2llcyAgICAgLS0+CisJCQk8IS0tICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi41LjU8L3ZlcnNpb24+CQorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQk8aWQ+Y3JlYXRlLmphci53aXRoLmRlcGVuZGVuY2llczwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCTxhcmNoaXZlPgorCQkJCQkJCQk8bWFuaWZlc3Q+CisJCQkJCQkJCQk8bWFpbkNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnJ1bi5TdGFydFRlc3Q8L21haW5DbGFzcz4KKwkJCQkJCQkJPC9tYW5pZmVzdD4KKwkJCQkJCQk8L2FyY2hpdmU+CisJCQkJCQkJPGRlc2NyaXB0b3JSZWZzPgorCQkJCQkJCQk8ZGVzY3JpcHRvclJlZj5qYXItd2l0aC1kZXBlbmRlbmNpZXM8L2Rlc2NyaXB0b3JSZWY+CisJCQkJCQkJPC9kZXNjcmlwdG9yUmVmcz4KKwkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi42PC92ZXJzaW9uPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQkJCTxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisJCQkJCQkJCQk8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KKwkJCQkJCQkJCTxkZXNjcmlwdG9yPiR7cHJvamVjdC5iYXNlZGlyfS90YXJiYWxsLnhtbDwvZGVzY3JpcHRvcj4KKwkJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGlkPmFzc2VtYmxlLWZpbGU8L2lkPgorCQkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKwkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQk8Z29hbD5zaW5nbGU8L2dvYWw+CisJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCTwvZXhlY3V0aW9uPgorCQkJCTwvZXhlY3V0aW9ucz4KKwkJCTwvcGx1Z2luPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4zLjAuMjwvdmVyc2lvbj4KKworCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPGlkPmNvcHktYXNkYy10ZXN0czwvaWQ+CisJCQkJCQk8cGhhc2U+aW5zdGFsbDwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+Y29weS1yZXNvdXJjZXM8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QucGFyZW50LmJhc2VkaXJ9L3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtc2FuaXR5L2ZpbGVzL2RlZmF1bHQ8L291dHB1dERpcmVjdG9yeT4KKwkJCQkJCQk8cmVzb3VyY2VzPgorCQkJCQkJCQk8cmVzb3VyY2U+CisJCQkJCQkJCQk8ZGlyZWN0b3J5Pi4vdGFyZ2V0PC9kaXJlY3Rvcnk+CisJCQkJCQkJCQk8aW5jbHVkZXM+CisJCQkJCQkJCQkJPGluY2x1ZGU+YXNkYy10ZXN0cy50YXI8L2luY2x1ZGU+CisJCQkJCQkJCQk8L2luY2x1ZGVzPgorCQkJCQkJCQk8L3Jlc291cmNlPgorCQkJCQkJCTwvcmVzb3VyY2VzPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKworCQk8L3BsdWdpbnM+CisJPC9idWlsZD4KKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2FwaS9Db21wb25lbnRCYXNlVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2FwaS9Db21wb25lbnRCYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MGMxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvYXBpL0NvbXBvbmVudEJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSwzNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoUXVlcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlVHJpcGxlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkRpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmNhc3NhbmRyYS5DYXNzYW5kcmFVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5DYXRlZ29yeVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlByb2R1Y3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CisKK2ltcG9ydCBjb20ucmVsZXZhbnRjb2Rlcy5leHRlbnRyZXBvcnRzLkV4dGVudFJlcG9ydHM7CitpbXBvcnQgY29tLnJlbGV2YW50Y29kZXMuZXh0ZW50cmVwb3J0cy5FeHRlbnRUZXN0OworaW1wb3J0IGNvbS5yZWxldmFudGNvZGVzLmV4dGVudHJlcG9ydHMuTG9nU3RhdHVzOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5GYWN0b3J5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5MZXZlbDsKK2ltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLkxvZ2dlckNvbnRleHQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29tcG9uZW50QmFzZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8vIHB1YmxpYyBDb21wb25lbnRCYXNlVGVzdChUZXN0TmFtZSB0ZXN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworCS8vIHN1cGVyKHRlc3ROYW1lLCBjbGFzc05hbWUpOworCS8vIH0KKworCXByb3RlY3RlZCBzdGF0aWMgRXh0ZW50UmVwb3J0cyBleHRlbnRSZXBvcnQ7CisJcHJvdGVjdGVkIHN0YXRpYyBFeHRlbnRUZXN0IGV4dGVuZFRlc3Q7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUX0ZPTERFUiA9ICIuL0V4dGVudFJlcG9ydC8iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfRklMRV9OQU1FID0gIkFTRENfQ0lfRXh0ZW50X1JlcG9ydC5odG1sIjsKKwlwcm90ZWN0ZWQgc3RhdGljIFRpdGFuR3JhcGggdGl0YW5HcmFwaDsKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgbXljb25maWc7CisJcHVibGljIHN0YXRpYyBDb25maWcgY29uZmlnOworCisJcHVibGljIHN0YXRpYyBlbnVtIENvbXBvbmVudE9wZXJhdGlvbkVudW0geworCQlDUkVBVEVfQ09NUE9ORU5ULCBVUERBVEVfQ09NUE9ORU5ULCBHRVRfQ09NUE9ORU5ULCBERUxFVEVfQ09NUE9ORU5ULCBDSEFOR0VfU1RBVEVfQ0hFQ0tJTiwgQ0hBTkdFX1NUQVRFX0NIRUNLT1VULCBDSEFOR0VfU1RBVEVfVU5ET19DSEVDS09VVAorCX07CisKKwlwdWJsaWMgQ29tcG9uZW50QmFzZVRlc3QoVGVzdE5hbWUgbmFtZSwgU3RyaW5nIG5hbWUyKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCQlMb2dnZXJDb250ZXh0IGxjID0gKExvZ2dlckNvbnRleHQpIExvZ2dlckZhY3RvcnkuZ2V0SUxvZ2dlckZhY3RvcnkoKTsKKwkJbGMuZ2V0TG9nZ2VyKCJjb20udGhpbmthdXJlbGl1cyIpLnNldExldmVsKExldmVsLklORk8pOworCQlsYy5nZXRMb2dnZXIoImNvbS5kYXRhc3RheCIpLnNldExldmVsKExldmVsLklORk8pOworCQlsYy5nZXRMb2dnZXIoImlvLm5ldHR5Iikuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CisJCWxjLmdldExvZ2dlcigiYy5kIikuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CisJfQorCisJQEJlZm9yZVN1aXRlKGFsd2F5c1J1biA9IHRydWUpCisJcHVibGljIHN0YXRpYyB2b2lkIG9wZW5UaXRhbigpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisJCUZpbGUgZGlyID0gbmV3IEZpbGUoUkVQT1JUX0ZPTERFUik7CisJCXRyeSB7CisJCQlGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5KGRpcik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlleHRlbnRSZXBvcnQgPSBuZXcgRXh0ZW50UmVwb3J0cyhSRVBPUlRfRk9MREVSICsgUkVQT1JUX0ZJTEVfTkFNRSk7CisKKwkJbXljb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCWxvZ2dlci50cmFjZShjb25maWcudG9TdHJpbmcoKSk7CisJCVN0cmluZyB0aXRhbkNvbmZpZ0ZpbGVQYXRoID0gbXljb25maWcuZ2V0VGl0YW5Qcm9wZXJ0aWVzRmlsZSgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oInRpdGFuIGNvbmZpZ3VyYXRpb24gcGF0aDpcbiIrdGl0YW5Db25maWdGaWxlUGF0aCk7CisJCXRpdGFuR3JhcGggPSBUaXRhbkZhY3Rvcnkub3Blbih0aXRhbkNvbmZpZ0ZpbGVQYXRoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJpcyBvcGVuOlxuIit0aXRhbkdyYXBoLmlzT3BlbigpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aXRhbkdyYXBoKTsKKwl9CisKKwlAQWZ0ZXJTdWl0ZShhbHdheXNSdW4gPSB0cnVlKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93blRpdGFuKCkgeworCQlpZiAodGl0YW5HcmFwaC5pc09wZW4oKSkgeworCQkJdGl0YW5HcmFwaC5jbG9zZSgpOworCQl9CisJCUNhc3NhbmRyYVV0aWxzLmNsb3NlKCk7CisJfQorCisJQEJlZm9yZU1ldGhvZChhbHdheXNSdW4gPSB0cnVlKQorCXB1YmxpYyB2b2lkIGJlZm9yZVN0YXRlKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QpIHRocm93cyBFeGNlcHRpb24geworCisJCWNsZWFuQ29tcG9uZW50cygpOworCQlDYXNzYW5kcmFVdGlscy50cnVuY2F0ZUFsbEtleXNwYWNlcygpOworCQlleHRlbmRUZXN0ID0gZXh0ZW50UmVwb3J0LnN0YXJ0VGVzdChtZXRob2QuZ2V0TmFtZSgpKTsKKwkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLklORk8sICJUZXN0IHN0YXJ0ZWQiKTsKKworCX0KKworCUBBZnRlck1ldGhvZChhbHdheXNSdW4gPSB0cnVlKQorCXB1YmxpYyB2b2lkIGFmdGVyU3RhdGUoSVRlc3RSZXN1bHQgcmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2xlYW5Db21wb25lbnRzKCk7CisJCUNhc3NhbmRyYVV0aWxzLnRydW5jYXRlQWxsS2V5c3BhY2VzKCk7CisKKwkJaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkgeworCQkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLlBBU1MsICJUZXN0IFJlc3VsdCA6IDxzcGFuIGNsYXNzPSdsYWJlbCBzdWNjZXNzJz5TdWNjZXNzPC9zcGFuPiIpOworCQl9IGVsc2UgeworCQkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLkVSUk9SLCAiRVJST1IgLSBUaGUgZm9sbG93aW5nIGV4ZXBjdGlvbiBvY2N1cmVkIik7CisJCQlleHRlbmRUZXN0LmxvZyhMb2dTdGF0dXMuRVJST1IsIHJlc3VsdC5nZXRUaHJvd2FibGUoKSk7CisJCQlleHRlbmRUZXN0LmxvZyhMb2dTdGF0dXMuRkFJTCwgIjxzcGFuIGNsYXNzPSdsYWJlbCBmYWlsdXJlJz5GYWlsdXJlPC9zcGFuPiIpOworCQl9CisKKwkJZXh0ZW50UmVwb3J0LmVuZFRlc3QoZXh0ZW5kVGVzdCk7CisJCWV4dGVudFJlcG9ydC5mbHVzaCgpOworCisJfQorCisJcHVibGljIHZvaWQgdmVyaWZ5RXJyb3JDb2RlKFJlc3RSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjdGlvbiwgaW50IGV4cGVjdGVkQ29kZSkgeworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgIiArIGFjdGlvbiwgcmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciAiICsgYWN0aW9uLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciAgKyBhY3Rpb24iICsgYWN0aW9uLCBleHBlY3RlZENvZGUsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBjbGVhbkNvbXBvbmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBDb21wb25lbnRzIHRvIGRlbGV0ZQorCQlMaXN0PFN0cmluZz4gdmZSZXNvdXJjZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlMaXN0PFN0cmluZz4gbm9uVmZSZXNvdXJjZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlMaXN0PFN0cmluZz4gc2VydmljZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlMaXN0PFN0cmluZz4gcHJvZHVjdHNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCS8vIENhdGVnb3JpZXMgdG8gZGVsZXRlCisJCUxpc3Q8SW1tdXRhYmxlVHJpcGxlPFN0cmluZywgU3RyaW5nLCBTdHJpbmc+PiBwcm9kdWN0R3JvdXBpbmdzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPj4gcHJvZHVjdFN1YnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+PiByZXNvdXJjZVN1YnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PFN0cmluZz4gcHJvZHVjdENhdGVnb3JpZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VDYXRlZ29yaWVzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJTGlzdDxTdHJpbmc+IHNlcnZpY2VDYXRlZ29yaWVzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VzTm90VG9EZWxldGUgPSBjb25maWcuZ2V0UmVzb3VyY2VzTm90VG9EZWxldGUoKTsKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlID0gY29uZmlnLmdldFJlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlKCk7CisJCUxpc3Q8U3RyaW5nPiBzZXJ2aWNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlID0gY29uZmlnLmdldFNlcnZpY2VDYXRlZ29yaWVzTm90VG9EZWxldGUoKTsKKwkJVGl0YW5HcmFwaFF1ZXJ5PD8gZXh0ZW5kcyBUaXRhbkdyYXBoUXVlcnk+IHF1ZXJ5ID0gdGl0YW5HcmFwaC5xdWVyeSgpOworCQlxdWVyeSA9IHF1ZXJ5LmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZS5nZXROYW1lKCkpOworCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXM9cXVlcnkudmVydGljZXMoKTsKKy8vCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLmdldE5hbWUoKSkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRpY2VzICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyLm5leHQoKTsKKwkJCQlCb29sZWFuIGlzQWJzdHJhY3QgPSB2ZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19BQlNUUkFDVC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkvLyBpZiAoIWlzQWJzdHJhY3QpIHsKKwkJCQlTdHJpbmcgbmFtZSA9IHZlcnRleC52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQkJU3RyaW5nIHZlcnNpb24gPSB2ZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRVJTSU9OLmdldFByb3BlcnR5KCkpOworCisJCQkJaWYgKChyZXNvdXJjZXNOb3RUb0RlbGV0ZSAhPSBudWxsICYmICFyZXNvdXJjZXNOb3RUb0RlbGV0ZS5jb250YWlucyhuYW1lKSkgfHwgKHZlcnNpb24gIT0gbnVsbCAmJiAhdmVyc2lvbi5lcXVhbHMoIjEuMCIpKSkgeworCQkJCQlTdHJpbmcgaWQgPSB2ZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCQkJCVN0cmluZyByZXNvdXJjZVR5cGUgPSB2ZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVNPVVJDRV9UWVBFLmdldFByb3BlcnR5KCkpOworCQkJCQkvLyBpZiAobmFtZS5zdGFydHNXaXRoKCJjaSIpKSB7CisJCQkJCWlmIChyZXNvdXJjZVR5cGUuZXF1YWxzKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKSkgeworCQkJCQkJdmZSZXNvdXJjZXNUb0RlbGV0ZS5hZGQoaWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbm9uVmZSZXNvdXJjZXNUb0RlbGV0ZS5hZGQoaWQpOworCQkJCQl9CisJCQkJCS8vIH0KKwkJCQl9IGVsc2UgaWYgKChyZXNvdXJjZXNOb3RUb0RlbGV0ZSAhPSBudWxsICYmICFyZXNvdXJjZXNOb3RUb0RlbGV0ZS5jb250YWlucyhuYW1lKSkgfHwgKHZlcnNpb24gIT0gbnVsbCAmJiB2ZXJzaW9uLmVxdWFscygiMS4wIikpKSB7CisJCQkJCWlmICgoYm9vbGVhbikgdmVydGV4LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCkpID09IGZhbHNlKSB7CisJCQkJCQl2ZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gfQorCQkJfQorCQl9CisJCXZlcnRpY2VzID0gdGl0YW5HcmFwaC5xdWVyeSgpLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLmdldE5hbWUoKSkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRpY2VzICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyLm5leHQoKTsKKwkJCQlTdHJpbmcgaWQgPSB2ZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCQkJU3RyaW5nIG5hbWUgPSB2ZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCS8vIGlmIChuYW1lLnN0YXJ0c1dpdGgoImNpIikpeworCQkJCXNlcnZpY2VzVG9EZWxldGUuYWRkKGlkKTsKKwkJCQkvLyB9CisJCQl9CisJCX0KKworCQl2ZXJ0aWNlcyA9IHRpdGFuR3JhcGgucXVlcnkoKS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uUHJvZHVjdC5nZXROYW1lKCkpLnZlcnRpY2VzKCk7CisJCWlmICh2ZXJ0aWNlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlWZXJ0ZXggdmVydGV4ID0gaXRlci5uZXh0KCk7CisJCQkJU3RyaW5nIGlkID0gdmVydGV4LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQkJCVN0cmluZyBuYW1lID0gdmVydGV4LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkvL2lmIChuYW1lLnN0YXJ0c1dpdGgoImNpIikpIHsKKwkJCQkJcHJvZHVjdHNUb0RlbGV0ZS5hZGQoaWQpOworCQkJCS8vfQorCQkJfQorCQl9CisKKwkJLy8gR2V0dGluZyBjYXRlZ29yaWVzCisKKwkJdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnkuZ2V0TmFtZSgpKS52ZXJ0aWNlcygpOworCQlpZiAodmVydGljZXMgIT0gbnVsbCkgeworCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXIgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJVmVydGV4IGNhdGVnb3J5ID0gaXRlci5uZXh0KCk7CisJCQkJU3RyaW5nIG5hbWUgPSBjYXRlZ29yeS52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQkJaWYgKCFyZXNvdXJjZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZS5jb250YWlucyhuYW1lKSkgeworCQkJCQlTdHJpbmcgY2F0SWQgPSBjYXRlZ29yeS52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJcmVzb3VyY2VDYXRlZ29yaWVzVG9EZWxldGUuYWRkKGNhdElkKTsKKwkJCQkJSXRlcmF0b3I8VmVydGV4PiBzdWJzID0gY2F0ZWdvcnkudmVydGljZXMoRGlyZWN0aW9uLk9VVCwgR3JhcGhFZGdlTGFiZWxzLlNVQl9DQVRFR09SWS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJd2hpbGUgKHN1YnMuaGFzTmV4dCgpKSB7CisJCQkJCQlWZXJ0ZXggc3ViID0gc3Vicy5uZXh0KCk7CisJCQkJCQlTdHJpbmcgc3ViQ2F0SWQgPSBzdWIudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQlyZXNvdXJjZVN1YnNUb0RlbGV0ZS5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KGNhdElkLCBzdWJDYXRJZCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeS5nZXROYW1lKCkpLnZlcnRpY2VzKCk7CisJCWlmICh2ZXJ0aWNlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlWZXJ0ZXggY2F0ZWdvcnkgPSBpdGVyLm5leHQoKTsKKwkJCQlTdHJpbmcgbmFtZSA9IGNhdGVnb3J5LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlpZiAoIXNlcnZpY2VDYXRlZ29yaWVzTm90VG9EZWxldGUuY29udGFpbnMobmFtZSkpIHsKKwkJCQkJU3RyaW5nIGlkID0gY2F0ZWdvcnkudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCQkJCXNlcnZpY2VDYXRlZ29yaWVzVG9EZWxldGUuYWRkKGlkKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl2ZXJ0aWNlcyA9IHRpdGFuR3JhcGgucXVlcnkoKS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uUHJvZHVjdENhdGVnb3J5LmdldE5hbWUoKSkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRpY2VzICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCVZlcnRleCBjYXRlZ29yeSA9IGl0ZXIubmV4dCgpOworCQkJCVN0cmluZyBjYXRJZCA9IGNhdGVnb3J5LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQkJCXByb2R1Y3RDYXRlZ29yaWVzVG9EZWxldGUuYWRkKGNhdElkKTsKKwkJCQlJdGVyYXRvcjxWZXJ0ZXg+IHN1YnMgPSBjYXRlZ29yeS52ZXJ0aWNlcyhEaXJlY3Rpb24uT1VULCBHcmFwaEVkZ2VMYWJlbHMuU1VCX0NBVEVHT1JZLmdldFByb3BlcnR5KCkpOworCQkJCXdoaWxlIChzdWJzLmhhc05leHQoKSkgeworCQkJCQlWZXJ0ZXggc3ViID0gc3Vicy5uZXh0KCk7CisJCQkJCVN0cmluZyBzdWJDYXRJZCA9IHN1Yi52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJcHJvZHVjdFN1YnNUb0RlbGV0ZS5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KGNhdElkLCBzdWJDYXRJZCkpOworCQkJCQlJdGVyYXRvcjxWZXJ0ZXg+IGdyb3VwaW5ncyA9IHN1Yi52ZXJ0aWNlcyhEaXJlY3Rpb24uT1VULCBHcmFwaEVkZ2VMYWJlbHMuR1JPVVBJTkcuZ2V0UHJvcGVydHkoKSk7CisJCQkJCXdoaWxlIChncm91cGluZ3MuaGFzTmV4dCgpKSB7CisJCQkJCQlWZXJ0ZXggZ3JvdXBpbmcgPSBncm91cGluZ3MubmV4dCgpOworCQkJCQkJU3RyaW5nIGdyb3VwSWQgPSBncm91cGluZy52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCXByb2R1Y3RHcm91cGluZ3NUb0RlbGV0ZS5hZGQobmV3IEltbXV0YWJsZVRyaXBsZTxTdHJpbmcsIFN0cmluZywgU3RyaW5nPihjYXRJZCwgc3ViQ2F0SWQsIGdyb3VwSWQpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQl9CisKKwkJdGl0YW5HcmFwaC50eCgpLmNvbW1pdCgpOworCisJCVN0cmluZyBhZG1pbklkID0gVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJJZCgpOworCQlTdHJpbmcgcHJvZHVjdFN0cmF0ZWdpc3RJZCA9IFVzZXJSb2xlRW51bS5QUk9EVUNUX1NUUkFURUdJU1QxLmdldFVzZXJJZCgpOworCisJCS8vIENvbXBvbmVudCBkZWxldGUKKwkJZm9yIChTdHJpbmcgaWQgOiBwcm9kdWN0c1RvRGVsZXRlKSB7CisJCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZGVsZXRlUHJvZHVjdChpZCwgcHJvZHVjdFN0cmF0ZWdpc3RJZCk7CisKKwkJfQorCQlmb3IgKFN0cmluZyBpZCA6IHNlcnZpY2VzVG9EZWxldGUpIHsKKwkJCVJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlQnlJZCA9IFNlcnZpY2VSZXN0VXRpbHMuZGVsZXRlU2VydmljZUJ5SWQoaWQsIGFkbWluSWQpOworCisJCX0KKwkJZm9yIChTdHJpbmcgaWQgOiB2ZlJlc291cmNlc1RvRGVsZXRlKSB7CisJCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZShpZCwgYWRtaW5JZCk7CisKKwkJfQorCisJCWZvciAoU3RyaW5nIGlkIDogbm9uVmZSZXNvdXJjZXNUb0RlbGV0ZSkgeworCQkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2UoaWQsIGFkbWluSWQpOworCisJCX0KKworCQkvLyBDYXRlZ29yaWVzIGRlbGV0ZSAtIHByb2R1Y3QKKwkJU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBCYXNlUmVzdFV0aWxzLlBST0RVQ1RfQ09NUE9ORU5UX1RZUEU7CisJCWZvciAoSW1tdXRhYmxlVHJpcGxlPFN0cmluZywgU3RyaW5nLCBTdHJpbmc+IHRyaXBsZSA6IHByb2R1Y3RHcm91cGluZ3NUb0RlbGV0ZSkgeworCQkJQ2F0ZWdvcnlSZXN0VXRpbHMuZGVsZXRlR3JvdXBpbmcodHJpcGxlLmdldFJpZ2h0KCksIHRyaXBsZS5nZXRNaWRkbGUoKSwgdHJpcGxlLmdldExlZnQoKSwgcHJvZHVjdFN0cmF0ZWdpc3RJZCwgY29tcG9uZW50VHlwZSk7CisJCX0KKwkJZm9yIChJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBwYWlyIDogcHJvZHVjdFN1YnNUb0RlbGV0ZSkgeworCQkJQ2F0ZWdvcnlSZXN0VXRpbHMuZGVsZXRlU3ViQ2F0ZWdvcnkocGFpci5nZXRSaWdodCgpLCBwYWlyLmdldExlZnQoKSwgcHJvZHVjdFN0cmF0ZWdpc3RJZCwgY29tcG9uZW50VHlwZSk7CisJCX0KKwkJZm9yIChTdHJpbmcgaWQgOiBwcm9kdWN0Q2F0ZWdvcmllc1RvRGVsZXRlKSB7CisJCQlDYXRlZ29yeVJlc3RVdGlscy5kZWxldGVDYXRlZ29yeShpZCwgcHJvZHVjdFN0cmF0ZWdpc3RJZCwgY29tcG9uZW50VHlwZSk7CisJCX0KKworCQkvLyBDYXRlZ29yaWVzIGRlbGV0ZSAtIHJlc291cmNlCisJCWNvbXBvbmVudFR5cGUgPSBCYXNlUmVzdFV0aWxzLlJFU09VUkNFX0NPTVBPTkVOVF9UWVBFOworCQlmb3IgKEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+IHBhaXIgOiByZXNvdXJjZVN1YnNUb0RlbGV0ZSkgeworCQkJQ2F0ZWdvcnlSZXN0VXRpbHMuZGVsZXRlU3ViQ2F0ZWdvcnkocGFpci5nZXRSaWdodCgpLCBwYWlyLmdldExlZnQoKSwgYWRtaW5JZCwgY29tcG9uZW50VHlwZSk7CisJCX0KKwkJZm9yIChTdHJpbmcgaWQgOiByZXNvdXJjZUNhdGVnb3JpZXNUb0RlbGV0ZSkgeworCQkJQ2F0ZWdvcnlSZXN0VXRpbHMuZGVsZXRlQ2F0ZWdvcnkoaWQsIGFkbWluSWQsIGNvbXBvbmVudFR5cGUpOworCQl9CisJCS8vIENhdGVnb3JpZXMgZGVsZXRlIC0gcmVzb3VyY2UKKwkJY29tcG9uZW50VHlwZSA9IEJhc2VSZXN0VXRpbHMuU0VSVklDRV9DT01QT05FTlRfVFlQRTsKKwkJZm9yIChTdHJpbmcgaWQgOiBzZXJ2aWNlQ2F0ZWdvcmllc1RvRGVsZXRlKSB7CisJCQlDYXRlZ29yeVJlc3RVdGlscy5kZWxldGVDYXRlZ29yeShpZCwgYWRtaW5JZCwgY29tcG9uZW50VHlwZSk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2FwaS9Db21wb25lbnRJbnN0YW5jZUJhc2VUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvYXBpL0NvbXBvbmVudEluc3RhbmNlQmFzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjBhMzVkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2FwaS9Db21wb25lbnRJbnN0YW5jZUJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSw3NjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcFJlcURlZjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvZHVjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlNlcnZpY2VDYXRlZ29yaWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUHJvZHVjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2VCYXNlVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRhID0gImFwcGxpY2F0aW9uL2pzb24iOworCS8vIFJlcS9jYXAgb2YgY29udGFpbmVyIGNvbXBvbmVudAorCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXM7CisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHM7CisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4+IHJlbW92ZWRSZXF1aXJlbWVudHM7CisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+Pj4gZXhwZWN0ZWRDb250SW5zdFJlcUNhcDsKKworCXByb3RlY3RlZCBVc2VyIHNkbmNQc0RldGFpbHMxOworCXByb3RlY3RlZCBVc2VyIHNkbmNQc0RldGFpbHMyOworCXByb3RlY3RlZCBVc2VyIHNkbmNQbURldGFpbHMxOworCXByb3RlY3RlZCBVc2VyIHNkbmNQbURldGFpbHMyOworCXByb3RlY3RlZCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jVGVzdGVyRGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZGQ18wMTsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZGQ18wMjsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZGXzAxOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkZfMDI7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNDUF8wMTsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc0NQXzAyOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkxfMDE7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNWTF8wMjsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHNfMDE7CisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzXzAyOworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlsc18wMzsKKwlwcm90ZWN0ZWQgUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdERldGFpbHNfMDE7CisJcHJvdGVjdGVkIFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3REZXRhaWxzXzAyOworCisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJLy8gUmVxL2NhcHMgb2YgaW5uZXIgY29tcG9uZW50SW5zdGFuY2VzCisJCWV4cGVjdGVkQ29udGFpbmVyQ2FwYWJpbGl0aWVzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4oKTsKKwkJZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4oKTsKKwkJcmVtb3ZlZFJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZXhwZWN0ZWRDb250SW5zdFJlcUNhcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlzZG5jUHNEZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX1NUUkFURUdJU1QxKTsKKwkJc2RuY1BzRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMik7CisJCXNkbmNQbURldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlBST0RVQ1RfTUFOQUdFUjEpOworCQlzZG5jUG1EZXRhaWxzMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX01BTkFHRVIyKTsKKwkJc2RuY0Rlc2lnbmVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCXNkbmNBZG1pbkRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlzZG5jVGVzdGVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlyZXNvdXJjZURldGFpbHNWRkNfMDEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoImNpVkZDMTAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlNPRlRXQVJFX0NPTVBPTkVOVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19EQVRBQkFTRSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwgUmVzb3VyY2VUeXBlRW51bS5WRkMudG9TdHJpbmcoKSk7IC8vIHJlc291cmNlVHlwZSA9IFZGQworCQlyZXNvdXJjZURldGFpbHNWRkNfMDIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoImNpVkZDMjAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLkNPTVBVVEUsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiY2lWRjEwMCIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiY2lWRjIwMCIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZURldGFpbHNDUF8wMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiY2lDUDEwMCIsIE5vcm1hdGl2ZVR5cGVzRW51bS5QT1JULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX05FVFdPUktfRUxFTUVOVFMsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSk7CisJCXJlc291cmNlRGV0YWlsc0NQXzAyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJjaUNQMjAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlBPUlQsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfREFUQUJBU0UsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSk7CisJCXJlc291cmNlRGV0YWlsc1ZMXzAxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJjaVZMMTAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLk5FVFdPUkssIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfTkVUV09SS19FTEVNRU5UUywgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkxfMDIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoImNpVkwyMDAiLCBOb3JtYXRpdmVUeXBlc0VudW0uTkVUV09SSywgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19ORVRXT1JLX0VMRU1FTlRTLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCQlzZXJ2aWNlRGV0YWlsc18wMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCJjaU5ld3Rlc3RzZXJ2aWNlMSIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCXNlcnZpY2VEZXRhaWxzXzAyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoImNpTmV3dGVzdHNlcnZpY2UyIiwgU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJc2VydmljZURldGFpbHNfMDMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgiY2lOZXd0ZXN0c2VydmljZTMiLCBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFksIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0RGV0YWlsc18wMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCJjaVByb2R1Y3QwMSIpOworCQlwcm9kdWN0RGV0YWlsc18wMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCJjaVByb2R1Y3QwMiIpOworCX0KKworCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZUJhc2VUZXN0KFRlc3ROYW1lIHRlc3ROYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisJCXN1cGVyKHRlc3ROYW1lLCBjbGFzc05hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHZlcmlmeVZGUmVxQ2FwKFN0cmluZyBjb21wb25lbnRJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShjb21wb25lbnRJZCk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQl2ZXJpZnlSZXFDYXAocmVzb3VyY2UpOworCX0KKworCXB1YmxpYyB2b2lkIHZlcmlmeVNlcnZpY2VSZXFDYXAoU3RyaW5nIGNvbXBvbmVudElkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShjb21wb25lbnRJZCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQl2ZXJpZnlSZXFDYXAoc2VydmljZSk7CisJfQorCisJcHVibGljIHZvaWQgdmVyaWZ5UHJvZHVjdFJlcUNhcChTdHJpbmcgY29tcG9uZW50SWQpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KGNvbXBvbmVudElkLCBzZG5jUHNEZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQl2ZXJpZnlSZXFDYXAocHJvZHVjdCk7CisJfQorCisJcHVibGljIHZvaWQgdmVyaWZ5UmVxQ2FwKENvbXBvbmVudCBhY3R1YWxDb21wb25lbnQpIHsKKwkJdmVyaWZ5Q29udGFpbmVyUmVxQ2FwKGFjdHVhbENvbXBvbmVudCk7CisJCXZlcmlmeUNvbXBJbnN0UmVxQ2FwKGFjdHVhbENvbXBvbmVudCk7CisJfQorCisJcHVibGljIFJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKFN0cmluZyBjb21wb25lbnRVbmlxdWVJZCwgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBTdHJpbmcgc2VydmljZVVuaXF1ZUlkLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIGJvb2xlYW4gaXNIaWdoZXN0TGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb24gPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb24oY29tcG9uZW50VW5pcXVlSWQsIHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBzZXJ2aWNlVW5pcXVlSWQsIHNkbmNNb2RpZmllckRldGFpbHMsIGNvbXBvbmVudFR5cGUpOworCQlpZiAoY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb24uZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUykgJiYgaXNIaWdoZXN0TGV2ZWwpIHsKKwkJCS8qCisJCQkgKiAvLyBBZGQgUkkgQ2FwYWJpbGl0aWVzIGFuZCBSZXF1aXJlbWVudHMgdG8gZXhwZWN0ZWQgTUFQIC0tPiBleHBlY3RlZFZmQ2FwYWJpbGl0aWVzIGFuZCBleHBlY3RlZFZmUmVxdWlyZW1lbnRzCisJCQkgKiAKKwkJCSAqIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKCBjaGFuZ2VSZXNvdXJjZUluc3RhbmNlVmVyc2lvbi5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7IGFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgY29tcG9uZW50VHlwZSk7CisJCQkgKi8KKwkJfQorCQlyZXR1cm4gY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb247CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXhwZWN0ZWRSZXFDYXBBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKFN0cmluZyBvbGRDb250YWluZXJVbmlxdWVJZFRvUmVwbGFjZSwgU3RyaW5nIG5ld0NvbnRhaW5lclVuaXF1ZUlkKSB7CisKKwkJLy8gVXBkYXRlIG9mIGNvbnRhaW5lciByZXEvY2FwCisKKwkJU2V0PFN0cmluZz4gY29tcEluc3RLZXlzVG9DaGFuZ2UgPSBuZXcgSGFzaFNldDw+KCk7CisKKwkJZm9yIChTdHJpbmcgZXhwS2V5IDogZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMua2V5U2V0KCkpIHsKKwkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGV4cENhcExpc3QgPSBleHBlY3RlZENvbnRhaW5lckNhcGFiaWxpdGllcy5nZXQoZXhwS2V5KTsKKwkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwIDogZXhwQ2FwTGlzdCkgeworCQkJCVN0cmluZyBvd25lcklkID0gY2FwLmdldE93bmVySWQoKTsKKworCQkJCWlmIChvd25lcklkLmNvbnRhaW5zKG9sZENvbnRhaW5lclVuaXF1ZUlkVG9SZXBsYWNlKSkgeworCQkJCQljb21wSW5zdEtleXNUb0NoYW5nZS5hZGQob3duZXJJZCk7CisJCQkJCWNhcC5zZXRPd25lcklkKGNhcC5nZXRPd25lcklkKCkucmVwbGFjZUFsbChvbGRDb250YWluZXJVbmlxdWVJZFRvUmVwbGFjZSwgbmV3Q29udGFpbmVyVW5pcXVlSWQpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmb3IgKFN0cmluZyBleHBLZXkgOiBleHBlY3RlZENvbnRhaW5lclJlcXVpcmVtZW50cy5rZXlTZXQoKSkgeworCQkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IGV4cENhcExpc3QgPSBleHBlY3RlZENvbnRhaW5lclJlcXVpcmVtZW50cy5nZXQoZXhwS2V5KTsKKwkJCWZvciAoUmVxdWlyZW1lbnREZWZpbml0aW9uIGNhcCA6IGV4cENhcExpc3QpIHsKKwkJCQlTdHJpbmcgb3duZXJJZCA9IGNhcC5nZXRPd25lcklkKCk7CisJCQkJaWYgKG93bmVySWQuY29udGFpbnMob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UpKSB7CisJCQkJCWNvbXBJbnN0S2V5c1RvQ2hhbmdlLmFkZChvd25lcklkKTsKKwkJCQkJY2FwLnNldE93bmVySWQoY2FwLmdldE93bmVySWQoKS5yZXBsYWNlQWxsKG9sZENvbnRhaW5lclVuaXF1ZUlkVG9SZXBsYWNlLCBuZXdDb250YWluZXJVbmlxdWVJZCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIFVwZGF0ZSBvZiBpbnRlcm5hbCBjb21wIGluc3RhbmNlcyByZXEvY2FwCisJCWZvciAoU3RyaW5nIG9sZEtleSA6IGNvbXBJbnN0S2V5c1RvQ2hhbmdlKSB7CisJCQlJbW11dGFibGVQYWlyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+Pj4gaW1tdXRhYmxlUGFpciA9IGV4cGVjdGVkQ29udEluc3RSZXFDYXAuZ2V0KG9sZEtleSk7CisJCQlpZiAoaW1tdXRhYmxlUGFpciAhPSBudWxsKSB7CisJCQkJZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5yZW1vdmUob2xkS2V5KTsKKwkJCQlTdHJpbmcgbmV3S2V5ID0gb2xkS2V5LnJlcGxhY2VBbGwob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsIG5ld0NvbnRhaW5lclVuaXF1ZUlkKTsKKwkJCQlleHBlY3RlZENvbnRJbnN0UmVxQ2FwLnB1dChuZXdLZXksIGltbXV0YWJsZVBhaXIpOworCQkJfQorCQl9CisKKwkJLy8gVXBkYXRlIG9mIHJlbW92ZWQgcmVxCisJCWZvciAoU3RyaW5nIG9sZEtleSA6IGNvbXBJbnN0S2V5c1RvQ2hhbmdlKSB7CisJCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IG1hcCA9IHJlbW92ZWRSZXF1aXJlbWVudHMuZ2V0KG9sZEtleSk7CisJCQlpZiAobWFwICE9IG51bGwpIHsKKwkJCQlyZW1vdmVkUmVxdWlyZW1lbnRzLnJlbW92ZShvbGRLZXkpOworCQkJCVN0cmluZyBuZXdLZXkgPSBvbGRLZXkucmVwbGFjZUFsbChvbGRDb250YWluZXJVbmlxdWVJZFRvUmVwbGFjZSwgbmV3Q29udGFpbmVyVW5pcXVlSWQpOworCQkJCUNvbGxlY3Rpb248TGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiB2YWx1ZXMgPSBtYXAudmFsdWVzKCk7CisJCQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisJCQkJCWZvciAoTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IGxpc3QgOiB2YWx1ZXMpIHsKKwkJCQkJCWZvciAoUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcURlZiA6IGxpc3QpIHsKKwkJCQkJCQlyZXFEZWYuc2V0T3duZXJJZChyZXFEZWYuZ2V0T3duZXJJZCgpLnJlcGxhY2VBbGwob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsIG5ld0NvbnRhaW5lclVuaXF1ZUlkKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmVtb3ZlZFJlcXVpcmVtZW50cy5wdXQobmV3S2V5LCBtYXApOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXBJbnN0UmVxQ2FwKENvbXBvbmVudCBhY3R1YWxDb21wb25lbnQpIHsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gYWN0dWFsQ29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzICE9IG51bGwpIHsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZENvbnRJbnN0UmVxQ2FwLnNpemUoKSwgY29tcG9uZW50SW5zdGFuY2VzLnNpemUoKSk7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0IDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQkJU3RyaW5nIHVuaXF1ZUlkID0gY29tcEluc3QuZ2V0VW5pcXVlSWQoKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZlcmlmeWluZyByZXEvY2FwIG9mIGNvbXBvbmVudCBpbnN0YW5jZQorCQkJCS8vICIrIHVuaXF1ZUlkKTsKKwkJCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IGFjdHVhbENvbXBJbnN0UmVxID0gY29tcEluc3QuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCQkJaWYgKGFjdHVhbENvbXBJbnN0UmVxID09IG51bGwpIHsKKwkJCQkJYWN0dWFsQ29tcEluc3RSZXEgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJfQorCQkJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBhY3R1YWxDb21wSW5zdENhcCA9IGNvbXBJbnN0LmdldENhcGFiaWxpdGllcygpOworCQkJCWlmIChhY3R1YWxDb21wSW5zdENhcCA9PSBudWxsKSB7CisJCQkJCWFjdHVhbENvbXBJbnN0Q2FwID0gbmV3IEhhc2hNYXA8PigpOworCQkJCX0KKwkJCQlJbW11dGFibGVQYWlyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+Pj4gZXhwUmVxQ2FwID0gZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5nZXQodW5pcXVlSWQpOworCQkJCWFzc2VydE5vdE51bGwoZXhwUmVxQ2FwKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImV4cGVjdGVkIGluc3RhbmNlIHJlcXVpcmVtZW50czoKKwkJCQkvLyAiK2V4cFJlcUNhcC5yaWdodCk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJleHBlY3RlZCBpbnN0YW5jZSBjYXBhYmlsaXRpZXM6CisJCQkJLy8gIitleHBSZXFDYXAubGVmdCk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhY3R1YWwgaW5zdGFuY2UgcmVxdWlyZW1lbnRzOgorCQkJCS8vICIrYWN0dWFsQ29tcEluc3RSZXEpOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWN0dWFsIGluc3RhbmNlIGNhcGFiaWxpdGllczoKKwkJCQkvLyAiK2FjdHVhbENvbXBJbnN0Q2FwKTsKKworCQkJCS8vIFJFUSBjb21wYXJpc29uCisJCQkJY29tcGFyZVJlcUNhcE1hcHMoZXhwUmVxQ2FwLnJpZ2h0LCBhY3R1YWxDb21wSW5zdFJlcSk7CisKKwkJCQkvLyBDQVAgY29tcGFyaXNvbgorCQkJCWNvbXBhcmVSZXFDYXBNYXBzKGV4cFJlcUNhcC5sZWZ0LCBhY3R1YWxDb21wSW5zdENhcCk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWFzc2VydFRydWUoZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5pc0VtcHR5KCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnRhaW5lclJlcUNhcChDb21wb25lbnQgYWN0dWFsQ29tcG9uZW50KSB7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gYWN0dWFsQ29udGFpbmVyUmVxdWlyZW1lbnRzID0gYWN0dWFsQ29tcG9uZW50LmdldFJlcXVpcmVtZW50cygpOworCQlpZiAoYWN0dWFsQ29udGFpbmVyUmVxdWlyZW1lbnRzID09IG51bGwpIHsKKwkJCWFjdHVhbENvbnRhaW5lclJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJfQorCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gYWN0dWFsQ29udGFpbmVyQ2FwYWJpbGl0aWVzID0gYWN0dWFsQ29tcG9uZW50LmdldENhcGFiaWxpdGllcygpOworCQlpZiAoYWN0dWFsQ29udGFpbmVyQ2FwYWJpbGl0aWVzID09IG51bGwpIHsKKwkJCWFjdHVhbENvbnRhaW5lckNhcGFiaWxpdGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJfQorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZlcmlmeWluZyByZXEvY2FwIG9mIGNvbnRhaW5lciBjb21wb25lbnQgIisKKwkJLy8gYWN0dWFsQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImV4cGVjdGVkIGNvbnRhaW5lciByZXF1aXJlbWVudHM6CisJCS8vICIrZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImV4cGVjdGVkIGNvbnRhaW5lciBjYXBhYmlsaXRpZXM6CisJCS8vICIrZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFjdHVhbCBjb250YWluZXIgcmVxdWlyZW1lbnRzOgorCQkvLyAiK2FjdHVhbENvbnRhaW5lclJlcXVpcmVtZW50cyk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWN0dWFsIGNvbnRhaW5lciBjYXBhYmlsaXRpZXM6CisJCS8vICIrYWN0dWFsQ29udGFpbmVyQ2FwYWJpbGl0aWVzKTsKKworCQkvLyBSRVEgY29tcGFyaXNvbgorCQljb21wYXJlUmVxQ2FwTWFwcyhleHBlY3RlZENvbnRhaW5lclJlcXVpcmVtZW50cywgYWN0dWFsQ29udGFpbmVyUmVxdWlyZW1lbnRzKTsKKworCQkvLyBDQVAgY29tcGFyaXNvbgorCQljb21wYXJlUmVxQ2FwTWFwcyhleHBlY3RlZENvbnRhaW5lckNhcGFiaWxpdGllcywgYWN0dWFsQ29udGFpbmVyQ2FwYWJpbGl0aWVzKTsKKwl9CisKKwlwcml2YXRlIDxUPiB2b2lkIGNvbXBhcmVSZXFDYXBNYXBzKE1hcDxTdHJpbmcsIExpc3Q8VD4+IGV4cGVjdGVkTWFwLCBNYXA8U3RyaW5nLCBMaXN0PFQ+PiBhY3R1YWxNYXApIHsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWFwLnNpemUoKSwgYWN0dWFsTWFwLnNpemUoKSk7CisJCWZvciAoU3RyaW5nIGV4cEtleSA6IGV4cGVjdGVkTWFwLmtleVNldCgpKSB7CisJCQlMaXN0PD8+IGV4cENhcExpc3QgPSBleHBlY3RlZE1hcC5nZXQoZXhwS2V5KTsKKwkJCUxpc3Q8Pz4gYWN0Q2FwTGlzdCA9IGFjdHVhbE1hcC5nZXQoZXhwS2V5KTsKKwkJCWFzc2VydEVxdWFscyhleHBDYXBMaXN0LnNpemUoKSwgYWN0Q2FwTGlzdC5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0PD4oZXhwQ2FwTGlzdCksIG5ldyBIYXNoU2V0PD4oYWN0Q2FwTGlzdCkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBDb21wb25lbnRUeXBlRW51bSBjb250YWluZXJDb21wb25lbnRUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKTsKKwkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCk7CisJCVN0cmluZyBvcmlnaW5Db21wb25lbnRJZCA9IGNvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzcG9uc2UgPSBudWxsOworCQlDb21wb25lbnRUeXBlRW51bSBjb21wSW5zdFR5cGUgPSBnZXRDb21wSW5zdFR5cGVCeUNvbnRhaW5lclR5cGUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlpZiAoY29tcEluc3RUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSB7CisJCQlnZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsIG9yaWdpbkNvbXBvbmVudElkKTsKKwkJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRSZXNwb25zZSk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQl9IGVsc2UgaWYgKGNvbXBJbnN0VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSB7CisJCQlnZXRSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShvcmlnaW5Db21wb25lbnRJZCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzcG9uc2UpOworCQkJY29tcG9uZW50ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQl9IGVsc2UgeworCQkJQXNzZXJ0LmZhaWwoIlVuc3VwcG9ydGVkIHR5cGUgLSAiICsgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlc291cmNlUmVxdWlyZW1lbnRzID0gY29tcG9uZW50LmdldFJlcXVpcmVtZW50cygpOworCQlpZiAocmVzb3VyY2VSZXF1aXJlbWVudHMgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VSZXF1aXJlbWVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCX0KKwkJRnVuY3Rpb248RW50cnk8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+LCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50RGVmaW5pdGlvbk1hcHBlciA9IGUgLT4gbmV3IEFycmF5TGlzdDw+KGUuZ2V0VmFsdWUoKS5zdHJlYW0oKS5tYXAoaXRlbSAtPiBuZXcgUmVxdWlyZW1lbnREZWZpbml0aW9uKGl0ZW0pKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXFDb3B5ID0gcmVzb3VyY2VSZXF1aXJlbWVudHMuZW50cnlTZXQoKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoZSAtPiBlLmdldEtleSgpLCByZXF1aXJlbWVudERlZmluaXRpb25NYXBwZXIpKTsKKwkJCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiByZXNvdXJjZUNhcGFiaWxpdGllcyA9IGNvbXBvbmVudC5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJaWYgKHJlc291cmNlQ2FwYWJpbGl0aWVzID09IG51bGwpIHsKKwkJCXJlc291cmNlQ2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCQl9CisKKwkJRnVuY3Rpb248PyBzdXBlciBFbnRyeTxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdHlEZWZpbml0aW9uTWFwcGVyID0gZSAtPiBuZXcgQXJyYXlMaXN0PD4oZS5nZXRWYWx1ZSgpLnN0cmVhbSgpLm1hcChpdGVtIC0+IG5ldyBDYXBhYmlsaXR5RGVmaW5pdGlvbihpdGVtKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBDb3B5ID0gcmVzb3VyY2VDYXBhYmlsaXRpZXMuZW50cnlTZXQoKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoZSAtPiBlLmdldEtleSgpLCBjYXBhYmlsaXR5RGVmaW5pdGlvbk1hcHBlcikpOworCisJCXNldHVwQ29udGFpbmVyRXhwZWN0ZWRSZXFDYXAodW5pcXVlSWQsIG5hbWUsIHJlc291cmNlUmVxdWlyZW1lbnRzLCByZXNvdXJjZUNhcGFiaWxpdGllcyk7CisJCWlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmVxdWFscyhDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSkgJiYgKChSZXNvdXJjZSkgY29tcG9uZW50KS5nZXRSZXNvdXJjZVR5cGUoKSAhPSBSZXNvdXJjZVR5cGVFbnVtLlZGKSB7CisJCQlzZXR1cENvbnN0SW5zdEV4cGVjdGVkUmVxQ2FwKHVuaXF1ZUlkLCBuYW1lLCByZXFDb3B5LCBjYXBDb3B5KTsKKwkJfQorCisJCS8vIGFkZGluZyBlbnRyeSBmb3IgZXhwZWN0ZWQgY29tcG9uZW50SW5zdGFuY2UKKwkJSW1tdXRhYmxlUGFpcjxNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4sIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4+IGNvbXBJbnN0UmVxQ2FwUGFpciA9IG5ldyBJbW11dGFibGVQYWlyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+Pj4oY2FwQ29weSwgcmVxQ29weSk7CisJCWV4cGVjdGVkQ29udEluc3RSZXFDYXAucHV0KHVuaXF1ZUlkLCBjb21wSW5zdFJlcUNhcFBhaXIpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXR1cENvbnRhaW5lckV4cGVjdGVkUmVxQ2FwKFN0cmluZyB1bmlxdWVJZCwgU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gY29tcG9uZW50UmVxdWlyZW1lbnRzLCBNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY29tcG9uZW50Q2FwYWJpbGl0aWVzKSB7CisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlc1JlcSA6IGNvbXBvbmVudFJlcXVpcmVtZW50cy5lbnRyeVNldCgpKSB7CisJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdFRvQWRkID0gcmVzUmVxLmdldFZhbHVlKCk7CisJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZmluaXRpb24gOiByZXFMaXN0VG9BZGQpIHsKKwkJCQlyZXF1aXJlbWVudERlZmluaXRpb24uc2V0T3duZXJJZCh1bmlxdWVJZCk7CisJCQkJcmVxdWlyZW1lbnREZWZpbml0aW9uLnNldE93bmVyTmFtZShuYW1lKTsKKwkJCX0KKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBleHBlY3RlZFJlcUxpc3QgPSBleHBlY3RlZENvbnRhaW5lclJlcXVpcmVtZW50cy5nZXQocmVzUmVxLmdldEtleSgpKTsKKwkJCWlmIChleHBlY3RlZFJlcUxpc3QgPT0gbnVsbCkgeworCQkJCWV4cGVjdGVkUmVxTGlzdCA9IHJlcUxpc3RUb0FkZDsKKwkJCX0gZWxzZSB7CisJCQkJZXhwZWN0ZWRSZXFMaXN0LmFkZEFsbChyZXFMaXN0VG9BZGQpOworCQkJfQorCQkJZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMucHV0KHJlc1JlcS5nZXRLZXkoKSwgZXhwZWN0ZWRSZXFMaXN0KTsKKwkJfQorCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gcmVzQ2FwIDogY29tcG9uZW50Q2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RUb0FkZCA9IHJlc0NhcC5nZXRWYWx1ZSgpOworCQkJZm9yIChDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBEZWZpbml0aW9uIDogY2FwTGlzdFRvQWRkKSB7CisJCQkJY2FwRGVmaW5pdGlvbi5zZXRPd25lcklkKHVuaXF1ZUlkKTsKKwkJCQljYXBEZWZpbml0aW9uLnNldE93bmVyTmFtZShuYW1lKTsKKwkJCX0KKwkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGV4cGVjdGVkQ2FwTGlzdCA9IGV4cGVjdGVkQ29udGFpbmVyQ2FwYWJpbGl0aWVzLmdldChyZXNDYXAuZ2V0S2V5KCkpOworCQkJaWYgKGV4cGVjdGVkQ2FwTGlzdCA9PSBudWxsKSB7CisJCQkJZXhwZWN0ZWRDYXBMaXN0ID0gY2FwTGlzdFRvQWRkOworCQkJfSBlbHNlIHsKKwkJCQlleHBlY3RlZENhcExpc3QuYWRkQWxsKGNhcExpc3RUb0FkZCk7CisJCQl9CisJCQlleHBlY3RlZENvbnRhaW5lckNhcGFiaWxpdGllcy5wdXQocmVzQ2FwLmdldEtleSgpLCBleHBlY3RlZENhcExpc3QpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldHVwQ29uc3RJbnN0RXhwZWN0ZWRSZXFDYXAoU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBjb21wb25lbnRSZXF1aXJlbWVudHMsIE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjb21wb25lbnRDYXBhYmlsaXRpZXMpIHsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVzUmVxIDogY29tcG9uZW50UmVxdWlyZW1lbnRzLmVudHJ5U2V0KCkpIHsKKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0VG9BZGQgPSByZXNSZXEuZ2V0VmFsdWUoKTsKKwkJCWZvciAoUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmaW5pdGlvbiA6IHJlcUxpc3RUb0FkZCkgeworCQkJCXJlcXVpcmVtZW50RGVmaW5pdGlvbi5zZXRPd25lcklkKHVuaXF1ZUlkKTsKKwkJCQlyZXF1aXJlbWVudERlZmluaXRpb24uc2V0T3duZXJOYW1lKG5hbWUpOworCQkJfQorCQl9CisKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiByZXNDYXAgOiBjb21wb25lbnRDYXBhYmlsaXRpZXMuZW50cnlTZXQoKSkgeworCQkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdFRvQWRkID0gcmVzQ2FwLmdldFZhbHVlKCk7CisJCQlmb3IgKENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcERlZmluaXRpb24gOiBjYXBMaXN0VG9BZGQpIHsKKwkJCQljYXBEZWZpbml0aW9uLnNldE93bmVySWQodW5pcXVlSWQpOworCQkJCWNhcERlZmluaXRpb24uc2V0T3duZXJOYW1lKG5hbWUpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnRUeXBlRW51bSBnZXRDb21wSW5zdFR5cGVCeUNvbnRhaW5lclR5cGUoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKwkJY2FzZSBSRVNPVVJDRToKKwkJCXJldHVybiBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRTsKKwkJY2FzZSBTRVJWSUNFOgorCQkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFOworCQljYXNlIFBST0RVQ1Q6CisJCQlyZXR1cm4gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGRlbGV0ZUNvbXBJbnN0UmVxQ2FwRnJvbUV4cGVjdGVkKFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkKSB7CisJCUxpc3Q8U3RyaW5nPiBlbnRyaWVzUmVxdWlyZW1lbnRzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxTdHJpbmc+IGVudHJpZXNDYXBhYmlsaXRpZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXFFbnRyeSA6IGV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLmVudHJ5U2V0KCkpIHsKKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gcmVxRW50cnkuZ2V0VmFsdWUoKTsKKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0VG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmaW5pdGlvbiA6IHJlcUxpc3QpIHsKKwkJCQlpZiAocmVxdWlyZW1lbnREZWZpbml0aW9uLmdldE93bmVySWQoKS5lcXVhbHMoY29tcG9uZW50SW5zdGFuY2VJZCkpIHsKKwkJCQkJcmVxTGlzdFRvRGVsZXRlLmFkZChyZXF1aXJlbWVudERlZmluaXRpb24pOworCQkJCX0KKwkJCX0KKwkJCXJlcUxpc3QucmVtb3ZlQWxsKHJlcUxpc3RUb0RlbGV0ZSk7CisJCQlpZiAocmVxTGlzdC5pc0VtcHR5KCkpIHsKKwkJCQllbnRyaWVzUmVxdWlyZW1lbnRzVG9SZW1vdmUuYWRkKHJlcUVudHJ5LmdldEtleSgpKTsKKwkJCX0KKwkJfQorCisJCWZvciAoU3RyaW5nIGVrZXkgOiBlbnRyaWVzUmVxdWlyZW1lbnRzVG9SZW1vdmUpIHsKKwkJCWV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLnJlbW92ZShla2V5KTsKKwkJfQorCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwRW50cnkgOiBleHBlY3RlZENvbnRhaW5lckNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gY2FwRW50cnkuZ2V0VmFsdWUoKTsKKwkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJZm9yIChDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiA6IGNhcExpc3QpIHsKKwkJCQlpZiAoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0T3duZXJJZCgpLmVxdWFscyhjb21wb25lbnRJbnN0YW5jZUlkKSkgeworCQkJCQljYXBMaXN0VG9EZWxldGUuYWRkKGNhcGFiaWxpdHlEZWZpbml0aW9uKTsKKwkJCQl9CisJCQl9CisJCQljYXBMaXN0LnJlbW92ZUFsbChjYXBMaXN0VG9EZWxldGUpOworCQkJaWYgKGNhcExpc3QuaXNFbXB0eSgpKSB7CisJCQkJZW50cmllc0NhcGFiaWxpdGllc1RvUmVtb3ZlLmFkZChjYXBFbnRyeS5nZXRLZXkoKSk7CisJCQl9CisJCX0KKwkJZm9yIChTdHJpbmcgZWtleSA6IGVudHJpZXNDYXBhYmlsaXRpZXNUb1JlbW92ZSkgeworCQkJZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMucmVtb3ZlKGVrZXkpOworCQl9CisKKwkJZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5yZW1vdmUoY29tcG9uZW50SW5zdGFuY2VJZCk7CisKKwl9CisKKwkvLyBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIGV4cGVjdGVkIHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lcgorCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihSZXNvdXJjZVJlcURldGFpbHMgY29udGFpbmVyRGV0YWlscywgUmVzb3VyY2VSZXFEZXRhaWxzIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdHJ1ZSk7CisJfQorCisJLy8gQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBleHBlY3RlZCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBSZXNvdXJjZVJlcURldGFpbHMgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckRldGFpbHMsIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIHRydWUpOworCX0KKworCS8vIEF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgZXhwZWN0ZWQgcmVxL2NhcCBvZiB0aGUgY29udGFpbmVyCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RhbmNlKFNlcnZpY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFJlc291cmNlUmVxRGV0YWlscyBjb21wSW5zdE9yaWdpbkRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgdHJ1ZSk7CisJfQorCisJLy8gQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBleHBlY3RlZCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShQcm9kdWN0UmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBTZXJ2aWNlUmVxRGV0YWlscyBjb21wSW5zdE9yaWdpbkRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgdHJ1ZSk7CisJfQorCisJLy8gQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBleHBlY3RlZCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yVkYoU3RyaW5nIGNvbXBJbnN0VW5pcXVlSWQsIFJlc291cmNlUmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHRydWUpOworCX0KKworCS8vIEF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgZXhwZWN0ZWQgcmVxL2NhcCBvZiB0aGUgY29udGFpbmVyCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBkZWxldGVBdG9taWNJbnN0YW5jZUZvclNlcnZpY2UoU3RyaW5nIGNvbXBJbnN0VW5pcXVlSWQsIFNlcnZpY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBJbnN0VW5pcXVlSWQsIGNvbnRhaW5lckRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCB0cnVlKTsKKwl9CisKKwkvLyBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIGV4cGVjdGVkIHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lcgorCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgZGVsZXRlVkZJbnN0YW5jZShTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwgU2VydmljZVJlcURldGFpbHMgY29udGFpbmVyRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcEluc3RVbmlxdWVJZCwgY29udGFpbmVyRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIHRydWUpOworCisJfQorCisJLy8gQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBleHBlY3RlZCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwgUHJvZHVjdFJlcURldGFpbHMgY29udGFpbmVyRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcEluc3RVbmlxdWVJZCwgY29udGFpbmVyRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChSZXNvdXJjZVJlcURldGFpbHMgY29udGFpbmVyRGV0YWlscywgUmVzb3VyY2VSZXFEZXRhaWxzIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZmFsc2UpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZUR1cmluZ1NldHVwKFNlcnZpY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFJlc291cmNlUmVxRGV0YWlscyBjb21wSW5zdE9yaWdpbkRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgZmFsc2UpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChTZXJ2aWNlUmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBSZXNvdXJjZVJlcURldGFpbHMgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckRldGFpbHMsIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIGZhbHNlKTsKKwl9CisKKwkvLyBTZXR1cCBvZiBsb3dlciBjb21wb25lbnRzIC0gRG9lc24ndCBhZmZlY3QgcmVxL2NhcCBvZiB0aGUgY29udGFpbmVyIChmb3IKKwkvLyBleGFtcGxlLCBzZXR1cCBvZiBWRiBmb3IgdGVzdGluZyBhIFByb2R1Y3QpCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VEdXJpbmdTZXR1cChQcm9kdWN0UmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBTZXJ2aWNlUmVxRGV0YWlscyBjb21wSW5zdE9yaWdpbkRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgZmFsc2UpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwgUmVzb3VyY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBJbnN0VW5pcXVlSWQsIGNvbnRhaW5lckRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZmFsc2UpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZUR1cmluZ1NldHVwKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBTZXJ2aWNlUmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgZmFsc2UpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGRlbGV0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwgU2VydmljZVJlcURldGFpbHMgY29udGFpbmVyRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcEluc3RVbmlxdWVJZCwgY29udGFpbmVyRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIGZhbHNlKTsKKworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUR1cmluZ1NldHVwKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBQcm9kdWN0UmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgZmFsc2UpOworCX0KKworCXByb3RlY3RlZCBDb21wb25lbnQgZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnREZXRhaWxzLCBpbnQgbnVtYmVyT2ZSSXMsIGludCBudW1iZXJPZlJlbGF0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNwb25zZSA9IG51bGw7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlpZiAoY29tcG9uZW50RGV0YWlscyBpbnN0YW5jZW9mIFJlc291cmNlUmVxRGV0YWlscykgeworCQkJZ2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jQWRtaW5EZXRhaWxzLCBjb21wb25lbnREZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkJY29tcG9uZW50ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJfSBlbHNlIGlmIChjb21wb25lbnREZXRhaWxzIGluc3RhbmNlb2YgU2VydmljZVJlcURldGFpbHMpIHsKKwkJCWdldFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKChTZXJ2aWNlUmVxRGV0YWlscykgY29tcG9uZW50RGV0YWlscywgc2RuY0FkbWluRGV0YWlscyk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCX0gZWxzZSBpZiAoY29tcG9uZW50RGV0YWlscyBpbnN0YW5jZW9mIFByb2R1Y3RSZXFEZXRhaWxzKSB7CisJCQlnZXRSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChjb21wb25lbnREZXRhaWxzLmdldFVuaXF1ZUlkKCksIHNkbmNBZG1pbkRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJY29tcG9uZW50ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQl9IGVsc2UgeworCQkJQXNzZXJ0LmZhaWwoIlVuc3VwcG9ydGVkIHR5cGUgb2YgY29tcG9uZW50RGV0YWlscyAtICIgKyBjb21wb25lbnREZXRhaWxzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKwkJfQorCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzcG9uc2UpOworCQlpbnQgbnVtYmVyT2ZBY3R1YWxSSXMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkgIT0gbnVsbCA/IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkgOiAwOworCQlpbnQgbnVtYmVyT2ZBY3R1YWxSZWxhdGlvbnMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKCkgIT0gbnVsbCA/IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKS5zaXplKCkgOiAwOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIG51bWJlciBvZiBSSXMgbWVldCB0aGUgZXhwZWN0ZWQgbnVtYmVyIiwgbnVtYmVyT2ZSSXMsIG51bWJlck9mQWN0dWFsUklzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBudW1iZXIgb2YgUkkgcmVsYXRpb25zIG1lZXQgdGhlIGV4cGVjdGVkIG51bWJlciIsIG51bWJlck9mUmVsYXRpb25zLCBudW1iZXJPZkFjdHVhbFJlbGF0aW9ucyk7CisJCXZlcmlmeVJlcUNhcChjb21wb25lbnQpOworCisJCXJldHVybiBjb21wb25lbnQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXNBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKFN0cmluZyBvbGRDb21wb25lbnRVbmlxdWVJZFRvUmVwbGFjZSwgQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnREZXRhaWxzLCBpbnQgbnVtT2ZSSXMsIGludCBudW1PZlJlbGF0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUob2xkQ29tcG9uZW50VW5pcXVlSWRUb1JlcGxhY2UsIGNvbXBvbmVudERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKGNvbXBvbmVudERldGFpbHMsIG51bU9mUklzLCBudW1PZlJlbGF0aW9ucyk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50UmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBDb21wb25lbnRSZXFEZXRhaWxzIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgVXNlciBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZUVudW0sIGJvb2xlYW4gaXNIaWdoZXN0TGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShjb21wSW5zdE9yaWdpbkRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIG1vZGlmaWVyLCBjb250YWluZXJEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGNvbnRhaW5lckNvbXBvbmVudFR5cGVFbnVtKTsKKwkJaWYgKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKSAmJiBpc0hpZ2hlc3RMZXZlbCkgeworCQkJLy8gQWRkIFJJIENhcGFiaWxpdGllcyBhbmQgUmVxdWlyZW1lbnRzIHRvIGV4cGVjdGVkIE1BUCAtLT4KKwkJCS8vIGV4cGVjdGVkVmZDYXBhYmlsaXRpZXMgYW5kIGV4cGVjdGVkVmZSZXF1aXJlbWVudHMKKwkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lckNvbXBvbmVudFR5cGVFbnVtKTsKKwkJfQorCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlOworCX0KKworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBDb21wb25lbnRSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFVzZXIgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBib29sZWFuIGlzSGlnaGVzdExldmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKG1vZGlmaWVyLCBjb250YWluZXJEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGNvbXBJbnN0VW5pcXVlSWQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJaWYgKGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9ERUxFVEUpICYmIGlzSGlnaGVzdExldmVsKSB7CisJCQlkZWxldGVDb21wSW5zdFJlcUNhcEZyb21FeHBlY3RlZChjb21wSW5zdFVuaXF1ZUlkKTsKKwkJfQorCQlyZXR1cm4gZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlOworCX0KKworCS8vIENyZWF0ZSBBdG9taWMgcmVzb3VyY2UgKCBWRkMvQ1AvVkwpCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXRvbWljUmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZGKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVWRihyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVkYoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVmZSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWZlJlc3BvbnNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXJ2aWNlKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvZHVjdChQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0RGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3QocHJvZHVjdERldGFpbHMsIHNkbmNQbURldGFpbHMxKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9kdWN0KFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdERldGFpbHMsIHNkbmNNb2RpZmllcik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdFJlc3BvbnNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlc0ZvclNlcnZpY2UoUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmLCBDb21wb25lbnRSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFVzZXIgdXNlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCB1c2VyLCBjb250YWluZXJEZXRhaWxzLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzb2NpYXRlSW5zdGFuY2VzKTsKKwkJZGVsZXRlQXNzb2NpYXRlZEZyb21FeHBlY3RlZChyZXF1aXJlbWVudERlZik7CisKKwkJcmV0dXJuIGFzc29jaWF0ZUluc3RhbmNlczsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlQXNzb2NpYXRlZEZyb21FeHBlY3RlZChSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYpIHsKKwkJLy8gcmVtb3ZpbmcgZnJvbSByZXF1aXJlbWVudHMKKwkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uc2hpcCA9IHJlcXVpcmVtZW50RGVmLmdldFJlbGF0aW9uc2hpcHMoKS5nZXQoMCk7CisJCVN0cmluZyB0eXBlID0gcmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcCgpLmdldFR5cGUoKTsKKwkJU3RyaW5nIGZyb21JZCA9IHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMuZ2V0KHR5cGUpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMuZ2V0KHR5cGUpOworCQlSZXF1aXJlbWVudERlZmluaXRpb24gdG9EZWxldGUgPSBudWxsOworCQlpZiAocmVxTGlzdCAhPSBudWxsKSB7CisJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWYgOiByZXFMaXN0KSB7CisJCQkJaWYgKHJlcURlZi5nZXRPd25lcklkKCkuZXF1YWxzKGZyb21JZCkpIHsKKwkJCQkJdG9EZWxldGUgPSByZXFEZWY7CisJCQkJfQorCQkJfQorCQkJaWYgKHRvRGVsZXRlICE9IG51bGwpIHsKKwkJCQlyZXFMaXN0LnJlbW92ZSh0b0RlbGV0ZSk7CisJCQkJaWYgKHJlcUxpc3QuaXNFbXB0eSgpKSB7CisJCQkJCWV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLnJlbW92ZSh0eXBlKTsKKwkJCQl9CisJCQkJU3RyaW5nIG93bmVySWQgPSB0b0RlbGV0ZS5nZXRPd25lcklkKCk7CisJCQkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBtYXAgPSByZW1vdmVkUmVxdWlyZW1lbnRzLmdldChvd25lcklkKTsKKwkJCQlpZiAobWFwID09IG51bGwpIHsKKwkJCQkJbWFwID0gbmV3IEhhc2hNYXA8PigpOworCQkJCQlyZW1vdmVkUmVxdWlyZW1lbnRzLnB1dChvd25lcklkLCBtYXApOworCQkJCX0KKwkJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gbGlzdCA9IG1hcC5nZXQodHlwZSk7CisJCQkJaWYgKGxpc3QgPT0gbnVsbCkgeworCQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJCW1hcC5wdXQodHlwZSwgbGlzdCk7CisJCQkJfQorCQkJCWxpc3QuYWRkKHRvRGVsZXRlKTsKKwkJCX0KKwkJfQorCisJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gOiBjYXBMaXN0KSB7CisJCQlpZiAoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgeworCQkJCWludCBtaW5PY2N1cnJlbmNlcyA9IEludGVnZXIucGFyc2VJbnQoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0TWluT2NjdXJyZW5jZXMoKSkgLSAxOworCQkJCWlmIChtaW5PY2N1cnJlbmNlcyA8IDApCisJCQkJCW1pbk9jY3VycmVuY2VzID0gMDsKKwkJCQlTdHJpbmcgbWluT2NjdXJyZW5jZXNTdHJpbmcgPSBJbnRlZ2VyLnRvU3RyaW5nKG1pbk9jY3VycmVuY2VzKTsKKwkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRNaW5PY2N1cnJlbmNlcyhtaW5PY2N1cnJlbmNlc1N0cmluZyk7CisJCQkJaWYgKCFjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscygiVU5CT1VOREVEIikpIHsKKwkJCQkJaW50IG1heE9jY3VycmVuY2VzID0gSW50ZWdlci5wYXJzZUludChjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRNYXhPY2N1cnJlbmNlcygpKSAtIDE7CisJCQkJCWlmIChtYXhPY2N1cnJlbmNlcyA8IDApCisJCQkJCQltYXhPY2N1cnJlbmNlcyA9IDA7CisJCQkJCVN0cmluZyBtYXhPY2N1cnJlbmNlc1N0cmluZyA9IEludGVnZXIudG9TdHJpbmcobWF4T2NjdXJyZW5jZXMpOworCQkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRNYXhPY2N1cnJlbmNlcyhtYXhPY2N1cnJlbmNlc1N0cmluZyk7CisJCQkJfQorCQkJfQorCQl9CisJCWV4cGVjdGVkQ29udGFpbmVyQ2FwYWJpbGl0aWVzLnB1dCh0eXBlLCBjYXBMaXN0KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkaXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VzRm9yU2VydmljZShSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYsIENvbXBvbmVudFJlcURldGFpbHMgY29udGFpbmVyRGV0YWlscywgVXNlciB1c2VyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgdXNlciwgY29udGFpbmVyRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGRpc3NvY2lhdGVJbnN0YW5jZXMpOworCQlhZGREaXNzb2NpYXRlZFRvRXhwZWN0ZWQocmVxdWlyZW1lbnREZWYpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGZ1bGZpbGxDcFJlcXVpcmVtZW50KENvbXBvbmVudFJlcURldGFpbHMgY29tcG9uZW50LCBTdHJpbmcgY3BDb21wSW5zdElkLCBTdHJpbmcgY3BSZXFGdWxmaWxsZXJDb21wSW5zdElkLCBTdHJpbmcgY3BSZXFGdWxmaWxsZXJPd25lcklkLCBVc2VyIHVzZXIsIENvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBGdWxmaWxsaW5nIGNwJ3MgImJpbmRpbmciIHJlcXVpcmVtZW50IC0gVVM2MjYyNDAKKwkJU3RyaW5nIHJlcXVpcmVtZW50TmFtZSA9ICJiaW5kaW5nIjsKKwkJU3RyaW5nIGNhcFR5cGUgPSAidG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUiOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyh1c2VyLCBjb21wb25lbnQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzb3VyY2VSZXNwb25zZSk7CisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoY2FwVHlwZSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcUNhcFJlbGF0aW9uID0gRWxlbWVudEZhY3RvcnkuZ2V0UmVxQ2FwUmVsYXRpb24oY3BDb21wSW5zdElkLCBjcFJlcUZ1bGZpbGxlckNvbXBJbnN0SWQsIGNwQ29tcEluc3RJZCwgY3BSZXFGdWxmaWxsZXJPd25lcklkLCBjYXBUeXBlLCByZXF1aXJlbWVudE5hbWUsIGNhcExpc3QsIHJlcUxpc3QpOworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcUNhcFJlbGF0aW9uLCB1c2VyLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgY29udGFpbmVyQ29tcFR5cGUpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzb2NpYXRlSW5zdGFuY2VzKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjb25zdW1lVmxDYXBhYmlsaXR5KENvbXBvbmVudFJlcURldGFpbHMgY29tcG9uZW50LCBTdHJpbmcgdmxDYXBDb25zdW1lckNvbXBJbnN0SWQsIFN0cmluZyB2bENvbXBJbnN0SWQsIFN0cmluZyB2bENhcENvbnN1bWVyT3duZXJJZCwgVXNlciB1c2VyLCBDb21wb25lbnRUeXBlRW51bSBjb250YWluZXJDb21wVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gQ29uc3VtaW5nIHZsJ3MgImxpbmsiIGNhcGFiaWxpdHkgLSBVUzYyNjI0MAorCQlTdHJpbmcgcmVxdWlyZW1lbnROYW1lID0gImxpbmsiOworCQlTdHJpbmcgY2FwVHlwZSA9ICJ0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZSI7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHVzZXIsIGNvbXBvbmVudCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpLmdldChjYXBUeXBlKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3QgPSBjYXBSZXFEZWYuZ2V0UmVxdWlyZW1lbnRzKCkuZ2V0KGNhcFR5cGUpOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxQ2FwUmVsYXRpb24gPSBFbGVtZW50RmFjdG9yeS5nZXRSZXFDYXBSZWxhdGlvbih2bENhcENvbnN1bWVyQ29tcEluc3RJZCwgdmxDb21wSW5zdElkLCB2bENhcENvbnN1bWVyT3duZXJJZCwgdmxDb21wSW5zdElkLCBjYXBUeXBlLCByZXF1aXJlbWVudE5hbWUsIGNhcExpc3QsIHJlcUxpc3QpOworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcUNhcFJlbGF0aW9uLCB1c2VyLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgY29udGFpbmVyQ29tcFR5cGUpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzb2NpYXRlSW5zdGFuY2VzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkRGlzc29jaWF0ZWRUb0V4cGVjdGVkKFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZikgeworCQkvLyBhZGRpbmcgdG8gcmVxdWlyZW1lbnRzCisJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvbnNoaXAgPSByZXF1aXJlbWVudERlZi5nZXRSZWxhdGlvbnNoaXBzKCkuZ2V0KDApOworCQlTdHJpbmcgdHlwZSA9IHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXAoKS5nZXRUeXBlKCk7CisJCVN0cmluZyBmcm9tSWQgPSByZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IG1hcCA9IHJlbW92ZWRSZXF1aXJlbWVudHMuZ2V0KGZyb21JZCk7CisJCWlmIChtYXAgIT0gbnVsbCkgeworCQkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IGxpc3QgPSBtYXAuZ2V0KHR5cGUpOworCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKKwkJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdCA9IGV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLmdldCh0eXBlKTsKKwkJCQlpZiAocmVxTGlzdCA9PSBudWxsKSB7CisJCQkJCXJlcUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQkJZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMucHV0KHR5cGUsIHJlcUxpc3QpOworCQkJCX0KKwkJCQlyZXFMaXN0LmFkZChsaXN0LnJlbW92ZSgwKSk7CisJCQl9CisJCX0KKworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMuZ2V0KHR5cGUpOworCisJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gOiBjYXBMaXN0KSB7CisJCQlpZiAoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgeworCQkJCWludCBtaW5PY2N1cnJlbmNlcyA9IEludGVnZXIucGFyc2VJbnQoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0TWluT2NjdXJyZW5jZXMoKSkgKyAxOworCQkJCVN0cmluZyBtaW5PY2N1cnJlbmNlc1N0cmluZyA9IEludGVnZXIudG9TdHJpbmcobWluT2NjdXJyZW5jZXMpOworCQkJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldE1pbk9jY3VycmVuY2VzKG1pbk9jY3VycmVuY2VzU3RyaW5nKTsKKwkJCQlpZiAoIWNhcGFiaWxpdHlEZWZpbml0aW9uLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKCJVTkJPVU5ERUQiKSkgeworCQkJCQlpbnQgbWF4T2NjdXJyZW5jZXMgPSBJbnRlZ2VyLnBhcnNlSW50KGNhcGFiaWxpdHlEZWZpbml0aW9uLmdldE1heE9jY3VycmVuY2VzKCkpICsgMTsKKwkJCQkJU3RyaW5nIG1heE9jY3VycmVuY2VzU3RyaW5nID0gSW50ZWdlci50b1N0cmluZyhtYXhPY2N1cnJlbmNlcyk7CisJCQkJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldE1heE9jY3VycmVuY2VzKG1heE9jY3VycmVuY2VzU3RyaW5nKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMucHV0KHR5cGUsIGNhcExpc3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9hcGkvU2RjVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2FwaS9TZGNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhZDc0OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9hcGkvU2RjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFdhdGNoZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydWxlcy5NeVRlc3RXYXRjaGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnJ1bi5TdGFydFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNkY1Rlc3QgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmdCdWlsZGVyIGRvYyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZSA9IG51bGw7CisJcHVibGljIHN0YXRpYyBDb25maWcgY29uZmlnID0gbnVsbDsKKwkvLyBwcm90ZWN0ZWQgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwlwcm90ZWN0ZWQgR3NvbiBwcmV0dHlHc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCXByb3RlY3RlZCBUZXN0TmFtZSB0ZXN0TmFtZSA9IG51bGw7CisJcHJvdGVjdGVkIExvZ2dlciBsb2dnZXIgPSBudWxsOworCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRpc3BsYXlFeGNlcHRpb24gPSBmYWxzZTsKKworCXB1YmxpYyBTZGNUZXN0KFRlc3ROYW1lIHRlc3ROYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisJCXN1cGVyKCk7CisKKwkJU3RhcnRUZXN0LmVuYWJsZUxvZ2dlcigpOworCisJCXRoaXMudGVzdE5hbWUgPSB0ZXN0TmFtZTsKKwkJdGhpcy5sb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihjbGFzc05hbWUpOworCisJCVN0cmluZyBkaXNwbGF5RXggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImRpc3BsYXlFeGNlcHRpb24iKTsKKwkJaWYgKGRpc3BsYXlFeCAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihkaXNwbGF5RXgpLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQlkaXNwbGF5RXhjZXB0aW9uID0gdHJ1ZTsKKwkJfQorCisJfQorCisJQFJ1bGUKKwlwdWJsaWMgVGVzdFdhdGNoZXIgdHcgPSBuZXcgTXlUZXN0V2F0Y2hlcih0aGlzKTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHsKKwkJZG9jID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZG9jLmFwcGVuZCgKKwkJCQkiPEh0bWw+PGhlYWQ+PHN0eWxlPnRoe2JhY2tncm91bmQtY29sb3I6IGdyYXk7Y29sb3I6IHdoaXRlO2hlaWdodDogMzBweDt9dGQge2NvbG9yOiBibGFjaztoZWlnaHQ6IDMwcHg7fS5mYWlsIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkY1NTU1O3dpZHRoOiAxMDBweDt0ZXh0LWFsaWduOiBjZW50ZXI7fS5zdWNjZXNzIHtiYWNrZ3JvdW5kLWNvbG9yOiAjMDBGRjAwO3dpZHRoOiAxMDBweDt0ZXh0LWFsaWduOiBjZW50ZXI7fS5uYW1lIHt3aWR0aDogMjAwcHg7YmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDt9Lm1lc3NhZ2Uge3dpZHRoOiAzMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwO308L3N0eWxlPiIpOworCisJCWRvYy5hcHBlbmQoIjxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPiIpOworCQlkb2MuYXBwZW5kKAorCQkJCSI8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cImh0dHA6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4zLjQvY3NzL2Jvb3RzdHJhcC5taW4uY3NzXCI+Iik7CisKKwkJZG9jLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworCisJCWRvYy5hcHBlbmQoIjxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS4xMS4xL2pxdWVyeS5taW4uanNcIj48L3NjcmlwdD4iKTsKKwkJZG9jLmFwcGVuZCgiPHNjcmlwdCBzcmM9XCJodHRwOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMy40L2pzL2Jvb3RzdHJhcC5taW4uanNcIj48L3NjcmlwdD4iKTsKKworCQlkb2MuYXBwZW5kKCI8dGFibGU+Iik7CisKKwkJZG9jLmFwcGVuZCgiPHRyPiIpOworCQlkb2MuYXBwZW5kKCI8dGg+IikuYXBwZW5kKCJUZXN0IE5hbWUiKS5hcHBlbmQoIjwvdGg+Iik7CisJCWRvYy5hcHBlbmQoIjx0aD4iKS5hcHBlbmQoIlN0YXR1cyIpLmFwcGVuZCgiPC90aD4iKTsKKwkJZG9jLmFwcGVuZCgiPHRoPiIpLmFwcGVuZCgiTWVzc2FnZSIpLmFwcGVuZCgiPC90aD4iKTsKKworCQlpZiAoZGlzcGxheUV4Y2VwdGlvbikgeworCQkJZG9jLmFwcGVuZCgiPHRoPiIpLmFwcGVuZCgiRXhjZXB0aW9uIikuYXBwZW5kKCI8L3RoPiIpOworCQl9CisJCWRvYy5hcHBlbmQoIjwvdHI+Iik7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpIHsKKwkJZG9jLmFwcGVuZCgiPHRhYmxlPiIpOworCQlGaWxlVXRpbHMud3JpdGVUb0ZpbGUoCisJCQkJQ29uZmlnLmluc3RhbmNlKCkuZ2V0T3V0cHV0Rm9sZGVyKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGUgKyBTdGFydFRlc3QudGltZU9mVGVzdCArICIuaHRtbCIsCisJCQkJZG9jLnRvU3RyaW5nKCkpOworCisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJZmlsZSA9IEZpbGVVdGlscy5nZXRGaWxlTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwkJY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCWFzc2VydFRydWUoY29uZmlnICE9IG51bGwpOworCisJCS8vIGxvZ2dlci5pbmZvKCJTdGFydCBydW5uaW5nIHRlc3QgIiArIHRlc3ROYW1lLmdldE1ldGhvZE5hbWUoKSk7CisJfQorCisJQEFmdGVyCisJcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwkJLy8gbG9nZ2VyLmluZm8oIkZpbmlzaCBydW5uaW5nIHRlc3QgIiArIHRlc3ROYW1lLmdldE1ldGhvZE5hbWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkVGVzdFN1bW1hcnkoU3RyaW5nIHRlc3ROYW1lLCBib29sZWFuIGlzU3VjY2VzcykgeworCQlhZGRUZXN0U3VtbWFyeSh0ZXN0TmFtZSwgaXNTdWNjZXNzLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRUZXN0U3VtbWFyeShTdHJpbmcgdGVzdE5hbWUsIGJvb2xlYW4gaXNTdWNjZXNzLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKwkJU3RyaW5nIG1lc3NhZ2UgPSBleGNlcHRpb24gPT0gbnVsbCA/ICIiIDogZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKKworCQlTdHJpbmcgcmVzdWx0ID0gKGlzU3VjY2VzcykgPyAic3VjY2VzcyIgOiAiZmFpbCI7CisJCWRvYy5hcHBlbmQoIjx0cj4iKTsKKwkJZG9jLmFwcGVuZCgiPHRkIGNsYXNzPVwibmFtZVwiPiIpLmFwcGVuZCh0ZXN0TmFtZSkuYXBwZW5kKCI8L3RkPiIpOworCQlkb2MuYXBwZW5kKCI8dGQgY2xhc3M9XCIiICsgcmVzdWx0ICsgIlwiPiIpLmFwcGVuZChyZXN1bHQpLmFwcGVuZCgiPC90ZD4iKTsKKwkJZG9jLmFwcGVuZCgiPHRkIGNsYXNzPVwibWVzc2FnZVwiPiIpLmFwcGVuZChtZXNzYWdlKS5hcHBlbmQoIjwvdGQ+Iik7CisKKwkJaWYgKGRpc3BsYXlFeGNlcHRpb24pIHsKKwkJCS8vIGRvYy5hcHBlbmQoIjx0ZAorCQkJLy8gY2xhc3M9XCJtZXNzYWdlXCI+IikuYXBwZW5kKGNvbnZlcnRFeGNlcHRpb25Ub1N0cmluZyhleGNlcHRpb24pKS5hcHBlbmQoIjwvdGQ+Iik7CisJCQlkb2MuYXBwZW5kKCI8dGQgY2xhc3M9XCJtZXNzYWdlXCI+Iik7CisKKwkJCWRvYy5hcHBlbmQoIjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1pbmZvXCIgZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtdGFyZ2V0PVwiI2RlbW8iCisJCQkJCSsgdGVzdE5hbWUgKyAiXCI+U2ltcGxlIGNvbGxhcHNpYmxlPC9idXR0b24+Iik7CisJCQlkb2MuYXBwZW5kKCI8ZGl2IGlkPVwiZGVtbyIgKyB0ZXN0TmFtZSArICJcIiBjbGFzcz1cImNvbGxhcHNlIG91dFwiPiIpOworCisJCQlkb2MuYXBwZW5kKGNvbnZlcnRFeGNlcHRpb25Ub1N0cmluZyhleGNlcHRpb24pKTsKKworCQkJZG9jLmFwcGVuZCgiPC9kaXY+Iik7CisJCQlkb2MuYXBwZW5kKCI8L3RkPiIpOworCQl9CisKKwkJZG9jLmFwcGVuZCgiPC90cj4iKTsKKworCQlpZiAoaXNTdWNjZXNzKSB7CisJCQlsb2dnZXIuZGVidWcoIlRlc3Qge30gc3VjY2VlZGVkLiIsIHRlc3ROYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5lcnJvcigiVGVzdCB7fSBmYWlsZWQgd2l0aCBlcnJvcjoge30iLCB0ZXN0TmFtZSwgbWVzc2FnZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBjb252ZXJ0RXhjZXB0aW9uVG9TdHJpbmcoVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCisJCWlmIChleGNlcHRpb24gPT0gbnVsbCkgeworCQkJcmV0dXJuICIiOworCQl9CisKKwkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOworCQlTdHJpbmcgZXhjZXB0aW9uQXNTdHJpbmcgPSBzdy50b1N0cmluZygpOworCisJCXJldHVybiBleGNlcHRpb25Bc1N0cmluZzsKKwl9CisKKwlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKKwkJcmV0dXJuIGxvZ2dlcjsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVEdWVUb0J1ZyhTdHJpbmcgYnVnKSB7CisKKwkJTGlzdDxTdHJpbmc+IGJ1Z3MgPSBjb25maWcuZ2V0QnVncygpOworCisJCWlmIChidWdzICE9IG51bGwgJiYgYnVncy5zaXplKCkgPiAwKSB7CisJCQlmb3IgKFN0cmluZyBidWdOdW1iZXIgOiBidWdzKSB7CisJCQkJaWYgKGJ1Z051bWJlci5zdGFydHNXaXRoKGJ1ZykpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2FwaS9VcmxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvYXBpL1VybHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNlYjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2FwaS9VcmxzLmphdmEKQEAgLTAsMCArMSwzNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGk7CisKK3B1YmxpYyBpbnRlcmZhY2UgVXJscyB7CisKKwlmaW5hbCBTdHJpbmcgVVBMT0FEX1pJUF9VUkwgPSAiaHR0cDovLyVzOiVzL3NkYzEvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyI7CisJZmluYWwgU3RyaW5nIEdFVF9JTUFHRV9EQVRBX0ZST01fRVMgPSAiaHR0cDovLyVzOiVzL3Jlc291cmNlcy9pbWFnZWRhdGEvX3NlYXJjaD9xPXJlc291cmNlTmFtZTolcyZwcmV0dHk9dHJ1ZSZzaXplPTEwMDAiOworCWZpbmFsIFN0cmluZyBHRVRfU0NSSVBUX0RBVEFfRlJPTV9FUyA9ICJodHRwOi8vJXM6JXMvcmVzb3VyY2VzL2FydGlmYWN0ZGF0YS9fc2VhcmNoP3E9cmVzb3VyY2VOYW1lOiVzJnByZXR0eT10cnVlJnNpemU9MTAwMCI7CisJZmluYWwgU3RyaW5nIEdFVF9JRF9MSVNUX0JZX0lOREVYX0ZST01fRVMgPSAiaHR0cDovLyVzOiVzLyVzLyVzL19zZWFyY2g/ZmllbGRzPV9pZCZzaXplPTEwMDAiOworCisJZmluYWwgU3RyaW5nIEVTX1VSTCA9ICJodHRwOi8vJXM6JXMiOworCWZpbmFsIFN0cmluZyBHRVRfU0VSVklDRV9DU0FSX0FQSTEgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC9zZXJ2aWNlcy8lcy8lcyI7CisJZmluYWwgU3RyaW5nIEdFVF9TRVJWSUNFX0NTQVJfQVBJMiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3NlcnZpY2VzLyVzLyVzL2NzYXIiOworCisJZmluYWwgU3RyaW5nIEdFVF9TRVJWSUNFX0NTQVJfRkVfUFJPWFlfQVBJMSA9ICJodHRwOi8vJXM6JXMvc2RjMS9wb3J0YWwvcmVzdC9zZXJ2aWNlcy8lcy8lcyI7CisJZmluYWwgU3RyaW5nIEdFVF9DU0FSX1VTSU5HX1NJTVVMQVRPUiA9ICJodHRwOi8vJXM6JXMvb25ib2FyZGluZ2NpL29uYnJlc3Qvb25ib2FyZGluZy1hcGkvdjEuMC92ZW5kb3Itc29mdHdhcmUtcHJvZHVjdHMvcGFja2FnZXMvJXMiOworCWZpbmFsIFN0cmluZyBDT1BZX0NTQVJfVVNJTkdfU0lNVUxBVE9SID0gImh0dHA6Ly8lczolcy9vbmJvYXJkaW5nY2kvb25icmVzdC9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cy9wYWNrYWdlcy8lcy8lcyI7CisKKwlmaW5hbCBTdHJpbmcgR0VUX0hFQUxUSF9DSEVDS19WSUFfUFJPWFkgPSAiaHR0cDovLyVzOiVzL3NkYzEvcmVzdC9oZWFsdGhDaGVjayI7CisKKwkvLyBHZXQgYmFjay1lbmQgY29uZmlnIGh0dHA6Ly8xNzIuMjAuNDMuMTMyOjgwODAvc2RjMi9yZXN0L2NvbmZpZ21nci9nZXQKKwlmaW5hbCBTdHJpbmcgR0VUX0NPTkZJR19NQU5BR0VSID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvY29uZmlnbWdyL2dldCI7CisKKwkvLyBHZXQgbGF0ZXN0IHZlcnNpb24gb2YgYWxsIG5vbi1hYnN0cmFjdCByZXNvdXJjZXMKKwlmaW5hbCBTdHJpbmcgR0VUX1JFU09VUkNFX2xBVEVTVF9WRVJTSU9OID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvbGF0ZXN0dmVyc2lvbi9ub3RhYnN0cmFjdCI7CisKKwlmaW5hbCBTdHJpbmcgR0VUX1NFUlZJQ0VfbEFURVNUX1ZFUlNJT04gPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3NlcnZpY2VzL2xhdGVzdHZlcnNpb24vbm90YWJzdHJhY3QiOworCisJLy8gR2V0IHJlc291cmNlIGFydGlmYWN0IGxpc3Q6CisJLy8gaHR0cDovLzE3Mi4yMC40My4xMjQ6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0cworCWZpbmFsIFN0cmluZyBHRVRfUkVTT1VSQ0VfQVJUSUZBQ1RTX0xJU1QgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy8lcy9hcnRpZmFjdHMiOworCisJLy8gZ2V0IHJlc291cmNlIGFydGlmYWN0IG1ldGFkYXRhIChjcmVhdGlvbiwgTUQ1LCBldGMpOgorCS8vIGh0dHA6Ly8xNzIuMjAuNDMuMTI0OjgwODAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzL2FsaWVuLm5vZGVzLkFwYWNoZS8yLjAuMC1TTkFQU0hPVC9hcnRpZmFjdHMvaW5zdGFsbF9hcGFjaGUuc2gvbWV0YWRhdGEKKwlmaW5hbCBTdHJpbmcgR0VUX1JFU09VUkNFX0FSVElGQUNUX01FVEFEQVRBID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMvJXMvYXJ0aWZhY3RzLyVzL21ldGFkYXRhIjsKKworCS8vIHJlc291cmNlIGFydGlmYWN0IHBheWxvYWQ6CisJLy8gaHR0cDovLzE3Mi4yMC40My4xMjQ6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0cy9pbnN0YWxsX2FwYWNoZS5zaAorCWZpbmFsIFN0cmluZyBHRVRfUkVTT1VSQ0VfQVJUSUZBQ1RfUEFZTE9BRCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzLyVzL2FydGlmYWN0cy8lcyI7CisKKwlmaW5hbCBTdHJpbmcgR0VUX1JFU09VUkNFX0FSVElGQUNUX1BBWUxPQURfRkVfUFJPWFkgPSAiaHR0cDovLyVzOiVzL3NkYzEvcG9ydGFsL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMvJXMvYXJ0aWZhY3RzLyVzIjsKKworCS8vIEdldCBzZXJ2aWNlIGxpc3Q6IGh0dHA6Ly8xNzIuMjAuNDMuMTI0OjgwODAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMKKwlmaW5hbCBTdHJpbmcgR0VUX1NFUlZJQ0VfTElTVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMiOworCisJLy8gR2V0IHNlcnZpY2UgdmVyc2lvbnM6CisJLy8gaHR0cDovLzE3Mi4yMC40My4xMjQ6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy9NeVNlcnZpY2UKKwlmaW5hbCBTdHJpbmcgR0VUX1NFUlZJQ0VfVkVSU0lPTlMgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3NlcnZpY2VzLyVzIjsKKworCS8vIEdldCBzZXJ2aWNlIGFydGlmYWN0IGxpc3Q6CisJLy8gaHR0cDovLzE3Mi4yMC40My4xMjQ6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy9hbGllbi5ub2Rlcy5BcGFjaGUvMC4wLjEvYXJ0aWZhY3RzCisJZmluYWwgU3RyaW5nIEdFVF9TRVJWSUNFX0FSVElGQUNUU19MSVNUID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy8lcy9hcnRpZmFjdHMiOworCisJLy8gZ2V0IHNlcnZpY2UgYXJ0aWZhY3QgbWV0YWRhdGEgKGNyZWF0aW9uLCBNRDUsIGV0Yyk6CisJLy8gaHR0cDovLzE3Mi4yMC40My4xMjQ6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy9hbGllbi5ub2Rlcy5BcGFjaGUvMC4wLjEvYXJ0aWZhY3RzL2luc3RhbGxfYXBhY2hlLnNoL21ldGFkYXRhCisJZmluYWwgU3RyaW5nIEdFVF9TRVJWSUNFX01FVEFEQVRBID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy8lcy9hcnRpZmFjdHMvJXMvbWV0YWRhdGEiOworCisJLy8gc2VydmljZSBhcnRpZmFjdCBwYXlsb2FkOgorCS8vIGh0dHA6Ly8xNzIuMjAuNDMuMTI0OjgwODAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzAuMC4xL2FydGlmYWN0cy9pbnN0YWxsX2FwYWNoZS5zaAorCWZpbmFsIFN0cmluZyBHRVRfU0VSVklDRV9BUlRJRkFDVF9QQVlMT0FEID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMvJXMvYXJ0aWZhY3RzLyVzIjsKKworCWZpbmFsIFN0cmluZyBHRVRfU0VBUkNIX0RBVEFfRlJPTV9FUyA9ICJodHRwOi8vJXM6JXMvJXMiOworCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlVTRVIKKwkvLyBVUkxzKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlmaW5hbCBTdHJpbmcgR0VUX1VTRVIgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS91c2VyLyVzIjsKKworCWZpbmFsIFN0cmluZyBHRVRfVVNFUl9ST0xFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvdXNlci8lcy9yb2xlIjsKKworCWZpbmFsIFN0cmluZyBDUkVBVEVfVVNFUiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL3VzZXIiOworCisJZmluYWwgU3RyaW5nIFVQREFURV9VU0VSID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvdXNlci8lcyI7CisKKwlmaW5hbCBTdHJpbmcgVVBEQVRFX1VTRVJfUk9MRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL3VzZXIvJXMvcm9sZSI7CisKKwlmaW5hbCBTdHJpbmcgREVMRVRFX1VTRVIgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS91c2VyLyVzIjsKKworCWZpbmFsIFN0cmluZyBHRVRfQUxMX0FETUlOX1VTRVJTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvdXNlci9hZG1pbnMiOworCisJZmluYWwgU3RyaW5nIEFVVEhPUklaRV9VU0VSID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvdXNlci9hdXRob3JpemUiOworCisJZmluYWwgU3RyaW5nIEdFVF9BTExfVEFHUyA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL3RhZ3MiOworCisJZmluYWwgU3RyaW5nIEFVVEhfVVNFUiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL3VzZXIvYXV0aG9yaXplIjsKKworCWZpbmFsIFN0cmluZyBHRVRfQUxMX05PVF9BQlNUUkFDVF9SRVNPVVJDRVMgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy9jZXJ0aWZpZWQvbm90YWJzdHJhY3QiOworCisJZmluYWwgU3RyaW5nIEdFVF9BTExfQUJTVFJBQ1RfUkVTT1VSQ0VTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvY2VydGlmaWVkL2Fic3RyYWN0IjsKKworCWZpbmFsIFN0cmluZyBRVUVSWV9ORU80SiA9ICJodHRwOi8vJXM6JXMvZGIvZGF0YS90cmFuc2FjdGlvbiI7CisJZmluYWwgU3RyaW5nIENIQU5HRV9JTl9ORU80SiA9ICJodHRwOi8vJXM6JXMvZGIvZGF0YS90cmFuc2FjdGlvbi9jb21taXQiOworCisJZmluYWwgU3RyaW5nIEdFVF9BTExfQURNSU5TID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvdXNlci9hZG1pbnMiOworCisJZmluYWwgU3RyaW5nIEdFVF9VU0VSU19CWV9ST0xFUyA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL3VzZXIvdXNlcnM/cm9sZXM9JXMiOworCisJZmluYWwgU3RyaW5nIEdFVF9BTExfVVNFUlMgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS91c2VyL3VzZXJzP3JvbGVzLyI7CisKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkVDT01QIFVzZXIKKwkvLyBVUkwncyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJZmluYWwgU3RyaW5nIEVDT01QX1BVU0hfVVNFUiA9ICJodHRwOi8vJXM6JXMvYXBpL3VzZXIiOworCisJZmluYWwgU3RyaW5nIEVDT01QX0VESVRfVVNFUiA9ICJodHRwOi8vJXM6JXMvYXBpL3VzZXIvJXMiOworCisJZmluYWwgU3RyaW5nIEVDT01QX0dFVF9VU0VSID0gImh0dHA6Ly8lczolcy9hcGkvdXNlci8lcyI7CisKKwlmaW5hbCBTdHJpbmcgRUNPTVBfR0VUX0FMTF9VU0VSUyA9ICJodHRwOi8vJXM6JXMvYXBpL3VzZXJzIjsKKworCWZpbmFsIFN0cmluZyBFQ09NUF9HRVRfQUxMX0FWQUlMQUJMRV9ST0xFUyA9ICJodHRwOi8vJXM6JXMvYXBpL3JvbGVzIjsKKworCWZpbmFsIFN0cmluZyBFQ09NUF9QVVNIX1VTRVJfUk9MRVMgPSAiaHR0cDovLyVzOiVzL2FwaS91c2VyLyVzL3JvbGVzIjsKKworCWZpbmFsIFN0cmluZyBFQ09NUF9HRVRfVVNFUl9ST0xFUyA9ICJodHRwOi8vJXM6JXMvYXBpL3VzZXIvJXMvcm9sZXMiOworCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipFbGVtZW50cyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlmaW5hbCBTdHJpbmcgR0VUX1RBR1NfTElTVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL3RhZ3MiOworCisJZmluYWwgU3RyaW5nIEdFVF9QUk9QRVJUWV9TQ09QRVNfTElTVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL3Byb3BlcnR5U2NvcGVzIjsKKworCWZpbmFsIFN0cmluZyBHRVRfQ09ORklHVVJBVElPTiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NvbmZpZ3VyYXRpb24vdWkiOworCisJZmluYWwgU3RyaW5nIEdFVF9BTExfQVJUSUZBQ1RTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvYXJ0aWZhY3RUeXBlcyI7CisKKwlmaW5hbCBTdHJpbmcgR0VUX0ZPTExXRURfTElTVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2ZvbGxvd2VkIjsKKworCWZpbmFsIFN0cmluZyBHRVRfQ0FUQUxPR19EQVRBID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvc2NyZWVuIjsKKworCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqUmVzb3VyY2VzCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWZpbmFsIFN0cmluZyBHRVRfTElTVF9DRVJUSUZJRURfUkVTT1VSQ0VfVEVNUExBVEVTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvcmVzb291cmNlVGVtcGxhdGVzIjsKKworCWZpbmFsIFN0cmluZyBDUkVBVEVfUkVTT1VSQ0UgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyI7CisJZmluYWwgU3RyaW5nIFVQREFURV9SRVNPVVJDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzIjsKKworCWZpbmFsIFN0cmluZyBJTVBPUlRfUkVTT1VSQ0VfTk9STUFUSVZFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWQvbXVsdGlwYXJ0IjsKKworCWZpbmFsIFN0cmluZyBJTVBPUlRfVVNFUl9SRVNPVVJDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL3VzZXItcmVzb3VyY2UiOworCisJZmluYWwgU3RyaW5nIElNUE9SVF9DQVBBQklMSVRZX1RZUEUgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3VwbG9hZFR5cGUvY2FwYWJpbGl0eSI7CisJZmluYWwgU3RyaW5nIElNUE9SVF9DQVRFR09SSUVTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2NhdGVnb3JpZXMiOworCWZpbmFsIFN0cmluZyBJTVBPUlRfR1JPVVBfVFlQRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkVHlwZS9ncm91cHR5cGVzIjsKKworCS8vIGxhc3QgJXMgaXMgcmVzb3VyY2VJZCwgcmVzb3VyY2VJZCA9IHJlc291cmNlTmFtZS5yZXNvdXJjZVZlcnNpb24KKwlmaW5hbCBTdHJpbmcgR0VUX1JFU09VUkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMiOworCWZpbmFsIFN0cmluZyBHRVRfUkVTT1VSQ0VfQllfTkFNRV9BTkRfVkVSU0lPTiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzL3Jlc291cmNlTmFtZS8lcy9yZXNvdXJjZVZlcnNpb24vJXMiOworCWZpbmFsIFN0cmluZyBHRVRfUkVTT1VSQ0VfQllfQ1NBUl9VVUlEID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvY3Nhci8lcyI7CisJZmluYWwgU3RyaW5nIEdFVF9DT01QT05FTlRfUkVRVUlSTUVOVFNfQ0FQQUJJTElUSUVTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy8lcy8lcy9yZXF1aXJtZW50c0NhcGFiaWxpdGllcyI7CisKKwlmaW5hbCBTdHJpbmcgREVMRVRFX1JFU09VUkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMiOworCWZpbmFsIFN0cmluZyBERUxFVEVfUkVTT1VSQ0VfQllfTkFNRV9BTkRfVkVSU0lPTiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzLyVzIjsKKwlmaW5hbCBTdHJpbmcgREVMRVRFX1NFUlZJQ0VfQllfTkFNRV9BTkRfVkVSU0lPTiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvJXMiOworCisJZmluYWwgU3RyaW5nIERFTEVURV9NQVJLRURfUkVTT1VSQ0VTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvaW5hY3RpdmVDb21wb25lbnRzL3Jlc291cmNlIjsKKwlmaW5hbCBTdHJpbmcgREVMRVRFX01BUktFRF9TRVJWSUNFUyA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2luYWN0aXZlQ29tcG9uZW50cy9zZXJ2aWNlIjsKKworCWZpbmFsIFN0cmluZyBHRVRfRk9MTE9XRURfUkVTT1VSQ0VTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvZm9sbG93ZWQvcmVzb3VyY2VzLyVzIjsKKwlmaW5hbCBTdHJpbmcgQ0hBTkdFX1JFU09VUkNFX0xJRkVDWUNMRV9TVEFURSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzL2xpZmVjeWNsZVN0YXRlLyVzIjsKKwlmaW5hbCBTdHJpbmcgQ0hBTkdFX1NFUlZJQ0VfTElGRUNZQ0xFX1NUQVRFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9saWZlY3ljbGVTdGF0ZS8lcyI7CisJZmluYWwgU3RyaW5nIENIQU5HRV9QUk9EVUNUX0xJRkVDWUNMRV9TVEFURSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcHJvZHVjdHMvJXMvbGlmZWN5Y2xlU3RhdGUvJXMiOworCWZpbmFsIFN0cmluZyBDSEFOR0VfQ09NUE9ORU5UX0xJRkVDWUNMRV9TVEFURSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvbGlmZWN5Y2xlU3RhdGUvJXMiOworCisJZmluYWwgU3RyaW5nIENSRUFURV9QUk9QRVJUWSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzL3Byb3BlcnRpZXMiOworCisJZmluYWwgU3RyaW5nIFVQREFURV9SRVNPVVJDRV9NRVRBREFUQSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzL21ldGFkYXRhIjsKKworCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqRXh0ZXJuYWwgQVBJJ3MKKwkvLyAoQXNzZXREYXRhKSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCWZpbmFsIFN0cmluZyBQT1NUX0VYVEVSTkFMX0FQSV9VUExPQURfQVJUSUZBQ1RfT0ZfQVNTRVQgPSAiaHR0cDovLyVzOiVzL2FzZGMvdjEvY2F0YWxvZy8lcy8lcy9hcnRpZmFjdHMiOworCisJZmluYWwgU3RyaW5nIEdFVF9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVF9PRl9BU1NFVCA9ICJodHRwOi8vJXM6JXMvYXNkYy92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBHRVRfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVF9PRl9BU1NFVCA9ICJodHRwOi8vJXM6JXMvYXNkYy92MS9jYXRhbG9nL3NlcnZpY2VzLyVzL2FydGlmYWN0cy8lcyI7CisKKwlmaW5hbCBTdHJpbmcgR0VUX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUX09GX0NPTVBPTkVOVF9JTlNUQU5DRSA9ICJodHRwOi8vJXM6JXMvYXNkYy92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9yZXNvdXJjZUluc3RhbmNlcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBHRVRfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVF9PRl9DT01QT05FTlRfSU5TVEFOQ0UgPSAiaHR0cDovLyVzOiVzL2FzZGMvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9yZXNvdXJjZUluc3RhbmNlcy8lcy9hcnRpZmFjdHMvJXMiOworCisJZmluYWwgU3RyaW5nIEdFVF9BU1NFVF9MSVNUID0gImh0dHA6Ly8lczolcy9hc2RjL3YxL2NhdGFsb2cvJXMiOworCWZpbmFsIFN0cmluZyBHRVRfRklMVEVSRURfQVNTRVRfTElTVCA9ICJodHRwOi8vJXM6JXMvYXNkYy92MS9jYXRhbG9nLyVzPyVzIjsKKwlmaW5hbCBTdHJpbmcgR0VUX1RPU0NBX01PREVMID0gImh0dHA6Ly8lczolcy9hc2RjL3YxL2NhdGFsb2cvJXMvJXMvdG9zY2FNb2RlbCI7CisJLy8gaHR0cHM6Ly97c2VydmVyUm9vdH0vYXNkYy92MS9jYXRhbG9nL3thc3NldFR5cGV9L3t1dWlkfS9tZXRhZGF0YSwgd2hlcmUKKwkvLyBhc3NldFR5cGUgaW4ge3Jlc291cmNlcywgc2VydmljZXN9CisJZmluYWwgU3RyaW5nIEdFVF9BU1NFVF9NRVRBREFUQSA9ICJodHRwOi8vJXM6JXMvYXNkYy92MS9jYXRhbG9nLyVzLyVzL21ldGFkYXRhIjsKKwlmaW5hbCBTdHJpbmcgUE9TVF9BVVRIT1JJWkFUSU9OID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY29uc3VtZXJzIjsKKwlmaW5hbCBTdHJpbmcgR0VUX0RPV05MT0FEX1NFUlZJQ0VfUklfQVJUSUZBQ1QgPSAiaHR0cDovLyVzOiVzL2FzZGMvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9yZXNvdXJjZUluc3RhbmNlcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBHRVRfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVCA9ICJodHRwOi8vJXM6JXMvYXNkYy92MS9jYXRhbG9nL3NlcnZpY2VzLyVzL2FydGlmYWN0cy8lcyI7CisKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJZmluYWwgU3RyaW5nIEFERF9BUlRJRkFDVF9UT19SRVNPVVJDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzL2FydGlmYWN0cyI7CisJZmluYWwgU3RyaW5nIFVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfT0ZfUkVTT1VSQ0UgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBBRERfQVJUSUZBQ1RfVE9fU0VSVklDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvYXJ0aWZhY3RzIjsKKwlmaW5hbCBTdHJpbmcgVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9PRl9TRVJWSUNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9hcnRpZmFjdHMvJXMiOworCisJZmluYWwgU3RyaW5nIFVQTE9BRF9ERUxFVEVfQVJUSUZBQ1RfT0ZfQ09NUE9ORU5UID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy8lcy8lcy9hcnRpZmFjdHMiOworCWZpbmFsIFN0cmluZyBVUERBVEVfQVJUSUZBQ1RfT0ZfQ09NUE9ORU5UID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy8lcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBVUExPQURfSEVBVF9FTlZfQVJUSUZBQ1QgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nLyVzLyVzL3Jlc291cmNlSW5zdGFuY2UvJXMvYXJ0aWZhY3RzLyVzIjsKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWZpbmFsIFN0cmluZyBVUExPQURfQVJUSUZBQ1RfQllfSU5URVJGQUNFX1RPX1JFU09VUkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMvJXMvJXMvYXJ0aWZhY3RzLyI7CisJZmluYWwgU3RyaW5nIFVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfQllfSU5URVJGQUNFX1RPX1JFU09VUkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMvJXMvJXMvYXJ0aWZhY3RzLyVzIjsKKworCWZpbmFsIFN0cmluZyBVUExPQURfQVJUSUZBQ1RfQllfSU5URVJGQUNFX1RPX0NPTVBPTkVOVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzLyVzLyVzL2FydGlmYWN0cy8iOworCWZpbmFsIFN0cmluZyBVUERBVEVfT1JfREVMRVRFX0FSVElGQUNUX0JZX0lOVEVSRkFDRV9UT19DT01QT05FTlQgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy8lcy8lcy9hcnRpZmFjdHMvJXMiOworCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyAiL3NkYzIvdjEvc2VydmljZXMvPHNlcnZpY2VOYW1lPi88MC4xPi9hcnRpZmFjdHMvYWFhLmhoIgorCWZpbmFsIFN0cmluZyBESVNUUklCX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1QgPSAiL3NkYzIvcmVzdC92MS9jYXRhbG9nL3NlcnZpY2VzLyVzLyVzL2FydGlmYWN0cy8lcyI7CisJLy8gIi9zZGMyL3YxL3NlcnZpY2VzLzxzZXJ2aWNlTmFtZT4vPDAuMT4vcmVzb3VyY2VzL3tyZXNvdXJjZU5hbWV9L3tyZXNvdXJjZVZlcnNpb259L2FydGlmYWN0cy88b3BlYXJ0aW9uX25hbWU+X2FhYS5oaCIKKwlmaW5hbCBTdHJpbmcgRElTVFJJQl9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVCA9ICIvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvJXMvcmVzb3VyY2VzLyVzLyVzL2FydGlmYWN0cy8lcyI7CisJZmluYWwgU3RyaW5nIERJU1RSSUJfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwgPSAiL2FzZGMvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBESVNUUklCX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUX1JFTEFUSVZFX1VSTCA9ICIvYXNkYy92MS9jYXRhbG9nL3NlcnZpY2VzLyVzLyVzL3Jlc291cmNlcy8lcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBET1dOTE9BRF9TRVJWSUNFX0FSVElGQUNUX0ZVTExfVVJMID0gImh0dHA6Ly8lczolcyVzIjsKKwlmaW5hbCBTdHJpbmcgRE9XTkxPQURfUkVTT1VSQ0VfQVJUSUZBQ1RfRlVMTF9VUkwgPSAiaHR0cDovLyVzOiVzJXMiOworCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlmaW5hbCBTdHJpbmcgVUlfRE9XTkxPQURfUkVTT1VSQ0VfQVJUSUZBQ1QgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9hcnRpZmFjdHMvJXMiOworCWZpbmFsIFN0cmluZyBVSV9ET1dOTE9BRF9TRVJWSUNFX0FSVElGQUNUID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9hcnRpZmFjdHMvJXMiOworCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWZpbmFsIFN0cmluZyBVUERBVEVfUFJPUEVSVFkgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9wcm9wZXJ0aWVzLyVzIjsKKworCWZpbmFsIFN0cmluZyBERUxFVEVfUFJPUEVSVFkgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9wcm9wZXJ0aWVzLyVzIjsKKworCWZpbmFsIFN0cmluZyBHRVRfUFJPUEVSVFkgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9wcm9wZXJ0aWVzLyVzIjsKKworCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlmaW5hbCBTdHJpbmcgVkFMSURBVEVfUkVTT1VSQ0VfTkFNRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzL3ZhbGlkYXRlLW5hbWUvJXMiOworCisJZmluYWwgU3RyaW5nIENSRUFURV9TRVJWSUNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcyI7CisJZmluYWwgU3RyaW5nIERFTEVURV9TRVJWSUNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcyI7CisJZmluYWwgU3RyaW5nIEdFVF9TRVJWSUNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcyI7CisJZmluYWwgU3RyaW5nIEdFVF9TRVJWSUNFX0JZX05BTUVfQU5EX1ZFUlNJT04gPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3NlcnZpY2VzL3NlcnZpY2VOYW1lLyVzL3NlcnZpY2VWZXJzaW9uLyVzIjsKKworCWZpbmFsIFN0cmluZyBHRVRfU0VSVklDRVNfUkVRVUlSTUVOVFNfQ0FQQUJJTElUSUVTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXF1aXJtZW50c0NhcGFiaWxpdGllcy9zZXJ2aWNlcy8lcyI7CisKKwlmaW5hbCBTdHJpbmcgQ1JFQVRFX0NPTVBPTkVOVF9JTlNUQU5DRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvcmVzb3VyY2VJbnN0YW5jZSI7CisJZmluYWwgU3RyaW5nIERFTEVURV9DT01QT05FTlRfSU5TVEFOQ0UgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nLyVzLyVzL3Jlc291cmNlSW5zdGFuY2UvJXMiOworCWZpbmFsIFN0cmluZyBVUERBVEVfQ09NUE9ORU5UX0lOU1RBTkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy8lcy8lcy9yZXNvdXJjZUluc3RhbmNlLyVzIjsKKwlmaW5hbCBTdHJpbmcgR0VUX0NPTVBPTkVOVF9JTlNUQU5DRVMgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nLyVzLyVzL2NvbXBvbmVudEluc3RhbmNlcyI7CisJLy8gVGFsIE5ldyBBUEkKKwlmaW5hbCBTdHJpbmcgVVBEQVRFX01VTFRJUExFX0NPTVBPTkVOVF9JTlNUQU5DRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvcmVzb3VyY2VJbnN0YW5jZS9tdWx0aXBsZUNvbXBvbmVudEluc3RhbmNlIjsKKworCWZpbmFsIFN0cmluZyBDSEFOR0VfX1JFU09VUkNFX0lOU1RBTkNFX1ZFUlNJT04gPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nLyVzLyVzL3Jlc291cmNlSW5zdGFuY2UvJXMvY2hhbmdlVmVyc2lvbiI7CisKKwlmaW5hbCBTdHJpbmcgQ1JFQVRFX0FORF9BU1NPQ0lBVEVfUkVTT1VSQ0VfSU5TVEFOQ0UgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3NlcnZpY2VzLyVzL3Jlc291cmNlSW5zdGFuY2UvY3JlYXRlQW5kQXNzb2NpYXRlIjsKKwlmaW5hbCBTdHJpbmcgQVNTT0NJQVRFX19SRVNPVVJDRV9JTlNUQU5DRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvcmVzb3VyY2VJbnN0YW5jZS9hc3NvY2lhdGUiOworCWZpbmFsIFN0cmluZyBESVNTT0NJQVRFX19SRVNPVVJDRV9JTlNUQU5DRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvcmVzb3VyY2VJbnN0YW5jZS9kaXNzb2NpYXRlIjsKKworCWZpbmFsIFN0cmluZyBESVNUUklCVVRJT05fSU5JVCA9ICJodHRwOi8vJXM6JXMvaW5pdCI7CisJZmluYWwgU3RyaW5nIERJU1RSSUJVVElPTl9JTklUX1JFU0VUID0gImh0dHA6Ly8lczolcy9pbml0UmVzZXQiOworCWZpbmFsIFN0cmluZyBBUFBST1ZFX0RJU1RSSUJVVElPTiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvZGlzdHJpYnV0aW9uLXN0YXRlL2FwcHJvdmUiOworCWZpbmFsIFN0cmluZyBSRUpFQ1RfRElTVFJJQlVUSU9OID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9kaXN0cmlidXRpb24tc3RhdGUvcmVqZWN0IjsKKwlmaW5hbCBTdHJpbmcgRElTVFJJQlVUSU9OX0RPV05MT0FEX0FSVElGQUNUID0gImh0dHA6Ly8lczolcy9kb3dubG9hZCI7CisJZmluYWwgU3RyaW5nIEFDVElWQVRFX0RJU1RSSUJVVElPTiA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvZGlzdHJpYnV0aW9uLyVzL2FjdGl2YXRlIjsKKworCWZpbmFsIFN0cmluZyBERVBMT1lfU0VSVklDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvZGlzdHJpYnV0aW9uLyVzL21hcmtEZXBsb3llZCI7CisJZmluYWwgU3RyaW5nIFVQREFURV9TRVJWSUNFX01FVEFEQVRBID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9tZXRhZGF0YSI7CisKKwkvLyBBbmRyZXkgY2hhbmdlZCBuYW1lIGZyb20gQUREX1BST1BFUlRZX1RPX1JFU09VUkNFX0lOU1RBTkNFIHRvCisJLy8gVVBEQVRFX1BST1BFUlRZX1RPX1JFU09VUkNFX0lOU1RBTkNFCisJZmluYWwgU3RyaW5nIFVQREFURV9QUk9QRVJUWV9UT19SRVNPVVJDRV9JTlNUQU5DRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvcmVzb3VyY2VJbnN0YW5jZS8lcy9wcm9wZXJ0eSI7CisJZmluYWwgU3RyaW5nIERFTEVURV9QUk9QRVJUWV9GUk9NX1JFU09VUkNFX0lOU1RBTkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9yZXNvdXJjZUluc3RhbmNlLyVzL3Byb3BlcnR5LyVzIjsKKwlmaW5hbCBTdHJpbmcgVVBEQVRFX1JFU09VUkNFX0lOU1RBTkNFX0hFQVRfRU5WX1BBUkFNUyA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvcmVzb3VyY2VJbnN0YW5jZS8lcy9hcnRpZmFjdHMvJXMvaGVhdFBhcmFtcyI7CisKKwkvLyBBY3Rpb25zIG9uIGFydGlmYWN0IGluIHJlc291cmNlIGluc3RhbmNlCisJZmluYWwgU3RyaW5nIEFERF9SRVNPVVJDRV9JTlNUQU5DRV9BUlRJRkFDVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvcmVzb3VyY2VJbnN0YW5jZS8lcy9hcnRpZmFjdHMiOworCWZpbmFsIFN0cmluZyBVUERBVEVfUkVTT1VSQ0VfSU5TVEFOQ0VfQVJUSUZBQ1QgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3NlcnZpY2VzLyVzL3Jlc291cmNlSW5zdGFuY2UvJXMvYXJ0aWZhY3RzLyVzIjsKKwlmaW5hbCBTdHJpbmcgREVMRVRFX1JFU09VUkNFX0lOU1RBTkNFX0FSVElGQUNUID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9yZXNvdXJjZUluc3RhbmNlLyVzL2FydGlmYWN0cy8lcyI7CisKKwkvLyBBdHRyaWJ1dGVzIE9uIFJlc291cmNlIGluc3RhbmNlCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0FUVFJJQlVURV9PTl9SRVNPVVJDRV9JTlNUQU5DRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvcmVzb3VyY2VJbnN0YW5jZS8lcy9hdHRyaWJ1dGUiOworCisJLy8gKCIvc2VydmljZXMve3NlcnZpY2VJZH0vcmVzb3VyY2VJbnN0YW5jZXMve3Jlc291cmNlSW5zdGFuY2VJZH0vYXJ0aWZhY3RzL3thcnRpZmFjdElkfSIpCisJZmluYWwgU3RyaW5nIERPV05MT0FEX0NPTVBPTkVOVF9JTlNUQU5DRV9BUlRJRkFDVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvcmVzb3VyY2VJbnN0YW5jZXMvJXMvYXJ0aWZhY3RzLyVzIjsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1zZXJ2aWNlIGFwaQorCS8vIGFydGlmYWN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlmaW5hbCBTdHJpbmcgVVBEQVRFX0RFTEVURV9TRVJWSUNFX0FQSV9BUlRJRkFDVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvYXJ0aWZhY3RzL2FwaS8lcyI7CisKKwlmaW5hbCBTdHJpbmcgQ1JFQVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT05fUkVTT1VSQ0UgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9hZGRpdGlvbmFsaW5mbyI7CisJZmluYWwgU3RyaW5nIFVQREFURV9BRERJVElPTkFMX0lORk9STUFUSU9OX1JFU09VUkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMvYWRkaXRpb25hbGluZm8vJXMiOworCWZpbmFsIFN0cmluZyBERUxFVEVfQURESVRJT05BTF9JTkZPUk1BVElPTl9SRVNPVVJDRSA9IFVQREFURV9BRERJVElPTkFMX0lORk9STUFUSU9OX1JFU09VUkNFOworCWZpbmFsIFN0cmluZyBHRVRfQURESVRJT05BTF9JTkZPUk1BVElPTl9SRVNPVVJDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzL2FkZGl0aW9uYWxpbmZvLyVzIjsKKwlmaW5hbCBTdHJpbmcgR0VUX0FMTF9BRERJVElPTkFMX0lORk9STUFUSU9OX1JFU09VUkNFID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvJXMvYWRkaXRpb25hbGluZm8iOworCisJZmluYWwgU3RyaW5nIENSRUFURV9BRERJVElPTkFMX0lORk9STUFUSU9OX1NFUlZJQ0UgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3NlcnZpY2VzLyVzL2FkZGl0aW9uYWxpbmZvIjsKKwlmaW5hbCBTdHJpbmcgVVBEQVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT05fU0VSVklDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvYWRkaXRpb25hbGluZm8vJXMiOworCWZpbmFsIFN0cmluZyBERUxFVEVfQURESVRJT05BTF9JTkZPUk1BVElPTl9TRVJWSUNFID0gVVBEQVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT05fU0VSVklDRTsKKwlmaW5hbCBTdHJpbmcgR0VUX0FERElUSU9OQUxfSU5GT1JNQVRJT05fU0VSVklDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvYWRkaXRpb25hbGluZm8vJXMiOworCWZpbmFsIFN0cmluZyBHRVRfQUxMX0FERElUSU9OQUxfSU5GT1JNQVRJT05fU0VSVklDRSA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvc2VydmljZXMvJXMvYWRkaXRpb25hbGluZm8iOworCisJZmluYWwgU3RyaW5nIEdFVF9DT01QT05FTlRfQVVESVRfUkVDT1JEUyA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvYXVkaXQtcmVjb3Jkcy8lcy8lcyI7CisKKwkvLyBDT05TVU1FUgorCWZpbmFsIFN0cmluZyBDUkVBVEVfQ09OU1VNRVIgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jb25zdW1lcnMiOworCWZpbmFsIFN0cmluZyBHRVRfQ09OU1VNRVIgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jb25zdW1lcnMvJXMiOworCWZpbmFsIFN0cmluZyBERUxFVEVfQ09OU1VNRVIgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jb25zdW1lcnMvJXMiOworCisJLy8gQ2F0ZWdvcmllcworCWZpbmFsIFN0cmluZyBDUkVBVEVfQ0FURUdPUlkgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRlZ29yeS8lcyI7CisJZmluYWwgU3RyaW5nIEdFVF9BTExfQ0FURUdPUklFUyA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGVnb3JpZXMvJXMiOworCWZpbmFsIFN0cmluZyBHRVRfQUxMX0NBVEVHT1JJRVNfRkUgPSAiaHR0cDovLyVzOiVzL3NkYzEvZmVQcm94eS9yZXN0L3YxL2NhdGVnb3JpZXMvJXMiOworCWZpbmFsIFN0cmluZyBERUxFVEVfQ0FURUdPUlkgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRlZ29yeS8lcy8lcyI7CisJZmluYWwgU3RyaW5nIENSRUFURV9TVUJfQ0FURUdPUlkgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRlZ29yeS8lcy8lcy9zdWJDYXRlZ29yeSI7CisJZmluYWwgU3RyaW5nIERFTEVURV9TVUJfQ0FURUdPUlkgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRlZ29yeS8lcy8lcy9zdWJDYXRlZ29yeS8lcyI7CisJZmluYWwgU3RyaW5nIENSRUFURV9HUk9VUElORyA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGVnb3J5LyVzLyVzL3N1YkNhdGVnb3J5LyVzL2dyb3VwaW5nIjsKKwlmaW5hbCBTdHJpbmcgREVMRVRFX0dST1VQSU5HID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0ZWdvcnkvJXMvJXMvc3ViQ2F0ZWdvcnkvJXMvZ3JvdXBpbmcvJXMiOworCisJLy8gcHJvZHVjdAorCWZpbmFsIFN0cmluZyBDUkVBVEVfUFJPRFVDVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcHJvZHVjdHMiOworCWZpbmFsIFN0cmluZyBERUxFVEVfUFJPRFVDVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcHJvZHVjdHMvJXMiOworCS8vIGxhc3QgJXMgaXMgcmVzb3VyY2VJZCwgcHJvZHVjdElkCisJZmluYWwgU3RyaW5nIEdFVF9QUk9EVUNUID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9wcm9kdWN0cy8lcyI7CisJZmluYWwgU3RyaW5nIFVQREFURV9QUk9EVUNUID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9wcm9kdWN0cy8lcy9tZXRhZGF0YSI7CisJZmluYWwgU3RyaW5nIEdFVF9QUk9EVUNUX0JZX05BTUVfQU5EX1ZFUlNJT04gPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Byb2R1Y3RzL3Byb2R1Y3ROYW1lLyVzL3Byb2R1Y3RWZXJzaW9uLyVzIjsKKworCS8vIGdyb3VwcworCWZpbmFsIFN0cmluZyBHRVRfR1JPVVBfQllfSUQgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nLyVzLyVzL2dyb3Vwcy8lcyI7CisKKwkvLyBtb2R1bGVzCisJZmluYWwgU3RyaW5nIEdFVF9NT0RVTEVfQllfSUQgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9ncm91cHMvJXMiOworCQorCS8vIGlucHV0cworCWZpbmFsIFN0cmluZyBBRERfSU5QVVRTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy8lcy8lcy9jcmVhdGUvaW5wdXRzIjsgLy97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9jcmVhdGUvaW5wdXRzCisJZmluYWwgU3RyaW5nIERFTEVURV9JTlBVVF9CWV9JRCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvJXMvJXMvZGVsZXRlLyVzL2lucHV0IjsgLy97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9kZWxldGUve2lucHV0SWR9L2lucHV0CisJZmluYWwgU3RyaW5nIEdFVF9DT01QT05FTlRfSU5QVVRTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy9pbnB1dHMiOyAvL3NlcnZpY2VzL3tjb21wb25lbnRJZH0vaW5wdXRzCisJZmluYWwgU3RyaW5nIEdFVF9DT01QT05FTlRfSU5TVEFOQ0VfSU5QVVRTID0gImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy8lcy8lcy9jb21wb25lbnRJbnN0YW5jZXMvJXMvJXMvaW5wdXRzIjsgLy97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9jb21wb25lbnRJbnN0YW5jZXMve2luc3RhbmNlSWR9L3tvcmlnaW5Db21vbmVudFVpZH0vaW5wdXRzCisJZmluYWwgU3RyaW5nIEdFVF9JTlBVVFNfRk9SX0NPTVBPTkVOVF9JTlBVVCA9ICJodHRwOi8vJXM6JXMvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzLyVzL2dyb3Vwcy8lcyI7IC8ve2NvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vaW5wdXRzL3tpbnB1dElkfS9pbnB1dHMKKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2NvbmZpZy9Db25maWcuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9jb25maWcvQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwMjU3MQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9jb25maWcvQ29uZmlnLmphdmEKQEAgLTAsMCArMSw1ODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOworCitwdWJsaWMgY2xhc3MgQ29uZmlnIHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBXSU5ET1dTX0NPTkZJR19GSUxFID0gInNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy55YW1sIjsKKworCVN0cmluZyBjYXRhbG9nQmVIb3N0OworCVN0cmluZyBlc0hvc3Q7CisJU3RyaW5nIGVzUG9ydDsKKwlTdHJpbmcgbmVvSG9zdDsKKwlTdHJpbmcgbmVvUG9ydDsKKwlTdHJpbmcgZGlzcmlidXRpb25DbGllbnRIb3N0OworCVN0cmluZyBkaXNyaWJ1dGlvbkNsaWVudFBvcnQ7CisKKwlTdHJpbmcgZXJyb3JDb25maWd1cmF0aW9uRmlsZTsKKwlTdHJpbmcgcmVzb3VyY2VDb25maWdEaXI7CisJU3RyaW5nIGNvbXBvbmVudHNDb25maWdEaXI7CisJU3RyaW5nIGltcG9ydFJlc291cmNlQ29uZmlnRGlyOworCVN0cmluZyBpbXBvcnRSZXNvdXJjZVRlc3RzQ29uZmlnRGlyOworCVN0cmluZyBpbXBvcnRUeXBlc0NvbmZpZ0RpcjsKKwlTdHJpbmcgdGVzdFN1aXRlczsKKworCVN0cmluZyBjYXRhbG9nRmVIb3N0OworCVN0cmluZyBjYXRhbG9nRmVQb3J0OworCVN0cmluZyBjYXRhbG9nQmVQb3J0OworCVN0cmluZyBjYXRhbG9nQmVUbHNQb3J0OworCisJU3RyaW5nIG5lb0RCdXNlcm5hbWU7CisJU3RyaW5nIG5lb0RCcGFzc3dvcmQ7CisKKwlTdHJpbmcgdGl0YW5Qcm9wZXJ0aWVzRmlsZTsKKwlMaXN0PFN0cmluZz4gcGFja2FnZXM7CisJTGlzdDxTdHJpbmc+IGJ1Z3M7CisJTGlzdDxTdHJpbmc+IHJlc291cmNlc05vdFRvRGVsZXRlOworCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZTsKKwlMaXN0PFN0cmluZz4gc2VydmljZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZTsKKwlCb29sZWFuIHN0b3BPbkNsYXNzRmFpbHVyZSA9IGZhbHNlOworCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0Rm9sZGVyOworCXByaXZhdGUgU3RyaW5nIHJlcG9ydE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdXJsOworCXByaXZhdGUgU3RyaW5nIHJlbW90ZVRlc3RpbmdNYWNoaW5lSVA7CisJcHJpdmF0ZSBTdHJpbmcgcmVtb3RlVGVzdGluZ01hY2hpbmVQb3J0OworCXByaXZhdGUgYm9vbGVhbiByZW1vdGVUZXN0aW5nOworCisJcHJpdmF0ZSBTdHJpbmcgY2Fzc2FuZHJhSG9zdDsKKwlwcml2YXRlIFN0cmluZyBjYXNzYW5kcmFBdWRpdEtleVNwYWNlOworCXByaXZhdGUgU3RyaW5nIGNhc3NhbmRyYUFydGlmYWN0S2V5U3BhY2U7CisJcHJpdmF0ZSBCb29sZWFuIGNhc3NhbmRyYUF1dGhlbnRpY2F0ZTsKKwlwcml2YXRlIFN0cmluZyBjYXNzYW5kcmFVc2VybmFtZTsKKwlwcml2YXRlIFN0cmluZyBjYXNzYW5kcmFQYXNzd29yZDsKKwlwcml2YXRlIEJvb2xlYW4gY2Fzc2FuZHJhU3NsOworCXByaXZhdGUgU3RyaW5nIGNhc3NhbmRyYVRydXN0c3RvcmVQYXRoOworCXByaXZhdGUgU3RyaW5nIGNhc3NhbmRyYVRydXN0c3RvcmVQYXNzd29yZDsKKworCXByaXZhdGUgc3RhdGljIENvbmZpZyBjb25maWdJdCA9IG51bGw7CisKKwlwcml2YXRlIHN0YXRpYyBZYW1sIHlhbWwgPSBuZXcgWWFtbCgpOworCisJcHJpdmF0ZSBDb25maWcoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UGFja2FnZXMgeworCisJCUxpc3Q8U3RyaW5nPiBwYWNrYWdlczsKKwkJTGlzdDxTdHJpbmc+IGJ1Z3M7CisKKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYWNrYWdlcygpIHsKKwkJCXJldHVybiBwYWNrYWdlczsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VzKExpc3Q8U3RyaW5nPiBwYWNrYWdlcykgeworCQkJdGhpcy5wYWNrYWdlcyA9IHBhY2thZ2VzOworCQl9CisKKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRCdWdzKCkgeworCQkJcmV0dXJuIGJ1Z3M7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRCdWdzKExpc3Q8U3RyaW5nPiBidWdzKSB7CisJCQl0aGlzLmJ1Z3MgPSBidWdzOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIlRlc3RQYWNrYWdlcyBbcGFja2FnZXM9IiArIHBhY2thZ2VzICsgIiwgYnVncz0iICsgYnVncyArICJdIjsKKwkJfQorCisJfQorCisJcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29uZmlnIGluc3RhbmNlKCkgeworCQlpZiAoY29uZmlnSXQgPT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQljb25maWdJdCA9IGluaXQoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCXJldHVybiBjb25maWdJdDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IG51bGw7CisKKwkJU3RyaW5nIGNvbmZpZ0ZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbmZpZy5yZXNvdXJjZSIpOworCQlpZiAoY29uZmlnRmlsZSA9PSBudWxsKSB7CisJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuY29udGFpbnMoIldpbmRvd3MiKSkgeworCQkJCWNvbmZpZ0ZpbGUgPSBXSU5ET1dTX0NPTkZJR19GSUxFOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGxlYXNlIEFkZCBKdm0gQXJndW1lbnQgY29uZmlnLnJlc291cmNlIik7CisJCQl9CisJCX0KKworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKwkJaWYgKGZhbHNlID09IGZpbGUuZXhpc3RzKCkpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgY29uZmlnIGZpbGUgIiArIGNvbmZpZ0ZpbGUgKyAiIGNhbm5vdCBiZSBmb3VuZC4iKTsKKwkJfQorCisJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJaW4gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShQYXRocy5nZXQoY29uZmlnRmlsZSkpOworCisJCQljb25maWcgPSB5YW1sLmxvYWRBcyhpbiwgQ29uZmlnLmNsYXNzKTsKKworCQkJc2V0UGFja2FnZXNBbmRCdWdzKGNvbmZpZ0ZpbGUsIGNvbmZpZyk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gY29uZmlnOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UGFja2FnZXNBbmRCdWdzKFN0cmluZyBwYXRoLCBDb25maWcgY29uZmlnKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCWludCBzZXBhcmF0b3IgPSBNYXRoLm1heChwYXRoLmxhc3RJbmRleE9mKCJcXCIpLCBwYXRoLmxhc3RJbmRleE9mKCIvIikpOworCQlTdHJpbmcgZGlyUGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHNlcGFyYXRvciArIDEpOworCQlTdHJpbmcgcGFja2FnZXNGaWxlID0gZGlyUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgInNkYy1wYWNrYWdlcy55YW1sIjsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGFja2FnZXNGaWxlKTsKKwkJaWYgKGZhbHNlID09IGZpbGUuZXhpc3RzKCkpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgY29uZmlnIGZpbGUgIiArIHBhY2thZ2VzRmlsZSArICIgY2Fubm90IGJlIGZvdW5kLiIpOworCQl9CisKKwkJVGVzdFBhY2thZ2VzIHRlc3RQYWNrYWdlcyA9IG51bGw7CisJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJaW4gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShQYXRocy5nZXQocGFja2FnZXNGaWxlKSk7CisKKwkJCXRlc3RQYWNrYWdlcyA9IHlhbWwubG9hZEFzKGluLCBUZXN0UGFja2FnZXMuY2xhc3MpOworCisJCQlMaXN0PFN0cmluZz4gYnVncyA9IHRlc3RQYWNrYWdlcy5nZXRCdWdzKCk7CisJCQlMaXN0PFN0cmluZz4gcGFja2FnZXMgPSB0ZXN0UGFja2FnZXMuZ2V0UGFja2FnZXMoKTsKKworCQkJY29uZmlnLnNldEJ1Z3MoYnVncyk7CisJCQljb25maWcuc2V0UGFja2FnZXMocGFja2FnZXMpOworCisJCX0gZmluYWxseSB7CisJCQlpZiAoaW4gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWluLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwkvLyBwdWJsaWMgQ29uZmlnKFN0cmluZyBjYXRhbG9nQmVIb3N0LCBTdHJpbmcgZXNIb3N0LCBTdHJpbmcgZXNQb3J0LCBTdHJpbmcKKwkvLyByZXNvdXJjZUNvbmZpZ0RpciwgU3RyaW5nIGNvbXBvbmVudHNDb25maWdEaXIsIFN0cmluZyBjYXRhbG9nRmVIb3N0LAorCS8vIFN0cmluZyBjYXRhbG9nRmVQb3J0LCBTdHJpbmcgY2F0YWxvZ0JlUG9ydCkgeworCS8vIHN1cGVyKCk7CisJLy8gdGhpcy5jYXRhbG9nQmVIb3N0ID0gY2F0YWxvZ0JlSG9zdDsKKwkvLyB0aGlzLmVzSG9zdCA9IGVzSG9zdDsKKwkvLyB0aGlzLmVzUG9ydCA9IGVzUG9ydDsKKwkvLyB0aGlzLnJlc291cmNlQ29uZmlnRGlyID0gcmVzb3VyY2VDb25maWdEaXI7CisJLy8gdGhpcy5jb21wb25lbnRzQ29uZmlnRGlyID0gY29tcG9uZW50c0NvbmZpZ0RpcjsKKwkvLyB0aGlzLmNhdGFsb2dGZUhvc3QgPSBjYXRhbG9nRmVIb3N0OworCS8vIHRoaXMuY2F0YWxvZ0ZlUG9ydCA9IGNhdGFsb2dGZVBvcnQ7CisJLy8gdGhpcy5jYXRhbG9nQmVQb3J0ID0gY2F0YWxvZ0JlUG9ydDsKKwkvLyB9CisKKwlTdHJpbmcgY29uZmlndXJhdGlvbkZpbGU7CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25GaWxlKCkgeworCQlyZXR1cm4gY29uZmlndXJhdGlvbkZpbGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkZpbGUoU3RyaW5nIGNvbmZpZ3VyYXRpb25GaWxlKSB7CisJCXRoaXMuY29uZmlndXJhdGlvbkZpbGUgPSBjb25maWd1cmF0aW9uRmlsZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dCZVBvcnQoKSB7CisJCXJldHVybiBjYXRhbG9nQmVQb3J0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcmlidXRpb25DbGllbnRIb3N0KCkgeworCQlyZXR1cm4gZGlzcmlidXRpb25DbGllbnRIb3N0OworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc3JpYnV0aW9uQ2xpZW50SG9zdChTdHJpbmcgZGlzcmlidXRpb25DbGllbnRIb3N0KSB7CisJCXRoaXMuZGlzcmlidXRpb25DbGllbnRIb3N0ID0gZGlzcmlidXRpb25DbGllbnRIb3N0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcmlidXRpb25DbGllbnRQb3J0KCkgeworCQlyZXR1cm4gZGlzcmlidXRpb25DbGllbnRQb3J0OworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc3JpYnV0aW9uQ2xpZW50UG9ydChTdHJpbmcgZGlzcmlidXRpb25DbGllbnRQb3J0KSB7CisJCXRoaXMuZGlzcmlidXRpb25DbGllbnRQb3J0ID0gZGlzcmlidXRpb25DbGllbnRQb3J0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGFsb2dCZVBvcnQoU3RyaW5nIGNhdGFsb2dCZVBvcnQpIHsKKwkJdGhpcy5jYXRhbG9nQmVQb3J0ID0gY2F0YWxvZ0JlUG9ydDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dGZUhvc3QoKSB7CisJCXJldHVybiBjYXRhbG9nRmVIb3N0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGFsb2dGZUhvc3QoU3RyaW5nIGNhdGFsb2dGZUhvc3QpIHsKKwkJdGhpcy5jYXRhbG9nRmVIb3N0ID0gY2F0YWxvZ0ZlSG9zdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dGZVBvcnQoKSB7CisJCXJldHVybiBjYXRhbG9nRmVQb3J0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGFsb2dGZVBvcnQoU3RyaW5nIGNhdGFsb2dGZVBvcnQpIHsKKwkJdGhpcy5jYXRhbG9nRmVQb3J0ID0gY2F0YWxvZ0ZlUG9ydDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dCZUhvc3QoKSB7CisJCXJldHVybiBjYXRhbG9nQmVIb3N0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGFsb2dCZUhvc3QoU3RyaW5nIGNhdGFsb2dCZUhvc3QpIHsKKwkJdGhpcy5jYXRhbG9nQmVIb3N0ID0gY2F0YWxvZ0JlSG9zdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVzSG9zdCgpIHsKKwkJcmV0dXJuIGVzSG9zdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFc0hvc3QoU3RyaW5nIGVzSG9zdCkgeworCQl0aGlzLmVzSG9zdCA9IGVzSG9zdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVzUG9ydCgpIHsKKwkJcmV0dXJuIGVzUG9ydDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFc1BvcnQoU3RyaW5nIGVzUG9ydCkgeworCQl0aGlzLmVzUG9ydCA9IGVzUG9ydDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQ29uZmlnRGlyKCkgeworCQlyZXR1cm4gcmVzb3VyY2VDb25maWdEaXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VDb25maWdEaXIoU3RyaW5nIHJlc291cmNlQ29uZmlnRGlyKSB7CisJCXRoaXMucmVzb3VyY2VDb25maWdEaXIgPSByZXNvdXJjZUNvbmZpZ0RpcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudHNDb25maWdEaXIoKSB7CisJCXJldHVybiBjb21wb25lbnRzQ29uZmlnRGlyOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudHNDb25maWdEaXIoU3RyaW5nIGNvbXBvbmVudHNDb25maWdEaXIpIHsKKwkJdGhpcy5jb21wb25lbnRzQ29uZmlnRGlyID0gY29tcG9uZW50c0NvbmZpZ0RpcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZvbGRlcigpIHsKKwkJcmV0dXJuIG91dHB1dEZvbGRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPdXRwdXRGb2xkZXIoU3RyaW5nIG91dHB1dEZvbGRlcikgeworCQl0aGlzLm91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcG9ydE5hbWUoKSB7CisJCXJldHVybiByZXBvcnROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcG9ydE5hbWUoU3RyaW5nIHJlcG9ydE5hbWUpIHsKKwkJdGhpcy5yZXBvcnROYW1lID0gcmVwb3J0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5lb1BvcnQoKSB7CisJCXJldHVybiBuZW9Qb3J0OworCX0KKworCXB1YmxpYyB2b2lkIHNldE5lb1BvcnQoU3RyaW5nIG5lb1BvcnQpIHsKKwkJdGhpcy5uZW9Qb3J0ID0gbmVvUG9ydDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5lb0hvc3QoKSB7CisJCXJldHVybiBuZW9Ib3N0OworCX0KKworCXB1YmxpYyB2b2lkIHNldE5lb0hvc3QoU3RyaW5nIG5lb0hvc3QpIHsKKwkJdGhpcy5uZW9Ib3N0ID0gbmVvSG9zdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5lb0RCcGFzc3dvcmQoKSB7CisJCXJldHVybiBuZW9EQnBhc3N3b3JkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmVvREJ1c2VybmFtZSgpIHsKKwkJcmV0dXJuIG5lb0RCdXNlcm5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmVvREJ1c2VybmFtZShTdHJpbmcgbmVvREJ1c2VybmFtZSkgeworCQl0aGlzLm5lb0RCdXNlcm5hbWUgPSBuZW9EQnVzZXJuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5lb0RCcGFzc3dvcmQoU3RyaW5nIG5lb0RCcGFzc3dvcmQpIHsKKwkJdGhpcy5uZW9EQnBhc3N3b3JkID0gbmVvREJwYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRpdGFuUHJvcGVydGllc0ZpbGUoKSB7CisJCXJldHVybiB0aXRhblByb3BlcnRpZXNGaWxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpdGFuUHJvcGVydGllc0ZpbGUoU3RyaW5nIHRpdGFuUHJvcGVydGllc0ZpbGUpIHsKKwkJdGhpcy50aXRhblByb3BlcnRpZXNGaWxlID0gdGl0YW5Qcm9wZXJ0aWVzRmlsZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhY2thZ2VzKCkgeworCQlyZXR1cm4gcGFja2FnZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGFja2FnZXMoTGlzdDxTdHJpbmc+IHBhY2thZ2VzKSB7CisJCXRoaXMucGFja2FnZXMgPSBwYWNrYWdlczsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEJ1Z3MoKSB7CisJCXJldHVybiBidWdzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEJ1Z3MoTGlzdDxTdHJpbmc+IGJ1Z3MpIHsKKwkJdGhpcy5idWdzID0gYnVnczsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBpc1N0b3BPbkNsYXNzRmFpbHVyZSgpIHsKKwkJcmV0dXJuIHN0b3BPbkNsYXNzRmFpbHVyZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdG9wT25DbGFzc0ZhaWx1cmUoQm9vbGVhbiBzdG9wT25DbGFzc0ZhaWx1cmUpIHsKKwkJdGhpcy5zdG9wT25DbGFzc0ZhaWx1cmUgPSBzdG9wT25DbGFzc0ZhaWx1cmU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbXBvcnRSZXNvdXJjZUNvbmZpZ0RpcigpIHsKKwkJcmV0dXJuIGltcG9ydFJlc291cmNlQ29uZmlnRGlyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEltcG9ydFJlc291cmNlQ29uZmlnRGlyKFN0cmluZyBpbXBvcnRSZXNvdXJjZUNvbmZpZ0RpcikgeworCQl0aGlzLmltcG9ydFJlc291cmNlQ29uZmlnRGlyID0gaW1wb3J0UmVzb3VyY2VDb25maWdEaXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbXBvcnRSZXNvdXJjZVRlc3RzQ29uZmlnRGlyKCkgeworCQlyZXR1cm4gaW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0RpcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbXBvcnRSZXNvdXJjZVRlc3RzQ29uZmlnRGlyKFN0cmluZyBpbXBvcnRSZXNvdXJjZVRlc3RzQ29uZmlnRGlyKSB7CisJCXRoaXMuaW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0RpciA9IGltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFcnJvckNvbmZpZ3VyYXRpb25GaWxlKCkgeworCQlyZXR1cm4gZXJyb3JDb25maWd1cmF0aW9uRmlsZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFcnJvckNvbmZpZ3VyYXRpb25GaWxlKFN0cmluZyBlcnJvckNvbmZpZ3VyYXRpb25GaWxlKSB7CisJCXRoaXMuZXJyb3JDb25maWd1cmF0aW9uRmlsZSA9IGVycm9yQ29uZmlndXJhdGlvbkZpbGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXRhbG9nQmVUbHNQb3J0KCkgeworCQlyZXR1cm4gY2F0YWxvZ0JlVGxzUG9ydDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nQmVUbHNQb3J0KFN0cmluZyBjYXRhbG9nQmVUbHNQb3J0KSB7CisJCXRoaXMuY2F0YWxvZ0JlVGxzUG9ydCA9IGNhdGFsb2dCZVRsc1BvcnQ7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZXNvdXJjZXNOb3RUb0RlbGV0ZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlc05vdFRvRGVsZXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlc05vdFRvRGVsZXRlKExpc3Q8U3RyaW5nPiByZXNvdXJjZXNOb3RUb0RlbGV0ZSkgeworCQl0aGlzLnJlc291cmNlc05vdFRvRGVsZXRlID0gcmVzb3VyY2VzTm90VG9EZWxldGU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZXNvdXJjZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlKExpc3Q8U3RyaW5nPiByZXNvdXJjZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZSkgeworCQl0aGlzLnJlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlID0gcmVzb3VyY2VDYXRlZ29yaWVzTm90VG9EZWxldGU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTZXJ2aWNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlKCkgeworCQlyZXR1cm4gc2VydmljZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlKExpc3Q8U3RyaW5nPiBzZXJ2aWNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlKSB7CisJCXRoaXMuc2VydmljZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZSA9IHNlcnZpY2VDYXRlZ29yaWVzTm90VG9EZWxldGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbXBvcnRUeXBlc0NvbmZpZ0RpcigpIHsKKwkJcmV0dXJuIGltcG9ydFR5cGVzQ29uZmlnRGlyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEltcG9ydFR5cGVzQ29uZmlnRGlyKFN0cmluZyBpbXBvcnRUeXBlc0NvbmZpZ0RpcikgeworCQl0aGlzLmltcG9ydFR5cGVzQ29uZmlnRGlyID0gaW1wb3J0VHlwZXNDb25maWdEaXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXNzYW5kcmFIb3N0KCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhSG9zdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXNzYW5kcmFIb3N0KFN0cmluZyBjYXNzYW5kcmFIb3N0KSB7CisJCXRoaXMuY2Fzc2FuZHJhSG9zdCA9IGNhc3NhbmRyYUhvc3Q7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXNzYW5kcmFBdWRpdEtleVNwYWNlKCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhQXVkaXRLZXlTcGFjZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXNzYW5kcmFBdWRpdEtleVNwYWNlKFN0cmluZyBjYXNzYW5kcmFBdWRpdEtleVNwYWNlKSB7CisJCXRoaXMuY2Fzc2FuZHJhQXVkaXRLZXlTcGFjZSA9IGNhc3NhbmRyYUF1ZGl0S2V5U3BhY2U7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXNzYW5kcmFBcnRpZmFjdEtleVNwYWNlKCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhQXJ0aWZhY3RLZXlTcGFjZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXNzYW5kcmFBcnRpZmFjdEtleVNwYWNlKFN0cmluZyBjYXNzYW5kcmFBcnRpZmFjdEtleVNwYWNlKSB7CisJCXRoaXMuY2Fzc2FuZHJhQXJ0aWZhY3RLZXlTcGFjZSA9IGNhc3NhbmRyYUFydGlmYWN0S2V5U3BhY2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJDb25maWcgW2NhdGFsb2dCZUhvc3Q9IiArIGNhdGFsb2dCZUhvc3QgKyAiLCBlc0hvc3Q9IiArIGVzSG9zdCArICIsIGVzUG9ydD0iICsgZXNQb3J0ICsgIiwgbmVvSG9zdD0iCisJCQkJKyBuZW9Ib3N0ICsgIiwgbmVvUG9ydD0iICsgbmVvUG9ydCArICIsIGRpc3JpYnV0aW9uQ2xpZW50SG9zdD0iICsgZGlzcmlidXRpb25DbGllbnRIb3N0CisJCQkJKyAiLCBkaXNyaWJ1dGlvbkNsaWVudFBvcnQ9IiArIGRpc3JpYnV0aW9uQ2xpZW50UG9ydCArICIsIGVycm9yQ29uZmlndXJhdGlvbkZpbGU9IgorCQkJCSsgZXJyb3JDb25maWd1cmF0aW9uRmlsZSArICIsIHJlc291cmNlQ29uZmlnRGlyPSIgKyByZXNvdXJjZUNvbmZpZ0RpciArICIsIGNvbXBvbmVudHNDb25maWdEaXI9IgorCQkJCSsgY29tcG9uZW50c0NvbmZpZ0RpciArICIsIGltcG9ydFJlc291cmNlQ29uZmlnRGlyPSIgKyBpbXBvcnRSZXNvdXJjZUNvbmZpZ0RpcgorCQkJCSsgIiwgaW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0Rpcj0iICsgaW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0RpciArICIsIGltcG9ydFR5cGVzQ29uZmlnRGlyPSIKKwkJCQkrIGltcG9ydFR5cGVzQ29uZmlnRGlyICsgIiwgY2F0YWxvZ0ZlSG9zdD0iICsgY2F0YWxvZ0ZlSG9zdCArICIsIGNhdGFsb2dGZVBvcnQ9IiArIGNhdGFsb2dGZVBvcnQKKwkJCQkrICIsIGNhdGFsb2dCZVBvcnQ9IiArIGNhdGFsb2dCZVBvcnQgKyAiLCBjYXRhbG9nQmVUbHNQb3J0PSIgKyBjYXRhbG9nQmVUbHNQb3J0ICsgIiwgbmVvREJ1c2VybmFtZT0iCisJCQkJKyBuZW9EQnVzZXJuYW1lICsgIiwgbmVvREJwYXNzd29yZD0iICsgbmVvREJwYXNzd29yZCArICIsIHRpdGFuUHJvcGVydGllc0ZpbGU9IiArIHRpdGFuUHJvcGVydGllc0ZpbGUKKwkJCQkrICIsIHBhY2thZ2VzPSIgKyBwYWNrYWdlcyArICIsIGJ1Z3M9IiArIGJ1Z3MgKyAiLCByZXNvdXJjZXNOb3RUb0RlbGV0ZT0iICsgcmVzb3VyY2VzTm90VG9EZWxldGUKKwkJCQkrICIsIHJlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlPSIgKyByZXNvdXJjZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZSArICIsIHNlcnZpY2VDYXRlZ29yaWVzTm90VG9EZWxldGU9IgorCQkJCSsgc2VydmljZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZSArICIsIHN0b3BPbkNsYXNzRmFpbHVyZT0iICsgc3RvcE9uQ2xhc3NGYWlsdXJlICsgIiwgb3V0cHV0Rm9sZGVyPSIKKwkJCQkrIG91dHB1dEZvbGRlciArICIsIHJlcG9ydE5hbWU9IiArIHJlcG9ydE5hbWUgKyAiLCBjb25maWd1cmF0aW9uRmlsZT0iICsgY29uZmlndXJhdGlvbkZpbGUgKyAiXSI7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZW1vdGVUZXN0aW5nKCkgeworCQlyZXR1cm4gcmVtb3RlVGVzdGluZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZW1vdGVUZXN0aW5nKGJvb2xlYW4gcmVtb3RlVGVzdGluZykgeworCQl0aGlzLnJlbW90ZVRlc3RpbmcgPSByZW1vdGVUZXN0aW5nOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworCQl0cnkgeworCQkJcmV0dXJuIHVybDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZW1vdGVUZXN0aW5nTWFjaGluZUlQKCkgeworCQlyZXR1cm4gcmVtb3RlVGVzdGluZ01hY2hpbmVJUDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZW1vdGVUZXN0aW5nTWFjaGluZUlQKFN0cmluZyByZW1vdGVUZXN0aW5nTWFjaGluZUlQKSB7CisJCXRoaXMucmVtb3RlVGVzdGluZ01hY2hpbmVJUCA9IHJlbW90ZVRlc3RpbmdNYWNoaW5lSVA7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZW1vdGVUZXN0aW5nTWFjaGluZVBvcnQoKSB7CisJCXJldHVybiByZW1vdGVUZXN0aW5nTWFjaGluZVBvcnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVtb3RlVGVzdGluZ01hY2hpbmVQb3J0KFN0cmluZyByZW1vdGVUZXN0aW5nTWFjaGluZVBvcnQpIHsKKwkJdGhpcy5yZW1vdGVUZXN0aW5nTWFjaGluZVBvcnQgPSByZW1vdGVUZXN0aW5nTWFjaGluZVBvcnQ7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0Q2Fzc2FuZHJhQXV0aGVudGljYXRlKCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhQXV0aGVudGljYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc3NhbmRyYUF1dGhlbnRpY2F0ZShCb29sZWFuIGNhc3NhbmRyYUF1dGhlbnRpY2F0ZSkgeworCQl0aGlzLmNhc3NhbmRyYUF1dGhlbnRpY2F0ZSA9IGNhc3NhbmRyYUF1dGhlbnRpY2F0ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhc3NhbmRyYVVzZXJuYW1lKCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhVXNlcm5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2Fzc2FuZHJhVXNlcm5hbWUoU3RyaW5nIGNhc3NhbmRyYVVzZXJuYW1lKSB7CisJCXRoaXMuY2Fzc2FuZHJhVXNlcm5hbWUgPSBjYXNzYW5kcmFVc2VybmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhc3NhbmRyYVBhc3N3b3JkKCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhUGFzc3dvcmQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2Fzc2FuZHJhUGFzc3dvcmQoU3RyaW5nIGNhc3NhbmRyYVBhc3N3b3JkKSB7CisJCXRoaXMuY2Fzc2FuZHJhUGFzc3dvcmQgPSBjYXNzYW5kcmFQYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRDYXNzYW5kcmFTc2woKSB7CisJCXJldHVybiBjYXNzYW5kcmFTc2w7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2Fzc2FuZHJhU3NsKEJvb2xlYW4gY2Fzc2FuZHJhU3NsKSB7CisJCXRoaXMuY2Fzc2FuZHJhU3NsID0gY2Fzc2FuZHJhU3NsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2Fzc2FuZHJhVHJ1c3RzdG9yZVBhdGgoKSB7CisJCXJldHVybiBjYXNzYW5kcmFUcnVzdHN0b3JlUGF0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXNzYW5kcmFUcnVzdHN0b3JlUGF0aChTdHJpbmcgY2Fzc2FuZHJhVHJ1c3RzdG9yZVBhdGgpIHsKKwkJdGhpcy5jYXNzYW5kcmFUcnVzdHN0b3JlUGF0aCA9IGNhc3NhbmRyYVRydXN0c3RvcmVQYXRoOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2Fzc2FuZHJhVHJ1c3RzdG9yZVBhc3N3b3JkKCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhVHJ1c3RzdG9yZVBhc3N3b3JkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc3NhbmRyYVRydXN0c3RvcmVQYXNzd29yZChTdHJpbmcgY2Fzc2FuZHJhVHJ1c3RzdG9yZVBhc3N3b3JkKSB7CisJCXRoaXMuY2Fzc2FuZHJhVHJ1c3RzdG9yZVBhc3N3b3JkID0gY2Fzc2FuZHJhVHJ1c3RzdG9yZVBhc3N3b3JkOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2NvbmZpZy9JbnZva2VkTWV0aG9kTGlzdGVuZXIuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9jb25maWcvSW52b2tlZE1ldGhvZExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjNDkzZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9jb25maWcvSW52b2tlZE1ldGhvZExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuU2tpcEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBJbnZva2VkTWV0aG9kTGlzdGVuZXIgaW1wbGVtZW50cyBJSW52b2tlZE1ldGhvZExpc3RlbmVyIHsKKworCXN0YXRpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtZXRob2RGYWlsQ291bnQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisKKwlAT3ZlcnJpZGUKKworCXB1YmxpYyB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisKKwkJaWYgKG1ldGhvZEZhaWxDb3VudC5nZXQobWV0aG9kLmdldFRlc3RNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkpICE9IG51bGwKKwkJCQkmJiBtZXRob2RGYWlsQ291bnQuZ2V0KG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKSA+IDEpCisJCQl0aHJvdyBuZXcgU2tpcEV4Y2VwdGlvbigiU2tpcHBlZCBkdWUgdG8gZmFpbHVyZSBjb3VudCA+IDEiKTsKKwkJOworCisJfQorCisJQE92ZXJyaWRlCisKKwlwdWJsaWMgdm9pZCBhZnRlckludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisKKwkJaWYgKHRlc3RSZXN1bHQuZ2V0U3RhdHVzKCkgPT0gVGVzdFJlc3VsdC5GQUlMVVJFKSB7CisJCQlpZiAobWV0aG9kRmFpbENvdW50LmdldChtZXRob2QuZ2V0VGVzdE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSkgPT0gbnVsbCkKKwkJCQltZXRob2RGYWlsQ291bnQucHV0KG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCAxKTsKKwkJCWVsc2UgeworCQkJCW1ldGhvZEZhaWxDb3VudC5wdXQobWV0aG9kLmdldFRlc3RNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksCisJCQkJCQltZXRob2RGYWlsQ291bnQuZ2V0KG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKSArIDEpOworCQkJfQorCisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9BcnRpZmFjdEFzc2V0U3RydWN0dXJlLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0FydGlmYWN0QXNzZXRTdHJ1Y3R1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTkzNmUyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9BcnRpZmFjdEFzc2V0U3RydWN0dXJlLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdEFzc2V0U3RydWN0dXJlIHsKKworCVN0cmluZyBhcnRpZmFjdE5hbWU7CisJU3RyaW5nIGFydGlmYWN0VHlwZTsKKwlTdHJpbmcgYXJ0aWZhY3RVUkw7CisJU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb247CisJaW50IGFydGlmYWN0VGltZW91dDsvLyBvcHRpb25hbAorCVN0cmluZyBhcnRpZmFjdENoZWNrc3VtOworCVN0cmluZyBhcnRpZmFjdFVVSUQ7CisJU3RyaW5nIGFydGlmYWN0VmVyc2lvbjsKKwlTdHJpbmcgZ2VuZXJhdGVkRnJvbVVVSUQ7Ly8gb3B0aW9uYWwKKworCXB1YmxpYyBBcnRpZmFjdEFzc2V0U3RydWN0dXJlKFN0cmluZyBhcnRpZmFjdE5hbWUsIFN0cmluZyBhcnRpZmFjdFR5cGUsIFN0cmluZyBhcnRpZmFjdFVSTCwKKwkJCVN0cmluZyBhcnRpZmFjdERlc2NyaXB0aW9uLCBpbnQgYXJ0aWZhY3RUaW1lb3V0LCBTdHJpbmcgYXJ0aWZhY3RDaGVja3N1bSwgU3RyaW5nIGFydGlmYWN0VVVJRCwKKwkJCVN0cmluZyBhcnRpZmFjdFZlcnNpb24sIFN0cmluZyBnZW5lcmF0ZWRGcm9tVVVJRCkgeworCQlzdXBlcigpOworCQl0aGlzLmFydGlmYWN0TmFtZSA9IGFydGlmYWN0TmFtZTsKKwkJdGhpcy5hcnRpZmFjdFR5cGUgPSBhcnRpZmFjdFR5cGU7CisJCXRoaXMuYXJ0aWZhY3RVUkwgPSBhcnRpZmFjdFVSTDsKKwkJdGhpcy5hcnRpZmFjdERlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwkJdGhpcy5hcnRpZmFjdFRpbWVvdXQgPSBhcnRpZmFjdFRpbWVvdXQ7CisJCXRoaXMuYXJ0aWZhY3RDaGVja3N1bSA9IGFydGlmYWN0Q2hlY2tzdW07CisJCXRoaXMuYXJ0aWZhY3RVVUlEID0gYXJ0aWZhY3RVVUlEOworCQl0aGlzLmFydGlmYWN0VmVyc2lvbiA9IGFydGlmYWN0VmVyc2lvbjsKKwkJdGhpcy5nZW5lcmF0ZWRGcm9tVVVJRCA9IGdlbmVyYXRlZEZyb21VVUlEOworCX0KKworCXB1YmxpYyBBcnRpZmFjdEFzc2V0U3RydWN0dXJlKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdE5hbWUoU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQl0aGlzLmFydGlmYWN0TmFtZSA9IGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VHlwZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFR5cGUoU3RyaW5nIGFydGlmYWN0VHlwZSkgeworCQl0aGlzLmFydGlmYWN0VHlwZSA9IGFydGlmYWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VVJMKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RVUkw7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RVUkwoU3RyaW5nIGFydGlmYWN0VVJMKSB7CisJCXRoaXMuYXJ0aWZhY3RVUkwgPSBhcnRpZmFjdFVSTDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGVzY3JpcHRpb24oU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb24pIHsKKwkJdGhpcy5hcnRpZmFjdERlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgaW50IGdldEFydGlmYWN0VGltZW91dCgpIHsKKwkJcmV0dXJuIGFydGlmYWN0VGltZW91dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFRpbWVvdXQoaW50IGFydGlmYWN0VGltZW91dCkgeworCQl0aGlzLmFydGlmYWN0VGltZW91dCA9IGFydGlmYWN0VGltZW91dDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0Q2hlY2tzdW0oKSB7CisJCXJldHVybiBhcnRpZmFjdENoZWNrc3VtOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0Q2hlY2tzdW0oU3RyaW5nIGFydGlmYWN0Q2hlY2tzdW0pIHsKKwkJdGhpcy5hcnRpZmFjdENoZWNrc3VtID0gYXJ0aWZhY3RDaGVja3N1bTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VVVJRCgpIHsKKwkJcmV0dXJuIGFydGlmYWN0VVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFVVSUQoU3RyaW5nIGFydGlmYWN0VVVJRCkgeworCQl0aGlzLmFydGlmYWN0VVVJRCA9IGFydGlmYWN0VVVJRDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VmVyc2lvbigpIHsKKwkJcmV0dXJuIGFydGlmYWN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFZlcnNpb24oU3RyaW5nIGFydGlmYWN0VmVyc2lvbikgeworCQl0aGlzLmFydGlmYWN0VmVyc2lvbiA9IGFydGlmYWN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRlZEZyb21VVUlEKCkgeworCQlyZXR1cm4gZ2VuZXJhdGVkRnJvbVVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkRnJvbVVVSUQoU3RyaW5nIGdlbmVyYXRlZEZyb21VVUlEKSB7CisJCXRoaXMuZ2VuZXJhdGVkRnJvbVVVSUQgPSBnZW5lcmF0ZWRGcm9tVVVJRDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUgW2FydGlmYWN0TmFtZT0iICsgYXJ0aWZhY3ROYW1lICsgIiwgYXJ0aWZhY3RUeXBlPSIgKyBhcnRpZmFjdFR5cGUKKwkJCQkrICIsIGFydGlmYWN0VVJMPSIgKyBhcnRpZmFjdFVSTCArICIsIGFydGlmYWN0RGVzY3JpcHRpb249IiArIGFydGlmYWN0RGVzY3JpcHRpb24gKyAiLCBhcnRpZmFjdFRpbWVvdXQ9IgorCQkJCSsgYXJ0aWZhY3RUaW1lb3V0ICsgIiwgYXJ0aWZhY3RDaGVja3N1bT0iICsgYXJ0aWZhY3RDaGVja3N1bSArICIsIGFydGlmYWN0VVVJRD0iICsgYXJ0aWZhY3RVVUlECisJCQkJKyAiLCBhcnRpZmFjdFZlcnNpb249IiArIGFydGlmYWN0VmVyc2lvbiArICIsIGdlbmVyYXRlZEZyb21VVUlEPSIgKyBnZW5lcmF0ZWRGcm9tVVVJRCArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQXJ0aWZhY3RSZXFEZXRhaWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0FydGlmYWN0UmVxRGV0YWlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjA2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0FydGlmYWN0UmVxRGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEFydGlmYWN0UmVxRGV0YWlscyB7CisKKwlwdWJsaWMgQXJ0aWZhY3RSZXFEZXRhaWxzKCkgeworCisJfQorCisJcHVibGljIEFydGlmYWN0UmVxRGV0YWlscyhTdHJpbmcgYXJ0aWZhY3ROYW1lLCBTdHJpbmcgYXJ0aWZhY3RUeXBlLCBTdHJpbmcgYXJ0aWZhY3REZXNjcmlwdGlvbiwgU3RyaW5nIHBheWxvYWREYXRhLAorCQkJU3RyaW5nIGFydGlmYWN0TGFibGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJCXRoaXMuYXJ0aWZhY3RUeXBlID0gYXJ0aWZhY3RUeXBlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwkJdGhpcy5wYXlsb2FkRGF0YSA9IHBheWxvYWREYXRhOworCQl0aGlzLmFydGlmYWN0TGFiZWwgPSBhcnRpZmFjdExhYmxlOworCX0KKworCXB1YmxpYyBBcnRpZmFjdFJlcURldGFpbHMoU3RyaW5nIGFydGlmYWN0TGFibGUsIEFydGlmYWN0UmVxRGV0YWlscyBhKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuYXJ0aWZhY3ROYW1lID0gYS5nZXRBcnRpZmFjdE5hbWUoKTsKKwkJdGhpcy5hcnRpZmFjdFR5cGUgPSBhLmdldEFydGlmYWN0VHlwZSgpOworCQl0aGlzLmRlc2NyaXB0aW9uID0gYS5nZXRBcnRpZmFjdFR5cGUoKTsKKwkJdGhpcy5wYXlsb2FkRGF0YSA9IGEuZ2V0UGF5bG9hZCgpOworCQl0aGlzLmFydGlmYWN0TGFiZWwgPSBhcnRpZmFjdExhYmxlOworCX0KKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0TmFtZTsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdFR5cGU7CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisJcHJpdmF0ZSBTdHJpbmcgcGF5bG9hZERhdGE7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RMYWJlbDsKKwlwcml2YXRlIFN0cmluZyBhcGlVcmw7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RHcm91cFR5cGU7CisJcHJpdmF0ZSBJbnRlZ2VyIHRpbWVvdXQ7CisJcHJpdmF0ZSBTdHJpbmcgdXNlcklkTGFzdFVwZGF0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgY3JlYXRvckZ1bGxOYW1lOworCXByaXZhdGUgU3RyaW5nIHVwZGF0ZXJGdWxsTmFtZTsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdENoZWNrc3VtOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0RGlzcGxheU5hbWU7CisJcHJpdmF0ZSBMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVyczsKKworCXByaXZhdGUgYm9vbGVhbiBtYW5kYXRvcnk7CisJcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VBcGk7CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VBcGkoKSB7CisJCXJldHVybiBzZXJ2aWNlQXBpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VBcGkoYm9vbGVhbiBzZXJ2aWNlQXBpKSB7CisJCXRoaXMuc2VydmljZUFwaSA9IHNlcnZpY2VBcGk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdExhYmVsKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RMYWJlbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdExhYmVsKFN0cmluZyBhcnRpZmFjdExhYmVsKSB7CisJCXRoaXMuYXJ0aWZhY3RMYWJlbCA9IGFydGlmYWN0TGFiZWw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdE5hbWUoKSB7CisJCXJldHVybiBhcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3ROYW1lKFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdFR5cGUoKSB7CisJCXJldHVybiBhcnRpZmFjdFR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RUeXBlKFN0cmluZyBhcnRpZmFjdFR5cGUpIHsKKwkJdGhpcy5hcnRpZmFjdFR5cGUgPSBhcnRpZmFjdFR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYXlsb2FkKCkgeworCQlyZXR1cm4gcGF5bG9hZERhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGF5bG9hZChTdHJpbmcgcGF5bG9hZCkgeworCQl0aGlzLnBheWxvYWREYXRhID0gcGF5bG9hZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXlsb2FkRGF0YShTdHJpbmcgcGF5bG9hZERhdGEpIHsKKwkJdGhpcy5wYXlsb2FkRGF0YSA9IHBheWxvYWREYXRhOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSB7CisJCXJldHVybiBhcnRpZmFjdEdyb3VwVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdEdyb3VwVHlwZShTdHJpbmcgYXJ0aWZhY3RHcm91cFR5cGUpIHsKKwkJdGhpcy5hcnRpZmFjdEdyb3VwVHlwZSA9IGFydGlmYWN0R3JvdXBUeXBlOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldFRpbWVvdXQoKSB7CisJCXJldHVybiB0aW1lb3V0OworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoSW50ZWdlciB0aW1lb3V0KSB7CisJCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNNYW5kYXRvcnkoKSB7CisJCXJldHVybiBtYW5kYXRvcnk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWFuZGF0b3J5KGJvb2xlYW4gbWFuZGF0b3J5KSB7CisJCXRoaXMubWFuZGF0b3J5ID0gbWFuZGF0b3J5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworCQlyZXR1cm4gYXBpVXJsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisJCXRoaXMuYXBpVXJsID0gdXJsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmICghYXBpVXJsLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuICJBcnRpZmFjdFJlcURldGFpbHMgW2FydGlmYWN0TmFtZT0iICsgYXJ0aWZhY3ROYW1lICsgIiwgYXJ0aWZhY3RUeXBlPSIgKyBhcnRpZmFjdFR5cGUKKwkJCQkJKyAiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24gKyAiLCBwYXlsb2FkRGF0YT0iICsgcGF5bG9hZERhdGEgKyAiLCBhcnRpZmFjdExhYmVsPSIKKwkJCQkJKyBhcnRpZmFjdExhYmVsICsgIiwgbWFuZGF0b3J5PSIgKyBtYW5kYXRvcnkgKyAiLCB1cmw9IiArIGFwaVVybCArICJdIjsKKwkJfQorCisJCXJldHVybiAiQXJ0aWZhY3RSZXFEZXRhaWxzIFthcnRpZmFjdE5hbWU9IiArIGFydGlmYWN0TmFtZSArICIsIGFydGlmYWN0VHlwZT0iICsgYXJ0aWZhY3RUeXBlICsgIiwgZGVzY3JpcHRpb249IgorCQkJCSsgZGVzY3JpcHRpb24gKyAiLCBwYXlsb2FkRGF0YT0iICsgcGF5bG9hZERhdGEgKyAiLCBhcnRpZmFjdExhYmVsPSIgKyBhcnRpZmFjdExhYmVsCisJCQkJKyAiLCBhcnRpZmFjdFVuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIG1hbmRhdG9yeT0iICsgbWFuZGF0b3J5ICsgIiwgc2VydmljZUFwaT0iICsgc2VydmljZUFwaSArICJdIjsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpIHsKKworCQlyZXR1cm4gYXJ0aWZhY3REaXNwbGF5TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdERpc3BsYXlOYW1lKFN0cmluZyBhcnRpZmFjdERpc3BsYXlOYW1lKSB7CisJCXRoaXMuYXJ0aWZhY3REaXNwbGF5TmFtZSA9IGFydGlmYWN0RGlzcGxheU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VySWRMYXN0VXBkYXRlcigpIHsKKwkJcmV0dXJuIHVzZXJJZExhc3RVcGRhdGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJJZExhc3RVcGRhdGVyKFN0cmluZyB1c2VySWRMYXN0VXBkYXRlcikgeworCQl0aGlzLnVzZXJJZExhc3RVcGRhdGVyID0gdXNlcklkTGFzdFVwZGF0ZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yRnVsbE5hbWUoKSB7CisJCXJldHVybiBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRvckZ1bGxOYW1lKFN0cmluZyBjcmVhdG9yRnVsbE5hbWUpIHsKKwkJdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVcGRhdGVyRnVsbE5hbWUoKSB7CisJCXJldHVybiB1cGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXBkYXRlckZ1bGxOYW1lKFN0cmluZyB1cGRhdGVyRnVsbE5hbWUpIHsKKwkJdGhpcy51cGRhdGVyRnVsbE5hbWUgPSB1cGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdENoZWNrc3VtKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RDaGVja3N1bTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdENoZWNrc3VtKFN0cmluZyBhcnRpZmFjdENoZWNrc3VtKSB7CisJCXRoaXMuYXJ0aWZhY3RDaGVja3N1bSA9IGFydGlmYWN0Q2hlY2tzdW07CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyBhcnRpZmFjdFVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSBhcnRpZmFjdFVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBnZXRIZWF0UGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIGhlYXRQYXJhbWV0ZXJzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhlYXRQYXJhbWV0ZXJzKExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzKSB7CisJCXRoaXMuaGVhdFBhcmFtZXRlcnMgPSBoZWF0UGFyYW1ldGVyczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQXNzZXRTdHJ1Y3R1cmUuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQXNzZXRTdHJ1Y3R1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODIwYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Bc3NldFN0cnVjdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgY2xhc3MgQXNzZXRTdHJ1Y3R1cmUgeworCisJcHJpdmF0ZSBTdHJpbmcgdXVpZDsKKwlwcml2YXRlIFN0cmluZyBpbnZhcmlhbnRVVUlEOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyB0b3NjYU1vZGVsVVJMOworCXByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OworCXByaXZhdGUgU3RyaW5nIGxpZmVjeWNsZVN0YXRlOworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkOworCisJcHVibGljIEFzc2V0U3RydWN0dXJlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBc3NldFN0cnVjdHVyZShTdHJpbmcgdXVpZCwgU3RyaW5nIGludmFyaWFudFVVSUQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHRvc2NhTW9kZWxVUkwsCisJCQlTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBsaWZlY3ljbGVTdGF0ZSwgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudXVpZCA9IHV1aWQ7CisJCXRoaXMuaW52YXJpYW50VVVJRCA9IGludmFyaWFudFVVSUQ7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJCXRoaXMudG9zY2FNb2RlbFVSTCA9IHRvc2NhTW9kZWxVUkw7CisJCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkJdGhpcy5saWZlY3ljbGVTdGF0ZSA9IGxpZmVjeWNsZVN0YXRlOworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJBc3NldFN0cnVjdHVyZSBbdXVpZD0iICsgdXVpZCArICIsIGludmFyaWFudFVVSUQ9IiArIGludmFyaWFudFVVSUQgKyAiLCBuYW1lPSIgKyBuYW1lICsgIiwgdmVyc2lvbj0iCisJCQkJKyB2ZXJzaW9uICsgIiwgdG9zY2FNb2RlbFVSTD0iICsgdG9zY2FNb2RlbFVSTCArICIsIGNhdGVnb3J5PSIgKyBjYXRlZ29yeSArICIsIGxpZmVjeWNsZVN0YXRlPSIKKwkJCQkrIGxpZmVjeWNsZVN0YXRlICsgIiwgbGFzdFVwZGF0ZXJVc2VySWQ9IiArIGxhc3RVcGRhdGVyVXNlcklkICsgIl0iOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXVpZCgpIHsKKwkJcmV0dXJuIHV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXVpZChTdHJpbmcgdXVpZCkgeworCQl0aGlzLnV1aWQgPSB1dWlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SW52YXJpYW50VVVJRCgpIHsKKwkJcmV0dXJuIGludmFyaWFudFVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCkgeworCQl0aGlzLmludmFyaWFudFVVSUQgPSBpbnZhcmlhbnRVVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VG9zY2FNb2RlbFVSTCgpIHsKKwkJcmV0dXJuIHRvc2NhTW9kZWxVUkw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FNb2RlbFVSTChTdHJpbmcgdG9zY2FNb2RlbFVSTCkgeworCQl0aGlzLnRvc2NhTW9kZWxVUkwgPSB0b3NjYU1vZGVsVVJMOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7CisJCXJldHVybiBjYXRlZ29yeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKKwkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGlmZWN5Y2xlU3RhdGUoKSB7CisJCXJldHVybiBsaWZlY3ljbGVTdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVTdGF0ZShTdHJpbmcgbGlmZWN5Y2xlU3RhdGUpIHsKKwkJdGhpcy5saWZlY3ljbGVTdGF0ZSA9IGxpZmVjeWNsZVN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSB7CisJCXJldHVybiBsYXN0VXBkYXRlclVzZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlclVzZXJJZChTdHJpbmcgbGFzdFVwZGF0ZXJVc2VySWQpIHsKKwkJdGhpcy5sYXN0VXBkYXRlclVzZXJJZCA9IGxhc3RVcGRhdGVyVXNlcklkOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Db21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5NzAwZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB7CisKKwlTdHJpbmcgY29tcG9uZW50VWlkOworCVN0cmluZyBkZXNjcmlwdGlvbjsKKwlTdHJpbmcgcG9zWDsKKwlTdHJpbmcgcG9zWTsKKwlTdHJpbmcgbmFtZTsKKwlTdHJpbmcgdW5pcXVlSWQ7CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuc2V0VW5pcXVlSWQoY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBjb21wb25lbnRJbnN0YW5jZS5nZXREZXNjcmlwdGlvbigpOworCQl0aGlzLnBvc1ggPSBjb21wb25lbnRJbnN0YW5jZS5nZXRQb3NYKCk7CisJCXRoaXMucG9zWSA9IGNvbXBvbmVudEluc3RhbmNlLmdldFBvc1koKTsKKwkJLy8gdGhpcy5uYW1lID0gIm15UmVzb3VyY2VJbnN0YW5jZSI7CisJCXRoaXMubmFtZSA9IGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKFN0cmluZyByZXNvdXJjZVVpZCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgcG9zWCwgU3RyaW5nIHBvc1ksIFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29tcG9uZW50VWlkID0gcmVzb3VyY2VVaWQ7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJdGhpcy5wb3NYID0gcG9zWDsKKwkJdGhpcy5wb3NZID0gcG9zWTsKKwkJLy8gdGhpcy5uYW1lID0gIm15UmVzb3VyY2VJbnN0YW5jZSI7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyhTdHJpbmcgcmVzb3VyY2VVaWQsIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHBvc1gsIFN0cmluZyBwb3NZKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29tcG9uZW50VWlkID0gcmVzb3VyY2VVaWQ7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJdGhpcy5wb3NYID0gcG9zWDsKKwkJdGhpcy5wb3NZID0gcG9zWTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFVpZCgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudFVpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRVaWQoU3RyaW5nIHJlc291cmNlVWlkKSB7CisJCXRoaXMuY29tcG9uZW50VWlkID0gcmVzb3VyY2VVaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQb3NYKCkgeworCQlyZXR1cm4gcG9zWDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQb3NYKFN0cmluZyBwb3NYKSB7CisJCXRoaXMucG9zWCA9IHBvc1g7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQb3NZKCkgeworCQlyZXR1cm4gcG9zWTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQb3NZKFN0cmluZyBwb3NZKSB7CisJCXRoaXMucG9zWSA9IHBvc1k7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyBbcmVzb3VyY2VVaWQ9IiArIGNvbXBvbmVudFVpZCArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIHBvc1g9IgorCQkJCSsgcG9zWCArICIsIHBvc1k9IiArIHBvc1kgKyAiLCBuYW1lPSIgKyBuYW1lICsgIiwgdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Db21wb25lbnRSZXFEZXRhaWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0NvbXBvbmVudFJlcURldGFpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQ2NzMyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Db21wb25lbnRSZXFEZXRhaWxzLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRSZXFEZXRhaWxzIHsKKworCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCXByb3RlY3RlZCBTdHJpbmcgY29udGFjdElkOworCXByb3RlY3RlZCBTdHJpbmcgaWNvbjsKKwlwcm90ZWN0ZWQgU3RyaW5nIHVuaXF1ZUlkOworCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRvclVzZXJJZDsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0b3JGdWxsTmFtZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkOworCXByb3RlY3RlZCBTdHJpbmcgbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwlwcm90ZWN0ZWQgTG9uZyBjcmVhdGlvbkRhdGU7CisJcHJvdGVjdGVkIExvbmcgbGFzdFVwZGF0ZURhdGU7CisJcHJvdGVjdGVkIExpZmVjeWNsZVN0YXRlRW51bSBsaWZlY3ljbGVTdGF0ZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247CisJcHJvdGVjdGVkIFN0cmluZyBVVUlEOworCXByb3RlY3RlZCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllczsKKwlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RDb2RlOworCXByb3RlY3RlZCBTdHJpbmcgY3NhclVVSUQ7CisJcHJvdGVjdGVkIFN0cmluZyBjc2FyVmVyc2lvbjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGltcG9ydGVkVG9zY2FDaGVja3N1bTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGludmFyaWFudFVVSUQ7CisKKwlwdWJsaWMgU3RyaW5nIGdldENzYXJWZXJzaW9uKCkgeworCQlyZXR1cm4gY3NhclZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3NhclZlcnNpb24oU3RyaW5nIGNzYXJWZXJzaW9uKSB7CisJCXRoaXMuY3NhclZlcnNpb24gPSBjc2FyVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGFncy5hZGQobmFtZSk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYWdzKCkgeworCQlyZXR1cm4gdGFnczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYWdzKExpc3Q8U3RyaW5nPiB0YWdzKSB7CisJCXRoaXMudGFncyA9IHRhZ3M7CisJfQorCisJLy8gcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkvLyByZXR1cm4gY2F0ZWdvcnk7CisJLy8gfQorCS8vCisJcHVibGljIFN0cmluZyBnZXRDb250YWN0SWQoKSB7CisJCXJldHVybiBjb250YWN0SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udGFjdElkKFN0cmluZyBjb250YWN0SWQpIHsKKwkJdGhpcy5jb250YWN0SWQgPSBjb250YWN0SWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJY29uKCkgeworCQlyZXR1cm4gaWNvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJY29uKFN0cmluZyBpY29uKSB7CisJCXRoaXMuaWNvbiA9IGljb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRvclVzZXJJZChTdHJpbmcgY3JlYXRvclVzZXJJZCkgeworCQl0aGlzLmNyZWF0b3JVc2VySWQgPSBjcmVhdG9yVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0b3JGdWxsTmFtZShTdHJpbmcgY3JlYXRvckZ1bGxOYW1lKSB7CisJCXRoaXMuY3JlYXRvckZ1bGxOYW1lID0gY3JlYXRvckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVyVXNlcklkKFN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCkgeworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShTdHJpbmcgbGFzdFVwZGF0ZXJGdWxsTmFtZSkgeworCQl0aGlzLmxhc3RVcGRhdGVyRnVsbE5hbWUgPSBsYXN0VXBkYXRlckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShMb25nIGNyZWF0aW9uRGF0ZSkgeworCQl0aGlzLmNyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlRGF0ZShMb25nIGxhc3RVcGRhdGVEYXRlKSB7CisJCXRoaXMubGFzdFVwZGF0ZURhdGUgPSBsYXN0VXBkYXRlRGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0gbGlmZWN5Y2xlU3RhdGUpIHsKKwkJdGhpcy5saWZlY3ljbGVTdGF0ZSA9IGxpZmVjeWNsZVN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVVSUQoU3RyaW5nIHVVSUQpIHsKKwkJdGhpcy5VVUlEID0gdVVJRDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENyZWF0b3JVc2VySWQoKSB7CisJCXJldHVybiBjcmVhdG9yVXNlcklkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRvckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gY3JlYXRvckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSB7CisJCXJldHVybiBsYXN0VXBkYXRlclVzZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhc3RVcGRhdGVyRnVsbE5hbWUoKSB7CisJCXJldHVybiBsYXN0VXBkYXRlckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uRGF0ZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRMYXN0VXBkYXRlRGF0ZSgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVEYXRlOworCX0KKworCXB1YmxpYyBMaWZlY3ljbGVTdGF0ZUVudW0gZ2V0TGlmZWN5Y2xlU3RhdGUoKSB7CisJCXJldHVybiBsaWZlY3ljbGVTdGF0ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7CisJCXJldHVybiBVVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gZ2V0Q2F0ZWdvcmllcygpIHsKKwkJcmV0dXJuIGNhdGVnb3JpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0ZWdvcmllcyhMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcykgeworCQl0aGlzLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUFsbENhdGVnb3JpZXMoKSB7CisJCXRoaXMuY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5Q2hhaW4oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgc3ViQ2F0ZWdvcnkpIHsKKwkJaWYgKGNhdGVnb3J5ICE9IG51bGwgfHwgc3ViQ2F0ZWdvcnkgIT0gbnVsbCkgeworCQkJaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCkgeworCQkJCWNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCX0KKwkJCUNhdGVnb3J5RGVmaW5pdGlvbiBzZWxlY3RlZENhdGVnb3J5ID0gbnVsbDsKKwkJCWZvciAoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmIDogY2F0ZWdvcmllcykgeworCQkJCWlmIChjYXRlZ29yeURlZi5nZXROYW1lKCkuZXF1YWxzKGNhdGVnb3J5KSkgeworCQkJCQlzZWxlY3RlZENhdGVnb3J5ID0gY2F0ZWdvcnlEZWY7CisJCQkJfQorCQkJfQorCQkJaWYgKHNlbGVjdGVkQ2F0ZWdvcnkgPT0gbnVsbCkgeworCQkJCXNlbGVjdGVkQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCQkJc2VsZWN0ZWRDYXRlZ29yeS5zZXROYW1lKGNhdGVnb3J5KTsKKwkJCQljYXRlZ29yaWVzLmFkZChzZWxlY3RlZENhdGVnb3J5KTsKKwkJCX0KKwkJCWlmIChzdWJDYXRlZ29yeSAhPSBudWxsKSB7CisJCQkJTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IHN1YmNhdGVnb3JpZXMgPSBzZWxlY3RlZENhdGVnb3J5LmdldFN1YmNhdGVnb3JpZXMoKTsKKwkJCQlpZiAoc3ViY2F0ZWdvcmllcyA9PSBudWxsKSB7CisJCQkJCXN1YmNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQkJc2VsZWN0ZWRDYXRlZ29yeS5zZXRTdWJjYXRlZ29yaWVzKHN1YmNhdGVnb3JpZXMpOworCQkJCX0KKwkJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc2VsZWN0ZWRTdWJjYXRlZ29yeSA9IG51bGw7CisJCQkJZm9yIChTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0ZWdvcnkgOiBzdWJjYXRlZ29yaWVzKSB7CisJCQkJCWlmIChzdWJjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKHN1YkNhdGVnb3J5KSkgeworCQkJCQkJc2VsZWN0ZWRTdWJjYXRlZ29yeSA9IHN1YmNhdGVnb3J5OworCQkJCQl9CisJCQkJfQorCQkJCWlmIChzZWxlY3RlZFN1YmNhdGVnb3J5ID09IG51bGwpIHsKKwkJCQkJc2VsZWN0ZWRTdWJjYXRlZ29yeSA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCQkJc2VsZWN0ZWRTdWJjYXRlZ29yeS5zZXROYW1lKHN1YkNhdGVnb3J5KTsKKwkJCQkJc3ViY2F0ZWdvcmllcy5hZGQoc2VsZWN0ZWRTdWJjYXRlZ29yeSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7CisJCWFkZENhdGVnb3J5Q2hhaW4oY2F0ZWdvcnksIG51bGwpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdENvZGUoKSB7CisJCXJldHVybiBwcm9qZWN0Q29kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0Q29kZShTdHJpbmcgcHJvamVjdENvZGUpIHsKKwkJdGhpcy5wcm9qZWN0Q29kZSA9IHByb2plY3RDb2RlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3NhclVVSUQoKSB7CisJCXJldHVybiBjc2FyVVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDc2FyVVVJRChTdHJpbmcgY3NhclVVSUQpIHsKKwkJdGhpcy5jc2FyVVVJRCA9IGNzYXJVVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKCkgeworCQlyZXR1cm4gaW1wb3J0ZWRUb3NjYUNoZWNrc3VtOworCX0KKworCXB1YmxpYyB2b2lkIHNldEltcG9ydGVkVG9zY2FDaGVja3N1bShTdHJpbmcgaW1wb3J0ZWRUb3NjYUNoZWNrc3VtKSB7CisJCXRoaXMuaW1wb3J0ZWRUb3NjYUNoZWNrc3VtID0gaW1wb3J0ZWRUb3NjYUNoZWNrc3VtOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SW52YXJpYW50VVVJRCgpIHsKKwkJcmV0dXJuIGludmFyaWFudFVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCkgeworCQl0aGlzLmludmFyaWFudFVVSUQgPSBpbnZhcmlhbnRVVUlEOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Hcm91cEhlYXRNZXRhRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Hcm91cEhlYXRNZXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGY2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0dyb3VwSGVhdE1ldGFEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBHcm91cEhlYXRNZXRhRGVmaW5pdGlvbiB7CisKKwlpbnQgZ3JvdXAgPSAwOworCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwlQcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbiBwcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbjsKKworCXB1YmxpYyBQcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbiBnZXRQcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIHByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uKFByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uIHByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uKSB7CisJCXRoaXMucHJvcGVydHlIZWF0TWV0YURlZmluaXRpb24gPSBwcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgR3JvdXBIZWF0TWV0YURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIGludCBnZXRHcm91cCgpIHsKKwkJcmV0dXJuIGdyb3VwOworCX0KKworCXB1YmxpYyB2b2lkIHNldEdyb3VwKGludCBncm91cCkgeworCQl0aGlzLmdyb3VwID0gZ3JvdXA7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBcnRpZmFjdExpc3QoKSB7CisJCXJldHVybiBhcnRpZmFjdExpc3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RMaXN0KExpc3Q8U3RyaW5nPiBhcnRpZmFjdExpc3QpIHsKKwkJdGhpcy5hcnRpZmFjdExpc3QgPSBhcnRpZmFjdExpc3Q7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0ltcG9ydFJlcURldGFpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvSW1wb3J0UmVxRGV0YWlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODllZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0ltcG9ydFJlcURldGFpbHMuamF2YQpAQCAtMCwwICsxLDMzMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkFycmF5OworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOworCitwdWJsaWMgY2xhc3MgSW1wb3J0UmVxRGV0YWlscyBleHRlbmRzIFJlc291cmNlUmVxRGV0YWlscyB7CisKKwlwcml2YXRlIFN0cmluZyBwYXlsb2FkTmFtZTsKKwlwcml2YXRlIFN0cmluZyBwYXlsb2FkRGF0YTsKKworCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdGllczsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGRlcml2ZWRMaXN0OworCXByaXZhdGUgU3RyaW5nIGRlcml2ZWRGcm9tRmllbGQ7CisKKwlwdWJsaWMgSW1wb3J0UmVxRGV0YWlscyhTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIExpc3Q8U3RyaW5nPiB0YWdzLCBMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20sCisJCQlTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlbmRvclJlbGVhc2UsIFN0cmluZyBjb250YWN0SWQsIFN0cmluZyBpY29uKSB7CisJCXN1cGVyKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHRhZ3MsIG51bGwsIGRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGF5bG9hZE5hbWUoKSB7CisJCXJldHVybiBwYXlsb2FkTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXlsb2FkTmFtZShTdHJpbmcgcGF5bG9hZE5hbWUpIHsKKwkJdGhpcy5wYXlsb2FkTmFtZSA9IHBheWxvYWROYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGF5bG9hZERhdGEoKSB7CisJCXJldHVybiBwYXlsb2FkRGF0YTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXlsb2FkRGF0YShTdHJpbmcgcGF5bG9hZERhdGEpIHsKKwkJdGhpcy5wYXlsb2FkRGF0YSA9IHBheWxvYWREYXRhOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiSW1wb3J0UmVxRGV0YWlscyBbcGF5bG9hZE5hbWU9IiArIHBheWxvYWROYW1lICsgIiwgcGF5bG9hZERhdGE9IiArIHBheWxvYWREYXRhICsgIl0iOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcWlyZW1lbnRzQW5kQ2FwYWJpbGl0aWVzKFN0cmluZyBwYXRoLCBTdHJpbmcgZmlsZU5hbWUsIFVzZXIgdXNlciwgU3RyaW5nIGRlcml2ZWRGcm9tU291cmNlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNldFJlcXVpcmVtZW50cyhwYXRoLCBmaWxlTmFtZSwgdXNlciwgZGVyaXZlZEZyb21Tb3VyY2UpOworCQlzZXRDYXBhYmlsaXRpZXMocGF0aCwgZmlsZU5hbWUsIHVzZXIsIGRlcml2ZWRGcm9tU291cmNlKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERlcml2ZWRMaXN0KCkgeworCQlyZXR1cm4gZGVyaXZlZExpc3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVyaXZlZExpc3QoTGlzdDxTdHJpbmc+IGRlcml2ZWRMaXN0KSB7CisJCXRoaXMuZGVyaXZlZExpc3QgPSBkZXJpdmVkTGlzdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlcml2ZWRGcm9tRmllbGQoKSB7CisJCXJldHVybiBkZXJpdmVkRnJvbUZpZWxkOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcml2ZWRGcm9tRmllbGQoU3RyaW5nIGRlcml2ZWRGcm9tRmllbGQpIHsKKwkJdGhpcy5kZXJpdmVkRnJvbUZpZWxkID0gZGVyaXZlZEZyb21GaWVsZDsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRSZXF1aXJlbWVudHMoKSB7CisJCXJldHVybiByZXF1aXJlbWVudHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRzKFN0cmluZyBwYXRoLCBTdHJpbmcgZmlsZU5hbWUsIFVzZXIgdXNlciwgU3RyaW5nIGRlcml2ZWRGcm9tU291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHNGcm9tRmlsZSA9IGdldFJlcXVpcmVtZW50c01hcEZyb21GaWxlKHBhdGggKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lLAorCQkJCXRvc2NhUmVzb3VyY2VOYW1lLCAicmVxdWlyZW1lbnRzIik7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzID0gb3JnYW5pemVSZXF1aXJlbWVudHNNYXAocmVxdWlyZW1lbnRzRnJvbUZpbGUpOworCQlnZXREZXJpdmVkUmVxQ2FwKHVzZXIsIHJlcXVpcmVtZW50cywgInJlcXVpcmVtZW50cyIsIGRlcml2ZWRGcm9tU291cmNlKTsKKwkJdGhpcy5yZXF1aXJlbWVudHMgPSByZXF1aXJlbWVudHM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdldERlcml2ZWRSZXFDYXAoVXNlciB1c2VyLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcUNhcE1hcCwgU3RyaW5nIGZpZWxkLCBTdHJpbmcgZGVyaXZlZEZyb21SZXNvdXJjZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbiB7CisKKwkJaWYgKGRlcml2ZWRGcm9tUmVzb3VyY2UgPT0gbnVsbCkgeworCQkJZGVyaXZlZEZyb21SZXNvdXJjZSA9ICJSb290IjsKKwkJfQorCisJCVJlc3RSZXNwb25zZSByZXN0ID0gZ2V0UmVzb3VyY2VTb3VyY2UodXNlciwgZGVyaXZlZEZyb21SZXNvdXJjZSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyc2VkRmllbGRGcm9tUmVzcG9uc2VBc01hcCA9IFJlc3BvbnNlUGFyc2VyLmdldEpzb25WYWx1ZUFzTWFwKHJlc3QsIGZpZWxkKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHBhcnNlZEZpZWxkRnJvbVJlc3BvbnNlQXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TGlzdFRvTWFwID0gbnVsbDsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJU3RyaW5nIHR5cGUgPSBpdGVyYXRvci5uZXh0KCk7CisJCQlMaXN0PE9iamVjdD4gbHN0ID0gKExpc3Q8T2JqZWN0PikgcGFyc2VkRmllbGRGcm9tUmVzcG9uc2VBc01hcC5nZXQodHlwZSk7CisJCQljb252ZXJ0TGlzdFRvTWFwID0gY29udmVydExpc3RUb01hcChsc3QpOworCisJCQlpZiAoZmllbGQuZXF1YWxzKCJjYXBhYmlsaXRpZXMiKSkgeworCQkJCWNvbnZlcnRMaXN0VG9NYXAucmVwbGFjZSgiY2FwYWJpbGl0eVNvdXJjZXMiLCBkZXJpdmVkTGlzdCk7CisJCQkJbHN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KEFycmF5cy5hc0xpc3QoY29udmVydExpc3RUb01hcCkpOworCQkJfQorCisJCQlPYmplY3QgZXhpc3RpbmdWYWx1ZSA9IHJlcUNhcE1hcC5nZXQodHlwZSk7CisJCQlpZiAoZXhpc3RpbmdWYWx1ZSAhPSBudWxsKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0ZWRFeGlzdGluZ1ZhbHVlID0gY29udmVydExpc3RUb01hcCgoTGlzdDxPYmplY3Q+KSBleGlzdGluZ1ZhbHVlKTsKKwkJCQlpZiAoY29udmVydGVkRXhpc3RpbmdWYWx1ZS5nZXQoIm5hbWUiKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkKKwkJCQkJCS5lcXVhbHMoY29udmVydExpc3RUb01hcC5nZXQoIm5hbWUiKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpKSB7CisJCQkJCWxzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihBcnJheXMuYXNMaXN0KGNvbnZlcnRlZEV4aXN0aW5nVmFsdWUpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsc3QuYWRkKGNvbnZlcnRlZEV4aXN0aW5nVmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJcmVxQ2FwTWFwLnB1dCh0eXBlLCBsc3QpOworCQl9CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VTb3VyY2UoVXNlciB1c2VyLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTT05FeGNlcHRpb24geworCQlvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0IGdldFJlc291cmNlSlNPTk9iamVjdCA9IG51bGw7CisJCVJlc3RSZXNwb25zZSByZXN0ID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHVzZXIuZ2V0VXNlcklkKCksIHNvdXJjZSwgIjEuMCIpOworCQlpZiAocmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpID09IDIwMCkgeworCQkJSlNPTkFycmF5IGpBcnJheSA9IG5ldyBKU09OQXJyYXkocmVzdC5nZXRSZXNwb25zZSgpKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgakFycmF5Lmxlbmd0aCgpOyBpKyspIHsKKwkJCQlnZXRSZXNvdXJjZUpTT05PYmplY3QgPSBqQXJyYXkuZ2V0SlNPTk9iamVjdChpKTsKKwkJCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gZ2V0UmVzb3VyY2VKU09OT2JqZWN0LmdldCgicmVzb3VyY2VUeXBlIikudG9TdHJpbmcoKTsKKwkJCQlpZiAoIXJlc291cmNlVHlwZS5lcXVhbHMoIlZGIikpIHsKKwkJCQkJcmVzdC5zZXRSZXNwb25zZShnZXRSZXNvdXJjZUpTT05PYmplY3QudG9TdHJpbmcoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN0OworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENhcGFiaWxpdGllcygpIHsKKwkJcmV0dXJuIGNhcGFiaWxpdGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXRpZXMoU3RyaW5nIHBhdGgsIFN0cmluZyBmaWxlTmFtZSwgVXNlciB1c2VyLCBTdHJpbmcgZGVyaXZlZEZyb21Tb3VyY2UpIHRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdGllc0Zyb21GaWxlID0gZ2V0Q2FwYWJpbGl0aWVzTWFwRnJvbUZpbGUocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUsCisJCQkJdG9zY2FSZXNvdXJjZU5hbWUsICJjYXBhYmlsaXRpZXMiKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXMgPSBvcmdhbml6ZUNhcGFiaWxpdGllc01hcChjYXBhYmlsaXRpZXNGcm9tRmlsZSk7CisJCWdldERlcml2ZWRSZXFDYXAodXNlciwgY2FwYWJpbGl0aWVzLCAiY2FwYWJpbGl0aWVzIiwgZGVyaXZlZEZyb21Tb3VyY2UpOworCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gb3JnYW5pemVDYXBhYmlsaXRpZXNNYXAoTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXNGcm9tRmlsZSkgeworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gY2FwYWJpbGl0aWVzRnJvbUZpbGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJTGlzdDxPYmplY3Q+IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJU3RyaW5nIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlc01hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBjYXBhYmlsaXRpZXNGcm9tRmlsZS5nZXQobmV4dCk7CisJCQlTdHJpbmcga2V5ID0gdmFsdWVzTWFwLnJlbW92ZSgidHlwZSIpLnRvU3RyaW5nKCk7CisJCQl2YWx1ZXNNYXAucHV0KCJuYW1lIiwgbmV4dCk7CisJCQl2YWx1ZXNNYXAucHV0KCJjYXBhYmlsaXR5U291cmNlcyIsIGRlcml2ZWRMaXN0KTsKKwkJCXZhbHVlc01hcC5wdXQoInR5cGUiLCBrZXkpOworCisJCQlpZiAoIXZhbHVlc01hcC5jb250YWluc0tleSgib2NjdXJyZW5jZXMiKSkgeworCQkJCXZhbHVlc01hcC5wdXQoIm1pbk9jY3VycmVuY2VzIiwgIjEiKTsKKwkJCQl2YWx1ZXNNYXAucHV0KCJtYXhPY2N1cnJlbmNlcyIsICJVTkJPVU5ERUQiKTsKKwkJCX0KKworCQkJT2JqZWN0IHRlbXBWYWx1ZSA9IGNhcE1hcC5nZXQoa2V5KTsKKwkJCWlmICh0ZW1wVmFsdWUgPT0gbnVsbCkgeworCQkJCXZhbHVlTGlzdC5hZGQodmFsdWVzTWFwKTsKKwkJCX0gZWxzZSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0VmFsdWUgPSBjb252ZXJ0TGlzdFRvTWFwKChMaXN0PE9iamVjdD4pIHRlbXBWYWx1ZSk7CisJCQkJdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KEFycmF5cy5hc0xpc3QoY29udmVydFZhbHVlLCB2YWx1ZXNNYXApKTsKKwkJCX0KKwkJCWNhcE1hcC5wdXQoa2V5LCB2YWx1ZUxpc3QpOworCQl9CisJCXJldHVybiBjYXBNYXA7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENhcGFiaWxpdGllc01hcEZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lLAorCQkJU3RyaW5nIGZpZWxkVG9UZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXNvdXJjZVRvc2NhTWFwID0gZ2V0VG9zY2FSZXNvdXJjZUZyb21GaWxlKGZpbGVOYW1lLCB0b3NjYVJlc291cmNlTmFtZSk7CisJCU9iamVjdCBjYXBNYXAgPSByZXNvdXJjZVRvc2NhTWFwLmdldChmaWVsZFRvVGVzdCk7CisJCWlmIChjYXBNYXAgPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQl9CisJCXJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0PikgY2FwTWFwOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBvcmdhbml6ZVJlcXVpcmVtZW50c01hcChNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50c0Zyb21GaWxlKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCUxpc3Q8T2JqZWN0PiB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHJlcXVpcmVtZW50c0Zyb21GaWxlLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBrZXkgPSBpdGVyYXRvci5uZXh0KCk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlc01hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSByZXF1aXJlbWVudHNGcm9tRmlsZS5nZXQoa2V5KTsKKwkJCXZhbHVlc01hcC5wdXQoIm5hbWUiLCBrZXkpOworCQkJU3RyaW5nIGNhcGFiaWxpdHkgPSB2YWx1ZXNNYXAuZ2V0KCJjYXBhYmlsaXR5IikudG9TdHJpbmcoKTsKKworCQkJTGlzdDxPYmplY3Q+IG9jY3VyZW5jZXNMaXN0ID0gKExpc3Q8T2JqZWN0PikgdmFsdWVzTWFwLnJlbW92ZSgib2NjdXJyZW5jZXMiKTsKKwkJCWlmIChvY2N1cmVuY2VzTGlzdCAhPSBudWxsKSB7CisJCQkJdmFsdWVzTWFwLnB1dCgibWluT2NjdXJyZW5jZXMiLCBvY2N1cmVuY2VzTGlzdC5nZXQoMCkudG9TdHJpbmcoKSk7CisJCQkJdmFsdWVzTWFwLnB1dCgibWF4T2NjdXJyZW5jZXMiLCBvY2N1cmVuY2VzTGlzdC5nZXQoMSkudG9TdHJpbmcoKSk7CisJCQl9CisKKwkJCXZhbHVlTGlzdC5hZGQodmFsdWVzTWFwKTsKKwkJCXJlcU1hcC5wdXQoY2FwYWJpbGl0eSwgdmFsdWVMaXN0KTsKKwkJfQorCisJCXJldHVybiByZXFNYXA7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFJlcXVpcmVtZW50c01hcEZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lLAorCQkJU3RyaW5nIGZpZWxkVG9UZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXNvdXJjZVRvc2NhTWFwID0gZ2V0VG9zY2FSZXNvdXJjZUZyb21GaWxlKGZpbGVOYW1lLCB0b3NjYVJlc291cmNlTmFtZSk7CisJCUxpc3Q8T2JqZWN0PiByZXFMaXN0RnJvbUZpbGUgPSAoTGlzdDxPYmplY3Q+KSByZXNvdXJjZVRvc2NhTWFwLmdldChmaWVsZFRvVGVzdCk7CisJCWlmIChyZXFMaXN0RnJvbUZpbGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQl9CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gdGVzdGVkTWFwRnJvbUZpbGUgPSBjb252ZXJ0TGlzdFRvTWFwKHJlcUxpc3RGcm9tRmlsZSk7CisJCXJldHVybiB0ZXN0ZWRNYXBGcm9tRmlsZTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0VG9zY2FSZXNvdXJjZUZyb21GaWxlKFN0cmluZyBmdWxsRmlsZU5hbWUsIFN0cmluZyB0b3NjYVJlc291cmNlTmFtZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5vZGVzVHlwZXNNYXAgPSBnZXROb2Rlc1R5cGVzTWFwRnJvbUZpbGUoZnVsbEZpbGVOYW1lKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXNvdXJjZVRvc2NhTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5vZGVzVHlwZXNNYXAuZ2V0KHRvc2NhUmVzb3VyY2VOYW1lKTsKKworCQlkZXJpdmVkRnJvbUZpZWxkID0gcmVzb3VyY2VUb3NjYU1hcC5nZXQoImRlcml2ZWRfZnJvbSIpLnRvU3RyaW5nKCk7CisKKwkJcmV0dXJuIHJlc291cmNlVG9zY2FNYXA7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE5vZGVzVHlwZXNNYXBGcm9tRmlsZShTdHJpbmcgZnVsbEZpbGVOYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJWWFtbCB5YW1sID0gbmV3IFlhbWwoKTsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZnVsbEZpbGVOYW1lKTsKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCQlNYXA8PywgPz4gbWFwRnJvbUZpbGUgPSAoTWFwPD8sID8+KSB5YW1sLmxvYWQoaW5wdXRTdHJlYW0pOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5vZGVzVHlwZXNNYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbWFwRnJvbUZpbGUuZ2V0KCJub2RlX3R5cGVzIik7CisJCXJldHVybiBub2Rlc1R5cGVzTWFwOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TGlzdFRvTWFwKExpc3Q8T2JqZWN0PiB0ZXN0ZWRMaXN0RnJvbUZpbGUpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiB0ZXN0ZWRNYXBGcm9tRmlsZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RlZExpc3RGcm9tRmlsZS5zaXplKCk7IGkrKykgeworCQkJT2JqZWN0IHJlcSA9IHRlc3RlZExpc3RGcm9tRmlsZS5nZXQoaSk7CisJCQlPYmplY3RNYXBwZXIgbSA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJCU1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgU3RyaW5nPiBtYXBwZWRPYmplY3QgPSBtLmNvbnZlcnRWYWx1ZShyZXEsIE1hcC5jbGFzcyk7CisJCQl0ZXN0ZWRNYXBGcm9tRmlsZS5wdXRBbGwobWFwcGVkT2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gdGVzdGVkTWFwRnJvbUZpbGU7CisJfQorCisJcHVibGljIHZvaWQgY29tcGFyZVJlcXVpcmVtZW50c09yQ2FwYWJpbGl0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gZXhlcGVjdGVkUmVxLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFjdHVhbFJlcSkgeworCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gZXhlcGVjdGVkUmVxLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBrZXkgPSBpdGVyYXRvci5uZXh0KCk7CisJCQlMaXN0PE9iamVjdD4gZXhwZWN0ZWRWYWx1ZXMgPSAoTGlzdDxPYmplY3Q+KSBleGVwZWN0ZWRSZXEuZ2V0KGtleSk7CisJCQlMaXN0PE9iamVjdD4gYWN0dWFsVmFsdWVzID0gKExpc3Q8T2JqZWN0PikgYWN0dWFsUmVxLmdldChrZXkpOworCQkJYXNzZXJ0Tm90TnVsbChhY3R1YWxWYWx1ZXMpOworCisJCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGV4cGVjdGVkTWFwc0xpc3QgPSBjb252ZXJ0TGlzdFRvTWFwTGlzdChleHBlY3RlZFZhbHVlcyk7CisJCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGFjdHVhbE1hcHNMaXN0ID0gY29udmVydExpc3RUb01hcExpc3QoYWN0dWFsVmFsdWVzKTsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZE1hcHNMaXN0LnNpemUoKSwgYWN0dWFsTWFwc0xpc3Quc2l6ZSgpKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZE1hcHNMaXN0LnNpemUoKTsgaSsrKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBleHBlY3RlZE1hcCA9IGV4cGVjdGVkTWFwc0xpc3QuZ2V0KGkpOworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gYWN0dWFsZE1hcCA9IGFjdHVhbE1hcHNMaXN0LmdldChpKTsKKwkJCQlpZiAoZXhwZWN0ZWRNYXAuZ2V0KCJuYW1lIikuZXF1YWxzKGFjdHVhbGRNYXAuZ2V0KCJuYW1lIikpKSB7CisJCQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IyID0gZXhwZWN0ZWRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCQkJd2hpbGUgKGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKKwkJCQkJCVN0cmluZyBpbm5lcktleSA9IGl0ZXJhdG9yMi5uZXh0KCk7CisJCQkJCQlhc3NlcnRUcnVlKAorCQkJCQkJCQkiY2hlY2sgIiArIGlubmVyS2V5ICsgIiBpbiAiICsga2V5ICsgIjpcbmV4cGVjdGVkOiAiCisJCQkJCQkJCQkJKyBleHBlY3RlZE1hcC5nZXQoaW5uZXJLZXkpLnRvU3RyaW5nKCkgKyAiXG5hY3R1YWw6ICIKKwkJCQkJCQkJCQkrIGFjdHVhbGRNYXAuZ2V0KGlubmVyS2V5KS50b1N0cmluZygpLAorCQkJCQkJCQlleHBlY3RlZE1hcC5nZXQoaW5uZXJLZXkpLmVxdWFscyhhY3R1YWxkTWFwLmdldChpbm5lcktleSkpKTsKKworCQkJCQl9CisKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gY29udmVydExpc3RUb01hcExpc3QoTGlzdDxPYmplY3Q+IHRlc3RlZExpc3RGcm9tRmlsZSkgeworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGxpc3RPZk1hcHMgPSBuZXcgQXJyYXlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdGVkTGlzdEZyb21GaWxlLnNpemUoKTsgaSsrKSB7CisJCQlPYmplY3QgcmVxID0gdGVzdGVkTGlzdEZyb21GaWxlLmdldChpKTsKKwkJCU9iamVjdE1hcHBlciBtID0gbmV3IE9iamVjdE1hcHBlcigpOworCQkJTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBTdHJpbmc+IG1hcHBlZE9iamVjdCA9IG0uY29udmVydFZhbHVlKHJlcSwgTWFwLmNsYXNzKTsKKwkJCW1hcHBlZE9iamVjdC5yZW1vdmUoInVuaXF1ZUlkIik7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRlc3RlZE1hcEZyb21GaWxlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQl0ZXN0ZWRNYXBGcm9tRmlsZS5wdXRBbGwobWFwcGVkT2JqZWN0KTsKKwkJCWxpc3RPZk1hcHMuYWRkKHRlc3RlZE1hcEZyb21GaWxlKTsKKwkJfQorCQlyZXR1cm4gbGlzdE9mTWFwczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvUHJvZHVjdFJlcURldGFpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvUHJvZHVjdFJlcURldGFpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQ4NGUyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Qcm9kdWN0UmVxRGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgUHJvZHVjdFJlcURldGFpbHMgZXh0ZW5kcyBDb21wb25lbnRSZXFEZXRhaWxzIHsKKworCXByaXZhdGUgU3RyaW5nIGZ1bGxOYW1lOworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbnRhY3RzOworCXByaXZhdGUgU3RyaW5nIGlzQWN0aXZlOworCisJcHVibGljIFByb2R1Y3RSZXFEZXRhaWxzKFN0cmluZyBuYW1lLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnkpIHsKKwkJdGhpcy5jYXRlZ29yaWVzID0gY2F0ZWdvcnk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFByb2R1Y3RSZXFEZXRhaWxzKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnkoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5KSB7CisJCWlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKKwkJCWNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJfQorCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkQ29udGFjdChTdHJpbmcgY29udGFjdFVzZXJJZCkgeworCQlpZiAoY29udGFjdHMgPT0gbnVsbCkgeworCQkJY29udGFjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJfQorCQljb250YWN0cy5hZGQoY29udGFjdFVzZXJJZCk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb250YWN0cygpIHsKKwkJcmV0dXJuIGNvbnRhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnRhY3RzKExpc3Q8U3RyaW5nPiBjb250YWN0cykgeworCQl0aGlzLmNvbnRhY3RzID0gY29udGFjdHM7CisJfQorCisJcHVibGljIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBnZXRDYXRlZ29yaWVzKCkgeworCQlyZXR1cm4gY2F0ZWdvcmllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yaWVzKExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzKSB7CisJCXRoaXMuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKKwkJcmV0dXJuIGZ1bGxOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZ1bGxOYW1lKFN0cmluZyBmdWxsTmFtZSkgeworCQl0aGlzLmZ1bGxOYW1lID0gZnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3RpdmUoKSB7CisJCXJldHVybiBpc0FjdGl2ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmUoU3RyaW5nIGlzQWN0aXZlKSB7CisJCXRoaXMuaXNBY3RpdmUgPSBpc0FjdGl2ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Byb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Byb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3MWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvUHJvcGVydHlIZWF0TWV0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlIZWF0TWV0YURlZmluaXRpb24geworCisJU3RyaW5nIG5hbWU7CisJYm9vbGVhbiB2YWx1ZTsKKworCXB1YmxpYyBQcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJQcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbiBbbmFtZT0iICsgbmFtZSArICIsIHZhbHVlPSIgKyB2YWx1ZSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvUHJvcGVydHlSZXFEZXRhaWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Byb3BlcnR5UmVxRGV0YWlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOGU0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Byb3BlcnR5UmVxRGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVJlcURldGFpbHMgeworCVN0cmluZyBuYW1lOworCVN0cmluZyB0eXBlOworCUJvb2xlYW4gcmVxdWlyZWQgPSBmYWxzZTsKKwlTdHJpbmcgZGVmYXVsdFZhbHVlOworCVN0cmluZyBkZXNjcmlwdGlvbjsKKwlTdHJpbmcgcHJvcGVydHlSYW5nZU1pbjsKKwlTdHJpbmcgcHJvcGVydHlSYW5nZU1heDsKKwlCb29sZWFuIGlzUGFzc3dvcmQgPSBmYWxzZTsKKwlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYTsKKworCXB1YmxpYyBQcm9wZXJ0eVJlcURldGFpbHMoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFByb3BlcnR5UmVxRGV0YWlscyhTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlUeXBlLCBCb29sZWFuIHByb3BlcnR5UmVxdWlyZWQsCisJCQlTdHJpbmcgcHJvcGVydHlEZWZhdWx0VmFsdWUsIFN0cmluZyBwcm9wZXJ0eURlc2NyaXB0aW9uLCBTdHJpbmcgcHJvcGVydHlSYW5nZU1pbiwgU3RyaW5nIHByb3BlcnR5UmFuZ2VNYXgsCisJCQlCb29sZWFuIHByb3BlcnR5UGFzc3dvcmQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5uYW1lID0gcHJvcGVydHlOYW1lOworCQl0aGlzLnR5cGUgPSBwcm9wZXJ0eVR5cGU7CisJCXRoaXMucmVxdWlyZWQgPSBwcm9wZXJ0eVJlcXVpcmVkOworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5RGVmYXVsdFZhbHVlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gcHJvcGVydHlEZXNjcmlwdGlvbjsKKwkJdGhpcy5wcm9wZXJ0eVJhbmdlTWluID0gcHJvcGVydHlSYW5nZU1pbjsKKwkJdGhpcy5wcm9wZXJ0eVJhbmdlTWF4ID0gcHJvcGVydHlSYW5nZU1heDsKKwkJdGhpcy5pc1Bhc3N3b3JkID0gcHJvcGVydHlQYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlSZXFEZXRhaWxzKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVR5cGUsIFN0cmluZyBwcm9wZXJ0eURlZmF1bHRWYWx1ZSwKKwkJCVN0cmluZyBwcm9wZXJ0eURlc2NyaXB0aW9uLCBTY2hlbWFEZWZpbml0aW9uIHNjaGVtYSkgeworCQlzdXBlcigpOworCQl0aGlzLm5hbWUgPSBwcm9wZXJ0eU5hbWU7CisJCXRoaXMudHlwZSA9IHByb3BlcnR5VHlwZTsKKwkJdGhpcy5kZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eURlZmF1bHRWYWx1ZTsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BlcnR5RGVzY3JpcHRpb247CisJCXRoaXMuc2NoZW1hID0gc2NoZW1hOworCX0KKworCXB1YmxpYyBTY2hlbWFEZWZpbml0aW9uIGdldFNjaGVtYSgpIHsKKwkJcmV0dXJuIHNjaGVtYTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWEpIHsKKwkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJdGhpcy5uYW1lID0gcHJvcGVydHlOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVR5cGUoU3RyaW5nIHByb3BlcnR5VHlwZSkgeworCQl0aGlzLnR5cGUgPSBwcm9wZXJ0eVR5cGU7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0UHJvcGVydHlSZXF1aXJlZCgpIHsKKwkJcmV0dXJuIHJlcXVpcmVkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5UmVxdWlyZWQoQm9vbGVhbiBwcm9wZXJ0eVJlcXVpcmVkKSB7CisJCXRoaXMucmVxdWlyZWQgPSBwcm9wZXJ0eVJlcXVpcmVkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoKSB7CisJCXJldHVybiBkZWZhdWx0VmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoU3RyaW5nIHByb3BlcnR5RGVmYXVsdFZhbHVlKSB7CisJCXRoaXMuZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEZWZhdWx0VmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHlEZXNjcmlwdGlvbihTdHJpbmcgcHJvcGVydHlEZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gcHJvcGVydHlEZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5UmFuZ2VNaW4oKSB7CisJCXJldHVybiBwcm9wZXJ0eVJhbmdlTWluOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5UmFuZ2VNaW4oU3RyaW5nIHByb3BlcnR5UmFuZ2VNaW4pIHsKKwkJdGhpcy5wcm9wZXJ0eVJhbmdlTWluID0gcHJvcGVydHlSYW5nZU1pbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5UmFuZ2VNYXgoKSB7CisJCXJldHVybiBwcm9wZXJ0eVJhbmdlTWF4OworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5UmFuZ2VNYXgoU3RyaW5nIHByb3BlcnR5UmFuZ2VNYXgpIHsKKwkJdGhpcy5wcm9wZXJ0eVJhbmdlTWF4ID0gcHJvcGVydHlSYW5nZU1heDsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRQcm9wZXJ0eVBhc3N3b3JkKCkgeworCQlyZXR1cm4gaXNQYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVBhc3N3b3JkKEJvb2xlYW4gcHJvcGVydHlQYXNzd29yZCkgeworCQl0aGlzLmlzUGFzc3dvcmQgPSBwcm9wZXJ0eVBhc3N3b3JkOworCX0KKworCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlUb0pzb25TdHJpbmcoKSB7CisJCVN0cmluZyBqc29uU3RyaW5nOworCQlqc29uU3RyaW5nID0gIntcIiIgKyB0aGlzLmdldE5hbWUoKSArICJcIjp7IiArICJcInR5cGVcIjpcIiIgKyB0aGlzLmdldFByb3BlcnR5VHlwZSgpICsgIlwiLCIgKyAiXCJyZXF1aXJlZFwiOiIKKwkJCQkrIHRoaXMuZ2V0UHJvcGVydHlSZXF1aXJlZCgpICsgIiwiICsgIlwiZGVmYXVsdFZhbHVlXCI6XCIiICsgdGhpcy5nZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgpICsgIlwiLCIKKwkJCQkrICJcImRlc2NyaXB0aW9uXCI6XCIiICsgdGhpcy5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkgKyAiXCIsIiArICJcImNvbnN0cmFpbnRzXCI6W3tcImluUmFuZ2VcIjpbXCIiCisJCQkJKyB0aGlzLmdldFByb3BlcnR5UmFuZ2VNaW4oKSArICJcIixcIiIgKyB0aGlzLmdldFByb3BlcnR5UmFuZ2VNYXgoKSArICJcIl19XSwiICsgIlwiaXNQYXNzd29yZFwiOiIKKwkJCQkrIHRoaXMuZ2V0UHJvcGVydHlQYXNzd29yZCgpICsgIn19IjsKKwkJcmV0dXJuIGpzb25TdHJpbmc7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZUFzc2V0U3RydWN0dXJlLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlQXNzZXRTdHJ1Y3R1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDI5ZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZUFzc2V0U3RydWN0dXJlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGNsYXNzIFJlc291cmNlQXNzZXRTdHJ1Y3R1cmUgZXh0ZW5kcyBBc3NldFN0cnVjdHVyZSB7CisKKwlwcml2YXRlIFN0cmluZyBzdWJDYXRlZ29yeTsKKwlwcml2YXRlIFN0cmluZyByZXNvdXJjZVR5cGU7CisKKwlwdWJsaWMgUmVzb3VyY2VBc3NldFN0cnVjdHVyZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VBc3NldFN0cnVjdHVyZShTdHJpbmcgdXVpZCwgU3RyaW5nIGludmFyaWFudFVVSUQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHRvc2NhTW9kZWxVUkwsCisJCQlTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBsaWZlY3ljbGVTdGF0ZSwgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkKSB7CisJCXN1cGVyKHV1aWQsIGludmFyaWFudFVVSUQsIG5hbWUsIHZlcnNpb24sIHRvc2NhTW9kZWxVUkwsIGNhdGVnb3J5LCBsaWZlY3ljbGVTdGF0ZSwgbGFzdFVwZGF0ZXJVc2VySWQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUmVzb3VyY2VBc3NldFN0cnVjdHVyZSBbc3ViQ2F0ZWdvcnk9IiArIHN1YkNhdGVnb3J5ICsgIiwgcmVzb3VyY2VUeXBlPSIgKyByZXNvdXJjZVR5cGUgKyAiXSI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdWJDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIHN1YkNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFN1YkNhdGVnb3J5KFN0cmluZyBzdWJDYXRlZ29yeSkgeworCQl0aGlzLnN1YkNhdGVnb3J5ID0gc3ViQ2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzczNDNmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgZXh0ZW5kcyBSZXNvdXJjZUFzc2V0U3RydWN0dXJlIHsKKworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWU7CisJcHJpdmF0ZSBMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VzOworCXByaXZhdGUgTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHM7CisKKwlwdWJsaWMgUmVzb3VyY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUoU3RyaW5nIGxhc3RVcGRhdGVyRnVsbE5hbWUsIFN0cmluZyB0b3NjYVJlc291cmNlTmFtZSwKKwkJCUxpc3Q8UmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlPiByZXNvdXJjZXMsIExpc3Q8QXJ0aWZhY3RBc3NldFN0cnVjdHVyZT4gYXJ0aWZhY3RzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJCXRoaXMudG9zY2FSZXNvdXJjZU5hbWUgPSB0b3NjYVJlc291cmNlTmFtZTsKKwkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShTdHJpbmcgbGFzdFVwZGF0ZXJGdWxsTmFtZSkgeworCQl0aGlzLmxhc3RVcGRhdGVyRnVsbE5hbWUgPSBsYXN0VXBkYXRlckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSB7CisJCXJldHVybiB0b3NjYVJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYVJlc291cmNlTmFtZShTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWUpIHsKKwkJdGhpcy50b3NjYVJlc291cmNlTmFtZSA9IHRvc2NhUmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyBMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4gZ2V0UmVzb3VyY2VzKCkgeworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlcyhMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VzKSB7CisJCXRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCX0KKworCXB1YmxpYyBMaXN0PEFydGlmYWN0QXNzZXRTdHJ1Y3R1cmU+IGdldEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHMoTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgW2xhc3RVcGRhdGVyRnVsbE5hbWU9IiArIGxhc3RVcGRhdGVyRnVsbE5hbWUgKyAiLCB0b3NjYVJlc291cmNlTmFtZT0iCisJCQkJKyB0b3NjYVJlc291cmNlTmFtZSArICIsIHJlc291cmNlcz0iICsgcmVzb3VyY2VzICsgIiwgYXJ0aWZhY3RzPSIgKyBhcnRpZmFjdHMgKyAiLCB0b1N0cmluZygpPSIKKwkJCQkrIHN1cGVyLnRvU3RyaW5nKCkgKyAiLCBnZXRTdWJDYXRlZ29yeSgpPSIgKyBnZXRTdWJDYXRlZ29yeSgpICsgIiwgZ2V0UmVzb3VyY2VUeXBlKCk9IgorCQkJCSsgZ2V0UmVzb3VyY2VUeXBlKCkgKyAiLCBnZXRVdWlkKCk9IiArIGdldFV1aWQoKSArICIsIGdldEludmFyaWFudFVVSUQoKT0iICsgZ2V0SW52YXJpYW50VVVJRCgpCisJCQkJKyAiLCBnZXROYW1lKCk9IiArIGdldE5hbWUoKSArICIsIGdldFZlcnNpb24oKT0iICsgZ2V0VmVyc2lvbigpICsgIiwgZ2V0VG9zY2FNb2RlbFVSTCgpPSIKKwkJCQkrIGdldFRvc2NhTW9kZWxVUkwoKSArICIsIGdldENhdGVnb3J5KCk9IiArIGdldENhdGVnb3J5KCkgKyAiLCBnZXRMaWZlY3ljbGVTdGF0ZSgpPSIKKwkJCQkrIGdldExpZmVjeWNsZVN0YXRlKCkgKyAiLCBnZXRMYXN0VXBkYXRlclVzZXJJZCgpPSIgKyBnZXRMYXN0VXBkYXRlclVzZXJJZCgpICsgIiwgZ2V0Q2xhc3MoKT0iCisJCQkJKyBnZXRDbGFzcygpICsgIiwgaGFzaENvZGUoKT0iICsgaGFzaENvZGUoKSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvUmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjkxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUgeworCisJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lOworCVN0cmluZyByZXNvdXJjZU5hbWU7CisJU3RyaW5nIHJlc291cmNlSW52YXJpYW50VVVJRDsKKwlTdHJpbmcgcmVzb3VyY2VWZXJzaW9uOworCVN0cmluZyByZXNvdWNyZVR5cGU7CisJU3RyaW5nIHJlc291cmNlVVVJRDsKKwlMaXN0PEFydGlmYWN0QXNzZXRTdHJ1Y3R1cmU+IGFydGlmYWN0czsKKworCXB1YmxpYyBSZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIFN0cmluZyByZXNvdXJjZU5hbWUsCisJCQlTdHJpbmcgcmVzb3VyY2VJbnZhcmlhbnRVVUlELCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLCBTdHJpbmcgcmVzb3VjcmVUeXBlLCBTdHJpbmcgcmVzb3VyY2VVVUlELAorCQkJTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5yZXNvdXJjZUluc3RhbmNlTmFtZSA9IHJlc291cmNlSW5zdGFuY2VOYW1lOworCQl0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKKwkJdGhpcy5yZXNvdXJjZUludmFyaWFudFVVSUQgPSByZXNvdXJjZUludmFyaWFudFVVSUQ7CisJCXRoaXMucmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VWZXJzaW9uOworCQl0aGlzLnJlc291Y3JlVHlwZSA9IHJlc291Y3JlVHlwZTsKKwkJdGhpcy5yZXNvdXJjZVVVSUQgPSByZXNvdXJjZVVVSUQ7CisJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VJbnN0YW5jZU5hbWUoKSB7CisJCXJldHVybiByZXNvdXJjZUluc3RhbmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUluc3RhbmNlTmFtZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUpIHsKKwkJdGhpcy5yZXNvdXJjZUluc3RhbmNlTmFtZSA9IHJlc291cmNlSW5zdGFuY2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VJbnZhcmlhbnRVVUlEKCkgeworCQlyZXR1cm4gcmVzb3VyY2VJbnZhcmlhbnRVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlSW52YXJpYW50VVVJRChTdHJpbmcgcmVzb3VyY2VJbnZhcmlhbnRVVUlEKSB7CisJCXRoaXMucmVzb3VyY2VJbnZhcmlhbnRVVUlEID0gcmVzb3VyY2VJbnZhcmlhbnRVVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VWZXJzaW9uKCkgeworCQlyZXR1cm4gcmVzb3VyY2VWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVmVyc2lvbihTdHJpbmcgcmVzb3VyY2VWZXJzaW9uKSB7CisJCXRoaXMucmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VjcmVUeXBlKCkgeworCQlyZXR1cm4gcmVzb3VjcmVUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291Y3JlVHlwZShTdHJpbmcgcmVzb3VjcmVUeXBlKSB7CisJCXRoaXMucmVzb3VjcmVUeXBlID0gcmVzb3VjcmVUeXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVVUlEKCkgeworCQlyZXR1cm4gcmVzb3VyY2VVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVVVJRChTdHJpbmcgcmVzb3VyY2VVVUlEKSB7CisJCXRoaXMucmVzb3VyY2VVVUlEID0gcmVzb3VyY2VVVUlEOworCX0KKworCXB1YmxpYyBMaXN0PEFydGlmYWN0QXNzZXRTdHJ1Y3R1cmU+IGdldEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHMoTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUgW3Jlc291cmNlSW5zdGFuY2VOYW1lPSIgKyByZXNvdXJjZUluc3RhbmNlTmFtZSArICIsIHJlc291cmNlTmFtZT0iCisJCQkJKyByZXNvdXJjZU5hbWUgKyAiLCByZXNvdXJjZUludmFyaWFudFVVSUQ9IiArIHJlc291cmNlSW52YXJpYW50VVVJRCArICIsIHJlc291cmNlVmVyc2lvbj0iCisJCQkJKyByZXNvdXJjZVZlcnNpb24gKyAiLCByZXNvdWNyZVR5cGU9IiArIHJlc291Y3JlVHlwZSArICIsIHJlc291cmNlVVVJRD0iICsgcmVzb3VyY2VVVUlEICsgIiwgYXJ0aWZhY3RzPSIKKwkJCQkrIGFydGlmYWN0cyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvUmVzb3VyY2VSZXFEZXRhaWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlUmVxRGV0YWlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NTZlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlUmVxRGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKKworcHVibGljIGNsYXNzIFJlc291cmNlUmVxRGV0YWlscyBleHRlbmRzIENvbXBvbmVudFJlcURldGFpbHMgeworCUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbTsKKwlTdHJpbmcgdmVuZG9yTmFtZTsKKwlTdHJpbmcgdmVuZG9yUmVsZWFzZTsKKworCS8vIFVuc2V0dGFibGUvdW51cGRhdGFibGUgZmllbGRzCisKKwlCb29sZWFuIGlzQWJzdHJhY3Q7CisJQm9vbGVhbiBpc0hpZ2hlc3RWZXJzaW9uOworCVN0cmluZyBjb3N0OworCVN0cmluZyBsaWNlbnNlVHlwZTsKKwlTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWU7CisKKwlwcml2YXRlIFN0cmluZyByZXNvdXJjZVR5cGUgPSBSZXNvdXJjZVR5cGVFbnVtLlZGQy50b1N0cmluZygpOyAvLyBEZWZhdWx0CisJCQkJCQkJCQkJCQkJCQkJCS8vIHZhbHVlCisKKwlwdWJsaWMgUmVzb3VyY2VSZXFEZXRhaWxzKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZVJlcURldGFpbHMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKS50b1N0cmluZygpOworCQl0aGlzLm5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisJCXRoaXMuZGVzY3JpcHRpb24gPSByZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpOworCQl0aGlzLnRhZ3MgPSByZXNvdXJjZS5nZXRUYWdzKCk7CisJCS8vIHRoaXMuY2F0ZWdvcnkgPSByZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCk7CisJCXRoaXMuZGVyaXZlZEZyb20gPSByZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpOworCQl0aGlzLnZlbmRvck5hbWUgPSByZXNvdXJjZS5nZXRWZW5kb3JOYW1lKCk7CisJCXRoaXMudmVuZG9yUmVsZWFzZSA9IHJlc291cmNlLmdldFZlbmRvclJlbGVhc2UoKTsKKwkJdGhpcy5jb250YWN0SWQgPSByZXNvdXJjZS5nZXRDb250YWN0SWQoKTsKKwkJdGhpcy5pY29uID0gcmVzb3VyY2UuZ2V0SWNvbigpOworCQl0aGlzLnRvc2NhUmVzb3VyY2VOYW1lID0gcmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKTsKKwkJdGhpcy51bmlxdWVJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCXRoaXMuY3JlYXRvclVzZXJJZCA9IHJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKTsKKwkJdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSByZXNvdXJjZS5nZXRDcmVhdG9yRnVsbE5hbWUoKTsKKwkJdGhpcy5sYXN0VXBkYXRlclVzZXJJZCA9IHJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCk7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IHJlc291cmNlLmdldExhc3RVcGRhdGVyRnVsbE5hbWUoKTsKKwkJdGhpcy5saWZlY3ljbGVTdGF0ZSA9IHJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCk7CisJCXRoaXMudmVyc2lvbiA9IHJlc291cmNlLmdldFZlcnNpb24oKTsKKwkJdGhpcy5VVUlEID0gcmVzb3VyY2UuZ2V0VVVJRCgpOworCQl0aGlzLmNhdGVnb3JpZXMgPSByZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCk7CisJCXRoaXMuaW1wb3J0ZWRUb3NjYUNoZWNrc3VtID0gcmVzb3VyY2UuZ2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKCk7CisKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VSZXFEZXRhaWxzKFN0cmluZyByZXNvdXJjZU5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgTGlzdDxTdHJpbmc+IHRhZ3MsIFN0cmluZyBjYXRlZ29yeSwKKwkJCUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSwgU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZW5kb3JSZWxlYXNlLCBTdHJpbmcgY29udGFjdElkLCBTdHJpbmcgaWNvbikgeworCQl0aGlzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHRhZ3MsIGNhdGVnb3J5LCBkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uLAorCQkJCVJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOworCX0KKworCS8vIG5ldworCXB1YmxpYyBSZXNvdXJjZVJlcURldGFpbHMoU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBMaXN0PFN0cmluZz4gdGFncywgU3RyaW5nIGNhdGVnb3J5LAorCQkJTGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tLCBTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlbmRvclJlbGVhc2UsIFN0cmluZyBjb250YWN0SWQsIFN0cmluZyBpY29uLAorCQkJU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQlzdXBlcigpOworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwkJdGhpcy5uYW1lID0gcmVzb3VyY2VOYW1lOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCXRoaXMudGFncyA9IHRhZ3M7CisJCS8vIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkJdGhpcy5kZXJpdmVkRnJvbSA9IGRlcml2ZWRGcm9tOworCQl0aGlzLnZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOworCQl0aGlzLnZlbmRvclJlbGVhc2UgPSB2ZW5kb3JSZWxlYXNlOworCQl0aGlzLmNvbnRhY3RJZCA9IGNvbnRhY3RJZDsKKwkJdGhpcy5pY29uID0gaWNvbjsKKwkJaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKKwkJCVN0cmluZ1tdIGFyciA9IGNhdGVnb3J5LnNwbGl0KCIvIik7CisJCQlpZiAoYXJyLmxlbmd0aCA9PSAyKSB7CisJCQkJYWRkQ2F0ZWdvcnlDaGFpbihhcnJbMF0sIGFyclsxXSk7CisJCQl9CisJCX0KKwkJdGhpcy50b3NjYVJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VSZXFEZXRhaWxzKFJlc291cmNlUmVxRGV0YWlscyBvcmlnaW5hbFJlc291cmNlLCBTdHJpbmcgdmVyc2lvbikgeworCQlzdXBlcigpOworCQl0aGlzLm5hbWUgPSBvcmlnaW5hbFJlc291cmNlLmdldE5hbWUoKTsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IG9yaWdpbmFsUmVzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKTsKKwkJdGhpcy50YWdzID0gb3JpZ2luYWxSZXNvdXJjZS5nZXRUYWdzKCk7CisJCS8vIHRoaXMuY2F0ZWdvcnkgPSBvcmlnaW5hbFJlc291cmNlLmdldENhdGVnb3J5KCk7CisJCXRoaXMuZGVyaXZlZEZyb20gPSBvcmlnaW5hbFJlc291cmNlLmdldERlcml2ZWRGcm9tKCk7CisJCXRoaXMudmVuZG9yTmFtZSA9IG9yaWdpbmFsUmVzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpOworCQl0aGlzLnZlbmRvclJlbGVhc2UgPSBvcmlnaW5hbFJlc291cmNlLmdldFZlbmRvclJlbGVhc2UoKTsKKwkJdGhpcy5jb250YWN0SWQgPSBvcmlnaW5hbFJlc291cmNlLmdldENvbnRhY3RJZCgpOworCQl0aGlzLmljb24gPSBvcmlnaW5hbFJlc291cmNlLmdldEljb24oKTsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwkJdGhpcy51bmlxdWVJZCA9IG9yaWdpbmFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJdGhpcy5jYXRlZ29yaWVzID0gb3JpZ2luYWxSZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCk7CisJCXRoaXMudG9zY2FSZXNvdXJjZU5hbWUgPSBvcmlnaW5hbFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCk7CisJCXRoaXMucmVzb3VyY2VUeXBlID0gb3JpZ2luYWxSZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VSZXFEZXRhaWxzKFN0cmluZyByZXNvdXJjZU5hbWUsIExpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSwgU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZW5kb3JSZWxlYXNlLAorCQkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgQm9vbGVhbiBpc0Fic3RyYWN0LCBCb29sZWFuIGlzSGlnaGVzdFZlcnNpb24sIFN0cmluZyBjb3N0LCBTdHJpbmcgbGljZW5zZVR5cGUsCisJCQlTdHJpbmcgcmVzb3VyY2VUeXBlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubmFtZSA9IHJlc291cmNlTmFtZTsKKwkJdGhpcy5kZXJpdmVkRnJvbSA9IGRlcml2ZWRGcm9tOworCQl0aGlzLnZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOworCQl0aGlzLnZlbmRvclJlbGVhc2UgPSB2ZW5kb3JSZWxlYXNlOworCQl0aGlzLnZlcnNpb24gPSByZXNvdXJjZVZlcnNpb247CisJCXRoaXMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CisJCXRoaXMuaXNIaWdoZXN0VmVyc2lvbiA9IGlzSGlnaGVzdFZlcnNpb247CisJCXRoaXMuY29zdCA9IGNvc3Q7CisJCXRoaXMubGljZW5zZVR5cGUgPSBsaWNlbnNlVHlwZTsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJCXRoaXMudG9zY2FSZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3NjYVJlc291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIHRvc2NhUmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvc2NhUmVzb3VyY2VOYW1lKFN0cmluZyB0b3NjYVJlc291cmNlTmFtZSkgeworCQl0aGlzLnRvc2NhUmVzb3VyY2VOYW1lID0gdG9zY2FSZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXREZXJpdmVkRnJvbSgpIHsKKwkJcmV0dXJuIGRlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcml2ZWRGcm9tKExpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSkgeworCQl0aGlzLmRlcml2ZWRGcm9tID0gZGVyaXZlZEZyb207CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gdmVuZG9yTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZyB2ZW5kb3JOYW1lKSB7CisJCXRoaXMudmVuZG9yTmFtZSA9IHZlbmRvck5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZW5kb3JSZWxlYXNlKCkgeworCQlyZXR1cm4gdmVuZG9yUmVsZWFzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JSZWxlYXNlKFN0cmluZyB2ZW5kb3JSZWxlYXNlKSB7CisJCXRoaXMudmVuZG9yUmVsZWFzZSA9IHZlbmRvclJlbGVhc2U7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb3N0KCkgeworCQlyZXR1cm4gY29zdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb3N0KFN0cmluZyBjb3N0KSB7CisJCXRoaXMuY29zdCA9IGNvc3Q7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMaWNlbnNlVHlwZSgpIHsKKwkJcmV0dXJuIGxpY2Vuc2VUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpY2Vuc2VUeXBlKFN0cmluZyBsaWNlbnNlVHlwZSkgeworCQl0aGlzLmxpY2Vuc2VUeXBlID0gbGljZW5zZVR5cGU7CisJfQorCisJLy8gVW51cGRhdGFibGUgZmllbGRzIC0gdG8gY2hlY2sgdGhhdCB0aGV5IGFyZSBub3QgdXBkYXRlZAorCXB1YmxpYyB2b2lkIHNldElzQWJzdHJhY3QoQm9vbGVhbiBpc0Fic3RyYWN0KSB7CisJCXRoaXMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0SXNIaWdoZXN0VmVyc2lvbihCb29sZWFuIGlzSGlnaGVzdFZlcnNpb24pIHsKKwkJdGhpcy5pc0hpZ2hlc3RWZXJzaW9uID0gaXNIaWdoZXN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRJc0Fic3RyYWN0KCkgeworCQlyZXR1cm4gaXNBYnN0cmFjdDsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRJc0hpZ2hlc3RWZXJzaW9uKCkgeworCQlyZXR1cm4gaXNIaWdoZXN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlc291cmNlUmVxRGV0YWlscyBbbmFtZT0iICsgbmFtZSArICIsIGRlcml2ZWRGcm9tPSIgKyBkZXJpdmVkRnJvbSArICIsIHZlbmRvck5hbWU9IiArIHZlbmRvck5hbWUKKwkJCQkrICIsIHZlbmRvclJlbGVhc2U9IiArIHZlbmRvclJlbGVhc2UgKyAiLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uICsgIiwgaXNBYnN0cmFjdD0iICsgaXNBYnN0cmFjdAorCQkJCSsgIiwgaXNIaWdoZXN0VmVyc2lvbj0iICsgaXNIaWdoZXN0VmVyc2lvbiArICIsIGNvc3Q9IiArIGNvc3QgKyAiLCBsaWNlbnNlVHlwZT0iICsgbGljZW5zZVR5cGUKKwkJCQkrICIsIHJlc291cmNlVHlwZT0iICsgcmVzb3VyY2VUeXBlICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlUmVzcEphdmFPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQ3M2FiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmphdmEKQEAgLTAsMCArMSwzMzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIFJlc291cmNlUmVzcEphdmFPYmplY3QgeworCVN0cmluZyB1bmlxdWVJZDsKKwlTdHJpbmcgbmFtZTsKKwlTdHJpbmcgdmVyc2lvbjsKKwlTdHJpbmcgY3JlYXRvclVzZXJJZDsKKwlTdHJpbmcgY3JlYXRvckZ1bGxOYW1lOworCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZDsKKwlTdHJpbmcgbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwlTdHJpbmcgZGVzY3JpcHRpb247CisJU3RyaW5nIGljb247CisJTGlzdDxTdHJpbmc+IHRhZ3M7CisJU3RyaW5nIGlzSGlnaGVzdFZlcnNpb247CisJU3RyaW5nIGNyZWF0aW9uRGF0ZTsKKwlTdHJpbmcgbGFzdFVwZGF0ZURhdGU7CisJLy8gU3RyaW5nIGNhdGVnb3J5OworCVN0cmluZyBsaWZlY3ljbGVTdGF0ZTsKKwlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb207CisJU3RyaW5nIHZlbmRvck5hbWU7CisJU3RyaW5nIHZlbmRvclJlbGVhc2U7CisJU3RyaW5nIGNvbnRhY3RJZDsKKwlTdHJpbmcgYWJzdHJhY3R0OworCVN0cmluZyBoaWdoZXN0VmVyc2lvbjsKKwlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzOworCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzOworCVN0cmluZyB1dWlkOworCVN0cmluZyBjb3N0OworCVN0cmluZyBsaWNlbnNlVHlwZTsKKwlTdHJpbmcgcmVzb3VyY2VUeXBlOworCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzOworCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIFJlc291cmNlUmVzcEphdmFPYmplY3QoU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLCBTdHJpbmcgY3JlYXRvclVzZXJJZCwKKwkJCVN0cmluZyBjcmVhdG9yRnVsbE5hbWUsIFN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCwgU3RyaW5nIGxhc3RVcGRhdGVyRnVsbE5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwKKwkJCVN0cmluZyBpY29uLCBMaXN0PFN0cmluZz4gdGFncywgU3RyaW5nIGlzSGlnaGVzdFZlcnNpb24sIFN0cmluZyBjcmVhdGlvbkRhdGUsIFN0cmluZyBsYXN0VXBkYXRlRGF0ZSwKKwkJCVN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIGxpZmVjeWNsZVN0YXRlLCBMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20sIFN0cmluZyB2ZW5kb3JOYW1lLCBTdHJpbmcgdmVuZG9yUmVsZWFzZSwKKwkJCVN0cmluZyBjb250YWN0SWQsIFN0cmluZyBhYnN0cmFjdHQsIFN0cmluZyBoaWdoZXN0VmVyc2lvbiwgTGlzdDxTdHJpbmc+IGFydGlmYWN0cywgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMsCisJCQlTdHJpbmcgdXVpZCwgU3RyaW5nIGNvc3QsIFN0cmluZyBsaWNlbnNlVHlwZSwgU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQlzdXBlcigpOworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJCXRoaXMubmFtZSA9IHJlc291cmNlTmFtZTsKKwkJdGhpcy52ZXJzaW9uID0gcmVzb3VyY2VWZXJzaW9uOworCQl0aGlzLmNyZWF0b3JVc2VySWQgPSBjcmVhdG9yVXNlcklkOworCQl0aGlzLmNyZWF0b3JGdWxsTmFtZSA9IGNyZWF0b3JGdWxsTmFtZTsKKwkJdGhpcy5sYXN0VXBkYXRlclVzZXJJZCA9IGxhc3RVcGRhdGVyVXNlcklkOworCQl0aGlzLmxhc3RVcGRhdGVyRnVsbE5hbWUgPSBsYXN0VXBkYXRlckZ1bGxOYW1lOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCXRoaXMuaWNvbiA9IGljb247CisJCXRoaXMudGFncyA9IHRhZ3M7CisJCXRoaXMuaXNIaWdoZXN0VmVyc2lvbiA9IGlzSGlnaGVzdFZlcnNpb247CisJCXRoaXMuY3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOworCQl0aGlzLmxhc3RVcGRhdGVEYXRlID0gbGFzdFVwZGF0ZURhdGU7CisJCS8vIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkJdGhpcy5saWZlY3ljbGVTdGF0ZSA9IGxpZmVjeWNsZVN0YXRlOworCQl0aGlzLmRlcml2ZWRGcm9tID0gZGVyaXZlZEZyb207CisJCXRoaXMudmVuZG9yTmFtZSA9IHZlbmRvck5hbWU7CisJCXRoaXMudmVuZG9yUmVsZWFzZSA9IHZlbmRvclJlbGVhc2U7CisJCXRoaXMuY29udGFjdElkID0gY29udGFjdElkOworCQl0aGlzLmFic3RyYWN0dCA9IGFic3RyYWN0dDsKKwkJdGhpcy5oaWdoZXN0VmVyc2lvbiA9IGhpZ2hlc3RWZXJzaW9uOworCQl0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0czsKKwkJdGhpcy5pbnRlcmZhY2VzID0gaW50ZXJmYWNlczsKKwkJdGhpcy51dWlkID0gdXVpZDsKKwkJdGhpcy5jb3N0ID0gY29zdDsKKwkJdGhpcy5saWNlbnNlVHlwZSA9IGxpY2Vuc2VUeXBlOworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVdWlkKFN0cmluZyB1dWlkKSB7CisJCXRoaXMudXVpZCA9IHV1aWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb3N0KCkgeworCQlyZXR1cm4gY29zdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb3N0KFN0cmluZyBjb3N0KSB7CisJCXRoaXMuY29zdCA9IGNvc3Q7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMaWNlbnNlVHlwZSgpIHsKKwkJcmV0dXJuIGxpY2Vuc2VUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpY2Vuc2VUeXBlKFN0cmluZyBsaWNlbnNlVHlwZSkgeworCQl0aGlzLmxpY2Vuc2VUeXBlID0gbGljZW5zZVR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVdWlkKCkgeworCQlyZXR1cm4gdXVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHNldFV1aWQoKSB7CisJCXJldHVybiB1dWlkOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW50ZXJmYWNlcygpIHsKKwkJcmV0dXJuIGludGVyZmFjZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlcyhMaXN0PFN0cmluZz4gaW50ZXJmYWNlcykgeworCQl0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhMaXN0PFN0cmluZz4gYXJ0aWZhY3RzKSB7CisJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBSZXNvdXJjZVJlc3BKYXZhT2JqZWN0KCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXRoaXMubmFtZSA9IHJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHJlc291cmNlVmVyc2lvbikgeworCQl0aGlzLnZlcnNpb24gPSByZXNvdXJjZVZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yVXNlcklkKCkgeworCQlyZXR1cm4gY3JlYXRvclVzZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdG9yVXNlcklkKFN0cmluZyBjcmVhdG9yVXNlcklkKSB7CisJCXRoaXMuY3JlYXRvclVzZXJJZCA9IGNyZWF0b3JVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yRnVsbE5hbWUoKSB7CisJCXJldHVybiBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRvckZ1bGxOYW1lKFN0cmluZyBjcmVhdG9yRnVsbE5hbWUpIHsKKwkJdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlclVzZXJJZCgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVyVXNlcklkKFN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCkgeworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlckZ1bGxOYW1lKFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lKSB7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJY29uKCkgeworCQlyZXR1cm4gaWNvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJY29uKFN0cmluZyBpY29uKSB7CisJCXRoaXMuaWNvbiA9IGljb247CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYWdzKCkgeworCQlyZXR1cm4gdGFnczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYWdzKExpc3Q8U3RyaW5nPiB0YWdzKSB7CisJCXRoaXMudGFncyA9IHRhZ3M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJc0hpZ2hlc3RWZXJzaW9uKCkgeworCQlyZXR1cm4gaXNIaWdoZXN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJc0hpZ2hlc3RWZXJzaW9uKFN0cmluZyBpc0hpZ2hlc3RWZXJzaW9uKSB7CisJCXRoaXMuaXNIaWdoZXN0VmVyc2lvbiA9IGlzSGlnaGVzdFZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdGlvbkRhdGUoKSB7CisJCXJldHVybiBjcmVhdGlvbkRhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKFN0cmluZyBjcmVhdGlvbkRhdGUpIHsKKwkJdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlRGF0ZSgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVEYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVEYXRlKFN0cmluZyBsYXN0VXBkYXRlRGF0ZSkgeworCQl0aGlzLmxhc3RVcGRhdGVEYXRlID0gbGFzdFVwZGF0ZURhdGU7CisJfQorCisJLy8gcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkvLyByZXR1cm4gY2F0ZWdvcnk7CisJLy8gfQorCS8vIHB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCS8vIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkvLyB9CisJcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGVTdGF0ZSgpIHsKKwkJcmV0dXJuIGxpZmVjeWNsZVN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpZmVjeWNsZVN0YXRlKFN0cmluZyBsaWZlY3ljbGVTdGF0ZSkgeworCQl0aGlzLmxpZmVjeWNsZVN0YXRlID0gbGlmZWN5Y2xlU3RhdGU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXREZXJpdmVkRnJvbSgpIHsKKwkJcmV0dXJuIGRlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcml2ZWRGcm9tKExpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSkgeworCQl0aGlzLmRlcml2ZWRGcm9tID0gZGVyaXZlZEZyb207CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gdmVuZG9yTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZyB2ZW5kb3JOYW1lKSB7CisJCXRoaXMudmVuZG9yTmFtZSA9IHZlbmRvck5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZW5kb3JSZWxlYXNlKCkgeworCQlyZXR1cm4gdmVuZG9yUmVsZWFzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JSZWxlYXNlKFN0cmluZyB2ZW5kb3JSZWxlYXNlKSB7CisJCXRoaXMudmVuZG9yUmVsZWFzZSA9IHZlbmRvclJlbGVhc2U7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb250YWN0SWQoKSB7CisJCXJldHVybiBjb250YWN0SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udGFjdElkKFN0cmluZyBjb250YWN0SWQpIHsKKwkJdGhpcy5jb250YWN0SWQgPSBjb250YWN0SWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBYnN0cmFjdHQoKSB7CisJCXJldHVybiBhYnN0cmFjdHQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWJzdHJhY3R0KFN0cmluZyBhYnN0cmFjdHQpIHsKKwkJdGhpcy5hYnN0cmFjdHQgPSBhYnN0cmFjdHQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIaWdoZXN0VmVyc2lvbigpIHsKKwkJcmV0dXJuIGhpZ2hlc3RWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhpZ2hlc3RWZXJzaW9uKFN0cmluZyBoaWdoZXN0VmVyc2lvbikgeworCQl0aGlzLmhpZ2hlc3RWZXJzaW9uID0gaGlnaGVzdFZlcnNpb247CisJfQorCisJcHVibGljIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBnZXRDYXRlZ29yaWVzKCkgeworCQlyZXR1cm4gY2F0ZWdvcmllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yaWVzKExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzKSB7CisJCXRoaXMuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCByZXNvdXJjZU5hbWU9IiArIG5hbWUgKyAiLCByZXNvdXJjZVZlcnNpb249IgorCQkJCSsgdmVyc2lvbiArICIsIGNyZWF0b3JVc2VySWQ9IiArIGNyZWF0b3JVc2VySWQgKyAiLCBjcmVhdG9yRnVsbE5hbWU9IiArIGNyZWF0b3JGdWxsTmFtZQorCQkJCSsgIiwgbGFzdFVwZGF0ZXJVc2VySWQ9IiArIGxhc3RVcGRhdGVyVXNlcklkICsgIiwgbGFzdFVwZGF0ZXJGdWxsTmFtZT0iICsgbGFzdFVwZGF0ZXJGdWxsTmFtZQorCQkJCSsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsgIiwgaWNvbj0iICsgaWNvbiArICIsIHRhZ3M9IiArIHRhZ3MgKyAiLCBpc0hpZ2hlc3RWZXJzaW9uPSIKKwkJCQkrIGlzSGlnaGVzdFZlcnNpb24gKyAiLCBjcmVhdGlvbkRhdGU9IiArIGNyZWF0aW9uRGF0ZSArICIsIGxhc3RVcGRhdGVEYXRlPSIgKyBsYXN0VXBkYXRlRGF0ZQorCQkJCSsgIiwgbGlmZWN5Y2xlU3RhdGU9IiArIGxpZmVjeWNsZVN0YXRlICsgIiwgZGVyaXZlZEZyb209IiArIGRlcml2ZWRGcm9tICsgIiwgdmVuZG9yTmFtZT0iICsgdmVuZG9yTmFtZQorCQkJCSsgIiwgdmVuZG9yUmVsZWFzZT0iICsgdmVuZG9yUmVsZWFzZSArICIsIGNvbnRhY3RJZD0iICsgY29udGFjdElkICsgIiwgYWJzdHJhY3R0PSIgKyBhYnN0cmFjdHQKKwkJCQkrICIsIGhpZ2hlc3RWZXJzaW9uPSIgKyBoaWdoZXN0VmVyc2lvbiArICIsIGFydGlmYWN0cz0iICsgYXJ0aWZhY3RzICsgIiwgaW50ZXJmYWNlcz0iICsgaW50ZXJmYWNlcworCQkJCSsgIiwgdXVpZD0iICsgdXVpZCArICIsIGNvc3Q9IiArIGNvc3QgKyAiLCBsaWNlbnNlVHlwZT0iICsgbGljZW5zZVR5cGUgKyAiLCByZXNvdXJjZVR5cGU9IgorCQkJCSsgcmVzb3VyY2VUeXBlICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9TZXJ2aWNlQXNzZXRTdHJ1Y3R1cmUuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZUFzc2V0U3RydWN0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1ZDIyOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZUFzc2V0U3RydWN0dXJlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGNsYXNzIFNlcnZpY2VBc3NldFN0cnVjdHVyZSBleHRlbmRzIEFzc2V0U3RydWN0dXJlIHsKKworCXByaXZhdGUgU3RyaW5nIGRpc3RyaWJ1dGlvblN0YXR1czsKKworCXB1YmxpYyBTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmUoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFNlcnZpY2VBc3NldFN0cnVjdHVyZShTdHJpbmcgdXVpZCwgU3RyaW5nIGludmFyaWFudFVVSUQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHRvc2NhTW9kZWxVUkwsCisJCQlTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBsaWZlY3ljbGVTdGF0ZSwgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkKSB7CisJCXN1cGVyKHV1aWQsIGludmFyaWFudFVVSUQsIG5hbWUsIHZlcnNpb24sIHRvc2NhTW9kZWxVUkwsIGNhdGVnb3J5LCBsaWZlY3ljbGVTdGF0ZSwgbGFzdFVwZGF0ZXJVc2VySWQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiU2VydmljZUFzc2V0U3RydWN0dXJlIFtkaXN0cmlidXRpb25TdGF0dXM9IiArIGRpc3RyaWJ1dGlvblN0YXR1cyArICJdIjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc3RyaWJ1dGlvblN0YXR1cygpIHsKKwkJcmV0dXJuIGRpc3RyaWJ1dGlvblN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRpb25TdGF0dXMoU3RyaW5nIGRpc3RyaWJ1dGlvblN0YXR1cykgeworCQl0aGlzLmRpc3RyaWJ1dGlvblN0YXR1cyA9IGRpc3RyaWJ1dGlvblN0YXR1czsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzI4M2EzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9TZXJ2aWNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFNlcnZpY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlIGV4dGVuZHMgU2VydmljZUFzc2V0U3RydWN0dXJlIHsKKworCVN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lOworCUxpc3Q8UmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlPiByZXNvdXJjZXM7CisJTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHM7CisKKwlwdWJsaWMgU2VydmljZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFNlcnZpY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlKFN0cmluZyB1dWlkLCBTdHJpbmcgaW52YXJpYW50VVVJRCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLAorCQkJU3RyaW5nIHRvc2NhTW9kZWxVUkwsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIGxpZmVjeWNsZVN0YXRlLCBTdHJpbmcgbGFzdFVwZGF0ZXJVc2VySWQpIHsKKwkJc3VwZXIodXVpZCwgaW52YXJpYW50VVVJRCwgbmFtZSwgdmVyc2lvbiwgdG9zY2FNb2RlbFVSTCwgY2F0ZWdvcnksIGxpZmVjeWNsZVN0YXRlLCBsYXN0VXBkYXRlclVzZXJJZCk7CisJfQorCisJcHVibGljIFNlcnZpY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlKFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lLCBMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VzLAorCQkJTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5sYXN0VXBkYXRlckZ1bGxOYW1lID0gbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShTdHJpbmcgbGFzdFVwZGF0ZXJGdWxsTmFtZSkgeworCQl0aGlzLmxhc3RVcGRhdGVyRnVsbE5hbWUgPSBsYXN0VXBkYXRlckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyBMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4gZ2V0UmVzb3VyY2VzKCkgeworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlcyhMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VzKSB7CisJCXRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCX0KKworCXB1YmxpYyBMaXN0PEFydGlmYWN0QXNzZXRTdHJ1Y3R1cmU+IGdldEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHMoTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJTZXJ2aWNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSBbbGFzdFVwZGF0ZXJGdWxsTmFtZT0iICsgbGFzdFVwZGF0ZXJGdWxsTmFtZSArICIsIHJlc291cmNlcz0iICsgcmVzb3VyY2VzCisJCQkJKyAiLCBhcnRpZmFjdHM9IiArIGFydGlmYWN0cyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZVJlcURldGFpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZVJlcURldGFpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzMxODNjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9TZXJ2aWNlUmVxRGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlUmVxRGV0YWlscyBleHRlbmRzIENvbXBvbmVudFJlcURldGFpbHMgeworCisJcHVibGljIFNlcnZpY2VSZXFEZXRhaWxzKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGNhdGVnb3J5LCBBcnJheUxpc3Q8U3RyaW5nPiB0YWdzLCBTdHJpbmcgZGVzY3JpcHRpb24sCisJCQlTdHJpbmcgY29udGFjdElkLCBTdHJpbmcgaWNvbikgeworCQl0aGlzLm5hbWUgPSBzZXJ2aWNlTmFtZTsKKwkJLy8gdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OworCQl0aGlzLnRhZ3MgPSB0YWdzOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCXRoaXMuY29udGFjdElkID0gY29udGFjdElkOworCQl0aGlzLmljb24gPSBpY29uOworCQlwcm9qZWN0Q29kZSA9ICIxMjM0NSI7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24gPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKGNhdGVnb3J5KTsKKwkJY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeURlZmluaXRpb24pOworCisJfQorCisJcHVibGljIFNlcnZpY2VSZXFEZXRhaWxzKFNlcnZpY2Ugc2VydmljZSkgeworCQl0aGlzLmNvbnRhY3RJZCA9IHNlcnZpY2UuZ2V0Q29udGFjdElkKCk7CisJCXRoaXMuY2F0ZWdvcmllcyA9IHNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpOworCQl0aGlzLmNyZWF0b3JVc2VySWQgPSBzZXJ2aWNlLmdldENyZWF0b3JVc2VySWQoKTsKKwkJdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSBzZXJ2aWNlLmdldENyZWF0b3JGdWxsTmFtZSgpOworCQl0aGlzLmRlc2NyaXB0aW9uID0gc2VydmljZS5nZXREZXNjcmlwdGlvbigpOworCQl0aGlzLmljb24gPSBzZXJ2aWNlLmdldEljb24oKTsKKwkJdGhpcy5uYW1lID0gc2VydmljZS5nZXROYW1lKCk7CisJCXRoaXMucHJvamVjdENvZGUgPSBzZXJ2aWNlLmdldFByb2plY3RDb2RlKCk7CisJCXRoaXMudGFncyA9IHNlcnZpY2UuZ2V0VGFncygpOworCQl0aGlzLnVuaXF1ZUlkID0gc2VydmljZS5nZXRVbmlxdWVJZCgpOworCQl0aGlzLlVVSUQgPSBzZXJ2aWNlLmdldFVVSUQoKTsKKwkJdGhpcy52ZXJzaW9uID0gc2VydmljZS5nZXRWZXJzaW9uKCk7CisKKwl9CisKKwlwdWJsaWMgU2VydmljZVJlcURldGFpbHMoKSB7CisJCWNvbnRhY3RJZCA9ICJhYTEyMzQiOworCQlwcm9qZWN0Q29kZSA9ICIxMjM0NSI7CisJfQorCisJcHVibGljIFNlcnZpY2VSZXFEZXRhaWxzKFNlcnZpY2VSZXFEZXRhaWxzIGEsIFN0cmluZyBuZXdTZXJ2aWNlTmFtZSkgeworCQlhLnNldE5hbWUobmV3U2VydmljZU5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiU2VydmljZURldGFpbHMgW25hbWU9IiArIG5hbWUgKyAiLCBjYXRlZ29yeT0iICsgZ2V0Q2F0ZWdvcnkoKSArICIsIHRhZ3M9IiArIHRhZ3MgKyAiLCBkZXNjcmlwdGlvbj0iCisJCQkJKyBkZXNjcmlwdGlvbiArICIsIGNvbnRhY3RJZD0iICsgY29udGFjdElkICsgIiwgaWNvbj0iICsgaWNvbiArICJdIjsKKwl9CisKKwlwdWJsaWMgU2VydmljZVJlcURldGFpbHMoU2VydmljZVJlcURldGFpbHMgYVNlcnZpY2UpIHsKKwkJdGhpcyhhU2VydmljZS5nZXROYW1lKCksIGFTZXJ2aWNlLmdldENhdGVnb3J5KCksIChBcnJheUxpc3Q8U3RyaW5nPikgYVNlcnZpY2UuZ2V0VGFncygpLAorCQkJCWFTZXJ2aWNlLmdldERlc2NyaXB0aW9uKCksIGFTZXJ2aWNlLmdldENvbnRhY3RJZCgpLCBhU2VydmljZS5nZXRJY29uKCkpOworCQl1bmlxdWVJZCA9IGFTZXJ2aWNlLmdldFVuaXF1ZUlkKCk7CisJCXZlcnNpb24gPSBhU2VydmljZS5nZXRWZXJzaW9uKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkJaWYgKGNhdGVnb3JpZXMgIT0gbnVsbCAmJiBjYXRlZ29yaWVzLnNpemUoKSA+PSAxKSB7CisJCQlyZXR1cm4gY2F0ZWdvcmllcy5nZXQoMCkuZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9TZXJ2aWNlUmVzcEphdmFPYmplY3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZVJlc3BKYXZhT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlYjBjZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZVJlc3BKYXZhT2JqZWN0LmphdmEKQEAgLTAsMCArMSwyNjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgU2VydmljZVJlc3BKYXZhT2JqZWN0IHsKKworCVN0cmluZyBjYXRlZ29yeTsKKwlTdHJpbmcgY3JlYXRvclVzZXJJZDsKKwlTdHJpbmcgY3JlYXRvckZ1bGxOYW1lOworCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZDsKKwlTdHJpbmcgbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwlTdHJpbmcgc2VydmljZU5hbWU7CisJU3RyaW5nIHZlcnNpb247CisJU3RyaW5nIGNyZWF0aW9uRGF0ZTsKKwlTdHJpbmcgaWNvbjsKKwlTdHJpbmcgbmFtZTsKKwlTdHJpbmcgZGVzY3JpcHRpb247CisJQXJyYXlMaXN0PFN0cmluZz4gdGFnczsKKwlTdHJpbmcgdW5pcXVlSWQ7CisJU3RyaW5nIGxhc3RVcGRhdGVEYXRlOworCVN0cmluZyBjb250YWN0SWQ7CisJU3RyaW5nIHZlbmRvck5hbWU7CisJU3RyaW5nIHZlbmRvclJlbGVhc2U7CisJU3RyaW5nIGxpZmVjeWNsZVN0YXRlOworCVN0cmluZyBoaWdoZXN0VmVyc2lvbjsKKwlBcnJheUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHM7CisJQXJyYXlMaXN0PFN0cmluZz4gUmVzb3VyY2VJbnN0YW5jZXM7CisJQXJyYXlMaXN0PFN0cmluZz4gUmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnM7CisKKwlwdWJsaWMgU2VydmljZVJlc3BKYXZhT2JqZWN0KCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgU2VydmljZVJlc3BKYXZhT2JqZWN0KFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIGNyZWF0b3JVc2VySWQsIFN0cmluZyBjcmVhdG9yRnVsbE5hbWUsCisJCQlTdHJpbmcgbGFzdFVwZGF0ZXJVc2VySWQsIFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyB2ZXJzaW9uLAorCQkJU3RyaW5nIGNyZWF0aW9uRGF0ZSwgU3RyaW5nIGljb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIEFycmF5TGlzdDxTdHJpbmc+IHRhZ3MsIFN0cmluZyB1bmlxdWVJZCwKKwkJCVN0cmluZyBsYXN0VXBkYXRlRGF0ZSwgU3RyaW5nIGNvbnRhY3RJZCwgU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZW5kb3JSZWxlYXNlLCBTdHJpbmcgbGlmZWN5Y2xlU3RhdGUsCisJCQlTdHJpbmcgaGlnaGVzdFZlcnNpb24sIEFycmF5TGlzdDxTdHJpbmc+IGFydGlmYWN0cywgQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VJbnN0YW5jZXMsCisJCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucykgeworCQlzdXBlcigpOworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJCXRoaXMuY3JlYXRvclVzZXJJZCA9IGNyZWF0b3JVc2VySWQ7CisJCXRoaXMuY3JlYXRvckZ1bGxOYW1lID0gY3JlYXRvckZ1bGxOYW1lOworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJCXRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwkJdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7CisJCXRoaXMuaWNvbiA9IGljb247CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJdGhpcy50YWdzID0gdGFnczsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCQl0aGlzLmxhc3RVcGRhdGVEYXRlID0gbGFzdFVwZGF0ZURhdGU7CisJCXRoaXMuY29udGFjdElkID0gY29udGFjdElkOworCQl0aGlzLnZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOworCQl0aGlzLnZlbmRvclJlbGVhc2UgPSB2ZW5kb3JSZWxlYXNlOworCQl0aGlzLmxpZmVjeWNsZVN0YXRlID0gbGlmZWN5Y2xlU3RhdGU7CisJCXRoaXMuaGlnaGVzdFZlcnNpb24gPSBoaWdoZXN0VmVyc2lvbjsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJCVJlc291cmNlSW5zdGFuY2VzID0gcmVzb3VyY2VJbnN0YW5jZXM7CisJCVJlc291cmNlSW5zdGFuY2VzUmVsYXRpb25zID0gcmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yVXNlcklkKCkgeworCQlyZXR1cm4gY3JlYXRvclVzZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdG9yVXNlcklkKFN0cmluZyBjcmVhdG9yVXNlcklkKSB7CisJCXRoaXMuY3JlYXRvclVzZXJJZCA9IGNyZWF0b3JVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yRnVsbE5hbWUoKSB7CisJCXJldHVybiBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRvckZ1bGxOYW1lKFN0cmluZyBjcmVhdG9yRnVsbE5hbWUpIHsKKwkJdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlclVzZXJJZCgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVyVXNlcklkKFN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCkgeworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlckZ1bGxOYW1lKFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lKSB7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdGlvbkRhdGUoKSB7CisJCXJldHVybiBjcmVhdGlvbkRhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKFN0cmluZyBjcmVhdGlvbkRhdGUpIHsKKwkJdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJY29uKCkgeworCQlyZXR1cm4gaWNvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJY29uKFN0cmluZyBpY29uKSB7CisJCXRoaXMuaWNvbiA9IGljb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldFRhZ3MoKSB7CisJCXJldHVybiB0YWdzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhZ3MoQXJyYXlMaXN0PFN0cmluZz4gdGFncykgeworCQl0aGlzLnRhZ3MgPSB0YWdzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFVwZGF0ZURhdGUoKSB7CisJCXJldHVybiBsYXN0VXBkYXRlRGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlRGF0ZShTdHJpbmcgbGFzdFVwZGF0ZURhdGUpIHsKKwkJdGhpcy5sYXN0VXBkYXRlRGF0ZSA9IGxhc3RVcGRhdGVEYXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFjdElkKCkgeworCQlyZXR1cm4gY29udGFjdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnRhY3RJZChTdHJpbmcgY29udGFjdElkKSB7CisJCXRoaXMuY29udGFjdElkID0gY29udGFjdElkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKKwkJcmV0dXJuIHZlbmRvck5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVuZG9yTmFtZShTdHJpbmcgdmVuZG9yTmFtZSkgeworCQl0aGlzLnZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yUmVsZWFzZSgpIHsKKwkJcmV0dXJuIHZlbmRvclJlbGVhc2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVuZG9yUmVsZWFzZShTdHJpbmcgdmVuZG9yUmVsZWFzZSkgeworCQl0aGlzLnZlbmRvclJlbGVhc2UgPSB2ZW5kb3JSZWxlYXNlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGlmZWN5Y2xlU3RhdGUoKSB7CisJCXJldHVybiBsaWZlY3ljbGVTdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVTdGF0ZShTdHJpbmcgbGlmZWN5Y2xlU3RhdGUpIHsKKwkJdGhpcy5saWZlY3ljbGVTdGF0ZSA9IGxpZmVjeWNsZVN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SGlnaGVzdFZlcnNpb24oKSB7CisJCXJldHVybiBoaWdoZXN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIaWdoZXN0VmVyc2lvbihTdHJpbmcgaGlnaGVzdCkgeworCQl0aGlzLmhpZ2hlc3RWZXJzaW9uID0gaGlnaGVzdDsKKwl9CisKKwlwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gZ2V0QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhBcnJheUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldFJlc291cmNlSW5zdGFuY2VzKCkgeworCQlyZXR1cm4gUmVzb3VyY2VJbnN0YW5jZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJbnN0YW5jZXMoQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VJbnN0YW5jZXMpIHsKKwkJUmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZUluc3RhbmNlczsKKwl9CisKKwlwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gZ2V0UmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnMoKSB7CisJCXJldHVybiBSZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9uczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucyhBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucykgeworCQlSZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucyA9IHJlc291cmNlSW5zdGFuY2VzUmVsYXRpb25zOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiU2VydmljZVJlc3BKYXZhT2JqZWN0IFtjYXRlZ29yeT0iICsgY2F0ZWdvcnkgKyAiLCBjcmVhdG9yVXNlcklkPSIgKyBjcmVhdG9yVXNlcklkICsgIiwgY3JlYXRvckZ1bGxOYW1lPSIKKwkJCQkrIGNyZWF0b3JGdWxsTmFtZSArICIsIGxhc3RVcGRhdGVyVXNlcklkPSIgKyBsYXN0VXBkYXRlclVzZXJJZCArICIsIGxhc3RVcGRhdGVyRnVsbE5hbWU9IgorCQkJCSsgbGFzdFVwZGF0ZXJGdWxsTmFtZSArICIsIHNlcnZpY2VOYW1lPSIgKyBzZXJ2aWNlTmFtZSArICIsIHZlcnNpb249IiArIHZlcnNpb24gKyAiLCBjcmVhdGlvbkRhdGU9IgorCQkJCSsgY3JlYXRpb25EYXRlICsgIiwgaWNvbj0iICsgaWNvbiArICIsIG5hbWU9IiArIG5hbWUgKyAiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24gKyAiLCB0YWdzPSIgKyB0YWdzCisJCQkJKyAiLCB1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBsYXN0VXBkYXRlRGF0ZT0iICsgbGFzdFVwZGF0ZURhdGUgKyAiLCBjb250YWN0SWQ9IiArIGNvbnRhY3RJZAorCQkJCSsgIiwgdmVuZG9yTmFtZT0iICsgdmVuZG9yTmFtZSArICIsIHZlbmRvclJlbGVhc2U9IiArIHZlbmRvclJlbGVhc2UgKyAiLCBsaWZlY3ljbGVTdGF0ZT0iCisJCQkJKyBsaWZlY3ljbGVTdGF0ZSArICIsIGxpZmVjeWNsZVN0YXRlPSIgKyBsaWZlY3ljbGVTdGF0ZSArICIsIGFydGlmYWN0cz0iICsgYXJ0aWZhY3RzCisJCQkJKyAiLCBSZXNvdXJjZUluc3RhbmNlcz0iICsgUmVzb3VyY2VJbnN0YW5jZXMgKyAiLCBSZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucz0iCisJCQkJKyBSZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvVHlwZUhlYXRNZXRhRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9UeXBlSGVhdE1ldGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmMDI5MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvVHlwZUhlYXRNZXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFR5cGVIZWF0TWV0YURlZmluaXRpb24geworCisJU3RyaW5nIHR5cGVOYW1lOworCisJTGlzdDxHcm91cEhlYXRNZXRhRGVmaW5pdGlvbj4gZ3JvdXBIZWF0TWV0YURlZmluaXRpb247CisKKwlwdWJsaWMgVHlwZUhlYXRNZXRhRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworCQlyZXR1cm4gdHlwZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxHcm91cEhlYXRNZXRhRGVmaW5pdGlvbj4gZ2V0R3JvdXBIZWF0TWV0YURlZmluaXRpb24oKSB7CisJCXJldHVybiBncm91cEhlYXRNZXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cEhlYXRNZXRhRGVmaW5pdGlvbihMaXN0PEdyb3VwSGVhdE1ldGFEZWZpbml0aW9uPiBncm91cEhlYXRNZXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmdyb3VwSGVhdE1ldGFEZWZpbml0aW9uID0gZ3JvdXBIZWF0TWV0YURlZmluaXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJUeXBlSGVhdE1ldGFEZWZpbml0aW9uIFt0eXBlTmFtZT0iICsgdHlwZU5hbWUgKyAiLCBncm91cEhlYXRNZXRhRGVmaW5pdGlvbj0iICsgZ3JvdXBIZWF0TWV0YURlZmluaXRpb24KKwkJCQkrICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvQXJ0aWZhY3RUeXBlRW51bS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9BcnRpZmFjdFR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2YjA2YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvQXJ0aWZhY3RUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEVudW0gVGhhdCBSZXByZXNlbnRzIHBvc3NpYmxlIEFydGlmYWN0cyBUeXBlcy4KKyAqCisgKi8KK3B1YmxpYyBlbnVtIEFydGlmYWN0VHlwZUVudW0geworCUNIRUYoIkNIRUYiKSwgUFVQUEVUKCJQVVBQRVQiKSwgWUFORygiWUFORyIpLCBTSEVMTF9TQ1JJUFQoIlNIRUxMX1NDUklQVCIpLCBJQ09OKCJJQ09OIiksIFVOS05PV04oIlVOS05PV04iKSwgSEVBVCgiSEVBVCIpLCBER19YTUwoIkRHX1hNTCIpLCBNVVJBTk9fUEtHKCJNVVJBTk9fUEtHIiksIAorCUhFQVRfRU5WKCJIRUFUX0VOViIpLCBZQU5HX1hNTCgiWUFOR19YTUwiKSwgSEVBVF9WT0woIkhFQVRfVk9MIiksIEhFQVRfTkVUKCJIRUFUX05FVCIpLCBPVEhFUigiT1RIRVIiKSwgV09SS0ZMT1coIldPUktGTE9XIiksIE5FVFdPUktfQ0FMTF9GTE9XKCJORVRXT1JLX0NBTExfRkxPVyIpLCAKKwlUT1NDQV9URU1QTEFURSgiVE9TQ0FfVEVNUExBVEUiKSwgVE9TQ0FfQ1NBUigiVE9TQ0FfQ1NBUiIpLCBWTkZfQ0FUQUxPRygiVk5GX0NBVEFMT0ciKSwgVkZfTElDRU5TRSgiVkZfTElDRU5TRSIpLCBWRU5ET1JfTElDRU5TRSgiVkVORE9SX0xJQ0VOU0UiKSwgCisJTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEUoIk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFIiksIE1PREVMX1FVRVJZX1NQRUMoIk1PREVMX1FVRVJZX1NQRUMiKSwgQVBQQ19DT05GSUcoIkFQUENfQ09ORklHIiksIEhFQVRfTkVTVEVEKCJIRUFUX05FU1RFRCIpLCAKKwlIRUFUX0FSVElGQUNUKCJIRUFUX0FSVElGQUNUIiksIFZGX01PRFVMRVNfTUVUQURBVEEoIlZGX01PRFVMRVNfTUVUQURBVEEiKSwKKwkvLyBEQ0FFIEFydGlmYWN0cworCURDQUVfVE9TQ0EoIkRDQUVfVE9TQ0EiKSwgRENBRV9KU09OKCJEQ0FFX0pTT04iKSwgRENBRV9QT0xJQ1koIkRDQUVfUE9MSUNZIiksIERDQUVfRE9DKCJEQ0FFX0RPQyIpLCBEQ0FFX0VWRU5UKCJEQ0FFX0VWRU5UIiksIERDQUVfSU5WRU5UT1JZX1RPU0NBKCJEQ0FFX0lOVkVOVE9SWV9UT1NDQSIpLCAKKwlEQ0FFX0lOVkVOVE9SWV9KU09OKCJEQ0FFX0lOVkVOVE9SWV9KU09OIiksIERDQUVfSU5WRU5UT1JZX1BPTElDWSgiRENBRV9JTlZFTlRPUllfUE9MSUNZIiksIERDQUVfSU5WRU5UT1JZX0RPQygiRENBRV9JTlZFTlRPUllfRE9DIiksIAorCURDQUVfSU5WRU5UT1JZX0JMVUVQUklOVCgiRENBRV9JTlZFTlRPUllfQkxVRVBSSU5UIiksIERDQUVfSU5WRU5UT1JZX0VWRU5UKCJEQ0FFX0lOVkVOVE9SWV9FVkVOVCIpLAorCS8vIEFBSSBBcnRpZmFjdHMKKwlBQUlfU0VSVklDRV9NT0RFTCgiQUFJX1NFUlZJQ0VfTU9ERUwiKSwgQUFJX1ZGX01PREVMKCJBQUlfVkZfTU9ERUwiKSwgQUFJX1ZGX01PRFVMRV9NT0RFTCgiQUFJX1ZGX01PRFVMRV9NT0RFTCIpLCBBQUlfVkZfSU5TVEFOQ0VfTU9ERUwoIkFBSV9WRl9JTlNUQU5DRV9NT0RFTCIpCisJOworCisJQXJ0aWZhY3RUeXBlRW51bShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEFydGlmYWN0VHlwZUVudW0gZmluZFR5cGUoZmluYWwgU3RyaW5nIHR5cGUpIHsKKwkJZm9yIChBcnRpZmFjdFR5cGVFbnVtIGF0ZSA6IEFydGlmYWN0VHlwZUVudW0udmFsdWVzKCkpIHsKKwkJCS8vIEFjY29yZGluZyB0byBQYXZlbC9FbGxhCisJCQlpZiAoYXRlLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisJCQkJcmV0dXJuIGF0ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbGxUeXBlcygpIHsKKwkJTGlzdDxTdHJpbmc+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoQXJ0aWZhY3RUeXBlRW51bSBhdGUgOiBBcnRpZmFjdFR5cGVFbnVtLnZhbHVlcygpKSB7CisJCQl0eXBlcy5hZGQoYXRlLmdldFR5cGUoKSk7CisJCX0KKwkJcmV0dXJuIHR5cGVzOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvQXNzb2NUeXBlLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0Fzc29jVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZGExZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0Fzc29jVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBlbnVtIEFzc29jVHlwZSB7CisKKwlCSU5EQUJMRSgidG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUiKSwgCisJSE9TVEVET04oInRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24iKSwgCisJTElOS0FCTEUoInRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlIiksIAorCUNPTlRBSU5FUigidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpLCAKKwlOT0RFKCJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIpOworCisJcHJpdmF0ZSBTdHJpbmcgYXNzb2NUeXBlOworCisJcHJpdmF0ZSBBc3NvY1R5cGUoU3RyaW5nIGFzc29jVHlwZSkgeworCQl0aGlzLmFzc29jVHlwZSA9IGFzc29jVHlwZTsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXNzb2NUeXBlKCkgeworCQlyZXR1cm4gYXNzb2NUeXBlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9BdWRpdEVudW0uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvQXVkaXRFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczY2ZmOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvQXVkaXRFbnVtLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGVudW0gQXVkaXRFbnVtIHsKKworCUFDVElPTigiQUNUSU9OIiksIAorCVJFU09VUkNFX05BTUUoIlJFU09VUkNFX05BTUUiKSwgCisJUkVTT1VSQ0VfVFlQRSgiUkVTT1VSQ0VfVFlQRSIpLCAKKwlQUkVWX1ZFUlNJT04oIlBSRVZfVkVSU0lPTiIpLCAKKwlDVVJSX1ZFUlNJT04oIkNVUlJfVkVSU0lPTiIpLCAKKwlNT0RJRklFUigiTU9ESUZJRVIiKSwKKyAgICBQUkVWX1NUQVRFKCJQUkVWX1NUQVRFIiksIAorICAgIENVUlJfU1RBVEUoIkNVUlJfU1RBVEUiKSwgCisgICAgU1RBVFVTKCJTVEFUVVMtVHlwZSIpLCAKKyAgICBERVNDKCJERVNDIiksIAorICAgIFVSTCgiVVJMIiksIAorICAgIFVTRVIoIlVTRVIiKSwgCisgICAgQVVUSF9TVEFUVVMoIkFVVEhfU1RBVFVTIiksIAorICAgIFJFQUxNKCJSRUFMTSIpOworCisJU3RyaW5nIHZhbHVlOworCisJcHJpdmF0ZSBBdWRpdEVudW0oU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCisJCXJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9BdWRpdEpzb25LZXlzRW51bS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9BdWRpdEpzb25LZXlzRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjlmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0F1ZGl0SnNvbktleXNFbnVtLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGVudW0gQXVkaXRKc29uS2V5c0VudW0geworCisJQUNUSU9OKCJBQ1RJT04iKSwgUkVTT1VSQ0VfTkFNRSgiUkVTT1VSQ0VfTkFNRSIpLCBSRVNPVVJDRV9UWVBFKCJSRVNPVVJDRV9UWVBFIiksIFBSRVZfVkVSU0lPTigiUFJFVl9WRVJTSU9OIiksIENVUlJfVkVSU0lPTigiQ1VSUl9WRVJTSU9OIiksIFBSRVZfU1RBVEUoIlBSRVZfU1RBVEUiKSwgQ1VSUl9TVEFURSgiQ1VSUl9TVEFURSIpLCAKKwlEUFJFVl9TVEFUVVMoIkRQUkVWX1NUQVRVUyIpLCBEQ1VSUl9TVEFUVVMoIkRDVVJSX1NUQVRVUyIpLCBTVEFUVVMoIlNUQVRVUyIpLCBERVNDUklQVElPTigiREVTQ1JJUFRJT04iKSwgQVJUSUZBQ1RfREFUQSgiQVJUSUZBQ1RfREFUQSIpLCBDT05TVU1FUl9JRCgiQ09OU1VNRVJfSUQiKSwgUkVTT1VSQ0VfVVJMKCJSRVNPVVJDRV9VUkwiKSwgCisJQ09NTUVOVCgiQ09NTUVOVCIpLCBESUQoIkRJRCIpLCBUT1BJQ19OQU1FKCJUT1BJQ19OQU1FIiksIFRPU0NBX05PREVfVFlQRSgiVE9TQ0FfTk9ERV9UWVBFIiksIENVUlJfQVJUSUZBQ1RfVVVJRCgiQ1VSUl9BUlRJRkFDVF9VVUlEIiksIFBSRVZfQVJUSUZBQ1RfVVVJRCgiUFJFVl9BUlRJRkFDVF9VVUlEIiksIERFVEFJTFMoIkRFVEFJTFMiKSwgCisJTU9ESUZJRVIoIk1PRElGSUVSIiksIFNFUlZJQ0VfSU5TVEFOQ0VfSUQoIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiKTsKKworCXByaXZhdGUgU3RyaW5nIGF1ZGl0SnNvbktleU5hbWU7CisKKwlwcml2YXRlIEF1ZGl0SnNvbktleXNFbnVtKFN0cmluZyBhdWRpdEpzb25LZXlOYW1lKSB7CisJCXRoaXMuYXVkaXRKc29uS2V5TmFtZSA9IGF1ZGl0SnNvbktleU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBdWRpdEpzb25LZXlOYW1lKCkgeworCQlyZXR1cm4gYXVkaXRKc29uS2V5TmFtZS50b0xvd2VyQ2FzZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9Db21wb25lbnRUeXBlLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0NvbXBvbmVudFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDI0MmU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9Db21wb25lbnRUeXBlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGVudW0gQ29tcG9uZW50VHlwZSB7CisKKwlSRVNPVVJDRSgiUmVzb3VyY2UiKSwgU0VSVklDRSgiU2VydmljZSIpLCBBUlRJRkFDVCgiQXJ0aWZhY3QiKTsKKworCVN0cmluZyB2YWx1ZTsKKworCXByaXZhdGUgQ29tcG9uZW50VHlwZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisKKwkJcmV0dXJuIHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvRXJyb3JJbmZvLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0Vycm9ySW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTI4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0Vycm9ySW5mby5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBjbGFzcyBFcnJvckluZm8geworCisJcHJpdmF0ZSBJbnRlZ2VyIGNvZGU7CisJcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKwlwcml2YXRlIFN0cmluZyBtZXNzYWdlSWQ7CisKKwlwdWJsaWMgRXJyb3JJbmZvKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgRXJyb3JJbmZvKEludGVnZXIgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBtZXNzYWdlSWQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5jb2RlID0gY29kZTsKKwkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKwkJdGhpcy5tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7CisJfQorCisJcHVibGljIEVycm9ySW5mbyhJbnRlZ2VyIGNvZGUsIFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29kZSA9IGNvZGU7CisJCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0Q29kZSgpIHsKKwkJcmV0dXJuIGNvZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29kZShJbnRlZ2VyIGNvZGUpIHsKKwkJdGhpcy5jb2RlID0gY29kZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisJCXJldHVybiBtZXNzYWdlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUFuZFJlcGxhY2VWYXJpYWJsZXMoT2JqZWN0Li4uIHZhcmlhYmxlcykgeworCQlTdHJpbmcgZm9ybWF0UmVhZHlTdHJpbmcgPSBtZXNzYWdlLnJlcGxhY2VBbGwoIiVbXFxkXSsiLCAiJXMiKTsKKwkJZm9ybWF0UmVhZHlTdHJpbmcgPSBTdHJpbmcuZm9ybWF0KGZvcm1hdFJlYWR5U3RyaW5nLCB2YXJpYWJsZXMpOworCQlyZXR1cm4gZm9ybWF0UmVhZHlTdHJpbmc7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBdWRpdERlc2MoT2JqZWN0Li4uIHZhcmlhYmxlcykgeworCQlTdHJpbmcgbWVzc2FnZUFuZFJlcGxhY2VWYXJpYWJsZXMgPSBnZXRNZXNzYWdlQW5kUmVwbGFjZVZhcmlhYmxlcyh2YXJpYWJsZXMpOworCQlTdHJpbmcgcmVzOworCQlpZiAobWVzc2FnZUlkICE9IG51bGwpIHsKKwkJCXJlcyA9IG1lc3NhZ2VJZCArICI6ICIgKyBtZXNzYWdlQW5kUmVwbGFjZVZhcmlhYmxlczsKKwkJfSBlbHNlIHsKKwkJCXJlcyA9IG1lc3NhZ2VBbmRSZXBsYWNlVmFyaWFibGVzOworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKCkgeworCQlyZXR1cm4gbWVzc2FnZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZChTdHJpbmcgbWVzc2FnZUlkKSB7CisJCXRoaXMubWVzc2FnZUlkID0gbWVzc2FnZUlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRXJyb3JJbmZvIFtjb2RlPSIgKyBjb2RlICsgIiwgbWVzc2FnZT0iICsgbWVzc2FnZSArICIsIG1lc3NhZ2VJZD0iICsgbWVzc2FnZUlkICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9Fc0luZGV4VHlwZUlkVG9EZWxldGUuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvRXNJbmRleFR5cGVJZFRvRGVsZXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmYmQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvRXNJbmRleFR5cGVJZFRvRGVsZXRlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGNsYXNzIEVzSW5kZXhUeXBlSWRUb0RlbGV0ZSB7CisKKwlTdHJpbmcgaW5kZXg7CisJU3RyaW5nIHR5cGU7CisJU3RyaW5nIGlkOworCisJcHVibGljIEVzSW5kZXhUeXBlSWRUb0RlbGV0ZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgRXNJbmRleFR5cGVJZFRvRGVsZXRlKFN0cmluZyBpbmRleCwgU3RyaW5nIHR5cGUsIFN0cmluZyBpZCkgeworCQlzdXBlcigpOworCQl0aGlzLmluZGV4ID0gaW5kZXg7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuaWQgPSBpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEluZGV4KCkgeworCQlyZXR1cm4gaW5kZXg7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5kZXgoU3RyaW5nIGluZGV4KSB7CisJCXRoaXMuaW5kZXggPSBpbmRleDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisJCXRoaXMuaWQgPSBpZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvRXhjZXB0aW9uRW51bVR5cGUuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvRXhjZXB0aW9uRW51bVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQxZGVjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9FeGNlcHRpb25FbnVtVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBlbnVtIEV4Y2VwdGlvbkVudW1UeXBlIHsKKworCVNFUlZJQ0VfRVhDRVBUSU9OKCJzZXJ2aWNlRXhjZXB0aW9uIiksIFBPTElDWV9FWENQVElPTigicG9saWN5RXhjZXB0aW9uIik7CisKKwlTdHJpbmcgdmFsdWU7CisKKwlwcml2YXRlIEV4Y2VwdGlvbkVudW1UeXBlKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvSW1wb3J0VGVzdFR5cGVzRW51bS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9JbXBvcnRUZXN0VHlwZXNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5MDFlNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvSW1wb3J0VGVzdFR5cGVzRW51bS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CisKK3B1YmxpYyBlbnVtIEltcG9ydFRlc3RUeXBlc0VudW0geworCisJTUlTU0lOR19DT05UQUNUKCJ0b3NjYS5ub2Rlcy5taXNzaW5nX2NvbnRhY3QiLCAibWlzc2luZ19jb250YWN0IiwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QsIEFycmF5cy5hc0xpc3QoIlJlc291cmNlIiksIHRydWUpLCAKKwlNSVNTSU5HX1JFU09VUkNFX05BTUUoInRvc2NhLm5vZGVzLm1pc3NpbmdfcmVzb3VyY2VfbmFtZSIsICJtaXNzaW5nX3Jlc291cmNlX25hbWUiLCBBY3Rpb25TdGF0dXMuTUlTU0lOR19DT01QT05FTlRfTkFNRSwgQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiKSwgdHJ1ZSksIAorCU1JU1NJTkdfREVTQygidG9zY2Eubm9kZXMubWlzc2luZ19kZXNjIiwgIm1pc3NpbmdfZGVzYyIsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTiwgQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiKSwgdHJ1ZSksIAorCU1JU1NJTkdfSUNPTigidG9zY2Eubm9kZXMubWlzc2luZ19pY29uIiwgIm1pc3NpbmdfaWNvbiIsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLCBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIpLCB0cnVlKSwgCisJTUlTU0lOR19UQUdTKCJ0b3NjYS5ub2Rlcy5taXNzaW5nX3RhZ3MiLCAibWlzc2luZ190YWdzIiwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX1RBR1MsIG51bGwsIHRydWUpLCAKKwlNSVNTSU5HX0NBVEVHT1JZKCJ0b3NjYS5ub2Rlcy5taXNzaW5nX2NhdGVnb3J5IiwgIm1pc3NpbmdfY2F0ZWdvcnkiLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ0FURUdPUlksIEFycmF5cy5hc0xpc3QoIlJlc291cmNlIiksIHRydWUpLAorCS8vIE1JU1NJTkdfUEFZTE9BRE5BTUUoInRvc2NhLm5vZGVzLm1pc3NpbmdfcGF5bG9hZE5hbWUiLAorCS8vICJtaXNzaW5nX3BheWxvYWROYW1lIiwgQWN0aW9uU3RhdHVzLklOVkFMSURfVE9TQ0FfRklMRV9FWFRFTlNJT04sIG51bGwsCisJLy8gdHJ1ZSksCisKKwlFTVBUWV9SRVNPVVJDRV9OQU1FKCJ0b3NjYS5ub2Rlcy5lbXB0eV9yZXNvdXJjZV9uYW1lIiwgIm1pc3NpbmdfcmVzb3VyY2VfbmFtZSIvKiAiZW1wdHlfcmVzb3VyY2VfbmFtZSIgKi8sIEFjdGlvblN0YXR1cy5NSVNTSU5HX0NPTVBPTkVOVF9OQU1FLCBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIpLCBmYWxzZSksIAorCUVNUFRZX0NPTlRBQ1QoInRvc2NhLm5vZGVzLmVtcHR5X2NvbnRhY3QiLCAibWlzc2luZ19jb250YWN0Ii8qICJlbXB0eV9jb250YWN0IiAqLywgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QsIEFycmF5cy5hc0xpc3QoIlJlc291cmNlIiksIGZhbHNlKSwgCisJRU1QVFlfQ0FURUdPUlkoInRvc2NhLm5vZGVzLmVtcHR5X2NhdGVnb3J5IiwgIm1pc3NpbmdfY2F0ZWdvcnkiLyogImVtcHR5X2NhdGVnb3J5IiAqLywgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NBVEVHT1JZLCBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIpLCBmYWxzZSksIAorCUVNUFRZX0RFU0MoInRvc2NhLm5vZGVzLmVtcHR5X2Rlc2MiLCAibWlzc2luZ19kZXNjIi8qICJlbXB0eV9kZXNjIiAqLywgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0RFU0NSSVBUSU9OLCBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIpLCBmYWxzZSksIAorCUVNUFRZX0lDT04oInRvc2NhLm5vZGVzLmVtcHR5X2ljb24iLCAibWlzc2luZ19pY29uIi8qICJlbXB0eV9pY29uIiAqLywgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0lDT04sIEFycmF5cy5hc0xpc3QoIlJlc291cmNlIiksIGZhbHNlKSwgCisJRU1QVFlfUEFZTE9BRE5BTUUoInRvc2NhLm5vZGVzLmVtcHR5X3BheWxvYWROYW1lIiwgIm1pc3NpbmdfcGF5bG9hZE5hbWUiLyogImVtcHR5X3BheWxvYWROYW1lIiAqLywgQWN0aW9uU3RhdHVzLklOVkFMSURfVE9TQ0FfRklMRV9FWFRFTlNJT04sIG51bGwsIGZhbHNlKSwKKwlFTVBUWV9UQUcoInRvc2NhLm5vZGVzLmVtcHR5X3RhZyIsICJlbXB0eV90YWciLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQsIEFycmF5cy5hc0xpc3QoIlJlc291cmNlIiwgInRhZyIpLCBmYWxzZSksIAorCVZBTElEQVRFX1BST1BPUlRJRVNfMSgidG9zY2Eubm9kZXMudmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlSW5pdCIsICJ2YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVJbml0IiwgQWN0aW9uU3RhdHVzLklOVkFMSURfREVGQVVMVF9WQUxVRSwgQXJyYXlzLmFzTGlzdCgidmFsaWRhdGlvbl90ZXN0IiwgImJvb2xlYW4iLCAiMTIzNDU2IiksIGZhbHNlKSwgCisJVkFMSURBVEVfUFJPUE9SVElFU18yKCJ0b3NjYS5ub2Rlcy52YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVTdHJpbmciLCAidmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nIiwgQWN0aW9uU3RhdHVzLklOVkFMSURfREVGQVVMVF9WQUxVRSwgQXJyYXlzLmFzTGlzdCgidmFsaWRhdGlvbl90ZXN0IiwgImJvb2xlYW4iLCAiYWJjZCIpLCBmYWxzZSksIAorCVZBTElEQVRFX1BST1BPUlRJRVNfMygidG9zY2Eubm9kZXMudmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4iLCAidmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4iLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9ERUZBVUxUX1ZBTFVFLCBBcnJheXMuYXNMaXN0KCJ2YWxpZGF0aW9uX3Rlc3QiLCAiZmxvYXQiLCAidHJ1ZSIpLCBmYWxzZSksIAorCVZBTElEQVRFX1BST1BPUlRJRVNfNCgidG9zY2Eubm9kZXMudmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZyIsICJ2YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlU3RyaW5nIiwgQWN0aW9uU3RhdHVzLklOVkFMSURfREVGQVVMVF9WQUxVRSwgQXJyYXlzLmFzTGlzdCgidmFsaWRhdGlvbl90ZXN0IiwgImZsb2F0IiwgImFiY2QiKSwgZmFsc2UpLCAKKwlWQUxJREFURV9QUk9QT1JUSUVTXzUoInRvc2NhLm5vZGVzLnZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4iLCAidmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlQm9vbGVhbiIsIEFjdGlvblN0YXR1cy5JTlZBTElEX0RFRkFVTFRfVkFMVUUsIEFycmF5cy5hc0xpc3QoInZhbGlkYXRpb25fdGVzdCIsICJpbnRlZ2VyIiwgInRydWUiKSwgZmFsc2UpLCAKKwlWQUxJREFURV9QUk9QT1JUSUVTXzYoInRvc2NhLm5vZGVzLnZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0IiwgInZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0IiwgQWN0aW9uU3RhdHVzLklOVkFMSURfREVGQVVMVF9WQUxVRSwgQXJyYXlzLmFzTGlzdCgidmFsaWRhdGlvbl90ZXN0IiwgImludGVnZXIiLCAiMC4xMjMiKSwgZmFsc2UpLCAKKwlWQUxJREFURV9QUk9QT1JUSUVTXzcoInRvc2NhLm5vZGVzLnZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZyIsICJ2YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVTdHJpbmciLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9ERUZBVUxUX1ZBTFVFLCBBcnJheXMuYXNMaXN0KCJ2YWxpZGF0aW9uX3Rlc3QiLCAiaW50ZWdlciIsICJhYmNkIiksIGZhbHNlKTsKKwkvLyBWQUxJREFURV9QUk9QT1JUSUVTXzgoInRvc2NhLm5vZGVzLnZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcyIsInZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcyIsIEFjdGlvblN0YXR1cy5PSywgbnVsbCwgZmFsc2UpOworCisJcHJpdmF0ZSBTdHJpbmcgbm9ybWF0aXZlTmFtZTsKKwlwcml2YXRlIFN0cmluZyBmb2xkZXJOYW1lOworCXByaXZhdGUgQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1czsKKwlwcml2YXRlIEJvb2xlYW4gdmFsaWRhdGVBdWRpdDsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBlcnJvclBhcmFtczsKKwlwcml2YXRlIEJvb2xlYW4gdmFsaWRhdGVZYW1sOworCisJLy8gcHJpdmF0ZSBlbnVtIEFjdGlvblN0YXR1czsKKworCXByaXZhdGUgSW1wb3J0VGVzdFR5cGVzRW51bShTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgZm9sZGVyTmFtZSwgQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywKKwkJCUxpc3Q8U3RyaW5nPiBlcnJvclBhcmFtcywgQm9vbGVhbiB2YWxpZGF0ZUF1ZGl0KSB7CisJCXRoaXMubm9ybWF0aXZlTmFtZSA9IHJlc291cmNlTmFtZTsKKwkJdGhpcy5mb2xkZXJOYW1lID0gZm9sZGVyTmFtZTsKKwkJdGhpcy5hY3Rpb25TdGF0dXMgPSBhY3Rpb25TdGF0dXM7CisJCXRoaXMuZXJyb3JQYXJhbXMgPSBlcnJvclBhcmFtczsKKwkJdGhpcy52YWxpZGF0ZUF1ZGl0ID0gdmFsaWRhdGVBdWRpdDsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Tm9ybWF0aXZlTmFtZSgpIHsKKwkJcmV0dXJuIG5vcm1hdGl2ZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gZm9sZGVyTmFtZTsKKwl9CisKKwlwdWJsaWMgQWN0aW9uU3RhdHVzIGdldEFjdGlvblN0YXR1cygpIHsKKwkJcmV0dXJuIGFjdGlvblN0YXR1czsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXR2YWxpZGF0ZUF1ZGl0KCkgeworCQlyZXR1cm4gdmFsaWRhdGVBdWRpdDsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEVycm9yUGFyYW1zKCkgeworCQlyZXR1cm4gZXJyb3JQYXJhbXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0xpZmVDeWNsZVN0YXRlc0VudW0uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvTGlmZUN5Y2xlU3RhdGVzRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzMwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL0xpZmVDeWNsZVN0YXRlc0VudW0uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zOworCitwdWJsaWMgZW51bSBMaWZlQ3ljbGVTdGF0ZXNFbnVtIHsKKworCUNIRUNLT1VUKCJjaGVja291dCIsICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiksIAorCUNIRUNLSU4oImNoZWNraW4iLCAiTk9UX0NFUlRJRklFRF9DSEVDS0lOIiksIAorCUNFUlRJRklDQVRJT05SRVFVRVNUKCJjZXJ0aWZpY2F0aW9uUmVxdWVzdCIsICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiIpLCAKKwlVTkRPQ0hFQ0tPVVQoInVuZG9DaGVja291dCIsICIiKSwgCisJQ0FOQ0VMQ0VSVElGSUNBVElPTigiY2FuY2VsQ2VydGlmaWNhdGlvbiIsICIiKSwgCisJU1RBUlRDRVJUSUZJQ0FUSU9OKCJzdGFydENlcnRpZmljYXRpb24iLCAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyIpLCAKKwlGQUlMQ0VSVElGSUNBVElPTigiZmFpbENlcnRpZmljYXRpb24iLCAiIiksIAorCUNFUlRJRlkoImNlcnRpZnkiLCAiQ0VSVElGSUVEIik7CisKKwlwcml2YXRlIFN0cmluZyBzdGF0ZTsKKwlwcml2YXRlIFN0cmluZyBjb21wb25lbnRTdGF0ZTsKKworCXByaXZhdGUgTGlmZUN5Y2xlU3RhdGVzRW51bShTdHJpbmcgc3RhdGUsIFN0cmluZyBjb21wb25lbnRTdGF0ZSkgeworCQl0aGlzLnN0YXRlID0gc3RhdGU7CisJCXRoaXMuY29tcG9uZW50U3RhdGUgPSBjb21wb25lbnRTdGF0ZTsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisJCXJldHVybiBzdGF0ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFN0YXRlKCkgeworCQlyZXR1cm4gY29tcG9uZW50U3RhdGU7CisJfQorCisJcHVibGljIHN0YXRpYyBMaWZlQ3ljbGVTdGF0ZXNFbnVtIGZpbmRCeUNvbXBTdGF0ZShTdHJpbmcgY29tcFN0YXRlKSB7CisKKwkJZm9yIChMaWZlQ3ljbGVTdGF0ZXNFbnVtIGxpZmVDeWNsZVN0YXRlc0VudW0gOiBMaWZlQ3ljbGVTdGF0ZXNFbnVtLnZhbHVlcygpKSB7CisJCQlpZiAobGlmZUN5Y2xlU3RhdGVzRW51bS5nZXRDb21wb25lbnRTdGF0ZSgpLmVxdWFscyhjb21wU3RhdGUpKSB7CisJCQkJcmV0dXJuIGxpZmVDeWNsZVN0YXRlc0VudW07CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlmZUN5Y2xlU3RhdGVzRW51bSBmaW5kQnlTdGF0ZShTdHJpbmcgc3RhdGUpIHsKKworCQlmb3IgKExpZmVDeWNsZVN0YXRlc0VudW0gbGlmZUN5Y2xlU3RhdGVzRW51bSA6IExpZmVDeWNsZVN0YXRlc0VudW0udmFsdWVzKCkpIHsKKwkJCWlmIChsaWZlQ3ljbGVTdGF0ZXNFbnVtLm5hbWUoKS5lcXVhbHMoc3RhdGUpKSB7CisJCQkJcmV0dXJuIGxpZmVDeWNsZVN0YXRlc0VudW07CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9NYW5kYXRvcnlSZXNvdXJjZUFydGlmYWN0VHlwZUVudW0uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvTWFuZGF0b3J5UmVzb3VyY2VBcnRpZmFjdFR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2OWQxOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvTWFuZGF0b3J5UmVzb3VyY2VBcnRpZmFjdFR5cGVFbnVtLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworCitwdWJsaWMgZW51bSBNYW5kYXRvcnlSZXNvdXJjZUFydGlmYWN0VHlwZUVudW0geworCisJVEVTVF9TQ1JJUFRTKG51bGwsICJ0ZXN0c2NyaXB0cyIpLCAKKwlGRUFUVVJFUyhudWxsLCAiZmVhdHVyZXMiKSwgCisJQ0FQQUNJVFkobnVsbCwgImNhcGFjaXR5IiksIAorCVZFTkRPUl9URVNUX1JFU1VMVChudWxsLCJ2ZW5kb3J0ZXN0cmVzdWx0IiksIAorCUNMT1VEX1FVRVNUSU9OTkFJUkUobnVsbCwgImNsb3VkcXVlc3Rpb25uYWlyZSIpOworCisJU3RyaW5nIGFydGlmYWN0TmFtZTsKKwlTdHJpbmcgbG9naWNhbE5hbWU7CisKKwlwcml2YXRlIE1hbmRhdG9yeVJlc291cmNlQXJ0aWZhY3RUeXBlRW51bShTdHJpbmcgYXJ0aWZhY3ROYW1lLCBTdHJpbmcgbG9naWNhbE5hbWUpIHsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJCXRoaXMubG9naWNhbE5hbWUgPSBsb2dpY2FsTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxOYW1lKCkgeworCQlyZXR1cm4gbG9naWNhbE5hbWU7CisJfQorCisJcHVibGljIEFydGlmYWN0R3JvdXBUeXBlRW51bSBnZXRHcm91cFR5cGUoKSB7CisJCXJldHVybiBBcnRpZmFjdEdyb3VwVHlwZUVudW0uSU5GT1JNQVRJT05BTDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvTWFuZGF0b3J5U2VydmljZUFydGlmYWN0VHlwZUVudW0uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvTWFuZGF0b3J5U2VydmljZUFydGlmYWN0VHlwZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzNkNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9NYW5kYXRvcnlTZXJ2aWNlQXJ0aWZhY3RUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBlbnVtIE1hbmRhdG9yeVNlcnZpY2VBcnRpZmFjdFR5cGVFbnVtIHsKKworCU1FU1NBR0VfRkxPV1MobnVsbCwgIm1lc3NhZ2VmbG93cyIudG9Mb3dlckNhc2UoKSwgIk1lc3NhZ2UgRmxvd3MiKSwgCisJSU5TVEFOVF9GTE9XUyhudWxsLCAiaW5zdGFudGlhdGlvbmZsb3dzIi50b0xvd2VyQ2FzZSgpLCAiTWFuYWdlbWVudCBGbG93cyIpLCAKKwlTRVJWSUNFX0FSVF9QTEFOKG51bGwsICJzZXJ2aWNlYXJ0aWZhY3RwbGFuIi50b0xvd2VyQ2FzZSgpLCAiU2VydmljZSBBcnRpZmFjdCBQbGFuIiksIAorCVNVTV9PRl9FTEVNRU5UUyhudWxsLCAic3VtbWFyeW9maW1wYWN0c3RvZWNvbXBlbGVtZW50cyIudG9Mb3dlckNhc2UoKSwgIlN1bW1hcnkgb2YgaW1wYWN0cyB0byBFQ09NUCBlbGVtZW50cyxPU1NzLCBCU1NzIiksIAorCUNPTlRST0xfTE9PUF9GVU4obnVsbCwgImNvbnRyb2xsb29wZnVuY3Rpb25zIi50b0xvd2VyQ2FzZSgpLCAiQ29udHJvbCBMb29wIEZ1bmN0aW9ucyIpLCAKKwlESU1FTlNJT05OSU5HX0lORk8obnVsbCwgImRpbWVuc2lvbmluZ2luZm8iLnRvTG93ZXJDYXNlKCksICJEaW1lbnNpb25pbmcgSW5mbyIpLCAKKwlBRkZJTklUWV9SVUxFUyhudWxsLCAiYWZmaW5pdHlydWxlcyIudG9Mb3dlckNhc2UoKSwgIkFmZmluaXR5IFJ1bGVzIiksIAorCU9QRVJBVElPTkFMX1BPTElDSUVTKG51bGwsICJvcGVyYXRpb25hbHBvbGljaWVzIi50b0xvd2VyQ2FzZSgpLCAiT3BlcmF0aW9uYWwgUG9saWNpZXMiKSwgCisJU0VSVklDRV9TUEVDSUZJQ19QT0xJQ0lFUyhudWxsLCAic2VydmljZXNwZWNpZmljcG9saWNpZXMiLnRvTG93ZXJDYXNlKCksICJTZXJ2aWNlLXNwZWNpZmljIFBvbGljaWVzIiksIAorCUVOR0lORUVSSU5HX1JVTEVTKG51bGwsICJlbmdpbmVlcmluZ3J1bGVzIi50b0xvd2VyQ2FzZSgpLCAiRW5naW5lZXJpbmcgUnVsZXMgKEVSRCkiKSwgCisJRElTVFJJQl9JTlNUUlVDVElPTlMobnVsbCwgImRpc3RyaWJ1dGlvbmluc3RydWN0aW9ucyIudG9Mb3dlckNhc2UoKSwgIkRpc3RyaWJ1dGlvbiBJbnN0cnVjdGlvbnMiKSwgCisJREVQTE9ZTUVOVF9WT1RJTkdfUkVDKG51bGwsICJkZXBsb3ltZW50dm90aW5ncmVjb3JkIi50b0xvd2VyQ2FzZSgpLCAiRGVwbG95bWVudCBWb3RpbmcgUmVjb3JkIiksIAorCUNFUlRJRklDQVRJT05fVEVTVF9SRVNVTFQobnVsbCwgImNlcnRpZmljYXRpb250ZXN0cmVzdWx0cyIudG9Mb3dlckNhc2UoKSwgIlREIENlcnRpZmljYXRpb24gVGVzdCBSZXN1bHRzIik7CisJLy8gU0VSVklDRV9RVUVTVElPTk5BSVJFKG51bGwsICJzZXJ2aWNlUXVlc3Rpb25uYWlyZSIudG9Mb3dlckNhc2UoKSk7CisKKwlTdHJpbmcgYXJ0aWZhY3ROYW1lOworCVN0cmluZyBsb2dpY2FsTmFtZTsKKwlTdHJpbmcgYXJ0aWZhY3REaXNwbGF5TmFtZTsKKworCXByaXZhdGUgTWFuZGF0b3J5U2VydmljZUFydGlmYWN0VHlwZUVudW0oU3RyaW5nIGFydGlmYWN0TmFtZSwgU3RyaW5nIGxvZ2ljYWxOYW1lLCBTdHJpbmcgYXJ0aWZhY3REaXNwbGF5TmFtZSkgeworCQl0aGlzLmFydGlmYWN0TmFtZSA9IGFydGlmYWN0TmFtZTsKKwkJdGhpcy5sb2dpY2FsTmFtZSA9IGxvZ2ljYWxOYW1lOworCQl0aGlzLmFydGlmYWN0RGlzcGxheU5hbWUgPSBhcnRpZmFjdERpc3BsYXlOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3ROYW1lKCkgeworCQlyZXR1cm4gYXJ0aWZhY3ROYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbE5hbWUoKSB7CisJCXJldHVybiBsb2dpY2FsTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGlzcGxheU5hbWUoKSB7CisJCXJldHVybiBhcnRpZmFjdERpc3BsYXlOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGlzcGxheU5hbWUoU3RyaW5nIGFydGlmYWN0RGlzcGxheU5hbWUpIHsKKwkJdGhpcy5hcnRpZmFjdERpc3BsYXlOYW1lID0gYXJ0aWZhY3REaXNwbGF5TmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvTm9ybWF0aXZlVHlwZXNFbnVtLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL05vcm1hdGl2ZVR5cGVzRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2ZjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL05vcm1hdGl2ZVR5cGVzRW51bS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBlbnVtIE5vcm1hdGl2ZVR5cGVzRW51bSB7CisJUk9PVCgidG9zY2Eubm9kZXMuUm9vdCIsICJyb290IiksIAorCUNPTVBVVEUoInRvc2NhLm5vZGVzLkNvbXB1dGUiLCAiY29tcHV0ZSIpLCAKKwlCTE9DS19TVE9SQUdFKCJ0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UiLCAiYmxvY2tTdG9yYWdlIiksIAorCUNPTlRBSU5FUl9BUFBMSUNBVElPTigidG9zY2Eubm9kZXMuQ29udGFpbmVyLkFwcGxpY2F0aW9uIiwgImNvbnRhaW5lckFwcGxpY2F0aW9uIiksIAorCUNPTlRBSU5FUl9SVU5USU1FKCJ0b3NjYS5ub2Rlcy5Db250YWluZXIuUnVudGltZSIsICJjb250YWluZXJSdW50aW1lIiksIAorCURBVEFCQVNFKCJ0b3NjYS5ub2Rlcy5EYXRhYmFzZSIsICJkYXRhYmFzZSIpLCAKKwlEQk1TKCJ0b3NjYS5ub2Rlcy5EQk1TIiwgIkRCTVMiKSwgCisJTE9BRF9CQUxBTkNFUigidG9zY2Eubm9kZXMuTG9hZEJhbGFuY2VyIiwgImxvYWRCYWxhbmNlciIpLCAKKwlPQkpFQ1RfU1RPUkFHRSgidG9zY2Eubm9kZXMuT2JqZWN0U3RvcmFnZSIsICJvYmplY3RTdG9yYWdlIiksIAorCU5FVFdPUksoInRvc2NhLm5vZGVzLm5ldHdvcmsuTmV0d29yayIsICJuZXR3b3JrIiksIAorCVBPUlQoInRvc2NhLm5vZGVzLm5ldHdvcmsuUG9ydCIsICJwb3J0IiksIAorCVNPRlRXQVJFX0NPTVBPTkVOVCgidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiLCAic29mdHdhcmVDb21wb25lbnQiKSwKKyAgICBXRUJfQVBQTElDQVRJT04oInRvc2NhLm5vZGVzLndlYmFwcGxpY2F0aW9uIiwgIndlYkFwcGxpY2F0aW9uIiksCisgICAgV0VCX1NFUlZFUigidG9zY2Eubm9kZXMuV2ViU2VydmVyIiwgIndlYlNlcnZlciIpOworCQorCXB1YmxpYyBTdHJpbmcgbm9ybWF0aXZlTmFtZTsKKwlwcml2YXRlIFN0cmluZyBmb2xkZXJOYW1lOworCisJcHJpdmF0ZSBOb3JtYXRpdmVUeXBlc0VudW0oU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIGZvbGRlck5hbWUpIHsKKwkJdGhpcy5ub3JtYXRpdmVOYW1lID0gcmVzb3VyY2VOYW1lOworCQl0aGlzLmZvbGRlck5hbWUgPSBmb2xkZXJOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Tm9ybWF0aXZlTmFtZSgpIHsKKwkJcmV0dXJuIG5vcm1hdGl2ZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gZm9sZGVyTmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvUHJvcGVydHlUeXBlRW51bS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9Qcm9wZXJ0eVR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhYzMyNgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvUHJvcGVydHlUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworCitwdWJsaWMgZW51bSBQcm9wZXJ0eVR5cGVFbnVtIHsKKwlJTlRFR0VSKCJkZWZhdWx0SW50ZWdlclByb3BOYW1lMSIsICJpbnRlZ2VyIiwgIjEyNSIsICJkZWZhdWx0IGludGVnZXIgdHlwZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbiIsIG51bGwpLCAKKwlTVFJJTkcoImRlZmF1bHRTdHJpbmdQcm9wTmFtZTEiLCAic3RyaW5nIiwgInN0cmluZyIsICJkZWZhdWx0IHN0cmluZyB0eXBlIHByb3BlcnR5IGRlc2NyaXB0aW9uIiwgbnVsbCksIAorCUJPT0xFQU4oImRlZmF1bHRCb29sZWFuUHJvcE5hbWUxIiwgImJvb2xlYW4iLCAidHJ1ZSIsICJkZWZhdWx0IGJvb2xlYW4gdHlwZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbiIsIG51bGwpLCAKKwlTVFJJTkdfTElTVCgiZGVmYXVsdFN0cmluZ0xpc3RQcm9wTmFtZSIsICJsaXN0IiwgIlthLGJdIiwgIm91dGVyIGRlc2NyaXB0aW9uIiwgZ2V0RGVmYXVsdFN0cmluZ1NjaGVtYShUb3NjYVByb3BlcnR5VHlwZS5TVFJJTkcuZ2V0VHlwZSgpKSksIAorCUlOVEVHRVJfTElTVCgiZGVmYXVsdEludGVnZXJMaXN0UHJvcE5hbWUiLCAibGlzdCIsICJbMSwyXSIsICJvdXRlciBkZXNjcmlwdGlvbiIsIGdldERlZmF1bHRTdHJpbmdTY2hlbWEoVG9zY2FQcm9wZXJ0eVR5cGUuSU5URUdFUi5nZXRUeXBlKCkpKSwgCisJQk9PTEVBTl9MSVNUKCJkZWZhdWx0Qm9vbGVhbkxpc3RQcm9wTmFtZSIsICJsaXN0IiwgIlt0cnVlLGZhbHNlXSIsICJvdXRlciBkZXNjcmlwdGlvbiIsIGdldERlZmF1bHRTdHJpbmdTY2hlbWEoVG9zY2FQcm9wZXJ0eVR5cGUuQk9PTEVBTi5nZXRUeXBlKCkpKSwgCisJRkxPQVRfTElTVCgiZGVmYXVsdEZsb2F0TWFwUHJvcE5hbWUiLCAibGlzdCIsICJbMS4wLDIuMF0iLCAib3V0ZXIgZGVzY3JpcHRpb24iLCBnZXREZWZhdWx0U3RyaW5nU2NoZW1hKFRvc2NhUHJvcGVydHlUeXBlLkZMT0FULmdldFR5cGUoKSkpLCAKKwlTVFJJTkdfTUFQKCJkZWZhdWx0U3RyaW5nTWFwUHJvcE5hbWUiLCAibWFwIiwgIntcImtleTFcIjp2YWwxICwgXCJrZXkyXCI6dmFsMn0iLCAib3V0ZXIgZGVzY3JpcHRpb24iLCBnZXREZWZhdWx0U3RyaW5nU2NoZW1hKFRvc2NhUHJvcGVydHlUeXBlLlNUUklORy5nZXRUeXBlKCkpKSwgCisJSU5URUdFUl9NQVAoImRlZmF1bHRJbnRlZ2VyTWFwUHJvcE5hbWUiLCAibWFwIiwgIntcImtleTFcIjoxMjMgLCBcImtleTJcIjotNDU2fSIsICJvdXRlciBkZXNjcmlwdGlvbiIsIGdldERlZmF1bHRTdHJpbmdTY2hlbWEoVG9zY2FQcm9wZXJ0eVR5cGUuSU5URUdFUi5nZXRUeXBlKCkpKSwgCisJQk9PTEVBTl9NQVAoImRlZmF1bHRCb29sZWFuTWFwUHJvcE5hbWUiLCAibWFwIiwgIntcImtleTFcIjp0cnVlICwgXCJrZXkyXCI6ZmFsc2V9IiwgIm91dGVyIGRlc2NyaXB0aW9uIiwgZ2V0RGVmYXVsdFN0cmluZ1NjaGVtYShUb3NjYVByb3BlcnR5VHlwZS5CT09MRUFOLmdldFR5cGUoKSkpLCAKKwlGTE9BVF9NQVAoImRlZmF1bHRGbG9hdE1hcFByb3BOYW1lIiwgIm1hcCIsICJ7XCJrZXkxXCI6MC4yMTIzICwgXCJrZXkyXCI6NDMuNTQ1Zn0iLCAib3V0ZXIgZGVzY3JpcHRpb24iLCBnZXREZWZhdWx0U3RyaW5nU2NoZW1hKFRvc2NhUHJvcGVydHlUeXBlLkZMT0FULmdldFR5cGUoKSkpOworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCXByaXZhdGUgU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWFEZWZpbml0aW9uOworCisJcHJpdmF0ZSBQcm9wZXJ0eVR5cGVFbnVtKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVzY3JpcHRpb24sCisJCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYURlZmluaXRpb24pIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCXRoaXMuc2NoZW1hRGVmaW5pdGlvbiA9IHNjaGVtYURlZmluaXRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFNjaGVtYURlZmluaXRpb24gZ2V0U2NoZW1hRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIHNjaGVtYURlZmluaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0U2NoZW1hRGVmaW5pdGlvbihTY2hlbWFEZWZpbml0aW9uIHNjaGVtYURlZmluaXRpb24pIHsKKwkJdGhpcy5zY2hlbWFEZWZpbml0aW9uID0gc2NoZW1hRGVmaW5pdGlvbjsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTY2hlbWFEZWZpbml0aW9uIGdldERlZmF1bHRTdHJpbmdTY2hlbWEoU3RyaW5nIGlubmVyVHlwZSkgeworCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYSA9IG5ldyBTY2hlbWFEZWZpbml0aW9uKCk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJpbm5lciBkZXNjcmlwdGlvbiI7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkuc2V0VHlwZShpbm5lclR5cGUpOworCQlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCXNjaGVtYS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisJCXJldHVybiBzY2hlbWE7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL1Jlc291cmNlQ2F0ZWdvcnlFbnVtLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL1Jlc291cmNlQ2F0ZWdvcnlFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjZTc3YgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvUmVzb3VyY2VDYXRlZ29yeUVudW0uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zOworCitwdWJsaWMgZW51bSBSZXNvdXJjZUNhdGVnb3J5RW51bSB7CisKKwlORVRXT1JLX0wyXzNfUk9VVEVSUygiTmV0d29yayBMMi0zIiwgIlJvdXRlciIpLCBORVRXT1JLX0wyXzNfR0VURVdBWSgiTmV0d29yayBMMi0zIiwiR2F0ZXdheSIpLCBORVRXT1JLX0wyXzNfV0FOX0NPTk5FQ1RPUlMoIk5ldHdvcmsgTDItMyIsICJXQU4gQ29ubmVjdG9ycyIpLCBORVRXT1JLX0wyXzNfTEFOX0NPTk5FQ1RPUlMoIk5ldHdvcmsgTDItMyIsICJMQU4gQ29ubmVjdG9ycyIpLCAKKwlORVRXT1JLX0wyXzNfSU5GUkFTVFJVQ1RVUkUoIk5ldHdvcmsgTDItMyIsICJJbmZyYXN0cnVjdHVyZSIpLCBORVRXT1JLX0w0KCJOZXR3b3JrIEw0KyIsICJDb21tb24gTmV0d29yayBSZXNvdXJjZXMiKSwgQVBQTElDQVRJT05fTDRfQk9SREVSKCJBcHBsaWNhdGlvbiBMNCsiLCAiQm9yZGVyIEVsZW1lbnQiKSwgCisJQVBQTElDQVRJT05fTDRfQVBQX1NFUlZFUigiQXBwbGljYXRpb24gTDQrIiwgIkFwcGxpY2F0aW9uIFNlcnZlciIpLCBBUFBMSUNBVElPTl9MNF9XRUJfU0VSVkVSUygiQXBwbGljYXRpb24gTDQrIiwgIldlYiBTZXJ2ZXIiKSwgQVBQTElDQVRJT05fTDRfQ0FMTF9DT05UUk9MKCJBcHBsaWNhdGlvbiBMNCsiLCJDYWxsIENvbnRyb2wiKSwgCisJQVBQTElDQVRJT05fTDRfTUVESUFfU0VSVkVSKCJBcHBsaWNhdGlvbiBMNCsiLCAiTWVkaWEgU2VydmVycyIpLCBBUFBMSUNBVElPTl9MNF9MT0FEX0JBTEFOQ0VSKCJBcHBsaWNhdGlvbiBMNCsiLCAiTG9hZCBCYWxhbmNlciIpLCBBUFBMSUNBVElPTl9MNF9EQVRBQkFTRSgiQXBwbGljYXRpb24gTDQrIiwiRGF0YWJhc2UiKSwgCisJQVBQTElDQVRJT05fTDRfRklSRVdBTEwoIkFwcGxpY2F0aW9uIEw0KyIsICJGaXJld2FsbCIpLCBHRU5FUklDX0lORlJBU1RSVUNUVVJFKCJHZW5lcmljIiwgIkluZnJhc3RydWN0dXJlIiksIEdFTkVSSUNfQUJTVFJBQ1QoIkdlbmVyaWMiLCAiQWJzdHJhY3QiKSwgR0VORVJJQ19ORVRXT1JLX0VMRU1FTlRTKCJHZW5lcmljIiwiTmV0d29yayBFbGVtZW50cyIpLCAKKwlHRU5FUklDX0RBVEFCQVNFKCJHZW5lcmljIiwgIkRhdGFiYXNlIiksIE5FVFdPUktfQ09OTkVDVElWSVRZX0NPTl9QT0lOVCgiTmV0d29yayBDb25uZWN0aXZpdHkiLCAiQ29ubmVjdGlvbiBQb2ludHMiKSwgTkVUV09SS19DT05ORUNUSVZJVFlfVklSVFVBTF9MSU5LKCJOZXR3b3JrIENvbm5lY3Rpdml0eSIsIlZpcnR1YWwgTGlua3MiKTsKKworCXByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OworCXByaXZhdGUgU3RyaW5nIHN1YkNhdGVnb3J5OworCisJUmVzb3VyY2VDYXRlZ29yeUVudW0oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgc3ViQ2F0ZWdvcnkpIHsKKwkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OworCQl0aGlzLnN1YkNhdGVnb3J5ID0gc3ViQ2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdWJDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIHN1YkNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFN1YkNhdGVnb3J5KFN0cmluZyBzdWJDYXRlZ29yeSkgeworCQl0aGlzLnN1YkNhdGVnb3J5ID0gc3ViQ2F0ZWdvcnk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL1Jlc3BKc29uS2V5c0VudW0uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvUmVzcEpzb25LZXlzRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTBjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL1Jlc3BKc29uS2V5c0VudW0uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zOworCitwdWJsaWMgZW51bSBSZXNwSnNvbktleXNFbnVtIHsKKworCUlTX0FCU1RSQUNUKCJhYnN0cmFjdCIpLCAKKwlVTklRVUVfSUQoInVuaXF1ZUlkIiksIAorCVJFU09VUkNFX05BTUUoIm5hbWUiKSwgCisJUkVTT1VSQ0VfVkVSU0lPTigidmVyc2lvbiIpLCAKKwlUQUdTKCJ0YWdzIiksIAorCUxJRkVfQ1lDTEVfU1RBVEUoImxpZmVjeWNsZVN0YXRlIiksIAorCURFUklWRURfRlJPTSgiZGVyaXZlZEZyb20iKSwgCisJUkVTT1VSQ0VfREVTQygiZGVzY3JpcHRpb24iKSwgCisJVkVORE9SX05BTUUoInZlbmRvck5hbWUiKSwgCisJVkVORE9SX1JFTEVBU0UoInZlbmRvclJlbGVhc2UiKSwgCisJQ09OVEFDVF9JRCgiY29udGFjdElkIiksIAorCUlDT04oImljb24iKSwgCisJSElHSEVTVF9WRVJTSU9OKCJoaWdoZXN0VmVyc2lvbiIpLCAKKwlDUkVBVE9SX1VTRVJfSUQoImNyZWF0b3JVc2VySWQiKSwgCisJQ1JFQVRPUl9GVUxMX05BTUUoImNyZWF0b3JGdWxsTmFtZSIpLCAKKwlMQVNUX1VQREFURVJfQVRUX1VJRCgibGFzdFVwZGF0ZXJVc2VySWQiKSwgCisJTEFTVF9VUERBVEVSX0ZVTExfTkFNRSgibGFzdFVwZGF0ZXJGdWxsTmFtZSIpLCAKKwlBUlRJRkFDVFMoImFydGlmYWN0cyIpLCAKKwlERVNDUklQVElPTigiZGVzY3JpcHRpb24iKSwgCisJVVVJRCgidXVpZCIpLCAKKwlDT1NUKCJjb3N0IiksIAorCUxJQ0VOU0VfVFlQRSgibGljZW5zZVR5cGUiKSwgCisJUkVTT1VSQ0VfVFlQRSgicmVzb3VyY2VUeXBlIiksIAorCUNBVEVHT1JJRVMoImNhdGVnb3JpZXMiKTsKKwkKKwlwcml2YXRlIFN0cmluZyByZXNwSnNvbktleU5hbWU7CisKKwlwcml2YXRlIFJlc3BKc29uS2V5c0VudW0oU3RyaW5nIHJlc3BKc29uS2V5TmFtZSkgeworCQl0aGlzLnJlc3BKc29uS2V5TmFtZSA9IHJlc3BKc29uS2V5TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc3BKc29uS2V5TmFtZSgpIHsKKwkJcmV0dXJuIHJlc3BKc29uS2V5TmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvU2VydmljZUFwaUFydGlmYWN0RW51bS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9TZXJ2aWNlQXBpQXJ0aWZhY3RFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ZTFkNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvU2VydmljZUFwaUFydGlmYWN0RW51bS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBlbnVtIFNlcnZpY2VBcGlBcnRpZmFjdEVudW0geworCUNPTkZJR1VSQVRJT04oIkNvbmZpZ3VyYXRpb24iLnRvTG93ZXJDYXNlKCkpLCAKKwlJTlNUQU5USUFUSU9OKCJJbnN0YW50aWF0aW9uIi50b0xvd2VyQ2FzZSgpKSwKKwlNT05JVE9SSU5HKCJNb25pdG9yaW5nIi50b0xvd2VyQ2FzZSgpKSwgCisJUkVQT1JUSU5HKCJSZXBvcnRpbmciLnRvTG93ZXJDYXNlKCkpLCAKKwlMT0dHSU5HKCJMb2dnaW5nIi50b0xvd2VyQ2FzZSgpKSwgCisJVEVTVElORygiVGVzdGluZyIudG9Mb3dlckNhc2UoKSk7CisKKwlTdHJpbmcgbG9naWNhbE5hbWU7CisKKwlwcml2YXRlIFNlcnZpY2VBcGlBcnRpZmFjdEVudW0oU3RyaW5nIGxvZ2ljYWxOYW1lKSB7CisJCXRoaXMubG9naWNhbE5hbWUgPSBsb2dpY2FsTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxOYW1lKCkgeworCQlyZXR1cm4gbG9naWNhbE5hbWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9TZXJ2aWNlQ2F0ZWdvcmllc0VudW0uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvU2VydmljZUNhdGVnb3JpZXNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkNGU0OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvU2VydmljZUNhdGVnb3JpZXNFbnVtLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGVudW0gU2VydmljZUNhdGVnb3JpZXNFbnVtIHsKKworCVZPSVAoIlZvSVAgQ2FsbCBDb250cm9sIiksIE1PQklMSVRZKCJNb2JpbGl0eSIpLCBORVRXT1JLX0w0KCJOZXR3b3JrIEw0KyIpLCBORVRXT1JLX0wzKCJOZXR3b3JrIEwxLTMiKTsKKwlTdHJpbmcgdmFsdWU7CisKKwlwcml2YXRlIFNlcnZpY2VDYXRlZ29yaWVzRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9Ub3NjYUtleXNFbnVtLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2VudW1zL1Rvc2NhS2V5c0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODQ3OWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9Ub3NjYUtleXNFbnVtLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGVudW0gVG9zY2FLZXlzRW51bSB7CisKKwlUT1NDQV9ERUZJTklUSU9OX1ZFUlNJT04oInRvc2NhX2RlZmluaXRpb25zX3ZlcnNpb24iKSwgCisJTUVUQURBVEEoIm1ldGFkYXRhIiksIElNUE9SVFMoImltcG9ydHMiKSwgCisJTk9ERV9UWVBFUygibm9kZV90eXBlcyIpLCAKKwlUT1BPTE9HWV9URU1QTEFURSgidG9wb2xvZ3lfdGVtcGxhdGUiKTsKKworCXByaXZhdGUgU3RyaW5nIHRvc2NhS2V5OworCisJcHVibGljIFN0cmluZyBnZXRUb3NjYUtleSgpIHsKKwkJcmV0dXJuIHRvc2NhS2V5OworCX0KKworCXByaXZhdGUgVG9zY2FLZXlzRW51bShTdHJpbmcgdG9zY2FLZXkpIHsKKwkJdGhpcy50b3NjYUtleSA9IHRvc2NhS2V5OworCX0KKworCXB1YmxpYyBzdGF0aWMgVG9zY2FLZXlzRW51bSBmaW5kVG9zY2FLZXkoZmluYWwgU3RyaW5nIHRvc2NhS2V5KSB7CisJCWZvciAoVG9zY2FLZXlzRW51bSB0b3NjYUtleUVudW0gOiBUb3NjYUtleXNFbnVtLnZhbHVlcygpKSB7CisJCQlpZiAodG9zY2FLZXlFbnVtLmdldFRvc2NhS2V5KCkuZXF1YWxzSWdub3JlQ2FzZSh0b3NjYUtleSkpIHsKKwkJCQlyZXR1cm4gdG9zY2FLZXlFbnVtOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnVtcy9Vc2VyUm9sZUVudW0uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvVXNlclJvbGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5Nzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZW51bXMvVXNlclJvbGVFbnVtLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGVudW0gVXNlclJvbGVFbnVtIHsKKyAgICAKKwlBRE1JTigiamgwMDAzIiwiSmltbXkiLCAiSGVuZHJpeCIpLCBERVNJR05FUigiY3MwMDA4IiwiQ2FybG9zIiwgIlNhbnRhbmEiKSwgREVTSUdORVIyKCJtZTAwMDkiLCJNZWxpc3NhIiwgIkV0aGVyaWRnZSIpLCBURVNURVIoImptMDAwNyIsIkpvbmkiLCAiTWl0Y2hlbGwiKSxBRE1JTjQoImttMjAwMCIsIktvdCIsICJNYXkiKSwgR09WRVJOT1IoImd2MDAwMSIsIkRhdmlkIiwgIlNoYWRtaSIpLCAKKwlPUFMoIm9wMDAwMSIsIlN0ZXZlIiwgIlJlZ2V2IiksUFJPRFVDVF9TVFJBVEVHSVNUMSgicHMwMDAxIiwiRWRlbiIsICJSb3ppbiIpLFBST0RVQ1RfU1RSQVRFR0lTVDIoInBzMDAwMiIsIkVsbGEiLCAiS3ZldG55IiksUFJPRFVDVF9TVFJBVEVHSVNUMygicHMwMDAzIiwiR2V2YSIsICJBbG9uIiksIFBST0RVQ1RfTUFOQUdFUjEoInBtMDAwMSIsIlRlZGR5IiwgIklzYXNoYXIiKSwgCisJUFJPRFVDVF9NQU5BR0VSMigicG0wMDAyIiwiU2FyYWgiLCAiQmV0dGVucyIpOworCQorICAgIHByaXZhdGUgU3RyaW5nIHVzZXJJZDsKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWU7CisJcHJpdmF0ZSBVc2VyUm9sZUVudW0oU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHVzZXJOYW1lKSB7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCQl0aGlzLnVzZXJOYW1lID0gdXNlck5hbWU7CisJfQorCQorCXByaXZhdGUgVXNlclJvbGVFbnVtKFN0cmluZyB1c2VySWQsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworCQl0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKwkJdGhpcy5maXJzdE5hbWUgPWZpcnN0TmFtZTsKKwkJdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOworCQl0aGlzLnVzZXJOYW1lID0gZmlyc3ROYW1lKyIgIiArIGxhc3ROYW1lOworCX0KKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJJZCgpIHsKKwkJcmV0dXJuIHVzZXJJZDsKKwl9CisJcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyB1c2VySWQpIHsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJfQorCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7CisJCXJldHVybiB1c2VyTmFtZTsKKwl9CisJcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7CisJCXRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpIHsKKwkJcmV0dXJuIGZpcnN0TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkgeworCQl0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkgeworCQlyZXR1cm4gbGFzdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKSB7CisJCXRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKKwl9CisgICAgCisKK30KKworCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkQXJ0aWZhY3RBdWRpdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEFydGlmYWN0QXVkaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDRmMzUzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEFydGlmYWN0QXVkaXQuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZDsKKworcHVibGljIGNsYXNzIEV4cGVjdGVkQXJ0aWZhY3RBdWRpdCB7CisKKwlwcml2YXRlIFN0cmluZyBhY3Rpb247CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VOYW1lOworCXByaXZhdGUgU3RyaW5nIHJlc291cmNlVHlwZTsKKwlwcml2YXRlIFN0cmluZyBwcmV2VmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBjdXJyVmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBtb2RpZmllcjsKKwlwcml2YXRlIFN0cmluZyBwcmV2U3RhdGU7CisJcHJpdmF0ZSBTdHJpbmcgY3VyclN0YXRlOworCXByaXZhdGUgU3RyaW5nIHByZXZBcnRpZmFjdFV1aWQ7CisJcHJpdmF0ZSBTdHJpbmcgY3VyckFydGlmYWN0VXVpZDsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdERhdGE7CisJcHJpdmF0ZSBTdHJpbmcgc3RhdHVzOworCXByaXZhdGUgU3RyaW5nIGRlc2M7CisKKwlwdWJsaWMgRXhwZWN0ZWRBcnRpZmFjdEF1ZGl0KFN0cmluZyBhY3Rpb24sIFN0cmluZyByZXNvdXJjZU5hbWUsIFN0cmluZyByZXNvdXJjZVR5cGUsIFN0cmluZyBwcmV2VmVyc2lvbiwKKwkJCVN0cmluZyBjdXJyVmVyc2lvbiwgU3RyaW5nIG1vZGlmaWVyLCBTdHJpbmcgcHJldlN0YXRlLCBTdHJpbmcgY3VyclN0YXRlLCBTdHJpbmcgcHJldkFydGlmYWN0VXVpZCwKKwkJCVN0cmluZyBjdXJyQXJ0aWZhY3RVdWlkLCBTdHJpbmcgYXJ0aWZhY3REYXRhLCBTdHJpbmcgc3RhdHVzLCBTdHJpbmcgZGVzYykgeworCQlzdXBlcigpOworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwkJdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7CisJCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOworCQl0aGlzLnByZXZWZXJzaW9uID0gcHJldlZlcnNpb247CisJCXRoaXMuY3VyclZlcnNpb24gPSBjdXJyVmVyc2lvbjsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCQl0aGlzLnByZXZTdGF0ZSA9IHByZXZTdGF0ZTsKKwkJdGhpcy5jdXJyU3RhdGUgPSBjdXJyU3RhdGU7CisJCXRoaXMucHJldkFydGlmYWN0VXVpZCA9IHByZXZBcnRpZmFjdFV1aWQ7CisJCXRoaXMuY3VyckFydGlmYWN0VXVpZCA9IGN1cnJBcnRpZmFjdFV1aWQ7CisJCXRoaXMuYXJ0aWZhY3REYXRhID0gYXJ0aWZhY3REYXRhOworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgRXhwZWN0ZWRBcnRpZmFjdEF1ZGl0KCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgcmVzb3VyY2VUeXBlKSB7CisJCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJldlZlcnNpb24oKSB7CisJCXJldHVybiBwcmV2VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcmV2VmVyc2lvbihTdHJpbmcgcHJldlZlcnNpb24pIHsKKwkJdGhpcy5wcmV2VmVyc2lvbiA9IHByZXZWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3VyclZlcnNpb24oKSB7CisJCXJldHVybiBjdXJyVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXJyVmVyc2lvbihTdHJpbmcgY3VyclZlcnNpb24pIHsKKwkJdGhpcy5jdXJyVmVyc2lvbiA9IGN1cnJWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXIoKSB7CisJCXJldHVybiBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIpIHsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJldlN0YXRlKCkgeworCQlyZXR1cm4gcHJldlN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByZXZTdGF0ZShTdHJpbmcgcHJldlN0YXRlKSB7CisJCXRoaXMucHJldlN0YXRlID0gcHJldlN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3VyclN0YXRlKCkgeworCQlyZXR1cm4gY3VyclN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEN1cnJTdGF0ZShTdHJpbmcgY3VyclN0YXRlKSB7CisJCXRoaXMuY3VyclN0YXRlID0gY3VyclN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJldkFydGlmYWN0VXVpZCgpIHsKKwkJcmV0dXJuIHByZXZBcnRpZmFjdFV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJldkFydGlmYWN0VXVpZChTdHJpbmcgcHJldkFydGlmYWN0VXVpZCkgeworCQl0aGlzLnByZXZBcnRpZmFjdFV1aWQgPSBwcmV2QXJ0aWZhY3RVdWlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3VyckFydGlmYWN0VXVpZCgpIHsKKwkJcmV0dXJuIGN1cnJBcnRpZmFjdFV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3VyckFydGlmYWN0VXVpZChTdHJpbmcgY3VyckFydGlmYWN0VXVpZCkgeworCQl0aGlzLmN1cnJBcnRpZmFjdFV1aWQgPSBjdXJyQXJ0aWZhY3RVdWlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3REYXRhKCkgeworCQlyZXR1cm4gYXJ0aWZhY3REYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGF0YShTdHJpbmcgYXJ0aWZhY3REYXRhKSB7CisJCXRoaXMuYXJ0aWZhY3REYXRhID0gYXJ0aWZhY3REYXRhOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2YTVmMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZDsKKworcHVibGljIGNsYXNzIEV4cGVjdGVkQXV0aGVudGljYXRpb25BdWRpdCB7CisKKwlwcml2YXRlIFN0cmluZyB1cmw7CisJcHJpdmF0ZSBTdHJpbmcgcmVhbG07CisJcHJpdmF0ZSBTdHJpbmcgdXNlcjsKKwlwcml2YXRlIFN0cmluZyBhY3Rpb247CisJcHJpdmF0ZSBTdHJpbmcgYXV0aFN0YXR1czsKKworCXB1YmxpYyBFeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQoU3RyaW5nIHVybCwgU3RyaW5nIHVzZXIsIFN0cmluZyBhY3Rpb24sIFN0cmluZyBhdXRoU3RhdHVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudXJsID0gdXJsOworCQl0aGlzLnVzZXIgPSB1c2VyOworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwkJdGhpcy5hdXRoU3RhdHVzID0gYXV0aFN0YXR1czsKKwkJdGhpcy5yZWFsbSA9ICJBU0RDIjsKKwl9CisKKwlwdWJsaWMgRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0KCkgeworCisJfQorCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZWFsbSgpIHsKKwkJcmV0dXJuIHJlYWxtOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlYWxtKFN0cmluZyByZWFsbSkgeworCQl0aGlzLnJlYWxtID0gcmVhbG07CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VyKCkgeworCQlyZXR1cm4gdXNlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyKSB7CisJCXRoaXMudXNlciA9IHVzZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBdXRoU3RhdHVzKCkgeworCQlyZXR1cm4gYXV0aFN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBdXRoU3RhdHVzKFN0cmluZyBhdXRoU3RhdHVzKSB7CisJCXRoaXMuYXV0aFN0YXR1cyA9IGF1dGhTdGF0dXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJFeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQgW3VybD0iICsgdXJsICsgIiwgcmVhbG09IiArIHJlYWxtICsgIiwgdXNlcj0iICsgdXNlciArICIsIGFjdGlvbj0iICsgYWN0aW9uCisJCQkJKyAiLCBhdXRoU3RhdHVzPSIgKyBhdXRoU3RhdHVzICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZENhdGVnb3J5QXVkaXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExZjdmNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0LmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQ7CisKK3B1YmxpYyBjbGFzcyBFeHBlY3RlZENhdGVnb3J5QXVkaXQgeworCVN0cmluZyBhY3Rpb247CisJU3RyaW5nIG1vZGlmaWVyOworCVN0cmluZyBtb2RpZmllclVpZDsKKwlTdHJpbmcgbW9kaWZpZXJOYW1lOworCVN0cmluZyBjYXRlZ29yeU5hbWU7CisJU3RyaW5nIHN1YkNhdGVnb3J5TmFtZTsKKwlTdHJpbmcgZ3JvdXBpbmdOYW1lOworCVN0cmluZyByZXNvdXJjZVR5cGU7CisJU3RyaW5nIHN0YXR1czsKKwlTdHJpbmcgZGVzYzsKKwlTdHJpbmcgZGV0YWlsczsKKworCXB1YmxpYyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoU3RyaW5nIGFjdGlvbiwgU3RyaW5nIG1vZGlmaWVyLCBTdHJpbmcgY2F0ZWdvcnlOYW1lLCBTdHJpbmcgc3ViQ2F0ZWdvcnlOYW1lLAorCQkJU3RyaW5nIGdyb3VwaW5nTmFtZSwgU3RyaW5nIHJlc291cmNlVHlwZSwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGRlc2MpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwkJdGhpcy5jYXRlZ29yeU5hbWUgPSBjYXRlZ29yeU5hbWU7CisJCXRoaXMuc3ViQ2F0ZWdvcnlOYW1lID0gc3ViQ2F0ZWdvcnlOYW1lOworCQl0aGlzLmdyb3VwaW5nTmFtZSA9IGdyb3VwaW5nTmFtZTsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworCXB1YmxpYyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoKSB7CisJCWFjdGlvbiA9IG51bGw7CisJCW1vZGlmaWVyID0gbnVsbDsKKwkJY2F0ZWdvcnlOYW1lID0gbnVsbDsKKwkJc3ViQ2F0ZWdvcnlOYW1lID0gbnVsbDsKKwkJZ3JvdXBpbmdOYW1lID0gbnVsbDsKKwkJcmVzb3VyY2VUeXBlID0gbnVsbDsKKwkJc3RhdHVzID0gbnVsbDsKKwkJZGVzYyA9IG51bGw7CisJCWRldGFpbHMgPSBudWxsOworCQltb2RpZmllck5hbWUgPSBudWxsOworCQltb2RpZmllclVpZCA9IG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2RpZmllcigpIHsKKwkJcmV0dXJuIG1vZGlmaWVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyKFN0cmluZyBtb2RpZmllcikgeworCQl0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeU5hbWUoKSB7CisJCXJldHVybiBjYXRlZ29yeU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlOYW1lKFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKKwkJdGhpcy5jYXRlZ29yeU5hbWUgPSBjYXRlZ29yeU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdWJDYXRlZ29yeU5hbWUoKSB7CisJCXJldHVybiBzdWJDYXRlZ29yeU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3ViQ2F0ZWdvcnlOYW1lKFN0cmluZyBzdWJDYXRlZ29yeU5hbWUpIHsKKwkJdGhpcy5zdWJDYXRlZ29yeU5hbWUgPSBzdWJDYXRlZ29yeU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRHcm91cGluZ05hbWUoKSB7CisJCXJldHVybiBncm91cGluZ05hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JvdXBpbmdOYW1lKFN0cmluZyBncm91cGluZ05hbWUpIHsKKwkJdGhpcy5ncm91cGluZ05hbWUgPSBncm91cGluZ05hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXRhaWxzKCkgeworCQlyZXR1cm4gZGV0YWlsczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXRhaWxzKFN0cmluZyBkZXRhaWxzKSB7CisJCXRoaXMuZGV0YWlscyA9IGRldGFpbHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2RpZmllclVpZCgpIHsKKwkJcmV0dXJuIG1vZGlmaWVyVWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyVWlkKFN0cmluZyBtb2RpZmllclVpZCkgeworCQl0aGlzLm1vZGlmaWVyVWlkID0gbW9kaWZpZXJVaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2RpZmllck5hbWUoKSB7CisJCXJldHVybiBtb2RpZmllck5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJOYW1lKFN0cmluZyBtb2RpZmllck5hbWUpIHsKKwkJdGhpcy5tb2RpZmllck5hbWUgPSBtb2RpZmllck5hbWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTM1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkOworCitwdWJsaWMgY2xhc3MgRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCB7CisKKwlTdHJpbmcgYWN0aW9uOworCVN0cmluZyBjb25zdW1lcklkOworCVN0cmluZyByZXNvdXJjZVVybDsKKwlTdHJpbmcgc3RhdHVzOworCVN0cmluZyBkZXNjOworCisJcHVibGljIEV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQoU3RyaW5nIGFjdGlvbiwgU3RyaW5nIGNvbnN1bWVySWQsIFN0cmluZyByZXNvdXJjZVVybCwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGRlc2MpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJCXRoaXMuY29uc3VtZXJJZCA9IGNvbnN1bWVySWQ7CisJCXRoaXMucmVzb3VyY2VVcmwgPSByZXNvdXJjZVVybDsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb25zdW1lcklkKCkgeworCQlyZXR1cm4gY29uc3VtZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25zdW1lcklkKFN0cmluZyBjb25zdW1lcklkKSB7CisJCXRoaXMuY29uc3VtZXJJZCA9IGNvbnN1bWVySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVybCgpIHsKKwkJcmV0dXJuIHJlc291cmNlVXJsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVXJsKFN0cmluZyByZXNvdXJjZVVybCkgeworCQl0aGlzLnJlc291cmNlVXJsID0gcmVzb3VyY2VVcmw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDE0NzQyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZDsKKworcHVibGljIGNsYXNzIEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQgeworCisJU3RyaW5nIGFjdGlvbjsKKwlTdHJpbmcgbW9kaWZpZXI7CisJU3RyaW5nIGVjb21Vc2VyOworCVN0cmluZyBzdGF0dXM7CisJU3RyaW5nIGRlc2M7CisKKwlwdWJsaWMgRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdChTdHJpbmcgYWN0aW9uLCBTdHJpbmcgbW9kaWZpZXIsIFN0cmluZyBlY29tVXNlciwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGRlc2MpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwkJdGhpcy5lY29tVXNlciA9IGVjb21Vc2VyOworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCgpIHsKKwkJYWN0aW9uID0gbnVsbDsKKwkJbW9kaWZpZXIgPSBudWxsOworCQllY29tVXNlciA9IG51bGw7CisJCXN0YXR1cyA9IG51bGw7CisJCWRlc2MgPSBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXIoKSB7CisJCXJldHVybiBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIpIHsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RWNvbVVzZXIoKSB7CisJCXJldHVybiBlY29tVXNlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFY29tVXNlcihTdHJpbmcgZWNvbVVzZXIpIHsKKwkJdGhpcy5lY29tVXNlciA9IGVjb21Vc2VyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEV4dGVybmFsQXVkaXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4OWEzOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0LmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQ7CisKK3B1YmxpYyBjbGFzcyBFeHBlY3RlZEV4dGVybmFsQXVkaXQgeworCisJU3RyaW5nIEFDVElPTjsKKwlTdHJpbmcgQ09OU1VNRVJfSUQ7CisJU3RyaW5nIFJFU09VUkNFX1VSTDsKKwlTdHJpbmcgU1RBVFVTOworCVN0cmluZyBERVNDOworCVN0cmluZyBSRVNPVVJDRV9OQU1FOworCVN0cmluZyBSRVNPVVJDRV9UWVBFOworCVN0cmluZyBTRVJWSUNFX0lOU1RBTkNFX0lEOy8vIHJlc291cmNlLyBzZXJ2aWNlIFVVSUQKKwlTdHJpbmcgTU9ESUZJRVI7CisJU3RyaW5nIFBSRVZfQVJUSUZBQ1RfVVVJRDsKKwlTdHJpbmcgQ1VSUl9BUlRJRkFDVF9VVUlEOworCVN0cmluZyBBUlRJRkFDVF9EQVRBOworCisJcHVibGljIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCgpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJcHVibGljIFN0cmluZyBnZXRSRVNPVVJDRV9OQU1FKCkgeworCQlyZXR1cm4gUkVTT1VSQ0VfTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSRVNPVVJDRV9OQU1FKFN0cmluZyByRVNPVVJDRV9OQU1FKSB7CisJCVJFU09VUkNFX05BTUUgPSByRVNPVVJDRV9OQU1FOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UkVTT1VSQ0VfVFlQRSgpIHsKKwkJcmV0dXJuIFJFU09VUkNFX1RZUEU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UkVTT1VSQ0VfVFlQRShTdHJpbmcgckVTT1VSQ0VfVFlQRSkgeworCQlSRVNPVVJDRV9UWVBFID0gckVTT1VSQ0VfVFlQRTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNFUlZJQ0VfSU5TVEFOQ0VfSUQoKSB7CisJCXJldHVybiBTRVJWSUNFX0lOU1RBTkNFX0lEOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNFUlZJQ0VfSU5TVEFOQ0VfSUQoU3RyaW5nIHNFUlZJQ0VfSU5TVEFOQ0VfSUQpIHsKKwkJU0VSVklDRV9JTlNUQU5DRV9JRCA9IHNFUlZJQ0VfSU5TVEFOQ0VfSUQ7CisJfQorCisJcHVibGljIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdChTdHJpbmcgYUNUSU9OLCBTdHJpbmcgY09OU1VNRVJfSUQsIFN0cmluZyByRVNPVVJDRV9VUkwsIFN0cmluZyBzVEFUVVMsIFN0cmluZyBkRVNDLAorCQkJU3RyaW5nIHJFU09VUkNFX05BTUUsIFN0cmluZyByRVNPVVJDRV9UWVBFLCBTdHJpbmcgc0VSVklDRV9JTlNUQU5DRV9JRCkgeworCQlzdXBlcigpOworCQlBQ1RJT04gPSBhQ1RJT047CisJCUNPTlNVTUVSX0lEID0gY09OU1VNRVJfSUQ7CisJCVJFU09VUkNFX1VSTCA9IHJFU09VUkNFX1VSTDsKKwkJU1RBVFVTID0gc1RBVFVTOworCQlERVNDID0gZEVTQzsKKwkJUkVTT1VSQ0VfTkFNRSA9IHJFU09VUkNFX05BTUU7CisJCVJFU09VUkNFX1RZUEUgPSByRVNPVVJDRV9UWVBFOworCQlTRVJWSUNFX0lOU1RBTkNFX0lEID0gc0VSVklDRV9JTlNUQU5DRV9JRDsKKwl9CisKKwlwdWJsaWMgRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0KFN0cmluZyBhQ1RJT04sIFN0cmluZyBjT05TVU1FUl9JRCwgU3RyaW5nIHJFU09VUkNFX1VSTCwgU3RyaW5nIHNUQVRVUywgU3RyaW5nIGRFU0MpIHsKKwkJc3VwZXIoKTsKKwkJQUNUSU9OID0gYUNUSU9OOworCQlDT05TVU1FUl9JRCA9IGNPTlNVTUVSX0lEOworCQlSRVNPVVJDRV9VUkwgPSByRVNPVVJDRV9VUkw7CisJCVNUQVRVUyA9IHNUQVRVUzsKKwkJREVTQyA9IGRFU0M7CisJfQorCisJcHVibGljIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdChTdHJpbmcgYUNUSU9OLCBTdHJpbmcgY09OU1VNRVJfSUQsIFN0cmluZyByRVNPVVJDRV9VUkwsIFN0cmluZyBzVEFUVVMsIFN0cmluZyBkRVNDLAorCQkJU3RyaW5nIHJFU09VUkNFX05BTUUsIFN0cmluZyByRVNPVVJDRV9UWVBFLCBTdHJpbmcgc0VSVklDRV9JTlNUQU5DRV9JRCwgU3RyaW5nIG1PRElGSUVSLAorCQkJU3RyaW5nIHBSRVZfQVJUSUZBQ1RfVVVJRCwgU3RyaW5nIGNVUlJfQVJUSUZBQ1RfVVVJRCwgU3RyaW5nIGFSVElGQUNUX0RBVEEpIHsKKwkJc3VwZXIoKTsKKwkJQUNUSU9OID0gYUNUSU9OOworCQlDT05TVU1FUl9JRCA9IGNPTlNVTUVSX0lEOworCQlSRVNPVVJDRV9VUkwgPSByRVNPVVJDRV9VUkw7CisJCVNUQVRVUyA9IHNUQVRVUzsKKwkJREVTQyA9IGRFU0M7CisJCVJFU09VUkNFX05BTUUgPSByRVNPVVJDRV9OQU1FOworCQlSRVNPVVJDRV9UWVBFID0gckVTT1VSQ0VfVFlQRTsKKwkJU0VSVklDRV9JTlNUQU5DRV9JRCA9IHNFUlZJQ0VfSU5TVEFOQ0VfSUQ7CisJCU1PRElGSUVSID0gbU9ESUZJRVI7CisJCVBSRVZfQVJUSUZBQ1RfVVVJRCA9IHBSRVZfQVJUSUZBQ1RfVVVJRDsKKwkJQ1VSUl9BUlRJRkFDVF9VVUlEID0gY1VSUl9BUlRJRkFDVF9VVUlEOworCQlBUlRJRkFDVF9EQVRBID0gYVJUSUZBQ1RfREFUQTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFDVElPTigpIHsKKwkJcmV0dXJuIEFDVElPTjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBQ1RJT04oU3RyaW5nIGFDVElPTikgeworCQlBQ1RJT04gPSBhQ1RJT047CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDT05TVU1FUl9JRCgpIHsKKwkJcmV0dXJuIENPTlNVTUVSX0lEOworCX0KKworCXB1YmxpYyB2b2lkIHNldENPTlNVTUVSX0lEKFN0cmluZyBjT05TVU1FUl9JRCkgeworCQlDT05TVU1FUl9JRCA9IGNPTlNVTUVSX0lEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UkVTT1VSQ0VfVVJMKCkgeworCQlyZXR1cm4gUkVTT1VSQ0VfVVJMOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJFU09VUkNFX1VSTChTdHJpbmcgckVTT1VSQ0VfVVJMKSB7CisJCVJFU09VUkNFX1VSTCA9IHJFU09VUkNFX1VSTDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNUQVRVUygpIHsKKwkJcmV0dXJuIFNUQVRVUzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTVEFUVVMoU3RyaW5nIHNUQVRVUykgeworCQlTVEFUVVMgPSBzVEFUVVM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRERVNDKCkgeworCQlyZXR1cm4gREVTQzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRERVNDKFN0cmluZyBkRVNDKSB7CisJCURFU0MgPSBkRVNDOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TU9ESUZJRVIoKSB7CisJCXJldHVybiBNT0RJRklFUjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNT0RJRklFUihTdHJpbmcgbU9ESUZJRVIpIHsKKwkJTU9ESUZJRVIgPSBtT0RJRklFUjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBSRVZfQVJUSUZBQ1RfVVVJRCgpIHsKKwkJcmV0dXJuIFBSRVZfQVJUSUZBQ1RfVVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQUkVWX0FSVElGQUNUX1VVSUQoU3RyaW5nIHBSRVZfQVJUSUZBQ1RfVVVJRCkgeworCQlQUkVWX0FSVElGQUNUX1VVSUQgPSBwUkVWX0FSVElGQUNUX1VVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDVVJSX0FSVElGQUNUX1VVSUQoKSB7CisJCXJldHVybiBDVVJSX0FSVElGQUNUX1VVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q1VSUl9BUlRJRkFDVF9VVUlEKFN0cmluZyBjVVJSX0FSVElGQUNUX1VVSUQpIHsKKwkJQ1VSUl9BUlRJRkFDVF9VVUlEID0gY1VSUl9BUlRJRkFDVF9VVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QVJUSUZBQ1RfREFUQSgpIHsKKwkJcmV0dXJuIEFSVElGQUNUX0RBVEE7CisJfQorCisJcHVibGljIHZvaWQgc2V0QVJUSUZBQ1RfREFUQShTdHJpbmcgYVJUSUZBQ1RfREFUQSkgeworCQlBUlRJRkFDVF9EQVRBID0gYVJUSUZBQ1RfREFUQTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRHZXRVc2VyTGlzdEF1ZGl0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkR2V0VXNlckxpc3RBdWRpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MWI5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkR2V0VXNlckxpc3RBdWRpdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQ7CisKK3B1YmxpYyBjbGFzcyBFeHBlY3RlZEdldFVzZXJMaXN0QXVkaXQgeworCisJU3RyaW5nIGFjdGlvbjsKKwlTdHJpbmcgbW9kaWZpZXI7CisJU3RyaW5nIHN0YXR1czsKKwlTdHJpbmcgZGVzYzsKKwlTdHJpbmcgZGV0YWlsczsKKworCXB1YmxpYyBFeHBlY3RlZEdldFVzZXJMaXN0QXVkaXQoU3RyaW5nIGFjdGlvbiwgU3RyaW5nIG1vZGlmaWVyLCBTdHJpbmcgc3RhdHVzLCBTdHJpbmcgZGVzYywgU3RyaW5nIGRldGFpbHMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJCXRoaXMuZGV0YWlscyA9IGRldGFpbHM7CisJfQorCisJcHVibGljIEV4cGVjdGVkR2V0VXNlckxpc3RBdWRpdCgpIHsKKwkJYWN0aW9uID0gbnVsbDsKKwkJbW9kaWZpZXIgPSBudWxsOworCQlkZXRhaWxzID0gbnVsbDsKKwkJc3RhdHVzID0gbnVsbDsKKwkJZGVzYyA9IG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2RpZmllcigpIHsKKwkJcmV0dXJuIG1vZGlmaWVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyKFN0cmluZyBtb2RpZmllcikgeworCQl0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXRhaWxzKCkgeworCQlyZXR1cm4gZGV0YWlsczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXRhaWxzKFN0cmluZyBkZXRhaWxzKSB7CisJCXRoaXMuZGV0YWlscyA9IGRldGFpbHM7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkR3JvdXBpbmdBdWRpdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEdyb3VwaW5nQXVkaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDgxY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZEdyb3VwaW5nQXVkaXQuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZDsKKworcHVibGljIGNsYXNzIEV4cGVjdGVkR3JvdXBpbmdBdWRpdCB7CisJU3RyaW5nIGFjdGlvbjsKKwlTdHJpbmcgbW9kaWZpZXI7CisJU3RyaW5nIGNhdGVnb3J5TmFtZTsKKwlTdHJpbmcgc3ViQ2F0ZWdvcnlOYW1lOworCVN0cmluZyBncm91cGluZ05hbWU7CisJU3RyaW5nIHJlc291cmNlVHlwZTsKKwlTdHJpbmcgc3RhdHVzOworCVN0cmluZyBkZXNjOworCisJcHVibGljIEV4cGVjdGVkR3JvdXBpbmdBdWRpdChTdHJpbmcgYWN0aW9uLCBTdHJpbmcgbW9kaWZpZXIsIFN0cmluZyBjYXRlZ29yeU5hbWUsIFN0cmluZyBzdWJDYXRlZ29yeU5hbWUsCisJCQlTdHJpbmcgZ3JvdXBpbmdOYW1lLCBTdHJpbmcgcmVzb3VyY2VUeXBlLCBTdHJpbmcgc3RhdHVzLCBTdHJpbmcgZGVzYykgeworCQlzdXBlcigpOworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCQl0aGlzLmNhdGVnb3J5TmFtZSA9IGNhdGVnb3J5TmFtZTsKKwkJdGhpcy5zdWJDYXRlZ29yeU5hbWUgPSBzdWJDYXRlZ29yeU5hbWU7CisJCXRoaXMuZ3JvdXBpbmdOYW1lID0gZ3JvdXBpbmdOYW1lOworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJcHVibGljIEV4cGVjdGVkR3JvdXBpbmdBdWRpdCgpIHsKKwkJYWN0aW9uID0gbnVsbDsKKwkJbW9kaWZpZXIgPSBudWxsOworCQljYXRlZ29yeU5hbWUgPSBudWxsOworCQlzdWJDYXRlZ29yeU5hbWUgPSBudWxsOworCQlncm91cGluZ05hbWUgPSBudWxsOworCQlyZXNvdXJjZVR5cGUgPSBudWxsOworCQlzdGF0dXMgPSBudWxsOworCQlkZXNjID0gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyKCkgeworCQlyZXR1cm4gbW9kaWZpZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyKSB7CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeU5hbWUoU3RyaW5nIGNhdGVnb3J5TmFtZSkgeworCQl0aGlzLmNhdGVnb3J5TmFtZSA9IGNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN1YkNhdGVnb3J5TmFtZSgpIHsKKwkJcmV0dXJuIHN1YkNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdWJDYXRlZ29yeU5hbWUoU3RyaW5nIHN1YkNhdGVnb3J5TmFtZSkgeworCQl0aGlzLnN1YkNhdGVnb3J5TmFtZSA9IHN1YkNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEdyb3VwaW5nTmFtZSgpIHsKKwkJcmV0dXJuIGdyb3VwaW5nTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cGluZ05hbWUoU3RyaW5nIGdyb3VwaW5nTmFtZSkgeworCQl0aGlzLmdyb3VwaW5nTmFtZSA9IGdyb3VwaW5nTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRQcm9kdWN0QXVkaXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRQcm9kdWN0QXVkaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGI4NmZhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZFByb2R1Y3RBdWRpdC5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkOworCitwdWJsaWMgY2xhc3MgRXhwZWN0ZWRQcm9kdWN0QXVkaXQgeworCisJU3RyaW5nIEFDVElPTjsKKwlTdHJpbmcgTU9ESUZJRVI7CisJU3RyaW5nIFNUQVRVUzsKKwlTdHJpbmcgREVTQzsKKwlTdHJpbmcgUkVTT1VSQ0VfTkFNRTsKKwlTdHJpbmcgUkVTT1VSQ0VfVFlQRTsKKwlTdHJpbmcgUFJFVl9WRVJTSU9OOworCVN0cmluZyBDVVJSX1ZFUlNJT047CisJU3RyaW5nIFBSRVZfU1RBVEU7CisJU3RyaW5nIENVUlJfU1RBVEU7CisJU3RyaW5nIFRJTUVTVEFNUDsKKwlTdHJpbmcgU0VSVklDRV9JTlNUQU5DRV9JRDsKKwlTdHJpbmcgQ09NTUVOVDsKKworCXB1YmxpYyBTdHJpbmcgZ2V0Q09NTUVOVCgpIHsKKwkJcmV0dXJuIENPTU1FTlQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q09NTUVOVChTdHJpbmcgY09NTUVOVCkgeworCQlDT01NRU5UID0gY09NTUVOVDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNFUlZJQ0VfSU5TVEFOQ0VfSUQoKSB7CisJCXJldHVybiBTRVJWSUNFX0lOU1RBTkNFX0lEOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNFUlZJQ0VfSU5TVEFOQ0VfSUQoU3RyaW5nIHNFUlZJQ0VfSU5TVEFOQ0VfSUQpIHsKKwkJU0VSVklDRV9JTlNUQU5DRV9JRCA9IHNFUlZJQ0VfSU5TVEFOQ0VfSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBQ1RJT04oKSB7CisJCXJldHVybiBBQ1RJT047CisJfQorCisJcHVibGljIHZvaWQgc2V0QUNUSU9OKFN0cmluZyBhQ1RJT04pIHsKKwkJQUNUSU9OID0gYUNUSU9OOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TU9ESUZJRVIoKSB7CisJCXJldHVybiBNT0RJRklFUjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNT0RJRklFUihTdHJpbmcgbU9ESUZJRVIpIHsKKwkJTU9ESUZJRVIgPSBtT0RJRklFUjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNUQVRVUygpIHsKKwkJcmV0dXJuIFNUQVRVUzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTVEFUVVMoU3RyaW5nIHNUQVRVUykgeworCQlTVEFUVVMgPSBzVEFUVVM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRERVNDKCkgeworCQlyZXR1cm4gREVTQzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRERVNDKFN0cmluZyBkRVNDKSB7CisJCURFU0MgPSBkRVNDOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UkVTT1VSQ0VfTkFNRSgpIHsKKwkJcmV0dXJuIFJFU09VUkNFX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UkVTT1VSQ0VfTkFNRShTdHJpbmcgckVTT1VSQ0VfTkFNRSkgeworCQlSRVNPVVJDRV9OQU1FID0gckVTT1VSQ0VfTkFNRTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJFU09VUkNFX1RZUEUoKSB7CisJCXJldHVybiBSRVNPVVJDRV9UWVBFOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJFU09VUkNFX1RZUEUoU3RyaW5nIHJFU09VUkNFX1RZUEUpIHsKKwkJUkVTT1VSQ0VfVFlQRSA9IHJFU09VUkNFX1RZUEU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQUkVWX1ZFUlNJT04oKSB7CisJCXJldHVybiBQUkVWX1ZFUlNJT047CisJfQorCisJcHVibGljIHZvaWQgc2V0UFJFVl9WRVJTSU9OKFN0cmluZyBwUkVWX1ZFUlNJT04pIHsKKwkJUFJFVl9WRVJTSU9OID0gcFJFVl9WRVJTSU9OOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q1VSUl9WRVJTSU9OKCkgeworCQlyZXR1cm4gQ1VSUl9WRVJTSU9OOworCX0KKworCXB1YmxpYyB2b2lkIHNldENVUlJfVkVSU0lPTihTdHJpbmcgY1VSUl9WRVJTSU9OKSB7CisJCUNVUlJfVkVSU0lPTiA9IGNVUlJfVkVSU0lPTjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBSRVZfU1RBVEUoKSB7CisJCXJldHVybiBQUkVWX1NUQVRFOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBSRVZfU1RBVEUoU3RyaW5nIHBSRVZfU1RBVEUpIHsKKwkJUFJFVl9TVEFURSA9IHBSRVZfU1RBVEU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDVVJSX1NUQVRFKCkgeworCQlyZXR1cm4gQ1VSUl9TVEFURTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDVVJSX1NUQVRFKFN0cmluZyBjVVJSX1NUQVRFKSB7CisJCUNVUlJfU1RBVEUgPSBjVVJSX1NUQVRFOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VElNRVNUQU1QKCkgeworCQlyZXR1cm4gVElNRVNUQU1QOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRJTUVTVEFNUChTdHJpbmcgdElNRVNUQU1QKSB7CisJCVRJTUVTVEFNUCA9IHRJTUVTVEFNUDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzg3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2V4cGVjdGVkL0V4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZDsKKworcHVibGljIGNsYXNzIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgeworCisJU3RyaW5nIEFDVElPTjsKKwlTdHJpbmcgTU9ESUZJRVJfTkFNRTsKKwlTdHJpbmcgTU9ESUZJRVJfVUlEOworCVN0cmluZyBTVEFUVVM7CisJU3RyaW5nIERFU0M7CisJU3RyaW5nIFJFU09VUkNFX05BTUU7CisJU3RyaW5nIFJFU09VUkNFX1RZUEU7CisJU3RyaW5nIFBSRVZfVkVSU0lPTjsKKwlTdHJpbmcgQ1VSUl9WRVJTSU9OOworCVN0cmluZyBQUkVWX1NUQVRFOworCVN0cmluZyBDVVJSX1NUQVRFOworCVN0cmluZyBUSU1FU1RBTVA7CisJU3RyaW5nIEFSVElGQUNUX0RBVEE7CisJU3RyaW5nIERQUkVWX1NUQVRVUzsKKwlTdHJpbmcgRENVUlJfU1RBVFVTOworCVN0cmluZyBDT01NRU5UOworCVN0cmluZyBESUQ7CisJU3RyaW5nIFRPUElDX05BTUU7CisJU3RyaW5nIFRPU0NBX05PREVfVFlQRTsKKwlTdHJpbmcgQ1VSUl9BUlRJRkFDVF9VVUlEOworCVN0cmluZyBQUkVWX0FSVElGQUNUX1VVSUQ7CisJU3RyaW5nIEFSVElGQUNUX1RJTUVPVVQ7CisJU3RyaW5nIE1PRElGSUVSOworCVN0cmluZyBTRVJWSUNFX0lOU1RBTkNFX0lEOworCVN0cmluZyBDT05TVU1FUl9JRDsKKwlTdHJpbmcgUkVTT1VSQ0VfVVJMOworCisJcHVibGljIFN0cmluZyBnZXRDT05TVU1FUl9JRCgpIHsKKwkJcmV0dXJuIENPTlNVTUVSX0lEOworCX0KKworCXB1YmxpYyB2b2lkIHNldENPTlNVTUVSX0lEKFN0cmluZyBjb25zdW1lcl9pZCkgeworCQlDT05TVU1FUl9JRCA9IGNvbnN1bWVyX2lkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UkVTT1VSQ0VfVVJMKCkgeworCQlyZXR1cm4gUkVTT1VSQ0VfVVJMOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJFU09VUkNFX1VSTChTdHJpbmcgcmVzb3VyY2VfdXJsKSB7CisJCVJFU09VUkNFX1VSTCA9IHJlc291cmNlX3VybDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNFUlZJQ0VfSU5TVEFOQ0VfSUQoKSB7CisJCXJldHVybiBTRVJWSUNFX0lOU1RBTkNFX0lEOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNFUlZJQ0VfSU5TVEFOQ0VfSUQoU3RyaW5nIHNFUlZJQ0VfSU5TVEFOQ0VfSUQpIHsKKwkJU0VSVklDRV9JTlNUQU5DRV9JRCA9IHNFUlZJQ0VfSU5TVEFOQ0VfSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNT0RJRklFUigpIHsKKwkJcmV0dXJuIE1PRElGSUVSOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1PRElGSUVSKFN0cmluZyBtT0RJRklFUikgeworCQlNT0RJRklFUiA9IG1PRElGSUVSOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RUaW1lb3V0KCkgeworCQlyZXR1cm4gQVJUSUZBQ1RfVElNRU9VVDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFRpbWVvdXQoU3RyaW5nIGFydGlmYWN0VGltZW91dCkgeworCQl0aGlzLkFSVElGQUNUX1RJTUVPVVQgPSBhcnRpZmFjdFRpbWVvdXQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDdXJyQXJ0aWZhY3RVdWlkKCkgeworCQlyZXR1cm4gQ1VSUl9BUlRJRkFDVF9VVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldEN1cnJBcnRpZmFjdFV1aWQoU3RyaW5nIGN1cnJBcnRpZmFjdFV1aWQpIHsKKwkJdGhpcy5DVVJSX0FSVElGQUNUX1VVSUQgPSBjdXJyQXJ0aWZhY3RVdWlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJldkFydGlmYWN0VXVpZCgpIHsKKwkJcmV0dXJuIFBSRVZfQVJUSUZBQ1RfVVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcmV2QXJ0aWZhY3RVdWlkKFN0cmluZyBwcmV2QXJ0aWZhY3RVdWlkKSB7CisJCXRoaXMuUFJFVl9BUlRJRkFDVF9VVUlEID0gcHJldkFydGlmYWN0VXVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRvc2NhTm9kZVR5cGUoKSB7CisJCXJldHVybiBUT1NDQV9OT0RFX1RZUEU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FOb2RlVHlwZShTdHJpbmcgVG9zY2FOb2RlVHlwZSkgeworCQl0aGlzLlRPU0NBX05PREVfVFlQRSA9IFRvc2NhTm9kZVR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3BpY05hbWUoKSB7CisJCXJldHVybiBUT1BJQ19OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvcGljTmFtZShTdHJpbmcgdG9waWNOYW1lKSB7CisJCXRoaXMuVE9QSUNfTkFNRSA9IHRvcGljTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc3RyaWJ1dGlvbklkKCkgeworCQlyZXR1cm4gRElEOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGlvbklkKFN0cmluZyBkaWQpIHsKKwkJdGhpcy5ESUQgPSBkaWQ7CisJfQorCisJcHVibGljIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCXB1YmxpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KFN0cmluZyBhY3Rpb24sIFN0cmluZyBtb2RpZmllck5hbWUsIFN0cmluZyBtb2RpZmllclVpZCwgU3RyaW5nIHN0YXR1cywKKwkJCVN0cmluZyBkZXNjLCBTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VUeXBlLCBTdHJpbmcgcHJldlZlcnNpb24sIFN0cmluZyBjdXJyVmVyc2lvbiwKKwkJCVN0cmluZyBwcmV2U3RhdGUsIFN0cmluZyBjdXJyU3RhdGUsIFN0cmluZyB0aW1lc3RhbXAsIFN0cmluZyB0b3NjYU5vZGVzVHlwZSwgU3RyaW5nIHRpbWVvdXQsCisJCQlTdHJpbmcgbW9kaWZpZXIsIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCkgeworCQlzdXBlcigpOworCQl0aGlzLkFDVElPTiA9IGFjdGlvbjsKKwkJdGhpcy5NT0RJRklFUl9OQU1FID0gbW9kaWZpZXJOYW1lOworCQl0aGlzLk1PRElGSUVSX1VJRCA9IG1vZGlmaWVyVWlkOworCQl0aGlzLlNUQVRVUyA9IHN0YXR1czsKKwkJdGhpcy5ERVNDID0gZGVzYzsKKwkJdGhpcy5SRVNPVVJDRV9OQU1FID0gcmVzb3VyY2VOYW1lOworCQl0aGlzLlJFU09VUkNFX1RZUEUgPSByZXNvdXJjZVR5cGU7CisJCXRoaXMuUFJFVl9WRVJTSU9OID0gcHJldlZlcnNpb247CisJCXRoaXMuQ1VSUl9WRVJTSU9OID0gY3VyclZlcnNpb247CisJCXRoaXMuUFJFVl9TVEFURSA9IHByZXZTdGF0ZTsKKwkJdGhpcy5DVVJSX1NUQVRFID0gY3VyclN0YXRlOworCQl0aGlzLlRJTUVTVEFNUCA9IHRpbWVzdGFtcDsKKwkJdGhpcy5UT1NDQV9OT0RFX1RZUEUgPSB0b3NjYU5vZGVzVHlwZTsKKwkJdGhpcy5BUlRJRkFDVF9USU1FT1VUID0gdGltZW91dDsKKwkJdGhpcy5NT0RJRklFUiA9IG1vZGlmaWVyOworCQl0aGlzLlNFUlZJQ0VfSU5TVEFOQ0VfSUQgPSBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIEFDVElPTjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLkFDVElPTiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyTmFtZSgpIHsKKwkJcmV0dXJuIE1PRElGSUVSX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJOYW1lKFN0cmluZyBtb2RpZmllck5hbWUpIHsKKwkJdGhpcy5NT0RJRklFUl9OQU1FID0gbW9kaWZpZXJOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXJVaWQoKSB7CisJCXJldHVybiBNT0RJRklFUl9VSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJVaWQoU3RyaW5nIG1vZGlmaWVyVWlkKSB7CisJCXRoaXMuTU9ESUZJRVJfVUlEID0gbW9kaWZpZXJVaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBTVEFUVVM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5TVEFUVVMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gREVTQzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuREVTQyA9IGRlc2M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisJCXJldHVybiBSRVNPVVJDRV9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXRoaXMuUkVTT1VSQ0VfTkFNRSA9IHJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIFJFU09VUkNFX1RZUEU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKwkJdGhpcy5SRVNPVVJDRV9UWVBFID0gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJldlZlcnNpb24oKSB7CisJCXJldHVybiBQUkVWX1ZFUlNJT047CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJldlZlcnNpb24oU3RyaW5nIHByZXZWZXJzaW9uKSB7CisJCXRoaXMuUFJFVl9WRVJTSU9OID0gcHJldlZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDdXJyVmVyc2lvbigpIHsKKwkJcmV0dXJuIENVUlJfVkVSU0lPTjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXJyVmVyc2lvbihTdHJpbmcgY3VyclZlcnNpb24pIHsKKwkJdGhpcy5DVVJSX1ZFUlNJT04gPSBjdXJyVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByZXZTdGF0ZSgpIHsKKwkJcmV0dXJuIFBSRVZfU1RBVEU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJldlN0YXRlKFN0cmluZyBwcmV2U3RhdGUpIHsKKwkJdGhpcy5QUkVWX1NUQVRFID0gcHJldlN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3VyclN0YXRlKCkgeworCQlyZXR1cm4gQ1VSUl9TVEFURTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXJyU3RhdGUoU3RyaW5nIGN1cnJTdGF0ZSkgeworCQl0aGlzLkNVUlJfU1RBVEUgPSBjdXJyU3RhdGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKSB7CisJCXJldHVybiBUSU1FU1RBTVA7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKFN0cmluZyB0aW1lc3RhbXApIHsKKwkJdGhpcy5USU1FU1RBTVAgPSB0aW1lc3RhbXA7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdERhdGEoKSB7CisJCXJldHVybiBBUlRJRkFDVF9EQVRBOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGF0YShTdHJpbmcgYXJ0aWZhY3REYXRhKSB7CisJCXRoaXMuQVJUSUZBQ1RfREFUQSA9IGFydGlmYWN0RGF0YTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERwcmV2U3RhdHVzKCkgeworCQlyZXR1cm4gRFBSRVZfU1RBVFVTOworCX0KKworCXB1YmxpYyB2b2lkIHNldERwcmV2U3RhdHVzKFN0cmluZyBkcHJldlN0YXR1cykgeworCQl0aGlzLkRQUkVWX1NUQVRVUyA9IGRwcmV2U3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGN1cnJTdGF0dXMoKSB7CisJCXJldHVybiBEQ1VSUl9TVEFUVVM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGN1cnJTdGF0dXMoU3RyaW5nIGRjdXJyU3RhdHVzKSB7CisJCXRoaXMuRENVUlJfU1RBVFVTID0gZGN1cnJTdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworCQlyZXR1cm4gQ09NTUVOVDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisJCXRoaXMuQ09NTUVOVCA9IGNvbW1lbnQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IFtBQ1RJT049IiArIEFDVElPTiArICIsIFNUQVRVUz0iICsgU1RBVFVTICsgIiwgREVTQz0iICsgREVTQworCQkJCSsgIiwgUkVTT1VSQ0VfTkFNRT0iICsgUkVTT1VSQ0VfTkFNRSArICIsIFJFU09VUkNFX1RZUEU9IiArIFJFU09VUkNFX1RZUEUgKyAiLCBQUkVWX1ZFUlNJT049IgorCQkJCSsgUFJFVl9WRVJTSU9OICsgIiwgQ1VSUl9WRVJTSU9OPSIgKyBDVVJSX1ZFUlNJT04gKyAiLCBQUkVWX1NUQVRFPSIgKyBQUkVWX1NUQVRFICsgIiwgQ1VSUl9TVEFURT0iCisJCQkJKyBDVVJSX1NUQVRFICsgIiwgVElNRVNUQU1QPSIgKyBUSU1FU1RBTVAgKyAiLCBBUlRJRkFDVF9EQVRBPSIgKyBBUlRJRkFDVF9EQVRBICsgIiwgRFBSRVZfU1RBVFVTPSIKKwkJCQkrIERQUkVWX1NUQVRVUyArICIsIERDVVJSX1NUQVRVUz0iICsgRENVUlJfU1RBVFVTICsgIiwgQ09NTUVOVD0iICsgQ09NTUVOVCArICIsIERJRD0iICsgRElECisJCQkJKyAiLCBUT1BJQ19OQU1FPSIgKyBUT1BJQ19OQU1FICsgIiwgVE9TQ0FfTk9ERV9UWVBFPSIgKyBUT1NDQV9OT0RFX1RZUEUgKyAiLCBDVVJSX0FSVElGQUNUX1VVSUQ9IgorCQkJCSsgQ1VSUl9BUlRJRkFDVF9VVUlEICsgIiwgUFJFVl9BUlRJRkFDVF9VVUlEPSIgKyBQUkVWX0FSVElGQUNUX1VVSUQgKyAiLCBBUlRJRkFDVF9USU1FT1VUPSIKKwkJCQkrIEFSVElGQUNUX1RJTUVPVVQgKyAiLCBNT0RJRklFUj0iICsgTU9ESUZJRVIgKyAiLCBTRVJWSUNFX0lOU1RBTkNFX0lEPSIgKyBTRVJWSUNFX0lOU1RBTkNFX0lEICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9leHBlY3RlZC9FeHBlY3RlZFVzZXJDUlVEQXVkaXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRVc2VyQ1JVREF1ZGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjODYyNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvZXhwZWN0ZWQvRXhwZWN0ZWRVc2VyQ1JVREF1ZGl0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZDsKKworcHVibGljIGNsYXNzIEV4cGVjdGVkVXNlckNSVURBdWRpdCB7CisJU3RyaW5nIGFjdGlvbjsKKwlTdHJpbmcgbW9kaWZpZXI7CisJU3RyaW5nIHN0YXR1czsKKwlTdHJpbmcgZGVzYzsKKwlTdHJpbmcgdXNlckJlZm9yZTsKKwlTdHJpbmcgdXNlckFmdGVyOworCisJcHVibGljIEV4cGVjdGVkVXNlckNSVURBdWRpdChTdHJpbmcgYWN0aW9uLCBTdHJpbmcgbW9kaWZpZXIsIFN0cmluZyBzdGF0dXMsIFN0cmluZyBkZXNjLCBTdHJpbmcgdXNlckJlZm9yZSwKKwkJCVN0cmluZyB1c2VyQWZ0ZXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJCXRoaXMudXNlckJlZm9yZSA9IHVzZXJCZWZvcmU7CisJCXRoaXMudXNlckFmdGVyID0gdXNlckFmdGVyOworCX0KKworCXB1YmxpYyBFeHBlY3RlZFVzZXJDUlVEQXVkaXQoKSB7CisJCWFjdGlvbiA9IG51bGw7CisJCW1vZGlmaWVyID0gbnVsbDsKKwkJdXNlckJlZm9yZSA9IG51bGw7CisJCXVzZXJBZnRlciA9IG51bGw7CisJCXN0YXR1cyA9IG51bGw7CisJCWRlc2MgPSBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXIoKSB7CisJCXJldHVybiBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIpIHsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlckJlZm9yZSgpIHsKKwkJcmV0dXJuIHVzZXJCZWZvcmU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlckJlZm9yZShTdHJpbmcgdXNlckJlZm9yZSkgeworCQl0aGlzLnVzZXJCZWZvcmUgPSB1c2VyQmVmb3JlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlckFmdGVyKCkgeworCQlyZXR1cm4gdXNlckFmdGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJBZnRlcihTdHJpbmcgdXNlckFmdGVyKSB7CisJCXRoaXMudXNlckFmdGVyID0gdXNlckFmdGVyOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvaHR0cC9IZWFkZXJEYXRhLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2h0dHAvSGVhZGVyRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjNiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2h0dHAvSGVhZGVyRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHA7CisKK3B1YmxpYyBjbGFzcyBIZWFkZXJEYXRhIHsKKwlTdHJpbmcgY29udGVudE1kNTsKKwlTdHJpbmcgY29udGVudFR5cGU7CisJU3RyaW5nIEh0dHBDc3BVc2VySWQ7CisJU3RyaW5nIEh0dHBDc3BGaXJzdE5hbWU7CisJU3RyaW5nIEh0dHBDc3BMYXN0TmFtZTsKKwlTdHJpbmcgSHR0cENzcFdzVHlwZTsKKwlTdHJpbmcgSHR0cEl2UmVtb3RlQWRkcmVzczsKKwlTdHJpbmcgSHR0cEl2VXNlcjsKKworCXB1YmxpYyBIZWFkZXJEYXRhKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBIZWFkZXJEYXRhKFN0cmluZyBjb250ZW50TWQ1LCBTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBodHRwQ3NwVXNlcklkLCBTdHJpbmcgaHR0cENzcEZpcnN0TmFtZSwKKwkJCVN0cmluZyBodHRwQ3NwTGFzdE5hbWUsIFN0cmluZyBodHRwQ3NwV3NUeXBlLCBTdHJpbmcgaHR0cEl2UmVtb3RlQWRkcmVzcywgU3RyaW5nIGh0dHBJdlVzZXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5jb250ZW50TWQ1ID0gY29udGVudE1kNTsKKwkJdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworCQlIdHRwQ3NwVXNlcklkID0gaHR0cENzcFVzZXJJZDsKKwkJSHR0cENzcEZpcnN0TmFtZSA9IGh0dHBDc3BGaXJzdE5hbWU7CisJCUh0dHBDc3BMYXN0TmFtZSA9IGh0dHBDc3BMYXN0TmFtZTsKKwkJSHR0cENzcFdzVHlwZSA9IGh0dHBDc3BXc1R5cGU7CisJCUh0dHBJdlJlbW90ZUFkZHJlc3MgPSBodHRwSXZSZW1vdGVBZGRyZXNzOworCQlIdHRwSXZVc2VyID0gaHR0cEl2VXNlcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRNZDUoKSB7CisJCXJldHVybiBjb250ZW50TWQ1OworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnRlbnRNZDUoU3RyaW5nIGNvbnRlbnRNZDUpIHsKKwkJdGhpcy5jb250ZW50TWQ1ID0gY29udGVudE1kNTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworCQlyZXR1cm4gY29udGVudFR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEh0dHBDc3BVc2VySWQoKSB7CisJCXJldHVybiBIdHRwQ3NwVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEh0dHBDc3BVc2VySWQoU3RyaW5nIGh0dHBDc3BVc2VySWQpIHsKKwkJSHR0cENzcFVzZXJJZCA9IGh0dHBDc3BVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIdHRwQ3NwRmlyc3ROYW1lKCkgeworCQlyZXR1cm4gSHR0cENzcEZpcnN0TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIdHRwQ3NwRmlyc3ROYW1lKFN0cmluZyBodHRwQ3NwRmlyc3ROYW1lKSB7CisJCUh0dHBDc3BGaXJzdE5hbWUgPSBodHRwQ3NwRmlyc3ROYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SHR0cENzcExhc3ROYW1lKCkgeworCQlyZXR1cm4gSHR0cENzcExhc3ROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEh0dHBDc3BMYXN0TmFtZShTdHJpbmcgaHR0cENzcExhc3ROYW1lKSB7CisJCUh0dHBDc3BMYXN0TmFtZSA9IGh0dHBDc3BMYXN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEh0dHBDc3BXc1R5cGUoKSB7CisJCXJldHVybiBIdHRwQ3NwV3NUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEh0dHBDc3BXc1R5cGUoU3RyaW5nIGh0dHBDc3BXc1R5cGUpIHsKKwkJSHR0cENzcFdzVHlwZSA9IGh0dHBDc3BXc1R5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIdHRwSXZSZW1vdGVBZGRyZXNzKCkgeworCQlyZXR1cm4gSHR0cEl2UmVtb3RlQWRkcmVzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIdHRwSXZSZW1vdGVBZGRyZXNzKFN0cmluZyBodHRwSXZSZW1vdGVBZGRyZXNzKSB7CisJCUh0dHBJdlJlbW90ZUFkZHJlc3MgPSBodHRwSXZSZW1vdGVBZGRyZXNzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SHR0cEl2VXNlcigpIHsKKwkJcmV0dXJuIEh0dHBJdlVzZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0SHR0cEl2VXNlcihTdHJpbmcgaHR0cEl2VXNlcikgeworCQlIdHRwSXZVc2VyID0gaHR0cEl2VXNlcjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvaHR0cC9IZWFkZXJWYWx1ZS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9odHRwL0hlYWRlclZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyYWQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvaHR0cC9IZWFkZXJWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cDsKKworcHVibGljIGVudW0gSGVhZGVyVmFsdWUgeworCisJQVBQTElDQVRJT05fSlNPTigiYXBwbGljYXRpb24vanNvbiIpOworCisJU3RyaW5nIHZhbHVlOworCisJcHJpdmF0ZSBIZWFkZXJWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9odHRwL0h0dHBIZWFkZXJFbnVtLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2h0dHAvSHR0cEhlYWRlckVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNiZWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9odHRwL0h0dHBIZWFkZXJFbnVtLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwOworCitwdWJsaWMgZW51bSBIdHRwSGVhZGVyRW51bSB7CisKKwlDb250ZW50X01ENSgiQ29udGVudC1NRDUiKSwgCisJVVNFUl9JRCgiVVNFUl9JRCIpLCAKKwlIVFRQX0NTUF9GSVJTVE5BTUUoIkhUVFBfQ1NQX0ZJUlNUTkFNRSIpLCAKKwlIVFRQX0NTUF9MQVNUTkFNRSgiSFRUUF9DU1BfTEFTVE5BTUUiKSwgCisJSFRUUF9DU1BfV1NUWVBFKCJIVFRQX0NTUF9XU1RZUEUiKSwgCisJSFRUUF9JVl9SRU1PVEVfQUREUkVTUygiSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIpLCAKKwlIVFRQX0lWX1VTRVIoIkhUVFBfSVZfVVNFUiIpLCAKKwlIVFRQX0NTUF9FTUFJTCgiSFRUUF9DU1BfRU1BSUwiKSwgCisJQ09OVEVOVF9UWVBFKCJDb250ZW50LVR5cGUiKSwgCisJQUNDRVBUKCJBY2NlcHQiKSwgCisJWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUigiWC1FQ09NUC1SZXF1ZXN0SUQiKSwgCisJQ0FDSEVfQ09OVFJPTCgiQ2FjaGUtQ29udHJvbCIpLCAKKwlYX0VDT01QX0lOU1RBTkNFX0lEKCJYLUVDT01QLUluc3RhbmNlSUQiKSwgCisJQVVUSE9SSVpBVElPTigiQXV0aG9yaXphdGlvbiIpLCAKKwlDT05URU5UX0xFTkdUSCgiQ29udGVudC1MZW5ndGgiKSwgCisJQ09OVEVOVF9ESVNQT1NJVElPTigiQ29udGVudC1EaXNwb3NpdGlvbiIpLCAKKwlIT1NUKCJIb3N0IiksIAorCVhfRUNPTVBfU0VSVklDRV9JRF9IRUFERVIoIlgtRUNPTVAtU2VydmljZUlEIiksIAorCVdXV19BVVRIRU5USUNBVEUoIldXVy1BdXRoZW50aWNhdGUiKSwKKwlFQ09NUF9QQVNTV09SRCgicGFzc3dvcmQiKSwgCisJRUNPTVBfVVNFUk5BTUUoInVzZXJuYW1lIik7CisJCisJU3RyaW5nIHZhbHVlOworCisJcHJpdmF0ZSBIdHRwSGVhZGVyRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9odHRwL0h0dHBSZXF1ZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2h0dHAvSHR0cFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI4MzBlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9odHRwL0h0dHBSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSw4ODMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmFubm90YXRpb24uTm90VGhyZWFkU2FmZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNsaWVudFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0QmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5Db250ZW50VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LlN0cmluZ0VudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5Lm1pbWUuTXVsdGlwYXJ0RW50aXR5QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5Lm1pbWUuY29udGVudC5GaWxlQm9keTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5Lm1pbWUuY29udGVudC5TdHJpbmdCb2R5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKK3B1YmxpYyBjbGFzcyBIdHRwUmVxdWVzdCB7CisKKwlzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEh0dHBSZXF1ZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGh0dHBTZW5kR2V0KFN0cmluZyB1cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlVUkwgb2JqID0gbmV3IFVSTCh1cmwpOworCQlIdHRwVVJMQ29ubmVjdGlvbiBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG9iai5vcGVuQ29ubmVjdGlvbigpOworCQkvLyBvcHRpb25hbCBkZWZhdWx0IGlzIEdFVAorCQljb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7CisJCS8vIGFkZCByZXF1ZXN0IGhlYWRlcgorCQlpZiAoaGVhZGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gaGVhZGVyLmdldEtleSgpOworCQkJCVN0cmluZyB2YWx1ZSA9IGhlYWRlci5nZXRWYWx1ZSgpOworCQkJCWNvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisJCQl9CisKKwkJfQorCisJCWludCByZXNwb25zZUNvZGUgPSBjb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBHRVQgaHR0cCByZXF1ZXN0LCB1cmw6IHt9IiwgdXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJSZXNwb25zZSBDb2RlOiB7fSIsIHJlc3BvbnNlQ29kZSk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3BvbnNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlTdHJpbmcgcmVzdWx0OworCisJCXRyeSB7CisKKwkJCXJlc3VsdCA9IElPVXRpbHMudG9TdHJpbmcoY29uLmdldElucHV0U3RyZWFtKCkpOworCQkJcmVzcG9uc2UuYXBwZW5kKHJlc3VsdCk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGxvZ2dlci5lcnJvcigiRXJyb3IgZHVyaW5nIGdldHRpbmcgaW5wdXQgc3RyZWFtOiAiLGUpOworCQl9CisKKwkJdHJ5IHsKKworCQkJcmVzdWx0ID0gSU9VdGlscy50b1N0cmluZyhjb24uZ2V0RXJyb3JTdHJlYW0oKSk7CisJCQlyZXNwb25zZS5hcHBlbmQocmVzdWx0KTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gbG9nZ2VyLmVycm9yKCJFcnJvciBkdXJpbmcgZ2V0dGluZyBlcnJvciBzdHJlYW06ICIsZSk7CisJCX0KKworCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIGJvZHk6IHt9IiwgcmVzcG9uc2UpOworCisJCS8vIHByaW50IHJlc3VsdAorCisJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2VDb2RlKTsKKworCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKHJlc3BvbnNlLnRvU3RyaW5nKCkpOworCQl9CisKKwkJcmVzdFJlc3BvbnNlLnNldEVycm9yQ29kZShyZXNwb25zZUNvZGUpOworCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlckZpZWxkcyA9IGNvbi5nZXRIZWFkZXJGaWVsZHMoKTsKKwkJcmVzdFJlc3BvbnNlLnNldEhlYWRlckZpZWxkcyhoZWFkZXJGaWVsZHMpOworCQlTdHJpbmcgcmVzcG9uc2VNZXNzYWdlID0gY29uLmdldFJlc3BvbnNlTWVzc2FnZSgpOworCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2VNZXNzYWdlKHJlc3BvbnNlTWVzc2FnZSk7CisKKwkJY29uLmRpc2Nvbm5lY3QoKTsKKworCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2UgaHR0cHNTZW5kR2V0KFN0cmluZyB1cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlVUkwgb2JqID0gbmV3IFVSTCh1cmwpOworCQlIdHRwc1VSTENvbm5lY3Rpb24gY29uID0gKEh0dHBzVVJMQ29ubmVjdGlvbikgb2JqLm9wZW5Db25uZWN0aW9uKCk7CisJCS8vIG9wdGlvbmFsIGRlZmF1bHQgaXMgR0VUCisJCWNvbi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKwkJLy8gYWRkIHJlcXVlc3QgaGVhZGVyCisJCWlmIChoZWFkZXJzICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBoZWFkZXIuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gaGVhZGVyLmdldFZhbHVlKCk7CisJCQkJY29uLnNldFJlcXVlc3RQcm9wZXJ0eShrZXksIHZhbHVlKTsKKwkJCX0KKworCQl9CisKKwkJaW50IHJlc3BvbnNlQ29kZSA9IGNvbi5nZXRSZXNwb25zZUNvZGUoKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIEdFVCBodHRwIHJlcXVlc3QsIHVybDoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIENvZGU6IHt9IiwgcmVzcG9uc2VDb2RlKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzcG9uc2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXRyeSB7CisJCQlCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29uLmdldElucHV0U3RyZWFtKCkpKTsKKwkJCVN0cmluZyBpbnB1dExpbmU7CisJCQl3aGlsZSAoKGlucHV0TGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5hcHBlbmQoaW5wdXRMaW5lKTsKKwkJCX0KKwkJCWluLmNsb3NlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoInJlc3BvbnNlIGJvZHkgaXMgbnVsbCIpOworCQl9CisKKwkJU3RyaW5nIHJlc3VsdDsKKworCQl0cnkgeworCisJCQlyZXN1bHQgPSBJT1V0aWxzLnRvU3RyaW5nKGNvbi5nZXRFcnJvclN0cmVhbSgpKTsKKwkJCXJlc3BvbnNlLmFwcGVuZChyZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworCQkJLy8gcmVzdWx0ID0gbnVsbDsKKwkJfQorCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIGJvZHk6IHt9IiwgcmVzcG9uc2UpOworCisJCS8vIHByaW50IHJlc3VsdAorCisJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2VDb2RlKTsKKworCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKHJlc3BvbnNlLnRvU3RyaW5nKCkpOworCQl9CisKKwkJcmVzdFJlc3BvbnNlLnNldEVycm9yQ29kZShyZXNwb25zZUNvZGUpOworCQkvLyByZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzdWx0KTsKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJGaWVsZHMgPSBjb24uZ2V0SGVhZGVyRmllbGRzKCk7CisJCXJlc3RSZXNwb25zZS5zZXRIZWFkZXJGaWVsZHMoaGVhZGVyRmllbGRzKTsKKwkJU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IGNvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKKwkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlTWVzc2FnZShyZXNwb25zZU1lc3NhZ2UpOworCisJCWNvbi5kaXNjb25uZWN0KCk7CisKKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGh0dHBTZW5kQnlNZXRob2QoU3RyaW5nIHVybCwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIGJvZHksIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlVUkwgb2JqID0gbmV3IFVSTCh1cmwpOworCQlIdHRwVVJMQ29ubmVjdGlvbiBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG9iai5vcGVuQ29ubmVjdGlvbigpOworCisJCS8vIGFkZCByZXF1ZXN0IG1ldGhvZAorCQljb24uc2V0UmVxdWVzdE1ldGhvZChtZXRob2QpOworCisJCS8vIGFkZCByZXF1ZXN0IGhlYWRlcnMKKwkJaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gaGVhZGVyIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGtleSA9IGhlYWRlci5nZXRLZXkoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBoZWFkZXIuZ2V0VmFsdWUoKTsKKwkJCQljb24uc2V0UmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOworCQkJfQorCisJCX0KKwkJaWYgKGJvZHkgIT0gbnVsbCAmJiAhYm9keS5pc0VtcHR5KCkgJiYgIW1ldGhvZC5lcXVhbHMoIkRFTEVURSIpKSB7CisJCQkvLyBTZW5kIHBvc3QgcmVxdWVzdAorCQkJY29uLnNldERvT3V0cHV0KHRydWUpOworCQkJRGF0YU91dHB1dFN0cmVhbSB3ciA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGNvbi5nZXRPdXRwdXRTdHJlYW0oKSk7CisJCQl3ci53cml0ZUJ5dGVzKGJvZHkpOworCQkJd3IuZmx1c2goKTsKKwkJCXdyLmNsb3NlKCk7CisJCX0KKworCQkvLyBjb24uY29ubmVjdCgpOworCisJCWludCByZXNwb25zZUNvZGUgPSBjb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VuZCB7fSBodHRwIHJlcXVlc3QsIHVybDoge30iLCBtZXRob2QsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgQ29kZToge30iLCByZXNwb25zZUNvZGUpOworCisJCVN0cmluZ0J1ZmZlciByZXNwb25zZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworCQl0cnkgeworCQkJQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbi5nZXRJbnB1dFN0cmVhbSgpKSk7CisJCQlTdHJpbmcgaW5wdXRMaW5lOworCQkJd2hpbGUgKChpbnB1dExpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJcmVzcG9uc2UuYXBwZW5kKGlucHV0TGluZSk7CisJCQl9CisJCQlpbi5jbG9zZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gcmVzcG9uc2UgPSBudWxsOworCQkJbG9nZ2VyLmRlYnVnKCJyZXNwb25zZSBib2R5IGlzIG51bGwiKTsKKwkJfQorCisJCVN0cmluZyByZXN1bHQ7CisJCXRyeSB7CisKKwkJCXJlc3VsdCA9IElPVXRpbHMudG9TdHJpbmcoY29uLmdldEVycm9yU3RyZWFtKCkpOworCQkJcmVzcG9uc2UuYXBwZW5kKHJlc3VsdCk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisJCQlyZXN1bHQgPSBudWxsOworCQl9CisJCWxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgYm9keToge30iLCByZXNwb25zZSk7CisKKwkJLy8gcHJpbnQgcmVzdWx0CisKKwkJcmVzdFJlc3BvbnNlLnNldEVycm9yQ29kZShyZXNwb25zZUNvZGUpOworCQkvLyBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworCQkvLyByZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UobnVsbCk7CisJCS8vIH0gZWxzZSB7CisJCS8vIHJlc3RSZXNwb25zZS5zZXRSZXNwb25zZShyZXNwb25zZS50b1N0cmluZygpKTsKKwkJLy8gfQorCisJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7CisJCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2UudG9TdHJpbmcoKSk7CisJCX0KKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJGaWVsZHMgPSBjb24uZ2V0SGVhZGVyRmllbGRzKCk7CisJCXJlc3RSZXNwb25zZS5zZXRIZWFkZXJGaWVsZHMoaGVhZGVyRmllbGRzKTsKKwkJU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IGNvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKKwkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlTWVzc2FnZShyZXNwb25zZU1lc3NhZ2UpOworCisJCWNvbi5kaXNjb25uZWN0KCk7CisJCXJldHVybiByZXN0UmVzcG9uc2U7CisKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIHNlbmRIdHRwUG9zdChTdHJpbmcgdXJsLCBTdHJpbmcgYm9keSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBuZXcgUmVzdFJlc3BvbnNlKCk7CisJCVVSTCBvYmogPSBuZXcgVVJMKHVybCk7CisJCUh0dHBVUkxDb25uZWN0aW9uIGNvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgb2JqLm9wZW5Db25uZWN0aW9uKCk7CisKKwkJLy8gYWRkIHJlcXVlc3QgbWV0aG9kCisJCWNvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CisKKwkJLy8gYWRkIHJlcXVlc3QgaGVhZGVycworCQlpZiAoaGVhZGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gaGVhZGVyLmdldEtleSgpOworCQkJCVN0cmluZyB2YWx1ZSA9IGhlYWRlci5nZXRWYWx1ZSgpOworCQkJCWNvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisJCQl9CisJCX0KKworCQkvLyBTZW5kIHBvc3QgcmVxdWVzdAorCQlpZiAoYm9keSAhPSBudWxsKSB7CisJCQljb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisJCQlEYXRhT3V0cHV0U3RyZWFtIHdyID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oY29uLmdldE91dHB1dFN0cmVhbSgpKTsKKwkJCXdyLndyaXRlQnl0ZXMoYm9keSk7CisJCQl3ci5mbHVzaCgpOworCQkJd3IuY2xvc2UoKTsKKwkJfQorCisJCS8vIGNvbi5jb25uZWN0KCk7CisKKwkJaW50IHJlc3BvbnNlQ29kZSA9IGNvbi5nZXRSZXNwb25zZUNvZGUoKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBPU1QgaHR0cCByZXF1ZXN0LCB1cmw6IHt9IiwgdXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJSZXNwb25zZSBDb2RlOiB7fSIsIHJlc3BvbnNlQ29kZSk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3BvbnNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl0cnkgeworCQkJQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbi5nZXRJbnB1dFN0cmVhbSgpKSk7CisJCQlTdHJpbmcgaW5wdXRMaW5lOworCQkJd2hpbGUgKChpbnB1dExpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJcmVzcG9uc2UuYXBwZW5kKGlucHV0TGluZSk7CisJCQl9CisJCQlpbi5jbG9zZSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJyZXNwb25zZSBib2R5IGlzIG51bGwiKTsKKwkJfQorCisJCVN0cmluZyByZXN1bHQ7CisKKwkJdHJ5IHsKKworCQkJcmVzdWx0ID0gSU9VdGlscy50b1N0cmluZyhjb24uZ2V0RXJyb3JTdHJlYW0oKSk7CisJCQlyZXNwb25zZS5hcHBlbmQocmVzdWx0KTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKwkJCXJlc3VsdCA9IG51bGw7CisJCX0KKwkJbG9nZ2VyLmRlYnVnKCJSZXNwb25zZSBib2R5OiB7fSIsIHJlc3BvbnNlKTsKKworCQkvLyBwcmludCByZXN1bHQKKworCQlyZXN0UmVzcG9uc2Uuc2V0RXJyb3JDb2RlKHJlc3BvbnNlQ29kZSk7CisKKwkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKwkJCXJlc3RSZXNwb25zZS5zZXRSZXNwb25zZShyZXNwb25zZS50b1N0cmluZygpKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVyRmllbGRzID0gY29uLmdldEhlYWRlckZpZWxkcygpOworCQlyZXN0UmVzcG9uc2Uuc2V0SGVhZGVyRmllbGRzKGhlYWRlckZpZWxkcyk7CisJCVN0cmluZyByZXNwb25zZU1lc3NhZ2UgPSBjb24uZ2V0UmVzcG9uc2VNZXNzYWdlKCk7CisJCXJlc3RSZXNwb25zZS5zZXRSZXNwb25zZU1lc3NhZ2UocmVzcG9uc2VNZXNzYWdlKTsKKworCQljb24uZGlzY29ubmVjdCgpOworCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCisJfQorCisJcHVibGljIFJlc3RSZXNwb25zZSBodHRwU2VuZFBvc3QoU3RyaW5nIHVybCwgU3RyaW5nIGJvZHksIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGh0dHBTZW5kUG9zdCh1cmwsIGJvZHksIGhlYWRlcnMsICJQT1NUIik7CisJfQorCisJcHVibGljIFJlc3RSZXNwb25zZSBodHRwU2VuZFB1dChTdHJpbmcgdXJsLCBTdHJpbmcgYm9keSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gaHR0cFNlbmRQb3N0KHVybCwgYm9keSwgaGVhZGVycywgIlBVVCIpOworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2UgaHR0cFNlbmRQb3N0KFN0cmluZyB1cmwsIFN0cmluZyBib2R5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIFN0cmluZyBtZXRob2RUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBuZXcgUmVzdFJlc3BvbnNlKCk7CisJCVVSTCBvYmogPSBuZXcgVVJMKHVybCk7CisJCUh0dHBVUkxDb25uZWN0aW9uIGNvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgb2JqLm9wZW5Db25uZWN0aW9uKCk7CisKKwkJLy8gYWRkIHJlcXVlc3QgbWV0aG9kCisJCWNvbi5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZFR5cGUpOworCisJCS8vIGFkZCByZXF1ZXN0IGhlYWRlcnMKKwkJaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gaGVhZGVyIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGtleSA9IGhlYWRlci5nZXRLZXkoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBoZWFkZXIuZ2V0VmFsdWUoKTsKKwkJCQljb24uc2V0UmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOworCQkJfQorCQl9CisKKwkJLy8gU2VuZCBwb3N0IHJlcXVlc3QKKwkJaWYgKGJvZHkgIT0gbnVsbCkgeworCQkJY29uLnNldERvT3V0cHV0KHRydWUpOworCQkJRGF0YU91dHB1dFN0cmVhbSB3ciA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGNvbi5nZXRPdXRwdXRTdHJlYW0oKSk7CisJCQl3ci53cml0ZUJ5dGVzKGJvZHkpOworCQkJd3IuZmx1c2goKTsKKwkJCXdyLmNsb3NlKCk7CisJCX0KKworCQkvLyBjb24uY29ubmVjdCgpOworCisJCWludCByZXNwb25zZUNvZGUgPSBjb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBQT1NUIGh0dHAgcmVxdWVzdCwgdXJsOiB7fSIsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgQ29kZToge30iLCByZXNwb25zZUNvZGUpOworCisJCVN0cmluZ0J1ZmZlciByZXNwb25zZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJdHJ5IHsKKwkJCUJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb24uZ2V0SW5wdXRTdHJlYW0oKSkpOworCQkJU3RyaW5nIGlucHV0TGluZTsKKwkJCXdoaWxlICgoaW5wdXRMaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCXJlc3BvbnNlLmFwcGVuZChpbnB1dExpbmUpOworCQkJfQorCQkJaW4uY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygicmVzcG9uc2UgYm9keSBpcyBudWxsIik7CisJCX0KKworCQlTdHJpbmcgcmVzdWx0OworCisJCXRyeSB7CisKKwkJCXJlc3VsdCA9IElPVXRpbHMudG9TdHJpbmcoY29uLmdldEVycm9yU3RyZWFtKCkpOworCQkJcmVzcG9uc2UuYXBwZW5kKHJlc3VsdCk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisJCQlyZXN1bHQgPSBudWxsOworCQl9CisJCWxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgYm9keToge30iLCByZXNwb25zZSk7CisKKwkJLy8gcHJpbnQgcmVzdWx0CisKKwkJcmVzdFJlc3BvbnNlLnNldEVycm9yQ29kZShyZXNwb25zZUNvZGUpOworCisJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7CisJCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2UudG9TdHJpbmcoKSk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlckZpZWxkcyA9IGNvbi5nZXRIZWFkZXJGaWVsZHMoKTsKKwkJcmVzdFJlc3BvbnNlLnNldEhlYWRlckZpZWxkcyhoZWFkZXJGaWVsZHMpOworCQlTdHJpbmcgcmVzcG9uc2VNZXNzYWdlID0gY29uLmdldFJlc3BvbnNlTWVzc2FnZSgpOworCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2VNZXNzYWdlKHJlc3BvbnNlTWVzc2FnZSk7CisKKwkJY29uLmRpc2Nvbm5lY3QoKTsKKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2UgaHR0cFNlbmREZWxldGVXaXRoQm9keTIoU3RyaW5nIHVybCwgU3RyaW5nIGJvZHksIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIENsaWVudFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlIdHRwRGVsZXRlV2l0aEJvZHkgaHR0cERlbGV0ZSA9IG5ldyBIdHRwRGVsZXRlV2l0aEJvZHkodXJsKTsKKworCQkvLyBhZGQgcmVxdWVzdCBoZWFkZXJzCisJCWlmIChoZWFkZXJzICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBoZWFkZXIuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gaGVhZGVyLmdldFZhbHVlKCk7CisJCQkJaHR0cERlbGV0ZS5hZGRIZWFkZXIoa2V5LCB2YWx1ZSk7CisJCQl9CisJCX0KKworCQkvLyBhZGQgYm9keSB0byByZXF1ZXN0CisJCVN0cmluZ0VudGl0eSBpbnB1dCA9IG5ldyBTdHJpbmdFbnRpdHkoYm9keSwgQ29udGVudFR5cGUuQVBQTElDQVRJT05fSlNPTik7CisJCWh0dHBEZWxldGUuc2V0RW50aXR5KGlucHV0KTsKKworCQkvLyBleGVjdXRlIHJlcXVlc3QKKwkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBEZWxldGUpOworCisJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSk7CisKKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGh0dHBTZW5kRGVsZXRlV2l0aEJvZHkoU3RyaW5nIHVybCwgU3RyaW5nIGJvZHksIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlVUkwgb2JqID0gbmV3IFVSTCh1cmwpOworCQlIdHRwVVJMQ29ubmVjdGlvbiBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG9iai5vcGVuQ29ubmVjdGlvbigpOworCisJCS8vIGFkZCByZXF1ZXN0IG1ldGhvZAorCQljb24uc2V0UmVxdWVzdE1ldGhvZCgiREVMRVRFIik7CisKKwkJLy8gYWRkIHJlcXVlc3QgaGVhZGVycworCQlpZiAoaGVhZGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gaGVhZGVyLmdldEtleSgpOworCQkJCVN0cmluZyB2YWx1ZSA9IGhlYWRlci5nZXRWYWx1ZSgpOworCQkJCWNvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisJCQl9CisJCX0KKworCQkvLyBTZW5kIHBvc3QgcmVxdWVzdAorCQljb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisJCURhdGFPdXRwdXRTdHJlYW0gd3IgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShjb24uZ2V0T3V0cHV0U3RyZWFtKCkpOworCQl3ci53cml0ZUJ5dGVzKGJvZHkpOworCQl3ci5mbHVzaCgpOworCQl3ci5jbG9zZSgpOworCisJCS8vIGNvbi5jb25uZWN0KCk7CisKKwkJaW50IHJlc3BvbnNlQ29kZSA9IGNvbi5nZXRSZXNwb25zZUNvZGUoKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIERFTEVURSBodHRwIHJlcXVlc3QsIHVybDoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIENvZGU6IHt9IiwgcmVzcG9uc2VDb2RlKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzcG9uc2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXRyeSB7CisJCQlCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29uLmdldElucHV0U3RyZWFtKCkpKTsKKwkJCVN0cmluZyBpbnB1dExpbmU7CisJCQl3aGlsZSAoKGlucHV0TGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5hcHBlbmQoaW5wdXRMaW5lKTsKKwkJCX0KKwkJCWluLmNsb3NlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoInJlc3BvbnNlIGJvZHkgaXMgbnVsbCIpOworCQl9CisKKwkJU3RyaW5nIHJlc3VsdDsKKworCQl0cnkgeworCisJCQlyZXN1bHQgPSBJT1V0aWxzLnRvU3RyaW5nKGNvbi5nZXRFcnJvclN0cmVhbSgpKTsKKwkJCXJlc3BvbnNlLmFwcGVuZChyZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworCQkJcmVzdWx0ID0gbnVsbDsKKwkJfQorCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIGJvZHk6IHt9IiwgcmVzcG9uc2UpOworCisJCS8vIHByaW50IHJlc3VsdAorCisJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2VDb2RlKTsKKworCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKHJlc3BvbnNlLnRvU3RyaW5nKCkpOworCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJGaWVsZHMgPSBjb24uZ2V0SGVhZGVyRmllbGRzKCk7CisJCXJlc3RSZXNwb25zZS5zZXRIZWFkZXJGaWVsZHMoaGVhZGVyRmllbGRzKTsKKwkJU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IGNvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKKwkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlTWVzc2FnZShyZXNwb25zZU1lc3NhZ2UpOworCisJCWNvbi5kaXNjb25uZWN0KCk7CisJCXJldHVybiByZXN0UmVzcG9uc2U7CisKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGh0dHBTZW5kUG9zdFdpdGhPdXRCb2R5KFN0cmluZyB1cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlVUkwgb2JqID0gbmV3IFVSTCh1cmwpOworCQlIdHRwVVJMQ29ubmVjdGlvbiBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG9iai5vcGVuQ29ubmVjdGlvbigpOworCisJCS8vIGFkZCByZXF1ZXN0IG1ldGhvZAorCQljb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworCisJCS8vIGFkZCByZXF1ZXN0IGhlYWRlcnMKKwkJaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gaGVhZGVyIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGtleSA9IGhlYWRlci5nZXRLZXkoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBoZWFkZXIuZ2V0VmFsdWUoKTsKKwkJCQljb24uc2V0UmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOworCQkJfQorCQl9CisKKwkJLy8gY29uLmNvbm5lY3QoKTsKKworCQlpbnQgcmVzcG9uc2VDb2RlID0gY29uLmdldFJlc3BvbnNlQ29kZSgpOworCQlsb2dnZXIuZGVidWcoIlNlbmQgUE9TVCBodHRwIHJlcXVlc3QsIHVybDoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIENvZGU6IHt9IiwgcmVzcG9uc2VDb2RlKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzcG9uc2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKwkJdHJ5IHsKKwkJCUJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb24uZ2V0SW5wdXRTdHJlYW0oKSkpOworCQkJU3RyaW5nIGlucHV0TGluZTsKKwkJCXdoaWxlICgoaW5wdXRMaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCXJlc3BvbnNlLmFwcGVuZChpbnB1dExpbmUpOworCQkJfQorCQkJaW4uY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHJlc3BvbnNlID0gbnVsbDsKKwkJCWxvZ2dlci5kZWJ1ZygicmVzcG9uc2UgYm9keSBpcyBudWxsIik7CisJCX0KKworCQlTdHJpbmcgcmVzdWx0OworCQl0cnkgeworCisJCQlyZXN1bHQgPSBJT1V0aWxzLnRvU3RyaW5nKGNvbi5nZXRFcnJvclN0cmVhbSgpKTsKKwkJCXJlc3BvbnNlLmFwcGVuZChyZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworCQkJcmVzdWx0ID0gbnVsbDsKKwkJfQorCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIGJvZHk6IHt9IiwgcmVzcG9uc2UpOworCisJCS8vIHByaW50IHJlc3VsdAorCisJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2VDb2RlKTsKKwkJLy8gaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKwkJLy8gcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKG51bGwpOworCQkvLyB9IGVsc2UgeworCQkvLyByZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2UudG9TdHJpbmcoKSk7CisJCS8vIH0KKworCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKHJlc3BvbnNlLnRvU3RyaW5nKCkpOworCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJGaWVsZHMgPSBjb24uZ2V0SGVhZGVyRmllbGRzKCk7CisJCXJlc3RSZXNwb25zZS5zZXRIZWFkZXJGaWVsZHMoaGVhZGVyRmllbGRzKTsKKwkJU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IGNvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKKwkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlTWVzc2FnZShyZXNwb25zZU1lc3NhZ2UpOworCisJCWNvbi5kaXNjb25uZWN0KCk7CisJCXJldHVybiByZXN0UmVzcG9uc2U7CisKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGh0dHBTZW5kUG9zdE11bHRpcGFydChTdHJpbmcgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIFN0cmluZyBqc29uTG9jYXRpb24sIFN0cmluZyB6aXBMb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgZ3NvblRvU2VuZCA9IG51bGw7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBuZXcgUmVzdFJlc3BvbnNlKCk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKKwkJLy8KKwkJLy8KKwkJLy8KKwkJLy8KKwkJLy8gdHJ5IHsKKwkJLy8KKwkJLy8gU3RyaW5nIHNDdXJyZW50TGluZTsKKwkJLy8KKwkJLy8gYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoanNvbkxvY2F0aW9uKSk7CisJCS8vCisJCS8vIHdoaWxlICgoc0N1cnJlbnRMaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc0N1cnJlbnRMaW5lKTsKKwkJLy8gfQorCQkvLworCQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCS8vIH0gZmluYWxseSB7CisJCS8vIHRyeSB7CisJCS8vIGlmIChiciAhPSBudWxsKWJyLmNsb3NlKCk7CisJCS8vIGdzb25Ub1NlbmQgPSBici50b1N0cmluZygpOworCQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJLy8gfQorCQkvLyB9CisKKwkJZ3NvblRvU2VuZCA9IG5ldyBTY2FubmVyKG5ldyBGaWxlKGpzb25Mb2NhdGlvbikpLnVzZURlbGltaXRlcigiXFxaIikubmV4dCgpOworCQlsb2dnZXIuZGVidWcoImdzb25Ub1NlbmQ6IHt9IiwgZ3NvblRvU2VuZCk7CisKKwkJTXVsdGlwYXJ0RW50aXR5QnVpbGRlciBtcEJ1aWxkZXIgPSBNdWx0aXBhcnRFbnRpdHlCdWlsZGVyLmNyZWF0ZSgpOworCQltcEJ1aWxkZXIuYWRkUGFydCgicmVzb3VyY2VaaXAiLCBuZXcgRmlsZUJvZHkobmV3IEZpbGUoemlwTG9jYXRpb24pKSk7CisJCW1wQnVpbGRlci5hZGRQYXJ0KCJyZXNvdXJjZU1ldGFkYXRhIiwgbmV3IFN0cmluZ0JvZHkoZ3NvblRvU2VuZCwgQ29udGVudFR5cGUuQVBQTElDQVRJT05fSlNPTikpOworCisJCUh0dHBQb3N0IGh0dHBQb3N0ID0gbmV3IEh0dHBQb3N0KHVybCk7CisJCWh0dHBQb3N0LmFkZEhlYWRlcigiVVNFUl9JRCIsICJhZG1pbmlkIik7CisJCWh0dHBQb3N0LnNldEVudGl0eShtcEJ1aWxkZXIuYnVpbGQoKSk7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJdHJ5IHsKKwkJCWxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQkJbG9nZ2VyLmRlYnVnKCJyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCk6IHt9IiwgcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpKTsKKwkJCUh0dHBFbnRpdHkgcmVzRW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisJCQlpZiAocmVzRW50aXR5ICE9IG51bGwpIHsKKwkJCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIGNvbnRlbnQgbGVuZ3RoOiB7fSIsIHJlc0VudGl0eS5nZXRDb250ZW50TGVuZ3RoKCkpOworCQkJfQorCQkJRW50aXR5VXRpbHMuY29uc3VtZShyZXNFbnRpdHkpOworCQl9IGZpbmFsbHkgeworCisJCQlyZXNwb25zZS5jbG9zZSgpOworCQkJY2xpZW50LmNsb3NlKCk7CisJCX0KKworCQlyZXN0UmVzcG9uc2Uuc2V0RXJyb3JDb2RlKHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkpOworCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2UuZ2V0RW50aXR5KCkudG9TdHJpbmcoKSk7CisKKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2UgaHR0cFNlbmRQb3N0V2l0aEF1dGgoU3RyaW5nIHVybCwgU3RyaW5nIGJvZHksIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHVzZXJQYXNzd29yZCA9IHVzZXJuYW1lICsgIjoiICsgcGFzc3dvcmQ7CisJCVN0cmluZyBlbmNvZGluZyA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcodXNlclBhc3N3b3JkLmdldEJ5dGVzKCkpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlVUkwgb2JqID0gbmV3IFVSTCh1cmwpOworCQlIdHRwVVJMQ29ubmVjdGlvbiBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG9iai5vcGVuQ29ubmVjdGlvbigpOworCisJCS8vIGFkZCByZXF1ZXN0IG1ldGhvZAorCQljb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworCisJCWNvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkF1dGhvcml6YXRpb24iLCAiQmFzaWMgIiArIGVuY29kaW5nKTsKKworCQkvLyBhZGQgcmVxdWVzdCBoZWFkZXJzCisJCWlmIChoZWFkZXJzICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBoZWFkZXIuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gaGVhZGVyLmdldFZhbHVlKCk7CisJCQkJY29uLnNldFJlcXVlc3RQcm9wZXJ0eShrZXksIHZhbHVlKTsKKwkJCX0KKworCQl9CisKKwkJLy8gU2VuZCBwb3N0IHJlcXVlc3QKKwkJY29uLnNldERvT3V0cHV0KHRydWUpOworCQlEYXRhT3V0cHV0U3RyZWFtIHdyID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oY29uLmdldE91dHB1dFN0cmVhbSgpKTsKKwkJd3Iud3JpdGVCeXRlcyhib2R5KTsKKwkJd3IuZmx1c2goKTsKKwkJd3IuY2xvc2UoKTsKKworCQkvLyBjb24uY29ubmVjdCgpOworCisJCWludCByZXNwb25zZUNvZGUgPSBjb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBQT1NUIGh0dHAgcmVxdWVzdCwgdXJsOiB7fSIsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgQ29kZToge30iLCByZXNwb25zZUNvZGUpOworCisJCVN0cmluZ0J1ZmZlciByZXNwb25zZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJdHJ5IHsKKwkJCUJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb24uZ2V0SW5wdXRTdHJlYW0oKSkpOworCQkJU3RyaW5nIGlucHV0TGluZTsKKwkJCXdoaWxlICgoaW5wdXRMaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCXJlc3BvbnNlLmFwcGVuZChpbnB1dExpbmUpOworCQkJfQorCQkJaW4uY2xvc2UoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJlc3BvbnNlID0gbnVsbDsKKworCQl9CisJCWxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgYm9keToge30iLCByZXNwb25zZSk7CisKKwkJLy8gcHJpbnQgcmVzdWx0CisKKwkJcmVzdFJlc3BvbnNlLnNldEVycm9yQ29kZShyZXNwb25zZUNvZGUpOworCQlpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworCQkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKG51bGwpOworCQl9IGVsc2UgeworCQkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKHJlc3BvbnNlLnRvU3RyaW5nKCkpOworCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJGaWVsZHMgPSBjb24uZ2V0SGVhZGVyRmllbGRzKCk7CisJCXJlc3RSZXNwb25zZS5zZXRIZWFkZXJGaWVsZHMoaGVhZGVyRmllbGRzKTsKKwkJU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IGNvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKKwkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlTWVzc2FnZShyZXNwb25zZU1lc3NhZ2UpOworCisJCWNvbi5kaXNjb25uZWN0KCk7CisJCXJldHVybiByZXN0UmVzcG9uc2U7CisKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGh0dHBTZW5kRGVsZXRlKFN0cmluZyB1cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQlVUkwgb2JqID0gbmV3IFVSTCh1cmwpOworCQlIdHRwVVJMQ29ubmVjdGlvbiBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG9iai5vcGVuQ29ubmVjdGlvbigpOworCisJCWlmIChoZWFkZXJzICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBoZWFkZXIuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gaGVhZGVyLmdldFZhbHVlKCk7CisJCQkJY29uLnNldFJlcXVlc3RQcm9wZXJ0eShrZXksIHZhbHVlKTsKKwkJCX0KKworCQl9CisKKwkJY29uLnNldERvT3V0cHV0KHRydWUpOworCQljb24uc2V0UmVxdWVzdE1ldGhvZCgiREVMRVRFIik7CisJCWludCByZXNwb25zZUNvZGUgPSBjb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBERUxFVEUgaHR0cCByZXF1ZXN0LCB1cmw6IHt9IiwgdXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJSZXNwb25zZSBDb2RlOiB7fSIsIHJlc3BvbnNlQ29kZSk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3BvbnNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJCXRyeSB7CisJCQlCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29uLmdldElucHV0U3RyZWFtKCkpKTsKKwkJCVN0cmluZyBpbnB1dExpbmU7CisJCQl3aGlsZSAoKGlucHV0TGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5hcHBlbmQoaW5wdXRMaW5lKTsKKwkJCX0KKwkJCWluLmNsb3NlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoInJlc3BvbnNlIGJvZHkgaXMgbnVsbCIpOworCQl9CisKKwkJU3RyaW5nIHJlc3VsdDsKKworCQl0cnkgeworCisJCQlyZXN1bHQgPSBJT1V0aWxzLnRvU3RyaW5nKGNvbi5nZXRFcnJvclN0cmVhbSgpKTsKKwkJCXJlc3BvbnNlLmFwcGVuZChyZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworCQkJcmVzdWx0ID0gbnVsbDsKKwkJfQorCQlsb2dnZXIuZGVidWcoIlJlc3BvbnNlIGJvZHk6IHt9IiwgcmVzcG9uc2UpOworCisJCS8vIHByaW50IHJlc3VsdAorCisJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2VDb2RlKTsKKworCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJcmVzdFJlc3BvbnNlLnNldFJlc3BvbnNlKHJlc3BvbnNlLnRvU3RyaW5nKCkpOworCQl9CisKKwkJcmVzdFJlc3BvbnNlLnNldEVycm9yQ29kZShjb24uZ2V0UmVzcG9uc2VDb2RlKCkpOworCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlckZpZWxkcyA9IGNvbi5nZXRIZWFkZXJGaWVsZHMoKTsKKwkJcmVzdFJlc3BvbnNlLnNldEhlYWRlckZpZWxkcyhoZWFkZXJGaWVsZHMpOworCQlTdHJpbmcgcmVzcG9uc2VNZXNzYWdlID0gY29uLmdldFJlc3BvbnNlTWVzc2FnZSgpOworCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2VNZXNzYWdlKHJlc3BvbnNlTWVzc2FnZSk7CisKKwkJY29uLmRpc2Nvbm5lY3QoKTsKKworCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHNlbmRIdHRwUG9zdFdpdGhFbnRpdHkoSHR0cEVudGl0eSByZXF1ZXN0RW50aXR5LCBTdHJpbmcgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xpZW50UHJvdG9jb2xFeGNlcHRpb24geworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJdHJ5IHsKKwkJCUh0dHBQb3N0IGh0dHBQb3N0ID0gbmV3IEh0dHBQb3N0KHVybCk7CisJCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKwkJCQlodHRwUG9zdC5hZGRIZWFkZXIoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQkJfQorCisJCQlodHRwUG9zdC5zZXRFbnRpdHkocmVxdWVzdEVudGl0eSk7CisJCQlyZXNwb25zZSA9IGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCUh0dHBFbnRpdHkgcmVzcG9uc2VFbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKwkJCVN0cmluZyByZXNwb25zZUJvZHkgPSBudWxsOworCQkJaWYgKHJlc3BvbnNlRW50aXR5ICE9IG51bGwpIHsKKwkJCQlJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IHJlc3BvbnNlRW50aXR5LmdldENvbnRlbnQoKTsKKwkJCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJCUlPVXRpbHMuY29weShpbnN0cmVhbSwgd3JpdGVyKTsKKwkJCQlyZXNwb25zZUJvZHkgPSB3cml0ZXIudG9TdHJpbmcoKTsKKwkJCQl0cnkgeworCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaW5zdHJlYW0uY2xvc2UoKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSk7CisJCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2VCb2R5KTsKKworCQkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKworCQl9IGZpbmFsbHkgeworCQkJY2xvc2VSZXNwb25zZShyZXNwb25zZSk7CisJCQljbG9zZUh0dHBDbGllbnQoY2xpZW50KTsKKworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZUh0dHBDbGllbnQoQ2xvc2VhYmxlSHR0cENsaWVudCBjbGllbnQpIHsKKwkJdHJ5IHsKKwkJCWlmIChjbGllbnQgIT0gbnVsbCkgeworCQkJCWNsaWVudC5jbG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBjbG9zZSBjbGllbnQgb3IgcmVzcG9uc2U6ICIsIGUpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZVJlc3BvbnNlKENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSkgeworCQl0cnkgeworCQkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5jbG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBjbG9zZSBjbGllbnQgb3IgcmVzcG9uc2U6ICIsIGUpOworCQl9CisJfQorCisJQE5vdFRocmVhZFNhZmUKKwljbGFzcyBIdHRwRGVsZXRlV2l0aEJvZHkgZXh0ZW5kcyBIdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdEJhc2UgeworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJERUxFVEUiOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworCQkJcmV0dXJuIE1FVEhPRF9OQU1FOworCQl9CisKKwkJcHVibGljIEh0dHBEZWxldGVXaXRoQm9keShmaW5hbCBTdHJpbmcgdXJpKSB7CisJCQlzdXBlcigpOworCQkJc2V0VVJJKFVSSS5jcmVhdGUodXJpKSk7CisJCX0KKworCQlwdWJsaWMgSHR0cERlbGV0ZVdpdGhCb2R5KGZpbmFsIFVSSSB1cmkpIHsKKwkJCXN1cGVyKCk7CisJCQlzZXRVUkkodXJpKTsKKwkJfQorCisJCXB1YmxpYyBIdHRwRGVsZXRlV2l0aEJvZHkoKSB7CisJCQlzdXBlcigpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2h0dHAvTXVzdEhlYWRlcnMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvaHR0cC9NdXN0SGVhZGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Mzc2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2h0dHAvTXVzdEhlYWRlcnMuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgTXVzdEhlYWRlcnMgeworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworCXB1YmxpYyBNdXN0SGVhZGVycyhIZWFkZXJEYXRhIGhlYWRlckRhdGEpIHsKKworCQlzdXBlcigpOworCQloZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5Db250ZW50X01ENS5nZXRWYWx1ZSgpLCBoZWFkZXJEYXRhLmdldENvbnRlbnRNZDUoKSk7CisJCWhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBoZWFkZXJEYXRhLmdldENvbnRlbnRUeXBlKCkpOworCQloZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgaGVhZGVyRGF0YS5nZXRDb250ZW50VHlwZSgpKTsKKwkJaGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBoZWFkZXJEYXRhLmdldEh0dHBDc3BVc2VySWQoKSk7CisJCWhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLkhUVFBfQ1NQX0ZJUlNUTkFNRS5nZXRWYWx1ZSgpLCBoZWFkZXJEYXRhLmdldEh0dHBDc3BGaXJzdE5hbWUoKSk7CisJCWhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLkhUVFBfQ1NQX0xBU1ROQU1FLmdldFZhbHVlKCksIGhlYWRlckRhdGEuZ2V0SHR0cENzcExhc3ROYW1lKCkpOworCQloZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5IVFRQX0NTUF9XU1RZUEUuZ2V0VmFsdWUoKSwgaGVhZGVyRGF0YS5nZXRIdHRwQ3NwV3NUeXBlKCkpOworCQloZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5IVFRQX0lWX1JFTU9URV9BRERSRVNTLmdldFZhbHVlKCksIGhlYWRlckRhdGEuZ2V0SHR0cEl2UmVtb3RlQWRkcmVzcygpKTsKKwkJaGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uSFRUUF9JVl9VU0VSLmdldFZhbHVlKCksIGhlYWRlckRhdGEuZ2V0SHR0cEl2VXNlcigpKTsKKworCX0KKworCXB1YmxpYyBNdXN0SGVhZGVycygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRNYXAoKSB7CisJCXJldHVybiBoZWFkZXJzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9odHRwL1Jlc3RSZXNwb25zZS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9odHRwL1Jlc3RSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMWQzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2h0dHAvUmVzdFJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFJlc3RSZXNwb25zZSB7CisKKwlJbnRlZ2VyIGVycm9yQ29kZTsKKwlTdHJpbmcgcmVzcG9uc2U7CisJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJGaWVsZHM7CisJU3RyaW5nIHJlc3BvbnNlTWVzc2FnZTsKKworCXB1YmxpYyBSZXN0UmVzcG9uc2UoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFJlc3RSZXNwb25zZShJbnRlZ2VyIGVycm9yQ29kZSwgU3RyaW5nIHJlc3BvbnNlLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlckZpZWxkcywKKwkJCVN0cmluZyByZXNwb25zZU1lc3NhZ2UpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5lcnJvckNvZGUgPSBlcnJvckNvZGU7CisJCXRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKwkJdGhpcy5oZWFkZXJGaWVsZHMgPSBoZWFkZXJGaWVsZHM7CisJCXRoaXMucmVzcG9uc2VNZXNzYWdlID0gcmVzcG9uc2VNZXNzYWdlOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEVycm9yQ29kZSgpIHsKKwkJcmV0dXJuIGVycm9yQ29kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFcnJvckNvZGUoSW50ZWdlciBlcnJvckNvZGUpIHsKKwkJdGhpcy5lcnJvckNvZGUgPSBlcnJvckNvZGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNwb25zZSgpIHsKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgeworCQl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SGVhZGVyRmllbGRzKCkgeworCQlyZXR1cm4gaGVhZGVyRmllbGRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhlYWRlckZpZWxkcyhNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlckZpZWxkcykgeworCQl0aGlzLmhlYWRlckZpZWxkcyA9IGhlYWRlckZpZWxkczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlTWVzc2FnZSgpIHsKKwkJcmV0dXJuIHJlc3BvbnNlTWVzc2FnZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZU1lc3NhZ2UoU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSkgeworCQl0aGlzLnJlc3BvbnNlTWVzc2FnZSA9IHJlc3BvbnNlTWVzc2FnZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlc3RSZXNwb25zZSBbZXJyb3JDb2RlPSIgKyBlcnJvckNvZGUgKyAiLCByZXNwb25zZT0iICsgcmVzcG9uc2UgKyAiLCBoZWFkZXJGaWVsZHM9IiArIGhlYWRlckZpZWxkcworCQkJCSsgIiwgcmVzcG9uc2VNZXNzYWdlPSIgKyByZXNwb25zZU1lc3NhZ2UgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9UT0RPL0ltcG9ydENhcGFiaWxpdHlUeXBlQ0lUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9UT0RPL0ltcG9ydENhcGFiaWxpdHlUeXBlQ0lUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmNDBjNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL1RPRE8vSW1wb3J0Q2FwYWJpbGl0eVR5cGVDSVRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuVE9ETzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkNsb3NlYWJsZUh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLk11bHRpcGFydEVudGl0eUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLmNvbnRlbnQuRmlsZUJvZHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50Lkh0dHBDbGllbnRzOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlscy5UaXRhblN0YXRlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgSW1wb3J0Q2FwYWJpbGl0eVR5cGVDSVRlc3QgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGJVdGlscyBEYlV0aWxzID0gbmV3IERiVXRpbHMoKTsKKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyQ2xhc3MoKSB7CisJCURiVXRpbHMuc2h1dERvd250aXRhbigpOworCX0KKworCXN0YXRpYyBDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisKKwkvLyBwcml2YXRlIGZpbmFsIFN0cmluZyBJTVBPUlRfQ0FQQUJJTElUWV9UWVBFU19QQVRIID0KKwkvLyAic3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0X2NhcGFiaWxpdGllc1R5cGVzLyI7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRpbmdDYXBhYmlsaXR5VHlwZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlUaXRhblN0YXRlIG9yaWdpbmFsU3RhdGUgPSBEYlV0aWxzLmdldEN1cnJlbnRUaXRhblN0YXRlKCk7CisKKwkJU3RyaW5nIGltcG9ydFJlc291cmNlRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlQ29uZmlnRGlyKCk7CisKKwkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlcyA9IGltcG9ydFJlc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyAiY2FwYWJpbGl0eVR5cGVzQ2kuemlwIjsKKwkJLy8gaW1wb3J0Q2FwYWJpbGl0eVR5cGUoInNyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jYXBhYmlsaXR5VHlwZXNDaS56aXAiKTsKKwkJaW1wb3J0Q2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eVR5cGVzKTsKKwkJRWl0aGVyPFZlcnRleCwgQm9vbGVhbj4gZWl0aGVyVmVydGV4ID0gRGJVdGlscy5nZXRWZXJ0ZXhCeVVJZCgidG9zY2EuY2FwYWJpbGl0aWVzLlRlc3QuQ2kiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShlaXRoZXJWZXJ0ZXguaXNMZWZ0KCkpOworCQlEYlV0aWxzLnJlc3RvcmVUb1RpdGFuU3RhdGUob3JpZ2luYWxTdGF0ZSk7CisJCWVpdGhlclZlcnRleCA9IERiVXRpbHMuZ2V0VmVydGV4QnlVSWQoInRvc2NhLmNhcGFiaWxpdGllcy5UZXN0LkNpIik7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoZWl0aGVyVmVydGV4LmlzUmlnaHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBBZGRpbmdDYXBhYmlsaXR5Tm90Rm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlUaXRhblN0YXRlIG9yaWdpbmFsU3RhdGUgPSBEYlV0aWxzLmdldEN1cnJlbnRUaXRhblN0YXRlKCk7CisJCVN0cmluZyBpbXBvcnRSZXNvdXJjZVRlc3RzRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXIoKTsKKwkJU3RyaW5nIGNhcGFiaWxpdGllc1Rlc3RzID0gaW1wb3J0UmVzb3VyY2VUZXN0c0RpciArIEZpbGUuc2VwYXJhdG9yICsgImNhcGFiaWxpdHlUeXBlc0NpLnppcCI7CisJCWltcG9ydENhcGFiaWxpdHlUeXBlKGNhcGFiaWxpdGllc1Rlc3RzKTsKKwkJRWl0aGVyPFZlcnRleCwgQm9vbGVhbj4gZWl0aGVyVmVydGV4ID0gRGJVdGlscy5nZXRWZXJ0ZXhCeVVJZCgidG9zY2EuY2FwYWJpbGl0aWVzLk5vbkV4c2l0aW5nQ2FwYWJpbGl0eSIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGVpdGhlclZlcnRleC5pc1JpZ2h0KCkpOworCQlEYlV0aWxzLnJlc3RvcmVUb1RpdGFuU3RhdGUob3JpZ2luYWxTdGF0ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBJbnRlZ2VyIGltcG9ydEFsbENhcGFiaWxpdHlUeXBlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGltcG9ydFJlc291cmNlRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlQ29uZmlnRGlyKCkgKyBGaWxlLnNlcGFyYXRvciArICJjYXBhYmlsaXR5VHlwZXMuemlwIjsKKwkJLy8gcmV0dXJuCisJCS8vIGltcG9ydENhcGFiaWxpdHlUeXBlKCJzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2FwYWJpbGl0eVR5cGVzLnppcCIpOworCQlyZXR1cm4gaW1wb3J0Q2FwYWJpbGl0eVR5cGUoaW1wb3J0UmVzb3VyY2VEaXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIEludGVnZXIgaW1wb3J0Q2FwYWJpbGl0eVR5cGUoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCU11bHRpcGFydEVudGl0eUJ1aWxkZXIgbXBCdWlsZGVyID0gTXVsdGlwYXJ0RW50aXR5QnVpbGRlci5jcmVhdGUoKTsKKworCQltcEJ1aWxkZXIuYWRkUGFydCgiY2FwYWJpbGl0eVR5cGVaaXAiLCBuZXcgRmlsZUJvZHkobmV3IEZpbGUoZmlsZVBhdGgpKSk7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5JTVBPUlRfQ0FQQUJJTElUWV9UWVBFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJdHJ5IHsKKwkJCUh0dHBQb3N0IGh0dHBQb3N0ID0gbmV3IEh0dHBQb3N0KHVybCk7CisJCQlodHRwUG9zdC5hZGRIZWFkZXIoIlVTRVJfSUQiLCAiamgwMDAzIik7CisJCQlodHRwUG9zdC5zZXRFbnRpdHkobXBCdWlsZGVyLmJ1aWxkKCkpOworCQkJcmVzcG9uc2UgPSBjbGllbnQuZXhlY3V0ZShodHRwUG9zdCk7CisJCQlyZXR1cm4gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWNsb3NlUmVzcG9uc2UocmVzcG9uc2UpOworCQkJY2xvc2VIdHRwQ2xpZW50KGNsaWVudCk7CisKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VIdHRwQ2xpZW50KENsb3NlYWJsZUh0dHBDbGllbnQgY2xpZW50KSB7CisJCXRyeSB7CisJCQlpZiAoY2xpZW50ICE9IG51bGwpIHsKKwkJCQljbGllbnQuY2xvc2UoKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJmYWlsZWQgdG8gY2xvc2UgY2xpZW50IG9yIHJlc3BvbnNlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZVJlc3BvbnNlKENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSkgeworCQl0cnkgeworCQkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5jbG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWxlZCB0byBjbG9zZSBjbGllbnQgb3IgcmVzcG9uc2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2FydGlmYWN0cy9BcnRpZmFjdFNlcnZsZXRUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvQXJ0aWZhY3RTZXJ2bGV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDY0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvQXJ0aWZhY3RTZXJ2bGV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjU2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBSZXNwb25zZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuQ2xvc2VhYmxlSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwRGVsZXRlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LlN0cmluZ0VudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNSZXNwb25zZUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50Lkh0dHBDbGllbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkVudGl0eVV0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUucGFyc2VyLkpTT05QYXJzZXI7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLnBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0VWlEb3dubG9hZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkF0b21pY09wZXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdlbmVyYWxVdGlsaXR5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RTZXJ2bGV0VGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBcnRpZmFjdFNlcnZsZXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBMT0FEX0FSVElGQUNUX1BBWUxPQUQgPSAiVUhWVVZGa3RWWE5sY2kxTFpYa3RSbWxzWlMweU9pQnpjMmd0Y25OaERRcEZibU55ZVhCMGFXOXVPaUJoWlhNeU5UWXRZMkpqRFFwRGIyMXRaVzV3T0EwSyI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBMT0FEX0FSVElGQUNUX05BTUUgPSAiVExWX3Bydi5wcGsiOworCXByb3RlY3RlZCBDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisJcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHJvdGVjdGVkIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCXByb3RlY3RlZCBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCXByb3RlY3RlZCBKU09OUGFyc2VyIGpzb25QYXJzZXIgPSBuZXcgSlNPTlBhcnNlcigpOworCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZVZlcnNpb247CisJcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXA7CisJcHJvdGVjdGVkIFNlcnZpY2UgZGVmYXVsdFNlcnZpY2UxOworCisJcHJvdGVjdGVkIFVzZXIgc2RuY1VzZXJEZXRhaWxzOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBBcnRpZmFjdFNlcnZsZXRUZXN0KCkgeworCQlzdXBlcihuYW1lLCBBcnRpZmFjdFNlcnZsZXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgY3JlYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXN0UmVzcG9uc2U+IHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBFID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsIE5vcm1hdGl2ZVR5cGVzRW51bS5DT01QVVRFLAorCQkJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfQVBQX1NFUlZFUiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZDY29tcCA9IHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBFLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8U2VydmljZSwgUmVzdFJlc3BvbnNlPiBkZWZhdWx0U2VydmljZTFlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJZGVmYXVsdFNlcnZpY2UxID0gZGVmYXVsdFNlcnZpY2UxZS5sZWZ0KCkudmFsdWUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwYWR0ZUFydGlmYWN0V2l0aFBheUxvYWRUb1Jlc291cmNzZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFydGlmYWN0KCk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShkZWZhdWx0QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRkNjb21wLmdldFVuaXF1ZUlkKCkpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiYWRkIGluZm9ybWF0aW9uYWwgYXJ0aWZhY3QgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgMjAwLAorCQkJCXN0YXR1cyk7CisKKwkJZGVmYXVsdEFydGlmYWN0LnNldERlc2NyaXB0aW9uKCJramdsa2giKTsKKwkJZGVmYXVsdEFydGlmYWN0LnNldEFydGlmYWN0TmFtZSgiaW5zdGFsbF9hcGFjaGUuc2giKTsKKwkJZGVmYXVsdEFydGlmYWN0LnNldEFydGlmYWN0VHlwZSgiU0hFTEwiKTsKKwkJZGVmYXVsdEFydGlmYWN0LnNldFBheWxvYWQoIm5ldyBwYXlsb2FkIik7CisKKwkJcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGRlZmF1bHRBcnRpZmFjdCwgc2RuY1VzZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSk7CisJCXN0YXR1cyA9IHJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImZhaWxlZCB0byB1cGRhdGUgYXJ0aWZhY3QgbWV0YXRkYXRhOiAiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIDIwMCwgc3RhdHVzKTsKKworCQlyZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRlbGV0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdEZyb21SZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRkNjb21wLmdldFVuaXF1ZUlkKCksCisJCQkJZGVmYXVsdEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMpOworCQlzdGF0dXMgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJmYWlsZWQgdG8gcmVtb3ZlIGFydGlmYWN0OiAiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIDIwMCwgc3RhdHVzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlQW5kVXBkYXRlQXJ0aWZhY3RUb0ludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZTsKKwkJaW50IHN0YXR1czsKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCisJCXRyeSB7CisJCQkvLyB1cGxvYWQgYXJ0aWZhY3QgdG8gaW50ZXJmYWNlCisJCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSA9ICJTdGFuZGFyZCI7CisJCQlTdHJpbmcgb3BlcmF0aW9uTmFtZSA9ICJjb25maWd1cmUiOworCisJCQlTdHJpbmcgdXNlckJvZHlKc29uID0gY3JlYXRlVXBsb2FkQXJ0aWZhY3RCb2R5SnNvbigpOworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUExPQURfQVJUSUZBQ1RfQllfSU5URVJGQUNFX1RPX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZURldGFpbHNWRkNjb21wLmdldFVuaXF1ZUlkKCksIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUpOworCisJCQlIdHRwUG9zdCBodHRwUG9zdCA9IGNyZWF0ZVBvc3RBZGRBcnRpZmFjdFJlcXVlYXN0KHVzZXJCb2R5SnNvbiwgdXJsLCB0cnVlKTsKKwkJCXJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCXN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMCwgcmV0dXJuZWQgOiIgKyBzdGF0dXMsIHN0YXR1cywgMjAwKTsKKworCQkJLy8gZ2V0IGFydGlmYWN0IHVuaXF1ZUlkCisJCQlTdHJpbmcgYXJ0aWZhY3RJZCA9IGdldExpZmVjeWNsZUFydGlmYWN0VWlkKHJlc3BvbnNlKTsKKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uQm9keSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJanNvbkJvZHkucHV0KCJhcnRpZmFjdE5hbWUiLCAiVExWX3Bydi5wcGsiKTsKKwkJCWpzb25Cb2R5LnB1dCgiYXJ0aWZhY3REaXNwbGF5TmFtZSIsICJjb25maWd1cmUiKTsKKwkJCWpzb25Cb2R5LnB1dCgiYXJ0aWZhY3RUeXBlIiwgIlNIRUxMIik7CisJCQlqc29uQm9keS5wdXQoIm1hbmRhdG9yeSIsICJmYWxzZSIpOworCQkJU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIm5ldyBzb21ldGhpbmciOworCQkJanNvbkJvZHkucHV0KCJkZXNjcmlwdGlvbiIsIG5ld0Rlc2NyaXB0aW9uKTsKKwkJCWpzb25Cb2R5LnB1dCgiYXJ0aWZhY3RMYWJlbCIsICJjb25maWd1cmUiKTsKKwkJCXVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKGpzb25Cb2R5KTsKKworCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfQllfSU5URVJGQUNFX1RPX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZURldGFpbHNWRkNjb21wLmdldFVuaXF1ZUlkKCksIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUsCisJCQkJCWFydGlmYWN0SWQpOworCisJCQlodHRwUG9zdCA9IGNyZWF0ZVBvc3RBZGRBcnRpZmFjdFJlcXVlYXN0KHVzZXJCb2R5SnNvbiwgdXJsLCBmYWxzZSk7CisKKwkJCXJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCXN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMCwgcmV0dXJuZWQgOiIgKyBzdGF0dXMsIDIwMCwgc3RhdHVzKTsKKworCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQkJcmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpKTsKKwkJCUh0dHBHZXQgaHR0cEdldCA9IGNyZWF0ZUdldFJlcXVlc3QodXJsKTsKKwkJCXJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBHZXQpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IDIwMCk7CisJCQlTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSBuZXcgQmFzaWNSZXNwb25zZUhhbmRsZXIoKS5oYW5kbGVSZXNwb25zZShyZXNwb25zZSk7CisKKwkJCUpTT05PYmplY3QgcmVzcG9uc2VNYXAgPSAoSlNPTk9iamVjdCkganNvblBhcnNlci5wYXJzZShyZXNwb25zZVN0cmluZyk7CisJCQlyZXNwb25zZU1hcCA9IChKU09OT2JqZWN0KSByZXNwb25zZU1hcC5nZXQoImludGVyZmFjZXMiKTsKKwkJCXJlc3BvbnNlTWFwID0gKEpTT05PYmplY3QpIHJlc3BvbnNlTWFwLmdldChpbnRlcmZhY2VOYW1lLnRvTG93ZXJDYXNlKCkpOworCQkJcmVzcG9uc2VNYXAgPSAoSlNPTk9iamVjdCkgcmVzcG9uc2VNYXAuZ2V0KCJvcGVyYXRpb25zIik7CisJCQlyZXNwb25zZU1hcCA9IChKU09OT2JqZWN0KSByZXNwb25zZU1hcC5nZXQob3BlcmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKTsKKwkJCXJlc3BvbnNlTWFwID0gKEpTT05PYmplY3QpIHJlc3BvbnNlTWFwLmdldCgiaW1wbGVtZW50YXRpb24iKTsKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpIHJlc3BvbnNlTWFwLmdldCgiZGVzY3JpcHRpb24iKTsKKworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJ0aGUgbmV3IGRlc2NyaXB0aW9uIHZhbHVlIHdhcyBub3Qgc2V0IiwgbmV3RGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKTsKKworCQkJLy8gZGVsZXRlIGFydGlmYWN0CisJCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9CWV9JTlRFUkZBQ0VfVE9fUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uTmFtZSwKKwkJCQkJYXJ0aWZhY3RJZCk7CisJCQlIdHRwRGVsZXRlIGh0dHBEZWxldGUgPSBjcmVhdGVEZWxldGVBcnRpZmFjdFJlcXVlc3QodXJsKTsKKworCQkJcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cERlbGV0ZSk7CisJCQlzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgc3RhdHVzLCBzdGF0dXMsIDIwMCk7CisJCX0gZmluYWxseSB7CisJCQlodHRwY2xpZW50LmNsb3NlKCk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVXBsb2FkQXJ0aWZhY3RCb2R5SnNvbigpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uQm9keSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlqc29uQm9keS5wdXQoImFydGlmYWN0TmFtZSIsIFVQTE9BRF9BUlRJRkFDVF9OQU1FKTsKKwkJanNvbkJvZHkucHV0KCJhcnRpZmFjdERpc3BsYXlOYW1lIiwgImNvbmZpZ3VyZSIpOworCQlqc29uQm9keS5wdXQoImFydGlmYWN0VHlwZSIsICJTSEVMTCIpOworCQlqc29uQm9keS5wdXQoIm1hbmRhdG9yeSIsICJmYWxzZSIpOworCQlqc29uQm9keS5wdXQoImRlc2NyaXB0aW9uIiwgImZmIik7CisJCWpzb25Cb2R5LnB1dCgicGF5bG9hZERhdGEiLCBVUExPQURfQVJUSUZBQ1RfUEFZTE9BRCk7CisJCWpzb25Cb2R5LnB1dCgiYXJ0aWZhY3RMYWJlbCIsICJjb25maWd1cmUiKTsKKwkJcmV0dXJuIGdzb24udG9Kc29uKGpzb25Cb2R5KTsKKwl9CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3REZWZpbml0aW9uIGdldEFydGlmYWN0RGF0YUZyb21Kc29uKFN0cmluZyBqc29uKSB7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oKTsKKwkJYXJ0aWZhY3QgPSBnc29uLmZyb21Kc29uKGpzb24sIEFydGlmYWN0RGVmaW5pdGlvbi5jbGFzcyk7CisKKwkJLyoKKwkJICogYXRpZmFjdC5zZXRBcnRpZmFjdE5hbWUoVVBMT0FEX0FSVElGQUNUX05BTUUpOworCQkgKiBhcnRpZmFjdC5zZXRBcnRpZmFjdERpc3BsYXlOYW1lKCJjb25maWd1cmUiKTsKKwkJICogYXJ0aWZhY3Quc2V0QXJ0aWZhY3RUeXBlKCJTSEVMTCIpOyBhcnRpZmFjdC5zZXRNYW5kYXRvcnkoZmFsc2UpOworCQkgKiBhcnRpZmFjdC5zZXREZXNjcmlwdGlvbigiZmYiKTsKKwkJICogYXJ0aWZhY3Quc2V0UGF5bG9hZERhdGEoVVBMT0FEX0FSVElGQUNUX1BBWUxPQUQpOworCQkgKiBhcnRpZmFjdC5zZXRBcnRpZmFjdExhYmVsKCJjb25maWd1cmUiKTsKKwkJICovCisJCXJldHVybiBhcnRpZmFjdDsKKwl9CisKKwlwcm90ZWN0ZWQgSHR0cEdldCBjcmVhdGVHZXRSZXF1ZXN0KFN0cmluZyB1cmwpIHsKKwkJSHR0cEdldCBodHRwR2V0ID0gbmV3IEh0dHBHZXQodXJsKTsKKwkJaHR0cEdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWh0dHBHZXQuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaHR0cEdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlyZXR1cm4gaHR0cEdldDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFydGlmYWN0VWlkKEh0dHBSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEh0dHBSZXNwb25zZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gbmV3IEJhc2ljUmVzcG9uc2VIYW5kbGVyKCkuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpOworCQlKU09OT2JqZWN0IHJlc3BvbnNlTWFwID0gKEpTT05PYmplY3QpIGpzb25QYXJzZXIucGFyc2UocmVzcG9uc2VTdHJpbmcpOworCQlTdHJpbmcgYXJ0aWZhY3RJZCA9IChTdHJpbmcpIHJlc3BvbnNlTWFwLmdldCgidW5pcXVlSWQiKTsKKwkJcmV0dXJuIGFydGlmYWN0SWQ7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRBcnRpZmFjdEVzSWQoSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSHR0cFJlc3BvbnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworCQlTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSBuZXcgQmFzaWNSZXNwb25zZUhhbmRsZXIoKS5oYW5kbGVSZXNwb25zZShyZXNwb25zZSk7CisJCUpTT05PYmplY3QgcmVzcG9uc2VNYXAgPSAoSlNPTk9iamVjdCkganNvblBhcnNlci5wYXJzZShyZXNwb25zZVN0cmluZyk7CisJCVN0cmluZyBlc0lkID0gKFN0cmluZykgcmVzcG9uc2VNYXAuZ2V0KCJFc0lkIik7CisJCXJldHVybiBlc0lkOworCX0KKworCXByb3RlY3RlZCBBcnRpZmFjdERlZmluaXRpb24gYWRkQXJ0aWZhY3REYXRhRnJvbVJlc3BvbnNlKEh0dHBSZXNwb25zZSByZXNwb25zZSwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0KQorCQkJdGhyb3dzIEh0dHBSZXNwb25zZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKwkJLy8gU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gbmV3CisJCS8vIEJhc2ljUmVzcG9uc2VIYW5kbGVyKCkuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpOworCQlIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworCQlTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSBFbnRpdHlVdGlscy50b1N0cmluZyhlbnRpdHkpOworCQlKU09OT2JqZWN0IHJlc3BvbnNlTWFwID0gKEpTT05PYmplY3QpIGpzb25QYXJzZXIucGFyc2UocmVzcG9uc2VTdHJpbmcpOworCQlhcnRpZmFjdC5zZXRFc0lkKChTdHJpbmcpIHJlc3BvbnNlTWFwLmdldCgiZXNJZCIpKTsKKwkJYXJ0aWZhY3Quc2V0VW5pcXVlSWQoKFN0cmluZykgcmVzcG9uc2VNYXAuZ2V0KCJ1bmlxdWVJZCIpKTsKKwkJYXJ0aWZhY3Quc2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLmZpbmRUeXBlKChTdHJpbmcpIHJlc3BvbnNlTWFwLmdldCgiYXJ0aWZhY3RHcm91cFR5cGUiKSkpOworCQlhcnRpZmFjdC5zZXRUaW1lb3V0KCgoTG9uZykgcmVzcG9uc2VNYXAuZ2V0KCJ0aW1lb3V0IikpLmludFZhbHVlKCkpOworCQlyZXR1cm4gYXJ0aWZhY3Q7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMaWZlY3ljbGVBcnRpZmFjdFVpZChDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UpCisJCQl0aHJvd3MgSHR0cFJlc3BvbnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworCQlTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSBuZXcgQmFzaWNSZXNwb25zZUhhbmRsZXIoKS5oYW5kbGVSZXNwb25zZShyZXNwb25zZSk7CisJCUpTT05PYmplY3QgcmVzcG9uc2VNYXAgPSAoSlNPTk9iamVjdCkganNvblBhcnNlci5wYXJzZShyZXNwb25zZVN0cmluZyk7CisJCXJlc3BvbnNlTWFwID0gKEpTT05PYmplY3QpIHJlc3BvbnNlTWFwLmdldCgiaW1wbGVtZW50YXRpb24iKTsKKwkJU3RyaW5nIGFydGlmYWN0SWQgPSAoU3RyaW5nKSByZXNwb25zZU1hcC5nZXQoInVuaXF1ZUlkIik7CisJCXJldHVybiBhcnRpZmFjdElkOworCX0KKworCXByb3RlY3RlZCBIdHRwRGVsZXRlIGNyZWF0ZURlbGV0ZUFydGlmYWN0UmVxdWVzdChTdHJpbmcgdXJsKSB7CisJCUh0dHBEZWxldGUgaHR0cERlbGV0ZSA9IG5ldyBIdHRwRGVsZXRlKHVybCk7CisJCWh0dHBEZWxldGUuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJaHR0cERlbGV0ZS5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQlyZXR1cm4gaHR0cERlbGV0ZTsKKwl9CisKKwlwcm90ZWN0ZWQgSHR0cFBvc3QgY3JlYXRlUG9zdEFkZEFydGlmYWN0UmVxdWVhc3QoU3RyaW5nIGpzb25Cb2R5LCBTdHJpbmcgdXJsLCBib29sZWFuIGFkZE1kNUhlYWRlcikKKwkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKwkJSHR0cFBvc3QgaHR0cHBvc3QgPSBuZXcgSHR0cFBvc3QodXJsKTsKKwkJaHR0cHBvc3QuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQlodHRwcG9zdC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQlodHRwcG9zdC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlpZiAoYWRkTWQ1SGVhZGVyKSB7CisJCQlodHRwcG9zdC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQ29udGVudF9NRDUuZ2V0VmFsdWUoKSwgR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlTdHJpbmcoanNvbkJvZHkpKTsKKwkJfQorCQlTdHJpbmdFbnRpdHkgaW5wdXQgPSBuZXcgU3RyaW5nRW50aXR5KGpzb25Cb2R5KTsKKwkJaW5wdXQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaHR0cHBvc3Quc2V0RW50aXR5KGlucHV0KTsKKwkJbG9nLmRlYnVnKCJFeGVjdXRpbmcgcmVxdWVzdCB7fSIsIGh0dHBwb3N0LmdldFJlcXVlc3RMaW5lKCkpOworCQlyZXR1cm4gaHR0cHBvc3Q7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVMb2FkQXJ0aWZhY3RCb2R5KCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJanNvbi5wdXQoImFydGlmYWN0TmFtZSIsICJpbnN0YWxsX2FwYWNoZTIuc2giKTsKKwkJanNvbi5wdXQoImFydGlmYWN0VHlwZSIsICJTSEVMTCIpOworCQlqc29uLnB1dCgiZGVzY3JpcHRpb24iLCAiZGRkIik7CisJCWpzb24ucHV0KCJwYXlsb2FkRGF0YSIsICJVRXNEQkFvQUFBQUlBQWVMYjBiRFF6Iik7CisJCWpzb24ucHV0KCJhcnRpZmFjdExhYmVsIiwgIm5hbWUxMjMiKTsKKworCQlTdHJpbmcganNvblN0ciA9IGdzb24udG9Kc29uKGpzb24pOworCQlyZXR1cm4ganNvblN0cjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0RlbGV0ZVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShyZXNwb25zZSwgImRlbGV0ZSByZXF1ZXN0IGZhaWxlZCIsIGZhbHNlLCAyMDQsIDQwNCk7CisJfQorCisJcHJvdGVjdGVkIEFydGlmYWN0VWlEb3dubG9hZERhdGEgZ2V0QXJ0aWZhY3RVaURvd25sb2FkRGF0YShTdHJpbmcgYXJ0aWZhY3RVaURvd25sb2FkRGF0YVN0cikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJdHJ5IHsKKwkJCUFydGlmYWN0VWlEb3dubG9hZERhdGEgYXJ0aWZhY3RVaURvd25sb2FkRGF0YSA9IG1hcHBlci5yZWFkVmFsdWUoYXJ0aWZhY3RVaURvd25sb2FkRGF0YVN0ciwKKwkJCQkJQXJ0aWZhY3RVaURvd25sb2FkRGF0YS5jbGFzcyk7CisJCQlyZXR1cm4gYXJ0aWZhY3RVaURvd25sb2FkRGF0YTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gVE9ETworCS8vIEBJZ25vcmUoIiIpCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRBcnRpZmFjdE5vUGF5TG9hZFRvUmVzb3VyY3NlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFydGlmYWN0KCk7CisJCWRlZmF1bHRBcnRpZmFjdC5zZXRQYXlsb2FkKG51bGwpOworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoZGVmYXVsdEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpKTsKKwkJaW50IHN0YXR1cyA9IHJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKHN0YXR1cyA9PSA0MDApOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGFkdGVBcnRpZmFjdE5vUGF5TG9hZFRvUmVzb3VyY3NlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCUFydGlmYWN0UmVxRGV0YWlscyBkZWZhdWx0QXJ0aWZhY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXJ0aWZhY3QoKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGRlZmF1bHRBcnRpZmFjdCwgc2RuY1VzZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSk7CisJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJhZGQgaW5mb3JtYXRpb25hbCBhcnRpZmFjdCByZXF1ZXN0IHJldHVybmVkIHN0YXR1czogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCAyMDAsCisJCQkJc3RhdHVzKTsKKworCQlkZWZhdWx0QXJ0aWZhY3Quc2V0RGVzY3JpcHRpb24oImtqZ2xraCIpOworCQlkZWZhdWx0QXJ0aWZhY3Quc2V0QXJ0aWZhY3ROYW1lKCJpbnN0YWxsX2FwYWNoZS5zaCIpOworCQlkZWZhdWx0QXJ0aWZhY3Quc2V0QXJ0aWZhY3RUeXBlKCJTSEVMTCIpOworCQlkZWZhdWx0QXJ0aWZhY3Quc2V0UGF5bG9hZChudWxsKTsKKworCQlyZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoZGVmYXVsdEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpKTsKKwkJc3RhdHVzID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiZmFpbGVkIHRvIHVwZGF0ZSBhcnRpZmFjdCBtZXRhdGRhdGE6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgMjAwLCBzdGF0dXMpOworCisJCXJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZGVsZXRlSW5mb3JtYXRpb25hbEFydGlmYWN0RnJvbVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSwKKwkJCQlkZWZhdWx0QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscyk7CisJCXN0YXR1cyA9IHJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImZhaWxlZCB0byByZW1vdmUgYXJ0aWZhY3Q6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgMjAwLCBzdGF0dXMpOworCisJfQorCisJLy8gVE9ETworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNzZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoIkhFQVQiKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGRlZmF1bHRBcnRpZmFjdCwgc2RuY1VzZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSk7CisJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJhZGQgaW5mb3JtYXRpb25hbCBhcnRpZmFjdCByZXF1ZXN0IHJldHVybmVkIHN0YXR1czogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCAyMDAsCisJCQkJc3RhdHVzKTsKKworCQlyZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoZGVmYXVsdEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpKTsKKwkJc3RhdHVzID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiZmFpbGVkIHRvIHVwZGF0ZSBhcnRpZmFjdCBtZXRhdGRhdGE6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgMjAwLCBzdGF0dXMpOworCisJCXJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZGVsZXRlSW5mb3JtYXRpb25hbEFydGlmYWN0RnJvbVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSwKKwkJCQlkZWZhdWx0QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscyk7CisJCXN0YXR1cyA9IHJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImZhaWxlZCB0byByZW1vdmUgYXJ0aWZhY3Q6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgMjAwLCBzdGF0dXMpOworCisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEFydGlmYWN0VG9SZXNvdXJjc2VfQWxyZWFkeUV4aXN0c1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCQl0cnkgeworCQkJU3RyaW5nIGpzb25Cb2R5ID0gY3JlYXRlTG9hZEFydGlmYWN0Qm9keSgpOworCisJCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkFERF9BUlRJRkFDVF9UT19SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpKTsKKwkJCUh0dHBQb3N0IGh0dHBwb3N0ID0gY3JlYXRlUG9zdEFkZEFydGlmYWN0UmVxdWVhc3QoanNvbkJvZHksIHVybCwgdHJ1ZSk7CisJCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cHBvc3QpOworCQkJaW50IHN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJmYWlsZWQgdG8gYWRkIGFydGlmYWN0Iiwgc3RhdHVzID09IDIwMCk7CisKKwkJCVN0cmluZyBhcnRpZmFjdElkID0gZ2V0QXJ0aWZhY3RVaWQocmVzcG9uc2UpOworCisJCQlodHRwcG9zdCA9IGNyZWF0ZVBvc3RBZGRBcnRpZmFjdFJlcXVlYXN0KGpzb25Cb2R5LCB1cmwsIHRydWUpOworCQkJcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cHBvc3QpOworCQkJc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygidGhlIHJldHVybmVkIHN0YXR1cyBjb2RlIGlzIGluIGNvcnJlY3QiLCBzdGF0dXMsIDQwMCk7CisKKwkJCXVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfT1JfREVMRVRFX0FSVElGQUNUX09GX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZURldGFpbHNWRkNjb21wLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0SWQpOworCQkJSHR0cERlbGV0ZSBodHRwRGVsZXRlID0gY3JlYXRlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KHVybCk7CisJCQlyZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwRGVsZXRlKTsKKwkJCXN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJmYWlsZWQgdG8gcmVtb3ZlIGFydGlmYWN0Iiwgc3RhdHVzID09IDIwMCk7CisJCX0gZmluYWxseSB7CisJCQlodHRwY2xpZW50LmNsb3NlKCk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkQXJ0aWZhY3RUb1Jlc291cmNzZV9NaXNzaW5nQ29udGVudFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCXRyeSB7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCWpzb24ucHV0KCJkZXNjcmlwdGlvbiIsICJkZXNjIik7CisJCQlqc29uLnB1dCgicGF5bG9hZERhdGEiLCAiVUVzREJBb0FBQUFJQUFlTGIwYkRReiIpOworCQkJanNvbi5wdXQoIkNvbnRlbnQtTUQ1IiwgIllUZzJNamc0TVdKaE5tSTVOekJpTnpkREZrTVdJPSIpOworCisJCQlTdHJpbmcganNvbkJvZHkgPSBnc29uLnRvSnNvbihqc29uKTsKKworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5BRERfQVJUSUZBQ1RfVE9fUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSk7CisJCQlIdHRwUG9zdCBodHRwcG9zdCA9IGNyZWF0ZVBvc3RBZGRBcnRpZmFjdFJlcXVlYXN0KGpzb25Cb2R5LCB1cmwsIHRydWUpOworCQkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBwb3N0KTsKKwkJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJ0aGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUgaXMgaW4gY29ycmVjdCIsIHN0YXR1cywgNDAwKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWh0dHBjbGllbnQuY2xvc2UoKTsKKwkJfQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRBcnRpZmFjdFRvUmVzb3VyY3NlX01pc3NpbmdNZDVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCQl0cnkgeworCQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJanNvbi5wdXQoImFydGlmYWN0TmFtZSIsICJpbnN0YWxsX2FwYWNoZS5zaCIpOworCQkJanNvbi5wdXQoImFydGlmYWN0VHlwZSIsICJTSEVMTCIpOworCQkJanNvbi5wdXQoImRlc2NyaXB0aW9uIiwgImtqZ2xraCIpOworCQkJanNvbi5wdXQoInBheWxvYWREYXRhIiwgIlVFc0RCWVRFSVdVWUlGSFdGTUFCQ05Bb0FBQUFJQUFlTGIwYkRReiIpOworCQkJanNvbi5wdXQoImFydGlmYWN0TGFiZWwiLCAibmFtZTEyMyIpOworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5BRERfQVJUSUZBQ1RfVE9fUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSk7CisJCQlTdHJpbmcganNvbkJvZHkgPSBnc29uLnRvSnNvbihqc29uKTsKKwkJCUh0dHBQb3N0IGh0dHBwb3N0ID0gY3JlYXRlUG9zdEFkZEFydGlmYWN0UmVxdWVhc3QoanNvbkJvZHksIHVybCwgZmFsc2UpOworCQkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBwb3N0KTsKKwkJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIHVwZGF0ZSBhcnRpZmFjdCBtZXRhdGRhdGEiLCBzdGF0dXMgPT0gNDAwKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWh0dHBjbGllbnQuY2xvc2UoKTsKKwkJfQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVBcnRpZmFjdF9Ob3RFeGlzdHNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNsb3NlYWJsZUh0dHBDbGllbnQgaHR0cGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJdHJ5IHsKKwkJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9PRl9SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpLCAic29tZUZha2VJZCIpOworCQkJSHR0cERlbGV0ZSBodHRwRGVsZXRlID0gY3JlYXRlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KHVybCk7CisJCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cERlbGV0ZSk7CisJCQlpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygidGhlIHJldHVybmVkIHN0YXR1cyBjb2RlIGlzIGluIGNvcnJlY3QiLCBzdGF0dXMsIDQwNCk7CisJCX0gZmluYWxseSB7CisJCQlodHRwY2xpZW50LmNsb3NlKCk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlQW5kUmVtb3ZlQXJ0aWZhY3RUb0ludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2U7CisJCWludCBzdGF0dXM7CisJCUNsb3NlYWJsZUh0dHBDbGllbnQgaHR0cGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKworCQl0cnkgeworCQkJLy8gdXBsb2FkIGFydGlmYWN0IHRvIGludGVyZmFjZQorCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSAiU3RhbmRhcmQiOworCQkJU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAiY29uZmlndXJlIjsKKworCQkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGNyZWF0ZVVwbG9hZEFydGlmYWN0Qm9keUpzb24oKTsKKwkJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBMT0FEX0FSVElGQUNUX0JZX0lOVEVSRkFDRV9UT19SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25OYW1lKTsKKworCQkJSHR0cFBvc3QgaHR0cFBvc3QgPSBjcmVhdGVQb3N0QWRkQXJ0aWZhY3RSZXF1ZWFzdCh1c2VyQm9keUpzb24sIHVybCwgdHJ1ZSk7CisJCQlyZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwUG9zdCk7CisJCQlzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgc3RhdHVzLCBzdGF0dXMsIDIwMCk7CisKKwkJCS8vIGdldCBhcnRpZmFjdCB1bmlxdWVJZAorCQkJU3RyaW5nIGFydGlmYWN0SWQgPSBnZXRMaWZlY3ljbGVBcnRpZmFjdFVpZChyZXNwb25zZSk7CisKKwkJCS8vIGRlbGV0ZSBhcnRpZmFjdAorCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfQllfSU5URVJGQUNFX1RPX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZURldGFpbHNWRkNjb21wLmdldFVuaXF1ZUlkKCksIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUsCisJCQkJCWFydGlmYWN0SWQpOworCQkJSHR0cERlbGV0ZSBodHRwRGVsZXRlID0gY3JlYXRlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KHVybCk7CisKKwkJCXJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBEZWxldGUpOworCQkJc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIHN0YXR1cywgc3RhdHVzLCAyMDApOworCQl9IGZpbmFsbHkgeworCQkJaHR0cGNsaWVudC5jbG9zZSgpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEFydGlmYWN0VG9TZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCUNsb3NlYWJsZUh0dHBDbGllbnQgaHR0cGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKworCQl0cnkgeworCQkJU3RyaW5nIGpzb25TdHIgPSBjcmVhdGVMb2FkQXJ0aWZhY3RCb2R5KCk7CisKKwkJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQUREX0FSVElGQUNUX1RPX1NFUlZJQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIGRlZmF1bHRTZXJ2aWNlMS5nZXRVbmlxdWVJZCgpKTsKKwkJCUh0dHBQb3N0IGh0dHBQb3N0ID0gY3JlYXRlUG9zdEFkZEFydGlmYWN0UmVxdWVhc3QoanNvblN0ciwgdXJsLCB0cnVlKTsKKwkJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXN1bHQgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cFBvc3QpOworCQkJaW50IHN0YXR1cyA9IHJlc3VsdC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgc3RhdHVzLCAyMDAsIHN0YXR1cyk7CisKKwkJCVN0cmluZyBhcnRpZmFjdElkID0gZ2V0QXJ0aWZhY3RVaWQocmVzdWx0KTsKKworCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfT0ZfU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgZGVmYXVsdFNlcnZpY2UxLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0SWQpOworCQkJSHR0cERlbGV0ZSBodHRwRGVsZXRlID0gY3JlYXRlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KHVybCk7CisKKwkJCXJlc3VsdCA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwRGVsZXRlKTsKKwkJCXN0YXR1cyA9IHJlc3VsdC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgc3RhdHVzLCAyMDAsIHN0YXR1cyk7CisJCX0gZmluYWxseSB7CisJCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmRlbGV0ZVNlcnZpY2UoZGVmYXVsdFNlcnZpY2UxLmdldE5hbWUoKSwgc2VydmljZVZlcnNpb24sCisJCQkJCXNkbmNVc2VyRGV0YWlscyk7CisJCQljaGVja0RlbGV0ZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJCWh0dHBjbGllbnQuY2xvc2UoKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkQXJ0aWZhY3ROb3RTdXBwb3J0ZWRUeXBlVG9TZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCXRyeSB7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCWpzb24ucHV0KCJhcnRpZmFjdE5hbWUiLCAiaW5zdGFsbF9hcGFjaGUuc2giKTsKKwkJCWpzb24ucHV0KCJhcnRpZmFjdFR5cGUiLCAiU0hFTEwxMSIpOworCQkJanNvbi5wdXQoImRlc2NyaXB0aW9uIiwgImZmZiIpOworCQkJanNvbi5wdXQoInBheWxvYWREYXRhIiwgIlVFc0RCQW9BQUFBSUFBZUxiMGJEUXoiKTsKKwkJCWpzb24ucHV0KCJhcnRpZmFjdExhYmVsIiwgIm5hbWUxMjMiKTsKKworCQkJU3RyaW5nIGpzb25TdHIgPSBnc29uLnRvSnNvbihqc29uKTsKKworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5BRERfQVJUSUZBQ1RfVE9fU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgZGVmYXVsdFNlcnZpY2UxLmdldFVuaXF1ZUlkKCkpOworCisJCQlIdHRwUG9zdCBodHRwUG9zdCA9IGNyZWF0ZVBvc3RBZGRBcnRpZmFjdFJlcXVlYXN0KGpzb25TdHIsIHVybCwgdHJ1ZSk7CisJCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzdWx0ID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCWludCBzdGF0dXMgPSByZXN1bHQuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygicmVzcG9uc2UgY29kZSBpcyBub3QgNDAwLCByZXR1cm5lZCA6IiArIHN0YXR1cywgNDAwLCBzdGF0dXMpOworCisJCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMKKwkJCQkJLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQubmFtZSgpKTsKKworCQkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gRW50aXR5VXRpbHMudG9TdHJpbmcocmVzdWx0LmdldEVudGl0eSgpKTsKKworCQkJSlNPTk9iamVjdCBtYXAgPSAoSlNPTk9iamVjdCkganNvblBhcnNlci5wYXJzZShyZXNwb25zZVN0cmluZyk7CisJCQlKU09OT2JqZWN0IHJlcXVlc3RFcnJvciA9IChKU09OT2JqZWN0KSBtYXAuZ2V0KCJyZXF1ZXN0RXJyb3IiKTsKKwkJCUpTT05PYmplY3Qgc2VydmljZUV4Y2VwdGlvbiA9IChKU09OT2JqZWN0KSByZXF1ZXN0RXJyb3IuZ2V0KCJzZXJ2aWNlRXhjZXB0aW9uIik7CisKKwkJCVN0cmluZyBtc2dJZCA9IChTdHJpbmcpIHNlcnZpY2VFeGNlcHRpb24uZ2V0KCJtZXNzYWdlSWQiKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygibWVzc2FnZSBpZCBkaWQgbm90IG1hdGNoIGV4cGFjdGVkIiwgZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpLCBtc2dJZCk7CisKKwkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgc2VydmljZUV4Y2VwdGlvbi5nZXQoInRleHQiKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygidGV4dCBkaWQgbm90IG1hdGNoIGV4cGFjdGVkIiwgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKSwgdGV4dCk7CisKKwkJCUpTT05BcnJheSB2YXJpYWJsZXMgPSAoSlNPTkFycmF5KSBzZXJ2aWNlRXhjZXB0aW9uLmdldCgidmFyaWFibGVzIik7CisJCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHZhcmlhYmxlcy5nZXQoMCk7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoInZhcmlhYmxlIGRpZCBub3QgbWF0Y2ggZXhwYWN0ZWQiLCAiU0hFTEwxMSIsIHR5cGUpOworCQl9IGZpbmFsbHkgeworCQkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlKGRlZmF1bHRTZXJ2aWNlMS5nZXROYW1lKCksIHNlcnZpY2VWZXJzaW9uLAorCQkJCQlzZG5jVXNlckRldGFpbHMpOworCQkJY2hlY2tEZWxldGVSZXNwb25zZShyZXNwb25zZSk7CisJCQlodHRwY2xpZW50LmNsb3NlKCk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkQXJ0aWZhY3RUb1Jlc291cmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCUFydGlmYWN0UmVxRGV0YWlscyBkZWZhdWx0QXJ0aWZhY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXJ0aWZhY3QoKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGRlZmF1bHRBcnRpZmFjdCwgc2RuY1VzZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGQ2NvbXAuZ2V0VW5pcXVlSWQoKSk7CisJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJhZGQgaW5mb3JtYXRpb25hbCBhcnRpZmFjdCByZXF1ZXN0IHJldHVybmVkIHN0YXR1czogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCAyMDAsCisJCQkJc3RhdHVzKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VSZXNwID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkZDY29tcC5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gcmVzb3VyY2UuZ2V0QXJ0aWZhY3RzKCk7CisJCWJvb2xlYW4gaXNFeGlzdCA9IGZhbHNlOworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJaWYgKGVudHJ5LmdldEtleSgpLmVxdWFscyhkZWZhdWx0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RMYWJlbCgpKSkgeworCQkJCWlzRXhpc3QgPSB0cnVlOworCisJCQl9CisJCX0KKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShpc0V4aXN0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvQ3J1ZEFydC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXJ0aWZhY3RzL0NydWRBcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2MzZjNmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXJ0aWZhY3RzL0NydWRBcnQuamF2YQpAQCAtMCwwICsxLDE3NTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLlBhaXI7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BcnRpZmFjdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkJhc2VWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENydWRBcnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3J1ZEFydC5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVRfTkVUX0xBQkVMID0gImhlYXRuZXQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFUX0xBQkVMID0gImhlYXQiOworCisJcHJvdGVjdGVkIFN0cmluZyB0ZXN0UmVzb3VyY2VzUGF0aDsKKwlwcm90ZWN0ZWQgU3RyaW5nIHRlc3RSZXNvdXJjZXNJbnN0YW5jZXNQYXRoOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGNhZUludmVudG9yeVRvc2NhRmlsZSA9ICJ0b3NjYVNhbXBsZUFydGlmYWN0LnltbCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGNhZUludmVudG9yeUpzb25GaWxlID0gImpzb25TYW1wbGVBcnRpZmFjdC5qc29uIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBkY2FlSW52ZW50b3J5UG9saWN5RmlsZSA9ICJlbWZTYW1wbGVBcnRpZmFjdC5lbWYiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGRjYWVJbnZlbnRvcnlEb2NGaWxlID0gImRvY1NhbXBsZUFydGlmYWN0LmRvYyI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGNhZUludmVudG9yeUJsdWVwcmludEZpbGUgPSAiYmx1ZVByaW50U2FtcGxlQXJ0aWZhY3QueG1sIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBkY2FlSW52ZW50b3J5RXZlbnRGaWxlID0gImV2ZW50U2FtcGxlQXJ0aWZhY3QueG1sIjsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGhlYXRTdWNjZXNzRmlsZSA9ICJhc2NfaGVhdCAwIDIueWFtbCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaGVhdE5ldFN1Y2Nlc3NGaWxlID0gImFzY19oZWF0X25ldCAwIDIueWFtbCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgeWFuZ0ZpbGUgPSAiYWRkWWFuZ1htbEFydGlmYWN0VG9SZXNvdXJjZS54bWwiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGpzb25GaWxlID0gImpzb25BcnRpZmFjdC5qc29uIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbnZhbGlkSnNvbkZpbGUgPSAiaW52YWxpZEpzb24uanNvbiI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW52YWxpZFlhbmdGaWxlID0gImludmFsaWRZYW5nWG1sLnhtbCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3RoZXJGaWxlID0gIm90aGVyLnR4dCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVyYW5vRmlsZSA9ICJhc2NfaGVhdCAwIDIuemlwIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBoZWF0U3VjY2Vzc01pbmlGaWxlID0gImhlYXRfbWluaS55YW1sIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBoZWF0SW52YWxpZEZvcm1hdCA9ICJoZWF0SW52YWxpZEZvcm1hdC55YW1sIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB5YW1sSW52YWxpZEZvcm1hdCA9ICJpbnZhbGlkWWFtbEZvcm1hdC55YW1sIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBoZWF0RW52ZmlsZSA9ICJoZWF0RW52ZmlsZS5lbnYiOworCisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgdmZSZXNvdXJjZURldGFpbHM7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyBjcFJlc291cmNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHZmY1Jlc291cmNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHZsUmVzb3VyY2VEZXRhaWxzOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBDcnVkQXJ0KCkgeworCQlzdXBlcihuYW1lLCBDcnVkQXJ0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQERhdGFQcm92aWRlcgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gZ2V0RGVwQXJ0QnlUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IE9iamVjdFtdW10geyB7IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpIH0sIHsgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX1ZPTC5nZXRUeXBlKCkpIH0sCisJCQkJeyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVULmdldFR5cGUoKSkgfSwgeyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkRDQUVfSU5WRU5UT1JZX1RPU0NBLmdldFR5cGUoKSkgfSwKKwkJCQl7IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uRENBRV9JTlZFTlRPUllfSlNPTi5nZXRUeXBlKCkpIH0sIHsgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5EQ0FFX0lOVkVOVE9SWV9QT0xJQ1kuZ2V0VHlwZSgpKSB9LAorCQkJCXsgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5EQ0FFX0lOVkVOVE9SWV9ET0MuZ2V0VHlwZSgpKSB9LCB7IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uRENBRV9JTlZFTlRPUllfQkxVRVBSSU5ULmdldFR5cGUoKSkgfSwKKwkJCQl7IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uRENBRV9JTlZFTlRPUllfRVZFTlQuZ2V0VHlwZSgpKSB9IH07CisJfQorCisJQERhdGFQcm92aWRlcgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gZ2V0U2VydmljZURlcEFydEJ5VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyBBcnRpZmFjdFR5cGVFbnVtLk9USEVSLmdldFR5cGUoKSB9LCB7IEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUwuZ2V0VHlwZSgpIH0sIH07CisJfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2V0IGZpbGVzIHdvcmtpbmcgZGlyZWN0b3J5CisJCVN0cmluZyBzb3VyY2VEaXIgPSBjb25maWcuZ2V0UmVzb3VyY2VDb25maWdEaXIoKTsKKwkJU3RyaW5nIHdvcmtEaXIgPSAiSGVhdERlcGxveW1lbnRBcnRpZmFjdHMiOworCQl0ZXN0UmVzb3VyY2VzUGF0aCA9IHNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgd29ya0RpcjsKKwkJU3RyaW5nIHdvcmtEaXJSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzID0gIlJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMiOworCQl0ZXN0UmVzb3VyY2VzSW5zdGFuY2VzUGF0aCA9IHNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgd29ya0RpclJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHM7CisKKwkJLy8gQnVpbGQgdGhlIGNvbXBvbmVudHMKKwkJU2VydmljZSBzZXJ2aWNlT2JqID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJc2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoc2VydmljZU9iaik7CisKKwkJUmVzb3VyY2UgdmZjUmVzb3VyY2VPYmogPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJdmZjUmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyh2ZmNSZXNvdXJjZU9iaik7CisKKwkJUmVzb3VyY2UgdmZSZXNvdXJjZU9iaiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXZmUmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyh2ZlJlc291cmNlT2JqKTsKKworCQlSZXNvdXJjZSBjcFJlc291cmNlT2JqID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJY3BSZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKGNwUmVzb3VyY2VPYmopOworCisJCVJlc291cmNlIHZsUmVzb3VyY2VPYmogPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZMLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQl2bFJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHModmxSZXNvdXJjZU9iaik7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUmVzb3VyY2UKKwkvLyBzdWNjZXNzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEhlYXRBcnRpZmFjdFRvUmVzb3VyY2VBbmRDZXJ0aWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gaGVhdFN1Y2Nlc3NGaWxlOworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZTogIHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJLy8gY2VydGlmaWVkIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlSZXNvdXJjZSh2ZlJlc291cmNlRGV0YWlscyk7CisJCWludCBzdGF0dXMgPSBjaGFuZ2VSZXNvdXJjZVN0YXRlLmdldEVycm9yQ29kZSgpOworCQlhc3NlcnRFcXVhbHMoImNlcnRpZnkgcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHN0YXR1cywgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBzdGF0dXMpOworCisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0UmVzcG9uc2UoKSk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzTWFwID0gcmVzb3VyY2VKYXZhT2JqZWN0LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJYm9vbGVhbiBmbGFnID0gZmFsc2U7CisJCWlmIChhcnRpZmFjdHNNYXAgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0IDogYXJ0aWZhY3RzTWFwLmVudHJ5U2V0KCkpIHsKKwkJCQlpZiAoYXJ0LmdldFZhbHVlKCkuZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkpKSB7CisJCQkJCWFzc2VydFRydWUoImV4cGVjdGVkIGFydGlmYWN0IHR5cGUgaXMgIiArIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULmdldFR5cGUoKSArICIgYnV0IHdhcyAiICsgYXJ0LmdldFZhbHVlKCkuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSwgYXJ0LmdldFZhbHVlKCkuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKS5lcXVhbHMoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpKTsKKwkJCQkJZmxhZyA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWFzc2VydFRydWUoImV4cGVjdGVkIGFydGlmYWN0IG5vdCBmb3VuZCIsIGZsYWcgPT0gdHJ1ZSk7CisJCX0KKworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVJlc291cmNlCisJLy8gc3VjY2Vzcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGREY2FlSW52ZW50b3J5VG9zY2FBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFydGlmYWN0RmlsZU5hbWUgPSBkY2FlSW52ZW50b3J5VG9zY2FGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZGNhZUludmVudG9yeVRvc2NhRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiZGNhZSBpbnYgdG9zY2EgbGFiZWwiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uRENBRV9JTlZFTlRPUllfVE9TQ0E7CisJCVJlc3RSZXNwb25zZSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VBbmRDZXJ0aWZ5KGFydGlmYWN0RmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyAgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZERjYWVJbnZlbnRvcnlKc29uQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VBbmRDZXJ0aWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhcnRpZmFjdEZpbGVOYW1lID0gZGNhZUludmVudG9yeUpzb25GaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZGNhZUludmVudG9yeUpzb25GaWxlOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJkY2FlIGludiBqc29uIGxhYmVsIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLkRDQUVfSU5WRU5UT1JZX0pTT047CisJCVJlc3RSZXNwb25zZSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VBbmRDZXJ0aWZ5KGFydGlmYWN0RmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyAgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZERjYWVJbnZlbnRvcnlQb2xpY3lBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFydGlmYWN0RmlsZU5hbWUgPSBkY2FlSW52ZW50b3J5UG9saWN5RmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9IGRjYWVJbnZlbnRvcnlQb2xpY3lGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJkY2FlIGludiBwb2xpY3kgbGFiZWwiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uRENBRV9JTlZFTlRPUllfUE9MSUNZOworCQlSZXN0UmVzcG9uc2UgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlQW5kQ2VydGlmeShhcnRpZmFjdEZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGREY2FlSW52ZW50b3J5RG9jQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VBbmRDZXJ0aWZ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhcnRpZmFjdEZpbGVOYW1lID0gZGNhZUludmVudG9yeURvY0ZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSBkY2FlSW52ZW50b3J5RG9jRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiZGNhZSBpbnYgZG9jIGxhYmVsIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLkRDQUVfSU5WRU5UT1JZX0RPQzsKKwkJUmVzdFJlc3BvbnNlIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkoYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzICBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkRGNhZUludmVudG9yeUJsdWVQcmludEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlQW5kQ2VydGlmeSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYXJ0aWZhY3RGaWxlTmFtZSA9IGRjYWVJbnZlbnRvcnlCbHVlcHJpbnRGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZGNhZUludmVudG9yeUJsdWVwcmludEZpbGU7CisJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gImRjYWUgaW52IGJsdWVwcmludCBsYWJlbCI7CisJCUFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5EQ0FFX0lOVkVOVE9SWV9CTFVFUFJJTlQ7CisJCVJlc3RSZXNwb25zZSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VBbmRDZXJ0aWZ5KGFydGlmYWN0RmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyAgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZERjYWVJbnZlbnRvcnlFdmVudEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlQW5kQ2VydGlmeSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYXJ0aWZhY3RGaWxlTmFtZSA9IGRjYWVJbnZlbnRvcnlFdmVudEZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSBkY2FlSW52ZW50b3J5RXZlbnRGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJkY2FlIGludiBldmVudCBsYWJlbCI7CisJCUFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5EQ0FFX0lOVkVOVE9SWV9FVkVOVDsKKwkJUmVzdFJlc3BvbnNlIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkoYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzICBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCX0KKworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlQW5kQ2VydGlmeShTdHJpbmcgYXJ0aWZhY3RGaWxlTmFtZSwgU3RyaW5nIGFydGlmYWN0TmFtZSwgU3RyaW5nIGFydGlmYWN0TGFiZWwsIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBHZXQgdGhlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJLy8gQ2VydGlmeSBWRgorCQlQYWlyPENvbXBvbmVudCwgUmVzdFJlc3BvbnNlPiBjaGFuZ2VDb21wb25lbnRTdGF0ZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGNoYW5nZUNvbXBvbmVudFN0YXRlLmdldFJpZ2h0KCkuZ2V0RXJyb3JDb2RlKCksIGNoYW5nZUNvbXBvbmVudFN0YXRlLmdldFJpZ2h0KCkuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQkvLyBBZGQgVkYgaW5zdGFuY2UgdG8gc2VydmljZQorCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisKKwkJLy8gR2V0IHRoZSBWRiBpbnN0YW5jZQorCQlnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIFZmSW5zdGFuY2UgPSBzZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKworCQkvLyBDcmVhdGUgdGhlIGFydGlmYWN0CisJCVJlc3RSZXNwb25zZSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2UoYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIFZmSW5zdGFuY2UsIHNlcnZpY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlyZXR1cm4gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZUFydGlmYWN0RGVzY3JpcHRpb25Ub1Jlc291cmNlSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFydGlmYWN0RmlsZU5hbWUgPSBkY2FlSW52ZW50b3J5VG9zY2FGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZGNhZUludmVudG9yeVRvc2NhRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiZGNhZSBpbnYgdG9zY2EgbGFiZWwiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uRENBRV9JTlZFTlRPUllfVE9TQ0E7CisJCVJlc3RSZXNwb25zZSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VBbmRDZXJ0aWZ5KGFydGlmYWN0RmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCS8vIEdldCB0aGUgYXJ0aWZhY3QgZnJvbSBWRiBpbnN0YW5jZSBhbmQgY2hhbmdlIGhpcyBkZXNjcmlwdGlvbi4KKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSB2Zkluc3RhbmNlID0gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHZmSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoImRjYWVpbnZ0b3NjYWxhYmVsIik7CisJCWFydGlmYWN0RGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbigiTXkgbmV3IGRlc2NyaXB0aW9uIik7CisKKwkJLy8gVXBkYXRlIHRoZSBhcnRpZmFjdAorCQlSZXN0UmVzcG9uc2UgdXBkYXRlRGVwbG95bWVudEFydGlmYWN0VG9SSSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZUFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlKGFydGlmYWN0RGVmaW5pdGlvbiwgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIHVwZGF0ZURlcGxveW1lbnRBcnRpZmFjdFRvUkkuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgdXBkYXRlRGVwbG95bWVudEFydGlmYWN0VG9SSS5nZXRFcnJvckNvZGUoKSwgdXBkYXRlRGVwbG95bWVudEFydGlmYWN0VG9SSS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFydGlmYWN0RmlsZU5hbWUgPSBkY2FlSW52ZW50b3J5VG9zY2FGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZGNhZUludmVudG9yeVRvc2NhRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiZGNhZSBpbnYgdG9zY2EgbGFiZWwiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uRENBRV9JTlZFTlRPUllfVE9TQ0E7CisJCVJlc3RSZXNwb25zZSBhZGRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VBbmRDZXJ0aWZ5KGFydGlmYWN0RmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCS8vIEdldCB0aGUgYXJ0aWZhY3QgZnJvbSBWRiBpbnN0YW5jZSBhbmQgY2hhbmdlIGhpcyBkZXNjcmlwdGlvbi4KKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSB2Zkluc3RhbmNlID0gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHZmSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoImRjYWVpbnZ0b3NjYWxhYmVsIik7CisKKwkJLy8gRGVsZXRlIHRoZSBhcnRpZmFjdAorCQlSZXN0UmVzcG9uc2UgZGVsZXRlSW5mb3JtYXRpb25hbEFydGlmYWN0RnJvbVJlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZGVsZXRlQXJ0aWZhY3RGcm9tUmVzb3VyY2VJbnN0YW5jZShhcnRpZmFjdERlZmluaXRpb24sIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2Zkluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGRlbGV0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkSGVhdEFydGlmYWN0VG9SZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGhlYXRTdWNjZXNzRmlsZTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisJCWxvZ2dlci5kZWJ1ZygibGlzdEZpbGVOYW1lOiB7fSIsIGxpc3RGaWxlTmFtZS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBmaWxlTmFtZSwgdHJ1ZSk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChwYXlsb2FkKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEhlYXRBbmRIZWF0TmV0QXJ0aWZhY3RzVG9SZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGhlYXRTdWNjZXNzRmlsZTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisKKwkJLy8gQWRkIEhFQVQKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCQlTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBmaWxlTmFtZSwgdHJ1ZSk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChwYXlsb2FkKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJLy8gQWRkIEhFQVRfTkVUCisJCVN0cmluZyBwYXlsb2FkTmV0ID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGhlYXROZXRTdWNjZXNzRmlsZSwgdHJ1ZSk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0TmV0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX05FVC5nZXRUeXBlKCkpOworCQloZWF0TmV0QXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQocGF5bG9hZE5ldCk7CisJCWhlYXROZXRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RMYWJlbChIRUFUX05FVF9MQUJFTCk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UxID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBsb2FkQXJ0aWZhY3RUb1BsYWNlaG9sZGVyT25SZXNvdXJjZShoZWF0TmV0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgSEVBVF9ORVRfTEFCRUwpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZTEuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZTEuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UxLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2ZlJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KEhFQVRfTEFCRUwpOworCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0RGVmaW5pdGlvbik7CisJCVN0cmluZyBoZWF0RXNJZCA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCk7CisJCWFzc2VydE5vdE51bGwoaGVhdEVzSWQpOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb25OZXQgPSBkZXBsb3ltZW50QXJ0aWZhY3RzLmdldChIRUFUX05FVF9MQUJFTCk7CisJCWFzc2VydE5vdE51bGwoYXJ0aWZhY3REZWZpbml0aW9uTmV0KTsKKwkJU3RyaW5nIGhlYXROZXRFc0lkID0gYXJ0aWZhY3REZWZpbml0aW9uTmV0LmdldEVzSWQoKTsKKwkJYXNzZXJ0Tm90TnVsbChoZWF0TmV0RXNJZCk7CisJCWFzc2VydEZhbHNlKGhlYXRFc0lkLmVxdWFsc0lnbm9yZUNhc2UoaGVhdE5ldEVzSWQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZERlbGV0ZUFkZEhlYXRBcnRpZmFjdFRvUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBoZWF0U3VjY2Vzc0ZpbGU7CisJCUxpc3Q8U3RyaW5nPiBsaXN0RmlsZU5hbWUgPSBGaWxlVXRpbHMuZ2V0RmlsZUxpc3RGcm9tQmFzZURpcmVjdG9yeUJ5VGVzdE5hbWUodGVzdFJlc291cmNlc1BhdGgpOworCQlsb2dnZXIuZGVidWcoImxpc3RGaWxlTmFtZToge30iLCBsaXN0RmlsZU5hbWUudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIHBheWxvYWQgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgZmlsZU5hbWUsIHRydWUpOworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQocGF5bG9hZCk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgZGVsZXRlSW5mb3JtYXRpb25hbEFydGlmYWN0RnJvbVJlc291cmNlLmdldEVycm9yQ29kZSgpLCBkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFlhbmdYbWxBcnRpZmFjdFRvUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSB5YW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhc2NfaGVhdCAwIDIuWE1MIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUw7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRPdGhlclR5cGVEZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gb3RoZXJGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gIm90aGVyLnR4dCI7CisJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gIkxhYmVsIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLk9USEVSOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkWWFuZ1htbEFydGlmYWN0U2FtZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSB5YW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhc2NfaGVhdF8wXzIuWE1MIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUw7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJLy8gQ2hhbmdpbmcgbGFiZWwgYnV0IG5vdCBuYW1lCisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWwxIjsKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgNDAwLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gNDAwKTsKKwkJQmFzZVZhbGlkYXRpb25VdGlscy5jaGVja0Vycm9yUmVzcG9uc2UoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSwgQWN0aW9uU3RhdHVzLkRFUExPWU1FTlRfQVJUSUZBQ1RfTkFNRV9BTFJFQURZX0VYSVNUUywgbmV3IFN0cmluZ1tdIHsgIlJlc291cmNlIiwgdmZSZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCBhcnRpZmFjdE5hbWUgfSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRJbnZhbGlkWWFuZ1htbEZvcm1hdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGludmFsaWRZYW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhc2NfaGVhdF8wXzIuWE1MIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUw7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDQwMCwgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IDQwMCk7CisJCUJhc2VWYWxpZGF0aW9uVXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX1hNTCwgbmV3IFN0cmluZ1tdIHsgIllBTkdfWE1MIiB9KTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkU2V2ZXJhbFlhbmdYbWxBcnRpZmFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBBZGRpbmcgNCBhcnRpZmFjdHMKKwkJU3RyaW5nIGZpbGVOYW1lID0geWFuZ0ZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiYXNjX2hlYXRfMF8yLlhNTCI7CisJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gIkxhYmVsIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLllBTkdfWE1MOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCS8vIENoYW5naW5nIGxhYmVsIGFuZCBuYW1lCisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWwxIjsKKwkJYXJ0aWZhY3ROYW1lID0gImFzY19oZWF0XzBfMy5YTUwiOworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCS8vIENoYW5naW5nIGxhYmVsIGFuZCBuYW1lCisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWwyIjsKKwkJYXJ0aWZhY3ROYW1lID0gImFzY19oZWF0XzBfNC5YTUwiOworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUpOworCisJCS8vIENoYW5naW5nIGxhYmVsIGFuZCBuYW1lCisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWwzIjsKKwkJYXJ0aWZhY3ROYW1lID0gImFzY19oZWF0XzBfNS5YTUwiOworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDQpOworCX0KKworCUBUZXN0KGRhdGFQcm92aWRlciA9ICJnZXREZXBBcnRCeVR5cGUiKQorCXB1YmxpYyB2b2lkIHVwZGF0ZUhlYXRBcnRpZmFjdFRvUmVzb3VyY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGhlYXRTdWNjZXNzRmlsZTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisJCWxvZ2dlci5kZWJ1ZygibGlzdEZpbGVOYW1lOiB7fSIsIGxpc3RGaWxlTmFtZS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBmaWxlTmFtZSwgdHJ1ZSk7CisJCWhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQocGF5bG9hZCk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQkvLyB1cGRhdGUKKwkJaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3ROYW1lKCJVUERBVEUueWFtbCIpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkRGF0YShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCX0KKworCUBUZXN0KGRhdGFQcm92aWRlciA9ICJnZXREZXBBcnRCeVR5cGUiKQorCXB1YmxpYyB2b2lkIHVwZGF0ZUhlYXRBcnRpZmFjdFRpbWVPdXRUb1Jlc291cmNlKEFydGlmYWN0UmVxRGV0YWlscyBoZWF0VHlwZUFydGlmYWN0RGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdFR5cGVBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VCeVJlc0RldGFpbHModmZSZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJaW50IGFjdHVhbFRpbWVvdXQgPSByZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkuZ2V0KGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpKS5nZXRUaW1lb3V0KCk7CisJCWFzc2VydFRydWUoInZlcmlmeSAiICsgaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RMYWJlbCgpLnRvTG93ZXJDYXNlKCkgKyAiIGFydGlmYWN0IHRpbW91dCwgZXhwZWN0ZWQgIiArIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldFRpbWVvdXQoKSArICIsIGJ1dCB3YXMgIiArIGFjdHVhbFRpbWVvdXQsIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldFRpbWVvdXQoKSA9PSBhY3R1YWxUaW1lb3V0KTsKKworCQkvLyB1cGRhdGUKKwkJaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuc2V0VGltZW91dCgzNSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0VHlwZUFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZUJ5UmVzRGV0YWlscyh2ZlJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhY3R1YWxUaW1lb3V0ID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmdldChoZWF0VHlwZUFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdExhYmVsKCkudG9Mb3dlckNhc2UoKSkuZ2V0VGltZW91dCgpOworCQlhc3NlcnRUcnVlKCJ2ZXJpZnkgIiArIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpICsgIiBhcnRpZmFjdCB0aW1vdXQsIGV4cGVjdGVkICIgKyBoZWF0VHlwZUFydGlmYWN0RGV0YWlscy5nZXRUaW1lb3V0KCkgKyAiLCBidXQgd2FzICIgKyBhY3R1YWxUaW1lb3V0LCBoZWF0VHlwZUFydGlmYWN0RGV0YWlscy5nZXRUaW1lb3V0KCkgPT0gYWN0dWFsVGltZW91dCk7CisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gImdldERlcEFydEJ5VHlwZSIpCisJcHVibGljIHZvaWQgdXBkYXRlSGVhdEFydGlmYWN0RGVzY3JpcHRpb25Ub1Jlc291cmNlKEFydGlmYWN0UmVxRGV0YWlscyBoZWF0VHlwZUFydGlmYWN0RGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdFR5cGVBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VCeVJlc0RldGFpbHModmZSZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJU3RyaW5nIGFjdHVhbERlc2NyaXB0aW9uID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmdldChoZWF0VHlwZUFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdExhYmVsKCkudG9Mb3dlckNhc2UoKSkuZ2V0RGVzY3JpcHRpb24oKTsKKwkJYXNzZXJ0VHJ1ZSgidmVyaWZ5ICIgKyBoZWF0VHlwZUFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdExhYmVsKCkudG9Mb3dlckNhc2UoKSArICIgYXJ0aWZhY3QgRGVzY3JpcHRpb24sIGV4cGVjdGVkICIgKyBoZWF0VHlwZUFydGlmYWN0RGV0YWlscy5nZXREZXNjcmlwdGlvbigpICsgIiwgYnV0IHdhcyAiICsgYWN0dWFsRGVzY3JpcHRpb24sIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKGFjdHVhbERlc2NyaXB0aW9uKSk7CisKKwkJLy8gdXBkYXRlCisJCWhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLnNldERlc2NyaXB0aW9uKCJ0aGUgYmVzdCBkZXNjcmlwdGlvbiB3YXMgZXZlciIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdFR5cGVBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCXJlc291cmNlID0gZ2V0UmVzb3VyY2VCeVJlc0RldGFpbHModmZSZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJYWN0dWFsRGVzY3JpcHRpb24gPSByZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkuZ2V0KGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpKS5nZXREZXNjcmlwdGlvbigpOworCQlhc3NlcnRUcnVlKCJ2ZXJpZnkgIiArIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpICsgIiBhcnRpZmFjdCBEZXNjcmlwdGlvbiwgZXhwZWN0ZWQgIiArIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldERlc2NyaXB0aW9uKCkgKyAiLCBidXQgd2FzICIgKyBhY3R1YWxEZXNjcmlwdGlvbiwgaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoYWN0dWFsRGVzY3JpcHRpb24pKTsKKwl9CisKKwlwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlQnlSZXNEZXRhaWxzKFJlc291cmNlUmVxRGV0YWlscyByZXNEZXRhaWxzLCBVc2VyIHVzZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNEZXRhaWxzLCB1c2VyRGV0YWlscyk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgb24gZ2V0IHJlc291cmNlIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TZXJ2aWNlCisJLy8gc3VjY2Vzcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQFRlc3QoKQorCXB1YmxpYyB2b2lkIGFkZEFsbFR5cGVzRGVwQXJ0aWZhY3RUb1NlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCS8vIFN0cmluZyBmaWxlTmFtZSA9IGhlYXRTdWNjZXNzRmlsZTsKKwkJLy8gTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9CisJCS8vIEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisJCS8vIGxvZ2dlci5kZWJ1ZygibGlzdEZpbGVOYW1lOiB7fSIsIGxpc3RGaWxlTmFtZS50b1N0cmluZygpKTsKKworCQkvLyBTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBmaWxlTmFtZSwKKwkJLy8gdHJ1ZSk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBvdGhlckFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uT1RIRVIuZ2V0VHlwZSgpKTsKKwkJLy8gb3RoZXJBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChwYXlsb2FkKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKG90aGVyQXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyB5YW5nWG1sQXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5ZQU5HX1hNTC5nZXRUeXBlKCkpOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSh5YW5nWG1sQXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGFkZE11cmFub1BrZ0FydGlmYWN0VG9TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBtdXJhbm9GaWxlOworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLk1VUkFOT19QS0cuZ2V0VHlwZSgpKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZSgiYXNjX2hlYXQgMCAyLnppcCIpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TGFiZWwoIkxhYmVsIik7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gImdldFNlcnZpY2VEZXBBcnRCeVR5cGUiKQorCXB1YmxpYyB2b2lkIGFkZEhlYXRBcnRpZmFjdFRvU2VydmljZUFuZENlcnRpZnkoU3RyaW5nIGFydFR5cGUpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShhcnRUeXBlKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJLy8gY2VydGlmaWVkIHNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscyk7CisJCWludCBzdGF0dXMgPSBjaGFuZ2VTZXJ2aWNlU3RhdGUuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydEVxdWFscygiY2VydGlmeSBzZXJ2aWNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyBzdGF0dXMsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgc3RhdHVzKTsKKworCQlTZXJ2aWNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2hhbmdlU2VydmljZVN0YXRlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c01hcCA9IHJlc291cmNlSmF2YU9iamVjdC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWJvb2xlYW4gZmxhZyA9IGZhbHNlOworCQlpZiAoYXJ0aWZhY3RzTWFwICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydCA6IGFydGlmYWN0c01hcC5lbnRyeVNldCgpKSB7CisJCQkJaWYgKGFydC5nZXRWYWx1ZSgpLmdldEFydGlmYWN0TmFtZSgpLmVxdWFscyhoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpKSkgeworCQkJCQlhc3NlcnRUcnVlKCJleHBlY3RlZCBhcnRpZmFjdCB0eXBlIGlzICIgKyBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5nZXRUeXBlKCkgKyAiIGJ1dCB3YXMgIiArIGFydC5nZXRWYWx1ZSgpLmdldEFydGlmYWN0R3JvdXBUeXBlKCksIGFydC5nZXRWYWx1ZSgpLmdldEFydGlmYWN0R3JvdXBUeXBlKCkuZXF1YWxzKEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5UKSk7CisJCQkJCWZsYWcgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlhc3NlcnRUcnVlKCJleHBlY3RlZCBhcnRpZmFjdCBub3QgZm91bmQiLCBmbGFnID09IHRydWUpOworCQl9CisKKwl9CisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UsIGRhdGFQcm92aWRlciA9ICJnZXRTZXJ2aWNlRGVwQXJ0QnlUeXBlIikKKwlwdWJsaWMgdm9pZCB1cGRhdGVIZWF0QXJ0aWZhY3RUb1NlcnZpY2UoU3RyaW5nIGFydFR5cGUpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gaGVhdFN1Y2Nlc3NGaWxlOworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShhcnRUeXBlKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCS8vIHVwZGF0ZQorCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWQpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0T2ZTZXJ2aWNlQnlNZXRob2QoaGVhdEFydGlmYWN0RGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgc2RuY0Rlc2lnbmVyRGV0YWlsczEsICJQT1NUIik7CisJCWxvZ2dlci5kZWJ1ZygidXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1SZXNvdXJjZSBOZWdhdGl2ZQorCS8vIFRlc3RzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gVE9ETyBBbmRyZXkgdGhlIG1ldGhvZCBvZiBERVBMT1lNRU5UIGFydGlmYWN0IGlzIHVwZGF0ZSBhbmQgbm90IGFkZAorCUBUZXN0KGRhdGFQcm92aWRlciA9ICJnZXRTZXJ2aWNlRGVwQXJ0QnlUeXBlIikKKwlwdWJsaWMgdm9pZCBhZGRUaGVTYW1lQWRkaXRpb25hbEhlYXRBcnRpZmFjdFRvUmVzb3VyY2UoU3RyaW5nIGFydFR5cGUpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKGFydFR5cGUpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShhcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJLy8gYWRkIHRoZSBzYW1lIGFydGlmYWN0IG9uZSBtb3JlIHRpbWUKKwkJYXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TGFiZWwoInRoZSBzZWNvbmQgYXJ0aWZhY3QiKTsKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoYXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5ERVBMT1lNRU5UX0FSVElGQUNUX05BTUVfQUxSRUFEWV9FWElTVFMubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIsIHZmUmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5ERVBMT1lNRU5UX0FSVElGQUNUX05BTUVfQUxSRUFEWV9FWElTVFMubmFtZSgpLCB2YXJpYWJsZXMsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEhlYXRBcnRpZmFjdFR3aWNlU2FtZU5hbWVUb1Jlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZW5hbWUxID0gaGVhdFN1Y2Nlc3NGaWxlOworCQkvLyBTdHJpbmcgZmlsZW5hbWUyID0gaGVhdFN1Y2Nlc3NNaW5pRmlsZTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisJCWxvZ2dlci5kZWJ1ZygibGlzdEZpbGVOYW1lOiB7fSIsIGxpc3RGaWxlTmFtZS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBmaWxlbmFtZTEsIHRydWUpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChwYXlsb2FkKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCS8vIEFkZCBIRUFUX05FVAorCQlTdHJpbmcgcGF5bG9hZE5ldCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBoZWF0TmV0U3VjY2Vzc0ZpbGUsIHRydWUpOworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdE5ldEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9ORVQuZ2V0VHlwZSgpKTsKKwkJaGVhdE5ldEFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWROZXQpOworCQloZWF0TmV0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TGFiZWwoSEVBVF9ORVRfTEFCRUwpOworCQloZWF0TmV0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZShoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZTEgPSBBcnRpZmFjdFJlc3RVdGlscy51cGxvYWRBcnRpZmFjdFRvUGxhY2Vob2xkZXJPblJlc291cmNlKGhlYXROZXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBIRUFUX05FVF9MQUJFTCk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlMS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5ERVBMT1lNRU5UX0FSVElGQUNUX05BTUVfQUxSRUFEWV9FWElTVFMubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UxLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiLCB2ZlJlc291cmNlRGV0YWlscy5nZXROYW1lKCksIGhlYXROZXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkRFUExPWU1FTlRfQVJUSUZBQ1RfTkFNRV9BTFJFQURZX0VYSVNUUy5uYW1lKCksIHZhcmlhYmxlcywgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZTEuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiZ2V0RGVwQXJ0QnlUeXBlIikKKwlwdWJsaWMgdm9pZCBhZGRIZWF0QXJ0aWZhY3RUd2ljZVRvUmVzb3VyY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlbmFtZTEgPSBoZWF0U3VjY2Vzc0ZpbGU7CisJCVN0cmluZyBmaWxlbmFtZTIgPSBoZWF0U3VjY2Vzc01pbmlGaWxlOworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVuYW1lMSwgdHJ1ZSk7CisJCWhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQocGF5bG9hZCk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQkvLyBhZGQgdGhlIHNlY29uZCBhcnRpZmFjdAorCQlwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGhlYXRTdWNjZXNzTWluaUZpbGUsIHRydWUpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdE5hbWUoZmlsZW5hbWUyKTsKKwkJaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RMYWJlbCgidGhlIHNlY29uZCBhcnRpZmFjdCIpOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5leHBsaWNpdEFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdFR5cGVBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5ERVBMT1lNRU5UX0FSVElGQUNUX09GX1RZUEVfQUxSRUFEWV9FWElTVFMubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIsIHZmUmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RUeXBlKCksIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5ERVBMT1lNRU5UX0FSVElGQUNUX09GX1RZUEVfQUxSRUFEWV9FWElTVFMubmFtZSgpLCB2YXJpYWJsZXMsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiZ2V0RGVwQXJ0QnlUeXBlIikKKwlwdWJsaWMgdm9pZCBhZGRIZWF0QXJ0aWZhY3RJbnZhbGlkSGVhdEZvcm1hdFRvUmVzb3VyY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGhlYXRJbnZhbGlkRm9ybWF0OworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKwkJaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChwYXlsb2FkKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdFR5cGVBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ERVBMT1lNRU5UX0FSVElGQUNUX0hFQVQubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0RFUExPWU1FTlRfQVJUSUZBQ1RfSEVBVC5uYW1lKCksIHZhcmlhYmxlcywgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCUBUZXN0KGRhdGFQcm92aWRlciA9ICJnZXREZXBBcnRCeVR5cGUiKQorCXB1YmxpYyB2b2lkIGFkZEhlYXRBcnRpZmFjdEludmFsaWRZYW1sRm9ybWF0VG9SZXNvdXJjZShBcnRpZmFjdFJlcURldGFpbHMgaGVhdFR5cGVBcnRpZmFjdERldGFpbHMpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0geWFtbEludmFsaWRGb3JtYXQ7CisJCUxpc3Q8U3RyaW5nPiBsaXN0RmlsZU5hbWUgPSBGaWxlVXRpbHMuZ2V0RmlsZUxpc3RGcm9tQmFzZURpcmVjdG9yeUJ5VGVzdE5hbWUodGVzdFJlc291cmNlc1BhdGgpOworCQlsb2dnZXIuZGVidWcoImxpc3RGaWxlTmFtZToge30iLCBsaXN0RmlsZU5hbWUudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIHBheWxvYWQgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgZmlsZU5hbWUsIHRydWUpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0VHlwZUFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUwubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUwubmFtZSgpLCB2YXJpYWJsZXMsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiZ2V0RGVwQXJ0QnlUeXBlIikKKwlwdWJsaWMgdm9pZCBhZGRIZWF0QXJ0aWZhY3RJbnZhbGlkRmlsZUV4dGVuc2lvblRvUmVzb3VyY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IHlhbmdGaWxlOworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdE5hbWUoZmlsZU5hbWUpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0VHlwZUFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5XUk9OR19BUlRJRkFDVF9GSUxFX0VYVEVOU0lPTi5uYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaW5nIGFydGlmYWN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoaGVhdFR5cGVBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLldST05HX0FSVElGQUNUX0ZJTEVfRVhURU5TSU9OLm5hbWUoKSwgdmFyaWFibGVzLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gImdldERlcEFydEJ5VHlwZSIpCisJcHVibGljIHZvaWQgYWRkSGVhdEFydGlmYWN0VG9SZXNvdXJjZUNlcnRpZnlBbmRBZGRBZGRpdGlvbmFsSGVhdEFydGlmYWN0KEFydGlmYWN0UmVxRGV0YWlscyBoZWF0VHlwZUFydGlmYWN0RGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBoZWF0U3VjY2Vzc0ZpbGU7CisJCUxpc3Q8U3RyaW5nPiBsaXN0RmlsZU5hbWUgPSBGaWxlVXRpbHMuZ2V0RmlsZUxpc3RGcm9tQmFzZURpcmVjdG9yeUJ5VGVzdE5hbWUodGVzdFJlc291cmNlc1BhdGgpOworCQlsb2dnZXIuZGVidWcoImxpc3RGaWxlTmFtZToge30iLCBsaXN0RmlsZU5hbWUudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIHBheWxvYWQgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgZmlsZU5hbWUsIHRydWUpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0VHlwZUFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQkvLyBjZXJ0aWZpZWQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzKTsKKwkJaW50IHN0YXR1cyA9IGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydEVxdWFscygiY2VydGlmeSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgc3RhdHVzLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHN0YXR1cyk7CisKKwkJLy8gYWRkIHNlY29uZCBIRUFUIGFydGlmYWN0IHRvIHRoZSBjZXJ0aWZpZWQgcmVzb3VyY2UKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHZmUmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydFRydWUoImV4cGVjdGVkIGNvZGUgcmVzcG9uc2Ugb24gY2hhbmdlIHJlc291cmNlIHN0YXRlIHRvIENIRUNLT1VUIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgYnV0IHdhcyAiICsgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSwgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCS8vIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzMSA9CisJCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdE5hbWUoZmlsZU5hbWUpOworCQloZWF0VHlwZUFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdExhYmVsKCJ0aGUgc2Vjb25kIGFydGlmYWN0Iik7CisKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmV4cGxpY2l0QWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0VHlwZUFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuREVQTE9ZTUVOVF9BUlRJRkFDVF9PRl9UWVBFX0FMUkVBRFlfRVhJU1RTLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpbmcgYXJ0aWZhY3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiLCB2ZlJlc291cmNlRGV0YWlscy5nZXROYW1lKCksIGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpLCBoZWF0VHlwZUFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuREVQTE9ZTUVOVF9BUlRJRkFDVF9PRl9UWVBFX0FMUkVBRFlfRVhJU1RTLm5hbWUoKSwgdmFyaWFibGVzLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS1TZXJ2aWNlIE5lZ2F0aXZlCisJLy8gVGVzdHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gQWJzb2x1dGUKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgYWRkSGVhdEFydGlmYWN0VHdpY2VUb1NlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZTEgPSBoZWF0U3VjY2Vzc0ZpbGU7CisJCVN0cmluZyBmaWxlTmFtZTIgPSBoZWF0U3VjY2Vzc01pbmlGaWxlOworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lMSwgdHJ1ZSk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5PVEhFUi5nZXRUeXBlKCkpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQocGF5bG9hZCk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCS8vIGFkZCB0aGUgc2Vjb25kIGFydGlmYWN0CisJCXBheWxvYWQgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgZmlsZU5hbWUyLCB0cnVlKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMxLnNldFBheWxvYWQocGF5bG9hZCk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMxLnNldEFydGlmYWN0TmFtZShmaWxlTmFtZTIpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzMS5zZXRBcnRpZmFjdExhYmVsKCJ0aGUgc2Vjb25kIGFydGlmYWN0Iik7CisKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGhlYXRBcnRpZmFjdERldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuREVQTE9ZTUVOVF9BUlRJRkFDVF9PRl9UWVBFX0FMUkVBRFlfRVhJU1RTLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpbmcgYXJ0aWZhY3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIiwgc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCBBcnRpZmFjdFR5cGVFbnVtLk9USEVSLmdldFR5cGUoKSwgQXJ0aWZhY3RUeXBlRW51bS5PVEhFUi5nZXRUeXBlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkRFUExPWU1FTlRfQVJUSUZBQ1RfT0ZfVFlQRV9BTFJFQURZX0VYSVNUUy5uYW1lKCksIHZhcmlhYmxlcywgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJLy8gVE9ETyBBbmRyZXkgT2Jzb2xldGUKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgYWRkSGVhdEFydGlmYWN0SW52YWxpZEhlYXRGb3JtYXRUb1NlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGhlYXRJbnZhbGlkRm9ybWF0OworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQocGF5bG9hZCk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX0RFUExPWU1FTlRfQVJUSUZBQ1RfSEVBVC5uYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaW5nIGFydGlmYWN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0RFUExPWU1FTlRfQVJUSUZBQ1RfSEVBVC5uYW1lKCksIHZhcmlhYmxlcywgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJLy8gVE9ETyBBbmRyZXkgT2Jzb2xldGUKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgYWRkSGVhdEFydGlmYWN0SW52YWxpZFlhbWxGb3JtYXRUb1NlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IHlhbWxJbnZhbGlkRm9ybWF0OworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQocGF5bG9hZCk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUwubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MLm5hbWUoKSwgdmFyaWFibGVzLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEhlYXRBcnRpZmFjdEludmFsaWRGaWxlRXh0ZW5zaW9uVG9TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBtdXJhbm9GaWxlOworCQlMaXN0PFN0cmluZz4gbGlzdEZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdEZpbGVOYW1lLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBwYXlsb2FkID0gRmlsZVV0aWxzLmxvYWRQYXlsb2FkRmlsZShsaXN0RmlsZU5hbWUsIGZpbGVOYW1lLCB0cnVlKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUwuZ2V0VHlwZSgpKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZShmaWxlTmFtZSk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5XUk9OR19BUlRJRkFDVF9GSUxFX0VYVEVOU0lPTi5uYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaW5nIGFydGlmYWN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChBcnRpZmFjdFR5cGVFbnVtLllBTkdfWE1MLmdldFR5cGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuV1JPTkdfQVJUSUZBQ1RfRklMRV9FWFRFTlNJT04ubmFtZSgpLCB2YXJpYWJsZXMsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCUBUZXN0KGRhdGFQcm92aWRlciA9ICJnZXREZXBBcnRCeVR5cGUiKQorCXB1YmxpYyB2b2lkIGFkZEhlYXRFbnZBcnRpZmFjdFRvUmVzb3VyY2VOb3RTdXBwb3J0ZWRUeXBlKEFydGlmYWN0UmVxRGV0YWlscyBoZWF0VHlwZUFydGlmYWN0RGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBoZWF0RW52ZmlsZTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisJCWxvZ2dlci5kZWJ1ZygibGlzdEZpbGVOYW1lOiB7fSIsIGxpc3RGaWxlTmFtZS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBmaWxlTmFtZSwgdHJ1ZSk7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChwYXlsb2FkKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdE5hbWUoImFzY19oZWF0IDAgMi5lbnYiKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdExhYmVsKGhlYXRUeXBlQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCB2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KEFydGlmYWN0VHlwZUVudW0uSEVBVF9FTlYuZ2V0VHlwZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQubmFtZSgpLCB2YXJpYWJsZXMsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJLy8gVE9ETyBBbmRyZXkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEhlYXRBcnRpZmFjdFRvU2VydmljZU5vdFN1cHBvcnREZXBsb3ltZW50QXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBoZWF0U3VjY2Vzc0ZpbGU7CisJCUxpc3Q8U3RyaW5nPiBsaXN0RmlsZU5hbWUgPSBGaWxlVXRpbHMuZ2V0RmlsZUxpc3RGcm9tQmFzZURpcmVjdG9yeUJ5VGVzdE5hbWUodGVzdFJlc291cmNlc1BhdGgpOworCQlsb2dnZXIuZGVidWcoImxpc3RGaWxlTmFtZToge30iLCBsaXN0RmlsZU5hbWUudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIHBheWxvYWQgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgZmlsZU5hbWUsIHRydWUpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChwYXlsb2FkKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBhcnRpZmFjdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVELm5hbWUoKSwgdmFyaWFibGVzLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlKFN0cmluZyBhcnRpZmFjdEZpbGVOYW1lLCBTdHJpbmcgYXJ0aWZhY3ROYW1lLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCwgQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUFydGlmYWN0UmVxRGV0YWlscyBkY2FlQXJ0aWZhY3REZXRhaWxzID0gYnVpbGRBcnRpZmFjdFJlcURldGFpbHNPYmplY3QodGVzdFJlc291cmNlc0luc3RhbmNlc1BhdGgsIGFydGlmYWN0RmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlKTsKKwkJUmVzdFJlc3BvbnNlIGFkZEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2UoZGNhZUFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXR1cm4gYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2U7CisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKFN0cmluZyBhcnRpZmFjdEZpbGVOYW1lLCBTdHJpbmcgYXJ0aWZhY3ROYW1lLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCwgQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IGJ1aWxkQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KHRlc3RSZXNvdXJjZXNQYXRoLCBhcnRpZmFjdEZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSk7CisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgdmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlOworCX0KKworCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShTdHJpbmcgYXJ0aWZhY3RGaWxlTmFtZSwgU3RyaW5nIGFydGlmYWN0TmFtZSwgU3RyaW5nIGFydGlmYWN0TGFiZWwsIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlLCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24geworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IGJ1aWxkQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KHRlc3RSZXNvdXJjZXNQYXRoLCBhcnRpZmFjdEZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSk7CisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlOworCX0KKworCS8vIFVTNjcyMjkzIC0gU3VwcG9ydCBuZXcgYXJ0aWZhY3QgdHlwZSA6IEJFVkZfTElDRU5TRSAsIFZFTkRPUl9MSUNFTlNFCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGROZXdBcnRpZmFjdHNUb1ZGUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSB5YW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDEueG1sIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwxIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZORl9DQVRBTE9HOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKwkJYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0Mi54bWwiOworCQlhcnRpZmFjdExhYmVsID0gIkxhYmVsMiI7CisJCWFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uVkZfTElDRU5TRTsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDMueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDMiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFOworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDQueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDQiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisKKwkJYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0NS54bWwiOworCQlhcnRpZmFjdExhYmVsID0gIkxhYmVsNSI7CisJCWFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uTU9ERUxfUVVFUllfU1BFQzsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDYueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDYiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLkFQUENfQ09ORklHOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisKKwkJZmlsZU5hbWUgPSBqc29uRmlsZTsKKwkJYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0Ny5qc29uIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDciOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLkFQUENfQ09ORklHOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZE5ld0FydGlmYWN0c1RvVkZDUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSB5YW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDEueG1sIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwxIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZORl9DQVRBTE9HOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmY1Jlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZjUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDIueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDIiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZGX0xJQ0VOU0U7CisKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZmNSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZjUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDMueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDMiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZjUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmY1Jlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKworCQlhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3Q0LnhtbCI7CisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWw0IjsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9JTlZFTlRPUllfUFJPRklMRTsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmY1Jlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2ZmNSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisKKwkJYXJ0aWZhY3ROYW1lID0gImFydGlmYWM1LnhtbCI7CisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWw1IjsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9RVUVSWV9TUEVDOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZjUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmY1Jlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZE5ld0FydGlmYWN0c1RvVmZjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9IHlhbmdGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0Mi54bWwiOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDIiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uVkZfTElDRU5TRTsKKwkJUmVzdFJlc3BvbnNlIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZjUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2ZmNSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDMueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDMiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFOworCQlhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmY1Jlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2ZmNSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGROZXdBcnRpZmFjdHNUb0NwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9IHlhbmdGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0Mi54bWwiOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDIiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uVkZfTElDRU5TRTsKKwkJUmVzdFJlc3BvbnNlIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgY3BSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGNwUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCQlhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3QzLnhtbCI7CisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWwzIjsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5WRU5ET1JfTElDRU5TRTsKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCBjcFJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShjcFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZE5ld0FydGlmYWN0c1RvVmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0geWFuZ0ZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3QyLnhtbCI7CisJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gIkxhYmVsMiI7CisJCUFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5WRl9MSUNFTlNFOworCQlSZXN0UmVzcG9uc2UgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2bFJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZTogIHt9IiwgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZsUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCQlhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3QzLnhtbCI7CisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWwzIjsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5WRU5ET1JfTElDRU5TRTsKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2bFJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2bFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFZmSW5zdGFuY2VXaXRoTmV3QXJ0aWZhY3RzVG9TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9IHlhbmdGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0Mi54bWwiOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDIiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uVkZfTElDRU5TRTsKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCQlhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3QzLnhtbCI7CisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWwzIjsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5WRU5ET1JfTElDRU5TRTsKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZlJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCQkvLyBDZXJ0aWZ5IFZGCisJCVBhaXI8Q29tcG9uZW50LCBSZXN0UmVzcG9uc2U+IGNoYW5nZUNvbXBvbmVudFN0YXRlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgY2hhbmdlQ29tcG9uZW50U3RhdGUuZ2V0UmlnaHQoKS5nZXRFcnJvckNvZGUoKSwgY2hhbmdlQ29tcG9uZW50U3RhdGUuZ2V0UmlnaHQoKS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQkvLyBBZGQgVkYgaW5zdGFuY2UgdG8gc2VydmljZQorCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCS8vIGdldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgVkYgaW5zdGFuY2UgY29udGFpbiB0aGUgQXJ0aWZhY3RzIDpWRl9MSUNFTlNFCisJCS8vIGFuZCBWRU5ET1JfTElDRU5TRQorCQlnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIFZmSW5zdGFuY2UgPSBzZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudEluc3RhbmNlKFZmSW5zdGFuY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFLCAxKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudEluc3RhbmNlKFZmSW5zdGFuY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBBcnRpZmFjdFR5cGVFbnVtLlZGX0xJQ0VOU0UsIDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkTm90U3VwcG9ydGVkQXJ0aWZhY3RzVHlwZVRvU2VydmljZTAxKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJLy8gQXJ0aWZhY3QgdHlwZSA6IFZGX0xJQ0VOU0UKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGRlcGxveW1lbnRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLlZGX0xJQ0VOU0UuZ2V0VHlwZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShkZXBsb3ltZW50QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgIGV0dXJuZWQgOiIgKyBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCJWRl9MSUNFTlNFIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVELm5hbWUoKSwgdmFyaWFibGVzLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1NlcnZpY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGROb3RTdXBwb3J0ZWRBcnRpZmFjdHNUeXBlVG9TZXJ2aWNlMDIoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQkvLyBBcnRpZmFjdCB0eXBlIDogVkVORE9SX0xJQ0VOU0UKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGRlcGxveW1lbnRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFLmdldFR5cGUoKSk7CisJCVJlc3RSZXNwb25zZSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1NlcnZpY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UoZGVwbG95bWVudEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlICBldHVybmVkIDoiICsgYWRkRGVwbG95bWVudEFydGlmYWN0VG9TZXJ2aWNlLmdldEVycm9yQ29kZSgpLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZCgiVkVORE9SX0xJQ0VOU0UiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQubmFtZSgpLCB2YXJpYWJsZXMsIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvU2VydmljZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEludmFsaWRGaWxlRm9yQXJ0aWZhY3RUeXBlVmVuZG9yTGljZW5zZVRvUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0geWFuZ0ZpbGU7CisJCVN0cmluZyBOb25YbWxGaWxlID0gaGVhdFN1Y2Nlc3NGaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0Mi54bWwiOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDIiOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uVkZfTElDRU5TRTsKKwkJUmVzdFJlc3BvbnNlIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCQkvLyBBcnRpZmFjdCB0eXBlIFZFTkRPUl9MSUNFTlNFIG11c3QgYmUgWE1MIGZpbGUKKwkJYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0My54bWwiOworCQlhcnRpZmFjdExhYmVsID0gIkxhYmVsMyI7CisJCWFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uVkVORE9SX0xJQ0VOU0U7CisJCWFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKE5vblhtbEZpbGUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZlJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSAgNDAwIHJldHVybmVkIDoiICsgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCJWRU5ET1JfTElDRU5TRSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfWE1MLm5hbWUoKSwgdmFyaWFibGVzLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBnZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB0aGF0IGZpbGUgbm90IGV4aXN0IHdpdGhpbgorCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkSW52YWxpZEZpbGVGb3JBcnRpZmFjdFR5cGVWZkxpY2Vuc2VUb1Jlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9IHlhbmdGaWxlOworCQlTdHJpbmcgTm9uWG1sRmlsZSA9IGhlYXRTdWNjZXNzRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDIueG1sIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwyIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFOworCQlSZXN0UmVzcG9uc2UgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZlJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisJCS8vIEFydGlmYWN0IHR5cGUgVkZfTElDRU5TRSBtdXN0IGJlIFhNTCBmaWxlCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDMueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDMiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZGX0xJQ0VOU0U7CisJCWFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKE5vblhtbEZpbGUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZlJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSAgNDAwIHJldHVybmVkIDoiICsgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCJWRl9MSUNFTlNFIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9YTUwubmFtZSgpLCB2YXJpYWJsZXMsIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRWZW5kb3JMaWNlbnNlQXJ0aWZhY3RBbHJlYWR5RXhpc3RzSW5SZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSB5YW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDIueG1sIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwyIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFOworCQlSZXN0UmVzcG9uc2UgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZlJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisJCS8vIEFkZCBzYW1lIGZpbGUgYWdhaW4gdG8gcmVzb3VyY2UKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZlJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgNDAwLCByZXR1cm5lZCA6IiArIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZChhcnRpZmFjdExhYmVsLnRvTG93ZXJDYXNlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkFSVElGQUNUX0VYSVNULm5hbWUoKSwgdmFyaWFibGVzLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCX0KKworCS8vIFVTNjcyMjk0CisKKwlAVGVzdCgpCisJcHVibGljIHZvaWQgYWRkVm5mQ2F0YWxvZ0FydGlmYWN0c1RvU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLlZORl9DQVRBTE9HLmdldFR5cGUoKSk7CisJCVJlc3RSZXNwb25zZSByZXNwID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyAgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIHJlc3AuZ2V0RXJyb3JDb2RlKCksIHJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJLy8gZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGUgQXJ0aWZhY3RzIDpWTkZfQ0FUQUxPRworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQoc2VydmljZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIEFydGlmYWN0VHlwZUVudW0uVk5GX0NBVEFMT0csIDEpOworCX0KKworCUBUZXN0KCkKKwlwdWJsaWMgdm9pZCBhZGRNb2RlbEludmVudG9yeVByb2ZpbGVBcnRpZmFjdHNUb1NlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnREZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9JTlZFTlRPUllfUFJPRklMRS5nZXRUeXBlKCkpOworCQlSZXN0UmVzcG9uc2UgcmVzcCA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShhcnREZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyByZXNwLmdldEVycm9yQ29kZSgpLCByZXNwLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCS8vIGdldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhlIEFydGlmYWN0cyA6Vk5GX0NBVEFMT0cKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHNlcnZpY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFLCAxKTsKKwl9CisKKwlAVGVzdCgpCisJcHVibGljIHZvaWQgYWRkTW9kZWxRdWVyeVNwZWNBcnRpZmFjdHNUb1NlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnREZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9RVUVSWV9TUEVDLmdldFR5cGUoKSk7CisJCVJlc3RSZXNwb25zZSByZXNwID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyAgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIHJlc3AuZ2V0RXJyb3JDb2RlKCksIHJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJLy8gZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGUgQXJ0aWZhY3RzIDpWTkZfQ0FUQUxPRworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQoc2VydmljZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIEFydGlmYWN0VHlwZUVudW0uTU9ERUxfUVVFUllfU1BFQywgMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRWZkluc3RhbmNlV2l0aE5ld0FydGlmYWN0c1RvU2VydmljZTAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0geWFuZ0ZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3QxLnhtbCI7CisJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gIkxhYmVsMSI7CisJCUFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5WTkZfQ0FUQUxPRzsKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWZpbGVOYW1lID0geWFuZ0ZpbGU7CisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDIueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDIiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLkFQUENfQ09ORklHOworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDQueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDQiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisKKwkJYXJ0aWZhY3ROYW1lID0gImFydGlmYWM1LnhtbCI7CisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWw1IjsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9RVUVSWV9TUEVDOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisJCS8vIENlcnRpZnkgVkYKKwkJUGFpcjxDb21wb25lbnQsIFJlc3RSZXNwb25zZT4gY2hhbmdlQ29tcG9uZW50U3RhdGUgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBjaGFuZ2VDb21wb25lbnRTdGF0ZS5nZXRSaWdodCgpLmdldEVycm9yQ29kZSgpLCBjaGFuZ2VDb21wb25lbnRTdGF0ZS5nZXRSaWdodCgpLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJLy8gQWRkIFZGIGluc3RhbmNlIHRvIHNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCisJCS8vIGdldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgVkYgaW5zdGFuY2UgY29udGFpbiB0aGUgQXJ0aWZhY3RzIDpWRl9MSUNFTlNFCisJCS8vIGFuZCBWRU5ET1JfTElDRU5TRQorCQlnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIFZmSW5zdGFuY2UgPSBzZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudEluc3RhbmNlKFZmSW5zdGFuY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBBcnRpZmFjdFR5cGVFbnVtLlZORl9DQVRBTE9HLCAxKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudEluc3RhbmNlKFZmSW5zdGFuY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFLCAxKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudEluc3RhbmNlKFZmSW5zdGFuY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX1FVRVJZX1NQRUMsIDEpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50SW5zdGFuY2UoVmZJbnN0YW5jZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUcsIDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkQXBwY0NvbmZpZ0FydGlmYWN0VG9WZmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0ganNvbkZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3Q3Lmpzb24iOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDciOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUc7CisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmY1Jlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSA0MDAsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKGFydGlmYWN0TmFtZSk7CisJCXZhcmlhYmxlcy5hZGQoIltWRl0iKTsKKwkJdmFyaWFibGVzLmFkZCgiVkZDIChWaXJ0dWFsIEZ1bmN0aW9uIENvbXBvbmVudCkiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNNQVRDSF9CRVRXRUVOX0FSVElGQUNUX1RZUEVfQU5EX0NPTVBPTkVOVF9UWVBFLm5hbWUoKSwgdmFyaWFibGVzLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEFwcGNDb25maWdBcnRpZmFjdFRvQ3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0ganNvbkZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3Q3Lmpzb24iOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDciOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUc7CisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIGNwUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIDQwMCwgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoYXJ0aWZhY3ROYW1lKTsKKwkJdmFyaWFibGVzLmFkZCgiW1ZGXSIpOworCQl2YXJpYWJsZXMuYWRkKCJDUCAoQ29ubmVjdGlvbiBQb2ludCkiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNNQVRDSF9CRVRXRUVOX0FSVElGQUNUX1RZUEVfQU5EX0NPTVBPTkVOVF9UWVBFLm5hbWUoKSwgdmFyaWFibGVzLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2ZlJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEFwcGNDb25maWdBcnRpZmFjdFRvVmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0ganNvbkZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3Q3Lmpzb24iOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDciOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUc7CisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZsUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIDQwMCwgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoYXJ0aWZhY3ROYW1lKTsKKwkJdmFyaWFibGVzLmFkZCgiW1ZGXSIpOworCQl2YXJpYWJsZXMuYWRkKCJWTCAoVmlydHVhbCBMaW5rKSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU01BVENIX0JFVFdFRU5fQVJUSUZBQ1RfVFlQRV9BTkRfQ09NUE9ORU5UX1RZUEUubmFtZSgpLCB2YXJpYWJsZXMsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDApOworCX0KKworCUBUZXN0KCkKKwlwdWJsaWMgdm9pZCBhZGRBcHBjQ29uZmlnQXJ0aWZhY3RzVG9TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkFQUENfQ09ORklHLmdldFR5cGUoKSk7CisJCVJlc3RSZXNwb25zZSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSA0MDAsIHJldHVybmVkIDoiICsgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUcudG9TdHJpbmcoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVELm5hbWUoKSwgdmFyaWFibGVzLCBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkQXBwY0NvbmZpZ0ludmFsaWRKc29uVG9WRlJlc291cmNlRmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gaW52YWxpZEpzb25GaWxlOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gImludmFsaWRKc29uLmpzb24iOworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDciOworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUc7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgNDAwLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpOworCisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUcudG9TdHJpbmcoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9KU09OLm5hbWUoKSwgdmFyaWFibGVzLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDApOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGROZXdBcnRpZmFjdHNUb0NwMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSB5YW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDEueG1sIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwxIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZORl9DQVRBTE9HOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIGNwUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShjcFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKworCQlhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3Q0LnhtbCI7CisJCWFydGlmYWN0TGFiZWwgPSAiTGFiZWw0IjsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9JTlZFTlRPUllfUFJPRklMRTsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIGNwUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGNwUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjNS54bWwiOworCQlhcnRpZmFjdExhYmVsID0gIkxhYmVsNSI7CisJCWFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uTU9ERUxfUVVFUllfU1BFQzsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIGNwUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGNwUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkTmV3QXJ0aWZhY3RzVG9WbDAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0geWFuZ0ZpbGU7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhY3QxLnhtbCI7CisJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gIkxhYmVsMSI7CisJCUFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5WTkZfQ0FUQUxPRzsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2bFJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmxSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudChyZXNvdXJjZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIGFydGlmYWN0VHlwZSwgMSk7CisKKwkJYXJ0aWZhY3ROYW1lID0gImFydGlmYWN0NC54bWwiOworCQlhcnRpZmFjdExhYmVsID0gIkxhYmVsNCI7CisJCWFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEU7CisKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2bFJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2bFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKworCQlhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhYzUueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDUiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX1FVRVJZX1NQRUM7CisKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2bFJlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh2bFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZE5ld0FydGlmYWN0c1RvVmZjMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSB5YW5nRmlsZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDEueG1sIjsKKwkJU3RyaW5nIGFydGlmYWN0TGFiZWwgPSAiTGFiZWwxIjsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLlZORl9DQVRBTE9HOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShmaWxlTmFtZSwgYXJ0aWZhY3ROYW1lLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdFR5cGUsIHZmY1Jlc291cmNlRGV0YWlscyk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZjUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCisJCWFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdDQueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDQiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGREZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGZpbGVOYW1lLCBhcnRpZmFjdE5hbWUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSwgdmZjUmVzb3VyY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlIHJlc3BvbnNlOiB7fSIsIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmY1Jlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHJlc291cmNlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgYXJ0aWZhY3RUeXBlLCAxKTsKKworCQlhcnRpZmFjdE5hbWUgPSAiYXJ0aWZhYzUueG1sIjsKKwkJYXJ0aWZhY3RMYWJlbCA9ICJMYWJlbDUiOworCQlhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX1FVRVJZX1NQRUM7CisKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IGFkZERlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoZmlsZU5hbWUsIGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RMYWJlbCwgYXJ0aWZhY3RUeXBlLCB2ZmNSZXNvdXJjZURldGFpbHMpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpLCBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodmZjUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQocmVzb3VyY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBhcnRpZmFjdFR5cGUsIDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkTmV3QXJ0aWZhY3RBbHJlYWR5RXhpc3RzSW5TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnREZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9RVUVSWV9TUEVDLmdldFR5cGUoKSk7CisJCVJlc3RSZXNwb25zZSBhZGREZXBsb3ltZW50QXJ0aWZhY3RvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShhcnREZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGREZXBsb3ltZW50QXJ0aWZhY3RvU2VydmljZS5nZXRFcnJvckNvZGUoKSwgYWRkRGVwbG95bWVudEFydGlmYWN0b1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJLy8gZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGUgQXJ0aWZhY3RzIDpWTkZfQ0FUQUxPRworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQoc2VydmljZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQsIEFydGlmYWN0VHlwZUVudW0uTU9ERUxfUVVFUllfU1BFQywgMSk7CisJCS8vIEFkZCBzYW1lIGZpbGUgYWdhaW4gdG8gcmVzb3VyY2UKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0b1NlcnZpY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UoYXJ0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIDQwMCwgcmV0dXJuZWQgOiIgKyBhZGREZXBsb3ltZW50QXJ0aWZhY3RvU2VydmljZS5nZXRFcnJvckNvZGUoKSwgYWRkRGVwbG95bWVudEFydGlmYWN0b1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZChhcnREZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9FWElTVC5uYW1lKCksIHZhcmlhYmxlcywgYWRkRGVwbG95bWVudEFydGlmYWN0b1NlcnZpY2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIGdldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhlIEFydGlmYWN0cyA6Vk5GX0NBVEFMT0cgaXMgc3RpbGwgZXhpc3QgYW5kCisJCS8vIGhhcyBvbmUgb2NjdXJyZW5jZXMKKwkJZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlBcnRpZmFjdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0c051bWJlckluQ29tcG9uZW50KHNlcnZpY2UsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5ULCBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX1FVRVJZX1NQRUMsIDEpOworCX0KKworCXByaXZhdGUgQXJ0aWZhY3RSZXFEZXRhaWxzIGJ1aWxkQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KFN0cmluZyBmaWxlc1BhdGgsIFN0cmluZyBhcnRpZmFjdEZpbGVOYW1lLCBTdHJpbmcgYXJ0aWZhY3ROYW1lLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCwgQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZShmaWxlc1BhdGgpOworCQlsb2dnZXIuZGVidWcoImxpc3RGaWxlTmFtZToge30iLCBsaXN0RmlsZU5hbWUudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIHBheWxvYWQgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgYXJ0aWZhY3RGaWxlTmFtZSwgdHJ1ZSk7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGRjYWVBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShhcnRpZmFjdFR5cGUuZ2V0VHlwZSgpKTsKKwkJZGNhZUFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQlkY2FlQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZShhcnRpZmFjdE5hbWUpOworCQlkY2FlQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TGFiZWwoYXJ0aWZhY3RMYWJlbCk7CisJCXJldHVybiBkY2FlQXJ0aWZhY3REZXRhaWxzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXJ0aWZhY3RzL0Rvd25sb2FkQ29tcG9uZW50QXJ0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvRG93bmxvYWRDb21wb25lbnRBcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU5NzUyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXJ0aWZhY3RzL0Rvd25sb2FkQ29tcG9uZW50QXJ0LmphdmEKQEAgLTAsMCArMSw2ODcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwUmVzcG9uc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkNsb3NlYWJsZUh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cERlbGV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5TdHJpbmdFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljUmVzcG9uc2VIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyOworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5wYXJzZXIuSlNPTlBhcnNlcjsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUucGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3RVaURvd25sb2FkRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGVjb2RlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkF0b21pY09wZXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlNlcnZpY2VWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR2VuZXJhbFV0aWxpdHk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBEb3dubG9hZENvbXBvbmVudEFydCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEb3dubG9hZENvbXBvbmVudEFydC5jbGFzcy5nZXROYW1lKCkpOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVQTE9BRF9BUlRJRkFDVF9QQVlMT0FEID0gIlVIVlVWRmt0VlhObGNpMUxaWGt0Um1sc1pTMHlPaUJ6YzJndGNuTmhEUXBGYm1OeWVYQjBhVzl1T2lCaFpYTXlOVFl0WTJKakRRcERiMjF0Wlc1d09BMEsiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVQTE9BRF9BUlRJRkFDVF9OQU1FID0gIlRMVl9wcnYucHBrIjsKKworCXByb3RlY3RlZCBDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisJcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHJvdGVjdGVkIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCisJcHJvdGVjdGVkIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJcHJvdGVjdGVkIEpTT05QYXJzZXIganNvblBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VWZXJzaW9uOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCXByb3RlY3RlZCBVc2VyIHNkbmNVc2VyRGV0YWlsczsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXNvdXJjZSByZXNvdXJjZU9iaiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlTZXJ2aWNlIHNlcnZpY2VPYmogPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCisJCXJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VPYmopOworCQlzZXJ2aWNlRGV0YWlscyA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhzZXJ2aWNlT2JqKTsKKwl9CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIERvd25sb2FkQ29tcG9uZW50QXJ0KCkgeworCQlzdXBlcihuYW1lLCBEb3dubG9hZENvbXBvbmVudEFydC5jbGFzcy5nZXROYW1lKCkpOworCisJfQorCisJLy8gRXh0ZXJuYWwgQVBJIC0gRG93bmxvYWQgYXJ0aWZhY3QgZm9yIHJlc291cmNlCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZEFydGlmYWN0RnJvbVJlc291cmNlVmlhRXh0ZXJuYWxBUEkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VEZXRhaWxzVkY7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiBjcmVhdGVkUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeSgKKwkJCQlSZXNvdXJjZVR5cGVFbnVtLlZGLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlyZXNvdXJjZURldGFpbHNWRiA9IGNyZWF0ZWRSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRBcnRpZmFjdCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVCwgcmVzb3VyY2VEZXRhaWxzVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSkKKwkJCQkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VEZXRhaWxzVkYpOworCisJCVN0cmluZyByZXNvdXJjZVVVSUQgPSByZXNvdXJjZURldGFpbHNWRi5nZXRVVUlEKCk7CisJCVN0cmluZyBhcnRpZmFjdFVVSUQgPSBoZWF0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RVVUlEKCk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBVVUlEOiAiICsgcmVzb3VyY2VVVUlEKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdCBVVUlEOiAiICsgYXJ0aWZhY3RVVUlEKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZ2V0UmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RFeHRlcm5hbEFQSShyZXNvdXJjZVVVSUQsCisJCQkJYXJ0aWZhY3RVVUlELCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCAiUmVzb3VyY2UiKTsKKworCQlJbnRlZ2VyIHJlc3BvbnNlQ29kZSA9IHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDA7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2VDb2RlLCBleHBlY3RlZENvZGUsICJSZXNwb25zZSBjb2RlIGlzIG5vdCBjb3JyZWN0LiIpOworCisJCVN0cmluZyByZXNwb25zZSA9IHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpOworCisJCVN0cmluZyBwYXlsb2FkRGF0YSA9ICJhR1ZoZEY5MFpXMXdiR0YwWlY5MlpYSnphVzl1T2lBeU1ERXpMVEExTFRJekRRb05DbVJsYzJOeWFYQjBhVzl1T2lCVGFXMXdiR1VnZEdWdGNHeGhkR1VnZEc4Z1pHVndiRzk1SUdFZ2MzUmhZMnNnZDJsMGFDQjBkMjhnZG1seWRIVmhiQ0J0WVdOb2FXNWxJR2x1YzNSaGJtTmxjdzBLRFFwd1lYSmhiV1YwWlhKek9nMEtJQ0JwYldGblpWOXVZVzFsWHpFNkRRb2dJQ0FnZEhsd1pUb2djM1J5YVc1bkRRb2dJQ0FnYkdGaVpXdzZJRWx0WVdkbElFNWhiV1VOQ2lBZ0lDQmtaWE5qY21sd2RHbHZiam9nVTBOUFNVMUJSMFVnVTNCbFkybG1lU0JoYmlCcGJXRm5aU0J1WVcxbElHWnZjaUJwYm5OMFlXNWpaVEVOQ2lBZ0lDQmtaV1poZFd4ME9pQmphWEp5YjNNdE1DNHpMakV0ZURnMlh6WTBEUW9nSUdsdFlXZGxYMjVoYldWZk1qb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nU1cxaFoyVWdUbUZ0WlEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOUpUVUZIUlNCVGNHVmphV1o1SUdGdUlHbHRZV2RsSUc1aGJXVWdabTl5SUdsdWMzUmhibU5sTWcwS0lDQWdJR1JsWm1GMWJIUTZJR05wY25KdmN5MHdMak11TVMxNE9EWmZOalFOQ2lBZ2JtVjBkMjl5YTE5cFpEb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nVG1WMGQyOXlheUJKUkEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOU9SVlJYVDFKTElFNWxkSGR2Y21zZ2RHOGdZbVVnZFhObFpDQm1iM0lnZEdobElHTnZiWEIxZEdVZ2FXNXpkR0Z1WTJVTkNpQWdJQ0JvYVdSa1pXNDZJSFJ5ZFdVTkNpQWdJQ0JqYjI1emRISmhhVzUwY3pvTkNpQWdJQ0FnSUMwZ2JHVnVaM1JvT2lCN0lHMXBiam9nTml3Z2JXRjRPaUE0SUgwTkNpQWdJQ0FnSUNBZ1pHVnpZM0pwY0hScGIyNDZJRkJoYzNOM2IzSmtJR3hsYm1kMGFDQnRkWE4wSUdKbElHSmxkSGRsWlc0Z05pQmhibVFnT0NCamFHRnlZV04wWlhKekxnMEtJQ0FnSUNBZ0xTQnlZVzVuWlRvZ2V5QnRhVzQ2SURZc0lHMWhlRG9nT0NCOURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJTWVc1blpTQmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM1poYkhWbGN6b05DaUFnSUNBZ0lDQWdMU0J0TVM1emJXRnNiQTBLSUNBZ0lDQWdJQ0F0SUcweExtMWxaR2wxYlEwS0lDQWdJQ0FnSUNBdElHMHhMbXhoY21kbERRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJCYkd4dmQyVmtJSFpoYkhWbGN5QmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piWVMxNlFTMWFNQzA1WFNzaURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJRWVhOemQyOXlaQ0J0ZFhOMElHTnZibk5wYzNRZ2IyWWdZMmhoY21GamRHVnljeUJoYm1RZ2JuVnRZbVZ5Y3lCdmJteDVMZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piUVMxYVhTdGJZUzE2UVMxYU1DMDVYU29pRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlFZWE56ZDI5eVpDQnRkWE4wSUhOMFlYSjBJSGRwZEdnZ1lXNGdkWEJ3WlhKallYTmxJR05vWVhKaFkzUmxjaTROQ2lBZ0lDQWdJQzBnWTNWemRHOXRYMk52Ym5OMGNtRnBiblE2SUc1dmRtRXVhMlY1Y0dGcGNnMEtJQ0FnSUNBZ0lDQmtaWE5qY21sd2RHbHZiam9nUTNWemRHOXRJR1JsYzJOeWFYQjBhVzl1RFFvTkNuSmxjMjkxY21ObGN6b05DaUFnYlhsZmFXNXpkR0Z1WTJVeE9nMEtJQ0FnSUhSNWNHVTZJRTlUT2pwT2IzWmhPanBUWlhKMlpYSU5DaUFnSUNCd2NtOXdaWEowYVdWek9nMEtJQ0FnSUNBZ2FXMWhaMlU2SUhzZ1oyVjBYM0JoY21GdE9pQnBiV0ZuWlY5dVlXMWxYekVnZlEwS0lDQWdJQ0FnWm14aGRtOXlPaUJ0TVM1emJXRnNiQTBLSUNBZ0lDQWdibVYwZDI5eWEzTTZEUW9nSUNBZ0lDQWdJQzBnYm1WMGQyOXlheUE2SUhzZ1oyVjBYM0JoY21GdElEb2dibVYwZDI5eWExOXBaQ0I5RFFvZ0lHMTVYMmx1YzNSaGJtTmxNam9OQ2lBZ0lDQjBlWEJsT2lCUFV6bzZUbTkyWVRvNlUyVnlkbVZ5RFFvZ0lDQWdjSEp2Y0dWeWRHbGxjem9OQ2lBZ0lDQWdJR2x0WVdkbE9pQjdJR2RsZEY5d1lYSmhiVG9nYVcxaFoyVmZibUZ0WlY4eUlIME5DaUFnSUNBZ0lHWnNZWFp2Y2pvZ2JURXVkR2x1ZVEwS0lDQWdJQ0FnYm1WMGQyOXlhM002RFFvZ0lDQWdJQ0FnSUMwZ2JtVjBkMjl5YXlBNklIc2daMlYwWDNCaGNtRnRJRG9nYm1WMGQyOXlhMTlwWkNCOSI7CisJCVN0cmluZyBkZWNvZGVkUGF5cGxvYWQgPSBEZWNvZGVyLmRlY29kZShwYXlsb2FkRGF0YSk7CisKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZSwgZGVjb2RlZFBheXBsb2FkLCAiUmVzcG9uc2UgZGVwbG95bWVudCBhcnRpZmFjdCBub3QgY29ycmVjdC4iKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlJlc291cmNlIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q09OU1VNRVJfSUQoImNpIik7CisJCVN0cmluZyByZXNvdXJjZV91cmwgPSBTdHJpbmcuZm9ybWF0KCIvYXNkYy92MS9jYXRhbG9nL3Jlc291cmNlcy8lcy9hcnRpZmFjdHMvJXMiLCByZXNvdXJjZVVVSUQsIGFydGlmYWN0VVVJRCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UkVTT1VSQ0VfVVJMKHJlc291cmNlX3VybCk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdERvd25sb2FkRXh0ZXJuYWxBUEkoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsCisJCQkJZmFsc2UpOworCX0KKworCS8vIEV4dGVybmFsIEFQSSAtIERvd25sb2FkIGFydGlmYWN0IGZvciByZXNvdXJjZSAtIG5lZ2F0aXZlIHRlc3QKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RGcm9tUmVzb3VyY2VWaWFFeHRlcm5hbEFQSU5lZ2F0aXZlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZSByZXNvdXJjZURldGFpbHNWRjsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXN0UmVzcG9uc2U+IGNyZWF0ZWRSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KAorCQkJCVJlc291cmNlVHlwZUVudW0uVkYsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLAorCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1ZGID0gY3JlYXRlZFJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQlBcnRpZmFjdERlZmluaXRpb24gaGVhdEFydGlmYWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULCByZXNvdXJjZURldGFpbHNWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZURldGFpbHNWRik7CisKKwkJU3RyaW5nIHJlc291cmNlVVVJRCA9IHJlc291cmNlRGV0YWlsc1ZGLmdldFVVSUQoKTsKKwkJU3RyaW5nIGFydGlmYWN0VVVJRCA9IGhlYXRBcnRpZmFjdC5nZXRBcnRpZmFjdFVVSUQoKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIFVVSUQ6ICIgKyByZXNvdXJjZVVVSUQpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFydGlmYWN0IFVVSUQ6ICIgKyBhcnRpZmFjdFVVSUQpOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5nZXRSZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdEV4dGVybmFsQVBJKHJlc291cmNlVVVJRCwKKwkJCQkiZGZzZ2Zkc2czMjQiLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCAiUmVzb3VyY2UiKTsKKworCQlJbnRlZ2VyIHJlc3BvbnNlQ29kZSA9IHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDA7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2VDb2RlLCBleHBlY3RlZENvZGUsICJSZXNwb25zZSBjb2RlIGlzIG5vdCBjb3JyZWN0LiIpOworCX0KKworCS8vIEV4dGVybmFsIEFQSSAtIERvd25sb2FkIGFydGlmYWN0IGZvciBzZXJ2aWNlIC0gbmVnYXRpdmUgdGVzdAorCUBUZXN0CisJcHVibGljIHZvaWQgZG93bmxvYWRBcnRpZmFjdEZyb21TZXJ2aWNlVmlhRXh0ZXJuYWxBUEkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTZXJ2aWNlIHJlc291cmNlRGV0YWlsc1NlcnZpY2U7CisJCUVpdGhlcjxTZXJ2aWNlLCBSZXN0UmVzcG9uc2U+IGNyZWF0ZWRSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJcmVzb3VyY2VEZXRhaWxzU2VydmljZSA9IGNyZWF0ZWRSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gaGVhdEFydGlmYWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5PVEhFUiwgcmVzb3VyY2VEZXRhaWxzU2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKworCQlTdHJpbmcgcmVzb3VyY2VVVUlEID0gcmVzb3VyY2VEZXRhaWxzU2VydmljZS5nZXRVVUlEKCk7CisJCVN0cmluZyBhcnRpZmFjdFVVSUQgPSBoZWF0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RVVUlEKCk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBVVUlEOiAiICsgcmVzb3VyY2VVVUlEKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdCBVVUlEOiAiICsgYXJ0aWZhY3RVVUlEKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZ2V0UmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RFeHRlcm5hbEFQSShyZXNvdXJjZVVVSUQsCisJCQkJYXJ0aWZhY3RVVUlELCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCAiU2VydmljZSIpOworCisJCUludGVnZXIgcmVzcG9uc2VDb2RlID0gcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQlJbnRlZ2VyIGV4cGVjdGVkQ29kZSA9IDIwMDsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZUNvZGUsIGV4cGVjdGVkQ29kZSwgIlJlc3BvbnNlIGNvZGUgaXMgbm90IGNvcnJlY3QuIik7CisKKwkJU3RyaW5nIHJlc3BvbnNlID0gcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gImFHVmhkRjkwWlcxd2JHRjBaVjkyWlhKemFXOXVPaUF5TURFekxUQTFMVEl6RFFvTkNtUmxjMk55YVhCMGFXOXVPaUJUYVcxd2JHVWdkR1Z0Y0d4aGRHVWdkRzhnWkdWd2JHOTVJR0VnYzNSaFkyc2dkMmwwYUNCMGQyOGdkbWx5ZEhWaGJDQnRZV05vYVc1bElHbHVjM1JoYm1ObGN3MEtEUXB3WVhKaGJXVjBaWEp6T2cwS0lDQnBiV0ZuWlY5dVlXMWxYekU2RFFvZ0lDQWdkSGx3WlRvZ2MzUnlhVzVuRFFvZ0lDQWdiR0ZpWld3NklFbHRZV2RsSUU1aGJXVU5DaUFnSUNCa1pYTmpjbWx3ZEdsdmJqb2dVME5QU1UxQlIwVWdVM0JsWTJsbWVTQmhiaUJwYldGblpTQnVZVzFsSUdadmNpQnBibk4wWVc1alpURU5DaUFnSUNCa1pXWmhkV3gwT2lCamFYSnliM010TUM0ekxqRXRlRGcyWHpZMERRb2dJR2x0WVdkbFgyNWhiV1ZmTWpvTkNpQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0JzWVdKbGJEb2dTVzFoWjJVZ1RtRnRaUTBLSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJUUTA5SlRVRkhSU0JUY0dWamFXWjVJR0Z1SUdsdFlXZGxJRzVoYldVZ1ptOXlJR2x1YzNSaGJtTmxNZzBLSUNBZ0lHUmxabUYxYkhRNklHTnBjbkp2Y3kwd0xqTXVNUzE0T0RaZk5qUU5DaUFnYm1WMGQyOXlhMTlwWkRvTkNpQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0JzWVdKbGJEb2dUbVYwZDI5eWF5QkpSQTBLSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJUUTA5T1JWUlhUMUpMSUU1bGRIZHZjbXNnZEc4Z1ltVWdkWE5sWkNCbWIzSWdkR2hsSUdOdmJYQjFkR1VnYVc1emRHRnVZMlVOQ2lBZ0lDQm9hV1JrWlc0NklIUnlkV1VOQ2lBZ0lDQmpiMjV6ZEhKaGFXNTBjem9OQ2lBZ0lDQWdJQzBnYkdWdVozUm9PaUI3SUcxcGJqb2dOaXdnYldGNE9pQTRJSDBOQ2lBZ0lDQWdJQ0FnWkdWelkzSnBjSFJwYjI0NklGQmhjM04zYjNKa0lHeGxibWQwYUNCdGRYTjBJR0psSUdKbGRIZGxaVzRnTmlCaGJtUWdPQ0JqYUdGeVlXTjBaWEp6TGcwS0lDQWdJQ0FnTFNCeVlXNW5aVG9nZXlCdGFXNDZJRFlzSUcxaGVEb2dPQ0I5RFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlNZVzVuWlNCa1pYTmpjbWx3ZEdsdmJnMEtJQ0FnSUNBZ0xTQmhiR3h2ZDJWa1gzWmhiSFZsY3pvTkNpQWdJQ0FnSUNBZ0xTQnRNUzV6YldGc2JBMEtJQ0FnSUNBZ0lDQXRJRzB4TG0xbFpHbDFiUTBLSUNBZ0lDQWdJQ0F0SUcweExteGhjbWRsRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQkJiR3h2ZDJWa0lIWmhiSFZsY3lCa1pYTmpjbWx3ZEdsdmJnMEtJQ0FnSUNBZ0xTQmhiR3h2ZDJWa1gzQmhkSFJsY200NklDSmJZUzE2UVMxYU1DMDVYU3NpRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlFZWE56ZDI5eVpDQnRkWE4wSUdOdmJuTnBjM1FnYjJZZ1kyaGhjbUZqZEdWeWN5QmhibVFnYm5WdFltVnljeUJ2Ym14NUxnMEtJQ0FnSUNBZ0xTQmhiR3h2ZDJWa1gzQmhkSFJsY200NklDSmJRUzFhWFN0YllTMTZRUzFhTUMwNVhTb2lEUW9nSUNBZ0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCUVlYTnpkMjl5WkNCdGRYTjBJSE4wWVhKMElIZHBkR2dnWVc0Z2RYQndaWEpqWVhObElHTm9ZWEpoWTNSbGNpNE5DaUFnSUNBZ0lDMGdZM1Z6ZEc5dFgyTnZibk4wY21GcGJuUTZJRzV2ZG1FdWEyVjVjR0ZwY2cwS0lDQWdJQ0FnSUNCa1pYTmpjbWx3ZEdsdmJqb2dRM1Z6ZEc5dElHUmxjMk55YVhCMGFXOXVEUW9OQ25KbGMyOTFjbU5sY3pvTkNpQWdiWGxmYVc1emRHRnVZMlV4T2cwS0lDQWdJSFI1Y0dVNklFOVRPanBPYjNaaE9qcFRaWEoyWlhJTkNpQWdJQ0J3Y205d1pYSjBhV1Z6T2cwS0lDQWdJQ0FnYVcxaFoyVTZJSHNnWjJWMFgzQmhjbUZ0T2lCcGJXRm5aVjl1WVcxbFh6RWdmUTBLSUNBZ0lDQWdabXhoZG05eU9pQnRNUzV6YldGc2JBMEtJQ0FnSUNBZ2JtVjBkMjl5YTNNNkRRb2dJQ0FnSUNBZ0lDMGdibVYwZDI5eWF5QTZJSHNnWjJWMFgzQmhjbUZ0SURvZ2JtVjBkMjl5YTE5cFpDQjlEUW9nSUcxNVgybHVjM1JoYm1ObE1qb05DaUFnSUNCMGVYQmxPaUJQVXpvNlRtOTJZVG82VTJWeWRtVnlEUW9nSUNBZ2NISnZjR1Z5ZEdsbGN6b05DaUFnSUNBZ0lHbHRZV2RsT2lCN0lHZGxkRjl3WVhKaGJUb2dhVzFoWjJWZmJtRnRaVjh5SUgwTkNpQWdJQ0FnSUdac1lYWnZjam9nYlRFdWRHbHVlUTBLSUNBZ0lDQWdibVYwZDI5eWEzTTZEUW9nSUNBZ0lDQWdJQzBnYm1WMGQyOXlheUE2SUhzZ1oyVjBYM0JoY21GdElEb2dibVYwZDI5eWExOXBaQ0I5IjsKKwkJU3RyaW5nIGRlY29kZWRQYXlwbG9hZCA9IERlY29kZXIuZGVjb2RlKHBheWxvYWREYXRhKTsKKworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLCBkZWNvZGVkUGF5cGxvYWQsICJSZXNwb25zZSBkZXBsb3ltZW50IGFydGlmYWN0IG5vdCBjb3JyZWN0LiIpOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCgpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlRGV0YWlsc1NlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMCIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDT05TVU1FUl9JRCgiY2kiKTsKKwkJU3RyaW5nIHJlc291cmNlX3VybCA9IFN0cmluZy5mb3JtYXQoIi9hc2RjL3YxL2NhdGFsb2cvc2VydmljZXMvJXMvYXJ0aWZhY3RzLyVzIiwgcmVzb3VyY2VVVUlELCBhcnRpZmFjdFVVSUQpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJFU09VUkNFX1VSTChyZXNvdXJjZV91cmwpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREb3dubG9hZEV4dGVybmFsQVBJKGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLAorCQkJCWZhbHNlKTsKKwl9CisKKwkvLyBFeHRlcm5hbCBBUEkgLSBEb3dubG9hZCBDb21wb25lbnRJbnN0YW5jZSBhcnRpZmFjdCBvZiBzZXJ2aWNlIC0gbmVnYXRpdmUKKwkvLyB0ZXN0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZEFydGlmYWN0T2ZDb21wb25lbnRJbnN0YW5jZUZyb21TZXJ2aWNlVmlhRXh0ZXJuYWxBUEkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gcmVzb3VyY2VEZXRhaWxzVkZfMDFlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsCisJCQkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlDb21wb25lbnQgcmVzb3VyY2VEZXRhaWxzVkZfMDEgPSByZXNvdXJjZURldGFpbHNWRl8wMWUubGVmdCgpLnZhbHVlKCk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBoZWF0QXJ0aWZhY3QgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpCisJCQkJLmxlZnQoKS52YWx1ZSgpOworCisJCXJlc291cmNlRGV0YWlsc1ZGXzAxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkZfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwkJU2VydmljZSByZXNvdXJjZURldGFpbHNTZXJ2aWNlOworCQlFaXRoZXI8U2VydmljZSwgUmVzdFJlc3BvbnNlPiBjcmVhdGVkUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1NlcnZpY2UgPSBjcmVhdGVkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VEZXRhaWxzVkYxaW5zXzAxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZURldGFpbHNWRl8wMSwgcmVzb3VyY2VEZXRhaWxzU2VydmljZSwKKwkJCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkKKwkJCQkubGVmdCgpLnZhbHVlKCk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLSIpOworCisJCVN0cmluZyByZXNvdXJjZVVVSUQgPSByZXNvdXJjZURldGFpbHNTZXJ2aWNlLmdldFVVSUQoKTsKKwkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlVUlEID0gcmVzb3VyY2VEZXRhaWxzVkYxaW5zXzAxLmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyBhcnRpZmFjdFVVSUQgPSBoZWF0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RVVUlEKCk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBVVUlEOiAiICsgcmVzb3VyY2VVVUlEKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJDb21wb25lbnQgaW5zdGFuY2UgVUlEOiAiICsgY29tcG9uZW50SW5zdGFuY2VVSUQpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFydGlmYWN0IFVVSUQ6ICIgKyBhcnRpZmFjdFVVSUQpOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5nZXRDb21wb25lbnRJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdEV4dGVybmFsQVBJKHJlc291cmNlVVVJRCwKKwkJCQljb21wb25lbnRJbnN0YW5jZVVJRCwgYXJ0aWZhY3RVVUlELCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCAiU2VydmljZSIpOworCQkvLworCQlJbnRlZ2VyIHJlc3BvbnNlQ29kZSA9IHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDA7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2VDb2RlLCBleHBlY3RlZENvZGUsICJSZXNwb25zZSBjb2RlIGlzIG5vdCBjb3JyZWN0LiIpOworCisJCVN0cmluZyByZXNwb25zZSA9IHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpOworCisJCVN0cmluZyBwYXlsb2FkRGF0YSA9ICJhR1ZoZEY5MFpXMXdiR0YwWlY5MlpYSnphVzl1T2lBeU1ERXpMVEExTFRJekRRb05DbVJsYzJOeWFYQjBhVzl1T2lCVGFXMXdiR1VnZEdWdGNHeGhkR1VnZEc4Z1pHVndiRzk1SUdFZ2MzUmhZMnNnZDJsMGFDQjBkMjhnZG1seWRIVmhiQ0J0WVdOb2FXNWxJR2x1YzNSaGJtTmxjdzBLRFFwd1lYSmhiV1YwWlhKek9nMEtJQ0JwYldGblpWOXVZVzFsWHpFNkRRb2dJQ0FnZEhsd1pUb2djM1J5YVc1bkRRb2dJQ0FnYkdGaVpXdzZJRWx0WVdkbElFNWhiV1VOQ2lBZ0lDQmtaWE5qY21sd2RHbHZiam9nVTBOUFNVMUJSMFVnVTNCbFkybG1lU0JoYmlCcGJXRm5aU0J1WVcxbElHWnZjaUJwYm5OMFlXNWpaVEVOQ2lBZ0lDQmtaV1poZFd4ME9pQmphWEp5YjNNdE1DNHpMakV0ZURnMlh6WTBEUW9nSUdsdFlXZGxYMjVoYldWZk1qb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nU1cxaFoyVWdUbUZ0WlEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOUpUVUZIUlNCVGNHVmphV1o1SUdGdUlHbHRZV2RsSUc1aGJXVWdabTl5SUdsdWMzUmhibU5sTWcwS0lDQWdJR1JsWm1GMWJIUTZJR05wY25KdmN5MHdMak11TVMxNE9EWmZOalFOQ2lBZ2JtVjBkMjl5YTE5cFpEb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nVG1WMGQyOXlheUJKUkEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOU9SVlJYVDFKTElFNWxkSGR2Y21zZ2RHOGdZbVVnZFhObFpDQm1iM0lnZEdobElHTnZiWEIxZEdVZ2FXNXpkR0Z1WTJVTkNpQWdJQ0JvYVdSa1pXNDZJSFJ5ZFdVTkNpQWdJQ0JqYjI1emRISmhhVzUwY3pvTkNpQWdJQ0FnSUMwZ2JHVnVaM1JvT2lCN0lHMXBiam9nTml3Z2JXRjRPaUE0SUgwTkNpQWdJQ0FnSUNBZ1pHVnpZM0pwY0hScGIyNDZJRkJoYzNOM2IzSmtJR3hsYm1kMGFDQnRkWE4wSUdKbElHSmxkSGRsWlc0Z05pQmhibVFnT0NCamFHRnlZV04wWlhKekxnMEtJQ0FnSUNBZ0xTQnlZVzVuWlRvZ2V5QnRhVzQ2SURZc0lHMWhlRG9nT0NCOURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJTWVc1blpTQmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM1poYkhWbGN6b05DaUFnSUNBZ0lDQWdMU0J0TVM1emJXRnNiQTBLSUNBZ0lDQWdJQ0F0SUcweExtMWxaR2wxYlEwS0lDQWdJQ0FnSUNBdElHMHhMbXhoY21kbERRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJCYkd4dmQyVmtJSFpoYkhWbGN5QmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piWVMxNlFTMWFNQzA1WFNzaURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJRWVhOemQyOXlaQ0J0ZFhOMElHTnZibk5wYzNRZ2IyWWdZMmhoY21GamRHVnljeUJoYm1RZ2JuVnRZbVZ5Y3lCdmJteDVMZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piUVMxYVhTdGJZUzE2UVMxYU1DMDVYU29pRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlFZWE56ZDI5eVpDQnRkWE4wSUhOMFlYSjBJSGRwZEdnZ1lXNGdkWEJ3WlhKallYTmxJR05vWVhKaFkzUmxjaTROQ2lBZ0lDQWdJQzBnWTNWemRHOXRYMk52Ym5OMGNtRnBiblE2SUc1dmRtRXVhMlY1Y0dGcGNnMEtJQ0FnSUNBZ0lDQmtaWE5qY21sd2RHbHZiam9nUTNWemRHOXRJR1JsYzJOeWFYQjBhVzl1RFFvTkNuSmxjMjkxY21ObGN6b05DaUFnYlhsZmFXNXpkR0Z1WTJVeE9nMEtJQ0FnSUhSNWNHVTZJRTlUT2pwT2IzWmhPanBUWlhKMlpYSU5DaUFnSUNCd2NtOXdaWEowYVdWek9nMEtJQ0FnSUNBZ2FXMWhaMlU2SUhzZ1oyVjBYM0JoY21GdE9pQnBiV0ZuWlY5dVlXMWxYekVnZlEwS0lDQWdJQ0FnWm14aGRtOXlPaUJ0TVM1emJXRnNiQTBLSUNBZ0lDQWdibVYwZDI5eWEzTTZEUW9nSUNBZ0lDQWdJQzBnYm1WMGQyOXlheUE2SUhzZ1oyVjBYM0JoY21GdElEb2dibVYwZDI5eWExOXBaQ0I5RFFvZ0lHMTVYMmx1YzNSaGJtTmxNam9OQ2lBZ0lDQjBlWEJsT2lCUFV6bzZUbTkyWVRvNlUyVnlkbVZ5RFFvZ0lDQWdjSEp2Y0dWeWRHbGxjem9OQ2lBZ0lDQWdJR2x0WVdkbE9pQjdJR2RsZEY5d1lYSmhiVG9nYVcxaFoyVmZibUZ0WlY4eUlIME5DaUFnSUNBZ0lHWnNZWFp2Y2pvZ2JURXVkR2x1ZVEwS0lDQWdJQ0FnYm1WMGQyOXlhM002RFFvZ0lDQWdJQ0FnSUMwZ2JtVjBkMjl5YXlBNklIc2daMlYwWDNCaGNtRnRJRG9nYm1WMGQyOXlhMTlwWkNCOSI7CisJCVN0cmluZyBkZWNvZGVkUGF5cGxvYWQgPSBEZWNvZGVyLmRlY29kZShwYXlsb2FkRGF0YSk7CisKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZSwgZGVjb2RlZFBheXBsb2FkLCAiUmVzcG9uc2UgZGVwbG95bWVudCBhcnRpZmFjdCBub3QgY29ycmVjdC4iKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShyZXNvdXJjZURldGFpbHNWRjFpbnNfMDEuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMCIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDT05TVU1FUl9JRCgiY2kiKTsKKwkJU3RyaW5nIHJlc291cmNlX3VybCA9IFN0cmluZy5mb3JtYXQoIi9hc2RjL3YxL2NhdGFsb2cvc2VydmljZXMvJXMvcmVzb3VyY2VJbnN0YW5jZXMvJXMvYXJ0aWZhY3RzLyVzIiwKKwkJCQlyZXNvdXJjZVVVSUQsIGNvbXBvbmVudEluc3RhbmNlVUlELCBhcnRpZmFjdFVVSUQpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJFU09VUkNFX1VSTChyZXNvdXJjZV91cmwpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREb3dubG9hZEV4dGVybmFsQVBJKGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLAorCQkJCWZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RGcm9tUmVzb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCQl0cnkgeworCQkJU3RyaW5nIGpzb25Cb2R5ID0gY3JlYXRlVXBsb2FkQXJ0aWZhY3RCb2R5SnNvbigpOworCisJCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5BRERfQVJUSUZBQ1RfVE9fUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQpOworCQkJSHR0cFBvc3QgaHR0cHBvc3QgPSBjcmVhdGVQb3N0QWRkQXJ0aWZhY3RSZXF1ZWFzdChqc29uQm9keSwgdXJsLCB0cnVlKTsKKwkJCUh0dHBSZXNwb25zZSByZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwcG9zdCk7CisJCQlpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiZmFpbGVkIHRvIGFkZCBhcnRpZmFjdCIsIDIwMCwgc3RhdHVzKTsKKworCQkJQXJ0aWZhY3REZWZpbml0aW9uIG9yaWdBcnRpZmFjdCA9IGdldEFydGlmYWN0RGF0YUZyb21Kc29uKGpzb25Cb2R5KTsKKwkJCWFkZEFydGlmYWN0RGF0YUZyb21SZXNwb25zZShyZXNwb25zZSwgb3JpZ0FydGlmYWN0KTsKKwkJCVN0cmluZyBhcnRpZmFjdElkID0gb3JpZ0FydGlmYWN0LmdldFVuaXF1ZUlkKCk7CisKKwkJCXVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VSV9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VJZCwgYXJ0aWZhY3RJZCk7CisJCQlIdHRwR2V0IGh0dHBHZXQgPSBjcmVhdGVHZXRSZXF1ZXN0KHVybCk7CisJCQlyZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwR2V0KTsKKwkJCXN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImZhaWxlZCB0byBkb3dubG9hZCBhcnRpZmFjdCIsIDIwMCwgc3RhdHVzKTsKKworCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRDb250ZW50KCk7CisJCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPSBnZXRBcnRpZmFjdFVpRG93bmxvYWREYXRhKElPVXRpbHMudG9TdHJpbmcoaW5wdXRTdHJlYW0pKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiRG93bmxvYWRlZCBwYXlsb2FkIGlzIGRpZmZlcmVudCBmcm9tIHVwbG9hZGVkIG9uZSIsIFVQTE9BRF9BUlRJRkFDVF9QQVlMT0FELAorCQkJCQlhcnRpZmFjdFVpRG93bmxvYWREYXRhLmdldEJhc2U2NENvbnRlbnRzKCkpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJEb3dubG9hZGVkIGFydGlmYWN0IG5hbWUgaXMgZGlmZmVyZW50IGZyb20gdXBsb2FkZWQgb25lIiwgVVBMT0FEX0FSVElGQUNUX05BTUUsCisJCQkJCWFydGlmYWN0VWlEb3dubG9hZERhdGEuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCisJCQkvLyB2YWxpZGF0ZSBhdWRpdAorCisJCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNkbmNVc2VyRGV0YWlscyk7CisJCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAwIik7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFydGlmYWN0RGF0YShBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEFydGlmYWN0RGF0YUF1ZGl0KG9yaWdBcnRpZmFjdCkpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyQXJ0aWZhY3RVdWlkKG9yaWdBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldkFydGlmYWN0VXVpZCgiIik7CisJCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWh0dHBjbGllbnQuY2xvc2UoKTsKKwkJfQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZEFydGlmYWN0RnJvbVNlcnZpY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCisJCXRyeSB7CisKKwkJCVN0cmluZyBqc29uU3RyID0gY3JlYXRlVXBsb2FkQXJ0aWZhY3RCb2R5SnNvbigpOworCisJCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkFERF9BUlRJRkFDVF9UT19TRVJWSUNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJCUh0dHBQb3N0IGh0dHBQb3N0ID0gY3JlYXRlUG9zdEFkZEFydGlmYWN0UmVxdWVhc3QoanNvblN0ciwgdXJsLCB0cnVlKTsKKwkJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXN1bHQgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cFBvc3QpOworCQkJaW50IHN0YXR1cyA9IHJlc3VsdC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJmYWlsZWQgdG8gYWRkIGFydGlmYWN0IiwgMjAwLCBzdGF0dXMpOworCisJCQlBcnRpZmFjdERlZmluaXRpb24gb3JpZ0FydGlmYWN0ID0gZ2V0QXJ0aWZhY3REYXRhRnJvbUpzb24oanNvblN0cik7CisJCQlhZGRBcnRpZmFjdERhdGFGcm9tUmVzcG9uc2UocmVzdWx0LCBvcmlnQXJ0aWZhY3QpOworCQkJU3RyaW5nIGFydGlmYWN0SWQgPSBvcmlnQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKTsKKworCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVJX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJCXNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0SWQpOworCQkJSHR0cEdldCBodHRwR2V0ID0gY3JlYXRlR2V0UmVxdWVzdCh1cmwpOworCQkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlMiA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwR2V0KTsKKwkJCXN0YXR1cyA9IHJlc3BvbnNlMi5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJmYWlsZWQgdG8gZG93bmxvYWQgYXJ0aWZhY3QiLCAyMDAsIHN0YXR1cyk7CisJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc3BvbnNlMi5nZXRFbnRpdHkoKS5nZXRDb250ZW50KCk7CisJCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPSBnZXRBcnRpZmFjdFVpRG93bmxvYWREYXRhKElPVXRpbHMudG9TdHJpbmcoaW5wdXRTdHJlYW0pKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiRG93bmxvYWRlZCBwYXlsb2FkIGlzIGRpZmZlcmVudCBmcm9tIHVwbG9hZGVkIG9uZSIsIFVQTE9BRF9BUlRJRkFDVF9QQVlMT0FELAorCQkJCQlhcnRpZmFjdFVpRG93bmxvYWREYXRhLmdldEJhc2U2NENvbnRlbnRzKCkpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJEb3dubG9hZGVkIGFydGlmYWN0IG5hbWUgaXMgZGlmZmVyZW50IGZyb20gdXBsb2FkZWQgb25lIiwgVVBMT0FEX0FSVElGQUNUX05BTUUsCisJCQkJCWFydGlmYWN0VWlEb3dubG9hZERhdGEuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCisJCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMKKwkJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZG5jVXNlckRldGFpbHMpOworCQkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkFydGlmYWN0RG93bmxvYWQiOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMCIpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBcnRpZmFjdERhdGEoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBcnRpZmFjdERhdGFBdWRpdChvcmlnQXJ0aWZhY3QpKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyckFydGlmYWN0VXVpZChvcmlnQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSk7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZBcnRpZmFjdFV1aWQoIiIpOworCisJCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIFJlc3RSZXNwb25zZSByZXNwb25zZSA9CisJCQkvLyBTZXJ2aWNlUmVzdFV0aWxzLmRlbGV0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNlcnZpY2VWZXJzaW9uLAorCQkJLy8gc2RuY1VzZXJEZXRhaWxzICk7CisJCQkvLyBjaGVja0RlbGV0ZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJCWh0dHBjbGllbnQuY2xvc2UoKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZG93bmxvYWRBcnRpZmFjdEZyb21SZXNvdXJjZU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCQl0cnkgeworCisJCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQkJU3RyaW5nIGFydGlmYWN0SWROb3RGb3VuZCA9ICIxMTExMSI7CisKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBvcmlnQXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJCQlvcmlnQXJ0aWZhY3Quc2V0VW5pcXVlSWQoYXJ0aWZhY3RJZE5vdEZvdW5kKTsKKworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VSV9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VJZCwgYXJ0aWZhY3RJZE5vdEZvdW5kKTsKKwkJCUh0dHBHZXQgaHR0cEdldCA9IGNyZWF0ZUdldFJlcXVlc3QodXJsKTsKKwkJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwR2V0KTsKKwkJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJleHBlY3RlZCA0MDQgbm90IGZvdW5kIiwgNDA0LCBzdGF0dXMpOworCisJCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQubmFtZSgpKTsKKwkJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvcgorCQkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2RuY1VzZXJEZXRhaWxzKTsKKwkJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygiIikpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBcnRpZmFjdERhdGEoIiIpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyQXJ0aWZhY3RVdWlkKG9yaWdBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldkFydGlmYWN0VXVpZCgiIik7CisJCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZBcnRpZmFjdFV1aWQobnVsbCk7CisJCX0gZmluYWxseSB7CisJCQlodHRwY2xpZW50LmNsb3NlKCk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZG93bmxvYWRBcnRpZmFjdEZyb21TZXJ2aWNlTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCXRyeSB7CisKKwkJCVN0cmluZyBhcnRpZmFjdElkTm90Rm91bmQgPSAiMTExMTEiOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIG9yaWdBcnRpZmFjdCA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oKTsKKwkJCW9yaWdBcnRpZmFjdC5zZXRVbmlxdWVJZChhcnRpZmFjdElkTm90Rm91bmQpOworCisJCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVJX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0SWROb3RGb3VuZCk7CisJCQlIdHRwR2V0IGh0dHBHZXQgPSBjcmVhdGVHZXRSZXF1ZXN0KHVybCk7CisJCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UyID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBHZXQpOworCQkJaW50IHN0YXR1cyA9IHJlc3BvbnNlMi5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJleHBlY3RlZCA0MDQgbm90IGZvdW5kIiwgNDA0LCBzdGF0dXMpOworCisJCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQubmFtZSgpKTsKKwkJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMKKwkJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZG5jVXNlckRldGFpbHMpOworCQkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkFydGlmYWN0RG93bmxvYWQiOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCIiKSk7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFydGlmYWN0RGF0YSgiIik7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJBcnRpZmFjdFV1aWQob3JpZ0FydGlmYWN0LmdldFVuaXF1ZUlkKCkpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2QXJ0aWZhY3RVdWlkKCIiKTsKKwkJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCQl9IGZpbmFsbHkgeworCQkJaHR0cGNsaWVudC5jbG9zZSgpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEFydGlmYWN0VG9SZXNvdXJjZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFydGlmYWN0KCk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShkZWZhdWx0QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJhZGQgaW5mb3JtYXRpb25hbCBhcnRpZmFjdCByZXF1ZXN0IHJldHVybmVkIHN0YXR1czogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCAyMDAsCisJCQkJc3RhdHVzKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VSZXNwID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSByZXNvdXJjZS5nZXRBcnRpZmFjdHMoKTsKKwkJYm9vbGVhbiBpc0V4aXN0ID0gZmFsc2U7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGFydGlmYWN0cy5lbnRyeVNldCgpKSB7CisJCQlpZiAoZW50cnkuZ2V0S2V5KCkuZXF1YWxzKGRlZmF1bHRBcnRpZmFjdC5nZXRBcnRpZmFjdExhYmVsKCkpKSB7CisJCQkJaXNFeGlzdCA9IHRydWU7CisKKwkJCX0KKwkJfQorCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGlzRXhpc3QpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVXBsb2FkQXJ0aWZhY3RCb2R5SnNvbigpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uQm9keSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlqc29uQm9keS5wdXQoImFydGlmYWN0TmFtZSIsIFVQTE9BRF9BUlRJRkFDVF9OQU1FKTsKKwkJanNvbkJvZHkucHV0KCJhcnRpZmFjdERpc3BsYXlOYW1lIiwgImNvbmZpZ3VyZSIpOworCQlqc29uQm9keS5wdXQoImFydGlmYWN0VHlwZSIsICJTSEVMTCIpOworCQlqc29uQm9keS5wdXQoIm1hbmRhdG9yeSIsICJmYWxzZSIpOworCQlqc29uQm9keS5wdXQoImRlc2NyaXB0aW9uIiwgImZmIik7CisJCWpzb25Cb2R5LnB1dCgicGF5bG9hZERhdGEiLCBVUExPQURfQVJUSUZBQ1RfUEFZTE9BRCk7CisJCWpzb25Cb2R5LnB1dCgiYXJ0aWZhY3RMYWJlbCIsICJjb25maWd1cmUiKTsKKwkJcmV0dXJuIGdzb24udG9Kc29uKGpzb25Cb2R5KTsKKwl9CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3REZWZpbml0aW9uIGdldEFydGlmYWN0RGF0YUZyb21Kc29uKFN0cmluZyBqc29uKSB7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCUpzb25PYmplY3QganNvbkVsZW1lbnQgPSBuZXcgSnNvbk9iamVjdCgpOworCQlqc29uRWxlbWVudCA9IGdzb24uZnJvbUpzb24oanNvbiwganNvbkVsZW1lbnQuZ2V0Q2xhc3MoKSk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oKTsKKwkJU3RyaW5nIHBheWxvYWQgPSBudWxsOworCQlKc29uRWxlbWVudCBhcnRpZmFjdFBheWxvYWQgPSBqc29uRWxlbWVudC5nZXQoQ29uc3RhbnRzLkFSVElGQUNUX1BBWUxPQURfREFUQSk7CisJCWlmIChhcnRpZmFjdFBheWxvYWQgIT0gbnVsbCAmJiAhYXJ0aWZhY3RQYXlsb2FkLmlzSnNvbk51bGwoKSkgeworCQkJcGF5bG9hZCA9IGFydGlmYWN0UGF5bG9hZC5nZXRBc1N0cmluZygpOworCQl9CisJCWpzb25FbGVtZW50LnJlbW92ZShDb25zdGFudHMuQVJUSUZBQ1RfUEFZTE9BRF9EQVRBKTsKKwkJYXJ0aWZhY3QgPSBnc29uLmZyb21Kc29uKGpzb25FbGVtZW50LCBBcnRpZmFjdERlZmluaXRpb24uY2xhc3MpOworCQlhcnRpZmFjdC5zZXRQYXlsb2FkRGF0YShwYXlsb2FkKTsKKworCQkvKgorCQkgKiBhdGlmYWN0LnNldEFydGlmYWN0TmFtZShVUExPQURfQVJUSUZBQ1RfTkFNRSk7CisJCSAqIGFydGlmYWN0LnNldEFydGlmYWN0RGlzcGxheU5hbWUoImNvbmZpZ3VyZSIpOworCQkgKiBhcnRpZmFjdC5zZXRBcnRpZmFjdFR5cGUoIlNIRUxMIik7IGFydGlmYWN0LnNldE1hbmRhdG9yeShmYWxzZSk7CisJCSAqIGFydGlmYWN0LnNldERlc2NyaXB0aW9uKCJmZiIpOworCQkgKiBhcnRpZmFjdC5zZXRQYXlsb2FkRGF0YShVUExPQURfQVJUSUZBQ1RfUEFZTE9BRCk7CisJCSAqIGFydGlmYWN0LnNldEFydGlmYWN0TGFiZWwoImNvbmZpZ3VyZSIpOworCQkgKi8KKwkJcmV0dXJuIGFydGlmYWN0OworCX0KKworCXByb3RlY3RlZCBIdHRwR2V0IGNyZWF0ZUdldFJlcXVlc3QoU3RyaW5nIHVybCkgeworCQlIdHRwR2V0IGh0dHBHZXQgPSBuZXcgSHR0cEdldCh1cmwpOworCQlodHRwR2V0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaHR0cEdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQlodHRwR2V0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCXJldHVybiBodHRwR2V0OworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJ0aWZhY3RVaWQoSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSHR0cFJlc3BvbnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworCQlTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSBuZXcgQmFzaWNSZXNwb25zZUhhbmRsZXIoKS5oYW5kbGVSZXNwb25zZShyZXNwb25zZSk7CisJCUpTT05PYmplY3QgcmVzcG9uc2VNYXAgPSAoSlNPTk9iamVjdCkganNvblBhcnNlci5wYXJzZShyZXNwb25zZVN0cmluZyk7CisJCVN0cmluZyBhcnRpZmFjdElkID0gKFN0cmluZykgcmVzcG9uc2VNYXAuZ2V0KCJ1bmlxdWVJZCIpOworCQlyZXR1cm4gYXJ0aWZhY3RJZDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFydGlmYWN0RXNJZChIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBIdHRwUmVzcG9uc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisJCVN0cmluZyByZXNwb25zZVN0cmluZyA9IG5ldyBCYXNpY1Jlc3BvbnNlSGFuZGxlcigpLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJSlNPTk9iamVjdCByZXNwb25zZU1hcCA9IChKU09OT2JqZWN0KSBqc29uUGFyc2VyLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTsKKwkJU3RyaW5nIGVzSWQgPSAoU3RyaW5nKSByZXNwb25zZU1hcC5nZXQoIkVzSWQiKTsKKwkJcmV0dXJuIGVzSWQ7CisJfQorCisJcHJvdGVjdGVkIEFydGlmYWN0RGVmaW5pdGlvbiBhZGRBcnRpZmFjdERhdGFGcm9tUmVzcG9uc2UoSHR0cFJlc3BvbnNlIHJlc3BvbnNlLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QpCisJCQl0aHJvd3MgSHR0cFJlc3BvbnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworCQkvLyBTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSBuZXcKKwkJLy8gQmFzaWNSZXNwb25zZUhhbmRsZXIoKS5oYW5kbGVSZXNwb25zZShyZXNwb25zZSk7CisJCUh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisJCVN0cmluZyByZXNwb25zZVN0cmluZyA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKGVudGl0eSk7CisJCUpTT05PYmplY3QgcmVzcG9uc2VNYXAgPSAoSlNPTk9iamVjdCkganNvblBhcnNlci5wYXJzZShyZXNwb25zZVN0cmluZyk7CisJCWFydGlmYWN0LnNldEVzSWQoKFN0cmluZykgcmVzcG9uc2VNYXAuZ2V0KCJlc0lkIikpOworCQlhcnRpZmFjdC5zZXRVbmlxdWVJZCgoU3RyaW5nKSByZXNwb25zZU1hcC5nZXQoInVuaXF1ZUlkIikpOworCQlhcnRpZmFjdC5zZXRBcnRpZmFjdEdyb3VwVHlwZShBcnRpZmFjdEdyb3VwVHlwZUVudW0uZmluZFR5cGUoKFN0cmluZykgcmVzcG9uc2VNYXAuZ2V0KCJhcnRpZmFjdEdyb3VwVHlwZSIpKSk7CisJCWFydGlmYWN0LnNldFRpbWVvdXQoKChMb25nKSByZXNwb25zZU1hcC5nZXQoInRpbWVvdXQiKSkuaW50VmFsdWUoKSk7CisJCXJldHVybiBhcnRpZmFjdDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExpZmVjeWNsZUFydGlmYWN0VWlkKENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSkKKwkJCXRocm93cyBIdHRwUmVzcG9uc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisJCVN0cmluZyByZXNwb25zZVN0cmluZyA9IG5ldyBCYXNpY1Jlc3BvbnNlSGFuZGxlcigpLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJSlNPTk9iamVjdCByZXNwb25zZU1hcCA9IChKU09OT2JqZWN0KSBqc29uUGFyc2VyLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTsKKwkJcmVzcG9uc2VNYXAgPSAoSlNPTk9iamVjdCkgcmVzcG9uc2VNYXAuZ2V0KCJpbXBsZW1lbnRhdGlvbiIpOworCQlTdHJpbmcgYXJ0aWZhY3RJZCA9IChTdHJpbmcpIHJlc3BvbnNlTWFwLmdldCgidW5pcXVlSWQiKTsKKwkJcmV0dXJuIGFydGlmYWN0SWQ7CisJfQorCisJcHJvdGVjdGVkIEh0dHBEZWxldGUgY3JlYXRlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KFN0cmluZyB1cmwpIHsKKwkJSHR0cERlbGV0ZSBodHRwRGVsZXRlID0gbmV3IEh0dHBEZWxldGUodXJsKTsKKwkJaHR0cERlbGV0ZS5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlodHRwRGVsZXRlLmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCXJldHVybiBodHRwRGVsZXRlOworCX0KKworCXByb3RlY3RlZCBIdHRwUG9zdCBjcmVhdGVQb3N0QWRkQXJ0aWZhY3RSZXF1ZWFzdChTdHJpbmcganNvbkJvZHksIFN0cmluZyB1cmwsIGJvb2xlYW4gYWRkTWQ1SGVhZGVyKQorCQkJdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCQlIdHRwUG9zdCBodHRwcG9zdCA9IG5ldyBIdHRwUG9zdCh1cmwpOworCQlodHRwcG9zdC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWh0dHBwb3N0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWh0dHBwb3N0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWlmIChhZGRNZDVIZWFkZXIpIHsKKwkJCWh0dHBwb3N0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5Db250ZW50X01ENS5nZXRWYWx1ZSgpLCBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeVN0cmluZyhqc29uQm9keSkpOworCQl9CisJCVN0cmluZ0VudGl0eSBpbnB1dCA9IG5ldyBTdHJpbmdFbnRpdHkoanNvbkJvZHkpOworCQlpbnB1dC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIpOworCQlodHRwcG9zdC5zZXRFbnRpdHkoaW5wdXQpOworCQlsb2cuZGVidWcoIkV4ZWN1dGluZyByZXF1ZXN0IHt9IiwgaHR0cHBvc3QuZ2V0UmVxdWVzdExpbmUoKSk7CisJCXJldHVybiBodHRwcG9zdDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUxvYWRBcnRpZmFjdEJvZHkoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlqc29uLnB1dCgiYXJ0aWZhY3ROYW1lIiwgImluc3RhbGxfYXBhY2hlMi5zaCIpOworCQlqc29uLnB1dCgiYXJ0aWZhY3RUeXBlIiwgIlNIRUxMIik7CisJCWpzb24ucHV0KCJkZXNjcmlwdGlvbiIsICJkZGQiKTsKKwkJanNvbi5wdXQoInBheWxvYWREYXRhIiwgIlVFc0RCQW9BQUFBSUFBZUxiMGJEUXoiKTsKKwkJanNvbi5wdXQoImFydGlmYWN0TGFiZWwiLCAibmFtZTEyMyIpOworCisJCVN0cmluZyBqc29uU3RyID0gZ3Nvbi50b0pzb24oanNvbik7CisJCXJldHVybiBqc29uU3RyOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrRGVsZXRlUmVzcG9uc2UoUmVzdFJlc3BvbnNlIHJlc3BvbnNlKSB7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdGF0dXNDb2RlKHJlc3BvbnNlLCAiZGVsZXRlIHJlcXVlc3QgZmFpbGVkIiwgZmFsc2UsIDIwNCwgNDA0KTsKKwl9CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RVaURvd25sb2FkRGF0YSBnZXRBcnRpZmFjdFVpRG93bmxvYWREYXRhKFN0cmluZyBhcnRpZmFjdFVpRG93bmxvYWREYXRhU3RyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQl0cnkgeworCQkJQXJ0aWZhY3RVaURvd25sb2FkRGF0YSBhcnRpZmFjdFVpRG93bmxvYWREYXRhID0gbWFwcGVyLnJlYWRWYWx1ZShhcnRpZmFjdFVpRG93bmxvYWREYXRhU3RyLAorCQkJCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhLmNsYXNzKTsKKwkJCXJldHVybiBhcnRpZmFjdFVpRG93bmxvYWREYXRhOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2FydGlmYWN0cy9QbGFjZUhvbGRlclZhbGlkYXRpb25zLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvUGxhY2VIb2xkZXJWYWxpZGF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmVmODkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvUGxhY2VIb2xkZXJWYWxpZGF0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNjk2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHM7CisKKy8vaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuamF2YXR1cGxlcy5QYWlyOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlNlcnZpY2VDYXRlZ29yaWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5jYXNzYW5kcmEuQ2Fzc2FuZHJhVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Sb3c7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFBsYWNlSG9sZGVyVmFsaWRhdGlvbnMgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBsYWNlSG9sZGVyVmFsaWRhdGlvbnMuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaGVhdEV4dGVuc2lvbiA9ICJ5YW1sIjsKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgeWFuZ1htbEV4dGVuc2lvbiA9ICJ4bWwiOworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtdXJhbm9Qa2dFeHRlbnNpb24gPSAiemlwIjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBmb2xkZXJOYW1lID0gImFkZEhlYXRBcnRpZmFjdFRvU2VydmljZUFuZFNlcnRpZnkiOworCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7CisJcHJpdmF0ZSBmaW5hbCBpbnQgdGltZU91dCA9IDYwOworCXByaXZhdGUgQXJ0aWZhY3RSZXFEZXRhaWxzIHVwZGF0ZUFydGlmYWN0UmVxRGV0YWlscyA9IG51bGw7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCXByb3RlY3RlZCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHMyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSMik7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMxOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VWRjsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlQ1A7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZVZMOworCisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzOworCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgaGVhdFZvbEFydGlmYWN0RGV0YWlsczsKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXROZXRBcnRpZmFjdERldGFpbHM7CisKKwlwdWJsaWMgUGxhY2VIb2xkZXJWYWxpZGF0aW9ucygpIHsKKwkJc3VwZXIobmFtZSwgUGxhY2VIb2xkZXJWYWxpZGF0aW9ucy5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQloZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXROZXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVULmdldFR5cGUoKSk7CisJCWhlYXRWb2xBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MLmdldFR5cGUoKSk7CisJCVJlc291cmNlIHJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlRGV0YWlsczEgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlT2JqZWN0KTsKKwkJcmVzb3VyY2VPYmplY3QgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpCisJCQkJLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZVZGID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU9iamVjdCk7CisJCXJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzb3VyY2VDUCA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VPYmplY3QpOworCQlyZXNvdXJjZU9iamVjdCA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkwsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkKKwkJCQkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlVkwgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlT2JqZWN0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZhbGlkYXRlRGVwbG95bWVudFBsYWNlSG9sZGVyc0J5Q29uZmlnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCVJlc291cmNlIHJlc291cmNlT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VPYmplY3QuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlhc3NlcnROb3ROdWxsKCJkZXBsb3ltZW50QXJ0aWZhY3RzIGxpc3QgaXMgbnVsbCIsIGRlcGxveW1lbnRBcnRpZmFjdHMpOworCQlMaXN0PFN0cmluZz4gbGlzdE9mUmVzRGVwQXJ0VHlwZXNGcm9tQ29uZmlnID0gVXRpbHMuZ2V0TGlzdE9mRGVwUmVzQXJ0TGFiZWxzKHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJkZXBsb3ltZW50IGFydGlmYWN0IHR5cGVzIGxpc3QgaXMgbnVsbCIsIGxpc3RPZlJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZyk7CisJCWZvciAoU3RyaW5nIHJlc0RlcEFydFR5cGUgOiBsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcpIHsKKwkJCWFzc2VydE5vdE51bGwoInBsYWNlaG9sZGVyIG9mICIgKyByZXNEZXBBcnRUeXBlICsgIiB0eXBlIGRvZXNuJ3QgZXhpc3QiLAorCQkJCQlkZXBsb3ltZW50QXJ0aWZhY3RzLmdldChyZXNEZXBBcnRUeXBlKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVUb3NjYUFydGlmYWN0c0JlZm9yZUFuZEFmdGVyU0ZUKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjb21wb25lbnRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlDb21wb25lbnQgY29tcG9uZW50ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY29tcG9uZW50UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gdG9zY2FBcnRpZmFjdHMgPSBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKTsKKwkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgOiB0b3NjYUFydGlmYWN0cy52YWx1ZXMoKSkgeworCQkJYXNzZXJ0TnVsbChhcnRpZmFjdC5nZXRFc0lkKCkpOworCQl9CisKKwkJY29tcG9uZW50UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChjb21wb25lbnRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJdG9zY2FBcnRpZmFjdHMgPSBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKTsKKworCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA6IHRvc2NhQXJ0aWZhY3RzLnZhbHVlcygpKSB7CisJCQlhc3NlcnRFcXVhbHMoYXJ0aWZhY3QuZ2V0RXNJZCgpLCBhcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJCUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWZpZWxkcy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KCJpZCIsIGFydGlmYWN0LmdldEVzSWQoKSkpOworCQkJTGlzdDxSb3c+IGZldGNoRnJvbVRhYmxlID0gQ2Fzc2FuZHJhVXRpbHMuZmV0Y2hGcm9tVGFibGVRdWVyeSgic2RjYXJ0aWZhY3QiLCAicmVzb3VyY2VzIiwgZmllbGRzKTsKKwkJCWFzc2VydFRydWUoMSA9PSBmZXRjaEZyb21UYWJsZS5zaXplKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZVRvc2NhQXJ0aWZhY3RzQmVmb3JlQW5kQWZ0ZXJTRlQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQUREIFZGIGFuZCBTZXJ2aWNlCisJCXZhbGlkYXRlVG9zY2FBcnRpZmFjdHNCZWZvcmVBbmRBZnRlclNGVChyZXNvdXJjZURldGFpbHMxKTsKKwkJdmFsaWRhdGVUb3NjYUFydGlmYWN0c0JlZm9yZUFuZEFmdGVyU0ZUKHJlc291cmNlQ1ApOworCQl2YWxpZGF0ZVRvc2NhQXJ0aWZhY3RzQmVmb3JlQW5kQWZ0ZXJTRlQocmVzb3VyY2VWTCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZVRvc2NhUGxhY2VIb2xkZXJzQnlDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCUxpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVJlc3RSZXNwb25zZSBjb21wb25lbnRHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlsczEsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJY29tcG9uZW50cy5hZGQoUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY29tcG9uZW50R2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkpOworCisJCWNvbXBvbmVudEdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VDUCwgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQljb21wb25lbnRzLmFkZChSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChjb21wb25lbnRHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKSk7CisKKwkJY29tcG9uZW50R2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZVZGLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWNvbXBvbmVudHMuYWRkKFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNvbXBvbmVudEdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpKTsKKworCQljb21wb25lbnRHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlVkwsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJY29tcG9uZW50cy5hZGQoUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY29tcG9uZW50R2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkpOworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVNlcnZpY2VCeUNhdGVnb3J5KFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJY29tcG9uZW50R2V0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZS5nZXRVbmlxdWVJZCgpLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQljb21wb25lbnRzLmFkZChSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY29tcG9uZW50R2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcykpOworCisJCWZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpIHsKKwkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gdG9zY2FBcnRpZmFjdHMgPSBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKTsKKwkJCWFzc2VydE5vdE51bGwoInRvc2NhQXJ0aWZhY3RzIGxpc3QgaXMgbnVsbCIsIHRvc2NhQXJ0aWZhY3RzKTsKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0T2ZUb3NjYUFydFR5cGVzRnJvbUNvbmZpZyA9IFV0aWxzLmdldExpc3RPZlRvc2NhQXJ0TGFiZWxzKHRydWUpOworCQkJYXNzZXJ0Tm90TnVsbCgidG9zY2EgYXJ0aWZhY3QgdHlwZXMgbGlzdCBpcyBudWxsIiwgbGlzdE9mVG9zY2FBcnRUeXBlc0Zyb21Db25maWcpOworCQkJZm9yIChTdHJpbmcgdG9zY2FBcnRUeXBlIDogbGlzdE9mVG9zY2FBcnRUeXBlc0Zyb21Db25maWcpIHsKKwkJCQlhc3NlcnROb3ROdWxsKCJwbGFjZWhvbGRlciBvZiAiICsgdG9zY2FBcnRUeXBlICsgIiB0eXBlIGRvZXNuJ3QgZXhpc3QiLAorCQkJCQkJdG9zY2FBcnRpZmFjdHMuZ2V0KHRvc2NhQXJ0VHlwZSkpOworCQkJfQorCQl9CisKKwl9CisKKwkvLyB0ZXN0IGNoZWNrIGNvbmZpZ3VyYXRpb24gb2YgImRpc3BsYXlOYW1lIiBmaWVsZCBmb3IgImhlYXQiIHR5cGUKKwkvLyBkZXBsb3ltZW50IGFydGlmYWN0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZURlcGxveW1lbnRQbGFjZUhvbGRlcnNEZXNjcmlwdGlvbk9mSGVhdEJ5Q29uZmlnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcE9mRGVwUmVzQXJ0VHlwZXNPYmplY3RzID0gZ2V0TWFwT2ZEZXBSZXNBcnRUeXBlc09iamVjdHMoKTsKKwkJYXNzZXJ0Tm90TnVsbCgiZGVwbG95bWVudCBhcnRpZmFjdCB0eXBlcyBsaXN0IGlzIG51bGwiLCBtYXBPZkRlcFJlc0FydFR5cGVzT2JqZWN0cyk7CisJCU9iamVjdCBvYmplY3QgPSBtYXBPZkRlcFJlc0FydFR5cGVzT2JqZWN0cy5nZXQoImhlYXQiKTsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcDw/LCA/PikgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0Pikgb2JqZWN0OworCQkJYXNzZXJ0VHJ1ZShtYXAuZ2V0KCJkaXNwbGF5TmFtZSIpLmVxdWFscygiQmFzZSBIRUFUIFRlbXBsYXRlIikpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0VHJ1ZSgicmV0dXJuIG9iamVjdCBkb2VzIG5vdCBpbnN0YW5jZSBvZiBtYXAiLCBmYWxzZSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZERlcFJlc0FydEVhY2hUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGFydFR5cGU7CisKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0QXJ0aWZhY3REZXRhaWxzKTsKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0Vm9sQXJ0aWZhY3REZXRhaWxzKTsKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0TmV0QXJ0aWZhY3REZXRhaWxzKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMS5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RPZlJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZyA9IFV0aWxzLmdldExpc3RPZkRlcFJlc0FydExhYmVscyh0cnVlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiZGVwbG95bWVudCBhcnRpZmFjdCB0eXBlcyBsaXN0IGlzIG51bGwiLCBsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcpOworCQlmb3IgKFN0cmluZyBpdGVyIDogbGlzdE9mUmVzRGVwQXJ0VHlwZXNGcm9tQ29uZmlnKSB7CisJCQlhcnRUeXBlID0gaXRlcjsKKwkJCXZlcmlmeURlcEFydFBsYWNlSG9sZGVyc0J5VHlwZShhcnRUeXBlKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tIZWF0UGFyYW1ldGVyc0V4aXN0aW5nRm9yRWFjaFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgYXJ0VHlwZTsKKworCQlhZGREZXBsb3ltZW50QXJ0aWZhY3RCeVR5cGVUb1Jlc291cmNlKHJlc291cmNlRGV0YWlsczEsIGhlYXRBcnRpZmFjdERldGFpbHMpOworCQlhZGREZXBsb3ltZW50QXJ0aWZhY3RCeVR5cGVUb1Jlc291cmNlKHJlc291cmNlRGV0YWlsczEsIGhlYXRWb2xBcnRpZmFjdERldGFpbHMpOworCQlhZGREZXBsb3ltZW50QXJ0aWZhY3RCeVR5cGVUb1Jlc291cmNlKHJlc291cmNlRGV0YWlsczEsIGhlYXROZXRBcnRpZmFjdERldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlMaXN0PFN0cmluZz4gbGlzdE9mUmVzRGVwQXJ0VHlwZXNGcm9tQ29uZmlnID0gVXRpbHMuZ2V0TGlzdE9mRGVwUmVzQXJ0TGFiZWxzKHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJkZXBsb3ltZW50IGFydGlmYWN0IHR5cGVzIGxpc3QgaXMgbnVsbCIsIGxpc3RPZlJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZyk7CisJCWZvciAoU3RyaW5nIGl0ZXIgOiBsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcpIHsKKwkJCWFydFR5cGUgPSBpdGVyOworCQkJdmVyaWZ5RGVwQXJ0UGxhY2VIb2xkZXJzQnlUeXBlKGFydFR5cGUpOworCQkJdmVyaWZ5SGVhdFBhcmFtZXRlcnNFeGlzdGFuY2UoYXJ0VHlwZSwgZmFsc2UpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0hlYXRQYXJhbWV0ZXJzRXhpc3RpbmdGb3JTcGVjaWZpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgYXJ0VHlwZTsKKworCQlhZGREZXBsb3ltZW50QXJ0aWZhY3RCeVR5cGVUb1Jlc291cmNlKHJlc291cmNlRGV0YWlsczEsIGhlYXRWb2xBcnRpZmFjdERldGFpbHMpOworCQlhZGREZXBsb3ltZW50QXJ0aWZhY3RCeVR5cGVUb1Jlc291cmNlKHJlc291cmNlRGV0YWlsczEsIGhlYXROZXRBcnRpZmFjdERldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlMaXN0PFN0cmluZz4gbGlzdE9mUmVzRGVwQXJ0VHlwZXNGcm9tQ29uZmlnID0gVXRpbHMuZ2V0TGlzdE9mRGVwUmVzQXJ0TGFiZWxzKHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJkZXBsb3ltZW50IGFydGlmYWN0IHR5cGVzIGxpc3QgaXMgbnVsbCIsIGxpc3RPZlJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZyk7CisJCWZvciAoU3RyaW5nIGl0ZXIgOiBsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcpIHsKKwkJCWFydFR5cGUgPSBpdGVyOworCQkJaWYgKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RMYWJlbCgpLmVxdWFscyhpdGVyKSkgeworCQkJCXZlcmlmeUhlYXRQYXJhbWV0ZXJzRXhpc3RhbmNlKGFydFR5cGUsIHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQl2ZXJpZnlIZWF0UGFyYW1ldGVyc0V4aXN0YW5jZShhcnRUeXBlLCBmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEFuZERlbGV0ZURlcFJlc0FydEVhY2hUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGFydFR5cGU7CisKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0QXJ0aWZhY3REZXRhaWxzKTsKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0Vm9sQXJ0aWZhY3REZXRhaWxzKTsKKwkJYWRkRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0TmV0QXJ0aWZhY3REZXRhaWxzKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMS5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RPZlJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZyA9IFV0aWxzLmdldExpc3RPZkRlcFJlc0FydExhYmVscyh0cnVlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiZGVwbG95bWVudCBhcnRpZmFjdCB0eXBlcyBsaXN0IGlzIG51bGwiLCBsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcpOworCQlmb3IgKFN0cmluZyBpdGVyIDogbGlzdE9mUmVzRGVwQXJ0VHlwZXNGcm9tQ29uZmlnKSB7CisJCQlhcnRUeXBlID0gaXRlcjsKKwkJCXZlcmlmeURlcEFydFBsYWNlSG9sZGVyc0J5VHlwZShhcnRUeXBlKTsKKwkJfQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRUcnVlKCJleHBlY3RlZCByZXNwb25zZSBjb2RlIGluIENIRUNLSU4gMjAwIiwgcmVzdFJlc3BvbnNlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgcmVzcG9uc2UgY29kZSBpbiBDSEVDS09VVCAyMDAiLCByZXN0UmVzcG9uc2VSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCS8vIGRlbGV0ZSBhbGwgZGVwbG95bWVudCBhcnRpZmFjdHMKKwkJZGVsZXRlRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0QXJ0aWZhY3REZXRhaWxzKTsKKwkJZGVsZXRlRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0Vm9sQXJ0aWZhY3REZXRhaWxzKTsKKwkJZGVsZXRlRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBoZWF0TmV0QXJ0aWZhY3REZXRhaWxzKTsKKwkJcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcgPSBVdGlscy5nZXRMaXN0T2ZEZXBSZXNBcnRMYWJlbHModHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImRlcGxveW1lbnQgYXJ0aWZhY3QgdHlwZXMgbGlzdCBpcyBudWxsIiwgbGlzdE9mUmVzRGVwQXJ0VHlwZXNGcm9tQ29uZmlnKTsKKwkJZm9yIChTdHJpbmcgaXRlciA6IGxpc3RPZlJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZykgeworCQkJYXJ0VHlwZSA9IGl0ZXI7CisJCQl2ZXJpZnlEZXBBcnRQbGFjZUhvbGRlcnNCeVR5cGUoYXJ0VHlwZSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFJlbW92ZUFkZEFnYWluQXJ0aWZhY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBnZXQgTUFQIGJlZm9yZSB1cGxvYWQgYXJ0aWZhY3QKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCVJlc291cmNlIHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHMgPSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoImhlYXQiKTsKKworCQkvLyB2YWxpZGF0ZSBwbGFjZSBob2xkZXIgZXhpc3QKKwkJYXNzZXJ0Tm90TnVsbChhcnRpZmFjdERlZmluaXRpb24pOworCisJCS8vIGFkZCBhcnRpZmFjdAorCQl1cGRhdGVBcnRpZmFjdFJlcURldGFpbHMgPSBnZXRVcGRhdGVBcnRpZmFjdERldGFpbHMoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKAorCQkJCXVwZGF0ZUFydGlmYWN0UmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHJlc291cmNlRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZTogICIKKwkJCQkrIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdERlZmluaXRpb25SZXNwb25zZVRvSmF2YU9iamVjdChhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0RGVmMSA9IGZpbGxBcnREZWZGcm9tUmVzcG9uc2UoYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0KTsKKworCQkvLyByZW1vdmUgYXJ0aWZhY3QKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUFydGlmYWN0RnJvbVJlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZGVsZXRlSW5mb3JtYXRpb25hbEFydGlmYWN0RnJvbVJlc291cmNlKAorCQkJCXJlc291cmNlRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSwgdXBkYXRlQXJ0aWZhY3RSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWxvZ2dlci5kZWJ1ZygKKwkJCQkiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZTogICIgKyBkZWxldGVBcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMCwgcmV0dXJuZWQgOiIgKyBkZWxldGVBcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlkZWxldGVBcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3AgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisKKwkJYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlVG9KYXZhT2JqZWN0KGRlbGV0ZUFydGlmYWN0RnJvbVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdC5nZXRBcnRpZmFjdE5hbWUoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdC5nZXREZXNjcmlwdGlvbigpLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUoYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0LmdldEFydGlmYWN0Q2hlY2tzdW0oKS5pc0VtcHR5KCkpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdC5nZXRFc0lkKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShhcnRpZmFjdERlZmluaXRpb25SZXNwb25zZUphdmFPYmplY3QuZ2V0QXJ0aWZhY3RVVUlEKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0TnVsbChhcnRpZmFjdERlZmluaXRpb25SZXNwb25zZUphdmFPYmplY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKSk7CisKKwkJLy8gYWRkIGFydGlmYWN0IGFnYWluIHdpdGggZGlmZmVyZW50IHVzZXIKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHJlc291cmNlRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZTogICIKKwkJCQkrIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlVG9KYXZhT2JqZWN0KGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnREZWYyID0gZmlsbEFydERlZkZyb21SZXNwb25zZShhcnRpZmFjdERlZmluaXRpb25SZXNwb25zZUphdmFPYmplY3QpOworCisJCWFzc2VydEZhbHNlKCJjaGVjayBhcnRpZmFjdCBjaGVja3N1bSIsIGFydERlZjEuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpLmVxdWFscyhhcnREZWYyLmdldEFydGlmYWN0Q2hlY2tzdW0oKSkpOworCQlhc3NlcnRUcnVlKCJjaGVjayBhcnRpZmFjdCBFc0lkIiwgYXJ0RGVmMS5nZXRFc0lkKCkuZXF1YWxzKGFydERlZjIuZ2V0RXNJZCgpKSk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBhcnRpZmFjdCBVVUlEIiwgYXJ0RGVmMS5nZXRBcnRpZmFjdFVVSUQoKS5lcXVhbHMoYXJ0RGVmMi5nZXRBcnRpZmFjdFVVSUQoKSkpOworCQlhc3NlcnRUcnVlKCJjaGVjayBVc2VySWRDcmVhdG9yIiwgYXJ0RGVmMS5nZXRVc2VySWRDcmVhdG9yKCkuZXF1YWxzKGFydERlZjIuZ2V0VXNlcklkQ3JlYXRvcigpKSk7CisJCWFzc2VydFRydWUoImNoZWNrIFVzZXJJZExhc3RVcGRhdGVyIiwgYXJ0RGVmMS5nZXRVc2VySWRMYXN0VXBkYXRlcigpLmVxdWFscyhhcnREZWYyLmdldFVzZXJJZExhc3RVcGRhdGVyKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFVwZGF0ZUFydGlmYWN0QnlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gZ2V0IE1BUCBiZWZvcmUgdXBsb2FkIGFydGlmYWN0CisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMSwgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KCJoZWF0Iik7CisKKwkJLy8gdmFsaWRhdGUgcGxhY2UgaG9sZGVyIGV4aXN0CisJCWFzc2VydE5vdE51bGwoYXJ0aWZhY3REZWZpbml0aW9uKTsKKworCQkvLyBhZGQgYXJ0aWZhY3QKKwkJdXBkYXRlQXJ0aWZhY3RSZXFEZXRhaWxzID0gZ2V0VXBkYXRlQXJ0aWZhY3REZXRhaWxzKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSgKKwkJCQl1cGRhdGVBcnRpZmFjdFJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCByZXNvdXJjZURldGFpbHMxLmdldFVuaXF1ZUlkKCkpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6ICAiCisJCQkJKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb25SZXNwb25zZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydERlZjEgPSBmaWxsQXJ0RGVmRnJvbVJlc3BvbnNlKGFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdCk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKworCQkvLyB1cGRhdGUgd2l0aCBkaWZmZXJlbnQgdXNlciBhcnRpZmFjdAorCQloZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0VW5pcXVlSWQoYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZSgiMi55YW1sIik7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RMYWJlbChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSgKKwkJCQloZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMiwgcmVzb3VyY2VEZXRhaWxzMS5nZXRVbmlxdWVJZCgpLCAiaGVhdCIpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6ICAiCisJCQkJKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCWFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdERlZmluaXRpb25SZXNwb25zZVRvSmF2YU9iamVjdChhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0RGVmMiA9IGZpbGxBcnREZWZGcm9tUmVzcG9uc2UoYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0KTsKKwkJdmVyaWZ5QXJ0RGVmRmllbGRzKGFydERlZjEsIGFydERlZjIpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRVcGRhdGVEZWxldGVBcnRpZmFjdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGdldCBNQVAgYmVmb3JlIHVwbG9hZCBhcnRpZmFjdAorCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlsczEsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBkZXBsb3ltZW50QXJ0aWZhY3RzLmdldCgiaGVhdCIpOworCisJCS8vIHZhbGlkYXRlIHBsYWNlIGhvbGRlciBleGlzdAorCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0RGVmaW5pdGlvbik7CisKKwkJdXBkYXRlQXJ0aWZhY3RSZXFEZXRhaWxzID0gZ2V0VXBkYXRlQXJ0aWZhY3REZXRhaWxzKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSgKKwkJCQl1cGRhdGVBcnRpZmFjdFJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCByZXNvdXJjZURldGFpbHMxLmdldFVuaXF1ZUlkKCkpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6ICAiCisJCQkJKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb25SZXNwb25zZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydERlZjEgPSBmaWxsQXJ0RGVmRnJvbVJlc3BvbnNlKGFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdCk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKworCQkvLyB1cGRhdGUgd2l0aCBkaWZmZXJlbnQgdXNlciBhcnRpZmFjdAorCQloZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3ROYW1lKCIyLnlhbWwiKTsKKworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSgKKwkJCQloZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMiwgcmVzb3VyY2VEZXRhaWxzMS5nZXRVbmlxdWVJZCgpLCAiaGVhdCIpOworCQlsb2dnZXIuZGVidWcoImFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgcmVzcG9uc2U6ICAiCisJCQkJKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCWFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdERlZmluaXRpb25SZXNwb25zZVRvSmF2YU9iamVjdChhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0RGVmMiA9IGZpbGxBcnREZWZGcm9tUmVzcG9uc2UoYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0KTsKKworCQl2ZXJpZnlBcnREZWZGaWVsZHMoYXJ0RGVmMSwgYXJ0RGVmMik7CisKKwkJUmVzdFJlc3BvbnNlIGRlbHRlQXJ0aWZhY3RGcm9tUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UoCisJCQkJcmVzb3VyY2VEZXRhaWxzMS5nZXRVbmlxdWVJZCgpLCBoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMik7CisJCWxvZ2dlci5kZWJ1ZygiYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSByZXNwb25zZToge30iLCBkZWx0ZUFydGlmYWN0RnJvbVJlc291cmNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIGRlbHRlQXJ0aWZhY3RGcm9tUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJZGVsdGVBcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRIZWF0Vm9sQXJ0SW52YWxpZEV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCWhlYXRWb2xBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3ROYW1lKCJoZWF0Vm9sLnR4dCIpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBnZXRSZXNwb25zZU9uQWRkRGVwbG95bWVudEFydGlmYWN0QnlUeXBlVG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLAorCQkJCWhlYXRWb2xBcnRpZmFjdERldGFpbHMpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMKKwkJCQkucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLldST05HX0FSVElGQUNUX0ZJTEVfRVhURU5TSU9OLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGxvYWQgYXJ0aWZhY3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KEFydGlmYWN0VHlwZUVudW0uSEVBVF9WT0wuZ2V0VHlwZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5XUk9OR19BUlRJRkFDVF9GSUxFX0VYVEVOU0lPTi5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEhlYXROZXRBcnRJbnZhbGlkRXh0ZW5zaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaGVhdE5ldEFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdE5hbWUoInlhbWwiKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gZ2V0UmVzcG9uc2VPbkFkZERlcGxveW1lbnRBcnRpZmFjdEJ5VHlwZVRvUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMSwKKwkJCQloZWF0TmV0QXJ0aWZhY3REZXRhaWxzKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzCisJCQkJLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5XUk9OR19BUlRJRkFDVF9GSUxFX0VYVEVOU0lPTi5uYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBsb2FkIGFydGlmYWN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVULmdldFR5cGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuV1JPTkdfQVJUSUZBQ1RfRklMRV9FWFRFTlNJT04ubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja1NlcnZpY2VTZWN1cml0eVRlbXBsYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0c0NyZWF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXN0UmVzcG9uc2U+IGNyZWF0ZVNlcnZpY2VSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVNlcnZpY2VCeUNhdGVnb3J5KFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBudWxsOworCQlBcnRpZmFjdERlZmluaXRpb24gc2VjdXJpdHl0ZW1wbGF0ZSA9IG51bGw7CisJCWlmIChjcmVhdGVTZXJ2aWNlUmVzcG9uc2UuaXNMZWZ0KCkpIHsKKwkJCUNvbXBvbmVudCBjb21wb25lbnQgPSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCQlhcnRpZmFjdHMgPSBjb21wb25lbnQuZ2V0QXJ0aWZhY3RzKCk7CisJCQlzZWN1cml0eXRlbXBsYXRlID0gYXJ0aWZhY3RzLmdldCgic2VydmljZXNlY3VyaXR5dGVtcGxhdGUiKTsKKwkJCWFzc2VydE5vdE51bGwoc2VjdXJpdHl0ZW1wbGF0ZSk7CisJCQlhc3NlcnRFcXVhbHMoIlNlcnZpY2UgU2VjdXJpdHkgVGVtcGxhdGUiLCBzZWN1cml0eXRlbXBsYXRlLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSk7CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoImNoZWNrU2VjdXJpdHlUZW1wbGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdHNDcmVhdGlvbiBzZXJ2aWNlIGNyZWF0aW9uIHJlc3BvbnNlOiAgIgorCQkJCQkrIGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja1Jlc291cmNlU2VjdXJpdHlUZW1wbGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdHNDcmVhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZSByZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5DT05UQUlORVJfQVBQTElDQVRJT04sIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkFQUExJQ0FUSU9OX0w0X0JPUkRFUiwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHJlc291cmNlLmdldEFydGlmYWN0cygpOworCQlBcnRpZmFjdERlZmluaXRpb24gc2VjdXJpdHl0ZW1wbGF0ZSA9IGFydGlmYWN0cy5nZXQoInJlc291cmNlc2VjdXJpdHl0ZW1wbGF0ZSIpOworCQlhc3NlcnROb3ROdWxsKHNlY3VyaXR5dGVtcGxhdGUpOworCQlhc3NlcnRFcXVhbHMoIlJlc291cmNlIFNlY3VyaXR5IFRlbXBsYXRlIiwgc2VjdXJpdHl0ZW1wbGF0ZS5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpOworCX0KKworCS8vIEJlbm55CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlU2VjdXJpdHlUZW1wbGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFydGlmYWN0UGxhY2VIb2xkZXIgPSAic2VydmljZXNlY3VyaXR5dGVtcGxhdGUiOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVTZXJ2aWNlQnlDYXRlZ29yeShTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFksIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gc2VydmljZS5nZXRBcnRpZmFjdHMoKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIHNlY3VyaXR5dGVtcGxhdGUgPSBhcnRpZmFjdHMuZ2V0KGFydGlmYWN0UGxhY2VIb2xkZXIpOworCQlhc3NlcnROb3ROdWxsKHNlY3VyaXR5dGVtcGxhdGUpOworCQlhc3NlcnRFcXVhbHMoIlNlcnZpY2UgU2VjdXJpdHkgVGVtcGxhdGUiLCBzZWN1cml0eXRlbXBsYXRlLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiT1RIRVIiLCBzZWN1cml0eXRlbXBsYXRlLmdldEFydGlmYWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGFydGlmYWN0UGxhY2VIb2xkZXIsIHNlY3VyaXR5dGVtcGxhdGUuZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJLy8gR2V0IHNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZS5nZXRVbmlxdWVJZCgpLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBnZXRTZXJ2aWNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCWFydGlmYWN0cyA9IHNlcnZpY2UuZ2V0QXJ0aWZhY3RzKCk7CisJCXNlY3VyaXR5dGVtcGxhdGUgPSBhcnRpZmFjdHMuZ2V0KGFydGlmYWN0UGxhY2VIb2xkZXIpOworCQlhc3NlcnROb3ROdWxsKHNlY3VyaXR5dGVtcGxhdGUpOworCQlhc3NlcnRFcXVhbHMoIlNlcnZpY2UgU2VjdXJpdHkgVGVtcGxhdGUiLCBzZWN1cml0eXRlbXBsYXRlLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiT1RIRVIiLCBzZWN1cml0eXRlbXBsYXRlLmdldEFydGlmYWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGFydGlmYWN0UGxhY2VIb2xkZXIsIHNlY3VyaXR5dGVtcGxhdGUuZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlc291cmNlU2VjdXJpdHlUZW1wbGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhcnRpZmFjdFBsYWNlSG9sZGVyID0gInJlc291cmNlc2VjdXJpdHl0ZW1wbGF0ZSI7CisJCVJlc291cmNlIHJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLkNPTlRBSU5FUl9BUFBMSUNBVElPTiwgUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfQk9SREVSLAorCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gcmVzb3VyY2UuZ2V0QXJ0aWZhY3RzKCk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBzZWN1cml0eXRlbXBsYXRlID0gYXJ0aWZhY3RzLmdldCgicmVzb3VyY2VzZWN1cml0eXRlbXBsYXRlIik7CisJCWFzc2VydE5vdE51bGwoc2VjdXJpdHl0ZW1wbGF0ZSk7CisJCWFzc2VydEVxdWFscygiUmVzb3VyY2UgU2VjdXJpdHkgVGVtcGxhdGUiLCBzZWN1cml0eXRlbXBsYXRlLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiT1RIRVIiLCBzZWN1cml0eXRlbXBsYXRlLmdldEFydGlmYWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGFydGlmYWN0UGxhY2VIb2xkZXIsIHNlY3VyaXR5dGVtcGxhdGUuZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJLy8gR2V0IHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBnZXRyZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksCisJCQkJcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGdldHJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRyZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFydGlmYWN0cyA9IHJlc291cmNlLmdldEFydGlmYWN0cygpOworCQlzZWN1cml0eXRlbXBsYXRlID0gYXJ0aWZhY3RzLmdldChhcnRpZmFjdFBsYWNlSG9sZGVyKTsKKwkJYXNzZXJ0Tm90TnVsbChzZWN1cml0eXRlbXBsYXRlKTsKKwkJYXNzZXJ0RXF1YWxzKCJSZXNvdXJjZSBTZWN1cml0eSBUZW1wbGF0ZSIsIHNlY3VyaXR5dGVtcGxhdGUuZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJPVEhFUiIsIHNlY3VyaXR5dGVtcGxhdGUuZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoYXJ0aWZhY3RQbGFjZUhvbGRlciwgc2VjdXJpdHl0ZW1wbGF0ZS5nZXRBcnRpZmFjdExhYmVsKCkpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE1hcE9mRGVwUmVzQXJ0VHlwZXNPYmplY3RzKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwkJcmV0dXJuIChNYXA8U3RyaW5nLCBPYmplY3Q+KSBVdGlscy5wYXJzZVlhbWxDb25maWcoImRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cyIpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZERlcGxveW1lbnRBcnRpZmFjdEJ5VHlwZVRvUmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlUmVxRGV0YWlscywKKwkJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRSZXFEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShhcnRSZXFEZXRhaWxzLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMxLCByZXNvdXJjZVJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoImFkZCIgKyBhcnRSZXFEZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKSArICIgYXJ0aWZhY3QgdG8gcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IgorCQkJCSsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgZ2V0UmVzcG9uc2VPbkFkZERlcGxveW1lbnRBcnRpZmFjdEJ5VHlwZVRvUmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlUmVxRGV0YWlscywKKwkJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRSZXFEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJcmV0dXJuIEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoYXJ0UmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsCisJCQkJcmVzb3VyY2VSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBkZWxldGVEZXBsb3ltZW50QXJ0aWZhY3RCeVR5cGVUb1Jlc291cmNlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZVJlcURldGFpbHMsCisJCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0UmVxRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRlbGV0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdEZyb21SZXNvdXJjZSgKKwkJCQlyZXNvdXJjZVJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgYXJ0UmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKCJkZWxldGUiICsgYXJ0UmVxRGV0YWlscy5nZXRBcnRpZmFjdExhYmVsKCkgKyAiIGFydGlmYWN0IHRvIHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIKKwkJCQkrIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlEZXBBcnRQbGFjZUhvbGRlcnNCeVR5cGUoU3RyaW5nIGFydFR5cGUpIHsKKworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHMgPSByZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWFzc2VydE5vdE51bGwoImRlcGxveW1lbnQgYXJ0aWZhY3QgZGF0YSBpcyBudWxsIiwgZGVwbG95bWVudEFydGlmYWN0cy5nZXQoYXJ0VHlwZSkpOworCQlhc3NlcnROb3ROdWxsKCJkZXBsb3ltZW50IGFydGlmYWN0IGRhdGEgaXMgbnVsbCIsIGRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGFydFR5cGUpLmdldEVzSWQoKSk7CisJCWFzc2VydE5vdE51bGwoImRlcGxveW1lbnQgYXJ0aWZhY3QgZGF0YSBpcyBudWxsIiwgZGVwbG95bWVudEFydGlmYWN0cy5nZXQoYXJ0VHlwZSkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWFzc2VydFRydWUoCisJCQkJImRlcGxveW1lbnQgYXJ0aWZhY3QgdGltZW91dCBkb2VzIG5vdCBlcXVhbCB0byBkZWZhdWx0IHZhbHVlICIgKyB0aW1lT3V0ICsgIiBleHBlY3RlZCAiICsgdGltZU91dAorCQkJCQkJKyAiLCBhY3R1YWwgLSAiICsgZGVwbG95bWVudEFydGlmYWN0cy5nZXQoYXJ0VHlwZSkuZ2V0VGltZW91dCgpLAorCQkJCWRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGFydFR5cGUpLmdldFRpbWVvdXQoKSA9PSB0aW1lT3V0KTsKKwkJYXNzZXJ0VHJ1ZSgiZGVwbG95bWVudCBhcnRpZmFjdCBsYWJlbCB2YWx1ZSAiLAorCQkJCWRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGFydFR5cGUpLmdldEFydGlmYWN0TGFiZWwoKS5lcXVhbHMoYXJ0VHlwZSkpOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlIZWF0UGFyYW1ldGVyc0V4aXN0YW5jZShTdHJpbmcgYXJ0VHlwZSwgQm9vbGVhbiBpc051bGwpIHsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlpZiAoaXNOdWxsKSB7CisJCQlhc3NlcnROdWxsKCJoZWF0UGFyYW1ldGVycyBsaXN0IGZvciB0eXBlICIgKyBhcnRUeXBlICsgIiBpcyBub3QgbnVsbCIsCisJCQkJCWRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGFydFR5cGUpLmdldEhlYXRQYXJhbWV0ZXJzKCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGVhdFBhcmFtZXRlcnMgbGlzdCBmb3IgdHlwZSAiICsgYXJ0VHlwZSArICIgaXMgbnVsbCIsCisJCQkJCWRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGFydFR5cGUpLmdldEhlYXRQYXJhbWV0ZXJzKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZlcmlmeUFydERlZkZpZWxkcyhBcnRpZmFjdERlZmluaXRpb24gYXJ0RGVmMSwgQXJ0aWZhY3REZWZpbml0aW9uIGFydERlZjIpIHsKKworCQlhc3NlcnRGYWxzZSgiY2hlY2sgYXJ0aWZhY3QgY2hlY2tzdW0iLCBhcnREZWYxLmdldEFydGlmYWN0Q2hlY2tzdW0oKS5lcXVhbHMoYXJ0RGVmMi5nZXRBcnRpZmFjdENoZWNrc3VtKCkpKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIGFydGlmYWN0IEVzSWQiLCBhcnREZWYxLmdldEVzSWQoKS5lcXVhbHMoYXJ0RGVmMi5nZXRFc0lkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIGFydGlmYWN0IFVVSUQiLCBhcnREZWYxLmdldEFydGlmYWN0VVVJRCgpLmVxdWFscyhhcnREZWYyLmdldEFydGlmYWN0VVVJRCgpKSk7CisJCWFzc2VydFRydWUoImNoZWNrIFVzZXJJZENyZWF0b3IiLCBhcnREZWYxLmdldFVzZXJJZENyZWF0b3IoKS5lcXVhbHMoYXJ0RGVmMi5nZXRVc2VySWRDcmVhdG9yKCkpKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIFVzZXJJZExhc3RVcGRhdGVyIiwgYXJ0RGVmMS5nZXRVc2VySWRMYXN0VXBkYXRlcigpLmVxdWFscyhhcnREZWYyLmdldFVzZXJJZExhc3RVcGRhdGVyKCkpKTsKKworCX0KKworCXByaXZhdGUgQXJ0aWZhY3REZWZpbml0aW9uIGZpbGxBcnREZWZGcm9tUmVzcG9uc2UoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlSmF2YU9iamVjdCkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0RGVmID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCQlhcnREZWYuc2V0QXJ0aWZhY3RDaGVja3N1bShhcnRpZmFjdERlZmluaXRpb25SZXNwb25zZUphdmFPYmplY3QuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpKTsKKwkJYXJ0RGVmLnNldEVzSWQoYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0LmdldEVzSWQoKSk7CisJCWFydERlZi5zZXRBcnRpZmFjdFVVSUQoYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0LmdldEFydGlmYWN0VVVJRCgpKTsKKwkJYXJ0RGVmLnNldFVzZXJJZENyZWF0b3IoYXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VKYXZhT2JqZWN0LmdldFVzZXJJZENyZWF0b3IoKSk7CisJCWFydERlZi5zZXRVc2VySWRMYXN0VXBkYXRlcihhcnRpZmFjdERlZmluaXRpb25SZXNwb25zZUphdmFPYmplY3QuZ2V0VXNlcklkTGFzdFVwZGF0ZXIoKSk7CisJCXJldHVybiBhcnREZWY7CisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdFJlcURldGFpbHMgZ2V0VXBkYXRlQXJ0aWZhY3REZXRhaWxzKFN0cmluZyBhcnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBleHQgPSBoZWF0RXh0ZW5zaW9uOworCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldFJlc291cmNlQ29uZmlnRGlyKCk7CisJCVN0cmluZyB0ZXN0UmVzb3VyY2VzUGF0aCA9IHNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgZm9sZGVyTmFtZTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisJCWxvZ2dlci5kZWJ1ZygibGlzdEZpbGVOYW1lOiB7fSIsIGxpc3RGaWxlTmFtZS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGUobGlzdEZpbGVOYW1lLCBleHQsIHRydWUpOworCQlBcnRpZmFjdFJlcURldGFpbHMgdXBkYXRlQXJ0aWZhY3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoYXJ0VHlwZSk7CisJCXVwZGF0ZUFydGlmYWN0UmVxRGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQl1cGRhdGVBcnRpZmFjdFJlcURldGFpbHMuc2V0QXJ0aWZhY3ROYW1lKCIxLnlhbWwiKTsKKwkJcmV0dXJuIHVwZGF0ZUFydGlmYWN0UmVxRGV0YWlsczsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvVmFsaWRhdGVBcnRSZXNwb25zZS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXJ0aWZhY3RzL1ZhbGlkYXRlQXJ0UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE2OTYzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXJ0aWZhY3RzL1ZhbGlkYXRlQXJ0UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuYXJ0aWZhY3RzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGVjb2RlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkF0b21pY09wZXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5SZXNvdXJjZVZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKKworcHVibGljIGNsYXNzIFZhbGlkYXRlQXJ0UmVzcG9uc2UgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZVZlcnNpb247CisKKwlwdWJsaWMgVmFsaWRhdGVBcnRSZXNwb25zZSgpIHsKKwkJc3VwZXIobmFtZSwgQXJ0aWZhY3RTZXJ2bGV0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisJfQorCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYXRoVG9GaWxlID0gImhlYXRBcnRpZmFjdFBhcmFtZXRlcnMiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaGVhdFdpdGhWYWxpZFBhcmFtcyA9ICJoZWF0V2l0aFZhbGlkUGFyYW1zLnlhbWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaGVhdFdpdGhQYXJhbXNNaXNzaW5nRGVmYXVsdCA9ICJoZWF0V2l0aFBhcmFtc01pc3NpbmdEZWZhdWx0LnlhbWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaGVhdFdpdGhQYXJhbXNNaXNzaW5nRGVzYyA9ICJoZWF0V2l0aFBhcmFtc01pc3NpbmdEZXNjLnlhbWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaGVhdFdpdGhQYXJhbXNNaXNzaW5nVHlwZSA9ICJoZWF0V2l0aFBhcmFtc01pc3NpbmdUeXBlLnlhbWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0Tm9EZXJpdmVkRnJvbUZpbGUgPSAibXlDb21wdXRlRGVyaXZlZEZyb21Ob3RFeGlzdHMueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGRlY29kZWRQYXlsb2FkID0gImRlY29kZWRQYXlsb2FkIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGVuY29kZWRQYXlsb2FkID0gImVuY29kZWRQYXlsb2FkIjsKKworCXByb3RlY3RlZCBSZXNvdXJjZSByZXNvdXJjZURldGFpbHNPYmo7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczsKKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJcmVzb3VyY2VEZXRhaWxzT2JqID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VEZXRhaWxzT2JqKTsKKwkJc2RuY0Rlc2lnbmVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbXBhcmVQYXJhbXRlcnNWc1lhbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBzZWxlY3QgZmlsZSB0byB1cGxvYWQKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVQYXlsb2FkID0gc2VsZWN0RmlsZVRvVXBsb2FkKHBhdGhUb0ZpbGUsIGhlYXRXaXRoVmFsaWRQYXJhbXMpOworCisJCS8vIHVwbG9hZCBIRUFUIGZpbGUgYW5kIHNhdmUgSlNPTiByZXNwb25zZQorCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChmaWxlUGF5bG9hZC5nZXQoZW5jb2RlZFBheWxvYWQpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGNyZWF0ZSBNQVAgZnJvbSByZWNlaXZlZCBKU09OCisKKwkJU3RyaW5nIHNlY3Rpb24yZXh0cmFjdCA9ICJoZWF0UGFyYW1ldGVycyI7CisJCVN0cmluZyBjcmVhdGVLZXlNYXBCeSA9ICJuYW1lIjsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gbWFwT2ZBY3R1YWxQYXJhbWV0ZXJzID0ganNvblRvTWFwKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UsCisJCQkJc2VjdGlvbjJleHRyYWN0LCBjcmVhdGVLZXlNYXBCeSk7CisKKwkJLy8gUHJlcGFyZSBtYXAgdG8gdmFsaWRhdGUgSlMKKworCQlNYXA8U3RyaW5nLCBNYXA+IHBhcmFtdGVycyA9IGNyZWF0ZU1hcEZyb21ZYW1sKGZpbGVQYXlsb2FkLmdldChkZWNvZGVkUGF5bG9hZCkpOworCisJCS8vIGNvbXBhcmUgTUFQcworCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFbGVtZW50cyhtYXBPZkFjdHVhbFBhcmFtZXRlcnMsIHBhcmFtdGVycyk7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRudWxsKFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gZXF1YWxzKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4dHJhY3RTaW5nbGVQYXJhbWV0ZXIoTWFwPFN0cmluZywgU3RyaW5nPiBjdXJyKSB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaW5uZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaWYgKGN1cnIuY29udGFpbnNLZXkoImRlc2NyaXB0aW9uIikpIHsKKwkJCWlubmVyTWFwLnB1dCgiZGVzY3JpcHRpb24iLCBjdXJyLmdldCgiZGVzY3JpcHRpb24iKSk7CisJCX0KKworCQlpZiAoY3Vyci5jb250YWluc0tleSgiZGVmYXVsdFZhbHVlIikpIHsKKwkJCWlubmVyTWFwLnB1dCgiZGVmYXVsdCIsIGN1cnIuZ2V0KCJkZWZhdWx0VmFsdWUiKSk7CisJCX0gZWxzZSB7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImt1a3UiKTsKKwkJfQorCQlpbm5lck1hcC5wdXQoInR5cGUiLCBjdXJyLmdldCgidHlwZSIpKTsKKwkJcmV0dXJuIGlubmVyTWFwOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBNYXA+IGNyZWF0ZU1hcEZyb21ZYW1sKFN0cmluZyBwYXlsb2FkKSB7CisJCUFycmF5TGlzdDxTdHJpbmc+IHBhcmFtZXRlcnNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJWWFtbCB5YW1sID0gbmV3IFlhbWwoKTsKKworCQlNYXA8U3RyaW5nLCBNYXA+IHJlc3VsdCA9IChNYXA8U3RyaW5nLCBNYXA+KSB5YW1sLmxvYWQocGF5bG9hZCk7CisJCU1hcDxTdHJpbmcsIE1hcD4gcGFyYW10ZXJzID0gKE1hcDxTdHJpbmcsIE1hcD4pIHJlc3VsdC5nZXQoInBhcmFtZXRlcnMiKTsKKworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcD4gZW50cnkgOiBwYXJhbXRlcnMuZW50cnlTZXQoKSkgeworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvcmlnSW5uZXJNYXAgPSAoTWFwPFN0cmluZywgU3RyaW5nPikgZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJaWYgKG9yaWdJbm5lck1hcC5jb250YWluc0tleSgibGFiZWwiKSkgeworCQkJCW9yaWdJbm5lck1hcC5yZW1vdmUoImxhYmVsIik7CisJCQkJcGFyYW10ZXJzLnJlbW92ZShlbnRyeSk7CisJCQkJcGFyYW10ZXJzLnB1dChlbnRyeS5nZXRLZXkoKSwgb3JpZ0lubmVyTWFwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcGFyYW10ZXJzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiBqc29uVG9NYXAoUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UsCisJCQlTdHJpbmcgc2VjdGlvbjJleHRyYWN0LCBTdHJpbmcgY3JlYXRlS2V5TWFwQnkpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBKc29uVG9NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJSnNvblRvTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpLAorCQkJCUpzb25Ub01hcC5nZXRDbGFzcygpKTsKKworCQlMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IGxpc3RPZlBhcmFtdGVycyA9IChMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+KSBKc29uVG9NYXAuZ2V0KHNlY3Rpb24yZXh0cmFjdCk7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IG1hcE9mQWN0dWFsUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4oKTsKKworCQlmb3IgKE1hcDxTdHJpbmcsIFN0cmluZz4gY3VyciA6IGxpc3RPZlBhcmFtdGVycykgeworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBpbm5lck1hcCA9IGV4dHJhY3RTaW5nbGVQYXJhbWV0ZXIoY3Vycik7CisKKwkJCW1hcE9mQWN0dWFsUGFyYW1ldGVycy5wdXQoY3Vyci5nZXQoY3JlYXRlS2V5TWFwQnkpLCBpbm5lck1hcCk7CisJCX0KKwkJcmV0dXJuIG1hcE9mQWN0dWFsUGFyYW1ldGVyczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBzZWxlY3RGaWxlVG9VcGxvYWQoU3RyaW5nIHBhdGhUb0ZpbGUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHNvdXJjZURpciA9IGNvbmZpZy5nZXRSZXNvdXJjZUNvbmZpZ0RpcigpOworCQlTdHJpbmcgdGVzdFJlc291cmNlc1BhdGggPSBzb3VyY2VEaXIgKyBGaWxlLnNlcGFyYXRvciArIHBhdGhUb0ZpbGU7CisJCVN0cmluZyBmaWxlID0gZmlsZU5hbWU7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZmlsZVBheWxvYWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJU3RyaW5nIHBheWxvYWQgPSBEZWNvZGVyLnJlYWRGaWxlVG9TdHJpbmcodGVzdFJlc291cmNlc1BhdGggKyBGaWxlLnNlcGFyYXRvciArIGZpbGUpOworCQlmaWxlUGF5bG9hZC5wdXQoZGVjb2RlZFBheWxvYWQsIHBheWxvYWQpOworCQlmaWxlUGF5bG9hZC5wdXQoZW5jb2RlZFBheWxvYWQsIERlY29kZXIuZW5jb2RlKHBheWxvYWQuZ2V0Qnl0ZXMoKSkpOworCisJCXJldHVybiBmaWxlUGF5bG9hZDsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdEZXNjUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBzZWxlY3QgZmlsZSB0byB1cGxvYWQKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVQYXlsb2FkID0gc2VsZWN0RmlsZVRvVXBsb2FkKHBhdGhUb0ZpbGUsIGhlYXRXaXRoUGFyYW1zTWlzc2luZ0Rlc2MpOworCisJCS8vIHVwbG9hZCBIRUFUIGZpbGUgYW5kIHNhdmUgSlNPTiByZXNwb25zZQorCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChmaWxlUGF5bG9hZC5nZXQoZW5jb2RlZFBheWxvYWQpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGNyZWF0ZSBNQVAgZnJvbSByZWNlaXZlZCBKU09OCisKKwkJU3RyaW5nIHNlY3Rpb24yZXh0cmFjdCA9ICJoZWF0UGFyYW1ldGVycyI7CisJCVN0cmluZyBjcmVhdGVLZXlNYXBCeSA9ICJuYW1lIjsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gbWFwT2ZBY3R1YWxQYXJhbWV0ZXJzID0ganNvblRvTWFwKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UsCisJCQkJc2VjdGlvbjJleHRyYWN0LCBjcmVhdGVLZXlNYXBCeSk7CisKKwkJLy8gUHJlcGFyZSBtYXAgdG8gdmFsaWRhdGUgSlMKKworCQlNYXA8U3RyaW5nLCBNYXA+IHBhcmFtdGVycyA9IGNyZWF0ZU1hcEZyb21ZYW1sKGZpbGVQYXlsb2FkLmdldChkZWNvZGVkUGF5bG9hZCkpOworCisJCS8vIGNvbXBhcmUgTUFQcworCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFbGVtZW50cyhtYXBPZkFjdHVhbFBhcmFtZXRlcnMsIHBhcmFtdGVycyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdEZWZhdWx0UGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBzZWxlY3QgZmlsZSB0byB1cGxvYWQKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVQYXlsb2FkID0gc2VsZWN0RmlsZVRvVXBsb2FkKHBhdGhUb0ZpbGUsIGhlYXRXaXRoUGFyYW1zTWlzc2luZ0RlZmF1bHQpOworCisJCS8vIHVwbG9hZCBIRUFUIGZpbGUgYW5kIHNhdmUgSlNPTiByZXNwb25zZQorCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChmaWxlUGF5bG9hZC5nZXQoZW5jb2RlZFBheWxvYWQpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGNyZWF0ZSBNQVAgZnJvbSByZWNlaXZlZCBKU09OCisKKwkJU3RyaW5nIHNlY3Rpb24yZXh0cmFjdCA9ICJoZWF0UGFyYW1ldGVycyI7CisJCVN0cmluZyBjcmVhdGVLZXlNYXBCeSA9ICJuYW1lIjsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gbWFwT2ZBY3R1YWxQYXJhbWV0ZXJzID0ganNvblRvTWFwKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UsCisJCQkJc2VjdGlvbjJleHRyYWN0LCBjcmVhdGVLZXlNYXBCeSk7CisKKwkJLy8gUHJlcGFyZSBtYXAgdG8gdmFsaWRhdGUgSlMKKworCQlNYXA8U3RyaW5nLCBNYXA+IHBhcmFtdGVycyA9IGNyZWF0ZU1hcEZyb21ZYW1sKGZpbGVQYXlsb2FkLmdldChkZWNvZGVkUGF5bG9hZCkpOworCisJCS8vIGNvbXBhcmUgTUFQcworCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFbGVtZW50cyhtYXBPZkFjdHVhbFBhcmFtZXRlcnMsIHBhcmFtdGVycyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdUeXBlUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBzZWxlY3QgZmlsZSB0byB1cGxvYWQKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVQYXlsb2FkID0gc2VsZWN0RmlsZVRvVXBsb2FkKHBhdGhUb0ZpbGUsIGhlYXRXaXRoUGFyYW1zTWlzc2luZ1R5cGUpOworCisJCS8vIHVwbG9hZCBIRUFUIGZpbGUgYW5kIHNhdmUgSlNPTiByZXNwb25zZQorCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChmaWxlUGF5bG9hZC5nZXQoZW5jb2RlZFBheWxvYWQpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgKKwkJCQkicmVzcG9uc2UgY29kZSBpcyBub3QgNDAwLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSA0MDApOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWYWx1ZVBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHVwZGF0ZVZhbHVlUGFyYW0gPSAiY2hhbmdlZCI7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBmaWxlUGF5bG9hZCA9IHNlbGVjdEZpbGVUb1VwbG9hZChwYXRoVG9GaWxlLCBoZWF0V2l0aFZhbGlkUGFyYW1zKTsKKworCQkvLyB1cGxvYWQgSEVBVCBmaWxlIGFuZCBzYXZlIEpTT04gcmVzcG9uc2UKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldFBheWxvYWQoZmlsZVBheWxvYWQuZ2V0KGVuY29kZWRQYXlsb2FkKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKAorCQkJCWhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkudG9TdHJpbmcoKSk7CisJCVN0cmluZyBhdGlmYWN0VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpLCAidW5pcXVlSWQiKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY0phdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0QXJ0aWZhY3RSZXFEZXRhaWxzVG9KYXZhT2JqZWN0KGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzMiA9IGFydGlmYWNKYXZhT2JqZWN0LmdldEhlYXRQYXJhbWV0ZXJzKCk7CisKKwkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiA6IGhlYXRQYXJhbWV0ZXJzMikgeworCQkJaGVhdFBhcmFtZXRlckRlZmluaXRpb24uc2V0Q3VycmVudFZhbHVlKHVwZGF0ZVZhbHVlUGFyYW0pOworCQl9CisJCWFydGlmYWNKYXZhT2JqZWN0LnNldEhlYXRQYXJhbWV0ZXJzKGhlYXRQYXJhbWV0ZXJzMik7CisJCWFydGlmYWNKYXZhT2JqZWN0LnNldFBheWxvYWREYXRhKG51bGwpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZSgKKwkJCQlhcnRpZmFjSmF2YU9iamVjdCwgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIHZlcmlmeSBjaGFuZ2UgaW4gdXBkYXRlIHJlc3BvbnNlCisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIEFydGlmYWN0RGVmaW5pdGlvblJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlVG9KYXZhT2JqZWN0KHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzID0gQXJ0aWZhY3REZWZpbml0aW9uUmVzcEphdmFPYmplY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiA6IGhlYXRQYXJhbWV0ZXJzKSB7CisJCQlTdHJpbmcgdmVyaWZ5ID0gdXBkYXRlVmFsdWVQYXJhbTsKKwkJCUFzc2VydEpVbml0LmFzc2VydFRydWUoInZlcmlmaWNhdGlvbiBmYWlsZWQiLCB2ZXJpZnkuZXF1YWxzKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldEN1cnJlbnRWYWx1ZSgpKSk7CisJCX0KKworCQkvLyB2ZXJpZnkgY2hhbmdlIGluIGdldFJlc291cmNlCisKKwkJcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlkZXBsb3ltZW50QXJ0aWZhY3RzLmdldChoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiA6IGhlYXRQYXJhbWV0ZXJzKSB7CisJCQlTdHJpbmcgdmVyaWZ5ID0gdXBkYXRlVmFsdWVQYXJhbTsKKwkJCUFzc2VydEpVbml0LmFzc2VydFRydWUoInZlcmlmaWNhdGlvbiBmYWlsZWQiLCB2ZXJpZnkuZXF1YWxzKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldEN1cnJlbnRWYWx1ZSgpKSk7CisJCX0KKworCQkvLyBjcmVhdGUgTUFQIGZyb20gcmVjZWl2ZWQgSlNPTgorCisJCVN0cmluZyBzZWN0aW9uMmV4dHJhY3QgPSAiaGVhdFBhcmFtZXRlcnMiOworCQlTdHJpbmcgY3JlYXRlS2V5TWFwQnkgPSAibmFtZSI7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IG1hcE9mQWN0dWFsUGFyYW1ldGVycyA9IGpzb25Ub01hcChhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLAorCQkJCXNlY3Rpb24yZXh0cmFjdCwgY3JlYXRlS2V5TWFwQnkpOworCisJCS8vIFByZXBhcmUgbWFwIHRvIHZhbGlkYXRlIEpTCisKKwkJTWFwPFN0cmluZywgTWFwPiBwYXJhbXRlcnMgPSBjcmVhdGVNYXBGcm9tWWFtbChmaWxlUGF5bG9hZC5nZXQoZGVjb2RlZFBheWxvYWQpKTsKKworCQkvLyBjb21wYXJlIE1BUHMKKworCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy5jb21wYXJlRWxlbWVudHMobWFwT2ZBY3R1YWxQYXJhbWV0ZXJzLCBwYXJhbXRlcnMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWYWx1ZVBhcmFtTWlzc2luZ0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgdXBkYXRlVmFsdWVQYXJhbSA9ICJjaGFuZ2VkIjsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVQYXlsb2FkID0gc2VsZWN0RmlsZVRvVXBsb2FkKHBhdGhUb0ZpbGUsIGhlYXRXaXRoUGFyYW1zTWlzc2luZ0RlZmF1bHQpOworCisJCS8vIHVwbG9hZCBIRUFUIGZpbGUgYW5kIHNhdmUgSlNPTiByZXNwb25zZQorCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChmaWxlUGF5bG9hZC5nZXQoZW5jb2RlZFBheWxvYWQpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKS50b1N0cmluZygpKTsKKwkJU3RyaW5nIGF0aWZhY3RVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCksICJ1bmlxdWVJZCIpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdFJlcURldGFpbHNUb0phdmFPYmplY3QoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMyID0gYXJ0aWZhY0phdmFPYmplY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIDogaGVhdFBhcmFtZXRlcnMyKSB7CisJCQloZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5zZXRDdXJyZW50VmFsdWUodXBkYXRlVmFsdWVQYXJhbSk7CisJCX0KKwkJYXJ0aWZhY0phdmFPYmplY3Quc2V0SGVhdFBhcmFtZXRlcnMoaGVhdFBhcmFtZXRlcnMyKTsKKwkJYXJ0aWZhY0phdmFPYmplY3Quc2V0UGF5bG9hZERhdGEobnVsbCk7CisKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKAorCQkJCWFydGlmYWNKYXZhT2JqZWN0LCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJLy8gdmVyaWZ5IGNoYW5nZSBpbiB1cGRhdGUgcmVzcG9uc2UKKworCQlBcnRpZmFjdERlZmluaXRpb24gQXJ0aWZhY3REZWZpbml0aW9uUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QodXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMgPSBBcnRpZmFjdERlZmluaXRpb25SZXNwSmF2YU9iamVjdC5nZXRIZWF0UGFyYW1ldGVycygpOworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIDogaGVhdFBhcmFtZXRlcnMpIHsKKwkJCVN0cmluZyB2ZXJpZnkgPSB1cGRhdGVWYWx1ZVBhcmFtOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgidmVyaWZpY2F0aW9uIGZhaWxlZCIsIHZlcmlmeS5lcXVhbHMoaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCkpKTsKKwkJfQorCisJCS8vIHZlcmlmeSBjaGFuZ2UgaW4gZ2V0UmVzb3VyY2UKKworCQlyZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIDogaGVhdFBhcmFtZXRlcnMpIHsKKwkJCVN0cmluZyB2ZXJpZnkgPSB1cGRhdGVWYWx1ZVBhcmFtOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgidmVyaWZpY2F0aW9uIGZhaWxlZCIsIHZlcmlmeS5lcXVhbHMoaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCkpKTsKKwkJfQorCisJCS8vIGNyZWF0ZSBNQVAgZnJvbSByZWNlaXZlZCBKU09OCisKKwkJU3RyaW5nIHNlY3Rpb24yZXh0cmFjdCA9ICJoZWF0UGFyYW1ldGVycyI7CisJCVN0cmluZyBjcmVhdGVLZXlNYXBCeSA9ICJuYW1lIjsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gbWFwT2ZBY3R1YWxQYXJhbWV0ZXJzID0ganNvblRvTWFwKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UsCisJCQkJc2VjdGlvbjJleHRyYWN0LCBjcmVhdGVLZXlNYXBCeSk7CisKKwkJLy8gUHJlcGFyZSBtYXAgdG8gdmFsaWRhdGUgSlMKKworCQlNYXA8U3RyaW5nLCBNYXA+IHBhcmFtdGVycyA9IGNyZWF0ZU1hcEZyb21ZYW1sKGZpbGVQYXlsb2FkLmdldChkZWNvZGVkUGF5bG9hZCkpOworCisJCS8vIGNvbXBhcmUgTUFQcworCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFbGVtZW50cyhtYXBPZkFjdHVhbFBhcmFtZXRlcnMsIHBhcmFtdGVycyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVZhbHVlUGFyYW1OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHVwZGF0ZVZhbHVlUGFyYW0gPSBudWxsOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZmlsZVBheWxvYWQgPSBzZWxlY3RGaWxlVG9VcGxvYWQocGF0aFRvRmlsZSwgaGVhdFdpdGhWYWxpZFBhcmFtcyk7CisKKwkJLy8gdXBsb2FkIEhFQVQgZmlsZSBhbmQgc2F2ZSBKU09OIHJlc3BvbnNlCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChmaWxlUGF5bG9hZC5nZXQoZW5jb2RlZFBheWxvYWQpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKS50b1N0cmluZygpKTsKKwkJU3RyaW5nIGF0aWZhY3RVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCksICJ1bmlxdWVJZCIpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdFJlcURldGFpbHNUb0phdmFPYmplY3QoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMyID0gYXJ0aWZhY0phdmFPYmplY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIDogaGVhdFBhcmFtZXRlcnMyKSB7CisJCQloZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5zZXRDdXJyZW50VmFsdWUodXBkYXRlVmFsdWVQYXJhbSk7CisJCX0KKwkJYXJ0aWZhY0phdmFPYmplY3Quc2V0SGVhdFBhcmFtZXRlcnMoaGVhdFBhcmFtZXRlcnMyKTsKKwkJYXJ0aWZhY0phdmFPYmplY3Quc2V0UGF5bG9hZERhdGEobnVsbCk7CisKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKAorCQkJCWFydGlmYWNKYXZhT2JqZWN0LCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJLy8gdmVyaWZ5IGNoYW5nZSBpbiB1cGRhdGUgcmVzcG9uc2UKKwkJQXJ0aWZhY3REZWZpbml0aW9uIEFydGlmYWN0RGVmaW5pdGlvblJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlVG9KYXZhT2JqZWN0KHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzID0gQXJ0aWZhY3REZWZpbml0aW9uUmVzcEphdmFPYmplY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiA6IGhlYXRQYXJhbWV0ZXJzKSB7CisJCQkvLyBTdHJpbmcgdmVyaWZ5ID0gdXBkYXRlVmFsdWVQYXJhbTsKKwkJCWlmIChoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7CisJCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgKKwkJCQkJCWhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscyhoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlBc3NlcnRKVW5pdC5hc3NlcnROdWxsKCJ2ZXJpZmljYXRpb24gZmFpbGVkIiwgaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJLy8gdmVyaWZ5IGNoYW5nZSBpbiBnZXRSZXNvdXJjZQorCQlyZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIDogaGVhdFBhcmFtZXRlcnMpIHsKKwkJCS8vIFN0cmluZyB2ZXJpZnkgPSB1cGRhdGVWYWx1ZVBhcmFtOworCQkJaWYgKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKKwkJCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKAorCQkJCQkJaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldEN1cnJlbnRWYWx1ZSgpKSk7CisJCQl9IGVsc2UgeworCQkJCUFzc2VydEpVbml0LmFzc2VydE51bGwoInZlcmlmaWNhdGlvbiBmYWlsZWQiLCBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSk7CisJCQl9CisJCX0KKworCQkvLyBjcmVhdGUgTUFQIGZyb20gcmVjZWl2ZWQgSlNPTgorCQlTdHJpbmcgc2VjdGlvbjJleHRyYWN0ID0gImhlYXRQYXJhbWV0ZXJzIjsKKwkJU3RyaW5nIGNyZWF0ZUtleU1hcEJ5ID0gIm5hbWUiOworCQlNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiBtYXBPZkFjdHVhbFBhcmFtZXRlcnMgPSBqc29uVG9NYXAoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSwKKwkJCQlzZWN0aW9uMmV4dHJhY3QsIGNyZWF0ZUtleU1hcEJ5KTsKKworCQkvLyBQcmVwYXJlIG1hcCB0byB2YWxpZGF0ZSBKUworCQlNYXA8U3RyaW5nLCBNYXA+IHBhcmFtdGVycyA9IGNyZWF0ZU1hcEZyb21ZYW1sKGZpbGVQYXlsb2FkLmdldChkZWNvZGVkUGF5bG9hZCkpOworCisJCS8vIGNvbXBhcmUgTUFQcworCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy5jb21wYXJlRWxlbWVudHMobWFwT2ZBY3R1YWxQYXJhbWV0ZXJzLCBwYXJhbXRlcnMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWYWx1ZVBhcmFtRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgdXBkYXRlVmFsdWVQYXJhbSA9ICIiOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZmlsZVBheWxvYWQgPSBzZWxlY3RGaWxlVG9VcGxvYWQocGF0aFRvRmlsZSwgaGVhdFdpdGhWYWxpZFBhcmFtcyk7CisKKwkJLy8gdXBsb2FkIEhFQVQgZmlsZSBhbmQgc2F2ZSBKU09OIHJlc3BvbnNlCisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKGZpbGVQYXlsb2FkLmdldChlbmNvZGVkUGF5bG9hZCkpOworCisJCVJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSgKKwkJCQloZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpLnRvU3RyaW5nKCkpOworCQlTdHJpbmcgYXRpZmFjdFVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgInVuaXF1ZUlkIik7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWNKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydEFydGlmYWN0UmVxRGV0YWlsc1RvSmF2YU9iamVjdChhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVyczIgPSBhcnRpZmFjSmF2YU9iamVjdC5nZXRIZWF0UGFyYW1ldGVycygpOworCisJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtZXRlckRlZmluaXRpb24gOiBoZWF0UGFyYW1ldGVyczIpIHsKKwkJCWhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLnNldEN1cnJlbnRWYWx1ZSh1cGRhdGVWYWx1ZVBhcmFtKTsKKwkJfQorCQlhcnRpZmFjSmF2YU9iamVjdC5zZXRIZWF0UGFyYW1ldGVycyhoZWF0UGFyYW1ldGVyczIpOworCQlhcnRpZmFjSmF2YU9iamVjdC5zZXRQYXlsb2FkRGF0YShudWxsKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZURlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJYXJ0aWZhY0phdmFPYmplY3QsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQkvLyB2ZXJpZnkgY2hhbmdlIGluIHVwZGF0ZSByZXNwb25zZQorCisJCUFydGlmYWN0RGVmaW5pdGlvbiBBcnRpZmFjdERlZmluaXRpb25SZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdERlZmluaXRpb25SZXNwb25zZVRvSmF2YU9iamVjdCh1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVycyA9IEFydGlmYWN0RGVmaW5pdGlvblJlc3BKYXZhT2JqZWN0LmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtZXRlckRlZmluaXRpb24gOiBoZWF0UGFyYW1ldGVycykgeworCQkJU3RyaW5nIHZlcmlmeSA9IHVwZGF0ZVZhbHVlUGFyYW07CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJ2ZXJpZmljYXRpb24gZmFpbGVkIiwgdmVyaWZ5LmVxdWFscyhoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSkpOworCQl9CisKKwkJLy8gdmVyaWZ5IGNoYW5nZSBpbiBnZXRSZXNvdXJjZQorCisJCXJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCisJCVJlc291cmNlIHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHMgPSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJZGVwbG95bWVudEFydGlmYWN0cy5nZXQoaGVhdEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtZXRlckRlZmluaXRpb24gOiBoZWF0UGFyYW1ldGVycykgeworCQkJU3RyaW5nIHZlcmlmeSA9IHVwZGF0ZVZhbHVlUGFyYW07CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJ2ZXJpZmljYXRpb24gZmFpbGVkIiwgdmVyaWZ5LmVxdWFscyhoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSkpOworCQl9CisKKwkJLy8gY3JlYXRlIE1BUCBmcm9tIHJlY2VpdmVkIEpTT04KKwkJU3RyaW5nIHNlY3Rpb24yZXh0cmFjdCA9ICJoZWF0UGFyYW1ldGVycyI7CisJCVN0cmluZyBjcmVhdGVLZXlNYXBCeSA9ICJuYW1lIjsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gbWFwT2ZBY3R1YWxQYXJhbWV0ZXJzID0ganNvblRvTWFwKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UsCisJCQkJc2VjdGlvbjJleHRyYWN0LCBjcmVhdGVLZXlNYXBCeSk7CisKKwkJLy8gUHJlcGFyZSBtYXAgdG8gdmFsaWRhdGUgSlMKKwkJTWFwPFN0cmluZywgTWFwPiBwYXJhbXRlcnMgPSBjcmVhdGVNYXBGcm9tWWFtbChmaWxlUGF5bG9hZC5nZXQoZGVjb2RlZFBheWxvYWQpKTsKKworCQkvLyBjb21wYXJlIE1BUHMKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUVsZW1lbnRzKG1hcE9mQWN0dWFsUGFyYW1ldGVycywgcGFyYW10ZXJzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgb25seVZhbHVlUGFyYW1QZXJtaXRlZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZmlsZVBheWxvYWQgPSBzZWxlY3RGaWxlVG9VcGxvYWQocGF0aFRvRmlsZSwgaGVhdFdpdGhWYWxpZFBhcmFtcyk7CisKKwkJLy8gdXBsb2FkIEhFQVQgZmlsZSBhbmQgc2F2ZSBKU09OIHJlc3BvbnNlCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXRBcnRpZmFjdERldGFpbHMuc2V0UGF5bG9hZChmaWxlUGF5bG9hZC5nZXQoZW5jb2RlZFBheWxvYWQpKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKS50b1N0cmluZygpKTsKKwkJU3RyaW5nIGF0aWZhY3RVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLmdldFJlc3BvbnNlKCksICJ1bmlxdWVJZCIpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdFJlcURldGFpbHNUb0phdmFPYmplY3QoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMyID0gYXJ0aWZhY0phdmFPYmplY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIDogaGVhdFBhcmFtZXRlcnMyKSB7CisJCQloZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoImNoYW5nZWQiKTsKKwkJCWhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLnNldE5hbWUoImNoYW5nZWQiKTsKKwkJCWhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLnNldERlc2NyaXB0aW9uKCJjaGFuZ2VkIik7CisJCQloZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5zZXRUeXBlKCJjaGFuZ2VkIik7CisJCQloZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5zZXRDdXJyZW50VmFsdWUoImNoYW5nZWQiKTsKKwkJfQorCQlhcnRpZmFjSmF2YU9iamVjdC5zZXRIZWF0UGFyYW1ldGVycyhoZWF0UGFyYW1ldGVyczIpOworCQlhcnRpZmFjSmF2YU9iamVjdC5zZXRQYXlsb2FkRGF0YShudWxsKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLnVwZGF0ZURlcGxveW1lbnRBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJYXJ0aWZhY0phdmFPYmplY3QsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlyZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKworCQkvLyBjcmVhdGUgTUFQIGZyb20gcmVjZWl2ZWQgSlNPTgorCisJCVN0cmluZyBzZWN0aW9uMmV4dHJhY3QgPSAiaGVhdFBhcmFtZXRlcnMiOworCQlTdHJpbmcgY3JlYXRlS2V5TWFwQnkgPSAibmFtZSI7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IG1hcE9mQWN0dWFsUGFyYW1ldGVycyA9IGpzb25Ub01hcChhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlLAorCQkJCXNlY3Rpb24yZXh0cmFjdCwgY3JlYXRlS2V5TWFwQnkpOworCisJCS8vIFByZXBhcmUgbWFwIHRvIHZhbGlkYXRlIEpTCisKKwkJTWFwPFN0cmluZywgTWFwPiBwYXJhbXRlcnMgPSBjcmVhdGVNYXBGcm9tWWFtbChmaWxlUGF5bG9hZC5nZXQoZGVjb2RlZFBheWxvYWQpKTsKKworCQkvLyBjb21wYXJlIE1BUHMKKworCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy5jb21wYXJlRWxlbWVudHMobWFwT2ZBY3R1YWxQYXJhbWV0ZXJzLCBwYXJhbXRlcnMpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvVmFsaWRhdGVIZWF0QXJ0RmllbGRzRnJvbVVJLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hcnRpZmFjdHMvVmFsaWRhdGVIZWF0QXJ0RmllbGRzRnJvbVVJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyZGNiOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2FydGlmYWN0cy9WYWxpZGF0ZUhlYXRBcnRGaWVsZHNGcm9tVUkuamF2YQpAQCAtMCwwICsxLDQ0NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuYXJ0aWZhY3RzOworCisvLworLy9pbXBvcnQgamF2YS51dGlsLkFycmF5czsKKy8vaW1wb3J0IGphdmEudXRpbC5MaXN0OworLy8KKy8vaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworLy9pbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworLy9pbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKKy8vaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKy8vCisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSGVhdFBhcmFtZXRlckRlZmluaXRpb247CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzcEpzb25LZXlzRW51bTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnByZVJlcXVpc2l0ZXMuSGVhdEVudkJhc2VUZXN0OworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworLy8KKy8vcHVibGljIGNsYXNzIFZhbGlkYXRlSGVhdEFydEZpZWxkc0Zyb21VSSBleHRlbmRzIEhlYXRFbnZCYXNlVGVzdCB7CitwdWJsaWMgY2xhc3MgVmFsaWRhdGVIZWF0QXJ0RmllbGRzRnJvbVVJIHsKKwkvLworCS8vCisJLy8KKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaGVhdEV4dGVuc2lvbiA9ICJ5YW1sIjsKKwkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgeWFuZ1htbEV4dGVuc2lvbiA9ICJ4bWwiOworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtdXJhbm9Qa2dFeHRlbnNpb24gPSAiemlwIjsKKwkvLyBwcml2YXRlIGZpbmFsIFN0cmluZyBmb2xkZXJOYW1lPSAieWFtbEZpZWxkc1ZhbGlkYXRpb24iOworCS8vCisJLy8KKwkvLyBwcml2YXRlIGZpbmFsIFN0cmluZyB1dWlkU3RyaW5nID0KKwkvLyBSZXNwSnNvbktleXNFbnVtLlVVSUQuZ2V0UmVzcEpzb25LZXlOYW1lKCkudG9TdHJpbmcoKTsKKwkvLworCS8vIHB1YmxpYyBWYWxpZGF0ZUhlYXRBcnRGaWVsZHNGcm9tVUkoKSB7CisJLy8gc3VwZXIobmFtZSwgVmFsaWRhdGVIZWF0QXJ0RmllbGRzRnJvbVVJLmNsYXNzLmdldE5hbWUoKSk7CisJLy8gfQorCS8vCisJLy8gQFJ1bGUKKwkvLyBwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKwkvLworCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBoZWF0RW52VmFsaWRhdGVIZWF0QXJ0RmlsZWRUeXBlc19VcGRhdGVGYWlsZWQoKSB0aHJvd3MKKwkvLyBFeGNlcHRpb24geworCS8vCisJLy8gLy9nZXQgcmVsZXZhbnQgc2VydmljZQorCS8vIFJlc3RSZXNwb25zZSBzZXJ2aWNlR2V0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlsczIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCS8vIFNlcnZpY2Ugc2VydmljZSA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJLy8gTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzb3VyY2VJbnN0YW5jZXMgPQorCS8vIHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJLy8gQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IHJlc291cmNlSW5zdGFuY2VzLmdldCgwKTsKKwkvLworCS8vCisJLy8gU3RyaW5nIGRlZmF1bHRQYXJhbSA9IG51bGw7CisJLy8KKwkvLyAvL3VwZGF0ZSBoZWF0RW52IHdpdGggaW52YWxpZCB2YWx1ZSBpbiBudW1iZXIgZmllbGQKKwkvLworCS8vIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA9IGdldEN1cnJlbnRBcnRpZmFjdERlZmluaXRpb25Gcm9tU2VydmljZSgpOworCS8vIFN0cmluZyBjdXJyZW50SGVhdEVudlBhcmFtQmVmb3JlVXBkYXRlID0gcmVwbGFjZUhlYXRQYXJhbXNWYWx1ZShhcnRpZmFjdCwKKwkvLyAiaG9tZV9udW1iZXIiLCAiVGVsIEF2aXYiKTsKKwkvLyBBcnRpZmFjdFJlcURldGFpbHMgYXJ0UmVxID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uVG9BcnRpZmFjdFJlcURldGFpbHNPYmplY3QoYXJ0aWZhY3QpOworCS8vIFJlc3RSZXNwb25zZSByZXMgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1JJKGFydFJlcSwKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksCisJLy8gc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkvLworCS8vIC8vIHZhbGlkYXRlIG5lZ2F0aXZlIHJlc3BvbnNlCisJLy8gTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIkhFQVRfRU5WIiwgIm51bWJlciIsCisJLy8gImhvbWVfbnVtYmVyIik7CisJLy8gRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0hFQVRfUEFSQU1FVEVSX1ZBTFVFLm5hbWUoKSwKKwkvLyB2YXJpYWJsZXMsIHJlcy5nZXRSZXNwb25zZSgpKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgY3VycmVudCB2YWx1ZSBub3QgYWZmZWN0ZWQKKwkvLyBhcnRpZmFjdCA9IGdldEN1cnJlbnRBcnRpZmFjdERlZmluaXRpb25Gcm9tU2VydmljZSgpOworCS8vIFN0cmluZyBjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXJVcGRhdGUgPSBnZXRIZWF0UGFyYW1zVmFsdWUoYXJ0aWZhY3QsCisJLy8gImhvbWVfbnVtYmVyIik7CisJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiSGVhdEVudlBhcmFtIHdhcyBub3QgdXBkYXRlZDogIiArCisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZVVwZGF0ZSwKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQmVmb3JlVXBkYXRlLmVxdWFscyhjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXJVcGRhdGUpKTsKKwkvLworCS8vIC8vdXBkYXRlIGhlYXRFbnYgd2l0aCBpbnZhbGlkIHZhbHVlIGluIGJvb2xlYW4gZmllbGQKKwkvLworCS8vIGFydGlmYWN0ID0gZ2V0Q3VycmVudEFydGlmYWN0RGVmaW5pdGlvbkZyb21TZXJ2aWNlKCk7CisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZVVwZGF0ZSA9IHJlcGxhY2VIZWF0UGFyYW1zVmFsdWUoYXJ0aWZhY3QsCisJLy8gInByaXZhdGVfYnVpbGRpbmciLCAiVGVsIEF2aXYiKTsKKwkvLyBhcnRSZXEgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRBcnRpZmFjdERlZmluaXRpb25Ub0FydGlmYWN0UmVxRGV0YWlsc09iamVjdChhcnRpZmFjdCk7CisJLy8gcmVzID0gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlRGVwbG95bWVudEFydGlmYWN0VG9SSShhcnRSZXEsCisJLy8gc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLAorCS8vIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJLy8KKwkvLyAvLyB2YWxpZGF0ZSBuZWdhdGl2ZSByZXNwb25zZQorCS8vIHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIkhFQVRfRU5WIiwgImJvb2xlYW4iLCAicHJpdmF0ZV9idWlsZGluZyIpOworCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9WQUxVRS5uYW1lKCksCisJLy8gdmFyaWFibGVzLCByZXMuZ2V0UmVzcG9uc2UoKSk7CisJLy8KKwkvLyAvL3ZhbGlkYXRlIGN1cnJlbnQgdmFsdWUgbm90IGFmZmVjdGVkCisJLy8gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVNlcnZpY2UoKTsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXJVcGRhdGUgPSBnZXRIZWF0UGFyYW1zVmFsdWUoYXJ0aWZhY3QsCisJLy8gInByaXZhdGVfYnVpbGRpbmciKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJIZWF0RW52UGFyYW0gd2FzIG5vdCB1cGRhdGVkOiAiICsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQmVmb3JlVXBkYXRlLAorCS8vIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmVVcGRhdGUuZXF1YWxzKGN1cnJlbnRIZWF0RW52UGFyYW1BZnRlclVwZGF0ZSkpOworCS8vCisJLy8KKwkvLworCS8vCisJLy8gLy91cGRhdGUgaGVhdEVudiB3aXRoIGludmFsaWQgdmFsdWUgaW4gYm9vbGVhbiBmaWVsZAorCS8vCisJLy8gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVNlcnZpY2UoKTsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQmVmb3JlVXBkYXRlID0gcmVwbGFjZUhlYXRQYXJhbXNWYWx1ZShhcnRpZmFjdCwKKwkvLyAiY2l0eV9uYW1lIiwgIlx1QzJCNSIpOworCS8vIGFydFJlcSA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblRvQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KGFydGlmYWN0KTsKKwkvLyByZXMgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1JJKGFydFJlcSwKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksCisJLy8gc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkvLyAvLyB2YWxpZGF0ZSBuZWdhdGl2ZSByZXNwb25zZQorCS8vIHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIkhFQVRfRU5WIiwgInN0cmluZyIsICJjaXR5X25hbWUiKTsKKwkvLyBFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfSEVBVF9QQVJBTUVURVJfVkFMVUUubmFtZSgpLAorCS8vIHZhcmlhYmxlcywgcmVzLmdldFJlc3BvbnNlKCkpOworCS8vCisJLy8gLy92YWxpZGF0ZSBjdXJyZW50IHZhbHVlIG5vdCBhZmZlY3RlZAorCS8vCisJLy8gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVNlcnZpY2UoKTsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXJVcGRhdGUgPSBnZXRIZWF0UGFyYW1zVmFsdWUoYXJ0aWZhY3QsCisJLy8gImNpdHlfbmFtZSIpOworCS8vIEFzc2VydEpVbml0LmFzc2VydFRydWUoIkhlYXRFbnZQYXJhbSB3YXMgbm90IHVwZGF0ZWQ6ICIgKworCS8vIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmVVcGRhdGUsCisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZVVwZGF0ZS5lcXVhbHMoY3VycmVudEhlYXRFbnZQYXJhbUFmdGVyVXBkYXRlKSk7CisJLy8gfQorCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBoZWF0VmFsaWRhdGVIZWF0QXJ0RmlsZWRUeXBlc19VcGRhdGVGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uCisJLy8geworCS8vCisJLy8KKwkvLyBSZXN0UmVzcG9uc2UgY2hlY2tPdXRSZXNwb25zZSA9CisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VTQywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkvLyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkOiAiICsKKwkvLyBjaGVja091dFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLGNoZWNrT3V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkvLyAvL2dldCByZWxldmFudCBzZXJ2aWNlCisJLy8gUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPQorCS8vIFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlU0MsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCS8vIFJlc291cmNlIHJlc291cmNlID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCS8vCisJLy8gLy91cGRhdGUgaGVhdEVudiB3aXRoIGludmFsaWQgdmFsdWUgaW4gbnVtYmVyIGZpZWxkCisJLy8KKwkvLyBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVJlc291cmNlKCk7CisJLy8gU3RyaW5nIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmVVcGRhdGUgPSByZXBsYWNlSGVhdFBhcmFtc1ZhbHVlKGFydGlmYWN0LAorCS8vICJob21lX251bWJlciIsICJUZWwgQXZpdiIpOworCS8vIEFydGlmYWN0UmVxRGV0YWlscyBhcnRSZXEgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRBcnRpZmFjdERlZmluaXRpb25Ub0FydGlmYWN0UmVxRGV0YWlsc09iamVjdChhcnRpZmFjdCk7CisJLy8gUmVzdFJlc3BvbnNlIHJlcyA9CisJLy8gQXJ0aWZhY3RSZXN0VXRpbHMudXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShhcnRSZXEsCisJLy8gc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJLy8gLy8gdmFsaWRhdGUgbmVnYXRpdmUgcmVzcG9uc2UKKwkvLyBMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiSEVBVCIsICJudW1iZXIiLCAiaG9tZV9udW1iZXIiKTsKKwkvLyBFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfSEVBVF9QQVJBTUVURVJfVkFMVUUubmFtZSgpLAorCS8vIHZhcmlhYmxlcywgcmVzLmdldFJlc3BvbnNlKCkpOworCS8vCisJLy8gLy92YWxpZGF0ZSBjdXJyZW50IHZhbHVlIG5vdCBhZmZlY3RlZAorCS8vCisJLy8gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVJlc291cmNlKCk7CisJLy8gU3RyaW5nIGN1cnJlbnRIZWF0RW52UGFyYW1BZnRlclVwZGF0ZSA9IGdldEhlYXRQYXJhbXNWYWx1ZShhcnRpZmFjdCwKKwkvLyAiaG9tZV9udW1iZXIiKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJIZWF0RW52UGFyYW0gd2FzIG5vdCB1cGRhdGVkOiAiICsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQmVmb3JlVXBkYXRlLAorCS8vIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmVVcGRhdGUuZXF1YWxzKGN1cnJlbnRIZWF0RW52UGFyYW1BZnRlclVwZGF0ZSkpOworCS8vCisJLy8KKwkvLyAvL3VwZGF0ZSBoZWF0RW52IHdpdGggaW52YWxpZCB2YWx1ZSBpbiBib29sZWFuIGZpZWxkCisJLy8KKwkvLyBhcnRpZmFjdCA9IGdldEN1cnJlbnRBcnRpZmFjdERlZmluaXRpb25Gcm9tUmVzb3VyY2UoKTsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQmVmb3JlVXBkYXRlID0gcmVwbGFjZUhlYXRQYXJhbXNWYWx1ZShhcnRpZmFjdCwKKwkvLyAicHJpdmF0ZV9idWlsZGluZyIsICJUZWwgQXZpdiIpOworCS8vIGFydFJlcSA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblRvQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KGFydGlmYWN0KTsKKwkvLyByZXMgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGFydFJlcSwKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkvLyAvLyB2YWxpZGF0ZSBuZWdhdGl2ZSByZXNwb25zZQorCS8vIHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIkhFQVQiLCAiYm9vbGVhbiIsICJwcml2YXRlX2J1aWxkaW5nIik7CisJLy8gRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0hFQVRfUEFSQU1FVEVSX1ZBTFVFLm5hbWUoKSwKKwkvLyB2YXJpYWJsZXMsIHJlcy5nZXRSZXNwb25zZSgpKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgY3VycmVudCB2YWx1ZSBub3QgYWZmZWN0ZWQKKwkvLworCS8vIGFydGlmYWN0ID0gZ2V0Q3VycmVudEFydGlmYWN0RGVmaW5pdGlvbkZyb21SZXNvdXJjZSgpOworCS8vCisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUFmdGVyVXBkYXRlID0gZ2V0SGVhdFBhcmFtc1ZhbHVlKGFydGlmYWN0LAorCS8vICJwcml2YXRlX2J1aWxkaW5nIik7CisJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiSGVhdEVudlBhcmFtIHdhcyBub3QgdXBkYXRlZDogIiArCisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZVVwZGF0ZSwKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQmVmb3JlVXBkYXRlLmVxdWFscyhjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXJVcGRhdGUpKTsKKwkvLworCS8vCisJLy8gLy91cGRhdGUgaGVhdEVudiB3aXRoIGludmFsaWQgdmFsdWUgaW4gYm9vbGVhbiBmaWVsZAorCS8vCisJLy8gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVJlc291cmNlKCk7CisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZVVwZGF0ZSA9IHJlcGxhY2VIZWF0UGFyYW1zVmFsdWUoYXJ0aWZhY3QsCisJLy8gImNpdHlfbmFtZSIsICJcdUMyQjUiKTsKKwkvLworCS8vIGFydFJlcSA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblRvQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KGFydGlmYWN0KTsKKwkvLyByZXMgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1Jlc291cmNlKGFydFJlcSwKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkvLyAvLyB2YWxpZGF0ZSBuZWdhdGl2ZSByZXNwb25zZQorCS8vIHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIkhFQVQiLCAic3RyaW5nIiwgImNpdHlfbmFtZSIpOworCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9WQUxVRS5uYW1lKCksCisJLy8gdmFyaWFibGVzLCByZXMuZ2V0UmVzcG9uc2UoKSk7CisJLy8KKwkvLyAvL3ZhbGlkYXRlIGN1cnJlbnQgdmFsdWUgbm90IGFmZmVjdGVkCisJLy8KKwkvLyBhcnRpZmFjdCA9IGdldEN1cnJlbnRBcnRpZmFjdERlZmluaXRpb25Gcm9tUmVzb3VyY2UoKTsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXJVcGRhdGUgPSBnZXRIZWF0UGFyYW1zVmFsdWUoYXJ0aWZhY3QsCisJLy8gImNpdHlfbmFtZSIpOworCS8vIEFzc2VydEpVbml0LmFzc2VydFRydWUoIkhlYXRFbnZQYXJhbSB3YXMgbm90IHVwZGF0ZWQ6ICIgKworCS8vIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmVVcGRhdGUsCisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZVVwZGF0ZS5lcXVhbHMoY3VycmVudEhlYXRFbnZQYXJhbUFmdGVyVXBkYXRlKSk7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIGhlYXRFbnZWYWxpZGF0ZUhlYXRBcnRGaWxlZFR5cGVzX2Jvb2xOb3JtYWxpemF0aW9uX3N1YygpCisJLy8gdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8KKwkvLyAvL2dldCByZWxldmFudCBzZXJ2aWNlCisJLy8gUmVzdFJlc3BvbnNlIHNlcnZpY2VHZXRSZXNwb25zZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzMiwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJLy8gU2VydmljZSBzZXJ2aWNlID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLyBMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNvdXJjZUluc3RhbmNlcyA9CisJLy8gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkvLyBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlID0gcmVzb3VyY2VJbnN0YW5jZXMuZ2V0KDApOworCS8vCisJLy8gU3RyaW5nIGRlZmF1bHRQYXJhbSA9IG51bGw7CisJLy8gU3RyaW5nIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmUgPSBudWxsOworCS8vIFN0cmluZyBjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXIgPSBudWxsOworCS8vCisJLy8KKwkvLyBMaXN0PFN0cmluZz4gbGlzdE9mQm9vbFZhbHVlc1RvVmFsaWRhdGUgPSBBcnJheXMuYXNMaXN0KCJUIiwgIm9uIiwgIjEiLAorCS8vICJ5ZXMiLCAieSIpOworCS8vCisJLy8gZm9yIChTdHJpbmcgZWxlbWVudCA6IGxpc3RPZkJvb2xWYWx1ZXNUb1ZhbGlkYXRlKSB7CisJLy8KKwkvLyAvL3VwZGF0ZSBoZWF0RW52IHdpdGggaW52YWxpZCB2YWx1ZSBpbiBib29sZWFuIGZpZWxkCisJLy8KKwkvLyBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVNlcnZpY2UoKTsKKwkvLyBMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVycyA9CisJLy8gYXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkvLyBmb3IoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcGFyYW0gOiBoZWF0UGFyYW1ldGVycyl7CisJLy8gaWYgKHBhcmFtLmdldE5hbWUoKS5lcXVhbHMoInByaXZhdGVfYnVpbGRpbmciKSl7CisJLy8gZGVmYXVsdFBhcmFtID0gcGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCk7CisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZSA9IHBhcmFtLmdldEN1cnJlbnRWYWx1ZSgpOworCS8vIHBhcmFtLnNldEN1cnJlbnRWYWx1ZShlbGVtZW50KTsKKwkvLyB9CisJLy8gfQorCS8vIGFydGlmYWN0LnNldEhlYXRQYXJhbWV0ZXJzKGhlYXRQYXJhbWV0ZXJzKTsKKwkvLyBBcnRpZmFjdFJlcURldGFpbHMgYXJ0UmVxID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uVG9BcnRpZmFjdFJlcURldGFpbHNPYmplY3QoYXJ0aWZhY3QpOworCS8vIFJlc3RSZXNwb25zZSByZXMgPSBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1JJKGFydFJlcSwKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksCisJLy8gc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkOiAiICsKKwkvLyByZXMuZ2V0RXJyb3JDb2RlKCksIHJlcy5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCS8vCisJLy8gLy92YWxpZGF0ZSBjdXJyZW50IHZhbHVlIG5vdCBhZmZlY3RlZAorCS8vCisJLy8gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVNlcnZpY2UoKTsKKwkvLyBoZWF0UGFyYW1ldGVycyA9IGFydGlmYWN0LmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJLy8gZm9yKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHBhcmFtIDogaGVhdFBhcmFtZXRlcnMpeworCS8vIGlmIChwYXJhbS5nZXROYW1lKCkuZXF1YWxzKCJwcml2YXRlX2J1aWxkaW5nIikpeworCS8vIGN1cnJlbnRIZWF0RW52UGFyYW1BZnRlciA9IHBhcmFtLmdldEN1cnJlbnRWYWx1ZSgpOworCS8vIH0KKwkvLyB9CisJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiSGVhdEVudlBhcmFtIHdhcyBub3QgdXBkYXRlZDogIiArCisJLy8gY3VycmVudEhlYXRFbnZQYXJhbUJlZm9yZSwgY3VycmVudEhlYXRFbnZQYXJhbUFmdGVyLmVxdWFscygidHJ1ZSIpKTsKKwkvLworCS8vIH0KKwkvLworCS8vIH0KKwkvLworCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBoZWF0VmFsaWRhdGVIZWF0QXJ0RmlsZWRUeXBlc19ib29sTm9ybWFsaXphdGlvbl9zdWMoKSB0aHJvd3MKKwkvLyBFeGNlcHRpb24geworCS8vCisJLy8gUmVzdFJlc3BvbnNlIGNoZWNrT3V0UmVzcG9uc2UgPQorCS8vIExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlU0MsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJLy8gTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZDogIiArCisJLy8gY2hlY2tPdXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSxjaGVja091dFJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJLy8gLy9nZXQgcmVsZXZhbnQgc2VydmljZQorCS8vIFJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0KKwkvLyBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZVNDLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkvLyBSZXNvdXJjZSByZXNvdXJjZSA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLworCS8vCisJLy8gU3RyaW5nIGRlZmF1bHRQYXJhbSA9IG51bGw7CisJLy8gU3RyaW5nIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmUgPSBudWxsOworCS8vIFN0cmluZyBjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXIgPSBudWxsOworCS8vCisJLy8KKwkvLyBMaXN0PFN0cmluZz4gbGlzdE9mQm9vbFZhbHVlc1RvVmFsaWRhdGUgPSBBcnJheXMuYXNMaXN0KCJUIiwgIm9uIiwgIjEiLAorCS8vICJ5ZXMiLCAieSIpOworCS8vCisJLy8gZm9yIChTdHJpbmcgZWxlbWVudCA6IGxpc3RPZkJvb2xWYWx1ZXNUb1ZhbGlkYXRlKSB7CisJLy8KKwkvLyAvL3VwZGF0ZSBoZWF0RW52IHdpdGggaW52YWxpZCB2YWx1ZSBpbiBib29sZWFuIGZpZWxkCisJLy8KKwkvLyBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVJlc291cmNlKCk7CisJLy8gTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMgPQorCS8vIGFydGlmYWN0LmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJLy8gZm9yKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHBhcmFtIDogaGVhdFBhcmFtZXRlcnMpeworCS8vIGlmIChwYXJhbS5nZXROYW1lKCkuZXF1YWxzKCJwcml2YXRlX2J1aWxkaW5nIikpeworCS8vIGRlZmF1bHRQYXJhbSA9IHBhcmFtLmdldERlZmF1bHRWYWx1ZSgpOworCS8vIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmUgPSBwYXJhbS5nZXRDdXJyZW50VmFsdWUoKTsKKwkvLyBwYXJhbS5zZXRDdXJyZW50VmFsdWUoZWxlbWVudCk7CisJLy8gfQorCS8vIH0KKwkvLyBhcnRpZmFjdC5zZXRIZWF0UGFyYW1ldGVycyhoZWF0UGFyYW1ldGVycyk7CisJLy8gQXJ0aWZhY3RSZXFEZXRhaWxzIGFydFJlcSA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblRvQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KGFydGlmYWN0KTsKKwkvLyBSZXN0UmVzcG9uc2UgcmVzID0KKwkvLyBBcnRpZmFjdFJlc3RVdGlscy51cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGFydFJlcSwKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkOiAiICsKKwkvLyByZXMuZ2V0RXJyb3JDb2RlKCksIHJlcy5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCS8vCisJLy8gLy92YWxpZGF0ZSBjdXJyZW50IHZhbHVlIG5vdCBhZmZlY3RlZAorCS8vCisJLy8gYXJ0aWZhY3QgPSBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVJlc291cmNlKCk7CisJLy8gaGVhdFBhcmFtZXRlcnMgPSBhcnRpZmFjdC5nZXRIZWF0UGFyYW1ldGVycygpOworCS8vIGZvcihIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwYXJhbSA6IGhlYXRQYXJhbWV0ZXJzKXsKKwkvLyBpZiAocGFyYW0uZ2V0TmFtZSgpLmVxdWFscygicHJpdmF0ZV9idWlsZGluZyIpKXsKKwkvLyBjdXJyZW50SGVhdEVudlBhcmFtQWZ0ZXIgPSBwYXJhbS5nZXRDdXJyZW50VmFsdWUoKTsKKwkvLyB9CisJLy8gfQorCS8vIEFzc2VydEpVbml0LmFzc2VydFRydWUoIkhlYXRFbnZQYXJhbSB3YXMgbm90IHVwZGF0ZWQ6ICIgKworCS8vIGN1cnJlbnRIZWF0RW52UGFyYW1CZWZvcmUsIGN1cnJlbnRIZWF0RW52UGFyYW1BZnRlci5lcXVhbHMoInRydWUiKSk7CisJLy8KKwkvLyB9CisJLy8KKwkvLyB9CisJLy8KKwkvLworCS8vIHByaXZhdGUgQXJ0aWZhY3REZWZpbml0aW9uIGdldEN1cnJlbnRBcnRpZmFjdERlZmluaXRpb25Gcm9tUmVzb3VyY2UoKQorCS8vIHRocm93cyBFeGNlcHRpb24geworCS8vCisJLy8gUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPQorCS8vIFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlU0MsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCS8vIFJlc291cmNlIHJlc291cmNlID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCS8vCisJLy8gQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9CisJLy8gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmdldCgiaGVhdCIpOworCS8vCisJLy8KKwkvLyByZXR1cm4gYXJ0aWZhY3REZWZpbml0aW9uOworCS8vCisJLy8gfQorCS8vCisJLy8KKwkvLyBwcml2YXRlIEFydGlmYWN0RGVmaW5pdGlvbiBnZXRDdXJyZW50QXJ0aWZhY3REZWZpbml0aW9uRnJvbVNlcnZpY2UoKQorCS8vIHRocm93cyBFeGNlcHRpb24geworCS8vCisJLy8gUmVzdFJlc3BvbnNlIHNlcnZpY2VHZXRSZXNwb25zZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzMiwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJLy8gU2VydmljZSBzZXJ2aWNlID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLyBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCS8vIGFydGlmYWN0RGVmaW5pdGlvbiA9CisJLy8gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCkuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmdldCgiaGVhdGVudiIpOworCS8vCisJLy8KKwkvLyByZXR1cm4gYXJ0aWZhY3REZWZpbml0aW9uOworCS8vCisJLy8gfQorCS8vCisJLy8gcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZUhlYXRQYXJhbXNWYWx1ZShBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QsIFN0cmluZworCS8vIHBhcmFtTmFtZSwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKKwkvLyBTdHJpbmcgZGVmYXVsdFBhcmFtOworCS8vIFN0cmluZyBjdXJyZW50SGVhdEVudlBhcmFtID0gbnVsbDsKKwkvLyBMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVycyA9CisJLy8gYXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkvLyBmb3IoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcGFyYW0gOiBoZWF0UGFyYW1ldGVycyl7CisJLy8gaWYgKHBhcmFtLmdldE5hbWUoKS5lcXVhbHMocGFyYW1OYW1lKSl7CisJLy8gZGVmYXVsdFBhcmFtID0gcGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCk7CisJLy8gY3VycmVudEhlYXRFbnZQYXJhbSA9IHBhcmFtLmdldEN1cnJlbnRWYWx1ZSgpOworCS8vIHBhcmFtLnNldEN1cnJlbnRWYWx1ZShwYXJhbVZhbHVlKTsKKwkvLyB9CisJLy8gfQorCS8vIGFydGlmYWN0LnNldEhlYXRQYXJhbWV0ZXJzKGhlYXRQYXJhbWV0ZXJzKTsKKwkvLyByZXR1cm4gY3VycmVudEhlYXRFbnZQYXJhbTsKKwkvLyB9CisJLy8KKwkvLyBwcml2YXRlIFN0cmluZyBnZXRIZWF0UGFyYW1zVmFsdWUoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0LAorCS8vIFN0cmluZyBwYXJhbU5hbWUpIHsKKwkvLyBMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVycyA9CisJLy8gYXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkvLyBTdHJpbmcgY3VycmVudEhlYXRFbnZQYXJhbVZhbHVlID0gbnVsbDsKKwkvLyBmb3IoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcGFyYW0gOiBoZWF0UGFyYW1ldGVycyl7CisJLy8gaWYgKHBhcmFtLmdldE5hbWUoKS5lcXVhbHMocGFyYW1OYW1lKSl7CisJLy8gY3VycmVudEhlYXRFbnZQYXJhbVZhbHVlID0gcGFyYW0uZ2V0Q3VycmVudFZhbHVlKCk7CisJLy8gfQorCS8vIH0KKwkvLyByZXR1cm4gY3VycmVudEhlYXRFbnZQYXJhbVZhbHVlOworCS8vIH0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2FydGlmYWN0cy9WYWxpZGF0ZUhlYXRBcnRGaWVsZHNUeXBlcy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXJ0aWZhY3RzL1ZhbGlkYXRlSGVhdEFydEZpZWxkc1R5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljZGEwYgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2FydGlmYWN0cy9WYWxpZGF0ZUhlYXRBcnRGaWVsZHNUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNwSnNvbktleXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BcnRpZmFjdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVmFsaWRhdGVIZWF0QXJ0RmllbGRzVHlwZXMgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwcm90ZWN0ZWQgVXNlciBzZG5jRGVzaWduZXJEZXRhaWxzOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlsczsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBoZWF0RXh0ZW5zaW9uID0gInlhbWwiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB5YW5nWG1sRXh0ZW5zaW9uID0gInhtbCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG11cmFub1BrZ0V4dGVuc2lvbiA9ICJ6aXAiOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGZvbGRlck5hbWUgPSAieWFtbEZpZWxkc1ZhbGlkYXRpb24iOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXVpZFN0cmluZyA9IFJlc3BKc29uS2V5c0VudW0uVVVJRC5nZXRSZXNwSnNvbktleU5hbWUoKS50b1N0cmluZygpOworCisJcHVibGljIFZhbGlkYXRlSGVhdEFydEZpZWxkc1R5cGVzKCkgeworCQlzdXBlcihuYW1lLCBWYWxpZGF0ZUhlYXRBcnRGaWVsZHNUeXBlcy5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZhbGlkYXRlSGVhdEFydEZpbGVkVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBnZXQgcmVsZXZhbnQgcmVzb3VyY2UgYW5kIHNlcnZpY2UKKworCQlzZG5jRGVzaWduZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiY3JlYXRlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCisJCS8vIGFkZCBhcnRpZmFjdCB0byByZXNvdXJjZTEKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlMaXN0PFN0cmluZz4gbGlzdE9mQXJ0aWZhY3RGcm9tRm9sZGVyID0gQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMuZ2V0TGlzdE9mQXJ0aWZhY3RGcm9tRm9sZGVyKGZvbGRlck5hbWUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RPZkFydGlmYWN0RnJvbUZvbGRlci5zaXplKCk7IGkrKykgeworCQkJaGVhdEFydGlmYWN0RGV0YWlscyA9IEFydGlmYWN0VmFsaWRhdGlvblV0aWxzLnJlcGxhY2VEZWZhdWx0QXJ0V2l0aEFydEZyb21MaXN0KGhlYXRBcnRpZmFjdERldGFpbHMsCisJCQkJCWhlYXRFeHRlbnNpb24sIGZvbGRlck5hbWUsIGkpOworCQkJcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQkJaWYgKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkuY29udGFpbnMoImJvb2wiKSkgeworCQkJCWlmIChoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLmNvbnRhaW5zKCJuZWdhdGl2ZSIpKSB7CisJCQkJCS8vIHZhbGlkYXRlIG5lZ2F0aXZlIHJlc3BvbnNlCisJCQkJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJIRUFUIiwgImJvb2xlYW4iLCAiY2l0eV9uYW1lIik7CisJCQkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9WQUxVRS5uYW1lKCksCisJCQkJCQkJdmFyaWFibGVzLCByZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJCQl9CisJCQkJaWYgKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkuY29udGFpbnMoInBvc2l0aXZlIikpIHsKKwkJCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgKKwkJCQkJCQkiYWRkIEhFQVQgYXJ0aWZhY3QgdG8gcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpCisJCQkJCQkJCQkrICIgZmlsZU5hbWU6ICIgKyBoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLAorCQkJCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb25KYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkJCQkuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkJCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVycyA9IGFydGlmYWN0RGVmaW5pdGlvbkphdmFPYmplY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7CisJCQkJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtZXRlckRlZmluaXRpb24gOiBoZWF0UGFyYW1ldGVycykgeworCQkJCQkJaWYgKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldE5hbWUoKS5lcXVhbHMoImNpdHlfbmFtZSIpKSB7CisJCQkJCQkJY3VycmVudFZhbHVlID0gaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkuY29udGFpbnMoInRydWUiKSkgeworCQkJCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShjdXJyZW50VmFsdWUuZXF1YWxzKCJ0cnVlIikpOworCQkJCQl9CisJCQkJCWlmIChoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLmNvbnRhaW5zKCJmYWxzZSIpKSB7CisJCQkJCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGN1cnJlbnRWYWx1ZS5lcXVhbHMoImZhbHNlIikpOworCQkJCQl9CisJCQkJCVJlc3RSZXNwb25zZSBkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscworCQkJCQkJCS5kZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGhlYXRBcnRpZmFjdERldGFpbHMsCisJCQkJCQkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgKKwkJCQkJCQkiZGVsZXRlIEhFQVQgYXJ0aWZhY3QgZnJvbSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiCisJCQkJCQkJCQkrIGRlbGV0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwKKwkJCQkJCQlkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoaGVhdEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKS5jb250YWlucygibnVtYmVyIikpIHsKKwkJCQlpZiAoaGVhdEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKS5jb250YWlucygibmVnYXRpdmUiKSkgeworCQkJCQkvLyB2YWxpZGF0ZSBuZWdhdGl2ZSByZXNwb25zZQorCQkJCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiSEVBVCIsICJudW1iZXIiLCAiY2l0eV9uYW1lIik7CisJCQkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9WQUxVRS5uYW1lKCksCisJCQkJCQkJdmFyaWFibGVzLCByZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJCQl9CisJCQkJaWYgKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkuY29udGFpbnMoInBvc2l0aXZlIikpIHsKKwkJCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgKKwkJCQkJCQkiYWRkIEhFQVQgYXJ0aWZhY3QgdG8gcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpCisJCQkJCQkJCQkrICIgZmlsZU5hbWU6ICIgKyBoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLAorCQkJCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkuY29udGFpbnMoInN0cmluZyIpKSB7CisJCQkJaWYgKGhlYXRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkuY29udGFpbnMoIm5lZ2F0aXZlIikpIHsKKwkJCQkJLy8gdmFsaWRhdGUgbmVnYXRpdmUgcmVzcG9uc2UKKwkJCQkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIkhFQVQiLCAic3RyaW5nIiwgImNpdHlfbmFtZSIpOworCQkJCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfSEVBVF9QQVJBTUVURVJfVkFMVUUubmFtZSgpLAorCQkJCQkJCXZhcmlhYmxlcywgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQkJfQorCQkJCWlmIChoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLmNvbnRhaW5zKCJwb3NpdGl2ZSIpKSB7CisJCQkJCUFzc2VydEpVbml0LmFzc2VydFRydWUoCisJCQkJCQkJImFkZCBIRUFUIGFydGlmYWN0IHRvIHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKQorCQkJCQkJCQkJKyAiIGZpbGVOYW1lOiAiICsgaGVhdEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKSwKKwkJCQkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQkJCX0KKworCQkJfQorCisJCQllbHNlIGlmIChoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLmNvbnRhaW5zKCJ1bnN1cHBvcnRlZCIpKSB7CisKKwkJCQkvLyB2YWxpZGF0ZSBuZWdhdGl2ZSByZXNwb25zZQorCQkJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJIRUFUIiwgIm51bWJlcjEyMyIpOworCQkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9UWVBFLm5hbWUoKSwKKwkJCQkJCXZhcmlhYmxlcywgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJCX0KKworCQkJZWxzZSB7CisJCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgKKwkJCQkJCSJhZGQgSEVBVCBhcnRpZmFjdCB0byByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQkJfQorCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2F0dHJpYnV0ZS9Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2F0dHJpYnV0ZS9Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGUyNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYXR0cmlidXRlL0NvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmF0dHJpYnV0ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXB1YmxpYyBzdGF0aWMgR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGVUZXN0KCkgeworCQlzdXBlcihuYW1lLCBDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPblJlc291cmNlSW5zdGFuY2UoKSB7CisJCS8vIFByZXBhcmUgVkYgd2l0aCB2ZmMgaW5zdGFuY2Ugd2l0aCBBdHRyaWJ1dGVzCisJCVN0cmluZyB0ZXN0UmVzb3VyY2VzUGF0aCA9IGNvbmZpZy5nZXRSZXNvdXJjZUNvbmZpZ0RpcigpICsgRmlsZS5zZXBhcmF0b3IgKyAiaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsIjsKKwkJZmluYWwgUmVzb3VyY2UgdmZjV2l0aEF0dHJpYnV0ZXMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5pbXBvcnRSZXNvdXJjZSh0ZXN0UmVzb3VyY2VzUGF0aCwgIkNQV2l0aEF0dHJpYnV0ZXMueW1sIikubGVmdCgpLnZhbHVlKCk7CisJCXN3YWxsb3dFeGNlcHRpb24oKCkgLT4gQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZjV2l0aEF0dHJpYnV0ZXMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCBmYWxzZSkpOworCQlSZXNvdXJjZSB2ZiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UpLmxlZnQoKS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSB2ZmNJbnN0YW5jZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZjV2l0aEF0dHJpYnV0ZXMsIHZmKS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyB1dGlsIG1ldGhvZCB0byBnZXQgdGhlIHNwZWNpZmljIGF0dHJpYnV0ZSBmcm9tIHRoZSB2ZgorCQlGdW5jdGlvbjxSZXNvdXJjZSwgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+IGF0dHJpYnV0ZUdldHRlciA9IHJlc291cmNlVmYgLT4gcmVzb3VyY2VWZi5nZXRDb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuc3RyZWFtKCkuZmlsdGVyKGF0dCAtPiBhdHQuZ2V0TmFtZSgpLmVxdWFscygicHJpdmF0ZV9hZGRyZXNzIikpLmZpbmRBbnkoKS5nZXQoKTsKKwkJLy8gdXBkYXRlIGF0dHJpYnV0ZSBvbiB2ZmMgaW5zdGFuY2UKKwkJZmluYWwgUmVzb3VyY2UgdmZXaXRoSW5zYXRuY2VQcmVVcGRhdGUgPSBzd2FsbG93RXhjZXB0aW9uKCgpIC0+IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0Q29tcG9lbm50T2JqZWN0KHZmLCBVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgYXR0cmlidXRlT2ZSSSA9IGF0dHJpYnV0ZUdldHRlci5hcHBseSh2ZldpdGhJbnNhdG5jZVByZVVwZGF0ZSk7CisJCWZpbmFsIFN0cmluZyBuZXdBdHRWYWx1ZSA9ICJOZXdWYWx1ZSI7CisJCWF0dHJpYnV0ZU9mUkkuc2V0VmFsdWUobmV3QXR0VmFsdWUpOworCQlTdHJpbmcgYm9keSA9IGdzb24udG9Kc29uKGF0dHJpYnV0ZU9mUkkpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9BVFRSSUJVVEVfT05fUkVTT1VSQ0VfSU5TVEFOQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIENvbXBvbmVudFR5cGVFbnVtLmZpbmRQYXJhbUJ5VHlwZShDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSksIHZmLmdldFVuaXF1ZUlkKCksIHZmY0luc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQlzd2FsbG93RXhjZXB0aW9uKCgpIC0+IEJhc2VSZXN0VXRpbHMuc2VuZFBvc3QodXJsLCBib2R5LCBVc2VyUm9sZUVudW0uREVTSUdORVIuZ2V0VXNlcklkKCksIEJhc2VSZXN0VXRpbHMuYWNjZXB0SGVhZGVyRGF0YSkpOworCQkvLyBSZXRyaWV2ZSB1cGRhdGVkIHZmIGFuZCB2ZXJpZnkgYXR0cmlidXRlIHdhcyB1cGRhdGVkCisJCWZpbmFsIFJlc291cmNlIHZmV2l0aEluc2F0bmNlUG9zdFVwZGF0ZSA9IHN3YWxsb3dFeGNlcHRpb24oKCkgLT4gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRDb21wb2VubnRPYmplY3QodmYsIFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSB1cGRhdGVkQXR0cmlidXRlID0gYXR0cmlidXRlR2V0dGVyLmFwcGx5KHZmV2l0aEluc2F0bmNlUG9zdFVwZGF0ZSk7CisJCWFzc2VydEVxdWFscyh1cGRhdGVkQXR0cmlidXRlLmdldFZhbHVlKCksIG5ld0F0dFZhbHVlKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2NhdGVnb3J5L0NhdGFsb2dEYXRhQXBpVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvY2F0ZWdvcnkvQ2F0YWxvZ0RhdGFBcGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkZjc5MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2NhdGVnb3J5L0NhdGFsb2dEYXRhQXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5jYXRlZ29yeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlNlcnZpY2VDYXRlZ29yaWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ2F0YWxvZ1Jlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ0RhdGFBcGlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJvdGVjdGVkIENvbmZpZyBjb25maWcgPSBDb25maWcuaW5zdGFuY2UoKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGFjY2VwdEhlYWRlckRhdGUgPSAiYXBwbGljYXRpb24vanNvbiI7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCXByb3RlY3RlZCBVc2VyIHVzZXI7CisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSByZXMxOworCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgcmVzMjsKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIHN2YzE7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMxOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMjsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc3ZjRGV0YWlsczE7CisKKwlwdWJsaWMgQ2F0YWxvZ0RhdGFBcGlUZXN0KCkgeworCQlzdXBlcihuYW1lLCBDYXRhbG9nRGF0YUFwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXJlc291cmNlRGV0YWlsczEgPSBidWlsZFJlc291cmNlRGV0YWlscyh1c2VyLCAiVGVzdFJlc291cmNlMSIpOworCQlyZXNvdXJjZURldGFpbHMyID0gYnVpbGRSZXNvdXJjZURldGFpbHModXNlciwgIlRlc3RSZXNvdXJjZTIiKTsKKwkJc3ZjRGV0YWlsczEgPSBidWlsZFNlcnZpY2VEZXRhaWxzKCJUZXN0U2VydmljZTEiKTsKKworCQlyZXMxID0gY3JlYXRlUmVzb3VyY2UodXNlciwgcmVzb3VyY2VEZXRhaWxzMSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY3JlYXRlIHJlc29yY2UgZmFpbGVkIiwgMjAxLCByZXMxLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZURldGFpbHMxLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlczEpKTsKKwkJcmVzb3VyY2VEZXRhaWxzMi5zZXRWZXJzaW9uKFJlc3BvbnNlUGFyc2VyLmdldFZlcnNpb25Gcm9tUmVzcG9uc2UocmVzMSkpOworCisJCXJlczIgPSBjcmVhdGVSZXNvdXJjZSh1c2VyLCByZXNvdXJjZURldGFpbHMyKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjcmVhdGUgcmVzb3JjZSBmYWlsZWQiLCAyMDEsIHJlczIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlRGV0YWlsczIuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzMikpOworCQlyZXNvdXJjZURldGFpbHMyLnNldFZlcnNpb24oUmVzcG9uc2VQYXJzZXIuZ2V0VmVyc2lvbkZyb21SZXNwb25zZShyZXMyKSk7CisKKwkJc3ZjMSA9IGNyZWF0ZVNlcnZpY2UodXNlciwgc3ZjRGV0YWlsczEpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNyZWF0ZSByZXNvcmNlIGZhaWxlZCIsIDIwMSwgc3ZjMS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJc3ZjRGV0YWlsczEuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzdmMxLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCkpOworCQlzdmNEZXRhaWxzMS5zZXRWZXJzaW9uKFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc3ZjMS5nZXRSZXNwb25zZSgpKS5nZXRWZXJzaW9uKCkpOworCX0KKworCUBBZnRlck1ldGhvZAorCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRlbGV0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSwgdXNlci5nZXRVc2VySWQoKSk7CisJCWRlbGV0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsczIuZ2V0VW5pcXVlSWQoKSwgdXNlci5nZXRVc2VySWQoKSk7CisJCWRlbGV0ZVNlcnZpY2Uoc3ZjRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSwgdXNlcik7CisJfQorCisJLy8gS2VlcCAxCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRDYXRhbG9nRGF0YSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMxLCB1c2VyLCAiMC4xIiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIGluIG9wZXJhdGlvbiBmYWlsZWQiLCAyMDAsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRDYXRhbG9nKHVzZXIuZ2V0VXNlcklkKCkpOworCQlTdHJpbmcganNvbiA9IHJlcy5nZXRSZXNwb25zZSgpOworCQlKU09OT2JqZWN0IGpzb25SZXNwID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShqc29uKTsKKwkJSlNPTkFycmF5IHJlc291cmNlcyA9IChKU09OQXJyYXkpIGpzb25SZXNwLmdldCgicmVzb3VyY2VzIik7CisJCUpTT05BcnJheSBzZXJ2aWNlcyA9IChKU09OQXJyYXkpIGpzb25SZXNwLmdldCgic2VydmljZXMiKTsKKworCQkvLyBWZXJpZnkgYWxsIHRoZSBleHBlY3RlZCByZXNvdXJjZXMgcmVjZWl2ZWQuCisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoImNoZWNrIHJlc291cmNlMSBpcyBpbiByZXNwb25zZSIsCisJCQkJaXNDb21wb25lbnRJbkFycmF5KHJlc291cmNlRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VzKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoImNoZWNrIHJlc291cmNlMiBpcyBpbiByZXNwb25zZSIsCisJCQkJaXNDb21wb25lbnRJbkFycmF5KHJlc291cmNlRGV0YWlsczIuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VzKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoImNoZWNrIHNlcnZpY2UxIGlzIGluIHJlc3BvbnNlIiwKKwkJCQlpc0NvbXBvbmVudEluQXJyYXkoc3ZjRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSwgc2VydmljZXMpKTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkLCBTdHJpbmcgaHR0cENzcFVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VVbmlxdWVJZCwgaHR0cENzcFVzZXJJZCk7CisKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlKFVzZXIgdXNlciwgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRlbGV0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCQlyZXR1cm4gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCB1c2VyKTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIGJ1aWxkUmVzb3VyY2VEZXRhaWxzKFVzZXIgdXNlciwgU3RyaW5nIHJlc291cmNlTmFtZSkgeworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoInRvc2NhLm5vZGVzLlJvb3QiKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS4wIjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9IHVzZXIuZ2V0VXNlcklkKCk7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBudWxsLAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQlyZXNvdXJjZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0RBVEFCQVNFLmdldENhdGVnb3J5KCksCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19EQVRBQkFTRS5nZXRTdWJDYXRlZ29yeSgpKTsKKwkJcmV0dXJuIHJlc291cmNlRGV0YWlsczsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBvbmVudEluQXJyYXkoU3RyaW5nIGlkLCBKU09OQXJyYXkgY29tcG9uZW50KSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50LnNpemUoKTsgaSsrKSB7CisJCQlKU09OT2JqZWN0IGpvYmplY3QgPSAoSlNPTk9iamVjdCkgY29tcG9uZW50LmdldChpKTsKKwkJCWlmIChqb2JqZWN0LmdldCgidW5pcXVlSWQiKS50b1N0cmluZygpLmVxdWFscyhpZC50b0xvd2VyQ2FzZSgpKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2UoVXNlciB1c2VyLCBTZXJ2aWNlUmVxRGV0YWlscyBzdmNEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gZ2V0SGVhZGVyc01hcCh1c2VyKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgYm9keSA9IGdzb24udG9Kc29uKHN2Y0RldGFpbHMpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1NFUlZJQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCQlSZXN0UmVzcG9uc2UgcmVzID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCBib2R5LCBoZWFkZXJzTWFwKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGUgc2VydmljZSB3YXMgZmluaXNoZWQgd2l0aCByZXNwb25zZToKKwkJLy8gIityZXMuZ2V0RXJyb3JDb2RlKCkpOworCQlyZXR1cm4gcmVzOworCX0KKworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEhlYWRlcnNNYXAoVXNlciB1c2VyKSB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCQlyZXR1cm4gaGVhZGVyc01hcDsKKwl9CisKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgYnVpbGRTZXJ2aWNlRGV0YWlscyhTdHJpbmcgc2VydmljZU5hbWUpIHsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gc2VydmljZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJc2VydmljZVRhZ3MuYWRkKCJ0YWcxIik7CisJCXNlcnZpY2VUYWdzLmFkZChzZXJ2aWNlTmFtZSk7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWS5nZXRWYWx1ZSgpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIwLjEiOworCQlTdHJpbmcgY29udGFjdElkID0gImFsMTk3NiI7CisJCVN0cmluZyBpY29uID0gIm15SWNvbiI7CisKKwkJU2VydmljZVJlcURldGFpbHMgc3ZjZGV0YWlscyA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhzZXJ2aWNlTmFtZSwgY2F0ZWdvcnksIHNlcnZpY2VUYWdzLCBkZXNjcmlwdGlvbiwKKwkJCQljb250YWN0SWQsIGljb24pOworCQlyZXR1cm4gc3ZjZGV0YWlsczsKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2UoU3RyaW5nIHNlcnZpY2VJZCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlzZXJ2aWNlSWQpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IGdldEhlYWRlcnNNYXAodXNlcik7CisJCVJlc3RSZXNwb25zZSByZXMgPSBodHRwUmVxdWVzdC5odHRwU2VuZERlbGV0ZSh1cmwsIGhlYWRlcnNNYXApOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRlbGV0ZSBzZXJ2aWNlIHdhcyBmaW5pc2hlZCB3aXRoIHJlc3BvbnNlOgorCQkvLyAiK3Jlcy5nZXRFcnJvckNvZGUoKSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIGNsYXNzIE5ld09iamVjdCB7CisJCXByaXZhdGUgU3RyaW5nIF9uYW1lOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBfbmFtZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJCXRoaXMuX25hbWUgPSBuYW1lOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9jYXRlZ29yeS9DYXRlZ29yaWVzQmFzZVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2NhdGVnb3J5L0NhdGVnb3JpZXNCYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OGYzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9jYXRlZ29yeS9DYXRlZ29yaWVzQmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5jYXRlZ29yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYXRlZ29yaWVzQmFzZVRlc3QgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwdWJsaWMgQ2F0ZWdvcmllc0Jhc2VUZXN0KFRlc3ROYW1lIHRlc3ROYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisJCXN1cGVyKHRlc3ROYW1lLCBjbGFzc05hbWUpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElUX1NFUlZJQ0VfVFlQRSA9ICJTZXJ2aWNlIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJVF9SRVNPVVJDRV9UWVBFID0gIlJlc291cmNlIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJVF9QUk9EVUNUX1RZUEUgPSAiUHJvZHVjdCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSA9ICJHZXRDYXRlZ29yeUhpZXJhcmNoeSI7CisJcHJvdGVjdGVkIHN0YXRpYyBVc2VyIHNkbmNBZG1pblVzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY0FkbWluVXNlckRldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY0Rlc2lnbmVyVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBzZG5jVGVzdGVyVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY0dvdmVybm9yVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uR09WRVJOT1IpOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBzZG5jT3BzVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uT1BTKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY1Byb2R1Y3RNYW5hZ2VyVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9NQU5BR0VSMSk7CisJcHJvdGVjdGVkIHN0YXRpYyBVc2VyIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMSk7CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2NhdGVnb3J5L0NhdGVnb3JpZXNUZXN0cy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvY2F0ZWdvcnkvQ2F0ZWdvcmllc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlZTEyMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2NhdGVnb3J5L0NhdGVnb3JpZXNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjI4OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuY2F0ZWdvcnk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlBST0RVQ1RfQ09NUE9ORU5UX1RZUEU7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5SRVNPVVJDRV9DT01QT05FTlRfVFlQRTsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNFUlZJQ0VfQ09NUE9ORU5UX1RZUEU7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUzsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQ7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnRleHQuV29yZFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkubWltZS5NdWx0aXBhcnRFbnRpdHlCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkubWltZS5jb250ZW50LkZpbGVCb2R5OworaW1wb3J0IG9yZy5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ2F0ZWdvcnlSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDYXRlZ29yaWVzVGVzdHMgZXh0ZW5kcyBDYXRlZ29yaWVzQmFzZVRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9DQVRFR09SWV9ISUVSQVJDSFkgPSAiR2V0Q2F0ZWdvcnlIaWVyYXJjaHkiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9DQVRFR09SWSA9ICJBZGRDYXRlZ29yeSI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0NBVEVHT1JZID0gIkRlbGV0ZUNhdGVnb3J5IjsKKworCXB1YmxpYyBDYXRlZ29yaWVzVGVzdHMoKSB7CisJCXN1cGVyKG5hbWUsIENhdGVnb3JpZXNUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisJcHJpdmF0ZSBDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uOworCXByaXZhdGUgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5TGlzdDsKKwlwcml2YXRlIExpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJDYXRlZ29yeUxpc3Q7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHN1YkNhdGVnb3JpZXNUb0RlbGV0ZU1hcDsKKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1YkNhdGVnb3JpZXNUb0RlbGV0ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisKKwkJY2F0ZWdvcnlEZWZpbml0aW9uID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQWJjZCIpOworCQljYXRlZ29yeUxpc3QgPSBkZWZpbmVDYXRlZ29yaWVzKCk7CisJCXN1YkNhdGVnb3J5TGlzdCA9IGRlZmluZVN1YkNhdGVnb3JpZXMoY2F0ZWdvcnlMaXN0LnNpemUoKSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUNhdGVnb3J5U3VjY2Vzc0Zsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIE5ldyBjYXRlZ29yeQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwkJLy8gZ2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOyAvLyBhbHNvCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZXQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGFsb2cKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHVuaXFlSWQKKworCX0KKworCS8vIHBhc3MKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlQ2F0ZWdvcnlTdWNjZXNzRmxvdygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhYmNkIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBDYXRlZ29yeQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdENhdGVnb3J5U3VjY2Vzc0Zsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIENhdGVnb3J5IGJ5IFByb2R1Y3Qtc3RyYXRlZ2lzdAorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQkvLyBHZXQgQ2F0ZWdvcnkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9GaXJzdFdvcmRTdGFydFdpdGhBbHBoYU51bWVyaWNfMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gY2F0ZWdvcnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2VydmljZQorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkxNEFhZEUgICYmJi0tLSsrKy4nJycjIyM9OkBAQF9fX18iKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTE0QWFkRSAmLSsuJyM9OkBfIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnkxNGFhZGUgJi0rLicjPTpAXyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fRmlyc3RXb3JkU3RhcnRXaXRoQWxwaGFOdW1lcmljXzAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIGNhdGVnb3J5CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlc291cmNlCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTE0QWFkRSAgJiYmLS0tKysrLicnJyMjIz06QEBAX19fXyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTE0QWFkRSAmLSsuJyM9OkBfIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnkxNGFhZGUgJi0rLicjPTpAXyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9GaXJzdFdvcmRTdGFydFdpdGhBbHBoYU51bWVyaWNfMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gY2F0ZWdvcnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmVzb3VyY2UKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5MTRBYWRFICAmJiYtLS0rKysuJycnIyMjPTpAQEBfX19fIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sCisJCQkJc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTE0QWFkRSAmLSsuJyM9OkBfIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnkxNGFhZGUgJi0rLicjPTpAXyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwkvLyBwYXNzCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlQ2F0ZWdvcnlCeU5vbkFkbWluVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGQgTmV3IGNhdGVnb3J5CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sCisJCQkJc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBnZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSB3YXMgbm90IGFkZGVkCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdEZhaWx1cmUoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCUFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VDYXRlZ29yeUJ5Tm9uQWRtaW5Vc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sCisJCQkJc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gZ2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgd2FzIG5vdCBhZGRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdENhdGVnb3J5QnlOb25Qcm9kdWN0U3RyYXRlZ2lzdFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIE5ldyBwcm9kdWN0IGNhdGVnb3J5IG5vdCBieSBQcm9kdWN0LVN0cmF0ZWdpc3QKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIGdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IHdhcyBub3QgYWRkZWQKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKworCX0KKworCS8vIHBhc3MKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5QnlOb25FeGlzdGluZ1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jQWRtaW5Vc2VyRGV0YWlsc05vbkV4aXN0aW5nID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJc2RuY0FkbWluVXNlckRldGFpbHNOb25FeGlzdGluZy5zZXRVc2VySWQoImJ0NTU1aCIpOworCQkvLyBBZGQgTmV3IGNhdGVnb3J5CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHNOb25FeGlzdGluZywgU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIGdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IHdhcyBub3QgYWRkZWQKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSk7CisJCUV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCBleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCgpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBRERfQ0FURUdPUlkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKCIoIiArIHNkbmNBZG1pblVzZXJEZXRhaWxzTm9uRXhpc3RpbmcuZ2V0VXNlcklkKCkgKyAiKSIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldENhdGVnb3J5TmFtZShjYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdWJDYXRlZ29yeU5hbWUoIiIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEdyb3VwaW5nTmFtZSgiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKFN0cmluZy52YWx1ZU9mKFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNhdGVnb3J5QXVkaXQoZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCwgQUREX0NBVEVHT1JZKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFNlcnZpY2VDYXRlZ29yeUFsbG93ZWRjaGFyYWN0ZXJzXzAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUmIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZSYiKTsgLy8gbm9ybWFsaXphdGlvbgorCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFNlcnZpY2VDYXRlZ29yeUFsbG93ZWRjaGFyYWN0ZXJzXzAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUtIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZS0iKTsgLy8gbm9ybWFsaXphdGlvbgorCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFNlcnZpY2VDYXRlZ29yeUFsbG93ZWRjaGFyYWN0ZXJzXzAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUrIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZSsiKTsgLy8gbm9ybWFsaXphdGlvbgorCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFNlcnZpY2VDYXRlZ29yeUFsbG93ZWRjaGFyYWN0ZXJzXzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUuIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZS4iKTsgLy8gbm9ybWFsaXphdGlvbgorCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFNlcnZpY2VDYXRlZ29yeUFsbG93ZWRjaGFyYWN0ZXJzXzA1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUnIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZSciKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wNigpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFPSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGU9Iik7IC8vIG5vcm1hbGl6YXRpb24KKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wNygpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFOiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGU6Iik7IC8vIG5vcm1hbGl6YXRpb24KKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wOCgpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFQCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGVAIik7IC8vIG5vcm1hbGl6YXRpb24KKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wOSgpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFXyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGVfIik7IC8vIG5vcm1hbGl6YXRpb24KKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18xMCgpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFIyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGUjIik7IC8vIG5vcm1hbGl6YXRpb24KKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18xMSgpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFIGQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiMTIzNGFiY2RlIGQiKTsgLy8gbm9ybWFsaXphdGlvbgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFIEQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18xMigpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFICAgJl89Ky4tJyM6QCBkIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZSAmXz0rLi0nIzpAIGQiKTsgLy8gbm9ybWFsaXphdGlvbgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFICZfPSsuLScjOkAgRCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fUmVtb3ZlU3BhY2VGcm9tQmVnaW5uaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgIENhdGVnb3J5MDEiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnkwMSIpOyAvLyBub3JtYWxpemF0aW9uCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTAxIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9SZW1vdmVTcGFjZUZyb21FbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5MDEgICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImNhdGVnb3J5MDEiKTsgLy8gbm9ybWFsaXphdGlvbgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkwMSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0cmFTcGFjZSgpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkgICAgMDIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnkgMDIiKTsgLy8gbm9ybWFsaXphdGlvbgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkgMDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uX1JlbW92ZUV4dHJhQW1wZXJzYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeSYmICYwMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeSYgJjAyIik7IC8vIG5vcm1hbGl6YXRpb24KKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5JiAmMDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uX1JlbW92ZUV4dHJhRGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvclktLSAtLTAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvclktIC0wMiIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImNhdGVnb3J5LSAtMDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uX1JlbW92ZUV4dHJhUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZUdvcnkrKysrICswMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVHb3J5KyArMDIiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeSsgKzAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9SZW1vdmVFeHRyYVBlcmlvZCgpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkuLi4uIC4wMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5LiAuMDIiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeS4gLjAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9SZW1vdmVFeHRyYUFwb3N0cm9waGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhVGVnb3J5JycnICcwMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhVGVnb3J5JyAnMDIiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeScgJzAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9SZW1vdmVFeHRyYUhhc2h0YWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5IyMjICMwMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5IyAjMDIiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeSMgIzAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9SZW1vdmVFeHRyRWVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeT09PSA9MDIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeT0gPTAyIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnk9ID0wMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0ckNvbG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTo6OiA6MDIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTogOjAyIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnk6IDowMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0ckF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeUBAQCBAYTIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeUAgQGEyIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnlAIEBhMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0cmFVbmRlcnNjb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeV9fXyBfMjIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeV8gXzIyIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnlfIF8yMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fRmlyc3RXb3JkU3RhcnRXaXRoTnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxQ2F0ZWdvcnkgb25lIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMUNhdGVnb3J5IE9uZSIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjFjYXRlZ29yeSBvbmUiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uX0ZpcnN0V29yZFN0YXJ0V2l0aE5vbkFscGhhTnVtZXJpYygpIHRocm93cyBFeGNlcHRpb24geyAvLyBUaGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZpcnN0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3b3JkCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBtdXN0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdGFydAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gd2l0aAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYW4KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFscGhhLW51bWVyaWMKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNoYXJhY3RlcgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gW2EtWgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gQS4uWiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDAuLjldCisJCWNoYXIgaW52YWxpZENoYXJzW10gPSB7ICcmJywgJy0nLCAnKycsICcuJywgJ1wnJywgJyMnLCAnPScsICc6JywgJ0AnLCAnXycgfTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkQ2hhcnMubGVuZ3RoOyBpKyspIHsKKwkJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKGludmFsaWRDaGFyc1tpXSArICJBYmNEMTIzIik7CisJCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoKGludmFsaWRDaGFyc1tpXSArICJBYmNEMTIzIikudG9Mb3dlckNhc2UoKSk7CisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlsczEsIFNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQkvLyBnZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSB3YXMgbm90IGFkZGVkCisJCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJCUFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfRk9STUFULCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIEFVRElUX1NFUlZJQ0VfVFlQRSwKKwkJCQkJIlNlcnZpY2UiLCAiY2F0ZWdvcnkiKTsKKworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ2F0ZWdvcnlBbHJlYWR5RXhpc3RfdW5pcXVlbmVzcygpIHRocm93cyBFeGNlcHRpb24geyAvLyBWZXJpZnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2F0ZWdvcnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmFtZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkdXBsaWNhdGlvbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAoInVuaXF1ZW5lc3MiKQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhcworCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub24tY2FzZS1zZW5zaXRpdmUsCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNvCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdlCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRvbuKAmXQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY3JlYXRlCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGR1cGxpY2F0ZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lcworCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3aXRoCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHVwcGVyL2xvd2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhc2UKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaW5jb25zaXN0ZW5jeS4KKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhYmNkIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIGdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsgLy8gYWxzbworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2V0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRhbG9nCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB1bmlxZUlkCisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJCS8vIENyZWF0ZSBzYW1lIGNhdGVnb3J5IG5hbWUgYWdhaW4KKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjIgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCWNhdGVnb3J5RGF0YURlZmluaXRpb24yLnNldE5hbWUoY2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBhZGREdXBsaWNhdGVDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURhdGFEZWZpbml0aW9uMiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUywKKwkJCQlhZGREdXBsaWNhdGVDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdEZhaWx1cmUoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURhdGFEZWZpbml0aW9uMiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9BTFJFQURZX0VYSVNUUywgU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMsIEFVRElUX1NFUlZJQ0VfVFlQRSwKKwkJCQkiU2VydmljZSIsIGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQkvLyBHZXQgQ2F0ZWdvcnkgYW5kIHZlcmlmeSB0aGF0IGNhdGVnb3J5IHdhcyBjcmVhdGVkIGlzIG5vdCBkZWxldGVkCisJCWdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywgU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fUmVwbGFjZUFuZFdpdGhBbXBlcnNhbmRfMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0IGFuZCBUIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQXQgJiBUIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiYXQgJiB0Iik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9SZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wMigpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQXQgYW5kIHQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBdCAmIFQiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhdCAmIHQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uX1JlcGxhY2VBbmRXaXRoQW1wZXJzYW5kXzAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBdGFuZCBUIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImF0YW5kIHQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uX1JlcGxhY2VBbmRXaXRoQW1wZXJzYW5kXzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBdCBhbmRUIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImF0IGFuZHQiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0IEFuZFQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uX1JlcGxhY2VBbmRXaXRoQW1wZXJzYW5kXzA1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgYW5kIEF0dFQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMxLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiYW5kIGF0dHQiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkFuZCBBdHRUIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbl9SZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wNigpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQXR0VCBhbmQgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImF0dHQgYW5kIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBdHRUIEFuZCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwkvLyBCdWcKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25fUmVwbGFjZUFuZFdpdGhBbXBlcnNhbmRfMDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiBhbmQgYSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhbmQgYSIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQW5kIGEiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uTWF4TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBc2RmZ2hqUTIzNDU2Nzg5MEAjLiY6Ky1fIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFzZGZnaGpxMjM0NTY3ODkwQCMuJjorLV8iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25NYXhMZW5ndGhBZnRlck5vcm1hbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiAgQSBqUTIzNCBAQEBfX18gKysrIEF0IGFuZCBUIGFuZCBhbmQgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQSBKUTIzNCBAXyArIEF0ICYgVCAmIEFuZCIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImEganEyMzQgQF8gKyBhdCAmIHQgJiBhbmQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25FeGNlZWRNYXhMZW5ndGhBZnRlck5vcm1hbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiAgQWJkZmdoQkNWYSBqUTIzNCBAQF9fXyArKysgQXQgYW5kIFQgICAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFiZGZnaGJjdmEganEyMzQgQF8gKyBhdCZ0Iik7CisJCS8vIGdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IHdhcyBub3QgYWRkZWQKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEgsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgQVVESVRfU0VSVklDRV9UWVBFLAorCQkJCSJTZXJ2aWNlIiwgImNhdGVnb3J5Iik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uTWluTGVuZ3RoQWZ0ZXJOb3JtYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE1pbkxlbmd0aEFmdGVyTm9ybWFsaXphdGlvbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2hhcmFjdGVycworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiICBBdCBhbmQgIFQgICAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0ICYgVCIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImF0ICYgdCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25MZXNzVGhhbk1pbkxlbmd0aEFmdGVyTm9ybWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiICBBJiYmJiYmJiYmJiYmJiYmJiZUICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhJnQiKTsKKwkJLy8gZ2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgd2FzIG5vdCBhZGRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSCwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9TRVJWSUNFX1RZUEUsCisJCQkJIlNlcnZpY2UiLCAiY2F0ZWdvcnkiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25Jc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUobnVsbCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gZ2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgd2FzIG5vdCBhZGRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSCwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9TRVJWSUNFX1RZUEUsCisJCQkJIlNlcnZpY2UiLCAiY2F0ZWdvcnkiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25Jc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIiIpOworCQkvLyBnZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSB3YXMgbm90IGFkZGVkCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdEZhaWx1cmUoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCUFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfRk9STUFULCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIEFVRElUX1NFUlZJQ0VfVFlQRSwKKwkJCQkiU2VydmljZSIsICJjYXRlZ29yeSIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkludmFsaWRDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNoYXIgaW52YWxpZENoYXJzW10gPSB7ICd+JywgJyEnLCAnJCcsICclJywgJ14nLCAnKicsICcoJywgJyknLCAnIicsICd7JywgJ30nLCAnWycsICddJywgJz8nLCAnPicsICc8JywgJy8nLAorCQkJCSd8JywgJ1xcJywgJywnIH07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZENoYXJzLmxlbmd0aDsgaSsrKSB7CisJCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCQkvLyBEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQWJjRDEyMyIgKyBpbnZhbGlkQ2hhcnNbaV0pOworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIiKTsKKwkJCS8vIGdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IHdhcyBub3QgYWRkZWQKKwkJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdEZhaWx1cmUoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVCwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9TRVJWSUNFX1RZUEUsCisJCQkJCSJTZXJ2aWNlIiwgImNhdGVnb3J5Iik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25TYW1lTmFtZURpZmZlcmVudFJlc291cmNlVHlwZSgpIHRocm93cyBFeGNlcHRpb24geyAvLyBzYW1lCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIENhdGFsb2cKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gTmFtZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2VydmljZS9yZXNvdXJjZS9wcm9kdWN0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFsbG93ZWQKKwkJU3RyaW5nIG5hbWUgPSAoIkFiY2QiKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGF0YURlZmluaXRpb24xID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjIgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURhdGFEZWZpbml0aW9uMyA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjEuc2V0TmFtZShuYW1lKTsKKwkJY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjIuc2V0TmFtZShuYW1lKTsKKwkJY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjMuc2V0TmFtZShuYW1lKTsKKwkJLy8gQ1JFQVRFIENBVEVHT1JZIEZPUiBTRVJWSUNFCisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURhdGFEZWZpbml0aW9uMSwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjEuc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjEpOworCQkvLyBnZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGF0YURlZmluaXRpb24xKTsgLy8gYWxzbworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZXQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2F0YWxvZworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB1bmlxZUlkCisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURhdGFEZWZpbml0aW9uMSwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwkJLy8gQ1JFQVRFIENBVEVHT1JZIEZPUiBSRVNPVVJDRV9DT01QT05FTlRfVFlQRQorCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCWNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGF0YURlZmluaXRpb24yLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjIuc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjIpOworCQkvLyBHZXQgQ2F0ZWdvcnkKKwkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGF0YURlZmluaXRpb24yKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGF0YURlZmluaXRpb24yLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwkJLy8gQ1JFQVRFIENBVEVHT1JZIEZPUiBQUk9EVUNUCisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJUmVzdFJlc3BvbnNlIGFkZENhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGF0YURlZmluaXRpb24zLAorCQkJCXNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJYWRkQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURhdGFEZWZpbml0aW9uMy5zZXROb3JtYWxpemVkTmFtZSgiYWJjZCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoYWRkQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURhdGFEZWZpbml0aW9uMyk7CisKKwkJLy8gR2V0IENhdGVnb3J5CisJCWdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjMpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkZpcnN0TGV0dGVyT2ZLZXlXb3Jkc0NhcGl0YWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIEZpcnN0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxldHRlcgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBrZXkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gd29yZHMKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXJlCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhcGl0YWxpemVkCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJiZU5OeSBzaGFZIG1pY2hFbCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQmVOTnkgU2hhWSBNaWNoRWwiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJiZW5ueSBzaGF5IG1pY2hlbCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gTm9ybWFsaXplCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2F0ZWdvcnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29uanVuY3Rpb25zCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gKCdvZicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RvJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnZm9yJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYXMnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYW4nCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0aGUnKQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFyZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvd2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzZS4KKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiBiYW5rIE9GIGFtZXJpY2EgICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQmFuayBvZiBBbWVyaWNhIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiYmFuayBvZiBhbWVyaWNhIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wMigpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3JtYWxpemUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRlZ29yeQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25qdW5jdGlvbnMKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAoJ29mJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndG8nLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdmb3InLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhcycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2EnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhbicKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RoZScpCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXJlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG93ZXIKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlLgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiVEhFIGFtZXJpY2EgYmFuayAgICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiVEhFIEFtZXJpY2EgQmFuayIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoInRoZSBhbWVyaWNhIGJhbmsiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE5vcm1hbGl6ZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGVnb3J5CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmFtZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbmp1bmN0aW9ucworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICgnb2YnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0bycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2ZvcicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FzJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYScsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FuJworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICwKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndGhlJykKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhcmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb3dlcgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhc2UuCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgICBBIGJhbmsgT0YgYW1lcmljYSAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBIEJhbmsgb2YgQW1lcmljYSIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImEgYmFuayBvZiBhbWVyaWNhIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wNCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3JtYWxpemUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRlZ29yeQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25qdW5jdGlvbnMKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAoJ29mJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndG8nLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdmb3InLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhcycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2EnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhbicKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RoZScpCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXJlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG93ZXIKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlLgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiICBiYW5rICBhbWVyaWNhIGlzIEEgYmlnIGJhbiAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJCYW5rIEFtZXJpY2EgSXMgYSBCaWcgQmFuIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiYmFuayBhbWVyaWNhIGlzIGEgYmlnIGJhbiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gTm9ybWFsaXplCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2F0ZWdvcnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29uanVuY3Rpb25zCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gKCdvZicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RvJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnZm9yJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYXMnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYW4nCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0aGUnKQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFyZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvd2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzZS4KKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiBhTiBhcHBsZSBjb21QYW55IGluQyAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkFOIEFwcGxlIENvbVBhbnkgSW5DIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiYW4gYXBwbGUgY29tcGFueSBpbmMiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzA2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE5vcm1hbGl6ZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGVnb3J5CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmFtZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbmp1bmN0aW9ucworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICgnb2YnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0bycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2ZvcicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FzJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYScsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FuJworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICwKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndGhlJykKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhcmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb3dlcgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhc2UuCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgZWF0IEFOIGFwcGxlIEFOQU4iKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkVhdCBhbiBBcHBsZSBBTkFOIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiZWF0IGFuIGFwcGxlIGFuYW4iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzA3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE5vcm1hbGl6ZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGVnb3J5CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmFtZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbmp1bmN0aW9ucworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICgnb2YnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0bycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2ZvcicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FzJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYScsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FuJworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICwKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndGhlJykKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhcmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb3dlcgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhc2UuCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgdW5pdGVkIHN0YXRlcyBPRiBhbWVyaWNBICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvdHlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNBIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgidW5pdGVkIHN0YXRlcyBvZiBhbWVyaWNhIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCS8vIG5lZWQgdG8gcmUtY2hlY2sKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gTm9ybWFsaXplCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2F0ZWdvcnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29uanVuY3Rpb25zCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gKCdvZicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RvJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnZm9yJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYXMnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYW4nCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0aGUnKQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFyZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvd2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzZS4KKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiBvRiB1bml0ZWQgc3RhdGVzIE9GIGFtZXIgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJPRiBVbml0ZWQgU3RhdGVzIG9mIEFtZXIiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJvZiB1bml0ZWQgc3RhdGVzIG9mIGFtZXIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzA5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE5vcm1hbGl6ZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGVnb3J5CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmFtZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbmp1bmN0aW9ucworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICgnb2YnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0bycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2ZvcicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FzJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYScsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FuJworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICwKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndGhlJykKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhcmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb3dlcgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhc2UuCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgdG8gQXBwbGUgVE8gYXQmVCBUT08gIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJUbyBBcHBsZSB0byBBdCZUIFRPTyIpOworCQljYXRlZ29yeURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoInRvIGFwcGxlIHRvIGF0JnQgdG9vIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18xMCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3JtYWxpemUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRlZ29yeQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25qdW5jdGlvbnMKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAoJ29mJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndG8nLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdmb3InLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhcycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2EnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhbicKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RoZScpCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXJlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG93ZXIKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlLgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiIGVhdCBhcHBsZSBBUyB5b3UgbGlpaWtlYXMgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJFYXQgQXBwbGUgYXMgWW91IExpaWlrZWFzIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiZWF0IGFwcGxlIGFzIHlvdSBsaWlpa2VhcyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlQ2F0ZWdvdHlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBHZXQgc2VydmljZSBjYXRlZ29yeSBhbmQgdmFsaWRhdGUgdGhhdCBjYXRlZ29yeSBhZGRlZCBhcyBkZWZpbmVkCisJCS8vIChhbHNvIHNldCBjYXRhbG9nIHVuaXFlSWQpCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfU0VSVklDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhdGVnb3J5TmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gTm9ybWFsaXplCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2F0ZWdvcnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29uanVuY3Rpb25zCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gKCdvZicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RvJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnZm9yJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYXMnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYW4nCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0aGUnKQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFyZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvd2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzZS4KKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiBhcyB5b3UgbWF5IHdhbnQgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ290eVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVDYXRlZ290eVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBcyBZb3UgTWF5IFdhbnQiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhcyB5b3UgbWF5IHdhbnQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE5vcm1hbGl6ZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGVnb3J5CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmFtZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbmp1bmN0aW9ucworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICgnb2YnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICd0bycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2ZvcicsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FzJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYScsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2FuJworCQkJCQkJCQkJCQkJCQkJCQkJCS8vICwKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndGhlJykKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhcmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb3dlcgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhc2UuCisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgdGhlIGJhbmsgT0YgYW1lcmljYSAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlRoZSBCYW5rIG9mIEFtZXJpY2EiKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJ0aGUgYmFuayBvZiBhbWVyaWNhIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVDYXRlZ290eVJlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCS8vIG5lZWQgdG8gcmVjaGVjaworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18xMygpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3JtYWxpemUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRlZ29yeQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25qdW5jdGlvbnMKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAoJ29mJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndG8nLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdmb3InLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhcycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2EnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhbicKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RoZScpCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXJlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG93ZXIKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlLgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiICBUbyB0ZWwtdG90byAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlRvIFRlbC10b3RvIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgidG8gdGVsLXRvdG8iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJLy8gcmVjaGVjaworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18xNCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3JtYWxpemUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRlZ29yeQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb25qdW5jdGlvbnMKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAoJ29mJywKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAndG8nLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdmb3InLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhcycsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2EnLAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdhbicKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyAsCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ3RoZScpCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXJlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG93ZXIKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlLgorCQljYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiICAgdGVsLWF2aXYgVG8gICBsYSAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3R5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlRlbC1hdml2IHRvIExhIik7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgidGVsLWF2aXYgdG8gbGEiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZUNhdGVnb3R5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gR2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgYWRkZWQgYXMgZGVmaW5lZAorCQkvLyAoYWxzbyBzZXQgY2F0YWxvZyB1bmlxZUlkKQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX0NBVEVHT1JZLCBjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlQ2F0ZWdvcnlIdHRwQ3NwVXNlcklkSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNBZG1pblVzZXJEZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNBZG1pblVzZXJEZXRhaWxzMS5zZXRVc2VySWQoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkFiY2QiKTsKKwkJLy8gZ2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgd2FzIG5vdCBhZGRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCkpOworCQlFeHBlY3RlZENhdGVnb3J5QXVkaXQgZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQUREX0NBVEVHT1JZKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcigiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0Q2F0ZWdvcnlOYW1lKGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldFN1YkNhdGVnb3J5TmFtZSgiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0R3JvdXBpbmdOYW1lKCIiKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoQVVESVRfU0VSVklDRV9UWVBFKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2YoU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTikpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeUF1ZGl0KGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIEFERF9DQVRFR09SWSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlQ2F0ZWdvckh0dHBDc3BVc2VySWRJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jQWRtaW5Vc2VyRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlzZG5jQWRtaW5Vc2VyRGV0YWlsczEuc2V0VXNlcklkKG51bGwpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvdHlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlsczEsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLAorCQkJCWNyZWF0ZUNhdGVnb3R5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkFiY2QiKTsKKwkJLy8gZ2V0IHNlcnZpY2UgY2F0ZWdvcnkgYW5kIHZhbGlkYXRlIHRoYXQgY2F0ZWdvcnkgd2FzIG5vdCBhZGRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCkpOworCQlFeHBlY3RlZENhdGVnb3J5QXVkaXQgZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQUREX0NBVEVHT1JZKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcigiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0Q2F0ZWdvcnlOYW1lKGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldFN1YkNhdGVnb3J5TmFtZSgiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0R3JvdXBpbmdOYW1lKCIiKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoQVVESVRfU0VSVklDRV9UWVBFKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2YoU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTikpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeUF1ZGl0KGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIEFERF9DQVRFR09SWSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTcnZjQ2F0ZWdvcnlIdHRwQ3NwVXNlcklkSGVhZGVySXNNaXNzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscworCQkJCS5jcmVhdGVTZXJ2aWNlQ2F0ZWdvcnlIdHRwQ3NwQXR1VWlkSXNNaXNzaW5nKGNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTiwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBYmNkIik7CisJCS8vIGdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IHdhcyBub3QgYWRkZWQKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04ubmFtZSgpKTsKKwkJRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0IGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0KCk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKEFERF9DQVRFR09SWSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIoIiIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldENhdGVnb3J5TmFtZShjYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdWJDYXRlZ29yeU5hbWUoIiIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEdyb3VwaW5nTmFtZSgiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKEFVRElUX1NFUlZJQ0VfVFlQRSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKFN0cmluZy52YWx1ZU9mKFNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT04pKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlBdWRpdChleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LCBBRERfQ0FURUdPUlkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZUNhdGVnb3J5SGllcmFyY2h5U3VjY2Vzc0Zsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlpbnQgbnVtT2ZDYXRlZ29yaWVzID0gMzsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4oKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5OworCQlTdHJpbmcgY2F0ZWdvcnlOYW1lID0gY2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZkNhdGVnb3JpZXM7IGkrKykgeworCQkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoY2F0ZWdvcnlOYW1lICsgaSk7CisJCQlyZXN0UmVzcG9uc2UgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCQlTRVJWSUNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJCWNhdGVnb3J5ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJCWNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKKwkJfQorCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuR2V0Q2F0ZWdvcnlIaWVyYXJjaHlBdWRpdFN1Y2Nlc3MoR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSwgQVVESVRfU0VSVklDRV9UWVBFLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJZm9yIChDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlDdXJyIDogY2F0ZWdvcmllcykgeworCQkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5Q2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsIGNhdGVnb3J5Q3Vycik7CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gVVM1NzA1MjAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJcHJpdmF0ZSBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gZGVmaW5lQ2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlyc3RDYXRlZ29yeSA9ICJGaXJzdENhdGVnb3J5IjsKKwkJU3RyaW5nIHNlY29uZENhdGVnb3J5ID0gInNlY29uZENhdGVnb3J5IjsKKwkJU3RyaW5nIHRoaXJkQ2F0ZWdvcnkgPSAiVGhpcmRDYXRlZ29yeSI7CisJCVN0cmluZyBmb3J0aENhdGVnb3J5ID0gImZvcnRoQ2F0ZWdvcnkiOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnkxID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbihjYXRlZ29yeURlZmluaXRpb24pOworCQljYXRlZ29yeTEuc2V0TmFtZShmaXJzdENhdGVnb3J5KTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5MiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJY2F0ZWdvcnkyLnNldE5hbWUoc2Vjb25kQ2F0ZWdvcnkpOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnkzID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbihjYXRlZ29yeURlZmluaXRpb24pOworCQljYXRlZ29yeTMuc2V0TmFtZSh0aGlyZENhdGVnb3J5KTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5NCA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJY2F0ZWdvcnk0LnNldE5hbWUoZm9ydGhDYXRlZ29yeSk7CisJCUFycmF5TGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPigpOworCQljYXRlZ29yeUxpc3QuYWRkKGNhdGVnb3J5MSk7CisJCWNhdGVnb3J5TGlzdC5hZGQoY2F0ZWdvcnkyKTsKKwkJY2F0ZWdvcnlMaXN0LmFkZChjYXRlZ29yeTMpOworCQljYXRlZ29yeUxpc3QuYWRkKGNhdGVnb3J5NCk7CisJCXJldHVybiBjYXRlZ29yeUxpc3Q7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRBbGxSZXNvdXJjZUNhdGVnb3JpZXNIaXJhcmNoeSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVBbmRWYWxpZGF0ZUNhdGVnb3JpZXNFeGlzdChSRVNPVVJDRV9DT01QT05FTlRfVFlQRSwgY2F0ZWdvcnlMaXN0KTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3J5TGlzdC5zaXplKCk7IGkrKykgeworCQkJTGlzdDxTdHJpbmc+IHN1YkNhdGVnb3JpZVVuaXF1ZUlkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWJDYXRlZ29yeUxpc3Quc2l6ZSgpOyBqKyspIHsKKwkJCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnkgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShzdWJDYXRlZ29yeUxpc3QuZ2V0KGopLAorCQkJCQkJY2F0ZWdvcnlMaXN0LmdldChpKSwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJCQlpZiAoY3JlYXRlU3ViQ2F0ZWdvcnkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQkJCVN0cmluZyBzdWJDYXRlZ29yeVVuaXFlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeSk7CisJCQkJCXN1YkNhdGVnb3JpZVVuaXF1ZUlkTGlzdC5hZGQoc3ViQ2F0ZWdvcnlVbmlxZUlkKTsKKwkJCQkJc3ViQ2F0ZWdvcmllc1RvRGVsZXRlTWFwLnB1dChjYXRlZ29yeUxpc3QuZ2V0KGkpLmdldFVuaXF1ZUlkKCksIHN1YkNhdGVnb3JpZVVuaXF1ZUlkTGlzdCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUxpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgc3ViQ2F0ZWdvcnlMaXN0LnNpemUoKTsgaisrKSB7CisJCQkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJCQljYXRlZ29yeUxpc3QuZ2V0KGkpLmdldFVuaXF1ZUlkKCksIHN1YkNhdGVnb3J5TGlzdC5nZXQoaikpOworCQkJfQorCQl9CisKKwkJY2hlY2tBdWRpdFN1Y2Nlc3MoUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCX0KKworCXByaXZhdGUgTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IGRlZmluZVN1YkNhdGVnb3JpZXMoaW50IGNhdExpc3RTaXplKSB7CisJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJDYXRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+KCk7CisJCWZvciAoaW50IGogPSAxOyBqIDw9IGNhdExpc3RTaXplOyBqKyspIHsKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeSA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCXN1YkNhdGVnb3J5LnNldE5hbWUoIlN1YkNhdGVnb3J5IiArIFN0cmluZy52YWx1ZU9mKGopKTsKKwkJCXN1YkNhdExpc3QuYWRkKHN1YkNhdGVnb3J5KTsKKwkJfQorCQlyZXR1cm4gc3ViQ2F0TGlzdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQW5kVmFsaWRhdGVDYXRlZ29yaWVzRXhpc3QoU3RyaW5nIGNvbXAsIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yeUxpc3QpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVDYXRlZ29yaWVzKGNvbXAsIGNhdGVnb3J5TGlzdCk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsIGNvbXApOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJdmVyaWZ5Q2F0ZWdvcmllc0V4aXN0KGNhdGVnb3J5TGlzdCwgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QpOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXRlZ29yaWVzRXhpc3QoTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5TGlzdCwgUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0KSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlMaXN0LnNpemUoKTsgaSsrKSB7CisJCQljYXRlZ29yeUxpc3QuZ2V0KGkpLnNldE5hbWUoV29yZFV0aWxzLmNhcGl0YWxpemUoY2F0ZWdvcnlMaXN0LmdldChpKS5nZXROYW1lKCkpKTsKKwkJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LCBjYXRlZ29yeUxpc3QuZ2V0KGkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVDYXRlZ29yaWVzKFN0cmluZyBjb21wLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnlMaXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUxpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCUNhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5TGlzdC5nZXQoaSksIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBjb21wKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0QWxsU2VydmljZUNhdGVnb3JpZXNIaXJhcmNoeSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBkZWxldGVDYXRlZ29yaWVzKGNhdGVnb3J5TGlzdCwgU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWNyZWF0ZUFuZFZhbGlkYXRlQ2F0ZWdvcmllc0V4aXN0KFNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUsIGNhdGVnb3J5TGlzdCk7CisJCWNoZWNrQXVkaXRTdWNjZXNzKFNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQkvLyBkZWxldGVDYXRlZ29yaWVzKGNhdGVnb3J5TGlzdCwgU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRBbGxSZXNvdXJjZUNhdGVnb3JpZXNfbm9BdHRVc2VySGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMobmV3IFVzZXIoKSwgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgNDAzLCBnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0UmVzcG9uc2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLm5hbWUoKSk7CisJCUV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCBleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCgpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihHRVRfQ0FURUdPUllfSElFUkFSQ0hZKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoIiIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKCIiKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXREZXRhaWxzKFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2YoU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTikpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVHZXRDYXRlZ29yeUhpcmFyY2h5KGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIEdFVF9DQVRFR09SWV9ISUVSQVJDSFkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0QWxsUmVzb3VyY2VDYXRlZ29yaWVzX3VzZXJOb3RQcm92aXNpb25lZCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIG5vdFByb3Zpc2lvbmVkVXNlciA9IG5ldyBVc2VyKCk7CisJCW5vdFByb3Zpc2lvbmVkVXNlci5zZXRVc2VySWQoImFhMDAwMSIpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKG5vdFByb3Zpc2lvbmVkVXNlciwKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ2F0ZWdvcnkiLCA0MDksIGdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0UmVzcG9uc2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCkpOworCQlFeHBlY3RlZENhdGVnb3J5QXVkaXQgZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKCIiKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChub3RQcm92aXNpb25lZFVzZXIuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERldGFpbHMoUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhTdHJpbmcudmFsdWVPZihTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTikpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVHZXRDYXRlZ29yeUhpcmFyY2h5KGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIEdFVF9DQVRFR09SWV9ISUVSQVJDSFkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0QWxsUmVzb3VyY2VDYXRlZ29yaWVzX3Vuc3VwcG9ydGVkQ29tcG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsICJjb21wIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgaGlyYXJjaHkiLCA0MDAsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IubmFtZSgpLAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCJjb21wb25lbnQgdHlwZSIpKSwgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0UmVzcG9uc2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5VTlNVUFBPUlRFRF9FUlJPUi5uYW1lKCkpOworCQlFeHBlY3RlZENhdGVnb3J5QXVkaXQgZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY0FkbWluVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jQWRtaW5Vc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXREZXRhaWxzKCJjb21wIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKFN0cmluZy52YWx1ZU9mKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywKKwkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgiY29tcG9uZW50IHR5cGUiKSkpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVHZXRDYXRlZ29yeUhpcmFyY2h5KGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIEdFVF9DQVRFR09SWV9ISUVSQVJDSFkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRBbGxSZXNvdXJjZUNhdGVnb3JpZXNfZW1wdHlMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJSlNPTkFycmF5IGpBcnIgPSBuZXcgSlNPTkFycmF5KGdldEFsbENhdGVnb3JpZXNSZXN0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRUcnVlKGpBcnIubGVuZ3RoKCkgPT0gMCk7CisKKwkJY2hlY2tBdWRpdFN1Y2Nlc3MoUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0F1ZGl0U3VjY2VzcyhTdHJpbmcgY29tcG9uZW50VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCBleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCgpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihHRVRfQ0FURUdPUllfSElFUkFSQ0hZKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY0FkbWluVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY0FkbWluVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERldGFpbHMoY29tcG9uZW50VHlwZSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAiKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUdldENhdGVnb3J5SGlyYXJjaHkoZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCwgR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldEFsbFNlcnZpY2VDYXRlZ29yaWVzX2VtcHR5TGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJSlNPTkFycmF5IGpBcnIgPSBuZXcgSlNPTkFycmF5KGdldEFsbENhdGVnb3JpZXNSZXN0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRUcnVlKGpBcnIubGVuZ3RoKCkgPT0gMCk7CisKKwkJY2hlY2tBdWRpdFN1Y2Nlc3MoU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldEFsbFByb2R1Y3RDYXRlZ29yaWVzX2VtcHR5TGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENhdGVnb3J5IiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJSlNPTkFycmF5IGpBcnIgPSBuZXcgSlNPTkFycmF5KGdldEFsbENhdGVnb3JpZXNSZXN0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRUcnVlKGpBcnIubGVuZ3RoKCkgPT0gMCk7CisKKwkJY2hlY2tBdWRpdFN1Y2Nlc3MoUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgaW1wb3J0UmVzb3VyY2VEaXIgPSBjb25maWcuZ2V0SW1wb3J0VHlwZXNDb25maWdEaXIoKSArIEZpbGUuc2VwYXJhdG9yICsgImNhdGVnb3J5VHlwZXNUZXN0LnppcCI7CisKKwkJTXVsdGlwYXJ0RW50aXR5QnVpbGRlciBtcEJ1aWxkZXIgPSBNdWx0aXBhcnRFbnRpdHlCdWlsZGVyLmNyZWF0ZSgpOworCQltcEJ1aWxkZXIuYWRkUGFydCgiY2F0ZWdvcmllc1ppcCIsIG5ldyBGaWxlQm9keShuZXcgRmlsZShpbXBvcnRSZXNvdXJjZURpcikpKTsKKworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzdWx0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuaW1wb3J0Q2F0ZWdvcmllcyhtcEJ1aWxkZXIsIHNkbmNBZG1pblVzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIEltcG9ydCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQlpbXBvcnRSZXN1bHQuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoaW1wb3J0UmVzdWx0LmdldFJlc3BvbnNlKCksIE1hcC5jbGFzcyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgIGVudHJpZXMgY291bnQiLCAyLCBtYXAuc2l6ZSgpKTsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHJlc291cmNlcyA9IChMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KSBtYXAuZ2V0KCJyZXNvdXJjZXMiKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNvdXJjZSBjYXRlZ29yeSAgZW50cmllcyBjb3VudCIsIDEsIHJlc291cmNlcy5zaXplKCkpOworCisJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gc2VydmljZXMgPSAoTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PikgbWFwLmdldCgic2VydmljZXMiKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNvdXJjZSBjYXRlZ29yeSAgZW50cmllcyBjb3VudCIsIDIsIHNlcnZpY2VzLnNpemUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFsbENhdGVnb3JpZXMgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLCAicmVzb3VyY2VzIik7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiByZXNvdXJjZUNhdGVnb3JpZXMgPSBSZXNwb25zZVBhcnNlci5wYXJzZUNhdGVnb3JpZXMoYWxsQ2F0ZWdvcmllcyk7CisJCWZvciAoTWFwPFN0cmluZywgT2JqZWN0PiByZXNvdXJjZSA6IHJlc291cmNlcykgeworCQkJYm9vbGVhbiBleGlzdCA9IGZhbHNlOworCisJCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZyA6IHJlc291cmNlQ2F0ZWdvcmllcykgeworCQkJCWlmIChjYXRlZy5nZXROYW1lKCkuZXF1YWxzKHJlc291cmNlLmdldCgibmFtZSIpKSkgeworCQkJCQlleGlzdCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWFzc2VydFRydWUoIkNoZWNrIGV4aXN0YW5jZSByZXNvdXJjZSBjYXRlZ29yeSAgIiArIHJlc291cmNlLmdldCgibmFtZSIpLCBleGlzdCk7CisJCX0KKworCQlhbGxDYXRlZ29yaWVzID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywgInNlcnZpY2VzIik7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBzZXJ2aWNlc0NhdGVnb3JpZXMgPSBSZXNwb25zZVBhcnNlci5wYXJzZUNhdGVnb3JpZXMoYWxsQ2F0ZWdvcmllcyk7CisJCWZvciAoTWFwPFN0cmluZywgT2JqZWN0PiBzZXJ2aWNlIDogc2VydmljZXMpIHsKKwkJCWJvb2xlYW4gZXhpc3QgPSBmYWxzZTsKKworCQkJZm9yIChDYXRlZ29yeURlZmluaXRpb24gY2F0ZWcgOiBzZXJ2aWNlc0NhdGVnb3JpZXMpIHsKKwkJCQlpZiAoY2F0ZWcuZ2V0TmFtZSgpLmVxdWFscyhzZXJ2aWNlLmdldCgibmFtZSIpKSkgeworCQkJCQlleGlzdCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWFzc2VydFRydWUoIkNoZWNrIGV4aXN0YW5jZSBzZXJ2aWNlIGNhdGVnb3J5ICAiICsgc2VydmljZS5nZXQoIm5hbWUiKSwgZXhpc3QpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvY2F0ZWdvcnkvRWxlbWVudHNBcGlUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9jYXRlZ29yeS9FbGVtZW50c0FwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjMwZjhjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvY2F0ZWdvcnkvRWxlbWVudHNBcGlUZXN0LmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ2F0YWxvZ1Jlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEVsZW1lbnRzQXBpVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgRWxlbWVudHNBcGlUZXN0KCkgeworCQlzdXBlcihuYW1lLCBFbGVtZW50c0FwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwkvLyBwdWJsaWMgTENTYmFzZVRlc3QoVGVzdE5hbWUgdGVzdE5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkvLyBzdXBlcih0ZXN0TmFtZSwgY2xhc3NOYW1lKTsKKwkvLyB9CisKKwkvLyBwdWJsaWMgRWxlbWVudHNBcGlUZXN0KFRlc3ROYW1lIG5hbWUsIFN0cmluZyBuYW1lMikgeworCS8vLy8gc3VwZXIobmFtZSwgbmFtZTIpOworCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCS8vIH0KKworCS8vIEV4cGVjdGVkIDIwMCBLZWVwCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRBbGxQcm9wZXJ0eVNjb3Blc1N1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0QWxsUHJvcGVydHlTY29wZXNUb3dhcmRzQ2F0YWxvZ0JlKCk7CisJCVN0cmluZyBhY3Rpb24gPSAiR2V0IEFsbCBQcm9wZXJ0eSBTY29wZXMiOworCQlpbnQgZXhwZWN0ZWRDb2RlID0gMjAwOworCQl2ZXJpZnlFcnJvckNvZGUocmVzcG9uc2UsIGFjdGlvbiwgZXhwZWN0ZWRDb2RlKTsKKwl9CisKKwkvLyBFeHBlY3RlZCAyMDAgS2VlcAorCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0QWxsQXJ0aWZhY3RUeXBlcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRBbGxBcnRpZmFjdFR5cGVzVG93YXJkc0NhdGFsb2dCZSgpOworCQlTdHJpbmcgYWN0aW9uID0gIkdldCBBbGwgQXJ0aWZhY3QgVHlwZXMiOworCQlpbnQgZXhwZWN0ZWRDb2RlID0gMjAwOworCQl2ZXJpZnlFcnJvckNvZGUocmVzcG9uc2UsIGFjdGlvbiwgZXhwZWN0ZWRDb2RlKTsKKwl9CisKKwkvLyBFeHBlY3RlZCAyMDAgS2VlcAorCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0Q29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRDb25maWd1cmF0aW9uVG93YXJkc0NhdGFsb2dCZSgpOworCQlTdHJpbmcgYWN0aW9uID0gIkdldCBBbGwgQXJ0aWZhY3QgVHlwZXMiOworCQlpbnQgZXhwZWN0ZWRDb2RlID0gMjAwOworCisJCVN0cmluZyBqc29uID0gcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwkJSlNPTk9iamVjdCBqc29uUmVzcCA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UoanNvbik7CisKKwkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYXJ0aWZhY3RzID0gKEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uUmVzcC5nZXQoImFydGlmYWN0cyIpOworCQlMb25nIGRlZmF1bHRIZWF0VGltZW91dCA9IChMb25nKSBqc29uUmVzcC5nZXQoImRlZmF1bHRIZWF0VGltZW91dCIpOworCisJCWlmIChkZWZhdWx0SGVhdFRpbWVvdXQgPT0gbnVsbCkgeworCQkJcmVzcG9uc2Uuc2V0RXJyb3JDb2RlKDUwMCk7CisJCQl2ZXJpZnlFcnJvckNvZGUocmVzcG9uc2UsIGFjdGlvbiwgZXhwZWN0ZWRDb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChhcnRpZmFjdHMgPT0gbnVsbCkgeworCQkJcmVzcG9uc2Uuc2V0RXJyb3JDb2RlKDUwMCk7CisJCQl2ZXJpZnlFcnJvckNvZGUocmVzcG9uc2UsIGFjdGlvbiwgZXhwZWN0ZWRDb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUpTT05PYmplY3QgZGVwbG95bWVudFJlc291cmNlcyA9IChKU09OT2JqZWN0KSBhcnRpZmFjdHMuZ2V0KCJkZXBsb3ltZW50Iik7CisJCUpTT05BcnJheSBvdGhlclJlc291cmNlcyA9IChKU09OQXJyYXkpIGFydGlmYWN0cy5nZXQoIm90aGVyIik7CisJCWlmIChkZXBsb3ltZW50UmVzb3VyY2VzID09IG51bGwgfHwgb3RoZXJSZXNvdXJjZXMgPT0gbnVsbCkgeworCQkJcmVzcG9uc2Uuc2V0RXJyb3JDb2RlKDUwMCk7CisJCQl2ZXJpZnlFcnJvckNvZGUocmVzcG9uc2UsIGFjdGlvbiwgZXhwZWN0ZWRDb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUpTT05BcnJheSByb2xlcyA9IChKU09OQXJyYXkpIGpzb25SZXNwLmdldCgicm9sZXMiKTsKKwkJaWYgKHJvbGVzID09IG51bGwpIHsKKwkJCXJlc3BvbnNlLnNldEVycm9yQ29kZSg1MDApOworCQkJdmVyaWZ5RXJyb3JDb2RlKHJlc3BvbnNlLCBhY3Rpb24sIGV4cGVjdGVkQ29kZSk7CisJCQlyZXR1cm47CisJCX0KKworCX0KKworCXB1YmxpYyB2b2lkIHZlcmlmeUVycm9yQ29kZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBhY3Rpb24sIGludCBleHBlY3RlZENvZGUpIHsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyICIgKyBhY3Rpb24sIHJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgIiArIGFjdGlvbiwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgICsgYWN0aW9uIiArIGFjdGlvbiwgZXhwZWN0ZWRDb2RlLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0QWxsQ2F0ZWdvcmllc1N1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzVG93YXJkc0NhdGFsb2dCZSgpOworCQlTdHJpbmcgYWN0aW9uID0gIkdldCBBbGwgQ2F0ZWdvcmllcyI7CisJCWludCBleHBlY3RlZENvZGUgPSAyMDA7CisJCXZlcmlmeUVycm9yQ29kZShyZXNwb25zZSwgYWN0aW9uLCBleHBlY3RlZENvZGUpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRBbGxUYWdTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldEFsbFRhZ3NUb3dhcmRzQ2F0YWxvZ0JlKCk7CisJCVN0cmluZyBhY3Rpb24gPSAiR2V0IEFsbCBDYXRlZ29yaWVzIjsKKwkJaW50IGV4cGVjdGVkQ29kZSA9IDIwMDsKKwkJdmVyaWZ5RXJyb3JDb2RlKHJlc3BvbnNlLCBhY3Rpb24sIGV4cGVjdGVkQ29kZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9jYXRlZ29yeS9Hcm91cGluZ1Rlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2NhdGVnb3J5L0dyb3VwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NThiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9jYXRlZ29yeS9Hcm91cGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5OworCitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5QUk9EVUNUX0NPTVBPTkVOVF9UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEU7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TRVJWSUNFX0NPTVBPTkVOVF9UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFM7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX05PVF9GT1VORDsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUzsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuR3JvdXBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkQ2F0ZWdvcnlBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ2F0ZWdvcnlSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLlNraXBFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgR3JvdXBpbmdUZXN0IGV4dGVuZHMgQ2F0ZWdvcmllc0Jhc2VUZXN0IHsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9HUk9VUElORyA9ICJBZGRHcm91cGluZyI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9DQVRFR09SWSA9ICJzdWItY2F0ZWdvcnkiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQSU5HID0gImdyb3VwaW5nIjsKKworCXB1YmxpYyBHcm91cGluZ1Rlc3QoKSB7CisJCXN1cGVyKG5hbWUsIEdyb3VwaW5nVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwcml2YXRlIENhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uOworCXByaXZhdGUgQ2F0ZWdvcnlEZWZpbml0aW9uIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yOworCisJcHJpdmF0ZSBTdWJDYXRlZ29yeURlZmluaXRpb24gcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKKwlwcml2YXRlIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMjsKKwlwcml2YXRlIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMzsKKworCXByaXZhdGUgR3JvdXBpbmdEZWZpbml0aW9uIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb247CisJcHJpdmF0ZSBHcm91cGluZ0RlZmluaXRpb24gcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjI7CisJcHJpdmF0ZSBHcm91cGluZ0RlZmluaXRpb24gcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjM7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIENhdGVnb3J5IHNldHVwCisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24gPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkxIik7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMi5zZXROYW1lKCJDYXRlZ29yeTIiKTsKKworCQkvLyBTdWJjYXRlZ29yeSBzZXR1cAorCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uID0gbmV3IFN1YkNhdGVnb3J5RGVmaW5pdGlvbigpOworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlN1YkNhdGVnb3J5MSIpOworCisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24yID0gbmV3IFN1YkNhdGVnb3J5RGVmaW5pdGlvbigpOworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMi5zZXROYW1lKCJTdWJDYXRlZ29yeTIiKTsKKworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMyA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjMuc2V0TmFtZSgiU3ViQ2F0ZWdvcnkxIik7CisKKwkJLy8gR3JvdXAgc2V0dXAKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiA9IG5ldyBHcm91cGluZ0RlZmluaXRpb24oKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJHcm91cGluZzEiKTsKKworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMiA9IG5ldyBHcm91cGluZ0RlZmluaXRpb24oKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIuc2V0TmFtZSgiR3JvdXBpbmcyIik7CisKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjMgPSBuZXcgR3JvdXBpbmdEZWZpbml0aW9uKCk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24zLnNldE5hbWUoIkdyb3VwaW5nMSIpOworCisJCS8vIEluaXQgcHJvZHVjdCBjYXRlZ29yeQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvcnkgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvcnkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoY3JlYXRlQ2F0ZWdvcnkuZ2V0UmVzcG9uc2UoKSwKKwkJCQlDYXRlZ29yeURlZmluaXRpb24uY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGNhdGVnb3J5IG5hbWUgYWZ0ZXIgY3JlYXRpbmcgY2F0ZWdvcnkgIiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCksCisJCQkJY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiA9IGNhdGVnb3J5OworCisJCS8vIEluaXQgcHJvZHVjdCBjYXRlZ29yeTEKKwkJY3JlYXRlQ2F0ZWdvcnkgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoY3JlYXRlQ2F0ZWdvcnkuZ2V0UmVzcG9uc2UoKSwgQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yeSBuYW1lIGFmdGVyIGNyZWF0aW5nIGNhdGVnb3J5ICIsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yLmdldE5hbWUoKSwKKwkJCQljYXRlZ29yeS5nZXROYW1lKCkpOworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMiA9IGNhdGVnb3J5OworCisJCS8vIEluaXQgcHJvZHVjdCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHRvCisJCS8vIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24KKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnkgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGNyZWF0ZVN1YkNhdGVnb3J5LmdldFJlc3BvbnNlKCksCisJCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yeSBuYW1lIGFmdGVyIGNyZWF0aW5nIGNhdGVnb3J5ICIsIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpLAorCQkJCXN1YkNhdGVnb3J5LmdldE5hbWUoKSk7CisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24gPSBzdWJDYXRlZ29yeTsKKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5hZGRTdWJDYXRlZ29yeShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQkvLyBJbml0IHByb2R1Y3QgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEgdG8KKwkJLy8gcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbgorCQljcmVhdGVTdWJDYXRlZ29yeSA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24yLAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXN1YkNhdGVnb3J5ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChjcmVhdGVTdWJDYXRlZ29yeS5nZXRSZXNwb25zZSgpLCBTdWJDYXRlZ29yeURlZmluaXRpb24uY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGNhdGVnb3J5IG5hbWUgYWZ0ZXIgY3JlYXRpbmcgY2F0ZWdvcnkgIiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjIuZ2V0TmFtZSgpLAorCQkJCXN1YkNhdGVnb3J5LmdldE5hbWUoKSk7CisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24yID0gc3ViQ2F0ZWdvcnk7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uYWRkU3ViQ2F0ZWdvcnkocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjIpOworCisJCS8vIEluaXQgcHJvZHVjdCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMyB0bworCQkvLyBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMgorCQljcmVhdGVTdWJDYXRlZ29yeSA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24zLAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlzdWJDYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoY3JlYXRlU3ViQ2F0ZWdvcnkuZ2V0UmVzcG9uc2UoKSwgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yeSBuYW1lIGFmdGVyIGNyZWF0aW5nIGNhdGVnb3J5ICIsIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24zLmdldE5hbWUoKSwKKwkJCQlzdWJDYXRlZ29yeS5nZXROYW1lKCkpOworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMyA9IHN1YkNhdGVnb3J5OworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMi5hZGRTdWJDYXRlZ29yeShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0R3JvdXBDYXRlZ29yeVN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlR3JvdXBpbmdTdWNjZXNzKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sCisJCQkJc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyb3VwaW5nU3VjY2VzcyhHcm91cGluZ0RlZmluaXRpb24gZ3JvdXBpbmdEZWZpbml0aW9uLAorCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCVVzZXIgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFN0cmluZyBwcm9kdWN0Q29tcG9uZW50VHlwZSwgU3RyaW5nIGF1ZGl0VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKGdyb3VwaW5nRGVmaW5pdGlvbiwgc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCWNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIHByb2R1Y3RDb21wb25lbnRUeXBlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImdyb3VwaW5nMSIpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCXByb2R1Y3RDb21wb25lbnRUeXBlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIGdyb3VwaW5nRGVmaW5pdGlvbik7CisKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIGNhdGVnb3J5RGVmaW5pdGlvbiwgc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCWdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIGF1ZGl0VHlwZSk7CisJfQorCisJLy8vLyBCZW5ueQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0R3JvdXBCeVByb2R1Y3RTdHJhdGVnaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiZ3JvdXBpbmcxIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEdyb3VwQWxyZWFkeUV4aXN0SW5TYW1lQ2F0ZWdvcnlTdWJDYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImdyb3VwaW5nMSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCQkvLyBDcmVhdGUgU2FtZSBHcm91cCBhbHJlYWR5IGV4aXN0IG9uIHNhbWUgQ2F0ZWdvcnkvU3ViQ2F0ZWdvcnkKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUywKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRGYWlsdXJlKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0dST1VQSU5HX0VYSVNUU19GT1JfU1VCX0NBVEVHT1JZLCBTVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUywgQVVESVRfUFJPRFVDVF9UWVBFLAorCQkJCUFVRElUX1BST0RVQ1RfVFlQRSwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5nZXROYW1lKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RHcm91cFVuZGVyU2FtZUNhdGVnb3J5QnV0RGlmZmVyZW50U3ViQ2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2V0dGluZyA6IENhdGVnb3J5LUEsIFN1Yi1jYXRlZ29yeS1CICwgZ3JvdXAgOiBhQmNkIChkaXNwbGF5LU5hbWUgOgorCQkvLyBBQmNkLCBub3JtYWxpemVkOiBhYmNkKSDvg6AgW0EsIEIsIEFCY2RdCisJCS8vIEFjdGlvbiA6IENhdGVnb3J5LUEsIFN1Yi1jYXRlZ29yeS1DLCBncm91cCA6IGFiY0QgKGRpc3BsYXktTmFtZSA6CisJCS8vIEFCY2QsIG5vcm1hbGl6ZWQ6IGFiY2QpIO+DoCBbQSwgQywgQUJjZF0KKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJBQkNkIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yLnNldE5hbWUoImFiY0QiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhYmNkIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjIsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIuc2V0TmFtZSgiQUJDZCIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMi5zZXROb3JtYWxpemVkTmFtZSgiYWJjZCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMiwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIsIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RHcm91cFVuZGVyU2FtZVN1YkNhdGVnb3J5QnV0RGlmZmVyZW50Q2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2V0dGluZyA6IENhdGVnb3J5LUEsIFN1Yi1jYXRlZ29yeS1CICwgZ3JvdXAgOiBhQmNkIChkaXNwbGF5LU5hbWUgOgorCQkvLyBBQmNkLCBub3JtYWxpemVkOiBhYmNkKSDvg6AgW0EsIEIsIEFCY2RdCisJCS8vIDogQ2F0ZWdvcnktQSwgU3ViLWNhdGVnb3J5LUMsIGdyb3VwIDogYWJjRCAoZGlzcGxheS1OYW1lIDogQUJjZCwKKwkJLy8gbm9ybWFsaXplZDogYWJjZCkg74OgIFtBLCBDLCBBQmNkXQorCQkvLyA6IENhdGVnb3J5LUssIFN1Yi1jYXRlZ29yeS1CLCBncm91cCA6IGFiY0QgKGRpc3BsYXktTmFtZSA6IEFCY2QsCisJCS8vIG5vcm1hbGl6ZWQ6IGFiY2QpIO+DoCBbSywgQiwgQUJjZF0KKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJBQkNkIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yLnNldE5hbWUoImFiY0QiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjMuc2V0TmFtZSgiYUJDZCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCWNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMiwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMi5zZXROYW1lKCJBQkNkIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yLnNldE5vcm1hbGl6ZWROYW1lKCJhYmNkIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24yLCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMywgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjMsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjIsIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24zLnNldE5hbWUoIkFCQ2QiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjMuc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjMpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24zLCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMywgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24yLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24zKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEdyb3Vwc09uU2FtZUNhdGVnb3J5U3ViQ2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2V0dGluZyA6IENhdGVnb3J5LUEsIFN1Yi1jYXRlZ29yeS1CICwgZ3JvdXAgOiBBQmNkIChkaXNwbGF5LU5hbWUgOgorCQkvLyBBQmNkLCBub3JtYWxpemVkOiBhYmNkKSBbQSAsQiwgQUJjZF0KKwkJLy8gQWN0aW9uIDogQ2F0ZWdvcnktQSwgU3ViLWNhdGVnb3J5LUIsIGdyb3VwIDogWlhjdiAoZGlzcGxheS1OYW1lIDoKKwkJLy8gWlhjdiwgbm9ybWFsaXplZDogenhjdikgW0EsIEIsIFpYY3ZdCisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQUJjZCIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMi5zZXROYW1lKCJaWGN2Iik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yLnNldE5vcm1hbGl6ZWROYW1lKCJ6eGN2Iik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiYWJjZCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIsIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIsIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RHcm91cFVuZGVyRGlmZmVyZW50Q2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2V0dGluZyA6IENhdGVnb3J5LUEsIFN1Yi1jYXRlZ29yeS1CICwgZ3JvdXAgOiBhQmNkIChkaXNwbGF5LU5hbWUgOgorCQkvLyBBQmNkLCBub3JtYWxpemVkOiBhYmNkKSBbQSAsQiwgQUJjZF0KKwkJLy8gQWN0aW9uIDogQ2F0ZWdvcnktSywgU3ViLWNhdGVnb3J5LUIsIGdyb3VwIDogYWJjRCAoZGlzcGxheS1OYW1lIDoKKwkJLy8gQUJjZCwgbm9ybWFsaXplZDogYWJjZCkgW0ssIEIsIEFCY2RdCisJCS8vIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQUJDZCIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkFCY0QiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIuc2V0TmFtZSgiYWJjRCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCWNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMywKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIuc2V0Tm9ybWFsaXplZE5hbWUoImFiY2QiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIuc2V0TmFtZSgiQUJjRCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uMik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjIsCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjMsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24yLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24zLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbjIpOworCX0KKworCS8vLy8vLy8vLy8vCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0R3JvdXBCeU5vblByb2R1Y3RTdHJhdGVnaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZShwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdEZhaWx1cmUoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJLy8gQElnbm9yZSgiREUxNzYyNDUiKQorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEdyb3VwRm9yTm9uRXhpc3RpbmdDb21wb25lbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBub25TdXBwb3J0ZWRDb21wb25lbnRUeXBlID0gIk5vbkV4aXN0aW5nQ29tcG9uZW50VHlwZSI7IC8vIGluc3RlYWQKKwkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlc291cmNlL3Byb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJbm9uU3VwcG9ydGVkQ29tcG9uZW50VHlwZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ05vdEV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUocHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRGYWlsdXJlKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCwKKwkJCQlTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIG5vblN1cHBvcnRlZENvbXBvbmVudFR5cGUpOworCX0KKworCS8vIEBJZ25vcmUoIkRFMTc2MjQ1IikKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlR3JvdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gUmVzb3VyY2UgZG9lc24ndCBoYXZlIGdyb3VwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZShwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdEZhaWx1cmUoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULAorCQkJCVNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJLy8gQElnbm9yZSgiREUxNzYyNDUiKQorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUdyb3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFNlcnZpY2UgZG9lc24ndCBoYXZlIGdyb3VwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdOb3RFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0RmFpbHVyZShBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQsCisJCQkJU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEdyb3VwRm9yTm9uRXhpc3RpbmdDYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCisJCUNhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMTAwID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMTAwLnNldE5hbWUoImNhdGVnb3J5Lm5vbmV4aXN0aW5nQ2F0ZWdvcnkiKTsKKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjEwMC5zZXRVbmlxdWVJZCgiY2F0ZWdvcnkubm9uZXhpc3RpbmdDYXRlZ29yeSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMTAwLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0RmFpbHVyZShBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24xMDAsCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgQVVESVRfUFJPRFVDVF9UWVBFLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUsIENBVEVHT1JZLCAiIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0R3JvdXBGb3JOb25FeGlzdGluZ1N1bkNhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBTa2lwRXhjZXB0aW9uKAorCQkJCSJTa2lwcGluZyAtIGZhaWxlZCBpbiBhdWRpdCB2YWxpZGF0aW9uIGV4cGVjdGVkIFwicHJvZHVjdHNcIiBhY3R1YWwgcmVzdWx0IHdhcyBcInByb2R1Y3RcIiAiKTsKKwkJLy8gU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24xMDAgPSBuZXcKKwkJLy8gU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCS8vIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24xMDAuc2V0VW5pcXVlSWQoImNhdGVnb3J5Lm5vbmV4aXN0aW5nU3ViQ2F0ZWdvcnkiKTsKKwkJLy8gUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9CisJCS8vIENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCS8vIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24xMDAsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sCisJCS8vIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLAorCQkvLyBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsIGNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0KKwkJLy8gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJLy8gUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwKKwkJLy8gU1RBVFVTX0NPREVfU1VDQ0VTUywgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIENhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkvLyBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCS8vIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJLy8gcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIC8vQXVkaXQgdmFsaWRhdGlvbgorCQkvLyBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMTAwLnNldE5hbWUocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEwMC5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdEZhaWx1cmUoQUREX0dST1VQSU5HICwKKwkJLy8gcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEwMCwKKwkJLy8gcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCS8vIEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5ELAorCQkvLyBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsQVVESVRfUFJPRFVDVF9UWVBFLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFLAorCQkvLyBTVUJfQ0FURUdPUlksICIiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFByb2R1Y3RHcm91cEFsbG93ZWRjaGFyYWN0ZXJzXzAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFLSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZS0iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgUHJvZHVjdEdyb3VwQWxsb3dlZGNoYXJhY3RlcnNfMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUrIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiMTIzNGFiY2RlKyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBQcm9kdWN0R3JvdXBBbGxvd2VkY2hhcmFjdGVyc18wMygpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIjEyMzRBYmNkRSYiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGUmIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFByb2R1Y3RHcm91cEFsbG93ZWRjaGFyYWN0ZXJzXzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFLSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZS0iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgUHJvZHVjdEdyb3VwQWxsb3dlZGNoYXJhY3RlcnNfMDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUrIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiMTIzNGFiY2RlKyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBQcm9kdWN0R3JvdXBBbGxvd2VkY2hhcmFjdGVyc18wNigpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIjEyMzRBYmNkRS4iKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGUuIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFByb2R1Y3RHcm91cEFsbG93ZWRjaGFyYWN0ZXJzXzA3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFJyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZSciKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgUHJvZHVjdEdyb3VwQWxsb3dlZGNoYXJhY3RlcnNfMDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEU9Iik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiMTIzNGFiY2RlPSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBQcm9kdWN0R3JvdXBBbGxvd2VkY2hhcmFjdGVyc18wOSgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIjEyMzRBYmNkRToiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGU6Iik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFByb2R1Y3RHcm91cEFsbG93ZWRjaGFyYWN0ZXJzXzEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFQCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZUAiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgUHJvZHVjdEdyb3VwQWxsb3dlZGNoYXJhY3RlcnNfMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEVfIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiMTIzNGFiY2RlXyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBQcm9kdWN0R3JvdXBBbGxvd2VkY2hhcmFjdGVyc18xMigpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIjEyMzRBYmNkRSMiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxMjM0YWJjZGUjIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFByb2R1Y3RHcm91cEFsbG93ZWRjaGFyYWN0ZXJzXzEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFIGQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIjEyMzRBYmNkRSBEIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIjEyMzRhYmNkZSBkIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVtb3ZlU3BhY2VGcm9tQmVnaW5uaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiICBDYXRlZ29yeTAxIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnkwMSIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5MDEiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbl9SZW1vdmVTcGFjZUZyb21FbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTAxICAgICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImNhdGVnb3J5MDEiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTAxIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0cmFTcGFjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5ICAgIDAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnkgMDIiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeSAwMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uX1JlbW92ZUV4dHJhQW1wZXJzYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkmJiAmMDIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeSYgJjAyIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkmICYwMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uX1JlbW92ZUV4dHJhRGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3JZLS0gLS0wMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImNhdGVnb3J5LSAtMDIiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yWS0gLTAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0cmFQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZUdvcnkrKysrICswMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZUdvcnkrICswMiIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeSsgKzAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0cmFQZXJpb2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeS4uLi4gLjAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeS4gLjAyIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImNhdGVnb3J5LiAuMDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbl9SZW1vdmVFeHRyYUFwb3N0cm9waGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYVRlZ29yeScnJyAnMDIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhVGVnb3J5JyAnMDIiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnknICcwMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uX1JlbW92ZUV4dHJhSGFzaHRhZygpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5IyMjICMwMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkjICMwMiIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeSMgIzAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0ckVlcXVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5PT09ID0wMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnk9ID0wMiIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeT0gPTAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVtb3ZlRXh0ckNvbG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnk6OjogOjAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTogOjAyIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImNhdGVnb3J5OiA6MDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbl9SZW1vdmVFeHRyQXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeUBAQCBAYTIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5QCBAYTIiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiY2F0ZWdvcnlAIEBhMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uX1JlbW92ZUV4dHJhVW5kZXJzY29yZSgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5X19fIF8yMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnlfIF8yMiIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJjYXRlZ29yeV8gXzIyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fRmlyc3RXb3JkU3RhcnRXaXRoTnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiMUNhdGVnb3J5IG9uZSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiMUNhdGVnb3J5IE9uZSIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCIxY2F0ZWdvcnkgb25lIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fRmlyc3RXb3JkU3RhcnRXaXRoTm9uQWxwaGFOdW1lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIFRoZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmaXJzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3b3JkCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG11c3QKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc3RhcnQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gd2l0aAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbHBoYS1udW1lcmljCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNoYXJhY3RlcgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBbYS1aCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIEEuLlosCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDAuLjldCisJCWNoYXIgaW52YWxpZENoYXJzW10gPSB7ICcmJywgJy0nLCAnKycsICcuJywgJ1wnJywgJyMnLCAnPScsICc6JywgJ0AnLCAnXycgfTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdDsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0OworCQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRDaGFycy5sZW5ndGg7IGkrKykgeworCQkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKGludmFsaWRDaGFyc1tpXSArICJBYmNEMTIzIik7CisJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKChpbnZhbGlkQ2hhcnNbaV0gKyAiQWJjRDEyMyIpLnRvTG93ZXJDYXNlKCkpOworCQkJY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDYXRlZ29yeSIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVwbGFjZUFuZFdpdGhBbXBlcnNhbmRfMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJBdCBhbmQgVCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQXQgJiBUIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImF0ICYgdCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uX1JlcGxhY2VBbmRXaXRoQW1wZXJzYW5kXzAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQXQgYW5kIHQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkF0ICYgVCIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhdCAmIHQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbl9SZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wMygpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkF0YW5kIFQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhdGFuZCB0Iik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25fUmVwbGFjZUFuZFdpdGhBbXBlcnNhbmRfMDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJBdCBhbmRUIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiYXQgYW5kdCIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkF0IEFuZFQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbl9SZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wNSgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIiBhbmQgQXR0VCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFuZCBhdHR0Iik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQW5kIEF0dFQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbl9SZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wNigpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkF0dFQgYW5kICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImF0dHQgYW5kIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQXR0VCBBbmQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbl9SZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wNygpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIiBhbmQgYSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFuZCBhIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQW5kIGEiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbk1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkFzZGZnaGpRMjM0NTY3ODkwQCMuJjorLV8iKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhc2RmZ2hqcTIzNDU2Nzg5MEAjLiY6Ky1fIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25NYXhMZW5ndGhBZnRlck5vcm1hbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgIEEgalEyMzQgQEBAX19fICsrKyBBdCBhbmQgVCBhbmQgYW5kICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImEganEyMzQgQF8gKyBhdCAmIHQgJiBhbmQiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJBIEpRMjM0IEBfICsgQXQgJiBUICYgQW5kIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25FeGNlZWRNYXhMZW5ndGhBZnRlck5vcm1hbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgIEFiZGZnaEJDVmEgalEyMzQgQEBfX18gKysrIEF0IGFuZCBUICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhYmRmZ2hiY3ZhIGpxMjM0IEBfICsgYXQmdCIpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRGYWlsdXJlKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSCwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9QUk9EVUNUX1RZUEUsCisJCQkJQVVESVRfUFJPRFVDVF9UWVBFLCBHUk9VUElORyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uTWluTGVuZ3RoQWZ0ZXJOb3JtYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiICBBdCYmJiYmJiYmJiYmJnQgICAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhdCZ0Iik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiQXQmdCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uTGVzc1RoYW5NaW5MZW5ndGhBZnRlck5vcm1hbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgIEEmJiYmJiYmJiYmJiZUICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhJnQiKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ05vdEV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0RmFpbHVyZShBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEgsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgQVVESVRfUFJPRFVDVF9UWVBFLAorCQkJCUFVRElUX1BST0RVQ1RfVFlQRSwgR1JPVVBJTkcpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbklzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIiIpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRGYWlsdXJlKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVCwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9QUk9EVUNUX1RZUEUsCisJCQkJQVVESVRfUFJPRFVDVF9UWVBFLCBHUk9VUElORyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uSW52YWxpZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdDsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0OworCQljaGFyIGludmFsaWRDaGFyc1tdID0geyAnficsICchJywgJyQnLCAnJScsICdeJywgJyonLCAnKCcsICcpJywgJyInLCAneycsICd9JywgJ1snLCAnXScsICc/JywgJz4nLCAnPCcsICcvJywKKwkJCQknfCcsICdcXCcsICcsJyB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRDaGFycy5sZW5ndGg7IGkrKykgeworCQkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJBYmNEMTIzIiArIGludmFsaWRDaGFyc1tpXSk7CisJCQljcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoIiIpOworCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ05vdEV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdEZhaWx1cmUoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9GT1JNQVQsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgQVVESVRfUFJPRFVDVF9UWVBFLAorCQkJCQlBVURJVF9QUk9EVUNUX1RZUEUsIEdST1VQSU5HKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wMSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBOb3JtYWxpemUgdGhlIGdyb3VwaW5nIG5hbWUgY29uanVuY3Rpb25zICgnb2YnLCAndG8nLCAnZm9yJywgJ2FzJywKKwkJLy8gJ2EnLCAnYW4nICwgJ3RoZScpIGFyZSBsb3dlciBjYXNlLgorCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIiBiYW5rIE9GIGFtZXJpY2EgICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImJhbmsgb2YgYW1lcmljYSIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkJhbmsgb2YgQW1lcmljYSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE5vcm1hbGl6ZSB0aGUgZ3JvdXBpbmcgbmFtZSBjb25qdW5jdGlvbnMgKCdvZicsICd0bycsICdmb3InLCAnYXMnLAorCQkvLyAnYScsICdhbicgLCAndGhlJykgYXJlIGxvd2VyIGNhc2UuCisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiVEhFIGFtZXJpY2EgYmFuayAgICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiVEhFIEFtZXJpY2EgQmFuayIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJ0aGUgYW1lcmljYSBiYW5rIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTm9ybWFsaXplIHRoZSBncm91cGluZyBuYW1lIGNvbmp1bmN0aW9ucyAoJ29mJywgJ3RvJywgJ2ZvcicsICdhcycsCisJCS8vICdhJywgJ2FuJyAsICd0aGUnKSBhcmUgbG93ZXIgY2FzZS4KKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgICBBIGJhbmsgT0YgYW1lcmljYSAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJBIEJhbmsgb2YgQW1lcmljYSIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhIGJhbmsgb2YgYW1lcmljYSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE5vcm1hbGl6ZSB0aGUgZ3JvdXBpbmcgbmFtZSBjb25qdW5jdGlvbnMgKCdvZicsICd0bycsICdmb3InLCAnYXMnLAorCQkvLyAnYScsICdhbicgLCAndGhlJykgYXJlIGxvd2VyIGNhc2UuCisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiICBiYW5rICBhbWVyaWNhIGlzIEEgYmlnIGJhbiAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJCYW5rIEFtZXJpY2EgSXMgYSBCaWcgQmFuIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImJhbmsgYW1lcmljYSBpcyBhIGJpZyBiYW4iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wNSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBOb3JtYWxpemUgdGhlIGdyb3VwaW5nIG5hbWUgY29uanVuY3Rpb25zICgnb2YnLCAndG8nLCAnZm9yJywgJ2FzJywKKwkJLy8gJ2EnLCAnYW4nICwgJ3RoZScpIGFyZSBsb3dlciBjYXNlLgorCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIiBhTiBhcHBsZSBjb21QYW55IGluQyAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkFOIEFwcGxlIENvbVBhbnkgSW5DIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImFuIGFwcGxlIGNvbXBhbnkgaW5jIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTm9ybWFsaXplIHRoZSBncm91cGluZyBuYW1lIGNvbmp1bmN0aW9ucyAoJ29mJywgJ3RvJywgJ2ZvcicsICdhcycsCisJCS8vICdhJywgJ2FuJyAsICd0aGUnKSBhcmUgbG93ZXIgY2FzZS4KKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgZWF0IEFOIGFwcGxlIEFOQU4iKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkVhdCBhbiBBcHBsZSBBTkFOIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoImVhdCBhbiBhcHBsZSBhbmFuIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTm9ybWFsaXplIHRoZSBncm91cGluZyBuYW1lIGNvbmp1bmN0aW9ucyAoJ29mJywgJ3RvJywgJ2ZvcicsICdhcycsCisJCS8vICdhJywgJ2FuJyAsICd0aGUnKSBhcmUgbG93ZXIgY2FzZS4KKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgdW5pdGVkIHN0YXRlcyBPRiBhbWVyaWNBICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNBIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoInVuaXRlZCBzdGF0ZXMgb2YgYW1lcmljYSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzA4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE5vcm1hbGl6ZSB0aGUgZ3JvdXBpbmcgbmFtZSBjb25qdW5jdGlvbnMgKCdvZicsICd0bycsICdmb3InLCAnYXMnLAorCQkvLyAnYScsICdhbicgLCAndGhlJykgYXJlIGxvd2VyIGNhc2UuCisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiIG9GIHVuaXRlZCBzdGF0ZXMgT0YgYW1lciAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIk9GIFVuaXRlZCBTdGF0ZXMgb2YgQW1lciIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJvZiB1bml0ZWQgc3RhdGVzIG9mIGFtZXIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wOSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBOb3JtYWxpemUgdGhlIGdyb3VwaW5nIG5hbWUgY29uanVuY3Rpb25zICgnb2YnLCAndG8nLCAnZm9yJywgJ2FzJywKKwkJLy8gJ2EnLCAnYW4nICwgJ3RoZScpIGFyZSBsb3dlciBjYXNlLgorCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIiB0byBBcHBsZSBUTyBhdCZUIFRPTyAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIlRvIEFwcGxlIHRvIEF0JlQgVE9PIik7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoInRvIGFwcGxlIHRvIGF0JnQgdG9vIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTm9ybWFsaXplIHRoZSBncm91cGluZyBuYW1lIGNvbmp1bmN0aW9ucyAoJ29mJywgJ3RvJywgJ2ZvcicsICdhcycsCisJCS8vICdhJywgJ2FuJyAsICd0aGUnKSBhcmUgbG93ZXIgY2FzZS4KKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgZWF0IGFwcGxlIEFTIHlvdSBsaWlpa2VhcyAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkVhdCBBcHBsZSBhcyBZb3UgTGlpaWtlYXMiKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgiZWF0IGFwcGxlIGFzIHlvdSBsaWlpa2VhcyIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBncm91cE5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE5vcm1hbGl6ZSB0aGUgZ3JvdXBpbmcgbmFtZSBjb25qdW5jdGlvbnMgKCdvZicsICd0bycsICdmb3InLCAnYXMnLAorCQkvLyAnYScsICdhbicgLCAndGhlJykgYXJlIGxvd2VyIGNhc2UuCisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiIGFzIHlvdSBtYXkgd2FudCAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvZHVjdCBncm91cCIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIkFzIFlvdSBNYXkgV2FudCIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJhcyB5b3UgbWF5IHdhbnQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18xMigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBOb3JtYWxpemUgdGhlIGdyb3VwaW5nIG5hbWUgY29uanVuY3Rpb25zICgnb2YnLCAndG8nLCAnZm9yJywgJ2FzJywKKwkJLy8gJ2EnLCAnYW4nICwgJ3RoZScpIGFyZSBsb3dlciBjYXNlLgorCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIiB0aGUgYmFuayBPRiBhbWVyaWNhICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiVGhlIEJhbmsgb2YgQW1lcmljYSIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJ0aGUgYmFuayBvZiBhbWVyaWNhIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlR3JvdXBSZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QsIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmdyb3VwaW5nQXVkaXRTdWNjZXNzKEFERF9HUk9VUElORywgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdyb3VwTmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTm9ybWFsaXplIHRoZSBncm91cGluZyBuYW1lIGNvbmp1bmN0aW9ucyAoJ29mJywgJ3RvJywgJ2ZvcicsICdhcycsCisJCS8vICdhJywgJ2FuJyAsICd0aGUnKSBhcmUgbG93ZXIgY2FzZS4KKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCIgIFRvIHRlbC10b3RvICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9kdWN0IGdyb3VwIiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVHcm91cGluZ1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uc2V0TmFtZSgiVG8gVGVsLXRvdG8iKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROb3JtYWxpemVkTmFtZSgidG8gdGVsLXRvdG8iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKGNyZWF0ZUdyb3VwaW5nUmVzdCwgcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5R3JvdXBpbmdFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoQUREX0dST1VQSU5HLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ3JvdXBOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18xNCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBOb3JtYWxpemUgdGhlIGdyb3VwaW5nIG5hbWUgY29uanVuY3Rpb25zICgnb2YnLCAndG8nLCAnZm9yJywgJ2FzJywKKwkJLy8gJ2EnLCAnYW4nICwgJ3RoZScpIGFyZSBsb3dlciBjYXNlLgorCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoIiAgIHRlbC1hdml2IFRvICAgbGEgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb2R1Y3QgZ3JvdXAiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJUZWwtYXZpdiB0byBMYSIpOworCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKCJ0ZWwtYXZpdiB0byBsYSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZUdyb3VwUmVzcG9uc2UoY3JlYXRlR3JvdXBpbmdSZXN0LCBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5ncm91cGluZ0F1ZGl0U3VjY2VzcyhBRERfR1JPVVBJTkcsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1BST0RVQ1RfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0R3JvdXBIdHRwQ3NwVXNlcklkSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNQUyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX1NUUkFURUdJU1QxKTsKKwkJc2RuY1BTLnNldFVzZXJJZCgiIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVHcm91cGluZ1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQUywgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLAorCQkJCWNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ05vdEV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04ubmFtZSgpKTsKKwkJRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0IGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0KCk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKEFERF9HUk9VUElORyk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIoIiIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldENhdGVnb3J5TmFtZShwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldFN1YkNhdGVnb3J5TmFtZShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEdyb3VwaW5nTmFtZShwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKEFVRElUX1BST0RVQ1RfVFlQRSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKFN0cmluZy52YWx1ZU9mKFNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT04pKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlBdWRpdChleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LCBBRERfR1JPVVBJTkcpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEdyb3VwSHR0cENzcFVzZXJJZElzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNQUyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX1NUUkFURUdJU1QxKTsKKwkJc2RuY1BTLnNldFVzZXJJZChudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1BTLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT04sCisJCQkJY3JlYXRlR3JvdXBpbmdSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCkpOworCQlFeHBlY3RlZENhdGVnb3J5QXVkaXQgZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQUREX0dST1VQSU5HKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcigiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0Q2F0ZWdvcnlOYW1lKHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3ViQ2F0ZWdvcnlOYW1lKHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0R3JvdXBpbmdOYW1lKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoQVVESVRfUFJPRFVDVF9UWVBFKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2YoU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTikpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeUF1ZGl0KGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIEFERF9HUk9VUElORyk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFByb2R1Y3RDYXRlZ29yeUhpZXJhcmNoeVN1Y2Nlc3NGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBTa2lwRXhjZXB0aW9uKAorCQkJCSJTa2lwcGluZyAtIGZhaWxlZCBpbiBhdWRpdCB2YWxpZGF0aW9uIGV4cGVjdGVkIFwicHJvZHVjdHNcIiBhY3R1YWwgcmVzdWx0IHdhcyBcInByb2R1Y3RcIiAiKTsKKwkJLy8gaW50IG51bU9mR3JvdXBpbmcgPSAzOworCQkvLyBMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4gZ3JvdXBpbmdMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2U7CisJCS8vIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZzsKKwkJLy8gU3RyaW5nIGdyb3VwaW5nTmFtZSA9IHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24uZ2V0TmFtZSgpOworCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IG51bU9mR3JvdXBpbmc7IGkrKykgeworCQkvLyBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLnNldE5hbWUoZ3JvdXBpbmdOYW1lK2kpOworCQkvLyByZXN0UmVzcG9uc2UgPQorCQkvLyBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVHcm91cGluZyhwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uLAorCQkvLyBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLAorCQkvLyBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCS8vIGdyb3VwaW5nID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJLy8gR3JvdXBpbmdEZWZpbml0aW9uLmNsYXNzKTsKKwkJLy8gZ3JvdXBpbmdMaXN0LmFkZChncm91cGluZyk7CisJCS8vIH0KKwkJLy8gUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0KKwkJLy8gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJLy8gUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwKKwkJLy8gU1RBVFVTX0NPREVfU1VDQ0VTUywgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLkdldENhdGVnb3J5SGllcmFyY2h5QXVkaXRTdWNjZXNzKEdFVF9DQVRFR09SWV9ISUVSQVJDSFksCisJCS8vIEFVRElUX1BST0RVQ1RfVFlQRSwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCS8vIFNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQkvLworCQkvLyBmb3IgKEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cCA6IGdyb3VwaW5nTGlzdCkgeworCQkvLyBDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlHcm91cGluZ0V4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJLy8gcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkvLyBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIGdyb3VwKTsKKwkJLy8gfQorCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2NhdGVnb3J5L1N1YkNhdGVnb3JpZXNUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9jYXRlZ29yeS9TdWJDYXRlZ29yaWVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTZlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9jYXRlZ29yeS9TdWJDYXRlZ29yaWVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkwNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuY2F0ZWdvcnk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlBST0RVQ1RfQ09NUE9ORU5UX1RZUEU7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5SRVNPVVJDRV9DT01QT05FTlRfVFlQRTsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNFUlZJQ0VfQ09NUE9ORU5UX1RZUEU7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUzsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQ7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTk9UX0ZPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkQ2F0ZWdvcnlBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ2F0ZWdvcnlSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTdWJDYXRlZ29yaWVzVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9TVUJfQ0FURUdPUlkgPSAiQWRkU3ViQ2F0ZWdvcnkiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZID0gImNhdGVnb3J5IjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfQ0FURUdPUlkgPSAic3ViLWNhdGVnb3J5IjsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElUX1NFUlZJQ0VfVFlQRSA9ICJTZXJ2aWNlIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJVF9SRVNPVVJDRV9UWVBFID0gIlJlc291cmNlIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJVF9QUk9EVUNUX1RZUEUgPSAiUHJvZHVjdCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSA9ICJHZXRDYXRlZ29yeUhpZXJhcmNoeSI7CisJcHJvdGVjdGVkIHN0YXRpYyBVc2VyIHNkbmNBZG1pblVzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY0FkbWluVXNlckRldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY0Rlc2lnbmVyVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBzZG5jVGVzdGVyVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY0dvdmVybm9yVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uR09WRVJOT1IpOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBzZG5jT3BzVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uT1BTKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY1Byb2R1Y3RNYW5hZ2VyVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9NQU5BR0VSMSk7CisJcHJvdGVjdGVkIHN0YXRpYyBVc2VyIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMSk7CisKKwlwdWJsaWMgU3ViQ2F0ZWdvcmllc1Rlc3QoKSB7CisJCXN1cGVyKG5hbWUsIFN1YkNhdGVnb3JpZXNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXByaXZhdGUgQ2F0ZWdvcnlEZWZpbml0aW9uIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uOworCXByaXZhdGUgQ2F0ZWdvcnlEZWZpbml0aW9uIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uMTsKKwlwcml2YXRlIENhdGVnb3J5RGVmaW5pdGlvbiBzZXJ2aWNlQ2F0ZWdvcnlEZWZpbml0aW9uOworCXByaXZhdGUgQ2F0ZWdvcnlEZWZpbml0aW9uIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb247CisJcHJpdmF0ZSBDYXRlZ29yeURlZmluaXRpb24gcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjE7CisJcHJpdmF0ZSBDYXRlZ29yeURlZmluaXRpb24gcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24xMDA7CisJcHJpdmF0ZSBDYXRlZ29yeURlZmluaXRpb24gcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjIwMDsKKworCXByaXZhdGUgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworCXByaXZhdGUgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uMTsKKwlwcml2YXRlIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzZXJ2aWNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworCXByaXZhdGUgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb247CisJcHJpdmF0ZSBTdWJDYXRlZ29yeURlZmluaXRpb24gcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjE7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIENhdGVnb3J5IHNldHVwCisJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbjEgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXNlcnZpY2VDYXRlZ29yeURlZmluaXRpb24gPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24gPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24xID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbjEwMCA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsgLy8gZm9yCisJCQkJCQkJCQkJCQkJCQkJCS8vIG5lZ2F0aXZlCisJCQkJCQkJCQkJCQkJCQkJCS8vIHRlc3RzCisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yMDAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7IC8vIGZvciBuZWdhdGl2ZQorCQkJCQkJCQkJCQkJCQkJCQkvLyB0ZXN0cworCisJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5MSIpOworCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbjEuc2V0TmFtZSgiQ2F0ZWdvcnkyIik7CisJCXNlcnZpY2VDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkxIik7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkyIik7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24xLnNldE5hbWUoIkNhdGVnb3J5MyIpOworCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbjEwMC5zZXROYW1lKCJDYXRlZ29yeTEwMCIpOworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMjAwLnNldE5hbWUoIkNhdGVnb3J5MTAwIik7CisKKwkJLy8gU3ViY2F0ZWdvcnkgc2V0dXAKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24gPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uMSA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJc2VydmljZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiUmVzb3VyY2Utc3ViY2F0Iik7CisJCS8vIFNlcnZpY2Ugc3ViIC0gZm9yIG5lZ2F0aXZlIHRlc3Rpbmcgc2luY2UgaXQncyBub3QgYWxsb3dlZAorCQlzZXJ2aWNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlNlcnZpY2Utc3ViY2F0Iik7CisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiUHJvZHVjdC1zdWJjYXQiKTsKKworCQkvLyBJbml0IHJlc291cmNlIGNhdGVnb3J5CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDYXRlZ29yeSA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZUNhdGVnb3J5KHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnkgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGNyZWF0ZUNhdGVnb3J5LmdldFJlc3BvbnNlKCksCisJCQkJQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yeSBuYW1lIGFmdGVyIGNyZWF0aW5nIGNhdGVnb3J5ICIsIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKSwKKwkJCQljYXRlZ29yeS5nZXROYW1lKCkpOworCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiA9IGNhdGVnb3J5OworCisJCS8vIEluaXQgcmVzb3VyY2UgY2F0ZWdvcnkxCisJCWNyZWF0ZUNhdGVnb3J5ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkocmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24xLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoY3JlYXRlQ2F0ZWdvcnkuZ2V0UmVzcG9uc2UoKSwgQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yeSBuYW1lIGFmdGVyIGNyZWF0aW5nIGNhdGVnb3J5ICIsIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uMS5nZXROYW1lKCksCisJCQkJY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKKwkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24xID0gY2F0ZWdvcnk7CisKKwkJLy8gSW5pdCBzZXJ2aWNlIGNhdGVnb3J5CisJCWNyZWF0ZUNhdGVnb3J5ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlQ2F0ZWdvcnkoc2VydmljZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoY3JlYXRlQ2F0ZWdvcnkuZ2V0UmVzcG9uc2UoKSwgQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yeSBuYW1lIGFmdGVyIGNyZWF0aW5nIGNhdGVnb3J5ICIsIHNlcnZpY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpLAorCQkJCWNhdGVnb3J5LmdldE5hbWUoKSk7CisJCXNlcnZpY2VDYXRlZ29yeURlZmluaXRpb24gPSBjYXRlZ29yeTsKKworCQkvLyBJbml0IHByb2R1Y3QgY2F0ZWdvcnkKKwkJY3JlYXRlQ2F0ZWdvcnkgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlQ2F0ZWdvcnkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNhdGVnb3J5ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChjcmVhdGVDYXRlZ29yeS5nZXRSZXNwb25zZSgpLCBDYXRlZ29yeURlZmluaXRpb24uY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGNhdGVnb3J5IG5hbWUgYWZ0ZXIgY3JlYXRpbmcgY2F0ZWdvcnkgIiwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCksCisJCQkJY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiA9IGNhdGVnb3J5OworCisJCS8vIEluaXQgcHJvZHVjdCBjYXRlZ29yeTEKKwkJY3JlYXRlQ2F0ZWdvcnkgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMSwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZUNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoY3JlYXRlQ2F0ZWdvcnkuZ2V0UmVzcG9uc2UoKSwgQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yeSBuYW1lIGFmdGVyIGNyZWF0aW5nIGNhdGVnb3J5ICIsIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24xLmdldE5hbWUoKSwKKwkJCQljYXRlZ29yeS5nZXROYW1lKCkpOworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMSA9IGNhdGVnb3J5OworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVN1YkNhdGVnb3J5U3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVTdWJDYXRlZ29yeVN1Y2Nlc3MocmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0U3ViQ2F0ZWdvcnlTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVN1YkNhdGVnb3J5U3VjY2Vzcyhwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFLCBBVURJVF9QUk9EVUNUX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFN1YkNhdGVnb3J5VHdvQ2F0ZWdvcmllc0Nhc2VJbnNlbnNpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY29tcG9uZW50VHlwZSA9IFBST0RVQ1RfQ09NUE9ORU5UX1RZUEU7CisJCVN0cmluZyBhdWRpdFR5cGUgPSBBVURJVF9QUk9EVUNUX1RZUEU7CisJCVVzZXIgdXNlciA9IHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzOworCQkvLyBDcmVhdGUgcHJvZHVjdCBzdWIgQ2F0ZWdvcnkyLS0+UHJvZHVjdC1zdWJjYXQKKwkJY3JlYXRlU3ViQ2F0ZWdvcnlTdWNjZXNzKHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHVzZXIsIGNvbXBvbmVudFR5cGUsCisJCQkJYXVkaXRUeXBlKTsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCisJCS8vIENyZWF0ZSBwcm9kdWN0IHN1YiBDYXRlZ29yeTMtLT5QUm9EVUNULVNVQmNhdAorCQkvLyBTaG91bGQgYmUgY3JlYXRlZCBDYXRlZ29yeTMtLT5Qcm9kdWN0LXN1YmNhdAorCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMS5zZXROYW1lKCJQUm9EVUNULVNVQmNhdCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjEsIHVzZXIsIGNvbXBvbmVudFR5cGUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHVzZXIsIGNvbXBvbmVudFR5cGUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24xLnNldE5hbWUocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMS5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24xLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24xLCB1c2VyLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBhdWRpdFR5cGUpOworCX0KKworCS8vIEJlbm55CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVN1YkNhdGVnb3J5QWxyZWFkeUV4aXN0SW5EaWZmZXJlbnRSZXNvdXJjZUNhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24xLnNldE5hbWUoIlJlc291cmNFLXN1YkNhdCIpOworCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbjEsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24xLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbjEuc2V0TmFtZShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbjEuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24xKTsgLy8gYWxzbworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZXQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2F0YWxvZworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB1bmlxZUlkCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uMSwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbjEsIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RTdWJDYXRlZ29yeUFscmVhZHlFeGlzdEluRGlmZmVyZW50UHJvZHVjdENhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJQVVESVRfUFJPRFVDVF9UWVBFKTsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMS5zZXROYW1lKCJQUm9EVUNULVNVQmNhdCIpOworCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMSwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMSwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24xLnNldE5hbWUocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMS5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMSk7IC8vIGFsc28KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2V0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGFsb2cKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdW5pcWVJZAorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMSwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uMSwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlU3ViQ2F0ZWdvcnlBbHJlYWR5RXhpc3RJbkNhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24xLnNldE5hbWUoIlJlc291cmNFLXN1YkNhdCIpOworCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbjEsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uMSwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9TVUJfQ0FURUdPUllfRVhJU1RTX0ZPUl9DQVRFR09SWSwgU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMsCisJCQkJQVVESVRfUkVTT1VSQ0VfVFlQRSwgQVVESVRfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24xLmdldE5hbWUoKSwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFN1YkNhdGVnb3J5QWxyZWFkeUV4aXN0SW5DYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCUFVRElUX1BST0RVQ1RfVFlQRSk7CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEuc2V0TmFtZSgiUHJvZHVjVC1zdWJDYXQiKTsKKwkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0FMUkVBRFlfRVhJU1RTLAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfU1VCX0NBVEVHT1JZLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24xLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9FWElTVFNfRk9SX0NBVEVHT1JZLCBTVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUywgQVVESVRfUFJPRFVDVF9UWVBFLAorCQkJCUFVRElUX1BST0RVQ1RfVFlQRSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjEuZ2V0TmFtZSgpLCBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRTYW1lTm9ybWFsaXplZFN1YkNhdGVnb3J5TmFtZUZvclJlY291cmNlQW5kUHJvZHVjdENhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFkZCBzdWItY2F0ZWdvdHkgbmFtZSAiU3ViQ2FUIiB0byByZXNvdXJjZSBjYXRlZ29yeQorCQkvLyBhZGQgc3ViLWNhdGVnb3R5IG5hbWUgIlNVYmNBdCIgdG8gcHJvZHVjdCBjYXRlZ29yeQorCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJTdWJDYVQiKTsgLy8gbm9ybWFsaXplZCAnc3ViY2F0JworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlNVYmNBdCIpOyAvLyBub3JtYWxpemVkICdzdWJjYXQnCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNQcm9kdWN0U3RyYXRlZ2lzdFVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlU3ViQ2F0ZWdvcnlCeU5vbkFkbWluVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNUZXN0ZXJVc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Rlc3RlclVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VTdWJDYXRlZ29yeUJ5UHJvZHVjU3RyYXRlZ2lzdFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0U3ViQ2F0ZWdvcnlCeU5vblByb2R1Y1N0cmF0ZWdpc3RVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNEZXNpZ25lclVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0Rlc2lnbmVyVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RTdWJDYXRlZ29yeUJ5QWRtaW5Vc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgQVVESVRfUFJPRFVDVF9UWVBFKTsKKwl9CisKKwkvLyBASWdub3JlKCJERTE3NjI0NSIpCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVN1YkNhdGVnb3J5Rm9yTm9uRXhpc3RpbmdDb21wb25lbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBub25TdXBwb3J0ZWRDb21wb25lbnRUeXBlID0gIk5vbkV4aXN0aW5nQ29tcG9uZW50VHlwZSI7IC8vIGluc3RlYWQKKwkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlc291cmNlL3Byb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgbm9uU3VwcG9ydGVkQ29tcG9uZW50VHlwZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQsCisJCQkJU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBub25TdXBwb3J0ZWRDb21wb25lbnRUeXBlKTsKKwl9CisKKwkvLyBASWdub3JlKCJERTE3NjI0NSIpCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0U3ViQ2F0ZWdvcnlGb3JOb25FeGlzdGluZ0NvbXBvbmVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5vblN1cHBvcnRlZENvbXBvbmVudFR5cGUgPSAiTm9uRXhpc3RpbmdDb21wb25lbnRUeXBlIjsgLy8gaW5zdGVhZAorCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmVzb3VyY2UvcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgbm9uU3VwcG9ydGVkQ29tcG9uZW50VHlwZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUocHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdEZhaWx1cmUoQUREX1NVQl9DQVRFR09SWSwgcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCwKKwkJCQlTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIG5vblN1cHBvcnRlZENvbXBvbmVudFR5cGUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZVN1YkNhdGVnb3J5QnlBZG1pbigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTZXJ2aWNlIGRvZXNuJ3QgaGF2ZSBzdWItY2F0ZWdvcnkKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU0VSVklDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0RmFpbHVyZShBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQsCisJCQkJU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZVN1YkNhdGVnb3J5QnlQcm9kdWN0U3RyYXRlZ2lzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTZXJ2aWNlIGRvZXNuJ3QgaGF2ZSBzdWItY2F0ZWdvcnkKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQsCisJCQkJU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9TRVJWSUNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VTdWJDYXRlZ29yeUZvck5vbkV4aXN0aW5nQ2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24xMDAuc2V0VW5pcXVlSWQocmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24xMDAuZ2V0TmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uMTAwLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uMTAwLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQsCisJCQkJU1RBVFVTX0NPREVfTk9UX0ZPVU5ELCBBVURJVF9SRVNPVVJDRV9UWVBFLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSwgQ0FURUdPUlksICIiKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24xMDAuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFN1YkNhdGVnb3J5Rm9yTm9uRXhpc3RpbmdDYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uMjAwLnNldFVuaXF1ZUlkKHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yMDAuZ2V0TmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjIwMCwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlOb3RFeGlzdHNJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yMDAuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24gLy8gbmVlZCB0byBjaGFuZ2UgQWN0aW9uU3RhdHVzCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24yMDAsCisJCQkJcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckRldGFpbHMsCisJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgQVVESVRfUFJPRFVDVF9UWVBFLAorCQkJCVBST0RVQ1RfQ09NUE9ORU5UX1RZUEUsIENBVEVHT1JZLCAiIik7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wMSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUtIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7IC8vIGFsc28KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2V0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhdGFsb2cKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdW5pcWVJZAorCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wMigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUrIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wMygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUmIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlBbGxvd2VkY2hhcmFjdGVyc18wNCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUuIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5QWxsb3dlZGNoYXJhY3RlcnNfMDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFJyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5QWxsb3dlZGNoYXJhY3RlcnNfMDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFPSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5QWxsb3dlZGNoYXJhY3RlcnNfMDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFOiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5QWxsb3dlZGNoYXJhY3RlcnNfMDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFQCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5QWxsb3dlZGNoYXJhY3RlcnNfMDkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFXyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5QWxsb3dlZGNoYXJhY3RlcnNfMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFIyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5QWxsb3dlZGNoYXJhY3RlcnNfMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMTIzNEFiY2RFIGQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxMjM0QWJjZEUgRCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeUFsbG93ZWRjaGFyYWN0ZXJzXzEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIjEyMzRBYmNkRSAgICZfPSsuLScjOkAgZCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIjEyMzRBYmNkRSAmXz0rLi0nIzpAIEQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZW1vdmVTcGFjZUZyb21CZWdpbm5pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiICBDYXRlZ29yeTAxIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkwMSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeVJlbW92ZVNwYWNlRnJvbUVuZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTAxICAgICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5MDEiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZW1vdmVFeHRyYVNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5ICAgIDAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkgMDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZW1vdmVFeHRyYUFtcGVyc2FuZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeSYmICYwMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5JiAmMDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZW1vdmVFeHRyYURhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvclktLSAtLTAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvclktIC0wMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeVJlbW92ZUV4dHJhUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlR29yeSsrKysgKzAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZUdvcnkrICswMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeVJlbW92ZUV4dHJhUGVyaW9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5Li4uLiAuMDIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeS4gLjAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5UmVtb3ZlRXh0cmFBcG9zdHJvcGhlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhVGVnb3J5JycnICcwMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhVGVnb3J5JyAnMDIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZW1vdmVFeHRyYUhhc2h0YWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkjIyMgIzAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnkjICMwMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeVJlbW92ZUV4dHJFZXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnk9PT0gPTAyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnk9ID0wMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeVJlbW92ZUV4dHJDb2xvbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTo6OiA6MDIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJDYXRlZ29yeTogOjAyIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5UmVtb3ZlRXh0ckF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5QEBAIEBhMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5QCBAYTIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZW1vdmVFeHRyYVVuZGVyc2NvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnlfX18gXzIyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQ2F0ZWdvcnlfIF8yMiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeUZpcnN0V29yZFN0YXJ0V2l0aE51bWJlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIxQ2F0ZWdvcnkgb25lIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiMUNhdGVnb3J5IE9uZSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJLy8gQnVnCisJLy8gRGVzYz08QUNUSU9OID0gIkFkZFN1YkNhdGVnb3J5IiBNT0RJRklFUiA9ICJKaW1teSBIZW5kcml4KGpoMDAwMykiCisJLy8gQ0FURUdPUllfTkFNRSA9ICJDYXRlZ29yeTEiIFNVQl9DQVRFR09SWV9OQU1FID0gIiZBYmNEMTIzIiBHUk9VUElOR19OQU1FCisJLy8gPSAiIiBSRVNPVVJDRV9UWVBFID0gIlJlc291cmNlIiBTVEFUVVMgPSAiNDAwIiBERVNDID0gIlNWQzQ1NTY6IEVycm9yOgorCS8vIEludmFsaWQgUmVzb3VyY2Ugc3ViLWNhdGVnb3J5IG5hbWUgZm9ybWF0LiI+CisJLy8gREVTQz1TVkM0NTU2OiBFcnJvcjogSW52YWxpZFJlc291cmNlc3ViLWNhdGVnb3J5bmFtZWZvcm1hdC4sCisJLy8gQElnbm9yZQorCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlGaXJzdFdvcmRTdGFydFdpdGhOb25BbHBoYU51bWVyaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVGhlIGZpcnN0IHdvcmQgbXVzdCBzdGFydCB3aXRoIGFuIGFscGhhLW51bWVyaWMgY2hhcmFjdGVyIFthLVogQS4uWiwKKwkJLy8gMC4uOV0KKwkJY2hhciBpbnZhbGlkQ2hhcnNbXSA9IHsgJyYnLCAnLScsICcrJywgJy4nLCAnXCcnLCAnIycsICc9JywgJzonLCAnQCcsICdfJyB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRDaGFycy5sZW5ndGg7IGkrKykgeworCQkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZShpbnZhbGlkQ2hhcnNbaV0gKyAiQWJjRDEyMyIpOworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJCUFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfRk9STUFULCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJCUFVRElUX1JFU09VUkNFX1RZUEUsIEFVRElUX1JFU09VUkNFX1RZUEUsIFNVQl9DQVRFR09SWSk7CisKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wMSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBdCBhbmQgVCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0ICYgVCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeVJlcGxhY2VBbmRXaXRoQW1wZXJzYW5kXzAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0IGFuZCB0Iik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQXQgJiBUIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5UmVwbGFjZUFuZFdpdGhBbXBlcnNhbmRfMDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQXRhbmQgVCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5UmVwbGFjZUFuZFdpdGhBbXBlcnNhbmRfMDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQXQgYW5kVCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0IEFuZFQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlSZXBsYWNlQW5kV2l0aEFtcGVyc2FuZF8wNSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgYW5kIEF0dFQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBbmQgQXR0VCIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeVJlcGxhY2VBbmRXaXRoQW1wZXJzYW5kXzA2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0dFQgYW5kICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkF0dFQgQW5kIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5UmVwbGFjZUFuZFdpdGhBbXBlcnNhbmRfMDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiIGFuZCBhIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQW5kIGEiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbk1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBc2RmZ2hqUTIzNDU2Nzg5MEAjLiY6Ky1fIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbk1heExlbmd0aEFmdGVyTm9ybWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgIEEgalEyMzQgQEBAX19fICsrKyBBdCBhbmQgVCBhbmQgYW5kICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkEgSlEyMzQgQF8gKyBBdCAmIFQgJiBBbmQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCS8vIGJ1ZyA6CisJLy8gRGVzYz08QUNUSU9OID0gIkFkZFN1YkNhdGVnb3J5IiBNT0RJRklFUiA9ICJKaW1teSBIZW5kcml4KGpoMDAwMykiCisJLy8gQ0FURUdPUllfTkFNRSA9ICJDYXRlZ29yeTEiIFNVQl9DQVRFR09SWV9OQU1FID0gIiBBYmRmZ2hCQ1ZhIGpRMjM0IEBAX19fCisJLy8gKysrIEF0IGFuZCBUICIgR1JPVVBJTkdfTkFNRSA9ICIiIFJFU09VUkNFX1RZUEUgPSAiUmVzb3VyY2UiIFNUQVRVUyA9CisJLy8gIjQwMCIgREVTQyA9ICJTVkM0NTU1OiBFcnJvcjogSW52YWxpZCBSZXNvdXJjZSBzdWItY2F0ZWdvcnkgbmFtZQorCS8vIGxlbmd0aC4iPgorCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkV4Y2VlZE1heExlbmd0aEFmdGVyTm9ybWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgIEFiZGZnaEJDVmEgalEyMzQgQEBfX18gKysrIEF0IGFuZCBUICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEgsCisJCQkJU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9SRVNPVVJDRV9UWVBFLCBBVURJVF9SRVNPVVJDRV9UWVBFLCBTVUJfQ0FURUdPUlkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbk1pbkxlbmd0aEFmdGVyTm9ybWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgIEFUJiYmJiYmJiYmVCAgICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkFUJlQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCS8vIGJ1ZworCS8vIERlc2M9PEFDVElPTiA9ICJBZGRTdWJDYXRlZ29yeSIgTU9ESUZJRVIgPSAiSmltbXkgSGVuZHJpeChqaDAwMDMpIgorCS8vIENBVEVHT1JZX05BTUUgPSAiQ2F0ZWdvcnkxIiBTVUJfQ0FURUdPUllfTkFNRSA9ICIgQSBhbmQgVCAiIEdST1VQSU5HX05BTUUKKwkvLyA9ICIiIFJFU09VUkNFX1RZUEUgPSAiUmVzb3VyY2UiIFNUQVRVUyA9ICI0MDAiIERFU0MgPSAiU1ZDNDU1NTogRXJyb3I6CisJLy8gSW52YWxpZCBSZXNvdXJjZSBzdWItY2F0ZWdvcnkgbmFtZSBsZW5ndGguIj4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5TmFtZVZhbGlkYXRpb25MZXNzVGhhbk1pbkxlbmd0aEFmdGVyTm9ybWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgIEEmJiZUICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEgsCisJCQkJU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBBVURJVF9SRVNPVVJDRV9UWVBFLCBBVURJVF9SRVNPVVJDRV9UWVBFLCBTVUJfQ0FURUdPUlkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdEZhaWx1cmUoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVCwKKwkJCQlTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIEFVRElUX1JFU09VUkNFX1RZUEUsIEFVRElUX1JFU09VUkNFX1RZUEUsIFNVQl9DQVRFR09SWSk7CisJfQorCisJLy8gYnVnCisJLy8gRGVzYz08QUNUSU9OID0gIkFkZFN1YkNhdGVnb3J5IiBNT0RJRklFUiA9ICJKaW1teSBIZW5kcml4KGpoMDAwMykiCisJLy8gQ0FURUdPUllfTkFNRSA9ICJDYXRlZ29yeTEiIFNVQl9DQVRFR09SWV9OQU1FID0gIkFiY0QxMjN+IiBHUk9VUElOR19OQU1FCisJLy8gPSAiIiBSRVNPVVJDRV9UWVBFID0gIlJlc291cmNlIiBTVEFUVVMgPSAiNDAwIiBERVNDID0gIlNWQzQ1NTY6IEVycm9yOgorCS8vIEludmFsaWQgUmVzb3VyY2Ugc3ViLWNhdGVnb3J5IG5hbWUgZm9ybWF0LiI+CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeU5hbWVWYWxpZGF0aW9uSW52YWxpZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhciBpbnZhbGlkQ2hhcnNbXSA9IHsgJ34nLCAnIScsICckJywgJyUnLCAnXicsICcqJywgJygnLCAnKScsICciJywgJ3snLCAnfScsICdbJywgJ10nLCAnPycsICc+JywgJzwnLCAnLycsCisJCQkJJ3wnLCAnXFwnLCAnLCcgfTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkQ2hhcnMubGVuZ3RoOyBpKyspIHsKKwkJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkFiY0QxMjMiICsgaW52YWxpZENoYXJzW2ldKTsKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdEZhaWx1cmUoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9GT1JNQVQsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQkJQVVESVRfUkVTT1VSQ0VfVFlQRSwgQVVESVRfUkVTT1VSQ0VfVFlQRSwgU1VCX0NBVEVHT1JZKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkZpcnN0TGV0dGVyT2ZLZXlXb3Jkc0NhcGl0YWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoImJlTk55IHNoYVkgbWljaEVsIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQmVOTnkgU2hhWSBNaWNoRWwiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wMSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgYmFuayBPRiBhbWVyaWNhICAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJCYW5rIG9mIEFtZXJpY2EiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wMigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJUSEUgYW1lcmljYSBiYW5rICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiVEhFIEFtZXJpY2EgQmFuayIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiAgIEEgYmFuayBPRiBhbWVyaWNhICAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBIEJhbmsgb2YgQW1lcmljYSIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiAgYmFuayAgYW1lcmljYSBpcyBBIGJpZyBiYW4gICIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkJhbmsgQW1lcmljYSBJcyBhIEJpZyBCYW4iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wNSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgYU4gYXBwbGUgY29tUGFueSBpbkMgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiQU4gQXBwbGUgQ29tUGFueSBJbkMiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wNigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgZWF0IEFOIGFwcGxlIEFOQU4iKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJFYXQgYW4gQXBwbGUgQU5BTiIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzA3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiB1bml0ZWQgc3RhdGVzIE9GIGFtZXJpY0EgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNBIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5TmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiIG9GIHVuaXRlZCBzdGF0ZXMgT0YgYW1lciAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJPRiBVbml0ZWQgU3RhdGVzIG9mIEFtZXIiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18wOSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgdG8gQXBwbGUgVE8gYXQmVCBUT08gIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiVG8gQXBwbGUgdG8gQXQmVCBUT08iKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18xMCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgZWF0IGFwcGxlIEFTIHlvdSBsaWlpa2VhcyAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJFYXQgQXBwbGUgYXMgWW91IExpaWlrZWFzIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5TmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiIGFzIHlvdSBtYXkgd2FudCAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJBcyBZb3UgTWF5IFdhbnQiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3ViQ2F0ZWdvcnlOYW1lVmFsaWRhdGlvbkNvbmp1bmN0aW9uc18xMigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCIgdGhlIGJhbmsgT0YgYW1lcmljYSAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJUaGUgQmFuayBvZiBBbWVyaWNhIik7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9DUkVBVEVELCBBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHN1YkNhdGVnb3J5TmFtZVZhbGlkYXRpb25Db25qdW5jdGlvbnNfMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiICBUbyB0ZWwtdG90byAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmNyZWF0ZVN1YkNhdGVnb3J5KHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXROYW1lKCJUbyBUZWwtdG90byIpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnN1YkNhdGVnb3J5QXVkaXRTdWNjZXNzKEFERF9TVUJfQ0FURUdPUlksIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfQ1JFQVRFRCwgQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdWJDYXRlZ29yeU5hbWVWYWxpZGF0aW9uQ29uanVuY3Rpb25zXzE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIiAgIHRlbC1hdml2IFRvICAgbGEgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBTdWIgY2F0ZWdvcnkiLCBTVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZSgiVGVsLWF2aXYgdG8gTGEiKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDcmVhdGVTdWJDYXRlZ29yeVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCXJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5zdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhBRERfU1VCX0NBVEVHT1JZLCByZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIEFVRElUX1JFU09VUkNFX1RZUEUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU3ViQ2F0ZWdvcnlIdHRwQ3NwVXNlcklkSGVhZGVySXNNaXNzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeUh0dHBDc3BBdHVVaWRJc01pc3NpbmcoCisJCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sIHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTiwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzUmVzdCA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXMoc2RuY0FkbWluVXNlckRldGFpbHMsCisJCQkJUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGFsbCBjYXRlZ29yaWVzICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShnZXRBbGxDYXRlZ29yaWVzUmVzdCwKKwkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLm5hbWUoKSk7CisJCUV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCBleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCgpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBRERfU1VCX0NBVEVHT1JZKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcigiIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0Q2F0ZWdvcnlOYW1lKHJlc291cmNlQ2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkvLyBTdHJpbmcgc3ViQ2F0ZWdvcnlOYW1lID0gKHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uICE9IG51bGwgPworCQkvLyByZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkgOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdWJDYXRlZ29yeU5hbWUocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJLy8gU3RyaW5nIGdyb3VwaW5nTmFtZSA9IChncm91cGluZ0RlZmluaXRpb24gIT0gbnVsbCA/CisJCS8vIGdyb3VwaW5nRGVmaW5pdGlvbi5nZXROYW1lKCkgOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRHcm91cGluZ05hbWUoIiIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZShBVURJVF9SRVNPVVJDRV9UWVBFKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2YoU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTikpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeUF1ZGl0KGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIEFERF9TVUJfQ0FURUdPUlkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU3ViQ2F0ZWdvcnlIdHRwQ3NwVXNlcklkSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNBZG1pblVzZXJEZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNBZG1pblVzZXJEZXRhaWxzMS5zZXRVc2VySWQoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlU3ViQ2F0ZWdvcnkocmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzMSwgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFN1YiBjYXRlZ29yeSIsIFNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT04sCisJCQkJY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzKHNkbmNBZG1pblVzZXJEZXRhaWxzLAorCQkJCVJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhbGwgY2F0ZWdvcmllcyAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldEFsbENhdGVnb3JpZXNSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDYXRlZ29yeVZhbGlkYXRpb25VdGlscy52ZXJpZnlTdWJDYXRlZ29yeU5vdEV4aXN0c0luR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24pOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCkpOworCQlFeHBlY3RlZENhdGVnb3J5QXVkaXQgZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZENhdGVnb3J5QXVkaXQoKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQUREX1NVQl9DQVRFR09SWSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIoIiIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldENhdGVnb3J5TmFtZShyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gU3RyaW5nIHN1YkNhdGVnb3J5TmFtZSA9IChyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiAhPSBudWxsID8KKwkJLy8gcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpIDogQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3ViQ2F0ZWdvcnlOYW1lKHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCS8vIFN0cmluZyBncm91cGluZ05hbWUgPSAoZ3JvdXBpbmdEZWZpbml0aW9uICE9IG51bGwgPworCQkvLyBncm91cGluZ0RlZmluaXRpb24uZ2V0TmFtZSgpIDogQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0R3JvdXBpbmdOYW1lKCIiKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKFN0cmluZy52YWx1ZU9mKFNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT04pKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlBdWRpdChleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LCBBRERfU1VCX0NBVEVHT1JZKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlwcml2YXRlIHZvaWQgY3JlYXRlU3ViQ2F0ZWdvcnlTdWNjZXNzKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24sCisJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBVc2VyIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBTdHJpbmcgY29tcG9uZW50VHlwZSwKKwkJCVN0cmluZyBhdWRpdFR5cGUpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShzdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJY2F0ZWdvcnlEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywgY29tcG9uZW50VHlwZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgU3ViIGNhdGVnb3J5IiwgU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVTdWJDYXRlZ29yeVJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3JlYXRlU3ViQ2F0ZWdvcnlSZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVJlc3QsIHN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuc3ViQ2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoQUREX1NVQl9DQVRFR09SWSwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzdWJDYXRlZ29yeURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX0NSRUFURUQsIGF1ZGl0VHlwZSk7CisJCS8vIGdldCBzZXJ2aWNlIGNhdGVnb3J5IGFuZCB2YWxpZGF0ZSB0aGF0IGNhdGVnb3J5IGFkZGVkIGFzIGRlZmluZWQKKwkJLy8gKGFsc28gc2V0IGNhdGFsb2cgdW5pcWVJZCkKKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywgY29tcG9uZW50VHlwZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMudmVyaWZ5U3ViQ2F0ZWdvcnlFeGlzdEluR2V0UmVzcG9uc2UoZ2V0QWxsQ2F0ZWdvcmllc1Jlc3QsCisJCQkJY2F0ZWdvcnlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHN1YkNhdGVnb3J5RGVmaW5pdGlvbik7IC8vIGFsc28KKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZXQKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRhbG9nCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdW5pcWVJZAorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VDYXRlZ29yeUhpZXJhcmNoeVN1Y2Nlc3NGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludCBudW1PZlN1YkNhdGVnb3JpZXMgPSAzOworCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gc3ViQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTsKKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5OworCQlTdHJpbmcgc3ViTmFtZSA9IHJlc291cmNlU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZlN1YkNhdGVnb3JpZXM7IGkrKykgeworCQkJcmVzb3VyY2VTdWJDYXRlZ29yeURlZmluaXRpb24uc2V0TmFtZShzdWJOYW1lICsgaSk7CisJCQlyZXN0UmVzcG9uc2UgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShyZXNvdXJjZVN1YkNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCQkJcmVzb3VyY2VDYXRlZ29yeURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzLCBSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCQlzdWJDYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5jbGFzcyk7CisJCQlzdWJDYXRlZ29yaWVzLmFkZChzdWJDYXRlZ29yeSk7CisJCX0KKwkJUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlSRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWxsIGNhdGVnb3JpZXMgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuR2V0Q2F0ZWdvcnlIaWVyYXJjaHlBdWRpdFN1Y2Nlc3MoR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSwgQVVESVRfUkVTT1VSQ0VfVFlQRSwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YiA6IHN1YkNhdGVnb3JpZXMpIHsKKwkJCUNhdGVnb3J5VmFsaWRhdGlvblV0aWxzLnZlcmlmeVN1YkNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKGdldEFsbENhdGVnb3JpZXNSZXN0LAorCQkJCQlyZXNvdXJjZUNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBzdWIpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kZXZDSS9DUlVERXh0ZXJuYWxBUEkuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2RldkNJL0NSVURFeHRlcm5hbEFQSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOGU4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kZXZDSS9DUlVERXh0ZXJuYWxBUEkuamF2YQpAQCAtMCwwICsxLDEwMTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmRldkNJOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwUmVzcG9uc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkNsb3NlYWJsZUh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cERlbGV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5TdHJpbmdFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljUmVzcG9uc2VIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkVudGl0eVV0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLnBhcnNlci5KU09OUGFyc2VyOworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5wYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Bc3NldFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdFVpRG93bmxvYWREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZEV4dGVybmFsQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXNzZXRSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdlbmVyYWxVdGlsaXR5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDUlVERXh0ZXJuYWxBUEkgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ1JVREV4dGVybmFsQVBJLmNsYXNzLmdldE5hbWUoKSk7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBMT0FEX0FSVElGQUNUX1BBWUxPQUQgPSAiVUhWVVZGa3RWWE5sY2kxTFpYa3RSbWxzWlMweU9pQnpjMmd0Y25OaERRcEZibU55ZVhCMGFXOXVPaUJoWlhNeU5UWXRZMkpqRFFwRGIyMXRaVzV3T0EwSyI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBMT0FEX0FSVElGQUNUX05BTUUgPSAiVExWX3Bydi5wcGsiOworCisJcHJvdGVjdGVkIENvbmZpZyBjb25maWcgPSBDb25maWcuaW5zdGFuY2UoKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGFjY2VwdEhlYWRlckRhdGUgPSAiYXBwbGljYXRpb24vanNvbiI7CisKKwlwcm90ZWN0ZWQgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwlwcm90ZWN0ZWQgSlNPTlBhcnNlciBqc29uUGFyc2VyID0gbmV3IEpTT05QYXJzZXIoKTsKKworCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZVZlcnNpb247CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY1VzZXJEZXRhaWxzOworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlsczsKKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRDb25zdW1lcih0cnVlKTsKKwl9CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIENSVURFeHRlcm5hbEFQSSgpIHsKKwkJc3VwZXIobmFtZSwgQ1JVREV4dGVybmFsQVBJLmNsYXNzLmdldE5hbWUoKSk7CisKKwl9CisKKwlARGF0YVByb3ZpZGVyKG5hbWUgPSAidXBsb2FkQXJ0aWZhY3RPblZGVmlhRXh0ZXJuYWxBUEkiKQorCXB1YmxpYyBzdGF0aWMgT2JqZWN0W11bXSBkYXRhUHJvdmlkZXJVcGxvYWRBcnRpZmFjdE9uVkZWaWFFeHRlcm5hbEFQSSgpIHsKKwkJcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sICJEQ0FFX0pTT04iIH0sCisJCQkJeyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCAiRENBRV9QT0xJQ1kiIH0sIHsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIkRDQUVfRVZFTlQiIH0sCisJCQkJeyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCAiQVBQQ19DT05GSUciIH0sIHsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIkRDQUVfRE9DIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIkRDQUVfVE9TQ0EiIH0sIHsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIllBTkdfWE1MIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIlZORl9DQVRBTE9HIiB9LCB7IExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsICJWRl9MSUNFTlNFIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIlZFTkRPUl9MSUNFTlNFIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIk1PREVMX1FVRVJZX1NQRUMiIH0sIHsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIk9USEVSIiB9IH07CisJfQorCisJLy8gRXh0ZXJuYWwgQVBJCisJLy8gVXBsb2FkIGFydGlmYWN0IG9uIFZGIHZpYSBleHRlcm5hbCBBUEkgLSBoYXBweSBmbG93CisJQFRlc3QoZGF0YVByb3ZpZGVyID0gInVwbG9hZEFydGlmYWN0T25WRlZpYUV4dGVybmFsQVBJIikKKwlwdWJsaWMgdm9pZCB1cGxvYWRBcnRpZmFjdE9uVkZWaWFFeHRlcm5hbEFQSShMaWZlQ3ljbGVTdGF0ZXNFbnVtIGNob3NlbkxpZmVDeWNsZVN0YXRlLCBTdHJpbmcgYXJ0aWZhY3RUeXBlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE1ldGhvZCBwYXNzZWQgdmFyaWFibGUKKwkJLy8gYXJ0aWZhY3RUeXBlID0gIllBTkdfWE1MIjsKKwkJLy8gY2hvc2VuTGlmZUN5Y2xlU3RhdGUgPSBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUOworCisJCS8vIFN0cmluZyBvcGVyYXRpb25UeXBlID0gIlVwbG9hZCI7CisJCVVzZXJSb2xlRW51bSBjcmVhdG9yVXNlciA9IFVzZXJSb2xlRW51bS5ERVNJR05FUjsKKwkJU3RyaW5nIHNwZWNpZmljVXNlciA9ICJERVNJR05FUiI7CisKKwkJQ29tcG9uZW50IHJlc291cmNlRGV0YWlscyA9IGdldENvbXBvbmVudEluVGFyZ2V0TGlmZUN5Y2xlU3RhdGUoInZmIiwgY3JlYXRvclVzZXIsIGNob3NlbkxpZmVDeWNsZVN0YXRlKTsKKworCQlTdHJpbmcgcmVzb3VyY2VVVUlEID0gcmVzb3VyY2VEZXRhaWxzLmdldFVVSUQoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBVVUlEOiAiICsgcmVzb3VyY2VVVUlEKTsKKworCQkvLyBnZXQgYXJ0aWZhY3QgZGF0YQorCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0QXJ0aWZhY3RCeVR5cGUoIkFiY2QiLCBhcnRpZmFjdFR5cGUsIHRydWUpOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5leHRlcm5hbEFQSVVwbG9hZEFydGlmYWN0T2ZUaGVBc3NldChyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLnZhbHVlT2Yoc3BlY2lmaWNVc2VyLnRvVXBwZXJDYXNlKCkpKSwgYXJ0aWZhY3RSZXFEZXRhaWxzKTsKKworCQlJbnRlZ2VyIHJlc3BvbnNlQ29kZSA9IHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDA7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2VDb2RlLCBleHBlY3RlZENvZGUsICJSZXNwb25zZSBjb2RlIGlzIG5vdCBjb3JyZWN0LiIpOworCisJCS8vIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEphdmFPYmplY3QgPQorCQkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uID0KKwkJLy8gQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX1VQTE9BRF9CWV9BUEk7CisJCS8vIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEV4dGVybmFsQXVkaXQgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RXh0ZXJuYWxBcnRpZmFjdEF1ZGl0U3VjY2VzcyhBc3NldFR5cGVFbnVtLlJFU09VUkNFUywKKwkJLy8gYWN0aW9uLCBhcnRpZmFjdEphdmFPYmplY3QsIHJlc291cmNlVVVJRCk7CisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEV4dGVybmFsQXVkaXQsCisJCS8vIEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQURfQllfQVBJLmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQERhdGFQcm92aWRlcihuYW1lID0gInVwbG9hZEFydGlmYWN0T25TZXJ2aWNlVmlhRXh0ZXJuYWxBUEkiKQorCXB1YmxpYyBzdGF0aWMgT2JqZWN0W11bXSBkYXRhUHJvdmlkZXJVcGxvYWRBcnRpZmFjdE9uU2VydmljZVZpYUV4dGVybmFsQVBJKCkgeworCQlyZXR1cm4gbmV3IE9iamVjdFtdW10geworCQkJCS8vIHtMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCAiWUFOR19YTUwifSwKKwkJCQkvLyB7TGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgIlZORl9DQVRBTE9HIn0sCisJCQkJLy8ge0xpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsICJNT0RFTF9JTlZFTlRPUllfUFJPRklMRSJ9LAorCQkJCS8vIHtMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCAiTU9ERUxfUVVFUllfU1BFQyJ9LAorCQkJCS8vIHtMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCAiT1RIRVIifSwKKwkJCQl7IExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgIllBTkdfWE1MIiB9LCB7IExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgIlZORl9DQVRBTE9HIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCAiTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEUiIH0sCisJCQkJeyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sICJNT0RFTF9RVUVSWV9TUEVDIiB9LCB7IExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgIk9USEVSIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCwgIllBTkdfWE1MIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCwgIlZORl9DQVRBTE9HIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCwgIk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFIiB9LAorCQkJCXsgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCwgIk1PREVMX1FVRVJZX1NQRUMiIH0sCisJCQkJeyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULCAiT1RIRVIiIH0gfTsKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAidXBsb2FkQXJ0aWZhY3RPblNlcnZpY2VWaWFFeHRlcm5hbEFQSSIpCisJcHVibGljIHZvaWQgdXBsb2FkQXJ0aWZhY3RPblNlcnZpY2VWaWFFeHRlcm5hbEFQSShMaWZlQ3ljbGVTdGF0ZXNFbnVtIGNob3NlbkxpZmVDeWNsZVN0YXRlLCBTdHJpbmcgYXJ0aWZhY3RUeXBlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudCByZXNvdXJjZURldGFpbHMgPSBnZXRDb21wb25lbnRJblRhcmdldExpZmVDeWNsZVN0YXRlKCJzZXJ2aWNlIiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCWNob3NlbkxpZmVDeWNsZVN0YXRlKTsKKwkJZG91YmxlIHJlc291cmNlVmVyc2lvbiA9IERvdWJsZS5wYXJzZURvdWJsZShyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKworCQkvLyBnZXQgYXJ0aWZhY3QgZGF0YQorCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0QXJ0aWZhY3RCeVR5cGUoIkFiY2QiLCBhcnRpZmFjdFR5cGUsIHRydWUpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VydmljZSBVVUlEOiAiICsgcmVzb3VyY2VEZXRhaWxzLmdldFVVSUQoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VydmljZSBWZXJzaW9uOiAiICsgcmVzb3VyY2VWZXJzaW9uKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aWNlIGxpZmUgY3ljbGUgc3RhdGU6ICIgKyBjaG9zZW5MaWZlQ3ljbGVTdGF0ZSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiQXJ0aWZhY3QgVHlwZTogIiArIGFydGlmYWN0UmVxRGV0YWlscy5nZXRBcnRpZmFjdFR5cGUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmV4dGVybmFsQVBJVXBsb2FkQXJ0aWZhY3RPZlRoZUFzc2V0KHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCBhcnRpZmFjdFJlcURldGFpbHMpOworCisJCS8vIENoZWNrIHJlc3BvbnNlIG9mIGV4dGVybmFsIEFQSQorCQlJbnRlZ2VyIHJlc3BvbnNlQ29kZSA9IHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDA7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2VDb2RlLCBleHBlY3RlZENvZGUsICJSZXNwb25zZSBjb2RlIGlzIG5vdCBjb3JyZWN0LiIpOworCisJCS8vIFRPRE86IENoZWNrIGF1ZGl0aW5nIGZvciB1cGxvYWQgb3BlYXJ0aW9uCisJCS8vIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEphdmFPYmplY3QgPQorCQkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uID0KKwkJLy8gQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX1VQTE9BRF9CWV9BUEk7CisJCS8vIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEV4dGVybmFsQXVkaXQgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RXh0ZXJuYWxBcnRpZmFjdEF1ZGl0U3VjY2VzcyhBc3NldFR5cGVFbnVtLlJFU09VUkNFUywKKwkJLy8gYWN0aW9uLCBhcnRpZmFjdEphdmFPYmplY3QsIHJlc291cmNlVVVJRCk7CisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEV4dGVybmFsQXVkaXQsCisJCS8vIEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQURfQllfQVBJLmdldE5hbWUoKSwgbnVsbCk7CisKKwkJLy8gQ2hlY2sgU2VydmljZSB2ZXJzaW9uIChpbmNyZWFzZSBieSBvbmUgaWYgbm90IGluIGNoZWNrb3V0KQorCQlpZiAoIWNob3NlbkxpZmVDeWNsZVN0YXRlLmVxdWFscyhMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKSkgeworCQkJZG91YmxlIHJlc291cmNlTmV3VmVyc2lvbiA9IERvdWJsZS5wYXJzZURvdWJsZShyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKworCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlVmVyc2lvbik7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2VOZXdWZXJzaW9uKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXJ0aWZhY3RPcGVyYXRpb25PblJJVmlhRXh0ZXJuYWxBUEkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTWV0aG9kIHBhc3NlZCB2YXJpYWJsZQorCQlTdHJpbmcgb3BlcmF0aW9uVHlwZSA9ICJVcGxvYWQiOworCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIGNob3NlbkxpZmVDeWNsZVN0YXRlID0gTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVDsKKwkJVXNlclJvbGVFbnVtIGNyZWF0b3JVc2VyID0gVXNlclJvbGVFbnVtLkRFU0lHTkVSOworCQlTdHJpbmcgc3BlY2lmaWNVc2VyID0gIkRFU0lHTkVSIjsKKwkJU3RyaW5nIGFydGlmYWN0VHlwZSA9ICJPVEhFUiI7CisKKwkJQ29tcG9uZW50IHJlc291cmNlRGV0YWlscyA9IGdldENvbXBvbmVudEluVGFyZ2V0TGlmZUN5Y2xlU3RhdGUoInNlcnZpY2UiLCBjcmVhdG9yVXNlciwgY2hvc2VuTGlmZUN5Y2xlU3RhdGUpOworCQlDb21wb25lbnQgcmVzb3VyY2VJbnN0YW5jZURldGFpbHMgPSBnZXRDb21wb25lbnRJblRhcmdldExpZmVDeWNsZVN0YXRlKCJ2ZiIsIGNyZWF0b3JVc2VyLCBjaG9zZW5MaWZlQ3ljbGVTdGF0ZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudFJlc291cmNlSW5zdGFuY2VEZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZUluc3RhbmNlRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLAorCQkJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKworCQlTdHJpbmcgcmVzb3VyY2VVVUlEID0gcmVzb3VyY2VEZXRhaWxzLmdldFVVSUQoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBVVUlEOiAiICsgcmVzb3VyY2VVVUlEKTsKKworCQkvLyBnZXQgYXJ0aWZhY3QgZGF0YQorCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0QXJ0aWZhY3RCeVR5cGUoIkFiY2QiLCBhcnRpZmFjdFR5cGUsIHRydWUpOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBudWxsOworCisJCWlmIChvcGVyYXRpb25UeXBlLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ1cGxvYWQiKSkgeworCQkJcmVzdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZXh0ZXJuYWxBUElVcGxvYWRBcnRpZmFjdE9mVGhlQXNzZXQocmVzb3VyY2VEZXRhaWxzLAorCQkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0udmFsdWVPZihzcGVjaWZpY1VzZXIudG9VcHBlckNhc2UoKSkpLAorCQkJCQlhcnRpZmFjdFJlcURldGFpbHMpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCIxMjM0Iik7CisJCX0KKworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydEFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbiA9IEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQURfQllfQVBJOworCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRFeHRlcm5hbEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEV4dGVybmFsQXJ0aWZhY3RBdWRpdFN1Y2Nlc3MoCisJCQkJQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIGFjdGlvbiwgYXJ0aWZhY3RKYXZhT2JqZWN0LCByZXNvdXJjZVVVSUQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRFeHRlcm5hbEF1ZGl0LAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQURfQllfQVBJLmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBhcnRpZmFjdFZpYUV4dGVybmFsQVBJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gLy8gTWV0aG9kIHBhc3NlZCB2YXJpYWJsZQorCS8vIFN0cmluZyBvcGVyYXRpb25UeXBlID0gIlVwbG9hZCI7CisJLy8gU3RyaW5nIGFzc2V0VHlwZSA9ICJ2ZiI7CisJLy8gTGlmZUN5Y2xlU3RhdGVzRW51bSBjaG9zZW5MaWZlQ3ljbGVTdGF0ZSA9IExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQ7CisJLy8gU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlQXNzZXRUeXBlID0gInZmIjsKKwkvLyBMaWZlQ3ljbGVTdGF0ZXNFbnVtIGNvbXBvbmVudEluc3RhbmNlQ2hvc2VuTGlmZUN5Y2xlU3RhdGUgPQorCS8vIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQ7CisJLy8gVXNlclJvbGVFbnVtIGNyZWF0b3JVc2VyID0gVXNlclJvbGVFbnVtLkRFU0lHTkVSOworCS8vIFN0cmluZyBzcGVjaWZpY1VzZXIgPSAiREVTSUdORVIiOworCS8vIFN0cmluZyBhcnRpZmFjdFR5cGUgPSAiSEVBVCI7CisJLy8KKwkvLworCS8vIENvbXBvbmVudCByZXNvdXJjZURldGFpbHMgPSBudWxsOworCS8vIENvbXBvbmVudCByZXNvdXJjZUluc3RhbmNlRGV0YWlscyA9IG51bGw7CisJLy8gQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZURldGFpbHMgPSBudWxsOworCS8vCisJLy8gU3RyaW5nIHJlc291cmNlVVVJRCA9IG51bGw7CisJLy8gU3RyaW5nIHJlc291cmNlVHlwZSA9IG51bGw7CisJLy8gU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lID0gbnVsbDsKKwkvLworCS8vIC8vIENyZWF0ZSByZXNvdXJjZSAmIHJlc291cmNlIGluc3RhbmNlIG9mIHJlcXVlc3RlZCB0eXBlIGFuZCBzdGF0ZQorCS8vIGlmIChhc3NldFR5cGUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInZmIikpIHsKKwkvLyByZXNvdXJjZURldGFpbHMgPSBnZXRDb21wb25lbnRJblRhcmdldExpZmVDeWNsZVN0YXRlKCJ2ZiIsIGNyZWF0b3JVc2VyLAorCS8vIGNob3NlbkxpZmVDeWNsZVN0YXRlKTsKKwkvLyB9IGVsc2UgaWYgKGFzc2V0VHlwZS50b0xvd2VyQ2FzZSgpLmVxdWFscygic2VydmljZSIpKSB7CisJLy8gcmVzb3VyY2VEZXRhaWxzID0gZ2V0Q29tcG9uZW50SW5UYXJnZXRMaWZlQ3ljbGVTdGF0ZSgic2VydmljZSIsCisJLy8gY3JlYXRvclVzZXIsIGNob3NlbkxpZmVDeWNsZVN0YXRlKTsKKwkvLyB9IGVsc2UgaWYgKGFzc2V0VHlwZS50b0xvd2VyQ2FzZSgpLmVxdWFscygicmkiKSkgeworCS8vIHJlc291cmNlSW5zdGFuY2VEZXRhaWxzID0gZ2V0Q29tcG9uZW50SW5UYXJnZXRMaWZlQ3ljbGVTdGF0ZSgidmYiLAorCS8vIGNyZWF0b3JVc2VyLCBjaG9zZW5MaWZlQ3ljbGVTdGF0ZSk7CisJLy8gaWYoY29tcG9uZW50SW5zdGFuY2VBc3NldFR5cGUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInZmIikpIHsKKwkvLyByZXNvdXJjZURldGFpbHMgPSBnZXRDb21wb25lbnRJblRhcmdldExpZmVDeWNsZVN0YXRlKCJ2ZiIsIGNyZWF0b3JVc2VyLAorCS8vIGNvbXBvbmVudEluc3RhbmNlQ2hvc2VuTGlmZUN5Y2xlU3RhdGUpOworCS8vIGNvbXBvbmVudFJlc291cmNlSW5zdGFuY2VEZXRhaWxzID0KKwkvLyBBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlSW5zdGFuY2VEZXRhaWxzLAorCS8vIHJlc291cmNlRGV0YWlscywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkvLyB9IGVsc2UgaWYgKGNvbXBvbmVudEluc3RhbmNlQXNzZXRUeXBlLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJzZXJ2aWNlIikpIHsKKwkvLyByZXNvdXJjZURldGFpbHMgPSBnZXRDb21wb25lbnRJblRhcmdldExpZmVDeWNsZVN0YXRlKCJzZXJ2aWNlIiwKKwkvLyBjcmVhdG9yVXNlciwgY29tcG9uZW50SW5zdGFuY2VDaG9zZW5MaWZlQ3ljbGVTdGF0ZSk7CisJLy8gY29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZURldGFpbHMgPQorCS8vIEF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VJbnN0YW5jZURldGFpbHMsCisJLy8gcmVzb3VyY2VEZXRhaWxzLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCS8vIH0gZWxzZSB7CisJLy8gQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgdHJ1ZSwgIkNvbXBvbmVudCBpbnN0YW5jZSBhc3NldCB0eXBlIGlzCisJLy8gd3JvbmcuIik7CisJLy8gfQorCS8vIH0gZWxzZSB7CisJLy8gQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgdHJ1ZSwgIkFzc2V0IHR5cGUgaXMgd3JvbmcuIik7CisJLy8gfQorCS8vCisJLy8KKwkvLyAvLyBwcmludCB1dWlkICYgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorCS8vIGlmIChhc3NldFR5cGUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInJpIikpIHsKKwkvLyByZXNvdXJjZVVVSUQgPSByZXNvdXJjZURldGFpbHMuZ2V0VVVJRCgpOworCS8vIHJlc291cmNlSW5zdGFuY2VOYW1lID0KKwkvLyBjb21wb25lbnRSZXNvdXJjZUluc3RhbmNlRGV0YWlscy5nZXROb3JtYWxpemVkTmFtZSgpOworCS8vCisJLy8KKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIFVVSUQ6ICIgKyByZXNvdXJjZVVVSUQpOworCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgaW5zdGFuY2UgbmFtZTogIiArIHJlc291cmNlSW5zdGFuY2VOYW1lKTsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIHR5cGU6ICIgKyByZXNvdXJjZVR5cGUpOworCS8vIH0gZWxzZSB7CisJLy8gcmVzb3VyY2VVVUlEID0gcmVzb3VyY2VEZXRhaWxzLmdldFVVSUQoKTsKKwkvLworCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgVVVJRDogIiArIHJlc291cmNlVVVJRCk7CisJLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSB0eXBlOiAiICsgcmVzb3VyY2VUeXBlKTsKKwkvLyB9CisJLy8KKwkvLyAvLyBnZXQgYXJ0aWZhY3QgZGF0YQorCS8vIEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdFJlcURldGFpbHMgPQorCS8vIEVsZW1lbnRGYWN0b3J5LmdldEFydGlmYWN0QnlUeXBlKCJBYmNkIiwgYXJ0aWZhY3RUeXBlLCB0cnVlKTsKKwkvLworCS8vLy8gUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTsKKwkvLyAvLyB1c2luZyByZXN0IGV4dGVybmFsIGFwaQorCS8vLy8gaWYob3BlcmF0aW9uVHlwZS50b0xvd2VyQ2FzZSgpLmVxdWFscygidXBsb2FkIikpIHsKKwkvLy8vIGlmICghYXNzZXRUeXBlLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJyaSIpKSB7CisJLy8gUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9CisJLy8gQXJ0aWZhY3RSZXN0VXRpbHMuZXh0ZXJuYWxBUElVcGxvYWRBcnRpZmFjdE9mVGhlQXNzZXQocmVzb3VyY2VEZXRhaWxzLAorCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS52YWx1ZU9mKHNwZWNpZmljVXNlci50b1VwcGVyQ2FzZSgpKSksCisJLy8gYXJ0aWZhY3RSZXFEZXRhaWxzKTsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIjEyMzQiKTsKKwkvLy8vIH0gZWxzZSB7CisJLy8vLworCS8vLy8gfQorCS8vLy8gfSBlbHNlIHsKKwkvLy8vCisJLy8vLyB9CisJLy8KKwkvLyBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RKYXZhT2JqZWN0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCS8vLy8gQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbiA9IEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQURfQllfQVBJOworCS8vIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb24gPSBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfVVBMT0FEX0JZX0FQSTsKKwkvLyBFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRFeHRlcm5hbEF1ZGl0ID0KKwkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RXh0ZXJuYWxBcnRpZmFjdEF1ZGl0U3VjY2VzcyhBc3NldFR5cGVFbnVtLlJFU09VUkNFUywKKwkvLyBhY3Rpb24sIGFydGlmYWN0SmF2YU9iamVjdCwgcmVzb3VyY2VVVUlEKTsKKwkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRFeHRlcm5hbEF1ZGl0LAorCS8vIEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQURfQllfQVBJLmdldE5hbWUoKSwgbnVsbCk7CisJLy8KKwkvLworCS8vCisJLy8KKwkvLyB9CisJLy8KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBc3NldE1ldGFkYXRhV2l0aE5vbkNlcnRpZmllZFJlc291cmNlSW5zdGFuY2VzQW5kQXJ0aWZhY3RzU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlIHJlc291cmNlVkYgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlSZXNvdXJjZSByZXNvdXJjZTIgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzb3VyY2UyID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZTIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCVJlc291cmNlIHJlc291cmNlMyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZTMgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZTIsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZTMsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJLy8gVE9ETworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXN0UmVzcG9uc2U+IGFydGlmYWN0RGVmaW5pdGlvbiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uVkVORE9SX0xJQ0VOU0UsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUcsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwKKwkJCQl0cnVlKTsKKwkJcmVzb3VyY2VWRiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcigKKwkJCQlSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZVZGLmdldFVuaXF1ZUlkKCkpLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldEFzc2V0TWV0YWRhdGFCeUFzc2V0VHlwZUFuZFV1aWQodHJ1ZSwgQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsCisJCQkJcmVzb3VyY2VWRi5nZXRVVUlEKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhhc3NldFJlc3BvbnNlKTsKKworCQlSZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgcmVzb3VyY2VBc3NldE1ldGFkYXRhID0gQXNzZXRSZXN0VXRpbHMuZ2V0UmVzb3VyY2VBc3NldE1ldGFkYXRhKGFzc2V0UmVzcG9uc2UpOworCQlBc3NldFJlc3RVdGlscy5yZXNvdXJjZU1ldGFkYXRhVmFsaWRhdGlvcihyZXNvdXJjZUFzc2V0TWV0YWRhdGEsIHJlc291cmNlVkYsIEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdEFzc2V0TWV0YWRhdGFBdWRpdChBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgcmVzb3VyY2VWRik7CisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwKKwkJLy8gQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQS5nZXROYW1lKCksIG51bGwpOworCisJfQorCisJcHVibGljIENvbXBvbmVudCBnZXRDb21wb25lbnRJblRhcmdldExpZmVDeWNsZVN0YXRlKFN0cmluZyBjb21wb25lbnRUeXBlLCBVc2VyUm9sZUVudW0gY3JlYXRvclVzZXIsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIHRhcmdldExpZmVDeWNsZVN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50IHJlc291cmNlRGV0YWlscyA9IG51bGw7CisKKwkJaWYgKGNvbXBvbmVudFR5cGUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInZmIikpIHsKKwkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiBjcmVhdGVkUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCQkuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsCisJCQkJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgY3JlYXRvclVzZXIsIHRydWUpOworCQkJcmVzb3VyY2VEZXRhaWxzID0gY3JlYXRlZFJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJcmVzb3VyY2VEZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlscywgY3JlYXRvclVzZXIsIHRhcmdldExpZmVDeWNsZVN0YXRlLCB0cnVlKS5nZXRMZWZ0KCk7CisJCX0gZWxzZSB7CisJCQlFaXRoZXI8U2VydmljZSwgUmVzdFJlc3BvbnNlPiBjcmVhdGVkUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShjcmVhdG9yVXNlciwKKwkJCQkJdHJ1ZSk7CisJCQlyZXNvdXJjZURldGFpbHMgPSBjcmVhdGVkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJCQlyZXNvdXJjZURldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzLCBjcmVhdG9yVXNlciwgdGFyZ2V0TGlmZUN5Y2xlU3RhdGUsIHRydWUpLmdldExlZnQoKTsKKwkJfQorCisJCXJldHVybiByZXNvdXJjZURldGFpbHM7CisJfQorCisJLy8gLy8gRXh0ZXJuYWwgQVBJIC0gRG93bmxvYWQgYXJ0aWZhY3QgZm9yIHJlc291cmNlIC0gbmVnYXRpdmUgdGVzdAorCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgaygpIHRocm93cyBFeGNlcHRpb24geworCS8vIFJlc291cmNlIHJlc291cmNlRGV0YWlsc1ZGOworCS8vIEVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiBjcmVhdGVkUmVzb3VyY2UgPQorCS8vIEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkYsCisJLy8gTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsCisJLy8gVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkvLyByZXNvdXJjZURldGFpbHNWRiA9IGNyZWF0ZWRSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkvLyBBcnRpZmFjdERlZmluaXRpb24gaGVhdEFydGlmYWN0ID0KKwkvLyBBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQsCisJLy8gcmVzb3VyY2VEZXRhaWxzVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJLy8gcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZURldGFpbHNWRik7CisJLy8KKwkvLyBTdHJpbmcgcmVzb3VyY2VVVUlEID0gcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VVVJRCgpOworCS8vIFN0cmluZyBhcnRpZmFjdFVVSUQgPSBoZWF0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RVVUlEKCk7CisJLy8KKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIFVVSUQ6ICIgKyByZXNvdXJjZVVVSUQpOworCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJ0aWZhY3QgVVVJRDogIiArIGFydGlmYWN0VVVJRCk7CisJLy8KKwkvLyBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0KKwkvLyBBcnRpZmFjdFJlc3RVdGlscy5nZXRSZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdEV4dGVybmFsQVBJKHJlc291cmNlVVVJRCwKKwkvLyAiZGZzZ2Zkc2czMjQiLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLAorCS8vICJSZXNvdXJjZSIpOworCS8vCisJLy8gSW50ZWdlciByZXNwb25zZUNvZGUgPSByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJLy8gSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDA7CisJLy8gQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZUNvZGUsZXhwZWN0ZWRDb2RlLCAiUmVzcG9uc2UgY29kZSBpcyBub3QKKwkvLyBjb3JyZWN0LiIpOworCS8vIH0KKwkvLworCS8vCisJLy8KKwkvLworCS8vCisJLy8gLy8gRXh0ZXJuYWwgQVBJIC0gRG93bmxvYWQgYXJ0aWZhY3QgZm9yIHNlcnZpY2UgLSBuZWdhdGl2ZSB0ZXN0CisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBkb3dubG9hZEFydGlmYWN0RnJvbVNlcnZpY2VWaWFFeHRlcm5hbEFQSSgpIHRocm93cyBFeGNlcHRpb24KKwkvLyB7CisJLy8KKwkvLyBTZXJ2aWNlIHJlc291cmNlRGV0YWlsc1NlcnZpY2U7CisJLy8gRWl0aGVyPFNlcnZpY2UsIFJlc3RSZXNwb25zZT4gY3JlYXRlZFJlc291cmNlID0KKwkvLyBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCS8vIHJlc291cmNlRGV0YWlsc1NlcnZpY2UgPSBjcmVhdGVkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJLy8KKwkvLyBBcnRpZmFjdERlZmluaXRpb24gaGVhdEFydGlmYWN0ID0KKwkvLyBBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLAorCS8vIHJlc291cmNlRGV0YWlsc1NlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwKKwkvLyB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkvLworCS8vIFN0cmluZyByZXNvdXJjZVVVSUQgPSByZXNvdXJjZURldGFpbHNTZXJ2aWNlLmdldFVVSUQoKTsKKwkvLyBTdHJpbmcgYXJ0aWZhY3RVVUlEID0gaGVhdEFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpOworCS8vCisJLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBVVUlEOiAiICsgcmVzb3VyY2VVVUlEKTsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFydGlmYWN0IFVVSUQ6ICIgKyBhcnRpZmFjdFVVSUQpOworCS8vCisJLy8gUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9CisJLy8gQXJ0aWZhY3RSZXN0VXRpbHMuZ2V0UmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RFeHRlcm5hbEFQSShyZXNvdXJjZVVVSUQsCisJLy8gYXJ0aWZhY3RVVUlELCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLAorCS8vICJTZXJ2aWNlIik7CisJLy8KKwkvLyBJbnRlZ2VyIHJlc3BvbnNlQ29kZSA9IHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkvLyBJbnRlZ2VyIGV4cGVjdGVkQ29kZSA9IDIwMDsKKwkvLyBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlQ29kZSxleHBlY3RlZENvZGUsICJSZXNwb25zZSBjb2RlIGlzIG5vdAorCS8vIGNvcnJlY3QuIik7CisJLy8KKwkvLyBTdHJpbmcgcmVzcG9uc2UgPSByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwkvLworCS8vIFN0cmluZyBwYXlsb2FkRGF0YSA9CisJLy8gImFHVmhkRjkwWlcxd2JHRjBaVjkyWlhKemFXOXVPaUF5TURFekxUQTFMVEl6RFFvTkNtUmxjMk55YVhCMGFXOXVPaUJUYVcxd2JHVWdkR1Z0Y0d4aGRHVWdkRzhnWkdWd2JHOTVJR0VnYzNSaFkyc2dkMmwwYUNCMGQyOGdkbWx5ZEhWaGJDQnRZV05vYVc1bElHbHVjM1JoYm1ObGN3MEtEUXB3WVhKaGJXVjBaWEp6T2cwS0lDQnBiV0ZuWlY5dVlXMWxYekU2RFFvZ0lDQWdkSGx3WlRvZ2MzUnlhVzVuRFFvZ0lDQWdiR0ZpWld3NklFbHRZV2RsSUU1aGJXVU5DaUFnSUNCa1pYTmpjbWx3ZEdsdmJqb2dVME5QU1UxQlIwVWdVM0JsWTJsbWVTQmhiaUJwYldGblpTQnVZVzFsSUdadmNpQnBibk4wWVc1alpURU5DaUFnSUNCa1pXWmhkV3gwT2lCamFYSnliM010TUM0ekxqRXRlRGcyWHpZMERRb2dJR2x0WVdkbFgyNWhiV1ZmTWpvTkNpQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0JzWVdKbGJEb2dTVzFoWjJVZ1RtRnRaUTBLSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJUUTA5SlRVRkhSU0JUY0dWamFXWjVJR0Z1SUdsdFlXZGxJRzVoYldVZ1ptOXlJR2x1YzNSaGJtTmxNZzBLSUNBZ0lHUmxabUYxYkhRNklHTnBjbkp2Y3kwd0xqTXVNUzE0T0RaZk5qUU5DaUFnYm1WMGQyOXlhMTlwWkRvTkNpQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0JzWVdKbGJEb2dUbVYwZDI5eWF5QkpSQTBLSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJUUTA5T1JWUlhUMUpMSUU1bGRIZHZjbXNnZEc4Z1ltVWdkWE5sWkNCbWIzSWdkR2hsSUdOdmJYQjFkR1VnYVc1emRHRnVZMlVOQ2lBZ0lDQm9hV1JrWlc0NklIUnlkV1VOQ2lBZ0lDQmpiMjV6ZEhKaGFXNTBjem9OQ2lBZ0lDQWdJQzBnYkdWdVozUm9PaUI3SUcxcGJqb2dOaXdnYldGNE9pQTRJSDBOQ2lBZ0lDQWdJQ0FnWkdWelkzSnBjSFJwYjI0NklGQmhjM04zYjNKa0lHeGxibWQwYUNCdGRYTjBJR0psSUdKbGRIZGxaVzRnTmlCaGJtUWdPQ0JqYUdGeVlXTjBaWEp6TGcwS0lDQWdJQ0FnTFNCeVlXNW5aVG9nZXlCdGFXNDZJRFlzSUcxaGVEb2dPQ0I5RFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlNZVzVuWlNCa1pYTmpjbWx3ZEdsdmJnMEtJQ0FnSUNBZ0xTQmhiR3h2ZDJWa1gzWmhiSFZsY3pvTkNpQWdJQ0FnSUNBZ0xTQnRNUzV6YldGc2JBMEtJQ0FnSUNBZ0lDQXRJRzB4TG0xbFpHbDFiUTBLSUNBZ0lDQWdJQ0F0SUcweExteGhjbWRsRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQkJiR3h2ZDJWa0lIWmhiSFZsY3lCa1pYTmpjbWx3ZEdsdmJnMEtJQ0FnSUNBZ0xTQmhiR3h2ZDJWa1gzQmhkSFJsY200NklDSmJZUzE2UVMxYU1DMDVYU3NpRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlFZWE56ZDI5eVpDQnRkWE4wSUdOdmJuTnBjM1FnYjJZZ1kyaGhjbUZqZEdWeWN5QmhibVFnYm5WdFltVnljeUJ2Ym14NUxnMEtJQ0FnSUNBZ0xTQmhiR3h2ZDJWa1gzQmhkSFJsY200NklDSmJRUzFhWFN0YllTMTZRUzFhTUMwNVhTb2lEUW9nSUNBZ0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCUVlYTnpkMjl5WkNCdGRYTjBJSE4wWVhKMElIZHBkR2dnWVc0Z2RYQndaWEpqWVhObElHTm9ZWEpoWTNSbGNpNE5DaUFnSUNBZ0lDMGdZM1Z6ZEc5dFgyTnZibk4wY21GcGJuUTZJRzV2ZG1FdWEyVjVjR0ZwY2cwS0lDQWdJQ0FnSUNCa1pYTmpjbWx3ZEdsdmJqb2dRM1Z6ZEc5dElHUmxjMk55YVhCMGFXOXVEUW9OQ25KbGMyOTFjbU5sY3pvTkNpQWdiWGxmYVc1emRHRnVZMlV4T2cwS0lDQWdJSFI1Y0dVNklFOVRPanBPYjNaaE9qcFRaWEoyWlhJTkNpQWdJQ0J3Y205d1pYSjBhV1Z6T2cwS0lDQWdJQ0FnYVcxaFoyVTZJSHNnWjJWMFgzQmhjbUZ0T2lCcGJXRm5aVjl1WVcxbFh6RWdmUTBLSUNBZ0lDQWdabXhoZG05eU9pQnRNUzV6YldGc2JBMEtJQ0FnSUNBZ2JtVjBkMjl5YTNNNkRRb2dJQ0FnSUNBZ0lDMGdibVYwZDI5eWF5QTZJSHNnWjJWMFgzQmhjbUZ0SURvZ2JtVjBkMjl5YTE5cFpDQjlEUW9nSUcxNVgybHVjM1JoYm1ObE1qb05DaUFnSUNCMGVYQmxPaUJQVXpvNlRtOTJZVG82VTJWeWRtVnlEUW9nSUNBZ2NISnZjR1Z5ZEdsbGN6b05DaUFnSUNBZ0lHbHRZV2RsT2lCN0lHZGxkRjl3WVhKaGJUb2dhVzFoWjJWZmJtRnRaVjh5SUgwTkNpQWdJQ0FnSUdac1lYWnZjam9nYlRFdWRHbHVlUTBLSUNBZ0lDQWdibVYwZDI5eWEzTTZEUW9nSUNBZ0lDQWdJQzBnYm1WMGQyOXlheUE2SUhzZ1oyVjBYM0JoY21GdElEb2dibVYwZDI5eWExOXBaQ0I5IjsKKwkvLyBTdHJpbmcgZGVjb2RlZFBheXBsb2FkID0gRGVjb2Rlci5kZWNvZGUocGF5bG9hZERhdGEpOworCS8vCisJLy8gQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZSwgZGVjb2RlZFBheXBsb2FkLCAiUmVzcG9uc2UgZGVwbG95bWVudAorCS8vIGFydGlmYWN0IG5vdCBjb3JyZWN0LiIpOworCS8vCisJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkFydGlmYWN0RG93bmxvYWQiOworCS8vCisJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gbmV3CisJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCgpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShyZXNvdXJjZURldGFpbHNTZXJ2aWNlLmdldE5hbWUoKSk7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAwIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vCisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDT05TVU1FUl9JRCgiY2kiKTsKKwkvLyBTdHJpbmcgcmVzb3VyY2VfdXJsID0KKwkvLyBTdHJpbmcuZm9ybWF0KCIvYXNkYy92MS9jYXRhbG9nL3NlcnZpY2VzLyVzL2FydGlmYWN0cy8lcyIsIHJlc291cmNlVVVJRCwKKwkvLyBhcnRpZmFjdFVVSUQpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UkVTT1VSQ0VfVVJMKHJlc291cmNlX3VybCk7CisJLy8KKwkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0RG93bmxvYWRFeHRlcm5hbEFQSShleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCS8vIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJLy8gfQorCS8vCisJLy8KKwkvLworCS8vCisJLy8KKwkvLworCS8vIC8vIEV4dGVybmFsIEFQSSAtIERvd25sb2FkIENvbXBvbmVudEluc3RhbmNlIGFydGlmYWN0IG9mIHNlcnZpY2UgLQorCS8vIG5lZ2F0aXZlIHRlc3QKKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkCisJLy8gZG93bmxvYWRBcnRpZmFjdE9mQ29tcG9uZW50SW5zdGFuY2VGcm9tU2VydmljZVZpYUV4dGVybmFsQVBJKCkgdGhyb3dzCisJLy8gRXhjZXB0aW9uIHsKKwkvLworCS8vIEVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXNvdXJjZURldGFpbHNWRl8wMWUgPQorCS8vIEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkYsCisJLy8gTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsCisJLy8gVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkvLyBDb21wb25lbnQgcmVzb3VyY2VEZXRhaWxzVkZfMDEgPSByZXNvdXJjZURldGFpbHNWRl8wMWUubGVmdCgpLnZhbHVlKCk7CisJLy8gQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRBcnRpZmFjdCA9CisJLy8gQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULAorCS8vIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCS8vCisJLy8gcmVzb3VyY2VEZXRhaWxzVkZfMDEgPQorCS8vIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCS8vIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJLy8KKwkvLyBTZXJ2aWNlIHJlc291cmNlRGV0YWlsc1NlcnZpY2U7CisJLy8gRWl0aGVyPFNlcnZpY2UsIFJlc3RSZXNwb25zZT4gY3JlYXRlZFJlc291cmNlID0KKwkvLyBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCS8vIHJlc291cmNlRGV0YWlsc1NlcnZpY2UgPSBjcmVhdGVkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJLy8KKwkvLworCS8vIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlRGV0YWlsc1ZGMWluc18wMSA9CisJLy8gQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZURldGFpbHNWRl8wMSwKKwkvLyByZXNvdXJjZURldGFpbHNTZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCS8vCisJLy8KKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tIik7CisJLy8KKwkvLworCS8vIFN0cmluZyByZXNvdXJjZVVVSUQgPSByZXNvdXJjZURldGFpbHNTZXJ2aWNlLmdldFVVSUQoKTsKKwkvLyBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VVSUQgPSByZXNvdXJjZURldGFpbHNWRjFpbnNfMDEuZ2V0VW5pcXVlSWQoKTsKKwkvLyBTdHJpbmcgYXJ0aWZhY3RVVUlEID0gaGVhdEFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpOworCS8vCisJLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBVVUlEOiAiICsgcmVzb3VyY2VVVUlEKTsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBvbmVudCBpbnN0YW5jZSBVSUQ6ICIgKyBjb21wb25lbnRJbnN0YW5jZVVJRCk7CisJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdCBVVUlEOiAiICsgYXJ0aWZhY3RVVUlEKTsKKwkvLworCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPQorCS8vIEFydGlmYWN0UmVzdFV0aWxzLmdldENvbXBvbmVudEluc3RhbmNlRGVwbG95bWVudEFydGlmYWN0RXh0ZXJuYWxBUEkocmVzb3VyY2VVVUlELAorCS8vIGNvbXBvbmVudEluc3RhbmNlVUlELCBhcnRpZmFjdFVVSUQsCisJLy8gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgIlNlcnZpY2UiKTsKKwkvLy8vCisJLy8gSW50ZWdlciByZXNwb25zZUNvZGUgPSByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJLy8gSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDA7CisJLy8gQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZUNvZGUsZXhwZWN0ZWRDb2RlLCAiUmVzcG9uc2UgY29kZSBpcyBub3QKKwkvLyBjb3JyZWN0LiIpOworCS8vCisJLy8gU3RyaW5nIHJlc3BvbnNlID0gcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisJLy8KKwkvLyBTdHJpbmcgcGF5bG9hZERhdGEgPQorCS8vICJhR1ZoZEY5MFpXMXdiR0YwWlY5MlpYSnphVzl1T2lBeU1ERXpMVEExTFRJekRRb05DbVJsYzJOeWFYQjBhVzl1T2lCVGFXMXdiR1VnZEdWdGNHeGhkR1VnZEc4Z1pHVndiRzk1SUdFZ2MzUmhZMnNnZDJsMGFDQjBkMjhnZG1seWRIVmhiQ0J0WVdOb2FXNWxJR2x1YzNSaGJtTmxjdzBLRFFwd1lYSmhiV1YwWlhKek9nMEtJQ0JwYldGblpWOXVZVzFsWHpFNkRRb2dJQ0FnZEhsd1pUb2djM1J5YVc1bkRRb2dJQ0FnYkdGaVpXdzZJRWx0WVdkbElFNWhiV1VOQ2lBZ0lDQmtaWE5qY21sd2RHbHZiam9nVTBOUFNVMUJSMFVnVTNCbFkybG1lU0JoYmlCcGJXRm5aU0J1WVcxbElHWnZjaUJwYm5OMFlXNWpaVEVOQ2lBZ0lDQmtaV1poZFd4ME9pQmphWEp5YjNNdE1DNHpMakV0ZURnMlh6WTBEUW9nSUdsdFlXZGxYMjVoYldWZk1qb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nU1cxaFoyVWdUbUZ0WlEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOUpUVUZIUlNCVGNHVmphV1o1SUdGdUlHbHRZV2RsSUc1aGJXVWdabTl5SUdsdWMzUmhibU5sTWcwS0lDQWdJR1JsWm1GMWJIUTZJR05wY25KdmN5MHdMak11TVMxNE9EWmZOalFOQ2lBZ2JtVjBkMjl5YTE5cFpEb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nVG1WMGQyOXlheUJKUkEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOU9SVlJYVDFKTElFNWxkSGR2Y21zZ2RHOGdZbVVnZFhObFpDQm1iM0lnZEdobElHTnZiWEIxZEdVZ2FXNXpkR0Z1WTJVTkNpQWdJQ0JvYVdSa1pXNDZJSFJ5ZFdVTkNpQWdJQ0JqYjI1emRISmhhVzUwY3pvTkNpQWdJQ0FnSUMwZ2JHVnVaM1JvT2lCN0lHMXBiam9nTml3Z2JXRjRPaUE0SUgwTkNpQWdJQ0FnSUNBZ1pHVnpZM0pwY0hScGIyNDZJRkJoYzNOM2IzSmtJR3hsYm1kMGFDQnRkWE4wSUdKbElHSmxkSGRsWlc0Z05pQmhibVFnT0NCamFHRnlZV04wWlhKekxnMEtJQ0FnSUNBZ0xTQnlZVzVuWlRvZ2V5QnRhVzQ2SURZc0lHMWhlRG9nT0NCOURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJTWVc1blpTQmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM1poYkhWbGN6b05DaUFnSUNBZ0lDQWdMU0J0TVM1emJXRnNiQTBLSUNBZ0lDQWdJQ0F0SUcweExtMWxaR2wxYlEwS0lDQWdJQ0FnSUNBdElHMHhMbXhoY21kbERRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJCYkd4dmQyVmtJSFpoYkhWbGN5QmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piWVMxNlFTMWFNQzA1WFNzaURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJRWVhOemQyOXlaQ0J0ZFhOMElHTnZibk5wYzNRZ2IyWWdZMmhoY21GamRHVnljeUJoYm1RZ2JuVnRZbVZ5Y3lCdmJteDVMZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piUVMxYVhTdGJZUzE2UVMxYU1DMDVYU29pRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlFZWE56ZDI5eVpDQnRkWE4wSUhOMFlYSjBJSGRwZEdnZ1lXNGdkWEJ3WlhKallYTmxJR05vWVhKaFkzUmxjaTROQ2lBZ0lDQWdJQzBnWTNWemRHOXRYMk52Ym5OMGNtRnBiblE2SUc1dmRtRXVhMlY1Y0dGcGNnMEtJQ0FnSUNBZ0lDQmtaWE5qY21sd2RHbHZiam9nUTNWemRHOXRJR1JsYzJOeWFYQjBhVzl1RFFvTkNuSmxjMjkxY21ObGN6b05DaUFnYlhsZmFXNXpkR0Z1WTJVeE9nMEtJQ0FnSUhSNWNHVTZJRTlUT2pwT2IzWmhPanBUWlhKMlpYSU5DaUFnSUNCd2NtOXdaWEowYVdWek9nMEtJQ0FnSUNBZ2FXMWhaMlU2SUhzZ1oyVjBYM0JoY21GdE9pQnBiV0ZuWlY5dVlXMWxYekVnZlEwS0lDQWdJQ0FnWm14aGRtOXlPaUJ0TVM1emJXRnNiQTBLSUNBZ0lDQWdibVYwZDI5eWEzTTZEUW9nSUNBZ0lDQWdJQzBnYm1WMGQyOXlheUE2SUhzZ1oyVjBYM0JoY21GdElEb2dibVYwZDI5eWExOXBaQ0I5RFFvZ0lHMTVYMmx1YzNSaGJtTmxNam9OQ2lBZ0lDQjBlWEJsT2lCUFV6bzZUbTkyWVRvNlUyVnlkbVZ5RFFvZ0lDQWdjSEp2Y0dWeWRHbGxjem9OQ2lBZ0lDQWdJR2x0WVdkbE9pQjdJR2RsZEY5d1lYSmhiVG9nYVcxaFoyVmZibUZ0WlY4eUlIME5DaUFnSUNBZ0lHWnNZWFp2Y2pvZ2JURXVkR2x1ZVEwS0lDQWdJQ0FnYm1WMGQyOXlhM002RFFvZ0lDQWdJQ0FnSUMwZ2JtVjBkMjl5YXlBNklIc2daMlYwWDNCaGNtRnRJRG9nYm1WMGQyOXlhMTlwWkNCOSI7CisJLy8gU3RyaW5nIGRlY29kZWRQYXlwbG9hZCA9IERlY29kZXIuZGVjb2RlKHBheWxvYWREYXRhKTsKKwkvLworCS8vIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2UsIGRlY29kZWRQYXlwbG9hZCwgIlJlc3BvbnNlIGRlcGxveW1lbnQKKwkvLyBhcnRpZmFjdCBub3QgY29ycmVjdC4iKTsKKwkvLworCS8vIFN0cmluZyBhdWRpdEFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKwkvLworCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IG5ldworCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUocmVzb3VyY2VEZXRhaWxzVkYxaW5zXzAxLmdldE5hbWUoKSk7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAwIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vCisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDT05TVU1FUl9JRCgiY2kiKTsKKwkvLyBTdHJpbmcgcmVzb3VyY2VfdXJsID0KKwkvLyBTdHJpbmcuZm9ybWF0KCIvYXNkYy92MS9jYXRhbG9nL3NlcnZpY2VzLyVzL3Jlc291cmNlSW5zdGFuY2VzLyVzL2FydGlmYWN0cy8lcyIsCisJLy8gcmVzb3VyY2VVVUlELCBjb21wb25lbnRJbnN0YW5jZVVJRCwgYXJ0aWZhY3RVVUlEKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJFU09VUkNFX1VSTChyZXNvdXJjZV91cmwpOworCS8vCisJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdERvd25sb2FkRXh0ZXJuYWxBUEkoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vIH0KKwkvLworCS8vCisJLy8KKwkvLworCS8vCisJLy8KKwkvLworCS8vCisJLy8KKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RGcm9tUmVzb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8KKwkvLyBDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJLy8gdHJ5IHsKKwkvLyBTdHJpbmcganNvbkJvZHkgPSBjcmVhdGVVcGxvYWRBcnRpZmFjdEJvZHlKc29uKCk7CisJLy8KKwkvLyBTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCS8vIFN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQUREX0FSVElGQUNUX1RPX1JFU09VUkNFLAorCS8vIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQpOworCS8vIEh0dHBQb3N0IGh0dHBwb3N0ID0gY3JlYXRlUG9zdEFkZEFydGlmYWN0UmVxdWVhc3QoanNvbkJvZHksIHVybCwgdHJ1ZSk7CisJLy8gSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBwb3N0KTsKKwkvLyBpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImZhaWxlZCB0byBhZGQgYXJ0aWZhY3QiLCAyMDAsIHN0YXR1cyk7CisJLy8KKwkvLyBBcnRpZmFjdERlZmluaXRpb24gb3JpZ0FydGlmYWN0ID0gZ2V0QXJ0aWZhY3REYXRhRnJvbUpzb24oanNvbkJvZHkpOworCS8vIGFkZEFydGlmYWN0RGF0YUZyb21SZXNwb25zZShyZXNwb25zZSwgb3JpZ0FydGlmYWN0KTsKKwkvLyBTdHJpbmcgYXJ0aWZhY3RJZCA9IG9yaWdBcnRpZmFjdC5nZXRVbmlxdWVJZCgpOworCS8vCisJLy8gdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVJX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNULAorCS8vIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQsCisJLy8gYXJ0aWZhY3RJZCk7CisJLy8gSHR0cEdldCBodHRwR2V0ID0gY3JlYXRlR2V0UmVxdWVzdCh1cmwpOworCS8vIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBHZXQpOworCS8vIHN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJmYWlsZWQgdG8gZG93bmxvYWQgYXJ0aWZhY3QiLCAyMDAsIHN0YXR1cyk7CisJLy8KKwkvLyBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc3BvbnNlLmdldEVudGl0eSgpLmdldENvbnRlbnQoKTsKKwkvLyBBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPQorCS8vIGdldEFydGlmYWN0VWlEb3dubG9hZERhdGEoSU9VdGlscy50b1N0cmluZyhpbnB1dFN0cmVhbSkpOworCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiRG93bmxvYWRlZCBwYXlsb2FkIGlzIGRpZmZlcmVudCBmcm9tIHVwbG9hZGVkCisJLy8gb25lIiwgVVBMT0FEX0FSVElGQUNUX1BBWUxPQUQsCisJLy8gYXJ0aWZhY3RVaURvd25sb2FkRGF0YS5nZXRCYXNlNjRDb250ZW50cygpKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkRvd25sb2FkZWQgYXJ0aWZhY3QgbmFtZSBpcyBkaWZmZXJlbnQgZnJvbQorCS8vIHVwbG9hZGVkIG9uZSIsIFVQTE9BRF9BUlRJRkFDVF9OQU1FLAorCS8vIGFydGlmYWN0VWlEb3dubG9hZERhdGEuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCS8vCisJLy8gLy8gdmFsaWRhdGUgYXVkaXQKKwkvLworCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJLy8gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJLy8gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBcnRpZmFjdERhdGEoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBcnRpZmFjdERhdGFBdWRpdChvcmlnQXJ0aWZhY3QpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJBcnRpZmFjdFV1aWQob3JpZ0FydGlmYWN0LmdldFVuaXF1ZUlkKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldkFydGlmYWN0VXVpZCgiIik7CisJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCS8vIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJLy8KKwkvLyB9IGZpbmFsbHkgeworCS8vIGh0dHBjbGllbnQuY2xvc2UoKTsKKwkvLyB9CisJLy8KKwkvLyB9CisJLy8KKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RGcm9tU2VydmljZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkvLworCS8vIENsb3NlYWJsZUh0dHBDbGllbnQgaHR0cGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkvLworCS8vIHRyeSB7CisJLy8KKwkvLyBTdHJpbmcganNvblN0ciA9IGNyZWF0ZVVwbG9hZEFydGlmYWN0Qm9keUpzb24oKTsKKwkvLworCS8vIFN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQUREX0FSVElGQUNUX1RPX1NFUlZJQ0UsCisJLy8gY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkvLyBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkvLyBIdHRwUG9zdCBodHRwUG9zdCA9IGNyZWF0ZVBvc3RBZGRBcnRpZmFjdFJlcXVlYXN0KGpzb25TdHIsIHVybCwgdHJ1ZSk7CisJLy8gQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3VsdCA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwUG9zdCk7CisJLy8gaW50IHN0YXR1cyA9IHJlc3VsdC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiZmFpbGVkIHRvIGFkZCBhcnRpZmFjdCIsIDIwMCwgc3RhdHVzKTsKKwkvLworCS8vIEFydGlmYWN0RGVmaW5pdGlvbiBvcmlnQXJ0aWZhY3QgPSBnZXRBcnRpZmFjdERhdGFGcm9tSnNvbihqc29uU3RyKTsKKwkvLyBhZGRBcnRpZmFjdERhdGFGcm9tUmVzcG9uc2UocmVzdWx0LCBvcmlnQXJ0aWZhY3QpOworCS8vIFN0cmluZyBhcnRpZmFjdElkID0gb3JpZ0FydGlmYWN0LmdldFVuaXF1ZUlkKCk7CisJLy8KKwkvLyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVUlfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVCwKKwkvLyBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0SWQpOworCS8vIEh0dHBHZXQgaHR0cEdldCA9IGNyZWF0ZUdldFJlcXVlc3QodXJsKTsKKwkvLyBDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UyID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBHZXQpOworCS8vIHN0YXR1cyA9IHJlc3BvbnNlMi5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiZmFpbGVkIHRvIGRvd25sb2FkIGFydGlmYWN0IiwgMjAwLCBzdGF0dXMpOworCS8vIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzcG9uc2UyLmdldEVudGl0eSgpLmdldENvbnRlbnQoKTsKKwkvLyBBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPQorCS8vIGdldEFydGlmYWN0VWlEb3dubG9hZERhdGEoSU9VdGlscy50b1N0cmluZyhpbnB1dFN0cmVhbSkpOworCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiRG93bmxvYWRlZCBwYXlsb2FkIGlzIGRpZmZlcmVudCBmcm9tIHVwbG9hZGVkCisJLy8gb25lIiwgVVBMT0FEX0FSVElGQUNUX1BBWUxPQUQsCisJLy8gYXJ0aWZhY3RVaURvd25sb2FkRGF0YS5nZXRCYXNlNjRDb250ZW50cygpKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkRvd25sb2FkZWQgYXJ0aWZhY3QgbmFtZSBpcyBkaWZmZXJlbnQgZnJvbQorCS8vIHVwbG9hZGVkIG9uZSIsIFVQTE9BRF9BUlRJRkFDVF9OQU1FLAorCS8vIGFydGlmYWN0VWlEb3dubG9hZERhdGEuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCS8vCisJLy8gLy8gdmFsaWRhdGUgYXVkaXQKKwkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywKKwkvLyBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkFydGlmYWN0RG93bmxvYWQiOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAwIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QXJ0aWZhY3REYXRhKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXJ0aWZhY3REYXRhQXVkaXQob3JpZ0FydGlmYWN0KSk7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyQXJ0aWZhY3RVdWlkKG9yaWdBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZBcnRpZmFjdFV1aWQoIiIpOworCS8vCisJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCS8vIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJLy8KKwkvLyB9IGZpbmFsbHkgeworCS8vLy8gUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMgKTsKKwkvLy8vIGNoZWNrRGVsZXRlUmVzcG9uc2UocmVzcG9uc2UpOworCS8vIGh0dHBjbGllbnQuY2xvc2UoKTsKKwkvLyB9CisJLy8gfQorCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBkb3dubG9hZEFydGlmYWN0RnJvbVJlc291cmNlTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkvLworCS8vIENsb3NlYWJsZUh0dHBDbGllbnQgaHR0cGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkvLyB0cnkgeworCS8vCisJLy8gU3RyaW5nIHJlc291cmNlSWQgPSByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKwkvLyBTdHJpbmcgYXJ0aWZhY3RJZE5vdEZvdW5kID0gIjExMTExIjsKKwkvLworCS8vIEFydGlmYWN0RGVmaW5pdGlvbiBvcmlnQXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJLy8gb3JpZ0FydGlmYWN0LnNldFVuaXF1ZUlkKGFydGlmYWN0SWROb3RGb3VuZCk7CisJLy8KKwkvLyBTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVJX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNULAorCS8vIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQsCisJLy8gYXJ0aWZhY3RJZE5vdEZvdW5kKTsKKwkvLyBIdHRwR2V0IGh0dHBHZXQgPSBjcmVhdGVHZXRSZXF1ZXN0KHVybCk7CisJLy8gQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBHZXQpOworCS8vIGludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiZXhwZWN0ZWQgNDA0IG5vdCBmb3VuZCIsIDQwNCwgc3RhdHVzKTsKKwkvLworCS8vIC8vIHZhbGlkYXRlIGF1ZGl0CisJLy8gRXJyb3JJbmZvIGVycm9ySW5mbyA9CisJLy8gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORC5uYW1lKCkpOworCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJLy8gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJLy8gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIiIpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFydGlmYWN0RGF0YSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyQXJ0aWZhY3RVdWlkKG9yaWdBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZBcnRpZmFjdFV1aWQoIiIpOworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldkFydGlmYWN0VXVpZChudWxsKTsKKwkvLyB9IGZpbmFsbHkgeworCS8vIGh0dHBjbGllbnQuY2xvc2UoKTsKKwkvLyB9CisJLy8KKwkvLyB9CisJLy8KKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RGcm9tU2VydmljZU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8KKwkvLyBDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJLy8gdHJ5IHsKKwkvLworCS8vIFN0cmluZyBhcnRpZmFjdElkTm90Rm91bmQgPSAiMTExMTEiOworCS8vIEFydGlmYWN0RGVmaW5pdGlvbiBvcmlnQXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJLy8gb3JpZ0FydGlmYWN0LnNldFVuaXF1ZUlkKGFydGlmYWN0SWROb3RGb3VuZCk7CisJLy8KKwkvLyBTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVJX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1QsCisJLy8gY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkvLyBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBhcnRpZmFjdElkTm90Rm91bmQpOworCS8vIEh0dHBHZXQgaHR0cEdldCA9IGNyZWF0ZUdldFJlcXVlc3QodXJsKTsKKwkvLyBDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UyID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBHZXQpOworCS8vIGludCBzdGF0dXMgPSByZXNwb25zZTIuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImV4cGVjdGVkIDQwNCBub3QgZm91bmQiLCA0MDQsIHN0YXR1cyk7CisJLy8KKwkvLyAvLyB2YWxpZGF0ZSBhdWRpdAorCS8vIEVycm9ySW5mbyBlcnJvckluZm8gPQorCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQubmFtZSgpKTsKKwkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIiIpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFydGlmYWN0RGF0YSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyQXJ0aWZhY3RVdWlkKG9yaWdBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZBcnRpZmFjdFV1aWQoIiIpOworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vCisJLy8gfSBmaW5hbGx5IHsKKwkvLyBodHRwY2xpZW50LmNsb3NlKCk7CisJLy8gfQorCS8vCisJLy8gfQorCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBhZGRBcnRpZmFjdFRvUmVzb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8KKwkvLyBBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFydGlmYWN0KCk7CisJLy8KKwkvLyBSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPQorCS8vIEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoZGVmYXVsdEFydGlmYWN0LAorCS8vIHNkbmNVc2VyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCS8vIGludCBzdGF0dXMgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImFkZCBpbmZvcm1hdGlvbmFsIGFydGlmYWN0IHJlcXVlc3QgcmV0dXJuZWQKKwkvLyBzdGF0dXM6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgMjAwLCBzdGF0dXMpOworCS8vCisJLy8gUmVzdFJlc3BvbnNlIHJlc291cmNlUmVzcCA9CisJLy8gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCS8vIFJlc291cmNlIHJlc291cmNlID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJLy8KKwkvLyBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHJlc291cmNlLmdldEFydGlmYWN0cygpOworCS8vIGJvb2xlYW4gaXNFeGlzdCA9IGZhbHNlOworCS8vIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGFydGlmYWN0cy5lbnRyeVNldCgpKQorCS8vIHsKKwkvLyBpZiAoZW50cnkuZ2V0S2V5KCkuZXF1YWxzKGRlZmF1bHRBcnRpZmFjdC5nZXRBcnRpZmFjdExhYmVsKCkpKSB7CisJLy8gaXNFeGlzdCA9IHRydWU7CisJLy8KKwkvLyB9CisJLy8gfQorCS8vIEFzc2VydEpVbml0LmFzc2VydFRydWUoaXNFeGlzdCk7CisJLy8gfQorCisJcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVVcGxvYWRBcnRpZmFjdEJvZHlKc29uKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb25Cb2R5ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWpzb25Cb2R5LnB1dCgiYXJ0aWZhY3ROYW1lIiwgVVBMT0FEX0FSVElGQUNUX05BTUUpOworCQlqc29uQm9keS5wdXQoImFydGlmYWN0RGlzcGxheU5hbWUiLCAiY29uZmlndXJlIik7CisJCWpzb25Cb2R5LnB1dCgiYXJ0aWZhY3RUeXBlIiwgIlNIRUxMIik7CisJCWpzb25Cb2R5LnB1dCgibWFuZGF0b3J5IiwgImZhbHNlIik7CisJCWpzb25Cb2R5LnB1dCgiZGVzY3JpcHRpb24iLCAiZmYiKTsKKwkJanNvbkJvZHkucHV0KCJwYXlsb2FkRGF0YSIsIFVQTE9BRF9BUlRJRkFDVF9QQVlMT0FEKTsKKwkJanNvbkJvZHkucHV0KCJhcnRpZmFjdExhYmVsIiwgImNvbmZpZ3VyZSIpOworCQlyZXR1cm4gZ3Nvbi50b0pzb24oanNvbkJvZHkpOworCX0KKworCXByb3RlY3RlZCBBcnRpZmFjdERlZmluaXRpb24gZ2V0QXJ0aWZhY3REYXRhRnJvbUpzb24oU3RyaW5nIGpzb24pIHsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJSnNvbk9iamVjdCBqc29uRWxlbWVudCA9IG5ldyBKc29uT2JqZWN0KCk7CisJCWpzb25FbGVtZW50ID0gZ3Nvbi5mcm9tSnNvbihqc29uLCBqc29uRWxlbWVudC5nZXRDbGFzcygpKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0ID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCQlTdHJpbmcgcGF5bG9hZCA9IG51bGw7CisJCUpzb25FbGVtZW50IGFydGlmYWN0UGF5bG9hZCA9IGpzb25FbGVtZW50LmdldChDb25zdGFudHMuQVJUSUZBQ1RfUEFZTE9BRF9EQVRBKTsKKwkJaWYgKGFydGlmYWN0UGF5bG9hZCAhPSBudWxsICYmICFhcnRpZmFjdFBheWxvYWQuaXNKc29uTnVsbCgpKSB7CisJCQlwYXlsb2FkID0gYXJ0aWZhY3RQYXlsb2FkLmdldEFzU3RyaW5nKCk7CisJCX0KKwkJanNvbkVsZW1lbnQucmVtb3ZlKENvbnN0YW50cy5BUlRJRkFDVF9QQVlMT0FEX0RBVEEpOworCQlhcnRpZmFjdCA9IGdzb24uZnJvbUpzb24oanNvbkVsZW1lbnQsIEFydGlmYWN0RGVmaW5pdGlvbi5jbGFzcyk7CisJCWFydGlmYWN0LnNldFBheWxvYWREYXRhKHBheWxvYWQpOworCisJCS8qCisJCSAqIGF0aWZhY3Quc2V0QXJ0aWZhY3ROYW1lKFVQTE9BRF9BUlRJRkFDVF9OQU1FKTsKKwkJICogYXJ0aWZhY3Quc2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgiY29uZmlndXJlIik7CisJCSAqIGFydGlmYWN0LnNldEFydGlmYWN0VHlwZSgiU0hFTEwiKTsgYXJ0aWZhY3Quc2V0TWFuZGF0b3J5KGZhbHNlKTsKKwkJICogYXJ0aWZhY3Quc2V0RGVzY3JpcHRpb24oImZmIik7CisJCSAqIGFydGlmYWN0LnNldFBheWxvYWREYXRhKFVQTE9BRF9BUlRJRkFDVF9QQVlMT0FEKTsKKwkJICogYXJ0aWZhY3Quc2V0QXJ0aWZhY3RMYWJlbCgiY29uZmlndXJlIik7CisJCSAqLworCQlyZXR1cm4gYXJ0aWZhY3Q7CisJfQorCisJcHJvdGVjdGVkIEh0dHBHZXQgY3JlYXRlR2V0UmVxdWVzdChTdHJpbmcgdXJsKSB7CisJCUh0dHBHZXQgaHR0cEdldCA9IG5ldyBIdHRwR2V0KHVybCk7CisJCWh0dHBHZXQuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQlodHRwR2V0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWh0dHBHZXQuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJcmV0dXJuIGh0dHBHZXQ7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRBcnRpZmFjdFVpZChIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBIdHRwUmVzcG9uc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisJCVN0cmluZyByZXNwb25zZVN0cmluZyA9IG5ldyBCYXNpY1Jlc3BvbnNlSGFuZGxlcigpLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJSlNPTk9iamVjdCByZXNwb25zZU1hcCA9IChKU09OT2JqZWN0KSBqc29uUGFyc2VyLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTsKKwkJU3RyaW5nIGFydGlmYWN0SWQgPSAoU3RyaW5nKSByZXNwb25zZU1hcC5nZXQoInVuaXF1ZUlkIik7CisJCXJldHVybiBhcnRpZmFjdElkOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJ0aWZhY3RFc0lkKEh0dHBSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEh0dHBSZXNwb25zZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gbmV3IEJhc2ljUmVzcG9uc2VIYW5kbGVyKCkuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpOworCQlKU09OT2JqZWN0IHJlc3BvbnNlTWFwID0gKEpTT05PYmplY3QpIGpzb25QYXJzZXIucGFyc2UocmVzcG9uc2VTdHJpbmcpOworCQlTdHJpbmcgZXNJZCA9IChTdHJpbmcpIHJlc3BvbnNlTWFwLmdldCgiRXNJZCIpOworCQlyZXR1cm4gZXNJZDsKKwl9CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3REZWZpbml0aW9uIGFkZEFydGlmYWN0RGF0YUZyb21SZXNwb25zZShIdHRwUmVzcG9uc2UgcmVzcG9uc2UsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCkKKwkJCXRocm93cyBIdHRwUmVzcG9uc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisJCS8vIFN0cmluZyByZXNwb25zZVN0cmluZyA9IG5ldworCQkvLyBCYXNpY1Jlc3BvbnNlSGFuZGxlcigpLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKwkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gRW50aXR5VXRpbHMudG9TdHJpbmcoZW50aXR5KTsKKwkJSlNPTk9iamVjdCByZXNwb25zZU1hcCA9IChKU09OT2JqZWN0KSBqc29uUGFyc2VyLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTsKKwkJYXJ0aWZhY3Quc2V0RXNJZCgoU3RyaW5nKSByZXNwb25zZU1hcC5nZXQoImVzSWQiKSk7CisJCWFydGlmYWN0LnNldFVuaXF1ZUlkKChTdHJpbmcpIHJlc3BvbnNlTWFwLmdldCgidW5pcXVlSWQiKSk7CisJCWFydGlmYWN0LnNldEFydGlmYWN0R3JvdXBUeXBlKEFydGlmYWN0R3JvdXBUeXBlRW51bS5maW5kVHlwZSgoU3RyaW5nKSByZXNwb25zZU1hcC5nZXQoImFydGlmYWN0R3JvdXBUeXBlIikpKTsKKwkJYXJ0aWZhY3Quc2V0VGltZW91dCgoKExvbmcpIHJlc3BvbnNlTWFwLmdldCgidGltZW91dCIpKS5pbnRWYWx1ZSgpKTsKKwkJcmV0dXJuIGFydGlmYWN0OworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlmZWN5Y2xlQXJ0aWZhY3RVaWQoQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlKQorCQkJdGhyb3dzIEh0dHBSZXNwb25zZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gbmV3IEJhc2ljUmVzcG9uc2VIYW5kbGVyKCkuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpOworCQlKU09OT2JqZWN0IHJlc3BvbnNlTWFwID0gKEpTT05PYmplY3QpIGpzb25QYXJzZXIucGFyc2UocmVzcG9uc2VTdHJpbmcpOworCQlyZXNwb25zZU1hcCA9IChKU09OT2JqZWN0KSByZXNwb25zZU1hcC5nZXQoImltcGxlbWVudGF0aW9uIik7CisJCVN0cmluZyBhcnRpZmFjdElkID0gKFN0cmluZykgcmVzcG9uc2VNYXAuZ2V0KCJ1bmlxdWVJZCIpOworCQlyZXR1cm4gYXJ0aWZhY3RJZDsKKwl9CisKKwlwcm90ZWN0ZWQgSHR0cERlbGV0ZSBjcmVhdGVEZWxldGVBcnRpZmFjdFJlcXVlc3QoU3RyaW5nIHVybCkgeworCQlIdHRwRGVsZXRlIGh0dHBEZWxldGUgPSBuZXcgSHR0cERlbGV0ZSh1cmwpOworCQlodHRwRGVsZXRlLmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWh0dHBEZWxldGUuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJcmV0dXJuIGh0dHBEZWxldGU7CisJfQorCisJcHJvdGVjdGVkIEh0dHBQb3N0IGNyZWF0ZVBvc3RBZGRBcnRpZmFjdFJlcXVlYXN0KFN0cmluZyBqc29uQm9keSwgU3RyaW5nIHVybCwgYm9vbGVhbiBhZGRNZDVIZWFkZXIpCisJCQl0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisJCUh0dHBQb3N0IGh0dHBwb3N0ID0gbmV3IEh0dHBQb3N0KHVybCk7CisJCWh0dHBwb3N0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaHR0cHBvc3QuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaHR0cHBvc3QuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJaWYgKGFkZE1kNUhlYWRlcikgeworCQkJaHR0cHBvc3QuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkNvbnRlbnRfTUQ1LmdldFZhbHVlKCksIEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5U3RyaW5nKGpzb25Cb2R5KSk7CisJCX0KKwkJU3RyaW5nRW50aXR5IGlucHV0ID0gbmV3IFN0cmluZ0VudGl0eShqc29uQm9keSk7CisJCWlucHV0LnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIik7CisJCWh0dHBwb3N0LnNldEVudGl0eShpbnB1dCk7CisJCWxvZy5kZWJ1ZygiRXhlY3V0aW5nIHJlcXVlc3Qge30iLCBodHRwcG9zdC5nZXRSZXF1ZXN0TGluZSgpKTsKKwkJcmV0dXJuIGh0dHBwb3N0OworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlTG9hZEFydGlmYWN0Qm9keSgpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWpzb24ucHV0KCJhcnRpZmFjdE5hbWUiLCAiaW5zdGFsbF9hcGFjaGUyLnNoIik7CisJCWpzb24ucHV0KCJhcnRpZmFjdFR5cGUiLCAiU0hFTEwiKTsKKwkJanNvbi5wdXQoImRlc2NyaXB0aW9uIiwgImRkZCIpOworCQlqc29uLnB1dCgicGF5bG9hZERhdGEiLCAiVUVzREJBb0FBQUFJQUFlTGIwYkRReiIpOworCQlqc29uLnB1dCgiYXJ0aWZhY3RMYWJlbCIsICJuYW1lMTIzIik7CisKKwkJU3RyaW5nIGpzb25TdHIgPSBnc29uLnRvSnNvbihqc29uKTsKKwkJcmV0dXJuIGpzb25TdHI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tEZWxldGVSZXNwb25zZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N0YXR1c0NvZGUocmVzcG9uc2UsICJkZWxldGUgcmVxdWVzdCBmYWlsZWQiLCBmYWxzZSwgMjA0LCA0MDQpOworCX0KKworCXByb3RlY3RlZCBBcnRpZmFjdFVpRG93bmxvYWREYXRhIGdldEFydGlmYWN0VWlEb3dubG9hZERhdGEoU3RyaW5nIGFydGlmYWN0VWlEb3dubG9hZERhdGFTdHIpIHRocm93cyBFeGNlcHRpb24geworCisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCXRyeSB7CisJCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPSBtYXBwZXIucmVhZFZhbHVlKGFydGlmYWN0VWlEb3dubG9hZERhdGFTdHIsCisJCQkJCUFydGlmYWN0VWlEb3dubG9hZERhdGEuY2xhc3MpOworCQkJcmV0dXJuIGFydGlmYWN0VWlEb3dubG9hZERhdGE7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZGV2Q0kvSW1wb3J0Q3NhclVwZGF0ZS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZGV2Q0kvSW1wb3J0Q3NhclVwZGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWQ5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kZXZDSS9JbXBvcnRDc2FyVXBkYXRlLmphdmEKQEAgLTAsMCArMSwzNTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmRldkNJOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0cy5JbXBvcnRDc2FyUmVzb3VyY2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJUZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBJbXBvcnRDc2FyVXBkYXRlIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBJbXBvcnRDc2FyVXBkYXRlKCkgeworCQlzdXBlcihuYW1lLCBJbXBvcnRDc2FyVXBkYXRlLmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQERhdGFQcm92aWRlcihuYW1lID0gImhhcHB5QXJ0cyIpCisJcHVibGljIE9iamVjdFtdW10gZ2V0SGFwcHlBcnRpZmFjdHMoKSB7CisKKwkJcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyAiaGFwcHlfVkZfUkkyX0cyX3R3b19kaWZmZXJlbnRfYXJ0aWZhY3RzX3VuZGVyX2hlYXRCYXNlaGVhdFZvbGhlYXROZXQyIiB9LAorCQkJCXsgImhhcHB5X1ZGX1JJMl9HMl90d29fZGlmZmVyZW50X2FydGlmYWN0c191bmRlcl9oZWF0QmFzZWhlYXRWb2xoZWF0TmV0IiB9LAorCQkJCXsgImhhcHB5X1ZGX1JJMl9HMl90d29faWRlbnRpY2FsX2FydGlmYWN0c191bmRlcl9oZWF0QmFzZWhlYXRWb2xoZWF0TmV0IiB9LAorCQkJCXsgImhhcHB5X1ZGX1JJMl9HMl90d29fZGlmZmVyZW50X2FydGlmYWN0c191bmRlcl9uZXN0ZWQiIH0sCisJCQkJeyAiaGFwcHlfVkZfUkkyX0cyX3R3b19pbmRlbnRpY2FsX25lc3RlZF91bmRlcl9kaWZmZXJlbnRfZ3JvdXBzIiB9LAorCQkJCXsgImhhcHB5X1ZGX1JJMl9HMl90d29fZGlmZmVyZW50X25lc3RlZF91bmRlcl9kaWZmZXJlbnRfZ3JvdXBzIiB9LAorCQkJCXsgImhhcHB5X1ZGX1JJMl9HMl90d29fZGlmZmVyZW50X25lc3RlZF91bmRlcl9zYW1lX2dyb3VwIiB9LAorCisJCX07CisJfQorCisJQERhdGFQcm92aWRlcihuYW1lID0gIm5lZ2F0aXZlQXJ0cyIpCisJcHVibGljIE9iamVjdFtdW10gZ2V0TmVnYXRpdmVBcnRpZmFjdHMoKSB7CisKKwkJcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKworCQkJCXsgIm5lZ2F0aXZlX1ZGX1JJMl9HMl9zYW1lX2hlYXRWb2xfZGlmZmVyZW50X2dyb3VwcyIgfSwKKwkJCQl7ICJuZWdhdGl2ZV9WRl9SSTJfRzJfc2FtZV9oZWF0QmFzZV9kaWZmZXJlbnRfZW52cyIgfSwKKwkJCQl7ICJuZWdhdGl2ZV9WRl9SSTJfRzJfaGVhdEJhc2VIZWF0Vm9sSGVhdE5ldF91bmRlcl9uZXN0ZWQiIH0sCisJCQkJeyAibmVnYXRpdmVfVkZfUkkyX0cyX3R3b19pbmRlbnRpY2FsX2FydGlmYWN0c191bmRlcl9uZXN0ZWQiIH0sCisJCQkJeyAibmVnYXRpdmVfVkZfUkkyX0cyX25lc3RlZF91bmRlcl9uZXN0ZWQiIH0sIHsgIm5lZ2F0aXZlX1ZGX1JJMl9HMl9zYW1lX2hlYXRWb2xfZGlmZmVyZW50X2dyb3VwcyIgfSwgfTsKKwl9CisKKwlAQmVmb3JlVGVzdAorCXB1YmxpYyB2b2lkIHJlc3VtZU9yaWdDc2FyQmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJSW1wb3J0Q3NhclJlc291cmNlVGVzdC5jb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIm9yaWcuY3NhciIsICJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzLmNzYXIiKTsKKworCX0KKworCUBBZnRlclRlc3QKKwlwdWJsaWMgdm9pZCByZXN1bWVPcmlnQ3NhckFmdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJSW1wb3J0Q3NhclJlc291cmNlVGVzdC5jb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIm9yaWcuY3NhciIsICJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzLmNzYXIiKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlVkZzZWFyY2hCeUNzYXJJZENoZWNrSW5TdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoImhhcmRjb2RlZE5hbWUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlRmlyc3RJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisJCUNvbXBvbmVudCByZXNvdXJjZU9iamVjdCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRmlyc3RJbXBvcnQsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNvcHlSZXMgPSBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCSJ1cGRhdGVJbXBvcnRDc2FyXzJHYXJ0aWZhY3RzX3RvcG9sb2d5Q2hhbmdlZC5jc2FyIiwgImltcG9ydENzYXJfMkdhcnRpZmFjdHMuY3NhciIpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cyIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VTZWNvbmRJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisKKwkJLy8gVmFsaWRhdGlvbiBQYXJ0CisKKwkJcmVzb3VyY2VGaXJzdEltcG9ydC5nZXRHcm91cHMoKS5lcXVhbHMocmVzb3VyY2VTZWNvbmRJbXBvcnQuZ2V0R3JvdXBzKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWRnNlYXJjaEJ5Q3NhcklkQ2hlY2tJblN0YXRlX2NoZWNrU3VtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiaGFyZGNvZGVkTmFtZSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImltcG9ydENzYXJfMkdhcnRpZmFjdHMiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VGaXJzdEltcG9ydCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc291cmNlLmNsYXNzKTsKKwkJQ29tcG9uZW50IHJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VGaXJzdEltcG9ydCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpCisJCQkJLmdldExlZnQoKTsKKworCQkvLyBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQkvLyBSZXN0UmVzcG9uc2UgY29weVJlcyA9CisJCS8vIEltcG9ydENzYXJSZXNvdXJjZVRlc3QuY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsInVwZGF0ZUltcG9ydENzYXJfMkdhcnRpZmFjdHNfdG9wb2xvZ3lDaGFuZ2VkLmNzYXIiLCJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzLmNzYXIiKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImltcG9ydENzYXJfMkdhcnRpZmFjdHMiKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlU2Vjb25kSW1wb3J0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksCisJCQkJUmVzb3VyY2UuY2xhc3MpOworCisJCS8vIFZhbGlkYXRpb24gUGFydAorCisJCXJlc291cmNlRmlyc3RJbXBvcnQuZ2V0R3JvdXBzKCkuZXF1YWxzKHJlc291cmNlU2Vjb25kSW1wb3J0LmdldEdyb3VwcygpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlVkZzZWFyY2hCeUNzYXJJZENoZWNrT3V0U3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJoYXJkY29kZWROYW1lIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cyIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZUZpcnN0SW1wb3J0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksCisJCQkJUmVzb3VyY2UuY2xhc3MpOworCQkvLyBDb21wb25lbnQgcmVzb3VyY2VPYmplY3QgPQorCQkvLyBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZUZpcnN0SW1wb3J0LAorCQkvLyBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsIHRydWUpLmdldExlZnQoKTsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXN0UmVzcG9uc2UgY29weVJlcyA9IEltcG9ydENzYXJSZXNvdXJjZVRlc3QuY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsCisJCQkJInVwZGF0ZUltcG9ydENzYXJfMkdhcnRpZmFjdHNfdG9wb2xvZ3lDaGFuZ2VkLmNzYXIiLCAiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cy5jc2FyIik7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzIik7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZVNlY29uZEltcG9ydCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc291cmNlLmNsYXNzKTsKKworCQkvLyBWYWxpZGF0aW9uIFBhcnQKKworCQlyZXNvdXJjZUZpcnN0SW1wb3J0LmdldEdyb3VwcygpLmVxdWFscyhyZXNvdXJjZVNlY29uZEltcG9ydC5nZXRHcm91cHMoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVZGc2VhcmNoQnlDc2FySWRDZXJ0aWZ5U3RhdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoImhhcmRjb2RlZE5hbWUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlRmlyc3RJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisJCUNvbXBvbmVudCByZXNvdXJjZU9iamVjdCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRmlyc3RJbXBvcnQsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNvcHlSZXMgPSBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCSJ1cGRhdGVJbXBvcnRDc2FyXzJHYXJ0aWZhY3RzX3RvcG9sb2d5Q2hhbmdlZC5jc2FyIiwgImltcG9ydENzYXJfMkdhcnRpZmFjdHMuY3NhciIpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cyIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VTZWNvbmRJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisKKwkJLy8gVmFsaWRhdGlvbiBQYXJ0CisKKwkJcmVzb3VyY2VGaXJzdEltcG9ydC5nZXRHcm91cHMoKS5lcXVhbHMocmVzb3VyY2VTZWNvbmRJbXBvcnQuZ2V0R3JvdXBzKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWRnNlYXJjaEJ5Q3NhclN0YXJ0Q2VydGlmaWNhdGlvblN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiaGFyZGNvZGVkTmFtZSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImltcG9ydENzYXJfMkdhcnRpZmFjdHMiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VGaXJzdEltcG9ydCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc291cmNlLmNsYXNzKTsKKwkJQ29tcG9uZW50IHJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VGaXJzdEltcG9ydCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QsIHRydWUpLmdldExlZnQoKTsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXN0UmVzcG9uc2UgY29weVJlcyA9IEltcG9ydENzYXJSZXNvdXJjZVRlc3QuY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsCisJCQkJInVwZGF0ZUltcG9ydENzYXJfMkdhcnRpZmFjdHNfdG9wb2xvZ3lDaGFuZ2VkLmNzYXIiLCAiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cy5jc2FyIik7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzIik7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZVNlY29uZEltcG9ydCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc291cmNlLmNsYXNzKTsKKworCQkvLyBWYWxpZGF0aW9uIFBhcnQKKworCQlyZXNvdXJjZUZpcnN0SW1wb3J0LmdldEdyb3VwcygpLmVxdWFscyhyZXNvdXJjZVNlY29uZEltcG9ydC5nZXRHcm91cHMoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVZGc2VhcmNoQnlTeXN0ZW1OYW1lQ2hlY2tJblN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiaGFyZGNvZGVkTmFtZSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImltcG9ydENzYXJfMkdhcnRpZmFjdHMiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VGaXJzdEltcG9ydCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc291cmNlLmNsYXNzKTsKKwkJQ29tcG9uZW50IHJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VGaXJzdEltcG9ydCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpCisJCQkJLmdldExlZnQoKTsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXN0UmVzcG9uc2UgY29weVJlcyA9IEltcG9ydENzYXJSZXNvdXJjZVRlc3QuY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsCisJCQkJInVwZGF0ZUltcG9ydENzYXJfMkdhcnRpZmFjdHNfdG9wb2xvZ3lDaGFuZ2VkLmNzYXIiLCAiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cy5jc2FyIik7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoImhhcmRjb2RlZE5hbWVDaGFuZ2VkIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cyIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VTZWNvbmRJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisKKwkJLy8gVmFsaWRhdGlvbiBQYXJ0CisKKwkJcmVzb3VyY2VGaXJzdEltcG9ydC5nZXRHcm91cHMoKS5lcXVhbHMocmVzb3VyY2VTZWNvbmRJbXBvcnQuZ2V0R3JvdXBzKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWRnNlYXJjaEJ5U3lzdGVtTmFtZUNlcnRpZnlTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoImhhcmRjb2RlZE5hbWUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJpbXBvcnRDc2FyXzJHYXJ0aWZhY3RzIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlRmlyc3RJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisJCUNvbXBvbmVudCByZXNvdXJjZU9iamVjdCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRmlyc3RJbXBvcnQsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNvcHlSZXMgPSBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCSJ1cGRhdGVJbXBvcnRDc2FyXzJHYXJ0aWZhY3RzX3RvcG9sb2d5Q2hhbmdlZC5jc2FyIiwgImltcG9ydENzYXJfMkdhcnRpZmFjdHMuY3NhciIpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJoYXJkY29kZWROYW1lQ2hhbmdlZCIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImltcG9ydENzYXJfMkdhcnRpZmFjdHMiKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVZGc2VhcmNoQnlTeXN0ZW1OYW1lQ3NhcklkTm90RXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJoYXJkY29kZWROYW1lIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlRmlyc3RJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisJCUNvbXBvbmVudCByZXNvdXJjZU9iamVjdCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRmlyc3RJbXBvcnQsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisJCS8vIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9CisJCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIFJlc3RSZXNwb25zZSBjb3B5UmVzID0KKwkJLy8gSW1wb3J0Q3NhclJlc291cmNlVGVzdC5jb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywidXBkYXRlSW1wb3J0Q3Nhcl8yR2FydGlmYWN0c190b3BvbG9neUNoYW5nZWQuY3NhciIsImltcG9ydENzYXJfMkdhcnRpZmFjdHMuY3NhciIpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMyLnNldE5hbWUoImhhcmRjb2RlZE5hbWUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzMi5zZXRDc2FyVVVJRCgiaW1wb3J0Q3Nhcl8yR2FydGlmYWN0cyIpOworCQlyZXNvdXJjZURldGFpbHMyLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VTZWNvbmRJbXBvcnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlSZXNvdXJjZS5jbGFzcyk7CisKKwkJLy8gVmFsaWRhdGlvbiBQYXJ0CisKKwkJcmVzb3VyY2VGaXJzdEltcG9ydC5nZXRHcm91cHMoKS5lcXVhbHMocmVzb3VyY2VTZWNvbmRJbXBvcnQuZ2V0R3JvdXBzKCkpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kZXZDSS9JbXBvcnRDc2FyVmFsaWRhdGVBcnRpZmFjdHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2RldkNJL0ltcG9ydENzYXJWYWxpZGF0ZUFydGlmYWN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTU5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kZXZDSS9JbXBvcnRDc2FyVmFsaWRhdGVBcnRpZmFjdHMuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZGV2Q0k7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkNzYXJWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgSW1wb3J0Q3NhclZhbGlkYXRlQXJ0aWZhY3RzIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBJbXBvcnRDc2FyVmFsaWRhdGVBcnRpZmFjdHMoKSB7CisJCXN1cGVyKG5hbWUsIEltcG9ydENzYXJWYWxpZGF0ZUFydGlmYWN0cy5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBEYXRhUHJvdmlkZXIobmFtZSA9ICJoYXBweUFydHMiKQorCXB1YmxpYyBPYmplY3RbXVtdIGdldEhhcHB5QXJ0aWZhY3RzKCkgeworCisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7IHsgImhhcHB5X1ZGX1JJMl9HMl90d29fZGlmZmVyZW50X2FydGlmYWN0c191bmRlcl9oZWF0QmFzZWhlYXRWb2xoZWF0TmV0MiIgfSwKKwkJCQl7ICJoYXBweV9WRl9SSTJfRzJfdHdvX2RpZmZlcmVudF9hcnRpZmFjdHNfdW5kZXJfaGVhdEJhc2VoZWF0Vm9saGVhdE5ldCIgfSwKKwkJCQl7ICJoYXBweV9WRl9SSTJfRzJfdHdvX2lkZW50aWNhbF9hcnRpZmFjdHNfdW5kZXJfaGVhdEJhc2VoZWF0Vm9saGVhdE5ldCIgfSwKKwkJCQl7ICJoYXBweV9WRl9SSTJfRzJfdHdvX2RpZmZlcmVudF9hcnRpZmFjdHNfdW5kZXJfbmVzdGVkIiB9LAorCQkJCXsgImhhcHB5X1ZGX1JJMl9HMl90d29faW5kZW50aWNhbF9uZXN0ZWRfdW5kZXJfZGlmZmVyZW50X2dyb3VwcyIgfSwKKwkJCQl7ICJoYXBweV9WRl9SSTJfRzJfdHdvX2RpZmZlcmVudF9uZXN0ZWRfdW5kZXJfZGlmZmVyZW50X2dyb3VwcyIgfSwKKwkJCQl7ICJoYXBweV9WRl9SSTJfRzJfdHdvX2RpZmZlcmVudF9uZXN0ZWRfdW5kZXJfc2FtZV9ncm91cCIgfSwKKworCQl9OworCX0KKworCUBEYXRhUHJvdmlkZXIobmFtZSA9ICJuZWdhdGl2ZUFydHMiKQorCXB1YmxpYyBPYmplY3RbXVtdIGdldE5lZ2F0aXZlQXJ0aWZhY3RzKCkgeworCisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisKKwkJCQl7ICJuZWdhdGl2ZV9WRl9SSTJfRzJfc2FtZV9oZWF0Vm9sX2RpZmZlcmVudF9ncm91cHMiIH0sCisJCQkJeyAibmVnYXRpdmVfVkZfUkkyX0cyX3NhbWVfaGVhdEJhc2VfZGlmZmVyZW50X2VudnMiIH0sCisJCQkJeyAibmVnYXRpdmVfVkZfUkkyX0cyX2hlYXRCYXNlSGVhdFZvbEhlYXROZXRfdW5kZXJfbmVzdGVkIiB9LAorCQkJCXsgIm5lZ2F0aXZlX1ZGX1JJMl9HMl90d29faW5kZW50aWNhbF9hcnRpZmFjdHNfdW5kZXJfbmVzdGVkIiB9LAorCQkJCXsgIm5lZ2F0aXZlX1ZGX1JJMl9HMl9uZXN0ZWRfdW5kZXJfbmVzdGVkIiB9LCB7ICJuZWdhdGl2ZV9WRl9SSTJfRzJfc2FtZV9oZWF0Vm9sX2RpZmZlcmVudF9ncm91cHMiIH0sIH07CisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gImhhcHB5QXJ0cyIpCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGcm9tQ3NhckFydHNIYXBweShTdHJpbmcgYXJ0aWZhY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChhcnRpZmFjdE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNzYXJWZkFydGlmYWN0KGFydGlmYWN0TmFtZSwgcmVzb3VyY2UpOworCisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gIm5lZ2F0aXZlQXJ0cyIpCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGcm9tQ3NhckFydHNOZWdhdGl2ZShTdHJpbmcgYXJ0aWZhY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChhcnRpZmFjdE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc291cmNlLmdldEVycm9yQ29kZSgpICE9IDIwMSAmJiBjcmVhdGVSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSAhPSA1MDApOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kZXZDSS9Ub3NjYUdyb3VwSW5zaWRlVkYuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2RldkNJL1Rvc2NhR3JvdXBJbnNpZGVWRi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODZmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kZXZDSS9Ub3NjYUdyb3VwSW5zaWRlVkYuamF2YQpAQCAtMCwwICsxLDU3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZGV2Q0k7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLlBhaXI7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXMuVG9zY2FEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlRvc2NhUGFyc2VyVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5Dc2FyVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVG9zY2FHcm91cEluc2lkZVZGIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUb3NjYUdyb3VwSW5zaWRlVkYuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgVG9zY2FHcm91cEluc2lkZVZGKCkgeworCQlzdXBlcihuYW1lLCBUb3NjYUdyb3VwSW5zaWRlVkYuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlRnJvbUNzYXJBcnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gU3RyaW5nIGNzYXIgPSBnZXRDc2FyKCk7CisJCS8vIHBhcnNlQ3Nhcihjc2FyKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIlZGX1JJMl9HNl93aXRoQXJ0aWZhY3RzIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQlDb21wb25lbnQgcmVzb3VyY2VPYmplY3QgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJUmVzb3VyY2UgdmZNYW51YWwgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpCisJCQkJLmxlZnQoKS52YWx1ZSgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLCB2Zk1hbnVhbCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZNYW51YWwsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZU9iamVjdCwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2Zk1hbnVhbCwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QsIHRydWUpCisJCQkJLmdldExlZnQoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNBTkNFTENFUlRJRklDQVRJT04sIHRydWUpCisJCQkJLmdldExlZnQoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNvZmVyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIFN0cmluZyBjc2FyID0gZ2V0Q3NhcigpOworCQkvLyBwYXJzZUNzYXIoY3Nhcik7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJzb2ZlciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVZGd2l0aDJWTHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBTdHJpbmcgY3NhciA9IGdldENzYXIoKTsKKwkJLy8gcGFyc2VDc2FyKGNzYXIpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiVlNQUGFja2FnZSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJQ29tcG9uZW50IHJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCVJlc291cmNlIHZmTWFudWFsID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5PVEhFUiwgdmZNYW51YWwsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmTWFudWFsLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkKKwkJCQkuZ2V0TGVmdCgpOworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VPYmplY3QsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZNYW51YWwsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkKKwkJCQkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DQU5DRUxDRVJUSUZJQ0FUSU9OLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKQorCQkJCS5nZXRMZWZ0KCk7CisKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlRnJvbUNzYXJIYXBweSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTdHJpbmcgY3NhclVVSUQgPSAiVkZfUkkyX0cyX3dpdGhBcnRpZmFjdHMiOworCQlTdHJpbmcgY3NhclVVSUQgPSAiVkZfUkkyX0cxX0ludmFsaWQiOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChjc2FyVVVJRCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNzYXJWZkFydGlmYWN0KGNzYXJVVUlELCByZXNvdXJjZSk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUZyb21Dc2FyV2l0aFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjc2FyVVVJRCA9ICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cyI7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKGNzYXJVVUlEKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3NhclZmQXJ0aWZhY3QoY3NhclVVSUQsIHJlc291cmNlKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIFVwZGF0ZUNzYXJXaXRoTm9uRXhpc3RpbmdSZXNvdXJjZUluc3RhbmNlRmFpbCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIFN0cmluZyBjc2FyVVVJRCA9ICJWRl9SSTJfRzEtUklfTm90RXhpc3QiOworCQkvLyBTdHJpbmcgY3NhclVVSUQgPSAibmVzdGVkMyI7CisKKwkJLy8gU3RyaW5nIGNzYXJVVUlEID0gIlZGX1JJMl9HMV9JbnZhbGlkX1dpdGhBcnRpZmFjdHMiOworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCVJlc3RSZXNwb25zZSBjb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIiLAorCQkJCSJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCQlTdHJpbmcgY3NhclVVSUQgPSAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoY3NhclVVSUQpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJY29weVJlcyA9IGNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNSSV9GQUlMLmNzYXIiLAorCQkJCSJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKHJlc291cmNlLmdldE5hbWUoKSk7CisJCS8vIHJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JOYW1lKCJHb3ZudWsiKTsKKwkJLy8gcmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJPdGhlciIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UyKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UyID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlMi5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNzYXJWZkFydGlmYWN0KGNzYXJVVUlELCByZXNvdXJjZSk7CisJCVRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24gPSBUb3NjYVBhcnNlclV0aWxzLmdldFRvc2NhRGVmaW5pdGlvbk9iamVjdEJ5Q3NhclV1aWQoY3NhclVVSUQpOworCQlDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVG9zY2FEZWZpbml0b25PYmplY3RWc1Jlc291cmNlKHRvc2NhRGVmaW5pdGlvbiwgcmVzb3VyY2UpOworCisJCS8vIENzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDc2FyVmZBcnRpZmFjdChjc2FyVVVJRDIsIHJlc291cmNlMik7CisJCS8vIFRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24yID0KKwkJLy8gVG9zY2FQYXJzZXJVdGlscy5nZXRUb3NjYURlZmluaXRpb25PYmplY3RCeUNzYXJVdWlkKGNzYXJVVUlEMik7CisJCS8vIENzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVUb3NjYURlZmluaXRvbk9iamVjdFZzUmVzb3VyY2UodG9zY2FEZWZpbml0aW9uMiwKKwkJLy8gcmVzb3VyY2UyKTsKKworCQkvLyBDc2FyIGNzYXIgPSBwYXJzZXJUb2NzYXJPYmplY3QoY3NhclVVSUQpOworCQkvLyB2YWxpZGF0ZUNzYXJWc1Jlc291cmNlT2JqKGNzYXIsIHJlc291cmNlKTsKKwkJLy8gY3Nhci5ub2RlX3R5cGVzKCk7CisKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIFVwZGF0ZUNzYXJXaXRoU2FtZUNzYXJEaWZmZXJlbnRNZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9CisJCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIFJlc3RSZXNwb25zZSBjb3B5UmVzID0KKwkJLy8gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2EuY3NhciIsIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiKTsKKwkJLy8gQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisJCVN0cmluZyBjc2FyVVVJRCA9ICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChjc2FyVVVJRCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZShyZXNvdXJjZS5nZXROYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSgiR292bnVrIik7CisJCXJlc291cmNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiT3RoZXIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlMik7CisJCVJlc291cmNlIHJlc291cmNlMiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZTIuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCUNzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDc2FyVmZBcnRpZmFjdChjc2FyVVVJRCwgcmVzb3VyY2UpOworCQlUb3NjYURlZmluaXRpb24gdG9zY2FEZWZpbml0aW9uID0gVG9zY2FQYXJzZXJVdGlscy5nZXRUb3NjYURlZmluaXRpb25PYmplY3RCeUNzYXJVdWlkKGNzYXJVVUlEKTsKKwkJQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVRvc2NhRGVmaW5pdG9uT2JqZWN0VnNSZXNvdXJjZSh0b3NjYURlZmluaXRpb24sIHJlc291cmNlKTsKKworCQkvLyBDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3NhclZmQXJ0aWZhY3QoY3NhclVVSUQyLCByZXNvdXJjZTIpOworCQkvLyBUb3NjYURlZmluaXRpb24gdG9zY2FEZWZpbml0aW9uMiA9CisJCS8vIFRvc2NhUGFyc2VyVXRpbHMuZ2V0VG9zY2FEZWZpbml0aW9uT2JqZWN0QnlDc2FyVXVpZChjc2FyVVVJRDIpOworCQkvLyBDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVG9zY2FEZWZpbml0b25PYmplY3RWc1Jlc291cmNlKHRvc2NhRGVmaW5pdGlvbjIsCisJCS8vIHJlc291cmNlMik7CisKKwkJLy8gQ3NhciBjc2FyID0gcGFyc2VyVG9jc2FyT2JqZWN0KGNzYXJVVUlEKTsKKwkJLy8gdmFsaWRhdGVDc2FyVnNSZXNvdXJjZU9iaihjc2FyLCByZXNvdXJjZSk7CisJCS8vIGNzYXIubm9kZV90eXBlcygpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBVcGRhdGVDc2FyV2l0aFNhbWVDc2FyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0KKwkJLy8gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJLy8gUmVzdFJlc3BvbnNlIGNvcHlSZXMgPQorCQkvLyBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYS5jc2FyIiwiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCQkvLyBCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKwkJU3RyaW5nIGNzYXJVVUlEID0gIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKGNzYXJVVUlEKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKHJlc291cmNlLmdldE5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZTIgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZTIpOworCQlSZXNvdXJjZSByZXNvdXJjZTIgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UyLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQlDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3NhclZmQXJ0aWZhY3QoY3NhclVVSUQsIHJlc291cmNlKTsKKwkJVG9zY2FEZWZpbml0aW9uIHRvc2NhRGVmaW5pdGlvbiA9IFRvc2NhUGFyc2VyVXRpbHMuZ2V0VG9zY2FEZWZpbml0aW9uT2JqZWN0QnlDc2FyVXVpZChjc2FyVVVJRCk7CisJCUNzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVUb3NjYURlZmluaXRvbk9iamVjdFZzUmVzb3VyY2UodG9zY2FEZWZpbml0aW9uLCByZXNvdXJjZSk7CisKKwkJLy8gQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNzYXJWZkFydGlmYWN0KGNzYXJVVUlEMiwgcmVzb3VyY2UyKTsKKwkJLy8gVG9zY2FEZWZpbml0aW9uIHRvc2NhRGVmaW5pdGlvbjIgPQorCQkvLyBUb3NjYVBhcnNlclV0aWxzLmdldFRvc2NhRGVmaW5pdGlvbk9iamVjdEJ5Q3NhclV1aWQoY3NhclVVSUQyKTsKKwkJLy8gQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVRvc2NhRGVmaW5pdG9uT2JqZWN0VnNSZXNvdXJjZSh0b3NjYURlZmluaXRpb24yLAorCQkvLyByZXNvdXJjZTIpOworCisJCS8vIENzYXIgY3NhciA9IHBhcnNlclRvY3Nhck9iamVjdChjc2FyVVVJRCk7CisJCS8vIHZhbGlkYXRlQ3NhclZzUmVzb3VyY2VPYmooY3NhciwgcmVzb3VyY2UpOworCQkvLyBjc2FyLm5vZGVfdHlwZXMoKTsKKworCX0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgVXBkYXRlQ3NhckNlcnRpZmllZFZmV2l0aFNhbWVDc2FyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2EuY3NhciIsCisJCQkJIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisJCVN0cmluZyBjc2FyVVVJRCA9ICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChjc2FyVVVJRCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJUGFpcjxDb21wb25lbnQsIFJlc3RSZXNwb25zZT4gY2hhbmdlQ29tcG9uZW50U3RhdGUgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBjaGFuZ2VDb21wb25lbnRTdGF0ZS5nZXRMZWZ0KCk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlMik7CisJCVJlc291cmNlIHJlc291cmNlMiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZTIuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCUNzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDc2FyVmZBcnRpZmFjdChjc2FyVVVJRCwgcmVzb3VyY2UpOworCQlUb3NjYURlZmluaXRpb24gdG9zY2FEZWZpbml0aW9uID0gVG9zY2FQYXJzZXJVdGlscy5nZXRUb3NjYURlZmluaXRpb25PYmplY3RCeUNzYXJVdWlkKGNzYXJVVUlEKTsKKwkJQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVRvc2NhRGVmaW5pdG9uT2JqZWN0VnNSZXNvdXJjZSh0b3NjYURlZmluaXRpb24sIHJlc291cmNlKTsKKworCQkvLyBDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3NhclZmQXJ0aWZhY3QoY3NhclVVSUQyLCByZXNvdXJjZTIpOworCQkvLyBUb3NjYURlZmluaXRpb24gdG9zY2FEZWZpbml0aW9uMiA9CisJCS8vIFRvc2NhUGFyc2VyVXRpbHMuZ2V0VG9zY2FEZWZpbml0aW9uT2JqZWN0QnlDc2FyVXVpZChjc2FyVVVJRDIpOworCQkvLyBDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVG9zY2FEZWZpbml0b25PYmplY3RWc1Jlc291cmNlKHRvc2NhRGVmaW5pdGlvbjIsCisJCS8vIHJlc291cmNlMik7CisKKwkJLy8gQ3NhciBjc2FyID0gcGFyc2VyVG9jc2FyT2JqZWN0KGNzYXJVVUlEKTsKKwkJLy8gdmFsaWRhdGVDc2FyVnNSZXNvdXJjZU9iaihjc2FyLCByZXNvdXJjZSk7CisJCS8vIGNzYXIubm9kZV90eXBlcygpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBVcGRhdGVDc2FyRGlmZmVyZW50VG9zY2EoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXN0UmVzcG9uc2UgY29weVJlcyA9IGNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYS5jc2FyIiwKKwkJCQkiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKwkJU3RyaW5nIGNzYXJVVUlEID0gIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKGNzYXJVVUlEKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzVXBkYXRlZC5jc2FyIiwKKwkJCQkiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZShyZXNvdXJjZS5nZXROYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UyKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UyID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlMi5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNzYXJWZkFydGlmYWN0KGNzYXJVVUlELCByZXNvdXJjZSk7CisJCVRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24gPSBUb3NjYVBhcnNlclV0aWxzLmdldFRvc2NhRGVmaW5pdGlvbk9iamVjdEJ5Q3NhclV1aWQoY3NhclVVSUQpOworCQlDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVG9zY2FEZWZpbml0b25PYmplY3RWc1Jlc291cmNlKHRvc2NhRGVmaW5pdGlvbiwgcmVzb3VyY2UpOworCisJCS8vIENzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDc2FyVmZBcnRpZmFjdChjc2FyVVVJRDIsIHJlc291cmNlMik7CisJCS8vIFRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24yID0KKwkJLy8gVG9zY2FQYXJzZXJVdGlscy5nZXRUb3NjYURlZmluaXRpb25PYmplY3RCeUNzYXJVdWlkKGNzYXJVVUlEMik7CisJCS8vIENzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVUb3NjYURlZmluaXRvbk9iamVjdFZzUmVzb3VyY2UodG9zY2FEZWZpbml0aW9uMiwKKwkJLy8gcmVzb3VyY2UyKTsKKworCQkvLyBDc2FyIGNzYXIgPSBwYXJzZXJUb2NzYXJPYmplY3QoY3NhclVVSUQpOworCQkvLyB2YWxpZGF0ZUNzYXJWc1Jlc291cmNlT2JqKGNzYXIsIHJlc291cmNlKTsKKwkJLy8gY3Nhci5ub2RlX3R5cGVzKCk7CisKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIFVwZGF0ZUNzYXJEaWZmZXJlbnRUb3NjYUFuZEFydGlmYWN0cygpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVJlc3RSZXNwb25zZSBjb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIiLAorCQkJCSJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCQlTdHJpbmcgY3NhclVVSUQgPSAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoY3NhclVVSUQpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJY29weVJlcyA9IGNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfVXBkYXRlVG9zY2FBbmRBcnRpZmFjdHMuY3NhciIsCisJCQkJIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlMik7CisJCVJlc291cmNlIHJlc291cmNlMiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZTIuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCUNzYXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDc2FyVmZBcnRpZmFjdChjc2FyVVVJRCwgcmVzb3VyY2UpOworCQlUb3NjYURlZmluaXRpb24gdG9zY2FEZWZpbml0aW9uID0gVG9zY2FQYXJzZXJVdGlscy5nZXRUb3NjYURlZmluaXRpb25PYmplY3RCeUNzYXJVdWlkKGNzYXJVVUlEKTsKKwkJQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVRvc2NhRGVmaW5pdG9uT2JqZWN0VnNSZXNvdXJjZSh0b3NjYURlZmluaXRpb24sIHJlc291cmNlKTsKKworCQkvLyBDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ3NhclZmQXJ0aWZhY3QoY3NhclVVSUQyLCByZXNvdXJjZTIpOworCQkvLyBUb3NjYURlZmluaXRpb24gdG9zY2FEZWZpbml0aW9uMiA9CisJCS8vIFRvc2NhUGFyc2VyVXRpbHMuZ2V0VG9zY2FEZWZpbml0aW9uT2JqZWN0QnlDc2FyVXVpZChjc2FyVVVJRDIpOworCQkvLyBDc2FyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVG9zY2FEZWZpbml0b25PYmplY3RWc1Jlc291cmNlKHRvc2NhRGVmaW5pdGlvbjIsCisJCS8vIHJlc291cmNlMik7CisKKwkJLy8gQ3NhciBjc2FyID0gcGFyc2VyVG9jc2FyT2JqZWN0KGNzYXJVVUlEKTsKKwkJLy8gdmFsaWRhdGVDc2FyVnNSZXNvdXJjZU9iaihjc2FyLCByZXNvdXJjZSk7CisJCS8vIGNzYXIubm9kZV90eXBlcygpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBtaWdyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNzYXJVVUlEID0gIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoY3NhclVVSUQpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiUmVzb3VyY2UxIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlJlc291cmNlMiIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlJlc291cmNlMyIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiUmVzb3VyY2U0Iik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJSZXNvdXJjZTUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJSZXNvdXJjZTYiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTiwgdHJ1ZSkKKwkJCQkuZ2V0TGVmdCgpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJSZXNvdXJjZTciKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QsIHRydWUpCisJCQkJLmdldExlZnQoKTsKKworCQlsb2dnZXIuZGVidWcoIjcgVkYgcmVzb3VyY2VzIHdlcmUgY3JlYXRlZCIpOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY29weUNzYXJSZXN0KFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHNvdXJjZUNzYXJVdWlkLCBTdHJpbmcgdGFyZ2V0Q3NhclV1aWQpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ09QWV9DU0FSX1VTSU5HX1NJTVVMQVRPUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlzb3VyY2VDc2FyVXVpZCwgdGFyZ2V0Q3NhclV1aWQpOworCQlTdHJpbmcgdXNlcklkID0gc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCisJCVJlc3RSZXNwb25zZSBjb3B5Q3NhclJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCAiZHVtbXkiLCBoZWFkZXJzTWFwKTsKKwkJaWYgKGNvcHlDc2FyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgIT0gMjAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gY29weUNzYXJSZXNwb25zZTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJlcGFyZUhlYWRlcnNNYXAoU3RyaW5nIHVzZXJJZCkgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQlpZiAodXNlcklkICE9IG51bGwpIHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgdXNlcklkKTsKKwkJfQorCQlyZXR1cm4gaGVhZGVyc01hcDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU3RyaW5nIGNzYXJVVUlEID0gIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzIjsKKwkJU3RyaW5nIGNzYXJVVUlEID0gIm5vZGVfdHlwZXMiOworCQlUb3NjYVBhcnNlclV0aWxzLmdldFRvc2NhRGVmaW5pdGlvbk9iamVjdEJ5Q3NhclV1aWQoY3NhclVVSUQpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2Rpc3RyaWJ1dGlvbi9BdXRoYW50aWNhdGlvblRlc3RzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kaXN0cmlidXRpb24vQXV0aGFudGljYXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTliYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kaXN0cmlidXRpb24vQXV0aGFudGljYXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5kaXN0cmlidXRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkNvbnN1bWVyRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29uc3VtZXJSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBBdXRoYW50aWNhdGlvblRlc3RzIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY1VzZXJEZXRhaWxzOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSF9TVUNDRVNTID0gIkFVVEhfU1VDQ0VTUyI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX1JFUVVJUkVEID0gIkFVVEhfUkVRVUlSRUQiOworCisJLy8gdXNlciBjaSBwYXNzd29yZCAxMjM0NTYKKwkvLyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGF1dGhvcml6YXRpb25IZWFkZXIgPSAiQmFzaWMgWTJrNk1USXpORFUyIjsKKwkvLyB1c2VyIGNpIHBhc3N3b3JkIDEyMzQ1NgorCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVVNFUiA9ICJjaSI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICIxMjM0NTYiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0FMVCA9ICIyYTFmODg3ZDYwN2Q0NTE1ZDQwNjZmZTBmNTQ1MmE1MCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBIQVNIRURfUEFTU1dPUkQgPSAiMGEwZGM1NTdjM2JmNTk0YjFhNDgwMzBlM2U5OTIyNzU4MDE2OGIyMWY0NGUyODVjNjk3NDBiOGQ1YjEzZTMzYiI7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluVXNlckRldGFpbHM7CisJcHJvdGVjdGVkIENvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKKworCXB1YmxpYyBBdXRoYW50aWNhdGlvblRlc3RzKCkgeworCQlzdXBlcihuYW1lLCBBdXRoYW50aWNhdGlvblRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQERhdGFQcm92aWRlcgorCXByaXZhdGUgZmluYWwgT2JqZWN0W11bXSBnZXRTZXJ2aWNlRGVwQXJ0VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyBBcnRpZmFjdFR5cGVFbnVtLllBTkdfWE1MLmdldFR5cGUoKSB9LCB7IEFydGlmYWN0VHlwZUVudW0uT1RIRVIuZ2V0VHlwZSgpIH0gfTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJc2RuY0FkbWluVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCWNyZWF0ZUNvbXBvbmVudHMoKTsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbiA9IGNyZWF0ZUNvbnN1bWVyKCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNwb25zZSA9IENvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N0YXR1c0NvZGUoZGVsZXRlUmVzcG9uc2UsICJkZWxldGUgb3BlcmF0aW9uIGZpbGVkIiwgZmFsc2UsIDQwNCwgMjAwKTsKKwkJOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlKTsKKworCX0KKworCUBBZnRlck1ldGhvZAorCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNwb25zZSA9IENvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N0YXR1c0NvZGUoZGVsZXRlUmVzcG9uc2UsICJkZWxldGUgb3BlcmF0aW9uIGZpbGVkIiwgZmFsc2UsIDQwNCwgMjAwKTsKKwkJOworCisJfQorCisJcHJvdGVjdGVkIENvbnN1bWVyRGF0YURlZmluaXRpb24gY3JlYXRlQ29uc3VtZXIoKSB7CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXIgPSBuZXcgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbigpOworCQljb25zdW1lci5zZXRDb25zdW1lck5hbWUoVVNFUik7CisJCWNvbnN1bWVyLnNldENvbnN1bWVyU2FsdChTQUxUKTsKKwkJY29uc3VtZXIuc2V0Q29uc3VtZXJQYXNzd29yZChIQVNIRURfUEFTU1dPUkQpOworCQlyZXR1cm4gY29uc3VtZXI7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiZ2V0U2VydmljZURlcEFydFR5cGUiLCBkZXNjcmlwdGlvbiA9ICJtdW11IikKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdFN1Y2Nlc3NXaXRoQXV0YW50aWNhdGlvbihTdHJpbmcgc2VydmljZURlcEFydFR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgc2VydmljZVVuaXF1ZUlkID0gc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoc2VydmljZURlcEFydFR5cGUpOworCisJCVJlc3RSZXNwb25zZSBhZGRBcnRpZmFjdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydGlmYWN0RGV0YWlscywKKwkJCQlzZG5jVXNlckRldGFpbHMsIHNlcnZpY2VVbmlxdWVJZCwgQXJ0aWZhY3RSZXN0VXRpbHMuY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3REZXRhaWxzKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpbmcgaW50ZXJmYWNlIGFydGlmYWN0IiwgMjAwLAorCQkJCWFkZEFydGlmYWN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZShhcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQkvLyBUaHJlYWQuc2xlZXAoNTAwMCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvbkhlYWRlcnMgPSBCYXNlUmVzdFV0aWxzLmFkZEF1dGhvcml6ZUhlYWRlcihVU0VSLCBQQVNTV09SRCk7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgYXJ0aWZhY3REZXRhaWxzLAorCQkJCXNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcnMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgcmVzb3VyY2UiLCAyMDAsCisJCQkJcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUxpc3Q8U3RyaW5nPiBjb250RGlzcEhlYWRlckxpc3QgPSByZXN0UmVzcG9uc2UuZ2V0SGVhZGVyRmllbGRzKCkuZ2V0KENvbnN0YW50cy5DT05URU5UX0RJU1BPU0lUSU9OX0hFQURFUik7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoY29udERpc3BIZWFkZXJMaXN0KTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayBjb250ZW50IGRpc3Bvc2l0aW9uIGhlYWRlciIsCisJCQkJbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoImF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIikuYXBwZW5kKGFydGlmYWN0TmFtZSkuYXBwZW5kKCJcIiIpLnRvU3RyaW5nKCksCisJCQkJY29udERpc3BIZWFkZXJMaXN0LmdldCgwKSk7CisKKwkJU3RyaW5nIGRvd25sb2FkVXJsID0gQXJ0aWZhY3RSZXN0VXRpbHMKKwkJCQkuZ2V0UGFydGlhbFVybEJ5QXJ0aWZhY3ROYW1lKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIGFydGlmYWN0TmFtZSkuc3Vic3RyaW5nKDYpOworCisJCUV4cGVjdGVkQXV0aGVudGljYXRpb25BdWRpdCBleHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQgPSBuZXcgRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0KGRvd25sb2FkVXJsLCBVU0VSLAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5BVVRIX1JFUVVFU1QuZ2V0TmFtZSgpLCBBVVRIX1NVQ0NFU1MpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1dGhlbnRpY2F0aW9uQXVkaXQoZXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0KTsKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiZ2V0U2VydmljZURlcEFydFR5cGUiKQorCXB1YmxpYyB2b2lkIGRvd25sb2FkU2VydmljZUFydGlmYWN0V2l0aE91dEF1dGFudGljYXRpb24oU3RyaW5nIHNlcnZpY2VEZXBBcnRUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZCA9IHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKHNlcnZpY2VEZXBBcnRUeXBlKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkQXJ0aWZhY3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShhcnRpZmFjdERldGFpbHMsCisJCQkJc2RuY1VzZXJEZXRhaWxzLCBzZXJ2aWNlVW5pcXVlSWQsIEFydGlmYWN0UmVzdFV0aWxzLmNhbGN1bGF0ZUNoZWNrc3VtKGFydGlmYWN0RGV0YWlscykpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaW5nIGludGVyZmFjZSBhcnRpZmFjdCIsIDIwMCwKKwkJCQlhZGRBcnRpZmFjdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvbkhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBhcnRpZmFjdERldGFpbHMsCisJCQkJc2RuY1VzZXJEZXRhaWxzLCBhdXRob3JpemF0aW9uSGVhZGVycyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCByZXNvdXJjZSBmYWlsdXJlIiwgNDAxLAorCQkJCXJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgZG93bmxvYWRVcmwgPSBBcnRpZmFjdFJlc3RVdGlscy5nZXRQYXJ0aWFsVXJsQnlBcnRpZmFjdE5hbWUoc2VydmljZURldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQlhcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkpLnN1YnN0cmluZyg2KTsKKwkJRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0IGV4cGVjdGVkQXV0aGVudGljYXRpb25BdWRpdCA9IG5ldyBFeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQoZG93bmxvYWRVcmwsICIiLAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5BVVRIX1JFUVVFU1QuZ2V0TmFtZSgpLCBBVVRIX1JFUVVJUkVEKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdXRoZW50aWNhdGlvbkF1ZGl0KGV4cGVjdGVkQXV0aGVudGljYXRpb25BdWRpdCk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2Rpc3RyaWJ1dGlvbi9EaXN0cmlidXRpb25Eb3dubG9hZEFydGlmYWN0VGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZGlzdHJpYnV0aW9uL0Rpc3RyaWJ1dGlvbkRvd25sb2FkQXJ0aWZhY3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmNTYyNgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2Rpc3RyaWJ1dGlvbi9EaXN0cmlidXRpb25Eb3dubG9hZEFydGlmYWN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5kaXN0cmlidXRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkNvbnN1bWVyRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZERpc3REb3dubG9hZEF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29uc3VtZXJSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdlbmVyYWxVdGlsaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvbkRvd25sb2FkQXJ0aWZhY3RUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBkZXNpZ25lclVzZXI7CisJcHJvdGVjdGVkIHN0YXRpYyBVc2VyIGFkbWluVXNlcjsKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZXNvdXJjZUJhc2VWZXJzaW9uOworCS8vIHVzZXIgY2kgcGFzc3dvcmQgMTIzNDU2CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBhdXRob3JpemF0aW9uSGVhZGVyID0gIkJhc2ljIFkyazZNVEl6TkRVMiI7CisJcHJvdGVjdGVkIENvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RJbnRlcmZhY2VUeXBlOworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGFydGlmYWN0T3BlcmF0aW9uTmFtZTsKKworCXByb3RlY3RlZCBzdGF0aWMgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgc2VydmljZUJhc2VWZXJzaW9uOworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHNlcnZpY2VVbmlxdWVJZDsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFVTRVIgPSAiY2kiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAiMTIzNDU2IjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNBTFQgPSAiMmExZjg4N2Q2MDdkNDUxNWQ0MDY2ZmUwZjU0NTJhNTAiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgSEFTSEVEX1BBU1NXT1JEID0gIjBhMGRjNTU3YzNiZjU5NGIxYTQ4MDMwZTNlOTkyMjc1ODAxNjhiMjFmNDRlMjg1YzY5NzQwYjhkNWIxM2UzM2IiOworCisJcHVibGljIERpc3RyaWJ1dGlvbkRvd25sb2FkQXJ0aWZhY3RUZXN0KCkgeworCQlzdXBlcihuYW1lLCBEaXN0cmlidXRpb25Eb3dubG9hZEFydGlmYWN0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCS8vIEBCZWZvcmVDbGFzcworCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCBJbml0QmVmb3JlVGVzdCgpIHRocm93cyBFeGNlcHRpb24KKwkvLyB7CisJLy8KKwkvLworCS8vIHJlc291cmNlQmFzZVZlcnNpb24gPSAiMC4xIjsKKwkvLyBzZXJ2aWNlQmFzZVZlcnNpb24gPSAiMC4xIjsKKwkvLyBkZXNpZ25lclVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCS8vIGFkbWluVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJLy8vLyByZXNvdXJjZURldGFpbHMgPQorCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgidG9zY2Eubm9kZXMubmV3bm90Z2VuZXJpY3Jlc291cmNlNHRlc3ROZXciLAorCS8vIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywKKwkvLyAiamgwMDAzIik7CisJLy8gcmVzb3VyY2VEZXRhaWxzID0KKwkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkvLyBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX1JPVVRFUlMsCisJLy8gYWRtaW5Vc2VyKTsKKwkvLyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJLy8gc2VydmljZVVuaXF1ZUlkID0gInN2Y18iICsgc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgKyAiLiIgKworCS8vIHNlcnZpY2VCYXNlVmVyc2lvbjsKKwkvLyBhcnRpZmFjdEludGVyZmFjZVR5cGUgPSAic3RhbmRhcmQiOworCS8vIGFydGlmYWN0T3BlcmF0aW9uTmFtZSA9ICJzdGFydCI7CisJLy8gfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJcmVzb3VyY2VCYXNlVmVyc2lvbiA9ICIwLjEiOworCQlzZXJ2aWNlQmFzZVZlcnNpb24gPSAiMC4xIjsKKwkJZGVzaWduZXJVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYWRtaW5Vc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gcmVzb3VyY2VEZXRhaWxzID0KKwkJLy8gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCJ0b3NjYS5ub2Rlcy5uZXdub3RnZW5lcmljcmVzb3VyY2U0dGVzdE5ldyIsCisJCS8vIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywKKwkJLy8gImpoMDAwMyIpOworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX1JPVVRFUlMsIGFkbWluVXNlcik7CisJCXNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZVVuaXF1ZUlkID0gInN2Y18iICsgc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgKyAiLiIgKyBzZXJ2aWNlQmFzZVZlcnNpb247CisJCWFydGlmYWN0SW50ZXJmYWNlVHlwZSA9ICJzdGFuZGFyZCI7CisJCWFydGlmYWN0T3BlcmF0aW9uTmFtZSA9ICJzdGFydCI7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24gPSBjcmVhdGVDb25zdW1lcigpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzcG9uc2UgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBhZG1pblVzZXIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShkZWxldGVSZXNwb25zZSwgImRlbGV0ZSBvcGVyYXRpb24gZmlsZWQiLCBmYWxzZSwgNDA0LCAyMDApOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGFkbWluVXNlcik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFJlc291cmNlQXJ0aWZhY3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGluZyByZXNvdXJjZSIsIDIwMSwKKwkJCQlzZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJVc2VyKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIiwgMjAxLAorCQkJCWNyZWF0ZVJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJLy8gU2V0dGluZyB0aGUgbmFtZSB0byBiZSB3aXRoIHNwYWNlCisJCWFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdE5hbWUoInRlc3QgYXJ0aWZhY3QgZmlsZS55YW1sIik7CisJCS8vIGFydGlmYWN0RGV0YWlscy5zZXQoQXJ0aWZhY3RSZXN0VXRpbHMuY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3REZXRhaWxzKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEFydGlmYWN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGFydGlmYWN0RGV0YWlscywKKwkJCQlkZXNpZ25lclVzZXIsIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIEFydGlmYWN0UmVzdFV0aWxzLmNhbGN1bGF0ZUNoZWNrc3VtKGFydGlmYWN0RGV0YWlscykpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaW5nIGludGVyZmFjZSBhcnRpZmFjdCIsIDIwMCwKKwkJCQlhZGRBcnRpZmFjdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIEdldHRpbmcgZXhwZWN0ZWQgYXJ0aWZhY3QgY2hlY2tzdW0KKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0UmVzcCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRBcnRpZmFjdERlZmluaXRpb25SZXNwb25zZVRvSmF2YU9iamVjdChhZGRBcnRpZmFjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgZXhwZWN0ZWRQYXlsb2FkQ2hlY2tzdW0gPSBhcnRpZmFjdFJlc3AuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpOworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHJlbGF0aXZlVXJsID0gZW5jb2RlVXJsRm9yRG93bmxvYWQoU3RyaW5nLmZvcm1hdChVcmxzLkRJU1RSSUJfRE9XTkxPQURfUkVTT1VSQ0VfQVJUSUZBQ1RfUkVMQVRJVkVfVVJMLAorCQkJCVZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSksIHNlcnZpY2VCYXNlVmVyc2lvbiwKKwkJCQlWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShyZXNvdXJjZS5nZXROYW1lKCkpLCByZXNvdXJjZS5nZXRWZXJzaW9uKCksCisJCQkJYXJ0aWZhY3RSZXNwLmdldEFydGlmYWN0TmFtZSgpKSk7CisJCS8vIFN0cmluZyBmdWxsVXJsRm9ybWF0dGVkID0KKwkJLy8gU3RyaW5nLmZvcm1hdChVcmxzLkRPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUX0ZVTExfVVJMLAorCQkvLyBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlbGF0aXZlVXJsKTsKKwkJLy8gU3RyaW5nIGNvbnN1bWVySWQgPSAiZHVtbXkuZWNvbXAiOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZUluZm8gPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKCk7CisJCXJlc291cmNlSW5mby5zZXROYW1lKHJlc291cmNlLmdldE5hbWUoKSk7CisJCXJlc291cmNlSW5mby5zZXRWZXJzaW9uKHJlc291cmNlLmdldFZlcnNpb24oKSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlhdXRob3JpemF0aW9uSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgcmVzb3VyY2VJbmZvLAorCQkJCWFydGlmYWN0RGV0YWlscywgZGVzaWduZXJVc2VyLCBhdXRob3JpemF0aW9uSGVhZGVycyk7CisJCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPQorCQkvLyBhcnRpZmFjdFV0aWxzLmRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdChkZXNpZ25lclVzZXIsZnVsbFVybEZvcm1hdHRlZCwKKwkJLy8gY29uc3VtZXJJZCx0cnVlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRvd25sb2FkIHJlc291cmNlIiwgMjAwLAorCQkJCXJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBWYWxpZGF0aW5nIGhlYWRlcnMKKwkJLy8gY29udGVudCBkaXNwb3NpdGlvbgorCQlMaXN0PFN0cmluZz4gY29udERpc3BIZWFkZXJMaXN0ID0gcmVzdFJlc3BvbnNlLmdldEhlYWRlckZpZWxkcygpLmdldChDb25zdGFudHMuQ09OVEVOVF9ESVNQT1NJVElPTl9IRUFERVIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKGNvbnREaXNwSGVhZGVyTGlzdCk7CisJCUFzc2VydEpVbml0CisJCQkJLmFzc2VydEVxdWFscygKKwkJCQkJCSJDaGVjayBjb250ZW50IGRpc3Bvc2l0aW9uIGhlYWRlciIsIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKCJhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIpCisJCQkJCQkJCS5hcHBlbmQoYXJ0aWZhY3RSZXNwLmdldEFydGlmYWN0TmFtZSgpKS5hcHBlbmQoIlwiIikudG9TdHJpbmcoKSwKKwkJCQkJCWNvbnREaXNwSGVhZGVyTGlzdC5nZXQoMCkpOworCisJCS8vIGNvbnRlbnQgdHlwZQorCQlMaXN0PFN0cmluZz4gY29udFR5cGVIZWFkZXJMaXN0ID0gcmVzdFJlc3BvbnNlLmdldEhlYWRlckZpZWxkcygpLmdldChDb25zdGFudHMuQ09OVEVOVF9UWVBFX0hFQURFUik7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoY29udFR5cGVIZWFkZXJMaXN0KTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayBjb250ZW50IHR5cGUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwgY29udFR5cGVIZWFkZXJMaXN0LmdldCgwKSk7CisKKwkJU3RyaW5nIGFjdHVhbENvbnRlbnRzID0gcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisKKwkJLy8gQ29udGVudHMgLSBjb21wYXJpbmcgZGVjb2RlZCBjb250ZW50CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhhcnRpZmFjdERldGFpbHMuZ2V0UGF5bG9hZCgpLCBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGFjdHVhbENvbnRlbnRzLmdldEJ5dGVzKCkpKTsKKworCQkvLyB2YWxpZGF0aW5nIGNoZWNrc3VtCisJCVN0cmluZyBhY3R1YWxQYXlsb2FkQ2hlY2tzdW0gPSBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeUJ5dGVBcnJheShhY3R1YWxDb250ZW50cy5nZXRCeXRlcygpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGF5bG9hZENoZWNrc3VtLCBhY3R1YWxQYXlsb2FkQ2hlY2tzdW0pOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJEQXJ0aWZhY3REb3dubG9hZCI7CisKKwkJRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCBleHBlY3RlZERpc3REb3dubG9hZEF1ZGl0ID0gbmV3IEV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQoYXVkaXRBY3Rpb24sCisJCQkJQmFzZVJlc3RVdGlscy5lY29tcCwgcmVsYXRpdmVVcmwsICIyMDAiLCAiT0siKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZERpc3REb3dubG9hZEF1ZGl0LCBhdWRpdEFjdGlvbik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZG93bmxvYWRfc2VydmljZU5hbWVOb3RGb3VuZF9pbm5lcihTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgU3RyaW5nIHJlc291cmNlTmFtZSwKKwkJCVN0cmluZyByZXNvdXJjZVZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAia3VrdSI7CisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdFJlcURldGFpbHMoKTsKKwkJYXJ0aWZhY3Quc2V0QXJ0aWZhY3ROYW1lKGFydGlmYWN0TmFtZSk7CisJCVN0cmluZyByZWxhdGl2ZVVybDsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlhdXRob3JpemF0aW9uSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZUluZm8gPSBuZXcgU2VydmljZVJlcURldGFpbHMoKTsKKwkJc2VydmljZUluZm8uc2V0TmFtZShzZXJ2aWNlTmFtZSk7CisJCXNlcnZpY2VJbmZvLnNldFZlcnNpb24oc2VydmljZVZlcnNpb24pOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbnVsbDsKKwkJaWYgKHJlc291cmNlTmFtZSAhPSBudWxsKSB7CisJCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxlcyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMoKTsKKwkJCXJlc291cmNlRGV0YWlsZXMuc2V0TmFtZShyZXNvdXJjZU5hbWUpOworCQkJcmVzb3VyY2VEZXRhaWxlcy5zZXRWZXJzaW9uKHJlc291cmNlVmVyc2lvbik7CisJCQlyZWxhdGl2ZVVybCA9IGVuY29kZVVybEZvckRvd25sb2FkKFN0cmluZy5mb3JtYXQoVXJscy5ESVNUUklCX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUX1JFTEFUSVZFX1VSTCwKKwkJCQkJVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoc2VydmljZU5hbWUpLCBzZXJ2aWNlVmVyc2lvbiwKKwkJCQkJVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUocmVzb3VyY2VOYW1lKSwgcmVzb3VyY2VWZXJzaW9uLCBhcnRpZmFjdE5hbWUpKTsKKwkJCXJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdChzZXJ2aWNlSW5mbywgcmVzb3VyY2VEZXRhaWxlcywgYXJ0aWZhY3QsCisJCQkJCWRlc2lnbmVyVXNlciwgYXV0aG9yaXphdGlvbkhlYWRlcnMpOworCQl9IGVsc2UgeworCQkJcmVsYXRpdmVVcmwgPSBlbmNvZGVVcmxGb3JEb3dubG9hZChTdHJpbmcuZm9ybWF0KFVybHMuRElTVFJJQl9ET1dOTE9BRF9TRVJWSUNFX0FSVElGQUNUX1JFTEFUSVZFX1VSTCwKKwkJCQkJVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoc2VydmljZU5hbWUpLCBzZXJ2aWNlVmVyc2lvbiwgYXJ0aWZhY3ROYW1lKSk7CisJCQlyZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlSW5mbywgYXJ0aWZhY3QsIGRlc2lnbmVyVXNlciwKKwkJCQkJYXV0aG9yaXphdGlvbkhlYWRlcnMpOworCQl9CisKKwkJLy8gUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9CisJCS8vIGFydGlmYWN0VXRpbHMuZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0KGRlc2lnbmVyVXNlcixmdWxsVXJsRm9ybWF0dGVkLAorCQkvLyBjb25zdW1lcklkLHRydWUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgcmVzb3VyY2UiLCA0MDQsCisJCQkJcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJEQXJ0aWZhY3REb3dubG9hZCI7CisKKwkJRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCBleHBlY3RlZERpc3REb3dubG9hZEF1ZGl0ID0gbmV3IEV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQoYXVkaXRBY3Rpb24sCisJCQkJQmFzZVJlc3RVdGlscy5lY29tcCwgcmVsYXRpdmVVcmwsICI0MDQiLCAiU1ZDNDUwMzogRXJyb3I6IFJlcXVlc3RlZCAnIgorCQkJCQkJKyBWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShzZXJ2aWNlTmFtZSkgKyAiJyBzZXJ2aWNlIHdhcyBub3QgZm91bmQuIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCwgYXVkaXRBY3Rpb24pOworCX0KKworCXByb3RlY3RlZCB2b2lkIGRvd25sb2FkX3NlcnZpY2VWZXJzaW9uTm90Rm91bmRfaW5uZXIoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgc2VydmljZVZlcnNpb24sIFN0cmluZyByZXNvdXJjZU5hbWUsCisJCQlTdHJpbmcgcmVzb3VyY2VWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gImt1a3UiOworCQlTdHJpbmcgcmVsYXRpdmVVcmw7CisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdFJlcURldGFpbHMoKTsKKwkJYXJ0aWZhY3Quc2V0QXJ0aWZhY3ROYW1lKGFydGlmYWN0TmFtZSk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvbkhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJYXV0aG9yaXphdGlvbkhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VJbmZvID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKCk7CisJCXNlcnZpY2VJbmZvLnNldE5hbWUoc2VydmljZU5hbWUpOworCQlzZXJ2aWNlSW5mby5zZXRWZXJzaW9uKHNlcnZpY2VWZXJzaW9uKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IG51bGw7CisJCWlmIChyZXNvdXJjZU5hbWUgIT0gbnVsbCkgeworCQkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsZXMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKCk7CisJCQlyZXNvdXJjZURldGFpbGVzLnNldE5hbWUocmVzb3VyY2VOYW1lKTsKKwkJCXJlc291cmNlRGV0YWlsZXMuc2V0VmVyc2lvbihyZXNvdXJjZVZlcnNpb24pOworCQkJcmVsYXRpdmVVcmwgPSBlbmNvZGVVcmxGb3JEb3dubG9hZChTdHJpbmcuZm9ybWF0KFVybHMuRElTVFJJQl9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwsCisJCQkJCVZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VOYW1lKSwgc2VydmljZVZlcnNpb24sCisJCQkJCVZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHJlc291cmNlTmFtZSksIHJlc291cmNlVmVyc2lvbiwgYXJ0aWZhY3ROYW1lKSk7CisJCQlyZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFJlc291cmNlQXJ0aWZhY3Qoc2VydmljZUluZm8sIHJlc291cmNlRGV0YWlsZXMsIGFydGlmYWN0LAorCQkJCQlkZXNpZ25lclVzZXIsIGF1dGhvcml6YXRpb25IZWFkZXJzKTsKKwkJfSBlbHNlIHsKKwkJCXJlbGF0aXZlVXJsID0gZW5jb2RlVXJsRm9yRG93bmxvYWQoU3RyaW5nLmZvcm1hdChVcmxzLkRJU1RSSUJfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwsCisJCQkJCVZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VOYW1lKSwgc2VydmljZVZlcnNpb24sIGFydGlmYWN0TmFtZSkpOworCQkJcmVzdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3Qoc2VydmljZUluZm8sIGFydGlmYWN0LCBkZXNpZ25lclVzZXIsCisJCQkJCWF1dGhvcml6YXRpb25IZWFkZXJzKTsKKwkJfQorCQkvLyBTdHJpbmcgZnVsbFVybEZvcm1hdHRlZCA9CisJCS8vIFN0cmluZy5mb3JtYXQoVXJscy5ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVF9GVUxMX1VSTCwKKwkJLy8gY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSxjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZWxhdGl2ZVVybCk7CisJCS8vIFN0cmluZyBjb25zdW1lcklkID0gImR1bW15LmVjb21wIjsKKworCQkvLyBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0KKwkJLy8gYXJ0aWZhY3RVdGlscy5kb3dubG9hZFJlc291cmNlQXJ0aWZhY3QoZGVzaWduZXJVc2VyLGZ1bGxVcmxGb3JtYXR0ZWQsCisJCS8vIGNvbnN1bWVySWQsdHJ1ZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCByZXNvdXJjZSIsIDQwNCwKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkRBcnRpZmFjdERvd25sb2FkIjsKKworCQlFeHBlY3RlZERpc3REb3dubG9hZEF1ZGl0IGV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQgPSBuZXcgRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdChhdWRpdEFjdGlvbiwKKwkJCQlCYXNlUmVzdFV0aWxzLmVjb21wLCByZWxhdGl2ZVVybCwgIjQwNCIsCisJCQkJIlNWQzQ1MDQ6IEVycm9yOiBTZXJ2aWNlIHZlcnNpb24gIiArIHNlcnZpY2VWZXJzaW9uICsgIiB3YXMgbm90IGZvdW5kLiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGVuY29kZVVybEZvckRvd25sb2FkKFN0cmluZyB1cmwpIHsKKwkJcmV0dXJuIHVybC5yZXBsYWNlQWxsKCIgIiwgIiUyMCIpOworCX0KKworCXByb3RlY3RlZCBDb25zdW1lckRhdGFEZWZpbml0aW9uIGNyZWF0ZUNvbnN1bWVyKCkgeworCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGNvbnN1bWVyID0gbmV3IENvbnN1bWVyRGF0YURlZmluaXRpb24oKTsKKwkJY29uc3VtZXIuc2V0Q29uc3VtZXJOYW1lKFVTRVIpOworCQljb25zdW1lci5zZXRDb25zdW1lclNhbHQoU0FMVCk7CisJCWNvbnN1bWVyLnNldENvbnN1bWVyUGFzc3dvcmQoSEFTSEVEX1BBU1NXT1JEKTsKKwkJcmV0dXJuIGNvbnN1bWVyOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGRvd25sb2FkU2VydmljZUFydGlmYWN0U3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDcmVhdGUgc2VydmljZQorCQlSZXN0UmVzcG9uc2Ugc2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRpbmcgcmVzb3VyY2UiLCAyMDEsIHNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJc2VydmljZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkKKwkJCQkuZ2V0VW5pcXVlSWQoKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoIk1VUkFOT19QS0ciKTsKKworCQlSZXN0UmVzcG9uc2UgYWRkQXJ0aWZhY3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShhcnRpZmFjdERldGFpbHMsCisJCQkJZGVzaWduZXJVc2VyLCBzZXJ2aWNlVW5pcXVlSWQsIEFydGlmYWN0UmVzdFV0aWxzLmNhbGN1bGF0ZU1ENUhlYWRlcihhcnRpZmFjdERldGFpbHMpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGluZyBpbnRlcmZhY2UgYXJ0aWZhY3QiLCAyMDAsCisJCQkJYWRkQXJ0aWZhY3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBHZXR0aW5nIGV4cGVjdGVkIGFydGlmYWN0IGNoZWNrc3VtCisKKwkJLy8gQXJ0aWZhY3RSZXNKYXZhT2JqZWN0IGFydGlmYWN0UmVzcCA9CisJCS8vIGFydGlmYWN0VXRpbHMucGFyc2VJbmZvcm1hdGlvbmFsQXJ0aWZhY3RSZXNwKGFkZEFydGlmYWN0UmVzcG9uc2UpOworCQlTdHJpbmcgZXhwZWN0ZWRQYXlsb2FkQ2hlY2tzdW0gPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QoYWRkQXJ0aWZhY3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKS5nZXRBcnRpZmFjdENoZWNrc3VtKCk7CisKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZShhcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCisJCVN0cmluZyByZWxhdGl2ZVVybCA9IGVuY29kZVVybEZvckRvd25sb2FkKFN0cmluZy5mb3JtYXQoVXJscy5ESVNUUklCX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1RfUkVMQVRJVkVfVVJMLAorCQkJCVZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSksIHNlcnZpY2VCYXNlVmVyc2lvbiwgYXJ0aWZhY3ROYW1lKSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlhdXRob3JpemF0aW9uSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBhcnRpZmFjdERldGFpbHMsCisJCQkJZGVzaWduZXJVc2VyLCBhdXRob3JpemF0aW9uSGVhZGVycyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCByZXNvdXJjZSIsIDIwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIFZhbGlkYXRpbmcgaGVhZGVycworCQkvLyBjb250ZW50IGRpc3Bvc2l0aW9uCisJCUxpc3Q8U3RyaW5nPiBjb250RGlzcEhlYWRlckxpc3QgPSByZXN0UmVzcG9uc2UuZ2V0SGVhZGVyRmllbGRzKCkuZ2V0KENvbnN0YW50cy5DT05URU5UX0RJU1BPU0lUSU9OX0hFQURFUik7CisJCWFzc2VydE5vdE51bGwoY29udERpc3BIZWFkZXJMaXN0KTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjb250ZW50IGRpc3Bvc2l0aW9uIGhlYWRlciIsCisJCQkJbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoImF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIikuYXBwZW5kKGFydGlmYWN0TmFtZSkuYXBwZW5kKCJcIiIpLnRvU3RyaW5nKCksCisJCQkJY29udERpc3BIZWFkZXJMaXN0LmdldCgwKSk7CisKKwkJLy8gY29udGVudCB0eXBlCisJCUxpc3Q8U3RyaW5nPiBjb250VHlwZUhlYWRlckxpc3QgPSByZXN0UmVzcG9uc2UuZ2V0SGVhZGVyRmllbGRzKCkuZ2V0KENvbnN0YW50cy5DT05URU5UX1RZUEVfSEVBREVSKTsKKwkJYXNzZXJ0Tm90TnVsbChjb250VHlwZUhlYWRlckxpc3QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGNvbnRlbnQgdHlwZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCBjb250VHlwZUhlYWRlckxpc3QuZ2V0KDApKTsKKworCQlTdHJpbmcgYWN0dWFsQ29udGVudHMgPSByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKworCQlhc3NlcnRFcXVhbHMoYXJ0aWZhY3REZXRhaWxzLmdldFBheWxvYWQoKSwgQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhhY3R1YWxDb250ZW50cy5nZXRCeXRlcygpKSk7CisKKwkJLy8gdmFsaWRhdGluZyBjaGVja3N1bQorCQlieXRlW10gYnl0ZXMgPSBhY3R1YWxDb250ZW50cy5nZXRCeXRlcygpOworCQlTdHJpbmcgYWN0dWFsUGF5bG9hZENoZWNrc3VtID0gR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlCeXRlQXJyYXkoYnl0ZXMpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQYXlsb2FkQ2hlY2tzdW0sIGFjdHVhbFBheWxvYWRDaGVja3N1bSk7CisKKwkJLy8gdmFsaWRhdGluZyB2YWxpZCB6aXAKKwkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworCQlJbnB1dFN0cmVhbSB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0oaXMpOworCQl6aXMuY2xvc2UoKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiREFydGlmYWN0RG93bmxvYWQiOworCisJCUV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQgZXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCA9IG5ldyBFeHBlY3RlZERpc3REb3dubG9hZEF1ZGl0KGF1ZGl0QWN0aW9uLAorCQkJCVJlc291cmNlUmVzdFV0aWxzLmVjb21wLCBlbmNvZGVVcmxGb3JEb3dubG9hZChyZWxhdGl2ZVVybCksICIyMDAiLCAiT0siKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZERpc3REb3dubG9hZEF1ZGl0LCBhdWRpdEFjdGlvbik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFJlc291cmNlQXJ0aWZhY3RfTm9Db25zdW1lcklkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJrdWt1IjsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0ID0gbmV3IEFydGlmYWN0UmVxRGV0YWlscygpOworCQlhcnRpZmFjdC5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3ROYW1lKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gbmV3IFJlc291cmNlUmVxRGV0YWlscygpOworCQlyZXNvdXJjZS5zZXROYW1lKCJub3RFeGlzdGluZyIpOworCQlyZXNvdXJjZS5zZXRWZXJzaW9uKCIwLjEiKTsKKwkJU3RyaW5nIHJlbGF0aXZlVXJsID0gZW5jb2RlVXJsRm9yRG93bmxvYWQoU3RyaW5nLmZvcm1hdChVcmxzLkRJU1RSSUJfRE9XTkxPQURfUkVTT1VSQ0VfQVJUSUZBQ1RfUkVMQVRJVkVfVVJMLAorCQkJCVZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSksIHNlcnZpY2VCYXNlVmVyc2lvbiwKKwkJCQlWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShyZXNvdXJjZS5nZXROYW1lKCkpLCByZXNvdXJjZS5nZXRWZXJzaW9uKCksIGFydGlmYWN0TmFtZSkpOworCQlzZXJ2aWNlRGV0YWlscy5zZXRWZXJzaW9uKCIwLjEiKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlhdXRob3JpemF0aW9uSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgcmVzb3VyY2UsIGFydGlmYWN0LAorCQkJCWRlc2lnbmVyVXNlciwgYXV0aG9yaXphdGlvbkhlYWRlcnMsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRvd25sb2FkIHJlc291cmNlIiwgNDAwLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkRBcnRpZmFjdERvd25sb2FkIjsKKworCQlFeHBlY3RlZERpc3REb3dubG9hZEF1ZGl0IGV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQgPSBuZXcgRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdChhdWRpdEFjdGlvbiwgIiIsCisJCQkJcmVsYXRpdmVVcmwsICI0MDAiLCAiUE9MNTAwMTogRXJyb3I6IE1pc3NpbmcgJ1gtRUNPTVAtSW5zdGFuY2VJRCcgSFRUUCBoZWFkZXIuIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCwgYXVkaXRBY3Rpb24pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0X1Jlc291cmNlTmFtZU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJrdWt1IjsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0ID0gbmV3IEFydGlmYWN0UmVxRGV0YWlscygpOworCQlhcnRpZmFjdC5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3ROYW1lKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gbmV3IFJlc291cmNlUmVxRGV0YWlscygpOworCQlyZXNvdXJjZS5zZXROYW1lKCJub3RFeGlzdGluZyIpOworCQlyZXNvdXJjZS5zZXRWZXJzaW9uKCIwLjEiKTsKKwkJc2VydmljZURldGFpbHMuc2V0VmVyc2lvbigiMC4xIik7CisJCVN0cmluZyByZWxhdGl2ZVVybCA9IGVuY29kZVVybEZvckRvd25sb2FkKFN0cmluZy5mb3JtYXQoVXJscy5ESVNUUklCX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUX1JFTEFUSVZFX1VSTCwKKwkJCQlWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKSwgcmVzb3VyY2UuZ2V0VmVyc2lvbigpLCBhcnRpZmFjdE5hbWUpKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhvcml6YXRpb25IZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWF1dGhvcml6YXRpb25IZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5BVVRIT1JJWkFUSU9OLmdldFZhbHVlKCksIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCByZXNvdXJjZSwgYXJ0aWZhY3QsCisJCQkJZGVzaWduZXJVc2VyLCBhdXRob3JpemF0aW9uSGVhZGVycyk7CisKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRvd25sb2FkIHJlc291cmNlIiwgNDA0LCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkRBcnRpZmFjdERvd25sb2FkIjsKKworCQlFeHBlY3RlZERpc3REb3dubG9hZEF1ZGl0IGV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQgPSBuZXcgRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdChhdWRpdEFjdGlvbiwKKwkJCQlCYXNlUmVzdFV0aWxzLmVjb21wLCByZWxhdGl2ZVVybCwgIjQwNCIsCisJCQkJIlNWQzQwNjM6IEVycm9yOiBSZXF1ZXN0ZWQgJ05vdGV4aXN0aW5nJyByZXNvdXJjZSB3YXMgbm90IGZvdW5kLiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdF9SZXNvdXJjZVZlcnNpb25Ob3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGluZyByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsZXMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKCk7CisJCXJlc291cmNlRGV0YWlsZXMuc2V0TmFtZShyZXNvdXJjZS5nZXROYW1lKCkpOworCQlyZXNvdXJjZURldGFpbGVzLnNldFZlcnNpb24oIjAuMiIpOworCisJCXNlcnZpY2VEZXRhaWxzLnNldFZlcnNpb24oIjAuMSIpOworCisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAia3VrdSI7CisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdFJlcURldGFpbHMoKTsKKwkJYXJ0aWZhY3Quc2V0QXJ0aWZhY3ROYW1lKGFydGlmYWN0TmFtZSk7CisKKwkJU3RyaW5nIHJlbGF0aXZlVXJsID0gZW5jb2RlVXJsRm9yRG93bmxvYWQoU3RyaW5nLmZvcm1hdChVcmxzLkRJU1RSSUJfRE9XTkxPQURfUkVTT1VSQ0VfQVJUSUZBQ1RfUkVMQVRJVkVfVVJMLAorCQkJCVZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSksIHNlcnZpY2VCYXNlVmVyc2lvbiwKKwkJCQlWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShyZXNvdXJjZURldGFpbGVzLmdldE5hbWUoKSksIHJlc291cmNlRGV0YWlsZXMuZ2V0VmVyc2lvbigpLAorCQkJCWFydGlmYWN0TmFtZSkpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvbkhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJYXV0aG9yaXphdGlvbkhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFJlc291cmNlQXJ0aWZhY3Qoc2VydmljZURldGFpbHMsIHJlc291cmNlRGV0YWlsZXMsCisJCQkJYXJ0aWZhY3QsIGRlc2lnbmVyVXNlciwgYXV0aG9yaXphdGlvbkhlYWRlcnMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgcmVzb3VyY2UiLCA0MDQsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiREFydGlmYWN0RG93bmxvYWQiOworCisJCUV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQgZXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCA9IG5ldyBFeHBlY3RlZERpc3REb3dubG9hZEF1ZGl0KGF1ZGl0QWN0aW9uLAorCQkJCUJhc2VSZXN0VXRpbHMuZWNvbXAsIHJlbGF0aXZlVXJsLCAiNDA0IiwgIlNWQzQ1MDQ6IEVycm9yOiBSZXNvdXJjZSB2ZXJzaW9uIDAuMiB3YXMgbm90IGZvdW5kLiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdF9TZXJ2aWNlTmFtZU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGluZyByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCWRvd25sb2FkX3NlcnZpY2VOYW1lTm90Rm91bmRfaW5uZXIoIm5vdEV4aXN0aW5nU2VydmljZU5hbWUiLCBzZXJ2aWNlQmFzZVZlcnNpb24sIHJlc291cmNlLmdldE5hbWUoKSwKKwkJCQlyZXNvdXJjZS5nZXRWZXJzaW9uKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFJlc291cmNlQXJ0aWZhY3RfU2VydmljZVZlcnNpb25Ob3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRpbmcgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIENyZWF0ZSBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGluZyByZXNvdXJjZSIsIDIwMSwgc2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlzZXJ2aWNlVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKQorCQkJCS5nZXRVbmlxdWVJZCgpOworCisJCWRvd25sb2FkX3NlcnZpY2VWZXJzaW9uTm90Rm91bmRfaW5uZXIoc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4zIiwgcmVzb3VyY2UuZ2V0TmFtZSgpLAorCQkJCXJlc291cmNlLmdldFZlcnNpb24oKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdF9TZXJ2aWNlTmFtZU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRvd25sb2FkX3NlcnZpY2VOYW1lTm90Rm91bmRfaW5uZXIoIm5vdEV4aXN0aW5nU2VydmljZU5hbWUiLCBzZXJ2aWNlQmFzZVZlcnNpb24sIG51bGwsIG51bGwpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdF9TZXJ2aWNlVmVyc2lvbk5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gQ3JlYXRlIHNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIHNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgZGVzaWduZXJVc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIiwgMjAxLCBzZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXNlcnZpY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpCisJCQkJLmdldFVuaXF1ZUlkKCk7CisKKwkJZG93bmxvYWRfc2VydmljZVZlcnNpb25Ob3RGb3VuZF9pbm5lcihzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksICIwLjIiLCBudWxsLCBudWxsKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2V4dGVybmFsYXBpL0Rvd25sb2FkQXJ0aWZhY3RzVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZXh0ZXJuYWxhcGkvRG93bmxvYWRBcnRpZmFjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyNTIyNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2V4dGVybmFsYXBpL0Rvd25sb2FkQXJ0aWZhY3RzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzM4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5leHRlcm5hbGFwaTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5JbXBvcnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9kdWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuU2VydmljZUNhdGVnb3JpZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db21wb25lbnRJbnN0YW5jZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlByb2R1Y3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIERvd25sb2FkQXJ0aWZhY3RzVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCXB1YmxpYyBEb3dubG9hZEFydGlmYWN0c1Rlc3QoKSB7CisJCXN1cGVyKG5hbWUsIERvd25sb2FkQXJ0aWZhY3RzVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCXByaXZhdGUgVXNlciBzZG5jRGVzaWduZXJEZXRhaWxzOworCXByaXZhdGUgVXNlciBzZG5jQWRtaW5EZXRhaWxzOworCXByaXZhdGUgSW1wb3J0UmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNWRl8wMTsKKwlwcml2YXRlIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNWRl8wMjsKKwlwcml2YXRlIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNWRl8wMzsKKwlwcml2YXRlIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNDUF8wMTsKKwlwcml2YXRlIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzXzAxOworCXByaXZhdGUgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHNfMDI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcm9vdFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisKKwlAQmVmb3JlTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCisJcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluaXQoKTsKKwkJY3JlYXRlQ29tcG9uZW50cygpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJaW1wb3J0VmZXaXRoQXJ0aWZhY3RzKHJlc291cmNlRGV0YWlsc1ZGXzAxKTsKKwkJY3JlYXRlVkYocmVzb3VyY2VEZXRhaWxzVkZfMDMpOworCQljcmVhdGVWRihyZXNvdXJjZURldGFpbHNWRl8wMik7CisJCWNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCXNkbmNEZXNpZ25lckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzZG5jQWRtaW5EZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2VCeVR5cGUoIlZGMTAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uVkYudG9TdHJpbmcoKSk7CisJCXJlc291cmNlRGV0YWlsc1ZGXzAyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJWRjIwMCIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiVkYzMDAiLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwgUmVzb3VyY2VUeXBlRW51bS5WRi50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoIkNQMTAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlBPUlQsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfTkVUV09SS19FTEVNRU5UUywgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwgUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpKTsKKwkJc2VydmljZURldGFpbHNfMDEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgibmV3dGVzdHNlcnZpY2UxIiwgU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJc2VydmljZURldGFpbHNfMDIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgibmV3dGVzdHNlcnZpY2UyIiwgU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvd25sb2FkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0c0Zyb21TZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTZXJ2aWNlIHNlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlV2l0aFJJc1dpdGhBcnRpZmFjdHMoKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNvdXJjZUluc3RhbmNlcyA9IHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgcmkgOiByZXNvdXJjZUluc3RhbmNlcykgeworCQkJZGVwbG95bWVudEFydGlmYWN0cyA9IHJpLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0IDogZGVwbG95bWVudEFydGlmYWN0cy52YWx1ZXMoKSkgeworCQkJCWFzc2VydE5vdE51bGwoZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3Qoc2VydmljZSwgcmksIGFydGlmYWN0KSk7CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRvd25sb2FkU2VydmljZUFydGlmYWN0c1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU2VydmljZSBzZXJ2aWNlID0gY3JlYXRlU2VydmljZVdpdGhBcnRpZmFjdHMoKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gc2VydmljZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0IDogZGVwbG95bWVudEFydGlmYWN0cy52YWx1ZXMoKSkgeworCQkJYXNzZXJ0Tm90TnVsbChkb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlLCBhcnRpZmFjdCkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIFNlcnZpY2UgY3JlYXRlU2VydmljZVdpdGhBcnRpZmFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgb3RoZXJBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLmdldFR5cGUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShvdGhlckFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmV0dXJuZWQgOiIgKyBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UuZ2V0RXJyb3JDb2RlKCksIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyB5YW5nWG1sQXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5ZQU5HX1hNTC5nZXRUeXBlKCkpOworCisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSh5YW5nWG1sQXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXR1cm5lZCA6IiArIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZS5nZXRFcnJvckNvZGUoKSwgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlyZXR1cm4gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjcmVhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3QoU2VydmljZSBzZXJ2aWNlLCBDb21wb25lbnRJbnN0YW5jZSByaSwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfRE9XTkxPQURfU0VSVklDRV9SSV9BUlRJRkFDVCwgImxvY2FsaG9zdCIsICI4MDgwIiwgc2VydmljZS5nZXRVVUlEKCksIHJpLmdldE5vcm1hbGl6ZWROYW1lKCksIGFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ0FDSEVfQ09OVFJPTC5nZXRWYWx1ZSgpLCAibm8tY2FjaGUiKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCAiQmFzaWMgZEdWemREb3hNak0wTlRZPSIpOworCQloZWFkZXJzTWFwLnB1dCgiWC1FQ09NUC1JbnN0YW5jZUlEIiwgInRlc3QiKTsKKwkJaWYgKHVzZXJJZCAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHVzZXJJZCk7CisJCX0KKwkJc2VuZEF1dGhvcml6YXRpb25SZXF1ZXN0KCk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCQlpZiAocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgIT0gMjAwICYmIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkuZ2V0Qnl0ZXMoKSA9PSBudWxsICYmIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkuZ2V0Qnl0ZXMoKS5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGRvd25sb2FkU2VydmljZUFydGlmYWN0KFNlcnZpY2Ugc2VydmljZSwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVCwgImxvY2FsaG9zdCIsICI4MDgwIiwgc2VydmljZS5nZXRVVUlEKCksIGFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ0FDSEVfQ09OVFJPTC5nZXRWYWx1ZSgpLCAibm8tY2FjaGUiKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCAiQmFzaWMgZEdWemREb3hNak0wTlRZPSIpOworCQloZWFkZXJzTWFwLnB1dCgiWC1FQ09NUC1JbnN0YW5jZUlEIiwgInRlc3QiKTsKKwkJaWYgKHVzZXJJZCAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHVzZXJJZCk7CisJCX0KKwkJc2VuZEF1dGhvcml6YXRpb25SZXF1ZXN0KCk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCQlpZiAocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgIT0gMjAwICYmIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkuZ2V0Qnl0ZXMoKSA9PSBudWxsICYmIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkuZ2V0Qnl0ZXMoKS5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlOworCisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2Ugc2VuZEF1dGhvcml6YXRpb25SZXF1ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5QT1NUX0FVVEhPUklaQVRJT04sICJsb2NhbGhvc3QiLCAiODA4MCIpOworCQlTdHJpbmcgdXNlcklkID0gc2RuY0FkbWluRGV0YWlscy5nZXRVc2VySWQoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ0FDSEVfQ09OVFJPTC5nZXRWYWx1ZSgpLCAibm8tY2FjaGUiKTsKKwkJaWYgKHVzZXJJZCAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHVzZXJJZCk7CisJCX0KKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRQb3N0KHVybCwgIntcImNvbnN1bWVyTmFtZVwiOlwidGVzdFwiLFwiY29uc3VtZXJQYXNzd29yZFwiOlwiMGEwZGM1NTdjM2JmNTk0YjFhNDgwMzBlM2U5OTIyNzU4MDE2OGIyMWY0NGUyODVjNjk3NDBiOGQ1YjEzZTMzYlwiLFwiY29uc3VtZXJTYWx0XCI6XCIyYTFmODg3ZDYwN2Q0NTE1ZDQwNjZmZTBmNTQ1MmE1MFwifSIsIGhlYWRlcnNNYXApOworCQlpZiAocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgIT0gMjAxKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2VXaXRoUklzV2l0aEFydGlmYWN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlzZXJ2aWNlRGV0YWlsc18wMi5zZXRVbmlxdWVJZChzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJY3JlYXRlVHJlZUNoZWNrZWRpblZGSW5zdGFuY2VzKCk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc0NQXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCAiMC4xIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJY3JlYXRlVkZJbnN0YW5jZUFuZEF0b21pY1Jlc291cmNlSW5zdGFuY2VXaXRob3V0Q2hlY2tpbihyZXNvdXJjZURldGFpbHNWRl8wMSwgcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3AgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVTZXJ2aWNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCA1LCAwKTsKKworCQlyZXR1cm4gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdCh1cGRhdGVTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVHJlZUNoZWNrZWRpblZGSW5zdGFuY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVGaXJzdFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2Vjb25kVkZJbnN0UmVzcCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVUaGlyZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVGhpcmRWRkluc3RSZXNwKTsKKwl9CisKKwlwcml2YXRlIENvbXBvbmVudCBnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhDb21wb25lbnRSZXFEZXRhaWxzIGNvbXBvbmVudERldGFpbHMsIGludCBudW1iZXJPZlJJcywgaW50IG51bWJlck9mUmVsYXRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc3BvbnNlID0gbnVsbDsKKwkJQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCWlmIChjb21wb25lbnREZXRhaWxzIGluc3RhbmNlb2YgUmVzb3VyY2VSZXFEZXRhaWxzKSB7CisJCQlnZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNBZG1pbkRldGFpbHMsIGNvbXBvbmVudERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQl9IGVsc2UgaWYgKGNvbXBvbmVudERldGFpbHMgaW5zdGFuY2VvZiBTZXJ2aWNlUmVxRGV0YWlscykgeworCQkJZ2V0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoKFNlcnZpY2VSZXFEZXRhaWxzKSBjb21wb25lbnREZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwkJCWNvbXBvbmVudCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJfSBlbHNlIGlmIChjb21wb25lbnREZXRhaWxzIGluc3RhbmNlb2YgUHJvZHVjdFJlcURldGFpbHMpIHsKKwkJCWdldFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KGNvbXBvbmVudERldGFpbHMuZ2V0VW5pcXVlSWQoKSwgc2RuY0FkbWluRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCX0gZWxzZSB7CisJCQlBc3NlcnQuZmFpbCgiVW5zdXBwb3J0ZWQgdHlwZSBvZiBjb21wb25lbnREZXRhaWxzIC0gIiArIGNvbXBvbmVudERldGFpbHMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworCQl9CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRSZXNwb25zZSk7CisJCWludCBudW1iZXJPZkFjdHVhbFJJcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSAhPSBudWxsID8gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSA6IDA7CisJCWludCBudW1iZXJPZkFjdHVhbFJlbGF0aW9ucyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKSAhPSBudWxsID8gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpLnNpemUoKSA6IDA7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgbnVtYmVyIG9mIFJJcyBtZWV0IHRoZSBleHBlY3RlZCBudW1iZXIiLCBudW1iZXJPZlJJcywgbnVtYmVyT2ZBY3R1YWxSSXMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIG51bWJlciBvZiBSSSByZWxhdGlvbnMgbWVldCB0aGUgZXhwZWN0ZWQgbnVtYmVyIiwgbnVtYmVyT2ZSZWxhdGlvbnMsIG51bWJlck9mQWN0dWFsUmVsYXRpb25zKTsKKworCQlyZXR1cm4gY29tcG9uZW50OworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVdpdGhvdXRDaGVja2luKFJlc291cmNlUmVxRGV0YWlscyB2ZiwgUmVzb3VyY2VSZXFEZXRhaWxzIGF0b21pY1Jlc291cmNlLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0YW5jZSA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHZmLCB1c2VyKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RhbmNlKTsKKwkJUmVzdFJlc3BvbnNlIGF0b21pY0luc3RhbmNlRm9yU2VydmljZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwgYXRvbWljUmVzb3VyY2UsIHVzZXIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGF0b21pY0luc3RhbmNlRm9yU2VydmljZSk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShTZXJ2aWNlUmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBSZXNvdXJjZVJlcURldGFpbHMgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyLmdldFVzZXJJZCgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlyZXR1cm4gY3JlYXRlVkZJbnN0YW5jZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyKTsKKwl9CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RhbmNlKFNlcnZpY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFJlc291cmNlUmVxRGV0YWlscyBjb21wSW5zdE9yaWdpbkRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgdHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKFNlcnZpY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsIFJlc291cmNlUmVxRGV0YWlscyBjb21wSW5zdE9yaWdpbkRldGFpbHMsIFVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgdHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50UmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBDb21wb25lbnRSZXFEZXRhaWxzIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgVXNlciBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZUVudW0sIGJvb2xlYW4gaXNIaWdoZXN0TGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShjb21wSW5zdE9yaWdpbkRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIG1vZGlmaWVyLCBjb250YWluZXJEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGNvbnRhaW5lckNvbXBvbmVudFR5cGVFbnVtKTsKKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBTdHJpbmcgdXNlcklkLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtIGxpZmVDeWNsZVN0YXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdXNlcklkLCBsaWZlQ3ljbGVTdGF0ZXMpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hlY2tMQ1NfUmVzcG9uc2UocmVzcG9uc2UpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBdG9taWNSZXNvdXJjZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVZGKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVWRihyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVZGKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZmUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllcik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVmZSZXNwb25zZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZpY2UoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlU2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGltcG9ydFZmV2l0aEFydGlmYWN0cyhJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZGXzAxKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHBheWxvYWROYW1lID0gIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiOworCQlQYXRoIHBhdGggPSBQYXRocy5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9WRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCWJ5dGVbXSBkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMS5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDEuc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMS5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRl8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9nZW5lcmFsL0Jhc2ljSHR0cEF1dGhlbnRpY2F0aW9uVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZ2VuZXJhbC9CYXNpY0h0dHBBdXRoZW50aWNhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2E1MGJhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZ2VuZXJhbC9CYXNpY0h0dHBBdXRoZW50aWNhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvL1VTNTA1NjUzCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZ2VuZXJhbDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Db25zdW1lckRhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db25zdW1lclJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCYXNpY0h0dHBBdXRoZW50aWNhdGlvblRlc3QgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX0ZBSUxFRF9JTlZBTElEX0FVVEhFTlRJQ0FUSU9OX0hFQURFUiA9ICJBVVRIX0ZBSUxFRF9JTlZBTElEX0FVVEhFTlRJQ0FUSU9OX0hFQURFUiI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX1NVQ0NFU1MgPSAiQVVUSF9TVUNDRVNTIjsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhfRkFJTEVEX0lOVkFMSURfUEFTU1dPUkQgPSAiQVVUSF9GQUlMRURfSU5WQUxJRF9QQVNTV09SRCI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX0ZBSUxFRF9VU0VSX05PVF9GT1VORCA9ICJBVVRIX0ZBSUxFRF9VU0VSX05PVF9GT1VORCI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX1JFUVVJUkVEID0gIkFVVEhfUkVRVUlSRUQiOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1dXX0FVVEhFTlRJQ0FURSA9ICJXV1ctQXV0aGVudGljYXRlIjsKKworCS8vIHVzZXIgY2kgcGFzc3dvcmQgMTIzNDU2CisJLy8gcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBhdXRob3JpemF0aW9uSGVhZGVyID0gIkJhc2ljIFkyazZNVEl6TkRVMiI7CisJLy8gdXNlciBjaSBwYXNzd29yZCAxMjM0NTYKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFVTRVIgPSAiY2kiOworCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICIxMjM0NTYiOworCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQUxUID0gIjJhMWY4ODdkNjA3ZDQ1MTVkNDA2NmZlMGY1NDUyYTUwIjsKKworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgSEFTSEVEX1BBU1NXT1JEID0gIjBhMGRjNTU3YzNiZjU5NGIxYTQ4MDMwZTNlOTkyMjc1ODAxNjhiMjFmNDRlMjg1YzY5NzQwYjhkNWIxM2UzM2IiOworCisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluVXNlckRldGFpbHM7CisKKwlwcm90ZWN0ZWQgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBjb25zdW1lckRhdGFEZWZpbml0aW9uOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jVXNlckRldGFpbHM7CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RSZXFEZXRhaWxzIGRlcGxveW1lbnRBcnRpZmFjdDsKKworCXByb3RlY3RlZCBFeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQgZXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0OworCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBhdWRpdEFjdGlvbiA9ICJIdHRwQXV0aGVudGljYXRpb24iOworCisJcHJvdGVjdGVkIFN0cmluZyBleHBlY3RlZERvd25sb2FkU2VydmljZVVybDsKKwlwcm90ZWN0ZWQgU3RyaW5nIGV4cGVjdGVkRG93bmxvYWRSZXNvdXJjZVVybDsKKwlwcm90ZWN0ZWQgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgQmFzaWNIdHRwQXV0aGVudGljYXRpb25UZXN0KCkgeworCQlzdXBlcihuYW1lLCBCYXNpY0h0dHBBdXRoZW50aWNhdGlvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCXNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVJlc291cmNlIHJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VPYmplY3QpOworCQlTZXJ2aWNlIHNlcnZpY2VPYmplY3QgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlzZXJ2aWNlRGV0YWlscyA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhzZXJ2aWNlT2JqZWN0KTsKKworCQlkZXBsb3ltZW50QXJ0aWZhY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJhZGQgSEVBVCBhcnRpZmFjdCB0byByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKCk7CisJCS8vIGNlcnRpZmllZCByZXNvdXJjZQorCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiY2VydGlmeSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJLy8gYWRkIHJlc291cmNlIGluc3RhbmNlIHdpdGggSEVBVCBkZXBsb3ltZW50IGFydGlmYWN0IHRvIHRoZSBzZXJ2aWNlCisJCWNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscy5zZXRDb21wb25lbnRVaWQocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAxLCByZXR1cm5lZDogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlleHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQgPSBuZXcgRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0KCk7CisKKwkJLy8gUmVzdFJlc3BvbnNlIGFkZERlcGxveW1lbnRBcnRpZmFjdFJlc3BvbnNlID0KKwkJLy8gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGRlcGxveW1lbnRBcnRpZmFjdCwKKwkJLy8gc2RuY1VzZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJkaWRuJ3Qgc3VjY2VlZCB0byB1cGxvYWQgZGVwbG95bWVudCBhcnRpZmFjdCIsIDIwMCwKKwkJLy8gYWRkRGVwbG95bWVudEFydGlmYWN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vCisJCS8vIGRvd25sb2FkVXJsID0KKwkJLy8gU3RyaW5nLmZvcm1hdChVcmxzLkRJU1RSSUJfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwsCisJCS8vIFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldFNlcnZpY2VOYW1lKCkpLAorCQkvLyBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCS8vIFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZShkZXBsb3ltZW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpKTsKKworCQlleHBlY3RlZERvd25sb2FkUmVzb3VyY2VVcmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuRElTVFJJQl9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwsIFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSksIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQlWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKSwgcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKGRlcGxveW1lbnRBcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKSkpOworCQlleHBlY3RlZERvd25sb2FkUmVzb3VyY2VVcmwgPSBleHBlY3RlZERvd25sb2FkUmVzb3VyY2VVcmwuc3Vic3RyaW5nKCIvYXNkYy8iLmxlbmd0aCgpLCBleHBlY3RlZERvd25sb2FkUmVzb3VyY2VVcmwubGVuZ3RoKCkpOworCisJCWV4cGVjdGVkRG93bmxvYWRTZXJ2aWNlVXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRJU1RSSUJfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwsIFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSksIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQlWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplRmlsZU5hbWUoZGVwbG95bWVudEFydGlmYWN0LmdldEFydGlmYWN0TmFtZSgpKSk7CisJCWV4cGVjdGVkRG93bmxvYWRTZXJ2aWNlVXJsID0gZXhwZWN0ZWREb3dubG9hZFNlcnZpY2VVcmwuc3Vic3RyaW5nKCIvYXNkYy8iLmxlbmd0aCgpLCBleHBlY3RlZERvd25sb2FkU2VydmljZVVybC5sZW5ndGgoKSk7CisKKwkJc2RuY0FkbWluVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uID0gY3JlYXRlQ29uc3VtZXIoKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc3BvbnNlID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShkZWxldGVSZXNwb25zZSwgImRlbGV0ZSBvcGVyYXRpb24gZmlsZWQiLCBmYWxzZSwgNDA0LCAyMDApOworCQk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UpOworCisJfQorCisJQEFmdGVyTWV0aG9kCisJcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc3BvbnNlID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShkZWxldGVSZXNwb25zZSwgImRlbGV0ZSBvcGVyYXRpb24gZmlsZWQiLCBmYWxzZSwgNDA0LCAyMDApOworCQk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZW5kQXV0aGVudGljYXRlZFJlcXVlc3RUZXN0X3N1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvbkhlYWRlciA9IEJhc2VSZXN0VXRpbHMuYWRkQXV0aG9yaXplSGVhZGVyKFVTRVIsIFBBU1NXT1JEKTsKKwkJLy8gUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9CisJCS8vIEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLAorCQkvLyBkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFJlc291cmNlQXJ0aWZhY3Qoc2VydmljZURldGFpbHMsIHJlc291cmNlRGV0YWlscywgZGVwbG95bWVudEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgYXJ0aWZhY3QiLCAyMDAsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RmFsc2UocmVzdFJlc3BvbnNlLmdldEhlYWRlckZpZWxkcygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJFbnVtLldXV19BVVRIRU5USUNBVEUuZ2V0VmFsdWUoKSkpOworCisJCXZhbGlkYXRlQXVkaXRBdXRoZW50aWNhdGlvbihVU0VSLCBBVVRIX1NVQ0NFU1MsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXVkaXRBdXRoZW50aWNhdGlvbihTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBBdXRoU3RhdHVzLCBDb21wb25lbnRUeXBlRW51bSBjb21wVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChjb21wVHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSB7CisJCQlleHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQgPSBuZXcgRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0KGV4cGVjdGVkRG93bmxvYWRSZXNvdXJjZVVybCwgdXNlck5hbWUsIGF1ZGl0QWN0aW9uLCBBdXRoU3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkQXV0aGVudGljYXRpb25BdWRpdCA9IG5ldyBFeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQoZXhwZWN0ZWREb3dubG9hZFNlcnZpY2VVcmwsIHVzZXJOYW1lLCBhdWRpdEFjdGlvbiwgQXV0aFN0YXR1cyk7CisJCX0KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdXRoZW50aWNhdGlvbkF1ZGl0KGV4cGVjdGVkQXV0aGVudGljYXRpb25BdWRpdCk7CisJfQorCisJcHJvdGVjdGVkIENvbnN1bWVyRGF0YURlZmluaXRpb24gY3JlYXRlQ29uc3VtZXIoKSB7CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXIgPSBuZXcgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbigpOworCQljb25zdW1lci5zZXRDb25zdW1lck5hbWUoVVNFUik7CisJCWNvbnN1bWVyLnNldENvbnN1bWVyU2FsdChTQUxUKTsKKwkJY29uc3VtZXIuc2V0Q29uc3VtZXJQYXNzd29yZChIQVNIRURfUEFTU1dPUkQpOworCQlyZXR1cm4gY29uc3VtZXI7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlbmRBdXRoZW50aWNhdGVkUmVxdWVzdFdpdGhvdXRIZWFkZXJzVGVzdCgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgZGVwbG95bWVudEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRvd25sb2FkIGFydGlmYWN0IiwgNDAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQVVUSF9SRVFVSVJFRC5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydFRydWUocmVzdFJlc3BvbnNlLmdldEhlYWRlckZpZWxkcygpLmNvbnRhaW5zS2V5KFdXV19BVVRIRU5USUNBVEUpKTsKKwkJTGlzdDxTdHJpbmc+IGdldEF1dGhlbnRpY2F0ZUhlYWRlciA9IHJlc3RSZXNwb25zZS5nZXRIZWFkZXJGaWVsZHMoKS5nZXQoV1dXX0FVVEhFTlRJQ0FURSk7CisJCWFzc2VydEVxdWFscygid3d3LWF1dGhlbnRpY2F0ZSBoZWFkZXIgY29udGFpbnMgbW9yZSB0aGVuIG9uZSB2YWx1ZSIsIDEsIGdldEF1dGhlbnRpY2F0ZUhlYWRlci5zaXplKCkpOworCQlhc3NlcnRUcnVlKGdldEF1dGhlbnRpY2F0ZUhlYWRlci5nZXQoMCkuZXF1YWxzKCJCYXNpYyByZWFsbT0iICsgIlwiQVNEQ1wiIikpOworCisJCXZhbGlkYXRlQXVkaXRBdXRoZW50aWNhdGlvbigiIiwgQVVUSF9SRVFVSVJFRCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZW5kQXV0aGVudGljYXRlZFJlcXVlc3RUZXN0X3VzZXJJc05vdFByb3ZzaW9uZWQoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlTdHJpbmcgdXNlck5hbWUgPSAic2hheSI7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvbkhlYWRlciA9IEJhc2VSZXN0VXRpbHMuYWRkQXV0aG9yaXplSGVhZGVyKHVzZXJOYW1lLCAiMTIzNDU2Iik7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgZGVwbG95bWVudEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgYXJ0aWZhY3QiLCA0MDMsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5BVVRIX0ZBSUxFRC5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEZhbHNlKHJlc3RSZXNwb25zZS5nZXRIZWFkZXJGaWVsZHMoKS5jb250YWluc0tleShXV1dfQVVUSEVOVElDQVRFKSk7CisKKwkJdmFsaWRhdGVBdWRpdEF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lLCBBVVRIX0ZBSUxFRF9VU0VSX05PVF9GT1VORCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZW5kQXV0aGVudGljYXRlZFJlcXVlc3RUZXN0X3VzZXJJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlTdHJpbmcgdXNlck5hbWUgPSAiIjsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVyID0gQmFzZVJlc3RVdGlscy5hZGRBdXRob3JpemVIZWFkZXIodXNlck5hbWUsICIxMjM0NTYiKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCBhcnRpZmFjdCIsIDQwMywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkFVVEhfRkFJTEVELm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RmFsc2UocmVzdFJlc3BvbnNlLmdldEhlYWRlckZpZWxkcygpLmNvbnRhaW5zS2V5KFdXV19BVVRIRU5USUNBVEUpKTsKKworCQl2YWxpZGF0ZUF1ZGl0QXV0aGVudGljYXRpb24odXNlck5hbWUsIEFVVEhfRkFJTEVEX1VTRVJfTk9UX0ZPVU5ELCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlbmRBdXRoZW50aWNhdGVkUmVxdWVzdFRlc3RfcGFzc3dvcmRJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlTdHJpbmcgdXNlck5hbWUgPSAiY2kiOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhvcml6YXRpb25IZWFkZXIgPSBCYXNlUmVzdFV0aWxzLmFkZEF1dGhvcml6ZUhlYWRlcih1c2VyTmFtZSwgIiIpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3Qoc2VydmljZURldGFpbHMsIGRlcGxveW1lbnRBcnRpZmFjdCwgc2RuY1VzZXJEZXRhaWxzLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRvd25sb2FkIGFydGlmYWN0IiwgNDAzLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQVVUSF9GQUlMRUQubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRGYWxzZShyZXN0UmVzcG9uc2UuZ2V0SGVhZGVyRmllbGRzKCkuY29udGFpbnNLZXkoV1dXX0FVVEhFTlRJQ0FURSkpOworCisJCXZhbGlkYXRlQXVkaXRBdXRoZW50aWNhdGlvbih1c2VyTmFtZSwgQVVUSF9GQUlMRURfSU5WQUxJRF9QQVNTV09SRCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZW5kQXV0aGVudGljYXRlZFJlcXVlc3RUZXN0X3Bhc3Nvd3JkSXNOb3RWYWxpZGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlTdHJpbmcgdXNlckNpID0gImNpIjsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVyID0gQmFzZVJlc3RVdGlscy5hZGRBdXRob3JpemVIZWFkZXIodXNlckNpLCAiOTg3NjUiKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCBhcnRpZmFjdCIsIDQwMywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkFVVEhfRkFJTEVELm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RmFsc2UocmVzdFJlc3BvbnNlLmdldEhlYWRlckZpZWxkcygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJFbnVtLldXV19BVVRIRU5USUNBVEUuZ2V0VmFsdWUoKSkpOworCisJCXZhbGlkYXRlQXVkaXRBdXRoZW50aWNhdGlvbih1c2VyQ2ksIEFVVEhfRkFJTEVEX0lOVkFMSURfUEFTU1dPUkQsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VuZEF1dGhlbnRpY2F0ZWRSZXF1ZXN0VGVzdF9JbnZhbGlkSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVzZXJDcmVkZW50aWFscyA9IFVTRVIgKyAiOiIgKyBQQVNTV09SRDsKKwkJYnl0ZVtdIGVuY29kZUJhc2U2NCA9IEJhc2U2NC5lbmNvZGVCYXNlNjQodXNlckNyZWRlbnRpYWxzLmdldEJ5dGVzKCkpOworCQlTdHJpbmcgZW5jb2RlZFVzZXJDcmVkZW50aWFscyA9IG5ldyBTdHJpbmcoZW5jb2RlQmFzZTY0KTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWF1dGhvcml6YXRpb25IZWFkZXIucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgZW5jb2RlZFVzZXJDcmVkZW50aWFscyk7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgZGVwbG95bWVudEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgYXJ0aWZhY3QiLCA0MDAsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RmFsc2UocmVzdFJlc3BvbnNlLmdldEhlYWRlckZpZWxkcygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJFbnVtLldXV19BVVRIRU5USUNBVEUuZ2V0VmFsdWUoKSkpOworCisJCXZhbGlkYXRlQXVkaXRBdXRoZW50aWNhdGlvbigiIiwgQVVUSF9GQUlMRURfSU5WQUxJRF9BVVRIRU5USUNBVElPTl9IRUFERVIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBzZW5kVHdvQXV0aGVudGljYXRlZFJlcXVlc3RzVGVzdCgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvbkhlYWRlciA9IEJhc2VSZXN0VXRpbHMuYWRkQXV0aG9yaXplSGVhZGVyKFVTRVIsIFBBU1NXT1JEKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCBhcnRpZmFjdCIsIDIwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBzZWNvbmRSZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgZGVwbG95bWVudEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgc2Vjb25kIGRvd25sb2FkIGFydGlmYWN0IiwgMjAwLCBzZWNvbmRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHNlbmRBdXRoZW50aWNhdGVkUmVxdWVzdFRlc3RfdXNlclZhbGlkYXRpb25fMSgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBjb25zdW1lciA9IG5ldyBDb25zdW1lckRhdGFEZWZpbml0aW9uKCk7CisJCWNvbnN1bWVyLnNldENvbnN1bWVyTmFtZSgiY0kyNDY4Iik7CisJCWNvbnN1bWVyLnNldENvbnN1bWVyUGFzc3dvcmQoSEFTSEVEX1BBU1NXT1JEKTsKKwkJY29uc3VtZXIuc2V0Q29uc3VtZXJTYWx0KFNBTFQpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzcG9uc2UgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lciwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShkZWxldGVSZXNwb25zZSwgImRlbGV0ZSBvcGVyYXRpb24gZmlsZWQiLCBmYWxzZSwgNDA0LCAyMDApOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNwb25zZSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVyID0gQmFzZVJlc3RVdGlscy5hZGRBdXRob3JpemVIZWFkZXIoY29uc3VtZXIuZ2V0Q29uc3VtZXJOYW1lKCksIFBBU1NXT1JEKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCBhcnRpZmFjdCIsIDIwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWRlbGV0ZVJlc3BvbnNlID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXIsIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N0YXR1c0NvZGUoZGVsZXRlUmVzcG9uc2UsICJkZWxldGUgb3BlcmF0aW9uIGZpbGVkIiwgZmFsc2UsIDQwNCwgMjAwKTsKKwl9CisKKwkvLyBFQ09NUCBDb25zdW1lciBOYW1lIC0gVVRGLTggc3RyaW5nIHVwIHRvIDI1NSBjaGFyYWN0ZXJzIGNvbnRhaW5pbmcgdGhlCisJLy8gZm9sbG93aW5nIGNoYXJhY3RlcnMgOiAoIG1heWJlIHRvIGxpbWl0IDQtNjQgY2hhcnMgPyApCisJLy8gTG93ZXJjYXNlIGNoYXJhY3RlcnMge2Eten0KKwkvLyBVcHBlcmNhc2UgY2hhcmFjdGVycyB7QS1afQorCS8vIE51bWJlcnMgezAtOX0KKwkvLyBEYXNoIHstfTsgdGhpcyBjaGFyYWN0ZXIgaXMgbm90IHN1cHBvcnRlZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZQorCS8vIHVzZXIgbmFtZQorCS8vIFBlcmlvZCB7Ln07IHRoaXMgY2hhcmFjdGVyIGlzIG5vdCBzdXBwb3J0ZWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKKwkvLyB1c2VyIG5hbWUKKwkvLyBVbmRlcnNjb3JlIHtffQorCS8vIEBJZ25vcmUoImFkZCBtYW51YWxseSB1c2VyOnBhc3N3b3JkIDI0LSE2ODoxMjM0NTYgdG8KKwkvLyB1c2Vycy1jb25maWd1cmF0aW9uLnlhbWwgaW4gcnVudGltZSIpCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHNlbmRBdXRoZW50aWNhdGVkUmVxdWVzdFRlc3RfdXNlclZhbGlkYXRpb25fMigpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXIgPSBuZXcgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbigpOworCQljb25zdW1lci5zZXRDb25zdW1lck5hbWUoIjI0LSE2OCIpOworCQljb25zdW1lci5zZXRDb25zdW1lclBhc3N3b3JkKEhBU0hFRF9QQVNTV09SRCk7CisJCWNvbnN1bWVyLnNldENvbnN1bWVyU2FsdChTQUxUKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc3BvbnNlID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXIsIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N0YXR1c0NvZGUoZGVsZXRlUmVzcG9uc2UsICJkZWxldGUgb3BlcmF0aW9uIGZpbGVkIiwgZmFsc2UsIDQwNCwgMjAwKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzcG9uc2UgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lciwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhvcml6YXRpb25IZWFkZXIgPSBCYXNlUmVzdFV0aWxzLmFkZEF1dGhvcml6ZUhlYWRlcihjb25zdW1lci5nZXRDb25zdW1lck5hbWUoKSwgUEFTU1dPUkQpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3Qoc2VydmljZURldGFpbHMsIGRlcGxveW1lbnRBcnRpZmFjdCwgc2RuY1VzZXJEZXRhaWxzLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRvd25sb2FkIGFydGlmYWN0IiwgMjAwLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJZGVsZXRlUmVzcG9uc2UgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lciwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShkZWxldGVSZXNwb25zZSwgImRlbGV0ZSBvcGVyYXRpb24gZmlsZWQiLCBmYWxzZSwgNDA0LCAyMDApOworCX0KKworCS8vIHRoaXMgaXMgaW52YWxpZGUgYmVjb3VzZSB3ZSBkbyBub3QgdXNlIHRoZSA6IGFueSBtb3JlCisJLy8gQElnbm9yZSgiY2FuJ3QgZXhlY3R1ZSwgeWFtbCBmaWxlIGRvZXMgbm90IGFsbG93IHRvIGVudGVyIG1vcmUgdGhlbiBvbmUKKwkvLyBjb2xvbiBjb250aW51b3VzbHkgKFwiOlwiKSAiKQorCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBzZW5kQXV0aGVudGljYXRlZFJlcXVlc3RUZXN0X3VzZXJWYWxpZGF0aW9uXzMoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhvcml6YXRpb25IZWFkZXIgPSBCYXNlUmVzdFV0aWxzLmFkZEF1dGhvcml6ZUhlYWRlcigiYToiLCAiMTIzNDU2Iik7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgZGVwbG95bWVudEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgYXJ0aWZhY3QiLCAyMDAsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwkvLworCS8vICogRUNPTVAgQ29uc3VtZXIgUGFzc3dvcmQgLSBleHBlY3RlZCB0byBiZSBTSEEtMiAyNTYgZW5jcnlwdGVkIHZhbHVlICgKKwkvLyBTQUxUICsgInJlYWwiIHBhc3N3b3JkICkgPT4gbWF4aW1hbCBsZW5ndGggMjU2IGJ5dGVzID0gMzIgY2hhcmFjdGVycworCS8vIEJlZm9yZSBzdG9yaW5nL2NvbXBhcmluZyBwbGVhc2UgY29udmVydCB1cHBlciBjYXNlIGxldHRlciB0byBsb3dlci4KKwkvLyBUaGUgIm5vcm1hbGl6ZWQiIGVuY3J5cHRlZCBwYXNzd29yZCBzaG91bGQgbWF0Y2ggdGhlIGZvbGxvd2luZyBmb3JtYXQgOgorCS8vIFthLXowLTldCisJLy8gQElnbm9yZSgiYWRkIG1hbnVhbGx5IHVzZXI6cGFzc3dvcmQgMjQ2ODoxMjM6NDU2IHRvCisJLy8gdXNlcnMtY29uZmlndXJhdGlvbi55YW1sIGluIHJ1bnRpbWUiKQorCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBzZW5kQXV0aGVudGljYXRlZFJlcXVlc3RUZXN0X3Bhc3N3b3JkVmFsaWRhdGlvbl8xKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVyID0gQmFzZVJlc3RVdGlscy5hZGRBdXRob3JpemVIZWFkZXIoIkExIiwgIjEyMzo0NTYiKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCBhcnRpZmFjdCIsIDIwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCS8vICogRUNPTVAgQ29uc3VtZXIgUGFzc3dvcmQgLSBleHBlY3RlZCB0byBiZSBTSEEtMiAyNTYgZW5jcnlwdGVkIHZhbHVlICgKKwkvLyBTQUxUICsgInJlYWwiIHBhc3N3b3JkICkgPT4gbWF4aW1hbCBsZW5ndGggMjU2IGJ5dGVzID0gMzIgY2hhcmFjdGVycworCS8vIEJlZm9yZSBzdG9yaW5nL2NvbXBhcmluZyBwbGVhc2UgY29udmVydCB1cHBlciBjYXNlIGxldHRlciB0byBsb3dlci4KKwkvLyBUaGUgIm5vcm1hbGl6ZWQiIGVuY3J5cHRlZCBwYXNzd29yZCBzaG91bGQgbWF0Y2ggdGhlIGZvbGxvd2luZyBmb3JtYXQgOgorCS8vIFthLXowLTldCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCS8vIEBJZ25vcmUoImFkZCBtYW51YWxseSB1c2VyOnBhc3N3b3JkIDI0Njg6U3ExMjNhNDU2QiB0bworCS8vIHVzZXJzLWNvbmZpZ3VyYXRpb24ueWFtbCBpbiBydW50aW1lIikKKwlwdWJsaWMgdm9pZCBzZW5kQXV0aGVudGljYXRlZFJlcXVlc3RUZXN0X3Bhc3N3b3JkVmFsaWRhdGlvbl8yKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVyID0gQmFzZVJlc3RVdGlscy5hZGRBdXRob3JpemVIZWFkZXIoIkIyIiwgIlNxMTIzYTQ1NkIiKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0KHNlcnZpY2VEZXRhaWxzLCBkZXBsb3ltZW50QXJ0aWZhY3QsIHNkbmNVc2VyRGV0YWlscywgYXV0aG9yaXphdGlvbkhlYWRlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkb3dubG9hZCBhcnRpZmFjdCIsIDIwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCS8vICogRUNPTVAgQ29uc3VtZXIgUGFzc3dvcmQgLSBleHBlY3RlZCB0byBiZSBTSEEtMiAyNTYgZW5jcnlwdGVkIHZhbHVlICgKKwkvLyBTQUxUICsgInJlYWwiIHBhc3N3b3JkICkgPT4gbWF4aW1hbCBsZW5ndGggMjU2IGJ5dGVzID0gMzIgY2hhcmFjdGVycworCS8vIEJlZm9yZSBzdG9yaW5nL2NvbXBhcmluZyBwbGVhc2UgY29udmVydCB1cHBlciBjYXNlIGxldHRlciB0byBsb3dlci4KKwkvLyBUaGUgIm5vcm1hbGl6ZWQiIGVuY3J5cHRlZCBwYXNzd29yZCBzaG91bGQgbWF0Y2ggdGhlIGZvbGxvd2luZyBmb3JtYXQgOgorCS8vIFthLXowLTldCisJQFRlc3QKKwkvLyBASWdub3JlKCJhZGQgQzM6MTExVC0wLSojIHRvIGZpbGUiKQorCXB1YmxpYyB2b2lkIHNlbmRBdXRoZW50aWNhdGVkUmVxdWVzdFRlc3RfcGFzc3dvcmRWYWxpZGF0aW9uXzMoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhvcml6YXRpb25IZWFkZXIgPSBCYXNlUmVzdFV0aWxzLmFkZEF1dGhvcml6ZUhlYWRlcigiQzMiLCAiMTExVC0wLSojIik7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlRGV0YWlscywgZGVwbG95bWVudEFydGlmYWN0LCBzZG5jVXNlckRldGFpbHMsIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZG93bmxvYWQgYXJ0aWZhY3QiLCAyMDAsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2dlbmVyYWwvRmVQcm94eVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2dlbmVyYWwvRmVQcm94eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY3ZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZ2VuZXJhbC9GZVByb3h5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmdlbmVyYWw7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5DYXRlZ29yeVJlc3RVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZlUHJveHlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBGZVByb3h5VGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgRmVQcm94eVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGZVByb3h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgZGVmYXVsdFVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlSZXN0UmVzcG9uc2UgYWxsQ2F0ZWdvcmllc1Rvd2FyZHNGZSA9IENhdGVnb3J5UmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXNUb3dhcmRzRmUoZGVmYXVsdFVzZXIsCisJCQkJQmFzZVJlc3RVdGlscy5SRVNPVVJDRV9DT01QT05FTlRfVFlQRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgY2F0ZWdvcmllcyB0b3dhcmRzIEZFIiwgMjAwLAorCQkJCWFsbENhdGVnb3JpZXNUb3dhcmRzRmUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9nZW5lcmFsL01hbmFnZUVjb21wQ29uc3VtZXJDcmVkZW50aWFscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZ2VuZXJhbC9NYW5hZ2VFY29tcENvbnN1bWVyQ3JlZGVudGlhbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTFiMTUxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvZ2VuZXJhbC9NYW5hZ2VFY29tcENvbnN1bWVyQ3JlZGVudGlhbHMuamF2YQpAQCAtMCwwICsxLDEzODggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmdlbmVyYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbnN1bWVyUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgTWFuYWdlRWNvbXBDb25zdW1lckNyZWRlbnRpYWxzIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMgPSAiQWRkRUNPTVBVc2VyQ3JlZGVudGlhbHMiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTID0gIkRlbGV0ZUVDT01QVXNlckNyZWRlbnRpYWxzIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUyA9ICJHZXRFQ09NUFVzZXJDcmVkZW50aWFscyI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWNjZXB0SGVhZGVyRGF0YSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1NVQ0NFU1MgPSAyMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVEID0gMjAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFX0dFVCA9IDIwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQgPSA0MDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfTUlTU0lOR19EQVRBID0gNDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT04gPSA0MDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9BQ0NFU1MgPSA0MDM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQgPSA0MDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04gPSA0MDk7CisKKwlwcm90ZWN0ZWQgc3RhdGljIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJcHJvdGVjdGVkIENvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jQWRtaW5Vc2VyRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jRGVzaWduZXJVc2VyRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jVGVzdGVyVXNlckRldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0dvdmVybm9yVXNlckRldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY09wc1VzZXJEZXRhaWxzOworCisJcHVibGljIE1hbmFnZUVjb21wQ29uc3VtZXJDcmVkZW50aWFscygpIHsKKwkJc3VwZXIobmFtZSwgTWFuYWdlRWNvbXBDb25zdW1lckNyZWRlbnRpYWxzLmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXByb3RlY3RlZCBTdHJpbmcgc2FsdCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBhYiI7CisJcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBhYjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGFiIjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGVjb21wVXNlciA9ICJiZW5ueSI7CisKKwlwcm90ZWN0ZWQgTG9uZyBjb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWU7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNEZXNpZ25lclVzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJc2RuY1Rlc3RlclVzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCXNkbmNHb3Zlcm5vclVzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkdPVkVSTk9SKTsKKwkJc2RuY09wc1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLk9QUyk7CisKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbiA9IG5ldyBDb25zdW1lckRhdGFEZWZpbml0aW9uKCk7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKGVjb21wVXNlcik7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJQYXNzd29yZChwYXNzd29yZCk7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJTYWx0KHNhbHQpOworCQlDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisKKwl9CisKKwkvLyBVUzU2MzY4MSBtYW5hZ2UgRUNPTVAgY29uc3VtZXIgY3JlZGVudGlhbHMgLSBERUxFVEUvR0VUCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVFY29tcENyZWRlbnRpYWxzTWV0aG9kRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBEZWxldGUgY29uc3VtZXIKKwkJLy8gRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFX0dFVCwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZWNvbXBDb25zdW1lckF1ZGl0U3VjY2VzcyhERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEVfR0VUKTsKKwkJLy8gR2V0IENvbnN1bWVyIHRvIHZlcmlmeSB0aGF0IGNvbnN1bWVyIHVzZXIgZG9lcyBub3QgZXhpc3QKKwkJZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwkvLy8vIFVTNTYxNzI4IENSRUFURSBFQ09NUCBjb25zdW1lciBjcmVkZW50aWFscworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc01ldGhvZFBvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHBhcnNlIHVwZGF0ZWQgcmVzcG9uc2UgdG8gamF2YU9iamVjdAorCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGNyZWF0ZUNvbnN1bWVyUmVzdCk7CisJCS8vIFZhbGlkYXRlIGFjdHVhbCBjb25zdW1lckRhdGEgdG8gcmV0dXJuZWQgZnJvbSByZXNwb25zZQorCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoZ2V0Q29uc3VtZXJSZXN0KTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMudmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChjb25zdW1lckRhdGFEZWZpbml0aW9uLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmVjb21wQ29uc3VtZXJBdWRpdFN1Y2Nlc3MoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNVc2VyQWxyZWF5RXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoY3JlYXRlQ29uc3VtZXJSZXN0KTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMudmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChjb25zdW1lckRhdGFEZWZpbml0aW9uLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChnZXRDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisKKwkJLy8gQ3JlYXRlIGNvbnN1bWVyIHdoaWNoIGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IHBhc3N3b3JkIGFuZCBTYWx0CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lclBhc3N3b3JkKCJ6eGN2YiIpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyU2FsdCgiMTIzNDU2Nzg5MHF3ZXJ0eXVpb3AxMjM0NTY3ODkwYXMiKTsKKwkJY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gR2V0IENvbnN1bWVyIHdpdGggbmV3IGRhdGEKKwkJZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGdldENvbnN1bWVyUmVzdCk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5lY29tcENvbnN1bWVyQXVkaXRTdWNjZXNzKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQpOworCQkvLyBEZWxldGUgQ29uc3VtZXIKKwkJQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc0J5RGVzaWduZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gSHR0cENzcFVzZXJJZCBoZWFkZXIgY29udGFpbnMgRGVzaWduZXIgVXNlcklkCisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jRGVzaWduZXJVc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNyZWF0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNEZXNpZ25lclVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc0J5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIEh0dHBDc3BVc2VySWQgaGVhZGVyIGNvbnRhaW5zIFRlc3RlciBVc2VySWQKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNUZXN0ZXJVc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNyZWF0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNUZXN0ZXJVc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNCeU9wcygpIHRocm93cyBFeGNlcHRpb24geyAvLyBIdHRwQ3NwVXNlcklkIGhlYWRlciBjb250YWlucyBPUFMgVXNlcklkCisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jT3BzVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY3JlYXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jT3BzVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzQnlHb3Zlcm5vcigpIHRocm93cyBFeGNlcHRpb24geyAvLyBIdHRwQ3NwVXNlcklkIGhlYWRlciBjb250YWlucyBHb3Zlcm5vciBVc2VySWQgQ3JlYXRlIENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNHb3Zlcm5vclVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmNyZWF0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0dvdmVybm9yVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzQnlOb0V4aXN0aW5nSVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBub1NkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCW5vU2RuY1VzZXJEZXRhaWxzLnNldFJvbGUoImJsYWJsYSIpOworCQlub1NkbmNVc2VyRGV0YWlscy5zZXRVc2VySWQoImJ0NzUwaCIpOworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBub1NkbmNVc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHZlcmlmeSB0aGF0IGNvbnN1bWVyIGRpZG4ndCBjcmVhdGVkCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9BQ0NFU1MubmFtZSgpKTsKKwkJRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCBleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0KCk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEVjb21Vc2VyKAorCQkJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkgKyAiLCIgKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyU2FsdCgpLnRvTG93ZXJDYXNlKCkKKwkJCQkJCSsgIiwiICsgY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclBhc3N3b3JkKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCIiKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKCIoIiArIG5vU2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpICsgIikiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFY29tcENvbnN1bWVyQXVkaXQoZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QsCisJCQkJQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCX0KKworCS8vIHVzZXIgbmFtZQorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc1VzZXJOYW1lSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKG51bGwpOyAvLyBTVkM0NTI4CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX01JU1NJTkdfREFUQSwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHZlcmlmeSB0YWh0IGNvbnN1bWVyIGRpZG4ndCBjcmVhdGVkCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQS5uYW1lKCkpOworCQlFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0IGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQoKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RWNvbVVzZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclNhbHQoKS50b0xvd2VyQ2FzZSgpICsgIiwiCisJCQkJKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyUGFzc3dvcmQoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIkNvbnN1bWVyIG5hbWUiKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0CisJCQkJLnNldE1vZGlmaWVyKHNkbmNBZG1pblVzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkgKyAiKCIgKyBzZG5jQWRtaW5Vc2VyRGV0YWlscy5nZXRVc2VySWQoKSArICIpIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRWNvbXBDb25zdW1lckF1ZGl0KGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LAorCQkJCUFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNVc2VyTmFtZUlzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lck5hbWUoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQS5uYW1lKCkpOworCQlFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0IGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQoKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RWNvbVVzZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclNhbHQoKS50b0xvd2VyQ2FzZSgpICsgIiwiCisJCQkJKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyUGFzc3dvcmQoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIkNvbnN1bWVyIG5hbWUiKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0CisJCQkJLnNldE1vZGlmaWVyKHNkbmNBZG1pblVzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkgKyAiKCIgKyBzZG5jQWRtaW5Vc2VyRGV0YWlscy5nZXRVc2VySWQoKSArICIpIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRWNvbXBDb25zdW1lckF1ZGl0KGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LAorCQkJCUFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNVc2VyTmFtZUlzTm90VVRGOCgpIHRocm93cyBFeGNlcHRpb24geworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTmFtZSgi15HXoNeZIik7IC8vIFNWQzQ1MjgKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gdmVyaWZ5IHRoYXQgY29uc3VtZXIgZGlkbid0IGNyZWF0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzVXNlck5hbWVNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lck5hbWUoCisJCQkJIl9BQkNELS5hYmNkcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1xdzEyMzQ1Njc4OTBwb2l1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnMzQ1Njc4OTBwb2l1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnMzQ1Njc4OTBwZjM0NTY3ODkwcG9pdXRyZXdhc2RmZ2hqa2xxd2VydHl1aW9wemFpdXRyZXdhc2RmZ2doamtscXdlcnR5dWlvcHphaXV0cmV3YXNkZmdoamtscXdlcnR5dWlvcHphc3hjZGZlcmYxMjM0NTYuLSIpOyAvLyBTVkM0NTI4CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIFZhbGlkYXRlIGFjdHVhbCBjb25zdW1lckRhdGEgdG8gcmV0dXJuZWQgZnJvbSByZXNwb25zZQorCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGNyZWF0ZUNvbnN1bWVyUmVzdCk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoZ2V0Q29uc3VtZXJSZXN0KTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMudmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChjb25zdW1lckRhdGFEZWZpbml0aW9uLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmVjb21wQ29uc3VtZXJBdWRpdFN1Y2Nlc3MoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCk7CisJCS8vIERlbGV0ZSBDb25zdW1lcgorCQlDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzVXNlck5hbWVFeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lck5hbWUoCisJCQkJIl9BQkNELS5hYmNkcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1xdzEyMzQ1Njc4OTBwb2l1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnMzQ1Njc4OTBwb2l1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnMzQ1Njc4OTBwZjM0NTY3ODkwcG9pdXRyZXdhc2RmZ2hqa2xxd2VydHl1aW9wemFpdXRyZXdhc2RmZ2doamtscXdlcnR5dWlvcHphaXV0cmV3YXNkZmdoamtscXdlcnR5dWlvcHphc3hjZGZlcmYxMjM0NTYuLS0iKTsgLy8gU1ZDNDUyOAorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGhhdCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuRVhDRUVEU19MSU1JVCwgIkNvbnN1bWVyIG5hbWUiLCAiMjU1Iik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzVXNlck5hbWVMYXN0Q2hhcklzRGFzaCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBhbGxvd2VkCisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKCJBQkNEMzQ1Njc4OTBwZjM0NTY3ODkwcG9pdXRyZXctIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHBhcnNlIHVwZGF0ZWQgcmVzcG9uc2UgdG8gamF2YU9iamVjdCAsIFZhbGlkYXRlIGFjdHVhbCBjb25zdW1lckRhdGEKKwkJLy8gdG8gcmV0dXJuZWQgZnJvbSByZXNwb25zZQorCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGNyZWF0ZUNvbnN1bWVyUmVzdCk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoZ2V0Q29uc3VtZXJSZXN0KTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMudmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChjb25zdW1lckRhdGFEZWZpbml0aW9uLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmVjb21wQ29uc3VtZXJBdWRpdFN1Y2Nlc3MoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCk7CisJCS8vIERlbGV0ZSBDb25zdW1lcgorCQlDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzVXNlck5hbWVMYXN0Q2hhcklzUGVyaW9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKCJBQkNEMzQ1Njc4OTBwZjM0NTY3ODkwcG9pdXRyZXcuIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHBhcnNlIHVwZGF0ZWQgcmVzcG9uc2UgdG8gamF2YU9iamVjdCAsIFZhbGlkYXRlIGFjdHVhbCBjb25zdW1lckRhdGEKKwkJLy8gdG8gcmV0dXJuZWQgZnJvbSByZXNwb25zZQorCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGNyZWF0ZUNvbnN1bWVyUmVzdCk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoZ2V0Q29uc3VtZXJSZXN0KTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMudmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChjb25zdW1lckRhdGFEZWZpbml0aW9uLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmVjb21wQ29uc3VtZXJBdWRpdFN1Y2Nlc3MoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCk7CisJCS8vIERlbGV0ZSBDb25zdW1lcgorCQlDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzVXNlck5hbWVMYXN0Q2hhcklzVW5kZXJzY29yZSgpIHRocm93cyBFeGNlcHRpb24geworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTmFtZSgiQUJDRDM0NTY3ODkwcGYzNDU2Nzg5MHBvaXV0cmV3XyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBwYXJzZSB1cGRhdGVkIHJlc3BvbnNlIHRvIGphdmFPYmplY3QgLCBWYWxpZGF0ZSBhY3R1YWwgY29uc3VtZXJEYXRhCisJCS8vIHRvIHJldHVybmVkIGZyb20gcmVzcG9uc2UKKwkJQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChjcmVhdGVDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisJCS8vIEdldCBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGdldENvbnN1bWVyUmVzdCk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5lY29tcENvbnN1bWVyQXVkaXRTdWNjZXNzKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQpOworCQkvLyBEZWxldGUgQ29uc3VtZXIKKwkJQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc1VzZXJOYW1lRmlyc3RDaGFySXNVbmRlcnNjb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKCJfQUJDRDM0NTY3ODkwcGYzNDU2Nzg5MHBvaXV0cmUiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gcGFyc2UgdXBkYXRlZCByZXNwb25zZSB0byBqYXZhT2JqZWN0ICwgVmFsaWRhdGUgYWN0dWFsIGNvbnN1bWVyRGF0YQorCQkvLyB0byByZXR1cm5lZCBmcm9tIHJlc3BvbnNlCisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoY3JlYXRlQ29uc3VtZXJSZXN0KTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMudmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChjb25zdW1lckRhdGFEZWZpbml0aW9uLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChnZXRDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZWNvbXBDb25zdW1lckF1ZGl0U3VjY2VzcyhBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVEKTsKKwkJLy8gRGVsZXRlIENvbnN1bWVyCisJCUNvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNVc2VyTmFtZUZpcnN0Q2hhcklzUGVyaW9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKCIuQUJDRDM0NTY3ODkwcGYzNDU2Nzg5MHBvaXV0cmUiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gdmVyaWZ5IHRoYXQgY29uc3VtZXIgZGlkbid0IGNyZWF0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY3JlYXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVF9QQVJBTSwgIkNvbnN1bWVyIG5hbWUiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNVc2VyTmFtZUZpcnN0Q2hhcklzRGFzaCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3QKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFsbG93ZWQKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lck5hbWUoIi1BQkNEMzQ1Njc4OTBwZjM0NTY3ODkwcG9pdXRyZSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGhhdCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UX1BBUkFNLCAiQ29uc3VtZXIgbmFtZSIpOworCX0KKworCS8vLyBQYXNzd29yZAorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc1Bhc3N3b3JkSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJQYXNzd29yZChudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTUlTU0lOR19EQVRBLAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gdmVyaWZ5IHRhaHQgY29uc3VtZXIgZGlkbid0IGNyZWF0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLm5hbWUoKSk7CisJCUV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQgZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCgpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRFY29tVXNlcihjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpICsgIiwiCisJCQkJKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyU2FsdCgpLnRvTG93ZXJDYXNlKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCJDb25zdW1lciBwYXNzd29yZCIpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QKKwkJCQkuc2V0TW9kaWZpZXIoc2RuY0FkbWluVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSArICIoIiArIHNkbmNBZG1pblVzZXJEZXRhaWxzLmdldFVzZXJJZCgpICsgIikiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFY29tcENvbnN1bWVyQXVkaXQoZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QsCisJCQkJQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc1Bhc3N3b3JkSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyUGFzc3dvcmQoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9NSVNTSU5HX0RBVEEsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGFodCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEubmFtZSgpKTsKKwkJRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCBleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0KCk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEVjb21Vc2VyKGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkgKyAiLCIKKwkJCQkrIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJTYWx0KCkudG9Mb3dlckNhc2UoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIkNvbnN1bWVyIHBhc3N3b3JkIikpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdAorCQkJCS5zZXRNb2RpZmllcihzZG5jQWRtaW5Vc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpICsgIigiICsgc2RuY0FkbWluVXNlckRldGFpbHMuZ2V0VXNlcklkKCkgKyAiKSIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUVjb21wQ29uc3VtZXJBdWRpdChleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCwKKwkJCQlBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzUGFzc3dvcmRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gcGFzc3dvcmQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA2NAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGFycworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyUGFzc3dvcmQoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGFiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwYWIiKTsKKwkJLy8gQ3JlYXRlIENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHBhcnNlIHVwZGF0ZWQgcmVzcG9uc2UgdG8gamF2YU9iamVjdAorCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGNyZWF0ZUNvbnN1bWVyUmVzdCk7CisJCS8vIFZhbGlkYXRlIGFjdHVhbCBjb25zdW1lckRhdGEgdG8gcmV0dXJuZWQgZnJvbSByZXNwb25zZQorCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisJCS8vIEdldCBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGdldENvbnN1bWVyUmVzdCk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5lY29tcENvbnN1bWVyQXVkaXRTdWNjZXNzKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQpOworCQkvLyBEZWxldGUgQ29uc3VtZXIKKwkJQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc1Bhc3N3b3JkRXhjZWVlZE1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBwYXNzd29yZAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDY0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGFycworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyUGFzc3dvcmQoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGFiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwYWIxIik7CisJCS8vIENyZWF0ZSBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGhhdCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9MRU5HVEgsICJDb25zdW1lciBwYXNzd29yZCIsICI2NCIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFQYXNzd29yZFZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFBhc3N3b3JkIENvbnRhaW5zIGxvd2VyY2FzZS91cHBlcmNhc2UgY2hhcmFjdGVycyBhbmQgbnVtYmVycyAtCisJCS8vIGNvbnZlcnQgdXBwZXIgY2FzZSBsZXR0ZXIgdG8gbG93ZXIKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lclBhc3N3b3JkKCJBQkNhYmMxMjM0NTY3ODkwUE9JbW5iMTIzNDU2Nzg5MDEyMzQ1Njc4OTBQT0lVenhjdmJOTUFTREZHaGprbDEyIik7CisJCS8vIENyZWF0ZSBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGdldENvbnN1bWVyRGF0YU9iamVjdCA9IENvbnN1bWVyUmVzdFV0aWxzLnBhcnNlQ29tc3VtZXJSZXNwKGNyZWF0ZUNvbnN1bWVyUmVzdCk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoZ2V0Q29uc3VtZXJSZXN0KTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMudmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChjb25zdW1lckRhdGFEZWZpbml0aW9uLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy5lY29tcENvbnN1bWVyQXVkaXRTdWNjZXNzKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQpOworCisJfQorCisJLy8vLyBTYWx0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFY29tcENyZWRlbnRpYWxzU2FsdElzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBMZW5ndGggbXVzdCBiZSAzMiBjaGFyYWN0ZXJzCisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJTYWx0KG51bGwpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9NSVNTSU5HX0RBVEEsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGhhdCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEubmFtZSgpKTsKKwkJRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCBleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0KCk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEVjb21Vc2VyKGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkgKyAiLCIKKwkJCQkrIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJQYXNzd29yZCgpLnRvTG93ZXJDYXNlKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCJDb25zdW1lciBzYWx0IikpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdAorCQkJCS5zZXRNb2RpZmllcihzZG5jQWRtaW5Vc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpICsgIigiICsgc2RuY0FkbWluVXNlckRldGFpbHMuZ2V0VXNlcklkKCkgKyAiKSIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUVjb21wQ29uc3VtZXJBdWRpdChleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCwKKwkJCQlBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNTYWx0SXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyU2FsdCgiIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX01JU1NJTkdfREFUQSwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHZlcmlmeSB0aGF0IGNvbnN1bWVyIGRpZG4ndCBjcmVhdGVkCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQS5uYW1lKCkpOworCQlFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0IGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQoKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RWNvbVVzZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lck5hbWUoKSArICIsIgorCQkJCSsgY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclBhc3N3b3JkKCkudG9Mb3dlckNhc2UoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIkNvbnN1bWVyIHNhbHQiKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0CisJCQkJLnNldE1vZGlmaWVyKHNkbmNBZG1pblVzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkgKyAiKCIgKyBzZG5jQWRtaW5Vc2VyRGV0YWlscy5nZXRVc2VySWQoKSArICIpIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRWNvbXBDb25zdW1lckF1ZGl0KGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LAorCQkJCUFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNTYWx0TGVuZ3RoTGVzc1RoYW4zMigpIHRocm93cyBFeGNlcHRpb24geworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyU2FsdCgiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwYSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGhhdCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9MRU5HVEgsICJDb25zdW1lciBzYWx0Iik7CisKKwl9CisKKwkvLyBCdWcKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNTYWx0TGVuZ3RoTW9yZVRoYW4zMigpIHRocm93cyBFeGNlcHRpb24geyAvLyBMZW5ndGgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAzMgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGFyYWN0ZXJzCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gU1ZDNDUyOQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAiRXJyb3I6CisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIEludmFsaWQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gQ29udGVudC4KKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJTEKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZXhjZWVkcworCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsaW1pdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAlMgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGFyYWN0ZXJzLiIKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lclNhbHQoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGFiYyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGhhdCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9MRU5HVEgsICJDb25zdW1lciBzYWx0Iik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNTYWx0VXBwZXJjYXNlQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDb250YWlucyB1cHBlcmNhc2UgY2hhcmFjdGVyc+KAkyBleGNlcHRpb24gaW52YWxpZCBjb250ZW50CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJTYWx0KCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBBQiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyB2ZXJpZnkgdGhhdCBjb25zdW1lciBkaWRuJ3QgY3JlYXRlZAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVF9QQVJBTS5uYW1lKCkpOworCQlFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0IGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQoKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RWNvbVVzZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lck5hbWUoKSArICIsIgorCQkJCSsgY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclNhbHQoKSArICIsIiArIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJQYXNzd29yZCgpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygiQ29uc3VtZXIgc2FsdCIpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QKKwkJCQkuc2V0TW9kaWZpZXIoc2RuY0FkbWluVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSArICIoIiArIHNkbmNBZG1pblVzZXJEZXRhaWxzLmdldFVzZXJJZCgpICsgIikiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFY29tcENvbnN1bWVyQXVkaXQoZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QsCisJCQkJQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCX0KKworCS8vIFVTRVJfSUQgKFVTRVJfSUQgaXMgdGFrZW4gZnJvbSBVU0VSX0lEIGhlYWRlcikKKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc0h0dHBDc3BVc2VySWRJc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFVTRVJfSUQgaXMgdGFrZW4gZnJvbSBVU0VSX0lEIGhlYWRlcgorCQlzZG5jQWRtaW5Vc2VyRGV0YWlscy5zZXRVc2VySWQoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04ubmFtZSgpKTsKKwkJRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCBleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0KCk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEVjb21Vc2VyKGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkgKyAiLCIKKwkJCQkrIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJTYWx0KCkgKyAiLCIgKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyUGFzc3dvcmQoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIkNvbnN1bWVyIHNhbHQiKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFY29tcENvbnN1bWVyQXVkaXQoZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QsCisJCQkJQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc0h0dHBDc3BVc2VySWRJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gVVNFUl9JRCBpcyB0YWtlbiBmcm9tIFVTRVJfSUQgaGVhZGVyCisJCXNkbmNBZG1pblVzZXJEZXRhaWxzLnNldFVzZXJJZChudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTiwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLm5hbWUoKSk7CisJCUV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQgZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCgpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRFY29tVXNlcihjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpICsgIiwiCisJCQkJKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyU2FsdCgpICsgIiwiICsgY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclBhc3N3b3JkKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCJDb25zdW1lciBzYWx0IikpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcigiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRWNvbXBDb25zdW1lckF1ZGl0KGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LAorCQkJCUFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNIdHRwQ3NwVXNlcklkSGVhZGVySXNNaXNzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lckh0dHBDc3BBdHVVaWRJc01pc3NpbmcoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04ubmFtZSgpKTsKKwkJRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCBleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0KCk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEVjb21Vc2VyKGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkgKyAiLCIKKwkJCQkrIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJTYWx0KCkgKyAiLCIgKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyUGFzc3dvcmQoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIkNvbnN1bWVyIHNhbHQiKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFY29tcENvbnN1bWVyQXVkaXQoZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QsCisJCQkJQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCX0KKworCS8vIGFkZCBVU0VSX0lEIGluIGpzb24gYm9keQorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFKc29uQm9keUNvbnRhaW5MYXN0TW9kZmllckF0dWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZCBVU0VSX0lEIChub3QgYWRtaW4pIHRvIGpzb24gLSB3ZSB3aWxsIGlnbm9yZSBhbmQgY3JlYXRlIHRoZSB1c2VyCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGpzb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJanNvbk1hcC5wdXQoImNvbnN1bWVyTmFtZSIsICJiZW5ueSIpOworCQlqc29uTWFwLnB1dCgiY29uc3VtZXJQYXNzd29yZCIsICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBhYjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGFiIik7CisJCWpzb25NYXAucHV0KCJjb25zdW1lclNhbHQiLCAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwYWIiKTsKKwkJanNvbk1hcC5wdXQoImxhc3RNb2RmaWVyQXR1aWQiLCAiY3MwMDA4Iik7IC8vIGRlc2lnbmVyCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXIgPSBnc29uLmZyb21Kc29uKGpzb25NYXAudG9TdHJpbmcoKSwgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbi5jbGFzcyk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBWYWxpZGF0ZSBhY3R1YWwgY29uc3VtZXJEYXRhIHRvIHJldHVybmVkIGZyb20gcmVzcG9uc2UKKwkJQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChjcmVhdGVDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChnZXRDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyLCBnZXRDb25zdW1lckRhdGFPYmplY3QpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmVjb21wQ29uc3VtZXJBdWRpdFN1Y2Nlc3MoQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyLCBzZG5jQWRtaW5Vc2VyRGV0YWlscywKKwkJCQlTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQpOworCQkvLyBEZWxldGUgY29uc3VtZXIKKwkJQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXIsIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNVc2VyTmFtZU5vdEFsbG93ZWRDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNoYXIgaW52YWxpZENoYXJzW10gPSB7ICdgJywgJyEnLCAnQCcsICcjJywgJyQnLCAnJScsICdeJywgJyYnLCAnKicsICcoJywgJyknLCAnKycsICc9JywgJzwnLCAnPicsICc/JywgJy8nLAorCQkJCSciJywgJzonLCAnfScsICddJywgJ1snLCAneycsICd8JywgJ1xcJywgJyAnLCAnXHQnLCAnXG4nIH07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZENoYXJzLmxlbmd0aDsgaSsrKSB7CisJCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTmFtZShpbnZhbGlkQ2hhcnNbaV0gKyAiQUJDZGVmMTIzIik7CisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuY3JlYXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQkJc2RuY0FkbWluVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlRfUEFSQU0sICJDb25zdW1lciBuYW1lIik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNQYXNzd29yZElzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworCQljaGFyIGludmFsaWRDaGFyc1tdID0geyAnYCcsICchJywgJ0AnLCAnIycsICckJywgJyUnLCAnXicsICcmJywgJyonLCAnKCcsICcpJywgJysnLCAnPScsICc8JywgJz4nLCAnPycsICcvJywKKwkJCQknIicsICc6JywgJ30nLCAnXScsICdbJywgJ3snLCAnfCcsICdcXCcsICcgJywgJ1x0JywgJ1xuJyB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRDaGFycy5sZW5ndGg7IGkrKykgeworCQkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lclBhc3N3b3JkKAorCQkJCQkiQUJDIiArIGludmFsaWRDaGFyc1tpXSArICJBQkNhYmMxMjM0NTY3ODkwUE9JbW5iMTIzNDU2Nzg5MDEyMzQ1Njc4OTBQT0lVenhjdmJOTUFTREZHaGoiKTsKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVF9QQVJBTSwgIkNvbnN1bWVyIHBhc3N3b3JkIik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUVjb21wQ3JlZGVudGlhbHNTYWx0Tm90QWxsb3dlZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gU2FsdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDMyCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGFycworCQljaGFyIGludmFsaWRDaGFyc1tdID0geyAnYCcsICchJywgJ0AnLCAnIycsICckJywgJyUnLCAnXicsICcmJywgJyonLCAnKCcsICcpJywgJysnLCAnPScsICc8JywgJz4nLCAnPycsICcvJywKKwkJCQknIicsICc6JywgJ30nLCAnXScsICdbJywgJ3snLCAnfCcsICdcXCcsICcgJywgJ1x0JywgJ1xuJyB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRDaGFycy5sZW5ndGg7IGkrKykgeworCQkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lclNhbHQoaW52YWxpZENoYXJzW2ldICsgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEiKTsKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCQlBdWRpdFZhbGlkYXRpb25VdGlscy5jcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVF9QQVJBTSwgIkNvbnN1bWVyIHNhbHQiKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRWNvbXBDcmVkZW50aWFsc1Bhc3N3b3JkRW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyUGFzc3dvcmQoIjBhMGRjNTU3YzNiZjU5NGIxYTQ4MDMwZTNlOTkyMjc1ODAxNjhiMjFmNDRlMjg1YzY5NzQwYjhkNWIxM2UzM2IiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gcGFyc2UgdXBkYXRlZCByZXNwb25zZSB0byBqYXZhT2JqZWN0CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoY3JlYXRlQ29uc3VtZXJSZXN0KTsKKwkJLy8gVmFsaWRhdGUgYWN0dWFsIGNvbnN1bWVyRGF0YSB0byByZXR1cm5lZCBmcm9tIHJlc3BvbnNlCisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChnZXRDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZWNvbXBDb25zdW1lckF1ZGl0U3VjY2VzcyhBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVEKTsKKwl9CisKKwkvLworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVFY29tcFVzZXJBbHJlYXlEZWxldGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEdldCBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIERlbGV0ZSBFQ09NUCBjb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgZGVsZXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURV9HRVQsCisJCQkJZGVsZXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBUcnkgdG8gZGVsZXRlIEVDT01QIGNvbnN1bWVyIGFscmVhZHkgZGVsZXRlZAorCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCWRlbGV0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZGVsZXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLkVDT01QX1VTRVJfTk9UX0ZPVU5ELCBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUVjb21wVXNlckJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEdldCBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIERlbGV0ZSBjb25zdW1lcgorCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCVJlc3RSZXNwb25zZSBkZWxldGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNUZXN0ZXJVc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZGVsZXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jVGVzdGVyVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCS8vIFZlcmlmeSB0aGF0IGNvbnN1bWVyIGlzIG5vdCBkZWxldGVkCisJCWdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlRWNvbXBVc2VyQnlPcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gRGVsZXRlIGNvbnN1bWVyCisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNPcHNVc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZGVsZXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jT3BzVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCS8vIFZlcmlmeSB0aGF0IGNvbnN1bWVyIGlzIG5vdCBkZWxldGVkCisJCWdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlRWNvbXBVc2VyQnlHb3Zlcm5vcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBEZWxldGUgY29uc3VtZXIKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jR292ZXJub3JVc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZGVsZXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jR292ZXJub3JVc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJLy8gVmVyaWZ5IHRoYXQgY29uc3VtZXIgaXMgbm90IGRlbGV0ZWQKKwkJZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVFY29tcFVzZXJCeURlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEdldCBDb25zdW1lcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIERlbGV0ZSBjb25zdW1lcgorCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCVJlc3RSZXNwb25zZSBkZWxldGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNEZXNpZ25lclVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWRlbGV0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5kZWxldGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKERFTEVURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNEZXNpZ25lclVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkvLyBWZXJpZnkgdGhhdCBjb25zdW1lciBpcyBub3QgZGVsZXRlZAorCQlnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUVjb21wVXNlckJ5Tm9FeGlzdGluZ0lVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgbm9TZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlub1NkbmNVc2VyRGV0YWlscy5zZXRSb2xlKCJibGFibGEiKTsKKwkJbm9TZG5jVXNlckRldGFpbHMuc2V0VXNlcklkKCJidDc1MGgiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gRGVsZXRlIGNvbnN1bWVyCisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIG5vU2RuY1VzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfQUNDRVNTLAorCQkJCWRlbGV0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfQUNDRVNTLm5hbWUoKSk7CisJCUV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQgZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCgpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRFY29tVXNlcihjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygiIikpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcigiKCIgKyBub1NkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSArICIpIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRWNvbXBDb25zdW1lckF1ZGl0KGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LAorCQkJCURFTEVURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwkJLy8gVmVyaWZ5IHRoYXQgY29uc3VtZXIgaXMgbm90IGRlbGV0ZWQKKwkJZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVFY29tcENyZWRlbnRpYWxzVXNlckRvZXNOb3RFeGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCVJlc3RSZXNwb25zZSBkZWxldGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZGVsZXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLkVDT01QX1VTRVJfTk9UX0ZPVU5ELCBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlRWNvbXBDcmVkZW50aWFsc1VzZXJOYW1lSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lck5hbWUobnVsbCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZGVsZXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLkVDT01QX1VTRVJfTk9UX0ZPVU5ELCBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUVjb21wQ3JlZGVudGlhbHNVc2VyTmFtZU1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKAorCQkJCSJfQkNELS5hYmNkcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1xdzEyMzQ1Njc4OTBwb2l1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnMzQ1Njc4OTBwb2l1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnMzQ1Njc4OTBwZjM0NTY3ODkwcG9pdXRyZXdhc2RmZ2hqa2xxd2VydHl1aW9wemFpdXRyZXdhc2RmZ2doamtscXdlcnR5dWlvcHphaXV0cmV3YXNkZmdoamtscXdlcnR5dWlvcHphc3hjZGZlcmYxMjM0NTYuLS0iKTsgLy8gU1ZDNDUyOAorCQlSZXN0UmVzcG9uc2UgZGVsZXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJZGVsZXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmRlbGV0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoREVMRVRFX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5FQ09NUF9VU0VSX05PVF9GT1VORCwgY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lck5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVFY29tcENyZWRlbnRpYWxzVXNlck5hbWVFeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTmFtZSgKKwkJCQkiX1hYWEJDRC0uYWJjZHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tcXcxMjM0NTY3ODkwcG9pdXRyZXdhc2RmZ2hqa2xxd2VydHl1aW9wemFpdXRyZXdhc2RmZzM0NTY3ODkwcG9pdXRyZXdhc2RmZ2hqa2xxd2VydHl1aW9wemFpdXRyZXdhc2RmZzM0NTY3ODkwcGYzNDU2Nzg5MHBvaXV0cmV3YXNkZmdoamtscXdlcnR5dWlvcHphaXV0cmV3YXNkZmdnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YXN4Y2RmZXJmMTIzNDU2Li0tIik7IC8vIFNWQzQ1MjgKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWRlbGV0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5kZWxldGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKERFTEVURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuRUNPTVBfVVNFUl9OT1RfRk9VTkQsIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlRWNvbXBDcmVkZW50aWFsc0h0dHBDc3BVc2VySWRIZWFkZXJJc01pc3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXJIdHRwQ3NwQXR1VWlkSXNNaXNzaW5nKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTiwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLm5hbWUoKSk7CisJCUV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQgZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCgpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oREVMRVRFX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRFY29tVXNlcihjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYygpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUVjb21wQ29uc3VtZXJBdWRpdChleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCwKKwkJCQlERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVFY29tcENyZWRlbnRpYWxzTmFtZUlzVXBwZXJDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJOYW1lKCJiZW5ueSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBEZWxldGUgY29uc3VtZXIKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTmFtZSgiQkVOTlkiKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWRlbGV0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5kZWxldGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKERFTEVURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuRUNPTVBfVVNFUl9OT1RfRk9VTkQsIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkpOworCQkvLyBHZXQgQ29uc3VtZXIgdG8gdmVyaWZ5IHRoYXQgY29uc3VtZXIgdXNlciB3YXMgbm90IGRlbGV0ZWQKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lck5hbWUoImJlbm55Iik7CisJCWdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0RWNvbXBDcmVkZW50aWFsc01ldGhvZEdldCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDcmVhdGUgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gcGFyc2UgdXBkYXRlZCByZXNwb25zZSB0byBqYXZhT2JqZWN0CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoY3JlYXRlQ29uc3VtZXJSZXN0KTsKKwkJLy8gVmFsaWRhdGUgYWN0dWFsIGNvbnN1bWVyRGF0YSB0byByZXR1cm5lZCBmcm9tIHJlc3BvbnNlCisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChnZXRDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZWNvbXBDb25zdW1lckF1ZGl0U3VjY2VzcyhHRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEVfR0VUKTsKKwkJLy8gRGVsZXRlIGNvbnN1bWVyCisJCUNvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEVjb21wVXNlckFscmVheURlbGV0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gRGVsZXRlIEVDT01QIGNvbnN1bWVyCisJCVJlc3RSZXNwb25zZSBkZWxldGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFX0dFVCwKKwkJCQlkZWxldGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJLy8gVHJ5IHRvIGdldCBFQ09NUCBjb25zdW1lciBhbHJlYWR5IGRlbGV0ZWQKKwkJZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5kZWxldGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEdFVF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuRUNPTVBfVVNFUl9OT1RfRk9VTkQsIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0RWNvbXBVc2VyQnlUZXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gR2V0IENvbnN1bWVyIGJ5IFRlc3RlciB1c2VyCisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jVGVzdGVyVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmRlbGV0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoR0VUX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY1Rlc3RlclVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkvLyBHZXQgQ29uc3VtZXIgYnkgQWRtaW4KKwkJZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEVjb21wVXNlckJ5T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEdldCBDb25zdW1lciBieSBPcHMgdXNlcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY09wc1VzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5kZWxldGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEdFVF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNPcHNVc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJLy8gR2V0IENvbnN1bWVyIGJ5IEFkbWluCisJCWdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRFY29tcFVzZXJCeUdvdmVybm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEdldCBDb25zdW1lciBieSBPcHMgdXNlcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0dvdmVybm9yVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmRlbGV0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoR0VUX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0dvdmVybm9yVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCS8vIEdldCBDb25zdW1lciBieSBBZG1pbgorCQlnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0RWNvbXBVc2VyQnlEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlQ29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBHZXQgQ29uc3VtZXIgYnkgRGVzaWduZXIgdXNlcgorCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0Rlc2lnbmVyVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLmRlbGV0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoR0VUX0VDT01QX1VTRVJfQ1JFREVOVElBTFMsIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0Rlc2lnbmVyVXNlckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCS8vIEdldCBDb25zdW1lciBieSBBZG1pbgorCQlnZXRDb25zdW1lclJlc3QgPSBDb25zdW1lclJlc3RVdGlscy5nZXRDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLCBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgQ29uc3VtZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0RWNvbXBVc2VyQnlOb0V4aXN0aW5nSVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBub1NkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCW5vU2RuY1VzZXJEZXRhaWxzLnNldFJvbGUoImJsYWJsYSIpOworCQlub1NkbmNVc2VyRGV0YWlscy5zZXRVc2VySWQoImJ0NzUwaCIpOworCQkvLyBHZXQgQ29uc3VtZXIKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgbm9TZG5jVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9BQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9BQ0NFU1MubmFtZSgpKTsKKwkJRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCBleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0KCk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihHRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEVjb21Vc2VyKGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCIiKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKCIoIiArIG5vU2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpICsgIikiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFY29tcENvbnN1bWVyQXVkaXQoZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QsCisJCQkJR0VUX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0RWNvbXBDcmVkZW50aWFsc1VzZXJEb2VzTm90RXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXJSZXN0ID0gQ29uc3VtZXJSZXN0VXRpbHMuZ2V0Q29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IENvbnN1bWVyIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldENvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlBdWRpdFZhbGlkYXRpb25VdGlscy5kZWxldGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKEdFVF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJCXNkbmNBZG1pblVzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuRUNPTVBfVVNFUl9OT1RfRk9VTkQsIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRFY29tcENyZWRlbnRpYWxzVXNlck5hbWVJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTmFtZShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlnZXRDb25zdW1lclJlc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZGVsZXRlRWNvbXBDb25zdW1lckF1ZGl0RmFpbHVyZShHRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgQWN0aW9uU3RhdHVzLkVDT01QX1VTRVJfTk9UX0ZPVU5ELCBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEVjb21wQ3JlZGVudGlhbHNVc2VyTmFtZU1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTmFtZSgKKwkJCQkiX0FCQ0QtLmFiY2Rxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubXF3MTIzNDU2Nzg5MHBvaXV0cmV3YXNkZmdoamtscXdlcnR5dWlvcHphaXV0cmV3YXNkZmczNDU2Nzg5MHBvaXV0cmV3YXNkZmdoamtscXdlcnR5dWlvcHphaXV0cmV3YXNkZmczNDU2Nzg5MHBmMzQ1Njc4OTBwb2l1dHJld2FzZGZnaGprbHF3ZXJ0eXVpb3B6YWl1dHJld2FzZGZnZ2hqa2xxd2VydHl1aW9wemFpdXRyZXdhc2RmZ2hqa2xxd2VydHl1aW9wemFzeGNkZmVyZjEyMzQ1Ni4tIik7IC8vIFNWQzQ1MjgKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmNyZWF0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQkJc2RuY0FkbWluVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIENvbnN1bWVyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZUNvbnN1bWVyUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gcGFyc2UgdXBkYXRlZCByZXNwb25zZSB0byBqYXZhT2JqZWN0CisJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gZ2V0Q29uc3VtZXJEYXRhT2JqZWN0ID0gQ29uc3VtZXJSZXN0VXRpbHMucGFyc2VDb21zdW1lclJlc3AoY3JlYXRlQ29uc3VtZXJSZXN0KTsKKwkJLy8gVmFsaWRhdGUgYWN0dWFsIGNvbnN1bWVyRGF0YSB0byByZXR1cm5lZCBmcm9tIHJlc3BvbnNlCisJCUNvbnN1bWVyUmVzdFV0aWxzLnZhbGlkYXRlQ29uc3VtZXJSZXFWc1Jlc3AoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0KTsKKwkJLy8gR2V0IENvbnN1bWVyCisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJUmVzdFJlc3BvbnNlIGdldENvbnN1bWVyUmVzdCA9IENvbnN1bWVyUmVzdFV0aWxzLmdldENvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBDb25zdW1lciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZ2V0Q29uc3VtZXJSZXN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb25zdW1lckRhdGFPYmplY3QgPSBDb25zdW1lclJlc3RVdGlscy5wYXJzZUNvbXN1bWVyUmVzcChnZXRDb25zdW1lclJlc3QpOworCQlDb25zdW1lclJlc3RVdGlscy52YWxpZGF0ZUNvbnN1bWVyUmVxVnNSZXNwKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIGdldENvbnN1bWVyRGF0YU9iamVjdCk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMuZWNvbXBDb25zdW1lckF1ZGl0U3VjY2VzcyhHRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCQlzZG5jQWRtaW5Vc2VyRGV0YWlscywgU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEVfR0VUKTsKKwkJLy8gRGVsZXRlIGNvbnN1bWVyCisJCUNvbnN1bWVyUmVzdFV0aWxzLmRlbGV0ZUNvbnN1bWVyKGNvbnN1bWVyRGF0YURlZmluaXRpb24sIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9nZW5lcmFsL1V1aWRUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9nZW5lcmFsL1V1aWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiN2UxNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2dlbmVyYWwvVXVpZFRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZ2VuZXJhbDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5DYXRhbG9nUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBVdWlkVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgVXVpZFRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIFV1aWRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJCWNvbmZpZyA9IENvbmZpZy5pbnN0YW5jZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEUyRVV1aWRIZWFkZXJSZXR1cm5lZEFuZFByZXNlcnZlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVVVSUQgcmFuZG9tVVVJRCA9IFVVSUQucmFuZG9tVVVJRCgpOworCQlTdHJpbmcgdXVpZFN0ciA9IHJhbmRvbVVVSUQudG9TdHJpbmcoKTsKKwkJUmVzdFJlc3BvbnNlIGFsbFRhZ3NUb3dhcmRzQ2F0YWxvZ0ZlID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzVG93YXJkc0NhdGFsb2dGZVdpdGhVdWlkKHV1aWRTdHIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoYWxsVGFnc1Rvd2FyZHNDYXRhbG9nRmUuZ2V0RXJyb3JDb2RlKCksIG5ldyBJbnRlZ2VyKDIwMCkpOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGFsbFRhZ3NUb3dhcmRzQ2F0YWxvZ0ZlLmdldEhlYWRlckZpZWxkcygpLmdldChDb25zdGFudHMuWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUik7CisJCS8vIGNoZWNrIHRoYXQgaGVhZGVyIGlzIHJldHVybmVkCisJCUFzc2VydEpVbml0LmFzc2VydFRydWUobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSk7CisJCVN0cmluZyByZWNlaXZlZFV1aWQgPSBsaXN0LmdldCgwKTsKKwkJLy8gQ2hlY2sgdGhhdCBzYW1lIHV1aWQgcmV0dXJuZWQKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKHV1aWRTdHIsIHJlY2VpdmVkVXVpZCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VXVpZEhlYWRlckdlbmVyYXRlZEJlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGFsbFRhZ3NUb3dhcmRzQ2F0YWxvZ0JlID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzVG93YXJkc0NhdGFsb2dCZSgpOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGFsbFRhZ3NUb3dhcmRzQ2F0YWxvZ0JlLmdldEhlYWRlckZpZWxkcygpLmdldChDb25zdGFudHMuWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUik7CisJCS8vIGNoZWNrIHRoYXQgcmVzcG9uc2Ugd2FzIE9LCisJCWFzc2VydEVxdWFscyhhbGxUYWdzVG93YXJkc0NhdGFsb2dCZS5nZXRFcnJvckNvZGUoKSwgbmV3IEludGVnZXIoMjAwKSk7CisJCS8vIGNoZWNrIHRoYXQgaGVhZGVyIGlzIHJldHVybmVkCisJCWFzc2VydFRydWUobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSk7CisJCVN0cmluZyB1dWlkID0gbGlzdC5nZXQoMCk7CisJCS8vIENoZWNrIHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gZXJyb3IKKwkJVVVJRC5mcm9tU3RyaW5nKHV1aWQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEUyRU9wdGlvbnNOb1V1aWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgYWxsVGFnc1Rvd2FyZHNDYXRhbG9nRmUgPSBSZXNvdXJjZVJlc3RVdGlscy5zZW5kT3B0aW9uc1Rvd2FyZHNDYXRhbG9nRmVXaXRoVXVpZCgpOworCQlhc3NlcnRFcXVhbHMoYWxsVGFnc1Rvd2FyZHNDYXRhbG9nRmUuZ2V0RXJyb3JDb2RlKCksIG5ldyBJbnRlZ2VyKDIwMCkpOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGFsbFRhZ3NUb3dhcmRzQ2F0YWxvZ0ZlLmdldEhlYWRlckZpZWxkcygpLmdldChDb25zdGFudHMuWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUik7CisJCS8vIGNoZWNrIHRoYXQgaGVhZGVyIGlzIHJldHVybmVkIChnZW5lcmF0ZWQgYnkgQkUpCisJCWFzc2VydFRydWUobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSk7CisJCVN0cmluZyByZWNlaXZlZFV1aWQgPSBsaXN0LmdldCgwKTsKKwkJLy8gQ2hlY2sgdGhlcmUgaXMgbm8gY29udmVyc2lvbiBlcnJvcgorCQlVVUlELmZyb21TdHJpbmcocmVjZWl2ZWRVdWlkKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFMkVNZXRob2ROb3RBbGxvd2VkV2l0aFV1aWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlVVUlEIHJhbmRvbVVVSUQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKwkJU3RyaW5nIHV1aWRTdHIgPSByYW5kb21VVUlELnRvU3RyaW5nKCk7CisJCVJlc3RSZXNwb25zZSBhbGxUYWdzVG93YXJkc0NhdGFsb2dGZSA9IFJlc291cmNlUmVzdFV0aWxzCisJCQkJLnB1dEFsbENhdGVnb3JpZXNUb3dhcmRzQ2F0YWxvZ0ZlV2l0aFV1aWROb3RBbGxvd2VkKHV1aWRTdHIpOworCQlhc3NlcnRFcXVhbHMoYWxsVGFnc1Rvd2FyZHNDYXRhbG9nRmUuZ2V0RXJyb3JDb2RlKCksIG5ldyBJbnRlZ2VyKDQwNSkpOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IGFsbFRhZ3NUb3dhcmRzQ2F0YWxvZ0ZlLmdldEhlYWRlckZpZWxkcygpLmdldChDb25zdGFudHMuWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUik7CisJCS8vIGNoZWNrIHRoYXQgaGVhZGVyIGlzIHJldHVybmVkIChnZW5lcmF0ZWQgYnkgQkUpCisJCWFzc2VydFRydWUobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSk7CisJCVN0cmluZyByZWNlaXZlZFV1aWQgPSBsaXN0LmdldCgwKTsKKwkJLy8gQ2hlY2sgdGhhdCBzYW1lIHV1aWQgcmV0dXJuZWQKKwkJYXNzZXJ0RXF1YWxzKHV1aWRTdHIsIHJlY2VpdmVkVXVpZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9Dc2FyVXRpbHNUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9pbXBvcnRzL0NzYXJVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWFlMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9Dc2FyVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw0MzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmltcG9ydHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdFVpRG93bmxvYWREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLllhbWxUb09iamVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CisKK3B1YmxpYyBjbGFzcyBDc2FyVXRpbHNUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVRfVE9TQ0FfVEVNUExBVEUgPSAiYXNzZXR0b3NjYXRlbXBsYXRlIjsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgQ3NhclV0aWxzVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgQ3NhclV0aWxzVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VDc2FyQmFzaWNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpOworCQlyZXNvdXJjZVZGID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VWRiwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlieXRlW10gZG93bmxvYWRDU0FSID0gZG93bmxvYWRDU0FSKHNkbmNNb2RpZmllckRldGFpbHMsIHNlcnZpY2UpOworCisJCWNzYXJCYXNpY1ZhbGlkYXRpb24oc2VydmljZSwgZG93bmxvYWRDU0FSKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUNzYXJCYXNpY1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzb3VyY2VWRiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlieXRlW10gZG93bmxvYWRDU0FSID0gZG93bmxvYWRDU0FSKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVkYpOworCisJCWNzYXJCYXNpY1ZhbGlkYXRpb24ocmVzb3VyY2VWRiwgZG93bmxvYWRDU0FSKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlQ3NhckluY2xEZXBsb3ltZW50QXJ0VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VWRjEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlSZXNvdXJjZSByZXNvdXJjZVZGMiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisKKwkJcmVzb3VyY2VWRjEgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlVkYxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCXJlc291cmNlVkYyID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlVkYxLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlVkYyLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUwsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSk7CisKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJYnl0ZVtdIGRvd25sb2FkQ1NBUiA9IGRvd25sb2FkQ1NBUihzZG5jTW9kaWZpZXJEZXRhaWxzLCBzZXJ2aWNlKTsKKworCQljc2FyQmFzaWNWYWxpZGF0aW9uKHNlcnZpY2UsIGRvd25sb2FkQ1NBUik7CisKKwkJdmFsaWRhdGVTZXJ2aWNlQ3NhcihyZXNvdXJjZVZGMSwgcmVzb3VyY2VWRjIsIHNlcnZpY2UsIGRvd25sb2FkQ1NBUiwgMywgNSwgMSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpIAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlQ3NhckluY2xEZXBsb3ltZW50QXJ0VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlIHJlc291cmNlVkYxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5ZQU5HX1hNTCwgcmVzb3VyY2VWRjEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9BUlRJRkFDVCwgcmVzb3VyY2VWRjEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSk7CisJCXJlc291cmNlVkYxID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCWJ5dGVbXSBkb3dubG9hZENTQVIgPSBkb3dubG9hZENTQVIoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWRjEpOworCisJCWNzYXJCYXNpY1ZhbGlkYXRpb24ocmVzb3VyY2VWRjEsIGRvd25sb2FkQ1NBUik7CisJCS8vVE9ETyB3aGVuIGZlYXR1cmUgaXMgaW50ZWdyYXRlZCB0byBPUyBzaG91bGQgbW9kaWZ5IGV4cGVjdGVkIGRlcGxveW1lbnQgYXJ0aWZhY3RzIGluIGNzYXIgQXJ0aWZhY3RzIGZvbGRlciB0byAoMCwxLDEpCisJCXZhbGlkYXRlVkZDc2FyKHJlc291cmNlVkYxLCBkb3dubG9hZENTQVIsIDEsIDAsIDAsIDApOworCX0KKworCXByaXZhdGUgdm9pZCBjc2FyQmFzaWNWYWxpZGF0aW9uKENvbXBvbmVudCBtYWluQ29tcG9uZW50LCBieXRlW10gZG93bmxvYWRDU0FSKSB7CisJCXRyeSAoQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5zID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRvd25sb2FkQ1NBUik7IFppcElucHV0U3RyZWFtIHppcCA9IG5ldyBaaXBJbnB1dFN0cmVhbShpbnMpOykgeworCisJCQlTdHJpbmcgcmVzb3VyY2VZYW1sID0gbnVsbDsKKwkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCVppcEVudHJ5IG5leHRFbnRyeSA9IHppcC5nZXROZXh0RW50cnkoKTsKKwkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWludCBsZW47CisKKwkJCXdoaWxlICgobGVuID0gemlwLnJlYWQoYnVmZmVyKSkgPiAwKSB7CisJCQkJc2IuYXBwZW5kKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW4pKTsKKwkJCX0KKworCQkJYXNzZXJ0VHJ1ZShuZXh0RW50cnkuZ2V0TmFtZSgpLmVxdWFscygiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSIpKTsKKworCQkJc2Iuc2V0TGVuZ3RoKDApOworCQkJbmV4dEVudHJ5ID0gemlwLmdldE5leHRFbnRyeSgpOworCisJCQl3aGlsZSAoKGxlbiA9IHppcC5yZWFkKGJ1ZmZlcikpID4gMCkgeworCQkJCXNiLmFwcGVuZChuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgbGVuKSk7CisJCQl9CisKKwkJCXJlc291cmNlWWFtbCA9IHNiLnRvU3RyaW5nKCk7CisKKwkJCVlhbWxUb09iamVjdENvbnZlcnRlciB5YW1sVG9PYmplY3RDb252ZXJ0ZXIgPSBuZXcgWWFtbFRvT2JqZWN0Q29udmVydGVyKCk7CisJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gbWFpbkNvbXBvbmVudC5nZXRUb3NjYUFydGlmYWN0cygpLmdldChBU1NFVF9UT1NDQV9URU1QTEFURSk7CisJCQlTdHJpbmcgZmlsZU5hbWUgPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCk7CisJCQlhc3NlcnRFcXVhbHMoIlRvc2NhLVRlbXBsYXRlIGZpbGUgbmFtZTogIiwgIkRlZmluaXRpb25zLyIgKyBmaWxlTmFtZSwgbmV4dEVudHJ5LmdldE5hbWUoKSk7CisJCQlhc3NlcnRUcnVlKCJUb3NjYSB0ZW1wbGF0ZSBZYW1sIHZhbGlkYXRpb246ICIsIHlhbWxUb09iamVjdENvbnZlcnRlci5pc1ZhbGlkWWFtbChyZXNvdXJjZVlhbWwuZ2V0Qnl0ZXMoKSkpOworCisJCQlpbnMuY2xvc2UoKTsKKwkJCXppcC5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2VydmljZUNzYXIoQ29tcG9uZW50IGNlcnRpZmllZFZGQzEsIENvbXBvbmVudCBjZXJ0aWZpZWRWRkMyLCBTZXJ2aWNlIGZldGNoZWRTZXJ2aWNlLCBieXRlW10gcmVzdWx0Qnl0ZSwgaW50IHRvc2NhRW50cnlJbmRleFRvUGFzcywgaW50IGdlbmVyYXRvckVudHJ5SW5kZXhUb1Bhc3MsIGludCBkZXBsb3ltZW50QXJ0aWZhY3RJbmRleFRvUGFzcykgeworCisJCS8vIFRPRE8gVGVzdCB0byB2YWxpZGF0ZSBldmVyeXRoaW5nIGlzIHJpZ2h0IChjb21tZW50IG91dCBhZnRlciB0ZXN0aW5nKQorCQkvKgorCQkgKiB0cnkgeyBGaWxlVXRpbHMud3JpdGVCeXRlQXJyYXlUb0ZpbGUobmV3IEZpbGUoImM6L1Rlc3RDU0FSLyIgKyBmZXRjaGVkU2VydmljZS5nZXROYW1lKCkgKyAiLnppcCIpLCByZXN1bHRCeXRlKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvLyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jayBlLnByaW50U3RhY2tUcmFjZSgpOyB9CisJCSAqLworIAorCQl0cnkgKEJ5dGVBcnJheUlucHV0U3RyZWFtIGlucyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHRCeXRlKTsgWmlwSW5wdXRTdHJlYW0gemlwID0gbmV3IFppcElucHV0U3RyZWFtKGlucyk7KSB7CisKKwkJCVN0cmluZyByZXNvdXJjZVlhbWwgPSBudWxsOworCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOworCQkJWmlwRW50cnkgbmV4dEVudHJ5ID0gemlwLmdldE5leHRFbnRyeSgpOworCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJaW50IGxlbjsKKworCQkJd2hpbGUgKChsZW4gPSB6aXAucmVhZChidWZmZXIpKSA+IDApIHsKKwkJCQlzYi5hcHBlbmQobmV3IFN0cmluZyhidWZmZXIsIDAsIGxlbikpOworCQkJfQorCisJCQlhc3NlcnRUcnVlKG5leHRFbnRyeS5nZXROYW1lKCkuZXF1YWxzKCJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIikpOworCisJCQlZYW1sVG9PYmplY3RDb252ZXJ0ZXIgeWFtbFRvT2JqZWN0Q29udmVydGVyID0gbmV3IFlhbWxUb09iamVjdENvbnZlcnRlcigpOworCisJCQlpbnQgdG9zY2FFbnRyeUluZGV4ID0gMDsKKwkJCWludCBnZW5lcmF0b3JFbnRyeUluZGV4ID0gMDsKKwkJCWludCBkZXBsb3ltZW50QXJ0aWZhY3RJbmRleCA9IDA7CisJCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbjsKKwkJCUNvbXBvbmVudCBjb21wb25lbnRUb1ZhbGlkYXRlID0gbnVsbDsKKworCQkJYXJ0aWZhY3REZWZpbml0aW9uID0gZmV0Y2hlZFNlcnZpY2UuZ2V0VG9zY2FBcnRpZmFjdHMoKS5nZXQoQVNTRVRfVE9TQ0FfVEVNUExBVEUpOworCQkJU3RyaW5nIHNlcnZpY2VGaWxlTmFtZSA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKTsKKwkJCWFydGlmYWN0RGVmaW5pdGlvbiA9IGNlcnRpZmllZFZGQzEuZ2V0VG9zY2FBcnRpZmFjdHMoKS5nZXQoQVNTRVRfVE9TQ0FfVEVNUExBVEUpOworCQkJU3RyaW5nIHZmYzFGaWxlTmFtZSA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKTsKKwkJCWFydGlmYWN0RGVmaW5pdGlvbiA9IGNlcnRpZmllZFZGQzIuZ2V0VG9zY2FBcnRpZmFjdHMoKS5nZXQoQVNTRVRfVE9TQ0FfVEVNUExBVEUpOworCQkJU3RyaW5nIHZmYzJGaWxlTmFtZSA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKTsKKworCQkJd2hpbGUgKChuZXh0RW50cnkgPSB6aXAuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKKwkJCQlzYi5zZXRMZW5ndGgoMCk7CisKKwkJCQl3aGlsZSAoKGxlbiA9IHppcC5yZWFkKGJ1ZmZlcikpID4gMCkgeworCQkJCQlzYi5hcHBlbmQobmV3IFN0cmluZyhidWZmZXIsIDAsIGxlbikpOworCQkJCX0KKworCQkJCVN0cmluZyBlbnRyeU5hbWUgPSBuZXh0RW50cnkuZ2V0TmFtZSgpOworCisJCQkJcmVzb3VyY2VZYW1sID0gc2IudG9TdHJpbmcoKTsKKwkJCQlpZiAoZW50cnlOYW1lLmNvbnRhaW5zKHNlcnZpY2VGaWxlTmFtZSkpIHsKKwkJCQkJY29tcG9uZW50VG9WYWxpZGF0ZSA9IGZldGNoZWRTZXJ2aWNlOworCQkJCQlmaWxlTmFtZSA9ICJEZWZpbml0aW9ucy8iICsgc2VydmljZUZpbGVOYW1lOworCisJCQkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgZW50cnkgTmFtZSIsIChmaWxlTmFtZSksIG5leHRFbnRyeS5nZXROYW1lKCkpOworCQkJCQlhc3NlcnRUcnVlKHlhbWxUb09iamVjdENvbnZlcnRlci5pc1ZhbGlkWWFtbChyZXNvdXJjZVlhbWwuZ2V0Qnl0ZXMoKSkpOworCQkJCQl2YWxpZGF0ZUNvbnRlbnQocmVzb3VyY2VZYW1sLCBjb21wb25lbnRUb1ZhbGlkYXRlKTsKKwkJCQkJKyt0b3NjYUVudHJ5SW5kZXg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChlbnRyeU5hbWUuY29udGFpbnModmZjMUZpbGVOYW1lKSkgeworCQkJCQljb21wb25lbnRUb1ZhbGlkYXRlID0gY2VydGlmaWVkVkZDMTsKKwkJCQkJZmlsZU5hbWUgPSAiRGVmaW5pdGlvbnMvIiArIHZmYzFGaWxlTmFtZTsKKworCQkJCQlhc3NlcnRFcXVhbHMoIlZhbGlkYXRlIGVudHJ5IE5hbWUiLCAoZmlsZU5hbWUpLCBuZXh0RW50cnkuZ2V0TmFtZSgpKTsKKwkJCQkJYXNzZXJ0VHJ1ZSh5YW1sVG9PYmplY3RDb252ZXJ0ZXIuaXNWYWxpZFlhbWwocmVzb3VyY2VZYW1sLmdldEJ5dGVzKCkpKTsKKwkJCQkJdmFsaWRhdGVDb250ZW50KHJlc291cmNlWWFtbCwgY29tcG9uZW50VG9WYWxpZGF0ZSk7CisJCQkJCSsrdG9zY2FFbnRyeUluZGV4OworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGVudHJ5TmFtZS5jb250YWlucyh2ZmMyRmlsZU5hbWUpKSB7CisJCQkJCWNvbXBvbmVudFRvVmFsaWRhdGUgPSBjZXJ0aWZpZWRWRkMyOworCQkJCQlmaWxlTmFtZSA9ICJEZWZpbml0aW9ucy8iICsgdmZjMkZpbGVOYW1lOworCisJCQkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgZW50cnkgTmFtZSIsIChmaWxlTmFtZSksIG5leHRFbnRyeS5nZXROYW1lKCkpOworCQkJCQlhc3NlcnRUcnVlKHlhbWxUb09iamVjdENvbnZlcnRlci5pc1ZhbGlkWWFtbChyZXNvdXJjZVlhbWwuZ2V0Qnl0ZXMoKSkpOworCQkJCQl2YWxpZGF0ZUNvbnRlbnQocmVzb3VyY2VZYW1sLCBjb21wb25lbnRUb1ZhbGlkYXRlKTsKKwkJCQkJKyt0b3NjYUVudHJ5SW5kZXg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChlbnRyeU5hbWUuY29udGFpbnMoIi54bWwiKSAmJiAhZW50cnlOYW1lLnN0YXJ0c1dpdGgoIkFydGlmYWN0cy9BQUkiKSkgeworCQkJCQkrK2RlcGxveW1lbnRBcnRpZmFjdEluZGV4OworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgoIkFydGlmYWN0cy9BQUkiKSkgeworCQkJCQkrK2dlbmVyYXRvckVudHJ5SW5kZXg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgZW50cnk6ICIgKyBlbnRyeU5hbWUsIHRydWUpOworCQkJfQorCQkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSBhbW91bnQgb2YgZW50cmllcyIsIHRvc2NhRW50cnlJbmRleFRvUGFzcywgdG9zY2FFbnRyeUluZGV4KTsKKwkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgYW1vdW50IG9mIGdlbmVyYXRlZCBBQUkgYXJ0aWZhY3RzIiwgZ2VuZXJhdG9yRW50cnlJbmRleFRvUGFzcywgZ2VuZXJhdG9yRW50cnlJbmRleCk7CisJCQlhc3NlcnRFcXVhbHMoIlZhbGlkYXRlIGFtb3VudCBvZiBnZW5lcmF0ZWQgRGVwbG95bWVudCBhcnRpZmFjdHMiLCBkZXBsb3ltZW50QXJ0aWZhY3RJbmRleFRvUGFzcywgZGVwbG95bWVudEFydGlmYWN0SW5kZXgpOworCisJCQlpbnMuY2xvc2UoKTsKKwkJCXppcC5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVkZDc2FyKENvbXBvbmVudCBjZXJ0aWZpZWRWRiwgYnl0ZVtdIHJlc3VsdEJ5dGUsIGludCB0b3NjYUVudHJ5SW5kZXhUb1Bhc3MsIGludCB5bWxEZXBsb3ltZW50QXJ0aWZhY3RJbmRleFRvUGFzcywgaW50IHhtbERlcGxveW1lbnRBcnRpZmFjdEluZGV4VG9QYXNzLCBpbnQgaGVhdEVudkRlcGxveW1lbnRBcnRpZmFjdEluZGV4VG9QYXNzKSB7CisKKwkJLy8gVE9ETyBUZXN0IHRvIHZhbGlkYXRlIGV2ZXJ5dGhpbmcgaXMgcmlnaHQgKGNvbW1lbnQgb3V0IGFmdGVyIHRlc3RpbmcpCisJCS8qCisJCSAqIHRyeSB7IEZpbGVVdGlscy53cml0ZUJ5dGVBcnJheVRvRmlsZShuZXcgRmlsZSgiYzovVGVzdENTQVIvIiArIGZldGNoZWRTZXJ2aWNlLmdldE5hbWUoKSArICIuemlwIiksIHJlc3VsdEJ5dGUpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IC8vIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrIGUucHJpbnRTdGFja1RyYWNlKCk7IH0KKwkJICovCisKKwkJdHJ5IChCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0Qnl0ZSk7IFppcElucHV0U3RyZWFtIHppcCA9IG5ldyBaaXBJbnB1dFN0cmVhbShpbnMpOykgeworCisJCQlTdHJpbmcgcmVzb3VyY2VZYW1sID0gbnVsbDsKKwkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJCVppcEVudHJ5IG5leHRFbnRyeSA9IHppcC5nZXROZXh0RW50cnkoKTsKKwkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWludCBsZW47CisKKwkJCXdoaWxlICgobGVuID0gemlwLnJlYWQoYnVmZmVyKSkgPiAwKSB7CisJCQkJc2IuYXBwZW5kKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW4pKTsKKwkJCX0KKworCQkJYXNzZXJ0VHJ1ZShuZXh0RW50cnkuZ2V0TmFtZSgpLmVxdWFscygiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSIpKTsKKworCQkJWWFtbFRvT2JqZWN0Q29udmVydGVyIHlhbWxUb09iamVjdENvbnZlcnRlciA9IG5ldyBZYW1sVG9PYmplY3RDb252ZXJ0ZXIoKTsKKworCQkJaW50IHRvc2NhRW50cnlJbmRleCA9IDA7CisJCQlpbnQgeW1sRW50cnlJbmRleCA9IDA7CisJCQlpbnQgeG1sQXJ0aWZhY3RzSW5kZXggPSAwOworCQkJaW50IGhlYXRFbnZEZXBsb3ltZW50QXJ0aWZhY3RJbmRleCA9IDA7CisJCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbjsKKwkJCUNvbXBvbmVudCBjb21wb25lbnRUb1ZhbGlkYXRlID0gbnVsbDsKKworCQkJYXJ0aWZhY3REZWZpbml0aW9uID0gY2VydGlmaWVkVkYuZ2V0VG9zY2FBcnRpZmFjdHMoKS5nZXQoQVNTRVRfVE9TQ0FfVEVNUExBVEUpOworCQkJU3RyaW5nIHZmRmlsZU5hbWUgPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCk7CisKKwkJCXdoaWxlICgobmV4dEVudHJ5ID0gemlwLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7CisJCQkJc2Iuc2V0TGVuZ3RoKDApOworCisJCQkJd2hpbGUgKChsZW4gPSB6aXAucmVhZChidWZmZXIpKSA+IDApIHsKKwkJCQkJc2IuYXBwZW5kKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW4pKTsKKwkJCQl9CisKKwkJCQlTdHJpbmcgZW50cnlOYW1lID0gbmV4dEVudHJ5LmdldE5hbWUoKTsKKworCQkJCXJlc291cmNlWWFtbCA9IHNiLnRvU3RyaW5nKCk7CisJCQkJaWYgKGVudHJ5TmFtZS5jb250YWlucyh2ZkZpbGVOYW1lKSkgeworCQkJCQljb21wb25lbnRUb1ZhbGlkYXRlID0gY2VydGlmaWVkVkY7CisJCQkJCWZpbGVOYW1lID0gIkRlZmluaXRpb25zLyIgKyB2ZkZpbGVOYW1lOworCisJCQkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgZW50cnkgTmFtZSIsIChmaWxlTmFtZSksIG5leHRFbnRyeS5nZXROYW1lKCkpOworCQkJCQlhc3NlcnRUcnVlKHlhbWxUb09iamVjdENvbnZlcnRlci5pc1ZhbGlkWWFtbChyZXNvdXJjZVlhbWwuZ2V0Qnl0ZXMoKSkpOworCQkJCQl2YWxpZGF0ZUNvbnRlbnQocmVzb3VyY2VZYW1sLCBjb21wb25lbnRUb1ZhbGlkYXRlKTsKKwkJCQkJKyt0b3NjYUVudHJ5SW5kZXg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChlbnRyeU5hbWUuY29udGFpbnMoIi54bWwiKSAmJiBlbnRyeU5hbWUuc3RhcnRzV2l0aCgiQXJ0aWZhY3RzLyIpKSB7CisJCQkJCSsreG1sQXJ0aWZhY3RzSW5kZXg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChlbnRyeU5hbWUuY29udGFpbnMoIi5zaCIpICYmIGVudHJ5TmFtZS5zdGFydHNXaXRoKCJBcnRpZmFjdHMvIikpIHsKKwkJCQkJKytoZWF0RW52RGVwbG95bWVudEFydGlmYWN0SW5kZXg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChlbnRyeU5hbWUuY29udGFpbnMoIi55bWwiKSAmJiBlbnRyeU5hbWUuc3RhcnRzV2l0aCgiQXJ0aWZhY3RzLyIpKSB7CisJCQkJCSsreW1sRW50cnlJbmRleDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBlbnRyeTogIiArIGVudHJ5TmFtZSwgZmFsc2UpOworCQkJfQorCQkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSBhbW91bnQgb2YgZW50cmllcyIsIHRvc2NhRW50cnlJbmRleFRvUGFzcywgdG9zY2FFbnRyeUluZGV4KTsKKwkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgYW1vdW50IG9mIFlBTUwgYXJ0aWZhY3RzIiwgeW1sRGVwbG95bWVudEFydGlmYWN0SW5kZXhUb1Bhc3MsIHltbEVudHJ5SW5kZXgpOworCQkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSBhbW91bnQgb2YgZ2VuZXJhdGVkIFhNTCBhcnRpZmFjdHMiLCB4bWxEZXBsb3ltZW50QXJ0aWZhY3RJbmRleFRvUGFzcywgeG1sQXJ0aWZhY3RzSW5kZXgpOworCQkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSBhbW91bnQgb2YgZ2VuZXJhdGVkIEhFQVQgRU5WIGFydGlmYWN0cyIsIGhlYXRFbnZEZXBsb3ltZW50QXJ0aWZhY3RJbmRleFRvUGFzcywgaGVhdEVudkRlcGxveW1lbnRBcnRpZmFjdEluZGV4KTsKKworCQkJaW5zLmNsb3NlKCk7CisJCQl6aXAuY2xvc2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbnRlbnQoU3RyaW5nIGNvbnRlbnQsIENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJWWFtbCB5YW1sID0gbmV3IFlhbWwoKTsKKworCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50LmdldEJ5dGVzKCkpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBsb2FkID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHlhbWwubG9hZChpbnB1dFN0cmVhbSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFkYXRhID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGxvYWQuZ2V0KCJtZXRhZGF0YSIpOworCQlhc3NlcnROb3ROdWxsKG1ldGFkYXRhKTsKKworCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG1ldGFkYXRhLmdldCgibmFtZSIpOworCQlhc3NlcnROb3ROdWxsKG5hbWUpOworCQlhc3NlcnRFcXVhbHMoIlZhbGlkYXRlIGNvbXBvbmVudCBuYW1lIiwgY29tcG9uZW50LmdldE5hbWUoKSwgbmFtZSk7CisKKwkJU3RyaW5nIGludmFyaWFudFVVSUQgPSAoU3RyaW5nKSBtZXRhZGF0YS5nZXQoImludmFyaWFudFVVSUQiKTsKKwkJYXNzZXJ0Tm90TnVsbChpbnZhcmlhbnRVVUlEKTsKKwkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSBjb21wb25lbnQgaW52YXJpYW50VVVJRCIsIGNvbXBvbmVudC5nZXRJbnZhcmlhbnRVVUlEKCksIGludmFyaWFudFVVSUQpOworCisJCVN0cmluZyBVVUlEID0gKFN0cmluZykgbWV0YWRhdGEuZ2V0KCJVVUlEIik7CisJCWFzc2VydE5vdE51bGwoVVVJRCk7CisJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgY29tcG9uZW50IGludmFyaWFudFVVSUQiLCBjb21wb25lbnQuZ2V0VVVJRCgpLCBVVUlEKTsKKworCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIG1ldGFkYXRhLmdldCgidHlwZSIpOworCQlhc3NlcnROb3ROdWxsKHR5cGUpOworCQlpZiAoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSkpIHsKKwkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgY29tcG9uZW50IHR5cGUiLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZhbHVlKCksIHR5cGUpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSBjb21wb25lbnQgdHlwZSIsICgoUmVzb3VyY2UpIGNvbXBvbmVudCkuZ2V0UmVzb3VyY2VUeXBlKCksIFJlc291cmNlVHlwZUVudW0udmFsdWVPZih0eXBlKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGJ5dGVbXSBkb3dubG9hZENTQVIoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBDb21wb25lbnQgY3JlYXRlZENvbXBvbmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGFydGlmYWN0VW5pcWVJZCA9IGNyZWF0ZWRDb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKS5nZXQoImFzc2V0dG9zY2Fjc2FyIikuZ2V0VW5pcXVlSWQoKTsKKwkJUmVzdFJlc3BvbnNlIGdldENzYXJSZXNwb25zZSA9IG51bGw7CisKKwkJc3dpdGNoIChjcmVhdGVkQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkgeworCQljYXNlIFJFU09VUkNFOgorCQkJZ2V0Q3NhclJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0SW50ZXJuYWxBcGkoY3JlYXRlZENvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBhcnRpZmFjdFVuaXFlSWQpOworCQkJYnJlYWs7CisJCWNhc2UgU0VSVklDRToKKwkJCWdldENzYXJSZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkU2VydmljZUFydGlmYWN0SW50ZXJuYWxBcGkoY3JlYXRlZENvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBhcnRpZmFjdFVuaXFlSWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWFzc2VydE5vdE51bGwoZ2V0Q3NhclJlc3BvbnNlKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0Q3NhclJlc3BvbnNlKTsKKworCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldENzYXJSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBBcnRpZmFjdFVpRG93bmxvYWREYXRhLmNsYXNzKTsKKworCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0VWlEb3dubG9hZERhdGEpOworCisJCWJ5dGVbXSBmcm9tVWlEb3dubG9hZCA9IGFydGlmYWN0VWlEb3dubG9hZERhdGEuZ2V0QmFzZTY0Q29udGVudHMoKS5nZXRCeXRlcygpOworCQlieXRlW10gZGVjb2RlQmFzZTY0ID0gQmFzZTY0LmRlY29kZUJhc2U2NChmcm9tVWlEb3dubG9hZCk7CisKKwkJcmV0dXJuIGRlY29kZUJhc2U2NDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9pbXBvcnRzL0V4cG9ydFRvc2NhVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9FeHBvcnRUb3NjYVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDM2MDMyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9FeHBvcnRUb3NjYVRlc3QuamF2YQpAQCAtMCwwICsxLDMzMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3RVaURvd25sb2FkRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdyb3VwRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklucHV0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuSW1wb3J0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOworCitwdWJsaWMgY2xhc3MgRXhwb3J0VG9zY2FUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgRXhwb3J0VG9zY2FUZXN0KCkgeworCQlzdXBlcihuYW1lLCBFeHBvcnRUb3NjYVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBleHBvcnRWZk1vZHVsZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlSZXNvdXJjZSBjcmVhdGVkUmVzb3VyY2UgPSBjcmVhdGVWZkZyb21DU0FSKHNkbmNNb2RpZmllckRldGFpbHMsICJWU1BQYWNrYWdlIik7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBsb2FkID0gZG93bmxvYWRBbmRQYXJzZVRvc2NhVGVtcGxhdGUoc2RuY01vZGlmaWVyRGV0YWlscywgY3JlYXRlZFJlc291cmNlKTsKKwkJYXNzZXJ0Tm90TnVsbChsb2FkKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiB0b3BvbG9neV90ZW1wbGF0ZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBsb2FkLmdldCgidG9wb2xvZ3lfdGVtcGxhdGUiKTsKKwkJYXNzZXJ0Tm90TnVsbCh0b3BvbG9neV90ZW1wbGF0ZSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gZ3JvdXBzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHRvcG9sb2d5X3RlbXBsYXRlLmdldCgiZ3JvdXBzIik7CisJCWFzc2VydE5vdE51bGwoZ3JvdXBzKTsKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc09yaWdpbiA9IGNyZWF0ZWRSZXNvdXJjZS5nZXRHcm91cHMoKTsKKworCQlhc3NlcnRFcXVhbHMoIlZhbGlkYXRlIGdyb3VwcyBzaXplIiwgZ3JvdXBzT3JpZ2luLnNpemUoKSwgZ3JvdXBzLnNpemUoKSk7CisJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwIDogZ3JvdXBzT3JpZ2luKSB7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGdyb3VwVG9zY2EgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZ3JvdXBzLmdldChncm91cC5nZXROYW1lKCkpOworCQkJYXNzZXJ0Tm90TnVsbChncm91cFRvc2NhKTsKKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhZGF0YSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBncm91cFRvc2NhLmdldCgibWV0YWRhdGEiKTsKKwkJCWFzc2VydE5vdE51bGwobWV0YWRhdGEpOworCisJCQlTdHJpbmcgaW52YXJpYW50VVVJRDsKKwkJCVN0cmluZyBuYW1lOworCQkJU3RyaW5nIFVVSUQ7CisJCQlTdHJpbmcgdmVyc2lvbjsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBncm91cFRvc2NhLmdldCgicHJvcGVydGllcyIpOworCisJCQlpZiAoZ3JvdXAuZ2V0VHlwZSgpLmVxdWFscyhDb25zdGFudHMuREVGQVVMVF9HUk9VUF9WRl9NT0RVTEUpKSB7CisJCQkJaW52YXJpYW50VVVJRCA9IChTdHJpbmcpIG1ldGFkYXRhLmdldCgidmZNb2R1bGVNb2RlbEludmFyaWFudFVVSUQiKTsKKwkJCQluYW1lID0gKFN0cmluZykgbWV0YWRhdGEuZ2V0KCJ2Zk1vZHVsZU1vZGVsTmFtZSIpOworCQkJCVVVSUQgPSAoU3RyaW5nKSBtZXRhZGF0YS5nZXQoInZmTW9kdWxlTW9kZWxVVUlEIik7CisJCQkJdmVyc2lvbiA9IChTdHJpbmcpIG1ldGFkYXRhLmdldCgidmZNb2R1bGVNb2RlbFZlcnNpb24iKTsKKwkJCQlhc3NlcnROb3ROdWxsKHByb3BlcnRpZXMpOworCisJCQkJU3RyaW5nIHZmX21vZHVsZV90eXBlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoInZmX21vZHVsZV90eXBlIik7CisJCQkJTGlzdDxHcm91cFByb3BlcnR5PiBwcm9wcyA9IGdyb3VwLmdldFByb3BlcnRpZXMoKTsKKwkJCQlmb3IgKEdyb3VwUHJvcGVydHkgcHJvcCA6IHByb3BzKSB7CisJCQkJCWlmIChwcm9wLmdldE5hbWUoKS5lcXVhbHMoQ29uc3RhbnRzLklTX0JBU0UpKSB7CisJCQkJCQlTdHJpbmcgdmFsdWUgPSBwcm9wLmdldFZhbHVlKCkgPT0gbnVsbCA/IHByb3AuZ2V0RGVmYXVsdFZhbHVlKCkgOiBwcm9wLmdldFZhbHVlKCk7CisJCQkJCQlib29sZWFuIGJ2YWx1ZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKKwkJCQkJCWlmIChidmFsdWUpIHsKKwkJCQkJCQlhc3NlcnRFcXVhbHMoIlZhbGlkYXRlIHZmX21vZHVsZV90eXBlIiwgIkJhc2UiLCB2Zl9tb2R1bGVfdHlwZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgdmZfbW9kdWxlX3R5cGUiLCAiRXhwYW5zaW9uIiwgdmZfbW9kdWxlX3R5cGUpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJU3RyaW5nIHZmX21vZHVsZV9kZXNjcmlwdGlvbiA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KCJ2Zl9tb2R1bGVfZGVzY3JpcHRpb24iKTsKKwkJCQlhc3NlcnRFcXVhbHMoIlZhbGlkYXRlIHZmX21vZHVsZV9kZXNjcmlwdGlvbiIsIGdyb3VwLmdldERlc2NyaXB0aW9uKCksIHZmX21vZHVsZV9kZXNjcmlwdGlvbik7CisKKwkJCQlCb29sZWFuIHZvbHVtZV9ncm91cCA9IChCb29sZWFuKSBwcm9wZXJ0aWVzLmdldCgidm9sdW1lX2dyb3VwIik7CisJCQkJYm9vbGVhbiBpc1ZvbHVtZSA9IGZhbHNlOworCQkJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHNMaXN0ID0gZ3JvdXAuZ2V0QXJ0aWZhY3RzKCk7CisJCQkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCWlmIChhcnRpZmFjdHNMaXN0ICE9IG51bGwgJiYgIWFydGlmYWN0c0xpc3QuaXNFbXB0eSgpKSB7CisJCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBtYXN0ZXJBcnRpZmFjdCA9IGZpbmRNYXN0ZXJBcnRpZmFjdChjcmVhdGVkUmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLAorCQkJCQkJCWFydGlmYWN0cywgYXJ0aWZhY3RzTGlzdCk7CisJCQkJCWlmIChtYXN0ZXJBcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9WT0wuZ2V0VHlwZSgpKSkgeworCQkJCQkJaXNWb2x1bWUgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgdm9sdW1lX2dyb3VwIiwgaXNWb2x1bWUsIHZvbHVtZV9ncm91cCk7CisKKwkJCX0gZWxzZSB7CisJCQkJaW52YXJpYW50VVVJRCA9IChTdHJpbmcpIG1ldGFkYXRhLmdldCgiaW52YXJpYW50VVVJRCIpOworCQkJCW5hbWUgPSAoU3RyaW5nKSBtZXRhZGF0YS5nZXQoIm5hbWUiKTsKKwkJCQlVVUlEID0gKFN0cmluZykgbWV0YWRhdGEuZ2V0KCJVVUlEIik7CisJCQkJdmVyc2lvbiA9IChTdHJpbmcpIG1ldGFkYXRhLmdldCgidmVyc2lvbiIpOworCQkJCWFzc2VydE51bGwocHJvcGVydGllcyk7CisKKwkJCX0KKwkJCWFzc2VydEVxdWFscygiVmFsaWRhdGUgSW52YXJpYW50VVVJRCIsIGdyb3VwLmdldEludmFyaWFudFVVSUQoKSwgaW52YXJpYW50VVVJRCk7CisJCQlhc3NlcnRFcXVhbHMoIlZhbGlkYXRlIG5hbWUiLCBncm91cC5nZXROYW1lKCksIG5hbWUpOworCQkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSBVVUlEIiwgZ3JvdXAuZ2V0R3JvdXBVVUlEKCksIFVVSUQpOworCQkJYXNzZXJ0RXF1YWxzKCJWYWxpZGF0ZSB2ZXJzaW9uIiwgZ3JvdXAuZ2V0VmVyc2lvbigpLCB2ZXJzaW9uKTsKKworCQl9CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgZXhwb3J0Q3NhcklucHV0c1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlSZXNvdXJjZSBjcmVhdGVkUmVzb3VyY2UgPSBjcmVhdGVWZkZyb21DU0FSKHNkbmNNb2RpZmllckRldGFpbHMsICJjc2FyXzEiKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBsb2FkID0gZG93bmxvYWRBbmRQYXJzZVRvc2NhVGVtcGxhdGUoc2RuY01vZGlmaWVyRGV0YWlscywgY3JlYXRlZFJlc291cmNlKTsKKwkJYXNzZXJ0Tm90TnVsbChsb2FkKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvcG9sb2d5X3RlbXBsYXRlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGxvYWQuZ2V0KCJ0b3BvbG9neV90ZW1wbGF0ZSIpOworCQlhc3NlcnROb3ROdWxsKHRvcG9sb2d5X3RlbXBsYXRlKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGlucHV0cyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSB0b3BvbG9neV90ZW1wbGF0ZS5nZXQoImlucHV0cyIpOworCQlhc3NlcnROb3ROdWxsKGlucHV0cyk7CisKKwkJTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0c0Zyb21SZXNvdXJjZSA9IGNyZWF0ZWRSZXNvdXJjZS5nZXRJbnB1dHMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2YWxpZGF0ZSBpbnB1dHMgc2l6ZSIsIGlucHV0c0Zyb21SZXNvdXJjZS5zaXplKCksIGlucHV0cy5zaXplKCkpOworCQlmb3IgKElucHV0RGVmaW5pdGlvbiBpbnB1dERlZiA6IGlucHV0c0Zyb21SZXNvdXJjZSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBpbnB1dEluRmlsZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBpbnB1dHMuZ2V0KGlucHV0RGVmLmdldE5hbWUoKSk7CisJCQlhc3NlcnROb3ROdWxsKGlucHV0SW5GaWxlKTsKKwkJCXZhbGlkYXRlSW5wdXQoaW5wdXREZWYsIGlucHV0SW5GaWxlKTsKKwkJfQorCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBjcmVhdGVkUmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4+IGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPSBjcmVhdGVkUmVzb3VyY2UKKwkJCQkuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5vZGVfdGVtcGxhdGVzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHRvcG9sb2d5X3RlbXBsYXRlLmdldCgibm9kZV90ZW1wbGF0ZXMiKTsKKwkJYXNzZXJ0Tm90TnVsbChub2RlX3RlbXBsYXRlcyk7CisKKwkJSnNvblBhcnNlciBqc29uUGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKKworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4+IGVudHJ5IDogY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcy5lbnRyeVNldCgpKSB7CisKKwkJCU9wdGlvbmFsPENvbXBvbmVudEluc3RhbmNlPiBmaW5kRmlyc3QgPSBjb21wb25lbnRJbnN0YW5jZXMuc3RyZWFtKCkKKwkJCQkJLmZpbHRlcihjaSAtPiBjaS5nZXRVbmlxdWVJZCgpLmVxdWFscyhlbnRyeS5nZXRLZXkoKSkpLmZpbmRGaXJzdCgpOworCQkJYXNzZXJ0VHJ1ZShmaW5kRmlyc3QuaXNQcmVzZW50KCkpOworCQkJU3RyaW5nIHJlc291cmNlTmFtZSA9IGZpbmRGaXJzdC5nZXQoKS5nZXROYW1lKCk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGluc3RhbmNlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5vZGVfdGVtcGxhdGVzLmdldChyZXNvdXJjZU5hbWUpOworCQkJYXNzZXJ0Tm90TnVsbChpbnN0YW5jZSk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgaW5zdGFuY2UuZ2V0KCJwcm9wZXJ0aWVzIik7CisKKwkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjaXAgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJaWYgKGNpcC5nZXRWYWx1ZVVuaXF1ZVVpZCgpICE9IG51bGwgJiYgIWNpcC5nZXRWYWx1ZVVuaXF1ZVVpZCgpLmlzRW1wdHkoKSkgeworCQkJCQlhc3NlcnROb3ROdWxsKHByb3BlcnRpZXMpOworCQkJCQlpZiAoY2lwLmdldFZhbHVlKCkuY29udGFpbnMoImdldF9pbnB1dCIpKSB7CisJCQkJCQlPYmplY3QgcHJvcCA9IHByb3BlcnRpZXMuZ2V0KGNpcC5nZXROYW1lKCkpOworCQkJCQkJYXNzZXJ0Tm90TnVsbChwcm9wKTsKKworCQkJCQkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJCQkJCVN0cmluZyBqc29uID0gZ3Nvbi50b0pzb24ocHJvcCk7CisJCQkJCQlhc3NlcnRFcXVhbHMoInZhbGlkYXRlIGpzb24gcHJvcGVydHkiLCBjaXAuZ2V0VmFsdWUoKSwganNvbik7CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEV4cG9ydENzYXJXaXRoSnNvblByb3BlcnR5VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlTdHJpbmcgcGF5bG9hZE5hbWUgPSAianNvblByb3BlcnR5VHlwZVRlc3QuY3NhciI7CisJCUltcG9ydFJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCVN0cmluZyByb290UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKwkJUGF0aCBwYXRoID0gbnVsbDsKKwkJYnl0ZVtdIGRhdGEgPSBudWxsOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBudWxsOworCQlwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvanNvblByb3BlcnR5VHlwZVRlc3QuY3NhciIpOworCQlkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkTmFtZShwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIHBtYWFTZXJ2ZXIgPSByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zdHJlYW0oKQorCQkJCS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoInBtYWFfc2VydmVyXzAiKSkuZmluZEFueSgpLmdldCgpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGpzb25Qcm9wID0gcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcygpLmdldChwbWFhU2VydmVyLmdldFVuaXF1ZUlkKCkpCisJCQkJLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0VHlwZSgpLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5KU09OLmdldFR5cGUoKSkpLmZpbmRBbnkoKS5nZXQoKTsKKwkJU3RyaW5nIGpzb25WYWx1ZSA9ICJ7XCJwbWFhLnNiX25pY1wiOntcImFkZHJlc3NcIjp7XCJnZXRfaW5wdXRcIjpcInBtYWFfZHB1X2ZpeGVkX2lwXCJ9LFwiY2lkclwiOntcImdldF9pbnB1dFwiOlwicG1hYV9kcHVfY2lkclwifSxcImdhdGV3YXlcIjp7XCJnZXRfaW5wdXRcIjpcInBtYWFfZHB1X2dhdGV3YXlcIn19fSI7CisJCWFzc2VydEVxdWFscyhqc29uUHJvcC5nZXRWYWx1ZSgpLCBqc29uVmFsdWUpOworCQkvLyBkb3dubG9hZCBhbmQgY29tcGFyZQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGxvYWQgPSBkb3dubG9hZEFuZFBhcnNlVG9zY2FUZW1wbGF0ZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZSk7CisJCWFzc2VydE5vdE51bGwobG9hZCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gdG9wb2xvZ3lfdGVtcGxhdGUgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbG9hZC5nZXQoInRvcG9sb2d5X3RlbXBsYXRlIik7CisJCWFzc2VydE5vdE51bGwodG9wb2xvZ3lfdGVtcGxhdGUpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5vZGVzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHRvcG9sb2d5X3RlbXBsYXRlLmdldCgibm9kZV90ZW1wbGF0ZXMiKTsKKwkJYXNzZXJ0Tm90TnVsbChub2Rlcyk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcG1hYVNlcnZlck9iaiA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBub2Rlcy5nZXQoInBtYWFfc2VydmVyXzAiKTsKKwkJYXNzZXJ0Tm90TnVsbChwbWFhU2VydmVyT2JqKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwbWFhU2VydmVyT2JqLmdldCgicHJvcGVydGllcyIpOworCQlhc3NlcnROb3ROdWxsKHByb3BzKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uUHJvcE9iaiA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwcm9wcy5nZXQoIm1ldGFkYXRhIik7CisJCWFzc2VydE5vdE51bGwoanNvblByb3BPYmopOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcganNvbiA9IGdzb24udG9Kc29uKGpzb25Qcm9wT2JqKTsKKwkJYXNzZXJ0RXF1YWxzKGpzb24sIGpzb25WYWx1ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW5wdXQoSW5wdXREZWZpbml0aW9uIGlucHV0RGVmLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGlucHV0SW5GaWxlKSB7CisJCWFzc2VydEVxdWFscygidmFsaWRhdGUgaW5wdXQgdHlwZSIsIGlucHV0RGVmLmdldFR5cGUoKSwgKFN0cmluZykgaW5wdXRJbkZpbGUuZ2V0KCJ0eXBlIikpOworCisJCWlmIChpbnB1dERlZi5nZXREZWZhdWx0VmFsdWUoKSA9PSBudWxsKSB7CisJCQlhc3NlcnROdWxsKGlucHV0SW5GaWxlLmdldCgiZGVmYXVsdCIpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydE5vdE51bGwoaW5wdXRJbkZpbGUuZ2V0KCJkZWZhdWx0IikpOworCQkJU3RyaW5nIHZhbHVlID0gaW5wdXREZWYuZ2V0RGVmYXVsdFZhbHVlKCkucmVwbGFjZSgiXCIiLCAiIik7CisJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIiAiLCAiIik7CisJCQlTdHJpbmcgZXhwVmFsdWUgPSBpbnB1dEluRmlsZS5nZXQoImRlZmF1bHQiKS50b1N0cmluZygpLnJlcGxhY2UoIiAiLCAiIik7CisJCQlhc3NlcnRFcXVhbHMoInZhbGlkYXRlIGlucHV0IGRlZmF1bHQiLCB2YWx1ZSwgZXhwVmFsdWUpOworCQl9CisJCWFzc2VydEVxdWFscygidmFsaWRhdGUgaW5wdXQgZGVzY3JpcHRpb24iLCBpbnB1dERlZi5nZXREZXNjcmlwdGlvbigpLCAoU3RyaW5nKSBpbnB1dEluRmlsZS5nZXQoImRlc2NyaXB0aW9uIikpOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZG93bmxvYWRBbmRQYXJzZVRvc2NhVGVtcGxhdGUoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBSZXNvdXJjZSBjcmVhdGVkUmVzb3VyY2UpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFydGlmYWN0VW5pcWVJZCA9IGNyZWF0ZWRSZXNvdXJjZS5nZXRUb3NjYUFydGlmYWN0cygpLmdldCgiYXNzZXR0b3NjYXRlbXBsYXRlIikuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXN0UmVzcG9uc2UgdG9zY2FUZW1wbGF0ZSA9IEFydGlmYWN0UmVzdFV0aWxzLmRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdEludGVybmFsQXBpKAorCQkJCWNyZWF0ZWRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBhcnRpZmFjdFVuaXFlSWQpOworCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KHRvc2NhVGVtcGxhdGUuZ2V0UmVzcG9uc2UoKSwKKwkJCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhLmNsYXNzKTsKKwkJYnl0ZVtdIGZyb21VaURvd25sb2FkID0gYXJ0aWZhY3RVaURvd25sb2FkRGF0YS5nZXRCYXNlNjRDb250ZW50cygpLmdldEJ5dGVzKCk7CisJCWJ5dGVbXSBkZWNvZGVCYXNlNjQgPSBCYXNlNjQuZGVjb2RlQmFzZTY0KGZyb21VaURvd25sb2FkKTsKKwkJWWFtbCB5YW1sID0gbmV3IFlhbWwoKTsKKworCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkZWNvZGVCYXNlNjQpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbG9hZCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSB5YW1sLmxvYWQoaW5wdXRTdHJlYW0pOworCQlyZXR1cm4gbG9hZDsKKwl9CisKKwlwcml2YXRlIFJlc291cmNlIGNyZWF0ZVZmRnJvbUNTQVIoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgY3NhcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY3JlYXRlIG5ldyByZXNvdXJjZSBmcm9tIENzYXIKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChjc2FySWQpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgY3JlYXRlZFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCXJldHVybiBjcmVhdGVkUmVzb3VyY2U7CisJfQorCisJcHVibGljIEFydGlmYWN0RGVmaW5pdGlvbiBmaW5kTWFzdGVyQXJ0aWZhY3QoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBseW1lbnRBcnRpZmFjdCwKKwkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMsIExpc3Q8U3RyaW5nPiBhcnRpZmFjdHNMaXN0KSB7CisJCWZvciAoU3RyaW5nIGFydGlmYWN0VWlkIDogYXJ0aWZhY3RzTGlzdCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBkZXBseW1lbnRBcnRpZmFjdC5lbnRyeVNldCgpKSB7CisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0ID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlpZiAoYXJ0aWZhY3RVaWQuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdC5nZXRVbmlxdWVJZCgpKSkgeworCQkJCQlhcnRpZmFjdHMuYWRkKGFydGlmYWN0KTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCQlBcnRpZmFjdERlZmluaXRpb24gbWFzdGVyQXJ0aWZhY3QgPSBudWxsOworCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8gOiBhcnRpZmFjdHMpIHsKKwkJCVN0cmluZyBhdHJpZmFjdFR5cGUgPSBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCk7CisJCQlpZiAoYXRyaWZhY3RUeXBlLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX1ZPTC5nZXRUeXBlKCkpCisJCQkJCXx8IGF0cmlmYWN0VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9ORVQuZ2V0VHlwZSgpKSkgeworCQkJCW1hc3RlckFydGlmYWN0ID0gYXJ0aWZhY3RJbmZvOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGF0cmlmYWN0VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpKSB7CisJCQkJbWFzdGVyQXJ0aWZhY3QgPSBhcnRpZmFjdEluZm87CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIG1hc3RlckFydGlmYWN0OworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2ltcG9ydHMvSW1wb3J0Q3NhclJlc291cmNlVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9JbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiNGU1YgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2ltcG9ydHMvSW1wb3J0Q3NhclJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUzOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0czsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLldvcmRVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdyb3VwRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkltcG9ydFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuR3JvdXBSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5JbXBvcnRSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKK3B1YmxpYyBjbGFzcyBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlwdWJsaWMgSW1wb3J0Q3NhclJlc291cmNlVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgSW1wb3J0Q3NhclJlc291cmNlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkQXNzZXJ0TWVzc2FnZShTdHJpbmcgZXhwZWN0ZWRTdHJpbmcsIFN0cmluZyBhY3R1YWxTdHJpbmcpIHsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGlzIDogJXMgLCBhY3R1YWwgaXM6ICVzIiwgZXhwZWN0ZWRTdHJpbmcsIGFjdHVhbFN0cmluZyk7CisJfQorCisJLyoqCisJICogCisJICogVXNlciBTdG9yeSA6IFVTNjQwNjE1IFtCRV0gLSBFeHRlbmQgY3JlYXRlIFZGIEFQSSB3aXRoIEltcG9ydCBUT1NDQSBDU0FSCisJICovCisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUZyb21Dc2FySGFwcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIkFGN0YyMzE5NjlDNTQ2M0Y5Qzk2ODU3MDA3MEU4ODc3Iik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyg1LCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkpOworCisJCVN0cmluZyBleHBlY3RlZENzYXJVVUlEID0gcmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCk7CisJCVN0cmluZyBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lID0gIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmYuIiArIFdvcmRVdGlscy5jYXBpdGFsaXplKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7CisKKwkJYXNzZXJ0VHJ1ZSgiY3NhclVVSUQgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkQ3NhclVVSUQsIHJlc291cmNlLmdldENzYXJVVUlEKCkpLCBleHBlY3RlZENzYXJVVUlELmVxdWFscyhyZXNvdXJjZS5nZXRDc2FyVVVJRCgpKSk7CisJCWFzc2VydFRydWUoInRvc2NhUmVzb3VyY2VOYW1lIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLCByZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSwgZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZS5lcXVhbHMocmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIGdldFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRDc2FyVVVJRCwgZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIGV4cGVjdGVkQ3NhclVVSUQuZXF1YWxzKGdldFJlc291cmNlLmdldENzYXJVVUlEKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsIGdldFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLCBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhnZXRSZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgZW1wdHlTdHJpbmdJbkNzYXJVVUlERmllbGRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBlbXB0eVN0cmluZyA9ICIiOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChlbXB0eVN0cmluZyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUgPSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi4iICsgV29yZFV0aWxzLmNhcGl0YWxpemUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZW1wdHlTdHJpbmcsIHJlc291cmNlLmdldENzYXJVVUlEKCkpLCByZXNvdXJjZS5nZXRDc2FyVVVJRCgpID09IGVtcHR5U3RyaW5nKTsKKwkJYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsIHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLCBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhyZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydFRydWUoImNzYXJVVUlEIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShlbXB0eVN0cmluZywgZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIGdldFJlc291cmNlLmdldENzYXJVVUlEKCkgPT0gZW1wdHlTdHJpbmcpOworCQlhc3NlcnRUcnVlKCJ0b3NjYVJlc291cmNlTmFtZSA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZSwgZ2V0UmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSksIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUuZXF1YWxzKGdldFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUZyb21TY3JhdGNoVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUgPSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi4iICsgV29yZFV0aWxzLmNhcGl0YWxpemUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UobnVsbCwgcmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIHJlc291cmNlLmdldENzYXJVVUlEKCkgPT0gbnVsbCk7CisJCWFzc2VydFRydWUoInRvc2NhUmVzb3VyY2VOYW1lIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLCByZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSwgZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZS5lcXVhbHMocmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIGdldFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UobnVsbCwgZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIGdldFJlc291cmNlLmdldENzYXJVVUlEKCkgPT0gbnVsbCk7CisJCWFzc2VydFRydWUoInRvc2NhUmVzb3VyY2VOYW1lIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLCBnZXRSZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSwgZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZS5lcXVhbHMoZ2V0UmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGZpbGVOb3RDc2FyVHlwZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJ2YWxpZF92Zl96aXAiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DU0FSX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbWlzc2luZ1Rvc2NhTWV0YWRhdGFGb2xkZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJ0b3NjYUZvbGRlck5vdEV4aXN0cyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbWlzc2luZ1Rvc2NhTWV0YUZpbGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJ0b3NjYU1ldGFGaWxlTm90RXhpc3RzIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElELm5hbWUoKSwgdmFyaWFibGVzLCBjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCB0b3NjYU1ldGFGaWxlT3V0c2lkZVRoZUZvbGRlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoInRvc2NhTWV0YU91dHNpZGVUaGVGb2xkZXIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSUQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNhc2VTZW5zaXRpdmVUZXN0XzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImNhc2VTZW5zaXRpdmVUZXN0XzEiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSUQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNhc2VTZW5zaXRpdmVUZXN0XzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImNhc2VTZW5zaXRpdmVUZXN0XzIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSUQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIG1pc3NpbmdPbmVMaW5lSW5Ub3NjYU1ldGFGaWxlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgibWlzc2luZ09uZUxpbmVJblRvc2NhTWV0YSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIG5vQ1NBUlZlcnNpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgibm9DU0FSVmVyc2lvbiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIG5vQ3JlYXRlZEJ5VmFsdWVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgibm9DcmVhdGVkQnlWYWx1ZSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIG5vRW50cnlEZWZpbml0aW9uc1ZhbHVlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIm5vRW50cnlEZWZpbml0aW9uc1ZhbHVlIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbm9UT1NDQU1ldGFGaWxlVmVyc2lvblZhbHVlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIm5vVE9TQ0FNZXRhRmlsZVZlcnNpb25WYWx1ZSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGludmFsaWRDc2FyVmVyc2lvbkluTWV0YUZpbGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiaW52YWxpZENzYXJWZXJzaW9uIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJpbnZhbGlkQ3NhclZlcnNpb24yIik7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiaW52YWxpZENzYXJWZXJzaW9uMyIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCXZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSURfRk9STUFULm5hbWUoKSwgdmFyaWFibGVzLCBjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImludmFsaWRDc2FyVmVyc2lvbjQiKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQl2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJpbnZhbGlkQ3NhclZlcnNpb241Iik7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgdmFsaWRDc2FyVmVyc2lvbkluTWV0YUZpbGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgidmFsaWRDc2FyVmVyc2lvbiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyg1LCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkpOworCisJCVN0cmluZyBleHBlY3RlZENzYXJVVUlEID0gcmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCk7CisJCVN0cmluZyBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lID0gIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmYuIiArIFdvcmRVdGlscy5jYXBpdGFsaXplKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7CisKKwkJYXNzZXJ0VHJ1ZSgiY3NhclVVSUQgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkQ3NhclVVSUQsIHJlc291cmNlLmdldENzYXJVVUlEKCkpLCBleHBlY3RlZENzYXJVVUlELmVxdWFscyhyZXNvdXJjZS5nZXRDc2FyVVVJRCgpKSk7CisJCWFzc2VydFRydWUoInRvc2NhUmVzb3VyY2VOYW1lIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLCByZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSwgZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZS5lcXVhbHMocmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIGdldFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRDc2FyVVVJRCwgZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIGV4cGVjdGVkQ3NhclVVSUQuZXF1YWxzKGdldFJlc291cmNlLmdldENzYXJVVUlEKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsIGdldFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLCBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhnZXRSZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgdW5kZXJzY29yZUluVG9zY2FNZXRhRmlsZVZlcnNpb25OYW1lVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoInVuZGVyc2NvcmVJbnN0ZWFkT2ZEYXNoIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbWlzc2luZ0VudHJ5RGVmaW50aW9uSW5NZXRhRmlsZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJtaXNzaW5nRW50cnlEZWZpbnRpb25QYWlyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIG5vTmV3TGluZUFmdGVyQkxvY2swVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIm5vTmV3TGluZUFmdGVyQkxvY2swIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbW9yZVRoYW5PbmVZYW1sRmlsZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJtb3JlVGhlbk9uZVlhbWxGaWxlIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkQ3NhclVVSUQgPSByZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKTsKKwkJU3RyaW5nIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUgPSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi4iICsgV29yZFV0aWxzLmNhcGl0YWxpemUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRDc2FyVVVJRCwgcmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIGV4cGVjdGVkQ3NhclVVSUQuZXF1YWxzKHJlc291cmNlLmdldENzYXJVVUlEKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsIHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLCBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhyZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydFRydWUoImNzYXJVVUlEIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZENzYXJVVUlELCBnZXRSZXNvdXJjZS5nZXRDc2FyVVVJRCgpKSwgZXhwZWN0ZWRDc2FyVVVJRC5lcXVhbHMoZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSkpOworCQlhc3NlcnRUcnVlKCJ0b3NjYVJlc291cmNlTmFtZSA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZSwgZ2V0UmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSksIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUuZXF1YWxzKGdldFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBtb3JlVGhhbk9uZU1ldGFGaWxlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIm1vcmVUaGFuT25lTWV0YUZpbGUiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoNSwgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRDc2FyVVVJRCA9IHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpOworCQlTdHJpbmcgZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZSA9ICJvcmcub3BlbmVjb21wLnJlc291cmNlLnZmLiIgKyBXb3JkVXRpbHMuY2FwaXRhbGl6ZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCisJCWFzc2VydFRydWUoImNzYXJVVUlEIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZENzYXJVVUlELCByZXNvdXJjZS5nZXRDc2FyVVVJRCgpKSwgZXhwZWN0ZWRDc2FyVVVJRC5lcXVhbHMocmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSkpOworCQlhc3NlcnRUcnVlKCJ0b3NjYVJlc291cmNlTmFtZSA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZSwgcmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSksIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUuZXF1YWxzKHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSBnZXRSZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZSgiY3NhclVVSUQgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkQ3NhclVVSUQsIGdldFJlc291cmNlLmdldENzYXJVVUlEKCkpLCBleHBlY3RlZENzYXJVVUlELmVxdWFscyhnZXRSZXNvdXJjZS5nZXRDc2FyVVVJRCgpKSk7CisJCWFzc2VydFRydWUoInRvc2NhUmVzb3VyY2VOYW1lIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLCBnZXRSZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSwgZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZS5lcXVhbHMoZ2V0UmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNzYXJOb3RDb250YWluc1lhbWxBbmRNZXRhRmlsZXNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJub3RDb250YWluWWFtbEFuZE1ldGFGaWxlcyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3Nhck5vdENvbnRhaW5zWWFtbEZpbGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJub3RDb250YWluWWFtbEZpbGUiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJdmFyaWFibGVzLmFkZCgiRGVmaW5pdGlvbnMvdG9zY2FfbW9ja192Zi55YW1sIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuWUFNTF9OT1RfRk9VTkRfSU5fQ1NBUi5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbWlzc2luZ0NzYXJGaWxlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiYWJjIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGxvbmdOYW1lc0luVG9zY2FNZXRhRmlsZVRlc3RfMSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImxvbmdOYW1lc0luVG9zY2FNZXRhRmlsZTEiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSURfRk9STUFULm5hbWUoKSwgdmFyaWFibGVzLCBjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBsb25nTmFtZXNJblRvc2NhTWV0YUZpbGVUZXN0XzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJsb25nTmFtZXNJblRvc2NhTWV0YUZpbGUyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlVGVzdF8zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgibG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlMyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldENzYXJVVUlEKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGxvbmdOYW1lc0luVG9zY2FNZXRhRmlsZVRlc3RfNCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImxvbmdOYW1lc0luVG9zY2FNZXRhRmlsZTQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlc291cmNlRGV0YWlscy5nZXRDc2FyVVVJRCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSURfRk9STUFULm5hbWUoKSwgdmFyaWFibGVzLCBjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBsb25nTmFtZXNJblRvc2NhTWV0YUZpbGVUZXN0XzUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJsb25nTmFtZXNJblRvc2NhTWV0YUZpbGU1Iik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJLy8gcG9zc2libGUgdG8gaGF2ZSBtb3JlIHRoYW4gZm91ciBsaW5lcyBpbiBibG9jayAwCisJLy8gQFRlc3QgKGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGZpdmVMaW5lc0FzQmxvY2swVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImZpdmVMaW5lc0FzQmxvY2swIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywgY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgbGlmZWN5Y2xlQ2hhbmdpbmdUb1Jlc291cmNlRnJvbUNzYXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJ2YWxpZF92ZiIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydFRydWUoIjAuMSIuZXF1YWxzKHJlc291cmNlLmdldFZlcnNpb24oKSkpOworCQlhc3NlcnRUcnVlKExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQuZ2V0Q29tcG9uZW50U3RhdGUoKS5lcXVhbHMocmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKS50b1N0cmluZygpKSk7CisKKwkJU3RyaW5nIGRlc2lnbmVyVXNlcklkID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRVc2VySWQoKTsKKwkJU3RyaW5nIHRlc3RlclVzZXJJZCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLmdldFVzZXJJZCgpOworCQlTdHJpbmcgY3NhclVuaXF1ZUlkID0gcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydE5vdE51bGwoY3NhclVuaXF1ZUlkKTsKKworCQlSZXN0UmVzcG9uc2UgbGlmZWN5Y2xlQ2hhbmdlUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlcklkLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGxpZmVjeWNsZUNoYW5nZVJlc3BvbnNlKTsKKwkJbGlmZWN5Y2xlQ2hhbmdlUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlcklkLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhsaWZlY3ljbGVDaGFuZ2VSZXNwb25zZSk7CisJCWxpZmVjeWNsZUNoYW5nZVJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lclVzZXJJZCwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhsaWZlY3ljbGVDaGFuZ2VSZXNwb25zZSk7CisJCWxpZmVjeWNsZUNoYW5nZVJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lclVzZXJJZCwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MobGlmZWN5Y2xlQ2hhbmdlUmVzcG9uc2UpOworCQlsaWZlY3ljbGVDaGFuZ2VSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdGVzdGVyVXNlcklkLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MobGlmZWN5Y2xlQ2hhbmdlUmVzcG9uc2UpOworCQlsaWZlY3ljbGVDaGFuZ2VSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdGVzdGVyVXNlcklkLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGxpZmVjeWNsZUNoYW5nZVJlc3BvbnNlKTsKKwkJbGlmZWN5Y2xlQ2hhbmdlUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlcklkLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhsaWZlY3ljbGVDaGFuZ2VSZXNwb25zZSk7CisKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIobGlmZWN5Y2xlQ2hhbmdlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbFZlcnNpb25zID0gcmVzb3VyY2UuZ2V0QWxsVmVyc2lvbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGFsbFZlcnNpb25zLmtleVNldCgpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBhbGxWZXJzaW9ucy52YWx1ZXMoKS5zaXplKCkpOworCQlTZXQ8U3RyaW5nPiBrZXlTZXQgPSBhbGxWZXJzaW9ucy5rZXlTZXQoKTsKKwkJYXNzZXJ0VHJ1ZShrZXlTZXQuY29udGFpbnMoIjEuMCIpKTsKKwkJYXNzZXJ0VHJ1ZShrZXlTZXQuY29udGFpbnMoIjEuMSIpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBjc2FyV2l0aEpzb25Qcm9tRW52VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiVlNQUGFja2FnZUpzb25Qcm9wLmNzYXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgdXBsb2FkQXJ0aWZhY3RUb1Jlc291cmNlRnJvbUNzYXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJ2YWxpZF92ZiIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKworCQlVc2VyIGRlc2lnbmVyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRBcnRpZmFjdCgiZmlyc3RBcnRpZmFjdCIpOworCQlTdHJpbmcgZmlyc3RBcnRpZmFjdExhYmVsID0gYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKTsKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGFydGlmYWN0RGV0YWlscywgZGVzaWduZXIsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQXJ0aWZhY3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gaW5mb3JtYXRpb25hbEFydGlmYWN0cyA9IHJlc291cmNlLmdldEFydGlmYWN0cygpOworCQlhc3NlcnRFcXVhbHMoMSwgaW5mb3JtYXRpb25hbEFydGlmYWN0cy5rZXlTZXQoKS5zaXplKCkpOworCQlTZXQ8U3RyaW5nPiBrZXlTZXQgPSBpbmZvcm1hdGlvbmFsQXJ0aWZhY3RzLmtleVNldCgpOworCQlhc3NlcnRUcnVlKGtleVNldC5jb250YWlucyhmaXJzdEFydGlmYWN0TGFiZWwudG9Mb3dlckNhc2UoKSkpOworCQlDb2xsZWN0aW9uPEFydGlmYWN0RGVmaW5pdGlvbj4gdmFsdWVzID0gaW5mb3JtYXRpb25hbEFydGlmYWN0cy52YWx1ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHZhbHVlcy5zaXplKCkpOworCQlJdGVyYXRvcjxBcnRpZmFjdERlZmluaXRpb24+IGl0ZXJhdG9yID0gdmFsdWVzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhY3R1YWxBcnRpZmFjdCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCWFzc2VydFRydWUoZmlyc3RBcnRpZmFjdExhYmVsLmVxdWFscyhhY3R1YWxBcnRpZmFjdC5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpKTsKKwkJfQorCisJCVJlc3RSZXNwb25zZSBsaWZlY3ljbGVDaGFuZ2VSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXIuZ2V0VXNlcklkKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MobGlmZWN5Y2xlQ2hhbmdlUmVzcG9uc2UpOworCQlsaWZlY3ljbGVDaGFuZ2VSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXIuZ2V0VXNlcklkKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGxpZmVjeWNsZUNoYW5nZVJlc3BvbnNlKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRBcnRpZmFjdCgic2Vjb25kQXJ0aWZhY3QiKTsKKwkJYXJ0aWZhY3REZXRhaWxzMi5zZXRBcnRpZmFjdE5hbWUoInNlY29uZEFydGlmYWN0Iik7CisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGFydGlmYWN0RGV0YWlsczIsIGRlc2lnbmVyLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUFydGlmYWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKTsKKworCQlnZXRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJaW5mb3JtYXRpb25hbEFydGlmYWN0cyA9IHJlc291cmNlLmdldEFydGlmYWN0cygpOworCQlhc3NlcnRFcXVhbHMoMiwgaW5mb3JtYXRpb25hbEFydGlmYWN0cy5rZXlTZXQoKS5zaXplKCkpOworCQlrZXlTZXQgPSBpbmZvcm1hdGlvbmFsQXJ0aWZhY3RzLmtleVNldCgpOworCQlhc3NlcnRUcnVlKGtleVNldC5jb250YWlucyhmaXJzdEFydGlmYWN0TGFiZWwudG9Mb3dlckNhc2UoKSkpOworCQlhc3NlcnRUcnVlKGtleVNldC5jb250YWlucyhhcnRpZmFjdERldGFpbHMyLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpKSk7CisJCXZhbHVlcyA9IGluZm9ybWF0aW9uYWxBcnRpZmFjdHMudmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygyLCB2YWx1ZXMuc2l6ZSgpKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uW10gYWN0dWFsQXJ0aWZhY3RzID0gdmFsdWVzLnRvQXJyYXkobmV3IEFydGlmYWN0RGVmaW5pdGlvblsyXSk7CisJCWFzc2VydFRydWUoZmlyc3RBcnRpZmFjdExhYmVsLmVxdWFscyhhY3R1YWxBcnRpZmFjdHNbMF0uZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKSk7CisJCWFzc2VydFRydWUoYXJ0aWZhY3REZXRhaWxzMi5nZXRBcnRpZmFjdExhYmVsKCkuZXF1YWxzKGFjdHVhbEFydGlmYWN0c1sxXS5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpKTsKKwl9CisKKwkvKgorCSAqIC8vIEBUZXN0IChlbmFibGVkID0gdHJ1ZSkgcHVibGljIHZvaWQgY3JlYXRlVXBkYXRlSW1wb3J0UmVzb3VyY2VGcm9tQ3NhckFydGlmYWN0c1dlcmVOb3RDaGFuZ2VkVGVzdCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOyAvLyAvL2JhY2sgb3JpZ2luYWwgc2NhciBSZXN0UmVzcG9uc2UKKwkgKiBjb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOyBCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKwkgKiAKKwkgKiAvLyByZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsgLy8gUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsgcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoInRlc3Q1Iik7CisJICogcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7IHJlc291cmNlRGV0YWlscy5zZXRDc2FyVmVyc2lvbigiMSIpOyAvLyBTdHJpbmcgaW52YXJpYW50VVVJRCA9IHJlc291cmNlLmdldEludmFyaWFudFVVSUQoKTsgLy8gLy8gUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUgPQorCSAqIExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsgLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkgKiAKKwkgKiAvLyBCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsgLy8gLy9jaGFuZ2UgbmFtZSAodGVtcG9yYXJ5KSByZXNvdXJjZURldGFpbHMuc2V0Q3NhclZlcnNpb24oIjIiKTsgcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoInRlc3Q2Iik7IGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCSAqIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsgUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiB1cGRhdGVkQXJ0aWZhY3RzID0gdXBkYXRlZFJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsgZm9yCisJICogKEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdEVudHJ5IDogcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmVudHJ5U2V0KCkpIHsgaWYgKHVwZGF0ZWRBcnRpZmFjdHMuY29udGFpbnNLZXkoYXJ0aWZhY3RFbnRyeS5nZXRLZXkoKSkpIHsgQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJBcnQgPSB1cGRhdGVkQXJ0aWZhY3RzLmdldChhcnRpZmFjdEVudHJ5LmdldEtleSgpKTsKKwkgKiBhc3NlcnRFcXVhbHMoY3VyckFydC5nZXRBcnRpZmFjdFZlcnNpb24oKSwgYXJ0aWZhY3RFbnRyeS5nZXRWYWx1ZSgpLmdldEFydGlmYWN0VmVyc2lvbigpKTsgYXNzZXJ0RXF1YWxzKGN1cnJBcnQuZ2V0QXJ0aWZhY3RVVUlEKCksIGFydGlmYWN0RW50cnkuZ2V0VmFsdWUoKS5nZXRBcnRpZmFjdFVVSUQoKSk7IGFzc2VydEVxdWFscyhjdXJyQXJ0LmdldEFydGlmYWN0Q2hlY2tzdW0oKSwKKwkgKiBhcnRpZmFjdEVudHJ5LmdldFZhbHVlKCkuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpKTsgfSB9IC8vIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOyAvLyByZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDUiKTsgLy8gcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7IH0KKwkgKi8KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZUltcG9ydFJlc291cmNlRnJvbUNzYXJEaXNzb3RpYXRlQXJ0aWZhY3RGcm9tR3JvdXBUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVJlc3RSZXNwb25zZSBjb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEID0gcmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpOworCisJCS8vIGFkZCBhcnRpZmFjdCBmcm9tIG1ldGFkYXRhIChyZXNvdXJjZSBtZXRhZGF0YSBzaG91bGQgYmUgdXBkYXRlZCkKKwkJLy8gUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UgPQorCQkvLyBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRBcnRpZmFjdCgpLAorCQkvLyBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCS8vIEFydGlmYWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoInRlc3Q0Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSUQsIHJlc291cmNlLmdldEludmFyaWFudFVVSUQoKSk7CisKKwkJLy8gd3JvbmcgUkkgKHdpdGhvdXQgbm9kZSB0eXBlcywgcmVzb3VyY2Ugc2hvdWxkbid0IGJlIHVwZGF0ZWQpCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2Rpc3NvY2lhdGUuY3NhciIsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCQkvLyBjaGFuZ2UgbmFtZSAodGVtcG9yYXJ5KQorCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDQiKTsKKwkJdXBkYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlELCByZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCkpOworCisJCS8vIGJhY2sgb3JpZ2luYWwgc2NhcgorCQljb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVJbXBvcnRSZXNvdXJjZUZyb21Dc2FyTmV3Z3JvdXBUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVJlc3RSZXNwb25zZSBjb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEID0gcmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpOworCisJCS8vIHVwZGF0ZSBzY2FyCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX1VwZGF0ZVRvc2NhQW5kQXJ0aWZhY3RzLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDIiKTsKKwkJLy8gY2hhbmdlIHJlc291cmNlIG1ldGFEYXRhIChyZXNvdXJjZSBzaG91bGQgYmUgdXBkYXRlZCkKKwkJcmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJJdCBpcyBuZXcgZGVzY3JpcHRpb24gYmxhIGJsYSBibGEiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlELCByZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCkpOworCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2EuY3NhciIsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZUltcG9ydFJlc291cmNlRnJvbUNzYXJHZXRHcm91cFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJLy8gUmVzdFJlc3BvbnNlIGNvcHlSZXMgPQorCQkvLyBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYS5jc2FyIiwiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJWU1BQYWNrYWdlIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEID0gcmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpOworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzID0gcmVzb3VyY2UuZ2V0R3JvdXBzKCk7CisKKwkJR3JvdXBEZWZpbml0aW9uIGdyb3VwV2l0aEFydGlmYWN0ID0gZ3JvdXBzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0QXJ0aWZhY3RzKCkgIT0gbnVsbCAmJiAhcC5nZXRBcnRpZmFjdHMoKS5pc0VtcHR5KCkpLmZpbmRGaXJzdCgpLmdldCgpOworCisJCVJlc3RSZXNwb25zZSBncm91cFJlc3QgPSBHcm91cFJlc3RVdGlscy5nZXRHcm91cEJ5SWQocmVzb3VyY2UsIGdyb3VwV2l0aEFydGlmYWN0LmdldFVuaXF1ZUlkKCksIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhncm91cFJlc3QpOworCisJCUdyb3VwRGVmaW5pdGlvbiBncm91cFdpdGhvdXRBcnRpZmFjdCA9IGdyb3Vwcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldEFydGlmYWN0cygpID09IG51bGwgfHwgcC5nZXRBcnRpZmFjdHMoKS5pc0VtcHR5KCkpLmZpbmRGaXJzdCgpLmdldCgpOworCisJCWdyb3VwUmVzdCA9IEdyb3VwUmVzdFV0aWxzLmdldEdyb3VwQnlJZChyZXNvdXJjZSwgZ3JvdXBXaXRob3V0QXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdyb3VwUmVzdCk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlSW1wb3J0UmVzb3VyY2VGcm9tQ3NhclVJVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBudWxsOworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlTdHJpbmcgcGF5bG9hZE5hbWUgPSAidmFsaWRfdmYuY3NhciI7CisJCUltcG9ydFJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCVN0cmluZyByb290UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKwkJUGF0aCBwYXRoID0gbnVsbDsKKwkJYnl0ZVtdIGRhdGEgPSBudWxsOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBudWxsOworCisJCXBhdGggPSBQYXRocy5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zi5jc2FyIik7CisJCWRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCXBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKworCQkvLyBjcmVhdGUgbmV3IHJlc291cmNlIGZyb20gQ3NhcgorCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoNSwgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBjaGFuZ2UgY29tcG9zaXRpb24gKHJlc291cmNlIHNob3VsZCBiZSB1cGRhdGVkKQorCQlwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYi5jc2FyIik7CisJCWRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCXBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKwkJLy8gY2hhbmdlIG5hbWUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoInRlc3QxIik7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKworCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIGNoYW5nZSBuYW1lCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0MiIpOworCQkvLyBjaGFuZ2UgcmVzb3VyY2UgbWV0YURhdGEgKHJlc291cmNlIHNob3VsZCBiZSB1cGRhdGVkKQorCQlyZXNvdXJjZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIkl0IGlzIG5ldyBkZXNjcmlwdGlvbiBibGEgYmxhIGJsYSIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB3cm9uZyBSSSAod2l0aG91dCBub2RlIHR5cGVzLCByZXNvdXJjZSBzaG91bGRuJ3QgYmUgdXBkYXRlZCkKKwkJcGF0aCA9IFBhdGhzLmdldChyb290UGF0aCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZhbGlkX3ZmX2MuY3NhciIpOworCQlkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisJCS8vIGNoYW5nZSBuYW1lCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0MyIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGNyZWF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9OT0RFX1RFTVBMQVRFLCAiRGVmaW5pdGlvbnMvdG9zY2FfbW9ja192Zi55YW1sIiwgIm5vZGVqcyIsICJ0b3NjYS5ub2Rlcy5XZWJlciIpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZSk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksICJ0ZXN0MyIsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZShnZXRSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCwgInRlc3QzIik7CisKKwkJLy8gY3JlYXRlIG5ldyByZXNvdXJjZSBmcm9tIG90aGVyIENzYXIKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCXBhdGggPSBQYXRocy5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9WRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCWRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCXBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWROYW1lKCJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0NCIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKworCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIHdyb25nIFJJICh3aXRoIG5vZGUgdHlwZXMpIHJlc291cmNlIHNob3VsZG4ndCBiZSBjcmVhdGVkCisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYi5jc2FyIik7CisJCXBhdGggPSBQYXRocy5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9WRl9SSTJfRzRfd2l0aEFydGlmYWN0c19iLmNzYXIiKTsKKwkJZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZERhdGEocGF5bG9hZERhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZE5hbWUoIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2IuY3NhciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDUiKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZShjcmVhdGVSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgIkRlZmluaXRpb25zL1ZGX1JJMl9HMS55YW1sIiwgInBzMDRfcG9ydF8wIiwgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3Aubm9kZXMuaGVhdC5uZXR3b3JrLm5ldXRyb24uUG9ydHVyIik7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlVXBkYXRlSW1wb3J0UmVzb3VyY2VGcm9tQ3NhclVJVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBudWxsOworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlTdHJpbmcgcGF5bG9hZE5hbWUgPSAidmFsaWRfdmYuY3NhciI7CisJCUltcG9ydFJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCVN0cmluZyByb290UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKwkJUGF0aCBwYXRoID0gbnVsbDsKKwkJYnl0ZVtdIGRhdGEgPSBudWxsOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBudWxsOworCisJCXBhdGggPSBQYXRocy5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zi5jc2FyIik7CisJCWRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCXBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKworCQkvLyBjcmVhdGUgbmV3IHJlc291cmNlIGZyb20gQ3NhcgorCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoNSwgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBjaGFuZ2UgY29tcG9zaXRpb24gYW5kIHVwZGF0ZSByZXNvdXJjZQorCQlwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYi5jc2FyIik7CisJCWRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCXBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkvLyBjaGFuZ2UgbmFtZQorCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBjaGFuZ2UgbmFtZQorCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDIiKTsKKwkJLy8gY2hhbmdlIHJlc291cmNlIG1ldGFEYXRhIChyZXNvdXJjZSBzaG91bGQgYmUgdXBkYXRlZCkKKwkJcmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJJdCBpcyBuZXcgZGVzY3JpcHRpb24gYmxhIGJsYSBibGEiKTsKKwkJdXBkYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB0cnkgdG8gdXBkYXRlIHJlc291cmNlIHdpdGggd3JvbmcgUkkgKHdpdGhvdXQgbm9kZSB0eXBlcywgcmVzb3VyY2UKKwkJLy8gc2hvdWxkbid0IGJlIHVwZGF0ZWQpCisJCXBhdGggPSBQYXRocy5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zl9jLmNzYXIiKTsKKwkJZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZERhdGEocGF5bG9hZERhdGEpOworCQkvLyBjaGFuZ2UgbmFtZQorCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDMiKTsKKwkJdXBkYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZSh1cGRhdGVSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgIkRlZmluaXRpb25zL3Rvc2NhX21vY2tfdmYueWFtbCIsICJub2RlanMiLCAidG9zY2Eubm9kZXMuV2ViZXIiKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2UpOworCQlnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLCAidGVzdDMiLCByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0Vycm9yUmVzcG9uc2UoZ2V0UmVzb3VyY2UsIEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsICJ0ZXN0MyIpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVVwZGF0ZUltcG9ydFJlc291cmNlRnJvbUNzYXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVJlc3RSZXNwb25zZSBjb3B5UmVzID0gbnVsbDsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gbnVsbDsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG51bGw7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZSA9IG51bGw7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IG51bGw7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUgPSBudWxsOworCisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgInZhbGlkX3ZmX2EuY3NhciIsICJ2YWxpZF92Zi5jc2FyIik7CisJCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoInZhbGlkX3ZmLmNzYXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoNSwgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKwkJU3RyaW5nIGludmFyaWFudFVVSUQgPSByZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBjaGFuZ2UgY29tcG9zaXRpb24gYW5kIHVwZGF0ZSByZXNvdXJjZQorCQljb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJ2YWxpZF92Zl9iLmNzYXIiLCAidmFsaWRfdmYuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKwkJLy8gY2hhbmdlIG5hbWUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoInRlc3QxIik7CisJCXVwZGF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRCwgcmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpKTsKKworCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIGJhY2sgb3JpZ2luYWwgc2NhcgorCQljb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJ2YWxpZF92Zl9hLmNzYXIiLCAidmFsaWRfdmYuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKworCQkvLyBjaGFuZ2UgbmFtZQorCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDIiKTsKKwkJLy8gY2hhbmdlIHJlc291cmNlIG1ldGFEYXRhIGFuZCB1cGRhdGUgcmVzb3VyY2UKKwkJcmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJJdCBpcyBuZXcgZGVzY3JpcHRpb24gYmxhIGJsYSBibGEiKTsKKwkJdXBkYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlELCByZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCkpOworCisJCWNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gYmFjayBvcmlnaW5hbCBzY2FyCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgInZhbGlkX3ZmX2EuY3NhciIsICJ2YWxpZF92Zi5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCisJCS8vIHRyeSB0byB1cGRhdGUgcmVzb3VyY2Ugd2l0aCB3cm9uZyBSSSAod2l0aG91dCBub2RlIHR5cGVzLCByZXNvdXJjZQorCQkvLyBzaG91bGRuJ3QgYmUgdXBkYXRlZCkKKwkJY29weVJlcyA9IGNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLCAidmFsaWRfdmZfYy5jc2FyIiwgInZhbGlkX3ZmLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisJCS8vIGNoYW5nZSBuYW1lICh0ZW1wb3JhcnkpCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0MyIpOworCQl1cGRhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKHVwZGF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9OT0RFX1RFTVBMQVRFLCAiRGVmaW5pdGlvbnMvdG9zY2FfbW9ja192Zi55YW1sIiwgIm5vZGVqcyIsICJ0b3NjYS5ub2Rlcy5XZWJlciIpOworCisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksICJ0ZXN0MyIsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZShnZXRSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCwgInRlc3QzIik7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksICJ0ZXN0MiIsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRSZXNvdXJjZSk7CisKKwkJLy8gYmFjayBvcmlnaW5hbCBzY2FyCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgInZhbGlkX3ZmX2EuY3NhciIsICJ2YWxpZF92Zi5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCS8vIGJhY2sgb3JpZ2luYWwgc2NhcgorCQljb3B5UmVzID0gY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlRFU1QwMSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCWNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gc2NhciB3aXRoIHdyb25nIFJJCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2IuY3NhciIsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCQlyZXNvdXJjZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIkJMQSBCTEEgQkxBIik7CisJCS8vIHdyb25nIFJJICh3aXRoIG5vZGUgdHlwZXMpIHJlc291cmNlIHNob3VsZG4ndCBiZSBjcmVhdGVkCisJCXVwZGF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKHVwZGF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9OT0RFX1RFTVBMQVRFLCAiRGVmaW5pdGlvbnMvVkZfUkkyX0cxLnlhbWwiLCAicHMwNF9wb3J0XzAiLCAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5ub2Rlcy5oZWF0Lm5ldHdvcmsubmV1dHJvbi5Qb3J0dXIiKTsKKwkJLy8gYmFjayBvcmlnaW5hbCBzY2FyCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2EuY3NhciIsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVVwZGF0ZUltcG9ydFJlc291cmNlRnJvbUNzYXJXaXRoQXJ0aWZhY3RzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXN0UmVzcG9uc2UgY29weVJlcyA9IG51bGw7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBudWxsOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2UgPSBudWxsOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBudWxsOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlID0gbnVsbDsKKworCQkvLyBiYWNrIG9yaWdpbmFsIHNjYXIKKwkJY29weVJlcyA9IGNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYS5jc2FyIiwgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJURVNUMDEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVmVyc2lvbigiMSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJLy8gY3JlYXRlIG5ldyByZXNvdXJjZSBmcm9tIENzYXIKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJTGlzdDxTdHJpbmc+IHJlcXVpcmVkQXJ0aWZhY3RzT2xkID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmdldCgiaGVhdDUiKS5nZXRSZXF1aXJlZEFydGlmYWN0cygpOworCQlhc3NlcnRUcnVlKHJlcXVpcmVkQXJ0aWZhY3RzT2xkICE9IG51bGwgJiYgIXJlcXVpcmVkQXJ0aWZhY3RzT2xkLmlzRW1wdHkoKSAmJiByZXF1aXJlZEFydGlmYWN0c09sZC5zaXplKCkgPT0gMyk7CisJCWFzc2VydFRydWUocmVxdWlyZWRBcnRpZmFjdHNPbGQuY29udGFpbnMoImhvdC1uaW1idXMtcGNtLXZvbHVtZXNfdjEuMC55YW1sIikpOworCQlhc3NlcnRUcnVlKHJlcXVpcmVkQXJ0aWZhY3RzT2xkLmNvbnRhaW5zKCJuZXN0ZWQtcGNtX3YxLjAueWFtbCIpKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlZEFydGlmYWN0c09sZC5jb250YWlucygiaG90LW5pbWJ1cy1vYW0tdm9sdW1lc192MS4wLnlhbWwiKSk7CisKKwkJLy8gdXBkYXRlIHNjYXIgd2l0aCBuZXcgYXJ0aWZhY3RzCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX3VwZGF0ZWQuY3NhciIsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCQlyZXNvdXJjZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIkJMQSBCTEEgQkxBIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVmVyc2lvbigiMiIpOworCQl1cGRhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQlMaXN0PFN0cmluZz4gcmVxdWlyZWRBcnRpZmFjdHNOZXcgPSByZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkuZ2V0KCJoZWF0NSIpLmdldFJlcXVpcmVkQXJ0aWZhY3RzKCk7CisJCWFzc2VydFRydWUocmVxdWlyZWRBcnRpZmFjdHNOZXcgIT0gbnVsbCAmJiAhcmVxdWlyZWRBcnRpZmFjdHNOZXcuaXNFbXB0eSgpICYmIHJlcXVpcmVkQXJ0aWZhY3RzTmV3LnNpemUoKSA9PSAzKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlZEFydGlmYWN0c05ldy5jb250YWlucygiaG90LW5pbWJ1cy1zd2lmdC1jb250YWluZXJfdjEuMC55YW1sIikpOworCQlhc3NlcnRUcnVlKHJlcXVpcmVkQXJ0aWZhY3RzTmV3LmNvbnRhaW5zKCJob3QtbmltYnVzLW9hbS12b2x1bWVzX3YxLjAueWFtbCIpKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlZEFydGlmYWN0c05ldy5jb250YWlucygibmVzdGVkLW9hbV92MS4wLnlhbWwiKSk7CisKKwkJLy8gYmFjayBvcmlnaW5hbCBzY2FyCisJCWNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2EuY3NhciIsICJWRl9SSTJfRzRfd2l0aEFydGlmYWN0cy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVVwZGF0ZUltcG9ydFdpdGhQcm9wZXJ0aWVzRnJvbUNzYXJVSVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJU3RyaW5nIHBheWxvYWROYW1lID0gInZhbGlkX3ZmLmNzYXIiOworCQlJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQlTdHJpbmcgcm9vdFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisJCVBhdGggcGF0aCA9IG51bGw7CisJCWJ5dGVbXSBkYXRhID0gbnVsbDsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gbnVsbDsKKworCQlwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmYuY3NhciIpOworCQlkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisKKwkJLy8gY3JlYXRlIG5ldyByZXNvdXJjZSBmcm9tIENzYXIKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKHBheWxvYWROYW1lKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWROYW1lKHBheWxvYWROYW1lKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gY2hhbmdlIGNvbXBvc2l0aW9uIChhZGQgbmV3IFJJIHdpdGggc3BlY2lmaWVkIHByb3BlcnR5IHZhbHVlcykKKwkJcGF0aCA9IFBhdGhzLmdldChyb290UGF0aCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZhbGlkX3ZmX2QuY3NhciIpOworCQlkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisJCS8vIGNoYW5nZSBuYW1lCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0MSIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBjaGFuZ2UgY29tcG9zaXRpb24gKGFkZCBuZXcgc3BlY2lmaWVkIHByb3BlcnR5IHZhbHVlcyB0byBleGlzdGluZyBSSSkKKwkJcGF0aCA9IFBhdGhzLmdldChyb290UGF0aCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZhbGlkX3ZmX2YuY3NhciIpOworCQlkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisJCS8vIGNoYW5nZSBuYW1lCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0MiIpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjb3B5Q3NhclJlc3QoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgc291cmNlQ3NhclV1aWQsIFN0cmluZyB0YXJnZXRDc2FyVXVpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNPUFlfQ1NBUl9VU0lOR19TSU1VTEFUT1IsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNvdXJjZUNzYXJVdWlkLCB0YXJnZXRDc2FyVXVpZCk7CisJCVN0cmluZyB1c2VySWQgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisKKwkJUmVzdFJlc3BvbnNlIGNvcHlDc2FyUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsICJkdW1teSIsIGhlYWRlcnNNYXApOworCQlpZiAoY29weUNzYXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSAhPSAyMDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBjb3B5Q3NhclJlc3BvbnNlOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0Q3NhclJlc3QoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgc291cmNlQ3NhclV1aWQpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfQ1NBUl9VU0lOR19TSU1VTEFUT1IsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNvdXJjZUNzYXJVdWlkKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKworCQlSZXN0UmVzcG9uc2UgY29weUNzYXJSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKwkJaWYgKGNvcHlDc2FyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgIT0gMjAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gY29weUNzYXJSZXNwb25zZTsKKworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlRnJvbUNzYXJIYXBweSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY29weVJlcyA9IGNvcHlDc2FyUmVzdChFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCAidmFsaWRfdmZfYS5jc2FyIiwgInZhbGlkX3ZmLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisJCS8vIGNyZWF0ZQorCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgidmFsaWRfdmYiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkQ3NhclVVSUQgPSByZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKTsKKwkJU3RyaW5nIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUgPSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi4iICsgV29yZFV0aWxzLmNhcGl0YWxpemUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRDc2FyVVVJRCwgcmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIGV4cGVjdGVkQ3NhclVVSUQuZXF1YWxzKHJlc291cmNlLmdldENzYXJVVUlEKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsIHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLCBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhyZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydFRydWUoImNzYXJVVUlEIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZENzYXJVVUlELCBnZXRSZXNvdXJjZS5nZXRDc2FyVVVJRCgpKSwgZXhwZWN0ZWRDc2FyVVVJRC5lcXVhbHMoZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSkpOworCQlhc3NlcnRUcnVlKCJ0b3NjYVJlc291cmNlTmFtZSA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZSwgZ2V0UmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSksIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUuZXF1YWxzKGdldFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2UpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGcm9tQ3NhcldpdGhHcm91cHNIYXBweSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJjc2FyV2l0aEdyb3VwcyIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyg1LCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkpOworCisJCWFzc2VydEVxdWFscygidmVyaWZ5IHRoZXJlIGFyZSAyIGdyb3VwcyIsIDIsIHJlc291cmNlLmdldEdyb3VwcygpLnNpemUoKSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjb21wTmFtZVRvVW5pcXVlSWQgPSByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAocCAtPiBwLmdldE5hbWUoKSwgcCAtPiBwLmdldFVuaXF1ZUlkKCkpKTsKKworCQkvLyBWZXJpZnkgMiBtZW1iZXJzIG9uIGdyb3VwMQorCQkvLyBtZW1iZXJzOiBbIGFwcF9zZXJ2ZXIsIG1vbmdvX3NlcnZlciBdCisJCVN0cmluZ1tdIG1lbWJlcnNOYW1lR3JvdXAxID0geyAiYXBwX3NlcnZlciIsICJtb25nb19zZXJ2ZXIiIH07CisJCXZlcmlmeU1lbWJlcnNJblJlc291cmNlKHJlc291cmNlLCBjb21wTmFtZVRvVW5pcXVlSWQsICJncm91cDEiLCBtZW1iZXJzTmFtZUdyb3VwMSk7CisJCS8vIFZlcmlmeSA0IG1lbWJlcnMgb24gZ3JvdXAyCisJCS8vIG1lbWJlcnM6IFsgbW9uZ29fZGIsIG5vZGVqcywgYXBwX3NlcnZlciwgbW9uZ29fc2VydmVyIF0KKwkJU3RyaW5nW10gbWVtYmVyc05hbWVHcm91cDIgPSB7ICJhcHBfc2VydmVyIiwgIm1vbmdvX3NlcnZlciIsICJtb25nb19kYiIsICJub2RlanMiIH07CisJCXZlcmlmeU1lbWJlcnNJblJlc291cmNlKHJlc291cmNlLCBjb21wTmFtZVRvVW5pcXVlSWQsICJncm91cDIiLCBtZW1iZXJzTmFtZUdyb3VwMik7CisKKwkJLy8gQ2hlY2sgT1VUCisJCXJlc291cmNlRGV0YWlscy5zZXRVbmlxdWVJZChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzb3VyY2UgY2hlY2tlZE91dFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQljb21wTmFtZVRvVW5pcXVlSWQgPSBjaGVja2VkT3V0UmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKHAgLT4gcC5nZXROYW1lKCksIHAgLT4gcC5nZXRVbmlxdWVJZCgpKSk7CisKKwkJLy8gVmVyaWZ5IDIgbWVtYmVycyBvbiBncm91cDEKKwkJLy8gbWVtYmVyczogWyBhcHBfc2VydmVyLCBtb25nb19zZXJ2ZXIgXQorCQl2ZXJpZnlNZW1iZXJzSW5SZXNvdXJjZShjaGVja2VkT3V0UmVzb3VyY2UsIGNvbXBOYW1lVG9VbmlxdWVJZCwgImdyb3VwMSIsIG1lbWJlcnNOYW1lR3JvdXAxKTsKKwkJLy8gVmVyaWZ5IDQgbWVtYmVycyBvbiBncm91cDIKKwkJLy8gbWVtYmVyczogWyBtb25nb19kYiwgbm9kZWpzLCBhcHBfc2VydmVyLCBtb25nb19zZXJ2ZXIgXQorCQl2ZXJpZnlNZW1iZXJzSW5SZXNvdXJjZShjaGVja2VkT3V0UmVzb3VyY2UsIGNvbXBOYW1lVG9VbmlxdWVJZCwgImdyb3VwMiIsIG1lbWJlcnNOYW1lR3JvdXAyKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlNZW1iZXJzSW5SZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgTWFwPFN0cmluZywgU3RyaW5nPiBjb21wTmFtZVRvVW5pcXVlSWQsIFN0cmluZyBncm91cE5hbWUsIFN0cmluZ1tdIG1lbWJlcnNOYW1lKSB7CisJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24gPSByZXNvdXJjZS5nZXRHcm91cHMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkuZmluZEZpcnN0KCkuZ2V0KCk7CisJCWFzc2VydEVxdWFscygiVmVyaWZ5IG51bWJlciBvZiBtZW1iZXJzIiwgbWVtYmVyc05hbWUubGVuZ3RoLCBncm91cERlZmluaXRpb24uZ2V0TWVtYmVycygpLnNpemUoKSk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlZE1lbWJlcnMgPSBncm91cERlZmluaXRpb24uZ2V0TWVtYmVycygpOworCQlBcnJheXMuYXNMaXN0KG1lbWJlcnNOYW1lKS5mb3JFYWNoKHAgLT4geworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgbWVtYmVyIG5hbWUgZXhpc3QiLCBjcmVhdGVkTWVtYmVycy5jb250YWluc0tleShwKSk7CisJCX0pOworCisJCXZlcmlmeU1lbWJlcnMoY3JlYXRlZE1lbWJlcnMsIGNvbXBOYW1lVG9VbmlxdWVJZCk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGcm9tQ3NhcldpdGhHcm91cHNBbmRQcm9wZXJ0aWVzSGFwcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgaW1wb3J0TmV3R3JvdXBUeXBlQnlOYW1lID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld0dyb3VwVHlwZUJ5TmFtZSgibXlIZWF0U3RhY2sxIiwgVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGltcG9ydE5ld0dyb3VwVHlwZUJ5TmFtZSk7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImNzYXJXaXRoR3JvdXBzV2l0aFByb3BzIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJpZnkgdGhlcmUgYXJlIDIgZ3JvdXBzIiwgMiwgcmVzb3VyY2UuZ2V0R3JvdXBzKCkuc2l6ZSgpKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXBOYW1lVG9VbmlxdWVJZCA9IHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0TmFtZSgpLCBwIC0+IHAuZ2V0VW5pcXVlSWQoKSkpOworCisJCS8vIFZlcmlmeSAyIG1lbWJlcnMgb24gZ3JvdXAxCisJCS8vIG1lbWJlcnM6IFsgYXBwX3NlcnZlciwgbW9uZ29fc2VydmVyIF0KKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwRGVmaW5pdGlvbjEgPSByZXNvdXJjZS5nZXRHcm91cHMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoImdyb3VwMSIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBudW1iZXIgb2YgbWVtYmVycyIsIDIsIGdyb3VwRGVmaW5pdGlvbjEuZ2V0KDApLmdldE1lbWJlcnMoKS5zaXplKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWF0ZWRNZW1iZXJzID0gZ3JvdXBEZWZpbml0aW9uMS5nZXQoMCkuZ2V0TWVtYmVycygpOworCQl2ZXJpZnlNZW1iZXJzKGNyZWF0ZWRNZW1iZXJzLCBjb21wTmFtZVRvVW5pcXVlSWQpOworCisJCUxpc3Q8R3JvdXBQcm9wZXJ0eT4gcHJvcGVydGllcyA9IGdyb3VwRGVmaW5pdGlvbjEuZ2V0KDApLmdldFByb3BlcnRpZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgbnVtYmVyIG9mIG1lbWJlcnMiLCAyLCBwcm9wZXJ0aWVzLnNpemUoKSk7CisKKwkJR3JvdXBQcm9wZXJ0eSBoZWF0RmlsZXMgPSBwcm9wZXJ0aWVzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0TmFtZSgpLmVxdWFscygiaGVhdF9maWxlcyIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgaGVhdCBmaWxlcyBub3QgZW1wdHkiLCBoZWF0RmlsZXMpOworCQlMaXN0PFN0cmluZz4gaGVhdEZpbGVzVmFsdWUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaGVhdEZpbGVzVmFsdWUuYWRkKCJoZWF0MS55YW1sIik7CisJCWhlYXRGaWxlc1ZhbHVlLmFkZCgiaGVhdDIueWFtbCIpOworCQlTdHJpbmcgaGVhdEZpbGVzSnNvbiA9IGdzb24udG9Kc29uKGhlYXRGaWxlc1ZhbHVlKTsKKwkJbG9nLmRlYnVnKGhlYXRGaWxlcy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBoZWF0IGZpbGVzIHZhbHVlIiwgaGVhdEZpbGVzSnNvbiwgaGVhdEZpbGVzLmdldFZhbHVlKCkpOworCisJCUdyb3VwUHJvcGVydHkgdXJsQ3JlZGVudGlhbCA9IHByb3BlcnRpZXMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKCJ1cmxfY3JlZGVudGlhbCIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgaGVhdCBmaWxlcyBub3QgZW1wdHkiLCB1cmxDcmVkZW50aWFsKTsKKwkJbG9nLmRlYnVnKHVybENyZWRlbnRpYWwuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdXJsIGNyZWRlbnRpYWwiLCAie1wicHJvdG9jb2xcIjpcInByb3RvY29sMVwiLFwia2V5c1wiOntcImtleWFcIjpcInZhbHVlYVwiLFwia2V5YlwiOlwidmFsdWViXCJ9fSIsIHVybENyZWRlbnRpYWwuZ2V0VmFsdWUoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGcm9tQ3NhcldpdGhHcm91cHNBbmRQcm9wZXJ0eUludmFsaWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBpbXBvcnROZXdHcm91cFR5cGVCeU5hbWUgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3R3JvdXBUeXBlQnlOYW1lKCJteUhlYXRTdGFjazEiLCBVc2VyUm9sZUVudW0uQURNSU4pOworCQkvLyBCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoaW1wb3J0TmV3R3JvdXBUeXBlQnlOYW1lKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRCgiY3NhcldpdGhHcm91cHNJbnZhbGlkUHJvcGVydHlWYWx1ZSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShjcmVhdGVSZXNvdXJjZSwgIkNoZWNrIGJhZCByZXF1ZXN0IGVycm9yIiwgZmFsc2UsIDQwMCk7CisKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUZyb21Dc2FyV2l0aEdyb3Vwc0FuZEludmFsaWRQcm9wZXJ0eU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgaW1wb3J0TmV3R3JvdXBUeXBlQnlOYW1lID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld0dyb3VwVHlwZUJ5TmFtZSgibXlIZWF0U3RhY2sxIiwgVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGltcG9ydE5ld0dyb3VwVHlwZUJ5TmFtZSk7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImNzYXJXaXRoR3JvdXBzUHJvcGVydHlOb3RFeGlzdCIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShjcmVhdGVSZXNvdXJjZSwgIkNoZWNrIGJhZCByZXF1ZXN0IGVycm9yIiwgZmFsc2UsIDQwMCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGNyZWF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuR1JPVVBfUFJPUEVSVFlfTk9UX0ZPVU5ELCAidXJsX2NyZWRlbnRpYWwxMTEiLCAiZ3JvdXAxIiwgIm9yZy5vcGVuZWNvbXAuZ3JvdXBzLk15SGVhdFN0YWNrMSIpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGcm9tQ3Nhckdyb3VwVHlwZU5vdEV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImNzYXJXaXRoR3JvdXBzSW52YWxpZEdyb3VwVHlwZSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShjcmVhdGVSZXNvdXJjZSwgIkNoZWNrIGJhZCByZXF1ZXN0IGVycm9yIiwgZmFsc2UsIDQwMCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGNyZWF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuR1JPVVBfVFlQRV9JU19JTlZBTElELCAib3JnLm9wZW5lY29tcC5ncm91cHMuc3RhbUdyb3VwVHlwZSIpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGcm9tQ3Nhck1lbWJlck5vdEV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImNzYXJXaXRoR3JvdXBzSW52YWxpZE1lbWJlciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShjcmVhdGVSZXNvdXJjZSwgIkNoZWNrIGJhZCByZXF1ZXN0IGVycm9yIiwgZmFsc2UsIDQwMCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGNyZWF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuR1JPVVBfSU5WQUxJRF9DT01QT05FTlRfSU5TVEFOQ0UsICJteWNvbXAiLCAibXlncm91cCIsIFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpLCAiVkYiKTsKKworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlRnJvbUNzYXJNZW1iZXJOb3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGltcG9ydE5ld0dyb3VwVHlwZUJ5TmFtZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdHcm91cFR5cGVCeU5hbWUoIm15SGVhdFN0YWNrMiIsIFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoImNzYXJXaXRoR3JvdXBzTm90QWxsb3dlZE1lbWJlciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShjcmVhdGVSZXNvdXJjZSwgIkNoZWNrIGJhZCByZXF1ZXN0IGVycm9yIiwgZmFsc2UsIDQwMCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGNyZWF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuR1JPVVBfSU5WQUxJRF9UT1NDQV9OQU1FX09GX0NPTVBPTkVOVF9JTlNUQU5DRSwgIm5vZGVqcyIsICJncm91cDEiLCAib3JnLm9wZW5lY29tcC5ncm91cHMuTXlIZWF0U3RhY2syIik7CisKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUZyb21Dc2FyVXVpZEhhcHB5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJ0YW0iKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkQ3NhclVVSUQgPSByZXNvdXJjZURldGFpbHMuZ2V0Q3NhclVVSUQoKTsKKwkJU3RyaW5nIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUgPSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi4iICsgV29yZFV0aWxzLmNhcGl0YWxpemUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKworCQlhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRDc2FyVVVJRCwgcmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksIGV4cGVjdGVkQ3NhclVVSUQuZXF1YWxzKHJlc291cmNlLmdldENzYXJVVUlEKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsgYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsIHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLCBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhyZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRMYXRlc3RSZXNvdXJjZUZyb21Dc2FyVXVpZChyZXNvdXJjZS5nZXRDc2FyVVVJRCgpKTsKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydFRydWUoImNzYXJVVUlEIDogIiArIGJ1aWxkQXNzZXJ0TWVzc2FnZShleHBlY3RlZENzYXJVVUlELCBnZXRSZXNvdXJjZS5nZXRDc2FyVVVJRCgpKSwgZXhwZWN0ZWRDc2FyVVVJRC5lcXVhbHMoZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSkpOworCQlhc3NlcnRUcnVlKCJ0b3NjYVJlc291cmNlTmFtZSA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZSwgZ2V0UmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSksIGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUuZXF1YWxzKGdldFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUZyb21Dc2FyUmVzb3VyY2VOb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY3NhclVVSUQgPSAidGFtIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoY3NhclVVSUQpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRMYXRlc3RSZXNvdXJjZUZyb21Dc2FyVXVpZChjc2FyVVVJRCk7CisKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N0YXR1c0NvZGUocmVzUmVzcG9uc2UsICJDaGVjayBiYWQgcmVxdWVzdCBlcnJvciIsIGZhbHNlLCA0MDApOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZShyZXNSZXNwb25zZSwgQWN0aW9uU3RhdHVzLlJFU09VUkNFX0ZST01fQ1NBUl9OT1RfRk9VTkQsIGNzYXJVVUlEKTsKKworCX0KKworCUBUZXN0KGVuYWJsZWQgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlRnJvbU1pc3NpbmdDc2FyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjc2FyVVVJRCA9ICJhYmNkZWZnMTIzNDUiOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChjc2FyVVVJRCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCisJCVJlc3RSZXNwb25zZSByZXNSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldExhdGVzdFJlc291cmNlRnJvbUNzYXJVdWlkKGNzYXJVVUlEKTsKKworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShyZXNSZXNwb25zZSwgIkNoZWNrIGJhZCByZXF1ZXN0IGVycm9yIiwgZmFsc2UsIDQwMCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKHJlc1Jlc3BvbnNlLCBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfRlJPTV9DU0FSX05PVF9GT1VORCwgY3NhclVVSUQpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IHRydWUpCisJcHVibGljIHZvaWQgY3JlYXRlVXBkYXRlQ2VydGlmaWVkSW1wb3J0UmVzb3VyY2VGcm9tQ3NhclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNvcHlSZXMgPSBjb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgInZhbGlkX3ZmX2EuY3NhciIsICJ2YWxpZF92Zi5jc2FyIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNwb25zZSA9IG51bGw7CisJCVN0cmluZyBvbGROYW1lID0gbnVsbDsKKwkJLy8gY3JlYXRlIG5ldyByZXNvdXJjZSBmcm9tIENzYXIKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoInZhbGlkX3ZmLmNzYXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEID0gcmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpOworCisJCS8vIGNoYW5nZSBtZXRhZGF0YQorCQkvLyByZXNvdXJjZSBuYW1lLCBpY29uLCB2ZW5kb3IgbmFtZSwgY2F0ZWdvcnksIHRlbXBsYXRlIGRlcml2ZWRGcm9tCisJCW9sZE5hbWUgPSByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldEljb24oIm5ld2ljb24iKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUoIm5ld25hbWUiKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZShjcmVhdGVSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLlZTUF9BTFJFQURZX0VYSVNUUywgInZhbGlkX3ZmLmNzYXIiLCBvbGROYW1lKTsKKworCQl1cGRhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNwb25zZSk7CisKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlSZXNvdXJjZShyZXNvdXJjZURldGFpbHMpOworCQkvLyBjaGFuZ2UgbWV0YWRhdGEKKwkJLy8gcmVzb3VyY2UgbmFtZSwgaWNvbiwgdmVuZG9yIG5hbWUsIGNhdGVnb3J5LCB0ZW1wbGF0ZSBkZXJpdmVkRnJvbQorCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidGVzdDIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldEljb24oIm5ldyBpY29uMSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSgibmV3IG5hbWUxIik7CisJCXJlc291cmNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiYmxhIGJsYSBibGEiKTsKKwkJdXBkYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzcG9uc2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydEVxdWFscyg1LCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRCwgcmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlLmdldE5hbWUoKSwgInRlc3QxIik7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRJY29uKCksICJuZXdpY29uIik7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRWZW5kb3JOYW1lKCksICJuZXduYW1lIik7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpLCAiYmxhIGJsYSBibGEiKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlLmdldFRhZ3MoKS5jb250YWlucygidGVzdDIiKSwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlSW1wb3J0UklSZWxhdGlvbkJ5Q2FwTmFtZUZyb21Dc2FyVUlUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVN0cmluZyBwYXlsb2FkTmFtZSA9ICJ2bW1jX3JlbGF0ZV9ieV9jYXBfbmFtZS5jc2FyIjsKKwkJSW1wb3J0UmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJU3RyaW5nIHJvb3RQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworCQlQYXRoIHBhdGggPSBudWxsOworCQlieXRlW10gZGF0YSA9IG51bGw7CisJCVN0cmluZyBwYXlsb2FkRGF0YSA9IG51bGw7CisKKwkJcGF0aCA9IFBhdGhzLmdldChyb290UGF0aCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZtbWNfcmVsYXRlX2J5X2NhcF9uYW1lLmNzYXIiKTsKKwkJZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZERhdGEocGF5bG9hZERhdGEpOworCisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkTmFtZShwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIGFzc2VydCBhbGwgcmVsYXRpb25zIGNyZWF0ZWQKKwkJYXNzZXJ0RXF1YWxzKDgwLCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKS5zaXplKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlSW1wb3J0UklSZWxhdGlvbkJ5Q2FwTmFtZUZyb21Dc2FyVUlUZXN0MigpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlTdHJpbmcgcGF5bG9hZE5hbWUgPSAidmZfcmVsYXRlX2J5X2NhcF9uYW1lLmNzYXIiOworCQlJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQlTdHJpbmcgcm9vdFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisJCVBhdGggcGF0aCA9IG51bGw7CisJCWJ5dGVbXSBkYXRhID0gbnVsbDsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gbnVsbDsKKworCQlwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfcmVsYXRlX2J5X2NhcF9uYW1lLmNzYXIiKTsKKwkJZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZERhdGEocGF5bG9hZERhdGEpOworCisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVVVJRChwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkTmFtZShwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIGFzc2VydCByZWxhdGlvbnMgY3JlYXRlZDogMS5ieSBuYW1lOiB2aXJ0dWFsX2xpbmthYmxlLiAyLmJ5IG5hbWU6CisJCS8vIGxpbmsKKwkJTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2U+IG5vZGVzID0gcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKG4gLT4gbi5nZXROYW1lKCksIG4gLT4gbikpOworCQlNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzID0gbm9kZXMuZ2V0KCJlbGluZW5vZGUiKS5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlIikuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGUgLT4gZS5nZXROYW1lKCksIGUgLT4gZSkpOworCQlTdHJpbmcgY3AxVWlkID0gbm9kZXMuZ2V0KCJjcDFub2RlIikuZ2V0VW5pcXVlSWQoKTsKKwkJU3RyaW5nIGNwMlVpZCA9IG5vZGVzLmdldCgiY3Aybm9kZSIpLmdldFVuaXF1ZUlkKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4gbWFwcGVkQnlSZXFPd25lciA9IHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KGUgLT4gZS5nZXRGcm9tTm9kZSgpKSk7CisJCWFzc2VydEVxdWFscyhtYXBwZWRCeVJlcU93bmVyLmdldChjcDFVaWQpLmdldCgwKS5nZXRSZWxhdGlvbnNoaXBzKCkuZ2V0KDApLmdldENhcGFiaWxpdHlVaWQoKSwgY2FwYWJpbGl0aWVzLmdldCgidmlydHVhbF9saW5rYWJsZSIpLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMobWFwcGVkQnlSZXFPd25lci5nZXQoY3AyVWlkKS5nZXQoMCkuZ2V0UmVsYXRpb25zaGlwcygpLmdldCgwKS5nZXRDYXBhYmlsaXR5VWlkKCksIGNhcGFiaWxpdGllcy5nZXQoImxpbmsiKS5nZXRVbmlxdWVJZCgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5TWVtYmVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWF0ZWRNZW1iZXJzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXBOYW1lVG9VbmlxdWVJZCkgeworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBjcmVhdGVkTWVtYmVycy5lbnRyeVNldCgpKSB7CisJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQlTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJU3RyaW5nIGNvbXBhcmVkVmFsdWUgPSBjb21wTmFtZVRvVW5pcXVlSWQuZ2V0KGtleSk7CisKKwkJCWFzc2VydEVxdWFscygiY29tcGFyZSBpbnN0YW5jZSBpZHMiLCBjb21wYXJlZFZhbHVlLCB2YWx1ZSk7CisJCX0KKworCX0KKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJlcGFyZUhlYWRlcnNNYXAoU3RyaW5nIHVzZXJJZCkgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQlpZiAodXNlcklkICE9IG51bGwpIHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgdXNlcklkKTsKKwkJfQorCQlyZXR1cm4gaGVhZGVyc01hcDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2ltcG9ydHMvSW1wb3J0R2VuZXJpY1Jlc291cmNlQ0lUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9pbXBvcnRzL0ltcG9ydEdlbmVyaWNSZXNvdXJjZUNJVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3M2QzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9pbXBvcnRzL0ltcG9ydEdlbmVyaWNSZXNvdXJjZUNJVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTk5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW1zOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNsaWVudFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLk11bHRpcGFydEVudGl0eUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLmNvbnRlbnQuRmlsZUJvZHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLmNvbnRlbnQuU3RyaW5nQm9keTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQ2xvc2VhYmxlSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuSHR0cENsaWVudHM7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuSW1wb3J0VGVzdFR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNwSnNvbktleXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuVE9ETy5JbXBvcnRDYXBhYmlsaXR5VHlwZUNJVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkltcG9ydFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BdWRpdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgSW1wb3J0R2VuZXJpY1Jlc291cmNlQ0lUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbXBvcnRHZW5lcmljUmVzb3VyY2VDSVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OQU1FX01ZX0NPTVBVVEUgPSAidG9zY2Eubm9kZXMuTXlDb21wdXRlIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTkFNRV9VUERBVEVfQ09NUFVURSA9ICJ1c2VyVXBkYXRlQ29tcHV0ZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX05BTUVfTVlfQ09NUFVURSA9ICJteUNvbXB1dGUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9OQU1FX1VTRVJfQ09NUFVURSA9ICJ1c2VyQ29tcHV0ZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRV9VU0VSX0NPTVBVVEUgPSAidG9zY2Eubm9kZXMudXNlckNvbXB1dGUiOworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgSW1wb3J0R2VuZXJpY1Jlc291cmNlQ0lUZXN0KCkgeworCQlzdXBlcihuYW1lLCBJbXBvcnRHZW5lcmljUmVzb3VyY2VDSVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlSW1wb3J0Q2xhc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlJbXBvcnRDYXBhYmlsaXR5VHlwZUNJVGVzdC5pbXBvcnRBbGxDYXBhYmlsaXR5VHlwZXMoKTsKKwkJLy8gcmVtb3ZlQWxsTm9ybWF0aXZlVHlwZVJlc291cmNlcygpOworCQkvLyBpbXBvcnRBbGxOb3JtYXRpdmVUeXBlc1Jlc291cmNlcyhVc2VyUm9sZUVudW0uQURNSU4pOworCX0KKworCXN0YXRpYyBDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisKKwlwdWJsaWMgc3RhdGljIE1hcDxOb3JtYXRpdmVUeXBlc0VudW0sIEJvb2xlYW4+IHJlbW92ZUFsbE5vcm1hdGl2ZVR5cGVSZXNvdXJjZXMoKSB0aHJvd3MgQ2xpZW50UHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJTWFwPE5vcm1hdGl2ZVR5cGVzRW51bSwgQm9vbGVhbj4gbm9ybWF0aXZlRXhpc3RJbkRCID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoTm9ybWF0aXZlVHlwZXNFbnVtIGN1cnJlbnQgOiBOb3JtYXRpdmVUeXBlc0VudW0udmFsdWVzKCkpIHsKKwkJCUJvb2xlYW4gZXhpc3RlZEJlZm9yZURlbGV0ZSA9IEltcG9ydFJlc3RVdGlscy5yZW1vdmVOb3JtYXRpdmVUeXBlUmVzb3VyY2UoY3VycmVudCk7CisJCQlub3JtYXRpdmVFeGlzdEluREIucHV0KGN1cnJlbnQsIGV4aXN0ZWRCZWZvcmVEZWxldGUpOworCQl9CisJCXJldHVybiBub3JtYXRpdmVFeGlzdEluREI7CisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8U3RyaW5nLCBCb29sZWFuPiBnZXROb3JtYXRpdmVUeXBlUmVzb3VyY2UoTm9ybWF0aXZlVHlwZXNFbnVtIGN1cnJlbnQpIHRocm93cyBDbGllbnRQcm90b2NvbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZ2V0UmVzb3VyY2UoY3VycmVudC5nZXROb3JtYXRpdmVOYW1lKCksICIxLjAiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEFsbFRlc3RSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZm9yIChJbXBvcnRUZXN0VHlwZXNFbnVtIGN1cnJSZXNvdXJjZSA6IEltcG9ydFRlc3RUeXBlc0VudW0udmFsdWVzKCkpIHsKKwkJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydFRlc3RSZXNvdXJjZShjdXJyUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5BRE1JTik7CisJCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9ydCBSZXNvdXJjZQorCQkJLy8gIisiPCIrY3VyclJlc291cmNlKyI+IisicmVzcG9uc2U6CisJCQkvLyAiK2ltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJCUltcG9ydFJlc3RVdGlscy52YWxpZGF0ZUltcG9ydFRlc3RUeXBlc1Jlc3AoY3VyclJlc291cmNlLCBpbXBvcnRSZXNwb25zZSk7CisJCQlpZiAoY3VyclJlc291cmNlLmdldHZhbGlkYXRlQXVkaXQoKSA9PSB0cnVlKSB7CisJCQkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJCQlTdHJpbmcgYmFzZVZlcnNpb24gPSAiMS4wIjsKKwkJCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoY3VyclJlc291cmNlLmdldEFjdGlvblN0YXR1cygpLm5hbWUoKSk7CisJCQkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiUmVzb3VyY2VJbXBvcnQiOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VySWQoKSk7CisJCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJOYW1lKCkpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGN1cnJSZXNvdXJjZS5nZXROb3JtYXRpdmVOYW1lKCkpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJSZXNvdXJjZSIpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oYmFzZVZlcnNpb24pOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELnRvU3RyaW5nKCkpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudChudWxsKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQkJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSAoY3VyclJlc291cmNlLmdldEVycm9yUGFyYW1zKCkgIT0gbnVsbCA/IGN1cnJSZXNvdXJjZS5nZXRFcnJvclBhcmFtcygpIDogbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQkJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCQkJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRJbXBvcnQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24pOworCQkJfQorCQl9CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU15Q29tcHV0ZUNhcGFiaWxpdGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgeworCQlhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiY2FwYWJpbGl0aWVzIikpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdGllcyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBtYXAuZ2V0KCJjYXBhYmlsaXRpZXMiKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKSk7CisJCUxpc3Q8T2JqZWN0PiBob3N0Q2FwTGlzdCA9IChMaXN0PE9iamVjdD4pIGNhcGFiaWxpdGllcy5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJYXNzZXJ0RmFsc2UoaG9zdENhcExpc3QuaXNFbXB0eSgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBob3N0Q2FwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGhvc3RDYXBMaXN0LmdldCgwKTsKKwkJdmFsaWRhdGVGaWVsZChob3N0Q2FwLCAidHlwZSIsICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCXZhbGlkYXRlRmllbGQoaG9zdENhcCwgIm5hbWUiLCAiaG9zdCIpOworCQl2YWxpZGF0ZUZpZWxkKGhvc3RDYXAsICJ2YWxpZFNvdXJjZVR5cGVzIiwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiIH0pKTsKKworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllcy5jb250YWluc0tleSgidG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIikpOworCQlMaXN0PE9iamVjdD4gZW5kUG9pbnRDYXBMaXN0ID0gKExpc3Q8T2JqZWN0PikgY2FwYWJpbGl0aWVzLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIik7CisJCWFzc2VydEZhbHNlKGVuZFBvaW50Q2FwTGlzdC5pc0VtcHR5KCkpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVuZFBvaW50Q2FwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVuZFBvaW50Q2FwTGlzdC5nZXQoMCk7CisJCXZhbGlkYXRlRmllbGQoZW5kUG9pbnRDYXAsICJuYW1lIiwgImVuZHBvaW50Iik7CisJCXZhbGlkYXRlRmllbGQoZW5kUG9pbnRDYXAsICJ0eXBlIiwgInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIpOworCisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzLmNvbnRhaW5zS2V5KCJ0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtIikpOworCQlMaXN0PE9iamVjdD4gb3NDYXBMaXN0ID0gKExpc3Q8T2JqZWN0PikgY2FwYWJpbGl0aWVzLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbSIpOworCQlhc3NlcnRGYWxzZShvc0NhcExpc3QuaXNFbXB0eSgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBvc0NhcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBvc0NhcExpc3QuZ2V0KDApOworCQl2YWxpZGF0ZUZpZWxkKG9zQ2FwLCAibmFtZSIsICJvcyIpOworCQl2YWxpZGF0ZUZpZWxkKG9zQ2FwLCAidHlwZSIsICJ0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtIik7CisKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoInRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSIpKTsKKwkJTGlzdDxPYmplY3Q+IHNjYWxhYmxlQ2FwTGlzdCA9IChMaXN0PE9iamVjdD4pIGNhcGFiaWxpdGllcy5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSIpOworCQlhc3NlcnRGYWxzZShzY2FsYWJsZUNhcExpc3QuaXNFbXB0eSgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBzY2FsYWJsZUNhcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBzY2FsYWJsZUNhcExpc3QuZ2V0KDApOworCQl2YWxpZGF0ZUZpZWxkKHNjYWxhYmxlQ2FwLCAibmFtZSIsICJzY2FsYWJsZSIpOworCQl2YWxpZGF0ZUZpZWxkKHNjYWxhYmxlQ2FwLCAidHlwZSIsICJ0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUiKTsKKworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllcy5jb250YWluc0tleSgidG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUiKSk7CisJCUxpc3Q8T2JqZWN0PiBiaW5kaW5nQ2FwTGlzdCA9IChMaXN0PE9iamVjdD4pIGNhcGFiaWxpdGllcy5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlIik7CisJCWFzc2VydEZhbHNlKGJpbmRpbmdDYXBMaXN0LmlzRW1wdHkoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gYmluZGluZ0NhcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBiaW5kaW5nQ2FwTGlzdC5nZXQoMCk7CisJCXZhbGlkYXRlRmllbGQoYmluZGluZ0NhcCwgIm5hbWUiLCAiYmluZGluZyIpOworCQl2YWxpZGF0ZUZpZWxkKGJpbmRpbmdDYXAsICJ0eXBlIiwgInRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlIik7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU15Q29tcHV0ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUsIFN0cmluZyByZXNvdXJjZVZlcnNpb24sIFN0cmluZyBleHBlY3RlZFN0YXRlKSB0aHJvd3MgQ2xpZW50UHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gZWl0aGVyTXlDb21wdXRlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VOYW1lLCByZXNvdXJjZVZlcnNpb24pOworCQlhc3NlcnRUcnVlKGVpdGhlck15Q29tcHV0ZS5pc0xlZnQoKSk7CisJCVN0cmluZyB0ZXN0Q29tcHV0ZVltbCA9IGVpdGhlck15Q29tcHV0ZS5sZWZ0KCkudmFsdWUoKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQltYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbmV3IEdzb24oKS5mcm9tSnNvbih0ZXN0Q29tcHV0ZVltbCwgbWFwLmdldENsYXNzKCkpOworCisJCXZhbGlkYXRlTXlDb21wdXRlQmFzaWNGaWVsZHMobWFwLCByZXNvdXJjZU5hbWUsIHJlc291cmNlVmVyc2lvbiwgZXhwZWN0ZWRTdGF0ZSk7CisKKwkJdmFsaWRhdGVNeUNvbXB1dGVDYXBhYmlsaXRpZXMobWFwKTsKKworCQl2YWxpZGF0ZU15Q29tcHV0ZVJlcXVpcmVtZW50cyhtYXApOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5SRVNPVVJDRV9WRVJTSU9OLmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZVZlcnNpb24pOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNeUNvbXB1dGVSZXNvdXJjZShTdHJpbmcgdWlkLCBTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLCBTdHJpbmcgZXhwZWN0ZWRTdGF0ZSkgdGhyb3dzIENsaWVudFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UodWlkKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc291cmNlUmVzcG9uc2UpOworCQlTdHJpbmcgdGVzdENvbXB1dGVZbWwgPSByZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisKKwkJLy8gRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gZWl0aGVyTXlDb21wdXRlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VOYW1lLAorCQkvLyByZXNvdXJjZVZlcnNpb24pOworCQkvLyBhc3NlcnRUcnVlKCBlaXRoZXJNeUNvbXB1dGUuaXNMZWZ0KCkgKTsKKwkJLy8gU3RyaW5nIHRlc3RDb21wdXRlWW1sID0gZWl0aGVyTXlDb21wdXRlLmxlZnQoKS52YWx1ZSgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCW1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBuZXcgR3NvbigpLmZyb21Kc29uKHRlc3RDb21wdXRlWW1sLCBtYXAuZ2V0Q2xhc3MoKSk7CisKKwkJdmFsaWRhdGVNeUNvbXB1dGVCYXNpY0ZpZWxkcyhtYXAsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uLCBleHBlY3RlZFN0YXRlKTsKKworCQl2YWxpZGF0ZU15Q29tcHV0ZUNhcGFiaWxpdGllcyhtYXApOworCisJCXZhbGlkYXRlTXlDb21wdXRlUmVxdWlyZW1lbnRzKG1hcCk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlJFU09VUkNFX1ZFUlNJT04uZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlVmVyc2lvbik7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU15Q29tcHV0ZVJlc291cmNlQWZ0ZXJVcGRhdGUoU3RyaW5nIHVpZCwgU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgU3RyaW5nIGV4cGVjdGVkU3RhdGUpIHRocm93cyBDbGllbnRQcm90b2NvbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHVpZCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXNvdXJjZVJlc3BvbnNlKTsKKwkJU3RyaW5nIHRlc3RDb21wdXRlWW1sID0gcmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpOworCisJCS8vIEVpdGhlcjxTdHJpbmcsIEJvb2xlYW4+IGVpdGhlck15Q29tcHV0ZSA9IGdldFJlc291cmNlKHJlc291cmNlTmFtZSwKKwkJLy8gcmVzb3VyY2VWZXJzaW9uKTsKKwkJLy8gYXNzZXJ0VHJ1ZSggZWl0aGVyTXlDb21wdXRlLmlzTGVmdCgpICk7CisKKwkJLy8gU3RyaW5nIHRlc3RDb21wdXRlWW1sID0gZWl0aGVyTXlDb21wdXRlLmxlZnQoKS52YWx1ZSgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCW1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBuZXcgR3NvbigpLmZyb21Kc29uKHRlc3RDb21wdXRlWW1sLCBtYXAuZ2V0Q2xhc3MoKSk7CisKKwkJdmFsaWRhdGVNeUNvbXB1dGVCYXNpY0ZpZWxkcyhtYXAsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uLCBleHBlY3RlZFN0YXRlKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uREVTQ1JJUFRJT04uZ2V0UmVzcEpzb25LZXlOYW1lKCksICJTaG9ydCBkZXNjcmlwdGlvbiIpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5WRU5ET1JfTkFNRS5nZXRSZXNwSnNvbktleU5hbWUoKSwgIlVzZXJWZW5kb3IiKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uVkVORE9SX1JFTEVBU0UuZ2V0UmVzcEpzb25LZXlOYW1lKCksICIxLjEuMiIpOworCisJCS8vIHZhbGlkYXRlTXlDb21wdXRlQ2FwYWJpbGl0aWVzKG1hcCk7CisJCS8vIEFzc2VydEpVbml0LmFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KCJjYXBhYmlsaXRpZXMiKSk7CisJCS8vIE1hcDxTdHJpbmcsIE9iamVjdD4gY2FwYWJpbGl0aWVzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pCisJCS8vIG1hcC5nZXQoImNhcGFiaWxpdGllcyIpOworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGNhcGFiaWxpdGllcy5jb250YWluc0tleSgiaG9zdCIpKTsKKwkJLy8gTWFwPFN0cmluZywgT2JqZWN0PiBob3N0Q2FwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pCisJCS8vIGNhcGFiaWxpdGllcy5nZXQoImhvc3QiKTsKKwkJLy8gdmFsaWRhdGVGaWVsZChob3N0Q2FwLCAidHlwZSIsICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCS8vIHZhbGlkYXRlRmllbGQoaG9zdENhcCwgInZhbGlkU291cmNlVHlwZXMiLCBBcnJheXMuYXNMaXN0KG5ldworCQkvLyBTdHJpbmdbXXsidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQifSkpOworCQkvLworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGNhcGFiaWxpdGllcy5jb250YWluc0tleSgiZW5kcG9pbnQiKSk7CisJCS8vIE1hcDxTdHJpbmcsIE9iamVjdD4gZW5kUG9pbnRDYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikKKwkJLy8gY2FwYWJpbGl0aWVzLmdldCgiZW5kcG9pbnQiKTsKKwkJLy8gdmFsaWRhdGVGaWVsZChlbmRQb2ludENhcCwgInR5cGUiLAorCQkvLyAidG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIik7CisKKwkJYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImNhcGFiaWxpdGllcyIpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXMgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbWFwLmdldCgiY2FwYWJpbGl0aWVzIik7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzLmNvbnRhaW5zS2V5KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIikpOworCQlMaXN0PE9iamVjdD4gaG9zdENhcExpc3QgPSAoTGlzdDxPYmplY3Q+KSBjYXBhYmlsaXRpZXMuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydEZhbHNlKGhvc3RDYXBMaXN0LmlzRW1wdHkoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gaG9zdENhcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBob3N0Q2FwTGlzdC5nZXQoMCk7CisJCXZhbGlkYXRlRmllbGQoaG9zdENhcCwgInR5cGUiLCAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQl2YWxpZGF0ZUZpZWxkKGhvc3RDYXAsICJuYW1lIiwgImhvc3QiKTsKKwkJdmFsaWRhdGVGaWVsZChob3N0Q2FwLCAidmFsaWRTb3VyY2VUeXBlcyIsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IiB9KSk7CisKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIpKTsKKwkJTGlzdDxPYmplY3Q+IGVuZFBvaW50Q2FwTGlzdCA9IChMaXN0PE9iamVjdD4pIGNhcGFiaWxpdGllcy5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIpOworCQlhc3NlcnRGYWxzZShlbmRQb2ludENhcExpc3QuaXNFbXB0eSgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBlbmRQb2ludENhcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBlbmRQb2ludENhcExpc3QuZ2V0KDApOworCQl2YWxpZGF0ZUZpZWxkKGVuZFBvaW50Q2FwLCAibmFtZSIsICJlbmRwb2ludCIpOworCQl2YWxpZGF0ZUZpZWxkKGVuZFBvaW50Q2FwLCAidHlwZSIsICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4iKTsKKworCQl2YWxpZGF0ZU15Q29tcHV0ZVJlcXVpcmVtZW50cyhtYXApOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5SRVNPVVJDRV9WRVJTSU9OLmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZVZlcnNpb24pOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNeUNvbXB1dGVSZXF1aXJlbWVudHMoTWFwPFN0cmluZywgT2JqZWN0PiBtYXApIHsKKwkJYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoInJlcXVpcmVtZW50cyIpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHMgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbWFwLmdldCgicmVxdWlyZW1lbnRzIik7CisKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlbWVudHMuY29udGFpbnNLZXkoInRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50IikpOworCQlMaXN0PE9iamVjdD4gbG9jYWxTdG9yYWdlUmVxTGlzdCA9IChMaXN0PE9iamVjdD4pIHJlcXVpcmVtZW50cy5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50Iik7CisJCWFzc2VydEZhbHNlKGxvY2FsU3RvcmFnZVJlcUxpc3QuaXNFbXB0eSgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBsb2NhbFN0b3JhZ2VSZXEgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbG9jYWxTdG9yYWdlUmVxTGlzdC5nZXQoMCk7CisJCXZhbGlkYXRlRmllbGQobG9jYWxTdG9yYWdlUmVxLCAiY2FwYWJpbGl0eSIsICJ0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudCIpOworCQl2YWxpZGF0ZUZpZWxkKGxvY2FsU3RvcmFnZVJlcSwgIm5vZGUiLCAidG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlIik7CisJCXZhbGlkYXRlRmllbGQobG9jYWxTdG9yYWdlUmVxLCAicmVsYXRpb25zaGlwIiwgInRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbyIpOworCQl2YWxpZGF0ZUZpZWxkKGxvY2FsU3RvcmFnZVJlcSwgIm5hbWUiLCAibG9jYWxfc3RvcmFnZSIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTXlDb21wdXRlQmFzaWNGaWVsZHMoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAsIFN0cmluZyByZXNvdXJjZU5hbWUsIFN0cmluZyByZXNvdXJjZVZlcnNpb24sIFN0cmluZyBleHBlY3RlZFN0YXRlKSB7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLklTX0FCU1RSQUNULmdldFJlc3BKc29uS2V5TmFtZSgpLCBmYWxzZSk7CisJCS8vIHZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkNBVEVHT1JJRVMuZ2V0UmVzcEpzb25LZXlOYW1lKCksCisJCS8vIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCS8vIHZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlVOSVFVRV9JRC5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJLy8gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVzb3VyY2VVbmlxdWVJZChyZXNvdXJjZU5hbWUsCisJCS8vIHJlc291cmNlVmVyc2lvbikpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5SRVNPVVJDRV9OQU1FLmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZU5hbWUpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5UQUdTLmdldFJlc3BKc29uS2V5TmFtZSgpLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IHJlc291cmNlTmFtZSB9KSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkxJRkVfQ1lDTEVfU1RBVEUuZ2V0UmVzcEpzb25LZXlOYW1lKCksIGV4cGVjdGVkU3RhdGUpOworCisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkRFUklWRURfRlJPTS5nZXRSZXNwSnNvbktleU5hbWUoKSwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAidG9zY2Eubm9kZXMuUm9vdCIgfSkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB2YWxpZGF0ZUZpZWxkKE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwLCBTdHJpbmcganNvbkZpZWxkLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgeworCQlpZiAoZXhwZWN0ZWRWYWx1ZSA9PSBudWxsKSB7CisJCQlhc3NlcnRUcnVlKCFtYXAuY29udGFpbnNLZXkoanNvbkZpZWxkKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRUcnVlKCJtYXAgZG9lcyBub3QgY29udGFpbiBmaWVsZCAiICsganNvbkZpZWxkLCBtYXAuY29udGFpbnNLZXkoanNvbkZpZWxkKSk7CisJCQlPYmplY3QgZm91bmRWYWx1ZSA9IG1hcC5nZXQoanNvbkZpZWxkKTsKKwkJCWNvbXBhcmVFbGVtZW50cyhleHBlY3RlZFZhbHVlLCBmb3VuZFZhbHVlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjb21wYXJlRWxlbWVudHMoT2JqZWN0IGV4cGVjdGVkVmFsdWUsIE9iamVjdCBmb3VuZFZhbHVlKSB7CisJCWlmIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlhc3NlcnRUcnVlKGZvdW5kVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpOworCQkJYXNzZXJ0VHJ1ZShmb3VuZFZhbHVlLmVxdWFscyhleHBlY3RlZFZhbHVlKSk7CisJCX0KKworCQllbHNlIGlmIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgeworCQkJYXNzZXJ0VHJ1ZShmb3VuZFZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbik7CisJCQlhc3NlcnRUcnVlKGZvdW5kVmFsdWUgPT0gZXhwZWN0ZWRWYWx1ZSk7CisJCX0gZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworCQkJYXNzZXJ0VHJ1ZShmb3VuZFZhbHVlIGluc3RhbmNlb2YgTWFwKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gZm91bmRNYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZm91bmRWYWx1ZTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gZXhjcGVjdGVkTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGV4cGVjdGVkVmFsdWU7CisJCQlhc3NlcnRUcnVlKGZvdW5kTWFwLnNpemUoKSA9PSBleGNwZWN0ZWRNYXAuc2l6ZSgpKTsKKwkJCUl0ZXJhdG9yPFN0cmluZz4gZm91bmRrZXlJdHIgPSBmb3VuZE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGZvdW5ka2V5SXRyLmhhc05leHQoKSkgeworCQkJCVN0cmluZyBmb3VuZEtleSA9IGZvdW5ka2V5SXRyLm5leHQoKTsKKwkJCQlhc3NlcnRUcnVlKGV4Y3BlY3RlZE1hcC5jb250YWluc0tleShmb3VuZEtleSkpOworCQkJCWNvbXBhcmVFbGVtZW50cyhleGNwZWN0ZWRNYXAuZ2V0KGZvdW5kS2V5KSwgZm91bmRNYXAuZ2V0KGZvdW5kS2V5KSk7CisJCQl9CisKKwkJfSBlbHNlIGlmIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgTGlzdCkgeworCQkJYXNzZXJ0VHJ1ZShmb3VuZFZhbHVlIGluc3RhbmNlb2YgTGlzdCk7CisJCQlMaXN0PE9iamVjdD4gZm91bmRMaXN0ID0gKExpc3Q8T2JqZWN0PikgZm91bmRWYWx1ZTsKKwkJCUxpc3Q8T2JqZWN0PiBleGNwZWN0ZWRMaXN0ID0gKExpc3Q8T2JqZWN0PikgZXhwZWN0ZWRWYWx1ZTsKKwkJCWFzc2VydFRydWUoZm91bmRMaXN0LnNpemUoKSA9PSBleGNwZWN0ZWRMaXN0LnNpemUoKSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvdW5kTGlzdC5zaXplKCk7IGkrKykgeworCQkJCWNvbXBhcmVFbGVtZW50cyhleGNwZWN0ZWRMaXN0LmdldChpKSwgZm91bmRMaXN0LmdldChpKSk7CisJCQl9CisKKwkJfSBlbHNlIGlmIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgQ2F0ZWdvcnlEZWZpbml0aW9uKSB7CisJCQlhc3NlcnRUcnVlKGZvdW5kVmFsdWUgaW5zdGFuY2VvZiBNYXApOworCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGV4cENhdCA9IChDYXRlZ29yeURlZmluaXRpb24pIGV4cGVjdGVkVmFsdWU7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFjdENhdCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBmb3VuZFZhbHVlOworCQkJYXNzZXJ0RXF1YWxzKGV4cENhdC5nZXROYW1lKCksIGFjdENhdC5nZXQoIm5hbWUiKSk7CisKKwkJCS8vIGFzc2VydEVxdWFscyhleHBDYXQuZ2V0U3ViY2F0ZWdvcmllcygpLmdldCgwKS5nZXROYW1lKCksCisJCQkvLyBhY3RDYXQuZ2V0KCJzdWJjYXRlZ29yaWVzIikuZ2V0TmFtZSgpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydFRydWUoZm91bmRWYWx1ZS5lcXVhbHMoZXhwZWN0ZWRWYWx1ZSkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJlc3RvcmVUb09yaWdpbmFsU3RhdGUoTWFwPE5vcm1hdGl2ZVR5cGVzRW51bSwgQm9vbGVhbj4gb3JpZ2luYWxTdGF0ZSwgVXNlclJvbGVFbnVtIHVzZXJSb2xlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZW1vdmVBbGxOb3JtYXRpdmVUeXBlUmVzb3VyY2VzKCk7CisKKwkJSXRlcmF0b3I8RW50cnk8Tm9ybWF0aXZlVHlwZXNFbnVtLCBCb29sZWFuPj4gaXRlcmF0b3IgPSBvcmlnaW5hbFN0YXRlLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJRW50cnk8Tm9ybWF0aXZlVHlwZXNFbnVtLCBCb29sZWFuPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCUJvb2xlYW4gaXNFeGlzdEJlZm9yZURlbGV0ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQlpZiAoaXNFeGlzdEJlZm9yZURlbGV0ZSkgeworCQkJCWltcG9ydE5vcm1hdGl2ZVJlc291cmNlKGVudHJ5LmdldEtleSgpLCB1c2VyUm9sZSk7CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbXBvcnRBbGxOb3JtYXRpdmVUeXBlc1Jlc291cmNlcyhVc2VyUm9sZUVudW0gdXNlclJvbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoTm9ybWF0aXZlVHlwZXNFbnVtIGN1cnJSZXNvdXJjZSA6IE5vcm1hdGl2ZVR5cGVzRW51bS52YWx1ZXMoKSkgeworCQkJRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShjdXJyUmVzb3VyY2UuZ2V0Tm9ybWF0aXZlTmFtZSgpLCAiMS4wIik7CisJCQlpZiAocmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJaW1wb3J0Tm9ybWF0aXZlUmVzb3VyY2UoY3VyclJlc291cmNlLCB1c2VyUm9sZSk7CisJCQl9CisJCX0KKworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBpbXBvcnROb3JtYXRpdmVSZXNvdXJjZShOb3JtYXRpdmVUeXBlc0VudW0gcmVzb3VyY2UsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGltcG9ydFJlc291cmNlKHJlc291cmNlLmdldEZvbGRlck5hbWUoKSwgdXNlclJvbGUsIHRydWUpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBpbXBvcnRSZXNvdXJjZShTdHJpbmcgZm9sZGVyTmFtZSwgVXNlclJvbGVFbnVtIHVzZXJSb2xlLCBib29sZWFuIGlzTm9ybWF0aXZlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCU11bHRpcGFydEVudGl0eUJ1aWxkZXIgbXBCdWlsZGVyID0gTXVsdGlwYXJ0RW50aXR5QnVpbGRlci5jcmVhdGUoKTsKKworCQltcEJ1aWxkZXIuYWRkUGFydCgicmVzb3VyY2VaaXAiLCBuZXcgRmlsZUJvZHkoZ2V0WmlwRmlsZShmb2xkZXJOYW1lKSkpOworCQltcEJ1aWxkZXIuYWRkUGFydCgicmVzb3VyY2VNZXRhZGF0YSIsIG5ldyBTdHJpbmdCb2R5KGdldEpzb25TdHJpbmdPZkZpbGUoZm9sZGVyTmFtZSwgZm9sZGVyTmFtZSArICIuanNvbiIpLCBDb250ZW50VHlwZS5BUFBMSUNBVElPTl9KU09OKSk7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5JTVBPUlRfUkVTT1VSQ0VfTk9STUFUSVZFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJaWYgKCFpc05vcm1hdGl2ZSkgeworCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLklNUE9SVF9VU0VSX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJfQorCisJCUNsb3NlYWJsZUh0dHBDbGllbnQgY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCQl0cnkgeworCQkJSHR0cFBvc3QgaHR0cFBvc3QgPSBuZXcgSHR0cFBvc3QodXJsKTsKKwkJCWh0dHBQb3N0LmFkZEhlYWRlcigiVVNFUl9JRCIsIHVzZXJSb2xlLmdldFVzZXJJZCgpKTsKKwkJCWh0dHBQb3N0LnNldEVudGl0eShtcEJ1aWxkZXIuYnVpbGQoKSk7CisJCQlyZXNwb25zZSA9IGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCXJldHVybiByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQl9IGZpbmFsbHkgeworCQkJY2xvc2VSZXNwb25zZShyZXNwb25zZSk7CisJCQljbG9zZUh0dHBDbGllbnQoY2xpZW50KTsKKworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlSHR0cENsaWVudChDbG9zZWFibGVIdHRwQ2xpZW50IGNsaWVudCkgeworCQl0cnkgeworCQkJaWYgKGNsaWVudCAhPSBudWxsKSB7CisJCQkJY2xpZW50LmNsb3NlKCk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNsb3NlIGNsaWVudCBvciByZXNwb25zZTogIiwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VSZXNwb25zZShDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkJdHJ5IHsKKwkJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7CisJCQkJcmVzcG9uc2UuY2xvc2UoKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY2xvc2UgY2xpZW50IG9yIHJlc3BvbnNlOiAiLCBlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEpzb25TdHJpbmdPZkZpbGUoU3RyaW5nIGZvbGRlck5hbWUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHNvdXJjZURpciA9IGNvbmZpZy5nZXRJbXBvcnRSZXNvdXJjZUNvbmZpZ0RpcigpOworCQlzb3VyY2VEaXIgKz0gRmlsZS5zZXBhcmF0b3IgKyAibm9ybWF0aXZlLXR5cGVzIjsKKworCQlqYXZhLm5pby5maWxlLlBhdGggZmlsZVBhdGggPSBGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkuZ2V0UGF0aChzb3VyY2VEaXIgKyBGaWxlLnNlcGFyYXRvciArIGZvbGRlck5hbWUsIGZpbGVOYW1lKTsKKwkJYnl0ZVtdIGZpbGVDb250ZW50ID0gRmlsZXMucmVhZEFsbEJ5dGVzKGZpbGVQYXRoKTsKKwkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGZpbGVDb250ZW50KTsKKwkJcmV0dXJuIGNvbnRlbnQ7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBGaWxlIGdldFppcEZpbGUoU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlQ29uZmlnRGlyKCk7CisJCXNvdXJjZURpciArPSBGaWxlLnNlcGFyYXRvciArICJub3JtYXRpdmUtdHlwZXMiOworCisJCWphdmEubmlvLmZpbGUuUGF0aCBmaWxlUGF0aCA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRQYXRoKHNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgZWxlbWVudE5hbWUsICJub3JtYXRpdmUtdHlwZXMtbmV3LSIgKyBlbGVtZW50TmFtZSArICIuemlwIik7CisJCXJldHVybiBmaWxlUGF0aC50b0ZpbGUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUZXN0SnNvblN0cmluZ09mRmlsZShTdHJpbmcgZm9sZGVyTmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXIoKTsKKwkJamF2YS5uaW8uZmlsZS5QYXRoIGZpbGVQYXRoID0gRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLmdldFBhdGgoc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXJOYW1lLCBmaWxlTmFtZSk7CisJCWJ5dGVbXSBmaWxlQ29udGVudCA9IEZpbGVzLnJlYWRBbGxCeXRlcyhmaWxlUGF0aCk7CisJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhmaWxlQ29udGVudCk7CisJCXJldHVybiBjb250ZW50OworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgRmlsZSBnZXRUZXN0WmlwRmlsZShTdHJpbmcgZWxlbWVudE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBzb3VyY2VEaXIgPSBjb25maWcuZ2V0SW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0RpcigpOworCisJCWphdmEubmlvLmZpbGUuUGF0aCBmaWxlUGF0aCA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRQYXRoKHNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgZWxlbWVudE5hbWUsICJub3JtYXRpdmUtdHlwZXMtbmV3LSIgKyBlbGVtZW50TmFtZSArICIuemlwIik7CisJCXJldHVybiBmaWxlUGF0aC50b0ZpbGUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIEVpdGhlcjxTdHJpbmcsIEJvb2xlYW4+IGdldFJlc291cmNlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKFVzZXJSb2xlRW51bS5ERVNJR05FUi5nZXRVc2VySWQoKSwgbmFtZSwgdmVyc2lvbik7CisJCWlmIChyZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSBJbXBvcnRSZXN0VXRpbHMuU1RBVFVTX0NPREVfR0VUX1NVQ0NFU1MpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJCS8vIHJldHVybiBFaXRoZXIucmlnaHQodHJ1ZSk7CisKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRXaXRoUmVxdWlybWVudHNBbmRDYXBhYmlsaXRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX05BTUVfTVlfQ09NUFVURTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5vcm1hdGl2ZVJlc291cmNlQnlOYW1lKFJFU09VUkNFX05BTUVfTVlfQ09NUFVURSwgVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJSW50ZWdlciBzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoc3RhdHVzQ29kZSA9PSBJbXBvcnRSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU1QT1JUX1NVQ0NFU1MpOworCQlTdHJpbmcgdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzcG9uc2UpOworCQl2YWxpZGF0ZU15Q29tcHV0ZVJlc291cmNlKHVpZCwgZmlsZU5hbWUsICIxLjAiLCAiQ0VSVElGSUVEIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V2l0aFVwZGF0ZU5vcm1hdGl2ZVR5cGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX05BTUVfTVlfQ09NUFVURTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5vcm1hdGl2ZVJlc291cmNlQnlOYW1lKFJFU09VUkNFX05BTUVfTVlfQ09NUFVURSwgVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJSW50ZWdlciBzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoc3RhdHVzQ29kZSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lNUE9SVF9TVUNDRVNTKTsKKwkJU3RyaW5nIHVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJdmFsaWRhdGVNeUNvbXB1dGVSZXNvdXJjZSh1aWQsIGZpbGVOYW1lLCAiMS4wIiwgIkNFUlRJRklFRCIpOworCisJCS8vIHVwZGF0ZQorCQlyZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROb3JtYXRpdmVSZXNvdXJjZUJ5TmFtZShSRVNPVVJDRV9OQU1FX01ZX0NPTVBVVEUsIFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJYXNzZXJ0VHJ1ZShzdGF0dXNDb2RlID09IEltcG9ydFJlc3RVdGlscy5TVEFUVVNfQ09ERV9VUERBVEVfU1VDQ0VTUyk7CisJCXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJdmFsaWRhdGVNeUNvbXB1dGVSZXNvdXJjZSh1aWQsIGZpbGVOYW1lLCAiMi4wIiwgIkNFUlRJRklFRCIpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V2l0aEludmFsaWREZWZhdWx0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoInBvcnRJbnZhbGlkRGVmYXVsdFZhbHVlIiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRVc2VyUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX05BTUVfVVNFUl9DT01QVVRFOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoUkVTT1VSQ0VfTkFNRV9VU0VSX0NPTVBVVEUsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUludGVnZXIgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQlhc3NlcnRUcnVlKHN0YXR1c0NvZGUgPT0gSW1wb3J0UmVzdFV0aWxzLlNUQVRVU19DT0RFX0lNUE9SVF9TVUNDRVNTKTsKKwkJU3RyaW5nIHVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJdmFsaWRhdGVNeUNvbXB1dGVSZXNvdXJjZSh1aWQsIGZpbGVOYW1lLCAiMC4xIiwgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEltcG9ydEFuZFVwZGF0ZVVzZXJSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9IEZJTEVfTkFNRV9VU0VSX0NPTVBVVEU7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZShSRVNPVVJDRV9OQU1FX1VTRVJfQ09NUFVURSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJSW50ZWdlciBzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoc3RhdHVzQ29kZSA9PSBJbXBvcnRSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU1QT1JUX1NVQ0NFU1MpOworCQlTdHJpbmcgdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzcG9uc2UpOworCQl2YWxpZGF0ZU15Q29tcHV0ZVJlc291cmNlKHVpZCwgZmlsZU5hbWUsICIwLjEiLCAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIpOworCQlyZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZShSRVNPVVJDRV9OQU1FX1VQREFURV9DT01QVVRFLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoc3RhdHVzQ29kZSA9PSBJbXBvcnRSZXN0VXRpbHMuU1RBVFVTX0NPREVfVVBEQVRFX1NVQ0NFU1MpOworCQl1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShyZXNwb25zZSk7CisJCXZhbGlkYXRlTXlDb21wdXRlUmVzb3VyY2VBZnRlclVwZGF0ZSh1aWQsIGZpbGVOYW1lLCAiMC4xIiwgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEltcG9ydEFuZFVwZGF0ZUNoYW5nZXNVc2VyUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX05BTUVfVVNFUl9DT01QVVRFOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoUkVTT1VSQ0VfTkFNRV9VU0VSX0NPTVBVVEUsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUludGVnZXIgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQlhc3NlcnRUcnVlKHN0YXR1c0NvZGUgPT0gSW1wb3J0UmVzdFV0aWxzLlNUQVRVU19DT0RFX0lNUE9SVF9TVUNDRVNTKTsKKwkJU3RyaW5nIHVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJdmFsaWRhdGVNeUNvbXB1dGVSZXNvdXJjZSh1aWQsIGZpbGVOYW1lLCAiMC4xIiwgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKwkJLy8gRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShmaWxlTmFtZSwgIjAuMSIpOworCQkvLyBhc3NlcnRUcnVlKHJlc291cmNlLmlzTGVmdCgpKTsKKworCQlyZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZShSRVNPVVJDRV9OQU1FX1VQREFURV9DT01QVVRFLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoc3RhdHVzQ29kZSA9PSBJbXBvcnRSZXN0VXRpbHMuU1RBVFVTX0NPREVfVVBEQVRFX1NVQ0NFU1MpOworCQl2YWxpZGF0ZU15Q29tcHV0ZVJlc291cmNlQWZ0ZXJVcGRhdGUodWlkLCBmaWxlTmFtZSwgIjAuMSIsICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRDaGVja291dEFuZFVwZGF0ZVVzZXJSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9IEZJTEVfTkFNRV9VU0VSX0NPTVBVVEU7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROb3JtYXRpdmVSZXNvdXJjZUJ5TmFtZShSRVNPVVJDRV9OQU1FX1VTRVJfQ09NUFVURSwgVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJSW50ZWdlciBzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoc3RhdHVzQ29kZSA9PSBJbXBvcnRSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU1QT1JUX1NVQ0NFU1MpOworCQlTdHJpbmcgdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzcG9uc2UpOworCQl2YWxpZGF0ZU15Q29tcHV0ZVJlc291cmNlKHVpZCwgZmlsZU5hbWUsICIxLjAiLCAiQ0VSVElGSUVEIik7CisKKwkJcmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoUkVTT1VSQ0VfTkFNRV9VU0VSX0NPTVBVVEUsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCXN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIEltcG9ydFJlc3RVdGlscy5TVEFUVVNfQ09ERV9VUERBVEVfU1VDQ0VTUywgc3RhdHVzQ29kZS5pbnRWYWx1ZSgpKTsKKwkJdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzcG9uc2UpOworCQl2YWxpZGF0ZU15Q29tcHV0ZVJlc291cmNlKHVpZCwgZmlsZU5hbWUsICIxLjEiLCAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROb3JtYXRpdmVUeXBlc1Rlc3RlclVzZXJSb2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUludGVnZXIgc3RhdHVzQ29kZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROb3JtYXRpdmVSZXNvdXJjZUJ5TmFtZShSRVNPVVJDRV9OQU1FX01ZX0NPTVBVVEUsIFVzZXJSb2xlRW51bS5URVNURVIpLmdldEVycm9yQ29kZSgpOworCQlhc3NlcnRUcnVlKHN0YXR1c0NvZGUgPT0gSW1wb3J0UmVzdFV0aWxzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydE5vcm1hdGl2ZVR5cGVzRGVzaWduZXJVc2VyUm9sZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJbnRlZ2VyIHN0YXR1c0NvZGUgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0Tm9ybWF0aXZlUmVzb3VyY2VCeU5hbWUoUkVTT1VSQ0VfTkFNRV9NWV9DT01QVVRFLCBVc2VyUm9sZUVudW0uREVTSUdORVIpLmdldEVycm9yQ29kZSgpOworCQlhc3NlcnRUcnVlKHN0YXR1c0NvZGUgPT0gNDA5KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2ltcG9ydHMvSW1wb3J0TmV3UmVzb3VyY2VDSVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2ltcG9ydHMvSW1wb3J0TmV3UmVzb3VyY2VDSVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzMzNWZhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9JbXBvcnROZXdSZXNvdXJjZUNJVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0czsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkF0dHJpYnV0ZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlc3BKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkltcG9ydFRlc3RUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkNvbnZlcnRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuSW1wb3J0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5SZXNvdXJjZVZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5HZW5lcmFsVXRpbGl0eTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIEltcG9ydE5ld1Jlc291cmNlQ0lUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJLy8gcHVibGljIHN0YXRpYyBVc2VyVXRpbHMgdXNlclV0aWxzID0gbmV3IFVzZXJVdGlscygpOworCS8vIHB1YmxpYyBSZXNvdXJjZVV0aWxzIHJlc291cmNlVXRpbHMgPSBuZXcgUmVzb3VyY2VVdGlscygpOworCS8vIHB1YmxpYyBBdWRpdFZhbGlkYXRpb25VdGlscyBBdWRpdFZhbGlkYXRpb25VdGlscyA9IG5ldworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzKCk7CisJLy8gcHJvdGVjdGVkIEFydGlmYWN0VXRpbHMgYXJ0aWZhY3RVdGlscyA9IG5ldyBBcnRpZmFjdFV0aWxzKCk7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVmVyc2lvbiA9IG51bGw7CisJcHJvdGVjdGVkIFN0cmluZyBhdWRpdEFjdGlvbiA9IG51bGw7CisJcHVibGljIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IG5ldyBVc2VyKCk7CisJcHJvdGVjdGVkIFN0cmluZyBhcnRpZmFjdE5hbWUxID0gImRhdGFfYXJ0aWZhY3QxLnNoIjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGFydGlmYWN0TmFtZTIgPSAiZGF0YV9hcnRpZmFjdDIuc2giOworCXByb3RlY3RlZCBTdHJpbmcgaW50ZXJmYXplID0gInN0YW5kYXJkIjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGludGVyZmFjZUFydGlmYWN0TmFtZSA9ICJkYXRhX2ludGVyZmFjZTEuc2giOworCisJcHJpdmF0ZSBTdHJpbmcgU1BFQ0lBTF9DSEFSQUNURVJTID0gIn4hI0B+JCVeKigpW107OidcInxcXC8iOworCisJcHVibGljIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKCk7CisKKwlwdWJsaWMgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgSW1wb3J0TmV3UmVzb3VyY2VDSVRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIEltcG9ydE5ld1Jlc291cmNlQ0lUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGluaXQgdXNlcgorCQlzZG5jTW9kaWZpZXJEZXRhaWxzLnNldFVzZXJJZChVc2VyUm9sZUVudW0uQURNSU4uZ2V0VXNlcklkKCkpOworCQkvLyBpbml0IHJlc291cmNlIGRldGFpbHMKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfTDJfM19ST1VURVJTLCAiamgwMDAzIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRBbGxUZXN0UmVzb3VyY2VzX3RvVmFsaWRhdGVOZXdBUEkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlmb3IgKEltcG9ydFRlc3RUeXBlc0VudW0gY3VyclJlc291cmNlIDogSW1wb3J0VGVzdFR5cGVzRW51bS52YWx1ZXMoKSkgeworCQkJLy8gY2xlYW4gYXVkaXQKKwkJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkJLy8gaW1wb3J0IHRlc3RSZXNvdXJjZXMgdHJvdWdoIG5ld1Jlc291cmNlIEFQSQorCQkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld1Jlc291cmNlQnlOYW1lKGN1cnJSZXNvdXJjZS5nZXRGb2xkZXJOYW1lKCksIFVzZXJSb2xlRW51bS5BRE1JTik7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oImltcG9ydCBSZXNvdXJjZSAiICsgIjwiICsgY3VyclJlc291cmNlLmdldEZvbGRlck5hbWUoKSArICI+IiArICJyZXNwb25zZTogIiArIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJCUltcG9ydFJlc3RVdGlscy52YWxpZGF0ZUltcG9ydFRlc3RUeXBlc1Jlc3AoY3VyclJlc291cmNlLCBpbXBvcnRSZXNwb25zZSk7CisJCQlpZiAoY3VyclJlc291cmNlLmdldHZhbGlkYXRlQXVkaXQoKSA9PSB0cnVlKSB7CisJCQkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJCQkvLyBTdHJpbmcgYmFzZVZlcnNpb249IjAuMSI7CisJCQkJU3RyaW5nIGJhc2VWZXJzaW9uID0gIiI7CisJCQkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKGN1cnJSZXNvdXJjZS5nZXRBY3Rpb25TdGF0dXMoKS5uYW1lKCkpOworCQkJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KCk7CisJCQkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIlJlc291cmNlSW1wb3J0IjsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChVc2VyUm9sZUVudW0uQURNSU4uZ2V0VXNlcklkKCkpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VyTmFtZSgpKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShjdXJyUmVzb3VyY2UuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiUmVzb3VyY2UiKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKGJhc2VWZXJzaW9uKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCQkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQudG9TdHJpbmcoKSk7CisJCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudChudWxsKTsKKwkJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQkJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSAoY3VyclJlc291cmNlLmdldEVycm9yUGFyYW1zKCkgIT0gbnVsbCA/IGN1cnJSZXNvdXJjZS5nZXRFcnJvclBhcmFtcygpIDogbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQkJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCQkJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRJbXBvcnQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24pOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBpbXBvcnROZXdSZXNvdXJjZShVc2VyUm9sZUVudW0gdXNlclJvbGVFbnVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBpbml0IHVzZXIKKwkJc2RuY01vZGlmaWVyRGV0YWlscy5zZXRVc2VySWQodXNlclJvbGVFbnVtLmdldFVzZXJJZCgpKTsKKwkJLy8gaW5pdCByZXNvdXJjZSBkZXRhaWxzCisJCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgiaW1wb3J0UmVzb3VyY2U0dGVzdCIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywgImpoMDAwMyIpOworCQkvLyBjbGVhbiBFUyBEQgorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCS8vIGltcG9ydCBuZXcgcmVzb3VyY2UgKGV4cGVjdGVkIGNoZWNrT3V0IHN0YXRlKQorCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoImltcG9ydFJlc291cmNlNHRlc3QiLCB1c2VyUm9sZUVudW0pOworCQlyZXR1cm4gaW1wb3J0UmVzcG9uc2U7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGltcG9ydFVJUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgcGF5bG9hZCA9ICJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMFxyXG4iICsgIm5vZGVfdHlwZXM6IFxyXG4iICsgIiAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5pbXBvcnRSZXNvdXJjZTR0ZXN0OlxyXG4iICsgIiAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3RcclxuIiArICIgICAgZGVzY3JpcHRpb246IHNvbWVEZXNjIjsKKworCQlTdHJpbmcgZW5jb2RlZFBheWxvYWQgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGVCYXNlNjQocGF5bG9hZC5nZXRCeXRlcygpKSk7CisKKwkJU3RyaW5nIGpzb24gPSAie1xyXG4iICsgIiAgXCJyZXNvdXJjZU5hbWVcIjogXCJpbXBvcnRSZXNvdXJjZTR0ZXN0XCIsXHJcbiIgKyAiICBcInBheWxvYWROYW1lXCI6IFwiaW1wb3J0UmVzb3VyY2U0dGVzdC55bWxcIixcclxuIgorCQkJCSsgIiAgXCJjYXRlZ29yaWVzXCI6IFt7XCJuYW1lXCI6IFwiQXBwbGljYXRpb24gTDQrXCIsXCJub3JtYWxpemVkTmFtZVwiOiBcImFwcGxpY2F0aW9uIGw0K1wiLFwidW5pcXVlSWRcIjogXCJyZXNvdXJjZU5ld0NhdGVnb3J5LmFwcGxpY2F0aW9uIGw0K1wiLFwic3ViY2F0ZWdvcmllc1wiOiBbe1wibmFtZVwiOiBcIldlYiBTZXJ2ZXJcIn1dfV0sXHJcbiIKKwkJCQkrICIgIFwiZGVzY3JpcHRpb25cIjogXCJSZXNvdXJjZURlc2NyaXB0aW9uXCIsXHJcbiIgKyAiICBcInZlbmRvck5hbWVcIjogXCJWZW5kb3JOYW1lXCIsXHJcbiIgKyAiICBcInZlbmRvclJlbGVhc2VcIjogXCJWZW5kb3JSZWxlYXNlXCIsXHJcbiIgKyAiICBcImNvbnRhY3RJZFwiOiBcIkFUMTIzNFwiLFxyXG4iICsgIiAgXCJpY29uXCI6IFwicm91dGVyXCIsXHJcbiIgKyAiICBcInRhZ3NcIjogW1xyXG4iCisJCQkJKyAiICAgIFwiaW1wb3J0UmVzb3VyY2U0dGVzdFwiXHJcbiIgKyAiICBdLFxyXG4iICsgIiAgXCJwYXlsb2FkRGF0YVwiOiBcIiIgKyBlbmNvZGVkUGF5bG9hZCArICJcIlxyXG4iICsgIn0iOworCisJCVN0cmluZyBtZDUgPSBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeVN0cmluZyhqc29uKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLk1ENV9IRUFERVIsIG1kNSk7CisJCWhlYWRlcnMucHV0KENvbnN0YW50cy5VU0VSX0lEX0hFQURFUiwgVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJJZCgpKTsKKwkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9IRUFERVIsICJhcHBsaWNhdGlvbi9qc29uIik7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCUh0dHBSZXF1ZXN0IGh0dHBVdGlsID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSBodHRwU2VuZFBvc3QgPSBodHRwVXRpbC5odHRwU2VuZFBvc3QodXJsLCBqc29uLCBoZWFkZXJzKTsKKwkJSW50ZWdlciBlcnJvckNvZGUgPSBodHRwU2VuZFBvc3QuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoZXJyb3JDb2RlID09IEh0dHBTdGF0dXMuU0NfQ1JFQVRFRCk7CisKKwl9CisKKwkvLyBUT0RPIERFMTcxMzM3CisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGltcG9ydE5ld1Jlc291cmNlX3N1YygpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgMjAxLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCisJCXJlc291cmNlVmVyc2lvbiA9ICIwLjEiOworCisJCS8vIFJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9CisJCS8vIENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJCS8vIHJlc291cmNlVmVyc2lvbik7CisJCS8vIHJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJLy8gUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKGltcG9ydFJlc3BvbnNlLAorCQkvLyByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKwkJLy8KKwkJLy8gLy92YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJLy8KKwkJLy8gUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPQorCQkvLyBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24pOworCQkvLyBSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc3AocmVzb3VyY2VHZXRSZXNwb25zZSwKKwkJLy8gcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisJCVJlc291cmNlIHJlc291cmNlRnJvbUltcG9ydCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUltcG9ydCk7CisKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKworCQkvLyB2YWxpZGF0ZQorCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZU1vZGVsT2JqZWN0cyhyZXNvdXJjZUZyb21JbXBvcnQsIHJlc291cmNlRnJvbUdldCk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24pOworCisJCWF1ZGl0QWN0aW9uID0gIlJlc291cmNlSW1wb3J0IjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKHJlc291cmNlRnJvbUdldC5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9ieVRlc3Rlcl9mYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBpbXBvcnROZXdSZXNvdXJjZShVc2VyUm9sZUVudW0uVEVTVEVSKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCA0MDksIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gVE9ETyBERTE3MTMzNworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9leGlzdEluQ2hlY2tvdXRfdXBkYXRlVmVuZG9yTmFtZV91cGRhdGVDYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGltcG9ydCBuZXcgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gaW1wb3J0TmV3UmVzb3VyY2UoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDEsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIGNsZWFuIGF1ZGl0CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBpbXBvcnQgbmV3IHJlc291cmNlIHdoaWxlIHJlc291cmNlIGFscmVhZHkgZXhpc3QgaW4gb3RoZXIgc3RhdGUKKwkJaW1wb3J0UmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoImltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkiLCBVc2VyUm9sZUVudW0uQURNSU4pOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMCwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJUmVzb3VyY2UgcmVzb3VyY2VGcm9tSW1wb3J0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tSW1wb3J0KTsKKworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCVJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldExpZmVjeWNsZVN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCisJCS8vIHZhbGlkYXRlCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlTW9kZWxPYmplY3RzKHJlc291cmNlRnJvbUltcG9ydCwgcmVzb3VyY2VGcm9tR2V0KTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMpOworCisJCWF1ZGl0QWN0aW9uID0gIlJlc291cmNlSW1wb3J0IjsKKwkJcmVzb3VyY2VWZXJzaW9uID0gIjAuMSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbihyZXNvdXJjZVZlcnNpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAwIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKHJlc291cmNlRnJvbUdldC5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0TmV3UmVzb3VyY2VfcGVyZnJvbUJ5QWRtaW5fb3duZWRCeV9kaWZmcmVudFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBpbXBvcnROZXdSZXNvdXJjZShVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VGcm9tSW1wb3J0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIGNsZWFuIGF1ZGl0CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NIRUNLT1VUX1NUQVRFLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpbmcgYXJ0aWZhY3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJU3RyaW5nW10gc3BsaXQgPSByZXNvdXJjZUZyb21JbXBvcnQuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpLnNwbGl0KCIgIik7CisJCVN0cmluZyBmaXJzdE5hbWUgPSBzcGxpdFswXTsKKwkJU3RyaW5nIGxhc3ROYW1lID0gc3BsaXRbMV07CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KHJlc291cmNlRnJvbUltcG9ydC5nZXROYW1lKCksICJyZXNvdXJjZSIsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHJlc291cmNlRnJvbUltcG9ydC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fQ0hFQ0tPVVRfU1RBVEUubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9wZXJmcm9tQnlEZXNpZ25lcl9vd25lZEJ5X2RpZmZyZW50VXNlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgMjAxLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VGcm9tSW1wb3J0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIGNsZWFuIGF1ZGl0CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NIRUNLT1VUX1NUQVRFLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpbmcgYXJ0aWZhY3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJU3RyaW5nW10gc3BsaXQgPSByZXNvdXJjZUZyb21JbXBvcnQuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpLnNwbGl0KCIgIik7CisJCVN0cmluZyBmaXJzdE5hbWUgPSBzcGxpdFswXTsKKwkJU3RyaW5nIGxhc3ROYW1lID0gc3BsaXRbMV07CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KHJlc291cmNlRnJvbUltcG9ydC5nZXROYW1lKCksICJyZXNvdXJjZSIsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHJlc291cmNlRnJvbUltcG9ydC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fQ0hFQ0tPVVRfU1RBVEUubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGltcG9ydE5ld1Jlc291cmNlX25hbWVTcGFjZV92ZigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoImltcG9ydFJlc291cmNlNHRlc3RWRiIsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhSZXNvdXJjZVR5cGVFbnVtLlZGKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydE5ld1Jlc291cmNlX25hbWVTcGFjZV92ZmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld1Jlc291cmNlQnlOYW1lKCJpbXBvcnRSZXNvdXJjZTR0ZXN0VkZDIiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgMjAxLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKFJlc291cmNlVHlwZUVudW0uVkZDKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9uYW1lU3BhY2VfdmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld1Jlc291cmNlQnlOYW1lKCJpbXBvcnRSZXNvdXJjZTR0ZXN0VkwiLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDEsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMoUmVzb3VyY2VUeXBlRW51bS5WTCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9uYW1lU3BhY2VfY3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld1Jlc291cmNlQnlOYW1lKCJpbXBvcnRSZXNvdXJjZTR0ZXN0Q1AiLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDEsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc291cmNlIHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhSZXNvdXJjZVR5cGVFbnVtLkNQKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9uYW1lU3BhY2VfdW5rbm93bigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoImltcG9ydFJlc291cmNlNHRlc3QiLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDEsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMoUmVzb3VyY2VUeXBlRW51bS5WRkMpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0TmV3UmVzb3VyY2VfTWlzc2luZ05hbWVTcGFjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoImltcG9ydFJlc291cmNlNHRlc3RNaXNzaW5nTmFtZVNwYWNlIiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgNDAwLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCS8vIFRPRE8gREUxNzEzMzcKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgaW1wb3J0TmV3UmVzb3VyY2VfZXhpc3RJbkNoZWNrT3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZQorCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgMjAxLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBjbGVhbiBhdWRpdAorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZSB3aGlsZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0IGluIENIRUNLT1VUIHN0YXRlCisKKwkJaW1wb3J0UmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoImltcG9ydFJlc291cmNlNHRlc3QiLCBVc2VyUm9sZUVudW0uQURNSU4pOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMCwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJUmVzb3VyY2UgcmVzb3VyY2VGcm9tSW1wb3J0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tSW1wb3J0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKworCQkvLyB2YWxpZGF0ZQorCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZU1vZGVsT2JqZWN0cyhyZXNvdXJjZUZyb21JbXBvcnQsIHJlc291cmNlRnJvbUdldCk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzKTsKKworCQlhdWRpdEFjdGlvbiA9ICJSZXNvdXJjZUltcG9ydCI7CisJCXJlc291cmNlVmVyc2lvbiA9ICIwLjEiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24ocmVzb3VyY2VWZXJzaW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMCIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZShyZXNvdXJjZUZyb21HZXQuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCX0KKworCS8vIFRPRE8gREUxNzEzMzcKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgaW1wb3J0TmV3UmVzb3VyY2VfZXhpc3RJbl9DaGVja0luX3N0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZQorCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgMjAxLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQkvLyBjaGVja0luIHJlc291cmNlCisKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVN0cmluZyBjaGVja2luQ29tZW50SnNvbiA9ICJ7XCJ1c2VyUmVtYXJrc1wiOiBcIiIgKyBjaGVja2luQ29tbWVudCArICJcIn0iOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBjaGVja0luUmVzcG9uc2UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBjbGVhbiBhdWRpdAorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZSB3aGlsZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0IGluIENIRUNLSU4gc3RhdGUKKworCQlpbXBvcnRSZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZSgiaW1wb3J0UmVzb3VyY2U0dGVzdCIsIFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgMjAwLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlSZXNvdXJjZSByZXNvdXJjZUZyb21JbXBvcnQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21JbXBvcnQpOworCisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJUmVzb3VyY2VSZXNwSmF2YU9iamVjdCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscyk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisKKwkJLy8gdmFsaWRhdGUKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVNb2RlbE9iamVjdHMocmVzb3VyY2VGcm9tSW1wb3J0LCByZXNvdXJjZUZyb21HZXQpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscyk7CisKKwkJcmVzb3VyY2VWZXJzaW9uID0gIjAuMiI7CisJCWF1ZGl0QWN0aW9uID0gIlJlc291cmNlSW1wb3J0IjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKHJlc291cmNlVmVyc2lvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFRvc2NhTm9kZVR5cGUocmVzb3VyY2VGcm9tR2V0LmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9leGlzdEluX1JlYWR5NGNlcnRfc3RhdGVfcGVyZm9ybUJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGltcG9ydCBuZXcgcmVzb3VyY2UKKworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBpbXBvcnROZXdSZXNvdXJjZShVc2VyUm9sZUVudW0uQURNSU4pOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQlyZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpOworCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCByZXNvdXJjZSIsIDIwMCwgcmVzb3VyY2VHZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCQkvLyBhZGQgbWFuZGF0b3J5IGFydGlmYWN0cworCQkvLyAvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKHNkbmNNb2RpZmllckRldGFpbHMsCisJCS8vIHJlc291cmNlR2V0UmVzcG9uc2UpOworCQlyZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLCByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisKKwkJLy8gY2hlY2tJbiByZXNvdXJjZQorCQlyZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpOworCQlTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiZ29vZCBjaGVja2luIjsKKwkJU3RyaW5nIGNoZWNraW5Db21lbnRKc29uID0gIntcInVzZXJSZW1hcmtzXCI6IFwiIiArIGNoZWNraW5Db21tZW50ICsgIlwifSI7CisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCBjaGVja2luQ29tZW50SnNvbik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGNoZWNrSW5SZXNwb25zZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChjaGVja0luUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChjaGVja0luUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisKKwkJLy8gcmVxNGNlcnQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlcXVlc3Q0Y2VydCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHJlc291cmNlIHJlcXVlc3QgZm9yIGNlcnRpZmljYXRpb24iLCByZXF1ZXN0NGNlcnQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIHJlcXVlc3Q0Y2VydC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCisJCS8vIGNsZWFuIGF1ZGl0CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBpbXBvcnQgbmV3IHJlc291cmNlIHdoaWxlIHJlc291cmNlIGFscmVhZHkgZXhpc3QgaW4gQ0hFQ0tJTiBzdGF0ZQorCQlpbXBvcnRSZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZSgiaW1wb3J0UmVzb3VyY2U0dGVzdCIsIFVzZXJSb2xlRW51bS5URVNURVIpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCXJlc291cmNlVmVyc2lvbiA9IHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCk7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiUmVzb3VyY2VJbXBvcnQiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChVc2VyUm9sZUVudW0uVEVTVEVSLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoVXNlclJvbGVFbnVtLlRFU1RFUi5nZXRVc2VyTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKwl9CisKKwkvLyBUT0RPIERFMTcxMzM3CisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGltcG9ydE5ld1Jlc291cmNlX2V4aXN0SW5fUmVhZHk0Y2VydF9zdGF0ZV9wZXJmb3JtQnlEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbXBvcnQgbmV3IHJlc291cmNlCisKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gaW1wb3J0TmV3UmVzb3VyY2UoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDEsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgcmVzb3VyY2UiLCAyMDAsIHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJLy8gYWRkIG1hbmRhdG9yeSBhcnRpZmFjdHMKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkvLyByZXNvdXJjZUdldFJlc3BvbnNlKTsKKwkJcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCByZXNvdXJjZSIsIDIwMCwgcmVzb3VyY2VHZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCisJCS8vIGNoZWNrSW4gcmVzb3VyY2UKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVN0cmluZyBjaGVja2luQ29tZW50SnNvbiA9ICJ7XCJ1c2VyUmVtYXJrc1wiOiBcIiIgKyBjaGVja2luQ29tbWVudCArICJcIn0iOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgY2hlY2tJblJlc3BvbnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gcmVxNGNlcnQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlcXVlc3Q0Y2VydCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHJlc291cmNlIHJlcXVlc3QgZm9yIGNlcnRpZmljYXRpb24iLCByZXF1ZXN0NGNlcnQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIHJlcXVlc3Q0Y2VydC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCisJCS8vIGNsZWFuIGF1ZGl0CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBpbXBvcnQgbmV3IHJlc291cmNlIHdoaWxlIHJlc291cmNlIGFscmVhZHkgZXhpc3QgaW4gb3RoZXIgc3RhdGUKKwkJaW1wb3J0UmVzcG9uc2UgPSBJbXBvcnRSZXN0VXRpbHMuaW1wb3J0TmV3UmVzb3VyY2VCeU5hbWUoImltcG9ydFJlc291cmNlNHRlc3QiLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NFTlRfRk9SX0NFUlRJRklDQVRJT04ubmFtZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJU3RyaW5nW10gc3BsaXQgPSByZXNvdXJjZUZyb21HZXQuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpLnNwbGl0KCIgIik7CisJCVN0cmluZyBmaXJzdE5hbWUgPSBzcGxpdFswXTsKKwkJU3RyaW5nIGxhc3ROYW1lID0gc3BsaXRbMV07CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KHJlc291cmNlRnJvbUdldC5nZXROYW1lKCksICJyZXNvdXJjZSIsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHJlc291cmNlRnJvbUdldC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfU0VOVF9GT1JfQ0VSVElGSUNBVElPTi5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlVmVyc2lvbik7CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJSZXNvdXJjZUltcG9ydCI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChVc2VyUm9sZUVudW0uREVTSUdORVIuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShVc2VyUm9sZUVudW0uREVTSUdORVIuZ2V0VXNlck5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pLnRvU3RyaW5nKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24ocmVzb3VyY2VWZXJzaW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZShyZXNvdXJjZUZyb21HZXQuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSk7CisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJLy8gVE9ETyBERTE3MTMzNworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9leGlzdEluX1JlYWR5NGNlcnRfc3RhdGVfcGVyZm9ybUJ5QWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBpbXBvcnQgbmV3IHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgcmVzb3VyY2UiLCAyMDAsIHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKworCQkvLyBhZGQgbWFuZGF0b3J5IGFydGlmYWN0cworCQkvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKHNkbmNNb2RpZmllckRldGFpbHMsCisJCS8vIHJlc291cmNlR2V0UmVzcG9uc2UpOworCQlyZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLCByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisKKwkJLy8gY2hlY2tJbiByZXNvdXJjZQorCQlyZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpOworCQlTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiZ29vZCBjaGVja2luIjsKKwkJU3RyaW5nIGNoZWNraW5Db21lbnRKc29uID0gIntcInVzZXJSZW1hcmtzXCI6IFwiIiArIGNoZWNraW5Db21tZW50ICsgIlwifSI7CisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCBjaGVja2luQ29tZW50SnNvbik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBjaGVja0luUmVzcG9uc2UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyByZXE0Y2VydCByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVxdWVzdDRjZXJ0ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgcmVzb3VyY2UgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGlvbiIsIHJlcXVlc3Q0Y2VydCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgcmVxdWVzdDRjZXJ0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXF1ZXN0NGNlcnQuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChyZXF1ZXN0NGNlcnQuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisKKwkJLy8gY2xlYW4gYXVkaXQKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIGltcG9ydCBuZXcgcmVzb3VyY2Ugd2hpbGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdCBpbiBvdGhlciBzdGF0ZQorCQlpbXBvcnRSZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZSgiaW1wb3J0UmVzb3VyY2U0dGVzdCIsIFVzZXJSb2xlRW51bS5BRE1JTik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMCwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCQlyZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpOworCQkvLyByZXNvdXJjZVZlcnNpb249IjAuMiI7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJUmVzb3VyY2UgcmVzb3VyY2VGcm9tSW1wb3J0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tSW1wb3J0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlyZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCisJCS8vIHZhbGlkYXRlCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlTW9kZWxPYmplY3RzKHJlc291cmNlRnJvbUltcG9ydCwgcmVzb3VyY2VGcm9tR2V0KTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uKTsKKwkJYXVkaXRBY3Rpb24gPSAiUmVzb3VyY2VJbXBvcnQiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24ocmVzb3VyY2VWZXJzaW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMCIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZShyZXNvdXJjZUZyb21HZXQuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydE5ld1Jlc291cmNlX2V4aXN0SW5fQ2VySW5Qcm9ncmVzc19zdGF0ZV9wZXJmb3JtQnlUZXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBpbXBvcnQgbmV3IHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgcmVzb3VyY2UiLCAyMDAsIHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKworCQkvLyBhZGQgbWFuZGF0b3J5IGFydGlmYWN0cworCQkvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKHNkbmNNb2RpZmllckRldGFpbHMsCisJCS8vIHJlc291cmNlR2V0UmVzcG9uc2UpOworCQlyZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLCByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisKKwkJLy8gY2hlY2tJbiByZXNvdXJjZQorCQlyZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpOworCQlTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiZ29vZCBjaGVja2luIjsKKwkJU3RyaW5nIGNoZWNraW5Db21lbnRKc29uID0gIntcInVzZXJSZW1hcmtzXCI6IFwiIiArIGNoZWNraW5Db21tZW50ICsgIlwifSI7CisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCBjaGVja2luQ29tZW50SnNvbik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBjaGVja0luUmVzcG9uc2UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyByZXE0Y2VydCByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVxdWVzdDRjZXJ0ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgcmVzb3VyY2UgcmVxdWVzdCBmb3IgY2VydGlmaWNhdGlvbiIsIHJlcXVlc3Q0Y2VydCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgcmVxdWVzdDRjZXJ0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXF1ZXN0NGNlcnQuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChyZXF1ZXN0NGNlcnQuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisKKwkJLy8gc3RhcnRDZXJ0CisJCVJlc3RSZXNwb25zZSBzdGFydENlcnQgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgcmVzb3VyY2UgcmVxdWVzdCBzdGFydCBjZXJ0aWZpY2F0aW9uIiwgc3RhcnRDZXJ0KTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBzdGFydENlcnQuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHN0YXJ0Q2VydC5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KHN0YXJ0Q2VydC5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihyZXNvdXJjZUZyb21HZXQuZ2V0VmVyc2lvbigpKTsKKworCQkvLyBjbGVhbiBhdWRpdAorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZSB3aGlsZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0IGluIG90aGVyIHN0YXRlCisJCWltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld1Jlc291cmNlQnlOYW1lKCJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwgVXNlclJvbGVFbnVtLlRFU1RFUik7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uKTsKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIlJlc291cmNlSW1wb3J0IjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoVXNlclJvbGVFbnVtLlRFU1RFUi5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKFVzZXJSb2xlRW51bS5URVNURVIuZ2V0VXNlck5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCX0KKworCS8vIFRPRE8gREUxNzEzMzcKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgaW1wb3J0TmV3UmVzb3VyY2VfZXhpc3RJbl9DZXJJblByb2dyZXNzX3N0YXRlX3BlcmZvcm1CeURlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jQWRtaW5Vc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBpbXBvcnROZXdSZXNvdXJjZShVc2VyUm9sZUVudW0uQURNSU4pOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDEsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlVmVyc2lvbiA9IHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCk7CisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLCByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisKKwkJLy8gYWRkIG1hbmRhdG9yeSBhcnRpZmFjdHMKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkvLyByZXNvdXJjZUdldFJlc3BvbnNlKTsKKwkJcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCByZXNvdXJjZSIsIDIwMCwgcmVzb3VyY2VHZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCisJCS8vIGNoZWNrSW4gcmVzb3VyY2UKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVN0cmluZyBjaGVja2luQ29tZW50SnNvbiA9ICJ7XCJ1c2VyUmVtYXJrc1wiOiBcIiIgKyBjaGVja2luQ29tbWVudCArICJcIn0iOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgY2hlY2tJblJlc3BvbnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gcmVxNGNlcnQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlcXVlc3Q0Y2VydCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHJlc291cmNlIHJlcXVlc3QgZm9yIGNlcnRpZmljYXRpb24iLCByZXF1ZXN0NGNlcnQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIHJlcXVlc3Q0Y2VydC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCisJCS8vIHN0YXJ0Q2VydAorCQlSZXN0UmVzcG9uc2Ugc3RhcnRDZXJ0ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHJlc291cmNlIHJlcXVlc3Qgc3RhcnQgY2VydGlmaWNhdGlvbiIsIHN0YXJ0Q2VydCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgc3RhcnRDZXJ0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChzdGFydENlcnQuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChzdGFydENlcnQuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisJCXJlc291cmNlVmVyc2lvbiA9IHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCk7CisKKwkJLy8gY2xlYW4gYXVkaXQKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIGltcG9ydCBuZXcgcmVzb3VyY2Ugd2hpbGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdCBpbiBvdGhlciBzdGF0ZQorCQlpbXBvcnRSZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZSgiaW1wb3J0UmVzb3VyY2U0dGVzdCIsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NFUlRfSU5fUFJPR1JFU1NfU1RBVEUubmFtZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgInJlc291cmNlIiwgc2RuY0FkbWluVXNlci5nZXRGaXJzdE5hbWUoKSwgc2RuY0FkbWluVXNlci5nZXRMYXN0TmFtZSgpLCBzZG5jQWRtaW5Vc2VyLmdldFVzZXJJZCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fQ0VSVF9JTl9QUk9HUkVTU19TVEFURS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlVmVyc2lvbik7CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJSZXNvdXJjZUltcG9ydCI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChVc2VyUm9sZUVudW0uREVTSUdORVIuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShVc2VyUm9sZUVudW0uREVTSUdORVIuZ2V0VXNlck5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUykudG9TdHJpbmcoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbihyZXNvdXJjZVZlcnNpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKHJlc291cmNlRnJvbUdldC5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwkvLyBUT0RPIERFMTcxMzM3CisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGltcG9ydE5ld1Jlc291cmNlX2V4aXN0SW5fQ2VySW5Qcm9ncmVzc19zdGF0ZV9wZXJmb3JtQnlBZG1pbigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY0FkbWluVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBpbXBvcnROZXdSZXNvdXJjZShVc2VyUm9sZUVudW0uQURNSU4pOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDEsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlVmVyc2lvbiA9IHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCk7CisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLCByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisKKwkJLy8gYWRkIG1hbmRhdG9yeSBhcnRpZmFjdHMKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkvLyByZXNvdXJjZUdldFJlc3BvbnNlKTsKKwkJcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCByZXNvdXJjZSIsIDIwMCwgcmVzb3VyY2VHZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCisJCS8vIGNoZWNrSW4gcmVzb3VyY2UKKwkJcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVN0cmluZyBjaGVja2luQ29tZW50SnNvbiA9ICJ7XCJ1c2VyUmVtYXJrc1wiOiBcIiIgKyBjaGVja2luQ29tbWVudCArICJcIn0iOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgY2hlY2tJblJlc3BvbnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gcmVxNGNlcnQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlcXVlc3Q0Y2VydCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHJlc291cmNlIHJlcXVlc3QgZm9yIGNlcnRpZmljYXRpb24iLCByZXF1ZXN0NGNlcnQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIHJlcXVlc3Q0Y2VydC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VGcm9tR2V0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCXJlc291cmNlRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCisJCS8vIHN0YXJ0Q2VydAorCQlSZXN0UmVzcG9uc2Ugc3RhcnRDZXJ0ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHJlc291cmNlIHJlcXVlc3Qgc3RhcnQgY2VydGlmaWNhdGlvbiIsIHN0YXJ0Q2VydCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgc3RhcnRDZXJ0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChzdGFydENlcnQuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChzdGFydENlcnQuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisJCXJlc291cmNlVmVyc2lvbiA9IHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCk7CisKKwkJLy8gY2xlYW4gYXVkaXQKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIGltcG9ydCBuZXcgcmVzb3VyY2Ugd2hpbGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdCBpbiBvdGhlciBzdGF0ZQorCQlpbXBvcnRSZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZSgiaW1wb3J0UmVzb3VyY2U0dGVzdCIsIFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fQ0VSVF9JTl9QUk9HUkVTU19TVEFURS5uYW1lKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCBpbXBvcnRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAicmVzb3VyY2UiLCBzZG5jQWRtaW5Vc2VyLmdldEZpcnN0TmFtZSgpLCBzZG5jQWRtaW5Vc2VyLmdldExhc3ROYW1lKCksIHNkbmNBZG1pblVzZXIuZ2V0VXNlcklkKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTl9DRVJUX0lOX1BST0dSRVNTX1NUQVRFLm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uKTsKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIlJlc291cmNlSW1wb3J0IjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VyTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKS50b1N0cmluZygpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKHJlc291cmNlVmVyc2lvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFRvc2NhTm9kZVR5cGUocmVzb3VyY2VGcm9tR2V0LmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCS8vIFRPRE8gREUxNzEzMzcKKwkvLyBAVGVzdChlbmFibGVkID0gZmFsc2UpCisJLy8gcHVibGljIHZvaWQKKwkvLyBpbXBvcnROZXdSZXNvdXJjZV9leGlzdEluX0NlcnRpZmllZF9zdGF0ZV9jaG5hZ2VfcmVxQW5kQ2FwX2J5RGVzaWduZXIoKQorCS8vIHRocm93cyBFeGNlcHRpb257CisJLy8KKwkvLyAvLyBBbmRyZXkgLSBzZXQgZGVmYXVsdCBhcnRpZmFjdCBkZXRhaWxzCisJLy8gQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9CisJLy8gYXJ0aWZhY3RVdGlscy5jb25zdHJ1Y3REZWZhdWx0QXJ0aWZhY3RJbmZvKCk7CisJLy8KKwkvLyAvLyBpbXBvcnQgbmV3IHJlc291cmNlCisJLy8gUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gaW1wb3J0TmV3UmVzb3VyY2UoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwKKwkvLyBpbXBvcnRSZXNwb25zZSk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0CisJLy8gcmVzb3VyY2UiLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIDIwMSwKKwkvLyBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLyBTdHJpbmcgcmVzb3VyY2VJZCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoaW1wb3J0UmVzcG9uc2UpOworCS8vIHJlc291cmNlRGV0YWlscyA9CisJLy8gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCS8vIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJLy8gcmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKTsKKwkvLyBSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9CisJLy8gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywKKwkvLyByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCByZXNvdXJjZSIsIDIwMCwKKwkvLyByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vIFJlc291cmNlIHJlc291cmNlRnJvbUdldCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLyBhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJLy8KKwkvLyAvLyBhZGQgbWFuZGF0b3J5IGFydGlmYWN0cworCS8vIC8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHMoc2RuY01vZGlmaWVyRGV0YWlscywKKwkvLyByZXNvdXJjZUdldFJlc3BvbnNlKTsKKwkvLyByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywKKwkvLyByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCByZXNvdXJjZSIsIDIwMCwKKwkvLyByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vIHJlc291cmNlRnJvbUdldCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLyBhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJLy8gcmVzb3VyY2VEZXRhaWxzID0KKwkvLyBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJLy8gUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkvLyByZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihyZXNvdXJjZUZyb21HZXQuZ2V0VmVyc2lvbigpKTsKKwkvLworCS8vIC8vIGFkZCBhcnRpZmFjdAorCS8vIGFydGlmYWN0RGVmaW5pdGlvbi5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3ROYW1lMSk7CisJLy8gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJLy8gc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uICwgYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkvLworCS8vIC8vIGFkZCBhcnRpZmFjdAorCS8vIGFydGlmYWN0RGVmaW5pdGlvbi5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3ROYW1lMik7CisJLy8gcmVzb3VyY2VVdGlscy5hZGRfYXJ0aWZhY3QocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCS8vIHJlc291cmNlVmVyc2lvbiAsIGFydGlmYWN0RGVmaW5pdGlvbik7CisJLy8KKwkvLyAvLyBhZGQgaW50ZXJmYWNlCisJLy8gYXJ0aWZhY3REZWZpbml0aW9uLnNldEFydGlmYWN0TmFtZShpbnRlcmZhY2VBcnRpZmFjdE5hbWUpOworCS8vIFJlc291cmNlUmVzdFV0aWxzLmFkZF9pbnRlcmZhY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCS8vIHJlc291cmNlVmVyc2lvbiAsIGFydGlmYWN0RGVmaW5pdGlvbik7CisJLy8KKwkvLyAvL2NvbnN0cnVjdCBmaWVsZHMgZm9yIHZhbGlkYXRpb24KKwkvLyByZXNvdXJjZVZlcnNpb249IjEuMCI7CisJLy8KKwkvLyBSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPQorCS8vIENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJLy8gcmVzb3VyY2VWZXJzaW9uKTsKKwkvLyBBcnJheUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkvLworCS8vIGFydGlmYWN0cy5hZGQocmVzb3VyY2VJZCsiOiIrYXJ0aWZhY3ROYW1lMSk7CisJLy8gYXJ0aWZhY3RzLmFkZChyZXNvdXJjZUlkKyI6IithcnRpZmFjdE5hbWUyKTsKKwkvLyByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldEFydGlmYWN0cyhhcnRpZmFjdHMpOworCS8vIEFycmF5TGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkvLworCS8vIGludGVyZmFjZXMuYWRkKGludGVyZmF6ZSk7CisJLy8gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRJbnRlcmZhY2VzKGludGVyZmFjZXMpOworCS8vCisJLy8gLy8gY2hlY2tJbiByZXNvdXJjZQorCS8vIHJlc291cmNlVmVyc2lvbiA9IHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCk7CisJLy8gU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJLy8gU3RyaW5nIGNoZWNraW5Db21lbnRKc29uID0gIntcInVzZXJSZW1hcmtzXCI6IFwiIitjaGVja2luQ29tbWVudCsiXCJ9IjsKKwkvLyBSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0KKwkvLyBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsCisJLy8gc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sCisJLy8gY2hlY2tpbkNvbWVudEpzb24pOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLAorCS8vIGNoZWNrSW5SZXNwb25zZSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCS8vIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIC8vIHJlcTRjZXJ0IHJlc291cmNlCisJLy8gUmVzdFJlc3BvbnNlIHJlcXVlc3Q0Y2VydCA9CisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLAorCS8vIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVmVyc2lvbiwKKwkvLyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgcmVzb3VyY2UgcmVxdWVzdAorCS8vIGZvciBjZXJ0aWZpY2F0aW9uIiwgcmVxdWVzdDRjZXJ0KTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsCisJLy8gcmVxdWVzdDRjZXJ0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vIHJlc291cmNlRnJvbUdldCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCkpOworCS8vIGFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkvLyByZXNvdXJjZURldGFpbHMgPQorCS8vIFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCksCisJLy8gUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkvLyByZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihyZXNvdXJjZUZyb21HZXQuZ2V0VmVyc2lvbigpKTsKKwkvLworCS8vIC8vIHN0YXJ0Q2VydAorCS8vIFJlc3RSZXNwb25zZSBzdGFydENlcnQgPQorCS8vIExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywKKwkvLyBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sCisJLy8gTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciByZXNvdXJjZSByZXF1ZXN0CisJLy8gc3RhcnQgY2VydGlmaWNhdGlvbiIsIHN0YXJ0Q2VydCk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCS8vIHN0YXJ0Q2VydC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLyByZXNvdXJjZUZyb21HZXQgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHN0YXJ0Q2VydC5nZXRSZXNwb25zZSgpKTsKKwkvLyBhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJLy8gcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChzdGFydENlcnQuZ2V0UmVzcG9uc2UoKSwKKwkvLyBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCS8vIHJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCS8vCisJLy8gLy8gY2VydGlmeQorCS8vIFJlc3RSZXNwb25zZSBjZXJ0aWZ5ID0KKwkvLyBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsCisJLy8gc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciByZXNvdXJjZSByZXF1ZXN0CisJLy8gY2VydGlmeSIsIGNlcnRpZnkpOworCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjZXJ0aWZ5IHJlc291cmNlIiwgMjAwLAorCS8vIGNlcnRpZnkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8gcmVzb3VyY2VGcm9tR2V0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChjZXJ0aWZ5LmdldFJlc3BvbnNlKCkpOworCS8vIGFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkvLyByZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGNlcnRpZnkuZ2V0UmVzcG9uc2UoKSwKKwkvLyBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCS8vIHJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKHJlc291cmNlRnJvbUdldC5nZXRWZXJzaW9uKCkpOworCS8vCisJLy8gLy8gY2xlYW4gYXVkaXQKKwkvLyBEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJLy8KKwkvLyAvLyBjaGFuZ2UgcmVzb3VyY2UgZGV0YWlscworCS8vIHJlc291cmNlRGV0YWlscyA9CisJLy8gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCJ0b3NjYS5ub2Rlcy5pbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkvLyBOb3JtYXRpdmVUeXBlc0VudW0uQ09NUFVURSwgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX1JPVVRFUlMsCisJLy8gImpoMDAwMyIpOworCS8vCisJLy8gLy8gaW1wb3J0IG5ldyByZXNvdXJjZSB3aGlsZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0IGluIG90aGVyIHN0YXRlCisJLy8gaW1wb3J0UmVzcG9uc2UgPQorCS8vIEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZSgiaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAiLAorCS8vIFVzZXJSb2xlRW51bS5BRE1JTik7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsCisJLy8gaW1wb3J0UmVzcG9uc2UpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydAorCS8vIHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCAyMDAsCisJLy8gaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8gcmVzb3VyY2VEZXRhaWxzID0KKwkvLyBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJLy8gUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkvLyByZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpOworCS8vIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLAorCS8vIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLAorCS8vIHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8gcmVzb3VyY2VGcm9tR2V0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCS8vIGFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkvLworCS8vIC8vIHZhbGlkYXRlIHJlc3BvbnNlCisJLy8gUmVzb3VyY2UgcmVzb3VyY2VGcm9tSW1wb3J0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLyBhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUltcG9ydCk7CisJLy8KKwkvLyByZXNvdXJjZURldGFpbHMgPQorCS8vIFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkvLyBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCS8vIHJlc291cmNlUmVzcEphdmFPYmplY3QgPQorCS8vIENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMpOworCS8vIHJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLworCS8vIC8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCS8vIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLAorCS8vIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VW5pcXVlSWQoKSk7CisJLy8gcmVzb3VyY2VGcm9tR2V0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCS8vIGFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkvLworCS8vIC8vIHZhbGlkYXRlCisJLy8gUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVNb2RlbE9iamVjdHMocmVzb3VyY2VGcm9tSW1wb3J0LAorCS8vIHJlc291cmNlRnJvbUdldCk7CisJLy8KKwkvLyAvLyB2YWxpZGF0ZSBhdWRpdAorCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJLy8gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJLy8gcmVzb3VyY2VWZXJzaW9uKTsKKwkvLyBhdWRpdEFjdGlvbj0iUmVzb3VyY2VJbXBvcnQiOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbihyZXNvdXJjZVZlcnNpb24pOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKHJlc291cmNlRnJvbUdldC5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKwkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsCisJLy8gYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKwkvLyB9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydE5ld1Jlc291cmNlX3V1aWRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IGltcG9ydE5ld1Jlc291cmNlKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGltcG9ydFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgMjAxLCBpbXBvcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nIG9sZFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgInV1aWQiKTsKKworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlUmVxRGV0YWlscy5jbGFzcyk7CisJCXJlc291cmNlVmVyc2lvbiA9IHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCk7CisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLCByZXNvdXJjZUdldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRnJvbUdldCk7CisJCS8vIGFkZCBtYW5kYXRvcnkgYXJ0aWZhY3RzCisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHMoc2RuY01vZGlmaWVyRGV0YWlscywKKwkJLy8gcmVzb3VyY2VHZXRSZXNwb25zZSk7CisJCXJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgcmVzb3VyY2UiLCAyMDAsIHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChpbXBvcnRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihyZXNvdXJjZUZyb21HZXQuZ2V0VmVyc2lvbigpKTsKKworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCAiMC4xIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCByZXNvdXJjZSIsIGNoZWNrSW5SZXNwb25zZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBuZXdVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoZWNrSW5SZXNwb25zZS5nZXRSZXNwb25zZSgpLCAidXVpZCIpOworCQlhc3NlcnRUcnVlKFJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXVpZEFmdGVyQ2hhbmdpbmdTdGF0dXMob2xkVXVpZCwgbmV3VXVpZCkpOworCisJCS8vIHJlcTRjZXJ0IHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXF1ZXN0NGNlcnQgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciByZXNvdXJjZSByZXF1ZXN0IGZvciBjZXJ0aWZpY2F0aW9uIiwgcmVxdWVzdDRjZXJ0KTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCByZXF1ZXN0NGNlcnQuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlRnJvbUdldCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlcXVlc3Q0Y2VydC5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZyb21HZXQpOworCQlyZXNvdXJjZURldGFpbHMgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KHJlcXVlc3Q0Y2VydC5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZVJlcURldGFpbHMuY2xhc3MpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihyZXNvdXJjZUZyb21HZXQuZ2V0VmVyc2lvbigpKTsKKworCQlTdHJpbmcgbmV3VXVpZDIgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UocmVxdWVzdDRjZXJ0LmdldFJlc3BvbnNlKCksICJ1dWlkIik7CisJCWFzc2VydFRydWUoUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVdWlkQWZ0ZXJDaGFuZ2luZ1N0YXR1cyhvbGRVdWlkLCBuZXdVdWlkMikpOworCisJCS8vIHN0YXJ0Q2VydAorCQlSZXN0UmVzcG9uc2Ugc3RhcnRDZXJ0ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHJlc291cmNlIHJlcXVlc3Qgc3RhcnQgY2VydGlmaWNhdGlvbiIsIHN0YXJ0Q2VydCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgc3RhcnRDZXJ0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZUZyb21HZXQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChzdGFydENlcnQuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VGcm9tR2V0KTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChzdGFydENlcnQuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24ocmVzb3VyY2VGcm9tR2V0LmdldFZlcnNpb24oKSk7CisKKwkJU3RyaW5nIG5ld1V1aWQzID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHN0YXJ0Q2VydC5nZXRSZXNwb25zZSgpLCAidXVpZCIpOworCQlhc3NlcnRUcnVlKFJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXVpZEFmdGVyQ2hhbmdpbmdTdGF0dXMob2xkVXVpZCwgbmV3VXVpZDMpKTsKKworCQlSZXN0UmVzcG9uc2UgY2VydGlmeSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgIjAuMSIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBjZXJ0aWZ5KTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjZXJ0aWZ5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBuZXdVdWlkNCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjZXJ0aWZ5LmdldFJlc3BvbnNlKCksICJ1dWlkIik7CisJCWFzc2VydFRydWUoUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVdWlkQWZ0ZXJDaGFuZ2luZ1N0YXR1cyhvbGRVdWlkLCBuZXdVdWlkNCkpOworCisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCAiMS4wIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBjaGVja0luUmVzcG9uc2UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgbmV3VXVpZDUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hlY2tvdXRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAidXVpZCIpOworCQlhc3NlcnRGYWxzZShSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVV1aWRBZnRlckNoYW5naW5nU3RhdHVzKG9sZFV1aWQsIG5ld1V1aWQ1KSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9wcm9wZXJ0aWVzTWFwSW50ZXJuYWxVcmxDcmVkZW50aWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmb2xkZXJOYW1lID0gInZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwX3ZhbHVlVXJsQ3JlZGVudGlhbCI7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZShmb2xkZXJOYW1lLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IHJlc291cmNlLmdldFByb3BlcnRpZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBwcm9wZXJ0aWVzIHNpemUiLCAzLCBwcm9wZXJ0aWVzLnNpemUoKSk7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IHByb3BlcnRpZXMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKCJ2YWxpZGF0aW9uX3Rlc3QiKSkuZmluZEZpcnN0KCkuZ2V0KCk7CisJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7CisKKwkJTWFwIG1hcFZhbHVlID0gZ3Nvbi5mcm9tSnNvbihkZWZhdWx0VmFsdWUsIE1hcC5jbGFzcyk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgTWFwIHZhbHVlIHNpemUiLCAyLCBtYXBWYWx1ZS5zaXplKCkpOworCQljaGVja01hcFZhbHVlcyhtYXBWYWx1ZSwgImtleSIsIDEsIG51bGwpOworCQljaGVja01hcFZhbHVlcyhtYXBWYWx1ZSwgImtleSIsIDIsIG51bGwpOworCisJCVN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3J0IFJlc291cmNlICIgKyAiPCIgKyBmb2xkZXJOYW1lICsgIj4iICsgInJlc3BvbnNlOiAiICsgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV9wcm9wZXJ0aWVzTGlzdEludGVybmFsVXJsQ3JlZGVudGlhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZm9sZGVyTmFtZSA9ICJ2YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsIjsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydE5ld1Jlc291cmNlQnlOYW1lKGZvbGRlck5hbWUsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoaW1wb3J0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHByb3BlcnRpZXMgc2l6ZSIsIDMsIHByb3BlcnRpZXMuc2l6ZSgpKTsKKworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydGllcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoInZhbGlkYXRpb25fdGVzdCIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKTsKKworCQlMaXN0IGxpc3RWYWx1ZSA9IGdzb24uZnJvbUpzb24oZGVmYXVsdFZhbHVlLCBMaXN0LmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBMaXN0IHZhbHVlIHNpemUiLCAyLCBsaXN0VmFsdWUuc2l6ZSgpKTsKKwkJY2hlY2tMaXN0VmFsdWVzKGxpc3RWYWx1ZS5nZXQoMCksIDEsIFNQRUNJQUxfQ0hBUkFDVEVSUyk7CisJCWNoZWNrTGlzdFZhbHVlcyhsaXN0VmFsdWUuZ2V0KDEpLCAyLCBTUEVDSUFMX0NIQVJBQ1RFUlMpOworCisJCS8vIFZlcmlmeSBhdHRyaWJ1dGVzCisJCUxpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlcyA9IHJlc291cmNlLmdldEF0dHJpYnV0ZXMoKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHByb3BlcnRpZXMgc2l6ZSIsIDIsIGF0dHJpYnV0ZXMuc2l6ZSgpKTsKKworCQkvLyBWZXJpZnkgYXR0cmlidXRlIGZyb20gdHlwZSBtYXAKKwkJQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVNYXBEZWZpbml0aW9uID0gYXR0cmlidXRlcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoInZhbGlkYXRpb25fdGVzdF9tYXAiKSkuZmluZEZpcnN0KCkuZ2V0KCk7CisJCVN0cmluZyBkZWZhdWx0TWFwVmFsdWUgPSBhdHRyaWJ1dGVNYXBEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpOworCQlNYXAgYXR0cmlidXRlTWFwVmFsdWUgPSBnc29uLmZyb21Kc29uKGRlZmF1bHRNYXBWYWx1ZSwgTWFwLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBNYXAgdmFsdWUgc2l6ZSIsIDIsIGF0dHJpYnV0ZU1hcFZhbHVlLnNpemUoKSk7CisJCWNoZWNrTWFwVmFsdWVzKGF0dHJpYnV0ZU1hcFZhbHVlLCAia2V5IiwgMSwgU1BFQ0lBTF9DSEFSQUNURVJTKTsKKwkJY2hlY2tNYXBWYWx1ZXMoYXR0cmlidXRlTWFwVmFsdWUsICJrZXkiLCAyLCBTUEVDSUFMX0NIQVJBQ1RFUlMpOworCisJCS8vIFZlcmlmeSBhdHRyaWJ1dGUgZnJvbSB0eXBlIGxpc3QKKwkJQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVMaXN0RGVmaW5pdGlvbiA9IGF0dHJpYnV0ZXMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKCJ2YWxpZGF0aW9uX3Rlc3RfbGlzdCIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKwkJU3RyaW5nIGRlZmF1bHRMaXN0VmFsdWUgPSBhdHRyaWJ1dGVMaXN0RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKTsKKworCQlMaXN0IGF0dHJpYnV0ZUxpc3RWYWx1ZSA9IGdzb24uZnJvbUpzb24oZGVmYXVsdExpc3RWYWx1ZSwgTGlzdC5jbGFzcyk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgTGlzdCB2YWx1ZSBzaXplIiwgMiwgYXR0cmlidXRlTGlzdFZhbHVlLnNpemUoKSk7CisJCWNoZWNrTGlzdFZhbHVlcyhhdHRyaWJ1dGVMaXN0VmFsdWUuZ2V0KDApLCAxLCBTUEVDSUFMX0NIQVJBQ1RFUlMpOworCQljaGVja0xpc3RWYWx1ZXMoYXR0cmlidXRlTGlzdFZhbHVlLmdldCgxKSwgMiwgU1BFQ0lBTF9DSEFSQUNURVJTKTsKKworCQlTeXN0ZW0uZXJyLnByaW50bG4oImltcG9ydCBSZXNvdXJjZSAiICsgIjwiICsgZm9sZGVyTmFtZSArICI+IiArICJyZXNwb25zZTogIiArIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0xpc3RWYWx1ZXMoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4LCBTdHJpbmcgc3VmZml4KSB7CisKKwkJTWFwIG1hcCA9IChNYXApIG9iamVjdDsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBNYXAgcHJvdG9jb2wgdmFsdWUiLCAicHJvdG9jb2wiICsgaW5kZXggKyAoc3VmZml4ID09IG51bGwgPyAiIiA6IHN1ZmZpeCksIG1hcC5nZXQoInByb3RvY29sIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIE1hcCB0b2tlbiB2YWx1ZSIsICJ0b2tlbiIgKyBpbmRleCwgbWFwLmdldCgidG9rZW4iKSk7CisJfQorCisJLy8gQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROZXdSZXNvdXJjZV92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVRlc3REYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZm9sZGVyTmFtZSA9ICJ2YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVRlc3REYXRhVHlwZSI7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNwb25zZSA9IEltcG9ydFJlc3RVdGlscy5pbXBvcnROZXdSZXNvdXJjZUJ5TmFtZShmb2xkZXJOYW1lLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGltcG9ydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja01hcFZhbHVlcyhNYXAgbWFwVmFsdWUsIFN0cmluZyBrZXksIGludCBpbmRleCwgU3RyaW5nIHN1ZmZpeCkgeworCisJCU1hcCBtYXAxID0gKE1hcCkgbWFwVmFsdWUuZ2V0KGtleSArIGluZGV4KTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBNYXAgcHJvdG9jb2wgdmFsdWUiLCAicHJvdG9jb2wiICsgaW5kZXggKyAoc3VmZml4ID09IG51bGwgPyAiIiA6IHN1ZmZpeCksIG1hcDEuZ2V0KCJwcm90b2NvbCIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBNYXAgdG9rZW4gdmFsdWUiLCAidG9rZW4iICsgaW5kZXgsIG1hcDEuZ2V0KCJ0b2tlbiIpKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2ltcG9ydHMvSW1wb3J0VG9zY2FDYXBhYmlsaXRpZXNXaXRoUHJvcGVydGllcy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9JbXBvcnRUb3NjYUNhcGFiaWxpdGllc1dpdGhQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3YzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2ltcG9ydHMvSW1wb3J0VG9zY2FDYXBhYmlsaXRpZXNXaXRoUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsNDE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5JbXBvcnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCisvKioKKyAqIFVTIFVTNzMwNTE4IFN0b3J5IFtCRV0gLSBUT1NDQSBjYXBhYmlsaXRpZXMgd2l0aCBwcm9wZXJ0aWVzIC0gaW1wb3J0ICJBcyBhCisgKiByZXNvdXJjZSBkZXNpZ25lciwgSSB3b3VsZCBsaWtlIHRvIGFkZCBteSBWRkMgY2FwYWJpbGl0aWVzIHdpdGggcHJvcGVydGllcy4iCisgKiAKKyAqIEBhdXRob3IgbnMwMTl0CisgKgorICovCitwdWJsaWMgY2xhc3MgSW1wb3J0VG9zY2FDYXBhYmlsaXRpZXNXaXRoUHJvcGVydGllcyBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCS8qKgorCSAqIHB1YmxpYyBDb25zdHJ1Y3RvciBJbXBvcnRUb3NjYUNhcGFiaWxpdGllc1dpdGhQcm9wZXJ0aWVzCisJICovCisJcHVibGljIEltcG9ydFRvc2NhQ2FwYWJpbGl0aWVzV2l0aFByb3BlcnRpZXMoKSB7CisJCXN1cGVyKG5hbWUsIEltcG9ydFRvc2NhQ2FwYWJpbGl0aWVzV2l0aFByb3BlcnRpZXMuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnRzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvcGVydHlGb3JUZXN0TmFtZSA9ICJwcm9wZXJ0eWZvcnRlc3QiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvb3RQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjYWxhYmxlID0gInRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGFpbmVyID0gInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pbkluc3RhbmNlcyA9ICJtaW5faW5zdGFuY2VzIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VyRGVmaW5lZE5vZGVZYW1sID0gIm15Y29tcHV0ZS55bWwiOworCisJLyoqCisJICogQ2FwYWJpbGl0eSBUeXBlIC0gY2FwYWJpbGl0eSB0eXBlIG9uIHRoZSBncmFwaCBzaG91bGQgYWxyZWFkeSBoYXZlCisJICogcHJvcGVydGllcyBtb2RlbGVkIG9uIGl0LiBwbGVhc2UgdmVyaWZ5LiBUaGUgaW1wb3J0IG9mIHRoZSBjYXBhYmlsaXR5CisJICogdHlwZXMgc2hvdWxkIHN1cHBvcnQgYWRkaW5nIHRob3NlIHByb3BlcnRpZXMuIHdoZW4gaW1wb3J0aW5nLCB2YWxpZGF0ZQorCSAqIG5hbWUgdW5pcXVlbmVzcyBiZXR3ZWVuIHRoZSBjYXBhYmlsaXR5J3MgcHJvcGVydGllcyBzZWUgY2FwYWJpbGl0eQorCSAqIHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKwkgKiAKKwkgKiBBY2NlcHRhbmNlIENyaXRlcmlhOiB2YWxpZGF0ZSBjYXBhYmlsaXR5IHR5cGUgcHJvcGVydGllcyAoZm9yIGV4YW1wbGUsCisJICogY29tcHV0ZSBoYXZlIGNhcGFiaWxpdHkgQ29udGFpbmVyIC0+IHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgY2FwYWJpbGl0eQorCSAqIHNob3VsZCBiZSBpbiB0aGUgSnNvbiByZXNwb25zZSkKKwkgKiAKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNhcGFiaWxpdHlUeXBlUHJvcGVydGllc1N1Y2NlZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VSZXMgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlci5nZXRVc2VySWQoKSwgIkNvbXB1dGUiLAorCQkJCSIxLjAiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY3JlYXRlUmVzb3VyY2VSZXMpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVJlc291cmNlUmVzLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzID0gcmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWFzc2VydEVxdWFscyhjYXBhYmlsaXRpZXMuc2l6ZSgpLCA2KTsKKworCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmdldChzY2FsYWJsZSkuZ2V0KDApOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnRpZXMgPSBjYXBhYmlsaXR5LmdldFByb3BlcnRpZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKHByb3BlcnRpZXMuc2l6ZSgpLCAzKTsKKwkJYXNzZXJ0VHJ1ZSghcHJvcGVydGllcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnR5Rm9yVGVzdE5hbWUpKS5maW5kQW55KCkKKwkJCQkuaXNQcmVzZW50KCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgb3JpZ2luYWxQcm9wZXJ0eSA9IHByb3BlcnRpZXMuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtaW5JbnN0YW5jZXMpKS5maW5kQW55KCkuZ2V0KCk7CisJCWFzc2VydEVxdWFscyhvcmlnaW5hbFByb3BlcnR5LmdldFR5cGUoKSwgImludGVnZXIiKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsUHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCksICIxIik7CisKKwkJY2FwYWJpbGl0eSA9IGNhcGFiaWxpdGllcy5nZXQoY29udGFpbmVyKS5nZXQoMCk7CisJCXByb3BlcnRpZXMgPSBjYXBhYmlsaXR5LmdldFByb3BlcnRpZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKHByb3BlcnRpZXMuc2l6ZSgpLCA0KTsKKwl9CisKKwkvKioKKwkgKiBDYXBhYmlsaXR5IERlZmluaXRpb24gb24gVkZDIC8gQ1AgLyBWTCAtIHByb3BlcnRpZXMgY2FuIGFsc28gYmUgZGVmaW5lZAorCSAqIG9uIHRoZSBjYXBhYmlsaXR5IHdoZW4gdGhlIGNhcGFiaWxpdHkgaXMgZGVjbGFyZWQuIChwcm9wZXJ0eSBkZWZpbml0aW9uCisJICogd2l0aCBkZWZhdWx0IHZhbHVlKSBJZiB0aGUgcHJvcGVydHkgbmFtZSAoY2FzZSBpbnNlbnNpdGl2ZSkgYWxyZWFkeQorCSAqIGRlZmluZWQgb24gdGhlIGNhcGFiaWxpdHkgdHlwZSwgaXQgb3ZlcnJpZGVzIHRoZSBjYXBhYmlsaXR5IGZyb20gdGhlCisJICogY2FwYWJpbGl0eSB0eXBlIEltcG9ydCBvZiBWRkMgLyBDUCAvVkwgc2hvdWxkIHN1cHBvcnQgYWRkaW5nIHByb3BlcnRpZXMKKwkgKiB0byB0aGUgY2FwYWJpbGl0eS4gd2hlbiBpbXBvcnRpbmcsIHZhbGlkYXRlIG5hbWUgdW5pcXVlbmVzcyBiZXR3ZWVuIHRoZQorCSAqIGNhcGFiaWxpdHkncyBwcm9wZXJ0aWVzCisJICogCisJICogQWNjZXB0YW5jZSBDcml0ZXJpYTogaW1wb3J0IG5vZGUgdHlwZSB3aXRoIGNhcGFiaWxpdHkgZGVmaW5pdGlvbiBvbiBpdC4KKwkgKiB1c2UgdGhlIGF0dGFjaGVkICJteUNvbXB1dGUiCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydE5vZGVUeXBlV2l0aENhcGFiaWxpdHlXaXRoUHJvcGVydGllc0Zyb21ZbWxTdWNjZWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUltcG9ydFJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IGltcG9ydFVzZXJEZWZpbmVkTm9kZVR5cGUodXNlckRlZmluZWROb2RlWWFtbCwgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllcyA9IHJlc291cmNlLmdldENhcGFiaWxpdGllcygpOworCQlhc3NlcnRFcXVhbHMoY2FwYWJpbGl0aWVzLnNpemUoKSwgNik7CisKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eSA9IGNhcGFiaWxpdGllcy5nZXQoc2NhbGFibGUpLmdldCgwKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0aWVzID0gY2FwYWJpbGl0eS5nZXRQcm9wZXJ0aWVzKCk7CisJCWFzc2VydEVxdWFscyhwcm9wZXJ0aWVzLnNpemUoKSwgNCk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBuZXdQcm9wZXJ0eSA9IHByb3BlcnRpZXMuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eUZvclRlc3ROYW1lKSkuZmluZEFueSgpLmdldCgpOworCQlhc3NlcnRFcXVhbHMobmV3UHJvcGVydHkuZ2V0VHlwZSgpLCAic3RyaW5nIik7CisJCWFzc2VydEVxdWFscyhuZXdQcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpLCAidGVzdCIpOworCQlhc3NlcnRFcXVhbHMobmV3UHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCksICJzdWNjZXNzIik7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBvdmVycmlkZGVuUHJvcGVydHkgPSBwcm9wZXJ0aWVzLnN0cmVhbSgpCisJCQkJLmZpbHRlcihwIC0+IHAuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWluSW5zdGFuY2VzKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhvdmVycmlkZGVuUHJvcGVydHkuZ2V0VHlwZSgpLCAiaW50ZWdlciIpOworCQlhc3NlcnRFcXVhbHMob3ZlcnJpZGRlblByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpLCAiMyIpOworCisJfQorCisJLyoqCisJICogaW1wb3J0Tm9kZVR5cGVXaXRoQ2FwYWJpbGl0eVdpdGhQcm9wZXJ0aWVzRnJvbVltbEZhaWxlZAorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnROb2RlVHlwZVdpdGhDYXBhYmlsaXR5V2l0aFByb3BlcnRpZXNGcm9tWW1sRmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUltcG9ydFJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IGltcG9ydFVzZXJEZWZpbmVkTm9kZVR5cGUoIm15Y29tcHV0ZV9mYWlsZWQueW1sIiwgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JNZXNzYWdlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UsIEFjdGlvblN0YXR1cy5QUk9QRVJUWV9OQU1FX0FMUkVBRFlfRVhJU1RTKTsKKwl9CisKKwkvKioKKwkgKiBDYXBhYmlsaXR5IEFzc2lnbm1lbnQgKG9uIG5vZGVfdGVtcGxhdGUgLyByZXNvdXJjZSBpbnN0YW5jZSkgLSBzaG91bGQKKwkgKiBzdXBwb3J0IGFzc2lnbm1lbnQgb2YgdGhlIHByb3BlcnR5IChwcm9wZXJ0eSB2YWx1ZSkuIE9uIHRoZSByZXNvdXJjZQorCSAqIGluc3RhbmNlIGxldmVsLCB2YWx1ZSBjYW4gYmUgYXNzaWduZWQgdG8gZWl0aGVyIHByb3BlcnRpZXMgdGhhdCBhcmUKKwkgKiBkZWZpbmVkIG9uIHRoZSBjYXBhYmlsaXR5IHR5cGUgb3Igb24gdGhlIGNhcGFiaWxpdHkgZGVmaW5pdGlvbi4gV2hlbgorCSAqIGltcG9ydGluZyBhIFZGIC0gdGhlIG5vZGVfdGVtcGxhdGUgY2FuIGhhdmUgY2FwYWJpbGl0eSdzIHByb3BlcnR5IHZhbHVlLgorCSAqIEl0IHNob3VsZCBiZSBpbXBvcnRlZCBhbmQgc2F2ZWQgb24gdGhlIGdyYXBoIEFjY2VwdGFuY2UgQ3JpdGVyaWE6IGltcG9ydAorCSAqIGEgVkYgdGhhdCBhc3NpZ24gdmFsdWVzIHRvIHByb3BlcnR5IG9mIGNhcGFiaWxpdHkgdGhhdCB3YXMgZGVmaW5lZCBvbiB0aGUKKwkgKiBjYXBhYmlsaXR5IHR5cGUKKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0UmVzb3VyY2VXaXRoQ2FwYWJpbGl0eVdpdGhQcm9wZXJ0aWVzT3ZlcnJpZGluZ0NhcFR5cGVQcm9wZXJ0aWVzU3VjY2VlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlTdHJpbmcgcGF5bG9hZE5hbWUgPSAidmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wLmNzYXIiOworCQlJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQlQYXRoIHBhdGggPSBQYXRocy5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92Zl93aXRoX2NhcF9wcm9wX292ZXJyaWRlX2NhcF90eXBlX3Byb3AuY3NhciIpOworCQlieXRlW10gZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+PiBwcm9wZXJ0eU5hbWVzVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXByb3BlcnR5TmFtZXNWYWx1ZXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPigibnVtX2NwdXMiLCAiMiIpKTsKKwkJcHJvcGVydHlOYW1lc1ZhbHVlcy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KCJtZW1fc2l6ZSIsICIyMDAwIE1CIikpOworCQljaGVja1Jlc291cmNlKGNyZWF0ZVJlc291cmNlLCA4LCBjb250YWluZXIsICJEQk1TIiwgcHJvcGVydHlOYW1lc1ZhbHVlcyk7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzMi5zZXRDc2FyVVVJRCgidmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wLmNzYXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzMi5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsczIsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCisJCWNoZWNrUmVzb3VyY2UoY3JlYXRlUmVzb3VyY2UsIDgsIGNvbnRhaW5lciwgIkRCTVMiLCBwcm9wZXJ0eU5hbWVzVmFsdWVzKTsKKwl9CisKKwkvKioKKwkgKiBpbXBvcnRSZXNvdXJjZVdpdGhDYXBhYmlsaXR5V2l0aFByb3BlcnRpZXNPdmVycmlkaW5nQ2FwVHlwZVByb3BlcnRpZXNGYWlsZWQKKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0UmVzb3VyY2VXaXRoQ2FwYWJpbGl0eVdpdGhQcm9wZXJ0aWVzT3ZlcnJpZGluZ0NhcFR5cGVQcm9wZXJ0aWVzRmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVN0cmluZyBwYXlsb2FkTmFtZSA9ICJ2Zl93aXRoX2NhcF9wcm9wX292ZXJyaWRlX2NhcF90eXBlX3Byb3BfZmFpbGVkLmNzYXIiOworCQlJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQlQYXRoIHBhdGggPSBQYXRocworCQkJCS5nZXQocm9vdFBhdGggKyAiL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92Zl93aXRoX2NhcF9wcm9wX292ZXJyaWRlX2NhcF90eXBlX3Byb3BfZmFpbGVkLmNzYXIiKTsKKwkJYnl0ZVtdIGRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCVN0cmluZyBwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWROYW1lKHBheWxvYWROYW1lKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvck1lc3NhZ2VSZXNwb25zZShjcmVhdGVSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFkpOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlsczIuc2V0Q3NhclVVSUQoInZmX3dpdGhfY2FwX3Byb3Bfb3ZlcnJpZGVfY2FwX3R5cGVfcHJvcF9mYWlsZWQuY3NhciIpOworCQlyZXNvdXJjZURldGFpbHMyLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvck1lc3NhZ2VSZXNwb25zZShjcmVhdGVSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFkpOworCisJfQorCisJLyoqCisJICogQ2FwYWJpbGl0eSBBc3NpZ25tZW50IChvbiBub2RlX3RlbXBsYXRlIC8gcmVzb3VyY2UgaW5zdGFuY2UpIC0gc2hvdWxkCisJICogc3VwcG9ydCBhc3NpZ25tZW50IG9mIHRoZSBwcm9wZXJ0eSAocHJvcGVydHkgdmFsdWUpLiBPbiB0aGUgcmVzb3VyY2UKKwkgKiBpbnN0YW5jZSBsZXZlbCwgdmFsdWUgY2FuIGJlIGFzc2lnbmVkIHRvIGVpdGhlciBwcm9wZXJ0aWVzIHRoYXQgYXJlCisJICogZGVmaW5lZCBvbiB0aGUgY2FwYWJpbGl0eSB0eXBlIG9yIG9uIHRoZSBjYXBhYmlsaXR5IGRlZmluaXRpb24uIFdoZW4KKwkgKiBpbXBvcnRpbmcgYSBWRiAtIHRoZSBub2RlX3RlbXBsYXRlIGNhbiBoYXZlIGNhcGFiaWxpdHkncyBwcm9wZXJ0eSB2YWx1ZS4KKwkgKiBJdCBzaG91bGQgYmUgaW1wb3J0ZWQgYW5kIHNhdmVkIG9uIHRoZSBncmFwaCBBY2NlcHRhbmNlIENyaXRlcmlhOiBpbXBvcnQKKwkgKiBhIFZGIHRoYXQgYXNzaWduIHZhbHVlcyB0byBwcm9wZXJ0eSBvZiBjYXBhYmlsaXR5IHRoYXQgd2FzIGRlZmluZWQgb24gdGhlCisJICogY2FwYWJpbGl0eSBkZWZpbml0aW9uIChvbiB0aGUgbm9kZSB0eXBlKQorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRSZXNvdXJjZVdpdGhDYXBhYmlsaXR5V2l0aFByb3BlcnRpZXNPdmVycmlkaW5nTm9kZVR5cGVDYXBQcm9wZXJ0aWVzU3VjY2VlZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUltcG9ydFJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IGltcG9ydFVzZXJEZWZpbmVkTm9kZVR5cGUodXNlckRlZmluZWROb2RlWWFtbCwgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSB1c2VyRGVmaW5lZE5vZGVUeXBlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksCisJCQkJUmVzb3VyY2UuY2xhc3MpOworCisJCVN0cmluZyBwYXlsb2FkTmFtZSA9ICJ2Zl93aXRoX2NhcF9wcm9wX292ZXJyaWRlX2NhcF90eXBlX3Byb3AxLmNzYXIiOworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJUGF0aCBwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wMS5jc2FyIik7CisJCWJ5dGVbXSBkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZERhdGEocGF5bG9hZERhdGEpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkTmFtZShwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPj4gcHJvcGVydHlOYW1lc1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlwcm9wZXJ0eU5hbWVzVmFsdWVzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4oIm51bV9jcHVzIiwgIjIiKSk7CisJCXByb3BlcnR5TmFtZXNWYWx1ZXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPigibWVtX3NpemUiLCAiMjAwMCBNQiIpKTsKKwkJY2hlY2tSZXNvdXJjZShjcmVhdGVSZXNvdXJjZSwgOCwgY29udGFpbmVyLCAiREJNUyIsIHByb3BlcnR5TmFtZXNWYWx1ZXMpOworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4+IHByb3BlcnR5TmFtZXNWYWx1ZXMxID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXByb3BlcnR5TmFtZXNWYWx1ZXMxLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4ocHJvcGVydHlGb3JUZXN0TmFtZSwgInN1Y2Nlc3NfYWdhaW4iKSk7CisJCXByb3BlcnR5TmFtZXNWYWx1ZXMxLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4obWluSW5zdGFuY2VzLCAiNCIpKTsKKwkJY2hlY2tSZXNvdXJjZShjcmVhdGVSZXNvdXJjZSwgOCwgc2NhbGFibGUsIHVzZXJEZWZpbmVkTm9kZVR5cGUuZ2V0TmFtZSgpLCBwcm9wZXJ0eU5hbWVzVmFsdWVzMSk7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzMi5zZXRDc2FyVVVJRCgidmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wMS5jc2FyIik7CisJCXJlc291cmNlRGV0YWlsczIuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMyLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKworCQljaGVja1Jlc291cmNlKGNyZWF0ZVJlc291cmNlLCA4LCBjb250YWluZXIsICJEQk1TIiwgcHJvcGVydHlOYW1lc1ZhbHVlcyk7CisJCWNoZWNrUmVzb3VyY2UoY3JlYXRlUmVzb3VyY2UsIDgsIHNjYWxhYmxlLCB1c2VyRGVmaW5lZE5vZGVUeXBlLmdldE5hbWUoKSwgcHJvcGVydHlOYW1lc1ZhbHVlczEpOworCisJfQorCisJLyoqCisJICogaW1wb3J0UmVzb3VyY2VXaXRoQ2FwYWJpbGl0eVdpdGhQcm9wZXJ0aWVzT3ZlcnJpZGluZ05vZGVUeXBlQ2FwUHJvcGVydGllc0ZhaWxlZAorCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRSZXNvdXJjZVdpdGhDYXBhYmlsaXR5V2l0aFByb3BlcnRpZXNPdmVycmlkaW5nTm9kZVR5cGVDYXBQcm9wZXJ0aWVzRmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJSW1wb3J0UmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gaW1wb3J0VXNlckRlZmluZWROb2RlVHlwZSh1c2VyRGVmaW5lZE5vZGVZYW1sLCBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisKKwkJU3RyaW5nIHBheWxvYWROYW1lID0gInZmX3dpdGhfY2FwX3Byb3Bfb3ZlcnJpZGVfY2FwX3R5cGVfcHJvcDFfZmFpbGVkLmNzYXIiOworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJUGF0aCBwYXRoID0gUGF0aHMKKwkJCQkuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wMV9mYWlsZWQuY3NhciIpOworCQlieXRlW10gZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZShjcmVhdGVSZXNvdXJjZSwgQWN0aW9uU3RhdHVzLlBST1BFUlRZX05BTUVfQUxSRUFEWV9FWElTVFMsCisJCQkJcHJvcGVydHlGb3JUZXN0TmFtZSk7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzMi5zZXRDc2FyVVVJRCgidmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wMV9mYWlsZWQuY3NhciIpOworCQlyZXNvdXJjZURldGFpbHMyLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGNyZWF0ZVJlc291cmNlLCBBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTkFNRV9BTFJFQURZX0VYSVNUUywKKwkJCQlwcm9wZXJ0eUZvclRlc3ROYW1lKTsKKwl9CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZSBpbXBvcnRVc2VyRGVmaW5lZE5vZGVUeXBlKFN0cmluZyBwYXlsb2FkTmFtZSwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJSW1wb3J0UmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCisJCVBhdGggcGF0aCA9IFBhdGhzLmdldChyb290UGF0aCArICIvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzLyIgKyBwYXlsb2FkTmFtZSk7CisJCWJ5dGVbXSBkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZERhdGEocGF5bG9hZERhdGEpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkTmFtZShwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMubmFtZSgpKTsKKwkJcmV0dXJuIFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJfQorCisJLy8gVE9ETyBUYWw6IFNpbmNlIENhc2hpbmcgY2hhbmdlIHBhcnRpYWwgcmVzb3VyY2UgcmV0dXJuZWQgdGhhdCBjYXVzZXMgbnVsbAorCS8vIHBvaW50ZXIgZXhjZXB0aW9uCisJLy8gY29tbWVudGVkIG91dCB0aWxsIGZpeGluZworCXByaXZhdGUgdm9pZCBjaGVja1Jlc291cmNlKFJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSwgaW50IGNhcE51bSwgU3RyaW5nIGNhcFR5cGUsIFN0cmluZyByaU5hbWUsCisJCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+PiBwcm9wZXJ0eU5hbWVzVmFsdWVzKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzID0gcmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCS8vIFRPRE8gVGFsOiBTaW5jZSBDYXNoaW5nIGNoYW5nZSBwYXJ0aWFsIHJlc291cmNlIHJldHVybmVkIHRoYXQgY2F1c2VzCisJCS8vIG51bGwgcG9pbnRlciBleGNlcHRpb24KKwkJLyogYXNzZXJ0RXF1YWxzKGNhcGFiaWxpdGllcy5zaXplKCksIGNhcE51bSk7ICovCisJCS8qCisJCSAqIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGVzQ29udGFpbmVyID0KKwkJICogY2FwYWJpbGl0aWVzLmdldChjYXBUeXBlKTsKKwkJICovCisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VSSSA9IHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnN0cmVhbSgpCisJCQkJLmZpbHRlcihyaSAtPiByaS5nZXRDb21wb25lbnROYW1lKCkuZXF1YWxzKHJpTmFtZSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkuZ2V0KDApOworCQkvLyBUT0RPIFRhbDogU2luY2UgQ2FzaGluZyBjaGFuZ2UgcGFydGlhbCByZXNvdXJjZSByZXR1cm5lZCB0aGF0IGNhdXNlcworCQkvLyBudWxsIHBvaW50ZXIgZXhjZXB0aW9uCisJCS8qCisJCSAqIENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlGcm9tQ29udGFpbmVyID0KKwkJICogY2FwYWJpbGl0ZXNDb250YWluZXIuc3RyZWFtKCkKKwkJICogLmZpbHRlcihjYXAtPmNhcC5nZXRPd25lcklkKCkuZXF1YWxzKHJlc291cmNlUkkuZ2V0VW5pcXVlSWQoKSkpLgorCQkgKiBjb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLmdldCgwKTsKKwkJICovCisKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eUZyb21SSSA9IHJlc291cmNlUkkuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KGNhcFR5cGUpLmdldCgwKTsKKwkJZm9yIChJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBwcm9wVmFsdWVQYWlyIDogcHJvcGVydHlOYW1lc1ZhbHVlcykgeworCQkJLy8gVE9ETyBUYWw6IFNpbmNlIENhc2hpbmcgY2hhbmdlIHBhcnRpYWwgcmVzb3VyY2UgcmV0dXJuZWQgdGhhdAorCQkJLy8gY2F1c2VzIG51bGwgcG9pbnRlciBleGNlcHRpb24KKwkJCS8qCisJCQkgKiBNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0aWVzRnJvbUNvbnRhaW5lciA9CisJCQkgKiBjYXBhYmlsaXR5RnJvbUNvbnRhaW5lci5nZXRQcm9wZXJ0aWVzKCkKKwkJCSAqIC5zdHJlYW0oKS5maWx0ZXIocC0+cC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wVmFsdWVQYWlyLgorCQkJICogZ2V0TGVmdCgpKSkgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwLT5wLmdldE5hbWUoKSwgcC0+cCkpOworCQkJICovCisKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllc0Zyb21SSSA9IGNhcGFiaWxpdHlGcm9tUkkuZ2V0UHJvcGVydGllcygpLnN0cmVhbSgpCisJCQkJCS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHByb3BWYWx1ZVBhaXIuZ2V0TGVmdCgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCS8vIFRPRE8gVGFsOiBTaW5jZSBDYXNoaW5nIGNoYW5nZSBwYXJ0aWFsIHJlc291cmNlIHJldHVybmVkIHRoYXQKKwkJCS8vIGNhdXNlcyBudWxsIHBvaW50ZXIgZXhjZXB0aW9uCisJCQkvKgorCQkJICogZm9yKENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmlQcm9wIDogcHJvcGVydGllc0Zyb21SSSl7CisJCQkgKiBhc3NlcnRUcnVlKHByb3BlcnRpZXNGcm9tQ29udGFpbmVyLmNvbnRhaW5zS2V5KHJpUHJvcC5nZXROYW1lKCkpKQorCQkJICogOyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGNvbnRhaW5lclByb3AgPQorCQkJICogcHJvcGVydGllc0Zyb21Db250YWluZXIuZ2V0KHJpUHJvcC5nZXROYW1lKCkpOworCQkJICogYXNzZXJ0RXF1YWxzKHJpUHJvcC5nZXRWYWx1ZSgpLCBjb250YWluZXJQcm9wLmdldFZhbHVlKCkpOworCQkJICogaWYocmlQcm9wLmdldE5hbWUoKS5lcXVhbHMocHJvcFZhbHVlUGFpci5nZXRMZWZ0KCkpKQorCQkJICogYXNzZXJ0RXF1YWxzKHJpUHJvcC5nZXRWYWx1ZSgpLCBwcm9wVmFsdWVQYWlyLmdldFJpZ2h0KCkpOworCQkJICogCisJCQkgKiB9CisJCQkgKi8KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9JbXBvcnRUb3NjYVJlc291cmNlVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9JbXBvcnRUb3NjYVJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OGJmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9pbXBvcnRzL0ltcG9ydFRvc2NhUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNDA0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzOworCitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUzsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5DbGllbnRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb3BlcnR5RGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkF0dHJpYnV0ZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwUmVxRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVsYXRpb25zaGlwSW1wbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5JbXBvcnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRlY29kZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkltcG9ydFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db21wb25lbnRSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlRvc2NhTm9kZVR5cGVJbmZvOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIEFuZHJleSArIFBhdmVsICsgU2hheQorICoKKyAqLworCitwdWJsaWMgY2xhc3MgSW1wb3J0VG9zY2FSZXNvdXJjZVRlc3QgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEltcG9ydFRvc2NhUmVzb3VyY2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJvdGVjdGVkIFV0aWxzIHV0aWxzID0gbmV3IFV0aWxzKCk7CisKKwlwdWJsaWMgSW1wb3J0VG9zY2FSZXNvdXJjZVRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIEltcG9ydFRvc2NhUmVzb3VyY2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIEltcG9ydFJlcURldGFpbHMgaW1wb3J0UmVxRGV0YWlsczsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY1VzZXJEZXRhaWxzOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciB0ZXN0ZXJVc2VyOworCXByb3RlY3RlZCBTdHJpbmcgdGVzdFJlc291cmNlc1BhdGg7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gY2FwYWJpbGl0eVNvdXJjZXM7CisJcHJpdmF0ZSBpbnQgYWN0dWFsTnVtT2ZSZXFPckNhcDsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWltcG9ydFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJdGVzdGVyVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJU3RyaW5nIHNvdXJjZURpciA9IGNvbmZpZy5nZXRSZXNvdXJjZUNvbmZpZ0RpcigpOworCQlmaW5hbCBTdHJpbmcgd29ya0RpciA9ICJpbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwiOworCQl0ZXN0UmVzb3VyY2VzUGF0aCA9IHNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgd29ya0RpcjsKKwkJY2FwYWJpbGl0eVNvdXJjZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWFjdHVhbE51bU9mUmVxT3JDYXAgPSAwOworCX0KKworCUBEYXRhUHJvdmlkZXIKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGdldFltbFdpdGhJblZhbGlkTGlzdFByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7IHsgIkxpc3RQcm9wZXJ0eUZhbHVyZTAyLnltbCIsICJbZmFsc2UsXCJ0cnVlZVwiXSIsICJib29sZWFuIiB9LCB7ICJMaXN0UHJvcGVydHlGYWx1cmUwMy55bWwiLCAiW2ZhbHNlLDNdIiwgImJvb2xlYW4iIH0sIHsgIkxpc3RQcm9wZXJ0eUZhbHVyZTA0LnltbCIsICJbZmFsc2UsMy41Nl0iLCAiYm9vbGVhbiIgfSwKKwkJCQl7ICJMaXN0UHJvcGVydHlGYWx1cmUwNS55bWwiLCAiWzEwMDAwLDMuNTZdIiwgImludGVnZXIiIH0sIHsgIkxpc3RQcm9wZXJ0eUZhbHVyZTA2LnltbCIsICJbMTAwMDAsXCJhYWFhXCJdIiwgImludGVnZXIiIH0sIHsgIkxpc3RQcm9wZXJ0eUZhbHVyZTA3LnltbCIsICJbMTAwMDAsdHJ1ZV0iLCAiaW50ZWdlciIgfSwKKwkJCQl7ICJMaXN0UHJvcGVydHlGYWx1cmUwOC55bWwiLCAiWzEwLjUsdHJ1ZV0iLCAiZmxvYXQiIH0sIHsgIkxpc3RQcm9wZXJ0eUZhbHVyZTA5LnltbCIsICJbMTAuNSxcImFzZGNcIl0iLCAiZmxvYXQiIH0sIC8vIHR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZsb2F0CisJCQkJeyAiTGlzdFByb3BlcnR5RmFsdXJlMTEueW1sIiwgIlsxMC41LFwiNTAwLjBAXCJdIiwgImZsb2F0IiB9LCAvLyBwcm9wZXJ0eQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsaXN0CisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZsb2F0CisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29udGFpbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBACisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWUKKwkJCQl7ICJMaXN0UHJvcGVydHlGYWx1cmUxMi55bWwiLCAiWzEwMDAwLFwiMyNcIl0iLCAiaW50ZWdlciIgfSwgLy8gcHJvcGVydHkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbGlzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnRlZ2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29udGFpbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAjCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWUKKwkJCQl7ICJMaXN0UHJvcGVydHlGYWx1cmUxMy55bWwiLCAiW2ZhbHNlLFwidHJ1ZSVcIl0iLCAiYm9vbGVhbiIgfSwgLy8gcHJvcGVydHkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbGlzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBib29sZWFuCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29udGFpbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAlCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWUKKwkJCQl7ICJMaXN0UHJvcGVydHlGYWx1cmUxNC55bWwiLCAiW2ZhbHNlLFwiZmFsc2VlXCIsdHJ1ZV0iLCAiYm9vbGVhbiIgfSwgeyAiTGlzdFByb3BlcnR5RmFsdXJlMTUueW1sIiwgIlsxMC41LFwiMTAuNnhcIiwyMC41LDMwLjVdIiwgImZsb2F0IiB9IC8vIGZsb2F0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3aXRoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMTAuNngKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluc3RlYWQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDEwLjZmCisKKwkJfTsKKwl9CisKKwlARGF0YVByb3ZpZGVyCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBnZXRZbWxXaXRoSW5WYWxpZE1hcFByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7IHsgIk1hcFByb3BlcnR5RmFsdXJlMDIueW1sIiwgIltmYWxzZSxcInRydWVlXCJdIiwgImJvb2xlYW4iIH0sIHsgIk1hcFByb3BlcnR5RmFsdXJlMDMueW1sIiwgIltmYWxzZSwzXSIsICJib29sZWFuIiB9LCB7ICJNYXBQcm9wZXJ0eUZhbHVyZTA0LnltbCIsICJbZmFsc2UsMy41Nl0iLCAiYm9vbGVhbiIgfSwKKwkJCQl7ICJNYXBQcm9wZXJ0eUZhbHVyZTA1LnltbCIsICJbMTAwMDAsMy41Nl0iLCAiaW50ZWdlciIgfSwgeyAiTWFwUHJvcGVydHlGYWx1cmUwNi55bWwiLCAiWzEwMDAwLFwiYWFhYVwiXSIsICJpbnRlZ2VyIiB9LCB7ICJNYXBQcm9wZXJ0eUZhbHVyZTA3LnltbCIsICJbMTAwMDAsdHJ1ZV0iLCAiaW50ZWdlciIgfSwgeyAiTWFwUHJvcGVydHlGYWx1cmUwOC55bWwiLCAiWzEwLjUsdHJ1ZV0iLCAiZmxvYXQiIH0sCisJCQkJeyAiTWFwUHJvcGVydHlGYWx1cmUwOS55bWwiLCAiWzEwLjUsXCJhc2RjXCJdIiwgImZsb2F0IiB9LCAvLyB0eXBlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxvYXQKKwkJCQl7ICJNYXBQcm9wZXJ0eUZhbHVyZTExLnltbCIsICJbMTAuNSxcIjUwMC4wQFwiXSIsICJmbG9hdCIgfSwgLy8gcHJvcGVydHkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbGlzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmbG9hdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0eXBlCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbnRhaW4KKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gQAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkZWZhdWx0CisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHZhbHVlCisJCQkJeyAiTWFwUHJvcGVydHlGYWx1cmUxMi55bWwiLCAiWzEwMDAwLFwiMyNcIl0iLCAiaW50ZWdlciIgfSwgLy8gcHJvcGVydHkKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsaXN0CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaW50ZWdlcgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb250YWluCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gIworCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHZhbHVlCisJCQkJeyAiTWFwUHJvcGVydHlGYWx1cmUxMy55bWwiLCAiW2ZhbHNlLFwidHJ1ZSVcIl0iLCAiYm9vbGVhbiIgfSwgLy8gcHJvcGVydHkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbGlzdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBib29sZWFuCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29udGFpbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAlCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWUKKwkJCQl7ICJNYXBQcm9wZXJ0eUZhbHVyZTE0LnltbCIsICJbZmFsc2UsXCJmYWxzZWVcIix0cnVlXSIsICJib29sZWFuIiB9LCB7ICJNYXBQcm9wZXJ0eUZhbHVyZTE1LnltbCIsICJbMTAuNSxcIjEwLjZ4XCIsMjAuNSwzMC41XSIsICJmbG9hdCIgfSAvLyBmbG9hdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gd2l0aAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDEwLjZ4CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnN0ZWFkCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAxMC42ZgorCisJCX07CisJfQorCisJQERhdGFQcm92aWRlcgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gZ2V0WW1sV2l0aEluVmFsaWRPY2N1cnJlbmNlcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyAib2NjdXJlbmN5RmFsdXJlMDEueW1sIiB9LCAvLyByZXF1aXJlbWVudHMgWzIKKwkJCQkJCQkJCQkJCQkJCQkvLyAsIDBdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMDIueW1sIiB9LCAvLyByZXF1aXJlbWVudHMgWy0xLCAyXQorCQkJCXsgIm9jY3VyZW5jeUZhbHVyZTAzLnltbCIgfSwgLy8gcmVxdWlyZW1lbnRzIFsxICwtMl0KKwkJCQl7ICJvY2N1cmVuY3lGYWx1cmUwNS55bWwiIH0sIC8vIHJlcXVpcmVtZW50cyBNQVggb2NjdXJyZW5jZXMgbm90CisJCQkJCQkJCQkJCQkvLyBleGlzdCBbIDEgLCBdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMDYueW1sIiB9LCAvLyByZXF1aXJlbWVudHMgWyAwICwgMCBdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMDgueW1sIiB9LCAvLyByZXF1aXJlbWVudHMgWyAxLjAgLCAyLjAgXQorCQkJCXsgIm9jY3VyZW5jeUZhbHVyZTA5LnltbCIgfSwgLy8gcmVxdWlyZW1lbnRzIFsgIjEiICwgIjIiIF0KKwkJCQl7ICJvY2N1cmVuY3lGYWx1cmUxMC55bWwiIH0sIC8vIHJlcXVpcmVtZW50cyBbIF0KKwkJCQl7ICJvY2N1cmVuY3lGYWx1cmUxMS55bWwiIH0sIC8vIHJlcXVpcmVtZW50cyBbIFVOQk9VTkRFRCAsCisJCQkJCQkJCQkJCQkvLyBVTkJPVU5ERUQgXQorCQkJCXsgIm9jY3VyZW5jeUZhbHVyZTMxLnltbCIgfSwgLy8gY2FwYWJpbGl0eSBbIDIsIDFdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMzIueW1sIiB9LCAvLyBjYXBhYmlsaXR5IFstMSwgMl0KKwkJCQl7ICJvY2N1cmVuY3lGYWx1cmUzMy55bWwiIH0sIC8vIGNhcGFiaWxpdHkgWzEsIC0yXQorCQkJCXsgIm9jY3VyZW5jeUZhbHVyZTM1LnltbCIgfSwgLy8gY2FwYWJpbGl0eSBNQVggb2NjdXJyZW5jZXMgbm90CisJCQkJCQkJCQkJCQkvLyBleGlzdCBbIDEgLCBdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMzYueW1sIiB9LCAvLyBjYXBhYmlsaXR5IFsgMCAsIDAgXQorCQkJCXsgIm9jY3VyZW5jeUZhbHVyZTM4LnltbCIgfSwgLy8gY2FwYWJpbGl0eSBbIDEuMCAsIDIuMCBdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMzkueW1sIiB9LCAvLyBjYXBhYmlsaXR5IFsgIjEiICwgIjIiIF0KKwkJCQl7ICJvY2N1cmVuY3lGYWx1cmU0MC55bWwiIH0sIC8vIGNhcGFiaWxpdHkgWyBdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlNDEueW1sIiB9IC8vIGNhcGFiaWxpdHkgWyBVTkJPVU5ERUQgLAorCQkJCQkJCQkJCQkvLyBVTkJPVU5ERUQgXQorCQl9OworCX0KKworCUBEYXRhUHJvdmlkZXIKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGdldEludmFsaWRZbWxXaXRoT2NjdXJyZW5jZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7IHsgIm9jY3VyZW5jeUZhbHVyZTA0LnltbCIgfSwgLy8gcmVxdWlyZW1lbnRzIE1JTgorCQkJCQkJCQkJCQkJCQkJCS8vIG9jY3VycmVuY2VzCisJCQkJCQkJCQkJCQkJCQkJLy8gbm90IGV4aXN0IFsgLAorCQkJCQkJCQkJCQkJCQkJCS8vIDFdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMDcueW1sIiB9LCAvLyByZXF1aXJlbWVudHMgWyBAICwgMSBdCisJCQkJeyAib2NjdXJlbmN5RmFsdXJlMzQueW1sIiB9LCAvLyBjYXBhYmlsaXR5IE1JTiBvY2N1cnJlbmNlcyBub3QKKwkJCQkJCQkJCQkJCS8vIGV4aXN0IFsgLCAxXQorCQkJCXsgIm9jY3VyZW5jeUZhbHVyZTM3LnltbCIgfSAvLyBjYXBhYmlsaXR5IFsgMCAsICMgXQorCisJCX07CisJfQorCisJLy8gVVM2NTY5MjgKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGltcG9ydE1hcFByb3BlcnR5U3VjY2VzcyA9ICJpbXBvcnRNYXBQcm9wZXJ0eVN1Y2Nlc3NGbG93LnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnRBdHRyaWJ1dGVTdWNjZXNzID0gImltcG9ydEF0dHJpYnV0ZVN1Y2Nlc3NGbG93LnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnRTdWNjZXNzRmlsZSA9ICJteUNvbXB1dGUueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGRlcml2ZWRGcm9tTXlDb21wdXRlID0gImRlcml2ZWRGcm9tTXlDb21wdXRlLnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnRTdWNjZXNzVkZGaWxlID0gIm15Q29tcHV0ZVZGLnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnROb0Rlcml2ZWRGcm9tRmlsZSA9ICJteUNvbXB1dGVEZXJpdmVkRnJvbU5vdEV4aXN0cy55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0SW52YWxpZERlZmluaXRpb25WZXJzaW9uRmlsZSA9ICJteUNvbXB1dGVJbmNvcnJlY3REZWZlbml0aW9uVmVyc2lvblZhbHVlLnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnRJbmNvcnJlY3ROYW1lU3BhY2VGb3JtYXRGaWxlID0gIm15Q29tcHV0ZUluY29ycmVjdE5hbWVTcGFjZUZvcm1hdC55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0Tm9EZWZlbml0aW9uVmVyc2lvbkZpbGUgPSAibXlDb21wdXRlTm9EZWZlbml0aW9uVmVyc2lvbi55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0Tm9kZVR5cGVzVHdpY2VGaWxlID0gIm15Q29tcHV0ZVdpdGhOb2RlVHlwZXNUd2ljZS55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0VG9wb2xvZ3lUZW1wbGF0ZUZpbGUgPSAibXlDb21wdXRlV2l0aFRvcG9sb2d5VGVtcGxhdGUueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGltcG9ydE5vQ29udGVudEZpbGUgPSAibm9Db250ZW50LnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnRXaXRoT2NjdXJyZW5jZXMgPSAibXlDb21wdXRlT2NjdXJlbmN5U3VjY2Vzcy55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0TGlzdFByb3BlcnR5QmFkRGVmYXVsdCA9ICJpbXBvcnRMaXN0UHJvcGVydHlCYWREZWZhdWx0LnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnRMaXN0UHJvcGVydHlHb29kRGVmYXVsdCA9ICJpbXBvcnRMaXN0UHJvcGVydHlHb29kRGVmYXVsdC55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0TGlzdFByb3BlcnR5U3VjY2VzcyA9ICJpbXBvcnRMaXN0UHJvcGVydHlTdWNjZXNzRmxvdy55bWwiOworCS8vIFVTNjMxNDYyCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnREdXBsaWNhdGVSZXF1aXJlbWVudHMgPSAiaW1wb3J0RHVwbGljYXRlUmVxdWlyZW1lbnRzLnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnREdXBsaWNhdGVDYXBhYmlsaXR5ID0gImltcG9ydER1cGxpY2F0ZUNhcGFiaWxpdHkueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGltcG9ydENhcGFiaWxpdHlOYW1lRXhpc3RzT25QYXJlbnQgPSAiaW1wb3J0Q2FwYWJpbGl0eU5hbWVFeGlzdHNPblBhcmVudC55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0UmVxdWlyZW1lbnROYW1lRXhpc3RzT25QYXJlbnQgPSAiaW1wb3J0UmVxdWlyZW1lbnROYW1lRXhpc3RzT25QYXJlbnQueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGltcG9ydFRvc2NhUmVzb3VyY2VSZXFDYXBEZXJpdmVkRnJvbVBhcmVudCA9ICJkZXJpdmVkRnJvbVdlYkFwcERlcml2ZWRSZXFDYXAueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG1pc3NpbmdDYXBJblJlcURlZiA9ICJtaXNzaW5nQ2FwSW5SZXFEZWZpbml0aW9uLnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtaXNzaW5nQ2FwSW5DYXBEZWYgPSAibWlzc2luZ0NhcEluQ2FwRGVmaW5pdGlvbi55bWwiOworCisJLy8gVVM1NTg0MzIgLSBTdXBwb3J0IGZvciBDYXBhYmlsaXR5L1JlcXVpcmVtZW50ICJvY2N1cmVuY2VzIiBJbXBvcnQKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiZ2V0WW1sV2l0aEluVmFsaWRPY2N1cnJlbmNlcyIpCisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZVdpdGhPY2N1cnJlbmNlc0ZhaWx1cmVzRmxvdzAxKFN0cmluZyB5bWxGaWxlV2l0aEludmFsaWRDYXBSZXFPY2N1cnJlbmNlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCB5bWxGaWxlV2l0aEludmFsaWRDYXBSZXFPY2N1cnJlbmNlcyk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX09DQ1VSUkVOQ0VTLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gImdldEludmFsaWRZbWxXaXRoT2NjdXJyZW5jZXMiKQorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VXaXRoT2NjdXJyZW5jZXNGYWlsdXJlc0Zsb3cwMihTdHJpbmcgeW1sRmlsZVdpdGhJbnZhbGlkQ2FwUmVxT2NjdXJyZW5jZXMpIHRocm93cyBFeGNlcHRpb24geworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgeW1sRmlsZVdpdGhJbnZhbGlkQ2FwUmVxT2NjdXJyZW5jZXMpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydFRydWUoaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MX0ZJTEUubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgaW1wb3J0U3VjY2Vzc0ZpbGUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDEsIHJldHVybmVkIDoiICsgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlUb3NjYU5vZGVUeXBlSW5mbyBwYXJzZVRvc2NhTm9kZVlhbWwgPSB1dGlscy5wYXJzZVRvc2NhTm9kZVlhbWwoRGVjb2Rlci5kZWNvZGUoaW1wb3J0UmVxRGV0YWlscy5nZXRQYXlsb2FkRGF0YSgpKSk7CisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoInZhbGlkYXRlIHRvc2NhUmVzb3VyY2VOYW1lIGZpZWxkIiwgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFRvc2NhUmVzb3VyY2VOYW1lKCkuZXF1YWxzKHBhcnNlVG9zY2FOb2RlWWFtbC5nZXROb2RlTmFtZSgpKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoInZhbGlkYXRlIHJlc291cmNlVHlwZSBmaWVsZCIsIHJlc291cmNlSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMoUmVzb3VyY2VUeXBlRW51bS5WRkMpKTsKKwkJLy8gZmluZCBkZXJpdmVkIGZyb20gcmVzb3VyY2UgZGV0YWlscworCQkvLyBWYWxpZGF0ZSByZXNvdXJjZSBkZXRhaWxzIGFmdGVyIGltcG9ydC1jcmVhdGUgcmVzb3VyY2UgaW5jbHVkaW5nCisJCS8vIGNhcGFiaWxpdGllcywgaW50ZXJmYWNlcyBmcm9tIGRlcml2ZWRfZnJvbSByZXNvdXJjZQorCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dTdWNjZXNzKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZShwYXJzZVRvc2NhTm9kZVlhbWwuZ2V0Tm9kZU5hbWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VXaXRoT2NjdXJyZW5jZXNTdWNjZXNzRmxvdygpIHRocm93cyBFeGNlcHRpb24geworCisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRXaXRoT2NjdXJyZW5jZXMpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDEsIHJldHVybmVkIDoiICsgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlUb3NjYU5vZGVUeXBlSW5mbyBwYXJzZVRvc2NhTm9kZVlhbWwgPSB1dGlscy5wYXJzZVRvc2NhTm9kZVlhbWwoRGVjb2Rlci5kZWNvZGUoaW1wb3J0UmVxRGV0YWlscy5nZXRQYXlsb2FkRGF0YSgpKSk7CisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoInZhbGlkYXRlIHRvc2NhUmVzb3VyY2VOYW1lIGZpZWxkIiwgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFRvc2NhUmVzb3VyY2VOYW1lKCkuZXF1YWxzKHBhcnNlVG9zY2FOb2RlWWFtbC5nZXROb2RlTmFtZSgpKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoInZhbGlkYXRlIHJlc291cmNlVHlwZSBmaWVsZCIsIHJlc291cmNlSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMoUmVzb3VyY2VUeXBlRW51bS5WRkMpKTsKKwkJU3RyaW5nIHJlcXVpcmVtZW50c1R5cGUgPSAidG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQiOworCQlTdHJpbmcgY2FwYWJpbGl0VHlwZSA9ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4iOworCQkvLyBWZXJpZnkgT2NjdXJyZW5jZXMgb2YgcmVxdWlyZW1lbnRzIGFuZCBjYXBhYmlsaXRpZXMgaW4gcmVzb3VyY2UKKwkJdmVyaWZ5UmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMocmVzb3VyY2VKYXZhT2JqZWN0LCByZXF1aXJlbWVudHNUeXBlKTsKKwkJdmVyaWZ5Q2FwYWJpbGl0aWVzT2NjdXJyZW5jZXMocmVzb3VyY2VKYXZhT2JqZWN0LCBjYXBhYmlsaXRUeXBlKTsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dTdWNjZXNzKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZShwYXJzZVRvc2NhTm9kZVlhbWwuZ2V0Tm9kZU5hbWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TdWNjZXNzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZVZGUmVzVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyByZXNvdXJjZVR5cGUgPSBSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCk7CisKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFN1Y2Nlc3NWRkZpbGUpOworCQkvLyBpbXBvcnRSZXFEZXRhaWxzLnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDEsIHJldHVybmVkIDoiICsgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlUb3NjYU5vZGVUeXBlSW5mbyBwYXJzZVRvc2NhTm9kZVlhbWwgPSB1dGlscy5wYXJzZVRvc2NhTm9kZVlhbWwoRGVjb2Rlci5kZWNvZGUoaW1wb3J0UmVxRGV0YWlscy5nZXRQYXlsb2FkRGF0YSgpKSk7CisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydFRydWUoInZhbGlkYXRlIHRvc2NhUmVzb3VyY2VOYW1lIGZpZWxkIiwgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFRvc2NhUmVzb3VyY2VOYW1lKCkuZXF1YWxzKHBhcnNlVG9zY2FOb2RlWWFtbC5nZXROb2RlTmFtZSgpKSk7CisJCWFzc2VydFRydWUoInZhbGlkYXRlIHJlc291cmNlVHlwZSBmaWVsZCwgZXhwZWN0ZWQgLSAiICsgcmVzb3VyY2VUeXBlICsgIiwgYWN0dWFsIC0gIiArIHJlc291cmNlSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKSwgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKHJlc291cmNlVHlwZSkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dTdWNjZXNzKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZShwYXJzZVRvc2NhTm9kZVlhbWwuZ2V0Tm9kZU5hbWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1GYWlsdXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VEZXJpdmVkRnJvbU5vdEV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gaW1wb3J0Tm9EZXJpdmVkRnJvbUZpbGU7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmaWxlTmFtZSk7CisJCS8vIExpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIDsKKwkJLy8gZGVyaXZlZEZyb20uYWRkKCJoaCIpOworCQkvLyBpbXBvcnRSZXFEZXRhaWxzLnNldERlcml2ZWRGcm9tKGRlcml2ZWRGcm9tKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlsb2dnZXIuZGVidWcoImltcG9ydCB0b3NjYSByZXNvdXJjZSByZXNwb25zZToge30iLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgdG9zY2EgcmVzb3VyY2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHRvc2NhIHJlc291cmNlIiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5QQVJFTlRfUkVTT1VSQ0VfTk9UX0ZPVU5ELm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5QQVJFTlRfUkVTT1VSQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnRmFpbHVyZShlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULm5hbWUoKSk7CisJCVRvc2NhTm9kZVR5cGVJbmZvIHBhcnNlVG9zY2FOb2RlWWFtbCA9IHV0aWxzLnBhcnNlVG9zY2FOb2RlWWFtbChEZWNvZGVyLmRlY29kZShpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWREYXRhKCkpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZUluY29ycmVjdERlZmluaXRpb25WZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gaW1wb3J0SW52YWxpZERlZmluaXRpb25WZXJzaW9uRmlsZTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlsb2dnZXIuZGVidWcoImltcG9ydCB0b3NjYSByZXNvdXJjZSByZXNwb25zZToge30iLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgdG9zY2EgcmVzb3VyY2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHRvc2NhIHJlc291cmNlIiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX1RPU0NBX1RFTVBMQVRFLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1RPU0NBX1RFTVBMQVRFLm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnRmFpbHVyZShlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VJbmNvcnJlY3RTcGFjZU5hbWVGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBpbXBvcnRJbmNvcnJlY3ROYW1lU3BhY2VGb3JtYXRGaWxlOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCB0b3NjYSByZXNvdXJjZSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgdG9zY2EgcmVzb3VyY2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLklOVkFMSURfUkVTT1VSQ0VfTkFNRVNQQUNFLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1JFU09VUkNFX05BTUVTUEFDRS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2VBdWRpdE1zZ0ZhaWx1cmUoZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRUb3NjYVJlc291cmNlTm9EZWZpbml0aW9uVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGltcG9ydE5vRGVmZW5pdGlvblZlcnNpb25GaWxlOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCB0b3NjYSByZXNvdXJjZSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgdG9zY2EgcmVzb3VyY2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLklOVkFMSURfVE9TQ0FfVEVNUExBVEUubmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHRvc2NhIHJlc291cmNlIGltcG9ydCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfVE9TQ0FfVEVNUExBVEUubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZU5vQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGltcG9ydE5vQ29udGVudEZpbGU7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJbG9nZ2VyLmRlYnVnKCJpbXBvcnQgdG9zY2EgcmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHRvc2NhIHJlc291cmNlIiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCB0b3NjYSByZXNvdXJjZSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuSU5WQUxJRF9SRVNPVVJDRV9QQVlMT0FELm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1JFU09VUkNFX1BBWUxPQUQubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZVdpdGhUb3BvbG9neVRlbXBsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gaW1wb3J0VG9wb2xvZ3lUZW1wbGF0ZUZpbGU7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJbG9nZ2VyLmRlYnVnKCJpbXBvcnQgdG9zY2EgcmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHRvc2NhIHJlc291cmNlIiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCB0b3NjYSByZXNvdXJjZSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTk9UX1JFU09VUkNFX1RPU0NBX1RFTVBMQVRFLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5OT1RfUkVTT1VSQ0VfVE9TQ0FfVEVNUExBVEUubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZVdpdGhOb2RlVHlwZXNUd2ljZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGltcG9ydE5vZGVUeXBlc1R3aWNlRmlsZTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlsb2dnZXIuZGVidWcoImltcG9ydCB0b3NjYSByZXNvdXJjZSByZXNwb25zZToge30iLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBpbXBvcnQgdG9zY2EgcmVzb3VyY2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHRvc2NhIHJlc291cmNlIiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5OT1RfU0lOR0xFX1JFU09VUkNFLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5OT1RfU0lOR0xFX1JFU09VUkNFLm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnRmFpbHVyZShlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKwl9CisKKwkvLyBmYWlsZWQgY2FzZSAtIHVuaXF1ZW5lc3Mgb2YgdG9zY2FSZXNvdXJjZU5hbWUgLSBSRVNPVVJDRV9BTFJFQURZX0VYSVNUUworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZVR3aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9IGltcG9ydFN1Y2Nlc3NGaWxlOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDEsIHJldHVybmVkIDoiICsgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlSZXNvdXJjZSByZXNvdXJjZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJbnJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRUcnVlKCJjaGVja0luIHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyBjaGVja0lucmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIGNoZWNrSW5yZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dTdWNjZXNzKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCVRvc2NhTm9kZVR5cGVJbmZvIHBhcnNlVG9zY2FOb2RlWWFtbCA9IHV0aWxzLnBhcnNlVG9zY2FOb2RlWWFtbChEZWNvZGVyLmRlY29kZShpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWREYXRhKCkpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKHBhcnNlVG9zY2FOb2RlWWFtbC5nZXROb2RlTmFtZSgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCisJCS8vIGltcG9ydCB0aGUgc2FtZSB0b3NjYSByZXNvdXJjZSB3aXRoIGRpZmZlcmVudCByZXNvdXJjZU5hbWUKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgia3VrdSIpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyh0YWdzKTsKKwkJaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCB0b3NjYSByZXNvdXJjZSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgdG9zY2EgcmVzb3VyY2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0FMUkVBRFlfRVhJU1RTLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9BTFJFQURZX0VYSVNUUy5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKGltcG9ydFJlcURldGFpbHMuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZVdpdGhUaGVTYW1lTmFtZUFzQ3JlYXRlZFJlc291cmNlQmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVN0cmluZyBmaWxlTmFtZSA9IGltcG9ydFN1Y2Nlc3NGaWxlOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCisJCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydEVxdWFscygiY3JlYXRlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyBzdGF0dXMsIDIwMSwgc3RhdHVzKTsKKwkJYXNzZXJ0Tm90TnVsbCgicmVzb3VyY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBhc3NlcnROdWxsKCJ2YWxpZGF0ZSB0b3NjYVJlc291cmNlTmFtZSBmaWVsZCIsCisJCS8vIHJlc291cmNlSmF2YU9iamVjdC5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKworCQkvLyBpbXBvcnQgdGhlIHNhbWUgdG9zY2EgcmVzb3VyY2UKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGltcG9ydCB0b3NjYSByZXNvdXJjZSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBpbXBvcnQgdG9zY2EgcmVzb3VyY2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0FMUkVBRFlfRVhJU1RTLm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB0b3NjYSByZXNvdXJjZSBpbXBvcnQiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9BTFJFQURZX0VYSVNUUy5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2VBdWRpdE1zZ0ZhaWx1cmUoZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VJbnZhbGlkQ2hlY2tzdW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0gaW1wb3J0U3VjY2Vzc0ZpbGU7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmaWxlTmFtZSk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5Db250ZW50X01ENS5nZXRWYWx1ZSgpLCAiaW52YWxpZE1kNVN1bSIpOworCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBoZWFkZXJzTWFwKTsKKwkJbG9nZ2VyLmRlYnVnKCJpbXBvcnQgdG9zY2EgcmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHRvc2NhIHJlc291cmNlIiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGltcG9ydCB0b3NjYSByZXNvdXJjZSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuSU5WQUxJRF9SRVNPVVJDRV9DSEVDS1NVTS5uYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdG9zY2EgcmVzb3VyY2UgaW1wb3J0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9SRVNPVVJDRV9DSEVDS1NVTS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2VBdWRpdE1zZ0ZhaWx1cmUoZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRUb3NjYVJlc291cmNlSW52YWxpZFJlc1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gImludmFsaWRSZXNvdXJjZVR5cGUiOworCisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRTdWNjZXNzRmlsZSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgaW1wb3J0IHJlc291Y2UiLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgaW1wb3J0IHJlc291cmNlIiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnQgcmVzb3VyY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVyaXZlZFRlbXBsYXRlSW1wb3J0ZWRTZWNvbmRSZXNvdXJjZUFzRmlyc3RJbXBvcnRlZE5vZGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFN1Y2Nlc3NGaWxlKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlsb2dnZXIuZGVidWcoImltcG9ydCB0b3NjYSByZXNvdXJjZSByZXNwb25zZToge30iLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAxLCByZXR1cm5lZCA6IiArIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkJVG9zY2FOb2RlVHlwZUluZm8gcGFyc2VUb3NjYU5vZGVZYW1sID0gdXRpbHMucGFyc2VUb3NjYU5vZGVZYW1sKERlY29kZXIuZGVjb2RlKGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZERhdGEoKSkpOworCQlSZXNvdXJjZSByZXNvdXJjZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRUcnVlKCJ2YWxpZGF0ZSB0b3NjYVJlc291cmNlTmFtZSBmaWVsZCIsIHJlc291cmNlSmF2YU9iamVjdC5nZXRUb3NjYVJlc291cmNlTmFtZSgpLmVxdWFscyhwYXJzZVRvc2NhTm9kZVlhbWwuZ2V0Tm9kZU5hbWUoKSkpOworCQlhc3NlcnRUcnVlKCJ2YWxpZGF0ZSByZXNvdXJjZVR5cGUgZmllbGQsIGV4cGVjdGVkIC0gIiArIGltcG9ydFJlcURldGFpbHMuZ2V0UmVzb3VyY2VUeXBlKCkgKyAiLCBhY3R1YWwgLSAiICsgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpLCByZXNvdXJjZUphdmFPYmplY3QuZ2V0UmVzb3VyY2VUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoaW1wb3J0UmVxRGV0YWlscy5nZXRSZXNvdXJjZVR5cGUoKSkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dTdWNjZXNzKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZShwYXJzZVRvc2NhTm9kZVlhbWwuZ2V0Tm9kZU5hbWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2VydGlmeSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgY2VydGlmeVJlc291cmNlLmdldEVycm9yQ29kZSgpLCBjZXJ0aWZ5UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKworCQkvLyBpbXBvcnQgc2Vjb25kIHJlc291cmNlIHRlbXBsYXRlIGRlcml2ZWQgZnJvbSBmaXJzdCByZXNvdXJjZQorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgia3VrdSIpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyh0YWdzKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGRlcml2ZWRGcm9tTXlDb21wdXRlKTsKKwkJaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMSwgcmV0dXJuZWQgOiIgKyBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCXBhcnNlVG9zY2FOb2RlWWFtbCA9IHV0aWxzLnBhcnNlVG9zY2FOb2RlWWFtbChEZWNvZGVyLmRlY29kZShpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWREYXRhKCkpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VKYXZhT2JqZWN0MiA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydFRydWUoInZhbGlkYXRlIHRvc2NhUmVzb3VyY2VOYW1lIGZpZWxkIiwgcmVzb3VyY2VKYXZhT2JqZWN0Mi5nZXRUb3NjYVJlc291cmNlTmFtZSgpLmVxdWFscyhwYXJzZVRvc2NhTm9kZVlhbWwuZ2V0Tm9kZU5hbWUoKSkpOworCQlhc3NlcnRUcnVlKCJ2YWxpZGF0ZSByZXNvdXJjZVR5cGUgZmllbGQsIGV4cGVjdGVkIC0gIiArIGltcG9ydFJlcURldGFpbHMuZ2V0UmVzb3VyY2VUeXBlKCkgKyAiLCBhY3R1YWwgLSAiICsgcmVzb3VyY2VKYXZhT2JqZWN0Mi5nZXRSZXNvdXJjZVR5cGUoKSwgcmVzb3VyY2VKYXZhT2JqZWN0Mi5nZXRSZXNvdXJjZVR5cGUoKS50b1N0cmluZygpLmVxdWFscyhpbXBvcnRSZXFEZXRhaWxzLmdldFJlc291cmNlVHlwZSgpKSk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dTdWNjZXNzKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QyLnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QyLnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QyLnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QyLnNldFRvc2NhTm9kZVR5cGUocGFyc2VUb3NjYU5vZGVZYW1sLmdldE5vZGVOYW1lKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QyLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRUb3NjYVJlc291cmNlTGlzdFByb3BlcnR5R29vZERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZU5hbWUgPSBpbXBvcnRMaXN0UHJvcGVydHlHb29kRGVmYXVsdDsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlsb2dnZXIuZGVidWcoImltcG9ydCB0b3NjYSByZXNvdXJjZSByZXNwb25zZToge30iLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDEsIHJldHVybmVkIDoiICsgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydFRydWUoIlByb3BlcnRpZXMgc2l6ZSA6ICIgKyByZXNvdXJjZUphdmFPYmplY3QuZ2V0UHJvcGVydGllcygpLnNpemUoKSwgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMSk7CisJCWFzc2VydFRydWUoIlByb3BlcnR5IHR5cGUgOiAiICsgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFByb3BlcnRpZXMoKS5nZXQoMCkuZ2V0VHlwZSgpLCByZXNvdXJjZUphdmFPYmplY3QuZ2V0UHJvcGVydGllcygpLmdldCgwKS5nZXRUeXBlKCkuZXF1YWxzKFRvc2NhUHJvcGVydHlUeXBlLkxJU1QuZ2V0VHlwZSgpKSk7CisJCWFzc2VydFRydWUoImFjdHVhbCBEZWZhdWx0IHZhbHVlcyAgOiAiICsgcmVzb3VyY2VKYXZhT2JqZWN0LmdldFByb3BlcnRpZXMoKS5nZXQoMCkuZ2V0RGVmYXVsdFZhbHVlKCkgKyAiICwgZXhwZWN0ZWQgOiAiICsgIltmYWxzZSwgdHJ1ZV0iLCByZXNvdXJjZUphdmFPYmplY3QuZ2V0UHJvcGVydGllcygpLmdldCgwKS5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIltcImZhbHNlXCIsXCJ0cnVlXCJdIikpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRUb3NjYVJlc291cmNlTGlzdFByb3BlcnR5QmFkRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGltcG9ydExpc3RQcm9wZXJ0eUJhZERlZmF1bHQ7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJbG9nZ2VyLmRlYnVnKCJpbXBvcnQgdG9zY2EgcmVzb3VyY2UgcmVzcG9uc2U6IHt9IiwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBMRVhfREVGQVVMVF9WQUxVRS5uYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdG9zY2EgcmVzb3VyY2UgaW1wb3J0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCJteV9wcm9wIik7CisJCXZhcmlhYmxlcy5hZGQoImxpc3QiKTsKKwkJdmFyaWFibGVzLmFkZCgiYm9vbGVhbiIpOworCQl2YXJpYWJsZXMuYWRkKCJbMTIsdHJ1ZV0iKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBMRVhfREVGQVVMVF9WQUxVRS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCS8vIEJlbm55IFVTNTgwNzQ0IC0gQWRkIHN1cHBvcnQgZm9yIFRPU0NBICJsaXN0IiB0eXBlIC0gaW1wb3J0CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VMaXN0UHJvcGVydHlTdWNjZXNzRmxvdygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSBpbXBvcnRMaXN0UHJvcGVydHlTdWNjZXNzOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoaW1wb3J0UmVzb3VyY2VSZXNwb25zZSk7CisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCVRvc2NhTm9kZVR5cGVJbmZvIHBhcnNlVG9zY2FOb2RlWWFtbCA9IHV0aWxzLnBhcnNlVG9zY2FOb2RlWWFtbChEZWNvZGVyLmRlY29kZShpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWREYXRhKCkpKTsKKwkJLy8gVmVyaWZ5IFByb3BlcnRpZXMgTGlzdCBpbiByZXNvdXJjZQorCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnRpZXNMaXN0KHJlc291cmNlSmF2YU9iamVjdCk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnU3VjY2VzcygpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFRvc2NhTm9kZVR5cGUocGFyc2VUb3NjYU5vZGVZYW1sLmdldE5vZGVOYW1lKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisJfQorCisJLy8gREUxOTg1MzQKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiZ2V0WW1sV2l0aEluVmFsaWRMaXN0UHJvcGVydGllcyIpIC8vIGludmFsaWQgZGVmYXVsdAorCQkJCQkJCQkJCQkJCQkJLy8gdmFsdWVzCisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZUxpc3RQcm9wZXJ0eUZhaWx1cmVGbG93cyhTdHJpbmcgeW1sRmlsZVdpdGhJbnZhbGlkUHJvcGVydHlEZWZ1YWx0VmFsdWVzLCBTdHJpbmcgZGVmdWFsdFZhbHVlcywgU3RyaW5nIGVudGVyeVNjaGVtYVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgeW1sRmlsZVdpdGhJbnZhbGlkUHJvcGVydHlEZWZ1YWx0VmFsdWVzKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRUcnVlKGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZCgibXlfcHJvcGVydHkiKTsKKwkJdmFyaWFibGVzLmFkZCgibGlzdCIpOworCQl2YXJpYWJsZXMuYWRkKGVudGVyeVNjaGVtYVR5cGUpOworCQl2YXJpYWJsZXMuYWRkKGRlZnVhbHRWYWx1ZXMpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09NUExFWF9ERUZBVUxUX1ZBTFVFLm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCS8vIEJVRyBERTE5ODY1MAorCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZUxpc3RQcm9wZXJ0eU5vblN1cHBvcnRFbnRyeVNjaGVtYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHltbEZpbGUgPSAiTGlzdFByb3BlcnR5RmFsdXJlMDEueW1sIjsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIHltbEZpbGUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydFRydWUoaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCJib29vbGVhbiIpOyAvLyBwcm9wZXJ0eSBlbnRyeV9zY2hlbWEgZGF0YSB0eXBlCisJCXZhcmlhYmxlcy5hZGQoIm15X2Jvb2xlYW4iKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST1BFUlRZX0lOTkVSX1RZUEUubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJLy8gQlVHIERFMTk4Njc2CisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZUxpc3RQcm9wZXJ0eU5vblN1cHBvcnRlZFByb3BlcnR5VHlwZSgpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3QKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICJsaXN0IgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdHlwZQorCQlTdHJpbmcgeW1sRmlsZSA9ICJMaXN0UHJvcGVydHlGYWx1cmUxNi55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgeW1sRmlsZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoImtva28iKTsgLy8gcHJvcGVydHkgZGF0YSB0eXBlIChrb2tvIGluc3RlYWQgbGlzdCkKKwkJdmFyaWFibGVzLmFkZCgibXlfYm9vbGVhbiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFlfVFlQRS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwkvLy8gVVM2NTY5MjggLSBbQkVdIC0gQWRkIHN1cHBvcnQgZm9yIFRPU0NBICJtYXAiIHR5cGUgLSBQaGFzZSAxIGltcG9ydAorCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZU1hcFByb3BlcnR5U3VjY2Vzc0Zsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0gaW1wb3J0TWFwUHJvcGVydHlTdWNjZXNzOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoaW1wb3J0UmVzb3VyY2VSZXNwb25zZSk7CisJCVJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCVRvc2NhTm9kZVR5cGVJbmZvIHBhcnNlVG9zY2FOb2RlWWFtbCA9IHV0aWxzLnBhcnNlVG9zY2FOb2RlWWFtbChEZWNvZGVyLmRlY29kZShpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWREYXRhKCkpKTsKKwkJLy8gVmVyaWZ5IFByb3BlcnRpZXMgTUFQIGluIHJlc291cmNlCisJCXZlcmlmeVJlc291cmNlUHJvcGVydGllc01hcChyZXNvdXJjZUphdmFPYmplY3QpOworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2VBdWRpdE1zZ1N1Y2Nlc3MoKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKHBhcnNlVG9zY2FOb2RlWWFtbC5nZXROb2RlTmFtZSgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0KGRhdGFQcm92aWRlciA9ICJnZXRZbWxXaXRoSW5WYWxpZE1hcFByb3BlcnRpZXMiKSAvLyBpbnZhbGlkIGRlZmF1bHQKKwkJCQkJCQkJCQkJCQkJCS8vIHZhbHVlcworCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VNYXBQcm9wZXJ0eUZhaWx1cmVGbG93cyhTdHJpbmcgeW1sRmlsZVdpdGhJbnZhbGlkUHJvcGVydHlEZWZ1YWx0VmFsdWVzLCBTdHJpbmcgZGVmdWFsdFZhbHVlcywgU3RyaW5nIGVudGVyeVNjaGVtYVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgeW1sRmlsZVdpdGhJbnZhbGlkUHJvcGVydHlEZWZ1YWx0VmFsdWVzKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRUcnVlKGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZCgibXlfcHJvcGVydHkiKTsKKwkJdmFyaWFibGVzLmFkZCgibWFwIik7CisJCXZhcmlhYmxlcy5hZGQoZW50ZXJ5U2NoZW1hVHlwZSk7CisJCXZhcmlhYmxlcy5hZGQoZGVmdWFsdFZhbHVlcyk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT01QTEVYX0RFRkFVTFRfVkFMVUUubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRUb3NjYVJlc291cmNlTWFwdFByb3BlcnR5Tm9uU3VwcG9ydGVkUHJvcGVydHlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE5vdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gIk1hcCIKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHR5cGUKKwkJU3RyaW5nIHltbEZpbGUgPSAiTWFwUHJvcGVydHlGYWx1cmUxNi55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgeW1sRmlsZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoImtva28iKTsgLy8gcHJvcGVydHkgZGF0YSB0eXBlIChrb2tvIGluc3RlYWQgbGlzdCkKKwkJdmFyaWFibGVzLmFkZCgibXlfYm9vbGVhbiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFlfVFlQRS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VNaXNzaW5nQ2FwYWJpbGl0eUluUmVxRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IG1pc3NpbmdDYXBJblJlcURlZjsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlsb2dnZXIuZGVidWcoImltcG9ydCB0b3NjYSByZXNvdXJjZSByZXNwb25zZToge30iLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19DQVBBQklMSVRZX1RZUEUubmFtZSgpKTsKKwkJU3RyaW5nIG1pc3NpbmdDYXBOYW1lID0gIm9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5ldHdvcmtJbnRlcmZhY2VOb3RGb3VuZCI7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKGltcG9ydFJlc291cmNlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5NSVNTSU5HX0NBUEFCSUxJVFlfVFlQRSwgbWlzc2luZ0NhcE5hbWUpOworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnRmFpbHVyZShlcnJvckluZm8sIEFycmF5cy5hc0xpc3QobWlzc2luZ0NhcE5hbWUpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRUb3NjYU5vZGVUeXBlKCJvcmcub3BlbmVjb21wLnJlc291cmNlLnZTQ1AtMDMtMTYiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZU1pc3NpbmdDYXBhYmlsaXR5SW5DYXBEZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZpbGVOYW1lID0gbWlzc2luZ0NhcEluQ2FwRGVmOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWxvZ2dlci5kZWJ1ZygiaW1wb3J0IHRvc2NhIHJlc291cmNlIHJlc3BvbnNlOiB7fSIsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0NBUEFCSUxJVFlfVFlQRS5uYW1lKCkpOworCQlTdHJpbmcgbWlzc2luZ0NhcE5hbWUgPSAib3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmV0d29ya0ludGVyZmFjZU5vdEZvdW5kIjsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0Vycm9yUmVzcG9uc2UoaW1wb3J0UmVzb3VyY2VSZXNwb25zZSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ0FQQUJJTElUWV9UWVBFLCBtaXNzaW5nQ2FwTmFtZSk7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgQXJyYXlzLmFzTGlzdChtaXNzaW5nQ2FwTmFtZSkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFRvc2NhTm9kZVR5cGUoIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UudlNDUC0wMy0xNiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRUb3NjYVJlc291cmNlRHVwbGljYXRlUmVxdWlyZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnREdXBsaWNhdGVSZXF1aXJlbWVudHMpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydFRydWUoaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCJyZXF1aXJlbWVudCIpOworCQl2YXJpYWJsZXMuYWRkKCJsb2NhbF9zdG9yYWdlIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU1QT1JUX0RVUExJQ0FURV9SRVFfQ0FQX05BTUUubmFtZSgpLCB2YXJpYWJsZXMsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuSU1QT1JUX0RVUExJQ0FURV9SRVFfQ0FQX05BTUUubmFtZSgpKTsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQubmFtZSgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZUR1cGxpY2F0ZUNhcGFiaWxpdGllcygpIHRocm93cyBFeGNlcHRpb24geworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgaW1wb3J0RHVwbGljYXRlQ2FwYWJpbGl0eSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoImNhcGFiaWxpdHkiKTsKKwkJdmFyaWFibGVzLmFkZCgic2NhbGFibGUiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTVBPUlRfRFVQTElDQVRFX1JFUV9DQVBfTkFNRS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTVBPUlRfRFVQTElDQVRFX1JFUV9DQVBfTkFNRS5uYW1lKCkpOworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2VBdWRpdE1zZ0ZhaWx1cmUoZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRUb3NjYVJlc291cmNlUmVxdWlyZW1lbnROYW1lRXhpc3RzT25QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFJlcXVpcmVtZW50TmFtZUV4aXN0c09uUGFyZW50KTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRUcnVlKGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZCgicmVxdWlyZW1lbnQiKTsKKwkJdmFyaWFibGVzLmFkZCgibG9jYWxfc3RvcmFnZSIpOworCQl2YXJpYWJsZXMuYWRkKCJDb21wdXRlIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU1QT1JUX1JFUV9DQVBfTkFNRV9FWElTVFNfSU5fREVSSVZFRC5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTVBPUlRfUkVRX0NBUF9OQU1FX0VYSVNUU19JTl9ERVJJVkVELm5hbWUoKSk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnRmFpbHVyZShlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULm5hbWUoKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VDYXBhYmlsaXR5TmFtZUV4aXN0c09uUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRDYXBhYmlsaXR5TmFtZUV4aXN0c09uUGFyZW50KTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRUcnVlKGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZCgiY2FwYWJpbGl0eSIpOworCQl2YXJpYWJsZXMuYWRkKCJiaW5kaW5nIik7CisJCXZhcmlhYmxlcy5hZGQoIkNvbXB1dGUiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTVBPUlRfUkVRX0NBUF9OQU1FX0VYSVNUU19JTl9ERVJJVkVELm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLklNUE9SVF9SRVFfQ0FQX05BTUVfRVhJU1RTX0lOX0RFUklWRUQubmFtZSgpKTsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dGYWlsdXJlKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQubmFtZSgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0VG9zY2FSZXNvdXJjZVJlcUNhcERlcml2ZWRGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRUb3NjYVJlc291cmNlUmVxQ2FwRGVyaXZlZEZyb21QYXJlbnQpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShpbXBvcnRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQXVkaXRNc2dTdWNjZXNzKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoc2RuY1VzZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZSgib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeVdlYkFwcCIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKiBTaGF5ICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2FzZVJlcXVpcmVtZW50SW5zZW5zaXRpdmVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJDYXNlSW5zZW5zaXRpdmVSZXFUZXN0XzEueW1sIjsKKwkJaW50IGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMgPSAyOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9DUkVBVEVELCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFJlcXVpcmVtZW50cyh0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzID0gaW1wb3J0UmVxRGV0YWlscy5nZXRSZXF1aXJlbWVudHMoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJyZXF1aXJlbWVudHMiLCBpbXBvcnRSZXFEZXRhaWxzLCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlcXVpcmVtZW50cy5rZXlTZXQoKS5zaXplKCksIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhyZXF1aXJlbWVudHMsIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUxID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUxLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTIgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMyA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGZpbGVOYW1lMiA9ICJDYXNlSW5zZW5zaXRpdmVSZXFUZXN0XzIueW1sIjsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lMik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgic2Vjb25kSW1wb3J0ZWRSZXNvdXJjZSIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0UmVxdWlyZW1lbnRzKHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWROYW1lKCksIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCXJlcXVpcmVtZW50cyA9IGltcG9ydFJlcURldGFpbHMuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCXJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSA9IHBhcnNlUmVxT3JDYXBGcm9tUmVzcG9uc2UoInJlcXVpcmVtZW50cyIsIGltcG9ydFJlcURldGFpbHMsIGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMpOworCQlhc3NlcnRFcXVhbHMocmVxdWlyZW1lbnRzLmtleVNldCgpLnNpemUoKSwgcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlLmtleVNldCgpLnNpemUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuY29tcGFyZVJlcXVpcmVtZW50c09yQ2FwYWJpbGl0aWVzKHJlcXVpcmVtZW50cywgcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlKTsKKworCQljaGVja0ltcG9ydGVkQXNzZXRBc3NvY2lhdGVkKGltcG9ydFJlcURldGFpbHMpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrSW1wb3J0ZWRBc3NldEFzc29jaWF0ZWQoSW1wb3J0UmVxRGV0YWlscyBpbXBvcnREZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlOworCQlJbXBvcnRSZXFEZXRhaWxzIGltcG9ydFJlcURldGFpbHMyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCWltcG9ydFJlcURldGFpbHMyID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzMiwgdGVzdFJlc291cmNlc1BhdGgsICJCaW5kaW5nQXNzZXQueW1sIik7CisJCWltcG9ydFJlcURldGFpbHMyLnNldE5hbWUoImJpbmRpbmdBc3NldCIpOworCQlpbXBvcnRSZXFEZXRhaWxzMi5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlsczIuZ2V0TmFtZSgpKSk7CisJCWltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzMiwgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHZmID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJWRjEwMCIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uVkYudG9TdHJpbmcoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UodmYsIHNkbmNVc2VyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0RGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlsczIsIHNkbmNVc2VyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2VJbnN0YW5jZShpbXBvcnREZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIHZmLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlSW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczIsIHNkbmNVc2VyRGV0YWlscywgdmYuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UocmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZUJlZm9yZUFzc29jaWF0ZSA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jVXNlckRldGFpbHMsIHZmKTsKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VCZWZvcmVBc3NvY2lhdGUuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKworCQlTdHJpbmcgY2FwYmlsaXR5VWlkID0gY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUiKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKTsKKwkJU3RyaW5nIHJlcXVpcmVtZW50VWlkID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUiKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCXJlcXVpcmVtZW50RGVmLnNldEZyb21Ob2RlKHJpUmVxLmdldFVuaXF1ZUlkKCkpOworCQlyZXF1aXJlbWVudERlZi5zZXRUb05vZGUocmlDYXAuZ2V0VW5pcXVlSWQoKSk7CisKKwkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHBhaXIgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJpUmVxLmdldFVuaXF1ZUlkKCkpOworCQlwYWlyLnNldENhcGFiaWxpdHlPd25lcklkKHJpQ2FwLmdldFVuaXF1ZUlkKCkpOworCQlwYWlyLnNldFJlcXVpcmVtZW50KCJWaXJ0dWFsQmluZGluZyIpOworCQlSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcCA9IG5ldyBSZWxhdGlvbnNoaXBJbXBsKCk7CisJCXJlbGF0aW9uc2hpcC5zZXRUeXBlKCJ0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZSIpOworCQlwYWlyLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwKTsKKwkJcGFpci5zZXRDYXBhYmlsaXR5VWlkKGNhcGJpbGl0eVVpZCk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnRVaWQocmVxdWlyZW1lbnRVaWQpOworCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25zaGlwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlyZWxhdGlvbnNoaXBzLmFkZChwYWlyKTsKKwkJcmVxdWlyZW1lbnREZWYuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBzZG5jVXNlckRldGFpbHMsIHZmLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhc2VDYXBhYmlsaXRpZXNJbnNlbnNpdGl2ZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVOYW1lID0gIkNhc2VJbnNlbnNpdGl2ZUNhcFRlc3RfMS55bWwiOworCQlpbnQgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyA9IDY7CisKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfQ1JFQVRFRCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlpbXBvcnRSZXFEZXRhaWxzLnNldENhcGFiaWxpdGllcyh0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gY2FwYWJpbGl0aWVzID0gaW1wb3J0UmVxRGV0YWlscy5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJjYXBhYmlsaXRpZXMiLCBpbXBvcnRSZXFEZXRhaWxzLCBleHBlY3RlZE51bU9mQ2FwYWJpbGl0aWVzKTsKKwkJYXNzZXJ0RXF1YWxzKGNhcGFiaWxpdGllcy5rZXlTZXQoKS5zaXplKCksIGNhcGFiaWxpdGllc0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllc0Zyb21SZXNwb25zZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUxID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUxLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTIgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMyA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGZpbGVOYW1lMiA9ICJDYXNlSW5zZW5zaXRpdmVDYXBUZXN0XzIueW1sIjsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lMik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgic2Vjb25kSW1wb3J0ZWRSZXNvdXJjZSIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRDYXBhYmlsaXRpZXModGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lMiwgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJY2FwYWJpbGl0aWVzID0gaW1wb3J0UmVxRGV0YWlscy5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJY2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlID0gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZSgiY2FwYWJpbGl0aWVzIiwgaW1wb3J0UmVxRGV0YWlscywgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyk7CisJCWFzc2VydEVxdWFscyhjYXBhYmlsaXRpZXMua2V5U2V0KCkuc2l6ZSgpLCBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5jb21wYXJlUmVxdWlyZW1lbnRzT3JDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmYXRoZXJBbmRDaGlsZEhhdmVEaWZmZXJlbnRSZXF1aXJlbWVudHNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJEaWZmZXJlbnRSZXFGcm9tQ29tcHV0ZS55bWwiOworCQlpbnQgZXhwZWN0ZWROdW1PZlJlcXVpcmVtZW50cyA9IDM7CisKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfQ1JFQVRFRCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFJlcXVpcmVtZW50cyh0ZXN0UmVzb3VyY2VzUGF0aCwgZmlsZU5hbWUsIHNkbmNVc2VyRGV0YWlscywgIkNvbXB1dGUiKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHMgPSBpbXBvcnRSZXFEZXRhaWxzLmdldFJlcXVpcmVtZW50cygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSA9IHBhcnNlUmVxT3JDYXBGcm9tUmVzcG9uc2UoInJlcXVpcmVtZW50cyIsIGltcG9ydFJlcURldGFpbHMsIGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMpOworCQlhc3NlcnRFcXVhbHMocmVxdWlyZW1lbnRzLmtleVNldCgpLnNpemUoKSwgcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlLmtleVNldCgpLnNpemUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuY29tcGFyZVJlcXVpcmVtZW50c09yQ2FwYWJpbGl0aWVzKHJlcXVpcmVtZW50cywgcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlKTsKKworCQljaGVja0ltcG9ydGVkQXNzZXRBc3NvY2lhdGVkKGltcG9ydFJlcURldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmF0aGVySGFzTm9SZXF1aXJlbWVudHNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmYXRoZXJGaWxlTmFtZSA9ICJDUEhhc05vUmVxQ2FwLnltbCI7CisJCVN0cmluZyBjaGlsZEZpbGVOYW1lID0gIkRlcml2ZWRGcm9tQ1BXaXRoT3duUmVxLnltbCI7CisJCWludCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzID0gMzsKKworCQlpbXBvcnRSZXFEZXRhaWxzLnNldE5hbWUoImZhdGhlciIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmF0aGVyRmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9DUkVBVEVELCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlMS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUyID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUiksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTMgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBkZXJpdmVkRnJvbVJlc291cmNlTmFtZSA9IGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiY2hpbGQiKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGNoaWxkRmlsZU5hbWUpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRSZXF1aXJlbWVudHModGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZE5hbWUoKSwgc2RuY1VzZXJEZXRhaWxzLCBkZXJpdmVkRnJvbVJlc291cmNlTmFtZSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzID0gaW1wb3J0UmVxRGV0YWlscy5nZXRSZXF1aXJlbWVudHMoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJyZXF1aXJlbWVudHMiLCBpbXBvcnRSZXFEZXRhaWxzLCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlcXVpcmVtZW50cy5rZXlTZXQoKS5zaXplKCksIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhyZXF1aXJlbWVudHMsIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoaWxkSGFzU2FtZVJlcU5hbWVBbmRUeXBlTGlrZUZhdGhlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNoaWxkRmlsZU5hbWUgPSAiU2FtZVJlcUFzQ29tcHV0ZS55bWwiOworCQlpbnQgZXhwZWN0ZWROdW1PZlJlcXVpcmVtZW50cyA9IDI7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXROYW1lKCJjaGlsZCIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgY2hpbGRGaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRSZXF1aXJlbWVudHModGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZE5hbWUoKSwgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHMgPSBpbXBvcnRSZXFEZXRhaWxzLmdldFJlcXVpcmVtZW50cygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSA9IHBhcnNlUmVxT3JDYXBGcm9tUmVzcG9uc2UoInJlcXVpcmVtZW50cyIsIGltcG9ydFJlcURldGFpbHMsIGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMpOworCQlhc3NlcnRFcXVhbHMocmVxdWlyZW1lbnRzLmtleVNldCgpLnNpemUoKSwgcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlLmtleVNldCgpLnNpemUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuY29tcGFyZVJlcXVpcmVtZW50c09yQ2FwYWJpbGl0aWVzKHJlcXVpcmVtZW50cywgcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoaWxkSGFzU2FtZUNhcE5hbWVBbmRUeXBlTGlrZUZhdGhlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNoaWxkRmlsZU5hbWUgPSAiU2FtZUNhcEFzQ29tcHV0ZS55bWwiOworCQlpbnQgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyA9IDY7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXROYW1lKCJjaGlsZCIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgY2hpbGRGaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRDYXBhYmlsaXRpZXModGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZE5hbWUoKSwgc2RuY1VzZXJEZXRhaWxzLCAiQ29tcHV0ZSIpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdGllcyA9IGltcG9ydFJlcURldGFpbHMuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gY2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlID0gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZSgiY2FwYWJpbGl0aWVzIiwgaW1wb3J0UmVxRGV0YWlscywgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyk7CisJCWFzc2VydEVxdWFscyhjYXBhYmlsaXRpZXMua2V5U2V0KCkuc2l6ZSgpLCBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5jb21wYXJlUmVxdWlyZW1lbnRzT3JDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hpbGRHZXRzQWxsUmVxdWlyZW1lbnRzT2ZGYXRoZXJBbmRHcmFuZGZhdGhlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW50IGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMgPSA0OworCisJCVN0cmluZyBmYXRoZXJGaWxlTmFtZSA9ICJEaWZmZXJlbnRSZXFGcm9tQ29tcHV0ZS55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldE5hbWUoImZhdGhlciIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmF0aGVyRmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9DUkVBVEVELCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlMS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUyID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUiksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTMgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBkZXJpdmVkRnJvbU5hbWUgPSBpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKTsKKwkJU3RyaW5nIGNoaWxkRmlsZU5hbWUgPSAiRGlmZmVyZW50UmVxQ2FwRnJvbUNvbXB1dGUxLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXROYW1lKCJjaGlsZCIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgY2hpbGRGaWxlTmFtZSk7CisJCWltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfQ1JFQVRFRCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFJlcXVpcmVtZW50cyh0ZXN0UmVzb3VyY2VzUGF0aCwgaW1wb3J0UmVxRGV0YWlscy5nZXRQYXlsb2FkTmFtZSgpLCBzZG5jVXNlckRldGFpbHMsIGRlcml2ZWRGcm9tTmFtZSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzID0gaW1wb3J0UmVxRGV0YWlscy5nZXRSZXF1aXJlbWVudHMoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJyZXF1aXJlbWVudHMiLCBpbXBvcnRSZXFEZXRhaWxzLCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlcXVpcmVtZW50cy5rZXlTZXQoKS5zaXplKCksIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhyZXF1aXJlbWVudHMsIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoaWxkT3ZlcnJpZGVzR3JhbmRmYXRoZXJSZXF1aXJlbWVudHNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzID0gMzsKKworCQlTdHJpbmcgZmF0aGVyRmlsZU5hbWUgPSAiRGlmZmVyZW50UmVxRnJvbUNvbXB1dGUueW1sIjsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXROYW1lKCJmYXRoZXIiKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZhdGhlckZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfQ1JFQVRFRCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTEgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTEuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlMi5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUzID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUiksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlMy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgZGVyaXZlZEZyb21OYW1lID0gaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCk7CisJCVN0cmluZyBjaGlsZEZpbGVOYW1lID0gIlNhbWVSZXFBc0NvbXB1dGVfRGVyaXZlZEZyb21NeUNvbXB1dGUxLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXROYW1lKCJjaGlsZCIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgY2hpbGRGaWxlTmFtZSk7CisJCWltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfQ1JFQVRFRCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFJlcXVpcmVtZW50cyh0ZXN0UmVzb3VyY2VzUGF0aCwgaW1wb3J0UmVxRGV0YWlscy5nZXRQYXlsb2FkTmFtZSgpLCBzZG5jVXNlckRldGFpbHMsIGRlcml2ZWRGcm9tTmFtZSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzID0gaW1wb3J0UmVxRGV0YWlscy5nZXRSZXF1aXJlbWVudHMoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJyZXF1aXJlbWVudHMiLCBpbXBvcnRSZXFEZXRhaWxzLCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlcXVpcmVtZW50cy5rZXlTZXQoKS5zaXplKCksIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhyZXF1aXJlbWVudHMsIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGlsZEFuZEdyYW5kZmF0aGVySGF2ZURpZmZlcmVuZXRSZXFpdXJlbWVudFR5cGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzID0gMzsKKwkJaW50IGV4cGVjdGVkTnVtT2ZDYXBhYmlsaXRpZXMgPSA2OworCisJCVN0cmluZyBmYXRoZXJOYW1lID0gImZhdGhlciI7CisJCVN0cmluZyBmYXRoZXJGaWxlTmFtZSA9ICJEaWZmZXJlbnRSZXFGcm9tQ29tcHV0ZS55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldE5hbWUoZmF0aGVyTmFtZSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmYXRoZXJGaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUxID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUxLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTIgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMyA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGZhdGhlclVuaXF1ZUlkID0gaW1wb3J0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQlJbXBvcnRSZXFEZXRhaWxzIGltcG9ydFJlcURldGFpbHNGYXRoZXIgPSBpbXBvcnRSZXFEZXRhaWxzOworCisJCVN0cmluZyBjaGlsZEZpbGVOYW1lID0gImltcG9ydFJlcXVpcmVtZW50TmFtZUV4aXN0c09uUGFyZW50X0Rlcml2ZWRGcm9tTXlDb21wdXRlMS55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiY2hpbGQiKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGNoaWxkRmlsZU5hbWUpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoInJlcXVpcmVtZW50Iik7CisJCXZhcmlhYmxlcy5hZGQoImxvY2FsX3N0b3JhZ2UiKTsKKwkJdmFyaWFibGVzLmFkZChmYXRoZXJOYW1lKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTVBPUlRfUkVRX0NBUF9OQU1FX0VYSVNUU19JTl9ERVJJVkVELm5hbWUoKSwgdmFyaWFibGVzLCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCWltcG9ydFJlcURldGFpbHMuc2V0VW5pcXVlSWQoZmF0aGVyVW5pcXVlSWQpOworCisJCWltcG9ydFJlcURldGFpbHNGYXRoZXIuc2V0UmVxdWlyZW1lbnRzKHRlc3RSZXNvdXJjZXNQYXRoLCBmYXRoZXJGaWxlTmFtZSwgc2RuY1VzZXJEZXRhaWxzLCAiQ29tcHV0ZSIpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50cyA9IGltcG9ydFJlcURldGFpbHNGYXRoZXIuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlID0gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZSgicmVxdWlyZW1lbnRzIiwgaW1wb3J0UmVxRGV0YWlsc0ZhdGhlciwgZXhwZWN0ZWROdW1PZlJlcXVpcmVtZW50cyk7CisJCWFzc2VydEVxdWFscyhyZXF1aXJlbWVudHMua2V5U2V0KCkuc2l6ZSgpLCByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwkJaW1wb3J0UmVxRGV0YWlsc0ZhdGhlci5jb21wYXJlUmVxdWlyZW1lbnRzT3JDYXBhYmlsaXRpZXMocmVxdWlyZW1lbnRzLCByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UpOworCisJCWltcG9ydFJlcURldGFpbHNGYXRoZXIuc2V0Q2FwYWJpbGl0aWVzKHRlc3RSZXNvdXJjZXNQYXRoLCBmYXRoZXJGaWxlTmFtZSwgc2RuY1VzZXJEZXRhaWxzLCAiQ29tcHV0ZSIpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdGllcyA9IGltcG9ydFJlcURldGFpbHNGYXRoZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gY2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlID0gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZSgiY2FwYWJpbGl0aWVzIiwgaW1wb3J0UmVxRGV0YWlsc0ZhdGhlciwgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyk7CisJCWFzc2VydEVxdWFscyhjYXBhYmlsaXRpZXMua2V5U2V0KCkuc2l6ZSgpLCBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwkJaW1wb3J0UmVxRGV0YWlsc0ZhdGhlci5jb21wYXJlUmVxdWlyZW1lbnRzT3JDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hpbGRIYXNOb1JlcUNhcFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW50IGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMgPSAzOworCQlpbnQgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyA9IDY7CisKKwkJU3RyaW5nIGZhdGhlckZpbGVOYW1lID0gIkRpZmZlcmVudFJlcUZyb21Db21wdXRlLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiZmF0aGVyIik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmYXRoZXJGaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUxID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUxLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTIgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMyA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGRlcml2ZWRGcm9tTmFtZSA9IGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpOworCQlTdHJpbmcgY2hpbGRGaWxlTmFtZSA9ICJDUEhhc05vUmVxQ2FwX0Rlcml2ZWRGcm9tTXlDb21wdXRlMS55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiY2hpbGQiKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGNoaWxkRmlsZU5hbWUpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRSZXF1aXJlbWVudHModGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZE5hbWUoKSwgc2RuY1VzZXJEZXRhaWxzLCBkZXJpdmVkRnJvbU5hbWUpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50cyA9IGltcG9ydFJlcURldGFpbHMuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlID0gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZSgicmVxdWlyZW1lbnRzIiwgaW1wb3J0UmVxRGV0YWlscywgZXhwZWN0ZWROdW1PZlJlcXVpcmVtZW50cyk7CisJCWFzc2VydEVxdWFscyhyZXF1aXJlbWVudHMua2V5U2V0KCkuc2l6ZSgpLCByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5jb21wYXJlUmVxdWlyZW1lbnRzT3JDYXBhYmlsaXRpZXMocmVxdWlyZW1lbnRzLCByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UpOworCisJCWltcG9ydFJlcURldGFpbHMuc2V0Q2FwYWJpbGl0aWVzKHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWROYW1lKCksIHNkbmNVc2VyRGV0YWlscywgZGVyaXZlZEZyb21OYW1lKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXMgPSBpbXBvcnRSZXFEZXRhaWxzLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdGllc0Zyb21SZXNwb25zZSA9IHBhcnNlUmVxT3JDYXBGcm9tUmVzcG9uc2UoImNhcGFiaWxpdGllcyIsIGltcG9ydFJlcURldGFpbHMsIGV4cGVjdGVkTnVtT2ZDYXBhYmlsaXRpZXMpOworCQlhc3NlcnRFcXVhbHMoY2FwYWJpbGl0aWVzLmtleVNldCgpLnNpemUoKSwgY2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlLmtleVNldCgpLnNpemUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuY29tcGFyZVJlcXVpcmVtZW50c09yQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcywgY2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZhdGhlckFuZENoaWxkR2V0UmVxQ2FwRnJvbUdyYW5kZmF0aGVyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlpbnQgZXhwZWN0ZWROdW1PZlJlcXVpcmVtZW50cyA9IDI7CisJCWludCBleHBlY3RlZE51bU9mQ2FwYWJpbGl0aWVzID0gNjsKKworCQlTdHJpbmcgZmF0aGVyRmlsZU5hbWUgPSAiTXlGYXRoZXJDb21wdXRlX05vUmVxQ2FwLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiZmF0aGVyIik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmYXRoZXJGaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUxID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUxLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTIgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMyA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGRlcml2ZWRGcm9tTmFtZSA9IGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpOworCQlTdHJpbmcgY2hpbGRGaWxlTmFtZSA9ICJteUNoaWxkQ29tcHV0ZV9Ob1JlcUNhcC55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiY2hpbGQiKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGNoaWxkRmlsZU5hbWUpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRSZXF1aXJlbWVudHModGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZE5hbWUoKSwgc2RuY1VzZXJEZXRhaWxzLCBkZXJpdmVkRnJvbU5hbWUpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50cyA9IGltcG9ydFJlcURldGFpbHMuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlID0gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZSgicmVxdWlyZW1lbnRzIiwgaW1wb3J0UmVxRGV0YWlscywgZXhwZWN0ZWROdW1PZlJlcXVpcmVtZW50cyk7CisJCWFzc2VydEVxdWFscyhyZXF1aXJlbWVudHMua2V5U2V0KCkuc2l6ZSgpLCByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5jb21wYXJlUmVxdWlyZW1lbnRzT3JDYXBhYmlsaXRpZXMocmVxdWlyZW1lbnRzLCByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UpOworCisJCWltcG9ydFJlcURldGFpbHMuc2V0Q2FwYWJpbGl0aWVzKHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWROYW1lKCksIHNkbmNVc2VyRGV0YWlscywgZGVyaXZlZEZyb21OYW1lKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXMgPSBpbXBvcnRSZXFEZXRhaWxzLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdGllc0Zyb21SZXNwb25zZSA9IHBhcnNlUmVxT3JDYXBGcm9tUmVzcG9uc2UoImNhcGFiaWxpdGllcyIsIGltcG9ydFJlcURldGFpbHMsIGV4cGVjdGVkTnVtT2ZDYXBhYmlsaXRpZXMpOworCQlhc3NlcnRFcXVhbHMoY2FwYWJpbGl0aWVzLmtleVNldCgpLnNpemUoKSwgY2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlLmtleVNldCgpLnNpemUoKSk7CisJCWltcG9ydFJlcURldGFpbHMuY29tcGFyZVJlcXVpcmVtZW50c09yQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcywgY2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJldmVyc2VJbmhlcml0YW5jZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW50IGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMgPSAyOworCQlpbnQgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyA9IDI7CisKKwkJU3RyaW5nIGZhdGhlck5hbWUgPSAiZmF0aGVyIjsKKwkJU3RyaW5nIGZhdGhlckZpbGVOYW1lID0gIm15RmF0aGVyV2ViQXBwX2RlcnZpZWRGcm9tRG9ja2VyLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZShmYXRoZXJOYW1lKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZhdGhlckZpbGVOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVJbXBvcnRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfQ1JFQVRFRCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTEgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZTEuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlMi5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUzID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUiksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlMy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgZmF0aGVyVW5pcXVlSWQgPSBpbXBvcnRSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCUltcG9ydFJlcURldGFpbHMgaW1wb3J0UmVxRGV0YWlsc0ZhdGhlciA9IGltcG9ydFJlcURldGFpbHM7CisJCVN0cmluZyBjaGlsZEZpbGVOYW1lID0gIm15Q2hpbGRXZWJBcHBfRGVyaXZlZEZyb21Db250YWluZXIueW1sIjsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldE5hbWUoImNoaWxkIik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBjaGlsZEZpbGVOYW1lKTsKKwkJaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCJyZXF1aXJlbWVudCIpOworCQl2YXJpYWJsZXMuYWRkKCJob3N0Iik7CisJCXZhcmlhYmxlcy5hZGQoZmF0aGVyTmFtZSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU1QT1JUX1JFUV9DQVBfTkFNRV9FWElTVFNfSU5fREVSSVZFRC5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKGZhdGhlclVuaXF1ZUlkKTsKKwkJaW1wb3J0UmVxRGV0YWlsc0ZhdGhlci5zZXRSZXF1aXJlbWVudHModGVzdFJlc291cmNlc1BhdGgsIGZhdGhlckZpbGVOYW1lLCBzZG5jVXNlckRldGFpbHMsICJSb290Iik7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRzID0gaW1wb3J0UmVxRGV0YWlsc0ZhdGhlci5nZXRSZXF1aXJlbWVudHMoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJyZXF1aXJlbWVudHMiLCBpbXBvcnRSZXFEZXRhaWxzRmF0aGVyLCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlcXVpcmVtZW50cy5rZXlTZXQoKS5zaXplKCksIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzRmF0aGVyLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhyZXF1aXJlbWVudHMsIHJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSk7CisKKwkJaW1wb3J0UmVxRGV0YWlsc0ZhdGhlci5zZXRDYXBhYmlsaXRpZXModGVzdFJlc291cmNlc1BhdGgsIGZhdGhlckZpbGVOYW1lLCBzZG5jVXNlckRldGFpbHMsICJSb290Iik7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gY2FwYWJpbGl0aWVzID0gaW1wb3J0UmVxRGV0YWlsc0ZhdGhlci5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJjYXBhYmlsaXRpZXMiLCBpbXBvcnRSZXFEZXRhaWxzRmF0aGVyLCBleHBlY3RlZE51bU9mQ2FwYWJpbGl0aWVzKTsKKwkJYXNzZXJ0RXF1YWxzKGNhcGFiaWxpdGllcy5rZXlTZXQoKS5zaXplKCksIGNhcGFiaWxpdGllc0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzRmF0aGVyLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllc0Zyb21SZXNwb25zZSk7CisJfQorCisJLy8gREUyMDIzMjkKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgcmVxdWlyZW1lbnRXaXRoTWlzc2luZ1R5cGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmYXRoZXJOYW1lID0gImZhdGhlciI7CisJCVN0cmluZyBmYXRoZXJGaWxlTmFtZSA9ICJEZXJpdmVkRnJvbVdlYkFwcGxpY2F0aW9uX0hhc05vUmVxVHlwZS55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldE5hbWUoZmF0aGVyTmFtZSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmYXRoZXJGaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoImRpZmYiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNTSU5HX0NBUEFCSUxJVFlfVFlQRS5uYW1lKCksIHZhcmlhYmxlcywgaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVHdpbkJyb3RoZXJzSGF2ZVNhbWVSZXFDYXBUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludCBleHBlY3RlZE51bU9mUmVxdWlyZW1lbnRzID0gNDsKKwkJaW50IGV4cGVjdGVkTnVtT2ZDYXBhYmlsaXRpZXMgPSA3OworCisJCVN0cmluZyBkZXJpdmVkRnJvbU5hbWUgPSAiZmF0aGVyIjsKKwkJU3RyaW5nIGZhdGhlckZpbGVOYW1lID0gIkRpZmZlcmVudFJlcUZyb21Db21wdXRlLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZShkZXJpdmVkRnJvbU5hbWUpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlpbXBvcnRSZXFEZXRhaWxzID0gSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0UmVzb3VyY2VzUGF0aCwgZmF0aGVyRmlsZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9DUkVBVEVELCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlMSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlMS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUyID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUiksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZTMgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBjaGlsZEZpbGVOYW1lID0gIkRpZmZlcmVudFJlcUNhcEZyb21Db21wdXRlMS55bWwiOworCQlpbXBvcnRSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiY2hpbGQiKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoaW1wb3J0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGNoaWxkRmlsZU5hbWUpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZFJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSA9IHBhcnNlUmVxT3JDYXBGcm9tUmVzcG9uc2UoInJlcXVpcmVtZW50cyIsIGltcG9ydFJlcURldGFpbHMsIGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkQ2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlID0gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZSgiY2FwYWJpbGl0aWVzIiwgaW1wb3J0UmVxRGV0YWlscywgZXhwZWN0ZWROdW1PZkNhcGFiaWxpdGllcyAtIDEpOworCisJCVN0cmluZyB0d2luRmlsZU5hbWUgPSAiRGlmZmVyZW50UmVxQ2FwRnJvbUNvbXB1dGUyLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXROYW1lKCJ0d2luIik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KGltcG9ydFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCB0d2luRmlsZU5hbWUpOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX0NSRUFURUQsIGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRSZXF1aXJlbWVudHModGVzdFJlc291cmNlc1BhdGgsIGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZE5hbWUoKSwgc2RuY1VzZXJEZXRhaWxzLCBkZXJpdmVkRnJvbU5hbWUpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50cyA9IGltcG9ydFJlcURldGFpbHMuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gdHdpblJlcXVpcmVtZW50c0Zyb21SZXNwb25zZSA9IHBhcnNlUmVxT3JDYXBGcm9tUmVzcG9uc2UoInJlcXVpcmVtZW50cyIsIGltcG9ydFJlcURldGFpbHMsIGV4cGVjdGVkTnVtT2ZSZXF1aXJlbWVudHMpOworCQlhc3NlcnRFcXVhbHMocmVxdWlyZW1lbnRzLmtleVNldCgpLnNpemUoKSwgdHdpblJlcXVpcmVtZW50c0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLmNvbXBhcmVSZXF1aXJlbWVudHNPckNhcGFiaWxpdGllcyhyZXF1aXJlbWVudHMsIHR3aW5SZXF1aXJlbWVudHNGcm9tUmVzcG9uc2UpOworCisJCWltcG9ydFJlcURldGFpbHMuc2V0Q2FwYWJpbGl0aWVzKHRlc3RSZXNvdXJjZXNQYXRoLCBpbXBvcnRSZXFEZXRhaWxzLmdldFBheWxvYWROYW1lKCksIHNkbmNVc2VyRGV0YWlscywgZGVyaXZlZEZyb21OYW1lKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBhYmlsaXRpZXMgPSBpbXBvcnRSZXFEZXRhaWxzLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHR3aW5DYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2UgPSBwYXJzZVJlcU9yQ2FwRnJvbVJlc3BvbnNlKCJjYXBhYmlsaXRpZXMiLCBpbXBvcnRSZXFEZXRhaWxzLCBleHBlY3RlZE51bU9mQ2FwYWJpbGl0aWVzKTsKKwkJYXNzZXJ0RXF1YWxzKGNhcGFiaWxpdGllcy5rZXlTZXQoKS5zaXplKCksIHR3aW5DYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5jb21wYXJlUmVxdWlyZW1lbnRzT3JDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCB0d2luQ2FwYWJpbGl0aWVzRnJvbVJlc3BvbnNlKTsKKworCQlhc3NlcnRFcXVhbHMoY2hpbGRSZXF1aXJlbWVudHNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpLCB0d2luUmVxdWlyZW1lbnRzRnJvbVJlc3BvbnNlLmtleVNldCgpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhjaGlsZENhcGFiaWxpdGllc0Zyb21SZXNwb25zZS5rZXlTZXQoKS5zaXplKCksIHR3aW5DYXBhYmlsaXRpZXNGcm9tUmVzcG9uc2Uua2V5U2V0KCkuc2l6ZSgpKTsKKwl9CisKKwkvKgorCSAqIGludmFyaWFudFVVSUQgLSBVUzY3MjEyOQorCSAqLworCisJcHJpdmF0ZSB2b2lkIGNoZWNrSW52YXJpYW50VXVpZElzSW1tdXRhYmxlSW5EaWZmZXJlbnRBY3Rpb24oSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiaW1wb3J0Iik7CisJCVN0cmluZyBpbnZhcmlhbnRVdWlkRGVmaW5lZEJ5VXNlciA9ICJhYmNkMTIzNCI7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gaW1wb3J0UmVzb3VyY2VXaXRoUmVxdWVzdGVkSW52YXJpYW50VXVpZChpbXBvcnRSZXFEZXRhaWxzLCBpbnZhcmlhbnRVdWlkRGVmaW5lZEJ5VXNlcik7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEY3JlYXRpb24gPSBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKGltcG9ydFJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnRGYWxzZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVdWlkRGVmaW5lZEJ5VXNlciwgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSkpOworCisJCS8vIGdldCByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrSW52YXJpYW50VXVpZEVxdWFsKGludmFyaWFudFVVSURjcmVhdGlvbiwgZ2V0UmVzb3VyY2UpKTsKKworCQkvLyBjaGVja2luIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGNoYW5nZVJlc291cmNlU3RhdGUpKTsKKworCQkvLyBjaGVja291dCByZXNvdXJjZQorCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tJbnZhcmlhbnRVdWlkRXF1YWwoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBjaGFuZ2VSZXNvdXJjZVN0YXRlKSk7CisKKwkJLy8gY2hlY2tpbiByZXNvdXJjZQorCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGNoYW5nZVJlc291cmNlU3RhdGUpKTsKKworCQkvLyBjaGVja291dCByZXNvdXJjZQorCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tJbnZhcmlhbnRVdWlkRXF1YWwoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBjaGFuZ2VSZXNvdXJjZVN0YXRlKSk7CisKKwkJLy8gY2hlY2tpbiByZXNvdXJjZQorCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGNoYW5nZVJlc291cmNlU3RhdGUpKTsKKworCQkvLyBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrSW52YXJpYW50VXVpZEVxdWFsKGludmFyaWFudFVVSURjcmVhdGlvbiwgY2hhbmdlUmVzb3VyY2VTdGF0ZSkpOworCisJCS8vIHN0YXJ0IGNlcnRpZmljYXRpb24KKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHRlc3RlclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tJbnZhcmlhbnRVdWlkRXF1YWwoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBjaGFuZ2VSZXNvdXJjZVN0YXRlKSk7CisKKwkJLy8gY2VydGlmeQorCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgdGVzdGVyVXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tJbnZhcmlhbnRVdWlkRXF1YWwoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBjaGFuZ2VSZXNvdXJjZVN0YXRlKSk7CisJCVN0cmluZyBjZXJ0aWZpZWRVbmlxdWVJZCA9IGltcG9ydFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VSZXFEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhpbXBvcnRSZXFEZXRhaWxzLCBpbXBvcnRSZXFEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJCXVwZGF0ZWRSZXNvdXJjZVJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24oInVwZGF0ZWREZXNjcmlwdGlvbiIpOworCQl1cGRhdGVkUmVzb3VyY2VSZXFEZXRhaWxzLnNldFZlbmRvclJlbGVhc2UoIjEuMi4zLjQiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIGltcG9ydFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCB1cGRhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIHVwZGF0ZVJlc3BvbnNlKSk7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCWNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGNoYW5nZVJlc291cmNlU3RhdGUpKTsKKworCQkvLyBjaGVja291dCByZXNvdXJjZQorCQljaGFuZ2VSZXNvdXJjZVN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tJbnZhcmlhbnRVdWlkRXF1YWwoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBjaGFuZ2VSZXNvdXJjZVN0YXRlKSk7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCWNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGNoYW5nZVJlc291cmNlU3RhdGUpKTsKKworCQkvLyBzdGFydCBjZXJ0aWZpY2F0aW9uCisJCWNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0ZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrSW52YXJpYW50VXVpZEVxdWFsKGludmFyaWFudFVVSURjcmVhdGlvbiwgY2hhbmdlUmVzb3VyY2VTdGF0ZSkpOworCisJCS8vIGNhbmNlbCBjZXJ0aWZpY2F0aW9uCisJCWNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0ZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNBTkNFTENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGNoYW5nZVJlc291cmNlU3RhdGUpKTsKKworCQkvLyBzdGFydCBjZXJ0aWZpY2F0aW9uCisJCWNoYW5nZVJlc291cmNlU3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShpbXBvcnRSZXFEZXRhaWxzLCB0ZXN0ZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9TVUNDRVNTLCBjaGFuZ2VSZXNvdXJjZVN0YXRlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrSW52YXJpYW50VXVpZEVxdWFsKGludmFyaWFudFVVSURjcmVhdGlvbiwgY2hhbmdlUmVzb3VyY2VTdGF0ZSkpOworCisJCS8vIGZhaWx1cmUKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHRlc3RlclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uRkFJTENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgY2hhbmdlUmVzb3VyY2VTdGF0ZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGNoYW5nZVJlc291cmNlU3RhdGUpKTsKKworCQkvLyB1cGxvYWQgYXJ0aWZhY3QKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXJ0aWZhY3QoKTsKKwkJQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShhcnRpZmFjdERldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgaW1wb3J0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIGNoYW5nZVJlc291cmNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tJbnZhcmlhbnRVdWlkRXF1YWwoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBjaGFuZ2VSZXNvdXJjZVN0YXRlKSk7CisKKwkJLy8gY3JlYXRlIGluc3RhbmNlCisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi50b1N0cmluZygpKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKGNlcnRpZmllZFVuaXF1ZUlkKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9DUkVBVEVELCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0ludmFyaWFudFV1aWRFcXVhbChpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGdldFJlc291cmNlKSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrSW52YXJpYW50VXVpZEVxdWFsKFN0cmluZyBleHBlY3RlZEludmFyaWFudFV1aWQsIFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQlTdHJpbmcgaW52YXJpYW50VVVJREZyb21SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzcG9uc2UpOworCQlyZXR1cm4gZXhwZWN0ZWRJbnZhcmlhbnRVdWlkLmVxdWFscyhpbnZhcmlhbnRVVUlERnJvbVJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrQ1BIYXNJbW11dGFibGVJbnZhcmlhbnRVdWlkVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZW5hbWUgPSAiRmF0aGVySGFzTm9SZXFDYXAueW1sIjsKKwkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgdGVzdFJlc291cmNlc1BhdGgsIGZpbGVuYW1lKTsKKwkJY2hlY2tSZXNvdXJjZUhhc0ltbXV0YWJsZUludmFyaWFudFV1aWRUZXN0KGltcG9ydFJlcURldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tWRkNIYXNJbW11dGFibGVJbnZhcmlhbnRVdWlkVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZW5hbWUgPSAiY29tcHV0ZUNhcDExLnltbCI7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmaWxlbmFtZSk7CisJCWNoZWNrUmVzb3VyY2VIYXNJbW11dGFibGVJbnZhcmlhbnRVdWlkVGVzdChpbXBvcnRSZXFEZXRhaWxzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjaGVja1Jlc291cmNlSGFzSW1tdXRhYmxlSW52YXJpYW50VXVpZFRlc3QoSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gaW52YXJpYW50VXVpZCBpcyBudWxsCisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgiZmlyc3QiKTsKKwkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBpbXBvcnRSZXNvdXJjZVdpdGhSZXF1ZXN0ZWRJbnZhcmlhbnRVdWlkKGltcG9ydFJlcURldGFpbHMsIG51bGwpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRGNyZWF0aW9uID0gUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChpbXBvcnRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbChpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCVJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlKGltcG9ydFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQkvLyBpbnZhcmlhbnRVdWlkIGlzIGVtcHR5CisJCWltcG9ydFJlcURldGFpbHMuc2V0TmFtZSgic2Vjb25kIik7CisJCVN0cmluZyBpbnZhcmlhbnRVdWlkRGVmaW5lZEJ5VXNlciA9ICIiOworCQlpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gaW1wb3J0UmVzb3VyY2VXaXRoUmVxdWVzdGVkSW52YXJpYW50VXVpZChpbXBvcnRSZXFEZXRhaWxzLCBpbnZhcmlhbnRVdWlkRGVmaW5lZEJ5VXNlcik7CisJCWludmFyaWFudFVVSURjcmVhdGlvbiA9IFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQoaW1wb3J0UmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQlSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZShpbXBvcnRSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJY2hlY2tJbnZhcmlhbnRVdWlkSXNJbW11dGFibGVJbkRpZmZlcmVudEFjdGlvbihpbXBvcnRSZXFEZXRhaWxzKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VXaXRoUmVxdWVzdGVkSW52YXJpYW50VXVpZChJbXBvcnRSZXFEZXRhaWxzIGltcG9ydERldGFpbHMsIFN0cmluZyBpbnZhcmlhbnRVdWlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW1wb3J0RGV0YWlscy5zZXRJbnZhcmlhbnRVVUlEKGludmFyaWFudFV1aWQpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydERldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydEVxdWFscyhTVEFUVVNfQ09ERV9DUkVBVEVELCBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXR1cm4gaW1wb3J0UmVzb3VyY2VSZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyc2VSZXFPckNhcEZyb21SZXNwb25zZShTdHJpbmcgcGFyc2VkRmllbGROYW1lLCBJbXBvcnRSZXFEZXRhaWxzIGltcG9ydFJlcURldGFpbHMsIGludCBleHBlY3RlZE51bU9mUmVxQ2FwKSB0aHJvd3MgQ2xpZW50UHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUykpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcnNlZEZpZWxkRnJvbVJlc3BvbnNlVG9NYXAgPSBSZXNwb25zZVBhcnNlci5nZXRKc29uVmFsdWVBc01hcChnZXRSZXNvdXJjZSwgcGFyc2VkRmllbGROYW1lKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHBhcnNlZEZpZWxkRnJvbVJlc3BvbnNlVG9NYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJYWN0dWFsTnVtT2ZSZXFPckNhcCA9IDA7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOworCQkJTGlzdDxPYmplY3Q+IG9iamVjdCA9IChMaXN0PE9iamVjdD4pIHBhcnNlZEZpZWxkRnJvbVJlc3BvbnNlVG9NYXAuZ2V0KG5leHQpOworCQkJYWN0dWFsTnVtT2ZSZXFPckNhcCArPSBvYmplY3Quc2l6ZSgpOworCQl9CisJCWFzc2VydEVxdWFscyhleHBlY3RlZE51bU9mUmVxQ2FwLCBhY3R1YWxOdW1PZlJlcU9yQ2FwKTsKKwkJcmV0dXJuIHBhcnNlZEZpZWxkRnJvbVJlc3BvbnNlVG9NYXA7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0aWVzTGlzdChSZXNvdXJjZSByZXNvdXJjZUphdmFPYmplY3QpIHsgLy8gdXNlCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGltcG9ydExpc3RQcm9wZXJ0eVN1Y2Nlc3NGbG93LnltbAorCQlib29sZWFuIGlzUHJvcGVydHlBcHBlYXIgPSBmYWxzZTsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNMaXN0ID0gcmVzb3VyY2VKYXZhT2JqZWN0LmdldFByb3BlcnRpZXMoKTsKKwkJZm9yIChQcm9wZXJ0eURlZmluaXRpb24gcHJvIDogcHJvcGVydGllc0xpc3QpIHsKKwkJCXN3aXRjaCAocHJvLmdldE5hbWUoKSkgeworCQkJY2FzZSAibXlfYm9vbGVhbiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibGlzdCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiW2ZhbHNlLHRydWVdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiYm9vbGVhbiIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgIm15X2Jvb2xlYW5fYXJyYXkiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIlt0cnVlLGZhbHNlXSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImJvb2xlYW4iKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJkdXBsaWNhdGVfYm9vbGVhbl92YWx1ZXMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIlt0cnVlLGZhbHNlLHRydWVdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiYm9vbGVhbiIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImJvb2xlYW5fdmFsdWVzX0luc2Vuc2l0aXZlIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJsaXN0IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJbdHJ1ZSxmYWxzZSx0cnVlXSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImJvb2xlYW4iKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJteV9pbnRlZ2VycyI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibGlzdCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiWzAsMTAwMCwtMTAwMCw1MF0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJpbnRlZ2VyIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAibXlfaW50ZWdlcnNfYXJyYXkiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIlsxMCwtMTAwMCwwXSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImludGVnZXIiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJkdXBsaWNhdGVfaW50ZWdlcnNfdmFsdWVzIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJsaXN0IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJbMTAsMTAsLTEwMDAsMF0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJpbnRlZ2VyIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAibXlfc3RyaW5nIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJsaXN0IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJbXCJhc2RjXCIsXCIkP15AZWNvbXAkISMlKClfLX5AKypeLi4uOzsvdyNcIixcInVjXCJdIikpOworCQkJCS8vIGFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IGRlZmF1bHQgdmFsdWVzICIsCisJCQkJLy8gcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiW1wiYXNkY1wiLFwiQD1+IUAjJCVeJiooKV8rPT8+PDotd1wiLFwidWNcIl0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJzdHJpbmciKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJteV9zdHJpbmdfYXJyYXkiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIltcIkFBQVwiLFwifiR+I2JiYiVeKl8tXCIsXCJxd2VcIixcIjEuM1wiLFwiNTAwXCIsXCJ0cnVlXCJdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZHVwbGljYXRlX3N0cmluZ192YWx1ZXMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIltcImFzZGNcIixcImFzZGNcIixcInVjXCJdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX251bGxfdmFsdWUiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIltcImFzZGNcIixcInVjXCJdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3NwYWNlX3ZhbHVlIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJsaXN0IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJbXCJhc2RjXCIsXCJ1Y1wiXSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0cmluZ19hcnJheV9udWxsX3ZhbHVlIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJsaXN0IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJbXCJhYWFcIixcImJiYlwiLFwiNTAwXCJdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAibXlfZmxvYXQiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIls2LDEwMDAuMDAwMDAxLC0zLjBdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJteV9mbG9hdF9hcnJheSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibGlzdCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiWzAuMDEsLTUuMCwyLjFdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJkdXBsaWNhdGVfZmxvYXRfdmFsdWVzIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJsaXN0IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJbMC4wLDAuMCw0LjU1NTU1NV0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJmbG9hdCIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImZsb2F0X25vX2RlZmF1bHRfdmFsdWVzIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJsaXN0IikpOworCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKSwgbnVsbCk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJmbG9hdCIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImludGVnZXJfbm9fZGVmYXVsdF92YWx1ZXMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLCBudWxsKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImludGVnZXIiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJzdHJpbmdfbm9fZGVmYXVsdF92YWx1ZXMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLCBudWxsKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImJvb2xlYW5fbm9fZGVmYXVsdF92YWx1ZXMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLCBudWxsKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImJvb2xlYW4iKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJpbnRlZ2VyX251bGxfdmFsdWUiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIlsxMDAwLDIwMDBdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiaW50ZWdlciIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImJvb2xlYW5fbnVsbF92YWx1ZSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibGlzdCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiW3RydWUsZmFsc2VdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiYm9vbGVhbiIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImZsb2F0X251bGxfdmFsdWUiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoImxpc3QiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIls2LC0zLjBdIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJmbG9hdF9zcGFjZV92YWx1ZSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibGlzdCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiWzYsLTMuMF0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJmbG9hdCIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKworCQkJfQorCQkJYXNzZXJ0VHJ1ZShpc1Byb3BlcnR5QXBwZWFyKTsKKwkJCWlzUHJvcGVydHlBcHBlYXIgPSBmYWxzZTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIHZlcmlmeVJlcXVpcmVtZW50c09jY3VycmVuY2VzKFJlc291cmNlIHJlc291cmNlSmF2YU9iamVjdCwgU3RyaW5nIHJlcXVpcmVtZW50c1R5cGUpIHsKKwkJYm9vbGVhbiBpc1JlcXVpcmVtZW50QXBwZWFyID0gZmFsc2U7CisJCS8vIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1ZXJtZW50cyA9CisJCS8vIHJlc291cmNlSmF2YU9iamVjdC5nZXRSZXF1aXJlbWVudHMoKS5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50Iik7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1ZXJtZW50cyA9IHJlc291cmNlSmF2YU9iamVjdC5nZXRSZXF1aXJlbWVudHMoKS5nZXQocmVxdWlyZW1lbnRzVHlwZSk7CisKKwkJZm9yIChSZXF1aXJlbWVudERlZmluaXRpb24gcmVxIDogcmVxdWVybWVudHMpIHsKKwkJCXN3aXRjaCAocmVxLmdldE5hbWUoKSkgeworCQkJY2FzZSAibG9jYWxfc3RvcmFnZTEwMCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIFJlcXVpcmVtZW50IE9jY3VycmVuY2VzICIsIHJlcS5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscygiMSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNYXggUmVxdWlyZW1lbnQgT2NjdXJyZW5jZXMgIiwgcmVxLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKCJVTkJPVU5ERUQiKSk7CisJCQkJaXNSZXF1aXJlbWVudEFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJsb2NhbF9zdG9yYWdlMjAwIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNaW4gUmVxdWlyZW1lbnQgT2NjdXJyZW5jZXMgIiwgcmVxLmdldE1pbk9jY3VycmVuY2VzKCkuZXF1YWxzKCIxIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIE1heCBSZXF1aXJlbWVudCBPY2N1cnJlbmNlcyAiLCByZXEuZ2V0TWF4T2NjdXJyZW5jZXMoKS5lcXVhbHMoIjEiKSk7CisJCQkJaXNSZXF1aXJlbWVudEFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJsb2NhbF9zdG9yYWdlMzAwIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNaW4gUmVxdWlyZW1lbnQgT2NjdXJyZW5jZXMgIiwgcmVxLmdldE1pbk9jY3VycmVuY2VzKCkuZXF1YWxzKCIxIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIE1heCBSZXF1aXJlbWVudCBPY2N1cnJlbmNlcyAiLCByZXEuZ2V0TWF4T2NjdXJyZW5jZXMoKS5lcXVhbHMoIjEwIikpOworCQkJCWlzUmVxdWlyZW1lbnRBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAibG9jYWxfc3RvcmFnZTQwMCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIFJlcXVpcmVtZW50IE9jY3VycmVuY2VzICIsIHJlcS5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscygiMSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNYXggUmVxdWlyZW1lbnQgT2NjdXJyZW5jZXMgIiwgcmVxLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKCIxMDAwMDAwMCIpKTsKKwkJCQlpc1JlcXVpcmVtZW50QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImxvY2FsX3N0b3JhZ2U1MDAiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIE1pbiBSZXF1aXJlbWVudCBPY2N1cnJlbmNlcyAiLCByZXEuZ2V0TWluT2NjdXJyZW5jZXMoKS5lcXVhbHMoIjIiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWF4IFJlcXVpcmVtZW50IE9jY3VycmVuY2VzICIsIHJlcS5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscygiMyIpKTsKKwkJCQlpc1JlcXVpcmVtZW50QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImxvY2FsX3N0b3JhZ2VOb09jY3VycmVuY2VzNjAwIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNaW4gUmVxdWlyZW1lbnQgT2NjdXJyZW5jZXMgIiwgcmVxLmdldE1pbk9jY3VycmVuY2VzKCkuZXF1YWxzKCIxIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIE1heCBSZXF1aXJlbWVudCBPY2N1cnJlbmNlcyAiLCByZXEuZ2V0TWF4T2NjdXJyZW5jZXMoKS5lcXVhbHMoIjEiKSk7CisJCQkJaXNSZXF1aXJlbWVudEFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhc3NlcnRUcnVlKGlzUmVxdWlyZW1lbnRBcHBlYXIpOworCQkJaXNSZXF1aXJlbWVudEFwcGVhciA9IGZhbHNlOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwYWJpbGl0aWVzT2NjdXJyZW5jZXMoUmVzb3VyY2UgcmVzb3VyY2VKYXZhT2JqZWN0LCBTdHJpbmcgY2FwYWJpbGl0VHlwZSkgeworCQlib29sZWFuIGlzQ2FwYWJpbGl0eUFwcGVhciA9IGZhbHNlOworCQkvLyBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMgPQorCQkvLyByZXNvdXJjZUphdmFPYmplY3QuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4iKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzID0gcmVzb3VyY2VKYXZhT2JqZWN0LmdldENhcGFiaWxpdGllcygpLmdldChjYXBhYmlsaXRUeXBlKTsKKworCQlmb3IgKENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcCA6IGNhcGFiaWxpdGllcykgeworCQkJc3dpdGNoIChjYXAuZ2V0TmFtZSgpKSB7CisJCQljYXNlICJlbmRwb2ludE5vT2NjdXJyZW5jZSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIGNhcGFiaWxpdHkgT2NjdXJyZW5jZXMgIiwgY2FwLmdldE1pbk9jY3VycmVuY2VzKCkuZXF1YWxzKCIxIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIE1heCBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsIGNhcC5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscygiVU5CT1VOREVEIikpOworCQkJCWlzQ2FwYWJpbGl0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJlbmRwb2ludDIwMCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIGNhcGFiaWxpdHkgT2NjdXJyZW5jZXMgIiwgY2FwLmdldE1pbk9jY3VycmVuY2VzKCkuZXF1YWxzKCIxIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIE1heCBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsIGNhcC5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscygiMiIpKTsKKwkJCQlpc0NhcGFiaWxpdHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZW5kcG9pbnQzMDAiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIE1pbiBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsIGNhcC5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscygiMSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNYXggY2FwYWJpbGl0eSBPY2N1cnJlbmNlcyAiLCBjYXAuZ2V0TWF4T2NjdXJyZW5jZXMoKS5lcXVhbHMoIjEiKSk7CisJCQkJaXNDYXBhYmlsaXR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImVuZHBvaW50NDAwIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNaW4gY2FwYWJpbGl0eSBPY2N1cnJlbmNlcyAiLCBjYXAuZ2V0TWluT2NjdXJyZW5jZXMoKS5lcXVhbHMoIjEiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWF4IGNhcGFiaWxpdHkgT2NjdXJyZW5jZXMgIiwgY2FwLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKCIxMCIpKTsKKwkJCQlpc0NhcGFiaWxpdHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZW5kcG9pbnQ1MDAiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIE1pbiBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsIGNhcC5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscygiMSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBNYXggY2FwYWJpbGl0eSBPY2N1cnJlbmNlcyAiLCBjYXAuZ2V0TWF4T2NjdXJyZW5jZXMoKS5lcXVhbHMoIjEwMDAwMDAwIikpOworCQkJCWlzQ2FwYWJpbGl0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJlbmRwb2ludDYwMCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIGNhcGFiaWxpdHkgT2NjdXJyZW5jZXMgIiwgY2FwLmdldE1pbk9jY3VycmVuY2VzKCkuZXF1YWxzKCIxIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIE1heCBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsIGNhcC5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscygiVU5CT1VOREVEIikpOworCQkJCWlzQ2FwYWJpbGl0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJlbmRwb2ludDcwMCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIGNhcGFiaWxpdHkgT2NjdXJyZW5jZXMgIiwgY2FwLmdldE1pbk9jY3VycmVuY2VzKCkuZXF1YWxzKCIyIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIE1heCBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsIGNhcC5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscygiNCIpKTsKKwkJCQlpc0NhcGFiaWxpdHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCisJCQl9CisJCQlhc3NlcnRUcnVlKGlzQ2FwYWJpbGl0eUFwcGVhcik7CisJCQlpc0NhcGFiaWxpdHlBcHBlYXIgPSBmYWxzZTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIHZlcmlmeVJlc291cmNlUHJvcGVydGllc01hcChSZXNvdXJjZSByZXNvdXJjZUphdmFPYmplY3QpIHsgLy8gdXNlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaW1wb3J0TWFwUHJvcGVydHlTdWNjZXNzRmxvdy55bWwKKwkJYm9vbGVhbiBpc1Byb3BlcnR5QXBwZWFyID0gZmFsc2U7CisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzTGlzdCA9IHJlc291cmNlSmF2YU9iamVjdC5nZXRQcm9wZXJ0aWVzKCk7CisJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHBybyA6IHByb3BlcnRpZXNMaXN0KSB7CisJCQlzd2l0Y2ggKHByby5nZXROYW1lKCkpIHsKKwkJCWNhc2UgInN0cmluZ19wcm9wMDEiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOlwidmFsMVwiLFwia2V5QlwiOlwidmFsMlwifSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0cmluZ19wcm9wMDIiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOlwidmFsMVwiLFwia2V5QlwiOlwidmFsMlwifSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0cmluZ19wcm9wMDMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOlwidmFsMVwiLFwia2V5QlwiOlwidmFsMlwifSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0cmluZ19wcm9wMDQiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOlwiMTBcIixcImtleUJcIjpcInRydWVcIn0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJzdHJpbmciKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJzdHJpbmdfcHJvcDA1IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpudWxsLFwia2V5QlwiOlwiQmlnXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AwNiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJhYWFBXCIsXCJrZXlCXCI6bnVsbH0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJzdHJpbmciKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJzdHJpbmdfcHJvcDA3IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpudWxsLFwia2V5QlwiOm51bGx9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AwOCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJcIixcImtleUJcIjpcImFiY2RcIn0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJzdHJpbmciKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJzdHJpbmdfcHJvcDA5IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpcIiBcIixcImtleUJcIjpcImFiY2RcIn0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJzdHJpbmciKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJzdHJpbmdfcHJvcDEwIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpcIiBhYWFhXCIsXCJrZXlCXCI6XCIgYmJiYlwifSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0cmluZ19wcm9wMTEiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOlwiYWFhYSBcIixcImtleUJcIjpcImJiYmIgXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AxMiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCIgYWFhYSBcIixcImtleUJcIjpcIiBiYmJiIGNjY2NjIFwifSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0cmluZ19wcm9wMTMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOlwiYWFhYVwifSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoInN0cmluZyIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgInN0cmluZ19wcm9wMTQiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOlwiIGFhYWEgXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AxNSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJBYmNEXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AxNiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJBYmNEXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AxNyI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJBYmNEXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AxOCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJBYmNEXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AxOSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJBYmNEXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AyMCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6XCJhYWFhXCIsXCJrZXlhXCI6XCJhYWFhXCIsXCJLZXlhXCI6XCJBYWFhXCIsXCJLRVlBXCI6XCJubm5uXCJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AyMSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6bnVsbCxcImtleUJcIjpudWxsLFwia2V5Q1wiOm51bGx9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAic3RyaW5nX3Byb3AyMiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKSwgbnVsbCk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJzdHJpbmciKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJpbnRlZ2VyX3Byb3AwMSI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6MSxcImtleUJcIjoxMDAwfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImludGVnZXIiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJpbnRlZ2VyX3Byb3AwMiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6bnVsbCxcImtleUJcIjpudWxsLFwia2V5Q1wiOm51bGx9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiaW50ZWdlciIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImludGVnZXJfcHJvcDAzIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjo4MDAsXCJrZXlCXCI6LTYwMH0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJpbnRlZ2VyIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiaW50ZWdlcl9wcm9wMDQiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOm51bGwsXCJrZXlCXCI6LTYwMH0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJpbnRlZ2VyIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiaW50ZWdlcl9wcm9wMDUiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOjEwMCxcImtleUJcIjowfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImludGVnZXIiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJpbnRlZ2VyX3Byb3AwNiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6MTAwLFwia2V5QlwiOjB9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiaW50ZWdlciIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImludGVnZXJfcHJvcDA3IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjoxMDAsXCJrZXlCXCI6MTAwfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImludGVnZXIiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJpbnRlZ2VyX3Byb3AwOCI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6MTAwLFwia2V5QlwiOjIwMH0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJpbnRlZ2VyIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiaW50ZWdlcl9wcm9wMDkiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOjEwMCxcImtleUJcIjoyMDB9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiaW50ZWdlciIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImludGVnZXJfcHJvcDEwIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpudWxsLFwia2V5QlwiOjIyMjJ9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiaW50ZWdlciIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImludGVnZXJfcHJvcDExIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpudWxsLFwia2V5QlwiOm51bGwsXCJrZXlDXCI6bnVsbCxcImtleURcIjpudWxsfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImludGVnZXIiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJpbnRlZ2VyX3Byb3AxMiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKSwgbnVsbCk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJpbnRlZ2VyIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiaW50ZWdlcl9wcm9wMTMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOjIwMH0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJpbnRlZ2VyIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiYm9vbGVhbl9wcm9wMDEiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOnRydWUsXCJrZXlCXCI6ZmFsc2UsXCJrZXlDXCI6ZmFsc2V9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiYm9vbGVhbiIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImJvb2xlYW5fcHJvcDAyIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjp0cnVlLFwia2V5QlwiOmZhbHNlLFwia2V5Q1wiOmZhbHNlfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImJvb2xlYW4iKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJib29sZWFuX3Byb3AwMyI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6bnVsbCxcImtleUJcIjpudWxsLFwia2V5Q1wiOm51bGwsXCJrZXlEXCI6bnVsbH0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJib29sZWFuIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiYm9vbGVhbl9wcm9wMDQiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOm51bGwsXCJrZXlCXCI6bnVsbCxcImtleUNcIjpudWxsLFwia2V5RFwiOm51bGx9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiYm9vbGVhbiIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImJvb2xlYW5fcHJvcDA1IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjp0cnVlLFwia2V5QlwiOmZhbHNlLFwia2V5Q1wiOmZhbHNlfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImJvb2xlYW4iKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJib29sZWFuX3Byb3AwNiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6dHJ1ZSxcImtleUJcIjp0cnVlLFwia2V5Q1wiOmZhbHNlfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImJvb2xlYW4iKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJib29sZWFuX3Byb3AwNyI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKSwgbnVsbCk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJib29sZWFuIikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiYm9vbGVhbl9wcm9wMDgiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOnRydWUsXCJrZXlCXCI6ZmFsc2V9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiYm9vbGVhbiIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImJvb2xlYW5fcHJvcDA5IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpmYWxzZSxcImtleUJcIjp0cnVlfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImJvb2xlYW4iKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJmbG9hdF9wcm9wMDEiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOjEuMixcImtleUJcIjozLjU2LFwia2V5Q1wiOjMzfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImZsb2F0IikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZmxvYXRfcHJvcDAyIjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjowLjAsXCJrZXlCXCI6MC4wLFwia2V5Q1wiOjB9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJmbG9hdF9wcm9wMDMiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOm51bGwsXCJrZXlCXCI6bnVsbCxcImtleUNcIjpudWxsLFwia2V5RFwiOm51bGx9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJmbG9hdF9wcm9wMDQiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOjEuMixcImtleUJcIjozLjU2LFwia2V5Q1wiOjMzfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImZsb2F0IikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZmxvYXRfcHJvcDA1IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjozMyxcImtleUJcIjoxLjIsXCJrZXlDXCI6My42MDcsXCJrZXlEXCI6MH0iKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkuZXF1YWxzKCJmbG9hdCIpKTsKKwkJCQlpc1Byb3BlcnR5QXBwZWFyID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgImZsb2F0X3Byb3AwNiI6CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0VHlwZSgpLmVxdWFscygibWFwIikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5ICBkZWZhdWx0IHZhbHVlcyAiLCBwcm8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJ7XCJrZXlBXCI6MzMsXCJrZXlCXCI6MS4yLFwia2V5Q1wiOjMuNjA3fSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImZsb2F0IikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZmxvYXRfcHJvcDA3IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjpudWxsLFwia2V5QlwiOm51bGwsXCJrZXlDXCI6bnVsbCxcImtleURcIjpudWxsfSIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImZsb2F0IikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZmxvYXRfcHJvcDA4IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLCBudWxsKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBlbnRyeVNjaGVtYSBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKS5lcXVhbHMoImZsb2F0IikpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAiZmxvYXRfcHJvcDA5IjoKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBUeXBlICIsIHByby5nZXRUeXBlKCkuZXF1YWxzKCJtYXAiKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIntcImtleUFcIjowLjAxLFwia2V5QlwiOm51bGx9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJmbG9hdF9wcm9wMTAiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOjAuMDAwMjB9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlICJmbG9hdF9wcm9wMTEiOgorCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoIm1hcCIpKTsKKwkJCQlhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSAgZGVmYXVsdCB2YWx1ZXMgIiwgcHJvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygie1wia2V5QVwiOjMuNTYsXCJrZXlCXCI6MzN9IikpOworCQkJCWFzc2VydFRydWUoIkNoZWNrIGVudHJ5U2NoZW1hIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmVxdWFscygiZmxvYXQiKSk7CisJCQkJaXNQcm9wZXJ0eUFwcGVhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhc3NlcnRUcnVlKGlzUHJvcGVydHlBcHBlYXIpOworCQkJaXNQcm9wZXJ0eUFwcGVhciA9IGZhbHNlOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydFRvc2NhUmVzb3VyY2VBdHRyaWJ1dGVTdWNjZXNzRmxvdygpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaWxlTmFtZSA9IGltcG9ydEF0dHJpYnV0ZVN1Y2Nlc3M7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLCBmaWxlTmFtZSk7CisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBudWxsKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShpbXBvcnRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJVG9zY2FOb2RlVHlwZUluZm8gcGFyc2VUb3NjYU5vZGVZYW1sID0gdXRpbHMucGFyc2VUb3NjYU5vZGVZYW1sKERlY29kZXIuZGVjb2RlKGltcG9ydFJlcURldGFpbHMuZ2V0UGF5bG9hZERhdGEoKSkpOworCisJCUhhc2hNYXA8U3RyaW5nLCBBdHRyaWJ1dGVEZWZpbml0aW9uPiBhdHRyID0gbmV3IEhhc2hNYXA8PigpOworCisJCUF0dHJpYnV0ZURlZmluaXRpb24gbmV3QXR0cjIgPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvbigpOworCQluZXdBdHRyMi5zZXROYW1lKCJuZXR3b3JrcyIpOworCQluZXdBdHRyMi5zZXRUeXBlKCJtYXAiKTsKKwkJbmV3QXR0cjIuc2V0RGVmYXVsdFZhbHVlKCJ7XCJrZXlBXCIgOiB2YWwxICwgXCJrZXlCXCIgOiB2YWwyfSIpOworCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYSA9IG5ldyBTY2hlbWFEZWZpbml0aW9uKCk7CisJCVByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcCA9IG5ldyBQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCk7CisJCXByb3Auc2V0VHlwZSgic3RyaW5nIik7CisJCXNjaGVtYS5zZXRQcm9wZXJ0eShwcm9wKTsKKwkJbmV3QXR0cjIuc2V0U2NoZW1hKHNjaGVtYSk7CisJCWF0dHIucHV0KCJuZXR3b3JrcyIsIG5ld0F0dHIyKTsKKworCQlBdHRyaWJ1dGVEZWZpbml0aW9uIG5ld0F0dHIxID0gbmV3IEF0dHJpYnV0ZURlZmluaXRpb24oKTsKKwkJbmV3QXR0cjEuc2V0TmFtZSgicHVibGljX2FkZHJlc3MiKTsKKwkJbmV3QXR0cjEuc2V0VHlwZSgic3RyaW5nIik7CisJCWF0dHIucHV0KCJwdWJsaWNfYWRkcmVzcyIsIG5ld0F0dHIxKTsKKworCQlBdHRyaWJ1dGVEZWZpbml0aW9uIG5ld0F0dHIzID0gbmV3IEF0dHJpYnV0ZURlZmluaXRpb24oKTsKKwkJbmV3QXR0cjMuc2V0TmFtZSgicG9ydHMiKTsKKwkJbmV3QXR0cjMuc2V0RGVzY3JpcHRpb24oInRoaXMgaXMgbXkgZGVzY3JpcHRpb24iKTsKKwkJYXR0ci5wdXQoInBvcnRzIiwgbmV3QXR0cjMpOworCisJCUF0dHJpYnV0ZURlZmluaXRpb24gbmV3QXR0ciA9IG5ldyBBdHRyaWJ1dGVEZWZpbml0aW9uKCk7CisJCW5ld0F0dHIuc2V0RGVmYXVsdFZhbHVlKCJteURlZmF1bHQiKTsKKwkJbmV3QXR0ci5zZXROYW1lKCJwcml2YXRlX2FkZHJlc3MiKTsKKwkJbmV3QXR0ci5zZXRTdGF0dXMoInN1cHBvcnRlZCIpOworCQluZXdBdHRyLnNldFR5cGUoInN0cmluZyIpOworCQlhdHRyLnB1dCgicHJpdmF0ZV9hZGRyZXNzIiwgbmV3QXR0cik7CisKKwkJLy8gdmVyaWZ5IFJlc291cmNlIEF0dHJpYnV0ZXMKKwkJdmFsaWRhdGVSZXNvdXJjZUF0dHJpYnV0ZShyZXNvdXJjZUphdmFPYmplY3QsIGF0dHIpOworCisJCS8vIFRPIERPCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnU3VjY2VzcygpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShpbXBvcnRSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFRvc2NhTm9kZVR5cGUocGFyc2VUb3NjYU5vZGVZYW1sLmdldE5vZGVOYW1lKCkpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVzb3VyY2VBdHRyaWJ1dGUoUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDxTdHJpbmcsIEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHIpIHsKKwkJTGlzdDxBdHRyaWJ1dGVEZWZpbml0aW9uPiByZXNMaXN0ID0gcmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpOworCQlpbnQgc2l6ZSA9IHJlc0xpc3Quc2l6ZSgpOworCQlTdHJpbmcgYXR0cmlidXRlTmFtZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWF0dHJpYnV0ZU5hbWUgPSByZXNMaXN0LmdldChpKS5nZXROYW1lKCk7CisJCQlhc3NlcnRFcXVhbHMoYXR0ci5nZXQoYXR0cmlidXRlTmFtZSkuZ2V0RGVmYXVsdFZhbHVlKCksIHJlc0xpc3QuZ2V0KGkpLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCWFzc2VydEVxdWFscyhhdHRyLmdldChhdHRyaWJ1dGVOYW1lKS5nZXROYW1lKCksIHJlc0xpc3QuZ2V0KGkpLmdldE5hbWUoKSk7CisJCQlhc3NlcnRFcXVhbHMoYXR0ci5nZXQoYXR0cmlidXRlTmFtZSkuZ2V0RGVzY3JpcHRpb24oKSwgcmVzTGlzdC5nZXQoaSkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQlhc3NlcnRFcXVhbHMoYXR0ci5nZXQoYXR0cmlidXRlTmFtZSkuZ2V0U3RhdHVzKCksIHJlc0xpc3QuZ2V0KGkpLmdldFN0YXR1cygpKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9JbXBvcnRVcGRhdGVSZXNvdXJzZUNzYXJUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9pbXBvcnRzL0ltcG9ydFVwZGF0ZVJlc291cnNlQ3NhclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThiOTRlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW1wb3J0cy9JbXBvcnRVcGRhdGVSZXNvdXJzZUNzYXJUZXN0LmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmltcG9ydHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkltcG9ydFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKK3B1YmxpYyBjbGFzcyBJbXBvcnRVcGRhdGVSZXNvdXJzZUNzYXJUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZXJEZWZpbmVkTm9kZVlhbWwgPSAibXljb21wdXRlMi55bWwiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvb3RQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNzYXJGb2xkZXJQYXRoID0gIi9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvIjsKKworCXB1YmxpYyBJbXBvcnRVcGRhdGVSZXNvdXJzZUNzYXJUZXN0KCkgeworCQlzdXBlcihuYW1lLCBJbXBvcnRVcGRhdGVSZXNvdXJzZUNzYXJUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVVcGRhdGVJbXBvcnRSZXNvdXJjZUZyb21Dc2FyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2UgPSBudWxsOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBudWxsOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJCVN0cmluZyBwYXlsb2FkTmFtZSA9ICJvcmlnMkcuY3NhciI7CisJCVN0cmluZyByb290UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKwkJUGF0aCBwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgY3NhckZvbGRlclBhdGggKyAib3JpZzJHLmNzYXIiKTsKKwkJYnl0ZVtdIGRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCVN0cmluZyBwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkRGF0YShwYXlsb2FkRGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRQYXlsb2FkTmFtZShwYXlsb2FkTmFtZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJURVNUMDEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJvcmlnMkcuY3NhciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclZlcnNpb24oIjEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyB1cGRhdGUgc2NhciB3aXRoIG5ldyBhcnRpZmFjdHMKKwkJcGF0aCA9IFBhdGhzLmdldChyb290UGF0aCArIGNzYXJGb2xkZXJQYXRoICsgIm9yaWcyR191cGRhdGUuY3NhciIpOworCQlkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQlwYXlsb2FkRGF0YSA9IEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoZGF0YSk7CisJCXJlc291cmNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigidXBkYXRlIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVmVyc2lvbigiMiIpOworCQl1cGRhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlVXBkYXRlSW1wb3J0UmVzb3VyY2VGcm9tQ3NhcldpdGhBcnRpZmFjdHNHcm91cE5hbWluZ1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNvcHlSZXM7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlOworCQlSZXNvdXJjZSByZXNvdXJjZTsKKworCQkvLyBiYWNrIG9yaWdpbmFsIHNjYXIKKwkJY29weVJlcyA9IEltcG9ydENzYXJSZXNvdXJjZVRlc3QuY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsCisJCQkJIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19hLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfZ3JvdXBfbmFtaW5nLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJURVNUMDEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19ncm91cF9uYW1pbmcuY3NhciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclZlcnNpb24oIjEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzID0gcmVzb3VyY2UuZ2V0R3JvdXBzKCk7CisJCWFzc2VydFRydWUoZ3JvdXBzICE9IG51bGwgJiYgZ3JvdXBzLnNpemUoKSA9PSA2KTsKKwkJYXNzZXJ0VHJ1ZShncm91cHMuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKGcgLT4gZy5nZXRUeXBlKCkuZXF1YWxzKENvbnN0YW50cy5ERUZBVUxUX0dST1VQX1ZGX01PRFVMRSkKKwkJCQkJCSYmICFQYXR0ZXJuLmNvbXBpbGUoQ29uc3RhbnRzLk1PRFVMRV9ORVdfTkFNRV9QQVRURVJOKS5tYXRjaGVyKGcuZ2V0TmFtZSgpKS5tYXRjaGVzKCkpCisJCQkJLmNvdW50KCkgPT0gMCk7CisJCS8vIHVwZGF0ZSBzY2FyCisJCWNvcHlSZXMgPSBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCSJWRl9SSTJfRzRfd2l0aEFydGlmYWN0c19ncm91cF9uYW1pbmdfZGVsZXRlX3VwZGF0ZS5jc2FyIiwgIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZy5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCQlyZXNvdXJjZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIkJMQSBCTEEgQkxBIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVmVyc2lvbigiMiIpOworCQl1cGRhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlncm91cHMgPSByZXNvdXJjZS5nZXRHcm91cHMoKTsKKwkJYXNzZXJ0VHJ1ZShncm91cHMgIT0gbnVsbCAmJiBncm91cHMuc2l6ZSgpID09IDUpOworCQkvLyBiYWNrIG9yaWdpbmFsIHNjYXIKKwkJY29weVJlcyA9IEltcG9ydENzYXJSZXNvdXJjZVRlc3QuY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsCisJCQkJIlZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19hLmNzYXIiLCAiVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfZ3JvdXBfbmFtaW5nLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiQkxBIEJMQSBCTEEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJWZXJzaW9uKCIzIik7CisJCXVwZGF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWdyb3VwcyA9IHJlc291cmNlLmdldEdyb3VwcygpOworCQlhc3NlcnRUcnVlKGdyb3VwcyAhPSBudWxsICYmIGdyb3Vwcy5zaXplKCkgPT0gNik7CisJCWFzc2VydFRydWUoZ3JvdXBzLnN0cmVhbSgpCisJCQkJLmZpbHRlcihnIC0+IGcuZ2V0VHlwZSgpLmVxdWFscyhDb25zdGFudHMuREVGQVVMVF9HUk9VUF9WRl9NT0RVTEUpCisJCQkJCQkmJiAhUGF0dGVybi5jb21waWxlKENvbnN0YW50cy5NT0RVTEVfTkVXX05BTUVfUEFUVEVSTikubWF0Y2hlcihnLmdldE5hbWUoKSkubWF0Y2hlcygpKQorCQkJCS5jb3VudCgpID09IDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlVXBkYXRlRGVsZXRlQWxsUmVxdWlyZWRBcnRpZmFjdHNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVJlc3RSZXNwb25zZSBjb3B5UmVzOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2U7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZTsKKwkJUmVzb3VyY2UgcmVzb3VyY2U7CisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAiaGVhdG5lc3RlZDciOworCisJCUltcG9ydFJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQljcmVhdGVSZXNvdXJjZSA9IGltcG9ydFVzZXJEZWZpbmVkTm9kZVR5cGUodXNlckRlZmluZWROb2RlWWFtbCwgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzMCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQkvLyBiYWNrIG9yaWdpbmFsIHNjYXIKKwkJY29weVJlcyA9IEltcG9ydENzYXJSZXNvdXJjZVRlc3QuY29weUNzYXJSZXN0KHNkbmNNb2RpZmllckRldGFpbHMsICJvcmlnMkdWMDAxX2EuY3NhciIsICJvcmlnMkdWMDAxLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJURVNUMDEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJVVUlEKCJvcmlnMkdWMDAxLmNzYXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJWZXJzaW9uKCIxIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQkvLyBjcmVhdGUgbmV3IHJlc291cmNlIGZyb20gQ3NhcgorCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS5nZXQoYXJ0aWZhY3ROYW1lKS5nZXRSZXF1aXJlZEFydGlmYWN0cygpLnNpemUoKSA9PSAyKTsKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcyA9IHJlc291cmNlLmdldEdyb3VwcygpOworCQkvLyB1cGRhdGUgc2NhcgorCQljb3B5UmVzID0gSW1wb3J0Q3NhclJlc291cmNlVGVzdC5jb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQkib3JpZzJHVjAwNi1yZW1vdmUtYWxsLW5lc3RlZC1hcnRpZmFjdHMuY3NhciIsICJvcmlnMkdWMDAxLmNzYXIiKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY29weVJlcyk7CisJCXJlc291cmNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiQkxBIEJMQSBCTEEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENzYXJWZXJzaW9uKCIyIik7CisJCXVwZGF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmdldChhcnRpZmFjdE5hbWUpLmdldFJlcXVpcmVkQXJ0aWZhY3RzKCkuc2l6ZSgpID09IDApOworCQlncm91cHMgPSByZXNvdXJjZS5nZXRHcm91cHMoKTsKKwkJLy8gYmFjayBvcmlnaW5hbCBzY2FyCisJCWNvcHlSZXMgPSBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLCAib3JpZzJHVjAwMV9hLmNzYXIiLCAib3JpZzJHVjAwMS5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCX0KKworCS8vIEZpcnN0IGNyZWF0ZSBmcm9tIG9yaWcyR1YwMDYtcmVtb3ZlLWFsbC1uZXN0ZWQtYXJ0aWZhY3RzLmNzYXIgKHdpdGhvdXQKKwkvLyByZXF1aXJlZEFydGlmYWN0KQorCS8vIFN1Ym1pdCBmb3IgdGVzdGluZworCS8vIExvZ2luIGFzIHRlc3RlciAtPiBDZXJ0aWZpY2F0aW9uCisJLy8gTG9naW4gYXMgZGVzaWduZXIKKwkvLyB0aGVuIHVwZGF0ZSB0byBvcmlnMkdWMDA4LWNoYW5nZS1uZXN0ZWQtb2FtLWZpbGVDb250ZW50LmNzYXIgKHdpdGgKKwkvLyByZXF1aXJlZEFydGlmYWN0KQorCS8vIEV4cGVjdGVkOiByZXF1aXJlZEFydGlmYWN0OiBbImhvdC1uaW1idXMtcHNtX3YxLjAueWFtbCIsCisJLy8gImhvdC1uaW1idXMtc3dpZnQtY29udGFpbmVyX3YxLjAueWFtbCJdCisJLy8gQWN0dWFsOiBubyByZXF1aXJlZEFydGlmYWN0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVVcGRhdGVBZGRSZXF1aXJlZEFydGlmYWN0c1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNvcHlSZXM7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlOworCQlSZXNvdXJjZSByZXNvdXJjZTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJoZWF0bmVzdGVkNyI7CisKKwkJSW1wb3J0UmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMwID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCk7CisJCWNyZWF0ZVJlc291cmNlID0gaW1wb3J0VXNlckRlZmluZWROb2RlVHlwZSh1c2VyRGVmaW5lZE5vZGVZYW1sLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMwKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsczApOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjcmVhdGVSZXNvdXJjZSk7CisKKwkJLy8gYmFjayBvcmlnaW5hbCBzY2FyCisJCWNvcHlSZXMgPSBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCSJvcmlnMkdWMDA2LXJlbW92ZS1hbGwtbmVzdGVkLWFydGlmYWN0cy5jc2FyIiwgIm9yaWcyR1YwMDEuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlRFU1QwMSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQoIm9yaWcyR1YwMDEuY3NhciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclZlcnNpb24oIjEiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCS8vIGNyZWF0ZSBuZXcgcmVzb3VyY2UgZnJvbSBDc2FyCisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNyZWF0ZVJlc291cmNlKTsKKworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmdldChhcnRpZmFjdE5hbWUpLmdldFJlcXVpcmVkQXJ0aWZhY3RzKCkuc2l6ZSgpID09IDApOworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzID0gcmVzb3VyY2UuZ2V0R3JvdXBzKCk7CisJCS8vIHVwZGF0ZSBzY2FyCisJCWNvcHlSZXMgPSBJbXBvcnRDc2FyUmVzb3VyY2VUZXN0LmNvcHlDc2FyUmVzdChzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCSJvcmlnMkdWMDA4LWNoYW5nZS1uZXN0ZWQtb2FtLWZpbGVDb250ZW50LmNzYXIiLCAib3JpZzJHVjAwMS5jc2FyIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNvcHlSZXMpOworCQlyZXNvdXJjZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIkJMQSBCTEEgQkxBIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDc2FyVmVyc2lvbigiMiIpOworCQl1cGRhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS5nZXQoYXJ0aWZhY3ROYW1lKS5nZXRSZXF1aXJlZEFydGlmYWN0cygpLnNpemUoKSA9PSAyKTsKKwkJZ3JvdXBzID0gcmVzb3VyY2UuZ2V0R3JvdXBzKCk7CisJCS8vIGJhY2sgb3JpZ2luYWwgc2NhcgorCQljb3B5UmVzID0gSW1wb3J0Q3NhclJlc291cmNlVGVzdC5jb3B5Q3NhclJlc3Qoc2RuY01vZGlmaWVyRGV0YWlscywgIm9yaWcyR1YwMDFfYS5jc2FyIiwgIm9yaWcyR1YwMDEuY3NhciIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhjb3B5UmVzKTsKKwl9CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZSBpbXBvcnRVc2VyRGVmaW5lZE5vZGVUeXBlKFN0cmluZyBwYXlsb2FkTmFtZSwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJSW1wb3J0UmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCisJCVBhdGggcGF0aCA9IFBhdGhzLmdldChyb290UGF0aCArIGNzYXJGb2xkZXJQYXRoICsgcGF5bG9hZE5hbWUpOworCQlieXRlW10gZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLm5hbWUoKSk7CisJCXJldHVybiBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW5wdXRzL0lucHV0c0FwaVRlc3RzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9pbnB1dHMvSW5wdXRzQXBpVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDViODFlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvaW5wdXRzL0lucHV0c0FwaVRlc3RzLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmlucHV0czsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0SW5wdXRzTWFwOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklucHV0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkF0b21pY09wZXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5JbnB1dHNSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5CYXNlVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKioKKyAqIENJLVRlc3RzIGZvciBpbnB1dHMgCisgKiBAYXV0aG9yIGlsMDY5NQorICoKKyAqLworcHVibGljIGNsYXNzIElucHV0c0FwaVRlc3RzIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGlucHV0Q3NhcjEgPSAiRkNHSV93aXRoX2lucHV0cy5jc2FyIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW5wdXRDc2FyMiA9ICJMRFNBMV93aXRoX2lucHV0cy5jc2FyIjsKKwlwcml2YXRlIHN0YXRpYyBVc2VyICBzZG5jRGVzaWduZXJEZXRhaWxzID0gbnVsbDsKKwkKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIElucHV0c0FwaVRlc3RzKCkgeworCQlzdXBlcihuYW1lLCBJbnB1dHNBcGlUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworCQlzZG5jRGVzaWduZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlIFZGIHdpdGggaW5wdXRzIGZyb20gQ1NBUiBmaWxlCisJICogCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUmVzb3VyY2VJbnN0YW5jZVdpdGhJbnB1dHNGcm9tQ3NhcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZSB2ZiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmltcG9ydFJlc291cmNlRnJvbUNTQVIoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBpbnB1dENzYXIxKTsKKwkJYXNzZXJ0VHJ1ZSgiU3VjY2VzcyBjcmVhdGluZyBWRiBmcm9tIENTQVIiLCAhdmYuZ2V0SW5wdXRzKCkuaXNFbXB0eSgpKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlIHNlcnZpY2UgYW5kIGFkZCB0byBpdCBWRiBpbnN0YW5jZSB3aXRoIGlucHV0cworCSAqIAorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFZmSW5zdGFuY2VXaXRoSW5wdXRzVG9TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVNlcnZpY2VXaXRoVkZJbnN0YW5jZVdpdGhJbnB1dHMoKTsKKwl9CisJCisJLyoqCisJICogR2VuZXJhbCB0ZXN0IHRvIGNoZWNrIG1vc3QgZnVuY3Rpb25hbGl0eSBvZiBpbnB1dHMKKwkgKiA8dWw+CisJICogCTxsaT5DcmVhdGUgc2VydmljZSB3aXRoIFZGIGluc3RhbmNlIHRoYXQgaGFzIGlucHV0cyk8L2xpPgorCSAqIAk8bGk+R2V0IGFsbCBpbnB1dHMgb2YgVkYgaW5zdGFuY2U8L2xpPgorCSAqIAk8bGk+QWRkIGlucHV0cyB0byBzZXJ2aWNlPC9saT4KKwkgKiAJPGxpPkdldCBzZXJ2aWNlIGlucHV0czwvbGk+CisJICogCTxsaT5EZWxldGUgc2VydmljZSBpbnB1dHM8L2xpPgorCSAqIDwvdWw+CisJICogCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW5wdXRzTWFpbkZ1bmN0aW9uYWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU2VydmljZSBzZXJ2aWNlID0gY3JlYXRlU2VydmljZVdpdGhWRkluc3RhbmNlV2l0aElucHV0cygpOworCQlpbnQgdG90YWxJbnB1dHNCZWZvcmVBZGQgPSBzZXJ2aWNlLmdldElucHV0cygpLnNpemUoKTsKKwkJCisJCS8vIEdldCBjb21wb25lbnQgaW5zdGFuY2VzCisJCVJlc3RSZXNwb25zZSBnZXRJbnN0YW5jZXNSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmdldENvbXBvbmVudEluc3RhbmNlcyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCBzZXJ2aWNlLmdldFVuaXF1ZUlkKCksIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlCYXNlVmFsaWRhdGlvblV0aWxzLmNoZWNrU3VjY2VzcyhnZXRJbnN0YW5jZXNSZXNwb25zZSk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHNlcnZpY2VJbnN0YW5jZXMgPSBuZXcgR3NvbigpLmZyb21Kc29uKGdldEluc3RhbmNlc1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIG5ldyBUeXBlVG9rZW48QXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlPj4oKXt9LmdldFR5cGUoKSk7CisJCQorCQkvLyBHZXQgYWxsIGlucHV0cyBvZiBmaXJzdCBpbnN0YW5jZQorCQlDb21wb25lbnRJbnN0YW5jZSB2Zkluc3RhbmNlID0gc2VydmljZUluc3RhbmNlcy5nZXQoMCk7CisJCVJlc3RSZXNwb25zZSBnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0c1Jlc3BvbnNlID0gSW5wdXRzUmVzdFV0aWxzLmdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzKHNlcnZpY2UsIHZmSW5zdGFuY2UpOworCQlCYXNlVmFsaWRhdGlvblV0aWxzLmNoZWNrU3VjY2VzcyhnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0c1Jlc3BvbnNlKTsKKwkJTGlzdDxJbnB1dERlZmluaXRpb24+IGluc3RhbmNlSW5wdXRzID0gbmV3IEdzb24oKS5mcm9tSnNvbihnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0c1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIG5ldyBUeXBlVG9rZW48QXJyYXlMaXN0PElucHV0RGVmaW5pdGlvbj4+KCl7fS5nZXRUeXBlKCkpOworCQkKKwkJLy8gVGFrZSBvbmx5IHRoZSAyIGZpcnN0IGlucHV0cworCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzVG9BZGQgPSBpbnN0YW5jZUlucHV0cy5zdHJlYW0oKS5saW1pdCgyKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkKKwkJLy8gQnVpbGQgY29tcG9uZW50IGluc3RhbmNlcyBpbnB1dCBtYXAgdG8gYWRkIHRvIHNlcnZlcgorCQlDb21wb25lbnRJbnN0SW5wdXRzTWFwIGJ1aWxkQ29tcG9uZW50SW5zdElucHV0c01hcCA9IGJ1aWxkQ29tcG9uZW50SW5zdElucHV0c01hcCh2Zkluc3RhbmNlLmdldFVuaXF1ZUlkKCksIGlucHV0c1RvQWRkKTsKKwkJUmVzdFJlc3BvbnNlIGFkZElucHV0UmVzcG9uc2UgPSBJbnB1dHNSZXN0VXRpbHMuYWRkSW5wdXQoc2VydmljZSwgYnVpbGRDb21wb25lbnRJbnN0SW5wdXRzTWFwLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlCYXNlVmFsaWRhdGlvblV0aWxzLmNoZWNrU3VjY2VzcyhhZGRJbnB1dFJlc3BvbnNlKTsKKwkJCisJCS8vIEdldCBzZXJ2aWNlIGlucHV0cyBjb3VudAorCQlSZXN0UmVzcG9uc2UgZ2V0Q29tcG9uZW50SW5wdXRzUmVzcG9uc2UgPSBJbnB1dHNSZXN0VXRpbHMuZ2V0Q29tcG9uZW50SW5wdXRzKHNlcnZpY2UpOworCQlCYXNlVmFsaWRhdGlvblV0aWxzLmNoZWNrU3VjY2VzcyhnZXRDb21wb25lbnRJbnB1dHNSZXNwb25zZSk7CisJCUxpc3Q8SW5wdXREZWZpbml0aW9uPiBzZXJ2aWNlSW5wdXRzQWZ0ZXJBZGQgPSBuZXcgR3NvbigpLmZyb21Kc29uKGdldENvbXBvbmVudElucHV0c1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIG5ldyBUeXBlVG9rZW48QXJyYXlMaXN0PElucHV0RGVmaW5pdGlvbj4+KCl7fS5nZXRUeXBlKCkpOworCQlpZiAoc2VydmljZUlucHV0c0FmdGVyQWRkLnNpemUoKS10b3RhbElucHV0c0JlZm9yZUFkZCE9MikgeworCQkJYXNzZXJ0VHJ1ZSgiRXJyb3IgYWRkaW5nIGlucHV0cyB0byBzZXJ2aWNlIChzZXJ2aWNlIHNob3VsZCBoYXZlIDIgaW5wdXRzKSIsIGZhbHNlKTsKKwkJfQorCQkKKwkJLy8gRGVsZXRlIDEgaW5wdXQgZnJvbSBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBkZWxldGVJbnB1dEZyb21Db21wb25lbnRSZXNwb25zZSA9IElucHV0c1Jlc3RVdGlscy5kZWxldGVJbnB1dEZyb21Db21wb25lbnQoc2VydmljZSwgc2VydmljZUlucHV0c0FmdGVyQWRkLmdldCgwKS5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVZhbGlkYXRpb25VdGlscy5jaGVja1N1Y2Nlc3MoZGVsZXRlSW5wdXRGcm9tQ29tcG9uZW50UmVzcG9uc2UpOworCQkKKwkJLy8gR2V0IHNlcnZpY2UgaW5wdXRzIGNvdW50IGFmdGVyIGRlbGV0ZQorCQlSZXN0UmVzcG9uc2UgZ2V0Q29tcG9uZW50SW5wdXRzUmVzcG9uc2VBZnRlckRlbGV0ZSA9IElucHV0c1Jlc3RVdGlscy5nZXRDb21wb25lbnRJbnB1dHMoc2VydmljZSk7CisJCUJhc2VWYWxpZGF0aW9uVXRpbHMuY2hlY2tTdWNjZXNzKGdldENvbXBvbmVudElucHV0c1Jlc3BvbnNlQWZ0ZXJEZWxldGUpOworCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gc2VydmljZUlucHV0c0FmdGVyRGVsZXRlID0gbmV3IEdzb24oKS5mcm9tSnNvbihnZXRDb21wb25lbnRJbnB1dHNSZXNwb25zZUFmdGVyRGVsZXRlLmdldFJlc3BvbnNlKCksIG5ldyBUeXBlVG9rZW48QXJyYXlMaXN0PElucHV0RGVmaW5pdGlvbj4+KCl7fS5nZXRUeXBlKCkpOworCQlpZiAoc2VydmljZUlucHV0c0FmdGVyRGVsZXRlLnNpemUoKS10b3RhbElucHV0c0JlZm9yZUFkZCE9MSkgeworCQkJYXNzZXJ0VHJ1ZSgiRXJyb3IgZGVsZXRpbmcgaW5wdXRzIGZyb20gc2VydmljZSAoc2VydmljZSBzaG91bGQgaGF2ZSAxIGlucHV0KSIsIGZhbHNlKTsKKwkJfQorCQkKKwkJYXNzZXJ0VHJ1ZSgiU3VjY2VzcyB0ZXN0aW5nIGlucHV0cyBtYWluIGZ1bmN0aW9uYWxpdHkiLCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBQcml2YXRlIG1ldGhvZCB0byBjcmVhdGUgc2VydmljZSB3aXRoIFZGIGluc3RhbmNlIHRoYXQgaGFzIGlucHV0cworCSAqIFRoaXMgaXMgcHJpdmF0ZSBtZXRob2QgdG8gYmUgdXNlZCBieSBtdWx0aXBsZSB0ZXN0cworCSAqIAorCSAqIEByZXR1cm4ge0BsaW5rIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsfQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgU2VydmljZSBjcmVhdGVTZXJ2aWNlV2l0aFZGSW5zdGFuY2VXaXRoSW5wdXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkvLyBDcmVhdGUgZGVmYXVsdCBzZXJ2aWNlCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXN0UmVzcG9uc2U+IGNyZWF0ZURlZmF1bHRTZXJ2aWNlRWl0aGVyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJaWYgKGNyZWF0ZURlZmF1bHRTZXJ2aWNlRWl0aGVyLmlzUmlnaHQoKSl7CisJCQlhc3NlcnRUcnVlKCJFcnJvciBjcmVhdGluZyBkZWZhdWx0IHNlcnZpY2UiLCBmYWxzZSk7CisJCX0KKwkJU2VydmljZSBzZXJ2aWNlID0gY3JlYXRlRGVmYXVsdFNlcnZpY2VFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQorCQkvLyBDcmVhdGUgVkYgZnJvbSBDU0FSIGZpbGUKKwkJUmVzb3VyY2UgdmZXaXRoSW5wdXRzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuaW1wb3J0UmVzb3VyY2VGcm9tQ1NBUihSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGlucHV0Q3NhcjIpOworCisJCS8vIENlcnRpZnkgVkYKKwkJUGFpcjxDb21wb25lbnQsIFJlc3RSZXNwb25zZT4gY2hhbmdlQ29tcG9uZW50U3RhdGUgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZSh2ZldpdGhJbnB1dHMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJldHVybmVkIDoiICsgY2hhbmdlQ29tcG9uZW50U3RhdGUuZ2V0UmlnaHQoKS5nZXRFcnJvckNvZGUoKSwgY2hhbmdlQ29tcG9uZW50U3RhdGUuZ2V0UmlnaHQoKS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQkKKwkJLy8gQWRkIFZGIGluc3RhbmNlIHRvIHNlcnZpY2UKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXN0UmVzcG9uc2U+IGFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXJFaXRoZXIgPSBBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmV2l0aElucHV0cywgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJaWYgKGFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXJFaXRoZXIuaXNSaWdodCgpKXsKKwkJCWFzc2VydFRydWUoIkVycm9yIGFkZGluZyBWRiB0byBzZXJ2aWNlIiwgZmFsc2UpOworCQl9CisJCQkJCisJCS8vIEdldCBzZXJ2aWNlIHJlc3BvbnNlCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKHNlcnZpY2UpOworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCQorCQkvLyBHZXQgVkYgaW5zdGFuY2UgZnJvbSBzZXJ2aWNlCisJCUNvbXBvbmVudEluc3RhbmNlIHZmSW5zdGFuY2UgPSBzZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKwkJaWYgKHZmSW5zdGFuY2UhPW51bGwpeworCQkJYXNzZXJ0VHJ1ZSgiU3VjY2VzcyBjcmVhdGluZyBzZXJ2aWNlIHdpdGggVkYgaW5zdGFuY2UiLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydFRydWUoIkVycm9yIGNyZWF0aW5nIHNlcnZpY2Ugd2l0aCBWRiBpbnN0YW5jZSIsIGZhbHNlKTsKKwkJfQorCQlyZXR1cm4gc2VydmljZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGRlZmF1bHQgQ29tcG9uZW50SW5zdElucHV0c01hcAorCSAqIAorCSAqIEBwYXJhbSBhZGRUb0lucHV0CisJICogQHBhcmFtIGlucHV0cworCSAqIEByZXR1cm4ge0BsaW5rIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RJbnB1dHNNYXB9CisJICovCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0SW5wdXRzTWFwIGJ1aWxkQ29tcG9uZW50SW5zdElucHV0c01hcCAoU3RyaW5nIGFkZFRvSW5wdXQsIExpc3Q8SW5wdXREZWZpbml0aW9uPiBpbnB1dHMpIHsKKwkJTWFwPFN0cmluZywgTGlzdDxJbnB1dERlZmluaXRpb24+PiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisJCW1hcC5wdXQoYWRkVG9JbnB1dCwgaW5wdXRzKTsKKwkJQ29tcG9uZW50SW5zdElucHV0c01hcCBjb21wb25lbnRJbnN0SW5wdXRzTWFwID0gbmV3IENvbXBvbmVudEluc3RJbnB1dHNNYXAoKTsKKwkJY29tcG9uZW50SW5zdElucHV0c01hcC5zZXRDb21wb25lbnRJbnN0YW5jZUlucHV0c01hcChtYXApOwkJCisJCXJldHVybiBjb21wb25lbnRJbnN0SW5wdXRzTWFwOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvbGlmZWN5Y2xlL0xDU2Jhc2VUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9saWZlY3ljbGUvTENTYmFzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU2NTJkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvbGlmZWN5Y2xlL0xDU2Jhc2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5sZjUudXRpbC5SZXNvdXJjZVV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5TZXJ2aWNlQ2F0ZWdvcmllc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuQXJ0aWZhY3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGFsNzE0aAorICogCisgKiAgICAgICAgIHJlc291cmNlRGV0YWlscyAtIGNyZWF0ZSwgQWRkIEhlYXQsIGNlcnRpZnkgcmVzb3VyY2VEZXRhaWxzMSAtIGNyZWF0ZQorICogICAgICAgICByZXNvdXJjZSwgTENTIC0gQ2hlY2tPdXQgc2VydmljZURldGFpbHMgLSBjcmVhdGUsIGFkZCBSSSBmcm9tCisgKiAgICAgICAgIHJlc291cmNlRGV0YWlscyBzZXJ2aWNlRGV0YWlsczIgLSBjcmVhdGUsIGFkZCBSSSBmcm9tIHJlc291cmNlRGV0YWlscworICogICAgICAgICBzZXJ2aWNlRGV0YWlsc0VtcHR5IC0gY3JlYXRlLCBMQ1MgLSBDaGVja091dCBzZXJ2aWNlRGV0YWlsc0VtcHR5MiAtCisgKiAgICAgICAgIGNyZWF0ZSwgTENTIC0gQ2hlY2tPdXQKKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMQ1NiYXNlVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMTsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzMjsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHNFbXB0eTsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHNFbXB0eTI7CisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsczI7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczE7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczI7CisJcHJvdGVjdGVkIHN0YXRpYyBVc2VyIHNkbmNUZXN0ZXJEZWF0YWlsczE7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluRGV0YWlsczE7CisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzOworCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgaGVhdFZvbEFydGlmYWN0RGV0YWlsczsKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXROZXRBcnRpZmFjdERldGFpbHM7CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RSZXFEZXRhaWxzIGRlZmF1bHRBcnRpZmFjdERldGFpbHM7CisJcHJvdGVjdGVkIFJlc291cmNlVXRpbHMgcmVzb3VyY2VVdGlsczsKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RVdGlscyBhcnRpZmFjdFV0aWxzOworCisJLy8gcHJvdGVjdGVkIHN0YXRpYyBTZXJ2aWNlVXRpbHMgc2VydmljZVV0aWxzID0gbmV3IFNlcnZpY2VVdGlscygpOworCXB1YmxpYyBMQ1NiYXNlVGVzdChUZXN0TmFtZSB0ZXN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQlzdXBlcih0ZXN0TmFtZSwgY2xhc3NOYW1lKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaW5pdGlhbGl6ZU1lbWJlcnMoKTsKKworCQljcmVhdGVDb21wb25lbnRzKCk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplTWVtYmVycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCS8vIHJlc291cmNlRGV0YWlscyA9CisJCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgibXlOZXdSZXNvdXJjZTEyMzQ1Njc4OTAiLAorCQkvLyBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uUk9VVEVSUywKKwkJLy8gVXNlclJvbGVFbnVtLkRFU0lHTkVSLmdldFVzZXJJZCgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgic2Vjb25kUmVzb3VyY2UiLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCk7CisJCXNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZURldGFpbHMyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoIm5ld1Rlc3RTZXJ2aWNlMiIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwgImFsMTk3NiIpOworCQlzZXJ2aWNlRGV0YWlsc0VtcHR5ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoIm5ld0VtcHR5U2VydmljZSIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwKKwkJCQkiYWwxOTc2Iik7CisJCXNlcnZpY2VEZXRhaWxzRW1wdHkyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoIm5ld0VtcHR5U2VydmljZTIiLCBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFksCisJCQkJImFsMTk3NiIpOworCQlzZG5jRGVzaWduZXJEZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCXNkbmNEZXNpZ25lckRldGFpbHMyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSMik7CisJCXNkbmNUZXN0ZXJEZWF0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJc2RuY0FkbWluRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQloZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWhlYXROZXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVULmdldFR5cGUoKSk7CisJCWhlYXRWb2xBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MLmdldFR5cGUoKSk7CisJCWNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRDb21wb25lbnRJbnN0YW5jZSgpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoKTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCWFzc2VydE5vdE51bGwoInJlc291cmNlIHVuaXF1ZUlkIGlzIG51bGw6IiwgcmVzb3VyY2VEZXRhaWxzMS5nZXRVbmlxdWVJZCgpKTsKKworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlhc3NlcnROb3ROdWxsKCJyZXNvdXJjZSB1bmlxdWVJZCBpcyBudWxsOiIsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlyZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlhc3NlcnROb3ROdWxsKCJzZXJ2aWNlIHVuaXF1ZUlkIGlzIG51bGw6Iiwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgiYWRkIEhFQVQgYXJ0aWZhY3QgdG8gcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJLy8gY2VydGlmaWVkIHJlc291cmNlCisJCXJlc3BvbnNlID0gTENTYmFzZVRlc3QuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKCJjZXJ0aWZ5IHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCS8vIGFkZCByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIEhFQVQgZGVwbG95bWVudCBhcnRpZmFjdCB0byB0aGUgc2VydmljZQorCQljb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMuc2V0Q29tcG9uZW50VWlkKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLAorCQkJCXNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDEsIHJldHVybmVkOiAiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisKKwkJcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMyLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCBzZXJ2aWNlRGV0YWlsczIuZ2V0VW5pcXVlSWQoKSk7CisKKwkJY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLnNldENvbXBvbmVudFVpZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwKKwkJCQlzZXJ2aWNlRGV0YWlsczIuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMSwgcmV0dXJuZWQ6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKworCQlyZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlsc0VtcHR5LCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCBzZXJ2aWNlRGV0YWlsc0VtcHR5LmdldFVuaXF1ZUlkKCkpOworCisJCXJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzRW1wdHkyLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCBzZXJ2aWNlRGV0YWlsc0VtcHR5Mi5nZXRVbmlxdWVJZCgpKTsKKworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjZXJ0aWZ5UmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCB1c2VyLmdldFVzZXJJZCgpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCS8vIGlmIChyZXN0UmVzcG9uc2VSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApeworCQlyZXN0UmVzcG9uc2VSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdXNlci5nZXRVc2VySWQoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJLy8gfWVsc2UKKwkJLy8gcmV0dXJuIHJlc3RSZXNwb25zZVJlc291cmNlOworCQlzZG5jVGVzdGVyRGVhdGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCWlmIChyZXN0UmVzcG9uc2VSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCXJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLAorCQkJCQlzZG5jVGVzdGVyRGVhdGFpbHMxLmdldFVzZXJJZCgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCX0gZWxzZQorCQkJcmV0dXJuIHJlc3RSZXNwb25zZVJlc291cmNlOworCQlpZiAocmVzdFJlc3BvbnNlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQlyZXN0UmVzcG9uc2VSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywKKwkJCQkJc2RuY1Rlc3RlckRlYXRhaWxzMS5nZXRVc2VySWQoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJfQorCQlyZXR1cm4gcmVzdFJlc3BvbnNlUmVzb3VyY2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2UoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2VTZXJ2aWNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgdXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkvLyBpZiAocmVzdFJlc3BvbnNlU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApeworCQlyZXN0UmVzcG9uc2VTZXJ2aWNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgdXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJLy8gfWVsc2UKKwkJLy8gcmV0dXJuIHJlc3RSZXNwb25zZVNlcnZpY2U7CisKKwkJc2RuY1Rlc3RlckRlYXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlpZiAocmVzdFJlc3BvbnNlU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCXJlc3RSZXNwb25zZVNlcnZpY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVGVzdGVyRGVhdGFpbHMxLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCX0gZWxzZQorCQkJcmV0dXJuIHJlc3RSZXNwb25zZVNlcnZpY2U7CisJCWlmIChyZXN0UmVzcG9uc2VTZXJ2aWNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCQkJcmVzdFJlc3BvbnNlU2VydmljZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNUZXN0ZXJEZWF0YWlsczEsCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCX0KKwkJcmV0dXJuIHJlc3RSZXNwb25zZVNlcnZpY2U7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBSZXN0UmVzcG9uc2UgcmFpc2VSZXNvdXJjZVRvVGFyZ2V0VmVyc2lvbihSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBTdHJpbmcgdGFyZ2V0VmVyc2lvbiwKKwkJCVVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiByYWlzZVJlc291cmNlVG9UYXJnZXRWZXJzaW9uKHJlc291cmNlRGV0YWlscywgdGFyZ2V0VmVyc2lvbiwgbnVsbCwgdXNlcik7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBSZXN0UmVzcG9uc2UgcmFpc2VSZXNvdXJjZVRvVGFyZ2V0VmVyc2lvbihSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBTdHJpbmcgdGFyZ2V0VmVyc2lvbiwKKwkJCVJlc3RSZXNwb25zZSBwcmV2UmVzcG9uc2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nW10gc3BsaXRQYXJ0cyA9IHRhcmdldFZlcnNpb24uc3BsaXQoIlxcLiIpOworCisJCWludCB2ZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChzcGxpdFBhcnRzWzFdKTsKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVN0cmluZyBjaGVja2luQ29tZW50SnNvbiA9ICJ7XCJ1c2VyUmVtYXJrc1wiOiBcIiIgKyBjaGVja2luQ29tbWVudCArICJcIn0iOworCisJCWlmIChwcmV2UmVzcG9uc2UgIT0gbnVsbCkgeworCQkJUmVzb3VyY2UgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJCS5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChwcmV2UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQlpZiAocmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRMaWZlY3ljbGVTdGF0ZSgpLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKSkgeworCQkJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2VSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywKKwkJCQkJCXVzZXIuZ2V0VXNlcklkKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQkJfQorCQl9CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZVJlc291cmNlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAodmVyc2lvbiAtIDEpOyBpKyspIHsKKworCQkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHVzZXIsIG51bGwsCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCQkJaWYgKHJlc3RSZXNwb25zZVJlc291cmNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCQkJCXJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCB1c2VyLmdldFVzZXJJZCgpLAorCQkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCQkJaWYgKHJlc3RSZXNwb25zZVJlc291cmNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCisJCQkJfSBlbHNlCisJCQkJCWJyZWFrOworCisJCQl9IGVsc2UKKwkJCQlicmVhazsKKworCQl9CisKKwkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHVzZXIsIG51bGwsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCBjaGVja2luQ29tZW50SnNvbik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCAyMDAsIHJlc3RSZXNwb25zZVJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXR1cm4gcmVzdFJlc3BvbnNlUmVzb3VyY2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L0NoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25UZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L0NoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZmEzYgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvQ2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDE0NzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9OT1RfRk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfVU5TVVBQT1JURURfRVJST1I7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEluc3RhbmNlQmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlByb2R1Y3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25UZXN0IGV4dGVuZHMgQ29tcG9uZW50SW5zdGFuY2VCYXNlVGVzdCB7CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHM7CisJcHVibGljIFN0cmluZyBmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZDsKKwlwdWJsaWMgU3RyaW5nIGZpcnN0VmZJbnN0YW5jZU5hbWU7CisJcHVibGljIFN0cmluZyBzZWNvbmRWZkluc3RhbmNlVW5pcXVlSWQ7CisJcHVibGljIFN0cmluZyBzZWNvdW5kVmZJbnN0YW5jZU5hbWU7CisJcHVibGljIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZDsKKwlwdWJsaWMgU3RyaW5nIGV4cGVjdGVkU2VydmljZU5hbWU7CisJcHVibGljIFN0cmluZyBleHBlY3RlZFBvc1g7CisJcHVibGljIFN0cmluZyBleHBlY3RlZFBvc1k7CisJcHVibGljIFN0cmluZyBhY3R1YWxTZXJ2aWNlSW5zdGFuY2VOYW1lOworCXB1YmxpYyBTdHJpbmcgYWN0dWFsUG9zWDsKKwlwdWJsaWMgU3RyaW5nIGFjdHVhbFBvc1k7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIENoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25UZXN0KCkgeworCQlzdXBlcihuYW1lLCBDaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZmlyc3RWZkluc3RhbmNlTmFtZSA9IG51bGw7CisJCXNlY291bmRWZkluc3RhbmNlTmFtZSA9IG51bGw7CisJCWZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkID0gbnVsbDsKKwkJc2Vjb25kVmZJbnN0YW5jZVVuaXF1ZUlkID0gbnVsbDsKKwkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQgPSBudWxsOworCQlleHBlY3RlZFNlcnZpY2VOYW1lID0gbnVsbDsKKwkJZXhwZWN0ZWRQb3NYID0gbnVsbDsKKwkJZXhwZWN0ZWRQb3NZID0gbnVsbDsKKwkJYWN0dWFsU2VydmljZUluc3RhbmNlTmFtZSA9IG51bGw7CisJCWFjdHVhbFBvc1ggPSBudWxsOworCQlhY3R1YWxQb3NZID0gbnVsbDsKKwkJaW5pdCgpOworCQljcmVhdGVDb21wb25lbnRzKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRkNfMDEpOworCQljaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzQ1BfMDEpOworCQljaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQocmVzb3VyY2VEZXRhaWxzQ1BfMDEpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCWNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZChyZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMik7CisJCWNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZChyZXNvdXJjZURldGFpbHNWRkNfMDIpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNDUF8wMik7CisJCWNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZChyZXNvdXJjZURldGFpbHNDUF8wMik7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc1ZMXzAyKTsKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlRGV0YWlsc1ZMXzAyKTsKKwkJY3JlYXRlVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIpOworCQljcmVhdGVWRihyZXNvdXJjZURldGFpbHNWRl8wMSk7CisJCS8vIGNyZWF0ZSBjaGVjay1JbiBzZXJ2aWNlcworCQljcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMik7CisJCWNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDMpOworCQljcmVhdGVQcm9kdWN0KHByb2R1Y3REZXRhaWxzXzAxKTsKKwkJY3JlYXRlUHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMik7CisKKwkJLy8gYWRkIHJlc291cmNlRGV0YWlsc0NQXzAxICxyZXNvdXJjZURldGFpbHNWRkNfMDEgYW5kCisJCS8vIHJlc291cmNlRGV0YWlsc0NQXzAxIHRvIHJlc291cmNlRGV0YWlsc1ZGXzAxIGFuZCBjZXJ0aWZ5CisJCS8vIHJlc291cmNlRGV0YWlsc1ZGXzAxCisJCWNlcnRpZnlWZihyZXNvdXJjZURldGFpbHNWRl8wMSwgcmVzb3VyY2VEZXRhaWxzVkZDXzAyLCByZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCS8vIGFkZCByZXNvdXJjZURldGFpbHNDUF8wMiAscmVzb3VyY2VEZXRhaWxzVkZDXzAyIGFuZAorCQkvLyByZXNvdXJjZURldGFpbHNWTF8wMiB0byByZXNvdXJjZURldGFpbHNWRl8wMiBhbmQgY2VydGlmeQorCQkvLyByZXNvdXJjZURldGFpbHNWRl8wMgorCQljZXJ0aWZ5VmYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1ZGQ18wMiwgcmVzb3VyY2VEZXRhaWxzQ1BfMDIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0YW5jZVJlc3BvbnNlID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsgLy8gc2VydmljZURldGFpbHNfMDEgaGFzIGNlcnRpZmllZAorCQkJCQkJCQkJCS8vIHJlc291cmNlRGV0YWlsc1ZGXzAxCisJCWZpcnN0VmZJbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKGNyZWF0ZVZGSW5zdGFuY2VSZXNwb25zZSk7CisJCWNyZWF0ZVZGSW5zdGFuY2VSZXNwb25zZSA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMiwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7IC8vIHNlcnZpY2VEZXRhaWxzXzAxIGhhcyBjZXJ0aWZpZWQKKwkJCQkJCQkJCQkvLyByZXNvdXJjZURldGFpbHNWRl8wMgorCQlzZWNvdW5kVmZJbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RhbmNlUmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25CeVBtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSkgdG8gcHJvZHVjdCB3aXRob3V0IHNhdmluZworCQkvLyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlRHVyaW5nU2V0dXAocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZChzZXJ2aWNlTmV3VW5pcXVlVWlkKTsKKwkJLy8gZ2V0IHRoZSBuZXcgVkYgaW5zdGFuY2UgdW5pcXVlSWQgYWZ0ZXIgY2hlY2tvdXQgc2VydmljZQorCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIHNkbmNQbURldGFpbHMxKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gc2VydmljZUNvbXBvbmVudEluc3RhbmNlcyA9IHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50IDogc2VydmljZUNvbXBvbmVudEluc3RhbmNlcykgeworCQkJaWYgKGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKGZpcnN0VmZJbnN0YW5jZU5hbWUpKSB7CisJCQkJZmlyc3RWZkluc3RhbmNlVW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKGZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBkZWxldGUgcmVzb3VyY2UgaW5zdGFuY2UgKHJlc291cmNlRGV0YWlsc1ZGXzAxKSBmcm9tIFNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVZmRnJvbVNlcnZpY2VSZXNwb25zZSA9IGRlbGV0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydFRydWUoZGVsZXRlVmZGcm9tU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFKTsKKwkJLy8gQWRkIGRpZmZlcmVudCBWRiBpbnN0YW5jZSAocmVzb3VyY2VEZXRhaWxzVkZfMDIpIHRvIFNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UocmVzdFJlc3BvbnNlKTsKKwkJLy8gQ2hlY2stSW4gc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hlY2stb3V0IHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBnZXQgc2VydmljZSBpbnN0YW5jZSBuZXcgdW5pcXVlSWQgLCBuYW1lIGFuZCBwb3NpdGlvbiBhZnRlciBjaGVja291dAorCQkvLyBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdE5ld1VuaXF1ZUlkLCBzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IHByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50IDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCkuZXF1YWxzKGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUpKSB7CisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCQlleHBlY3RlZFNlcnZpY2VOYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKKwkJCQlleHBlY3RlZFBvc1ggPSBjb21wb25lbnQuZ2V0UG9zWCgpOworCQkJCWV4cGVjdGVkUG9zWSA9IGNvbXBvbmVudC5nZXRQb3NZKCk7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCAhPSBudWxsKTsKKwkJLy8gY2hhbmdlIHNlcnZpY2UgaW5zdGFuY2UgdG8gbmV3ZXIgdmVyc2lvbgorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlID0gY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbihwcm9kdWN0TmV3VW5pcXVlSWQsCisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQsIHNlcnZpY2VOZXdVbmlxdWVVaWQsIHNkbmNQbURldGFpbHMxLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULCB0cnVlKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsU2VydmljZUluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsUG9zWCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWCIpOworCQlhY3R1YWxQb3NZID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJwb3NZIik7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCS8vIENoZWNrLWluIHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwkJLy8gVmVyaWZ5IHRoYXQgU2VydmljZSBpbnN0YW5jZSBuYW1lIGFuZCBwb3NpdGlvbiBkaWRuJ3QgY2hhbmdlIGFmdGVyCisJCS8vIGNoYW5naW5nIHNlcnZpY2UgaW5zdGFuY2UgdmVyc2lvbgorCQlhc3NlcnRUcnVlKGFjdHVhbFNlcnZpY2VJbnN0YW5jZU5hbWUuZXF1YWxzKGV4cGVjdGVkU2VydmljZU5hbWUpKTsKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxQb3NYLmVxdWFscyhleHBlY3RlZFBvc1gpKTsKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxQb3NZLmVxdWFscyhleHBlY3RlZFBvc1kpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25CeUFkbWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSkgdG8gcHJvZHVjdCB3aXRob3V0IHNhdmluZworCQkvLyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlRHVyaW5nU2V0dXAocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZChzZXJ2aWNlTmV3VW5pcXVlVWlkKTsKKwkJLy8gZ2V0IHRoZSBuZXcgVkYgaW5zdGFuY2UgdW5pcXVlSWQgYWZ0ZXIgY2hlY2tvdXQgc2VydmljZQorCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIHNkbmNQbURldGFpbHMxKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gc2VydmljZUNvbXBvbmVudEluc3RhbmNlcyA9IHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50IDogc2VydmljZUNvbXBvbmVudEluc3RhbmNlcykgeworCQkJaWYgKGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKGZpcnN0VmZJbnN0YW5jZU5hbWUpKSB7CisJCQkJZmlyc3RWZkluc3RhbmNlVW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKGZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBkZWxldGUgcmVzb3VyY2UgaW5zdGFuY2UgKHJlc291cmNlRGV0YWlsc1ZGXzAxKSBmcm9tIFNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVZmRnJvbVNlcnZpY2VSZXNwb25zZSA9IGRlbGV0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydFRydWUoZGVsZXRlVmZGcm9tU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFKTsKKwkJLy8gQWRkIGRpZmZlcmVudCBWRiBpbnN0YW5jZSAocmVzb3VyY2VEZXRhaWxzVkZfMDIpIHRvIFNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UocmVzdFJlc3BvbnNlKTsKKwkJLy8gc2VydmljZSBbMC4yXSBzdGF0ZSB0byBDRVJUSUZJQ0FUSU9OUkVRVUVTVAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hlY2stb3V0IHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jQWRtaW5EZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCS8vIGdldCBzZXJ2aWNlIGluc3RhbmNlIG5ldyB1bmlxdWVJZCAsIG5hbWUgYW5kIHBvc2l0aW9uIGFmdGVyIGNoZWNrb3V0CisJCS8vIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0TmV3VW5pcXVlSWQsIHNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBwcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gcHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKS5lcXVhbHMoZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSkpIHsKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJCWV4cGVjdGVkU2VydmljZU5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOworCQkJCWV4cGVjdGVkUG9zWCA9IGNvbXBvbmVudC5nZXRQb3NYKCk7CisJCQkJZXhwZWN0ZWRQb3NZID0gY29tcG9uZW50LmdldFBvc1koKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgc2RuY0FkbWluRGV0YWlscywgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwKKwkJCQl0cnVlKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsU2VydmljZUluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsUG9zWCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWCIpOworCQlhY3R1YWxQb3NZID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJwb3NZIik7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCS8vIENoZWNrLWluIHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jQWRtaW5EZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCQkvLyBWZXJpZnkgdGhhdCBTZXJ2aWNlIGluc3RhbmNlIG5hbWUgYW5kIHBvc2l0aW9uIGRpZG4ndCBjaGFuZ2UgYWZ0ZXIKKwkJLy8gY2hhbmdpbmcgc2VydmljZSBpbnN0YW5jZSB2ZXJzaW9uCisJCWFzc2VydFRydWUoYWN0dWFsU2VydmljZUluc3RhbmNlTmFtZS5lcXVhbHMoZXhwZWN0ZWRTZXJ2aWNlTmFtZSkpOworCQlhc3NlcnRUcnVlKGFjdHVhbFBvc1guZXF1YWxzKGV4cGVjdGVkUG9zWCkpOworCQlhc3NlcnRUcnVlKGFjdHVhbFBvc1kuZXF1YWxzKGV4cGVjdGVkUG9zWSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hhbmdlU2VydmljZUluc3RhbmNlVG9PbGRlclZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gR2V0IFZGIEluc3RhbmNlIFVuaXF1SWQgW1NlcnZpY2UgdmVyc2lvbiAwLjFdCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgc2RuY1BtRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCA9IGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyBzZXJ2aWNlT2xkZXJWZXJzaW9uVW5pcXVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGdldFNlcnZpY2VSZXNwb25zZSk7CisKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgc2VydmljZU5ld1VuaXF1ZVVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoc2VydmljZU5ld1VuaXF1ZVVpZCk7CisJCS8vIGdldCB0aGUgbmV3IFZGIGluc3RhbmNlIHVuaXF1ZUlkIGFmdGVyIGNoZWNrb3V0IHNlcnZpY2UKKwkJZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIHNkbmNQbURldGFpbHMxKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHNlcnZpY2VDb21wb25lbnRJbnN0YW5jZXMgPSBzZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudCA6IHNlcnZpY2VDb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wb25lbnQuZ2V0TmFtZSgpLmVxdWFscyhmaXJzdFZmSW5zdGFuY2VOYW1lKSkgeworCQkJCWZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkID0gY29tcG9uZW50LmdldFVuaXF1ZUlkKCk7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZShmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCAhPSBudWxsKTsKKwkJLy8gZGVsZXRlIHJlc291cmNlIGluc3RhbmNlIChyZXNvdXJjZURldGFpbHNWRl8wMSkgZnJvbSBTZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBkZWxldGVWZkZyb21TZXJ2aWNlUmVzcG9uc2UgPSBkZWxldGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoZmlyc3RWZkluc3RhbmNlVW5pcXVlSWQsCisJCQkJc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVZmRnJvbVNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCS8vIEFkZCBkaWZmZXJlbnQgVkYgaW5zdGFuY2UgKHJlc291cmNlRGV0YWlsc1ZGXzAyKSB0byBTZXJ2aWNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKHJlc3RSZXNwb25zZSk7CisJCS8vIENoZWNrLUluIHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSBWMC4yKSB0byBwcm9kdWN0IHdpdGhvdXQKKwkJLy8gc2F2aW5nIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VEdXJpbmdTZXR1cChwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldFJlc3BvbnNlKCksICJub3JtYWxpemVkTmFtZSIpOworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDIpIHRvIHByb2R1Y3QgQU5EIC0tLT4gU2F2ZQorCQkvLyBSZXEmQ2FwCisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIGNoZWNrLWluIHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0T2xkVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIGNoZWNrLW91dCBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3ROZXdVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJdXBkYXRlRXhwZWN0ZWRSZXFDYXBBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKHByb2R1Y3RPbGRVbmlxdWVJZCwgcHJvZHVjdE5ld1VuaXF1ZUlkKTsKKwkJLy8gZ2V0IHNlcnZpY2UgaW5zdGFuY2UgbmV3IHVuaXF1ZUlkICwgbmFtZSBhbmQgcG9zaXRpb24gYWZ0ZXIgY2hlY2tvdXQKKwkJLy8gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3ROZXdVbmlxdWVJZCwgc2RuY1BtRGV0YWlsczEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IHByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBwcm9kdWN0LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudCA6IGNvbXBvbmVudEluc3RhbmNlcykgeworCQkJaWYgKGNvbXBvbmVudC5nZXROb3JtYWxpemVkTmFtZSgpLmVxdWFscyhmaXJzdFNlcnZpY2VJbnN0YW5jZU5vcm1hbGl6ZWROYW1lKSkgeworCQkJCXNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkID0gY29tcG9uZW50LmdldFVuaXF1ZUlkKCk7CisJCQkJZXhwZWN0ZWRTZXJ2aWNlTmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7CisJCQkJZXhwZWN0ZWRQb3NYID0gY29tcG9uZW50LmdldFBvc1goKTsKKwkJCQlleHBlY3RlZFBvc1kgPSBjb21wb25lbnQuZ2V0UG9zWSgpOworCQkJfQorCQl9CisJCWFzc2VydFRydWUoc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQgIT0gbnVsbCk7CisJCS8vIGNoYW5nZSBzZXJ2aWNlIGluc3RhbmNlIHRvIE9sZGVyIHZlcnNpb24KKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSA9IGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb24ocHJvZHVjdE5ld1VuaXF1ZUlkLAorCQkJCXNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBzZXJ2aWNlT2xkZXJWZXJzaW9uVW5pcXVJZCwgc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsCisJCQkJdHJ1ZSk7CisJCS8vIFJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPQorCQkvLyBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksCisJCS8vIHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkICwgc2VydmljZU5ld1VuaXF1ZVVpZCwKKwkJLy8gc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QgLCB0cnVlKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsU2VydmljZUluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsUG9zWCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWCIpOworCQlhY3R1YWxQb3NZID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJwb3NZIik7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCS8vIENoZWNrLWluIHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwkJLy8gVmVyaWZ5IHRoYXQgU2VydmljZSBpbnN0YW5jZSBuYW1lIGFuZCBwb3NpdGlvbiBkaWRuJ3QgY2hhbmdlIGFmdGVyCisJCS8vIGNoYW5naW5nIHNlcnZpY2UgaW5zdGFuY2UgdmVyc2lvbgorCQlhc3NlcnRUcnVlKGFjdHVhbFNlcnZpY2VJbnN0YW5jZU5hbWUuZXF1YWxzKGV4cGVjdGVkU2VydmljZU5hbWUpKTsKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxQb3NYLmVxdWFscyhleHBlY3RlZFBvc1gpKTsKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxQb3NZLmVxdWFscyhleHBlY3RlZFBvc1kpKTsKKwl9CisKKwkvLyBERTE5MDIwMQorCUBUZXN0CisJcHVibGljIHZvaWQgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblRvQ2VydGlmaWVkVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDEpIHRvIHByb2R1Y3Qgd2l0aG91dCBzYXZpbmcKKwkJLy8gUmVxJkNhcAorCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZUR1cmluZ1NldHVwKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBmaXJzdFNlcnZpY2VJbnN0YW5jZU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSwgIm5vcm1hbGl6ZWROYW1lIik7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMikgdG8gcHJvZHVjdCBBTkQgLS0tPiBTYXZlCisJCS8vIFJlcSZDYXAKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDIsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gY2hlY2staW4gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0T2xkVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIENoZWNrb3V0IHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvKgorCQkgKiBTdHJpbmcgc2VydmljZU5ld1VuaXF1ZVVpZCA9CisJCSAqIFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJICogc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoc2VydmljZU5ld1VuaXF1ZVVpZCk7CisJCSAqLworCQkvLyBnZXQgdGhlIG5ldyBWRiBpbnN0YW5jZSB1bmlxdWVJZCBhZnRlciBjaGVja291dCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgc2RuY1BtRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBzZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VzID0gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBzZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5hbWUoKS5lcXVhbHMoZmlyc3RWZkluc3RhbmNlTmFtZSkpIHsKKwkJCQlmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJfQorCQl9CisJCWFzc2VydFRydWUoZmlyc3RWZkluc3RhbmNlVW5pcXVlSWQgIT0gbnVsbCk7CisJCS8vIGRlbGV0ZSByZXNvdXJjZSBpbnN0YW5jZSAocmVzb3VyY2VEZXRhaWxzVkZfMDEpIGZyb20gU2VydmljZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlVmZGcm9tU2VydmljZVJlc3BvbnNlID0gZGVsZXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKGZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVWZkZyb21TZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEUpOworCQkvLyBBZGQgZGlmZmVyZW50IFZGIGluc3RhbmNlIChyZXNvdXJjZURldGFpbHNWRl8wMikgdG8gU2VydmljZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShyZXN0UmVzcG9uc2UpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1Rlc3RlckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGVjay1vdXQgcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCS8vIGdldCBzZXJ2aWNlIGluc3RhbmNlIG5ldyB1bmlxdWVJZCAsIG5hbWUgYW5kIHBvc2l0aW9uIGFmdGVyIGNoZWNrb3V0CisJCS8vIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0TmV3VW5pcXVlSWQsIHNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBwcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gcHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKS5lcXVhbHMoZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSkpIHsKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJCWV4cGVjdGVkU2VydmljZU5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOworCQkJCWV4cGVjdGVkUG9zWCA9IGNvbXBvbmVudC5nZXRQb3NYKCk7CisJCQkJZXhwZWN0ZWRQb3NZID0gY29tcG9uZW50LmdldFBvc1koKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQkvLyBSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlID0KKwkJLy8gY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbihwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkvLyBzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCAsIHNlcnZpY2VOZXdVbmlxdWVVaWQsCisJCS8vIHNkbmNQbURldGFpbHMxLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUICwgdHJ1ZSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSk7CisJCWFjdHVhbFNlcnZpY2VJbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSk7CisJCWFjdHVhbFBvc1ggPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJInBvc1giKTsKKwkJYWN0dWFsUG9zWSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWSIpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkvLyBDaGVjay1pbiBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCS8vIFZlcmlmeSB0aGF0IFNlcnZpY2UgaW5zdGFuY2UgbmFtZSBhbmQgcG9zaXRpb24gZGlkbid0IGNoYW5nZSBhZnRlcgorCQkvLyBjaGFuZ2luZyBzZXJ2aWNlIGluc3RhbmNlIHZlcnNpb24KKwkJYXNzZXJ0VHJ1ZShhY3R1YWxTZXJ2aWNlSW5zdGFuY2VOYW1lLmVxdWFscyhleHBlY3RlZFNlcnZpY2VOYW1lKSk7CisJCWFzc2VydFRydWUoYWN0dWFsUG9zWC5lcXVhbHMoZXhwZWN0ZWRQb3NYKSk7CisJCWFzc2VydFRydWUoYWN0dWFsUG9zWS5lcXVhbHMoZXhwZWN0ZWRQb3NZKSk7CisJfQorCisJLy8gREUxOTE5MjcKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblRoZW5SZUNoZWNrSW5Qcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSkgdG8gcHJvZHVjdCB3aXRob3V0IHNhdmluZworCQkvLyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlRHVyaW5nU2V0dXAocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZChzZXJ2aWNlTmV3VW5pcXVlVWlkKTsKKwkJLy8gZ2V0IHRoZSBuZXcgVkYgaW5zdGFuY2UgdW5pcXVlSWQgYWZ0ZXIgY2hlY2tvdXQgc2VydmljZQorCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIHNkbmNQbURldGFpbHMxKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gc2VydmljZUNvbXBvbmVudEluc3RhbmNlcyA9IHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50IDogc2VydmljZUNvbXBvbmVudEluc3RhbmNlcykgeworCQkJaWYgKGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKGZpcnN0VmZJbnN0YW5jZU5hbWUpKSB7CisJCQkJZmlyc3RWZkluc3RhbmNlVW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKGZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBkZWxldGUgcmVzb3VyY2UgaW5zdGFuY2UgKHJlc291cmNlRGV0YWlsc1ZGXzAxKSBmcm9tIFNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVZmRnJvbVNlcnZpY2VSZXNwb25zZSA9IGRlbGV0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydFRydWUoZGVsZXRlVmZGcm9tU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFKTsKKwkJLy8gQWRkIGRpZmZlcmVudCBWRiBpbnN0YW5jZSAocmVzb3VyY2VEZXRhaWxzVkZfMDIpIHRvIFNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UocmVzdFJlc3BvbnNlKTsKKwkJLy8gQ2hlY2stSW4gc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hlY2stb3V0IHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBnZXQgc2VydmljZSBpbnN0YW5jZSBuZXcgdW5pcXVlSWQgLCBuYW1lIGFuZCBwb3NpdGlvbiBhZnRlciBjaGVja291dAorCQkvLyBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdE5ld1VuaXF1ZUlkLCBzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IHByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50IDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCkuZXF1YWxzKGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUpKSB7CisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCQlleHBlY3RlZFNlcnZpY2VOYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKKwkJCQlleHBlY3RlZFBvc1ggPSBjb21wb25lbnQuZ2V0UG9zWCgpOworCQkJCWV4cGVjdGVkUG9zWSA9IGNvbXBvbmVudC5nZXRQb3NZKCk7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCAhPSBudWxsKTsKKwkJLy8gY2hhbmdlIHNlcnZpY2UgaW5zdGFuY2UgdG8gbmV3ZXIgdmVyc2lvbgorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlID0gY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbihwcm9kdWN0TmV3VW5pcXVlSWQsCisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQsIHNlcnZpY2VOZXdVbmlxdWVVaWQsIHNkbmNQbURldGFpbHMxLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULCB0cnVlKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsU2VydmljZUluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlKTsKKwkJYWN0dWFsUG9zWCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWCIpOworCQlhY3R1YWxQb3NZID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJwb3NZIik7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCS8vIENoZWNrLWluIHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlwcm9kdWN0T2xkVW5pcXVlSWQgPSBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpOworCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIENoZWNrLWluIHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXByb2R1Y3ROZXdVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJdXBkYXRlRXhwZWN0ZWRSZXFDYXBBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKHByb2R1Y3RPbGRVbmlxdWVJZCwgcHJvZHVjdE5ld1VuaXF1ZUlkKTsKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwkJLy8gVmVyaWZ5IHRoYXQgU2VydmljZSBpbnN0YW5jZSBuYW1lIGFuZCBwb3NpdGlvbiBkaWRuJ3QgY2hhbmdlIGFmdGVyCisJCS8vIGNoYW5naW5nIHNlcnZpY2UgaW5zdGFuY2UgdmVyc2lvbgorCQlhc3NlcnRUcnVlKGFjdHVhbFNlcnZpY2VJbnN0YW5jZU5hbWUuZXF1YWxzKGV4cGVjdGVkU2VydmljZU5hbWUpKTsKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxQb3NYLmVxdWFscyhleHBlY3RlZFBvc1gpKTsKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxQb3NZLmVxdWFscyhleHBlY3RlZFBvc1kpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVRvSGlzVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBHZXQgVkYgSW5zdGFuY2UgVW5pcXVJZCBbU2VydmljZSB2ZXJzaW9uIDAuMV0KKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBzZG5jUG1EZXRhaWxzMSk7CisJCVN0cmluZyBzZXJ2aWNlT2xkZXJWZXJzaW9uVW5pcXVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGdldFNlcnZpY2VSZXNwb25zZSk7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSkgdG8gcHJvZHVjdCB3aXRob3V0IHNhdmluZworCQkvLyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlRHVyaW5nU2V0dXAocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZChzZXJ2aWNlTmV3VW5pcXVlVWlkKTsKKwkJLy8gZ2V0IHRoZSBuZXcgVkYgaW5zdGFuY2UgdW5pcXVlSWQgYWZ0ZXIgY2hlY2tvdXQgc2VydmljZQorCQlnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgc2RuY1BtRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBzZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VzID0gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBzZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5hbWUoKS5lcXVhbHMoZmlyc3RWZkluc3RhbmNlTmFtZSkpIHsKKwkJCQlmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJfQorCQl9CisJCWFzc2VydFRydWUoZmlyc3RWZkluc3RhbmNlVW5pcXVlSWQgIT0gbnVsbCk7CisJCS8vIGRlbGV0ZSByZXNvdXJjZSBpbnN0YW5jZSAocmVzb3VyY2VEZXRhaWxzVkZfMDEpIGZyb20gU2VydmljZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlVmZGcm9tU2VydmljZVJlc3BvbnNlID0gZGVsZXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKGZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVWZkZyb21TZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEUpOworCQkvLyBBZGQgZGlmZmVyZW50IFZGIGluc3RhbmNlIChyZXNvdXJjZURldGFpbHNWRl8wMikgdG8gU2VydmljZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShyZXN0UmVzcG9uc2UpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGVjay1vdXQgcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCS8vIGdldCBzZXJ2aWNlIGluc3RhbmNlIG5ldyB1bmlxdWVJZCAsIG5hbWUgYW5kIHBvc2l0aW9uIGFmdGVyIGNoZWNrb3V0CisJCS8vIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0TmV3VW5pcXVlSWQsIHNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBwcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gcHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKS5lcXVhbHMoZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSkpIHsKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJCWV4cGVjdGVkU2VydmljZU5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOworCQkJCWV4cGVjdGVkUG9zWCA9IGNvbXBvbmVudC5nZXRQb3NYKCk7CisJCQkJZXhwZWN0ZWRQb3NZID0gY29tcG9uZW50LmdldFBvc1koKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU9sZGVyVmVyc2lvblVuaXF1SWQsIHNkbmNQbURldGFpbHMxLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULAorCQkJCXRydWUpOworCQkvLyBSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlID0KKwkJLy8gY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbihwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkvLyBzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCAsIHNlcnZpY2VOZXdVbmlxdWVVaWQsCisJCS8vIHNkbmNQbURldGFpbHMxLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUICwgdHJ1ZSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSk7CisJCWFjdHVhbFNlcnZpY2VJbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSk7CisJCWFjdHVhbFBvc1ggPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJInBvc1giKTsKKwkJYWN0dWFsUG9zWSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWSIpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkvLyBDaGVjay1pbiBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCS8vIFZlcmlmeSB0aGF0IFNlcnZpY2UgaW5zdGFuY2UgbmFtZSBhbmQgcG9zaXRpb24gZGlkbid0IGNoYW5nZSBhZnRlcgorCQkvLyBjaGFuZ2luZyBzZXJ2aWNlIGluc3RhbmNlIHZlcnNpb24KKwkJYXNzZXJ0VHJ1ZShhY3R1YWxTZXJ2aWNlSW5zdGFuY2VOYW1lLmVxdWFscyhleHBlY3RlZFNlcnZpY2VOYW1lKSk7CisJCWFzc2VydFRydWUoYWN0dWFsUG9zWC5lcXVhbHMoZXhwZWN0ZWRQb3NYKSk7CisJCWFzc2VydFRydWUoYWN0dWFsUG9zWS5lcXVhbHMoZXhwZWN0ZWRQb3NZKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uQnlBZG1pbk5vdEJ5UHJvZHVjdE93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSkgdG8gcHJvZHVjdCB3aXRob3V0IHNhdmluZworCQkvLyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMikgdG8gcHJvZHVjdCBBTkQgLS0tPiBTYXZlCisJCS8vIFJlcSZDYXAKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDIsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gY2hlY2staW4gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0T2xkVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIENoZWNrb3V0IHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgc2VydmljZU5ld1VuaXF1ZVVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2stSW4gc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hlY2stb3V0IHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCisJCS8vIGNoYW5nZSBzZXJ2aWNlIGluc3RhbmNlIHRvIG5ld2VyIHZlcnNpb24KKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSA9IGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb24ocHJvZHVjdE5ld1VuaXF1ZUlkLAorCQkJCXNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBzZXJ2aWNlTmV3VW5pcXVlVWlkLCBzZG5jQWRtaW5EZXRhaWxzLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULAorCQkJCXRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBDaGVjay1pbiBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25CeVBtTm90QnlQcm9kdWN0T3duZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAxKSB0byBwcm9kdWN0IEFORCAtLS0+CisJCS8vIHNhdmluZyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMikgdG8gcHJvZHVjdCBBTkQgLS0tPiBTYXZlCisJCS8vIFJlcSZDYXAKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDIsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gY2hlY2staW4gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0T2xkVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIENoZWNrb3V0IHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgc2VydmljZU5ld1VuaXF1ZVVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoc2VydmljZU5ld1VuaXF1ZVVpZCk7CisJCS8vIENoZWNrLUluIHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIGNoZWNrLW91dCBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3ROZXdVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hhbmdlIHVuaXF1ZUlkIGFmdGVyIHByb2R1Y3QgY2hlY2stb3V0IGluIGV4cGVjdGVkIFJlcSZDYXAKKwkJdXBkYXRlRXhwZWN0ZWRSZXFDYXBBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKHByb2R1Y3RPbGRVbmlxdWVJZCwgcHJvZHVjdE5ld1VuaXF1ZUlkKTsKKwkJdXBkYXRlTmV3Q29tcG9uZW50SW5zdGFuY2VJZChjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBDSEFOR0UgU2VydmljZSBJbnN0YW5jZSBWRVJTSU9OIEJZIE5PTiBQUk9EVUNUIE9XTkVSIChzZG5jUG1EZXRhaWxzMQorCQkvLyBpbnN0ZWFkIHNkbmNQbURldGFpbHMxKQorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlID0gY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbigKKwkJCQlwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgc2RuY1BtRGV0YWlsczIsCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgdHJ1ZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQljaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIENoZWNrLWluIHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25CeVRlc3RlcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDEpIHRvIHByb2R1Y3QgQU5EIC0tLT4KKwkJLy8gc2F2aW5nIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMikgdG8gcHJvZHVjdCBBTkQgLS0tPiBTYXZlCisJCS8vIFJlcSZDYXAKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDIsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gY2hlY2staW4gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0T2xkVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIENoZWNrb3V0IHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgc2VydmljZU5ld1VuaXF1ZVVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoc2VydmljZU5ld1VuaXF1ZVVpZCk7CisJCS8vIENoZWNrLUluIHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIGNoZWNrLW91dCBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3ROZXdVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hhbmdlIHVuaXF1ZUlkIGFmdGVyIHByb2R1Y3QgY2hlY2stb3V0IGluIGV4cGVjdGVkIFJlcSZDYXAKKwkJdXBkYXRlRXhwZWN0ZWRSZXFDYXBBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKHByb2R1Y3RPbGRVbmlxdWVJZCwgcHJvZHVjdE5ld1VuaXF1ZUlkKTsKKwkJLy8gQ0hBTkdFIFNlcnZpY2UgSW5zdGFuY2UgVkVSU0lPTiBCWSBOT04gUFJPRFVDVCBPV05FUiAoc2RuY1BtRGV0YWlsczEKKwkJLy8gaW5zdGVhZCBzZG5jUG1EZXRhaWxzMSkKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSA9IGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb24oCisJCQkJcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQsIHNlcnZpY2VOZXdVbmlxdWVVaWQsCisJCQkJc2RuY1Rlc3RlckRldGFpbHMsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBDaGVjay1pbiBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUHJvZHVjdElzTm90Q2hlY2tPdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAxKSB0byBwcm9kdWN0IEFORCAtLS0+CisJCS8vIHNhdmluZyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDIpIHRvIHByb2R1Y3QgQU5EIC0tLT4gU2F2ZQorCQkvLyBSZXEmQ2FwCisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIGNoZWNrLWluIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE9sZFVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBDaGVja291dCBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHNlcnZpY2VOZXdVbmlxdWVVaWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXNlcnZpY2VEZXRhaWxzXzAxLnNldFVuaXF1ZUlkKHNlcnZpY2VOZXdVbmlxdWVVaWQpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBDSEFOR0UgU2VydmljZSBJbnN0YW5jZSBWRVJTSU9OIGZvciBOb24gY2hlY2tlZE91dCBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3RPbGRVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJLy8gREUxOTE3MjcKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblNlcnZpY2VJc0luQ2hlY2tPdXRTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDEpIHRvIHByb2R1Y3QgQU5EIC0tLT4KKwkJLy8gc2F2aW5nIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMikgdG8gcHJvZHVjdCBBTkQgLS0tPiBTYXZlCisJCS8vIFJlcSZDYXAKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDIsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gY2hlY2staW4gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0T2xkVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIENoZWNrb3V0IHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgc2VydmljZU5ld1VuaXF1ZVVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hlY2stb3V0IHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGFuZ2UgdW5pcXVlSWQgYWZ0ZXIgcHJvZHVjdCBjaGVjay1vdXQgaW4gZXhwZWN0ZWQgUmVxJkNhcAorCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBDSEFOR0UgU2VydmljZSBJbnN0YW5jZSBWRVJTSU9OIHRvIHNlcnZpY2UgaW4gY2hlY2tPdXQgc3RhdGUKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSA9IGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb24oCisJCQkJcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQsIHNlcnZpY2VOZXdVbmlxdWVVaWQsIHNkbmNQbURldGFpbHMxLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoc2VydmljZU5ld1VuaXF1ZVVpZCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYmFsZXMsCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBDaGVjay1pbiBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uU2VydmljZUluc3RhbmNlRG9lc05vdEV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSkgdG8gcHJvZHVjdCB3aXRob3V0IHNhdmluZworCQkvLyBSZXEmQ2FwCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMikgdG8gcHJvZHVjdCBBTkQgLS0tPiBTYXZlCisJCS8vIFJlcSZDYXAKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDIsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gY2hlY2staW4gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0T2xkVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCS8vIENoZWNrb3V0IHNlcnZpY2UgWzAuMl0KKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgc2VydmljZU5ld1VuaXF1ZVVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2stSW4gc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hlY2stb3V0IHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uCisJCVN0cmluZyBzZXJ2aWNlVW5pcXVlVWlkTm90RXhpc3QgPSAiMTIzNDU2Nzg5MCI7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlVW5pcXVlVWlkTm90RXhpc3QsIHNlcnZpY2VOZXdVbmlxdWVVaWQsIHNkbmNQbURldGFpbHMxLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULCB0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQljaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKHNlcnZpY2VVbmlxdWVVaWROb3RFeGlzdCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCWNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gQ2hlY2staW4gcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCX0KKworCS8vIERFMTg5MzkyCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZU5vbkV4aXN0aW5nUHJvZHVjdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDEpIHRvIHByb2R1Y3Qgc2F2aW5nIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uIC0gTm9uIGV4aXN0aW5nIFByb2R1Y3QKKwkJU3RyaW5nIHByb2R1Y3ROZXdVbmlxdWVJZE5vdEV4aXN0ID0gIjEyMzQ1Njc4OTAiOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlID0gY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbihwcm9kdWN0TmV3VW5pcXVlSWROb3RFeGlzdCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQocHJvZHVjdE5ld1VuaXF1ZUlkTm90RXhpc3QpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORC5uYW1lKCksIHZhcmliYWxlcywKKwkJCQljaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25Ub05vbkV4aXNpdGluZ1NlcnZpY2VWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZGluZyBzZXJ2aWNlIGluc3RhbmNlIChzZXJ2aWNlRGV0YWlsc18wMSkgdG8gcHJvZHVjdCBzYXZpbmcgUmVxJkNhcAorCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDIpIHRvIHByb2R1Y3QgQU5EIC0tLT4gU2F2ZQorCQkvLyBSZXEmQ2FwCisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIGNoZWNrLWluIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE9sZFVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGVjay1vdXQgcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCS8vIGdldCBzZXJ2aWNlIGluc3RhbmNlIG5ldyB1bmlxdWVJZCAsIG5hbWUgYW5kIHBvc2l0aW9uIGFmdGVyIGNoZWNrb3V0CisJCS8vIHByb2R1Y3QKKwkJdXBkYXRlTmV3Q29tcG9uZW50SW5zdGFuY2VJZChjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBOb24tZXhpc3RpbmcgdmVyc2lvbgorCQlTdHJpbmcgc2VydmljZVVuaXF1ZVVpZE5vdEV4aXN0ID0gIjEyMzQ1Njc4OTAiOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlID0gY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbihwcm9kdWN0TmV3VW5pcXVlSWQsCisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQsIHNlcnZpY2VVbmlxdWVVaWROb3RFeGlzdCwgc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsCisJCQkJdHJ1ZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChzZXJ2aWNlVW5pcXVlVWlkTm90RXhpc3QpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORC5uYW1lKCksIHZhcmliYWxlcywKKwkJCQljaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVNlcnZpY2VJbnN0YW5jZUNvbXBvbmVudFR5cGVJc05vdFByb2R1Y3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAxKSB0byBwcm9kdWN0IHdpdGhvdXQgc2F2aW5nCisJCS8vIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZChzZXJ2aWNlTmV3VW5pcXVlVWlkKTsKKwkJLy8gQ2hlY2stSW4gc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gY2hlY2stb3V0IHByb2R1Y3QKKwkJY2hhbmdlU3RhdHVzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBnZXQgc2VydmljZSBpbnN0YW5jZSBuZXcgdW5pcXVlSWQgLCBuYW1lIGFuZCBwb3NpdGlvbiBhZnRlciBjaGVja291dAorCQkvLyBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdE5ld1VuaXF1ZUlkLCBzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IHByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50IDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCkuZXF1YWxzKGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUpKSB7CisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uIGZvciBOT04tQ29tcG9uZW50IFR5cGUgPQorCQkvLyBQcm9kdWN0IChlLmcuIHNlcnZpY2UpCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCWNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hhbmdlU2VydmljZUluc3RhbmNlQ29tcG9uZW50VHlwZU5vdFN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDEpIHRvIHByb2R1Y3Qgd2l0aG91dCBzYXZpbmcKKwkJLy8gUmVxJkNhcAorCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldFJlc3BvbnNlKCksICJub3JtYWxpemVkTmFtZSIpOworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDIpIHRvIHByb2R1Y3QgQU5EIC0tLT4gU2F2ZQorCQkvLyBSZXEmQ2FwCisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIGNoZWNrLWluIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE9sZFVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBDaGVja291dCBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHNlcnZpY2VOZXdVbmlxdWVVaWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXNlcnZpY2VEZXRhaWxzXzAxLnNldFVuaXF1ZUlkKHNlcnZpY2VOZXdVbmlxdWVVaWQpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGVjay1vdXQgcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCS8vIGdldCBzZXJ2aWNlIGluc3RhbmNlIG5ldyB1bmlxdWVJZCAsIG5hbWUgYW5kIHBvc2l0aW9uIGFmdGVyIGNoZWNrb3V0CisJCS8vIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0TmV3VW5pcXVlSWQsIHNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBwcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gcHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKS5lcXVhbHMoZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSkpIHsKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJfQorCQl9CisJCWFzc2VydFRydWUoc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQgIT0gbnVsbCk7CisJCS8vIGNoYW5nZSBzZXJ2aWNlIGluc3RhbmNlIHRvIG5ld2VyIHZlcnNpb24gZm9yIE5PTi1Db21wb25lbnQgVHlwZSA9CisJCS8vIFByb2R1Y3QgKGUuZy4gc2VydmljZSkKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZSA9IGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb24ocHJvZHVjdE5ld1VuaXF1ZUlkLAorCQkJCXNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBzZXJ2aWNlTmV3VW5pcXVlVWlkLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX0lOU1RBTkNFLCB0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1VOU1VQUE9SVEVEX0VSUk9SLAorCQkJCWNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoIm51bGwiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5VTlNVUFBPUlRFRF9FUlJPUi5uYW1lKCksIHZhcmliYWxlcywKKwkJCQljaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFNldmVyYWxTZXJ2aWNlSW5zdGFuY2VGcm9tU2FtZVNlcnZpY2VWZXJzaW9uQ2hhbmdlVmVyc2lvbk9ubHlGb3JPbmVTZXJ2aWNlSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAxKSB0byBwcm9kdWN0IHdpdGhvdXQgc2F2aW5nCisJCS8vIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VEdXJpbmdTZXR1cChwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldFJlc3BvbnNlKCksICJub3JtYWxpemVkTmFtZSIpOworCQkvLyBBZGRpbmcgc2VydmljZSBpbnN0YW5jZSAoc2VydmljZURldGFpbHNfMDIpIHRvIHByb2R1Y3QgQU5EIC0tLT4gU2F2ZQorCQkvLyBSZXEmQ2FwCisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIGNoZWNrLWluIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE9sZFVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBDaGVja291dCBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHNlcnZpY2VOZXdVbmlxdWVVaWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXNlcnZpY2VEZXRhaWxzXzAxLnNldFVuaXF1ZUlkKHNlcnZpY2VOZXdVbmlxdWVVaWQpOworCQkvLyBnZXQgdGhlIG5ldyBWRiBpbnN0YW5jZSB1bmlxdWVJZCBhZnRlciBjaGVja291dCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgc2RuY1BtRGV0YWlsczEpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBzZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VzID0gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBzZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5hbWUoKS5lcXVhbHMoZmlyc3RWZkluc3RhbmNlTmFtZSkpIHsKKwkJCQlmaXJzdFZmSW5zdGFuY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJfQorCQl9CisJCWFzc2VydFRydWUoZmlyc3RWZkluc3RhbmNlVW5pcXVlSWQgIT0gbnVsbCk7CisJCS8vIGRlbGV0ZSByZXNvdXJjZSBpbnN0YW5jZSAocmVzb3VyY2VEZXRhaWxzVkZfMDEpIGZyb20gU2VydmljZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlVmZGcm9tU2VydmljZVJlc3BvbnNlID0gZGVsZXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKGZpcnN0VmZJbnN0YW5jZVVuaXF1ZUlkLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVWZkZyb21TZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEUpOworCQkvLyBBZGQgZGlmZmVyZW50IFZGIGluc3RhbmNlIChyZXNvdXJjZURldGFpbHNWRl8wMikgdG8gU2VydmljZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShyZXN0UmVzcG9uc2UpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGVjay1vdXQgcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCS8vIGdldCBzZXJ2aWNlIGluc3RhbmNlIG5ldyB1bmlxdWVJZCAsIG5hbWUgYW5kIHBvc2l0aW9uIGFmdGVyIGNoZWNrb3V0CisJCS8vIHByb2R1Y3QKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0TmV3VW5pcXVlSWQsIHNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBwcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gcHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnQgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKS5lcXVhbHMoZmlyc3RTZXJ2aWNlSW5zdGFuY2VOb3JtYWxpemVkTmFtZSkpIHsKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJCWV4cGVjdGVkU2VydmljZU5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOworCQkJCWV4cGVjdGVkUG9zWCA9IGNvbXBvbmVudC5nZXRQb3NYKCk7CisJCQkJZXhwZWN0ZWRQb3NZID0gY29tcG9uZW50LmdldFBvc1koKTsKKwkJCX0KKwkJfQorCQlhc3NlcnRUcnVlKHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkICE9IG51bGwpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgc2RuY1BtRGV0YWlsczEsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UpOworCQlhY3R1YWxTZXJ2aWNlSW5zdGFuY2VOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0TmFtZUZyb21SZXNwb25zZShjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UpOworCQlhY3R1YWxQb3NYID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJwb3NYIik7CisJCWFjdHVhbFBvc1kgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJInBvc1kiKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJLy8gQ2hlY2staW4gcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCQkvLyBWZXJpZnkgdGhhdCBTZXJ2aWNlIGluc3RhbmNlIG5hbWUgYW5kIHBvc2l0aW9uIGRpZG4ndCBjaGFuZ2UgYWZ0ZXIKKwkJLy8gY2hhbmdpbmcgc2VydmljZSBpbnN0YW5jZSB2ZXJzaW9uCisJCWFzc2VydFRydWUoYWN0dWFsU2VydmljZUluc3RhbmNlTmFtZS5lcXVhbHMoZXhwZWN0ZWRTZXJ2aWNlTmFtZSkpOworCQlhc3NlcnRUcnVlKGFjdHVhbFBvc1guZXF1YWxzKGV4cGVjdGVkUG9zWCkpOworCQlhc3NlcnRUcnVlKGFjdHVhbFBvc1kuZXF1YWxzKGV4cGVjdGVkUG9zWSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbkJ5Tm9uQXNkY1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAxKSB0byBwcm9kdWN0IHdpdGhvdXQgc2F2aW5nCisJCS8vIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGVjay1vdXQgcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCVVzZXIgbm9uQXNkY1VzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlub25Bc2RjVXNlci5zZXRVc2VySWQoImJ0NzYwaCIpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgbm9uQXNkY1VzZXIsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBDaGVjay1pbiBwcm9kdWN0CisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uRW1wdHlVc2VySWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAxKSB0byBwcm9kdWN0IHdpdGhvdXQgc2F2aW5nCisJCS8vIFJlcSZDYXAKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJLy8gQWRkaW5nIHNlcnZpY2UgaW5zdGFuY2UgKHNlcnZpY2VEZXRhaWxzXzAyKSB0byBwcm9kdWN0IEFORCAtLS0+IFNhdmUKKwkJLy8gUmVxJkNhcAorCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQkvLyBjaGVjay1pbiBwcm9kdWN0CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJLy8gQ2hlY2tvdXQgc2VydmljZSBbMC4yXQorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlTmV3VW5pcXVlVWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBDaGVjay1JbiBzZXJ2aWNlIFswLjJdCisJCWNoYW5nZVN0YXR1c1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlU3RhdHVzUmVzcG9uc2UpOworCQkvLyBjaGVjay1vdXQgcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGFuZ2VTdGF0dXNSZXNwb25zZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShwcm9kdWN0T2xkVW5pcXVlSWQsIHByb2R1Y3ROZXdVbmlxdWVJZCk7CisJCVVzZXIgbm9uQXNkY1VzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlub25Bc2RjVXNlci5zZXRVc2VySWQoIiIpOworCQkvLyBjaGFuZ2Ugc2VydmljZSBpbnN0YW5jZSB0byBuZXdlciB2ZXJzaW9uCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UgPSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKHByb2R1Y3ROZXdVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZU5ld1VuaXF1ZVVpZCwgbm9uQXNkY1VzZXIsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTiwKKwkJCQljaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25SZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gQ2hlY2staW4gcHJvZHVjdAorCQljaGFuZ2VTdGF0dXNSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVN0YXR1c1Jlc3BvbnNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXByaXZhdGUgdm9pZCB1cGRhdGVOZXdDb21wb25lbnRJbnN0YW5jZUlkKFJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLCBTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaXJzdFNlcnZpY2VJbnN0YW5jZU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSwgIm5vcm1hbGl6ZWROYW1lIik7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdE5ld1VuaXF1ZUlkLCBzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IHByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50IDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCkuZXF1YWxzKGZpcnN0U2VydmljZUluc3RhbmNlTm9ybWFsaXplZE5hbWUpKSB7CisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCQlleHBlY3RlZFNlcnZpY2VOYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKKwkJCQlleHBlY3RlZFBvc1ggPSBjb21wb25lbnQuZ2V0UG9zWCgpOworCQkJCWV4cGVjdGVkUG9zWSA9IGNvbXBvbmVudC5nZXRQb3NZKCk7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCAhPSBudWxsKTsKKwl9CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJaWYgKHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY1Rlc3RlckRldGFpbHMsCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCQlpZiAocmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCQkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jVGVzdGVyRGV0YWlscywKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJCWlmIChyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBSZXNwb25zZVBhcnNlci5nZXRWZXJzaW9uRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZSk7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24obmV3VmVyc2lvbik7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCQkJCXJlc291cmNlRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZChzZG5jVGVzdGVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldExhc3RVcGRhdGVyRnVsbE5hbWUoc2RuY1Rlc3RlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCQkJU3RyaW5nIHVuaXF1ZUlkRnJvbVJyZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkJCSJ1bmlxdWVJZCIpOworCQkJCXJlc291cmNlRGV0YWlscy5zZXRVbmlxdWVJZCh1bmlxdWVJZEZyb21ScmVzcG9uc2UpOworCQkJfQorCQl9CisJCXJldHVybiByZXN0UmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNlcnRpZnlWZihSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFJlc291cmNlUmVxRGV0YWlscyBjb21wdXRlUmVzb3VyY2UsCisJCQlSZXNvdXJjZVJlcURldGFpbHMgY3BSZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRkR1cmluZ1NldHVwKHJlc291cmNlLCBjcFJlc291cmNlLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgZnJvbUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRkR1cmluZ1NldHVwKHJlc291cmNlLCBjb21wdXRlUmVzb3VyY2UsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCVN0cmluZyB0b0NvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXNwb25zZSk7CisKKwkJU3RyaW5nIGNhcE93bmVySWQgPSB0b0NvbXBJbnN0SWQ7CisJCVVzZXIgdXNlciA9IHNkbmNEZXNpZ25lckRldGFpbHM7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0U7CisKKwkJZnVsZmlsbENwUmVxdWlyZW1lbnQocmVzb3VyY2UsIGZyb21Db21wSW5zdElkLCB0b0NvbXBJbnN0SWQsIGNhcE93bmVySWQsIHVzZXIsIGNvbnRhaW5lckNvbXBUeXBlKTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkID0gY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0QmFzZVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdEJhc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5MWY0YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdEJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlBST0RVQ1RfQ09NUE9ORU5UX1RZUEU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuR3JvdXBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5DYXRlZ29yeVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvZHVjdEJhc2VUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCVVzZXIgcHJvZHVjdFN0cmF0ZWdpc3RVc2VyMTsKKwlVc2VyIHByb2R1Y3RTdHJhdGVnaXN0VXNlcjI7CisJVXNlciBwcm9kdWN0U3RyYXRlZ2lzdFVzZXIzOworCVVzZXIgcHJvZHVjdE1hbmFnZXIxOworCVVzZXIgcHJvZHVjdE1hbmFnZXIyOworCVVzZXIgYWRtaW5Vc2VyOworCVVzZXIgZGVzaWduZXJVc2VyOworCisJLy8gQ2F0ZWdvcnkxLT5TdWJjYXRlZ29yeTEtPkdyb3VwaW5nMQorCXByb3RlY3RlZCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gZGVmYXVsdENhdGVnb3JpZXM7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBhdWRpdEFjdGlvbjsKKwlwcm90ZWN0ZWQgc3RhdGljIENvbXBvbmVudE9wZXJhdGlvbkVudW0gb3BlcmF0aW9uOworCisJcHVibGljIFByb2R1Y3RCYXNlVGVzdChUZXN0TmFtZSB0ZXN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQlzdXBlcih0ZXN0TmFtZSwgY2xhc3NOYW1lKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgYmVmb3JlUHJvZHVjdFRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXByb2R1Y3RTdHJhdGVnaXN0VXNlcjEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMSk7CisJCXByb2R1Y3RTdHJhdGVnaXN0VXNlcjIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMik7CisJCXByb2R1Y3RTdHJhdGVnaXN0VXNlcjMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMyk7CisJCXByb2R1Y3RNYW5hZ2VyMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX01BTkFHRVIxKTsKKwkJcHJvZHVjdE1hbmFnZXIyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlBST0RVQ1RfTUFOQUdFUjIpOworCQlhZG1pblVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlkZXNpZ25lclVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQljcmVhdGVEZWZhdWx0Q2hhaW4oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdENoYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENhdGVnb3J5KCk7CisJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN1YkNhdGVnb3J5KCk7CisJCUdyb3VwaW5nRGVmaW5pdGlvbiBwcm9kdWN0R3JvdXBpbmdEZWZpbml0aW9uID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEdyb3VwKCk7CisJCXByb2R1Y3RDYXRlZ29yeURlZmluaXRpb24uYWRkU3ViQ2F0ZWdvcnkocHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCXByb2R1Y3RTdWJDYXRlZ29yeURlZmluaXRpb24uYWRkR3JvdXBpbmcocHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbik7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBkZWZpbml0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZGVmaW5pdGlvbnNMaXN0LmFkZChwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJZGVmYXVsdENhdGVnb3JpZXMgPSBjcmVhdGVDYXRlZ29yaWVzQ2hhaW4oZGVmaW5pdGlvbnNMaXN0KTsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjcmVhdGVDYXRlZ29yaWVzQ2hhaW4oTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5RGVmaW5pdGlvbnMpIHRocm93cyBFeGNlcHRpb24geworCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24gOiBjYXRlZ29yeURlZmluaXRpb25zKSB7CisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZWdvcnkgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24sIHByb2R1Y3RTdHJhdGVnaXN0VXNlcjEsIFBST0RVQ1RfQ09NUE9ORU5UX1RZUEUpOworCQkJaW50IHN0YXR1cyA9IGNyZWF0ZUNhdGVnb3J5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJCVN0cmluZyBjYXRlZ29yeUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlQ2F0ZWdvcnkpOworCQkJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXRVbmlxdWVJZChjYXRlZ29yeUlkKTsKKwkJCX0KKwkJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJjYXRlZ29yaWVzID0gY2F0ZWdvcnlEZWZpbml0aW9uLmdldFN1YmNhdGVnb3JpZXMoKTsKKwkJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiA6IHN1YmNhdGVnb3JpZXMpIHsKKwkJCQlSZXN0UmVzcG9uc2UgY3JlYXRlU3ViQ2F0ZWdvcnkgPSBDYXRlZ29yeVJlc3RVdGlscy5jcmVhdGVTdWJDYXRlZ29yeShzdWJDYXRlZ29yeURlZmluaXRpb24sIGNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN0cmF0ZWdpc3RVc2VyMSwgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCQkJc3RhdHVzID0gY3JlYXRlU3ViQ2F0ZWdvcnkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJCQlTdHJpbmcgc3ViQ2F0ZWdvcnlJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVN1YkNhdGVnb3J5KTsKKwkJCQkJc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldFVuaXF1ZUlkKHN1YkNhdGVnb3J5SWQpOworCQkJCX0KKwkJCQlMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4gZ3JvdXBpbmdzID0gc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldEdyb3VwaW5ncygpOworCQkJCWZvciAoR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nRGVmaW5pdGlvbiA6IGdyb3VwaW5ncykgeworCQkJCQlSZXN0UmVzcG9uc2UgY3JlYXRlR3JvdXBpbmdSZXN0ID0gQ2F0ZWdvcnlSZXN0VXRpbHMuY3JlYXRlR3JvdXBpbmcoZ3JvdXBpbmdEZWZpbml0aW9uLCBzdWJDYXRlZ29yeURlZmluaXRpb24sIGNhdGVnb3J5RGVmaW5pdGlvbiwgcHJvZHVjdFN0cmF0ZWdpc3RVc2VyMSwgUFJPRFVDVF9DT01QT05FTlRfVFlQRSk7CisJCQkJCXN0YXR1cyA9IGNyZWF0ZUdyb3VwaW5nUmVzdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpOworCQkJCQlpZiAoc3RhdHVzID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJCQkJU3RyaW5nIGdyb3VwaW5nSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVHcm91cGluZ1Jlc3QpOworCQkJCQkJZ3JvdXBpbmdEZWZpbml0aW9uLnNldFVuaXF1ZUlkKGdyb3VwaW5nSWQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVJlc3RSZXNwb25zZSBhbGxDYXRlZ29yaWVzID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllcyhwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxLCBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IHJlcyA9IGdzb24uZnJvbUpzb24oYWxsQ2F0ZWdvcmllcy5nZXRSZXNwb25zZSgpLCBuZXcgVHlwZVRva2VuPExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPj4oKSB7CisJCX0uZ2V0VHlwZSgpKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvLyBDYXRlZ29yeTEtPlN1YmNhdGVnb3J5MS0+W0dyb3VwaW5nMSwgR3JvdXBpbmcxMV0KKwlwcm90ZWN0ZWQgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGFkZFNlY29uZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JvdXBpbmdEZWZpbml0aW9uIHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24gPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0R3JvdXAoKTsKKwkJcHJvZHVjdEdyb3VwaW5nRGVmaW5pdGlvbi5zZXROYW1lKCJHcm91cGluZzExIik7CisJCWRlZmF1bHRDYXRlZ29yaWVzLmdldCgwKS5nZXRTdWJjYXRlZ29yaWVzKCkuZ2V0KDApLmFkZEdyb3VwaW5nKHByb2R1Y3RHcm91cGluZ0RlZmluaXRpb24pOworCQlyZXR1cm4gY3JlYXRlQ2F0ZWdvcmllc0NoYWluKGRlZmF1bHRDYXRlZ29yaWVzKTsKKwl9CisKKwkvLyBDYXRlZ29yeTEtPltTdWJjYXRlZ29yeTEtPltHcm91cGluZzEsCisJLy8gR3JvdXBpbmcxMV0sU3ViY2F0ZWdvcnkyLT5bR3JvdXBpbmcxMl1dCisJcHJvdGVjdGVkIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBhZGRTdWJjYXRlZ29yeUFuZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nRGVmaW5pdGlvbjEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0R3JvdXAoKTsKKwkJZ3JvdXBpbmdEZWZpbml0aW9uMS5zZXROYW1lKCJHcm91cGluZzExIik7CisJCWRlZmF1bHRDYXRlZ29yaWVzLmdldCgwKS5nZXRTdWJjYXRlZ29yaWVzKCkuZ2V0KDApLmFkZEdyb3VwaW5nKGdyb3VwaW5nRGVmaW5pdGlvbjEpOworCisJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeTIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3ViQ2F0ZWdvcnkoKTsKKwkJc3ViQ2F0ZWdvcnkyLnNldE5hbWUoIlN1YmNhdGVnb3J5MiIpOworCQlHcm91cGluZ0RlZmluaXRpb24gZ3JvdXBpbmdEZWZpbml0aW9uMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRHcm91cCgpOworCQlncm91cGluZ0RlZmluaXRpb24yLnNldE5hbWUoIkdyb3VwaW5nMTIiKTsKKwkJc3ViQ2F0ZWdvcnkyLmFkZEdyb3VwaW5nKGdyb3VwaW5nRGVmaW5pdGlvbjIpOworCQlkZWZhdWx0Q2F0ZWdvcmllcy5nZXQoMCkuYWRkU3ViQ2F0ZWdvcnkoc3ViQ2F0ZWdvcnkyKTsKKwkJcmV0dXJuIGNyZWF0ZUNhdGVnb3JpZXNDaGFpbihkZWZhdWx0Q2F0ZWdvcmllcyk7CisJfQorCisJLy8gW0NhdGVnb3J5MS0+W1N1YmNhdGVnb3J5MS0+W0dyb3VwaW5nMSwKKwkvLyBHcm91cGluZzExXSxTdWJjYXRlZ29yeTItPltHcm91cGluZzEyXV0sCisJLy8gQ2F0ZWdvcnkyLT5bU3ViY2F0ZWdvcnkxLT5bR3JvdXBpbmcxXSxTdWJjYXRlZ29yeTItPltHcm91cGluZzFdXSwKKwkvLyBDYXRlZ29yeTMtPltTdWJjYXRlZ29yeTEtPltHcm91cGluZzExXSxTdWJjYXRlZ29yeTItPltHcm91cGluZzExLAorCS8vIEdyb3VwaW5nMjJdXV0KKwlwcm90ZWN0ZWQgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGFkZE1hbnlHcm91cGluZ3NEaWZmQ2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24geworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnkyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENhdGVnb3J5KCk7CisJCWNhdGVnb3J5Mi5zZXROYW1lKCJDYXRlZ29yeTIiKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5MyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRDYXRlZ29yeSgpOworCQljYXRlZ29yeTMuc2V0TmFtZSgiQ2F0ZWdvcnkzIik7CisJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeTEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3ViQ2F0ZWdvcnkoKTsKKwkJc3ViQ2F0ZWdvcnkxLnNldE5hbWUoIlN1YmNhdGVnb3J5MSIpOworCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnkyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN1YkNhdGVnb3J5KCk7CisJCXN1YkNhdGVnb3J5Mi5zZXROYW1lKCJTdWJjYXRlZ29yeTIiKTsKKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5MV8yID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN1YkNhdGVnb3J5KCk7CisJCXN1YkNhdGVnb3J5MV8yLnNldE5hbWUoIlN1YmNhdGVnb3J5MSIpOworCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnkyXzIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3ViQ2F0ZWdvcnkoKTsKKwkJc3ViQ2F0ZWdvcnkyXzIuc2V0TmFtZSgiU3ViY2F0ZWdvcnkyIik7CisJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeTFfMyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdWJDYXRlZ29yeSgpOworCQlzdWJDYXRlZ29yeTFfMy5zZXROYW1lKCJTdWJjYXRlZ29yeTEiKTsKKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5Ml8zID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN1YkNhdGVnb3J5KCk7CisJCXN1YkNhdGVnb3J5Ml8zLnNldE5hbWUoIlN1YmNhdGVnb3J5MiIpOworCisJCUdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24xID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEdyb3VwKCk7CisJCWdyb3VwaW5nRGVmaW5pdGlvbjEuc2V0TmFtZSgiR3JvdXBpbmcxIik7CisJCUdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24xMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRHcm91cCgpOworCQlncm91cGluZ0RlZmluaXRpb24xMS5zZXROYW1lKCJHcm91cGluZzExIik7CisJCUdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24xMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRHcm91cCgpOworCQlncm91cGluZ0RlZmluaXRpb24xMi5zZXROYW1lKCJHcm91cGluZzEyIik7CisJCUdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24yMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRHcm91cCgpOworCQlncm91cGluZ0RlZmluaXRpb24yMi5zZXROYW1lKCJHcm91cGluZzIyIik7CisKKwkJZGVmYXVsdENhdGVnb3JpZXMuZ2V0KDApLmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCkuYWRkR3JvdXBpbmcoZ3JvdXBpbmdEZWZpbml0aW9uMTEpOworCQlzdWJDYXRlZ29yeTIuYWRkR3JvdXBpbmcoZ3JvdXBpbmdEZWZpbml0aW9uMTIpOworCQlkZWZhdWx0Q2F0ZWdvcmllcy5nZXQoMCkuYWRkU3ViQ2F0ZWdvcnkoc3ViQ2F0ZWdvcnkyKTsKKworCQlkZWZhdWx0Q2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkyKTsKKwkJZGVmYXVsdENhdGVnb3JpZXMuYWRkKGNhdGVnb3J5Myk7CisJCWNhdGVnb3J5Mi5hZGRTdWJDYXRlZ29yeShzdWJDYXRlZ29yeTFfMik7CisJCWNhdGVnb3J5Mi5hZGRTdWJDYXRlZ29yeShzdWJDYXRlZ29yeTJfMik7CisJCXN1YkNhdGVnb3J5MV8yLmFkZEdyb3VwaW5nKGdyb3VwaW5nRGVmaW5pdGlvbjEpOworCQlzdWJDYXRlZ29yeTJfMi5hZGRHcm91cGluZyhncm91cGluZ0RlZmluaXRpb24xKTsKKwkJY2F0ZWdvcnkzLmFkZFN1YkNhdGVnb3J5KHN1YkNhdGVnb3J5MV8zKTsKKwkJY2F0ZWdvcnkzLmFkZFN1YkNhdGVnb3J5KHN1YkNhdGVnb3J5Ml8zKTsKKwkJc3ViQ2F0ZWdvcnkxXzMuYWRkR3JvdXBpbmcoZ3JvdXBpbmdEZWZpbml0aW9uMTEpOworCQlzdWJDYXRlZ29yeTJfMy5hZGRHcm91cGluZyhncm91cGluZ0RlZmluaXRpb24xMSk7CisJCXN1YkNhdGVnb3J5Ml8zLmFkZEdyb3VwaW5nKGdyb3VwaW5nRGVmaW5pdGlvbjIyKTsKKwkJcmV0dXJuIGNyZWF0ZUNhdGVnb3JpZXNDaGFpbihkZWZhdWx0Q2F0ZWdvcmllcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0Q2hlY2tpblRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdENoZWNraW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyMDMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdENoZWNraW5UZXN0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb2R1Y3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXVkaXRKc29uS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkUHJvZHVjdEF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BdWRpdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlByb2R1Y3RWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBQcm9kdWN0Q2hlY2tpblRlc3QgZXh0ZW5kcyBQcm9kdWN0TGlmZWN5Y2xlVGVzdCB7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIFByb2R1Y3RDaGVja2luVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgUHJvZHVjdENoZWNraW5UZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY0luaXQoKSB7CisJCWF1ZGl0QWN0aW9uID0gQ0hFQ0tJTl9BQ1RJT047CisJCW9wZXJhdGlvbiA9IENvbXBvbmVudE9wZXJhdGlvbkVudW0uQ0hBTkdFX1NUQVRFX0NIRUNLSU47CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0luUHJvZHVjdEJ5Q3JlYXRvcigpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBjaGVja2luQ29tbWVudCA9ICJnb29kIGNoZWNraW4iOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIGNoZWNraW5Db21tZW50KTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcmVzb3VyY2UiLCAyMDAsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBjaGVja2VkSW5Qcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNoZWNrSW5SZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGNoZWNrZWRJblByb2R1Y3QsIG9wZXJhdGlvbik7CisKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgZXhwZWN0ZWRQcm9kdWN0QXVkaXQgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGNoZWNrZWRJblByb2R1Y3QsCisJCQkJYXVkaXRBY3Rpb24sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLk9LLCAiMC4xIiwgIjAuMSIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIGNoZWNrZWRJblByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0QXVkaXQuc2V0Q09NTUVOVChjaGVja2luQ29tbWVudCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGV4cGVjdGVkUHJvZHVjdEF1ZGl0LCBhdWRpdEFjdGlvbiwgQXVkaXRKc29uS2V5c0VudW0uQ09NTUVOVCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0luUHJvZHVjdEJ5UE0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiZ29vZCBjaGVja2luIjsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIGNoZWNraW5Db21tZW50KTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcmVzb3VyY2UiLCAyMDAsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVVzZXIgY2hlY2tvdXRVc2VyID0gcHJvZHVjdE1hbmFnZXIyOworCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUoZXhwZWN0ZWRQcm9kdWN0LCBjaGVja291dFVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDIwMCwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihyZXNwb25zZS5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCWNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiBubyAyIjsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgY2hlY2tvdXRVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sCisJCQkJY2hlY2tpbkNvbW1lbnQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDIwMCwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUHJvZHVjdCBjaGVja2VkSW5Qcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24oIjAuMiIpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQoY2hlY2tvdXRVc2VyLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUoY2hlY2tvdXRVc2VyLmdldEZ1bGxOYW1lKCkpOworCisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBjaGVja2VkSW5Qcm9kdWN0LCBvcGVyYXRpb24pOworCisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihjaGVja2VkSW5Qcm9kdWN0LAorCQkJCWF1ZGl0QWN0aW9uLCBjaGVja291dFVzZXIsIEFjdGlvblN0YXR1cy5PSywgIjAuMiIsICIwLjIiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBjaGVja2VkSW5Qcm9kdWN0LmdldFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdEF1ZGl0LnNldENPTU1FTlQoY2hlY2tpbkNvbW1lbnQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChleHBlY3RlZFByb2R1Y3RBdWRpdCwgYXVkaXRBY3Rpb24sIEF1ZGl0SnNvbktleXNFbnVtLkNPTU1FTlQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tJblByb2R1Y3RCeUFkbWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgYWRtaW5Vc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbW1lbnQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDIwMCwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGNoZWNrZWRJblByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY2hlY2tJblJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJUHJvZHVjdC5jbGFzcyk7CisKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQoYWRtaW5Vc2VyLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUoYWRtaW5Vc2VyLmdldEZ1bGxOYW1lKCkpOworCisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBjaGVja2VkSW5Qcm9kdWN0LCBvcGVyYXRpb24pOworCisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihjaGVja2VkSW5Qcm9kdWN0LAorCQkJCWF1ZGl0QWN0aW9uLCBhZG1pblVzZXIsIEFjdGlvblN0YXR1cy5PSywgIjAuMSIsICIwLjEiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBjaGVja2VkSW5Qcm9kdWN0LmdldFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdEF1ZGl0LnNldENPTU1FTlQoY2hlY2tpbkNvbW1lbnQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChleHBlY3RlZFByb2R1Y3RBdWRpdCwgYXVkaXRBY3Rpb24sIEF1ZGl0SnNvbktleXNFbnVtLkNPTU1FTlQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tJblByb2R1Y3RCeVBNTm90T3duZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDQwMywgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTdHJpbmdbXSBhdWRpdFBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nW10geyBleHBlY3RlZFByb2R1Y3QuZ2V0TmFtZSgpLCAicHJvZHVjdCIsIHByb2R1Y3RNYW5hZ2VyMS5nZXRGaXJzdE5hbWUoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0TGFzdE5hbWUoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpIH07CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihleHBlY3RlZFByb2R1Y3QsCisJCQkJYXVkaXRBY3Rpb24sIHByb2R1Y3RNYW5hZ2VyMiwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DSEVDS09VVF9CWV9BTk9USEVSX1VTRVIsICIwLjEiLCAiMC4xIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsCisJCQkJZXhwZWN0ZWRQcm9kdWN0LmdldFVVSUQoKSwgYXVkaXRQYXJhbWV0ZXJzKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0QXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrSW5Qcm9kdWN0QnlQc1JvbGVOb3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNoZWNrSW5SZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUoZXhwZWN0ZWRQcm9kdWN0LCBwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja2luIHJlc291cmNlIiwgNDA5LCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihleHBlY3RlZFByb2R1Y3QsCisJCQkJYXVkaXRBY3Rpb24sIHByb2R1Y3RTdHJhdGVnaXN0VXNlcjEsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgIjAuMSIsICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlleHBlY3RlZFByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0QXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrSW5Qcm9kdWN0Tm90RXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5vdEV4aXNpdGluZ1V1aWQgPSAiMTIzNCI7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChub3RFeGlzaXRpbmdVdWlkKTsKKwkJUmVzdFJlc3BvbnNlIGNoZWNrSW5SZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUoZXhwZWN0ZWRQcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcmVzb3VyY2UiLCA0MDQsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nW10gYXVkaXRQYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1tdIHsgIiIsICJwcm9kdWN0IiB9OworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBleHBlY3RlZFByb2R1Y3RBdWRpdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oZXhwZWN0ZWRQcm9kdWN0LAorCQkJCWF1ZGl0QWN0aW9uLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5QUk9EVUNUX05PVF9GT1VORCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBhdWRpdFBhcmFtZXRlcnMpOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRDVVJSX1NUQVRFKENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRSRVNPVVJDRV9OQU1FKG5vdEV4aXNpdGluZ1V1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChleHBlY3RlZFByb2R1Y3RBdWRpdCwgYXVkaXRBY3Rpb24pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tJblByb2R1Y3RBbHJlYWR5Q2hlY2tlZEluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja2luIHJlc291cmNlIiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKwkJY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDQwOSwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTdHJpbmdbXSBhdWRpdFBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nW10geyBleHBlY3RlZFByb2R1Y3QuZ2V0TmFtZSgpLCAicHJvZHVjdCIsIHByb2R1Y3RNYW5hZ2VyMS5nZXRGaXJzdE5hbWUoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0TGFzdE5hbWUoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpIH07CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihleHBlY3RlZFByb2R1Y3QsCisJCQkJYXVkaXRBY3Rpb24sIHByb2R1Y3RNYW5hZ2VyMiwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9BTFJFQURZX0NIRUNLRURfSU4sICIwLjEiLCAiMC4xIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLAorCQkJCWV4cGVjdGVkUHJvZHVjdC5nZXRVVUlEKCksIGF1ZGl0UGFyYW1ldGVycyk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGV4cGVjdGVkUHJvZHVjdEF1ZGl0LCBhdWRpdEFjdGlvbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0Q2hlY2tvdXRUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RDaGVja291dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFmN2FkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0Q2hlY2tvdXRUZXN0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFByb2R1Y3RBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkNvbnZlcnRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlByb2R1Y3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uUHJvZHVjdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFByb2R1Y3RDaGVja291dFRlc3QgZXh0ZW5kcyBQcm9kdWN0TGlmZWN5Y2xlVGVzdCB7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY0luaXQoKSB7CisJCWF1ZGl0QWN0aW9uID0gQ0hFQ0tPVVRfQUNUSU9OOworCQlvcGVyYXRpb24gPSBDb21wb25lbnRPcGVyYXRpb25FbnVtLkNIQU5HRV9TVEFURV9DSEVDS09VVDsKKwl9CisKKwlwdWJsaWMgUHJvZHVjdENoZWNrb3V0VGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgUHJvZHVjdENoZWNrb3V0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tPdXRQcm9kdWN0QnlQbU5vdEluQ29udGFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tPdXRQcm9kdWN0U3VjY2Vzcyhwcm9kdWN0TWFuYWdlcjIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tPdXRQcm9kdWN0QnlQbUluQ29udGFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hlY2tPdXRQcm9kdWN0U3VjY2Vzcyhwcm9kdWN0TWFuYWdlcjEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tPdXRQcm9kdWN0QnlBZG1pbigpIHRocm93cyBFeGNlcHRpb24geworCQljaGVja091dFByb2R1Y3RTdWNjZXNzKGFkbWluVXNlcik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja091dFByb2R1Y3RCeVBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENoYW5nZWQgaW4gMTYwNCBwYXRjaCAtIG5vdyBpdCdzIHJlc3RyaWN0ZWQKKwkJY2hlY2tPdXRQcm9kdWN0UmVzdHJpY3RlZChwcm9kdWN0U3RyYXRlZ2lzdFVzZXIzKTsKKwkJLy8gY2hlY2tPdXRQcm9kdWN0U3VjY2Vzcyhwcm9kdWN0U3RyYXRlZ2lzdFVzZXIzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrT3V0UHJvZHVjdEJ5RGVzaWduZXJSb2xlTm90QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljaGVja091dFByb2R1Y3RSZXN0cmljdGVkKGRlc2lnbmVyVXNlcik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja091dFByb2R1Y3RBbHJlYWR5Q2hlY2tlZE91dCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDIwMCwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcmVzb3VyY2UiLCAyMDAsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGNoZWNrZWRPdXRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGxjc1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlsY3NSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUoY2hlY2tlZE91dFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja2luIHJlc291cmNlIiwgNDAzLCBsY3NSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nW10gYXVkaXRQYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1tdIHsgY2hlY2tlZE91dFByb2R1Y3QuZ2V0TmFtZSgpLCAicHJvZHVjdCIsIHByb2R1Y3RNYW5hZ2VyMS5nZXRGaXJzdE5hbWUoKSwgcHJvZHVjdE1hbmFnZXIxLmdldExhc3ROYW1lKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSB9OworCisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihjaGVja2VkT3V0UHJvZHVjdCwgYXVkaXRBY3Rpb24sIHByb2R1Y3RNYW5hZ2VyMiwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTl9DSEVDS09VVF9TVEFURSwgIjAuMiIsICIwLjIiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgY2hlY2tlZE91dFByb2R1Y3QuZ2V0VVVJRCgpLCBhdWRpdFBhcmFtZXRlcnMpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChleHBlY3RlZFByb2R1Y3RBdWRpdCwgYXVkaXRBY3Rpb24pOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja091dFByb2R1Y3RTdWNjZXNzKFVzZXIgY2hlY2tvdXRVc2VyKSB0aHJvd3MgRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDIwMCwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgY2hlY2tvdXRVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcmVzb3VyY2UiLCAyMDAsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIDAuMSBpcyBub3QgaGlnaGVzdCBub3cKKwkJUmVzdFJlc3BvbnNlIHByZXZWZXJzaW9uUHJvZHVjdFJlc3AgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0LmdldFVuaXF1ZUlkKCksIHByb2R1Y3RTdHJhdGVnaXN0VXNlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IHByZXZWZXJzaW9uUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihwcmV2VmVyc2lvblByb2R1Y3RSZXNwLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlCb29sZWFuIGZhbHNlUGFyYW0gPSBmYWxzZTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlUGFyYW0sIHByZXZWZXJzaW9uUHJvZHVjdC5pc0hpZ2hlc3RWZXJzaW9uKCkpOworCisJCVByb2R1Y3QgY2hlY2tlZE91dFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIobGNzUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24oIjAuMiIpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQoY2hlY2tvdXRVc2VyLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUoY2hlY2tvdXRVc2VyLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgY2hlY2tlZE91dFByb2R1Y3QsIG9wZXJhdGlvbik7CisKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgZXhwZWN0ZWRQcm9kdWN0QXVkaXQgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGNoZWNrZWRPdXRQcm9kdWN0LCBhdWRpdEFjdGlvbiwgY2hlY2tvdXRVc2VyLCBBY3Rpb25TdGF0dXMuT0ssICIwLjEiLCAiMC4yIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgY2hlY2tlZE91dFByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0QXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tPdXRQcm9kdWN0UmVzdHJpY3RlZChVc2VyIGNoZWNrb3V0VXNlcikgdGhyb3dzIEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGxjc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcmVzb3VyY2UiLCAyMDAsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxjc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIGNoZWNrb3V0VXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja2luIHJlc291cmNlIiwgNDA5LCBsY3NSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBleHBlY3RlZFByb2R1Y3RBdWRpdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oZXhwZWN0ZWRQcm9kdWN0LCBhdWRpdEFjdGlvbiwgY2hlY2tvdXRVc2VyLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sICIwLjEiLCAiMC4xIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBleHBlY3RlZFByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0QXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdENvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdENvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNkOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdDsKKworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFM7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlUOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX05PVF9GT1VORDsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEU7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9VTlNVUFBPUlRFRF9FUlJPUjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEluc3RhbmNlQmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUHJvZHVjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBQcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdCBleHRlbmRzIENvbXBvbmVudEluc3RhbmNlQmFzZVRlc3QgeworCisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzOworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgUHJvZHVjdENvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIFByb2R1Y3RDb21wb25lbnRJbnN0YW5jZUNSVURUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBFeGNlcHRpb24geworCQlpbml0KCk7CisJCWNyZWF0ZUNvbXBvbmVudHMoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29tcG9uZW50cygpIHRocm93cyBFeGNlcHRpb24geworCisJCWhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQljaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRkNfMDIpOworCQljaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQocmVzb3VyY2VEZXRhaWxzVkZDXzAyKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzQ1BfMDIpOworCQljaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQocmVzb3VyY2VEZXRhaWxzQ1BfMDIpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWTF8wMik7CisJCWNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZChyZXNvdXJjZURldGFpbHNWTF8wMik7CisJCWNyZWF0ZVZGKHJlc291cmNlRGV0YWlsc1ZGXzAyKTsKKwkJY3JlYXRlVkYocmVzb3VyY2VEZXRhaWxzVkZfMDEpOworCQkvLyBjcmVhdGUgY2hlY2stSW4gc2VydmljZXMKKwkJY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCWNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDIpOworCQljcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAzKTsKKwkJY3JlYXRlUHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMSk7CisJCWNyZWF0ZVByb2R1Y3QocHJvZHVjdERldGFpbHNfMDIpOworCisJCS8vIGFkZHJlc291cmNlRGV0YWlsc0NQXzAyICxyZXNvdXJjZURldGFpbHNWRkNfMDIgYW5kCisJCS8vIHJlc291cmNlRGV0YWlsc1ZMXzAyIHRvIHJlc291cmNlRGV0YWlsc1ZGXzAyIGNoZWNrLWluIFZGCisJCVJlc3RSZXNwb25zZSBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRkR1cmluZ1NldHVwKHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGQ18wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGRHVyaW5nU2V0dXAocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc0NQXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRkR1cmluZ1NldHVwKHJlc291cmNlRGV0YWlsc1ZGXzAyLCByZXNvdXJjZURldGFpbHNWTF8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGXzAyLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCXJlc291cmNlRGV0YWlsc1ZGXzAyLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQkvLyBhZGRyZXNvdXJjZURldGFpbHNDUF8wMSAscmVzb3VyY2VEZXRhaWxzVkZDXzAxIGFuZAorCQkvLyByZXNvdXJjZURldGFpbHNWTF8wMSB0byByZXNvdXJjZURldGFpbHNWRl8wMSBhbmQgY2VydGlmeQorCQkvLyByZXNvdXJjZURldGFpbHNWRl8wMQorCQljZXJ0aWZ5VmYocmVzb3VyY2VEZXRhaWxzVkZfMDEpOworCQljcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsgLy8gc2VydmljZURldGFpbHNfMDEKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBoYXMKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjZXJ0aWZpZWQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBWRgorCQljcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDIsIHJlc291cmNlRGV0YWlsc1ZGXzAyLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsgLy8gc2VydmljZURldGFpbHNfMDIKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBoYXMKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGVjay1pbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFZGCisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUluc3RhbmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMSwgMCk7CisJfQorCisJLy8gREUxODk0MjcKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUluc3RhbmNlRnJvbUNoZWNrZWRPdXRTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjYW4ndCBjcmVhdGUgaW5zdGFuY2Ugb2YgY2hlY2tlZC1vdXQgY29tcG9uZW50CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUluc3RhbmNlSW5Ub0Fub3RoZXJTZXJ2aWNlSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIHVuaXF1ZUlkRnJvbVJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsCisJCQkJc2RuY1BtRGV0YWlsczEsIHVuaXF1ZUlkRnJvbVJlc3BvbnNlLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX05PVF9GT1VORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXZlcmFsU2VydmljZUluc3RhbmNlRnJvbVNhbWVTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXZlcmFsU2VydmljZUluc3RhbmNlRnJvbURpZmZlcmVudFNlcnZpY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUNlcnRpZmllZFNlcnZpY2VJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQljaGFuZ2VTZXJ2aWNlU3RhdGVUb0NlcnRpZmllZChzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZUJ5UG0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVdpdGhvdXRWZigpIHRocm93cyBFeGNlcHRpb24geworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAzLCBzZG5jQWRtaW5EZXRhaWxzLCAiMC4xIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDIsIHNlcnZpY2VEZXRhaWxzXzAzLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDIsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUluc3RhbmNlQnlOb25Qcm9kdWN0T3duZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDIsIHNkbmNQbURldGFpbHMyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZUJ5Tm9uQXNkY1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJVXNlciBub25FeGlzdGluZ1NkbmNVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlBST0RVQ1RfTUFOQUdFUjEpOworCQk7CisJCW5vbkV4aXN0aW5nU2RuY1VzZXIuc2V0VXNlcklkKCJidDEyMzQiKTsKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsIG5vbkV4aXN0aW5nU2RuY1VzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUluc3RhbmNlVG9Ob3RDaGVja091dFByb2R1Y3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCX0KKworCS8vIHBhc3MKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZU5hbWVJc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBleHBlY3RlZFNlcnZpY2VJbnN0YW5jZU5hbWUgPSBzZXJ2aWNlRGV0YWlsc18wMS5nZXROYW1lKCkgKyAiIDEiOworCQlTdHJpbmcgZXhwZWN0ZWRTZXJ2aWNlSW5zdGFuY2Vub3JtYWxpemVkTmFtZSA9IHNlcnZpY2VEZXRhaWxzXzAxLmdldE5hbWUoKSArICIxIjsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0TmFtZSgiIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldFJlc3BvbnNlKCksICJuYW1lIik7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKGV4cGVjdGVkU2VydmljZUluc3RhbmNlbm9ybWFsaXplZE5hbWUpLnRvTG93ZXJDYXNlKCksCisJCQkJaW5zdGFuY2VOb3JtYWxpemVkTmFtZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2UgTmFtZSAiLCBleHBlY3RlZFNlcnZpY2VJbnN0YW5jZU5hbWUsIGluc3RhbmNlTmFtZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwkJLy8gZ2V0IHByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgaW5zdGFuY2VOYW1lIGlzIGNvcnJlY3QKKwkJUmVzdFJlc3BvbnNlIGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IGFjdHVhbFByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTZXJ2aWNlSW5zdGFuY2VOYW1lLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoKGV4cGVjdGVkU2VydmljZUluc3RhbmNlbm9ybWFsaXplZE5hbWUpLnRvTG93ZXJDYXNlKCksCisJCQkJYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUluc3RhbmNlTmFtZUlzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZXhwZWN0ZWRTZXJ2aWNlSW5zdGFuY2VOYW1lID0gc2VydmljZURldGFpbHNfMDEuZ2V0TmFtZSgpICsgIiAxIjsKKwkJU3RyaW5nIGV4cGVjdGVkU2VydmljZUluc3RhbmNlbm9ybWFsaXplZE5hbWUgPSBzZXJ2aWNlRGV0YWlsc18wMS5nZXROYW1lKCkgKyAiMSI7CisJCXNlcnZpY2VEZXRhaWxzXzAxLnNldE5hbWUobnVsbCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldFJlc3BvbnNlKCksICJuYW1lIik7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKGV4cGVjdGVkU2VydmljZUluc3RhbmNlbm9ybWFsaXplZE5hbWUpLnRvTG93ZXJDYXNlKCksCisJCQkJaW5zdGFuY2VOb3JtYWxpemVkTmFtZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2UgTmFtZSAiLCBleHBlY3RlZFNlcnZpY2VJbnN0YW5jZU5hbWUsIGluc3RhbmNlTmFtZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwkJLy8gZ2V0IHByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgaW5zdGFuY2VOYW1lIGlzIGNvcnJlY3QKKwkJUmVzdFJlc3BvbnNlIGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IGFjdHVhbFByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTZXJ2aWNlSW5zdGFuY2VOYW1lLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoKGV4cGVjdGVkU2VydmljZUluc3RhbmNlbm9ybWFsaXplZE5hbWUpLnRvTG93ZXJDYXNlKCksCisJCQkJYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVRvTm9uRXhpc3RpbmdQcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLAorCQkJCXNkbmNQbURldGFpbHMxLCAiYmxhYmxhIiwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoImJsYWJsYSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlBST0RVQ1RfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVRvTm9uU3VwcG9ydGVkQ29tcG9uZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgc2VydmljZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEpOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2Uoc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywKKwkJCQlzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfVU5TVVBQT1JURURfRVJST1IpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZCgibnVsbCIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlVOU1VQUE9SVEVEX0VSUk9SLm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwkvLyBwYXNzCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VQb3NpdGlvbklzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NYKCIiKTsKKwkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VQb3NpdGlvbklzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgc2VydmljZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEpOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldFBvc1gobnVsbCk7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VCeURlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVVzZXJJZElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJVXNlciBub25TZG5jRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlub25TZG5jRGV0YWlscy5zZXRVc2VySWQoIiIpOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgbm9uU2RuY0RldGFpbHMpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwkvLy8vIFVwZGF0ZSBTZXJ2aWNlIGluc3RhbmNlCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZU5hbWVCeVBtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENoZWNrLWluIFByb2R1Y3QgYnkgUE0gYW5kIENoZWNrLW91dCBieSBQTQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJLy8gQ3JlYXRlIHNlcnZpY2UgaW5zdGFuY2UgYnkgUE0KKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBuZXdOYW1lID0gImFiY0QiOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmV3TmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNQbURldGFpbHMxLCBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyBpbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibmFtZSIpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsIChuZXdOYW1lKS50b0xvd2VyQ2FzZSgpLCBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBOYW1lICIsIG5ld05hbWUsIGluc3RhbmNlTmFtZSk7CisJCS8vIGdldCBwcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGluc3RhbmNlTmFtZSBpcyBjb3JyZWN0CisJCVJlc3RSZXNwb25zZSBnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlQcm9kdWN0LmNsYXNzKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UgPSBhY3R1YWxQcm9kdWN0LmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKG5ld05hbWUsIGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygobmV3TmFtZSkudG9Mb3dlckNhc2UoKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VOZXdOYW1lQW5kTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBuZXdOYW1lID0gInVwZGFhdGVkTmFtZTEwMCI7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWCgiMTAwIik7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWSgiMTAwIik7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UpOworCQkvLyBnZXQgcHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBpbnN0YW5jZU5hbWUgaXMgY29ycmVjdAorCQlSZXN0UmVzcG9uc2UgZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksCisJCQkJc2RuY1BtRGV0YWlsczEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJUHJvZHVjdC5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIGFjdHVhbENvbXBvbmVudEluc3RhbmNlID0gYWN0dWFsUHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldFBvc1goKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0UG9zWCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0UG9zWSgpLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXRQb3NZKCkpOworCQlhc3NlcnRFcXVhbHMobmV3TmFtZSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ld05hbWUudG9Mb3dlckNhc2UoKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZU5hbWVSZW1vdmVTcGFjZXNGcm9tQmlnaW5uaW5nQW5kRW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgbmV3TmFtZSA9ICIgIEFiY2QgICAiOworCQlTdHJpbmcgZXhwZWN0ZWROZXdOYW1lID0gIiAgQWJjZCAgICI7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKGV4cGVjdGVkTmV3TmFtZSkudG9Mb3dlckNhc2UoKSwKKwkJCQlpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBOYW1lICIsIGV4cGVjdGVkTmV3TmFtZSwgaW5zdGFuY2VOYW1lKTsKKwkJLy8gZ2V0IHByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgaW5zdGFuY2VOYW1lIGlzIGNvcnJlY3QKKwkJUmVzdFJlc3BvbnNlIGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IGFjdHVhbFByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWROZXdOYW1lLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoKGV4cGVjdGVkTmV3TmFtZSkudG9Mb3dlckNhc2UoKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlU2VydmljZUluc3RhbmNlTmFtZUFsbG93ZWRDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgbmV3TmFtZSA9ICJxd2VyLVRZVUlPUF9hc2RfMDk4NzY1NDMyMS5BYmNkIjsKKwkJU3RyaW5nIEV4cGVjdGVkTm9ybWFsaXpOYW1lID0gInF3ZXJ0eXVpb3Bhc2QwOTg3NjU0MzIxYWJjZCI7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgRXhwZWN0ZWROb3JtYWxpek5hbWUsIGluc3RhbmNlTm9ybWFsaXplZE5hbWUpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIE5hbWUgIiwgbmV3TmFtZSwgaW5zdGFuY2VOYW1lKTsKKwkJLy8gZ2V0IHByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgaW5zdGFuY2VOYW1lIGlzIGNvcnJlY3QKKwkJUmVzdFJlc3BvbnNlIGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IGFjdHVhbFByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMobmV3TmFtZSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEV4cGVjdGVkTm9ybWFsaXpOYW1lLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlSW5zdGFuY2VOYW1lSW52YWxpZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhciBpbnZhbGlkQ2hhcnNbXSA9IHsgJ34nLCAnIScsICckJywgJyUnLCAnXicsICcqJywgJygnLCAnKScsICciJywgJ3snLCAnfScsICdbJywgJ10nLCAnPycsICc+JywgJzwnLCAnLycsCisJCQkJJ3wnLCAnXFwnLCAnLCcgfTsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBuZXdOYW1lID0gIkFiY2QxIjsKKwkJU3RyaW5nIHVwZGF0ZU5hbWU7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZENoYXJzLmxlbmd0aDsgaSsrKSB7CisJCQl1cGRhdGVOYW1lID0gbmV3TmFtZSArIGludmFsaWRDaGFyc1tpXTsKKwkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZSh1cGRhdGVOYW1lKTsKKwkJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCQl1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJdmFyaWJhbGVzLmFkZCgiU2VydmljZSBJbnN0YW5jZSIpOworCQkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBPTkVOVF9OQU1FLm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCQl1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJfQorCX0KKworCS8vIHBhc3MKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZUluc3RhbmNlTmFtZU1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgc2VydmljZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNQbURldGFpbHMxLCBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIG5ld05hbWUgPSAiUXdlcnR5dWlvcDEyMzQ1Njc4OTBhc2RmQWhqa2x6eGN2Ym5tYXNkZmdoamtsMTIzNDUiOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmV3TmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNQbURldGFpbHMxLCBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyBpbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibmFtZSIpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsIChuZXdOYW1lKS50b0xvd2VyQ2FzZSgpLCBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBOYW1lICIsIG5ld05hbWUsIGluc3RhbmNlTmFtZSk7CisJCS8vIGdldCBwcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGluc3RhbmNlTmFtZSBpcyBjb3JyZWN0CisJCVJlc3RSZXNwb25zZSBnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlQcm9kdWN0LmNsYXNzKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UgPSBhY3R1YWxQcm9kdWN0LmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKG5ld05hbWUsIGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygobmV3TmFtZSkudG9Mb3dlckNhc2UoKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVJbnN0YW5jZU5hbWVFeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBleHBlY3RlZE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQlTdHJpbmcgZXhwZWN0ZWROb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldFJlc3BvbnNlKCksCisJCQkJIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyBuZXdOYW1lID0gIlF3ZXJ0eXVpb3AxMjM0NTY3ODkwYXNkZkFoamtsenhjdmJubWFzZGZnaGprbDEyMzQ1NiI7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVCwKKwkJCQl1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoIlNlcnZpY2UgSW5zdGFuY2UiKTsKKwkJdmFyaWJhbGVzLmFkZCgiNTAiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlULm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCXVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBnZXQgcHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBpbnN0YW5jZU5hbWUgaXMgY29ycmVjdAorCQlSZXN0UmVzcG9uc2UgZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksCisJCQkJc2RuY1BtRGV0YWlsczEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJUHJvZHVjdC5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIGFjdHVhbENvbXBvbmVudEluc3RhbmNlID0gYWN0dWFsUHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZE5hbWUsIGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZE5vcm1hbGl6ZWROYW1lLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZU5hbWVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBzZWUgVVM1MzQ2NjMgSW4gY2FzZSBhIFBTL1BNIHJlbW92ZXMgdGhlIGN1cnJlbnQgc2VydmljZSBpbnN0YW5jZQorCQkvLyBuYW1lIHRoZW4gQkUgaGFzIHRvIGdlbmVyYXRlIGFnYWluIHRoZSAiZGVmYXVsdCIgc2VydmljZSBpbnN0YW5jZQorCQkvLyBuYW1lCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgbmV3TmFtZSA9ICIiOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmV3TmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNQbURldGFpbHMxLCBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyBpbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibmFtZSIpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsIChzZXJ2aWNlRGV0YWlsc18wMS5nZXROYW1lKCkgKyAiMiIpLnRvTG93ZXJDYXNlKCksCisJCQkJaW5zdGFuY2VOb3JtYWxpemVkTmFtZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKHNlcnZpY2VEZXRhaWxzXzAxLmdldE5hbWUoKSArICIgMiIpLCBpbnN0YW5jZU5hbWUpOworCQkvLyBnZXQgcHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBpbnN0YW5jZU5hbWUgaXMgY29ycmVjdAorCQlSZXN0UmVzcG9uc2UgZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksCisJCQkJc2RuY1BtRGV0YWlsczEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJUHJvZHVjdC5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIGFjdHVhbENvbXBvbmVudEluc3RhbmNlID0gYWN0dWFsUHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhpbnN0YW5jZU5hbWUsIGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnN0YW5jZU5vcm1hbGl6ZWROYW1lLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwl9CisKKwkvLyBwYXNzCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VOYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBzZWUgVVM1MzQ2NjMgSW4gY2FzZSBhIFBTL1BNIHJlbW92ZXMgdGhlIGN1cnJlbnQgc2VydmljZSBpbnN0YW5jZQorCQkvLyBuYW1lIHRoZW4gQkUgaGFzIHRvIGdlbmVyYXRlIGFnYWluIHRoZSAiZGVmYXVsdCIgc2VydmljZSBpbnN0YW5jZQorCQkvLyBuYW1lCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKHNlcnZpY2VEZXRhaWxzXzAxLmdldE5hbWUoKSArICIyIikudG9Mb3dlckNhc2UoKSwKKwkJCQlpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLCAoc2VydmljZURldGFpbHNfMDEuZ2V0TmFtZSgpICsgIiAyIiksIGluc3RhbmNlTmFtZSk7CisJCS8vIGdldCBwcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGluc3RhbmNlTmFtZSBpcyBjb3JyZWN0CisJCVJlc3RSZXNwb25zZSBnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlQcm9kdWN0LmNsYXNzKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UgPSBhY3R1YWxQcm9kdWN0LmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKGluc3RhbmNlTmFtZSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGluc3RhbmNlTm9ybWFsaXplZE5hbWUsIGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldE5vcm1hbGl6ZWROYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlU2VydmljZUluc3RhbmNlQ2hlY2tlZEJ5T3RoZXJVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHNlZSBVUzUzNDY2MyBJbiBjYXNlIGEgUFMvUE0gcmVtb3ZlcyB0aGUgY3VycmVudCBzZXJ2aWNlIGluc3RhbmNlCisJCS8vIG5hbWUgdGhlbiBCRSBoYXMgdG8gZ2VuZXJhdGUgYWdhaW4gdGhlICJkZWZhdWx0IiBzZXJ2aWNlIGluc3RhbmNlCisJCS8vIG5hbWUKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBuZXdOYW1lID0gImJsYWJsYSI7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczIsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJdXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQl1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZV9Vc2VySWRJc05vbkFzZGNVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgbmV3TmFtZSA9ICJibGFibGEiOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmV3TmFtZSk7CisJCVVzZXIgbm9uU2RuY1VzZXJEZXRhaWxzID0gbmV3IFVzZXIoKTsKKwkJbm9uU2RuY1VzZXJEZXRhaWxzLnNldFVzZXJJZCgiYnQ0NTY3Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIG5vblNkbmNVc2VyRGV0YWlscywgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCXVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJdXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VOYW1lVG9BbHJlYWR5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBTZXJ2aWNlTmFtZTEgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2Uoc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywKKwkJCQlzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIFVwZGF0ZSBzZXJ2aWNlIGluc3RhbmNlMiBuYW1lIHRvIHNlcnZpY2UgaW5zdGFuY2UxCisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShTZXJ2aWNlTmFtZTEpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUywKKwkJCQl1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoIlNlcnZpY2UgSW5zdGFuY2UiKTsKKwkJdmFyaWJhbGVzLmFkZChTZXJ2aWNlTmFtZTEpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QubmFtZSgpLCB2YXJpYmFsZXMsCisJCQkJdXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VGb3JOb25FeGlzdGluZ1Byb2R1Y3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBuZXdOYW1lID0gImJsYWJsYSI7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsICJibGFibGFibGEiLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQl1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlBST0RVQ1RfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCXVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVOb25FeGlzdGluZ1NlcnZpY2VJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgc2VydmljZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNQbURldGFpbHMxLCBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIG5ld05hbWUgPSAiYmxhYmxhIjsKKwkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKG5ld05hbWUpOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKCIxMTExMTExMSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKG5ld05hbWUpOworCQl2YXJpYmFsZXMuYWRkKCJzZXJ2aWNlIGluc3RhbmNlIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJdXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIG5lZWQgdG8gY2hhbmdlIEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9OT1RfRk9VTkQubmFtZSgpIHRvCisJCS8vIEFjdGlvblN0YXR1cy5TRVJWSUNFX0lOU1RBTkNFX05PVF9GT1VORC5uYW1lKCkKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5TVEFOQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWJhbGVzLAorCQkJCXVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlU2VydmljZUluc3RhbmNlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWCgiNTAiKTsKKwkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKCIxMDAiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UpOworCQkvLyBnZXQgcHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBpbnN0YW5jZU5hbWUgaXMgY29ycmVjdAorCQlSZXN0UmVzcG9uc2UgZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksCisJCQkJc2RuY1BtRGV0YWlsczEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJUHJvZHVjdC5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIGFjdHVhbENvbXBvbmVudEluc3RhbmNlID0gYWN0dWFsUHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldFBvc1goKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0UG9zWCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0UG9zWSgpLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXRQb3NZKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlU2VydmljZUluc3RhbmNlVG9Ob25FeGlzdGluZ0xvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlTdHJpbmcgbmFtZUZyb21SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWCgiLTUwIik7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWSgiLTEwMCIpOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmFtZUZyb21SZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNQbURldGFpbHMxLCBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJLy8gZ2V0IHByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgaW5zdGFuY2VOYW1lIGlzIGNvcnJlY3QKKwkJUmVzdFJlc3BvbnNlIGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IGFjdHVhbFByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoc2VydmljZUluc3RhbmNlUmVxRGV0YWlscy5nZXRQb3NYKCksIGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldFBvc1goKSk7CisJCWFzc2VydEVxdWFscyhzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldFBvc1koKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0UG9zWSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5hbWVGcm9tUmVzcG9uc2UsIGFjdHVhbENvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VMb2NhdGlvbk5hbWVJc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBleHBlY3RlZFNlcnZpY2VJbnN0YW5jZU5hbWUgPSBzZXJ2aWNlRGV0YWlsc18wMS5nZXROYW1lKCkgKyAiIDIiOworCQlTdHJpbmcgZXhwZWN0ZWRTZXJ2aWNlSW5zdGFuY2Vub3JtYWxpemVkTmFtZSA9IHNlcnZpY2VEZXRhaWxzXzAxLmdldE5hbWUoKSArICIyIjsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWCgiMTAwIik7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWSgiMjAwIik7CisJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZSgiIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNQbURldGFpbHMxLCBwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIG5hbWVGcm9tUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIHBvc3RYID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJwb3NYIik7CisJCVN0cmluZyBwb3N0WSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAicG9zWSIpOworCQlhc3NlcnRFcXVhbHMobmFtZUZyb21SZXNwb25zZSwgZXhwZWN0ZWRTZXJ2aWNlSW5zdGFuY2VOYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKHBvc3RYLCAiMTAwIik7CisJCWFzc2VydEVxdWFscyhwb3N0WSwgIjIwMCIpOworCQkvLyBnZXQgcHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBpbnN0YW5jZU5hbWUgaXMgY29ycmVjdAorCQlSZXN0UmVzcG9uc2UgZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksCisJCQkJc2RuY1BtRGV0YWlsczEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJUHJvZHVjdC5jbGFzcyk7CisJCUNvbXBvbmVudEluc3RhbmNlIGFjdHVhbENvbXBvbmVudEluc3RhbmNlID0gYWN0dWFsUHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldFBvc1goKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0UG9zWCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0UG9zWSgpLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXRQb3NZKCkpOworCQlhc3NlcnRFcXVhbHMobmFtZUZyb21SZXNwb25zZSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2VydmljZUluc3RhbmNlbm9ybWFsaXplZE5hbWUudG9Mb3dlckNhc2UoKSwgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJfQorCisJLy8gcGFzcworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlU2VydmljZUluc3RhbmNlTmFtZVRvUHJvZHVjdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0KKwkJLy8gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSwKKwkJLy8gQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQkvLyBhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsCisJCS8vIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUocHJvZHVjdERldGFpbHNfMDEuZ2V0TmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY1BtRGV0YWlsczEsIHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCWFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0TmFtZSgpKS50b0xvd2VyQ2FzZSgpLAorCQkJCWluc3RhbmNlTm9ybWFsaXplZE5hbWUpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIE5hbWUgIiwgc2VydmljZUluc3RhbmNlUmVxRGV0YWlscy5nZXROYW1lKCksIGluc3RhbmNlTmFtZSk7CisJCS8vIGdldCBwcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGluc3RhbmNlTmFtZSBpcyBjb3JyZWN0CisJCVJlc3RSZXNwb25zZSBnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlzZG5jUG1EZXRhaWxzMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlQcm9kdWN0LmNsYXNzKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UgPSBhY3R1YWxQcm9kdWN0LmdldENvbXBvbmVudEluc3RhbmNlcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0TmFtZSgpLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoKHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0TmFtZSgpKS50b0xvd2VyQ2FzZSgpLCBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwl9CisKKwkvLy8vIERlbGV0ZSBTZXJ2aWNlIEluc3RhbmNlCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbFNlcnZpY2VJbnN0YW5jZUZyb21Qcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMSwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gZGVsZXRlU2VydmljZUluc3RhbmNlKHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkLCBwcm9kdWN0RGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCWFzc2VydFRydWUoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAwLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VXaGlsZVNlcnZpY2VJbnN0YW5jZUV4aXN0SW5Qcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZEZyb21SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCS8vIERlbGV0ZSBzZXJ2aWNlIHdoaWxlIHNlcnZpY2UgaW5zdGFuY2Ugb2YgaXQgZXhpc3QgaW4gcHJvZHVjdAorCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlQnlJZChzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCS8vIEdldCBwcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGluc3RhbmNlIHN0aWxsIGV4aXN0cworCQlSZXN0UmVzcG9uc2UgZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksCisJCQkJc2RuY1BtRGV0YWlsczEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0QWN0dWFsUHJvZHVjdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJUHJvZHVjdC5jbGFzcyk7CisJCS8vIENvbXBvbmVudEluc3RhbmNlIGFjdHVhbENvbXBvbmVudEluc3RhbmNlID0KKwkJLy8gYWN0dWFsUHJvZHVjdC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5nZXQoMCk7CisJCS8vIGFzc2VydFRydWUoc2VydmljZUluc3RhbmNlVW5pcXVlSWRGcm9tUmVzcG9uc2UgPT0KKwkJLy8gYWN0dWFsQ29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwkvLyBwYXNzCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVTZXJ2aWNlSW5zdGFuY2VCeVBtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gZGVsZXRlU2VydmljZUluc3RhbmNlKHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkLCBwcm9kdWN0RGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCWFzc2VydFRydWUoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUJ5UG1DcmVhdGVkQnlQbSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcHJvZHVjdERldGFpbHNfMDEuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzdFJlc3BvbnNlKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gZGVsZXRlU2VydmljZUluc3RhbmNlKHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkLCBwcm9kdWN0RGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCWFzc2VydFRydWUoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUJ5UG1XaGljaElzQ2hlY2tlZE91dEJ5QW5vdGhlclBtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgc2VydmljZUluc3RhbmNlVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczIpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCX0KKworCS8vIERFMTkwMTg5CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVTZXJ2aWNlSW5zdGFuY2VCeVBtQ3JlYXRlZEJ5UHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJU3RyaW5nIHByb2R1Y3RPbGRVbmlxdWVJZCA9IHByb2R1Y3REZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVN0cmluZyBwcm9kdWN0TmV3VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShyZXN0UmVzcG9uc2UpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUocHJvZHVjdE9sZFVuaXF1ZUlkLCBwcm9kdWN0TmV3VW5pcXVlSWQpOworCQkvLyBnZXQgcHJvZHVjdCBhbmQgZ2V0IHNlcnZpY2UgaW5zdGFuY2UgbmV3IHVuaXF1SWQKKwkJUmVzdFJlc3BvbnNlIGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNQbURldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IGFjdHVhbFByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlTdHJpbmcgc2VydmljZUluc3RhbmNlVW5pcXVlSWQgPSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfU1VDQ0VTU19ERUxFVEUpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMCwgMCk7CisJfQorCisJLy8gREUxOTAxODkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUJ5QWRtaW5DcmVhdGVkQnlQcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlTdHJpbmcgcHJvZHVjdE9sZFVuaXF1ZUlkID0gcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0RGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNBZG1pbkRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlTdHJpbmcgcHJvZHVjdE5ld1VuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzdFJlc3BvbnNlKTsKKwkJdXBkYXRlRXhwZWN0ZWRSZXFDYXBBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKHByb2R1Y3RPbGRVbmlxdWVJZCwgcHJvZHVjdE5ld1VuaXF1ZUlkKTsKKwkJLy8gZ2V0IHByb2R1Y3QgYW5kIGdldCBzZXJ2aWNlIGluc3RhbmNlIG5ldyB1bmlxdUlkCisJCVJlc3RSZXNwb25zZSBnZXRBY3R1YWxQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlzZG5jQWRtaW5EZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldEFjdHVhbFByb2R1Y3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVByb2R1Y3QuY2xhc3MpOworCQlDb21wb25lbnRJbnN0YW5jZSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZSA9IGFjdHVhbFByb2R1Y3QuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZ2V0KDApOworCQlTdHJpbmcgc2VydmljZUluc3RhbmNlVW5pcXVlSWQgPSBhY3R1YWxDb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJc2RuY0FkbWluRGV0YWlscyk7CisJCWFzc2VydFRydWUoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAwLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUFuZERlbGV0ZVNlcnZpY2VJbnN0YW5jZUJ5QWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jQWRtaW5EZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJLy8gcHJvZHVjdERldGFpbHNfMDEuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzdFJlc3BvbnNlKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jQWRtaW5EZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJc2RuY0FkbWluRGV0YWlscyk7CisJCWFzc2VydFRydWUoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUZyb21Ob25DaGVja091dFByb2R1Y3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlU2VydmljZUluc3RhbmNlQnlEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgc2VydmljZUluc3RhbmNlVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydFRydWUoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVTZXJ2aWNlSW5zdGFuY2VCeVRlc3RlcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgc2VydmljZUluc3RhbmNlVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJc2RuY1Rlc3RlckRldGFpbHMpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlU2VydmljZUluc3RhbmNlQnlQc1doaWNoSXNDaGVja2VkT3V0QnlBbm90aGVyUHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBkZWxldGVTZXJ2aWNlSW5zdGFuY2Uoc2VydmljZUluc3RhbmNlVW5pcXVlSWQsIHByb2R1Y3REZXRhaWxzXzAxLAorCQkJCXNkbmNQc0RldGFpbHMyKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwkvLyBwYXNzCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVTZXJ2aWNlSW5zdGFuY2VCeU5vbkFzZGNVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgbm9uRXhpc3RpbmdTZG5jVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX01BTkFHRVIxKTsKKwkJOworCQlub25FeGlzdGluZ1NkbmNVc2VyLnNldFVzZXJJZCgiYnQxMjM0Iik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gZGVsZXRlU2VydmljZUluc3RhbmNlKHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkLCBwcm9kdWN0RGV0YWlsc18wMSwKKwkJCQlub25FeGlzdGluZ1NkbmNVc2VyKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUZyb21Ob25FeGlzdGluZ1Byb2R1Y3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKHNkbmNQbURldGFpbHMxLAorCQkJCSIxMjM0NTY3ODkwIiwgc2VydmljZUluc3RhbmNlVW5pcXVlSWQsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9OT1RfRk9VTkQpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZCgiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUFJPRFVDVF9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYmFsZXMsCisJCQkJZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVOb25FeGlzdGluZ1NlcnZpY2VJbnN0YW5jZUZyb21Qcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCS8vIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9CisJCS8vIFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZShzZG5jUG1EZXRhaWxzMSwKKwkJCQlwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCAiMTIzNDU2Nzg5MDEyMzQ1NnVuRXhpc3RpbmdTZXJ2aWNlSW5zdGFuY2UiLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9OT1RfRk9VTkQpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZCgiMTIzNDU2Nzg5MDEyMzQ1NnVuRXhpc3RpbmdTZXJ2aWNlSW5zdGFuY2UiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5QUk9EVUNUX05PVF9GT1VORC5uYW1lKCksIHZhcmliYWxlcywKKwkJCQlkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUZyb21Ob25TdXBwb3J0ZWRDb21wb25lbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZShzZG5jUG1EZXRhaWxzMSwKKwkJCQlwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9VTlNVUFBPUlRFRF9FUlJPUik7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKCJudWxsIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IubmFtZSgpLCB2YXJpYmFsZXMsCisJCQkJZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVTZXJ2aWNlSW5zdGFuY2VDb21wb25lbnRUeXBlSXNOb3RQcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZShzZG5jUG1EZXRhaWxzMSwKKwkJCQlwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydFRydWUoZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX05PVF9GT1VORCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKCIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORC5uYW1lKCksIHZhcmliYWxlcywKKwkJCQlkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVVzZXJJZElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBub25TZG5jRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlub25TZG5jRGV0YWlscy5zZXRVc2VySWQoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgc2VydmljZUluc3RhbmNlVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCwgcHJvZHVjdERldGFpbHNfMDEsCisJCQkJbm9uU2RuY0RldGFpbHMpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUNlcnRpZmllZFNlcnZpY2VJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQljaGFuZ2VTZXJ2aWNlU3RhdGVUb0NlcnRpZmllZChzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQljcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gY3JlYXRlU2VydmljZUluc3RhbmNlKHByb2R1Y3REZXRhaWxzXzAxLCBzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhwcm9kdWN0RGV0YWlsc18wMSwgMiwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwID0gZGVsZXRlU2VydmljZUluc3RhbmNlKHNlcnZpY2VJbnN0YW5jZVVuaXF1ZUlkLCBwcm9kdWN0RGV0YWlsc18wMSwKKwkJCQlzZG5jUG1EZXRhaWxzMSk7CisJCWFzc2VydFRydWUoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAxLCAwKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXByaXZhdGUgdm9pZCBjZXJ0aWZ5VmYoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGRHVyaW5nU2V0dXAocmVzb3VyY2UsIHJlc291cmNlRGV0YWlsc0NQXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgY3BDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChyZXNvdXJjZSwgcmVzb3VyY2VEZXRhaWxzVkZDXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgY29tcHV0ZUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRkR1cmluZ1NldHVwKHJlc291cmNlLCByZXNvdXJjZURldGFpbHNWTF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJU3RyaW5nIHZsQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCisJCS8vIEZpeGluZyBWbC9DcCByZXEvY2FwCisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0U7CisJCVVzZXIgdXNlciA9IHNkbmNEZXNpZ25lckRldGFpbHM7CisJCWZ1bGZpbGxDcFJlcXVpcmVtZW50KHJlc291cmNlLCBjcENvbXBJbnN0SWQsIGNvbXB1dGVDb21wSW5zdElkLCBjb21wdXRlQ29tcEluc3RJZCwgdXNlciwgY29udGFpbmVyQ29tcFR5cGUpOworCQljb25zdW1lVmxDYXBhYmlsaXR5KHJlc291cmNlLCBjcENvbXBJbnN0SWQsIHZsQ29tcEluc3RJZCwgY3BDb21wSW5zdElkLCB1c2VyLCBjb250YWluZXJDb21wVHlwZSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkID0gY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZCk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWlmIChyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCX0gZWxzZQorCQkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKwkJaWYgKHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY1Rlc3RlckRldGFpbHMsCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCQlpZiAocmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCQkJCVN0cmluZyBuZXdWZXJzaW9uID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmVyc2lvbkZyb21SZXNwb25zZShyZXN0UmVzcG9uc2UpOworCQkJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOworCQkJCXJlc291cmNlRGV0YWlscy5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQoc2RuY1Rlc3RlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJCXJlc291cmNlRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHNkbmNUZXN0ZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQkJCVN0cmluZyB1bmlxdWVJZEZyb21ScmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJCQkidW5pcXVlSWQiKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0VW5pcXVlSWQodW5pcXVlSWRGcm9tUnJlc3BvbnNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCX0KKworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VTdGF0ZVRvQ2VydGlmaWVkKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLyoKKwkJICogUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9CisJCSAqIExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsCisJCSAqIHNkbmNEZXNpZ25lckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCSAqIFJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQkgKi8KKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWlmIChyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVGVzdGVyRGV0YWlscywKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQl9IGVsc2UKKwkJCXJldHVybiByZXN0UmVzcG9uc2U7CisJCWlmIChyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVGVzdGVyRGV0YWlscywKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJCWlmIChyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQkJc2VydmljZURldGFpbHMuc2V0VmVyc2lvbigiMS4wIik7CisJCQkJc2VydmljZURldGFpbHMuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCQkJc2VydmljZURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQoc2RuY1Rlc3RlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJCXNlcnZpY2VEZXRhaWxzLnNldExhc3RVcGRhdGVyRnVsbE5hbWUoc2RuY1Rlc3RlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCQkJU3RyaW5nIHVuaXF1ZUlkRnJvbVJyZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkJCSJ1bmlxdWVJZCIpOworCQkJCXNlcnZpY2VEZXRhaWxzLnNldFVuaXF1ZUlkKHVuaXF1ZUlkRnJvbVJyZXNwb25zZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAxLAorCQkJCXNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCQlTdHJpbmcgY29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCisJCWNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UocHJvZHVjdERldGFpbHNfMDEsIHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAyLCAwKTsKKwkJU3RyaW5nIGNvbXBJbnN0SWQyID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBkZWxldGVTZXJ2aWNlSW5zdGFuY2UoY29tcEluc3RJZCwgcHJvZHVjdERldGFpbHNfMDEsIHNkbmNQbURldGFpbHMxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tEZWxldGVSZXNwb25zZShkZWxldGVTZXJ2aWNlSW5zdGFuY2VSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocHJvZHVjdERldGFpbHNfMDEsIDEsIDApOworCisJCWRlbGV0ZVNlcnZpY2VJbnN0YW5jZVJlc3AgPSBkZWxldGVTZXJ2aWNlSW5zdGFuY2UoY29tcEluc3RJZDIsIHByb2R1Y3REZXRhaWxzXzAxLCBzZG5jUG1EZXRhaWxzMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UoZGVsZXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHByb2R1Y3REZXRhaWxzXzAxLCAwLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJldHVybmVkU2VydmljZUluc3RhbmNlVHlwZUF0dHJpYnV0ZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGV4cGVjdGVkU2VydmljZVR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLmdldFZhbHVlKCkudG9VcHBlckNhc2UoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShwcm9kdWN0RGV0YWlsc18wMSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY1BtRGV0YWlsczEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3ApOworCQlTdHJpbmcgc2VydmljZVVuaXF1ZUlkRnJvbVJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcCk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNoZWNrQ29tcG9uZW50SW5zdGFuY2VUeXBlKGNyZWF0ZVNlcnZpY2VJbnN0YW5jZVJlc3AsIGV4cGVjdGVkU2VydmljZVR5cGUpOworCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzcCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0RGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLAorCQkJCXNkbmNQc0RldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlc3ApOworCQlQcm9kdWN0IHByb2R1Y3RPYmplY3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlc3AuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHByb2R1Y3RDb21wb25lbnRJbnN0YW5jZXMgPSBwcm9kdWN0T2JqZWN0LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXAgOiBwcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQlTdHJpbmcgYWN0dWFsT3JpZ2luVHlwZSA9IGNvbXAuZ2V0T3JpZ2luVHlwZSgpLmdldFZhbHVlKCkudG9VcHBlckNhc2UoKTsKKwkJCWFzc2VydFRydWUoZXhwZWN0ZWRTZXJ2aWNlVHlwZS5lcXVhbHMoYWN0dWFsT3JpZ2luVHlwZSkpOworCQl9CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAyKTsKKwkJc2VydmljZUluc3RhbmNlUmVxRGV0YWlscy5zZXRVbmlxdWVJZChzZXJ2aWNlVW5pcXVlSWRGcm9tUmVzcG9uc2UpOworCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldENvbXBvbmVudFVpZChzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5zdGFuY2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jUG1EZXRhaWxzMSwgcHJvZHVjdERldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZUluc3RhbmNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY2hlY2tDb21wb25lbnRJbnN0YW5jZVR5cGUodXBkYXRlUmVzb3VyY2VJbnN0YW5jZSwgZXhwZWN0ZWRTZXJ2aWNlVHlwZSk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RDcmVhdGVXaXRoVmFsaWRhdGlvbnNUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RDcmVhdGVXaXRoVmFsaWRhdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjMmRmZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdENyZWF0ZVdpdGhWYWxpZGF0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3MTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb2R1Y3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvZHVjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRQcm9kdWN0QXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5Db252ZXJ0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BdWRpdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlByb2R1Y3RWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgUHJvZHVjdENyZWF0ZVdpdGhWYWxpZGF0aW9uc1Rlc3QgZXh0ZW5kcyBQcm9kdWN0QmFzZVRlc3QgeworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJTklUSUFMX1BST0RVQ1RfVkVSU0lPTiA9ICIwLjEiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENSRUFURV9BVURJVF9BQ1RJT04gPSAiQ3JlYXRlIjsKKwlwdWJsaWMgU3RyaW5nIG5vcm1hbGl6ZWROYW1lOworCisJcHVibGljIFByb2R1Y3RDcmVhdGVXaXRoVmFsaWRhdGlvbnNUZXN0KCkgeworCQlzdXBlcihuYW1lLCBQcm9kdWN0Q3JlYXRlV2l0aFZhbGlkYXRpb25zVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFN1Y2Nlc3NWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5vdEJ5UG1Vc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RTdHJhdGVnaXN0VXNlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgSU5JVElBTF9QUk9EVUNUX1ZFUlNJT04sCisJCQkJcHJvZHVjdFN0cmF0ZWdpc3RVc2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0Tm90QnlBc2RjVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIG5vbkFzZGNVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlBST0RVQ1RfTUFOQUdFUjEpOworCQlub25Bc2RjVXNlci5zZXRVc2VySWQoImJ0NzUwayIpOworCQlub25Bc2RjVXNlci5zZXRGaXJzdE5hbWUobnVsbCk7CisJCW5vbkFzZGNVc2VyLnNldExhc3ROYW1lKG51bGwpOworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIlByb2R1Y3QxIik7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBub25Bc2RjVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCBJTklUSUFMX1BST0RVQ1RfVkVSU0lPTiwKKwkJCQlub25Bc2RjVXNlcik7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBub25Bc2RjVXNlciwgQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFVzZXJJZElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBub25Bc2RjVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX01BTkFHRVIxKTsKKwkJbm9uQXNkY1VzZXIuc2V0VXNlcklkKCIiKTsKKwkJbm9uQXNkY1VzZXIuc2V0Rmlyc3ROYW1lKG51bGwpOworCQlub25Bc2RjVXNlci5zZXRMYXN0TmFtZShudWxsKTsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgbm9uQXNkY1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCBJTklUSUFMX1BST0RVQ1RfVkVSU0lPTiwKKwkJCQlub25Bc2RjVXNlcik7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBub25Bc2RjVXNlciwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04sCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25MZXNzVGhhbk1pbkNoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm8iKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsCisJCQkJQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEgsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgIlByb2R1Y3QiLCAiYWJicmV2aWF0ZWQiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3ROYW1lVmFsaWRhdGlvbk1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBNYXggbGVuZ3RoID0gMjUKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJRd2VydHl1aW9wMTIzNDU2Nzg5MGFzZGZBIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdHVhbFByb2R1Y3QuZ2V0SXNBY3RpdmUoKSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25FeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTWF4IGxlbmd0aCA9IDI1CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUXdlcnR5dWlvcDEyMzQ1Njc4OTBhc2RmQWEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQludWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCAiUHJvZHVjdCIsICJhYmJyZXZpYXRlZCIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5hbWVWYWxpZGF0aW9uRW1wdHlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5NSVNTSU5HX09ORV9PRl9DT01QT05FTlRfTkFNRVMsCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgIlByb2R1Y3QiLAorCQkJCSJhYmJyZXZpYXRlZCIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5hbWVBbHJlYWR5RXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJLy8gcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvRHVjdDEiKTsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQljcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUywKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRWZXJzaW9uKCIwLjEiKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVCwKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCAiUHJvZHVjdCIsCisJCQkJcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiMC4xIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldFNFUlZJQ0VfSU5TVEFOQ0VfSUQobnVsbCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25OYW1lSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5NSVNTSU5HX09ORV9PRl9DT01QT05FTlRfTkFNRVMsCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgIlByb2R1Y3QiLAorCQkJCSJhYmJyZXZpYXRlZCIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCS8vIERFMTkzODU3CisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3ROYW1lVmFsaWRhdGlvbkFsbG93ZWRDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWNfMkAzOjQmIG09bitiLXUuai11J2cjYiIpOyAvLyBCdWcgQDomPSsnIworCQlub3JtYWxpemVkTmFtZSA9ICJhYzIzNG1uYnVqdWdiIjsKKwkJU3RyaW5nIGV4cGVjdGVkUHJvZHVjdE5hbWUgPSAiQWNfMkAzOjQmIE09bitiLXUuai11J2cjYiI7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZShleHBlY3RlZFByb2R1Y3ROYW1lKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWNfMkAzOjQmIE09bitiLXUuai11J2cjYiIpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShub3JtYWxpemVkTmFtZSk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwkvLyBERTE5Mzg1NworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25SRW1vdmVFeHRyYU5vbkFscGhhbnVtZXJpY0NoYXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWNfX19fMjIyLS0tLTMzMy4uLi4uLmFzZCIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFjXzIyMi0zMzMuYXNkIik7CisJCW5vcm1hbGl6ZWROYW1lID0gImFjMjIyMzMzYXNkIjsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdHVhbFByb2R1Y3QuZ2V0SXNBY3RpdmUoKSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25Ob3RBbGxvd2VkQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb247CisJCWNoYXIgaW52YWxpZENoYXJzW10gPSB7ICd+JywgJyEnLCAnJScsICdeJywgJyonLCAnKCcsICcpJywgJyInLCAneycsICd9JywgJ1snLCAnXScsICc/JywgJz4nLCAnPCcsICcvJywgJ3wnLAorCQkJCSdcXCcsICcsJywgJyQnIH07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZENoYXJzLmxlbmd0aDsgaSsrKSB7CisJCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJhYmMiICsgaW52YWxpZENoYXJzW2ldKTsKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLAorCQkJCQlwcm9kdWN0TWFuYWdlcjEpOworCQkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihleHBlY3RlZFByb2R1Y3QsCisJCQkJCUNSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9GT1JNQVQsCisJCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0IiwKKwkJCQkJImFiYnJldmlhdGVkIik7CisJCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RGdWxsTmFtZUNvbnRhaW5TcGVjaWFsQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljaGFyIGludmFsaWRDaGFyc1tdID0geyAnficsICchJywgJyUnLCAnXicsICcqJywgJygnLCAnKScsICciJywgJ3snLCAnfScsICdbJywgJ10nLCAnPycsICc+JywgJzwnLCAnLycsICd8JywKKwkJCQknXFwnLCAnLCcsICckJyB9OworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZENoYXJzLmxlbmd0aDsgaSsrKSB7CisJCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRGdWxsTmFtZSgiYWJjIiArIGludmFsaWRDaGFyc1tpXSk7CisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZGVsZXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQkJZGVsZXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJfQorCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25SZW1vdmVTcGFjZUZyb21CZWdpbm5pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCIgICAgICAgICBRd2VydHl1aW9wMTIzNDU2Nzg5MGFzZGZBIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudHJpbSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5hbWVWYWxpZGF0aW9uUmVtb3ZlU3BhY2VGcm9tVGhlRW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUXdlcnR5dWlvcDEyMzQ1Njc4OTBhc2RmQSAgICAgICAgIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudHJpbSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3ROYW1lVmFsaWRhdGlvblN0YXJ0V2l0aE51bWJlcigpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIjFRd2VydCIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRyaW0oKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50cmltKCkudG9Mb3dlckNhc2UoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdHVhbFByb2R1Y3QuZ2V0SXNBY3RpdmUoKSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25TdGFydFdpdGhOb25BbHBoYU51bWVyaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJfUXdlcnQiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50cmltKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLAorCQkJCUFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfRk9STUFULCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCW51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0IiwgImFiYnJldmlhdGVkIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25GaXJzdExldHRlck9mS2V5V29yZHNDYXBpdGFsaXplZCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFiYmEiKTsKKwkJLy8gcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KCJhYmJhIikpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCS8vIHByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFiYmEiKTsKKwkJLyoKKwkJICogU3RyaW5nIGFjdHVhbE5vcm1hbGl6ZWROYW1lRnJvbVJlc3BvbnNlID0KKwkJICogUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwKKwkJICogIm5vcm1hbGl6ZWROYW1lIik7CisJCSAqIGFzc2VydFRydWUoYWN0dWFsTm9ybWFsaXplZE5hbWVGcm9tUmVzcG9uc2UuZXF1YWxzKG5vcm1hbGl6ZWROYW1lKSk7CisJCSAqLworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RGdWxsTmFtZVZhbGlkYXRpb25Jc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfT05FX09GX0NPTVBPTkVOVF9OQU1FUywKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCAiUHJvZHVjdCIsICJmdWxsIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RnVsbE5hbWVWYWxpZGF0aW9uSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfT05FX09GX0NPTVBPTkVOVF9OQU1FUywKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCAiUHJvZHVjdCIsICJmdWxsIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RnVsbE5hbWVMZXNzVGhhbk1pbkxlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBNaW4gaXMgNCBjaGFyYWN0ZXJzCisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoImFiYyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwKKwkJCQlBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQludWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCAiUHJvZHVjdCIsICJmdWxsIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RnVsbE5hbWVIYXNNaW5MZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJBYmJhIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRGdWxsTmFtZSgiYWJjZCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RGdWxsTmFtZUhhc01heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFiYmEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEZ1bGxOYW1lKAorCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprIGwxMjN6eGN2Ym5tNDMyYWRmZ2hqa2xfLS4xMjNBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEZ1bGxOYW1lRXhjZWVkTWF4TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWJiYSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoCisJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamsgbDEyM3p4Y3Zibm00MzJhZGZnaGprbF8tLjEyM0FiYmExMjM0NTY3ODkwYXNkZmdoamtsMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLAorCQkJCUFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfTEVOR1RILCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCW51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0IiwgImZ1bGwiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RGdWxsTmFtZVJlbW92ZUV4dHJhU3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWJiYSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoIkFiYmFhYSAgYTEiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoIkFiYmFhYSBhMSIpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3REZXNjcmlwdGlvblZhbGlkYXRpb25Jc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24oIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0RFU0NSSVBUSU9OLAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0Iik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RGVzY3JpcHRpb25WYWxpZGF0aW9uSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24obnVsbCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04sCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgIlByb2R1Y3QiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3REZXNjcmlwdGlvblZhbGlkQ2hhcmFjdGVyczAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWJiYSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24oInF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MDxiPkJvbGQ8PC9iPiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigicXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwQm9sZCZsdDsiKTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdHVhbFByb2R1Y3QuZ2V0SXNBY3RpdmUoKSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RGVzY3JpcHRpb25WYWxpZENoYXJhY3RlcnMwMigpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFiYmEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJ+IUAjJCVeJiooKV8rPD4/cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwIyIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigifiFAIyQlXiZhbXA7KigpXysmbHQ7Jmd0Oz9xd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTAjIik7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdERlc2NyaXB0aW9uSW5WYWxpZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJBYmJhIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigi157XlCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0RFU0NSSVBUSU9OLAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0Iik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RGVzY3JpcHRpb25SZW1vdmVTcGFjZXNGcm9tQmVnaW5uaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWJiYSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24oIiAgIGFiY2QxMjM0NSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigiYWJjZDEyMzQ1Iik7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdERlc2NyaXB0aW9uUmVtb3ZlU3BhY2VzRnJvbVRoZUVuZCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFiYmEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJhYmNkIDEyMzQ1IHhjdmIgICAgIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJhYmNkIDEyMzQ1IHhjdmIiKTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdHVhbFByb2R1Y3QuZ2V0SXNBY3RpdmUoKSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RGVzY3JpcHRpb25NYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJBYmJhIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigKKwkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyM0FiYmExMjM0NTY3ODkwYXNkZmdoamtsMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMjNBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyM0FiYmExMjM0NTY3ODkwYXNkZmdoamtsMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMjNBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyM0FiYmExMjM0NTY3ODkwYXNkZmdoamtsMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMjNBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMmFzZGZnaGprbHp4Y3Zibm1xd2VydHl1aSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3REZXNjcmlwdGlvbkV4Y2VlZE1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFiYmEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKAorCQkJCSJBYnhiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyM0FiYmExMjM0NTY3ODkwYXNkZmdoamtsMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMjNBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyM0FiYmExMjM0NTY3ODkwYXNkZmdoamtsMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMjNBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyM0FiYmExMjM0NTY3ODkwYXNkZmdoamtsMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMjNBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDIzenhjdmJubTQzMmFzZGZnaGprbF8tLjEyQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoamtsXy0uMTIzQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wyM3p4Y3Zibm00MzJhc2RmZ2hqa2xfLS4xMmFzZGZnaGprbHp4Y3Zibm1xd2VydHl1aSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9ERVNDUklQVElPTl9FWENFRURTX0xJTUlULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0IiwgIjEwMjQiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RUYWdJc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdCIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoIiIpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLklOVkFMSURfRklFTERfRk9STUFULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0IiwgInRhZyIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCS8vIERFMTkyMzUxCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0VGFnVmFsaWRhdGlvbkFsbG93ZWRDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsgLy8gQnVnIEA6Jj0rJyMKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSwgIkFjZGUyQDM6NCYgbT1uK2ItdS5qLXUnZyNiIikpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RUYWdzTmFtZVZhbGlkYXRpb25Qcm9kdWN0TmFtZUlzTm90SW5UYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJRd2VydHl1aW9wMTIzNDU2Nzg5MGFzZGZBIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdCgiQWJjIikpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50cmltKCkudG9Mb3dlckNhc2UoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9UQUdTX05PX0NPTVBfTkFNRSwKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RTaW5nbGVUYWdNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU2luZ2xlVGFnTWF4TGVuZ3RoID0gNTAKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKAorCQkJCUFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2NzgiKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFNpbmdsZVRhZ0V4Y2VlZE1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIlByb2R1Y3QxIik7IC8vIEJ1ZyBAOiY9KycjCisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoCisJCQkJQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCksICJBeGJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2NzgiKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICI1MCIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEFsbFRhZ3NNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWxsVGFnc01heExlbmd0aCA9IDEwMjQKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKAorCQkJCUFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDEiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjAyIiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwMyIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDQiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA1IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwNiIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDciLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA4IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTY5IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxMCIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTEiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjEyIiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxMyIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTQiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjE1IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxNiIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTciLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjE4IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxOSIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDUiKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEFsbFRhZ3NFeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWxsVGFnc01heExlbmd0aCA9IDEwMjQKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKAorCQkJCUFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDEiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjAyIiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwMyIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDQiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA1IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwNiIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDciLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA4IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTY5IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxMCIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTEiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjEyIiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxMyIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTQiLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjE1IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxNiIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTciLAorCQkJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjE4IiwKKwkJCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxOSIsCisJCQkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2IikpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9UQUdTX0VYQ0VFRF9MSU1JVCwKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCAiMTAyNCIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdER1cGxpY2F0ZVRhZ1JlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOyAvLyBCdWcgQDomPSsnIworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLCBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RDb250YWN0c0lzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOyAvLyBCdWcgQDomPSsnIworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QoIiIpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0Iik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0Q29udGFjdHNJbnZhbGlkRm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsgLy8gQnVnIEA6Jj0rJyMKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRDb250YWN0cyhBcnJheXMuYXNMaXN0KCJidDc1MDM0NSIpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0Iik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0Q29udmVydENvbnRhY3RzVG9Mb3dlckNhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOyAvLyBCdWcgQDomPSsnIworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpLnRvVXBwZXJDYXNlKCkpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q29udGFjdHMoQXJyYXlzLmFzTGlzdChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkudG9Mb3dlckNhc2UoKSkpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RDb250YWN0c0RvZXhOb3RDb250YWluVGhlUHJvZHVjdENyZWF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOyAvLyBCdWcgQDomPSsnIworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QocHJvZHVjdE1hbmFnZXIyLmdldFVzZXJJZCgpKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QocHJvZHVjdE1hbmFnZXIyLmdldFVzZXJJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpKTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0Q29udGFjdHNOb3RBbGxvd2VkQXNkY1VzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsgLy8gQnVnIEA6Jj0rJyMKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRDb250YWN0cyhBcnJheXMuYXNMaXN0KGRlc2lnbmVyVXNlci5nZXRVc2VySWQoKSkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPRFVDVF9DT05UQUNULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJZGVzaWduZXJVc2VyLmdldFVzZXJJZCgpKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RDb250YWN0c05vdEFzZGNVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsgLy8gQnVnIEA6Jj0rJyMKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlTdHJpbmcgbm9uQXNkY1VzZXIgPSAiYmgxMjM0IjsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q29udGFjdHMoQXJyYXlzLmFzTGlzdChub25Bc2RjVXNlcikpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPRFVDVF9DT05UQUNULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG5vbkFzZGNVc2VyKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RQcm9qZWN0Q29kZUlzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0UHJvamVjdENvZGUoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfUFJPSkVDVF9DT0RFLAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFByb2plY3RDb2RlSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFByb2plY3RDb2RlKG51bGwpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfUFJPSkVDVF9DT0RFLAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFByb2plY3RDb2RlSXNOb3ROdW1lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFByb2plY3RDb2RlKCJhc2RmZ2giKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ERSwKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RQcm9qZWN0Q29kZUhhc25NaW5DaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE1pbiA9NQorCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIlByb2R1Y3QxIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRQcm9qZWN0Q29kZSgiMTIzNDUiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0UHJvamVjdENvZGVIYXNuTWF4Q2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBNYXggPTEwCisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFByb2plY3RDb2RlKCIxMjM0NTY3ODkwIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFByb2plY3RDb2RlRXhjZWVkTWF4Q2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBNYXggPTEwCisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFByb2plY3RDb2RlKCIxMjM0NTY3ODkwMSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPSkVDVF9DT0RFLAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFByb2plY3RDb2RlTGVzc1RoYW5NaW5DaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE1heCA9MTAKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0UHJvamVjdENvZGUoIjEyMzQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ERSwKKwkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RJY29uSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIlByb2R1Y3QxIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRJY29uKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsICJQcm9kdWN0Iik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0SWNvbklzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIlByb2R1Y3QxIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRJY29uKG51bGwpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0lDT04sCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgIlByb2R1Y3QiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RJY29uTWF4TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEljb24oImFzZGZnaGprbHF3ZXJ0eXVpb3p4Y3ZiZnYiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0SWNvbkV4Y2VlZE1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIlByb2R1Y3QxIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRJY29uKCJhc2RmZ2hqa2xxd2VydHl1aW96eGN2YmYxMiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JQ09OX0VYQ0VFRFNfTElNSVQsCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgIlByb2R1Y3QiLCAiMjUiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RJY29uQWxsb3dlZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0SWNvbigiYS0tcy1mZ2hqa19xX19yMTIzNDU2Nzg5MCIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RJY29uSW5WYWxpZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJU3RyaW5nIGljb24gPSAiYXNkZmciOworCQljaGFyIGludmFsaWRDaGFyc1tdID0geyAnficsICchJywgJyQnLCAnJScsICdeJywgJyonLCAnKCcsICcpJywgJyInLCAneycsICd9JywgJ1snLCAnXScsICc/JywgJz4nLCAnPCcsICcvJywKKwkJCQknfCcsICdcXCcsICcsJyB9OworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkQ2hhcnMubGVuZ3RoOyBpKyspIHsKKwkJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEljb24oaWNvbiArIGludmFsaWRDaGFyc1tpXSk7CisJCQljcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLAorCQkJCQlwcm9kdWN0TWFuYWdlcjEpOworCQkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9JQ09OLAorCQkJCQlDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLCBudWxsLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCAiUHJvZHVjdCIpOworCQkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfVkVSU0lPTigiIik7CisJCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0SXNBY3RpdmVpc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEFjdGl2ZSgiIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEFjdGl2ZSgiZmFsc2UiKTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0SXNBY3RpdmVpc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0QWN0aXZlKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0QWN0aXZlKCJmYWxzZSIpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlhc3NlcnRFcXVhbHMoYWN0dWFsUHJvZHVjdC5nZXRJc0FjdGl2ZSgpLCBuZXcgQm9vbGVhbihmYWxzZSkpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RJc0FjdGl2ZWlzRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0QWN0aXZlKCJmYWxzZSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgcHJvZHVjdFV1aWQgPSBSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhwcm9kdWN0UmVxRGV0YWlscywgY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdFJlcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0UmVzLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwKKwkJCQlDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQkiMC4xIiwgbnVsbCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIHByb2R1Y3RVdWlkKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RJc0FjdGl2ZWlzSGFzSW52YWxpZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiUHJvZHVjdDEiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSkpOworCQlub3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEFjdGl2ZSgieGZhbHNlIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJCWV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULAorCQkJCUNvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9WRVJTSU9OKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0UkVTT1VSQ0VfTkFNRSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0SXNBY3RpdmVpc1RydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJQcm9kdWN0MSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCW5vcm1hbGl6ZWROYW1lID0gcHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgiXFxzKyIsICIiKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0QWN0aXZlKCJ0cnVlIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVN0cmluZyBwcm9kdWN0VXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCWNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKHByb2R1Y3RSZXFEZXRhaWxzLCBjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCSIwLjEiLCBudWxsLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcHJvZHVjdFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERTE5MjQyNAorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5hbWVWYWxpZGF0aW9uTm9ybWFsaXphdGlvbk5hbWVXaXRoU3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWJiYSBFbW1hIik7CisJCS8vIHByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoImFiYmEgZW1tYSIpOworCQkvLyBwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QoImFiYmEgZW1tYSIpKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCJcXHMrIiwgIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlTdHJpbmcgYWN0dWFsTm9ybWFsaXplZE5hbWVGcm9tUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLAorCQkJCSJub3JtYWxpemVkTmFtZSIpOworCQlhc3NlcnRUcnVlKGFjdHVhbE5vcm1hbGl6ZWROYW1lRnJvbVJlc3BvbnNlLmVxdWFscyhub3JtYWxpemVkTmFtZSkpOworCQkvLyBwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJBYmJhIEVtbWEiKTsKKwkJU3RyaW5nIHByb2R1Y3RVdWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMocHJvZHVjdFJlcURldGFpbHMsIGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3RSZXMpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsCisJCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwkJYXNzZXJ0RXF1YWxzKGFjdHVhbFByb2R1Y3QuZ2V0SXNBY3RpdmUoKSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbigKKwkJCQlleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJIjAuMSIsIG51bGwsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBwcm9kdWN0VXVpZCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzLCBSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCkKKwkJCXRocm93cyBKU09ORXhjZXB0aW9uIHsKKwkJU3RyaW5nIHByb2R1Y3ROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0TmFtZUZyb21SZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJYXNzZXJ0VHJ1ZShwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkuZXF1YWxzKHByb2R1Y3ROYW1lKSk7CisJCVN0cmluZyBwcm9kdWN0SWNvbiA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksICJpY29uIik7CisJCWFzc2VydFRydWUocHJvZHVjdFJlcURldGFpbHMuZ2V0SWNvbigpLmVxdWFscyhwcm9kdWN0SWNvbikpOworCQlTdHJpbmcgcHJvZHVjdEZ1bGxOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgImZ1bGxOYW1lIik7CisJCWFzc2VydFRydWUocHJvZHVjdFJlcURldGFpbHMuZ2V0RnVsbE5hbWUoKS5lcXVhbHMocHJvZHVjdEZ1bGxOYW1lKSk7CisJCVN0cmluZyBwcm9kdWN0UHJvamVjdENvZGUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCAicHJvamVjdENvZGUiKTsKKwkJYXNzZXJ0VHJ1ZShwcm9kdWN0UmVxRGV0YWlscy5nZXRQcm9qZWN0Q29kZSgpLmVxdWFscyhwcm9kdWN0UHJvamVjdENvZGUpKTsKKwkJU3RyaW5nIHByb2R1Y3RJc0FjdGl2ZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksICJpc0FjdGl2ZSIpOworCQlTdHJpbmcgZXhwZWN0ZWRJc0FjdGl2ZSA9IChwcm9kdWN0UmVxRGV0YWlscy5nZXRBY3RpdmUoKSAhPSBudWxsID8gcHJvZHVjdFJlcURldGFpbHMuZ2V0QWN0aXZlKCkgOiAiZmFsc2UiKTsKKwkJYXNzZXJ0VHJ1ZShwcm9kdWN0SXNBY3RpdmUuZXF1YWxzKGV4cGVjdGVkSXNBY3RpdmUpKTsKKwkJU3RyaW5nIHByb2R1Y3RkZXNjcmlwdGlvbiA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksICJkZXNjcmlwdGlvbiIpOworCQlhc3NlcnRUcnVlKHByb2R1Y3RSZXFEZXRhaWxzLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKHByb2R1Y3RkZXNjcmlwdGlvbikpOworCQlTdHJpbmcgcHJvZHVjdE5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibm9ybWFsaXplZE5hbWUiKTsKKwkJYXNzZXJ0VHJ1ZShub3JtYWxpemVkTmFtZS5lcXVhbHMocHJvZHVjdE5vcm1hbGl6ZWROYW1lKSk7CisJCVN0cmluZyBwcm9kdWN0Q29udGFjdHMgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCAiY29udGFjdHMiKTsKKwkJSlNPTkFycmF5IHJlY2l2aWVkQ29udGFjdHMgPSBuZXcgSlNPTkFycmF5KHByb2R1Y3RDb250YWN0cyk7CisJCVN0cmluZyBhY3R1YWxDb250YWN0ID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNpdmllZENvbnRhY3RzLmxlbmd0aCgpOyBpKyspIHsKKwkJCWFjdHVhbENvbnRhY3QgPSByZWNpdmllZENvbnRhY3RzLmdldFN0cmluZyhpKTsKKwkJCWFzc2VydEVxdWFscyhwcm9kdWN0UmVxRGV0YWlscy5nZXRDb250YWN0cygpLmdldChpKSwgYWN0dWFsQ29udGFjdCk7CisJCX0KKwkJU3RyaW5nIHByb2R1Y3RUYWdzID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgInRhZ3MiKTsKKwkJSlNPTkFycmF5IHJlY2l2aWVkVGFnZXMgPSBuZXcgSlNPTkFycmF5KHByb2R1Y3RUYWdzKTsKKwkJU3RyaW5nIGFjdHVhbFRhZyA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjaXZpZWRUYWdlcy5sZW5ndGgoKTsgaSsrKSB7CisJCQlhY3R1YWxUYWcgPSByZWNpdmllZFRhZ2VzLmdldFN0cmluZyhpKTsKKwkJCWFzc2VydEVxdWFscyhwcm9kdWN0UmVxRGV0YWlscy5nZXRUYWdzKCkuZ2V0KGkpLCBhY3R1YWxUYWcpOworCQl9CisJfQorCisJLy8gRU5ECisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFN1Y2Nlc3NGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldHRpbmcgY3JlYXRlZCBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldFByb2R1Y3RSZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKGZhbHNlKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0U2V0SXNBY3RpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRBY3RpdmUoInRydWUiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldHRpbmcgY3JlYXRlZCBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldFByb2R1Y3RSZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LAorCQkJCUNvbXBvbmVudE9wZXJhdGlvbkVudW0uR0VUX0NPTVBPTkVOVCk7CisJCWFzc2VydEVxdWFscyhhY3R1YWxQcm9kdWN0LmdldElzQWN0aXZlKCksIG5ldyBCb29sZWFuKHRydWUpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3ROb0ljb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRJY29uKG51bGwpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0RBVEEsCisJCQkJY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5vUHJvamVjdENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRQcm9qZWN0Q29kZShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTUlTU0lOR19EQVRBLAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdENydWRUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RDcnVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMzQ3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RDcnVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE5NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9kdWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFByb2R1Y3RBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5Db252ZXJ0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5DYXRhbG9nUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUHJvZHVjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlByb2R1Y3RWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKKworcHVibGljIGNsYXNzIFByb2R1Y3RDcnVkVGVzdCBleHRlbmRzIFByb2R1Y3RCYXNlVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2R1Y3RDcnVkVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJTklUSUFMX1BST0RVQ1RfVkVSU0lPTiA9ICIwLjEiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENSRUFURV9BVURJVF9BQ1RJT04gPSAiQ3JlYXRlIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVUERBVEVfQVVESVRfQUNUSU9OID0gIlVwZGF0ZSI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ09NUE9ORU5UX1RZUEUgPSAiUHJvZHVjdCI7CisKKwlwcml2YXRlIFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzOworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3Q7CisJcHJpdmF0ZSBQcm9kdWN0IHByb2R1Y3Q7CisKKwlwdWJsaWMgUHJvZHVjdENydWRUZXN0KCkgeworCQlzdXBlcihuYW1lLCBQcm9kdWN0Q3J1ZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVBbmRHZXRBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjdEFuZEdldChVc2VyUm9sZUVudW0uREVTSUdORVIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9kdWN0QW5kR2V0KFVzZXJSb2xlRW51bSB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwgY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgY2F0YWxvZyA9IENhdGFsb2dSZXN0VXRpbHMuZ2V0Q2F0YWxvZyh1c2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBjYXRhbG9nIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBjYXRhbG9nLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXRyeSB7CisJCQlKc29uRWxlbWVudCBqRWxlbWVudCA9IG5ldyBKc29uUGFyc2VyKCkucGFyc2UoY2F0YWxvZy5nZXRSZXNwb25zZSgpKTsKKwkJCUpzb25PYmplY3Qgak9iamVjdCA9IGpFbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQkJSnNvbkFycmF5IHByb2R1Y3RzID0gKEpzb25BcnJheSkgak9iamVjdC5nZXQoInByb2R1Y3RzIik7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHByb2R1Y3QgYXJyYXkgc2l6ZSIsIDEsIHByb2R1Y3RzLnNpemUoKSk7CisJCQlJdGVyYXRvcjxKc29uRWxlbWVudD4gaXRlciA9IHByb2R1Y3RzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlKc29uRWxlbWVudCBuZXh0ID0gaXRlci5uZXh0KCk7CisJCQkJUHJvZHVjdCBwcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKG5leHQudG9TdHJpbmcoKSwgUHJvZHVjdC5jbGFzcyk7CisJCQkJYXNzZXJ0Tm90TnVsbChwcm9kdWN0KTsKKwkJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHByb2R1Y3QgbmFtZSIsIHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSwgcHJvZHVjdC5nZXROYW1lKCkpOworCQkJCS8vIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsVmVyc2lvbnMgPSBwcm9kdWN0LmdldEFsbFZlcnNpb25zKCk7CisJCQkJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayBwcm9kdWN0IG5hbWUiLCAxLCBhbGxWZXJzaW9ucy5zaXplKCkpOworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImV4Y2VwdGlvbiIsIGUpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRBbGxOb1Byb2NkdXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNhdGFsb2cgPSBDYXRhbG9nUmVzdFV0aWxzLmdldENhdGFsb2coKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBjYXRhbG9nIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBjYXRhbG9nLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXRyeSB7CisJCQlKc29uRWxlbWVudCBqRWxlbWVudCA9IG5ldyBKc29uUGFyc2VyKCkucGFyc2UoY2F0YWxvZy5nZXRSZXNwb25zZSgpKTsKKwkJCUpzb25PYmplY3Qgak9iamVjdCA9IGpFbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQkJSnNvbkFycmF5IHByb2R1Y3RzID0gKEpzb25BcnJheSkgak9iamVjdC5nZXQoInByb2R1Y3RzIik7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHByb2R1Y3QgYXJyYXkgc2l6ZSIsIDAsIHByb2R1Y3RzLnNpemUoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImV4Y2VwdGlvbiIsIGUpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEFsbE5vQXR0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0NBVEFMT0dfREFUQSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJTGlzdDxTdHJpbmc+IGhlYWRlcnNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQloZWFkZXJzVG9SZW1vdmUuYWRkKEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNhdGFsb2cgPSBDYXRhbG9nUmVzdFV0aWxzLnNlbmRHZXRBbmRSZW1vdmVIZWFkZXJzKHVybCwgbnVsbCwgaGVhZGVyc1RvUmVtb3ZlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBjYXRhbG9nIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLCBjYXRhbG9nLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCBjYXRhbG9nLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0QWxsV3JvbmdVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjYXRhbG9nID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRDYXRhbG9nKCJrajg5NzYiKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBjYXRhbG9nIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgY2F0YWxvZy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIGNhdGFsb2cuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0QWxsV2l0aFByb2R1Y3RTdHJhdGVnaXN0X1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjdEFuZEdldChVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMSk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0QWxsV2l0aFByb2R1Y3RNYW5hZ2VyX1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjdEFuZEdldChVc2VyUm9sZUVudW0uUFJPRFVDVF9NQU5BR0VSMSk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5vQ2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWN0V2l0aENhdGVnb3JpZXMobnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE9uZUdyb3VwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENhdGVnb3J5MS0+W1N1YmNhdGVnb3J5MS0+W0dyb3VwaW5nMV1dCisJCWNyZWF0ZVByb2R1Y3RXaXRoQ2F0ZWdvcmllcyhkZWZhdWx0Q2F0ZWdvcmllcyk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFR3b0dyb3VwaW5nc1NhbWVTdWJDYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDYXRlZ29yeTEtPlN1YmNhdGVnb3J5MS0+W0dyb3VwaW5nMSwgR3JvdXBpbmcxMV0KKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGFkZFNlY29uZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkgPSBhZGRTZWNvbmRHcm91cGluZ1RvRGVmYXVsdENhdGVnb3J5KCk7CisJCWNyZWF0ZVByb2R1Y3RXaXRoQ2F0ZWdvcmllcyhhZGRTZWNvbmRHcm91cGluZ1RvRGVmYXVsdENhdGVnb3J5KTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0VHdvU3Vic0RpZmZlcmVudEdyb3VwaW5ncygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDYXRlZ29yeTEtPltTdWJjYXRlZ29yeTEtPltHcm91cGluZzEsCisJCS8vIEdyb3VwaW5nMTFdLFN1YmNhdGVnb3J5Mi0+W0dyb3VwaW5nMTJdXQorCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gYWRkU3ViY2F0ZWdvcnlBbmRHcm91cGluZ1RvRGVmYXVsdENhdGVnb3J5ID0gYWRkU3ViY2F0ZWdvcnlBbmRHcm91cGluZ1RvRGVmYXVsdENhdGVnb3J5KCk7CisJCWNyZWF0ZVByb2R1Y3RXaXRoQ2F0ZWdvcmllcyhhZGRTdWJjYXRlZ29yeUFuZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZU1hbnlHcm91cGluZ3NEaWZmQ2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBbQ2F0ZWdvcnkxLT5bU3ViY2F0ZWdvcnkxLT5bR3JvdXBpbmcxLAorCQkvLyBHcm91cGluZzExXSxTdWJjYXRlZ29yeTItPltHcm91cGluZzEyXV0sCisJCS8vIENhdGVnb3J5Mi0+W1N1YmNhdGVnb3J5MS0+W0dyb3VwaW5nMV0sU3ViY2F0ZWdvcnkyLT5bR3JvdXBpbmcxXV0sCisJCS8vIENhdGVnb3J5My0+W1N1YmNhdGVnb3J5MS0+W0dyb3VwaW5nMTFdLFN1YmNhdGVnb3J5Mi0+W0dyb3VwaW5nMTEsCisJCS8vIEdyb3VwaW5nMjJdXV0KKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGFkZFN1YmNhdGVnb3J5QW5kR3JvdXBpbmdUb0RlZmF1bHRDYXRlZ29yeSA9IGFkZE1hbnlHcm91cGluZ3NEaWZmQ2F0ZWdvcmllcygpOworCQljcmVhdGVQcm9kdWN0V2l0aENhdGVnb3JpZXMoYWRkU3ViY2F0ZWdvcnlBbmRHcm91cGluZ1RvRGVmYXVsdENhdGVnb3J5KTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0RW1wdHlVc2VySWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlVc2VyIGVtcHR5VXNlciA9IG5ldyBVc2VyKCk7CisJCWVtcHR5VXNlci5zZXRVc2VySWQoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgZW1wdHlVc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLCBjcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgSU5JVElBTF9QUk9EVUNUX1ZFUlNJT04sIGVtcHR5VXNlcik7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBlbXB0eVVzZXIsIEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBudWxsLAorCQkJCW51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE5vbkV4aXN0aW5nVXNlcklkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJVXNlciBub3RFeGlzdGluZ1VzZXIgPSBuZXcgVXNlcigpOworCQlub3RFeGlzdGluZ1VzZXIuc2V0VXNlcklkKCJqajY0NDQiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIG5vdEV4aXN0aW5nVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sIGNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCBJTklUSUFMX1BST0RVQ1RfVkVSU0lPTiwgbm90RXhpc3RpbmdVc2VyKTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihleHBlY3RlZFByb2R1Y3QsIENSRUFURV9BVURJVF9BQ1RJT04sIG5vdEV4aXN0aW5nVXNlciwgQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLAorCQkJCW51bGwsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdEludmFsaWRKc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3RfSW52YWxpZF9Kc29uKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCBjcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgSU5JVElBTF9QUk9EVUNUX1ZFUlNJT04sIHByb2R1Y3RNYW5hZ2VyMSk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oZXhwZWN0ZWRQcm9kdWN0LCBDUkVBVEVfQVVESVRfQUNUSU9OLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsCisJCQkJbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRSRVNPVVJDRV9OQU1FKCIiKTsKKwkJY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLnNldENVUlJfU1RBVEUoIiIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RBZG1pblJvbGVOb3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJVXNlciB3cm9uZ1JvbGUgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgd3JvbmdSb2xlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsIElOSVRJQUxfUFJPRFVDVF9WRVJTSU9OLCB3cm9uZ1JvbGUpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgd3JvbmdSb2xlLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsCisJCQkJbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1NUQVRFKCIiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uLCBDUkVBVEVfQVVESVRfQUNUSU9OKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0UHJvZHVjdFN0cmF0ZWdpc3RSb2xlTm90QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCVVzZXIgd3JvbmdSb2xlID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlBST0RVQ1RfU1RSQVRFR0lTVDMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgd3JvbmdSb2xlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsIElOSVRJQUxfUFJPRFVDVF9WRVJTSU9OLCB3cm9uZ1JvbGUpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgd3JvbmdSb2xlLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIG51bGwsCisJCQkJbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbi5zZXRDVVJSX1ZFUlNJT04oIiIpOworCQljb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24uc2V0Q1VSUl9TVEFURSgiIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgQ1JFQVRFX0FVRElUX0FDVElPTik7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UHJvZHVjdFN1Y2Nlc3NGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwgY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0dGluZyBjcmVhdGVkIFByb2R1Y3QiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGdldFByb2R1Y3RSZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3RSZXMuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLkdFVF9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIGdldE5vbkV4aXN0ZWRQcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVELCBjcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXR0aW5nIGNyZWF0ZWQgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgZ2V0UHJvZHVjdFJlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlQcm9kdWN0IHByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJBc3NlcnQgb24gcHJvZHVjdCBpY29uIiwgIlByb2R1Y3QxIiwgcHJvZHVjdC5nZXROYW1lKCkpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5kZWxldGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBmb3IgZGVsZXRpZ24gUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgZGVsZXRlUHJvZHVjdFJlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdEFmdGVyRGVsZXRlUmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXR0aW5nIGRlbGV0ZWQgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTk9UX0ZPVU5ELCBnZXRQcm9kdWN0QWZ0ZXJEZWxldGVSZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UHJvZHVjdE1pc3NpbmdIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsIGNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcHJvZHVjdE1hbmFnZXIxLnNldFVzZXJJZChudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldHRpbmcgY3JlYXRlZCBQcm9kdWN1Y3Qgd2l0aCB1c2VySWQgZXh0cmFjdGVkIGZyb20gaGVhZGVyIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLCBnZXRQcm9kdWN0UmVzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UHJvZHVjdE5vbkV4aXN0aW5nVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsIGNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcHJvZHVjdE1hbmFnZXIxLnNldFVzZXJJZCgiYnQxMTExIik7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXR0aW5nIGNyZWF0ZWQgUHJvZHVjdWN0IHdpdGggbm9uIGV4c2lzdGluZyB1c2VyIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgZ2V0UHJvZHVjdFJlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0QW5kR2V0UHJvZHVjdFdpdGhEaWZmZXJlbnRVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwgY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJVXNlciBzZG5jUHJvZHVjdFN0cmF0ZWdpc3RVc2VyQWRtaW5EZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3RSZXMgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgc2RuY1Byb2R1Y3RTdHJhdGVnaXN0VXNlckFkbWluRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXR0aW5nIGNyZWF0ZWQgUHJvZHVjdCBkaWZmZXJlbnQgdXNlciByb2xlIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCBnZXRQcm9kdWN0UmVzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCS8vIFVTNTk0NzUzIC0gVXBkYXRlIFByb2R1Y3QgbWV0YWRhdGEKKworCS8vIElmIHVzZXIgdXBkYXRlIFByb2R1Y3QgTmFtZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIHByb2R1Y3QgbmFtZSBmcm9tCisJLy8gVGFncyBhbmQgYWRkIHRoZSBuZXcgcHJvZHVjdCBuYW1lIGluc3RlYWQgLSB3aWxsIGJlIGhhbmRsZWQgaW4gbmV3IFVTCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RBbGxGaWVsZHNCeVBNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJLy8gVXBkYXRlIHByb2R1Y3QKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIk5ld1Byb2R1Y3ROYW1lIik7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBhZGRTZWNvbmRHcm91cGluZ1RvRGVmYXVsdENhdGVnb3J5ID0gYWRkU2Vjb25kR3JvdXBpbmdUb0RlZmF1bHRDYXRlZ29yeSgpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRGdWxsTmFtZSgiTmV3IEZ1bGwgbmFtZSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRBY3RpdmUoImZhbHNlIik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QocHJvZHVjdE1hbmFnZXIyLmdldFVzZXJJZCgpLnRvTG93ZXJDYXNlKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKS50b0xvd2VyQ2FzZSgpKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJOZXcgUHJvZHVjdCBEZXNjcmlwdGlvbiIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRJY29uKCJhc2RmZ2hqa2xxd2VydHl1aW96eGN2YmZ2Iik7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFByb2plY3RDb2RlKCI5ODc2NSIpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRDYXRlZ29yaWVzKGFkZFNlY29uZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCS8vIHByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCksCisJCS8vIHByb2R1Y3RPbGROYW1lKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIjAuMiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQocHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Tm9ybWFsaXplZE5hbWUocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0QnlQUygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigiTmV3IGRpc2NyaXB0aW9uIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0QnlBZG1pbigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigiTmV3IGRpc2NyaXB0aW9uIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBkZXNpZ25lclVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RCeU5vblBtVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQkvLyBVcGRhdGUgcHJvZHVjdCBuYW1lCisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJOZXcgZGlzY3JpcHRpb24iKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEJ5Tm9uQXNkY1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJLy8gVXBkYXRlIHByb2R1Y3QgbmFtZQorCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigiTmV3IGRpc2NyaXB0aW9uIik7CisJCVVzZXIgbm9uQXNkY1VzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJbm9uQXNkY1VzZXIuc2V0VXNlcklkKCJidDc4OWsiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIG5vbkFzZGNVc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0VXNlcklkSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQkvLyBVcGRhdGUgcHJvZHVjdCBuYW1lCisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJOZXcgZGlzY3JpcHRpb24iKTsKKwkJVXNlciBub25Bc2RjVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlub25Bc2RjVXNlci5zZXRVc2VySWQoIiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgbm9uQXNkY1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OLCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0QnlOb25Qcm9kdWN0T3duZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdChkZWZhdWx0Q2F0ZWdvcmllcyk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24oIk5ldyBkaXNjcmlwdGlvbiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5HRVRfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0Tm90SW5DaGVja291dFN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoZGVmYXVsdENhdGVnb3JpZXMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IHByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCS8vIFVwZGF0ZSBwcm9kdWN0IG5hbWUKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0U3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCVN0cmluZyB2YWx1ZUZyb21Kc29uUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hhbmdlUHJvZHVjdExpZmVDeWNsZS5nZXRSZXNwb25zZSgpLCAibGFzdFVwZGF0ZURhdGUiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVEYXRlKExvbmcucGFyc2VMb25nKHZhbHVlRnJvbUpzb25SZXNwb25zZSkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdE5hbWVJc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChDT01QT05FTlRfVFlQRSk7CisJCXZhcmliYWxlcy5hZGQoImFiYnJldmlhdGVkIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19PTkVfT0ZfQ09NUE9ORU5UX05BTUVTLm5hbWUoKSwgdmFyaWJhbGVzLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3ROYW1lSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJLy8gTGlzdDxTdHJpbmc+IHRhZ3MgPSBwcm9kdWN0UmVxRGV0YWlscy5nZXRUYWdzKCk7CisJCS8vIHRhZ3MucmVtb3ZlQWxsKHRhZ3MpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PigpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUobnVsbCk7IC8vIG5vIHVwZGF0ZSB3aWxsIGJlIHBlcmZvcm1lZAorCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIyKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIjAuMiIsIHByb2R1Y3RNYW5hZ2VyMik7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQocHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Tm9ybWFsaXplZE5hbWUocHJvZHVjdC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROYW1lKHByb2R1Y3QuZ2V0TmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdE5hbWVMZXNzVGhhbk1pbkxlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJBQkMiKTsgLy8gbm8gdXBkYXRlIHdpbGwgYmUgcGVyZm9ybWVkCisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKENPTVBPTkVOVF9UWVBFKTsKKwkJdmFyaWJhbGVzLmFkZCgiYWJicmV2aWF0ZWQiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfTEVOR1RILm5hbWUoKSwgdmFyaWJhbGVzLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCS8vIElmIHVzZXIgdXBkYXRlIFByb2R1Y3QgTmFtZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIHByb2R1Y3QgbmFtZSBmcm9tCisJLy8gVGFncyBhbmQgYWRkIHRoZSBuZXcgcHJvZHVjdCBuYW1lIGluc3RlYWQgLSB3aWxsIGJlIGhhbmRsZWQgaW4gbmV3IFVTCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3ROYW1lSGFzTWluTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIk5ld1AiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMi5nZXRVc2VySWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIyLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIwLjIiLCBwcm9kdWN0TWFuYWdlcjIpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJbnZhcmlhbnRVVUlEKHByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5vcm1hbGl6ZWROYW1lKHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJLy8gSWYgdXNlciB1cGRhdGUgUHJvZHVjdCBOYW1lIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvbGQgcHJvZHVjdCBuYW1lIGZyb20KKwkvLyBUYWdzIGFuZCBhZGQgdGhlIG5ldyBwcm9kdWN0IG5hbWUgaW5zdGVhZCAtIHdpbGwgYmUgaGFuZGxlZCBpbiBuZXcgVVMKKwkvLyBERTE5Mzg1NyAtIE5vcm1hbGl6ZWQgTmFtZSBpcyBub3QgcmVtb3Zpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3ROYW1lTWF4TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJLy8gVXBkYXRlIHByb2R1Y3QgbmFtZQorCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQWNfMkIzVTRrIG1TS25vYi11LmotdUdnUCIpOworCQlTdHJpbmcgbmV3Tm9ybWFsaXplZE5hbWUgPSAiYWMyYjN1NGttc2tub2J1anVnZ3AiOworCQlTdHJpbmcgbmV3TmFtZSA9ICJBY18yQjNVNGsgTVNLbm9iLXUuai11R2dQIjsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QobmV3TmFtZSkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiMC4yIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0SW52YXJpYW50VVVJRChwcm9kdWN0LmdldEludmFyaWFudFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShuZXdOb3JtYWxpemVkTmFtZSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROYW1lKG5ld05hbWUpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0TmFtZUV4Y2VlZE1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJBY18yQjNVNGsgbVNLbm9iLXUuai11R2dQeCIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChDT01QT05FTlRfVFlQRSk7CisJCXZhcmliYWxlcy5hZGQoImFiYnJldmlhdGVkIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSC5uYW1lKCksIHZhcmliYWxlcywgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0TmFtZUFscmVhZHlFeGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KGRlZmF1bHRDYXRlZ29yaWVzKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBwcm9kdWN0MSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0MSwgcHJvZHVjdE1hbmFnZXIyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiQ2lQcm9kdWN0MjAwMCIpOworCQkvLyBwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpKSk7CisJCWNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJUHJvZHVjdCBwcm9kdWN0MiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQljaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QyLCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQljaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QyLCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdDIuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdDIuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZShwcm9kdWN0MS5nZXROYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKENPTVBPTkVOVF9UWVBFKTsKKwkJdmFyaWJhbGVzLmFkZChwcm9kdWN0MS5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMi5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QyLmdldFVuaXF1ZUlkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0Mi5nZXRWZXJzaW9uKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwkvLyBERTE5Mzg1NyAtIE5vcm1hbGl6ZWQgTmFtZSBpcyBub3QgcmVtb3Zpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzCisJLy8gSWYgdXNlciB1cGRhdGUgUHJvZHVjdCBOYW1lIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvbGQgcHJvZHVjdCBuYW1lIGZyb20KKwkvLyBUYWdzIGFuZCBhZGQgdGhlIG5ldyBwcm9kdWN0IG5hbWUgaW5zdGVhZCAtIHdpbGwgYmUgaGFuZGxlZCBpbiBuZXcgVVMKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdE5hbWVBbGxvd2VkQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCS8vIFVwZGF0ZSBwcm9kdWN0IG5hbWUKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoIkFfQlU0ayBtJks9byNiLXUuai11RydnK1AiKTsgLy8gQWxsb3dlZAorCQkJCQkJCQkJCQkJCQkJCS8vIGNoYXJhY3RlcnMKKwkJCQkJCQkJCQkJCQkJCQkvLyBbYS16LEEtWiwwLTldCisJCQkJCQkJCQkJCQkJCQkJLy8gLCDigJgg4oCYCisJCQkJCQkJCQkJCQkJCQkJLy8gKHNwYWNlKSwKKwkJCQkJCQkJCQkJCQkJCQkvLyBhbXBlcnNhbmQKKwkJCQkJCQkJCQkJCQkJCQkvLyBkYXNoCisJCQkJCQkJCQkJCQkJCQkJLy8g4oCcLeKAnCwgcGx1cworCQkJCQkJCQkJCQkJCQkJCS8vICIrIiwgcGVyaW9kCisJCQkJCQkJCQkJCQkJCQkJLy8gIi4iLAorCQkJCQkJCQkJCQkJCQkJCS8vIGFwb3N0cm9waGUKKwkJCQkJCQkJCQkJCQkJCQkvLyAiJyIsIGhhc2h0YWcKKwkJCQkJCQkJCQkJCQkJCQkvLyAiIyIsIGVxdWFsCisJCQkJCQkJCQkJCQkJCQkJLy8gIj0iLCBwZXJpb2QKKwkJCQkJCQkJCQkJCQkJCQkvLyAiOiIsIGF0ICJAIiwKKwkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKKwkJCQkJCQkJCQkJCQkJCQkvLyB1bmRlcnNjb3JlCisJCQkJCQkJCQkJCQkJCQkJLy8KKwkJU3RyaW5nIG5ld05vcm1hbGl6ZWROYW1lID0gImFidTRrbSZrb2J1anVnZ3AiOworCQlTdHJpbmcgbmV3TmFtZSA9ICJBX0JVNGsgTSZLPW8jYi11LmotdUcnZytQIjsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QobmV3TmFtZSkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiMC4yIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0SW52YXJpYW50VVVJRChwcm9kdWN0LmdldEludmFyaWFudFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShuZXdOb3JtYWxpemVkTmFtZSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROYW1lKG5ld05hbWUpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwkvLyBJZiB1c2VyIHVwZGF0ZSBQcm9kdWN0IE5hbWUgd2UgbmVlZCB0byByZW1vdmUgdGhlIG9sZCBwcm9kdWN0IG5hbWUgZnJvbQorCS8vIFRhZ3MgYW5kIGFkZCB0aGUgbmV3IHByb2R1Y3QgbmFtZSBpbnN0ZWFkIC0gd2lsbCBiZSBoYW5kbGVkIGluIG5ldyBVUworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0TmFtZVJlbW92ZVNwYWNlRnJvbUJlZ2lubmluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCIgICAgICBhc2RmZyIpOworCQlTdHJpbmcgbmV3Tm9ybWFsaXplZE5hbWUgPSAiYXNkZmciOworCQlTdHJpbmcgbmV3TmFtZSA9ICJBc2RmZyI7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJLy8gcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KG5ld05hbWUsIHByb2R1Y3RPbGROYW1lKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChuZXdOYW1lKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIwLjIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJbnZhcmlhbnRVVUlEKHByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5vcm1hbGl6ZWROYW1lKG5ld05vcm1hbGl6ZWROYW1lKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5hbWUobmV3TmFtZSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCS8vIElmIHVzZXIgdXBkYXRlIFByb2R1Y3QgTmFtZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIHByb2R1Y3QgbmFtZSBmcm9tCisJLy8gVGFncyBhbmQgYWRkIHRoZSBuZXcgcHJvZHVjdCBuYW1lIGluc3RlYWQgLSB3aWxsIGJlIGhhbmRsZWQgaW4gbmV3IFVTCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3ROYW1lUmVtb3ZlU3BhY2VGcm9tRW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldE5hbWUoImFzZGZnIGZjICAgICAgICAiKTsKKwkJU3RyaW5nIG5ld05vcm1hbGl6ZWROYW1lID0gImFzZGZnZmMiOworCQlTdHJpbmcgbmV3TmFtZSA9ICJBc2RmZyBGYyI7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJLy8gcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KG5ld05hbWUsIHByb2R1Y3RPbGROYW1lKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChuZXdOYW1lKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIwLjIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJbnZhcmlhbnRVVUlEKHByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5vcm1hbGl6ZWROYW1lKG5ld05vcm1hbGl6ZWROYW1lKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5hbWUobmV3TmFtZSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCS8vLy8gREUxOTM4NTcgLSBOb3JtYWxpemVkIE5hbWUgaXMgbm90IHJlbW92aW5nIHNwZWNpYWwgY2hhcmFjdGVycworCS8vIElmIHVzZXIgdXBkYXRlIFByb2R1Y3QgTmFtZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIHByb2R1Y3QgbmFtZSBmcm9tCisJLy8gVGFncyBhbmQgYWRkIHRoZSBuZXcgcHJvZHVjdCBuYW1lIGluc3RlYWQgLSB3aWxsIGJlIGhhbmRsZWQgaW4gbmV3IFVTCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3ROYW1lUmVtb3ZlRXh0cmFOb25BbHBoYW51bWVyaWNDaGFycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXROYW1lKCJBX19rICYmPT0jIy0tLXUuLmhHJycnKysrIik7CisJCVN0cmluZyBuZXdOb3JtYWxpemVkTmFtZSA9ICJha2hnIjsKKwkJU3RyaW5nIG5ld05hbWUgPSAiQV9rICY9Iy11LmhHJysiOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCS8vIHByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChuZXdOYW1lLCBwcm9kdWN0T2xkTmFtZSkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QobmV3TmFtZSkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiMC4yIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0SW52YXJpYW50VVVJRChwcm9kdWN0LmdldEludmFyaWFudFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShuZXdOb3JtYWxpemVkTmFtZSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROYW1lKG5ld05hbWUpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwkvLyBJZiB1c2VyIHVwZGF0ZSBQcm9kdWN0IE5hbWUgd2UgbmVlZCB0byByZW1vdmUgdGhlIG9sZCBwcm9kdWN0IG5hbWUgZnJvbQorCS8vIFRhZ3MgYW5kIGFkZCB0aGUgbmV3IHByb2R1Y3QgbmFtZSBpbnN0ZWFkIC0gd2lsbCBiZSBoYW5kbGVkIGluIG5ldyBVUworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25TdGFydFdpdGhOdW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiMTAwMEFiIik7CisJCVN0cmluZyBuZXdOb3JtYWxpemVkTmFtZSA9IHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpKTsKKwkJLy8gcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSwKKwkJLy8gcHJvZHVjdE9sZE5hbWUpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIjAuMiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQocHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Tm9ybWFsaXplZE5hbWUobmV3Tm9ybWFsaXplZE5hbWUpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TmFtZShwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0TmFtZVZhbGlkYXRpb25TdGFydFdpdGhOb25BbHBoYU51bWVyaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TmFtZSgiXzEwMDBBYiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChDT01QT05FTlRfVFlQRSk7CisJCXZhcmliYWxlcy5hZGQoImFiYnJldmlhdGVkIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVC5uYW1lKCksIHZhcmliYWxlcywgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0RnVsbE5hbWVJc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEZ1bGxOYW1lKCIiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoQ09NUE9ORU5UX1RZUEUpOworCQl2YXJpYmFsZXMuYWRkKCJmdWxsIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19PTkVfT0ZfQ09NUE9ORU5UX05BTUVTLm5hbWUoKSwgdmFyaWJhbGVzLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RGdWxsTmFtZUlzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRGdWxsTmFtZShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiMC4yIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Tm9ybWFsaXplZE5hbWUocHJvZHVjdC5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQocHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0RnVsbE5hbWUocHJvZHVjdC5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEZ1bGxOYW1lSGFzTWluTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEZ1bGxOYW1lKCJhc2RjIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIjAuMiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5vcm1hbGl6ZWROYW1lKHByb2R1Y3QuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJbnZhcmlhbnRVVUlEKHByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEZ1bGxOYW1lKHByb2R1Y3RSZXFEZXRhaWxzLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0RnVsbE5hbWVIYXNNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoIjEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamsiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiMC4yIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Tm9ybWFsaXplZE5hbWUocHJvZHVjdC5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQocHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0RnVsbE5hbWUocHJvZHVjdFJlcURldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RGdWxsTmFtZWxlc3NUaGFuTWluTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEZ1bGxOYW1lKCIxMjMiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoQ09NUE9ORU5UX1RZUEUpOworCQl2YXJpYmFsZXMuYWRkKCJmdWxsIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSC5uYW1lKCksIHZhcmliYWxlcywgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0RnVsbE5hbWVFeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RnVsbE5hbWUoIjEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamt4Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKENPTVBPTkVOVF9UWVBFKTsKKwkJdmFyaWJhbGVzLmFkZCgiZnVsbCIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEgubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJLy8gREUxOTM5NDcKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RGdWxsTmFtZVdpdGhTcGVjaWFsQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljaGFyIGludmFsaWRDaGFyc1tdID0geyAnficsICchJywgJyUnLCAnXicsICcqJywgJygnLCAnKScsICciJywgJ3snLCAnfScsICdbJywgJ10nLCAnPycsICc+JywgJzwnLCAnLycsICd8JywgJ1xcJywgJywnLCAnJCcsICcjJywgJ0AnLCAnKycgfTsKKwkJU3RyaW5nIGZ1bGxOYW1lID0gImF2Ym5nIjsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkQ2hhcnMubGVuZ3RoOyBpKyspIHsKKwkJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEZ1bGxOYW1lKGZ1bGxOYW1lICsgaW52YWxpZENoYXJzW2ldKTsKKwkJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJfQorCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RGdWxsTmFtZVZhbGlkQ2hhcmFjdGVyc0NoYXJhY3RlcnMwMSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRGdWxsTmFtZSgicXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwPGI+Qm9sZDw8L2I+Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIjAuMiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5vcm1hbGl6ZWROYW1lKHByb2R1Y3QuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJbnZhcmlhbnRVVUlEKHByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEZ1bGxOYW1lKCJxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBCb2xkJmx0OyIpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0RnVsbE5hbWVSZW1vdmVFeHRyYVNwYWNlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRGdWxsTmFtZSgiQWJiYWFhICBhMSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIwLjIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShwcm9kdWN0LmdldE5vcm1hbGl6ZWROYW1lKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0SW52YXJpYW50VVVJRChwcm9kdWN0LmdldEludmFyaWFudFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRGdWxsTmFtZSgiQWJiYWFhIGExIik7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3REZXNjcmlwdGlvbklzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24oIiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChDT01QT05FTlRfVFlQRSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04ubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKG51bGwpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3REZXNjcmlwdGlvblZhbGlkQ2hhcmFjdGVyczAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJ+IUAjJCVeJiooKV8rPD4/cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwIyIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXREZXNjcmlwdGlvbigifiFAIyQlXiZhbXA7KigpXysmbHQ7Jmd0Oz9xd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTAjIik7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uVmFsaWRDaGFyYWN0ZXJzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0RGVzY3JpcHRpb24oInF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MDxiPkJvbGQ8PC9iPiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXREZXNjcmlwdGlvbigicXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwQm9sZCZsdDsiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0RGVzY3JpcHRpb25JblZhbGlkQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigi157XlCIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChDT01QT05FTlRfVFlQRSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfREVTQ1JJUFRJT04ubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uUmVtb3ZlU3BhY2VzRnJvbUJlZ2lubmluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigiICAgYWJjZDEyMzQ1IGciKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0RGVzY3JpcHRpb24oImFiY2QxMjM0NSBnIik7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uUmVtb3ZlU3BhY2VzRnJvbVRoZUVuZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXREZXNjcmlwdGlvbigiYWJjZDEyMzQ1ICBnZGYgICAgICIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXREZXNjcmlwdGlvbigiYWJjZDEyMzQ1IGdkZiIpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3REZXNjcmlwdGlvbk1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqayBhYTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamsgYWExMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprIGFhMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqayBhYTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamsgYWExMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprIGFhMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqayBhYTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamsgYWExMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprIGFhMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZyI7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uRXhjZWVkTWF4TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICIwMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqayBhYTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamsgYWExMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprIGFhMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqayBhYTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamsgYWExMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprIGFhMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqayBhYTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamtsenhjdmJubTEyMzQ1Njc4OTBxd2VydHl1aW9wYXNkZmdoamsgYWExMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0xMjM0NTY3ODkwcXdlcnR5dWlvcGFzZGZnaGprIGFhMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZ2hqa2x6eGN2Ym5tMTIzNDU2Nzg5MHF3ZXJ0eXVpb3Bhc2RmZyI7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoQ09NUE9ORU5UX1RZUEUpOworCQl2YXJpYmFsZXMuYWRkKCIxMDI0Iik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0RFU0NSSVBUSU9OX0VYQ0VFRFNfTElNSVQubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdFRhZ0lzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KCIiKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKENPTVBPTkVOVF9UWVBFKTsKKwkJdmFyaWJhbGVzLmFkZCgidGFnIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdFRhZ0lzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKG51bGwpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRUYWdzKHByb2R1Y3QuZ2V0VGFncygpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0VGFnc05hbWVWYWxpZGF0aW9uUHJvZHVjdE5hbWVJc05vdEluVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdCgiQWJjIikpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX1RBR1NfTk9fQ09NUF9OQU1FLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFNpbmdsZVRhZ01heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2NzgiKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VGFncyhwcm9kdWN0UmVxRGV0YWlscy5nZXRUYWdzKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RTaW5nbGVUYWdFeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1Njc4OCIpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoIjUwIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULm5hbWUoKSwgdmFyaWJhbGVzLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RBbGxUYWdzTWF4TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCksICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwMSIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwMiIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwMyIsCisJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA0IiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA1IiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA2IiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjA3IiwKKwkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDgiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2OSIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxMCIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxMSIsCisJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjEyIiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjEzIiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjE0IiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjE1IiwKKwkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTYiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTciLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTgiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTkiLAorCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NSIpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRUYWdzKHByb2R1Y3RSZXFEZXRhaWxzLmdldFRhZ3MoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEFsbFRhZ3NFeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VGFncyhBcnJheXMuYXNMaXN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKSwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjAxIiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjAyIiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjAzIiwKKwkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDQiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDUiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDYiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MDciLAorCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYwOCIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTY5IiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjEwIiwgIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NjExIiwKKwkJCQkiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTIiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTMiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTQiLCAiQWJiYTEyMzQ1Njc4OTBhc2RmZ2hqa2wxMjN6eGN2Ym5tNDMyYXNkZmdoMTIzNDU2MTUiLAorCQkJCSJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxNiIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxNyIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxOCIsICJBYmJhMTIzNDU2Nzg5MGFzZGZnaGprbDEyM3p4Y3Zibm00MzJhc2RmZ2gxMjM0NTYxOSIsCisJCQkJIkFiYmExMjM0NTY3ODkwYXNkZmdoamtsMTIzenhjdmJubTQzMmFzZGZnaDEyMzQ1NiIpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWJhbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmliYWxlcy5hZGQoIjEwMjQiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfVEFHU19FWENFRURfTElNSVQubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdFRhZ3NEdXBsaWNhdGVUYWdSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCksICJLb0tvIiwgIktvS28iKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIHVwZGF0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFRhZ3MoQXJyYXlzLmFzTGlzdChwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCksICJLb0tvIikpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RDb250YWN0c0lzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q29udGFjdHMoQXJyYXlzLmFzTGlzdCgiIikpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChDT01QT05FTlRfVFlQRSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIHZhcmliYWxlcywgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0Q29udGFjdHNJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q29udGFjdHMobnVsbCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0Q29udGFjdHNJbnZhbGlkRm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QoImJ0NzUwMzQ1IikpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChDT01QT05FTlRfVFlQRSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIHZhcmliYWxlcywgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0Q29udmVydENvbnRhY3RzVG9Mb3dlckNhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q29udGFjdHMoQXJyYXlzLmFzTGlzdChwcm9kdWN0TWFuYWdlcjIuZ2V0VXNlcklkKCkudG9VcHBlckNhc2UoKSkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QocHJvZHVjdE1hbmFnZXIyLmdldFVzZXJJZCgpLnRvTG93ZXJDYXNlKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0Q29udGFjdHNOb3RBbGxvd2VkQXNkY1VzZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENvbnRhY3RzKEFycmF5cy5hc0xpc3QocHJvZHVjdFN0cmF0ZWdpc3RVc2VyMS5nZXRVc2VySWQoKSkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxLmdldFVzZXJJZCgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0RVQ1RfQ09OVEFDVC5uYW1lKCksIHZhcmliYWxlcywgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0Q29udGFjdHNOb3RBc2RjVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlTdHJpbmcgbm9uQXNkY1VzZXJVc2VySWQgPSAiYnQ1NjdoIjsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q29udGFjdHMoQXJyYXlzLmFzTGlzdChub25Bc2RjVXNlclVzZXJJZCkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChub25Bc2RjVXNlclVzZXJJZCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9QUk9EVUNUX0NPTlRBQ1QubmFtZSgpLCB2YXJpYmFsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCBQcm9kdWN0IGFuZCB2ZXJpZnkgdGhhdCBtZXRhZGF0YSBkaWRuJ3QgY2hhbmdlCisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdFByb2plY3RDb2RlSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRQcm9qZWN0Q29kZSgiIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19QUk9KRUNUX0NPREUubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0UHJvamVjdENvZGVJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0UHJvamVjdENvZGUobnVsbCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0UHJvamVjdENvZGUocHJvZHVjdC5nZXRQcm9qZWN0Q29kZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdFByb2plY3RDb2RlTGVzc1RoYW5NaW5DaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFByb2plY3RDb2RlKCI5ODcwIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9QUk9KRUNUX0NPREUubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IFByb2R1Y3QgYW5kIHZlcmlmeSB0aGF0IG1ldGFkYXRhIGRpZG4ndCBjaGFuZ2UKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0UHJvamVjdENvZGVIYXNuTWluQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geyAvLyBtaW4KKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyA9NQorCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRQcm9qZWN0Q29kZSgiOTg3MDAiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRQcm9qZWN0Q29kZShwcm9kdWN0UmVxRGV0YWlscy5nZXRQcm9qZWN0Q29kZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdFByb2plY3RDb2RlSGFzbk1heENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0UHJvamVjdENvZGUoIjEyMzQ1Njc4OTAiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRQcm9qZWN0Q29kZShwcm9kdWN0UmVxRGV0YWlscy5nZXRQcm9qZWN0Q29kZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdFByb2plY3RDb2RlRXhjZWVkTWF4Q2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24gey8vIE1heAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0xMAorCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRQcm9qZWN0Q29kZSgiMTIzNDU2Nzg5MDEiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ERS5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRQcm9qZWN0Q29kZShwcm9kdWN0LmdldFByb2plY3RDb2RlKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0UHJvamVjdENvZGVJc05vdE51bWVyaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTWF4ID0xMAorCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRQcm9qZWN0Q29kZSgiMTIzNGEiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ERS5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRQcm9qZWN0Q29kZShwcm9kdWN0LmdldFByb2plY3RDb2RlKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0SWNvbklzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0SWNvbigiIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKENPTVBPTkVOVF9UWVBFKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLm5hbWUoKSwgdmFyaWFibGVzLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJY29uKHByb2R1Y3QuZ2V0SWNvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEljb25Jc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0SWNvbihudWxsKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQkvLyBHZXQgUHJvZHVjdCBhbmQgdmVyaWZ5IHRoYXQgbWV0YWRhdGEgZGlkbid0IGNoYW5nZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJY29uKHByb2R1Y3QuZ2V0SWNvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEljb25NYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0SWNvbigiQV9hLTEtMi0tYl9fQkIxMjM0NTY3ODkwQSIpOyAvLyBNYXggbGVuZ3RoID0KKwkJCQkJCQkJCQkJCQkJCQkvLyAyNQorCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEljb24ocHJvZHVjdFJlcURldGFpbHMuZ2V0SWNvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEljb25FeGNlZWRNYXhMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0SWNvbigiQV9hLTEtMi0tYl9fQkIxMjM0NTY3ODkwQV8iKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwgdXBkYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhcmlhYmxlcy5hZGQoQ09NUE9ORU5UX1RZUEUpOworCQl2YXJpYWJsZXMuYWRkKCIyNSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JQ09OX0VYQ0VFRFNfTElNSVQubmFtZSgpLCB2YXJpYWJsZXMsIHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEljb24ocHJvZHVjdC5nZXRJY29uKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0SWNvbkluVmFsaWRDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCVN0cmluZyBpY29uID0gImFzZGZnIjsgLy8gQWxsb3dlZCBjaGFyYWN0ZXJzIFthLXpBLVowLTldLCBkYXNoICjigJgt4oCYKSwKKwkJCQkJCQkJLy8gdW5kZXJzY29yZSAo4oCYX+KAmSkuCisJCWNoYXIgaW52YWxpZENoYXJzW10gPSB7ICd+JywgJyEnLCAnJCcsICclJywgJ14nLCAnKicsICcoJywgJyknLCAnIicsICd7JywgJ30nLCAnWycsICddJywgJz8nLCAnPicsICc8JywgJy8nLCAnfCcsICdcXCcsICcsJyB9OworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkQ2hhcnMubGVuZ3RoOyBpKyspIHsKKwkJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEljb24oaWNvbiArIGludmFsaWRDaGFyc1tpXSk7CisJCQl1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQl2YXJpYWJsZXMuYWRkKENPTVBPTkVOVF9UWVBFKTsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfSUNPTi5uYW1lKCksIHZhcmlhYmxlcywgdXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpKTsKKwkJfQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJY29uKHByb2R1Y3QuZ2V0SWNvbigpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdElzQWN0aXZlSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRBY3RpdmUoIiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldElzQWN0aXZlKGZhbHNlKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdElzQWN0aXZlSXNUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEFjdGl2ZSgidHJ1ZSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldElzQWN0aXZlKHRydWUpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0SXNBY3RpdmVJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdChkZWZhdWx0Q2F0ZWdvcmllcyk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEFjdGl2ZSgidHJ1ZSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IHByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldEFjdGl2ZShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0KTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VmVyc2lvbihwcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJc0FjdGl2ZSh0cnVlKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdElzQWN0aXZlSXNGYWxzZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRBY3RpdmUoImZhbHNlIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdC5nZXRWZXJzaW9uKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0SXNBY3RpdmUoZmFsc2UpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0SXNBY3RpdmVIYXNJbnZhbGlkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUHJvZHVjckJ5UFNBbmRDaGVja0luKCk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlID0gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0QWN0aXZlKCJlZWVlZSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULCB1cGRhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCB1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsIHVwZGF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFByb2R1Y3QpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRWZXJzaW9uKHByb2R1Y3QuZ2V0VmVyc2lvbigpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUHJvZHVjdExpZmVDeWNsZSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gYWRkU2Vjb25kR3JvdXBpbmdUb0RlZmF1bHRDYXRlZ29yeSA9IGFkZFNlY29uZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkoKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q2F0ZWdvcmllcyhhZGRTZWNvbmRHcm91cGluZ1RvRGVmYXVsdENhdGVnb3J5KTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLnVwZGF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVByb2R1Y3QpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZChwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHByb2R1Y3RNYW5hZ2VyMS5nZXRGdWxsTmFtZSgpKTsKKwkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHVwZGF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCAiMC4yIiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFVVSUQocHJvZHVjdC5nZXRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0SW52YXJpYW50VVVJRChwcm9kdWN0LmdldEludmFyaWFudFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRDYXRlZ29yaWVzKHByb2R1Y3RSZXFEZXRhaWxzLmdldENhdGVnb3JpZXMoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkPWZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RBc3NvY2lhdGlvbnMwMigpIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gYWRkU2Vjb25kR3JvdXBpbmdUb0RlZmF1bHRDYXRlZ29yeSA9IGFkZFNlY29uZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkoKTsgLy8gQ2F0ZWdvcnkxLT5TdWJjYXRlZ29yeTEtPltHcm91cGluZzEsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBHcm91cGluZzExXQorCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KGFkZFNlY29uZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlQcm9kdWN0IHByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBkZWZhdWx0Q2F0ZWdvcnkgPSBhZGRTdWJjYXRlZ29yeUFuZEdyb3VwaW5nVG9EZWZhdWx0Q2F0ZWdvcnkoKTsgLy8gQ2F0ZWdvcnkxLT5bU3ViY2F0ZWdvcnkxLT5bR3JvdXBpbmcxLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIEdyb3VwaW5nMTFdLFN1YmNhdGVnb3J5Mi0+W0dyb3VwaW5nMTJdXQorCQlwcm9kdWN0UmVxRGV0YWlscy5zZXRDYXRlZ29yaWVzKGRlZmF1bHRDYXRlZ29yeSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIjAuMiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQocHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Q2F0ZWdvcmllcyhwcm9kdWN0UmVxRGV0YWlscy5nZXRDYXRlZ29yaWVzKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Tm9ybWFsaXplZE5hbWUocHJvZHVjdFJlcURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZD1mYWxzZSkKKwlwdWJsaWMgdm9pZCB1cGRhdGVQcm9kdWN0UmVtb3ZlQWxsQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBkZWZhdWx0Q2F0ZWdvcnkgPSBuZXcgQXJyYXlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4oKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0Q2F0ZWdvcmllcyhkZWZhdWx0Q2F0ZWdvcnkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdCA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUHJvZHVjdCk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldExhc3RVcGRhdGVyRnVsbE5hbWUocHJvZHVjdE1hbmFnZXIxLmdldEZ1bGxOYW1lKCkpOworCQlQcm9kdWN0IGFjdHVhbFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIodXBkYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocHJvZHVjdFJlcURldGFpbHMsICIwLjIiLCBwcm9kdWN0TWFuYWdlcjEpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRJbnZhcmlhbnRVVUlEKHByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldENhdGVnb3JpZXMocHJvZHVjdFJlcURldGFpbHMuZ2V0Q2F0ZWdvcmllcygpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5vcm1hbGl6ZWROYW1lKHByb2R1Y3RSZXFEZXRhaWxzLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIENvbXBvbmVudE9wZXJhdGlvbkVudW0uVVBEQVRFX0NPTVBPTkVOVCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQ9ZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvZHVjdEFzc29jaWF0aW9uc0NhdGVnb3R5SXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVByb2R1Y3JCeVBTQW5kQ2hlY2tJbigpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VW5pcXVlSWQocHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0VVVJRChwcm9kdWN0LmdldFVVSUQoKSk7CisJCXByb2R1Y3RSZXFEZXRhaWxzLnNldENhdGVnb3JpZXMobnVsbCk7Ly8gcHJvZHVjdCBjYXRlZ29yaWVzIHdpbGwgbm90IGJlCisJCQkJCQkJCQkJCQkvLyB1cGRhdGVkCisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlQcm9kdWN0UmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpKTsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShwcm9kdWN0TWFuYWdlcjEuZ2V0RnVsbE5hbWUoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcih1cGRhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihwcm9kdWN0UmVxRGV0YWlscywgIjAuMiIsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRVVUlEKHByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQocHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Q2F0ZWdvcmllcyhwcm9kdWN0LmdldENhdGVnb3JpZXMoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShwcm9kdWN0UmVxRGV0YWlscy5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLlVQREFURV9DT01QT05FTlQpOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2R1Y3RXaXRoQ2F0ZWdvcmllcyhMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnlEZWZpbml0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gKGNhdGVnb3J5RGVmaW5pdGlvbnMgIT0gbnVsbCA/IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KGNhdGVnb3J5RGVmaW5pdGlvbnMpIDogRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsIGNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgYWN0dWFsUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlTdHJpbmcgYWN0dWFsVXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHByb2R1Y3RSZXFEZXRhaWxzLCBJTklUSUFMX1BST0RVQ1RfVkVSU0lPTiwgcHJvZHVjdE1hbmFnZXIxKTsKKwkJU3RyaW5nIG5vcm1hbGl6ZWROYW1lRm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgIm5vcm1hbGl6ZWROYW1lIik7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShub3JtYWxpemVkTmFtZUZvbUpzb25SZXNwb25zZSk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoZXhwZWN0ZWRQcm9kdWN0LCBhY3R1YWxQcm9kdWN0LCBDb21wb25lbnRPcGVyYXRpb25FbnVtLkNSRUFURV9DT01QT05FTlQpOworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGV4cGVjdGVkUHJvZHVjdCwgQ1JFQVRFX0FVRElUX0FDVElPTiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuQ1JFQVRFRCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgIjAuMSIsIG51bGwsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIGFjdHVhbFV1aWQpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIENSRUFURV9BVURJVF9BQ1RJT04pOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9kdWNyQnlQU0FuZENoZWNrSW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdChkZWZhdWx0Q2F0ZWdvcmllcyk7CisJCWNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVQcm9kdWN0KTsKKwkJcHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVQcm9kdWN0LmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tJbnZhcmlhbnRVdWlkSXNJbW11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlTdHJpbmcgaW52YXJpYW50VXVpZERlZmluZWRCeVVzZXIgPSAiISEhISEhISEhISEhISEhISEhISEhISEhIjsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVdWlkRGVmaW5lZEJ5VXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShjcmVhdGVQcm9kdWN0LCAiY3JlYXRlIHJlcXVlc3QgZmFpbGVkIiwgZmFsc2UsIDIwMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwgY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUHJvZHVjdCBQcm9kdWN0Q3JlYXRpb24gPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UHJvZHVjdFJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEY3JlYXRpb24gPSBQcm9kdWN0Q3JlYXRpb24uZ2V0SW52YXJpYW50VVVJRCgpOworCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlcyA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRQcm9kdWN0UmVzKTsKKwkJUHJvZHVjdCBwcm9kdWN0R2V0dGluZyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRQcm9kdWN0UmVzcG9uc2VUb0phdmFPYmplY3QoZ2V0UHJvZHVjdFJlcy5nZXRSZXNwb25zZSgpKTsKKwkJU3RyaW5nIGludmFyaWFudFVVSURnZXR0aW5nID0gcHJvZHVjdEdldHRpbmcuZ2V0SW52YXJpYW50VVVJRCgpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEZ2V0dGluZyk7CisKKwkJLy8gVXBkYXRlIFByb2R1Y3Qgd2l0aCBuZXcgaW52YXJpYW50IFVVSUQKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZVVwZGF0ZSA9IFByb2R1Y3RSZXN0VXRpbHMudXBkYXRlUHJvZHVjdChwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlVXBkYXRlKTsKKwkJUHJvZHVjdCB1cGRhdGVkUHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRQcm9kdWN0UmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlVXBkYXRlLmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRHVwZGF0aW5nID0gdXBkYXRlZFByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEdXBkYXRpbmcpOworCisJCS8vIERvIGNoZWNraW4KKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZUNoZWNraW4gPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZUNoZWNraW4pOworCQlQcm9kdWN0IGNoZWNraW5Qcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFByb2R1Y3RSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2VDaGVja2luLmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRGNoZWNraW4gPSBjaGVja2luUHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCVN0cmluZyB2ZXJzaW9uID0gY2hlY2tpblByb2R1Y3QuZ2V0VmVyc2lvbigpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEY2hlY2tpbik7CisJCWFzc2VydEVxdWFscyh2ZXJzaW9uLCAiMC4xIik7CisKKwkJLy8gRG8gY2hlY2tvdXQKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZUNoZWNrb3V0ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0UmVxRGV0YWlscywgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlQ2hlY2tvdXQpOworCQlQcm9kdWN0IGNoZWNrb3V0UHJvZHVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRQcm9kdWN0UmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlQ2hlY2tvdXQuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEY2hlY2tvdXQgPSBjaGVja291dFByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpOworCQl2ZXJzaW9uID0gY2hlY2tvdXRQcm9kdWN0LmdldFZlcnNpb24oKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgaW52YXJpYW50VVVJRGNoZWNrb3V0KTsKKwkJYXNzZXJ0RXF1YWxzKHZlcnNpb24sICIwLjIiKTsKKworCX0KKworCS8vIFVTNjcyMTI5IEJlbm55CisJcHJpdmF0ZSB2b2lkIGdldFByb2R1Y3RWYWxpZGF0ZUludmFyaWFudFV1aWQoU3RyaW5nIHByb2R1Y3RVbmlxdWVJZCwgU3RyaW5nIGludmFyaWFudFVVSURjcmVhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KHByb2R1Y3RVbmlxdWVJZCwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGdldFByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQoZ2V0UHJvZHVjdCkpOworCX0KKworCUBUZXN0IC8vIGludmFyaWFudFVVSUQgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBjcmVhdGVkIGFuZCBuZXZlcgorCQkJLy8gY2hhbmdlZAorCXB1YmxpYyB2b2lkIHByb2R1Y3RJbnZhcmlhbnRVdWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3RSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoKTsKKwkJU3RyaW5nIGludmFyaWFudFV1aWREZWZpbmVkQnlVc2VyID0gIjEyMzQ1IjsKKwkJcHJvZHVjdFJlcURldGFpbHMuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVdWlkRGVmaW5lZEJ5VXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVELCBjcmVhdGVQcm9kdWN0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBpbnZhcmlhbnRVVUlEIGdlbmVyYXRlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgY3JlYXRlZCBhbmQgbmV2ZXIKKwkJLy8gY2hhbmdlZAorCQlTdHJpbmcgaW52YXJpYW50VVVJRGNyZWF0aW9uID0gUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChjcmVhdGVQcm9kdWN0KTsKKwkJZ2V0UHJvZHVjdFZhbGlkYXRlSW52YXJpYW50VXVpZChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCQkvLyBVcGRhdGUgUHJvZHVjdCB3aXRoIG5ldyBpbnZhcmlhbnQgVVVJRAorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy51cGRhdGVQcm9kdWN0KHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldFByb2R1Y3RWYWxpZGF0ZUludmFyaWFudFV1aWQocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKwkJLy8gQ2hlY2tpbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpKTsKKwkJZ2V0UHJvZHVjdFZhbGlkYXRlSW52YXJpYW50VXVpZChwcm9kdWN0UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCQkvLyBDaGVja291dAorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3RSZXFEZXRhaWxzLCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFByb2R1Y3RWYWxpZGF0ZUludmFyaWFudFV1aWQocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBVbkRvLUNoZWNrT3V0CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdFJlcURldGFpbHMsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5VTkRPQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFByb2R1Y3RWYWxpZGF0ZUludmFyaWFudFV1aWQocHJvZHVjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0R2V0Rm9sbG93ZWRUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RHZXRGb2xsb3dlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWJlYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0R2V0Rm9sbG93ZWRUZXN0LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvZHVjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlByb2R1Y3RWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgUHJvZHVjdEdldEZvbGxvd2VkVGVzdCBleHRlbmRzIFByb2R1Y3RCYXNlVGVzdCB7CisKKwlwcm90ZWN0ZWQgUHJvZHVjdCBwcm9kdWN0MjAwOworCXByb3RlY3RlZCBQcm9kdWN0IHByb2R1Y3Q0MDA7CisKKwlwcml2YXRlIFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3REZXRhaWxzMjAwOworCXByaXZhdGUgUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdERldGFpbHM0MDA7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIFByb2R1Y3RHZXRGb2xsb3dlZFRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIFByb2R1Y3RHZXRGb2xsb3dlZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVQcm9kdWN0cygpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZm9sbG93ZWRQYWdlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBBY3Rpb25zCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VMaWZlQ3ljbGVSZXNwb25zZTsKKwkJY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdDIwMCwgcHJvZHVjdE1hbmFnZXIxLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UpOworCQljaGFuZ2VMaWZlQ3ljbGVSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0NDAwLCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VMaWZlQ3ljbGVSZXNwb25zZSk7CisJCS8vIEV4cGVjdGVkIHVzZXJzIEZvbGxvd2VkIHBhZ2UKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jaGVja1VzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdE1hbmFnZXIxLCBwcm9kdWN0MjAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKHByb2R1Y3RNYW5hZ2VyMSwgcHJvZHVjdDQwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY2hlY2tVc2VyRm9sbG93ZWRQYWdlKHByb2R1Y3RNYW5hZ2VyMiwgcHJvZHVjdDQwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0TWFuYWdlcjIsIHByb2R1Y3QyMDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UoYWRtaW5Vc2VyLCBwcm9kdWN0MjAwLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKGRlc2lnbmVyVXNlciwgcHJvZHVjdDIwMCwgcHJvZHVjdDQwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxLCBwcm9kdWN0MjAwLCBwcm9kdWN0NDAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZvbGxvd2VkUGFnZVBtQ2hlY2tlZE91dFByb2R1Y3RXYXNDaGVja0luQnlPdGhlclBtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0MjAwLCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0NDAwLCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0NDAwLCBwcm9kdWN0TWFuYWdlcjEsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdDIwMCwgcHJvZHVjdE1hbmFnZXIyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZUxpZmVDeWNsZVJlc3BvbnNlKTsKKworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNoZWNrVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0TWFuYWdlcjEsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdE1hbmFnZXIyLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKGFkbWluVXNlciwgcHJvZHVjdDIwMCwgcHJvZHVjdDQwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShkZXNpZ25lclVzZXIsIHByb2R1Y3QyMDAsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdFN0cmF0ZWdpc3RVc2VyMSwgcHJvZHVjdDIwMCwgcHJvZHVjdDQwMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmb2xsb3dlZFBhZ2VQbUNoZWNrSW5Qcm9kdWN0MDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QyMDAsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3Q0MDAsIHByb2R1Y3RNYW5hZ2VyMiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNoZWNrVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0TWFuYWdlcjEsIHByb2R1Y3QyMDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdE1hbmFnZXIxLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy5jaGVja1VzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdE1hbmFnZXIyLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKHByb2R1Y3RNYW5hZ2VyMiwgcHJvZHVjdDIwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShhZG1pblVzZXIsIHByb2R1Y3QyMDAsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UoZGVzaWduZXJVc2VyLCBwcm9kdWN0MjAwLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKHByb2R1Y3RTdHJhdGVnaXN0VXNlcjEsIHByb2R1Y3QyMDAsIHByb2R1Y3Q0MDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZm9sbG93ZWRQYWdlQWRtaW5DaGVja291dFByb2R1Y3RXYXNDaGVja2VkaW5CeVBtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0NDAwLCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VMaWZlQ3ljbGVSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0NDAwLCBhZG1pblVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UpOworCisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY2hlY2tVc2VyRm9sbG93ZWRQYWdlKHByb2R1Y3RNYW5hZ2VyMSwgcHJvZHVjdDIwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0TWFuYWdlcjEsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdE1hbmFnZXIyLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKGFkbWluVXNlciwgcHJvZHVjdDIwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShkZXNpZ25lclVzZXIsIHByb2R1Y3QyMDAsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdFN0cmF0ZWdpc3RVc2VyMSwgcHJvZHVjdDIwMCwgcHJvZHVjdDQwMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmb2xsb3dlZFBhZ2VBZG1pbkNoZWNrSW5Qcm9kdWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0NDAwLCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0NDAwLCBhZG1pblVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RMaWZlQ3ljbGUocHJvZHVjdDQwMCwgYWRtaW5Vc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UpOworCisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMuY2hlY2tVc2VyRm9sbG93ZWRQYWdlKHByb2R1Y3RNYW5hZ2VyMSwgcHJvZHVjdDIwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0TWFuYWdlcjEsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdE1hbmFnZXIyLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKGFkbWluVXNlciwgcHJvZHVjdDIwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShkZXNpZ25lclVzZXIsIHByb2R1Y3QyMDAsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UocHJvZHVjdFN0cmF0ZWdpc3RVc2VyMSwgcHJvZHVjdDIwMCwgcHJvZHVjdDQwMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmb2xsb3dlZFBhZ2VQbUNoZWNrb3V0UHJvZHVjdFdhc0NoZWNrZWRpbkJ5QWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QyMDAsIHByb2R1Y3RNYW5hZ2VyMSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3Q0MDAsIHByb2R1Y3RNYW5hZ2VyMiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0TGlmZUN5Y2xlKHByb2R1Y3QyMDAsIGFkbWluVXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0MjAwLCBhZG1pblVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VMaWZlQ3ljbGVSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdExpZmVDeWNsZShwcm9kdWN0MjAwLCBwcm9kdWN0TWFuYWdlcjIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UpOworCisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0TWFuYWdlcjEsIHByb2R1Y3QyMDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNoZWNrVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0TWFuYWdlcjIsIHByb2R1Y3QyMDAsIHByb2R1Y3Q0MDApOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLnZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UoYWRtaW5Vc2VyLCBwcm9kdWN0MjAwLCBwcm9kdWN0NDAwKTsKKwkJUHJvZHVjdFZhbGlkYXRpb25VdGlscy52ZXJpZnlQcm9kdWN0c05vdEV4aXN0SW5Vc2VyRm9sbG93ZWRQYWdlKGRlc2lnbmVyVXNlciwgcHJvZHVjdDIwMCwgcHJvZHVjdDQwMCk7CisJCVByb2R1Y3RWYWxpZGF0aW9uVXRpbHMudmVyaWZ5UHJvZHVjdHNOb3RFeGlzdEluVXNlckZvbGxvd2VkUGFnZShwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxLCBwcm9kdWN0MjAwLCBwcm9kdWN0NDAwKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlUHJvZHVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gUE0xIChQcm9kdWN0IG1hbmFnZXIpIGNyZWF0ZSA6UFIyMDAgKGNoZWNrIEluIFN0YXRlKQorCQkvLyBQTTIgKFByb2R1Y3QgbWFuYWdlcikgY3JlYXRlIDpQUjQwMCAoY2hlY2sgSW4gU3RhdGUpCisKKwkJcHJvZHVjdERldGFpbHMyMDAgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgiQ2lQcm9kMjAwIiwgZGVmYXVsdENhdGVnb3JpZXMpOworCQlwcm9kdWN0RGV0YWlsczQwMCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCJDaVByb2Q0MDAiLCBkZWZhdWx0Q2F0ZWdvcmllcyk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QocHJvZHVjdERldGFpbHMyMDAsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdCk7CisJCXByb2R1Y3QyMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKworCQljcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3REZXRhaWxzNDAwLCBwcm9kdWN0TWFuYWdlcjIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVByb2R1Y3QpOworCQlwcm9kdWN0NDAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RMaWZlY3ljbGVUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RMaWZlY3ljbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzNDA5MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdExpZmVjeWNsZVRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb2R1Y3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlByb2R1Y3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlByb2R1Y3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2R1Y3RMaWZlY3ljbGVUZXN0IGV4dGVuZHMgUHJvZHVjdEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLSU5fQUNUSU9OID0gIkNoZWNraW4iOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLT1VUX0FDVElPTiA9ICJDaGVja291dCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19DSEVDS09VVF9BQ1RJT04gPSAiVW5kb0NoZWNrb3V0IjsKKworCXByb3RlY3RlZCBQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdDsKKworCXB1YmxpYyBQcm9kdWN0TGlmZWN5Y2xlVGVzdChUZXN0TmFtZSB0ZXN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQlzdXBlcih0ZXN0TmFtZSwgY2xhc3NOYW1lKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9kdWN0UmVxRGV0YWlscyBkZWZhdWx0UHJvZHVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KGRlZmF1bHRDYXRlZ29yaWVzKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QgPSBQcm9kdWN0UmVzdFV0aWxzLmNyZWF0ZVByb2R1Y3QoZGVmYXVsdFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdCIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwgY3JlYXRlUHJvZHVjdC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0VGVzdEJhc2UuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdFRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5ZGJiOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdFRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGoubGY1LnV0aWwuUmVzb3VyY2VVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9kdWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5BcnRpZmFjdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUHJvZHVjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworCitwdWJsaWMgY2xhc3MgUHJvZHVjdFRlc3RCYXNlIGV4dGVuZHMgUHJvZHVjdEJhc2VUZXN0IHsKKworCXB1YmxpYyBQcm9kdWN0VGVzdEJhc2UoVGVzdE5hbWUgdGVzdE5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJc3VwZXIodGVzdE5hbWUsIGNsYXNzTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyBkb3dubG9hZFJlc291cmNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jVXNlckRldGFpbHM7CisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzOworCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0RGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VVdGlscyByZXNvdXJjZVV0aWxzOworCXByb3RlY3RlZCBBcnRpZmFjdFV0aWxzIGFydGlmYWN0VXRpbHM7CisJcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOworCXByb3RlY3RlZCBTZXJ2aWNlIHNlcnZpY2U7CisJcHJvdGVjdGVkIFByb2R1Y3QgcHJvZHVjdDsKKworCS8vIHByb3RlY3RlZCBzdGF0aWMgU2VydmljZVV0aWxzIHNlcnZpY2VVdGlscyA9IG5ldyBTZXJ2aWNlVXRpbHMoKTsKKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlpbml0aWFsaXplTWVtYmVycygpOworCQljcmVhdGVDb21wb25lbnRzKCk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplTWVtYmVycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlkb3dubG9hZFJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCXNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoKTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShkb3dubG9hZFJlc291cmNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgiY3JlYXRlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkJYXNzZXJ0Tm90TnVsbCgicmVzb3VyY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCBkb3dubG9hZFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlyZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLAorCQkJCWRvd25sb2FkUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKCJhZGQgSEVBVCBhcnRpZmFjdCB0byByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKworCQkvLyBjZXJ0aWZpZWQgcmVzb3VyY2UKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVJlc291cmNlKGRvd25sb2FkUmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2VydGlmeSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGRvd25sb2FkUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkOiAiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQkvLyBhZGQgcmVzb3VyY2UgaW5zdGFuY2Ugd2l0aCBIRUFUIGRlcGxveW1lbnQgYXJ0aWZhY3QgdG8gdGhlIHNlcnZpY2UKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0Q29tcG9uZW50VWlkKGRvd25sb2FkUmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMSwgcmV0dXJuZWQ6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKworCQkvLyBjZXJ0aWZpZWQgc2VydmljZQorCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscyk7CisJCWFzc2VydFRydWUoImNlcnRpZnkgc2VydmljZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKworCQlyZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZDogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJUHJvZHVjdFJlcURldGFpbHMgZGVmYXVsdFByb2R1Y3QgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdChkZWZhdWx0Q2F0ZWdvcmllcyk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0ID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KGRlZmF1bHRQcm9kdWN0LCBwcm9kdWN0U3RyYXRlZ2lzdFVzZXIxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0IiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVELAorCQkJCWNyZWF0ZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUHJvZHVjdC5nZXRSZXNwb25zZSgpLCBQcm9kdWN0LmNsYXNzKTsKKworCQkvLyBhZGQgc2VydmljZSBpbnN0YW5jZSB0byBwcm9kdWN0CisJCS8vCisKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9wcm9kdWN0L1Byb2R1Y3RUb3NjYVlhbWxHZW5lcmF0aW9uVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0VG9zY2FZYW1sR2VuZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTJlNmZkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0VG9zY2FZYW1sR2VuZXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3RVaURvd25sb2FkRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EZWNvZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgUHJvZHVjdFRvc2NhWWFtbEdlbmVyYXRpb25UZXN0IGV4dGVuZHMgUHJvZHVjdFRlc3RCYXNlIHsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgUHJvZHVjdFRvc2NhWWFtbEdlbmVyYXRpb25UZXN0KCkgeworCQlzdXBlcihuYW1lLCBQcm9kdWN0VG9zY2FZYW1sR2VuZXJhdGlvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2R1Y3RUb3NjYVlhbWxGb3JtYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVN0cmluZyBoZWF0RW52QXJ0aWZhY3RIZWFkZXIgPSAoU3RyaW5nKSBVdGlscy5wYXJzZVlhbWxDb25maWcoImhlYXRFbnZBcnRpZmFjdEhlYWRlciIpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXRFbnZBcnRpZmFjdEhlYWRlciA9IFxuIiArCisJCS8vIGhlYXRFbnZBcnRpZmFjdEhlYWRlcik7CisKKwkJU3RyaW5nIGhlYXRFbnZBcnRpZmFjdEZvb3RlciA9IChTdHJpbmcpIFV0aWxzLnBhcnNlWWFtbENvbmZpZygiaGVhdEVudkFydGlmYWN0Rm9vdGVyIik7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGVhdEVudkFydGlmYWN0Rm9vdGVyID0gXG4iICsKKwkJLy8gaGVhdEVudkFydGlmYWN0Rm9vdGVyKTsKKworCQkvLyB0ZW1wb3JhcnkgY29tbWVudGVkCisJCS8vIFJlc3RSZXNwb25zZSBkb3dubG9hZFJlc291cmNlSW5zdGFuY2VIZWF0QXJ0aWZhY3QgPQorCQkvLyBBcnRpZmFjdFJlc3RVdGlscy5kb3dubG9hZFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdChzZXJ2aWNlLmdldFVuaXF1ZUlkKCksCisJCS8vIHJlc291cmNlSW5zdGFuY2VJZCwgc2RuY1VzZXJEZXRhaWxzLAorCQkvLyBoZWF0QXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkvLyBhc3NlcnRUcnVlKCJleHBlY3RlZCByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgMjAwICsgIiwgYWN0dWFsOiAiICsKKwkJLy8gZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlSGVhdEFydGlmYWN0LmdldEVycm9yQ29kZSgpLAorCQkvLyBkb3dubG9hZFJlc291cmNlSW5zdGFuY2VIZWF0QXJ0aWZhY3QuZ2V0RXJyb3JDb2RlKCk9PTIwMCk7CisKKwkJLy8gSW5wdXRTdHJlYW0gc3RyZWFtID0KKwkJLy8gZ2V0RGVjb2RlZFN0ZXJhbUZyb21TdHJpbmcoZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlSGVhdEFydGlmYWN0LmdldFJlc3BvbnNlKCkpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oVXRpbHMuZ2V0UGFyYW1WYWx1ZUZyb21ZYW1sQnlLZXkoc3RyZWFtLAorCQkvLyAiZGVzY3JpcHRpb24iLCBTdHJpbmcuY2xhc3MpKTsKKworCQkvLyBub2RlX3R5cGVzCisKKwl9CisKKwlwcml2YXRlIElucHV0U3RyZWFtIGdldERlY29kZWRTdGVyYW1Gcm9tU3RyaW5nKFN0cmluZyBlbmNvZGVkNjRQYXlsb2FkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCUFydGlmYWN0VWlEb3dubG9hZERhdGEgYXJ0aWZhY3RVaURvd25sb2FkRGF0YSA9IGdzb24uZnJvbUpzb24oZW5jb2RlZDY0UGF5bG9hZCwgQXJ0aWZhY3RVaURvd25sb2FkRGF0YS5jbGFzcyk7CisJCVN0cmluZyBkZWNvZGVkUGF5bG9hZCA9IERlY29kZXIuZGVjb2RlKGFydGlmYWN0VWlEb3dubG9hZERhdGEuZ2V0QmFzZTY0Q29udGVudHMoKSk7CisJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGVjb2RlZFBheWxvYWQuZ2V0Qnl0ZXMoKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdFVuZG9DaGVja291dFRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb2R1Y3QvUHJvZHVjdFVuZG9DaGVja291dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJmYjYyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvZHVjdC9Qcm9kdWN0VW5kb0NoZWNrb3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFByb2R1Y3RBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5Db252ZXJ0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BdWRpdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlByb2R1Y3RWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBQcm9kdWN0VW5kb0NoZWNrb3V0VGVzdCBleHRlbmRzIFByb2R1Y3RMaWZlY3ljbGVUZXN0IHsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RhdGljSW5pdCgpIHsKKwkJYXVkaXRBY3Rpb24gPSBVTkRPX0NIRUNLT1VUX0FDVElPTjsKKwkJb3BlcmF0aW9uID0gQ29tcG9uZW50T3BlcmF0aW9uRW51bS5DSEFOR0VfU1RBVEVfVU5ET19DSEVDS09VVDsKKwl9CisKKwlwdWJsaWMgUHJvZHVjdFVuZG9DaGVja291dFRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIFByb2R1Y3RVbmRvQ2hlY2tvdXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1bmRvQ2hlY2tPdXRQcm9kdWN0QnlQbSgpIHRocm93cyBFeGNlcHRpb24geworCQl1bmRvQ2hlY2tPdXRQcm9kdWN0U3VjY2Vzcyhwcm9kdWN0TWFuYWdlcjEsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVuZG9DaGVja091dFByb2R1Y3RCeUFkbWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVuZG9DaGVja091dFByb2R1Y3RTdWNjZXNzKGFkbWluVXNlciwgdHJ1ZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1bmRvQ2hlY2tPdXRBZnRlckNyZWF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uVU5ET0NIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVuZG8gY2hlY2tvdXQgcHJvZHVjdCIsIDIwMCwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gVmVyaWZ5IHZlcnNpb24gd2FzIHJlbW92ZWQKKwkJbGNzUmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0LmdldFVuaXF1ZUlkKCksIHByb2R1Y3RNYW5hZ2VyMS5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgdW5kb25lIHByb2R1Y3QiLCA0MDQsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVByb2R1Y3QgZW1wdHlQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGxjc1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCQlhc3NlcnROdWxsKGVtcHR5UHJvZHVjdCk7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihlbXB0eVByb2R1Y3QsCisJCQkJYXVkaXRBY3Rpb24sIHByb2R1Y3RNYW5hZ2VyMSwgQWN0aW9uU3RhdHVzLk9LLCAiMC4xIiwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXRQcm9kdWN0KGV4cGVjdGVkUHJvZHVjdEF1ZGl0LCBhdWRpdEFjdGlvbik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVuZG9DaGVja091dE5vdEV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBub3RFeGlzdElkID0gIjEyMzQiOworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQobm90RXhpc3RJZCk7CisJCVJlc3RSZXNwb25zZSBsY3NSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUoZXhwZWN0ZWRQcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5VTkRPQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdW5kbyBjaGVja291dCBwcm9kdWN0IiwgNDA0LCBsY3NSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldE5hbWUobm90RXhpc3RJZCk7CisJCVN0cmluZ1tdIGF1ZGl0UGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5FTVBUWV9TVFJJTkcgfTsKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgZXhwZWN0ZWRQcm9kdWN0QXVkaXQgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGV4cGVjdGVkUHJvZHVjdCwKKwkJCQlhdWRpdEFjdGlvbiwgcHJvZHVjdE1hbmFnZXIxLCBBY3Rpb25TdGF0dXMuUFJPRFVDVF9OT1RfRk9VTkQsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsCisJCQkJQ29uc3RhbnRzLkVNUFRZX1NUUklORywgbnVsbCwgbnVsbCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgYXVkaXRQYXJhbWV0ZXJzKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0QXVkaXQsIGF1ZGl0QWN0aW9uKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdW5kb0NoZWNrT3V0Tm90SW5DaGVja291dCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja2luIHByb2R1Y3QiLCAyMDAsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxjc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlVORE9DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1bmRvIGNoZWNrb3V0IHByb2R1Y3QiLCA0MDksIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZ1tdIGF1ZGl0UGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbXSB7IGV4cGVjdGVkUHJvZHVjdC5nZXROYW1lKCksICJwcm9kdWN0IiwgcHJvZHVjdE1hbmFnZXIxLmdldEZpcnN0TmFtZSgpLAorCQkJCXByb2R1Y3RNYW5hZ2VyMS5nZXRMYXN0TmFtZSgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0VXNlcklkKCkgfTsKKworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBleHBlY3RlZFByb2R1Y3RBdWRpdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oZXhwZWN0ZWRQcm9kdWN0LAorCQkJCWF1ZGl0QWN0aW9uLCBwcm9kdWN0TWFuYWdlcjEsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfQUxSRUFEWV9DSEVDS0VEX0lOLCAiMC4xIiwgIjAuMSIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwKKwkJCQlleHBlY3RlZFByb2R1Y3QuZ2V0VVVJRCgpLCBhdWRpdFBhcmFtZXRlcnMpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChleHBlY3RlZFByb2R1Y3RBdWRpdCwgYXVkaXRBY3Rpb24pOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1bmRvQ2hlY2tPdXRQcm9kdWN0QnlQc1JvbGVOb3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVuZG9DaGVja091dFByb2R1Y3RSZXN0cmljdGVkKHByb2R1Y3RTdHJhdGVnaXN0VXNlcjEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdW5kb0NoZWNrT3V0UHJvZHVjdEJ5UG1Ob3RTdGF0ZU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVuZG9DaGVja091dFByb2R1Y3RGb3JiaWRkZW4ocHJvZHVjdE1hbmFnZXIyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdW5kb0NoZWNrT3V0UHJvZHVjdFN1Y2Nlc3MoVXNlciB1c2VyLCBib29sZWFuIGlzQWRtaW4pIHRocm93cyBFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBsY3NSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUoZXhwZWN0ZWRQcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcHJvZHVjdCIsIDIwMCwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gQ2hlY2tpbmcgdW5kbyBjaGVja291dCBvZiBhZG1pbiBldmVuIGlmIG5vdCBzdGF0ZSBvd25lcgorCQlVc2VyIGNoZWNrb3V0VXNlciA9IGlzQWRtaW4gPyBwcm9kdWN0TWFuYWdlcjEgOiB1c2VyOworCisJCWxjc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIGNoZWNrb3V0VXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHByb2R1Y3QiLCAyMDAsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IHByb2R1Y3RUb0JlVW5kb25lID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGxjc1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCisJCWxjc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0VG9CZVVuZG9uZSwgdXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5VTkRPQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdW5kbyBjaGVja291dCBwcm9kdWN0IiwgMjAwLCBsY3NSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBWZXJpZnkgdmVyc2lvbiB3YXMgcmVtb3ZlZAorCQlsY3NSZXNwb25zZSA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChwcm9kdWN0VG9CZVVuZG9uZS5nZXRVbmlxdWVJZCgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCB1bmRvbmUgcHJvZHVjdCIsIDQwNCwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbGNzUmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0LmdldFVuaXF1ZUlkKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IGxhdGVzdCB2ZXJzaW9uIiwgMjAwLCBsY3NSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlQcm9kdWN0IGxhdGVzdFByb2R1Y3QgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIobGNzUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgbGF0ZXN0UHJvZHVjdCwgb3BlcmF0aW9uKTsKKworCQlFeHBlY3RlZFByb2R1Y3RBdWRpdCBleHBlY3RlZFByb2R1Y3RBdWRpdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24obGF0ZXN0UHJvZHVjdCwKKwkJCQlhdWRpdEFjdGlvbiwgdXNlciwgQWN0aW9uU3RhdHVzLk9LLCAiMC4yIiwgIjAuMSIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIGxhdGVzdFByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0QXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdW5kb0NoZWNrT3V0UHJvZHVjdFJlc3RyaWN0ZWQoVXNlciB1bmRvQ2hlY2tvdXRVc2VyKSB0aHJvd3MgRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja2luIHByb2R1Y3QiLCAyMDAsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxjc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShleHBlY3RlZFByb2R1Y3QsIHByb2R1Y3RNYW5hZ2VyMSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHByb2R1Y3QiLCAyMDAsIGxjc1Jlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlQcm9kdWN0IHByb2R1Y3RUb0JlVW5kb25lID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGxjc1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIFByb2R1Y3QuY2xhc3MpOworCisJCWxjc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0VG9CZVVuZG9uZSwgdW5kb0NoZWNrb3V0VXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlVORE9DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1bmRvY2hlY2tvdXQgcHJvZHVjdCIsIDQwOSwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgZXhwZWN0ZWRQcm9kdWN0QXVkaXQgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHByb2R1Y3RUb0JlVW5kb25lLAorCQkJCWF1ZGl0QWN0aW9uLCB1bmRvQ2hlY2tvdXRVc2VyLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sICIwLjIiLCAiMC4yIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsCisJCQkJcHJvZHVjdFRvQmVVbmRvbmUuZ2V0VVVJRCgpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdFByb2R1Y3QoZXhwZWN0ZWRQcm9kdWN0QXVkaXQsIGF1ZGl0QWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdW5kb0NoZWNrT3V0UHJvZHVjdEZvcmJpZGRlbihVc2VyIHVuZG9DaGVja291dFVzZXIpIHRocm93cyBFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBsY3NSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUoZXhwZWN0ZWRQcm9kdWN0LCBwcm9kdWN0TWFuYWdlcjEsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcHJvZHVjdCIsIDIwMCwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKGV4cGVjdGVkUHJvZHVjdCwgcHJvZHVjdE1hbmFnZXIxLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcHJvZHVjdCIsIDIwMCwgbGNzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVByb2R1Y3QgcHJvZHVjdFRvQmVVbmRvbmUgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIobGNzUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisKKwkJbGNzUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3RUb0JlVW5kb25lLCB1bmRvQ2hlY2tvdXRVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uVU5ET0NIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVuZG9jaGVja291dCBwcm9kdWN0IiwgNDAzLCBsY3NSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nW10gYXVkaXRQYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1tdIHsgcHJvZHVjdFRvQmVVbmRvbmUuZ2V0TmFtZSgpLCAicHJvZHVjdCIsCisJCQkJcHJvZHVjdE1hbmFnZXIxLmdldEZpcnN0TmFtZSgpLCBwcm9kdWN0TWFuYWdlcjEuZ2V0TGFzdE5hbWUoKSwgcHJvZHVjdE1hbmFnZXIxLmdldFVzZXJJZCgpIH07CisKKwkJRXhwZWN0ZWRQcm9kdWN0QXVkaXQgZXhwZWN0ZWRQcm9kdWN0QXVkaXQgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGV4cGVjdGVkUHJvZHVjdCwKKwkJCQlhdWRpdEFjdGlvbiwgdW5kb0NoZWNrb3V0VXNlciwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DSEVDS09VVF9CWV9BTk9USEVSX1VTRVIsICIwLjIiLCAiMC4yIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsCisJCQkJcHJvZHVjdFRvQmVVbmRvbmUuZ2V0VVVJRCgpLCBhdWRpdFBhcmFtZXRlcnMpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0UHJvZHVjdChleHBlY3RlZFByb2R1Y3RBdWRpdCwgYXVkaXRBY3Rpb24pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvcGVydHkvQWRkaXRpb25hbEluZm9ybWF0aW9uU2VydmxldFRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L0FkZGl0aW9uYWxJbmZvcm1hdGlvblNlcnZsZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzYmU3NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L0FkZGl0aW9uYWxJbmZvcm1hdGlvblNlcnZsZXRUZXN0LmphdmEKQEAgLTAsMCArMSwyMDIxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLnBhcnNlci5KU09OUGFyc2VyOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlByb3BlcnR5T3BlcmF0aW9uLlByb3BlcnR5Q29uc3RyYWludERlc2VyaWFsaXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5TZXJ2aWNlQ2F0ZWdvcmllc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5SZXNvdXJjZUFwaVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBBZGRpdGlvbmFsSW5mb3JtYXRpb25TZXJ2bGV0VGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBUeXBlIGNvbnN0cmFpbnRUeXBlID0gbmV3IFR5cGVUb2tlbjxQcm9wZXJ0eUNvbnN0cmFpbnQ+KCkgeworCX0uZ2V0VHlwZSgpOworCisJcHJvdGVjdGVkIEdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnJlZ2lzdGVyVHlwZUFkYXB0ZXIoY29uc3RyYWludFR5cGUsIG5ldyBQcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXIoKSkuY3JlYXRlKCk7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHJvdGVjdGVkIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCisJcHJvdGVjdGVkIEpTT05QYXJzZXIganNvblBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7CisKKwlwdWJsaWMgQWRkaXRpb25hbEluZm9ybWF0aW9uU2VydmxldFRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIEFkZGl0aW9uYWxJbmZvcm1hdGlvblNlcnZsZXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJLy8gQEJlZm9yZQorCS8vIHB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlcygpIHsKKwkvLyAvL1RPRE8gRXZnIDogd2lsbCBiZSBuZXcgQVBJIGFkZGVkIGZvciBkZWxldGUgYnkgbmFtZSBhbmQgdmVyc2lvbgorCS8vCisJLy8gUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKwkvLyBVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJLy8KKwkvLyB0cnkgeworCS8vIFN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZS5nZXRSZXNvdXJjZU5hbWUoKTsKKwkvLyBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlciwgcmVzb3VyY2VOYW1lLAorCS8vICIwLjEiKTsKKwkvLyBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlciwgcmVzb3VyY2VOYW1lLAorCS8vICIwLjIiKTsKKwkvLyBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlciwgcmVzb3VyY2VOYW1lLAorCS8vICIxLjAiKTsKKwkvLyBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlciwgcmVzb3VyY2VOYW1lLAorCS8vICIxLjEiKTsKKwkvLyBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlciwgcmVzb3VyY2VOYW1lICsKKwkvLyAiYWEiLCAiMC4xIik7CisJLy8gcmVzb3VyY2VVdGlscy5kZWxldGVSZXNvdXJjZV9hbGxWZXJzaW9ucyhyZXNvdXJjZSwgdXNlcik7CisJLy8KKwkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJLy8gYXNzZXJ0VHJ1ZShmYWxzZSk7CisJLy8gfQorCS8vCisJLy8gdHJ5IHsKKwkvLyBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IGdldFNlcnZpY2VEZXRhaWxzKCk7CisJLy8KKwkvLyBSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZVJlc3BvbnNlID0KKwkvLyBzZXJ2aWNlVXRpbHMuZGVsZXRlU2VydmljZUJ5TmFtZUFuZFZlcnNpb24oVXNlclV0aWxzLmdldEFkbWluRGV0YWlscygpLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldFNlcnZpY2VOYW1lKCksICIwLjEiKTsKKwkvLworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGUKKwkvLyBzZXJ2aWNlIixkZWxldGVTZXJ2aWNlUmVzcG9uc2UpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGRlbGV0ZQorCS8vIHNlcnZpY2UiLGRlbGV0ZVNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0VHJ1ZSgiZGVsZXRlIHNlcnZpY2UgZmFpbGVkIHN0YXR1czoiICsKKwkvLyBkZWxldGVTZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJLy8gZGVsZXRlU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpICE9IDUwMCk7CisJLy8KKwkvLyBkZWxldGVTZXJ2aWNlUmVzcG9uc2UgPQorCS8vIHNlcnZpY2VVdGlscy5kZWxldGVTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihVc2VyVXRpbHMuZ2V0QWRtaW5EZXRhaWxzKCksCisJLy8gc2VydmljZURldGFpbHMuZ2V0U2VydmljZU5hbWUoKSwgIjEuMCIpOworCS8vCisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGRlbGV0ZQorCS8vIHNlcnZpY2UiLGRlbGV0ZVNlcnZpY2VSZXNwb25zZSk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgZGVsZXRlCisJLy8gc2VydmljZSIsZGVsZXRlU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkvLyBhc3NlcnRUcnVlKCJkZWxldGUgc2VydmljZSBmYWlsZWQgc3RhdHVzOiIgKworCS8vIGRlbGV0ZVNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkvLyBkZWxldGVTZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgIT0gNTAwKTsKKwkvLworCS8vIHNlcnZpY2VVdGlscy5kZWxldGVTZXJ2aWNlX2FsbFZlcnNpb25zKHNlcnZpY2VEZXRhaWxzLCB1c2VyKTsKKwkvLworCS8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkvLyBhc3NlcnRUcnVlKGZhbHNlKTsKKwkvLyB9CisJLy8gfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOworCisJCS8vIGRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQsIHVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB1c2VyKTsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlTdHJpbmcgdXBkYXRlZEtleSA9ICJaWlogIFpaWiI7CisJCVN0cmluZyB1cGRhdGVkVmFsdWUgPSAiSkpKSiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCUFzc2VydEpVbml0LmFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCWZyb21Kc29uLnNldEtleSh1cGRhdGVkS2V5KTsKKwkJZnJvbUpzb24uc2V0VmFsdWUodXBkYXRlZFZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFByb3BlcnR5ID0gdXBkYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGZyb21Kc29uLCB1c2VyLCBmcm9tSnNvbi5nZXRVbmlxdWVJZCgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgdXBkYXRlZFByb3BlcnR5KTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIHVwZGF0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMjAwLCB1cGRhdGVkUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIHVwZGF0ZWRKc29uID0gZ3Nvbi5mcm9tSnNvbih1cGRhdGVkUHJvcGVydHkuZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmNsYXNzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RmFsc2UoImNoZWNrIG51bWJlciBvZiBzcGFjZXMiLCB1cGRhdGVkSnNvbi5nZXRLZXkoKS5jb250YWlucygiICAiKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQga2V5IiwgIlpaWiBaWloiLCB1cGRhdGVkSnNvbi5nZXRLZXkoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQgdmFsdWUiLCB1cGRhdGVkVmFsdWUsIHVwZGF0ZWRKc29uLmdldFZhbHVlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGlkIiwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgdXBkYXRlZEpzb24uZ2V0VW5pcXVlSWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCUFzc2VydEpVbml0LmFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVkUHJvcGVydHkgPSBkZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgdXNlcik7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGRlbGV0ZWRQcm9wZXJ0eSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBkZWxldGVkUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDIwMCwgZGVsZXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyB1cGRhdGVkSnNvbiA9IGdzb24uZnJvbUpzb24oZGVsZXRlZFByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCUFzc2VydEpVbml0LmFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgdXBkYXRlZEpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgdXBkYXRlZEpzb24uZ2V0S2V5KCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIHZhbHVlIiwgdmFsdWUsIHVwZGF0ZWRKc29uLmdldFZhbHVlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGlkIiwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgdXBkYXRlZEpzb24uZ2V0VW5pcXVlSWQoKSk7CisKKwkJZGVsZXRlZFByb3BlcnR5ID0gZGVsZXRlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGZyb21Kc29uLmdldFVuaXF1ZUlkKCksIHVzZXIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBkZWxldGVkUHJvcGVydHkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgZGVsZXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCA0MDksIGRlbGV0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0RHVyaW5nTGlmZWN5Y2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCUFzc2VydEpVbml0LmFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCXJlc291cmNlLnNldFVuaXF1ZUlkKHJlc291cmNlSWQpOworCisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHModXNlciwKKwkJLy8gY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisKKwkJY2VydGlmeVJlc291cmNlKHVzZXIsIHJlc291cmNlLCBudWxsLCAxKTsKKworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZSgpIHsKKworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gZ2V0U2VydmljZURldGFpbHMoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNyZWF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgdXNlcik7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMSwgY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlc3BvbnNlOworCisJfQorCisJcHJvdGVjdGVkIFVzZXIgZ2V0VXNlcigpIHsKKwkJU3RyaW5nIGFkbWluRmlyc3ROYW1lID0gIkppbW15IjsKKwkJU3RyaW5nIGFkbWluTGFzdE5hbWUgPSAiSGVuZHJpeCI7CisJCVN0cmluZyBhZG1pblVzZXJJZCA9ICJqaDAwMDMiOworCQlyZXR1cm4gbmV3IFVzZXIoYWRtaW5GaXJzdE5hbWUsIGFkbWluTGFzdE5hbWUsIGFkbWluVXNlcklkLCBudWxsLCBudWxsLCBudWxsKTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIGdldFJlc291cmNlKCkgeworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gImNpUmVzb3VyY2Vmb3Jwcm9wZXJ0eTQiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoInRvc2NhLm5vZGVzLlJvb3QiKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJwZTAxMjMiOworCQlTdHJpbmcgaWNvbiA9ICJteUlDT04iOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgbnVsbCwgZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCXJlc291cmNlLmFkZENhdGVnb3J5Q2hhaW4oUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19EQVRBQkFTRS5nZXRDYXRlZ29yeSgpLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0RBVEFCQVNFLmdldFN1YkNhdGVnb3J5KCkpOworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VBcGlUZXN0IHJhdCA9IG5ldyBSZXNvdXJjZUFwaVRlc3QoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlT2JqID0gcmF0LmdldFJlc291cmNlT2JqKCk7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbihyZXNvdXJjZURldGFpbHMpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVzcG9uc2U7CisKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGdldFJlc291cmNlKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJlc291cmNlVWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVJlc291cmNlQXBpVGVzdCByYXQgPSBuZXcgUmVzb3VyY2VBcGlUZXN0KCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZU9iaiA9IHJhdC5nZXRSZXNvdXJjZU9iaigpOworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZVVpZCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCisJCXJldHVybiBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlOworCisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlyZXR1cm4gZGVsZXRlUmVzb3VyY2VSZXNwb25zZTsKKworCX0KKworCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgdXBkYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uKFN0cmluZyByZXNvdXJjZUlkLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm8sIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIGJvZHkgPSBnc29uLnRvSnNvbihhZGRpdGlvbmFsSW5mbyk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTl9SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VJZCwgaWQpOworCQlyZXR1cm4gaHR0cC5odHRwU2VuZFB1dCh1cmwsIGJvZHksIGhlYWRlcnNNYXApOworCisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKFN0cmluZyByZXNvdXJjZUlkLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm8sIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIGJvZHkgPSBnc29uLnRvSnNvbihhZGRpdGlvbmFsSW5mbyk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTl9TRVJWSUNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZUlkLCBpZCk7CisJCXJldHVybiBodHRwLmh0dHBTZW5kUHV0KHVybCwgYm9keSwgaGVhZGVyc01hcCk7CisKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGRlbGV0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGlkLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT05fUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQsIGlkKTsKKwkJcmV0dXJuIGh0dHAuaHR0cFNlbmREZWxldGUodXJsLCBoZWFkZXJzTWFwKTsKKworCX0KKworCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgZGVsZXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGlkLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT05fU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VJZCwgaWQpOworCQlyZXR1cm4gaHR0cC5odHRwU2VuZERlbGV0ZSh1cmwsIGhlYWRlcnNNYXApOworCisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBnZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpZCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9BRERJVElPTkFMX0lORk9STUFUSU9OX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZUlkLCBpZCk7CisJCXJldHVybiBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24oU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpZCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9BRERJVElPTkFMX0lORk9STUFUSU9OX1NFUlZJQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQsIGlkKTsKKwkJcmV0dXJuIGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKworCX0KKworCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb24oU3RyaW5nIHJlc291cmNlSWQsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfQUxMX0FERElUSU9OQUxfSU5GT1JNQVRJT05fUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQpOworCQlyZXR1cm4gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uKFN0cmluZyByZXNvdXJjZUlkLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9BRERJVElPTkFMX0lORk9STUFUSU9OX1NFUlZJQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQpOworCQlyZXR1cm4gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihTdHJpbmcgcmVzb3VyY2VJZCwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgYm9keSA9IGdzb24udG9Kc29uKGFkZGl0aW9uYWxJbmZvKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNSRUFURV9BRERJVElPTkFMX0lORk9STUFUSU9OX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZUlkKTsKKwkJcmV0dXJuIGh0dHAuaHR0cFNlbmRQb3N0KHVybCwgYm9keSwgaGVhZGVyc01hcCk7CisKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24oU3RyaW5nIHNlcnZpY2VJZCwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgYm9keSA9IGdzb24udG9Kc29uKGFkZGl0aW9uYWxJbmZvKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNSRUFURV9BRERJVElPTkFMX0lORk9STUFUSU9OX1NFUlZJQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VJZCk7CisJCXJldHVybiBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGJvZHksIGhlYWRlcnNNYXApOworCisJfQorCisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIGdldFNlcnZpY2VEZXRhaWxzKCkgeworCQlTdHJpbmcgc2VydmljZU5hbWUgPSAiY2lOZXdUZXN0U2VydmljZTIxIjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFncy5hZGQoInNlcnZpY2VUYWciKTsKKwkJdGFncy5hZGQoc2VydmljZU5hbWUpOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAic2VydmljZSBEZXNjcmlwdGlvbiI7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjAuMSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiYWwxOTc2IjsKKwkJU3RyaW5nIGljb24gPSAibXlJY29uIjsKKworCQlyZXR1cm4gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKHNlcnZpY2VOYW1lLCBjYXRlZ29yeSwgdGFncywgZGVzY3JpcHRpb24sIGNvbnRhY3RJZCwgaWNvbik7CisJfQorCisJLy8gVE9ETyBUYWw6IFNpbmNlIENhc2hpbmcgY2hhbmdlIHBhcnRpYWwgcmVzb3VyY2UgcmV0dXJuZWQgdGhhdCBjYXVzZXMgbnVsbAorCS8vIHBvaW50ZXIgZXhjZXB0aW9uIGluIGxpbmU6CisJLy8gY29tbWVudGVkIG91dCB0aWxsIGZpeGluZworCXByb3RlY3RlZCBSZXNvdXJjZSBjZXJ0aWZ5UmVzb3VyY2UoVXNlciB1c2VyLCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFN0cmluZyByZXNvdXJjZVZlcnNpb24sIGludCBudW1iZXJPZkFJKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjaGVja0luUmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMCwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc291cmNlIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPSBnc29uLmZyb21Kc29uKGNoZWNrSW5SZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIFRPRE8gVGFsOiBTaW5jZSBDYXNoaW5nIGNoYW5nZSBwYXJ0aWFsIHJlc291cmNlIHJldHVybmVkIHRoYXQgY2F1c2VzCisJCS8vIG51bGwgcG9pbnRlciBleGNlcHRpb24KKwkJLyoKKwkJICogQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLnNpemUoKSk7CisJCSAqLworCQkvKgorCQkgKiBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIG51bWJlck9mQUksIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuZ2V0KDApLiBnZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKwkJICovCisKKwkJUmVzdFJlc3BvbnNlIHJlcTRjZXJ0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCByZXE0Y2VydFJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCByZXE0Y2VydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPSBnc29uLmZyb21Kc29uKHJlcTRjZXJ0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBUT0RPIFRhbDogU2luY2UgQ2FzaGluZyBjaGFuZ2UgcGFydGlhbCByZXNvdXJjZSByZXR1cm5lZCB0aGF0IGNhdXNlcworCQkvLyBudWxsIHBvaW50ZXIgZXhjZXB0aW9uCisJCS8qCisJCSAqIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5zaXplKCkpOworCQkgKi8KKwkJLyoKKwkJICogQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBudW1iZXJPZkFJLCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLmdldCgwKS4gZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisJCSAqLworCisJCS8vIGNoYW5nZSBtb2RpZmllcgorCQl1c2VyLnNldFVzZXJJZChVc2VyUm9sZUVudW0uVEVTVEVSLmdldFVzZXJJZCgpKTsKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCisJCVJlc3RSZXNwb25zZSBzdGFydENlcnRSZXNvdXJjZVJlc3BvbnNlMyA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgc3RhcnRDZXJ0UmVzb3VyY2VSZXNwb25zZTMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIHN0YXJ0Q2VydFJlc291cmNlUmVzcG9uc2UzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPSBnc29uLmZyb21Kc29uKHN0YXJ0Q2VydFJlc291cmNlUmVzcG9uc2UzLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gVE9ETyBUYWw6IFNpbmNlIENhc2hpbmcgY2hhbmdlIHBhcnRpYWwgcmVzb3VyY2UgcmV0dXJuZWQgdGhhdCBjYXVzZXMKKwkJLy8gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbgorCQkvKgorCQkgKiBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDEsIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuc2l6ZSgpKTsKKwkJICovCisJCS8qCisJCSAqIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgbnVtYmVyT2ZBSSwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuIGdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCQkgKi8KKworCQkvLyBjZXJ0aWZ5CisKKwkJUmVzdFJlc3BvbnNlIGNlcnRpZnlSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNlcnRpZnlSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2VydGlmeVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPSBnc29uLmZyb21Kc29uKGNlcnRpZnlSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5zaXplKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIG51bWJlck9mQUksIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuZ2V0KDApLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisJCVJlc291cmNlIGNlcnRpZnlSZXNvdXJjZSA9IGdzb24uZnJvbUpzb24oY2VydGlmeVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmV0dXJuIGNlcnRpZnlSZXNvdXJjZTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2UgY2VydGlmeVNlcnZpY2UoVXNlciB1c2VyLCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlLCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNoZWNrSW5SZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNoZWNrSW5SZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VBZnRlck9wZXJhdGlvbiA9IGdzb24uZnJvbUpzb24oY2hlY2tJblJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLnNpemUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlcTRjZXJ0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgcmVxNGNlcnRSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgcmVxNGNlcnRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlyZXNvdXJjZUFmdGVyT3BlcmF0aW9uID0gZ3Nvbi5mcm9tSnNvbihyZXE0Y2VydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLnNpemUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKwkJLy8gY2hhbmdlIG1vZGlmaWVyCisJCXVzZXIuc2V0VXNlcklkKFVzZXJSb2xlRW51bS5URVNURVIuZ2V0VXNlcklkKCkpOworCQkvLyBzdGFydCBjZXJ0aWZpY2F0aW9uCisKKwkJUmVzdFJlc3BvbnNlIHN0YXJ0Q2VydFJlc291cmNlUmVzcG9uc2UzID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgc3RhcnRDZXJ0UmVzb3VyY2VSZXNwb25zZTMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIHN0YXJ0Q2VydFJlc291cmNlUmVzcG9uc2UzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPSBnc29uLmZyb21Kc29uKHN0YXJ0Q2VydFJlc291cmNlUmVzcG9uc2UzLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLnNpemUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKwkJLy8gY2VydGlmeQorCisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY2VydGlmeVJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjZXJ0aWZ5UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmVzb3VyY2VBZnRlck9wZXJhdGlvbiA9IGdzb24uZnJvbUpzb24oY2VydGlmeVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLnNpemUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKwkJUmVzb3VyY2UgY2VydGlmeVJlc291cmNlID0gZ3Nvbi5mcm9tSnNvbihjZXJ0aWZ5UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlyZXR1cm4gY2VydGlmeVJlc291cmNlOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCWNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgNDA5LCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb0Zvcm1hdFdpdGhUYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiPGI+Qm9sZDw8L2I+IjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBmcm9tSnNvbiA9IGdzb24uZnJvbUpzb24oY3JlYXRlUHJvcGVydHkuZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCBrZXkiLCAiQm9sZCZhbXA7bHQ7IiwgZnJvbUpzb24uZ2V0VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb0Zvcm1hdFdpdGhUYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VSZXNwb25zZSA9IGNyZWF0ZVNlcnZpY2UoKTsKKworCQlTdHJpbmcgc2VydmljZUlkID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjcmVhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkuZ2V0VW5pcXVlSWQoKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlU2VydmljZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiPGI+Qm9sZDw8L2I+IjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQga2V5IiwgIkJvbGQmYW1wO2x0OyIsIGZyb21Kc29uLmdldFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvRm9ybWF0V2l0aFdoaXRlU3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiICAgICAgIjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDAsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWtleSA9ICIgICAgIjsKKwkJdmFsdWUgPSAiQUFBICBBQUEiOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDAsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9Gb3JtYXRXaXRoV2hpdGVTcGFjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBjcmVhdGVTZXJ2aWNlKCk7CisJCVJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVNlcnZpY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcga2V5ID0gIkFBQSAgQUFBIjsKKwkJU3RyaW5nIHZhbHVlID0gIiAgICAgICI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJa2V5ID0gIiAgICAiOworCQl2YWx1ZSA9ICJBQUEgIEFBQSI7CisKKwkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQljcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24oc2VydmljZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDAsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUFuZFVwZGF0ZUFkZGl0aW9uYWxJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCWtleSA9ICJCQkIgIEJCQiI7CisJCXZhbHVlID0gIkJCQkIiOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWZyb21Kc29uID0gZ3Nvbi5mcm9tSnNvbihjcmVhdGVQcm9wZXJ0eS5nZXRSZXNwb25zZSgpLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uY2xhc3MpOworCQlhc3NlcnRGYWxzZSgiY2hlY2sgbnVtYmVyIG9mIHNwYWNlcyIsIGZyb21Kc29uLmdldEtleSgpLmNvbnRhaW5zKCIgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCBrZXkiLCAiQkJCIEJCQiIsIGZyb21Kc29uLmdldEtleSgpKTsKKworCQlTdHJpbmcgdXBkYXRlZEtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB1cGRhdGVkVmFsdWUgPSAiSkpKSiI7CisKKwkJZnJvbUpzb24uc2V0S2V5KHVwZGF0ZWRLZXkpOworCQlmcm9tSnNvbi5zZXRWYWx1ZSh1cGRhdGVkVmFsdWUpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUHJvcGVydHkgPSB1cGRhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgZnJvbUpzb24sIHVzZXIsIGZyb21Kc29uLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCB1cGRhdGVkUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgdXBkYXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCA0MDksIHVwZGF0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBjcmVhdGVTZXJ2aWNlKCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCWNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwOSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlRW1wdHlBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiIjsKKwkJU3RyaW5nIHZhbHVlID0gIkJCQkIiOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSwgdmFsdWUpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJa2V5ID0gIkJCQkIiOworCQl2YWx1ZSA9ICIiOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDAsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlRW1wdHlBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBjcmVhdGVTZXJ2aWNlKCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIGtleSA9ICIiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlQWxsU3BhY2VzQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisKKwkJLy8gZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZCwgdXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UsIHVzZXIpOworCisJCVN0cmluZyByZXNvdXJjZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcga2V5ID0gIiAgICAgICAgICAgIjsKKwkJU3RyaW5nIHZhbHVlID0gIkJCQkIiOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSwgdmFsdWUpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VBbGxTcGFjZXNBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gY3JlYXRlU2VydmljZSgpOworCisJCVN0cmluZyBzZXJ2aWNlSWQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKS5nZXRVbmlxdWVJZCgpOworCisJCVN0cmluZyBrZXkgPSAiICAgICAgICAgICAiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW52YWxpZEtleUFkZGl0aW9uYWxJbmZvcm1hdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOworCisJCS8vIGRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQsIHVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB1c2VyKTsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGtleSA9ICJhYmM/IjsKKwkJU3RyaW5nIHZhbHVlID0gIkJCQkIiOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSwgdmFsdWUpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VJbnZhbGlkS2V5QWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VSZXNwb25zZSA9IGNyZWF0ZVNlcnZpY2UoKTsKKworCQlTdHJpbmcgc2VydmljZUlkID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjcmVhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkuZ2V0VW5pcXVlSWQoKTsKKworCQlTdHJpbmcga2V5ID0gImFiYz8iOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uTnVsbEtleVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCVN0cmluZyBrZXkgPSBudWxsOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgNDAwLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbk51bGxLZXlUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gY3JlYXRlU2VydmljZSgpOworCisJCVN0cmluZyBzZXJ2aWNlSWQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKS5nZXRVbmlxdWVJZCgpOworCisJCVN0cmluZyBrZXkgPSBudWxsOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlTWF4aW11bUluZm9ybWF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisKKwkJLy8gZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZCwgdXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UsIHVzZXIpOworCisJCVN0cmluZyByZXNvdXJjZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcga2V5ID0gIkFBQSAgQUFBIjsKKwkJU3RyaW5nIHZhbHVlID0gIkJCQkIiOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkrKykgeworCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXkgKyBpLCB2YWx1ZSk7CisKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDIwMSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJfQorCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSwgdmFsdWUpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwOSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlTGlmZUN5Y2xlQW5kTWF4aW11bUluZm9ybWF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisKKwkJLy8gZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZCwgdXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UsIHVzZXIpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKwkJcmVzb3VyY2Uuc2V0VW5pcXVlSWQocmVzb3VyY2VJZCk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IDQ5OyBpKyspIHsKKworCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5ICsgaSwgdmFsdWUpOworCisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCX0KKworCQlTdHJpbmcgcmVzb3VyY2VWZXJzaW9uID0gIjAuMSI7CisJCVN0cmluZyBjaGVja2luQ29tbWVudCA9ICJnb29kIGNoZWNraW4iOworCQlTdHJpbmcgY2hlY2tpbkNvbWVudEpzb24gPSAie1widXNlclJlbWFya3NcIjogXCIiICsgY2hlY2tpbkNvbW1lbnQgKyAiXCJ9IjsKKwkJUmVzdFJlc3BvbnNlIGNoZWNrSW5SZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjaGVja0luUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmVzb3VyY2VWZXJzaW9uID0gIjAuMiI7CisKKwkJUmVzdFJlc3BvbnNlIGNoZWNrT3V0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCBudWxsKTsKKworCQlyZXNvdXJjZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hlY2tPdXRSZXNwb25zZSk7CisJCXJlc291cmNlLnNldFVuaXF1ZUlkKHJlc291cmNlSWQpOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSArIDUwLCB2YWx1ZSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSArIDUxLCB2YWx1ZSk7CisJCWNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDksIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjaGVja1VuZG9PdXRSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uVU5ET0NIRUNLT1VULCBudWxsKTsKKworCQlyZXNvdXJjZVZlcnNpb24gPSAiMC4xIjsKKworCQljaGVja091dFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgbnVsbCk7CisJCXJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjaGVja091dFJlc3BvbnNlKTsKKwkJcmVzb3VyY2Uuc2V0VW5pcXVlSWQocmVzb3VyY2VJZCk7CisKKwkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXkgKyA1MCwgdmFsdWUpOworCQljcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSArIDUxLCB2YWx1ZSk7CisJCWNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDksIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUxpZmVDeWNsZUNlcnRpZnlBbmRNYXhpbXVtSW5mb3JtYXRpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCQlyZXNvdXJjZS5zZXRVbmlxdWVJZChyZXNvdXJjZUlkKTsKKworCQlTdHJpbmcga2V5ID0gIkFBQSAgQUFBIjsKKwkJU3RyaW5nIHZhbHVlID0gIkJCQkIiOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgNDk7IGkrKykgeworCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXkgKyBpLCB2YWx1ZSk7CisKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDIwMSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJfQorCisJCVN0cmluZyByZXNvdXJjZVZlcnNpb24gPSAiMC4xIjsKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVN0cmluZyBjaGVja2luQ29tZW50SnNvbiA9ICJ7XCJ1c2VyUmVtYXJrc1wiOiBcIiIgKyBjaGVja2luQ29tbWVudCArICJcIn0iOworCisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHModXNlciwKKwkJLy8gY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoZWNrSW5SZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjaGVja0luUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVN0YXRlUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULCBudWxsKTsKKwkJY2hhbmdlU3RhdGVSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OLCBudWxsKTsKKwkJY2hhbmdlU3RhdGVSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgbnVsbCk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNoZWNrSW5SZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDAsIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlyZXNvdXJjZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY2hhbmdlU3RhdGVSZXNwb25zZSk7CisJCXJlc291cmNlLnNldFVuaXF1ZUlkKHJlc291cmNlSWQpOworCisJCXJlc291cmNlVmVyc2lvbiA9ICIxLjAiOworCisJCWNoYW5nZVN0YXRlUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCBudWxsKTsKKwkJcmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzcG9uc2UpOworCQlyZXNvdXJjZS5zZXRVbmlxdWVJZChyZXNvdXJjZUlkKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXkgKyA1MCwgdmFsdWUpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDIwMSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXkgKyA1MSwgdmFsdWUpOworCQljcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgNDA5LCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUN5Y2xlQW5kTWF4aW11bUluZm9ybWF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlID0gZ2V0U2VydmljZURldGFpbHMoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gY3JlYXRlU2VydmljZSgpOworCisJCVN0cmluZyBzZXJ2aWNlSWQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKS5nZXRVbmlxdWVJZCgpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJc2VydmljZS5zZXRVbmlxdWVJZChzZXJ2aWNlSWQpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OTsgaSsrKSB7CisKKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSArIGksIHZhbHVlKTsKKworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDIwMSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJfQorCisJCVN0cmluZyByZXNvdXJjZVZlcnNpb24gPSAiMC4xIjsKKwkJU3RyaW5nIGNoZWNraW5Db21tZW50ID0gImdvb2QgY2hlY2tpbiI7CisJCVN0cmluZyBjaGVja2luQ29tZW50SnNvbiA9ICJ7XCJ1c2VyUmVtYXJrc1wiOiBcIiIgKyBjaGVja2luQ29tbWVudCArICJcIn0iOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgY2hlY2tpbkNvbWVudEpzb24pOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjaGVja0luUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAwLCBjaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmVzb3VyY2VWZXJzaW9uID0gIjAuMiI7CisKKwkJUmVzdFJlc3BvbnNlIGNoZWNrT3V0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgbnVsbCk7CisKKwkJc2VydmljZUlkID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjaGVja091dFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisJCXNlcnZpY2Uuc2V0VW5pcXVlSWQoc2VydmljZUlkKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXkgKyA1MCwgdmFsdWUpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5ICsgNTEsIHZhbHVlKTsKKwkJY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDksIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjaGVja1VuZG9PdXRSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlVORE9DSEVDS09VVCwgbnVsbCk7CisKKwkJcmVzb3VyY2VWZXJzaW9uID0gIjAuMSI7CisKKwkJY2hlY2tPdXRSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCBudWxsKTsKKwkJc2VydmljZUlkID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjaGVja091dFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisJCXNlcnZpY2Uuc2V0VW5pcXVlSWQoc2VydmljZUlkKTsKKworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSArIDUwLCB2YWx1ZSk7CisJCWNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSArIDUxLCB2YWx1ZSk7CisJCWNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgNDA5LCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZU1heGltdW1JbmZvcm1hdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBjcmVhdGVTZXJ2aWNlKCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlTdHJpbmcgbGFzdENyZWF0ZWRQcm9wZXJ0eSA9IG51bGw7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisKKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSArIGksIHZhbHVlKTsKKworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDIwMSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBmcm9tSnNvbiA9IGdzb24uZnJvbUpzb24oY3JlYXRlUHJvcGVydHkuZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmNsYXNzKTsKKwkJCWxhc3RDcmVhdGVkUHJvcGVydHkgPSBmcm9tSnNvbi5nZXRVbmlxdWVJZCgpOworCisJCX0KKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgNDA5LCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZGVsZXRlZFByb3BlcnR5ID0gZGVsZXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGxhc3RDcmVhdGVkUHJvcGVydHksIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBkZWxldGVkUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgZGVsZXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAyMDAsIGRlbGV0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSwgdmFsdWUpOworCQljcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24oc2VydmljZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDIwMSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gY3JlYXRlU2VydmljZSgpOworCisJCVN0cmluZyBzZXJ2aWNlSWQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKS5nZXRVbmlxdWVJZCgpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJU3RyaW5nIHVwZGF0ZWRLZXkgPSAiWlpaICBaWloiOworCQlTdHJpbmcgdXBkYXRlZFZhbHVlID0gIkpKSkoiOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSwgdmFsdWUpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24oc2VydmljZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBmcm9tSnNvbiA9IGdzb24uZnJvbUpzb24oY3JlYXRlUHJvcGVydHkuZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmNsYXNzKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIG51bWJlciBvZiBzcGFjZXMiLCBmcm9tSnNvbi5nZXRLZXkoKS5jb250YWlucygiICAiKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQga2V5IiwgIkFBQSBBQUEiLCBmcm9tSnNvbi5nZXRLZXkoKSk7CisKKwkJZnJvbUpzb24uc2V0S2V5KHVwZGF0ZWRLZXkpOworCQlmcm9tSnNvbi5zZXRWYWx1ZSh1cGRhdGVkVmFsdWUpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUHJvcGVydHkgPSB1cGRhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgZnJvbUpzb24sIHVzZXIsIGZyb21Kc29uLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCB1cGRhdGVkUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgdXBkYXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAyMDAsIHVwZGF0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gdXBkYXRlZEpzb24gPSBnc29uLmZyb21Kc29uKHVwZGF0ZWRQcm9wZXJ0eS5nZXRSZXNwb25zZSgpLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uY2xhc3MpOworCQlhc3NlcnRGYWxzZSgiY2hlY2sgbnVtYmVyIG9mIHNwYWNlcyIsIHVwZGF0ZWRKc29uLmdldEtleSgpLmNvbnRhaW5zKCIgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCBrZXkiLCAiWlpaIFpaWiIsIHVwZGF0ZWRKc29uLmdldEtleSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCB2YWx1ZSIsIHVwZGF0ZWRWYWx1ZSwgdXBkYXRlZEpzb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQgaWQiLCBmcm9tSnNvbi5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkSnNvbi5nZXRVbmlxdWVJZCgpKTsKKworCQlmcm9tSnNvbi5zZXRLZXkodXBkYXRlZEtleSk7CisJCWZyb21Kc29uLnNldFZhbHVlKCIiKTsKKworCQl1cGRhdGVkUHJvcGVydHkgPSB1cGRhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgZnJvbUpzb24sIHVzZXIsIGZyb21Kc29uLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCB1cGRhdGVkUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgdXBkYXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCA0MDAsIHVwZGF0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBjcmVhdGVTZXJ2aWNlKCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVkUHJvcGVydHkgPSBkZWxldGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGRlbGV0ZWRQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBkZWxldGVkUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDIwMCwgZGVsZXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyB1cGRhdGVkSnNvbiA9IGdzb24uZnJvbUpzb24oZGVsZXRlZFByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgdXBkYXRlZEpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgdXBkYXRlZEpzb24uZ2V0S2V5KCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIHZhbHVlIiwgdmFsdWUsIHVwZGF0ZWRKc29uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGlkIiwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgdXBkYXRlZEpzb24uZ2V0VW5pcXVlSWQoKSk7CisKKwkJZGVsZXRlZFByb3BlcnR5ID0gZGVsZXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGZyb21Kc29uLmdldFVuaXF1ZUlkKCksIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBkZWxldGVkUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgZGVsZXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCA0MDksIGRlbGV0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB1c2VyKTsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBmcm9tSnNvbiA9IGdzb24uZnJvbUpzb24oY3JlYXRlUHJvcGVydHkuZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmNsYXNzKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIG51bWJlciBvZiBzcGFjZXMiLCBmcm9tSnNvbi5nZXRLZXkoKS5jb250YWlucygiICAiKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQga2V5IiwgIkFBQSBBQUEiLCBmcm9tSnNvbi5nZXRLZXkoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZWRQcm9wZXJ0eSA9IGdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBmcm9tSnNvbi5nZXRVbmlxdWVJZCgpLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgZGVsZXRlZFByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGRlbGV0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMjAwLCBkZWxldGVkUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIHVwZGF0ZWRKc29uID0gZ3Nvbi5mcm9tSnNvbihkZWxldGVkUHJvcGVydHkuZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmNsYXNzKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIG51bWJlciBvZiBzcGFjZXMiLCB1cGRhdGVkSnNvbi5nZXRLZXkoKS5jb250YWlucygiICAiKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQga2V5IiwgIkFBQSBBQUEiLCB1cGRhdGVkSnNvbi5nZXRLZXkoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQgdmFsdWUiLCB2YWx1ZSwgdXBkYXRlZEpzb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQgaWQiLCBmcm9tSnNvbi5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkSnNvbi5nZXRVbmlxdWVJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBjcmVhdGVTZXJ2aWNlKCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVkUHJvcGVydHkgPSBnZXRTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGRlbGV0ZWRQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBkZWxldGVkUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDIwMCwgZGVsZXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyB1cGRhdGVkSnNvbiA9IGdzb24uZnJvbUpzb24oZGVsZXRlZFByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgdXBkYXRlZEpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgdXBkYXRlZEpzb24uZ2V0S2V5KCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIHZhbHVlIiwgdmFsdWUsIHVwZGF0ZWRKc29uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGlkIiwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgdXBkYXRlZEpzb24uZ2V0VW5pcXVlSWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVkUHJvcGVydHkgPSBnZXRSZXNvdXJjZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgZGVsZXRlZFByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGRlbGV0ZWRQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMjAwLCBkZWxldGVkUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiB1cGRhdGVkSnNvbiA9IGdzb24uZnJvbUpzb24oZGVsZXRlZFByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24uY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIG51bWJlciBvZiBwYXJhbWV0ZXJzIiwgMSwgdXBkYXRlZEpzb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBpbmZvID0gdXBkYXRlZEpzb24uZ2V0UGFyYW1ldGVycygpLml0ZXJhdG9yKCkubmV4dCgpOworCisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgaW5mby5nZXRLZXkoKS5jb250YWlucygiICAiKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQga2V5IiwgIkFBQSBBQUEiLCBpbmZvLmdldEtleSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCB2YWx1ZSIsIHZhbHVlLCBpbmZvLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGlkIiwgZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSwgaW5mby5nZXRVbmlxdWVJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBjcmVhdGVTZXJ2aWNlKCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNyZWF0ZVByb3BlcnR5LmdldFJlc3BvbnNlKCksIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBudW1iZXIgb2Ygc3BhY2VzIiwgZnJvbUpzb24uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgZnJvbUpzb24uZ2V0S2V5KCkpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVkUHJvcGVydHkgPSBnZXRTZXJ2aWNlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uKHNlcnZpY2VJZCwgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGRlbGV0ZWRQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBkZWxldGVkUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDIwMCwgZGVsZXRlZFByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gdXBkYXRlZEpzb24gPSBnc29uLmZyb21Kc29uKGRlbGV0ZWRQcm9wZXJ0eS5nZXRSZXNwb25zZSgpLCBBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBudW1iZXIgb2YgcGFyYW1ldGVycyIsIDEsIHVwZGF0ZWRKc29uLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gaW5mbyA9IHVwZGF0ZWRKc29uLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworCQlhc3NlcnRGYWxzZSgiY2hlY2sgbnVtYmVyIG9mIHNwYWNlcyIsIGluZm8uZ2V0S2V5KCkuY29udGFpbnMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJldHVybmVkIGtleSIsICJBQUEgQUFBIiwgaW5mby5nZXRLZXkoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmV0dXJuZWQgdmFsdWUiLCB2YWx1ZSwgaW5mby5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCBpZCIsIGZyb21Kc29uLmdldFVuaXF1ZUlkKCksIGluZm8uZ2V0VW5pcXVlSWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0RHVyaW5nTGlmZWN5Y2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlID0gY3JlYXRlU2VydmljZSgpOworCQlTdHJpbmcgc2VydmljZUlkID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjcmVhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkuZ2V0VW5pcXVlSWQoKTsKKwkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCVN0cmluZyB2YWx1ZSA9ICJCQkJCIjsKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihzZXJ2aWNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDIwMSwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGZyb21Kc29uID0gZ3Nvbi5mcm9tSnNvbihjcmVhdGVQcm9wZXJ0eS5nZXRSZXNwb25zZSgpLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uY2xhc3MpOworCQlhc3NlcnRGYWxzZSgiY2hlY2sgbnVtYmVyIG9mIHNwYWNlcyIsIGZyb21Kc29uLmdldEtleSgpLmNvbnRhaW5zKCIgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCBrZXkiLCAiQUFBIEFBQSIsIGZyb21Kc29uLmdldEtleSgpKTsKKworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IGdldFNlcnZpY2VEZXRhaWxzKCk7CisKKwkJc2VydmljZURldGFpbHMuc2V0VW5pcXVlSWQoc2VydmljZUlkKTsKKworCQkvLyBzZXJ2aWNlVXRpbHMuYWRkU2VydmljZU1hbmRhdG9yeUFydGlmYWN0cyh1c2VyLAorCQkvLyBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UpOworCisJCWNlcnRpZnlTZXJ2aWNlKHVzZXIsIHNlcnZpY2VEZXRhaWxzLCBudWxsKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlQ2FzY2FkZVJlc291cmNlKCkgeworCisJCS8vIFRPRE86IHRvIGNoZWNrIGFmdGVyIHJlYmFzZQorCisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKwkJU3RyaW5nIG5ld1Jlc291cmNlTmFtZVN1ZmZpeCA9ICJhYSI7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBudWxsOworCQl0cnkgeworCisJCQljcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UsIHVzZXIpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBpbnZhbGlkIHR5cGUiLCAyMDEsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQlTdHJpbmcgcmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCQlTdHJpbmcgcmVzb3VyY2VWZXJzaW9uID0gIjAuMSI7CisJCQkvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKHVzZXIsCisJCQkvLyBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQkJU3RyaW5nIGtleSA9ICJBQUEgIEFBQSI7CisJCQlTdHJpbmcgdmFsdWUgPSAiQkJCQiI7CisKKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleSwgdmFsdWUpOworCisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5KTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQlyZXNvdXJjZS5zZXRVbmlxdWVJZChyZXNvdXJjZUlkKTsKKwkJCVJlc291cmNlIGNlcnRpZmllZFJlc291cmNlID0gY2VydGlmeVJlc291cmNlKHVzZXIsIHJlc291cmNlLCByZXNvdXJjZVZlcnNpb24sIDEpOworCisJCQlSZXNvdXJjZVJlcURldGFpbHMgbmV3UmVzb3VyY2VEZXRhaWxzID0gZ2V0UmVzb3VyY2UoKTsKKwkJCVN0cmluZyBuZXdSZXNvdXJjZU5hbWUgPSBuZXdSZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpICsgbmV3UmVzb3VyY2VOYW1lU3VmZml4OworCQkJbmV3UmVzb3VyY2VEZXRhaWxzLnNldE5hbWUobmV3UmVzb3VyY2VOYW1lKTsKKwkJCUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJZGVyaXZlZEZyb20uYWRkKGNlcnRpZmllZFJlc291cmNlLmdldE5hbWUoKSk7CisJCQluZXdSZXNvdXJjZURldGFpbHMuc2V0RGVyaXZlZEZyb20oZGVyaXZlZEZyb20pOworCQkJbmV3UmVzb3VyY2VEZXRhaWxzLmdldFRhZ3MoKS5hZGQobmV3UmVzb3VyY2VOYW1lKTsKKworCQkJdXNlci5zZXRVc2VySWQoVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJJZCgpKTsKKwkJCVJlc3RSZXNwb25zZSBuZXdDcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UobmV3UmVzb3VyY2VEZXRhaWxzLCB1c2VyKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGluZyByZXNvdXJjZSIsIDIwMSwgbmV3Q3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCVJlc291cmNlIG5ld1Jlc291cmNlID0gZ3Nvbi5mcm9tSnNvbihuZXdDcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKworCQkJUmVzdFJlc3BvbnNlIGFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IGdldFJlc291cmNlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uKG5ld1Jlc291cmNlLmdldFVuaXF1ZUlkKCksIHVzZXIpOworCisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCBhbGxBZGRpdGlvbmFsSW5mb3JtYXRpb24pOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvbi5nZXRFcnJvckNvZGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDIwMCwgYWxsQWRkaXRpb25hbEluZm9ybWF0aW9uLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIHVwZGF0ZWRKc29uID0gZ3Nvbi5mcm9tSnNvbihhbGxBZGRpdGlvbmFsSW5mb3JtYXRpb24uZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbi5jbGFzcyk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIG51bWJlciBvZiBwYXJhbWV0ZXJzIiwgMCwgdXBkYXRlZEpzb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisJCQkvLyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gaW5mbyA9CisJCQkvLyB1cGRhdGVkSnNvbi5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKwkJCVN0cmluZyBuZXdSZXNvdXJjZUlkID0gbmV3UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJCWNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24obmV3UmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkJYWxsQWRkaXRpb25hbEluZm9ybWF0aW9uID0gZ2V0UmVzb3VyY2VBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb24obmV3UmVzb3VyY2VJZCwgdXNlcik7CisKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIGFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvbik7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgYWxsQWRkaXRpb25hbEluZm9ybWF0aW9uLmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMjAwLCBhbGxBZGRpdGlvbmFsSW5mb3JtYXRpb24uZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJCXVwZGF0ZWRKc29uID0gZ3Nvbi5mcm9tSnNvbihhbGxBZGRpdGlvbmFsSW5mb3JtYXRpb24uZ2V0UmVzcG9uc2UoKSwgQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbi5jbGFzcyk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIG51bWJlciBvZiBwYXJhbWV0ZXJzIiwgMSwgdXBkYXRlZEpzb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2FtZVByb3BlcnR5QWZ0ZXJDaUNPUmVzb3VyY2UoKSB7CisKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJY3JlYXRlUmVzb3VyY2VSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB1c2VyKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgaW52YWxpZCB0eXBlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiA9ICIwLjEiOworCQkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyh1c2VyLAorCQkJLy8gY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisKKwkJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQkJU3RyaW5nIHZhbHVlID0gIkJCQkIiOworCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVByb3BlcnR5ID0gY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb24ocmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCB1c2VyKTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgMjAxLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkJcmVzb3VyY2Uuc2V0VW5pcXVlSWQocmVzb3VyY2VJZCk7CisJCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY2hlY2tJblJlc3BvbnNlKTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMCwgY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQlSZXNvdXJjZSByZXNvdXJjZUFmdGVyT3BlcmF0aW9uID0gZ3Nvbi5mcm9tSnNvbihjaGVja0luUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDEsIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuZ2V0KDApLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisJCQlSZXN0UmVzcG9uc2UgY2hlY2tPdXRSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjaGVja091dFJlc3BvbnNlKTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY2hlY2tPdXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCAyMDAsIGNoZWNrT3V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJCVJlc291cmNlIHJlc291cmNlQWZ0ZXJDb09wZXJhdGlvbiA9IGdzb24uZnJvbUpzb24oY2hlY2tPdXRSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDEsIHJlc291cmNlQWZ0ZXJDb09wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCByZXNvdXJjZUFmdGVyQ29PcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuZ2V0KDApLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisJCQlTdHJpbmcgbmV3UmVzb3VyY2VJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNoZWNrT3V0UmVzcG9uc2UpOworCisJCQlTdHJpbmcga2V5MiA9ICJaWloiOworCQkJU3RyaW5nIHZhbHVlMiA9ICJCQkJCIjsKKworCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbzIgPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKG51bGwsIGtleTIsIHZhbHVlMik7CisKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eTIgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihuZXdSZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8yLCB1c2VyKTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eTIpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkyLmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5Mi5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkJUmVzdFJlc3BvbnNlIGFmdGVyQ3JlYXRlQUkgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZSh1c2VyLCBuZXdSZXNvdXJjZUlkKTsKKwkJCVJlc291cmNlIHJlc291cmNlTmV3ID0gZ3Nvbi5mcm9tSnNvbihhZnRlckNyZWF0ZUFJLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwgcmVzb3VyY2VOZXcuZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMiwgcmVzb3VyY2VOZXcuZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuZ2V0KDApLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisJCQlyZXNvdXJjZS5zZXRVbmlxdWVJZChuZXdSZXNvdXJjZUlkKTsKKwkJCVJlc291cmNlIGNlcnRpZmllZFJlc291cmNlID0gY2VydGlmeVJlc291cmNlKHVzZXIsIHJlc291cmNlLCByZXNvdXJjZVZlcnNpb24sIDIpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLCBjZXJ0aWZpZWRSZXNvdXJjZS5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAyLCBjZXJ0aWZpZWRSZXNvdXJjZS5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKwkJCXVzZXIuc2V0VXNlcklkKFVzZXJSb2xlRW51bS5ERVNJR05FUi5nZXRVc2VySWQoKSk7CisJCQlyZXNvdXJjZS5zZXRVbmlxdWVJZChjZXJ0aWZpZWRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCVJlc3RSZXNwb25zZSBjaGVja091dFJlc3BvbnNlQWZ0ZXJDZXJ0aWZ5ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNoZWNrT3V0UmVzcG9uc2VBZnRlckNlcnRpZnkpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjaGVja091dFJlc3BvbnNlQWZ0ZXJDZXJ0aWZ5LmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMCwgY2hlY2tPdXRSZXNwb25zZUFmdGVyQ2VydGlmeS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkJUmVzb3VyY2UgcmVzb3VyY2VBZnRlckNlcnRpZnlDb09wZXJhdGlvbiA9IGdzb24uZnJvbUpzb24oY2hlY2tPdXRSZXNwb25zZUFmdGVyQ2VydGlmeS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDEsIHJlc291cmNlQWZ0ZXJDZXJ0aWZ5Q29PcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMiwgcmVzb3VyY2VBZnRlckNlcnRpZnlDb09wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CisJCX0KKworCX0KKworCS8vIHB1YmxpYyBSZXNvdXJjZSBjZXJ0aWZ5U2VydmljZShVc2VyIHVzZXIsIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsCisJLy8gU3RyaW5nIHJlc291cmNlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8KKwkvLyBSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0KKwkvLyBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2UsIHVzZXIsIHJlc291cmNlVmVyc2lvbiwKKwkvLyBMaWZlQ3ljbGVTdGF0ZXMuQ0hFQ0tJTik7CisJLy8KKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLAorCS8vIGNoZWNrSW5SZXNwb25zZSk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLAorCS8vIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAwLAorCS8vIGNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIFJlc291cmNlIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPQorCS8vIGdzb24uZnJvbUpzb24oY2hlY2tJblJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDEsCisJLy8gcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5zaXplKCkpOworCS8vIGFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwKKwkvLyByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLmdldCgwKS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKwkvLworCS8vLy8gVE9ETyBBbmRyZXkKKwkvLyBjcmVhdGVBbmRBZGRDZXJ0UmVzb3VyY2VUb1NlcnZpY2Uoc2VydmljZSwgdXNlcik7CisJLy8KKwkvLyBSZXN0UmVzcG9uc2UgcmVxNGNlcnRSZXNwb25zZSA9CisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sCisJLy8gTGlmZUN5Y2xlU3RhdGVzLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkvLworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsCisJLy8gcmVxNGNlcnRSZXNwb25zZSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCS8vIHJlcTRjZXJ0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8KKwkvLyByZXNvdXJjZUFmdGVyT3BlcmF0aW9uID0gZ3Nvbi5mcm9tSnNvbihyZXE0Y2VydFJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJLy8gUmVzb3VyY2UuY2xhc3MpOworCS8vIGFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwKKwkvLyByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLnNpemUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLAorCS8vIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuZ2V0KDApLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCS8vCisJLy8gLy9jaGFuZ2UgbW9kaWZpZXIKKwkvLyB1c2VyLnNldFVzZXJJZChVc2VyUm9sZUVudW0uVEVTVEVSLmdldFVzZXJJZCgpKTsKKwkvLworCS8vIC8vc3RhcnQgY2VydGlmaWNhdGlvbgorCS8vIFJlc3RSZXNwb25zZSBzdGFydENlcnRSZXNvdXJjZVJlc3BvbnNlMyA9CisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlLCB1c2VyLCByZXNvdXJjZVZlcnNpb24sCisJLy8gTGlmZUN5Y2xlU3RhdGVzLlNUQVJUQ0VSVElGSUNBVElPTik7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwKKwkvLyBzdGFydENlcnRSZXNvdXJjZVJlc3BvbnNlMyk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCS8vIHN0YXJ0Q2VydFJlc291cmNlUmVzcG9uc2UzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vCisJLy8gcmVzb3VyY2VBZnRlck9wZXJhdGlvbiA9CisJLy8gZ3Nvbi5mcm9tSnNvbihzdGFydENlcnRSZXNvdXJjZVJlc3BvbnNlMy5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJLy8gYXNzZXJ0RXF1YWxzKCJjaGVjayBzaXplIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24iLCAxLAorCS8vIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24uZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkuc2l6ZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDEsCisJLy8gcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisJLy8KKwkvLyAvL2NlcnRpZnkKKwkvLworCS8vIFJlc3RSZXNwb25zZSBjZXJ0aWZ5UmVzcG9uc2UgPQorCS8vIExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZSwgdXNlciwgcmVzb3VyY2VWZXJzaW9uLAorCS8vIExpZmVDeWNsZVN0YXRlcy5DRVJUSUZZKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLAorCS8vIGNlcnRpZnlSZXNwb25zZSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCS8vIGNlcnRpZnlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPSBnc29uLmZyb21Kc29uKGNlcnRpZnlSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCS8vIFJlc291cmNlLmNsYXNzKTsKKwkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIHNpemUgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIsIDEsCisJLy8gcmVzb3VyY2VBZnRlck9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKS5zaXplKCkpOworCS8vIGFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiwgMSwKKwkvLyByZXNvdXJjZUFmdGVyT3BlcmF0aW9uLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpLmdldCgwKS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKwkvLworCS8vIFJlc291cmNlIGNlcnRpZnlSZXNvdXJjZSA9IGdzb24uZnJvbUpzb24oY2VydGlmeVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJLy8gUmVzb3VyY2UuY2xhc3MpOworCS8vIHJldHVybiBjZXJ0aWZ5UmVzb3VyY2U7CisJLy8gfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEFkZENlcnRSZXNvdXJjZVRvU2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNUZXN0ZXJVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUik7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHVzZXIpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlhc3NlcnROb3ROdWxsKCJyZXNvdXJjZSB1bmlxdWVJZCBpcyBudWxsOiIsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlyZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdEFydGlmYWN0RGV0YWlscywgdXNlciwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKCJhZGQgSEVBVCBhcnRpZmFjdCB0byByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJLy8gY2VydGlmaWVkIHJlc291cmNlCisJCS8vIHJlc3BvbnNlID0gTENTYmFzZVRlc3QuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlscyk7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2VSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0VHJ1ZSgiY2VydGlmeSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzdFJlc3BvbnNlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCXJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCB1c2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0VHJ1ZSgiY2VydGlmeSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzdFJlc3BvbnNlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCXJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jVGVzdGVyVXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRUcnVlKCJjZXJ0aWZ5IHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXN0UmVzcG9uc2VSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNUZXN0ZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRUcnVlKCJjZXJ0aWZ5IHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXN0UmVzcG9uc2VSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKworCQkvLyBhZGQgcmVzb3VyY2UgaW5zdGFuY2Ugd2l0aCBIRUFUIGRlcGxveW1lbnQgYXJ0aWZhY3QgdG8gdGhlIHNlcnZpY2UKKwkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCB1c2VyLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRUcnVlKCJjZXJ0aWZ5IHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXN0UmVzcG9uc2VSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0Q29tcG9uZW50VWlkKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgdXNlciwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMSwgcmV0dXJuZWQ6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdEFkZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGdldFVzZXIoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKworCQkvLyBkZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkLCB1c2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzb3VyY2VSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyBrZXkgPSAiQUFBICBBQUEiOworCQlTdHJpbmcgdmFsdWUgPSAiIjsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCA0MDAsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXZhbHVlID0gIiI7CisKKwkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCBrZXksIHZhbHVlKTsKKworCQljcmVhdGVQcm9wZXJ0eSA9IGNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uKHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSIsIDQwMCwgY3JlYXRlUHJvcGVydHkuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJdmFsdWUgPSAiLS0tLTxiPjwvYj48PjsiOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8obnVsbCwga2V5LCB2YWx1ZSk7CisKKwkJY3JlYXRlUHJvcGVydHkgPSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihyZXNvdXJjZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIHVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHByb3BlcnR5IiwgY3JlYXRlUHJvcGVydHkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCBjcmVhdGVQcm9wZXJ0eS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcHJvcGVydHkiLCAyMDEsIGNyZWF0ZVByb3BlcnR5LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvcGVydHkvQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L0NvbXBvbmVudEluc3RhbmNlUHJvcGVydHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMWIyYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L0NvbXBvbmVudEluc3RhbmNlUHJvcGVydHlUZXN0LmphdmEKQEAgLTAsMCArMSwxMjYzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlByb3BlcnR5UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Qcm9wZXJ0eVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkF0b21pY09wZXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9wZXJ0eVJlc3RVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworLy8gb3BlbiBidWcgZm9yIHRoaXMgY2xhc3M6IERFMTk5MTA4IC0gY2xvc2VkLCBERTE5OTc0MQorcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJvdGVjdGVkIFJlc291cmNlIGJhc2ljVkZDOworCXByb3RlY3RlZCBSZXNvdXJjZSB2ZmMxRnJvbUJhc2ljVkZDOworCXByb3RlY3RlZCBSZXNvdXJjZSB2ZmMyRnJvbVZmYzE7CisJcHJvdGVjdGVkIFJlc291cmNlIHZmUmVzb3VyY2U7CisKKwlwcml2YXRlIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gZXhwZWN0ZWRQcm9wZXJ0eUxpc3Q7CisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGFjdHVhbFByb3BlcnR5TGlzdDsKKwkvLyBwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZWRTdHJpbmdWYWx1ZSA9ICJ7Tm90IERlZmF1bHQgU3RyaW5nIFZhbHVlfSI7CisJcHJvdGVjdGVkIFN0cmluZyB1cGRhdGVkU3RyaW5nVmFsdWUgPSAiTm90IERlZmF1bHQgU3RyaW5nIFZhbHVlIjsKKwlwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZWRJbnRlZ2VyVmFsdWUgPSAiNjY2IjsKKwlwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZWRCb29sZWFuVmFsdWUgPSAiZmFsc2UiOworCXByb3RlY3RlZCBTdHJpbmcgbmV3U3RyaW5nUHJvcE5hbWUgPSAic3RyaW5nUHJvcDIiOworCXByb3RlY3RlZCBTdHJpbmcgbmV3SW50ZWdlclByb3BOYW1lID0gImludGVnZXJQcm9wMiI7CisJcHJvdGVjdGVkIFN0cmluZyBuZXdCb29sZWFuUHJvcE5hbWUgPSAiYm9vbGVhblByb3AyIjsKKwkvLyBidWcgREUxOTk3NDEgcHJvdGVjdGVkIFN0cmluZyBuZXdTdHJpbmdQcm9wVmFsdWUgPSAiPHNlY29uZCBzdHJpbmcKKwkvLyB2YWx1ZT4iOworCXByb3RlY3RlZCBTdHJpbmcgbmV3U3RyaW5nUHJvcFZhbHVlID0gInNlY29uZCBzdHJpbmcgdmFsdWUiOworCXByb3RlY3RlZCBTdHJpbmcgbmV3SW50ZWdlclByb3BWYWx1ZSA9ICI4ODgiOworCXByb3RlY3RlZCBTdHJpbmcgbmV3Qm9vbGVhblByb3BWYWx1ZSA9ICJmYWxzZSI7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+KCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwl9CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHlUZXN0KCkgeworCQlzdXBlcihuYW1lLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tUmVndWxhcgorCS8vIHJlc291cmNlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBuZXN0ZWRSZXNvdXJjZVByb3BlcnR5M0xldmVscygpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGZpcnN0IHJlcworCQliYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5KEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQkvLyBzZWNvbmQgcmVzb3VyY2UKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCBiYXNpY1ZGQyk7CisJCS8vIHRoaXJkIHJlc291cmNlCisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHZmYzFGcm9tQmFzaWNWRkMpOworCQkvLyB2ZXJpZnkgcHJvcGVydHkKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRSZXNvdXJjZVByb3BlcnRpZXNUb0xpc3QodmZjMkZyb21WZmMxLCBhY3R1YWxQcm9wZXJ0eUxpc3QpOworCQlhc3NlcnRUcnVlKCJjaGVjayBsaXN0IHNpemUgZmFpbGVkLCBleHBlY3RlZCAzIiwgYWN0dWFsUHJvcGVydHlMaXN0LnNpemUoKSA9PSAzKTsKKworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tVkYKKwkvLyByZXNvdXJjZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG5lc3RlZFZmUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQliYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5KEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQl2ZmMxRnJvbUJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEludGVnZXJQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEJvb2xlYW5Qcm9wZXJ0eSgpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdmZjMUZyb21CYXNpY1ZGQyk7CisKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdCh2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisJCS8vIHZlcmlmeSBwcm9wZXJ0eQorCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3QodmZSZXNvdXJjZSwgYWN0dWFsUHJvcGVydHlMaXN0LCBudWxsKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5TGlzdHMoZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsIGFjdHVhbFByb3BlcnR5TGlzdCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbmVzdGVkVmZSZXNvdXJjZVByb3BlcnR5M0xldmVsc0FuZENwV2l0aFByb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQliYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5KEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQl2ZmMxRnJvbUJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEludGVnZXJQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEJvb2xlYW5Qcm9wZXJ0eSgpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdmZjMUZyb21CYXNpY1ZGQyk7CisKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdCh2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQkvLyBmb3VyIHJlc291cmNlCisJCVJlc291cmNlIGNwID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5DUCwKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uTkVUV09SSywgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIGNwU3RyaW5nUHJvcGVydHkgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKTsKKwkJY3BTdHJpbmdQcm9wZXJ0eS5zZXROYW1lKCJEaWZmZXJlbnQgTmFtZSIpOworCQljcFN0cmluZ1Byb3BlcnR5LnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKCJEaWZmZXJlbnQgdmFsdWUgZnJvbSBkZWZhdWx0Iik7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShjcFN0cmluZ1Byb3BlcnR5LCBjcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKwkJY3AgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChjcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRSZXNvdXJjZVByb3BlcnRpZXNUb0xpc3QoY3AsIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKwkJLy8gY3JlYXRlIFZGICsgYWRkIFJJCisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZjMkZyb21WZmMxLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPblJlc291cmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCB2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCXZmUmVzb3VyY2UpOworCQljb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIoY3AsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIGNwLCBleHBlY3RlZFByb3BlcnR5TGlzdCwKKwkJCQl2ZlJlc291cmNlKTsKKwkJLy8gdmVyaWZ5IHByb3BlcnR5CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdCh2ZlJlc291cmNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBuZXN0ZWRDZXJ0aWZpZWRWZlJlc291cmNlUHJvcGVydHkzTGV2ZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHkoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN0cmluZ1Byb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCXZmYzFGcm9tQmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZSgKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW50ZWdlclByb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgYmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB2ZmMxRnJvbUJhc2ljVkZDKTsKKworCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZmMyRnJvbVZmYzEsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisJCS8vIHZlcmlmeSBwcm9wZXJ0eQorCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPblJlc291cmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCB2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCXZmUmVzb3VyY2UpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdCh2ZlJlc291cmNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBuZXN0ZWRWZlJlc291cmNlUHJvcGVydHkzTGV2ZWxzMlNhbWVSZXNJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQliYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5KEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQl2ZmMxRnJvbUJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEludGVnZXJQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEJvb2xlYW5Qcm9wZXJ0eSgpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdmZjMUZyb21CYXNpY1ZGQyk7CisKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdCh2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRSZXNvdXJjZVByb3BlcnRpZXNUb0xpc3QodmZjMkZyb21WZmMxLCBleHBlY3RlZFByb3BlcnR5TGlzdCk7CisJCS8vIGNyZWF0ZSBWRiArIGFkZCBSSQorCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmYzJGcm9tVmZjMSwgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIHZlcmlmeSBwcm9wZXJ0eQorCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisKKwkJY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmYzJGcm9tVmZjMSwgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVByb3BlcnR5UmVzdFV0aWxzLnVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoT25SZXNvdXJjZShjb21wb25lbnRJbnN0RGV0YWlscywgdmZjMkZyb21WZmMxLCBleHBlY3RlZFByb3BlcnR5TGlzdCwKKwkJCQl2ZlJlc291cmNlKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eUxpc3RzKGV4cGVjdGVkUHJvcGVydHlMaXN0LCBhY3R1YWxQcm9wZXJ0eUxpc3QsIGZhbHNlKTsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS11cGRhdGUgcmVzb3VyY2UKKwkvLyBwcm9wZXJ0eS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG5lc3RlZFZmUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHNVcGRhdGVGaXJzdExldmVsUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gZmlyc3QgcmVzCisJCWJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBSZXN0UmVzcG9uc2U+IHByb3BEZXRhaWxzVG9VcGRhdGUgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGREZWZhdWx0UHJvcGVydHlUb1Jlc291cmNlKFByb3BlcnR5VHlwZUVudW0uU1RSSU5HLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJU3RyaW5nIHByb3BOYW1lVG9VcGRhdGUgPSBwcm9wRGV0YWlsc1RvVXBkYXRlLmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKTsKKwkJU3RyaW5nIHByb3BUeXBlVG9VcGRhdGUgPSBwcm9wRGV0YWlsc1RvVXBkYXRlLmxlZnQoKS52YWx1ZSgpLmdldFR5cGUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKworCQl2ZmMxRnJvbUJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEludGVnZXJQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEJvb2xlYW5Qcm9wZXJ0eSgpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdmZjMUZyb21CYXNpY1ZGQyk7CisKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdCh2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisKKwkJLy8gdmVyaWZ5IHByb3BlcnR5CisJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eUxpc3RzKGV4cGVjdGVkUHJvcGVydHlMaXN0LCBhY3R1YWxQcm9wZXJ0eUxpc3QsIGZhbHNlKTsKKworCQkvLyB1cGRhdGUgcHJvcGVydHkKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzID0gUHJvcGVydHlSZXN0VXRpbHMKKwkJCQkuZ2V0UHJvcEZyb21MaXN0QnlQcm9wTmFtZUFuZFR5cGUoYWN0dWFsUHJvcGVydHlMaXN0LCBwcm9wTmFtZVRvVXBkYXRlLCBwcm9wVHlwZVRvVXBkYXRlKTsKKwkJZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscy5zZXRWYWx1ZSh1cGRhdGVkU3RyaW5nVmFsdWUpOworCQlTdHJpbmcgcHJvcFVuaXFlSWQgPSBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMKKwkJCQkudXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZSh2ZlJlc291cmNlLCBjb21wb25lbnRJbnN0RGV0YWlscywKKwkJCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMpOworCQlhc3NlcnRUcnVlKCJleHBlY3RlZCB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlIHJlc3BvbnNlIGNvZGU6ICIgKyBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdCh2ZlJlc291cmNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzID0gUHJvcGVydHlSZXN0VXRpbHMKKwkJCQkuZ2V0UHJvcEZyb21MaXN0QnlQcm9wSWRBbmRQYXRoKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcFVuaXFlSWQsIG51bGwpOworCQlhc3NlcnRUcnVlKCJwcm9wZXJ0eSB3YXMgbm90IHVwZGF0ZWQgcHJvcGVseSIsCisJCQkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5T2JqZWN0cyhleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLCBhY3R1YWxVcGRhdGVkUHJvcERldGFpbHMsIHRydWUpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbmVzdGVkVmZSZXNvdXJjZVByb3BlcnR5M0xldmVsc1VwZGF0ZVNlY29uZExldmVsUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKworCQkvLyBzZWNvbmQgcmVzb3VyY2UKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5Q3VzdG9tTm9ybWF0aXZlVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQliYXNpY1ZGQywgUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfQk9SREVSLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgUmVzdFJlc3BvbnNlPiBwcm9wRGV0YWlsc1RvVXBkYXRlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgdmZjMUZyb21CYXNpY1ZGQywKKwkJCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCVN0cmluZyBwcm9wTmFtZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXROYW1lKCk7CisJCVN0cmluZyBwcm9wVHlwZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXRUeXBlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmYzFGcm9tQmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLAorCQkJCXRydWUpOworCisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHZmYzFGcm9tQmFzaWNWRkMpOworCisJCXZmYzJGcm9tVmZjMSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmYzJGcm9tVmZjMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRSZXNvdXJjZVByb3BlcnRpZXNUb0xpc3QodmZjMkZyb21WZmMxLCBleHBlY3RlZFByb3BlcnR5TGlzdCk7CisKKwkJLy8gY3JlYXRlIFZGICsgYWRkIFJJCisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZjMkZyb21WZmMxLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPblJlc291cmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCB2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCXZmUmVzb3VyY2UpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3QodmZSZXNvdXJjZSwgYWN0dWFsUHJvcGVydHlMaXN0LCBudWxsKTsKKworCQkvLyB2ZXJpZnkgcHJvcGVydHkKKwkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5TGlzdHMoZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsIGFjdHVhbFByb3BlcnR5TGlzdCwgZmFsc2UpOworCisJCS8vIHVwZGF0ZSBwcm9wZXJ0eQorCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMgPSBQcm9wZXJ0eVJlc3RVdGlscworCQkJCS5nZXRQcm9wRnJvbUxpc3RCeVByb3BOYW1lQW5kVHlwZShhY3R1YWxQcm9wZXJ0eUxpc3QsIHByb3BOYW1lVG9VcGRhdGUsIHByb3BUeXBlVG9VcGRhdGUpOworCQlleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLnNldFZhbHVlKHVwZGF0ZWRJbnRlZ2VyVmFsdWUpOworCQlTdHJpbmcgcHJvcFVuaXFlSWQgPSBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMKKwkJCQkudXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZSh2ZlJlc291cmNlLCBjb21wb25lbnRJbnN0RGV0YWlscywKKwkJCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMpOworCQlhc3NlcnRUcnVlKAorCQkJCSJleHBlY3RlZCB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlIHJlc3BvbnNlIGNvZGU6ICIgKyBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MKKwkJCQkJCSsgIiAsYnV0IHdhcyAiICsgdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZS5nZXRFcnJvckNvZGUoKSwKKwkJCQl1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzID0gUHJvcGVydHlSZXN0VXRpbHMKKwkJCQkuZ2V0UHJvcEZyb21MaXN0QnlQcm9wSWRBbmRQYXRoKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcFVuaXFlSWQsIG51bGwpOworCQlhc3NlcnRUcnVlKCJwcm9wZXJ0eSB3YXMgbm90IHVwZGF0ZWQgcHJvcGVybHkiLAorCQkJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eU9iamVjdHMoZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscywgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzLCB0cnVlKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG5lc3RlZFZmUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHNVcGRhdGVUaGlyZExldmVsUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQliYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5KEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQl2ZmMxRnJvbUJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEludGVnZXJQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGJhc2ljVkZDKTsKKworCQkvLyB0aGlyZCByZXNvdXJjZQorCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeUN1c3RvbU5vcm1hdGl2ZVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJdmZjMUZyb21CYXNpY1ZGQywgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19EQVRBQkFTRSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFJlc3RSZXNwb25zZT4gcHJvcERldGFpbHNUb1VwZGF0ZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCksIHZmYzJGcm9tVmZjMSwKKwkJCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCVN0cmluZyBwcm9wTmFtZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXROYW1lKCk7CisJCVN0cmluZyBwcm9wVHlwZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXRUeXBlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmYzJGcm9tVmZjMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sCisJCQkJdHJ1ZSk7CisKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdCh2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdCh2ZlJlc291cmNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCisJCS8vIHZlcmlmeSBwcm9wZXJ0eQorCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisKKwkJLy8gdXBkYXRlIHByb3BlcnR5CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzCisJCQkJLmdldFByb3BGcm9tTGlzdEJ5UHJvcE5hbWVBbmRUeXBlKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcE5hbWVUb1VwZGF0ZSwgcHJvcFR5cGVUb1VwZGF0ZSk7CisJCWV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMuc2V0VmFsdWUodXBkYXRlZEJvb2xlYW5WYWx1ZSk7CisJCVN0cmluZyBwcm9wVW5pcWVJZCA9IGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscworCQkJCS51cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlKHZmUmVzb3VyY2UsIGNvbXBvbmVudEluc3REZXRhaWxzLAorCQkJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyk7CisJCWFzc2VydFRydWUoImV4cGVjdGVkIHVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UgcmVzcG9uc2UgY29kZTogIiArIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQl1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzID0gUHJvcGVydHlSZXN0VXRpbHMKKwkJCQkuZ2V0UHJvcEZyb21MaXN0QnlQcm9wSWRBbmRQYXRoKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcFVuaXFlSWQsIG51bGwpOworCQlhc3NlcnRUcnVlKCJwcm9wZXJ0eSB3YXMgbm90IHVwZGF0ZWQgcHJvcGVseSIsCisJCQkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5T2JqZWN0cyhleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLCBhY3R1YWxVcGRhdGVkUHJvcERldGFpbHMsIHRydWUpKTsKKworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVNlcnZpY2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8qKgorCSAqIFNlcnZpY2UtLT5WRjEoaW5zdCktLT5WRi0tPihWRkMoaW5zdCktLT5WRkMtLT5WRkMtLT5WRkMpIChwMykgKHAyKSAocDEpCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlV2l0aE5lc3RlZFJlc291cmNlUHJvcGVydHkzTGV2ZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJYmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCBiYXNpY1ZGQyk7CisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHZmYzFGcm9tQmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZmMyRnJvbVZmYzEsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZjMkZyb21WZmMxLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZSh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZlJlc291cmNlLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHNlcnZpY2UsCisJCQkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisKKwl9CisKKwkvKioKKwkgKiBTZXJ2aWNlLS0+VkYxKGluc3QpLS0+VkYtLT4oVkZDKGluc3QpLS0+VkZDLS0+VkZDLS0+VkZDKSAocDQpIChwMykgKHAyKQorCSAqIChwMSkKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VXaXRoTmVzdGVkUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHNBbmRWZlByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJYmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCBiYXNpY1ZGQyk7CisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHZmYzFGcm9tQmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZmMyRnJvbVZmYzEsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZjMkZyb21WZmMxLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPblJlc291cmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCB2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCXZmUmVzb3VyY2UpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCk7CisJCXByb3BEZXRhaWxzLnNldE5hbWUobmV3Qm9vbGVhblByb3BOYW1lKTsKKwkJcHJvcERldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUobmV3Qm9vbGVhblByb3BWYWx1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wRGV0YWlscywgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJcHJvcERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKTsKKwkJcHJvcERldGFpbHMuc2V0TmFtZShuZXdTdHJpbmdQcm9wTmFtZSk7CisJCXByb3BEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKG5ld1N0cmluZ1Byb3BWYWx1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wRGV0YWlscywgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJcHJvcERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW50ZWdlclByb3BlcnR5KCk7CisJCXByb3BEZXRhaWxzLnNldE5hbWUobmV3SW50ZWdlclByb3BOYW1lKTsKKwkJcHJvcERldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUobmV3SW50ZWdlclByb3BWYWx1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wRGV0YWlscywgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRSZXNvdXJjZVByb3BlcnRpZXNUb0xpc3QodmZSZXNvdXJjZSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZlJlc291cmNlLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHNlcnZpY2UsCisJCQkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisKKwl9CisKKwkvKioKKwkgKiBTZXJ2aWNlLS0+VkYxKGluc3QpLS0+VkYtLT4oVkZDKGluc3QpLS0+VkZDLS0+VkZDLS0+VkZDKSAocDQpIChwMykgKHAyKQorCSAqIChwMSkgQ1AoVkYgaW5zdCkgKHA1KQorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZVdpdGhOZXN0ZWRSZXNvdXJjZVByb3BlcnR5M0xldmVsc0FuZENwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJYmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCBiYXNpY1ZGQyk7CisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHZmYzFGcm9tQmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZmMyRnJvbVZmYzEsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCS8vIGZvdXIgcmVzb3VyY2UKKwkJUmVzb3VyY2UgY3AgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLkNQLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ORVRXT1JLLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgY3BTdHJpbmdQcm9wZXJ0eSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpOworCQljcFN0cmluZ1Byb3BlcnR5LnNldE5hbWUoIkRpZmZlcmVudCBOYW1lIik7CisJCWNwU3RyaW5nUHJvcGVydHkuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoIkRpZmZlcmVudCB2YWx1ZSBmcm9tIGRlZmF1bHQiKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKGNwU3RyaW5nUHJvcGVydHksIGNwLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCQljcCA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KGNwLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdChjcCwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihjcCwgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPblJlc291cmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCBjcCwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmUmVzb3VyY2UsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVByb3BlcnR5UmVzdFV0aWxzLnVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoT25Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0RGV0YWlscywgc2VydmljZSwKKwkJCQlleHBlY3RlZFByb3BlcnR5TGlzdCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHNlcnZpY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eUxpc3RzKGV4cGVjdGVkUHJvcGVydHlMaXN0LCBhY3R1YWxQcm9wZXJ0eUxpc3QsIGZhbHNlKTsKKworCX0KKworCS8qKgorCSAqIFNlcnZpY2UtLT5WRjEoaW5zdCktLT5WRi0tPihWRkMoaW5zdCktLT5WRkMtLT5WRkMtLT5WRkMpIChwNCkgKHAzKSAocDIpCisJICogKHAxKSBDUChpbnN0KSAocDUpCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlV2l0aE5lc3RlZFJlc291cmNlUHJvcGVydHkzTGV2ZWxzQW5kQ3BSZXNJbnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJYmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCBiYXNpY1ZGQyk7CisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHZmYzFGcm9tQmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZmMyRnJvbVZmYzEsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIGV4cGVjdGVkUHJvcGVydHlMaXN0ID0KKwkJLy8gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KHZmYzJGcm9tVmZjMSwKKwkJLy8gZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCS8vIGZvdXIgcmVzb3VyY2UKKwkJUmVzb3VyY2UgY3AgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLkNQLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ORVRXT1JLLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgY3BTdHJpbmdQcm9wZXJ0eSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpOworCQljcFN0cmluZ1Byb3BlcnR5LnNldE5hbWUoIkRpZmZlcmVudCBOYW1lIik7CisJCWNwU3RyaW5nUHJvcGVydHkuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoIkRpZmZlcmVudCB2YWx1ZSBmcm9tIGRlZmF1bHQiKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKGNwU3RyaW5nUHJvcGVydHksIGNwLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShjcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCQljcCA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KGNwLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gU2VydmljZQorCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCW51bGwpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdChjcCwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZlJlc291cmNlLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHNlcnZpY2UsCisJCQkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCQljb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIoY3AsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVByb3BlcnR5UmVzdFV0aWxzLnVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoT25Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0RGV0YWlscywgc2VydmljZSwKKwkJCQlleHBlY3RlZFByb3BlcnR5TGlzdCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHNlcnZpY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eUxpc3RzKGV4cGVjdGVkUHJvcGVydHlMaXN0LCBhY3R1YWxQcm9wZXJ0eUxpc3QsIGZhbHNlKTsKKworCX0KKworCS8qKgorCSAqIFNlcnZpY2UtLT5WRjEoaW5zdCktLT5WRi0tPihWRkMoaW5zdCktLT5WRkMtLT5WRkMtLT5WRkMpIHwgKHAzKSAocDIpIChwMSkKKwkgKiB8IChWRkMoaW5zdCktLT5WRkMtLT5WRkMtLT5WRkMpIChwMykgKHAyKSAocDEpCisJICogCisJICogVkYyKGluc3QpLS0+VkYtLT4oVkZDKGluc3QpLS0+VkZDLS0+VkZDLS0+VkZDKSB8IChwMycpIChwMicpIChwMScpIHwKKwkgKiAoVkZDKGluc3QpLS0+VkZDLS0+VkZDLS0+VkZDKSAocDMpIChwMikgKHAxKQorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5lc3RlZFZmUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHMyU2FtZVJlc0luc3RhbmNlcygpIHRocm93cyBFeGNlcHRpb24geworCisJCWJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHkoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN0cmluZ1Byb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCXZmYzFGcm9tQmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZSgKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW50ZWdlclByb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgYmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB2ZmMxRnJvbUJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdCh2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQkvLyB2ZXJpZnkgcHJvcGVydHkKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPblJlc291cmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCB2ZmMyRnJvbVZmYzEsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCXZmUmVzb3VyY2UpOworCisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHZmYzJGcm9tVmZjMSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJdmZSZXNvdXJjZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eUxpc3RzKGV4cGVjdGVkUHJvcGVydHlMaXN0LCBhY3R1YWxQcm9wZXJ0eUxpc3QsIGZhbHNlKTsKKworCQkvLyBTZXJ2aWNlCisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+KCk7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3QodmZSZXNvdXJjZSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJbnVsbCk7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3QodmZSZXNvdXJjZSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJbnVsbCk7CisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZlJlc291cmNlLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHNlcnZpY2UsCisJCQkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCQljb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZSZXNvdXJjZSwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPbkNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCBzZXJ2aWNlLAorCQkJCWV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3Qoc2VydmljZSwgYWN0dWFsUHJvcGVydHlMaXN0LCBudWxsKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5TGlzdHMoZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsIGFjdHVhbFByb3BlcnR5TGlzdCwgZmFsc2UpOworCisJfQorCisJLy8gc2VydmljZSB0ZXN0IHRlbXBsYXRlCisJLyoqCisJICogU2VydmljZS0tPlZGKGluc3QpLS0+VkYtLT4oVkZDKGluc3QpLS0+VkZDLS0+VkZDLS0+VkZDKSAocDQpIChwMykgKHAyKQorCSAqIChwMSkKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VOZXN0ZWRWZlJlc291cmNlUHJvcGVydHkzTGV2ZWxzQW5kU2VsZlZmUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQliYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5KEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQl2ZmMxRnJvbUJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEludGVnZXJQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEJvb2xlYW5Qcm9wZXJ0eSgpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdmZjMUZyb21CYXNpY1ZGQyk7CisJCXZmYzJGcm9tVmZjMSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmYzJGcm9tVmZjMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgbmV3UHJvcCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpOworCQluZXdQcm9wLnNldE5hbWUobmV3U3RyaW5nUHJvcE5hbWUpOworCQluZXdQcm9wLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKG5ld1N0cmluZ1Byb3BWYWx1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShuZXdQcm9wLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZSh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCS8vIFNlcnZpY2UKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+KCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdCh2ZlJlc291cmNlLCBleHBlY3RlZFByb3BlcnR5TGlzdCwKKwkJCQludWxsKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmUmVzb3VyY2UsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVByb3BlcnR5UmVzdFV0aWxzLnVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoT25Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0RGV0YWlscywgc2VydmljZSwKKwkJCQlleHBlY3RlZFByb3BlcnR5TGlzdCk7CisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHNlcnZpY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eUxpc3RzKGV4cGVjdGVkUHJvcGVydHlMaXN0LCBhY3R1YWxQcm9wZXJ0eUxpc3QsIGZhbHNlKTsKKworCX0KKworCS8qKgorCSAqIHVwZGF0ZSBwcm9wZXJ0eShwNCkKKwkgKiAKKwkgKiAKKwkgKiBWRkMocDEpIF4gfCBWRkMocDIpIF4gfCBTZXJ2aWNlLS0+VkYoaW5zdCktLT5WRi0tPihWRkMoaW5zdCktLT5WRkMocDMpCisJICogKHA0KQorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5lc3RlZFZmUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHNBbmRTZWxmVmZQcm9wZXJ0eV9VcGRhdGVWZnByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBWRkMoY2hlY2staW4gc3RhdGUpIGRlcml2ZWQgZnJvbSBhbm90aGVyIHJlc291cmNlCisJCWJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHkoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN0cmluZ1Byb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCXZmYzFGcm9tQmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZSgKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW50ZWdlclByb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgYmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB2ZmMxRnJvbUJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCS8vIGNyZWF0ZSBWRiArIGFkZCBSSQorCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmYzJGcm9tVmZjMSwgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKworCQkvLyBhZGQgcHJvcGVydHkgdG8gVkYKKwkJUHJvcGVydHlSZXFEZXRhaWxzIG5ld1Byb3AgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKTsKKwkJbmV3UHJvcC5zZXROYW1lKG5ld1N0cmluZ1Byb3BOYW1lKTsKKwkJbmV3UHJvcC5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShuZXdTdHJpbmdQcm9wVmFsdWUpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgUmVzdFJlc3BvbnNlPiBwcm9wRGV0YWlsc1RvVXBkYXRlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKG5ld1Byb3AsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCVN0cmluZyBwcm9wTmFtZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXROYW1lKCk7CisJCVN0cmluZyBwcm9wVHlwZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXRUeXBlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gU2VydmljZQorCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCW51bGwpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQljb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZSZXNvdXJjZSwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPbkNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCBzZXJ2aWNlLAorCQkJCWV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisKKwkJLy8gdXBkYXRlIFZGIGluc3RhbmNlIHByb3BlcnR5CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzCisJCQkJLmdldFByb3BGcm9tTGlzdEJ5UHJvcE5hbWVBbmRUeXBlKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcE5hbWVUb1VwZGF0ZSwgcHJvcFR5cGVUb1VwZGF0ZSk7CisJCWV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMuc2V0VmFsdWUodXBkYXRlZFN0cmluZ1ZhbHVlKTsKKwkJU3RyaW5nIHByb3BVbmlxZUlkID0gZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzCisJCQkJLnVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2Uoc2VydmljZSwgY29tcG9uZW50SW5zdERldGFpbHMsCisJCQkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZSByZXNwb25zZSBjb2RlOiAiICsgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCXVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzID0gUHJvcGVydHlSZXN0VXRpbHMKKwkJCQkuZ2V0UHJvcEZyb21MaXN0QnlQcm9wSWRBbmRQYXRoKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcFVuaXFlSWQsIG51bGwpOworCQlhc3NlcnRUcnVlKCJwcm9wZXJ0eSB3YXMgbm90IHVwZGF0ZWQgcHJvcGVseSIsCisJCQkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5T2JqZWN0cyhleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLCBhY3R1YWxVcGRhdGVkUHJvcERldGFpbHMsIHRydWUpKTsKKworCX0KKworCS8qKgorCSAqIHVwZGF0ZSBwcm9wZXJ0eShwMSkKKwkgKiBTZXJ2aWNlLS0+VkYoaW5zdCktLT5WRi0tPihWRkMoaW5zdCktLT5WRkMtLT5WRkMtLT5WRkMpIChwNCkgKHAzKSAocDIpCisJICogKHAxKQorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5lc3RlZFZmUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHNBbmRTZWxmVmZQcm9wZXJ0eVVwZGF0ZVZmSW5oZXJpdGFuY2UxTGV2ZWxQcm9wZXJ0eSgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQliYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgUmVzdFJlc3BvbnNlPiBwcm9wRGV0YWlsc1RvVXBkYXRlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkRGVmYXVsdFByb3BlcnR5VG9SZXNvdXJjZShQcm9wZXJ0eVR5cGVFbnVtLlNUUklORywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCVN0cmluZyBwcm9wTmFtZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXROYW1lKCk7CisJCVN0cmluZyBwcm9wVHlwZVRvVXBkYXRlID0gcHJvcERldGFpbHNUb1VwZGF0ZS5sZWZ0KCkudmFsdWUoKS5nZXRUeXBlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCXZmYzFGcm9tQmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZSgKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW50ZWdlclByb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgYmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB2ZmMxRnJvbUJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCS8vIGNyZWF0ZSBWRiArIGFkZCBSSQorCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmYzJGcm9tVmZjMSwgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gdmVyaWZ5IHByb3BlcnR5CisJCVByb3BlcnR5UmVxRGV0YWlscyBuZXdQcm9wID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN0cmluZ1Byb3BlcnR5KCk7CisJCW5ld1Byb3Auc2V0TmFtZShuZXdTdHJpbmdQcm9wTmFtZSk7CisJCW5ld1Byb3Auc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUobmV3U3RyaW5nUHJvcFZhbHVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKG5ld1Byb3AsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gU2VydmljZQorCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCW51bGwpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQljb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZSZXNvdXJjZSwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPbkNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCBzZXJ2aWNlLAorCQkJCWV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisKKwkJLy8gdXBkYXRlIFZGIHByb3BlcnR5CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzCisJCQkJLmdldFByb3BGcm9tTGlzdEJ5UHJvcE5hbWVBbmRUeXBlKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcE5hbWVUb1VwZGF0ZSwgcHJvcFR5cGVUb1VwZGF0ZSk7CisJCWV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMuc2V0VmFsdWUodXBkYXRlZFN0cmluZ1ZhbHVlKTsKKwkJU3RyaW5nIHByb3BVbmlxZUlkID0gZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzCisJCQkJLnVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2Uoc2VydmljZSwgY29tcG9uZW50SW5zdERldGFpbHMsCisJCQkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZSByZXNwb25zZSBjb2RlOiAiICsgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCXVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzID0gUHJvcGVydHlSZXN0VXRpbHMKKwkJCQkuZ2V0UHJvcEZyb21MaXN0QnlQcm9wSWRBbmRQYXRoKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcFVuaXFlSWQsIG51bGwpOworCQlhc3NlcnRUcnVlKCJwcm9wZXJ0eSB3YXMgbm90IHVwZGF0ZWQgcHJvcGVseSIsCisJCQkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5T2JqZWN0cyhleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLCBhY3R1YWxVcGRhdGVkUHJvcERldGFpbHMsIHRydWUpKTsKKworCX0KKworCS8qKgorCSAqIHVwZGF0ZSBwcm9wZXJ0eShwMikKKwkgKiBTZXJ2aWNlLS0+VkYoaW5zdCktLT5WRi0tPihWRkMoaW5zdCktLT5WRkMtLT5WRkMtLT5WRkMpIChwNCkgKHAzKSAocDIpCisJICogKHAxKQorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5lc3RlZFZmUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHNBbmRTZWxmVmZQcm9wZXJ0eVVwZGF0ZVZmSW5oZXJpdGFuY2UyTGV2ZWxQcm9wZXJ0eSgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQliYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5KEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQl2ZmMxRnJvbUJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlDdXN0b21Ob3JtYXRpdmVUeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCWJhc2ljVkZDLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5BUFBMSUNBVElPTl9MNF9CT1JERVIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBSZXN0UmVzcG9uc2U+IHByb3BEZXRhaWxzVG9VcGRhdGUgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEludGVnZXJQcm9wZXJ0eSgpLCB2ZmMxRnJvbUJhc2ljVkZDLAorCQkJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJU3RyaW5nIHByb3BOYW1lVG9VcGRhdGUgPSBwcm9wRGV0YWlsc1RvVXBkYXRlLmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKTsKKwkJU3RyaW5nIHByb3BUeXBlVG9VcGRhdGUgPSBwcm9wRGV0YWlsc1RvVXBkYXRlLmxlZnQoKS52YWx1ZSgpLmdldFR5cGUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZjMUZyb21CYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksCisJCQkJdHJ1ZSk7CisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHZmYzFGcm9tQmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZmMyRnJvbVZmYzEsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gY3JlYXRlIFZGICsgYWRkIFJJCisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZjMkZyb21WZmMxLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCisJCS8vIHZlcmlmeSBwcm9wZXJ0eQorCQlQcm9wZXJ0eVJlcURldGFpbHMgbmV3UHJvcCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpOworCQluZXdQcm9wLnNldE5hbWUobmV3U3RyaW5nUHJvcE5hbWUpOworCQluZXdQcm9wLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKG5ld1N0cmluZ1Byb3BWYWx1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShuZXdQcm9wLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZSh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSk7CisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCS8vIFNlcnZpY2UKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+KCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdCh2ZlJlc291cmNlLCBleHBlY3RlZFByb3BlcnR5TGlzdCwKKwkJCQludWxsKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmUmVzb3VyY2UsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVByb3BlcnR5UmVzdFV0aWxzLnVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoT25Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0RGV0YWlscywgc2VydmljZSwKKwkJCQlleHBlY3RlZFByb3BlcnR5TGlzdCk7CisKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3Qoc2VydmljZSwgYWN0dWFsUHJvcGVydHlMaXN0LCBudWxsKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMuY29tcGFyZVByb3BlcnR5TGlzdHMoZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsIGFjdHVhbFByb3BlcnR5TGlzdCwgZmFsc2UpOworCisJCS8vIHVwZGF0ZSBWRiBwcm9wZXJ0eQorCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMgPSBQcm9wZXJ0eVJlc3RVdGlscworCQkJCS5nZXRQcm9wRnJvbUxpc3RCeVByb3BOYW1lQW5kVHlwZShhY3R1YWxQcm9wZXJ0eUxpc3QsIHByb3BOYW1lVG9VcGRhdGUsIHByb3BUeXBlVG9VcGRhdGUpOworCQlleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLnNldFZhbHVlKHVwZGF0ZWRJbnRlZ2VyVmFsdWUpOworCQlTdHJpbmcgcHJvcFVuaXFlSWQgPSBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMKKwkJCQkudXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlLCBjb21wb25lbnRJbnN0RGV0YWlscywKKwkJCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMpOworCQlhc3NlcnRUcnVlKCJleHBlY3RlZCB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlIHJlc3BvbnNlIGNvZGU6ICIgKyBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGFjdHVhbFVwZGF0ZWRQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzCisJCQkJLmdldFByb3BGcm9tTGlzdEJ5UHJvcElkQW5kUGF0aChhY3R1YWxQcm9wZXJ0eUxpc3QsIHByb3BVbmlxZUlkLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZSgicHJvcGVydHkgd2FzIG5vdCB1cGRhdGVkIHByb3BlbHkiLAorCQkJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eU9iamVjdHMoZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscywgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzLCB0cnVlKSk7CisKKwl9CisKKwkvKioKKwkgKiB1cGRhdGUgcHJvcGVydHkocDMpCisJICogU2VydmljZS0tPlZGKGluc3QpLS0+VkYtLT4oVkZDKGluc3QpLS0+VkZDLS0+VkZDLS0+VkZDKSAocDQpIChwMykgKHAyKQorCSAqIChwMSkKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VOZXN0ZWRWZlJlc291cmNlUHJvcGVydHkzTGV2ZWxzQW5kU2VsZlZmUHJvcGVydHlVcGRhdGVWZkluaGVyaXRhbmNlM0xldmVsUHJvcGVydHkoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJYmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCBiYXNpY1ZGQyk7CisJCXZmYzJGcm9tVmZjMSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5Q3VzdG9tTm9ybWF0aXZlVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQl2ZmMxRnJvbUJhc2ljVkZDLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0RBVEFCQVNFLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgUmVzdFJlc3BvbnNlPiBwcm9wRGV0YWlsc1RvVXBkYXRlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwgdmZjMkZyb21WZmMxLAorCQkJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJU3RyaW5nIHByb3BOYW1lVG9VcGRhdGUgPSBwcm9wRGV0YWlsc1RvVXBkYXRlLmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKTsKKwkJU3RyaW5nIHByb3BUeXBlVG9VcGRhdGUgPSBwcm9wRGV0YWlsc1RvVXBkYXRlLmxlZnQoKS52YWx1ZSgpLmdldFR5cGUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwKKwkJCQl0cnVlKTsKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCS8vIGNyZWF0ZSBWRiArIGFkZCBSSQorCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmYzJGcm9tVmZjMSwgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gdmVyaWZ5IHByb3BlcnR5CisJCVByb3BlcnR5UmVxRGV0YWlscyBuZXdQcm9wID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN0cmluZ1Byb3BlcnR5KCk7CisJCW5ld1Byb3Auc2V0TmFtZShuZXdTdHJpbmdQcm9wTmFtZSk7CisJCW5ld1Byb3Auc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUobmV3U3RyaW5nUHJvcFZhbHVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKG5ld1Byb3AsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gU2VydmljZQorCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCW51bGwpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQljb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZSZXNvdXJjZSwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPbkNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCBzZXJ2aWNlLAorCQkJCWV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisKKwkJLy8gdXBkYXRlIFZGIHByb3BlcnR5CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzCisJCQkJLmdldFByb3BGcm9tTGlzdEJ5UHJvcE5hbWVBbmRUeXBlKGFjdHVhbFByb3BlcnR5TGlzdCwgcHJvcE5hbWVUb1VwZGF0ZSwgcHJvcFR5cGVUb1VwZGF0ZSk7CisJCWV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMuc2V0VmFsdWUodXBkYXRlZEJvb2xlYW5WYWx1ZSk7CisJCVN0cmluZyBwcm9wVW5pcWVJZCA9IGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscworCQkJCS51cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlKHNlcnZpY2UsIGNvbXBvbmVudEluc3REZXRhaWxzLAorCQkJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyk7CisJCWFzc2VydFRydWUoImV4cGVjdGVkIHVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UgcmVzcG9uc2UgY29kZTogIiArIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQl1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3Qoc2VydmljZSwgYWN0dWFsUHJvcGVydHlMaXN0LCBudWxsKTsKKworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGFjdHVhbFVwZGF0ZWRQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzCisJCQkJLmdldFByb3BGcm9tTGlzdEJ5UHJvcElkQW5kUGF0aChhY3R1YWxQcm9wZXJ0eUxpc3QsIHByb3BVbmlxZUlkLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZSgicHJvcGVydHkgd2FzIG5vdCB1cGRhdGVkIHByb3BlbHkiLAorCQkJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eU9iamVjdHMoZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscywgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzLCB0cnVlKSk7CisKKwl9CisKKwkvKioKKwkgKiB1cGRhdGUgcHJvcGVydHkgcDUnCisJICogU2VydmljZS0tPlZGMShpbnN0KS0tPlZGLS0+KFZGQyhpbnN0KS0tPlZGQy0tPlZGQy0tPlZGQykgKHA0KSAocDMpIChwMikKKwkgKiAocDEpIENQKGluc3Qgb24gVkYpIChwNSkgQ1AoaW5zdCkgKHA1JykKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VXaXRoTmVzdGVkUmVzb3VyY2VQcm9wZXJ0eTNMZXZlbHNBbmRDcE9uVmZVcGRhdGVDcEluc3RhbmNlT2ZTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJhc2ljVkZDID0gY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHkoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFN0cmluZ1Byb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCXZmYzFGcm9tQmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZSgKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW50ZWdlclByb3BlcnR5KCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgYmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eURlcml2ZWRGcm9tT3RoZXJSZXNvdXJjZShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB2ZmMxRnJvbUJhc2ljVkZDKTsKKwkJdmZjMkZyb21WZmMxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZjMkZyb21WZmMxLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQkvLyBleHBlY3RlZFByb3BlcnR5TGlzdCA9CisJCS8vIFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdCh2ZmMyRnJvbVZmYzEsCisJCS8vIGV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQkvLyBmb3VyIHJlc291cmNlCisJCVJlc291cmNlIGNwID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5DUCwKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uTkVUV09SSywgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIGNwU3RyaW5nUHJvcGVydHkgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKTsKKwkJY3BTdHJpbmdQcm9wZXJ0eS5zZXROYW1lKCJEaWZmZXJlbnQgTmFtZSIpOworCQljcFN0cmluZ1Byb3BlcnR5LnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKCJEaWZmZXJlbnQgdmFsdWUgZnJvbSBkZWZhdWx0Iik7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShjcFN0cmluZ1Byb3BlcnR5LCBjcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoY3AsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKwkJY3AgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChjcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJLy8gY3JlYXRlIFZGICsgYWRkIFJJCisJCXZmUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIodmZjMkZyb21WZmMxLCB2ZlJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQljb21wb25lbnRJbnN0RGV0YWlscyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIoY3AsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gU2VydmljZQorCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHZmUmVzb3VyY2UsIGV4cGVjdGVkUHJvcGVydHlMaXN0LAorCQkJCW51bGwpOworCQlleHBlY3RlZFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZFJlc291cmNlUHJvcGVydGllc1RvTGlzdChjcCwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZlJlc291cmNlLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHNlcnZpY2UsCisJCQkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihjcCwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhPbkNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3REZXRhaWxzLCBzZXJ2aWNlLAorCQkJCWV4cGVjdGVkUHJvcGVydHlMaXN0KTsKKworCQkvLyBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLAorCQkvLyBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBQcm9wZXJ0eVJlc3RVdGlscy5hZGRDb21wb25lbnRJbnN0UHJvcGVydGllc1RvTGlzdChzZXJ2aWNlLCBhY3R1YWxQcm9wZXJ0eUxpc3QsIG51bGwpOworCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlMaXN0cyhleHBlY3RlZFByb3BlcnR5TGlzdCwgYWN0dWFsUHJvcGVydHlMaXN0LCBmYWxzZSk7CisKKwkJU3RyaW5nIHByb3BOYW1lVG9VcGRhdGUgPSAiY2lkciI7CisJCVN0cmluZyBwcm9wVHlwZVRvVXBkYXRlID0gInN0cmluZyI7CisKKwkJLy8gdXBkYXRlIENQIHByb3BlcnR5CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzLmdldENvbXBQcm9wSW5zdExpc3RCeUluc3RJZEFuZFByb3BOYW1lKAorCQkJCXNlcnZpY2UsIGNvbXBvbmVudEluc3REZXRhaWxzLCBwcm9wTmFtZVRvVXBkYXRlLCBwcm9wVHlwZVRvVXBkYXRlKTsKKwkJZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscy5zZXRWYWx1ZSh1cGRhdGVkU3RyaW5nVmFsdWUpOworCQlTdHJpbmcgcHJvcFVuaXFlSWQgPSBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCUxpc3Q8U3RyaW5nPiBwYXRoID0gZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscy5nZXRQYXRoKCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMKKwkJCQkudXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlLCBjb21wb25lbnRJbnN0RGV0YWlscywKKwkJCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMpOworCQlhc3NlcnRUcnVlKCJleHBlY3RlZCB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlIHJlc3BvbnNlIGNvZGU6ICIgKyBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJdXBkYXRlUHJvcGVydHlWYWx1ZU9uUmVzb3VyY2VJbnN0YW5jZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHNlcnZpY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBhY3R1YWxVcGRhdGVkUHJvcERldGFpbHMgPSBQcm9wZXJ0eVJlc3RVdGlscworCQkJCS5nZXRQcm9wRnJvbUxpc3RCeVByb3BJZEFuZFBhdGgoYWN0dWFsUHJvcGVydHlMaXN0LCBwcm9wVW5pcWVJZCwgcGF0aCk7CisJCWFzc2VydFRydWUoInByb3BlcnR5IHdhcyBub3QgdXBkYXRlZCBwcm9wZWx5IiwKKwkJCQlQcm9wZXJ0eVJlc3RVdGlscy5jb21wYXJlUHJvcGVydHlPYmplY3RzKGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMsIGFjdHVhbFVwZGF0ZWRQcm9wRGV0YWlscywgdHJ1ZSkpOworCX0KKworCS8qKgorCSAqIHVwZGF0ZSBwcm9wZXJ0eSBwNQorCSAqIFNlcnZpY2UtLT5WRjEoaW5zdCktLT5WRi0tPihWRkMoaW5zdCktLT5WRkMtLT5WRkMtLT5WRkMpIChwNCkgKHAzKSAocDIpCisJICogKHAxKSBDUChpbnN0IG9uIFZGKSAocDUpIENQKGluc3QpIChwNScpCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlV2l0aE5lc3RlZFJlc291cmNlUHJvcGVydHkzTGV2ZWxzQW5kQ3BPblZmVXBkYXRlQ3BJbnN0YW5jZU9mVmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYmFzaWNWRkMgPSBjcmVhdGVSZXNvdXJjZVdpdGhQcm9wZXJ0eShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U3RyaW5nUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJdmZjMUZyb21CYXNpY1ZGQyA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbnRlZ2VyUHJvcGVydHkoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCBiYXNpY1ZGQyk7CisJCXZmYzJGcm9tVmZjMSA9IGNyZWF0ZVJlc291cmNlV2l0aFByb3BlcnR5RGVyaXZlZEZyb21PdGhlclJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRCb29sZWFuUHJvcGVydHkoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHZmYzFGcm9tQmFzaWNWRkMpOworCQl2ZmMyRnJvbVZmYzEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdCh2ZmMyRnJvbVZmYzEsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIGV4cGVjdGVkUHJvcGVydHlMaXN0ID0KKwkJLy8gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KHZmYzJGcm9tVmZjMSwKKwkJLy8gZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCS8vIGZvdXIgcmVzb3VyY2UKKwkJUmVzb3VyY2UgY3AgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLkNQLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ORVRXT1JLLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgY3BTdHJpbmdQcm9wZXJ0eSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTdHJpbmdQcm9wZXJ0eSgpOworCQljcFN0cmluZ1Byb3BlcnR5LnNldE5hbWUoIkRpZmZlcmVudCBOYW1lIik7CisJCWNwU3RyaW5nUHJvcGVydHkuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoIkRpZmZlcmVudCB2YWx1ZSBmcm9tIGRlZmF1bHQiKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKGNwU3RyaW5nUHJvcGVydHksIGNwLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShjcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCQkvLyBjcmVhdGUgVkYgKyBhZGQgUkkKKwkJY3AgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChjcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJdmZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcih2ZmMyRnJvbVZmYzEsIHZmUmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCWNvbXBvbmVudEluc3REZXRhaWxzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihjcCwgdmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpOworCQl2ZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QodmZSZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQkvLyBTZXJ2aWNlCisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+KCk7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3QodmZSZXNvdXJjZSwgZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsCisJCQkJbnVsbCk7CisJCWV4cGVjdGVkUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KGNwLCBleHBlY3RlZFByb3BlcnR5TGlzdCk7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZmUmVzb3VyY2UsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVByb3BlcnR5UmVzdFV0aWxzLnVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoT25Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0RGV0YWlscywgc2VydmljZSwKKwkJCQlleHBlY3RlZFByb3BlcnR5TGlzdCk7CisKKwkJY29tcG9uZW50SW5zdERldGFpbHMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKGNwLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0U2VydmljZU9iamVjdChzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdERldGFpbHMsIHNlcnZpY2UsCisJCQkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpOworCisJCXNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRTZXJ2aWNlT2JqZWN0KHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFjdHVhbFByb3BlcnR5TGlzdCA9IFByb3BlcnR5UmVzdFV0aWxzLmFkZENvbXBvbmVudEluc3RQcm9wZXJ0aWVzVG9MaXN0KHNlcnZpY2UsIGFjdHVhbFByb3BlcnR5TGlzdCwgbnVsbCk7CisJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eUxpc3RzKGV4cGVjdGVkUHJvcGVydHlMaXN0LCBhY3R1YWxQcm9wZXJ0eUxpc3QsIGZhbHNlKTsKKworCQlTdHJpbmcgcHJvcE5hbWVUb1VwZGF0ZSA9ICJjaWRyIjsKKwkJU3RyaW5nIHByb3BUeXBlVG9VcGRhdGUgPSAic3RyaW5nIjsKKworCQkvLyB1cGRhdGUgQ1AgcHJvcGVydHkKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzID0gUHJvcGVydHlSZXN0VXRpbHMuZ2V0Q29tcFByb3BJbnN0TGlzdEJ5SW5zdElkQW5kUHJvcE5hbWUoCisJCQkJc2VydmljZSwgY29tcG9uZW50SW5zdERldGFpbHMsIHByb3BOYW1lVG9VcGRhdGUsIHByb3BUeXBlVG9VcGRhdGUpOworCQlleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLnNldFZhbHVlKHVwZGF0ZWRTdHJpbmdWYWx1ZSk7CisJCVN0cmluZyBwcm9wVW5pcWVJZCA9IGV4cGVjdGVkVXBkYXRlUHJvcERldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKwkJTGlzdDxTdHJpbmc+IHBhdGggPSBleHBlY3RlZFVwZGF0ZVByb3BEZXRhaWxzLmdldFBhdGgoKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscworCQkJCS51cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlKHNlcnZpY2UsIGNvbXBvbmVudEluc3REZXRhaWxzLAorCQkJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscyk7CisJCWFzc2VydFRydWUoImV4cGVjdGVkIHVwZGF0ZVByb3BlcnR5VmFsdWVPblJlc291cmNlSW5zdGFuY2UgcmVzcG9uc2UgY29kZTogIiArIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQl1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFNlcnZpY2VPYmplY3Qoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlhY3R1YWxQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJYWN0dWFsUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3Qoc2VydmljZSwgYWN0dWFsUHJvcGVydHlMaXN0LCBudWxsKTsKKworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGFjdHVhbFVwZGF0ZWRQcm9wRGV0YWlscyA9IFByb3BlcnR5UmVzdFV0aWxzCisJCQkJLmdldFByb3BGcm9tTGlzdEJ5UHJvcElkQW5kUGF0aChhY3R1YWxQcm9wZXJ0eUxpc3QsIHByb3BVbmlxZUlkLCBwYXRoKTsKKwkJYXNzZXJ0VHJ1ZSgicHJvcGVydHkgd2FzIG5vdCB1cGRhdGVkIHByb3BlbHkiLAorCQkJCVByb3BlcnR5UmVzdFV0aWxzLmNvbXBhcmVQcm9wZXJ0eU9iamVjdHMoZXhwZWN0ZWRVcGRhdGVQcm9wRGV0YWlscywgYWN0dWFsVXBkYXRlZFByb3BEZXRhaWxzLCB0cnVlKSk7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLU1ldGhvZHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBjb252ZXJ0VG9Qcm9wZXJ0eURhdGFEZWZpbml0aW9uT2JqZWN0KFByb3BlcnR5UmVxRGV0YWlscyBwcm9wKSB7CisJCVByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcERhdGFEZWYgPSBuZXcgUHJvcGVydHlEYXRhRGVmaW5pdGlvbigpOworCQlwcm9wRGF0YURlZi5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgpKTsKKwkJcHJvcERhdGFEZWYuc2V0VHlwZShwcm9wLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJcHJvcERhdGFEZWYuc2V0UGFzc3dvcmQocHJvcC5nZXRQcm9wZXJ0eVBhc3N3b3JkKCkpOworCQlwcm9wRGF0YURlZi5zZXREZXNjcmlwdGlvbihwcm9wLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7CisJCXJldHVybiBwcm9wRGF0YURlZjsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHlEZXJpdmVkRnJvbU90aGVyUmVzb3VyY2UoUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5UmVxRGV0YWlscywKKwkJCUxpZmVDeWNsZVN0YXRlc0VudW0gc3RhdGUsIFJlc291cmNlIGRlcml2ZWRGcm9tUmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZSByZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5Q3VzdG9tTm9ybWF0aXZlVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlkZXJpdmVkRnJvbVJlc291cmNlLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5BUFBMSUNBVElPTl9MNF9CT1JERVIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCWlmIChwcm9wZXJ0eVJlcURldGFpbHMgIT0gbnVsbCkgeworCQkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5UmVxRGV0YWlscywgcmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCX0KKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgc3RhdGUsIHRydWUpOworCQlyZXR1cm4gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIHJldHVybiByZXNvdXJjZTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VXaXRoUHJvcGVydHkoUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5UmVxRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bSBzdGF0ZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZSByZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlpZiAocHJvcGVydHlSZXFEZXRhaWxzICE9IG51bGwpIHsKKwkJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eVJlcURldGFpbHMsIHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQl9CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHN0YXRlLCB0cnVlKTsKKwkJcmV0dXJuIEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvcGVydHkvQ29tcG9uZW50UHJvcGVydHkuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L0NvbXBvbmVudFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjNGMxOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L0NvbXBvbmVudFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwxNzk2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eTsKKworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvcGVydHlSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlByb3BlcnR5VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50UHJvcGVydHkgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIENvbXBvbmVudFByb3BlcnR5KCkgeworCQlzdXBlcihuYW1lLCBDb21wb25lbnRQcm9wZXJ0eS5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBEYXRhUHJvdmlkZXIKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIHByb3BlcnRpZXNMaXN0RGVmYXVsdFZhbHVlU3VjY2Vzc0Zsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisJCQkJLy8gaW50ZWdlcgorCQkJCXsgImludGVnZXIiLCAiWzEsMl0iLCAiWzEsMl0iIH0sCisJCQkJeyAidG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwiLAorCQkJCQkJIlt7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wxXCIsXCJ0b2tlblwiOlwidG9rZW4xXCJ9LHtcInByb3RvY29sXCI6XCJwcm90b2NvbDJcIixcInRva2VuXCI6XCJ0b2tlbjJcIn1dIiwKKwkJCQkJCSJbe1wicHJvdG9jb2xcIjpcInByb3RvY29sMVwiLFwidG9rZW5cIjpcInRva2VuMVwifSx7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wyXCIsXCJ0b2tlblwiOlwidG9rZW4yXCJ9XSIgfSwKKwkJCQl7ICJ0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbCIsCisJCQkJCQkiW3tcInByb3RvY29sXCI6XCJwcm90b2NvbDFcIixcInRva2VuXCI6XCJ0b2tlbjFcIn0se1wicHJvdG9jb2xcIjpcInByb3RvY29sPGJyPjJcIixcInRva2VuXCI6XCJ0b2tlbjIgIDJcIn1dIiwKKwkJCQkJCSJbe1wicHJvdG9jb2xcIjpcInByb3RvY29sMVwiLFwidG9rZW5cIjpcInRva2VuMVwifSx7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wyXCIsXCJ0b2tlblwiOlwidG9rZW4yIDJcIn1dIiB9LAorCQkJCXsgInRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsIiwgbnVsbCwgbnVsbCB9LCB7ICJ0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbCIsICJbXSIsICJbXSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDIsMSwyXSIsICJbMSwyLDEsMl0iIH0sIHsgImludGVnZXIiLCAiWzEsLDJdIiwgIlsxLDJdIiB9LAorCQkJCXsgImludGVnZXIiLCAiWzEsbnVsbCwyXSIsICJbMSwyXSIgfSwgeyAiaW50ZWdlciIsICJbMSwyLG51bGxdIiwgIlsxLDJdIiB9LAorCQkJCXsgImludGVnZXIiLCAiW251bGwsMSwyXSIsICJbMSwyXSIgfSwgeyAiaW50ZWdlciIsICJbMSwsMl0iLCAiWzEsMl0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJbLDEsMl0iLCAiWzEsMl0iIH0sCisJCQkJLy8geyJpbnRlZ2VyIiwKKwkJCQkvLyAiWzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsMl0iICwKKwkJCQkvLyAiWzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsMl0ifSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxMDAwMDAwMDAsMl0iLCAiWzEwMDAwMDAwMCwyXSIgfSwgLy8gQW5kcmV5LCBpbgorCQkJCQkJCQkJCQkJCQkJCQkvLyBzdWNjZXNzCisJCQkJCQkJCQkJCQkJCQkJCS8vIGZsb3cKKwkJCQkJCQkJCQkJCQkJCQkJLy8gaW50ZWdlcgorCQkJCQkJCQkJCQkJCQkJCQkvLyBtYXggdmFsdWUKKwkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKKwkJCQkJCQkJCQkJCQkJCQkJLy8gMjE0NzQ4MzY0NworCQkJCXsgImludGVnZXIiLCBudWxsLCBudWxsIH0sIC8vIG5vIGRlZmF1bHQgdmFsdWUKKwkJCQl7ICJpbnRlZ2VyIiwKKwkJCQkJCSJbMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMl0iLAorCQkJCQkJIlsxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyXSIgfSwKKwkJCQkvLyBib29sZWFuCisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiB9LAorCQkJCXsgImJvb2xlYW4iLCAiW3RydWUsZmFsc2UsZmFsc2VdIiwgIlt0cnVlLGZhbHNlLGZhbHNlXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIltudWxsLHRydWUsZmFsc2VdIiwgIlt0cnVlLGZhbHNlXSIgfSwgeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZSxudWxsXSIsICJbdHJ1ZSxmYWxzZV0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSwsZmFsc2VdIiwgIlt0cnVlLGZhbHNlXSIgfSwgeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZSxdIiwgIlt0cnVlLGZhbHNlXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIlssdHJ1ZSxmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiB9LCB7ICJib29sZWFuIiwgbnVsbCwgbnVsbCB9LAorCQkJCS8vIERFMTk5NzEzIC0gRGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkgdHlwZSBCb29sZWFuIHNob3VsZAorCQkJCS8vIHN1cHBvcnQgYWxzbyB0aGUgZm9sbG93aW5nIHZhbHVlczogdHJ1ZSwgdCAsIG9uZSAsIDEgLAorCQkJCS8vIGZhbHNlLCBmICwgb2ZmICwgMAorCQkJCXsgImJvb2xlYW4iLCAiW29uLG9mZl0iLCAiW3RydWUsZmFsc2VdIiB9LCB7ICJib29sZWFuIiwgIltPTixPRkZdIiwgIlt0cnVlLGZhbHNlXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIltPbixPZmZdIiwgIlt0cnVlLGZhbHNlXSIgfSwgeyAiYm9vbGVhbiIsICJbeWVzLG5vXSIsICJbdHJ1ZSxmYWxzZV0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJbWUVTLE5PXSIsICJbdHJ1ZSxmYWxzZV0iIH0sIHsgImJvb2xlYW4iLCAiW1llcyxOb10iLCAiW3RydWUsZmFsc2VdIiB9LAorCQkJCXsgImJvb2xlYW4iLCAiW3ksbl0iLCAiW3RydWUsZmFsc2VdIiB9LCB7ICJib29sZWFuIiwgIltZLE5dIiwgIlt0cnVlLGZhbHNlXSIgfSwKKwkJCQkvLyBmbG9hdAorCQkJCXsgImZsb2F0IiwgIlsxMC4wLDAuMF0iLCAiWzEwLjAsMC4wXSIgfSwgeyAiZmxvYXQiLCAiWzEwLDBdIiwgIlsxMCwwXSIgfSwgLy8gY29udGFpbgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnRlZ2VyCisJCQkJeyAiZmxvYXQiLCAiWy0xMCwtNS4zMF0iLCAiWy0xMCwtNS4zMF0iIH0sIC8vIE5lZ2F0aXZlIG51bWJlcnMKKwkJCQl7ICJmbG9hdCIsICJbMTAsbnVsbCwwXSIsICJbMTAsMF0iIH0sIHsgImZsb2F0IiwgIltudWxsLDEwLDBdIiwgIlsxMCwwXSIgfSwKKwkJCQl7ICJmbG9hdCIsICJbMTAsMCxudWxsXSIsICJbMTAsMF0iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzEwLDAuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMV0iLAorCQkJCQkJIlsxMCwwLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFdIiB9LAorCQkJCXsgImZsb2F0IiwgIlsxMCwgICAsNy4zICBdIiwgIlsxMCw3LjNdIiB9LCB7ICJmbG9hdCIsICJbMTAgLCA3LjMgLCBdIiwgIlsxMCw3LjNdIiB9LAorCQkJCXsgImZsb2F0IiwgIlssICwgMTAgLCA3LjMgLCBdIiwgIlsxMCw3LjNdIiB9LCB7ICJmbG9hdCIsICJbNC43ZiwgLTUuNWYgXSIsICJbNC43LC01LjVdIiB9LAorCQkJCXsgImZsb2F0IiwgIls0LjdmLCA2LjMgLDYuMywgNC43Zl0iLCAiWzQuNyw2LjMsNi4zLDQuN10iIH0sIC8vIGR1cGxpY2F0ZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHZhbHVlCisJCQkJeyAiZmxvYXQiLCBudWxsLCBudWxsIH0sIHsgInN0cmluZyIsICJbYWFhYSAsIEFBQUEgIF0iLCAiW1wiYWFhYVwiLFwiQUFBQVwiXSIgfSwKKworCQkJCXsgInN0cmluZyIsCisJCQkJCQkiWzEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDIsMSwyLDEsMiwxLDJdIiwKKwkJCQkJCSJbXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCIsXCIxXCIsXCIyXCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbYWFhYSAsIEFBQUEsIDEsIG9mZiAsIHRydWUsIGZhbHNlICBdIiwKKwkJCQkJCSJbXCJhYWFhXCIsXCJBQUFBXCIsXCIxXCIsXCJvZmZcIixcInRydWVcIixcImZhbHNlXCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbYWFhYSAsIEFBQUEsIGFhYWEsIEFhYWEgLCBhYWFhICBdIiwgIltcImFhYWFcIixcIkFBQUFcIixcImFhYWFcIixcIkFhYWFcIixcImFhYWFcIl0iIH0sCisJCQkJeyAic3RyaW5nIiwgIlthYWFhICwgQUFBQSwgLCAgXSIsICJbXCJhYWFhXCIsXCJBQUFBXCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbICwgYWFhYSAsIEFBQUEgXSIsICJbXCJhYWFhXCIsXCJBQUFBXCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbIGFhYWEgLCAsICBBQUFBIF0iLCAiW1wiYWFhYVwiLFwiQUFBQVwiXSIgfSwKKwkJCQl7ICJzdHJpbmciLCAiWyBhYWFhICwgIEFBQUEsIG51bGwgXSIsICJbXCJhYWFhXCIsXCJBQUFBXCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbIG51bGwsICBhYWFhICwgIEFBQUEgXSIsICJbXCJhYWFhXCIsXCJBQUFBXCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbICBhYWFhICwgbnVsbCAsICBBQUFBIF0iLCAiW1wiYWFhYVwiLFwiQUFBQVwiXSIgfSwgeyAic3RyaW5nIiwgbnVsbCwgbnVsbCB9LCAvLyB3aXRob3V0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkZWZhdWx0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZXMKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFByb3BlcnR5CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB3aWxsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gd2l0aG91dAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcGFyYW1ldGVyCisJCQkJeyAic3RyaW5nIiwgIlsgPGI+QUFBPC9iPiBdIiwgIltcIkFBQVwiXSIgfSwgLy8gQlVHIERFMTk5NzE1IC0KKwkJCQkJCQkJCQkJCQkJCQkvLyBFcnJvciA0MDAKKwkJCQkJCQkJCQkJCQkJCQkvLyByZXNwb25zZQorCQkJCQkJCQkJCQkJCQkJCS8vIHJlY2VpdmVkCisJCQkJCQkJCQkJCQkJCQkJLy8gd2hpbGUgYWRkaW5nCisJCQkJCQkJCQkJCQkJCQkJLy8gcHJvcGVydHkgd2l0aAorCQkJCQkJCQkJCQkJCQkJCS8vIGRlZmF1bHQgdmFsdWUKKwkJCQkJCQkJCQkJCQkJCQkvLyBjb250YWluIEhUTUwKKwkJCQkJCQkJCQkJCQkJCQkvLyB0YWdzLgorCQkJCQkJCQkJCQkJCQkJCS8vIE5lZWQgdG8gY2hlY2sKKwkJCQkJCQkJCQkJCQkJCQkvLyB3aGV0aGVyIC8gaXMKKwkJCQkJCQkJCQkJCQkJCQkvLyBsZWdhbCBpbiB5YW1sCisKKwkJfTsKKwl9CisKKwlARGF0YVByb3ZpZGVyCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBpbnZhbGlkTGlzdFByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLGFhYV0iIH0sCisJCQkJeyAidG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwiLAorCQkJCQkJIlt7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wxXCIsXCJ0b2tlblwiOlwidG9rZW4xXCJ9LHtcInByb3RvY29sXCI6XCJwcm90b2NvbDJcIixcInRva2VuMVwiOlwidG9rZW4yXCJ9XSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLGZhbHNlXSIgfSwgeyAiaW50ZWdlciIsICJbMSwzLjVdIiB9LCB7ICJpbnRlZ2VyIiwgIlsxLDMjXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIlt0cnVlLDMuNV0iIH0sIHsgImJvb2xlYW4iLCAiW3RydWUsMTAwMF0iIH0sIHsgImJvb2xlYW4iLCAiW2ZhbHNlLHRydWVlZV0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZSFdIiB9LCB7ICJmbG9hdCIsICJbNS4wMDAwMDAxLHRydWVdIiB9LCB7ICJmbG9hdCIsICJbMC4wMDAxLGtva29dIiB9LAorCQkJCXsgImZsb2F0IiwgIlswLjAwMDEsNi4zQF0iIH0sIHsgImZsb2F0IiwgIlswLjAwMDFmLDYuM3hdIiB9LCB9OworCX0KKworCUBEYXRhUHJvdmlkZXIKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIHVwZGF0ZVByb3BlcnRpZXNMaXN0RGVmYXVsdFZhbHVlU3VjY2Vzc0Zsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisJCQkJLy8gaW50ZWdlcgorCQkJCS8vIFNldHRpbmcgLS0tIHVwZGF0ZSBwcm9wZXJ0aWVzCisJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDJdIiwgIlsxLDJdIiwgImludGVnZXIiLCAiWzIwMCwxMDBdIiwgIlsyMDAsMTAwXSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDJdIiwgIlsxLDJdIiwgImludGVnZXIiLCAiWzIwMCwxMDAsbnVsbF0iLCAiWzIwMCwxMDBdIiB9LAorCQkJCXsgImludGVnZXIiLCAiWzEsMl0iLCAiWzEsMl0iLCAiaW50ZWdlciIsICJbbnVsbCwgMjAwLDEwMF0iLCAiWzIwMCwxMDBdIiB9LAorCQkJCXsgImludGVnZXIiLCAiWzEsMl0iLCAiWzEsMl0iLCAiaW50ZWdlciIsICJbMjAwLG51bGwsMTAwXSIsICJbMjAwLDEwMF0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJbMSwyXSIsICJbMSwyXSIsICJpbnRlZ2VyIiwgIlsyMDAsMTAwLCAgICBdIiwgIlsyMDAsMTAwXSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDJdIiwgIlsxLDJdIiwgImludGVnZXIiLCAiWyAgLCAyMDAsMTAwIF0iLCAiWzIwMCwxMDBdIiB9LAorCQkJCXsgImludGVnZXIiLCAiWzEsMl0iLCAiWzEsMl0iLCAiaW50ZWdlciIsICJbMjAwICwgICwxMDAgXSIsICJbMjAwLDEwMF0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJbMSwyXSIsICJbMSwyXSIsICJpbnRlZ2VyIiwgbnVsbCwgbnVsbCB9LAorCQkJCXsgImludGVnZXIiLCAiWzEsMl0iLCAiWzEsMl0iLCAiaW50ZWdlciIsICJbMjAwICwgMTAwICwgMjAwLCAxMDBdIiwgIlsyMDAsMTAwLDIwMCwxMDBdIiB9LAorCQkJCS8vCisJCQkJLy8gLy8vL0RFMTk5ODI5IHVwZGF0ZSByZXNvdXJjZSBwcm9wZXJ0eSBzY2hlbWFfdHlwZSBpcyBub3QKKwkJCQkvLyB1cGRhdGVkCisJCQkJeyAiaW50ZWdlciIsICJbMSwyXSIsICJbMSwyXSIsICJzdHJpbmciLCAiW2FhYWEgLCBiYmJiIF0iLCAiW1wiYWFhYVwiLFwiYmJiYlwiXSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDJdIiwgIlsxLDJdIiwgImJvb2xlYW4iLCAiW3RydWUgLCBmYWxzZSBdIiwgIlt0cnVlLGZhbHNlXSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDJdIiwgIlsxLDJdIiwgImZsb2F0IiwgIlszLjUsNC44ZiBdIiwgIlszLjUsNC44XSIgfSwKKwkJCQkvLyB7InN0cmluZyIsICJbYWFhLGJiYl0iICwgIltcImFhYVwiLFwiYmJiXCJdIiwiaW50ZWdlciIsIlsxMDAsCisJCQkJLy8gMjAwXSIgLCAiW1wiMTAwXCIsXCIyMDBcIl0ifSwKKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgImludGVnZXIiLCAiWzEwMCwgMjAwXSIsICJbMTAwLDIwMF0iIH0sCisJCQkJeyAic3RyaW5nIiwgIlthYWEsYmJiXSIsICJbXCJhYWFcIixcImJiYlwiXSIsICJmbG9hdCIsICJbMC4xZiwgMy4wMV0iLCAiWzAuMSwzLjAxXSIgfSwKKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgImJvb2xlYW4iLCAiW3RydWUsIGZhbHNlXSIsICJbdHJ1ZSxmYWxzZV0iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzEuMiwyLjNdIiwgIlsxLjIsMi4zXSIsICJib29sZWFuIiwgIlt0cnVlLCBmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiB9LAorCQkJCXsgImZsb2F0IiwgIlsxLjIsMi4zXSIsICJbMS4yLDIuM10iLCAiaW50ZWdlciIsICJbMTAwLCAyMDBdIiwgIlsxMDAsMjAwXSIgfSwKKwkJCQl7ICJmbG9hdCIsICJbMS4yLDIuM10iLCAiWzEuMiwyLjNdIiwgInN0cmluZyIsICJba29rbywgbW9rb10iLCAiW1wia29rb1wiLFwibW9rb1wiXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIlt0cnVlLGZhbHNlXSIsICJbdHJ1ZSxmYWxzZV0iLCAic3RyaW5nIiwgIltrb2tvLCBtb2tvXSIsICJbXCJrb2tvXCIsXCJtb2tvXCJdIiB9LAorCQkJCS8vIHsiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZV0iICwKKwkJCQkvLyAiW1widHJ1ZVwiLFwiZmFsc2VcIl0iLCJpbnRlZ2VyIiwiWzEwMCwgMzAwMDAwMDAwMDAwMDAwXSIgLAorCQkJCS8vICJbXCIxMDBcIixcIjMwMDAwMDAwMDAwMDAwMFwiXSJ9LC8vIEFuZHJleSwgdmFsdWUgbm90IHZhbGlkCisJCQkJLy8gZm9yIGludGVnZXIgc3VjY2VzcyBmbG93CisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiwgImludGVnZXIiLCAiWzEwMCwyMTQ3NDgzNjQ3XSIsICJbMTAwLDIxNDc0ODM2NDddIiB9LCAvLyBBbmRyZXksCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHN1Y2Nlc3MKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxvdworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnRlZ2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1heAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAyMTQ3NDgzNjQ3CisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiwgImZsb2F0IiwgIlszLjAwMDAwMDAwMDAwMDAwMiwgNS42N2ZdIiwKKwkJCQkJCSJbMy4wMDAwMDAwMDAwMDAwMDIsNS42N10iIH0sCisJCQkJLy8gLy8vL0RFMTk5ODI5CisJCQkJLy8KKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgInN0cmluZyIsICJbeHh4LCB5eXldIiwgIltcInh4eFwiLFwieXl5XCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbYWFhLGJiYl0iLCAiW1wiYWFhXCIsXCJiYmJcIl0iLCAic3RyaW5nIiwgIlt4eHggLCB5eXkgLG51bGxdIiwgIltcInh4eFwiLFwieXl5XCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbYWFhLGJiYl0iLCAiW1wiYWFhXCIsXCJiYmJcIl0iLCAic3RyaW5nIiwgIltudWxsLCB4eHgsIHl5eV0iLCAiW1wieHh4XCIsXCJ5eXlcIl0iIH0sCisJCQkJeyAic3RyaW5nIiwgIlthYWEsYmJiXSIsICJbXCJhYWFcIixcImJiYlwiXSIsICJzdHJpbmciLCAiW3h4eCAsbnVsbCx5eXldIiwgIltcInh4eFwiLFwieXl5XCJdIiB9LAorCQkJCXsgInN0cmluZyIsICJbYWFhLGJiYl0iLCAiW1wiYWFhXCIsXCJiYmJcIl0iLCAic3RyaW5nIiwgIlt4eHggLHl5eSwgICAgXSIsICJbXCJ4eHhcIixcInl5eVwiXSIgfSwKKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgInN0cmluZyIsICJbICAsIHh4eCx5eXkgXSIsICJbXCJ4eHhcIixcInl5eVwiXSIgfSwKKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgInN0cmluZyIsICJbeHh4ICwgICx5eXkgXSIsICJbXCJ4eHhcIixcInl5eVwiXSIgfSwKKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgInN0cmluZyIsICJbIHh4eCAsIHl5eSAsIHh4eCAsIHl5eV0iLAorCQkJCQkJIltcInh4eFwiLFwieXl5XCIsXCJ4eHhcIixcInl5eVwiXSIgfSwKKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgInN0cmluZyIsIG51bGwsIG51bGwgfSwKKwkJCQl7ICJzdHJpbmciLCAiW2FhYSxiYmJdIiwgIltcImFhYVwiLFwiYmJiXCJdIiwgInN0cmluZyIsICJbeHh4Xy14LCB5X195LS15XSIsCisJCQkJCQkiW1wieHh4Xy14XCIsXCJ5X195LS15XCJdIiB9LAorCQkJCS8vIERFMTk5NzE1CisJCQkJLy8geyJzdHJpbmciLCAiW2FhYSxiYmJdIiAsICJbXCJhYWFcIixcImJiYlwiXSIsICJzdHJpbmciICwKKwkJCQkvLyAiW1wiPGI+eHh4PC9iPlwiLCBcIjxiPnl5eTwvYj5cIl0iICwgIltcInh4eFwiLFwieXl5XCJdIn0sCisJCQkJLy8KKwkJCQl7ICJmbG9hdCIsICJbMS4wMCwwLjAyXSIsICJbMS4wMCwwLjAyXSIsICJmbG9hdCIsICJbMi4xICwgLTAuMV0iLCAiWzIuMSwtMC4xXSIgfSwKKwkJCQl7ICJmbG9hdCIsICJbMS4wMCwwLjAyXSIsICJbMS4wMCwwLjAyXSIsICJmbG9hdCIsICJbMi4xLCAwLjEgLG51bGxdIiwgIlsyLjEsMC4xXSIgfSwKKwkJCQl7ICJmbG9hdCIsICJbMS4wMCwwLjAyXSIsICJbMS4wMCwwLjAyXSIsICJmbG9hdCIsICJbbnVsbCAsIDIuMSwgMC4xXSIsICJbMi4xLDAuMV0iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzEuMDAsMC4wMl0iLCAiWzEuMDAsMC4wMl0iLCAiZmxvYXQiLCAiWzIuMSxudWxsLDAuMV0iLCAiWzIuMSwwLjFdIiB9LAorCQkJCXsgImZsb2F0IiwgIlsxLjAwLDAuMDJdIiwgIlsxLjAwLDAuMDJdIiwgImZsb2F0IiwgIlsyLjEsMC4xLCAgICBdIiwgIlsyLjEsMC4xXSIgfSwKKwkJCQkvLyB7ImZsb2F0IiwgIlsxLjAwLDAuMDJdIiAsICJbMS4wMCwwLjAyXSIsImZsb2F0IiwiWyAsCisJCQkJLy8gMi4wMDAwMDAwMDAwMDAwMSwwLjAwMDAwMDAwMDAwMDAwMTAwIF0iICwKKwkJCQkvLyAiWzIuMDAwMDAwMDAwMDAwMDEsMC4wMDAwMDAwMDAwMDAwMDEwMF0ifSwKKwkJCQl7ICJmbG9hdCIsICJbMS4wMCwwLjAyXSIsICJbMS4wMCwwLjAyXSIsICJmbG9hdCIsICJbMi4xICwgICwwLjEgXSIsICJbMi4xLDAuMV0iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzEuMDAsMC4wMl0iLCAiWzEuMDAsMC4wMl0iLCAiZmxvYXQiLCBudWxsLCBudWxsIH0sCisJCQkJeyAiZmxvYXQiLCAiWzEuMDAsMC4wMl0iLCAiWzEuMDAsMC4wMl0iLCAiZmxvYXQiLCAiWzIuMWYgLCAgLDAuMWYgXSIsICJbMi4xLDAuMV0iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzEuMDAsMC4wMl0iLCAiWzEuMDAsMC4wMl0iLCAiZmxvYXQiLCAiWzIuMSAsIDAuMSAsIDIuMSwgMC4xXSIsICJbMi4xLDAuMSwyLjEsMC4xXSIgfSwKKwkJCQl7ICJmbG9hdCIsICJbMS4wMCwwLjAyXSIsICJbMS4wMCwwLjAyXSIsICJmbG9hdCIsICJbMjAwICwgMTAwLjExXSIsICJbMjAwLDEwMC4xMV0iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzEuMDAsMC4wMl0iLCAiWzEuMDAsMC4wMl0iLCAiZmxvYXQiLCAiWy0yLjM1ICwgMTAwLjExXSIsICJbLTIuMzUsMTAwLjExXSIgfSwKKwkJCQkvLworCQkJCXsgImJvb2xlYW4iLCAiW3RydWUsZmFsc2VdIiwgIlt0cnVlLGZhbHNlXSIsICJib29sZWFuIiwgIltmYWxzZSAsIGZhbHNlXSIsICJbZmFsc2UsZmFsc2VdIiB9LAorCQkJCXsgImJvb2xlYW4iLCAiW3RydWUsZmFsc2VdIiwgIlt0cnVlLGZhbHNlXSIsICJib29sZWFuIiwgIltmYWxzZSwgdHJ1ZSAsbnVsbF0iLCAiW2ZhbHNlLHRydWVdIiB9LAorCQkJCXsgImJvb2xlYW4iLCAiW3RydWUsZmFsc2VdIiwgIlt0cnVlLGZhbHNlXSIsICJib29sZWFuIiwgIltudWxsICwgZmFsc2UsIHRydWVdIiwgIltmYWxzZSx0cnVlXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIlt0cnVlLGZhbHNlXSIsICJbdHJ1ZSxmYWxzZV0iLCAiYm9vbGVhbiIsICJbZmFsc2UsbnVsbCx0cnVlXSIsICJbZmFsc2UsdHJ1ZV0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiwgImJvb2xlYW4iLCAiW2ZhbHNlICx0cnVlICwgICAgXSIsICJbZmFsc2UsdHJ1ZV0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiwgImJvb2xlYW4iLCAiWyAgLCBmYWxzZSwgdHJ1ZSBdIiwgIltmYWxzZSx0cnVlXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIlt0cnVlLGZhbHNlXSIsICJbdHJ1ZSxmYWxzZV0iLCAiYm9vbGVhbiIsICJbZmFsc2UgLCAgLHRydWUgXSIsICJbZmFsc2UsdHJ1ZV0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJbdHJ1ZSxmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiwgImJvb2xlYW4iLCBudWxsLCBudWxsIH0sIHsgImJvb2xlYW4iLCAiW3RydWUsZmFsc2VdIiwKKwkJCQkJCSJbdHJ1ZSxmYWxzZV0iLCAiYm9vbGVhbiIsICJbZmFsc2UgLCB0cnVlICwgZmFsc2UsIHRydWVdIiwgIltmYWxzZSx0cnVlLGZhbHNlLHRydWVdIiB9LCB9OworCX0KKworCUBEYXRhUHJvdmlkZXIKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIHVwZGF0ZVByb3BlcnRpZXNMaXN0RGVmYXVsdFZhbHVlRmFpbHVyZUZsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisJCQkJLy8gaW50ZWdlcgorCQkJCS8vIFNldHRpbmcgLS0tIHVwZGF0ZSBwcm9wZXJ0aWVzCisJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDJdIiwgIlsxLDJdIiwgImludGVnZXIiLCAiW2FhYSxiYmJdIiB9LAorCQkJCXsgImludGVnZXIiLCAiWzEsMl0iLCAiWzEsMl0iLCAiaW50ZWdlciIsICJbdHJ1ZSxmYWxzZV0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJbMSwyXSIsICJbMSwyXSIsICJpbnRlZ2VyIiwgIlsxLjAsMTAwXSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIlsxLDJdIiwgIlsxLDJdIiwgImludGVnZXIiLCAiW0AxMiwxMDBdIiB9LAorCQkJCXsgImZsb2F0IiwgIlswLjExLDAuMjJdIiwgIlswLjExLDAuMjJdIiwgImZsb2F0IiwgIlthYWEsIGJiYl0iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzAuMTEsMC4yMl0iLCAiWzAuMTEsMC4yMl0iLCAiZmxvYXQiLCAiWzAuODgsIGZhbHNlXSIgfSwKKwkJCQl7ICJmbG9hdCIsICJbMC4xMSwwLjIyXSIsICJbMC4xMSwwLjIyXSIsICJmbG9hdCIsICJbMC44OGcsIDAuM10iIH0sCisJCQkJeyAiZmxvYXQiLCAiWzAuMTEsMC4yMl0iLCAiWzAuMTEsMC4yMl0iLCAiZmxvYXQiLCAiW0AwLjg4LCAwLjNdIiB9LAorCQkJCXsgImJvb2xlYW4iLCAiW3RydWUsIGZhbHNlXSIsICJbdHJ1ZSxmYWxzZV0iLCAiYm9vbGVhbiIsICJbdHJ1ZSwgMTAwXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIlt0cnVlLCBmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiwgImJvb2xlYW4iLCAiW2ZhbHNlLCAwLjAxXSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIlt0cnVlLCBmYWxzZV0iLCAiW3RydWUsZmFsc2VdIiwgImJvb2xlYW4iLCAiW2tva28sIHRydWVdIiB9LAorCQkJCXsgImJvb2xlYW4iLCAiW3RydWUsIGZhbHNlXSIsICJbdHJ1ZSxmYWxzZV0iLCAiYm9vbGVhbiIsICJbQGZhbHNlLCB0cnVlXSIgfSwKKworCQl9OworCX0KKworCS8vIE1hcCBwcm9wZXJ0aWVzCisJQERhdGFQcm92aWRlcgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gdXBkYXRlUHJvcGVydGllc01hcERlZmF1bHRWYWx1ZVN1Y2Nlc3NGbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IE9iamVjdFtdW10geworCQkJCS8vIGVudHJ5U2NoZW1hVHlwZSAsIHByb3BlcnR5RGVmYXVsdFZhbHVlcyAsCisJCQkJLy8gZXhwZWN0ZWREZWZhdWx0VmFsdWUgLCBuZXdFbnRyeVNjaGVtYVR5cGUgLAorCQkJCS8vIG5ld1Byb3BlcnR5RGVmYXVsdFZhbHVlICwgbmV3RXhwZWN0ZWREZWZhdWx0VmFsdWUKKwkJCQkvLyBpbnRlZ2VyCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSAsIFwia2V5MlwiOjJ9IiwgIntcImtleTFcIjoxLFwia2V5MlwiOjJ9IiwgImludGVnZXIiLAorCQkJCQkJIntcImtleTFcIjoyMDAsXCJrZXkyXCI6bnVsbCAsIFwia2V5M1wiOjMwMH0iLCAie1wia2V5MVwiOjIwMCxcImtleTJcIjpudWxsLFwia2V5M1wiOjMwMH0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSAsIFwia2V5MlwiOjJ9IiwgIntcImtleTFcIjoxLFwia2V5MlwiOjJ9IiwgImludGVnZXIiLAorCQkJCQkJIntcImtleTFcIjpudWxsLFwia2V5MlwiOjIwMCAsIFwia2V5M1wiOjEwMH0iLCAie1wia2V5MVwiOm51bGwsXCJrZXkyXCI6MjAwLFwia2V5M1wiOjEwMH0iIH0sCisJCQkJLy8gc3RyaW5nCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSAsIFwia2V5MlwiOjJ9IiwgIntcImtleTFcIjoxLFwia2V5MlwiOjJ9IiwgInN0cmluZyIsCisJCQkJCQkie1wia2V5MVwiOlwiYWFhYVwiICwgXCJrZXkyXCI6XCJhYWFhXCJ9IiwgIntcImtleTFcIjpcImFhYWFcIixcImtleTJcIjpcImFhYWFcIn0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSAsIFwia2V5MlwiOjJ9IiwgIntcImtleTFcIjoxLFwia2V5MlwiOjJ9IiwgImJvb2xlYW4iLAorCQkJCQkJIntcImtleTFcIjp0cnVlICwgXCJrZXkyXCI6ZmFsc2V9IiwgIntcImtleTFcIjp0cnVlLFwia2V5MlwiOmZhbHNlfSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIntcImtleTFcIjoxICwgXCJrZXkyXCI6Mn0iLCAie1wia2V5MVwiOjEsXCJrZXkyXCI6Mn0iLCAiZmxvYXQiLAorCQkJCQkJIntcImtleTFcIjozLjUgLCBcImtleTJcIjo0LjhmfSIsICJ7XCJrZXkxXCI6My41LFwia2V5MlwiOjQuOH0iIH0sCisJCQkJLy8gc3RyaW5nCisJCQkJeyAic3RyaW5nIiwgIntcImtleTFcIjphYWEgLCBcImtleTJcIjpiYmJ9IiwgIntcImtleTFcIjpcImFhYVwiLFwia2V5MlwiOlwiYmJiXCJ9IiwgInN0cmluZyIsCisJCQkJCQkie1wia2V5MVwiOnh4eCAsIFwia2V5MlwiOnl5eX0iLCAie1wia2V5MVwiOlwieHh4XCIsXCJrZXkyXCI6XCJ5eXlcIn0iIH0sCisJCQkJLy8gZmxvYXQKKwkJCQl7ICJmbG9hdCIsICJ7XCJrZXkxXCI6MS4wMCAsIFwia2V5MlwiOjAuMDJ9IiwgIntcImtleTFcIjoxLjAwLFwia2V5MlwiOjAuMDJ9IiwgImZsb2F0IiwKKwkJCQkJCSJ7XCJrZXkxXCI6Mi4xLCBcImtleTJcIjotMC4xfSIsICJ7XCJrZXkxXCI6Mi4xLFwia2V5MlwiOi0wLjF9IiB9LAorCQkJCXsgImZsb2F0IiwgIntcImtleTFcIjoxLjAwICwgXCJrZXkyXCI6MC4wMn0iLCAie1wia2V5MVwiOjEuMDAsXCJrZXkyXCI6MC4wMn0iLCAiZmxvYXQiLAorCQkJCQkJIntcImtleTFcIjoyLjEgLCBcImtleTJcIjowLjEgLCBcImtleTNcIjpudWxsfSIsICJ7XCJrZXkxXCI6Mi4xLFwia2V5MlwiOjAuMSxcImtleTNcIjpudWxsfSIgfSwKKwkJCQkvLyBib29sZWFuCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6dHJ1ZSAsIFwia2V5MlwiOmZhbHNlfSIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iLCAiYm9vbGVhbiIsCisJCQkJCQkie1wia2V5MVwiOmZhbHNlICwgXCJrZXkyXCI6ZmFsc2V9IiwgIntcImtleTFcIjpmYWxzZSxcImtleTJcIjpmYWxzZX0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6dHJ1ZSAsIFwia2V5MlwiOmZhbHNlfSIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iLCAiYm9vbGVhbiIsCisJCQkJCQkie1wia2V5MVwiOmZhbHNlICwgXCJrZXkyXCI6dHJ1ZSAsIFwia2V5M1wiOm51bGx9IiwKKwkJCQkJCSJ7XCJrZXkxXCI6ZmFsc2UsXCJrZXkyXCI6dHJ1ZSxcImtleTNcIjpudWxsfSIgfSwKKwkJCQkvLyBudWxsCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6bnVsbCAsIFwia2V5MlwiOmZhbHNlfSIsICJ7XCJrZXkxXCI6bnVsbCxcImtleTJcIjpmYWxzZX0iLCAiYm9vbGVhbiIsCisJCQkJCQkie1wia2V5MVwiOmZhbHNlICwgXCJrZXkyXCI6dHJ1ZSAsIFwia2V5M1wiOm51bGx9IiwKKwkJCQkJCSJ7XCJrZXkxXCI6ZmFsc2UsXCJrZXkyXCI6dHJ1ZSxcImtleTNcIjpudWxsfSIgfSwKKwkJCQkvLyB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorCQkJCXsgInRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsIiwKKwkJCQkJCSJ7XCJrZXkxXCI6e1wicHJvdG9jb2xcIjpcInByb3RvY29sPGJyPjFcIixcInRva2VuXCI6XCJ0b2tlbjFcIn0sXCJrZXkyXCI6e1wicHJvdG9jb2xcIjpcInByb3RvY29sMlwiLFwidG9rZW5cIjpcInRva2VuMlwifX0iLAorCQkJCQkJIntcImtleTFcIjp7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wxXCIsXCJ0b2tlblwiOlwidG9rZW4xXCJ9LFwia2V5MlwiOntcInByb3RvY29sXCI6XCJwcm90b2NvbDJcIixcInRva2VuXCI6XCJ0b2tlbjJcIn19IiwKKwkJCQkJCSJ0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbCIsCisJCQkJCQkie1wia2V5MVwiOntcInByb3RvY29sXCI6XCJwcm90b2NvbDxicj4xXCIsXCJ0b2tlblwiOlwidG9rZW4xXCJ9LFwia2V5MlwiOntcInByb3RvY29sXCI6XCJwcm90b2NvbDJcIixcInRva2VuXCI6XCJ0b2tlbjJcIn19IiwKKwkJCQkJCSJ7XCJrZXkxXCI6e1wicHJvdG9jb2xcIjpcInByb3RvY29sMVwiLFwidG9rZW5cIjpcInRva2VuMVwifSxcImtleTJcIjp7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wyXCIsXCJ0b2tlblwiOlwidG9rZW4yXCJ9fSIgfSwKKworCQl9OworCX0KKworCUBEYXRhUHJvdmlkZXIKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIHByb3BlcnRpZXNNYXBEZWZhdWx0VmFsdWVTdWNjZXNzRmxvdygpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKworCQkJCS8vIGVudHJ5U2NoZW1hVHlwZSAsIHByb3BlcnR5RGVmYXVsdFZhbHVlcyAsCisJCQkJLy8gZXhwZWN0ZWREZWZhdWx0VmFsdWUKKwkJCQkvLworCQkJCS8vIHsic3RyaW5nIiwKKwkJCQkvLyAie1widmZfbW9kdWxlX2lkXCI6e1wiZ2V0X2lucHV0XCI6XCJ2Zl9tb2R1bGVfaWRcIn0sCisJCQkJLy8gXCJ2bmZfaWR3XCI6IDJ9IiwKKwkJCQkvLyAie1widmZfbW9kdWxlX2lkXCI6e1wiZ2V0X2lucHV0XCI6XCJ2Zl9tb2R1bGVfaWRcIn0sCisJCQkJLy8gXCJ2bmZfaWR3XCI6IDJ9In0sCisKKwkJCQkvLyB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorCQkJCXsgInRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsIiwKKwkJCQkJCSJ7XCJrZXkxXCI6e1wicHJvdG9jb2xcIjpcInByb3RvY29sPGJyPjFcIixcInRva2VuXCI6XCJ0b2tlbjFcIn0sXCJrZXkyXCI6e1wicHJvdG9jb2xcIjpcInByb3RvY29sMlwiLFwidG9rZW5cIjpcInRva2VuMlwifX0iLAorCQkJCQkJIntcImtleTFcIjp7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wxXCIsXCJ0b2tlblwiOlwidG9rZW4xXCJ9LFwia2V5MlwiOntcInByb3RvY29sXCI6XCJwcm90b2NvbDJcIixcInRva2VuXCI6XCJ0b2tlbjJcIn19IiB9LAorCQkJCS8vIGludGVnZXIKKwkJCQl7ICJpbnRlZ2VyIiwgIntcImtleTFcIjoxICwgXCJrZXkyXCI6Mn0iLCAie1wia2V5MVwiOjEsXCJrZXkyXCI6Mn0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSxcImtleTJcIjoyLFwia2V5M1wiOjEsXCJrZXk0XCI6Mn0iLAorCQkJCQkJIntcImtleTFcIjoxLFwia2V5MlwiOjIsXCJrZXkzXCI6MSxcImtleTRcIjoyfSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIntcImtleTFcIjoxLFwia2V5MlwiOm51bGwsXCJrZXkzXCI6MSxcImtleTRcIjoyfSIsCisJCQkJCQkie1wia2V5MVwiOjEsXCJrZXkyXCI6bnVsbCxcImtleTNcIjoxLFwia2V5NFwiOjJ9IiB9LAorCQkJCXsgImludGVnZXIiLCAie1wia2V5MVwiOm51bGwsXCJrZXkyXCI6MSxcImtleTNcIjoxLFwia2V5NFwiOjJ9IiwKKwkJCQkJCSJ7XCJrZXkxXCI6bnVsbCxcImtleTJcIjoxLFwia2V5M1wiOjEsXCJrZXk0XCI6Mn0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSxcImtleTJcIjoyLFwia2V5M1wiOjEsXCJrZXk0XCI6bnVsbH0iLAorCQkJCQkJIntcImtleTFcIjoxLFwia2V5MlwiOjIsXCJrZXkzXCI6MSxcImtleTRcIjpudWxsfSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIntcImtleTFcIjoxLFwia2V5MlwiOjIsXCJrZXkzXCI6MSxcImtleTRcIjpOVUxMfSIsCisJCQkJCQkie1wia2V5MVwiOjEsXCJrZXkyXCI6MixcImtleTNcIjoxLFwia2V5NFwiOm51bGx9IiB9LAorCQkJCXsgImludGVnZXIiLCAie1wia2V5MVwiOjEsXCJrZXkyXCI6MixcImtleTNcIjoxLFwia2V5NFwiOk51bGx9IiwKKwkJCQkJCSJ7XCJrZXkxXCI6MSxcImtleTJcIjoyLFwia2V5M1wiOjEsXCJrZXk0XCI6bnVsbH0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSxcImtleTJcIjoyLFwia2V5M1wiOjEsXCJrZXk0XCI6bnVMTH0iLAorCQkJCQkJIntcImtleTFcIjoxLFwia2V5MlwiOjIsXCJrZXkzXCI6MSxcImtleTRcIjpudWxsfSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgbnVsbCwgbnVsbCB9LCAvLyBubyBkZWZhdWx0IHZhbHVlCisJCQkJLy8gLy9CVUcKKwkJCQkvLy8vIHsiaW50ZWdlciIsCisJCQkJLy8gIntcImtleTFcIjoxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLFwia2V5MlwiOjJ9IgorCQkJCS8vICwie1wia2V5MVwiOjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsXCJrZXkyXCI6Mn0ifSwKKwkJCQl7ICJib29sZWFuIiwgIntcImtleTFcIjp0cnVlICwgXCJrZXkyXCI6ZmFsc2V9IiwgIntcImtleTFcIjp0cnVlLFwia2V5MlwiOmZhbHNlfSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIntcImtleTFcIjp0cnVlICwgXCJrZXkyXCI6ZmFsc2UsIFwia2V5M1wiOmZhbHNlIH0iLAorCQkJCQkJIntcImtleTFcIjp0cnVlLFwia2V5MlwiOmZhbHNlLFwia2V5M1wiOmZhbHNlfSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIntcImtleTFcIjpudWxsICwgXCJrZXkyXCI6dHJ1ZSwgXCJrZXkzXCI6ZmFsc2UgfSIsCisJCQkJCQkie1wia2V5MVwiOm51bGwsXCJrZXkyXCI6dHJ1ZSxcImtleTNcIjpmYWxzZX0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6dHJ1ZSAsIFwia2V5MlwiOk51bGwsIFwia2V5M1wiOmZhbHNlIH0iLAorCQkJCQkJIntcImtleTFcIjp0cnVlLFwia2V5MlwiOm51bGwsXCJrZXkzXCI6ZmFsc2V9IiB9LAorCQkJCXsgImJvb2xlYW4iLCAie1wia2V5MVwiOnRydWUgLCBcImtleTJcIjpmYWxzZSwgXCJrZXkzXCI6blVMTCB9IiwKKwkJCQkJCSJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZSxcImtleTNcIjpudWxsfSIgfSwKKwkJCQl7ICJib29sZWFuIiwgbnVsbCwgbnVsbCB9LAorCQkJCXsgImJvb2xlYW4iLCAie1wia2V5MVwiOm9uICwgXCJrZXkyXCI6b2ZmfSIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6T04gLCBcImtleTJcIjpPRkZ9IiwgIntcImtleTFcIjp0cnVlLFwia2V5MlwiOmZhbHNlfSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIntcImtleTFcIjpPbiAsIFwia2V5MlwiOk9mZn0iLCAie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiB9LAorCQkJCXsgImJvb2xlYW4iLCAie1wia2V5MVwiOnllcyAsIFwia2V5MlwiOm5vfSIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6WUVTICwgXCJrZXkyXCI6Tk99IiwgIntcImtleTFcIjp0cnVlLFwia2V5MlwiOmZhbHNlfSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIntcImtleTFcIjpZZXMgLCBcImtleTJcIjpOb30iLCAie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiB9LAorCQkJCXsgImJvb2xlYW4iLCAie1wia2V5MVwiOnkgLCBcImtleTJcIjpufSIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6WSAsIFwia2V5MlwiOk59IiwgIntcImtleTFcIjp0cnVlLFwia2V5MlwiOmZhbHNlfSIgfSwKKwkJCQl7ICJib29sZWFuIiwgIntudWxsOmZhbHNlfSIsICJ7XCJudWxsXCI6ZmFsc2V9IiB9LAorCQkJCS8vIGZsb2F0CisJCQkJeyAiZmxvYXQiLCAie1wia2V5MVwiOjEwLjAgLCBcImtleTJcIjowLjB9IiwgIntcImtleTFcIjoxMC4wLFwia2V5MlwiOjAuMH0iIH0sCisJCQkJeyAiZmxvYXQiLCAie1wia2V5MVwiOjEwICwgXCJrZXkyXCI6MH0iLCAie1wia2V5MVwiOjEwLFwia2V5MlwiOjB9IiB9LCAvLyBjb250YWluCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaW50ZWdlcgorCQkJCXsgImZsb2F0IiwgIntcImtleTFcIjpudWxsICwgXCJrZXkyXCI6TnVsbH0iLCAie1wia2V5MVwiOm51bGwsXCJrZXkyXCI6bnVsbH0iIH0sIC8vIGNvbnRhaW4KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBudWxsCisJCQkJeyAiZmxvYXQiLCAie1wia2V5MVwiOjMuNSAsIFwia2V5MlwiOm5VTEx9IiwgIntcImtleTFcIjozLjUsXCJrZXkyXCI6bnVsbH0iIH0sCisJCQkJLy8gQlVHCisJCQkJeyAiZmxvYXQiLCAie1wia2V5MVwiOjMuNSAsIFwia2V5MlwiOjAuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMX0iLAorCQkJCQkJIntcImtleTFcIjozLjUsXCJrZXkyXCI6MC4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExfSIgfSwKKwkJCQl7ICJmbG9hdCIsICJ7XCJrZXkxXCI6NC43ZiAsIFwia2V5MlwiOi01LjVmfSIsICJ7XCJrZXkxXCI6NC43LFwia2V5MlwiOi01LjV9IiB9LAorCQkJCXsgImZsb2F0IiwgIntcImtleTFcIjo0LjdmICwgXCJrZXkyXCI6LTUuNWYsIFwia2V5M1wiOi01LjVmfSIsCisJCQkJCQkie1wia2V5MVwiOjQuNyxcImtleTJcIjotNS41LFwia2V5M1wiOi01LjV9IiB9LAorCQkJCXsgImJvb2xlYW4iLCBudWxsLCBudWxsIH0sCisJCQkJeyAic3RyaW5nIiwgIntcImtleTFcIjphYWFhICwgXCJrZXkyXCI6QUFBQX0iLCAie1wia2V5MVwiOlwiYWFhYVwiLFwia2V5MlwiOlwiQUFBQVwifSIgfSwKKwkJCQl7ICJzdHJpbmciLCAie1wia2V5MVwiOm9mZiAsIFwia2V5MlwiOnRydWUgLCBcImtleTNcIjoxfSIsCisJCQkJCQkie1wia2V5MVwiOlwib2ZmXCIsXCJrZXkyXCI6XCJ0cnVlXCIsXCJrZXkzXCI6XCIxXCJ9IiB9LAorCQkJCXsgInN0cmluZyIsICJ7XCJrZXkxXCI6YWFhYSAsIFwia2V5MlwiOkFhYWEgLCBcImtleTNcIjphYWFhfSIsCisJCQkJCQkie1wia2V5MVwiOlwiYWFhYVwiLFwia2V5MlwiOlwiQWFhYVwiLFwia2V5M1wiOlwiYWFhYVwifSIgfSwKKwkJCQl7ICJzdHJpbmciLCAie1wia2V5MVwiOmFhYWEgLCBcImtleTJcIjpiYmJiICwgXCJrZXkzXCI6bnVsbH0iLAorCQkJCQkJIntcImtleTFcIjpcImFhYWFcIixcImtleTJcIjpcImJiYmJcIixcImtleTNcIjpudWxsfSIgfSwKKwkJCQl7ICJzdHJpbmciLCAie1wia2V5MVwiOk5VTEwgLCBcImtleTJcIjpiYmJiICwgXCJrZXkzXCI6YWFhYX0iLAorCQkJCQkJIntcImtleTFcIjpudWxsLFwia2V5MlwiOlwiYmJiYlwiLFwia2V5M1wiOlwiYWFhYVwifSIgfSwKKwkJCQl7ICJzdHJpbmciLCAie1wia2V5MVwiOmFhYWEgLCBcImtleTJcIjpOdWxsICwgXCJrZXkzXCI6YmJiYn0iLAorCQkJCQkJIntcImtleTFcIjpcImFhYWFcIixcImtleTJcIjpudWxsLFwia2V5M1wiOlwiYmJiYlwifSIgfSwKKwkJCQl7ICJzdHJpbmciLCBudWxsLCBudWxsIH0sIC8vIHdpdGhvdXQgZGVmYXVsdCB2YWx1ZXMgLSBQcm9wZXJ0eQorCQkJCQkJCQkJCQkvLyB3aWxsIGJlIHdpdGhvdXQgZGVmYXVsdCBwYXJhbWV0ZXIKKwkJCQl7ICJzdHJpbmciLCAie1wia2V5MVwiOlwiPGI+QUFBQTwvYj5cIiB9IiwgIntcImtleTFcIjpcIkFBQUFcIn0iIH0sCisKKwkJfTsKKwl9CisKKwlARGF0YVByb3ZpZGVyCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSB1cGRhdGVQcm9wZXJ0aWVzTWFwRGVmYXVsdFZhbHVlRmFpbHVyZUZsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisKKwkJCQkvLyBpbnRlZ2VyCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSAsIFwia2V5MlwiOjJ9IiwgIntcImtleTFcIjoxLFwia2V5MlwiOjJ9IiwgImludGVnZXIiLAorCQkJCQkJIntcImtleTFcIjphYWEgLCBcImtleTJcIjpiYmJ9IiB9LAorCQkJCXsgImludGVnZXIiLCAie1wia2V5MVwiOjEgLCBcImtleTJcIjoyfSIsICJ7XCJrZXkxXCI6MSxcImtleTJcIjoyfSIsICJpbnRlZ2VyIiwKKwkJCQkJCSJ7XCJrZXkxXCI6dHJ1ZSAsIFwia2V5MlwiOmZhbHNlfSIgfSwKKwkJCQl7ICJpbnRlZ2VyIiwgIntcImtleTFcIjoxICwgXCJrZXkyXCI6Mn0iLCAie1wia2V5MVwiOjEsXCJrZXkyXCI6Mn0iLCAiaW50ZWdlciIsCisJCQkJCQkie1wia2V5MVwiOjEuMCAsIFwia2V5MlwiOjEwMH0iIH0sCisJCQkJeyAiaW50ZWdlciIsICJ7XCJrZXkxXCI6MSAsIFwia2V5MlwiOjJ9IiwgIntcImtleTFcIjoxLFwia2V5MlwiOjJ9IiwgImludGVnZXIiLAorCQkJCQkJIntcImtleTFcIjoxMkAgLCBcImtleTJcIjoxMDB9IiB9LAorCQkJCS8vIGZsb2F0CisJCQkJeyAiZmxvYXQiLCAie1wia2V5MVwiOjAuMTEgLCBcImtleTJcIjowLjIyfSIsICJ7XCJrZXkxXCI6MC4xMSxcImtleTJcIjowLjIyfSIsICJmbG9hdCIsCisJCQkJCQkie1wia2V5MVwiOmFhYSAsIFwia2V5MlwiOmJiYn0iIH0sCisJCQkJeyAiZmxvYXQiLCAie1wia2V5MVwiOjAuMTEgLCBcImtleTJcIjowLjIyfSIsICJ7XCJrZXkxXCI6MC4xMSxcImtleTJcIjowLjIyfSIsICJmbG9hdCIsCisJCQkJCQkie1wia2V5MVwiOjAuODggLCBcImtleTJcIjpmYWxzZX0iIH0sCisJCQkJeyAiZmxvYXQiLCAie1wia2V5MVwiOjAuMTEgLCBcImtleTJcIjowLjIyfSIsICJ7XCJrZXkxXCI6MC4xMSxcImtleTJcIjowLjIyfSIsICJmbG9hdCIsCisJCQkJCQkie1wia2V5MVwiOjAuODhnICwgXCJrZXkyXCI6MC4zfSIgfSwKKwkJCQl7ICJmbG9hdCIsICJ7XCJrZXkxXCI6MC4xMSAsIFwia2V5MlwiOjAuMjJ9IiwgIntcImtleTFcIjowLjExLFwia2V5MlwiOjAuMjJ9IiwgImZsb2F0IiwKKwkJCQkJCSJ7XCJrZXkxXCI6QDAuODhnICwgXCJrZXkyXCI6MC4zfSIgfSwKKwkJCQkvLyBib29sZWFuCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6dHJ1ZSAsIFwia2V5MlwiOmZhbHNlfSIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iLCAiYm9vbGVhbiIsCisJCQkJCQkie1wia2V5MVwiOnRydWUgLCBcImtleTJcIjoxMDB9IiB9LAorCQkJCXsgImJvb2xlYW4iLCAie1wia2V5MVwiOnRydWUgLCBcImtleTJcIjpmYWxzZX0iLCAie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiwgImJvb2xlYW4iLAorCQkJCQkJIntcImtleTFcIjpmYWxzZSAsIFwia2V5MlwiOjAuMDF9IiB9LAorCQkJCXsgImJvb2xlYW4iLCAie1wia2V5MVwiOnRydWUgLCBcImtleTJcIjpmYWxzZX0iLCAie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiwgImJvb2xlYW4iLAorCQkJCQkJIntcImtleTFcIjprb2tvICwgXCJrZXkyXCI6dHJ1ZX0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6dHJ1ZSAsIFwia2V5MlwiOmZhbHNlfSIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iLCAiYm9vbGVhbiIsCisJCQkJCQkie1wia2V5MVwiOkBmYWxzZSAsIFwia2V5MlwiOnRydWV9IiB9LAorCQkJCXsgImJvb2xlYW4iLCAie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiwgIntcImtleTFcIjp0cnVlLFwia2V5MlwiOmZhbHNlfSIsICJib29sZWFuIiwKKwkJCQkJCSJ7OmZhbHNlICwgXCJrZXkyXCI6dHJ1ZX0iIH0sCisJCQkJeyAiYm9vbGVhbiIsICJ7XCJrZXkxXCI6dHJ1ZSxcImtleTJcIjpmYWxzZX0iLCAie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiwgImJvb2xlYW4iLAorCQkJCQkJIntcImtleTFcIjp0cnVlICwgLCBcImtleTJcIjpmYWxzZX0iIH0sCisJCQkJLy8gdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKwkJCQl7ICJ0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbCIsCisJCQkJCQkie1wia2V5MVwiOntcInByb3RvY29sXCI6XCJwcm90b2NvbDxicj4xXCIsXCJ0b2tlblwiOlwidG9rZW4xXCJ9LFwia2V5MlwiOntcInByb3RvY29sXCI6XCJwcm90b2NvbDJcIixcInRva2VuXCI6XCJ0b2tlbjJcIn19IiwKKwkJCQkJCSJ7XCJrZXkxXCI6e1wicHJvdG9jb2xcIjpcInByb3RvY29sMVwiLFwidG9rZW5cIjpcInRva2VuMVwifSxcImtleTJcIjp7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wyXCIsXCJ0b2tlblwiOlwidG9rZW4yXCJ9fSIsCisJCQkJCQkidG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwiLAorCQkJCQkJIntcImtleTFcIjp7XCJwcm90b2NvbFwiOlwicHJvdG9jb2w8YnI+MVwiLFwidG9rZW5cIjpcInRva2VuMVwifSxcImtleTJcIjp7XCJwcm90b2NvbFwiOlwicHJvdG9jb2wyXCIsXCJ0b2tlbjJcIjpcInRva2VuMlwifX0iIH0sCisKKwkJfTsKKwl9CisKKwkvLyBVUzU5NDkzOCAtIFVQREFURSBQUk9QRVJUWQorCS8vIERFMTk5NzE4CisJQFRlc3QoZGF0YVByb3ZpZGVyID0gInVwZGF0ZVByb3BlcnRpZXNMaXN0RGVmYXVsdFZhbHVlRmFpbHVyZUZsb3ciKQorCXB1YmxpYyB2b2lkIHVwZGF0ZURlZmF1bHRWYWx1ZU9mUmVzb3VyY2VQcm9wZXJ0eUxpc3RGYWlsdXJlRmxvdyhTdHJpbmcgZW50cnlTY2hlbWFUeXBlLCBTdHJpbmcgcHJvcGVydHlEZWZhbHRWYWx1ZXMsCisJCQlTdHJpbmcgZXhwZWN0ZWRkZWZhdWx0VmFsdWVzLCBTdHJpbmcgbmV3RW50cnlTY2hlbWFUeXBlLCBTdHJpbmcgbmV3UHJvcGVydHlEZWZhbHRWYWx1ZXMpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUocHJvcGVydHlEZWZhbHRWYWx1ZXMpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKGVudHJ5U2NoZW1hVHlwZSk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCS8vIHZlcmlmeSBwcm9wZXJ0aWVzIHJldHVybiBmcm9tIHJlc3BvbnNlCisJCWFzc2VydEVxdWFscygibGlzdCIsIHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRkZWZhdWx0VmFsdWVzLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMocHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgZXhwZWN0ZWRkZWZhdWx0VmFsdWVzKTsKKwkJLy8gVXBkYXRlIHJlc291cmNlIHByb3BlcnR5IHR5cGUgPSAibGlzdCIKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKG5ld1Byb3BlcnR5RGVmYWx0VmFsdWVzKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZShuZXdFbnRyeVNjaGVtYVR5cGUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvcGVydHlSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLnVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBwcm9wZXJ0eVVuaXF1ZUlkLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKQorCQkJCS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUodXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKHByb3BlcnR5RGV0YWlscy5nZXROYW1lKCkpOworCQl2YXJpYWJsZXMuYWRkKHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCXZhcmlhYmxlcy5hZGQocHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsKKwkJdmFyaWFibGVzLmFkZChuZXdQcm9wZXJ0eURlZmFsdFZhbHVlcyk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT01QTEVYX0RFRkFVTFRfVkFMVUUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnR5T2ZEZXJpdmVkUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5TVFJJTkdfTElTVCk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyBkZXJpdmVkUmVzb3VyY2VQcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCS8vIHNlY29uZCByZXNvdXJjZSBkZXJpdmVkIGZyb20gYmFzaWNWRkMKKwkJUmVzb3VyY2UgdmZjMUZyb21CYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlc0J5Q3VzdG9tTm9ybWF0aXZlVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywgYmFzaWNWRkMsCisJCQkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5BUFBMSUNBVElPTl9MNF9CT1JERVIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkKKwkJCQkubGVmdCgpLnZhbHVlKCk7CisJCS8vIGFkZCBwcm9wZXJ0eSBUeXBlIGxpc3QgdG8gc2Vjb25kIHJlc291cmNlCisJCVByb3BlcnR5UmVxRGV0YWlscyBkZWZhdWx0TGlzdFByb3BlcnR5ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLklOVEVHRVJfTElTVCk7CisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShkZWZhdWx0TGlzdFByb3BlcnR5LCB2ZmMxRnJvbUJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBVcGRhdGUgcHJvcGVydHkgKGxpc3QpIG9mIGRlcml2ZWQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb3BlcnR5UmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy51cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywKKwkJCQlkZXJpdmVkUmVzb3VyY2VQcm9wZXJ0eVVuaXF1ZUlkLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUodXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTikpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gVmVyaWZ5IHJlc291cmNlJ3MgcHJpb3JpdHkgbGlzdCBkaWQgbm90IGNoYW5nZWQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgIltcImFcIixcImJcIl0iKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnR5T2ZOb25EZXJpdmVkUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5TVFJJTkdfTElTVCk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCS8vIHNlY29uZCByZXNvdXJjZSBkZXJpdmVkIGZyb20gYmFzaWNWRkMKKwkJUmVzb3VyY2UgdmZjMUZyb21CYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlc0J5Q3VzdG9tTm9ybWF0aXZlVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywgYmFzaWNWRkMsCisJCQkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5BUFBMSUNBVElPTl9MNF9CT1JERVIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkKKwkJCQkubGVmdCgpLnZhbHVlKCk7CisJCS8vIGFkZCBwcm9wZXJ0eSBUeXBlIGxpc3QgdG8gc2Vjb25kIHJlc291cmNlCisJCVByb3BlcnR5UmVxRGV0YWlscyBkZWZhdWx0TGlzdFByb3BlcnR5ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLklOVEVHRVJfTElTVCk7CisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShkZWZhdWx0TGlzdFByb3BlcnR5LCB2ZmMxRnJvbUJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRVbmlxdWVJZCgpOworCQkvLyBVcGRhdGUgcHJvcGVydHkgKGxpc3QpIG9mIGRlcml2ZWQgcmVzb3VyY2UKKwkJZGVmYXVsdExpc3RQcm9wZXJ0eS5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgiWzEsMiwzLDRdIik7CisJCVN0cmluZyBleHBlY3RlZERlZmF1bHRWYWx1ZSA9ICJbMSwyLDMsNF0iOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydHlBZnRlclVwZGF0ZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLnVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZShkZWZhdWx0TGlzdFByb3BlcnR5LCB2ZmMxRnJvbUJhc2ljVkZDLCBwcm9wZXJ0eVVuaXF1ZUlkLAorCQkJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydHlBZnRlclVwZGF0ZS5nZXRUeXBlKCksICJsaXN0Iik7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnR5QWZ0ZXJVcGRhdGUuZ2V0RGVmYXVsdFZhbHVlKCksIGV4cGVjdGVkRGVmYXVsdFZhbHVlKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydHlBZnRlclVwZGF0ZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlkZWZhdWx0TGlzdFByb3BlcnR5LmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHZmYzFGcm9tQmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCVN0cmluZyBleHBlY3RlZERlZmF1bHRWYWx1ZUZyb21EZXJpdmVkUmVzb3VyY2UgPSAiW1wiYVwiLFwiYlwiXSI7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlyZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDApLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscyhleHBlY3RlZERlZmF1bHRWYWx1ZSk7CisJCXJlc291cmNlLmdldFByb3BlcnRpZXMoKS5nZXQoMSkuZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKGV4cGVjdGVkRGVmYXVsdFZhbHVlRnJvbURlcml2ZWRSZXNvdXJjZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVMaXN0UHJvcGVydHlUb05vbkNoZWNrZWRPdXRSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlTdHJpbmcgUHJvcGVydHlEZWZhdWx0VmFsdWUgPSAiWzIsM10iOworCQlwcm9wZXJ0eURldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoUHJvcGVydHlEZWZhdWx0VmFsdWUpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSk7CisJCS8vIFVwZGF0ZSByZXNvdXJjZSBwcm9wZXJ0eSB0eXBlID0gImxpc3QiCisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgiWzMsNF0iKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZSgiaW50ZWdlciIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvcGVydHlSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLnVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBwcm9wZXJ0eVVuaXF1ZUlkLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKQorCQkJCS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUodXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTikpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gVmVyaWZ5IHJlc291cmNlJ3MgcHJpb3JpdHkgbGlzdCBkaWQgbm90IGNoYW5nZWQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgIlsyLDNdIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVMaXN0UHJvcGVydHlSZXNvdXJjZUJ5Tm9uUmVzb3VjZU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KCk7CisJCVN0cmluZyBQcm9wZXJ0eURlZmF1bHRWYWx1ZSA9ICJbMiwzXSI7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShQcm9wZXJ0eURlZmF1bHRWYWx1ZSk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUoImludGVnZXIiKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJLy8gQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoYmFzaWNWRkMsCisJCS8vIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJLy8gVXBkYXRlIHJlc291cmNlIHByb3BlcnR5IHR5cGUgPSAibGlzdCIKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKCJbMyw0XSIpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkudXBkYXRlUHJvcGVydHlPZlJlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIHByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5ERVNJR05FUjIsIGZhbHNlKQorCQkJCS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUodXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTikpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gVmVyaWZ5IHJlc291cmNlJ3MgcHJpb3JpdHkgbGlzdCBkaWQgbm90IGNoYW5nZWQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgIlsyLDNdIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVMaXN0UHJvcGVydHlSZXNvdXJjZUJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KCk7CisJCVN0cmluZyBQcm9wZXJ0eURlZmF1bHRWYWx1ZSA9ICJbMiwzXSI7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShQcm9wZXJ0eURlZmF1bHRWYWx1ZSk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUoImludGVnZXIiKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJLy8gQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoYmFzaWNWRkMsCisJCS8vIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJLy8gVXBkYXRlIHJlc291cmNlIHByb3BlcnR5IHR5cGUgPSAibGlzdCIKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKCJbMyw0XSIpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkudXBkYXRlUHJvcGVydHlPZlJlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIHByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5URVNURVIsIGZhbHNlKQorCQkJCS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUodXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTikpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gVmVyaWZ5IHJlc291cmNlJ3MgcHJpb3JpdHkgbGlzdCBkaWQgbm90IGNoYW5nZWQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgIlsyLDNdIik7CisJfQorCisJLy8gREUxOTk5NjQKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlTGlzdFByb3BlcnR5VG9Ob25FeGlzdGluZ1Jlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KCk7CisJCVN0cmluZyBQcm9wZXJ0eURlZmF1bHRWYWx1ZSA9ICJbMiwzXSI7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShQcm9wZXJ0eURlZmF1bHRWYWx1ZSk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUoImludGVnZXIiKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJU3RyaW5nIHJlc291cmNlVW5pcXVlSWQgPSBiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpOworCQliYXNpY1ZGQy5zZXRVbmlxdWVJZCgiMTExMTExMSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvcGVydHlSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLnVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBwcm9wZXJ0eVVuaXF1ZUlkLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKQorCQkJCS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUodXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9OT1RfRk9VTkQpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXVwZGF0ZVByb3BlcnR5UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIFZlcmlmeSByZXNvdXJjZSdzIHByaW9yaXR5IGxpc3QgZGlkIG5vdCBjaGFuZ2VkCisJCWJhc2ljVkZDLnNldFVuaXF1ZUlkKHJlc291cmNlVW5pcXVlSWQpOworCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzLCAiWzIsM10iKTsKKwl9CisKKwkvLyBERTE5OTcyNQorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VQcm9wZXJ0eUxpc3ROb25TdXBwb3J0ZWRQcm9wZXJ0eVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gTm90CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gImxpc3QiCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdHlwZQorCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlTdHJpbmcgUHJvcGVydHlEZWZhdWx0VmFsdWUgPSAiWzIsM10iOworCQlwcm9wZXJ0eURldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoUHJvcGVydHlEZWZhdWx0VmFsdWUpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCS8vIHVwZGF0ZSByZXNvdXJjZSBwcm9wZXJ0eQorCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gImxpc3R0dHR0dHR0IjsKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5VHlwZShwcm9wZXJ0eVR5cGUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUHJvcGVydHlSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLnVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBwcm9wZXJ0eVVuaXF1ZUlkLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKQorCQkJCS5yaWdodCgpLnZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eVR5cGUoKSk7IC8vIHByb3BlcnR5IGRhdGEgdHlwZQorCQkJCQkJCQkJCQkJCQkJLy8gKGtva28gaW5zdGVhZAorCQkJCQkJCQkJCQkJCQkJLy8gbGlzdCkKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST1BFUlRZX1RZUEUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gVmVyaWZ5IHJlc291cmNlJ3MgcHJpb3JpdHkgbGlzdCBkaWQgbm90IGNoYW5nZWQKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5VHlwZSgibGlzdCIpOworCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzLCAiWzIsM10iKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpIC8vIERFMTk5NzMyCisJcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VQcm9wZXJ0eUxpc3ROb25TdXBwb3J0ZWRFbnRyeVNjaGVtYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoKTsKKwkJU3RyaW5nIFByb3BlcnR5RGVmYXVsdFZhbHVlID0gIlsyLDNdIjsKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKFByb3BlcnR5RGVmYXVsdFZhbHVlKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZSgiaW50ZWdlciIpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRVbmlxdWVJZCgpOworCQkvLyB1cGRhdGUgcmVzb3VyY2UgcHJvcGVydHkKKwkJU3RyaW5nIEVudHJ5U2NoZW1hVHlwZSA9ICJpbnRlZ2VycnJycnIiOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKEVudHJ5U2NoZW1hVHlwZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkudXBkYXRlUHJvcGVydHlPZlJlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIHByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UpCisJCQkJLnJpZ2h0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZSh1cGRhdGVQcm9wZXJ0eVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoRW50cnlTY2hlbWFUeXBlKTsKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST1BFUlRZX0lOTkVSX1RZUEUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZSgiaW50ZWdlciIpOworCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzLCAiWzIsM10iKTsKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAidXBkYXRlUHJvcGVydGllc0xpc3REZWZhdWx0VmFsdWVTdWNjZXNzRmxvdyIpCisJcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VQcm9wZXJ0eUxpc3RTdWNjZXNzRmxvdyhTdHJpbmcgZW50cnlTY2hlbWFUeXBlLCBTdHJpbmcgcHJvcGVydHlEZWZhbHRWYWx1ZXMsCisJCQlTdHJpbmcgZXhwZWN0ZWRkZWZhdWx0VmFsdWVzLCBTdHJpbmcgbmV3RW50cnlTY2hlbWFUeXBlLCBTdHJpbmcgbmV3UHJvcGVydHlEZWZhbHRWYWx1ZXMsCisJCQlTdHJpbmcgbmV3RXhwZWN0ZWRkZWZhdWx0VmFsdWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKHByb3BlcnR5RGVmYWx0VmFsdWVzKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZShlbnRyeVNjaGVtYVR5cGUpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRVbmlxdWVJZCgpOworCQkvLyB2ZXJpZnkgcHJvcGVydGllcyByZXR1cm4gZnJvbSByZXNwb25zZQorCQlhc3NlcnRFcXVhbHMoImxpc3QiLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkZGVmYXVsdFZhbHVlcywgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHMsIGV4cGVjdGVkZGVmYXVsdFZhbHVlcyk7CisJCS8vIFVwZGF0ZSByZXNvdXJjZSBwcm9wZXJ0eSB0eXBlID0gImxpc3QiCisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShuZXdQcm9wZXJ0eURlZmFsdFZhbHVlcyk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUobmV3RW50cnlTY2hlbWFUeXBlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnR5QWZ0ZXJVcGRhdGUgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS51cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJsaXN0IiwgcmVzb3VyY2VQcm9wZXJ0eUFmdGVyVXBkYXRlLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhuZXdFeHBlY3RlZGRlZmF1bHRWYWx1ZXMsIHJlc291cmNlUHJvcGVydHlBZnRlclVwZGF0ZS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCksCisJCQkJcmVzb3VyY2VQcm9wZXJ0eUFmdGVyVXBkYXRlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzLCBuZXdFeHBlY3RlZGRlZmF1bHRWYWx1ZXMpOworCX0KKworCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkvLyBERTE5OTcxOAorCUBUZXN0KGRhdGFQcm92aWRlciA9ICJpbnZhbGlkTGlzdFByb3BlcnRpZXMiKSAvLyBpbnZhbGlkIGRlZmF1bHQgdmFsdWVzCisJcHVibGljIHZvaWQgYWRkTGlzdFByb3BlcnR5VG9SZXNvdXJjZUZhaWx1cmVGbG93KFN0cmluZyBlbnRyeVNjaGVtYVR5cGUsIFN0cmluZyBwcm9wZXJ0eURlZmFsdFZhbHVlcykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQkvLyBTdHJpbmcgcHJvcGVydHlUeXBlID0gImxpc3QiOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKGVudHJ5U2NoZW1hVHlwZSk7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShwcm9wZXJ0eURlZmFsdFZhbHVlcyk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYWRkUHJvcGVydHlUb1Jlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHlUeXBlKCkpOworCQl2YXJpYWJsZXMuYWRkKHByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7CisJCXZhcmlhYmxlcy5hZGQocHJvcGVydHlEZWZhbHRWYWx1ZXMpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09NUExFWF9ERUZBVUxUX1ZBTFVFLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCWFkZFByb3BlcnR5VG9SZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJLy8gREUxOTk5NjQKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZExpc3RQcm9wZXJ0eVRvTm9uRXhpc3RpbmdSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgiWzEsMl0iKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gbm9uIGV4aXN0aW5nIHJlc291cmNlCisJCWJhc2ljVkZDLnNldFVuaXF1ZUlkKCIxMTExMTExIik7CisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYWRkUHJvcGVydHlUb1Jlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTk9UX0ZPVU5EKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJYWRkUHJvcGVydHlUb1Jlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRMaXN0UHJvcGVydHlUb05vbkNoZWNrZWRPdXRSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgiWzEsMl0iKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gbm9uIENoZWNrZWQtT3V0IHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYWRkUHJvcGVydHlUb1Jlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04pKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWFkZFByb3BlcnR5VG9SZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkTGlzdFByb3BlcnR5VG9SZXNvdXJjZUJ5Tm9uUmVzb3VyY2VPd25lcigpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgiWzEsMl0iKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gbm9uIENoZWNrZWQtT3V0IHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIyLCBmYWxzZSkucmlnaHQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGFkZFByb3BlcnR5VG9SZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZExpc3RQcm9wZXJ0eVRvUmVzb3VyY2VQcm9wZXJ0eUFscmVhZHlFeGlzdHMwMSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gImxpc3QiOworCQlTdHJpbmcgcHJvcGVydHlTY2hlbWFUeXBlID0gImludGVnZXIiOworCQlTdHJpbmcgZGVmYXVsdFZhbHVlcyA9ICJbMSwyXSI7CisJCVN0cmluZyBleHBlY3RlZGRlZmF1bHRWYWx1ZXMgPSAiWzEsMl0iOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKHByb3BlcnR5U2NoZW1hVHlwZSk7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWVzKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIGNoZWNrLWluIGFuZCBjaGVjay1vdXQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZUNvbXBvbmVudFN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydFRydWUoY2hhbmdlQ29tcG9uZW50U3RhdGUuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUykpOworCQljaGFuZ2VDb21wb25lbnRTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShiYXNpY1ZGQywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0VHJ1ZShjaGFuZ2VDb21wb25lbnRTdGF0ZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKSk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJLy8gdmVyaWZ5IHByb3BlcnRpZXMgcmV0dXJuIGZyb20gcmVzcG9uc2UKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5VHlwZSk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCksIGV4cGVjdGVkZGVmYXVsdFZhbHVlcyk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCksIHByb3BlcnR5U2NoZW1hVHlwZSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgZXhwZWN0ZWRkZWZhdWx0VmFsdWVzKTsKKwkJLy8gQWRkIHNhbWUgcHJvcGVydHkgYWdhaW4gdG8gcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGFkZFByb3BlcnR5UmVzdFJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UpLnJpZ2h0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShhZGRQcm9wZXJ0eVJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUykpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZCgiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUFJPUEVSVFlfQUxSRUFEWV9FWElTVC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlhZGRQcm9wZXJ0eVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gdmVyaWZ5IHByb3BlcnR5IG5vdCBkZWxldGVkCisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHMsIGV4cGVjdGVkZGVmYXVsdFZhbHVlcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRMaXN0UHJvcGVydHlUb1Jlc291cmNlUHJvcGVydHlBbHJlYWR5RXhpc3RzMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHByb3BlcnR5VHlwZSA9ICJsaXN0IjsKKwkJU3RyaW5nIHByb3BlcnR5U2NoZW1hVHlwZSA9ICJpbnRlZ2VyIjsKKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZXMgPSAiWzEsMl0iOworCQlTdHJpbmcgZXhwZWN0ZWRkZWZhdWx0VmFsdWVzID0gIlsxLDJdIjsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZShwcm9wZXJ0eVNjaGVtYVR5cGUpOworCQlwcm9wZXJ0eURldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlcyk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCS8vIHZlcmlmeSBwcm9wZXJ0aWVzIHJldHVybiBmcm9tIHJlc3BvbnNlCisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eVR5cGUpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpLCBleHBlY3RlZGRlZmF1bHRWYWx1ZXMpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLCBwcm9wZXJ0eVNjaGVtYVR5cGUpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHMsIGV4cGVjdGVkZGVmYXVsdFZhbHVlcyk7CisJCS8vIGNoZWNrLWluIGFuZCBjaGVjay1vdXQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZUNvbXBvbmVudFN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydFRydWUoY2hhbmdlQ29tcG9uZW50U3RhdGUuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUykpOworCQljaGFuZ2VDb21wb25lbnRTdGF0ZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShiYXNpY1ZGQywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0VHJ1ZShjaGFuZ2VDb21wb25lbnRTdGF0ZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKSk7CisJCS8vIEFkZCBzYW1lIHByb3BlcnR5IGFnYWluIHRvIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVJlc3RSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYWRkUHJvcGVydHlSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlBST1BFUlRZX0FMUkVBRFlfRVhJU1QubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJYWRkUHJvcGVydHlSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIHZlcmlmeSBwcm9wZXJ0eSBub3QgZGVsZXRlZAorCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzLCBleHBlY3RlZGRlZmF1bHRWYWx1ZXMpOworCX0KKworCUBUZXN0IC8vIERFMTk5NzI1CisJcHVibGljIHZvaWQgYWRkTGlzdFByb3BlcnR5VG9SZXNvdXJjZU5vblN1cHBvcnRlZFByb3BlcnR5VHlwZSgpIHRocm93cyBFeGNlcHRpb24geyAvLyBOb3QKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAibGlzdCIKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0eXBlCisJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSAibGlzdHR0dHR0dHQiOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuc2V0UHJvcGVydHlUeXBlKHByb3BlcnR5VHlwZSk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVJlc3RSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYWRkUHJvcGVydHlSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHlUeXBlKCkpOyAvLyBwcm9wZXJ0eSBkYXRhIHR5cGUKKwkJCQkJCQkJCQkJCQkJCS8vIChrb2tvIGluc3RlYWQKKwkJCQkJCQkJCQkJCQkJCS8vIGxpc3QpCisJCXZhcmlhYmxlcy5hZGQocHJvcGVydHlEZXRhaWxzLmdldE5hbWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9QUk9QRVJUWV9UWVBFLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCWFkZFByb3BlcnR5UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0IC8vIERFMTk5NzMyCisJcHVibGljIHZvaWQgYWRkTGlzdFByb3BlcnR5VG9SZXNvdXJjZU5vblN1cHBvcnRlZEVudHJ5U2NoZW1hVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgRW50cnlTY2hlbWFUeXBlID0gInN0cmluZ2dnZyI7IC8vIGluc3RlYWQgInN0cmluZyIKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZShFbnRyeVNjaGVtYVR5cGUpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgYWRkUHJvcGVydHlSZXN0UmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBmYWxzZSkucmlnaHQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGFkZFByb3BlcnR5UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoRW50cnlTY2hlbWFUeXBlKTsKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST1BFUlRZX0lOTkVSX1RZUEUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJYWRkUHJvcGVydHlSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRIdW5kcmVkUHJvcGVydHlMaXN0VG9SZXNvdXJjZVN1Y2Nlc3NGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSAibGlzdCI7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlEZXRhaWxzLmdldE5hbWUoKTsKKwkJaW50IG51bWJlck9mUHJvcGVydGllc1RvQWRkVG9SZXNvdXJjZSA9IDEwMDsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2U7CisJCWZvciAoaW50IHggPSAwOyB4IDwgbnVtYmVyT2ZQcm9wZXJ0aWVzVG9BZGRUb1Jlc291cmNlOyB4KyspIHsKKwkJCXByb3BlcnR5RGV0YWlscy5zZXROYW1lKHByb3BlcnR5TmFtZSArIHgpOworCQkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQkJLy8gdmVyaWZ5IHByb3BlcnRpZXMgcmV0dXJuIGZyb20gcmVzcG9uc2UKKwkJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0TmFtZSgpLCBwcm9wZXJ0eU5hbWUgKyB4KTsKKwkJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eVR5cGUpOworCQkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgIltcImFcIixcImJcIl0iKTsKKwkJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCksCisJCQkJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJfQorCQkvLyBnZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB0aGF0IDEwMCBwcm9wZXJ0aWVzIGV4aXN0CisJCVJlc291cmNlIHJlc291cmNlT2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QoYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFzc2VydEVxdWFscyhudW1iZXJPZlByb3BlcnRpZXNUb0FkZFRvUmVzb3VyY2UsIHJlc291cmNlT2JqZWN0LmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworCisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gInByb3BlcnRpZXNMaXN0RGVmYXVsdFZhbHVlU3VjY2Vzc0Zsb3ciKQorCXB1YmxpYyB2b2lkIGFkZExpc3RQcm9wZXJ0eVRvUmVzb3VyY2VTdWNjZXNzRmxvdyhTdHJpbmcgZW50cnlTY2hlbWFUeXBlLCBTdHJpbmcgcHJvcGVydHlEZWZhbHRWYWx1ZXMsCisJCQlTdHJpbmcgZXhwZWN0ZWRkZWZhdWx0VmFsdWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHByb3BlcnR5VHlwZSA9ICJsaXN0IjsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZShlbnRyeVNjaGVtYVR5cGUpOworCQlwcm9wZXJ0eURldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUocHJvcGVydHlEZWZhbHRWYWx1ZXMpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQkvLyB2ZXJpZnkgcHJvcGVydGllcyByZXR1cm4gZnJvbSByZXNwb25zZQorCQlhc3NlcnRFcXVhbHMocHJvcGVydHlUeXBlLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkZGVmYXVsdFZhbHVlcywgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGVudHJ5U2NoZW1hVHlwZSwgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzLCBleHBlY3RlZGRlZmF1bHRWYWx1ZXMpOworCisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eVR5cGUpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpLCBleHBlY3RlZGRlZmF1bHRWYWx1ZXMpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLCBlbnRyeVNjaGVtYVR5cGUpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHMsIGV4cGVjdGVkZGVmYXVsdFZhbHVlcyk7CisJfQorCisJLy8gRGVsZXRlIHByb3BlcnR5IHR5cGUgbGlzdAorCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlT25lT2ZUaGVMaXN0UHJvcGVydGllc0Zyb21SZXNvdXJjZUFuZEFkZEl0QWdhaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2U7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLlNUUklOR19MSVNUKTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlsc0ludGVnZXIgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uSU5URUdFUl9MSVNUKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCAyIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgIltcImFcIixcImJcIl0iKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzSW50ZWdlciwgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgIlsxLDJdIik7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCksCisJCQkJcHJvcGVydHlEZXRhaWxzSW50ZWdlci5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7CisJCS8vIEdldCByZXNvdXJjZSBhbmQgdmVyaWZ5IHVwZGF0ZWQgZGVmYXVsdCB2YWx1ZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCS8vIERlbGV0ZSBvbmUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFzc2VydFRydWUoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9ERUxFVEUgPT0gZGVsZXRlUHJvcGVydHlPZlJlc291cmNlLmdldEVycm9yQ29kZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgdXBkYXRlZCBkZWZhdWx0IHZhbHVlCisJCXJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgIltcImFcIixcImJcIl0iKTsKKwkJLy8gQWRkIGRlbGV0ZWQgcHJvcGVydHkgYWdhaW4gdG8gcmVzb3VyY2UKKwkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlsc0ludGVnZXIsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFR5cGUoKSwgcHJvcGVydHlEZXRhaWxzSW50ZWdlci5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCksICJbMSwyXSIpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXByb3BlcnR5RGV0YWlsc0ludGVnZXIuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVQcm9wZXJ0eUxpc3RUeXBlSW50ZWdlcigpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uU1RSSU5HX0xJU1QpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzSW50ZWdlciA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5JTlRFR0VSX0xJU1QpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIDIgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcuZ2V0UHJvcGVydHlUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpLCAiW1wiYVwiLFwiYlwiXSIpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc0ludGVnZXIuZ2V0UHJvcGVydHlUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpLCAiWzEsMl0iKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgdXBkYXRlZCBkZWZhdWx0IHZhbHVlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJLy8gRGVsZXRlIG9uZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0RFTEVURSA9PSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCAiWzEsMl0iKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVByb3BlcnR5TGlzdFR5cGVCb29sZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5CT09MRUFOX0xJU1QpOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzSW50ZWdlciA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5JTlRFR0VSX0xJU1QpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIDIgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcuZ2V0UHJvcGVydHlUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpLCAiW3RydWUsZmFsc2VdIik7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCksCisJCQkJcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlsc0ludGVnZXIsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFR5cGUoKSwgcHJvcGVydHlEZXRhaWxzSW50ZWdlci5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCksICJbMSwyXSIpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXByb3BlcnR5RGV0YWlsc0ludGVnZXIuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworCQkvLyBEZWxldGUgb25lIHByb3BlcnR5CisJCVJlc3RSZXNwb25zZSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5kZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9wZXJ0eVVuaXF1ZUlkLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhc3NlcnRUcnVlKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfREVMRVRFID09IGRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSk7CisJCS8vIEdldCByZXNvdXJjZSBhbmQgdmVyaWZ5IHVwZGF0ZWQgZGVmYXVsdCB2YWx1ZQorCQlyZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlsc0ludGVnZXIsICJbMSwyXSIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHlMaXN0VHlwZUZsb2F0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5GTE9BVF9MSVNUKTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlsc0ludGVnZXIgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uSU5URUdFUl9MSVNUKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCAyIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgIlsxLjAsMi4wXSIpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc0ludGVnZXIuZ2V0UHJvcGVydHlUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpLCAiWzEsMl0iKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgdXBkYXRlZCBkZWZhdWx0IHZhbHVlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJLy8gRGVsZXRlIG9uZSBwcm9wZXJ0eQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0RFTEVURSA9PSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCAiWzEsMl0iKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVByb3BlcnR5TGlzdEFscmVhZHlEZWxldGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5GTE9BVF9MSVNUKTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlsc0ludGVnZXIgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uSU5URUdFUl9MSVNUKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCAyIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgIlsxLjAsMi4wXSIpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc0ludGVnZXIuZ2V0UHJvcGVydHlUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpLCAiWzEsMl0iKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgdXBkYXRlZCBkZWZhdWx0IHZhbHVlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJLy8gRGVsZXRlIG9uZSBwcm9wZXJ0eQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0RFTEVURSA9PSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCAiWzEsMl0iKTsKKwkJLy8gZGVsZXRlIGFnYWluIHRoZSBzYW1lIHByb3BlcnR5CisJCWRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFzc2VydFRydWUoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9OT1RfRk9VTkQgPT0gZGVsZXRlUHJvcGVydHlPZlJlc291cmNlLmdldEVycm9yQ29kZSgpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlBST1BFUlRZX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVQcm9wZXJ0eUxpc3RSZXNvdXJjZUlzTm90Q2hlY2tlZE91dFN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5GTE9BVF9MSVNUKTsKKwkJU3RyaW5nIGV4cGVjdGVkRGVmYXVsdHZhbHVlcyA9ICJbMS4wLDIuMF0iOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgZXhwZWN0ZWREZWZhdWx0dmFsdWVzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcsIGV4cGVjdGVkRGVmYXVsdHZhbHVlcyk7CisJCS8vIENoZWNrLWluIHJlc291cmNlCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSk7CisJCS8vIERlbGV0ZSBwcm9wZXJ0eQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OID09IGRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEdldCByZXNvdXJjZSBhbmQgdmVyaWZ5IHByb3BlcnR5IGlzIG5vdCBkZWxldGVkCisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLCBleHBlY3RlZERlZmF1bHR2YWx1ZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHlMaXN0UmVzb3VyY2VCeU5vdElzTm9uUmVzb3VjZU93bmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRMaXN0UHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5GTE9BVF9MSVNUKTsKKwkJU3RyaW5nIGV4cGVjdGVkRGVmYXVsdHZhbHVlcyA9ICJbMS4wLDIuMF0iOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgZXhwZWN0ZWREZWZhdWx0dmFsdWVzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcsIGV4cGVjdGVkRGVmYXVsdHZhbHVlcyk7CisJCS8vIERlbGV0ZSBwcm9wZXJ0eSBieSBub24gcmVzb3VyY2Ugb3duZXIKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5ERVNJR05FUjIpOworCQlhc3NlcnRUcnVlKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04gPT0gZGVsZXRlUHJvcGVydHlPZlJlc291cmNlLmdldEVycm9yQ29kZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgcHJvcGVydHkgaXMgbm90IGRlbGV0ZWQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcsIGV4cGVjdGVkRGVmYXVsdHZhbHVlcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVQcm9wZXJ0eUxpc3RGcm9tTm9uRXhpc3RpbmdSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uRkxPQVRfTElTVCk7CisJCVN0cmluZyBleHBlY3RlZERlZmF1bHR2YWx1ZXMgPSAiWzEuMCwyLjBdIjsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBhY3R1YWxSZXNvdXJjZVVuaXF1ZUlkID0gYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSwgZXhwZWN0ZWREZWZhdWx0dmFsdWVzKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcsIGV4cGVjdGVkRGVmYXVsdHZhbHVlcyk7CisJCS8vIERlbGV0ZSBwcm9wZXJ0eSBmcm9tIG5vbiBleGlzdGluZyByZXNvdXJjZQorCQliYXNpY1ZGQy5zZXRVbmlxdWVJZCgiMTExMTExMSIpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTk9UX0ZPVU5EKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl2YXJpYWJsZXMuYWRkKCIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJZGVsZXRlUHJvcGVydHlPZlJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSBwcm9wZXJ0eSBpcyBub3QgZGVsZXRlZAorCQliYXNpY1ZGQy5zZXRVbmlxdWVJZChhY3R1YWxSZXNvdXJjZVVuaXF1ZUlkKTsKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcsIGV4cGVjdGVkRGVmYXVsdHZhbHVlcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVQcm9wZXJ0eU9mRGVyaXZlZFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uU1RSSU5HX0xJU1QpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlTdHJpbmcgZGVyaXZlZFJlc291cmNlUHJvcGVydHlVbmlxdWVJZCA9IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRVbmlxdWVJZCgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCQkvLyBzZWNvbmQgcmVzb3VyY2UgZGVyaXZlZCBmcm9tIGJhc2ljVkZDCisJCVJlc291cmNlIHZmYzFGcm9tQmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZXNCeUN1c3RvbU5vcm1hdGl2ZVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsIGJhc2ljVkZDLAorCQkJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfQk9SREVSLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpCisJCQkJLmxlZnQoKS52YWx1ZSgpOworCQkvLyBEZWxldGUgcHJvcGVydHkgKGxpc3QpIG9mIGRlcml2ZWQgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZSgKKwkJCQl2ZmMxRnJvbUJhc2ljVkZDLmdldFVuaXF1ZUlkKCksIGRlcml2ZWRSZXNvdXJjZVByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFzc2VydFRydWUoZGVsZXRlUHJvcGVydHlPZlJlc291cmNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX05PVF9GT1VORCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZCgiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCWRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gVmVyaWZ5IHJlc291cmNlJ3MgcHJpb3JpdHkgbGlzdCBkaWQgbm90IGNoYW5nZWQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QodmZjMUZyb21CYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzLCAiW1wiYVwiLFwiYlwiXSIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHlPZk5vbkRlcml2ZWRSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlMaXN0U3RyaW5nID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLlNUUklOR19MSVNUKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlMaXN0U3RyaW5nLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKwkJLy8gc2Vjb25kIHJlc291cmNlIGRlcml2ZWQgZnJvbSBiYXNpY1ZGQworCQlSZXNvdXJjZSB2ZmMxRnJvbUJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VzQnlDdXN0b21Ob3JtYXRpdmVUeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLCBiYXNpY1ZGQywKKwkJCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLkFQUExJQ0FUSU9OX0w0X0JPUkRFUiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJLy8gYWRkIHByb3BlcnR5IFR5cGUgbGlzdCB0byBzZWNvbmQgcmVzb3VyY2UKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5TGlzdEludGVnZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uSU5URUdFUl9MSVNUKTsKKwkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5TGlzdEludGVnZXIsIHZmYzFGcm9tQmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCS8vIERlbGV0ZSBwcm9wZXJ0eSAobGlzdCkgb2YgZGVyaXZlZCByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKHZmYzFGcm9tQmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSwgcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0RFTEVURSA9PSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlMaXN0U3RyaW5nLCAiW1wiYVwiLFwiYlwiXSIpOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChSZXNvdXJjZSByZXNvdXJjZSwgUHJvcGVydHlSZXFEZXRhaWxzIGV4cGVjdGVkUHJvcGVydHksCisJCQlTdHJpbmcgZXhwZWN0ZWRkZWZhdWx0VmFsdWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gZ2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgcHJvcGVydHkgZnJvbSB0eXBlIGxpc3QKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IGFjdHVhbFJlc291cmNlUHJvcGVydGllcyA9IGdldFJlc291cmNlLmdldFByb3BlcnRpZXMoKTsKKwkJYm9vbGVhbiBpc1Byb3BlcnR5QXBwZWFyID0gZmFsc2U7CisJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHBybyA6IGFjdHVhbFJlc291cmNlUHJvcGVydGllcykgeworCQkJaWYgKGV4cGVjdGVkUHJvcGVydHkuZ2V0TmFtZSgpLmVxdWFscyhwcm8uZ2V0TmFtZSgpKSkgeworCQkJCWFzc2VydFRydWUoIkNoZWNrIFByb3BlcnR5IFR5cGUgIiwgcHJvLmdldFR5cGUoKS5lcXVhbHMoZXhwZWN0ZWRQcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKSkpOworCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgUHJvcGVydHkgIGRlZmF1bHQgdmFsdWVzICIsIGV4cGVjdGVkZGVmYXVsdFZhbHVlcywgcHJvLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCQkvLyBhc3NlcnRUcnVlKCJDaGVjayBQcm9wZXJ0eSBkZWZhdWx0IHZhbHVlcyAiLAorCQkJCS8vIHByby5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoZXhwZWN0ZWRkZWZhdWx0VmFsdWVzKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgZW50cnlTY2hlbWEgUHJvcGVydHkgVHlwZSAiLCBwcm8uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkKKwkJCQkJCS5lcXVhbHMoZXhwZWN0ZWRQcm9wZXJ0eS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSkpOworCQkJCWlzUHJvcGVydHlBcHBlYXIgPSB0cnVlOworCQkJfQorCQl9CisJCWFzc2VydFRydWUoaXNQcm9wZXJ0eUFwcGVhcik7CisJfQorCisJLy8gVVM2NTY5MDUKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFwIFByb3BlcnR5CisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUBUZXN0KGRhdGFQcm92aWRlciA9ICJ1cGRhdGVQcm9wZXJ0aWVzTWFwRGVmYXVsdFZhbHVlRmFpbHVyZUZsb3ciKQorCXB1YmxpYyB2b2lkIHVwZGF0ZURlZmF1bHRWYWx1ZU9mUmVzb3VyY2VQcm9wZXJ0eU1hcEZhaWx1cmVGbG93KFN0cmluZyBlbnRyeVNjaGVtYVR5cGUsIFN0cmluZyBwcm9wZXJ0eURlZmF1bHRWYWx1ZXMsCisJCQlTdHJpbmcgZXhwZWN0ZWREZWZhdWx0VmFsdWUsIFN0cmluZyBuZXdFbnRyeVNjaGVtYVR5cGUsIFN0cmluZyBuZXdQcm9wZXJ0eURlZmF1bHRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TWFwUHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKHByb3BlcnR5RGVmYXVsdFZhbHVlcyk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUoZW50cnlTY2hlbWFUeXBlKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJLy8gdmVyaWZ5IHByb3BlcnRpZXMgcmV0dXJuIGZyb20gcmVzcG9uc2UKKwkJYXNzZXJ0RXF1YWxzKCJtYXAiLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRGVmYXVsdFZhbHVlLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMocHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgZXhwZWN0ZWREZWZhdWx0VmFsdWUpOworCQkvLyBVcGRhdGUgcmVzb3VyY2UgcHJvcGVydHkgdHlwZSA9ICJtYXAiCisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShuZXdQcm9wZXJ0eURlZmF1bHRWYWx1ZSk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUobmV3RW50cnlTY2hlbWFUeXBlKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVByb3BlcnR5UmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS51cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBmYWxzZSkKKwkJCQkucmlnaHQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKHVwZGF0ZVByb3BlcnR5UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJdmFyaWFibGVzLmFkZChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHlUeXBlKCkpOworCQl2YXJpYWJsZXMuYWRkKHByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7CisJCXZhcmlhYmxlcy5hZGQobmV3UHJvcGVydHlEZWZhdWx0VmFsdWUpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09NUExFWF9ERUZBVUxUX1ZBTFVFLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXVwZGF0ZVByb3BlcnR5UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gInVwZGF0ZVByb3BlcnRpZXNNYXBEZWZhdWx0VmFsdWVTdWNjZXNzRmxvdyIpCisJcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VQcm9wZXJ0eU1hcFN1Y2Nlc3NGbG93KFN0cmluZyBlbnRyeVNjaGVtYVR5cGUsIFN0cmluZyBwcm9wZXJ0eURlZmF1bHRWYWx1ZXMsCisJCQlTdHJpbmcgZXhwZWN0ZWREZWZhdWx0VmFsdWUsIFN0cmluZyBuZXdFbnRyeVNjaGVtYVR5cGUsIFN0cmluZyBuZXdQcm9wZXJ0eURlZmF1bHRWYWx1ZSwKKwkJCVN0cmluZyBuZXdFeHBlY3RlZERlZmF1bHRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TWFwUHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZXRhaWxzLnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKHByb3BlcnR5RGVmYXVsdFZhbHVlcyk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUoZW50cnlTY2hlbWFUeXBlKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJLy8gdmVyaWZ5IHByb3BlcnRpZXMgcmV0dXJuIGZyb20gcmVzcG9uc2UKKwkJYXNzZXJ0RXF1YWxzKCJtYXAiLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRGVmYXVsdFZhbHVlLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMocHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgZXhwZWN0ZWREZWZhdWx0VmFsdWUpOworCQkvLyBVcGRhdGUgcmVzb3VyY2UgcHJvcGVydHkgdHlwZSA9ICJtYXAiCisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShuZXdQcm9wZXJ0eURlZmF1bHRWYWx1ZSk7CisJCXByb3BlcnR5RGV0YWlscy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUobmV3RW50cnlTY2hlbWFUeXBlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnR5QWZ0ZXJVcGRhdGUgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS51cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzLCBiYXNpY1ZGQywgcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKQorCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYXAiLCByZXNvdXJjZVByb3BlcnR5QWZ0ZXJVcGRhdGUuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ld0V4cGVjdGVkRGVmYXVsdFZhbHVlLCByZXNvdXJjZVByb3BlcnR5QWZ0ZXJVcGRhdGUuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMocHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXJlc291cmNlUHJvcGVydHlBZnRlclVwZGF0ZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlscywgbmV3RXhwZWN0ZWREZWZhdWx0VmFsdWUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHlNYXBUeXBlU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRNYXBQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLlNUUklOR19NQVApOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzSW50ZWdlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRNYXBQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLklOVEVHRVJfTUFQKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCAyIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ7XCJrZXkxXCI6XCJ2YWwxXCIsXCJrZXkyXCI6XCJ2YWwyXCJ9IiwgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlU3RyaW5nLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsgLy8gc3RyaW5nL2ludGVnZXIvYm9vbGVhbi9mbG9hdAorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzSW50ZWdlciwgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ7XCJrZXkxXCI6MTIzLFwia2V5MlwiOi00NTZ9IiwgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgdXBkYXRlZCBkZWZhdWx0IHZhbHVlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJLy8gRGVsZXRlIG9uZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0RFTEVURSA9PSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCAie1wia2V5MVwiOjEyMyxcImtleTJcIjotNDU2fSIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHlNYXBUeXBlRmxvYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2U7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHNUeXBlRmxvYXQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TWFwUHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5GTE9BVF9NQVApOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzSW50ZWdlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRNYXBQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLklOVEVHRVJfTUFQKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCAyIHByb3BlcnR5IHR5cGUgbGlzdCB0byByZXNvdXJjZQorCQlyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDdXN0b21Qcm9wZXJ0eVRvUmVzb3VyY2UocHJvcGVydHlEZXRhaWxzVHlwZUZsb2F0LCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc1R5cGVGbG9hdC5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygie1wia2V5MVwiOjAuMjEyMyxcImtleTJcIjo0My41NDV9IiwgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlRmxvYXQuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHNJbnRlZ2VyLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc0ludGVnZXIuZ2V0UHJvcGVydHlUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIntcImtleTFcIjoxMjMsXCJrZXkyXCI6LTQ1Nn0iLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLAorCQkJCXByb3BlcnR5RGV0YWlsc0ludGVnZXIuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworCQkvLyBEZWxldGUgb25lIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5kZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlwcm9wZXJ0eVVuaXF1ZUlkLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlhc3NlcnRUcnVlKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfREVMRVRFID09IGRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSk7CisJCS8vIEdldCByZXNvdXJjZSBhbmQgdmVyaWZ5IHVwZGF0ZWQgZGVmYXVsdCB2YWx1ZQorCQlyZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJdmVyaWZ5UmVzb3VyY2VQcm9wZXJ0eUxpc3QoYmFzaWNWRkMsIHByb3BlcnR5RGV0YWlsc0ludGVnZXIsICJ7XCJrZXkxXCI6MTIzLFwia2V5MlwiOi00NTZ9Iik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVQcm9wZXJ0eU1hcFR5cGVCb29sZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlOworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzVHlwZUJvb2xlYW4gPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0TWFwUHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5CT09MRUFOX01BUCk7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHNJbnRlZ2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdE1hcFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uSU5URUdFUl9NQVApOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIDIgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCXJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHNUeXBlQm9vbGVhbiwgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VHlwZSgpLCBwcm9wZXJ0eURldGFpbHNUeXBlQm9vbGVhbi5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiwgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlQm9vbGVhbi5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlsc0ludGVnZXIsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFR5cGUoKSwgcHJvcGVydHlEZXRhaWxzSW50ZWdlci5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygie1wia2V5MVwiOjEyMyxcImtleTJcIjotNDU2fSIsIHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCksCisJCQkJcHJvcGVydHlEZXRhaWxzSW50ZWdlci5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7CisJCS8vIEdldCByZXNvdXJjZSBhbmQgdmVyaWZ5IHVwZGF0ZWQgZGVmYXVsdCB2YWx1ZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCS8vIERlbGV0ZSBvbmUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmRlbGV0ZVByb3BlcnR5T2ZSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpLAorCQkJCXByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFzc2VydFRydWUoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9ERUxFVEUgPT0gZGVsZXRlUHJvcGVydHlPZlJlc291cmNlLmdldEVycm9yQ29kZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgdXBkYXRlZCBkZWZhdWx0IHZhbHVlCisJCXJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzSW50ZWdlciwgIntcImtleTFcIjoxMjMsXCJrZXkyXCI6LTQ1Nn0iKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVByb3BlcnR5TWFwVHlwZUludGVnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2U7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eURldGFpbHNUeXBlSW50ZWdlciA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRNYXBQcm9wZXJ0eShQcm9wZXJ0eVR5cGVFbnVtLklOVEVHRVJfTUFQKTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlsc0Jvb2xlYW4gPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0TWFwUHJvcGVydHkoUHJvcGVydHlUeXBlRW51bS5CT09MRUFOX01BUCk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgMiBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlsc1R5cGVJbnRlZ2VyLCBiYXNpY1ZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0VW5pcXVlSWQoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCksIHByb3BlcnR5RGV0YWlsc1R5cGVJbnRlZ2VyLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ7XCJrZXkxXCI6MTIzLFwia2V5MlwiOi00NTZ9IiwgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNUeXBlSW50ZWdlci5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlsc0Jvb2xlYW4sIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFR5cGUoKSwgcHJvcGVydHlEZXRhaWxzQm9vbGVhbi5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9IiwgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSwKKwkJCQlwcm9wZXJ0eURldGFpbHNCb29sZWFuLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpKTsKKwkJLy8gR2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgdXBkYXRlZCBkZWZhdWx0IHZhbHVlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShiYXNpY1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKwkJLy8gRGVsZXRlIG9uZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvcGVydHlPZlJlc291cmNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGVsZXRlUHJvcGVydHlPZlJlc291cmNlKGJhc2ljVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJcHJvcGVydHlVbmlxdWVJZCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJYXNzZXJ0VHJ1ZShCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0RFTEVURSA9PSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQkvLyBHZXQgcmVzb3VyY2UgYW5kIHZlcmlmeSB1cGRhdGVkIGRlZmF1bHQgdmFsdWUKKwkJcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoYmFzaWNWRkMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHNCb29sZWFuLCAie1wia2V5MVwiOnRydWUsXCJrZXkyXCI6ZmFsc2V9Iik7CisJfQorCisJQFRlc3QoZGF0YVByb3ZpZGVyID0gInByb3BlcnRpZXNNYXBEZWZhdWx0VmFsdWVTdWNjZXNzRmxvdyIpCisJcHVibGljIHZvaWQgYWRkTWFwUHJvcGVydHlUb1Jlc291cmNlU3VjY2Vzc0Zsb3coU3RyaW5nIGVudHJ5U2NoZW1hVHlwZSwgU3RyaW5nIHByb3BlcnR5RGVmYWx0VmFsdWVzLAorCQkJU3RyaW5nIGV4cGVjdGVkZGVmYXVsdFZhbHVlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSAibWFwIjsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRNYXBQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKGVudHJ5U2NoZW1hVHlwZSk7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZShwcm9wZXJ0eURlZmFsdFZhbHVlcyk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgcHJvcGVydHkgdHlwZSBsaXN0IHRvIHJlc291cmNlCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCS8vIHZlcmlmeSBwcm9wZXJ0aWVzIHJldHVybiBmcm9tIHJlc3BvbnNlCisJCWFzc2VydEVxdWFscyhwcm9wZXJ0eVR5cGUsIHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRkZWZhdWx0VmFsdWVzLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoZW50cnlTY2hlbWFUeXBlLCByZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkpOyAvLyBzdHJpbmcvaW50ZWdlci9ib29sZWFuL2Zsb2F0CisJCXZlcmlmeVJlc291cmNlUHJvcGVydHlMaXN0KGJhc2ljVkZDLCBwcm9wZXJ0eURldGFpbHMsIGV4cGVjdGVkZGVmYXVsdFZhbHVlcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRNYXBQcm9wZXJ0eVRvTm9uRXhpc3RpbmdSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlQcm9wZXJ0eVJlcURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURldGFpbHMuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJpbnRlZ2VyIik7CisJCXByb3BlcnR5RGV0YWlscy5zZXRQcm9wZXJ0eURlZmF1bHRWYWx1ZSgie1wia2V5MVwiOjEgLCBcImtleTJcIjoyfSIpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzb3VyY2UgYmFzaWNWRkMgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJLy8gQWRkIHByb3BlcnR5IHR5cGUgbGlzdCB0byBub24gZXhpc3RpbmcgcmVzb3VyY2UKKwkJYmFzaWNWRkMuc2V0VW5pcXVlSWQoIjExMTExMTEiKTsKKwkJUmVzdFJlc3BvbnNlIGFkZFByb3BlcnR5VG9SZXNvdXJjZVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlscywgYmFzaWNWRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UpLnJpZ2h0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9OT1RfRk9VTkQpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZE1hcHRQcm9wZXJ0eVRvUmVzb3VyY2VCeU5vblJlc291cmNlT3duZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRMaXN0UHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZXRhaWxzLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZSgiaW50ZWdlciIpOworCQlwcm9wZXJ0eURldGFpbHMuc2V0UHJvcGVydHlEZWZhdWx0VmFsdWUoIntcImtleTFcIjoxICwgXCJrZXkyXCI6Mn0iKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc291cmNlIGJhc2ljVkZDID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRkMsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpCisJCQkJLnZhbHVlKCk7CisJCS8vIEFkZCBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gbm9uIENoZWNrZWQtT3V0IHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZEN1c3RvbVByb3BlcnR5VG9SZXNvdXJjZShwcm9wZXJ0eURldGFpbHMsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIyLCBmYWxzZSkucmlnaHQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGFkZFByb3BlcnR5VG9SZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlhZGRQcm9wZXJ0eVRvUmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZE1hcFByb3BlcnR5VG9SZXNvdXJjZVByb3BlcnR5QWxyZWFkeUV4aXN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0uU1RSSU5HX01BUCk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZSBiYXNpY1ZGQyA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQkvLyBBZGQgMiBwcm9wZXJ0eSB0eXBlIGxpc3QgdG8gcmVzb3VyY2UKKwkJcmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKQorCQkJCS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VQcm9wZXJ0aWVzRnJvbVJlc3BvbnNlLmdldFR5cGUoKSwgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZy5nZXRQcm9wZXJ0eVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygie1wia2V5MVwiOlwidmFsMVwiLFwia2V5MlwiOlwidmFsMlwifSIsIHJlc291cmNlUHJvcGVydGllc0Zyb21SZXNwb25zZS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVByb3BlcnRpZXNGcm9tUmVzcG9uc2UuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCksCisJCQkJcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZy5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKSk7IC8vIHN0cmluZy9pbnRlZ2VyL2Jvb2xlYW4vZmxvYXQKKwkJLy8gY2hlY2staW4gYW5kIGNoZWNrLW91dCByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgY2hhbmdlQ29tcG9uZW50U3RhdGUgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoYmFzaWNWRkMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0VHJ1ZShjaGFuZ2VDb21wb25lbnRTdGF0ZS5nZXRFcnJvckNvZGUoKS5lcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKSk7CisJCWNoYW5nZUNvbXBvbmVudFN0YXRlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGJhc2ljVkZDLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRUcnVlKGNoYW5nZUNvbXBvbmVudFN0YXRlLmdldEVycm9yQ29kZSgpLmVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpKTsKKwkJLy8gQWRkIHNhbWUgcHJvcGVydHkgYWdhaW4gdG8gcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGFkZFByb3BlcnR5UmVzdFJlc3BvbnNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKHByb3BlcnR5RGV0YWlsc1R5cGVTdHJpbmcsIGJhc2ljVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlKS5yaWdodCgpCisJCQkJLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYWRkUHJvcGVydHlSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMpKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlBST1BFUlRZX0FMUkVBRFlfRVhJU1QubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJYWRkUHJvcGVydHlSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIHZlcmlmeSBwcm9wZXJ0eSBub3QgZGVsZXRlZAorCQl2ZXJpZnlSZXNvdXJjZVByb3BlcnR5TGlzdChiYXNpY1ZGQywgcHJvcGVydHlEZXRhaWxzVHlwZVN0cmluZywgIntcImtleTFcIjpcInZhbDFcIixcImtleTJcIjpcInZhbDJcIn0iKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L1Byb3BlcnR5QXBpc1Rlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Byb3BlcnR5L1Byb3BlcnR5QXBpc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTMwMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcHJvcGVydHkvUHJvcGVydHlBcGlzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzgzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9wZXJ0eVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucHJlUmVxdWlzaXRlcy5TaW1wbGVPbmVSc3JjT25lU2VydmljZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlByb3BlcnR5UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlVzZXJSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFByb3BlcnR5QXBpc1Rlc3QgZXh0ZW5kcyBTaW1wbGVPbmVSc3JjT25lU2VydmljZVRlc3QgeworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQ0FURUdPUlkgPSAiR2VuZXJpYy9EYXRhYmFzZXMiOworCXByb3RlY3RlZCBDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisJcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHJvdGVjdGVkIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOzsKKworCS8vIHByb3RlY3RlZCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHM7CisJLy8gcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJcHJvdGVjdGVkIFByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGJvZHk7CisKKwlwcm90ZWN0ZWQgSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgdGVzdE5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBQcm9wZXJ0eUFwaXNUZXN0KCkgeworCQlzdXBlcih0ZXN0TmFtZSwgUHJvcGVydHlBcGlzVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIC8vQ3JlYXRlIHVzZXIKKwkJLy8gc2RuY0Rlc2lnbmVyRGV0YWlscyA9IGNyZWF0ZVVzZXIoInR1MTIzNCIsICJUZXN0IiwgIlVzZXIiLAorCQkvLyAidHUxMjM0QGludGwuc2RjLmNvbSIsICJERVNJR05FUiIpOworCQkvLworCQkvLyAvL0RlbGV0ZSByZXNvdXJjZQorCQkvLworCQkvLyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKCk7CisJCS8vIHJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZU5hbWUoInRlc3RyZXNvdXJjZURldGFpbHMiKTsKKwkJLy8KKwkJLy8gcmVzb3VyY2VVdGlscy5kZWxldGVSZXNvdXJjZV9hbGxWZXJzaW9ucyhyZXNvdXJjZURldGFpbHMsCisJCS8vIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLworCQkvLyAvL0NyZWF0ZSByZXNvdXJjZQorCQkvLyByZXNvdXJjZURldGFpbHMgPSBjcmVhdGVSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkvLyAidGVzdHJlc291cmNlRGV0YWlscyIpOworCisJCS8vIENyZWF0ZSBwcm9wZXJ0eQorCQkvLyBwcm9wZXJ0eS5zZXRQcm9wZXJ0eU5hbWUoInRlc3QiKTsKKwkJLy8gcHJvcGVydHkuc2V0UHJvcGVydHlUeXBlKCJpbnRlZ2VyIik7CisJCS8vIHByb3BlcnR5LnNldFByb3BlcnR5U291cmNlKCJBJkFJIik7CisJCS8vIHByb3BlcnR5LnNldFByb3BlcnR5RGVzY3JpcHRpb24oInRlc3QgcHJvcGVydHkiKTsKKworCQkvLyBib2R5ID0gZ3Nvbi50b0pzb24ocHJvcGVydHkpOworCQlwcm9wZXJ0eSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9wZXJ0eSgpOworCQlib2R5ID0gcHJvcGVydHkucHJvcGVydHlUb0pzb25TdHJpbmcoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKGJvZHkpOworCQkvLyBIVFRQIChmb3IgbmVnYXRpdmUgdGVzdHMpCisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUFwaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIHByb3BlcnR5CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbiAoIi0tLS0gQ3JlYXRlIFByb3BlcnR5IChQT1NUKSAtLS0tIik7CisKKwkJU3RyaW5nIHByb3BlcnR5SWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKGdldFJlc291cmNlSWQocmVzb3VyY2VEZXRhaWxzKSwgcHJvcGVydHkuZ2V0TmFtZSgpKTsKKworCQlQcm9wZXJ0eVJlc3RVdGlscy5kZWxldGVQcm9wZXJ0eShnZXRSZXNvdXJjZUlkKHJlc291cmNlRGV0YWlscyksIHByb3BlcnR5SWQsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHlSZXNwb25zZSA9IFByb3BlcnR5UmVzdFV0aWxzLmNyZWF0ZVByb3BlcnR5KGdldFJlc291cmNlSWQocmVzb3VyY2VEZXRhaWxzKSwgYm9keSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgcmVzdWx0IGNvZGUgLSAyMDEsIHJlY2VpdmVkIC0gIiArIGNyZWF0ZVByb3BlcnR5UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJY3JlYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCisJCS8vIEdldCBwcm9wZXJ0eQorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4gKCItLS0tIEdldCBQcm9wZXJ0eSAoR0VUKSAtLS0tIik7CisJCVJlc3RSZXNwb25zZSBnZXRQcm9wZXJ0eVJlc3BvbnNlID0gUHJvcGVydHlSZXN0VXRpbHMuZ2V0UHJvcGVydHkoZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLCBwcm9wZXJ0eUlkLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJFeHBlY3RlZCByZXN1bHQgY29kZSAtIDIwMCwgcmVjZWl2ZWQgLSAiICsgZ2V0UHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlnZXRQcm9wZXJ0eVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJSlNPTk9iamVjdCBqc29uUmVzcCA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UoZ2V0UHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBhc3NlcnRUcnVlKCJXcm9uZyAndHlwZScgaW4gdGhlCisJCS8vIHJlc3BvbnNlIixqc29uUmVzcC5nZXQoInR5cGUiKS5lcXVhbHMocHJvcGVydHkuZ2V0UHJvcGVydHlUeXBlKCkpKTsKKwkJLy8gYXNzZXJ0VHJ1ZSgiV3JvbmcgJ3NvdXJjZScgaW4gdGhlCisJCS8vIHJlc3BvbnNlIixqc29uUmVzcC5nZXQoIm5hbWUiKS5lcXVhbHMocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCkpKTsKKwkJLy8gYXNzZXJ0VHJ1ZSgiV3JvbmcgJ25hbWUnIGluIHRoZQorCQkvLyByZXNwb25zZSIsanNvblJlc3AuZ2V0KCJzb3VyY2UiKS5lcXVhbHMocHJvcGVydHkuZ2V0UHJvcGVydHlTb3VyY2UoKSkpOworCQkvLyBhc3NlcnRUcnVlKCJXcm9uZyAnZGVzY3JpcHRpb24nIGluIHRoZQorCQkvLyByZXNwb25zZSIsanNvblJlc3AuZ2V0KCJkZXNjcmlwdGlvbiIpLmVxdWFscyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpKTsKKworCQkvLyBVcGRhdGUgcHJvcGVydHkKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuICgiLS0tLSBVcGRhdGUgUHJvcGVydHkgKFVQREFURSkgLS0tLSIpOworCQlwcm9wZXJ0eS5zZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCJVcGRhdGVkIGRlc2NyaXB0aW9uIik7CisJCS8vIGJvZHkgPSBnc29uLnRvSnNvbihwcm9wZXJ0eSk7CisJCWJvZHkgPSBwcm9wZXJ0eS5wcm9wZXJ0eVRvSnNvblN0cmluZygpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVJlc3BvbnNlID0gUHJvcGVydHlSZXN0VXRpbHMudXBkYXRlUHJvcGVydHkoZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLAorCQkJCXByb3BlcnR5SWQsIGJvZHksIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJFeHBlY3RlZCByZXN1bHQgY29kZSAtIDIwMCwgcmVjZWl2ZWQgLSAiICsgdXBkYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQl1cGRhdGVQcm9wZXJ0eVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJLy8gR2V0IHByb3BlcnR5CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbiAoIi0tLS0gR2V0IFByb3BlcnR5IChHRVQpIC0tLS0iKTsKKwkJZ2V0UHJvcGVydHlSZXNwb25zZSA9IFByb3BlcnR5UmVzdFV0aWxzLmdldFByb3BlcnR5KGdldFJlc291cmNlSWQocmVzb3VyY2VEZXRhaWxzKSwgcHJvcGVydHlJZCwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgcmVzdWx0IGNvZGUgLSAyMDAsIHJlY2VpdmVkIC0gIiArIGdldFByb3BlcnR5UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJZ2V0UHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCWpzb25SZXNwID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShnZXRQcm9wZXJ0eVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIGFzc2VydFRydWUoIldyb25nICd0eXBlJyBpbiB0aGUKKwkJLy8gcmVzcG9uc2UiLGpzb25SZXNwLmdldCgidHlwZSIpLmVxdWFscyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKSkpOworCQkvLyBhc3NlcnRUcnVlKCJXcm9uZyAnc291cmNlJyBpbiB0aGUKKwkJLy8gcmVzcG9uc2UiLGpzb25SZXNwLmdldCgibmFtZSIpLmVxdWFscyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSkpOworCQkvLyBhc3NlcnRUcnVlKCJXcm9uZyAnbmFtZScgaW4gdGhlCisJCS8vIHJlc3BvbnNlIixqc29uUmVzcC5nZXQoInNvdXJjZSIpLmVxdWFscyhwcm9wZXJ0eS5nZXRQcm9wZXJ0eVNvdXJjZSgpKSk7CisJCS8vIGFzc2VydFRydWUoIldyb25nICdkZXNjcmlwdGlvbicgaW4gdGhlCisJCS8vIHJlc3BvbnNlIixqc29uUmVzcC5nZXQoImRlc2NyaXB0aW9uIikuZXF1YWxzKHByb3BlcnR5LmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSkpOworCisJCS8vIERlbGV0ZSBwcm9wZXJ0eQorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4gKCItLS0tIERlbGV0ZSBQcm9wZXJ0eSAoREVMRVRFKSAtLS0tIik7CisJCVJlc3RSZXNwb25zZSBkZWxldGVQcm9wZXJ0eVJlc3BvbnNlID0gUHJvcGVydHlSZXN0VXRpbHMuZGVsZXRlUHJvcGVydHkoZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLAorCQkJCXByb3BlcnR5SWQsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJFeHBlY3RlZCByZXN1bHQgY29kZSAtIDIwNCwgcmVjZWl2ZWQgLSAiICsgZGVsZXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlkZWxldGVQcm9wZXJ0eVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwNCk7CisKKwkJLy8gR2V0IHByb3BlcnR5IC0gdmVyaWZ5IHRoYXQgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBHRVQgLSBQcm9wZXJ0eSBOb3QgRm91bmQgLS0tLSIpOworCQlnZXRQcm9wZXJ0eVJlc3BvbnNlID0gUHJvcGVydHlSZXN0VXRpbHMuZ2V0UHJvcGVydHkoZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLCBwcm9wZXJ0eUlkLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCWdldFByb3BlcnR5UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eUlkKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgUHJvcGVydHlSZXFEZXRhaWxzIHByb3BlcnR5KSB7CisJCS8vIHJldHVybgorCQkvLyByZXNvdXJjZS5nZXRSZXNvdXJjZU5hbWUoKS50b0xvd2VyQ2FzZSgpKyIuMC4xLiIrcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7CisJCXJldHVybiBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHByb3BlcnR5LmdldE5hbWUoKSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUlkKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSkgeworCQkvLyBTdHJpbmcgcmVzb3VyY2VVaWQgPQorCQkvLyBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXNvdXJjZVVuaXF1ZUlkKHJlc291cmNlLmdldFJlc291cmNlTmFtZSgpLAorCQkvLyAiMC4xIik7CisKKwkJcmV0dXJuIHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJfQorCisJcHJvdGVjdGVkIFVzZXIgY3JlYXRlVXNlcihTdHJpbmcgY3NwVXNlcklkLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyBlbWFpbCwgU3RyaW5nIHJvbGUpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBuZXcgVXNlcihmaXJzdE5hbWUsIGxhc3ROYW1lLCBjc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKworCQlVc2VyIGFkbWluVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCVVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihzZG5jVXNlckRldGFpbHMsIGFkbWluVXNlcik7CisKKwkJcmV0dXJuIHNkbmNVc2VyRGV0YWlsczsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlKFVzZXIgc2RuY1VzZXJEZXRhaWxzLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJLy8gU3RyaW5nIGNhdGVnb3J5ID0gUmVzb3VyY2VDYXRlZ29yeUVudW0uREFUQUJBU0UuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKCJ0b3NjYS5ub2Rlcy5Sb290Iik7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuMCI7CisJCVN0cmluZyBjb250YWN0SWQgPSBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBudWxsLAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQlyZXNvdXJjZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0RBVEFCQVNFLmdldENhdGVnb3J5KCksCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19EQVRBQkFTRS5nZXRTdWJDYXRlZ29yeSgpKTsKKwkJLy8gZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VOYW1lLnRvTG93ZXJDYXNlKCkrIi4wLjEiLHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCS8vIFRPRE8gZGVsZXRlIGJ5IG5hbWUKKwkJLy8gZGVsZXRlUmVzb3VyY2UoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVzb3VyY2VVbmlxdWVJZChyZXNvdXJjZU5hbWUsCisJCS8vICIwLjEiKSwgc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGNyZWF0ZVJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gMjAxKTsKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRVbmlxdWVJZChyZXNvdXJjZUlkKTsKKworCQlyZXR1cm4gcmVzb3VyY2VEZXRhaWxzOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXRSZXFUb0NyZWF0ZVVyaU5vdEFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFBVVCByZXF1ZXN0IHRvIENyZWF0ZSB1cmkgLSBOb3QgQWxsb3dlZAorCQkvLyAtLS0tIik7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1BST1BFUlRZLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCWdldFJlc291cmNlSWQocmVzb3VyY2VEZXRhaWxzKSk7CisJCVJlc3RSZXNwb25zZSBwcm9wZXJ0eUVycm9yUmVzcG9uc2UgPSBodHRwUmVxdWVzdC5odHRwU2VuZEJ5TWV0aG9kKHVybCwgIlBVVCIsIGJvZHksIGhlYWRlcnNNYXApOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXByb3BlcnR5RXJyb3JSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFJlcVRvQ3JlYXRlVXJpTm90QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gR0VUIHJlcXVlc3QgdG8gQ3JlYXRlIHVyaSAtIE5vdCBBbGxvd2VkCisJCS8vIC0tLS0iKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfUFJPUEVSVFksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpKTsKKwkJUmVzdFJlc3BvbnNlIHByb3BlcnR5RXJyb3JSZXNwb25zZSA9IGh0dHBSZXF1ZXN0Lmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcHJvcGVydHlFcnJvclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVxVG9DcmVhdGVVcmlOb3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBERUxFVEUgcmVxdWVzdCB0byBDcmVhdGUgdXJpIC0gTm90IEFsbG93ZWQKKwkJLy8gLS0tLSIpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNSRUFURV9QUk9QRVJUWSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlnZXRSZXNvdXJjZUlkKHJlc291cmNlRGV0YWlscykpOworCQlSZXN0UmVzcG9uc2UgcHJvcGVydHlFcnJvclJlc3BvbnNlID0gaHR0cFJlcXVlc3QuaHR0cFNlbmREZWxldGUodXJsLCBoZWFkZXJzTWFwKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlwcm9wZXJ0eUVycm9yUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwb3N0UmVxVG9VcGRhdGVVcmlOb3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBQT1NUIHJlcXVlc3QgdG8gVXBkYXRlIHVyaSAtIE5vdCBBbGxvd2VkCisJCS8vIC0tLS0iKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUFJPUEVSVFksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLCBnZXRQcm9wZXJ0eUlkKHJlc291cmNlRGV0YWlscywgcHJvcGVydHkpKTsKKwkJUmVzdFJlc3BvbnNlIHByb3BlcnR5RXJyb3JSZXNwb25zZSA9IGh0dHBSZXF1ZXN0Lmh0dHBTZW5kUG9zdCh1cmwsIGJvZHksIGhlYWRlcnNNYXApOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXByb3BlcnR5RXJyb3JSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVJlcVByb3BlcnR5Tm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tIERFTEVURSAtIFByb3BlcnR5IE5vdCBGb3VuZCAtLS0tIik7CisJCVN0cmluZyB1bmtub3duUHJvcGVydHlJZCA9IGdldFByb3BlcnR5SWQocmVzb3VyY2VEZXRhaWxzLCBwcm9wZXJ0eSkgKyAiMTExIjsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfUFJPUEVSVFksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLCB1bmtub3duUHJvcGVydHlJZCk7CisJCVJlc3RSZXNwb25zZSBwcm9wZXJ0eUVycm9yUmVzcG9uc2UgPSBodHRwUmVxdWVzdC5odHRwU2VuZERlbGV0ZSh1cmwsIGhlYWRlcnNNYXApOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXByb3BlcnR5RXJyb3JSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVJlcVByb3BlcnR5Tm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFBVVCAtIFByb3BlcnR5IE5vdCBGb3VuZCAtLS0tIik7CisJCVN0cmluZyB1bmtub3duUHJvcGVydHlJZCA9IGdldFByb3BlcnR5SWQocmVzb3VyY2VEZXRhaWxzLCBwcm9wZXJ0eSkgKyAiMTExIjsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUFJPUEVSVFksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLCB1bmtub3duUHJvcGVydHlJZCk7CisJCVJlc3RSZXNwb25zZSBwcm9wZXJ0eUVycm9yUmVzcG9uc2UgPSBodHRwUmVxdWVzdC5odHRwU2VuZEJ5TWV0aG9kKHVybCwgIlBVVCIsIGJvZHksIGhlYWRlcnNNYXApOworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXByb3BlcnR5RXJyb3JSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1vZGlmaWVyTm90VGhlU3RhdGVPd25lcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gVGhlIG1vZGlmaWVyIGlzIG5vdCB0aGUgc3RhdGUgb3duZXIgLQorCQkvLyBPcGVyYXRpb24gTm90IEFsbG93ZWQgLS0tLSIpOworCQlVc2VyIHNkbmNVc2VyRGV0YWlsczIgPSBjcmVhdGVVc2VyKCJ0dTU1NTUiLCAiVGVzdCIsICJVc2VyIiwgInR1NTU1NUBpbnRsLnNkYy5jb20iLCAiREVTSUdORVIiKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jVXNlckRldGFpbHMyLmdldFVzZXJJZCgpKTsKKwkJcHJvcGVydHkuc2V0UHJvcGVydHlEZXNjcmlwdGlvbigibmV3IGRlc2NyaXB0aW9uIik7CisJCS8vIGJvZHkgPSBnc29uLnRvSnNvbihwcm9wZXJ0eSk7CisJCWJvZHkgPSBwcm9wZXJ0eS5wcm9wZXJ0eVRvSnNvblN0cmluZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9QUk9QRVJUWSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlnZXRSZXNvdXJjZUlkKHJlc291cmNlRGV0YWlscyksIGdldFByb3BlcnR5SWQocmVzb3VyY2VEZXRhaWxzLCBwcm9wZXJ0eSkpOworCQlSZXN0UmVzcG9uc2UgcHJvcGVydHlFcnJvclJlc3BvbnNlID0gaHR0cFJlcXVlc3QuaHR0cFNlbmRCeU1ldGhvZCh1cmwsICJQVVQiLCBib2R5LCBoZWFkZXJzTWFwKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlwcm9wZXJ0eUVycm9yUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHBvc3RSZXFJbnZhbGlkQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gUE9TVCAtIEludmFsaWQgQ29udGVudCAtLS0tIik7CisJCWJvZHkgPSAiaW52YWxpZCI7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1BST1BFUlRZLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCWdldFJlc291cmNlSWQocmVzb3VyY2VEZXRhaWxzKSwgZ2V0UHJvcGVydHlJZChyZXNvdXJjZURldGFpbHMsIHByb3BlcnR5KSk7CisJCVJlc3RSZXNwb25zZSBwcm9wZXJ0eUVycm9yUmVzcG9uc2UgPSBodHRwUmVxdWVzdC5odHRwU2VuZFBvc3QodXJsLCBib2R5LCBoZWFkZXJzTWFwKTsKKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocHJvcGVydHlFcnJvclJlc3BvbnNlLmdldFJlc3BvbnNlKCkrIiAiKworCQkvLyBwcm9wZXJ0eUVycm9yUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXByb3BlcnR5RXJyb3JSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1dFJlcUludmFsaWRDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gQ3JlYXRlIHByb3BlcnR5CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbiAoIi0tLS0gQ3JlYXRlIFByb3BlcnR5IChQT1NUKSAtLS0tIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eVJlc3BvbnNlID0gUHJvcGVydHlSZXN0VXRpbHMuY3JlYXRlUHJvcGVydHkoZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLCBib2R5LAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCByZXN1bHQgY29kZSAtIDIwMSwgcmVjZWl2ZWQgLSAiICsgY3JlYXRlUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQljcmVhdGVQcm9wZXJ0eVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFBVVCAtIEludmFsaWQgQ29udGVudCAtLS0tIik7CisJCWJvZHkgPSAiaW52YWxpZCI7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUFJPUEVSVFksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJZ2V0UmVzb3VyY2VJZChyZXNvdXJjZURldGFpbHMpLCBnZXRQcm9wZXJ0eUlkKHJlc291cmNlRGV0YWlscywgcHJvcGVydHkpKTsKKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXJsICsgIlxuIiArIGJvZHkpOworCisJCVJlc3RSZXNwb25zZSBwcm9wZXJ0eUVycm9yUmVzcG9uc2UgPSBodHRwUmVxdWVzdC5odHRwU2VuZEJ5TWV0aG9kKHVybCwgIlBVVCIsIGJvZHksIGhlYWRlcnNNYXApOworCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihwcm9wZXJ0eUVycm9yUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSsiICIrCisJCS8vIHByb3BlcnR5RXJyb3JSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcHJvcGVydHlFcnJvclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL0NoZWNrR2V0UmVzb3VyY2UuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL0NoZWNrR2V0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWRmZTRlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvQ2hlY2tHZXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5TZXJpYWxpemF0aW9uVXRpbHM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIENoZWNrR2V0UmVzb3VyY2UgeworCisJcHVibGljIHZvaWQgY2hlY2tHZXRWbW1zYzYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQl0cnkgeworCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRkZGQiKTsKKwkJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKCI5NmViNjU4My0yODIyLTQ0OGItYTI4NC1iZmMxNDRmYTYyN2UiKTsKKworCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCQlFaXRoZXI8Ynl0ZVtdLCBCb29sZWFuPiBzZXJpYWxpemUgPSBTZXJpYWxpemF0aW9uVXRpbHMuc2VyaWFsaXplRXh0KHJlc291cmNlKTsKKworCQkJU2VyaWFsaXphdGlvblV0aWxzLmRlc2VyaWFsaXplRXh0KHNlcmlhbGl6ZS5sZWZ0KCkudmFsdWUoKSwgUmVzb3VyY2UuY2xhc3MsICJmZmZmIik7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvQ29tcG9uZW50UmVsYXRpb25zaGlwSW5WZlRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL0NvbXBvbmVudFJlbGF0aW9uc2hpcEluVmZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1ZGQxMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL0NvbXBvbmVudFJlbGF0aW9uc2hpcEluVmZUZXN0LmphdmEKQEAgLTAsMCArMSwxNDA4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZTsKKworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUzsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ2xpZW50UHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBSZXFEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVsYXRpb25zaGlwSW1wbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db21wb25lbnRJbnN0YW5jZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRSZWxhdGlvbnNoaXBJblZmVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXB1YmxpYyBDb21wb25lbnRSZWxhdGlvbnNoaXBJblZmVGVzdCgpIHsKKwkJc3VwZXIobmV3IFRlc3ROYW1lKCksIENvbXBvbmVudFJlbGF0aW9uc2hpcEluVmZUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJcHJpdmF0ZSBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkY7CisJcHJpdmF0ZSBVc2VyIGRlc2lnbmVyVXNlcjsKKwlwcml2YXRlIFVzZXIgYWRtaW5Vc2VyOworCXByaXZhdGUgVXNlciB0ZXN0ZXJVc2VyOworCXByaXZhdGUgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1JlcTsKKwlwcml2YXRlIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNDYXA7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRlc2lnbmVyVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCWFkbWluVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXRlc3RlclVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKworCQlyZXNvdXJjZURldGFpbHNWRiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiVkYxMDAiLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwKKwkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uVkYudG9TdHJpbmcoKSk7CisJCWNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGLCBkZXNpZ25lclVzZXIpOworCisJCXJlc291cmNlRGV0YWlsc1JlcSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiU29mdENvbXBSb3V0ZXIiLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5TT0ZUV0FSRV9DT01QT05FTlQsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfTDJfM19ST1VURVJTLAorCQkJCWRlc2lnbmVyVXNlci5nZXRVc2VySWQoKSwgUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpKTsgLy8gcmVzb3VyY2VUeXBlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gPQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFZGQworCQlyZXNvdXJjZURldGFpbHNDYXAgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoIk15Q29tcHV0ZSIsIE5vcm1hdGl2ZVR5cGVzRW51bS5DT01QVVRFLAorCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfTDJfM19ST1VURVJTLCBkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSk7IC8vIHJlc291cmNlVHlwZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gPQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gVkZDCisKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCB1c2VyKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKTsKKwkJaWYgKCFyZXNvdXJjZURldGFpbHMuZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKCJWRiIpKQorCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCB1c2VyLCAiMC4xIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQXRvbWljUmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCB1c2VyKTsKKwl9CisKKwlwcml2YXRlIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKENvbXBvbmVudEluc3RhbmNlIHJpUmVxLAorCQkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAsIENhcFJlcURlZiBjYXBSZXFEZWYpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBjYXBiaWxpdHlVaWQgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIikuZ2V0KDApLmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyByZXF1aXJlbWVudFVpZCA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCXJlcXVpcmVtZW50RGVmLnNldEZyb21Ob2RlKHJpUmVxLmdldFVuaXF1ZUlkKCkpOworCQlyZXF1aXJlbWVudERlZi5zZXRUb05vZGUocmlDYXAuZ2V0VW5pcXVlSWQoKSk7CisKKwkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHBhaXIgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJpUmVxLmdldFVuaXF1ZUlkKCkpOworCQlwYWlyLnNldENhcGFiaWxpdHlPd25lcklkKHJpQ2FwLmdldFVuaXF1ZUlkKCkpOworCQlwYWlyLnNldFJlcXVpcmVtZW50KCJob3N0Iik7CisJCVJlbGF0aW9uc2hpcEltcGwgcmVsYXRpb25zaGlwID0gbmV3IFJlbGF0aW9uc2hpcEltcGwoKTsKKwkJcmVsYXRpb25zaGlwLnNldFR5cGUoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJcGFpci5zZXRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcCk7CisJCXBhaXIuc2V0Q2FwYWJpbGl0eVVpZChjYXBiaWxpdHlVaWQpOworCQlwYWlyLnNldFJlcXVpcmVtZW50VWlkKHJlcXVpcmVtZW50VWlkKTsKKwkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcmVsYXRpb25zaGlwcy5hZGQocGFpcik7CisJCXJlcXVpcmVtZW50RGVmLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwcyk7CisJCXJldHVybiByZXF1aXJlbWVudERlZjsKKwl9CisKKwlwcml2YXRlIENvbXBvbmVudEluc3RhbmNlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFJlc291cmNlUmVxRGV0YWlscyByZXMpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzLCBkZXNpZ25lclVzZXIpOworCX0KKworCXByaXZhdGUgQ29tcG9uZW50SW5zdGFuY2UgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlcywgVXNlciB1c2VyLCBSZXNvdXJjZVJlcURldGFpbHMgdmYpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2VJbnN0YW5jZShyZXMsIHVzZXIsIHZmLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCXJldHVybiBjb21wSW5zdGFuY2U7CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShSZXNvdXJjZVJlcURldGFpbHMgcmVzLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzLCB1c2VyLCByZXNvdXJjZURldGFpbHNWRik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVR3b0F0b21pY1Jlc291cmNlc0J5VHlwZShTdHJpbmcgcmVxVHlwZSwgU3RyaW5nIGNhcFR5cGUsIFVzZXIgdXNlcjEsIFVzZXIgdXNlcjIpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VEZXRhaWxzUmVxLnNldFJlc291cmNlVHlwZShyZXFUeXBlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzUmVxLCB1c2VyMSk7CisJCXJlc291cmNlRGV0YWlsc0NhcC5zZXRSZXNvdXJjZVR5cGUoY2FwVHlwZSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc0NhcCwgdXNlcjIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoU3RyaW5nIHJlcVR5cGUsIFN0cmluZyBjYXBUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKHJlcVR5cGUsIGNhcFR5cGUsIGRlc2lnbmVyVXNlciwgZGVzaWduZXJVc2VyKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUluVkYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WRkMudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3QgPSBjYXBSZXFEZWYuZ2V0UmVxdWlyZW1lbnRzKCkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gbmV3IFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZigpOworCQlyZXF1aXJlbWVudERlZi5zZXRGcm9tTm9kZShyaVJlcS5nZXRVbmlxdWVJZCgpKTsKKwkJcmVxdWlyZW1lbnREZWYuc2V0VG9Ob2RlKHJpQ2FwLmdldFVuaXF1ZUlkKCkpOworCisJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciBwYWlyID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcigpOworCQlwYWlyLnNldFJlcXVpcmVtZW50T3duZXJJZChyaVJlcS5nZXRVbmlxdWVJZCgpKTsKKwkJcGFpci5zZXRDYXBhYmlsaXR5T3duZXJJZChyaUNhcC5nZXRVbmlxdWVJZCgpKTsKKwkJcGFpci5zZXRSZXF1aXJlbWVudCgiaG9zdCIpOworCQlSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcCA9IG5ldyBSZWxhdGlvbnNoaXBJbXBsKCk7CisJCXJlbGF0aW9uc2hpcC5zZXRUeXBlKCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCXBhaXIuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXApOworCQlwYWlyLnNldENhcGFiaWxpdHlVaWQoY2FwTGlzdC5nZXQoMCkuZ2V0VW5pcXVlSWQoKSk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnRVaWQocmVxTGlzdC5nZXQoMCkuZ2V0VW5pcXVlSWQoKSk7CisJCUxpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPiByZWxhdGlvbnNoaXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJlbGF0aW9uc2hpcHMuYWRkKHBhaXIpOworCQlyZXF1aXJlbWVudERlZi5zZXRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcHMpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGKTsKKwkJY2FwUmVxRGVmID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENhcFJlcURlZi5jbGFzcyk7CisKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IGxpc3QgPSBjYXBSZXFEZWYuZ2V0UmVxdWlyZW1lbnRzKCkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCBudWxsLCBsaXN0KTsKKworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBkaXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoZGVzaWduZXJVc2VyLCByZXNvdXJjZURldGFpbHNWRik7CisJCWNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCisJCWxpc3QgPSBjYXBSZXFEZWYuZ2V0UmVxdWlyZW1lbnRzKCkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCAxLCBsaXN0LnNpemUoKSk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gUSBBIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlYWx0aW9uc2hpcChTdHJpbmcgZnJvbU5vZGUsIFN0cmluZyB0b05vZGUsIFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IGNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyA9IGdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygKKwkJCQlyZXNvdXJjZVVuaXF1ZUlkKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiA9IGNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucy5nZXQoMCk7CisJCWJvb2xlYW4gZnJvbU5vZGVDaGVjayA9IHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZi5nZXRGcm9tTm9kZSgpLmVxdWFscyhmcm9tTm9kZSk7CisJCWJvb2xlYW4gdG9Ob2RlQ2hlY2sgPSByZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuZ2V0VG9Ob2RlKCkuZXF1YWxzKHRvTm9kZSk7CisKKwkJcmV0dXJuIGZyb21Ob2RlQ2hlY2sgJiYgdG9Ob2RlQ2hlY2s7CisJfQorCisJcHJpdmF0ZSBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkKQorCQkJdGhyb3dzIENsaWVudFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVJlc291cmNlIHJlc291cmNlID0gZ2V0VmZBc1Jlc291cmNlT2JqZWN0KHJlc291cmNlVW5pcXVlSWQpOworCQlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gY29tcG9uZW5SZWxhdGlvbkluc3RhbmNlcyA9IHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpOworCisJCXJldHVybiBjb21wb25lblJlbGF0aW9uSW5zdGFuY2VzOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgZ2V0VmZBc1Jlc291cmNlT2JqZWN0KFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkKSB0aHJvd3MgQ2xpZW50UHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VVbmlxdWVJZCk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCXByaXZhdGUgTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gZ2V0Q29tcG9uZW50SW5zdGFuY2VzTGlzdChTdHJpbmcgcmVzb3VyY2VVbmlxdWVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlIHJlc291cmNlID0gZ2V0VmZBc1Jlc291cmNlT2JqZWN0KHJlc291cmNlVW5pcXVlSWQpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlczsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUNwVG9DcFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tSZWFsdGlvbnNoaXAocmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKSwgcmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCksCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCXJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZS5yZW1vdmUoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWYuZ2V0UmVxdWlyZW1lbnRzKCkuZXF1YWxzKHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSkpOworCisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGxpc3QgPSBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwIDogbGlzdCkgeworCQkJY2FwLnNldE1pbk9jY3VycmVuY2VzKCIwIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUuZXF1YWxzKGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSkpOworCX0KKworCXByaXZhdGUgQ2FwUmVxRGVmIGdldFJlc291cmNlUmVxQ2FwKFJlc291cmNlUmVxRGV0YWlscyByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZUJlZm9yZUFzc29jaWF0ZSA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYpOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChnZXRSZXNvdXJjZUJlZm9yZUFzc29jaWF0ZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCQlyZXR1cm4gY2FwUmVxRGVmOworCX0KKworCXByaXZhdGUgQ2FwUmVxRGVmIGdldFJlc291cmNlUmVxQ2FwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFJlc291cmNlUmVxQ2FwKHJlc291cmNlRGV0YWlsc1ZGKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUNwVG9WTFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0UmVxdWlyZW1lbnRzKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUucmVtb3ZlKCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydFRydWUoY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmVxdWFscyhyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUpKTsKKworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBsaXN0ID0gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlmb3IgKENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcCA6IGxpc3QpIHsKKwkJCWNhcC5zZXRNaW5PY2N1cnJlbmNlcygiMCIpOworCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpOworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlLmVxdWFscyhjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUpKTsKKworCX0KKworCS8vIEVycm9yIGhhbmRsaW5nCisJLy8gRUxMQSAtIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUNwVG9WbEluVkZDVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgdmZjRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiVkZDMTAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgZGVzaWduZXJVc2VyLmdldFVzZXJJZCgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGQy50b1N0cmluZygpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZmY1Jlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UodmZjRGV0YWlscywgZGVzaWduZXJVc2VyKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWZmNSZXNwb25zZSk7CisKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQl2ZmNEZXRhaWxzLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDQwMCwgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vICJtZXNzYWdlSWQiOiAiU1ZDNDExNiIsCisJCS8vICJ0ZXh0IjogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIiwKKwkJLy8gInZhcmlhYmxlcyI6IFsKKwkJLy8gIlNvZnRDb21wUm91dGVyIDEiLAorCQkvLyAiTXlDb21wdXRlIDIiLAorCQkvLyAiaG9zdCIKKwkJLy8gXQorCX0KKworCS8vIEVycm9yIGhhbmRsaW5nCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVDcFRvVmZUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVR3b0F0b21pY1Jlc291cmNlc0J5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkwudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXBJblZmSW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXAsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRik7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxSW5WZkluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYpOworCisJCVJlc291cmNlUmVxRGV0YWlscyB2ZkhpZ2ggPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlRGV0YWlsc1ZGLCAiMC4xIik7CisJCXZmSGlnaC5zZXROYW1lKCJ2ZkhpZ2giKTsKKwkJdmZIaWdoLnNldFRhZ3MobmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QodmZIaWdoLmdldE5hbWUoKSkpKTsKKwkJdmZIaWdoLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCQljcmVhdGVSZXNvdXJjZSh2ZkhpZ2gsIGRlc2lnbmVyVXNlcik7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEsIGRlc2lnbmVyVXNlciwgdmZIaWdoKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYsIGRlc2lnbmVyVXNlciwgIjAuMSIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkYsIGRlc2lnbmVyVXNlciwgdmZIaWdoKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCA0MDksIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWFzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKwkJLy8gIm1lc3NhZ2VJZCI6ICJTVkM0MTE2IiwKKwkJLy8gInRleHQiOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4iLAorCQkvLyAidmFyaWFibGVzIjogWworCQkvLyAiU29mdENvbXBSb3V0ZXIgMSIsCisJCS8vICJWRjEwMCAyIiwKKwkJLy8gImhvc3QiCisJCS8vIF0KKwl9CisKKwkvLyBFcnJvciBoYW5kbGluZworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlVmZjVG9WZmNOb3RGb3VuZFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCQlyaUNhcC5zZXRVbmlxdWVJZCgiMTIzIik7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgNDAwLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfQkFEX1JFUVVFU1QubmFtZSgpLAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gIm1lc3NhZ2VJZCI6ICJTVkM0MTE2IiwKKwkJLy8gInRleHQiOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4iLAorCQkvLyAidmFyaWFibGVzIjogWworCQkvLyAiU29mdENvbXBSb3V0ZXIgMSIsCisJCS8vICIwMTJmNmRjZC1iY2RmLTRkOWItODdiZS1mZjE0NDJiOTU4MzEuNWQyNjU0NTMtMGI2YS00NDUzLThmM2QtNTdhMjUzYjg4NDMyLnNvZnRjb21wcm91dGVyMSIsCisJCS8vICJob3N0IgorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlQ3BUb0RlbGV0ZWRWZmNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVR3b0F0b21pY1Jlc291cmNlc0J5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHNDYXAuZ2V0VW5pcXVlSWQoKSwKKwkJCQlkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tSZWFsdGlvbnNoaXAocmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKSwgcmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCksCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVDcFRvRGVsZXRlZFZsVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHNDYXAuZ2V0VW5pcXVlSWQoKSwKKwkJCQlkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tSZWFsdGlvbnNoaXAocmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKSwgcmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCksCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVDcFRvRGVsZXRlZENwVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHNDYXAuZ2V0VW5pcXVlSWQoKSwKKwkJCQlkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tSZWFsdGlvbnNoaXAocmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKSwgcmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCksCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSkpOworCisJfQorCisJLy8gRXJyb3IgaGFuZGxpbmcKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUNwVG9EZWxldGVkQ3BJbnN0YW5jZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0UmVxdWlyZW1lbnRzKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlSZXN0UmVzcG9uc2UgZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZShkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgcmlSZXEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgNDAwLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gIm1lc3NhZ2VJZCI6ICJTVkM0MTE2IiwKKwkJLy8gInRleHQiOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4iLAorCQkvLyAidmFyaWFibGVzIjogWworCQkvLyAiN2Q2YWNhMDgtOTMyMS00ZWExLWE3ODEtYzUyYzgyMTRhMzBlLmMwZTYzNDY2LTUyODMtNDRkOC1hZGZmLTM2NWMwODg1YTZiYS5zb2Z0Y29tcHJvdXRlcjEiLAorCQkvLyAiTXlDb21wdXRlIDIiLAorCQkvLyAiaG9zdCIKKwkJLy8gXQorCX0KKworCS8vIEVycm9yIGhhbmRsaW5nCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVWZmNUb0RlbGV0ZWRWRkNJbnN0YW5jZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCisJCVJlc3RSZXNwb25zZSBkZWxldGVDb21wb25lbnRJbnN0YW5jZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCByaVJlcS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UoZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCA0MDAsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyAibWVzc2FnZUlkIjogIlNWQzQxMTYiLAorCQkvLyAidGV4dCI6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiIsCisJCS8vICJ2YXJpYWJsZXMiOiBbCisJCS8vICI3ZDZhY2EwOC05MzIxLTRlYTEtYTc4MS1jNTJjODIxNGEzMGUuYzBlNjM0NjYtNTI4My00NGQ4LWFkZmYtMzY1YzA4ODVhNmJhLnNvZnRjb21wcm91dGVyMSIsCisJCS8vICJNeUNvbXB1dGUgMiIsCisJCS8vICJob3N0IgorCQkvLyBdCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVXaXRoRGlmZmVyZW50T3duZXJPZlZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVR3b0F0b21pY1Jlc291cmNlc0J5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkwudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUjIpLCByZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDQwOSwgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJYXNzb2NpYXRlSW5zdGFuY2VzLmdldFJlc3BvbnNlKCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlLmVxdWFscyhjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUpKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlbWVudHNBZnRlckFzc29jaWF0ZS5lcXVhbHMocmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVXaXRoVGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVR3b0F0b21pY1Jlc291cmNlc0J5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkwudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCByZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDQwOSwgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJYXNzb2NpYXRlSW5zdGFuY2VzLmdldFJlc3BvbnNlKCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlLmVxdWFscyhjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUpKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlbWVudHNBZnRlckFzc29jaWF0ZS5lcXVhbHMocmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlKSk7CisJfQorCisJLy8gRXJyb3IgaGFuZGxpbmcKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUNwVG9WTEludG9WRk5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVR3b0F0b21pY1Jlc291cmNlc0J5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkwudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlTdHJpbmcgdWlkTm90Rm91bmQgPSAiMTIzIjsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXVpZE5vdEZvdW5kLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCA0MDQsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQubmFtZSgpLAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSksIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB7InNlcnZpY2VFeGNlcHRpb24iOnsibWVzc2FnZUlkIjoiU1ZDNDA2MyIsInRleHQiOiJFcnJvcjogUmVxdWVzdGVkCisJCS8vICclMScgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4iLCJ2YXJpYWJsZXMiOlsiIl19fX0KKwl9CisKKwkvLyBFcnJvciBIYW5kbGluZworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlQ3BUb1ZsV2l0aE1pc3NpbmdVaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCisJCXJlcXVpcmVtZW50RGVmLnNldFRvTm9kZSgiIik7CisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCA0MDAsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksCisJCS8vIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gIm1lc3NhZ2VJZCI6ICJTVkM0MTE2IiwKKwkJLy8gInRleHQiOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4iLAorCQkvLyAidmFyaWFibGVzIjogWworCQkvLyAiU29mdENvbXBSb3V0ZXIgMSIsCisJCS8vICJmZDNhNjg5Yi1mYTFjLTQxMDUtOTMzZC1kMTMxMGU2NDJmMDUuOTViY2U2MjYtY2U3My00MTNiLThjMTQtMjM4OGQxNTg5ZDVjLnNvZnRjb21wcm91dGVyMSIsCisJCS8vICJob3N0IgorCQkvLyBdCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVJblNlcnZpY2VXaXRoVWlkT2ZWZigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgNDA0LCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQubmFtZSgpLAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSksIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUNwVG9WbF9EaWZmZXJlbnRPd25lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpLCBkZXNpZ25lclVzZXIsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSMikpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja1JlYWx0aW9uc2hpcChyZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpLCByZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKSk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlLnJlbW92ZSgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5lcXVhbHMocmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlKSk7CisKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gbGlzdCA9IGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZS5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJZm9yIChDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXAgOiBsaXN0KSB7CisJCQljYXAuc2V0TWluT2NjdXJyZW5jZXMoIjAiKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXNBZnRlckFzc29jaWF0ZS5lcXVhbHMoY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZVRvTm90Q2hlY2tlZG91dFZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVR3b0F0b21pY1Jlc291cmNlc0J5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCksIFJlc291cmNlVHlwZUVudW0uVkwudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGVUb0NoZWNraW4gPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRiwKKwkJCQlkZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2hlY2tpbik7CisKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDQwOSwgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJYXNzb2NpYXRlSW5zdGFuY2VzLmdldFJlc3BvbnNlKCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5lcXVhbHMocmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlKSk7CisJCWFzc2VydFRydWUoY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpLmVxdWFscyhjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUpKTsKKworCQlTdHJpbmcgZmlyc3RVbmlxdWVJZCA9IHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCk7CisKKwkJLy8gY2hlY2tvdXQKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2hlY2tvdXQgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRiwKKwkJCQlkZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVJlc291cmNlU3RhdGVUb0NoZWNrb3V0KTsKKwkJU3RyaW5nIHNlY29uZFVuaXF1ZUlkID0gcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJGaXJzdENoZWNrb3V0ID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0FmdGVyRmlyc3RDaGVja291dCA9IGNhcFJlcURlZkFmdGVyRmlyc3RDaGVja291dAorCQkJCS5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNBZnRlckZpcnN0Q2hlY2tvdXQgPSBjYXBSZXFEZWZBZnRlckZpcnN0Q2hlY2tvdXQKKwkJCQkuZ2V0UmVxdWlyZW1lbnRzKCk7CisKKwkJcmVxdWlyZW1lbnREZWYgPSBzZXRVaWRzT2ZJbnN0YW5jZXNBZnRlckxpZmVjeWNsZVN0YXRlQ2hhbmdlKHJpUmVxLCByaUNhcCwgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlSZXN0UmVzcG9uc2UgZmlyc3RBc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJZGVzaWduZXJVc2VyLCByZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBmaXJzdEFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja1JlYWx0aW9uc2hpcChyZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpLCByZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKSk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyRmlyc3RBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQWZ0ZXJGaXJzdEFzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyRmlyc3RBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQWZ0ZXJGaXJzdEFzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyRmlyc3RBc3NvY2lhdGUKKwkJCQkuZ2V0UmVxdWlyZW1lbnRzKCk7CisKKwkJcmVxdWlyZW1lbnRzQWZ0ZXJGaXJzdENoZWNrb3V0LnJlbW92ZSgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlhc3NlcnRUcnVlKHJlcXVpcmVtZW50c0FmdGVyRmlyc3RBc3NvY2lhdGUuZXF1YWxzKHJlcXVpcmVtZW50c0FmdGVyRmlyc3RDaGVja291dCkpOworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllc0FmdGVyRmlyc3RBc3NvY2lhdGUuZXF1YWxzKGNhcGFiaWxpdGllc0FmdGVyRmlyc3RDaGVja291dCkpOworCisJCXJlc291cmNlRGV0YWlsc1ZGLnNldFVuaXF1ZUlkKGZpcnN0VW5pcXVlSWQpOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmT2ZGaXJzdFZlcnNpb24gPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzT2ZGaXJzdFZlcnNpb24gPSBjYXBSZXFEZWZPZkZpcnN0VmVyc2lvbi5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNPZkZpcnN0VmVyc2lvbiA9IGNhcFJlcURlZk9mRmlyc3RWZXJzaW9uLmdldFJlcXVpcmVtZW50cygpOworCisJCWFzc2VydFRydWUoZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUocmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlLmVxdWFscyhyZXF1aXJlbWVudHNPZkZpcnN0VmVyc2lvbikpOworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZS5lcXVhbHMoY2FwYWJpbGl0aWVzT2ZGaXJzdFZlcnNpb24pKTsKKworCQkvLyBjaGVja2luLWNoZWNrb3V0CisJCXJlc291cmNlRGV0YWlsc1ZGLnNldFVuaXF1ZUlkKHNlY29uZFVuaXF1ZUlkKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGVUb0NoZWNraW4yID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYsCisJCQkJZGVzaWduZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVJlc291cmNlU3RhdGVUb0NoZWNraW4yKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGVUb0NoZWNrb3V0MiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGLAorCQkJCWRlc2lnbmVyVXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2hlY2tvdXQyKTsKKworCQlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRGYWxzZShjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucy5zaXplKCkpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXNMaXN0ID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VzTGlzdChyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wIDogY29tcG9uZW50SW5zdGFuY2VzTGlzdCkgeworCQkJU3RyaW5nIGluc3RhbmNlVWlkID0gY29tcC5nZXRVbmlxdWVJZCgpOworCQkJYXNzZXJ0VHJ1ZShjaGVja05vZGVzSW5SZWxhdGlvbnMoaW5zdGFuY2VVaWQsIGNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucy5nZXQoMCkpKTsKKwkJfQorCQlhc3NlcnRFcXVhbHMoMiwgY29tcG9uZW50SW5zdGFuY2VzTGlzdC5zaXplKCkpOworCisJfQorCisJcHJpdmF0ZSBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgc2V0VWlkc09mSW5zdGFuY2VzQWZ0ZXJMaWZlY3ljbGVTdGF0ZUNoYW5nZShDb21wb25lbnRJbnN0YW5jZSByaVJlcSwKKwkJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwLCBDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKQorCQkJdGhyb3dzIENsaWVudFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmOworCQkvLyBSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9CisJCS8vIFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpOworCQkvLyBSZXNvdXJjZSByZXNvdXJjZV8wXzIgPQorCQkvLyBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkvLyBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9CisJCS8vIHJlc291cmNlXzBfMi5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VzTGlzdChyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKTsKKworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXAgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wLmdldE5hbWUoKS5lcXVhbHMocmlSZXEuZ2V0TmFtZSgpKSkgeworCQkJCXJpUmVxLnNldFVuaXF1ZUlkKGNvbXAuZ2V0VW5pcXVlSWQoKSk7CisJCQl9IGVsc2UgaWYgKGNvbXAuZ2V0TmFtZSgpLmVxdWFscyhyaUNhcC5nZXROYW1lKCkpKSB7CisJCQkJcmlDYXAuc2V0VW5pcXVlSWQoY29tcC5nZXRVbmlxdWVJZCgpKTsKKwkJCX0KKwkJfQorCQlyZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLCBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCQlyZXR1cm4gcmVxdWlyZW1lbnREZWY7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrTm9kZXNJblJlbGF0aW9ucyhTdHJpbmcgaW5zdGFuY2VVaWQsIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZWxhdGlvbikgeworCQlpZiAocmVsYXRpb24uZ2V0VG9Ob2RlKCkuZXF1YWxzKGluc3RhbmNlVWlkKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSBpZiAocmVsYXRpb24uZ2V0RnJvbU5vZGUoKS5lcXVhbHMoaW5zdGFuY2VVaWQpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlT25lT2ZUd29DUHNUb1ZsX1RoZW5EaXNjb2NjaWF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCQlSZXNvdXJjZVJlcURldGFpbHMgc2Vjb25kUmVzb3VyY2VEZXRhaWxzUmVxID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZURldGFpbHNSZXEsICIwLjEiKTsKKwkJc2Vjb25kUmVzb3VyY2VEZXRhaWxzUmVxLnNldE5hbWUoInNlY29uZENQIik7CisJCXNlY29uZFJlc291cmNlRGV0YWlsc1JlcS5zZXRUYWdzKEFycmF5cy5hc0xpc3Qoc2Vjb25kUmVzb3VyY2VEZXRhaWxzUmVxLmdldE5hbWUoKSkpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShzZWNvbmRSZXNvdXJjZURldGFpbHNSZXEsIGRlc2lnbmVyVXNlcik7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcTIgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShzZWNvbmRSZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0UmVxdWlyZW1lbnRzKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gZXhwZWN0ZWRMaXN0ID0gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXEgOiBleHBlY3RlZExpc3QpIHsKKwkJCWlmIChyZXEuZ2V0T3duZXJOYW1lKCkuZXF1YWxzKHJpUmVxMi5nZXROYW1lKCkpKSB7CisJCQkJZXhwZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+KEFycmF5cy5hc0xpc3QocmVxKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlLnB1dCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsIGV4cGVjdGVkTGlzdCk7CisJCWFzc2VydFRydWUoY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmVxdWFscyhyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUpKTsKKworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBsaXN0ID0gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlmb3IgKENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcCA6IGxpc3QpIHsKKwkJCWNhcC5zZXRNaW5PY2N1cnJlbmNlcygiMCIpOworCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpOworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlLmVxdWFscyhjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUpKTsKKworCQkvLyBzZWNvbmQgcmVsYXRpb25zaGlwCisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHNlY29uZFJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcTIsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCVJlc3RSZXNwb25zZSBzZWNvbmRBc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMoc2Vjb25kUmVxdWlyZW1lbnREZWYsCisJCQkJZGVzaWduZXJVc2VyLCByZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBzZWNvbmRBc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoY2hlY2tSZWFsdGlvbnNoaXAoc2Vjb25kUmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKSwgc2Vjb25kUmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCksCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZBZnRlclNlY29uZEFzc29jaWF0aW9uID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUucmVtb3ZlKCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydFRydWUoY2FwUmVxRGVmQWZ0ZXJTZWNvbmRBc3NvY2lhdGlvbi5nZXRSZXF1aXJlbWVudHMoKS5lcXVhbHMocmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlKSk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0FmdGVyU2Vjb25kQXNzb2NpYXRlID0gY2FwUmVxRGVmQWZ0ZXJTZWNvbmRBc3NvY2lhdGlvbgorCQkJCS5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXNBZnRlclNlY29uZEFzc29jaWF0ZS5lcXVhbHMoY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlKSk7CisKKwkJLy8gZGlzc29jaWF0ZQorCisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhzZWNvbmRSZXF1aXJlbWVudERlZiwKKwkJCQlkZXNpZ25lclVzZXIsIHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGRpc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpLmlzRW1wdHkoKSk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyRGlzc29jaWF0aW9uID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0FmdGVyRGlzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyRGlzc29jaWF0aW9uCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0FmdGVyRGlzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyRGlzc29jaWF0aW9uCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzQWZ0ZXJEaXNzb2NpYXRlLmVxdWFscyhjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCkpKTsKKwkJcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlLnB1dCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsIGV4cGVjdGVkTGlzdCk7CisJCWFzc2VydFRydWUocmVxdWlyZW1lbnRzQWZ0ZXJEaXNzb2NpYXRlLmVxdWFscyhyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZU5vdENvbXBpdGFibGVDYXBBbmRSZXEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVzb3VyY2VEZXRhaWxzUmVxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJEYXRhYmFzZSIsIE5vcm1hdGl2ZVR5cGVzRW51bS5EQVRBQkFTRSwKKwkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywgZGVzaWduZXJVc2VyLmdldFVzZXJJZCgpLCBSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCkpOyAvLyByZXNvdXJjZVR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFZGQworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCWFzc2VydFRydWUocmVxdWlyZW1lbnREZWYuZ2V0UmVsYXRpb25zaGlwcygpLnNpemUoKSA9PSAxKTsKKwkJU3RyaW5nIHJlcXVpcmVtZW50ID0gcmVxdWlyZW1lbnREZWYuZ2V0UmVsYXRpb25zaGlwcygpLmdldCgwKS5nZXRSZXF1aXJlbWVudCgpOworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgNDA0LCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTUFUQ0hfTk9UX0ZPVU5ELm5hbWUoKSwKKwkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChyaVJlcS5nZXROYW1lKCksIHJpQ2FwLmdldE5hbWUoKSwgcmVxdWlyZW1lbnQpKSwKKwkJCQlhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0UmVzcG9uc2UoKSk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0FmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpOworCisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUuZXF1YWxzKGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSkpOworCQlhc3NlcnRUcnVlKHJlcXVpcmVtZW50c0FmdGVyQXNzb2NpYXRlLmVxdWFscyhyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlQ3BBbmRDcFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpKTsKKworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBkaXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyhyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKS5pc0VtcHR5KCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBsaXN0T2ZSZXF1aWVybWVudHMgPSBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCAxLCBsaXN0T2ZSZXF1aWVybWVudHMuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkuZXF1YWxzKHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSkpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKS5lcXVhbHMoY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkaXNhc3NvY2lhdGVDcEFuZFZmY1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WRkMudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0UmVxdWlyZW1lbnRzKCk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja1JlYWx0aW9uc2hpcChyZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpLCByZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKSk7CisKKwkJUmVzdFJlc3BvbnNlIGRpc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kaXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMocmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSkuaXNFbXB0eSgpKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gbGlzdE9mUmVxdWllcm1lbnRzID0gY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgMSwgbGlzdE9mUmVxdWllcm1lbnRzLnNpemUoKSk7CisJCWFzc2VydFRydWUoY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpLmVxdWFscyhyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkuZXF1YWxzKGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlQ3BBbmRWTFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpKTsKKworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBkaXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyhyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKS5pc0VtcHR5KCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBsaXN0T2ZSZXF1aWVybWVudHMgPSBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCAxLCBsaXN0T2ZSZXF1aWVybWVudHMuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkuZXF1YWxzKHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSkpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKS5lcXVhbHMoY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlKSk7CisJfQorCisJLy8gRXJyb3IgaGFuZGxpaW5nCisJLy8gaW4gdGhlIGVycm9yIHNob3VsZCB3ZSBnZXQgdGhlIHVuaXF1ZSBpZCBvZiBpbnN0YW5jZXMgaW5zdGVhZCBvZiBuYW1lcworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlTm90Rm91bmRBc3NvY2lhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCQlTdHJpbmcgcmVxdWlyZW1lbnROYW1lID0gcmVxdWlyZW1lbnREZWYuZ2V0UmVsYXRpb25zaGlwcygpLmdldCgwKS5nZXRSZXF1aXJlbWVudCgpOworCisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDQwNCwgZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9SRUxBVElPTl9OT1RfRk9VTkQubmFtZSgpLAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KHJpUmVxLmdldE5hbWUoKSwgcmlDYXAuZ2V0TmFtZSgpLCByZXF1aXJlbWVudE5hbWUpKSwKKwkJCQlkaXNzb2NpYXRlSW5zdGFuY2VzLmdldFJlc3BvbnNlKCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBsaXN0T2ZSZXF1aWVybWVudHMgPSBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCAxLCBsaXN0T2ZSZXF1aWVybWVudHMuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkuZXF1YWxzKHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSkpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKS5lcXVhbHMoY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlKSk7CisJfQorCisJLy8gRXJyb3IgaGFuZGxpaW5nCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkaXNhc3NvY2lhdGVSZWxhdGlvbkluVmZOb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCisJCVN0cmluZyB1aWROb3RGb3VuZCA9ICIxMjMiOworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQl1aWROb3RGb3VuZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgNDA0LCBkaXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORC5uYW1lKCksCisJCQkJbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QodWlkTm90Rm91bmQpKSwgZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKworCQkvLyAic2VydmljZUV4Y2VwdGlvbiI6IHsKKwkJLy8gIm1lc3NhZ2VJZCI6ICJTVkM0MDYzIiwKKwkJLy8gInRleHQiOiAiRXJyb3I6IFJlcXVlc3RlZCBcdTAwMjclMVx1MDAyNyByZXNvdXJjZSB3YXMgbm90IGZvdW5kLiIsCisJCS8vICJ2YXJpYWJsZXMiOiBbCisJCS8vICIiCisJCS8vIF0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRpc2Fzc29jaWF0ZVdpdGhEaWZmZXJlbnREZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIyKSwgcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCA0MDksIGRpc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlkaXNzb2NpYXRlSW5zdGFuY2VzLmdldFJlc3BvbnNlKCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBsaXN0T2ZSZXF1aWVybWVudHMgPSBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCAxLCBsaXN0T2ZSZXF1aWVybWVudHMuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkuZXF1YWxzKHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSkpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKS5lcXVhbHMoY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRpc2Fzc29jaWF0ZVdpdGhUZXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUiksIHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgNDA5LCBkaXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gbGlzdE9mUmVxdWllcm1lbnRzID0gY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlhc3NlcnROb3ROdWxsKCJSZXF1aWVybWVudCBpcyBudWxsIGFmdGVyIGRpc2Fzc29jaWF0ZSB3aXRoIHRlc3RlciIsIGxpc3RPZlJlcXVpZXJtZW50cyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCAxLCBsaXN0T2ZSZXF1aWVybWVudHMuc2l6ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkuZXF1YWxzKHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSkpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKS5lcXVhbHMoY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkaXNhc3NvY2lhdGVTZXJ2aWNlV2l0aFVpZE9mVkYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WRkMudG9TdHJpbmcoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNSZXEpOworCQlDb21wb25lbnRJbnN0YW5jZSByaUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NhcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhyaVJlcSwgcmlDYXAsCisJCQkJY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpKTsKKworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDQwNCwgZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORC5uYW1lKCksCisJCQkJbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoIiIpKSwgZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gbGlzdE9mUmVxdWllcm1lbnRzID0gY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlhc3NlcnRUcnVlKGxpc3RPZlJlcXVpZXJtZW50cyA9PSBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShnZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMocmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSkuc2l6ZSgpICE9IDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlV2l0aEVtcHR5VmZVaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVHdvQXRvbWljUmVzb3VyY2VzQnlUeXBlKFJlc291cmNlVHlwZUVudW0uQ1AudG9TdHJpbmcoKSwgUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlRGV0YWlsc1JlcSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ2FwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpKTsKKworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQkiIiwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgNDA0LCBkaXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCXJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZS5yZW1vdmUoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWYuZ2V0UmVxdWlyZW1lbnRzKCkuZXF1YWxzKHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSkpOworCisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGxpc3QgPSBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwIDogbGlzdCkgeworCQkJY2FwLnNldE1pbk9jY3VycmVuY2VzKCIwIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUuZXF1YWxzKGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzYXNzb2NpYXRlT25lQ29tcG9uZW50RGVsZXRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMocmlSZXEsIHJpQ2FwLAorCQkJCWNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUKKwkJCQkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldFJlcXVpcmVtZW50cygpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHNDYXAuZ2V0VW5pcXVlSWQoKSwKKwkJCQlkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZVJlc291cmNlUmVzcG9uc2UpOworCisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGRpc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpLmlzRW1wdHkoKSk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IGxpc3RPZlJlcXVpZXJtZW50cyA9IGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIDEsIGxpc3RPZlJlcXVpZXJtZW50cy5zaXplKCkpOworCQlhc3NlcnRUcnVlKGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKS5lcXVhbHMocmVxdWlyZW1lbnRzQmVmb3JlQXNzb2NpYXRlKSk7CisJCWFzc2VydFRydWUoY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpLmVxdWFscyhjYXBhYmlsaXRpZXNCZWZvcmVBc3NvY2lhdGUpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRpc2Fzc29jaWF0ZU5vdENoZWNrZWRvdXRWZigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUd29BdG9taWNSZXNvdXJjZXNCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJpUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDYXApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcCgpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzQmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlCisJCQkJLmdldENhcGFiaWxpdGllcygpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50c0JlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKHJpUmVxLCByaUNhcCwKKwkJCQljYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlVG9DaGVja2luID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYsCisJCQkJZGVzaWduZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVJlc291cmNlU3RhdGVUb0NoZWNraW4pOworCisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDQwOSwgZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWRpc3NvY2lhdGVJbnN0YW5jZXMuZ2V0UmVzcG9uc2UoKSk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKCk7CisJCWFzc2VydFRydWUoY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpLmVxdWFscyhyZXF1aXJlbWVudHNCZWZvcmVBc3NvY2lhdGUpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkuZXF1YWxzKGNhcGFiaWxpdGllc0JlZm9yZUFzc29jaWF0ZSkpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlVG9DaGVja291dCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGLAorCQkJCWRlc2lnbmVyVXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2hlY2tvdXQpOworCisJCXJlcXVpcmVtZW50RGVmID0gc2V0VWlkc09mSW5zdGFuY2VzQWZ0ZXJMaWZlY3ljbGVTdGF0ZUNoYW5nZShyaVJlcSwgcmlDYXAsIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja1JlYWx0aW9uc2hpcChyZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpLCByZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKSk7CisKKwkJUmVzdFJlc3BvbnNlIHNlY29uZERpc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJZGVzaWduZXJVc2VyLCByZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLCBzZWNvbmREaXNvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydFRydWUoZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpLmlzRW1wdHkoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGVUb0NoZWNrb3V0MiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGLAorCQkJCWRlc2lnbmVyVXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VSZXNvdXJjZVN0YXRlVG9DaGVja291dDIpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2hlY2tvdXQzID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYsCisJCQkJZGVzaWduZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VSZXNvdXJjZVN0YXRlVG9DaGVja291dDMpOworCisJCWFzc2VydFRydWUoZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpLmlzRW1wdHkoKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL0NyZWF0ZVJlc291cmNlQXBpVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvQ3JlYXRlUmVzb3VyY2VBcGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllZDU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL0NyZWF0ZVJlc291cmNlQXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE5OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1M7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVzcEphdmFPYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlNlcnZpY2VDYXRlZ29yaWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db21wb25lbnRJbnN0YW5jZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlJlc291cmNlVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKKy8qKgorICogQGF1dGhvciB5c2hsb3NiZXJnCisgKiAKKyAqLworcHVibGljIGNsYXNzIENyZWF0ZVJlc291cmNlQXBpVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcmVhdGVSZXNvdXJjZUFwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworCVN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJU3RyaW5nIGFjY2VwdEhlYWRlckRhdGUgPSAiYXBwbGljYXRpb24vanNvbiI7CisJU3RyaW5nIHJlc291cmNlVmVyc2lvbiA9ICIwLjEiOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBDcmVhdGVSZXNvdXJjZUFwaVRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIENyZWF0ZVJlc291cmNlQXBpVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW5pdCBBRE1JTiB1c2VyCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldworCQkvLyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJLy8gZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocmVzb3VyY2VOYW1lLCByZXNvdXJjZU5hbWUsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VOYW1lLCAidGFnMiIsICJ0YWcyIikpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCVJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJCQkJcmVzb3VyY2VWZXJzaW9uKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldEFic3RyYWN0dCgiZmFsc2UiKTsKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKGNyZWF0ZVJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKHJlc291cmNlR2V0UmVzcG9uc2UsIHJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvcgorCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24pOworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZU5vbkRlZmF1bHRSZXNvdXJjZVR5cGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW5pdCBBRE1JTiB1c2VyCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJUmVzb3VyY2VSZXNwSmF2YU9iamVjdCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywKKwkJCQlyZXNvdXJjZVZlcnNpb24pOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldExpZmVjeWNsZVN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0QWJzdHJhY3R0KCJmYWxzZSIpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUpOworCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc3AoY3JlYXRlUmVzcG9uc2UsIHJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc3AocmVzb3VyY2VHZXRSZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlVmVyc2lvbik7CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF9jb3N0QW5kTGljZW5zZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBpbml0IEFETUlOIHVzZXIKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080NTcyIjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJLy8gRHVwbGljYXRlIHRhZ3MgYXJlIGFsbG93ZWQgYW5kIHNob3VsZCBiZSBkZS1kdXBsaWNhdGVkIGJ5IHRoZSBzZXJ2ZXIKKwkJLy8gc2lkZQorCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJLy8gQWRkaW5nIGNvc3QgYW5kIGxpY2Vuc2VUeXBlCisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIxMjM1NS4zNDUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldExpY2Vuc2VUeXBlKCJVc2VyIik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlTdHJpbmcgcmVzb3VyY2VWZXJzaW9uID0gIjAuMSI7CisJCVJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJCQkJcmVzb3VyY2VWZXJzaW9uKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldEFic3RyYWN0dCgiZmFsc2UiKTsKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKGNyZWF0ZVJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKworCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc3AocmVzb3VyY2VHZXRSZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwl9CisKKwkvLyAvLy8vQmVubnkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF9Db3N0SXNNaXNzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJDSVNDTzQ1NzIiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQkvLyBEdXBsaWNhdGUgdGFncyBhcmUgYWxsb3dlZCBhbmQgc2hvdWxkIGJlIGRlLWR1cGxpY2F0ZWQgYnkgdGhlIHNlcnZlcgorCQkvLyBzaWRlCisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIGNhdGVnb3J5LAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQkvLyBBZGRpbmcgY29zdCBhbmQgbGljZW5zZVR5cGUKKwkJLy8gcmVzb3VyY2VEZXRhaWxzLnNldENvc3QoIjEyMzU1LjM0NSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TGljZW5zZVR5cGUoIlVzZXIiKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlTdHJpbmcgcmVzb3VyY2VWZXJzaW9uID0gIjAuMSI7CisJCVJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsCisJCQkJcmVzb3VyY2VWZXJzaW9uKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldEFic3RyYWN0dCgiZmFsc2UiKTsKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKGNyZWF0ZVJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKHJlc291cmNlR2V0UmVzcG9uc2UsIHJlc291cmNlUmVzcEphdmFPYmplY3QpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X0xpY2Vuc2VUeXBlTWlzc2luZygpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080NTcyIjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJLy8gRHVwbGljYXRlIHRhZ3MgYXJlIGFsbG93ZWQgYW5kIHNob3VsZCBiZSBkZS1kdXBsaWNhdGVkIGJ5IHRoZSBzZXJ2ZXIKKwkJLy8gc2lkZQorCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJLy8gQWRkaW5nIGNvc3QgYW5kIGxpY2Vuc2VUeXBlCisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIxMjM1NS4zNDUiKTsKKwkJLy8gcmVzb3VyY2VEZXRhaWxzLnNldExpY2Vuc2VUeXBlKCJVc2VyIik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiA9ICIwLjEiOworCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLAorCQkJCXJlc291cmNlVmVyc2lvbik7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRBYnN0cmFjdHQoImZhbHNlIik7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChjcmVhdGVSZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChyZXNvdXJjZUdldFJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF9MaWNlbnNlVHlwZV9JbnN0YWxsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNDU3MiI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCS8vIER1cGxpY2F0ZSB0YWdzIGFyZSBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGUtZHVwbGljYXRlZCBieSB0aGUgc2VydmVyCisJCS8vIHNpZGUKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uVk9JUC5nZXRWYWx1ZSgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJqaDAwMDMiOworCQlTdHJpbmcgaWNvbiA9ICJteUlDT04iOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCS8vIEFkZGluZyBjb3N0IGFuZCBsaWNlbnNlVHlwZQorCQlyZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiOTk5OTkuOTk5Iik7CisJCXJlc291cmNlRGV0YWlscy5zZXRMaWNlbnNlVHlwZSgiSW5zdGFsbGF0aW9uIik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiA9ICIwLjEiOworCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLAorCQkJCXJlc291cmNlVmVyc2lvbik7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRBYnN0cmFjdHQoImZhbHNlIik7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChjcmVhdGVSZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChyZXNvdXJjZUdldFJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF9MaWNlbnNlVHlwZV9DUFUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNDU3MiI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCS8vIER1cGxpY2F0ZSB0YWdzIGFyZSBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGUtZHVwbGljYXRlZCBieSB0aGUgc2VydmVyCisJCS8vIHNpZGUKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uVk9JUC5nZXRWYWx1ZSgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJqaDAwMDMiOworCQlTdHJpbmcgaWNvbiA9ICJteUlDT04iOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCS8vIEFkZGluZyBjb3N0IGFuZCBsaWNlbnNlVHlwZQorCQlyZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiMC4wIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRMaWNlbnNlVHlwZSgiQ1BVIik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiA9ICIwLjEiOworCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLAorCQkJCXJlc291cmNlVmVyc2lvbik7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRBYnN0cmFjdHQoImZhbHNlIik7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChjcmVhdGVSZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChyZXNvdXJjZUdldFJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF9MaWNlbnNlVHlwZV9VcHBlcmNhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNDU3MiI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCS8vIER1cGxpY2F0ZSB0YWdzIGFyZSBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGUtZHVwbGljYXRlZCBieSB0aGUgc2VydmVyCisJCS8vIHNpZGUKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uVk9JUC5nZXRWYWx1ZSgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJqaDAwMDMiOworCQlTdHJpbmcgaWNvbiA9ICJteUlDT04iOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCS8vIEFkZGluZyBjb3N0IGFuZCBsaWNlbnNlVHlwZQorCQlyZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiMC4wIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRMaWNlbnNlVHlwZSgiSU5TVEFMTEFUSU9OIik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDQwMCwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAiQmFkIFJlcXVlc3QiLCBjcmVhdGVSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3RfTGljZW5zZVR5cGVfSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080NTcyIjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJLy8gRHVwbGljYXRlIHRhZ3MgYXJlIGFsbG93ZWQgYW5kIHNob3VsZCBiZSBkZS1kdXBsaWNhdGVkIGJ5IHRoZSBzZXJ2ZXIKKwkJLy8gc2lkZQorCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJLy8gQWRkaW5nIGNvc3QgYW5kIGxpY2Vuc2VUeXBlCisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIwLjAiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldExpY2Vuc2VUeXBlKCJDUFVVVSIpOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCA0MDAsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgIkJhZCBSZXF1ZXN0IiwgY3JlYXRlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X0Nvc3RWYWxpZGF0aW9uX25vTnVtZXJpYygpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080NTcyIjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJLy8gRHVwbGljYXRlIHRhZ3MgYXJlIGFsbG93ZWQgYW5kIHNob3VsZCBiZSBkZS1kdXBsaWNhdGVkIGJ5IHRoZSBzZXJ2ZXIKKwkJLy8gc2lkZQorCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJLy8gQWRkaW5nIGNvc3QgYW5kIGxpY2Vuc2VUeXBlCisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIxMjM1NS4zNDUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldExpY2Vuc2VUeXBlKCJVc2VyIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIxMjM1NS4zNGIiKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDQwMCwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAiQmFkIFJlcXVlc3QiLAorCQkJCWNyZWF0ZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpLnRvU3RyaW5nKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3RfQ29zdFZhbGlkYXRpb25fdmFsdWVMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNDU3MiI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCS8vIER1cGxpY2F0ZSB0YWdzIGFyZSBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGUtZHVwbGljYXRlZCBieSB0aGUgc2VydmVyCisJCS8vIHNpZGUKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uVk9JUC5nZXRWYWx1ZSgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJqaDAwMDMiOworCQlTdHJpbmcgaWNvbiA9ICJteUlDT04iOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIGNhdGVnb3J5LAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQkvLyBBZGRpbmcgY29zdCBhbmQgbGljZW5zZVR5cGUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvc3QoIjEyMzU1LjM0NSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TGljZW5zZVR5cGUoIlVzZXIiKTsKKworCQkvLyBBZGRpbmcgaW52YWxpZCBjb3N0CisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIxMjM1NS4zNDM0Iik7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCA0MDAsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgIkJhZCBSZXF1ZXN0IiwKKwkJCQljcmVhdGVSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKS50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF9Db3N0VmFsaWRhdGlvbl9QcmljZUxpbWl0YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJDSVNDTzQ1NzIiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQkvLyBEdXBsaWNhdGUgdGFncyBhcmUgYWxsb3dlZCBhbmQgc2hvdWxkIGJlIGRlLWR1cGxpY2F0ZWQgYnkgdGhlIHNlcnZlcgorCQkvLyBzaWRlCisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJLy8gQWRkaW5nIGNvc3QgYW5kIGxpY2Vuc2VUeXBlCisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIxMjM1NS4zNDUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldExpY2Vuc2VUeXBlKCJVc2VyIik7CisKKwkJLy8gQWRkaW5nIGludmFsaWQgY29zdAorCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzcG9uc2U7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIwMDAwMDAuMDAwIik7CisJCWNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJY3JlYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCA0MDAsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgIkJhZCBSZXF1ZXN0IiwKKwkJCQljcmVhdGVSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKS50b1N0cmluZygpKTsKKworCQkvKgorCQkgKiByZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiMDU1MC40NTciKTsgY3JlYXRlUmVzcG9uc2UgPQorCQkgKiByZXNvdXJjZVV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCSAqIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiCisJCSAqICwgY3JlYXRlUmVzcG9uc2UpOworCQkgKiBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiCisJCSAqICwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQkgKiBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgNDAwLAorCQkgKiBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJICogYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsCisJCSAqICJCYWQgUmVxdWVzdCIsIGNyZWF0ZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpLnRvU3RyaW5nKCkpOworCQkgKi8KKworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiMSIpOworCQljcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDQwMCwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAiQmFkIFJlcXVlc3QiLAorCQkJCWNyZWF0ZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpLnRvU3RyaW5nKCkpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRDb3N0KCIxMjM1NTUuMzQwIik7CisJCWNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJY3JlYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCA0MDAsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgIkJhZCBSZXF1ZXN0IiwKKwkJCQljcmVhdGVSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKS50b1N0cmluZygpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiMTIzLjQ1NzAiKTsKKwkJY3JlYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCA0MDAsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgIkJhZCBSZXF1ZXN0IiwKKwkJCQljcmVhdGVSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKS50b1N0cmluZygpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiMTIzNTU1LjMwIik7CisJCWNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgNDAwLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsICJCYWQgUmVxdWVzdCIsCisJCQkJY3JlYXRlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkudG9TdHJpbmcoKSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvc3QoIjEyMy41NTUwIik7CisJCWNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgNDAwLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsICJCYWQgUmVxdWVzdCIsCisJCQkJY3JlYXRlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkudG9TdHJpbmcoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF9Db3N0SXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJDSVNDTzQ1NzIiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQkvLyBEdXBsaWNhdGUgdGFncyBhcmUgYWxsb3dlZCBhbmQgc2hvdWxkIGJlIGRlLWR1cGxpY2F0ZWQgYnkgdGhlIHNlcnZlcgorCQkvLyBzaWRlCisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIGNhdGVnb3J5LAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQkvLyBBZGRpbmcgY29zdCBhbmQgbGljZW5zZVR5cGUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvc3QoIjEyMzU1LjM0NSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TGljZW5zZVR5cGUoIlVzZXIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvc3QoIiIpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgNDAwLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsICJCYWQgUmVxdWVzdCIsIGNyZWF0ZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X0xpY2Vuc2VJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNDU3MiI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCS8vIER1cGxpY2F0ZSB0YWdzIGFyZSBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGUtZHVwbGljYXRlZCBieSB0aGUgc2VydmVyCisJCS8vIHNpZGUKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uVk9JUC5nZXRWYWx1ZSgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJqaDAwMDMiOworCQlTdHJpbmcgaWNvbiA9ICJteUlDT04iOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCS8vIEFkZGluZyBjb3N0IGFuZCBsaWNlbnNlVHlwZQorCQlyZXNvdXJjZURldGFpbHMuc2V0Q29zdCgiMTIzNTUuMzQ1Iik7CisJCXJlc291cmNlRGV0YWlscy5zZXRMaWNlbnNlVHlwZSgiVXNlciIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TGljZW5zZVR5cGUoIiIpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGNyZWF0ZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgNDAwLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsICJCYWQgUmVxdWVzdCIsIGNyZWF0ZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X3VyaV9tZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW5pdCBBRE1JTiB1c2VyCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IGNyZWF0ZVJhbmRvbVJlc291cmNlKCk7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbihyZXNvdXJjZURldGFpbHMpOworCQlsb2cuZGVidWcodXNlckJvZHlKc29uKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNSRUFURV9SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UyID0gaHR0cC5odHRwU2VuZEJ5TWV0aG9kKHVybCwgIlBVVCIsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsCisJCQkJY3JlYXRlUmVzb3VyY2VSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwKKwkJCQljcmVhdGVSZXNvdXJjZVJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQljcmVhdGVSZXNvdXJjZVJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCXByaXZhdGUgUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJhbmRvbVJlc291cmNlKCkgeworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNCI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJcmV0dXJuIHJlc291cmNlRGV0YWlsczsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlX3JvbGVfdGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW5pdCBURVNURVIgdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMiA9IGNyZWF0ZVJhbmRvbVJlc291cmNlKCk7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIHJlc3RSZXNwb25zZTIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UyLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvcgorCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzMiwgcmVzb3VyY2VWZXJzaW9uKTsKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChVc2VyUm9sZUVudW0uVEVTVEVSLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoVXNlclJvbGVFbnVtLlRFU1RFUi5nZXRVc2VyTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJLy8gVE9ETyBERTE3MTQ1MCh0byBjaGVjaykKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlX3JvbGVfREVTSUdORVIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gY3JlYXRlUmFuZG9tUmVzb3VyY2UoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlLCByZXNwb25zZSBtZXNzYWdlIGlzOiAiICsgcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpLAorCQkJCTIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZV9taXNzaW5nX2hlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbml0IEFETUlOIHVzZXIKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBjcmVhdGVSYW5kb21SZXNvdXJjZSgpOworCisJCS8vIHNldCBudWxsIGluIHVzZXJJZCBoZWFkZXIKKwkJc2RuY01vZGlmaWVyRGV0YWlscy5zZXRVc2VySWQobnVsbCk7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTIgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04ubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCQkvLyAvL3ZhbGlkYXRlIGF1ZGl0CisJCS8vCisJCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJCS8vIHJlc291cmNlVXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscyxyZXNvdXJjZVZlcnNpb24pOworCQkvLworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkNyZWF0ZSI7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZCgibnVsbCBudWxsIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKCJudWxsIG51bGwiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJLy8KKwkJLy8gU3RyaW5nIGF1ZGl0RGVzYyA9CisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCQkvLworCQkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsCisJCS8vIGF1ZGl0QWN0aW9uKTsKKwkJLy8gVE9ETzogeXNobG9zYmVyZyBlbmFibGUgYmFjaworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZV9leGlzdGluZ19yZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbml0IEFETUlOIHVzZXIKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBjcmVhdGVSYW5kb21SZXNvdXJjZSgpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKworCQkvLyBjbGVhbiBFUyBEQgorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMKKwkJCQkucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCByZXN0UmVzcG9uc2UyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIsIHJlc291cmNlRGV0YWlsczIuZ2V0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTkFNRV9BTFJFQURZX0VYSVNULm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZTIuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF93aXRob3V0X2NhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW5pdCBBRE1JTiB1c2VyCisKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQljYXRlZ29yeSA9IG51bGw7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NBVEVHT1JZLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWS5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UyLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlVmVyc2lvbik7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3RfZW1wdHlfY2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBpbml0IEFETUlOIHVzZXIKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQljYXRlZ29yeSA9ICIiOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMyID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIGNhdGVnb3J5LAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NBVEVHT1JZLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWS5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UyLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMyLCByZXNvdXJjZVZlcnNpb24pOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X3dpdGhvdXRfdGFncygpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGluaXQgQURNSU4gdXNlcgorCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCTsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNCI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX1RBR1MubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCByZXN0UmVzcG9uc2UyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfVEFHUy5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UyLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMyLCByZXNvdXJjZVZlcnNpb24pOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCS8vIFRPRE8gREUxNzE0NTAodG8gY2hlY2spCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3Rfd2l0aF9tdWx0aXBsZV90YWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW5pdCBBRE1JTiB1c2VyCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MoQXJyYXlzLmFzTGlzdChyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAidGFnMiIpKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X2VtcHR5X3RhZygpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGluaXQgQURNSU4gdXNlcgorCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJDSVNDTzQiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgiIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJRUxEX0ZPUk1BVC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIsICJ0YWciKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJRUxEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlVmVyc2lvbik7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3Rfd2l0aF9lbXB0eV92ZW5kb3JOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGluaXQgQURNSU4gdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQl2ZW5kb3JOYW1lID0gIiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX1ZFTkRPUl9OQU1FLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfVkVORE9SX05BTUUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlsczIsIHJlc291cmNlVmVyc2lvbik7CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X3dpdGhvdXRfdmVuZG9yTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbml0IEFETUlOIHVzZXIKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNCI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJdmVuZG9yTmFtZSA9IG51bGw7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTIgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMyLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgNDAwLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19WRU5ET1JfTkFNRS5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UyLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3Rfd2l0aF9lbXB0eV92ZW5kb3JSZWxlYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGluaXQgQURNSU4gdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKCJyb290Iik7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQl2ZW5kb3JSZWxlYXNlID0gIiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTIgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMyLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19WRU5ET1JfUkVMRUFTRS5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIHJlc3RSZXNwb25zZTIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNTSU5HX1ZFTkRPUl9SRUxFQVNFLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZTIuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlsczIsIHJlc291cmNlVmVyc2lvbik7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3Rfd2l0aG91dF92ZW5kb3JSZWxlYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGluaXQgQURNSU4gdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQl2ZW5kb3JSZWxlYXNlID0gbnVsbDsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMiA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsczIsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX1ZFTkRPUl9SRUxFQVNFLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfVkVORE9SX1JFTEVBU0UubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvcgorCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzMiwgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF93aXRoX2VtcHR5X2NvbnRhY3RJZCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbml0IEFETUlOIHVzZXIKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNCI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJY29udGFjdElkID0gIiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTIgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMyLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscworCQkJCS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ09OVEFDVC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIHJlc3RSZXNwb25zZTIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlJlc291cmNlIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ09OVEFDVC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UyLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMyLCByZXNvdXJjZVZlcnNpb24pOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VUZXN0X3dpdGhvdXRfY29udGFjdElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGluaXQgQURNSU4gdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQljb250YWN0SWQgPSBudWxsOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMyID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIGNhdGVnb3J5LAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UyID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzMiwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMKKwkJCQkucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCByZXN0UmVzcG9uc2UyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvcgorCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzMiwgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF93aXRoX2VtcHR5X2ljb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gaW5pdCBBRE1JTiB1c2VyCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJDSVNDTzQiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uVk9JUC5nZXRWYWx1ZSgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJqaDAwMDMiOworCQlTdHJpbmcgaWNvbiA9ICJteUlDT04iOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCWljb24gPSAiIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMiA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsczIsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZTIuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlsczIsIHJlc291cmNlVmVyc2lvbik7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3Rfd2l0aG91dF9pY29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGluaXQgQURNSU4gdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlpY29uID0gbnVsbDsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMiA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsczIsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgcmVzdFJlc3BvbnNlMik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZTIuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlsczIsIHJlc291cmNlVmVyc2lvbik7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZVRlc3Rfd2l0aF9lbXB0eV9kZXNjcmlwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbml0IEFETUlOIHVzZXIKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkNJU0NPNCI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJZGVzY3JpcHRpb24gPSAiIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzMiA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlMiA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsczIsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzCisJCQkJLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTi5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIHJlc3RSZXNwb25zZTIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCByZXN0UmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlJlc291cmNlIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04ubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvcgorCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzMiwgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlVGVzdF93aXRob3V0X2Rlc2NyaXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGluaXQgQURNSU4gdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ0lTQ080IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQkvLyBzZXQgcmVzb3VyY2UgZGV0YWlscworCQlkZXNjcmlwdGlvbiA9IG51bGw7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczIgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTIgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMyLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscworCQkJCS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04ubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCByZXN0UmVzcG9uc2UyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0RFU0NSSVBUSU9OLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZTIuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlsczIsIHJlc291cmNlVmVyc2lvbik7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVBbmRHZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzQ29tcCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgidGVzdHJlc291cmNlQ29tcCIsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLkNPTVBVVEUsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfTDJfM19ST1VURVJTLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzQ29tcCwgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyByZXNvdXJjZVZlcnNpb24gPSAiMC4xIjsKKwkJUmVzb3VyY2VSZXNwSmF2YU9iamVjdCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlsc0NvbXAsCisJCQkJcmVzb3VyY2VWZXJzaW9uKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldEFic3RyYWN0dCgiZmFsc2UiKTsKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKGNyZWF0ZVJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oCisJCQkJc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSwgcmVzb3VyY2VEZXRhaWxzQ29tcC5nZXROYW1lKCksIHJlc291cmNlRGV0YWlsc0NvbXAuZ2V0VmVyc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlbGV0ZSByZXNvdXJjZSIsIDIwMCwgcmVzb3VyY2VHZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPQorCQkvLyBSZXNvdXJjZVJlc3RVdGlscy5wYXJzZVJlc291cmNlRnJvbUxpc3RSZXNwKHJlc291cmNlR2V0UmVzcG9uc2UpOworCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc3AocmVzb3VyY2VHZXRSZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisJCS8vIHJlc291cmNlRGV0YWlsc0NvbXAuc2V0VW5pcXVlSWQocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlUmVzb3VyY2VUeXBlTm90RXhpc3RzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGluaXQgQURNSU4gdXNlcgorCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJU3RyaW5nIHJlc291cmNlVHlwZSA9ICJOT1QgRVhJU1RTIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIGNyZWF0ZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQljcmVhdGVSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBDb252ZXJ0b3IKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uKTsKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlUmVzb3VyY2VUeXBlRW1wdHlUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gaW5pdCBBRE1JTiB1c2VyCisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQkvLyBTdHJpbmcgcmVzb3VyY2VUeXBlID0gIiI7CisJCS8vIHJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlKTsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisKKwkJLy8gRXJyb3JJbmZvIGVycm9ySW5mbyA9CisJCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQubmFtZSgpKTsKKwkJLy8KKwkJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZQorCQkvLyByZXNvdWNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUKKwkJLy8gcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJCS8vIGVycm9ySW5mby5nZXRDb2RlKCksIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJLy8KKwkJLy8gTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkvLyBFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCksCisJCS8vIHZhcmlhYmxlcywgY3JlYXRlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vCisJCS8vIC8vIHZhbGlkYXRlIGF1ZGl0CisJCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJCS8vIENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLAorCQkvLyByZXNvdXJjZVZlcnNpb24pOworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZSgiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKS5nZXRVc2VySWQoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTikuZ2V0RnVsbE5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCS8vCisJCS8vIFN0cmluZyBhdWRpdERlc2MgPQorCQkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKwkJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCQkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tJbnZhcmlhbnRVdWlkSXNJbW11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSByZXNvdXJjZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJU3RyaW5nIGludmFyaWFudFV1aWREZWZpbmVkQnlVc2VyID0gIiEhISEhISEhISEhISEhISEhISEhISEhISI7CisJCXJlc291cmNlRGV0YWlscy5zZXRJbnZhcmlhbnRVVUlEKGludmFyaWFudFV1aWREZWZpbmVkQnlVc2VyKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRUYWdzKEFycmF5cy5hc0xpc3QocmVzb3VyY2VOYW1lLCByZXNvdXJjZU5hbWUsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VOYW1lLCAidGFnMiIsICJ0YWcyIikpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShjcmVhdGVSZXNwb25zZSwgImNyZWF0ZSByZXF1ZXN0IGZhaWxlZCIsIGZhbHNlLCAyMDEpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgY3JlYXRlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBjcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIGNyZWF0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc291cmNlIHJlc291cmNlQ3JlYXRpb24gPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChjcmVhdGVSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJU3RyaW5nIGludmFyaWFudFVVSURjcmVhdGlvbiA9IHJlc291cmNlQ3JlYXRpb24uZ2V0SW52YXJpYW50VVVJRCgpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLAorCQkJCXJlc291cmNlVmVyc2lvbik7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRBYnN0cmFjdHQoImZhbHNlIik7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChjcmVhdGVSZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY1VzZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzb3VyY2VHZXRSZXNwb25zZSk7CisJCVJlc291cmNlIHJlc291cmNlR2V0dGluZyA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChyZXNvdXJjZUdldFJlc3BvbnNlLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKwkJU3RyaW5nIGludmFyaWFudFVVSURnZXR0aW5nID0gcmVzb3VyY2VHZXR0aW5nLmdldEludmFyaWFudFVVSUQoKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgaW52YXJpYW50VVVJRGdldHRpbmcpOworCisJCS8vIFVwZGF0ZSByZXNvdXJjZSB3aXRoIG5ldyBpbnZhcmlhbnQgVVVJRAorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlVXBkYXRlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZVVwZGF0ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZVVwZGF0ZS5nZXRSZXNwb25zZSgpKTsKKwkJU3RyaW5nIGludmFyaWFudFVVSUR1cGRhdGluZyA9IHVwZGF0ZWRSZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGludmFyaWFudFVVSUR1cGRhdGluZyk7CisKKwkJLy8gRG8gY2hlY2tpbgorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlQ2hlY2tpbiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZUNoZWNraW4pOworCQlSZXNvdXJjZSBjaGVja2luUmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2VDaGVja2luLmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRGNoZWNraW4gPSBjaGVja2luUmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpOworCQlTdHJpbmcgdmVyc2lvbiA9IGNoZWNraW5SZXNvdXJjZS5nZXRWZXJzaW9uKCk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGludmFyaWFudFVVSURjaGVja2luKTsKKwkJYXNzZXJ0RXF1YWxzKHZlcnNpb24sICIwLjEiKTsKKworCQkvLyBEbyBjaGVja291dAorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlQ2hlY2tvdXQgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlQ2hlY2tvdXQpOworCQlSZXNvdXJjZSBSZXNvdXJjZVJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlQ2hlY2tvdXQuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEY2hlY2tvdXQgPSBSZXNvdXJjZVJlc291cmNlLmdldEludmFyaWFudFVVSUQoKTsKKwkJdmVyc2lvbiA9IFJlc291cmNlUmVzb3VyY2UuZ2V0VmVyc2lvbigpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEY2hlY2tvdXQpOworCQlhc3NlcnRFcXVhbHModmVyc2lvbiwgIjAuMiIpOworCisJCS8vIGRvIGNlcnRpZmljYXRpb24gcmVxdWVzdAorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlQ2VydGlmaWNhdGlvblJlcXVlc3QgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsCisJCQkJc2RuY1VzZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlQ2VydGlmaWNhdGlvblJlcXVlc3QpOworCQlSZXNvdXJjZSBjZXJ0aWZpY2F0aW9uUmVxdWVzdFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlQ2VydGlmaWNhdGlvblJlcXVlc3QuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEY2VydGlmaWNhdGlvblJlcXVlc3QgPSBjZXJ0aWZpY2F0aW9uUmVxdWVzdFJlc291cmNlLmdldEludmFyaWFudFVVSUQoKTsKKwkJdmVyc2lvbiA9IGNlcnRpZmljYXRpb25SZXF1ZXN0UmVzb3VyY2UuZ2V0VmVyc2lvbigpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEY2VydGlmaWNhdGlvblJlcXVlc3QpOworCQlhc3NlcnRFcXVhbHModmVyc2lvbiwgIjAuMiIpOworCisJCS8vIHN0YXJ0IGNlcnRpZmljYXRpb24KKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZVN0YXJ0Q2VydGlmaWNhdGlvbiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywKKwkJCQlzZG5jVXNlckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlU3RhcnRDZXJ0aWZpY2F0aW9uKTsKKwkJUmVzb3VyY2Ugc3RhcnRDZXJ0aWZpY2F0aW9uUmVxdWVzdFJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlU3RhcnRDZXJ0aWZpY2F0aW9uLmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRFN0YXJ0Q2VydGlmaWNhdGlvbiA9IHN0YXJ0Q2VydGlmaWNhdGlvblJlcXVlc3RSZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCXZlcnNpb24gPSBzdGFydENlcnRpZmljYXRpb25SZXF1ZXN0UmVzb3VyY2UuZ2V0VmVyc2lvbigpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEU3RhcnRDZXJ0aWZpY2F0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKHZlcnNpb24sICIwLjIiKTsKKworCQkvLyBjZXJ0aWZ5CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2VDZXJ0aWZ5ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlQ2VydGlmeSk7CisJCVJlc291cmNlIGNlcnRpZnlSZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZUNlcnRpZnkuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEY2VydGlmeSA9IGNlcnRpZnlSZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCXZlcnNpb24gPSBjZXJ0aWZ5UmVzb3VyY2UuZ2V0VmVyc2lvbigpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEY2VydGlmeSk7CisJCWFzc2VydEVxdWFscyh2ZXJzaW9uLCAiMS4wIik7CisKKwl9CisKKwkvLyBVUzY3MjEyOSBCRU5OWQorCisJcHJpdmF0ZSB2b2lkIGdldFJlc291cmNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkLCBTdHJpbmcgaW52YXJpYW50VVVJRGNyZWF0aW9uKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksCisJCQkJcmVzb3VyY2VVbmlxdWVJZCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCByZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcmVzb3VyY2VJbnZhcmlhbnRVdWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBkZXNpZ25lclVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlVc2VyIHRlc3RlclVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiVkYyMDAiLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwKKwkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCksIFJlc291cmNlVHlwZUVudW0uVkYudG9TdHJpbmcoKSk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoIm5ld3Rlc3RzZXJ2aWNlMSIsCisJCQkJU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCkpOworCisJCS8vIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldEludmFyaWFudFVVSUQoImtva29tb2tvIik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJVc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCwKKwkJCQljcmVhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRGNyZWF0aW9uID0gcmVzb3VyY2UuZ2V0SW52YXJpYW50VVVJRCgpOyAvLyBnZW5lcmF0ZWQKKwkJCQkJCQkJCQkJCQkJCQkJLy8gd2hlbiB0aGUKKwkJCQkJCQkJCQkJCQkJCQkJLy8gY29tcG9uZW50CisJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCisJCQkJCQkJCQkJCQkJCQkJCS8vIGNyZWF0ZWQKKwkJCQkJCQkJCQkJCQkJCQkJLy8gYW5kIG5ldmVyCisJCQkJCQkJCQkJCQkJCQkJCS8vIGNoYW5nZWQKKwkJLy8gZ2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgSW52YXJpYW50VXVpZCBpcyBub3QgY2hhbmdlZAorCQlnZXRSZXNvdXJjZVZhbGlkYXRlSW52YXJpYW50VXVpZChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIFVwZGF0ZSByZXNvdXJjZSB3aXRoIG5ldyBpbnZhcmlhbnQgVVVJRAorCQlyZXNvdXJjZURldGFpbHMuc2V0SW52YXJpYW50VVVJRCgiMTIzNDU2Nzg5MCIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQl1cGRhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0UmVzb3VyY2VWYWxpZGF0ZUludmFyaWFudFV1aWQocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBjaGVja0luIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFJlc291cmNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gY2hlY2tJbiByZXNvdXJjZQorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlciwKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKHJlc3RSZXNwb25zZSkpOworCQlnZXRSZXNvdXJjZVZhbGlkYXRlSW52YXJpYW50VXVpZChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCQkvLyBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpKTsKKwkJZ2V0UmVzb3VyY2VWYWxpZGF0ZUludmFyaWFudFV1aWQocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHRlc3RlclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFJlc291cmNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisJCS8vIGNlcnRpZnkKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCB0ZXN0ZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFJlc291cmNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisJCS8vIHVwZGF0ZSByZXNvdXJjZQorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZURldGFpbHMuc2V0RGVzY3JpcHRpb24oInVwZGF0ZWREZXNjcmlwdGlvbiIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yUmVsZWFzZSgiMS4yLjMuNCIpOworCQl1cGRhdGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCB1cGRhdGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0UmVzb3VyY2VWYWxpZGF0ZUludmFyaWFudFV1aWQocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldFJlc291cmNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIGNoZWNrb3V0IHJlc291cmNlCisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldFJlc291cmNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIGNlcnRpZmljYXRpb24gcmVxdWVzdAorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyVXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRSZXNvdXJjZVZhbGlkYXRlSW52YXJpYW50VXVpZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHRlc3RlclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRSZXNvdXJjZVZhbGlkYXRlSW52YXJpYW50VXVpZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBjYW5jZWwgY2VydGlmaWNhdGlvbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHRlc3RlclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DQU5DRUxDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0UmVzb3VyY2VWYWxpZGF0ZUludmFyaWFudFV1aWQocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHRlc3RlclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRSZXNvdXJjZVZhbGlkYXRlSW52YXJpYW50VXVpZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBmYWlsdXJlCisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdGVzdGVyVXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkZBSUxDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKFNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0UmVzb3VyY2VWYWxpZGF0ZUludmFyaWFudFV1aWQocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gdXBsb2FkIGFydGlmYWN0CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFydGlmYWN0KCk7CisJCUFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoYXJ0aWZhY3REZXRhaWxzLCBkZXNpZ25lclVzZXIsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRSZXNvdXJjZVZhbGlkYXRlSW52YXJpYW50VXVpZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBjaGVja0luIHJlc291cmNlCisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJVc2VyLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gY3JlYXRlIGluc3RhbmNlCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIGRlc2lnbmVyVXNlciwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRSZXNvdXJjZVZhbGlkYXRlSW52YXJpYW50VXVpZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvR2V0QWxsUmVzb3VyY2VWZXJzaW9ucy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvR2V0QWxsUmVzb3VyY2VWZXJzaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzcyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9HZXRBbGxSZXNvdXJjZVZlcnNpb25zLmphdmEKQEAgLTAsMCArMSw1ODAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBHZXRBbGxSZXNvdXJjZVZlcnNpb25zIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdldEFsbFJlc291cmNlVmVyc2lvbnMuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcm90ZWN0ZWQgVXNlciBkZXNpZ25lckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCXByb3RlY3RlZCBVc2VyIGFkbWluTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgR2V0QWxsUmVzb3VyY2VWZXJzaW9ucygpIHsKKwkJc3VwZXIobmFtZSwgR2V0QWxsUmVzb3VyY2VWZXJzaW9ucy5jbGFzcy5nZXROYW1lKCkpOworCisJfQorCisJLy8vLyBORVcKKworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUFsbFZlcnNpb25PZlJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJU3RyaW5nW10gdmVyc2lvbnMgPSB7ICIwLjEiLCAiMC4yIiwgIjAuMyIsICIwLjQiLCAiMC41IiwgIjAuNiIsICIxLjAiLCAiMS4xIiwgIjEuMiIsICIxLjMiLCAiMS40IiwgIjEuNSIsICIyLjAiLAorCQkJCSIyLjEiLCAiMi4yIiwgIjIuMyIsICIyLjQiLCAiMi41IiwgIjMuMCIsICI0LjAiLCAiNC4xIiB9OworCisJCWZvciAoU3RyaW5nIHZlcnNpb24gOiB2ZXJzaW9ucykgeworCisJCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihkZXNpZ25lckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXROYW1lKCkudG9VcHBlckNhc2UoKSwgdmVyc2lvbik7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJkZWxldGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDQgfHwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gNDA0KTsKKworCQkJcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oZGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLAorCQkJCQl2ZXJzaW9uKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydFRydWUoImRlbGV0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwNCB8fCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSA0MDQpOworCisJCX0KKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXNvdXJjZURldGFpbHMgPSBkZWZpbmVSZXNvdXJzZSgpOworCQlkZWxldGVBbGxWZXJzaW9uT2ZSZXNvdXJjZSgpOworCisJfQorCisJQEFmdGVyTWV0aG9kCisJcHVibGljIHZvaWQgZW5kT2ZUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlkZWxldGVBbGxWZXJzaW9uT2ZSZXNvdXJjZSgpOworCX0KKworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lUmVzb3Vyc2UoKSB7CisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiY2lzY280IjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJLy8gU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZCgidG9zY2Eubm9kZXMuUm9vdCIpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBudWxsLAorCQkJCWRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQlyZXNvdXJjZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLmdldENhdGVnb3J5KCksCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRS5nZXRTdWJDYXRlZ29yeSgpKTsKKworCQlyZXR1cm4gcmVzb3VyY2VEZXRhaWxzOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBbGxWZXJzaW9uc192ZXJzaW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShkZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhkZXNpZ25lckRldGFpbHMsCisJCS8vIHJlc3RSZXNwb25zZSk7CisKKwkJLy8gY2hhbmdlIHJlc291cmNlIHZlcnNpb24gdG8gMC41CisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc291cmNlOworCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQl9CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCWNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsCisJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsCisJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCWNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdmVyc2lvbiB0byAxLjUKKwkJZm9yIChpbnQgeCA9IDA7IHggPCA1OyB4KyspIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCW9yaWdWZXJzaW9uc01hcC5wdXQocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsCisJCQkJCWNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCX0KKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShkZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZShVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY2xlYW4gRVMgREIKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLAorCQkJCXJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBbGxWZXJzaW9uc192ZXJzaW9uMDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKGRlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBvcmlnVmVyc2lvbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJb3JpZ1ZlcnNpb25zTWFwLnB1dChyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHMoZGVzaWduZXJEZXRhaWxzLAorCQkvLyByZXN0UmVzcG9uc2UpOworCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdmVyc2lvbiB0byAwLjUKKwkJUmVzdFJlc3BvbnNlIGNoZWNrb3V0UmVzb3VyY2U7CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwKKwkJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCW9yaWdWZXJzaW9uc01hcC5wdXQocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQl9CisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGRlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlcyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0VmVyc2lvbnNNYXAgPSByZXMuZ2V0QWxsVmVyc2lvbnMoKTsKKwkJYXNzZXJ0VHJ1ZShvcmlnVmVyc2lvbnNNYXAuZXF1YWxzKGdldFZlcnNpb25zTWFwKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQWxsVmVyc2lvbnNfdmVyc2lvbjAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UoZGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG9yaWdWZXJzaW9uc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlvcmlnVmVyc2lvbnNNYXAucHV0KHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQkvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKGRlc2lnbmVyRGV0YWlscywKKwkJLy8gcmVzdFJlc3BvbnNlKTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShkZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCWFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFsbFZlcnNpb25zX3ZlcnNpb24yNSgpIHRocm93cyBFeGNlcHRpb24geworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShkZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHMoZGVzaWduZXJEZXRhaWxzLAorCQkvLyByZXN0UmVzcG9uc2UpOworCisJCS8vIGNoYW5nZSByZXNvdXJjZSB2ZXJzaW9uIHRvIDAuNQorCQlSZXN0UmVzcG9uc2UgY2hlY2tvdXRSZXNvdXJjZTsKKwkJZm9yIChpbnQgeCA9IDA7IHggPCA0OyB4KyspIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwKKwkJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwKKwkJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJfQorCisJCS8vIHJlc291cmNlIHZlcnNpb24gMS4wCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJb3JpZ1ZlcnNpb25zTWFwLnB1dChyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJLy8gY2hhbmdlIHJlc291cmNlIHZlcnNpb24gdG8gMS41CisJCWZvciAoaW50IHggPSAwOyB4IDwgNTsgeCsrKSB7CisJCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywKKwkJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsCisJCQkJCWNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywKKwkJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwKKwkJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJfQorCisJCS8vIHJlc291cmNlIHZlcnNpb24gMi4wCisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGNoYW5nZSByZXNvdXJjZSB2ZXJzaW9uIHRvIDIuNQorCQlmb3IgKGludCB4ID0gMDsgeCA8IDU7IHgrKykgeworCQkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJb3JpZ1ZlcnNpb25zTWFwLnB1dChyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQl9CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoZGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRWZXJzaW9uc01hcCA9IHJlcy5nZXRBbGxWZXJzaW9ucygpOworCQlhc3NlcnRUcnVlKG9yaWdWZXJzaW9uc01hcC5lcXVhbHMoZ2V0VmVyc2lvbnNNYXApKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBbGxWZXJzaW9uc19SZWFkeUZvckNlcnRpZmljYXRpb25fdmVyc2lvbjA1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UoZGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhkZXNpZ25lckRldGFpbHMsCisJCS8vIHJlc3RSZXNwb25zZSk7CisKKwkJLy8gY2hhbmdlIHJlc291cmNlIHZlcnNpb24gdG8gMC41CisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc291cmNlOworCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJb3JpZ1ZlcnNpb25zTWFwLnB1dChyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCX0KKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSByZXNvdXJjZUdldFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoZGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzb3VyY2UgcmVzID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRWZXJzaW9uc01hcCA9IHJlcy5nZXRBbGxWZXJzaW9ucygpOworCQlhc3NlcnRUcnVlKG9yaWdWZXJzaW9uc01hcC5lcXVhbHMoZ2V0VmVyc2lvbnNNYXApKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBbGxWZXJzaW9uc19DZXJ0aWZhY3Rpb25JblByb2dyZXNzX3ZlcnNpb24wNSgpIHRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG9yaWdWZXJzaW9uc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKGRlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgiY3JlYXRlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlvcmlnVmVyc2lvbnNNYXAucHV0KHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhkZXNpZ25lckRldGFpbHMsCisJCS8vIHJlc3RSZXNwb25zZSk7CisKKwkJLy8gY2hhbmdlIHJlc291cmNlIHZlcnNpb24gdG8gMC41CisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc291cmNlOworCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkJb3JpZ1ZlcnNpb25zTWFwLnB1dChyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCX0KKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGRlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlIHJlcyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0VmVyc2lvbnNNYXAgPSByZXMuZ2V0QWxsVmVyc2lvbnMoKTsKKwkJYXNzZXJ0VHJ1ZShvcmlnVmVyc2lvbnNNYXAuZXF1YWxzKGdldFZlcnNpb25zTWFwKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQWxsVmVyc2lvbnNfQ2VydGlmaWVkX3ZlcnNpb24xMCgpIHRocm93cyBFeGNlcHRpb24geworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShkZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHMoZGVzaWduZXJEZXRhaWxzLAorCQkvLyByZXN0UmVzcG9uc2UpOworCisJCS8vIGNoYW5nZSByZXNvdXJjZSB2ZXJzaW9uIHRvIDAuNQorCQlSZXN0UmVzcG9uc2UgY2hlY2tvdXRSZXNvdXJjZTsKKwkJZm9yIChpbnQgeCA9IDA7IHggPCA0OyB4KyspIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwKKwkJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsCisJCQkJCWNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJfQorCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShkZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCWFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFsbFZlcnNpb25zX0NlcnRpZmllZF92ZXJzaW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG9yaWdWZXJzaW9uc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2UoZGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpOworCQkvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKGRlc2lnbmVyRGV0YWlscywKKwkJLy8gcmVzdFJlc3BvbnNlKTsKKworCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdmVyc2lvbiB0byAwLjUKKwkJUmVzdFJlc3BvbnNlIGNoZWNrb3V0UmVzb3VyY2U7CisJCWZvciAoaW50IHggPSAwOyB4IDwgNDsgeCsrKSB7CisJCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsCisJCQkJCWNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBkZXNpZ25lckRldGFpbHMsCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLAorCQkJCQljaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQl9CisKKwkJLy8gZ2V0IHRvIHZlcnNpb24gMS4wCisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGNoYW5nZSByZXNvdXJjZSB2ZXJzaW9uIHRvIDEuNQorCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgZGVzaWduZXJEZXRhaWxzLAorCQkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwKKwkJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGRlc2lnbmVyRGV0YWlscywKKwkJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwKKwkJCQkJY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJfQorCisJCS8vIGdldCB0byB2ZXJzaW9uIDEuMAorCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlvcmlnVmVyc2lvbnNNYXAucHV0KHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgcmVzcG9uc2UKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShkZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCWFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFsbFZlcnNpb25zX1Jlc291cmNlTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKGRlc2lnbmVyRGV0YWlscywgIjEyMzQ1Njc4OSIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCA0MDQsIHJlc291cmNlR2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL0dldFJlc291cmNlTm90QWJzdHJhY3RBcGlUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9HZXRSZXNvdXJjZU5vdEFic3RyYWN0QXBpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjYxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9HZXRSZXNvdXJjZU5vdEFic3RyYWN0QXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5TZXJ2aWNlQ2F0ZWdvcmllc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydEdlbmVyaWNSZXNvdXJjZUNJVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKKworcHVibGljIGNsYXNzIEdldFJlc291cmNlTm90QWJzdHJhY3RBcGlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudEJhc2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfR0VUX1NVQ0NFU1MgPSAyMDA7CisKKwlwcm90ZWN0ZWQgQ29uZmlnIGNvbmZpZyA9IENvbmZpZy5pbnN0YW5jZSgpOworCXByb3RlY3RlZCBTdHJpbmcgY29udGVudFR5cGVIZWFkZXJEYXRhID0gImFwcGxpY2F0aW9uL2pzb24iOworCXByb3RlY3RlZCBTdHJpbmcgYWNjZXB0SGVhZGVyRGF0ZSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgR2V0UmVzb3VyY2VOb3RBYnN0cmFjdEFwaVRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIEdldFJlc291cmNlTm90QWJzdHJhY3RBcGlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXROb3RBYnN0cmFjdFJlc291cmNlTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIHJlbW92ZSBhbGwgdGhlIG5vdCBhYnN0cmFjdCByZXNvdXJjZXMKKwkJLy8gTWFwPE5vcm1hdGl2ZVR5cGVzLCBCb29sZWFuPiBvcmlnaW5hbFN0YXRlID0KKwkJLy8gSW1wb3J0UmVzb3VyY2VDSVRlc3QucmVtb3ZlQWxsTm9ybWF0aXZlVHlwZVJlc291cmNlcygpOworCisJCS8vIGltcG9ydCBhbGwgdGhlIGRlZmF1bHQgbm90IGFic3RyYWN0IHJlc291cmNlcworCQkvLyBJbXBvcnRHZW5lcmljUmVzb3VyY2VDSVRlc3QuaW1wb3J0QWxsTm9ybWF0aXZlVHlwZXNSZXNvdXJjZXMoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBHZXQgbm90IGFic3RyYWN0IHJlc291cmNlcworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VOb3RBYnN0YXJjdFJlc3BvbnNlID0gZ2V0Tm90QWJzdHJhY3RSZXNvdXJjZXMoKTsKKwkJLy8gQ2hlY2sgdGhhdCByZWNlaXZlZCAyMDAuCisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgYWJzdHJhY3QgcmVzb3VyY2VzIiwgU1RBVFVTX0NPREVfR0VUX1NVQ0NFU1MsCisJCQkJZ2V0UmVzb3VyY2VOb3RBYnN0YXJjdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBWZXJpZnkgdGhhdCBhbGwgdGhlIHJlc291cmNlcyBub3QgYWJzdHJhY3QKKwkJYXNzZXJ0VHJ1ZSgiT25lIG9yIG1vcmUgcmVzb3VyY2VzIGFyZSBhYnN0cmFjdCIsIGlzQWxsUmVzb3VyY2VzTm90QWJzdHJhY3QoZ2V0UmVzb3VyY2VOb3RBYnN0YXJjdFJlc3BvbnNlKSk7CisJCS8vIFZlcmlmeSB0aGF0IGFsbCB0aGUgcmVzb3VyY2VzIGFyZSBjZXJ0aWZpZWQKKwkJYXNzZXJ0VHJ1ZSgiTm90IGFsbCB0aGUgcmVzb3VyY2VzIGFyZSBjZXJ0aWZpZWQiLCBpc0FsbFJlc291cmNlc0NlcnRpZmllZChnZXRSZXNvdXJjZU5vdEFic3RhcmN0UmVzcG9uc2UpKTsKKworCQlTdHJpbmcgb2JqZWN0U3RvcmFnZVVpZCA9ICJPYmplY3RTdG9yYWdlIjsKKwkJU3RyaW5nIGNvbXB1dGVVaWQgPSAiQ29tcHV0ZSI7CisJCVN0cmluZyBibG9ja1N0b3JhZ2VVaWQgPSAiQmxvY2tTdG9yYWdlIjsKKwkJU3RyaW5nIGxvYWRCYWxhbmNlclVpZCA9ICJMb2FkQmFsYW5jZXIiOworCQkvLyBTdHJpbmcgcG9ydFVpZCA9ICJ0b3NjYS5ub2Rlcy5OZXR3b3JrLlBvcnQiOworCQlTdHJpbmcgcG9ydFVpZCA9ICJQb3J0IjsKKwkJU3RyaW5nIG5ldHdvcmtVaWQgPSAiTmV0d29yayI7CisJCVN0cmluZyBkYXRhYmFzZVVpZCA9ICJEYXRhYmFzZSI7CisKKwkJLy8gQ29tcGFyZSBleHBlY3RlZCBsaXN0IG9mIGFic3RyYWN0IHJlc291cmNlcyB0byBhY3R1YWwgbGlzdCBvZgorCQkvLyBhYnN0cmFjdCByZXNvdXJjZXMuCisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZE5vdEFic3RyYWN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KGNvbXB1dGVVaWQsCisJCQkJZGF0YWJhc2VVaWQsIG9iamVjdFN0b3JhZ2VVaWQsIGJsb2NrU3RvcmFnZVVpZCwgbG9hZEJhbGFuY2VyVWlkLCBwb3J0VWlkLCBuZXR3b3JrVWlkKSk7CisKKwkJTGlzdDxTdHJpbmc+IGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSA9IHJlc3RSZXNwb25zZVRvTGlzdEJ5SGVhZGVyKAorCQkJCWdldFJlc291cmNlTm90QWJzdGFyY3RSZXNwb25zZSwgIm5hbWUiKTsKKworCQkvLyBDb2xsZWN0aW9ucy5zb3J0KGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSk7CisJCS8vIENvbGxlY3Rpb25zLnNvcnQoZXhwZWN0ZWROb3RBYnN0cmFjdFJlc291cmNlc1VuaXF1ZUlkQXJyYXkpOworCisJCUxpc3Q8U3RyaW5nPiB0b0ZpbmQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdG9GaW5kLmFkZChvYmplY3RTdG9yYWdlVWlkKTsKKwkJdG9GaW5kLmFkZChjb21wdXRlVWlkKTsKKwkJdG9GaW5kLmFkZChibG9ja1N0b3JhZ2VVaWQpOworCQl0b0ZpbmQuYWRkKGxvYWRCYWxhbmNlclVpZCk7CisJCXRvRmluZC5hZGQocG9ydFVpZCk7CisKKwkJYm9vbGVhbiByZW1vdmVBbGwgPSB0b0ZpbmQucmVtb3ZlQWxsKGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSk7CisJCWxvZ2dlci5kZWJ1ZygiQ2Fubm90IGZpbmQgcmVzb3VyY2VzIHt9IiwgdG9GaW5kLnRvU3RyaW5nKCkpOworCisJCWZvciAoU3RyaW5nIGV4cGVjdGVkUmVzb3VyY2UgOiBleHBlY3RlZE5vdEFic3RyYWN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSkgeworCQkJaWYgKGZhbHNlID09IGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheS5jb250YWlucyhleHBlY3RlZFJlc291cmNlKSkgeworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGZvdW5kIGFic3RyYWN0IHJlc291cmNlICIgKworCQkJCS8vIGV4cGVjdGVkUmVzb3VyY2UpOworCQkJfQorCQl9CisKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkiRXhwZWN0ZWQgYWJzdHJhY3QgcmVzb3VyY2VzIGxpc3Q6ICIgKyBleHBlY3RlZE5vdEFic3RyYWN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheS50b1N0cmluZygpCisJCQkJCQkrICIgQWN0dWFsOiAiICsgYWN0dWFsTm90QWJzdGFyY3RSZXNvdXJjZXNVbmlxdWVJZEFycmF5LnRvU3RyaW5nKCksCisJCQkJYWN0dWFsTm90QWJzdGFyY3RSZXNvdXJjZXNVbmlxdWVJZEFycmF5LmNvbnRhaW5zQWxsKGV4cGVjdGVkTm90QWJzdHJhY3RSZXNvdXJjZXNVbmlxdWVJZEFycmF5KSk7CisKKwkJLyoKKwkJICogamF2YS5sYW5nLkFzc2VydGlvbkVycm9yOiBFeHBlY3RlZCBhYnN0cmFjdCByZXNvdXJjZXMgbGlzdDoKKwkJICogW3Rvc2NhLm5vZGVzLkNvbXB1dGUsIHRvc2NhLm5vZGVzLk9iamVjdFN0b3JhZ2UsCisJCSAqIHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZSwgdG9zY2Eubm9kZXMuTG9hZEJhbGFuY2VyLAorCQkgKiB0b3NjYS5ub2Rlcy5OZXR3b3JrLlBvcnRdIEFjdHVhbDogW3Jlc291cmNlZm9ycHJvcGVydHkyMTYsCisJCSAqIHRvc2NhLm5vZGVzLkNvbXB1dGUsIHRvc2NhLm5vZGVzLkRhdGFiYXNlLCByZXNvdXJjZWZvcnByb3BlcnR5MjE3LAorCQkgKiByZXNvdXJjZWZvcnByb3BlcnR5MjE3LCB0b3NjYS5ub2Rlcy5PYmplY3RTdG9yYWdlLAorCQkgKiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UsIHRvc2NhLm5vZGVzLkxvYWRCYWxhbmNlciwKKwkJICogdG9zY2Eubm9kZXMubmV0d29yay5Qb3J0LCB0b3NjYS5ub2Rlcy5uZXR3b3JrLk5ldHdvcmssCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkyMTcsIHJlc291cmNlZm9ycHJvcGVydHkyMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkyMTcsIHJlc291cmNlZm9ycHJvcGVydHkyMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkyMTcsIHJlc291cmNlZm9ycHJvcGVydHkyMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkyMTcsIHJlc291cmNlZm9ycHJvcGVydHkyMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkyMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTcsCisJCSAqIHJlc291cmNlZm9ycHJvcGVydHkzMTcsIHJlc291cmNlZm9ycHJvcGVydHkzMTddCisJCSAqLworCisJCS8vIENyZWF0ZSByZXNvdXJjZSAobm90IGNlcnRpZmllZCkKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIlRlc3RSZXNvdXJjZSI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWS5nZXRWYWx1ZSgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoInRvc2NhLm5vZGVzLnJvb3QiKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS4wIjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJQZXRlciI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQlSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCQkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCAyMDEsCisJCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBHZXQgbm90IGFic3RyYWN0IHJlc291cmNlcworCQlnZXRSZXNvdXJjZU5vdEFic3RhcmN0UmVzcG9uc2UgPSBnZXROb3RBYnN0cmFjdFJlc291cmNlcygpOworCQkvLyBDaGVjayB0aGF0IHJlY2VpdmVkIDIwMC4KKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhYnN0cmFjdCByZXNvdXJjZXMiLCBTVEFUVVNfQ09ERV9HRVRfU1VDQ0VTUywKKwkJCQlnZXRSZXNvdXJjZU5vdEFic3RhcmN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIFZlcmlmeSB0aGF0IGFsbCB0aGUgcmVzb3VyY2VzIG5vdCBhYnN0cmFjdAorCQlhc3NlcnRUcnVlKCJPbmUgb3IgbW9yZSByZXNvdXJjZXMgYXJlIGFic3RyYWN0IiwgaXNBbGxSZXNvdXJjZXNOb3RBYnN0cmFjdChnZXRSZXNvdXJjZU5vdEFic3RhcmN0UmVzcG9uc2UpKTsKKwkJLy8gVmVyaWZ5IHRoYXQgYWxsIHRoZSByZXNvdXJjZXMgYXJlIGNlcnRpZmllZAorCQlhc3NlcnRUcnVlKCJOb3QgYWxsIHRoZSByZXNvdXJjZXMgYXJlIGNlcnRpZmllZCIsIGlzQWxsUmVzb3VyY2VzQ2VydGlmaWVkKGdldFJlc291cmNlTm90QWJzdGFyY3RSZXNwb25zZSkpOworCisJCS8vIENvbXBhcmUgZXhwZWN0ZWQgbGlzdCBvZiBhYnN0cmFjdCByZXNvdXJjZXMgdG8gYWN0dWFsIGxpc3Qgb2YKKwkJLy8gYWJzdHJhY3QgcmVzb3VyY2VzLgorCQkvLyBleHBlY3RlZE5vdEFic3RyYWN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSA9IG5ldworCQkvLyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCJ0b3NjYS5ub2Rlcy5jb21wdXRlLjEuMCIsCisJCS8vICJ0b3NjYS5ub2Rlcy5vYmplY3RzdG9yYWdlLjEuMCIsICJ0b3NjYS5ub2Rlcy5ibG9ja3N0b3JhZ2UuMS4wIiwKKwkJLy8gInRvc2NhLm5vZGVzLmxvYWRiYWxhbmNlci4xLjAiLCAidG9zY2Eubm9kZXMubmV0d29yay5wb3J0LjEuMCIpKTsKKworCQkvLyBhY3R1YWxOb3RBYnN0YXJjdFJlc291cmNlc1VuaXF1ZUlkQXJyYXkgPQorCQkvLyByZXN0UmVzcG9uc2VUb0xpc3RCeUhlYWRlcihnZXRSZXNvdXJjZU5vdEFic3RhcmN0UmVzcG9uc2UsCisJCS8vICJ1bmlxdWVJZCIpOworCisJCWFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSA9IHJlc3RSZXNwb25zZVRvTGlzdEJ5SGVhZGVyKGdldFJlc291cmNlTm90QWJzdGFyY3RSZXNwb25zZSwgIm5hbWUiKTsKKworCQlDb2xsZWN0aW9ucy5zb3J0KGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSk7CisJCUNvbGxlY3Rpb25zLnNvcnQoZXhwZWN0ZWROb3RBYnN0cmFjdFJlc291cmNlc1VuaXF1ZUlkQXJyYXkpOworCisJCWZvciAoU3RyaW5nIGV4cGVjdGVkUmVzb3VyY2UgOiBleHBlY3RlZE5vdEFic3RyYWN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSkgeworCQkJaWYgKGZhbHNlID09IGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheS5jb250YWlucyhleHBlY3RlZFJlc291cmNlKSkgeworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGZvdW5kIGFic3RyYWN0IHJlc291cmNlICIgKworCQkJCS8vIGV4cGVjdGVkUmVzb3VyY2UpOworCQkJfQorCQl9CisJCWFzc2VydFRydWUoCisJCQkJIkV4cGVjdGVkIGFic3RyYWN0IHJlc291cmNlcyBsaXN0OiAiICsgZXhwZWN0ZWROb3RBYnN0cmFjdFJlc291cmNlc1VuaXF1ZUlkQXJyYXkudG9TdHJpbmcoKQorCQkJCQkJKyAiIEFjdHVhbDogIiArIGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheS50b1N0cmluZygpLAorCQkJCWFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheS5jb250YWluc0FsbChleHBlY3RlZE5vdEFic3RyYWN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSkpOworCQkvLyBhc3NlcnRUcnVlKCJFeHBlY3RlZCBhYnN0cmFjdCByZXNvdXJjZXMgbGlzdDogIisKKwkJLy8gZXhwZWN0ZWROb3RBYnN0cmFjdFJlc291cmNlc1VuaXF1ZUlkQXJyYXkudG9TdHJpbmcoKSsgIiBBY3R1YWw6CisJCS8vICIrYWN0dWFsTm90QWJzdGFyY3RSZXNvdXJjZXNVbmlxdWVJZEFycmF5LnRvU3RyaW5nKCksZXhwZWN0ZWROb3RBYnN0cmFjdFJlc291cmNlc1VuaXF1ZUlkQXJyYXkuZXF1YWxzKGFjdHVhbE5vdEFic3RhcmN0UmVzb3VyY2VzVW5pcXVlSWRBcnJheSkpOworCisJCS8vIHJlc3RvcmUgdGhlIHJlc291cmNlcworCQkvLyBJbXBvcnRSZXNvdXJjZUNJVGVzdC5yZXN0b3JlVG9PcmlnaW5hbFN0YXRlKG9yaWdpbmFsU3RhdGUpOworCisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBnZXROb3RBYnN0cmFjdFJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworCQlIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9OT1RfQUJTVFJBQ1RfUkVTT1VSQ0VTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksICJjczAwMDgiKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VOb3RBYnN0YXJjdFJlc3BvbnNlID0gaHR0cFJlcXVlc3QuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gZ2V0UmVzb3VyY2VOb3RBYnN0YXJjdFJlc3BvbnNlOworCX0KKworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gcmVzdFJlc3BvbnNlVG9MaXN0QnlIZWFkZXIoUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSwgU3RyaW5nIHJlc3RSZXNwb25zZUhlYWRlcikgeworCQlKc29uRWxlbWVudCBqZWxlbWVudCA9IG5ldyBKc29uUGFyc2VyKCkucGFyc2UocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlKc29uQXJyYXkganNvbkFycmF5ID0gamVsZW1lbnQuZ2V0QXNKc29uQXJyYXkoKTsKKworCQlMaXN0PFN0cmluZz4gcmVzdFJlc3BvbnNlQXJyYXkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGpzb25BcnJheS5zaXplKCk7IGkrKykgeworCQkJSnNvbk9iamVjdCBqb2JqZWN0ID0gKEpzb25PYmplY3QpIGpzb25BcnJheS5nZXQoaSk7CisJCQlTdHJpbmcgaGVhZGVyID0gam9iamVjdC5nZXQocmVzdFJlc3BvbnNlSGVhZGVyKS50b1N0cmluZygpOworCQkJaGVhZGVyID0gaGVhZGVyLnJlcGxhY2UoIlwiIiwgIiIpOworCQkJcmVzdFJlc3BvbnNlQXJyYXkuYWRkKGhlYWRlcik7CisJCX0KKworCQlyZXR1cm4gcmVzdFJlc3BvbnNlQXJyYXk7CisKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FsbFJlc291cmNlc05vdEFic3RyYWN0KFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UpIHsKKwkJSnNvbkVsZW1lbnQgamVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJSnNvbkFycmF5IGpzb25BcnJheSA9IGplbGVtZW50LmdldEFzSnNvbkFycmF5KCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqc29uQXJyYXkuc2l6ZSgpOyBpKyspIHsKKwkJCUpzb25PYmplY3Qgam9iamVjdCA9IChKc29uT2JqZWN0KSBqc29uQXJyYXkuZ2V0KGkpOworCisJCQlpZiAoam9iamVjdC5nZXQoImFic3RyYWN0IikuZ2V0QXNCb29sZWFuKCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzRW1wdHlMaXN0KFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UpIHsKKwkJSnNvbkVsZW1lbnQgamVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJSnNvbkFycmF5IGpzb25BcnJheSA9IGplbGVtZW50LmdldEFzSnNvbkFycmF5KCk7CisKKwkJaWYgKGpzb25BcnJheS5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzQWxsUmVzb3VyY2VzQ2VydGlmaWVkKFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UpIHsKKwkJSnNvbkVsZW1lbnQgamVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJSnNvbkFycmF5IGpzb25BcnJheSA9IGplbGVtZW50LmdldEFzSnNvbkFycmF5KCk7CisKKwkJU3RyaW5nIGNlcnRpZmllZCA9ICJDRVJUSUZJRUQiOworCQlTdHJpbmcgbGlmZWN5Y2xlU3RhdGU7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqc29uQXJyYXkuc2l6ZSgpOyBpKyspIHsKKwkJCUpzb25PYmplY3Qgam9iamVjdCA9IChKc29uT2JqZWN0KSBqc29uQXJyYXkuZ2V0KGkpOworCQkJbGlmZWN5Y2xlU3RhdGUgPSBqb2JqZWN0LmdldCgibGlmZWN5Y2xlU3RhdGUiKS5nZXRBc1N0cmluZygpOworCQkJaWYgKCFsaWZlY3ljbGVTdGF0ZS5lcXVhbHMoY2VydGlmaWVkKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRFbXB0eU5vbkFic3RyYWN0UmVzb3VyY2VzTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyByZW1vdmUgYWxsIHRoZSBub3QgYWJzdHJhY3QgcmVzb3VyY2VzCisJCU1hcDxOb3JtYXRpdmVUeXBlc0VudW0sIEJvb2xlYW4+IG9yaWdpbmFsU3RhdGUgPSBJbXBvcnRHZW5lcmljUmVzb3VyY2VDSVRlc3QucmVtb3ZlQWxsTm9ybWF0aXZlVHlwZVJlc291cmNlcygpOworCisJCS8vIEdldCBub3QgYWJzdHJhY3QgcmVzb3VyY2VzCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZU5vdEFic3RhcmN0UmVzcG9uc2UgPSBnZXROb3RBYnN0cmFjdFJlc291cmNlcygpOworCQkvLyBDaGVjayB0aGF0IHJlY2VpdmVkIDIwMC4KKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBhYnN0cmFjdCByZXNvdXJjZXMiLCBTVEFUVVNfQ09ERV9HRVRfU1VDQ0VTUywKKwkJCQlnZXRSZXNvdXJjZU5vdEFic3RhcmN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIFZlcmlmeSBlbXB0eSBsaXN0CisJCWFzc2VydFRydWUoIlJlY2VpdmVkIGxpc3QgaXMgbm90IGVtcHR5IiwgaXNFbXB0eUxpc3QoZ2V0UmVzb3VyY2VOb3RBYnN0YXJjdFJlc3BvbnNlKSk7CisKKwkJLy8gcmVzdG9yZSB0aGUgcmVzb3VyY2VzCisJCS8vIEltcG9ydFJlc291cmNlQ0lUZXN0LnJlc3RvcmVUb09yaWdpbmFsU3RhdGUob3JpZ2luYWxTdGF0ZSk7CisJCS8vIGltcG9ydCB0aGUgcmVzb3VyY2VzCisJCUltcG9ydEdlbmVyaWNSZXNvdXJjZUNJVGVzdC5pbXBvcnRBbGxOb3JtYXRpdmVUeXBlc1Jlc291cmNlcyhVc2VyUm9sZUVudW0uQURNSU4pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvUmVzb3VyY2VBcGlUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9SZXNvdXJjZUFwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWMzMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvUmVzb3VyY2VBcGlUZXN0LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50Lkh0dHBDbGllbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkVudGl0eVV0aWxzOworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuU2VydmljZUNhdGVnb3JpZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5DYXRhbG9nUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlJlc291cmNlVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VBcGlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBSZXNvdXJjZUFwaVRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIFJlc291cmNlQXBpVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCS8vIEtlZXAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlTWV0YWRhdGFTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNNb2RpZmllckRldGFpbHMuc2V0VXNlcklkKCJqaDAwMDMiKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlRm9yVXBkYXRlKHNkbmNNb2RpZmllckRldGFpbHMpOworCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJ1cGRhdGVkRGVzY3JpcHRpb24iKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCS8vIER1cGxpY2F0ZSB0YWdzIGFyZSBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGUtZHVwbGljYXRlZCBieSB0aGUgc2VydmVyCisJCS8vIHNpZGUKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldE5hbWUoKSk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzEiKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMSIpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MocmVzb3VyY2VUYWdzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLmFkZENhdGVnb3J5Q2hhaW4oUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX1JPVVRFUlMuZ2V0Q2F0ZWdvcnkoKSwKKwkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUy5nZXRTdWJDYXRlZ29yeSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUoIk9yYWNsZVVwIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JSZWxlYXNlKCIxLjVVcCIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKCJwZTExMTYiKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0SWNvbihyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldEljb24oKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0TmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldERlcml2ZWRGcm9tKHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVyaXZlZEZyb20oKSk7CisJCQorCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgdXNlckJvZHlKc29uID0gZ3Nvbi50b0pzb24ocmVzb3VyY2VEZXRhaWxzKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9SRVNPVVJDRV9NRVRBREFUQSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFVuaXF1ZUlkKCkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRCeU1ldGhvZCh1cmwsICJQVVQiLCB1c2VyQm9keUpzb24sIGhlYWRlcnNNYXApOworCisJCS8vIHJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZU5hbWUocmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRSZXNvdXJjZU5hbWUoKSk7CisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzb3VyY2VSZXFWc1Jlc3AocmVzb3VyY2VEZXRhaWxzLAorCQkJCVJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHVwZGF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkpOworCisJCS8vIERlbGV0ZSByZXNvdXJjZQorCQlkZWxldGVSZXNvdXJjZShyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFVuaXF1ZUlkKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlVW5pcXVlSWQsIFN0cmluZyBodHRwQ3NwVXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IFJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlKHJlc291cmNlVW5pcXVlSWQsIGh0dHBDc3BVc2VySWQpOworCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGVsZXRlIHJlc291cmNlIHdhcyBmaW5pc2hlZCB3aXRoIHJlc3BvbnNlOiAiICsKKwkJLy8gcmVzLmdldEVycm9yQ29kZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlRm9yVXBkYXRlKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IGdldFJlc291cmNlT2JqKCk7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCXJldHVybiBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMpOworCisJfQorCisJcHVibGljIFJlc291cmNlUmVxRGV0YWlscyBnZXRSZXNvdXJjZU9iaigpIHsKKwkJLy8gc2V0IHJlc291cmNlIGRldGFpbHMKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJSZXNvdXJjZUZvclVwZGF0ZSIgKyAoaW50KSAoTWF0aC5yYW5kb20oKSAqIDEwMCk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisJCS8vIFN0cmluZyBjYXRlZ29yeSA9IFJlc291cmNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFkuZ2V0VmFsdWUoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKCJ0b3NjYS5ub2Rlcy5Sb290Iik7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuNSI7CisJCVN0cmluZyBjb250YWN0SWQgPSAicGUxMTE2IjsKKwkJU3RyaW5nIGljb24gPSAibXlJQ09OIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIG51bGwsCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCXJlc291cmNlRGV0YWlscy5hZGRDYXRlZ29yeUNoYWluKFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUuZ2V0Q2F0ZWdvcnkoKSwKKwkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLmdldFN1YkNhdGVnb3J5KCkpOworCQlyZXR1cm4gcmVzb3VyY2VEZXRhaWxzOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lUmVzb3Vyc2VfQmVubnkoaW50IG4pIHsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJjaXNjbyIgKyBTdHJpbmcudmFsdWVPZihuKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gImRlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzEiKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZCgidG9zY2Eubm9kZXMuUm9vdCIpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gImJvcmRlckVsZW1lbnQiOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksCisJCQkJZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisKKwkJcmV0dXJuIHJlc291cmNlRGV0YWlsczsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEFsbEFic3RyYWN0UmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBhYnN0cmFjdFJlc291cmNlcyA9IENhdGFsb2dSZXN0VXRpbHMuZ2V0QWJzdHJhY3RSZXNvdXJjZXMoKTsKKworCQlpbnQgc3RhdHVzID0gYWJzdHJhY3RSZXNvdXJjZXMuZ2V0RXJyb3JDb2RlKCk7CisJCWFzc2VydFRydWUoc3RhdHVzID09IDIwMCk7CisJCVN0cmluZyBqc29uID0gYWJzdHJhY3RSZXNvdXJjZXMuZ2V0UmVzcG9uc2UoKTsKKwkJSlNPTkFycmF5IGFycmF5ID0gKEpTT05BcnJheSkgSlNPTlZhbHVlLnBhcnNlKGpzb24pOworCQlmb3IgKE9iamVjdCBvIDogYXJyYXkpIHsKKwkJCUpTT05PYmplY3QgdmFsdWUgPSAoSlNPTk9iamVjdCkgbzsKKwkJCUJvb2xlYW4gZWxlbWVudCA9IChCb29sZWFuKSB2YWx1ZS5nZXQoImFic3RyYWN0Iik7CisJCQlhc3NlcnRUcnVlKGVsZW1lbnQpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEFsbE5vdEFic3RyYWN0UmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNsb3NlYWJsZUh0dHBDbGllbnQgaHR0cGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJdHJ5IHsKKwkJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9OT1RfQUJTVFJBQ1RfUkVTT1VSQ0VTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJCUh0dHBHZXQgaHR0cGdldCA9IG5ldyBIdHRwR2V0KHVybCk7CisKKwkJCWh0dHBnZXQuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCisJCQlodHRwZ2V0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisKKwkJCWh0dHBnZXQuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRVc2VySWQoKSk7CisKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhlY3V0aW5nIHJlcXVlc3QgIiArCisJCQkvLyBodHRwZ2V0LmdldFJlcXVlc3RMaW5lKCkpOworCQkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBnZXQpOworCQkJaW50IHN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlhc3NlcnRUcnVlKHN0YXR1cyA9PSAyMDApOworCQkJdHJ5IHsKKwkJCQlTdHJpbmcganNvbiA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKwkJCQlKU09OQXJyYXkgYXJyYXkgPSAoSlNPTkFycmF5KSBKU09OVmFsdWUucGFyc2UoanNvbik7CisJCQkJZm9yIChPYmplY3QgbyA6IGFycmF5KSB7CisJCQkJCUpTT05PYmplY3QgdmFsdWUgPSAoSlNPTk9iamVjdCkgbzsKKwkJCQkJQm9vbGVhbiBlbGVtZW50ID0gKEJvb2xlYW4pIHZhbHVlLmdldCgiYWJzdHJhY3QiKTsKKwkJCQkJYXNzZXJ0VHJ1ZSghZWxlbWVudCk7CisJCQkJfQorCisJCQl9IGZpbmFsbHkgeworCQkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlodHRwY2xpZW50LmNsb3NlKCk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlTWV0YWRhdGFfbWV0aG9kTm90QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCisJCS8vIHNldCByZXNvdXJjZSBkZXRhaWxzCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiUmVzRm9yVXBkYXRlIjsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gInVwZGF0ZWREZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcxIik7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKCJ0b3NjYS5ub2Rlcy5yb290Iik7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIk9yYWNsZVVwIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS41VXAiOworCQlTdHJpbmcgY29udGFjdElkID0gInBlMTExNyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTi5qcGdVcCI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBjYXRlZ29yeSwKKwkJCQlkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgdXNlckJvZHlKc29uID0gZ3Nvbi50b0pzb24ocmVzb3VyY2VEZXRhaWxzKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9SRVNPVVJDRV9NRVRBREFUQSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQkiTm90RXhpc3RzSWQiKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRCeU1ldGhvZCh1cmwsICJQT1NUIiwgdXNlckJvZHlKc29uLCBoZWFkZXJzTWFwKTsKKworCQlhc3NlcnROb3ROdWxsKCJDaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB3cm9uZyB1cGRhdGUgcmVzb3VyY2UiLAorCQkJCXVwZGF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGVycm9yIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgNDA1LCB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVSZXNvdXJjZU5hbWVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNNb2RpZmllckRldGFpbHMuc2V0VXNlcklkKCJqaDAwMDMiKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gZ2V0UmVzb3VyY2VPYmooKTsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCVJlc291cmNlIHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCUNsb3NlYWJsZUh0dHBDbGllbnQgaHR0cGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJdHJ5IHsKKworCQkJLy8gY2hlY2sgaW52YWxpZAorCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5WQUxJREFURV9SRVNPVVJDRV9OQU1FLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKworCQkJSHR0cEdldCBodHRwZ2V0ID0gbmV3IEh0dHBHZXQodXJsKTsKKworCQkJaHR0cGdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisKKwkJCWh0dHBnZXQuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKworCQkJaHR0cGdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGVjdXRpbmcgcmVxdWVzdCAiICsKKwkJCS8vIGh0dHBnZXQuZ2V0UmVxdWVzdExpbmUoKSk7CisJCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cGdldCk7CisJCQlpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJCWFzc2VydFRydWUoc3RhdHVzID09IDIwMCk7CisJCQl0cnkgeworCQkJCVN0cmluZyBqc29uID0gRW50aXR5VXRpbHMudG9TdHJpbmcocmVzcG9uc2UuZ2V0RW50aXR5KCkpOworCQkJCUpTT05PYmplY3Qgb2JqZWN0ID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShqc29uKTsKKwkJCQlCb29sZWFuIGVsZW1lbnQgPSAoQm9vbGVhbikgb2JqZWN0LmdldCgiaXNWYWxpZCIpOworCQkJCWFzc2VydFRydWUoIWVsZW1lbnQpOworCisJCQl9IGZpbmFsbHkgeworCQkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQl9CisJCQkvLyBjaGVjayB2YWxpZAorCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlZBTElEQVRFX1JFU09VUkNFX05BTUUsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJCXJlc291cmNlRGV0YWlscy5nZXROYW1lKCkgKyAidGVtcCIpOworCisJCQlodHRwZ2V0ID0gbmV3IEh0dHBHZXQodXJsKTsKKworCQkJaHR0cGdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisKKwkJCWh0dHBnZXQuYWRkSGVhZGVyKEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKworCQkJaHR0cGdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGVjdXRpbmcgcmVxdWVzdCAiICsKKwkJCS8vIGh0dHBnZXQuZ2V0UmVxdWVzdExpbmUoKSk7CisJCQlyZXNwb25zZSA9IGh0dHBjbGllbnQuZXhlY3V0ZShodHRwZ2V0KTsKKwkJCXN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlhc3NlcnRUcnVlKHN0YXR1cyA9PSAyMDApOworCQkJdHJ5IHsKKwkJCQlTdHJpbmcganNvbiA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKwkJCQlKU09OT2JqZWN0IG9iamVjdCA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UoanNvbik7CisJCQkJQm9vbGVhbiBlbGVtZW50ID0gKEJvb2xlYW4pIG9iamVjdC5nZXQoImlzVmFsaWQiKTsKKwkJCQlhc3NlcnRUcnVlKGVsZW1lbnQpOworCisJCQl9IGZpbmFsbHkgeworCQkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlodHRwY2xpZW50LmNsb3NlKCk7CisJCX0KKworCQkvLyBEZWxldGUgcmVzb3VyY2UKKwkJUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCAiMC4xIik7CisKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gLy9CZW5ueSBUYWwKKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlX0Jlbm55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCS8vIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBkZWZpbmVSZXNvdXJzZV9CZW5ueShpKTsKKwkvLworCS8vIFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkvLyBVc2VyVXRpbHMuZ2V0RGVzaWduZXJEZXRhaWxzKCkpOworCS8vIC8vIHJlc291cmNlVXRpbHMuZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCS8vIFVzZXJVdGlscy5nZXREZXNpZ25lckRldGFpbHMoKSwgIjAuMSIpOworCS8vIH0KKwkvLyB9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1NhbXBsZURhdGFQcm92aWRlci5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvU2FtcGxlRGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhNGZhMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1NhbXBsZURhdGFQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKKworcHVibGljIGNsYXNzIFNhbXBsZURhdGFQcm92aWRlciB7CisKKwlARGF0YVByb3ZpZGVyCisJcHVibGljIHN0YXRpYyBPYmplY3RbXVtdIGdldFJlc291cmNlQnlUeXBlKElUZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisJCQkJeyBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKSB9LAorCQkJCXsgQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKSB9LAorCQkJCXsgQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WTCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKSB9IH07CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9TaW11bHRhbmVvdXNBcGlUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9TaW11bHRhbmVvdXNBcGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4MzM4NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1NpbXVsdGFuZW91c0FwaVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNpbXVsdGFuZW91c0FwaVRlc3QgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlzdGF0aWMgU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAia20yMDAwIjsKKwlzdGF0aWMgU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiS290IjsKKwlzdGF0aWMgU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJNYXRyb3NraW4iOworCXN0YXRpYyBTdHJpbmcgZW1haWwgPSAia20yMDAwQGludGwuc2RjLmNvbSI7CisJc3RhdGljIFN0cmluZyByb2xlID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKS5nZXRSb2xlKCk7CisKKwlwdWJsaWMgU2ltdWx0YW5lb3VzQXBpVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgU2ltdWx0YW5lb3VzQXBpVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBXb3JrZXJUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCUNvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoOworCQlpbnQgdGhyZWFkSW5kZXg7CisKKwkJcHVibGljIFdvcmtlclRocmVhZChpbnQgdGhyZWFkSW5kZXgsIENvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoKSB7CisJCQl0aGlzLnRocmVhZEluZGV4ID0gdGhyZWFkSW5kZXg7CisJCQl0aGlzLmNvdW50RG93bkxhdGNoID0gY291bnREb3duTGF0Y2g7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqIFRocmVhZCBzdGFydGVkICIgKyB0aHJlYWRJbmRleCk7CisJCQl0cnkgeworCQkJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQkJCVN0cmluZyBpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogVGhyZWFkICIgKyB0aHJlYWRJbmRleCArICIgY3JlYXRlCisJCQkJLy8gcmVzb3VyY2Ugc3RhdHVzICIgKyBjcmVhdGVSZXNvdXJjZS5nZXRFcnJvckNvZGUoKSArICIgaWQgPSAiCisJCQkJLy8gKyBpZCArICIgZXJyb3IgIiArIGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCkpOworCQkJCS8vIGFzc2VydEVxdWFscygiKioqKiBjcmVhdGUgcmVzb3VyY2U6ICIgKworCQkJCS8vIGNyZWF0ZVJlc291cmNlLmdldEVycm9yQ29kZSgpICsgIiB0aHJlYWQgIiArIHRocmVhZEluZGV4LAorCQkJCS8vIDIwMSwgc3RhdHVzKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIFRocmVhZCAiICsgdGhyZWFkSW5kZXggKyAiIGV4Y2VwdGlvbgorCQkJCS8vICIgKyBlKTsKKwkJCX0KKwkJCWNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIFRocmVhZCBmaW5pc2hlZCAiICsgdGhyZWFkSW5kZXgpOworCisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlMlJlc291cmNlcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCWludCB0aHJlYWRDb3VudCA9IDU7CisJCUNvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKHRocmVhZENvdW50KTsKKwkJRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCh0aHJlYWRDb3VudCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkQ291bnQ7IGkrKykgeworCQkJUnVubmFibGUgd29ya2VyID0gbmV3IFdvcmtlclRocmVhZChpICsgMSwgY291bnREb3duTGF0Y2gpOworCQkJZXhlY3V0b3IuZXhlY3V0ZSh3b3JrZXIpOworCQl9CisJCWNvdW50RG93bkxhdGNoLmF3YWl0KCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGZpbmlzaGVkICIpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvVXBkYXRlUmVzb3VyY2VNZXRhZGF0YVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1VwZGF0ZVJlc291cmNlTWV0YWRhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxNDg5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1VwZGF0ZVJlc291cmNlTWV0YWRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSwyMjU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5qc29uLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuU2VydmljZUNhdGVnb3JpZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5SZXNvdXJjZVZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgVXBkYXRlUmVzb3VyY2VNZXRhZGF0YVRlc3QgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFVwZGF0ZVJlc291cmNlTWV0YWRhdGFUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBFbXB0eV9MaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJcHJvdGVjdGVkIFN0cmluZyBleHRlbmRlZENoYXJzOworCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ0hBUlNFVF9JU09fODg1OSA9ICJjaGFyc2V0PUlTTy04ODU5LTEiOworCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisJcHJvdGVjdGVkIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczsKKworCXB1YmxpYyBVcGRhdGVSZXNvdXJjZU1ldGFkYXRhVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgVXBkYXRlUmVzb3VyY2VNZXRhZGF0YVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZXh0ZW5kZWRDaGFyc1N0cmluZ0J1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhcltdIGV4dGVuZGVkQ2hhcnNBcnJheSA9IG5ldyBjaGFyWzEyOF07CisJCWNoYXIgY2ggPSAxMjg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZWRDaGFyc0FycmF5Lmxlbmd0aCAtIDE7IGkrKykgeworCQkJZXh0ZW5kZWRDaGFyc0FycmF5W2ldID0gY2g7CisJCQljaCsrOworCQl9CisJCWV4dGVuZGVkQ2hhcnMgPSBuZXcgU3RyaW5nKGV4dGVuZGVkQ2hhcnNBcnJheSk7CisJCXJldHVybiBleHRlbmRlZENoYXJzOworCisJfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlyZXNvdXJjZURldGFpbHMgPSBkZWZpbmVSZXNvdXJzZSgpOworCisJfQorCisJLy8gS2VlcAorCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlRGVyaXZlZEZyb21TdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIG9sZERlcml2ZWRGcm9tTmFtZSA9IE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULmdldE5vcm1hdGl2ZU5hbWUoKTsKKwkJU3RyaW5nIG5ld0Rlcml2ZWRGcm9tTmFtZSA9IE5vcm1hdGl2ZVR5cGVzRW51bS5TT0ZUV0FSRV9DT01QT05FTlQuZ2V0Tm9ybWF0aXZlTmFtZSgpOworCisJCS8vIEdldHRpbmcgYm90aCBkZXJpdmVkIGZyb20gcmVzb3VyY2VzIGZvciB2YWxpZGF0aW9uCisJCS8qCisJCSAqIFJlc3RSZXNwb25zZSByZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24gPSByZXNvdXJjZVV0aWxzLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCBvbGREZXJpdmVkRnJvbU5hbWUsICIxLjAiKTsgYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBkYXRhYmFzZSBub3JtYXRpdmUiLCAyMDAsCisJCSAqIHJlc291cmNlQnlOYW1lQW5kVmVyc2lvbi5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsgUmVzb3VyY2UgZGF0YWJhc2VOb3JtYXRpdmUgPSByZXNvdXJjZVV0aWxzLnBhcnNlUmVzb3VyY2VSZXNwKHJlc291cmNlQnlOYW1lQW5kVmVyc2lvbik7CisJCSAqIAorCQkgKiByZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24gPSByZXNvdXJjZVV0aWxzLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCBuZXdEZXJpdmVkRnJvbU5hbWUsICIxLjAiKTsgYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCBkYXRhYmFzZSBub3JtYXRpdmUiLCAyMDAsCisJCSAqIHJlc291cmNlQnlOYW1lQW5kVmVyc2lvbi5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsgUmVzb3VyY2UgbGJOb3JtYXRpdmUgPSByZXNvdXJjZVV0aWxzLnBhcnNlUmVzb3VyY2VSZXNwKHJlc291cmNlQnlOYW1lQW5kVmVyc2lvbik7CisJCSAqLworCisJCS8vIERlcml2ZWQgZnJvbSBzZXQgdG8gRGF0YWJhc2UKKwkJTGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChvbGREZXJpdmVkRnJvbU5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0RGVyaXZlZEZyb20oZGVyaXZlZEZyb20pOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlkZXJpdmVkRnJvbS5jbGVhcigpOworCQlkZXJpdmVkRnJvbS5hZGQobmV3RGVyaXZlZEZyb21OYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY3VycmVudFJlc291cmNlLmdldFVuaXF1ZUlkKCksICIiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lVXBkYXRlUmVzb3VyY2VXaXRoTm9uVXBkYXRhYmxlRmllbGRzKFJlc291cmNlIHJlc291cmNlQmVmb3JlVXBkYXRlKSB7CisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lVXBkYXRlZFJlc291cnNlKHJlc291cmNlQmVmb3JlVXBkYXRlLmdldE5hbWUoKSk7CisKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKCJtdW11Iik7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0SXNBYnN0cmFjdCh0cnVlKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRJc0hpZ2hlc3RWZXJzaW9uKHRydWUpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldENyZWF0b3JVc2VySWQoImRmNDQ0NCIpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldENyZWF0b3JGdWxsTmFtZSgiSm9obiBEb2UiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZCgiZ2Y1NjQ2Iik7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgiVmlrdG9yIFR6b3kiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRDcmVhdGlvbkRhdGUobmV3IExvbmcoNDQ0NCkpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldExhc3RVcGRhdGVEYXRlKG5ldyBMb25nKCI1MzQ1MzUiKSk7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRDb3N0KCI2LjEiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRMaWNlbnNlVHlwZSgiSW5zdGFsbGF0aW9uIik7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0VVVJRCgiZGZzZnNkZiIpOworCQlyZXR1cm4gdXBkYXRlZFJlc291cmNlRGV0YWlsczsKKwl9CisKKwlwdWJsaWMgdm9pZCBVcGRhdGVSZXNvdXJjZU5vdEZvdW5kVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbml0IEFETUlOIHVzZXIKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gImNpc2NvNCI7CisJCS8vIHVwZGF0ZSByZXNvdXJjZQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAidXBkYXRlZERlc2NyaXB0aW9uIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzIiKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJuZXdPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIyLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm15SUNPTiI7CisKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgY2F0ZWdvcnksIGRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKCJkdW1teUlkIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCAiMC4xIik7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDQwNCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gU3RyaW5nIHJlc291cmNlSWQgPQorCQkvLyBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXNvdXJjZVVuaXF1ZUlkKHJlc291cmNlTmFtZSwgIjAuMSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORC5uYW1lKCksIEFycmF5cy5hc0xpc3QoImR1bW15SWQiKSwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlyZXNvdXJjZU5hbWUgPSAiIjsKKwkJLy8gcmVzb3VyY2VJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlVW5pcXVlSWQocmVzb3VyY2VOYW1lLAorCQkvLyAiMC4xIik7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVVcGRhdGVkUmVzb3Vyc2UocmVzb3VyY2VOYW1lKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRVbmlxdWVJZCgiZHVtbXlJZCIpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCAiMC4xIik7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgQXJyYXlzLmFzTGlzdCgiZHVtbXlJZCIpLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJcHVibGljIGNoYXJbXSBnZXRJblZhbGlkQ2hhcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQljaGFyW10gZXh0ZW5kZWRDaGFyc0FycmF5ID0gbmV3IGNoYXJbNTldOworCQljaGFyIGNoID0gMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA0NDsgaSsrKSB7CisJCQlleHRlbmRlZENoYXJzQXJyYXlbaV0gPSBjaDsKKwkJCWNoKys7CisJCX0KKwkJY2ggPSA1ODsKKwkJZm9yIChpbnQgaSA9IDQ0OyBpIDwgNTE7IGkrKykgeworCQkJZXh0ZW5kZWRDaGFyc0FycmF5W2ldID0gY2g7CisJCQljaCsrOworCQl9CisJCWNoID0gOTE7CisJCWZvciAoaW50IGkgPSA1MTsgaSA8IDU1OyBpKyspIHsKKwkJCWV4dGVuZGVkQ2hhcnNBcnJheVtpXSA9IGNoOworCQkJY2grKzsKKwkJfQorCQljaCA9IDEyMzsKKwkJZm9yIChpbnQgaSA9IDU1OyBpIDwgNTk7IGkrKykgeworCQkJZXh0ZW5kZWRDaGFyc0FycmF5W2ldID0gY2g7CisJCQljaCsrOworCQl9CisJCXJldHVybiBleHRlbmRlZENoYXJzQXJyYXk7CisJfQorCisJcHVibGljIGNoYXJbXSBnZXRUYWdJblZhbGlkRm9ybWF0Q2hhcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gVGFnIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyBkZWZpbmVkIGZvciBSZXNvdXJjZSBOYW1lIDoKKwkJLy8gQWxsb3dlZCBjaGFyYWN0ZXJzOiBBbHBoYW51bWVyaWMgKGEtekEtWjAtOSksIHNwYWNlICgnICcpLCB1bmRlcnNjb3JlCisJCS8vICgnXycpLCBkYXNoICgnLScpLCBkb3QgKCcuJykKKwkJY2hhcltdIG5vdFZhbGlkQ2hhcnNBcnJheSA9IG5ldyBjaGFyWzMwXTsKKwkJY2hhciBjaCA9IDMzOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkJCW5vdFZhbGlkQ2hhcnNBcnJheVtpXSA9IGNoOworCQkJY2grKzsKKwkJfQorCQlub3RWYWxpZENoYXJzQXJyYXlbMTNdID0gNDc7CisJCWNoID0gNTg7CisJCWZvciAoaW50IGkgPSAxNDsgaSA8IDIxOyBpKyspIHsKKwkJCW5vdFZhbGlkQ2hhcnNBcnJheVtpXSA9IGNoOworCQkJY2grKzsKKwkJfQorCQljaCA9IDkxOworCQlmb3IgKGludCBpID0gMjE7IGkgPCAyNDsgaSsrKSB7CisJCQlub3RWYWxpZENoYXJzQXJyYXlbaV0gPSBjaDsKKwkJCWNoKys7CisJCX0KKwkJbm90VmFsaWRDaGFyc0FycmF5WzI0XSA9IDk2OworCQljaCA9IDEyMzsKKwkJZm9yIChpbnQgaSA9IDI1OyBpIDwgMzA7IGkrKykgeworCQkJbm90VmFsaWRDaGFyc0FycmF5W2ldID0gY2g7CisJCQljaCsrOworCQl9CisJCXJldHVybiBub3RWYWxpZENoYXJzQXJyYXk7CisJfQorCisJcHVibGljIHZvaWQgVmFsaWRhdGlvbl9VcGRhdGVXaXRoSW5jb21wbGV0ZUpzb25Cb2R5VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBpbml0IEFETUlOIHVzZXIKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBkZWZpbmUgYW5kIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lUmVzb3Vyc2UoKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXROYW1lKCksICIwLjEiKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXROYW1lKCksICIxLjAiKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXROYW1lKCksICIxLjEiKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHJlc291cmNlSWQgPSByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZSkpOworCisJCS8vIGJ1aWxkIEpzb24gT2JqZWN0CisJCUpTT05PYmplY3QganNvbk9iamVjdCA9IEpzb25PYmplY3RCdWlsZGVyKHJlc291cmNlRGV0YWlscyk7CisKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJlc291cmNlLmFkZCgiUmVzb3VyY2UiKTsKKworCQkvLyByZW1vdmUgRGVzY3JpcHRpb24KKwkJVXBkYXRlQW5kVmFsaWRhdGVXaXRoSW5jb21wbGV0ZWRKc29uQm9keShzZG5jTW9kaWZpZXJEZXRhaWxzLCBqc29uT2JqZWN0LCByZXNvdXJjZUlkLCAiZGVzY3JpcHRpb24iLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04ubmFtZSgpLCByZXNvdXJjZSk7CisJCS8vIHJlbW92ZSBUYWdzCisJCVVwZGF0ZUFuZFZhbGlkYXRlV2l0aEluY29tcGxldGVkSnNvbkJvZHkoc2RuY01vZGlmaWVyRGV0YWlscywganNvbk9iamVjdCwgcmVzb3VyY2VJZCwgInRhZ3MiLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfVEFHUy5uYW1lKCksIEVtcHR5X0xpc3QpOworCQkvLyByZW1vdmUgQ2F0ZWdvcnkKKwkJVXBkYXRlQW5kVmFsaWRhdGVXaXRoSW5jb21wbGV0ZWRKc29uQm9keShzZG5jTW9kaWZpZXJEZXRhaWxzLCBqc29uT2JqZWN0LCByZXNvdXJjZUlkLCAiY2F0ZWdvcnkiLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ0FURUdPUlkubmFtZSgpLCByZXNvdXJjZSk7CisJCS8vIHJlbW92ZSBWZW5kb3JOYW1lCisJCVVwZGF0ZUFuZFZhbGlkYXRlV2l0aEluY29tcGxldGVkSnNvbkJvZHkoc2RuY01vZGlmaWVyRGV0YWlscywganNvbk9iamVjdCwgcmVzb3VyY2VJZCwgInZlbmRvck5hbWUiLCBBY3Rpb25TdGF0dXMuTUlTU0lOR19WRU5ET1JfTkFNRS5uYW1lKCksIEVtcHR5X0xpc3QpOworCQkvLyByZW1vdmUgVmVuZG9yUmVsZWFzZQorCQlVcGRhdGVBbmRWYWxpZGF0ZVdpdGhJbmNvbXBsZXRlZEpzb25Cb2R5KHNkbmNNb2RpZmllckRldGFpbHMsIGpzb25PYmplY3QsIHJlc291cmNlSWQsICJ2ZW5kb3JSZWxlYXNlIiwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfVkVORE9SX1JFTEVBU0UubmFtZSgpLCBFbXB0eV9MaXN0KTsKKwkJLy8gcmVtb3ZlIEFUJlQgQ29udGFjdAorCQlVcGRhdGVBbmRWYWxpZGF0ZVdpdGhJbmNvbXBsZXRlZEpzb25Cb2R5KHNkbmNNb2RpZmllckRldGFpbHMsIGpzb25PYmplY3QsIHJlc291cmNlSWQsICJjb250YWN0SWQiLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ09OVEFDVC5uYW1lKCksIHJlc291cmNlKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugd2l0aCBvcmlnaW5hbCBuYW1lLiBvcmlnaW5hbCBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQKKwkJUmVzdFJlc3BvbnNlIGdldFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsICIwLjEiKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBwYXJzZSB1cGRhdGVkIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGdldFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gdmFsaWRhdGUgdGhhdCBtZXRhZGF0YSB3YXMgbm90IGNoYW5nZWQKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZVJlcVZzUmVzcChyZXNvdXJjZURldGFpbHMsIGdldFJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJCVJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJCVJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMS4wIik7CisJCVJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMS4xIik7CisJfQorCisJLy8gRW5kIG9mIHZhbGlkYXRpb24gdGVzdHMKKwkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lVXBkYXRlZFJlc291cnNlKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gInVwZGF0ZWREZXNjcmlwdGlvbiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkvLyBEdXBsaWNhdGUgdGFncyBhcmUgYWxsb3dlZCBhbmQgc2hvdWxkIGJlIGRlLWR1cGxpY2F0ZWQgYnkgc2VydmVyIHNpZGUKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcxIik7CisJCXJlc291cmNlVGFncy5hZGQoInRhZzEiKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgidGFnMiIpOworCQlyZXNvdXJjZVRhZ3MuYWRkKCJ0YWcyIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZChOb3JtYXRpdmVUeXBlc0VudW0uUk9PVC5nZXROb3JtYXRpdmVOYW1lKCkpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJ1cGRhdGVkT3JhY2xlIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMy41IjsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9ICJqaDAwMDEiOworCQlTdHJpbmcgaWNvbiA9ICJteVVwZGF0ZWRJQ09OIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIGNhdGVnb3J5LCBkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJcmVzb3VyY2VEZXRhaWxzLmFkZENhdGVnb3J5Q2hhaW4oUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRS5nZXRDYXRlZ29yeSgpLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLmdldFN1YkNhdGVnb3J5KCkpOworCisJCXJldHVybiByZXNvdXJjZURldGFpbHM7CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyBkZWZpbmVSZXNvdXJzZSgpIHsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJjaXNjbzQiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb24iOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QuZ2V0Tm9ybWF0aXZlTmFtZSgpKTsvLyAidG9zY2Eubm9kZXMuUm9vdCIpOworCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJPcmFjbGUiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjUiOworCQlTdHJpbmcgY29udGFjdElkID0gImpoMDAwMyI7CisJCVN0cmluZyBpY29uID0gIm9iamVjdFN0b3JhZ2UiOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgbnVsbCwgZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCXJlc291cmNlRGV0YWlscy5hZGRDYXRlZ29yeUNoYWluKFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUuZ2V0Q2F0ZWdvcnkoKSwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRS5nZXRTdWJDYXRlZ29yeSgpKTsKKworCQlyZXR1cm4gcmVzb3VyY2VEZXRhaWxzOworCX0KKworCXByb3RlY3RlZCBSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY2xlYW4gRVMgREIKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJldHVybiByZXN0UmVzcG9uc2U7CisJfQorCisJcHJvdGVjdGVkIFJlc3RSZXNwb25zZSBUcnlVcGRhdGVCeUFub3RoZXJWZXJiKFJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBkZWxldGUgcmVzb3VyY2UKKwkJQ29uZmlnIGNvbmZpZzsKKwkJUmVzdFJlc3BvbnNlIFJlc291cmNlUmVzcG9uc2U7CisJCXRyeSB7CisJCQljb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUkVTT1VSQ0VfTUVUQURBVEEsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpICsgIi4wLjEiKTsKKworCQkJaWYgKHVyaSA9PSAiR0VUIikgeworCQkJCVJlc291cmNlUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisJCQl9IGVsc2UgaWYgKHVyaSA9PSAiUE9TVCIpIHsKKwkJCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQkJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbih1cGRhdGVkUmVzb3VyY2VEZXRhaWxzKTsKKwkJCQlSZXNvdXJjZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCB1c2VyQm9keUpzb24sIGhlYWRlcnNNYXApOworCQkJfSBlbHNlIGlmICh1cmkgPT0gIkRFTEVURSIpIHsKKwkJCQlSZXNvdXJjZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZERlbGV0ZSh1cmwsIGhlYWRlcnNNYXApOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIG51bGw7CisKKwkJCXJldHVybiBSZXNvdXJjZVJlc3BvbnNlOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCisJfQorCisJcHJvdGVjdGVkIEpTT05PYmplY3QgSnNvbk9iamVjdEJ1aWxkZXIoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscykgdGhyb3dzIEpTT05FeGNlcHRpb24geworCQkvLyBqc29uIG9iamVjdDogcmVzb3VyY2VOYW1lIGFuZCBpY29uIGFyZSBtdXN0CisJCUpTT05PYmplY3Qgak9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisKKwkJTGlzdDxTdHJpbmc+IHRhZ3NMaXN0ID0gQXJyYXlzLmFzTGlzdChyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJTGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tTGlzdCA9IEFycmF5cy5hc0xpc3QoIlt0b3NjYS5ub2Rlcy5Sb290XSIpOworCisJCWpPYmplY3QucHV0KCJuYW1lIiwgcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCWpPYmplY3QucHV0KCJkZXNjcmlwdGlvbiIsICJ1cGRhdGVkRGVzY3JpcHRpb24iKTsKKwkJak9iamVjdC5wdXQoInRhZ3MiLCB0YWdzTGlzdCk7CisJCWpPYmplY3QucHV0KCJjYXRlZ29yeSIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCkpOworCQlqT2JqZWN0LnB1dCgiZGVyaXZlZEZyb20iLCBkZXJpdmVkRnJvbUxpc3QpOworCQlqT2JqZWN0LnB1dCgidmVuZG9yTmFtZSIsICJuZXdPcmFjbGUiKTsKKwkJak9iamVjdC5wdXQoInZlbmRvclJlbGVhc2UiLCAiMS41Iik7CisJCWpPYmplY3QucHV0KCJjb250YWN0SWQiLCAiamgwMDAzIik7CisJCWpPYmplY3QucHV0KCJpY29uIiwgcmVzb3VyY2VEZXRhaWxzLmdldEljb24oKSk7CisKKwkJcmV0dXJuIGpPYmplY3Q7CisJfQorCisJcHJvdGVjdGVkIEpTT05PYmplY3QgUmVtb3ZlRnJvbUpzb25PYmplY3QoSlNPTk9iamVjdCBqT2JqZWN0LCBTdHJpbmcgcmVtb3ZlZFByb3BlcnkpIHsKKwkJak9iamVjdC5yZW1vdmUocmVtb3ZlZFByb3BlcnkpOworCisJCXJldHVybiBqT2JqZWN0OworCX0KKworCS8vIHB1cnBvc2U6IGZ1bmN0aW9uIGZvciBjb250cm9sbGluZyBqc29uIGJvZHkgZmllbGRzIGFuZCB2YWxpZGF0aW5nCisJLy8gcmVzcG9uc2UKKwlwcm90ZWN0ZWQgdm9pZCBVcGRhdGVBbmRWYWxpZGF0ZVdpdGhJbmNvbXBsZXRlZEpzb25Cb2R5KFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgSlNPTk9iamVjdCBqc29uT2JqZWN0LCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHJlbW92ZWRGaWVsZCwgU3RyaW5nIGVycm9yTWVzc2FnZSwgTGlzdDxTdHJpbmc+IHZhcmlhYmxlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJSlNPTk9iamVjdCBqT2JqZWN0ID0gbmV3IEpTT05PYmplY3QoanNvbk9iamVjdCwgSlNPTk9iamVjdC5nZXROYW1lcyhqc29uT2JqZWN0KSk7CisJCS8vIHJlbW92ZSBkZXNjcmlwdGlvbiBmcm9tIGpzb25PYmplY3QKKwkJak9iamVjdCA9IFJlbW92ZUZyb21Kc29uT2JqZWN0KGpPYmplY3QsIHJlbW92ZWRGaWVsZCk7CisJCS8vIHVwZGF0ZSB3aXRoIGluY29tcGxldGUgYm9keS4KKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKGpPYmplY3QudG9TdHJpbmcoKSwgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VJZCk7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihlcnJvck1lc3NhZ2UsIHZhcmlhYmxlcywgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCS8vIHB1cnBvc2U6IGZ1bmN0aW9uIGZvciB2YWxpZGF0aW5nIGVycm9yIHJlc3BvbnNlCisJcHJvdGVjdGVkIHZvaWQgVXBkYXRlQW5kVmFsaWRhdGUoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBTdHJpbmcgcmVjaWV2ZWRNZXNzYWdlLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgIjAuMSIpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IocmVjaWV2ZWRNZXNzYWdlLCB2YXJpYWJsZXMsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGVOb25VcGRhdGFibGUoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHBhcnNlIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoIXJlc291cmNlRGV0YWlscy5nZXRJc0hpZ2hlc3RWZXJzaW9uKCkuZXF1YWxzKHVwZGF0ZWRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmlzSGlnaGVzdFZlcnNpb24oKSkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCFyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLmVxdWFscyh1cGRhdGVkUmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXROYW1lKCkpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSghcmVzb3VyY2VEZXRhaWxzLmdldElzQWJzdHJhY3QoKS5lcXVhbHModXBkYXRlZFJlc291cmNlUmVzcEphdmFPYmplY3QuaXNBYnN0cmFjdCgpKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoIXJlc291cmNlRGV0YWlscy5nZXRDcmVhdG9yVXNlcklkKCkuZXF1YWxzKHVwZGF0ZWRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldENyZWF0b3JVc2VySWQoKSkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCFyZXNvdXJjZURldGFpbHMuZ2V0Q3JlYXRvckZ1bGxOYW1lKCkuZXF1YWxzKHVwZGF0ZWRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldENyZWF0b3JGdWxsTmFtZSgpKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoIXJlc291cmNlRGV0YWlscy5nZXRMYXN0VXBkYXRlRGF0ZSgpLmVxdWFscyh1cGRhdGVkUmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRMYXN0VXBkYXRlRGF0ZSgpKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoIXJlc291cmNlRGV0YWlscy5nZXRDcmVhdGlvbkRhdGUoKS5lcXVhbHModXBkYXRlZFJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0Q3JlYXRpb25EYXRlKCkpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSghcmVzb3VyY2VEZXRhaWxzLmdldExhc3RVcGRhdGVyVXNlcklkKCkuZXF1YWxzKHVwZGF0ZWRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldExhc3RVcGRhdGVyVXNlcklkKCkpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSghcmVzb3VyY2VEZXRhaWxzLmdldExhc3RVcGRhdGVyRnVsbE5hbWUoKS5lcXVhbHModXBkYXRlZFJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoIXJlc291cmNlRGV0YWlscy5nZXRMaWZlY3ljbGVTdGF0ZSgpLmVxdWFscyh1cGRhdGVkUmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRMaWZlY3ljbGVTdGF0ZSgpKSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoIXJlc291cmNlRGV0YWlscy5nZXRDb3N0KCkuZXF1YWxzKHVwZGF0ZWRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldENvc3QoKSkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCFyZXNvdXJjZURldGFpbHMuZ2V0TGljZW5zZVR5cGUoKS5lcXVhbHModXBkYXRlZFJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0TGljZW5zZVR5cGUoKSkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCFyZXNvdXJjZURldGFpbHMuZ2V0VVVJRCgpLmVxdWFscyh1cGRhdGVkUmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRVVUlEKCkpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUoUmVzb3VyY2VSZXFEZXRhaWxzIFJlc291cmNlRGV0YWlscywgUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHBhcnNlIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIHZhbGlkYXRlIHJlcXVlc3QgdnMgcmVzcG9uc2UKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZVJlcVZzUmVzcChSZXNvdXJjZURldGFpbHMsIHVwZGF0ZWRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKwl9CisKKwlwdWJsaWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgU3RyaW5nIHJlc291cmNlVmVyc2lvbikgeworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KCk7CisKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oIkNoZWNrb3V0Iik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAwLjAiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiUmVzb3VyY2UiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbihTdHJpbmcudmFsdWVPZihGbG9hdC5wYXJzZUZsb2F0KHJlc291cmNlVmVyc2lvbikgLSAwLjFmKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24ocmVzb3VyY2VWZXJzaW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKworCQlyZXR1cm4gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdDsKKworCX0KKworCXB1YmxpYyBlbnVtIEZpZWxkVG9WYWxpZGF0ZSB7CisJCUNvbnRhY3RJZCwgVGFncywgVmVuZG9yTmFtZSwgVmVuZG9yUmVsZWFzZSwgRGVzY3JpcHRpb24KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZUJ5X3Bvc3RUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpOworCisJCS8vIHVwZGF0ZSByZXNvdXJjZSAtIHdpdGhvdXQgY2hhbmdpbmcgcmVzb3VyY2VOYW1lCisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lVXBkYXRlZFJlc291cnNlKHJlc291cmNlTmFtZSk7CisKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBUcnlVcGRhdGVCeUFub3RoZXJWZXJiKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsICJQT1NUIik7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRC5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZSk7CisJCXBhcnNlUmVzcG9uc2VBbmRWYWxpZGF0ZShyZXNvdXJjZURldGFpbHMsIGdldFJlc3RSZXNwb25zZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZUJ5X2dldFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisKKwkJLy8gdXBkYXRlIHJlc291cmNlIC0gd2l0aG91dCBjaGFuZ2luZyByZXNvdXJjZU5hbWUKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVVcGRhdGVkUmVzb3Vyc2UocmVzb3VyY2VOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBUcnlVcGRhdGVCeUFub3RoZXJWZXJiKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsICJHRVQiKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VELm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgZ2V0UmVzdFJlc3BvbnNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlQnlfZGVsZXRlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgLSB3aXRob3V0IGNoYW5naW5nIHJlc291cmNlTmFtZQorCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZSA9IFRyeVVwZGF0ZUJ5QW5vdGhlclZlcmIodXBkYXRlZFJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgIkRFTEVURSIpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQubmFtZSgpLCBFbXB0eV9MaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZSk7CisJCXBhcnNlUmVzcG9uc2VBbmRWYWxpZGF0ZShyZXNvdXJjZURldGFpbHMsIGdldFJlc3RSZXNwb25zZSk7CisKKwl9CisKKwkvLyBUT0RPIERFCisJLy8gQElnbm9yZSgiIikKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVdpdGhJbnZhbGRKc29uQm9keVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZSkpOworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCisJCS8vIHVwZGF0ZSBEZXNjaXJwdGlvbiB2YWx1ZQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAidXBkYXRlZERlc2NyaXB0aW9uIjsKKworCQkvLyBzZW5kIHVwZGF0ZSB3aXRoIGluY29tcGxldGVkIGpzb24sIG9ubHkgZGVzY3JpcHRpb24gc3RyaW5nCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShkZXNjcmlwdGlvbiwgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VJZCk7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBlcnJvciBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDQwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgZ2V0UmVzdFJlc3BvbnNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VOYW1lU2Vuc2l0aXZlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlTdHJpbmcgcmVzb3VyY2VCYXNlVmVyc2lvbiA9ICIwLjEiOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gIkFiIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVVcGRhdGVkUmVzb3Vyc2UocmVzb3VyY2VOYW1lKTsKKwkJLy8gRGVsZXRlIHJlc291cmNlcworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UocmVzcG9uc2UpOworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMiIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UocmVzcG9uc2UpOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJjcmVhdGUgcmVzb3VyY2UgZmFpbGVkIiwgMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gY2hlY2staW4gUmVzb3VyY2UKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQlSZXN0UmVzcG9uc2UgY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBTdHJpbmcgcmVzb3VyY2VDZXJ0aWZ5VmVyc2lvbiA9ICIwLjEiOworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiQUJDXy1idC5hVCIpOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZy5hZGQoMCwgIkFCQ18tYnQuYVQiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRUYWdzKHJlc291cmNlVGFnKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUodXBkYXRlZFJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJLy8gRGVsZXRlIHJlc291cmNlcworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UocmVzcG9uc2UpOworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jTW9kaWZpZXJEZXRhaWxzLCB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMiIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UocmVzcG9uc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBVcGRhdGVJY29uX0luZWdhdGl2ZUZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZUxpc3QuYWRkKDAsICJSZXNvdXJjZSIpOworCQkvLyBjaGVjayBJblZhbGlkIENoYXJhY3RlcnMKKwkJY2hhcltdIG5vdFZhbGlkQ2hhcnNBcnJheSA9IG5ldyBjaGFyWzU5XTsKKwkJbm90VmFsaWRDaGFyc0FycmF5ID0gZ2V0SW5WYWxpZENoYXJzKCk7CisJCS8vIHVwZGF0ZSBtZXRhZGF0YSBkZXRhaWxzCisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lVXBkYXRlZFJlc291cnNlKHJlc291cmNlTmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbm90VmFsaWRDaGFyc0FycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQkvLyBjaGFuZ2UgaWNvbiBvZiBtZXRhZGF0YQorCQkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRJY29uKCJNeUljb24iICsgbm90VmFsaWRDaGFyc0FycmF5W2ldKTsKKwkJCS8vIFBVVCByZXF1ZXN0CisJCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9JQ09OLm5hbWUoKSwgcmVzb3VyY2VMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHJlc291cmNlIGljb24iLCA0MDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgcmVzb3VyY2UgaWNvbiIsICJCYWQgUmVxdWVzdCIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkudG9TdHJpbmcoKSk7CisKKwkJfQorCisJCS8vIGVtcHR5IGljb24KKwkJU3RyaW5nIHVwZGF0ZUljb24gPSAiIjsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRJY29uKHVwZGF0ZUljb24pOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0lDT04ubmFtZSgpLCByZXNvdXJjZUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gSWNvbiBsZW5ndGggbW9yZSB0aGVuIDI1IGNoYXJhY3RlcnMKKwkJcmVzb3VyY2VMaXN0LmFkZCgxLCAiMjUiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRJY29uKCIxMjM0NTY3ODkwXy1xd2VydHl1aW9wQVNETk5OIik7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCAiIik7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lDT05fRVhDRUVEU19MSU1JVC5uYW1lKCksIHJlc291cmNlTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDQwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHJlc291cmNlIGljb24iLCAiQmFkIFJlcXVlc3QiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpLnRvU3RyaW5nKCkpOworCisJCS8vIGdldCByZXNvdXJjZSB3aXRoIG9yaWdpbmFsIG5hbWUuIG9yaWdpbmFsIG1ldGFkYXRhIHNob3VsZCBiZSByZXR1cm5lZAorCQlSZXN0UmVzcG9uc2UgZ2V0UmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgZ2V0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIHBhcnNlIHVwZGF0ZWQgcmVzcG9uc2UgdG8gamF2YU9iamVjdAorCQlSZXNvdXJjZSBnZXRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoZ2V0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyB2YWxpZGF0ZSB0aGF0IG1ldGFkYXRhIHdhcyBub3QgY2hhbmdlZAorCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc291cmNlUmVxVnNSZXNwKHJlc291cmNlRGV0YWlscywgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlX05vVGFnc0VxdWFsVG9SZXNvdXJjZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIGFkbWluTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJU3RyaW5nIHJlc291cmNlQmFzZVZlcnNpb24gPSAiMC4xIjsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpOworCisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lUmVzb3Vyc2UoKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXROYW1lKCJ1cGRhdGVkUmVzb3VyY2VOYW1lIik7CisJCUxpc3Q8U3RyaW5nPiB0YWdzID0gdXBkYXRlZFJlc291cmNlRGV0YWlscy5nZXRUYWdzKCk7CisKKwkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSB0YWdzLmxpc3RJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCVN0cmluZyBhID0gaXRlci5uZXh0KCk7CisJCQlpZiAoYS5lcXVhbHMoInVwZGF0ZWRSZXNvdXJjZU5hbWUiKSkgeworCQkJCWl0ZXIucmVtb3ZlKCk7CisJCQl9CisJCX0KKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEodXBkYXRlZFJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksICIiKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX1RBR1NfTk9fQ09NUF9OQU1FLm5hbWUoKSwgcmVzb3VyY2VMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgcmVzb3VyY2UgaWNvbiIsIDQwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugd2l0aCBvcmlnaW5hbCBuYW1lLiBvcmlnaW5hbCBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQKKwkJUmVzdFJlc3BvbnNlIGdldFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gcGFyc2UgdXBkYXRlZCByZXNwb25zZSB0byBqYXZhT2JqZWN0CisJCVJlc291cmNlIGdldFJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChnZXRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIHZhbGlkYXRlIHRoYXQgbWV0YWRhdGEgd2FzIG5vdCBjaGFuZ2VkCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzb3VyY2VSZXFWc1Jlc3AocmVzb3VyY2VEZXRhaWxzLCBnZXRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VOYW1lX25lZ2F0aXZlRmxvdygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUaGUgdmFsaWRhdGlvbiBhcmUgZG9uZSBpbiBUYWcncyB2YWxpZGF0aW9uCisJCVVzZXIgc2RuY0FkbWluTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNBZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJjcmVhdGUgcmVzb3VyY2UgZmFpbGVkIiwgMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVN0cmluZyB1bmlxdWVJZCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKwkJLy8gY2hlY2sgSW5WYWxpZCBDaGFyYWN0ZXJzCisJCWNoYXJbXSBub3RWYWxpZENoYXJzQXJyYXkgPSBuZXcgY2hhcls1OV07CisJCW5vdFZhbGlkQ2hhcnNBcnJheSA9IGdldEluVmFsaWRDaGFycygpOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZV9OYW1lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VMaXN0LmFkZCgwLCAiUmVzb3VyY2UiKTsKKworCQkvLyB1cGRhdGUgbWV0YWRhdGEgZGV0YWlscworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdFZhbGlkQ2hhcnNBcnJheS5sZW5ndGg7IGkrKywgcmVzb3VyY2VfTmFtZS5jbGVhcigpKSB7CisJCQlpZiAoaSAhPSAxICYmIGkgIT0gNDYgJiYgLyoKKwkJCQkJCQkJCQkgKiBpICE9IDggJiYgaSAhPSA5ICYmIGkgIT0gMTAgJiYgaSAhPSAxMSAmJiBpICE9IDEyICYmCisJCQkJCQkJCQkJICovIGkgIT0gMzEpIC8vIHNwYWNlICgiIikgYW5kIGRvdCguKQorCQkJeworCQkJCS8vIGNoYW5nZSByZXNvdXJjZU5hbWUgcGFyYW1ldGVyCisJCQkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXROYW1lKCJVcGRhdGVkUmVzb3VyY2VOYW1lIiArIG5vdFZhbGlkQ2hhcnNBcnJheVtpXSk7CisJCQkJcmVzb3VyY2VfTmFtZS5hZGQoIlVwZGF0ZWRSZXNvdXJjZU5hbWUiICsgbm90VmFsaWRDaGFyc0FycmF5W2ldKTsKKwkJCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MocmVzb3VyY2VfTmFtZSk7CisJCQkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEodXBkYXRlZFJlc291cmNlRGV0YWlscywgc2RuY0FkbWluTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQkJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCQkJLy8gRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9UQUcubmFtZSgpLAorCQkJCS8vIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBPTkVOVF9OQU1FLm5hbWUoKSwgcmVzb3VyY2VMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCQl9CisJCX0KKworCQkvLyByZXNvdXJjZU5hbWUgbGVuZ3RoIG1vcmUgdGhlbiA1MCBjaGFyYWN0ZXJzCisJCS8vIER1cGxpY2F0ZSB0YWdzIGFyZSBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGUtZHVwbGljYXRlZCBieSBzZXJ2ZXIgc2lkZQorCQlyZXNvdXJjZV9OYW1lLmFkZChyZXNvdXJjZU5hbWUpOworCQlyZXNvdXJjZV9OYW1lLmFkZCgidGFnMSIpOworCQlyZXNvdXJjZV9OYW1lLmFkZCgidGFnMSIpOworCQlyZXNvdXJjZV9OYW1lLmFkZCgidGFnMiIpOworCQlyZXNvdXJjZV9OYW1lLmFkZCgidGFnMiIpOworCisJCXJlc291cmNlTGlzdC5hZGQoMSwgIjEwMjQiKTsKKwkJLy8gdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXROYW1lKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXROYW1lKG5ldyBTdHJpbmcobmV3IGNoYXJbMTAyNV0pLnJlcGxhY2UoIlwwIiwgImEiKSk7CisJCS8vIHJlc291cmNlX05hbWUuYWRkKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRUYWdzKHJlc291cmNlX05hbWUpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jQWRtaW5Nb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVC5uYW1lKCksIHJlc291cmNlTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugd2l0aCBvcmlnaW5hbCBuYW1lLiBvcmlnaW5hbCBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQKKwkJUmVzdFJlc3BvbnNlIGdldFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNBZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgZ2V0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBwYXJzZSB1cGRhdGVkIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGdldFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gdmFsaWRhdGUgdGhhdCBtZXRhZGF0YSB3YXMgbm90IGNoYW5nZWQKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZVJlcVZzUmVzcChyZXNvdXJjZURldGFpbHMsIGdldFJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJCS8vIGRlbGV0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oc2RuY0FkbWluTW9kaWZpZXJEZXRhaWxzLCB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UocmVzcG9uc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VJbmZvcm1hdGlvbl9Ob3RDaGVja2VkT3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHJlc291cmNlQmFzZVZlcnNpb24gPSAiMC4xIjsKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKworCQkvLyBDaGVja0luIFJlc291cmNlCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJUmVzdFJlc3BvbnNlIGNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7IC8vIE5PVF9DRVJUSUZJRURfQ0hFQ0tJTgorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCBjaGVja291dFJlc291cmNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY2hlY2tJbiByZXNvdXJjZSIsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgcmVzb3VyY2VMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgcmVzb3VyY2UgaWNvbiIsIDQwOSwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugd2l0aCBvcmlnaW5hbCBuYW1lLiBvcmlnaW5hbCBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQKKwkJUmVzdFJlc3BvbnNlIGdldFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBwYXJzZSB1cGRhdGVkIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGdldFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gdmFsaWRhdGUgdGhhdCBtZXRhZGF0YSB3YXMgbm90IGNoYW5nZWQKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZVJlcVZzUmVzcChyZXNvdXJjZURldGFpbHMsIGdldFJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBVcGRhdGVSZXNvdXJjZUluZm9ybWF0aW9uX3Jlc291cmNlVmVyc2lvbl8xMSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgYWRtaW5Nb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlTdHJpbmcgcmVzb3VyY2VCYXNlVmVyc2lvbiA9ICIwLjEiOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkvLyByZXN0UmVzcG9uc2UpOworCisJCS8vIENlcnRpZnkgUmVzb3VyY2UKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQlSZXN0UmVzcG9uc2UgY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIHJlc291cmNlQ2VydGlmeVZlcnNpb24gPSAiMS4wIjsKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCByZXNvdXJjZUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyByZXNvdXJjZSBpY29uIiwgNDA5LAorCQkvLyB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIGdldCByZXNvdXJjZSB3aXRoIG9yaWdpbmFsIG5hbWUuIG9yaWdpbmFsIG1ldGFkYXRhIHNob3VsZCBiZSByZXR1cm5lZAorCQlSZXN0UmVzcG9uc2UgZ2V0UmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBnZXQgcmVzb3VyY2UiLCBnZXRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gcGFyc2UgdXBkYXRlZCByZXNwb25zZSB0byBqYXZhT2JqZWN0CisJCVJlc291cmNlIGdldFJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChnZXRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIHZhbGlkYXRlIHRoYXQgbWV0YWRhdGEgd2FzIG5vdCBjaGFuZ2VkCisJCVJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzb3VyY2VSZXFWc1Jlc3AocmVzb3VyY2VEZXRhaWxzLCBnZXRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VJbmZvcm1hdGlvbl9yZXNvdXJjZVZlcnNpb25fMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgcmVzb3VyY2VCYXNlVmVyc2lvbiA9ICIwLjEiOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkvLyByZXN0UmVzcG9uc2UpOworCisJCS8vIENlcnRpZnkgUmVzb3VyY2UKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQlSZXN0UmVzcG9uc2UgY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIFN0cmluZyByZXNvdXJjZUNlcnRpZnlWZXJzaW9uID0gIjAuMSI7CisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgcmVzb3VyY2UgaWNvbiIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugd2l0aCBvcmlnaW5hbCBuYW1lLiBvcmlnaW5hbCBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQKKwkJUmVzdFJlc3BvbnNlIGdldFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBwYXJzZSB1cGRhdGVkIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGdldFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gdmFsaWRhdGUgdGhhdCBtZXRhZGF0YSB3YXMgbm90IGNoYW5nZWQKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZVJlcVZzUmVzcCh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBnZXRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKworCQkvLyBkZWxldGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMsIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tEZWxldGVSZXNwb25zZShyZXNwb25zZSk7CisJCXJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMsIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4yIik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tEZWxldGVSZXNwb25zZShyZXNwb25zZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlSWNvbl9yZXNvdXJjZVZlcnNpb25fMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ2FuIGJlIGNoYW5nZWQgb25seSBpZiBtYWpvciB2ZXJzaW9uIGlzIDAuCisKKwkJVXNlciBhZG1pbk1vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCVN0cmluZyByZXNvdXJjZUJhc2VWZXJzaW9uID0gIjAuMSI7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKworCQkvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKHNkbmNNb2RpZmllckRldGFpbHMsCisJCS8vIHJlc3RSZXNwb25zZSk7CisKKwkJLy8gQ2VydGlmeSBSZXNvdXJjZQorCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgcmVzb3VyY2VDZXJ0aWZ5VmVyc2lvbiA9ICIxLjAiOworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQ2VydGlmeVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPQorCQkvLyBkZWZpbmVVcGRhdGVkUmVzb3Vyc2UocmVzb3VyY2VOYW1lKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVSZXNvdXJzZSgpOworCQkvLyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUoInVwZGF0ZWRWYW5kb3JOYW1lIik7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0SWNvbigidXBkYXRlZEljb24iKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEodXBkYXRlZFJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksICIiKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lDT05fQ0FOTk9UX0JFX0NIQU5HRUQubmFtZSgpLCByZXNvdXJjZUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gZ2V0IHJlc291cmNlIHdpdGggb3JpZ2luYWwgbmFtZS4gb3JpZ2luYWwgbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkCisJCVJlc3RSZXNwb25zZSBnZXRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBnZXQgcmVzb3VyY2UiLCBnZXRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBnZXQgcmVzb3VyY2UiLCBnZXRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCBnZXRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHBhcnNlIHVwZGF0ZWQgcmVzcG9uc2UgdG8gamF2YU9iamVjdAorCQlSZXNvdXJjZSBnZXRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoZ2V0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyB2YWxpZGF0ZSB0aGF0IG1ldGFkYXRhIHdhcyBub3QgY2hhbmdlZAorCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc291cmNlUmVxVnNSZXNwKHJlc291cmNlRGV0YWlscywgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlVmFuZG9yTmFtZV9yZXNvdXJjZVZlcnNpb25fMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ2FuIGJlIGNoYW5nZWQgb25seSBpZiB0aGUgbWFqb3IgcmVzb3VyY2UgdmVyc2lvbiBpcyAwLgorCQlVc2VyIGFkbWluTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJU3RyaW5nIHJlc291cmNlQmFzZVZlcnNpb24gPSAiMC4xIjsKKworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpOworCisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHMoc2RuY01vZGlmaWVyRGV0YWlscywKKwkJLy8gcmVzdFJlc3BvbnNlKTsKKworCQkvLyBDZXJ0aWZ5IFJlc291cmNlCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJUmVzdFJlc3BvbnNlIGNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyByZXNvdXJjZUNlcnRpZnlWZXJzaW9uID0gIjEuMCI7CisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VDZXJ0aWZ5VmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9CisJCS8vIGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVJlc291cnNlKCk7CisKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JOYW1lKCJ1cGRhdGVkVmFuZG9yTmFtZSIpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfVkVORE9SX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQubmFtZSgpLCByZXNvdXJjZUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyByZXNvdXJjZSBpY29uIiwgNDAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIGdldCByZXNvdXJjZSB3aXRoIG9yaWdpbmFsIG5hbWUuIG9yaWdpbmFsIG1ldGFkYXRhIHNob3VsZCBiZSByZXR1cm5lZAorCQlSZXN0UmVzcG9uc2UgZ2V0UmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgZ2V0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBwYXJzZSB1cGRhdGVkIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGdldFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gdmFsaWRhdGUgdGhhdCBtZXRhZGF0YSB3YXMgbm90IGNoYW5nZWQKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZVJlcVZzUmVzcChyZXNvdXJjZURldGFpbHMsIGdldFJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBVcGRhdGVSZXNvdXJjZU5hbWVfcmVzb3VyY2VWZXJzaW9uXzExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENhbiBiZSBjaGFuZ2VkIG9ubHkgaWYgdGhlIG1ham9yIHJlc291cmNlIHZlcnNpb24gaXMgMC4KKwkJVXNlciBhZG1pbk1vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCVN0cmluZyByZXNvdXJjZUJhc2VWZXJzaW9uID0gIjAuMSI7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoImNyZWF0ZSByZXNvdXJjZSBmYWlsZWQiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkvLyByZXN0UmVzcG9uc2UpOworCisJCS8vIENlcnRpZnkgUmVzb3VyY2UKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQlSZXN0UmVzcG9uc2UgY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIHJlc291cmNlQ2VydGlmeVZlcnNpb24gPSAiMS4wIjsKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUNlcnRpZnlWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8qCisJCSAqIC8vUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVVcGRhdGVkUmVzb3Vyc2UocmVzb3VyY2VOYW1lKTsgUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVSZXNvdXJzZSgpOworCQkgKiAKKwkJICogdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZU5hbWUoInVwZGF0ZWRSZXNvdXJjZU5hbWUiKTsgdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRJY29uKCJ1cGRhdGVkUmVzb3VyY2VOYW1lIik7CisJCSAqLworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgidXBkYXRlZFJlc291cmNlTmFtZSIpOworCQlMaXN0PFN0cmluZz4gdGFnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdMaXN0LmFkZCgwLCAidXBkYXRlZFJlc291cmNlTmFtZSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VGFncyh0YWdMaXN0KTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRC5uYW1lKCksIHJlc291cmNlTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VUYWdfcmVzb3VyY2VWZXJzaW9uXzExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRhZyBDYW4gYmUgdXBkYXRlZCB3aGVuIG1ham9yIHZlcnNpb24gaXMgMC4KKwkJVXNlciBhZG1pbk1vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCVN0cmluZyByZXNvdXJjZUJhc2VWZXJzaW9uID0gIjAuMSI7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKworCQkvLyByZXNvdXJjZVV0aWxzLmFkZFJlc291cmNlTWFuZGF0b3J5QXJ0aWZhY3RzKHNkbmNNb2RpZmllckRldGFpbHMsCisJCS8vIHJlc3RSZXNwb25zZSk7CisKKwkJLy8gQ2VydGlmeSBSZXNvdXJjZQorCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgYWRtaW5Nb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTdHJpbmcgcmVzb3VyY2VDZXJ0aWZ5VmVyc2lvbiA9ICIxLjAiOworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQ2VydGlmeVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPQorCQkvLyBkZWZpbmVVcGRhdGVkUmVzb3Vyc2UocmVzb3VyY2VOYW1lKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVSZXNvdXJzZSgpOworCQkvLyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUoInVwZGF0ZWRWYW5kb3JOYW1lIik7CisKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQoIk5ld1RhZyIpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpOworCisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0VGFncyhyZXNvdXJjZVRhZ3MpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCBnZXRSZXN0UmVzcG9uc2UpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUodXBkYXRlZFJlc291cmNlRGV0YWlscywgZ2V0UmVzdFJlc3BvbnNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlQWxsb3dlZFBhcmFtZXNfcmVzb3VyY2VWZXJzaW9uXzExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gVGFnLCBjb250YWN0SWQsIHZlbmRvclJlbGVhc2UsdGFncyBBbmQgZGVzY3JpcHRpb24gLSBDYW4gYmUgYWxzbworCQkvLyB1cGRhdGVkIHdoZW4gbWFqb3IgdmVyc2lvbiBpcyBOT1QgMC4KKwkJVXNlciBhZG1pbk1vZGlmaWVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCVN0cmluZyByZXNvdXJjZUJhc2VWZXJzaW9uID0gIjAuMSI7CisKKwkJLy8gY3JlYXRlIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCisJCS8vIHJlc291cmNlVXRpbHMuYWRkUmVzb3VyY2VNYW5kYXRvcnlBcnRpZmFjdHMoc2RuY01vZGlmaWVyRGV0YWlscywKKwkJLy8gcmVzdFJlc3BvbnNlKTsKKworCQkvLyBDZXJ0aWZ5IFJlc291cmNlCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJUmVzdFJlc3BvbnNlIGNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlQmFzZVZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBhZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVN0cmluZyByZXNvdXJjZUNlcnRpZnlWZXJzaW9uID0gIjEuMCI7CisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VDZXJ0aWZ5VmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9CisJCS8vIGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVJlc291cnNlKCk7CisJCS8vIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSgidXBkYXRlZFZhbmRvck5hbWUiKTsKKworCQkvLyB1cGRhdGVkIGFsbG93ZWQgcGFyYW1ldGVycyB3aGVuIG1ham9yIHJlc291cmNlIHZlcnNpb24gaXMgTk9UICIwIgorCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCgiTmV3VGFnIik7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0VGFncyhyZXNvdXJjZVRhZ3MpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJVcGRhdGVkRGVzY3JpcHRpb24iKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JSZWxlYXNlKCI1LjEiKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQoImJ0NzUwaCIpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCBnZXRSZXN0UmVzcG9uc2UpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUodXBkYXRlZFJlc291cmNlRGV0YWlscywgZ2V0UmVzdFJlc3BvbnNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VEZXJpdmVkRnJvbV9yZXNvdXJjZVZlcnNpb25fMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gRGVyaXZlZEZyb20gcGFyYW1ldGVyIC0gQ2FuIGJlIHVwZGF0ZWQgd2hlbiBtYWpvciB2ZXJzaW9uIGlzIDAuCisJCVVzZXIgYWRtaW5Nb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlTdHJpbmcgcmVzb3VyY2VCYXNlVmVyc2lvbiA9ICIwLjEiOworCisJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisKKwkJLy8gcmVzb3VyY2VVdGlscy5hZGRSZXNvdXJjZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkvLyByZXN0UmVzcG9uc2UpOworCisJCS8vIENlcnRpZnkgUmVzb3VyY2UKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQlSZXN0UmVzcG9uc2UgY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJY2hlY2tvdXRSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VCYXNlVmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjaGVja291dCByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCWNoZWNrb3V0UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIGFkbWluTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUJhc2VWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU3RyaW5nIHJlc291cmNlQ2VydGlmeVZlcnNpb24gPSAiMS4wIjsKKwkJbG9nZ2VyLmRlYnVnKCJDaGFuZ2luZyByZXNvdXJjZSBsaWZlIGN5Y2xlICIpOworCQljaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZUNlcnRpZnlWZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNrb3V0IHJlc291cmNlIiwgMjAwLCBjaGVja291dFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIFJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0KKwkJLy8gZGVmaW5lVXBkYXRlZFJlc291cnNlKHJlc291cmNlTmFtZSk7CisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lUmVzb3Vyc2UoKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZHJpdmVuRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkcml2ZW5Gcm9tLmFkZCgwLCAidG9zY2Eubm9kZXMuQ29udGFpbmVyLkFwcGxpY2F0aW9uIik7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0RGVyaXZlZEZyb20oZHJpdmVuRnJvbSk7CisKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCAiIik7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9ERVJJVkVEX0ZST01fQ0FOTk9UX0JFX0NIQU5HRUQubmFtZSgpLCByZXNvdXJjZUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gZ2V0IHJlc291cmNlIHdpdGggb3JpZ2luYWwgbmFtZS4gb3JpZ2luYWwgbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkCisJCVJlc3RSZXNwb25zZSBnZXRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBnZXQgcmVzb3VyY2UiLCBnZXRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBnZXQgcmVzb3VyY2UiLCBnZXRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCBnZXRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHBhcnNlIHVwZGF0ZWQgcmVzcG9uc2UgdG8gamF2YU9iamVjdAorCQlSZXNvdXJjZSBnZXRSZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QoZ2V0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyB2YWxpZGF0ZSB0aGF0IG1ldGFkYXRhIHdhcyBub3QgY2hhbmdlZAorCQlSZXNvdXJjZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc291cmNlUmVxVnNSZXNwKHJlc291cmNlRGV0YWlscywgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlX3ZlbmRvck5hbWVWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nIHVwZGF0ZWRWZW5kb3JOYW1lID0gIiI7CisJCVN0cmluZyB1bmlxdWVJZCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSh1cGRhdGVkVmVuZG9yTmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19WRU5ET1JfTkFNRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdXBkYXRlIHJlc291cmNlIHZlbmRvck5hbWUgbWV0YWRhdGE6IDEgY2hhcmFjdGVycworCQl1cGRhdGVkVmVuZG9yTmFtZSA9ICIJIjsKKwkJLy8gc2V0IHZlbmRvck5hbWUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUodXBkYXRlZFZlbmRvck5hbWUpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19WRU5ET1JfTkFNRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdXBkYXRlIHJlc291cmNlIHZlbmRvck5hbWUgbWV0YWRhdGE6IDI1IGNoYXJhY3RlcnMKKwkJdXBkYXRlZFZlbmRvck5hbWUgPSAiVmVyaWZpY2F0aW9uIGFuZCB2YWxpZGF0aSI7CisJCS8vIHNldCB2ZW5kb3JOYW1lCisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JOYW1lKHVwZGF0ZWRWZW5kb3JOYW1lKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUocmVzb3VyY2VEZXRhaWxzLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgdmVuZG9yTmFtZSBtZXRhZGF0YTogMjYgY2hhcmFjdGVycworCQl1cGRhdGVkVmVuZG9yTmFtZSA9ICJWZXJpZmljYXRpb24gYW5kIHZhbGlkYXRpaSI7CisJCS8vIHNldCB2ZW5kb3JOYW1lCisJCUxpc3Q8U3RyaW5nPiBteUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJbXlMaXN0LmFkZCgwLCAiMjUiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUodXBkYXRlZFZlbmRvck5hbWUpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5WRU5ET1JfTkFNRV9FWENFRURTX0xJTUlULm5hbWUoKSwgbXlMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHVwZGF0ZSByZXNvdXJjZSBWZW5kb3JSZWxlYXNlIG1ldGFkYXRhOiBmb3JiaWRkZW4gY2hhcmFjdGVycworCQl1cGRhdGVkVmVuZG9yTmFtZSA9ICJBMTwiOworCQkvLyBzZXQgdmVuZG9yTmFtZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSh1cGRhdGVkVmVuZG9yTmFtZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX05BTUUubmFtZSgpLCBFbXB0eV9MaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRWZW5kb3JOYW1lID0gIkExPiI7CisJCS8vIHNldCB2ZW5kb3JOYW1lCisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JOYW1lKHVwZGF0ZWRWZW5kb3JOYW1lKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9WRU5ET1JfTkFNRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZFZlbmRvck5hbWUgPSAiQTE6IjsKKwkJLy8gc2V0IHZlbmRvck5hbWUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUodXBkYXRlZFZlbmRvck5hbWUpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9OQU1FLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkVmVuZG9yTmFtZSA9ICJBMVwiIjsKKwkJLy8gc2V0IHZlbmRvck5hbWUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUodXBkYXRlZFZlbmRvck5hbWUpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9OQU1FLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkVmVuZG9yTmFtZSA9ICJBMS8iOworCQkvLyBzZXQgdmVuZG9yTmFtZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSh1cGRhdGVkVmVuZG9yTmFtZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX05BTUUubmFtZSgpLCBFbXB0eV9MaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRWZW5kb3JOYW1lID0gIkExXFwiOworCQkvLyBzZXQgdmVuZG9yTmFtZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSh1cGRhdGVkVmVuZG9yTmFtZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX05BTUUubmFtZSgpLCBFbXB0eV9MaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRWZW5kb3JOYW1lID0gIkExfCI7CisJCS8vIHNldCB2ZW5kb3JOYW1lCisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JOYW1lKHVwZGF0ZWRWZW5kb3JOYW1lKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9WRU5ET1JfTkFNRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZFZlbmRvck5hbWUgPSAiQTE/IjsKKwkJLy8gc2V0IHZlbmRvck5hbWUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUodXBkYXRlZFZlbmRvck5hbWUpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9OQU1FLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkVmVuZG9yTmFtZSA9ICJBMSoiOworCQkvLyBzZXQgdmVuZG9yTmFtZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yTmFtZSh1cGRhdGVkVmVuZG9yTmFtZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX05BTUUubmFtZSgpLCBFbXB0eV9MaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHVwZGF0ZSByZXNvdXJjZSB2ZW5kb3JOYW1lIG1ldGFkYXRhOiBudWxsCisJCXVwZGF0ZWRWZW5kb3JOYW1lID0gbnVsbDsKKwkJLy8gc2V0IHZlbmRvck5hbWUKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvck5hbWUodXBkYXRlZFZlbmRvck5hbWUpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNTSU5HX1ZFTkRPUl9OQU1FLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VfdmVuZG9yUmVsZWFzZVZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyB1cGRhdGVkVmVuZG9yUmVsZWFzZTsKKwkJLy8gc2V0IFZlbmRvclJlbGVhc2UKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgVmVuZG9yUmVsZWFzZSBtZXRhZGF0YTogMSBjaGFyYWN0ZXJzCisJCXVwZGF0ZWRWZW5kb3JSZWxlYXNlID0gIjEiOworCQkvLyBzZXQgVmVuZG9yUmVsZWFzZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yUmVsZWFzZSh1cGRhdGVkVmVuZG9yUmVsZWFzZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJLy8gdXBkYXRlIHJlc291cmNlIFZlbmRvclJlbGVhc2UgbWV0YWRhdGE6IDI1IGNoYXJhY3RlcnMKKwkJdXBkYXRlZFZlbmRvclJlbGVhc2UgPSAiKCEjMS4wMDAwMDAwMDAwMDAwMDAwMDAwMCI7CisJCS8vIHNldCBWZW5kb3JSZWxlYXNlCisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JSZWxlYXNlKHVwZGF0ZWRWZW5kb3JSZWxlYXNlKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUocmVzb3VyY2VEZXRhaWxzLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgVmVuZG9yUmVsZWFzZSBtZXRhZGF0YTogMjYgY2hhcmFjdGVycworCQl1cGRhdGVkVmVuZG9yUmVsZWFzZSA9ICIoISMxLjAwMDAwMDAwMDAwMDAwMDAwMDAwNSI7Ly8gc2V0IFZlbmRvclJlbGVhc2UKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvclJlbGVhc2UodXBkYXRlZFZlbmRvclJlbGVhc2UpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuVkVORE9SX1JFTEVBU0VfRVhDRUVEU19MSU1JVC5uYW1lKCksIEFycmF5cy5hc0xpc3QoIiIgKyBWYWxpZGF0aW9uVXRpbHMuVkVORE9SX1JFTEVBU0VfTUFYX0xFTkdUSCksIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gVXBkYXRlQW5kVmFsaWRhdGUoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLAorCQkvLyBBY3Rpb25TdGF0dXMuVkVORE9SX1JFTEVBU0VfRVhDRUVEU19MSU1JVC5uYW1lKCksCisJCS8vIEFycmF5cy5hc0xpc3QoIiIrVmFsaWRhdGlvblV0aWxzLlZFTkRPUl9SRUxFQVNFX01BWF9MRU5HVEgpKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgVmVuZG9yUmVsZWFzZSBtZXRhZGF0YTogZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJdXBkYXRlZFZlbmRvclJlbGVhc2UgPSAiQTE8IjsKKwkJLy8gc2V0IFZlbmRvclJlbGVhc2UKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvclJlbGVhc2UodXBkYXRlZFZlbmRvclJlbGVhc2UpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9WRU5ET1JfUkVMRUFTRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZFZlbmRvclJlbGVhc2UgPSAiQTE+IjsKKwkJLy8gc2V0IFZlbmRvclJlbGVhc2UKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvclJlbGVhc2UodXBkYXRlZFZlbmRvclJlbGVhc2UpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9WRU5ET1JfUkVMRUFTRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZFZlbmRvclJlbGVhc2UgPSAiQTE6IjsKKwkJLy8gc2V0IFZlbmRvclJlbGVhc2UKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlbmRvclJlbGVhc2UodXBkYXRlZFZlbmRvclJlbGVhc2UpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9WRU5ET1JfUkVMRUFTRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZFZlbmRvclJlbGVhc2UgPSAiQTFcIiI7CisJCS8vIHNldCBWZW5kb3JSZWxlYXNlCisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JSZWxlYXNlKHVwZGF0ZWRWZW5kb3JSZWxlYXNlKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX1JFTEVBU0UubmFtZSgpLCBFbXB0eV9MaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRWZW5kb3JSZWxlYXNlID0gIkExLyI7CisJCS8vIHNldCBWZW5kb3JSZWxlYXNlCisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JSZWxlYXNlKHVwZGF0ZWRWZW5kb3JSZWxlYXNlKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX1JFTEVBU0UubmFtZSgpLCBFbXB0eV9MaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRWZW5kb3JSZWxlYXNlID0gIkExXFwiOworCQkvLyBzZXQgVmVuZG9yUmVsZWFzZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yUmVsZWFzZSh1cGRhdGVkVmVuZG9yUmVsZWFzZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9SRUxFQVNFLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkVmVuZG9yUmVsZWFzZSA9ICJBMXwiOworCQkvLyBzZXQgVmVuZG9yUmVsZWFzZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yUmVsZWFzZSh1cGRhdGVkVmVuZG9yUmVsZWFzZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9SRUxFQVNFLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkVmVuZG9yUmVsZWFzZSA9ICJBMT8iOworCQkvLyBzZXQgVmVuZG9yUmVsZWFzZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yUmVsZWFzZSh1cGRhdGVkVmVuZG9yUmVsZWFzZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9SRUxFQVNFLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkVmVuZG9yUmVsZWFzZSA9ICJBMSoiOworCQkvLyBzZXQgVmVuZG9yUmVsZWFzZQorCQlyZXNvdXJjZURldGFpbHMuc2V0VmVuZG9yUmVsZWFzZSh1cGRhdGVkVmVuZG9yUmVsZWFzZSk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9SRUxFQVNFLm5hbWUoKSwgRW1wdHlfTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgVmVuZG9yUmVsZWFzZSBtZXRhZGF0YTogbnVsbAorCQl1cGRhdGVkVmVuZG9yUmVsZWFzZSA9IG51bGw7CisJCS8vIHNldCBWZW5kb3JSZWxlYXNlCisJCXJlc291cmNlRGV0YWlscy5zZXRWZW5kb3JSZWxlYXNlKHVwZGF0ZWRWZW5kb3JSZWxlYXNlKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19WRU5ET1JfUkVMRUFTRS5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlX2NvbnRhY3RJZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gW2EtekEtWl17Mn1bMC05XXszfVthLXpBLVowLTldezF9CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gKDYKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGFyYWN0ZXJzCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm93LAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1heQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZXhwYW5kZWQKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyB1cAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gOAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNoYXJhY3RlcnMKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZ1dHVyZSkuCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gQ29udmVydAorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFVwcGVyCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FzZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNoYXJhY3RlcgorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG93ZXIKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXNlCisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlOworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVN0cmluZyB1bmlxdWVJZCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCisJCUxpc3Q8U3RyaW5nPiBteUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJbXlMaXN0LmFkZCgwLCAiUmVzb3VyY2UiKTsKKwkJU3RyaW5nIHVwZGF0ZWRDb250YWN0SWQgPSAiIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkKTsKKworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ09OVEFDVC5uYW1lKCksIG15TGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gImFiMTIzNDUiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIG15TGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gIiAgICAgICI7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZCk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DT05UQUNULm5hbWUoKSwgbXlMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRDb250YWN0SWQgPSAiYWIgNTBoIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QubmFtZSgpLCBteUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJhYjEyM2MiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJjZDc4OUUiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gY29udGFjdElkIG5vcm0KKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkLnRvTG93ZXJDYXNlKCkpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUocmVzb3VyY2VEZXRhaWxzLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gImVmNDU2NyI7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZCk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJBQTAxMkEiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIGNvbnRhY3RJZCBub3JtCisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZC50b0xvd2VyQ2FzZSgpKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJDRDAxMmMiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIGNvbnRhY3RJZCBub3JtCisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZC50b0xvd2VyQ2FzZSgpKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJFRjAxMjMiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIGNvbnRhY3RJZCBub3JtCisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZC50b0xvd2VyQ2FzZSgpKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICoqKioqKioqKioqKioqLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZSA9IEFycmF5cy5hc0xpc3QoIlJlc291cmNlIik7CisJCXVwZGF0ZWRDb250YWN0SWQgPSAiMDEzNDVhIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QubmFtZSgpLCBteUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICIweTAwMEIiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIG15TGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gIlkxMDAwYiI7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZCk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULm5hbWUoKSwgbXlMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRDb250YWN0SWQgPSAiYWJ4eXpDIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QubmFtZSgpLCBteUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJjZFhZWmMiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIG15TGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gImVmWFkxRCI7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZCk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULm5hbWUoKSwgbXlMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRDb250YWN0SWQgPSAiRUZhYmNEIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QubmFtZSgpLCBteUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJFRkFCQ0QiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIG15TGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gIkVGQUJDMSI7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZCk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULm5hbWUoKSwgbXlMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRDb250YWN0SWQgPSAiZWZ1aTFEIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QubmFtZSgpLCBteUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJdXBkYXRlZENvbnRhY3RJZCA9ICJlZnVpMSEiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIG15TGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gImVmNTU1ISI7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZCk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULm5hbWUoKSwgbXlMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXVwZGF0ZWRDb250YWN0SWQgPSAiLGY1NTUiOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q29udGFjdElkKHVwZGF0ZWRDb250YWN0SWQpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCksIG15TGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQl1cGRhdGVkQ29udGFjdElkID0gIkVGNTUuNSI7CisJCXJlc291cmNlRGV0YWlscy5zZXRDb250YWN0SWQodXBkYXRlZENvbnRhY3RJZCk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULm5hbWUoKSwgbXlMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHVwZGF0ZSByZXNvdXJjZSBjb250YWN0SWQgbWV0YWRhdGE6IGV4dGVuZGVkIGNoYXJhY3RlciBzZXQgKDEyOOKAkzI1NSkKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZChleHRlbmRlZENoYXJzU3RyaW5nQnVpbGRlcigpKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QubmFtZSgpLCBteUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdXBkYXRlIHJlc291cmNlIGNvbnRhY3RJZCBtZXRhZGF0YTogbnVsbAorCQl1cGRhdGVkQ29udGFjdElkID0gbnVsbDsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldENvbnRhY3RJZCh1cGRhdGVkQ29udGFjdElkKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QubmFtZSgpLCBteUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlX1RhZ3NGaWVsZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2U7CisJCS8vIGRlZmluZSBhbmQgY3JlYXRlIHJlc291cmNlCisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisKKwkJU3RyaW5nIHVwZGF0ZWRUYWdGaWVsZCA9ICIiOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQpOworCQkvLyBzZXQgZGVzY3JpcHRpb24KKwkJcmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MocmVzb3VyY2VUYWdzKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlJlc291cmNlIiwgInRhZyIpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdXBkYXRlIHJlc291cmNlIHRhZ3MgbWV0YWRhdGE6IGVtcHR5CisJCXJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkvLyBzZXQgVGFncworCQlyZXNvdXJjZURldGFpbHMuc2V0VGFncyhyZXNvdXJjZVRhZ3MpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfVEFHUy5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdXBkYXRlIHJlc291cmNlIGRlc2NyaXB0aW9uIG1ldGFkYXRhOiAxIGNoYXJhY3RlcnMKKwkJdXBkYXRlZFRhZ0ZpZWxkID0gIkEiOworCQlyZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpOworCQkvLyBzZXQgZGVzY3JpcHRpb24KKwkJcmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MocmVzb3VyY2VUYWdzKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUocmVzb3VyY2VEZXRhaWxzLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKworCQkvLyBPSyAtIHRhZyB1cCB0byA1MCBjaGFycworCQl1cGRhdGVkVGFnRmllbGQgPSAiVGhlIEluZGlhbi1jcmVzdGVkLnBvcmN1cGluZV9UaGUgSW5kaWFuIGNyZXN0ZWRkZHMiOworCQlyZXNvdXJjZVRhZ3MuYWRkKHVwZGF0ZWRUYWdGaWVsZCk7CisJCXJlc291cmNlRGV0YWlscy5zZXRUYWdzKHJlc291cmNlVGFncyk7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJLy8gT0sgLSBzdW0gaXMgMTAyNCwgNTB4MjArNDgrMjAoY29tbWFzKSs2KGNpc2NvNCAtIHJlc291cmNlIG5hbWUpCisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxID0gIlRoZSBJbmRpYW4tY3Jlc3RlZC5wb3JjdXBpbmVfVGhlIEluZGlhbiBjcmVzdGVkZDAxIjsKKwkJU3RyaW5nIHVwZGF0ZWRUYWdGaWVsZDIgPSAiVGhlIEluZGlhbi1jcmVzdGVkLnBvcmN1cGluZV9UaGUgSW5kaWFuIGNyZXN0ZWRkMDIiOworCQlTdHJpbmcgdXBkYXRlZFRhZ0ZpZWxkMyA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQwMyI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQ0ID0gIlRoZSBJbmRpYW4tY3Jlc3RlZC5wb3JjdXBpbmVfVGhlIEluZGlhbiBjcmVzdGVkZDA0IjsKKwkJU3RyaW5nIHVwZGF0ZWRUYWdGaWVsZDUgPSAiVGhlIEluZGlhbi1jcmVzdGVkLnBvcmN1cGluZV9UaGUgSW5kaWFuIGNyZXN0ZWRkMDUiOworCQlTdHJpbmcgdXBkYXRlZFRhZ0ZpZWxkNiA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQwNiI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQ3ID0gIlRoZSBJbmRpYW4tY3Jlc3RlZC5wb3JjdXBpbmVfVGhlIEluZGlhbiBjcmVzdGVkZDA3IjsKKwkJU3RyaW5nIHVwZGF0ZWRUYWdGaWVsZDggPSAiVGhlIEluZGlhbi1jcmVzdGVkLnBvcmN1cGluZV9UaGUgSW5kaWFuIGNyZXN0ZWRkMDgiOworCQlTdHJpbmcgdXBkYXRlZFRhZ0ZpZWxkOSA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQwOSI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxMCA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxMCI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxMSA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxMSI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxMiA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxMiI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxMyA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxMyI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxNCA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxNCI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxNSA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxNSI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxNiA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxNiI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxNyA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxNyI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxOCA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RlZGQxOCI7CisJCVN0cmluZyB1cGRhdGVkVGFnRmllbGQxOSA9ICJUaGUgSW5kaWFuLWNyZXN0ZWQucG9yY3VwaW5lX1RoZSBJbmRpYW4gY3Jlc3RhYSI7CisKKwkJcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQodXBkYXRlZFRhZ0ZpZWxkKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQxKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQyKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQzKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQ0KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQ1KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQ2KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQ3KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQ4KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQ5KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQxMCk7CisJCXJlc291cmNlVGFncy5hZGQodXBkYXRlZFRhZ0ZpZWxkMTEpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHVwZGF0ZWRUYWdGaWVsZDEyKTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQxMyk7CisJCXJlc291cmNlVGFncy5hZGQodXBkYXRlZFRhZ0ZpZWxkMTQpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHVwZGF0ZWRUYWdGaWVsZDE1KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQxNik7CisJCXJlc291cmNlVGFncy5hZGQodXBkYXRlZFRhZ0ZpZWxkMTcpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHVwZGF0ZWRUYWdGaWVsZDE4KTsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQxOSk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCS8vIHNldCBkZXNjcmlwdGlvbgorCQlyZXNvdXJjZURldGFpbHMuc2V0VGFncyhyZXNvdXJjZVRhZ3MpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXBhcnNlUmVzcG9uc2VBbmRWYWxpZGF0ZShyZXNvdXJjZURldGFpbHMsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCisJCS8vIEFkZCBhbm90aGVyIHRhZy1leGNlZWRzIGxpbWl0CisJCXJlc291cmNlVGFncy5hZGQoImQiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MocmVzb3VyY2VUYWdzKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gbXlBcnJheSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlteUFycmF5LmFkZCgwLCAiMTAyNCIpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1RBR1NfRVhDRUVEX0xJTUlULm5hbWUoKSwgbXlBcnJheSwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBUYWcgZXhjZWVkcyBsaW1pdCAtIDUxCisJCXJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl1cGRhdGVkVGFnRmllbGQgPSAiVGhlIEluZGlhbi1jcmVzdGVkLnBvcmN1cGluZV9UaGUgSW5kaWFuIGNyZXN0ZWRkZHN3IjsKKwkJcmVzb3VyY2VUYWdzLmFkZCh1cGRhdGVkVGFnRmllbGQpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpOworCQkvLyBzZXQgZGVzY3JpcHRpb24KKwkJcmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MocmVzb3VyY2VUYWdzKTsKKwkJbXlBcnJheS5yZW1vdmUoMCk7CisJCW15QXJyYXkuYWRkKDAsICI1MCIpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULm5hbWUoKSwgbXlBcnJheSwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VfRGVzcmlwdGlvbkZpZWxkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBkZWZpbmUgYW5kIGNyZWF0ZSByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZTsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJlc291cmNlLmFkZCgiUmVzb3VyY2UiKTsKKwkJLy8gdXBkYXRlIHJlc291cmNlIGRlc2NyaXB0aW9uIG1ldGFkYXRhOiAwIGNoYXJhY3RlcnMKKwkJU3RyaW5nIHVwZGF0ZWREZXNjcmlwdGlvbiA9ICIiOworCQkvLyBzZXQgZGVzY3JpcHRpb24KKwkJcmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKHVwZGF0ZWREZXNjcmlwdGlvbik7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTi5uYW1lKCksIHJlc291cmNlLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHVwZGF0ZSByZXNvdXJjZSBkZXNjcmlwdGlvbiBtZXRhZGF0YTogbnVsbAorCQl1cGRhdGVkRGVzY3JpcHRpb24gPSBudWxsOworCQkvLyBzZXQgZGVzY3JpcHRpb24KKwkJcmVzb3VyY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKHVwZGF0ZWREZXNjcmlwdGlvbik7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTi5uYW1lKCksIHJlc291cmNlLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHVwZGF0ZSByZXNvdXJjZSBkZXNjcmlwdGlvbiBtZXRhZGF0YTogMSBjaGFyYWN0ZXJzCisJCXVwZGF0ZWREZXNjcmlwdGlvbiA9ICJBIjsKKwkJLy8gc2V0IGRlc2NyaXB0aW9uCisJCXJlc291cmNlRGV0YWlscy5zZXREZXNjcmlwdGlvbih1cGRhdGVkRGVzY3JpcHRpb24pOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVuaXF1ZUlkLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXBhcnNlUmVzcG9uc2VBbmRWYWxpZGF0ZShyZXNvdXJjZURldGFpbHMsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCisJCS8vIHVwZGF0ZSByZXNvdXJjZSBkZXNjcmlwdGlvbiBtZXRhZGF0YTogMTAyNCBjaGFyYWN0ZXJzCisJCXVwZGF0ZWREZXNjcmlwdGlvbiA9ICJUaGUgSW5kaWFuIGNyZXN0ZWQgcG9yY3VwaW5lICp7SHlzdHJpeCBpbmRpY2F9Kiwgb3IgSW5kaWFuIHBvcmN1cGluZSBpcyBhIG1lbWJlciBvZiB0aGUgT2xkIFdvcmxkIHBvcmN1cGluZXMuIiArICJJdCBpcyBxdWl0ZSBhbiBhZGFwdGFibGUgcm9kZW50LCBmb3VuZCB0aHJvdWdob3V0IHNvdXRoZXJuIEFzaWEgYW5kIHRoZSBNaWRkbGUgRWFzdC4iCisJCQkJKyAiSXQgaXMgdG9sZXJhbnQgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgaGFiaXRhdHM6IG1vdW50YWlucywgdHJvcGljYWwgYW5kIHN1YnRyb3BpY2FsIGdyYXNzbGFuZHMsIHNjcnVibGFuZHMsIGFuZCBmb3Jlc3RzLiIKKwkJCQkrICJJdCBpcyBhIGxhcmdlIHJvZGVudCwgZ3Jvd2luZyBtb3JlIHRoYW4gMC45IG0gPSAoMyBmdCkgbG9uZyBhbmQgd2VpZ2hpbmcgMTQuNSBrZyA9ICgzMiBsYikhIFtjaXRhdGlvbiBuZWVkZWRdIEl0IGlzIGNvdmVyZWQgaW4gbXVsdGlwbGUgbGF5ZXJzIG9mIHF1aWxscy4iCisJCQkJKyAiVGhlIGxvbmdlc3QgcXVpbGxzIGdyb3cgZnJvbSBpdHMgc2hvdWxkZXJzIHRvIGFib3V0IGEgdGhpcmQgb2YgdGhlIGFuaW1hbCdzIGxlbmd0aC4iICsgIkl0cyB0YWlsIGlzIGNvdmVyZWQgaW4gc2hvcnQsIGhvbGxvdyBxdWlsbHMgdGhhdCBjYW4gcmF0dGxlIHdoZW4gdGhyZWF0ZW5lZC4iCisJCQkJKyAiSXQgaGFzIGJyb2FkIGZlZXQgYW5kIGxvbmcgY2xhd3MgZm9yIGRpZ2dpbmcuIFdoZW4gYXR0YWNrZWQsIHRoZSBJbmRpYW4gY3Jlc3RlZCBwb3JjdXBpbmUgcmFpc2VzIGl0cyBxdWlsbHMgYW5kIHJhdHRsZXMgdGhlIGhvbGxvdyBxdWlsbHMgb24gaXRzIHRhaWwuIgorCQkJCSsgIklmIHRoZSBwcmVkYXRvciBwZXJzaXN0cyBwYXN0IHRoZXNlIHRocmVhdHMsIHRoZSBwb3JjdXBpbmUgbGF1bmNoZXMgYSBiYWNrd2FyZHMgYXNzYXVsdCwgaG9waW5nIHRvIHN0YWIgaXRzIGF0dGFja2VyIHdpdGggaXRzIHF1aWxscy4iCisJCQkJKyAiSXQgZG9lcyB0aGlzIHNvIGVmZmVjdGl2ZWx5IHRoYXQgbW9zdCBicnVzaGVzIGJldHdlZW4gcHJlZGF0b3JzIGFuZCB0aGUgSW5kaWFuIHBvcmN1cGluZSBlbmQgaW4gZGVhdGggb3Igc2V2ZXJlIGluanVyeSI7CisJCS8vIHNldCBkZXNjcmlwdGlvbgorCQlyZXNvdXJjZURldGFpbHMuc2V0RGVzY3JpcHRpb24odXBkYXRlZERlc2NyaXB0aW9uKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUocmVzb3VyY2VEZXRhaWxzLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgZGVzY3JpcHRpb24gbWV0YWRhdGE6IDEwMjUgY2hhcmFjdGVycworCQl1cGRhdGVkRGVzY3JpcHRpb24gPSAiVGhlIEluZGlhbiBjcmVzdGVkIHBvcmN1cGluZSAqe0h5c3RyaXggaW5kaWNhfSosIG9yIEluZGlhbiBwb3JjdXBpbmUgaXMgYSBtZW1iZXIgb2YgdGhlIE9sZCBXb3JsZCBwb3JjdXBpbmVzLiIgKyAiSXQgaXMgcXVpdGUgYW4gYWRhcHRhYmxlIHJvZGVudCwgZm91bmQgdGhyb3VnaG91dCBzb3V0aGVybiBBc2lhIGFuZCB0aGUgTWlkZGxlIEVhc3QuIgorCQkJCSsgIkl0IGlzIHRvbGVyYW50IG9mIHNldmVyYWwgZGlmZmVyZW50IGhhYml0YXRzOiBtb3VudGFpbnMsIHRyb3BpY2FsIGFuZCBzdWJ0cm9waWNhbCBncmFzc2xhbmRzLCBzY3J1YmxhbmRzLCBhbmQgZm9yZXN0cy4iCisJCQkJKyAiSXQgaXMgYSBsYXJnZSByb2RlbnQsIGdyb3dpbmcgbW9yZSB0aGFuIDAuOSBtID0gKDMgZnQpIGxvbmcgYW5kIHdlaWdoaW5nIDE0LjUga2cgPSAoMzIgbGIpISBbY2l0YXRpb24gbmVlZGVkXSBJdCBpcyBjb3ZlcmVkIGluIG11bHRpcGxlIGxheWVycyBvZiBxdWlsbHMuIgorCQkJCSsgIlRoZSBsb25nZXN0IHF1aWxscyBncm93IGZyb20gaXRzIHNob3VsZGVycyB0byBhYm91dCBhIHRoaXJkIG9mIHRoZSBhbmltYWwncyBsZW5ndGguIiArICJJdHMgdGFpbCBpcyBjb3ZlcmVkIGluIHNob3J0LCBob2xsb3cgcXVpbGxzIHRoYXQgY2FuIHJhdHRsZSB3aGVuIHRocmVhdGVuZWQuIgorCQkJCSsgIkl0IGhhcyBicm9hZCBmZWV0IGFuZCBsb25nIGNsYXdzIGZvciBkaWdnaW5nLiBXaGVuIGF0dGFja2VkLCB0aGUgSW5kaWFuIGNyZXN0ZWQgcG9yY3VwaW5lIHJhaXNlcyBpdHMgcXVpbGxzIGFuZCByYXR0bGVzIHRoZSBob2xsb3cgcXVpbGxzIG9uIGl0cyB0YWlsLiIKKwkJCQkrICJJZiB0aGUgcHJlZGF0b3IgcGVyc2lzdHMgcGFzdCB0aGVzZSB0aHJlYXRzLCB0aGUgcG9yY3VwaW5lIGxhdW5jaGVzIGEgYmFja3dhcmRzIGFzc2F1bHQsIGhvcGluZyB0byBzdGFiIGl0cyBhdHRhY2tlciB3aXRoIGl0cyBxdWlsbHMuIgorCQkJCSsgIkl0IGRvZXMgdGhpcyBzbyBlZmZlY3RpdmVseSB0aGF0IG1vc3QgYnJ1c2hlcyBiZXR3ZWVuIHByZWRhdG9ycyBhbmQgdGhlIEluZGlhbiBwb3JjdXBpbmUgZW5kIGluIGRlYXRoIG9yIHNldmVyZSBpbmp1cnkuIjsKKwkJLy8gc2V0IGRlc2NyaXB0aW9uCisJCXJlc291cmNlRGV0YWlscy5zZXREZXNjcmlwdGlvbih1cGRhdGVkRGVzY3JpcHRpb24pOworCQlyZXNvdXJjZS5hZGQoMSwgIjEwMjQiKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1bmlxdWVJZCwgIiIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9ERVNDUklQVElPTl9FWENFRURTX0xJTUlULm5hbWUoKSwgcmVzb3VyY2UsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlX1RhZ3NGb3JtYXRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNoYXJbXSBub3RWYWxpZENoYXJzQXJyYXkgPSBnZXRUYWdJblZhbGlkRm9ybWF0Q2hhcnMoKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZWNvdXJzZSBjcmVhdGVkICIsIDIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKworCQkvLyB1cGRhdGUgdGFnIGRldGFpbHMKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVVcGRhdGVkUmVzb3Vyc2UocmVzb3VyY2VOYW1lKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJU3RyaW5nIHVwZGF0ZWRUYWdGaWVsZDsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2U7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIsICJ0YWciKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdFZhbGlkQ2hhcnNBcnJheS5sZW5ndGg7IGkrKykgeworCQkJdXBkYXRlZFRhZ0ZpZWxkID0gIlVwZGF0ZWRUYWciICsgbm90VmFsaWRDaGFyc0FycmF5W2ldOworCQkJcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlyZXNvdXJjZVRhZ3MuYWRkKHVwZGF0ZWRUYWdGaWVsZCk7CisJCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpOworCQkJLy8gc2V0IGRlc2NyaXB0aW9uCisJCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFRhZ3MocmVzb3VyY2VUYWdzKTsKKworCQkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEodXBkYXRlZFJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksICIiKTsKKwkJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgcmVzb3VyY2UgaWNvbiIsIDQwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyByZXNvdXJjZSBpY29uIiwgIkJhZCBSZXF1ZXN0IiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKS50b1N0cmluZygpKTsKKworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlQ2F0ZWdvcnlfbmVnYXRpdmVGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VCZWZvcmVVcGRhdGUgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyB1bmlxdWVJRCA9IHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCisJCS8vIFVwZGF0ZSByZXNvdXJjZSBDYXRlZ29yeSBTdWNjZXNzZnVsbHkKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSByZXNvdXJjZURldGFpbHM7CisKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5yZW1vdmVBbGxDYXRlZ29yaWVzKCk7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFkuZ2V0VmFsdWUoKSwgUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfREFUQUJBU0UuZ2V0U3ViQ2F0ZWdvcnkoKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VMaXN0LmFkZCgwLCAiUmVzb3VyY2UiKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWS5uYW1lKCksIHJlc291cmNlTGlzdCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHJlc291cmNlIiwgNDAwLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIFVwZGF0aW5nIHJlc291cmNlIGNhdGVnb3J5CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVVcGRhdGVSZXNvdXJjZVdpdGhOb25VcGRhdGFibGVGaWVsZHMocmVzb3VyY2VCZWZvcmVVcGRhdGUpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLmFkZENhdGVnb3J5KCIiKTsKKwkJdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEodXBkYXRlZFJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksICIiKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJcmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlTGlzdC5hZGQoMCwgIlJlc291cmNlIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ0FURUdPUlkubmFtZSgpLCByZXNvdXJjZUxpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyByZXNvdXJjZSIsIDQwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBVcGRhdGluZyByZXNvdXJjZSBjYXRlZ29yeQorCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lVXBkYXRlUmVzb3VyY2VXaXRoTm9uVXBkYXRhYmxlRmllbGRzKHJlc291cmNlQmVmb3JlVXBkYXRlKTsKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5hZGRDYXRlZ29yeSgiWFhYWFhYIik7CisJCXVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCAiIik7CisJCS8vIHZhbGlkYXRlIHJlc3BvbnNlCisJCXJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZUxpc3QuYWRkKDAsICJSZXNvdXJjZSIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NBVEVHT1JZLm5hbWUoKSwgcmVzb3VyY2VMaXN0LCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgcmVzb3VyY2UiLCA0MDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gQ2hlY2tJbiBSZXNvdXJjZQorCQlsb2dnZXIuZGVidWcoIkNoYW5naW5nIHJlc291cmNlIGxpZmUgY3ljbGUgIik7CisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOyAvLyBOT1RfQ0VSVElGSUVEX0NIRUNLSU4KKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNoZWNraW4gcmVzb3VyY2UiLCAyMDAsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gVXBkYXRlIHJlc291cmNlIENhdGVnb3J5CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVVcGRhdGVSZXNvdXJjZVdpdGhOb25VcGRhdGFibGVGaWVsZHMocmVzb3VyY2VCZWZvcmVVcGRhdGUpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLmFkZENhdGVnb3J5KFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCkpOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgIiIpOworCQkvLyB2ZXJpZnkgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIEVtcHR5X0xpc3QsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyByZXNvdXJjZSIsIDQwOSwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBDaGVja0luIFJlc291cmNlCisJCWxvZ2dlci5kZWJ1ZygiQ2hhbmdpbmcgcmVzb3VyY2UgbGlmZSBjeWNsZSAiKTsKKwkJUmVzdFJlc3BvbnNlIGNoZWNraW5SZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7IC8vIE5PVF9DRVJUSUZJRURfQ0hFQ0tJTgorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY2hlY2tvdXQgcmVzb3VyY2UiLCBjaGVja291dFJlc291cmNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY2hlY2tJbiByZXNvdXJjZSIsIGNoZWNrb3V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY2hlY2tpbiByZXNvdXJjZSIsIDIwMCwgY2hlY2tvdXRSZXNvdXJjZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSUQpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHJlc291cmNlRGV0YWlscywgZ2V0UmVzdFJlc3BvbnNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VDYXRlZ29yeVN1Y2Nlc3NmdWxseSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHJlc291cmNlQmVmb3JlVXBkYXRlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIFVwZGF0ZSByZXNvdXJjZSBDYXRlZ29yeSBTdWNjZXNzZnVsbHkKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMgPSByZXNvdXJjZURldGFpbHM7CisKKwkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5yZW1vdmVBbGxDYXRlZ29yaWVzKCk7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihSZXNvdXJjZUNhdGVnb3J5RW51bS5BUFBMSUNBVElPTl9MNF9EQVRBQkFTRS5nZXRDYXRlZ29yeSgpLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5BUFBMSUNBVElPTl9MNF9EQVRBQkFTRS5nZXRTdWJDYXRlZ29yeSgpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCAiIik7CisKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlTm9uVXBkYXRhYmxlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsCisJCS8vIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlwYXJzZVJlc3BvbnNlQW5kVmFsaWRhdGUodXBkYXRlZFJlc291cmNlRGV0YWlscywgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisKKwkJLy8gdmFsaWRhdGUgY2F0ZWdvcnkgdXBkYXRlZAorCQlhc3NlcnRUcnVlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKS5nZXROYW1lKCkuZXF1YWxzKFJlc291cmNlQ2F0ZWdvcnlFbnVtLkFQUExJQ0FUSU9OX0w0X0RBVEFCQVNFLmdldENhdGVnb3J5KCkpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgZ2V0UmVzdFJlc3BvbnNlKTsKKwkJcGFyc2VSZXNwb25zZUFuZFZhbGlkYXRlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIGdldFJlc3RSZXNwb25zZSk7CisKKwkJUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNNb2RpZmllckRldGFpbHMsIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJfQorCisJLy8gQmVubnkKKworCUBUZXN0CisJcHVibGljIHZvaWQgVmFsaWRhdGlvbl9VcGRhdGVJY29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEZpZWxkcyB0byB1cGRhdGUgKEZvcmJpZGRlbikKKwkJU3RyaW5nIF91cGRhdGVkSWNvbiA9ICJteVNlY29uZEljb24uSnBnIjsKKworCQkvLyBhZG1pbmlzdHJhdG9yIHBlcm1pc3Npb25zCisJCVVzZXIgc2RuY0FkbWluTW9kaWZpZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBkZWZpbmUgYW5kIGNyZWF0ZSByZXNvdXJjZQorCQlSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oc2RuY0FkbWluTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNBZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKTsKKworCQkvLyB1cGRhdGUgbWV0YWRhdGEgZGV0YWlscworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscyA9IGRlZmluZVVwZGF0ZWRSZXNvdXJzZShyZXNvdXJjZU5hbWUpOworCQkvLyBjaGFuZ2UgaWNvbiBvZiBtZXRhZGF0YQorCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldEljb24oX3VwZGF0ZWRJY29uKTsKKwkJLy8gUFVUIHJlcXVlc3QKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNBZG1pbk1vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksICIiKTsKKworCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0lDT04ubmFtZSgpLCBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSIpLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIGVtcHR5IGljb24KKwkJX3VwZGF0ZWRJY29uID0gIiI7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0SWNvbihfdXBkYXRlZEljb24pOworCQl1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLCBzZG5jQWRtaW5Nb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCAiIik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfSUNPTi5uYW1lKCksIEFycmF5cy5hc0xpc3QoIlJlc291cmNlIiksIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gZ2V0IHJlc291cmNlIHdpdGggb3JpZ2luYWwgbmFtZS4gb3JpZ2luYWwgbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkCisJCVJlc3RSZXNwb25zZSBnZXRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jQWRtaW5Nb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGdldCByZXNvdXJjZSIsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCAyMDAsIGdldFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBwYXJzZSB1cGRhdGVkIHJlc3BvbnNlIHRvIGphdmFPYmplY3QKKwkJUmVzb3VyY2UgZ2V0UmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGdldFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gdmFsaWRhdGUgdGhhdCBtZXRhZGF0YSB3YXMgbm90IGNoYW5nZWQKKwkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZVJlcVZzUmVzcChyZXNvdXJjZURldGFpbHMsIGdldFJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJCVJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihzZG5jQWRtaW5Nb2RpZmllckRldGFpbHMsIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlVHlwZVN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTENTIGlzIENoZWNrT3V0CisJCVN0cmluZyBuZXdSZXNvdXJjZVR5cGUgPSBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCk7CisJCVN0cmluZyBjdXJyZW50UmVzb3VyY2VUeXBlID0gcmVzb3VyY2VEZXRhaWxzLmdldFJlc291cmNlVHlwZSgpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2Uoc2RuY01vZGlmaWVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2VKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUobmV3UmVzb3VyY2VUeXBlKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY3VycmVudFJlc291cmNlSmF2YU9iamVjdC5nZXRVbmlxdWVJZCgpLCAiIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdCh1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBhc3NlcnRUcnVlKCJDaGVjayByZXNvdXJjZSB0eXBlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsCisJCS8vIHVwZGF0ZWRSZXNvdXJjZUphdmFPYmplY3QuZ2V0UmVzb3VyY2VUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMocmVzb3VyY2VUeXBlKSk7CisJCWFzc2VydFRydWUoIkNoZWNrIHJlc291cmNlIHR5cGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgdXBkYXRlZFJlc291cmNlSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKS50b1N0cmluZygpLmVxdWFscyhjdXJyZW50UmVzb3VyY2VUeXBlKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVJlc291cmNlVHlwZUFuZE5hbWVTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIExDUyBpcyBDaGVja091dAorCQlTdHJpbmcgbmV3UmVzb3VyY2VUeXBlID0gUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpOworCQlTdHJpbmcgY3VycmVudFJlc291cmNlVHlwZSA9IHJlc291cmNlRGV0YWlscy5nZXRSZXNvdXJjZVR5cGUoKTsKKwkJU3RyaW5nIG5ld1Jlc291cmNlTmFtZSA9ICJuZXcgTmFtZSI7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgY3VycmVudFJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKG5ld1Jlc291cmNlVHlwZSk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKG5ld1Jlc291cmNlTmFtZSk7CisJCUxpc3Q8U3RyaW5nPiB0YWdzID0gcmVzb3VyY2VEZXRhaWxzLmdldFRhZ3MoKTsKKwkJdGFncy5hZGQobmV3UmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFRhZ3ModGFncyk7CisKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY3VycmVudFJlc291cmNlSmF2YU9iamVjdC5nZXRVbmlxdWVJZCgpLCAiIik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDAsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdCh1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlhc3NlcnRUcnVlKCJDaGVjayByZXNvdXJjZSB0eXBlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXNvdXJjZUphdmFPYmplY3QuZ2V0UmVzb3VyY2VUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoY3VycmVudFJlc291cmNlVHlwZSkpOworCQlhc3NlcnRUcnVlKCJDaGVjayByZXNvdXJjZSBuYW1lIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXNvdXJjZUphdmFPYmplY3QuZ2V0TmFtZSgpLmVxdWFscyhuZXdSZXNvdXJjZU5hbWUpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VUeXBlQWZ0ZXJSZXNvdXJjZUNlcnRpZmljYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgbmV3UmVzb3VyY2VUeXBlID0gUmVzb3VyY2VUeXBlRW51bS5WRi50b1N0cmluZygpOworCQlTdHJpbmcgY3VycmVudFJlc291cmNlVHlwZSA9IHJlc291cmNlRGV0YWlscy5nZXRSZXNvdXJjZVR5cGUoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgY3VycmVudFJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKG5ld1Jlc291cmNlVHlwZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHJlc291cmNlIENoZWNrSW4iLCAyMDAsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHJlc291cmNlIENoZWNrSW4iLCAyMDAsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJY3VycmVudFJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBjdXJyZW50UmVzb3VyY2VKYXZhT2JqZWN0LmdldFVuaXF1ZUlkKCksICIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIDIwMCwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIGFzc2VydFRydWUoIkNoZWNrIHJlc291cmNlIHR5cGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwKKwkJLy8gdXBkYXRlZFJlc291cmNlSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKS50b1N0cmluZygpLmVxdWFscyhuZXdSZXNvdXJjZVR5cGUpKTsKKwkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgcmVzb3VyY2UgdHlwZSBhZnRlciB1cGRhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzb3VyY2VKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKGN1cnJlbnRSZXNvdXJjZVR5cGUpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VUeXBlQ2hlY2tJbkxDUygpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyByZXNvdXJjZVR5cGUgPSBSZXNvdXJjZVR5cGVFbnVtLlZMLnRvU3RyaW5nKCk7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciByZXNvdXJjZSBDaGVja0luIiwgMjAwLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZWRSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY3VycmVudFJlc291cmNlSmF2YU9iamVjdC5nZXRVbmlxdWVJZCgpLCAiIik7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIHZhcmlhYmxlcywgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VUeXBlQ2VydGlmaWVkTENTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHJlc291cmNlVHlwZSA9IFJlc291cmNlVHlwZUVudW0uVkwudG9TdHJpbmcoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgY3VycmVudFJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciByZXNvdXJjZSBDaGVja0luIiwgMjAwLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlZFJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBjdXJyZW50UmVzb3VyY2VKYXZhT2JqZWN0LmdldFVuaXF1ZUlkKCksICIiKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgdmFyaWFibGVzLCB1cGRhdGVkUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBVcGRhdGVSZXNvdXJjZVR5cGVJbnZhbGlkVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyByZXNvdXJjZVR5cGUgPSAiSU5WQUxJRCBUWVBFIjsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJUmVzb3VyY2UgY3VycmVudFJlc291cmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVkUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIGN1cnJlbnRSZXNvdXJjZUphdmFPYmplY3QuZ2V0VW5pcXVlSWQoKSwgIiIpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0ZSByZXNvdWNlIiwgdXBkYXRlZFJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0ZSByZXNvdXJjZSIsIHVwZGF0ZWRSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlIHJlc291cmNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCksIHZhcmlhYmxlcywgdXBkYXRlZFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1ZGUmVzb3VyY2VJbnN0YW5jZU5hbWVDUlVELmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9WRlJlc291cmNlSW5zdGFuY2VOYW1lQ1JVRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTM5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9WRlJlc291cmNlSW5zdGFuY2VOYW1lQ1JVRC5qYXZhCkBAIC0wLDAgKzEsNDgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBWRlJlc291cmNlSW5zdGFuY2VOYW1lQ1JVRCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBzdGF0aWMgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkZDOworCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZMOworCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZGOworCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc0NQOworCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkY7CisJcHJvdGVjdGVkIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWRkM7CisJcHJvdGVjdGVkIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWTDsKKwlwcm90ZWN0ZWQgc3RhdGljIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBzZG5jRGVzaWduZXJEZXRhaWxzMTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY1Rlc3RlckRlYXRhaWxzMTsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgc2RuY0FkbWluRGV0YWlsczE7CisJcHJvdGVjdGVkIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlsczsKKwlwcm90ZWN0ZWQgc3RhdGljIEFydGlmYWN0UmVxRGV0YWlscyBkZWZhdWx0QXJ0aWZhY3REZXRhaWxzOworCXByb3RlY3RlZCBzdGF0aWMgaW50IG1heExlbmd0aCA9IDUwOworCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2UgcmVzb3VyY2VWRiA9IG51bGw7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIFZGUmVzb3VyY2VJbnN0YW5jZU5hbWVDUlVEKCkgeworCQlzdXBlcihuYW1lLCBWRlJlc291cmNlSW5zdGFuY2VOYW1lQ1JVRC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKworCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCS8vIHJlc291cmNlRGV0YWlsc1ZGQyA9CisJCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQy50b1N0cmluZygpLAorCQkvLyAicmVzb3VyY2VWRkMiKTsKKwkJLy8gcmVzb3VyY2VEZXRhaWxzVkYgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi50b1N0cmluZygpLAorCQkvLyAicmVzb3VyY2VWRjMiKTsKKwkJLy8gcmVzb3VyY2VEZXRhaWxzVkwgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WTC50b1N0cmluZygpLAorCQkvLyAicmVzb3VyY2VWTCIpOworCQkvLyByZXNvdXJjZURldGFpbHNDUCA9CisJCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCksCisJCS8vICJyZXNvdXJjZUNQIik7CisJCXNkbmNEZXNpZ25lckRldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJc2RuY1Rlc3RlckRlYXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlzZG5jQWRtaW5EZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCS8vIGhlYXRBcnRpZmFjdERldGFpbHMgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gcmVzb3VyY2VEZXRhaWxzQ1BfMDFlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzQ1BfMDFlLmxlZnQoKS52YWx1ZSgpLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJcmVzb3VyY2VEZXRhaWxzQ1AgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlRGV0YWlsc0NQXzAxZS5sZWZ0KCkudmFsdWUoKSk7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXNvdXJjZURldGFpbHNWTF8wMWUgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZMLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNWTF8wMWUubGVmdCgpLnZhbHVlKCksIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpOworCQlyZXNvdXJjZURldGFpbHNWTCA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VEZXRhaWxzVkxfMDFlLmxlZnQoKS52YWx1ZSgpKTsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXN0UmVzcG9uc2U+IHJlc291cmNlRGV0YWlsc1ZGXzAxZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1ZGID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZURldGFpbHNWRl8wMWUubGVmdCgpLnZhbHVlKCkpOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gcmVzb3VyY2VEZXRhaWxzVkZDXzAxZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNWRkNfMDFlLmxlZnQoKS52YWx1ZSgpLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZDID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZURldGFpbHNWRkNfMDFlLmxlZnQoKS52YWx1ZSgpKTsKKworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRDb21wb25lbnRJbnN0YW5jZSgiVkZDIiwgcmVzb3VyY2VEZXRhaWxzVkZDKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWRiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRDb21wb25lbnRJbnN0YW5jZSgiVkYiLCByZXNvdXJjZURldGFpbHNWRik7CisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkwgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoIlZMIiwgcmVzb3VyY2VEZXRhaWxzVkwpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKCJDUCIsIHJlc291cmNlRGV0YWlsc0NQKTsKKwkJc2RuY0Rlc2lnbmVyRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzZG5jVGVzdGVyRGVhdGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCXNkbmNBZG1pbkRldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkUmVzb3VyY2VJbnN0YW5jZVRvVkYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQljcmVhdGVWRldpdGhDZXJ0aWZpZWRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQLCByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQKTsKKwkJLy8gdmFsaWRhdGUgUkkgbmFtZQorCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNvdXJjZUluc3RhbmNlcyA9IHJlc291cmNlVkYuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUluc3RhbmNlTGlzdE5hbWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUluc3RhbmNlcy5zaXplKCk7IGkrKykgeworCQkJcmVzb3VyY2VJbnN0YW5jZUxpc3ROYW1lLmFkZChyZXNvdXJjZUluc3RhbmNlcy5nZXQoaSkuZ2V0TmFtZSgpKTsKKwkJfQorCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUuYWRkKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AuZ2V0TmFtZSgpICsgIiAxIik7CisJCVN0cmluZyBtZXNzYWdlID0gInJlc291cmNlIGluc3RhbmNlIG5hbWUiOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhyZXNvdXJjZUluc3RhbmNlTGlzdE5hbWUsIHJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lLCBtZXNzYWdlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVwZGF0ZWROYW1lID0gInJlc291cmNlIE5ldyAyIjsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlsc1ZMQyA9IGNoYW5nZVJlc291Y2VOYW1lKHJlc291cmNlRGV0YWlsc1ZGQywKKwkJCQlyZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpOworCQljcmVhdGVWRldpdGhDZXJ0aWZpZWRSZXNvdXJjZUluc3RhbmNlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHNWTEMsIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkZDKTsKKworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQy5zZXROYW1lKHJlc291cmNlSW5zdGFuY2VVcGRhdGVkTmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHJlc291cmNlVkYuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydFRydWUodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisKKwkJcmVzb3VyY2VWRiA9IGNvbnZlcnRSZXNvdXJjZUdldFJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGKTsKKworCQkvLyB2YWxpZGF0ZSBSSSBuYW1lCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2VzID0gcmVzb3VyY2VWRi5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlSW5zdGFuY2VMaXN0TmFtZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlSW5zdGFuY2VzLnNpemUoKTsgaSsrKSB7CisJCQlyZXNvdXJjZUluc3RhbmNlTGlzdE5hbWUuYWRkKHJlc291cmNlSW5zdGFuY2VzLmdldChpKS5nZXROYW1lKCkpOworCQl9CisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUluc3RhbmNlRXhwZWN0ZWRMaXN0TmFtZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZUluc3RhbmNlRXhwZWN0ZWRMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZVVwZGF0ZWROYW1lKTsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAicmVzb3VyY2UgaW5zdGFuY2UgbmFtZSI7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKHJlc291cmNlSW5zdGFuY2VMaXN0TmFtZSwgcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUsIG1lc3NhZ2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZUluc3RhbmNlTmFtZVRvTmV4dEdlbmVyYXRlZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVwZGF0ZWROYW1lID0gcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5nZXROYW1lKCkgKyAiIDIiOworCisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzVkwgPSBjaGFuZ2VSZXNvdWNlTmFtZShyZXNvdXJjZURldGFpbHNWTCwgcmVzb3VyY2VJbnN0YW5jZVVwZGF0ZWROYW1lKTsKKwkJY3JlYXRlVkZXaXRoQ2VydGlmaWVkUmVzb3VyY2VJbnN0YW5jZSh1cGRhdGVkUmVzb3VyY2VEZXRhaWxzVkwsIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkwpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLnNldE5hbWUocmVzb3VyY2VJbnN0YW5jZVVwZGF0ZWROYW1lKTsKKworCQkvLyBhZGQgc2Vjb25kIHJlc291cmNlIGluc3RhbmNlCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHJlc291cmNlVkYpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFJJIiwgMjAxLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VWRiA9IGNvbnZlcnRSZXNvdXJjZUdldFJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGKTsKKworCQkvLyB2YWxpZGF0ZSBSSSBuYW1lCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2VzID0gcmVzb3VyY2VWRi5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlSW5zdGFuY2VMaXN0TmFtZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlSW5zdGFuY2VzLnNpemUoKTsgaSsrKSB7CisJCQlyZXNvdXJjZUluc3RhbmNlTGlzdE5hbWUuYWRkKHJlc291cmNlSW5zdGFuY2VzLmdldChpKS5nZXROYW1lKCkpOworCQl9CisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUluc3RhbmNlRXhwZWN0ZWRMaXN0TmFtZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZUluc3RhbmNlRXhwZWN0ZWRMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWTC5nZXROYW1lKCkgKyAiIDEiKTsKKwkJcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUuYWRkKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AuZ2V0TmFtZSgpICsgIiAyIik7CisJCVN0cmluZyBtZXNzYWdlID0gInJlc291cmNlIGluc3RhbmNlIG5hbWUiOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhyZXNvdXJjZUluc3RhbmNlTGlzdE5hbWUsIHJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lLCBtZXNzYWdlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbm9ybW9saXplVXBkYXRlZFJlc291cmNlSW5zdGFuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVcGRhdGVkTmFtZSA9ICJyZXNvdXJjZSAgIG5ldyAtICAuMiI7CisJCVN0cmluZyBub3JtYWxpemVkTmFtZSA9ICJyZXNvdXJjZW5ldzIiOworCisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzVkwgPSBjaGFuZ2VSZXNvdWNlTmFtZShyZXNvdXJjZURldGFpbHNWTCwgcmVzb3VyY2VJbnN0YW5jZVVwZGF0ZWROYW1lKTsKKworCQljcmVhdGVWRldpdGhDZXJ0aWZpZWRSZXNvdXJjZUluc3RhbmNlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHNWTCwgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWTCk7CisJCS8vIHVwZGF0ZSByZXNvdXJjZSBpbnN0YW5jZSBuYW1lCisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1Auc2V0TmFtZShyZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpOworCisJCS8vIGFkZCBzZWNvbmQgcmVzb3VyY2UgaW5zdGFuY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUCwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzMSwgcmVzb3VyY2VWRik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUkkiLCAyMDEsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVZGID0gY29udmVydFJlc291cmNlR2V0UmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VEZXRhaWxzVkYpOworCisJCS8vIHZhbGlkYXRlIFJJIG5hbWUKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZVZGLmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VJbnN0YW5jZUxpc3ROYW1lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VJbnN0YW5jZXMuc2l6ZSgpOyBpKyspIHsKKwkJCXJlc291cmNlSW5zdGFuY2VMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZXMuZ2V0KGkpLmdldE5hbWUoKSk7CisJCX0KKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lLmFkZChyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZMLmdldE5hbWUoKSArICIgMSIpOworCQlyZXNvdXJjZUluc3RhbmNlRXhwZWN0ZWRMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5nZXROYW1lKCkgKyAiIDIiKTsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAicmVzb3VyY2UgaW5zdGFuY2UgbmFtZSI7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKHJlc291cmNlSW5zdGFuY2VMaXN0TmFtZSwgcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUsIG1lc3NhZ2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVkUmVzb3VyY2VJbnN0YW5jZU5hbWVUb0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJY3JlYXRlVkZXaXRoQ2VydGlmaWVkUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWTCwgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWTCk7CisJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUgPSAiIjsKKwkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VQcmV2aW91c05hbWUgPSByZXNvdXJjZURldGFpbHNDUC5nZXROYW1lKCk7CisKKwkJLy8gYWRkIHNlY29uZCByZXNvdXJjZSBpbnN0YW5jZQorCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMxLCByZXNvdXJjZVZGKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBSSSIsIDIwMSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJlc291cmNlVkYgPSBjb252ZXJ0UmVzb3VyY2VHZXRSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZURldGFpbHNWRik7CisKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5zZXROYW1lKHJlc291cmNlSW5zdGFuY2VVcGRhdGVkTmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgcmVzb3VyY2VWRi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIFJJIHVwZGF0ZSByZXF1ZXN0IiwgMjAwLAorCQkJCXVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gY2hhbmdlIHJlcXVlc3QKKwkJLy8gRXJyb3JJbmZvIGVycm9ySW5mbyA9CisJCS8vIFV0aWxzLnBhcnNlWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19DT01QT05FTlRfTkFNRS5uYW1lKCkpOworCQkvLyB1dGlscy52YWxpZGF0ZVJlc3BvbnNlQ29kZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UsCisJCS8vIGVycm9ySW5mby5nZXRDb2RlKCksICJ1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2UiKTsKKwkJLy8KKwkJLy8gTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlJlc291cmNlIEluc3RhbmNlIik7CisJCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19DT01QT05FTlRfTkFNRS5uYW1lKCksCisJCS8vIHZhcmlhYmxlcywgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXJlc291cmNlVkYgPSBjb252ZXJ0UmVzb3VyY2VHZXRSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZURldGFpbHNWRik7CisKKwkJLy8gdmFsaWRhdGUgUkkgbmFtZQorCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNvdXJjZUluc3RhbmNlcyA9IHJlc291cmNlVkYuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUluc3RhbmNlTGlzdE5hbWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUluc3RhbmNlcy5zaXplKCk7IGkrKykgeworCQkJcmVzb3VyY2VJbnN0YW5jZUxpc3ROYW1lLmFkZChyZXNvdXJjZUluc3RhbmNlcy5nZXQoaSkuZ2V0TmFtZSgpKTsKKwkJfQorCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUuYWRkKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkwuZ2V0TmFtZSgpICsgIiAxIik7CisJCXJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lLmFkZChyZXNvdXJjZUluc3RhbmNlUHJldmlvdXNOYW1lICsgIiAzIik7CisJCVN0cmluZyBtZXNzYWdlID0gInJlc291cmNlIGluc3RhbmNlIG5hbWUiOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhyZXNvdXJjZUluc3RhbmNlTGlzdE5hbWUsIHJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lLCBtZXNzYWdlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlZFJlc291cmNlTmFtZUxlbmd0aEV4Y2VlZE1heGltdW1DaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VQcmV2aW91c05hbWUgPSByZXNvdXJjZURldGFpbHNDUC5nZXROYW1lKCk7CisJCS8vIHVwZGF0ZSByZXNvdXJjZSBpbnN0YW5jZSBuYW1lCisJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUgPSAiYSI7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4TGVuZ3RoOyBpKyspIHsKKwkJCXJlc291cmNlSW5zdGFuY2VVcGRhdGVkTmFtZSArPSAiYiI7CisJCX0KKwkJLy8gUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHNWTCA9CisJCS8vIGNoYW5nZVJlc291Y2VOYW1lKHJlc291cmNlRGV0YWlsc1ZMLCByZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpOworCisJCWNyZWF0ZVZGV2l0aENlcnRpZmllZFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkwsIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkwpOworCQkvLyBhZGQgc2Vjb25kIHJlc291cmNlIGluc3RhbmNlCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHJlc291cmNlVkYpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFJJIiwgMjAxLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VWRiA9IGNvbnZlcnRSZXNvdXJjZUdldFJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGKTsKKworCQlTdHJpbmcgcHJldk5hbWUgPSByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLmdldE5hbWUoKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5zZXROYW1lKHJlc291cmNlSW5zdGFuY2VVcGRhdGVkTmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgcmVzb3VyY2VWRi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzCisJCQkJLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlULm5hbWUoKSk7CisJCS8vIHV0aWxzLnZhbGlkYXRlUmVzcG9uc2VDb2RlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSwKKwkJLy8gZXJyb3JJbmZvLmdldENvZGUoKSwgInVwZGF0ZSByZXNvdXJjZSBpbnN0YW5jZSIpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSBJbnN0YW5jZSIsICI1MCIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0VYQ0VFRFNfTElNSVQubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1Auc2V0TmFtZShwcmV2TmFtZSk7CisJCS8vIHZhbGlkYXRlIFJJIG5hbWUKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZVZGLmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VJbnN0YW5jZUxpc3ROYW1lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VJbnN0YW5jZXMuc2l6ZSgpOyBpKyspIHsKKwkJCXJlc291cmNlSW5zdGFuY2VMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZXMuZ2V0KGkpLmdldE5hbWUoKSk7CisJCX0KKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lLmFkZChyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZMLmdldE5hbWUoKSArICIgMSIpOworCQlyZXNvdXJjZUluc3RhbmNlRXhwZWN0ZWRMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5nZXROYW1lKCkgKyAiIDIiKTsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAicmVzb3VyY2UgaW5zdGFuY2UgbmFtZSI7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKHJlc291cmNlSW5zdGFuY2VMaXN0TmFtZSwgcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUsIG1lc3NhZ2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVkUmVzb3VyY2VOYW1lV2l0aFVuU3VwcG9ydGVkQ2hhcmFjdGVycygpIHRocm93cyBFeGNlcHRpb24geworCisJCWNyZWF0ZVZGV2l0aENlcnRpZmllZFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkwsIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkwpOworCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVByZXZpb3VzTmFtZSA9IHJlc291cmNlRGV0YWlsc0NQLmdldE5hbWUoKTsKKwkJLy8gdXBkYXRlIHJlc291cmNlIGluc3RhbmNlIG5hbWUKKwkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVcGRhdGVkTmFtZSA9ICJhPz8/PD4iOworCisJCS8vIGFkZCBzZWNvbmQgcmVzb3VyY2UgaW5zdGFuY2UKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUCwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzMSwgcmVzb3VyY2VWRik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUkkiLCAyMDEsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZVZGID0gY29udmVydFJlc291cmNlR2V0UmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VEZXRhaWxzVkYpOworCisJCVN0cmluZyBwcmV2VmFsdWUgPSByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLmdldE5hbWUoKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5zZXROYW1lKHJlc291cmNlSW5zdGFuY2VVcGRhdGVkTmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgcmVzb3VyY2VWRi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBPTkVOVF9OQU1FLm5hbWUoKSk7CisJCS8vIFJlc291cmNlUmVzdFV0aWxzLnZhbGlkYXRlUmVzcG9uc2VDb2RlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSwKKwkJLy8gZXJyb3JJbmZvLmdldENvZGUoKSwgInVwZGF0ZSByZXNvdXJjZSBpbnN0YW5jZSIpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJSZXNvdXJjZSBJbnN0YW5jZSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09NUE9ORU5UX05BTUUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1Auc2V0TmFtZShwcmV2VmFsdWUpOworCisJCS8vIHZhbGlkYXRlIFJJIG5hbWUKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZVZGLmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VJbnN0YW5jZUxpc3ROYW1lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VJbnN0YW5jZXMuc2l6ZSgpOyBpKyspIHsKKwkJCXJlc291cmNlSW5zdGFuY2VMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZXMuZ2V0KGkpLmdldE5hbWUoKSk7CisJCX0KKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlSW5zdGFuY2VFeHBlY3RlZExpc3ROYW1lLmFkZChyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZMLmdldE5hbWUoKSArICIgMSIpOworCQlyZXNvdXJjZUluc3RhbmNlRXhwZWN0ZWRMaXN0TmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5nZXROYW1lKCkgKyAiIDIiKTsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAicmVzb3VyY2UgaW5zdGFuY2UgbmFtZSI7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKHJlc291cmNlSW5zdGFuY2VMaXN0TmFtZSwgcmVzb3VyY2VJbnN0YW5jZUV4cGVjdGVkTGlzdE5hbWUsIG1lc3NhZ2UpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGNoYW5nZVJlc291Y2VOYW1lKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldCwKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc291cmNlUmVxRGV0YWlscyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscygpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gcmVzb3VyY2VEZXQ7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0TmFtZShyZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZChyZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpOworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFRhZ3ModGFncyk7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyB1cGRhdGVkUmVzb3VyY2VCb2R5SnNvbiA9IGdzb24udG9Kc29uKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldCwgc2RuY0Rlc2lnbmVyRGV0YWlsczEsCisJCQkJcmVzb3VyY2VEZXQuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hhbmdlIExTIHN0YXRlIHRvIENIRUNLT1VULCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCXJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YSh1cGRhdGVkUmVzb3VyY2VCb2R5SnNvbiwgc2RuY0Rlc2lnbmVyRGV0YWlsczEsCisJCQkJdXBkYXRlZFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0ZXJlc291cmNlIG5hbWUiLCAyMDAsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLAorCQkJCXJlc291cmNlRGV0LmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKworCQlyZXR1cm4gdXBkYXRlZFJlc291cmNlRGV0YWlsczsKKworCX0KKworCS8vIHByaXZhdGUgQ29tcG9uZW50IGNoYW5nZVJlc291Y2VOYW1lKFJlc291cmNlIHJlc291cmNlRGV0LCBTdHJpbmcKKwkvLyByZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpIHRocm93cyBFeGNlcHRpb257CisJLy8KKwkvLyBVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkvLyBSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzID0gcmVzb3VyY2VEZXQ7CisJLy8gUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0KKwkvLyBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodXBkYXRlZFJlc291cmNlRGV0YWlscywKKwkvLyBkZWZhdWx0VXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgInN0YXRlIGNoYW5nZWQiKTsKKwkvLyBhc3NlcnRUcnVlKCJjaGFuZ2UgTFMgc3RhdGUgdG8gQ0hFQ0tPVVQsIHJldHVybmVkIHN0YXR1czoiICsKKwkvLyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSxyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCS8vIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0TmFtZShyZXNvdXJjZUluc3RhbmNlVXBkYXRlZE5hbWUpOworCS8vIExpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJLy8gdGFncy5hZGQocmVzb3VyY2VJbnN0YW5jZVVwZGF0ZWROYW1lKTsKKwkvLyB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFRhZ3ModGFncyk7CisJLy8gR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkvLyBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VSZXFEZXRhaWxzID0gbmV3CisJLy8gUmVzb3VyY2VSZXFEZXRhaWxzKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMpOworCS8vIFN0cmluZyB1cGRhdGVkUmVzb3VyY2VCb2R5SnNvbiA9IGdzb24udG9Kc29uKHJlc291cmNlUmVxRGV0YWlscyk7CisJLy8gcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy51cGRhdGVSZXNvdXJjZSh1cGRhdGVkUmVzb3VyY2VCb2R5SnNvbiwKKwkvLyBkZWZhdWx0VXNlciwgdXBkYXRlZFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlcmVzb3VyY2UgbmFtZSIsIDIwMCwKKwkvLyByZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLyByZXNwb25zZSA9CisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsCisJLy8gZGVmYXVsdFVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgInN0YXRlIGNoYW5nZWQiKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRlcmVzb3VyY2UgbmFtZSIsIDIwMCwKKwkvLyByZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIHJldHVybiB1cGRhdGVkUmVzb3VyY2VEZXRhaWxzOworCS8vCisJLy8gfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVZGV2l0aENlcnRpZmllZFJlc291cmNlSW5zdGFuY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywKKwkJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIENIRUNLT1VUIiwgMjAwLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBhZGQgaGVhdCBhcnRpZmFjdCB0byByZXNvdXJjZSBhbmQgY2VydGlmeQorCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlyZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsCisJCQkJcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKCJhZGQgSEVBVCBhcnRpZmFjdCB0byByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBDRVJUSUZZIHJlcXVlc3QiLCAyMDAsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJlc291cmNlVkYgPSBjb252ZXJ0UmVzb3VyY2VHZXRSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZURldGFpbHNWRik7CisKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0Q29tcG9uZW50VWlkKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsCisJCQkJcmVzb3VyY2VWRik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUkkiLCAyMDEsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCXJlc291cmNlVkYgPSBjb252ZXJ0UmVzb3VyY2VHZXRSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZURldGFpbHNWRik7CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlIGNvbnZlcnRSZXNvdXJjZUdldFJlc3BvbnNlVG9KYXZhT2JqZWN0KFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHJlc291cmNlIiwgMjAwLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmV0dXJuIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvVmFsaWRhdGVFeHRlbmRlZFZmRGF0YS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvVmFsaWRhdGVFeHRlbmRlZFZmRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTc1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZS9WYWxpZGF0ZUV4dGVuZGVkVmZEYXRhLmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFzc29jVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkF0b21pY09wZXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgVmFsaWRhdGVFeHRlbmRlZFZmRGF0YSBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBSZXNvdXJjZSByZXNvdXJjZURldGFpbHNWRjsKKwlwcm90ZWN0ZWQgUmVzb3VyY2UgcmVzb3VyY2VEZXRhaWxzQ1BfMDE7CisJcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlRGV0YWlsc1ZMXzAxOworCXByb3RlY3RlZCBSZXNvdXJjZSByZXNvdXJjZURldGFpbHNWRkNjb21wOworCisJcHJvdGVjdGVkIFVzZXIgc2RuY1VzZXJEZXRhaWxzOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBWYWxpZGF0ZUV4dGVuZGVkVmZEYXRhKCkgeworCQlzdXBlcihuYW1lLCBWYWxpZGF0ZUV4dGVuZGVkVmZEYXRhLmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCXNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXN0UmVzcG9uc2U+IHJlc291cmNlRGV0YWlsc1ZGZSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1ZGID0gcmVzb3VyY2VEZXRhaWxzVkZlLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gcmVzb3VyY2VEZXRhaWxzQ1BfMDFlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5DUCwgTm9ybWF0aXZlVHlwZXNFbnVtLlBPUlQsCisJCQkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0RBVEFCQVNFLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlyZXNvdXJjZURldGFpbHNDUF8wMSA9IHJlc291cmNlRGV0YWlsc0NQXzAxZS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULCByZXNvdXJjZURldGFpbHNDUF8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVULCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLCByZXNvdXJjZURldGFpbHNDUF8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNDUF8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXNvdXJjZURldGFpbHNWTF8wMWUgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZMLCBOb3JtYXRpdmVUeXBlc0VudW0uTkVUV09SSywKKwkJCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfTkVUV09SS19FTEVNRU5UUywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkxfMDEgPSByZXNvdXJjZURldGFpbHNWTF8wMWUubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVCwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX1ZPTCwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsCisJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX1ZPTCwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsCisJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX05FVCwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsCisJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5PVEhFUiwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkxfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXNvdXJjZURldGFpbHNWRkNjb21wRSA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLCBOb3JtYXRpdmVUeXBlc0VudW0uQ09NUFVURSwKKwkJCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1ZGQ2NvbXAgPSByZXNvdXJjZURldGFpbHNWRkNjb21wRS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkZDY29tcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VEZXRhaWxzQ1BfMDFpbnMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlRGV0YWlsc0NQXzAxLCByZXNvdXJjZURldGFpbHNWRiwKKwkJCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkKKwkJCQkubGVmdCgpLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlRGV0YWlsc1ZMXzAxaW5zID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZURldGFpbHNWTF8wMSwgcmVzb3VyY2VEZXRhaWxzVkYsCisJCQkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpCisJCQkJLmxlZnQoKS52YWx1ZSgpOworCQlDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZURldGFpbHNWRkNjb21wX2lucyA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VEZXRhaWxzVkZDY29tcCwgcmVzb3VyY2VEZXRhaWxzVkYsCisJCQkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpCisJCQkJLmxlZnQoKS52YWx1ZSgpOworCisJCXJlc291cmNlRGV0YWlsc1ZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QocmVzb3VyY2VEZXRhaWxzVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFzc29jaWF0ZTJSZXNvdXJjZUluc3RhbmNlcyhyZXNvdXJjZURldGFpbHNWRiwgcmVzb3VyY2VEZXRhaWxzQ1BfMDFpbnMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkxfMDFpbnMsIEFzc29jVHlwZS5MSU5LQUJMRS5nZXRBc3NvY1R5cGUoKSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYXNzb2NpYXRlMlJlc291cmNlSW5zdGFuY2VzKHJlc291cmNlRGV0YWlsc1ZGLCByZXNvdXJjZURldGFpbHNDUF8wMWlucywKKwkJCQlyZXNvdXJjZURldGFpbHNWRkNjb21wX2lucywgQXNzb2NUeXBlLkJJTkRBQkxFLmdldEFzc29jVHlwZSgpLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUxhdGVzdFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkYsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRUcnVlKCJjaGFuZ2UgTEMgc3RhdGUgdG8gQ0hFQ0tJTiwgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQkvLyByZXNvdXJjZURldGFpbHNWRiA9CisJCS8vIEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGLAorCQkvLyBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VMYXRlc3RWZXJzaW9uUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZUxhdGVzdFZlcnNpb25MaXN0KHNkbmNVc2VyRGV0YWlscyk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMCwgcmV0dXJuZWQgOiIgKyBnZXRSZXNvdXJjZUxhdGVzdFZlcnNpb25SZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlnZXRSZXNvdXJjZUxhdGVzdFZlcnNpb25SZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlTGlzdCA9IFJlc291cmNlUmVzdFV0aWxzCisJCQkJLnJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFJlc291cmNlTGF0ZXN0VmVyc2lvblJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHJlc291cmNlTGlzdCwKKwkJCQlyZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKTsKKworCQljYWxsQWxsQ2hlY2tNZXRob2RzKHJlc291cmNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldEZvbGxvd2VkUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGLCBzZG5jVXNlckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hhbmdlIExDIHN0YXRlIHRvIENIRUNLSU4sIHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJLy8gcmVzb3VyY2VEZXRhaWxzVkYgPQorCQkvLyBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChyZXNvdXJjZURldGFpbHNWRiwKKwkJLy8gVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkYgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChyZXNvdXJjZURldGFpbHNWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0Rm9sbG93ZWRSZXNvdXJjZXNSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldEZvbGxvd2VkTGlzdChzZG5jVXNlckRldGFpbHMpOworCQlTdHJpbmcganNvbiA9IGdldEZvbGxvd2VkUmVzb3VyY2VzUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwkJSlNPTk9iamVjdCBqc29uUmVzcCA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UoanNvbik7CisJCUpTT05BcnJheSByZXNvdXJjZXMgPSAoSlNPTkFycmF5KSBqc29uUmVzcC5nZXQoInJlc291cmNlcyIpOworCisJCUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlTGlzdCA9IFJlc291cmNlUmVzdFV0aWxzLnJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KHJlc291cmNlcy50b1N0cmluZygpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChyZXNvdXJjZUxpc3QsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYuZ2V0VW5pcXVlSWQoKSk7CisJCS8vIFRPRE8gaWYgZ2V0IGZvbGxvd2VkIGxpc3QgQXBpIHNob3VsZCByZXR1cm4gZnVsbCBvYmplY3QgZGF0YT8KKwkJLy8gY2FsbEFsbENoZWNrTWV0aG9kcyhyZXNvdXJjZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsaWZlQ3ljbGVDaGVrSW5SZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGLCBzZG5jVXNlckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hhbmdlIExDIHN0YXRlIHRvIENIRUNLSU4sIHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJLy8gcmVzb3VyY2VEZXRhaWxzVkYgPQorCQkvLyBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChyZXNvdXJjZURldGFpbHNWRiwKKwkJLy8gVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkYgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChyZXNvdXJjZURldGFpbHNWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQljYWxsQWxsQ2hlY2tNZXRob2RzKHJlc291cmNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxpZmVDeWNsZUNoZWtPdXRSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGLCBzZG5jVXNlckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hhbmdlIExDIHN0YXRlIHRvIENIRUNLSU4sIHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkYsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hhbmdlIExDIHN0YXRlIHRvIENIRUNLT1VULCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCXJlc291cmNlRGV0YWlsc1ZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0UmVzb3VyY2VPYmplY3QocmVzb3VyY2VEZXRhaWxzVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJY2FsbEFsbENoZWNrTWV0aG9kcyhyZXNvdXJjZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsaWZlQ3ljbGVSZXF1ZXN0Rm9yQ2VydGlmaWNhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNWRiwgc2RuY1VzZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydFRydWUoImNoYW5nZSBMQyBzdGF0ZSB0byBDSEVDS0lOLCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCXJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGLCBzZG5jVXNlckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydFRydWUoImNoYW5nZSBMQyBzdGF0ZSB0byBDRVJUSUZJQ0FUSU9OUkVRVUVTVCwgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlyZXNvdXJjZURldGFpbHNWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWNhbGxBbGxDaGVja01ldGhvZHMocmVzb3VyY2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGlmZUN5Y2xlQ2VydGlmaWNhdGlvblJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGZhbHNlKQorCQkJCS5nZXRSaWdodCgpOworCQlhc3NlcnRUcnVlKCJjaGFuZ2UgTEMgc3RhdGUgdG8gQ0VSVElGWSwgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlyZXNvdXJjZURldGFpbHNWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCWNhbGxBbGxDaGVja01ldGhvZHMocmVzb3VyY2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRSZXNvdXJjZUFmdGVyQ2VydGlmaWNhdGlvblJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGZhbHNlKQorCQkJCS5nZXRSaWdodCgpOworCQlhc3NlcnRUcnVlKCJjaGFuZ2UgTEMgc3RhdGUgdG8gQ0VSVElGWSwgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlyZXNvdXJjZURldGFpbHNWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmdldFJlc291cmNlT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIpOworCisJCWNhbGxBbGxDaGVja01ldGhvZHMocmVzb3VyY2VEZXRhaWxzVkYpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VNZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24geworCisJCXJlc291cmNlRGV0YWlsc1ZGLnNldERlc2NyaXB0aW9uKCJzdGFtU3RhbSIpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkZyZXFEID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZURldGFpbHNWRik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZURldGFpbHNWRnJlcUQsCisJCQkJc2RuY1VzZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRi5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIHVwZGF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJdXBkYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QodXBkYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQljYWxsQWxsQ2hlY2tNZXRob2RzKHJlc291cmNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tSZXNvdXJjZUluc3RhbmNlcyhSZXNvdXJjZSByZXNvdXJjZSkgeworCQlhc3NlcnROb3ROdWxsKCJyZXNvdXJjZSBjb21wb25lbnQgSW5zdGFuY2VzIGxpc3QgaXMgbnVsbCAiLCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSk7CisJCWFzc2VydFRydWUoInJlc291cmNlIGNvbXBvbmVudCBJbnN0YW5jZXMgbGlzdCBpcyBlbXB0eSAiLCAhcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuZXF1YWxzKCIiKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrUmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzKFJlc291cmNlIHJlc291cmNlKSB7CisJCWFzc2VydE5vdE51bGwoImNvbXBvbmVudCBJbnN0YW5jZXMgcHJvcGVyaWVzIGxpc3QgaXMgbnVsbCAiLCByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKCkpOworCQlhc3NlcnRUcnVlKCJjb21wb25lbnQgSW5zdGFuY2VzIHByb3BlcmllcyBsaXN0IGlzIGVtcHR5ICIsCisJCQkJIXJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMoKS5lcXVhbHMoIiIpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tSZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucyhSZXNvdXJjZSByZXNvdXJjZSkgeworCQlhc3NlcnROb3ROdWxsKCJjb21wb25lbnQgSW5zdGFuY2VzIFJlbGF0aW9ucyBsaXN0IGlzIG51bGwgIiwgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKCkpOworCQlhc3NlcnRUcnVlKCJjb21wb25lbnQgSW5zdGFuY2VzIFJlbGF0aW9ucyBsaXN0IGlzIGVtcHR5ICIsCisJCQkJIXJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpLmVxdWFscygiIikpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja1Jlc291cmNlQ2FwYWJpbGl0aWVzKFJlc291cmNlIHJlc291cmNlKSB7CisJCWFzc2VydE5vdE51bGwoImNvbXBvbmVudCBJbnN0YW5jZXMgQ2FwYWJpbGl0aWVzIGxpc3QgaXMgbnVsbCAiLCByZXNvdXJjZS5nZXRDYXBhYmlsaXRpZXMoKSk7CisJCWFzc2VydFRydWUoImNvbXBvbmVudCBJbnN0YW5jZXMgQ2FwYWJpbGl0aWVzIGxpc3QgaXMgZW1wdHkgIiwgIXJlc291cmNlLmdldENhcGFiaWxpdGllcygpLmVxdWFscygiIikpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja1Jlc291cmNlUmVxdWlyZW1lbnRzKFJlc291cmNlIHJlc291cmNlKSB7CisJCWFzc2VydE5vdE51bGwoImNvbXBvbmVudCBJbnN0YW5jZXMgUmVxdWlyZW1lbnRzIGxpc3QgaXMgbnVsbCAiLCByZXNvdXJjZS5nZXRSZXF1aXJlbWVudHMoKSk7CisJCWFzc2VydFRydWUoImNvbXBvbmVudCBJbnN0YW5jZXMgUmVxdWlyZW1lbnRzIGxpc3QgaXMgZW1wdHkgIiwgIXJlc291cmNlLmdldFJlcXVpcmVtZW50cygpLmVxdWFscygiIikpOworCX0KKworCXByaXZhdGUgdm9pZCBjYWxsQWxsQ2hlY2tNZXRob2RzKFJlc291cmNlIHJlc291cmNlKSB7CisKKwkJY2hlY2tSZXNvdXJjZUluc3RhbmNlcyhyZXNvdXJjZSk7CisJCWNoZWNrUmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzKHJlc291cmNlKTsKKwkJY2hlY2tSZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9ucyhyZXNvdXJjZSk7CisJCWNoZWNrUmVzb3VyY2VDYXBhYmlsaXRpZXMocmVzb3VyY2UpOworCQljaGVja1Jlc291cmNlUmVxdWlyZW1lbnRzKHJlc291cmNlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1ZmQ29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2UvVmZDb21wb25lbnRJbnN0YW5jZUNSVURUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4Yjg5MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNlL1ZmQ29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFM7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlUOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfREVMRVRFOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfTk9UX0ZPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBSZXFEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlbGF0aW9uc2hpcEltcGw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50SW5zdGFuY2VCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db21wb25lbnRSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQmFzZVZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFZmQ29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdCBleHRlbmRzIENvbXBvbmVudEluc3RhbmNlQmFzZVRlc3QgeworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBWZkNvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIFZmQ29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW5pdCgpOworCQljcmVhdGVDb21wb25lbnRzKCk7CisJfQorCisJLy8gQ1JFQVRFIFJlc291cmNlCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkZDXzAxLCBzZG5jQWRtaW5EZXRhaWxzLCAiMC4xIiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRkNfMDIpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRkNfMDIsIHNkbmNBZG1pbkRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNBZG1pbkRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAyKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzQ1BfMDIsIHNkbmNBZG1pbkRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkxfMDEsIHNkbmNBZG1pbkRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc1ZMXzAyKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkxfMDIsIHNkbmNBZG1pbkRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWNyZWF0ZVZGKHJlc291cmNlRGV0YWlsc1ZGXzAyKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVZmY0luc3RhbmNlQnlEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZDXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkgLy8gREUxODk0MTkKKwlwdWJsaWMgdm9pZCBjcmVhdGVJbnN0YW5jZU9mVmZUb0l0c2VsZigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkxfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGXzAyKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX05PVF9GT1VORCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVZmY0luc3RhbmNlQnlBZG1pbigpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBzZG5jQWRtaW5EZXRhaWxzOworCQljcmVhdGVWRihyZXNvdXJjZURldGFpbHNWRl8wMSwgdXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRkNfMDEsIHVzZXIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMSwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVDcEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBDUCBpbnN0YW5jZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVWbEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBWTCBpbnN0YW5jZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkxfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZUluc3RhbmNlTmFtZUxlc3NNYXhMZWd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKCJ4eHh4WHRoaXNYc3RyaW5neGlzeDQ5WGNoYXJjYXRlcnNYbGVuZ3RoWHh4eHh4eHh4Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVJbnN0YW5jZU5hbWVFeGNlZWRNYXhMZWd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKCJ4eHh4WHRoaXNYc3RyaW5neGlzeDUxWGNoYXJjYXRlcnNYbGVuZ3RoWHh4eHh4eHh4eHgiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX0NPTVBPTkVOVF9OQU1FX0VYQ0VFRFNfTElNSVQsCisJCQkJdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZU5hbWVIYXNNYXhMZWd0aCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKCJ4eHh4WHRoaXNYc3RyaW5neGlzeDUwWGNoYXJjYXRlcnNYbGVuZ3RoWHh4eHh4eHh4eCIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlc291cmNlSW5zdGFuY2VOYW1lSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlTdHJpbmcgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyBpbnN0YW5jZU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJIm5hbWUiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLAorCQkJCShyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIjEiKS50b0xvd2VyQ2FzZSgpLCBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBOYW1lICIsIChyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIiAxIiksCisJCQkJaW5zdGFuY2VOYW1lKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlc291cmNlSW5zdGFuY2VOYW1lSXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShudWxsKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJU3RyaW5nIGluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJub3JtYWxpemVkTmFtZSIpOworCQlTdHJpbmcgaW5zdGFuY2VOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwKKwkJCQkocmVzb3VyY2VEZXRhaWxzVkZDXzAxLmdldE5hbWUoKSArICIxIikudG9Mb3dlckNhc2UoKSwgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2UgTmFtZSAiLCAocmVzb3VyY2VEZXRhaWxzVkZDXzAxLmdldE5hbWUoKSArICIgMSIpLAorCQkJCWluc3RhbmNlTmFtZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZXNvdXJjZUluc3RhbmNlTmFtZVZhbGlkYXRpb24wMSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyAyIEluc3RhbmNlcworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJub3JtYWxpemVkTmFtZSIpOworCQlTdHJpbmcgaW5zdGFuY2VOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsCisJCQkJKHJlc291cmNlRGV0YWlsc1ZGQ18wMS5nZXROYW1lKCkgKyAiMSIpLnRvTG93ZXJDYXNlKCksIGluc3RhbmNlTm9ybWFsaXplZE5hbWUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIE5hbWUgIiwgKHJlc291cmNlRGV0YWlsc1ZGQ18wMS5nZXROYW1lKCkgKyAiIDEiKSwKKwkJCQlpbnN0YW5jZU5hbWUpOworCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJaW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibm9ybWFsaXplZE5hbWUiKTsKKwkJaW5zdGFuY2VOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQljb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsCisJCQkJKHJlc291cmNlRGV0YWlsc1ZGQ18wMS5nZXROYW1lKCkgKyAiMiIpLnRvTG93ZXJDYXNlKCksIGluc3RhbmNlTm9ybWFsaXplZE5hbWUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsIChyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIiAyIiksCisJCQkJaW5zdGFuY2VOYW1lKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcmVzb3VyY2VJbnN0YW5jZU5hbWVWYWxpZGF0aW9uMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyAyIEluc3RhbmNlcworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJub3JtYWxpemVkTmFtZSIpOworCQlTdHJpbmcgaW5zdGFuY2VOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsCisJCQkJKHJlc291cmNlRGV0YWlsc1ZGQ18wMS5nZXROYW1lKCkgKyAiMSIpLnRvTG93ZXJDYXNlKCksIGluc3RhbmNlTm9ybWFsaXplZE5hbWUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIE5hbWUgIiwgKHJlc291cmNlRGV0YWlsc1ZGQ18wMS5nZXROYW1lKCkgKyAiIDEiKSwKKwkJCQlpbnN0YW5jZU5hbWUpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ1BfMDEpOworCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJaW5zdGFuY2VOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibm9ybWFsaXplZE5hbWUiKTsKKwkJaW5zdGFuY2VOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQljb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoImNoZWNrIFJlc291cmNlIEluc3RhbmNlIG5vcm1hbGl6ZWROYW1lICIsCisJCQkJKHJlc291cmNlRGV0YWlsc0NQXzAxLmdldE5hbWUoKSArICIyIikudG9Mb3dlckNhc2UoKSwgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKHJlc291cmNlRGV0YWlsc0NQXzAxLmdldE5hbWUoKSArICIgMiIpLAorCQkJCWluc3RhbmNlTmFtZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVZmY0luc3RhbmNlQnlUZXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gUmVzcG9uc2UgNDA5CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWRkNfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNUZXN0ZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDAsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlVmZjSW5zdGFuY2VfVXNlcklkSXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gbmV3IFVzZXIoKTsKKwkJc2RuY1VzZXJEZXRhaWxzLnNldFVzZXJJZCgiIik7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVWZmNJbnN0YW5jZV9Vc2VySWRJc05vbkFzZGNVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBuZXcgVXNlcigpOworCQlzZG5jVXNlckRldGFpbHMuc2V0VXNlcklkKCJidDQ1NjciKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWRkNfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAwLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUFsbEF0b21pY0luc3RhbmNlcygpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIEFkZCB0byBWRiByZXNvdXJjZSBWRkMsIENQIGFuZCBWTCBpbnN0YW5jZXMKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZMXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc0NQXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMiwgcmVzb3VyY2VEZXRhaWxzVkZDXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMywgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVEZWZmZXJlbnRWZmNJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZDXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1ZGQ18wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlRGVmZmVyZW50Q3BJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMiwgcmVzb3VyY2VEZXRhaWxzQ1BfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmZlcmVudFZMSW5zdGFuY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZMXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1ZMXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXZlcmFsSW5zdGFuY2VPZlNhbWVWRkMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZDXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1ZGQ18wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2V2ZXJhbEluc3RhbmNlT2ZTYW1lVkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkxfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMiwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNldmVyYWxJbnN0YW5jZU9mU2FtZUNQKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc0NQXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVJbnN0YW5jZU9mQ3BUb1ZmYygpIHRocm93cyBFeGNlcHRpb24geyAvLyBBZGQgdG8gQ1AgdG8gVkZDCisJCQkJCQkJCQkJCQkJCQkJLy8gKG5vdCBhbGxvd2VkKQorCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJCWNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkZDLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlSW5zdGFuY2VWZmNUb0NwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIChub3QgYWxsb3dlZCkKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUCA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ1BfMDEpOworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWRkMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNDUC5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUluc3RhbmNlVmxUb1ZmYygpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZMID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkZDLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZMLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQy5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUluc3RhbmNlVG9Ob25TdXBwb3J0ZWRDb21wb25lbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5ULAorCQkJCWNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDAsIDApOworCX0KKworCS8vICgiQ3JlYXRlIGluc3RhbmNlIHdpdGhvdXQgcG9zaXRpb24gaXMgYWxsb3dlZCIpCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVJbnN0YW5jZU9mVmxXaXRob3V0UG9zWEFuZFBvc1koKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gaW5zdGFuY2UKKwkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkb2VzCisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm90CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaGF2ZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHBvc2l0aW9uCisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldFBvc1goIiIpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCX0KKworCS8vIENyZWF0ZSBpbnN0YW5jZSB3aXRob3V0IHBvc2l0aW9uIGlzIGFsbG93ZWQiKQorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlSW5zdGFuY2VPZlZsV2l0aFBvc2l0aW9uTnVsbCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBpbnN0YW5jZQorCQkJCQkJCQkJCQkJCQkJCQkJLy8gZG9lcworCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm90CisJCQkJCQkJCQkJCQkJCQkJCQkvLyBoYXZlCisJCQkJCQkJCQkJCQkJCQkJCQkvLyBwb3NpdGlvbgorCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NYKG51bGwpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKG51bGwpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlRm9yTm9uQ2hlY2tlZE91dFZGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNoZWNrSW5SZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGXzAyLCBzZG5jQWRtaW5EZXRhaWxzLAorCQkJCSIwLjEiLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlyZXNvdXJjZURldGFpbHNWRl8wMi5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQljaGVja0luUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VWZkNoZWNrZWRPdXRCeU90aGVyVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIEFkbWluIHRyeSB0byBhZGQgUkkgdG8gVkYgd2hpY2ggaXMgY2hlY2tlZC1PdXQgQnkgRGVzaWduZXIKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWRkNfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlRm9yTm9uRXhpc3RpbmdWRigpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCAiYmxhYmxhYmxhIiwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDAsIDApOworCX0KKworCS8vIERlbGV0ZQorCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlVmZjSW5zdGFuY2VCeURlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gQ3JlYXRlIFJJCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGQ18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJCS8vIERlbGV0ZSBSZXNvdXJjZSBpbnN0YW5jZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gZGVsZXRlQXRvbWljSW5zdGFuY2VGb3JWRihjb21wSW5zdElkLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tEZWxldGVSZXNwb25zZShkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVWZmNJbnN0YW5jZUJ5QWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVkYocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHNkbmNBZG1pbkRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlyZXNvdXJjZURldGFpbHNWTF8wMSwgc2RuY0FkbWluRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMSwgMSwgMCk7CisJCS8vIERlbGV0ZSBSZXNvdXJjZSBpbnN0YW5jZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gZGVsZXRlQXRvbWljSW5zdGFuY2VGb3JWRihjb21wSW5zdElkLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jQWRtaW5EZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tEZWxldGVSZXNwb25zZShkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMSwgMCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVDcEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCVN0cmluZyBjb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQkvLyBEZWxldGUgUmVzb3VyY2UgaW5zdGFuY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yVkYoY29tcEluc3RJZCwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrRGVsZXRlUmVzcG9uc2UoZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDAsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlVmxJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZMXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgY29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJLy8gRGVsZXRlIFJlc291cmNlIGluc3RhbmNlCisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBkZWxldGVBdG9taWNJbnN0YW5jZUZvclZGKGNvbXBJbnN0SWQsIHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAwLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZU9uZVZsSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBSSS0xCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXJlc291cmNlRGV0YWlsc1ZMXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgY29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJLy8gUkktMgorCQljcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLCByZXNvdXJjZURldGFpbHNWTF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMiwgMCk7CisJCS8vIERlbGV0ZSBSZXNvdXJjZSBpbnN0YW5jZSBSSS0xCisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBkZWxldGVBdG9taWNJbnN0YW5jZUZvclZGKGNvbXBJbnN0SWQsIHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVZmY0luc3RhbmNlQ2hlY2tlZEJ5T3RoZXJVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJLy8gRGVsZXRlIFJlc291cmNlIGluc3RhbmNlCisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZG5jVGVzdGVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUluc3RhbmNlTm9uU3VwcG9ydGVkQ29tcG9uZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX0lOU1RBTkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCwKKwkJCQlkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUluc3RhbmNlRnJvbU5vblZGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFJJLTEKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UxID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZTEsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJLy8gUkktMgorCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZUNwbFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZUNwbFJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlMiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAyLCAwKTsKKwkJLy8gRGVsZXRlIFZMIGluc3RhbmNlIGZyb20gQ1AgaW5zdGFuY2UKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlSW5zdGFuY2VDcGxSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVOb25FeGlzdGluZ0luc3RhbmNlRnJvbVZGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VWbFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VWbFJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlMSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UxLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscy5zZXRVbmlxdWVJZCgiMTIzNDU2Nzg5MCIpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUNwSW5zdGFuY2VGcm9tTm9uQ2hlY2tPdXRWRigpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlQ3BSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlQ3BSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZTEgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlMSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQkiMC4xIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMi5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJLy8gRGVsZXRlIFJlc291cmNlIGluc3RhbmNlCisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZUluc3RhbmNlQ3BSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVWbEluc3RhbmNlRnJvbU5vbkNoZWNrT3V0VkYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UxID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZTEsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlSZXN0UmVzcG9uc2UgY2hlY2tJblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJIjAuMSIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWNoZWNrSW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDIuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCS8vIERlbGV0ZSBSZXNvdXJjZSBpbnN0YW5jZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlVmZjSW5zdGFuY2VGcm9tTm9uQ2hlY2tPdXRWRigpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlVmZjUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VWZmNSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZTEgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlMSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJCVJlc3RSZXNwb25zZSBjaGVja0luUmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQkiMC4xIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJY2hlY2tJblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMi5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJLy8gRGVsZXRlIFJlc291cmNlIGluc3RhbmNlCisJCVJlc3RSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZUluc3RhbmNlVmZjUmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCWRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlVmxJbnN0YW5jZV9Vc2VySWRJc05vbkFzZGNVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJLy8gRGVsZXRlIFJlc291cmNlIGluc3RhbmNlIGJ5IG5vbi1BU0RDIFVzZXIKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBuZXcgVXNlcigpOworCQlzZG5jVXNlckRldGFpbHMuc2V0VXNlcklkKCJidDQ1NjciKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNkbmNVc2VyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZUFscmVhZHlEZWxldGVkSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9ERUxFVEUsCisJCQkJZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlkZWxldGVDb21wSW5zdFJlcUNhcEZyb21FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDAsIDApOworCQlkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kZWxldGVDb21wb25lbnRJbnN0YW5jZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlQ3JlYXRlRGVsZXRlZEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gMiBJbnN0YW5jZXMKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWRkNfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCVN0cmluZyBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibmFtZSIpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLAorCQkJCShyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIjEiKS50b0xvd2VyQ2FzZSgpLCBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBOYW1lICIsIChyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIiAxIiksCisJCQkJaW5zdGFuY2VOYW1lKTsKKwkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCWluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJIm5vcm1hbGl6ZWROYW1lIik7CisJCWluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgIm5hbWUiKTsKKwkJY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLAorCQkJCShyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIjIiKS50b0xvd2VyQ2FzZSgpLCBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLCAocmVzb3VyY2VEZXRhaWxzVkZDXzAxLmdldE5hbWUoKSArICIgMiIpLAorCQkJCWluc3RhbmNlTmFtZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAyLCAwKTsKKwkJLy8gRGVsZXRlIG9uZSBpbnN0YW5jZQorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9ERUxFVEUsCisJCQkJZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlkZWxldGVDb21wSW5zdFJlcUNhcEZyb21FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gQ3JlYXRlIHNhbWUgaW5zdGFuY2UgYWdhaW4KKwkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCWluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJIm5vcm1hbGl6ZWROYW1lIik7CisJCWluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgIm5hbWUiKTsKKwkJY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLAorCQkJCShyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIjMiKS50b0xvd2VyQ2FzZSgpLCBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBOYW1lICIsIChyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIiAzIiksCisJCQkJaW5zdGFuY2VOYW1lKTsKKworCX0KKworCS8vIFVwZGF0ZQorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlVmZjSW5zdGFuY2VOYW1lQnlEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKCJhYmNkIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKHJlc291cmNlTmFtZUZyb21Kc29uUmVzcG9uc2UsIHZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCVN0cmluZyByaU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJub3JtYWxpemVkTmFtZSIpOworCQlTdHJpbmcgcmlOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGlmIFJJIG5vcm1hbGl6ZWROYW1lIGlzIGNvcnJlY3QgIiwgcmlOb3JtYWxpemVkTmFtZSwgImFiY2QiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayBpZiBSSSBub3JtYWxpemVkTmFtZSBpcyBjb3JyZWN0ICIsIHJpTmFtZSwgImFiY2QiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVZmY0luc3RhbmNlTmFtZUJ5QWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciB1c2VyID0gc2RuY0FkbWluRGV0YWlsczsKKwkJY3JlYXRlVkYocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHVzZXIpOworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0FkbWluRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAxLCAxLCAwKTsKKwkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZSgiQUJDRCBFIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0FkbWluRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKHJlc291cmNlTmFtZUZyb21Kc29uUmVzcG9uc2UsIHZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCVN0cmluZyByaU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJub3JtYWxpemVkTmFtZSIpOworCQlTdHJpbmcgcmlOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGlmIFJJIG5vcm1hbGl6ZWROYW1lIGlzIGNvcnJlY3QgIiwgcmlOb3JtYWxpemVkTmFtZSwgImFiY2RlIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgaWYgUkkgbm9ybWFsaXplZE5hbWUgaXMgY29ycmVjdCAiLCByaU5hbWUsICJBQkNEIEUiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZUluc3RhbmNlTmFtZUFsbG93ZWRDaGFyYWN0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFsbG93ZWQgY2hhcmFjdGVyczogQWxwaGFudW1lcmljIChhLXpBLVowLTkpLCBzcGFjZSAoJyAnKSwgdW5kZXJzY29yZQorCQkvLyAoJ18nKSwgZGFzaCAoJy0nKSwgZG90ICgnLicpKQorCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKCJBYmNkXzEyMzQ1Njc4OTAtcXdlcnQteXVpb3AuenhjdmIiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCVN0cmluZyByZXNvdXJjZU5hbWVGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0TmFtZUZyb21SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMocmVzb3VyY2VOYW1lRnJvbUpzb25SZXNwb25zZSwgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJU3RyaW5nIHJpTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyByaU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJuYW1lIik7CisJCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgaWYgUkkgbm9ybWFsaXplZE5hbWUgaXMgY29ycmVjdCAiLAorCQkvLyByaU5vcm1hbGl6ZWROYW1lLCAiYWJjZF8xMjM0NTY3ODkwLXF3ZXJ0LXl1aW9wLnp4Y3YiICk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgaWYgUkkgbm9ybWFsaXplZE5hbWUgaXMgY29ycmVjdCAiLCByaU5hbWUsICJBYmNkXzEyMzQ1Njc4OTAtcXdlcnQteXVpb3AuenhjdmIiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayBpZiBSSSBub3JtYWxpemVkTmFtZSBpcyBjb3JyZWN0ICIsIHJpTm9ybWFsaXplZE5hbWUsCisJCQkJImFiY2QxMjM0NTY3ODkwcXdlcnR5dWlvcHp4Y3ZiIik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVZmY0luc3RhbmNlTmFtZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHNlZSBVUzUzNDY2MyBJbiBjYXNlIGEgZGVzaWduZXIgcmVtb3ZlcyB0aGUgY3VycmVudCByZXNvdXJjZSBpbnN0YW5jZQorCQkvLyBuYW1lIHRoZW4gQkUgaGFzIHRvIGdlbmVyYXRlIGFnYWluIHRoZSAiZGVmYXVsdCIgcmVzb3VyY2UgaW5zdGFuY2UKKwkJLy8gbmFtZQorCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgbmV3TmFtZSA9ICIiOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKG5ld05hbWUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIGluc3RhbmNlTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJub3JtYWxpemVkTmFtZSIpOworCQlTdHJpbmcgaW5zdGFuY2VOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJuYW1lIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwKKwkJCQkocmVzb3VyY2VEZXRhaWxzVkZDXzAxLmdldE5hbWUoKSArICIyIikudG9Mb3dlckNhc2UoKSwgaW5zdGFuY2VOb3JtYWxpemVkTmFtZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiY2hlY2sgUmVzb3VyY2UgSW5zdGFuY2Ugbm9ybWFsaXplZE5hbWUgIiwgKHJlc291cmNlRGV0YWlsc1ZGQ18wMS5nZXROYW1lKCkgKyAiIDIiKSwKKwkJCQlpbnN0YW5jZU5hbWUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlVmZjSW5zdGFuY2VOYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBzZWUgVVM1MzQ2NjMgSW4gY2FzZSBhIGRlc2lnbmVyIHJlbW92ZXMgdGhlIGN1cnJlbnQgcmVzb3VyY2UgaW5zdGFuY2UKKwkJLy8gbmFtZSB0aGVuIEJFIGhhcyB0byBnZW5lcmF0ZSBhZ2FpbiB0aGUgImRlZmF1bHQiIHJlc291cmNlIGluc3RhbmNlCisJCS8vIG5hbWUKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJU3RyaW5nIG5ld05hbWUgPSBudWxsOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKG5ld05hbWUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJZmluYWwgU3RyaW5nIHVwZGF0ZVJlc3BvbnNlID0gdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisJCVN0cmluZyBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc3BvbnNlLCAibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIGluc3RhbmNlTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNwb25zZSwgIm5hbWUiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLAorCQkJCShyZXNvdXJjZURldGFpbHNWRkNfMDEuZ2V0TmFtZSgpICsgIjIiKS50b0xvd2VyQ2FzZSgpLCBpbnN0YW5jZU5vcm1hbGl6ZWROYW1lKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJjaGVjayBSZXNvdXJjZSBJbnN0YW5jZSBub3JtYWxpemVkTmFtZSAiLCAocmVzb3VyY2VEZXRhaWxzVkZDXzAxLmdldE5hbWUoKSArICIgMiIpLAorCQkJCWluc3RhbmNlTmFtZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVDcEluc3RhbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzQ1BfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUoIkFiY0QiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCVN0cmluZyByZXNvdXJjZU5hbWVGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0TmFtZUZyb21SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMocmVzb3VyY2VOYW1lRnJvbUpzb25SZXNwb25zZSwgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJU3RyaW5nIHJpTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyByaU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJuYW1lIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgaWYgUkkgbm9ybWFsaXplZE5hbWUgaXMgY29ycmVjdCAiLCByaU5vcm1hbGl6ZWROYW1lLCAiYWJjZCIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGlmIFJJIG5vcm1hbGl6ZWROYW1lIGlzIGNvcnJlY3QgIiwgcmlOYW1lLCAiQWJjRCIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlVmxJbnN0YW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKCJBQkNEIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgcmVzb3VyY2VOYW1lRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldE5hbWVGcm9tUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKHJlc291cmNlTmFtZUZyb21Kc29uUmVzcG9uc2UsIHZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLmdldE5hbWUoKSk7CisJCVN0cmluZyByaU5vcm1hbGl6ZWROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCSJub3JtYWxpemVkTmFtZSIpOworCQlTdHJpbmcgcmlOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGlmIFJJIG5vcm1hbGl6ZWROYW1lIGlzIGNvcnJlY3QgIiwgcmlOb3JtYWxpemVkTmFtZSwgImFiY2QiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayBpZiBSSSBub3JtYWxpemVkTmFtZSBpcyBjb3JyZWN0ICIsIHJpTmFtZSwgIkFCQ0QiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZUluc3RhbmNlTmFtZVRvQXJsZWFkeUV4aXN0SW5zdGFuY2VOYW1lMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBDcmVhdGUgVkZDIGluc3RhbmNlCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSB2ZmNDb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQodmZjQ29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJLy8gQ3JlYXRlIENQIGluc3RhbmNlCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjcFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCWNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCWNwUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNwQ29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNwQ29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDIsIDApOworCQljcFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUodmZjQ29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCWNwUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMsCisJCQkJdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlSW5zdGFuY2VOYW1lTWF4TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWRkNfMDEpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCWFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhyZXNvdXJjZURldGFpbHNWRl8wMiwgMSwgMCk7CisJCVN0cmluZyBuZXdOYW1lID0gIlF3ZXJ0eXVpb3AxMjM0NTY3ODkwYXNkZkFoamtsenhjdmJubWFzZGZnaGprbDEyMzQ1IjsKKwkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShuZXdOYW1lKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCVN0cmluZyByZXNvdXJjZU5hbWVGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0TmFtZUZyb21SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMocmVzb3VyY2VOYW1lRnJvbUpzb25SZXNwb25zZSwgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJU3RyaW5nIHJpTm9ybWFsaXplZE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJIm5vcm1hbGl6ZWROYW1lIik7CisJCVN0cmluZyByaU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJuYW1lIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgaWYgUkkgbm9ybWFsaXplZE5hbWUgaXMgY29ycmVjdCAiLCByaU5vcm1hbGl6ZWROYW1lLCBuZXdOYW1lLnRvTG93ZXJDYXNlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGlmIFJJIG5vcm1hbGl6ZWROYW1lIGlzIGNvcnJlY3QgIiwgcmlOYW1lLCBuZXdOYW1lKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZUluc3RhbmNlTmFtZUV4Y2VlZE1heExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgbmV3TmFtZSA9ICJRd2VydHl1aW9wMTIzNDU2Nzg5MGFzZGZBaGprbHp4Y3Zibm1hc2RmZ2hqa2wxMjM0NTYiOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKG5ld05hbWUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVCwKKwkJCQl1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZUNwSW5zdGFuY2VDaGVja2VkQnlPdGhlclVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgbmV3TmFtZSA9ICJRd2VydHl1aW9wMTIzNDU2Nzg5MCI7CisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmV3TmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0FkbWluRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQl1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIFVwZGF0ZVZmY0luc3RhbmNlX1VzZXJJZElzTm9uQXNkY1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgbmV3TmFtZSA9ICJRd2VydHl1aW9wMTIzNDU2Nzg5MCI7CisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmV3TmFtZSk7CisJCVVzZXIgbm9uU2RuY1VzZXJEZXRhaWxzID0gbmV3IFVzZXIoKTsKKwkJbm9uU2RuY1VzZXJEZXRhaWxzLnNldFVzZXJJZCgiYnQ0NTY3Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgbm9uU2RuY1VzZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OLAorCQkJCXVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgVXBkYXRlUmVzb3VyY2VJbnN0YW5jZUZvcm1Ob25FeGlzdGluZ1ZGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCS8vIExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZMXzAxLAorCQkvLyBzZG5jQWRtaW5EZXRhaWxzLCAiMC4xIiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgbmV3TmFtZSA9ICJRd2VydHl1aW9wMTIzNDU2Nzg5MCI7CisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobmV3TmFtZSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgImJsYWJsYWJsYSIsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQl1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVOb25FeGlzdGluZ0luc3RhbmNlRnJvbVZGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VWbFJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VWbFJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlMSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UxLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscy5zZXRVbmlxdWVJZCgiMTIzNDU2Nzg5MCIpOworCQkvLyBTdHJpbmcgbmV3TmFtZT0gIlF3ZXJ0eXVpb3AxMjM0NTY3ODkwIjsKKwkJLy8gcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscy5zZXROYW1lKG5ld05hbWUpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJcmVzb3VyY2VJbnN0YW5jZVZsUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCS8vIFVwZGF0ZQorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlVmZjSW5zdGFuY2VOYW1lQXNWZk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKGNvbXBvbmVudEluc3RhbmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHJlc291cmNlRGV0YWlsc1ZGXzAyLCAxLCAwKTsKKwkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZShyZXNvdXJjZURldGFpbHNWRl8wMi5nZXROYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIHJlc291cmNlTmFtZUZyb21Kc29uUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhyZXNvdXJjZU5hbWVGcm9tSnNvblJlc3BvbnNlLCB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlTdHJpbmcgcmlOb3JtYWxpemVkTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkibm9ybWFsaXplZE5hbWUiKTsKKwkJU3RyaW5nIHJpTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgIm5hbWUiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayBpZiBSSSBub3JtYWxpemVkTmFtZSBpcyBjb3JyZWN0ICIsIHJpTm9ybWFsaXplZE5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGlmIFJJIG5vcm1hbGl6ZWROYW1lIGlzIGNvcnJlY3QgIiwgcmlOYW1lLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXROYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlSW5zdGFuY2VOYW1lSW52YWxpZENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhciBpbnZhbGlkQ2hhcnNbXSA9IHsgJ34nLCAnIScsICckJywgJyUnLCAnXicsICcqJywgJygnLCAnKScsICciJywgJ3snLCAnfScsICdbJywgJ10nLCAnPycsICc+JywgJzwnLCAnLycsCisJCQkJJ3wnLCAnXFwnLCAnLCcgfTsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIG5ld05hbWUgPSAiQWJjZDEiOworCQlTdHJpbmcgdXBkYXRlTmFtZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkQ2hhcnMubGVuZ3RoOyBpKyspIHsKKwkJCXVwZGF0ZU5hbWUgPSBuZXdOYW1lICsgaW52YWxpZENoYXJzW2ldOworCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0TmFtZSh1cGRhdGVOYW1lKTsKKwkJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQsCisJCQkJCXVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJfQorCX0KKworCS8vIFVwZGF0ZSBQb3NpdGlvbgorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlVmZjSW5zdGFuY2VQb3NpdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgdXBkYXRlUG9zWCA9ICIxMzAiOworCQlTdHJpbmcgdXBkYXRlUG9zWSA9ICIxODAiOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NYKHVwZGF0ZVBvc1gpOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKHVwZGF0ZVBvc1kpOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKG51bGwpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIHBvc1hGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAicG9zWCIpOworCQlTdHJpbmcgcG9zWUZyb21Kc29uUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJwb3NZIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhwb3NYRnJvbUpzb25SZXNwb25zZSwgdXBkYXRlUG9zWCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhwb3NZRnJvbUpzb25SZXNwb25zZSwgdXBkYXRlUG9zWSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWbEluc3RhbmNlUG9zaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc1ZMXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgdXBkYXRlUG9zWCA9ICIxMzAiOworCQlTdHJpbmcgdXBkYXRlUG9zWSA9ICIxODAiOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NYKHVwZGF0ZVBvc1gpOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKHVwZGF0ZVBvc1kpOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKG51bGwpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIHBvc1hGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAicG9zWCIpOworCQlTdHJpbmcgcG9zWUZyb21Kc29uUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJwb3NZIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhwb3NYRnJvbUpzb25SZXNwb25zZSwgdXBkYXRlUG9zWCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhwb3NZRnJvbUpzb25SZXNwb25zZSwgdXBkYXRlUG9zWSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVDcEluc3RhbmNlUG9zaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgdXBkYXRlUG9zWCA9ICIxMzAiOworCQlTdHJpbmcgdXBkYXRlUG9zWSA9ICIxODAiOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NYKHVwZGF0ZVBvc1gpOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKHVwZGF0ZVBvc1kpOworCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXROYW1lKG51bGwpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3ModXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwkJU3RyaW5nIHBvc1hGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAicG9zWCIpOworCQlTdHJpbmcgcG9zWUZyb21Kc29uUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJwb3NZIik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhwb3NYRnJvbUpzb25SZXNwb25zZSwgdXBkYXRlUG9zWCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhwb3NZRnJvbUpzb25SZXNwb25zZSwgdXBkYXRlUG9zWSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVJbnN0YW5jZVBvc2l0aW9uTmVnYXRpdmVQb3NpdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjcFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQljcFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMocmVzb3VyY2VEZXRhaWxzVkZfMDIsIDEsIDApOworCQlTdHJpbmcgdXBkYXRlUG9zWCA9ICItMTAwIjsKKwkJU3RyaW5nIHVwZGF0ZVBvc1kgPSAiLTEwMCI7CisJCWNwUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWCh1cGRhdGVQb3NYKTsKKwkJY3BSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKHVwZGF0ZVBvc1kpOworCQljcFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobnVsbCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQljcFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRl8wMi5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCVN0cmluZyBwb3NYRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgInBvc1giKTsKKwkJU3RyaW5nIHBvc1lGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAicG9zWSIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMocG9zWEZyb21Kc29uUmVzcG9uc2UsIHVwZGF0ZVBvc1gpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMocG9zWUZyb21Kc29uUmVzcG9uc2UsIHVwZGF0ZVBvc1kpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlSW5zdGFuY2VzUG9zaXRpb25TYW1lTG9jYXRpb25Gb3JCb3RoSW5zdGFuY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIGNwUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCWNwUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyB2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJdmZjUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCVN0cmluZyB1cGRhdGVQb3NYID0gIjEwMCI7CisJCVN0cmluZyB1cGRhdGVQb3NZID0gIjUwMCI7CisJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldFBvc1godXBkYXRlUG9zWCk7CisJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldFBvc1kodXBkYXRlUG9zWSk7CisJCXZmY1Jlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobnVsbCk7CisJCWNwUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0UG9zWCh1cGRhdGVQb3NYKTsKKwkJY3BSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRQb3NZKHVwZGF0ZVBvc1kpOworCQljcFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLnNldE5hbWUobnVsbCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQl2ZmNSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlTdHJpbmcgcG9zWEZyb21Kc29uUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJwb3NYIik7CisJCVN0cmluZyBwb3NZRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgInBvc1kiKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKHBvc1hGcm9tSnNvblJlc3BvbnNlLCB1cGRhdGVQb3NYKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKHBvc1lGcm9tSnNvblJlc3BvbnNlLCB1cGRhdGVQb3NZKTsKKwkJdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJY3BSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UpOworCQlwb3NYRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWCIpOworCQlwb3NZRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkicG9zWSIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMocG9zWEZyb21Kc29uUmVzcG9uc2UsIHVwZGF0ZVBvc1gpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMocG9zWUZyb21Kc29uUmVzcG9uc2UsIHVwZGF0ZVBvc1kpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlQWxsQXRvbWljSW5zdGFuY2VzVGVzdEdldFJlcUNhcEFQSV9zdWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBBZGQgdG8gVkYgcmVzb3VyY2UgVkZDLCBDUCBhbmQgVkwgaW5zdGFuY2VzCisJCVJlc3RSZXNwb25zZSBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlyZXNvdXJjZURldGFpbHNWTF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1ZGQ18wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKworCQlnZXRWZlJlc291cmNlUmVxQ2FwVXNpbmdBUEkoMywgMCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisKKwl9CisKKwkvLyBFTkQgb2YgVXBkYXRlCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUFsbEF0b21pY0luc3RhbmNlc1Rlc3RHZXRSZXFDYXBBUElmYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBBZGQgdG8gVkYgcmVzb3VyY2UgVkZDLCBDUCBhbmQgVkwgaW5zdGFuY2VzCisJCVJlc3RSZXNwb25zZSBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlyZXNvdXJjZURldGFpbHNWTF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGKHJlc291cmNlRGV0YWlsc1ZGXzAyLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1ZGQ18wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDIuc2V0VW5pcXVlSWQoImR1bW15Iik7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNBZG1pbkRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZfMDIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfTk9UX0ZPVU5ELAorCQkJCWdldFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZUluVkYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzUmVxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJTb2Z0Q29tcFJvdXRlciIsCisJCQkJTm9ybWF0aXZlVHlwZXNFbnVtLlNPRlRXQVJFX0NPTVBPTkVOVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX1JPVVRFUlMsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwgUmVzb3VyY2VUeXBlRW51bS5WRkMpOyAvLyByZXNvdXJjZVR5cGUKKwkJCQkJCQkJCQkJCQkJCQkJCS8vID0gVkZDCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNDYXAgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoIk15Q29tcHV0IiwKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uQ09NUFVURSwgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX1JPVVRFUlMsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJUmVzb3VyY2VUeXBlRW51bS5WRkMpOyAvLyByZXNvdXJjZVR5cGUgPSBWRkMKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzUmVxKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzUmVxLCBzZG5jQWRtaW5EZXRhaWxzLCAiMC4xIiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNDYXApOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNDYXAsIHNkbmNBZG1pbkRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisKKwkJUmVzdFJlc3BvbnNlIHJpUmVxUiA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1JlcSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UocmlSZXFSKTsKKwkJUmVzdFJlc3BvbnNlIHJpQ2FwUiA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc0NhcCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UocmlDYXBSKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSByaVJlcSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmlSZXFSLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KHJpQ2FwUi5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRl8wMik7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3QgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJcmVxdWlyZW1lbnREZWYuc2V0RnJvbU5vZGUocmlSZXEuZ2V0VW5pcXVlSWQoKSk7CisJCXJlcXVpcmVtZW50RGVmLnNldFRvTm9kZShyaUNhcC5nZXRVbmlxdWVJZCgpKTsKKworCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcGFpciA9IG5ldyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIoKTsKKwkJcGFpci5zZXRSZXF1aXJlbWVudE93bmVySWQocmlSZXEuZ2V0VW5pcXVlSWQoKSk7CisJCXBhaXIuc2V0Q2FwYWJpbGl0eU93bmVySWQocmlDYXAuZ2V0VW5pcXVlSWQoKSk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnQoImhvc3QiKTsKKwkJUmVsYXRpb25zaGlwSW1wbCByZWxhdGlvbnNoaXAgPSBuZXcgUmVsYXRpb25zaGlwSW1wbCgpOworCQlyZWxhdGlvbnNoaXAuc2V0VHlwZSgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlwYWlyLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwKTsKKwkJcGFpci5zZXRDYXBhYmlsaXR5VWlkKGNhcExpc3QuZ2V0KDApLmdldFVuaXF1ZUlkKCkpOworCQlwYWlyLnNldFJlcXVpcmVtZW50VWlkKHJlcUxpc3QuZ2V0KDApLmdldFVuaXF1ZUlkKCkpOworCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25zaGlwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlyZWxhdGlvbnNoaXBzLmFkZChwYWlyKTsKKwkJcmVxdWlyZW1lbnREZWYuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRl8wMik7CisJCWNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBsaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgbnVsbCwgbGlzdCk7CisKKwkJUmVzdFJlc3BvbnNlIGRpc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kaXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZfMDIpOworCQljYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKworCQlsaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgMSwgbGlzdC5zaXplKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VW5zYXRpc2ZpZWRDcFJlcUluVkYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBDZXJ0aWZ5IGFsbCB0aGUgbmVlZGVkIGF0b21pYyByZXNvdXJjZXMKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRkNfMDIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzcG9uc2UpOworCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzQ1BfMDEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzcG9uc2UpOworCisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCXJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzcG9uc2UpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCVN0cmluZyBjb21wSW5zdE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgY3BDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisKKwkJUmVzdFJlc3BvbnNlIHN1Ym1pdEZvclRlc3RpbmcgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJU3RyaW5nW10gdmFyaWFibGVzID0gbmV3IFN0cmluZ1tdIHsgcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0TmFtZSgpLCAiVkYiLCAiQ1AgKENvbm5lY3Rpb24gUG9pbnQpIiwgY29tcEluc3ROYW1lLAorCQkJCSJyZXF1aXJlbWVudCIsICJ0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZSIsICJmdWxmaWxsZWQiIH07CisJCUJhc2VWYWxpZGF0aW9uVXRpbHMuY2hlY2tFcnJvclJlc3BvbnNlKHN1Ym1pdEZvclRlc3RpbmcsCisJCQkJQWN0aW9uU3RhdHVzLlJFUV9DQVBfTk9UX1NBVElTRklFRF9CRUZPUkVfQ0VSVElGSUNBVElPTiwgdmFyaWFibGVzKTsKKworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRihyZXNvdXJjZURldGFpbHNWRl8wMiwgcmVzb3VyY2VEZXRhaWxzVkZDXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgY29tcHV0ZUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJZnVsZmlsbENwUmVxdWlyZW1lbnQocmVzb3VyY2VEZXRhaWxzVkZfMDIsIGNwQ29tcEluc3RJZCwgY29tcHV0ZUNvbXBJbnN0SWQsIGNvbXB1dGVDb21wSW5zdElkLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKworCQlzdWJtaXRGb3JUZXN0aW5nID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCUJhc2VWYWxpZGF0aW9uVXRpbHMuY2hlY2tTdWNjZXNzKHN1Ym1pdEZvclRlc3RpbmcpOworCX0KKworCXByaXZhdGUgdm9pZCBnZXRWZlJlc291cmNlUmVxQ2FwVXNpbmdBUEkoaW50IG51bWJlck9mUklzLCBpbnQgbnVtYmVyT2ZSZWxhdGlvbnMsIFVzZXIgdXNlcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0FkbWluRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRl8wMik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWdldFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIFJlc291cmNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzcChnZXRSZXNvdXJjZVJlc3BvbnNlLAorCQkvLyByZXNvdXJjZVJlc3BKYXZhT2JqZWN0KTsKKwkJLy8gaW50IG51bWJlck9mQWN0dWFsUklzID0gcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkhPW51bGwgPworCQkvLyByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkgOiAwOworCQkvLyBpbnQgbnVtYmVyT2ZBY3R1YWxSZWxhdGlvbnMgPQorCQkvLyByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKSE9bnVsbCA/CisJCS8vIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpLnNpemUoKSA6IDA7CisJCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgbnVtYmVyIG9mIFJJcyBtZWV0IHRoZSBleHBlY3RlZCBudW1iZXIiLAorCQkvLyBudW1iZXJPZlJJcyAsbnVtYmVyT2ZBY3R1YWxSSXMpOworCQkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIG51bWJlciBvZiBSSSByZWxhdGlvbnMgbWVldCB0aGUgZXhwZWN0ZWQgbnVtYmVyIiwKKwkJLy8gbnVtYmVyT2ZSZWxhdGlvbnMgLG51bWJlck9mQWN0dWFsUmVsYXRpb25zKTsKKworCQkvLy8vIGdldCBWRiBhY3R1YWwgQ2FwYWJpbGl0aWVzIGFuZCBSZXF1aXJlbWVudHMgYW5kIHZhbGlkYXRlIGFjY29yZGluZworCQkvLy8vIHRvIGV4cGVjdGVkCisJCVJlc291cmNlIHZmUmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc291cmNlLmNsYXNzKTsKKwkJdmVyaWZ5UmVxQ2FwKHZmUmVzb3VyY2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NlcnZpY2UvQ2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXR1c0FwaVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NlcnZpY2UvQ2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXR1c0FwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGEyMGNmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9DaGFuZ2VTZXJ2aWNlRGlzdHJpYnV0aW9uU3RhdHVzQXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRpc3RyaWJ1dGlvblN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlNlcnZpY2VWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXR1c0FwaVRlc3QgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jQWRtaW5EZXRhaWxzOworCXByb3RlY3RlZCBVc2VyIHNkbmNHb3Zlcm5vckRlYXRhaWxzOworCXByb3RlY3RlZCBVc2VyIHNkbmNUZXN0ZXJEZXRhaWxzOworCXByb3RlY3RlZCBVc2VyIHNkbmNPcHNEZXRhaWxzOworCXByb3RlY3RlZCBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHM7CisJcHJvdGVjdGVkIENvbXBvbmVudCByZXNvdXJjZURldGFpbHNWRkNjb21wOworCXByb3RlY3RlZCBDb21wb25lbnQgc2VydmljZURldGFpbHNDb21wcDsKKworCXByaXZhdGUgU3RyaW5nIHVzZXJSZW1hcmtzID0gImNvbW1lbnRUZXN0IjsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhcmlhYmxlc0FzTGlzdDsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgQ2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXR1c0FwaVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIobmFtZSwgQ2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXR1c0FwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJdmFyaWFibGVzQXNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXNkbmNEZXNpZ25lckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzZG5jQWRtaW5EZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJc2RuY0dvdmVybm9yRGVhdGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uR09WRVJOT1IpOworCQlzZG5jVGVzdGVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlzZG5jT3BzRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5PUFMpOworCQlyZXNvdXJjZURldGFpbHNWRkNjb21wID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVCwgcmVzb3VyY2VEZXRhaWxzVkZDY29tcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUsIHRydWUpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCQlTZXJ2aWNlIHNlcnZpY2VTZXJ2ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZURldGFpbHNWRkNjb21wLCBzZXJ2aWNlU2VydiwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCisJCXNlcnZpY2VEZXRhaWxzID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKHNlcnZpY2VTZXJ2KTsKKworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVCBFIFMgVAorCS8vIFMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFwcHJvdmVOb3RDZXJ0aWZpZWRTZXJ2aWNlX2NoZWNrb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQsIHNkbmNBZG1pbkRldGFpbHMsIDQwMywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKworCQl2YXJpYWJsZXNBc0xpc3QgPSBBcnJheXMuYXNMaXN0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTi5uYW1lKCksCisJCQkJdmFyaWFibGVzQXNMaXN0LCBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUuZ2V0UmVzcG9uc2UoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCk7CisKKwkJdmFsaWRhdGVBdWRpdCgiREFwcHJvdmUiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwKKwkJCQkiNDAzIiwgQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFwcHJvdmVOb3RDZXJ0aWZpZWRTZXJ2aWNlX2NoZWNrZWRpbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2hlY2tpblJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKDIwMCwgY2hlY2tpblJlc3AuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCwgc2RuY0FkbWluRGV0YWlscywgNDAzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCisJCXZhcmlhYmxlc0FzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLm5hbWUoKSwKKwkJCQl2YXJpYWJsZXNBc0xpc3QsIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEQXBwcm92ZSIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsCisJCQkJIjQwMyIsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTiwgc2RuY0FkbWluRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhcHByb3ZlTm90Q2VydGlmaWVkU2VydmljZV9pblByb2dyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjZXJ0UmVxUmVzcCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKDIwMCwgY2VydFJlcVJlc3AuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCwgc2RuY0FkbWluRGV0YWlscywgNDAzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCisJCXZhcmlhYmxlc0FzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLm5hbWUoKSwKKwkJCQl2YXJpYWJsZXNBc0xpc3QsIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQkvLyBFcnJvckluZm8gZXJyb3JJbmZvID0KKwkJLy8gdXRpbHMucGFyc2VZYW1sKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTi5uYW1lKCkpOworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkRBcHByb3ZlIjsKKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsCisJCS8vIHZlcnNpb24sIHNkbmNBZG1pbkRldGFpbHMpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJTZXJ2aWNlIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTi5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERwcmV2U3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldENvbW1lbnQodXNlclJlbWFya3MpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiNDAzIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhTdHJpbmcuZm9ybWF0KGVycm9ySW5mby5nZXRNZXNzYWdlSWQoKQorCQkvLyArICI6ICIgKyBlcnJvckluZm8uZ2V0TWVzc2FnZSgpLCB2ZXJzaW9uLAorCQkvLyBzZXJ2aWNlRGV0YWlscy5nZXRTZXJ2aWNlTmFtZSgpKSk7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJCXZhbGlkYXRlQXVkaXQoIkRBcHByb3ZlIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OLAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELAorCQkJCSI0MDMiLCBBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfQVZBSUxBQkxFX0ZPUl9ESVNUUklCVVRJT04sIHNkbmNBZG1pbkRldGFpbHMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhcHByb3ZlTm90Q2VydGlmaWVkU2VydmljZV9yZWFkeUZvckNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlhcHByb3ZlTm90Q2VydGlmaWVkU2VydmljZV9pblByb2dyZXNzKCk7CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKworCQlSZXN0UmVzcG9uc2Ugc3RhcnRDZXJ0UmVzcCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscygyMDAsIHN0YXJ0Q2VydFJlc3AuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCwgc2RuY0FkbWluRGV0YWlscywgNDAzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCisJCXZhcmlhYmxlc0FzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLm5hbWUoKSwKKwkJCQl2YXJpYWJsZXNBc0xpc3QsIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQkvLyBFcnJvckluZm8gZXJyb3JJbmZvID0KKwkJLy8gdXRpbHMucGFyc2VZYW1sKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTi5uYW1lKCkpOworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkRBcHByb3ZlIjsKKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsCisJCS8vIHZlcnNpb24sIHNkbmNBZG1pbkRldGFpbHMpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJTZXJ2aWNlIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTLm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREcHJldlN0YXR1cygiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGN1cnJTdGF0dXMoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCI0MDMiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKFN0cmluZy5mb3JtYXQoZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpCisJCS8vICsgIjogIiArIGVycm9ySW5mby5nZXRNZXNzYWdlKCksIHZlcnNpb24sCisJCS8vIHNlcnZpY2VEZXRhaWxzLmdldFNlcnZpY2VOYW1lKCkpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiMC4xIik7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJCXZhbGlkYXRlQXVkaXQoIkRBcHByb3ZlIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsCisJCQkJIjQwMyIsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTiwgc2RuY0FkbWluRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWplY3ROb3RDZXJ0aWZpZWRTZXJ2aWNlX2NoZWNrZW91dCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELCBzZG5jQWRtaW5EZXRhaWxzLCA0MDMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisKKwkJdmFyaWFibGVzQXNMaXN0ID0gQXJyYXlzLmFzTGlzdChzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfQVZBSUxBQkxFX0ZPUl9ESVNUUklCVVRJT04ubmFtZSgpLAorCQkJCXZhcmlhYmxlc0FzTGlzdCwgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLmdldFJlc3BvbnNlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShnZXRTZXJ2aWNlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQpOworCisJCS8vIEVycm9ySW5mbyBlcnJvckluZm8gPQorCQkvLyB1dGlscy5wYXJzZVlhbWwoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLm5hbWUoKSk7CisJCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iRFJlamVjdCI7CisJCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLAorCQkvLyB2ZXJzaW9uLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiU2VydmljZSIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RHByZXZTdGF0dXMoIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldENvbW1lbnQodXNlclJlbWFya3MpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiNDAzIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhTdHJpbmcuZm9ybWF0KGVycm9ySW5mby5nZXRNZXNzYWdlSWQoKQorCQkvLyArICI6ICIgKyBlcnJvckluZm8uZ2V0TWVzc2FnZSgpLCB2ZXJzaW9uLAorCQkvLyBzZXJ2aWNlRGV0YWlscy5nZXRTZXJ2aWNlTmFtZSgpKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIjAuMSIpOworCQkvLworCQkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0RGlzdHJpYnV0aW9uKGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsCisJCS8vIGF1ZGl0QWN0aW9uKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEUmVqZWN0IiwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsCisJCQkJIjQwMyIsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTiwgc2RuY0FkbWluRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWplY3ROb3RDZXJ0aWZpZWRTZXJ2aWNlX2NoZWNrZWRpbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2Ugc3RhcnRDZXJ0UmVzcCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoMjAwLCBzdGFydENlcnRSZXNwLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQsIHNkbmNBZG1pbkRldGFpbHMsIDQwMywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKworCQl2YXJpYWJsZXNBc0xpc3QgPSBBcnJheXMuYXNMaXN0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTi5uYW1lKCksCisJCQkJdmFyaWFibGVzQXNMaXN0LCBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUuZ2V0UmVzcG9uc2UoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCk7CisKKwkJLy8gRXJyb3JJbmZvIGVycm9ySW5mbyA9CisJCS8vIHV0aWxzLnBhcnNlWWFtbChBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfQVZBSUxBQkxFX0ZPUl9ESVNUUklCVVRJT04ubmFtZSgpKTsKKwkJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJEUmVqZWN0IjsKKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsCisJCS8vIHZlcnNpb24sIHNkbmNBZG1pbkRldGFpbHMpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJTZXJ2aWNlIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4ubmFtZSgpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERwcmV2U3RhdHVzKCIiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREY3VyclN0YXR1cyhEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQubmFtZSgpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDb21tZW50KHVzZXJSZW1hcmtzKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjQwMyIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoU3RyaW5nLmZvcm1hdChlcnJvckluZm8uZ2V0TWVzc2FnZUlkKCkKKwkJLy8gKyAiOiAiICsgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKSwgdmVyc2lvbiwKKwkJLy8gc2VydmljZURldGFpbHMuZ2V0U2VydmljZU5hbWUoKSkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIwLjEiKTsKKwkJLy8KKwkJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdERpc3RyaWJ1dGlvbihleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCQkvLyBhdWRpdEFjdGlvbik7CisKKwkJdmFsaWRhdGVBdWRpdCgiRFJlamVjdCIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsCisJCQkJIjQwMyIsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTiwgc2RuY0FkbWluRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWplY3ROb3RDZXJ0aWZpZWRTZXJ2aWNlX2luUHJvZ3Jlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHN0YXJ0Q2VydFJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscygyMDAsIHN0YXJ0Q2VydFJlc3AuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCwgc2RuY0FkbWluRGV0YWlscywgNDAzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCisJCXZhcmlhYmxlc0FzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLm5hbWUoKSwKKwkJCQl2YXJpYWJsZXNBc0xpc3QsIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQkvLyBFcnJvckluZm8gZXJyb3JJbmZvID0KKwkJLy8gdXRpbHMucGFyc2VZYW1sKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTi5uYW1lKCkpOworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkRSZWplY3QiOworCQkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCQkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywKKwkJLy8gdmVyc2lvbiwgc2RuY0FkbWluRGV0YWlscyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OLm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREcHJldlN0YXR1cygiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGN1cnJTdGF0dXMoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCI0MDMiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKFN0cmluZy5mb3JtYXQoZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpCisJCS8vICsgIjogIiArIGVycm9ySW5mby5nZXRNZXNzYWdlKCksIHZlcnNpb24sCisJCS8vIHNlcnZpY2VEZXRhaWxzLmdldFNlcnZpY2VOYW1lKCkpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiMC4xIik7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJCXZhbGlkYXRlQXVkaXQoIkRSZWplY3QiLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04sCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsCisJCQkJIjQwMyIsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTiwgc2RuY0FkbWluRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWplY3ROb3RDZXJ0aWZpZWRTZXJ2aWNlX3JlYWR5Rm9yQ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlamVjdE5vdENlcnRpZmllZFNlcnZpY2VfaW5Qcm9ncmVzcygpOworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisKKwkJUmVzdFJlc3BvbnNlIHN0YXJ0Q2VydFJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoMjAwLCBzdGFydENlcnRSZXNwLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQsIHNkbmNBZG1pbkRldGFpbHMsIDQwMywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKworCQl2YXJpYWJsZXNBc0xpc3QgPSBBcnJheXMuYXNMaXN0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTi5uYW1lKCksCisJCQkJdmFyaWFibGVzQXNMaXN0LCBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUuZ2V0UmVzcG9uc2UoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCk7CisKKwkJLy8gRXJyb3JJbmZvIGVycm9ySW5mbyA9CisJCS8vIHV0aWxzLnBhcnNlWWFtbChBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfQVZBSUxBQkxFX0ZPUl9ESVNUUklCVVRJT04ubmFtZSgpKTsKKwkJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJEUmVqZWN0IjsKKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsCisJCS8vIHZlcnNpb24sIHNkbmNBZG1pbkRldGFpbHMpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJTZXJ2aWNlIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTLm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREcHJldlN0YXR1cygiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGN1cnJTdGF0dXMoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCI0MDMiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKFN0cmluZy5mb3JtYXQoZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpCisJCS8vICsgIjogIiArIGVycm9ySW5mby5nZXRNZXNzYWdlKCksIHZlcnNpb24sCisJCS8vIHNlcnZpY2VEZXRhaWxzLmdldFNlcnZpY2VOYW1lKCkpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiMC4xIik7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJCXZhbGlkYXRlQXVkaXQoIkRSZWplY3QiLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUywKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwKKwkJCQkiNDAzIiwgQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLCBzZG5jQWRtaW5EZXRhaWxzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXBwcm92ZUNlcnRpZmllZFNlcnZpY2VfYnlzZG5jR292ZXJub3JEZWF0YWlscygpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELCBzZG5jR292ZXJub3JEZWF0YWlscywgMjAwLCBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCkpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQpOworCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKGNlcnRpZnlTZXJ2aWNlLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShnZXRTZXJ2aWNlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCk7CisKKwkJdmFsaWRhdGVBdWRpdCgiREFwcHJvdmUiLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQsIG51bGwsIG51bGwsIHNkbmNHb3Zlcm5vckRlYXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFwcHJvdmVDZXJ0aWZpZWRTZXJ2aWNlX2J5c2RuY0FkbWluRGV0YWlscygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELCBzZG5jQWRtaW5EZXRhaWxzLCAyMDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoY2VydGlmeVNlcnZpY2UsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVEKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEQXBwcm92ZSIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCwgbnVsbCwgbnVsbCwgc2RuY0FkbWluRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhcHByb3ZlQ2VydGlmaWVkU2VydmljZV9ieURlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQsIHNkbmNEZXNpZ25lckRldGFpbHMsIDQwOSwgY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShjZXJ0aWZ5U2VydmljZSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQkvLyBFcnJvckluZm8gZXJyb3JJbmZvID0KKwkJLy8gdXRpbHMucGFyc2VZYW1sKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCkpOworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkRBcHByb3ZlIjsKKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oY2VydGlmeVNlcnZpY2UsCisJCS8vIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERwcmV2U3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiNDA5Iik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0TWVzc2FnZUlkKCkgKyAiOgorCQkvLyAiICsgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJCXZhbGlkYXRlQXVkaXQoIkRBcHByb3ZlIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwgIjQwOSIsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFwcHJvdmVDZXJ0aWZpZWRTZXJ2aWNlX2J5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELCBzZG5jVGVzdGVyRGV0YWlscywgNDA5LCBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLmdldFJlc3BvbnNlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKGNlcnRpZnlTZXJ2aWNlLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShnZXRTZXJ2aWNlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQpOworCisJCS8vIEVycm9ySW5mbyBlcnJvckluZm8gPQorCQkvLyB1dGlscy5wYXJzZVlhbWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSk7CisJCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iREFwcHJvdmUiOworCQkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCQkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihjZXJ0aWZ5U2VydmljZSwKKwkJLy8gY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpLCBzZG5jVGVzdGVyRGV0YWlscyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERwcmV2U3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiNDA5Iik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0TWVzc2FnZUlkKCkgKyAiOgorCQkvLyAiICsgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJCXZhbGlkYXRlQXVkaXQoIkRBcHByb3ZlIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwgIjQwOSIsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlzZG5jVGVzdGVyRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhcHByb3ZlQ2VydGlmaWVkU2VydmljZV9ieU9wcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCwgc2RuY09wc0RldGFpbHMsIDQwOSwgY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShjZXJ0aWZ5U2VydmljZSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEQXBwcm92ZSIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsICI0MDkiLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJc2RuY09wc0RldGFpbHMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWplY3RDZXJ0aWZpZWRTZXJ2aWNlX2J5c2RuY0dvdmVybm9yRGVhdGFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNlcnRpZnlTZXJ2aWNlUmVzcCA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscyk7CisJCVNlcnZpY2UgY2VydGlmeVNlcnZpY2VTZXJ2ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjZXJ0aWZ5U2VydmljZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIGNlcnRpZnlTZXJ2aWNlID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKGNlcnRpZnlTZXJ2aWNlU2Vydik7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQsIHNkbmNHb3Zlcm5vckRlYXRhaWxzLCAyMDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoY2VydGlmeVNlcnZpY2UsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVEKTsKKworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkRSZWplY3QiOworCQkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCQkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihjZXJ0aWZ5U2VydmljZSwKKwkJLy8gY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpLCBzZG5jR292ZXJub3JEZWF0YWlscyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUy5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERwcmV2U3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIjAuMSIpOworCQkvLworCQkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0RGlzdHJpYnV0aW9uKGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsCisJCS8vIGF1ZGl0QWN0aW9uKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEUmVqZWN0IiwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELCBudWxsLCBudWxsLCBzZG5jR292ZXJub3JEZWF0YWlscyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlamVjdENlcnRpZmllZFNlcnZpY2VfYnlzZG5jQWRtaW5EZXRhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELCBzZG5jQWRtaW5EZXRhaWxzLCAyMDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoY2VydGlmeVNlcnZpY2UsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVEKTsKKworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkRSZWplY3QiOworCQkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCQkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihjZXJ0aWZ5U2VydmljZSwKKwkJLy8gY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiU2VydmljZSIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTLm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RHByZXZTdGF0dXMoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELm5hbWUoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGN1cnJTdGF0dXMoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQubmFtZSgpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDb21tZW50KHVzZXJSZW1hcmtzKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiMC4xIik7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJCXZhbGlkYXRlQXVkaXQoIkRSZWplY3QiLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQsIG51bGwsIG51bGwsIHNkbmNBZG1pbkRldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcmVqZWN0Q2VydGlmaWVkU2VydmljZV9ieURlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELCBzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDksIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQljaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUuZ2V0UmVzcG9uc2UoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoY2VydGlmeVNlcnZpY2UsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCk7CisKKwkJLy8gRXJyb3JJbmZvIGVycm9ySW5mbyA9CisJCS8vIHV0aWxzLnBhcnNlWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpKTsKKwkJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJEUmVqZWN0IjsKKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oY2VydGlmeVNlcnZpY2UsCisJCS8vIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUy5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERwcmV2U3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiNDA5Iik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0TWVzc2FnZUlkKCkgKyAiOgorCQkvLyAiICsgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIjAuMSIpOworCQkvLworCQkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0RGlzdHJpYnV0aW9uKGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsCisJCS8vIGF1ZGl0QWN0aW9uKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEUmVqZWN0IiwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwgIjQwOSIsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlamVjdENlcnRpZmllZFNlcnZpY2VfYnlUZXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNlcnRpZnlTZXJ2aWNlUmVzcCA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscyk7CisJCVNlcnZpY2UgY2VydGlmeVNlcnZpY2VTZXJ2ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjZXJ0aWZ5U2VydmljZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIGNlcnRpZnlTZXJ2aWNlID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKGNlcnRpZnlTZXJ2aWNlU2Vydik7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQsIHNkbmNUZXN0ZXJEZXRhaWxzLCA0MDksIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQljaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUuZ2V0UmVzcG9uc2UoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoY2VydGlmeVNlcnZpY2UsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCk7CisKKwkJLy8gRXJyb3JJbmZvIGVycm9ySW5mbyA9CisJCS8vIHV0aWxzLnBhcnNlWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpKTsKKwkJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJEUmVqZWN0IjsKKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oY2VydGlmeVNlcnZpY2UsCisJCS8vIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSwgc2RuY1Rlc3RlckRldGFpbHMpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJTZXJ2aWNlIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MubmFtZSgpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREcHJldlN0YXR1cyhEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQubmFtZSgpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREY3VyclN0YXR1cyhEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQubmFtZSgpKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjQwOSIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpICsgIjoKKwkJLy8gIiArIGVycm9ySW5mby5nZXRNZXNzYWdlKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldENvbW1lbnQodXNlclJlbWFya3MpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIwLjEiKTsKKwkJLy8KKwkJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdERpc3RyaWJ1dGlvbihleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCQkvLyBhdWRpdEFjdGlvbik7CisKKwkJdmFsaWRhdGVBdWRpdCgiRFJlamVjdCIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsICI0MDkiLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJc2RuY1Rlc3RlckRldGFpbHMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcmVqZWN0Q2VydGlmaWVkU2VydmljZV9ieU9wcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCwgc2RuY09wc0RldGFpbHMsIDQwOSwgY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShjZXJ0aWZ5U2VydmljZSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQkvLyBFcnJvckluZm8gZXJyb3JJbmZvID0KKwkJLy8gdXRpbHMucGFyc2VZYW1sKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCkpOworCQkvLyBTdHJpbmcgYXVkaXRBY3Rpb249IkRSZWplY3QiOworCQkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCQkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihjZXJ0aWZ5U2VydmljZSwKKwkJLy8gY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpLCBzZG5jT3BzRGV0YWlscyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUy5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERwcmV2U3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRC5uYW1lKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiNDA5Iik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0TWVzc2FnZUlkKCkgKyAiOgorCQkvLyAiICsgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIjAuMSIpOworCQkvLworCQkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0RGlzdHJpYnV0aW9uKGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsCisJCS8vIGF1ZGl0QWN0aW9uKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEUmVqZWN0IiwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVELAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwgIjQwOSIsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwKKwkJCQlzZG5jT3BzRGV0YWlscyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhcHByb3ZlU2VydmljZU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBwcmV2aXVvc0lkID0gc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKwkJc2VydmljZURldGFpbHMuc2V0VW5pcXVlSWQoImR1bW15SWQiKTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELCBzZG5jQWRtaW5EZXRhaWxzLCA0MDQsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJCXNlcnZpY2VEZXRhaWxzLnNldFVuaXF1ZUlkKHByZXZpdW9zSWQpOworCisJCXZhcmlhYmxlc0FzTGlzdCA9IEFycmF5cy5hc0xpc3QoImR1bW15SWQiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlc0FzTGlzdCwKKwkJCQljaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlamVjdFNlcnZpY2VOb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgcHJldml1b3NJZCA9IHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCXNlcnZpY2VEZXRhaWxzLnNldFVuaXF1ZUlkKCJkdW1teUlkIik7CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCwgc2RuY0FkbWluRGV0YWlscywgNDA0LCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlzZXJ2aWNlRGV0YWlscy5zZXRVbmlxdWVJZChwcmV2aXVvc0lkKTsKKworCQl2YXJpYWJsZXNBc0xpc3QgPSBBcnJheXMuYXNMaXN0KCJkdW1teUlkIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXNBc0xpc3QsCisJCQkJY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWplY3RTZXJ2aWNlX2VtcHR5Q29tbWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQl1c2VyUmVtYXJrcyA9ICIiOworCisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELCBzZG5jQWRtaW5EZXRhaWxzLCA0MDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLmdldFJlc3BvbnNlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShnZXRTZXJ2aWNlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWplY3RTZXJ2aWNlX251bGxDb21tZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVzZXJSZW1hcmtzID0gbnVsbDsKKworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCwgc2RuY0FkbWluRGV0YWlscywgNDAwLCBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlamVjdFNlcnZpY2Vfc3BhY2VDb21tZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVzZXJSZW1hcmtzID0gIiAiOworCisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELCBzZG5jQWRtaW5EZXRhaWxzLCA0MDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLmdldFJlc3BvbnNlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShnZXRTZXJ2aWNlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhcHByb3ZlU2VydmljZV9lbXB0eUNvbW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXNlclJlbWFya3MgPSAiIjsKKworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCwgc2RuY0FkbWluRGV0YWlscywgNDAwLCBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVC5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZS5nZXRSZXNwb25zZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXBwcm92ZVNlcnZpY2VfbnVsbENvbW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXNlclJlbWFya3MgPSBudWxsOworCisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELCBzZG5jQWRtaW5EZXRhaWxzLCA0MDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULm5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlLmdldFJlc3BvbnNlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShnZXRTZXJ2aWNlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhcHByb3ZlU2VydmljZV9zcGFjZUNvbW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXNlclJlbWFya3MgPSAiICI7CisKKwkJUmVzdFJlc3BvbnNlIGNlcnRpZnlTZXJ2aWNlUmVzcCA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscyk7CisJCVNlcnZpY2UgY2VydGlmeVNlcnZpY2VTZXJ2ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjZXJ0aWZ5U2VydmljZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIGNlcnRpZnlTZXJ2aWNlID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKGNlcnRpZnlTZXJ2aWNlU2Vydik7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQsIHNkbmNBZG1pbkRldGFpbHMsIDQwMCwgY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQljaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUuZ2V0UmVzcG9uc2UoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGdldFNlcnZpY2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRpc3RyaWJ1dGlvblN0YXR1c0NoYW5nZV9hcHByb3ZlX1JlamVjdF9BcHJyb3ZlQnlzZG5jQWRtaW5EZXRhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlU2VydiA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY2VydGlmeVNlcnZpY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZVNlcnYpOworCisJCVJlc3RSZXNwb25zZSBhcHByb3ZlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELCBzZG5jR292ZXJub3JEZWF0YWlscywgMjAwLCBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCkpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKGFwcHJvdmVEaXN0U3RhdHVzQW5kVmFsaWRhdGUsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVEKTsKKworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCVJlc3RSZXNwb25zZSByZWplY3REaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQsIHNkbmNHb3Zlcm5vckRlYXRhaWxzLCAyMDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUocmVqZWN0RGlzdFN0YXR1c0FuZFZhbGlkYXRlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCk7CisKKwkJdmFsaWRhdGVBdWRpdCgiRFJlamVjdCIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELCBudWxsLCBudWxsLCBzZG5jR292ZXJub3JEZWF0YWlscyk7CisKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXN0UmVzcG9uc2Ugc2Vjb25kQXBwcm92ZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSA9IGNoYW5nZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSgKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRCwgc2RuY0FkbWluRGV0YWlscywgMjAwLCBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCkpOworCQlnZXREaXN0cnVidGlvblN0YXR1c1ZhbHVlKHNlY29uZEFwcHJvdmVEaXN0U3RhdHVzQW5kVmFsaWRhdGUsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVEKTsKKworCQl2YWxpZGF0ZUF1ZGl0KCJEQXBwcm92ZSIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX1JFSkVDVEVELAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVELCBudWxsLCBudWxsLCBzZG5jQWRtaW5EZXRhaWxzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzdHJpYnV0ZU5vdENlcnRpZmllZFNlcnZpY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBhcHByb3ZlRGlzdFN0YXR1c0FuZFZhbGlkYXRlID0gY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVURUQsCisJCQkJc2RuY0dvdmVybm9yRGVhdGFpbHMsIDIwMCwgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoZ2V0U2VydmljZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRpc3RyaWJ1dGVDZXJ0aWZpZWRTZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKwkJUmVzdFJlc3BvbnNlIGFwcHJvdmVEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCwKKwkJCQlzZG5jR292ZXJub3JEZWF0YWlscywgMjAwLCBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKGNlcnRpZnlTZXJ2aWNlLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShnZXRTZXJ2aWNlLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVEVEKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXBwcm92ZUNoZWNrZWRvdXRDZXJ0aWZpZWRTZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKwkJUmVzdFJlc3BvbnNlIGFwcHJvdmVEaXN0U3RhdHVzQW5kVmFsaWRhdGUgPSBjaGFuZ2VEaXN0U3RhdHVzQW5kVmFsaWRhdGUoCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQsIHNkbmNHb3Zlcm5vckRlYXRhaWxzLCAyMDAsIGNlcnRpZnlTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCWdldERpc3RydWJ0aW9uU3RhdHVzVmFsdWUoYXBwcm92ZURpc3RTdGF0dXNBbmRWYWxpZGF0ZSwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQpOworCisJCVJlc3RSZXNwb25zZSBjaGVja291dFJlc3AgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygyMDAsIGNoZWNrb3V0UmVzcC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gVXRpbHMgciA9IG5ldyBVdGlscygpOworCisJCVN0cmluZyBkaXN0cmlidXRpb25TdGF0dXMgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hlY2tvdXRSZXNwLmdldFJlc3BvbnNlKCksCisJCQkJImRpc3RyaWJ1dGlvblN0YXR1cyIpOworCQkvLyBVdGlscyByMSA9IG5ldyBVdGlscygpOworCQlTdHJpbmcgbGlmZWN5Y2xlU3RhdGUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hlY2tvdXRSZXNwLmdldFJlc3BvbnNlKCksICJsaWZlY3ljbGVTdGF0ZSIpOworCisJCWFzc2VydFRydWUoIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLmVxdWFscyhsaWZlY3ljbGVTdGF0ZSkpOworCQlhc3NlcnRUcnVlKCJESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEIi5lcXVhbHMoZGlzdHJpYnV0aW9uU3RhdHVzKSk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdFN0YXR1c0FuZFZhbGlkYXRlKERpc3RyaWJ1dGlvblN0YXR1c0VudW0gZGlzdFN0YXR1cywgVXNlciB1c2VyLCBpbnQgZXJyb3JDb2RlLAorCQkJU3RyaW5nIHNlcnZpY2VWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGRpc3RyaWJ1dGlvblJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZURpc3RyaWJ1dGlvblN0YXR1cyhzZXJ2aWNlRGV0YWlscywgc2VydmljZVZlcnNpb24sCisJCQkJdXNlciwgdXNlclJlbWFya3MsIGRpc3RTdGF0dXMpOworCQlhc3NlcnROb3ROdWxsKGRpc3RyaWJ1dGlvblJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbChkaXN0cmlidXRpb25SZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscyhlcnJvckNvZGUsIGRpc3RyaWJ1dGlvblJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCWlmICh1c2VyUmVtYXJrcyA9PSAiICIgfHwgdXNlclJlbWFya3MgPT0gbnVsbCkgeworCQkJdXNlclJlbWFya3MgPSAiIjsKKwkJfQorCisJCXJldHVybiBkaXN0cmlidXRpb25SZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2V0RGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0gZXhwZWN0ZWREaXN0cmlidXRpb25WYWx1ZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0dWFsRGlzdHJpYnV0aW9uVmFsdWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkiZGlzdHJpYnV0aW9uU3RhdHVzIik7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZERpc3RyaWJ1dGlvblZhbHVlLm5hbWUoKSwgYWN0dWFsRGlzdHJpYnV0aW9uVmFsdWUpOworCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUF1ZGl0KFN0cmluZyBBY3Rpb24sIExpZmVjeWNsZVN0YXRlRW51bSBjdXJyU3RhdGUsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0gZFByZXZTdGF0dXMsCisJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtIGRDdXJyU3RhdHVzLCBTdHJpbmcgc3RhdHVzLCBBY3Rpb25TdGF0dXMgZXJyb3JJbmZvRnJvbUZpbGUsIFVzZXIgdXNlcikKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHVzZXIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiU2VydmljZSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZShjdXJyU3RhdGUubmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREcHJldlN0YXR1cyhkUHJldlN0YXR1cy5uYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERjdXJyU3RhdHVzKGRDdXJyU3RhdHVzLm5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudCh1c2VyUmVtYXJrcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKworCQlpZiAoZXJyb3JJbmZvRnJvbUZpbGUgIT0gbnVsbCkgeworCQkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKGVycm9ySW5mb0Zyb21GaWxlLm5hbWUoKSk7CisJCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0CisJCQkJCS5zZXREZXNjKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlc0FzTGlzdCkpOworCQl9CisKKwkJaWYgKHN0YXR1cyAhPSBudWxsKQorCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoc3RhdHVzKTsKKworCQlpZiAoY3VyclN0YXRlICE9IExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpIHsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKCIiKTsKKwkJfQorCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXREaXN0cmlidXRpb24oZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgQWN0aW9uKTsKKwl9CisKKwkvLyBwcml2YXRlIFNlcnZpY2VSZXFEZXRhaWxzIGNlcnRpZnlTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbgorCS8vIHsKKwkvLyBTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9CisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2RuY0FkbWluRGV0YWlscyk7CisJLy8vLyB2ZXJzaW9uID0gY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpOworCS8vCisJLy8gcmV0dXJuIGNlcnRpZnlTZXJ2aWNlOworCS8vIH0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9DcmVhdGVTZXJ2aWNlTWV0YWRhdGFBcGlUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL0NyZWF0ZVNlcnZpY2VNZXRhZGF0YUFwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNmZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9DcmVhdGVTZXJ2aWNlTWV0YWRhdGFBcGlUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qc29uLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9kdWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db21wb25lbnRJbnN0YW5jZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkxpZmVjeWNsZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlByb2R1Y3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BdWRpdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uU2VydmljZVZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CisKK3B1YmxpYyBjbGFzcyBDcmVhdGVTZXJ2aWNlTWV0YWRhdGFBcGlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcmVhdGVTZXJ2aWNlTWV0YWRhdGFBcGlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlTdHJpbmcgc2VydmljZUJhc2VWZXJzaW9uID0gIjAuMSI7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIENyZWF0ZVNlcnZpY2VNZXRhZGF0YUFwaVRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIENyZWF0ZVNlcnZpY2VNZXRhZGF0YUFwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gU3RyaW5nIGNyZWF0b3IgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pLmdldFVzZXJJZCgpOworCisJCS8vIGZpbGwgbmV3IHNlcnZpY2UgZGV0YWlscworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHNlcnZpY2UgY3JlYXRpb24KKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBjcmVhdGUgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlLCBzZG5jVXNlckRldGFpbHMsCisJCQkJKExpZmVjeWNsZVN0YXRlRW51bSkgbnVsbCk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHNlcnZpY2UgcmVzcG9uc2UgdnMgYWN0dWFsCisJCXJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsIHNlcnZpY2UsIHNkbmNVc2VyRGV0YWlscywKKwkJCQkoTGlmZWN5Y2xlU3RhdGVFbnVtKSBudWxsKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlQmFzZVZlcnNpb24sIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0U2VydmljZVVzZXJEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKworCQkvLyBjbGVhbiBhdWRpdCBEQiBiZWZvcmUgc2VydmljZSBjcmVhdGlvbgorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIDIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIHZhbGlkYXRlIGNyZWF0ZSBzZXJ2aWNlIHJlc3BvbnNlIHZzIGFjdHVhbAorCisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsIHNlcnZpY2UsIHNkbmNVc2VyRGV0YWlscywKKwkJCQkoTGlmZWN5Y2xlU3RhdGVFbnVtKSBudWxsKTsKKworCQkvLyB2YWxpZGF0ZSBnZXQgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKwkJcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywgc2VydmljZUJhc2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMpOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZVVzZXJOb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNVc2VyRGV0YWlscy5zZXRVc2VySWQoIm5vMTIzNCIpOworCisJCS8vIGZpbGwgbmV3IHNlcnZpY2UgZGV0YWlscworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHNlcnZpY2UgY3JlYXRpb24KKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBjcmVhdGUgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCisJCXNkbmNVc2VyRGV0YWlscy5zZXRGaXJzdE5hbWUoIiIpOworCQlzZG5jVXNlckRldGFpbHMuc2V0TGFzdE5hbWUoIiIpOworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywgc2VydmljZUJhc2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMpOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlVXNlck5vdEFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBjaG9vc2UgdGhlIHVzZXIgdG8gY3JlYXRlIHNlcnZpY2UKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKworCQkvLyBmaWxsIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBzZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJLy8gdmFsaWRhdGUgY3JlYXRlIHNlcnZpY2UgcmVzcG9uc2UgdnMgYWN0dWFsCisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywgc2VydmljZUJhc2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMpOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUVtcHR5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gIiI7CisJCXNlcnZpY2VEZXRhaWxzLnNldE5hbWUoc2VydmljZU5hbWUpOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBzZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19DT01QT05FTlRfTkFNRS5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBjcmVhdGUgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ09NUE9ORU5UX05BTUUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gU2VydmljZVZhbGlkYXRpb25VdGlscworCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsIHNlcnZpY2VCYXNlVmVyc2lvbiwgc2RuY1VzZXJEZXRhaWxzKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VFbXB0eUNhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBmaWxsIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlTdHJpbmcgY2F0ZWdvcnkgPSAiIjsKKworCQlzZXJ2aWNlRGV0YWlscy5zZXRDYXRlZ29yaWVzKG51bGwpOworCQkvLyBzZXJ2aWNlRGV0YWlscy5hZGRDYXRlZ29yeShjYXRlZ29yeSk7CisKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHNlcnZpY2UgY3JlYXRpb24KKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWS5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBjcmVhdGUgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NBVEVHT1JZLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlQmFzZVZlcnNpb24sIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlRW1wdHlUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBjaG9vc2UgdGhlIHVzZXIgdG8gY3JlYXRlIHNlcnZpY2UKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIGZpbGwgbmV3IHNlcnZpY2UgZGV0YWlscworCQlBcnJheUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRhZ3MuYWRkKCIiKTsKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlzZXJ2aWNlRGV0YWlscy5zZXRUYWdzKHRhZ3MpOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBzZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJLy8gdmFsaWRhdGUgY3JlYXRlIHNlcnZpY2UgcmVzcG9uc2UgdnMgYWN0dWFsCisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiLCAidGFnIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gU2VydmljZVZhbGlkYXRpb25VdGlscworCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsIHNlcnZpY2VCYXNlVmVyc2lvbiwgc2RuY1VzZXJEZXRhaWxzKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VFbXB0eURlc2NyaXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBmaWxsIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIiI7CisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBzZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscworCQkJCS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04ubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJLy8gdmFsaWRhdGUgY3JlYXRlIHNlcnZpY2UgcmVzcG9uc2UgdnMgYWN0dWFsCisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTi5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywgc2VydmljZUJhc2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMpOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUVtcHR5VGFncygpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCUFycmF5TGlzdDxTdHJpbmc+IHRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFncy5hZGQoIiIpOworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCXNlcnZpY2VEZXRhaWxzLnNldFRhZ3ModGFncyk7CisKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHNlcnZpY2UgY3JlYXRpb24KKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJRUxEX0ZPUk1BVC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBjcmVhdGUgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiU2VydmljZSIsICJ0YWciKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJRUxEX0ZPUk1BVC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzCisJCQkJLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihzZXJ2aWNlRGV0YWlscywgc2VydmljZUJhc2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMpOworCisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIGF1ZGl0RGVzYyA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhhdWRpdERlc2MpOworCisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUJ5UHV0SHR0cE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBtZXRob2QgPSAiUFVUIjsKKworCQkvLyBjaG9vc2UgdGhlIHVzZXIgdG8gY3JlYXRlIHNlcnZpY2UKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJCS8vIGZpbGwgbmV3IHNlcnZpY2UgZGV0YWlscworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHNlcnZpY2UgY3JlYXRpb24KKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZUJ5SHR0cE1ldGhvZChzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLCBtZXRob2QsCisJCQkJVXJscy5DUkVBVEVfU0VSVklDRSk7CisKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBjcmVhdGUgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VELm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCXJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyAvL3ZhbGlkYXRlIGF1ZGl0CisJCS8vCisJCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJCS8vIHJlc291cmNlVXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLAorCQkvLyBzZXJ2aWNlQmFzZVZlcnNpb24sIHNkbmNVc2VyRGV0YWlscyk7CisJCS8vCisJCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iQ3JlYXRlIjsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQkvLworCQkvLyBTdHJpbmcgYXVkaXREZXNjID0KKwkJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisJCS8vCisJCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJLy8gYXVkaXRBY3Rpb24pOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlQnlEZWxldGVIdHRwTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIG1ldGhvZCA9ICJERUxFVEUiOworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKworCQkvLyBjbGVhbiBhdWRpdCBEQiBiZWZvcmUgc2VydmljZSBjcmVhdGlvbgorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlQnlIdHRwTWV0aG9kKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMsIG1ldGhvZCwKKwkJCQlVcmxzLkNSRUFURV9TRVJWSUNFKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VELm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCS8vIHZhbGlkYXRlIGNyZWF0ZSBzZXJ2aWNlIHJlc3BvbnNlIHZzIGFjdHVhbAorCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIC8vdmFsaWRhdGUgYXVkaXQKKwkJLy8KKwkJLy8gRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJLy8gcmVzb3VyY2VVdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsCisJCS8vIHNlcnZpY2VCYXNlVmVyc2lvbiwgc2RuY1VzZXJEZXRhaWxzKTsKKwkJLy8KKwkJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJDcmVhdGUiOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCS8vCisJCS8vIFN0cmluZyBhdWRpdERlc2MgPQorCQkvLyBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKwkJLy8KKwkJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCQkvLyBhdWRpdEFjdGlvbik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VUYWdMZW5ndGhFeGNlZWRMaW1pdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJU3RyaW5nQnVmZmVyIHRhZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI1OyBpKyspIHsKKwkJCXRhZ0J1ZmZlci5hcHBlbmQoImEiKTsKKwkJfQorCQlBcnJheUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRhZ3MuYWRkKHRhZ0J1ZmZlci50b1N0cmluZygpKTsKKwkJc2VydmljZURldGFpbHMuc2V0VGFncyh0YWdzKTsKKworCQkvLyBjbGVhbiBhdWRpdCBEQiBiZWZvcmUgc2VydmljZSBjcmVhdGlvbgorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscworCQkJCS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCS8vIHZhbGlkYXRlIGNyZWF0ZSBzZXJ2aWNlIHJlc3BvbnNlIHZzIGFjdHVhbAorCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCI1MCIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9TSU5HTEVfVEFHX0VYQ0VFRF9MSU1JVC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gU2VydmljZVZhbGlkYXRpb25VdGlscworCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsIHNlcnZpY2VCYXNlVmVyc2lvbiwgc2RuY1VzZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIjUwIikpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwkJLyoKKwkJICogRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0KKwkJICogU2VydmljZVZhbGlkYXRpb25VdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCSAqIHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlQmFzZVZlcnNpb24sIHNkbmNVc2VyRGV0YWlscyk7CisJCSAqIAorCQkgKiBTdHJpbmcgYXVkaXRBY3Rpb249IkNyZWF0ZSI7CisJCSAqIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkJICogZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQkgKiBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJICogZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS4KKwkJICogTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCSAqIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkuCisJCSAqIHRvU3RyaW5nKCkpOyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKwkJICogCisJCSAqIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkJICogYXVkaXRBY3Rpb24sIG51bGwpOworCQkgKi8KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUFscmVhZHlFeGlzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKworCQkvLyBjbGVhbiBhdWRpdCBEQiBiZWZvcmUgc2VydmljZSBjcmVhdGlvbgorCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJLy8gc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKwkJU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBjcmVhdGUgc2VydmljZSB3aXRoIHRoZSBzYW1lIG5hbWUKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMKKwkJCQkucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJLy8gdmFsaWRhdGUgY3JlYXRlIHNlcnZpY2UgcmVzcG9uc2UgdnMgYWN0dWFsCisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiLCBzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gU2VydmljZVZhbGlkYXRpb25VdGlscworCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsIHNlcnZpY2VCYXNlVmVyc2lvbiwgc2RuY1VzZXJEZXRhaWxzKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCisJCVN0cmluZyBhdWRpdERlc2MgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoYXVkaXREZXNjKTsKKworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VXcm9uZ0NvbnRhY3RJZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCIxMjNhcyIpOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBzZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscworCQkJCS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcnZpY2VQcm9qZWN0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZURldGFpbHMuc2V0UHJvamVjdENvZGUoIjEyMzQ1Iik7CisKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHNlcnZpY2UgY3JlYXRpb24KKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJSW50ZWdlciBleHBlY3RlZENvZGUgPSAyMDE7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBleHBlY3RlZENvZGUsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCWFzc2VydEVxdWFscygiMTIzNDUiLCBzZXJ2aWNlLmdldFByb2plY3RDb2RlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlQW5kR2V0QnlOYW1lQW5kVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQkvLyBjcmVhdGUKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkvLyBnZXQKKwkJcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwKKwkJCQlzZXJ2aWNlQmFzZVZlcnNpb24pOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHNlcnZpY2UiLCAyMDAsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gc2VydmljZS5nZXRVbmlxdWVJZCgpOworCQlzZXJ2aWNlRGV0YWlscy5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCVNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTZXJ2aWNlUmVzcG9uc2VNZXRhRGF0YShzZXJ2aWNlRGV0YWlscywgc2VydmljZSwgc2RuY1VzZXJEZXRhaWxzLAorCQkJCShMaWZlY3ljbGVTdGF0ZUVudW0pIG51bGwpOworCX0KKworCS8vLy8gVVM1NTM4NzQKKworCUBKc29uSWdub3JlCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlSXNWTkZfaXNGYWxzZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCS8vIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkvLyBzZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyBJbnRlcmZhY2UgQXJ0aWZhY3QiLCAyMDEsCisJCQkJcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIGdldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGNyZWF0ZWQgd2l0aCBpc1ZORiBkZWZpbmVkIGluCisJCS8vIHNlcnZpY2VEZXRhaWxzCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgc2VydmljZUJhc2VWZXJzaW9uKTsKKwkJU2VydmljZSBzZXJ2aWNlT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlT2JqZWN0LCBzZG5jVXNlckRldGFpbHMsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlQmFzZVZlcnNpb24sIHNkbmNVc2VyRGV0YWlscyk7CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCX0KKworCUBKc29uSWdub3JlCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlSXNWTkZfaXNUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJLy8gbmV3IHNlcnZpY2UgZGV0YWlscworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHNlcnZpY2UgY3JlYXRpb24KKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgc2VydmljZSIsIHJlc3RSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsIDIwMSwKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgY3JlYXRlZCB3aXRoIGlzVk5GIGRlZmluZWQgaW4KKwkJLy8gc2VydmljZURldGFpbHMKKwkJUmVzdFJlc3BvbnNlIHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCBzZXJ2aWNlQmFzZVZlcnNpb24pOworCQlTZXJ2aWNlIHNlcnZpY2VPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsIHNlcnZpY2VPYmplY3QsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gU2VydmljZVZhbGlkYXRpb25VdGlscworCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsIHNlcnZpY2VCYXNlVmVyc2lvbiwgc2RuY1VzZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJfQorCisJQEpzb25JZ25vcmUKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZUlzVk5GX2lzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCS8vIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCisJCS8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSBzZXJ2aWNlIGNyZWF0aW9uCisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKwkJLy8gc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsIDQwMCwKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJWTkYgU2VydmljZSBJbmRpY2F0b3IiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLm5hbWUoKSk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlQmFzZVZlcnNpb24sIHNkbmNVc2VyRGV0YWlscyk7CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKCJWTkYgU2VydmljZSBJbmRpY2F0b3IiKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwsIGZhbHNlKTsKKwl9CisKKwlASnNvbklnbm9yZQorCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2aWNlRW1wdHlJc1ZORigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHNlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBjcmVhdGUgc2VydmljZSByZXNwb25zZSB2cyBhY3R1YWwKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlZORiBTZXJ2aWNlIEluZGljYXRvciIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQS5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEubmFtZSgpKTsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gU2VydmljZVZhbGlkYXRpb25VdGlscworCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsIHNlcnZpY2VCYXNlVmVyc2lvbiwgc2RuY1VzZXJEZXRhaWxzKTsKKworCQlTdHJpbmcgYXVkaXRBY3Rpb24gPSAiQ3JlYXRlIjsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVdpdGhNaXNzaW5nQXR0cmlidXRlKFN0cmluZyBzZXJ2aWNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IFNlcnZpY2VSZXN0VXRpbHMucHJlcGFyZUhlYWRlcnNNYXAoc2RuY01vZGlmaWVyRGV0YWlscywgZmFsc2UpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DQUNIRV9DT05UUk9MLmdldFZhbHVlKCksICJuby1jYWNoZSIpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCS8vIFRPRE86IEFERCBBVVRIRU5USUNBVElPTiBJTiBSRVFVRVNUCisJCWxvZ2dlci5kZWJ1Zyh1cmwpOworCQlsb2dnZXIuZGVidWcoIlNlbmQgUE9TVCByZXF1ZXN0IHRvIGNyZWF0ZSBzZXJ2aWNlOiB7fSIsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VydmljZSBib2R5OiB7fSIsIHNlcnZpY2VEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZXJ2aWNlIGhlYWRlcnM6IHt9IiwgaGVhZGVyc01hcCk7CisJCVJlc3RSZXNwb25zZSBzZW5kQ3JlYXRlVXNlclJlcXVlc3QgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHNlcnZpY2VEZXRhaWxzLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gc2VuZENyZWF0ZVVzZXJSZXF1ZXN0OworCisJfQorCisJQEpzb25JZ25vcmUKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgY3JlYXRlU2VydmljZVZlcnNpb25faXNWTkZEb2VzTm90RXhpc3RJbkpzb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBjaG9vc2UgdGhlIHVzZXIgdG8gY3JlYXRlIHNlcnZpY2UKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQkvLyBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHVwZGF0aW5nIHNlcnZpY2UKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCS8vIHJlbW92ZSBpc1ZORiBmcm9tIGpzb24gc2VudCB0byBjcmVhdGUgc2VydmljZQorCQlKU09OT2JqZWN0IGpPYmplY3QgPSBuZXcgSlNPTk9iamVjdChzZXJ2aWNlRGV0YWlscyk7CisJCWpPYmplY3QucmVtb3ZlKCJWTkYiKTsKKworCQkvLyBzZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gY3JlYXRlU2VydmljZVdpdGhNaXNzaW5nQXR0cmlidXRlKGpPYmplY3QudG9TdHJpbmcoKSwgc2RuY1VzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgSW50ZXJmYWNlIEFydGlmYWN0IiwgNDAwLAorCQkJCXJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKCJWTkYgU2VydmljZSBJbmRpY2F0b3IiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLm5hbWUoKSk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMKKwkJCQkuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCAiMC4xIiwgc2RuY1VzZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGF1ZGl0QWN0aW9uID0gIkNyZWF0ZSI7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2MoIlZORiBTZXJ2aWNlIEluZGljYXRvciIpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0ludmFyaWFudFV1aWRJc0ltbXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjaG9vc2UgdGhlIHVzZXIgdG8gY3JlYXRlIHNlcnZpY2UKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlDb21wb25lbnQgcmVzb3VyY2VEZXRhaWxzVkZDY29tcCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uQURNSU4sIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQsIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAsIFVzZXJSb2xlRW51bS5BRE1JTiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkZDY29tcCwgVXNlclJvbGVFbnVtLkFETUlOLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisKKwkJLy8gZmlsbCBuZXcgc2VydmljZSBkZXRhaWxzCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJU3RyaW5nIGludmFyaWFudFV1aWREZWZpbmVkQnlVc2VyID0gIiEhISEhISEhISEhISEhISEhISEhISEhISI7CisJCXNlcnZpY2VEZXRhaWxzLnNldEludmFyaWFudFVVSUQoaW52YXJpYW50VXVpZERlZmluZWRCeVVzZXIpOworCisJCS8vIGNyZWF0ZSBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2VDcmVhdGlvbiA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N0YXR1c0NvZGUocmVzdFJlc3BvbnNlQ3JlYXRpb24sICJjcmVhdGUgcmVxdWVzdCBmYWlsZWQiLCBmYWxzZSwgMjAxKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2VDcmVhdGlvbi5nZXRSZXNwb25zZSgpKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZURldGFpbHNWRkNjb21wLCBzZXJ2aWNlLAorCQkJCVVzZXJSb2xlRW51bS5BRE1JTiwgdHJ1ZSk7CisKKwkJU3RyaW5nIGludmFyaWFudFVVSURjcmVhdGlvbiA9IHNlcnZpY2UuZ2V0SW52YXJpYW50VVVJRCgpOworCisJCS8vIHZhbGlkYXRlIGdldCBzZXJ2aWNlIHJlc3BvbnNlIHZzIGFjdHVhbAorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlR2V0dGluZyA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlR2V0dGluZyk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZUdldHRpbmcuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEZ2V0dGluZyA9IHNlcnZpY2UuZ2V0SW52YXJpYW50VVVJRCgpOworCisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGludmFyaWFudFVVSURnZXR0aW5nKTsKKworCQkvLyBVcGRhdGUgc2VydmljZSB3aXRoIG5ldyBpbnZhcmlhbnQgVVVJRAorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlVXBkYXRlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2VVcGRhdGUpOworCQlTZXJ2aWNlIHVwZGF0ZWRTZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2VVcGRhdGUuZ2V0UmVzcG9uc2UoKSk7CisJCVN0cmluZyBpbnZhcmlhbnRVVUlEdXBkYXRpbmcgPSB1cGRhdGVkU2VydmljZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGludmFyaWFudFVVSUR1cGRhdGluZyk7CisKKwkJLy8gRG8gY2hlY2tpbgorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlQ2hlY2tpbiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZUNoZWNraW4pOworCQlTZXJ2aWNlIGNoZWNraW5TZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2VDaGVja2luLmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRGNoZWNraW4gPSBjaGVja2luU2VydmljZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCVN0cmluZyB2ZXJzaW9uID0gY2hlY2tpblNlcnZpY2UuZ2V0VmVyc2lvbigpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEY2hlY2tpbik7CisJCWFzc2VydEVxdWFscyh2ZXJzaW9uLCAiMC4xIik7CisKKwkJLy8gRG8gY2hlY2tvdXQKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZUNoZWNrb3V0ID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZUNoZWNrb3V0KTsKKwkJU2VydmljZSBjaGVja291dFNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZUNoZWNrb3V0LmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRGNoZWNrb3V0ID0gY2hlY2tvdXRTZXJ2aWNlLmdldEludmFyaWFudFVVSUQoKTsKKwkJdmVyc2lvbiA9IGNoZWNrb3V0U2VydmljZS5nZXRWZXJzaW9uKCk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGludmFyaWFudFVVSURjaGVja291dCk7CisJCWFzc2VydEVxdWFscyh2ZXJzaW9uLCAiMC4yIik7CisKKwkJLy8gZG8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2VDZXJ0aWZpY2F0aW9uUmVxdWVzdCA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsCisJCQkJc2RuY1VzZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2VDZXJ0aWZpY2F0aW9uUmVxdWVzdCk7CisJCVNlcnZpY2UgY2VydGlmaWNhdGlvblJlcXVlc3RTZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2VDZXJ0aWZpY2F0aW9uUmVxdWVzdC5nZXRSZXNwb25zZSgpKTsKKwkJU3RyaW5nIGludmFyaWFudFVVSURjZXJ0aWZpY2F0aW9uUmVxdWVzdCA9IGNlcnRpZmljYXRpb25SZXF1ZXN0U2VydmljZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCXZlcnNpb24gPSBjZXJ0aWZpY2F0aW9uUmVxdWVzdFNlcnZpY2UuZ2V0VmVyc2lvbigpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBpbnZhcmlhbnRVVUlEY2VydGlmaWNhdGlvblJlcXVlc3QpOworCQlhc3NlcnRFcXVhbHModmVyc2lvbiwgIjAuMiIpOworCisJCS8vIHN0YXJ0IGNlcnRpZmljYXRpb24KKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZVN0YXJ0Q2VydGlmaWNhdGlvbiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsCisJCQkJc2RuY1VzZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlU3RhcnRDZXJ0aWZpY2F0aW9uKTsKKwkJU2VydmljZSBzdGFydENlcnRpZmljYXRpb25SZXF1ZXN0U2VydmljZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlU3RhcnRDZXJ0aWZpY2F0aW9uLmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRFN0YXJ0Q2VydGlmaWNhdGlvbiA9IHN0YXJ0Q2VydGlmaWNhdGlvblJlcXVlc3RTZXJ2aWNlLmdldEludmFyaWFudFVVSUQoKTsKKwkJdmVyc2lvbiA9IHN0YXJ0Q2VydGlmaWNhdGlvblJlcXVlc3RTZXJ2aWNlLmdldFZlcnNpb24oKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgaW52YXJpYW50VVVJRFN0YXJ0Q2VydGlmaWNhdGlvbik7CisJCWFzc2VydEVxdWFscyh2ZXJzaW9uLCAiMC4yIik7CisKKwkJLy8gY2VydGlmeQorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlQ2VydGlmeSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZUNlcnRpZnkpOworCQlTZXJ2aWNlIGNlcnRpZnlTZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2VDZXJ0aWZ5LmdldFJlc3BvbnNlKCkpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRGNlcnRpZnkgPSBjZXJ0aWZ5U2VydmljZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCXZlcnNpb24gPSBjZXJ0aWZ5U2VydmljZS5nZXRWZXJzaW9uKCk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIGludmFyaWFudFVVSURjZXJ0aWZ5KTsKKwkJYXNzZXJ0RXF1YWxzKHZlcnNpb24sICIxLjAiKTsKKworCX0KKworCS8vIFVTNjcyMTI5IEJlbm55CisJcHJpdmF0ZSB2b2lkIGdldFNlcnZpY2VWYWxpZGF0ZUludmFyaWFudFV1aWQoU3RyaW5nIHNlcnZpY2VVbmlxdWVJZCwgU3RyaW5nIGludmFyaWFudFVVSURjcmVhdGlvbikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlVW5pcXVlSWQsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIGdldFNlcnZpY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQoZ2V0U2VydmljZSkpOworCX0KKworCUBUZXN0IC8vIGludmFyaWFudFVVSUQgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBjcmVhdGVkIGFuZCBuZXZlcgorCQkJLy8gY2hhbmdlZAorCXB1YmxpYyB2b2lkIHNlcnZpY2VJbnZhcmlhbnRVdWlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgZGVzaWduZXJVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJVXNlciB0ZXN0ZXJVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCVVzZXIgcG1Vc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlBST0RVQ1RfTUFOQUdFUjEpOworCQlDb21wb25lbnQgcmVzb3VyY2VEZXRhaWxzVkZDY29tcCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQsIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkZDY29tcCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCS8vIGNyZWF0ZSBzZXJ2aWNlCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZURldGFpbHMuc2V0SW52YXJpYW50VVVJRCgiMTIzNDU2Iik7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQkvLyBpbnZhcmlhbnRVVUlEIGdlbmVyYXRlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgY3JlYXRlZCBhbmQgbmV2ZXIKKwkJLy8gY2hhbmdlZAorCQlTdHJpbmcgaW52YXJpYW50VVVJRGNyZWF0aW9uID0gUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpOworCQkvLyBBZGQgVkYgaW5zdGFuY2UgdG8gc2VydmljZQorCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAsIHNlcnZpY2UsCisJCQkJVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJLy8gZ2V0IHJlc291cmNlIGFuZCB2ZXJpZnkgSW52YXJpYW50VXVpZCBpcyBub3QgY2hhbmdlZAorCQlnZXRTZXJ2aWNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBVcGRhdGUgc2VydmljZSB3aXRoIG5ldyBpbnZhcmlhbnQgVVVJRAorCQlyZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIGRlc2lnbmVyVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKHJlc3RSZXNwb25zZSkpOworCQlnZXRTZXJ2aWNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gQ2hlY2tpbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpKTsKKwkJZ2V0U2VydmljZVZhbGlkYXRlSW52YXJpYW50VXVpZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIENoZWNrb3V0CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIGRlc2lnbmVyVXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKHJlc3RSZXNwb25zZSkpOworCQlnZXRTZXJ2aWNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIGRlc2lnbmVyVXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKHJlc3RSZXNwb25zZSkpOworCQlnZXRTZXJ2aWNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCB0ZXN0ZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKHJlc3RSZXNwb25zZSkpOworCQlnZXRTZXJ2aWNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gY2VydGlmeQorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCB0ZXN0ZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFNlcnZpY2VWYWxpZGF0ZUludmFyaWFudFV1aWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyB1cGRhdGUgcmVzb3VyY2UKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgZGVzaWduZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJ1cGRhdGVkRGVzY3JpcHRpb24iKTsKKwkJcmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFNlcnZpY2VWYWxpZGF0ZUludmFyaWFudFV1aWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgZGVzaWduZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFNlcnZpY2VWYWxpZGF0ZUludmFyaWFudFV1aWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBDaGVja291dAorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpKTsKKwkJZ2V0U2VydmljZVZhbGlkYXRlSW52YXJpYW50VXVpZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIGNlcnRpZmljYXRpb24gcmVxdWVzdAorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpKTsKKwkJZ2V0U2VydmljZVZhbGlkYXRlSW52YXJpYW50VXVpZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIHN0YXJ0IGNlcnRpZmljYXRpb24KKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgdGVzdGVyVXNlciwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpKTsKKwkJZ2V0U2VydmljZVZhbGlkYXRlSW52YXJpYW50VXVpZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIGNhbmNlbCBjZXJ0aWZpY2F0aW9uCisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHRlc3RlclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DQU5DRUxDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKHJlc3RSZXNwb25zZSkpOworCQlnZXRTZXJ2aWNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCB0ZXN0ZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUywgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoaW52YXJpYW50VVVJRGNyZWF0aW9uLCBSZXNwb25zZVBhcnNlci5nZXRJbnZhcmlhbnRVdWlkKHJlc3RSZXNwb25zZSkpOworCQlnZXRTZXJ2aWNlVmFsaWRhdGVJbnZhcmlhbnRVdWlkKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGludmFyaWFudFVVSURjcmVhdGlvbik7CisKKwkJLy8gZmFpbHVyZQorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCB0ZXN0ZXJVc2VyLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uRkFJTENFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFNlcnZpY2VWYWxpZGF0ZUludmFyaWFudFV1aWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBDaGVja291dAorCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGludmFyaWFudFVVSURjcmVhdGlvbiwgUmVzcG9uc2VQYXJzZXIuZ2V0SW52YXJpYW50VXVpZChyZXN0UmVzcG9uc2UpKTsKKwkJZ2V0U2VydmljZVZhbGlkYXRlSW52YXJpYW50VXVpZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBpbnZhcmlhbnRVVUlEY3JlYXRpb24pOworCisJCS8vIENoZWNraW4KKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgZGVzaWduZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhpbnZhcmlhbnRVVUlEY3JlYXRpb24sIFJlc3BvbnNlUGFyc2VyLmdldEludmFyaWFudFV1aWQocmVzdFJlc3BvbnNlKSk7CisJCWdldFNlcnZpY2VWYWxpZGF0ZUludmFyaWFudFV1aWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCQkvLyBjcmVhdGUgaW5zdGFuY2UKKwkJUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UHJvZHVjdCgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5jcmVhdGVQcm9kdWN0KHByb2R1Y3REZXRhaWxzLCBwbVVzZXIpOworCQlhc3NlcnRFcXVhbHMoQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVELCBjcmVhdGVQcm9kdWN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBzZXJ2aWNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0Q29tcG9uZW50UmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlRGV0YWlscyk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXNlcnZpY2VJbnN0YW5jZVJlcURldGFpbHMsIHBtVXNlciwgcHJvZHVjdERldGFpbHMuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJY3JlYXRlU2VydmljZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWdldFNlcnZpY2VWYWxpZGF0ZUludmFyaWFudFV1aWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgaW52YXJpYW50VVVJRGNyZWF0aW9uKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9HZXRBbGxTZXJ2aWNlVmVyc2lvbnMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NlcnZpY2UvR2V0QWxsU2VydmljZVZlcnNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZDAwMgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NlcnZpY2UvR2V0QWxsU2VydmljZVZlcnNpb25zLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTYmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgR2V0QWxsU2VydmljZVZlcnNpb25zIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jRGVzaWduZXJEZXRhaWxzOworCXByb3RlY3RlZCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHMyOworCXByb3RlY3RlZCBVc2VyIHNkbmNBZG1pbkRldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0dvdmVybm9yRGVhdGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY1Rlc3RlckRldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY09wc0RldGFpbHM7CisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsczsKKwlwcm90ZWN0ZWQgQ29tcG9uZW50IHJlc291cmNlRGV0YWlsc1ZGQ2NvbXA7CisJcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZVNlcnY7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIEdldEFsbFNlcnZpY2VWZXJzaW9ucygpIHsKKwkJc3VwZXIobmFtZSwgR2V0QWxsU2VydmljZVZlcnNpb25zLmNsYXNzLmdldE5hbWUoKSk7CisJCTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlzZG5jRGVzaWduZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJc2RuY0Rlc2lnbmVyRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIyKTsKKwkJc2RuY0FkbWluRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNHb3Zlcm5vckRlYXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkdPVkVSTk9SKTsKKwkJc2RuY1Rlc3RlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJc2RuY09wc0RldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uT1BTKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZDY29tcCA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQsIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNWRkNjb21wLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKwkJc2VydmljZVNlcnYgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAsIHNlcnZpY2VTZXJ2LAorCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisKKwkJc2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoc2VydmljZVNlcnYpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBHZXRBbGxTZXJ2aWNlVmVyc2lvbnNfVmVyc2lvbjA1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBvcmlnVmVyc2lvbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJb3JpZ1ZlcnNpb25zTWFwLnB1dChzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCW9yaWdWZXJzaW9uc01hcC5wdXQoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQl9CisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2Ugc2VydmljZUdldFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRWZXJzaW9uc01hcCA9IHJlcy5nZXRBbGxWZXJzaW9ucygpOworCQlhc3NlcnRUcnVlKG9yaWdWZXJzaW9uc01hcC5lcXVhbHMoZ2V0VmVyc2lvbnNNYXApKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgR2V0QWxsU2VydmljZVZlcnNpb25zX1ZlcnNpb24wMSgpIHRocm93cyBFeGNlcHRpb24geworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlSZXN0UmVzcG9uc2Ugc2VydmljZUdldFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRWZXJzaW9uc01hcCA9IHJlcy5nZXRBbGxWZXJzaW9ucygpOworCQlhc3NlcnRUcnVlKG9yaWdWZXJzaW9uc01hcC5lcXVhbHMoZ2V0VmVyc2lvbnNNYXApKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIEdldEFsbFNlcnZpY2VWZXJzaW9uc19WZXJzaW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWZvciAoaW50IHggPSAwOyB4IDwgNDsgeCsrKSB7CisJCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQl9CisKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VTdGF0ZSA9IExDU2Jhc2VUZXN0LmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8gc2VydmljZVNlcnYuc2V0VW5pcXVlSWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCS8vIFJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlU3RhdGUgPQorCQkvLyBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlU2VydiwKKwkJLy8gVXNlclJvbGVFbnVtLkFETUlOLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIGZhbHNlKS5nZXRSaWdodCgpOworCisJCWFzc2VydFRydWUoImNlcnRpZnkgc2VydmljZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgY2hhbmdlU2VydmljZVN0YXRlLmdldEVycm9yQ29kZSgpLAorCQkJCWNoYW5nZVNlcnZpY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlvcmlnVmVyc2lvbnNNYXAucHV0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJZm9yIChpbnQgeCA9IDA7IHggPCA1OyB4KyspIHsKKwkJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCQlvcmlnVmVyc2lvbnNNYXAucHV0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJfQorCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2Ugc2VydmljZUdldFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwkJU2VydmljZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRWZXJzaW9uc01hcCA9IHJlcy5nZXRBbGxWZXJzaW9ucygpOworCQlhc3NlcnRUcnVlKG9yaWdWZXJzaW9uc01hcC5lcXVhbHMoZ2V0VmVyc2lvbnNNYXApKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIEdldEFsbFNlcnZpY2VWZXJzaW9uc19WZXJzaW9uMjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWZvciAoaW50IHggPSAwOyB4IDwgNDsgeCsrKSB7CisJCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQl9CisKKwkJLy8gZ2V0dGluZyB0byB2ZXJzaW9uIDEuMAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZVN0YXRlID0gTENTYmFzZVRlc3QuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnRUcnVlKCJjZXJ0aWZ5IHNlcnZpY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIGNoYW5nZVNlcnZpY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSwKKwkJCQljaGFuZ2VTZXJ2aWNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJb3JpZ1ZlcnNpb25zTWFwLnB1dChzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGdldHRpbmcgdG8gdmVyc2lvbiAxLjUKKwkJZm9yIChpbnQgeCA9IDA7IHggPCA1OyB4KyspIHsKKwkJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCX0KKworCQkvLyBnZXR0aW5nIHRvIHZlcnNpb24gMi4wCisJCWNoYW5nZVNlcnZpY2VTdGF0ZSA9IExDU2Jhc2VUZXN0LmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2VydGlmeSBzZXJ2aWNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyBjaGFuZ2VTZXJ2aWNlU3RhdGUuZ2V0RXJyb3JDb2RlKCksCisJCQkJY2hhbmdlU2VydmljZVN0YXRlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQkvLyBnZXR0aW5nIHRvIHZlcnNpb24gMi41CisJCWZvciAoaW50IHggPSAwOyB4IDwgNTsgeCsrKSB7CisJCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQkJb3JpZ1ZlcnNpb25zTWFwLnB1dChzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQl9CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlR2V0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMpOworCQlTZXJ2aWNlIHJlcyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCWFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgR2V0QWxsU2VydmljZVZlcnNpb25zX1JlYWR5Rm9yQ2VydGlmaWNhdGlvbl92ZXJzaW9uMDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCW9yaWdWZXJzaW9uc01hcC5wdXQoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJZm9yIChpbnQgeCA9IDA7IHggPCA0OyB4KyspIHsKKwkJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCQlvcmlnVmVyc2lvbnNNYXAucHV0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCX0KKworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0FkbWluRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCisJCS8vIHZhbGlkYXRlIGdldCByZXNwb25zZQorCQlSZXN0UmVzcG9uc2Ugc2VydmljZUdldFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwkJU2VydmljZSByZXMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRWZXJzaW9uc01hcCA9IHJlcy5nZXRBbGxWZXJzaW9ucygpOworCQlhc3NlcnRUcnVlKG9yaWdWZXJzaW9uc01hcC5lcXVhbHMoZ2V0VmVyc2lvbnNNYXApKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIEdldEFsbFNlcnZpY2VWZXJzaW9uc19DZXJ0aWZhY3Rpb25JblByb2dyZXNzX3ZlcnNpb24wNSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhZGRNYW5kYXRvcnlBcnRpZmFjdHNUb1NlcnZpY2UoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBvcmlnVmVyc2lvbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJb3JpZ1ZlcnNpb25zTWFwLnB1dChzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCW9yaWdWZXJzaW9uc01hcC5wdXQoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlR2V0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMpOworCQlTZXJ2aWNlIHJlcyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCWFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgR2V0QWxsU2VydmljZVZlcnNpb25zX0NlcnRpZmllZF92ZXJzaW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCS8vIGdldCB0byB2ZXJzaW9uIDAuNQorCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKworCQl9CisKKwkJLy8gZ2V0IHZlcnNpb24gMS4wCisJCVJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlU3RhdGUgPSBMQ1NiYXNlVGVzdC5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydFRydWUoImNlcnRpZnkgc2VydmljZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgY2hhbmdlU2VydmljZVN0YXRlLmdldEVycm9yQ29kZSgpLAorCQkJCWNoYW5nZVNlcnZpY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlvcmlnVmVyc2lvbnNNYXAucHV0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlR2V0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMpOworCQlTZXJ2aWNlIHJlcyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCWFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgR2V0QWxsU2VydmljZVZlcnNpb25zX0NlcnRpZmllZF92ZXJzaW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3JpZ1ZlcnNpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCS8vIGdldCB0byB2ZXJzaW9uIDAuNQorCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJfQorCisJCS8vIGdldCB2ZXJzaW9uIDEuMAorCQlSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZVN0YXRlID0gTENTYmFzZVRlc3QuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnRUcnVlKCJjZXJ0aWZ5IHNlcnZpY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIGNoYW5nZVNlcnZpY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSwKKwkJCQljaGFuZ2VTZXJ2aWNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKwkJb3JpZ1ZlcnNpb25zTWFwLnB1dChzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGdldCB2ZXJzaW9uIDEuNQorCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJfQorCisJCS8vIGdldCB2ZXJzaW9uIDIuMAorCQljaGFuZ2VTZXJ2aWNlU3RhdGUgPSBMQ1NiYXNlVGVzdC5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydFRydWUoImNlcnRpZnkgc2VydmljZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgY2hhbmdlU2VydmljZVN0YXRlLmdldEVycm9yQ29kZSgpLAorCQkJCWNoYW5nZVNlcnZpY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlvcmlnVmVyc2lvbnNNYXAucHV0KHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlR2V0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNBZG1pbkRldGFpbHMpOworCQlTZXJ2aWNlIHJlcyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZlcnNpb25zTWFwID0gcmVzLmdldEFsbFZlcnNpb25zKCk7CisJCWFzc2VydFRydWUob3JpZ1ZlcnNpb25zTWFwLmVxdWFscyhnZXRWZXJzaW9uc01hcCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgR2V0QWxsU2VydmljZVZlcnNpb25zX1NlcnZpY2VOb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlR2V0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoIjEyMzQ1Njc4OSIsIHNkbmNBZG1pbkRldGFpbHMpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5ELm5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgc2VydmljZSB3aXRob3V0IGNhY2hlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwKKwkJCQlzZXJ2aWNlR2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCIxMjM0NTY3ODkiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlzZXJ2aWNlR2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NlcnZpY2UvR2V0Q29tcG9uZW50QXVkaXRBcGlUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL0dldENvbXBvbmVudEF1ZGl0QXBpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDcyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL0dldENvbXBvbmVudEF1ZGl0QXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5XcmFwcGVyOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBHZXRDb21wb25lbnRBdWRpdEFwaVRlc3QgZXh0ZW5kcyBDb21wb25lbnRCYXNlVGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFU19BUEkgPSAic2VydmljZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFU19BUEkgPSAicmVzb3VyY2VzIjsKKworCXByb3RlY3RlZCBVc2VyIHNkbmNBZG1pblVzZXI7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyVXNlcjsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jVGVzdGVyVXNlcjsKKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgR2V0Q29tcG9uZW50QXVkaXRBcGlUZXN0KCkgeworCQlzdXBlcihuYW1lLCBHZXRDb21wb25lbnRBdWRpdEFwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwkvLyBpbiBjYXNlIHRlc3RzIGZhaWwsIHJ1biB0aGlzIG1ldGhvZCBhcyB0ZXN0IHRvIGNyZWF0ZSBtYXBwaW5nIGluIEVTCisJcHVibGljIHZvaWQgdXBkYXRlRWxhc3RpY1NlYXJjaE1hcHBpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlFaXRoZXI8U3RyaW5nLCBFeGNlcHRpb24+IGZpbGVDb250ZW50VVRGOCA9IEZpbGVVdGlscy5nZXRGaWxlQ29udGVudFVURjgoInNyY1xcdGVzdFxccmVzb3VyY2VzXFxDSVxcb3RoZXJcXG1hcHBpbmcuanNvbiIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGZpbGVDb250ZW50VVRGOC5pc0xlZnQoKSk7CisKKwkJZmluYWwgU3RyaW5nIEVTX1RFTVBMQVRFX1VSTCA9ICJodHRwOi8vJXM6JXMvX3RlbXBsYXRlL2F1ZGl0X3RlbXBsYXRlIjsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoRVNfVEVNUExBVEVfVVJMLCBjb25maWcuZ2V0RXNIb3N0KCksIGNvbmZpZy5nZXRFc1BvcnQoKSk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRIdHRwUG9zdCA9IG5ldyBIdHRwUmVxdWVzdCgpLnNlbmRIdHRwUG9zdCh1cmwsIGZpbGVDb250ZW50VVRGOC5sZWZ0KCkudmFsdWUoKSwgbnVsbCk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoc2VuZEh0dHBQb3N0LmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlzZG5jQWRtaW5Vc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJc2RuY0Rlc2lnbmVyVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCXNkbmNUZXN0ZXJVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNlcnZpY2VBdWRpdENlcnRpZmllZFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCVdyYXBwZXI8U3RyaW5nPiB2ZXJzaW9uWmVyb09uZUlEV3JhcHBlciA9IG5ldyBXcmFwcGVyPFN0cmluZz4oKSwgdmVyc2lvblplcm9Ud29JRFdyYXBwZXIgPSBuZXcgV3JhcHBlcjxTdHJpbmc+KCk7CisKKwkJY3JlYXRlQmFzaWNTZXJ2aWNlRm9yQXVkaXQodmVyc2lvblplcm9PbmVJRFdyYXBwZXIsIHZlcnNpb25aZXJvVHdvSURXcmFwcGVyLCBzZXJ2aWNlRGV0YWlscywgdHJ1ZSk7CisJCS8vIEZpcnN0IENlcnRpZmljYXRpb24KKworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQkvLyBMQ1NiYXNlVGVzdC5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscyk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLmVxdWFscygiMS4wIikpOworCisJCS8vIFNlY29uZCBDZXJ0aWZpY2F0aW9uCisJCWluY3JlYXNlU2VydmljZVZlcnNpb24oc2VydmljZURldGFpbHMsICIxLjEiKTsKKwkJaW5jcmVhc2VTZXJ2aWNlVmVyc2lvbihzZXJ2aWNlRGV0YWlscywgIjEuMiIpOworCQlpbmNyZWFzZVNlcnZpY2VWZXJzaW9uKHNlcnZpY2VEZXRhaWxzLCAiMS4zIik7CisJCWluY3JlYXNlU2VydmljZVZlcnNpb24oc2VydmljZURldGFpbHMsICIxLjQiKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkuZXF1YWxzKCIyLjAiKSk7CisJCVN0cmluZyBjZXJ0aWZpZWRJZCA9IHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCisJCUpzb25FbGVtZW50IGVsZW1lbnQgPSBnZXRBdWRpdEpzb24oU0VSVklDRVNfQVBJLCBjZXJ0aWZpZWRJZCk7CisJCS8vIGF1ZGl0cyBrZXB0OiA1KmNoZWNrIGlucyArIDQqY2hlY2sgb3V0cyArIDIqYXJ0aWZhY3QgcGF5bG9hZAorCQkvLyB1cGRhdGVzKHRvc2NhKSArIGNlcnRpZmljYXRpb24gcmVxdWVzdCArIGNlcnRpZmljYXRpb24gc3RhcnQgKworCQkvLyBjZXJ0aWZpY2F0aW9uIHN1Y2Nlc3MKKwkJLy8gKyAzIEEmQUkoQXJ0aWZhY3REZWxldGUsIEFydGlmYWN0VXBsb2FkLCBBcnRpZmFjdFVwZGF0ZSkKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQ6IDE3LCBhY3R1YWw6ICIgKyBlbGVtZW50LmdldEFzSnNvbkFycmF5KCkuc2l6ZSgpLCBlbGVtZW50LmdldEFzSnNvbkFycmF5KCkuc2l6ZSgpID09IDE3KTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIGNlcnRpZnlSZXNvdXJjZShSZXNvdXJjZVJlcURldGFpbHMgZGVmYXVsdFJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShkZWZhdWx0UmVzb3VyY2UsIHNkbmNEZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGRlZmF1bHRSZXNvdXJjZSwgc2RuY1Rlc3RlclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShkZWZhdWx0UmVzb3VyY2UsIHNkbmNUZXN0ZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCX0KKworCXByb3RlY3RlZCBKc29uRWxlbWVudCBnZXRBdWRpdEpzb24oU3RyaW5nIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkgeworCQkJeworCQkJCXB1dChDb25zdGFudHMuVVNFUl9JRF9IRUFERVIsIFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VySWQoKSk7CisJCQl9CisJCX07CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0NPTVBPTkVOVF9BVURJVF9SRUNPUkRTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCk7CisKKwkJUmVzdFJlc3BvbnNlIGh0dHBTZW5kR2V0ID0gbmV3IEh0dHBSZXF1ZXN0KCkuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShodHRwU2VuZEdldC5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwkJSnNvbkVsZW1lbnQgZWxlbWVudCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoaHR0cFNlbmRHZXQuZ2V0UmVzcG9uc2UoKSwgSnNvbkVsZW1lbnQuY2xhc3MpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGVsZW1lbnQuaXNKc29uQXJyYXkoKSk7CisJCXJldHVybiBlbGVtZW50OworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJhc2ljU2VydmljZUZvckF1ZGl0KFdyYXBwZXI8U3RyaW5nPiB2ZXJzaW9uWmVyb09uZUlEV3JhcHBlciwgV3JhcHBlcjxTdHJpbmc+IHZlcnNpb25aZXJvVHdvSURXcmFwcGVyLCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgQm9vbGVhbiB3aXRoUmVzSW5zdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBkZXNpZ25lclVzZXIgPSBzZG5jRGVzaWduZXJVc2VyOworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgZGVzaWduZXJVc2VyKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX0NSRUFURUQpOworCQl2ZXJzaW9uWmVyb09uZUlEV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJaWYgKHdpdGhSZXNJbnN0KSB7CisJCQlSZXNvdXJjZSByZXNvdXJjZU9iaiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULCByZXNvdXJjZU9iaiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKTsKKwkJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlT2JqLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisJCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlT2JqKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRDb21wb25lbnRJbnN0YW5jZSgpOworCQkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0Q29tcG9uZW50VWlkKHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lclVzZXIsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCisJCQkvLyBTZXJ2aWNlVXRpbHMuY3JlYXRlQ2VydFJlc291cmNlV2l0aERlcGxveW1lbnRBcnQoc2VydmljZURldGFpbHMsCisJCQkvLyAibXlSZXNvdXJjZSIpOworCQl9CisKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLmVxdWFscygiMC4xIikpOworCisJCXJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgZGVzaWduZXJVc2VyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwkJLy8gU2VydmljZVV0aWxzLmFkZFNlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3Qoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkJLy8gZGVzaWduZXJVc2VyKTsKKwkJdmVyc2lvblplcm9Ud29JRFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKS5lcXVhbHMoIjAuMiIpKTsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBkZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisKKwkJaW5jcmVhc2VTZXJ2aWNlVmVyc2lvbihzZXJ2aWNlRGV0YWlscywgIjAuMyIpOworCisJCWluY3JlYXNlU2VydmljZVZlcnNpb24oc2VydmljZURldGFpbHMsICIwLjQiKTsKKworCQlpbmNyZWFzZVNlcnZpY2VWZXJzaW9uKHNlcnZpY2VEZXRhaWxzLCAiMC41Iik7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbmNyZWFzZVNlcnZpY2VWZXJzaW9uKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzLCBTdHJpbmcgZXhjcGVjdGVkVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKS5lcXVhbHMoZXhjcGVjdGVkVmVyc2lvbikpOworCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQmFzaWNSZXNvdXJjZUZvckF1ZGl0KFdyYXBwZXI8U3RyaW5nPiB2ZXJzaW9uT25lUG9pbnRUd29JRFdyYXBwZXIsIFJlc291cmNlUmVxRGV0YWlscyBkZWZhdWx0UmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKGRlZmF1bHRSZXNvdXJjZSwgc2RuY0Rlc2lnbmVyVXNlcik7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19DUkVBVEVEKTsKKworCQkvLyBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWYgPSBuZXcKKwkJLy8gQXJ0aWZhY3RVdGlscygpLmNvbnN0cnVjdERlZmF1bHRBcnRpZmFjdEluZm8oKTsKKwkJLy8gcmVzcG9uc2UgPSByZXNvdXJjZVV0aWxzLmFkZF9hcnRpZmFjdChkZWZhdWx0UmVzb3VyY2UsCisJCS8vIHNkbmNEZXNpZ25lclVzZXIsIGRlZmF1bHRSZXNvdXJjZS5nZXRWZXJzaW9uKCksIGFydGlmYWN0RGVmKTsKKwkJLy8gYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlyZXNwb25zZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyVXNlciwgZGVmYXVsdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJhZGQgSEVBVCBhcnRpZmFjdCB0byByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShkZWZhdWx0UmVzb3VyY2UsIHNkbmNEZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisKKwkJaW5jcmVhc2VSZXNvdXJjZVZlcnNpb24oZGVmYXVsdFJlc291cmNlLCAiMC4yIik7CisKKwkJaW5jcmVhc2VSZXNvdXJjZVZlcnNpb24oZGVmYXVsdFJlc291cmNlLCAiMC4zIik7CisKKwkJaW5jcmVhc2VSZXNvdXJjZVZlcnNpb24oZGVmYXVsdFJlc291cmNlLCAiMC40Iik7CisKKwkJaW5jcmVhc2VSZXNvdXJjZVZlcnNpb24oZGVmYXVsdFJlc291cmNlLCAiMC41Iik7CisKKwkJY2VydGlmeVJlc291cmNlKGRlZmF1bHRSZXNvdXJjZSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoZGVmYXVsdFJlc291cmNlLmdldFZlcnNpb24oKS5lcXVhbHMoIjEuMCIpKTsKKworCQlpbmNyZWFzZVJlc291cmNlVmVyc2lvbihkZWZhdWx0UmVzb3VyY2UsICIxLjEiKTsKKworCQlpbmNyZWFzZVJlc291cmNlVmVyc2lvbihkZWZhdWx0UmVzb3VyY2UsICIxLjIiKTsKKwkJdmVyc2lvbk9uZVBvaW50VHdvSURXcmFwcGVyLnNldElubmVyRWxlbWVudChkZWZhdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJaW5jcmVhc2VSZXNvdXJjZVZlcnNpb24oZGVmYXVsdFJlc291cmNlLCAiMS4zIik7CisKKwkJaW5jcmVhc2VSZXNvdXJjZVZlcnNpb24oZGVmYXVsdFJlc291cmNlLCAiMS40Iik7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbmNyZWFzZVJlc291cmNlVmVyc2lvbihSZXNvdXJjZVJlcURldGFpbHMgZGVmYXVsdFJlc291cmNlLCBTdHJpbmcgZXhwZWN0ZWRWZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShkZWZhdWx0UmVzb3VyY2UsIHNkbmNEZXNpZ25lclVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGRlZmF1bHRSZXNvdXJjZS5nZXRWZXJzaW9uKCkuZXF1YWxzKGV4cGVjdGVkVmVyc2lvbikpOworCQlyZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGRlZmF1bHRSZXNvdXJjZSwgc2RuY0Rlc2lnbmVyVXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlQXVkaXRMYXN0VW5jZXJ0aWZpZWRWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlXcmFwcGVyPFN0cmluZz4gdmVyc2lvblplcm9PbmVJRFdyYXBwZXIgPSBuZXcgV3JhcHBlcjxTdHJpbmc+KCksIHZlcnNpb25aZXJvVHdvSURXcmFwcGVyID0gbmV3IFdyYXBwZXI8U3RyaW5nPigpOworCisJCWNyZWF0ZUJhc2ljU2VydmljZUZvckF1ZGl0KHZlcnNpb25aZXJvT25lSURXcmFwcGVyLCB2ZXJzaW9uWmVyb1R3b0lEV3JhcHBlciwgc2VydmljZURldGFpbHMsIGZhbHNlKTsKKworCQlKc29uRWxlbWVudCBlbGVtZW50ID0gZ2V0QXVkaXRKc29uKFNFUlZJQ0VTX0FQSSwgdmVyc2lvblplcm9Ud29JRFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCisJCWFzc2VydFRydWUoZWxlbWVudC5nZXRBc0pzb25BcnJheSgpLnNpemUoKSA9PSAzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNlcnZpY2VBdWRpdEZpcnN0VW5jZXJ0aWZpZWRWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlXcmFwcGVyPFN0cmluZz4gdmVyc2lvblplcm9PbmVJRFdyYXBwZXIgPSBuZXcgV3JhcHBlcjxTdHJpbmc+KCksIHZlcnNpb25aZXJvVHdvSURXcmFwcGVyID0gbmV3IFdyYXBwZXI8U3RyaW5nPigpOworCisJCWNyZWF0ZUJhc2ljU2VydmljZUZvckF1ZGl0KHZlcnNpb25aZXJvT25lSURXcmFwcGVyLCB2ZXJzaW9uWmVyb1R3b0lEV3JhcHBlciwgc2VydmljZURldGFpbHMsIGZhbHNlKTsKKworCQlKc29uRWxlbWVudCBlbGVtZW50ID0gZ2V0QXVkaXRKc29uKFNFUlZJQ0VTX0FQSSwgdmVyc2lvblplcm9PbmVJRFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCisJCWFzc2VydFRydWUoZWxlbWVudC5nZXRBc0pzb25BcnJheSgpLnNpemUoKSA9PSAzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXVkaXRVbmNlcnRpZmllZFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgZGVmYXVsdFJlc291cmNlID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCVdyYXBwZXI8U3RyaW5nPiB2ZXJzaW9uT25lUG9pbnRUd29JRFdyYXBwZXIgPSBuZXcgV3JhcHBlcjxTdHJpbmc+KCk7CisKKwkJY3JlYXRlQmFzaWNSZXNvdXJjZUZvckF1ZGl0KHZlcnNpb25PbmVQb2ludFR3b0lEV3JhcHBlciwgZGVmYXVsdFJlc291cmNlKTsKKworCQlKc29uRWxlbWVudCBlbGVtZW50ID0gZ2V0QXVkaXRKc29uKFJFU09VUkNFU19BUEksIHZlcnNpb25PbmVQb2ludFR3b0lEV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisKKwkJYXNzZXJ0VHJ1ZShlbGVtZW50LmdldEFzSnNvbkFycmF5KCkuc2l6ZSgpID09IDMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBdWRpdENlcnRpZmllZFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgZGVmYXVsdFJlc291cmNlID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCVdyYXBwZXI8U3RyaW5nPiB2ZXJzaW9uT25lUG9pbnRUd29JRFdyYXBwZXIgPSBuZXcgV3JhcHBlcjxTdHJpbmc+KCk7CisKKwkJY3JlYXRlQmFzaWNSZXNvdXJjZUZvckF1ZGl0KHZlcnNpb25PbmVQb2ludFR3b0lEV3JhcHBlciwgZGVmYXVsdFJlc291cmNlKTsKKworCQljZXJ0aWZ5UmVzb3VyY2UoZGVmYXVsdFJlc291cmNlKTsKKwkJYXNzZXJ0VHJ1ZShkZWZhdWx0UmVzb3VyY2UuZ2V0VmVyc2lvbigpLmVxdWFscygiMi4wIikpOworCQlTdHJpbmcgY2VydGlmaWVkSWQgPSBkZWZhdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlpbmNyZWFzZVJlc291cmNlVmVyc2lvbihkZWZhdWx0UmVzb3VyY2UsICIyLjEiKTsKKworCQlpbmNyZWFzZVJlc291cmNlVmVyc2lvbihkZWZhdWx0UmVzb3VyY2UsICIyLjIiKTsKKworCQlKc29uRWxlbWVudCBlbGVtZW50ID0gZ2V0QXVkaXRKc29uKFJFU09VUkNFU19BUEksIGNlcnRpZmllZElkKTsKKworCQlhc3NlcnRUcnVlKGVsZW1lbnQuZ2V0QXNKc29uQXJyYXkoKS5zaXplKCkgPT0gMTMpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL0dldFNlcnZpY2VMYXRlc3RWZXJzaW9uVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9HZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJlZDRkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9HZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDY4NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50SW5zdGFuY2VCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5TZXJ2aWNlQ2F0ZWdvcmllc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKKworcHVibGljIGNsYXNzIEdldFNlcnZpY2VMYXRlc3RWZXJzaW9uVGVzdCBleHRlbmRzIENvbXBvbmVudEluc3RhbmNlQmFzZVRlc3QgeworCisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBHZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvblRlc3QoKSB7CisJCXN1cGVyKG5hbWUsIEdldFNlcnZpY2VMYXRlc3RWZXJzaW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW5pdE1lbWJlcnMoKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkZDXzAxKTsKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQljaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQljcmVhdGVWRihyZXNvdXJjZURldGFpbHNWRl8wMSk7CisJCWNlcnRpZnlWZihyZXNvdXJjZURldGFpbHNWRl8wMSk7CisJCWNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOworCQljcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAyKTsKKwkJY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMyk7CisJCWNyZWF0ZVByb2R1Y3QocHJvZHVjdERldGFpbHNfMDEpOworCQljcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsgLy8gY3JlYXRlCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2VydGlmaWVkCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gVkYKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnN0YW5jZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2VydmljZQorCQkvKgorCQkgKiBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0KKwkJICogTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJICogc2RuY0Rlc2lnbmVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzLkNIRUNLSU4pOworCQkgKiBSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJICovCisJfQorCisJcHVibGljIHZvaWQgaW5pdE1lbWJlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlzZG5jUHNEZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX1NUUkFURUdJU1QxKTsKKwkJc2RuY1BtRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9NQU5BR0VSMSk7CisJCXNkbmNEZXNpZ25lckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzZG5jQWRtaW5EZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJc2RuY1Rlc3RlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZDXzAxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJWRkMxMDAiLCBOb3JtYXRpdmVUeXBlc0VudW0uQ09NUFVURSwKKwkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpLAorCQkJCVJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOyAvLyByZXNvdXJjZVR5cGUgPSBWRkMKKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoIlZGMTAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZURldGFpbHNDUF8wMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiQ1AxMDAiLCBOb3JtYXRpdmVUeXBlc0VudW0uUE9SVCwKKwkJCQlSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX05FVFdPUktfRUxFTUVOVFMsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJUmVzb3VyY2VUeXBlRW51bS5DUC50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkxfMDEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoIlZMMTAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLk5FVFdPUkssCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19ORVRXT1JLX0VMRU1FTlRTLCBzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpLAorCQkJCVJlc291cmNlVHlwZUVudW0uVkwudG9TdHJpbmcoKSk7CisJCXNlcnZpY2VEZXRhaWxzXzAxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoIm5ld3Rlc3RzZXJ2aWNlMSIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJc2VydmljZURldGFpbHNfMDIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgibmV3dGVzdHNlcnZpY2UyIiwgU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlzZXJ2aWNlRGV0YWlsc18wMyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCJuZXd0ZXN0c2VydmljZTMiLCBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFksCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCXByb2R1Y3REZXRhaWxzXzAxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFByb2R1Y3QoInByb2R1Y3QwMSIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uU2VydmljZUluQ2hlY2tPdXRTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvbkxpc3Qoc2RuY1BzRGV0YWlsczEpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlMaXN0PFNlcnZpY2U+IHNlcnZpY2VMaXN0ID0gcmVzdFJlc3BvbnNlVG9SZXNvdXJjZU9iamVjdExpc3QoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJU2VydmljZSBzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydE51bGwoIk5vIFNlcnZpY2UgcmV0dXJuZWQsIG9uZSBzZXJ2aWNlIGluIGNoZWNrb3V0IHN0YXRlIDAuMSIsIHNlcnZjaWVGcm9tTGlzdCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb25TZXJ2aWNlSW5DaGVja0luU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jUHNEZXRhaWxzMSk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCUxpc3Q8U2VydmljZT4gc2VydmljZUxpc3QgPSByZXN0UmVzcG9uc2VUb1Jlc291cmNlT2JqZWN0TGlzdChnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlhc3NlcnRUcnVlKHNlcnZpY2VMaXN0LnNpemUoKSA9PSAxKTsKKwkJU2VydmljZSBzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoc2VydmNpZUZyb21MaXN0LmdldFZlcnNpb24oKS5lcXVhbHMoIjAuMSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbkJ5UG0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jUG1EZXRhaWxzMSk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCUxpc3Q8U2VydmljZT4gc2VydmljZUxpc3QgPSByZXN0UmVzcG9uc2VUb1Jlc291cmNlT2JqZWN0TGlzdChnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlhc3NlcnRUcnVlKHNlcnZpY2VMaXN0LnNpemUoKSA9PSAxKTsKKwkJU2VydmljZSBzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoc2VydmNpZUZyb21MaXN0LmdldFZlcnNpb24oKS5lcXVhbHMoIjAuMSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbkJ5QWRtaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jQWRtaW5EZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMC4xIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uU2VydmljZTAyQ2hlY2tPdXRTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJRCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvbkxpc3Qoc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCUxpc3Q8U2VydmljZT4gc2VydmljZUxpc3QgPSByZXN0UmVzcG9uc2VUb1Jlc291cmNlT2JqZWN0TGlzdChnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlhc3NlcnRUcnVlKHNlcnZpY2VMaXN0LnNpemUoKSA9PSAxKTsKKwkJU2VydmljZSBzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZVVuaXF1ZUlEKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMC4xIikpOworCQlzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydE51bGwoc2VydmNpZUZyb21MaXN0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvblNlcnZpY2UwMkNoZWNrSW5TdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMC4yIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uU2VydmljZVdhaXRpbmdGb3JDZXJ0aWZpY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMC4yIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uU2VydmljZUNlcnRpZmljYXRpb25JblByb2dyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMC4yIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uU2VydmljZUNlcnRpZmljYXRpb25GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uRkFJTENFUlRJRklDQVRJT04pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbiA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUxhdGVzdFZlcnNpb25MaXN0KHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlMaXN0PFNlcnZpY2U+IHNlcnZpY2VMaXN0ID0gcmVzdFJlc3BvbnNlVG9SZXNvdXJjZU9iamVjdExpc3QoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlTGlzdC5zaXplKCkgPT0gMSk7CisJCVNlcnZpY2Ugc2VydmNpZUZyb21MaXN0ID0gZ2V0UmVzb3VyY2VPYmplY3RGcm9tUmVzb3VyY2VMaXN0QnlVaWQoc2VydmljZUxpc3QsIHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKHNlcnZjaWVGcm9tTGlzdC5nZXRWZXJzaW9uKCkuZXF1YWxzKCIwLjIiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb25TZXJ2aWNlQ2VydGlmZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvbkxpc3Qoc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCUxpc3Q8U2VydmljZT4gc2VydmljZUxpc3QgPSByZXN0UmVzcG9uc2VUb1Jlc291cmNlT2JqZWN0TGlzdChnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlhc3NlcnRUcnVlKHNlcnZpY2VMaXN0LnNpemUoKSA9PSAxKTsKKwkJU2VydmljZSBzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoc2VydmNpZUZyb21MaXN0LmdldFZlcnNpb24oKS5lcXVhbHMoIjEuMCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldExhdGVzdFZlcnNpb25TZXJ2aWNlSGFzU2V2ZXJhbENlcnRpZmVkVmVyc2lvbl8wMSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwb25zZTsKKwkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZEZyb21SZXNwb25zZSA9IG51bGw7CisJCWludCBudW1iZXJPZkNlcnRpZmllZFNlcnZpY2UgPSAzOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQ2VydGlmaWVkU2VydmljZTsgaSsrKSB7CisJCQljZXJ0aWZ5U2VydmljZVJlc3BvbnNlID0gY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOworCQkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2VydGlmeVNlcnZpY2VSZXNwb25zZSk7CisJCQlpZiAoaSA9PSAobnVtYmVyT2ZDZXJ0aWZpZWRTZXJ2aWNlIC0gMSkpIHsKKwkJCQlzZXJ2aWNlVW5pcXVlSWRGcm9tUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjZXJ0aWZ5U2VydmljZVJlc3BvbnNlKTsKKwkJCX0KKwkJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCX0KKwkJLy8gV2UgaGF2ZSBzZXJ2aWNlIHdpdGggZm9sbG93aW5nIHZlcnNpb25zIDogMS4wLCAyLjAgLDMuMCBhbmQKKwkJLy8gMy4xKGNoZWNrZWRPdXQpCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlVW5pcXVlSWRGcm9tUmVzcG9uc2UpOworCQlhc3NlcnRUcnVlKHNlcnZjaWVGcm9tTGlzdC5nZXRWZXJzaW9uKCkuZXF1YWxzKCIzLjAiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRMYXRlc3RWZXJzaW9uU2VydmljZUhhc1NldmVyYWxDZXJ0aWZlZFZlcnNpb25zMDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNlcnRpZnlTZXJ2aWNlUmVzcG9uc2U7CisJCWNlcnRpZnlTZXJ2aWNlUmVzcG9uc2UgPSBjZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNlcnRpZnlTZXJ2aWNlUmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJY2VydGlmeVNlcnZpY2VSZXNwb25zZSA9IGNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2VydGlmeVNlcnZpY2VSZXNwb25zZSk7CisJCS8vIFdlIGhhdmUgc2VydmljZSB3aXRoIGZvbGxvd2luZyB2ZXJzaW9ucyA6IDEuMCwgMi4wCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMi4wIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0TGF0ZXN0VmVyc2lvblNlcnZpY2VDZXJ0aWZlZFdhc0NoZWNrZWRPdXRBbmRDaGVja2VkaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNlcnRpZnlTZXJ2aWNlUmVzcG9uc2U7CisJCWludCBudW1iZXJPZkNlcnRpZmllZFNlcnZpY2UgPSAzOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQ2VydGlmaWVkU2VydmljZTsgaSsrKSB7CisJCQljZXJ0aWZ5U2VydmljZVJlc3BvbnNlID0gY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOworCQkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoY2VydGlmeVNlcnZpY2VSZXNwb25zZSk7CisJCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQl9CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCS8vIFdlIGhhdmUgc2VydmljZSB3aXRoIGZvbGxvd2luZyB2ZXJzaW9ucyA6IDEuMCwgMi4wIGFuZCAyLjEoY2hlY2tlZEluKQorCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvbkxpc3Qoc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCUxpc3Q8U2VydmljZT4gc2VydmljZUxpc3QgPSByZXN0UmVzcG9uc2VUb1Jlc291cmNlT2JqZWN0TGlzdChnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlhc3NlcnRUcnVlKHNlcnZpY2VMaXN0LnNpemUoKSA9PSAxKTsKKwkJU2VydmljZSBzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoc2VydmNpZUZyb21MaXN0LmdldFZlcnNpb24oKS5lcXVhbHMoIjMuMSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldExhdGVzdFZlcnNpb25TZXJ2aWNlQ2hlY2tPdXRDZXJ0aWZlZFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTsKKwkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZEZyb21SZXNwb25zZSA9IG51bGw7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3BvbnNlID0gY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjZXJ0aWZ5U2VydmljZVJlc3BvbnNlKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJCWlmIChpID09ICgxMCkpIHsKKwkJCQlzZXJ2aWNlVW5pcXVlSWRGcm9tUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShyZXN0UmVzcG9uc2UpOworCQkJfQorCQl9CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCS8vIFdlIGhhdmUgc2VydmljZSB3aXRoIGZvbGxvd2luZyB2ZXJzaW9ucyA6IDEuMCBhbmQgMS4xMShDaGVjay1vdXQpCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlVW5pcXVlSWRGcm9tUmVzcG9uc2UpOworCQlhc3NlcnRUcnVlKHNlcnZjaWVGcm9tTGlzdC5nZXRWZXJzaW9uKCkuZXF1YWxzKCIxLjExIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0TGF0ZXN0VmVyc2lvblNlcnZpY2VDaGVja091dENoZWNrSW5DZXJ0aWZlZFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZTsKKwkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZEZyb21SZXNwb25zZSA9IG51bGw7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5U2VydmljZVJlc3BvbnNlID0gY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjZXJ0aWZ5U2VydmljZVJlc3BvbnNlKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJCWlmIChpID09ICgxMSkpIHsKKwkJCQlzZXJ2aWNlVW5pcXVlSWRGcm9tUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShyZXN0UmVzcG9uc2UpOworCQkJfQorCQl9CisJCS8vIFdlIGhhdmUgc2VydmljZSB3aXRoIGZvbGxvd2luZyB2ZXJzaW9ucyA6IDEuMCBhbmQgMS4xMShDaGVjay1vdXQpCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlVW5pcXVlSWRGcm9tUmVzcG9uc2UpOworCQlhc3NlcnRUcnVlKHNlcnZjaWVGcm9tTGlzdC5nZXRWZXJzaW9uKCkuZXF1YWxzKCIxLjEyIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0TGF0ZXN0VmVyc2lvblNlcnZpY2VDZXJ0aWZlZENoZWNrZWRPdXRBbmRJbldhaXRpbmdGb3JDZXJ0aWZpY2F0aW9uU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEpOyAvLyAxLjAKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJLy8gV2UgaGF2ZSBzZXJ2aWNlIHdpdGggZm9sbG93aW5nIHZlcnNpb25zIDogMS4wIGFuZCAxLjEoV2FpdGluZyBGb3IKKwkJLy8gQ2VydGlmaWNhdGlvbikKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbiA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUxhdGVzdFZlcnNpb25MaXN0KHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlMaXN0PFNlcnZpY2U+IHNlcnZpY2VMaXN0ID0gcmVzdFJlc3BvbnNlVG9SZXNvdXJjZU9iamVjdExpc3QoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlTGlzdC5zaXplKCkgPT0gMSk7CisJCVNlcnZpY2Ugc2VydmNpZUZyb21MaXN0ID0gZ2V0UmVzb3VyY2VPYmplY3RGcm9tUmVzb3VyY2VMaXN0QnlVaWQoc2VydmljZUxpc3QsIHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKHNlcnZjaWVGcm9tTGlzdC5nZXRWZXJzaW9uKCkuZXF1YWxzKCIxLjEiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRMYXRlc3RWZXJzaW9uU2VydmljZUNlcnRpZmVkQ2hlY2tlZE91dEFuZEluQ2VydGlmaWNhdGlvbkluUHJvZ3Jlc3NTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSk7IC8vIDEuMAorCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jVGVzdGVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCS8vIFdlIGhhdmUgc2VydmljZSB3aXRoIGZvbGxvd2luZyB2ZXJzaW9ucyA6IDEuMCBhbmQgMS4xKENlcnRpZmljYXRpb24KKwkJLy8gSW4gUHJvZ3Jlc3MpCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHJlc3RSZXNwb25zZVRvUmVzb3VyY2VPYmplY3RMaXN0KGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbik7CisJCWFzc2VydFRydWUoc2VydmljZUxpc3Quc2l6ZSgpID09IDEpOworCQlTZXJ2aWNlIHNlcnZjaWVGcm9tTGlzdCA9IGdldFJlc291cmNlT2JqZWN0RnJvbVJlc291cmNlTGlzdEJ5VWlkKHNlcnZpY2VMaXN0LCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMS4xIikpOworCX0KKworCS8vIERFMTkwODE4CisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldExhdGVzdFZlcnNpb25CeU5vbkFzZGNVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgbm9uQXNkY1VzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlub25Bc2RjVXNlci5zZXRVc2VySWQoImdnNzUwZyIpOworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvbkxpc3Qobm9uQXNkY1VzZXIpOworCQlhc3NlcnRUcnVlKGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbi5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24uZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJLy8gREUxOTA4MTgKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0TGF0ZXN0VmVyc2lvblVzZXJJZElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBub25Bc2RjVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCW5vbkFzZGNVc2VyLnNldFVzZXJJZCgiIik7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24gPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VMYXRlc3RWZXJzaW9uTGlzdChub25Bc2RjVXNlcik7CisJCWFzc2VydFRydWUoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1JFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTi5uYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCWdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbkJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvbkxpc3Qoc2RuY1Rlc3RlckRldGFpbHMpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlMaXN0PFNlcnZpY2U+IHNlcnZpY2VMaXN0ID0gcmVzdFJlc3BvbnNlVG9SZXNvdXJjZU9iamVjdExpc3QoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlTGlzdC5zaXplKCkgPT0gMSk7CisJCVNlcnZpY2Ugc2VydmNpZUZyb21MaXN0ID0gZ2V0UmVzb3VyY2VPYmplY3RGcm9tUmVzb3VyY2VMaXN0QnlVaWQoc2VydmljZUxpc3QsIHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKHNlcnZjaWVGcm9tTGlzdC5nZXRWZXJzaW9uKCkuZXF1YWxzKCIwLjEiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRMYXRlc3RWZXJzaW9uU2V2ZXJhbFNlcnZpY2VzSW5EaWZmZXJlbnRWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBjZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSk7IC8vIDEuMAorCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBjZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlMV9VbmlxdWVJZEZyb21SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7IC8vIHNlcnZpY2VEZXRhaWxzXzAxCisJCQkJCQkJCQkJCQkJCS8vIHZlcnNpb24gaXMgMi4xCisJCQkJCQkJCQkJCQkJCS8vIChjaGVjay1vdXQpCisKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAyLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7IC8vIHNlcnZpY2VEZXRhaWxzXzAyCisJCQkJCQkJCQkJCQkJCS8vIHZlcnNpb24gMC4yCisJCQkJCQkJCQkJCQkJCS8vIChDaGVjay1pbikKKworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCVN0cmluZyBzZXJ2aWNlM19VbmlxdWVJZEZyb21SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7IC8vIHNlcnZpY2VEZXRhaWxzXzAzCisJCQkJCQkJCQkJCQkJCS8vIHZlcnNpb24gMC4yCisJCQkJCQkJCQkJCQkJCS8vIChDaGVjay1vdXQpCisKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VzTGF0ZXN0VmVyc2lvbiA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUxhdGVzdFZlcnNpb25MaXN0KHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRTZXJ2aWNlc0xhdGVzdFZlcnNpb24pOworCQlMaXN0PFNlcnZpY2U+IHNlcnZpY2VMaXN0ID0gcmVzdFJlc3BvbnNlVG9SZXNvdXJjZU9iamVjdExpc3QoZ2V0U2VydmljZXNMYXRlc3RWZXJzaW9uKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlTGlzdC5zaXplKCkgPT0gMyk7CisJCVNlcnZpY2Ugc2VydmNpZUZyb21MaXN0ID0gZ2V0UmVzb3VyY2VPYmplY3RGcm9tUmVzb3VyY2VMaXN0QnlVaWQoc2VydmljZUxpc3QsIHNlcnZpY2UxX1VuaXF1ZUlkRnJvbVJlc3BvbnNlKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMi4wIikpOworCQlzZXJ2Y2llRnJvbUxpc3QgPSBnZXRSZXNvdXJjZU9iamVjdEZyb21SZXNvdXJjZUxpc3RCeVVpZChzZXJ2aWNlTGlzdCwgc2VydmljZURldGFpbHNfMDIuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoc2VydmNpZUZyb21MaXN0LmdldFZlcnNpb24oKS5lcXVhbHMoIjAuMiIpKTsKKwkJc2VydmNpZUZyb21MaXN0ID0gZ2V0UmVzb3VyY2VPYmplY3RGcm9tUmVzb3VyY2VMaXN0QnlVaWQoc2VydmljZUxpc3QsIHNlcnZpY2UzX1VuaXF1ZUlkRnJvbVJlc3BvbnNlKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2Y2llRnJvbUxpc3QuZ2V0VmVyc2lvbigpLmVxdWFscygiMC4xIikpOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGNlcnRpZnlTZXJ2aWNlKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJU2VydmljZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVGVzdGVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCVNlcnZpY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJldHVybiByZXN0UmVzcG9uc2U7CisJfQorCisJcHJvdGVjdGVkIExpc3Q8U2VydmljZT4gcmVzdFJlc3BvbnNlVG9SZXNvdXJjZU9iamVjdExpc3QoUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSkgeworCQlKc29uRWxlbWVudCBqZWxlbWVudCA9IG5ldyBKc29uUGFyc2VyKCkucGFyc2UocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlKc29uQXJyYXkganNvbkFycmF5ID0gamVsZW1lbnQuZ2V0QXNKc29uQXJyYXkoKTsKKwkJTGlzdDxTZXJ2aWNlPiByZXN0UmVzcG9uc2VBcnJheSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGpzb25BcnJheS5zaXplKCk7IGkrKykgeworCQkJU3RyaW5nIHNlcnZpY2VTdHJpbmcgPSAoU3RyaW5nKSBqc29uQXJyYXkuZ2V0KGkpLnRvU3RyaW5nKCk7CisJCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlU3RyaW5nKTsKKwkJCXJlc3RSZXNwb25zZUFycmF5LmFkZChzZXJ2aWNlKTsKKwkJfQorCQlyZXR1cm4gcmVzdFJlc3BvbnNlQXJyYXk7CisJfQorCisJcHJvdGVjdGVkIFNlcnZpY2UgZ2V0UmVzb3VyY2VPYmplY3RGcm9tUmVzb3VyY2VMaXN0QnlVaWQoTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCwgU3RyaW5nIHVpZCkgeworCQlpZiAoc2VydmljZUxpc3QgIT0gbnVsbCAmJiBzZXJ2aWNlTGlzdC5zaXplKCkgPiAwKSB7CisJCQlmb3IgKFNlcnZpY2Ugc2VydmljZSA6IHNlcnZpY2VMaXN0KSB7CisJCQkJaWYgKHNlcnZpY2UuZ2V0VW5pcXVlSWQoKS5lcXVhbHModWlkKSkKKwkJCQkJcmV0dXJuIHNlcnZpY2U7CisJCQl9CisJCX0gZWxzZQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZChSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlpZiAocmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCQkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jVGVzdGVyRGV0YWlscywKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQl9IGVsc2UKKwkJCXJldHVybiByZXN0UmVzcG9uc2U7CisJCWlmIChyZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNUZXN0ZXJEZXRhaWxzLAorCQkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlkpOworCQkJaWYgKHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCQlTdHJpbmcgbmV3VmVyc2lvbiA9IFJlc3BvbnNlUGFyc2VyLmdldFZlcnNpb25Gcm9tUmVzcG9uc2UocmVzdFJlc3BvbnNlKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKHNkbmNUZXN0ZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShzZG5jVGVzdGVyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJCQlTdHJpbmcgdW5pcXVlSWRGcm9tUnJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCQkJInVuaXF1ZUlkIik7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKHVuaXF1ZUlkRnJvbVJyZXNwb25zZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKwl9CisKKwkvLyBwcml2YXRlIHZvaWQgY2VydGlmeVZmKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPQorCS8vIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChyZXNvdXJjZSwgcmVzb3VyY2VEZXRhaWxzVkZDXzAxLAorCS8vIHNkbmNEZXNpZ25lckRldGFpbHMpOworCS8vIFJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJLy8gY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9CisJLy8gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRkR1cmluZ1NldHVwKHJlc291cmNlLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkvLyBSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCS8vIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPQorCS8vIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChyZXNvdXJjZSwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsCisJLy8gc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJLy8gUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkvLyAvL2NyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlLCByZXNvdXJjZSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJLy8gUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0KKwkvLyBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsCisJLy8gc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJLy8gUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3BvbnNlKTsKKwkvLyBSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkID0KKwkvLyBjaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQocmVzb3VyY2UpOworCS8vIFJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhjaGFuZ2VSZXNvdXJjZVN0YXRlVG9DZXJ0aWZpZWQpOworCS8vIH0KKworCXByaXZhdGUgdm9pZCBjZXJ0aWZ5VmYoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGRHVyaW5nU2V0dXAocmVzb3VyY2UsIHJlc291cmNlRGV0YWlsc0NQXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgY3BDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChyZXNvdXJjZSwgcmVzb3VyY2VEZXRhaWxzVkZDXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgY29tcHV0ZUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JWRkR1cmluZ1NldHVwKHJlc291cmNlLCByZXNvdXJjZURldGFpbHNWTF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJU3RyaW5nIHZsQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCisJCS8vIEZpeGluZyBWbC9DcCByZXEvY2FwCisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0U7CisJCVVzZXIgdXNlciA9IHNkbmNEZXNpZ25lckRldGFpbHM7CisJCWZ1bGZpbGxDcFJlcXVpcmVtZW50KHJlc291cmNlLCBjcENvbXBJbnN0SWQsIGNvbXB1dGVDb21wSW5zdElkLCBjb21wdXRlQ29tcEluc3RJZCwgdXNlciwgY29udGFpbmVyQ29tcFR5cGUpOworCQljb25zdW1lVmxDYXBhYmlsaXR5KHJlc291cmNlLCBjcENvbXBJbnN0SWQsIHZsQ29tcEluc3RJZCwgY3BDb21wSW5zdElkLCB1c2VyLCBjb250YWluZXJDb21wVHlwZSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzcG9uc2UpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkID0gY2hhbmdlUmVzb3VyY2VTdGF0ZVRvQ2VydGlmaWVkKHJlc291cmNlKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGNoYW5nZVJlc291cmNlU3RhdGVUb0NlcnRpZmllZCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL1JlcUNhcE9jY3VycmVuY2VzVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9SZXFDYXBPY2N1cnJlbmNlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjFkZWFmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9SZXFDYXBPY2N1cnJlbmNlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDExOTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1M7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNsaWVudFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwUmVxRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZWxhdGlvbnNoaXBJbXBsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50SW5zdGFuY2VCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuSW1wb3J0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5TZXJ2aWNlQ2F0ZWdvcmllc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkltcG9ydFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXFDYXBPY2N1cnJlbmNlc1Rlc3QgZXh0ZW5kcyBDb21wb25lbnRJbnN0YW5jZUJhc2VUZXN0IHsKKworCXByaXZhdGUgSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzMTsgLy8gYXRvbWljIHJlc291cmNlCisJcHJpdmF0ZSBJbXBvcnRSZXFEZXRhaWxzIGltcG9ydFJlcURldGFpbHMyOworCXByaXZhdGUgSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzMzsKKwlwcml2YXRlIEltcG9ydFJlcURldGFpbHMgaW1wb3J0UmVxRGV0YWlsczQ7CisJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZVZGQzE7CisJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZVZGQzI7CisJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZVZGQzM7CisJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZVZGQzQ7CisJcHJpdmF0ZSBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkYxMDA7CisJcHJpdmF0ZSBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkYyMDA7CisJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZVZGMTAwOworCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2VWRjIwMDsKKwlwcm90ZWN0ZWQgU3RyaW5nIHRlc3RSZXNvdXJjZXNQYXRoOworCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBpbXBvcnRZbWxXaXRoUmVxMTEgPSAic29mdHdhcmVDb21wb25lbnRSZXExMS55bWwiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW1wb3J0WW1sV2l0aFJlcTEyID0gInNvZnR3YXJlQ29tcG9uZW50UmVxMTIueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGltcG9ydFltbFdpdGhDYXAxMSA9ICJjb21wdXRlQ2FwMTEueW1sIjsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGltcG9ydFltbFdpdGhDYXAxVW5ib3VuZGVkID0gImNvbXB1dGVDYXAxVU5CT1VOREVELnltbCI7CisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlID0gInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiOworCisJcHVibGljIFJlcUNhcE9jY3VycmVuY2VzVGVzdCgpIHsKKwkJc3VwZXIobmV3IFRlc3ROYW1lKCksIFJlcUNhcE9jY3VycmVuY2VzVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gRG8gbm90IHVzZSBjYWxsIGluaXQoKSBmcm9tIENvbXBvbmVudEluc3RhbmNlQmFzZVRlc3QKKwkJZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PigpOworCQlleHBlY3RlZENvbnRhaW5lclJlcXVpcmVtZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PigpOworCQlyZW1vdmVkUmVxdWlyZW1lbnRzID0gbmV3IEhhc2hNYXA8PigpOworCQlleHBlY3RlZENvbnRJbnN0UmVxQ2FwID0gbmV3IEhhc2hNYXA8PigpOworCisJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlOworCQlzZG5jRGVzaWduZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJc2RuY0FkbWluRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCS8vIGltcG9ydCB5bWwgZmlsZSBsb2NhdGlvbgorCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldFJlc291cmNlQ29uZmlnRGlyKCk7CisJCWZpbmFsIFN0cmluZyB3b3JrRGlyID0gImltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybCI7CisJCXRlc3RSZXNvdXJjZXNQYXRoID0gc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyB3b3JrRGlyOworCQkvLy8vLyBDcmVhdGUgYXRvbWljIHJlc291cmNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCS8vIGltcG9ydCBWRkMxIHdpdGggUmVxdWlyZW1lbnRzIDogTUlOPTEgTUFYPTIKKwkJLy8vLy8gKHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIpCisJCWltcG9ydFJlcURldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCJWRkMxIik7CisJCWltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBpbXBvcnRlZFJlc291cmNlKGltcG9ydFJlcURldGFpbHMxLCBpbXBvcnRZbWxXaXRoUmVxMTIpOworCQkvLyByZXNvdXJjZVZGQzEgPQorCQkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChpbXBvcnRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUoaW1wb3J0UmVxRGV0YWlsczEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJcmVzb3VyY2VWRkMxID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBpbXBvcnQgVkZDMiB3aXRoIENhcGFiaWxpdGllcyA6IE1JTiAxIE1BWCBVTkJPVU5ERUQKKwkJLy8gKHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIpCisJCWltcG9ydFJlcURldGFpbHMyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCJWRkMyIik7CisJCWltcG9ydFJlc291cmNlUmVzcG9uc2UgPSBpbXBvcnRlZFJlc291cmNlKGltcG9ydFJlcURldGFpbHMyLCBpbXBvcnRZbWxXaXRoQ2FwMVVuYm91bmRlZCk7CisJCS8vIHJlc291cmNlVkZDMiA9CisJCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMyLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCXJlc291cmNlVkZDMiA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gaW1wb3J0IFZGQzMgd2l0aCBDYXBhYmlsaXRpZXMgOiBNSU4gMSBNQVggMQorCQkvLyAodG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcikKKwkJaW1wb3J0UmVxRGV0YWlsczMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoIlZGQzMiKTsKKwkJaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IGltcG9ydGVkUmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlsczMsIGltcG9ydFltbFdpdGhDYXAxMSk7CisJCS8vIHJlc291cmNlVkZDMyA9CisJCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHMzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCXJlc291cmNlVkZDMyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gaW1wb3J0IFZGQzQgd2l0aCBSZXF1aXJlbWVudHMgOiBNSU4gMSBNQVggMQorCQkvLyAodG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcikKKwkJaW1wb3J0UmVxRGV0YWlsczQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoIlZGQzQiKTsKKwkJaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IGltcG9ydGVkUmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlsczQsIGltcG9ydFltbFdpdGhSZXExMSk7CisJCS8vIHJlc291cmNlVkZDNCA9CisJCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGltcG9ydFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKGltcG9ydFJlcURldGFpbHM0LCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCXJlc291cmNlVkZDNCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBjcmVhdGUgVkYxMDAKKwkJcmVzb3VyY2VEZXRhaWxzVkYxMDAgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoIlZGMTAwMCIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULAorCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJUmVzb3VyY2VUeXBlRW51bS5WRi50b1N0cmluZygpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlVkYxMDAgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRjEwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VWRjEwMCk7CisJCS8vIGNyZWF0ZSBWRjIwMAorCQlyZXNvdXJjZURldGFpbHNWRjIwMCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZSgiVkYyMDAwIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VWRjIwMCA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGMjAwLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZVZGMjAwKTsKKwkJLy8gQ3JlYXRlIFNlcnZpY2UKKwkJc2VydmljZURldGFpbHNfMDEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgibmV3dGVzdHNlcnZpY2UxIiwgU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZVJlc3RSZXNwb25zZSk7CisKKwl9CisKKwkvLyBVUzYyODUxNCBDYXBhYmlsaXR5L1JlcXVpcmVtZW50ICJPY2N1cnJlbmNlcyIgYXR0cmlidXRlIGluIENSRUFURS9ERUxFVEUKKwkvLyBSZWxhdGlvbiBBUElzCisJLy8gQ29udGFpbmVyID0gU0VSVklDRSAsIENvbnRhaW5lciBpbnN0YW5jZSA9IFZGCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXBBbmRSZXFPY2N1cnJlbmNlc0luU2VydmljZUFuZEhpc0luc3RhbmNlc05vQXNzb2NpYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2U7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMxIChSZXEgTUlOPTEgTUFYPTIpIHRvIFZGMTAwMAorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZVJlcSk7CisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjEwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMyMSAoQ2FwIE1JTj0xIE1BWD1VTkJPVU5ERUQpIHRvIFZGMjAwMAorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMyLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMjAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZUNhcCk7CisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjIwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjIwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIENoZWNrLUluIGJvdGggVkZzCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRjEwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCS8vIENyZWF0ZSBWRiBpbnN0YW5jZXMKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGMTAwLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRjIwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCS8vIGdldCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjEiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjIiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjEiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIlVOQk9VTkRFRCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHNlcnZpY2UsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsIGNvbnRhaW5lck1pblJlcSwKKwkJCQljb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhzZXJ2aWNlLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkYyMDAsIHJlc291cmNlVkYxMDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZUluc3RhbmNlQXNzb2NpYXRpb25SZXFNYXhPY2N1cnJlbmNlc05vdFJlYWNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2U7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMxIChSZXEgTUlOPTEgTUFYPTIpIHRvIFZGMTAwMAorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZVJlcSk7CisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjEwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMyIChDYXAgTUlOPTEgTUFYPVVOQk9VTkRFRCkgdG8gVkYyMDAwCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczIsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYyMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlQ2FwKTsKKwkJZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMjAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMjAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gQ2hlY2stSW4gYm90aCBWRnMKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGMTAwLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRjIwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJLy8gQ3JlYXRlIFZGIGluc3RhbmNlcworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkYxMDAsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyBmcm9tQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRjIwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyB0b0NvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJLy8gYXNzb2NpYXRlIDIgVkZzCisJCVN0cmluZyBjYXBUeXBlID0gY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZTsKKwkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzb3VyY2VSZXNwb25zZSk7CisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoY2FwVHlwZSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24oZnJvbUNvbXBJbnN0SWQsIHRvQ29tcEluc3RJZCwgY2FwVHlwZSwgcmVxTmFtZSwKKwkJCQljYXBMaXN0LCByZXFMaXN0LCBjb21wb25lbnRJbnN0YW5jZVJlcS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJbnN0YW5jZUNhcC5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc29jaWF0ZUluc3RhbmNlcyk7CisJCS8vIGdldCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjEiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIlVOQk9VTkRFRCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHNlcnZpY2UsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsIGNvbnRhaW5lck1pblJlcSwKKwkJCQljb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhzZXJ2aWNlLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkYyMDAsIHJlc291cmNlVkYxMDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZUluc3RhbmNlQXNzb2NpYXRpb25SZXFNYXhPY2N1cnJlbmNlc0lzUmVhY2hlZCgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzQgKFJlcSBNSU49MSBNQVg9MSkgdG8gVkYxMDAwCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczQsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlUmVxKTsKKwkJZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMTAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzIgKENhcCBNSU49MSBNQVg9VU5CT1VOREVEKSB0byBWRjIwMDAKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjIwMCk7CisJCWFzc2VydE5vdE51bGwoY29tcG9uZW50SW5zdGFuY2VDYXApOworCQlnZXRSZXNvdXJzZVJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYyMDAuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlVkYyMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBDaGVjay1JbiBib3RoIFZGcworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYxMDAsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGMjAwLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQkvLyBDcmVhdGUgVkYgaW5zdGFuY2VzCisJCVJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRjEwMCwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJU3RyaW5nIGZyb21Db21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCWNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGMjAwLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJU3RyaW5nIHRvQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQkvLyBhc3NvY2lhdGUgMiBWRnMKKwkJU3RyaW5nIGNhcFR5cGUgPSBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlOworCQlTdHJpbmcgcmVxTmFtZSA9ICJob3N0IjsKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRSZXNvdXJjZVJlc3BvbnNlKTsKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpLmdldChjYXBUeXBlKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3QgPSBjYXBSZXFEZWYuZ2V0UmVxdWlyZW1lbnRzKCkuZ2V0KGNhcFR5cGUpOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihmcm9tQ29tcEluc3RJZCwgdG9Db21wSW5zdElkLCBjYXBUeXBlLCByZXFOYW1lLAorCQkJCWNhcExpc3QsIHJlcUxpc3QsIGNvbXBvbmVudEluc3RhbmNlUmVxLmdldFVuaXF1ZUlkKCksIGNvbXBvbmVudEluc3RhbmNlQ2FwLmdldFVuaXF1ZUlkKCkpOworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzb2NpYXRlSW5zdGFuY2VzKTsKKwkJLy8gZ2V0IHNlcnZpY2UKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRTZXJ2aWNlUmVzcG9uc2UpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0U2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQkvLyBWZXJpZnkgQ29udGFpbmVyIHJlcXVpcmVtZW50cyBhbmQgQ2FwYWJpbGl0aWVzCisJCVN0cmluZyBjb250YWluZXJNaW5SZXEgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhSZXEgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNaW5DYXAgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhDYXAgPSAiVU5CT1VOREVEIjsKKwkJdmVyaWZ5Q29udGFpbmVyQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMoc2VydmljZSwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwgY29udGFpbmVyTWluUmVxLAorCQkJCWNvbnRhaW5lck1heFJlcSwgY29udGFpbmVyTWluQ2FwLCBjb250YWluZXJNYXhDYXApOworCQl2ZXJpZnlDb250YWluZXJJbnN0YW5jZUNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHNlcnZpY2UsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJcmVzb3VyY2VWRjIwMCwgcmVzb3VyY2VWRjEwMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVTZXJ2aWNlSW5zdGFuY2VXaGVuUmVxTWF4T2NjdXJyZW5jZXNBbHJlYWR5UmVhY2hlZCgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzQgKFJlcSBNSU49MSBNQVg9MSkgdG8gVkYxMDAwCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczQsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlUmVxKTsKKwkJZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMTAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzIgKENhcCBNSU49MSBNQVg9VU5CT1VOREVEKSB0byBWRjIuMDAKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjIwMCk7CisJCWFzc2VydE5vdE51bGwoY29tcG9uZW50SW5zdGFuY2VDYXApOworCQlnZXRSZXNvdXJzZVJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYyMDAuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlVkYyMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBDaGVjay1JbiBib3RoIFZGcworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYxMDAsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCXJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGMjAwLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQkvLyBDcmVhdGUgVkYgaW5zdGFuY2VzCisJCVJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRjEwMCwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJU3RyaW5nIHZmMU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcC5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQlTdHJpbmcgZnJvbUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlTdHJpbmcgdmYyTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwLmdldFJlc3BvbnNlKCksICJuYW1lIik7CisJCVN0cmluZyB0b0NvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJLy8gYXNzb2NpYXRlIDIgVkZzCisJCVN0cmluZyBjYXBUeXBlID0gY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZTsKKwkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzb3VyY2VSZXNwb25zZSk7CisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoY2FwVHlwZSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24oZnJvbUNvbXBJbnN0SWQsIHRvQ29tcEluc3RJZCwgY2FwVHlwZSwgcmVxTmFtZSwKKwkJCQljYXBMaXN0LCByZXFMaXN0LCBjb21wb25lbnRJbnN0YW5jZVJlcS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJbnN0YW5jZUNhcC5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc29jaWF0ZUluc3RhbmNlcyk7CisJCS8vIGFzc29jaWF0ZSBzYW1lIGluc3RhbmNlcyBhZ2FpbiAtIHdoZW4gcmVxdWlyZW1lbnQgTWF4IE9jY3VycmVuY2VzCisJCS8vIHJlYWNoZWQKKwkJYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZCh2ZjFOYW1lKTsKKwkJdmFyaWJhbGVzLmFkZCh2ZjJOYW1lKTsKKwkJdmFyaWJhbGVzLmFkZCgiaG9zdCIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX01BVENIX05PVF9GT1VORC5uYW1lKCksIHZhcmliYWxlcywKKwkJCQlhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIGdldCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIlVOQk9VTkRFRCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHNlcnZpY2UsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsIGNvbnRhaW5lck1pblJlcSwKKwkJCQljb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhzZXJ2aWNlLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkYyMDAsIHJlc291cmNlVkYxMDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZUluc3RhbmNlQXNzb2NpYXRpb25DYXBNYXhPY2N1cnJlbmNlc0lzUmVhY2hlZCgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzEgKFJlcSBNSU49MSBNQVg9MikgdG8gVkYxMDAwCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlUmVxKTsKKwkJZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMTAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzMgKENhcCBNSU49MSBNQVg9MSkgdG8gVkYyMDAwCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYyMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlQ2FwKTsKKwkJZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMjAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMjAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gQ2hlY2stSW4gYm90aCBWRnMKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGMTAwLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRjIwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJLy8gQ3JlYXRlIFZGIGluc3RhbmNlcworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkYxMDAsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyBmcm9tQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRjIwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyB0b0NvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJLy8gYXNzb2NpYXRlIDIgVkZzCisJCVN0cmluZyBjYXBUeXBlID0gY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZTsKKwkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzb3VyY2VSZXNwb25zZSk7CisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoY2FwVHlwZSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24oZnJvbUNvbXBJbnN0SWQsIHRvQ29tcEluc3RJZCwgY2FwVHlwZSwgcmVxTmFtZSwKKwkJCQljYXBMaXN0LCByZXFMaXN0LCBjb21wb25lbnRJbnN0YW5jZVJlcS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJbnN0YW5jZUNhcC5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc29jaWF0ZUluc3RhbmNlcyk7CisJCS8vIGdldCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjEiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIjAiOworCQl2ZXJpZnlDb250YWluZXJDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhzZXJ2aWNlLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLCBjb250YWluZXJNaW5SZXEsCisJCQkJY29udGFpbmVyTWF4UmVxLCBjb250YWluZXJNaW5DYXAsIGNvbnRhaW5lck1heENhcCk7CisJCXZlcmlmeUNvbnRhaW5lckluc3RhbmNlQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMoc2VydmljZSwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwKKwkJCQlyZXNvdXJjZVZGMjAwLCByZXNvdXJjZVZGMTAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0aW9uU2VydmljZUluc3RhbmNlV2hlbkNhcE1heE9jY3VycmVuY2VzQWxyZWFkeVJlYWNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2U7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMxIChSZXEgTUlOPTEgTUFYPTIpIHRvIFZGMTAwMAorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZVJlcSk7CisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjEwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMzIChDYXAgTUlOPTEgTUFYPTEpIHRvIFZGMjAwMAorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMjAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZUNhcCk7CisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjIwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjIwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIENoZWNrLUluIGJvdGggVkZzCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRjEwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCS8vIENyZWF0ZSBWRiBpbnN0YW5jZXMKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGMTAwLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLyBSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsCisJCS8vIHJlc291cmNlRGV0YWlsc1ZGMTAwLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJU3RyaW5nIHZmMU5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcC5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQlTdHJpbmcgZnJvbUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLyBjcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJLy8gcmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlTdHJpbmcgdmYyTmFtZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwLmdldFJlc3BvbnNlKCksICJuYW1lIik7CisJCVN0cmluZyB0b0NvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJLy8gYXNzb2NpYXRlIDIgVkZzCisJCVN0cmluZyBjYXBUeXBlID0gY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZTsKKwkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzb3VyY2VSZXNwb25zZSk7CisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoY2FwVHlwZSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24oZnJvbUNvbXBJbnN0SWQsIHRvQ29tcEluc3RJZCwgY2FwVHlwZSwgcmVxTmFtZSwKKwkJCQljYXBMaXN0LCByZXFMaXN0LCBjb21wb25lbnRJbnN0YW5jZVJlcS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJbnN0YW5jZUNhcC5nZXRVbmlxdWVJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc29jaWF0ZUluc3RhbmNlcyk7CisJCS8vIGdldCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjEiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIjAiOworCQl2ZXJpZnlDb250YWluZXJDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhzZXJ2aWNlLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLCBjb250YWluZXJNaW5SZXEsCisJCQkJY29udGFpbmVyTWF4UmVxLCBjb250YWluZXJNaW5DYXAsIGNvbnRhaW5lck1heENhcCk7CisJCXZlcmlmeUNvbnRhaW5lckluc3RhbmNlQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMoc2VydmljZSwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwKKwkJCQlyZXNvdXJjZVZGMjAwLCByZXNvdXJjZVZGMTAwKTsKKwkJLy8gYXNzb2NpYXRlIHNhbWUgaW5zdGFuY2VzIGFnYWluIC0gd2hlbiByZXF1aXJlbWVudCBNYXggT2NjdXJyZW5jZXMKKwkJLy8gcmVhY2hlZAorCQlhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKHZmMU5hbWUpOworCQl2YXJpYmFsZXMuYWRkKHZmMk5hbWUpOworCQl2YXJpYmFsZXMuYWRkKCJob3N0Iik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfUkVMQVRJT05fTk9UX0ZPVU5ELm5hbWUoKSwKKwkJCQl2YXJpYmFsZXMsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0aW9uQW5kRGlzYXNzb2NpYXRlU2VydmljZUluc3RhbmNlc1doZW5SZXFNYXhPY2N1cnJlbmNlc0FscmVhZHlSZWFjaGVkKCkKKwkJCXRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzQgKFJlcSBNSU49MSBNQVg9MSkgdG8gVkYxMDAwCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczQsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlUmVxKTsKKwkJZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMTAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gQWRkIGluc3RhbmNlIG9mIFZGQzMgKENhcCBNSU49MSBNQVg9MSkgdG8gVkYyMDAwCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYyMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlQ2FwKTsKKwkJZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMjAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMjAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gQ2hlY2stSW4gYm90aCBWRnMKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGMTAwLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXN0UmVzcG9uc2UpOworCQlyZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRjIwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJLy8gQ3JlYXRlIFZGIGluc3RhbmNlcworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkYxMDAsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCS8vIFJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJLy8gcmVzb3VyY2VEZXRhaWxzVkYxMDAsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlTdHJpbmcgZnJvbUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2VEdXJpbmdTZXR1cChzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLyBjcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJLy8gcmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlTdHJpbmcgdG9Db21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCS8vIGFzc29jaWF0ZSAyIFZGIEluc3RhbmNlcworCQlTdHJpbmcgY2FwVHlwZSA9IGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGU7CisJCVN0cmluZyByZXFOYW1lID0gImhvc3QiOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFJlc291cmNlUmVzcG9uc2UpOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENhcFJlcURlZi5jbGFzcyk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3QgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KGNhcFR5cGUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdCA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5nZXQoY2FwVHlwZSk7CisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IGdldFJlcUNhcFJlbGF0aW9uKGZyb21Db21wSW5zdElkLCB0b0NvbXBJbnN0SWQsIGNhcFR5cGUsIHJlcU5hbWUsCisJCQkJY2FwTGlzdCwgcmVxTGlzdCwgY29tcG9uZW50SW5zdGFuY2VSZXEuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50SW5zdGFuY2VDYXAuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhhc3NvY2lhdGVJbnN0YW5jZXMpOworCQkvLyBnZXQgc2VydmljZQorCQlSZXN0UmVzcG9uc2UgZ2V0U2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFNlcnZpY2VSZXNwb25zZSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCS8vIFZlcmlmeSBDb250YWluZXIgcmVxdWlyZW1lbnRzIGFuZCBDYXBhYmlsaXRpZXMKKwkJU3RyaW5nIGNvbnRhaW5lck1pblJlcSA9ICIwIjsKKwkJU3RyaW5nIGNvbnRhaW5lck1heFJlcSA9ICIwIjsKKwkJU3RyaW5nIGNvbnRhaW5lck1pbkNhcCA9ICIwIjsKKwkJU3RyaW5nIGNvbnRhaW5lck1heENhcCA9ICIwIjsKKwkJdmVyaWZ5Q29udGFpbmVyQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMoc2VydmljZSwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwgY29udGFpbmVyTWluUmVxLAorCQkJCWNvbnRhaW5lck1heFJlcSwgY29udGFpbmVyTWluQ2FwLCBjb250YWluZXJNYXhDYXApOworCQl2ZXJpZnlDb250YWluZXJJbnN0YW5jZUNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHNlcnZpY2UsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJcmVzb3VyY2VWRjIwMCwgcmVzb3VyY2VWRjEwMCk7CisJCS8vIERpc2Fzc29jaWF0ZSAyIFZGIEluc3RhbmNlcworCQlSZXN0UmVzcG9uc2UgZGlzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMocmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSkuaXNFbXB0eSgpKTsKKwkJLy8gZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSBPY2N1cnJlbmNlcyBpbiBjb250YWluZXIgYW5kIGNvbnRhaW5lcgorCQkvLyBpbnN0YW5jZSByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCWNvbnRhaW5lck1pblJlcSA9ICIxIjsKKwkJY29udGFpbmVyTWF4UmVxID0gIjEiOworCQljb250YWluZXJNaW5DYXAgPSAiMSI7CisJCWNvbnRhaW5lck1heENhcCA9ICIxIjsKKwkJdmVyaWZ5Q29udGFpbmVyQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMoc2VydmljZSwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwgY29udGFpbmVyTWluUmVxLAorCQkJCWNvbnRhaW5lck1heFJlcSwgY29udGFpbmVyTWluQ2FwLCBjb250YWluZXJNYXhDYXApOworCQl2ZXJpZnlDb250YWluZXJJbnN0YW5jZUNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHNlcnZpY2UsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJcmVzb3VyY2VWRjIwMCwgcmVzb3VyY2VWRjEwMCk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGFhYWEoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2U7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMxIChSZXEgTUlOPTEgTUFYPTIpIHRvIFZGMTAwMAorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZVJlcSk7CisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjEwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIEFkZCBpbnN0YW5jZSBvZiBWRkMzIChDYXAgTUlOPTEgTUFYPTEpIHRvIFZGMjAwMAorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZUNhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMjAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZUNhcCk7CisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjIwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjIwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIENoZWNrLUluIGJvdGggVkZzCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRjEwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MocmVzdFJlc3BvbnNlKTsKKwkJcmVzdFJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkYyMDAsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKHJlc3RSZXNwb25zZSk7CisJCS8vIENyZWF0ZSBWRiBpbnN0YW5jZXMKKwkJLy8gUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdFJlc3AgPQorCQkvLyBjcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGMTAwLAorCQkvLyBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRjEwMCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyB2ZjFOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3AuZ2V0UmVzcG9uc2UoKSwgIm5hbWUiKTsKKwkJU3RyaW5nIGZyb21Db21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCS8vIGNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlRHVyaW5nU2V0dXAoc2VydmljZURldGFpbHNfMDEsCisJCS8vIHJlc291cmNlRGV0YWlsc1ZGMjAwLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGMjAwLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJU3RyaW5nIHZmMk5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcC5nZXRSZXNwb25zZSgpLCAibmFtZSIpOworCQlTdHJpbmcgdG9Db21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCS8vIGFzc29jaWF0ZSAyIFZGcworCQlTdHJpbmcgY2FwVHlwZSA9IGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGU7CisJCVN0cmluZyByZXFOYW1lID0gImhvc3QiOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFJlc291cmNlUmVzcG9uc2UpOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENhcFJlcURlZi5jbGFzcyk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3QgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KGNhcFR5cGUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdCA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5nZXQoY2FwVHlwZSk7CisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IGdldFJlcUNhcFJlbGF0aW9uKGZyb21Db21wSW5zdElkLCB0b0NvbXBJbnN0SWQsIGNhcFR5cGUsIHJlcU5hbWUsCisJCQkJY2FwTGlzdCwgcmVxTGlzdCwgY29tcG9uZW50SW5zdGFuY2VSZXEuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50SW5zdGFuY2VDYXAuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhhc3NvY2lhdGVJbnN0YW5jZXMpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMiwgMSk7CisJCS8vIGdldCBzZXJ2aWNlCisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjEiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIjAiOworCQl2ZXJpZnlDb250YWluZXJDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhzZXJ2aWNlLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLCBjb250YWluZXJNaW5SZXEsCisJCQkJY29udGFpbmVyTWF4UmVxLCBjb250YWluZXJNaW5DYXAsIGNvbnRhaW5lck1heENhcCk7CisJCXZlcmlmeUNvbnRhaW5lckluc3RhbmNlQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMoc2VydmljZSwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwKKwkJCQlyZXNvdXJjZVZGMjAwLCByZXNvdXJjZVZGMTAwKTsKKwkJLy8gYXNzb2NpYXRlIHNhbWUgaW5zdGFuY2VzIGFnYWluIC0gd2hlbiByZXF1aXJlbWVudCBNYXggT2NjdXJyZW5jZXMKKwkJLy8gcmVhY2hlZAorCQlhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQlhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHZhcmliYWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYmFsZXMuYWRkKHZmMU5hbWUpOworCQl2YXJpYmFsZXMuYWRkKHZmMk5hbWUpOworCQl2YXJpYmFsZXMuYWRkKCJob3N0Iik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfUkVMQVRJT05fTk9UX0ZPVU5ELm5hbWUoKSwKKwkJCQl2YXJpYmFsZXMsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFVTNjI4NTE0IENhcGFiaWxpdHkvUmVxdWlyZW1lbnQgIk9jY3VycmVuY2VzIiBhdHRyaWJ1dGUgaW4gQ1JFQVRFL0RFTEVURQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFJlbGF0aW9uCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQVBJcworCS8vIENvbnRhaW5lciA9IFZGICwgQ29udGFpbmVyIGluc3RhbmNlID0gVkZDCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXBBbmRSZXFPY2N1cnJlbmNlc0luVmZBbmRIaXNJbnN0YW5jZXNOb0Fzc29jaWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIFZGQzEgYW5kIFZGQzIgaW5zdGFuY2VzIGluIFZGCisJCUNvbXBvbmVudEluc3RhbmNlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlMSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjcmVhdGVDb21wb25lbnRJbnN0YW5jZTEpOworCQlDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZTIgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMCk7CisJCWFzc2VydE5vdE51bGwoY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UyKTsKKwkJLy8gR0VUIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlVkYxMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBWZXJpZnkgQ29udGFpbmVyIHJlcXVpcmVtZW50cyBhbmQgQ2FwYWJpbGl0aWVzCisJCVN0cmluZyBjb250YWluZXJNaW5SZXEgPSAiMSI7CisJCVN0cmluZyBjb250YWluZXJNYXhSZXEgPSAiMiI7CisJCVN0cmluZyBjb250YWluZXJNaW5DYXAgPSAiMSI7CisJCVN0cmluZyBjb250YWluZXJNYXhDYXAgPSAiVU5CT1VOREVEIjsKKwkJdmVyaWZ5Q29udGFpbmVyQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMocmVzb3VyY2VWRjEwMCwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwKKwkJCQljb250YWluZXJNaW5SZXEsIGNvbnRhaW5lck1heFJlcSwgY29udGFpbmVyTWluQ2FwLCBjb250YWluZXJNYXhDYXApOworCQl2ZXJpZnlDb250YWluZXJJbnN0YW5jZUNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHJlc291cmNlVkYxMDAsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJcmVzb3VyY2VWRkMyLCByZXNvdXJjZVZGQzEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmZJbnN0YW5jZUFzc29jaWF0aW9uUmVxTWF4T2NjdXJyZW5jZXNOb3RSZWFjaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIFZGQzEgKHdpdGggUmVxdWlyZW1lbnRzOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLCBNSU49MQorCQkvLyBNQVg9MikgaW5zdGFuY2UgdG8gVkYKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VXaXRoUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSk7CisJCS8vIEFkZCBWRkMyICh3aXRoIENhcGFiaWxpdGllczogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciwgTUlOPTEsCisJCS8vIE1BWD1VTkJPVU5ERUQgKSBpbnN0YW5jZSB0byBWRgorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVdpdGhDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzMiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMCk7CisJCWFzc2VydE5vdE51bGwoY29tcG9uZW50SW5zdGFuY2VXaXRoQ2FwKTsKKwkJLy8gYXNzb2NpYXRlIEluc3RhbmNlcworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAocmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSwKKwkJCQljb21wb25lbnRJbnN0YW5jZVdpdGhDYXAsIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpKTsKKwkJLy8gR0VUIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlVkYxMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBWZXJpZnkgQ29udGFpbmVyIHJlcXVpcmVtZW50cyBhbmQgQ2FwYWJpbGl0aWVzCisJCVN0cmluZyBjb250YWluZXJNaW5SZXEgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhSZXEgPSAiMSI7CisJCVN0cmluZyBjb250YWluZXJNaW5DYXAgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhDYXAgPSAiVU5CT1VOREVEIjsKKwkJdmVyaWZ5Q29udGFpbmVyQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMocmVzb3VyY2VWRjEwMCwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwKKwkJCQljb250YWluZXJNaW5SZXEsIGNvbnRhaW5lck1heFJlcSwgY29udGFpbmVyTWluQ2FwLCBjb250YWluZXJNYXhDYXApOworCQl2ZXJpZnlDb250YWluZXJJbnN0YW5jZUNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHJlc291cmNlVkYxMDAsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJcmVzb3VyY2VWRkMyLCByZXNvdXJjZVZGQzEpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2Zkluc3RhbmNlQXNzb2NpYXRpb25SZXFNYXhPY2N1cnJlbmNlc0lzUmVhY2hlZCgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCS8vIEFkZCBWRkM0ICh3aXRoIFJlcXVpcmVtZW50czogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciwgTUlOPTEKKwkJLy8gTUFYPTEpIGluc3RhbmNlIHRvIFZGCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHM0LCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZVdpdGhSZXEpOworCQkvLyBBZGQgVkZDMiAod2l0aCBDYXBhYmlsaXRpZXM6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIsIE1JTj0xLAorCQkvLyBNQVg9VU5CT1VOREVEICkgaW5zdGFuY2UgdG8gVkYKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VXaXRoQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczIsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlV2l0aENhcCk7CisJCS8vIGFzc29jaWF0ZSBJbnN0YW5jZXMKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKHJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhjb21wb25lbnRJbnN0YW5jZVdpdGhSZXEsCisJCQkJY29tcG9uZW50SW5zdGFuY2VXaXRoQ2FwLCBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja1JlYWx0aW9uc2hpcChyZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpLCByZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpKSk7CisJCS8vIEdFVCByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMTAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIlVOQk9VTkRFRCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHJlc291cmNlVkYxMDAsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJY29udGFpbmVyTWluUmVxLCBjb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhyZXNvdXJjZVZGMTAwLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkZDMiwgcmVzb3VyY2VWRkM0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZVZmSW5zdGFuY2VXaGVuUmVxTWF4T2NjdXJyZW5jZXNBbHJlYWR5UmVhY2hlZCgpIHRocm93cyBFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCS8vIEFkZCBWRkM0ICh3aXRoIFJlcXVpcmVtZW50czogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciwgTUlOPTEKKwkJLy8gTUFYPTEpIGluc3RhbmNlIHRvIFZGCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHM0LCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZVdpdGhSZXEpOworCQkvLyBBZGQgVkZDMiAod2l0aCBDYXBhYmlsaXRpZXM6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIsIE1JTj0xLAorCQkvLyBNQVg9VU5CT1VOREVEICkgaW5zdGFuY2UgdG8gVkYKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VXaXRoQ2FwID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczIsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlV2l0aENhcCk7CisJCS8vIGFzc29jaWF0ZSBJbnN0YW5jZXMKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IGdldFJlc291cmNlUmVxQ2FwKHJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gc2V0UmVsYXRpb25zaGlwQmV0d2Vlbkluc3RhbmNlcyhjb21wb25lbnRJbnN0YW5jZVdpdGhSZXEsCisJCQkJY29tcG9uZW50SW5zdGFuY2VXaXRoQ2FwLCBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUpOworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuYXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMsIHJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsIGFzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjaGVja1JlYWx0aW9uc2hpcChyZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpLCByZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpKSk7CisJCS8vIEdFVCByZXNvdXJjZQorCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZVZGMTAwID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cnNlUmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJLy8gVmVyaWZ5IENvbnRhaW5lciByZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcworCQlTdHJpbmcgY29udGFpbmVyTWluUmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4UmVxID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWluQ2FwID0gIjAiOworCQlTdHJpbmcgY29udGFpbmVyTWF4Q2FwID0gIlVOQk9VTkRFRCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHJlc291cmNlVkYxMDAsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJY29udGFpbmVyTWluUmVxLCBjb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhyZXNvdXJjZVZGMTAwLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkZDMiwgcmVzb3VyY2VWRkM0KTsKKwkJLy8gYXNzb2NpYXRlIHNhbWUgaW5zdGFuY2VzIGFnYWluIC0gd2hlbiByZXF1aXJlbWVudCBNYXggT2NjdXJyZW5jZXMKKwkJLy8gcmVhY2hlZAorCQlhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChjb21wb25lbnRJbnN0YW5jZVdpdGhSZXEuZ2V0TmFtZSgpKTsKKwkJdmFyaWJhbGVzLmFkZChjb21wb25lbnRJbnN0YW5jZVdpdGhDYXAuZ2V0TmFtZSgpKTsKKwkJdmFyaWJhbGVzLmFkZCgiaG9zdCIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX01BVENIX05PVF9GT1VORC5uYW1lKCksIHZhcmliYWxlcywKKwkJCQlhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0UmVzcG9uc2UoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZmSW5zdGFuY2VBc3NvY2lhdGlvbkNhcE1heE9jY3VycmVuY2VzSXNSZWFjaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIFZGQzEgKHdpdGggUmVxdWlyZW1lbnRzOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLCBNSU49MQorCQkvLyBNQVg9MikgaW5zdGFuY2UgdG8gVkYKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VXaXRoUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSk7CisJCS8vIEFkZCBWRkMzICh3aXRoIENhcGFiaWxpdGllczogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciwgTUlOPTEKKwkJLy8gTUFYPTEgKSBpbnN0YW5jZSB0byBWRgorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVdpdGhDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzMywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMCk7CisJCWFzc2VydE5vdE51bGwoY29tcG9uZW50SW5zdGFuY2VXaXRoQ2FwKTsKKwkJLy8gYXNzb2NpYXRlIEluc3RhbmNlcworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAocmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSwKKwkJCQljb21wb25lbnRJbnN0YW5jZVdpdGhDYXAsIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpKTsKKwkJLy8gR0VUIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlVkYxMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBWZXJpZnkgQ29udGFpbmVyIHJlcXVpcmVtZW50cyBhbmQgQ2FwYWJpbGl0aWVzCisJCVN0cmluZyBjb250YWluZXJNaW5SZXEgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhSZXEgPSAiMSI7CisJCVN0cmluZyBjb250YWluZXJNaW5DYXAgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhDYXAgPSAiMCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHJlc291cmNlVkYxMDAsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJY29udGFpbmVyTWluUmVxLCBjb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhyZXNvdXJjZVZGMTAwLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkZDMywgcmVzb3VyY2VWRkMxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0aW9uVmZJbnN0YW5jZVdoZW5DYXBNYXhPY2N1cnJlbmNlc0FscmVhZHlSZWFjaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIFZGQzEgKHdpdGggUmVxdWlyZW1lbnRzOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLCBNSU49MQorCQkvLyBNQVg9MikgaW5zdGFuY2UgdG8gVkYKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VXaXRoUmVxID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoaW1wb3J0UmVxRGV0YWlsczEsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSk7CisJCS8vIEFkZCBWRkMzICh3aXRoIENhcGFiaWxpdGllczogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciwgTUlOPTEKKwkJLy8gTUFYPTEgKSBpbnN0YW5jZSB0byBWRgorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVdpdGhDYXAgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzMywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMCk7CisJCWFzc2VydE5vdE51bGwoY29tcG9uZW50SW5zdGFuY2VXaXRoQ2FwKTsKKwkJLy8gYXNzb2NpYXRlIEluc3RhbmNlcworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gZ2V0UmVzb3VyY2VSZXFDYXAocmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKGNvbXBvbmVudEluc3RhbmNlV2l0aFJlcSwKKwkJCQljb21wb25lbnRJbnN0YW5jZVdpdGhDYXAsIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSk7CisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywgYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpKTsKKwkJLy8gR0VUIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlVkYxMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBWZXJpZnkgQ29udGFpbmVyIHJlcXVpcmVtZW50cyBhbmQgQ2FwYWJpbGl0aWVzCisJCVN0cmluZyBjb250YWluZXJNaW5SZXEgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhSZXEgPSAiMSI7CisJCVN0cmluZyBjb250YWluZXJNaW5DYXAgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhDYXAgPSAiMCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHJlc291cmNlVkYxMDAsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJY29udGFpbmVyTWluUmVxLCBjb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhyZXNvdXJjZVZGMTAwLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkZDMywgcmVzb3VyY2VWRkMxKTsKKwkJLy8gYXNzb2NpYXRlIHNhbWUgaW5zdGFuY2VzIGFnYWluIC0gd2hlbiByZXF1aXJlbWVudCBNYXggT2NjdXJyZW5jZXMKKwkJLy8gcmVhY2hlZAorCQlhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgIiwgQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJYXNzb2NpYXRlSW5zdGFuY2VzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB2YXJpYmFsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWJhbGVzLmFkZChjb21wb25lbnRJbnN0YW5jZVdpdGhSZXEuZ2V0TmFtZSgpKTsKKwkJdmFyaWJhbGVzLmFkZChjb21wb25lbnRJbnN0YW5jZVdpdGhDYXAuZ2V0TmFtZSgpKTsKKwkJdmFyaWJhbGVzLmFkZCgiaG9zdCIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX1JFTEFUSU9OX05PVF9GT1VORC5uYW1lKCksCisJCQkJdmFyaWJhbGVzLCBhc3NvY2lhdGVJbnN0YW5jZXMuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGlvbkFuZERpc2Fzc29jaWF0ZVZmSW5zdGFuY2VzV2hlblJlcU1heE9jY3VycmVuY2VzQWxyZWFkeVJlYWNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQkvLyBBZGQgVkZDNCAod2l0aCBSZXF1aXJlbWVudHM6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIsIE1JTj0xCisJCS8vIE1BWD0xKSBpbnN0YW5jZSB0byBWRgorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZVdpdGhSZXEgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShpbXBvcnRSZXFEZXRhaWxzNCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMCk7CisJCWFzc2VydE5vdE51bGwoY29tcG9uZW50SW5zdGFuY2VXaXRoUmVxKTsKKwkJLy8gQWRkIFZGQzMgKHdpdGggQ2FwYWJpbGl0aWVzOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLCBNSU49MQorCQkvLyBNQVg9MSApIGluc3RhbmNlIHRvIFZGCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlV2l0aENhcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGltcG9ydFJlcURldGFpbHMzLCBzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwKTsKKwkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRJbnN0YW5jZVdpdGhDYXApOworCQkvLyBhc3NvY2lhdGUgSW5zdGFuY2VzCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBnZXRSZXNvdXJjZVJlcUNhcChyZXNvdXJjZURldGFpbHNWRjEwMCk7CisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IHNldFJlbGF0aW9uc2hpcEJldHdlZW5JbnN0YW5jZXMoY29tcG9uZW50SW5zdGFuY2VXaXRoUmVxLAorCQkJCWNvbXBvbmVudEluc3RhbmNlV2l0aENhcCwgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlKTsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlcyA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmFzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhhc3NvY2lhdGVJbnN0YW5jZXMpOworCQlhc3NlcnRUcnVlKGNoZWNrUmVhbHRpb25zaGlwKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCksIHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGMTAwLmdldFVuaXF1ZUlkKCkpKTsKKwkJLy8gR0VUIHJlc291cmNlCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJzZVJlc3RSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlVkYxMDAgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzb3Vyc2VSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkvLyBWZXJpZnkgQ29udGFpbmVyIHJlcXVpcmVtZW50cyBhbmQgQ2FwYWJpbGl0aWVzCisJCVN0cmluZyBjb250YWluZXJNaW5SZXEgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhSZXEgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNaW5DYXAgPSAiMCI7CisJCVN0cmluZyBjb250YWluZXJNYXhDYXAgPSAiMCI7CisJCXZlcmlmeUNvbnRhaW5lckNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c09jY3VycmVuY2VzKHJlc291cmNlVkYxMDAsIGNhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsCisJCQkJY29udGFpbmVyTWluUmVxLCBjb250YWluZXJNYXhSZXEsIGNvbnRhaW5lck1pbkNhcCwgY29udGFpbmVyTWF4Q2FwKTsKKwkJdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhyZXNvdXJjZVZGMTAwLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCXJlc291cmNlVkZDMywgcmVzb3VyY2VWRkM0KTsKKwkJLy8gRGlzYXNzb2NpYXRlIDIgSW5zdGFuY2VzCisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCByZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZGlzc29jaWF0ZUluc3RhbmNlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMocmVzb3VyY2VEZXRhaWxzVkYxMDAuZ2V0VW5pcXVlSWQoKSkuaXNFbXB0eSgpKTsKKwkJLy8gR0VUIHJlc291cmNlCisJCWdldFJlc291cnNlUmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlyZXNvdXJjZURldGFpbHNWRjEwMC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VWRjEwMCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJzZVJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCS8vIFZlcmlmeSBDb250YWluZXIgcmVxdWlyZW1lbnRzIGFuZCBDYXBhYmlsaXRpZXMKKwkJY29udGFpbmVyTWluUmVxID0gIjEiOworCQljb250YWluZXJNYXhSZXEgPSAiMSI7CisJCWNvbnRhaW5lck1pbkNhcCA9ICIxIjsKKwkJY29udGFpbmVyTWF4Q2FwID0gIjEiOworCQl2ZXJpZnlDb250YWluZXJDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhyZXNvdXJjZVZGMTAwLCBjYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLAorCQkJCWNvbnRhaW5lck1pblJlcSwgY29udGFpbmVyTWF4UmVxLCBjb250YWluZXJNaW5DYXAsIGNvbnRhaW5lck1heENhcCk7CisJCXZlcmlmeUNvbnRhaW5lckluc3RhbmNlQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMocmVzb3VyY2VWRjEwMCwgY2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSwKKwkJCQlyZXNvdXJjZVZGQzMsIHJlc291cmNlVkZDNCk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tSZWFsdGlvbnNoaXAoU3RyaW5nIGZyb21Ob2RlLCBTdHJpbmcgdG9Ob2RlLCBTdHJpbmcgcmVzb3VyY2VVbmlxdWVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiBjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMgPSBnZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoCisJCQkJcmVzb3VyY2VVbmlxdWVJZCk7CisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgPSBjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMuZ2V0KDApOworCQlib29sZWFuIGZyb21Ob2RlQ2hlY2sgPSByZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuZ2V0RnJvbU5vZGUoKS5lcXVhbHMoZnJvbU5vZGUpOworCQlib29sZWFuIHRvTm9kZUNoZWNrID0gcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLmdldFRvTm9kZSgpLmVxdWFscyh0b05vZGUpOworCisJCXJldHVybiBmcm9tTm9kZUNoZWNrICYmIHRvTm9kZUNoZWNrOworCX0KKworCXByaXZhdGUgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IGdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyhTdHJpbmcgcmVzb3VyY2VVbmlxdWVJZCkKKwkJCXRocm93cyBDbGllbnRQcm90b2NvbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFZmQXNSZXNvdXJjZU9iamVjdChyZXNvdXJjZVVuaXF1ZUlkKTsKKwkJTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IGNvbXBvbmVuUmVsYXRpb25JbnN0YW5jZXMgPSByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKTsKKworCQlyZXR1cm4gY29tcG9uZW5SZWxhdGlvbkluc3RhbmNlczsKKwl9CisKKwlwcml2YXRlIFJlc291cmNlIGdldFZmQXNSZXNvdXJjZU9iamVjdChTdHJpbmcgcmVzb3VyY2VVbmlxdWVJZCkgdGhyb3dzIENsaWVudFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlVW5pcXVlSWQpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKKwlwcml2YXRlIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBzZXRSZWxhdGlvbnNoaXBCZXR3ZWVuSW5zdGFuY2VzKENvbXBvbmVudEluc3RhbmNlIHJpUmVxLAorCQkJQ29tcG9uZW50SW5zdGFuY2UgcmlDYXAsIENhcFJlcURlZiBjYXBSZXFEZWYpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBjYXBiaWxpdHlVaWQgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIikuZ2V0KDApLmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyByZXF1aXJlbWVudFVpZCA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCXJlcXVpcmVtZW50RGVmLnNldEZyb21Ob2RlKHJpUmVxLmdldFVuaXF1ZUlkKCkpOworCQlyZXF1aXJlbWVudERlZi5zZXRUb05vZGUocmlDYXAuZ2V0VW5pcXVlSWQoKSk7CisKKwkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHBhaXIgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJpUmVxLmdldFVuaXF1ZUlkKCkpOworCQlwYWlyLnNldENhcGFiaWxpdHlPd25lcklkKHJpQ2FwLmdldFVuaXF1ZUlkKCkpOworCQlwYWlyLnNldFJlcXVpcmVtZW50KCJob3N0Iik7CisJCVJlbGF0aW9uc2hpcEltcGwgcmVsYXRpb25zaGlwID0gbmV3IFJlbGF0aW9uc2hpcEltcGwoKTsKKwkJcmVsYXRpb25zaGlwLnNldFR5cGUoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJcGFpci5zZXRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcCk7CisJCXBhaXIuc2V0Q2FwYWJpbGl0eVVpZChjYXBiaWxpdHlVaWQpOworCQlwYWlyLnNldFJlcXVpcmVtZW50VWlkKHJlcXVpcmVtZW50VWlkKTsKKwkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcmVsYXRpb25zaGlwcy5hZGQocGFpcik7CisJCXJlcXVpcmVtZW50RGVmLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwcyk7CisJCXJldHVybiByZXF1aXJlbWVudERlZjsKKwl9CisKKwlwcml2YXRlIENhcFJlcURlZiBnZXRSZXNvdXJjZVJlcUNhcChSZXNvdXJjZVJlcURldGFpbHMgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VCZWZvcmVBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgcmVzb3VyY2VEZXRhaWxzVkYxMDApOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChnZXRSZXNvdXJjZUJlZm9yZUFzc29jaWF0ZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCQlyZXR1cm4gY2FwUmVxRGVmOworCX0KKworCXByaXZhdGUgUmVzdFJlc3BvbnNlIGltcG9ydGVkUmVzb3VyY2UoSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzLCBTdHJpbmcgeW1sRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWltcG9ydFJlcURldGFpbHMgPSBJbXBvcnRVdGlscy5nZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKGltcG9ydFJlcURldGFpbHMsIHRlc3RSZXNvdXJjZXNQYXRoLAorCQkJCXltbEZpbGUpOworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZUltcG9ydFJlc291cmNlKGltcG9ydFJlcURldGFpbHMsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgbnVsbCk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBpbXBvcnRpbmcgcmVzb3VyY2UiLCBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQsCisJCQkJaW1wb3J0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJcmV0dXJuIGltcG9ydFJlc291cmNlUmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShSZXNvdXJjZVJlcURldGFpbHMgcmVzLCBVc2VyIHVzZXIsIFJlc291cmNlUmVxRGV0YWlscyB2ZikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZUluc3RhbmNlKHJlcywgdXNlciwgdmYuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UocmVzcG9uc2UpOworCQlDb21wb25lbnRJbnN0YW5jZSBjb21wSW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJcmV0dXJuIGNvbXBJbnN0YW5jZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmVyQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzT2NjdXJyZW5jZXMoQ29tcG9uZW50IGNvbXBvbmVudCwKKwkJCVN0cmluZyBDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNUeXBlLCBTdHJpbmcgbWluUmVxT2NjdXJyZW5jZXMsIFN0cmluZyBtYXhSZXFPY2N1cnJlbmNlcywKKwkJCVN0cmluZyBtaW5DYXBhYmlsaXRpZXMsIFN0cmluZyBtYXhDYXBhYmlsaXRpZXMpIHRocm93cyBFeGNlcHRpb24geworCQlib29sZWFuIGlzUmVxdWlyZW1lbnRBcHBlYXIgPSBmYWxzZTsKKwkJYm9vbGVhbiBpc0NhcGFiaWxpdHlBcHBlYXIgPSBmYWxzZTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcXVpcmVtZW50czsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzOworCQlyZXF1aXJlbWVudHMgPSBjb21wb25lbnQuZ2V0UmVxdWlyZW1lbnRzKCkuZ2V0KENhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUpOworCQlpZiAobWF4UmVxT2NjdXJyZW5jZXMgPT0gIjAiKSB7CisJCQlhc3NlcnRUcnVlKHJlcXVpcmVtZW50cyA9PSBudWxsKTsKKwkJfSAvLyBpZiBjb250YWluZXIgTUFYIHJlcXVpcmVtZW50ID0gMAorCQlpZiAobWF4UmVxT2NjdXJyZW5jZXMgIT0gIjAiKSB7CisJCQlhc3NlcnROb3ROdWxsKHJlcXVpcmVtZW50cyk7CisJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXEgOiByZXF1aXJlbWVudHMpIHsKKwkJCQlzd2l0Y2ggKHJlcS5nZXROYW1lKCkpIHsKKwkJCQljYXNlICJob3N0IjoKKwkJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIFJlcXVpcmVtZW50IE9jY3VycmVuY2VzICIsIHJlcS5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscyhtaW5SZXFPY2N1cnJlbmNlcykpOworCQkJCQlhc3NlcnRUcnVlKCJDaGVjayBNYXggUmVxdWlyZW1lbnQgT2NjdXJyZW5jZXMgIiwgcmVxLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKG1heFJlcU9jY3VycmVuY2VzKSk7CisJCQkJCWlzUmVxdWlyZW1lbnRBcHBlYXIgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYXNzZXJ0VHJ1ZShpc1JlcXVpcmVtZW50QXBwZWFyKTsKKwkJCQlpc1JlcXVpcmVtZW50QXBwZWFyID0gZmFsc2U7CisJCQl9CisJCX0KKwkJLy8gQ29udGFpbmVyIENhcGFiaWxpdGllcworCQljYXBhYmlsaXRpZXMgPSBjb21wb25lbnQuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KENhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUpOworCQlpZiAobWF4Q2FwYWJpbGl0aWVzID09ICIwIikgey8vIGlmIGNvbnRhaW5lciBNQVggY2FwYWJpbGl0aWVzID0gMAorCQkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXMgPT0gbnVsbCk7CisJCX0KKwkJaWYgKG1heENhcGFiaWxpdGllcyAhPSAiMCIpIHsKKwkJCWFzc2VydE5vdE51bGwoY2FwYWJpbGl0aWVzKTsKKwkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwIDogY2FwYWJpbGl0aWVzKSB7CisJCQkJc3dpdGNoIChjYXAuZ2V0TmFtZSgpKSB7CisJCQkJY2FzZSAiaG9zdCI6CisJCQkJCWFzc2VydFRydWUoIkNoZWNrIE1pbiBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsIGNhcC5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscyhtaW5DYXBhYmlsaXRpZXMpKTsKKwkJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWF4IGNhcGFiaWxpdHkgT2NjdXJyZW5jZXMgIiwgY2FwLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKG1heENhcGFiaWxpdGllcykpOworCQkJCQlpc0NhcGFiaWxpdHlBcHBlYXIgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYXNzZXJ0VHJ1ZShpc0NhcGFiaWxpdHlBcHBlYXIpOworCQkJCWlzQ2FwYWJpbGl0eUFwcGVhciA9IGZhbHNlOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmVySW5zdGFuY2VDYXBhYmlsaXRpZXNBbmRSZXF1aXJlbWVudHNPY2N1cnJlbmNlcyhDb21wb25lbnQgY29tcG9uZW50LAorCQkJU3RyaW5nIENhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUsIFJlc291cmNlIHZmV2l0aENhcGFiaWxpdGllcywgUmVzb3VyY2UgdmZXaXRoUmVxdWlyZW1lbnRzKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJvb2xlYW4gaXNDYXBSZXFBcHBlYXIgPSBmYWxzZTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gbGlzdE9mQ29tcG9uZW50SW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgaW5zdGFuY2UgOiBsaXN0T2ZDb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChpbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKS5lcXVhbHModmZXaXRoQ2FwYWJpbGl0aWVzLmdldFVuaXF1ZUlkKCkpKSB7CisJCQkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwRnJvbVJlc291cmNlID0gdmZXaXRoQ2FwYWJpbGl0aWVzLmdldENhcGFiaWxpdGllcygpCisJCQkJCQkuZ2V0KENhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUpOworCQkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcEZyb21JbnN0YW5jZSA9IGluc3RhbmNlLmdldENhcGFiaWxpdGllcygpCisJCQkJCQkuZ2V0KENhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUpOworCQkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gcmVzb3VyY2VDYXAgOiBjYXBGcm9tUmVzb3VyY2UpCisJCQkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gaW5zdGFuY2VSZXEgOiBjYXBGcm9tSW5zdGFuY2UpIHsKKwkJCQkJCWlmIChyZXNvdXJjZUNhcC5nZXRVbmlxdWVJZCgpLmVxdWFscyhpbnN0YW5jZVJlcS5nZXRVbmlxdWVJZCgpKSkgeworCQkJCQkJCWFzc2VydFRydWUoIkNoZWNrIE1pbiBjYXBhYmlsaXR5IE9jY3VycmVuY2VzICIsCisJCQkJCQkJCQlyZXNvdXJjZUNhcC5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscyhpbnN0YW5jZVJlcS5nZXRNaW5PY2N1cnJlbmNlcygpKSk7CisJCQkJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWF4IGNhcGFiaWxpdHkgT2NjdXJyZW5jZXMgIiwKKwkJCQkJCQkJCXJlc291cmNlQ2FwLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKGluc3RhbmNlUmVxLmdldE1heE9jY3VycmVuY2VzKCkpKTsKKwkJCQkJCQlpc0NhcFJlcUFwcGVhciA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJfQorCisJCQlpZiAoaW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCkuZXF1YWxzKHZmV2l0aFJlcXVpcmVtZW50cy5nZXRVbmlxdWVJZCgpKSkgeworCQkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFGcm9tQXRvbWljUmVzb3VyY2UgPSB2ZldpdGhSZXF1aXJlbWVudHMuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkJCS5nZXQoQ2FwYWJpbGl0aWVzQW5kUmVxdWlyZW1lbnRzVHlwZSk7CisJCQkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUZyb21JbnN0YW5jZSA9IGluc3RhbmNlLmdldFJlcXVpcmVtZW50cygpCisJCQkJCQkuZ2V0KENhcGFiaWxpdGllc0FuZFJlcXVpcmVtZW50c1R5cGUpOworCQkJCWZvciAoUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlc291cmNlUmVxIDogcmVxRnJvbUF0b21pY1Jlc291cmNlKQorCQkJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiBpbnN0YW5jZVJlcSA6IHJlcUZyb21JbnN0YW5jZSkgeworCQkJCQkJaWYgKHJlc291cmNlUmVxLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGluc3RhbmNlUmVxLmdldFVuaXF1ZUlkKCkpKSB7CisJCQkJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWluIFJlcXVpcmVtZW50IE9jY3VycmVuY2VzICIsCisJCQkJCQkJCQlyZXNvdXJjZVJlcS5nZXRNaW5PY2N1cnJlbmNlcygpLmVxdWFscyhpbnN0YW5jZVJlcS5nZXRNaW5PY2N1cnJlbmNlcygpKSk7CisJCQkJCQkJYXNzZXJ0VHJ1ZSgiQ2hlY2sgTWF4IFJlcXVpcmVtZW50IE9jY3VycmVuY2VzICIsCisJCQkJCQkJCQlyZXNvdXJjZVJlcS5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscyhpbnN0YW5jZVJlcS5nZXRNYXhPY2N1cnJlbmNlcygpKSk7CisJCQkJCQkJaXNDYXBSZXFBcHBlYXIgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQl9CisJCQlhc3NlcnRUcnVlKGlzQ2FwUmVxQXBwZWFyKTsKKwkJCWlzQ2FwUmVxQXBwZWFyID0gZmFsc2U7CisJCX0KKworCX0KKworCXByaXZhdGUgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGdldFJlcUNhcFJlbGF0aW9uKFN0cmluZyByZXFDb21wSW5zdElkLCBTdHJpbmcgY2FwQ29tcEluc3RJZCwgU3RyaW5nIGNhcFR5cGUsCisJCQlTdHJpbmcgcmVxTmFtZSwgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCwgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3QsCisJCQlTdHJpbmcgdmZjMVVuaXF1ZUlkLCBTdHJpbmcgdmZjMlVuaXF1ZUlkKSB7CisJCXJldHVybiBFbGVtZW50RmFjdG9yeS5nZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCB2ZmMxVW5pcXVlSWQsIHZmYzJVbmlxdWVJZCwgY2FwVHlwZSwKKwkJCQlyZXFOYW1lLCBjYXBMaXN0LCByZXFMaXN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NlcnZpY2UvU2VydmljZUNvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NlcnZpY2UvU2VydmljZUNvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjcyOGVhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9TZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYyNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLmpzb24uSlNPTkFycmF5OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwUmVxRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEluc3RhbmNlQmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5CYXNlVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUNSVURUZXN0IGV4dGVuZHMgQ29tcG9uZW50SW5zdGFuY2VCYXNlVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUNSVURUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX1NUUklORyA9ICIgIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVRVUlSRU1FTlRfTkFNRSA9ICJob3N0IjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FQQUJJTElUWV9UWVBFID0gInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiOworCisJcHJpdmF0ZSBTdHJpbmcgcmVxT3duZXJJZDsKKwlwcml2YXRlIFN0cmluZyBjYXBPd25lcklkOworCisJcHVibGljIFNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUNSVURUZXN0KCkgeworCQlzdXBlcihuZXcgVGVzdE5hbWUoKSwgU2VydmljZUNvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCisJcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluaXQoKTsKKwkJY3JlYXRlQ29tcG9uZW50cygpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMik7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkxfMDEpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWTF8wMik7CisJCWNyZWF0ZVZGKHJlc291cmNlRGV0YWlsc1ZGXzAxKTsKKwkJY3JlYXRlVkYocmVzb3VyY2VEZXRhaWxzVkZfMDIpOworCQljcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGQ18wMSk7CisJCWNlcnRpZnlSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRkNfMDIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChyZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlyZXNvdXJjZURldGFpbHNWRkNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlyZXFPd25lcklkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGRHVyaW5nU2V0dXAocmVzb3VyY2VEZXRhaWxzVkZfMDIsIHJlc291cmNlRGV0YWlsc1ZGQ18wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJY2FwT3duZXJJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOy8vIHNob3VsZAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB1cGRhdGVkCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGdldFVuaXF1ZUlkT2ZGaXJzdEluc3RhbmNlCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNlcnZpY2UKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29udGV4dAorCX0KKworCXByaXZhdGUgdm9pZCBjZXJ0aWZ5UmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZSwgc2RuY1Rlc3RlckRldGFpbHMuZ2V0VXNlcklkKCksIExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OKTsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZSwgc2RuY1Rlc3RlckRldGFpbHMuZ2V0VXNlcklkKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoYW5nZVJlc291cmNlTGlmZWN5Y2xlU3RhdGUoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgU3RyaW5nIHVzZXJVc2VySWQsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIGxpZmVDeWNsZVN0YXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdXNlclVzZXJJZCwgbGlmZUN5Y2xlU3RhdGVzKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoZWNrTENTX1Jlc3BvbnNlKHJlc3BvbnNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzLCBVc2VyIHVzZXIsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIGxpZmVDeWNsZVN0YXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHVzZXIsIGxpZmVDeWNsZVN0YXRlcyk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGVja0xDU19SZXNwb25zZShyZXNwb25zZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVZGSW5zdGFuY2VGYWlsV2l0aG91dENoYW5nZVN0YXRlKEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMsCisJCQlSZXNvdXJjZVJlcURldGFpbHMgdmZSZXNvdXJjZSwgVXNlciB1c2VyLCBpbnQgZXJyb3JDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdGFuY2VTdWNjZXNzZnVsbHlXaXRob3V0Q2hhbmdlU3RhdGVSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQl2ZlJlc291cmNlLCB1c2VyKTsKKwkJY2hlY2tFcnJvck1lc3NhZ2UoYWN0aW9uU3RhdHVzLCB2YXJpYWJsZXMsIGVycm9yQ29kZSwgY3JlYXRlVkZJbnN0YW5jZVN1Y2Nlc3NmdWxseVdpdGhvdXRDaGFuZ2VTdGF0ZVJlc3ApOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVWRkluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzLCBSZXNvdXJjZVJlcURldGFpbHMgdmZSZXNvdXJjZSwKKwkJCVVzZXIgdXNlciwgaW50IGVycm9yQ29kZSkgdGhyb3dzIEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCB2ZlJlc291cmNlLCB1c2VyKTsKKwkJY2hlY2tFcnJvck1lc3NhZ2UoYWN0aW9uU3RhdHVzLCB2YXJpYWJsZXMsIGVycm9yQ29kZSwgY3JlYXRlVkZJbnN0UmVzcCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVZGSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMsIFJlc291cmNlUmVxRGV0YWlscyB2ZlJlc291cmNlLAorCQkJVXNlciB1c2VyLCBpbnQgZXJyb3JDb2RlKSB0aHJvd3MgRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEpTT05FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZGVsZXRlVkZJbnN0UmVzcCA9IGRlbGV0ZVZGSW5zdGFuY2UodmZSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBzZXJ2aWNlRGV0YWlsc18wMSwgdXNlcik7CisJCWNoZWNrRXJyb3JNZXNzYWdlKGFjdGlvblN0YXR1cywgdmFyaWFibGVzLCBlcnJvckNvZGUsIGRlbGV0ZVZGSW5zdFJlc3ApOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbFdpdGhvdXRDaGFuZ2VTdGF0ZShBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzLAorCQkJUmVzb3VyY2VSZXFEZXRhaWxzIGF0b21pY1Jlc291cmNlLCBVc2VyIHVzZXIsIGludCBlcnJvckNvZGUpCisJCQl0aHJvd3MgRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEpTT05FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljSW5zdFJlc3AgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIGF0b21pY1Jlc291cmNlLCB1c2VyKTsKKwkJY2hlY2tFcnJvck1lc3NhZ2UoYWN0aW9uU3RhdHVzLCB2YXJpYWJsZXMsIGVycm9yQ29kZSwgY3JlYXRlQXRvbWljSW5zdFJlc3ApOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzLAorCQkJUmVzb3VyY2VSZXFEZXRhaWxzIGF0b21pY1Jlc291cmNlLCBVc2VyIHVzZXIsIGludCBlcnJvckNvZGUpCisJCQl0aHJvd3MgRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEpTT05FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5BdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIGF0b21pY1Jlc291cmNlLAorCQkJCXVzZXIpOworCQljaGVja0Vycm9yTWVzc2FnZShhY3Rpb25TdGF0dXMsIHZhcmlhYmxlcywgZXJyb3JDb2RlLCBjcmVhdGVBdG9taWNJbnN0UmVzcCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMsCisJCQlSZXNvdXJjZVJlcURldGFpbHMgYXRvbWljUmVzb3VyY2UsIFVzZXIgdXNlciwgaW50IGVycm9yQ29kZSkKKwkJCXRocm93cyBFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBkZWxldGVBdG9taWNJbnN0UmVzcCA9IGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZShhdG9taWNSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxLCB1c2VyKTsKKwkJY2hlY2tFcnJvck1lc3NhZ2UoYWN0aW9uU3RhdHVzLCB2YXJpYWJsZXMsIGVycm9yQ29kZSwgZGVsZXRlQXRvbWljSW5zdFJlc3ApOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0Vycm9yTWVzc2FnZShBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzLCBpbnQgZXJyb3JDb2RlLAorCQkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlsb2cuZGVidWcocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhlcnJvckNvZGUsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoYWN0aW9uU3RhdHVzLm5hbWUoKSwgdmFyaWFibGVzLCByZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKFNlcnZpY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsCisJCQlSZXNvdXJjZVJlcURldGFpbHMgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShjb21wSW5zdE9yaWdpbkRldGFpbHMsIGNvbXBJbnN0T3JpZ2luRGV0YWlscy5nZXRDcmVhdG9yVXNlcklkKCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJcmV0dXJuIGNyZWF0ZVZGSW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllcik7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY3JlYXRlQ2hlY2tlZGluQXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKFNlcnZpY2VSZXFEZXRhaWxzIGNvbnRhaW5lckRldGFpbHMsCisJCQlSZXNvdXJjZVJlcURldGFpbHMgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBVc2VyIG1vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShjb21wSW5zdE9yaWdpbkRldGFpbHMsIGNvbXBJbnN0T3JpZ2luRGV0YWlscy5nZXRDcmVhdG9yVXNlcklkKCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJcmV0dXJuIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVkZJbnN0YW5jZUFuZEF0b21pY1Jlc291cmNlSW5zdGFuY2VXaXRob3V0Q2hlY2tpbihSZXNvdXJjZVJlcURldGFpbHMgdmYsCisJCQlSZXNvdXJjZVJlcURldGFpbHMgYXRvbWljUmVzb3VyY2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RhbmNlID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgdmYsIHVzZXIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdGFuY2UpOworCQlSZXN0UmVzcG9uc2UgYXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlID0gY3JlYXRlQXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLCBhdG9taWNSZXNvdXJjZSwgdXNlcik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoYXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVkZJbnN0YW5jZUFuZEF0b21pY1Jlc291cmNlSW5zdGFuY2VTdWNjZXNzdWxseShSZXNvdXJjZVJlcURldGFpbHMgdmYsCisJCQlSZXNvdXJjZVJlcURldGFpbHMgYXRvbWljUmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJY3JlYXRlVkZJbnN0YW5jZUFuZEF0b21pY1Jlc291cmNlSW5zdGFuY2VTdWNjZXNzdWxseSh2ZiwgYXRvbWljUmVzb3VyY2UsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVN1Y2Nlc3N1bGx5KFJlc291cmNlUmVxRGV0YWlscyB2ZiwKKwkJCVJlc291cmNlUmVxRGV0YWlscyBhdG9taWNSZXNvdXJjZSwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWNoYW5nZVJlc291cmNlTGlmZWN5Y2xlU3RhdGUodmYsIHZmLmdldENyZWF0b3JVc2VySWQoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShhdG9taWNSZXNvdXJjZSwgYXRvbWljUmVzb3VyY2UuZ2V0Q3JlYXRvclVzZXJJZCgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQljcmVhdGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVdpdGhvdXRDaGVja2luKHZmLCBhdG9taWNSZXNvdXJjZSwgdXNlcik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVWRkluc3RhbmNlU3VjY2Vzc2Z1bGx5VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVWRkFuZEF0b21pY0luc3RhbmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluQXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpbkF0b21pY0luc3RhbmNlRm9yU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkxfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCWNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5BdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZMXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgNCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVBdG9taWNJbnN0YW5jZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8gMSByZWwKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpbkF0b21pY0luc3RhbmNlRm9yU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzQ1BfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCS8vIDIgcmVsCisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCWNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5BdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZMXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLyAzIHJlbAorCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluQXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWTF8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8gNCByZWwKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJLy8gVG8gZGVsZXRlCisJCVN0cmluZyBjb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCS8vIDMgcmVsCisJCWNyZWF0ZVZGSW5zdFJlc3AgPSBkZWxldGVBdG9taWNJbnN0YW5jZUZvclNlcnZpY2UoY29tcEluc3RJZCwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMywgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVWRkluc3RhbmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLyAxIHJlbAorCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTdHJpbmcgY29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQkvLyAyIHJlbAorCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluQXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8gMyByZWwKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJLy8gMiByZWwKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGRlbGV0ZVZGSW5zdGFuY2UoY29tcEluc3RJZCwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVEaXNzb2NpYXRlVHdvVkZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyBmcm9tQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQljcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlTdHJpbmcgdG9Db21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisKKwkJU3RyaW5nIGNhcFR5cGUgPSBDQVBBQklMSVRZX1RZUEU7CisJCVN0cmluZyByZXFOYW1lID0gUkVRVUlSRU1FTlRfTkFNRTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldFJlc291cmNlUmVzcG9uc2UpOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENhcFJlcURlZi5jbGFzcyk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3QgPSBjYXBSZXFEZWYuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0KGNhcFR5cGUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdCA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5nZXQoY2FwVHlwZSk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24oZnJvbUNvbXBJbnN0SWQsIHRvQ29tcEluc3RJZCwgY2FwVHlwZSwgcmVxTmFtZSwKKwkJCQljYXBMaXN0LCByZXFMaXN0KTsKKworCQlhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMSk7CisJCWNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gbGlzdCA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5nZXQoY2FwVHlwZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCBudWxsLCBsaXN0KTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDEpOworCisJCWRpc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldFJlc291cmNlUmVzcG9uc2UgPSBDb21wb25lbnRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMSk7CisJCWNhcFJlcURlZiA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCQlsaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIDEsIGxpc3Quc2l6ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCX0KKworCXByaXZhdGUgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGdldFJlcUNhcFJlbGF0aW9uKFN0cmluZyByZXFDb21wSW5zdElkLCBTdHJpbmcgY2FwQ29tcEluc3RJZCwgU3RyaW5nIGNhcFR5cGUsCisJCQlTdHJpbmcgcmVxTmFtZSwgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCwgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3QpIHsKKwkJcmV0dXJuIEVsZW1lbnRGYWN0b3J5LmdldFJlcUNhcFJlbGF0aW9uKHJlcUNvbXBJbnN0SWQsIGNhcENvbXBJbnN0SWQsIHJlcU93bmVySWQsIGNhcE93bmVySWQsIGNhcFR5cGUsIHJlcU5hbWUsCisJCQkJY2FwTGlzdCwgcmVxTGlzdCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlQnlEaWZmZXJlbnREZXNpZ25lclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVkZJbnN0YW5jZUZhaWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSMiksIDQwOSk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUjIpLCA0MDkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlQnlEaWZmZXJlbnREZXNpZ25lclRlc3RfU2VydmljZUlzQ2hlY2tlZGluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgZGVzaWduZXIyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSMik7CisKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQljaGFuZ2VTZXJ2aWNlTGlmZWN5Y2xlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIGRlc2lnbmVyMiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisKKwkJY3JlYXRlVkZJbnN0YW5jZUFuZEF0b21pY1Jlc291cmNlSW5zdGFuY2VTdWNjZXNzdWxseShyZXNvdXJjZURldGFpbHNWRl8wMSwgcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIGRlc2lnbmVyMik7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZUJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVZGSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCA0MDkpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgNDA5KTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDAsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVdpdGhOb3RBU0RDVXNlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2RuY0Rlc2lnbmVyRGV0YWlscy5zZXRVc2VySWQoImFiMDAwMSIpOworCQljcmVhdGVWRkluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDkpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlV2l0aEVtcHR5VXNlcklkVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZG5jRGVzaWduZXJEZXRhaWxzLnNldFVzZXJJZCgiIik7CisJCWNyZWF0ZVZGSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgNDAzKTsKKwkJY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZUZhaWwoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDMpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMCwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlV2l0aEVtcHR5U2VydmljZVVpZFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoIiIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoNDA0LCBjcmVhdGVWRkluc3RSZXNwLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5BdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnRFcXVhbHMoNDA0LCBjcmVhdGVBdG9taWNJbnN0UmVzcC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VXaGlsZVJlc291cmNlTm90RXhpc3RUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB2ZlJlc291cmNlVW5pcXVlSWQgPSAiMTIzNCI7CisJCVN0cmluZyBhdG9taWNSZXNvdXJjZVVuaXF1ZUlkID0gIjU2NzgiOworCisJCXJlc291cmNlRGV0YWlsc1ZGXzAxLnNldFVuaXF1ZUlkKHZmUmVzb3VyY2VVbmlxdWVJZCk7CisJCXJlc291cmNlRGV0YWlsc0NQXzAxLnNldFVuaXF1ZUlkKGF0b21pY1Jlc291cmNlVW5pcXVlSWQpOworCisJCWNyZWF0ZVZGSW5zdGFuY2VGYWlsV2l0aG91dENoYW5nZVN0YXRlKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsCisJCQkJbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoIiIpKSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsIDQwNCk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2VGYWlsV2l0aG91dENoYW5nZVN0YXRlKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsCisJCQkJbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoIiIpKSwgcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsIDQwNCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUluc3RhbmNlSW5TZXJ2aWNlTm90RXhpc3RzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZCgiMTIzNCIpOworCQljcmVhdGVWRkluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSksCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsIDQwNCk7CisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoIiIpKSwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgNDA0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VJbkNoZWNrZWRpblNlcnZpY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNoYW5nZVNlcnZpY2VMaWZlY3ljbGVTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKworCQljcmVhdGVWRkluc3RhbmNlRmFpbFdpdGhvdXRDaGFuZ2VTdGF0ZShBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDkpOworCQljcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbFdpdGhvdXRDaGFuZ2VTdGF0ZShBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMCwgMCk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VfUmVzb3VyY2VJbkNoZWNrb3V0U3RhdGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RhbmNlV2l0aG91dENoYW5nZVN0YXRlUmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdGFuY2VXaXRob3V0Q2hhbmdlU3RhdGVSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY0luc3RXaXRob3V0Q2hlYW5nZVN0YXRlUmVzcCA9IGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljSW5zdFdpdGhvdXRDaGVhbmdlU3RhdGVSZXNwKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZV9SZXNvdXJjZUluQ2VydGlmaWNhdGlvblJlcXVlc3RTdGF0ZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKworCQljcmVhdGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVN1Y2Nlc3N1bGx5KHJlc291cmNlRGV0YWlsc1ZGXzAxLCByZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW5zdGFuY2Vfc3RhcnRDZXJ0aWZpY2F0aW9uU3RhdGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNoYW5nZVJlc291cmNlTGlmZWN5Y2xlU3RhdGUocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCWNoYW5nZVJlc291cmNlTGlmZWN5Y2xlU3RhdGUocmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMSwgc2RuY1Rlc3RlckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQljaGFuZ2VSZXNvdXJjZUxpZmVjeWNsZVN0YXRlKHJlc291cmNlRGV0YWlsc0NQXzAxLCBzZG5jVGVzdGVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTik7CisKKwkJY3JlYXRlVkZJbnN0YW5jZUFuZEF0b21pY1Jlc291cmNlSW5zdGFuY2VXaXRob3V0Q2hlY2tpbihyZXNvdXJjZURldGFpbHNWRl8wMSwgcmVzb3VyY2VEZXRhaWxzQ1BfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZV9jZXJ0aWZpZWRTdGF0ZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGXzAxKTsKKwkJY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKworCQljcmVhdGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVdpdGhvdXRDaGVja2luKHJlc291cmNlRGV0YWlsc1ZGXzAxLCByZXNvdXJjZURldGFpbHNDUF8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VfT25lSGFzRGlmZmVyZW50T3duZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBkZXNpZ25lcjIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIyKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgdmZSZXNvdXJjZSA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VEZXRhaWxzVkZfMDEsICIwLjEiKTsKKwkJdmZSZXNvdXJjZS5zZXRVbmlxdWVJZChudWxsKTsKKwkJdmZSZXNvdXJjZS5zZXROYW1lKCJuZXdWRiIpOworCQl2ZlJlc291cmNlLnNldFRhZ3MobmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QodmZSZXNvdXJjZS5nZXROYW1lKCkpKSk7CisJCWNyZWF0ZVZGKHZmUmVzb3VyY2UsIGRlc2lnbmVyMik7CisKKwkJUmVzdFJlc3BvbnNlIGF0b21pY0luc3RhbmNlRm9yU2VydmljZSA9IGNyZWF0ZUNoZWNrZWRpbkF0b21pY0luc3RhbmNlRm9yU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoYXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKTsKKwkJY3JlYXRlVkZJbnN0YW5jZUZhaWxXaXRob3V0Q2hhbmdlU3RhdGUoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgdmZSZXNvdXJjZSwKKwkJCQlkZXNpZ25lcjIsIDQwOSk7CisKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDEsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW5kZXhlc09mVkZJbnN0YW5jZXNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaXJzdEluc3RhbmNlTmFtZSA9IHJlc291cmNlRGV0YWlsc1ZGXzAxLmdldE5hbWUoKSArIFNQQUNFX1NUUklORyArICIxIjsKKwkJU3RyaW5nIHNlY29uZEluc3RhbmNlTmFtZSA9IHJlc291cmNlRGV0YWlsc1ZGXzAxLmdldE5hbWUoKSArIFNQQUNFX1NUUklORyArICIyIjsKKwkJU3RyaW5nIHRoaXJkSW5zdGFuY2VOYW1lID0gcmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0TmFtZSgpICsgU1BBQ0VfU1RSSU5HICsgIjMiOworCisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCAiMC4xIiwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVGaXJzdFZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVGaXJzdFZGSW5zdFJlc3ApOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2Vjb25kVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlY29uZFZGSW5zdFJlc3ApOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVGhpcmRWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlVGhpcmRWRkluc3RSZXNwKTsKKworCQlDb21wb25lbnQgc2VydmljZSA9IGdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAzLCAwKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzTGlzdCA9IHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgaW5zdGFuY2UgOiBjb21wb25lbnRJbnN0YW5jZXNMaXN0KSB7CisJCQlTdHJpbmcgaW5zdGFuY2VOYW1lID0gaW5zdGFuY2UuZ2V0TmFtZSgpOworCQkJYm9vbGVhbiBpc0VxdWFsVG9GaXJzdEluc3RhbmNlTmFtZSA9IGluc3RhbmNlTmFtZS5lcXVhbHMoZmlyc3RJbnN0YW5jZU5hbWUpOworCQkJYm9vbGVhbiBpc0VxdWFsVG9TZWNvbmRJbnN0YW5jZU5hbWUgPSBpbnN0YW5jZU5hbWUuZXF1YWxzKHNlY29uZEluc3RhbmNlTmFtZSk7CisJCQlib29sZWFuIGlzRXF1YWxUb1RoaXJkSW5zdGFuY2VOYW1lID0gaW5zdGFuY2VOYW1lLmVxdWFscyh0aGlyZEluc3RhbmNlTmFtZSk7CisJCQlhc3NlcnRUcnVlKGlzRXF1YWxUb0ZpcnN0SW5zdGFuY2VOYW1lIHx8IGlzRXF1YWxUb1NlY29uZEluc3RhbmNlTmFtZSB8fCBpc0VxdWFsVG9UaGlyZEluc3RhbmNlTmFtZSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZmSW5zdGFuY2VzQW1vdW50SW5Ud29TZXJ2aWNlVmVyc2lvbnNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBvbGRTZXJ2aWNlVW5pcXVlSWQgPSBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpOworCisJCWNyZWF0ZVR3b0NoZWNrZWRpblZGSW5zdGFuY2VzKCk7CisKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQljaGFuZ2VTZXJ2aWNlTGlmZWN5Y2xlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCisJCVN0cmluZyBuZXdTZXJpdmNlVW5pcXVlSWRBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlID0gc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXNBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKG9sZFNlcnZpY2VVbmlxdWVJZCwgc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCisJCS8vIENoZWNrIG9sZCB2ZXJzaW9uCisJCWNoZWNrU2VydmljZU9sZFZlcnNpb25SSXMob2xkU2VydmljZVVuaXF1ZUlkLCBuZXdTZXJpdmNlVW5pcXVlSWRBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlLCAyLCAwKTsKKworCQkvLyBBZGQgb25lIG1vcmUgcmVzb3VyY2UgaW5zdGFuY2UgdG8gc2Vjb25kIHZlcnNpb24gb2Ygc2VydmljZQorCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWTF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgIjAuMSIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdFJlc3AgPSBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlVG9TZWNvbmRTZXJ2aWNlVmVyc2lvbigKKwkJCQluZXdTZXJpdmNlVW5pcXVlSWRBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlLCByZXNvdXJjZURldGFpbHNWTF8wMSk7CisJCVN0cmluZyBhdG9taWNSZXNvdXJjZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0UmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzQWZ0ZXJBZGRpbmdBdG9taWNSZXNvdXJjZUluc3RhbmNlKG9sZFNlcnZpY2VVbmlxdWVJZCwgc2VydmljZURldGFpbHNfMDEsIDMsIDApOworCisJCS8vIENoZWNrIHRoYXQgUklzIGFyZSBzYW1lIGFzIGluIHRoZSBiZWdpbm5pbmcgLSBsaWtlIGluIG9sZCB2ZXJzaW9uIG9mCisJCS8vIHNlcnZpY2UKKwkJZGVsZXRlQ29tcEluc3RSZXFDYXBGcm9tRXhwZWN0ZWQoYXRvbWljUmVzb3VyY2VVbmlxdWVJZCk7CisJCWNoZWNrU2VydmljZU9sZFZlcnNpb25SSXMob2xkU2VydmljZVVuaXF1ZUlkLCBuZXdTZXJpdmNlVW5pcXVlSWRBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlLCAyLCAwKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUd29DaGVja2VkaW5WRkluc3RhbmNlcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlRmlyc3RWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXNBZnRlckFkZGluZ0F0b21pY1Jlc291cmNlSW5zdGFuY2UoU3RyaW5nIG9sZENvbXBvbmVudFVuaXF1ZUlkLAorCQkJQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnREZXRhaWxzLCBpbnQgbnVtT2ZSSXMsIGludCBudW1PZlJlbGF0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShvbGRDb21wb25lbnRVbmlxdWVJZCwgY29tcG9uZW50RGV0YWlscywgbnVtT2ZSSXMsCisJCQkJbnVtT2ZSZWxhdGlvbnMpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrU2VydmljZU9sZFZlcnNpb25SSXMoU3RyaW5nIG9sZFVuaXF1ZUlkLCBTdHJpbmcgbmV3VW5pcXVlSWQsIGludCBudW1PZlJJcywgaW50IG51bU9mUmVsYXRpb25zKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZChvbGRVbmlxdWVJZCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShuZXdVbmlxdWVJZCwgc2VydmljZURldGFpbHNfMDEsIG51bU9mUklzLCBudW1PZlJlbGF0aW9ucyk7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZVRvU2Vjb25kU2VydmljZVZlcnNpb24oU3RyaW5nIHNlY29uZFNlcnZpY2VVbmlxdWVJZCwKKwkJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZVRvQWRkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoc2Vjb25kU2VydmljZVVuaXF1ZUlkKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdFJlc3AgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlVG9BZGQsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0UmVzcCk7CisJCXJldHVybiBjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RSZXNwOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVRvVW5zdXBwb3J0ZWRDb21wb25lbnRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1bnN1cHBvcnRlZFR5cGUgPSAidW5zdXBwb3J0ZWQiOworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKAorCQkJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCB1bnN1cHBvcnRlZFR5cGUpOworCQljaGVja0Vycm9yTWVzc2FnZShBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KHVuc3VwcG9ydGVkVHlwZSkpLCA0MDAsCisJCQkJY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VCeURpZmZlcmVudERlc2lnbmVyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCWNyZWF0ZVZGSW5zdGFuY2VBbmRBdG9taWNSZXNvdXJjZUluc3RhbmNlU3VjY2Vzc3VsbHkocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKworCQlkZWxldGVWRkluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIyKSwgNDA5KTsKKwkJZGVsZXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZUZhaWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSMiksIDQwOSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VCeURpZmZlcmVudERlc2lnbmVyVGVzdF9TZXJ2aWNlSXNDaGVja2VkaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgb2xkU2VydmljZVVuaXF1ZUlkID0gc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpbkF0b21pY0luc3RhbmNlRm9yU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlQXRvbWljUmVzb3VyY2VJbnN0UmVzcCk7CisKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQljaGFuZ2VTZXJ2aWNlTGlmZWN5Y2xlU3RhdGUoc2VydmljZURldGFpbHNfMDEsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUjIpLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlTdHJpbmcgbmV3U2VydmljZVVuaXF1ZUlkID0gc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKTsKKworCQlTdHJpbmcgb2xkVkZJbnN0YW5jZVVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyBuZXdWRkluc3RhbmNlVW5pcXVlSWQgPSBvbGRWRkluc3RhbmNlVW5pcXVlSWQucmVwbGFjZUFsbChvbGRTZXJ2aWNlVW5pcXVlSWQsCisJCQkJc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCVN0cmluZyBvbGRBdG9taWNSZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RSZXNwKTsKKwkJU3RyaW5nIG5ld0F0b21pY1Jlc291cmNlSW5zdGFuY2VVbmlxdWVJZCA9IG9sZEF0b21pY1Jlc291cmNlSW5zdGFuY2VVbmlxdWVJZC5yZXBsYWNlQWxsKG9sZFNlcnZpY2VVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKworCQlkZWxldGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVN1Y2Nlc3NmdWxseShuZXdWRkluc3RhbmNlVW5pcXVlSWQsIG5ld0F0b21pY1Jlc291cmNlSW5zdGFuY2VVbmlxdWVJZCwKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIyKSk7CisKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQob2xkU2VydmljZVVuaXF1ZUlkKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCisJCXNlcnZpY2VEZXRhaWxzXzAxLnNldFVuaXF1ZUlkKG5ld1NlcnZpY2VVbmlxdWVJZCk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShvbGRTZXJ2aWNlVW5pcXVlSWQsIHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCkpOworCQlkZWxldGVDb21wSW5zdFJlcUNhcEZyb21FeHBlY3RlZChuZXdWRkluc3RhbmNlVW5pcXVlSWQpOworCQlkZWxldGVDb21wSW5zdFJlcUNhcEZyb21FeHBlY3RlZChuZXdBdG9taWNSZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMCwgMCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVZGSW5zdGFuY2VBbmRBdG9taWNSZXNvdXJjZUluc3RhbmNlU3VjY2Vzc2Z1bGx5KFN0cmluZyB2Zkluc3RhbmNlVW5pcXVlSWQsCisJCQlTdHJpbmcgYXRvbWljUmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCWRlbGV0ZVZGSW5zdGFuY2VBbmRBdG9taWNSZXNvdXJjZUluc3RhbmNlU3VjY2Vzc2Z1bGx5KHZmSW5zdGFuY2VVbmlxdWVJZCwgYXRvbWljUmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCX0KKworCXByaXZhdGUgdm9pZCBkZWxldGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVN1Y2Nlc3NmdWxseShTdHJpbmcgdmZJbnN0YW5jZVVuaXF1ZUlkLAorCQkJU3RyaW5nIGF0b21pY1Jlc291cmNlSW5zdGFuY2VVbmlxdWVJZCwgVXNlciB1c2VyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBkZWxldGVWRkluc3RSZXNwID0gZGVsZXRlVkZJbnN0YW5jZSh2Zkluc3RhbmNlVW5pcXVlSWQsIHNlcnZpY2VEZXRhaWxzXzAxLCB1c2VyKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tEZWxldGVSZXNwb25zZShkZWxldGVWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUF0b21pY1Jlc291cmNlSW5zUmVzcCA9IGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZShhdG9taWNSZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQsCisJCQkJc2VydmljZURldGFpbHNfMDEsIHVzZXIpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZUF0b21pY1Jlc291cmNlSW5zUmVzcCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZUluc3RhbmNlQnlUZXN0ZXJVc2VyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVN1Y2Nlc3N1bGx5KHJlc291cmNlRGV0YWlsc1ZGXzAxLCByZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCWRlbGV0ZVZGSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpLCA0MDkpOworCQlkZWxldGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgNDA5KTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZUJ5Tm90QVNEQ1VzZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVZGSW5zdGFuY2VBbmRBdG9taWNSZXNvdXJjZUluc3RhbmNlU3VjY2Vzc3VsbHkocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKwkJVXNlciBub3RBU0RDVXNlciA9IG5ldyBVc2VyKCk7CisJCW5vdEFTRENVc2VyLnNldFVzZXJJZCgiYWIwMDAxIik7CisJCWRlbGV0ZVZGSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCW5vdEFTRENVc2VyLCA0MDkpOworCQlkZWxldGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBub3RBU0RDVXNlciwgNDA5KTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZUZyb21DaGVja2VkaW5TZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVWRkluc3RhbmNlQW5kQXRvbWljUmVzb3VyY2VJbnN0YW5jZVN1Y2Nlc3N1bGx5KHJlc291cmNlRGV0YWlsc1ZGXzAxLCByZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCWNoYW5nZVNlcnZpY2VMaWZlY3ljbGVTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJZGVsZXRlVkZJbnN0YW5jZUZhaWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgNDA5KTsKKwkJZGVsZXRlQXRvbWljUmVzb3VyY2VJbnN0YW5jZUZhaWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgNDA5KTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVdoaWxlUmVzb3VyY2VDZXJ0aWZpZWRTdGF0ZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGXzAxKTsKKwkJY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsc0NQXzAxKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0YW5jZSA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RhbmNlKTsKKwkJU3RyaW5nIHZmSW5zdFVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0YW5jZSk7CisJCVJlc3RSZXNwb25zZSBhdG9taWNJbnN0YW5jZUZvclNlcnZpY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc0NQXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGF0b21pY0luc3RhbmNlRm9yU2VydmljZSk7CisJCVN0cmluZyBhdG9taWNJbnN0VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShhdG9taWNJbnN0YW5jZUZvclNlcnZpY2UpOworCisJCWRlbGV0ZVZGSW5zdGFuY2VBbmRBdG9taWNSZXNvdXJjZUluc3RhbmNlU3VjY2Vzc2Z1bGx5KHZmSW5zdFVuaXF1ZUlkLCBhdG9taWNJbnN0VW5pcXVlSWQpOworCisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAwLCAwKTsKKwl9CisKKwkvLyBmYWlsIC0gYnVnIERFMTkxODQ5CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVOb3RGb3VuZFJlc291cmNlSW5zdGFuY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiwgVGhyb3dhYmxlIHsKKworCQlyZXNvdXJjZURldGFpbHNWRl8wMS5zZXRVbmlxdWVJZCgiMTIzNCIpOworCQlyZXNvdXJjZURldGFpbHNDUF8wMS5zZXRVbmlxdWVJZCgiNTY3OCIpOworCisJCWRlbGV0ZVZGSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSksCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsIDQwNCk7CisJCWRlbGV0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2VGYWlsKEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSksCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsIDQwNCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAwLCAwKTsKKworCQkvLyB7InJlcXVlc3RFcnJvciI6eyJzZXJ2aWNlRXhjZXB0aW9uIjp7Im1lc3NhZ2VJZCI6IlNWQzQ1MDMiLCJ0ZXh0IjoiRXJyb3I6CisJCS8vIFJlcXVlc3RlZCAnJTEnIHNlcnZpY2Ugd2FzIG5vdCBmb3VuZC4iLCJ2YXJpYWJsZXMiOlsiMTIzNCJdfX19PgorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZUZyb21TZXJ2aWNlTm90Rm91bmRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiwgVGhyb3dhYmxlIHsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoIjEyMzQiKTsKKwkJZGVsZXRlVkZJbnN0YW5jZUZhaWwoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5ELCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgiIikpLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDQpOworCQlkZWxldGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSksCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsIDQwNCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZUluc3RhbmNlRnJvbVVuc3VwcG9ydGVkVHlwZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVuc3VwcG9ydGVkVHlwZSA9ICJ1bnN1cHBvcnRlZFR5cGUiOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlVkZJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2Uoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZURldGFpbHNWRl8wMS5nZXRVbmlxdWVJZCgpLCB1bnN1cHBvcnRlZFR5cGUpOworCQljaGVja0Vycm9yTWVzc2FnZShBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KHVuc3VwcG9ydGVkVHlwZSkpLCA0MDAsCisJCQkJZGVsZXRlVkZJbnN0YW5jZVJlc3BvbnNlKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDAsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVdpdGhFbXB0eVNlcnZpY2VVaWRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiwgVGhyb3dhYmxlIHsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoIiIpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlVkZJbnN0UmVzcCA9IGRlbGV0ZVZGSW5zdGFuY2UocmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0VW5pcXVlSWQoKSwgc2VydmljZURldGFpbHNfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscyg0MDQsIGRlbGV0ZVZGSW5zdFJlc3AuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZUluc3RhbmNlV2l0aEVtcHR5UmVzb3VyY2VJbnN0YW5jZVVpZFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uLCBUaHJvd2FibGUgeworCQlSZXN0UmVzcG9uc2UgZGVsZXRlVkZJbnN0UmVzcCA9IGRlbGV0ZVZGSW5zdGFuY2UoIiIsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKDQwNSwgZGVsZXRlVkZJbnN0UmVzcC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDAsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVdpdGhFbXB0eVVzZXJJZFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2RuY0Rlc2lnbmVyRGV0YWlscy5zZXRVc2VySWQoIiIpOworCQlkZWxldGVWRkluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDkpOworCQlkZWxldGVBdG9taWNSZXNvdXJjZUluc3RhbmNlRmFpbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpLAorCQkJCXJlc291cmNlRGV0YWlsc0NQXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCA0MDkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMCwgMCk7CisJfQorCisJLy8gZmFpbCAtIGJ1ZyBERTE4ODk5NAorCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZVRvUmVzb3VyY2VJbnN0YW5jZU5vdEZvdW5kVGVzdCgpIHRocm93cyBFeGNlcHRpb24sIFRocm93YWJsZSB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVkZJbnN0UmVzcCk7CisJCVN0cmluZyBjYXBDb21wSW5zdElkID0gIjEyMzQiOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4oKTsKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwID0gbmV3IENhcGFiaWxpdHlEZWZpbml0aW9uKCk7CisJCWNhcC5zZXRVbmlxdWVJZChjYXBDb21wSW5zdElkKTsKKwkJY2FwTGlzdEJlZm9yZUFzc29jaWF0ZS5hZGQoY2FwKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24ocmVxQ29tcEluc3RJZCwgY2FwQ29tcEluc3RJZCwgQ0FQQUJJTElUWV9UWVBFLAorCQkJCVJFUVVJUkVNRU5UX05BTUUsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsIHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUpOworCisJCWFzc29jYWl0ZUluc3RhbmNlc0ZhaWwocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9OT1RfRk9VTkQsIDQwNCwKKwkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChjYXBDb21wSW5zdElkKSkpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZBZnRlckFzc29jaWF0ZSA9IENvbXBvbmVudFJlc3RVdGlscworCQkJCS5nZXRBbmRQYXJzZUNvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUgPSBjYXBSZXFEZWZBZnRlckFzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcXVpcmVtZW50c0FmdGVyQXNzb2ljYXRlID0gY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCByZXFMaXN0QmVmb3JlQXNzb2NpYXRlLAorCQkvLyByZXF1aXJlbWVudHNBZnRlckFzc29pY2F0ZSk7CisJCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlLAorCQkvLyBjYXBhYmlsaXRpZXNBZnRlckFzc29jaWF0ZSk7CisKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDEsIDApOworCisJCS8vICJtZXNzYWdlSWQiOiAiU1ZDNDExNiIsCisJCS8vICJ0ZXh0IjogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIiwKKwkJLy8gInZhcmlhYmxlcyI6IFsKKwkJLy8gIlZGMTAwIDEiLAorCQkvLyAiOWFlNzY3ODYtMmE5Yy00NDA5LTk1Y2ItZGIzMjg4NWVkMDdmLmVlY2U4YWFmLWViOWYtNGFmZi1iOWE1LWExMWNhMTFkZTllNS52ZjEwMDEiLAorCQkvLyAiaG9zdCIKKwkJLy8gXQorCX0KKworCS8vIHRoaXMgY2FzZSBpcyBub3QgcmVsZXZhbnQgYW55IG1vcmUsIGl0IGlzIHRlc3RlZCBhcyBwYXJ0IG9mIG9jY3VycmVuY2VzCisJLy8gc3RvcnkKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgYXNzb2NpYXRlT25jZUFnYWluRXhpc3RpbmdSZWxhdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUZpcnN0VkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTdHJpbmcgcmVxQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUZpcnN0VkZJbnN0UmVzcCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZWNvbmRWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyBjYXBDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2Vjb25kVkZJbnN0UmVzcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IENvbXBvbmVudFJlc3RVdGlscworCQkJCS5nZXRBbmRQYXJzZUNvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24ocmVxQ29tcEluc3RJZCwgY2FwQ29tcEluc3RJZCwgQ0FQQUJJTElUWV9UWVBFLAorCQkJCVJFUVVJUkVNRU5UX05BTUUsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsIHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUpOworCisJCWFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlc0ZvclNlcnZpY2UocmVxdWlyZW1lbnREZWYsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBOTyBFUlJPUiAtIFJFTEFUSU9OIEFMUkVBRFkgRVhJU1QKKwkJLy8gYXNzb2NhaXRlSW5zdGFuY2VzRmFpbChyZXF1aXJlbWVudERlZiwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJLy8gQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORCwgNDA0LCBuZXcKKwkJLy8gQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChjYXBDb21wSW5zdElkKSkpOworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QWZ0ZXJBc3NvY2lhdGUgPSBjYXBSZXFEZWZBZnRlckFzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCisJCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCBudWxsLAorCQkvLyByZXFMaXN0QWZ0ZXJBc3NvY2lhdGUpOworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwKKwkJLy8gY2FwTGlzdEFmdGVyQXNzb2NpYXRlKTsKKworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMiwgMSk7CisKKwkJLy8gIm1lc3NhZ2VJZCI6ICJTVkM0MTE5IiwKKwkJLy8gInRleHQiOiAiRXJyb3I6IE5vIHJlbGF0aW9uIGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2VzCisJCS8vIFx1MDAyNyUxXHUwMDI3IGFuZCBcdTAwMjclMlx1MDAyNyBmb3IgcmVxdWlyZW1lbnQgXHUwMDI3JTNcdTAwMjcuIiwKKwkJLy8gInZhcmlhYmxlcyI6IFsKKwkJLy8gIlZGMTAwIDEiLAorCQkvLyAiVkZfYWRtaW4gMiIsCisJCS8vICJob3N0IgorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVJbnN0YW5jZXNJbk1pc3NpbmdTZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZXJ2aWNlRGV0YWlsc18wMS5zZXRVbmlxdWVJZCgiMTIzNCIpOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCWFzc29jYWl0ZUluc3RhbmNlc0ZhaWwocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORCwgNDA0LAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlQWZ0ZXJEZWxldGluZ1Jlc291cmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlRmlyc3RWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSk7CisKKwkJUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0VW5pcXVlSWQoKSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VzRm9yU2VydmljZShyZXF1aXJlbWVudERlZiwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCisJCS8vIGZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gOgorCQkvLyBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlKSB7CisJCS8vIGlmIChjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRUeXBlKCkuZXF1YWxzKENBUEFCSUxJVFlfVFlQRSkpeworCQkvLyBjYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRNaW5PY2N1cnJlbmNlcygiMCIpOworCQkvLyB9CisJCS8vIH0KKwkJLy8KKwkJLy8gTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RBZnRlckFzc29jaWF0ZSA9CisJCS8vIGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpLmdldChDQVBBQklMSVRZX1RZUEUpOworCQkvLworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgbnVsbCwKKwkJLy8gcmVxTGlzdEFmdGVyQXNzb2NpYXRlKTsKKwkJLy8KKwkJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsCisJCS8vIGNhcExpc3RBZnRlckFzc29jaWF0ZSk7CisKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlSW5zdGFuY2VzSW5DaGVja2VkaW5TZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlRmlyc3RWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSk7CisKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCisJCWFzc29jYWl0ZUluc3RhbmNlc0ZhaWwocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgNDA5LAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1aXJlbWVudHNBZnRlckFzc29pY2F0ZSA9IGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxdWlyZW1lbnRzQWZ0ZXJBc3NvaWNhdGUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUpOworCisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwkvLyBmYWlsIC0gYnVnIERFMTg4OTk0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVBZnRlckNoZWNrb3V0QWxsSW5zdGFuY2VzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlyc3RWRlVuaXF1ZUlkID0gcmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0VW5pcXVlSWQoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUZpcnN0VkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTdHJpbmcgcmVxQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUZpcnN0VkZJbnN0UmVzcCk7CisJCVN0cmluZyBzZWNvbmRWRlVuaXF1ZUlkID0gcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSk7CisKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJY2hhbmdlUmVzb3VyY2VMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKworCQlyZXF1aXJlbWVudERlZi5zZXRGcm9tTm9kZSgKKwkJCQlyZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpLnJlcGxhY2VBbGwoZmlyc3RWRlVuaXF1ZUlkLCByZXNvdXJjZURldGFpbHNWRl8wMS5nZXRVbmlxdWVJZCgpKSk7CisJCXJlcXVpcmVtZW50RGVmCisJCQkJLnNldFRvTm9kZShyZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKS5yZXBsYWNlQWxsKHNlY29uZFZGVW5pcXVlSWQsIHJlc291cmNlRGV0YWlsc1ZGXzAyLmdldFVuaXF1ZUlkKCkpKTsKKworCQlhc3NvY2FpdGVJbnN0YW5jZXNGYWlsKHJlcXVpcmVtZW50RGVmLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIDQwOSwKKwkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXNBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxdWlyZW1lbnRzQWZ0ZXJBc3NvaWNhdGUgPSBjYXBSZXFEZWZBZnRlckFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUsCisJCS8vIHJlcXVpcmVtZW50c0FmdGVyQXNzb2ljYXRlKTsKKwkJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsCisJCS8vIGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlKTsKKworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMiwgMCk7CisKKwkJLy8gIm1lc3NhZ2VJZCI6ICJTVkM0MTE2IiwKKwkJLy8gInRleHQiOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4iLAorCQkvLyAidmFyaWFibGVzIjogWworCQkvLyAiZTlkY2VhMTUtY2UyNy00MzgxLWE1NTQtNDI3ODk3M2NlZmIxLmQwYjNhZmZkLWNmOTItNDYyNi1hZGZlLTk2MWI0NDEwMzkyNC52ZjEwMDEiLAorCQkvLyAiZTlkY2VhMTUtY2UyNy00MzgxLWE1NTQtNDI3ODk3M2NlZmIxLmQwYjNhZmZkLWNmOTItNDYyNi1hZGZlLTk2MWI0NDEwMzkyNC52ZjEwMDEiLAorCQkvLyAiaG9zdCIKKwkJLy8gXQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhc3NvY2lhdGVJbnN0YW5jZXNCeURpZmZlcmVudFVzZXJzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlRmlyc3RWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSk7CisKKwkJYXNzb2NhaXRlSW5zdGFuY2VzRmFpbChyZXF1aXJlbWVudERlZiwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSMiksCisJCQkJQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCA0MDksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKwkJYXNzb2NhaXRlSW5zdGFuY2VzRmFpbChyZXF1aXJlbWVudERlZiwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUiksCisJCQkJQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCA0MDksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKwkJYXNzb2NhaXRlSW5zdGFuY2VzRmFpbChyZXF1aXJlbWVudERlZiwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkdPVkVSTk9SKSwKKwkJCQlBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIDQwOSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQlhc3NvY2FpdGVJbnN0YW5jZXNGYWlsKHJlcXVpcmVtZW50RGVmLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uT1BTKSwKKwkJCQlBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIDQwOSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCQlhc3NvY2FpdGVJbnN0YW5jZXNGYWlsKHJlcXVpcmVtZW50RGVmLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9NQU5BR0VSMSksCisJCQkJQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCA0MDksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1aXJlbWVudHNBZnRlckFzc29pY2F0ZSA9IGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxdWlyZW1lbnRzQWZ0ZXJBc3NvaWNhdGUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUpOworCisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXNzb2NhaXRlSW5zdGFuY2VzRmFpbChSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYsIFVzZXIgdXNlciwKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIGludCBlcnJvckNvZGUsIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlc1Jlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIHVzZXIsCisJCQkJc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWNoZWNrRXJyb3JNZXNzYWdlKGFjdGlvblN0YXR1cywgdmFyaWFibGVzLCBlcnJvckNvZGUsIGFzc29jaWF0ZUluc3RhbmNlc1Jlc3ApOworCX0KKworCXByaXZhdGUgdm9pZCBkaXNzb2ljYXRlSW5zdGFuY2VzRmFpbChSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYsIFVzZXIgdXNlciwKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIGludCBlcnJvckNvZGUsIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGRpc3NvaWNhdGVJbnN0YW5jZXNSZXNwID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGlzc29jaWF0ZUluc3RhbmNlcyhyZXF1aXJlbWVudERlZiwgdXNlciwKKwkJCQlzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJY2hlY2tFcnJvck1lc3NhZ2UoYWN0aW9uU3RhdHVzLCB2YXJpYWJsZXMsIGVycm9yQ29kZSwgZGlzc29pY2F0ZUluc3RhbmNlc1Jlc3ApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlV2l0aE1pc3NpbmdTZXJ2aWNlVWlkVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCXNlcnZpY2VEZXRhaWxzXzAxLnNldFVuaXF1ZUlkKCIiKTsKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlc1Jlc3AgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydEVxdWFscyg0MDQsIGFzc29jaWF0ZUluc3RhbmNlc1Jlc3AuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJLy8gZmFpbCAtIGJ1ZyBERTE5MTgyNAorCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlTm90Q29tcGl0YWJsZVJlcUNhcFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUZpcnN0QXRvbWljUmVzb3VyY2VJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpbkF0b21pY0luc3RhbmNlRm9yU2VydmljZShzZXJ2aWNlRGV0YWlsc18wMSwKKwkJCQlyZXNvdXJjZURldGFpbHNDUF8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdE5hbWUgPSBSZXNwb25zZVBhcnNlci5nZXROYW1lRnJvbVJlc3BvbnNlKGNyZWF0ZUZpcnN0QXRvbWljUmVzb3VyY2VJbnN0UmVzcCk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlRmlyc3RBdG9taWNSZXNvdXJjZUluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZEF0b21pY1Jlc291cmNlSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5BdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkxfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTdHJpbmcgY2FwQ29tcEluc3ROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0TmFtZUZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRBdG9taWNSZXNvdXJjZUluc3RSZXNwKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRBdG9taWNSZXNvdXJjZUluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlcUNvbXBJbnN0TmFtZSk7CisJCXZhcmlhYmxlcy5hZGQoY2FwQ29tcEluc3ROYW1lKTsKKwkJdmFyaWFibGVzLmFkZChSRVFVSVJFTUVOVF9OQU1FKTsKKworCQlhc3NvY2FpdGVJbnN0YW5jZXNGYWlsKHJlcXVpcmVtZW50RGVmLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTUFUQ0hfTk9UX0ZPVU5ELCA0MDQsCisJCQkJdmFyaWFibGVzKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGllc0FmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1aXJlbWVudHNBZnRlckFzc29pY2F0ZSA9IGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSwKKwkJLy8gcmVxdWlyZW1lbnRzQWZ0ZXJBc3NvaWNhdGUpOworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwKKwkJLy8gY2FwYWJpbGl0aWVzQWZ0ZXJBc3NvY2lhdGUpOworCisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKworCQkvLyB7InJlcXVlc3RFcnJvciI6eyJzZXJ2aWNlRXhjZXB0aW9uIjp7Im1lc3NhZ2VJZCI6IlNWQzQxMTkiLCJ0ZXh0IjoiRXJyb3I6CisJCS8vIE5vIHJlbGF0aW9uIGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2VzICclMScgYW5kICclMicgZm9yCisJCS8vIHJlcXVpcmVtZW50ICclMycuIiwidmFyaWFibGVzIjpbIkNQMTAwIDEiLCJWTDIwMCAyIiwiaG9zdCJdfX19PgorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXNzb2NpYXRlSW5zdGFuY2VzSW5Ud29TZXJ2aWNlVmVyc2lvbnNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBvbGRTZXJ2aWNlVW5pcXVlSWQgPSBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlRmlyc3RWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSk7CisJCWFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlc0ZvclNlcnZpY2UocmVxdWlyZW1lbnREZWYsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDEpOworCisJCWNoYW5nZVNlcnZpY2VMaWZlY3ljbGVTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJU3RyaW5nIHNlY29uZFNlcnZpY2VVbmlxdWVJZCA9IHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCk7CisKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQob2xkU2VydmljZVVuaXF1ZUlkKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDEpOworCisJCXVwZGF0ZUNhcGFiaWxpdGllc093bmVySWQob2xkU2VydmljZVVuaXF1ZUlkLCBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlLCBzZWNvbmRTZXJ2aWNlVW5pcXVlSWQpOworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUob2xkU2VydmljZVVuaXF1ZUlkLCBzZWNvbmRTZXJ2aWNlVW5pcXVlSWQpOworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RBZnRlckFzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEFmdGVyQXNzb2NpYXRlID0gY2FwUmVxRGVmQWZ0ZXJBc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCS8vIEFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVxdWlyZW1lbnQiLCBudWxsLAorCQkvLyByZXFMaXN0QWZ0ZXJBc3NvY2lhdGUpOworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGNhcGFiaWxpdGllcyIsCisJCS8vIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsIGNhcExpc3RBZnRlckFzc29jaWF0ZSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAxKTsKKworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVGhpcmRWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFTZWNvbmRDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVGhpcmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlU2Vjb25kZXJ5QXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlU2Vjb25kZXJ5QXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlU2Vjb25kZXJ5QXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZVNlY29uZGVyeUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZVNlY29uZGVyeUFzc29jaWF0ZQorCQkJCS5nZXRSZXF1aXJlbWVudHMoKS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQljYXBDb21wSW5zdElkID0gY2FwQ29tcEluc3RJZC5yZXBsYWNlQWxsKG9sZFNlcnZpY2VVbmlxdWVJZCwgc2Vjb25kU2VydmljZVVuaXF1ZUlkKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHNlY29uZFJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24ocmVxU2Vjb25kQ29tcEluc3RJZCwgY2FwQ29tcEluc3RJZCwKKwkJCQlDQVBBQklMSVRZX1RZUEUsIFJFUVVJUkVNRU5UX05BTUUsIGNhcExpc3RCZWZvcmVTZWNvbmRlcnlBc3NvY2lhdGUsIHJlcUxpc3RCZWZvcmVTZWNvbmRlcnlBc3NvY2lhdGUpOworCQlhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHNlY29uZFJlcXVpcmVtZW50RGVmLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyU2Vjb25kZXJ5QXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QWZ0ZXJTZWNvbmRlcnlBc3NvY2lhdGUgPSBjYXBSZXFEZWZBZnRlclNlY29uZGVyeUFzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RBZnRlclNlY29uZGVyeUFzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyU2Vjb25kZXJ5QXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgbnVsbCwKKwkJLy8gcmVxTGlzdEFmdGVyU2Vjb25kZXJ5QXNzb2NpYXRlKTsKKwkJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXBhYmlsaXRpZXMiLAorCQkvLyBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlLCBjYXBMaXN0QWZ0ZXJTZWNvbmRlcnlBc3NvY2lhdGUpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMywgMik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhcGFiaWxpdGllc093bmVySWQoU3RyaW5nIG9sZFVuaXF1ZUlkLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0LCBTdHJpbmcgbmV3VW5pcXVlSWQpIHsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQobmV3VW5pcXVlSWQpOworCQlmb3IgKENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcCA6IGNhcExpc3QpIHsKKwkJCVN0cmluZyBvbGRPd25lcklkID0gY2FwLmdldE93bmVySWQoKTsKKwkJCVN0cmluZyBuZXdPd25lcklkID0gb2xkT3duZXJJZC5yZXBsYWNlQWxsKG9sZFVuaXF1ZUlkLCBuZXdVbmlxdWVJZCk7CisJCQljYXAuc2V0T3duZXJJZChuZXdPd25lcklkKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzc29jaWF0ZVJlbGF0aW9uTm90Rm91bmRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIHJlcUNvbXBJbnN0SWQgPSAiMTIzNCI7CisJCWNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAyLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSAiNDU2NyI7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZiA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRBbmRQYXJzZUNvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gY2FwUmVxRGVmLmdldENhcGFiaWxpdGllcygpLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdCA9IGNhcFJlcURlZi5nZXRSZXF1aXJlbWVudHMoKS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdCwgcmVxTGlzdCk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlcUNvbXBJbnN0SWQpOworCQl2YXJpYWJsZXMuYWRkKGNhcENvbXBJbnN0SWQpOworCQl2YXJpYWJsZXMuYWRkKFJFUVVJUkVNRU5UX05BTUUpOworCQlkaXNzb2ljYXRlSW5zdGFuY2VzRmFpbChyZXF1aXJlbWVudERlZiwgc2RuY0Rlc2lnbmVyRGV0YWlscywgQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX1JFTEFUSU9OX05PVF9GT1VORCwKKwkJCQk0MDQsIHZhcmlhYmxlcyk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZSA9IENvbXBvbmVudFJlc3RVdGlscworCQkJCS5nZXRBbmRQYXJzZUNvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdEFmdGVyRGlzc29jaWF0ZSA9IGNhcFJlcURlZkFmdGVyRGlzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RBZnRlckRpc3NvY2lhdGUgPSBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIDEsIHJlcUxpc3RBZnRlckRpc3NvY2lhdGUuc2l6ZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIHJlcUxpc3QsIHJlcUxpc3RBZnRlckRpc3NvY2lhdGUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIGNhcGFiaWxpdGllcyIsIGNhcExpc3QsIGNhcExpc3RBZnRlckRpc3NvY2lhdGUpOworCisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAwKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzc29jaWF0ZVJlbGF0aW9uSW5TZXJ2aWNlTm90Rm91bmRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1bmlxdWVJZCA9ICIxMjM0IjsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUZpcnN0VkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTdHJpbmcgcmVxQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUZpcnN0VkZJbnN0UmVzcCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZWNvbmRWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDIsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyBjYXBDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlU2Vjb25kVkZJbnN0UmVzcCk7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IENvbXBvbmVudFJlc3RVdGlscworCQkJCS5nZXRBbmRQYXJzZUNvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24ocmVxQ29tcEluc3RJZCwgY2FwQ29tcEluc3RJZCwgQ0FQQUJJTElUWV9UWVBFLAorCQkJCVJFUVVJUkVNRU5UX05BTUUsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsIHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUpOworCisJCXNlcnZpY2VEZXRhaWxzXzAxLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJZGlzc29pY2F0ZUluc3RhbmNlc0ZhaWwocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORCwgNDA0LAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KCIiKSkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkaXNzb2ljYXRlUmVsYXRpb25XaGlsZUluc3RhbmNlTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNhcFVuaXF1ZUlkID0gIjEyMzQiOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVGaXJzdFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIHJlcUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVGaXJzdFZGSW5zdFJlc3ApOworCQljcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyBjYXBDb21wSW5zdElkID0gY2FwVW5pcXVlSWQ7CisKKwkJQ2FwUmVxRGVmIGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZSA9IENvbXBvbmVudFJlc3RVdGlscworCQkJCS5nZXRBbmRQYXJzZUNvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUuZ2V0UmVxdWlyZW1lbnRzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gZ2V0UmVxQ2FwUmVsYXRpb24ocmVxQ29tcEluc3RJZCwgY2FwQ29tcEluc3RJZCwgQ0FQQUJJTElUWV9UWVBFLAorCQkJCVJFUVVJUkVNRU5UX05BTUUsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsIHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdmFyaWFibGVzLmFkZChyZXFDb21wSW5zdElkKTsKKwkJdmFyaWFibGVzLmFkZChjYXBDb21wSW5zdElkKTsKKwkJdmFyaWFibGVzLmFkZChSRVFVSVJFTUVOVF9OQU1FKTsKKwkJZGlzc29pY2F0ZUluc3RhbmNlc0ZhaWwocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9SRUxBVElPTl9OT1RfRk9VTkQsCisJCQkJNDA0LCB2YXJpYWJsZXMpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RBZnRlckRpc3NvY2lhdGUgPSBjYXBSZXFEZWZBZnRlckRpc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0QWZ0ZXJEaXNzb2NpYXRlID0gY2FwUmVxRGVmQWZ0ZXJEaXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEFmdGVyRGlzc29jaWF0ZSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgY2FwYWJpbGl0aWVzIiwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgY2FwTGlzdEFmdGVyRGlzc29jaWF0ZSk7CisKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGlzc29jaWF0ZVdoaWxlU2VydmljZUNoZWNrZWRpblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCWRpc3NvaWNhdGVJbnN0YW5jZXNGYWlsKHJlcXVpcmVtZW50RGVmLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIDQwOSwKKwkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkaXNzb2ljYXRlV2l0aEVtcHR5VXNlcklkSGVhZGVyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlzZG5jRGVzaWduZXJEZXRhaWxzLnNldFVzZXJJZCgiIik7CisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJZGlzc29pY2F0ZUluc3RhbmNlc0ZhaWwocmVxdWlyZW1lbnREZWYsIHNkbmNEZXNpZ25lckRldGFpbHMsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgNDA5LAorCQkJCW5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRpc3NvY2lhdGVXaXRoTWlzc2luZ1VpZE9mU2VydmljZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2VydmljZURldGFpbHNfMDEuc2V0VW5pcXVlSWQoIiIpOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCVJlc3RSZXNwb25zZSBkaXNzb2NpYXRlUmVzcCA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmRpc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCWFzc2VydEVxdWFscyg0MDQsIGRpc3NvY2lhdGVSZXNwLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcmVsYXRpb25EZWxldGVkQWZ0ZXJEZWxldGluZ1Jlc291cmNlSW5zdGFuY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVGaXJzdFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIHJlcUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVGaXJzdFZGSW5zdFJlc3ApOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2Vjb25kVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTdHJpbmcgY2FwQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlY29uZFZGSW5zdFJlc3ApOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IGdldFJlcUNhcFJlbGF0aW9uKHJlcUNvbXBJbnN0SWQsIGNhcENvbXBJbnN0SWQsIENBUEFCSUxJVFlfVFlQRSwKKwkJCQlSRVFVSVJFTUVOVF9OQU1FLCBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlLCByZXFMaXN0QmVmb3JlQXNzb2NpYXRlKTsKKworCQlhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAyLCAxKTsKKworCQlSZXN0UmVzcG9uc2UgZGVsZXRlVkZJbnN0YW5jZSA9IGRlbGV0ZVZGSW5zdGFuY2UocmVxQ29tcEluc3RJZCwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jaGVja0RlbGV0ZVJlc3BvbnNlKGRlbGV0ZVZGSW5zdGFuY2UpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMSwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCByZWxhdGlvbk5vdEZvdW5kSW5TZWNvbmRWZXJzaW9uQWZ0ZXJEaXNzb2NpYXRlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgb2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UgPSBzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlRmlyc3RWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBDQVBBQklMSVRZX1RZUEUsCisJCQkJUkVRVUlSRU1FTlRfTkFNRSwgY2FwTGlzdEJlZm9yZUFzc29jaWF0ZSwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSk7CisKKwkJYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VzRm9yU2VydmljZShyZXF1aXJlbWVudERlZiwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlkaXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VzRm9yU2VydmljZShyZXF1aXJlbWVudERlZiwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCisJCWNoYW5nZVNlcnZpY2VMaWZlY3ljbGVTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsIHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCkpOworCQlnZXRDb21wb25lbnRBbmRWYWxpZGF0ZVJJcyhzZXJ2aWNlRGV0YWlsc18wMSwgMiwgMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkaXNzb2NpYXRlT25jZUFnYWluVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlRmlyc3RWRkluc3RSZXNwID0gY3JlYXRlQ2hlY2tlZGluVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyByZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlRmlyc3RWRkluc3RSZXNwKTsKKwkJU3RyaW5nIHJlcUNvbXBJbnNOYW1lID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydENvbXBvbmVudEluc3RhbmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlRmlyc3RWRkluc3RSZXNwLmdldFJlc3BvbnNlKCkpLmdldE5hbWUoKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVTZWNvbmRWRkluc3RSZXNwKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0TmFtZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJLmNvbnZlcnRDb21wb25lbnRJbnN0YW5jZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVNlY29uZFZGSW5zdFJlc3AuZ2V0UmVzcG9uc2UoKSkuZ2V0TmFtZSgpOworCisJCUNhcFJlcURlZiBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUgPSBDb21wb25lbnRSZXN0VXRpbHMKKwkJCQkuZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlsc18wMSk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RCZWZvcmVBc3NvY2lhdGUgPSBjYXBSZXFEZWZCZWZvcmVBc3NvY2lhdGUuZ2V0Q2FwYWJpbGl0aWVzKCkKKwkJCQkuZ2V0KENBUEFCSUxJVFlfVFlQRSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiA9IGdldFJlcUNhcFJlbGF0aW9uKHJlcUNvbXBJbnN0SWQsIGNhcENvbXBJbnN0SWQsIENBUEFCSUxJVFlfVFlQRSwKKwkJCQlSRVFVSVJFTUVOVF9OQU1FLCBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlLCByZXFMaXN0QmVmb3JlQXNzb2NpYXRlKTsKKworCQlhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWRpc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmLCBzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YXJpYWJsZXMuYWRkKHJlcUNvbXBJbnNOYW1lKTsKKwkJdmFyaWFibGVzLmFkZChjYXBDb21wSW5zdE5hbWUpOworCQl2YXJpYWJsZXMuYWRkKFJFUVVJUkVNRU5UX05BTUUpOworCisJCWRpc3NvaWNhdGVJbnN0YW5jZXNGYWlsKHJlcXVpcmVtZW50RGVmLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfUkVMQVRJT05fTk9UX0ZPVU5ELAorCQkJCTQwNCwgdmFyaWFibGVzKTsKKwl9CisKKwkvLyBmYWlsIC0gYnVnIDogREUxOTE3MDcKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFzc29jaWF0ZVR3b1JlbGF0aW9uc19DaGVja2luQ2hlY2tvdXRfRGlzc29pY2F0ZU9uZVJlbGF0aW9uSW5TZWNvbmRWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBvbGRDb250YWluZXJVbmlxdWVJZFRvUmVwbGFjZSA9IHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVGaXJzdFZGSW5zdFJlc3AgPSBjcmVhdGVDaGVja2VkaW5WRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJU3RyaW5nIHJlcUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVGaXJzdFZGSW5zdFJlc3ApOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2Vjb25kVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAyLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTdHJpbmcgY2FwQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVNlY29uZFZGSW5zdFJlc3ApOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVGhpcmRWRkluc3RSZXNwID0gY3JlYXRlVkZJbnN0YW5jZShzZXJ2aWNlRGV0YWlsc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsCisJCQkJc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCVN0cmluZyBzZWNvbmRSZXFDb21wSW5zdElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoY3JlYXRlVGhpcmRWRkluc3RSZXNwKTsKKworCQlDYXBSZXFEZWYgY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlID0gQ29tcG9uZW50UmVzdFV0aWxzCisJCQkJLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHNfMDEpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlID0gY2FwUmVxRGVmQmVmb3JlQXNzb2NpYXRlLmdldENhcGFiaWxpdGllcygpCisJCQkJLmdldChDQVBBQklMSVRZX1RZUEUpOworCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSA9IGNhcFJlcURlZkJlZm9yZUFzc29jaWF0ZS5nZXRSZXF1aXJlbWVudHMoKQorCQkJCS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWZGaXJzdFJlbGF0aW9uID0gZ2V0UmVxQ2FwUmVsYXRpb24ocmVxQ29tcEluc3RJZCwgY2FwQ29tcEluc3RJZCwKKwkJCQlDQVBBQklMSVRZX1RZUEUsIFJFUVVJUkVNRU5UX05BTUUsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsIHJlcUxpc3RCZWZvcmVBc3NvY2lhdGUpOworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWZTZWNvbmRSZWxhdGlvbiA9IGdldFJlcUNhcFJlbGF0aW9uKHNlY29uZFJlcUNvbXBJbnN0SWQsIGNhcENvbXBJbnN0SWQsCisJCQkJQ0FQQUJJTElUWV9UWVBFLCBSRVFVSVJFTUVOVF9OQU1FLCBjYXBMaXN0QmVmb3JlQXNzb2NpYXRlLCByZXFMaXN0QmVmb3JlQXNzb2NpYXRlKTsKKworCQlhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmRmlyc3RSZWxhdGlvbiwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmU2Vjb25kUmVsYXRpb24sIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDMsIDIpOworCisJCWNoYW5nZVNlcnZpY2VMaWZlY3ljbGVTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJY2hhbmdlU2VydmljZUxpZmVjeWNsZVN0YXRlKHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkJU3RyaW5nIG5ld0NvbnRhaW5lclVuaXF1ZUlkID0gc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKTsKKworCQkvLyBjaGVjayBpZiBkaXNzb2ljYXRlIG9mIG9sZCByZWxhdGlvbiBpcyBwb3NzaWJpbGUKKwkJLy8gZGlzc29pY2F0ZUluc3RhbmNlc0ZhaWwocmVxdWlyZW1lbnREZWZGaXJzdFJlbGF0aW9uLAorCQkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCBhY3Rpb25TdGF0dXMsIGVycm9yQ29kZSwgdmFyaWFibGVzKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDMsIDIpOworCisJCXJlcXVpcmVtZW50RGVmRmlyc3RSZWxhdGlvbgorCQkJCS5zZXRGcm9tTm9kZShyZXFDb21wSW5zdElkLnJlcGxhY2VBbGwob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsIG5ld0NvbnRhaW5lclVuaXF1ZUlkKSk7CisJCXJlcXVpcmVtZW50RGVmRmlyc3RSZWxhdGlvbgorCQkJCS5zZXRUb05vZGUocmVxQ29tcEluc3RJZC5yZXBsYWNlQWxsKG9sZENvbnRhaW5lclVuaXF1ZUlkVG9SZXBsYWNlLCBuZXdDb250YWluZXJVbmlxdWVJZCkpOworCisJCWRpc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKHJlcXVpcmVtZW50RGVmRmlyc3RSZWxhdGlvbiwgc2VydmljZURldGFpbHNfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCisJCS8vIHVwZGF0ZUNhcGFiaWxpdGllc093bmVySWQob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsCisJCS8vIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsIG5ld0NvbnRhaW5lclVuaXF1ZUlkKTsKKwkJLy8gQ2FwUmVxRGVmIGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlID0KKwkJLy8gQ29tcG9uZW50UmVzdFV0aWxzLmdldEFuZFBhcnNlQ29tcG9uZW50UmVxdWlybWVudHNDYXBhYmlsaXRpZXMoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJLy8gc2VydmljZURldGFpbHNfMDEpOworCQkvLyBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0QWZ0ZXJBc3NvY2lhdGUgPQorCQkvLyBjYXBSZXFEZWZBZnRlckFzc29jaWF0ZS5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoQ0FQQUJJTElUWV9UWVBFKTsKKwkJLy8gTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RBZnRlckFzc29jaWF0ZSA9CisJCS8vIGNhcFJlcURlZkFmdGVyQXNzb2NpYXRlLmdldFJlcXVpcmVtZW50cygpLmdldChDQVBBQklMSVRZX1RZUEUpOworCQkvLyBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlcXVpcmVtZW50IiwgcmVxTGlzdEJlZm9yZUFzc29jaWF0ZSwKKwkJLy8gcmVxTGlzdEFmdGVyQXNzb2NpYXRlKTsKKwkJLy8gQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIGNhcExpc3RCZWZvcmVBc3NvY2lhdGUsCisJCS8vIGNhcExpc3RBZnRlckFzc29jaWF0ZSk7CisJCXVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShvbGRDb250YWluZXJVbmlxdWVJZFRvUmVwbGFjZSwgc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCAzLCAxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VzQW5kVXBkYXRlZFNlcnZpY2VNZXRhZGF0YVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlzZXJ2aWNlRGV0YWlsc18wMi5zZXRVbmlxdWVJZChzZXJ2aWNlRGV0YWlsc18wMS5nZXRVbmlxdWVJZCgpKTsKKwkJY3JlYXRlVHdvQ2hlY2tlZGluVkZJbnN0YW5jZXMoKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzQ1BfMDEsIHNkbmNEZXNpZ25lckRldGFpbHMsICIwLjEiLAorCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWNyZWF0ZVZGSW5zdGFuY2VBbmRBdG9taWNSZXNvdXJjZUluc3RhbmNlV2l0aG91dENoZWNraW4ocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHJlc291cmNlRGV0YWlsc0NQXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3AgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVTZXJ2aWNlUmVzcCk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKHNlcnZpY2VEZXRhaWxzXzAxLCA0LCAwKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZm9yQWNjZXB0YW5jZVVzZXJTdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJU3RyaW5nIHJlcUNvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZVZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAyLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKwkJU3RyaW5nIGNhcENvbXBJbnN0SWQgPSBSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShjcmVhdGVWRkluc3RSZXNwKTsKKworCQlTdHJpbmcgY2FwVHlwZSA9IENBUEFCSUxJVFlfVFlQRTsKKwkJU3RyaW5nIHJlcU5hbWUgPSBSRVFVSVJFTUVOVF9OQU1FOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gQ29tcG9uZW50UmVzdFV0aWxzLmdldENvbXBvbmVudFJlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzKHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJc2VydmljZURldGFpbHNfMDEpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzb3VyY2VSZXNwb25zZSk7CisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgQ2FwUmVxRGVmLmNsYXNzKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwTGlzdCA9IGNhcFJlcURlZi5nZXRDYXBhYmlsaXRpZXMoKS5nZXQoY2FwVHlwZSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYgPSBnZXRSZXFDYXBSZWxhdGlvbihyZXFDb21wSW5zdElkLCBjYXBDb21wSW5zdElkLCBjYXBUeXBlLCByZXFOYW1lLAorCQkJCWNhcExpc3QsIHJlcUxpc3QpOworCisJCWFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlc0ZvclNlcnZpY2UocmVxdWlyZW1lbnREZWYsIHNlcnZpY2VEZXRhaWxzXzAxLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJZ2V0UmVzb3VyY2VSZXNwb25zZSA9IENvbXBvbmVudFJlc3RVdGlscy5nZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhzZG5jRGVzaWduZXJEZXRhaWxzLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxKTsKKwkJY2FwUmVxRGVmID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIENhcFJlcURlZi5jbGFzcyk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBsaXN0ID0gY2FwUmVxRGVmLmdldFJlcXVpcmVtZW50cygpLmdldChjYXBUeXBlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXF1aXJlbWVudCIsIG51bGwsIGxpc3QpOworCisJCXNlcnZpY2VEZXRhaWxzXzAyLnNldFVuaXF1ZUlkKHNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3AgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHNfMDIsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyh1cGRhdGVTZXJ2aWNlUmVzcCk7CisJCWNoYW5nZVNlcnZpY2VMaWZlY3ljbGVTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXMoc2VydmljZURldGFpbHNfMDEsIDIsIDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFVuc2F0aXNmaWVkQ3BSZXFJblNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBDZXJ0aWZ5IGFsbCB0aGUgbmVlZGVkIGF0b21pYyByZXNvdXJjZXMKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlSZXNvdXJjZShyZXNvdXJjZURldGFpbHNDUF8wMSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXNwb25zZSk7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkZfMDIuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXNwb25zZSk7CisJCXJlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRl8wMik7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhyZXNwb25zZSk7CisJCWNhcE93bmVySWQgPSBnZXRVbmlxdWVJZE9mRmlyc3RJbnN0YW5jZUZyb21SZXNwb25zZShyZXNwb25zZSk7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVWRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMiwKKwkJCQlzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJU3RyaW5nIHZmQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCisJCWNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclNlcnZpY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc0NQXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCQlTdHJpbmcgY29tcEluc3ROYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0TmFtZUZyb21SZXNwb25zZShjcmVhdGVBdG9taWNSZXNvdXJjZUluc3RhbmNlKTsKKwkJU3RyaW5nIGNwQ29tcEluc3RJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZUF0b21pY1Jlc291cmNlSW5zdGFuY2UpOworCisJCVJlc3RSZXNwb25zZSBzdWJtaXRGb3JUZXN0aW5nID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJU3RyaW5nW10gdmFyaWFibGVzID0gbmV3IFN0cmluZ1tdIHsgc2VydmljZURldGFpbHNfMDEuZ2V0TmFtZSgpLCAic2VydmljZSIsICJDUCAoQ29ubmVjdGlvbiBQb2ludCkiLAorCQkJCWNvbXBJbnN0TmFtZSwgInJlcXVpcmVtZW50IiwgInRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlIiwgImZ1bGZpbGxlZCIgfTsKKwkJQmFzZVZhbGlkYXRpb25VdGlscy5jaGVja0Vycm9yUmVzcG9uc2Uoc3VibWl0Rm9yVGVzdGluZywKKwkJCQlBY3Rpb25TdGF0dXMuUkVRX0NBUF9OT1RfU0FUSVNGSUVEX0JFRk9SRV9DRVJUSUZJQ0FUSU9OLCB2YXJpYWJsZXMpOworCisJCWZ1bGZpbGxDcFJlcXVpcmVtZW50KHNlcnZpY2VEZXRhaWxzXzAxLCBjcENvbXBJbnN0SWQsIHZmQ29tcEluc3RJZCwgY2FwT3duZXJJZCwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKworCQlzdWJtaXRGb3JUZXN0aW5nID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsc18wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJQmFzZVZhbGlkYXRpb25VdGlscy5jaGVja1N1Y2Nlc3Moc3VibWl0Rm9yVGVzdGluZyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRWRkluc3RhbmNlU3VjY2Vzc2Z1bGx5VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0UmVzcCA9IGNyZWF0ZUNoZWNrZWRpblZGSW5zdGFuY2Uoc2VydmljZURldGFpbHNfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLAorCQkJCXNkbmNEZXNpZ25lckRldGFpbHMpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbmNlIHN1Y2Nlc3NmdWx5IGNyZWF0ZWQiKTsKKwkJUmVzdFJlc3BvbnNlIGdldEluc3RhbmNlc1Jlc3BvbmNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsCisJCQkJc2VydmljZURldGFpbHNfMDEuZ2V0VW5pcXVlSWQoKSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxNTAwOyBpKyspIHsKKwkJCWNyZWF0ZVZGSW5zdFJlc3AgPSBjcmVhdGVWRkluc3RhbmNlKHNlcnZpY2VEZXRhaWxzXzAxLCByZXNvdXJjZURldGFpbHNWRl8wMSwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVZGSW5zdFJlc3ApOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnN0YW5jZSAiICsgaSArICJzdWNjZXNzZnVseSBjcmVhdGVkIik7CisJCX0KKworCQlnZXRJbnN0YW5jZXNSZXNwb25jZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmdldENvbXBvbmVudEluc3RhbmNlcyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLAorCQkJCXNlcnZpY2VEZXRhaWxzXzAxLmdldFVuaXF1ZUlkKCksIHNkbmNEZXNpZ25lckRldGFpbHMpOworCisJCUJhc2VWYWxpZGF0aW9uVXRpbHMuY2hlY2tTdWNjZXNzKGdldEluc3RhbmNlc1Jlc3BvbmNlKTsKKworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZUlkT2ZGaXJzdEluc3RhbmNlRnJvbVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQl0cnkgeworCQkJSlNPTkFycmF5IHZhbHVlID0gUmVzcG9uc2VQYXJzZXIuZ2V0TGlzdEZyb21Kc29uKHJlc3BvbnNlLCAiY29tcG9uZW50SW5zdGFuY2VzIik7CisJCQlyZXR1cm4gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHZhbHVlLmdldCgwKS50b1N0cmluZygpLCAidW5pcXVlSWQiKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9VcGRhdGVTZXJ2aWNlTWV0YWRhdGFUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL1VwZGF0ZVNlcnZpY2VNZXRhZGF0YVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjViNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9VcGRhdGVTZXJ2aWNlTWV0YWRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSwxOTg0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5TZXJ2aWNlQ2F0ZWdvcmllc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5TZXJ2aWNlVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVXBkYXRlU2VydmljZU1ldGFkYXRhVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0Rm9yTWVzc2FnZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzOworCXByb3RlY3RlZCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczI7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jR292ZXJub3JEZWF0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jVGVzdGVyRGV0YWlsczsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jT3BzRGV0YWlsczsKKwlwcm90ZWN0ZWQgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzOworCXByb3RlY3RlZCBDb21wb25lbnQgcmVzb3VyY2VEZXRhaWxzVkZDY29tcDsKKwlwcm90ZWN0ZWQgQ29tcG9uZW50IHNlcnZpY2VEZXRhaWxzQ29tcHA7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyB1cGRhdGVkU2VydmljZURldGFpbHM7CisKKwlwdWJsaWMgVXBkYXRlU2VydmljZU1ldGFkYXRhVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgVXBkYXRlU2VydmljZU1ldGFkYXRhVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisJCXNkbmNEZXNpZ25lckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzZG5jRGVzaWduZXJEZXRhaWxzMiA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUjIpOworCQlzZG5jQWRtaW5EZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkJc2RuY0FkbWluRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTjQpOworCQlzZG5jR292ZXJub3JEZWF0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5HT1ZFUk5PUik7CisJCXNkbmNUZXN0ZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCXNkbmNPcHNEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLk9QUyk7CisJCXJlc291cmNlRGV0YWlsc1ZGQ2NvbXAgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULCByZXNvdXJjZURldGFpbHNWRkNjb21wLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXAsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKTsKKwkJU2VydmljZSBzZXJ2aWNlU2VydiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VEZXRhaWxzVkZDY29tcCwgc2VydmljZVNlcnYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisKKwkJc2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoc2VydmljZVNlcnYpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMgPSB1cGRhdGVkU2VydmljZURldGFpbHMoc2VydmljZURldGFpbHMpOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2VydGlmeVNlcnZpY2UoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMsIFN0cmluZyB2ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwl9CisKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgdXBkYXRlZFNlcnZpY2VEZXRhaWxzKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UpIHsKKwkJU2VydmljZVJlcURldGFpbHMgdXBkYXRlZFNlcnZpY2VEZXRhaWxzID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKHNlcnZpY2UpOworCisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigidXBkYXRlZERlc2NyaXB0aW9uIik7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFByb2plY3RDb2RlKCI5ODc2NTQ2NTQiKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24oImljb24tc2VydmljZS1yZWQzIik7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJ1cGRhdGVUYWciLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMucmVtb3ZlQWxsQ2F0ZWdvcmllcygpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q2F0ZWdvcmllcyhudWxsKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmFkZENhdGVnb3J5KFNlcnZpY2VDYXRlZ29yaWVzRW51bS5WT0lQLmdldFZhbHVlKCkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJ4eTAxMjMiKTsKKworCQlyZXR1cm4gdXBkYXRlZFNlcnZpY2VEZXRhaWxzOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZE1hbmRhdG9yeUFydGlmYWN0c1RvU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUT0RPIEFuZHJleSBVUzU3NTA1MgorCQkvLyBTZXJ2aWNlUmVzdFV0aWxzLmFkZFNlcnZpY2VNYW5kYXRvcnlBcnRpZmFjdHMoc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkJLy8gY3JlYXRlU2VydmljZVJlc3BvbnNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoU2VydmljZVJlcURldGFpbHMgZXhjcGVjdGVkU2VydmljZSwgVXNlciBjcmVhdG9yLCBVc2VyIHVwZGF0ZXIsIExpZmVjeWNsZVN0YXRlRW51bSBsaWZlQ3ljbGVTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoZXhjcGVjdGVkU2VydmljZS5nZXRVbmlxdWVJZCgpLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0aW5nIHNlcnZpY2UiLCBnZXRTZXJ2aWNlUmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayBpZiBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGluZyBzZXJ2aWNlIiwgZ2V0U2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHNlcnZpY2UiLCAyMDAsIGdldFNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU2VydmljZSBhY3R1YWxTZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChnZXRTZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCVNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTZXJ2aWNlUmVzcG9uc2VNZXRhRGF0YShleGNwZWN0ZWRTZXJ2aWNlLCBhY3R1YWxTZXJ2aWNlLCBjcmVhdG9yLCB1cGRhdGVyLCBsaWZlQ3ljbGVTdGF0ZSk7CisJfQorCisJcHVibGljIHZvaWQgZ2V0U2VydmljZUFuZFZhbGlkYXRlKFNlcnZpY2VSZXFEZXRhaWxzIGV4Y3BlY3RlZFNlcnZpY2UsIExpZmVjeWNsZVN0YXRlRW51bSBsaWZlY3ljbGVTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShleGNwZWN0ZWRTZXJ2aWNlLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBsaWZlY3ljbGVTdGF0ZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZXNwb25zZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UsIGludCBlcnJvckNvZGUsIEFjdGlvblN0YXR1cyBhY3Rpb25SZXNwb25zZSwgTGlzdDxTdHJpbmc+IGxpc3RPZlZhcmlhYmxlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyBzZXJ2aWNlIiwgcmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayBpZiBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGluZyBzZXJ2aWNlIiwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgc2VydmljZSIsIGVycm9yQ29kZSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJaWYgKGFjdGlvblJlc3BvbnNlICE9IG51bGwpIHsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihhY3Rpb25SZXNwb25zZS5uYW1lKCksIGxpc3RPZlZhcmlhYmxlcywgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlTZXJ2aWNlIGFjdHVhbFNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBhY3R1YWxTZXJ2aWNlLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBY3R1YWxWc0V4cGVjdGVkKFNlcnZpY2VSZXFEZXRhaWxzIGV4cGVjdGVkU2VydmljZSwgUmVzdFJlc3BvbnNlIGFjdHVhbFNlcnZpY2VGcm9tUmVzcG9uc2UpIHsKKwkJU2VydmljZSBhY3R1YWxTZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChhY3R1YWxTZXJ2aWNlRnJvbVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBhY3R1YWxTZXJ2aWNlLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBtdWx0aXBsZVN0cmluZyhTdHJpbmcgY2gsIGludCByZXBlYXQpIHsKKwkJcmV0dXJuIFN0cmluZ1V0aWxzLnJlcGVhdChjaCwgcmVwZWF0KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjb3JyZWN0VXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDIwMCwgbnVsbCwgbGlzdEZvck1lc3NhZ2UpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMgaW52YWxpZFZhbHVlLCBMaXN0PFN0cmluZz4gYXJyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgNDAwLCBpbnZhbGlkVmFsdWUsIGFycik7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoYXJhY3RlcnNJblJhbmdlQ2hlY2tpbmcoaW50IG1pbiwgaW50IG1heCwgU3RyaW5nIGZpZWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKGZpZWxkICE9IG51bGwpIHsKKwkJCWlmIChmaWVsZCA9PSAibmFtZSIpIHsKKwkJCQlmb3IgKGNoYXIgY2ggPSAoY2hhcikgbWluOyBjaCA8PSAoY2hhcikgbWF4OyBjaCsrKSB7CisJCQkJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0bmFtZSIgKyBTdHJpbmcudmFsdWVPZihjaCkpOworCQkJCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQkJCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBPTkVOVF9OQU1FLCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChmaWVsZCA9PSAiaWNvbiIpIHsKKwkJCQlmb3IgKGNoYXIgY2ggPSAoY2hhcikgbWluOyBjaCA8PSAoY2hhcikgbWF4OyBjaCsrKSB7CisJCQkJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRJY29uKCJ0ZXN0bmFtZSIgKyBTdHJpbmcudmFsdWVPZihjaCkpOworCQkJCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9JQ09OLCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChmaWVsZCA9PSAidGFncyIpIHsKKwkJCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiU2VydmljZSIsICJ0YWciKTsKKwkJCQlmb3IgKGNoYXIgY2ggPSAoY2hhcikgbWluOyBjaCA8PSAoY2hhcikgbWF4OyBjaCsrKSB7CisJCQkJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KFN0cmluZy52YWx1ZU9mKGNoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJCQkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQsIHZhcmlhYmxlcyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChmaWVsZCA9PSAiY2F0ZWdvcnkiKSB7CisJCQkJZm9yIChjaGFyIGNoID0gKGNoYXIpIG1pbjsgY2ggPD0gKGNoYXIpIG1heDsgY2grKykgeworCQkJCQl1cGRhdGVkU2VydmljZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihtdWx0aXBsZVN0cmluZygiMSIsIDUpICsgU3RyaW5nLnZhbHVlT2YoY2gpLCBtdWx0aXBsZVN0cmluZygiMSIsIDUpICsgU3RyaW5nLnZhbHVlT2YoY2gpKTsKKwkJCQkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ0FURUdPUlksIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpKTsKKwkJCQl9CisJCQl9CisKKwkJCWVsc2UgaWYgKGZpZWxkID09ICJwcm9qZWN0Q29kZSIpIHsKKwkJCQlmb3IgKGNoYXIgY2ggPSAoY2hhcikgbWluOyBjaCA8PSAoY2hhcikgbWF4OyBjaCsrKSB7CisJCQkJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRQcm9qZWN0Q29kZShtdWx0aXBsZVN0cmluZygiMSIsIDUpICsgU3RyaW5nLnZhbHVlT2YoY2gpKTsKKwkJCQkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuSU5WQUxJRF9QUk9KRUNUX0NPREUsIGxpc3RGb3JNZXNzYWdlKTsKKwkJCQl9CisJCQl9CisKKwkJCWVsc2UKKwkJCQlyZXR1cm47CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIHNwZWNpYWxDaGFyc0NoZWNraW5nKFN0cmluZyBmaWVsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNoYXJhY3RlcnNJblJhbmdlQ2hlY2tpbmcoMzMsIDQ0LCBmaWVsZCk7CisJCWNoYXJhY3RlcnNJblJhbmdlQ2hlY2tpbmcoNDcsIDQ3LCBmaWVsZCk7CisJCWNoYXJhY3RlcnNJblJhbmdlQ2hlY2tpbmcoNTgsIDY0LCBmaWVsZCk7CisJCWNoYXJhY3RlcnNJblJhbmdlQ2hlY2tpbmcoOTEsIDk0LCBmaWVsZCk7CisJCWNoYXJhY3RlcnNJblJhbmdlQ2hlY2tpbmcoOTYsIDk2LCBmaWVsZCk7CisJCWNoYXJhY3RlcnNJblJhbmdlQ2hlY2tpbmcoMTIzLCAxMjYsIGZpZWxkKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VTdWNjZXNzZnVsbHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgMjAwLCBudWxsLCBsaXN0Rm9yTWVzc2FnZSk7CisKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIEFycmF5TGlzdDxTdHJpbmc+IGFyckxpc3QsIFJlc3RSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbiB7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihhY3Rpb25TdGF0dXMubmFtZSgpLCBhcnJMaXN0LCByZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGFkZFNlcnZpY2VOYW1lVG9UYWdzTGlzdChTdHJpbmcgc2VydmljZU5hbWUsIExpc3Q8U3RyaW5nPiB0YWdzTGlzdCkgeworCQl0YWdzTGlzdC5hZGQoc2VydmljZU5hbWUpOworCQlyZXR1cm4gdGFnc0xpc3Q7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VfQnlPdGhlckRlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMik7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDksIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UpOworCisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlU2VydmljZV9CeUFkbWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jQWRtaW5EZXRhaWxzKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwOSwgQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBsaXN0Rm9yTWVzc2FnZSk7CisKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlTm90RXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFVuaXF1ZUlkKCJubm5ubiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDQsIEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoIiIpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVDaGVja2VkaW5TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgNDA5LCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIGxpc3RGb3JNZXNzYWdlKTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZUNlcnRpZmllZFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCWNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwOSwgQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLCBsaXN0Rm9yTWVzc2FnZSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2RuY0FkbWluRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJfQorCisJLy8gVE9ETyBJcnJlbGV2YW50CisJLy8gQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCS8vIHB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VfTmFtZUNhc2VTZW5zaXRpdmVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gU2VydmljZVJlc3RVdGlscy5zZXRTZXJ2aWNlVW5pcXVlSWQoc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCkpOworCS8vCisJLy8gUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkvLyB2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgMjAwLCBudWxsLCBsaXN0Rm9yTWVzc2FnZSk7CisJLy8KKwkvLyBTZXJ2aWNlIHNlcnZpY2VGcm9tSnNvblJlc3BvbnNlID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHVwZGF0ZVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEodXBkYXRlZFNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VGcm9tSnNvblJlc3BvbnNlLCBzZG5jRGVzaWduZXJEZXRhaWxzLCAoTGlmZWN5Y2xlU3RhdGVFbnVtKW51bGwpOworCS8vCisJLy8gZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywKKwkvLyBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJLy8gfQorCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCB1cGRhdGVBcHByb3ZlZERpc3RyaWJ1dGlvblNlcnZpY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJLy8gY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJLy8KKwkvLyBSZXN0UmVzcG9uc2UgYXBwcm92ZVJlc3BvbnNlID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLnNlbmRBcHByb3ZlRGlzdHJpYnV0aW9uKHNkbmNBZG1pbkRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgdXNlclJlbWFya3MpOworCS8vIC8vIHZhbGlkYXRlUmVzcG9uc2UoYXBwcm92ZVJlc3BvbnNlLCAyMDAsIG51bGwsIGxpc3RGb3JNZXNzYWdlKTsKKwkvLworCS8vIFJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsCisJLy8gc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJLy8gdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwOSwKKwkvLyBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIGxpc3RGb3JNZXNzYWdlKTsKKwkvLworCS8vIGdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywKKwkvLyBzZG5jQWRtaW5EZXRhaWxzLExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCS8vIH0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlU2VydmljZUJ5TWV0aG9kX2RlbGV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlQnlIdHRwTWV0aG9kKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgIkRFTEVURSIsIFVybHMuVVBEQVRFX1NFUlZJQ0VfTUVUQURBVEEpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgNDA1LCBBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQsIGxpc3RGb3JNZXNzYWdlKTsKKworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlcnZpY2VCeU1ldGhvZF9nZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZUJ5SHR0cE1ldGhvZCh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsICJHRVQiLCBVcmxzLlVQREFURV9TRVJWSUNFX01FVEFEQVRBKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwNSwgQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VELCBsaXN0Rm9yTWVzc2FnZSk7CisKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlQnlNZXRob2RfcG9zdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlQnlIdHRwTWV0aG9kKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgIlBPU1QiLCBVcmxzLlVQREFURV9TRVJWSUNFX01FVEFEQVRBKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwNSwgQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VELCBsaXN0Rm9yTWVzc2FnZSk7CisKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVDaGVja291dENlcnRpZmllZFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIC8vIGNlcnRpZnkgYQorCQkJCQkJCQkJCQkJCQkJCQkvLyBzZXJ2aWNlCisJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAorCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGVja291dAorCQkJCQkJCQkJCQkJCQkJCQkvLyBpdAorCXsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCWNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5TRVJWSUNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VELCBsaXN0Rm9yTWVzc2FnZSk7CisKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVmFsaWRhdGlvbgorCS8vIFRlc3RzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdDYXRlZ29yeVRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldENhdGVnb3JpZXMoKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiA9IGNhdGVnb3JpZXMuZ2V0KDApOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uMiA9IGNhdGVnb3J5RGVmaW5pdGlvbjsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uMi5zZXROYW1lKCIiKTsKKwkJY2F0ZWdvcmllcy5zZXQoMCwgY2F0ZWdvcnlEZWZpbml0aW9uMik7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDYXRlZ29yaWVzKGNhdGVnb3JpZXMpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWSwgQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBtaXNzaW5nQ2F0ZWdvcnlUZXN0MigpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q2F0ZWdvcmllcyhudWxsKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgNDAwLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ0FURUdPUlksIEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWlzc2luZ1NlcnZpY2VOYW1lVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUoU3RyaW5nVXRpbHMuRU1QVFkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5NSVNTSU5HX0NPTVBPTkVOVF9OQU1FLCBBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdTZXJ2aWNlTmFtZVRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUobnVsbCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwMCwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ09NUE9ORU5UX05BTUUsIEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCS8vIFRPRE8gSXJyZWxldmFudAorCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBtaXNzaW5nUHJvamVjdENvZGVUZXN0MSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0UHJvamVjdENvZGUoU3RyaW5nVXRpbHMuRU1QVFkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5NSVNTSU5HX1BST0pFQ1RfQ09ERSwgbGlzdEZvck1lc3NhZ2UpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwkvLyBUT0RPIElycmVsZXZhbnQKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgbWlzc2luZ1Byb2plY3RDb2RlVGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFByb2plY3RDb2RlKG51bGwpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5NSVNTSU5HX1BST0pFQ1RfQ09ERSwgbGlzdEZvck1lc3NhZ2UpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdJY29uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24oU3RyaW5nVXRpbHMuRU1QVFkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLCBBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdJY29uVGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24obnVsbCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwMCwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0lDT04sIEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWlzc2luZ0Rlc2NyaXB0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKFN0cmluZ1V0aWxzLkVNUFRZKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgNDAwLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04sIEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWlzc2luZ0Rlc2NyaXB0aW9uVGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKG51bGwpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTiwgQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBtaXNzaW5nVGFnc1Rlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgNDAwLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfVEFHUywgbGlzdEZvck1lc3NhZ2UpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1pc3NpbmdUYWdzVGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MobnVsbCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UsIDQwMCwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX1RBR1MsIGxpc3RGb3JNZXNzYWdlKTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBtaXNzaW5nVGFnc1Rlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KFN0cmluZ1V0aWxzLkVNUFRZKSkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJRUxEX0ZPUk1BVCwgQXJyYXlzLmFzTGlzdCgiU2VydmljZSIsICJ0YWciKSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWlzc2luZ1RhZ3NUZXN0NCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChTdHJpbmdVdGlscy5FTVBUWSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZSwgNDAwLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUVMRF9GT1JNQVQsIEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiLCAidGFnIikpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwkvLyB1cGRhdGUgbm9uLXNldHRhYmxlLyJ1cGRhdGFibGUiIHBhcmFtZXRlcnMgdGVzdHMKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWNvcnJlY3QKKwkvLyB2YWx1ZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnRhY3RJZFZhbGlkYXRpb25UZXN0MSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJhYjM0NTYiKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldENvbnRhY3RJZCgiY2Q3ODlFIik7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnRhY3RJZFZhbGlkYXRpb25UZXN0MygpIHRocm93cyBFeGNlcHRpb24geworCisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoImVmNDU2NyIpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb250YWN0SWRWYWxpZGF0aW9uVGVzdDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldENvbnRhY3RJZCgiQUEwMTJBIik7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnRhY3RJZFZhbGlkYXRpb25UZXN0NSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJDRDAxMmMiKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3Q2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoIkVGMDEyMyIpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0taW52YWxpZAorCS8vIHZhbHVlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3Q3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldENvbnRhY3RJZCgiYWIwMDAxIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb250YWN0SWRWYWxpZGF0aW9uVGVzdDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisKKwkJUmVzdFJlc3BvbnNlIGNlcnRpZnlTZXJ2aWNlUmVzcCA9IExpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscyk7CisJCVNlcnZpY2UgY2VydGlmeVNlcnZpY2VTZXJ2ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjZXJ0aWZ5U2VydmljZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIGNlcnRpZnlTZXJ2aWNlID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKGNlcnRpZnlTZXJ2aWNlU2Vydik7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscyA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhjZXJ0aWZ5U2VydmljZSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoImFiMDAwMSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWNoZWNrRXJyb3JSZXNwb25zZShBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIGxpc3RGb3JNZXNzYWdlLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoIjAxMzQ1YSIpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULCBBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxMCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCIweTAwMEIiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnRhY3RJZFZhbGlkYXRpb25UZXN0MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldENvbnRhY3RJZCgiWTEwMDBiIik7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QsIEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb250YWN0SWRWYWxpZGF0aW9uVGVzdDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoImFieHl6QyIpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULCBBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxMygpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJjZFhZWmMiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxNCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJlZlhZMUQiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxNSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJFRmFiY0QiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxNigpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJFRkFCQ0QiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxNygpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJFRkFCQzEiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxOCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJlZnVpMUQiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QxOSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJlZnVpMSEiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QyMCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJlZjU1NSEiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udGFjdElkVmFsaWRhdGlvblRlc3QyMSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCIsZjU1NSIpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb250YWN0SWRWYWxpZGF0aW9uVGVzdDIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoIkVGNTUuNSIpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb250YWN0SWRWYWxpZGF0aW9uVGVzdDIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoImFiMDAwIik7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QsIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnRhY3RJZFZhbGlkYXRpb25UZXN0MjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldENvbnRhY3RJZCgiYWIwMDBjMCIpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb250YWN0SWRWYWxpZGF0aW9uVGVzdDI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRDb250YWN0SWQoIiAgYWIwMDAxIik7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QsIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbnRhY3RJZFZhbGlkYXRpb25UZXN0MjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCWNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoc2VydmljZURldGFpbHMpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q29udGFjdElkKCJ4eTAwMDIiKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5hbWVWYWxpZGF0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUobXVsdGlwbGVTdHJpbmcoImEiLCA0OSkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlTmFtZVZhbGlkYXRpb25UZXN0MigpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0TmFtZShtdWx0aXBsZVN0cmluZygiYiIsIDUwKSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKGFkZFNlcnZpY2VOYW1lVG9UYWdzTGlzdCh1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0VGFncygpKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VOYW1lVmFsaWRhdGlvblRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJ0ZXN0TmFtRSIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlTmFtZVZhbGlkYXRpb25UZXN0NCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0TmFtZSgiVGVzdG5hbWUiKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MoYWRkU2VydmljZU5hbWVUb1RhZ3NMaXN0KHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXRUYWdzKCkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5hbWVWYWxpZGF0aW9uVGVzdDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUoIlRlc3RfbmFtZSIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlTmFtZVZhbGlkYXRpb25UZXN0NigpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0TmFtZSgiVGVzdCBuYW1lIik7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKGFkZFNlcnZpY2VOYW1lVG9UYWdzTGlzdCh1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0VGFncygpKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VOYW1lVmFsaWRhdGlvblRlc3Q3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJUZXN0LW5hbWUiKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MoYWRkU2VydmljZU5hbWVUb1RhZ3NMaXN0KHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXRUYWdzKCkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5hbWVWYWxpZGF0aW9uVGVzdDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUoIlRlc3QubmFtZSIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlTmFtZVZhbGlkYXRpb25UZXN0OSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0TmFtZSgiLi4uMS4uLiIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlTmFtZVZhbGlkYXRpb25UZXN0MTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUoIi1hXzEuIEFycnJycnIiKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MoYWRkU2VydmljZU5hbWVUb1RhZ3NMaXN0KHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXRUYWdzKCkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5hbWVWYWxpZGF0aW9uVGVzdDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJUZXN0bmFtZTEyMzQ1Njc4OTAiKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MoYWRkU2VydmljZU5hbWVUb1RhZ3NMaXN0KHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXRUYWdzKCkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5hbWVWYWxpZGF0aW9uVGVzdDE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKFN0cmluZ1V0aWxzLlNQQUNFKTsgLy8gb25lIHNwYWNlIHdpdGgKKwkJCQkJCQkJCQkJCQkJCS8vIG5vdGhpbmcKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MoYWRkU2VydmljZU5hbWVUb1RhZ3NMaXN0KHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXRUYWdzKCkpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQkvLyB1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBPTkVOVF9OQU1FLCBuZXcKKwkJLy8gQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJCXZhbGlkYXRlUmVzcG9uc2UodXBkYXRlU2VydmljZVJlc3BvbnNlLCA0MDAsIEFjdGlvblN0YXR1cy5NSVNTSU5HX0NPTVBPTkVOVF9OQU1FLCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0taW52YWxpZAorCS8vIHZhbHVlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUBUZXN0CisJcHVibGljIHZvaWQgc2VydmljZU5hbWVWYWxpZGF0aW9uVGVzdDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUoIlRlc3ROYW1FIik7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKGFkZFNlcnZpY2VOYW1lVG9UYWdzTGlzdCh1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0VGFncygpKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlTmFtZVZhbGlkYXRpb25UZXN0MTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUobXVsdGlwbGVTdHJpbmcoImMiLCA1MSkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlULCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIsICI1MCIpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZXJ2aWNlTmFtZVZhbGlkYXRpb25UZXN0MTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3BlY2lhbENoYXJzQ2hlY2tpbmcoIm5hbWUiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VOYW1lVmFsaWRhdGlvblRlc3QxNigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhZGRNYW5kYXRvcnlBcnRpZmFjdHNUb1NlcnZpY2UoKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldE5hbWUoInRlc3RuYW1lbmFtZSIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q2F0ZWdvcmllcyhzZXJ2aWNlRGV0YWlscy5nZXRDYXRlZ29yaWVzKCkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWNoZWNrRXJyb3JSZXNwb25zZShBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIGxpc3RGb3JNZXNzYWdlLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNkbmNUZXN0ZXJEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VOYW1lVmFsaWRhdGlvblRlc3QxNygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhZGRNYW5kYXRvcnlBcnRpZmFjdHNUb1NlcnZpY2UoKTsKKwkJY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJUZXN0TmFtRSIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q2F0ZWdvcmllcyhzZXJ2aWNlRGV0YWlscy5nZXRDYXRlZ29yaWVzKCkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhhZGRTZXJ2aWNlTmFtZVRvVGFnc0xpc3QodXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldFRhZ3MoKSkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlMiA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQl2YWxpZGF0ZVJlc3BvbnNlKHVwZGF0ZVNlcnZpY2VSZXNwb25zZTIsIDQwMCwgQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRCwgbGlzdEZvck1lc3NhZ2UpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUoc2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlcnZpY2VOYW1lVmFsaWRhdGlvblRlc3QxOCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0TmFtZSgiICB0ZXN0bmFtZSAgIik7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKGFkZFNlcnZpY2VOYW1lVG9UYWdzTGlzdCh1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0VGFncygpKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UxID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlMSk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlMS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygyMDAsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTEuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXROYW1lKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpOworCQl2YWxpZGF0ZUFjdHVhbFZzRXhwZWN0ZWQodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UxKTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaWNvblZhbGlkYXRpb25UZXN0MSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0SWNvbihtdWx0aXBsZVN0cmluZygiYSIsIDI0KSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGljb25WYWxpZGF0aW9uVGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24obXVsdGlwbGVTdHJpbmcoImIiLCAyNSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRJY29uKCJ0ZXN0TmFtRSIpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3Q0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRJY29uKCJUZXN0bmFtZSIpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3Q1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRJY29uKCJUZXN0X25hbWUiKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaWNvblZhbGlkYXRpb25UZXN0NigpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0SWNvbigiVGVzdC1uYW1lIik7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGljb25WYWxpZGF0aW9uVGVzdDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24oIlRlc3RuYW1lMTIzNDU2Nzg5MCIpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3Q4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24oIlRlc3ROYW1FIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFkZE1hbmRhdG9yeUFydGlmYWN0c1RvU2VydmljZSgpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0SWNvbigidGVzdG5hbWVuYW1lIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0taW52YWxpZAorCS8vIHZhbHVlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUBUZXN0CisJcHVibGljIHZvaWQgaWNvblZhbGlkYXRpb25UZXN0MTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24oIlRlc3QgbmFtZSIpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9JQ09OLCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3QxMSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0SWNvbihTdHJpbmdVdGlscy5TUEFDRSk7IC8vIG9uZSBzcGFjZSB3aXRoCisJCQkJCQkJCQkJCQkJCQkvLyBub3RoaW5nCisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0lDT04sIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIikpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGljb25WYWxpZGF0aW9uVGVzdDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRJY29uKCJUZXN0Lm5hbWUiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfSUNPTiwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaWNvblZhbGlkYXRpb25UZXN0MTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3BlY2lhbENoYXJzQ2hlY2tpbmcoImljb24iKTsKKwkJY2hhcmFjdGVyc0luUmFuZ2VDaGVja2luZyg0NiwgNDYsICJpY29uIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3QxNCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0SWNvbihtdWx0aXBsZVN0cmluZygiYyIsIDI2KSk7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JQ09OX0VYQ0VFRFNfTElNSVQsIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIiwgIjI1IikpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGljb25WYWxpZGF0aW9uVGVzdDE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFkZE1hbmRhdG9yeUFydGlmYWN0c1RvU2VydmljZSgpOworCQlSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2VSZXNwID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJU2VydmljZSBjZXJ0aWZ5U2VydmljZVNlcnYgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNlcnRpZnlTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJU2VydmljZVJlcURldGFpbHMgY2VydGlmeVNlcnZpY2UgPSBuZXcgU2VydmljZVJlcURldGFpbHMoY2VydGlmeVNlcnZpY2VTZXJ2KTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKGNlcnRpZnlTZXJ2aWNlKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldEljb24oInRlc3RuYW1lbmFtZSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWNoZWNrRXJyb3JSZXNwb25zZShBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIGxpc3RGb3JNZXNzYWdlLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaWNvblZhbGlkYXRpb25UZXN0MTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCWNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoc2VydmljZURldGFpbHMpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0SWNvbigiVGVzdE5hbUUiKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQljaGVja0Vycm9yUmVzcG9uc2UoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfSUNPTl9DQU5OT1RfQkVfQ0hBTkdFRCwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpY29uVmFsaWRhdGlvblRlc3QxNygpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0SWNvbigiICBJY29uICAiKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfSUNPTiwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlWYWxpZGF0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuYWRkQ2F0ZWdvcnkoU2VydmljZUNhdGVnb3JpZXNFbnVtLlZPSVAuZ2V0VmFsdWUoKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeVZhbGlkYXRpb25UZXN0MigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB1cGRhdGVkU2VydmljZURldGFpbHMuYWRkQ2F0ZWdvcnkoInNvbWVDYXRlZ29yeSIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q2F0ZWdvcmllcyhudWxsKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmFkZENhdGVnb3J5Q2hhaW4oInNvbWVDYXRlZ29yeSIsIG51bGwpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWSwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlWYWxpZGF0aW9uVGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldENhdGVnb3JpZXMobnVsbCk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5hZGRDYXRlZ29yeUNoYWluKCJTb21lQ2F0ZWdvcnkxMCIsIG51bGwpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWSwgbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlNlcnZpY2UiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlWYWxpZGF0aW9uVGVzdDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldENhdGVnb3JpZXMobnVsbCk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5hZGRDYXRlZ29yeUNoYWluKCJzb21lIENhdGVnb3J5IiwgbnVsbCk7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NBVEVHT1JZLCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeVZhbGlkYXRpb25UZXN0NSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhZGRNYW5kYXRvcnlBcnRpZmFjdHNUb1NlcnZpY2UoKTsKKwkJY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscyA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhzZXJ2aWNlRGV0YWlscyk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5hZGRDYXRlZ29yeSgiTmV0d29yayBMMS0zIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeVZhbGlkYXRpb25UZXN0NigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhZGRNYW5kYXRvcnlBcnRpZmFjdHNUb1NlcnZpY2UoKTsKKwkJY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscyA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhzZXJ2aWNlRGV0YWlscyk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscyA9IHNlcnZpY2VEZXRhaWxzOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcyA9IHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXRDYXRlZ29yaWVzKCk7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24gPSBjYXRlZ29yaWVzLmdldCgwKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbjIgPSBjYXRlZ29yeURlZmluaXRpb247CisJCWNhdGVnb3J5RGVmaW5pdGlvbjIuc2V0TmFtZSgiY2NjIik7CisJCWNhdGVnb3JpZXMuc2V0KDAsIGNhdGVnb3J5RGVmaW5pdGlvbjIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q2F0ZWdvcmllcyhjYXRlZ29yaWVzKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTIgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJdmFsaWRhdGVSZXNwb25zZSh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UyLCA0MDAsIEFjdGlvblN0YXR1cy5TRVJWSUNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VELCBsaXN0Rm9yTWVzc2FnZSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZShzZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2F0ZWdvcnlWYWxpZGF0aW9uVGVzdDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnJlbW92ZUFsbENhdGVnb3JpZXMoKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmFkZENhdGVnb3J5KFNlcnZpY2VDYXRlZ29yaWVzRW51bS5ORVRXT1JLX0wzLmdldFZhbHVlKCkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYXRlZ29yeVZhbGlkYXRpb25UZXN0OCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0Q2F0ZWdvcmllcyhudWxsKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmFkZENhdGVnb3J5Q2hhaW4oIk5ldHdvcmsgTDEtMyIsIG51bGwpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KG11bHRpcGxlU3RyaW5nKCJhIiwgNDkpLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KG11bHRpcGxlU3RyaW5nKCJCIiwgNTApLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KG11bHRpcGxlU3RyaW5nKCJBIiwgNTApLCBtdWx0aXBsZVN0cmluZygiQiIsIDUwKSwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGFnc1ZhbGlkYXRpb25UZXN0NSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgidGVzdFRhRyIsIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRhZ3NWYWxpZGF0aW9uVGVzdDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MobmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlRlc3R0YWciLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3Q3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJUZXN0X3RhZyIsIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRhZ3NWYWxpZGF0aW9uVGVzdDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MobmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlRlc3QgdGFnIiwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGFnc1ZhbGlkYXRpb25UZXN0OSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiVGVzdC10YWciLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QxMCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiVGVzdC50YWciLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QxMSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiLi4uMS4uLiIsIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRhZ3NWYWxpZGF0aW9uVGVzdDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCItYV8xLiBBcnJycnJyIiwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGFnc1ZhbGlkYXRpb25UZXN0MTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MobmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIlRlc3R0YWcxMjM0NTY3ODkwIiwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGFnc1ZhbGlkYXRpb25UZXN0MTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MobmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoIjEiLCAiMiIsICIyIiwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGFnc1ZhbGlkYXRpb25UZXN0MTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiVGVzdFRhRyIsIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpKSk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJY2hlY2tFcnJvclJlc3BvbnNlKEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgbGlzdEZvck1lc3NhZ2UsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QxNigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhZGRNYW5kYXRvcnlBcnRpZmFjdHNUb1NlcnZpY2UoKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKHNlcnZpY2VEZXRhaWxzKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3MobmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoInRlc3R0YWd0YWciLCB1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWNoZWNrRXJyb3JSZXNwb25zZShBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04sIGxpc3RGb3JNZXNzYWdlLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGFnc1ZhbGlkYXRpb25UZXN0MTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYWRkTWFuZGF0b3J5QXJ0aWZhY3RzVG9TZXJ2aWNlKCk7CisJCWNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCkpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoc2VydmljZURldGFpbHMpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiVGVzdFRhRyIsIHVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5nZXROYW1lKCkpKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRhZ3NWYWxpZGF0aW9uVGVzdDE4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludCBsZW5ndGhPZlNlcnZpY2VOYW1lID0gdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKS5sZW5ndGgoKTsKKwkJaW50IG1heExlbmd0aFRhZyA9IDUwOworCQlpbnQgdGFnc0NvdW50ID0gMTAyNCAtIGxlbmd0aE9mU2VydmljZU5hbWU7CisJCUFycmF5TGlzdDxTdHJpbmc+IHRhZ3NMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXRhZ3NMaXN0LmFkZCh1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJd2hpbGUgKHRhZ3NDb3VudCA+IG1heExlbmd0aFRhZykgeworCQkJdGFnc0xpc3QuYWRkKG11bHRpcGxlU3RyaW5nKCJhIiwgbWF4TGVuZ3RoVGFnKSk7CisJCQl0YWdzQ291bnQgLT0gbWF4TGVuZ3RoVGFnICsgMSArIDEvKiAoNTAgYW5kIGNvbW1hIG9mIGVhY2ggdGFnICsgb25lIHNwYWNlLCB0b3RhbGx5IDUyKSAqLzsKKwkJfQorCQl0YWdzTGlzdC5hZGQobXVsdGlwbGVTdHJpbmcoImEiLCB0YWdzQ291bnQpKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3ModGFnc0xpc3QpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QxOSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyhuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiICAgVGFnICAgIiwgdXBkYXRlZFNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSkpKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTEgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UxKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UxLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIwMCwgdXBkYXRlU2VydmljZVJlc3BvbnNlMS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJdmFsaWRhdGVBY3R1YWxWc0V4cGVjdGVkKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgdXBkYXRlU2VydmljZVJlc3BvbnNlMSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZSh1cGRhdGVkU2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRhZ3NWYWxpZGF0aW9uVGVzdDIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUFycmF5TGlzdDxTdHJpbmc+IHRhZ3NMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXRhZ3NMaXN0LmFkZCh1cGRhdGVkU2VydmljZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJdGFnc0xpc3QuYWRkKCIiKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFRhZ3ModGFnc0xpc3QpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJRUxEX0ZPUk1BVCwgQXJyYXlzLmFzTGlzdCgiU2VydmljZSIsICJ0YWciKSk7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0taW52YWxpZAorCS8vIHZhbHVlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0YWdzVmFsaWRhdGlvblRlc3QyMSgpIHRocm93cyBFeGNlcHRpb24geworCQlBcnJheUxpc3Q8U3RyaW5nPiB0YWdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl0YWdzTGlzdC5hZGQoIm9uZXRhZyIpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0VGFncyh0YWdzTGlzdCk7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX1RBR1NfTk9fQ09NUF9OQU1FLCBsaXN0Rm9yTWVzc2FnZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRhZ3NWYWxpZGF0aW9uVGVzdDIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNwZWNpYWxDaGFyc0NoZWNraW5nKCJ0YWdzIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZXNjcmlwdGlvblZhbGlkYXRpb25UZXN0MSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24obXVsdGlwbGVTdHJpbmcoImEiLCAxMDIzKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbihtdWx0aXBsZVN0cmluZygiYSIsIDEwMjQpKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVzY3JpcHRpb25WYWxpZGF0aW9uVGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKG11bHRpcGxlU3RyaW5nKCJhQiIsIDEwMjQgLyAyKSk7CisJCWNvcnJlY3RVcGRhdGUoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3Q0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiMTIzNDU2Nzg5MCIpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZXNjcmlwdGlvblZhbGlkYXRpb25UZXN0NSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24oImRlc2MgcmlwdGlvbiIpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZXNjcmlwdGlvblZhbGlkYXRpb25UZXN0NigpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24oImRlc2NcdHJpcHRpb24iKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTEgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UxKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UxLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIwMCwgdXBkYXRlU2VydmljZVJlc3BvbnNlMS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJkZXNjIHJpcHRpb24iKTsKKwkJdmFsaWRhdGVBY3R1YWxWc0V4cGVjdGVkKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgdXBkYXRlU2VydmljZVJlc3BvbnNlMSk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZSh1cGRhdGVkU2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3Q3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiZGVzYyAgICAgIHJpcHRpb24gICAgICIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlMiA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKHVwZGF0ZVNlcnZpY2VSZXNwb25zZTIpOworCQlhc3NlcnROb3ROdWxsKHVwZGF0ZVNlcnZpY2VSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoMjAwLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24oImRlc2MgcmlwdGlvbiIpOworCQl2YWxpZGF0ZUFjdHVhbFZzRXhwZWN0ZWQodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UyKTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVzY3JpcHRpb25WYWxpZGF0aW9uVGVzdDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJkZXNjIiArIFN0cmluZ1V0aWxzLkxGICsgInJpcHRpb24iKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTMgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UzKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UzLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIwMCwgdXBkYXRlU2VydmljZVJlc3BvbnNlMy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJkZXNjIHJpcHRpb24iKTsKKwkJdmFsaWRhdGVBY3R1YWxWc0V4cGVjdGVkKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgdXBkYXRlU2VydmljZVJlc3BvbnNlMyk7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZSh1cGRhdGVkU2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3Q5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiPGh0bWw+SGVsbG8sIDxiPndvcmxkITwvYj48L2h0bWw+Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2U0ID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlNCk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlNC5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygyMDAsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTQuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiSGVsbG8sIHdvcmxkISIpOworCQl2YWxpZGF0ZUFjdHVhbFZzRXhwZWN0ZWQodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2U0KTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVzY3JpcHRpb25WYWxpZGF0aW9uVGVzdDEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiXHVDMkI1Iik7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0RFU0NSSVBUSU9OLCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3QxMF9hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigi5paHIik7CisJCXVwZGF0ZVdpdGhJbnZhbGlkVmFsdWUoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0RFU0NSSVBUSU9OLCBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdCgiU2VydmljZSIpKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3QxMF9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiXHVDMkI1Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2U1ID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlNSk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlNS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygyMDAsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTUuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiYWJjIik7CisJCXZhbGlkYXRlQWN0dWFsVnNFeHBlY3RlZCh1cGRhdGVkU2VydmljZURldGFpbHMsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTUpOworCQlnZXRTZXJ2aWNlQW5kVmFsaWRhdGUodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3QxMSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIiY8PiIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlNiA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZSh1cGRhdGVkU2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnROb3ROdWxsKHVwZGF0ZVNlcnZpY2VSZXNwb25zZTYpOworCQlhc3NlcnROb3ROdWxsKHVwZGF0ZVNlcnZpY2VSZXNwb25zZTYuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoMjAwLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2U2LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIiZhbXA7Jmx0OyZndDsiKTsKKwkJdmFsaWRhdGVBY3R1YWxWc0V4cGVjdGVkKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgdXBkYXRlU2VydmljZVJlc3BvbnNlNik7CisJCWdldFNlcnZpY2VBbmRWYWxpZGF0ZSh1cGRhdGVkU2VydmljZURldGFpbHMsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3QxMigpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0RGVzY3JpcHRpb24oIuaWhyB0ZXN0Iik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlUmVzcG9uc2U3ID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlNyk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlNy5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygyMDAsIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTcuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigidGVzdCIpOworCQl2YWxpZGF0ZUFjdHVhbFZzRXhwZWN0ZWQodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2U3KTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVzY3JpcHRpb25WYWxpZGF0aW9uVGVzdDEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbigiICAgZGVzY3JpcHRpb24iKTsKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VSZXNwb25zZTggPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2UodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2U4KTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2U4LmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIwMCwgdXBkYXRlU2VydmljZVJlc3BvbnNlOC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldERlc2NyaXB0aW9uKCJkZXNjcmlwdGlvbiIpOworCQl2YWxpZGF0ZUFjdHVhbFZzRXhwZWN0ZWQodXBkYXRlZFNlcnZpY2VEZXRhaWxzLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2U4KTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVzY3JpcHRpb25WYWxpZGF0aW9uVGVzdDE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXREZXNjcmlwdGlvbihtdWx0aXBsZVN0cmluZygiYSIsIDEwMjUpKTsKKwkJdXBkYXRlV2l0aEludmFsaWRWYWx1ZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0RFU0NSSVBUSU9OX0VYQ0VFRFNfTElNSVQsIG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KCJTZXJ2aWNlIiwgIjEwMjQiKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvamVjdENvZGVWYWxpZGF0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGRlc2MgPSBTdHJpbmdVdGlscy5FTVBUWTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlkZXNjICs9IEludGVnZXIudG9TdHJpbmcoaSk7CisJCQlpZiAoaSA+PSA0KSB7CisJCQkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFByb2plY3RDb2RlKGRlc2MpOworCQkJCWNvcnJlY3RVcGRhdGUoKTsKKwkJCX0KKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvamVjdENvZGVWYWxpZGF0aW9uVGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFByb2plY3RDb2RlKG11bHRpcGxlU3RyaW5nKCIxIiwgNikpOworCQljb3JyZWN0VXBkYXRlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9qZWN0Q29kZVZhbGlkYXRpb25UZXN0MygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnNwZWNpYWxDaGFyc0NoZWNraW5nKCJwcm9qZWN0Q29kZSIpOworCX0KKworCS8vIFRPRE8gSXJyZWxldmFudAorCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBwcm9qZWN0Q29kZVZhbGlkYXRpb25UZXN0NCgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0UHJvamVjdENvZGUobXVsdGlwbGVTdHJpbmcoIiAiLCA1KSArICI5OTk5OSIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlU2VydmljZVJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydE5vdE51bGwodXBkYXRlU2VydmljZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCh1cGRhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoMjAwLCB1cGRhdGVTZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXVwZGF0ZWRTZXJ2aWNlRGV0YWlscy5zZXRQcm9qZWN0Q29kZSgiMTIzNDUiKTsKKwkJdmFsaWRhdGVBY3R1YWxWc0V4cGVjdGVkKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgdXBkYXRlU2VydmljZVJlc3BvbnNlKTsKKwkJZ2V0U2VydmljZUFuZFZhbGlkYXRlKHVwZGF0ZWRTZXJ2aWNlRGV0YWlscywgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9qZWN0Q29kZVZhbGlkYXRpb25UZXN0NSgpIHRocm93cyBFeGNlcHRpb24geworCQl1cGRhdGVkU2VydmljZURldGFpbHMuc2V0UHJvamVjdENvZGUobXVsdGlwbGVTdHJpbmcoIjAiLCAxMSkpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ERSwgbGlzdEZvck1lc3NhZ2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvamVjdENvZGVWYWxpZGF0aW9uVGVzdDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFByb2plY3RDb2RlKG11bHRpcGxlU3RyaW5nKCIxIiwgNCkpOworCQl1cGRhdGVXaXRoSW52YWxpZFZhbHVlKEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ERSwgbGlzdEZvck1lc3NhZ2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvamVjdENvZGVWYWxpZGF0aW9uVGVzdDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdXBkYXRlZFNlcnZpY2VEZXRhaWxzLnNldFByb2plY3RDb2RlKCIxMjM0NTY3ODkiKTsKKwkJY29ycmVjdFVwZGF0ZSgpOworCX0KKworCS8vIC8vLy9VUzU1Mzg3NAorCS8vIEBKc29uSWdub3JlCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBVcGRhdGVTZXJ2aWNlVmVyc2lvbjAxX2lzVk5GX3RvVHJ1ZSgpIHRocm93cyBFeGNlcHRpb257CisJLy8KKwkvLyAvL2Nob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCS8vIFVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkvLyAvLyBuZXcgc2VydmljZSBkZXRhaWxzCisJLy8gLy8gU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCS8vIC8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSB1cGRhdGluZyBzZXJ2aWNlCisJLy8gRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCS8vIFNlcnZpY2VSZXN0VXRpbHMuZGVsZXRlU2VydmljZUJ5SWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkvLyBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCS8vIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkvLworCS8vIC8vc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKwkvLyBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsCisJLy8gMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8KKwkvLyAvL2dldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGNyZWF0ZWQgd2l0aCBpc1ZORiBkZWZpbmVkIGluCisJLy8gc2VydmljZURldGFpbHMKKwkvLyBSZXN0UmVzcG9uc2Ugc2VydmljZUJ5TmFtZUFuZFZlcnNpb24gPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCS8vIFNlcnZpY2Ugc2VydmljZU9iamVjdCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsCisJLy8gc2VydmljZU9iamVjdCwgc2RuY1VzZXJEZXRhaWxzLAorCS8vIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgYXVkaXQKKwkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCAiMC4xIiwKKwkvLyBzZG5jVXNlckRldGFpbHMpOworCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iQ3JlYXRlIjsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vCisJLy8KKwkvLyAvL1VwZGF0ZSBTZXJ2aWNlIElzVk5GIHRvIFRydWUKKwkvLyByZXN0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkvLyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyBJbnRlcmZhY2UgQXJ0aWZhY3QiLAorCS8vIDIwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vCisJLy8gLy9nZXQgc2VydmljZSBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBjcmVhdGVkIHdpdGggaXNWTkYgZGVmaW5lZCBpbgorCS8vIHNlcnZpY2VEZXRhaWxzCisJLy8gc2VydmljZUJ5TmFtZUFuZFZlcnNpb24gPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCS8vIHNlcnZpY2VPYmplY3QgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUJ5TmFtZUFuZFZlcnNpb24uZ2V0UmVzcG9uc2UoKSk7CisJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VPYmplY3QsIHNkbmNVc2VyRGV0YWlscywKKwkvLyBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBASnNvbklnbm9yZQorCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgVXBkYXRlU2VydmljZVZlcnNpb24wMl9pc1ZORl90b0ZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKwkvLworCS8vIC8vY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJLy8gVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCS8vIC8vIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkvLyAvLyBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJLy8gLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHVwZGF0aW5nIHNlcnZpY2UKKwkvLyBEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJLy8gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlQnlJZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJLy8gc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCS8vCisJLy8gLy9zZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJLy8gcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgSW50ZXJmYWNlIEFydGlmYWN0IiwKKwkvLyAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIC8vZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgY3JlYXRlZCB3aXRoIGlzVk5GIGRlZmluZWQgaW4KKwkvLyBzZXJ2aWNlRGV0YWlscworCS8vIFJlc3RSZXNwb25zZSBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJLy8gU2VydmljZSBzZXJ2aWNlT2JqZWN0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uLmdldFJlc3BvbnNlKCkpOworCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTZXJ2aWNlUmVzcG9uc2VNZXRhRGF0YShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZXJ2aWNlT2JqZWN0LCBzZG5jVXNlckRldGFpbHMsCisJLy8gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCS8vCisJLy8gLy92YWxpZGF0ZSBhdWRpdAorCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJLy8gU2VydmljZVJlc3RVdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsICIwLjEiLAorCS8vIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJDcmVhdGUiOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCS8vIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJLy8KKwkvLworCS8vIC8vVXBkYXRlIFNlcnZpY2UgSXNWTkYgdG8gVHJ1ZQorCS8vIHJlc3RSZXNwb25zZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJLy8gc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsCisJLy8gMjAwLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8KKwkvLyAvL2dldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGNyZWF0ZWQgd2l0aCBpc1ZORiBkZWZpbmVkIGluCisJLy8gc2VydmljZURldGFpbHMKKwkvLyBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJLy8gc2VydmljZU9iamVjdCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsCisJLy8gc2VydmljZU9iamVjdCwgc2RuY1VzZXJEZXRhaWxzLAorCS8vIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkvLyB9CisJLy8KKwkvLyBASnNvbklnbm9yZQorCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgVXBkYXRlU2VydmljZVZlcnNpb24wMV9pc1ZORl9UcnVlVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKwkvLworCS8vIC8vY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJLy8gVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCS8vIC8vIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkvLyAvLyBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJLy8gLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHVwZGF0aW5nIHNlcnZpY2UKKwkvLyBEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJLy8gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlQnlJZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJLy8gc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCS8vCisJLy8gLy9zZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJLy8gcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgSW50ZXJmYWNlIEFydGlmYWN0IiwKKwkvLyAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIC8vZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgY3JlYXRlZCB3aXRoIGlzVk5GIGRlZmluZWQgaW4KKwkvLyBzZXJ2aWNlRGV0YWlscworCS8vIFJlc3RSZXNwb25zZSBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJLy8gU2VydmljZSBzZXJ2aWNlT2JqZWN0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uLmdldFJlc3BvbnNlKCkpOworCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTZXJ2aWNlUmVzcG9uc2VNZXRhRGF0YShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZXJ2aWNlT2JqZWN0LCBzZG5jVXNlckRldGFpbHMsCisJLy8gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCS8vCisJLy8gLy92YWxpZGF0ZSBhdWRpdAorCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJLy8gU2VydmljZVJlc3RVdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsICIwLjEiLAorCS8vIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJDcmVhdGUiOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCS8vIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJLy8KKwkvLworCS8vIC8vVXBkYXRlIFNlcnZpY2UgSXNWTkYgdG8gVHJ1ZQorCS8vIHJlc3RSZXNwb25zZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJLy8gc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsCisJLy8gNDAwLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8gTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoIlZORiBTZXJ2aWNlIEluZGljYXRvciIpOworCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLm5hbWUoKSwKKwkvLyB2YXJpYWJsZXMsIHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLworCS8vIC8vZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgY3JlYXRlZCB3aXRoIGlzVk5GIGlzIHJlbWFpbmVkIHdpdGgKKwkvLyBpc1ZORiA9IHRydWUKKwkvLyBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJLy8gc2VydmljZU9iamVjdCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsCisJLy8gc2VydmljZU9iamVjdCwgc2RuY1VzZXJEZXRhaWxzLAorCS8vIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkvLyB9CisJLy8KKwkvLyBASnNvbklnbm9yZQorCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgVXBkYXRlU2VydmljZVZlcnNpb24wMV9pc1ZORl9GYWxzZVRvTnVsbCgpIHRocm93cyBFeGNlcHRpb257CisJLy8KKwkvLyAvL2Nob29zZSB0aGUgdXNlciB0byBjcmVhdGUgc2VydmljZQorCS8vIFVzZXIgc2RuY1VzZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKwkvLyAvLyBuZXcgc2VydmljZSBkZXRhaWxzCisJLy8gLy8gU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCS8vIC8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSB1cGRhdGluZyBzZXJ2aWNlCisJLy8gRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCS8vIFNlcnZpY2VSZXN0VXRpbHMuZGVsZXRlU2VydmljZUJ5SWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkvLyBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCS8vIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkvLworCS8vIC8vc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKwkvLyBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsCisJLy8gMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8KKwkvLyAvL2dldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGNyZWF0ZWQgd2l0aCBpc1ZORiBkZWZpbmVkIGluCisJLy8gc2VydmljZURldGFpbHMKKwkvLyBSZXN0UmVzcG9uc2Ugc2VydmljZUJ5TmFtZUFuZFZlcnNpb24gPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCS8vIFNlcnZpY2Ugc2VydmljZU9iamVjdCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsCisJLy8gc2VydmljZU9iamVjdCwgc2RuY1VzZXJEZXRhaWxzLAorCS8vIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgYXVkaXQKKwkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCAiMC4xIiwKKwkvLyBzZG5jVXNlckRldGFpbHMpOworCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iQ3JlYXRlIjsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vCisJLy8KKwkvLyAvL1VwZGF0ZSBTZXJ2aWNlIElzVk5GIHRvIFRydWUKKwkvLyByZXN0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkvLyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyBJbnRlcmZhY2UgQXJ0aWZhY3QiLAorCS8vIDQwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCJWTkYgU2VydmljZSBJbmRpY2F0b3IiKTsKKwkvLyBFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQS5uYW1lKCksCisJLy8gdmFyaWFibGVzLCByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJLy8KKwkvLyAvL2dldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGNyZWF0ZWQgd2l0aCBpc1ZORiBpcyByZW1haW5lZCB3aXRoCisJLy8gaXNWTkYgPSB0cnVlCisJLy8gc2VydmljZUJ5TmFtZUFuZFZlcnNpb24gPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCS8vIHNlcnZpY2VPYmplY3QgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUJ5TmFtZUFuZFZlcnNpb24uZ2V0UmVzcG9uc2UoKSk7CisJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VPYmplY3QsIHNkbmNVc2VyRGV0YWlscywKKwkvLyBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJLy8gfQorCS8vCisJLy8gQEpzb25JZ25vcmUKKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIFVwZGF0ZVNlcnZpY2VWZXJzaW9uMDJfSXNWTkZfdG9UcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKwkvLworCS8vIC8vY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJLy8gVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCS8vIC8vIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkvLyAvLyBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJLy8gLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHVwZGF0aW5nIHNlcnZpY2UKKwkvLyBEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJLy8gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlQnlJZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJLy8gc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCS8vCisJLy8gLy9zZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJLy8gcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgSW50ZXJmYWNlIEFydGlmYWN0IiwKKwkvLyAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIC8vZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgY3JlYXRlZCB3aXRoIGlzVk5GIGRlZmluZWQgaW4KKwkvLyBzZXJ2aWNlRGV0YWlscworCS8vIFJlc3RSZXNwb25zZSBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJLy8gU2VydmljZSBzZXJ2aWNlT2JqZWN0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uLmdldFJlc3BvbnNlKCkpOworCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTZXJ2aWNlUmVzcG9uc2VNZXRhRGF0YShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZXJ2aWNlT2JqZWN0LCBzZG5jVXNlckRldGFpbHMsCisJLy8gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCS8vCisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJLy8gTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkvLyBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkvLyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgYXVkaXQKKwkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCAiMC4xIiwKKwkvLyBzZG5jVXNlckRldGFpbHMpOworCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iQ3JlYXRlIjsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vCisJLy8KKwkvLyAvL1VwZGF0ZSBTZXJ2aWNlIElzVk5GIHRvIFRydWUKKwkvLyByZXN0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkvLyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyBJbnRlcmZhY2UgQXJ0aWZhY3QiLAorCS8vIDIwMCwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vCisJLy8gLy9nZXQgc2VydmljZSBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBjcmVhdGVkIHdpdGggaXNWTkYgZGVmaW5lZCBpbgorCS8vIHNlcnZpY2VEZXRhaWxzCisJLy8gc2VydmljZUJ5TmFtZUFuZFZlcnNpb24gPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCS8vIHNlcnZpY2VPYmplY3QgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUJ5TmFtZUFuZFZlcnNpb24uZ2V0UmVzcG9uc2UoKSk7CisJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VPYmplY3QsIHNkbmNVc2VyRGV0YWlscywKKwkvLyBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBASnNvbklnbm9yZQorCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgVXBkYXRlU2VydmljZVZlcnNpb24wMl9Jc1ZORl90b0ZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKwkvLworCS8vIC8vY2hvb3NlIHRoZSB1c2VyIHRvIGNyZWF0ZSBzZXJ2aWNlCisJLy8gVXNlciBzZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCS8vIC8vIG5ldyBzZXJ2aWNlIGRldGFpbHMKKwkvLyAvLyBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJLy8gLy8gY2xlYW4gYXVkaXQgREIgYmVmb3JlIHVwZGF0aW5nIHNlcnZpY2UKKwkvLyBEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJLy8gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlQnlJZChzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJLy8gc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCS8vCisJLy8gLy9zZW5kIGNyZWF0ZSBzZXJ2aWNlIHRvd2FyZCBCRQorCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJLy8gcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgSW50ZXJmYWNlIEFydGlmYWN0IiwKKwkvLyAyMDEsIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vIC8vZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgY3JlYXRlZCB3aXRoIGlzVk5GIGRlZmluZWQgaW4KKwkvLyBzZXJ2aWNlRGV0YWlscworCS8vIFJlc3RSZXNwb25zZSBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJLy8gU2VydmljZSBzZXJ2aWNlT2JqZWN0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uLmdldFJlc3BvbnNlKCkpOworCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTZXJ2aWNlUmVzcG9uc2VNZXRhRGF0YShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZXJ2aWNlT2JqZWN0LCBzZG5jVXNlckRldGFpbHMsCisJLy8gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCS8vCisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZG5jRGVzaWduZXJEZXRhaWxzLCBzZXJ2aWNlRGV0YWlscy5nZXRWZXJzaW9uKCksCisJLy8gTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkvLyBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNkbmNEZXNpZ25lckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFZlcnNpb24oKSwKKwkvLyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgYXVkaXQKKwkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLCAiMC4xIiwKKwkvLyBzZG5jVXNlckRldGFpbHMpOworCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iQ3JlYXRlIjsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vCisJLy8KKwkvLyAvL1VwZGF0ZSBTZXJ2aWNlIElzVk5GIHRvIGZhbHNlCisJLy8gcmVzdFJlc3BvbnNlID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkvLyBzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyAvL3Jlc3RSZXNwb25zZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy51cGRhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJLy8gc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsCisJLy8gMjAwLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8KKwkvLyAvL2dldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGNyZWF0ZWQgd2l0aCBpc1ZORiBkZWZpbmVkIGluCisJLy8gc2VydmljZURldGFpbHMKKwkvLyBzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbiA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZG5jVXNlckRldGFpbHMsCisJLy8gc2VydmljZURldGFpbHMuZ2V0TmFtZSgpLCAiMC4xIik7CisJLy8gc2VydmljZU9iamVjdCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsCisJLy8gc2VydmljZU9iamVjdCwgc2RuY1VzZXJEZXRhaWxzLAorCS8vIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkvLworCS8vIH0KKwkvLworCS8vIEBKc29uSWdub3JlCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBVcGRhdGVTZXJ2aWNlVmVyc2lvbjExX0lzVk5GX3RvRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9ueworCS8vIC8vIENhbid0IHVwZGF0ZSBpc1ZORiB3aGVuIHNlcnZpY2UgdmVyc2lvbiBpcyAxLlgKKwkvLyBVc2VyIHNkbmNVc2VyRGV0YWlscyA9CisJLy8gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkvLyAvLyBuZXcgc2VydmljZSBkZXRhaWxzCisJLy8gLy8gU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCS8vIC8vIGNsZWFuIGF1ZGl0IERCIGJlZm9yZSB1cGRhdGluZyBzZXJ2aWNlCisJLy8gRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCS8vIFNlcnZpY2VSZXN0VXRpbHMuZGVsZXRlU2VydmljZUJ5SWQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkvLyBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCS8vIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkvLworCS8vIC8vc2VuZCBjcmVhdGUgc2VydmljZSB0b3dhcmQgQkUKKwkvLyBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIEludGVyZmFjZSBBcnRpZmFjdCIsCisJLy8gMjAxLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8KKwkvLyAvL2dldCBzZXJ2aWNlIGFuZCB2ZXJpZnkgdGhhdCBzZXJ2aWNlIGNyZWF0ZWQgd2l0aCBpc1ZORiBkZWZpbmVkIGluCisJLy8gc2VydmljZURldGFpbHMKKwkvLyBSZXN0UmVzcG9uc2Ugc2VydmljZUJ5TmFtZUFuZFZlcnNpb24gPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgIjAuMSIpOworCS8vIFNlcnZpY2Ugc2VydmljZU9iamVjdCA9CisJLy8gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbi5nZXRSZXNwb25zZSgpKTsKKwkvLyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsCisJLy8gc2VydmljZU9iamVjdCwgc2RuY1VzZXJEZXRhaWxzLAorCS8vIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkvLyAvL1N0cmluZyBzZXJ2aWNlVW5pcXVlTmFtZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy5nZXRTZXJ2aWNlVW5pcXVlSWQoc2VydmljZUJ5TmFtZUFuZFZlcnNpb24pOworCS8vCisJLy8gLy92YWxpZGF0ZSBhdWRpdAorCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJLy8gU2VydmljZVJlc3RVdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsICIwLjEiLAorCS8vIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJDcmVhdGUiOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCS8vIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJLy8KKwkvLy8vIFNlcnZpY2VSZXN0VXRpbHMuYWRkU2VydmljZU1hbmRhdG9yeUFydGlmYWN0cyhzZG5jVXNlckRldGFpbHMsCisJLy8gcmVzdFJlc3BvbnNlKTsKKwkvLyBSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPQorCS8vIENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLAorCS8vIHNkbmNVc2VyRGV0YWlscywgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwKKwkvLyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkvLyBhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDEsIHJldHVybmVkOiAiICsKKwkvLyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSxyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCS8vIFJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlU3RhdGUgPQorCS8vIExDU2Jhc2VUZXN0LmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzKTsKKwkvLyBhc3NlcnRUcnVlKCJjZXJ0aWZ5IHNlcnZpY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArCisJLy8gY2hhbmdlU2VydmljZVN0YXRlLmdldEVycm9yQ29kZSgpLGNoYW5nZVNlcnZpY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSA9PQorCS8vIDIwMCk7CisJLy8gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY1VzZXJEZXRhaWxzLAorCS8vIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCS8vCisJLy8gLy9VcGRhdGUgU2VydmljZSBJc1ZORiB0byBmYWxzZQorCS8vIHJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMudXBkYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZG5jVXNlckRldGFpbHMpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkvLyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyBzZXJ2aWNlIG1ldGFkYXRhIiwgNDAwLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLyBMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJLy8gRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TRVJWSUNFX0lTX1ZORl9DQU5OT1RfQkVfQ0hBTkdFRC5uYW1lKCksCisJLy8gdmFyaWFibGVzLCByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJLy8KKwkvLworCS8vIC8vZ2V0IHNlcnZpY2UgYW5kIHZlcmlmeSB0aGF0IHNlcnZpY2UgY3JlYXRlZCB3aXRoIGlzVk5GIGRlZmluZWQgaW4KKwkvLyBzZXJ2aWNlRGV0YWlscworCS8vIHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNVc2VyRGV0YWlscywKKwkvLyBzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksICIxLjEiKTsKKwkvLyBzZXJ2aWNlT2JqZWN0ID0KKwkvLyBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uLmdldFJlc3BvbnNlKCkpOworCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTZXJ2aWNlUmVzcG9uc2VNZXRhRGF0YShzZXJ2aWNlRGV0YWlscywKKwkvLyBzZXJ2aWNlT2JqZWN0LCBzZG5jVXNlckRldGFpbHMsCisJLy8gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCS8vCisJLy8gfQorCS8vCisJLy8gQEpzb25JZ25vcmUKKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIFVwZGF0ZVNlcnZpY2VWZXJzaW9uMTFfSXNWTkZfdG9UcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKwkvLyAvLyBDYW4ndCB1cGRhdGUgaXNWTkYgd2hlbiBzZXJ2aWNlIHZlcnNpb24gaXMgMS5YCisJLy8gVXNlciBzZG5jVXNlckRldGFpbHMgPQorCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJLy8gLy8gbmV3IHNlcnZpY2UgZGV0YWlscworCS8vIC8vIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkvLyAvLyBjbGVhbiBhdWRpdCBEQiBiZWZvcmUgdXBkYXRpbmcgc2VydmljZQorCS8vIERiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLmRlbGV0ZVNlcnZpY2VCeUlkKHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJLy8gc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkvLyBzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJLy8KKwkvLyAvL3NlbmQgY3JlYXRlIHNlcnZpY2UgdG93YXJkIEJFCisJLy8gUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkvLyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyBJbnRlcmZhY2UgQXJ0aWZhY3QiLAorCS8vIDIwMSwgcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vCisJLy8gLy9nZXQgc2VydmljZSBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBjcmVhdGVkIHdpdGggaXNWTkYgZGVmaW5lZCBpbgorCS8vIHNlcnZpY2VEZXRhaWxzCisJLy8gUmVzdFJlc3BvbnNlIHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKHNkbmNVc2VyRGV0YWlscywKKwkvLyBzZXJ2aWNlRGV0YWlscy5nZXROYW1lKCksICIwLjEiKTsKKwkvLyBTZXJ2aWNlIHNlcnZpY2VPYmplY3QgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUJ5TmFtZUFuZFZlcnNpb24uZ2V0UmVzcG9uc2UoKSk7CisJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VPYmplY3QsIHNkbmNVc2VyRGV0YWlscywKKwkvLyBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJLy8gLy9TdHJpbmcgc2VydmljZVVuaXF1ZU5hbWUgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZVVuaXF1ZUlkKHNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgYXVkaXQKKwkvLyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPQorCS8vIFNlcnZpY2VWYWxpZGF0aW9uVXRpbHMuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKHNlcnZpY2VEZXRhaWxzLAorCS8vICIwLjEiLCBzZG5jVXNlckRldGFpbHMpOworCS8vIFN0cmluZyBhdWRpdEFjdGlvbj0iQ3JlYXRlIjsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vIEF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwKKwkvLyBhdWRpdEFjdGlvbiwgbnVsbCwgZmFsc2UpOworCS8vCisJLy8vLyBTZXJ2aWNlUmVzdFV0aWxzLmFkZFNlcnZpY2VNYW5kYXRvcnlBcnRpZmFjdHMoc2RuY1VzZXJEZXRhaWxzLAorCS8vIHJlc3RSZXNwb25zZSk7CisJLy8gUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0KKwkvLyBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywKKwkvLyBzZG5jVXNlckRldGFpbHMsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJLy8gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJLy8gYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAxLCByZXR1cm5lZDogIiArCisJLy8gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkscmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkvLyBSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZVN0YXRlID0KKwkvLyBMQ1NiYXNlVGVzdC5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJLy8gYXNzZXJ0VHJ1ZSgiY2VydGlmeSBzZXJ2aWNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKworCS8vIGNoYW5nZVNlcnZpY2VTdGF0ZS5nZXRFcnJvckNvZGUoKSxjaGFuZ2VTZXJ2aWNlU3RhdGUuZ2V0RXJyb3JDb2RlKCkgPT0KKwkvLyAyMDApOworCS8vIExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywKKwkvLyBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VUKTsKKwkvLworCS8vIC8vVXBkYXRlIFNlcnZpY2UgSXNWTkYgdG8gZmFsc2UKKwkvLyByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLnVwZGF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsCisJLy8gc2RuY1VzZXJEZXRhaWxzKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJLy8gcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgc2VydmljZSBtZXRhZGF0YSIsIDQwMCwKKwkvLyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJLy8gTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuU0VSVklDRV9JU19WTkZfQ0FOTk9UX0JFX0NIQU5HRUQubmFtZSgpLAorCS8vIHZhcmlhYmxlcywgcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCS8vCisJLy8gLy9nZXQgc2VydmljZSBhbmQgdmVyaWZ5IHRoYXQgc2VydmljZSBjcmVhdGVkIHdpdGggaXNWTkYgZGVmaW5lZCBpbgorCS8vIHNlcnZpY2VEZXRhaWxzCisJLy8gc2VydmljZUJ5TmFtZUFuZFZlcnNpb24gPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSwgIjEuMSIpOworCS8vIHNlcnZpY2VPYmplY3QgPQorCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3Qoc2VydmljZUJ5TmFtZUFuZFZlcnNpb24uZ2V0UmVzcG9uc2UoKSk7CisJLy8gU2VydmljZVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNlcnZpY2VPYmplY3QsIHNkbmNVc2VyRGV0YWlscywKKwkvLyBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJLy8gfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS91c2VyL0FjdGl2YXRlRGVBY3RpdmF0ZURlbGV0ZVVzZXIuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3VzZXIvQWN0aXZhdGVEZUFjdGl2YXRlRGVsZXRlVXNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzAxODIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS91c2VyL0FjdGl2YXRlRGVBY3RpdmF0ZURlbGV0ZVVzZXIuamF2YQpAQCAtMCwwICsxLDgzMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5Vc2VyU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXNwSmF2YU9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFVzZXJDUlVEQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnVzZXJzLlVzZXJSZXNwb25zZU1lc3NhZ2VFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkRiVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5Db252ZXJ0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNhdGFsb2dSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5JbXBvcnRSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuVXNlclJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5SZXNvdXJjZVZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlVzZXJWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworLyoqCisgKiBAYXV0aG9yIGFsaXR2aW5za3kKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBY3RpdmF0ZURlQWN0aXZhdGVEZWxldGVVc2VyIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBY3RpdmF0ZURlQWN0aXZhdGVEZWxldGVVc2VyLmNsYXNzLmdldE5hbWUoKSk7CisJcHJvdGVjdGVkIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluVXNlcjsKKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlzZG5jQWRtaW5Vc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKTsKKworCX0KKworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgQWN0aXZhdGVEZUFjdGl2YXRlRGVsZXRlVXNlcigpIHsKKwkJc3VwZXIobmFtZSwgQWN0aXZhdGVEZUFjdGl2YXRlRGVsZXRlVXNlci5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYXV0aG9yaXplRGVBY3RpdmF0ZWRVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBnZXREZWZhdWx0VXNlckRldGFpbHMoKTsKKworCQl0cnkgeworCisJCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQkJdmFsaWRhdGVTdWNjZXNzQ3JlYXRlVXNlclJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgY3JlYXRlVXNlclJlc3BvbnNlKTsKKworCQkJLy8gZGVBY3RpdmF0ZSBjcmVhdGVkIHVzZXIKKwkJCVJlc3RSZXNwb25zZSBkZUFjdGl2YXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5kZUFjdGl2YXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQkJc2RuY1VzZXJEZXRhaWxzLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5JTkFDVElWRSk7CisJCQl2YWxpZGF0ZVN1Y2Nlc3NEZUFjdGl2YXRlVXNlclJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgZGVBY3RpdmF0ZVVzZXJSZXNwb25zZSk7CisKKwkJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCkpOworCQkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCisJCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVBY3RpdmUgdXNlciIsIGVycm9ySW5mby5nZXRDb2RlKCksCisJCQkJCWdldFVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJCWdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkJLy8gY2xlYW4gYXVkaXQgYmVmb3JlIGF1dGhvcml6YXRpb24gdGVzdAorCQkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCQkvLyBQZXJmb3JtIGxvZ2luIGZyb20gV2ViU2VhbAorCQkJVXNlciBzZWFsVXNlckRldGFpbHMgPSBzZG5jVXNlckRldGFpbHM7CisJCQlSZXN0UmVzcG9uc2UgYXV0aG9yaXplZFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuYXV0aG9yaXplZFVzZXJUb3dhcmRzQ2F0YWxvZ0JlUUEoc2VhbFVzZXJEZXRhaWxzKTsKKworCQkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKworCQkJRXJyb3JJbmZvIGVycm9ySW5mbzIgPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9BQ0NFU1MubmFtZSgpKTsKKworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVzZXIgbG9naW4iLCBhdXRob3JpemVkVXNlclJlc3BvbnNlKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVzZXIgbG9naW4iLAorCQkJCQlhdXRob3JpemVkVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZUFjdGl2ZSB1c2VyIiwgZXJyb3JJbmZvMi5nZXRDb2RlKCksCisJCQkJCWF1dGhvcml6ZWRVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzMiA9IEFycmF5cy5hc0xpc3QoKTsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9BQ0NFU1MubmFtZSgpLCB2YXJpYWJsZXMyLAorCQkJCQlhdXRob3JpemVkVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCQkvLyB2YWxpZGF0ZSBhZ2FpbnN0IEVTIERCCisKKwkJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVEYXRhQWdhaW5zdEF1ZGl0REJfYWNjZXNzKHNlYWxVc2VyRGV0YWlscywKKwkJCQkJRGJVdGlscy5wYXJzZUF1ZGl0UmVzcEJ5QWN0aW9uKCJBY2Nlc3MiKSwgYXV0aG9yaXplZFVzZXJSZXNwb25zZSwgZXJyb3JJbmZvMiwgdmFyaWFibGVzMik7CisKKwkJfSBmaW5hbGx5IHsKKwkJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQl9CisKKwl9CisKKwlwdWJsaWMgVXNlciBnZXREZWZhdWx0VXNlckRldGFpbHMoKSB7CisKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAia20yMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiS290IjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJNYXkiOworCQlTdHJpbmcgZW1haWwgPSAia20yMDAwQGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gVXNlclJvbGVFbnVtLkFETUlOLm5hbWUoKTsKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKworCQlyZXR1cm4gc2RuY1VzZXJEZXRhaWxzOworCX0KKworCXB1YmxpYyB2b2lkIHZhbGlkYXRlU3VjY2Vzc0NyZWF0ZVVzZXJSZXNwb25zZShVc2VyIHNkbmNVc2VyRGV0YWlscywgUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwKKwkJCQljcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBIdHRwU3RhdHVzLlNDX0NSRUFURUQsCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIFVzZXJSZXN0VXRpbHMudmFsaWRhdGVBZGRVc2VyQXVkaXRNZXNzYWdlKHNkbmNVc2VyRGV0YWlscywKKwkJLy8gc2RuY0FkbWluVXNlciwgU3RyaW5nLnZhbHVlT2YoSHR0cFN0YXR1cy5TQ19DUkVBVEVEKSwKKwkJLy8gVXNlclJlc3BvbnNlTWVzc2FnZUVudW0uU1VDQ0VTU19NRVNTQUdFLmdldFZhbHVlKCksCisJCS8vIFVzZXJSZXN0VXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJU3RyaW5nIGFkZFVzZXIgPSAiQWRkVXNlciI7CisJCUV4cGVjdGVkVXNlckNSVURBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24gPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKGFkZFVzZXIsCisJCQkJc2RuY0FkbWluVXNlciwgQWN0aW9uU3RhdHVzLkNSRUFURUQsIHNkbmNVc2VyRGV0YWlscywgbnVsbCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQWRkVXNlckF1ZGl0KGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiwgYWRkVXNlcik7CisKKwkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgZ2V0VXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJfQorCisJcHVibGljIHZvaWQgdmFsaWRhdGVTdWNjZXNzRGVBY3RpdmF0ZVVzZXJSZXNwb25zZShVc2VyIHNkbmNVc2VyRGV0YWlscywgUmVzdFJlc3BvbnNlIGRlQWN0aXZhdGVVc2VyUmVzcG9uc2UpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVBY3RpdmUgdXNlciIsIGRlQWN0aXZhdGVVc2VyUmVzcG9uc2UpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBkZUFjdGl2ZSB1c2VyIiwKKwkJCQlkZUFjdGl2YXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlQWN0aXZlIHVzZXIiLCAyMDAsCisJCQkJZGVBY3RpdmF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgZGVBY3RpdmF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlTdHJpbmcgZGVsZXRlVXNlciA9ICJEZWxldGVVc2VyIjsKKwkJRXhwZWN0ZWRVc2VyQ1JVREF1ZGl0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbiA9IENvbnZlcnRvcgorCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oZGVsZXRlVXNlciwgc2RuY0FkbWluVXNlciwgQWN0aW9uU3RhdHVzLk9LLCBudWxsLCBzZG5jVXNlckRldGFpbHMpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIGRlbGV0ZVVzZXIpOworCisJfQorCisJLy8gVVM0OTgzMjIgLSBBZGQgU3RhdHVzIEZpZWxkIHRvIFVTRVIKKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlTmV3VXNlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gZ2V0RGVmYXVsdFVzZXJEZXRhaWxzKCk7CisJCXRyeSB7CisKKwkJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCQl2YWxpZGF0ZVN1Y2Nlc3NDcmVhdGVVc2VyUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCisJCX0gZmluYWxseSB7CisJCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJfQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0VXNlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gZ2V0RGVmYXVsdFVzZXJEZXRhaWxzKCk7CisJCXNkbmNVc2VyRGV0YWlscy5zZXRGaXJzdE5hbWUobnVsbCk7CisJCXNkbmNVc2VyRGV0YWlscy5zZXRMYXN0TmFtZShudWxsKTsKKwkJc2RuY1VzZXJEZXRhaWxzLnNldEVtYWlsKG51bGwpOworCQlzZG5jVXNlckRldGFpbHMuc2V0Um9sZShudWxsKTsKKworCQl0cnkgeworCisJCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQkJdmFsaWRhdGVTdWNjZXNzQ3JlYXRlVXNlclJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgY3JlYXRlVXNlclJlc3BvbnNlKTsKKworCQl9IGZpbmFsbHkgeworCQkJVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlVGVzdGVyVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gZ2V0RGVmYXVsdFVzZXJEZXRhaWxzKCk7CisJCXNkbmNVc2VyRGV0YWlscy5zZXRMYXN0TmFtZShudWxsKTsKKwkJc2RuY1VzZXJEZXRhaWxzLnNldFJvbGUoVXNlclJvbGVFbnVtLlRFU1RFUi5uYW1lKCkpOworCisJCXRyeSB7CisKKwkJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCQl2YWxpZGF0ZVN1Y2Nlc3NDcmVhdGVVc2VyUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCisJCX0gZmluYWxseSB7CisJCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJfQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZUFjdGl2YXRlQ3JlYXRlZEFkbWluVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gZ2V0RGVmYXVsdFVzZXJEZXRhaWxzKCk7CisKKwkJdHJ5IHsKKworCQkJVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJCXZhbGlkYXRlU3VjY2Vzc0NyZWF0ZVVzZXJSZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisKKwkJCS8vIGRlQWN0aXZhdGUgY3JlYXRlZCB1c2VyCisJCQlSZXN0UmVzcG9uc2UgZGVBY3RpdmF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZGVBY3RpdmF0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJCXNkbmNVc2VyRGV0YWlscy5zZXRTdGF0dXMoVXNlclN0YXR1c0VudW0uSU5BQ1RJVkUpOworCQkJdmFsaWRhdGVTdWNjZXNzRGVBY3RpdmF0ZVVzZXJSZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGRlQWN0aXZhdGVVc2VyUmVzcG9uc2UpOworCisJCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUubmFtZSgpKTsKKworCQkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZ2V0IHVzZXIiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBnZXRVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5VU0VSX0lOQUNUSVZFLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCQlnZXRVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRlQWN0aXZhdGVUaGVTYW1lVXNlclR3aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBnZXREZWZhdWx0VXNlckRldGFpbHMoKTsKKworCQl0cnkgeworCisJCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQkJdmFsaWRhdGVTdWNjZXNzQ3JlYXRlVXNlclJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgY3JlYXRlVXNlclJlc3BvbnNlKTsKKworCQkJLy8gZGVBY3RpdmF0ZSBjcmVhdGVkIHVzZXIKKwkJCVJlc3RSZXNwb25zZSBkZUFjdGl2YXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5kZUFjdGl2YXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQkJc2RuY1VzZXJEZXRhaWxzLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5JTkFDVElWRSk7CisJCQl2YWxpZGF0ZVN1Y2Nlc3NEZUFjdGl2YXRlVXNlclJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgZGVBY3RpdmF0ZVVzZXJSZXNwb25zZSk7CisKKwkJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCkpOworCisJCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZUFjdGl2ZSB1c2VyIiwgZXJyb3JJbmZvLmdldENvZGUoKSwKKwkJCQkJZ2V0VXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3Qoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQkJZ2V0VXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCQkvLyBkZUFjdGl2YXRlIHRoZSBzYW1lIHVzZXIgb25jZSB0aW1lIG1vcmUKKwkJCVJlc3RSZXNwb25zZSBkZUFjdGl2YXRlVXNlclJlc3BvbnNlMiA9IFVzZXJSZXN0VXRpbHMuZGVBY3RpdmF0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJCUVycm9ySW5mbyBlcnJvckluZm8yID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUubmFtZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZUFjdGl2ZSB1c2VyIiwgZXJyb3JJbmZvMi5nZXRDb2RlKCksCisJCQkJCWRlQWN0aXZhdGVVc2VyUmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKworCQkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlczIgPSBBcnJheXMuYXNMaXN0KHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUubmFtZSgpLCB2YXJpYWJsZXMyLAorCQkJCQlkZUFjdGl2YXRlVXNlclJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCQl9IGZpbmFsbHkgeworCQkJVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlQWdhaW5EZUFjdGl2YXRlZFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IGdldERlZmF1bHRVc2VyRGV0YWlscygpOworCisJCXRyeSB7CisKKwkJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCQl2YWxpZGF0ZVN1Y2Nlc3NDcmVhdGVVc2VyUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCisJCQkvLyBkZUFjdGl2YXRlIGNyZWF0ZWQgdXNlcgorCQkJUmVzdFJlc3BvbnNlIGRlQWN0aXZhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmRlQWN0aXZhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCQlzZG5jVXNlckRldGFpbHMuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLklOQUNUSVZFKTsKKwkJCXZhbGlkYXRlU3VjY2Vzc0RlQWN0aXZhdGVVc2VyUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBkZUFjdGl2YXRlVXNlclJlc3BvbnNlKTsKKworCQkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5VU0VSX0lOQUNUSVZFLm5hbWUoKSk7CisJCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZUFjdGl2ZSB1c2VyIiwgZXJyb3JJbmZvLmdldENvZGUoKSwKKwkJCQkJZ2V0VXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3Qoc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQkJZ2V0VXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCQkvLyBjcmVhdGUgdGhlIHVzZXIgd2l0aCB0aGUgc2FtZSBVc2VySWQoZGV0YWlscykgYXMgZGVBY3RpdmF0ZWQgdXNlcgorCQkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlMiA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQkJRXJyb3JJbmZvIGVycm9ySW5mbzIgPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlQWN0aXZlIHVzZXIiLCBlcnJvckluZm8yLmdldENvZGUoKSwKKwkJCQkJY3JlYXRlVXNlclJlc3BvbnNlMi5nZXRFcnJvckNvZGUoKSk7CisKKwkJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMyID0gQXJyYXlzLmFzTGlzdChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5VU0VSX0lOQUNUSVZFLm5hbWUoKSwgdmFyaWFibGVzMiwKKwkJCQkJY3JlYXRlVXNlclJlc3BvbnNlMi5nZXRSZXNwb25zZSgpKTsKKworCQl9IGZpbmFsbHkgeworCQkJVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCX0KKworCX0KKworCS8vIHZlcnkgbm90IHJlY29tbWVuZCB0byBydW4gdGhpcyB0ZXN0LCByZXNvdXJjZXMvc2VydmljZXMgbWF5IGJlIHpvbWJpZQorCS8vIEBUZXN0CisJcHVibGljIHZvaWQgZGVBY3RpdmF0ZUxhc3RBZG1pblVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQl0cnkgeworCisJCQkvLyBzZW5kIGdldCBhbGwgQURNSU4gdXNlciByZXF1ZXN0IHRvd2FyZCBCRQorCQkJUmVzdFJlc3BvbnNlIGdldEFsbEFkbWluVXNlcnMgPSBVc2VyUmVzdFV0aWxzLmdldEFsbEFkbWluVXNlcnMoc2RuY0FkbWluVXNlcik7CisKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGdldEFsbEFkbWluVXNlcnMpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBnZXRBbGxBZG1pblVzZXJzLmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMCwgZ2V0QWxsQWRtaW5Vc2Vycy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkJVHlwZVRva2VuPExpc3Q8VXNlcj4+IHR5cGVUb2tlbiA9IG5ldyBUeXBlVG9rZW48TGlzdDxVc2VyPj4oKSB7CisJCQl9OworCQkJTGlzdDxVc2VyPiBsaXN0T2ZVc2Vyc09uUmVzcG9uc2UgPSBnc29uLmZyb21Kc29uKGdldEFsbEFkbWluVXNlcnMuZ2V0UmVzcG9uc2UoKSwgdHlwZVRva2VuLmdldFR5cGUoKSk7CisJCQlsb2dnZXIuZGVidWcoImxpc3RPZlVzZXJzOiB7fSIsIGxpc3RPZlVzZXJzT25SZXNwb25zZSk7CisKKwkJCS8vIGJ1aWxkIG1hcCBvZiBhbGwgQWRtaW4gdXNlcnMgZnJvbSBsaXN0T2ZVc2Vyc09uUmVzcG9uc2UgZnJvbQorCQkJLy8gcmVzcG9uc2UKKwkJCU1hcDxTdHJpbmcsIFVzZXI+IG1hcEFsbFVzZXJzT25SZXNwb25zZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgVXNlcj4oKTsKKwkJCWZvciAoVXNlciBzZG5jVXNlciA6IGxpc3RPZlVzZXJzT25SZXNwb25zZSkgeworCQkJCW1hcEFsbFVzZXJzT25SZXNwb25zZS5wdXQoc2RuY1VzZXIuZ2V0VXNlcklkKCksIHNkbmNVc2VyKTsKKwkJCX0KKworCQkJLy8gcmVtb3ZlIGZyb20gbWFwQWxsVXNlcnNPblJlc3BvbnNlIG1hcCBvbmUgb2YgYWRtaW4gdXNlcnMKKwkJCW1hcEFsbFVzZXJzT25SZXNwb25zZS5yZW1vdmUoc2RuY0FkbWluVXNlci5nZXRVc2VySWQoKSk7CisJCQlsb2dnZXIuZGVidWcoIm1hcCBPZiBhbGwgQWRtaW4gdXNlcnMgZXhjbHVkZSBvbmUgOiB7fSIsIG1hcEFsbFVzZXJzT25SZXNwb25zZSk7CisKKwkJCS8vIGRlQWN0aXZhdGUgYWxsIEFkbWluIHVzZXJzIGZyb20gdGhlIHVzZXJJZEFsbEFkbWluTGlzdCBsaXN0CisJCQlmb3IgKEVudHJ5PFN0cmluZywgVXNlcj4gZW50cnkgOiBtYXBBbGxVc2Vyc09uUmVzcG9uc2UuZW50cnlTZXQoKSkgeworCQkJCVVzZXJSZXN0VXRpbHMuZGVBY3RpdmF0ZVVzZXIoZW50cnkuZ2V0VmFsdWUoKSwgc2RuY0FkbWluVXNlcik7CisJCQl9CisKKwkJCS8vIGRlQWN0aXZhdGUgbGFzdCBBZG1pbiB1c2VyIHVzZXIKKwkJCVJlc3RSZXNwb25zZSBkZUFjdGl2YXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5kZUFjdGl2YXRlVXNlcihzZG5jQWRtaW5Vc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKworCQkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzCisJCQkJCS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuREVMRVRFX1VTRVJfQURNSU5fQ09ORkxJQ1QubmFtZSgpKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlQWN0aXZlIHVzZXIiLCBlcnJvckluZm8uZ2V0Q29kZSgpLAorCQkJCQlkZUFjdGl2YXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuREVMRVRFX1VTRVJfQURNSU5fQ09ORkxJQ1QubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJCWRlQWN0aXZhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihVc2VyUmVzdFV0aWxzLmdldEFkbWluRGV0YWlsczIoKSwKKwkJCS8vIHNkbmNBZG1pblVzZXIpOworCQkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKFVzZXJSZXN0VXRpbHMuZ2V0QWRtaW5EZXRhaWxzMygpLAorCQkJLy8gc2RuY0FkbWluVXNlcik7CisJCQkvLyBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoVXNlclJlc3RVdGlscy5nZXRBZG1pbkRldGFpbHMyKCksCisJCQkvLyBzZG5jQWRtaW5Vc2VyKTsKKwkJCS8vIFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihVc2VyUmVzdFV0aWxzLmdldEFkbWluRGV0YWlsczMoKSwKKwkJCS8vIHNkbmNBZG1pblVzZXIpOworCQl9CisKKwl9CisKKwkvLyB0ZXN0IGNoZWNrIHRoZSByZXNvdXJjZSBhY2Nlc3NpYmlsaXR5IHZpYSBjYXRhbG9nIHZpZXcsIHJlc291cmNlIHdhcworCS8vIGNyZWF0ZWQgYnkgdXNlciB3aGljaCB3YXMgZGVBY3RpdmF0ZWQKKworCUBUZXN0CisJcHVibGljIHZvaWQgcmVzb3VyY2VBY2Nlc3NpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBnZXREZWZhdWx0VXNlckRldGFpbHMoKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgidG9zY2Eubm9kZXMubmV3cmVzb3VyY2U0dGVzdDQiLAorCQkJCU5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCAiamgwMDAzIik7CisJCVN0cmluZyByZXNvdXJjZUJhc2VWZXJzaW9uID0gIjAuMSI7CisKKwkJdHJ5IHsKKwkJCS8vIERlbGV0ZSByZXNvdXJjZQorCQkJLy8gcmVzb3VyY2VVdGlscy5kZWxldGVSZXNvdXJjZV9hbGxWZXJzaW9ucyhyZXNvdXJjZURldGFpbHMsCisJCQkvLyBzZG5jQWRtaW5Vc2VyKTsKKwkJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCisJCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCQl2YWxpZGF0ZVN1Y2Nlc3NDcmVhdGVVc2VyUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCisJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TdGFydCBjcmVhdGUKKwkJCS8vIHJlc291cmNlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJCS8vIGNyZWF0ZSByZXNvdXJjZQorCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSIsIDIwMSwgY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJCVJlc291cmNlIGNyZWF0ZWRSZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNVc2VyRGV0YWlscywKKwkJCQkJY3JlYXRlZFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCIsIDIwMCwgcmVzb3VyY2VHZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQkJLy8gdmFsaWRhdGUgZ2V0IHJlc3BvbnNlCisJCQlSZXNvdXJjZVJlc3BKYXZhT2JqZWN0IHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBDb252ZXJ0b3IuY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24ocmVzb3VyY2VEZXRhaWxzLAorCQkJCQlyZXNvdXJjZUJhc2VWZXJzaW9uKTsKKwkJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0QWJzdHJhY3R0KCJmYWxzZSIpOworCQkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRDcmVhdG9yVXNlcklkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJCXJlc291cmNlUmVzcEphdmFPYmplY3QKKwkJCQkJLnNldENyZWF0b3JGdWxsTmFtZShzZG5jVXNlckRldGFpbHMuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyBzZG5jVXNlckRldGFpbHMuZ2V0TGFzdE5hbWUoKSk7CisJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0CisJCQkJCS5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHNkbmNVc2VyRGV0YWlscy5nZXRGaXJzdE5hbWUoKSArICIgIiArIHNkbmNVc2VyRGV0YWlscy5nZXRMYXN0TmFtZSgpKTsKKworCQkJUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNwKHJlc291cmNlR2V0UmVzcG9uc2UsIHJlc291cmNlUmVzcEphdmFPYmplY3QpOworCisJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FbmQgY3JlYXRlCisJCQkvLyByZXNvdXJjZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCQkvLyBjbGVhbiBhdWRpdCBiZWZvcmUgYXV0aG9yaXphdGlvbiB0ZXN0CisJCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJCS8vIGRlQWN0aXZhdGUgY3JlYXRlZCB1c2VyCisJCQlSZXN0UmVzcG9uc2UgZGVBY3RpdmF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZGVBY3RpdmF0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJCXNkbmNVc2VyRGV0YWlscy5zZXRTdGF0dXMoVXNlclN0YXR1c0VudW0uSU5BQ1RJVkUpOworCQkJdmFsaWRhdGVTdWNjZXNzRGVBY3RpdmF0ZVVzZXJSZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGRlQWN0aXZhdGVVc2VyUmVzcG9uc2UpOworCisJCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRGVsZXRlVXNlckF1ZGl0TWVzc2FnZShzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsICIyMDAiLAorCQkJCQlVc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5TVUNDRVNTX01FU1NBR0UuZ2V0VmFsdWUoKSwKKwkJCQkJVXNlclZhbGlkYXRpb25VdGlscy5nZXRBZGRVc2VyQXVkaXRNZXNzYWdlKCJEZWxldGVVc2VyIikpOworCisJCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUubmFtZSgpKTsKKwkJCVJlc3RSZXNwb25zZSBnZXRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlQWN0aXZlIHVzZXIiLCBlcnJvckluZm8uZ2V0Q29kZSgpLAorCQkJCQlnZXRVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5VU0VSX0lOQUNUSVZFLm5hbWUoKSwgdmFyaWFibGVzLAorCQkJCQlnZXRVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJCS8vIGNoZWNraW5nIGlmIGNyZWF0ZWQgcmVzb3VyY2UgaXMgYWNjZXNzaWJsZQorCQkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCQlSZXN0UmVzcG9uc2UgZ2V0Q2F0YWxvZ0RhdGFSZXNwb25zZSA9IENhdGFsb2dSZXN0VXRpbHMuZ2V0Q2F0YWxvZyhzZG5jQWRtaW5Vc2VyLmdldFVzZXJJZCgpKTsKKworCQkJLy8gdmFsaWRhdGUgcmVzcG9uc2UKKworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVzZXIgbG9naW4iLCBnZXRDYXRhbG9nRGF0YVJlc3BvbnNlKTsKKwkJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVzZXIgbG9naW4iLAorCQkJCQlnZXRDYXRhbG9nRGF0YVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZUFjdGl2ZSB1c2VyIiwgMjAwLAorCQkJCQlnZXRDYXRhbG9nRGF0YVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCQkvLyBleHBlY3RlZCByZXNvdXJjZSBsaXN0CisJCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VFeHBlY3RlZFVuaXFJZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCXJlc291cmNlRXhwZWN0ZWRVbmlxSWRMaXN0LmFkZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCQlsb2dnZXIuZGVidWcoInJlc291cmNlRXhwZWN0ZWRVbmlxSWRMaXN0OiB7fSIsIHJlc291cmNlRXhwZWN0ZWRVbmlxSWRMaXN0KTsKKworCQkJY29tcGFyZVJlc291cmNlVW5pcUlkTGlzdChnZXRDYXRhbG9nRGF0YVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIHJlc291cmNlRXhwZWN0ZWRVbmlxSWRMaXN0LCB0cnVlKTsKKworCQl9IGZpbmFsbHkgeworCQkJLy8gcmVzb3VyY2VVdGlscy5kZWxldGVSZXNvdXJjZV9hbGxWZXJzaW9ucyhyZXNvdXJjZURldGFpbHMsCisJCQkvLyBzZG5jQWRtaW5Vc2VyKTsKKwkJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQl9CisKKwl9CisKKwkvLyB0ZXN0IGNoZWNrIHRoZSByZXNvdXJjZSBhY2Nlc3NpYmlsaXR5IHZpYSBjYXRhbG9nIHZpZXcsIHJlc291cmNlIHdhcworCS8vIGNyZWF0ZWQgYnkgdXNlciB3aGljaCB3YXMgZGVBY3RpdmF0ZWQKKworCUBUZXN0CisJcHVibGljIHZvaWQgcmVzb3VyY2VBY2Nlc3NpYmlsaXR5T25JbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IGdldERlZmF1bHRVc2VyRGV0YWlscygpOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkJCQlOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX1JPVVRFUlMsICJqaDAwMDMiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLmFkZENhdGVnb3J5Q2hhaW4oUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19EQVRBQkFTRS5nZXRDYXRlZ29yeSgpLAorCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfREFUQUJBU0UuZ2V0U3ViQ2F0ZWdvcnkoKSk7CisJCS8vIFN0cmluZyByZXNvdXJjZUJhc2VWZXJzaW9uID0gIjEuMCI7CisKKwkJdHJ5IHsKKwkJCS8vIERlbGV0ZSByZXNvdXJjZQorCQkJLy8gcmVzb3VyY2VVdGlscy5kZWxldGVSZXNvdXJjZV9hbGxWZXJzaW9ucyhyZXNvdXJjZURldGFpbHMsCisJCQkvLyBzZG5jQWRtaW5Vc2VyKTsKKwkJCVJlc3RSZXNwb25zZSBkZWxldGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImRlbGV0ZSB1c2VyIHJlcXVlc3QgZmFpbGVkIiwKKwkJCQkJZGVsZXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCB8fCBkZWxldGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gNDA0KTsKKwkJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKwkJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJCXZhbGlkYXRlU3VjY2Vzc0NyZWF0ZVVzZXJSZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisKKwkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVN0YXJ0IGltcG9ydAorCQkJLy8gcmVzb3VyY2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkJLy8gaW1wb3J0IG5ldyByZXNvdXJjZSB3aXRoIENFUlRJRklFRCBzdGF0ZQorCQkJVXNlciBpbXBvcnRlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTjQpOworCQkJUmVzdFJlc3BvbnNlIGltcG9ydFJlc3BvbnNlID0gSW1wb3J0UmVzdFV0aWxzLmltcG9ydFJlc291cmNlQnlOYW1lKHJlc291cmNlRGV0YWlscywgaW1wb3J0ZXIpOworCisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBpbXBvcnRSZXNwb25zZSk7CisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGltcG9ydFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgaW1wb3J0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUVuZCBpbXBvcnQKKwkJCS8vIHJlc291cmNlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJCS8vIGNsZWFuIGF1ZGl0IGJlZm9yZSBhdXRob3JpemF0aW9uIHRlc3QKKwkJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQkJLy8gZGVBY3RpdmF0ZSBjcmVhdGVkIHVzZXIKKwkJCVJlc3RSZXNwb25zZSBkZUFjdGl2YXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5kZUFjdGl2YXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQkJc2RuY1VzZXJEZXRhaWxzLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5JTkFDVElWRSk7CisJCQl2YWxpZGF0ZVN1Y2Nlc3NEZUFjdGl2YXRlVXNlclJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgZGVBY3RpdmF0ZVVzZXJSZXNwb25zZSk7CisKKwkJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVEZWxldGVVc2VyQXVkaXRNZXNzYWdlKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgIjIwMCIsCisJCQkJCVVzZXJSZXNwb25zZU1lc3NhZ2VFbnVtLlNVQ0NFU1NfTUVTU0FHRS5nZXRWYWx1ZSgpLAorCQkJCQlVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIkRlbGV0ZVVzZXIiKSk7CisKKwkJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCkpOworCQkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVBY3RpdmUgdXNlciIsIGVycm9ySW5mby5nZXRDb2RlKCksCisJCQkJCWdldFVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUubmFtZSgpLCB2YXJpYWJsZXMsCisJCQkJCWdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkJLy8gY2hlY2tpbmcgaWYgY3JlYXRlZCByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlCisJCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJCVJlc3RSZXNwb25zZSBnZXRDYXRhbG9nRGF0YVJlc3BvbnNlID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRDYXRhbG9nKHNkbmNBZG1pblVzZXIuZ2V0VXNlcklkKCkpOworCisJCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCisJCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXNlciBsb2dpbiIsIGdldENhdGFsb2dEYXRhUmVzcG9uc2UpOworCQkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXNlciBsb2dpbiIsCisJCQkJCWdldENhdGFsb2dEYXRhUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlQWN0aXZlIHVzZXIiLCAyMDAsCisJCQkJCWdldENhdGFsb2dEYXRhUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJCS8vIGV4cGVjdGVkIHJlc291cmNlIGxpc3QKKwkJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUV4cGVjdGVkVW5pcUlkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJcmVzb3VyY2VFeHBlY3RlZFVuaXFJZExpc3QuYWRkKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJCWxvZ2dlci5kZWJ1ZygicmVzb3VyY2VFeHBlY3RlZFVuaXFJZExpc3Q6IHt9IiwgcmVzb3VyY2VFeHBlY3RlZFVuaXFJZExpc3QpOworCisJCQljb21wYXJlUmVzb3VyY2VVbmlxSWRMaXN0KGdldENhdGFsb2dEYXRhUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgcmVzb3VyY2VFeHBlY3RlZFVuaXFJZExpc3QsIHRydWUpOworCisJCX0gZmluYWxseSB7CisJCQkvLyByZXNvdXJjZVV0aWxzLmRlbGV0ZVJlc291cmNlX2FsbFZlcnNpb25zKHJlc291cmNlRGV0YWlscywKKwkJCS8vIHNkbmNBZG1pblVzZXIpOworCQkJVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCX0KKworCX0KKworCS8vIHRlc3QgY2hlY2sgdGhlIHNlcnZpY2UgYWNjZXNzaWJpbGl0eSB2aWEgY2F0YWxvZyB2aWV3LCBzZXJ2aWNlIHdhcworCS8vIGNyZWF0ZWQgYnkgdXNlciB3aGljaCB3YXMgZGVBY3RpdmF0ZWQKKworCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgc2VydmljZUFjY2Vzc2liaWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9ueworCS8vCisJLy8gVXNlciBzZG5jVXNlckRldGFpbHMgPSBnZXREZWZhdWx0VXNlckRldGFpbHMoKTsKKwkvLy8vIGZpbGwgbmV3IHNlcnZpY2UgZGV0YWlscworCS8vIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkvLyBTdHJpbmcgc2VydmljZUJhc2VWZXJzaW9uID0gIjAuMSI7CisJLy8KKwkvLyB0cnl7CisJLy8gLy9EZWxldGUgc2VydmljZQorCS8vLy8gU2VydmljZVJlc3RVdGlscy5kZWxldGVTZXJ2aWNlX2FsbFZlcnNpb25zKHNlcnZpY2VEZXRhaWxzLAorCS8vIHNkbmNBZG1pblVzZXIpOworCS8vIFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCS8vCisJLy8gRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCS8vIFJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPQorCS8vIFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCS8vIHZhbGlkYXRlU3VjY2Vzc0NyZWF0ZVVzZXJSZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJLy8KKwkvLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVN0YXJ0IGNyZWF0ZQorCS8vIHNlcnZpY2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0KKwkvLyBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJLy8KKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZSk7CisJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgMjAxLAorCS8vIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkvLworCS8vLy8gdmFsaWRhdGUgY3JlYXRlIHNlcnZpY2UgcmVzcG9uc2UgdnMgYWN0dWFsCisJLy8KKwkvLyBTZXJ2aWNlIHNlcnZpY2UgPQorCS8vIFNlcnZpY2VSZXN0VXRpbHMuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJLy8gVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLHNlcnZpY2Usc2RuY1VzZXJEZXRhaWxzLAorCS8vIChMaWZlY3ljbGVTdGF0ZUVudW0pbnVsbCk7CisJLy8KKwkvLy8vIHZhbGlkYXRlIGdldCBzZXJ2aWNlIHJlc3BvbnNlIHZzIGFjdHVhbAorCS8vIHJlc3RSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCS8vIHNkbmNVc2VyRGV0YWlscyk7CisJLy8gc2VydmljZSA9CisJLy8gU2VydmljZVJlc3RVdGlscy5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkvLyBVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoc2VydmljZURldGFpbHMsc2VydmljZSxzZG5jVXNlckRldGFpbHMsCisJLy8gKExpZmVjeWNsZVN0YXRlRW51bSludWxsKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgYXVkaXQKKwkvLworCS8vIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJLy8gU2VydmljZVJlc3RVdGlscy5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZURldGFpbHMsCisJLy8gc2VydmljZUJhc2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMpOworCS8vCisJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uPSJDcmVhdGUiOworCS8vIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkvLyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAxIik7CisJLy8gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCS8vCisJLy8gQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBdWRpdChleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCS8vIGF1ZGl0QWN0aW9uLCBudWxsLCBmYWxzZSk7CisJLy8KKwkvLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUVuZCBjcmVhdGUKKwkvLyBzZXJ2aWNlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwkvLy8vIGNsZWFuIGF1ZGl0IGJlZm9yZSBhdXRob3JpemF0aW9uIHRlc3QKKwkvLyBEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJLy8KKwkvLy8vIGRlQWN0aXZhdGUgY3JlYXRlZCB1c2VyCisJLy8gUmVzdFJlc3BvbnNlIGRlQWN0aXZhdGVVc2VyUmVzcG9uc2UgPQorCS8vIFVzZXJSZXN0VXRpbHMuZGVBY3RpdmF0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLHNkbmNBZG1pblVzZXIpOworCS8vIHNkbmNVc2VyRGV0YWlscy5zZXRTdGF0dXMoVXNlclN0YXR1c0VudW0uSU5BQ1RJVkUpOworCS8vIHZhbGlkYXRlU3VjY2Vzc0RlQWN0aXZhdGVVc2VyUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLAorCS8vIGRlQWN0aXZhdGVVc2VyUmVzcG9uc2UpOworCS8vCisJLy8gVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZURlbGV0ZVVzZXJBdWRpdE1lc3NhZ2Uoc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNkbmNBZG1pblVzZXIsICIyMDAiLCBVc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5TVUNDRVNTX01FU1NBR0UuZ2V0VmFsdWUoKSwKKwkvLyBVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIkRlbGV0ZVVzZXIiKSk7CisJLy8KKwkvLyBFcnJvckluZm8gZXJyb3JJbmZvID0KKwkvLyBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCkpOworCS8vIFJlc3RSZXNwb25zZSBnZXRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoc2RuY1VzZXJEZXRhaWxzLAorCS8vIHNkbmNBZG1pblVzZXIpOworCS8vCisJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlQWN0aXZlIHVzZXIiLAorCS8vIGVycm9ySW5mby5nZXRDb2RlKCksIGdldFVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJLy8KKwkvLyBMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCS8vIEVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5uYW1lKCksCisJLy8gdmFyaWFibGVzLCBnZXRVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJLy8KKwkvLyAvL2NoZWNraW5nIGlmIGNyZWF0ZWQgc2VydmljZSBpcyBhY2Nlc3NpYmxlCisJLy8gRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCS8vCisJLy8gUmVzdFJlc3BvbnNlIGdldENhdGFsb2dEYXRhUmVzcG9uc2UgPQorCS8vIENhdGFsb2dSZXN0VXRpbHMuZ2V0Q2F0YWxvZyhzZG5jQWRtaW5Vc2VyLmdldFVzZXJJZCgpKTsKKwkvLworCS8vIC8vdmFsaWRhdGUgcmVzcG9uc2UKKwkvLworCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1c2VyIGxvZ2luIiwKKwkvLyBnZXRDYXRhbG9nRGF0YVJlc3BvbnNlKTsKKwkvLyBhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1c2VyIGxvZ2luIiwKKwkvLyBnZXRDYXRhbG9nRGF0YVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVBY3RpdmUgdXNlciIsIDIwMCwKKwkvLyBnZXRDYXRhbG9nRGF0YVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCS8vCisJLy8vLyBleHBlY3RlZCBzZXJ2aWNlIGxpc3QKKwkvLyBMaXN0PFN0cmluZz4gc2VydmljZUV4cGVjdGVkVW5pcUlkTGlzdD0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJLy8gc2VydmljZUV4cGVjdGVkVW5pcUlkTGlzdC5hZGQoc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJLy8gbG9nZ2VyLmRlYnVnKCJzZXJ2aWNlRXhwZWN0ZWRVbmlxSWRMaXN0OiB7fSIsIHNlcnZpY2VFeHBlY3RlZFVuaXFJZExpc3QpOworCS8vCisJLy8gY29tcGFyZVNlcnZpY2VVbmlxSWRMaXN0KGdldENhdGFsb2dEYXRhUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkvLyBzZXJ2aWNlRXhwZWN0ZWRVbmlxSWRMaXN0LCB0cnVlKTsKKwkvLworCS8vCisJLy8gfWZpbmFsbHl7CisJLy8vLyBTZXJ2aWNlUmVzdFV0aWxzLmRlbGV0ZVNlcnZpY2VfYWxsVmVyc2lvbnMoc2VydmljZURldGFpbHMsCisJLy8gc2RuY0FkbWluVXNlcik7CisJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJLy8gfQorCS8vCisJLy8gfQorCisJcHVibGljIHZvaWQgY29tcGFyZVNlcnZpY2VVbmlxSWRMaXN0KFN0cmluZyByZXNwb25zZSwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGlzdCwgYm9vbGVhbiBmbGFnKSB7CisKKwkJSnNvbkVsZW1lbnQgamVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKHJlc3BvbnNlKTsKKwkJSnNvbk9iamVjdCBqb2JqZWN0ID0gamVsZW1lbnQuZ2V0QXNKc29uT2JqZWN0KCk7CisJCUpzb25BcnJheSBzZXJ2aWNlQXJyYXkgPSAoSnNvbkFycmF5KSBqb2JqZWN0LmdldCgic2VydmljZXMiKTsKKwkJbG9nZ2VyLmRlYnVnKCJ7fSIsIHNlcnZpY2VBcnJheSk7CisJCWFzc2VydFRydWUoImV4cGVjdGVkIHNlcnZpY2UgY291bnQ6ICIgKyBleHBlY3RlZExpc3Quc2l6ZSgpICsgIiBvciBtb3JlIiArICIsIGFjdHVhbDogIiArIHNlcnZpY2VBcnJheS5zaXplKCksCisJCQkJc2VydmljZUFycmF5LnNpemUoKSA+PSBleHBlY3RlZExpc3Quc2l6ZSgpKTsKKworCQkvLyBidWlsZCBzZXJ2aWNlIGxpc3QgZnJvbSByZXNwb25zZQorCQlMaXN0PFNlcnZpY2VSZXFEZXRhaWxzPiBzZXJ2aWNlUmVxRGV0YWlsc0xpc3RPblJlc3BvbnNlID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlUmVxRGV0YWlscz4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlQXJyYXkuc2l6ZSgpOyBpKyspIHsKKwkJCVNlcnZpY2VSZXFEZXRhaWxzIGpzb24gPSBnc29uLmZyb21Kc29uKHNlcnZpY2VBcnJheS5nZXQoaSksIFNlcnZpY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJCXNlcnZpY2VSZXFEZXRhaWxzTGlzdE9uUmVzcG9uc2UuYWRkKGpzb24pOworCQl9CisJfQorCisJcHVibGljIHZvaWQgY29tcGFyZVJlc291cmNlVW5pcUlkTGlzdChTdHJpbmcgcmVzcG9uc2UsIExpc3Q8U3RyaW5nPiBleHBlY3RlZExpc3QsIGJvb2xlYW4gZmxhZykgeworCisJCUpzb25FbGVtZW50IGplbGVtZW50ID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShyZXNwb25zZSk7CisJCUpzb25PYmplY3Qgam9iamVjdCA9IGplbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQlKc29uQXJyYXkgcmVzb3VyY2VBcnJheSA9IChKc29uQXJyYXkpIGpvYmplY3QuZ2V0KCJyZXNvdXJjZXMiKTsKKwkJbG9nZ2VyLmRlYnVnKCJ7fSIsIHJlc291cmNlQXJyYXkpOworCQlhc3NlcnRUcnVlKCJleHBlY3RlZCByZXNvdXJjZSBjb3VudDogIiArIGV4cGVjdGVkTGlzdC5zaXplKCkgKyAiIG9yIG1vcmUiICsgIiwgYWN0dWFsOiAiICsgcmVzb3VyY2VBcnJheS5zaXplKCksCisJCQkJcmVzb3VyY2VBcnJheS5zaXplKCkgPj0gZXhwZWN0ZWRMaXN0LnNpemUoKSk7CisKKwkJLy8gYnVpbGQgcmVzb3VyY2UgbGlzdCBmcm9tIHJlc3BvbnNlCisJCUxpc3Q8UmVzb3VyY2VSZXFEZXRhaWxzPiByZXNvdXJjZVJlcURldGFpbHNMaXN0T25SZXNwb25zZSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VSZXFEZXRhaWxzPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlQXJyYXkuc2l6ZSgpOyBpKyspIHsKKwkJCVJlc291cmNlUmVxRGV0YWlscyBqc29uID0gZ3Nvbi5mcm9tSnNvbihyZXNvdXJjZUFycmF5LmdldChpKSwgUmVzb3VyY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJCXJlc291cmNlUmVxRGV0YWlsc0xpc3RPblJlc3BvbnNlLmFkZChqc29uKTsKKwkJfQorCisJCWxvZ2dlci5kZWJ1ZygiUmVzb3VyY2VSZXFEZXRhaWxzIGxpc3Qgb24gcmVzcG9uc2U6IHt9IiwgcmVzb3VyY2VSZXFEZXRhaWxzTGlzdE9uUmVzcG9uc2UpOworCisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUFjdHVhbFVuaXFJZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yIChSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UgOiByZXNvdXJjZVJlcURldGFpbHNMaXN0T25SZXNwb25zZSkgeworCQkJcmVzb3VyY2VBY3R1YWxVbmlxSWRMaXN0LmFkZChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlsb2dnZXIuZGVidWcoInJlc291cmNlQWN0dWFsVW5pcUlkTGlzdCBvbiByZXNwb25zZToge30iLCByZXNvdXJjZUFjdHVhbFVuaXFJZExpc3QpOworCQlsb2dnZXIuZGVidWcoInJlc291cmNlRXhwZWN0ZWRVbmlxSWRMaXN0IG9uIHJlc3BvbnNlOiB7fSIsIGV4cGVjdGVkTGlzdCk7CisKKwkJaWYgKGZsYWcpIHsKKwkJCWFzc2VydFRydWUoImFjdHVhbCBsaXN0IGRvZXMgbm90IGNvbnRhaW4gZXhwZWN0ZWQgbGlzdCIsCisJCQkJCXJlc291cmNlQWN0dWFsVW5pcUlkTGlzdC5jb250YWluc0FsbChleHBlY3RlZExpc3QpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEZhbHNlKCJhY3R1YWwgbGlzdCBjb250YWlucyBub24gZXhwZWN0ZWQgbGlzdCBlbGVtZW50cyIsCisJCQkJCXJlc291cmNlQWN0dWFsVW5pcUlkTGlzdC5jb250YWluc0FsbChleHBlY3RlZExpc3QpKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvdXNlci9DcmVhdGVVc2VyQXBpVGVzdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvdXNlci9DcmVhdGVVc2VyQXBpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODQ5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS91c2VyL0NyZWF0ZVVzZXJBcGlUZXN0LmphdmEKQEAgLTAsMCArMSwxNDUxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRVc2VyQ1JVREF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51c2Vycy5Vc2VyUmVzcG9uc2VNZXNzYWdlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Vc2VyUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLlVzZXJWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENyZWF0ZVVzZXJBcGlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluVXNlcjsKKwlwcm90ZWN0ZWQgVXNlciBzZG5jRGVzaWduZXJVc2VyOworCXByb3RlY3RlZCBVc2VyIHNkbmNHb3Zlcm5vclVzZXI7CisJcHJvdGVjdGVkIFVzZXIgc2RuY1Rlc3RlclVzZXI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9TVUNDRVNTID0gMjAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCA9IDIwMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURV9HRVQgPSAyMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfSU5WQUxJRF9DT05URU5UID0gNDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX01JU1NJTkdfREFUQSA9IDQwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9NSVNTSU5HX0lORk9STUFUSU9OID0gNDAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1JFU1RSSUNURURfQUNDRVNTID0gNDAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX05PVF9GT1VORCA9IDQwNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiA9IDQwOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX0FMUkVBRFlfRVhJU1QgPSA0MDk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9ST0xFID0gNDAwOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBDcmVhdGVVc2VyQXBpVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgQ3JlYXRlVXNlckFwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJc2RuY0FkbWluVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCXNkbmNEZXNpZ25lclVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQlzZG5jR292ZXJub3JVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkdPVkVSTk9SKTsKKwkJc2RuY1Rlc3RlclVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKworCX0KKworCS8vIFN0b3J5IDogUkVTVCBBUEkgdG8gcHJvdmlzaW9uIG5ldyB1c2VyIChQT1NUKSAtIFVTNDI5Mzc5CisJLy8gbXVzdCBwYXJhbWV0ZXJzOiBVc2VySWQgYW5kIEVtYWlsCisKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqMjAxKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gY3JlYXRlIHVzZXIgd2l0aCBmdWxsIHBhcmFtZXRlciBzZXQoVXNlcklELCBGaXJzdCBOYW1lLCBMYXN0IE5hbWUsIEVtYWlsLAorCS8vIFJvbGUgPSAiREVTSUdORVIiLCBDcmVhdG9yIGRldGFpbHMpCisJLy8gZXhwZWN0ZWQgMjAxIENyZWF0ZWQKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyB1c2VyIGluaXRpYWxpemF0aW9uCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImttMjAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIktvdCI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiTWF0cm9za2luIjsKKwkJU3RyaW5nIGVtYWlsID0gImttMjAwMEBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJBRE1JTiI7CisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVN0cmluZyBhZGRVc2VyID0gIkFkZFVzZXIiOworCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLAorCQkJCWNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwKKwkJCQljcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlFeHBlY3RlZFVzZXJDUlVEQXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihhZGRVc2VyLAorCQkJCXNkbmNBZG1pblVzZXIsIEFjdGlvblN0YXR1cy5DUkVBVEVELCBzZG5jVXNlckRldGFpbHMsIG51bGwpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdChjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24sIGFkZFVzZXIpOworCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBnZXRVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1VTRVIgPSAiQWRkVXNlciI7CisKKwlwcml2YXRlIFVzZXIgbWVjaElkVXNlciA9IG5ldyBVc2VyKCk7CisJcHJpdmF0ZSBVc2VyIGVtcHR5VXNlciA9IG5ldyBVc2VyKCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXNlciBhZG1pblVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCisJQEFmdGVyTWV0aG9kCisJcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlVc2VyUmVzdFV0aWxzLmRlYWN0aXZhdGVVc2VyKG1lY2hJZFVzZXIsIGFkbWluVXNlcik7CisJfQorCisJLy8gY3JlYXRlIGRlZmF1bHQgdXNlcihVc2VySUQsIEVtYWlsLCBDcmVhdG9yIGRldGFpbHMpCisJLy8gZXhwZWN0ZWQ6IHJvbGUgPSBERVNJR05FUiwgZmlyc3QgYW5kIGxhc3QgbmFtZSA9IG51bGwsIDIwMSBDcmVhdGVkCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0VXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB1c2VyIGluaXRpYWxpemF0aW9uCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImttMjAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gbnVsbDsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9IG51bGw7CisJCVN0cmluZyBlbWFpbCA9IG51bGw7CisJCVN0cmluZyByb2xlID0gbnVsbDsKKwkJVXNlciBzZG5jVXNlckRldGFpbHMgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKworCQlkZWxldGVVc2VyQW5kQXVkaXQoc2RuY1VzZXJEZXRhaWxzKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2Uoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCAiMjAxIiwKKwkJCQlVc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5TVUNDRVNTX01FU1NBR0UuZ2V0VmFsdWUoKSwKKwkJCQlVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIkFkZFVzZXIiKSk7CisJCVJlc3RSZXNwb25zZSBnZXRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCX0KKworCS8vIGNyZWF0ZSB1c2VyIHdpdGggb25lIG9wdGlvbmFsIHBhcmFtZXRlciBmaXJzdCBuYW1lIChVc2VySUQsIEVtYWlsLCBGaXJzdAorCS8vIE5hbWUsIENyZWF0b3IgZGV0YWlscykKKwkvLyBleHBlY3RlZDogcm9sZSA9IERFU0lHTkVSLCBsYXN0IG5hbWUgPSBudWxsLCAyMDEgQ3JlYXRlZAorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlVXNlckZpcnN0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB1c2VyIGluaXRpYWxpemF0aW9uCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImttMjAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIktvdCI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSBudWxsOworCQlTdHJpbmcgZW1haWwgPSBudWxsOworCQlTdHJpbmcgcm9sZSA9IG51bGw7CisJCVVzZXIgc2RuY1VzZXJEZXRhaWxzID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisKKwkJZGVsZXRlVXNlckFuZEF1ZGl0KHNkbmNVc2VyRGV0YWlscyk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBZGRVc2VyQXVkaXRNZXNzYWdlKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgIjIwMSIsCisJCQkJVXNlclJlc3BvbnNlTWVzc2FnZUVudW0uU1VDQ0VTU19NRVNTQUdFLmdldFZhbHVlKCksCisJCQkJVXNlclZhbGlkYXRpb25VdGlscy5nZXRBZGRVc2VyQXVkaXRNZXNzYWdlKCJBZGRVc2VyIikpOworCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2Uoc2RuY1VzZXJEZXRhaWxzLCBnZXRVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVEZWxldGVPcHNVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAib28yMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAib3BzIjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJvcHNMYXN0IjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wc0BpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJPUFMiOworCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCisJCWRlbGV0ZVVzZXJBbmRBdWRpdChzZG5jVXNlckRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCAyMDEsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQWRkVXNlckF1ZGl0TWVzc2FnZShzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsICIyMDEiLAorCQkJCVVzZXJSZXNwb25zZU1lc3NhZ2VFbnVtLlNVQ0NFU1NfTUVTU0FHRS5nZXRWYWx1ZSgpLAorCQkJCVVzZXJWYWxpZGF0aW9uVXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKHNkbmNVc2VyRGV0YWlscywgZ2V0VXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlSZXN0UmVzcG9uc2UgZ2V0RGVsZXRlZFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRlIHVzZXIiLCA0MDQsIGdldERlbGV0ZWRVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZURlbGV0ZUdPVkVSTk9SVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImdnMjAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gImdvdiI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiZ292TGFzdCI7CisJCVN0cmluZyBlbWFpbCA9ICJnb3ZAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiR09WRVJOT1IiOworCQlVc2VyIHNkbmNVc2VyRGV0YWlscyA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCisJCWRlbGV0ZVVzZXJBbmRBdWRpdChzZG5jVXNlckRldGFpbHMpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2Uoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCAiMjAxIiwKKwkJCQlVc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5TVUNDRVNTX01FU1NBR0UuZ2V0VmFsdWUoKSwKKwkJCQlVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIkFkZFVzZXIiKSk7CisJCVJlc3RSZXNwb25zZSBnZXRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShzZG5jVXNlckRldGFpbHMsIGdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJUmVzdFJlc3BvbnNlIGdldERlbGV0ZWRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlbGV0ZSB1c2VyIiwgNDA0LCBnZXREZWxldGVkVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQmVubnkKKwkvLyBBZG1pbiBDcmVhdGUgT1BTIHVzZXIKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZU9wc1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImFhMTAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIkJlbm55IjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJUYWwiOworCQlTdHJpbmcgZW1haWwgPSAib3B0QmVubnlAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiT1BTIjsKKwkJVXNlciBleHBlY3RlZE9wc1VzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKwkJZGVsZXRlVXNlckFuZEF1ZGl0KGV4cGVjdGVkT3BzVXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZXhwZWN0ZWRPcHNVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCAyMDEsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShleHBlY3RlZE9wc1VzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJZGVsZXRlQW5kQ2hlY2tVc2VyUmVzcG9uc2UoZXhwZWN0ZWRPcHNVc2VyLCAyMDApOworCisJfQorCisJLy8gQWRtaW4gQ3JlYXRlIEdPVkVSTk9SIHVzZXIKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZUdvdmVybm9yVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAiYWExMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiQmVubnkiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIlRhbCI7CisJCVN0cmluZyBlbWFpbCA9ICJvcHRCZW5ueUBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJHT1ZFUk5PUiI7CisJCVVzZXIgZXhwZWN0ZWRVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCWRlbGV0ZVVzZXJBbmRBdWRpdChleHBlY3RlZFVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCVJlc3RSZXNwb25zZSBnZXRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoZXhwZWN0ZWRVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShleHBlY3RlZFVzZXIsIGdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGV4cGVjdGVkVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyB1c2VyIiwgZGVsZXRlT3BzVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyB1c2VyIiwgMjAwLCBkZWxldGVPcHNVc2VyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQWRtaW4gVXBkYXRlIHVzZXIgcm9sZSBmcm9tIE9QUyB0byBHT1ZFUk5PUgorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlT3BzVXNlclJvbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImFiMTAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIkJlbm55IjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJUYWwiOworCQlTdHJpbmcgZW1haWwgPSAib3B0QmVubnlAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiT1BTIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIkdPVkVSTk9SIjsKKwkJVXNlciBvcHNVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgZ292ZXJuZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgdXBkYXRlZFJvbGUsIG51bGwpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCS8vIFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihVc2VyVXBkYXRlUm9sZSwgc2RuY0FkbWluVXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2Uob3BzVXNlciwgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIG9wc1VzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCVVzZXIgbmV3Um9sZVVzZXIgPSBuZXcgVXNlcigpOworCQluZXdSb2xlVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJLy8gdXBkYXRlIHVzZXIgcm9sZSBmcm9tIE9QUyB0byBHT1ZFUk5PUgorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJb3BzVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCAyMDAsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFVwZGF0ZWRSb2xlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGdvdmVybmVyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZ292ZXJuZXJVc2VyLCBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIDIwMCwgZGVsZXRlT3BzVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCS8vIERlc2lnbmVyIENyZWF0ZSBPUFMgdXNlciAtNDA5IFJlc3BvbnNlIFJlc3RyaWN0ZWQgb3BlcmF0aW9uCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVPcHNVc2VyQnlEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAiYWExMTIyIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiQmVubnkiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIlRhbCI7CisJCVN0cmluZyBlbWFpbCA9ICJvcHRCZW5ueUBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJPUFMiOworCQlVc2VyIGV4cGVjdGVkT3BzVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlkZWxldGVVc2VyQW5kQXVkaXQoZXhwZWN0ZWRPcHNVc2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihleHBlY3RlZE9wc1VzZXIsIHNkbmNEZXNpZ25lclVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDQwOSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCAiQ29uZmxpY3QiLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCX0KKworCS8vIFRlc3RlciBDcmVhdGUgT1BTIHVzZXIgLTQwOSBSZXNwb25zZSBSZXN0cmljdGVkIG9wZXJhdGlvbgorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlT3BzVXNlckJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhYTExMjIiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIk9QUyI7CisJCVVzZXIgZXhwZWN0ZWRPcHNVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCWRlbGV0ZVVzZXJBbmRBdWRpdChleHBlY3RlZE9wc1VzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkT3BzVXNlciwgc2RuY1Rlc3RlclVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDQwOSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCAiQ29uZmxpY3QiLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCX0KKworCS8vIERlc2lnbmVyIFRyeSBVcGRhdGUgT1BTIHVzZXIgcm9sZSB0byBHT1ZFUk5PUiAtIFJlc3BvbnNlIDQwOQorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlT3BzVXNlclJvbGVieURlc2lnbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJidDc1MWUiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIk9QUyI7CisJCVN0cmluZyB1cGRhdGVkUm9sZSA9ICJHT1ZFUk5PUiI7CisJCVVzZXIgb3BzVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlVc2VyIGdvdmVybmVyVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gQWRtaW4gY3JlYXRlIHVzZXIgd2l0aCBPUFMgcm9sZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKG9wc1VzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyBEZXNpZ25lciB1c2VyIHRyeSB0byB1cGRhdGUgdXNlciByb2xlIGZyb20gT1BTIHRvIEdPVkVSTk9SCisJCVJlc3RSZXNwb25zZSB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlID0gVXNlclJlc3RVdGlscy51cGRhdGVVc2VyUm9sZShuZXdSb2xlVXNlciwgc2RuY0Rlc2lnbmVyVXNlciwKKwkJCQlvcHNVc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIDQwOSwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCAiQ29uZmxpY3QiLAorCQkJCXVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQkvLyBEZWxldGUgT1BTIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZU9wc1VzZXIgPSBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyAgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgIHVzZXIiLCAyMDAsIGRlbGV0ZU9wc1VzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwkvLyBUZXN0ZXIgVHJ5IFVwZGF0ZSBPUFMgdXNlciByb2xlIHRvIEdPVkVSTk9SIC0gUmVzcG9uc2UgNDA5CisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVPcHNVc2VyUm9sZWJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJidDc1MXciOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIk9QUyI7CisJCVN0cmluZyB1cGRhdGVkUm9sZSA9ICJHT1ZFUk5PUiI7CisJCVVzZXIgb3BzVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlVc2VyIGdvdmVybmVyVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gQWRtaW4gY3JlYXRlIHVzZXIgd2l0aCBPUFMgcm9sZQorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKG9wc1VzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyBEZXNpZ25lciB1c2VyIHRyeSB0byB1cGRhdGUgdXNlciByb2xlIGZyb20gT1BTIHRvIEdPVkVSTk9SCisJCVJlc3RSZXNwb25zZSB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlID0gVXNlclJlc3RVdGlscy51cGRhdGVVc2VyUm9sZShuZXdSb2xlVXNlciwgc2RuY1Rlc3RlclVzZXIsCisJCQkJb3BzVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCA0MDksIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgIkNvbmZsaWN0IiwKKwkJCQl1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIDIwMCwgZGVsZXRlT3BzVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCS8vIEFkbWluIFVwZGF0ZSB1c2VyIHJvbGUgZnJvbSBPUFMgdG8gRGVzaWduZXIKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZU9wc1VzZXJSb2xlRnJvbU9wc1RvRGVzaWduZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImFiMTAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIkJlbm55IjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJUYWwiOworCQlTdHJpbmcgZW1haWwgPSAib3B0QmVubnlAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiT1BTIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIkRFU0lHTkVSIjsKKwkJVXNlciBvcHNVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgZGVzaWduZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgdXBkYXRlZFJvbGUsIG51bGwpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCS8vIFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihVc2VyVXBkYXRlUm9sZSwgc2RuY0FkbWluVXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2Uob3BzVXNlciwgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIG9wc1VzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCVVzZXIgbmV3Um9sZVVzZXIgPSBuZXcgVXNlcigpOworCQluZXdSb2xlVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJLy8gdXBkYXRlIHVzZXIgcm9sZSBmcm9tIE9QUyB0byBHT1ZFUk5PUgorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJb3BzVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCAyMDAsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFVwZGF0ZWRSb2xlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGRlc2lnbmVyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZGVzaWduZXJVc2VyLCBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIDIwMCwgZGVsZXRlT3BzVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCS8vIEFkbWluIFVwZGF0ZSB1c2VyIHJvbGUgZnJvbSBPUFMgdG8gVEVTVEVSCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVPcHNVc2VyUm9sZUZyb21PcHNUb1Rlc3RlcigpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAiYWMxMDAxIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiQmVubnkiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIlRhbCI7CisJCVN0cmluZyBlbWFpbCA9ICJvcHRCZW5ueUBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJPUFMiOworCQlTdHJpbmcgdXBkYXRlZFJvbGUgPSAiVEVTVEVSIjsKKwkJVXNlciBvcHNVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgdGVzdGVyVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoVXNlclVwZGF0ZVJvbGUsIHNkbmNBZG1pblVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKG9wc1VzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBvcHNVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQlVc2VyIG5ld1JvbGVVc2VyID0gbmV3IFVzZXIoKTsKKwkJbmV3Um9sZVVzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCS8vIHVwZGF0ZSB1c2VyIHJvbGUgZnJvbSBPUFMgdG8gR09WRVJOT1IKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLnVwZGF0ZVVzZXJSb2xlKG5ld1JvbGVVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCW9wc1VzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgMjAwLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcih0ZXN0ZXJVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZSh0ZXN0ZXJVc2VyLCBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIDIwMCwgZGVsZXRlT3BzVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCS8vIFRlc3RlciB0cnkgdG8gVXBkYXRlIHVzZXIgcm9sZSBmcm9tIE9QUyB0byBHT1ZFUk5PUiAtIFJlc3BvbnNlIDQwOQorCS8vIENvbmZsaWN0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVPcHNVc2VyUm9sZUJ5VGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhZDEwMDEiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIk9QUyI7CisJCVN0cmluZyB1cGRhdGVkUm9sZSA9ICJHT1ZFUk5PUiI7CisJCVVzZXIgb3BzVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlVc2VyIGdvdmVybmVyVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoVXNlclVwZGF0ZVJvbGUsIHNkbmNBZG1pblVzZXIpOworCQkvLyBDcmVhdGUgdXNlciBieSBBZG1pbgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKG9wc1VzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyB1cGRhdGUgdXNlciByb2xlIGZyb20gT1BTIHRvIEdPVkVSTk9SIGJ5IFRlc3RlcgorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNUZXN0ZXJVc2VyLAorCQkJCW9wc1VzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgNDA5LCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsICJDb25mbGljdCIsCisJCQkJdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7CisKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIDIwMCwgZGVsZXRlT3BzVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCS8vIERlc2lnbmVyIHRyeSB0byBVcGRhdGUgdXNlciByb2xlIGZyb20gT1BTIHRvIEdPVkVSTk9SIC0gUmVzcG9uc2UgNDA5CisJLy8gQ29uZmxpY3QKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZU9wc1VzZXJSb2xlQnlEZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAiYWQxMDAxIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiQmVubnkiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIlRhbCI7CisJCVN0cmluZyBlbWFpbCA9ICJvcHRCZW5ueUBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJPUFMiOworCQlTdHJpbmcgdXBkYXRlZFJvbGUgPSAiR09WRVJOT1IiOworCQlVc2VyIG9wc1VzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKwkJLy8gVXNlciBnb3Zlcm5lclVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLAorCQkvLyB1c2VyTGFzdE5hbWUsaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoVXNlclVwZGF0ZVJvbGUsIHNkbmNBZG1pblVzZXIpOworCQkvLyBDcmVhdGUgdXNlciBieSBBZG1pbgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKG9wc1VzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyB1cGRhdGUgdXNlciByb2xlIGZyb20gT1BTIHRvIEdPVkVSTk9SIGJ5IFRlc3RlcgorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNEZXNpZ25lclVzZXIsCisJCQkJb3BzVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCA0MDksIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgIkNvbmZsaWN0IiwKKwkJCQl1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQkvLyBEZWxldGUgT1BTIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZU9wc1VzZXIgPSBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyB1c2VyIiwgZGVsZXRlT3BzVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyB1c2VyIiwgMjAwLCBkZWxldGVPcHNVc2VyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQWRtaW4gQ3JlYXRlIE9QUyB1c2VyIC0gdXNlciBhbHJlYWR5IGV4aXN0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVPcHNVc2VyQWxyZWFkeUV4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhZjEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIk9QUyI7CisJCVVzZXIgZXhwZWN0ZWRPcHNVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCWRlbGV0ZVVzZXJBbmRBdWRpdChleHBlY3RlZE9wc1VzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkT3BzVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRPcHNVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIENyZWF0ZSB1c2VyIHRoYXQgYWxyZWFkeSBleGlzdHMKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJBZ2FpblJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkT3BzVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJBZ2FpblJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyQWdhaW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDQwOSwgY3JlYXRlVXNlckFnYWluUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIERlbGV0ZSBPUFMgdXNlcgorCQlSZXN0UmVzcG9uc2UgZGVsZXRlT3BzVXNlciA9IFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihleHBlY3RlZE9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgIHVzZXIiLCAyMDAsIGRlbGV0ZU9wc1VzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwkvLyBBZG1pbiBVcGRhdGUgdXNlciByb2xlIGZyb20gT1BTIHRvIEdPVkVSTk9SIC0gdXNlciBhbHJlYWR5IGhhcyBHT1ZFUk5PUgorCS8vIHJvbGUKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVJvbGVUb1NhbWVSb2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhZzEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIkdPVkVSTk9SIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIkdPVkVSTk9SIjsKKwkJVXNlciBvcHNVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgZ292ZXJuZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgdXBkYXRlZFJvbGUsIG51bGwpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKG9wc1VzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gb3BzVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyB1cGRhdGUgdXNlciByb2xlIGZyb20gR09WRVJOT1IgdG8gR09WRVJOT1IKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLnVwZGF0ZVVzZXJSb2xlKG5ld1JvbGVVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCW9wc1VzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgMjAwLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihnb3Zlcm5lclVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGdvdmVybmVyVXNlciwgZ2V0VXBkYXRlZFJvbGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIERlbGV0ZSBPUFMgdXNlcgorCQlSZXN0UmVzcG9uc2UgZGVsZXRlT3BzVXNlciA9IFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihvcHNVc2VyLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGRlbGV0aW5nIHVzZXIiLCBkZWxldGVPcHNVc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlbGV0aW5nIHVzZXIiLCAyMDAsIGRlbGV0ZU9wc1VzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwkvLyBBZG1pbiBVcGRhdGUgdXNlciByb2xlIGZyb20gVGVzdGVyIHRvIEdPVkVSTk9SIC0gMjAwIHJlc3BvbnNlCisKKwkvLyBBZG1pbiBVcGRhdGUgdXNlciByb2xlIGZyb20gRGVzaWduZXIgdG8gR09WRVJOT1IgLSAyMDAgcmVzcG9uc2UKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVVzZXJSb2xlRGVzaWduZXJUb0dvdmVybm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAiYWgxMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiQmVubnkiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIlRhbCI7CisJCVN0cmluZyBlbWFpbCA9ICJvcHRCZW5ueUBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJERVNJR05FUiI7CisJCVN0cmluZyB1cGRhdGVkUm9sZSA9ICJHT1ZFUk5PUiI7CisJCVVzZXIgZGVzaWduZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgZ292ZXJuZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgdXBkYXRlZFJvbGUsIG51bGwpOworCQkvLyBjcmVhdGUgdXNlcgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGRlc2lnbmVyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZGVzaWduZXJVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIG9wc1VzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCVVzZXIgbmV3Um9sZVVzZXIgPSBuZXcgVXNlcigpOworCQluZXdSb2xlVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJLy8gdXBkYXRlIHVzZXIgcm9sZSBmcm9tIFRFU1RFUiB0byBHT1ZFUk5PUgorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJZGVzaWduZXJVc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIDIwMCwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gVXBkYXRlIHVzZXIgcm9sZQorCQlSZXN0UmVzcG9uc2UgZ2V0VXBkYXRlZFJvbGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoZ292ZXJuZXJVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShnb3Zlcm5lclVzZXIsIGdldFVwZGF0ZWRSb2xlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBEZWxldGUgT1BTIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZU9wc1VzZXIgPSBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoZGVzaWduZXJVc2VyLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGRlbGV0aW5nIHVzZXIiLCBkZWxldGVPcHNVc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlbGV0aW5nIHVzZXIiLCAyMDAsIGRlbGV0ZU9wc1VzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwl9CisKKwkvLyBBZG1pbiBVcGRhdGUgZGVhY3RpdmF0ZWQgdXNlciByb2xlIC0gcmVzcG9uc2UgNDA0ICh1c2VyIG5vdCBmb3VuZCkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVJvbGVUb0RlYWN0aXZhdGVkVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gImFqMTAwMSI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIkJlbm55IjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJUYWwiOworCQlTdHJpbmcgZW1haWwgPSAib3B0QmVubnlAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiREVTSUdORVIiOworCQlTdHJpbmcgdXBkYXRlZFJvbGUgPSAiR09WRVJOT1IiOworCQlVc2VyIGRlc2lnbmVyVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlVc2VyIGdvdmVybmVyVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gY3JlYXRlIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihkZXNpZ25lclVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGRlc2lnbmVyVXNlciwgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlkZWxldGVBbmRDaGVja1VzZXJSZXNwb25zZShkZXNpZ25lclVzZXIsIDIwMCk7CisJCVVzZXIgbmV3Um9sZVVzZXIgPSBuZXcgVXNlcigpOworCQluZXdSb2xlVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJLy8gdXBkYXRlIHVzZXIgcm9sZSAtIHVzZXIgZGVBY3RpdnRlZAorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJZGVzaWduZXJVc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCA0MDQsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJLy8gQWRtaW4gVXBkYXRlIHVzZXIgcm9sZSwgdXNlciBkb2VzIG5vdCBleGlzdCBpbiBEQiAtIHJlc3BvbnNlIDQwNCAodXNlcgorCS8vIG5vdCBmb3VuZCkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVJvbGVGb3JOb25FeGlzdGluZ1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhajEwMDEiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIkRFU0lHTkVSIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIkdPVkVSTk9SIjsKKwkJVXNlciBkZXNpZ25lclVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKwkJLy8gVXNlciBnb3Zlcm5lclVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLAorCQkvLyB1c2VyTGFzdE5hbWUsaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlKTsKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyB1cGRhdGUgdXNlciByb2xlIC0gdXNlciBkZUFjdGl2dGVkCisJCVJlc3RSZXNwb25zZSB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlID0gVXNlclJlc3RVdGlscy51cGRhdGVVc2VyUm9sZShuZXdSb2xlVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlkZXNpZ25lclVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgNDA0LCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQWRtaW4gVXBkYXRlIHVzZXIgcm9sZSBmcm9tIEdPVkVSTk9SIHRvIFRFU1RFUgorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlUm9sZUZyb21Hb3Zlcm5vclRvVGVzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhazEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIkdPVkVSTk9SIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIlRFU1RFUiI7CisJCVVzZXIgZ292ZXJub3JVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgdGVzdGVyVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoVXNlclVwZGF0ZVJvbGUsIHNkbmNBZG1pblVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGdvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZ292ZXJub3JVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gb3BzVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyB1cGRhdGUgdXNlciByb2xlIGZyb20gT1BTIHRvIEdPVkVSTk9SCisJCVJlc3RSZXNwb25zZSB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlID0gVXNlclJlc3RVdGlscy51cGRhdGVVc2VyUm9sZShuZXdSb2xlVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlnb3Zlcm5vclVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgMjAwLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcih0ZXN0ZXJVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZSh0ZXN0ZXJVc2VyLCBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGdvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyB1c2VyIiwgZGVsZXRlT3BzVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyB1c2VyIiwgMjAwLCBkZWxldGVPcHNVc2VyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQWRtaW4gVXBkYXRlIHVzZXIgcm9sZSBmcm9tIEdPVkVSTk9SIHRvIERFU0lHTkVSCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVSb2xlRnJvbUdvdmVybm9yVG9EZXNpZ25lcigpIHRocm93cyBFeGNlcHRpb24geworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAiYWsxMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiQmVubnkiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIlRhbCI7CisJCVN0cmluZyBlbWFpbCA9ICJvcHRCZW5ueUBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJHT1ZFUk5PUiI7CisJCVN0cmluZyB1cGRhdGVkUm9sZSA9ICJERVNJR05FUiI7CisJCVVzZXIgZ292ZXJub3JVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgZGVzaWduZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgdXBkYXRlZFJvbGUsIG51bGwpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCS8vIFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihVc2VyVXBkYXRlUm9sZSwgc2RuY0FkbWluVXNlcik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZ292ZXJub3JVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHVzZXIiLCAyMDEsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShnb3Zlcm5vclVzZXIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBvcHNVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQlVc2VyIG5ld1JvbGVVc2VyID0gbmV3IFVzZXIoKTsKKwkJbmV3Um9sZVVzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCS8vIHVwZGF0ZSB1c2VyIHJvbGUgZnJvbSBPUFMgdG8gR09WRVJOT1IKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLnVwZGF0ZVVzZXJSb2xlKG5ld1JvbGVVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCWdvdmVybm9yVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCAyMDAsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFVwZGF0ZWRSb2xlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGRlc2lnbmVyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZGVzaWduZXJVc2VyLCBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGdvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyB1c2VyIiwgZGVsZXRlT3BzVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyB1c2VyIiwgMjAwLCBkZWxldGVPcHNVc2VyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQWRtaW4gVXBkYXRlIHVzZXIgcm9sZSBmcm9tIEdPVkVSTk9SIHRvIE9QUworCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlUm9sZUZyb21Hb3Zlcm5vclRvT3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhazEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIkdPVkVSTk9SIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIk9QUyI7CisJCVVzZXIgZ292ZXJub3JVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgb3BzVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoVXNlclVwZGF0ZVJvbGUsIHNkbmNBZG1pblVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGdvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZ292ZXJub3JVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIG9wc1VzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCVVzZXIgbmV3Um9sZVVzZXIgPSBuZXcgVXNlcigpOworCQluZXdSb2xlVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJLy8gdXBkYXRlIHVzZXIgcm9sZSBmcm9tIE9QUyB0byBHT1ZFUk5PUgorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJZ292ZXJub3JVc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIDIwMCwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0VXBkYXRlZFJvbGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIob3BzVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2Uob3BzVXNlciwgZ2V0VXBkYXRlZFJvbGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIERlbGV0ZSBPUFMgdXNlcgorCQlkZWxldGVBbmRDaGVja1VzZXJSZXNwb25zZShnb3Zlcm5vclVzZXIsIDIwMCk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlQW5kQ2hlY2tVc2VyUmVzcG9uc2UoVXNlciB1c2VyRGV0YWlsZXMsIGludCBleHBlY3RlZFJlc3BvbnNlQ29kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVVzZXIgPSBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoc2RuY0dvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyB1c2VyIiwgZGVsZXRlVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyB1c2VyIiwgZXhwZWN0ZWRSZXNwb25zZUNvZGUsCisJCQkJZGVsZXRlVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwkvLyBBZG1pbiBVcGRhdGUgdXNlciByb2xlIGZyb20gR09WRVJOT1IgdG8gQURNSU4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwZGF0ZVJvbGVGcm9tR292ZXJub3JUb0FkbWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhazEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIkdPVkVSTk9SIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIkFETUlOIjsKKwkJVXNlciBnb3Zlcm5vclVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKwkJVXNlciBhZG1pblVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCB1cGRhdGVkUm9sZSwgbnVsbCk7CisJCS8vIFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihvcHNVc2VyLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKFVzZXJVcGRhdGVSb2xlLCBzZG5jQWRtaW5Vc2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihnb3Zlcm5vclVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGdvdmVybm9yVXNlciwgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBvcHNVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQlVc2VyIG5ld1JvbGVVc2VyID0gbmV3IFVzZXIoKTsKKwkJbmV3Um9sZVVzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCS8vIHVwZGF0ZSB1c2VyIHJvbGUgZnJvbSBPUFMgdG8gR09WRVJOT1IKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLnVwZGF0ZVVzZXJSb2xlKG5ld1JvbGVVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCWdvdmVybm9yVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCAyMDAsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFVwZGF0ZWRSb2xlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGFkbWluVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoYWRtaW5Vc2VyLCBnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGdvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyB1c2VyIiwgZGVsZXRlT3BzVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyB1c2VyIiwgMjAwLCBkZWxldGVPcHNVc2VyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQWRtaW4gVXBkYXRlIHVzZXIgcm9sZSB0byBub24gZXhpc3Rpbmcgcm9sZSAtIFJlc3BvbnNlIDQwMCBCYWQgUmVxdWVzdAorCUBUZXN0CisJcHVibGljIHZvaWQgdXBkYXRlUm9sZVRvTm9uRXhpc3RpbmdSb2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJhbDEwMDEiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIkdPVkVSTk9SIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIlZWVlZWVlYiOworCQlVc2VyIGdvdmVybm9yVXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlVc2VyIG5ld1VzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCB1cGRhdGVkUm9sZSwgbnVsbCk7CisJCS8vIFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihvcHNVc2VyLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKFVzZXJVcGRhdGVSb2xlLCBzZG5jQWRtaW5Vc2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihnb3Zlcm5vclVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHVzZXIiLCBjcmVhdGVVc2VyUmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIDIwMSwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGdvdmVybm9yVXNlciwgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBvcHNVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQlVc2VyIG5ld1JvbGVVc2VyID0gbmV3IFVzZXIoKTsKKwkJbmV3Um9sZVVzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCS8vIHVwZGF0ZSB1c2VyIHJvbGUgZnJvbSBPUFMgdG8gR09WRVJOT1IKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLnVwZGF0ZVVzZXJSb2xlKG5ld1JvbGVVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCWdvdmVybm9yVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciB1cGRhdGluZyB1c2VyIiwgdXBkYXRlVXNlclJvbGVSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCA0MDAsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciB1cGRhdGluZyB1c2VyIiwgIkJhZCBSZXF1ZXN0IiwKKwkJCQl1cGRhdGVVc2VyUm9sZVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKworCQkvLyBSZXN0UmVzcG9uc2UgZ2V0VXBkYXRlZFJvbGVVc2VyUmVzcG9uc2UgPQorCQkvLyBVc2VyUmVzdFV0aWxzLmdldFVzZXIoYWRtaW5Vc2VyLHNkbmNBZG1pblVzZXIpOworCQkvLyBVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGFkbWluVXNlcixnZXRVcGRhdGVkUm9sZVVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIE9QUyB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVPcHNVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGdvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyB1c2VyIiwgZGVsZXRlT3BzVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyB1c2VyIiwgMjAwLCBkZWxldGVPcHNVc2VyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJLy8gQWRtaW4gVXBkYXRlIHVzZXIgcm9sZSB0byBudWxsIC0gUmVzcG9uc2UgNDAwIEJhZCBSZXF1ZXN0CisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVSb2xlVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJheDEwMDEiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJCZW5ueSI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiVGFsIjsKKwkJU3RyaW5nIGVtYWlsID0gIm9wdEJlbm55QGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIkdPVkVSTk9SIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIiI7CisJCVVzZXIgZ292ZXJub3JVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXIgbmV3VXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHVwZGF0ZWRSb2xlLCBudWxsKTsKKwkJLy8gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKG9wc1VzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQkvLyBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoVXNlclVwZGF0ZVJvbGUsIHNkbmNBZG1pblVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGdvdmVybm9yVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgdXNlciIsIGNyZWF0ZVVzZXJSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSB1c2VyIiwgMjAxLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZ292ZXJub3JVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIG9wc1VzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCVVzZXIgbmV3Um9sZVVzZXIgPSBuZXcgVXNlcigpOworCQluZXdSb2xlVXNlci5zZXRSb2xlKHVwZGF0ZWRSb2xlKTsKKwkJLy8gdXBkYXRlIHVzZXIgcm9sZQorCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJZ292ZXJub3JVc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgdXNlciIsIDQwMCwgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIHVwZGF0aW5nIHVzZXIiLCAiQmFkIFJlcXVlc3QiLAorCQkJCXVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQkvLyBEZWxldGUgdXNlcgorCQlSZXN0UmVzcG9uc2UgZGVsZXRlT3BzVXNlciA9IFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihnb3Zlcm5vclVzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIGRlbGV0ZU9wc1VzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgdXNlciIsIDIwMCwgZGVsZXRlT3BzVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCX0KKwkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RNYW5hZ2VyVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJwbTEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJQcm9kIjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJNYW4iOworCQlTdHJpbmcgZW1haWwgPSAicHJvZE1hbkBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJQUk9EVUNUX01BTkFHRVIiOworCQlVc2VyIGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCVVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJLy8gY3JlYXRlIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdC1NYW5hZ2VyIHVzZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2UoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJSW50ZWdlci50b1N0cmluZyhTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQpLCBVc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5TVUNDRVNTX01FU1NBR0UuZ2V0VmFsdWUoKSwKKwkJCQlVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIkFkZFVzZXIiKSk7CisJCS8vIGdldCB1c2VyIGFuZCBjb21wYXJlIHdpdGggZXhwZWN0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsIGdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIFByb2R1Y3RNYW5hZ2VyIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVByb2R1Y3RNYW5hZ2VyVXNlciA9IFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQl0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlbGV0aW5nIE9QUyB1c2VyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlkZWxldGVQcm9kdWN0TWFuYWdlclVzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0U3RyYXRlZ2lzdFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAicG0xMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiUHJvZCI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiU3RyYXRlZ2lzdCI7CisJCVN0cmluZyBlbWFpbCA9ICJwcm9kU3RyQGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIlBST0RVQ1RfU1RSQVRFR0lTVCI7CisJCVVzZXIgZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKwkJVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBzZG5jQWRtaW5Vc2VyLCB0cnVlKTsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkvLyBjcmVhdGUgdXNlcgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0LU1hbmFnZXIgdXNlciIsIFNUQVRVU19DT0RFX1NVQ1NFU1NfQ1JFQVRFRCwKKwkJCQljcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBZGRVc2VyQXVkaXRNZXNzYWdlKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCUludGVnZXIudG9TdHJpbmcoU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVEKSwgVXNlclJlc3BvbnNlTWVzc2FnZUVudW0uU1VDQ0VTU19NRVNTQUdFLmdldFZhbHVlKCksCisJCQkJVXNlclZhbGlkYXRpb25VdGlscy5nZXRBZGRVc2VyQXVkaXRNZXNzYWdlKCJBZGRVc2VyIikpOworCQkvLyBnZXQgdXNlciBhbmQgY29tcGFyZSB3aXRoIGV4cGVjdGVkCisJCVJlc3RSZXNwb25zZSBnZXRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBnZXRVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIERlbGV0ZSBQcm9kdWN0U3RyYXRlZ2lzdCB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVQcm9kdWN0U3RyYXRlZ2lzdFVzZXIgPSBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsCisJCQkJc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCWFzc2VydE5vdE51bGwoIkNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBkZWxldGluZyBPUFMgdXNlciIsIGRlbGV0ZVByb2R1Y3RTdHJhdGVnaXN0VXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyBPUFMgdXNlciIsIDIwMCwKKwkJCQlkZWxldGVQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0U3RyYXRlZ2lzdFVzZXJCeU5vbkFkbWluVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJwbTEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJQcm9kIjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJTdHJhdGVnaXN0IjsKKwkJU3RyaW5nIGVtYWlsID0gInByb2RTdHJAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiUFJPRFVDVF9TVFJBVEVHSVNUIjsKKwkJVXNlciBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCS8vIGNyZWF0ZSB1c2VyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNEZXNpZ25lclVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QtTWFuYWdlciB1c2VyIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFVzZXJJZCgiIik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldEZpcnN0TmFtZShudWxsKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0TGFzdE5hbWUobnVsbCk7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldEVtYWlsKCIiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0Um9sZSgiIik7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2UoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNEZXNpZ25lclVzZXIsCisJCQkJSW50ZWdlci50b1N0cmluZyhTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiksIGVycm9ySW5mby5nZXRBdWRpdERlc2MoIiIpLAorCQkJCVVzZXJWYWxpZGF0aW9uVXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJLy8gVHJ5IHRvIGdldCB1c2VyIC0gdXNlciBpcyBub3QgY3JlYXRlZAorCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRVc2VySWQoInBtMTAwMCIpOworCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRGaXJzdE5hbWUoIlByb2QiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0TGFzdE5hbWUoIlN0cmF0ZWdpc3QiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0RW1haWwoInByb2RTdHJAaW50bC5zZGMuY29tIik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFJvbGUoIlBST0RVQ1RfU1RSQVRFR0lTVCIpOworCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgZ2V0VXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE1hbmFnZXJVc2VyQnlOb25BZG1pblVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAicG0xMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiUHJvZCI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiTWFuIjsKKwkJU3RyaW5nIGVtYWlsID0gInByb2RTdHJAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiUFJPRFVDVF9NQU5BR0VSIjsKKwkJVXNlciBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIsIHRydWUpOworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCS8vIGNyZWF0ZSB1c2VyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNEZXNpZ25lclVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QtTWFuYWdlciB1c2VyIiwgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04sCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFVzZXJJZCgiIik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldEZpcnN0TmFtZShudWxsKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0TGFzdE5hbWUobnVsbCk7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldEVtYWlsKCIiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0Um9sZSgiIik7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04ubmFtZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2UoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNEZXNpZ25lclVzZXIsCisJCQkJSW50ZWdlci50b1N0cmluZyhTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiksIGVycm9ySW5mby5nZXRBdWRpdERlc2MoIiIpLAorCQkJCVVzZXJWYWxpZGF0aW9uVXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJLy8gVHJ5IHRvIGdldCB1c2VyIC0gdXNlciBpcyBub3QgY3JlYXRlZAorCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRVc2VySWQoInBtMTAwMCIpOworCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRGaXJzdE5hbWUoIlByb2QiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0TGFzdE5hbWUoIlN0cmF0ZWdpc3QiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0RW1haWwoInByb2RTdHJAaW50bC5zZGMuY29tIik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFJvbGUoIlBST0RVQ1RfTUFOQUdFUiIpOworCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgZ2V0VXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdFN0cmF0ZWdpc3RVc2VyQnlOb25FeGlzdGluZ1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAicG0xMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiUHJvZCI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiU3RyYXRlZ2lzdCI7CisJCVN0cmluZyBlbWFpbCA9ICJwcm9kU3RyQGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIlBST0RVQ1RfU1RSQVRFR0lTVCI7CisJCVVzZXIgbm9TZG5jVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQlub1NkbmNVc2VyRGV0YWlscy5zZXRSb2xlKCJibGFibGEiKTsKKwkJbm9TZG5jVXNlckRldGFpbHMuc2V0VXNlcklkKCJidDc1MGgiKTsKKwkJVXNlciBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCS8vIGNyZWF0ZSB1c2VyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIG5vU2RuY1VzZXJEZXRhaWxzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0LU1hbmFnZXIgdXNlciIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwKKwkJCQljcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIEF1ZGl0IHZhbGlkYXRpb24KKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0VXNlcklkKCIiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0Rmlyc3ROYW1lKG51bGwpOworCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRMYXN0TmFtZShudWxsKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0RW1haWwoIiIpOworCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRSb2xlKCIiKTsKKwkJbm9TZG5jVXNlckRldGFpbHMuc2V0Rmlyc3ROYW1lKCIiKTsKKwkJbm9TZG5jVXNlckRldGFpbHMuc2V0TGFzdE5hbWUoIiIpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5ELm5hbWUoKSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBZGRVc2VyQXVkaXRNZXNzYWdlKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBub1NkbmNVc2VyRGV0YWlscywKKwkJCQlJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19DT0RFX05PVF9GT1VORCksIGVycm9ySW5mby5nZXRBdWRpdERlc2Mobm9TZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpLAorCQkJCVVzZXJWYWxpZGF0aW9uVXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJLy8gVHJ5IHRvIGdldCB1c2VyIC0gdXNlciBpcyBub3QgY3JlYXRlZAorCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRVc2VySWQoInBtMTAwMCIpOworCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRGaXJzdE5hbWUoIlByb2QiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0TGFzdE5hbWUoIlN0cmF0ZWdpc3QiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0RW1haWwoInByb2RTdHJAaW50bC5zZGMuY29tIik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFJvbGUoIlBST0RVQ1RfU1RSQVRFR0lTVCIpOworCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgZ2V0VXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlUHJvZHVjdE1hbmFnZXJVc2VyQnlOb25FeGlzdGluZ1VzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGh0dHBDc3BVc2VySWQgPSAicG0xMDAwIjsKKwkJU3RyaW5nIHVzZXJGaXJzdE5hbWUgPSAiUHJvZCI7CisJCVN0cmluZyB1c2VyTGFzdE5hbWUgPSAiTWFuIjsKKwkJU3RyaW5nIGVtYWlsID0gInByb2RTdHJAaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiUFJPRFVDVF9NQU5BR0VSIjsKKwkJVXNlciBub1NkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJCW5vU2RuY1VzZXJEZXRhaWxzLnNldFJvbGUoImJsYWJsYSIpOworCQlub1NkbmNVc2VyRGV0YWlscy5zZXRVc2VySWQoImJ0NzUwaCIpOworCQlVc2VyIGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQkvLyBjcmVhdGUgdXNlcgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBub1NkbmNVc2VyRGV0YWlscyk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdC1NYW5hZ2VyIHVzZXIiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQkvLyBBdWRpdCB2YWxpZGF0aW9uCisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFVzZXJJZCgiIik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldEZpcnN0TmFtZShudWxsKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0TGFzdE5hbWUobnVsbCk7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldEVtYWlsKCIiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0Um9sZSgiIik7CisJCW5vU2RuY1VzZXJEZXRhaWxzLnNldEZpcnN0TmFtZSgiIik7CisJCW5vU2RuY1VzZXJEZXRhaWxzLnNldExhc3ROYW1lKCIiKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORC5uYW1lKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQWRkVXNlckF1ZGl0TWVzc2FnZShleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciwgbm9TZG5jVXNlckRldGFpbHMsCisJCQkJSW50ZWdlci50b1N0cmluZyhTVEFUVVNfQ09ERV9OT1RfRk9VTkQpLCBlcnJvckluZm8uZ2V0QXVkaXREZXNjKG5vU2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKSwKKwkJCQlVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIkFkZFVzZXIiKSk7CisJCS8vIFRyeSB0byBnZXQgdXNlciAtIHVzZXIgaXMgbm90IGNyZWF0ZWQKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0VXNlcklkKCJwbTEwMDAiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuc2V0Rmlyc3ROYW1lKCJQcm9kIik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldExhc3ROYW1lKCJTdHJhdGVnaXN0Iik7CisJCWV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldEVtYWlsKCJwcm9kU3RyQGludGwuc2RjLmNvbSIpOworCQlleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRSb2xlKCJQUk9EVUNUX01BTkFHRVIiKTsKKwkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSAiLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsIGdldFVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgdXBkYXRlUHJvamVjdE1hbmFnZXJSb2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFVwZGF0ZSB1c2VyIHJvbGUgZnJvbSBQUk9EVUNUX1NUUkFURUdJU1QgdG8gUFJPRFVDVF9NQU5BR0VSCisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gInBtMTAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIlByb2QiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIk1hbiI7CisJCVN0cmluZyBlbWFpbCA9ICJwcm9kTWFuQGludGwuc2RjLmNvbSI7CisJCVN0cmluZyByb2xlID0gIlBST0RVQ1RfTUFOQUdFUiI7CisJCVN0cmluZyB1cGRhdGVkUm9sZSA9ICJHT1ZFUk5PUiI7CisJCVVzZXIgZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKwkJZGVsZXRlVXNlckFuZEF1ZGl0KGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyKTsKKwkJLy8gY3JlYXRlIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdC1NYW5hZ2VyIHVzZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIFVwZGF0ZSB1c2VyIHJvbGUKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyBVcGRhdGUgdXNlciByb2xlIGZyb20gUFJPRFVDVF9TVFJBVEVHSVNUIHRvIFBST0RVQ1RfTUFOQUdFUgorCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlID0gVXNlclJlc3RVdGlscy51cGRhdGVVc2VyUm9sZShuZXdSb2xlVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsCisJCQkJdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQWRkVXNlckF1ZGl0TWVzc2FnZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19DT0RFX1NVQ0NFU1MpLCBVc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5TVUNDRVNTX01FU1NBR0UuZ2V0VmFsdWUoKSwKKwkJCQlVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIlVwZGF0ZVVzZXIiKSk7CisJCS8vIGdldCB1c2VyIGFuZCBjb21wYXJlIHdpdGggZXhwZWN0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsIGdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIFByb2R1Y3RNYW5hZ2VyIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVByb2R1Y3RNYW5hZ2VyVXNlciA9IFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQl0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlbGV0aW5nIE9QUyB1c2VyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlkZWxldGVQcm9kdWN0TWFuYWdlclVzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2R1Y3RTdHJhdGVnaXN0Um9sZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBVcGRhdGUgdXNlciByb2xlIGZyb20gUFJPRFVDVF9TVFJBVEVHSVNUIHRvIFBST0RVQ1RfTUFOQUdFUgorCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJwbTEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJQcm9kIjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJTdHJhdGVnaXN0IjsKKwkJU3RyaW5nIGVtYWlsID0gInByb2RNYW5AaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiUFJPRFVDVF9TVFJBVEVHSVNUIjsKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gIlRFU1RFUiI7CisJCVVzZXIgZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIgPSBuZXcgVXNlcih1c2VyRmlyc3ROYW1lLCB1c2VyTGFzdE5hbWUsIGh0dHBDc3BVc2VySWQsIGVtYWlsLCByb2xlLCBudWxsKTsKKwkJZGVsZXRlVXNlckFuZEF1ZGl0KGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyKTsKKwkJLy8gY3JlYXRlIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuY3JlYXRlVXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgUHJvZHVjdC1NYW5hZ2VyIHVzZXIiLCBTVEFUVVNfQ09ERV9TVUNTRVNTX0NSRUFURUQsCisJCQkJY3JlYXRlVXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBjcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIFVwZGF0ZSB1c2VyIHJvbGUKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkvLyBVcGRhdGUgdXNlciByb2xlIGZyb20gUFJPRFVDVF9TVFJBVEVHSVNUIHRvIFBST0RVQ1RfTUFOQUdFUgorCQlEYlV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlID0gVXNlclJlc3RVdGlscy51cGRhdGVVc2VyUm9sZShuZXdSb2xlVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgdXNlciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIuc2V0Um9sZSh1cGRhdGVkUm9sZSk7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsCisJCQkJdXBkYXRlVXNlclJvbGVSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQWRkVXNlckF1ZGl0TWVzc2FnZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19DT0RFX1NVQ0NFU1MpLCBVc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5TVUNDRVNTX01FU1NBR0UuZ2V0VmFsdWUoKSwKKwkJCQlVc2VyVmFsaWRhdGlvblV0aWxzLmdldEFkZFVzZXJBdWRpdE1lc3NhZ2UoIlVwZGF0ZVVzZXIiKSk7CisJCS8vIGdldCB1c2VyIGFuZCBjb21wYXJlIHdpdGggZXhwZWN0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlcik7CisJCVVzZXJWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVc2VyRGV0YWlsc09uUmVzcG9uc2UoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsIGdldFVzZXJSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJLy8gRGVsZXRlIFByb2R1Y3RNYW5hZ2VyIHVzZXIKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVByb2R1Y3RNYW5hZ2VyVXNlciA9IFVzZXJSZXN0VXRpbHMuZGVsZXRlVXNlcihleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQl0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGRlbGV0aW5nIE9QUyB1c2VyIiwgU1RBVFVTX0NPREVfU1VDQ0VTUywKKwkJCQlkZWxldGVQcm9kdWN0TWFuYWdlclVzZXIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVQcm9kdWN0TWFuYWdlclVzZXJBbHJlYWR5RXhpdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJwbTEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJQcm9kIjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJNYW4iOworCQlTdHJpbmcgZW1haWwgPSAicHJvZE1hbkBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJQUk9EVUNUX01BTkFHRVIiOworCQlVc2VyIGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCWRlbGV0ZVVzZXJBbmRBdWRpdChleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlcik7CisJCS8vIGNyZWF0ZSB1c2VyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QtTWFuYWdlciB1c2VyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBjcmVhdGUgc2FtZSB1c2VyIGFnYWluCisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJBZ2FpblJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0LU1hbmFnZXIgdXNlciIsIFVTRVJfQUxSRUFEWV9FWElTVCwKKwkJCQljcmVhdGVVc2VyQWdhaW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlVTRVJfQUxSRUFEWV9FWElTVC5uYW1lKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQWRkVXNlckF1ZGl0TWVzc2FnZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlJbnRlZ2VyLnRvU3RyaW5nKFVTRVJfQUxSRUFEWV9FWElTVCksIGVycm9ySW5mby5nZXRBdWRpdERlc2MoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIuZ2V0VXNlcklkKCkpLAorCQkJCVVzZXJWYWxpZGF0aW9uVXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJLy8gZ2V0IHVzZXIgYW5kIGNvbXBhcmUgd2l0aCBleHBlY3RlZAorCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgZ2V0VXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBEZWxldGUgUHJvZHVjdE1hbmFnZXIgdXNlcgorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvZHVjdE1hbmFnZXJVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCXRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgT1BTIHVzZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWRlbGV0ZVByb2R1Y3RNYW5hZ2VyVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVByb2R1Y3RTdHJhdGVnaXN0VXNlckFscmVhZHlFeGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBodHRwQ3NwVXNlcklkID0gInBtMTAwMCI7CisJCVN0cmluZyB1c2VyRmlyc3ROYW1lID0gIlByb2QiOworCQlTdHJpbmcgdXNlckxhc3ROYW1lID0gIlN0cmF0ZWdpc3QiOworCQlTdHJpbmcgZW1haWwgPSAicHJvZE1hbkBpbnRsLnNkYy5jb20iOworCQlTdHJpbmcgcm9sZSA9ICJQUk9EVUNUX1NUUkFURUdJU1QiOworCQlVc2VyIGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCWRlbGV0ZVVzZXJBbmRBdWRpdChleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlcik7CisJCS8vIGNyZWF0ZSB1c2VyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QtTWFuYWdlciB1c2VyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgY3JlYXRlVXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBjcmVhdGUgc2FtZSB1c2VyIGFnYWluCisJCURiVXRpbHMuZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oIl9hbGwiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXJBZ2FpblJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0LU1hbmFnZXIgdXNlciIsIFVTRVJfQUxSRUFEWV9FWElTVCwKKwkJCQljcmVhdGVVc2VyQWdhaW5SZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlVTRVJfQUxSRUFEWV9FWElTVC5uYW1lKCkpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQWRkVXNlckF1ZGl0TWVzc2FnZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgc2RuY0FkbWluVXNlciwKKwkJCQlJbnRlZ2VyLnRvU3RyaW5nKFVTRVJfQUxSRUFEWV9FWElTVCksIGVycm9ySW5mby5nZXRBdWRpdERlc2MoZXhwZWN0ZWRQcm9kdWN0TWFuYWdlclVzZXIuZ2V0VXNlcklkKCkpLAorCQkJCVVzZXJWYWxpZGF0aW9uVXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJLy8gZ2V0IHVzZXIgYW5kIGNvbXBhcmUgd2l0aCBleHBlY3RlZAorCQlSZXN0UmVzcG9uc2UgZ2V0VXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5nZXRVc2VyKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShleHBlY3RlZFByb2R1Y3RNYW5hZ2VyVXNlciwgZ2V0VXNlclJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkvLyBEZWxldGUgUHJvZHVjdE1hbmFnZXIgdXNlcgorCQlSZXN0UmVzcG9uc2UgZGVsZXRlUHJvZHVjdE1hbmFnZXJVc2VyID0gVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKGV4cGVjdGVkUHJvZHVjdE1hbmFnZXJVc2VyLCBzZG5jQWRtaW5Vc2VyLAorCQkJCXRydWUpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgZGVsZXRpbmcgT1BTIHVzZXIiLCBTVEFUVVNfQ09ERV9TVUNDRVNTLAorCQkJCWRlbGV0ZVByb2R1Y3RNYW5hZ2VyVXNlci5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgVXBkYXRlUHJvZHVjdFN0cmF0ZWdpc3RUb05vbkV4aXN0aW5nUm9sZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJwbTEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJQcm9kIjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJTdHJhdGVnaXN0IjsKKwkJU3RyaW5nIGVtYWlsID0gInByb2RNYW5AaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiUFJPRFVDVF9TVFJBVEVHSVNUIjsKKwkJU3RyaW5nIG5vbkV4aXN0aW5nUm9sZSA9ICJCTEFCTEEiOworCQlVc2VyIGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyID0gbmV3IFVzZXIodXNlckZpcnN0TmFtZSwgdXNlckxhc3ROYW1lLCBodHRwQ3NwVXNlcklkLCBlbWFpbCwgcm9sZSwgbnVsbCk7CisJCWRlbGV0ZVVzZXJBbmRBdWRpdChleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlcik7CisJCS8vIGNyZWF0ZSB1c2VyCisJCVJlc3RSZXNwb25zZSBjcmVhdGVVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmNyZWF0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIFByb2R1Y3QtTWFuYWdlciB1c2VyIiwgU1RBVFVTX0NPREVfU1VDU0VTU19DUkVBVEVELAorCQkJCWNyZWF0ZVVzZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciwKKwkJCQljcmVhdGVVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIFVwZGF0ZSB1c2VyIFJvbGUgdG8gbm9uIEV4aXN0aW5nIHJvbGUKKwkJVXNlciBuZXdSb2xlVXNlciA9IG5ldyBVc2VyKCk7CisJCW5ld1JvbGVVc2VyLnNldFJvbGUobm9uRXhpc3RpbmdSb2xlKTsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlVXNlclJvbGVSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMudXBkYXRlVXNlclJvbGUobmV3Um9sZVVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgdXBkYXRpbmcgdXNlciByb2xlIiwgSU5WQUxJRF9ST0xFLAorCQkJCXVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQkvKgorCQkgKiBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRVc2VySWQoIiIpOworCQkgKiBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRGaXJzdE5hbWUobnVsbCk7CisJCSAqIGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldExhc3ROYW1lKG51bGwpOworCQkgKiBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRFbWFpbCgiIik7CisJCSAqIGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFJvbGUoIiIpOworCQkgKi8KKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX1JPTEUubmFtZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2UoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJSW50ZWdlci50b1N0cmluZyhJTlZBTElEX1JPTEUpLCBlcnJvckluZm8uZ2V0QXVkaXREZXNjKG5vbkV4aXN0aW5nUm9sZSksCisJCQkJVXNlclZhbGlkYXRpb25VdGlscy5nZXRBZGRVc2VyQXVkaXRNZXNzYWdlKCJVcGRhdGVVc2VyIikpOworCQkvLyBnZXQgdXNlciBhbmQgY29tcGFyZSB3aXRoIGV4cGVjdGVkCisJCVJlc3RSZXNwb25zZSBnZXRVc2VyUmVzcG9uc2UgPSBVc2VyUmVzdFV0aWxzLmdldFVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIpOworCQlVc2VyVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXNlckRldGFpbHNPblJlc3BvbnNlKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBnZXRVc2VyUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCS8vIERlbGV0ZSBQcm9kdWN0TWFuYWdlciB1c2VyCisJCVJlc3RSZXNwb25zZSBkZWxldGVQcm9kdWN0TWFuYWdlclVzZXIgPSBVc2VyUmVzdFV0aWxzLmRlbGV0ZVVzZXIoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJdHJ1ZSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBkZWxldGluZyBPUFMgdXNlciIsIFNUQVRVU19DT0RFX1NVQ0NFU1MsCisJCQkJZGVsZXRlUHJvZHVjdE1hbmFnZXJVc2VyLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBjcmVhdGVVc2VyV2l0aE5vbkV4aXN0aW5nUm9sZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgaHR0cENzcFVzZXJJZCA9ICJwbTEwMDAiOworCQlTdHJpbmcgdXNlckZpcnN0TmFtZSA9ICJQcm9kIjsKKwkJU3RyaW5nIHVzZXJMYXN0TmFtZSA9ICJTdHJhdGVnaXN0IjsKKwkJU3RyaW5nIGVtYWlsID0gInByb2RNYW5AaW50bC5zZGMuY29tIjsKKwkJU3RyaW5nIHJvbGUgPSAiQkxBQkxBIjsKKwkJVXNlciBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciA9IG5ldyBVc2VyKHVzZXJGaXJzdE5hbWUsIHVzZXJMYXN0TmFtZSwgaHR0cENzcFVzZXJJZCwgZW1haWwsIHJvbGUsIG51bGwpOworCQlkZWxldGVVc2VyQW5kQXVkaXQoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIpOworCQkvLyBjcmVhdGUgdXNlcgorCQlSZXN0UmVzcG9uc2UgY3JlYXRlVXNlclJlc3BvbnNlID0gVXNlclJlc3RVdGlscy5jcmVhdGVVc2VyKGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLCBzZG5jQWRtaW5Vc2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBQcm9kdWN0LU1hbmFnZXIgdXNlciIsIElOVkFMSURfUk9MRSwKKwkJCQljcmVhdGVVc2VyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJLy8gQXVkaXQgdmFsaWRhdGlvbgorCQkvKgorCQkgKiBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRVc2VySWQoIiIpOworCQkgKiBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRGaXJzdE5hbWUobnVsbCk7CisJCSAqIGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldExhc3ROYW1lKG51bGwpOworCQkgKiBleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlci5zZXRFbWFpbCgiIik7CisJCSAqIGV4cGVjdGVkUHJvZHVjdFN0cmF0ZWdpc3RVc2VyLnNldFJvbGUoIiIpOworCQkgKi8KKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX1JPTEUubmFtZSgpKTsKKwkJVXNlclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2UoZXhwZWN0ZWRQcm9kdWN0U3RyYXRlZ2lzdFVzZXIsIHNkbmNBZG1pblVzZXIsCisJCQkJSW50ZWdlci50b1N0cmluZyhJTlZBTElEX1JPTEUpLCBlcnJvckluZm8uZ2V0QXVkaXREZXNjKHJvbGUpLAorCQkJCVVzZXJWYWxpZGF0aW9uVXRpbHMuZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZSgiQWRkVXNlciIpKTsKKwkJLy8gZ2V0IHVzZXIgLSB2ZXJpZnkgdXNlciBpcyBub3QgY3JlYXRlZGFuZCBjb21wYXJlIHdpdGggZXhwZWN0ZWQKKwkJUmVzdFJlc3BvbnNlIGdldFVzZXJSZXNwb25zZSA9IFVzZXJSZXN0VXRpbHMuZ2V0VXNlcihleHBlY3RlZFByb2R1Y3RTdHJhdGVnaXN0VXNlciwgc2RuY0FkbWluVXNlcik7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgdXNlciBub3QgY3JlYXRlZCIsIFNUQVRVU19DT0RFX05PVF9GT1VORCwgZ2V0VXNlclJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVVzZXJBbmRBdWRpdChVc2VyIHNkbmNVc2VyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJVXNlclJlc3RVdGlscy5kZWxldGVVc2VyKHNkbmNVc2VyRGV0YWlscywgc2RuY0FkbWluVXNlciwgdHJ1ZSk7CisJCURiVXRpbHMuY2xlYW5BbGxBdWRpdHMoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3VzZXIvR292ZXJub3JXb3Jrc3BhY2VBcGlUZXN0LmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS91c2VyL0dvdmVybm9yV29ya3NwYWNlQXBpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTUyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS91c2VyL0dvdmVybm9yV29ya3NwYWNlQXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGlzdHJpYnV0aW9uU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5TZXJ2aWNlVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgR292ZXJub3JXb3Jrc3BhY2VBcGlUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdvdmVybm9yV29ya3NwYWNlQXBpVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCUBSdWxlCisJcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwdWJsaWMgR292ZXJub3JXb3Jrc3BhY2VBcGlUZXN0KCkgeworCQlzdXBlcihuYW1lLCBHb3Zlcm5vcldvcmtzcGFjZUFwaVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworCX0KKworCXByb3RlY3RlZCBmaW5hbCBVc2VyIGFkbWluMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisJcHJvdGVjdGVkIGZpbmFsIFVzZXIgZ292ZXJub3IgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uR09WRVJOT1IpOworCXByb3RlY3RlZCBmaW5hbCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczE7CisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzOworCisJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiA9ICIwLjEiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgc2VydmljZXNTdHJpbmcgPSAic2VydmljZXMiOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdXNlclJlbWFya3MgPSAiY29tbWVudFRlc3QiOworCisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzMTEgPSBudWxsOworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlsczIyID0gbnVsbDsKKwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMzMyA9IG51bGw7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgaW5pdEJlZm9yZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGJVdGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybigiX2FsbCIpOworCQlSZXNvdXJjZSByZXNvdXJjZU9iaiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZURldGFpbHMxID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU9iaik7CisJCWhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJY3JlYXRlVGhyZWVTZXJ2aWNlcyhzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGhyZWVTZXJ2aWNlcyhVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBjaGVja2luQ29tbWVudCA9ICJnb29kIGNoZWNraW4iOworCQlTdHJpbmcgY2hlY2tpbkNvbWVudEpzb24gPSAie1widXNlclJlbWFya3NcIjogXCIiICsgY2hlY2tpbkNvbW1lbnQgKyAiXCJ9IjsKKworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoCisJCQkJaGVhdEFydGlmYWN0RGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHJlc291cmNlRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZ5UmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsczEpOworCQljb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoImRlZmF1bHRJbnN0YW5jZSIsIHJlc291cmNlRGV0YWlsczEpOworCisJCXNlcnZpY2VEZXRhaWxzMTEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlzZXJ2aWNlRGV0YWlsczIyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZURldGFpbHMzMyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisKKwkJc2VydmljZURldGFpbHMxMS5zZXROYW1lKHNlcnZpY2VEZXRhaWxzMTEuZ2V0TmFtZSgpICsgIjEiKTsKKwkJTGlzdDxTdHJpbmc+IHRhZ3MgPSBzZXJ2aWNlRGV0YWlsczExLmdldFRhZ3MoKTsKKwkJdGFncy5hZGQoc2VydmljZURldGFpbHMxMS5nZXROYW1lKCkpOworCQlzZXJ2aWNlRGV0YWlsczExLnNldFRhZ3ModGFncyk7CisKKwkJc2VydmljZURldGFpbHMyMi5zZXROYW1lKHNlcnZpY2VEZXRhaWxzMTEuZ2V0TmFtZSgpICsgIjIiKTsKKwkJdGFncyA9IHNlcnZpY2VEZXRhaWxzMjIuZ2V0VGFncygpOworCQl0YWdzLmFkZChzZXJ2aWNlRGV0YWlsczIyLmdldE5hbWUoKSk7CisJCXNlcnZpY2VEZXRhaWxzMjIuc2V0VGFncyh0YWdzKTsKKworCQlzZXJ2aWNlRGV0YWlsczMzLnNldE5hbWUoc2VydmljZURldGFpbHMxMS5nZXROYW1lKCkgKyAiMyIpOworCQl0YWdzID0gc2VydmljZURldGFpbHMzMy5nZXRUYWdzKCk7CisJCXRhZ3MuYWRkKHNlcnZpY2VEZXRhaWxzMzMuZ2V0TmFtZSgpKTsKKwkJc2VydmljZURldGFpbHMzMy5zZXRUYWdzKHRhZ3MpOworCQkvLworCQkvLyBzZXJ2aWNlVXRpbHMuZGVsZXRlU2VydmljZV9hbGxWZXJzaW9ucyhzZXJ2aWNlRGV0YWlsczExLCBkZXNpZ25lcjEpOworCQkvLyBzZXJ2aWNlVXRpbHMuZGVsZXRlU2VydmljZV9hbGxWZXJzaW9ucyhzZXJ2aWNlRGV0YWlsczIyLCBkZXNpZ25lcjEpOworCQkvLyBzZXJ2aWNlVXRpbHMuZGVsZXRlU2VydmljZV9hbGxWZXJzaW9ucyhzZXJ2aWNlRGV0YWlsczMzLCBkZXNpZ25lcjEpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UxID0gY3JlYXRlU2VydmljZSh1c2VyLCBzZXJ2aWNlRGV0YWlsczExKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VSZXNwb25zZTIgPSBjcmVhdGVTZXJ2aWNlKHVzZXIsIHNlcnZpY2VEZXRhaWxzMjIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlMyA9IGNyZWF0ZVNlcnZpY2UodXNlciwgc2VydmljZURldGFpbHMzMyk7CisKKwkJLy8gYWRkUmVzb3VyY2VXaXRoSGVhdEFydCgpOworCQkvLworCQkvLyBzZXJ2aWNlVXRpbHMuYWRkU2VydmljZU1hbmRhdG9yeUFydGlmYWN0cyh1c2VyLAorCQkvLyBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UxKTsKKwkJLy8KKwkJLy8KKwkJLy8gUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VSZXNwb25zZTIgPQorCQkvLyBzZXJ2aWNlVXRpbHMuY3JlYXRlU2VydmljZVRvd2FyZHNDYXRhbG9nQmUoc2VydmljZURldGFpbHMyMiwgdXNlcik7CisJCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGluZworCQkvLyBzZXJ2aWNlIiwgY3JlYXRlU2VydmljZVJlc3BvbnNlMik7CisJCS8vIGFzc2VydE5vdE51bGwoImNoZWNrIGlmIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0aW5nCisJCS8vIHNlcnZpY2UiLCBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UyLmdldEVycm9yQ29kZSgpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0aW5nIHNlcnZpY2UiLCAyMDEsCisJCS8vIGNyZWF0ZVNlcnZpY2VSZXNwb25zZTIuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCS8vIHNlcnZpY2VEZXRhaWxzMjIuc2V0VW5pcXVlSWQoc2VydmljZVV0aWxzLmdldFNlcnZpY2VVbmlxdWVJZChjcmVhdGVTZXJ2aWNlUmVzcG9uc2UyKSk7CisJCS8vIGxvZ2dlci5kZWJ1ZygiQ3JlYXRlZCBzZXJ2aWNlMiA9IHt9Iiwgc2VydmljZURldGFpbHMyMik7CisJCS8vIHNlcnZpY2VVdGlscy5hZGRTZXJ2aWNlTWFuZGF0b3J5QXJ0aWZhY3RzKHVzZXIsCisJCS8vIGNyZWF0ZVNlcnZpY2VSZXNwb25zZTIpOworCQkvLworCQkvLyBSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlMyA9CisJCS8vIHNlcnZpY2VVdGlscy5jcmVhdGVTZXJ2aWNlVG93YXJkc0NhdGFsb2dCZShzZXJ2aWNlRGV0YWlsczMzLCB1c2VyKTsKKwkJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0aW5nCisJCS8vIHNlcnZpY2UiLCBjcmVhdGVTZXJ2aWNlUmVzcG9uc2UzKTsKKwkJLy8gYXNzZXJ0Tm90TnVsbCgiY2hlY2sgaWYgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRpbmcKKwkJLy8gc2VydmljZSIsIGNyZWF0ZVNlcnZpY2VSZXNwb25zZTMuZ2V0RXJyb3JDb2RlKCkpOworCQkvLyBhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRpbmcgc2VydmljZSIsIDIwMSwKKwkJLy8gY3JlYXRlU2VydmljZVJlc3BvbnNlMy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJLy8gc2VydmljZURldGFpbHMzMy5zZXRVbmlxdWVJZChzZXJ2aWNlVXRpbHMuZ2V0U2VydmljZVVuaXF1ZUlkKGNyZWF0ZVNlcnZpY2VSZXNwb25zZTMpKTsKKwkJLy8gbG9nZ2VyLmRlYnVnKCJDcmVhdGVkIHNlcnZpY2UzID0ge30iLCBzZXJ2aWNlRGV0YWlsczMzKTsKKwkJLy8gc2VydmljZVV0aWxzLmFkZFNlcnZpY2VNYW5kYXRvcnlBcnRpZmFjdHModXNlciwKKwkJLy8gY3JlYXRlU2VydmljZVJlc3BvbnNlMyk7CisKKwl9CisKKwlwcm90ZWN0ZWQgUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2UoVXNlciB1c2VyLCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3BvbnNlMSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgdXNlcik7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGluZyBzZXJ2aWNlIiwgY3JlYXRlU2VydmljZVJlc3BvbnNlMSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGlmIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0aW5nIHNlcnZpY2UiLAorCQkJCWNyZWF0ZVNlcnZpY2VSZXNwb25zZTEuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRpbmcgc2VydmljZSIsIDIwMSwKKwkJCQljcmVhdGVTZXJ2aWNlUmVzcG9uc2UxLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTZXJ2aWNlIGNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlcgorCQkJCS5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVNlcnZpY2VSZXNwb25zZTEuZ2V0UmVzcG9uc2UoKSk7CisJCXNlcnZpY2VEZXRhaWxzLnNldFVuaXF1ZUlkKGNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QuZ2V0VW5pcXVlSWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiQ3JlYXRlZCBzZXJ2aWNlMSA9IHt9Iiwgc2VydmljZURldGFpbHMpOworCQlhZGRSZXNvdXJjZVdpdGhIZWF0QXJ0KHNlcnZpY2VEZXRhaWxzKTsKKwkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZXNwb25zZTE7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VXaXRoSGVhdEFydChTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQljb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNlcnZpY2VVSUQgLS0tPiIgKyBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlICIsIDIwMSwgY3JlYXRlUmVzb3VyY2VJbnN0YW5jZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjZXJ0aWZ5QWxsU2VydmljZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzMTEpOworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMyMik7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jZXJ0aWZ5U2VydmljZShzZXJ2aWNlRGV0YWlsczMzKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VsZW1lbnRJbkFycmF5KFN0cmluZyBlbGVtZW50SWQsIEpTT05BcnJheSBqc29uQXJyYXkpIHRocm93cyBFeGNlcHRpb24geworCQlmb3IgKGludCBpID0gMDsgaSA8IGpzb25BcnJheS5zaXplKCk7IGkrKykgeworCQkJSlNPTk9iamVjdCBqb2JqZWN0ID0gKEpTT05PYmplY3QpIGpzb25BcnJheS5nZXQoaSk7CisKKwkJCWlmIChqb2JqZWN0LmdldCgidW5pcXVlSWQiKS50b1N0cmluZygpLmVxdWFscyhlbGVtZW50SWQpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFwcHJvdmVEaXN0cmlidXRpb25TdGF0dXNPZkNlcnRpZmllZFNlcnZpY2UoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMsIFVzZXIgdXNlcikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlhcHByb3ZlRGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCB1c2VyLCAiMS4wIik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYXBwcm92ZURpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgVXNlciB1c2VyLCBTdHJpbmcgdmVyc2lvbikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzID0gTGlmZWN5Y2xlUmVzdFV0aWxzLnNlbmRBcHByb3ZlRGlzdHJpYnV0aW9uKHVzZXIsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIHVzZXJSZW1hcmtzKTsKKwkJYXNzZXJ0RXF1YWxzKDIwMCwgcmVzLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlTZXJ2aWNlVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShyZXMsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVEKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZWplY3REaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2UoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlamVjdERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZShzZXJ2aWNlRGV0YWlscywgdXNlciwgIjEuMCIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlamVjdERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgVXNlciB1c2VyLCBTdHJpbmcgdmVyc2lvbikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzID0gTGlmZWN5Y2xlUmVzdFV0aWxzLnJlamVjdERpc3RyaWJ1dGlvbihzZXJ2aWNlRGV0YWlscywgdmVyc2lvbiwgdXNlciwgdXNlclJlbWFya3MpOworCQlhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVNlcnZpY2VWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVEaXN0cnVidGlvblN0YXR1c1ZhbHVlKHJlcywgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQpOworCX0KKworCXByb3RlY3RlZCBKU09OQXJyYXkgZ2V0Rm9sbG93ZWRMaXN0QXNKc29uQXJyYXkoVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGdldEdvdmVybm9yRm9sbG93ZWQgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldEZvbGxvd2VkKHVzZXIpOworCQlhc3NlcnROb3ROdWxsKGdldEdvdmVybm9yRm9sbG93ZWQpOworCQlhc3NlcnROb3ROdWxsKGdldEdvdmVybm9yRm9sbG93ZWQuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoMjAwLCBnZXRHb3Zlcm5vckZvbGxvd2VkLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCUpTT05BcnJheSBsaXN0QXJyYXlGcm9tUmVzdFJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5nZXRMaXN0QXJyYXlGcm9tUmVzdFJlc3BvbnNlKGdldEdvdmVybm9yRm9sbG93ZWQpOworCisJCXJldHVybiBsaXN0QXJyYXlGcm9tUmVzdFJlc3BvbnNlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoYW5nZURpc3RyaWJ1dGlvblN0YXR1c09mQWxsU2VydmljZShib29sZWFuIGFwcHJvdmVkLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAoYXBwcm92ZWQpIHsKKwkJCWFwcHJvdmVEaXN0cmlidXRpb25TdGF0dXNPZkNlcnRpZmllZFNlcnZpY2Uoc2VydmljZURldGFpbHMxMSwgdXNlcik7CisJCQlhcHByb3ZlRGlzdHJpYnV0aW9uU3RhdHVzT2ZDZXJ0aWZpZWRTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzMjIsIHVzZXIpOworCQkJYXBwcm92ZURpc3RyaWJ1dGlvblN0YXR1c09mQ2VydGlmaWVkU2VydmljZShzZXJ2aWNlRGV0YWlsczMzLCB1c2VyKTsKKwkJfSBlbHNlIHsKKwkJCXJlamVjdERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZShzZXJ2aWNlRGV0YWlsczExLCB1c2VyKTsKKwkJCXJlamVjdERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZShzZXJ2aWNlRGV0YWlsczIyLCB1c2VyKTsKKwkJCXJlamVjdERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZShzZXJ2aWNlRGV0YWlsczMzLCB1c2VyKTsKKwkJfQorCisJfQorCisJcHJvdGVjdGVkIEpTT05BcnJheSBjaGVja0ZvbGxvd2VkKFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUpTT05BcnJheSBnZXRGb2xsb3dlZExpc3QgPSBnZXRGb2xsb3dlZExpc3RBc0pzb25BcnJheSh1c2VyKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0Rm9sbG93ZWRMaXN0LmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUoaXNFbGVtZW50SW5BcnJheShzZXJ2aWNlRGV0YWlsczExLmdldFVuaXF1ZUlkKCksIGdldEZvbGxvd2VkTGlzdCkpOworCQlhc3NlcnRUcnVlKGlzRWxlbWVudEluQXJyYXkoc2VydmljZURldGFpbHMyMi5nZXRVbmlxdWVJZCgpLCBnZXRGb2xsb3dlZExpc3QpKTsKKwkJYXNzZXJ0VHJ1ZShpc0VsZW1lbnRJbkFycmF5KHNlcnZpY2VEZXRhaWxzMzMuZ2V0VW5pcXVlSWQoKSwgZ2V0Rm9sbG93ZWRMaXN0KSk7CisKKwkJcmV0dXJuIGdldEZvbGxvd2VkTGlzdDsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVCBFIFMgVAorCS8vIFMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb3Zlcm5vckxpc3RfQWxsQ2VydGlmaWVkVmVyc2lvbnNPZlNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2VydGlmeUFsbFNlcnZpY2VzKCk7CisJCVN0cmluZyBzZXJ2aWNlVW5pcXVlSWRDZXJ0aWZpZWQxID0gc2VydmljZURldGFpbHMxMS5nZXRVbmlxdWVJZCgpOworCQlSZXN0UmVzcG9uc2UgcmVzID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlsczExLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgIjEuMCIsCisJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlKU09OQXJyYXkgZ2V0Rm9sbG93ZWRMaXN0ID0gZ2V0Rm9sbG93ZWRMaXN0QXNKc29uQXJyYXkoZ292ZXJub3IpOworCQlhc3NlcnRGYWxzZShnZXRGb2xsb3dlZExpc3QuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoaXNFbGVtZW50SW5BcnJheShzZXJ2aWNlRGV0YWlsczExLmdldFVuaXF1ZUlkKCksIGdldEZvbGxvd2VkTGlzdCkpOworCQlhc3NlcnRUcnVlKGlzRWxlbWVudEluQXJyYXkoc2VydmljZURldGFpbHMyMi5nZXRVbmlxdWVJZCgpLCBnZXRGb2xsb3dlZExpc3QpKTsKKwkJYXNzZXJ0VHJ1ZShpc0VsZW1lbnRJbkFycmF5KHNlcnZpY2VEZXRhaWxzMzMuZ2V0VW5pcXVlSWQoKSwgZ2V0Rm9sbG93ZWRMaXN0KSk7CisJCWFzc2VydFRydWUoaXNFbGVtZW50SW5BcnJheShzZXJ2aWNlVW5pcXVlSWRDZXJ0aWZpZWQxLCBnZXRGb2xsb3dlZExpc3QpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldEZvbGxvd2VkTGlzdC5zaXplKCkpOworCisJCS8vIGNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzMTEsICIxLjEiKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNlcnRpZnlTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzMTEpOworCisJCUpTT05BcnJheSBnb3Zlcm5vckZvbGxvd2VkTGlzdDIgPSBjaGVja0ZvbGxvd2VkKGdvdmVybm9yKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIGdvdmVybm9yRm9sbG93ZWRMaXN0Mi5zaXplKCkpOworCQlhc3NlcnRUcnVlKGlzRWxlbWVudEluQXJyYXkoc2VydmljZURldGFpbHMxMS5nZXRVbmlxdWVJZCgpLCBnb3Zlcm5vckZvbGxvd2VkTGlzdDIpKTsKKwkJYXNzZXJ0VHJ1ZShpc0VsZW1lbnRJbkFycmF5KHNlcnZpY2VVbmlxdWVJZENlcnRpZmllZDEsIGdvdmVybm9yRm9sbG93ZWRMaXN0MikpOworCisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVQgRSBTIFQKKwkvLyBTLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ292ZXJub3JMaXN0X2Rpc3RyaWJ1dGlvbk5vdEFwcHJvdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNlcnRpZnlBbGxTZXJ2aWNlcygpOworCisJCUpTT05BcnJheSBjaGVja0ZvbGxvd2VkID0gY2hlY2tGb2xsb3dlZChnb3Zlcm5vcik7CisJCWFzc2VydEVxdWFscygzLCBjaGVja0ZvbGxvd2VkLnNpemUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnb3Zlcm5vckdldEVtcHR5TGlzdFRlc3Rfbm90Q2VydGlmaWVkU2VydmljZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSlNPTkFycmF5IGdvdmVybm9yRm9sbG93ZWRMaXN0ID0gZ2V0Rm9sbG93ZWRMaXN0QXNKc29uQXJyYXkoZ292ZXJub3IpOworCisJCWFzc2VydFRydWUoZ292ZXJub3JGb2xsb3dlZExpc3QuaXNFbXB0eSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvdmVybm9yTGlzdF9kaXN0cmlidXRpb25BcHByb3ZlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljZXJ0aWZ5QWxsU2VydmljZXMoKTsKKwkJYm9vbGVhbiBhcHByb3ZlZCA9IHRydWU7CisJCWNoYW5nZURpc3RyaWJ1dGlvblN0YXR1c09mQWxsU2VydmljZShhcHByb3ZlZCwgZ292ZXJub3IpOworCisJCUpTT05BcnJheSBjaGVja0ZvbGxvd2VkID0gY2hlY2tGb2xsb3dlZChnb3Zlcm5vcik7CisJCWFzc2VydEVxdWFscygzLCBjaGVja0ZvbGxvd2VkLnNpemUoKSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdvdmVybm9yTGlzdF9kaXN0cmlidXRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljZXJ0aWZ5QWxsU2VydmljZXMoKTsKKworCQlMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlRGlzdHJpYnV0aW9uU3RhdHVzKHNlcnZpY2VEZXRhaWxzMTEsICIxLjAiLCBnb3Zlcm5vciwgdXNlclJlbWFya3MsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCk7CisJCUxpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VEaXN0cmlidXRpb25TdGF0dXMoc2VydmljZURldGFpbHMyMiwgIjEuMCIsIGdvdmVybm9yLCB1c2VyUmVtYXJrcywKKwkJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVEVEKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZURpc3RyaWJ1dGlvblN0YXR1cyhzZXJ2aWNlRGV0YWlsczMzLCAiMS4wIiwgZ292ZXJub3IsIHVzZXJSZW1hcmtzLAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVURUQpOworCisJCUpTT05BcnJheSBnb3Zlcm5vckZvbGxvd2VkTGlzdCA9IGdldEZvbGxvd2VkTGlzdEFzSnNvbkFycmF5KGdvdmVybm9yKTsKKwkJYXNzZXJ0RmFsc2UoZ292ZXJub3JGb2xsb3dlZExpc3QuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShpc0VsZW1lbnRJbkFycmF5KHNlcnZpY2VEZXRhaWxzMTEuZ2V0VW5pcXVlSWQoKSwgZ292ZXJub3JGb2xsb3dlZExpc3QpKTsKKwkJYXNzZXJ0VHJ1ZShpc0VsZW1lbnRJbkFycmF5KHNlcnZpY2VEZXRhaWxzMjIuZ2V0VW5pcXVlSWQoKSwgZ292ZXJub3JGb2xsb3dlZExpc3QpKTsKKwkJYXNzZXJ0VHJ1ZShpc0VsZW1lbnRJbkFycmF5KHNlcnZpY2VEZXRhaWxzMzMuZ2V0VW5pcXVlSWQoKSwgZ292ZXJub3JGb2xsb3dlZExpc3QpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdvdmVybm9yTGlzdF9kaXN0cmlidXRpb25SZWplY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljZXJ0aWZ5QWxsU2VydmljZXMoKTsKKwkJYm9vbGVhbiBkaXN0cmlidXRpb25SZWplY3RlZCA9IGZhbHNlOworCQljaGFuZ2VEaXN0cmlidXRpb25TdGF0dXNPZkFsbFNlcnZpY2UoZGlzdHJpYnV0aW9uUmVqZWN0ZWQsIGdvdmVybm9yKTsKKworCQlKU09OQXJyYXkgY2hlY2tGb2xsb3dlZCA9IGNoZWNrRm9sbG93ZWQoZ292ZXJub3IpOworCQlhc3NlcnRFcXVhbHMoMywgY2hlY2tGb2xsb3dlZC5zaXplKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGVPblVHTi9kaXN0cmlidXRpb25DbGllbnQvQ2xpZW50Q29uZmlndXJhdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGVPblVHTi9kaXN0cmlidXRpb25DbGllbnQvQ2xpZW50Q29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGY2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZU9uVUdOL2Rpc3RyaWJ1dGlvbkNsaWVudC9DbGllbnRDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlT25VR04uZGlzdHJpYnV0aW9uQ2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIENsaWVudENvbmZpZ3VyYXRpb24geworCisJcHJpdmF0ZSBTdHJpbmcgYXNkY0FkZHJlc3M7CisJcHJpdmF0ZSBTdHJpbmcgdXNlcjsKKwlwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKwlwcml2YXRlIEludGVnZXIgcG9sbGluZ0ludGVydmFsOworCXByaXZhdGUgSW50ZWdlciBwb2xsaW5nVGltZW91dDsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiByZWxldmFudEFydGlmYWN0VHlwZXM7CisJcHJpdmF0ZSBTdHJpbmcgY29uc3VtZXJHcm91cDsKKwlwcml2YXRlIFN0cmluZyBlbnZpcm9ubWVudE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgY29uc3VtZXJJRDsKKworCXB1YmxpYyBDbGllbnRDb25maWd1cmF0aW9uKCkgeworCisJCXN1cGVyKCk7CisKKwkJdGhpcy5hc2RjQWRkcmVzcyA9ICJsb2NhbGhvc3Q6ODQ0MyI7CisJCXRoaXMuY29uc3VtZXJJRCA9ICJtc28tMTIzNDU2IjsKKwkJdGhpcy5jb25zdW1lckdyb3VwID0gIm1zby1ncm91cCI7CisJCXRoaXMuZW52aXJvbm1lbnROYW1lID0gIlBST0QiOworCQl0aGlzLnBhc3N3b3JkID0gInBhc3N3b3JkIjsKKwkJdGhpcy5wb2xsaW5nSW50ZXJ2YWwgPSAyMDsKKwkJdGhpcy5wb2xsaW5nVGltZW91dCA9IDIwOworCQl0aGlzLnJlbGV2YW50QXJ0aWZhY3RUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0aGlzLnJlbGV2YW50QXJ0aWZhY3RUeXBlcy5hZGQoIlNIRUxMIik7CisJCXRoaXMudXNlciA9ICJtc28tdXNlciI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBc2RjQWRkcmVzcygpIHsKKwkJcmV0dXJuIGFzZGNBZGRyZXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFzZGNBZGRyZXNzKFN0cmluZyBhc2RjQWRkcmVzcykgeworCQl0aGlzLmFzZGNBZGRyZXNzID0gYXNkY0FkZHJlc3M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VyKCkgeworCQlyZXR1cm4gdXNlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyKSB7CisJCXRoaXMudXNlciA9IHVzZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKwkJcmV0dXJuIHBhc3N3b3JkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisJfQorCisJcHVibGljIGludCBnZXRQb2xsaW5nSW50ZXJ2YWwoKSB7CisJCXJldHVybiBwb2xsaW5nSW50ZXJ2YWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0UG9sbGluZ0ludGVydmFsKEludGVnZXIgcG9sbGluZ0ludGVydmFsKSB7CisJCXRoaXMucG9sbGluZ0ludGVydmFsID0gcG9sbGluZ0ludGVydmFsOworCX0KKworCXB1YmxpYyBpbnQgZ2V0UG9sbGluZ1RpbWVvdXQoKSB7CisJCXJldHVybiBwb2xsaW5nVGltZW91dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQb2xsaW5nVGltZW91dChJbnRlZ2VyIHBvbGxpbmdUaW1lb3V0KSB7CisJCXRoaXMucG9sbGluZ1RpbWVvdXQgPSBwb2xsaW5nVGltZW91dDsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlbGV2YW50QXJ0aWZhY3RUeXBlcygpIHsKKwkJcmV0dXJuIHJlbGV2YW50QXJ0aWZhY3RUeXBlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWxldmFudEFydGlmYWN0VHlwZXMoTGlzdDxTdHJpbmc+IHJlbGV2YW50QXJ0aWZhY3RUeXBlcykgeworCQl0aGlzLnJlbGV2YW50QXJ0aWZhY3RUeXBlcyA9IHJlbGV2YW50QXJ0aWZhY3RUeXBlczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVyR3JvdXAoKSB7CisJCXJldHVybiBjb25zdW1lckdyb3VwOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVyR3JvdXAoU3RyaW5nIGNvbnN1bWVyR3JvdXApIHsKKwkJdGhpcy5jb25zdW1lckdyb3VwID0gY29uc3VtZXJHcm91cDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVudmlyb25tZW50TmFtZSgpIHsKKwkJcmV0dXJuIGVudmlyb25tZW50TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudE5hbWUoU3RyaW5nIGVudmlyb25tZW50TmFtZSkgeworCQl0aGlzLmVudmlyb25tZW50TmFtZSA9IGVudmlyb25tZW50TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbXN1bWVySUQoKSB7CisJCXJldHVybiBjb25zdW1lcklEOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbXN1bWVySUQoU3RyaW5nIGNvbXN1bWVySUQpIHsKKwkJdGhpcy5jb25zdW1lcklEID0gY29tc3VtZXJJRDsKKwl9CisKKwlwdWJsaWMgQ2xpZW50Q29uZmlndXJhdGlvbihTdHJpbmcgYXNkY0FkZHJlc3MsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIEludGVnZXIgcG9sbGluZ0ludGVydmFsLAorCQkJSW50ZWdlciBwb2xsaW5nVGltZW91dCwgTGlzdDxTdHJpbmc+IHJlbGV2YW50QXJ0aWZhY3RUeXBlcywgU3RyaW5nIGNvbnN1bWVyR3JvdXAsIFN0cmluZyBlbnZpcm9ubWVudE5hbWUsCisJCQlTdHJpbmcgY29tc3VtZXJJRCkgeworCQlzdXBlcigpOworCQl0aGlzLmFzZGNBZGRyZXNzID0gYXNkY0FkZHJlc3M7CisJCXRoaXMudXNlciA9IHVzZXI7CisJCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKwkJdGhpcy5wb2xsaW5nSW50ZXJ2YWwgPSBwb2xsaW5nSW50ZXJ2YWw7CisJCXRoaXMucG9sbGluZ1RpbWVvdXQgPSBwb2xsaW5nVGltZW91dDsKKwkJdGhpcy5yZWxldmFudEFydGlmYWN0VHlwZXMgPSByZWxldmFudEFydGlmYWN0VHlwZXM7CisJCXRoaXMuY29uc3VtZXJHcm91cCA9IGNvbnN1bWVyR3JvdXA7CisJCXRoaXMuZW52aXJvbm1lbnROYW1lID0gZW52aXJvbm1lbnROYW1lOworCQl0aGlzLmNvbnN1bWVySUQgPSBjb21zdW1lcklEOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3ByZVJlcXVpc2l0ZXMvQ29tcGxleFJlc291cmNlQmFzZVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wcmVSZXF1aXNpdGVzL0NvbXBsZXhSZXNvdXJjZUJhc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjN2EzNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wcmVSZXF1aXNpdGVzL0NvbXBsZXhSZXNvdXJjZUJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wcmVSZXF1aXNpdGVzOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU2Jhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV4UmVzb3VyY2VCYXNlVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZGQzsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsc1ZMOworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzVkY7CisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHNDUDsKKwlwcm90ZWN0ZWQgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkY7CisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGQzsKKwlwcm90ZWN0ZWQgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkw7CisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc0NQOworCXByb3RlY3RlZCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHMxOworCXByb3RlY3RlZCBVc2VyIHNkbmNUZXN0ZXJEZWF0YWlsczE7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluRGV0YWlsczE7CisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzOworCisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBkZWZhdWx0QXJ0aWZhY3REZXRhaWxzOworCXByb3RlY3RlZCBpbnQgbWF4TGVuZ3RoID0gNTA7CisJcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlVkYgPSBudWxsOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBDb21wbGV4UmVzb3VyY2VCYXNlVGVzdCgpIHsKKwkJc3VwZXIobmFtZSwgQ29tcGxleFJlc291cmNlQmFzZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaW5pdGlhbGl6ZU1lbWJlcnMoKTsKKworCQljcmVhdGVDb21wb25lbnRzKCk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplTWVtYmVycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCXJlc291cmNlRGV0YWlsc1ZGQyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQywgInJlc291cmNlVkZDIik7CisJCXJlc291cmNlRGV0YWlsc1ZGID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsICJyZXNvdXJjZVZGMyIpOworCQlyZXNvdXJjZURldGFpbHNWTCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZMLCAicmVzb3VyY2VWTCIpOworCQlyZXNvdXJjZURldGFpbHNDUCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLCAicmVzb3VyY2VDUCIpOworCQlzZG5jRGVzaWduZXJEZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCXNkbmNUZXN0ZXJEZWF0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJc2RuY0FkbWluRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCQloZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCWFzc2VydE5vdE51bGwoInNlcnZpY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCBzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlyZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlsc1ZGQywgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlhc3NlcnROb3ROdWxsKCJyZXNvdXJjZSB1bmlxdWVJZCBpcyBudWxsOiIsIHJlc291cmNlRGV0YWlsc1ZGQy5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWRkMsIHNkbmNEZXNpZ25lckRldGFpbHMxLAorCQkJCXJlc291cmNlRGV0YWlsc1ZGQy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTik7CisJCWFzc2VydFRydWUoImNoYW5nZSBMUyBzdGF0ZSB0byBDSEVDS0lOLCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHNWRiwgc2RuY0Rlc2lnbmVyRGV0YWlsczEpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCQlhc3NlcnROb3ROdWxsKCJyZXNvdXJjZSB1bmlxdWVJZCBpcyBudWxsOiIsIHJlc291cmNlRGV0YWlsc1ZGLmdldFVuaXF1ZUlkKCkpOworCisJCXJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzQ1AsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJYXNzZXJ0VHJ1ZSgiY3JlYXRlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkJYXNzZXJ0Tm90TnVsbCgicmVzb3VyY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCByZXNvdXJjZURldGFpbHNDUC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNDUCwgc2RuY0Rlc2lnbmVyRGV0YWlsczEsCisJCQkJcmVzb3VyY2VEZXRhaWxzQ1AuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRUcnVlKCJjaGFuZ2UgTFMgc3RhdGUgdG8gQ0hFQ0tJTiwgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCXJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzVkwsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJYXNzZXJ0VHJ1ZSgiY3JlYXRlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkJYXNzZXJ0Tm90TnVsbCgicmVzb3VyY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCByZXNvdXJjZURldGFpbHNWTC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHNWTCwgc2RuY0Rlc2lnbmVyRGV0YWlsczEsCisJCQkJcmVzb3VyY2VEZXRhaWxzVkwuZ2V0VmVyc2lvbigpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4pOworCQlhc3NlcnRUcnVlKCJjaGFuZ2UgTFMgc3RhdGUgdG8gQ0hFQ0tJTiwgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzVkZDID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKCJWRkMiLCByZXNvdXJjZURldGFpbHNWRkMpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsc1ZGID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKCJWRiIsIHJlc291cmNlRGV0YWlsc1ZGKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHNWTCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRDb21wb25lbnRJbnN0YW5jZSgiVkwiLCByZXNvdXJjZURldGFpbHNWTCk7CisJCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzQ1AgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoIkNQIiwgcmVzb3VyY2VEZXRhaWxzQ1ApOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVkZXaXRoQ2VydGlmaWVkUmVzb3VyY2VJbnN0YW5jZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLAorCQkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxLAorCQkJCXJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgQ0hFQ0tPVVQiLCAyMDAsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCS8vIGFkZCBoZWF0IGFydGlmYWN0IHRvIHJlc291cmNlIGFuZCBjZXJ0aWZ5CisJCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCXJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoImFkZCBIRUFUIGFydGlmYWN0IHRvIHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlyZXNwb25zZSA9IExDU2Jhc2VUZXN0LmNlcnRpZnlSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIENFUlRJRlkgcmVxdWVzdCIsIDIwMCwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmVzb3VyY2VWRiA9IGNvbnZlcnRSZXNvdXJjZUdldFJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGKTsKKworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRDb21wb25lbnRVaWQocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwKKwkJCQlyZXNvdXJjZVZGKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSBSSSIsIDIwMSwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmVzb3VyY2VWRiA9IGNvbnZlcnRSZXNvdXJjZUdldFJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlRGV0YWlsc1ZGKTsKKwl9CisKKwlwcm90ZWN0ZWQgUmVzb3VyY2UgY29udmVydFJlc291cmNlR2V0UmVzcG9uc2VUb0phdmFPYmplY3QoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBnZXQgcmVzb3VyY2UiLCAyMDAsIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXR1cm4gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcHJlUmVxdWlzaXRlcy9Eb3dubG9hZEFydGlmYWN0QmFzZVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wcmVSZXF1aXNpdGVzL0Rvd25sb2FkQXJ0aWZhY3RCYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTY4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcHJlUmVxdWlzaXRlcy9Eb3dubG9hZEFydGlmYWN0QmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnByZVJlcXVpc2l0ZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5sZjUudXRpbC5SZXNvdXJjZVV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTYmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuQXJ0aWZhY3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5BcnRpZmFjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKKworcHVibGljIGNsYXNzIERvd25sb2FkQXJ0aWZhY3RCYXNlVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBSZXNvdXJjZVJlcURldGFpbHMgZG93bmxvYWRSZXNvdXJjZURldGFpbHM7CisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzOworCXByb3RlY3RlZCBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHM7CisJcHJvdGVjdGVkIFVzZXIgc2RuY1VzZXJEZXRhaWxzOworCXByb3RlY3RlZCBVc2VyIHNkbmNEZXNpZ25lckRldGFpbHMxOworCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlsczsKKworCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0RGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VVdGlscyByZXNvdXJjZVV0aWxzOworCXByb3RlY3RlZCBBcnRpZmFjdFV0aWxzIGFydGlmYWN0VXRpbHM7CisJcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZTsKKworCXB1YmxpYyBEb3dubG9hZEFydGlmYWN0QmFzZVRlc3QoVGVzdE5hbWUgdGVzdE5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJc3VwZXIodGVzdE5hbWUsIGNsYXNzTmFtZSk7CisJfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCWluaXRpYWxpemVNZW1iZXJzKCk7CisJCWNyZWF0ZUNvbXBvbmVudHMoKTsKKworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZW1iZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlkb3dubG9hZFJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlzZXJ2aWNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCXNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCXNkbmNEZXNpZ25lckRldGFpbHMxID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRDb21wb25lbnRJbnN0YW5jZSgpOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29tcG9uZW50cygpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKGRvd25sb2FkUmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisJCUFzc2VydEpVbml0LmFzc2VydE5vdE51bGwoInJlc291cmNlIHVuaXF1ZUlkIGlzIG51bGw6IiwgZG93bmxvYWRSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJcmVzcG9uc2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGhlYXRBcnRpZmFjdERldGFpbHMsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlkb3dubG9hZFJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgiYWRkIEhFQVQgYXJ0aWZhY3QgdG8gcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJLy8gY2VydGlmaWVkIHJlc291cmNlCisJCXJlc3BvbnNlID0gTENTYmFzZVRlc3QuY2VydGlmeVJlc291cmNlKGRvd25sb2FkUmVzb3VyY2VEZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoImNlcnRpZnkgcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisKKwkJcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbCgic2VydmljZSB1bmlxdWVJZCBpcyBudWxsOiIsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIGFkZCByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIEhFQVQgZGVwbG95bWVudCBhcnRpZmFjdCB0byB0aGUgc2VydmljZQorCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscy5zZXRDb21wb25lbnRVaWQoZG93bmxvYWRSZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMsIHNkbmNVc2VyRGV0YWlscywKKwkJCQlzZXJ2aWNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAxLCByZXR1cm5lZDogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLAorCQkJCXJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisKKwkJcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNVc2VyRGV0YWlscyk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMCwgcmV0dXJuZWQ6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcHJlUmVxdWlzaXRlcy9TaW1wbGVPbmVSc3JjT25lU2VydmljZVRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wcmVSZXF1aXNpdGVzL1NpbXBsZU9uZVJzcmNPbmVTZXJ2aWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDA2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcHJlUmVxdWlzaXRlcy9TaW1wbGVPbmVSc3JjT25lU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucHJlUmVxdWlzaXRlczsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5sZjUudXRpbC5SZXNvdXJjZVV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuQXJ0aWZhY3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2ltcGxlT25lUnNyY09uZVNlcnZpY2VUZXN0IGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisJcHJvdGVjdGVkIFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzOworCXByb3RlY3RlZCBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHM7CisJcHJvdGVjdGVkIEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzMTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBoZWF0RXh0ZW5zaW9uID0gInlhbWwiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB5YW5nWG1sRXh0ZW5zaW9uID0gInhtbCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG11cmFub1BrZ0V4dGVuc2lvbiA9ICJ6aXAiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHRlbnNpb24gPSBudWxsOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGZvbGRlck5hbWUgPSAiaGVhdEVudiI7CisKKwlwcm90ZWN0ZWQgVXNlciBzZG5jRGVzaWduZXJEZXRhaWxzOworCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0RGV0YWlsczsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VVdGlscyByZXNvdXJjZVV0aWxzOworCXByb3RlY3RlZCBBcnRpZmFjdFV0aWxzIGFydGlmYWN0VXRpbHM7CisJcHJvdGVjdGVkIFV0aWxzIHV0aWxzOworCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VSZXNwb25zZTsKKworCXB1YmxpYyBTaW1wbGVPbmVSc3JjT25lU2VydmljZVRlc3QoVGVzdE5hbWUgdGVzdE5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJc3VwZXIodGVzdE5hbWUsIGNsYXNzTmFtZSk7CisJfQorCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCWluaXRpYWxpemVNZW1iZXJzKCk7CisJCWNyZWF0ZUNvbXBvbmVudHMoKTsKKworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZW1iZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlzZG5jRGVzaWduZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJCXNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0RGVwbG95bWVudEFydGlmYWN0Rm9yVHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoInJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzIik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29tcG9uZW50cygpIHRocm93cyBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisKKwkJcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDEpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcnVsZXMvTXlUZXN0V2F0Y2hlci5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3J1bGVzL015VGVzdFdhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTYxMzFjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3J1bGVzL015VGVzdFdhdGNoZXIuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucnVsZXM7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFdhdGNoZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuU2RjVGVzdDsKKworcHVibGljIGNsYXNzIE15VGVzdFdhdGNoZXIgZXh0ZW5kcyBUZXN0V2F0Y2hlciB7CisKKwlTZGNUZXN0IG9kbFRlc3Q7CisKKwlwdWJsaWMgTXlUZXN0V2F0Y2hlcihTZGNUZXN0IG9kbFRlc3QpIHsKKwkJdGhpcy5vZGxUZXN0ID0gb2RsVGVzdDsKKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIHdoZW4gYSB0ZXN0IHN1Y2NlZWRzCisJICogCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc3VjY2VlZGVkKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisJCVN0cmluZyB0ZXN0TmFtZSA9IGRlc2NyaXB0aW9uLmdldE1ldGhvZE5hbWUoKTsKKwkJb2RsVGVzdC5hZGRUZXN0U3VtbWFyeSh0ZXN0TmFtZSwgdHJ1ZSk7CisKKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIHdoZW4gYSB0ZXN0IGZhaWxzCisJICogCisJICogQHBhcmFtIGUKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIGUsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisJCVN0cmluZyB0ZXN0TmFtZSA9IGRlc2NyaXB0aW9uLmdldE1ldGhvZE5hbWUoKTsKKwkJb2RsVGVzdC5hZGRUZXN0U3VtbWFyeSh0ZXN0TmFtZSwgZmFsc2UsIGUpOworCX0KKworCS8qKgorCSAqIEludm9rZWQgd2hlbiBhIHRlc3QgaXMgYWJvdXQgdG8gc3RhcnQKKwkgKiAKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzdGFydGluZyhEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb3RlY3RlZCB2b2lkIHN0YXJ0aW5nKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKQorCQkvLyB7Iik7CisJCXRoaXMub2RsVGVzdC5nZXRMb2dnZXIoKS5kZWJ1ZygiU3RhcnQgcnVubmluZyB0ZXN0IHt9IiwgZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBJbnZva2VkIHdoZW4gYSB0ZXN0IG1ldGhvZCBmaW5pc2hlcyAod2hldGhlciBwYXNzaW5nIG9yIGZhaWxpbmcpCisJICogCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZChEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikKKwkJLy8geyIpOworCQl0aGlzLm9kbFRlc3QuZ2V0TG9nZ2VyKCkuZGVidWcoIkZpbmlzaCBydW5uaW5nIHRlc3Qge30iLCBkZXNjcmlwdGlvbi5nZXRNZXRob2ROYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9ydW4vRXh0ZW50UmVwb3J0ZXJORy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3J1bi9FeHRlbnRSZXBvcnRlck5HLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExOTI2MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9ydW4vRXh0ZW50UmVwb3J0ZXJORy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLklSZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLklSZXN1bHRNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IGNvbS5yZWxldmFudGNvZGVzLmV4dGVudHJlcG9ydHMuRXh0ZW50UmVwb3J0czsKK2ltcG9ydCBjb20ucmVsZXZhbnRjb2Rlcy5leHRlbnRyZXBvcnRzLkV4dGVudFRlc3Q7CitpbXBvcnQgY29tLnJlbGV2YW50Y29kZXMuZXh0ZW50cmVwb3J0cy5Mb2dTdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBFeHRlbnRSZXBvcnRlck5HIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKKwlwcml2YXRlIEV4dGVudFJlcG9ydHMgZXh0ZW50OworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzLCBMaXN0PElTdWl0ZT4gc3VpdGVzLCBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CisJCWV4dGVudCA9IG5ldyBFeHRlbnRSZXBvcnRzKG91dHB1dERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgIkV4dGVudFJlcG9ydHNUZXN0TkcuaHRtbCIsIHRydWUpOworCisJCWZvciAoSVN1aXRlIHN1aXRlIDogc3VpdGVzKSB7CisJCQlNYXA8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IHJlc3VsdCA9IHN1aXRlLmdldFJlc3VsdHMoKTsKKworCQkJZm9yIChJU3VpdGVSZXN1bHQgciA6IHJlc3VsdC52YWx1ZXMoKSkgeworCQkJCUlUZXN0Q29udGV4dCBjb250ZXh0ID0gci5nZXRUZXN0Q29udGV4dCgpOworCisJCQkJYnVpbGRUZXN0Tm9kZXMoY29udGV4dC5nZXRQYXNzZWRUZXN0cygpLCBMb2dTdGF0dXMuUEFTUyk7CisJCQkJYnVpbGRUZXN0Tm9kZXMoY29udGV4dC5nZXRGYWlsZWRUZXN0cygpLCBMb2dTdGF0dXMuRkFJTCk7CisJCQkJYnVpbGRUZXN0Tm9kZXMoY29udGV4dC5nZXRTa2lwcGVkVGVzdHMoKSwgTG9nU3RhdHVzLlNLSVApOworCQkJfQorCQl9CisKKwkJZXh0ZW50LmZsdXNoKCk7CisJCWV4dGVudC5jbG9zZSgpOworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZFRlc3ROb2RlcyhJUmVzdWx0TWFwIHRlc3RzLCBMb2dTdGF0dXMgc3RhdHVzKSB7CisJCUV4dGVudFRlc3QgdGVzdDsKKworCQlpZiAodGVzdHMuc2l6ZSgpID4gMCkgeworCQkJZm9yIChJVGVzdFJlc3VsdCByZXN1bHQgOiB0ZXN0cy5nZXRBbGxSZXN1bHRzKCkpIHsKKwkJCQl0ZXN0ID0gZXh0ZW50LnN0YXJ0VGVzdChyZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKTsKKworCQkJCXRlc3QuZ2V0VGVzdCgpLnNldFN0YXJ0ZWRUaW1lKGdldFRpbWUocmVzdWx0LmdldFN0YXJ0TWlsbGlzKCkpKTsKKwkJCQl0ZXN0LmdldFRlc3QoKS5zZXRFbmRlZFRpbWUoZ2V0VGltZShyZXN1bHQuZ2V0RW5kTWlsbGlzKCkpKTsKKworCQkJCWZvciAoU3RyaW5nIGdyb3VwIDogcmVzdWx0LmdldE1ldGhvZCgpLmdldEdyb3VwcygpKQorCQkJCQl0ZXN0LmFzc2lnbkNhdGVnb3J5KGdyb3VwKTsKKworCQkJCVN0cmluZyBtZXNzYWdlID0gIlRlc3QgIiArIHN0YXR1cy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgKyAiZWQiOworCisJCQkJaWYgKHJlc3VsdC5nZXRUaHJvd2FibGUoKSAhPSBudWxsKQorCQkJCQltZXNzYWdlID0gcmVzdWx0LmdldFRocm93YWJsZSgpLmdldE1lc3NhZ2UoKTsKKworCQkJCXRlc3QubG9nKHN0YXR1cywgbWVzc2FnZSk7CisKKwkJCQlleHRlbnQuZW5kVGVzdCh0ZXN0KTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgRGF0ZSBnZXRUaW1lKGxvbmcgbWlsbGlzKSB7CisJCUNhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJY2FsZW5kYXIuc2V0VGltZUluTWlsbGlzKG1pbGxpcyk7CisJCXJldHVybiBjYWxlbmRhci5nZXRUaW1lKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3J1bi9TdGFydFRlc3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9ydW4vU3RhcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4OTVhMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9ydW4vU3RhcnRUZXN0LmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworCitwdWJsaWMgY2xhc3MgU3RhcnRUZXN0IHsKKworCXB1YmxpYyBzdGF0aWMgbG9uZyB0aW1lT2ZUZXN0ID0gMDsKKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisJcHVibGljIHN0YXRpYyBBdG9taWNCb29sZWFuIGxvZ2dlckluaXRpYWxpemVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisJcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKworCQlTdHJpbmcgZGVidWdFbmFibGVkID0gU3lzdGVtLmdldFByb3BlcnR5KCJkZWJ1ZyIpOworCQlpZiAoZGVidWdFbmFibGVkICE9IG51bGwgJiYgZGVidWdFbmFibGVkLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworCQkJZGVidWcgPSB0cnVlOworCQl9CisJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVidWcgbW9kZSBpcyAiICsgKGRlYnVnID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOworCisJCWVuYWJsZUxvZ2dlcigpOworCisJCUNvbmZpZyBjb25maWcgPSBudWxsOworCQl0cnkgeworCQkJY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwkJaWYgKGNvbmZpZyA9PSBudWxsKSB7CisJCQlsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBjb25maWd1cmF0aW9uIGZpbGUgb2YgY2kgdGVzdHMuIik7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCS8vIG5lZWQgdG8gdXBkYXRlCisJCS8vIExpc3Q8U3RyaW5nPiBwYWNrYWdlc1RvUnVuID0gY29uZmlnLmdldFBhY2thZ2VzKCk7CisJCS8vIGlmIChwYWNrYWdlc1RvUnVuID09IG51bGwgfHwgdHJ1ZSA9PSBwYWNrYWdlc1RvUnVuLmlzRW1wdHkoKSkgeworCQkvLyBsb2dnZXIuZXJyb3IoIk5vIHBhY2thZ2Ugd2FzIGNvbmZpZ3VyZWQgdG8gYmUgZXhlY3V0ZWQuIik7CisJCS8vIFN5c3RlbS5leGl0KDIpOworCQkvLyB9CisJCS8vIFN0YXJ0VGVzdCB0ZXN0cyA9IG5ldyBTdGFydFRlc3QoKTsKKworCQkvLyBzdG9wIG9uIGVycm9yIGxvZ2ljCisJCS8vIGJvb2xlYW4gc3RvcE9uQ2xhc3NGYWlsdXJlID0gZmFsc2U7CisJCS8vIFN0cmluZyBzdG9wT25DbGFzc0ZhaWx1cmVTdHIgPQorCQkvLyBTeXN0ZW0uZ2V0UHJvcGVydHkoInN0b3BPbkNsYXNzRmFpbHVyZSIpOworCQkvLyBpZiAoc3RvcE9uQ2xhc3NGYWlsdXJlU3RyICE9IG51bGwgJiYKKwkJLy8gc3RvcE9uQ2xhc3NGYWlsdXJlU3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworCQkvLyBzdG9wT25DbGFzc0ZhaWx1cmUgPSB0cnVlOworCQkvLyB9IGVsc2UgeworCQkvLyBCb29sZWFuIHN0b3BPbkNsYXNzRmFpbHVyZU9iaiA9IGNvbmZpZy5pc1N0b3BPbkNsYXNzRmFpbHVyZSgpOworCQkvLyBpZiAoc3RvcE9uQ2xhc3NGYWlsdXJlT2JqICE9IG51bGwpIHsKKwkJLy8gc3RvcE9uQ2xhc3NGYWlsdXJlID0gc3RvcE9uQ2xhc3NGYWlsdXJlT2JqLmJvb2xlYW5WYWx1ZSgpOworCQkvLyB9CisJCS8vIH0KKwkJLy8KKworCQkvLyB0ZXN0cy5zdGFydChwYWNrYWdlc1RvUnVuLCBzdG9wT25DbGFzc0ZhaWx1cmUpOworCisJCS8vIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKwkJLy8KKwkJLy8gVGVzdEhUTUxSZXBvcnRlciByZXBvcnQgPSBuZXcgVGVzdEhUTUxSZXBvcnRlcigpOworCQkvLy8vIHJlcG9ydC4KKworCQlUZXN0TkcgdGVzdG5nID0gbmV3IFRlc3RORygpOworCisJCUxpc3Q8U3RyaW5nPiBzdWl0ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJc3VpdGVzLmFkZCgidGVzdFN1aXRlcy8iICsgYXJnc1swXSk7CisJCXRlc3RuZy5zZXRUZXN0U3VpdGVzKHN1aXRlcyk7CisJCS8vIHRlc3RuZy5hZGRMaXN0ZW5lcih0bGEpOworCQl0ZXN0bmcuc2V0VXNlRGVmYXVsdExpc3RlbmVycyh0cnVlKTsKKwkJdGVzdG5nLnNldE91dHB1dERpcmVjdG9yeSgidGFyZ2V0LyIpOworCisJCVN0YXJ0VGVzdCB0ZXN0cyA9IG5ldyBTdGFydFRlc3QoKTsKKwkJLy8gdGVzdG5nLnNldFByZXNlcnZlT3JkZXIodHJ1ZSk7CisJCS8vIHRlc3RuZy5zZXRWZXJib3NlKDIpOworCQkvLyB0ZXN0bmcuc2V0U3VpdGVUaHJlYWRQb29sU2l6ZSgxKTsKKwkJLy8gdGVzdG5nLnNldFRocmVhZENvdW50KDEpOworCQl0ZXN0bmcucnVuKCk7CisKKwl9CisKKwlwdWJsaWMgU3RhcnRUZXN0KCkgeworCQlsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFN0YXJ0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVMb2dnZXIoKSB7CisKKwkJaWYgKGZhbHNlID09IGxvZ2dlckluaXRpYWxpemVkLmdldCgpKSB7CisKKwkJCWxvZ2dlckluaXRpYWxpemVkLnNldCh0cnVlKTsKKworCQkJU3RyaW5nIGxvZzRqUHJvcHNGaWxlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsb2c0ai5jb25maWd1cmF0aW9uIik7CisJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuY29udGFpbnMoIldpbmRvd3MiKSkgeworCQkJCVN0cmluZyBsb2dQcm9wcyA9ICJzcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9sb2c0ai5wcm9wZXJ0aWVzIjsKKwkJCQlpZiAobG9nNGpQcm9wc0ZpbGUgPT0gbnVsbCkgeworCQkJCQlTeXN0ZW0uc2V0UHJvcGVydHkoInRhcmdldGxvZyIsICJ0YXJnZXQvIik7CisJCQkJCWxvZzRqUHJvcHNGaWxlID0gbG9nUHJvcHM7CisJCQkJfQorCisJCQl9CisJCQlQcm9wZXJ0eUNvbmZpZ3VyYXRvci5jb25maWd1cmVBbmRXYXRjaChsb2c0alByb3BzRmlsZSk7CisKKwkJfQorCX0KKworCS8vIGxvZ2dlci5kZWJ1ZygiR29pbmcgdG8gcnVuIHRlc3QgY2xhc3Mge30iLCB0ZXN0Q2xhc3MuZ2V0TmFtZSgpKTsKKwkvLyBsb2dnZXIuZGVidWcoIlRlc3QgY2xhc3Mge30gZmluaXNoZWQge30iLCB0ZXN0Q2xhc3MuZ2V0TmFtZSgpLCAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSA/ICJPSy4iIDogIiBXSVRIIEVSUk9SLiIpKTsKKwkvLyBsb2dnZXIuZGVidWcoImNsYXNzIHt9IGZhaWxlZCB0ZXN0czoge30iLCB0ZXN0Q2xhc3MuZ2V0TmFtZSgpLCAoZmFpbHVyZXNQZXJDbGFzcyAqIDEuMCkgLyBydW5zUGVyQ2xhc3MgKiAxMDAgKyAiICUiKTsKKwkvLyBsb2dnZXIuZGVidWcoImNsYXNzIHt9IGlnbm9yZWQgdGVzdHM6IHt9IiwgdGVzdENsYXNzLmdldE5hbWUoKSwgKGlnbm9yZWRQZXJDbGFzcyAqIDEuMCkgLyBydW5zUGVyQ2xhc3MgKiAxMDAgKyAiICUiKTsKKwlwcml2YXRlIExpc3Q8Q2xhc3M+IGdldENsYXNzZXNGb3JQYWNrYWdlKFN0cmluZyBwa2duYW1lKSB7CisKKwkJTGlzdDxDbGFzcz4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7CisKKwkJLy8gR2V0IGEgRmlsZSBvYmplY3QgZm9yIHRoZSBwYWNrYWdlCisJCUZpbGUgZGlyZWN0b3J5ID0gbnVsbDsKKwkJU3RyaW5nIGZ1bGxQYXRoOworCQlTdHJpbmcgcmVsUGF0aCA9IHBrZ25hbWUucmVwbGFjZSgnLicsICcvJyk7CisKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogUGFja2FnZTogIiArIHBrZ25hbWUgKworCQkvLyAiIGJlY29tZXMgUGF0aDoiICsgcmVsUGF0aCk7CisKKwkJVVJMIHJlc291cmNlID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShyZWxQYXRoKTsKKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBSZXNvdXJjZSA9ICIgKyByZXNvdXJjZSk7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gcmVzb3VyY2UgZm9yICIgKyByZWxQYXRoKTsKKwkJfQorCQlmdWxsUGF0aCA9IHJlc291cmNlLmdldEZpbGUoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogRnVsbFBhdGggPSAiICsgcmVzb3VyY2UpOworCisJCWlmIChkZWJ1ZykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJmdWxsUGF0aCBpcyAiICsgZnVsbFBhdGgpOworCQl9CisKKwkJdHJ5IHsKKwkJCWRpcmVjdG9yeSA9IG5ldyBGaWxlKHJlc291cmNlLnRvVVJJKCkpOworCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisJCQkJCXBrZ25hbWUgKyAiICgiICsgcmVzb3VyY2UKKwkJCQkJCQkrICIpIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIFVSTCAvIFVSSS4gIFN0cmFuZ2UsIHNpbmNlIHdlIGdvdCBpdCBmcm9tIHRoZSBzeXN0ZW0uLi4iLAorCQkJCQllKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCWRpcmVjdG9yeSA9IG51bGw7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogRGlyZWN0b3J5ID0gIiArIGRpcmVjdG9yeSk7CisKKwkJaWYgKGRpcmVjdG9yeSAhPSBudWxsICYmIGRpcmVjdG9yeS5leGlzdHMoKSkgeworCisJCQkvLyBHZXQgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2FnZQorCQkJU3RyaW5nW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCisJCQkJLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiAuY2xhc3MgZmlsZXMKKwkJCQlpZiAoZmlsZXNbaV0uZW5kc1dpdGgoIi5jbGFzcyIpICYmIGZhbHNlID09IGZpbGVzW2ldLmNvbnRhaW5zKCIkIikpIHsKKworCQkJCQkvLyByZW1vdmVzIHRoZSAuY2xhc3MgZXh0ZW5zaW9uCisJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBwa2duYW1lICsgJy4nICsgZmlsZXNbaV0uc3Vic3RyaW5nKDAsIGZpbGVzW2ldLmxlbmd0aCgpIC0gNik7CisKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogY2xhc3NOYW1lID0gIiArCisJCQkJCS8vIGNsYXNzTmFtZSk7CisKKwkJCQkJaWYgKGRlYnVnKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBjbGFzc05hbWUgPSAiICsgY2xhc3NOYW1lKTsKKwkJCQkJfQorCisJCQkJCXRyeSB7CisJCQkJCQlDbGFzcyBjbGFzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCQkJCQkJYm9vbGVhbiBpc0FkZFRvUnVuID0gZmFsc2U7CisJCQkJCQlNZXRob2RbXSBtZXRob2RzID0gY2xhcy5nZXRNZXRob2RzKCk7CisJCQkJCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisJCQkJCQkJQW5ub3RhdGlvbltdIGFubnMgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJCQkJCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbm5zKSB7CisJCQkJCQkJCWlmIChhbi5hbm5vdGF0aW9uVHlwZSgpLmdldFNpbXBsZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJUZXN0IikpIHsKKwkJCQkJCQkJCWlzQWRkVG9SdW4gPSB0cnVlOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoaXNBZGRUb1J1bikKKwkJCQkJCQljbGFzc2VzLmFkZChjbGFzKTsKKwkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBsb2FkaW5nICIgKyBjbGFzc05hbWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgamFyUGF0aCA9IGZ1bGxQYXRoLnJlcGxhY2VGaXJzdCgiWy5damFyWyFdLioiLCAiLmphciIpLnJlcGxhY2VGaXJzdCgiZmlsZToiLCAiIik7CisKKwkJCQlpZiAoZGVidWcpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXJQYXRoIGlzICIgKyBqYXJQYXRoKTsKKwkJCQl9CisKKwkJCQlKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShqYXJQYXRoKTsKKwkJCQlFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOworCQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJCUphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOworCQkJCQlTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOworCQkJCQlpZiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgocmVsUGF0aCkgJiYgZW50cnlOYW1lLmxlbmd0aCgpID4gKHJlbFBhdGgubGVuZ3RoKCkgKyAiLyIubGVuZ3RoKCkpKSB7CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEaXNjb3Zlcnk6IEphckVudHJ5OiAiICsKKwkJCQkJCS8vIGVudHJ5TmFtZSk7CisJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZW50cnlOYW1lLnJlcGxhY2UoJy8nLCAnLicpLnJlcGxhY2UoJ1xcJywgJy4nKS5yZXBsYWNlKCIuY2xhc3MiLCAiIik7CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEaXNjb3Zlcnk6IGNsYXNzTmFtZSA9ICIgKworCQkJCQkJLy8gY2xhc3NOYW1lKTsKKworCQkJCQkJaWYgKGZhbHNlID09IGNsYXNzTmFtZS5jb250YWlucygiJCIpKSB7CisKKwkJCQkJCQlpZiAoZGVidWcpIHsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogY2xhc3NOYW1lID0gIiArIGNsYXNzTmFtZSk7CisJCQkJCQkJfQorCisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJQ2xhc3MgY2xhcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKwkJCQkJCQkJYm9vbGVhbiBpc0FkZFRvUnVuID0gZmFsc2U7CisJCQkJCQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGFzLmdldE1ldGhvZHMoKTsKKwkJCQkJCQkJZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworCQkJCQkJCQkJQW5ub3RhdGlvbltdIGFubnMgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJCQkJCQkJCWZvciAoQW5ub3RhdGlvbiBhbiA6IGFubnMpIHsKKwkJCQkJCQkJCQlpZiAoYW4uYW5ub3RhdGlvblR5cGUoKS5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVGVzdCIpKSB7CisJCQkJCQkJCQkJCWlzQWRkVG9SdW4gPSB0cnVlOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGlzQWRkVG9SdW4pCisJCQkJCQkJCQljbGFzc2VzLmFkZChjbGFzKTsKKwkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gbG9hZGluZyAiICsgY2xhc3NOYW1lKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJamFyRmlsZS5jbG9zZSgpOworCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ocGtnbmFtZSArICIgKCIgKyBkaXJlY3RvcnkgKyAiKSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBwYWNrYWdlIiwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNsYXNzZXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFRhYmxlSGVhZChTdHJpbmdCdWlsZGVyIHJlc3VsdHMpIHsKKwkJcmVzdWx0cy5hcHBlbmQoIjx0cj4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjx0aD4iKS5hcHBlbmQoIlVuaXQgVGVzdCIpLmFwcGVuZCgiPC90aD4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjx0aD4iKS5hcHBlbmQoIlJlc3VsdCIpLmFwcGVuZCgiPC90aD4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjwvdHI+Iik7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcnVuL1N0YXJ0VGVzdDJiYWNrdXAuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9ydW4vU3RhcnRUZXN0MmJhY2t1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYjVhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcnVuL1N0YXJ0VGVzdDJiYWNrdXAuamF2YQpAQCAtMCwwICsxLDQxMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnJ1bjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkpVbml0Q29yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJlc3VsdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5GYWlsdXJlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5TZGNUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFN0YXJ0VGVzdDJiYWNrdXAgeworCisJcHJpdmF0ZSBMaXN0PENsYXNzPD8gZXh0ZW5kcyBTZGNUZXN0Pj4gdGVzdENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBTZGNUZXN0Pj4oKTsKKwlwdWJsaWMgc3RhdGljIGxvbmcgdGltZU9mVGVzdCA9IDA7CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworCXB1YmxpYyBzdGF0aWMgQXRvbWljQm9vbGVhbiBsb2dnZXJJbml0aWFsaXplZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworCXByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IG51bGw7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisKKwkJU3RyaW5nIGRlYnVnRW5hYmxlZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZGVidWciKTsKKwkJaWYgKGRlYnVnRW5hYmxlZCAhPSBudWxsICYmIGRlYnVnRW5hYmxlZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKwkJCWRlYnVnID0gdHJ1ZTsKKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlYnVnIG1vZGUgaXMgIiArIChkZWJ1ZyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKKworCQllbmFibGVMb2dnZXIoKTsKKworCQlDb25maWcgY29uZmlnID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCWlmIChjb25maWcgPT0gbnVsbCkgeworCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY29uZmlndXJhdGlvbiBmaWxlIG9mIGNpIHRlc3RzLiIpOworCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlMaXN0PFN0cmluZz4gcGFja2FnZXNUb1J1biA9IGNvbmZpZy5nZXRQYWNrYWdlcygpOworCQlpZiAocGFja2FnZXNUb1J1biA9PSBudWxsIHx8IHRydWUgPT0gcGFja2FnZXNUb1J1bi5pc0VtcHR5KCkpIHsKKwkJCWxvZ2dlci5lcnJvcigiTm8gcGFja2FnZSB3YXMgY29uZmlndXJlZCB0byBiZSBleGVjdXRlZC4iKTsKKwkJCVN5c3RlbS5leGl0KDIpOworCQl9CisJCVN0YXJ0VGVzdDJiYWNrdXAgdGVzdHMgPSBuZXcgU3RhcnRUZXN0MmJhY2t1cCgpOworCisJCWJvb2xlYW4gc3RvcE9uQ2xhc3NGYWlsdXJlID0gZmFsc2U7CisJCVN0cmluZyBzdG9wT25DbGFzc0ZhaWx1cmVTdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN0b3BPbkNsYXNzRmFpbHVyZSIpOworCQlpZiAoc3RvcE9uQ2xhc3NGYWlsdXJlU3RyICE9IG51bGwgJiYgc3RvcE9uQ2xhc3NGYWlsdXJlU3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworCQkJc3RvcE9uQ2xhc3NGYWlsdXJlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCUJvb2xlYW4gc3RvcE9uQ2xhc3NGYWlsdXJlT2JqID0gY29uZmlnLmlzU3RvcE9uQ2xhc3NGYWlsdXJlKCk7CisJCQlpZiAoc3RvcE9uQ2xhc3NGYWlsdXJlT2JqICE9IG51bGwpIHsKKwkJCQlzdG9wT25DbGFzc0ZhaWx1cmUgPSBzdG9wT25DbGFzc0ZhaWx1cmVPYmouYm9vbGVhblZhbHVlKCk7CisJCQl9CisJCX0KKworCQl0ZXN0cy5zdGFydChwYWNrYWdlc1RvUnVuLCBzdG9wT25DbGFzc0ZhaWx1cmUpOworCX0KKworCXB1YmxpYyBTdGFydFRlc3QyYmFja3VwKCkgeworCQlsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTdGFydFRlc3QyYmFja3VwLmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZUxvZ2dlcigpIHsKKworCQlpZiAoZmFsc2UgPT0gbG9nZ2VySW5pdGlhbGl6ZWQuZ2V0KCkpIHsKKworCQkJbG9nZ2VySW5pdGlhbGl6ZWQuc2V0KHRydWUpOworCisJCQlTdHJpbmcgbG9nNGpQcm9wc0ZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxvZzRqLmNvbmZpZ3VyYXRpb24iKTsKKwkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5jb250YWlucygiV2luZG93cyIpKSB7CisJCQkJU3RyaW5nIGxvZ1Byb3BzID0gInNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXMiOworCQkJCWlmIChsb2c0alByb3BzRmlsZSA9PSBudWxsKSB7CisJCQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgidGFyZ2V0bG9nIiwgInRhcmdldC8iKTsKKwkJCQkJbG9nNGpQcm9wc0ZpbGUgPSBsb2dQcm9wczsKKwkJCQl9CisKKwkJCX0KKwkJCVByb3BlcnR5Q29uZmlndXJhdG9yLmNvbmZpZ3VyZUFuZFdhdGNoKGxvZzRqUHJvcHNGaWxlKTsKKworCQl9CisJfQorCisJcHVibGljIHZvaWQgc3RhcnQoTGlzdDxTdHJpbmc+IHBhY2thZ2VzLCBib29sZWFuIGV4aXRPbkZhaWx1cmUpIHsKKworCQlib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOworCQlTdHJpbmdCdWlsZGVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlSZXN1bHQgcmVzdWx0OworCisJCWlmIChwYWNrYWdlcyA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IgKFN0cmluZyBwYWNrYWdlTmFtZSA6IHBhY2thZ2VzKSB7CisJCQkvLyBMaXN0PENsYXNzPiBjbGFzc2VzRm9yUGFja2FnZSA9CisJCQkvLyBnZXRDbGFzc2VzRm9yUGFja2FnZSgib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZSIpOworCQkJTGlzdDxDbGFzcz4gY2xhc3Nlc0ZvclBhY2thZ2UgPSBnZXRDbGFzc2VzRm9yUGFja2FnZShwYWNrYWdlTmFtZSk7CisJCQlpZiAoY2xhc3Nlc0ZvclBhY2thZ2UgIT0gbnVsbCAmJiBmYWxzZSA9PSBjbGFzc2VzRm9yUGFja2FnZS5pc0VtcHR5KCkpIHsKKwkJCQlmb3IgKENsYXNzIHRlc3RVbml0IDogY2xhc3Nlc0ZvclBhY2thZ2UpIHsKKwkJCQkJdGVzdENsYXNzZXMuYWRkKHRlc3RVbml0KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdENsYXNzZXMpOworCisJCS8vIHRzZXRDbGFzc2VzLmFkZChMb2dWYWxpZGF0b3JUZXN0LmNsYXNzKTsKKwkJLy8gdHNldENsYXNzZXMuYWRkKEF0dE5vcnRoYm91bmRUZXN0LmNsYXNzKTsKKworCQlyZXN1bHRzLmFwcGVuZCgKKwkJCQkiPEh0bWw+PGhlYWQ+PHN0eWxlPnRoe2JhY2tncm91bmQtY29sb3I6IGdyYXk7Y29sb3I6IHdoaXRlO2hlaWdodDogMzBweDt9dGQge2NvbG9yOiBibGFjaztoZWlnaHQ6IDMwcHg7fS5mYWlsIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkY1NTU1O3dpZHRoOiAxMDBweDt0ZXh0LWFsaWduOiBjZW50ZXI7fS5zdWNjZXNzIHtiYWNrZ3JvdW5kLWNvbG9yOiAjMDBGRjAwO3dpZHRoOiAxMDBweDt0ZXh0LWFsaWduOiBjZW50ZXI7fS5uYW1lIHt3aWR0aDogMjAwcHg7YmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDt9Lm1lc3NhZ2Uge3dpZHRoOiAzMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwO308L3N0eWxlPjwvaGVhZD48Ym9keT4iKTsKKworCQlDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisJCXRpbWVPZlRlc3QgPSBjYWxlbmRhci5nZXRUaW1lSW5NaWxsaXMoKTsKKwkJU2ltcGxlRGF0ZUZvcm1hdCBkYXRlX2Zvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNTU0gZGQgeXl5eSBISDptbTpzcyIpOworCQlyZXN1bHRzLmFwcGVuZCgiPGJyLz48aDI+IFRoaXMgcmVwb3J0IGdlbmVyYXRlZCBvbiAiICsgZGF0ZV9mb3JtYXQuZm9ybWF0KGNhbGVuZGFyLmdldFRpbWUoKSkgKyAiPC9oMj48YnIvPiIpOworCisJCXJlc3VsdHMuYXBwZW5kKCI8dGFibGU+Iik7CisJCWFkZFRhYmxlSGVhZChyZXN1bHRzKTsKKworCQlpbnQgc2l6ZSA9IHRlc3RDbGFzc2VzLnNpemUoKTsKKwkJaW50IGluZGV4ID0gMDsKKworCQlpbnQgdG90YWxSdW5UZXN0cyA9IDA7CisJCWludCB0b3RhbEZhaWx1cmVUZXN0cyA9IDA7CisJCWludCB0b3RhbElnbm9yZVRlc3RzID0gMDsKKwkJaW50IG51bU9mRmFpbHVyZUNsYXNzZXMgPSAwOworCQlmb3IgKENsYXNzPD8gZXh0ZW5kcyBTZGNUZXN0PiB0ZXN0Q2xhc3MgOiB0ZXN0Q2xhc3NlcykgeworCisJCQlpbmRleCsrOworCisJCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJU3RyaW5nIHN0ciA9ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOworCQkJYnVpbGRlci5hcHBlbmQoc3RyICsgIlxuIik7CisJCQlTdHJpbmcgY3VycmVudCA9ICJjbGFzcyAiICsgaW5kZXggKyAiLyIgKyBzaXplICsgIiBmYWlsdXJlKCIgKyBudW1PZkZhaWx1cmVDbGFzc2VzICsgIikgKyBSVU5TKCIKKwkJCQkJKyB0b3RhbFJ1blRlc3RzICsgIikiICsgIiBGQUlMVVJFUygiICsgdG90YWxGYWlsdXJlVGVzdHMgKyAiKSBJR05PUkVEKCIgKyB0b3RhbElnbm9yZVRlc3RzICsgIikiOworCQkJaW50IGludGVydmFsID0gKChzdHIubGVuZ3RoKCkgLSBjdXJyZW50Lmxlbmd0aCgpIC0gMikgLyAyKTsKKwkJCVN0cmluZyBzdWJzdHJpbmcgPSBzdHIuc3Vic3RyaW5nKDAsIGludGVydmFsKTsKKwkJCWJ1aWxkZXIuYXBwZW5kKHN1YnN0cmluZyArICIgIiArIGN1cnJlbnQgKyAiICIgKyBzdWJzdHJpbmcgKyAiXG4iKTsKKwkJCWJ1aWxkZXIuYXBwZW5kKHN0ciArICJcbiIpOworCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oYnVpbGRlci50b1N0cmluZygpKTsKKworCQkJbG9nZ2VyLmRlYnVnKGJ1aWxkZXIudG9TdHJpbmcoKSk7CisJCQlsb2dnZXIuZGVidWcoIkdvaW5nIHRvIHJ1biB0ZXN0IGNsYXNzIHt9IiwgdGVzdENsYXNzLmdldE5hbWUoKSk7CisKKwkJCXJlc3VsdCA9IEpVbml0Q29yZS5ydW5DbGFzc2VzKHRlc3RDbGFzcyk7CisJCQlpZiAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSA9PSBmYWxzZSkgeworCQkJCW51bU9mRmFpbHVyZUNsYXNzZXMrKzsKKwkJCX0KKwkJCWxvZ2dlci5kZWJ1ZygiVGVzdCBjbGFzcyB7fSBmaW5pc2hlZCB7fSIsIHRlc3RDbGFzcy5nZXROYW1lKCksIChyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpID8gIk9LLiIgOiAiIFdJVEggRVJST1IuIikpOworCQkJTGlzdDxGYWlsdXJlPiBmYWlsdXJlcyA9IHJlc3VsdC5nZXRGYWlsdXJlcygpOworCQkJaWYgKGZhaWx1cmVzICE9IG51bGwpIHsKKwkJCQlmb3IgKEZhaWx1cmUgZmFpbHVyZSA6IGZhaWx1cmVzKSB7CisJCQkJCWxvZ2dlci5lcnJvcigiVGVzdCBjbGFzcyAiICsgdGVzdENsYXNzLmdldE5hbWUoKSArICIgZmFpbHVyZSB0ZXN0ICIgKyBmYWlsdXJlLmdldFRlc3RIZWFkZXIoKSArICItIgorCQkJCQkJCSsgZmFpbHVyZS5nZXRUcmFjZSgpKTsKKwkJCQl9CisJCQl9CisJCQlpbnQgcnVuc1BlckNsYXNzID0gcmVzdWx0LmdldFJ1bkNvdW50KCk7CisJCQlpbnQgZmFpbHVyZXNQZXJDbGFzcyA9IHJlc3VsdC5nZXRGYWlsdXJlQ291bnQoKTsKKwkJCWludCBpZ25vcmVkUGVyQ2xhc3MgPSByZXN1bHQuZ2V0SWdub3JlQ291bnQoKTsKKworCQkJdG90YWxSdW5UZXN0cyArPSBydW5zUGVyQ2xhc3M7CisJCQl0b3RhbEZhaWx1cmVUZXN0cyArPSBmYWlsdXJlc1BlckNsYXNzOworCQkJdG90YWxJZ25vcmVUZXN0cyArPSBpZ25vcmVkUGVyQ2xhc3M7CisKKwkJCWxvZ2dlci5kZWJ1ZygiY2xhc3Mge30gZmFpbGVkIHRlc3RzOiB7fSIsIHRlc3RDbGFzcy5nZXROYW1lKCksIChmYWlsdXJlc1BlckNsYXNzICogMS4wKSAvIHJ1bnNQZXJDbGFzcyAqIDEwMCArICIgJSIpOworCQkJbG9nZ2VyLmRlYnVnKCJjbGFzcyB7fSBpZ25vcmVkIHRlc3RzOiB7fSIsIHRlc3RDbGFzcy5nZXROYW1lKCksIChpZ25vcmVkUGVyQ2xhc3MgKiAxLjApIC8gcnVuc1BlckNsYXNzICogMTAwICsgIiAlIik7CisKKwkJCS8vIExpc3Q8RmFpbHVyZT4gZmFpbHVyZXMgPSByZXN1bHQuZ2V0RmFpbHVyZXMoKTsKKwkJCS8vIGlmIChmYWlsdXJlcyAhPSBudWxsKSB7CisJCQkvLyBmb3IgKEZhaWx1cmUgZmFpbHVyZSA6IGZhaWx1cmVzKSB7CisJCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIjk5OTk5OTk5OTkiICsgZmFpbHVyZS5nZXRUZXN0SGVhZGVyKCkpOworCQkJLy8gfQorCQkJLy8gfQorCisJCQlhZGRVbml0VGVzdFJlc3VsdChyZXN1bHRzLCB0ZXN0Q2xhc3MsIHJlc3VsdCk7CisJCQlzdWNjZXNzICY9IHJlc3VsdC53YXNTdWNjZXNzZnVsKCk7CisKKwkJCWlmIChudW1PZkZhaWx1cmVDbGFzc2VzID4gMCkgeworCQkJCS8vIGlmIChleGl0T25GYWlsdXJlKSB7CisJCQkJaWYgKGV4aXRPbkZhaWx1cmUpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmVzdWx0cy5hcHBlbmQoIjwvdGFibGU+Iik7CisJCXJlc3VsdHMuYXBwZW5kKCI8YnIvPjxoMj4gVGVzdHMgU3VtbWFyeTogPC9oMj48YnIvPiIpOworCQlyZXN1bHRzLmFwcGVuZCgiVG90YWwgUnVucyAgOiAiICsgdG90YWxSdW5UZXN0cyArICI8YnIvPiIpOworCQlyZXN1bHRzLmFwcGVuZCgiVG90YWwgRmFpbHVyZSAgOiAiICsgdG90YWxGYWlsdXJlVGVzdHMgKyAiPGJyLz4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIlRvdGFsOiAiICsgdG90YWxGYWlsdXJlVGVzdHMgKyAiLyIgKyB0b3RhbFJ1blRlc3RzICsgIjxici8+Iik7CisJCXJlc3VsdHMuYXBwZW5kKCI8L2h0bWw+Iik7CisKKwkJRmlsZVV0aWxzLndyaXRlVG9GaWxlKENvbmZpZy5pbnN0YW5jZSgpLmdldE91dHB1dEZvbGRlcigpICsgRmlsZS5zZXBhcmF0b3IgKyBDb25maWcuaW5zdGFuY2UoKS5nZXRSZXBvcnROYW1lKCksCisJCQkJcmVzdWx0cy50b1N0cmluZygpKTsKKworCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRSIpOworCQkJbG9nZ2VyLmVycm9yKCJGYWlsdXJlIHRlc3RzIDogIgorCQkJCQkrICgodG90YWxGYWlsdXJlVGVzdHMgKyB0b3RhbElnbm9yZVRlc3RzKSAqIDEuMCkgLyAodG90YWxSdW5UZXN0cyArIHRvdGFsSWdub3JlVGVzdHMpICsgIiAlIik7CisJCQlsb2dnZXIuZXJyb3IoIklnbm9yZWQgdGVzdHMgOiAiICsgKHRvdGFsSWdub3JlVGVzdHMgKiAxLjApIC8gKHRvdGFsUnVuVGVzdHMgKyB0b3RhbElnbm9yZVRlc3RzKSArICIgJSIpOworCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNVQ0NFU1MiKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q2xhc3M+IGdldENsYXNzZXNGb3JQYWNrYWdlKFN0cmluZyBwa2duYW1lKSB7CisKKwkJTGlzdDxDbGFzcz4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7CisKKwkJLy8gR2V0IGEgRmlsZSBvYmplY3QgZm9yIHRoZSBwYWNrYWdlCisJCUZpbGUgZGlyZWN0b3J5ID0gbnVsbDsKKwkJU3RyaW5nIGZ1bGxQYXRoOworCQlTdHJpbmcgcmVsUGF0aCA9IHBrZ25hbWUucmVwbGFjZSgnLicsICcvJyk7CisKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogUGFja2FnZTogIiArIHBrZ25hbWUgKworCQkvLyAiIGJlY29tZXMgUGF0aDoiICsgcmVsUGF0aCk7CisKKwkJVVJMIHJlc291cmNlID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShyZWxQYXRoKTsKKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBSZXNvdXJjZSA9ICIgKyByZXNvdXJjZSk7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gcmVzb3VyY2UgZm9yICIgKyByZWxQYXRoKTsKKwkJfQorCQlmdWxsUGF0aCA9IHJlc291cmNlLmdldEZpbGUoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogRnVsbFBhdGggPSAiICsgcmVzb3VyY2UpOworCisJCWlmIChkZWJ1ZykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJmdWxsUGF0aCBpcyAiICsgZnVsbFBhdGgpOworCQl9CisKKwkJdHJ5IHsKKwkJCWRpcmVjdG9yeSA9IG5ldyBGaWxlKHJlc291cmNlLnRvVVJJKCkpOworCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisJCQkJCXBrZ25hbWUgKyAiICgiICsgcmVzb3VyY2UKKwkJCQkJCQkrICIpIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIFVSTCAvIFVSSS4gIFN0cmFuZ2UsIHNpbmNlIHdlIGdvdCBpdCBmcm9tIHRoZSBzeXN0ZW0uLi4iLAorCQkJCQllKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCWRpcmVjdG9yeSA9IG51bGw7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogRGlyZWN0b3J5ID0gIiArIGRpcmVjdG9yeSk7CisKKwkJaWYgKGRpcmVjdG9yeSAhPSBudWxsICYmIGRpcmVjdG9yeS5leGlzdHMoKSkgeworCisJCQkvLyBHZXQgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2FnZQorCQkJU3RyaW5nW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCisJCQkJLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiAuY2xhc3MgZmlsZXMKKwkJCQlpZiAoZmlsZXNbaV0uZW5kc1dpdGgoIi5jbGFzcyIpICYmIGZhbHNlID09IGZpbGVzW2ldLmNvbnRhaW5zKCIkIikpIHsKKworCQkJCQkvLyByZW1vdmVzIHRoZSAuY2xhc3MgZXh0ZW5zaW9uCisJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBwa2duYW1lICsgJy4nICsgZmlsZXNbaV0uc3Vic3RyaW5nKDAsIGZpbGVzW2ldLmxlbmd0aCgpIC0gNik7CisKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogY2xhc3NOYW1lID0gIiArCisJCQkJCS8vIGNsYXNzTmFtZSk7CisKKwkJCQkJaWYgKGRlYnVnKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBjbGFzc05hbWUgPSAiICsgY2xhc3NOYW1lKTsKKwkJCQkJfQorCisJCQkJCXRyeSB7CisJCQkJCQlDbGFzcyBjbGFzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCQkJCQkJYm9vbGVhbiBpc0FkZFRvUnVuID0gZmFsc2U7CisJCQkJCQlNZXRob2RbXSBtZXRob2RzID0gY2xhcy5nZXRNZXRob2RzKCk7CisJCQkJCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisJCQkJCQkJQW5ub3RhdGlvbltdIGFubnMgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJCQkJCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbm5zKSB7CisJCQkJCQkJCWlmIChhbi5hbm5vdGF0aW9uVHlwZSgpLmdldFNpbXBsZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJUZXN0IikpIHsKKwkJCQkJCQkJCWlzQWRkVG9SdW4gPSB0cnVlOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoaXNBZGRUb1J1bikKKwkJCQkJCQljbGFzc2VzLmFkZChjbGFzKTsKKwkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBsb2FkaW5nICIgKyBjbGFzc05hbWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgamFyUGF0aCA9IGZ1bGxQYXRoLnJlcGxhY2VGaXJzdCgiWy5damFyWyFdLioiLCAiLmphciIpLnJlcGxhY2VGaXJzdCgiZmlsZToiLCAiIik7CisKKwkJCQlpZiAoZGVidWcpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXJQYXRoIGlzICIgKyBqYXJQYXRoKTsKKwkJCQl9CisKKwkJCQlKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShqYXJQYXRoKTsKKwkJCQlFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOworCQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJCUphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOworCQkJCQlTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOworCQkJCQlpZiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgocmVsUGF0aCkgJiYgZW50cnlOYW1lLmxlbmd0aCgpID4gKHJlbFBhdGgubGVuZ3RoKCkgKyAiLyIubGVuZ3RoKCkpKSB7CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEaXNjb3Zlcnk6IEphckVudHJ5OiAiICsKKwkJCQkJCS8vIGVudHJ5TmFtZSk7CisJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZW50cnlOYW1lLnJlcGxhY2UoJy8nLCAnLicpLnJlcGxhY2UoJ1xcJywgJy4nKS5yZXBsYWNlKCIuY2xhc3MiLCAiIik7CisKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEaXNjb3Zlcnk6IGNsYXNzTmFtZSA9ICIgKworCQkJCQkJLy8gY2xhc3NOYW1lKTsKKworCQkJCQkJaWYgKGZhbHNlID09IGNsYXNzTmFtZS5jb250YWlucygiJCIpKSB7CisKKwkJCQkJCQlpZiAoZGVidWcpIHsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogY2xhc3NOYW1lID0gIiArIGNsYXNzTmFtZSk7CisJCQkJCQkJfQorCisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJQ2xhc3MgY2xhcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKwkJCQkJCQkJYm9vbGVhbiBpc0FkZFRvUnVuID0gZmFsc2U7CisJCQkJCQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGFzLmdldE1ldGhvZHMoKTsKKwkJCQkJCQkJZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworCQkJCQkJCQkJQW5ub3RhdGlvbltdIGFubnMgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJCQkJCQkJCWZvciAoQW5ub3RhdGlvbiBhbiA6IGFubnMpIHsKKwkJCQkJCQkJCQlpZiAoYW4uYW5ub3RhdGlvblR5cGUoKS5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVGVzdCIpKSB7CisJCQkJCQkJCQkJCWlzQWRkVG9SdW4gPSB0cnVlOworCQkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGlzQWRkVG9SdW4pCisJCQkJCQkJCQljbGFzc2VzLmFkZChjbGFzKTsKKwkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gbG9hZGluZyAiICsgY2xhc3NOYW1lKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJamFyRmlsZS5jbG9zZSgpOworCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ocGtnbmFtZSArICIgKCIgKyBkaXJlY3RvcnkgKyAiKSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBwYWNrYWdlIiwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNsYXNzZXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFRhYmxlSGVhZChTdHJpbmdCdWlsZGVyIHJlc3VsdHMpIHsKKwkJcmVzdWx0cy5hcHBlbmQoIjx0cj4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjx0aD4iKS5hcHBlbmQoIlVuaXQgVGVzdCIpLmFwcGVuZCgiPC90aD4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjx0aD4iKS5hcHBlbmQoIlJlc3VsdCIpLmFwcGVuZCgiPC90aD4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjwvdHI+Iik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFVuaXRUZXN0UmVzdWx0KFN0cmluZ0J1aWxkZXIgcmVzdWx0cywgQ2xhc3M8PyBleHRlbmRzIFNkY1Rlc3Q+IHRlc3RDbGFzcywKKwkJCVJlc3VsdCB1bml0VGVzdFJlc3VsdCkgeworCisJCWJvb2xlYW4gaXNTdWNjZXNzID0gdW5pdFRlc3RSZXN1bHQud2FzU3VjY2Vzc2Z1bCgpOworCisJCVN0cmluZyByZXN1bHQgPSAoaXNTdWNjZXNzKSA/ICJzdWNjZXNzIiA6ICJmYWlsIjsKKwkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVOYW1lKHRlc3RDbGFzcy5nZXROYW1lKCkpOworCQlyZXN1bHRzLmFwcGVuZCgiPHRyPiIpOworCQkvLyByZXN1bHRzLmFwcGVuZCgiPHRkPiIpLmFwcGVuZChGaWxlVXRpbHMuZ2V0RmlsZU5hbWUodGVzdENsYXNzLmdldE5hbWUoKSkpLmFwcGVuZCgiPC90ZD4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjx0ZCBjbGFzcz1cIm5hbWVcIj4iKQorCQkJCS5hcHBlbmQoIjxhIGhyZWY9XCIiICsgZmlsZU5hbWUgKyB0aW1lT2ZUZXN0ICsgIi5odG1sXCI+IiArIGZpbGVOYW1lICsgIjwvYT4iKS5hcHBlbmQoIjwvdGQ+Iik7CisJCXJlc3VsdHMuYXBwZW5kKCI8dGQgY2xhc3M9XCIiICsgcmVzdWx0ICsgIlwiPiIpLmFwcGVuZChyZXN1bHQpLmFwcGVuZCgiPC90ZD4iKTsKKwkJcmVzdWx0cy5hcHBlbmQoIjwvdHI+Iik7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvc2FuaXR5L0NydWRFMkUuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9zYW5pdHkvQ3J1ZEUyRS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmY0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvc2FuaXR5L0NydWRFMkUuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnNhbml0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFzc29jVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkF0b21pY09wZXJhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQ3J1ZEUyRSBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3J1ZEUyRS5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIENvbXBvbmVudCByZXNvdXJjZURldGFpbHNWRkNjb21wXzAxOworCXB1YmxpYyBDb21wb25lbnQgcmVzb3VyY2VEZXRhaWxzVkZDc29mdF8wMTsKKwlwdWJsaWMgQ29tcG9uZW50IHJlc291cmNlRGV0YWlsc0NQXzAxOworCXB1YmxpYyBDb21wb25lbnQgcmVzb3VyY2VEZXRhaWxzVkxfMDE7CisJcHVibGljIENvbXBvbmVudCByZXNvdXJjZURldGFpbHNWRl8wMTsKKwlwdWJsaWMgQ29tcG9uZW50IHJlc291cmNlRGV0YWlsc1ZGXzAyOworCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlRGV0YWlsc1ZGQzFjb21wSW5zMTsKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VEZXRhaWxzVkZDMXNvZnRJbnMxOworCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZURldGFpbHNDUDFpbnNfMDE7CisJcHVibGljIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlRGV0YWlsc1ZMMWluc18wMTsKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VEZXRhaWxzVkYxaW5zXzAxOworCXB1YmxpYyBDb21wb25lbnQgZGVmYXVsdFNlcnZpY2UxOworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhcmlhYmxlc0FzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBDcnVkRTJFKCkgeworCQlzdXBlcihuYW1lLCBDcnVkRTJFLmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21wbGV4U2NlbmFyaW8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIGRlc2lnbmVyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQkvLy8vLy8vLyBjcmVhdGUgZGVmYXVsdFNlcnZpY2UxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXN0UmVzcG9uc2U+IGNyZWF0ZURlZmF1bHRTZXJ2aWNlMWUgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlkZWZhdWx0U2VydmljZTEgPSBjcmVhdGVEZWZhdWx0U2VydmljZTFlLmxlZnQoKS52YWx1ZSgpOworCisJCS8vLy8vLy8vIGNyZWF0ZSBWRkMxIChyZXNvdXJjZURldGFpbHNWRkNjb21wXzAxKSBEZXJpdmVkRnJvbSBDT01QVVRFCisJCS8vLy8vLy8vIHR5cGUgYWRkIGFsbCBwb3NzaWJsZSBpbmZvcm1hdGlvbmFsIGFydGlmYWN0cyBhbmQgY2hhbmdlIHN0YXRlCisJCS8vLy8vLy8vIHRvIENFUlRJRlkvLy8vLy8vLworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gcmVzb3VyY2VEZXRhaWxzVkZDY29tcEUgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGQywgTm9ybWF0aXZlVHlwZXNFbnVtLkNPTVBVVEUsUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZDY29tcF8wMSA9IHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBFLmxlZnQoKS52YWx1ZSgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLkNIRUYsIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBmYWxzZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uUFVQUEVULCByZXNvdXJjZURldGFpbHNWRkNjb21wXzAxLFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLllBTkcsIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBmYWxzZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUwsIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBmYWxzZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uREdfWE1MLCByZXNvdXJjZURldGFpbHNWRkNjb21wXzAxLFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1VUkFOT19QS0csIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBmYWxzZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uT1RIRVIsIHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBmYWxzZSwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUixMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCisJCS8vLy8vLy8vIGNyZWF0ZSBWRkMyIChyZXNvdXJjZURldGFpbHNWRkNzb2Z0XzAxKSBEZXJpdmVkRnJvbSBTT0ZUV0FSRQorCQkvLy8vLy8vLyB0eXBlIGFuZCBjaGFuZ2Ugc3RhdGUgdG8gQ0VSVElGWS8vLy8vLy8vCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXNvdXJjZURldGFpbHNWRkNzb2Z0RSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkZDLCBOb3JtYXRpdmVUeXBlc0VudW0uU09GVFdBUkVfQ09NUE9ORU5ULFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfREFUQUJBU0UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1ZGQ3NvZnRfMDEgPSByZXNvdXJjZURldGFpbHNWRkNzb2Z0RS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkZDc29mdF8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSk7CisKKwkJLy8vLy8vLy8gY3JlYXRlIENQMSAocmVzb3VyY2VEZXRhaWxzVkZDc29mdF8wMSkgRGVyaXZlZEZyb20gUE9SVCB0eXBlCisJCS8vLy8vLy8vIGFuZCBjaGFuZ2Ugc3RhdGUgdG8gQ0hFQ0tJTi8vLy8vLy8vCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXNvdXJjZURldGFpbHNDUF8wMWUgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLkNQLCBOb3JtYXRpdmVUeXBlc0VudW0uUE9SVCxSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0RBVEFCQVNFLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlyZXNvdXJjZURldGFpbHNDUF8wMSA9IHJlc291cmNlRGV0YWlsc0NQXzAxZS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzQ1BfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUixMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpOworCisJCS8vLy8vLy8vIGNyZWF0ZSBWTDEgKHJlc291cmNlRGV0YWlsc1ZGQ3NvZnRfMDEpIERlcml2ZWRGcm9tIE5FVFdPUksgdHlwZQorCQkvLy8vLy8vLyBhbmQgY2hhbmdlIHN0YXRlIHRvIENFUlRJRlkvLy8vLy8vLworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gcmVzb3VyY2VEZXRhaWxzVkxfMDFlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WTCwgTm9ybWF0aXZlVHlwZXNFbnVtLk5FVFdPUkssUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19ORVRXT1JLX0VMRU1FTlRTLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlyZXNvdXJjZURldGFpbHNWTF8wMSA9IHJlc291cmNlRGV0YWlsc1ZMXzAxZS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkxfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUixMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpOworCisJCS8vLy8vLy8vIGNyZWF0ZSBWRjEgKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEpIERlcml2ZWRGcm9tIENPTVBVVEUgdHlwZQorCQkvLy8vLy8vLyBhZGQgYWxsIHBvc3NpYmxlIGRlcGxveW1lbnQgYW5kIGluZm9ybWF0aW9uYWwgYXJ0aWZhY3RzCisJCS8vLy8vLy8vIC8vLy8vLy8vLy8KKwkJRWl0aGVyPFJlc291cmNlLCBSZXN0UmVzcG9uc2U+IHJlc291cmNlRGV0YWlsc1ZGXzAxZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkYsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1ZGXzAxID0gcmVzb3VyY2VEZXRhaWxzVkZfMDFlLmxlZnQoKS52YWx1ZSgpOworCQlBcnRpZmFjdERlZmluaXRpb24gaGVhdEFydGlmYWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFULCByZXNvdXJjZURldGFpbHNWRl8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX1ZPTCwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX05FVCwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5PVEhFUiwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUix0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5DSEVGLCByZXNvdXJjZURldGFpbHNWRl8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLGZhbHNlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5QVVBQRVQsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsZmFsc2UsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLllBTkcsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsZmFsc2UsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLllBTkdfWE1MLCByZXNvdXJjZURldGFpbHNWRl8wMSxVc2VyUm9sZUVudW0uREVTSUdORVIsIGZhbHNlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5ER19YTUwsIHJlc291cmNlRGV0YWlsc1ZGXzAxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsZmFsc2UsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1VUkFOT19QS0csIHJlc291cmNlRGV0YWlsc1ZGXzAxLFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLCByZXNvdXJjZURldGFpbHNWRl8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLGZhbHNlLCB0cnVlKTsKKworCQkvLy8vLy8vLyBBZGQgVkZDMSBWRkMyIENQIGFuZCBWTCB0byBWRiBjb250YWluZXIgLy8vLy8vLy8vLy8vLworCQlyZXNvdXJjZURldGFpbHNWRkMxY29tcEluczEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlRGV0YWlsc1ZGQ2NvbXBfMDEsIHJlc291cmNlRGV0YWlsc1ZGXzAxLFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlRGV0YWlsc1ZGQzFzb2Z0SW5zMSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VEZXRhaWxzVkZDc29mdF8wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzb3VyY2VEZXRhaWxzQ1AxaW5zXzAxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZURldGFpbHNDUF8wMSxyZXNvdXJjZURldGFpbHNWRl8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkwxaW5zXzAxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZURldGFpbHNWTF8wMSxyZXNvdXJjZURldGFpbHNWRl8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLy8vLy8vLyBhc3NvY2lhdGUgY3AtdmwgdmwtdmZjQ29tcCBhbmQgdmZjQ29tcC12ZmNTb2Z0Ly8vLy8vLy8KKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5nZXRSZXNvdXJjZU9iamVjdChyZXNvdXJjZURldGFpbHNWRl8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYXNzb2NpYXRlMlJlc291cmNlSW5zdGFuY2VzKHJlc291cmNlRGV0YWlsc1ZGXzAxLCByZXNvdXJjZURldGFpbHNDUDFpbnNfMDEscmVzb3VyY2VEZXRhaWxzVkwxaW5zXzAxLCBBc3NvY1R5cGUuTElOS0FCTEUuZ2V0QXNzb2NUeXBlKCksIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFzc29jaWF0ZTJSZXNvdXJjZUluc3RhbmNlcyhyZXNvdXJjZURldGFpbHNWRl8wMSwgcmVzb3VyY2VEZXRhaWxzQ1AxaW5zXzAxLHJlc291cmNlRGV0YWlsc1ZGQzFjb21wSW5zMSwgQXNzb2NUeXBlLkJJTkRBQkxFLmdldEFzc29jVHlwZSgpLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hc3NvY2lhdGUyUmVzb3VyY2VJbnN0YW5jZXMocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHJlc291cmNlRGV0YWlsc1ZGQzFjb21wSW5zMSxyZXNvdXJjZURldGFpbHNWRkMxc29mdEluczEsIEFzc29jVHlwZS5OT0RFLmdldEFzc29jVHlwZSgpLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCisJCS8vLy8vLy8vIGRvd25sb2FkIGFsbCBWRjEgYXJ0aWZhY3RzLy8vLy8vLy8KKwkJQ29sbGVjdGlvbjxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHJlc291cmNlRGV0YWlsc1ZGXzAxLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS52YWx1ZXMoKTsKKwkJTGlzdDxTdHJpbmc+IGNvbGxlY3QgPSBhcnRpZmFjdHMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5jaGVja0VzSWRFeGlzdCgpID09IHRydWUpLm1hcChwIC0+IHAuZ2V0VW5pcXVlSWQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJYXJ0aWZhY3RzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuY2hlY2tFc0lkRXhpc3QoKSA9PSB0cnVlKS5tYXAocCAtPiBwLmdldFVuaXF1ZUlkKCkpLmZvckVhY2goaXRlbSAtPiBsb2cuZGVidWcoaXRlbSkpOworCisJCS8vLy8vLy8vIGdldCBhbGwgVkYxIGFydGlmYWN0cy8vLy8vLy8vCisKKwkJQ29sbGVjdGlvbjxMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiBjb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzID0gcmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcygpLnZhbHVlcygpOworCQlMaXN0PFN0cmluZz4gY29sbGVjdDIgPSBjb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuaXNFbXB0eSgpID09IGZhbHNlKS5mbGF0TWFwKGwgLT4gbC5zdHJlYW0oKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFVuaXF1ZUlkKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQorCQkvLy8vLy8vLyBjZXJ0aWZ5IFZGMSAtIGZhaWxlZCBkdWUgdG8gdW5jZXJ0aWZpZWQgQ1AgaW5zdGFuY2UgLy8vLy8vLy8KKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVZmU3RhdGVGYWlsZWQgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkZfMDEsIGRlc2lnbmVyLExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQlSZXNvdXJjZSByZXNSZXNvdXJjZURldGFpbHNWRl8wMSA9IChSZXNvdXJjZSkgcmVzb3VyY2VEZXRhaWxzVkZfMDE7CisJCXZhcmlhYmxlc0FzTGlzdCA9IEFycmF5cy5hc0xpc3QocmVzUmVzb3VyY2VEZXRhaWxzVkZfMDEuZ2V0UmVzb3VyY2VUeXBlKCkudG9TdHJpbmcoKSxyZXNvdXJjZURldGFpbHNDUF8wMS5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlZBTElEQVRFRF9SRVNPVVJDRV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXNBc0xpc3QsY2hhbmdlVmZTdGF0ZUZhaWxlZC5nZXRSZXNwb25zZSgpKTsKKworCQkvLy8vLy8vLyBjZXJ0aWZ5IHJlc291cmNlcyBDUDEgLy8vLy8vLy8KKwkJcmVzb3VyY2VEZXRhaWxzQ1BfMDEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNDUF8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQkvLy8vLy8vLyByZXBsYWNlIFZGMSBpbnN0YW5jZXMgd2l0aCBuZXcgY2VydGlmaWVkIGluc3RhbmNlcyAoQ1AxCisJCS8vLy8vLy8vIHJlcGxhY2VkKSAvLy8vLy8vLworCQlFaXRoZXI8UGFpcjxDb21wb25lbnQsIENvbXBvbmVudEluc3RhbmNlPiwgUmVzdFJlc3BvbnNlPiBjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24gPSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24ocmVzb3VyY2VEZXRhaWxzVkZfMDEsIHJlc291cmNlRGV0YWlsc0NQMWluc18wMSwgcmVzb3VyY2VEZXRhaWxzQ1BfMDEsVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDEgPSBjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24ubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZURldGFpbHNDUDFpbnNfMDEgPSBjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24ubGVmdCgpLnZhbHVlKCkuZ2V0UmlnaHQoKTsKKworCQkvLy8vLy8vLyBhc3NvY2lhdGUgY3AtdmwgYW5kIGNwLXZmYzEsLy8vLy8vLy8KKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYXNzb2NpYXRlMlJlc291cmNlSW5zdGFuY2VzKHJlc291cmNlRGV0YWlsc1ZGXzAxLCByZXNvdXJjZURldGFpbHNDUDFpbnNfMDEscmVzb3VyY2VEZXRhaWxzVkwxaW5zXzAxLCBBc3NvY1R5cGUuTElOS0FCTEUuZ2V0QXNzb2NUeXBlKCksIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFzc29jaWF0ZTJSZXNvdXJjZUluc3RhbmNlcyhyZXNvdXJjZURldGFpbHNWRl8wMSwgcmVzb3VyY2VEZXRhaWxzQ1AxaW5zXzAxLHJlc291cmNlRGV0YWlsc1ZGQzFjb21wSW5zMSwgQXNzb2NUeXBlLkJJTkRBQkxFLmdldEFzc29jVHlwZSgpLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCisJCS8vLy8vLy8gY2hhbmdlIFZGMSBzdGF0ZSB0byBDSEVDSy1JTiBhbmQgYWRkIGl0IGFzIGluc3RhbmNlIHRvIHNlcnZpY2UxCisJCS8vLy8vLy8gY29udGFpbmVyCisJCXJlc291cmNlRGV0YWlsc1ZGXzAxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VEZXRhaWxzVkZfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlRGV0YWlsc1ZGMWluc18wMSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VEZXRhaWxzVkZfMDEsZGVmYXVsdFNlcnZpY2UxLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCisJCS8vLy8vLy8vIGRpc3RyaWJ1dGUgc2VydmljZTEgLSBmYWlsZWQgZHVlIHRvIGluY29ycmVjdCBMaWZlQ3ljbGVzdGF0dXMKKwkJLy8vLy8vLy8gLy8vLy8vLy8KKwkJUmVzdFJlc3BvbnNlIGRpc3RyaWJ1dGVTZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZGlzdHJpYnV0ZVNlcnZpY2UoZGVmYXVsdFNlcnZpY2UxLCBmYWxzZSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoZGlzdHJpYnV0ZVNlcnZpY2UsIG51bGwsICJ2ZXJpZmljYXRpb24gZmFpbGVkIik7CisKKwkJLy8vLy8vLy8gY2VydGlmeSBzZXJ2aWNlMSAtIGZhaWxlZCBkdWUgdG8gdW5jZXJ0aWZpZWQgaW5zdGFuY2VzIC8vLy8vLy8vCisJCWRlc2lnbmVyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2V0U3RhdGVGYWlsZWQgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoZGVmYXVsdFNlcnZpY2UxLCBkZXNpZ25lcixMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNUKTsKKwkJdmFyaWFibGVzQXNMaXN0ID0gQXJyYXlzLmFzTGlzdChkZWZhdWx0U2VydmljZTEuZ2V0Q29tcG9uZW50VHlwZSgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxyZXNvdXJjZURldGFpbHNWRl8wMS5nZXROYW1lKCkpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlZBTElEQVRFRF9SRVNPVVJDRV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXNBc0xpc3QsY2hhbmdlU2VydmljZXRTdGF0ZUZhaWxlZC5nZXRSZXNwb25zZSgpKTsKKworCQkvLy8vLy8gY2hhbmdlIFZGMSBzdGF0ZSB0byBDRVJUSUZJRUQKKwkJcmVzb3VyY2VEZXRhaWxzVkZfMDEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZURldGFpbHNWRl8wMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQkvLy8vLy8vLyByZXBsYWNlIFZGMSBpbnN0YW5jZXMgd2l0aCBuZXcgY2VydGlmaWVkIGluc3RhbmNlcyAvLy8vLy8vLworCQljaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24gPSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24oZGVmYXVsdFNlcnZpY2UxLHJlc291cmNlRGV0YWlsc1ZGMWluc18wMSwgcmVzb3VyY2VEZXRhaWxzVkZfMDEsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCXJlc291cmNlRGV0YWlsc1ZGXzAxID0gY2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uLmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKTsKKwkJcmVzb3VyY2VEZXRhaWxzVkZDMWNvbXBJbnMxID0gY2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uLmxlZnQoKS52YWx1ZSgpLmdldFJpZ2h0KCk7CisKKwkJLy8vLy8vLyBjZXJ0aWZ5IHNlcnZpY2UxIC8vLy8vLy8vCisJCWRlZmF1bHRTZXJ2aWNlMSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGRlZmF1bHRTZXJ2aWNlMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQkvLy8vLy8vLyBkaXN0cmlidXRlIHNlcnZpY2UxIC0gc3VjY2Vzc2Z1bGx5IC8vLy8vLy8vCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmRpc3RyaWJ1dGVTZXJ2aWNlKGRlZmF1bHRTZXJ2aWNlMSwgdHJ1ZSk7CisKKwkJLy8vLy8vLyBjcmVhdGUgVkYyIC8vLy8vLy8vCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXNvdXJjZURldGFpbHNWRl8wMmUgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCxSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlyZXNvdXJjZURldGFpbHNWRl8wMiA9IHJlc291cmNlRGV0YWlsc1ZGXzAyZS5sZWZ0KCkudmFsdWUoKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Nhbml0eS9NdWx0aXBsZVJlc291cmNlVXBkYXRlLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvc2FuaXR5L011bHRpcGxlUmVzb3VyY2VVcGRhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhhNzkzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Nhbml0eS9NdWx0aXBsZVJlc291cmNlVXBkYXRlLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5zYW5pdHk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXNzb2NUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUHJvZHVjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBNdWx0aXBsZVJlc291cmNlVXBkYXRlIGV4dGVuZHMgQ29tcG9uZW50QmFzZVRlc3QgeworCisJQFJ1bGUKKwlwdWJsaWMgc3RhdGljIFRlc3ROYW1lIG5hbWUgPSBuZXcgVGVzdE5hbWUoKTsKKworCXB1YmxpYyBNdWx0aXBsZVJlc291cmNlVXBkYXRlKCkgeworCQlzdXBlcihuYW1lLCBNdWx0aXBsZVJlc291cmNlVXBkYXRlLmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzaW1wbGVTY2VuYXJpbygpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIENyZWF0aW5nIFZGIGFuZCBSZXNvdXJjZSBpbnN0YW5jZXMKKwkJUmVzb3VyY2UgdmYgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlSZXNvdXJjZSBjcDEgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLkNQLCBOb3JtYXRpdmVUeXBlc0VudW0uUE9SVCwKKwkJCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfQ09OTkVDVElWSVRZX0NPTl9QT0lOVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJUmVzb3VyY2UgY3AyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5DUCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJUmVzb3VyY2UgdmwgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZMLCBOb3JtYXRpdmVUeXBlc0VudW0uTkVUV09SSywKKwkJCQkJCVJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfQ09OTkVDVElWSVRZX1ZJUlRVQUxfTElOSywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQl2Zi5nZXRDcmVhdG9yVXNlcklkKCk7CisKKwkJLy8gQ2hlY2sgSW4gUmVzb3VyY2VzCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGNwMSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShjcDIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUodmwsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKTsKKworCQkvLyBDaGVja0luIGFsbCBvdGhlciBleGNlcHQgVkYKKwkJQ29tcG9uZW50SW5zdGFuY2UgaW5zdGFuY2VDUDEgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKGNwMSwgdmYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGluc3RhbmNlVkwgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHZsLCB2ZiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgaW5zdGFuY2VDUDIgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKGNwMiwgdmYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisKKwkJdmYgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmdldENvbXBvZW5udE9iamVjdCh2ZiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQkvLyBDcmVhdGUgVmVydGV4KExpbmsvQXNzb2NpYXRlIDIgUmVzb3VyY2UgSW5zdGFuY2VzIG9uIENhbnZhcykKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYXNzb2NpYXRlMlJlc291cmNlSW5zdGFuY2VzKHZmLCBpbnN0YW5jZUNQMSwgaW5zdGFuY2VWTCwgQXNzb2NUeXBlLkxJTktBQkxFLmdldEFzc29jVHlwZSgpLAorCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM+IGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzTGlzdC5hZGQobmV3IENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyhpbnN0YW5jZUNQMSkpOworCQljb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHNMaXN0LmFkZChuZXcgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKGluc3RhbmNlQ1AyKSk7CisJCWNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsc0xpc3QuYWRkKG5ldyBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMoaW5zdGFuY2VWTCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjb21wSW5zdERldCA9IGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsc0xpc3QuZ2V0KDApOworCQljb21wSW5zdERldC5zZXRQb3NYKCIxNTAiKTsKKwkJY29tcEluc3REZXQuc2V0UG9zWSgiMTUwIik7CisJCWNvbXBJbnN0RGV0ID0gY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzTGlzdC5nZXQoMSk7CisJCWNvbXBJbnN0RGV0LnNldFBvc1goIjQwMCIpOworCQljb21wSW5zdERldC5zZXRQb3NZKCIxNTAiKTsKKwkJY29tcEluc3REZXQgPSBjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHNMaXN0LmdldCgyKTsKKwkJY29tcEluc3REZXQuc2V0UG9zWCgiMTUwIik7CisJCWNvbXBJbnN0RGV0LnNldFBvc1koIjMwMCIpOworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLnVwZGF0ZU11bHRpcGxlQ29tcG9uZW50SW5zdGFuY2UoCisJCQkJY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzTGlzdCwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgdmYuZ2V0VW5pcXVlSWQoKSwKKwkJCQl2Zi5nZXRDb21wb25lbnRUeXBlKCkpOworCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkOiAiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCksCisJCQkJcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gUHJvZHVjdFJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKworCQljb21wSW5zdERldCA9IGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsc0xpc3QuZ2V0KDApOworCQljb21wSW5zdERldC5zZXRQb3NYKCIzNTAiKTsKKwkJY29tcEluc3REZXQuc2V0UG9zWSgiMzUwIik7CisJCWNvbXBJbnN0RGV0ID0gY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzTGlzdC5nZXQoMSk7CisJCWNvbXBJbnN0RGV0LnNldFBvc1goIjYwMCIpOworCQljb21wSW5zdERldC5zZXRQb3NZKCIzNTAiKTsKKwkJY29tcEluc3REZXQgPSBjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHNMaXN0LmdldCgyKTsKKwkJY29tcEluc3REZXQuc2V0UG9zWCgiMzUwIik7CisJCWNvbXBJbnN0RGV0LnNldFBvc1koIjUwMCIpOworCisJCXJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMudXBkYXRlTXVsdGlwbGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHNMaXN0LAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIHZmLmdldFVuaXF1ZUlkKCksIHZmLmdldENvbXBvbmVudFR5cGUoKSk7CisJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IDIwMCwgcmV0dXJuZWQ6ICIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSwKKwkJCQlyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBQcm9kdWN0UmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FDYXBhYmlsaXRpZXNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYUNhcGFiaWxpdGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjMGM4NgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FDYXBhYmlsaXRpZXNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXM7CisKK3B1YmxpYyBjbGFzcyBUb3NjYUNhcGFiaWxpdGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYURlZmluaXRpb24uamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlNGI4YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnRvc2NhLmRhdGF0eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVG9zY2FEZWZpbml0aW9uIHsKKworCVN0cmluZyB0b3NjYURlZmluaXRpb25WZXJzaW9uOworCUxpc3Q8VG9zY2FJbXBvcnRzRGVmaW5pdGlvbj4gdG9zY2FJbXBvcnRzOworCUxpc3Q8VG9zY2FOb2RlVHlwZXNEZWZpbml0aW9uPiB0b3NjYU5vZGVUeXBlczsKKwlUb3NjYVRvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIHRvc2NhVG9wb2xvZ3lUZW1wbGF0ZTsKKworCXB1YmxpYyBUb3NjYURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3NjYURlZmluaXRpb25WZXJzaW9uKCkgeworCQlyZXR1cm4gdG9zY2FEZWZpbml0aW9uVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYURlZmluaXRpb25WZXJzaW9uKFN0cmluZyB0b3NjYURlZmluaXRpb25WZXJzaW9uKSB7CisJCXRoaXMudG9zY2FEZWZpbml0aW9uVmVyc2lvbiA9IHRvc2NhRGVmaW5pdGlvblZlcnNpb247CisJfQorCisJcHVibGljIExpc3Q8VG9zY2FJbXBvcnRzRGVmaW5pdGlvbj4gZ2V0VG9zY2FJbXBvcnRzKCkgeworCQlyZXR1cm4gdG9zY2FJbXBvcnRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvc2NhSW1wb3J0cyhMaXN0PFRvc2NhSW1wb3J0c0RlZmluaXRpb24+IHRvc2NhSW1wb3J0cykgeworCQl0aGlzLnRvc2NhSW1wb3J0cyA9IHRvc2NhSW1wb3J0czsKKwl9CisKKwlwdWJsaWMgTGlzdDxUb3NjYU5vZGVUeXBlc0RlZmluaXRpb24+IGdldFRvc2NhTm9kZVR5cGVzKCkgeworCQlyZXR1cm4gdG9zY2FOb2RlVHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FOb2RlVHlwZXMoTGlzdDxUb3NjYU5vZGVUeXBlc0RlZmluaXRpb24+IHRvc2NhTm9kZVR5cGVzKSB7CisJCXRoaXMudG9zY2FOb2RlVHlwZXMgPSB0b3NjYU5vZGVUeXBlczsKKwl9CisKKwlwdWJsaWMgVG9zY2FUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbiBnZXRUb3NjYVRvcG9sb2d5VGVtcGxhdGUoKSB7CisJCXJldHVybiB0b3NjYVRvcG9sb2d5VGVtcGxhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FUb3BvbG9neVRlbXBsYXRlKFRvc2NhVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24gdG9zY2FUb3BvbG9neVRlbXBsYXRlKSB7CisJCXRoaXMudG9zY2FUb3BvbG9neVRlbXBsYXRlID0gdG9zY2FUb3BvbG9neVRlbXBsYXRlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVG9zY2FEZWZpbml0aW9uIFt0b3NjYURlZmluaXRpb25WZXJzaW9uPSIgKyB0b3NjYURlZmluaXRpb25WZXJzaW9uICsgIiwgdG9zY2FJbXBvcnRzPSIgKyB0b3NjYUltcG9ydHMKKwkJCQkrICIsIHRvc2NhTm9kZVR5cGVzPSIgKyB0b3NjYU5vZGVUeXBlcyArICIsIHRvc2NhVG9wb2xvZ3lUZW1wbGF0ZT0iICsgdG9zY2FUb3BvbG9neVRlbXBsYXRlICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdG9zY2EvZGF0YXR5cGVzL1Rvc2NhR3JvdXBzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTlmY2IzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnRvc2NhLmRhdGF0eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvLwlzcGVjIHBhZ2UgMTAyCitwdWJsaWMgY2xhc3MgVG9zY2FHcm91cHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbiB7CisKKwlTdHJpbmcgdHlwZTsgLy8gcmVxdWlyZWQKKwlTdHJpbmcgZGVzY3JpcHRpb247CisJLy8gTGlzdDxUb3NjYUdyb3Vwc1Byb3Blcmllc0RlZmluaXRpb24+IHRvc2NhR3JvdXBzUHJvcGVyaWVzRGVmaW5pdGlvbjsKKwlMaXN0PFN0cmluZz4gdGFyZ2V0czsgLy8gcmVxdWlyZWQKKwkvLyBMaXN0PFRvc2NhR3JvdXBzSW50ZXJmYWNlc0RlZmluaXRpb24+IHRvc2NhR3JvdXBzSW50ZXJmYWNlc0RlZmluaXRpb247CisJTGlzdDxTdHJpbmc+IG1lbWJlcnM7CisKKwlwdWJsaWMgVG9zY2FHcm91cHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYXJnZXRzKCkgeworCQlyZXR1cm4gdGFyZ2V0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRzKExpc3Q8U3RyaW5nPiB0YXJnZXRzKSB7CisJCXRoaXMudGFyZ2V0cyA9IHRhcmdldHM7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNZW1iZXJzKCkgeworCQlyZXR1cm4gbWVtYmVyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKExpc3Q8U3RyaW5nPiBtZW1iZXJzKSB7CisJCXRoaXMubWVtYmVycyA9IG1lbWJlcnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJUb3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIFt0eXBlPSIgKyB0eXBlICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsgIiwgdGFyZ2V0cz0iCisJCQkJKyB0YXJnZXRzICsgIiwgbWVtYmVycz0iICsgbWVtYmVycyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FJbXBvcnRzRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYUltcG9ydHNEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MzIyMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FJbXBvcnRzRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Hcm91cEhlYXRNZXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIFRvc2NhSW1wb3J0c0RlZmluaXRpb24geworCisJU3RyaW5nIHR5cGVOYW1lOworCisJTGlzdDxHcm91cEhlYXRNZXRhRGVmaW5pdGlvbj4gZ3JvdXBIZWF0TWV0YURlZmluaXRpb247CisKKwlwdWJsaWMgVG9zY2FJbXBvcnRzRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworCQlyZXR1cm4gdHlwZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxHcm91cEhlYXRNZXRhRGVmaW5pdGlvbj4gZ2V0R3JvdXBIZWF0TWV0YURlZmluaXRpb24oKSB7CisJCXJldHVybiBncm91cEhlYXRNZXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cEhlYXRNZXRhRGVmaW5pdGlvbihMaXN0PEdyb3VwSGVhdE1ldGFEZWZpbml0aW9uPiBncm91cEhlYXRNZXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmdyb3VwSGVhdE1ldGFEZWZpbml0aW9uID0gZ3JvdXBIZWF0TWV0YURlZmluaXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJUeXBlSGVhdE1ldGFEZWZpbml0aW9uIFt0eXBlTmFtZT0iICsgdHlwZU5hbWUgKyAiLCBncm91cEhlYXRNZXRhRGVmaW5pdGlvbj0iICsgZ3JvdXBIZWF0TWV0YURlZmluaXRpb24KKwkJCQkrICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FJbnB1dHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYUlucHV0c1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmODU5YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FJbnB1dHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXM7CisKK3B1YmxpYyBjbGFzcyBUb3NjYUlucHV0c1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzA0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdG9zY2EvZGF0YXR5cGVzL1Rvc2NhTm9kZVRlbXBsYXRlc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnRvc2NhLmRhdGF0eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24geworCisJU3RyaW5nIG5hbWU7CisJU3RyaW5nIHR5cGU7CisJTGlzdDxUb3NjYVByb3BlcnRpZXNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbj4gcHJvcGVydGllczsKKwlMaXN0PFRvc2NhUmVxdWlyZW1lbnRzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24+IHJlcXVpcmVtZW50czsKKwlMaXN0PFRvc2NhQ2FwYWJpbGl0aWVzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24+IGNhcGFiaWxpdGllczsKKworCXB1YmxpYyBUb3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxUb3NjYVByb3BlcnRpZXNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbj4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhMaXN0PFRvc2NhUHJvcGVydGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIExpc3Q8VG9zY2FSZXF1aXJlbWVudHNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbj4gZ2V0UmVxdWlyZW1lbnRzKCkgeworCQlyZXR1cm4gcmVxdWlyZW1lbnRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50cyhMaXN0PFRvc2NhUmVxdWlyZW1lbnRzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24+IHJlcXVpcmVtZW50cykgeworCQl0aGlzLnJlcXVpcmVtZW50cyA9IHJlcXVpcmVtZW50czsKKwl9CisKKwlwdWJsaWMgTGlzdDxUb3NjYUNhcGFiaWxpdGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uPiBnZXRDYXBhYmlsaXRpZXMoKSB7CisJCXJldHVybiBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0aWVzKExpc3Q8VG9zY2FDYXBhYmlsaXRpZXNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzKSB7CisJCXRoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24gW25hbWU9IiArIG5hbWUgKyAiLCB0eXBlPSIgKyB0eXBlICsgIiwgcHJvcGVydGllcz0iCisJCQkJKyBwcm9wZXJ0aWVzICsgIiwgcmVxdWlyZW1lbnRzPSIgKyByZXF1aXJlbWVudHMgKyAiLCBjYXBhYmlsaXRpZXM9IiArIGNhcGFiaWxpdGllcyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FOb2RlVHlwZXNEZWZpbml0aW9uLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdG9zY2EvZGF0YXR5cGVzL1Rvc2NhTm9kZVR5cGVzRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OGU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdG9zY2EvZGF0YXR5cGVzL1Rvc2NhTm9kZVR5cGVzRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXM7CisKKy8vIHNwZWMgcGFnZSA4OAorcHVibGljIGNsYXNzIFRvc2NhTm9kZVR5cGVzRGVmaW5pdGlvbiB7CisKKwlTdHJpbmcgbmFtZTsKKwlTdHJpbmcgZGVyaXZlZEZyb207CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlcml2ZWRGcm9tKCkgeworCQlyZXR1cm4gZGVyaXZlZEZyb207CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVyaXZlZEZyb20oU3RyaW5nIGRlcml2ZWRGcm9tKSB7CisJCXRoaXMuZGVyaXZlZEZyb20gPSBkZXJpdmVkRnJvbTsKKwl9CisKKwlwdWJsaWMgVG9zY2FOb2RlVHlwZXNEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQ3Nhck5vZGVUeXBlc0RlZmluaXRpb24gW25hbWU9IiArIG5hbWUgKyAiLCBkZXJpdmVkRnJvbT0iICsgZGVyaXZlZEZyb20gKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdG9zY2EvZGF0YXR5cGVzL1Rvc2NhUHJvcGVydGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdG9zY2EvZGF0YXR5cGVzL1Rvc2NhUHJvcGVydGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwYWRkMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FQcm9wZXJ0aWVzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudG9zY2EuZGF0YXR5cGVzOworCitwdWJsaWMgY2xhc3MgVG9zY2FQcm9wZXJ0aWVzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24geworCisJU3RyaW5nIG5hbWU7CisJT2JqZWN0IHZhbHVlOworCisJcHVibGljIFRvc2NhUHJvcGVydGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVG9zY2FQcm9wZXJ0eU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbiBbbmFtZT0iICsgbmFtZSArICIsIHZhbHVlPSIgKyB2YWx1ZSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FSZXF1aXJlbWVudHNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYVJlcXVpcmVtZW50c05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5ZjBmMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FSZXF1aXJlbWVudHNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXM7CisKK3B1YmxpYyBjbGFzcyBUb3NjYVJlcXVpcmVtZW50c05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uIHsKKworCVN0cmluZyBuYW1lOworCVN0cmluZyBjYXBhYmlsaXR5OworCVN0cmluZyBub2RlOworCVN0cmluZyByZWxhdGlvbnNoaXA7CisKKwlwdWJsaWMgVG9zY2FSZXF1aXJlbWVudHNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWxpdHkoKSB7CisJCXJldHVybiBjYXBhYmlsaXR5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHkoU3RyaW5nIGNhcGFiaWxpdHkpIHsKKwkJdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vZGUoKSB7CisJCXJldHVybiBub2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGUoU3RyaW5nIG5vZGUpIHsKKwkJdGhpcy5ub2RlID0gbm9kZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aW9uc2hpcCgpIHsKKwkJcmV0dXJuIHJlbGF0aW9uc2hpcDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXAoU3RyaW5nIHJlbGF0aW9uc2hpcCkgeworCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlRvc2NhUmVxdWlyZW1lbnRzRGVmaW5pdGlvbiBbbmFtZT0iICsgbmFtZSArICIsIGNhcGFiaWxpdHk9IiArIGNhcGFiaWxpdHkgKyAiLCBub2RlPSIgKyBub2RlCisJCQkJKyAiLCByZWxhdGlvbnNoaXA9IiArIHJlbGF0aW9uc2hpcCArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3Rvc2NhL2RhdGF0eXBlcy9Ub3NjYVRvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5ODY3YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy90b3NjYS9kYXRhdHlwZXMvVG9zY2FUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy8Jc3BlYyBwYWdlIDEwNAkKK3B1YmxpYyBjbGFzcyBUb3NjYVRvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIHsKKworCVN0cmluZyBkZXNjcmlwdGlvbjsKKwlMaXN0PFRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24+IHRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb247CisJTGlzdDxUb3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbj4gdG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb247CisJLy8gTGlzdDxUb3NjYVJlbGF0aW9uc2hpcFRlbXBsYXRlc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uPgorCUxpc3Q8VG9zY2FHcm91cHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbj4gdG9zY2FHcm91cHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKKwkvLyBMaXN0PFRvc2NhUG9saWNpZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbj4KKwkvLyB0b3NjYVBvbG9jaWVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb247CisJLy8gTGlzdDxUb3NjYU91dHB1dHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbj4KKwkvLyB0b3NjYU91dHB1dHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKKworCXB1YmxpYyBUb3NjYVRvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBMaXN0PFRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24+IGdldFRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24oKSB7CisJCXJldHVybiB0b3NjYUlucHV0c1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24oCisJCQlMaXN0PFRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24+IHRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24pIHsKKwkJdGhpcy50b3NjYUlucHV0c1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uID0gdG9zY2FJbnB1dHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgTGlzdDxUb3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbj4gZ2V0VG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24oKSB7CisJCXJldHVybiB0b3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbigKKwkJCUxpc3Q8VG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24+IHRvc2NhTm9kZVRlbXBsYXRlc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uKSB7CisJCXRoaXMudG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24gPSB0b3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgTGlzdDxUb3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uPiBnZXRUb3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gdG9zY2FHcm91cHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uKAorCQkJTGlzdDxUb3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uPiB0b3NjYUdyb3Vwc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uKSB7CisJCXRoaXMudG9zY2FHcm91cHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbiA9IHRvc2NhR3JvdXBzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJUb3NjYVRvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIFt0b3NjYUlucHV0c1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uPSIKKwkJCQkrIHRvc2NhSW5wdXRzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24gKyAiLCB0b3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbj0iCisJCQkJKyB0b3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbiArICIsIHRvc2NhR3JvdXBzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb249IgorCQkJCSsgdG9zY2FHcm91cHNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbiArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91c2Vycy9BZGRVc2VyQXVkaXRNZXNzYWdlSW5mby5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3VzZXJzL0FkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhOGFkZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91c2Vycy9BZGRVc2VyQXVkaXRNZXNzYWdlSW5mby5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXNlcnM7CisKK3B1YmxpYyBjbGFzcyBBZGRVc2VyQXVkaXRNZXNzYWdlSW5mbyB7CisKKwlTdHJpbmcgVElNRVNUQU1QOworCVN0cmluZyBBQ1RJT047CisJLy8gU3RyaW5nIE1PRElGSUVSX05BTUU7CisJU3RyaW5nIE1PRElGSUVSOworCS8vIFN0cmluZyBVU0VSX1VJRDsKKwkvLyBTdHJpbmcgVVNFUl9OQU1FOworCS8vIFN0cmluZyBVU0VSX0VNQUlMOworCS8vIFN0cmluZyBVU0VSX1JPTEU7CisJU3RyaW5nIFVTRVI7CisJU3RyaW5nIFNUQVRVUzsKKwlTdHJpbmcgREVTQzsKKworCXB1YmxpYyBBZGRVc2VyQXVkaXRNZXNzYWdlSW5mbyhTdHJpbmcgdGltZXN0YW1wLCBTdHJpbmcgYWN0aW9uLCBTdHJpbmcgbW9kaWZpZXJOYW1lLCBTdHJpbmcgbW9kaWZpZXJVaWQsCisJCQlTdHJpbmcgdXNlciwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGRlc2MpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5USU1FU1RBTVAgPSB0aW1lc3RhbXA7CisJCXRoaXMuQUNUSU9OID0gYWN0aW9uOworCQkvLyB0aGlzLk1PRElGSUVSX05BTUUgPSBtb2RpZmllck5hbWU7CisJCXRoaXMuTU9ESUZJRVIgPSBtb2RpZmllclVpZDsKKwkJdGhpcy5VU0VSID0gdXNlcjsKKwkJdGhpcy5TVEFUVVMgPSBzdGF0dXM7CisJCXRoaXMuREVTQyA9IGRlc2M7CisJfQorCisJcHVibGljIEFkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VElNRVNUQU1QKCkgeworCQlyZXR1cm4gVElNRVNUQU1QOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRJTUVTVEFNUChTdHJpbmcgdElNRVNUQU1QKSB7CisJCVRJTUVTVEFNUCA9IHRJTUVTVEFNUDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFDVElPTigpIHsKKwkJcmV0dXJuIEFDVElPTjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBQ1RJT04oU3RyaW5nIGFDVElPTikgeworCQlBQ1RJT04gPSBhQ1RJT047CisJfQorCisJLy8gcHVibGljIFN0cmluZyBnZXRNT0RJRklFUl9OQU1FKCkgeworCS8vIHJldHVybiBNT0RJRklFUl9OQU1FOworCS8vIH0KKwkvLyBwdWJsaWMgdm9pZCBzZXRNT0RJRklFUl9OQU1FKFN0cmluZyBtT0RJRklFUl9OQU1FKSB7CisJLy8gTU9ESUZJRVJfTkFNRSA9IG1PRElGSUVSX05BTUU7CisJLy8gfQorCXB1YmxpYyBTdHJpbmcgZ2V0TU9ESUZJRVIoKSB7CisJCXJldHVybiBNT0RJRklFUjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNT0RJRklFUihTdHJpbmcgbU9ESUZJRVJfVUlEKSB7CisJCU1PRElGSUVSID0gbU9ESUZJRVJfVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VVNFUigpIHsKKwkJcmV0dXJuIFVTRVI7CisJfQorCisJcHVibGljIHZvaWQgc2V0VVNFUihTdHJpbmcgdVNFUikgeworCQlVU0VSID0gdVNFUjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNUQVRVUygpIHsKKwkJcmV0dXJuIFNUQVRVUzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTVEFUVVMoU3RyaW5nIHNUQVRVUykgeworCQlTVEFUVVMgPSBzVEFUVVM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRERVNDKCkgeworCQlyZXR1cm4gREVTQzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRERVNDKFN0cmluZyBkRVNDKSB7CisJCURFU0MgPSBkRVNDOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQWRkVXNlckF1ZGl0TWVzc2FnZUluZm8gW3RpbWVzdGFtcD0iICsgVElNRVNUQU1QICsgIiwgYWN0aW9uPSIgKyBBQ1RJT04gKyAiLCBtb2RpZmllclVpZD0iICsgTU9ESUZJRVIKKwkJCQkrICIsIHVzZXI9IiArIFVTRVIgKyAiLCBzdGF0dXM9IiArIFNUQVRVUyArICIsIGRlc2M9IiArIERFU0MgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXNlcnMvVXNlckF1ZGl0SmF2YU9iamVjdC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3VzZXJzL1VzZXJBdWRpdEphdmFPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzRkNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3VzZXJzL1VzZXJBdWRpdEphdmFPYmplY3QuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnVzZXJzOworCitwdWJsaWMgY2xhc3MgVXNlckF1ZGl0SmF2YU9iamVjdCB7CisKKwlTdHJpbmcgVElNRVNUQU1QOworCVN0cmluZyBBQ1RJT047CisJLy8gU3RyaW5nIE1PRElGSUVSX05BTUU7CisJU3RyaW5nIE1PRElGSUVSOworCVN0cmluZyBVU0VSOworCS8vIFN0cmluZyBVU0VSX05BTUU7CisJLy8gU3RyaW5nIFVTRVJfRU1BSUw7CisJLy8gU3RyaW5nIFVTRVJfUk9MRTsKKwlTdHJpbmcgU1RBVFVTOworCVN0cmluZyBERVNDOworCisJcHVibGljIFVzZXJBdWRpdEphdmFPYmplY3QoU3RyaW5nIHRpbWVzdGFtcCwgU3RyaW5nIGFjdGlvbiwgU3RyaW5nIG1vZGlmaWVyLCBTdHJpbmcgdXNlciwgU3RyaW5nIHN0YXR1cywKKwkJCVN0cmluZyBkZXNjKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuVElNRVNUQU1QID0gdGltZXN0YW1wOworCQl0aGlzLkFDVElPTiA9IGFjdGlvbjsKKwkJLy8gdGhpcy5NT0RJRklFUl9OQU1FID0gbW9kaWZpZXJOYW1lOworCQl0aGlzLk1PRElGSUVSID0gbW9kaWZpZXI7CisJCXRoaXMuVVNFUiA9IHVzZXI7CisJCS8vIHRoaXMuVVNFUl9OQU1FID0gdXNlck5hbWU7CisJCS8vIHRoaXMuVVNFUl9FTUFJTCA9IHVzZXJFbWFpbDsKKwkJLy8gdGhpcy5VU0VSX1JPTEUgPSB1c2VyUm9sZTsKKwkJdGhpcy5TVEFUVVMgPSBzdGF0dXM7CisJCXRoaXMuREVTQyA9IGRlc2M7CisJfQorCisJcHVibGljIFVzZXJBdWRpdEphdmFPYmplY3QoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUSU1FU1RBTVAoKSB7CisJCXJldHVybiBUSU1FU1RBTVA7CisJfQorCisJcHVibGljIHZvaWQgc2V0VElNRVNUQU1QKFN0cmluZyB0SU1FU1RBTVApIHsKKwkJVElNRVNUQU1QID0gdElNRVNUQU1QOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QUNUSU9OKCkgeworCQlyZXR1cm4gQUNUSU9OOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFDVElPTihTdHJpbmcgYUNUSU9OKSB7CisJCUFDVElPTiA9IGFDVElPTjsKKwl9CisKKwkvLyBwdWJsaWMgU3RyaW5nIGdldE1PRElGSUVSX05BTUUoKSB7CisJLy8gcmV0dXJuIE1PRElGSUVSX05BTUU7CisJLy8gfQorCS8vIHB1YmxpYyB2b2lkIHNldE1PRElGSUVSX05BTUUoU3RyaW5nIG1PRElGSUVSX05BTUUpIHsKKwkvLyBNT0RJRklFUl9OQU1FID0gbU9ESUZJRVJfTkFNRTsKKwkvLyB9CisJcHVibGljIFN0cmluZyBnZXRNT0RJRklFUigpIHsKKwkJcmV0dXJuIE1PRElGSUVSOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1PRElGSUVSKFN0cmluZyBtT0RJRklFUl9VSUQpIHsKKwkJTU9ESUZJRVIgPSBtT0RJRklFUl9VSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVU0VSKCkgeworCQlyZXR1cm4gVVNFUjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVU0VSKFN0cmluZyB1U0VSKSB7CisJCVVTRVIgPSB1U0VSOworCX0KKworCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VVNFUl9OQU1FKCkgeworCS8vIHJldHVybiBVU0VSX05BTUU7CisJLy8gfQorCS8vIHB1YmxpYyB2b2lkIHNldFVTRVJfTkFNRShTdHJpbmcgdVNFUl9OQU1FKSB7CisJLy8gVVNFUl9OQU1FID0gdVNFUl9OQU1FOworCS8vIH0KKwkvLyBwdWJsaWMgU3RyaW5nIGdldFVTRVJfRU1BSUwoKSB7CisJLy8gcmV0dXJuIFVTRVJfRU1BSUw7CisJLy8gfQorCS8vIHB1YmxpYyB2b2lkIHNldFVTRVJfRU1BSUwoU3RyaW5nIHVTRVJfRU1BSUwpIHsKKwkvLyBVU0VSX0VNQUlMID0gdVNFUl9FTUFJTDsKKwkvLyB9CisJLy8gcHVibGljIFN0cmluZyBnZXRVU0VSX1JPTEUoKSB7CisJLy8gcmV0dXJuIFVTRVJfUk9MRTsKKwkvLyB9CisJLy8gcHVibGljIHZvaWQgc2V0VVNFUl9ST0xFKFN0cmluZyB1U0VSX1JPTEUpIHsKKwkvLyBVU0VSX1JPTEUgPSB1U0VSX1JPTEU7CisJLy8gfQorCXB1YmxpYyBTdHJpbmcgZ2V0U1RBVFVTKCkgeworCQlyZXR1cm4gU1RBVFVTOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNUQVRVUyhTdHJpbmcgc1RBVFVTKSB7CisJCVNUQVRVUyA9IHNUQVRVUzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERFU0MoKSB7CisJCXJldHVybiBERVNDOworCX0KKworCXB1YmxpYyB2b2lkIHNldERFU0MoU3RyaW5nIGRFU0MpIHsKKwkJREVTQyA9IGRFU0M7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJVc2VyQXVkaXRKYXZhT2JqZWN0IFt0aW1lc3RhbXA9IiArIFRJTUVTVEFNUCArICIsIGFjdGlvbj0iICsgQUNUSU9OICsgIiwgbW9kaWZpZXI9IiArIE1PRElGSUVSCisJCQkJKyAiLCB1c2VyPSIgKyBVU0VSICsgIiwgc3RhdHVzPSIgKyBTVEFUVVMgKyAiLCBkZXNjPSIgKyBERVNDICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3VzZXJzL1VzZXJIZWFkZXJEYXRhLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXNlcnMvVXNlckhlYWRlckRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjMyMGJjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3VzZXJzL1VzZXJIZWFkZXJEYXRhLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnVzZXJzOworCitwdWJsaWMgY2xhc3MgVXNlckhlYWRlckRhdGEgeworCVN0cmluZyBjb250ZW50VHlwZTsKKwlTdHJpbmcgaHR0cENzcFVzZXJJZDsKKwlTdHJpbmcgYWNjZXB0OworCisJcHVibGljIFVzZXJIZWFkZXJEYXRhKFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIGh0dHBDc3BVc2VySWQsIFN0cmluZyBhY2NlcHQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworCQl0aGlzLmh0dHBDc3BVc2VySWQgPSBodHRwQ3NwVXNlcklkOworCQl0aGlzLmFjY2VwdCA9IGFjY2VwdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworCQlyZXR1cm4gY29udGVudFR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEh0dHBDc3BVc2VySWQoKSB7CisJCXJldHVybiBodHRwQ3NwVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEh0dHBDc3BVc2VySWQoU3RyaW5nIGh0dHBDc3BVc2VySWQpIHsKKwkJdGhpcy5odHRwQ3NwVXNlcklkID0gaHR0cENzcFVzZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjY2VwdCgpIHsKKwkJcmV0dXJuIGFjY2VwdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY2NlcHQoU3RyaW5nIGFjY2VwdCkgeworCQl0aGlzLmFjY2VwdCA9IGFjY2VwdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91c2Vycy9Vc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3VzZXJzL1VzZXJSZXNwb25zZU1lc3NhZ2VFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNTJjMgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91c2Vycy9Vc2VyUmVzcG9uc2VNZXNzYWdlRW51bS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51c2VyczsKKworcHVibGljIGVudW0gVXNlclJlc3BvbnNlTWVzc2FnZUVudW0geworCQorCVNVQ0NFU1NfTUVTU0FHRSgiT0siKSwKKwlNSVNTSU5HX0lORk9STUFUSU9OKCJFcnJvcjogTWlzc2luZyBpbmZvcm1hdGlvbiIpLAorCU1FVEhPRF9OT1RfQUxMT1dFRCgiRXJyb3I6IE1ldGhvZCBub3QgYWxsb3dlZCIpLAorCVJFU1RSSUNURURfT1BFUkFUSU9OKCJFcnJvcjogUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwKKwlVU0VSX0FMUkVBRFlfRVhJU1RTKCJFcnJvcjogVXNlciB3aXRoICVzIElEIGFscmVhZHkgZXhpc3RzIiksCisJSU5WQUxJRF9FTUFJTCgiRXJyb3I6IEludmFsaWQgQ29udGVudC4gSW52YWxpZCBlLW1haWwgYWRkcmVzcyAlcyIpLAorCUlOVkFMSURfUk9MRSgiRXJyb3I6IEludmFsaWQgQ29udGVudC4gSW52YWxpZCByb2xlICVzIiksCisJSU5WQUxJRF9DT05URU5UKCJFcnJvcjogSW52YWxpZCBjb250ZW50IiksCisJVVNFUl9OT1RfRk9VTkQoIkVycm9yOiBVc2VyIHdpdGggJXMgSUQgaXMgbm90IGZvdW5kIiksCisJSU5URVJOQUxfU0VSVkVSX0VSUk9SKCJFcnJvcjogSW50ZXJuYWwgU2VydmVyIEVycm9yLiBUcnkgbGF0ZXIgYWdhaW4iKSwKKwlBRE1JTklTVEFSVE9SX0NBTl9CRV9ERUxFVEVEKCJFcnJvcjogQWRtaW5pc3RyYXRvciBjYW4gYmUgZGVsZXRlZCBieSBvdGhlciBhZG1pbmlzdHJhdG9yIG9ubHkiKSwKKwlSRVNUUklDVEVEX0FDQ0VTUygiRXJyb3I6IFJlc3RyaWN0ZWQgYWNjZXNzIik7CisJCisJU3RyaW5nIHZhbHVlOworCisJcHJpdmF0ZSBVc2VyUmVzcG9uc2VNZXNzYWdlRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91c2Vycy9XZWJTZWFsVXNlckRldGFpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91c2Vycy9XZWJTZWFsVXNlckRldGFpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDllYmYyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3VzZXJzL1dlYlNlYWxVc2VyRGV0YWlscy5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51c2VyczsKKworcHVibGljIGNsYXNzIFdlYlNlYWxVc2VyRGV0YWlscyB7CisJU3RyaW5nIGZpcnN0TmFtZTsKKwlTdHJpbmcgbGFzdE5hbWU7CisJU3RyaW5nIHVzZXJJZDsKKwlTdHJpbmcgZW1haWw7CisKKwlwdWJsaWMgV2ViU2VhbFVzZXJEZXRhaWxzKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBXZWJTZWFsVXNlckRldGFpbHMoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIGxhc3ROYW1lLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgZW1haWxBZGRyZXNzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOworCQl0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCQl0aGlzLmVtYWlsID0gZW1haWxBZGRyZXNzOworCisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKSB7CisJCXJldHVybiBmaXJzdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHsKKwkJdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpIHsKKwkJcmV0dXJuIGxhc3ROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgeworCQl0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VySWQoKSB7CisJCXJldHVybiB1c2VySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyB1c2VySWQpIHsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFbWFpbEFkZHJlc3MoKSB7CisJCXJldHVybiBlbWFpbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbWFpbEFkZHJlc3MoU3RyaW5nIGVtYWlsQWRkcmVzcykgeworCQl0aGlzLmVtYWlsID0gZW1haWxBZGRyZXNzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL0FydGlmYWN0VXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9BcnRpZmFjdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmOGZmZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9BcnRpZmFjdFV0aWxzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdFV0aWxzIHsKKworCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3REZWZpbml0aW9uIGNvbnZlcnRBcnRpZmFjdFJlcVRvRGVmaW5pdGlvbihBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXEpIHsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0ID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCQlhcnRpZmFjdC5zZXRBcnRpZmFjdExhYmVsKGFydGlmYWN0UmVxLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCWFydGlmYWN0LnNldEFydGlmYWN0RGlzcGxheU5hbWUoYXJ0aWZhY3RSZXEuZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKTsKKwkJYXJ0aWZhY3Quc2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLmZpbmRUeXBlKGFydGlmYWN0UmVxLmdldEFydGlmYWN0R3JvdXBUeXBlKCkpKTsKKwkJYXJ0aWZhY3Quc2V0QXJ0aWZhY3RUeXBlKGFydGlmYWN0UmVxLmdldEFydGlmYWN0VHlwZSgpLnRvVXBwZXJDYXNlKCkpOworCQlhcnRpZmFjdC5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3RSZXEuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQlhcnRpZmFjdC5zZXREZXNjcmlwdGlvbihhcnRpZmFjdFJlcS5nZXREZXNjcmlwdGlvbigpKTsKKwkJYXJ0aWZhY3Quc2V0VW5pcXVlSWQoYXJ0aWZhY3RSZXEuZ2V0VW5pcXVlSWQoKSk7CisJCWFydGlmYWN0LnNldFRpbWVvdXQoYXJ0aWZhY3RSZXEuZ2V0VGltZW91dCgpKTsKKwkJYXJ0aWZhY3Quc2V0RXNJZChhcnRpZmFjdFJlcS5nZXRVbmlxdWVJZCgpKTsKKworCQlyZXR1cm4gYXJ0aWZhY3Q7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL0RiVXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9EYlV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyOTVjYgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9EYlV0aWxzLmphdmEKQEAgLTAsMCArMSwzMDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuRWxlbWVudEhlbHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51c2Vycy5Vc2VyQXVkaXRKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmNhc3NhbmRyYS5DYXNzYW5kcmFVdGlsczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5FZGdlOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5GYWN0b3J5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBEYlV0aWxzIHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyB0aXRhbkNvbmZpZ0ZpbGVQYXRoOworCXByaXZhdGUgc3RhdGljIFRpdGFuR3JhcGggdGl0YW5HcmFwaDsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbkFsbEF1ZGl0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIHV0aWxzLmRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJfYWxsIik7CisJCS8vIGRlbGV0ZUZyb21Fc0RiQnlQYXR0ZXJuKCJhdWRpdGluZ2V2ZW50cy0qIik7CisJCUNhc3NhbmRyYVV0aWxzLnRydW5jYXRlQWxsVGFibGVzKCJzZGNhdWRpdCIpOworCisJCS8vIExpc3QgPEVzSW5kZXhUeXBlSWRUb0RlbGV0ZT4gYXVkaXRJZEFycmF5ID0gbmV3CisJCS8vIEFycmF5TGlzdDxFc0luZGV4VHlwZUlkVG9EZWxldGU+KCk7CisJCS8vIGF1ZGl0SWRBcnJheSA9IGJ1aWxkT2JqZWN0QXJyYXlMaXN0QnlUeXBlc0luZGV4KCJhdWRpdGluZ2V2ZW50cyoiLAorCQkvLyAidXNlcmFjY2Vzc2V2ZW50Iik7CisJCS8vCisJCS8vIGxvZ2dlci5pbmZvKCJTdGFydGluZyB0byBkZWxldGUgYWxsIHNlcnZpY2UgdG9wb2xvZ2llcyBmcm9tIEVTIik7CisJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgYXVkaXRJZEFycmF5LnNpemUoKTsgaSArKyl7CisJCS8vIEVzSW5kZXhUeXBlSWRUb0RlbGV0ZSBlc0luZGV4VHlwZUlkVG9EZWxldGUgPSBhdWRpdElkQXJyYXkuZ2V0KGkpOworCQkvLyB1dGlscy5kZWxldGVGcm9tRXNEYkJ5UGF0dGVybihlc0luZGV4VHlwZUlkVG9EZWxldGUuZ2V0SW5kZXgoKSsiLyIrZXNJbmRleFR5cGVJZFRvRGVsZXRlLmdldFR5cGUoKSsiLyIrZXNJbmRleFR5cGVJZFRvRGVsZXRlLmdldElkKCkpOworCQkvLworCQkvLyB9CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlRnJvbUVzRGJCeVBhdHRlcm4oU3RyaW5nIHBhdHRlcm5Ub0RlbGV0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9TRUFSQ0hfREFUQV9GUk9NX0VTLCBjb25maWcuZ2V0RXNIb3N0KCksIGNvbmZpZy5nZXRFc1BvcnQoKSwKKwkJCQlwYXR0ZXJuVG9EZWxldGUpOworCQlIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gaHR0cFJlcXVlc3QuaHR0cFNlbmREZWxldGUodXJsLCBudWxsKTsKKwkJcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVSTCB0byBkZWxldGUiICsgdXJsKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZXNwb25zZSBjb2RlIiArIHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWNsZWFuQWxsQXVkaXRzKCk7CisKKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRGcm9tRXNCeVBhdHRlcm4oU3RyaW5nIHBhdHRlcm5Ub0dldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9TRUFSQ0hfREFUQV9GUk9NX0VTLCBjb25maWcuZ2V0RXNIb3N0KCksIGNvbmZpZy5nZXRFc1BvcnQoKSwgcGF0dGVyblRvR2V0KTsKKwkJSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGh0dHBSZXF1ZXN0Lmh0dHBTZW5kR2V0KHVybCwgbnVsbCk7CisJCXJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJVUkwgdG8gZ2V0IiArIHVybCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVzcG9uc2UgY29kZSIgKyByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCXJldHVybiByZXN0UmVzcG9uc2U7CisJfQorCisJcHVibGljIEVpdGhlcjxWZXJ0ZXgsIEJvb2xlYW4+IGdldFZlcnRleEJ5VUlkKFN0cmluZyB1aWQpIHsKKwkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ2V0VGl0YW5HcmFwaCgpOworCQlFaXRoZXI8VmVydGV4LCBCb29sZWFuPiByZXN1bHQgPSBFaXRoZXIucmlnaHQoZmFsc2UpOworCQkvLyBJdGVyYXRvcjxWZXJ0ZXg+IHZlcnRleEl0ciA9IHRpdGFuR3JhcGguZ2V0VmVydGljZXMoKS5pdGVyYXRvcigpOworCisJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiB2ZXJ0ZXhJdHIgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkudmVydGljZXMoKS5pdGVyYXRvcigpOworCQl3aGlsZSAodmVydGV4SXRyLmhhc05leHQoKSkgeworCQkJVmVydGV4IHZlcnRleCA9IHZlcnRleEl0ci5uZXh0KCk7CisJCQkvLyBTdHJpbmcgdWlkRm91bmRWYWwgPSB2ZXJ0ZXguZ2V0UHJvcGVydHkoInVpZCIpOworCQkJU3RyaW5nIHVpZEZvdW5kVmFsID0gdmVydGV4LnZhbHVlKCJ1aWQiKTsKKwkJCWlmICh1aWQuZXF1YWxzKHVpZEZvdW5kVmFsKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHZlcnRleCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFRpdGFuU3RhdGUgZ2V0Q3VycmVudFRpdGFuU3RhdGUoKSB7CisJCVRpdGFuR3JhcGggdGl0YW5HcmFwaCA9IGdldFRpdGFuR3JhcGgoKTsKKwkJTGlzdDxWZXJ0ZXg+IHZlcnRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUxpc3Q8RWRnZT4gZWRnZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJLy8gSXRlcmF0b3I8RWRnZT4gZWRnZXNJdHIgPSB0aXRhbkdyYXBoLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsKKwkJSXRlcmF0b3I8VGl0YW5FZGdlPiBlZGdlc0l0ciA9IHRpdGFuR3JhcGgucXVlcnkoKS5lZGdlcygpLml0ZXJhdG9yKCk7CisJCS8vIEl0ZXJhdG9yPFZlcnRleD4gdmVydGljZXNJdHIgPSB0aXRhbkdyYXBoLmdldFZlcnRpY2VzKCkuaXRlcmF0b3IoKTsKKwkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzSXRyID0gdGl0YW5HcmFwaC5xdWVyeSgpLnZlcnRpY2VzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGVkZ2VzSXRyLmhhc05leHQoKSkgeworCQkJZWRnZXMuYWRkKGVkZ2VzSXRyLm5leHQoKSk7CisJCX0KKwkJd2hpbGUgKHZlcnRpY2VzSXRyLmhhc05leHQoKSkgeworCQkJdmVydGljZXMuYWRkKHZlcnRpY2VzSXRyLm5leHQoKSk7CisJCX0KKworCQlUaXRhblN0YXRlIGN1cnJTdGF0ZSA9IG5ldyBUaXRhblN0YXRlKGVkZ2VzLCB2ZXJ0aWNlcyk7CisJCXJldHVybiBjdXJyU3RhdGU7CisKKwl9CisKKwkvLworCXByaXZhdGUgc3RhdGljIFRpdGFuR3JhcGggZ2V0VGl0YW5HcmFwaCgpIHsKKwkJaWYgKHRpdGFuR3JhcGggPT0gbnVsbCkgeworCQkJdGl0YW5HcmFwaCA9IFRpdGFuRmFjdG9yeS5vcGVuKHRpdGFuQ29uZmlnRmlsZVBhdGgpOworCQl9CisJCXJldHVybiB0aXRhbkdyYXBoOworCX0KKworCXB1YmxpYyB2b2lkIHJlc3RvcmVUb1RpdGFuU3RhdGUoVGl0YW5TdGF0ZSB0aXRhblN0YXRlVG9SZXN0b3JlVG8pIHsKKwkJTGlzdDxWZXJ0ZXg+IHZlcnRpY2VzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PD4oKSwgdmVydGljZXNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PEVkZ2U+IGVkZ2VzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PD4oKSwgZWRnZXNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCVRpdGFuU3RhdGUgY3VycmVudFRpdGFuU3RhdGUgPSBnZXRDdXJyZW50VGl0YW5TdGF0ZSgpOworCisJCUxpc3Q8RWRnZT4gam9pbmVkRWRnZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJam9pbmVkRWRnZXMuYWRkQWxsKHRpdGFuU3RhdGVUb1Jlc3RvcmVUby5lZGdlcyk7CisJCWpvaW5lZEVkZ2VzLnJldGFpbkFsbChjdXJyZW50VGl0YW5TdGF0ZS5lZGdlcyk7CisKKwkJTGlzdDxWZXJ0ZXg+IGpvaW5lZFZlcnRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWpvaW5lZFZlcnRpY2VzLmFkZEFsbCh0aXRhblN0YXRlVG9SZXN0b3JlVG8udmVydGljZXMpOworCQlqb2luZWRWZXJ0aWNlcy5yZXRhaW5BbGwoY3VycmVudFRpdGFuU3RhdGUudmVydGljZXMpOworCisJCWVkZ2VzVG9SZW1vdmUuYWRkQWxsKGN1cnJlbnRUaXRhblN0YXRlLmVkZ2VzKTsKKwkJZWRnZXNUb1JlbW92ZS5yZW1vdmVBbGwoam9pbmVkRWRnZXMpOworCisJCXZlcnRpY2VzVG9SZW1vdmUuYWRkQWxsKGN1cnJlbnRUaXRhblN0YXRlLnZlcnRpY2VzKTsKKwkJdmVydGljZXNUb1JlbW92ZS5yZW1vdmVBbGwoam9pbmVkVmVydGljZXMpOworCisJCWVkZ2VzVG9BZGQuYWRkQWxsKHRpdGFuU3RhdGVUb1Jlc3RvcmVUby5lZGdlcyk7CisJCWVkZ2VzVG9BZGQucmVtb3ZlQWxsKGpvaW5lZEVkZ2VzKTsKKworCQl2ZXJ0aWNlc1RvQWRkLmFkZEFsbCh0aXRhblN0YXRlVG9SZXN0b3JlVG8udmVydGljZXMpOworCQl2ZXJ0aWNlc1RvQWRkLnJlbW92ZUFsbChqb2luZWRWZXJ0aWNlcyk7CisKKwkJbW9kaWZ5R3JhcGhBY2NvcmRpbmdUb0RlbHRhKHZlcnRpY2VzVG9SZW1vdmUsIHZlcnRpY2VzVG9BZGQsIGVkZ2VzVG9SZW1vdmUsIGVkZ2VzVG9BZGQpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIG1vZGlmeUdyYXBoQWNjb3JkaW5nVG9EZWx0YShMaXN0PFZlcnRleD4gdmVydGljZXNUb1JlbW92ZSwgTGlzdDxWZXJ0ZXg+IHZlcnRpY2VzVG9BZGQsCisJCQlMaXN0PEVkZ2U+IGVkZ2VzVG9SZW1vdmUsIExpc3Q8RWRnZT4gZWRnZXNUb0FkZCkgeworCisJCVRpdGFuR3JhcGggdGl0YW5HcmFwaCA9IGdldFRpdGFuR3JhcGgoKTsKKworCQlmb3IgKFZlcnRleCB2ZXJ0ZXggOiB2ZXJ0aWNlc1RvUmVtb3ZlKSB7CisJCQkvLyB0aXRhbkdyYXBoLnJlbW92ZVZlcnRleCh2ZXJ0ZXgpOworCQkJdmVydGV4LnJlbW92ZSgpOworCQl9CisJCWZvciAoVmVydGV4IHZlcnRleCA6IHZlcnRpY2VzVG9BZGQpIHsKKwkJCVRpdGFuVmVydGV4IHRpdGFuVmVydGV4ID0gdGl0YW5HcmFwaC5hZGRWZXJ0ZXgoKTsKKwkJCWNvcHlQcm9wZXJ0aWVzKHZlcnRleCwgdGl0YW5WZXJ0ZXgpOworCQl9CisKKwkJZm9yIChFZGdlIGVkZ2UgOiBlZGdlc1RvUmVtb3ZlKSB7CisJCQkvLyB0aXRhbkdyYXBoLnJlbW92ZUVkZ2UoZWRnZSk7CisJCQllZGdlLnJlbW92ZSgpOworCQl9CisKKwkJZm9yIChFZGdlIGVkZ2UgOiBlZGdlc1RvQWRkKSB7CisJCQkvLyBFbGVtZW50IGFkZGVkRWRnZSA9IHRpdGFuR3JhcGguYWRkRWRnZShlZGdlLmdldElkKCksCisJCQkvLyBlZGdlLmdldFZlcnRleChEaXJlY3Rpb24uT1VUKSwgZWRnZS5nZXRWZXJ0ZXgoRGlyZWN0aW9uLklOKSwKKwkJCS8vIGVkZ2UuZ2V0TGFiZWwoKSk7CisKKwkJCS8vIEVkZ2UgZWRnZSA9IHRHcmFwaC5hZGRFZGdlKG51bGwsIGZyb21WLmxlZnQoKS52YWx1ZSgpLAorCQkJLy8gdG9WLmxlZnQoKS52YWx1ZSgpLCB0eXBlKTsKKworCQkJRWxlbWVudCBhZGRlZEVkZ2UgPSBlZGdlLm91dFZlcnRleCgpLmFkZEVkZ2UoZWRnZS5sYWJlbCgpLCBlZGdlLmluVmVydGV4KCkpOworCisJCQljb3B5UHJvcGVydGllcyhlZGdlLCBhZGRlZEVkZ2UpOworCisJCX0KKworCQkvLyB0aXRhbkdyYXBoLmNvbW1pdCgpOworCQl0aXRhbkdyYXBoLnR4KCkuY29tbWl0KCk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgY29weVByb3BlcnRpZXMoRWxlbWVudCBjb3B5RnJvbSwgRWxlbWVudCBjb3B5VG8pIHsKKwkJLy8gU2V0PFN0cmluZz4gcHJvcGVydGllcyA9IGNvcHlGcm9tLmdldFByb3BlcnR5S2V5cygpOworCQlTZXQ8U3RyaW5nPiBwcm9wZXJ0aWVzID0gY29weUZyb20ua2V5cygpOworCQlmb3IgKFN0cmluZyBwcm9wZXJ0eUtleSA6IHByb3BlcnRpZXMpIHsKKwkJCS8vIGNvcHlUby5zZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSwKKwkJCS8vIGNvcHlGcm9tLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KSk7CisJCQljb3B5VG8ucHJvcGVydHkocHJvcGVydHlLZXksIGNvcHlGcm9tLnZhbHVlKHByb3BlcnR5S2V5KSk7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGl0YW5TdGF0ZSB7CisJCXByaXZhdGUgTGlzdDxFZGdlPiBlZGdlczsKKwkJcHJpdmF0ZSBMaXN0PFZlcnRleD4gdmVydGljZXM7CisKKwkJcHJpdmF0ZSBUaXRhblN0YXRlKExpc3Q8RWRnZT4gZWRnZXMsIExpc3Q8VmVydGV4PiB2ZXJ0aWNlcykgeworCQkJdGhpcy5lZGdlcyA9IGVkZ2VzOworCQkJdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIlRpdGFuU3RhdGUgW2VkZ2VzPSIgKyBlZGdlcy5zaXplKCkgKyAiLCB2ZXJ0aWNlcz0iICsgdmVydGljZXMuc2l6ZSgpICsgIl0iOworCQl9CisKKwl9CisKKwlwdWJsaWMgdm9pZCBzaHV0RG93bnRpdGFuKCkgeworCQlpZiAodGl0YW5HcmFwaCAhPSBudWxsKSB7CisJCQkvLyB0aXRhbkdyYXBoLnNodXRkb3duKCk7CisJCQl0aXRhbkdyYXBoLmNsb3NlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhFbGVtZW50IGVsZW1lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgZmFsc2UgPT0gcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKworCQkJT2JqZWN0W10gcHJvcGVydHlLZXlWYWx1ZXMgPSBuZXcgT2JqZWN0W3Byb3BlcnRpZXMuc2l6ZSgpICogMl07CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJCXByb3BlcnR5S2V5VmFsdWVzW2krK10gPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlwcm9wZXJ0eUtleVZhbHVlc1tpKytdID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCX0KKworCQkJRWxlbWVudEhlbHBlci5hdHRhY2hQcm9wZXJ0aWVzKGVsZW1lbnQsIHByb3BlcnR5S2V5VmFsdWVzKTsKKworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFVzZXJBdWRpdEphdmFPYmplY3QgcGFyc2VBdWRpdFJlc3BCeUFjdGlvbihTdHJpbmcgYWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBTdHJpbmcgaW5kZXggPSAiYXVkaXRpbmdldmVudHMqIjsKKwkJLy8gU3RyaW5nIHR5cGUgPSAidXNlcmFkbWluZXZlbnQiOworCQkvLyBTdHJpbmcgcGF0dGVybiA9ICIvX3NlYXJjaD9xPWFjdGlvbjpcIiIrYWN0aW9uKyJcIiI7CisJCS8vIFN0cmluZyBhdWRpdGluZ01lc3NhZ2UgPSByZXRyaWV2ZUF1ZGl0TWVzc2FnZUJ5SW5kZXhUeXBlKGluZGV4LCB0eXBlLAorCQkvLyBwYXR0ZXJuKTsKKwkJVXNlckF1ZGl0SmF2YU9iamVjdCBhdWRpdFBhcnNlZFJlc3AgPSBuZXcgVXNlckF1ZGl0SmF2YU9iamVjdCgpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJCVN0cmluZyBwYXR0ZXJuID0gIi9fc2VhcmNoP3E9QUNUSU9OOlwiIiArIGFjdGlvbiArICJcIiI7CisJCVN0cmluZyBhdWRpdGluZ01lc3NhZ2UgPSByZXRyaWV2ZUF1ZGl0TWVzc2FnZXNCeVBhdHRlcm4ocGF0dGVybik7CisJCUpzb25FbGVtZW50IGpFbGVtZW50ID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShhdWRpdGluZ01lc3NhZ2UpOworCQlKc29uT2JqZWN0IGpPYmplY3QgPSBqRWxlbWVudC5nZXRBc0pzb25PYmplY3QoKTsKKwkJSnNvbk9iamVjdCBoaXRzT2JqZWN0ID0gKEpzb25PYmplY3QpIGpPYmplY3QuZ2V0KCJoaXRzIik7CisJCUpzb25BcnJheSBoaXRzQXJyYXkgPSAoSnNvbkFycmF5KSBoaXRzT2JqZWN0LmdldCgiaGl0cyIpOworCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGhpdHNBcnJheS5zaXplKCk7KXsKKwkJaWYgKGhpdHNBcnJheS5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIGF1ZGl0UGFyc2VkUmVzcDsKKwkJfQorCQlKc29uT2JqZWN0IGpIaXRPYmplY3QgPSAoSnNvbk9iamVjdCkgaGl0c0FycmF5LmdldCgwKTsKKwkJSnNvbk9iamVjdCBqU291cmNlT2JqZWN0ID0gKEpzb25PYmplY3QpIGpIaXRPYmplY3QuZ2V0KCJfc291cmNlIik7CisKKwkJYXVkaXRQYXJzZWRSZXNwID0gZ3Nvbi5mcm9tSnNvbihqU291cmNlT2JqZWN0LCBVc2VyQXVkaXRKYXZhT2JqZWN0LmNsYXNzKTsKKwkJLy8gbG9nZ2VyLmRlYnVnKCJhdWRpdFBhcnNlZFJlc3A6IHt9IiwgYXVkaXRQYXJzZWRSZXNwKTsKKworCQlyZXR1cm4gYXVkaXRQYXJzZWRSZXNwOworCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmV0cmlldmVBdWRpdE1lc3NhZ2VzQnlQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJSHR0cFJlcXVlc3QgZ2V0QXVkaXRpbmdNZXNzYWdlID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1NFQVJDSF9EQVRBX0ZST01fRVMsIGNvbmZpZy5nZXRFc0hvc3QoKSwgY29uZmlnLmdldEVzUG9ydCgpLCBwYXR0ZXJuKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IGdldEF1ZGl0aW5nTWVzc2FnZS5odHRwU2VuZEdldCh1cmwsIG51bGwpOworCisJCXJldHVybiByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvRGVjb2Rlci5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL0RlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDkwZWIwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL0RlY29kZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CisKK3B1YmxpYyBjbGFzcyBEZWNvZGVyIHsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShieXRlW10gYnl0ZUFycmF5VG9FbmNvZGUpIHsKKworCQlieXRlW10gYnl0ZXNFbmNvZGVkID0gQmFzZTY0LmVuY29kZUJhc2U2NChieXRlQXJyYXlUb0VuY29kZSk7CisJCVN0cmluZyBzdHJFbmNvZGVkID0gbmV3IFN0cmluZyhieXRlc0VuY29kZWQpOworCQlyZXR1cm4gc3RyRW5jb2RlZDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHN0ckVuY29kZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJYnl0ZVtdIGJ5dGVEZWNvZGVkID0gQmFzZTY0LmRlY29kZUJhc2U2NChzdHJFbmNvZGVkKTsKKwkJU3RyaW5nIGRlY29kZWQgPSBuZXcgU3RyaW5nKGJ5dGVEZWNvZGVkKTsKKworCQlyZXR1cm4gZGVjb2RlZDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRGaWxlVG9TdHJpbmcoU3RyaW5nIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKwkJU3RyaW5nIGxpbmUgPSBudWxsOworCQlTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlTdHJpbmcgbHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKwkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKGxpbmUpOworCQkJc3RyaW5nQnVpbGRlci5hcHBlbmQobHMpOworCQl9CisJCXJlYWRlci5jbG9zZSgpOworCQlyZXR1cm4gc3RyaW5nQnVpbGRlci50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL1JlcUNhcC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL1JlcUNhcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDJhODQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvUmVxQ2FwLmphdmEKQEAgLTAsMCArMSw2MzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsczsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUHJvZHVjdFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc291cmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworCitwdWJsaWMgY2xhc3MgUmVxQ2FwIHsKKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGV4cGVjdGVkQ29udGFpbmVyQ2FwYWJpbGl0aWVzOworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBleHBlY3RlZENvbnRhaW5lclJlcXVpcmVtZW50czsKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVtb3ZlZFJlcXVpcmVtZW50czsKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+Pj4gZXhwZWN0ZWRDb250SW5zdFJlcUNhcDsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlWRlJlcUNhcChTdHJpbmcgY29tcG9uZW50SWQpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoY29tcG9uZW50SWQpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QocmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJdmVyaWZ5UmVxQ2FwKHJlc291cmNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5U2VydmljZVJlcUNhcChTdHJpbmcgY29tcG9uZW50SWQsIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoY29tcG9uZW50SWQsIHNkbmNEZXNpZ25lckRldGFpbHMpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJdmVyaWZ5UmVxQ2FwKHNlcnZpY2UpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlQcm9kdWN0UmVxQ2FwKFN0cmluZyBjb21wb25lbnRJZCwgVXNlciBzZG5jUHNEZXRhaWxzMSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QoY29tcG9uZW50SWQsIHNkbmNQc0RldGFpbHMxLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBwcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCXZlcmlmeVJlcUNhcChwcm9kdWN0KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5UmVxQ2FwKENvbXBvbmVudCBhY3R1YWxDb21wb25lbnQpIHsKKwkJdmVyaWZ5Q29udGFpbmVyUmVxQ2FwKGFjdHVhbENvbXBvbmVudCk7CisJCXZlcmlmeUNvbXBJbnN0UmVxQ2FwKGFjdHVhbENvbXBvbmVudCk7CisJfQorCisJcHVibGljIFJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKFN0cmluZyBjb21wb25lbnRVbmlxdWVJZCwgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLAorCQkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBib29sZWFuIGlzSGlnaGVzdExldmVsKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZUluc3RhbmNlVmVyc2lvbiA9IFByb2R1Y3RSZXN0VXRpbHMuY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbihjb21wb25lbnRVbmlxdWVJZCwKKwkJCQlzZXJ2aWNlSW5zdGFuY2VUb1JlcGxhY2VVbmlxdWVJZCwgc2VydmljZVVuaXF1ZUlkLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBjb21wb25lbnRUeXBlKTsKKwkJaWYgKGNoYW5nZVJlc291cmNlSW5zdGFuY2VWZXJzaW9uLmdldEVycm9yQ29kZSgpLmVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpICYmIGlzSGlnaGVzdExldmVsKSB7CisJCQkvKgorCQkJICogLy8gQWRkIFJJIENhcGFiaWxpdGllcyBhbmQgUmVxdWlyZW1lbnRzIHRvIGV4cGVjdGVkIE1BUCAtLT4KKwkJCSAqIGV4cGVjdGVkVmZDYXBhYmlsaXRpZXMgYW5kIGV4cGVjdGVkVmZSZXF1aXJlbWVudHMKKwkJCSAqIAorCQkJICogQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPQorCQkJICogUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKAorCQkJICogY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb24uZ2V0UmVzcG9uc2UoKSwKKwkJCSAqIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJCSAqIGFkZENvbXBJbnN0UmVxQ2FwVG9FeHBlY3RlZChjb21wb25lbnRJbnN0YW5jZSwgY29tcG9uZW50VHlwZSk7CisJCQkgKi8KKwkJfQorCQlyZXR1cm4gY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb247CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUV4cGVjdGVkUmVxQ2FwQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZShTdHJpbmcgb2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsCisJCQlTdHJpbmcgbmV3Q29udGFpbmVyVW5pcXVlSWQpIHsKKworCQkvLyBVcGRhdGUgb2YgY29udGFpbmVyIHJlcS9jYXAKKworCQlTZXQ8U3RyaW5nPiBjb21wSW5zdEtleXNUb0NoYW5nZSA9IG5ldyBIYXNoU2V0PD4oKTsKKworCQlmb3IgKFN0cmluZyBleHBLZXkgOiBleHBlY3RlZENvbnRhaW5lckNhcGFiaWxpdGllcy5rZXlTZXQoKSkgeworCQkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gZXhwQ2FwTGlzdCA9IGV4cGVjdGVkQ29udGFpbmVyQ2FwYWJpbGl0aWVzLmdldChleHBLZXkpOworCQkJZm9yIChDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXAgOiBleHBDYXBMaXN0KSB7CisJCQkJU3RyaW5nIG93bmVySWQgPSBjYXAuZ2V0T3duZXJJZCgpOworCisJCQkJaWYgKG93bmVySWQuY29udGFpbnMob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UpKSB7CisJCQkJCWNvbXBJbnN0S2V5c1RvQ2hhbmdlLmFkZChvd25lcklkKTsKKwkJCQkJY2FwLnNldE93bmVySWQoY2FwLmdldE93bmVySWQoKS5yZXBsYWNlQWxsKG9sZENvbnRhaW5lclVuaXF1ZUlkVG9SZXBsYWNlLCBuZXdDb250YWluZXJVbmlxdWVJZCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvciAoU3RyaW5nIGV4cEtleSA6IGV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLmtleVNldCgpKSB7CisJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gZXhwQ2FwTGlzdCA9IGV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLmdldChleHBLZXkpOworCQkJZm9yIChSZXF1aXJlbWVudERlZmluaXRpb24gY2FwIDogZXhwQ2FwTGlzdCkgeworCQkJCVN0cmluZyBvd25lcklkID0gY2FwLmdldE93bmVySWQoKTsKKwkJCQlpZiAob3duZXJJZC5jb250YWlucyhvbGRDb250YWluZXJVbmlxdWVJZFRvUmVwbGFjZSkpIHsKKwkJCQkJY29tcEluc3RLZXlzVG9DaGFuZ2UuYWRkKG93bmVySWQpOworCQkJCQljYXAuc2V0T3duZXJJZChjYXAuZ2V0T3duZXJJZCgpLnJlcGxhY2VBbGwob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsIG5ld0NvbnRhaW5lclVuaXF1ZUlkKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gVXBkYXRlIG9mIGludGVybmFsIGNvbXAgaW5zdGFuY2VzIHJlcS9jYXAKKwkJZm9yIChTdHJpbmcgb2xkS2V5IDogY29tcEluc3RLZXlzVG9DaGFuZ2UpIHsKKwkJCUltbXV0YWJsZVBhaXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+PiBpbW11dGFibGVQYWlyID0gZXhwZWN0ZWRDb250SW5zdFJlcUNhcAorCQkJCQkuZ2V0KG9sZEtleSk7CisJCQlpZiAoaW1tdXRhYmxlUGFpciAhPSBudWxsKSB7CisJCQkJZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5yZW1vdmUob2xkS2V5KTsKKwkJCQlTdHJpbmcgbmV3S2V5ID0gb2xkS2V5LnJlcGxhY2VBbGwob2xkQ29udGFpbmVyVW5pcXVlSWRUb1JlcGxhY2UsIG5ld0NvbnRhaW5lclVuaXF1ZUlkKTsKKwkJCQlleHBlY3RlZENvbnRJbnN0UmVxQ2FwLnB1dChuZXdLZXksIGltbXV0YWJsZVBhaXIpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlDb21wSW5zdFJlcUNhcChDb21wb25lbnQgYWN0dWFsQ29tcG9uZW50KSB7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IGFjdHVhbENvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJaWYgKGNvbXBvbmVudEluc3RhbmNlcyAhPSBudWxsKSB7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5zaXplKCksIGNvbXBvbmVudEluc3RhbmNlcy5zaXplKCkpOworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wSW5zdCA6IGNvbXBvbmVudEluc3RhbmNlcykgeworCQkJCVN0cmluZyB1bmlxdWVJZCA9IGNvbXBJbnN0LmdldFVuaXF1ZUlkKCk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJWZXJpZnlpbmcgcmVxL2NhcCBvZiBjb21wb25lbnQgaW5zdGFuY2UKKwkJCQkvLyAiKyB1bmlxdWVJZCk7CisJCQkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBhY3R1YWxDb21wSW5zdFJlcSA9IGNvbXBJbnN0LmdldFJlcXVpcmVtZW50cygpOworCQkJCWlmIChhY3R1YWxDb21wSW5zdFJlcSA9PSBudWxsKSB7CisJCQkJCWFjdHVhbENvbXBJbnN0UmVxID0gbmV3IEhhc2hNYXA8PigpOworCQkJCX0KKwkJCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gYWN0dWFsQ29tcEluc3RDYXAgPSBjb21wSW5zdC5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJCQlpZiAoYWN0dWFsQ29tcEluc3RDYXAgPT0gbnVsbCkgeworCQkJCQlhY3R1YWxDb21wSW5zdENhcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQl9CisJCQkJSW1tdXRhYmxlUGFpcjxNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4sIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4+IGV4cFJlcUNhcCA9IGV4cGVjdGVkQ29udEluc3RSZXFDYXAKKwkJCQkJCS5nZXQodW5pcXVlSWQpOworCQkJCWFzc2VydE5vdE51bGwoZXhwUmVxQ2FwKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImV4cGVjdGVkIGluc3RhbmNlIHJlcXVpcmVtZW50czoKKwkJCQkvLyAiK2V4cFJlcUNhcC5yaWdodCk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJleHBlY3RlZCBpbnN0YW5jZSBjYXBhYmlsaXRpZXM6CisJCQkJLy8gIitleHBSZXFDYXAubGVmdCk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhY3R1YWwgaW5zdGFuY2UgcmVxdWlyZW1lbnRzOgorCQkJCS8vICIrYWN0dWFsQ29tcEluc3RSZXEpOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWN0dWFsIGluc3RhbmNlIGNhcGFiaWxpdGllczoKKwkJCQkvLyAiK2FjdHVhbENvbXBJbnN0Q2FwKTsKKworCQkJCS8vIFJFUSBjb21wYXJpc29uCisJCQkJY29tcGFyZVJlcUNhcE1hcHMoZXhwUmVxQ2FwLnJpZ2h0LCBhY3R1YWxDb21wSW5zdFJlcSk7CisKKwkJCQkvLyBDQVAgY29tcGFyaXNvbgorCQkJCWNvbXBhcmVSZXFDYXBNYXBzKGV4cFJlcUNhcC5sZWZ0LCBhY3R1YWxDb21wSW5zdENhcCk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWFzc2VydFRydWUoZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5pc0VtcHR5KCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlDb250YWluZXJSZXFDYXAoQ29tcG9uZW50IGFjdHVhbENvbXBvbmVudCkgeworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IGFjdHVhbENvbnRhaW5lclJlcXVpcmVtZW50cyA9IGFjdHVhbENvbXBvbmVudC5nZXRSZXF1aXJlbWVudHMoKTsKKwkJaWYgKGFjdHVhbENvbnRhaW5lclJlcXVpcmVtZW50cyA9PSBudWxsKSB7CisJCQlhY3R1YWxDb250YWluZXJSZXF1aXJlbWVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCX0KKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGFjdHVhbENvbnRhaW5lckNhcGFiaWxpdGllcyA9IGFjdHVhbENvbXBvbmVudC5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJaWYgKGFjdHVhbENvbnRhaW5lckNhcGFiaWxpdGllcyA9PSBudWxsKSB7CisJCQlhY3R1YWxDb250YWluZXJDYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJWZXJpZnlpbmcgcmVxL2NhcCBvZiBjb250YWluZXIgY29tcG9uZW50ICIrCisJCS8vIGFjdHVhbENvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJleHBlY3RlZCBjb250YWluZXIgcmVxdWlyZW1lbnRzOgorCQkvLyAiK2V4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJleHBlY3RlZCBjb250YWluZXIgY2FwYWJpbGl0aWVzOgorCQkvLyAiK2V4cGVjdGVkQ29udGFpbmVyQ2FwYWJpbGl0aWVzKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhY3R1YWwgY29udGFpbmVyIHJlcXVpcmVtZW50czoKKwkJLy8gIithY3R1YWxDb250YWluZXJSZXF1aXJlbWVudHMpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFjdHVhbCBjb250YWluZXIgY2FwYWJpbGl0aWVzOgorCQkvLyAiK2FjdHVhbENvbnRhaW5lckNhcGFiaWxpdGllcyk7CisKKwkJLy8gUkVRIGNvbXBhcmlzb24KKwkJY29tcGFyZVJlcUNhcE1hcHMoZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMsIGFjdHVhbENvbnRhaW5lclJlcXVpcmVtZW50cyk7CisKKwkJLy8gQ0FQIGNvbXBhcmlzb24KKwkJY29tcGFyZVJlcUNhcE1hcHMoZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMsIGFjdHVhbENvbnRhaW5lckNhcGFiaWxpdGllcyk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgPFQ+IHZvaWQgY29tcGFyZVJlcUNhcE1hcHMoTWFwPFN0cmluZywgTGlzdDxUPj4gZXhwZWN0ZWRNYXAsIE1hcDxTdHJpbmcsIExpc3Q8VD4+IGFjdHVhbE1hcCkgeworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNYXAuc2l6ZSgpLCBhY3R1YWxNYXAuc2l6ZSgpKTsKKwkJZm9yIChTdHJpbmcgZXhwS2V5IDogZXhwZWN0ZWRNYXAua2V5U2V0KCkpIHsKKwkJCUxpc3Q8Pz4gZXhwQ2FwTGlzdCA9IGV4cGVjdGVkTWFwLmdldChleHBLZXkpOworCQkJTGlzdDw/PiBhY3RDYXBMaXN0ID0gYWN0dWFsTWFwLmdldChleHBLZXkpOworCQkJYXNzZXJ0RXF1YWxzKGV4cENhcExpc3Quc2l6ZSgpLCBhY3RDYXBMaXN0LnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8PihleHBDYXBMaXN0KSwgbmV3IEhhc2hTZXQ8PihhY3RDYXBMaXN0KSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ29tcEluc3RSZXFDYXBUb0V4cGVjdGVkKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLAorCQkJQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSwgVXNlciBzZG5jRGVzaWduZXJEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlzZG5jRGVzaWduZXJEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKTsKKwkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCk7CisJCVN0cmluZyBvcmlnaW5Db21wb25lbnRJZCA9IGNvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzcG9uc2UgPSBudWxsOworCQlDb21wb25lbnRUeXBlRW51bSBjb21wSW5zdFR5cGUgPSBnZXRDb21wSW5zdFR5cGVCeUNvbnRhaW5lclR5cGUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlpZiAoY29tcEluc3RUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSB7CisJCQlnZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNEZXNpZ25lckRldGFpbHMsIG9yaWdpbkNvbXBvbmVudElkKTsKKwkJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRSZXNwb25zZSk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQl9IGVsc2UgaWYgKGNvbXBJbnN0VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSB7CisJCQlnZXRSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShvcmlnaW5Db21wb25lbnRJZCwgc2RuY0Rlc2lnbmVyRGV0YWlscyk7CisJCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoZ2V0UmVzcG9uc2UpOworCQkJY29tcG9uZW50ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQl9IGVsc2UgeworCQkJQXNzZXJ0LmZhaWwoIlVuc3VwcG9ydGVkIHR5cGUgLSAiICsgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlc291cmNlUmVxdWlyZW1lbnRzID0gY29tcG9uZW50LmdldFJlcXVpcmVtZW50cygpOworCQlpZiAocmVzb3VyY2VSZXF1aXJlbWVudHMgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VSZXF1aXJlbWVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCX0KKwkJCisJCUZ1bmN0aW9uPEVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiwgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudERlZmluaXRpb25NYXBwZXIgPSBlIC0+IG5ldyBBcnJheUxpc3Q8PihlLmdldFZhbHVlKCkuc3RyZWFtKCkubWFwKGl0ZW0gLT4gbmV3IFJlcXVpcmVtZW50RGVmaW5pdGlvbihpdGVtKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxQ29weSA9IHJlc291cmNlUmVxdWlyZW1lbnRzLmVudHJ5U2V0KCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGUgLT4gZS5nZXRLZXkoKSwgcmVxdWlyZW1lbnREZWZpbml0aW9uTWFwcGVyKSk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IHJlc291cmNlQ2FwYWJpbGl0aWVzID0gY29tcG9uZW50LmdldENhcGFiaWxpdGllcygpOworCQlpZiAocmVzb3VyY2VDYXBhYmlsaXRpZXMgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VDYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCX0KKwkJCisJCUZ1bmN0aW9uPEVudHJ5PFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0eURlZmluaXRpb25NYXBwZXIgPSBlIC0+IG5ldyBBcnJheUxpc3Q8PihlLmdldFZhbHVlKCkuc3RyZWFtKCkubWFwKGl0ZW0gLT4gbmV3IENhcGFiaWxpdHlEZWZpbml0aW9uKGl0ZW0pKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcENvcHkgPSByZXNvdXJjZUNhcGFiaWxpdGllcy5lbnRyeVNldCgpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChlIC0+IGUuZ2V0S2V5KCksIGNhcGFiaWxpdHlEZWZpbml0aW9uTWFwcGVyKSk7CisKKwkJc2V0dXBDb250YWluZXJFeHBlY3RlZFJlcUNhcCh1bmlxdWVJZCwgbmFtZSwgcmVzb3VyY2VSZXF1aXJlbWVudHMsIHJlc291cmNlQ2FwYWJpbGl0aWVzKTsKKwkJaWYgKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkuZXF1YWxzKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKQorCQkJCSYmICgoUmVzb3VyY2UpIGNvbXBvbmVudCkuZ2V0UmVzb3VyY2VUeXBlKCkgIT0gUmVzb3VyY2VUeXBlRW51bS5WRikgeworCQkJc2V0dXBDb25zdEluc3RFeHBlY3RlZFJlcUNhcCh1bmlxdWVJZCwgbmFtZSwgcmVxQ29weSwgY2FwQ29weSk7CisJCX0KKworCQkvLyBhZGRpbmcgZW50cnkgZm9yIGV4cGVjdGVkIGNvbXBvbmVudEluc3RhbmNlCisJCUltbXV0YWJsZVBhaXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+PiBjb21wSW5zdFJlcUNhcFBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4sIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4+KAorCQkJCWNhcENvcHksIHJlcUNvcHkpOworCQlleHBlY3RlZENvbnRJbnN0UmVxQ2FwLnB1dCh1bmlxdWVJZCwgY29tcEluc3RSZXFDYXBQYWlyKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNldHVwQ29udGFpbmVyRXhwZWN0ZWRSZXFDYXAoU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcgbmFtZSwKKwkJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gY29tcG9uZW50UmVxdWlyZW1lbnRzLAorCQkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNvbXBvbmVudENhcGFiaWxpdGllcykgeworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXNSZXEgOiBjb21wb25lbnRSZXF1aXJlbWVudHMuZW50cnlTZXQoKSkgeworCQkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3RUb0FkZCA9IHJlc1JlcS5nZXRWYWx1ZSgpOworCQkJZm9yIChSZXF1aXJlbWVudERlZmluaXRpb24gcmVxdWlyZW1lbnREZWZpbml0aW9uIDogcmVxTGlzdFRvQWRkKSB7CisJCQkJcmVxdWlyZW1lbnREZWZpbml0aW9uLnNldE93bmVySWQodW5pcXVlSWQpOworCQkJCXJlcXVpcmVtZW50RGVmaW5pdGlvbi5zZXRPd25lck5hbWUobmFtZSk7CisJCQl9CisJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gZXhwZWN0ZWRSZXFMaXN0ID0gZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMuZ2V0KHJlc1JlcS5nZXRLZXkoKSk7CisJCQlpZiAoZXhwZWN0ZWRSZXFMaXN0ID09IG51bGwpIHsKKwkJCQlleHBlY3RlZFJlcUxpc3QgPSByZXFMaXN0VG9BZGQ7CisJCQl9IGVsc2UgeworCQkJCWV4cGVjdGVkUmVxTGlzdC5hZGRBbGwocmVxTGlzdFRvQWRkKTsKKwkJCX0KKwkJCWV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLnB1dChyZXNSZXEuZ2V0S2V5KCksIGV4cGVjdGVkUmVxTGlzdCk7CisJCX0KKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IHJlc0NhcCA6IGNvbXBvbmVudENhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0VG9BZGQgPSByZXNDYXAuZ2V0VmFsdWUoKTsKKwkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwRGVmaW5pdGlvbiA6IGNhcExpc3RUb0FkZCkgeworCQkJCWNhcERlZmluaXRpb24uc2V0T3duZXJJZCh1bmlxdWVJZCk7CisJCQkJY2FwRGVmaW5pdGlvbi5zZXRPd25lck5hbWUobmFtZSk7CisJCQl9CisJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBleHBlY3RlZENhcExpc3QgPSBleHBlY3RlZENvbnRhaW5lckNhcGFiaWxpdGllcy5nZXQocmVzQ2FwLmdldEtleSgpKTsKKwkJCWlmIChleHBlY3RlZENhcExpc3QgPT0gbnVsbCkgeworCQkJCWV4cGVjdGVkQ2FwTGlzdCA9IGNhcExpc3RUb0FkZDsKKwkJCX0gZWxzZSB7CisJCQkJZXhwZWN0ZWRDYXBMaXN0LmFkZEFsbChjYXBMaXN0VG9BZGQpOworCQkJfQorCQkJZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMucHV0KHJlc0NhcC5nZXRLZXkoKSwgZXhwZWN0ZWRDYXBMaXN0KTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBDb25zdEluc3RFeHBlY3RlZFJlcUNhcChTdHJpbmcgdW5pcXVlSWQsIFN0cmluZyBuYW1lLAorCQkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBjb21wb25lbnRSZXF1aXJlbWVudHMsCisJCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY29tcG9uZW50Q2FwYWJpbGl0aWVzKSB7CisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlc1JlcSA6IGNvbXBvbmVudFJlcXVpcmVtZW50cy5lbnRyeVNldCgpKSB7CisJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxTGlzdFRvQWRkID0gcmVzUmVxLmdldFZhbHVlKCk7CisJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZmluaXRpb24gOiByZXFMaXN0VG9BZGQpIHsKKwkJCQlyZXF1aXJlbWVudERlZmluaXRpb24uc2V0T3duZXJJZCh1bmlxdWVJZCk7CisJCQkJcmVxdWlyZW1lbnREZWZpbml0aW9uLnNldE93bmVyTmFtZShuYW1lKTsKKwkJCX0KKwkJfQorCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gcmVzQ2FwIDogY29tcG9uZW50Q2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RUb0FkZCA9IHJlc0NhcC5nZXRWYWx1ZSgpOworCQkJZm9yIChDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBEZWZpbml0aW9uIDogY2FwTGlzdFRvQWRkKSB7CisJCQkJY2FwRGVmaW5pdGlvbi5zZXRPd25lcklkKHVuaXF1ZUlkKTsKKwkJCQljYXBEZWZpbml0aW9uLnNldE93bmVyTmFtZShuYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIENvbXBvbmVudFR5cGVFbnVtIGdldENvbXBJbnN0VHlwZUJ5Q29udGFpbmVyVHlwZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisJCXN3aXRjaCAoY29tcG9uZW50VHlwZSkgeworCQljYXNlIFJFU09VUkNFOgorCQkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFOworCQljYXNlIFNFUlZJQ0U6CisJCQlyZXR1cm4gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0U7CisJCWNhc2UgUFJPRFVDVDoKKwkJCXJldHVybiBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUNvbXBJbnN0UmVxQ2FwRnJvbUV4cGVjdGVkKFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkKSB7CisJCUxpc3Q8U3RyaW5nPiBlbnRyaWVzUmVxdWlyZW1lbnRzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxTdHJpbmc+IGVudHJpZXNDYXBhYmlsaXRpZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXFFbnRyeSA6IGV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLmVudHJ5U2V0KCkpIHsKKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gcmVxRW50cnkuZ2V0VmFsdWUoKTsKKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0VG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmaW5pdGlvbiA6IHJlcUxpc3QpIHsKKwkJCQlpZiAocmVxdWlyZW1lbnREZWZpbml0aW9uLmdldE93bmVySWQoKS5lcXVhbHMoY29tcG9uZW50SW5zdGFuY2VJZCkpIHsKKwkJCQkJcmVxTGlzdFRvRGVsZXRlLmFkZChyZXF1aXJlbWVudERlZmluaXRpb24pOworCQkJCX0KKwkJCX0KKwkJCXJlcUxpc3QucmVtb3ZlQWxsKHJlcUxpc3RUb0RlbGV0ZSk7CisJCQlpZiAocmVxTGlzdC5pc0VtcHR5KCkpIHsKKwkJCQllbnRyaWVzUmVxdWlyZW1lbnRzVG9SZW1vdmUuYWRkKHJlcUVudHJ5LmdldEtleSgpKTsKKwkJCX0KKwkJfQorCisJCWZvciAoU3RyaW5nIGVrZXkgOiBlbnRyaWVzUmVxdWlyZW1lbnRzVG9SZW1vdmUpIHsKKwkJCWV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLnJlbW92ZShla2V5KTsKKwkJfQorCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwRW50cnkgOiBleHBlY3RlZENvbnRhaW5lckNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gY2FwRW50cnkuZ2V0VmFsdWUoKTsKKwkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3RUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJZm9yIChDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiA6IGNhcExpc3QpIHsKKwkJCQlpZiAoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0T3duZXJJZCgpLmVxdWFscyhjb21wb25lbnRJbnN0YW5jZUlkKSkgeworCQkJCQljYXBMaXN0VG9EZWxldGUuYWRkKGNhcGFiaWxpdHlEZWZpbml0aW9uKTsKKwkJCQl9CisJCQl9CisJCQljYXBMaXN0LnJlbW92ZUFsbChjYXBMaXN0VG9EZWxldGUpOworCQkJaWYgKGNhcExpc3QuaXNFbXB0eSgpKSB7CisJCQkJZW50cmllc0NhcGFiaWxpdGllc1RvUmVtb3ZlLmFkZChjYXBFbnRyeS5nZXRLZXkoKSk7CisJCQl9CisJCX0KKwkJZm9yIChTdHJpbmcgZWtleSA6IGVudHJpZXNDYXBhYmlsaXRpZXNUb1JlbW92ZSkgeworCQkJZXhwZWN0ZWRDb250YWluZXJDYXBhYmlsaXRpZXMucmVtb3ZlKGVrZXkpOworCQl9CisKKwkJZXhwZWN0ZWRDb250SW5zdFJlcUNhcC5yZW1vdmUoY29tcG9uZW50SW5zdGFuY2VJZCk7CisKKwl9CisKKwkvLyBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIGV4cGVjdGVkIHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lcgorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yVkYoUmVzb3VyY2UgY29udGFpbmVyRGV0YWlscywgUmVzb3VyY2UgY29tcEluc3RPcmlnaW5EZXRhaWxzLAorCQkJVXNlciBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwKKwkJCQl0cnVlKTsKKwl9CisKKwkvLyBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIGV4cGVjdGVkIHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lcgorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZShTZXJ2aWNlIGNvbnRhaW5lckRldGFpbHMsIFJlc291cmNlIGNvbXBJbnN0T3JpZ2luRGV0YWlscywKKwkJCVVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwKKwkJCQl0cnVlKTsKKwl9CisKKwkvLyBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIGV4cGVjdGVkIHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lcgorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZVZGSW5zdGFuY2UoU2VydmljZSBjb250YWluZXJEZXRhaWxzLCBSZXNvdXJjZSBjb21wSW5zdE9yaWdpbkRldGFpbHMsIFVzZXIgbW9kaWZpZXIpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckRldGFpbHMsIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsCisJCQkJdHJ1ZSk7CisJfQorCisJLy8gQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBleHBlY3RlZCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UoUHJvZHVjdCBjb250YWluZXJEZXRhaWxzLCBTZXJ2aWNlIGNvbXBJbnN0T3JpZ2luRGV0YWlscywKKwkJCVVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwKKwkJCQl0cnVlKTsKKwl9CisKKwkvLyBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIGV4cGVjdGVkIHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lcgorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yVkYoU3RyaW5nIGNvbXBJbnN0VW5pcXVlSWQsIFJlc291cmNlIGNvbnRhaW5lckRldGFpbHMsCisJCQlVc2VyIG1vZGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHRydWUpOworCX0KKworCS8vIEF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgZXhwZWN0ZWQgcmVxL2NhcCBvZiB0aGUgY29udGFpbmVyCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlQXRvbWljSW5zdGFuY2VGb3JTZXJ2aWNlKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBTZXJ2aWNlIGNvbnRhaW5lckRldGFpbHMsCisJCQlVc2VyIG1vZGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgdHJ1ZSk7CisJfQorCisJLy8gQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBleHBlY3RlZCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVWRkluc3RhbmNlKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBTZXJ2aWNlIGNvbnRhaW5lckRldGFpbHMsIFVzZXIgbW9kaWZpZXIpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgdHJ1ZSk7CisKKwl9CisKKwkvLyBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIGV4cGVjdGVkIHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lcgorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZShTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwgUHJvZHVjdCBjb250YWluZXJEZXRhaWxzLCBVc2VyIG1vZGlmaWVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcEluc3RVbmlxdWVJZCwgY29udGFpbmVyRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIHRydWUpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVBdG9taWNJbnN0YW5jZUZvclZGRHVyaW5nU2V0dXAoUmVzb3VyY2UgY29udGFpbmVyRGV0YWlscywKKwkJCVJlc291cmNlIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwKKwkJCQlmYWxzZSk7CisJfQorCisJLy8gU2V0dXAgb2YgbG93ZXIgY29tcG9uZW50cyAtIERvZXNuJ3QgYWZmZWN0IHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lciAoZm9yCisJLy8gZXhhbXBsZSwgc2V0dXAgb2YgVkYgZm9yIHRlc3RpbmcgYSBQcm9kdWN0KQorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUF0b21pY0luc3RhbmNlRm9yU2VydmljZUR1cmluZ1NldHVwKFNlcnZpY2UgY29udGFpbmVyRGV0YWlscywKKwkJCVJlc291cmNlIGNvbXBJbnN0T3JpZ2luRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLAorCQkJCWZhbHNlKTsKKwl9CisKKwkvLyBTZXR1cCBvZiBsb3dlciBjb21wb25lbnRzIC0gRG9lc24ndCBhZmZlY3QgcmVxL2NhcCBvZiB0aGUgY29udGFpbmVyIChmb3IKKwkvLyBleGFtcGxlLCBzZXR1cCBvZiBWRiBmb3IgdGVzdGluZyBhIFByb2R1Y3QpCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKFNlcnZpY2UgY29udGFpbmVyRGV0YWlscywgUmVzb3VyY2UgY29tcEluc3RPcmlnaW5EZXRhaWxzLAorCQkJVXNlciBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJEZXRhaWxzLCBjb21wSW5zdE9yaWdpbkRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLAorCQkJCWZhbHNlKTsKKwl9CisKKwkvLyBTZXR1cCBvZiBsb3dlciBjb21wb25lbnRzIC0gRG9lc24ndCBhZmZlY3QgcmVxL2NhcCBvZiB0aGUgY29udGFpbmVyIChmb3IKKwkvLyBleGFtcGxlLCBzZXR1cCBvZiBWRiBmb3IgdGVzdGluZyBhIFByb2R1Y3QpCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZUluc3RhbmNlRHVyaW5nU2V0dXAoUHJvZHVjdCBjb250YWluZXJEZXRhaWxzLCBTZXJ2aWNlIGNvbXBJbnN0T3JpZ2luRGV0YWlscywKKwkJCVVzZXIgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyRGV0YWlscywgY29tcEluc3RPcmlnaW5EZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwKKwkJCQlmYWxzZSk7CisJfQorCisJLy8gU2V0dXAgb2YgbG93ZXIgY29tcG9uZW50cyAtIERvZXNuJ3QgYWZmZWN0IHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lciAoZm9yCisJLy8gZXhhbXBsZSwgc2V0dXAgb2YgVkYgZm9yIHRlc3RpbmcgYSBQcm9kdWN0KQorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZUF0b21pY0luc3RhbmNlRm9yVkZEdXJpbmdTZXR1cChTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwgUmVzb3VyY2UgY29udGFpbmVyRGV0YWlscywKKwkJCVVzZXIgbW9kaWZpZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBJbnN0VW5pcXVlSWQsIGNvbnRhaW5lckRldGFpbHMsIG1vZGlmaWVyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZmFsc2UpOworCX0KKworCS8vIFNldHVwIG9mIGxvd2VyIGNvbXBvbmVudHMgLSBEb2Vzbid0IGFmZmVjdCByZXEvY2FwIG9mIHRoZSBjb250YWluZXIgKGZvcgorCS8vIGV4YW1wbGUsIHNldHVwIG9mIFZGIGZvciB0ZXN0aW5nIGEgUHJvZHVjdCkKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVBdG9taWNJbnN0YW5jZUZvclNlcnZpY2VEdXJpbmdTZXR1cChTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwKKwkJCVNlcnZpY2UgY29udGFpbmVyRGV0YWlscywgVXNlciBtb2RpZmllcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcEluc3RVbmlxdWVJZCwgY29udGFpbmVyRGV0YWlscywgbW9kaWZpZXIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIGZhbHNlKTsKKwl9CisKKwkvLyBTZXR1cCBvZiBsb3dlciBjb21wb25lbnRzIC0gRG9lc24ndCBhZmZlY3QgcmVxL2NhcCBvZiB0aGUgY29udGFpbmVyIChmb3IKKwkvLyBleGFtcGxlLCBzZXR1cCBvZiBWRiBmb3IgdGVzdGluZyBhIFByb2R1Y3QpCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlVkZJbnN0YW5jZUR1cmluZ1NldHVwKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBTZXJ2aWNlIGNvbnRhaW5lckRldGFpbHMsCisJCQlVc2VyIG1vZGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgZmFsc2UpOworCisJfQorCisJLy8gU2V0dXAgb2YgbG93ZXIgY29tcG9uZW50cyAtIERvZXNuJ3QgYWZmZWN0IHJlcS9jYXAgb2YgdGhlIGNvbnRhaW5lciAoZm9yCisJLy8gZXhhbXBsZSwgc2V0dXAgb2YgVkYgZm9yIHRlc3RpbmcgYSBQcm9kdWN0KQorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VJbnN0YW5jZUR1cmluZ1NldHVwKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBQcm9kdWN0IGNvbnRhaW5lckRldGFpbHMsCisJCQlVc2VyIG1vZGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdFVuaXF1ZUlkLCBjb250YWluZXJEZXRhaWxzLCBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgZmFsc2UpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50IGdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKENvbXBvbmVudCBjb21wb25lbnREZXRhaWxzLCBpbnQgbnVtYmVyT2ZSSXMsCisJCQlpbnQgbnVtYmVyT2ZSZWxhdGlvbnMsIFVzZXIgc2RuY0FkbWluRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNwb25zZSA9IG51bGw7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlpZiAoY29tcG9uZW50RGV0YWlscyBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQlnZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNBZG1pbkRldGFpbHMsIGNvbXBvbmVudERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQl9IGVsc2UgaWYgKGNvbXBvbmVudERldGFpbHMgaW5zdGFuY2VvZiBTZXJ2aWNlKSB7CisJCQlnZXRSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZSgoY29tcG9uZW50RGV0YWlscy5nZXRVbmlxdWVJZCgpKSwgc2RuY0FkbWluRGV0YWlscyk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCX0gZWxzZSBpZiAoY29tcG9uZW50RGV0YWlscyBpbnN0YW5jZW9mIFByb2R1Y3QpIHsKKwkJCWdldFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0KGNvbXBvbmVudERldGFpbHMuZ2V0VW5pcXVlSWQoKSwgc2RuY0FkbWluRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZ2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgUHJvZHVjdC5jbGFzcyk7CisJCX0gZWxzZSB7CisJCQlBc3NlcnQuZmFpbCgiVW5zdXBwb3J0ZWQgdHlwZSBvZiBjb21wb25lbnREZXRhaWxzIC0gIiArIGNvbXBvbmVudERldGFpbHMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworCQl9CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhnZXRSZXNwb25zZSk7CisJCWludCBudW1iZXJPZkFjdHVhbFJJcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSAhPSBudWxsID8gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKQorCQkJCTogMDsKKwkJaW50IG51bWJlck9mQWN0dWFsUmVsYXRpb25zID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpICE9IG51bGwKKwkJCQk/IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKS5zaXplKCkgOiAwOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIG51bWJlciBvZiBSSXMgbWVldCB0aGUgZXhwZWN0ZWQgbnVtYmVyIiwgbnVtYmVyT2ZSSXMsIG51bWJlck9mQWN0dWFsUklzKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBudW1iZXIgb2YgUkkgcmVsYXRpb25zIG1lZXQgdGhlIGV4cGVjdGVkIG51bWJlciIsIG51bWJlck9mUmVsYXRpb25zLAorCQkJCW51bWJlck9mQWN0dWFsUmVsYXRpb25zKTsKKwkJdmVyaWZ5UmVxQ2FwKGNvbXBvbmVudCk7CisKKwkJcmV0dXJuIGNvbXBvbmVudDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29tcG9uZW50QW5kVmFsaWRhdGVSSXNBZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKFN0cmluZyBvbGRDb21wb25lbnRVbmlxdWVJZFRvUmVwbGFjZSwKKwkJCUNvbXBvbmVudCBjb21wb25lbnREZXRhaWxzLCBpbnQgbnVtT2ZSSXMsIGludCBudW1PZlJlbGF0aW9ucywgVXNlciBzZG5jQWRtaW5EZXRhaWxzKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQl1cGRhdGVFeHBlY3RlZFJlcUNhcEFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUob2xkQ29tcG9uZW50VW5pcXVlSWRUb1JlcGxhY2UsIGNvbXBvbmVudERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWdldENvbXBvbmVudEFuZFZhbGlkYXRlUklzKGNvbXBvbmVudERldGFpbHMsIG51bU9mUklzLCBudW1PZlJlbGF0aW9ucywgc2RuY0FkbWluRGV0YWlscyk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKENvbXBvbmVudCBjb250YWluZXJEZXRhaWxzLCBDb21wb25lbnQgY29tcEluc3RPcmlnaW5EZXRhaWxzLAorCQkJVXNlciBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZUVudW0sIGJvb2xlYW4gaXNIaWdoZXN0TGV2ZWwpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldENvbXBvbmVudEluc3RhbmNlKGNvbXBJbnN0T3JpZ2luRGV0YWlscyk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSgKKwkJCQlyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgbW9kaWZpZXIsIGNvbnRhaW5lckRldGFpbHMuZ2V0VW5pcXVlSWQoKSwgY29udGFpbmVyQ29tcG9uZW50VHlwZUVudW0pOworCQlpZiAoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmVxdWFscyhCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpICYmIGlzSGlnaGVzdExldmVsKSB7CisJCQkvLyBBZGQgUkkgQ2FwYWJpbGl0aWVzIGFuZCBSZXF1aXJlbWVudHMgdG8gZXhwZWN0ZWQgTUFQIC0tPgorCQkJLy8gZXhwZWN0ZWRWZkNhcGFiaWxpdGllcyBhbmQgZXhwZWN0ZWRWZlJlcXVpcmVtZW50cworCQkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCQkucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCQlhZGRDb21wSW5zdFJlcUNhcFRvRXhwZWN0ZWQoY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lckNvbXBvbmVudFR5cGVFbnVtLCBtb2RpZmllcik7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbXBJbnN0VW5pcXVlSWQsIENvbXBvbmVudCBjb250YWluZXJEZXRhaWxzLAorCQkJVXNlciBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIGJvb2xlYW4gaXNIaWdoZXN0TGV2ZWwpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UobW9kaWZpZXIsCisJCQkJY29udGFpbmVyRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBjb21wSW5zdFVuaXF1ZUlkLCBjb21wb25lbnRUeXBlRW51bSk7CisJCWlmIChkZWxldGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfREVMRVRFKSAmJiBpc0hpZ2hlc3RMZXZlbCkgeworCQkJZGVsZXRlQ29tcEluc3RSZXFDYXBGcm9tRXhwZWN0ZWQoY29tcEluc3RVbmlxdWVJZCk7CisJCX0KKwkJcmV0dXJuIGRlbGV0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXNGb3JTZXJ2aWNlKFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiwKKwkJCUNvbXBvbmVudFJlcURldGFpbHMgY29udGFpbmVyRGV0YWlscywgVXNlciB1c2VyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5hc3NvY2lhdGVJbnN0YW5jZXMocmVxdWlyZW1lbnREZWYsIHVzZXIsCisJCQkJY29udGFpbmVyRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc29jaWF0ZUluc3RhbmNlcyk7CisJCWRlbGV0ZUFzc29jaWF0ZWRGcm9tRXhwZWN0ZWQocmVxdWlyZW1lbnREZWYpOworCQlyZXR1cm4gYXNzb2NpYXRlSW5zdGFuY2VzOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlQXNzb2NpYXRlZEZyb21FeHBlY3RlZChSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYpIHsKKwkJLy8gcmVtb3ZpbmcgZnJvbSByZXF1aXJlbWVudHMKKwkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uc2hpcCA9IHJlcXVpcmVtZW50RGVmLmdldFJlbGF0aW9uc2hpcHMoKS5nZXQoMCk7CisJCVN0cmluZyB0eXBlID0gcmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcCgpLmdldFR5cGUoKTsKKwkJU3RyaW5nIGZyb21JZCA9IHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMuZ2V0KHR5cGUpOworCQlSZXF1aXJlbWVudERlZmluaXRpb24gdG9EZWxldGUgPSBudWxsOworCQlpZiAocmVxTGlzdCAhPSBudWxsKSB7CisJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWYgOiByZXFMaXN0KSB7CisJCQkJaWYgKHJlcURlZi5nZXRPd25lcklkKCkuZXF1YWxzKGZyb21JZCkpIHsKKwkJCQkJdG9EZWxldGUgPSByZXFEZWY7CisJCQkJfQorCQkJfQorCQkJaWYgKHRvRGVsZXRlICE9IG51bGwpIHsKKwkJCQlyZXFMaXN0LnJlbW92ZSh0b0RlbGV0ZSk7CisJCQkJaWYgKHJlcUxpc3QuaXNFbXB0eSgpKSB7CisJCQkJCWV4cGVjdGVkQ29udGFpbmVyUmVxdWlyZW1lbnRzLnJlbW92ZSh0eXBlKTsKKwkJCQl9CisJCQkJcmVtb3ZlZFJlcXVpcmVtZW50cy5wdXQodG9EZWxldGUuZ2V0Q2FwYWJpbGl0eSgpICsgIiAiICsgdG9EZWxldGUuZ2V0T3duZXJJZCgpLCB0b0RlbGV0ZSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGlzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlc0ZvclNlcnZpY2UoUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmLAorCQkJQ29tcG9uZW50UmVxRGV0YWlscyBjb250YWluZXJEZXRhaWxzLCBVc2VyIHVzZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlIGRpc3NvY2lhdGVJbnN0YW5jZXMgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5kaXNzb2NpYXRlSW5zdGFuY2VzKHJlcXVpcmVtZW50RGVmLCB1c2VyLAorCQkJCWNvbnRhaW5lckRldGFpbHMuZ2V0VW5pcXVlSWQoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCVJlc291cmNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhkaXNzb2NpYXRlSW5zdGFuY2VzKTsKKwkJYWRkRGlzc29jaWF0ZWRUb0V4cGVjdGVkKHJlcXVpcmVtZW50RGVmKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERpc3NvY2lhdGVkVG9FeHBlY3RlZChSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYpIHsKKwkJLy8gYWRkaW5nIHRvIHJlcXVpcmVtZW50cworCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25zaGlwID0gcmVxdWlyZW1lbnREZWYuZ2V0UmVsYXRpb25zaGlwcygpLmdldCgwKTsKKwkJU3RyaW5nIHR5cGUgPSByZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZSgpOworCQlTdHJpbmcgZnJvbUlkID0gcmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKTsKKwkJU3RyaW5nIGtleSA9IHR5cGUgKyAiICIgKyBmcm9tSWQ7CisJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZmluaXRpb24gPSByZW1vdmVkUmVxdWlyZW1lbnRzLmdldChrZXkpOworCQlpZiAocmVxdWlyZW1lbnREZWZpbml0aW9uICE9IG51bGwpIHsKKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFMaXN0ID0gZXhwZWN0ZWRDb250YWluZXJSZXF1aXJlbWVudHMuZ2V0KHR5cGUpOworCQkJaWYgKHJlcUxpc3QgPT0gbnVsbCkgeworCQkJCXJlcUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQlleHBlY3RlZENvbnRhaW5lclJlcXVpcmVtZW50cy5wdXQodHlwZSwgcmVxTGlzdCk7CisJCQl9CisJCQlyZXFMaXN0LmFkZChyZXF1aXJlbWVudERlZmluaXRpb24pOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvVG9zY2FQYXJzZXJVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL1Rvc2NhUGFyc2VyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTkyOGIzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL1Rvc2NhUGFyc2VyVXRpbHMuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVG9zY2FLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXMuVG9zY2FEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnRvc2NhLmRhdGF0eXBlcy5Ub3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXMuVG9zY2FOb2RlVHlwZXNEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnRvc2NhLmRhdGF0eXBlcy5Ub3NjYVByb3BlcnRpZXNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXMuVG9zY2FSZXF1aXJlbWVudHNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXMuVG9zY2FUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkNzYXJWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKKworcHVibGljIGNsYXNzIFRvc2NhUGFyc2VyVXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRvc2NhUGFyc2VyVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgTWFwPD8sID8+IGdldFRvc2NhWWFtbE1hcChTdHJpbmcgY3NhclVVSUQsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY3NhclBheWxvYWQgPSBDc2FyVmFsaWRhdGlvblV0aWxzLmdldENzYXJQYXlsb2FkKGNzYXJVVUlELCBmaWxlTG9jYXRpb24pOworCQlpZiAoY3NhclBheWxvYWQgIT0gbnVsbCkgeworCQkJWWFtbCB5YW1sID0gbmV3IFlhbWwoKTsKKwkJCU1hcDw/LCA/PiBtYXAgPSAoTWFwPD8sID8+KSB5YW1sLmxvYWQoY3NhclBheWxvYWQpOworCQkJcmV0dXJuIG1hcDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFRvc2NhRGVmaW5pdGlvbiBnZXRUb3NjYURlZmluaXRpb25PYmplY3RCeUNzYXJVdWlkKFN0cmluZyBjc2FyVVVJRCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIFRPU0NBTWV0YUxvY2F0aW9uID0gIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEiOworCQlNYXA8PywgPz4gbWFwID0gZ2V0VG9zY2FZYW1sTWFwKGNzYXJVVUlELCBUT1NDQU1ldGFMb2NhdGlvbik7CisJCWFzc2VydE5vdE51bGwoIlRvc2NhIEVudHJ5LURlZmluaXRpb25zIGlzIG51bGwiLCBtYXApOworCQlpZiAobWFwICE9IG51bGwpIHsKKwkJCVN0cmluZyBkZWZpbml0aW9uWWFtbExvY2F0aW9uID0gKFN0cmluZykgbWFwLmdldCgiRW50cnktRGVmaW5pdGlvbnMiKTsKKwkJCU1hcDw/LCA/PiB0b3NjYU1hcCA9IGdldFRvc2NhWWFtbE1hcChjc2FyVVVJRCwgZGVmaW5pdGlvbllhbWxMb2NhdGlvbik7CisJCQlhc3NlcnROb3ROdWxsKCJUb3NjYSBkZWZpbml0aW9uIGlzIG51bGwiLCB0b3NjYU1hcCk7CisJCQlpZiAodG9zY2FNYXAgIT0gbnVsbCkgeworCQkJCVRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24gPSBuZXcgVG9zY2FEZWZpbml0aW9uKCk7CisJCQkJU2V0PD8+IGtleVNldCA9IHRvc2NhTWFwLmtleVNldCgpOworCQkJCWZvciAoT2JqZWN0IGtleSA6IGtleVNldCkgeworCQkJCQlUb3NjYUtleXNFbnVtIHRvc2NhS2V5ID0gVG9zY2FLZXlzRW51bS5maW5kVG9zY2FLZXkoKFN0cmluZykga2V5KTsKKwkJCQkJc3dpdGNoICh0b3NjYUtleSkgeworCQkJCQljYXNlIFRPU0NBX0RFRklOSVRJT05fVkVSU0lPTjoKKwkJCQkJCWdldFRvc2NhRGVmaW5pdGlvblZlcnNpb24odG9zY2FNYXAsIHRvc2NhRGVmaW5pdGlvbik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBOT0RFX1RZUEVTOgorCQkJCQkJZ2V0VG9zY2FOb2RlVHlwZXModG9zY2FNYXAsIHRvc2NhRGVmaW5pdGlvbik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUT1BPTE9HWV9URU1QTEFURToKKwkJCQkJCWdldFRvc2NhVG9wb2xvZ3lUZW1wbGF0ZSh0b3NjYU1hcCwgdG9zY2FEZWZpbml0aW9uKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElNUE9SVFM6CisJCQkJCQkvLyB0b3NjYU1hcC5nZXQoImltcG9ydHMiKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHRvc2NhRGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUb3NjYURlZmluaXRpb25WZXJzaW9uKE1hcDw/LCA/PiB0b3NjYU1hcCwgVG9zY2FEZWZpbml0aW9uIHRvc2NhRGVmaW5pdGlvbikgeworCQlpZiAodG9zY2FNYXAuZ2V0KCJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uIikgIT0gbnVsbCkgeworCQkJdG9zY2FEZWZpbml0aW9uLnNldFRvc2NhRGVmaW5pdGlvblZlcnNpb24oKFN0cmluZykgdG9zY2FNYXAuZ2V0KCJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uIikpOworCQl9CisJfQorCisJLy8gc3BlYyA5MCBwYWdlCisJcHVibGljIHN0YXRpYyB2b2lkIGdldFRvc2NhTm9kZVR5cGVzKE1hcDw/LCA/PiB0b3NjYU1hcCwgVG9zY2FEZWZpbml0aW9uIHRvc2NhRGVmaW5pdGlvbikgeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gbm9kZVR5cGVzID0gKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+KSB0b3NjYU1hcC5nZXQoIm5vZGVfdHlwZXMiKTsKKwkJTGlzdDxUb3NjYU5vZGVUeXBlc0RlZmluaXRpb24+IGxpc3RUb3NjYU5vZGVUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAobm9kZVR5cGVzICE9IG51bGwpIHsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gZW50cnkgOiBub2RlVHlwZXMuZW50cnlTZXQoKSkgeworCQkJCVRvc2NhTm9kZVR5cGVzRGVmaW5pdGlvbiB0b3NjYU5vZGVUeXBlcyA9IG5ldyBUb3NjYU5vZGVUeXBlc0RlZmluaXRpb24oKTsKKwkJCQlTdHJpbmcgdG9zY2FOb2RlTmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJCXRvc2NhTm9kZVR5cGVzLnNldE5hbWUodG9zY2FOb2RlTmFtZSk7CisKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHRvc2NhTm9kZVR5cGUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCWlmICh0b3NjYU5vZGVUeXBlICE9IG51bGwpIHsKKwkJCQkJU2V0PEVudHJ5PFN0cmluZywgU3RyaW5nPj4gZW50cnlTZXQgPSB0b3NjYU5vZGVUeXBlLmVudHJ5U2V0KCk7CisJCQkJCWlmIChlbnRyeVNldCAhPSBudWxsKSB7CisJCQkJCQkvLyBib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQkJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiB0b3NjYU5vZGVUeXBlTWFwIDogZW50cnlTZXQpIHsKKwkJCQkJCQlTdHJpbmcga2V5ID0gdG9zY2FOb2RlVHlwZU1hcC5nZXRLZXkoKTsKKwkJCQkJCQlpZiAoa2V5LmVxdWFscygiZGVyaXZlZF9mcm9tIikpIHsKKwkJCQkJCQkJU3RyaW5nIGRlcml2ZWRGcm9tID0gdG9zY2FOb2RlVHlwZU1hcC5nZXRWYWx1ZSgpOworCQkJCQkJCQl0b3NjYU5vZGVUeXBlcy5zZXREZXJpdmVkRnJvbShkZXJpdmVkRnJvbSk7CisJCQkJCQkJCS8vIGZvdW5kID0gdHJ1ZTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCQkvLyBpZiAoZm91bmQgPT0gZmFsc2UpIHsKKwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVG9zY2EgZmlsZSBub3QgdmFsaWQsCisJCQkJCQkvLyBkZXJpdmVkX2Zyb20gbm90IGZvdW5kIik7CisJCQkJCQkvLyB9CisJCQkJCX0KKworCQkJCX0KKwkJCQlsaXN0VG9zY2FOb2RlVHlwZXMuYWRkKHRvc2NhTm9kZVR5cGVzKTsKKwkJCX0KKwkJCXRvc2NhRGVmaW5pdGlvbi5zZXRUb3NjYU5vZGVUeXBlcyhsaXN0VG9zY2FOb2RlVHlwZXMpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGdldFRvc2NhVG9wb2xvZ3lUZW1wbGF0ZShNYXA8PywgPz4gdG9zY2FNYXAsIFRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24pIHsKKwkJVG9zY2FUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbiB0b3NjYVRvcG9sb2d5VGVtcGxhdGUgPSBuZXcgVG9zY2FUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbigpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gdG9wb2xvZ3lUZW1wbGF0ZU1hcCA9IChNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PikgdG9zY2FNYXAKKwkJCQkuZ2V0KCJ0b3BvbG9neV90ZW1wbGF0ZSIpOworCQlMaXN0PFRvc2NhTm9kZVRlbXBsYXRlc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uPiBsaXN0VG9zY2FOb2RlVGVtcGxhdGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJaWYgKHRvcG9sb2d5VGVtcGxhdGVNYXAgIT0gbnVsbCkgeworCQkJZ2V0VG9zY2FOb2RlVGVtcGxhdGVzKHRvcG9sb2d5VGVtcGxhdGVNYXAsIGxpc3RUb3NjYU5vZGVUZW1wbGF0ZXMpOworCQl9CisJCXRvc2NhVG9wb2xvZ3lUZW1wbGF0ZS5zZXRUb3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbihsaXN0VG9zY2FOb2RlVGVtcGxhdGVzKTsKKwkJdG9zY2FEZWZpbml0aW9uLnNldFRvc2NhVG9wb2xvZ3lUZW1wbGF0ZSh0b3NjYVRvcG9sb2d5VGVtcGxhdGUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUb3NjYU5vZGVUZW1wbGF0ZXMoTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gdG9wb2xvZ3lUZW1wbGF0ZU1hcCwKKwkJCUxpc3Q8VG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24+IGxpc3RUb3NjYU5vZGVUZW1wbGF0ZXMpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBub2RlVGVtcGxhdGVzTWFwID0gdG9wb2xvZ3lUZW1wbGF0ZU1hcC5nZXQoIm5vZGVfdGVtcGxhdGVzIik7CisJCWlmIChub2RlVGVtcGxhdGVzTWFwICE9IG51bGwpIHsKKworCQkJZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gbm9kZVRlbXBsYXRlcyA6IG5vZGVUZW1wbGF0ZXNNYXAuZW50cnlTZXQoKSkgeworCQkJCVRvc2NhTm9kZVRlbXBsYXRlc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIHRvc2NhTm9kZVRlbXBsYXRlcyA9IG5ldyBUb3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbigpOworCQkJCWdldFRvc2NhTm9kZVRlbXBsYXRlc05hbWUobm9kZVRlbXBsYXRlcywgdG9zY2FOb2RlVGVtcGxhdGVzKTsKKworCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbm9kZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBub2RlVGVtcGxhdGVzLmdldFZhbHVlKCk7CisJCQkJZ2V0Tm9kZVRlbXBsYXRlc1R5cGUodG9zY2FOb2RlVGVtcGxhdGVzLCBub2RlKTsKKwkJCQlnZXRUb3NjYU5vZGVUZW1wbGF0ZVByb3BlcnRpZXModG9zY2FOb2RlVGVtcGxhdGVzLCBub2RlKTsKKwkJCQlnZXRUb3NjYU5vZGVUZW1wbGF0ZVJlcXVpcmVtZW50cyh0b3NjYU5vZGVUZW1wbGF0ZXMsIG5vZGUpOworCQkJCWxpc3RUb3NjYU5vZGVUZW1wbGF0ZXMuYWRkKHRvc2NhTm9kZVRlbXBsYXRlcyk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VG9zY2FOb2RlVGVtcGxhdGVSZXF1aXJlbWVudHMoVG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24gdG9zY2FOb2RlVGVtcGxhdGVzLAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBub2RlKSB7CisJCUxpc3Q8VG9zY2FSZXF1aXJlbWVudHNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbj4gdG9zY2FSZXF1aXJlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKG5vZGUuZ2V0KCJyZXF1aXJlbWVudHMiKSAhPSBudWxsKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gcmVxdWlyZW1lbnRMaXN0ID0gKExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4pIG5vZGUuZ2V0KCJyZXF1aXJlbWVudHMiKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7CisJCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IHJlcXVpcmVtZW50IDogcmVxdWlyZW1lbnRMaXN0LmdldChpKS5lbnRyeVNldCgpKSB7CisJCQkJCVRvc2NhUmVxdWlyZW1lbnRzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24gdG9zY2FSZXF1aXJlbWVudCA9IG5ldyBUb3NjYVJlcXVpcmVtZW50c05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uKCk7CisJCQkJCWlmIChyZXF1aXJlbWVudC5nZXRLZXkoKSAhPSBudWxsKSB7CisJCQkJCQlTdHJpbmcgcmVxdWlyZW1lbnROYW1lID0gcmVxdWlyZW1lbnQuZ2V0S2V5KCk7CisJCQkJCQl0b3NjYVJlcXVpcmVtZW50LnNldE5hbWUocmVxdWlyZW1lbnROYW1lKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxvZy5kZWJ1ZygiVG9zY2EgZmlsZSBub3QgdmFsaWQsIHJlcXVpcmVtZW50cyBzaG91bGQgY29udGFpbiBuYW1lIik7CisJCQkJCX0KKworCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiByZXF1aXJlbWVudE1hcCA9IChNYXA8U3RyaW5nLCBTdHJpbmc+KSByZXF1aXJlbWVudC5nZXRWYWx1ZSgpOworCQkJCQlTZXQ8RW50cnk8U3RyaW5nLCBTdHJpbmc+PiBlbnRyeVNldCA9IHJlcXVpcmVtZW50TWFwLmVudHJ5U2V0KCk7CisJCQkJCWlmIChlbnRyeVNldCAhPSBudWxsKSB7CisJCQkJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiByZXF1aXJlbWVudEZpZWxkIDogZW50cnlTZXQpIHsKKwkJCQkJCQlTdHJpbmcga2V5ID0gcmVxdWlyZW1lbnRGaWVsZC5nZXRLZXkoKTsKKwkJCQkJCQlzd2l0Y2ggKGtleSkgeworCQkJCQkJCWNhc2UgImNhcGFiaWxpdHkiOgorCQkJCQkJCQlpZiAocmVxdWlyZW1lbnRNYXAuZ2V0KGtleSkgIT0gbnVsbCkgeworCQkJCQkJCQkJU3RyaW5nIGNhcGFiaWxpdHkgPSAoU3RyaW5nKSByZXF1aXJlbWVudE1hcC5nZXQoa2V5KTsKKwkJCQkJCQkJCXRvc2NhUmVxdWlyZW1lbnQuc2V0Q2FwYWJpbGl0eShjYXBhYmlsaXR5KTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJY29udGludWU7CisJCQkJCQkJCX0KKwkJCQkJCQljYXNlICJub2RlIjoKKwkJCQkJCQkJaWYgKHJlcXVpcmVtZW50TWFwLmdldChrZXkpICE9IG51bGwpIHsKKwkJCQkJCQkJCVN0cmluZyByZXF1aXJlbWVudE5vZGUgPSAoU3RyaW5nKSByZXF1aXJlbWVudE1hcC5nZXQoa2V5KTsKKwkJCQkJCQkJCXRvc2NhUmVxdWlyZW1lbnQuc2V0Tm9kZShyZXF1aXJlbWVudE5vZGUpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCWNhc2UgInJlbGF0aW9uc2hpcCI6CisJCQkJCQkJCWlmIChyZXF1aXJlbWVudE1hcC5nZXQoa2V5KSAhPSBudWxsKSB7CisJCQkJCQkJCQlTdHJpbmcgcmVsYXRpb25zaGlwID0gKFN0cmluZykgcmVxdWlyZW1lbnRNYXAuZ2V0KGtleSk7CisJCQkJCQkJCQl0b3NjYVJlcXVpcmVtZW50LnNldFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXApOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkJfQorCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl0b3NjYVJlcXVpcmVtZW50cy5hZGQodG9zY2FSZXF1aXJlbWVudCk7CisJCQkJfQorCQkJfQorCQl9CisJCXRvc2NhTm9kZVRlbXBsYXRlcy5zZXRSZXF1aXJlbWVudHModG9zY2FSZXF1aXJlbWVudHMpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUb3NjYU5vZGVUZW1wbGF0ZVByb3BlcnRpZXMoVG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24gdG9zY2FOb2RlVGVtcGxhdGVzLAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBub2RlKSB7CisJCUxpc3Q8VG9zY2FQcm9wZXJ0aWVzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24+IGxpc3RUb3NjYVByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKG5vZGUuZ2V0KCJwcm9wZXJ0aWVzIikgIT0gbnVsbCkgeworCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSAoTWFwPFN0cmluZywgT2JqZWN0Pikgbm9kZS5nZXQoInByb3BlcnRpZXMiKTsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJCVRvc2NhUHJvcGVydGllc05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uIHRvc2NhUHJvcGVydHkgPSBuZXcgVG9zY2FQcm9wZXJ0aWVzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24oKTsKKwkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHkuZ2V0S2V5KCk7CisJCQkJT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOworCQkJCXRvc2NhUHJvcGVydHkuc2V0TmFtZShwcm9wZXJ0eU5hbWUpOworCQkJCXRvc2NhUHJvcGVydHkuc2V0VmFsdWUocHJvcGVydHlWYWx1ZSk7CisJCQkJbGlzdFRvc2NhUHJvcGVydGllcy5hZGQodG9zY2FQcm9wZXJ0eSk7CisJCQl9CisJCX0KKwkJdG9zY2FOb2RlVGVtcGxhdGVzLnNldFByb3BlcnRpZXMobGlzdFRvc2NhUHJvcGVydGllcyk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldE5vZGVUZW1wbGF0ZXNUeXBlKFRvc2NhTm9kZVRlbXBsYXRlc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIHRvc2NhTm9kZVRlbXBsYXRlcywKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbm9kZSkgeworCQlpZiAobm9kZS5nZXQoInR5cGUiKSAhPSBudWxsKSB7CisJCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIG5vZGUuZ2V0KCJ0eXBlIik7CisJCQl0b3NjYU5vZGVUZW1wbGF0ZXMuc2V0VHlwZSh0eXBlKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiVG9zY2EgZmlsZSBub3QgdmFsaWQsIG5vZGVUZW1wbGF0ZSBzaG91bGQgY29udGFpbiB0eXBlIik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0VG9zY2FOb2RlVGVtcGxhdGVzTmFtZShFbnRyeTxTdHJpbmcsIE9iamVjdD4gbm9kZVRlbXBsYXRlcywKKwkJCVRvc2NhTm9kZVRlbXBsYXRlc1RvcG9sb2d5VGVtcGxhdGVEZWZpbml0aW9uIHRvc2NhTm9kZVRlbXBsYXRlcykgeworCQlTdHJpbmcgbmFtZSA9IG5vZGVUZW1wbGF0ZXMuZ2V0S2V5KCk7CisJCXRvc2NhTm9kZVRlbXBsYXRlcy5zZXROYW1lKG5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9VdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyZjE0MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9VdGlscy5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlRvc2NhTm9kZVR5cGVJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuWWFtbENvbnN0YW50czsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIFV0aWxzIHsKKworCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCVN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJU3RyaW5nIGFjY2VwdEhlYWRlckRhdGUgPSAiYXBwbGljYXRpb24vanNvbiI7CisKKwlwdWJsaWMgVXRpbHMoKSB7CisJCQorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBUb3NjYU5vZGVUeXBlSW5mbyBwYXJzZVRvc2NhTm9kZVlhbWwoU3RyaW5nIGZpbGVDb250ZW50KSB7CisKKwkJVG9zY2FOb2RlVHlwZUluZm8gcmVzdWx0ID0gbmV3IFRvc2NhTm9kZVR5cGVJbmZvKCk7CisJCU9iamVjdCB0ZW1wbGF0ZVZlcnNpb24gPSBudWxsOworCQlPYmplY3QgdGVtcGxhdGVOYW1lID0gbnVsbDsKKworCQlpZiAoZmlsZUNvbnRlbnQgIT0gbnVsbCkgeworCQkJWWFtbCB5YW1sID0gbmV3IFlhbWwoKTsKKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiB5YW1sT2JqZWN0ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHlhbWwubG9hZChmaWxlQ29udGVudCk7CisKKwkJCXRlbXBsYXRlVmVyc2lvbiA9IHlhbWxPYmplY3QuZ2V0KFlhbWxDb25zdGFudHMuVEVNUExBVEVfVkVSU0lPTik7CisJCQlpZiAodGVtcGxhdGVWZXJzaW9uICE9IG51bGwpIHsKKwkJCQlyZXN1bHQuc2V0VGVtcGxhdGVWZXJzaW9uKHRlbXBsYXRlVmVyc2lvbi50b1N0cmluZygpKTsKKwkJCX0KKwkJCXRlbXBsYXRlTmFtZSA9IHlhbWxPYmplY3QuZ2V0KFlhbWxDb25zdGFudHMuVEVNUExBVEVfTkFNRSk7CisJCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwpIHsKKwkJCQlyZXN1bHQuc2V0VGVtcGxhdGVOYW1lKHRlbXBsYXRlTmFtZS50b1N0cmluZygpKTsKKwkJCX0KKwkJCU9iamVjdCBub2RlVHlwZXMgPSB5YW1sT2JqZWN0LmdldChZYW1sQ29uc3RhbnRzLk5PREVfVFlQRVMpOworCisJCQlpZiAobm9kZVR5cGVzICE9IG51bGwpIHsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5vZGVUeXBlc01hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBub2RlVHlwZXM7CisJCQkJZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBub2RlVHlwZXNNYXAuZW50cnlTZXQoKSkgeworCisJCQkJCVN0cmluZyBub2RlTmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlpZiAobm9kZU5hbWUgIT0gbnVsbCkgeworCQkJCQkJcmVzdWx0LnNldE5vZGVOYW1lKG5vZGVOYW1lKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCisJCQkJfQorCQkJfQorCisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpzb25PYmplY3RWYWx1ZUJ5S2V5KFN0cmluZyBtZXRhZGF0YSwgU3RyaW5nIGtleSkgeworCQlKc29uRWxlbWVudCBqZWxlbWVudCA9IG5ldyBKc29uUGFyc2VyKCkucGFyc2UobWV0YWRhdGEpOworCisJCUpzb25PYmplY3Qgam9iamVjdCA9IGplbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQlPYmplY3Qgb2JqID0gam9iamVjdC5nZXQoa2V5KTsKKwkJaWYgKG9iaiA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyB2YWx1ZTsKKwkJCXZhbHVlID0gKFN0cmluZykgam9iamVjdC5nZXQoa2V5KS5nZXRBc1N0cmluZygpOworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBDb25maWcgZ2V0Q29uZmlnKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBDb25maWcuaW5zdGFuY2UoKTsKKwkJcmV0dXJuIGNvbmZpZzsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29tcGFyZUFycmF5TGlzdHMoTGlzdDxTdHJpbmc+IGFjdHVhbEFycmF5bExpc3QsIExpc3Q8U3RyaW5nPiBleHBlY3RlZEFycmF5TGlzdCwKKwkJCVN0cmluZyBtZXNzYWdlKSB7CisKKwkJQXJyYXlMaXN0PFN0cmluZz4gYWN0dWFsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFjdHVhbEFycmF5bExpc3QpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihleHBlY3RlZEFycmF5TGlzdCk7CisJCWFzc2VydEVxdWFscyhtZXNzYWdlICsgIiBjb3VudCBnb3QgYnkgcmVzdCBBUEkgbm90IG1hdGNoIHRvICIgKyBtZXNzYWdlICsgIiBleHBlY3RlZCBjb3VudCIsIGV4cGVjdGVkLnNpemUoKSwKKwkJCQlhY3R1YWwuc2l6ZSgpKTsKKwkJYWN0dWFsLnJlbW92ZUFsbChleHBlY3RlZCk7CisJCWFzc2VydEVxdWFscyhtZXNzYWdlICsgIiBjb250ZW50IGdvdCBieSByZXN0IEFQSSBub3QgbWF0Y2ggdG8gIiArIG1lc3NhZ2UgKyAiIGV4cGVjdGVkIGNvbnRlbnQiLCAwLAorCQkJCWFjdHVhbC5zaXplKCkpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIE9iamVjdCBwYXJzZVlhbWxDb25maWcoU3RyaW5nIHBhdHRlcm4pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisJCVlhbWwgeWFtbCA9IG5ldyBZYW1sKCk7CisJCUNvbmZpZyBjb25maWcgPSBnZXRDb25maWcoKTsKKwkJU3RyaW5nIGNvbmZpZ3VyYXRpb25GaWxlID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25GaWxlKCk7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25GaWxlKTsKKwkJLy8gRmlsZSBmaWxlID0gbmV3CisJCS8vIEZpbGUoIi4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWwiKTsKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCQlNYXA8PywgPz4gbWFwID0gKE1hcDw/LCA/PikgeWFtbC5sb2FkKGlucHV0U3RyZWFtKTsKKwkJT2JqZWN0IHBhdHRlcm5NYXAgPSAoT2JqZWN0KSBtYXAuZ2V0KHBhdHRlcm4pOworCisJCXJldHVybiBwYXR0ZXJuTWFwOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlcEFydExhYmVsRnJvbUNvbmZpZyhBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZUVudW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcE9mRGVwUmVzQXJ0VHlwZXNPYmplY3RzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHBhcnNlWWFtbENvbmZpZygKKwkJCQkiZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzIik7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBpdGVyIDogbWFwT2ZEZXBSZXNBcnRUeXBlc09iamVjdHMuZW50cnlTZXQoKSkgeworCQkJaWYgKGl0ZXIuZ2V0VmFsdWUoKS50b1N0cmluZygpLmNvbnRhaW5zKGFydGlmYWN0VHlwZUVudW0uZ2V0VHlwZSgpKSkgeworCQkJCXJldHVybiBpdGVyLmdldEtleSgpLnRvTG93ZXJDYXNlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gImRlZmF1bHRMYWJlbE5hbWUiOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG11bHRpcGxlQ2hhcihTdHJpbmcgY2gsIGludCByZXBlYXQpIHsKKwkJcmV0dXJuIFN0cmluZ1V0aWxzLnJlcGVhdChjaCwgcmVwZWF0KTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0TGlzdE9mRGVwUmVzQXJ0TGFiZWxzKEJvb2xlYW4gaXNMb3dlckNhc2UpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisJCUxpc3Q8U3RyaW5nPiBsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHBhcnNlWWFtbENvbmZpZygKKwkJCQkiZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzIik7CisJCWlmIChyZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMgIT0gbnVsbCkgeworCisJCQlpZiAoaXNMb3dlckNhc2UpIHsKKwkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gaXRlciA6IHJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cy5lbnRyeVNldCgpKSB7CisJCQkJCWxpc3RPZlJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZy5hZGQoaXRlci5nZXRLZXkoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCisJCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGl0ZXIgOiByZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJCQlsaXN0T2ZSZXNEZXBBcnRUeXBlc0Zyb21Db25maWcuYWRkKGl0ZXIuZ2V0S2V5KCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbGlzdE9mUmVzRGVwQXJ0VHlwZXNGcm9tQ29uZmlnOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldExpc3RPZlRvc2NhQXJ0TGFiZWxzKEJvb2xlYW4gaXNMb3dlckNhc2UpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisJCUxpc3Q8U3RyaW5nPiBsaXN0T2ZUb3NjYUFydFR5cGVzRnJvbUNvbmZpZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUFydGlmYWN0cyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwYXJzZVlhbWxDb25maWcoInRvc2NhQXJ0aWZhY3RzIik7CisJCWlmICh0b3NjYUFydGlmYWN0cyAhPSBudWxsKSB7CisKKwkJCWlmIChpc0xvd2VyQ2FzZSkgeworCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBpdGVyIDogdG9zY2FBcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJCQlsaXN0T2ZUb3NjYUFydFR5cGVzRnJvbUNvbmZpZy5hZGQoaXRlci5nZXRLZXkoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBpdGVyIDogdG9zY2FBcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJCQlsaXN0T2ZUb3NjYUFydFR5cGVzRnJvbUNvbmZpZy5hZGQoaXRlci5nZXRLZXkoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBsaXN0T2ZUb3NjYUFydFR5cGVzRnJvbUNvbmZpZzsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMaXN0T2ZSZXNQbGFjZUhvbGRlcnNEZXBBcnRUeXBlcygpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlMaXN0PFN0cmluZz4gbGlzdFJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlMaXN0PFN0cmluZz4gbGlzdE9mUmVzRGVwQXJ0TGFiZWxzRnJvbUNvbmZpZyA9IGdldExpc3RPZkRlcFJlc0FydExhYmVscyhmYWxzZSk7CisJCWFzc2VydE5vdE51bGwoImRlcGxveW1lbnQgYXJ0aWZhY3QgdHlwZXMgbGlzdCBpcyBudWxsIiwgbGlzdE9mUmVzRGVwQXJ0TGFiZWxzRnJvbUNvbmZpZyk7CisJCU9iamVjdCBwYXJzZVlhbWxDb25maWcgPSBVdGlscy5wYXJzZVlhbWxDb25maWcoImRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cyIpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcE9mRGVwUmVzQXJ0VHlwZXNPYmplY3RzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIFV0aWxzCisJCQkJLnBhcnNlWWFtbENvbmZpZygiZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzIik7CisKKwkJLy8gYXNzZXJ0Tm90TnVsbCgiZGVwbG95bWVudCBhcnRpZmFjdCB0eXBlcyBsaXN0IGlzIG51bGwiLAorCQkvLyBtYXBPZkRlcFJlc0FydFR5cGVzT2JqZWN0cyk7CisJCWlmIChsaXN0T2ZSZXNEZXBBcnRMYWJlbHNGcm9tQ29uZmlnICE9IG51bGwpIHsKKwkJCWZvciAoU3RyaW5nIHJlc0RlcEFydFR5cGUgOiBsaXN0T2ZSZXNEZXBBcnRMYWJlbHNGcm9tQ29uZmlnKSB7CisJCQkJT2JqZWN0IG9iamVjdCA9IG1hcE9mRGVwUmVzQXJ0VHlwZXNPYmplY3RzLmdldChyZXNEZXBBcnRUeXBlKTsKKwkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwPD8sID8+KSB7CisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG9iamVjdDsKKwkJCQkJbGlzdFJlc0RlcEFydFR5cGVzRnJvbUNvbmZpZy5hZGQoKFN0cmluZykgbWFwLmdldCgidHlwZSIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhc3NlcnRUcnVlKCJyZXR1cm4gb2JqZWN0IGRvZXMgbm90IGluc3RhbmNlIG9mIG1hcCIsIGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGxpc3RSZXNEZXBBcnRUeXBlc0Zyb21Db25maWc7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvY2Fzc2FuZHJhL0Nhc3NhbmRyYVV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvY2Fzc2FuZHJhL0Nhc3NhbmRyYVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNjhkNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9jYXNzYW5kcmEvQ2Fzc2FuZHJhVXRpbHMuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmNhc3NhbmRyYTsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuamF2YXR1cGxlcy5QYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLktleXNwYWNlTWV0YWRhdGE7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLk1ldGFkYXRhOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Sb3c7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNlc3Npb247CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnF1ZXJ5YnVpbGRlci5RdWVyeUJ1aWxkZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnF1ZXJ5YnVpbGRlci5TZWxlY3Q7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnF1ZXJ5YnVpbGRlci5TZWxlY3QuV2hlcmU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDYXNzYW5kcmFVdGlscyB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENhc3NhbmRyYVV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcm90ZWN0ZWQgc3RhdGljIENsdXN0ZXIgY2x1c3RlciA9IG51bGw7CisJcHJvdGVjdGVkIHN0YXRpYyBTZXNzaW9uIHNlc3Npb247CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdENvbm5lY3Rpb24oU3RyaW5nIGtleXNwYWNlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgY2Fzc2FuZHJhSG9zdCA9IFV0aWxzLmdldENvbmZpZygpLmdldENhc3NhbmRyYUhvc3QoKTsKKwkJQm9vbGVhbiBjYXNzYW5kcmFBdXRoZW50aWNhdGUgPSBVdGlscy5nZXRDb25maWcoKS5nZXRDYXNzYW5kcmFBdXRoZW50aWNhdGUoKTsKKwkJU3RyaW5nIGNhc3NhbmRyYVVzZXJuYW1lID0gVXRpbHMuZ2V0Q29uZmlnKCkuZ2V0Q2Fzc2FuZHJhVXNlcm5hbWUoKTsKKwkJU3RyaW5nIGNhc3NhbmRyYVBhc3N3b3JkID0gVXRpbHMuZ2V0Q29uZmlnKCkuZ2V0Q2Fzc2FuZHJhUGFzc3dvcmQoKTsKKwkJQm9vbGVhbiBjYXNzYW5kcmFTc2wgPSBVdGlscy5nZXRDb25maWcoKS5nZXRDYXNzYW5kcmFTc2woKTsKKwkJU3RyaW5nIGNhc3NhbmRyYVRydXN0c3RvcmVQYXRoID0gVXRpbHMuZ2V0Q29uZmlnKCkuZ2V0Q2Fzc2FuZHJhVHJ1c3RzdG9yZVBhdGgoKTsKKwkJU3RyaW5nIGNhc3NhbmRyYVRydXN0c3RvcmVQYXNzd29yZCA9IFV0aWxzLmdldENvbmZpZygpLmdldENhc3NhbmRyYVRydXN0c3RvcmVQYXNzd29yZCgpOworCQkvKgorCQkgKiBTdHJpbmcgY2Fzc2FuZHJhQXVkaXRLZXlTcGFjZT0KKwkJICogVXRpbHMuZ2V0Q29uZmlnKCkuZ2V0Q2Fzc2FuZHJhQXVkaXRLZXlTcGFjZSgpOyBTdHJpbmcKKwkJICogY2Fzc2FuZHJhQXJ0aWZhY3RLZXlTcGFjZT0KKwkJICogVXRpbHMuZ2V0Q29uZmlnKCkuZ2V0Q2Fzc2FuZHJhQXJ0aWZhY3RLZXlTcGFjZSgpOworCQkgKi8KKworCQlDbHVzdGVyLkJ1aWxkZXIgY2x1c3RlckJ1aWxkZXIgPSBDbHVzdGVyLmJ1aWxkZXIoKS5hZGRDb250YWN0UG9pbnQoY2Fzc2FuZHJhSG9zdCk7CisJCWlmIChjYXNzYW5kcmFBdXRoZW50aWNhdGUpIHsKKwkJCS8vIGF1dGhhbnRpY2F0aW9uCisJCQljbHVzdGVyQnVpbGRlci53aXRoQ3JlZGVudGlhbHMoY2Fzc2FuZHJhVXNlcm5hbWUsIGNhc3NhbmRyYVBhc3N3b3JkKTsKKwkJfQorCisJCWlmIChjYXNzYW5kcmFTc2wpIHsKKwkJCS8vIHNzbAorCQkJU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLCBjYXNzYW5kcmFUcnVzdHN0b3JlUGF0aCk7CisJCQlTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIiwgY2Fzc2FuZHJhVHJ1c3RzdG9yZVBhc3N3b3JkKTsKKwkJCWNsdXN0ZXJCdWlsZGVyLndpdGhTU0woKTsKKwkJfQorCisJCWNsdXN0ZXIgPSBjbHVzdGVyQnVpbGRlci5idWlsZCgpOworCQlzZXNzaW9uID0gY2x1c3Rlci5jb25uZWN0KGtleXNwYWNlKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cnVuY2F0ZVRhYmxlKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwkJaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBzZXNzaW9uLmlzQ2xvc2VkKCkpIHsKKwkJCWluaXRDb25uZWN0aW9uKGtleXNwYWNlKTsKKwkJfQorCisJCXRyeSB7CisKKwkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKKwkJCQlzZXNzaW9uLmV4ZWN1dGUoUXVlcnlCdWlsZGVyLnRydW5jYXRlKGtleXNwYWNlLCB0YWJsZU5hbWUpKTsKKwkJCQlsb2dnZXIuZGVidWcoIlRoZSB0YWJsZSB7fS4ge30gd2FzIGNsZWFuZWQiLCBrZXlzcGFjZSwgdGFibGVOYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleXNwYWNlICIgKyBrZXlzcGFjZSArICIgbm90IGNvbm5lY3RlZCIpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJLy8gaWYgKGNsdXN0ZXIgIT0gbnVsbCkgeworCQkJLy8gY2x1c3Rlci5jbG9zZSgpOworCQkJLy8gfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKCkgeworCQlpZiAoY2x1c3RlciAhPSBudWxsKSB7CisJCQljbHVzdGVyLmNsb3NlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdHJ1bmNhdGVBbGxLZXlzcGFjZXMoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJLy8gdHJ1bmNhdGVBbGxUYWJsZXMoQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BUlRJRkFDVF9LRVlTUEFDRSk7CisJCXRydW5jYXRlQWxsVGFibGVzKEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cnVuY2F0ZUFsbFRhYmxlcyhTdHJpbmcga2V5c3BhY2UpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisJCWlmIChzZXNzaW9uID09IG51bGwgfHwgc2Vzc2lvbi5pc0Nsb3NlZCgpKSB7CisJCQlpbml0Q29ubmVjdGlvbihrZXlzcGFjZSk7CisJCX0KKwkJdHJ5IHsKKworCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCQkJCU1ldGFkYXRhIG1ldGFkYXRhID0gY2x1c3Rlci5nZXRNZXRhZGF0YSgpOworCQkJCUtleXNwYWNlTWV0YWRhdGEga2V5c3BhY2VNZXRhZGF0YSA9IG1ldGFkYXRhLmdldEtleXNwYWNlKGtleXNwYWNlKTsKKwkJCQlpZiAoa2V5c3BhY2VNZXRhZGF0YSAhPSBudWxsKSB7CisJCQkJCUNvbGxlY3Rpb248VGFibGVNZXRhZGF0YT4gdGFibGVzID0ga2V5c3BhY2VNZXRhZGF0YS5nZXRUYWJsZXMoKTsKKwkJCQkJdGFibGVzLmZvckVhY2godGFibGUgLT4geworCQkJCQkJc2Vzc2lvbi5leGVjdXRlKFF1ZXJ5QnVpbGRlci50cnVuY2F0ZSh0YWJsZSkpOworCQkJCQkJbG9nZ2VyLmRlYnVnKCJUYWJsZSB0cnVuY2V0ZWQgLSB7fSIsIHRhYmxlLmdldE5hbWUoKSk7CisJCQkJCX0pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleXNwYWNlICIgKyBrZXlzcGFjZSArICIgbm90IGNvbm5lY3RlZCIpOworCQkJfQorCisJCX0gZmluYWxseSB7CisJCQkvLyBpZiAoY2x1c3RlciAhPSBudWxsKSB7CisJCQkvLyBjbHVzdGVyLmNsb3NlKCk7CisJCQkvLyB9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8Um93PiBmZXRjaEZyb21UYWJsZShTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZU5hbWUsCisJCQlMaXN0PFBhaXI8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPj4gZmllbGRzKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKworCQlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBmaWVsZHNDb252ZXJ0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlmaWVsZHMuZm9yRWFjaChwYWlyIC0+IHsKKwkJCVBhaXI8U3RyaW5nLCBTdHJpbmc+IG5ld1BhaXIgPSBuZXcgUGFpcihwYWlyLmdldFZhbHVlMCgpLmdldERpc3BsYXlOYW1lKCksIHBhaXIuZ2V0VmFsdWUxKCkpOworCQkJZmllbGRzQ29udmVydGVkLmFkZChuZXdQYWlyKTsKKwkJfSk7CisKKwkJcmV0dXJuIGZldGNoRnJvbVRhYmxlUXVlcnkoa2V5c3BhY2UsIHRhYmxlTmFtZSwgZmllbGRzQ29udmVydGVkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8Um93PiBmZXRjaEZyb21UYWJsZVF1ZXJ5KFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlTmFtZSwgTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZmllbGRzKQorCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwkJaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBzZXNzaW9uLmlzQ2xvc2VkKCkpIHsKKwkJCWluaXRDb25uZWN0aW9uKGtleXNwYWNlKTsKKwkJfQorCQl0cnkgeworCisJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisJCQkJU2VsZWN0IHNlbGVjdCA9IFF1ZXJ5QnVpbGRlci5zZWxlY3QoKS5hbGwoKS5mcm9tKGtleXNwYWNlLCB0YWJsZU5hbWUpOworCQkJCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQkJCQkvLyBTZXQ8RW50cnk8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPj4gZW50cnlTZXQgPQorCQkJCQkvLyBmaWVsZHMuZW50cnlTZXQoKTsKKwkJCQkJLy8gZmllbGRzLgorCQkJCQlib29sZWFuIG11bHRpcGxlID0gKGZpZWxkcy5zaXplKCkgPiAxKSA/IHRydWUgOiBmYWxzZTsKKwkJCQkJV2hlcmUgd2hlcmUgPSBudWxsOworCQkJCQlpbnQgc2l6ZSA9IDA7CisKKwkJCQkJZm9yIChQYWlyPFN0cmluZywgU3RyaW5nPiBwYWlyIDogZmllbGRzKSB7CisJCQkJCQkrK3NpemU7CisJCQkJCQlpZiAoc2l6ZSA9PSAxKSB7CisJCQkJCQkJd2hlcmUgPSBzZWxlY3Qud2hlcmUoUXVlcnlCdWlsZGVyLmVxKHBhaXIuZ2V0VmFsdWUwKCksIHBhaXIuZ2V0VmFsdWUxKCkpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJd2hlcmUuYW5kKFF1ZXJ5QnVpbGRlci5lcShwYWlyLmdldFZhbHVlMCgpLCBwYWlyLmdldFZhbHVlMSgpKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKG11bHRpcGxlKSB7CisJCQkJCQlzZWxlY3QuYWxsb3dGaWx0ZXJpbmcoKTsKKwkJCQkJfQorCisJCQkJfQorCisJCQkJTGlzdDxSb3c+IHJvd3MgPSBzZXNzaW9uLmV4ZWN1dGUoc2VsZWN0KS5hbGwoKTsKKwkJCQlmb3IgKFJvdyByb3cgOiByb3dzKSB7CisJCQkJCWxvZ2dlci5kZWJ1Zygie30iLCByb3cpOworCQkJCX0KKwkJCQlyZXR1cm4gcm93czsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCS8vIGlmIChjbHVzdGVyICE9IG51bGwpIHsKKwkJCS8vIGNsdXN0ZXIuY2xvc2UoKTsKKwkJCS8vIH0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJLy8KKwkvLyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkvLyBNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisJLy8gbWFwLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgIkFjY2VzcyIpOworCS8vIG1hcC5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsICIyMDAiKTsKKwkvLyAvLyBDYXNzYW5kcmFVdGlscy50cnVuY2F0ZVRhYmxlKCJzZGNBcnRpZmFjdCIsICJyZXNvdXJjZXMiKTsKKwkvLy8vIENhc3NhbmRyYVV0aWxzLnRydW5jYXRlQWxsVGFibGVzKCJzZGNBdWRpdCIpOworCS8vIENhc3NhbmRyYVV0aWxzLmZldGNoRnJvbVRhYmxlKCJzZGNBdWRpdCIsICJ1c2VyYWNjZXNzZXZlbnQiLCBtYXAgKTsKKwkvLyB9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9jYXNzYW5kcmEvQ2Fzc2FuZHJhVXRpbHMyLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvY2Fzc2FuZHJhL0Nhc3NhbmRyYVV0aWxzMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGNhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvY2Fzc2FuZHJhL0Nhc3NhbmRyYVV0aWxzMi5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuY2Fzc2FuZHJhOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuamF2YXR1cGxlcy5QYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLktleXNwYWNlTWV0YWRhdGE7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLk1ldGFkYXRhOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Sb3c7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNlc3Npb247CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnF1ZXJ5YnVpbGRlci5RdWVyeUJ1aWxkZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnF1ZXJ5YnVpbGRlci5TZWxlY3Q7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnF1ZXJ5YnVpbGRlci5TZWxlY3QuV2hlcmU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDYXNzYW5kcmFVdGlsczIgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXNzYW5kcmFVdGlsczIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCB0cnVuY2F0ZVRhYmxlKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGNhc3NhbmRyYUhvc3QgPSBVdGlscy5nZXRDb25maWcoKS5nZXRDYXNzYW5kcmFIb3N0KCk7CisKKwkJQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKKwkJU2Vzc2lvbiBzZXNzaW9uOworCisJCXRyeSB7CisJCQlDbHVzdGVyLkJ1aWxkZXIgY2x1c3RlckJ1aWxkZXIgPSBDbHVzdGVyLmJ1aWxkZXIoKS5hZGRDb250YWN0UG9pbnQoY2Fzc2FuZHJhSG9zdCk7CisJCQkvLyBhdXRoYW50aWNhdGlvbgorCQkJLy8gY2x1c3RlckJ1aWxkZXIud2l0aENyZWRlbnRpYWxzKHVzZXJuYW1lLHBhc3N3b3JkKTsKKwkJCS8vIHNzbAorCQkJLy8gU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLHRydXN0c3RvcmVQYXRoKTsKKwkJCS8vIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiLHRydXN0c3RvcmVQYXNzd29yZCk7CisJCQkvLyBjbHVzdGVyQnVpbGRlci53aXRoU1NMKCk7CisJCQljbHVzdGVyID0gY2x1c3RlckJ1aWxkZXIuYnVpbGQoKTsKKwkJCXNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3Qoa2V5c3BhY2UpOworCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCQkJCXNlc3Npb24uZXhlY3V0ZShRdWVyeUJ1aWxkZXIudHJ1bmNhdGUoa2V5c3BhY2UsIHRhYmxlTmFtZSkpOworCQkJCWxvZ2dlci5kZWJ1ZygiVGhlIHRhYmxlIHt9LiB7fSB3YXMgY2xlYW5lZCIsIGtleXNwYWNlLCB0YWJsZU5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiS2V5c3BhY2UgIiArIGtleXNwYWNlICsgIiBub3QgY29ubmVjdGVkIik7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoY2x1c3RlciAhPSBudWxsKSB7CisJCQkJY2x1c3Rlci5jbG9zZSgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHRydW5jYXRlQWxsS2V5c3BhY2VzKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCXRydW5jYXRlQWxsVGFibGVzKEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVJUSUZBQ1RfS0VZU1BBQ0UpOworCQl0cnVuY2F0ZUFsbFRhYmxlcyhBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdHJ1bmNhdGVBbGxUYWJsZXMoU3RyaW5nIGtleXNwYWNlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNhc3NhbmRyYUhvc3QgPSBVdGlscy5nZXRDb25maWcoKS5nZXRDYXNzYW5kcmFIb3N0KCk7CisKKwkJQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKKwkJU2Vzc2lvbiBzZXNzaW9uOworCisJCXRyeSB7CisJCQljbHVzdGVyID0gQ2x1c3Rlci5idWlsZGVyKCkuYWRkQ29udGFjdFBvaW50KGNhc3NhbmRyYUhvc3QpLmJ1aWxkKCk7CisJCQlzZXNzaW9uID0gY2x1c3Rlci5jb25uZWN0KGtleXNwYWNlKTsKKwkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKKwkJCQlNZXRhZGF0YSBtZXRhZGF0YSA9IGNsdXN0ZXIuZ2V0TWV0YWRhdGEoKTsKKwkJCQlLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlTWV0YWRhdGEgPSBtZXRhZGF0YS5nZXRLZXlzcGFjZShrZXlzcGFjZSk7CisJCQkJaWYgKGtleXNwYWNlTWV0YWRhdGEgIT0gbnVsbCkgeworCQkJCQlDb2xsZWN0aW9uPFRhYmxlTWV0YWRhdGE+IHRhYmxlcyA9IGtleXNwYWNlTWV0YWRhdGEuZ2V0VGFibGVzKCk7CisJCQkJCXRhYmxlcy5mb3JFYWNoKHRhYmxlIC0+IHsKKwkJCQkJCXNlc3Npb24uZXhlY3V0ZShRdWVyeUJ1aWxkZXIudHJ1bmNhdGUodGFibGUpKTsKKwkJCQkJCWxvZ2dlci5kZWJ1ZygiVGFibGUgdHJ1bmNldGVkIC0ge30iLCB0YWJsZS5nZXROYW1lKCkpOworCQkJCQl9KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJLZXlzcGFjZSAiICsga2V5c3BhY2UgKyAiIG5vdCBjb25uZWN0ZWQiKTsKKwkJCX0KKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGNsdXN0ZXIgIT0gbnVsbCkgeworCQkJCWNsdXN0ZXIuY2xvc2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxSb3c+IGZldGNoRnJvbVRhYmxlKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlTmFtZSwKKwkJCUxpc3Q8UGFpcjxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+PiBmaWVsZHMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisJCS8vIExpc3Q8UGFpcjxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+PgorCQkvLyBNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPgorCisJCUNsdXN0ZXIgY2x1c3RlciA9IG51bGw7CisJCVNlc3Npb24gc2Vzc2lvbjsKKwkJU3RyaW5nIGNhc3NhbmRyYUhvc3QgPSBVdGlscy5nZXRDb25maWcoKS5nZXRDYXNzYW5kcmFIb3N0KCk7CisKKwkJdHJ5IHsKKwkJCWNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkZXIoKS5hZGRDb250YWN0UG9pbnQoY2Fzc2FuZHJhSG9zdCkuYnVpbGQoKTsKKwkJCXNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3Qoa2V5c3BhY2UpOworCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCQkJCVNlbGVjdCBzZWxlY3QgPSBRdWVyeUJ1aWxkZXIuc2VsZWN0KCkuYWxsKCkuZnJvbShrZXlzcGFjZSwgdGFibGVOYW1lKTsKKwkJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJCQkJLy8gU2V0PEVudHJ5PEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4+IGVudHJ5U2V0ID0KKwkJCQkJLy8gZmllbGRzLmVudHJ5U2V0KCk7CisJCQkJCS8vIGZpZWxkcy4KKwkJCQkJYm9vbGVhbiBtdWx0aXBsZSA9IChmaWVsZHMuc2l6ZSgpID4gMSkgPyB0cnVlIDogZmFsc2U7CisJCQkJCVdoZXJlIHdoZXJlID0gbnVsbDsKKwkJCQkJaW50IHNpemUgPSAwOworCisJCQkJCWZvciAoUGFpcjxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+IHBhaXIgOiBmaWVsZHMpIHsKKwkJCQkJCSsrc2l6ZTsKKwkJCQkJCWlmIChzaXplID09IDEpIHsKKwkJCQkJCQl3aGVyZSA9IHNlbGVjdC53aGVyZShRdWVyeUJ1aWxkZXIuZXEocGFpci5nZXRWYWx1ZTAoKS5nZXREaXNwbGF5TmFtZSgpLCBwYWlyLmdldFZhbHVlMSgpKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXdoZXJlLmFuZChRdWVyeUJ1aWxkZXIuZXEocGFpci5nZXRWYWx1ZTAoKS5nZXREaXNwbGF5TmFtZSgpLCBwYWlyLmdldFZhbHVlMSgpKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKG11bHRpcGxlKSB7CisJCQkJCQlzZWxlY3QuYWxsb3dGaWx0ZXJpbmcoKTsKKwkJCQkJfQorCisJCQkJfQorCisJCQkJTGlzdDxSb3c+IHJvd3MgPSBzZXNzaW9uLmV4ZWN1dGUoc2VsZWN0KS5hbGwoKTsKKwkJCQlmb3IgKFJvdyByb3cgOiByb3dzKSB7CisJCQkJCWxvZ2dlci5kZWJ1Zygie30iLCByb3cpOworCQkJCX0KKwkJCQlyZXR1cm4gcm93czsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChjbHVzdGVyICE9IG51bGwpIHsKKwkJCQljbHVzdGVyLmNsb3NlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCS8vCisJLy8gcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJLy8gTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCS8vIG1hcC5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sICJBY2Nlc3MiKTsKKwkvLyBtYXAucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCAiMjAwIik7CisJLy8gLy8gQ2Fzc2FuZHJhVXRpbHMudHJ1bmNhdGVUYWJsZSgic2RjQXJ0aWZhY3QiLCAicmVzb3VyY2VzIik7CisJLy8vLyBDYXNzYW5kcmFVdGlscy50cnVuY2F0ZUFsbFRhYmxlcygic2RjQXVkaXQiKTsKKwkvLyBDYXNzYW5kcmFVdGlscy5mZXRjaEZyb21UYWJsZSgic2RjQXVkaXQiLCAidXNlcmFjY2Vzc2V2ZW50IiwgbWFwICk7CisJLy8gfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvZ2VuZXJhbC9BdG9taWNPcGVyYXRpb25VdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL2dlbmVyYWwvQXRvbWljT3BlcmF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU2YjJjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL2dlbmVyYWwvQXRvbWljT3BlcmF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDYyNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGlzdHJpYnV0aW9uU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkltcG9ydFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlByb2R1Y3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9wZXJ0eVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUHJvcGVydHlUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlNlcnZpY2VDYXRlZ29yaWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQ29uc3VtZXJSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5MaWZlY3ljbGVSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUHJvcGVydHlSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBdG9taWNPcGVyYXRpb25VdGlscyB7CisKKwlwcml2YXRlIEF0b21pY09wZXJhdGlvblV0aWxzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKioqKioqKiBSRVNPVVJDRSAqKioqKioqKioqKioqKioqCisJLyoqCisJICogSW1wb3J0IGEgdmZjIEZyb20gdG9zY2EgZmlsZQorCSAqIAorCSAqIEBwYXJhbSBmaWxlUGF0aAorCSAqIEBwYXJhbSBmaWxlTmFtZQorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogQHRocm93cyBKU09ORXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gaW1wb3J0UmVzb3VyY2UoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgZmlsZU5hbWUpIHsKKwkJdHJ5IHsKKwkJCVVzZXIgZGVzaWduZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQkJSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKCJjaVRtcFZGQyIpOworCQkJaW1wb3J0UmVxRGV0YWlscyA9IEltcG9ydFV0aWxzLmdldEltcG9ydFJlc291cmNlRGV0YWlsc0J5UGF0aEFuZE5hbWUoaW1wb3J0UmVxRGV0YWlscywgZmlsZVBhdGgsIGZpbGVOYW1lKTsKKwkJCVJlc3RSZXNwb25zZSBpbXBvcnRSZXNvdXJjZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlSW1wb3J0UmVzb3VyY2UoaW1wb3J0UmVxRGV0YWlscywgZGVzaWduZXIsIG51bGwpOworCQkJcmV0dXJuIGJ1aWxkUmVzb3VyY2VGcm9tUmVzcG9uc2UoaW1wb3J0UmVzb3VyY2VSZXNwb25zZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQXRvbWljT3BlcmF0aW9uRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSwgQm9vbGVhbiB2YWxpZGF0ZVN0YXRlKSB7CisJCXRyeSB7CisJCQlVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCQkJUmVzb3VyY2VSZXFEZXRhaWxzIGRlZmF1bHRSZXNvdXJjZSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShyZXNvdXJjZVR5cGUsIGRlZmF1bHRVc2VyKTsKKwkJCVJlc3RSZXNwb25zZSByZXNvdXJjZVJlc3AgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShkZWZhdWx0UmVzb3VyY2UsIGRlZmF1bHRVc2VyKTsKKworCQkJaWYgKHZhbGlkYXRlU3RhdGUpIHsKKwkJCQlhc3NlcnRUcnVlKHJlc291cmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBSZXNvdXJjZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKTsKKwkJCX0KKworCQkJaWYgKHJlc291cmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBSZXNvdXJjZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQkJUmVzb3VyY2UgcmVzb3VyY2VSZXNwb25zZU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VSZXNwb25zZU9iamVjdCk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc291cmNlUmVzcCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQXRvbWljT3BlcmF0aW9uRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUsIE5vcm1hdGl2ZVR5cGVzRW51bSBub3JtYXRpdmVUeXBlcywgUmVzb3VyY2VDYXRlZ29yeUVudW0gcmVzb3VyY2VDYXRlZ29yeSwgVXNlclJvbGVFbnVtIHVzZXJSb2xlLCBCb29sZWFuIHZhbGlkYXRlU3RhdGUpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKHVzZXJSb2xlKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGRlZmF1bHRSZXNvdXJjZSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KHJlc291cmNlVHlwZSwgbm9ybWF0aXZlVHlwZXMsIHJlc291cmNlQ2F0ZWdvcnksIGRlZmF1bHRVc2VyKTsKKwkJUmVzdFJlc3BvbnNlIHJlc291cmNlUmVzcCA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKGRlZmF1bHRSZXNvdXJjZSwgZGVmYXVsdFVzZXIpOworCisJCWlmICh2YWxpZGF0ZVN0YXRlKSB7CisJCQlhc3NlcnRUcnVlKHJlc291cmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBSZXNvdXJjZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKTsKKwkJfQorCisJCWlmIChyZXNvdXJjZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gUmVzb3VyY2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2VSZXNwb25zZU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyCisJCQkvLyAuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQkJUmVzb3VyY2UgcmVzb3VyY2VSZXNwb25zZU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihyZXNvdXJjZVJlc3AuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlUmVzcG9uc2VPYmplY3QpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQocmVzb3VyY2VSZXNwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiBjcmVhdGVSZXNvdXJjZXNCeUN1c3RvbU5vcm1hdGl2ZVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUsIFJlc291cmNlIHJlc291cmNlTm9ybWF0aXZlVHlwZSwgUmVzb3VyY2VDYXRlZ29yeUVudW0gcmVzb3VyY2VDYXRlZ29yeSwgVXNlclJvbGVFbnVtIHVzZXJSb2xlLCBCb29sZWFuIHZhbGlkYXRlU3RhdGUpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKHVzZXJSb2xlKTsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGRlZmF1bHRSZXNvdXJjZSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KHJlc291cmNlVHlwZSwgcmVzb3VyY2VOb3JtYXRpdmVUeXBlLCByZXNvdXJjZUNhdGVnb3J5LCBkZWZhdWx0VXNlcik7CisJCVJlc3RSZXNwb25zZSByZXNvdXJjZVJlc3AgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShkZWZhdWx0UmVzb3VyY2UsIGRlZmF1bHRVc2VyKTsKKworCQlpZiAodmFsaWRhdGVTdGF0ZSkgeworCQkJYXNzZXJ0VHJ1ZSgiYWN0dWFsIHJlc3VsdDogIiArIHJlc291cmNlUmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzb3VyY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFJlc291cmNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpOworCQl9CisKKwkJaWYgKHJlc291cmNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBSZXNvdXJjZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQkvLyBSZXNvdXJjZSByZXNvdXJjZVJlc3BvbnNlT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCS8vIC5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BvbnNlT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHJlc291cmNlUmVzcC5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VSZXNwb25zZU9iamVjdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNvdXJjZVJlc3ApOworCX0KKworCS8vICoqKioqKioqKioqIFNFUlZJQ0UgKioqKioqKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8U2VydmljZSwgUmVzdFJlc3BvbnNlPiBjcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0gdXNlclJvbGUsIEJvb2xlYW4gdmFsaWRhdGVTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgZGVmYXVsdFVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcih1c2VyUm9sZSk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoZGVmYXVsdFVzZXIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZVJlc3AgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIGRlZmF1bHRVc2VyKTsKKworCQlpZiAodmFsaWRhdGVTdGF0ZSkgeworCQkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBTZXJ2aWNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpOworCQl9CisKKwkJaWYgKGNyZWF0ZVNlcnZpY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFJlc291cmNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpIHsKKwkJCVNlcnZpY2Ugc2VydmljZVJlc3BvbnNlT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjcmVhdGVTZXJ2aWNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlUmVzcG9uc2VPYmplY3QpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlU2VydmljZVJlc3ApOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPFNlcnZpY2UsIFJlc3RSZXNwb25zZT4gY3JlYXRlU2VydmljZUJ5Q2F0ZWdvcnkoU2VydmljZUNhdGVnb3JpZXNFbnVtIGNhdGVnb3J5LCBVc2VyUm9sZUVudW0gdXNlclJvbGUsIEJvb2xlYW4gdmFsaWRhdGVTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgZGVmYXVsdFVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcih1c2VyUm9sZSk7CisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoY2F0ZWdvcnksIGRlZmF1bHRVc2VyKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VSZXNwID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBkZWZhdWx0VXNlcik7CisKKwkJaWYgKHZhbGlkYXRlU3RhdGUpIHsKKwkJCWFzc2VydFRydWUoY3JlYXRlU2VydmljZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gU2VydmljZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKTsKKwkJfQorCisJCWlmIChjcmVhdGVTZXJ2aWNlUmVzcC5nZXRFcnJvckNvZGUoKSA9PSBSZXNvdXJjZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlTZXJ2aWNlIHNlcnZpY2VSZXNwb25zZU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlU2VydmljZVJlc3AuZ2V0UmVzcG9uc2UoKSk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoc2VydmljZVJlc3BvbnNlT2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZVNlcnZpY2VSZXNwKTsKKwl9CisKKwkvLyAqKioqKioqKioqKiBQUk9EVUNUICoqKioqKioqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPFByb2R1Y3QsIFJlc3RSZXNwb25zZT4gY3JlYXRlRGVmYXVsdFByb2R1Y3QoVXNlclJvbGVFbnVtIHVzZXJSb2xlLCBCb29sZWFuIHZhbGlkYXRlU3RhdGUpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCQlQcm9kdWN0UmVxRGV0YWlscyBkZWZhdWx0UHJvZHVjdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRQcm9kdWN0KCk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0UmVzcCA9IFByb2R1Y3RSZXN0VXRpbHMuY3JlYXRlUHJvZHVjdChkZWZhdWx0UHJvZHVjdCwgZGVmYXVsdFVzZXIpOworCisJCWlmICh2YWxpZGF0ZVN0YXRlKSB7CisJCQlhc3NlcnRUcnVlKGNyZWF0ZVByb2R1Y3RSZXNwLmdldEVycm9yQ29kZSgpID09IFByb2R1Y3RSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCk7CisJCX0KKworCQlpZiAoY3JlYXRlUHJvZHVjdFJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gUHJvZHVjdFJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlQcm9kdWN0IHByb2R1Y3RSZXNwb25zZUphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UHJvZHVjdFJlc3BvbnNlVG9KYXZhT2JqZWN0KGNyZWF0ZVByb2R1Y3RSZXNwLmdldFJlc3BvbnNlKCkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHByb2R1Y3RSZXNwb25zZUphdmFPYmplY3QpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlUHJvZHVjdFJlc3ApOworCX0KKwkKKwkvLyAqKioqKioqKioqKiBMSUZFQ1lDTEUgKioqKioqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFBhaXI8Q29tcG9uZW50LCBSZXN0UmVzcG9uc2U+IGNoYW5nZUNvbXBvbmVudFN0YXRlKENvbXBvbmVudCBjb21wb25lbnQsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSwgTGlmZUN5Y2xlU3RhdGVzRW51bSB0YXJnZXRTdGF0ZSwgQm9vbGVhbiB2YWxpZGF0ZVN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlCb29sZWFuIGlzVmFsaWRhdGlvbkZhaWxlZCA9IGZhbHNlOworCQlSZXN0UmVzcG9uc2UgbGlmZUN5Y2xlU3RhdGVzUmVzcG9uc2UgPSBudWxsOworCQlVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCisJCUxpZmVDeWNsZVN0YXRlc0VudW0gY3VyZW50Q29tcFN0YXRlID0gTGlmZUN5Y2xlU3RhdGVzRW51bS5maW5kQnlDb21wU3RhdGUoY29tcG9uZW50LmdldExpZmVjeWNsZVN0YXRlKCkudG9TdHJpbmcoKSk7CisKKwkJaWYgKGN1cmVudENvbXBTdGF0ZSA9PSB0YXJnZXRTdGF0ZSkgeworCQkJcmV0dXJuIFBhaXIub2YoY29tcG9uZW50LCBudWxsKTsKKwkJfQorCQkvLyBMaXN0PExpZmVDeWNsZVN0YXRlc0VudW0+IGxpZmVDeWNsZVN0YXRlc0VudW1PcmlnTGlzdCA9IG5ldworCQkvLyBBcnJheUxpc3Q8TGlmZUN5Y2xlU3RhdGVzRW51bT4oRW51bVNldC5hbGxPZihMaWZlQ3ljbGVTdGF0ZXNFbnVtLmNsYXNzKSk7CisKKwkJQXJyYXlMaXN0PFN0cmluZz4gbGlmZUN5Y2xlU3RhdGVzRW51bUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJaWYgKGN1cmVudENvbXBTdGF0ZS5lcXVhbHMoTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKSAmJiB0YXJnZXRTdGF0ZS5lcXVhbHMoTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCkpIHsKKwkJCWxpZmVDeWNsZVN0YXRlc0VudW1MaXN0LmFkZChMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4udG9TdHJpbmcoKSk7CisJCQlsaWZlQ3ljbGVTdGF0ZXNFbnVtTGlzdC5hZGQoTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVC50b1N0cmluZygpKTsKKwkJfSBlbHNlIHsKKwkJCWxpZmVDeWNsZVN0YXRlc0VudW1MaXN0LmFkZChMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULnRvU3RyaW5nKCkpOworCQkJbGlmZUN5Y2xlU3RhdGVzRW51bUxpc3QuYWRkKExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTi50b1N0cmluZygpKTsKKwkJCWxpZmVDeWNsZVN0YXRlc0VudW1MaXN0LmFkZChMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULnRvU3RyaW5nKCkpOworCQkJbGlmZUN5Y2xlU3RhdGVzRW51bUxpc3QuYWRkKExpZmVDeWNsZVN0YXRlc0VudW0uU1RBUlRDRVJUSUZJQ0FUSU9OLnRvU3RyaW5nKCkpOworCQkJbGlmZUN5Y2xlU3RhdGVzRW51bUxpc3QuYWRkKExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWS50b1N0cmluZygpKTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxpZmVDeWNsZVN0YXRlc0VudW1MaXN0LnNpemUoKTsgaSsrKSB7CisJCQlpZiAobGlmZUN5Y2xlU3RhdGVzRW51bUxpc3QuZ2V0KGkpLmVxdWFscyhjdXJlbnRDb21wU3RhdGUubmFtZSgpKSkgeworCQkJCWludCBhOworCQkJCWEgPSAoaSA9PSBsaWZlQ3ljbGVTdGF0ZXNFbnVtTGlzdC5zaXplKCkgLSAxKSA/IDAgOiBpICsgMTsKKworCQkJCWZvciAoaW50IG4gPSBhOyBuIDwgbGlmZUN5Y2xlU3RhdGVzRW51bUxpc3Quc2l6ZSgpOyBuKyspIHsKKwkJCQkJaWYgKGxpZmVDeWNsZVN0YXRlc0VudW1MaXN0LmdldChuKS5lcXVhbHMoTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04ubmFtZSgpKSB8fCBsaWZlQ3ljbGVTdGF0ZXNFbnVtTGlzdC5nZXQobikuZXF1YWxzKExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWS5uYW1lKCkpKSB7CisJCQkJCQlkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQkJCQl9IGVsc2UKKwkJCQkJCWRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCisJCQkJCWxpZmVDeWNsZVN0YXRlc1Jlc3BvbnNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKGNvbXBvbmVudCwgZGVmYXVsdFVzZXIsIExpZmVDeWNsZVN0YXRlc0VudW0uZmluZEJ5U3RhdGUobGlmZUN5Y2xlU3RhdGVzRW51bUxpc3QuZ2V0KG4pKSk7CisJCQkJCWlmIChsaWZlQ3ljbGVTdGF0ZXNSZXNwb25zZS5nZXRFcnJvckNvZGUoKSAhPSBMaWZlY3ljbGVSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUykKKwkJCQkJCWlzVmFsaWRhdGlvbkZhaWxlZCA9IHRydWU7CisJCQkJCWlmIChsaWZlQ3ljbGVTdGF0ZXNFbnVtTGlzdC5nZXQobikuZXF1YWxzKHRhcmdldFN0YXRlLnRvU3RyaW5nKCkpIHx8IGlzVmFsaWRhdGlvbkZhaWxlZCA9PSB0cnVlKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQl9CisJCWNvbXBvbmVudCA9IGdldENvbXBvZW5udE9iamVjdChjb21wb25lbnQsIHVzZXJSb2xlKTsKKwkJQ29tcG9uZW50IGNvbXBvbmVudEphdmFPYmplY3QgPSBjb252ZXJ0UmVwb3Nuc2VUb0NvbXBvbmVudE9iamVjdChjb21wb25lbnQsIGxpZmVDeWNsZVN0YXRlc1Jlc3BvbnNlKTsKKworCQlpZiAodmFsaWRhdGVTdGF0ZSA9PSB0cnVlICYmIGlzVmFsaWRhdGlvbkZhaWxlZCA9PSB0cnVlKSB7CisJCQlhc3NlcnRUcnVlKCJjaGFuZ2Ugc3RhdGUgZmFpbGVkIiArIGxpZmVDeWNsZVN0YXRlc1Jlc3BvbnNlLmdldFJlc3BvbnNlKCksIGZhbHNlKTsKKworCQkJcmV0dXJuIFBhaXIub2YoY29tcG9uZW50SmF2YU9iamVjdCwgbGlmZUN5Y2xlU3RhdGVzUmVzcG9uc2UpOworCQl9CisKKwkJaWYgKGlzVmFsaWRhdGlvbkZhaWxlZCA9PSB0cnVlKSB7CisJCQlyZXR1cm4gUGFpci5vZihjb21wb25lbnRKYXZhT2JqZWN0LCBsaWZlQ3ljbGVTdGF0ZXNSZXNwb25zZSk7CisJCX0KKworCQlyZXR1cm4gUGFpci5vZihjb21wb25lbnRKYXZhT2JqZWN0LCBsaWZlQ3ljbGVTdGF0ZXNSZXNwb25zZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGlzdHJpYnV0ZVNlcnZpY2UoQ29tcG9uZW50IGNvbXBvbmVudCwgQm9vbGVhbiB2YWxpZGF0ZVN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgY29tcG9uZW50OworCisJCVVzZXIgb3BzVXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5PUFMpOworCQlVc2VyIGdvdmVybm90VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5HT1ZFUk5PUik7CisKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoc2VydmljZSk7CisJCVJlc3RSZXNwb25zZSBkaXN0cmlidXRpb25TZXJ2aWNlID0gbnVsbDsKKworCQlSZXN0UmVzcG9uc2UgYXBwcm92ZURpc3RyaWJ1dGlvbiA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VEaXN0cmlidXRpb25TdGF0dXMoc2VydmljZURldGFpbHMsIG51bGwsIGdvdmVybm90VXNlciwgImFwcHJvdmVTZXJ2aWNlIiwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQpOworCQlpZiAoYXBwcm92ZURpc3RyaWJ1dGlvbi5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCWRpc3RyaWJ1dGlvblNlcnZpY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlRGlzdHJpYnV0aW9uU3RhdHVzKHNlcnZpY2VEZXRhaWxzLCBudWxsLCBvcHNVc2VyLCAiYXBwcm92ZVNlcnZpY2UiLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVEVEKTsKKwkJfQorCisJCWlmICh2YWxpZGF0ZVN0YXRlKSB7CisJCQlhc3NlcnRUcnVlKGFwcHJvdmVEaXN0cmlidXRpb24uZ2V0RXJyb3JDb2RlKCkgPT0gUHJvZHVjdFJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJCWFzc2VydFRydWUoZGlzdHJpYnV0aW9uU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSBQcm9kdWN0UmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQkJcmV0dXJuIGRpc3RyaWJ1dGlvblNlcnZpY2U7CisJCX0KKworCQlyZXR1cm4gZGlzdHJpYnV0aW9uU2VydmljZTsKKworCX0KKworCS8vICoqKioqKioqKioqIEFSVElGQUNUUyAqKioqKioqKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXN0UmVzcG9uc2U+IHVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlLCBDb21wb25lbnQgY29tcG9uZW50LCBVc2VyUm9sZUVudW0gdXNlclJvbGUsIEJvb2xlYW4gZGVwbG95bWVudFRydWUsIEJvb2xlYW4gdmFsaWRhdGVTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKHVzZXJSb2xlKTsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldEFydGlmYWN0QnlUeXBlKG51bGwsIGFydGlmYWN0VHlwZSwgZGVwbG95bWVudFRydWUpOworCQlpZiAoZGVwbG95bWVudFRydWUgPT0gZmFsc2UpCisJCQlhcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLklORk9STUFUSU9OQUwuZ2V0VHlwZSgpKTsKKwkJUmVzdFJlc3BvbnNlIHVwbG9hZEFydGlmYWN0UmVzcCA9IEFydGlmYWN0UmVzdFV0aWxzLnVwbG9hZEFydGlmYWN0KGFydGlmYWN0RGV0YWlscywgY29tcG9uZW50LCBkZWZhdWx0VXNlcik7CisKKwkJaWYgKHZhbGlkYXRlU3RhdGUpIHsKKwkJCWFzc2VydFRydWUoImFydGlmYWN0IHVwbG9hZCBmYWlsZWQ6ICIgKyBhcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCksIHVwbG9hZEFydGlmYWN0UmVzcC5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpOworCQl9CisKKwkJaWYgKHVwbG9hZEFydGlmYWN0UmVzcC5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpIHsKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0QXJ0aWZhY3REZWZpbml0aW9uUmVzcG9uc2VUb0phdmFPYmplY3QodXBsb2FkQXJ0aWZhY3RSZXNwLmdldFJlc3BvbnNlKCkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGFydGlmYWN0SmF2YU9iamVjdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodCh1cGxvYWRBcnRpZmFjdFJlc3ApOworCX0KKworCS8vICoqKioqKioqKioqIENPTlRBSU5FUlMgKioqKioqKioqKioqKioqKioKKwkvKioKKwkgKiBBZGRzIENvbXBvbmVudCBpbnN0YW5jZSB0byBDb21wb25lbnQKKwkgKiAKKwkgKiBAcGFyYW0gY29tcEluc3RQYXJlbnQKKwkgKiBAcGFyYW0gY29tcENvbnRhaW5lcgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzdFJlc3BvbnNlPiBhZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKENvbXBvbmVudCBjb21wSW5zdFBhcmVudCwgQ29tcG9uZW50IGNvbXBDb250YWluZXIpIHsKKwkJcmV0dXJuIGFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIoY29tcEluc3RQYXJlbnQsIGNvbXBDb250YWluZXIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgZmFsc2UpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXN0UmVzcG9uc2U+IGFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIoQ29tcG9uZW50IGNvbXBJbnN0UGFyZW50LCBDb21wb25lbnQgY29tcENvbnRhaW5lciwgVXNlclJvbGVFbnVtIHVzZXJSb2xlLCBCb29sZWFuIHZhbGlkYXRlU3RhdGUpIHsKKwkJdHJ5IHsKKwkJCVVzZXIgZGVmYXVsdFVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcih1c2VyUm9sZSk7CisJCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgY29tcG9uZW50SW5zdGFuY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0Q29tcG9uZW50SW5zdGFuY2UoY29tcEluc3RQYXJlbnQpOworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlID0gQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2VEZXRhaWxzLCBkZWZhdWx0VXNlciwgY29tcENvbnRhaW5lcik7CisKKwkJCWlmICh2YWxpZGF0ZVN0YXRlKSB7CisJCQkJYXNzZXJ0VHJ1ZShjcmVhdGVDb21wb25lbnRJbnN0YW5jZS5nZXRFcnJvckNvZGUoKSA9PSBTZXJ2aWNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpOworCQkJfQorCisJCQlpZiAoY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UuZ2V0RXJyb3JDb2RlKCkgPT0gUmVzb3VyY2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydENvbXBvbmVudEluc3RhbmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UuZ2V0UmVzcG9uc2UoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudEluc3RhbmNlKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEF0b21pY09wZXJhdGlvbkV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2VPYmplY3QoQ29tcG9uZW50IGNvbnRhaW5lckRldGFpbHMsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFVzZXIgZGVmYXVsdFVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcih1c2VyUm9sZSk7CisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShjb250YWluZXJEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXNvdXJjZSBjb250YWluZXIgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHVibGljIHN0YXRpYyBTZXJ2aWNlIGdldFNlcnZpY2VPYmplY3QoQ29tcG9uZW50IGNvbnRhaW5lckRldGFpbHMsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgZGVmYXVsdFVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcih1c2VyUm9sZSk7CisJCVJlc3RSZXNwb25zZSBzZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2UoY29udGFpbmVyRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBkZWZhdWx0VXNlcik7CisJCVNlcnZpY2UgY29udGFpbmVyID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChzZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHVibGljIHN0YXRpYyBQcm9kdWN0IGdldFByb2R1Y3RPYmplY3QoQ29tcG9uZW50IGNvbnRhaW5lckRldGFpbHMsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVVzZXIgZGVmYXVsdFVzZXIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcih1c2VyUm9sZSk7CisJCVJlc3RSZXNwb25zZSBwcm9kdWN0UmVzdCA9IFByb2R1Y3RSZXN0VXRpbHMuZ2V0UHJvZHVjdChjb250YWluZXJEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGRlZmF1bHRVc2VyLmdldFVzZXJJZCgpKTsKKwkJUHJvZHVjdCBjb250YWluZXIgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UHJvZHVjdFJlc3BvbnNlVG9KYXZhT2JqZWN0KHByb2R1Y3RSZXN0LmdldFJlc3BvbnNlKCkpOworCQlyZXR1cm4gY29udGFpbmVyOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50IGdldENvbXBvZW5udE9iamVjdChDb21wb25lbnQgY29udGFpbmVyRGV0YWlscywgVXNlclJvbGVFbnVtIHVzZXJSb2xlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKHVzZXJSb2xlKTsKKworCQlzd2l0Y2ggKGNvbnRhaW5lckRldGFpbHMuZ2V0Q29tcG9uZW50VHlwZSgpKSB7CisJCWNhc2UgUkVTT1VSQ0U6CisJCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UoY29udGFpbmVyRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJCWNvbnRhaW5lckRldGFpbHMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQlicmVhazsKKwkJY2FzZSBTRVJWSUNFOgorCQkJUmVzdFJlc3BvbnNlIHNlcnZpY2VSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZShjb250YWluZXJEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGRlZmF1bHRVc2VyKTsKKwkJCWNvbnRhaW5lckRldGFpbHMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFBST0RVQ1Q6CisJCQlSZXN0UmVzcG9uc2UgcHJvZHVjdFJlc3QgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3QoY29udGFpbmVyRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBkZWZhdWx0VXNlci5nZXRVc2VySWQoKSk7CisJCQljb250YWluZXJEZXRhaWxzID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFByb2R1Y3RSZXNwb25zZVRvSmF2YU9iamVjdChwcm9kdWN0UmVzdC5nZXRSZXNwb25zZSgpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIGNvbnRhaW5lckRldGFpbHM7CisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnQgY29udmVydFJlcG9zbnNlVG9Db21wb25lbnRPYmplY3QoQ29tcG9uZW50IGNvbnRhaW5lckRldGFpbHMsIFJlc3RSZXNwb25zZSByZXN0cmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24geworCisJCXN3aXRjaCAoY29udGFpbmVyRGV0YWlscy5nZXRDb21wb25lbnRUeXBlKCkpIHsKKwkJY2FzZSBSRVNPVVJDRToKKwkJCWNvbnRhaW5lckRldGFpbHMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXN0cmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQlicmVhazsKKwkJY2FzZSBTRVJWSUNFOgorCQkJY29udGFpbmVyRGV0YWlscyA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzdHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkJYnJlYWs7CisJCWNhc2UgUFJPRFVDVDoKKwkJCWNvbnRhaW5lckRldGFpbHMgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UHJvZHVjdFJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc3RyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIGNvbnRhaW5lckRldGFpbHM7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGFzc29jaWF0ZTJSZXNvdXJjZUluc3RhbmNlcyhDb21wb25lbnQgY29udGFpbmVyRGV0YWlscywgQ29tcG9uZW50SW5zdGFuY2UgZnJvbU5vZGUsIENvbXBvbmVudEluc3RhbmNlIHRvTm9kZSwgU3RyaW5nIGFzc29jVHlwZSwgVXNlclJvbGVFbnVtIHVzZXJSb2xlLCBCb29sZWFuIHZhbGlkYXRlU3RhdGUpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCQlSZXN0UmVzcG9uc2UgYXNzb2NpYXRlMlJlc291cmNlSW5zdGFuY2VzUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5hc3NvY2lhdGUyUmVzb3VyY2VJbnN0YW5jZXMoY29udGFpbmVyRGV0YWlscywgZnJvbU5vZGUsIHRvTm9kZSwgYXNzb2NUeXBlLCBkZWZhdWx0VXNlcik7CisKKwkJaWYgKHZhbGlkYXRlU3RhdGUpIHsKKwkJCWFzc2VydFRydWUoYXNzb2NpYXRlMlJlc291cmNlSW5zdGFuY2VzUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gU2VydmljZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJfQorCQkKKwkJcmV0dXJuIGFzc29jaWF0ZTJSZXNvdXJjZUluc3RhbmNlc1Jlc3BvbnNlOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxQYWlyPENvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2U+LCBSZXN0UmVzcG9uc2U+IGNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvbihDb21wb25lbnQgY29udGFpbmVyRGV0YWlscywgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2VUb1JlcGxhY2UsIENvbXBvbmVudCBuZXdJbnN0YW5jZSwgVXNlclJvbGVFbnVtIHVzZXJSb2xlLCBCb29sZWFuIHZhbGlkYXRlU3RhdGUpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVXNlciBkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKHVzZXJSb2xlKTsKKworCQlSZXN0UmVzcG9uc2UgY2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uUmVzcCA9IENvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvbihjb250YWluZXJEZXRhaWxzLCBjb21wb25lbnRJbnN0YW5jZVRvUmVwbGFjZSwgbmV3SW5zdGFuY2UsIGRlZmF1bHRVc2VyKTsKKwkJaWYgKHZhbGlkYXRlU3RhdGUpIHsKKwkJCWFzc2VydFRydWUoImNoYW5nZSBDb21wb25lbnRJbnN0YW5jZSB2ZXJzaW9uIGZhaWxlZDogIiArIGNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvblJlc3AuZ2V0UmVzcG9uc2VNZXNzYWdlKCksIGNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvblJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwkJfQorCisJCWlmIChjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb25SZXNwLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUykgeworCisJCQlDb21wb25lbnQgY29tcG9lbm50T2JqZWN0ID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuZ2V0Q29tcG9lbm50T2JqZWN0KGNvbnRhaW5lckRldGFpbHMsIHVzZXJSb2xlKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlSmF2YU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRDb21wb25lbnRJbnN0YW5jZVJlc3BvbnNlVG9KYXZhT2JqZWN0KGNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvblJlc3AuZ2V0UmVzcG9uc2UoKSk7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChQYWlyLm9mKGNvbXBvZW5udE9iamVjdCwgY29tcG9uZW50SW5zdGFuY2VKYXZhT2JqZWN0KSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvblJlc3ApOworCX0KKworCS8vICoqKioqKioqKioqIFBST1BFUlRJRVMgKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFJlc3RSZXNwb25zZT4gYWRkQ3VzdG9tUHJvcGVydHlUb1Jlc291cmNlKFByb3BlcnR5UmVxRGV0YWlscyBwcm9wRGV0YWlscywgUmVzb3VyY2UgcmVzb3VyY2VEZXRhaWxzLCBVc2VyUm9sZUVudW0gdXNlclJvbGUsIEJvb2xlYW4gdmFsaWRhdGVTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKHVzZXJSb2xlKTsKKwkJTWFwPFN0cmluZywgUHJvcGVydHlSZXFEZXRhaWxzPiBwcm9wZXJ0eVRvU2VuZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlSZXFEZXRhaWxzPigpOworCQlwcm9wZXJ0eVRvU2VuZC5wdXQocHJvcERldGFpbHMuZ2V0TmFtZSgpLCBwcm9wRGV0YWlscyk7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVJlc3RSZXNwb25zZSBhZGRQcm9wZXJ0eVJlc3BvbnNlID0gUHJvcGVydHlSZXN0VXRpbHMuY3JlYXRlUHJvcGVydHkocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIGdzb24udG9Kc29uKHByb3BlcnR5VG9TZW5kKSwgZGVmYXVsdFVzZXIpOworCisJCWlmICh2YWxpZGF0ZVN0YXRlKSB7CisJCQlhc3NlcnRUcnVlKCJhZGQgcHJvcGVydHkgdG8gcmVzb3VyY2UgZmFpbGVkOiAiICsgYWRkUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSwgYWRkUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpOworCQl9CisKKwkJaWYgKGFkZFByb3BlcnR5UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGNvbXBJbnN0UHJvcCA9IG51bGw7CisJCQlTdHJpbmcgcHJvcGVydHkgPSBSZXNwb25zZVBhcnNlci5nZXRKc29uT2JqZWN0VmFsdWVCeUtleShhZGRQcm9wZXJ0eVJlc3BvbnNlLmdldFJlc3BvbnNlKCksIHByb3BEZXRhaWxzLmdldE5hbWUoKSk7CisJCQljb21wSW5zdFByb3AgPSAoUmVzcG9uc2VQYXJzZXIuY29udmVydFByb3BlcnR5UmVzcG9uc2VUb0phdmFPYmplY3QocHJvcGVydHkpKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChjb21wSW5zdFByb3ApOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoYWRkUHJvcGVydHlSZXNwb25zZSk7CisJfQorCisJLy8gQmVubnkKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBSZXN0UmVzcG9uc2U+IHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZShQcm9wZXJ0eVJlcURldGFpbHMgcHJvcERldGFpbHMsIFJlc291cmNlIHJlc291cmNlRGV0YWlscywgU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSwgQm9vbGVhbiB2YWxpZGF0ZVN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eVJlcURldGFpbHM+IHByb3BlcnR5VG9TZW5kID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eVJlcURldGFpbHM+KCk7CisJCXByb3BlcnR5VG9TZW5kLnB1dChwcm9wRGV0YWlscy5nZXROYW1lKCksIHByb3BEZXRhaWxzKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJUmVzdFJlc3BvbnNlIGFkZFByb3BlcnR5UmVzcG9uc2UgPSBQcm9wZXJ0eVJlc3RVdGlscy51cGRhdGVQcm9wZXJ0eShyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgcHJvcGVydHlVbmlxdWVJZCwgZ3Nvbi50b0pzb24ocHJvcGVydHlUb1NlbmQpLCBkZWZhdWx0VXNlcik7CisKKwkJaWYgKHZhbGlkYXRlU3RhdGUpIHsKKwkJCWFzc2VydFRydWUoImFkZCBwcm9wZXJ0eSB0byByZXNvdXJjZSBmYWlsZWQ6ICIgKyBhZGRQcm9wZXJ0eVJlc3BvbnNlLmdldFJlc3BvbnNlTWVzc2FnZSgpLCBhZGRQcm9wZXJ0eVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCX0KKworCQlpZiAoYWRkUHJvcGVydHlSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBCYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1MpIHsKKwkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgY29tcEluc3RQcm9wID0gbnVsbDsKKwkJCVN0cmluZyBwcm9wZXJ0eSA9IFJlc3BvbnNlUGFyc2VyLmdldEpzb25PYmplY3RWYWx1ZUJ5S2V5KGFkZFByb3BlcnR5UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgcHJvcERldGFpbHMuZ2V0TmFtZSgpKTsKKwkJCWNvbXBJbnN0UHJvcCA9IChSZXNwb25zZVBhcnNlci5jb252ZXJ0UHJvcGVydHlSZXNwb25zZVRvSmF2YU9iamVjdChwcm9wZXJ0eSkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBJbnN0UHJvcCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChhZGRQcm9wZXJ0eVJlc3BvbnNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVQcm9wZXJ0eU9mUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBwcm9wZXJ0eUlkLCBVc2VyUm9sZUVudW0gdXNlclJvbGUpIHRocm93cyBFeGNlcHRpb24geworCQlVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCQlyZXR1cm4gUHJvcGVydHlSZXN0VXRpbHMuZGVsZXRlUHJvcGVydHkocmVzb3VyY2VJZCwgcHJvcGVydHlJZCwgZGVmYXVsdFVzZXIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFJlc3RSZXNwb25zZT4gYWRkRGVmYXVsdFByb3BlcnR5VG9SZXNvdXJjZShQcm9wZXJ0eVR5cGVFbnVtIHByb3BlcnR5VHlwZSwgUmVzb3VyY2UgcmVzb3VyY2VEZXRhaWxzLCBVc2VyUm9sZUVudW0gdXNlclJvbGUsIEJvb2xlYW4gdmFsaWRhdGVTdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVXNlciBkZWZhdWx0VXNlciA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKHVzZXJSb2xlKTsKKwkJUHJvcGVydHlSZXFEZXRhaWxzIHByb3BEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5VHlwZSk7CisJCU1hcDxTdHJpbmcsIFByb3BlcnR5UmVxRGV0YWlscz4gcHJvcGVydHlUb1NlbmQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5UmVxRGV0YWlscz4oKTsKKwkJcHJvcGVydHlUb1NlbmQucHV0KHByb3BEZXRhaWxzLmdldE5hbWUoKSwgcHJvcERldGFpbHMpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlSZXN0UmVzcG9uc2UgYWRkUHJvcGVydHlSZXNwb25zZSA9IFByb3BlcnR5UmVzdFV0aWxzLmNyZWF0ZVByb3BlcnR5KHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBnc29uLnRvSnNvbihwcm9wZXJ0eVRvU2VuZCksIGRlZmF1bHRVc2VyKTsKKworCQlpZiAodmFsaWRhdGVTdGF0ZSkgeworCQkJYXNzZXJ0VHJ1ZSgiYWRkIHByb3BlcnR5IHRvIHJlc291cmNlIGZhaWxlZDogIiArIGFkZFByb3BlcnR5UmVzcG9uc2UuZ2V0UmVzcG9uc2VNZXNzYWdlKCksIGFkZFByb3BlcnR5UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gQmFzZVJlc3RVdGlscy5TVEFUVVNfQ09ERV9DUkVBVEVEKTsKKwkJfQorCisJCWlmIChhZGRQcm9wZXJ0eVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjb21wSW5zdFByb3AgPSBudWxsOworCQkJU3RyaW5nIHByb3BlcnR5ID0gUmVzcG9uc2VQYXJzZXIuZ2V0SnNvbk9iamVjdFZhbHVlQnlLZXkoYWRkUHJvcGVydHlSZXNwb25zZS5nZXRSZXNwb25zZSgpLCBwcm9wRGV0YWlscy5nZXROYW1lKCkpOworCQkJY29tcEluc3RQcm9wID0gKFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRQcm9wZXJ0eVJlc3BvbnNlVG9KYXZhT2JqZWN0KHByb3BlcnR5KSk7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChjb21wSW5zdFByb3ApOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoYWRkUHJvcGVydHlSZXNwb25zZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlRGVmYXVsdENvbnN1bWVyKEJvb2xlYW4gdmFsaWRhdGVTdGF0ZSkgeworCQl0cnkgeworCQkJQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBkZWZhdWx0Q29uc3VtZXJEZWZpbml0aW9uID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENvbnN1bWVyRGV0YWlscygpOworCQkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlID0gQ29uc3VtZXJSZXN0VXRpbHMuY3JlYXRlQ29uc3VtZXIoZGVmYXVsdENvbnN1bWVyRGVmaW5pdGlvbiwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKSk7CisJCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UpOworCisJCQlpZiAodmFsaWRhdGVTdGF0ZSkgeworCQkJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gUmVzb3VyY2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCk7CisJCQl9CisJCQlyZXR1cm4gY3JlYXRlUmVzcG9uc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQXRvbWljT3BlcmF0aW9uRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJLyoqCisJICogQnVpbGRzIFJlc291cmNlIEZyb20gcmVzdCByZXNwb25zZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZVJlc3AKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3RSZXNwb25zZT4gYnVpbGRSZXNvdXJjZUZyb21SZXNwb25zZShSZXN0UmVzcG9uc2UgcmVzb3VyY2VSZXNwKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiByZXN1bHQ7CisJCWlmIChyZXNvdXJjZVJlc3AuZ2V0RXJyb3JDb2RlKCkgPT0gUmVzb3VyY2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJUmVzb3VyY2UgcmVzb3VyY2VSZXNwb25zZU9iamVjdCA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlUmVzcC5nZXRSZXNwb25zZSgpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHJlc291cmNlUmVzcG9uc2VPYmplY3QpOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc291cmNlUmVzcCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBBdG9taWNPcGVyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKwkJcHJpdmF0ZSBBdG9taWNPcGVyYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKwkJCXN1cGVyKGUpOworCQl9CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJfTsKKworCS8qKgorCSAqIEltcG9ydCByZXNvdXJjZSBmcm9tIENTQVIKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VUeXBlCisJICogQHBhcmFtIHVzZXJSb2xlCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogQHBhcmFtIGZpbGVQYXRoCisJICogQHJldHVybiBSZXNvdXJjZQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZSBpbXBvcnRSZXNvdXJjZUZyb21DU0FSKFJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlLCBVc2VyUm9sZUVudW0gdXNlclJvbGUsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nLi4uIGZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gR2V0IHRoZSBDU0FScyBwYXRoCisJCVN0cmluZyByZWFsRmlsZVBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBGaWxlLnNlcGFyYXRvciArICJzcmMiICsgRmlsZS5zZXBhcmF0b3IgKyAidGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJyZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiQ0kiICsgRmlsZS5zZXBhcmF0b3IgKyAiY3NhcnMiOworCQlpZiAoZmlsZVBhdGggIT0gbnVsbCAmJiBmaWxlUGF0aC5sZW5ndGggPiAwKSB7CisJCQlyZWFsRmlsZVBhdGggPSBmaWxlUGF0aC50b1N0cmluZygpOworCQl9CisKKwkJLy8gQ3JlYXRlIGRlZmF1bHQgaW1wb3J0IHJlc291cmNlICYgdXNlcgorCQlJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcih1c2VyUm9sZSk7CisKKwkJYnl0ZVtdIGRhdGEgPSBudWxsOworCQlQYXRoIHBhdGggPSBQYXRocy5nZXQocmVhbEZpbGVQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7CisJCWRhdGEgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCVN0cmluZyBwYXlsb2FkTmFtZSA9IGZpbGVOYW1lOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0U3RyaW5nKGRhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZERhdGEocGF5bG9hZERhdGEpOworCQlyZXNvdXJjZURldGFpbHMuc2V0Q3NhclVVSUQocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZS5uYW1lKCkpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJldHVybiBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCX07CisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzdFJlc3BvbnNlPiBpbXBvcnRSZXNvdXJjZUJ5RmlsZU5hbWUoUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSwgU3RyaW5nIGZpbGVOYW1lLCBCb29sZWFuIHZhbGlkYXRlU3RhdGUsIFN0cmluZy4uLiBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgcmVhbEZpbGVQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgRmlsZS5zZXBhcmF0b3IgKyAic3JjIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAicmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgIkNJIiArIEZpbGUuc2VwYXJhdG9yICsgImNzYXJzIjsKKwkJaWYgKGZpbGVQYXRoICE9IG51bGwgJiYgZmlsZVBhdGgubGVuZ3RoID4gMCkgeworCQkJcmVhbEZpbGVQYXRoID0gZmlsZVBhdGgudG9TdHJpbmcoKTsKKwkJfQorCisJCXRyeSB7CisJCQlVc2VyIGRlZmF1bHRVc2VyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIodXNlclJvbGUpOworCQkJUmVzb3VyY2VSZXFEZXRhaWxzIGRlZmF1bHRSZXNvdXJjZSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZShkZWZhdWx0VXNlcik7CisJCQlJbXBvcnRSZXFEZXRhaWxzIGRlZmF1bHRJbXBvcnRSZXNvdXJjZSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZShkZWZhdWx0UmVzb3VyY2UpOworCQkJSW1wb3J0VXRpbHMuZ2V0SW1wb3J0UmVzb3VyY2VEZXRhaWxzQnlQYXRoQW5kTmFtZShkZWZhdWx0SW1wb3J0UmVzb3VyY2UsIHJlYWxGaWxlUGF0aCwgZmlsZU5hbWUpOworCQkJUmVzdFJlc3BvbnNlIHJlc291cmNlUmVzcCA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKGRlZmF1bHRJbXBvcnRSZXNvdXJjZSwgZGVmYXVsdFVzZXIpOworCisJCQlpZiAodmFsaWRhdGVTdGF0ZSkgeworCQkJCWFzc2VydFRydWUocmVzb3VyY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFJlc291cmNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpOworCQkJfQorCisJCQlpZiAocmVzb3VyY2VSZXNwLmdldEVycm9yQ29kZSgpID09IFJlc291cmNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX0NSRUFURUQpIHsKKwkJCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BvbnNlT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VSZXNwLmdldFJlc3BvbnNlKCkpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZVJlc3BvbnNlT2JqZWN0KTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzb3VyY2VSZXNwKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBBdG9taWNPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9nZW5lcmFsL0NvbnZlcnRvci5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL2dlbmVyYWwvQ29udmVydG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhMTNiNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9nZW5lcmFsL0NvbnZlcnRvci5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbDsKKworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRDsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzLlNUQVRVU19DT0RFX1NVQ0NFU1M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9kdWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlc3BKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkUHJvZHVjdEF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFVzZXJDUlVEQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKKworcHVibGljIGNsYXNzIENvbnZlcnRvciB7CisJLy8gKioqKiogcmVzb3VyY2UgKioqKioKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVzcEphdmFPYmplY3QgY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24oUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywKKwkJCVN0cmluZyByZXNvdXJjZVZlcnNpb24pIHsKKwkJcmV0dXJuIGNvbnZlcnRUb1Jlc3BPYmplY3QocmVzb3VyY2VEZXRhaWxzLCByZXNvdXJjZVZlcnNpb24sIFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VySWQoKSwKKwkJCQlVc2VyUm9sZUVudW0uQURNSU4uZ2V0VXNlck5hbWUoKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVzcEphdmFPYmplY3QgY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24oUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscykgeworCQlyZXR1cm4gY29udmVydFRvUmVzcE9iamVjdChyZXNvdXJjZURldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VySWQoKSwKKwkJCQlVc2VyUm9sZUVudW0uQURNSU4uZ2V0VXNlck5hbWUoKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVzcEphdmFPYmplY3QgY29uc3RydWN0RmllbGRzRm9yUmVzcFZhbGlkYXRpb24oUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywKKwkJCVN0cmluZyByZXNvdXJjZVZlcnNpb24sIFVzZXIgdXNlcikgeworCQlyZXR1cm4gY29udmVydFRvUmVzcE9iamVjdChyZXNvdXJjZURldGFpbHMsIHJlc291cmNlVmVyc2lvbiwgdXNlci5nZXRVc2VySWQoKSwgdXNlci5nZXRGdWxsTmFtZSgpKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc291cmNlUmVzcEphdmFPYmplY3QgY29udmVydFRvUmVzcE9iamVjdChSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLAorCQkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHVzZXJOYW1lKSB7CisJCVJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCA9IG5ldyBSZXNvdXJjZVJlc3BKYXZhT2JqZWN0KCk7CisKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRVbmlxdWVJZChyZXNvdXJjZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TmFtZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRDcmVhdG9yVXNlcklkKHJlc291cmNlRGV0YWlscy5nZXRDcmVhdG9yVXNlcklkKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldENyZWF0b3JGdWxsTmFtZShyZXNvdXJjZURldGFpbHMuZ2V0Q3JlYXRvckZ1bGxOYW1lKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHVzZXJJZCk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSh1c2VyTmFtZSk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0RGVzY3JpcHRpb24ocmVzb3VyY2VEZXRhaWxzLmdldERlc2NyaXB0aW9uKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldEljb24ocmVzb3VyY2VEZXRhaWxzLmdldEljb24oKSk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0VGFncyhyZXNvdXJjZURldGFpbHMuZ2V0VGFncygpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRJc0hpZ2hlc3RWZXJzaW9uKCJ0cnVlIik7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0Q2F0ZWdvcmllcyhyZXNvdXJjZURldGFpbHMuZ2V0Q2F0ZWdvcmllcygpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgKKwkJCQlyZXNvdXJjZURldGFpbHMuZ2V0TGlmZWN5Y2xlU3RhdGUoKSAhPSBudWxsID8gcmVzb3VyY2VEZXRhaWxzLmdldExpZmVjeWNsZVN0YXRlKCkudG9TdHJpbmcoKQorCQkJCQkJOiBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC50b1N0cmluZygpKTsKKwkJLy8gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRMaWZlY3ljbGVTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldERlcml2ZWRGcm9tKHJlc291cmNlRGV0YWlscy5nZXREZXJpdmVkRnJvbSgpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRWZW5kb3JOYW1lKHJlc291cmNlRGV0YWlscy5nZXRWZW5kb3JOYW1lKCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldFZlbmRvclJlbGVhc2UocmVzb3VyY2VEZXRhaWxzLmdldFZlbmRvclJlbGVhc2UoKSk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0Q29udGFjdElkKHJlc291cmNlRGV0YWlscy5nZXRDb250YWN0SWQoKSk7CisJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0QWJzdHJhY3R0KCJmYWxzZSIpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldFZlcnNpb24ocmVzb3VyY2VWZXJzaW9uKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRDb3N0KHJlc291cmNlRGV0YWlscy5nZXRDb3N0KCkpOworCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldExpY2Vuc2VUeXBlKHJlc291cmNlRGV0YWlscy5nZXRMaWNlbnNlVHlwZSgpKTsKKwkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VEZXRhaWxzLmdldFJlc291cmNlVHlwZSgpKTsKKworCQlyZXR1cm4gcmVzb3VyY2VSZXNwSmF2YU9iamVjdDsKKworCX0KKworCS8vICoqKioqKioqKiogcHJvZHVjdCAqKioqKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBQcm9kdWN0IGNvbnN0cnVjdEZpZWxkc0ZvclJlc3BWYWxpZGF0aW9uKFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3REZXRhaWxzLCBTdHJpbmcgcHJvZHVjdFZlcnNpb24sCisJCQlVc2VyIHVzZXIpIHsKKwkJcmV0dXJuIGNvbnZlcnRUb1Jlc3BPYmplY3QocHJvZHVjdERldGFpbHMsIHByb2R1Y3RWZXJzaW9uLCB1c2VyLmdldFVzZXJJZCgpLCB1c2VyLmdldEZ1bGxOYW1lKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFByb2R1Y3QgY29udmVydFRvUmVzcE9iamVjdChQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0RGV0YWlscywgU3RyaW5nIHByb2R1Y3RWZXJzaW9uLCBTdHJpbmcgdXNlcklkLAorCQkJU3RyaW5nIHVzZXJOYW1lKSB7CisJCVByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0ID0gbmV3IFByb2R1Y3QoKTsKKworCQlleHBlY3RlZFByb2R1Y3Quc2V0VW5pcXVlSWQocHJvZHVjdERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXROYW1lKHByb2R1Y3REZXRhaWxzLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRGdWxsTmFtZShwcm9kdWN0RGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldENyZWF0b3JVc2VySWQocHJvZHVjdERldGFpbHMuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldENyZWF0b3JGdWxsTmFtZShwcm9kdWN0RGV0YWlscy5nZXRDcmVhdG9yRnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZCh1c2VySWQpOworCQlleHBlY3RlZFByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSh1c2VyTmFtZSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXREZXNjcmlwdGlvbihwcm9kdWN0RGV0YWlscy5nZXREZXNjcmlwdGlvbigpKTsKKwkJLy8gZXhwZWN0ZWRQcm9kdWN0LnNldEljb24ocmVzb3VyY2VEZXRhaWxzLmdldEljb24oKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRUYWdzKHByb2R1Y3REZXRhaWxzLmdldFRhZ3MoKSk7CisJCWV4cGVjdGVkUHJvZHVjdC5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBwcm9kdWN0RGV0YWlscy5nZXRDYXRlZ29yaWVzKCk7CisJCWlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKKwkJCWNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJfQorCQlleHBlY3RlZFByb2R1Y3Quc2V0Q2F0ZWdvcmllcyhjYXRlZ29yaWVzKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJZXhwZWN0ZWRQcm9kdWN0LnNldFZlcnNpb24ocHJvZHVjdFZlcnNpb24pOworCQlleHBlY3RlZFByb2R1Y3Quc2V0Q29udGFjdHMocHJvZHVjdERldGFpbHMuZ2V0Q29udGFjdHMoKSk7CisJCXJldHVybiBleHBlY3RlZFByb2R1Y3Q7CisJfQorCisJLy8gKioqKiogYXVkaXQgKioqKioKKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywKKwkJCVN0cmluZyByZXNvdXJjZVZlcnNpb24pIHsKKwkJcmV0dXJuIGNvbnZlcnRUb0F1ZGl0T2JqZWN0KHJlc291cmNlRGV0YWlscywgcmVzb3VyY2VWZXJzaW9uLCBVc2VyUm9sZUVudW0uQURNSU4uZ2V0VXNlcklkKCksCisJCQkJVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJOYW1lKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzKSB7CisJCXJldHVybiBjb252ZXJ0VG9BdWRpdE9iamVjdChyZXNvdXJjZURldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIFVzZXJSb2xlRW51bS5BRE1JTi5nZXRVc2VySWQoKSwKKwkJCQlVc2VyUm9sZUVudW0uQURNSU4uZ2V0VXNlck5hbWUoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLAorCQkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgVXNlciB1c2VyKSB7CisJCXJldHVybiBjb252ZXJ0VG9BdWRpdE9iamVjdChyZXNvdXJjZURldGFpbHMsIHJlc291cmNlVmVyc2lvbiwgdXNlci5nZXRVc2VySWQoKSwgdXNlci5nZXRGdWxsTmFtZSgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGNvbnZlcnRUb0F1ZGl0T2JqZWN0KFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMsCisJCQlTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgdXNlck5hbWUpIHsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbigiQ2hlY2tvdXQiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUodXNlck5hbWUpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHVzZXJJZCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAuMCIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiUmVzb3VyY2UiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbihTdHJpbmcudmFsdWVPZihGbG9hdC5wYXJzZUZsb2F0KHJlc291cmNlVmVyc2lvbikgLSAwLjFmKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24ocmVzb3VyY2VWZXJzaW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDb21tZW50KG51bGwpOworCisJCXJldHVybiBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRQcm9kdWN0QXVkaXQgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKFByb2R1Y3QgcHJvZHVjdERldGFpbHMsIFN0cmluZyBhY3Rpb24sCisJCQlVc2VyIHVzZXIsIEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIFN0cmluZyBwcmV2VmVyc2lvbiwgU3RyaW5nIGN1cnJWZXJzaW9uLCBMaWZlY3ljbGVTdGF0ZUVudW0gcHJldlN0YXRlLAorCQkJTGlmZWN5Y2xlU3RhdGVFbnVtIGN1cnJTdGF0ZSwgU3RyaW5nIHV1aWQsIFN0cmluZy4uLiBlcnJvck1lc3NhZ2VQYXJhbXMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCXJldHVybiBjb252ZXJ0VG9BdWRpdE9iamVjdChwcm9kdWN0RGV0YWlscywgYWN0aW9uLCB1c2VyLCBlcnJvckluZm8sIHByZXZWZXJzaW9uLCBjdXJyVmVyc2lvbiwgcHJldlN0YXRlLAorCQkJCWN1cnJTdGF0ZSwgdXVpZCwgZXJyb3JNZXNzYWdlUGFyYW1zKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBFeHBlY3RlZFByb2R1Y3RBdWRpdCBjb252ZXJ0VG9BdWRpdE9iamVjdChQcm9kdWN0IHByb2R1Y3REZXRhaWxzLCBTdHJpbmcgYWN0aW9uLCBVc2VyIHVzZXIsCisJCQlFcnJvckluZm8gZXJyb3JJbmZvLCBTdHJpbmcgcHJldlZlcnNpb24sIFN0cmluZyBjdXJyVmVyc2lvbiwgTGlmZWN5Y2xlU3RhdGVFbnVtIHByZXZTdGF0ZSwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSBjdXJyU3RhdGUsIFN0cmluZyB1dWlkLCBTdHJpbmcuLi4gZXJyb3JNZXNzYWdlUGFyYW1zKSB7CisJCUV4cGVjdGVkUHJvZHVjdEF1ZGl0IGV4cGVjdGVkUHJvZHVjdEF1ZGl0ID0gbmV3IEV4cGVjdGVkUHJvZHVjdEF1ZGl0KCk7CisKKwkJZXhwZWN0ZWRQcm9kdWN0QXVkaXQuc2V0QUNUSU9OKGFjdGlvbik7CisJCVN0cmluZyB1c2VySWQgPSB1c2VyLmdldFVzZXJJZCgpOworCQlTdHJpbmcgdXNlckZ1bGxOYW1lOworCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh1c2VyLmdldEZpcnN0TmFtZSgpKSAmJiBTdHJpbmdVdGlscy5pc0VtcHR5KHVzZXIuZ2V0TGFzdE5hbWUoKSkpIHsKKwkJCXVzZXJGdWxsTmFtZSA9ICIiOworCQl9IGVsc2UgeworCQkJdXNlckZ1bGxOYW1lID0gdXNlci5nZXRGdWxsTmFtZSgpOworCQl9CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5KHVzZXJJZCkpIHsKKwkJCXVzZXJJZCA9ICJVTktOT1dOIjsKKwkJfQorCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRNT0RJRklFUigKKwkJCQkhU3RyaW5nVXRpbHMuaXNFbXB0eSh1c2VyRnVsbE5hbWUpID8gdXNlckZ1bGxOYW1lICsgIigiICsgdXNlcklkICsgIikiIDogIigiICsgdXNlcklkICsgIikiKTsKKwkJZXhwZWN0ZWRQcm9kdWN0QXVkaXQuc2V0U1RBVFVTKEludGVnZXIudG9TdHJpbmcoZXJyb3JJbmZvLmdldENvZGUoKSkpOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRERVNDKGVycm9ySW5mby5nZXRBdWRpdERlc2MoKE9iamVjdFtdKSAoZXJyb3JNZXNzYWdlUGFyYW1zKSkpOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdAorCQkJCS5zZXRSRVNPVVJDRV9OQU1FKHByb2R1Y3REZXRhaWxzICE9IG51bGwgPyBwcm9kdWN0RGV0YWlscy5nZXROYW1lKCkgOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJZXhwZWN0ZWRQcm9kdWN0QXVkaXQuc2V0UkVTT1VSQ0VfVFlQRSgiUHJvZHVjdCIpOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRQUkVWX1ZFUlNJT04ocHJldlZlcnNpb24pOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRDVVJSX1ZFUlNJT04oY3VyclZlcnNpb24pOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRQUkVWX1NUQVRFKHByZXZTdGF0ZSAhPSBudWxsID8gcHJldlN0YXRlLm5hbWUoKSA6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRDVVJSX1NUQVRFKGN1cnJTdGF0ZSAhPSBudWxsID8gY3VyclN0YXRlLm5hbWUoKSA6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQlleHBlY3RlZFByb2R1Y3RBdWRpdC5zZXRTRVJWSUNFX0lOU1RBTkNFX0lEKHV1aWQpOworCQlyZXR1cm4gZXhwZWN0ZWRQcm9kdWN0QXVkaXQ7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb25TdWNjZXNzKGFkZFVzZXIsCisJLy8vLy8vLy8vLy8vLy8vLyBzZG5jQWRtaW5Vc2VyLCBtZWNoSWRVc2VyLCBudWxsLCBTVEFUVVNfQ09ERV9DUkVBVEVEKTsKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkVXNlckNSVURBdWRpdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oU3RyaW5nIGFjdGlvbiwgVXNlciB1c2VyTW9kaWZpZXIsCisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBVc2VyIHVzZXJBZnRlciwgVXNlciB1c2VyQmVmb3JlLCBPYmplY3QuLi4gdmFyaWFibGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQlFeHBlY3RlZFVzZXJDUlVEQXVkaXQgZXhwZWN0ZWRBZGRVc2VyQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkVXNlckNSVURBdWRpdCgpOworCQlleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGFjdGlvbik7CisJCWV4cGVjdGVkQWRkVXNlckF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcigKKwkJCQl1c2VyTW9kaWZpZXIuZ2V0Rmlyc3ROYW1lKCkgIT0gbnVsbCA/IHVzZXJNb2RpZmllci5nZXRGdWxsTmFtZSgpICsgIigiICsgdXNlck1vZGlmaWVyLmdldFVzZXJJZCgpICsgIikiCisJCQkJCQk6ICIoIiArIHVzZXJNb2RpZmllci5nZXRVc2VySWQoKSArICIpIik7CisJCVN0cmluZyBzdGF0dXMgPSBJbnRlZ2VyLnRvU3RyaW5nKGVycm9ySW5mby5nZXRDb2RlKCkpOworCQlleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKHN0YXR1cyk7CisJCWlmIChlcnJvckluZm8uZ2V0Q29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1MgfHwgZXJyb3JJbmZvLmdldENvZGUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkQWRkVXNlckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2ModmFyaWFibGVzKSk7CisJCX0KKwkJZXhwZWN0ZWRBZGRVc2VyQXVkaXRKYXZhT2JqZWN0LnNldFVzZXJCZWZvcmUodXNlckJlZm9yZSAhPSBudWxsCisJCQkJPyB1c2VyQmVmb3JlLmdldFVzZXJJZCgpICsgIiwgIiArIHVzZXJCZWZvcmUuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyQmVmb3JlLmdldExhc3ROYW1lKCkgKyAiLCAiCisJCQkJCQkrIHVzZXJCZWZvcmUuZ2V0RW1haWwoKSArICIsICIgKyB1c2VyQmVmb3JlLmdldFJvbGUoKQorCQkJCTogQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWV4cGVjdGVkQWRkVXNlckF1ZGl0SmF2YU9iamVjdC5zZXRVc2VyQWZ0ZXIodXNlckFmdGVyICE9IG51bGwKKwkJCQk/IHVzZXJBZnRlci5nZXRVc2VySWQoKSArICIsICIgKyB1c2VyQWZ0ZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyQWZ0ZXIuZ2V0TGFzdE5hbWUoKSArICIsICIKKwkJCQkJCSsgdXNlckFmdGVyLmdldEVtYWlsKCkgKyAiLCAiICsgdXNlckFmdGVyLmdldFJvbGUoKQorCQkJCTogQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCXJldHVybiBleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3Q7CisJfQorCisJLy8gRm9yIFJFU09VUkNFIGFuZCBTRVJWSUNFIHNhbWUgQXVkaXQKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKAorCQkJQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnREZXRhaWxzLCBTdHJpbmcgYWN0aW9uLCBVc2VyIHVzZXJNb2RpZmllciwgQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywKKwkJCVN0cmluZyBjdXJyVmVyc2lvbiwgU3RyaW5nIHByZXZWZXJzaW9uLCBTdHJpbmcgY3VyU3RhdGUsIFN0cmluZyBwcmV2U3RhdGUsIFN0cmluZyB1dWlkLCBTdHJpbmcgY29tbWVudCwKKwkJCU9iamVjdC4uLiB2YXJpYWJsZXMpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TU9ESUZJRVIoCisJCQkJdXNlck1vZGlmaWVyLmdldEZpcnN0TmFtZSgpICE9IG51bGwgPyB1c2VyTW9kaWZpZXIuZ2V0RnVsbE5hbWUoKSArICIoIiArIHVzZXJNb2RpZmllci5nZXRVc2VySWQoKSArICIpIgorCQkJCQkJOiAiKCIgKyB1c2VyTW9kaWZpZXIuZ2V0VXNlcklkKCkgKyAiKSIpOworCQlTdHJpbmcgc3RhdHVzID0gSW50ZWdlci50b1N0cmluZyhlcnJvckluZm8uZ2V0Q29kZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoc3RhdHVzKTsKKwkJaWYgKGVycm9ySW5mby5nZXRDb2RlKCkgPT0gU1RBVFVTX0NPREVfU1VDQ0VTUyB8fCBlcnJvckluZm8uZ2V0Q29kZSgpID09IFNUQVRVU19DT0RFX0NSRUFURUQpIHsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKHZhcmlhYmxlcykpOworCQl9CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKGN1clN0YXRlKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUocHJldlN0YXRlKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbihjdXJyVmVyc2lvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24ocHJldlZlcnNpb24pOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldENvbW1lbnQoY29tbWVudCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U0VSVklDRV9JTlNUQU5DRV9JRCh1dWlkKTsKKwkJaWYgKGNvbXBvbmVudERldGFpbHMgaW5zdGFuY2VvZiBTZXJ2aWNlUmVxRGV0YWlscykgeworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoKChTZXJ2aWNlUmVxRGV0YWlscykgY29tcG9uZW50RGV0YWlscykuZ2V0TmFtZSgpKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJTZXJ2aWNlIik7CisJCX0KKwkJaWYgKGNvbXBvbmVudERldGFpbHMgaW5zdGFuY2VvZiBSZXNvdXJjZVJlcURldGFpbHMpIHsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKCgoUmVzb3VyY2VSZXFEZXRhaWxzKSBjb21wb25lbnREZXRhaWxzKS5nZXROYW1lKCkpOworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlJlc291cmNlIik7CisJCX0KKwkJcmV0dXJuIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CisJfQorCisJLy8gRGlzdHJpYnV0aW9uIFNlcnZpY2UgQXVkaXQKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgY29uc3RydWN0RmllbGRzRm9yRGlzdHJpYnV0aW9uQXVkaXRWYWxpZGF0aW9uKAorCQkJQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnREZXRhaWxzLCBTdHJpbmcgYWN0aW9uLCBVc2VyIHVzZXJNb2RpZmllciwgQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywKKwkJCVN0cmluZyBjdXJyVmVyc2lvbiwgU3RyaW5nIGRpc3RDdXJyU3RhdHVzLCBTdHJpbmcgZGlzdFByb3ZTdGF0dXMsIFN0cmluZyBjdXJTdGF0ZSwgU3RyaW5nIHV1aWQsCisJCQlTdHJpbmcgY29tbWVudCwgT2JqZWN0Li4uIHZhcmlhYmxlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChhY3Rpb25TdGF0dXMubmFtZSgpKTsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYWN0aW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNT0RJRklFUigKKwkJCQl1c2VyTW9kaWZpZXIuZ2V0Rmlyc3ROYW1lKCkgIT0gbnVsbCA/IHVzZXJNb2RpZmllci5nZXRGdWxsTmFtZSgpICsgIigiICsgdXNlck1vZGlmaWVyLmdldFVzZXJJZCgpICsgIikiCisJCQkJCQk6ICIoIiArIHVzZXJNb2RpZmllci5nZXRVc2VySWQoKSArICIpIik7CisJCVN0cmluZyBzdGF0dXMgPSBJbnRlZ2VyLnRvU3RyaW5nKGVycm9ySW5mby5nZXRDb2RlKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhzdGF0dXMpOworCQlpZiAoZXJyb3JJbmZvLmdldENvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTIHx8IGVycm9ySW5mby5nZXRDb2RlKCkgPT0gU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQl9IGVsc2UgeworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2ModmFyaWFibGVzKSk7CisJCX0KKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoY3VyU3RhdGUpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKGN1cnJWZXJzaW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREY3VyclN0YXR1cyhkaXN0Q3VyclN0YXR1cyk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RHByZXZTdGF0dXMoZGlzdFByb3ZTdGF0dXMpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldENvbW1lbnQoY29tbWVudCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U0VSVklDRV9JTlNUQU5DRV9JRCh1dWlkKTsKKwkJaWYgKGNvbXBvbmVudERldGFpbHMgaW5zdGFuY2VvZiBTZXJ2aWNlUmVxRGV0YWlscykgeworCQkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoKChTZXJ2aWNlUmVxRGV0YWlscykgY29tcG9uZW50RGV0YWlscykuZ2V0TmFtZSgpKTsKKwkJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJTZXJ2aWNlIik7CisJCX0KKwkJcmV0dXJuIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvZ2VuZXJhbC9FbGVtZW50RmFjdG9yeS5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL2dlbmVyYWwvRWxlbWVudEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTJlYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL2dlbmVyYWwvRWxlbWVudEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDg3MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQXNzZXRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZWxhdGlvbnNoaXBJbXBsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5Lkdyb3VwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuSW1wb3J0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvZHVjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlByb3BlcnR5UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlByb3BlcnR5VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5TZXJ2aWNlQ2F0ZWdvcmllc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkF1ZGl0VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uRXJyb3JWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworCitwdWJsaWMgY2xhc3MgRWxlbWVudEZhY3RvcnkgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQVJUSUZBQ1RfTEFCRUwgPSAiYXJ0aWZhY3QxIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSU5TVEFOQ0VfUE9TX1ggPSAiMjAiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JTlNUQU5DRV9QT1NfWSA9ICIyMCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0lOU1RBTkNFX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKworCS8vICoqKiBSRVNPVVJDRSAqKioKKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGdldERlZmF1bHRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIGdldERlZmF1bHRSZXNvdXJjZSgiY2lSZXMiLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgImpoMDAwMyIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGdldERlZmF1bHRSZXNvdXJjZShSZXNvdXJjZUNhdGVnb3J5RW51bSBjYXRlZ29yeSkgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFJlc291cmNlKCJjaVJlcyIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBjYXRlZ29yeSwgImpoMDAwMyIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGdldERlZmF1bHRSZXNvdXJjZShTdHJpbmcgY29udGFjdElkKSB7CisJCXJldHVybiBnZXREZWZhdWx0UmVzb3VyY2UoImNpUmVzIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsIGNvbnRhY3RJZCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgZ2V0RGVmYXVsdFJlc291cmNlKFVzZXIgbW9kaWZpZXIpIHsKKwkJcmV0dXJuIGdldERlZmF1bHRSZXNvdXJjZSgiY2lSZXMiLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGdldERlZmF1bHRSZXNvdXJjZShOb3JtYXRpdmVUeXBlc0VudW0gZGVyaXZlZEZyb20sIFJlc291cmNlQ2F0ZWdvcnlFbnVtIGNhdGVnb3J5KSB7CisJCXJldHVybiBnZXREZWZhdWx0UmVzb3VyY2UoImNpUmVzIiwgZGVyaXZlZEZyb20sIGNhdGVnb3J5LCAiamgwMDAzIik7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgZ2V0RGVmYXVsdFJlc291cmNlKE5vcm1hdGl2ZVR5cGVzRW51bSBkZXJpdmVkRnJvbSkgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFJlc291cmNlKCJjaVJlcyIsIGRlcml2ZWRGcm9tLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCAiamgwMDAzIik7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgZ2V0RGVmYXVsdFJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUsIE5vcm1hdGl2ZVR5cGVzRW51bSBkZXJpdmVkRnJvbSkgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFJlc291cmNlKHJlc291cmNlTmFtZSwgZGVyaXZlZEZyb20sIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsICJqaDAwMDMiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVxRGV0YWlscyBnZXREZWZhdWx0UmVzb3VyY2UoTm9ybWF0aXZlVHlwZXNFbnVtIGRlcml2ZWRGcm9tLCBTdHJpbmcgY29udGFjdElkKSB7CisJCXJldHVybiBnZXREZWZhdWx0UmVzb3VyY2UoImNpUmVzIiwgZGVyaXZlZEZyb20sIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfSU5GUkFTVFJVQ1RVUkUsIGNvbnRhY3RJZCk7CisJfQorCisJLy8gTmV3CisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0gUmVzb3VyY2VUeXBlLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXJldHVybiBnZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUocmVzb3VyY2VOYW1lLCBOb3JtYXRpdmVUeXBlc0VudW0uUk9PVCwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19JTkZSQVNUUlVDVFVSRSwgImpoMDAwMyIsIFJlc291cmNlVHlwZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVxRGV0YWlscyBnZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bSBSZXNvdXJjZVR5cGUsIFVzZXIgdXNlcikgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKCJjaVJlcyIsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFLCB1c2VyLmdldFVzZXJJZCgpLCBSZXNvdXJjZVR5cGUudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUsIE5vcm1hdGl2ZVR5cGVzRW51bSBub3JtYXRpdmVUeXBlcywgUmVzb3VyY2VDYXRlZ29yeUVudW0gcmVzb3VyY2VDYXRlZ29yeSwgVXNlciB1c2VyKSB7CisJCXJldHVybiBnZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoImNpUmVzIiwgbm9ybWF0aXZlVHlwZXMsIHJlc291cmNlQ2F0ZWdvcnksIHVzZXIuZ2V0VXNlcklkKCksIHJlc291cmNlVHlwZS50b1N0cmluZygpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3BlcnR5UmVxRGV0YWlscyBnZXREZWZhdWx0TWFwUHJvcGVydHkoUHJvcGVydHlUeXBlRW51bSBpbm5lclR5cGUpIHsKKwkJcmV0dXJuIGdldFByb3BlcnR5RGV0YWlscyhpbm5lclR5cGUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlSZXFEZXRhaWxzIGdldERlZmF1bHRNYXBQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIGdldFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eVR5cGVFbnVtLlNUUklOR19NQVApOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGdldERlZmF1bHRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBOb3JtYXRpdmVUeXBlc0VudW0gZGVyaXZlZCwgUmVzb3VyY2VDYXRlZ29yeUVudW0gY2F0ZWdvcnksIFN0cmluZyBjb250YWN0SWQpIHsKKwkJcmVzb3VyY2VOYW1lID0gKHJlc291cmNlTmFtZSArIGdlbmVyYXRlVVVJRGZvclN1Zml4KCkpOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiI7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlc291cmNlVGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlyZXNvdXJjZVRhZ3MuYWRkKHJlc291cmNlTmFtZSk7CisKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZGVyaXZlZEZyb20uYWRkKGRlcml2ZWQubm9ybWF0aXZlTmFtZSk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gIkFUVCAoVG9zY2EpIjsKKwkJU3RyaW5nIHZlbmRvclJlbGVhc2UgPSAiMS4wLjAud2QwMyI7CisJCVN0cmluZyBpY29uID0gImRlZmF1bHRpY29uIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMocmVzb3VyY2VOYW1lLCBkZXNjcmlwdGlvbiwgcmVzb3VyY2VUYWdzLCBudWxsLCBkZXJpdmVkRnJvbSwgdmVuZG9yTmFtZSwgdmVuZG9yUmVsZWFzZSwgY29udGFjdElkLCBpY29uKTsKKwkJcmVzb3VyY2VEZXRhaWxzLmFkZENhdGVnb3J5Q2hhaW4oY2F0ZWdvcnkuZ2V0Q2F0ZWdvcnkoKSwgY2F0ZWdvcnkuZ2V0U3ViQ2F0ZWdvcnkoKSk7CisKKwkJcmV0dXJuIHJlc291cmNlRGV0YWlsczsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlLCBSZXNvdXJjZSBub3JtYXRpdmVUeXBlcywgUmVzb3VyY2VDYXRlZ29yeUVudW0gcmVzb3VyY2VDYXRlZ29yeSwgVXNlciB1c2VyKSB7CisJCXJldHVybiBnZXREZWZhdWx0UmVzb3VyY2UoImNpUmVzIiArIHJlc291cmNlVHlwZSwgbm9ybWF0aXZlVHlwZXMsIHJlc291cmNlQ2F0ZWdvcnksIHVzZXIuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGdldERlZmF1bHRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBSZXNvdXJjZSBkZXJpdmVkLCBSZXNvdXJjZUNhdGVnb3J5RW51bSBjYXRlZ29yeSwgU3RyaW5nIGNvbnRhY3RJZCkgeworCQlyZXNvdXJjZU5hbWUgPSAocmVzb3VyY2VOYW1lICsgZ2VuZXJhdGVVVUlEZm9yU3VmaXgoKSk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoZGVyaXZlZC5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiQVRUIChUb3NjYSkiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjAuMC53ZDAzIjsKKwkJU3RyaW5nIGljb24gPSAiZGVmYXVsdGljb24iOworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gbmV3IFJlc291cmNlUmVxRGV0YWlscyhyZXNvdXJjZU5hbWUsIGRlc2NyaXB0aW9uLCByZXNvdXJjZVRhZ3MsIG51bGwsIGRlcml2ZWRGcm9tLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlLCBjb250YWN0SWQsIGljb24pOworCQlyZXNvdXJjZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihjYXRlZ29yeS5nZXRDYXRlZ29yeSgpLCBjYXRlZ29yeS5nZXRTdWJDYXRlZ29yeSgpKTsKKworCQlyZXR1cm4gcmVzb3VyY2VEZXRhaWxzOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKFN0cmluZyByZXNvdXJjZU5hbWUsIE5vcm1hdGl2ZVR5cGVzRW51bSBkZXJpdmVkLCBSZXNvdXJjZUNhdGVnb3J5RW51bSBjYXRlZ29yeSwgU3RyaW5nIGNvbnRhY3RJZCwgUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUpIHsKKwkJcmV0dXJuIGdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShyZXNvdXJjZU5hbWUsIGRlcml2ZWQsIGNhdGVnb3J5LCBjb250YWN0SWQsIHJlc291cmNlVHlwZS50b1N0cmluZygpKTsKKwl9CisKKwkvLyBOZXcKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVxRGV0YWlscyBnZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoU3RyaW5nIHJlc291cmNlTmFtZSwgTm9ybWF0aXZlVHlwZXNFbnVtIGRlcml2ZWQsIFJlc291cmNlQ2F0ZWdvcnlFbnVtIGNhdGVnb3J5LCBTdHJpbmcgY29udGFjdElkLCBTdHJpbmcgcmVzb3VyY2VUeXBlKSB7CisJCXJlc291cmNlTmFtZSA9IChyZXNvdXJjZU5hbWUgKyByZXNvdXJjZVR5cGUgKyBnZW5lcmF0ZVVVSURmb3JTdWZpeCgpKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvdXJjZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmVzb3VyY2VUYWdzLmFkZChyZXNvdXJjZU5hbWUpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG51bGw7CisJCWlmIChkZXJpdmVkICE9IG51bGwpIHsKKwkJCWRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlkZXJpdmVkRnJvbS5hZGQoZGVyaXZlZC5ub3JtYXRpdmVOYW1lKTsKKwkJfQorCQlTdHJpbmcgdmVuZG9yTmFtZSA9ICJBVFQgKFRvc2NhKSI7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gIjEuMC4wLndkMDMiOworCQlTdHJpbmcgaWNvbiA9ICJkZWZhdWx0aWNvbiI7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgbnVsbCwgZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbiwgcmVzb3VyY2VUeXBlLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZURldGFpbHMuYWRkQ2F0ZWdvcnlDaGFpbihjYXRlZ29yeS5nZXRDYXRlZ29yeSgpLCBjYXRlZ29yeS5nZXRTdWJDYXRlZ29yeSgpKTsKKwkJcmV0dXJuIHJlc291cmNlRGV0YWlsczsKKwl9CisKKwkvLyBOZXcKKwlwdWJsaWMgc3RhdGljIEltcG9ydFJlcURldGFpbHMgZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlQnlUeXBlKFN0cmluZyByZXNvdXJjZU5hbWUsIE5vcm1hdGl2ZVR5cGVzRW51bSBkZXJpdmVkLCBSZXNvdXJjZUNhdGVnb3J5RW51bSBjYXRlZ29yeSwgU3RyaW5nIGNvbnRhY3RJZCwgU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQlyZXNvdXJjZU5hbWUgPSAocmVzb3VyY2VOYW1lICsgcmVzb3VyY2VUeXBlICsgZ2VuZXJhdGVVVUlEZm9yU3VmaXgoKSk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIjsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcmVzb3VyY2VUYWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlc291cmNlVGFncy5hZGQocmVzb3VyY2VOYW1lKTsKKwkJQXJyYXlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb20gPSBudWxsOworCQlpZiAoZGVyaXZlZCAhPSBudWxsKSB7CisJCQlkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZGVyaXZlZEZyb20uYWRkKGRlcml2ZWQubm9ybWF0aXZlTmFtZSk7CisJCX0KKwkJU3RyaW5nIHZlbmRvck5hbWUgPSAiQVRUIChUb3NjYSkiOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9ICIxLjAuMC53ZDAzIjsKKwkJU3RyaW5nIGljb24gPSAiZGVmYXVsdGljb24iOworCQlJbXBvcnRSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IG5ldyBJbXBvcnRSZXFEZXRhaWxzKHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24sIHJlc291cmNlVGFncywgZGVyaXZlZEZyb20sIHZlbmRvck5hbWUsIHZlbmRvclJlbGVhc2UsIGNvbnRhY3RJZCwgaWNvbik7CisJCXJlc291cmNlRGV0YWlscy5hZGRDYXRlZ29yeUNoYWluKGNhdGVnb3J5LmdldENhdGVnb3J5KCksIGNhdGVnb3J5LmdldFN1YkNhdGVnb3J5KCkpOworCQlyZXR1cm4gcmVzb3VyY2VEZXRhaWxzOworCX0KKwkvLy8vCisKKwlwdWJsaWMgc3RhdGljIEltcG9ydFJlcURldGFpbHMgZ2V0RGVmYXVsdEltcG9ydFJlc291cmNlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZVJlcURldGFpbHMpIHsKKwkJSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzID0gbmV3IEltcG9ydFJlcURldGFpbHMocmVzb3VyY2VSZXFEZXRhaWxzLmdldE5hbWUoKSwgcmVzb3VyY2VSZXFEZXRhaWxzLmdldERlc2NyaXB0aW9uKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXRUYWdzKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXREZXJpdmVkRnJvbSgpLCByZXNvdXJjZVJlcURldGFpbHMuZ2V0VmVuZG9yTmFtZSgpLAorCQkJCXJlc291cmNlUmVxRGV0YWlscy5nZXRWZW5kb3JSZWxlYXNlKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXRDb250YWN0SWQoKSwgcmVzb3VyY2VSZXFEZXRhaWxzLmdldEljb24oKSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0UGF5bG9hZE5hbWUoIm15Q29tcHV0ZS55YW1sIik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0Q2F0ZWdvcmllcyhyZXNvdXJjZVJlcURldGFpbHMuZ2V0Q2F0ZWdvcmllcygpKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRQYXlsb2FkRGF0YSgKKwkJCQkiZEc5elkyRmZaR1ZtYVc1cGRHbHZibk5mZG1WeWMybHZiam9nZEc5elkyRmZjMmx0Y0d4bFgzbGhiV3hmTVY4d1h6QU5DbTV2WkdWZmRIbHdaWE02SUEwS0lDQnZjbWN1YjNCbGJtVmpiMjF3TG5KbGMyOTFjbU5sTGsxNVEyOXRjSFYwWlRvTkNpQWdJQ0JrWlhKcGRtVmtYMlp5YjIwNklIUnZjMk5oTG01dlpHVnpMbEp2YjNRTkNpQWdJQ0JoZEhSeWFXSjFkR1Z6T2cwS0lDQWdJQ0FnY0hKcGRtRjBaVjloWkdSeVpYTnpPZzBLSUNBZ0lDQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0FnSUhCMVlteHBZMTloWkdSeVpYTnpPZzBLSUNBZ0lDQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0FnSUc1bGRIZHZjbXR6T2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUJ0WVhBTkNpQWdJQ0FnSUNBZ1pXNTBjbmxmYzJOb1pXMWhPZzBLSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJSFJ2YzJOaExtUmhkR0YwZVhCbGN5NXVaWFIzYjNKckxrNWxkSGR2Y210SmJtWnZEUW9nSUNBZ0lDQndiM0owY3pvTkNpQWdJQ0FnSUNBZ2RIbHdaVG9nYldGd0RRb2dJQ0FnSUNBZ0lHVnVkSEo1WDNOamFHVnRZVG9OQ2lBZ0lDQWdJQ0FnSUNCMGVYQmxPaUIwYjNOallTNWtZWFJoZEhsd1pYTXVibVYwZDI5eWF5NVFiM0owU1c1bWJ3MEtJQ0FnSUhKbGNYVnBjbVZ0Wlc1MGN6b05DaUFnSUNBZ0lDMGdiRzlqWVd4ZmMzUnZjbUZuWlRvZ0RRb2dJQ0FnSUNBZ0lDQWdZMkZ3WVdKcGJHbDBlVG9nZEc5elkyRXVZMkZ3WVdKcGJHbDBhV1Z6TGtGMGRHRmphRzFsYm5RTkNpQWdJQ0FnSUNBZ0lDQnViMlJsT2lCMGIzTmpZUzV1YjJSbGN5NUNiRzlqYTFOMGIzSmhaMlVOQ2lBZ0lDQWdJQ0FnSUNCeVpXeGhkR2x2Ym5Ob2FYQTZJSFJ2YzJOaExuSmxiR0YwYVc5dWMyaHBjSE11UVhSMFlXTm9aWE5VYncwS0lDQWdJQ0FnSUNBZ0lHOWpZM1Z5Y21WdVkyVnpPaUJiTUN3Z1ZVNUNUMVZPUkVWRVhTQWdEUW9nSUNBZ1kyRndZV0pwYkdsMGFXVnpPZzBLSUNBZ0lDQWdhRzl6ZERvZ0RRb2dJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbU5oY0dGaWFXeHBkR2xsY3k1RGIyNTBZV2x1WlhJTkNpQWdJQ0FnSUNBZ2RtRnNhV1JmYzI5MWNtTmxYM1I1Y0dWek9pQmJkRzl6WTJFdWJtOWtaWE11VTI5bWRIZGhjbVZEYjIxd2IyNWxiblJkSUEwS0lDQWdJQ0FnWlc1a2NHOXBiblFnT2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUIwYjNOallTNWpZWEJoWW1sc2FYUnBaWE11Ulc1a2NHOXBiblF1UVdSdGFXNGdEUW9nSUNBZ0lDQnZjem9nRFFvZ0lDQWdJQ0FnSUhSNWNHVTZJSFJ2YzJOaExtTmhjR0ZpYVd4cGRHbGxjeTVQY0dWeVlYUnBibWRUZVhOMFpXME5DaUFnSUNBZ0lITmpZV3hoWW14bE9nMEtJQ0FnSUNBZ0lDQjBlWEJsT2lCMGIzTmpZUzVqWVhCaFltbHNhWFJwWlhNdVUyTmhiR0ZpYkdVTkNpQWdJQ0FnSUdKcGJtUnBibWM2RFFvZ0lDQWdJQ0FnSUhSNWNHVTZJSFJ2YzJOaExtTmhjR0ZpYVd4cGRHbGxjeTV1WlhSM2IzSnJMa0pwYm1SaFlteGxEUW89Iik7CisJCXJldHVybiBpbXBvcnRSZXFEZXRhaWxzOworCX0KKworCXB1YmxpYyBzdGF0aWMgSW1wb3J0UmVxRGV0YWlscyBnZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoKSB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZVJlcURldGFpbHMgPSBnZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzID0gbmV3IEltcG9ydFJlcURldGFpbHMocmVzb3VyY2VSZXFEZXRhaWxzLmdldE5hbWUoKSwgcmVzb3VyY2VSZXFEZXRhaWxzLmdldERlc2NyaXB0aW9uKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXRUYWdzKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXREZXJpdmVkRnJvbSgpLCByZXNvdXJjZVJlcURldGFpbHMuZ2V0VmVuZG9yTmFtZSgpLAorCQkJCXJlc291cmNlUmVxRGV0YWlscy5nZXRWZW5kb3JSZWxlYXNlKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXRDb250YWN0SWQoKSwgcmVzb3VyY2VSZXFEZXRhaWxzLmdldEljb24oKSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0UGF5bG9hZE5hbWUoIm15Q29tcHV0ZS55YW1sIik7CisJCWltcG9ydFJlcURldGFpbHMuc2V0Q2F0ZWdvcmllcyhyZXNvdXJjZVJlcURldGFpbHMuZ2V0Q2F0ZWdvcmllcygpKTsKKwkJaW1wb3J0UmVxRGV0YWlscy5zZXRQYXlsb2FkRGF0YSgKKwkJCQkiZEc5elkyRmZaR1ZtYVc1cGRHbHZibk5mZG1WeWMybHZiam9nZEc5elkyRmZjMmx0Y0d4bFgzbGhiV3hmTVY4d1h6QU5DbTV2WkdWZmRIbHdaWE02SUEwS0lDQnZjbWN1YjNCbGJtVmpiMjF3TG5KbGMyOTFjbU5sTGsxNVEyOXRjSFYwWlRvTkNpQWdJQ0JrWlhKcGRtVmtYMlp5YjIwNklIUnZjMk5oTG01dlpHVnpMbEp2YjNRTkNpQWdJQ0JoZEhSeWFXSjFkR1Z6T2cwS0lDQWdJQ0FnY0hKcGRtRjBaVjloWkdSeVpYTnpPZzBLSUNBZ0lDQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0FnSUhCMVlteHBZMTloWkdSeVpYTnpPZzBLSUNBZ0lDQWdJQ0IwZVhCbE9pQnpkSEpwYm1jTkNpQWdJQ0FnSUc1bGRIZHZjbXR6T2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUJ0WVhBTkNpQWdJQ0FnSUNBZ1pXNTBjbmxmYzJOb1pXMWhPZzBLSUNBZ0lDQWdJQ0FnSUhSNWNHVTZJSFJ2YzJOaExtUmhkR0YwZVhCbGN5NXVaWFIzYjNKckxrNWxkSGR2Y210SmJtWnZEUW9nSUNBZ0lDQndiM0owY3pvTkNpQWdJQ0FnSUNBZ2RIbHdaVG9nYldGd0RRb2dJQ0FnSUNBZ0lHVnVkSEo1WDNOamFHVnRZVG9OQ2lBZ0lDQWdJQ0FnSUNCMGVYQmxPaUIwYjNOallTNWtZWFJoZEhsd1pYTXVibVYwZDI5eWF5NVFiM0owU1c1bWJ3MEtJQ0FnSUhKbGNYVnBjbVZ0Wlc1MGN6b05DaUFnSUNBZ0lDMGdiRzlqWVd4ZmMzUnZjbUZuWlRvZ0RRb2dJQ0FnSUNBZ0lDQWdZMkZ3WVdKcGJHbDBlVG9nZEc5elkyRXVZMkZ3WVdKcGJHbDBhV1Z6TGtGMGRHRmphRzFsYm5RTkNpQWdJQ0FnSUNBZ0lDQnViMlJsT2lCMGIzTmpZUzV1YjJSbGN5NUNiRzlqYTFOMGIzSmhaMlVOQ2lBZ0lDQWdJQ0FnSUNCeVpXeGhkR2x2Ym5Ob2FYQTZJSFJ2YzJOaExuSmxiR0YwYVc5dWMyaHBjSE11UVhSMFlXTm9aWE5VYncwS0lDQWdJQ0FnSUNBZ0lHOWpZM1Z5Y21WdVkyVnpPaUJiTUN3Z1ZVNUNUMVZPUkVWRVhTQWdEUW9nSUNBZ1kyRndZV0pwYkdsMGFXVnpPZzBLSUNBZ0lDQWdhRzl6ZERvZ0RRb2dJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbU5oY0dGaWFXeHBkR2xsY3k1RGIyNTBZV2x1WlhJTkNpQWdJQ0FnSUNBZ2RtRnNhV1JmYzI5MWNtTmxYM1I1Y0dWek9pQmJkRzl6WTJFdWJtOWtaWE11VTI5bWRIZGhjbVZEYjIxd2IyNWxiblJkSUEwS0lDQWdJQ0FnWlc1a2NHOXBiblFnT2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUIwYjNOallTNWpZWEJoWW1sc2FYUnBaWE11Ulc1a2NHOXBiblF1UVdSdGFXNGdEUW9nSUNBZ0lDQnZjem9nRFFvZ0lDQWdJQ0FnSUhSNWNHVTZJSFJ2YzJOaExtTmhjR0ZpYVd4cGRHbGxjeTVQY0dWeVlYUnBibWRUZVhOMFpXME5DaUFnSUNBZ0lITmpZV3hoWW14bE9nMEtJQ0FnSUNBZ0lDQjBlWEJsT2lCMGIzTmpZUzVqWVhCaFltbHNhWFJwWlhNdVUyTmhiR0ZpYkdVTkNpQWdJQ0FnSUdKcGJtUnBibWM2RFFvZ0lDQWdJQ0FnSUhSNWNHVTZJSFJ2YzJOaExtTmhjR0ZpYVd4cGRHbGxjeTV1WlhSM2IzSnJMa0pwYm1SaFlteGxEUW89Iik7CisJCXJldHVybiBpbXBvcnRSZXFEZXRhaWxzOworCX0KKworCXB1YmxpYyBzdGF0aWMgSW1wb3J0UmVxRGV0YWlscyBnZXREZWZhdWx0SW1wb3J0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlUmVxRGV0YWlscyA9IGdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQywgbmFtZSk7CisJCUltcG9ydFJlcURldGFpbHMgaW1wb3J0UmVxRGV0YWlscyA9IG5ldyBJbXBvcnRSZXFEZXRhaWxzKHJlc291cmNlUmVxRGV0YWlscy5nZXROYW1lKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXREZXNjcmlwdGlvbigpLCByZXNvdXJjZVJlcURldGFpbHMuZ2V0VGFncygpLCByZXNvdXJjZVJlcURldGFpbHMuZ2V0RGVyaXZlZEZyb20oKSwgcmVzb3VyY2VSZXFEZXRhaWxzLmdldFZlbmRvck5hbWUoKSwKKwkJCQlyZXNvdXJjZVJlcURldGFpbHMuZ2V0VmVuZG9yUmVsZWFzZSgpLCByZXNvdXJjZVJlcURldGFpbHMuZ2V0Q29udGFjdElkKCksIHJlc291cmNlUmVxRGV0YWlscy5nZXRJY29uKCkpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFBheWxvYWROYW1lKCJteUNvbXB1dGUueWFtbCIpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldENhdGVnb3JpZXMocmVzb3VyY2VSZXFEZXRhaWxzLmdldENhdGVnb3JpZXMoKSk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0UGF5bG9hZERhdGEoCisJCQkJImRHOXpZMkZmWkdWbWFXNXBkR2x2Ym5OZmRtVnljMmx2YmpvZ2RHOXpZMkZmYzJsdGNHeGxYM2xoYld4Zk1WOHdYekFOQ201dlpHVmZkSGx3WlhNNklBMEtJQ0J2Y21jdWIzQmxibVZqYjIxd0xuSmxjMjkxY21ObExrMTVRMjl0Y0hWMFpUb05DaUFnSUNCa1pYSnBkbVZrWDJaeWIyMDZJSFJ2YzJOaExtNXZaR1Z6TGxKdmIzUU5DaUFnSUNCaGRIUnlhV0oxZEdWek9nMEtJQ0FnSUNBZ2NISnBkbUYwWlY5aFpHUnlaWE56T2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNBZ0lIQjFZbXhwWTE5aFpHUnlaWE56T2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNBZ0lHNWxkSGR2Y210ek9nMEtJQ0FnSUNBZ0lDQjBlWEJsT2lCdFlYQU5DaUFnSUNBZ0lDQWdaVzUwY25sZmMyTm9aVzFoT2cwS0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbVJoZEdGMGVYQmxjeTV1WlhSM2IzSnJMazVsZEhkdmNtdEpibVp2RFFvZ0lDQWdJQ0J3YjNKMGN6b05DaUFnSUNBZ0lDQWdkSGx3WlRvZ2JXRndEUW9nSUNBZ0lDQWdJR1Z1ZEhKNVgzTmphR1Z0WVRvTkNpQWdJQ0FnSUNBZ0lDQjBlWEJsT2lCMGIzTmpZUzVrWVhSaGRIbHdaWE11Ym1WMGQyOXlheTVRYjNKMFNXNW1idzBLSUNBZ0lISmxjWFZwY21WdFpXNTBjem9OQ2lBZ0lDQWdJQzBnYkc5allXeGZjM1J2Y21GblpUb2dEUW9nSUNBZ0lDQWdJQ0FnWTJGd1lXSnBiR2wwZVRvZ2RHOXpZMkV1WTJGd1lXSnBiR2wwYVdWekxrRjBkR0ZqYUcxbGJuUU5DaUFnSUNBZ0lDQWdJQ0J1YjJSbE9pQjBiM05qWVM1dWIyUmxjeTVDYkc5amExTjBiM0poWjJVTkNpQWdJQ0FnSUNBZ0lDQnlaV3hoZEdsdmJuTm9hWEE2SUhSdmMyTmhMbkpsYkdGMGFXOXVjMmhwY0hNdVFYUjBZV05vWlhOVWJ3MEtJQ0FnSUNBZ0lDQWdJRzlqWTNWeWNtVnVZMlZ6T2lCYk1Dd2dWVTVDVDFWT1JFVkVYU0FnRFFvZ0lDQWdZMkZ3WVdKcGJHbDBhV1Z6T2cwS0lDQWdJQ0FnYUc5emREb2dEUW9nSUNBZ0lDQWdJSFI1Y0dVNklIUnZjMk5oTG1OaGNHRmlhV3hwZEdsbGN5NURiMjUwWVdsdVpYSU5DaUFnSUNBZ0lDQWdkbUZzYVdSZmMyOTFjbU5sWDNSNWNHVnpPaUJiZEc5elkyRXVibTlrWlhNdVUyOW1kSGRoY21WRGIyMXdiMjVsYm5SZElBMEtJQ0FnSUNBZ1pXNWtjRzlwYm5RZ09nMEtJQ0FnSUNBZ0lDQjBlWEJsT2lCMGIzTmpZUzVqWVhCaFltbHNhWFJwWlhNdVJXNWtjRzlwYm5RdVFXUnRhVzRnRFFvZ0lDQWdJQ0J2Y3pvZ0RRb2dJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbU5oY0dGaWFXeHBkR2xsY3k1UGNHVnlZWFJwYm1kVGVYTjBaVzBOQ2lBZ0lDQWdJSE5qWVd4aFlteGxPZzBLSUNBZ0lDQWdJQ0IwZVhCbE9pQjBiM05qWVM1allYQmhZbWxzYVhScFpYTXVVMk5oYkdGaWJHVU5DaUFnSUNBZ0lHSnBibVJwYm1jNkRRb2dJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbU5oY0dGaWFXeHBkR2xsY3k1dVpYUjNiM0pyTGtKcGJtUmhZbXhsRFFvPSIpOworCQlyZXR1cm4gaW1wb3J0UmVxRGV0YWlsczsKKwl9CisKKwkvLyAqKiogU0VSVklDRSAqKioKKwlwdWJsaWMgc3RhdGljIFNlcnZpY2VSZXFEZXRhaWxzIGdldERlZmF1bHRTZXJ2aWNlKCkgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFNlcnZpY2UoImNpU2VydmljZSIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwgImFsMTk3NiIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU2VydmljZVJlcURldGFpbHMgZ2V0RGVmYXVsdFNlcnZpY2UoU3RyaW5nIGNvbnRhY3RJZCkgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFNlcnZpY2UoImNpU2VydmljZSIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwgY29udGFjdElkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlcnZpY2VSZXFEZXRhaWxzIGdldERlZmF1bHRTZXJ2aWNlKFVzZXIgdXNlcikgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFNlcnZpY2UoImNpU2VydmljZSIsIFNlcnZpY2VDYXRlZ29yaWVzRW51bS5NT0JJTElUWSwgdXNlci5nZXRVc2VySWQoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTZXJ2aWNlUmVxRGV0YWlscyBnZXRTZXJ2aWNlKFNlcnZpY2VDYXRlZ29yaWVzRW51bSBjYXRlZ29yeSkgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFNlcnZpY2UoImNpU2VydmljZSIsIGNhdGVnb3J5LCAiYWwxOTc2Iik7CisJfQorCisJcHVibGljIHN0YXRpYyBTZXJ2aWNlUmVxRGV0YWlscyBnZXREZWZhdWx0U2VydmljZShTZXJ2aWNlQ2F0ZWdvcmllc0VudW0gY2F0ZWdvcnksIFVzZXIgdXNlcikgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFNlcnZpY2UoImNpU2VydmljZSIsIGNhdGVnb3J5LCB1c2VyLmdldFVzZXJJZCgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlcnZpY2VSZXFEZXRhaWxzIGdldERlZmF1bHRTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU2VydmljZUNhdGVnb3JpZXNFbnVtIGNhdGVnb3J5LCBTdHJpbmcgY29udGFjdElkKSB7CisJCXNlcnZpY2VOYW1lID0gKHNlcnZpY2VOYW1lICsgZ2VuZXJhdGVVVUlEZm9yU3VmaXgoKSk7CisJCUFycmF5TGlzdDxTdHJpbmc+IHRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFncy5hZGQoInNlcnZpY2VUYWciKTsKKwkJdGFncy5hZGQoInNlcnZpY2VUYWcxIik7CisJCXRhZ3MuYWRkKHNlcnZpY2VOYW1lKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gInNlcnZpY2UgRGVzY3JpcHRpb24iOworCQlTdHJpbmcgaWNvbiA9ICJteUljb24iOworCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKHNlcnZpY2VOYW1lLCBjYXRlZ29yeS5nZXRWYWx1ZSgpLCB0YWdzLCBkZXNjcmlwdGlvbiwgY29udGFjdElkLCBpY29uKTsKKworCQlyZXR1cm4gc2VydmljZURldGFpbHM7CisJfQorCisJLy8gKioqKiogUFJPUEVSVFkgKioqCisKKwlwdWJsaWMgc3RhdGljIFByb3BlcnR5UmVxRGV0YWlscyBnZXREZWZhdWx0UHJvcGVydHkoKSB7CisJCXJldHVybiBnZXREZWZhdWx0UHJvcGVydHkoImRpc2tfc2l6ZSIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlSZXFEZXRhaWxzIGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCVByb3BlcnR5UmVxRGV0YWlscyBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eVJlcURldGFpbHMoKTsKKwkJcHJvcGVydHkuc2V0TmFtZShwcm9wZXJ0eU5hbWUpOworCQlwcm9wZXJ0eS5zZXRQcm9wZXJ0eVR5cGUoImludGVnZXIiKTsKKwkJcHJvcGVydHkuc2V0UHJvcGVydHlSZXF1aXJlZChmYWxzZSk7CisJCXByb3BlcnR5LnNldFByb3BlcnR5RGVmYXVsdFZhbHVlKCIxMjM0NSIpOworCQlwcm9wZXJ0eS5zZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCJ0ZXN0IHByb3BlcnR5Iik7CisJCXByb3BlcnR5LnNldFByb3BlcnR5UmFuZ2VNYXgoIjUwMCIpOworCQlwcm9wZXJ0eS5zZXRQcm9wZXJ0eVJhbmdlTWluKCIxMDAiKTsKKwkJcHJvcGVydHkuc2V0UHJvcGVydHlQYXNzd29yZChmYWxzZSk7CisJCXJldHVybiBwcm9wZXJ0eTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3BlcnR5UmVxRGV0YWlscyBnZXREZWZhdWx0SW50ZWdlclByb3BlcnR5KCkgeworCQlyZXR1cm4gZ2V0UHJvcGVydHlEZXRhaWxzKFByb3BlcnR5VHlwZUVudW0uSU5URUdFUik7CisJfQorCisJcHVibGljIHN0YXRpYyBQcm9wZXJ0eVJlcURldGFpbHMgZ2V0RGVmYXVsdFN0cmluZ1Byb3BlcnR5KCkgeworCQlyZXR1cm4gZ2V0UHJvcGVydHlEZXRhaWxzKFByb3BlcnR5VHlwZUVudW0uU1RSSU5HKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3BlcnR5UmVxRGV0YWlscyBnZXREZWZhdWx0Qm9vbGVhblByb3BlcnR5KCkgeworCQlyZXR1cm4gZ2V0UHJvcGVydHlEZXRhaWxzKFByb3BlcnR5VHlwZUVudW0uQk9PTEVBTik7CisJfQorCisJcHVibGljIHN0YXRpYyBQcm9wZXJ0eVJlcURldGFpbHMgZ2V0RGVmYXVsdExpc3RQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIGdldFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eVR5cGVFbnVtLlNUUklOR19MSVNUKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3BlcnR5UmVxRGV0YWlscyBnZXREZWZhdWx0TGlzdFByb3BlcnR5KFByb3BlcnR5VHlwZUVudW0gaW5uZXJUeXBlKSB7CisJCXJldHVybiBnZXRQcm9wZXJ0eURldGFpbHMoaW5uZXJUeXBlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3BlcnR5UmVxRGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlUeXBlRW51bSBwcm9wVHlwZSkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5UmVxRGV0YWlscyhwcm9wVHlwZS5nZXROYW1lKCksIHByb3BUeXBlLmdldFR5cGUoKSwgcHJvcFR5cGUuZ2V0VmFsdWUoKSwgcHJvcFR5cGUuZ2V0RGVzY3JpcHRpb24oKSwgcHJvcFR5cGUuZ2V0U2NoZW1hRGVmaW5pdGlvbigpKTsKKwl9CisKKwkvLyAqKioqKiBSRVNPVVJDRSBJTlNUQU5DRSAqKioKKwlwdWJsaWMgc3RhdGljIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBnZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoKSB7CisJCXJldHVybiBnZXREZWZhdWx0Q29tcG9uZW50SW5zdGFuY2UoInJlc291cmNlSW5zdGFuY2VOYW1lIik7CisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyByZXNvdXJjZVVpZCA9ICJyZXNvdXJjZUlkIjsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VEZXRhaWxzID0gbmV3IENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyhyZXNvdXJjZVVpZCwgUkVTT1VSQ0VfSU5TVEFOQ0VfREVTQ1JJUFRJT04sIFJFU09VUkNFX0lOU1RBTkNFX1BPU19YLCBSRVNPVVJDRV9JTlNUQU5DRV9QT1NfWSwgbmFtZSk7CisKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2VEZXRhaWxzOworCisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKFN0cmluZyBuYW1lLCBDb21wb25lbnRSZXFEZXRhaWxzIGNvbXBvbmVudFJlcURldGFpbHMpIHsKKwkJU3RyaW5nIHJlc291cmNlVWlkID0gY29tcG9uZW50UmVxRGV0YWlscy5nZXRVbmlxdWVJZCgpOworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZURldGFpbHMgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKHJlc291cmNlVWlkLCBSRVNPVVJDRV9JTlNUQU5DRV9ERVNDUklQVElPTiwgUkVTT1VSQ0VfSU5TVEFOQ0VfUE9TX1gsIFJFU09VUkNFX0lOU1RBTkNFX1BPU19ZLCBuYW1lKTsKKworCQlyZXR1cm4gcmVzb3VyY2VJbnN0YW5jZURldGFpbHM7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBnZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudFJlcURldGFpbHMgY29tcEluc3RPcmlnaW5EZXRhaWxzKSB7CisJCVN0cmluZyBjb21wSW5zdE5hbWUgPSAoY29tcEluc3RPcmlnaW5EZXRhaWxzLmdldE5hbWUoKSAhPSBudWxsID8gY29tcEluc3RPcmlnaW5EZXRhaWxzLmdldE5hbWUoKSA6ICJyZXNvdXJjZUluc3RhbmNlTmFtZSIpOworCQlTdHJpbmcgcmVzb3VyY2VVaWQgPSBjb21wSW5zdE9yaWdpbkRldGFpbHMuZ2V0VW5pcXVlSWQoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIHJlc291cmNlSW5zdGFuY2VEZXRhaWxzID0gbmV3IENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyhyZXNvdXJjZVVpZCwgUkVTT1VSQ0VfSU5TVEFOQ0VfREVTQ1JJUFRJT04sIFJFU09VUkNFX0lOU1RBTkNFX1BPU19YLCBSRVNPVVJDRV9JTlNUQU5DRV9QT1NfWSwgY29tcEluc3ROYW1lKTsKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2VEZXRhaWxzOworCisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgZ2V0Q29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50IGNvbXBJbnN0T3JpZ2luRGV0YWlscykgeworCQlTdHJpbmcgY29tcEluc3ROYW1lID0gKGNvbXBJbnN0T3JpZ2luRGV0YWlscy5nZXROYW1lKCkgIT0gbnVsbCA/IGNvbXBJbnN0T3JpZ2luRGV0YWlscy5nZXROYW1lKCkgOiAiY29tcG9uZW50SW5zdGFuY2VOYW1lIik7CisJCVN0cmluZyBjb21wSW5zVWlkID0gY29tcEluc3RPcmlnaW5EZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjb21wb25lbnRJbnN0YW5jZURldGFpbHMgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKGNvbXBJbnNVaWQsIFJFU09VUkNFX0lOU1RBTkNFX0RFU0NSSVBUSU9OLCBSRVNPVVJDRV9JTlNUQU5DRV9QT1NfWCwgUkVTT1VSQ0VfSU5TVEFOQ0VfUE9TX1ksIGNvbXBJbnN0TmFtZSk7CisJCXJldHVybiBjb21wb25lbnRJbnN0YW5jZURldGFpbHM7CisKKwl9CisKKwkvLyAqKioqKioqIFVTRVIgKioqKioqKioqKioqKioqKioqKioqKgorCXB1YmxpYyBzdGF0aWMgVXNlciBnZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0gdXNlclJvbGUpIHsKKwkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzID0gbmV3IFVzZXIoKTsKKwkJc2RuY01vZGlmaWVyRGV0YWlscy5zZXRVc2VySWQodXNlclJvbGUuZ2V0VXNlcklkKCkpOworCQlzZG5jTW9kaWZpZXJEZXRhaWxzLnNldEZpcnN0TmFtZSh1c2VyUm9sZS5nZXRGaXJzdE5hbWUoKSk7CisJCXNkbmNNb2RpZmllckRldGFpbHMuc2V0TGFzdE5hbWUodXNlclJvbGUuZ2V0TGFzdE5hbWUoKSk7CisJCXJldHVybiBzZG5jTW9kaWZpZXJEZXRhaWxzOworCX0KKworCXB1YmxpYyBzdGF0aWMgVXNlciBnZXREZWZhdWx0TWVjaFVzZXIoKSB7CisJCVVzZXIgc2RuY01lY2hVc2VyRGV0YWlscyA9IG5ldyBVc2VyKCk7CisJCXNkbmNNZWNoVXNlckRldGFpbHMuc2V0VXNlcklkKCJtMTIzNDUiKTsKKwkJc2RuY01lY2hVc2VyRGV0YWlscy5zZXRGaXJzdE5hbWUoIlNoYXkiKTsKKwkJc2RuY01lY2hVc2VyRGV0YWlscy5zZXRMYXN0TmFtZSgiU3BvbmRlciIpOworCQlzZG5jTWVjaFVzZXJEZXRhaWxzLnNldEVtYWlsKCJtZWNoSWRAaW50bC5zZGMuY29tIik7CisJCXNkbmNNZWNoVXNlckRldGFpbHMuc2V0Um9sZSgiREVTSUdORVIiKTsKKwkJcmV0dXJuIHNkbmNNZWNoVXNlckRldGFpbHM7CisJfQorCisJLy8gKioqKioqKiBDT05TVU1FUiAqKioqKioqKioqKioqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIENvbnN1bWVyRGF0YURlZmluaXRpb24gZ2V0RGVmYXVsdENvbnN1bWVyRGV0YWlscygpIHsKKwkJQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBjb25zdW1lciA9IG5ldyBDb25zdW1lckRhdGFEZWZpbml0aW9uKCk7CisJCWNvbnN1bWVyLnNldENvbnN1bWVyTmFtZSgiY2kiKTsKKwkJY29uc3VtZXIuc2V0Q29uc3VtZXJTYWx0KCIyYTFmODg3ZDYwN2Q0NTE1ZDQwNjZmZTBmNTQ1MmE1MCIpOworCQljb25zdW1lci5zZXRDb25zdW1lclBhc3N3b3JkKCIwYTBkYzU1N2MzYmY1OTRiMWE0ODAzMGUzZTk5MjI3NTgwMTY4YjIxZjQ0ZTI4NWM2OTc0MGI4ZDViMTNlMzNiIik7CisJCXJldHVybiBjb25zdW1lcjsKKwl9CisKKwkvLyAqKiogQVJUSUZBQ1QgKioqCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgZ2V0RGVmYXVsdEFydGlmYWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0RGVmYXVsdEFydGlmYWN0KERFRkFVTFRfQVJUSUZBQ1RfTEFCRUwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RSZXFEZXRhaWxzIGdldERlZmF1bHRBcnRpZmFjdChTdHJpbmcgYXJ0aWZhY3RMYWJlbCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RUeXBlcyA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlc0Zyb21Kc29uQXJyYXkoQXJ0aWZhY3RSZXN0VXRpbHMuZ2V0QXJ0aWZhY3RUeXBlc0xpc3QoKSk7CisJCVN0cmluZyBhcnRpZmFjdFR5cGUgPSBhcnRpZmFjdFR5cGVzLmdldCgwKTsKKworCQlyZXR1cm4gZ2V0RGVmYXVsdEFydGlmYWN0KGFydGlmYWN0TGFiZWwsIGFydGlmYWN0VHlwZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgZ2V0RGVmYXVsdEFydGlmYWN0KFN0cmluZyBhcnRpZmFjdExhYmVsLCBTdHJpbmcgYXJ0aWZhY3RUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJ0ZXN0QXJ0aWZhY3Quc2giOworCQlTdHJpbmcgYXJ0aWZhY3REZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvblRlc3QiOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSAiZEdWemRBPT0iOyAvLyBjb250ZW50IG9mIGZpbGUKKworCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzID0gbmV3IEFydGlmYWN0UmVxRGV0YWlscyhhcnRpZmFjdE5hbWUsIGFydGlmYWN0VHlwZSwgYXJ0aWZhY3REZXNjcmlwdGlvbiwgcGF5bG9hZERhdGEsIGFydGlmYWN0TGFiZWwpOworCQlhcnRpZmFjdERldGFpbHMuc2V0VXJsKCIiKTsKKwkJYXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0RGlzcGxheU5hbWUoYXJ0aWZhY3RMYWJlbCk7CisJCXJldHVybiBhcnRpZmFjdERldGFpbHM7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgZ2V0U2VydmljZUFwaUFydGlmYWN0RGV0YWlscyhTdHJpbmcgYXJ0aWZhY3RMYWJlbCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0ID0gZ2V0RGVmYXVsdEFydGlmYWN0KGFydGlmYWN0TGFiZWwsICJPVEhFUiIpOworCQlkZWZhdWx0QXJ0aWZhY3Quc2V0VXJsKCJodHRwOi8vd3d3LmFwcGxlLmNvbSIpOworCQlkZWZhdWx0QXJ0aWZhY3Quc2V0U2VydmljZUFwaSh0cnVlKTsKKwkJZGVmYXVsdEFydGlmYWN0LnNldEFydGlmYWN0RGlzcGxheU5hbWUoU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShkZWZhdWx0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RMYWJlbCgpKSk7CisJCXJldHVybiBkZWZhdWx0QXJ0aWZhY3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgZ2V0RGVmYXVsdERlcGxveW1lbnRBcnRpZmFjdEZvclR5cGUoU3RyaW5nIGFydGlmYWN0VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0QXJ0aWZhY3RCeVR5cGUoREVGQVVMVF9BUlRJRkFDVF9MQUJFTCwgYXJ0aWZhY3RUeXBlLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEFydGlmYWN0UmVxRGV0YWlscyBnZXRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0TGFiZWwsIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlLCBCb29sZWFuIGRlcGxveW1lbnRUcnVlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRBcnRpZmFjdEJ5VHlwZShERUZBVUxUX0FSVElGQUNUX0xBQkVMLCBhcnRpZmFjdFR5cGUudG9TdHJpbmcoKSwgZGVwbG95bWVudFRydWUpOworCisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgZ2V0QXJ0aWZhY3RCeVR5cGUoU3RyaW5nIGFydGlmYWN0TGFiZWwsIFN0cmluZyBhcnRpZmFjdFR5cGUsIEJvb2xlYW4gZGVwbG95bWVudFRydWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZTsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gbnVsbDsKKwkJSW50ZWdlciB0aW1lb3V0ID0gbnVsbDsKKwkJU3RyaW5nIHVybCA9ICIiOworCQlTdHJpbmcgYXJ0aWZhY3REZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvblRlc3QiOworCisJCS8vIFBMRUFTRSBOT1RFISEhCisJCS8vIFRoZSBub24tZGVmYXVsdCBwYXlsb2FkcyBoZXJlIGFyZSByZWFsIG9uZXMgYWNjb3JkaW5nIHRvIHZhcmlvdXMKKwkJLy8gdHlwZXMgdmFsaWRhdGlvbnMsCisJCS8vIFBsZWFzZSBkb24ndCBjaGFuZ2UgdGhlbSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorCisJCUFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlRW51bSA9IEFydGlmYWN0VHlwZUVudW0uZmluZFR5cGUoYXJ0aWZhY3RUeXBlKTsKKworCQkvKgorCQkgKiBNaXNzaW5nIGZpbGUgdHlwZTogRENBRV9KU09OCisJCSAqLworCQlzd2l0Y2ggKGFydGlmYWN0VHlwZUVudW0pIHsKKwkJY2FzZSBEQ0FFX0VWRU5UOgorCQljYXNlIEFQUENfQ09ORklHOgorCQljYXNlIERDQUVfRE9DOgorCQljYXNlIERDQUVfVE9TQ0E6CisJCWNhc2UgSEVBVDoKKwkJY2FzZSBIRUFUX05FVDoKKwkJY2FzZSBIRUFUX1ZPTDogeworCQkJYXJ0aWZhY3ROYW1lID0gZ2VuZXJhdGVVVUlEZm9yU3VmaXgoKSArIGFydGlmYWN0VHlwZSArICJfaW5zdGFsbF9hcGFjaGUyLnlhbWwiOworCQkJcGF5bG9hZERhdGEgPSAiYUdWaGRGOTBaVzF3YkdGMFpWOTJaWEp6YVc5dU9pQXlNREV6TFRBMUxUSXpEUW9OQ21SbGMyTnlhWEIwYVc5dU9pQlRhVzF3YkdVZ2RHVnRjR3hoZEdVZ2RHOGdaR1Z3Ykc5NUlHRWdjM1JoWTJzZ2QybDBhQ0IwZDI4Z2RtbHlkSFZoYkNCdFlXTm9hVzVsSUdsdWMzUmhibU5sY3cwS0RRcHdZWEpoYldWMFpYSnpPZzBLSUNCcGJXRm5aVjl1WVcxbFh6RTZEUW9nSUNBZ2RIbHdaVG9nYzNSeWFXNW5EUW9nSUNBZ2JHRmlaV3c2SUVsdFlXZGxJRTVoYldVTkNpQWdJQ0JrWlhOamNtbHdkR2x2YmpvZ1UwTlBTVTFCUjBVZ1UzQmxZMmxtZVNCaGJpQnBiV0ZuWlNCdVlXMWxJR1p2Y2lCcGJuTjBZVzVqWlRFTkNpQWdJQ0JrWldaaGRXeDBPaUJqYVhKeWIzTXRNQzR6TGpFdGVEZzJYelkwRFFvZ0lHbHRZV2RsWDI1aGJXVmZNam9OQ2lBZ0lDQjBlWEJsT2lCemRISnBibWNOQ2lBZ0lDQnNZV0psYkRvZ1NXMWhaMlVnVG1GdFpRMEtJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlRRMDlKVFVGSFJTQlRjR1ZqYVdaNUlHRnVJR2x0WVdkbElHNWhiV1VnWm05eUlHbHVjM1JoYm1ObE1nMEtJQ0FnSUdSbFptRjFiSFE2SUdOcGNuSnZjeTB3TGpNdU1TMTRPRFpmTmpRTkNpQWdibVYwZDI5eWExOXBaRG9OQ2lBZ0lDQjBlWEJsT2lCemRISnBibWNOQ2lBZ0lDQnNZV0psYkRvZ1RtVjBkMjl5YXlCSlJBMEtJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlRRMDlPUlZSWFQxSkxJRTVsZEhkdmNtc2dkRzhnWW1VZ2RYTmxaQ0JtYjNJZ2RHaGxJR052YlhCMWRHVWdhVzV6ZEdGdVkyVU5DaUFnSUNCb2FXUmtaVzQ2SUhSeWRXVU5DaUFnSUNCamIyNXpkSEpoYVc1MGN6b05DaUFnSUNBZ0lDMGdiR1Z1WjNSb09pQjdJRzFwYmpvZ05pd2diV0Y0T2lBNElIME5DaUFnSUNBZ0lDQWdaR1Z6WTNKcGNIUnBiMjQ2SUZCaGMzTjNiM0prSUd4bGJtZDBhQ0J0ZFhOMElHSmxJR0psZEhkbFpXNGdOaUJoYm1RZ09DQmphR0Z5WVdOMFpYSnpMZzBLSUNBZ0lDQWdMU0J5WVc1blpUb2dleUJ0YVc0NklEWXNJRzFoZURvZ09DQjlEUW9nSUNBZ0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCU1lXNW5aU0JrWlhOamNtbHdkR2x2YmcwS0lDQWdJQ0FnTFNCaGJHeHZkMlZrWDNaaGJIVmxjem9OQ2lBZ0lDQWdJQ0FnTFNCdE1TNXpiV0ZzYkEwS0lDQWdJQ0FnSUNBdElHMHhMbTFsWkdsMWJRMEtJQ0FnSUNBZ0lDQXRJRzB4TG14aGNtZGxEUW9nSUNBZ0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCQmJHeHZkMlZrSUhaaGJIVmxjeUJrWlhOamNtbHdkR2x2YmcwS0lDQWdJQ0FnTFNCaGJHeHZkMlZrWDNCaGRIUmxjbTQ2SUNKYllTMTZRUzFhTUMwNVhTc2lEUW9nSUNBZ0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCUVlYTnpkMjl5WkNCdGRYTjBJR052Ym5OcGMzUWdiMllnWTJoaGNtRmpkR1Z5Y3lCaGJtUWdiblZ0WW1WeWN5QnZibXg1TGcwS0lDQWdJQ0FnTFNCaGJHeHZkMlZrWDNCaGRIUmxjbTQ2SUNKYlFTMWFYU3RiWVMxNlFTMWFNQzA1WFNvaURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJRWVhOemQyOXlaQ0J0ZFhOMElITjBZWEowSUhkcGRHZ2dZVzRnZFhCd1pYSmpZWE5sSUdOb1lYSmhZM1JsY2k0TkNpQWdJQ0FnSUMwZ1kzVnpkRzl0WDJOdmJuTjBjbUZwYm5RNklHNXZkbUV1YTJWNWNHRnBjZzBLSUNBZ0lDQWdJQ0JrWlhOamNtbHdkR2x2YmpvZ1EzVnpkRzl0SUdSbGMyTnlhWEIwYVc5dURRb05DbkpsYzI5MWNtTmxjem9OQ2lBZ2JYbGZhVzV6ZEdGdVkyVXhPZzBLSUNBZ0lIUjVjR1U2SUU5VE9qcE9iM1poT2pwVFpYSjJaWElOQ2lBZ0lDQndjbTl3WlhKMGFXVnpPZzBLSUNBZ0lDQWdhVzFoWjJVNklIc2daMlYwWDNCaGNtRnRPaUJwYldGblpWOXVZVzFsWHpFZ2ZRMEtJQ0FnSUNBZ1pteGhkbTl5T2lCdE1TNXpiV0ZzYkEwS0lDQWdJQ0FnYm1WMGQyOXlhM002RFFvZ0lDQWdJQ0FnSUMwZ2JtVjBkMjl5YXlBNklIc2daMlYwWDNCaGNtRnRJRG9nYm1WMGQyOXlhMTlwWkNCOURRb2dJRzE1WDJsdWMzUmhibU5sTWpvTkNpQWdJQ0IwZVhCbE9pQlBVem82VG05MllUbzZVMlZ5ZG1WeURRb2dJQ0FnY0hKdmNHVnlkR2xsY3pvTkNpQWdJQ0FnSUdsdFlXZGxPaUI3SUdkbGRGOXdZWEpoYlRvZ2FXMWhaMlZmYm1GdFpWOHlJSDBOQ2lBZ0lDQWdJR1pzWVhadmNqb2diVEV1ZEdsdWVRMEtJQ0FnSUNBZ2JtVjBkMjl5YTNNNkRRb2dJQ0FnSUNBZ0lDMGdibVYwZDI5eWF5QTZJSHNnWjJWMFgzQmhjbUZ0SURvZ2JtVjBkMjl5YTE5cFpDQjkiOworCQkJdGltZW91dCA9IDYwOworCQkJYXJ0aWZhY3RMYWJlbCA9IG5vcm1hbGl6ZUFydGlmYWN0TGFiZWwoYXJ0aWZhY3ROYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRENBRV9JTlZFTlRPUllfVE9TQ0E6CisJCWNhc2UgRENBRV9JTlZFTlRPUllfSlNPTjoKKwkJY2FzZSBEQ0FFX0lOVkVOVE9SWV9QT0xJQ1k6CisJCWNhc2UgRENBRV9JTlZFTlRPUllfRE9DOgorCQljYXNlIERDQUVfSU5WRU5UT1JZX0JMVUVQUklOVDoKKwkJY2FzZSBEQ0FFX0lOVkVOVE9SWV9FVkVOVDogeworCQkJYXJ0aWZhY3ROYW1lID0gZ2V0RGNhZUFydGlmYWN0TmFtZShhcnRpZmFjdFR5cGVFbnVtLCBhcnRpZmFjdFR5cGUpOworCQkJcGF5bG9hZERhdGEgPSAid2lsbCBiZSBvdmVycmlkZSBsYXRlciI7CisJCQl0aW1lb3V0ID0gNjA7CisJCQlhcnRpZmFjdExhYmVsID0gbm9ybWFsaXplQXJ0aWZhY3RMYWJlbChhcnRpZmFjdE5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNVVJBTk9fUEtHOiB7CisJCQlhcnRpZmFjdE5hbWUgPSBhcnRpZmFjdFR5cGUgKyAib3JnLm9wZW5zdGFjay5SYWxseS56aXAiOworCQkJcGF5bG9hZERhdGEgPSAiT0RNNE1UUmpOemt4Wmpjd1lUbGtNams0WkdRMk9ERTRNVGhtTmpnME4yWT0iOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBEQ0FFX1BPTElDWTogeworCQkJYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3RUeXBlICsgImRjYWVfcG9saWN5LmVtZiI7CisJCQlwYXlsb2FkRGF0YSA9ICJ3aWxsIGJlIG92ZXJyaWRlIGxhdGVyIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRENBRV9KU09OOiB7CisJCQlhcnRpZmFjdE5hbWUgPSBhcnRpZmFjdFR5cGUgKyAiZGNhZV9wb2xpY3kuanNvbiI7CisJCQlwYXlsb2FkRGF0YSA9ICJlMzA9IjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUFVQUEVUOgorCQljYXNlIENIRUY6CisJCWNhc2UgREdfWE1MOgorCQljYXNlIFlBTkc6IHsKKwkJCWFydGlmYWN0TmFtZSA9IGdlbmVyYXRlVVVJRGZvclN1Zml4KCkgKyBhcnRpZmFjdFR5cGUgKyAieWFuZ1htbC54bWwiOworCQkJcGF5bG9hZERhdGEgPSAiUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWo4K0RRbzhaR0YwWVQ0TkNpQWdQSE53YjNKMGN6NE5DaUFnSUNBOGNHVnljMjl1UGcwS0lDQWdJQ0FnUEc1aGJXVStUR2x2Ym1Wc0lFRnVaSEpsY3lCTlpYTnphVHd2Ym1GdFpUNE5DaUFnSUNBZ0lEeGlhWEowYUdSaGVUNHhPVGczTFRBMkxUSTBWREF3T2pBd09qQXdMVEF3T2pBd1BDOWlhWEowYUdSaGVUNE5DaUFnSUNBOEwzQmxjbk52Ymo0TkNpQWdJQ0E4Y0dWeWMyOXVQZzBLSUNBZ0lDQWdQRzVoYldVK1EzSnBjM1JwWVc1dklGSnZibUZzWkc4OEwyNWhiV1UrRFFvZ0lDQWdJQ0E4WW1seWRHaGtZWGsrTVRrNE5TMHdNaTB3TlZRd01Eb3dNRG93TUMwd01Eb3dNRHd2WW1seWRHaGtZWGsrRFFvZ0lDQWdQQzl3WlhKemIyNCtEUW9nSUNBZ1BIUmxZVzArRFFvZ0lDQWdJQ0E4Ym1GdFpUNUdReUJDWVhKalpXeHZibUU4TDI1aGJXVStEUW9nSUNBZ0lDQThjR3hoZVdWeVBnMEtJQ0FnSUNBZ0lDQThibUZ0WlQ1TWFXOXVaV3dnUVc1a2NtVnpJRTFsYzNOcFBDOXVZVzFsUGcwS0lDQWdJQ0FnSUNBOGMyVmhjMjl1UGtOb1lXMXdhVzl1Y3lCTVpXRm5kV1VnTWpBeE5DMHlNREUxUEM5elpXRnpiMjQrRFFvZ0lDQWdJQ0FnSUR4dWRXMWlaWEkrTVRBOEwyNTFiV0psY2o0TkNpQWdJQ0FnSUNBZ1BITmpiM0psY3o0ME16d3ZjMk52Y21WelBnMEtJQ0FnSUNBZ1BDOXdiR0Y1WlhJK0RRb2dJQ0FnUEM5MFpXRnRQZzBLSUNBZ0lEeDBaV0Z0UGcwS0lDQWdJQ0FnUEc1aGJXVStVbVZoYkNCTllXUnlhV1E4TDI1aGJXVStEUW9nSUNBZ0lDQThjR3hoZVdWeVBnMEtJQ0FnSUNBZ0lDQThibUZ0WlQ1RGNtbHpkR2xoYm04Z1VtOXVZV3hrYnp3dmJtRnRaVDROQ2lBZ0lDQWdJQ0FnUEhObFlYTnZiajVEYUdGdGNHbHZibk1nVEdWaFozVmxJREl3TVRRdE1qQXhOVHd2YzJWaGMyOXVQZzBLSUNBZ0lDQWdJQ0E4Ym5WdFltVnlQamM4TDI1MWJXSmxjajROQ2lBZ0lDQWdJQ0FnUEhOamIzSmxjejQwT0R3dmMyTnZjbVZ6UGcwS0lDQWdJQ0FnUEM5d2JHRjVaWEkrRFFvZ0lDQWdQQzkwWldGdFBnMEtJQ0E4TDNOd2IzSjBjejROQ2cwS1BDOWtZWFJoUGc9PSI7CisJCQl0aW1lb3V0ID0gMTU7CisJCQlhcnRpZmFjdExhYmVsID0gbm9ybWFsaXplQXJ0aWZhY3RMYWJlbChhcnRpZmFjdE5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBWRl9MSUNFTlNFOgorCQljYXNlIFZFTkRPUl9MSUNFTlNFOgorCQljYXNlIE1PREVMX0lOVkVOVE9SWV9QUk9GSUxFOgorCQljYXNlIE1PREVMX1FVRVJZX1NQRUM6CisJCWNhc2UgVk5GX0NBVEFMT0c6CisJCWNhc2UgWUFOR19YTUw6IHsKKwkJCWFydGlmYWN0TmFtZSA9IGdlbmVyYXRlVVVJRGZvclN1Zml4KCkgKyBhcnRpZmFjdFR5cGUgKyAieWFuZ1htbC54bWwiOworCQkJcGF5bG9hZERhdGEgPSAiUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWo4K0RRbzhaR0YwWVQ0TkNpQWdQSE53YjNKMGN6NE5DaUFnSUNBOGNHVnljMjl1UGcwS0lDQWdJQ0FnUEc1aGJXVStUR2x2Ym1Wc0lFRnVaSEpsY3lCTlpYTnphVHd2Ym1GdFpUNE5DaUFnSUNBZ0lEeGlhWEowYUdSaGVUNHhPVGczTFRBMkxUSTBWREF3T2pBd09qQXdMVEF3T2pBd1BDOWlhWEowYUdSaGVUNE5DaUFnSUNBOEwzQmxjbk52Ymo0TkNpQWdJQ0E4Y0dWeWMyOXVQZzBLSUNBZ0lDQWdQRzVoYldVK1EzSnBjM1JwWVc1dklGSnZibUZzWkc4OEwyNWhiV1UrRFFvZ0lDQWdJQ0E4WW1seWRHaGtZWGsrTVRrNE5TMHdNaTB3TlZRd01Eb3dNRG93TUMwd01Eb3dNRHd2WW1seWRHaGtZWGsrRFFvZ0lDQWdQQzl3WlhKemIyNCtEUW9nSUNBZ1BIUmxZVzArRFFvZ0lDQWdJQ0E4Ym1GdFpUNUdReUJDWVhKalpXeHZibUU4TDI1aGJXVStEUW9nSUNBZ0lDQThjR3hoZVdWeVBnMEtJQ0FnSUNBZ0lDQThibUZ0WlQ1TWFXOXVaV3dnUVc1a2NtVnpJRTFsYzNOcFBDOXVZVzFsUGcwS0lDQWdJQ0FnSUNBOGMyVmhjMjl1UGtOb1lXMXdhVzl1Y3lCTVpXRm5kV1VnTWpBeE5DMHlNREUxUEM5elpXRnpiMjQrRFFvZ0lDQWdJQ0FnSUR4dWRXMWlaWEkrTVRBOEwyNTFiV0psY2o0TkNpQWdJQ0FnSUNBZ1BITmpiM0psY3o0ME16d3ZjMk52Y21WelBnMEtJQ0FnSUNBZ1BDOXdiR0Y1WlhJK0RRb2dJQ0FnUEM5MFpXRnRQZzBLSUNBZ0lEeDBaV0Z0UGcwS0lDQWdJQ0FnUEc1aGJXVStVbVZoYkNCTllXUnlhV1E4TDI1aGJXVStEUW9nSUNBZ0lDQThjR3hoZVdWeVBnMEtJQ0FnSUNBZ0lDQThibUZ0WlQ1RGNtbHpkR2xoYm04Z1VtOXVZV3hrYnp3dmJtRnRaVDROQ2lBZ0lDQWdJQ0FnUEhObFlYTnZiajVEYUdGdGNHbHZibk1nVEdWaFozVmxJREl3TVRRdE1qQXhOVHd2YzJWaGMyOXVQZzBLSUNBZ0lDQWdJQ0E4Ym5WdFltVnlQamM4TDI1MWJXSmxjajROQ2lBZ0lDQWdJQ0FnUEhOamIzSmxjejQwT0R3dmMyTnZjbVZ6UGcwS0lDQWdJQ0FnUEM5d2JHRjVaWEkrRFFvZ0lDQWdQQzkwWldGdFBnMEtJQ0E4TDNOd2IzSjBjejROQ2cwS1BDOWtZWFJoUGc9PSI7CisJCQl0aW1lb3V0ID0gMDsKKwkJCWFydGlmYWN0TGFiZWwgPSBub3JtYWxpemVBcnRpZmFjdExhYmVsKGFydGlmYWN0TmFtZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9USEVSOiB7CisJCQlhcnRpZmFjdE5hbWUgPSBnZW5lcmF0ZVVVSURmb3JTdWZpeCgpICsgYXJ0aWZhY3RUeXBlICsgIm90aGVyLnBkZiI7CisJCQlwYXlsb2FkRGF0YSA9ICJhR1ZoZEY5MFpXMXdiR0YwWlY5MlpYSnphVzl1T2lBeU1ERXpMVEExTFRJekRRb05DbVJsYzJOeWFYQjBhVzl1T2lCVGFXMXdiR1VnZEdWdGNHeGhkR1VnZEc4Z1pHVndiRzk1SUdFZ2MzUmhZMnNnZDJsMGFDQjBkMjhnZG1seWRIVmhiQ0J0WVdOb2FXNWxJR2x1YzNSaGJtTmxjdzBLRFFwd1lYSmhiV1YwWlhKek9nMEtJQ0JwYldGblpWOXVZVzFsWHpFNkRRb2dJQ0FnZEhsd1pUb2djM1J5YVc1bkRRb2dJQ0FnYkdGaVpXdzZJRWx0WVdkbElFNWhiV1VOQ2lBZ0lDQmtaWE5qY21sd2RHbHZiam9nVTBOUFNVMUJSMFVnVTNCbFkybG1lU0JoYmlCcGJXRm5aU0J1WVcxbElHWnZjaUJwYm5OMFlXNWpaVEVOQ2lBZ0lDQmtaV1poZFd4ME9pQmphWEp5YjNNdE1DNHpMakV0ZURnMlh6WTBEUW9nSUdsdFlXZGxYMjVoYldWZk1qb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nU1cxaFoyVWdUbUZ0WlEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOUpUVUZIUlNCVGNHVmphV1o1SUdGdUlHbHRZV2RsSUc1aGJXVWdabTl5SUdsdWMzUmhibU5sTWcwS0lDQWdJR1JsWm1GMWJIUTZJR05wY25KdmN5MHdMak11TVMxNE9EWmZOalFOQ2lBZ2JtVjBkMjl5YTE5cFpEb05DaUFnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNCc1lXSmxiRG9nVG1WMGQyOXlheUJKUkEwS0lDQWdJR1JsYzJOeWFYQjBhVzl1T2lCVFEwOU9SVlJYVDFKTElFNWxkSGR2Y21zZ2RHOGdZbVVnZFhObFpDQm1iM0lnZEdobElHTnZiWEIxZEdVZ2FXNXpkR0Z1WTJVTkNpQWdJQ0JvYVdSa1pXNDZJSFJ5ZFdVTkNpQWdJQ0JqYjI1emRISmhhVzUwY3pvTkNpQWdJQ0FnSUMwZ2JHVnVaM1JvT2lCN0lHMXBiam9nTml3Z2JXRjRPaUE0SUgwTkNpQWdJQ0FnSUNBZ1pHVnpZM0pwY0hScGIyNDZJRkJoYzNOM2IzSmtJR3hsYm1kMGFDQnRkWE4wSUdKbElHSmxkSGRsWlc0Z05pQmhibVFnT0NCamFHRnlZV04wWlhKekxnMEtJQ0FnSUNBZ0xTQnlZVzVuWlRvZ2V5QnRhVzQ2SURZc0lHMWhlRG9nT0NCOURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJTWVc1blpTQmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM1poYkhWbGN6b05DaUFnSUNBZ0lDQWdMU0J0TVM1emJXRnNiQTBLSUNBZ0lDQWdJQ0F0SUcweExtMWxaR2wxYlEwS0lDQWdJQ0FnSUNBdElHMHhMbXhoY21kbERRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJCYkd4dmQyVmtJSFpoYkhWbGN5QmtaWE5qY21sd2RHbHZiZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piWVMxNlFTMWFNQzA1WFNzaURRb2dJQ0FnSUNBZ0lHUmxjMk55YVhCMGFXOXVPaUJRWVhOemQyOXlaQ0J0ZFhOMElHTnZibk5wYzNRZ2IyWWdZMmhoY21GamRHVnljeUJoYm1RZ2JuVnRZbVZ5Y3lCdmJteDVMZzBLSUNBZ0lDQWdMU0JoYkd4dmQyVmtYM0JoZEhSbGNtNDZJQ0piUVMxYVhTdGJZUzE2UVMxYU1DMDVYU29pRFFvZ0lDQWdJQ0FnSUdSbGMyTnlhWEIwYVc5dU9pQlFZWE56ZDI5eVpDQnRkWE4wSUhOMFlYSjBJSGRwZEdnZ1lXNGdkWEJ3WlhKallYTmxJR05vWVhKaFkzUmxjaTROQ2lBZ0lDQWdJQzBnWTNWemRHOXRYMk52Ym5OMGNtRnBiblE2SUc1dmRtRXVhMlY1Y0dGcGNnMEtJQ0FnSUNBZ0lDQmtaWE5qY21sd2RHbHZiam9nUTNWemRHOXRJR1JsYzJOeWFYQjBhVzl1RFFvTkNuSmxjMjkxY21ObGN6b05DaUFnYlhsZmFXNXpkR0Z1WTJVeE9nMEtJQ0FnSUhSNWNHVTZJRTlUT2pwT2IzWmhPanBUWlhKMlpYSU5DaUFnSUNCd2NtOXdaWEowYVdWek9nMEtJQ0FnSUNBZ2FXMWhaMlU2SUhzZ1oyVjBYM0JoY21GdE9pQnBiV0ZuWlY5dVlXMWxYekVnZlEwS0lDQWdJQ0FnWm14aGRtOXlPaUJ0TVM1emJXRnNiQTBLSUNBZ0lDQWdibVYwZDI5eWEzTTZEUW9nSUNBZ0lDQWdJQzBnYm1WMGQyOXlheUE2SUhzZ1oyVjBYM0JoY21GdElEb2dibVYwZDI5eWExOXBaQ0I5RFFvZ0lHMTVYMmx1YzNSaGJtTmxNam9OQ2lBZ0lDQjBlWEJsT2lCUFV6bzZUbTkyWVRvNlUyVnlkbVZ5RFFvZ0lDQWdjSEp2Y0dWeWRHbGxjem9OQ2lBZ0lDQWdJR2x0WVdkbE9pQjdJR2RsZEY5d1lYSmhiVG9nYVcxaFoyVmZibUZ0WlY4eUlIME5DaUFnSUNBZ0lHWnNZWFp2Y2pvZ2JURXVkR2x1ZVEwS0lDQWdJQ0FnYm1WMGQyOXlhM002RFFvZ0lDQWdJQ0FnSUMwZ2JtVjBkMjl5YXlBNklIc2daMlYwWDNCaGNtRnRJRG9nYm1WMGQyOXlhMTlwWkNCOSI7CisJCQl0aW1lb3V0ID0gMDsKKwkJCWFydGlmYWN0TGFiZWwgPSBub3JtYWxpemVBcnRpZmFjdExhYmVsKGFydGlmYWN0TmFtZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNIRUxMX1NDUklQVDoKKwkJZGVmYXVsdDogey8vIGR1bW15CisJCQlhcnRpZmFjdE5hbWUgPSBnZW5lcmF0ZVVVSURmb3JTdWZpeCgpICsgInRlc3RBcnRpZmFjdC5zaCI7CisJCQlwYXlsb2FkRGF0YSA9ICJkR1Z6ZEE9PSI7CisJCQlhcnRpZmFjdExhYmVsID0gbm9ybWFsaXplQXJ0aWZhY3RMYWJlbChhcnRpZmFjdE5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJfQorCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMgPSBuZXcgQXJ0aWZhY3RSZXFEZXRhaWxzKGFydGlmYWN0TmFtZSwgYXJ0aWZhY3RUeXBlLCBhcnRpZmFjdERlc2NyaXB0aW9uLCBwYXlsb2FkRGF0YSwgYXJ0aWZhY3RMYWJlbCk7CisJCWFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdEdyb3VwVHlwZShBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5nZXRUeXBlKCkpOworCQlhcnRpZmFjdERldGFpbHMuc2V0VXJsKHVybCk7CisJCWFydGlmYWN0RGV0YWlscy5zZXRUaW1lb3V0KHRpbWVvdXQpOworCQlhcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3REaXNwbGF5TmFtZShhcnRpZmFjdExhYmVsKTsKKwkJcmV0dXJuIGFydGlmYWN0RGV0YWlsczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGNhZUFydGlmYWN0TmFtZShBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZUVudW0sIFN0cmluZyBhcnRpZmFjdFR5cGUpIHsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9IG51bGw7CisJCXN3aXRjaCAoYXJ0aWZhY3RUeXBlRW51bSkgeworCQljYXNlIERDQUVfSU5WRU5UT1JZX1RPU0NBOiB7CisJCQlhcnRpZmFjdE5hbWUgPSBnZW5lcmF0ZVVVSURmb3JTdWZpeCgpICsgYXJ0aWZhY3RUeXBlICsgIl90b3NjYVNhbXBsZUFydGlmYWN0LnltbCI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIERDQUVfSU5WRU5UT1JZX0pTT046IHsKKwkJCWFydGlmYWN0TmFtZSA9IGdlbmVyYXRlVVVJRGZvclN1Zml4KCkgKyBhcnRpZmFjdFR5cGUgKyAiX2pzb25TYW1wbGVBcnRpZmFjdC5qc29uIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRENBRV9JTlZFTlRPUllfUE9MSUNZOiB7CisJCQlhcnRpZmFjdE5hbWUgPSBnZW5lcmF0ZVVVSURmb3JTdWZpeCgpICsgYXJ0aWZhY3RUeXBlICsgIl9lbWZTYW1wbGVBcnRpZmFjdC5lbWYiOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBEQ0FFX0lOVkVOVE9SWV9ET0M6IHsKKwkJCWFydGlmYWN0TmFtZSA9IGdlbmVyYXRlVVVJRGZvclN1Zml4KCkgKyBhcnRpZmFjdFR5cGUgKyAiX2RvY1NhbXBsZUFydGlmYWN0LmRvYyI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIERDQUVfSU5WRU5UT1JZX0JMVUVQUklOVDogeworCQkJYXJ0aWZhY3ROYW1lID0gZ2VuZXJhdGVVVUlEZm9yU3VmaXgoKSArIGFydGlmYWN0VHlwZSArICJfYmx1ZVByaW50U2FtcGxlQXJ0aWZhY3QueG1sIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRENBRV9JTlZFTlRPUllfRVZFTlQ6IHsKKwkJCWFydGlmYWN0TmFtZSA9IGdlbmVyYXRlVVVJRGZvclN1Zml4KCkgKyBhcnRpZmFjdFR5cGUgKyAiX2V2ZW50U2FtcGxlQXJ0aWZhY3QueG1sIjsKKwkJCWJyZWFrOworCQl9CisJCX0KKwkJcmV0dXJuIGFydGlmYWN0TmFtZTsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1BdWRpdCBtZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnU3VjY2VzcygpIHsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCgpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKCJkZWZhdWx0SW1wb3J0UmVzb3VyY2VOYW1lLnlhbWwiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlJlc291cmNlIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKCIwLjEiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRGdWxsTmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZSgiIik7CisJCXJldHVybiBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworCisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGdldERlZmF1bHRJbXBvcnRSZXNvdXJjZUF1ZGl0TXNnRmFpbHVyZShFcnJvckluZm8gZXJyb3JJbmZvLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzKSB7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRS5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJSZXNvdXJjZSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0VG9zY2FOb2RlVHlwZSgiIik7CisJCXJldHVybiBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworCisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGdldERlZmF1bHRDZXJ0aWZpY2F0aW9uUmVxdWVzdEF1ZGl0TXNnU3VjY2VzcygpIHsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCgpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihBdWRpdGluZ0FjdGlvbkVudW0uQ0VSVElGSUNBVElPTl9SRVFVRVNUX1JFU09VUkNFLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VOYW1lKCJkZWZhdWx0UmVzb3VyY2VOYW1lIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKCJSZXNvdXJjZSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbigiMC4xIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJOYW1lKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikuZ2V0RnVsbE5hbWUoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldENvbW1lbnQoIiIpOworCQlyZXR1cm4gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBnZXREZWZhdWx0Q2VydGlmaWNhdGlvblJlcXVlc3RBdWRpdE1zZ0ZhaWx1cmUoRXJyb3JJbmZvIGVycm9ySW5mbywgTGlzdDxTdHJpbmc+IHZhcmlhYmxlcykgeworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKEF1ZGl0aW5nQWN0aW9uRW51bS5DRVJUSUZJQ0FUSU9OX1JFUVVFU1RfUkVTT1VSQ0UuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiUmVzb3VyY2UiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiMC4xIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclZlcnNpb24oIjAuMSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZShFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLmdldEZ1bGxOYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDb21tZW50KCIiKTsKKwkJcmV0dXJuIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBnZXREZWZhdWx0RXh0ZXJuYWxBdWRpdE9iamVjdChBc3NldFR5cGVFbnVtIGFzc2V0VHlwZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbiwgU3RyaW5nIHF1ZXJ5KSB7CisKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkRXh0ZXJuYWxBdWRpdCA9IG5ldyBFeHBlY3RlZEV4dGVybmFsQXVkaXQoKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEF1ZGl0LnNldEFDVElPTihhY3Rpb24uZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEF1ZGl0LnNldENPTlNVTUVSX0lEKCJjaSIpOworCQlleHBlY3RlZEV4dGVybmFsQXVkaXQuc2V0UkVTT1VSQ0VfVVJMKCIvYXNkYy92MS9jYXRhbG9nLyIgKyBhc3NldFR5cGUuZ2V0VmFsdWUoKSArIChxdWVyeSA9PSBudWxsID8gIiIgOiBxdWVyeSkpOworCQlleHBlY3RlZEV4dGVybmFsQXVkaXQuc2V0U1RBVFVTKCIyMDAiKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEF1ZGl0LnNldERFU0MoIk9LIik7CisJCXJldHVybiBleHBlY3RlZEV4dGVybmFsQXVkaXQ7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBnZXREZWZhdWx0QXNzZXRMaXN0QXVkaXQoQXNzZXRUeXBlRW51bSBhc3NldFR5cGUsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEFjdGlvbikgeworCisJCS8vIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdCA9IG5ldworCQkvLyBFeHBlY3RlZEV4dGVybmFsQXVkaXQoKTsKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0ID0gZ2V0RGVmYXVsdEV4dGVybmFsQXVkaXRPYmplY3QoYXNzZXRUeXBlLCBhdWRpdEFjdGlvbiwgbnVsbCk7CisJCXJldHVybiBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGdldERlZmF1bHRGaWx0ZXJlZEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlLCBTdHJpbmcgcXVlcnkpIHsKKworCQkvLyBFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3QgPSBuZXcKKwkJLy8gRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0KCk7CisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdCA9IGdldERlZmF1bHRFeHRlcm5hbEF1ZGl0T2JqZWN0KGFzc2V0VHlwZSwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNULCBxdWVyeSk7CisJCXJldHVybiBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGdldERlZmF1bHRFeHRlcm5hbEFydGlmYWN0QXVkaXRTdWNjZXNzKEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uLCBTdHJpbmcgY29tcG9uZW50VVVJRCkgeworCisJCS8vIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdCA9IG5ldworCQkvLyBFeHBlY3RlZEV4dGVybmFsQXVkaXQoKTsKKworCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQgPSBnZXREZWZhdWx0RXh0ZXJuYWxBdWRpdE9iamVjdChhc3NldFR5cGUsIGFjdGlvbiwgbnVsbCk7CisJCWV4cGVjdGVkRXh0ZXJuYWxBcnRpZmFjdEF1ZGl0LnNldE1PRElGSUVSKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmdldE1vZGlmaWVyU3RyaW5nKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVcGRhdGVyRnVsbE5hbWUoKSwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVzZXJJZExhc3RVcGRhdGVyKCkpKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuc2V0UFJFVl9BUlRJRkFDVF9VVUlEKCIiKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuc2V0Q1VSUl9BUlRJRkFDVF9VVUlEKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdFVVSUQoKSk7CisJCWV4cGVjdGVkRXh0ZXJuYWxBcnRpZmFjdEF1ZGl0LnNldEFSVElGQUNUX0RBVEEoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBcnRpZmFjdERhdGFBdWRpdChhcnRpZmFjdERlZmluaXRpb24pKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKGV4cGVjdGVkRXh0ZXJuYWxBcnRpZmFjdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpICsgIi8iICsgY29tcG9uZW50VVVJRCArICIvYXJ0aWZhY3RzIik7CisJCXJldHVybiBleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGdldERlZmF1bHRFeHRlcm5hbEFydGlmYWN0QXVkaXRTdWNjZXNzKEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uLCBTdHJpbmcgY29tcG9uZW50VVVJRCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lKSB7CisKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkRXh0ZXJuYWxBcnRpZmFjdEF1ZGl0ID0gZ2V0RGVmYXVsdEV4dGVybmFsQXJ0aWZhY3RBdWRpdFN1Y2Nlc3MoYXNzZXRUeXBlLCBhY3Rpb24sIGFydGlmYWN0RGVmaW5pdGlvbiwgY29tcG9uZW50VVVJRCk7CisJCWV4cGVjdGVkRXh0ZXJuYWxBcnRpZmFjdEF1ZGl0LnNldFJFU09VUkNFX1VSTCgiL2FzZGMvdjEvY2F0YWxvZy8iICsgYXNzZXRUeXBlLmdldFZhbHVlKCkgKyAiLyIgKyBjb21wb25lbnRVVUlEICsgIi9yZXNvdXJjZUluc3RhbmNlcy8iICsgcmVzb3VyY2VJbnN0YW5jZU5hbWUgKyAiL2FydGlmYWN0cyIpOworCQlyZXR1cm4gZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQ7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZEV4dGVybmFsQXVkaXQgZ2V0RGVmYXVsdEV4dGVybmFsQXJ0aWZhY3RBdWRpdEZhaWx1cmUoQXNzZXRUeXBlRW51bSBhc3NldFR5cGUsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb24sIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24sIFN0cmluZyBjb21wb25lbnRVVUlELCBFcnJvckluZm8gZXJyb3JJbmZvLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzKSB7CisKKwkJLy8gRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkRXh0ZXJuYWxBcnRpZmFjdEF1ZGl0ID0gbmV3CisJCS8vIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCgpOworCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdCA9IGdldERlZmF1bHRFeHRlcm5hbEF1ZGl0T2JqZWN0KGFzc2V0VHlwZSwgYWN0aW9uLCBudWxsKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuc2V0TU9ESUZJRVIoQXVkaXRWYWxpZGF0aW9uVXRpbHMuZ2V0TW9kaWZpZXJTdHJpbmcoYXJ0aWZhY3REZWZpbml0aW9uLmdldFVwZGF0ZXJGdWxsTmFtZSgpLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0VXNlcklkTGFzdFVwZGF0ZXIoKSkpOworCQlleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdC5zZXRQUkVWX0FSVElGQUNUX1VVSUQoIiIpOworCQlleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdC5zZXRDVVJSX0FSVElGQUNUX1VVSUQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VVVJRCgpKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuc2V0QVJUSUZBQ1RfREFUQShBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEFydGlmYWN0RGF0YUF1ZGl0KGFydGlmYWN0RGVmaW5pdGlvbikpOworCQlleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdC5zZXRSRVNPVVJDRV9VUkwoZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuZ2V0UkVTT1VSQ0VfVVJMKCkgKyAiLyIgKyBjb21wb25lbnRVVUlEICsgIi9hcnRpZmFjdHMiKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuc2V0U1RBVFVTKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkRXh0ZXJuYWxBcnRpZmFjdEF1ZGl0LnNldERFU0MoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKSk7CisJCXJldHVybiBleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGdldERlZmF1bHRFeHRlcm5hbEFydGlmYWN0QXVkaXRGYWlsdXJlKEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uLCBTdHJpbmcgY29tcG9uZW50VVVJRCwgRXJyb3JJbmZvIGVycm9ySW5mbywgTGlzdDxTdHJpbmc+IHZhcmlhYmxlcywKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSkgeworCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdCA9IGdldERlZmF1bHRFeHRlcm5hbEFydGlmYWN0QXVkaXRGYWlsdXJlKGFzc2V0VHlwZSwgYWN0aW9uLCBhcnRpZmFjdERlZmluaXRpb24sIGNvbXBvbmVudFVVSUQsIGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRFeHRlcm5hbEFydGlmYWN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKCIvYXNkYy92MS9jYXRhbG9nLyIgKyBhc3NldFR5cGUuZ2V0VmFsdWUoKSArICIvIiArIGNvbXBvbmVudFVVSUQgKyAiL3Jlc291cmNlSW5zdGFuY2VzLyIgKyByZXNvdXJjZUluc3RhbmNlTmFtZSArICIvYXJ0aWZhY3RzIik7CisJCXJldHVybiBleHBlY3RlZEV4dGVybmFsQXJ0aWZhY3RBdWRpdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBnZXRGaWx0ZXJlZEFzc2V0TGlzdEF1ZGl0Q2F0ZWdvcnlOb3RGb3VuZChBc3NldFR5cGVFbnVtIGFzc2V0VHlwZSwgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgY2F0ZWdvcnkpIHsKKworCQkvLyBFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3QgPSBuZXcKKwkJLy8gRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0KCk7CisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdCA9IGdldERlZmF1bHRFeHRlcm5hbEF1ZGl0T2JqZWN0KGFzc2V0VHlwZSwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNULCBxdWVyeSk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0LnNldFNUQVRVUygiNDA0Iik7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBudWxsOworCQl0cnkgeworCQkJZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQubmFtZSgpKTsKKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJU3RyaW5nIGRlc2MgPSAoZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpICsgIjogIiArIGVycm9ySW5mby5nZXRNZXNzYWdlKCkpLnJlcGxhY2UoIiUyIiwgImNhdGVnb3J5IikucmVwbGFjZSgiJTMiLCBjYXRlZ29yeSkucmVwbGFjZSgiJTEiLCAicmVzb3VyY2UiKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3Quc2V0REVTQyhkZXNjKTsKKworCQlyZXR1cm4gZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBnZXREZWZhdWx0QXNzZXRNZXRhZGF0YUF1ZGl0KEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlLCBDb21wb25lbnQgY29tcG9uZW50KSB7CisKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCgpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdCA9IGdldERlZmF1bHRFeHRlcm5hbEF1ZGl0T2JqZWN0KGFzc2V0VHlwZSwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQSwgbnVsbCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0LnNldFJFU09VUkNFX1VSTChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdC5nZXRSRVNPVVJDRV9VUkwoKSArICIvIiArIGNvbXBvbmVudC5nZXRVVUlEKCkgKyAiL21ldGFkYXRhIik7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0LnNldFJFU09VUkNFX05BTUUoY29tcG9uZW50LmdldE5hbWUoKSk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0LnNldFJFU09VUkNFX1RZUEUoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKS5nZXRWYWx1ZSgpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3Quc2V0U0VSVklDRV9JTlNUQU5DRV9JRChjb21wb25lbnQuZ2V0VVVJRCgpKTsKKwkJcmV0dXJuIGV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0OworCisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZEV4dGVybmFsQXVkaXQgZ2V0RGVmYXVsdEFzc2V0TWV0YWRhdGFBdWRpdEZhaWx1cmUoQXNzZXRUeXBlRW51bSBhc3NldFR5cGUsIFN0cmluZyBzZXJ2aWNlVXVpZCwgU3RyaW5nIHJlc291cmNlVHlwZSkgeworCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEV4dGVybmFsQXVkaXQoKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3QgPSBnZXREZWZhdWx0RXh0ZXJuYWxBdWRpdE9iamVjdChhc3NldFR5cGUsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfQVNTRVRfTUVUQURBVEEsIG51bGwpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdC5zZXRTVEFUVVMoIjQwNCIpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdC5zZXRERVNDKCJPSyIpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdC5zZXRSRVNPVVJDRV9VUkwoZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3QuZ2V0UkVTT1VSQ0VfVVJMKCkgKyAiLyIgKyBzZXJ2aWNlVXVpZCArICIvbWV0YWRhdGEiKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdEphdmFPYmplY3Quc2V0UkVTT1VSQ0VfVFlQRShyZXNvdXJjZVR5cGUpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0SmF2YU9iamVjdC5zZXRTRVJWSUNFX0lOU1RBTkNFX0lEKHNlcnZpY2VVdWlkKTsKKwkJcmV0dXJuIGV4cGVjdGVkQXNzZXRMaXN0QXVkaXRKYXZhT2JqZWN0OworCisJfQorCisJLy8gQ2F0ZWdvcnkvU3ViY2F0ZWdvcnkvR3JvdXAKKwlwdWJsaWMgc3RhdGljIENhdGVnb3J5RGVmaW5pdGlvbiBnZXREZWZhdWx0Q2F0ZWdvcnkoKSB7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQlwcm9kdWN0Q2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIkNhdGVnb3J5MSIpOworCQlyZXR1cm4gcHJvZHVjdENhdGVnb3J5RGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBnZXREZWZhdWx0U3ViQ2F0ZWdvcnkoKSB7CisJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uID0gbmV3IFN1YkNhdGVnb3J5RGVmaW5pdGlvbigpOworCQlwcm9kdWN0U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlN1YkNhdGVnb3J5MSIpOworCQlyZXR1cm4gcHJvZHVjdFN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEdyb3VwaW5nRGVmaW5pdGlvbiBnZXREZWZhdWx0R3JvdXAoKSB7CisJCUdyb3VwaW5nRGVmaW5pdGlvbiBwcm9kdWN0R3JvdXBEZWZpbml0aW9uID0gbmV3IEdyb3VwaW5nRGVmaW5pdGlvbigpOworCQlwcm9kdWN0R3JvdXBEZWZpbml0aW9uLnNldE5hbWUoIkdyb3VwaW5nMSIpOworCQlyZXR1cm4gcHJvZHVjdEdyb3VwRGVmaW5pdGlvbjsKKwl9CisKKwkvLyBQcm9kdWN0CisKKwlwdWJsaWMgc3RhdGljIFByb2R1Y3RSZXFEZXRhaWxzIGdldERlZmF1bHRQcm9kdWN0KCkgeworCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb2R1Y3RSZXFEZXRhaWxzKCJQcm9kdWN0MSIsIG51bGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvZHVjdFJlcURldGFpbHMgZ2V0RGVmYXVsdFByb2R1Y3QoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9kdWN0UmVxRGV0YWlscyhuYW1lLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb2R1Y3RSZXFEZXRhaWxzIGdldERlZmF1bHRQcm9kdWN0KENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSkgeworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CisJCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvZHVjdFJlcURldGFpbHMoIkNpUHJvZHVjdDEiLCBjYXRlZ29yaWVzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb2R1Y3RSZXFEZXRhaWxzIGdldERlZmF1bHRQcm9kdWN0KFN0cmluZyBuYW1lLCBDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnkpIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOworCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb2R1Y3RSZXFEZXRhaWxzKG5hbWUsIGNhdGVnb3JpZXMpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvZHVjdFJlcURldGFpbHMgZ2V0RGVmYXVsdFByb2R1Y3QoTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMpIHsKKwkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9kdWN0UmVxRGV0YWlscygiQ2lQcm9kdWN0MSIsIGNhdGVnb3JpZXMpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvZHVjdFJlcURldGFpbHMgZ2V0RGVmYXVsdFByb2R1Y3QoU3RyaW5nIG5hbWUsIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzKSB7CisJCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvZHVjdFJlcURldGFpbHMobmFtZSwgY2F0ZWdvcmllcyk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUHJvZHVjdFJlcURldGFpbHMgY3JlYXRlRGVmYXVsdFByb2R1Y3RSZXFEZXRhaWxzKFN0cmluZyBuYW1lLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcykgeworCQlQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0ID0gbmV3IFByb2R1Y3RSZXFEZXRhaWxzKG5hbWUpOworCQlBcnJheUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRhZ3MuYWRkKG5hbWUpOworCQlwcm9kdWN0LnNldFRhZ3ModGFncyk7CisJCXByb2R1Y3Quc2V0UHJvamVjdENvZGUoIjEyMzQ1Iik7CisJCXByb2R1Y3Quc2V0SWNvbigibXlJY29uIik7CisJCUFycmF5TGlzdDxTdHJpbmc+IGNvbnRhY3RzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCS8vIGNvbnRhY3RzLmFkZChFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNUMSkuZ2V0VXNlcklkKCkpOworCQkvLyBjb250YWN0cy5hZGQoRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLlBST0RVQ1RfU1RSQVRFR0lTVDIpLmdldFVzZXJJZCgpKTsKKwkJY29udGFjdHMuYWRkKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5QUk9EVUNUX01BTkFHRVIxKS5nZXRVc2VySWQoKSk7CisJCS8vIGNvbnRhY3RzLmFkZChFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uUFJPRFVDVF9NQU5BR0VSMikuZ2V0VXNlcklkKCkpOworCQlwcm9kdWN0LnNldENvbnRhY3RzKGNvbnRhY3RzKTsKKwkJcHJvZHVjdC5zZXRDYXRlZ29yaWVzKGNhdGVnb3JpZXMpOworCQlTdHJpbmcgZnVsbE5hbWUgPSAiVGhpcyBpcyBteSBmdWxsIG5hbWU6ICIgKyBuYW1lOworCQlwcm9kdWN0LnNldEZ1bGxOYW1lKGZ1bGxOYW1lKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIlRoaXMgaXMgcHJvZHVjdCBkZXNjcmlwdGlvbiI7CisJCXByb2R1Y3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQlyZXR1cm4gcHJvZHVjdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBnZXRSZXFDYXBSZWxhdGlvbihTdHJpbmcgZnJvbUNvbXBJbnN0SWQsIFN0cmluZyB0b0NvbXBJbnN0SWQsIFN0cmluZyByZXFPd25lcklkLCBTdHJpbmcgY2FwT3duZXJJZCwgU3RyaW5nIGNhcFR5cGUsIFN0cmluZyByZXFDYXBOYW1lLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0LAorCQkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcUxpc3QpIHsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gbmV3IFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZigpOworCQlyZXF1aXJlbWVudERlZi5zZXRGcm9tTm9kZShmcm9tQ29tcEluc3RJZCk7CisJCXJlcXVpcmVtZW50RGVmLnNldFRvTm9kZSh0b0NvbXBJbnN0SWQpOworCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcGFpciA9IG5ldyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIoKTsKKwkJcGFpci5zZXRSZXF1aXJlbWVudE93bmVySWQocmVxT3duZXJJZCk7CisJCXBhaXIuc2V0Q2FwYWJpbGl0eU93bmVySWQoY2FwT3duZXJJZCk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnQocmVxQ2FwTmFtZSk7CisJCVJlbGF0aW9uc2hpcEltcGwgcmVsYXRpb25zaGlwID0gbmV3IFJlbGF0aW9uc2hpcEltcGwoKTsKKwkJcmVsYXRpb25zaGlwLnNldFR5cGUoY2FwVHlwZSk7CisJCXBhaXIuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXApOworCQlwYWlyLnNldENhcGFiaWxpdHlVaWQoY2FwTGlzdC5nZXQoMCkuZ2V0VW5pcXVlSWQoKSk7CisJCXBhaXIuc2V0UmVxdWlyZW1lbnRVaWQocmVxTGlzdC5nZXQoMCkuZ2V0VW5pcXVlSWQoKSk7CisJCUxpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPiByZWxhdGlvbnNoaXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJlbGF0aW9uc2hpcHMuYWRkKHBhaXIpOworCQlyZXF1aXJlbWVudERlZi5zZXRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcHMpOworCQlyZXR1cm4gcmVxdWlyZW1lbnREZWY7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlVVVJRGZvclN1Zml4KCkgeworCisJCVN0cmluZyB1bmlxdWVTdWZpeCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCVN0cmluZ1tdIHNwbGl0ID0gdW5pcXVlU3VmaXguc3BsaXQoIi0iKTsKKwkJcmV0dXJuIHVuaXF1ZVN1Zml4ID0gc3BsaXRbNF07CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZUFydGlmYWN0TGFiZWwoU3RyaW5nIGxhYmVsKSB7CisKKwkJbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMCwgbGFiZWwuaW5kZXhPZigiLiIpKTsKKwkJU3RyaW5nIG5vcm1hbGl6ZWRMYWJlbCA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVBcnRpZmFjdExhYmVsKGxhYmVsKTsKKwkJcmV0dXJuIG5vcm1hbGl6ZWRMYWJlbC5zdWJzdHJpbmcoMCwgTWF0aC5taW4oMjUsIG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGgoKSkpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvZ2VuZXJhbC9GaWxlVXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9nZW5lcmFsL0ZpbGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODU1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvZ2VuZXJhbC9GaWxlVXRpbHMuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EZWNvZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIEZpbGVVdGlscyB7CisKKwlzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgY29udGVudCkgeworCQl0cnkgeworCQkJRmlsZXMud3JpdGUoUGF0aHMuZ2V0KGZpbGVQYXRoKSwgY29udGVudC5nZXRCeXRlcygpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBmdWxseVF1YWxpZmllZCkgeworCQlTdHJpbmcgZmlsZU5hbWUgPSBmdWxseVF1YWxpZmllZDsKKworCQlpbnQgaSA9IGZ1bGx5UXVhbGlmaWVkLmxhc3RJbmRleE9mKCcuJyk7CisJCWlmIChpID4gMCkgeworCQkJZmlsZU5hbWUgPSBmdWxseVF1YWxpZmllZC5zdWJzdHJpbmcoaSArIDEpOworCQl9CisJCXJldHVybiBmaWxlTmFtZTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPFN0cmluZywgRXhjZXB0aW9uPiBnZXRGaWxlQ29udGVudFVURjgoU3RyaW5nIGZpbGVQYXRoKSB7CisJCUVpdGhlcjxTdHJpbmcsIEV4Y2VwdGlvbj4gZWl0aGVyUmVzdWx0OworCQl0cnkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKEZpbGVzLnJlYWRBbGxCeXRlcyhQYXRocy5nZXQoZmlsZVBhdGgpKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIubGVmdChjb250ZW50KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlKTsKKwkJfQorCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEZpbGVMaXN0RnJvbUJhc2VEaXJlY3RvcnlCeVRlc3ROYW1lKFN0cmluZyB0ZXN0UmVzb3VyY2VzUGF0aCkgeworCisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJRmlsZVtdIGxpc3RGaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7CisJCWlmIChsaXN0RmlsZXMgIT0gbnVsbCkgeworCQkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZm9yIChGaWxlIG5ld0ZpbGUgOiBsaXN0RmlsZXMpIHsKKwkJCQlpZiAobmV3RmlsZS5pc0ZpbGUoKSkgeworCQkJCQlsaXN0RmlsZU5hbWUuYWRkKG5ld0ZpbGUuZ2V0UGF0aCgpKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbGlzdEZpbGVOYW1lOworCQl9CisJCWFzc2VydFRydWUoImRpcmVjdG9yeSAiICsgdGVzdFJlc291cmNlc1BhdGggKyAiIGlzIGVtcHR5IiwgZmFsc2UpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aEZyb21MaXN0QnlQYXR0ZXJuKExpc3Q8U3RyaW5nPiBmaWxlTGlzdCwgU3RyaW5nIHBhdHRlcm4pIHsKKworCQlmb3IgKFN0cmluZyBmaWxlUGF0aCA6IGZpbGVMaXN0KSB7CisJCQlpZiAoZmlsZVBhdGguY29udGFpbnMocGF0dGVybikpIHsKKwkJCQlyZXR1cm4gZmlsZVBhdGg7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFBheWxvYWRGaWxlRnJvbUxpc3RVc2luZ1Bvc2l0aW9uKExpc3Q8U3RyaW5nPiBsaXN0RmlsZU5hbWUsIFN0cmluZyBwYXR0ZXJuLCBCb29sZWFuIGlzQmFzZTY0LCBpbnQgcG9zaXRpb25Jbkxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobGlzdEZpbGVOYW1lLmdldChwb3NpdGlvbkluTGlzdCkpKTsKKwkJcmV0dXJuIGxvYWRQYXlsb2FkRmlsZShuZXdMaXN0LCBwYXR0ZXJuLCBpc0Jhc2U2NCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFBheWxvYWRGaWxlKExpc3Q8U3RyaW5nPiBsaXN0RmlsZU5hbWUsIFN0cmluZyBwYXR0ZXJuLCBCb29sZWFuIGlzQmFzZTY0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWU7CisJCVN0cmluZyBwYXlsb2FkID0gbnVsbDsKKwkJZmlsZU5hbWUgPSBGaWxlVXRpbHMuZ2V0RmlsZVBhdGhGcm9tTGlzdEJ5UGF0dGVybihsaXN0RmlsZU5hbWUsIHBhdHRlcm4pOworCQlsb2dnZXIuZGVidWcoImZpbGVOYW1lOiB7fSIsIGZpbGVOYW1lKTsKKworCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworCQkJcGF5bG9hZCA9IERlY29kZXIucmVhZEZpbGVUb1N0cmluZyhmaWxlTmFtZSk7CisJCQlpZiAoaXNCYXNlNjQpIHsKKwkJCQlwYXlsb2FkID0gRGVjb2Rlci5lbmNvZGUocGF5bG9hZC5nZXRCeXRlcygpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFzc2VydFRydWUoImZpbGUgdG8gdXBsb2FkIG5vdCBmb3VuZCIsIGZhbHNlKTsKKwkJfQorCQlyZXR1cm4gcGF5bG9hZDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZUZyb21QYXRoKFN0cmluZyB0ZXN0UmVzb3VyY2VzUGF0aCkgeworCisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRlc3RSZXNvdXJjZXNQYXRoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKKwkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKKwkJCXJldHVybiBmaWxlLmdldE5hbWUoKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydFRydWUoImZpbGUgdG8gdXBsb2FkIG5vdCBmb3VuZCIsIGZhbHNlKTsKKwkJfQorCQlyZXR1cm4gZmlsZU5hbWU7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvZ2VuZXJhbC9JbXBvcnRVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL2dlbmVyYWwvSW1wb3J0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBjZGJhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL2dlbmVyYWwvSW1wb3J0VXRpbHMuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuSW1wb3J0UmVxRGV0YWlsczsKKworcHVibGljIGNsYXNzIEltcG9ydFV0aWxzIHsKKworCXB1YmxpYyBzdGF0aWMgSW1wb3J0UmVxRGV0YWlscyBnZXRJbXBvcnRSZXNvdXJjZURldGFpbHNCeVBhdGhBbmROYW1lKEltcG9ydFJlcURldGFpbHMgaW1wb3J0UmVxRGV0YWlscywgU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJLy8gSW1wb3J0UmVxRGV0YWlscyBpbXBvcnRSZXFEZXRhaWxzOworCQkvLyBVc2VyIHNkbmNVc2VyRGV0YWlsczsKKwkJLy8gU3RyaW5nIHRlc3RSZXNvdXJjZXNQYXRoOworCQkvLyBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCQkvLyBDb25maWcgY29uZmlnOworCQkvLyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJLy8KKwkJLy8gaW1wb3J0UmVxRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRJbXBvcnRSZXNvdXJjZSgpOworCQkvLyBVc2VyIHNkbmNVc2VyRGV0YWlscyA9CisJCS8vIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPQorCQkvLyBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJLy8gU3RyaW5nIHNvdXJjZURpciA9IGNvbmZpZy5nZXRSZXNvdXJjZUNvbmZpZ0RpcigpOworCQkvLyBTdHJpbmcgdGVzdFJlc291cmNlc1BhdGggPSBzb3VyY2VEaXIgKyBGaWxlLnNlcGFyYXRvciArIHdvcmtEaXI7CisJCS8vIGZpbmFsIFN0cmluZyB3b3JrRGlyID0gImltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybCI7CisKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZShmaWxlUGF0aCk7CisJCWltcG9ydFJlcURldGFpbHMuc2V0UGF5bG9hZE5hbWUoZmlsZU5hbWUpOworCQlTdHJpbmcgcGF5bG9hZERhdGEgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgZmlsZU5hbWUsIHRydWUpOworCQlpbXBvcnRSZXFEZXRhaWxzLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKworCQlyZXR1cm4gaW1wb3J0UmVxRGV0YWlsczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0FydGlmYWN0UmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9BcnRpZmFjdFJlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjA2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9BcnRpZmFjdFJlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjg5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdFJlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBcnRpZmFjdFJlc3RVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisJLy8gRXh0ZXJuYWwgQVBJCisJLy8gVXBsb2FkIEFydGlmYWN0IG9mIHRoZSBhc3NldAorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGV4dGVybmFsQVBJVXBsb2FkQXJ0aWZhY3RPZlRoZUFzc2V0KENvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgdXNlciwgQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0UmVxRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gbnVsbDsKKwkJU3RyaW5nIHJlc291cmNlVVVJRCA9IGNvbXBvbmVudC5nZXRVVUlEKCk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCisJCWlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoInJlc291cmNlIikpIHsKKwkJCXJlc291cmNlVHlwZSA9ICJyZXNvdXJjZXMiOworCQl9IGVsc2UgeworCQkJcmVzb3VyY2VUeXBlID0gInNlcnZpY2VzIjsKKwkJfQorCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuUE9TVF9FWFRFUk5BTF9BUElfVVBMT0FEX0FSVElGQUNUX09GX0FTU0VULCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZVR5cGUsIHJlc291cmNlVVVJRCk7CisKKwkJcmV0dXJuIHVwbG9hZEluZm9ybWF0aW9uYWxBcnRpZmFjdChhcnRpZmFjdFJlcURldGFpbHMsIHVzZXIsIGNhbGN1bGF0ZUNoZWNrc3VtKGFydGlmYWN0UmVxRGV0YWlscyksIHVybCk7CisJfQorCisJLy8KKwkvLyBUZXN0aW5nCisJLy8KKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdEV4dGVybmFsQVBJKFN0cmluZyByZXNvdXJjZVVVSUQsIFN0cmluZyBhcnRpZmFjdFVVSUQsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJlc291cmNlVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gbnVsbDsKKworCQlpZiAocmVzb3VyY2VUeXBlLmVxdWFscygiU2VydmljZSIpKSB7CisJCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1RfT0ZfQVNTRVQsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlVVVJRCwgYXJ0aWZhY3RVVUlEKTsKKworCQl9IGVsc2UgeworCQkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVF9PRl9BU1NFVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VVVUlELCBhcnRpZmFjdFVVSUQpOworCQl9CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BVVRIT1JJWkFUSU9OLmdldFZhbHVlKCksIGF1dGhvcml6YXRpb25IZWFkZXIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5YX0VDT01QX0lOU1RBTkNFX0lELmdldFZhbHVlKCksICJjaSIpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKworCQlsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gZ2V0IFJlc291cmNlIEFzc2V0czoge30iLCB1cmwpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbmQgR0VUIHJlcXVlc3QgdG8gZ2V0IFJlc291cmNlIEFzc2V0czogIiArIHVybCk7CisKKwkJbG9nZ2VyLmRlYnVnKCJSZXF1ZXN0IGhlYWRlcnM6IHt9IiwgaGVhZGVyc01hcCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVxdWVzdCBoZWFkZXJzOiAiICsgaGVhZGVyc01hcCk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRHZXRSZXNvdXJjZUFzc2V0cyA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gc2VuZEdldFJlc291cmNlQXNzZXRzOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0Q29tcG9uZW50SW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RFeHRlcm5hbEFQSShTdHJpbmcgcmVzb3VyY2VVVUlELCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VVSUQsIFN0cmluZyBhcnRpZmFjdFVVSUQsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJlc291cmNlVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gbnVsbDsKKworCQlpZiAocmVzb3VyY2VUeXBlLmVxdWFscygiU2VydmljZSIpKSB7CisJCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1RfT0ZfQ09NUE9ORU5UX0lOU1RBTkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZVVVSUQsIGNvbXBvbmVudEluc3RhbmNlVUlELCBhcnRpZmFjdFVVSUQpOworCisJCX0gZWxzZSB7CisJCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUX09GX0NPTVBPTkVOVF9JTlNUQU5DRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VVVUlELCBjb21wb25lbnRJbnN0YW5jZVVJRCwgYXJ0aWZhY3RVVUlEKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uWF9FQ09NUF9JTlNUQU5DRV9JRC5nZXRWYWx1ZSgpLCAiY2kiKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIEdFVCByZXF1ZXN0IHRvIGdldCBSZXNvdXJjZSBBc3NldHM6IHt9IiwgdXJsKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJTZW5kIEdFVCByZXF1ZXN0IHRvIGdldCBSZXNvdXJjZSBBc3NldHM6ICIgKyB1cmwpOworCisJCWxvZ2dlci5kZWJ1ZygiUmVxdWVzdCBoZWFkZXJzOiB7fSIsIGhlYWRlcnNNYXApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlcXVlc3QgaGVhZGVyczogIiArIGhlYWRlcnNNYXApOworCisJCVJlc3RSZXNwb25zZSBzZW5kR2V0UmVzb3VyY2VBc3NldHMgPSBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRHZXRSZXNvdXJjZUFzc2V0czsKKworCX0KKworCS8vICoqKioqKioqKioqIFNFUlZJQ0UgKioqKioqKioqKioqKioqKgorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldEFydGlmYWN0VHlwZXNMaXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9BTExfQVJUSUZBQ1RTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlyZXR1cm4gc2VuZEdldCh1cmwsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBzZXJ2aWNlVWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydGlmYWN0RGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgc2VydmljZVVpZCwgY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3REZXRhaWxzKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHNlcnZpY2VVaWQsIFN0cmluZyBjaGVja3N1bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkFERF9BUlRJRkFDVF9UT19TRVJWSUNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBzZXJ2aWNlVWlkKTsKKworCQlyZXR1cm4gdXBsb2FkSW5mb3JtYXRpb25hbEFydGlmYWN0KGFydGlmYWN0RGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY2hlY2tzdW0sIHVybCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3QoU2VydmljZVJlcURldGFpbHMgc2VydmljZSwgQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0LCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaW9uYWxIZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3Qoc2VydmljZSwgYXJ0aWZhY3QsIHVzZXIsIGFkZGlvbmFsSGVhZGVycywgdHJ1ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3QoU2VydmljZVJlcURldGFpbHMgc2VydmljZSwgQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0LCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaW9uYWxIZWFkZXJzLCBib29sZWFuIGFkZEVjb21wSGVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgcmVsYXRpdmVVcmwgPSBlbmNvZGVVcmxGb3JEb3dubG9hZCgKKwkJCQlTdHJpbmcuZm9ybWF0KFVybHMuRElTVFJJQl9ET1dOTE9BRF9TRVJWSUNFX0FSVElGQUNUX1JFTEFUSVZFX1VSTCwgVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoc2VydmljZS5nZXROYW1lKCkpLCBzZXJ2aWNlLmdldFZlcnNpb24oKSwgVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKGFydGlmYWN0LmdldEFydGlmYWN0TmFtZSgpKSkpOworCQlTdHJpbmcgZnVsbFVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ET1dOTE9BRF9TRVJWSUNFX0FSVElGQUNUX0ZVTExfVVJMLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZWxhdGl2ZVVybCk7CisKKwkJcmV0dXJuIGRvd25sb2FkQXJ0aWZhY3QoZnVsbFVybCwgdXNlciwgYWRkaW9uYWxIZWFkZXJzLCBhZGRFY29tcEhlYWRlcik7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0KFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0LCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaW9uYWxIZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdChzZXJ2aWNlLCByZXNvdXJjZSwgYXJ0aWZhY3QsIHVzZXIsIGFkZGlvbmFsSGVhZGVycywgdHJ1ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0KFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0LCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaW9uYWxIZWFkZXJzLCBib29sZWFuIGFkZEVjb21wSGVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgcmVsYXRpdmVVcmwgPSBlbmNvZGVVcmxGb3JEb3dubG9hZChTdHJpbmcuZm9ybWF0KFVybHMuRElTVFJJQl9ET1dOTE9BRF9SRVNPVVJDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwsIFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2UuZ2V0TmFtZSgpKSwgc2VydmljZS5nZXRWZXJzaW9uKCksCisJCQkJVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKSwgcmVzb3VyY2UuZ2V0VmVyc2lvbigpLCBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplRmlsZU5hbWUoYXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpKSk7CisJCVN0cmluZyBmdWxsVXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUX0ZVTExfVVJMLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZWxhdGl2ZVVybCk7CisKKwkJcmV0dXJuIGRvd25sb2FkQXJ0aWZhY3QoZnVsbFVybCwgdXNlciwgYWRkaW9uYWxIZWFkZXJzLCBhZGRFY29tcEhlYWRlcik7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3QoU3RyaW5nIHNlcnZpY2VVbmlxdWVJZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgVXNlciB1c2VyLCBTdHJpbmcgYXJ0aWZhY3RVbmlxZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRPV05MT0FEX0NPTVBPTkVOVF9JTlNUQU5DRV9BUlRJRkFDVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgc2VydmljZVVuaXF1ZUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGFydGlmYWN0VW5pcWVJZCk7CisJCVJlc3RSZXNwb25zZSByZXMgPSBzZW5kR2V0KHVybCwgdXNlci5nZXRVc2VySWQoKSwgbnVsbCk7CisJCXJldHVybiByZXM7CisJfQorCisJLy8vLworCisJLy8gdXBkYXRlCisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2VCeU1ldGhvZChBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXFEZXRhaWxzLCBTdHJpbmcgc2VydmljZVVpZCwgU3RyaW5nIGFydGlmYWN0VWlkLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBodHRwTWV0aG9kKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2VCeU1ldGhvZChhcnRpZmFjdFJlcURldGFpbHMsIHNlcnZpY2VVaWQsIGFydGlmYWN0VWlkLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBodHRwTWV0aG9kLCBjYWxjdWxhdGVDaGVja3N1bShhcnRpZmFjdFJlcURldGFpbHMpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2VCeU1ldGhvZChBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXFEZXRhaWxzLCBTdHJpbmcgc2VydmljZVVpZCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgaHR0cE1ldGhvZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0T2ZTZXJ2aWNlQnlNZXRob2QoYXJ0aWZhY3RSZXFEZXRhaWxzLCBzZXJ2aWNlVWlkLCBhcnRpZmFjdFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSwgc2RuY01vZGlmaWVyRGV0YWlscywgaHR0cE1ldGhvZCwgY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3RSZXFEZXRhaWxzKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0SW50ZXJuYWxBcGkoU3RyaW5nIHJlc291cmNlSWQsIFVzZXIgdXNlciwgU3RyaW5nIGFydGlmYWN0VW5pcWVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkb3dubG9hZENvbXBvbmVudEFydGlmYWN0SW50ZXJuYWxBcGkocmVzb3VyY2VJZCwgdXNlciwgYXJ0aWZhY3RVbmlxZUlkLCBVcmxzLlVJX0RPV05MT0FEX1JFU09VUkNFX0FSVElGQUNUKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdEludGVybmFsQXBpKFN0cmluZyBjb21wb25lbnRJZCwgVXNlciB1c2VyLCBTdHJpbmcgYXJ0aWZhY3RVbmlxZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRvd25sb2FkQ29tcG9uZW50QXJ0aWZhY3RJbnRlcm5hbEFwaShjb21wb25lbnRJZCwgdXNlciwgYXJ0aWZhY3RVbmlxZUlkLCBVcmxzLlVJX0RPV05MT0FEX1NFUlZJQ0VfQVJUSUZBQ1QpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRvd25sb2FkQ29tcG9uZW50QXJ0aWZhY3RJbnRlcm5hbEFwaShTdHJpbmcgY29tcG9uZW50SWQsIFVzZXIgdXNlciwgU3RyaW5nIGFydGlmYWN0VW5pcWVJZCwgU3RyaW5nIHVybFRlbXBsYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdCh1cmxUZW1wbGF0ZSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgY29tcG9uZW50SWQsIGFydGlmYWN0VW5pcWVJZCk7CisJCVJlc3RSZXNwb25zZSByZXMgPSBzZW5kR2V0KHVybCwgdXNlci5nZXRVc2VySWQoKSwgbnVsbCk7CisJCXJldHVybiByZXM7CisJfQorCisJLyoKKwkgKiBwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYXlsb2FkT2ZTZXJ2aWNlKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHNlcnZpY2VVaWQsIFN0cmluZyBhcnRpZmFjdFVpZCwgU3RyaW5nIGNoZWNrc3VtKSB0aHJvd3MgSU9FeGNlcHRpb24geyByZXR1cm4KKwkgKiB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2UoYXJ0aWZhY3REZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBzZXJ2aWNlVWlkLCBhcnRpZmFjdFVpZCwgY2hlY2tzdW0sIHRydWUpOyB9CisJICogCisJICogcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0TWV0YWRhdGFPZlNlcnZpY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgc2VydmljZVVpZCwgU3RyaW5nIGFydGlmYWN0VWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geyByZXR1cm4KKwkgKiB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2UoYXJ0aWZhY3REZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBzZXJ2aWNlVWlkLCBhcnRpZmFjdFVpZCwgY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3REZXRhaWxzKSwgZmFsc2UpOyB9CisJICogCisJICogcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0T2ZTZXJ2aWNlKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHNlcnZpY2VVaWQsIFN0cmluZyBhcnRpZmFjdFVpZCwgU3RyaW5nIGNoZWNrc3VtLCBib29sZWFuIGlzUGF5bG9hZFVwZGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsgQ29uZmlnIGNvbmZpZyA9CisJICogVXRpbHMuZ2V0Q29uZmlnKCk7IE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IGdldEhlYWRlcnNNYXAoc2RuY01vZGlmaWVyRGV0YWlscyk7CisJICogCisJICogaWYgKGlzUGF5bG9hZFVwZGF0ZSl7IGhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNvbnRlbnRfTUQ1LmdldFZhbHVlKCksIGNoZWNrc3VtKTsgfQorCSAqIAorCSAqIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7IFN0cmluZyBqc29uQm9keSA9IGdzb24udG9Kc29uKGFydGlmYWN0RGV0YWlscyk7CisJICogCisJICogSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCSAqIAorCSAqIFN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9PRl9TRVJWSUNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VVaWQsIGFydGlmYWN0VWlkKTsgUmVzdFJlc3BvbnNlIHJlcyA9IGh0dHAuaHR0cFNlbmRQb3N0KHVybCwganNvbkJvZHksIGhlYWRlcnNNYXApOworCSAqIFN5c3RlbS5vdXQucHJpbnRsbigidXBkYXRlIGFydGlmYWN0IHdhcyBmaW5pc2hlZCB3aXRoIHJlc3BvbnNlOiAiKyByZXMuZ2V0RXJyb3JDb2RlKCkpOyByZXR1cm4gcmVzOyB9CisJICovCisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2VCeU1ldGhvZChBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXFEZXRhaWxzLCBTdHJpbmcgc2VydmljZVVpZCwgU3RyaW5nIGFydGlmYWN0VWlkLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBodHRwTWV0aG9kLCBTdHJpbmcgY2hlY2tzdW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBnZXRIZWFkZXJzTWFwKHNkbmNNb2RpZmllckRldGFpbHMpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5Db250ZW50X01ENS5nZXRWYWx1ZSgpLCBjaGVja3N1bSk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKGFydGlmYWN0UmVxRGV0YWlscyk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfT0ZfU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgc2VydmljZVVpZCwgYXJ0aWZhY3RVaWQpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRCeU1ldGhvZCh1cmwsIGh0dHBNZXRob2QsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidXBkYXRlIGFydGlmYWN0IHdhcyBmaW5pc2hlZCB3aXRoIHJlc3BvbnNlOiAiKworCQkvLyB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2VSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SGVhZGVyc01hcChVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SnNvbkhlYWRlcik7CisKKwkJdHJ5IHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKwkJfQorCisJCXJldHVybiBoZWFkZXJzTWFwOworCX0KKworCS8vICoqKioqKioqKioqIFJFU09VUkNFICoqKioqKioqKioqKioqKioKKwkvLyBhZGQKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJlc291cmNlVWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShhcnRpZmFjdERldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVWlkLCBjYWxjdWxhdGVDaGVja3N1bShhcnRpZmFjdERldGFpbHMpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBleHBsaWNpdEFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgcmVzb3VyY2VVaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkFERF9BUlRJRkFDVF9UT19SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VVaWQpOworCisJCXJldHVybiB1cGxvYWRJbmZvcm1hdGlvbmFsQXJ0aWZhY3QoYXJ0aWZhY3REZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBjYWxjdWxhdGVDaGVja3N1bShhcnRpZmFjdERldGFpbHMpLCB1cmwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgcmVzb3VyY2VVaWQsIFN0cmluZyBjaGVja3N1bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCWlmIChhcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSAhPSBudWxsICYmIGFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpLmVxdWFscyhBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5nZXRUeXBlKCkpKSB7CisJCQkvLyBZQU5HX1hNTCBhbmQgT1RIRVIgZGVwbG95bWVudCBhcnRpZmFjdCBzaG91bGQgYmUgYWRkZWQgdGhyb3VnaAorCQkJLy8gdGhpcyBBUEksIG5vdCB1cGRhdGVkCisJCQlTdHJpbmcgYXJ0aWZhY3RUeXBlID0gYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpOworCQkJaWYgKCEoQXJ0aWZhY3RUeXBlRW51bS5ZQU5HX1hNTC5nZXRUeXBlKCkuZXF1YWxzKGFydGlmYWN0VHlwZSkgfHwgQXJ0aWZhY3RUeXBlRW51bS5PVEhFUi5nZXRUeXBlKCkuZXF1YWxzKGFydGlmYWN0VHlwZSkgfHwgQXJ0aWZhY3RUeXBlRW51bS5WTkZfQ0FUQUxPRy5nZXRUeXBlKCkuZXF1YWxzKGFydGlmYWN0VHlwZSkKKwkJCQkJfHwgQXJ0aWZhY3RUeXBlRW51bS5WRl9MSUNFTlNFLmdldFR5cGUoKS5lcXVhbHMoYXJ0aWZhY3RUeXBlKSB8fCBBcnRpZmFjdFR5cGVFbnVtLlZFTkRPUl9MSUNFTlNFLmdldFR5cGUoKS5lcXVhbHMoYXJ0aWZhY3RUeXBlKSB8fCBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFLmdldFR5cGUoKS5lcXVhbHMoYXJ0aWZhY3RUeXBlKQorCQkJCQl8fCBBcnRpZmFjdFR5cGVFbnVtLk1PREVMX1FVRVJZX1NQRUMuZ2V0VHlwZSgpLmVxdWFscyhhcnRpZmFjdFR5cGUpIHx8IEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUcuZ2V0VHlwZSgpLmVxdWFscyhhcnRpZmFjdFR5cGUpKSkgeworCQkJCS8vIHJldHVybiB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1Jlc291cmNlKGFydGlmYWN0RGV0YWlscywKKwkJCQkvLyBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVVpZCk7CisJCQl9CisJCX0KKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5BRERfQVJUSUZBQ1RfVE9fUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlVWlkKTsKKworCQlyZXR1cm4gdXBsb2FkSW5mb3JtYXRpb25hbEFydGlmYWN0KGFydGlmYWN0RGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY2hlY2tzdW0sIHVybCk7CisJfQorCisJLy8gdXBkYXRlCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyByZXNvdXJjZVVpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFRvUmVzb3VyY2UoYXJ0aWZhY3REZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVVpZCwgY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3REZXRhaWxzKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyByZXNvdXJjZVVpZCwgU3RyaW5nIGNoZWNrc3VtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCWlmIChhcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSAhPSBudWxsICYmIGFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpLmVxdWFscygiREVQTE9ZTUVOVCIpKSB7CisJCQlSZXN0UmVzcG9uc2UgcmVzb3VyY2VHZXRSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHNkbmNNb2RpZmllckRldGFpbHMsIHJlc291cmNlVWlkKTsKKwkJCVJlc291cmNlIHJlc291cmNlUmVzcEphdmFPYmplY3QgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZUdldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCQlhcnRpZmFjdERldGFpbHMuc2V0VW5pcXVlSWQoYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJYXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TGFiZWwoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKSk7CisKKwkJfQorCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9PRl9SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VVaWQsIGFydGlmYWN0RGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKworCQlyZXR1cm4gdXBsb2FkSW5mb3JtYXRpb25hbEFydGlmYWN0KGFydGlmYWN0RGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3REZXRhaWxzKSwgdXJsKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGxvYWRBcnRpZmFjdFRvUGxhY2Vob2xkZXJPblJlc291cmNlKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJlc291cmNlVWlkLCBTdHJpbmcgcGxhY2VIb2xkZXJMYWJlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlpZiAoYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKSAhPSBudWxsICYmICFhcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RMYWJlbCgpLmlzRW1wdHkoKSkgeworCQkJUmVzdFJlc3BvbnNlIHJlc291cmNlR2V0UmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNvdXJjZVVpZCk7CisJCQlSZXNvdXJjZSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VHZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KGFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdExhYmVsKCkpOworCQkJQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbChhcnRpZmFjdERlZmluaXRpb24pOworCQkJYXJ0aWZhY3REZXRhaWxzLnNldFVuaXF1ZUlkKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJCWFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdExhYmVsKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdExhYmVsKCkpOworCisJCX0KKworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfT0ZfUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlVWlkLCBhcnRpZmFjdERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJcmV0dXJuIHVwbG9hZEluZm9ybWF0aW9uYWxBcnRpZmFjdChhcnRpZmFjdERldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIGNhbGN1bGF0ZUNoZWNrc3VtKGFydGlmYWN0RGV0YWlscyksIHVybCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlRGVwbG95bWVudEFydGlmYWN0VG9SZXNvdXJjZShBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyByZXNvdXJjZVVpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9PUl9ERUxFVEVfQVJUSUZBQ1RfT0ZfUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlVWlkLCBhcnRpZmFjdERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisKKwkJcmV0dXJuIHVwZGF0ZURlcGxveW1lbnRBcnRpZmFjdChhcnRpZmFjdERldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHVybCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2UoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgc2VydmljZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX1JFU09VUkNFX0lOU1RBTkNFX0FSVElGQUNULCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBzZXJ2aWNlSWQsIHJlc291cmNlSW5zdGFuY2VJZCwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlyZXR1cm4gdXBkYXRlRGVwbG95bWVudEFydGlmYWN0KGFydGlmYWN0RGVmaW5pdGlvbiwgc2RuY01vZGlmaWVyRGV0YWlscywgdXJsKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3RUb1JJKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIHNlcnZpY2VJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9SRVNPVVJDRV9JTlNUQU5DRV9IRUFUX0VOVl9QQVJBTVMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBhcnRpZmFjdERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiB1cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3QoYXJ0aWZhY3REZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB1cmwpOworCX0KKworCS8vIGRlbGV0ZQorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZUFydGlmYWN0RnJvbVJlc291cmNlSW5zdGFuY2UoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgcmVzb3VyY2VVaWQsIFN0cmluZyBzZXJ2aWNlSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfUkVTT1VSQ0VfSU5TVEFOQ0VfQVJUSUZBQ1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VJZCwgcmVzb3VyY2VVaWQsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJcmV0dXJuIHNlbmREZWxldGUodXJsLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlVWlkLCBBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UocmVzb3VyY2VVaWQsIGFydGlmYWN0RGV0YWlscy5nZXRVbmlxdWVJZCgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RGcm9tUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlVWlkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9PRl9SRVNPVVJDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VVaWQsIGFydGlmYWN0SWQpOworCQlyZXR1cm4gc2VuZERlbGV0ZSh1cmwsIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VBcGlBcnRpZmFjdChBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBTdHJpbmcgc2VydmljZVVuaXF1ZUlkLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX0RFTEVURV9TRVJWSUNFX0FQSV9BUlRJRkFDVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgc2VydmljZVVuaXF1ZUlkLCBhcnRpZmFjdERldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc3RSZXNwb25zZSByZXMgPSBzZW5kRGVsZXRlKHVybCwgdXNlci5nZXRVc2VySWQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiRGVsZXRpbmcgYXBpIGFydGlmYWN0IHdhcyBmaW5pc2hlZCB3aXRoIHJlc3BvbnNlOiB7fSIsIHJlcy5nZXRFcnJvckNvZGUoKSk7CisJCWxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgYm9keToge30iLCByZXMuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworCQlyZXR1cm4gcmVzOworCX0KKworCS8vICoqKioqKioqKioqKioqKiBSRVNPVVJDRSBJTlNUQU5DRSAqKioqKioqKioqKioqKgorCS8qKgorCSAqIEFkZCBEQ0FFIGFydGlmYWN0cyB0byByZXNvdXJjZSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gYXJ0aWZhY3REZXRhaWxzCisJICogQHBhcmFtIHNkbmNNb2RpZmllckRldGFpbHMKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHBhcmFtIHNlcnZpY2VJZAorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgYWRkQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgc2VydmljZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQUREX1JFU09VUkNFX0lOU1RBTkNFX0FSVElGQUNULCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBzZXJ2aWNlSWQsIHJlc291cmNlSW5zdGFuY2VJZCwgYXJ0aWZhY3REZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlyZXR1cm4gYWRkQXJ0aWZhY3RUb0luc3RhbmNlKGFydGlmYWN0RGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY2FsY3VsYXRlQ2hlY2tzdW0oYXJ0aWZhY3REZXRhaWxzKSwgdXJsKTsKKwl9CisKKwkvLyAqKioqKioqKioqKioqKiogQ09NUE9ORU5UICoqKioqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGxvYWREZXBsb3ltZW50QXJ0aWZhY3QoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgQ29tcG9uZW50IGNvbXBvbmVudCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEhlYWRlcnMgPSBudWxsOworCQlTdHJpbmcgY2hlY2tzdW0gPSBSZXNwb25zZVBhcnNlci5jYWxjdWxhdGVNRDVIZWFkZXIoYXJ0aWZhY3REZXRhaWxzKTsKKwkJYWRkaXRpb25hbEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJYWRkaXRpb25hbEhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLkNvbnRlbnRfTUQ1LmdldFZhbHVlKCksIGNoZWNrc3VtKTsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKworCQlTdHJpbmcgdXJsID0gbnVsbDsKKworCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKworCQljYXNlIFJFU09VUkNFOiB7CisJCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9PRl9TRVJWSUNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3REZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIFNFUlZJQ0U6IHsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFBST0RVQ1Q6IHsKKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OiB7Ly8gZHVtbXkKKwkJCWFzc2VydFRydWUoImZhaWxlZCBvbiBlbnVtIHNlbGVjdGlvbiIsIGZhbHNlKTsKKworCQkJYnJlYWs7CisJCX0KKwkJfQorCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyBqc29uQm9keSA9IGdzb24udG9Kc29uKGFydGlmYWN0RGV0YWlscyk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJ0aWZhY3REZXRhaWxzOiAiKyBqc29uQm9keSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IHNlbmRQb3N0KHVybCwganNvbkJvZHksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksIGFjY2VwdEhlYWRlckRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKTsKKwkJaWYgKHJlcy5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTKSB7CisJCQlhcnRpZmFjdERldGFpbHMuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzKSk7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGQgYXJ0aWZhY3Qgd2FzIGZpbmlzaGVkIHdpdGggcmVzcG9uc2U6ICIrCisJCS8vIHJlcy5nZXRFcnJvckNvZGUoKSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBsb2FkQXJ0aWZhY3QoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgQ29tcG9uZW50IGNvbXBvbmVudCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCUxpc3Q8U3RyaW5nPiBwbGFjZUhvbGRlcmxzdCA9IFV0aWxzLmdldExpc3RPZlJlc1BsYWNlSG9sZGVyc0RlcEFydFR5cGVzKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEhlYWRlcnMgPSBudWxsOworCQlTdHJpbmcgY2hlY2tzdW0gPSBudWxsOworCQlTdHJpbmcgdXJsID0gbnVsbDsKKwkJLy8KKwkJLy8KKwkJLy8gaWYgKGFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpICE9IG51bGwKKwkJLy8gJiYgYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0R3JvdXBUeXBlKCkuZXF1YWxzKCJERVBMT1lNRU5UIikKKwkJLy8gJiYgcGxhY2VIb2xkZXJsc3QuY29udGFpbnMoYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpKSkgeworCQkvLyBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHMgPQorCQkvLyBjb21wb25lbnQuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQkvLyBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0KKwkJLy8gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoYXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCS8vIGFydGlmYWN0RGV0YWlscy5zZXRVbmlxdWVJZChhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCS8vIGFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdExhYmVsKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdExhYmVsKCkpOworCQkvLyBjaGVja3N1bSA9IFJlc3BvbnNlUGFyc2VyLmNhbGN1bGF0ZU1ENUhlYWRlcihhcnRpZmFjdERldGFpbHMpOworCQkvLyBhZGRpdGlvbmFsSGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQkvLyBhZGRpdGlvbmFsSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQ29udGVudF9NRDUuZ2V0VmFsdWUoKSwKKwkJLy8gY2hlY2tzdW0pOworCQkvLyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX0FSVElGQUNUX09GX0NPTVBPTkVOVCwKKwkJLy8gY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJLy8gY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJLy8gQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpLAorCQkvLyBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3REZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQkvLyB9CisJCS8vCisJCS8vIGVsc2UgeworCQljaGVja3N1bSA9IFJlc3BvbnNlUGFyc2VyLmNhbGN1bGF0ZU1ENUhlYWRlcihhcnRpZmFjdERldGFpbHMpOworCQlhZGRpdGlvbmFsSGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlhZGRpdGlvbmFsSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQ29udGVudF9NRDUuZ2V0VmFsdWUoKSwgY2hlY2tzdW0pOworCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBMT0FEX0RFTEVURV9BUlRJRkFDVF9PRl9DT01QT05FTlQsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIENvbXBvbmVudFR5cGVFbnVtLmZpbmRQYXJhbUJ5VHlwZShjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKSwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIGFydGlmYWN0RGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gfQorCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyBqc29uQm9keSA9IGdzb24udG9Kc29uKGFydGlmYWN0RGV0YWlscyk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJ0aWZhY3REZXRhaWxzOiAiKyBqc29uQm9keSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IHNlbmRQb3N0KHVybCwganNvbkJvZHksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksIGFjY2VwdEhlYWRlckRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKTsKKwkJaWYgKHJlcy5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTKSB7CisJCQlhcnRpZmFjdERldGFpbHMuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzKSk7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGQgYXJ0aWZhY3Qgd2FzIGZpbmlzaGVkIHdpdGggcmVzcG9uc2U6ICIrCisJCS8vIHJlcy5nZXRFcnJvckNvZGUoKSk7CisJCXJldHVybiByZXM7CisJfQorCisJLy8gKioqKioqKioqKioqKioqIFBSSVZBVEUgKioqKioqKioqKioqKioKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBsb2FkSW5mb3JtYXRpb25hbEFydGlmYWN0KEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGNoZWNrc3VtLCBTdHJpbmcgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzID0gbnVsbDsKKwkJaWYgKGNoZWNrc3VtICE9IG51bGwgJiYgIWNoZWNrc3VtLmlzRW1wdHkoKSkgeworCQkJYWRkaXRpb25hbEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5Db250ZW50X01ENS5nZXRWYWx1ZSgpLCBjaGVja3N1bSk7CisJCX0KKworCQlhZGRpdGlvbmFsSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQVVUSE9SSVpBVElPTi5nZXRWYWx1ZSgpLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKwkJYWRkaXRpb25hbEhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLlhfRUNPTVBfSU5TVEFOQ0VfSUQuZ2V0VmFsdWUoKSwgImNpIik7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdERldGFpbHM6ICIrIGpzb25Cb2R5KTsKKwkJU3RyaW5nIGpzb25Cb2R5ID0gZ3Nvbi50b0pzb24oYXJ0aWZhY3REZXRhaWxzKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzID0gc2VuZFBvc3QodXJsLCBqc29uQm9keSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSwgYWNjZXB0SGVhZGVyRGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpOworCQlpZiAoKHJlcy5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTKSB8fCAocmVzLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX0NSRUFURUQpKSB7CisJCQlhcnRpZmFjdERldGFpbHMuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzKSk7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGQgYXJ0aWZhY3Qgd2FzIGZpbmlzaGVkIHdpdGggcmVzcG9uc2U6ICIrCisJCS8vIHJlcy5nZXRFcnJvckNvZGUoKSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGFkZEFydGlmYWN0VG9JbnN0YW5jZShBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBjaGVja3N1bSwgU3RyaW5nIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycyA9IG51bGw7CisJCWFkZGl0aW9uYWxIZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWlmIChjaGVja3N1bSAhPSBudWxsICYmICFjaGVja3N1bS5pc0VtcHR5KCkpIHsKKwkJCWFkZGl0aW9uYWxIZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCQlhZGRpdGlvbmFsSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQ29udGVudF9NRDUuZ2V0VmFsdWUoKSwgY2hlY2tzdW0pOworCQl9CisJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIpOworCQlhZGRpdGlvbmFsSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgiKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcganNvbkJvZHkgPSBnc29uLnRvSnNvbihhcnRpZmFjdERldGFpbHMpOworCisJCVJlc3RSZXNwb25zZSByZXMgPSBzZW5kUG9zdCh1cmwsIGpzb25Cb2R5LCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLCAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIiwgYWRkaXRpb25hbEhlYWRlcnMpOworCQlpZiAocmVzLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1MpIHsKKwkJCWFydGlmYWN0RGV0YWlscy5zZXRVbmlxdWVJZChSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShyZXMpKTsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVEZXBsb3ltZW50QXJ0aWZhY3QoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzID0gbnVsbDsKKwkJYWRkaXRpb25hbEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJYWRkaXRpb25hbEhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIik7CisJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCIpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyBqc29uQm9keSA9IGdzb24udG9Kc29uKGFydGlmYWN0RGVmaW5pdGlvbik7CisKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IHNlbmRQb3N0KHVybCwganNvbkJvZHksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCBhZGRpdGlvbmFsSGVhZGVycyk7CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZURlcGxveW1lbnRBcnRpZmFjdChBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEhlYWRlcnMgPSBudWxsOworCisJCWFkZGl0aW9uYWxIZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIpOworCQlhZGRpdGlvbmFsSGVhZGVycy5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgiKTsKKwkJLy8gYWRkaXRpb25hbEhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLi5nZXRWYWx1ZSgpLAorCQkvLyAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04Iik7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIGpzb25Cb2R5ID0gZ3Nvbi50b0pzb24oYXJ0aWZhY3REZXRhaWxzKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnRpZmFjdERldGFpbHM6ICIrIGpzb25Cb2R5KTsKKworCQlSZXN0UmVzcG9uc2UgcmVzID0gc2VuZFBvc3QodXJsLCBqc29uQm9keSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSwgImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIsIGFkZGl0aW9uYWxIZWFkZXJzKTsKKwkJaWYgKHJlcy5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTKSB7CisJCQlhcnRpZmFjdERldGFpbHMuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzKSk7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGQgYXJ0aWZhY3Qgd2FzIGZpbmlzaGVkIHdpdGggcmVzcG9uc2U6ICIrCisJCS8vIHJlcy5nZXRFcnJvckNvZGUoKSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3QoU3RyaW5nIHVybCwgVXNlciB1c2VyLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGlvbmFsSGVhZGVycywgYm9vbGVhbiBhZGRFY29tcEhlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGFkZEVjb21wSGVhZGVyKSB7CisJCQlhZGRpb25hbEhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLlhfRUNPTVBfSU5TVEFOQ0VfSUQuZ2V0VmFsdWUoKSwgZWNvbXApOworCQl9CisJCXJldHVybiBkb3dubG9hZEFydGlmYWN0KHVybCwgdXNlciwgYWRkaW9uYWxIZWFkZXJzLCBhY2NlcHRPY3RldFN0cmVhbSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3QoU3RyaW5nIHVybCwgVXNlciB1c2VyLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGlvbmFsSGVhZGVycywgU3RyaW5nIGFjY2VwdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYWRkaW9uYWxIZWFkZXJzLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0KTsKKworCQlSZXN0UmVzcG9uc2UgcmVzID0gc2VuZEdldCh1cmwsIHVzZXIuZ2V0VXNlcklkKCksIGFkZGlvbmFsSGVhZGVycyk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZG93bmxvYWQgYXJ0aWZhY3Qgd2FzIGZpbmlzaGVkIHdpdGggcmVzcG9uc2U6ICIrCisJCS8vIHJlcy5nZXRFcnJvckNvZGUoKSk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVzcG9uc2UgaXM6ICIgKyByZXMuZ2V0UmVzcG9uc2UoKSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0QXJ0aWZhY3RzTGlzdEZyb21SZXNwb25zZShTdHJpbmcganNvblJlc3BvbnNlLCBTdHJpbmcgZmllbGRPZkFydGlmYWN0TGlzdCkgeworCQlKU09OT2JqZWN0IG9iamVjdCA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UoanNvblJlc3BvbnNlKTsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gbWFwID0gKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+KSBvYmplY3QuZ2V0KGZpZWxkT2ZBcnRpZmFjdExpc3QpOworCQlyZXR1cm4gbWFwOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUNoZWNrc3VtKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMpIHsKKwkJU3RyaW5nIGNoZWNrc3VtID0gbnVsbDsKKwkJaWYgKGFydGlmYWN0RGV0YWlscy5nZXRQYXlsb2FkKCkgIT0gbnVsbCkgeworCQkJY2hlY2tzdW0gPSBSZXNwb25zZVBhcnNlci5jYWxjdWxhdGVNRDVIZWFkZXIoYXJ0aWZhY3REZXRhaWxzKTsKKwkJfQorCQlyZXR1cm4gY2hlY2tzdW07CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVXJsRm9yRG93bmxvYWQoU3RyaW5nIHVybCkgeworCisJCXJldHVybiB1cmwucmVwbGFjZUFsbCgiICIsICIlMjAiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJ0aWFsVXJsQnlBcnRpZmFjdE5hbWUoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQlyZXR1cm4gZW5jb2RlVXJsRm9yRG93bmxvYWQoU3RyaW5nLmZvcm1hdChVcmxzLkRJU1RSSUJfRE9XTkxPQURfU0VSVklDRV9BUlRJRkFDVF9SRUxBVElWRV9VUkwsIFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHNlcnZpY2VEZXRhaWxzLmdldE5hbWUoKSksIHNlcnZpY2VWZXJzaW9uLCBhcnRpZmFjdE5hbWUpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZE9mQXJ0aWZhY3QoUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlLCBTdHJpbmcgYXJ0aWZhY3RGaWVsZCwgU3RyaW5nIHJlcXVpZXJlZEFydGlmYWN0TGFiZWwpIHRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFydGlmYWN0ID0gZ2V0QXJ0aWZhY3RGcm9tUmVzdFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBhcnRpZmFjdEZpZWxkLCByZXF1aWVyZWRBcnRpZmFjdExhYmVsKTsKKwkJYXNzZXJ0Tm90TnVsbChhcnRpZmFjdCk7CisJCXJldHVybiBhcnRpZmFjdC5nZXQoInVuaXF1ZUlkIikudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0QXJ0aWZhY3RGcm9tUmVzdFJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFydGlmYWN0RmllbGQsIFN0cmluZyByZXF1aWVyZWRBcnRpZmFjdExhYmVsKSB7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcCA9IGdldEFydGlmYWN0c0xpc3RGcm9tUmVzcG9uc2UocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgYXJ0aWZhY3RGaWVsZCk7CisJCXJldHVybiBtYXAuZ2V0KHJlcXVpZXJlZEFydGlmYWN0TGFiZWwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFBheWxvYWRPZlNlcnZpY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgc2VydmljZVVpZCwgU3RyaW5nIGFydGlmYWN0VWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gdXBkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0UGF5bG9hZE9mU2VydmljZShhcnRpZmFjdERldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHNlcnZpY2VVaWQsIGFydGlmYWN0VWlkLCBjYWxjdWxhdGVNRDVIZWFkZXIoYXJ0aWZhY3REZXRhaWxzKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdFBheWxvYWRPZlNlcnZpY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgc2VydmljZVVpZCwgU3RyaW5nIGFydGlmYWN0VWlkLCBTdHJpbmcgY2hlY2tzdW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2UoYXJ0aWZhY3REZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBzZXJ2aWNlVWlkLCBhcnRpZmFjdFVpZCwgY2hlY2tzdW0sIHRydWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVJbmZvcm1hdGlvbmFsQXJ0aWZhY3RPZlNlcnZpY2UoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgc2VydmljZVVpZCwgU3RyaW5nIGFydGlmYWN0VWlkLCBTdHJpbmcgY2hlY2tzdW0sIGJvb2xlYW4gaXNQYXlsb2FkVXBkYXRlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCisJCWlmIChpc1BheWxvYWRVcGRhdGUpIHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNvbnRlbnRfTUQ1LmdldFZhbHVlKCksIGNoZWNrc3VtKTsKKwkJfQorCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyBqc29uQm9keSA9IGdzb24udG9Kc29uKGFydGlmYWN0RGV0YWlscyk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX09SX0RFTEVURV9BUlRJRkFDVF9PRl9TRVJWSUNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBzZXJ2aWNlVWlkLCBhcnRpZmFjdFVpZCk7CisJCVJlc3RSZXNwb25zZSByZXMgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGpzb25Cb2R5LCBoZWFkZXJzTWFwKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ1cGRhdGUgYXJ0aWZhY3Qgd2FzIGZpbmlzaGVkIHdpdGggcmVzcG9uc2U6ICIrCisJCS8vIHJlcy5nZXRFcnJvckNvZGUoKSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlTUQ1SGVhZGVyKEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMpIHsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIGpzb25Cb2R5ID0gZ3Nvbi50b0pzb24oYXJ0aWZhY3REZXRhaWxzKTsKKwkJLy8gY2FsY3VsYXRlIE1ENSBmb3IganNvbiBib2R5CisJCXJldHVybiBjYWxjdWxhdGVNRDUoanNvbkJvZHkpOworCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlTUQ1KFN0cmluZyBkYXRhKSB7CisJCVN0cmluZyBjYWxjdWxhdGVkTWQ1ID0gb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmRpZ2VzdC5EaWdlc3RVdGlscy5tZDVIZXgoZGF0YSk7CisJCS8vIGVuY29kZSBiYXNlLTY0IHJlc3VsdAorCQlieXRlW10gZW5jb2RlQmFzZTY0ID0gQmFzZTY0LmVuY29kZUJhc2U2NChjYWxjdWxhdGVkTWQ1LmdldEJ5dGVzKCkpOworCQlTdHJpbmcgZW5jb2RlQmFzZTY0U3RyID0gbmV3IFN0cmluZyhlbmNvZGVCYXNlNjQpOworCQlyZXR1cm4gZW5jb2RlQmFzZTY0U3RyOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Bc3NldFJlc3RVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQXNzZXRSZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQXNzZXRSZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDUxMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQ2xvc2VhYmxlSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuSHR0cENsaWVudHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQXNzZXRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RBc3NldFN0cnVjdHVyZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXNzZXRTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlQXNzZXRTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBBc3NldFJlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCXN0YXRpYyBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCXN0YXRpYyBPYmplY3RNYXBwZXIgb2JqZWN0TWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCisJc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVc2VyUmVzdFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisJc3RhdGljIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCXN0YXRpYyBmaW5hbCBTdHJpbmcgYmFzaWNBdXRoZW50aWNhdGlvbiA9ICJCYXNpYyBZMms2TVRJek5EVTIiOworCS8vIC9hc2RjL3YxL2NhdGFsb2cve3NlcnZpY2VzL3Jlc291cmNlc30ve2NvbXBvbmVudFVVSUR9L2FydGlmYWN0cy97YXJ0aWZhY3RVVUlEfQorCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0FSVElGQUNUX1VSTCA9ICIvYXNkYy92MS9jYXRhbG9nLyVzLyVzL2FydGlmYWN0cy8lcyI7CisJLy8gL2FzZGMvdjEvY2F0YWxvZy97c2VydmljZXMvcmVzb3VyY2VzfS97Y29tcG9uZW50VVVJRH0vcmVzb3VyY2VJbnN0YW5jZXMve3Jlc291cmNlSW5zdGFuY2VOYW1lfS9hcnRpZmFjdHMve2FydGlmYWN0VVVJRH0KKwlzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0lOU1RBTkNFX0FSVElGQUNUX1VSTCA9ICIvYXNkYy92MS9jYXRhbG9nLyVzLyVzL3Jlc291cmNlSW5zdGFuY2VzLyVzL2FydGlmYWN0cy8lcyI7CisKKwlwdWJsaWMgc3RhdGljIEh0dHBSZXNwb25zZSBnZXRDb21wb25lbnRUb3NjYU1vZGVsKEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlLCBTdHJpbmcgdXVpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1RPU0NBX01PREVMLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCWFzc2V0VHlwZS5nZXRWYWx1ZSgpLCB1dWlkKTsKKwkJSHR0cEdldCBodHRwR2V0ID0gbmV3IEh0dHBHZXQodXJsKTsKKworCQlodHRwR2V0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5YX0VDT01QX0lOU1RBTkNFX0lELmdldFZhbHVlKCksICJjaSIpOworCQlodHRwR2V0LmFkZEhlYWRlcihIdHRwSGVhZGVyRW51bS5BVVRIT1JJWkFUSU9OLmdldFZhbHVlKCksIGJhc2ljQXV0aGVudGljYXRpb24pOworCisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBHRVQgcmVxdWVzdCB0byBnZXQgVG9zY2EgbW9kZWw6IHt9IiwgdXJsKTsKKworCQlyZXR1cm4gaHR0cGNsaWVudC5leGVjdXRlKGh0dHBHZXQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZShib29sZWFuIGlzQmFzaWNBdXRoZW50aWNhdGlvbiwgQXNzZXRUeXBlRW51bSBhc3NldFR5cGUsCisJCQlTdHJpbmcuLi4gZmlsdGVyQXJyYXlTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWlmIChpc0Jhc2ljQXV0aGVudGljYXRpb24pIHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgYmFzaWNBdXRoZW50aWNhdGlvbik7CisJCX0KKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uWF9FQ09NUF9JTlNUQU5DRV9JRC5nZXRWYWx1ZSgpLCAiY2kiKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FTU0VUX0xJU1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJYXNzZXRUeXBlLmdldFZhbHVlKCkpOworCQlpZiAoZmlsdGVyQXJyYXlTdHJpbmcgIT0gbnVsbCAmJiBmaWx0ZXJBcnJheVN0cmluZy5sZW5ndGggPiAwKSB7CisJCQl1cmwgPSBidWlsZFVybFdpdGhGaWx0ZXIodXJsLCBmaWx0ZXJBcnJheVN0cmluZyk7CisJCX0KKworCQlSZXN0UmVzcG9uc2Ugc2VuZEdldFJlc291cmNlQXNzZXRzID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCisJCXJldHVybiBzZW5kR2V0UmVzb3VyY2VBc3NldHM7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0RmlsdGVyZWRDb21wb25lbnRMaXN0KEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlLCBTdHJpbmcgcXVlcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgYmFzaWNBdXRoZW50aWNhdGlvbik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlhfRUNPTVBfSU5TVEFOQ0VfSUQuZ2V0VmFsdWUoKSwgImNpIik7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJYXNzZXRUeXBlLmdldFZhbHVlKCksIHF1ZXJ5KTsKKworCQlsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gZ2V0IFJlc291cmNlIEFzc2V0czoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlJlcXVlc3QgaGVhZGVyczoge30iLCBoZWFkZXJzTWFwKTsKKworCQlSZXN0UmVzcG9uc2Ugc2VuZEdldFJlc291cmNlQXNzZXRzID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCisJCXJldHVybiBzZW5kR2V0UmVzb3VyY2VBc3NldHM7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVcmxXaXRoRmlsdGVyKFN0cmluZyB1cmwsIFN0cmluZ1tdIGZpbHRlckFycmF5U3RyaW5nKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlpbnQgbGVuZ3RoID0gZmlsdGVyQXJyYXlTdHJpbmcubGVuZ3RoOworCQlpbnQgY291bnQgPSAwOworCQlmb3IgKFN0cmluZyBmaWx0ZXJTdHJpbmcgOiBmaWx0ZXJBcnJheVN0cmluZykgeworCQkJc2IuYXBwZW5kKGZpbHRlclN0cmluZyk7CisJCQljb3VudCsrOworCQkJaWYgKGxlbmd0aCAhPSBjb3VudCkgeworCQkJCXNiLmFwcGVuZCgiJiIpOworCQkJfQorCQl9CisJCXJldHVybiB1cmwgKyAiPyIgKyBzYjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRBc3NldE1ldGFkYXRhQnlBc3NldFR5cGVBbmRVdWlkKGJvb2xlYW4gaXNCYXNpY0F1dGhlbnRpY2F0aW9uLAorCQkJQXNzZXRUeXBlRW51bSBhc3NldFR5cGUsIFN0cmluZyB1dWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWlmIChpc0Jhc2ljQXV0aGVudGljYXRpb24pIHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgYmFzaWNBdXRoZW50aWNhdGlvbik7CisJCX0KKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uWF9FQ09NUF9JTlNUQU5DRV9JRC5nZXRWYWx1ZSgpLCAiY2kiKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FTU0VUX01FVEFEQVRBLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCWFzc2V0VHlwZS5nZXRWYWx1ZSgpLCB1dWlkKTsKKworCQlsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gZ2V0IFJlc291cmNlIEFzc2V0czoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlJlcXVlc3QgaGVhZGVyczoge30gIiwgaGVhZGVyc01hcCk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRHZXRSZXNvdXJjZUFzc2V0cyA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gc2VuZEdldFJlc291cmNlQXNzZXRzOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxSZXNvdXJjZUFzc2V0U3RydWN0dXJlPiBnZXRSZXNvdXJjZUFzc2V0TGlzdChSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSkgeworCQlMaXN0PFJlc291cmNlQXNzZXRTdHJ1Y3R1cmU+IHJlc291cmNlQXNzZXRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJSnNvbkVsZW1lbnQgamVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKGFzc2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCUpzb25BcnJheSBjb21wb25lbmV0QXJyYXkgPSAoSnNvbkFycmF5KSBqZWxlbWVudDsKKwkJZm9yIChKc29uRWxlbWVudCBqRWxlbWVudCA6IGNvbXBvbmVuZXRBcnJheSkgeworCQkJUmVzb3VyY2VBc3NldFN0cnVjdHVyZSByZXNvdXJjZSA9IGdzb24uZnJvbUpzb24oakVsZW1lbnQsIFJlc291cmNlQXNzZXRTdHJ1Y3R1cmUuY2xhc3MpOworCQkJcmVzb3VyY2VBc3NldExpc3QuYWRkKHJlc291cmNlKTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VBc3NldExpc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgZ2V0UmVzb3VyY2VBc3NldE1ldGFkYXRhKFJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlKSB7CisKKwkJTGlzdDxSZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmU+IHJlc291cmNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVJlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSByZXNvdXJjZUFzc2V0TWV0YWRhdGEgPSBuZXcgUmVzb3VyY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlKCk7CisJCVN0cmluZyByZXNwb25zZSA9IGFzc2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKworCQlKc29uT2JqZWN0IGpPYmplY3QgPSAoSnNvbk9iamVjdCkgbmV3IEpzb25QYXJzZXIoKS5wYXJzZShyZXNwb25zZSk7CisJCXJlc291cmNlQXNzZXRNZXRhZGF0YSA9IGdzb24uZnJvbUpzb24oak9iamVjdCwgUmVzb3VyY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlLmNsYXNzKTsKKworCQlzZXRSZXNvdXJjZUluc3RhbmNlQXNzZXRMaXN0KHJlc291cmNlc0xpc3QsIGpPYmplY3QpOworCQlyZXNvdXJjZUFzc2V0TWV0YWRhdGEuc2V0UmVzb3VyY2VzKHJlc291cmNlc0xpc3QpOworCisJCXNldEFydGlmYWN0QXNzZXRMaXN0KGFydGlmYWN0c0xpc3QsIGpPYmplY3QpOworCQlyZXNvdXJjZUFzc2V0TWV0YWRhdGEuc2V0QXJ0aWZhY3RzKGFydGlmYWN0c0xpc3QpOworCisJCXJldHVybiByZXNvdXJjZUFzc2V0TWV0YWRhdGE7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYWxNZXRhZGF0YUZpZWxkc1ZhbGlkYXRpb3IoQXNzZXRTdHJ1Y3R1cmUgYXNzZXRNZXRhZGF0YSwgQ29tcG9uZW50IGNvbXBvbmVudCkgeworCisJCWFzc2VydFRydWUoIkV4cGVjdGVkIHJlc291cmNlVXVpZCBpcyAiICsgY29tcG9uZW50LmdldFVVSUQoKSArICIgYWN0dWFsOiAiICsgYXNzZXRNZXRhZGF0YS5nZXRVdWlkKCksCisJCQkJYXNzZXRNZXRhZGF0YS5nZXRVdWlkKCkuZXF1YWxzKGNvbXBvbmVudC5nZXRVVUlEKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkiRXhwZWN0ZWQgcmVzb3VyY2VJbnZhcmlhbnRVdWlkIGlzICIgKyBjb21wb25lbnQuZ2V0SW52YXJpYW50VVVJRCgpICsgIiBhY3R1YWw6ICIKKwkJCQkJCSsgYXNzZXRNZXRhZGF0YS5nZXRJbnZhcmlhbnRVVUlEKCksCisJCQkJYXNzZXRNZXRhZGF0YS5nZXRJbnZhcmlhbnRVVUlEKCkuZXF1YWxzKGNvbXBvbmVudC5nZXRJbnZhcmlhbnRVVUlEKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgYXNzZXQgbmFtZSBpcyAiICsgY29tcG9uZW50LmdldE5hbWUoKSArICIgYWN0dWFsOiAiICsgYXNzZXRNZXRhZGF0YS5nZXROYW1lKCksCisJCQkJYXNzZXRNZXRhZGF0YS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudC5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgYXNzZXQgdmVyc2lvbiBpcyAiICsgY29tcG9uZW50LmdldFZlcnNpb24oKSArICIgYWN0dWFsOiAiICsgYXNzZXRNZXRhZGF0YS5nZXRWZXJzaW9uKCksCisJCQkJYXNzZXRNZXRhZGF0YS5nZXRWZXJzaW9uKCkuZXF1YWxzKGNvbXBvbmVudC5nZXRWZXJzaW9uKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkiRXhwZWN0ZWQgYXNzZXQgbGFzdFVwZGF0ZXJVc2VySWQgaXMgIiArIGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpICsgIiBhY3R1YWw6ICIKKwkJCQkJCSsgYXNzZXRNZXRhZGF0YS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLAorCQkJCWFzc2V0TWV0YWRhdGEuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKS5lcXVhbHMoY29tcG9uZW50LmdldExhc3RVcGRhdGVyVXNlcklkKCkpKTsKKwkJYXNzZXJ0Tm90TnVsbCgiRXhwZWN0ZWQgYXNzZXQgdG9zY2FNb2RlbCBpcyBudWxsIiwgYXNzZXRNZXRhZGF0YS5nZXRUb3NjYU1vZGVsVVJMKCkpOworCQlhc3NlcnRUcnVlKAorCQkJCSJFeHBlY3RlZCBhc3NldCBjYXRlZ29yeSBpcyAiICsgY29tcG9uZW50LmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpICsgIiBhY3R1YWw6ICIKKwkJCQkJCSsgYXNzZXRNZXRhZGF0YS5nZXRDYXRlZ29yeSgpLAorCQkJCWFzc2V0TWV0YWRhdGEuZ2V0Q2F0ZWdvcnkoKS5lcXVhbHMoY29tcG9uZW50LmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUoCisJCQkJIkV4cGVjdGVkIGFzc2V0IGxpZmVDeWNsZVN0YXRlIGlzICIgKyBjb21wb25lbnQuZ2V0TGlmZWN5Y2xlU3RhdGUoKSArICIgYWN0dWFsOiAiCisJCQkJCQkrIGFzc2V0TWV0YWRhdGEuZ2V0TGlmZWN5Y2xlU3RhdGUoKSwKKwkJCQlhc3NldE1ldGFkYXRhLmdldExpZmVjeWNsZVN0YXRlKCkuZXF1YWxzKGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpLnRvU3RyaW5nKCkpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvdXJjZU1ldGFkYXRhVmFsaWRhdGlvcihSZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgcmVzb3VyY2VBc3NldE1ldGFkYXRhLAorCQkJUmVzb3VyY2UgcmVzb3VyY2UsIEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlKSB7CisKKwkJZ2VuZXJhbE1ldGFkYXRhRmllbGRzVmFsaWRhdGlvcihyZXNvdXJjZUFzc2V0TWV0YWRhdGEsIHJlc291cmNlKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkiRXhwZWN0ZWQgYXNzZXQgbGFzdFVwZGF0ZXJGdWxsTmFtZSBpcyAiICsgcmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpICsgIiBhY3R1YWw6ICIKKwkJCQkJCSsgcmVzb3VyY2VBc3NldE1ldGFkYXRhLmdldExhc3RVcGRhdGVyRnVsbE5hbWUoKSwKKwkJCQlyZXNvdXJjZUFzc2V0TWV0YWRhdGEuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpLmVxdWFscyhyZXNvdXJjZS5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkiRXhwZWN0ZWQgYXNzZXQgc3ViQ2F0ZWdvcnkgaXMgIiArIHJlc291cmNlLmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0U3ViY2F0ZWdvcmllcygpLmdldCgwKS5nZXROYW1lKCkKKwkJCQkJCSsgIiBhY3R1YWw6ICIgKyByZXNvdXJjZUFzc2V0TWV0YWRhdGEuZ2V0U3ViQ2F0ZWdvcnkoKSwKKwkJCQlyZXNvdXJjZUFzc2V0TWV0YWRhdGEuZ2V0U3ViQ2F0ZWdvcnkoKQorCQkJCQkJLmVxdWFscyhyZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUoCisJCQkJIkV4cGVjdGVkIGFzc2V0IHRvc2NhUmVzb3VyY2VOYW1lIGlzICIgKyByZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpICsgIiBhY3R1YWw6ICIKKwkJCQkJCSsgcmVzb3VyY2VBc3NldE1ldGFkYXRhLmdldFRvc2NhUmVzb3VyY2VOYW1lKCksCisJCQkJcmVzb3VyY2VBc3NldE1ldGFkYXRhLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkuZXF1YWxzKHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkiRXhwZWN0ZWQgYXNzZXQgcmVzb3VyY2VUeXBlIGlzICIgKyByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSArICIgYWN0dWFsOiAiCisJCQkJCQkrIHJlc291cmNlQXNzZXRNZXRhZGF0YS5nZXRSZXNvdXJjZVR5cGUoKSwKKwkJCQlyZXNvdXJjZUFzc2V0TWV0YWRhdGEuZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpLnRvU3RyaW5nKCkpKTsKKwkJcmVzb3VyY2VJbnN0YW5jZUFzc2V0VmFsaWRhdG9yKHJlc291cmNlQXNzZXRNZXRhZGF0YS5nZXRSZXNvdXJjZXMoKSwgcmVzb3VyY2UsIGFzc2V0VHlwZSk7CisJCS8vIHJlc291cmNlSW5zdGFuY2VBc3NldFZhbGlkYXRvcihyZXNvdXJjZUFzc2V0TWV0YWRhdGEuZ2V0UmVzb3VyY2VzKCksCisJCS8vIHJlc291cmNlKTsKKwkJYXJ0aWZhY3RBc3NldFZhbGlkYXRvcihyZXNvdXJjZUFzc2V0TWV0YWRhdGEuZ2V0QXJ0aWZhY3RzKCksIHJlc291cmNlLCBhc3NldFR5cGUpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNlcnZpY2VNZXRhZGF0YVZhbGlkYXRpb3IoU2VydmljZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgc2VydmljZUFzc2V0TWV0YWRhdGEsIFNlcnZpY2Ugc2VydmljZSwKKwkJCUFzc2V0VHlwZUVudW0gYXNzZXRUeXBlKSB7CisKKwkJZ2VuZXJhbE1ldGFkYXRhRmllbGRzVmFsaWRhdGlvcihzZXJ2aWNlQXNzZXRNZXRhZGF0YSwgc2VydmljZSk7CisJCWFzc2VydFRydWUoCisJCQkJIkV4cGVjdGVkIGFzc2V0IGxhc3RVcGRhdGVyRnVsbE5hbWUgaXMgIiArIHNlcnZpY2UuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpICsgIiBhY3R1YWw6ICIKKwkJCQkJCSsgc2VydmljZUFzc2V0TWV0YWRhdGEuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpLAorCQkJCXNlcnZpY2VBc3NldE1ldGFkYXRhLmdldExhc3RVcGRhdGVyRnVsbE5hbWUoKS5lcXVhbHMoc2VydmljZS5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkiRXhwZWN0ZWQgYXNzZXQgZGlzdHJpYnV0aW9uU3RhdHVzIGlzICIgKyBzZXJ2aWNlLmdldERpc3RyaWJ1dGlvblN0YXR1cygpICsgIiBhY3R1YWw6ICIKKwkJCQkJCSsgc2VydmljZUFzc2V0TWV0YWRhdGEuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCksCisJCQkJc2VydmljZUFzc2V0TWV0YWRhdGEuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCkuZXF1YWxzKHNlcnZpY2UuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCkudG9TdHJpbmcoKSkpOworCQlyZXNvdXJjZUluc3RhbmNlQXNzZXRWYWxpZGF0b3Ioc2VydmljZUFzc2V0TWV0YWRhdGEuZ2V0UmVzb3VyY2VzKCksIHNlcnZpY2UsIGFzc2V0VHlwZSk7CisJCS8vIHJlc291cmNlSW5zdGFuY2VBc3NldFZhbGlkYXRvcihzZXJ2aWNlQXNzZXRNZXRhZGF0YS5nZXRSZXNvdXJjZXMoKSwKKwkJLy8gc2VydmljZSk7CisJCWFydGlmYWN0QXNzZXRWYWxpZGF0b3Ioc2VydmljZUFzc2V0TWV0YWRhdGEuZ2V0QXJ0aWZhY3RzKCksIHNlcnZpY2UsIGFzc2V0VHlwZSk7CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFydGlmYWN0QXNzZXRWYWxpZGF0b3IoTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdEFzc2V0U3RydWN0dXJlTGlzdCwKKwkJCUNvbXBvbmVudCBjb21wb25lbnQsIEFzc2V0VHlwZUVudW0gYXNzZXRUeXBlKSB7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0cyA9IGNvbXBvbmVudC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCXZhbGlkYXRlQXJ0aWZhY3RNZXRhZGF0YShjb21wb25lbnREZXBsb3ltZW50QXJ0aWZhY3RzLCBhcnRpZmFjdEFzc2V0U3RydWN0dXJlTGlzdCwgY29tcG9uZW50LmdldFVVSUQoKSwKKwkJCQlhc3NldFR5cGUsIG51bGwpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVBcnRpZmFjdE1ldGFkYXRhKE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0cywKKwkJCUxpc3Q8QXJ0aWZhY3RBc3NldFN0cnVjdHVyZT4gYXJ0aWZhY3RBc3NldFN0cnVjdHVyZUxpc3QsIFN0cmluZyBjb21wb25lbnRVdWlkLCBBc3NldFR5cGVFbnVtIGFzc2V0VHlwZSwKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSkgeworCisJCWZvciAoRW50cnk8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdCA6IGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJQXJ0aWZhY3RBc3NldFN0cnVjdHVyZSBhcnRpZmFjdEFzc2V0U3RydWN0dXJlID0gZ2V0QXJ0aWZhY3RNZXRhZGF0YShhcnRpZmFjdEFzc2V0U3RydWN0dXJlTGlzdCwKKwkJCQkJY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0LmdldFZhbHVlKCkuZ2V0QXJ0aWZhY3RVVUlEKCkpOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdFZhbHVlID0gY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0LmdldFZhbHVlKCk7CisJCQlpZiAoYXJ0aWZhY3RBc3NldFN0cnVjdHVyZSAhPSBudWxsKSB7CisJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCSJFeHBlY3RlZCBhcnRpZmFjdCBhc3NldCBhcnRpZmFjdE5hbWUgaXMgIiArIGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdFZhbHVlLmdldEFydGlmYWN0TmFtZSgpCisJCQkJCQkJCSsgIiBhY3R1YWw6ICIgKyBhcnRpZmFjdEFzc2V0U3RydWN0dXJlLmdldEFydGlmYWN0TmFtZSgpLAorCQkJCQkJY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0VmFsdWUuZ2V0QXJ0aWZhY3ROYW1lKCkKKwkJCQkJCQkJLmVxdWFscyhhcnRpZmFjdEFzc2V0U3RydWN0dXJlLmdldEFydGlmYWN0TmFtZSgpKSk7CisJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCSJFeHBlY3RlZCBhcnRpZmFjdCBhc3NldCBUeXBlIGlzICIgKyBjb21wb25lbnREZXBsb3ltZW50QXJ0aWZhY3RWYWx1ZS5nZXRBcnRpZmFjdFR5cGUoKQorCQkJCQkJCQkrICIgYWN0dWFsOiAiICsgYXJ0aWZhY3RBc3NldFN0cnVjdHVyZS5nZXRBcnRpZmFjdFR5cGUoKSwKKwkJCQkJCWNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdFZhbHVlLmdldEFydGlmYWN0VHlwZSgpCisJCQkJCQkJCS5lcXVhbHMoYXJ0aWZhY3RBc3NldFN0cnVjdHVyZS5nZXRBcnRpZmFjdFR5cGUoKSkpOworCQkJCS8vIGFzc2VydE5vdE51bGwoIkV4cGVjdGVkIGFydGlmYWN0IGFzc2V0IHJlc291cmNlSW52YXJpYW50VVVJRAorCQkJCS8vIGlzIG51bGwiLAorCQkJCS8vIHJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5nZXRSZXNvdXJjZUludmFyaWFudFVVSUQoKSk7CisJCQkJLy8gU3RyaW5nIGV4cGVjdGVkQXJ0aWZhY3RVcmwgPSAiL2FzZGMvdjEvY2F0YWxvZy8iICsKKwkJCQkvLyBhc3NldFR5cGUuZ2V0VmFsdWUoKSArICIvIiArIGNvbXBvbmVudFV1aWQgKyAiL2FydGlmYWN0cy8iICsKKwkJCQkvLyBjb21wb25lbnREZXBsb3ltZW50QXJ0aWZhY3RWYWx1ZS5nZXRBcnRpZmFjdFVVSUQoKTsKKwkJCQlTdHJpbmcgZXhwZWN0ZWRBcnRpZmFjdFVybCA9ICIiOworCQkJCWlmIChyZXNvdXJjZUluc3RhbmNlTmFtZSA9PSBudWxsKSB7CisJCQkJCWV4cGVjdGVkQXJ0aWZhY3RVcmwgPSBTdHJpbmcuZm9ybWF0KENPTVBPTkVOVF9BUlRJRkFDVF9VUkwsIGFzc2V0VHlwZS5nZXRWYWx1ZSgpLCBjb21wb25lbnRVdWlkLAorCQkJCQkJCWNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdFZhbHVlLmdldEFydGlmYWN0VVVJRCgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlleHBlY3RlZEFydGlmYWN0VXJsID0gU3RyaW5nLmZvcm1hdChSRVNPVVJDRV9JTlNUQU5DRV9BUlRJRkFDVF9VUkwsIGFzc2V0VHlwZS5nZXRWYWx1ZSgpLAorCQkJCQkJCWNvbXBvbmVudFV1aWQsIHJlc291cmNlSW5zdGFuY2VOYW1lLCBjb21wb25lbnREZXBsb3ltZW50QXJ0aWZhY3RWYWx1ZS5nZXRBcnRpZmFjdFVVSUQoKSk7CisJCQkJfQorCisJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCSJFeHBlY3RlZCBhcnRpZmFjdCBhc3NldCBVUkwgaXMgIiArIGV4cGVjdGVkQXJ0aWZhY3RVcmwgKyAiIGFjdHVhbDogIgorCQkJCQkJCQkrIGFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUuZ2V0QXJ0aWZhY3RVUkwoKSwKKwkJCQkJCWFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUuZ2V0QXJ0aWZhY3RVUkwoKS5lcXVhbHMoZXhwZWN0ZWRBcnRpZmFjdFVybCkpOworCQkJCWFzc2VydFRydWUoCisJCQkJCQkiRXhwZWN0ZWQgYXJ0aWZhY3QgYXNzZXQgZGVzY3JpcHRpb24gaXMgIiArIGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdFZhbHVlLmdldERlc2NyaXB0aW9uKCkKKwkJCQkJCQkJKyAiIGFjdHVhbDogIiArIGFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpLAorCQkJCQkJY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0VmFsdWUuZ2V0RGVzY3JpcHRpb24oKS50b1N0cmluZygpCisJCQkJCQkJCS5lcXVhbHMoYXJ0aWZhY3RBc3NldFN0cnVjdHVyZS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpKTsKKwkJCQlhc3NlcnRUcnVlKAorCQkJCQkJIkV4cGVjdGVkIGFydGlmYWN0IGFzc2V0IGNoZWNrU3VtIGlzICIgKyBjb21wb25lbnREZXBsb3ltZW50QXJ0aWZhY3RWYWx1ZS5nZXRBcnRpZmFjdENoZWNrc3VtKCkKKwkJCQkJCQkJKyAiIGFjdHVhbDogIiArIGFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpLAorCQkJCQkJY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0VmFsdWUuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpCisJCQkJCQkJCS5lcXVhbHMoYXJ0aWZhY3RBc3NldFN0cnVjdHVyZS5nZXRBcnRpZmFjdENoZWNrc3VtKCkpKTsKKwkJCQlhc3NlcnRUcnVlKAorCQkJCQkJIkV4cGVjdGVkIGFydGlmYWN0IGFzc2V0IHZlcnNpb24gaXMgIiArIGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdFZhbHVlLmdldEFydGlmYWN0VmVyc2lvbigpCisJCQkJCQkJCSsgIiBhY3R1YWw6ICIgKyBhcnRpZmFjdEFzc2V0U3RydWN0dXJlLmdldEFydGlmYWN0VmVyc2lvbigpLAorCQkJCQkJY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0VmFsdWUuZ2V0QXJ0aWZhY3RWZXJzaW9uKCkKKwkJCQkJCQkJLmVxdWFscyhhcnRpZmFjdEFzc2V0U3RydWN0dXJlLmdldEFydGlmYWN0VmVyc2lvbigpKSk7CisJCQkJaWYgKGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdFZhbHVlLmdldFRpbWVvdXQoKSA+IDApIHsKKwkJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCQkiRXhwZWN0ZWQgYXJ0aWZhY3QgYXNzZXQgdGltZW91dCBpcyAiICsgY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0VmFsdWUuZ2V0VGltZW91dCgpCisJCQkJCQkJCQkrICIgYWN0dWFsOiAiICsgYXJ0aWZhY3RBc3NldFN0cnVjdHVyZS5nZXRBcnRpZmFjdFRpbWVvdXQoKSwKKwkJCQkJCQljb21wb25lbnREZXBsb3ltZW50QXJ0aWZhY3RWYWx1ZS5nZXRUaW1lb3V0KCkKKwkJCQkJCQkJCS5lcXVhbHMoYXJ0aWZhY3RBc3NldFN0cnVjdHVyZS5nZXRBcnRpZmFjdFRpbWVvdXQoKSkpOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQlhc3NlcnRUcnVlKCJhcnRpZmFjdCBhc3NldCB3aXRoIFVVSUQiICsgY29tcG9uZW50RGVwbG95bWVudEFydGlmYWN0LmdldFZhbHVlKCkuZ2V0QXJ0aWZhY3RVVUlEKCkKKwkJCQkJCSsgIiBub3QgZm91bmQgaW4gZ2V0IE1ldGFkYXRhIHJlc3BvbnNlIiwgZmFsc2UpOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBBcnRpZmFjdEFzc2V0U3RydWN0dXJlIGdldEFydGlmYWN0TWV0YWRhdGEoTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdEFzc2V0U3RydWN0dXJlTGlzdCwKKwkJCVN0cmluZyBhcnRpZmFjdFVVSUQpIHsKKwkJZm9yIChBcnRpZmFjdEFzc2V0U3RydWN0dXJlIGFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUgOiBhcnRpZmFjdEFzc2V0U3RydWN0dXJlTGlzdCkgeworCQkJaWYgKGFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUuZ2V0QXJ0aWZhY3RVVUlEKCkuZXF1YWxzKGFydGlmYWN0VVVJRCkpIHsKKwkJCQlyZXR1cm4gYXJ0aWZhY3RBc3NldFN0cnVjdHVyZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHJlc291cmNlSW5zdGFuY2VBc3NldFZhbGlkYXRvcigKKwkJCUxpc3Q8UmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlPiByZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmVzLCBDb21wb25lbnQgY29tcG9uZW50LAorCQkJQXNzZXRUeXBlRW51bSBhc3NldFR5cGUpIHsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXMgIT0gbnVsbCkgeworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA6IGNvbXBvbmVudEluc3RhbmNlcykgeworCQkJCVJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZSByZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUgPSBnZXRSZXNvdXJjZUluc3RhbmNlTWV0YWRhdGEoCisJCQkJCQlyZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmVzLCBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQkJCWlmIChyZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUgIT0gbnVsbCkgeworCQkJCQlhc3NlcnRUcnVlKAorCQkJCQkJCSJFeHBlY3RlZCBSSSBhc3NldCByZXNvdXJjZU5hbWUgaXMgIiArIGNvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudE5hbWUoKSArICIgYWN0dWFsOiAiCisJCQkJCQkJCQkrIHJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5nZXRSZXNvdXJjZU5hbWUoKSwKKwkJCQkJCQljb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnROYW1lKCkKKwkJCQkJCQkJCS5lcXVhbHMocmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlLmdldFJlc291cmNlTmFtZSgpKSk7CisJCQkJCWFzc2VydFRydWUoCisJCQkJCQkJIkV4cGVjdGVkIFJJIGFzc2V0IE5hbWUgaXMgIiArIGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSArICIgYWN0dWFsOiAiCisJCQkJCQkJCQkrIHJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5nZXRSZXNvdXJjZUluc3RhbmNlTmFtZSgpLAorCQkJCQkJCWNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKQorCQkJCQkJCQkJLmVxdWFscyhyZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUuZ2V0UmVzb3VyY2VJbnN0YW5jZU5hbWUoKSkpOworCQkJCQlhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCBSSSBhc3NldCByZXNvdXJjZUludmFyaWFudFVVSUQgaXMgbnVsbCIsCisJCQkJCQkJcmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlLmdldFJlc291cmNlSW52YXJpYW50VVVJRCgpKTsKKwkJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCQkiRXhwZWN0ZWQgUkkgYXNzZXQgcmVzb3VyY2VWZXJzaW9uIGlzICIgKyBjb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRWZXJzaW9uKCkKKwkJCQkJCQkJCSsgIiBhY3R1YWw6ICIgKyByZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUuZ2V0UmVzb3VyY2VWZXJzaW9uKCksCisJCQkJCQkJY29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50VmVyc2lvbigpCisJCQkJCQkJCQkuZXF1YWxzKHJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5nZXRSZXNvdXJjZVZlcnNpb24oKSkpOworCQkJCQlhc3NlcnRUcnVlKAorCQkJCQkJCSJFeHBlY3RlZCBSSSBhc3NldCByZXNvdXJjZVR5cGUgaXMgIiArIGNvbXBvbmVudEluc3RhbmNlLmdldE9yaWdpblR5cGUoKSArICIgYWN0dWFsOiAiCisJCQkJCQkJCQkrIHJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5nZXRSZXNvdWNyZVR5cGUoKSwKKwkJCQkJCQljb21wb25lbnRJbnN0YW5jZS5nZXRPcmlnaW5UeXBlKCkudG9TdHJpbmcoKQorCQkJCQkJCQkJLmVxdWFscyhyZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUuZ2V0UmVzb3VjcmVUeXBlKCkpKTsKKwkJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCQkiRXhwZWN0ZWQgUkkgYXNzZXQgcmVzb3VyY2VVVUlEIGlzICIgKyBjb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKSArICIgYWN0dWFsOiAiCisJCQkJCQkJCQkrIHJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5nZXRSZXNvdXJjZVVVSUQoKSwKKwkJCQkJCQljb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKQorCQkJCQkJCQkJLmVxdWFscyhyZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUuZ2V0UmVzb3VyY2VVVUlEKCkpKTsKKwkJCQkJdmFsaWRhdGVBcnRpZmFjdE1ldGFkYXRhKGNvbXBvbmVudEluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSwKKwkJCQkJCQlyZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUuZ2V0QXJ0aWZhY3RzKCksIGNvbXBvbmVudC5nZXRVVUlEKCksIGFzc2V0VHlwZSwKKwkJCQkJCQljb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJCQkJLy8gdmFsaWRhdGVBcnRpZmFjdE1ldGFkYXRhKGNvbXBvbmVudEluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSwKKwkJCQkJLy8gcmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlLmdldEFydGlmYWN0cygpLAorCQkJCQkvLyBjb21wb25lbnQuZ2V0VVVJRCgpLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXNzZXJ0VHJ1ZSgicmVzb3VyY2VJbnN0YW5jZSBhc3NldCB3aXRoIFVVSUQiICsgY29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCkKKwkJCQkJCQkrICIgbm90IGZvdW5kIGluIGdldCBNZXRhZGF0YSByZXNwb25zZSIsIGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCS8vIHByaXZhdGUgc3RhdGljIFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZQorCS8vIGdldFJlc291cmNlSW5zdGFuY2VNZXRhZGF0YShMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4KKwkvLyByZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmVzLCBTdHJpbmcgY29tcG9uZW50VWlkKSB7CisJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlIGdldFJlc291cmNlSW5zdGFuY2VNZXRhZGF0YSgKKwkJCUxpc3Q8UmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlPiByZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmVzLCBTdHJpbmcgbmFtZSkgeworCQlmb3IgKFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZSByZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmUgOiByZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmVzKSB7CisJCQlpZiAocmVzb3VyY2VJbnN0YW5jZUFzc2V0U3RydWN0dXJlLmdldFJlc291cmNlSW5zdGFuY2VOYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlIGdldFNlcnZpY2VBc3NldE1ldGFkYXRhKFJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlKSB7CisKKwkJTGlzdDxSZXNvdXJjZUluc3RhbmNlQXNzZXRTdHJ1Y3R1cmU+IHJlc291cmNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxBcnRpZmFjdEFzc2V0U3RydWN0dXJlPiBhcnRpZmFjdHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVNlcnZpY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlIHNlcnZpY2VBc3NldE1ldGFkYXRhOworCisJCUpzb25PYmplY3Qgak9iamVjdCA9IChKc29uT2JqZWN0KSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKGFzc2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCXNlcnZpY2VBc3NldE1ldGFkYXRhID0gZ3Nvbi5mcm9tSnNvbihqT2JqZWN0LCBTZXJ2aWNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZS5jbGFzcyk7CisKKwkJc2V0UmVzb3VyY2VJbnN0YW5jZUFzc2V0TGlzdChyZXNvdXJjZXNMaXN0LCBqT2JqZWN0KTsKKwkJc2VydmljZUFzc2V0TWV0YWRhdGEuc2V0UmVzb3VyY2VzKHJlc291cmNlc0xpc3QpOworCisJCXNldEFydGlmYWN0QXNzZXRMaXN0KGFydGlmYWN0c0xpc3QsIGpPYmplY3QpOworCQlzZXJ2aWNlQXNzZXRNZXRhZGF0YS5zZXRBcnRpZmFjdHMoYXJ0aWZhY3RzTGlzdCk7CisKKwkJcmV0dXJuIHNlcnZpY2VBc3NldE1ldGFkYXRhOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBcnRpZmFjdEFzc2V0TGlzdChMaXN0PEFydGlmYWN0QXNzZXRTdHJ1Y3R1cmU+IGFydGlmYWN0c0xpc3QsIEpzb25PYmplY3Qgak9iamVjdCkgeworCQlKc29uQXJyYXkgYXJ0aWZhY3RzQXJyYXkgPSBqT2JqZWN0LmdldEFzSnNvbkFycmF5KCJhcnRpZmFjdHMiKTsKKwkJaWYgKGFydGlmYWN0c0FycmF5ICE9IG51bGwpIHsKKwkJCWZvciAoSnNvbkVsZW1lbnQgakVsZW1lbnQgOiBhcnRpZmFjdHNBcnJheSkgeworCQkJCUFydGlmYWN0QXNzZXRTdHJ1Y3R1cmUgYXJ0aWZhY3QgPSBnc29uLmZyb21Kc29uKGpFbGVtZW50LCBBcnRpZmFjdEFzc2V0U3RydWN0dXJlLmNsYXNzKTsKKwkJCQlhcnRpZmFjdHNMaXN0LmFkZChhcnRpZmFjdCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVzb3VyY2VJbnN0YW5jZUFzc2V0TGlzdChMaXN0PFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VzTGlzdCwKKwkJCUpzb25PYmplY3Qgak9iamVjdCkgeworCQlKc29uQXJyYXkgcmVzb3VyY2VzQXJyYXkgPSBqT2JqZWN0LmdldEFzSnNvbkFycmF5KCJyZXNvdXJjZXMiKTsKKwkJaWYgKHJlc291cmNlc0FycmF5ICE9IG51bGwpIHsKKwkJCWZvciAoSnNvbkVsZW1lbnQgakVsZW1lbnQgOiByZXNvdXJjZXNBcnJheSkgeworCQkJCVJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZSByZXNvdXJjZSA9IGdzb24uZnJvbUpzb24oakVsZW1lbnQsIFJlc291cmNlSW5zdGFuY2VBc3NldFN0cnVjdHVyZS5jbGFzcyk7CisJCQkJcmVzb3VyY2VzTGlzdC5hZGQocmVzb3VyY2UpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFNlcnZpY2VBc3NldFN0cnVjdHVyZT4gZ2V0U2VydmljZUFzc2V0TGlzdChSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSkgeworCQlMaXN0PFNlcnZpY2VBc3NldFN0cnVjdHVyZT4gc2VydmljZUFzc2V0TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCUpzb25FbGVtZW50IGplbGVtZW50ID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShhc3NldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQlKc29uQXJyYXkgY29tcG9uZW5ldEFycmF5ID0gKEpzb25BcnJheSkgamVsZW1lbnQ7CisJCWZvciAoSnNvbkVsZW1lbnQgakVsZW1lbnQgOiBjb21wb25lbmV0QXJyYXkpIHsKKwkJCVNlcnZpY2VBc3NldFN0cnVjdHVyZSBzZXJ2aWNlID0gZ3Nvbi5mcm9tSnNvbihqRWxlbWVudCwgU2VydmljZUFzc2V0U3RydWN0dXJlLmNsYXNzKTsKKwkJCXNlcnZpY2VBc3NldExpc3QuYWRkKHNlcnZpY2UpOworCQl9CisJCXJldHVybiBzZXJ2aWNlQXNzZXRMaXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFJlc291cmNlTmFtZXNMaXN0KExpc3Q8UmVzb3VyY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VBc3NldExpc3QpIHsKKwkJTGlzdDxTdHJpbmc+IGFzc2V0TmFtZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoUmVzb3VyY2VBc3NldFN0cnVjdHVyZSByZXNvdXJjZUFzc2V0IDogcmVzb3VyY2VBc3NldExpc3QpIHsKKwkJCWFzc2V0TmFtZXNMaXN0LmFkZChyZXNvdXJjZUFzc2V0LmdldE5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIGFzc2V0TmFtZXNMaXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFNlcnZpY2VOYW1lc0xpc3QoTGlzdDxTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU+IHNlcnZpY2VBc3NldExpc3QpIHsKKwkJTGlzdDxTdHJpbmc+IGFzc2V0TmFtZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoU2VydmljZUFzc2V0U3RydWN0dXJlIHNlcnZpY2VBc3NldCA6IHNlcnZpY2VBc3NldExpc3QpIHsKKwkJCWFzc2V0TmFtZXNMaXN0LmFkZChzZXJ2aWNlQXNzZXQuZ2V0TmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gYXNzZXROYW1lc0xpc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUmVzb3VyY2VUeXBlSW5PYmplY3RMaXN0KExpc3Q8UmVzb3VyY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VBc3NldExpc3QsCisJCQlSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSkgeworCQlmb3IgKFJlc291cmNlQXNzZXRTdHJ1Y3R1cmUgcmVzb3VyY2VBc3NldCA6IHJlc291cmNlQXNzZXRMaXN0KSB7CisJCQlhc3NlcnRUcnVlKAorCQkJCQkiRXhwZWN0ZWQgcmVzb3VyY2VUeXBlIGlzICIgKyByZXNvdXJjZVR5cGUudG9TdHJpbmcoKSArICIgYWN0dWFsOiAiCisJCQkJCQkJKyByZXNvdXJjZUFzc2V0LmdldFJlc291cmNlVHlwZSgpLAorCQkJCQlyZXNvdXJjZUFzc2V0LmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhyZXNvdXJjZVR5cGUudG9TdHJpbmcoKSkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQmFzZVJlc3RVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQmFzZVJlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZmU1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9CYXNlUmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5CYXNlVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBCYXNlUmVzdFV0aWxzIGV4dGVuZHMgQmFzZVZhbGlkYXRpb25VdGlscyB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udGVudFR5cGVIZWFkZXJEYXRhID0gImFwcGxpY2F0aW9uL2pzb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGFjY2VwdEhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWNjZXB0SnNvbkhlYWRlciA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBhY2NlcHRPY3RldEhlYWRlciA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGF1dGhvcml6YXRpb25IZWFkZXIgPSAiQmFzaWMgIiArIEJhc2U2NC5lbmNvZGVCYXNlNjRTdHJpbmcoImNpOjEyMzQ1NiIuZ2V0Qnl0ZXMoKSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWNjZXB0T2N0ZXRTdHJlYW0gPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlY29tcCA9ICJlY29tcCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvblByZWZpeFN0cmluZyA9ICJCYXNpYyAiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUgPSAicmVzb3VyY2VzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0NPTVBPTkVOVF9UWVBFID0gInByb2R1Y3RzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0NPTVBPTkVOVF9UWVBFID0gInNlcnZpY2VzIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1NVQ0NFU1MgPSAyMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfQ1JFQVRFRCA9IDIwMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9ERUxFVEUgPSAyMDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfTk9UX0ZPVU5EID0gNDA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1NVQ0NFU1NfTk9fQ09OVEVOVCA9IDIwNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9TVUNDRVNTX0RFTEVURSA9IDIwNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9JTlZBTElEX0NPTlRFTlQgPSA0MDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfTUlTU0lOR19EQVRBID0gNDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX01JU1NJTkdfSU5GT1JNQVRJT04gPSA0MDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9BQ0NFU1MgPSA0MDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfQUxSRUFEWV9FWElTVFMgPSA0MDk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfUkVTVFJJQ1RFRF9PUEVSQVRJT04gPSA0MDk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVCA9IDQwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9NSVNTSU5HX0NPTVBPTkVOVF9OQU1FID0gNDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1VOU1VQUE9SVEVEX0VSUk9SID0gNDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX0lNUE9SVF9TVUNDRVNTID0gMjAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1VQREFURV9TVUNDRVNTID0gMjAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RSSUNURURfT1BFUkFUSU9OID0gNDA5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX0dFVF9TVUNDRVNTID0gMjAwOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VDQ0VTU19NRVNTQUdFID0gIk9LIjsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmFzZVJlc3RVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGVuY29kZUJhc2U2NDsKKworCS8vICoqKioqKioqKioqKiogUFJJVkFURSBNRVRIT0RTICoqKioqKioqKioqKioqKioqKioqKioqKgorCisJcHJvdGVjdGVkIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByZXBhcmVIZWFkZXJzTWFwKFN0cmluZyB1c2VySWQpIHsKKwkJcmV0dXJuIHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCwgYWNjZXB0SGVhZGVyRGF0YSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByZXBhcmVIZWFkZXJzTWFwKFN0cmluZyB1c2VySWQsIFN0cmluZyBhY2NlcHQpIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWlmIChjb250ZW50VHlwZUhlYWRlckRhdGEgIT0gbnVsbCkgeworCQkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCX0KKwkJaWYgKGFjY2VwdCAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0KTsKKwkJfQorCQlpZiAodXNlcklkICE9IG51bGwpIHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgdXNlcklkKTsKKwkJfQorCisJCXJldHVybiBoZWFkZXJzTWFwOworCX0KKworCS8vIHNlbmQgcmVxdWVzdAorCS8vIEdFVAorCXByb3RlY3RlZCBzdGF0aWMgUmVzdFJlc3BvbnNlIHNlbmRHZXQoU3RyaW5nIHVybCwgU3RyaW5nIHVzZXJJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCB1c2VySWQsIG51bGwpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgUmVzdFJlc3BvbnNlIHNlbmRHZXQoU3RyaW5nIHVybCwgU3RyaW5nIHVzZXJJZCwgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisJCWlmIChhZGRpdGlvbmFsSGVhZGVycyAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dEFsbChhZGRpdGlvbmFsSGVhZGVycyk7CisJCX0KKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBzZW5kR2V0QW5kUmVtb3ZlSGVhZGVycyhTdHJpbmcgdXJsLCBTdHJpbmcgdXNlcklkLCBMaXN0PFN0cmluZz4gaGVhZGVyc1RvUmVtb3ZlKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKwkJaWYgKGhlYWRlcnNUb1JlbW92ZSAhPSBudWxsKSB7CisJCQlmb3IgKFN0cmluZyBoZWFkZXIgOiBoZWFkZXJzVG9SZW1vdmUpIHsKKwkJCQloZWFkZXJzTWFwLnJlbW92ZShoZWFkZXIpOworCQkJfQorCQl9CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKwkJcmV0dXJuIGdldFJlc291cmNlUmVzcG9uc2U7CisJfQorCisJLy8gUFVUCisJcHJvdGVjdGVkIHN0YXRpYyBSZXN0UmVzcG9uc2Ugc2VuZFB1dChTdHJpbmcgdXJsLCBTdHJpbmcgdXNlckJvZHlKc29uLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgY29udCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCwgY29udCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRCeU1ldGhvZCh1cmwsICJQVVQiLCB1c2VyQm9keUpzb24sIGhlYWRlcnNNYXApOworCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2VSZXNwb25zZTsKKwl9CisKKwkvLyBQT1NUCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2Ugc2VuZFBvc3QoU3RyaW5nIHVybCwgU3RyaW5nIHVzZXJCb2R5SnNvbiwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGFjY2VwdCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBzZW5kUG9zdCh1cmwsIHVzZXJCb2R5SnNvbiwgdXNlcklkLCBhY2NlcHQsIG51bGwpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgUmVzdFJlc3BvbnNlIHNlbmRQb3N0KFN0cmluZyB1cmwsIFN0cmluZyB1c2VyQm9keUpzb24sIFN0cmluZyB1c2VySWQsIFN0cmluZyBhY2NlcHQsCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQsIGFjY2VwdCk7CisJCWlmIChhZGRpdGlvbmFsSGVhZGVycyAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dEFsbChhZGRpdGlvbmFsSGVhZGVycyk7CisJCX0KKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgcG9zdFJlc291cmNlUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisJCXJldHVybiBwb3N0UmVzb3VyY2VSZXNwb25zZTsKKwl9CisKKwkvLyB1c2VkIGZvcm0gY29tcGxleCByZXF1ZXN0cyBsaWtlIGltcG9ydCBjYXRlZ29yaWVzLi4KKwlwcm90ZWN0ZWQgc3RhdGljIFJlc3RSZXNwb25zZSBzZW5kUG9zdChTdHJpbmcgdXJsLCBIdHRwRW50aXR5IGVudGl0eSwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGFjY2VwdCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBwb3N0UmVzcG9uc2UgPSBuZXcgUmVzdFJlc3BvbnNlKCk7CisJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCUNsb3NlYWJsZUh0dHBDbGllbnQgY2xpZW50ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJCUh0dHBQb3N0IGh0dHBQb3N0ID0gbmV3IEh0dHBQb3N0KHVybCk7CisKKwkJCWh0dHBQb3N0LmFkZEhlYWRlcigiVVNFUl9JRCIsIHVzZXJJZCk7CisJCQlodHRwUG9zdC5zZXRFbnRpdHkoZW50aXR5KTsKKwkJCXJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoaHR0cFBvc3QpOworCQkJSHR0cEVudGl0eSByZXNwb25zZUVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworCQkJaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCisJCQlwb3N0UmVzcG9uc2Uuc2V0RXJyb3JDb2RlKHN0YXR1c0NvZGUpOworCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJdHJ5IHsKKwkJCQlCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzcG9uc2VFbnRpdHkuZ2V0Q29udGVudCgpKSk7CisJCQkJU3RyaW5nIGlucHV0TGluZTsKKwkJCQl3aGlsZSAoKGlucHV0TGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQkJc2IuYXBwZW5kKGlucHV0TGluZSk7CisJCQkJfQorCQkJCWluLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5kZWJ1ZygicmVzcG9uc2UgYm9keSBpcyBudWxsIik7CisJCQl9CisJCQlwb3N0UmVzcG9uc2Uuc2V0UmVzcG9uc2Uoc2IudG9TdHJpbmcoKSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7CisJCQkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQkJfQorCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJmYWlsZWQgdG8gY2xvc2UgY2xpZW50IG9yIHJlc3BvbnNlOiAiLCBlKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJaWYgKGNsaWVudCAhPSBudWxsKSB7CisJCQkJCWNsaWVudC5jbG9zZSgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBjbG9zZSBjbGllbnQgb3IgcmVzcG9uc2U6ICIsIGUpOworCQkJfQorCQl9CisJCXJldHVybiBwb3N0UmVzcG9uc2U7CisJfQorCisJLy8gREVMRVRFCisJcHJvdGVjdGVkIHN0YXRpYyBSZXN0UmVzcG9uc2Ugc2VuZERlbGV0ZShTdHJpbmcgdXJsLCBTdHJpbmcgdXNlcklkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kRGVsZXRlKHVybCwgaGVhZGVyc01hcCk7CisJCXJldHVybiBkZWxldGVSZXNvdXJjZVJlc3BvbnNlOworCX0KKworCS8qCisJICogLy8gLS0tLS0tIHByb3RlY3RlZCBzdGF0aWMgQm9vbGVhbiBjaGVja0Vycm9yQ29kZShSZXN0UmVzcG9uc2UKKwkgKiBkZWxldGVSZXNwb25zZSkgeyBpZiAoZGVsZXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0KKwkgKiBTVEFUVVNfQ09ERV9TVUNDRVNTIHx8IGRlbGV0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09CisJICogU1RBVFVTX0NPREVfREVMRVRFKSB7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTsgfQorCSAqIAorCSAqIC8vICoqKiBTVEFUVVMgQ09ERSBWQUxJREFUSU9OIFVUSUlUSUVTICoqKiogcHVibGljIHN0YXRpYyB2b2lkCisJICogY2hlY2tTdGF0dXNDb2RlKFJlc3RSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFzc2VydE1lc3NhZ2UsIGJvb2xlYW4gQU5ELAorCSAqIGludC4uLiBzdGF0dXNlcykgeyBpbnQgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLmdldEVycm9yQ29kZSgpOyBmb3IgKGludAorCSAqIHN0YXR1cyA6IHN0YXR1c2VzKSB7IGlmIChBTkQgJiYgc3RhdHVzQ29kZSAhPSBzdGF0dXMpIHsKKwkgKiBBc3NlcnQuZmFpbChhc3NlcnRNZXNzYWdlICsgIiBzdGF0dXM6ICIgKyBzdGF0dXNDb2RlKTsgfSBlbHNlIGlmCisJICogKHN0YXR1c0NvZGUgPT0gc3RhdHVzKSB7IHJldHVybjsgfSB9IGlmICghQU5EKSB7CisJICogQXNzZXJ0LmZhaWwoYXNzZXJ0TWVzc2FnZSArICIgc3RhdHVzOiAiICsgc3RhdHVzQ29kZSk7IH0gfQorCSAqIAorCSAqIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0RlbGV0ZVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCSAqIGNoZWNrU3RhdHVzQ29kZShyZXNwb25zZSwiZGVsZXRlIHJlcXVlc3QgZmFpbGVkIixmYWxzZSxTVEFUVVNfQ09ERV9ERUxFVEUKKwkgKiAsU1RBVFVTX0NPREVfTk9UX0ZPVU5ELCBTVEFUVVNfQ09ERV9TVUNDRVNTKTsgLy8gU1RBVFVTX0NPREVfU1VDQ0VTUyBmb3IKKwkgKiBkZUFjdGl2YXRlIHVzZXIgfQorCSAqIAorCSAqIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0NyZWF0ZVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCSAqIGNoZWNrU3RhdHVzQ29kZShyZXNwb25zZSwgImNyZWF0ZSByZXF1ZXN0IGZhaWxlZCIsIGZhbHNlLAorCSAqIFNUQVRVU19DT0RFX0NSRUFURUQpOyB9CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVXJsRm9yRG93bmxvYWQoU3RyaW5nIHVybCkgeworCQlyZXR1cm4gdXJsLnJlcGxhY2VBbGwoIiAiLCAiJTIwIik7CisJfQorCisJcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZEF1dGhvcml6ZUhlYWRlcihTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCQlTdHJpbmcgdXNlckNyZWRlbnRpYWxzID0gdXNlck5hbWUgKyAiOiIgKyBwYXNzd29yZDsKKwkJZW5jb2RlQmFzZTY0ID0gQmFzZTY0LmVuY29kZUJhc2U2NCh1c2VyQ3JlZGVudGlhbHMuZ2V0Qnl0ZXMoKSk7CisJCVN0cmluZyBlbmNvZGVkVXNlckNyZWRlbnRpYWxzID0gYXV0aG9yaXphdGlvblByZWZpeFN0cmluZyArIG5ldyBTdHJpbmcoZW5jb2RlQmFzZTY0KTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uSGVhZGVyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWF1dGhvcml6YXRpb25IZWFkZXIucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgZW5jb2RlZFVzZXJDcmVkZW50aWFscyk7CisJCXJldHVybiBhdXRob3JpemF0aW9uSGVhZGVyOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQ2F0YWxvZ1Jlc3RVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQ2F0YWxvZ1Jlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjU2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9DYXRhbG9nUmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworCitwdWJsaWMgY2xhc3MgQ2F0YWxvZ1Jlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0QWJzdHJhY3RSZXNvdXJjZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfQUxMX0FCU1RSQUNUX1JFU09VUkNFUywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlyZXR1cm4gc2VuZEdldCh1cmwsIFVzZXJSb2xlRW51bS5ERVNJR05FUi5nZXRVc2VySWQoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0Q2F0YWxvZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRDYXRhbG9nKFVzZXJSb2xlRW51bS5ERVNJR05FUi5nZXRVc2VySWQoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0Q2F0YWxvZyhTdHJpbmcgdXNlcklkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0NBVEFMT0dfREFUQSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCXJldHVybiBzZW5kR2V0KHVybCwgdXNlcklkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzVG93YXJkc0NhdGFsb2dCZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9BTExfQ0FURUdPUklFUywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlCYXNlUmVzdFV0aWxzLlJFU09VUkNFX0NPTVBPTkVOVF9UWVBFKTsKKworCQlyZXR1cm4gc2VuZEdldCh1cmwsIFVzZXJSb2xlRW51bS5ERVNJR05FUi5nZXRVc2VySWQoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Rvd2FyZHNDYXRhbG9nRmVXaXRoVXVpZChTdHJpbmcgdXVpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9DQVRFR09SSUVTX0ZFLCBjb25maWcuZ2V0Q2F0YWxvZ0ZlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0ZlUG9ydCgpLAorCQkJCUJhc2VSZXN0VXRpbHMuUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJYWRkaXRpb25hbEhlYWRlcnMucHV0KEh0dHBIZWFkZXJFbnVtLlhfRUNPTVBfUkVRVUVTVF9JRF9IRUFERVIuZ2V0VmFsdWUoKSwgdXVpZCk7CisKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCBVc2VyUm9sZUVudW0uREVTSUdORVIuZ2V0VXNlcklkKCksIGFkZGl0aW9uYWxIZWFkZXJzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9DYXRlZ29yeVJlc3RVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQ2F0ZWdvcnlSZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFlOTFiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQ2F0ZWdvcnlSZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDI5OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5Lm1pbWUuTXVsdGlwYXJ0RW50aXR5QnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5Hcm91cGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworCitwdWJsaWMgY2xhc3MgQ2F0ZWdvcnlSZXN0VXRpbHMgZXh0ZW5kcyBCYXNlUmVzdFV0aWxzIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9DUkVBVEVEID0gMjAxOworCisJcHJpdmF0ZSBzdGF0aWMgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3J5KENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24sIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCVN0cmluZyBjYXRlZ29yeVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX0NBVEVHT1JZLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCWNhdGVnb3J5VHlwZSk7CisJCVN0cmluZyBib2R5SnNvbiA9IGdzb24udG9Kc29uKGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCVJlc3RSZXNwb25zZSBhZGRDYXRlZ29yeVJlc3BvbnNlID0gQmFzZVJlc3RVdGlscy5zZW5kUG9zdCh1cmwsIGJvZHlKc29uLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLAorCQkJCWFjY2VwdEhlYWRlckRhdGEpOworCQlpZiAoYWRkQ2F0ZWdvcnlSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpID09IFNUQVRVU19DT0RFX0NSRUFURUQpCisJCQljYXRlZ29yeURlZmluaXRpb24uc2V0VW5pcXVlSWQoCisJCQkJCVJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShhZGRDYXRlZ29yeVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJ1bmlxdWVJZCIpKTsKKwkJcmV0dXJuIGFkZENhdGVnb3J5UmVzcG9uc2U7CisJfQorCisJLy8gR0VUIGNhdGVnb3JpZXMKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yaWVzKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGNhdGVnb3J5VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfQUxMX0NBVEVHT1JJRVMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIGNhdGVnb3J5VHlwZSk7CisJCVN0cmluZyB1c2VySWQgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1cmwpOworCQlSZXN0UmVzcG9uc2UgZ2V0Q2F0ZWdvdHlSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKwkJcmV0dXJuIGdldENhdGVnb3R5UmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcmllc1Rvd2FyZHNGZShVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBjYXRlZ29yeVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9DQVRFR09SSUVTX0ZFLCBjb25maWcuZ2V0Q2F0YWxvZ0ZlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0ZlUG9ydCgpLCBjYXRlZ29yeVR5cGUpOworCQlTdHJpbmcgdXNlcklkID0gc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXJsKTsKKwkJUmVzdFJlc3BvbnNlIGdldENhdGVnb3R5UmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisJCXJldHVybiBnZXRDYXRlZ290eVJlc3BvbnNlOworCX0KKworCS8vIERlbGV0ZSBDYXRlZ29yeQorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeUlkLCBTdHJpbmcgcHNVc2VySWQsIFN0cmluZyBjYXRlZ29yeVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX0NBVEVHT1JZLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjYXRlZ29yeVR5cGUsIGNhdGVnb3J5SWQpOworCQl1cmwgPSB1cmwucmVwbGFjZSgiIyIsICIlMjMiKTsgLy8gSEVYCisJCXVybCA9IHVybC5yZXBsYWNlKCIgIiwgIiUyMCIpOyAvLyBIRVgKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUNhdGVnb3J5UmVzcG9uc2UgPSBzZW5kRGVsZXRlKHVybCwgcHNVc2VySWQpOworCQlyZXR1cm4gZGVsZXRlQ2F0ZWdvcnlSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeShTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnksIENhdGVnb3J5RGVmaW5pdGlvbiBwYXJlbnRDYXRlZ29yeSwKKwkJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGNhdGVnb3J5VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGNhdGVnb3J5VHlwZSA9IHNlcnZpY2UvcmVzb3VyY2UvcHJvZHVjdAorCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1NVQl9DQVRFR09SWSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQljYXRlZ29yeVR5cGUsIHBhcmVudENhdGVnb3J5LmdldFVuaXF1ZUlkKCkpOworCQlTdHJpbmcgYm9keUpzb24gPSBnc29uLnRvSnNvbihzdWJDYXRlZ29yeSk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVBvc3QgPSBCYXNlUmVzdFV0aWxzLnNlbmRQb3N0KHVybCwgYm9keUpzb24sIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJYWNjZXB0SGVhZGVyRGF0YSk7CisJCWlmIChjcmVhdGVTdWJDYXRlZ29yeVBvc3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKQorCQkJc3ViQ2F0ZWdvcnkuc2V0VW5pcXVlSWQoCisJCQkJCVJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVTdWJDYXRlZ29yeVBvc3QuZ2V0UmVzcG9uc2UoKSwgInVuaXF1ZUlkIikpOworCisJCXJldHVybiBjcmVhdGVTdWJDYXRlZ29yeVBvc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlU3ViQ2F0ZWdvcnkoU3RyaW5nIHN1YkNhdGVnb3J5SWQsIFN0cmluZyBjYXRlZ29yeUlkLCBTdHJpbmcgcHNVc2VySWQsCisJCQlTdHJpbmcgY2F0ZWdvcnlUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRFTEVURV9TVUJfQ0FURUdPUlksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJY2F0ZWdvcnlUeXBlLCBjYXRlZ29yeUlkLCBzdWJDYXRlZ29yeUlkKTsKKwkJdXJsID0gdXJsLnJlcGxhY2UoIiMiLCAiJTIzIik7IC8vIEhFWAorCQl1cmwgPSB1cmwucmVwbGFjZSgiICIsICIlMjAiKTsgLy8gSEVYCisJCVJlc3RSZXNwb25zZSBkZWxldGVTdWJDYXRlZ29yeVJlc3BvbnNlID0gc2VuZERlbGV0ZSh1cmwsIHBzVXNlcklkKTsKKwkJcmV0dXJuIGRlbGV0ZVN1YkNhdGVnb3J5UmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlR3JvdXBpbmcoU3RyaW5nIGdyb3VwSWQsIFN0cmluZyBzdWJDYXRlZ29yeUlkLCBTdHJpbmcgY2F0ZWdvcnlJZCwgU3RyaW5nIHBzVXNlcklkLAorCQkJU3RyaW5nIGNhdGVnb3J5VHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRFTEVURV9HUk9VUElORywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQljYXRlZ29yeVR5cGUsIGNhdGVnb3J5SWQsIHN1YkNhdGVnb3J5SWQsIGdyb3VwSWQpOworCQl1cmwgPSB1cmwucmVwbGFjZSgiIyIsICIlMjMiKTsgLy8gSEVYCisJCXVybCA9IHVybC5yZXBsYWNlKCIgIiwgIiUyMCIpOyAvLyBIRVgKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUdyb3VwUmVzcG9uc2UgPSBzZW5kRGVsZXRlKHVybCwgcHNVc2VySWQpOworCQlyZXR1cm4gZGVsZXRlR3JvdXBSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlQ2F0ZWdvcnlIdHRwQ3NwQXR1VWlkSXNNaXNzaW5nKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURhdGFEZWZpbml0aW9uLAorCQkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX0NBVEVHT1JZLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCVNFUlZJQ0VfQ09NUE9ORU5UX1RZUEUpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQloZWFkZXJzTWFwLnJlbW92ZSgiVVNFUl9JRCIpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgdXNlckJvZHlKc29uID0gZ3Nvbi50b0pzb24oY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbik7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHVybCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1c2VyQm9keUpzb24pOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2F0ZXJnb3J5UmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisJCXJldHVybiBjcmVhdGVDYXRlcmdvcnlSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeUh0dHBDc3BBdHVVaWRJc01pc3NpbmcoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5LAorCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHBhcmVudENhdGVnb3J5LCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBjYXRlZ29yeVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjYXRlZ29yeVR5cGUgPSBzZXJ2aWNlL3Jlc291cmNlL3Byb2R1Y3QKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNSRUFURV9TVUJfQ0FURUdPUlksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJY2F0ZWdvcnlUeXBlLCBwYXJlbnRDYXRlZ29yeS5nZXRVbmlxdWVJZCgpKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisJCWhlYWRlcnNNYXAucmVtb3ZlKCJVU0VSX0lEIik7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyBzdWJDYXRKc29uID0gZ3Nvbi50b0pzb24oc3ViQ2F0ZWdvcnkpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1cmwpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3ViQ2F0SnNvbik7CisJCVJlc3RSZXNwb25zZSBhZGRDYXRlZ29yeVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCBzdWJDYXRKc29uLCBoZWFkZXJzTWFwKTsKKwkJcmV0dXJuIGFkZENhdGVnb3J5UmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlQ2F0ZXJnb3J5SHR0cENzcEF0dVVpZElzTWlzc2luZyhDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRFTEVURV9DT05TVU1FUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlTdHJpbmcgdXNlcklkID0gc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKwkJaGVhZGVyc01hcC5yZW1vdmUoIlVTRVJfSUQiKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKGNhdGVnb3J5RGF0YURlZmluaXRpb24pOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1cmwpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXNlckJvZHlKc29uKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUNhdGVnb3R5UmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kRGVsZXRlKHVybCwgaGVhZGVyc01hcCk7CisJCXJldHVybiBkZWxldGVDYXRlZ290eVJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUdyb3VwaW5nKEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZywgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5LAorCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHBhcmVudENhdGVnb3J5LCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBjYXRlZ29yeVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX0dST1VQSU5HLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjYXRlZ29yeVR5cGUsIHBhcmVudENhdGVnb3J5LmdldFVuaXF1ZUlkKCksIHN1YkNhdGVnb3J5LmdldFVuaXF1ZUlkKCkpOworCQlTdHJpbmcgYm9keUpzb24gPSBnc29uLnRvSnNvbihncm91cGluZyk7CisJCVJlc3RSZXNwb25zZSBhZGRHcm91cGluZ1Jlc3BvbnNlID0gQmFzZVJlc3RVdGlscy5zZW5kUG9zdCh1cmwsIGJvZHlKc29uLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJcmV0dXJuIGFkZEdyb3VwaW5nUmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgaW1wb3J0Q2F0ZWdvcmllcyhNdWx0aXBhcnRFbnRpdHlCdWlsZGVyIG1wQnVpbGRlciwgU3RyaW5nIHVzZXJJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLklNUE9SVF9DQVRFR09SSUVTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlSZXN0UmVzcG9uc2UgaW1wb3J0UmVzcG9uc2UgPSBCYXNlUmVzdFV0aWxzLnNlbmRQb3N0KHVybCwgbXBCdWlsZGVyLmJ1aWxkKCksIHVzZXJJZCwgYWNjZXB0SGVhZGVyRGF0YSk7CisJCXJldHVybiBpbXBvcnRSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGludCBnZXRNYXRjaGluZ0NhdGVnb3JpZXNOdW0oUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3J5UmVzdCwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbikgeworCQlTdHJpbmcgcmVzcG9uc2UgPSBnZXRBbGxDYXRlZ29yeVJlc3QuZ2V0UmVzcG9uc2UoKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5RGVmaW5pdGlvbnMgPSBnc29uLmZyb21Kc29uKHJlc3BvbnNlLAorCQkJCW5ldyBUeXBlVG9rZW48TGlzdDxDYXRlZ29yeURlZmluaXRpb24+PigpIHsKKwkJCQl9LmdldFR5cGUoKSk7CisJCWludCBjYXRlZ29yaWVzTnVtID0gMDsKKwkJU3RyaW5nIGNhdE5hbWUgPSBjYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpOworCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBlbGVtIDogY2F0ZWdvcnlEZWZpbml0aW9ucykgeworCQkJaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscyhjYXROYW1lKSkgeworCQkJCWNhdGVnb3J5RGVmaW5pdGlvbi5zZXRVbmlxdWVJZChlbGVtLmdldFVuaXF1ZUlkKCkpOworCQkJCWNhdGVnb3JpZXNOdW0rKzsKKwkJCX0KKwkJfQorCisJCXJldHVybiBjYXRlZ29yaWVzTnVtOworCX0KKworCXB1YmxpYyBzdGF0aWMgaW50IGdldE1hdGNoaW5nU3ViQ2F0ZWdvcmllc051bShSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcnlSZXN0LCBTdHJpbmcgcGFyZW50Q2F0ZWdvcnlJZCwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbikgeworCisJCVN0cmluZyByZXNwb25zZSA9IGdldEFsbENhdGVnb3J5UmVzdC5nZXRSZXNwb25zZSgpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnlEZWZpbml0aW9ucyA9IGdzb24uZnJvbUpzb24ocmVzcG9uc2UsCisJCQkJbmV3IFR5cGVUb2tlbjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4+KCkgeworCQkJCX0uZ2V0VHlwZSgpKTsKKwkJaW50IHN1YkNhdE51bSA9IDA7CisJCVN0cmluZyBzdWJDYXROYW1lID0gZXhwZWN0ZWRTdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpOworCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBlbGVtIDogY2F0ZWdvcnlEZWZpbml0aW9ucykgeworCQkJaWYgKGVsZW0uZ2V0VW5pcXVlSWQoKS5lcXVhbHMocGFyZW50Q2F0ZWdvcnlJZCkpIHsKKwkJCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gc3ViQ2F0ZWdvcmllcyA9IGVsZW0uZ2V0U3ViY2F0ZWdvcmllcygpOworCQkJCWlmIChzdWJDYXRlZ29yaWVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiA6IHN1YkNhdGVnb3JpZXMpIHsKKwkJCQkJCWlmIChzdWJDYXROYW1lLmVxdWFscyhzdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldE5hbWUoKSkpIHsKKwkJCQkJCQlleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5zZXRVbmlxdWVJZChzdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJCQkJCXN1YkNhdE51bSsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQl9CisJCX0KKwkJcmV0dXJuIHN1YkNhdE51bTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGludCBnZXRNYXRjaGluZ0dyb3VwaW5nTnVtKFJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yeVJlc3QsIFN0cmluZyBwYXJlbnRDYXRlZ29yeUlkLAorCQkJU3RyaW5nIHN1YkNhdGVnb3J5SWQsIEdyb3VwaW5nRGVmaW5pdGlvbiBleHBlY3RlZEdyb3VwaW5nRGVmaW5pdGlvbikgeworCisJCVN0cmluZyByZXNwb25zZSA9IGdldEFsbENhdGVnb3J5UmVzdC5nZXRSZXNwb25zZSgpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnlEZWZpbml0aW9ucyA9IGdzb24uZnJvbUpzb24ocmVzcG9uc2UsCisJCQkJbmV3IFR5cGVUb2tlbjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4+KCkgeworCQkJCX0uZ2V0VHlwZSgpKTsKKwkJaW50IGdyb3VwaW5nTnVtID0gMDsKKwkJU3RyaW5nIGdyb3VwaW5nTmFtZSA9IGV4cGVjdGVkR3JvdXBpbmdEZWZpbml0aW9uLmdldE5hbWUoKTsKKwkJZm9yIChDYXRlZ29yeURlZmluaXRpb24gZWxlbSA6IGNhdGVnb3J5RGVmaW5pdGlvbnMpIHsKKwkJCWlmIChlbGVtLmdldFVuaXF1ZUlkKCkuZXF1YWxzKHBhcmVudENhdGVnb3J5SWQpKSB7CisJCQkJTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IHN1YkNhdGVnb3JpZXMgPSBlbGVtLmdldFN1YmNhdGVnb3JpZXMoKTsKKwkJCQlpZiAoc3ViQ2F0ZWdvcmllcyAhPSBudWxsKSB7CisJCQkJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gOiBzdWJDYXRlZ29yaWVzKSB7CisJCQkJCQkvLyBpZgorCQkJCQkJLy8gKHN1YkNhdGVnb3J5SWQuZXF1YWxzKHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSkpCisJCQkJCQkvLyB7CisJCQkJCQlpZiAoc3ViQ2F0ZWdvcnlJZC5lcXVhbHMoc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKQorCQkJCQkJCQkmJiBzdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldEdyb3VwaW5ncygpICE9IG51bGwpIHsKKwkJCQkJCQlMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4gZ3JvdXBpbmcgPSBzdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldEdyb3VwaW5ncygpOworCQkJCQkJCWZvciAoR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nRGF0YURlZmluaXRpb24gOiBncm91cGluZykgeworCQkJCQkJCQlpZiAoZ3JvdXBpbmdOYW1lLmVxdWFscyhncm91cGluZ0RhdGFEZWZpbml0aW9uLmdldE5hbWUoKSkpIHsKKwkJCQkJCQkJCWV4cGVjdGVkR3JvdXBpbmdEZWZpbml0aW9uLnNldFVuaXF1ZUlkKGdyb3VwaW5nRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQkJCQkJCQlncm91cGluZ051bSsrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JvdXBpbmdOdW07CisJfQorCisJcHVibGljIGVudW0gQ2F0ZWdvcnlBdWRpdEpzb25LZXlzRW51bSB7CisJCUFDVElPTigiQUNUSU9OIiksIE1PRElGSUVSKCJNT0RJRklFUiIpLCBDQVRFR09SWV9OQU1FKCJDQVRFR09SWV9OQU1FIiksIFNVQl9DQVRFR09SWV9OQU1FKCJTVUJfQ0FURUdPUllfTkFNRSIpLCBHUk9VUElOR19OQU1FKCJHUk9VUElOR19OQU1FIiksIFJFU09VUkNFX1RZUEUoIlJFU09VUkNFX1RZUEUiKSwgRUNPTVBfVVNFUigiRUNPTVBfVVNFUiIpLCBTVEFUVVMoIlNUQVRVUyIpLCAKKwkJREVTQ1JJUFRJT04oIkRFU0NSSVBUSU9OIiksIERFVEFJTFMoIkRFVEFJTFMiKTsKKwkJCisJCXByaXZhdGUgU3RyaW5nIGF1ZGl0SnNvbktleU5hbWU7CisKKwkJcHJpdmF0ZSBDYXRlZ29yeUF1ZGl0SnNvbktleXNFbnVtKFN0cmluZyBhdWRpdEpzb25LZXlOYW1lKSB7CisJCQl0aGlzLmF1ZGl0SnNvbktleU5hbWUgPSBhdWRpdEpzb25LZXlOYW1lOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBdWRpdEpzb25LZXlOYW1lKCkgeworCQkJcmV0dXJuIGF1ZGl0SnNvbktleU5hbWUudG9Mb3dlckNhc2UoKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0NvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1ODczOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0NvbXBvbmVudEluc3RhbmNlUmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2VSZXN0VXRpbHMgZXh0ZW5kcyBCYXNlUmVzdFV0aWxzIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCXN0YXRpYyBDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisJcHVibGljIHN0YXRpYyBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJLy8gJ2NvbXBvbmVudFR5cGUnIGNhbiBiZSAnc2VydmljZXMnIG9yICdyZXNvdXJjZXMnCisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLAorCQkJVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksCisJCQkJY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzIGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscywKKwkJCVVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBjb21wb25lbnRJZCwKKwkJCQlDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUoY29tcG9uZW50VHlwZSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMsCisJCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGNvbXBvbmVudFR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1c2VySWQgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCQlTdHJpbmcgc2VydmljZUJvZHlKc29uID0gZ3Nvbi50b0pzb24oY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfQ09NUE9ORU5UX0lOU1RBTkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCWNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2UgPSBzZW5kUG9zdCh1cmwsIHNlcnZpY2VCb2R5SnNvbiwgdXNlcklkLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJaWYgKGNyZWF0ZVJlc291cmNlSW5zdGFuY2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfQ1JFQVRFRCkpIHsKKwkJCVN0cmluZyB1bmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZUluc3RhbmNlLmdldFJlc3BvbnNlKCksICJ1bmlxdWVJZCIpOworCQkJY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJCS8vIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCQkvLyBSZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscyBmcm9tSnNvbiA9CisJCQkvLyBnc29uLmZyb21Kc29uKGNyZWF0ZVJlc291cmNlSW5zdGFuY2UuZ2V0UmVzcG9uc2UoKSwKKwkJCS8vIFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkJCS8vIGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscy5zZXRVbmlxdWVJZChmcm9tSnNvbi5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRDb21wb25lbnRJbnN0YW5jZXMoQ29tcG9uZW50VHlwZUVudW0gdHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBVc2VyIHVzZXIpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9DT01QT05FTlRfSU5TVEFOQ0VTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLmZpbmRQYXJhbUJ5VHlwZSh0eXBlKSwgY29tcG9uZW50SWQpOworCisJCVJlc3RSZXNwb25zZSBzZW5kR2V0U2VydmVyUmVxdWVzdCA9IHNlbmRHZXQodXJsLCB1c2VyLmdldFVzZXJJZCgpLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gc2VuZEdldFNlcnZlclJlcXVlc3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVDb21wb25lbnRJbnN0YW5jZShVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHRocm93cyBFeGNlcHRpb24geworCisJCXJldHVybiBkZWxldGVDb21wb25lbnRJbnN0YW5jZShzZG5jTW9kaWZpZXJEZXRhaWxzLCBjb21wb25lbnRJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLmZpbmRQYXJhbUJ5VHlwZShjb21wb25lbnRUeXBlKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgY29tcG9uZW50SWQsCisJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY29tcG9uZW50VHlwZVN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX0NPTVBPTkVOVF9JTlNUQU5DRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQljb21wb25lbnRUeXBlU3RyaW5nLCBjb21wb25lbnRJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJUmVzdFJlc3BvbnNlIHNlbmRDcmVhdGVVc2VyUmVxdWVzdCA9IHNlbmREZWxldGUodXJsLCB1c2VySWQpOworCQlyZXR1cm4gc2VuZENyZWF0ZVVzZXJSZXF1ZXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBjb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMsCisJCQlVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBjb21wb25lbnRJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1c2VySWQgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCQlTdHJpbmcgc2VydmljZUJvZHlKc29uID0gZ3Nvbi50b0pzb24oY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfQ09NUE9ORU5UX0lOU1RBTkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLmZpbmRQYXJhbUJ5VHlwZShjb21wb25lbnRUeXBlKSwgY29tcG9uZW50SWQsCisJCQkJY29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZSA9IHNlbmRQb3N0KHVybCwgc2VydmljZUJvZHlKc29uLCB1c2VySWQsIGFjY2VwdEhlYWRlckRhdGEpOworCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2VJbnN0YW5jZTsKKwl9CisKKwkvLyBUT0RPIFRhbCBDSSBmb3IgTmV3IEFQSSBNdWx0aXBsZSBJbnN0YW5jZSBVcGRhdGUKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVNdWx0aXBsZUNvbXBvbmVudEluc3RhbmNlKAorCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM+IGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsc0xpc3QsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCVN0cmluZyBjb21wb25lbnRJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXNlcklkID0gc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKTsKKwkJU3RyaW5nIHNlcnZpY2VCb2R5SnNvbiA9IGdzb24udG9Kc29uKGNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsc0xpc3QudG9BcnJheSgpKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfTVVMVElQTEVfQ09NUE9ORU5UX0lOU1RBTkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIENvbXBvbmVudFR5cGVFbnVtLmZpbmRQYXJhbUJ5VHlwZShjb21wb25lbnRUeXBlKSwgY29tcG9uZW50SWQpOworCQlSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZSA9IHNlbmRQb3N0KHVybCwgc2VydmljZUJvZHlKc29uLCB1c2VySWQsIGFjY2VwdEhlYWRlckRhdGEpOworCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2VJbnN0YW5jZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZXMoUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlbGF0aW9uLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlTdHJpbmcgY29tcG9uZW50SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlTdHJpbmcgY29tcG9uZW50VHlwZSA9ICIiOworCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGVFbnVtKSB7CisJCWNhc2UgUkVTT1VSQ0U6CisJCQljb21wb25lbnRUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRTsKKwkJCWJyZWFrOworCQljYXNlIFNFUlZJQ0U6CisJCQljb21wb25lbnRUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlTdHJpbmcgc2VydmljZUJvZHlKc29uID0gZ3Nvbi50b0pzb24ocmVsYXRpb24pOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkFTU09DSUFURV9fUkVTT1VSQ0VfSU5TVEFOQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50SWQpOworCisJCVJlc3RSZXNwb25zZSBhc3NvY2lhdGVJbnN0YW5jZSA9IHNlbmRQb3N0KHVybCwgc2VydmljZUJvZHlKc29uLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLAorCQkJCWFjY2VwdEhlYWRlckRhdGEpOworCQlyZXR1cm4gYXNzb2NpYXRlSW5zdGFuY2U7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkaXNzb2NpYXRlSW5zdGFuY2VzKFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZWxhdGlvbiwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJU3RyaW5nIGNvbXBvbmVudFR5cGUgPSAiIjsKKwkJc3dpdGNoIChjb21wb25lbnRUeXBlRW51bSkgeworCQljYXNlIFJFU09VUkNFOgorCQkJY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUU7CisJCQlicmVhazsKKwkJY2FzZSBTRVJWSUNFOgorCQkJY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJU3RyaW5nIHNlcnZpY2VCb2R5SnNvbiA9IGdzb24udG9Kc29uKHJlbGF0aW9uKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ESVNTT0NJQVRFX19SRVNPVVJDRV9JTlNUQU5DRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc29jaWF0ZUluc3RhbmNlID0gc2VuZFB1dCh1cmwsIHNlcnZpY2VCb2R5SnNvbiwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlhY2NlcHRIZWFkZXJEYXRhKTsKKwkJcmV0dXJuIGFzc29jaWF0ZUluc3RhbmNlOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQ29tcG9uZW50SW5zdGFuY2VUeXBlKFJlc3RSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGV4cGVjdGVkQ29tcG9uZW50VHlwZSkgeworCQlTdHJpbmcgYWN0dWFsQ29tcG9uZW50VHlwZSA9IFJlc3BvbnNlUGFyc2VyLmdldENvbXBvbmVudFR5cGVGcm9tUmVzcG9uc2UocmVzcG9uc2UpOworCQlhc3NlcnRUcnVlKGV4cGVjdGVkQ29tcG9uZW50VHlwZS5lcXVhbHMoYWN0dWFsQ29tcG9uZW50VHlwZSksCisJCQkJIkZhaWxlZC4gZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZENvbXBvbmVudFR5cGUgKyAiLCBhY3R1YWw6ICIgKyBhY3R1YWxDb21wb25lbnRUeXBlICsgIi8iKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eVZhbHVlT25SZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudEluc3RhbmNlIGluc3REZXRhaWxzLAorCQkJVXNlciB1c2VyLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHVwZGF0ZWRJbnN0YW5jZVByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9QUk9QRVJUWV9UT19SRVNPVVJDRV9JTlNUQU5DRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSksCisJCQkJY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIGluc3REZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlTdHJpbmcgYm9keSA9IGdzb24udG9Kc29uKHVwZGF0ZWRJbnN0YW5jZVByb3BlcnR5KTsKKworCQlSZXN0UmVzcG9uc2Ugc2VuZEdldFNlcnZlclJlcXVlc3QgPSBzZW5kUG9zdCh1cmwsIGJvZHksIHVzZXIuZ2V0VXNlcklkKCksIGFjY2VwdEhlYWRlckRhdGEpOworCQlyZXR1cm4gc2VuZEdldFNlcnZlclJlcXVlc3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24oQ29tcG9uZW50IGNvbnRhaW5lciwKKwkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlVG9SZXBsYWNlLCBDb21wb25lbnQgbmV3SW5zdGFuY2UsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCXJldHVybiBjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24oY29udGFpbmVyLmdldFVuaXF1ZUlkKCksIGNvbXBvbmVudEluc3RhbmNlVG9SZXBsYWNlLCBuZXdJbnN0YW5jZSwKKwkJCQlzZG5jTW9kaWZpZXJEZXRhaWxzLCBjb250YWluZXIuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24oU3RyaW5nIGNvbnRhaW5lclVJRCwKKwkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlVG9SZXBsYWNlLCBDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHJlc291cmNlVWlkID0gKCJ7XCJjb21wb25lbnRVaWRcIjpcIiIgKyBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSArICJcIn0iKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DSEFOR0VfX1JFU09VUkNFX0lOU1RBTkNFX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKGNvbXBvbmVudFR5cGUpLCBjb250YWluZXJVSUQsCisJCQkJY29tcG9uZW50SW5zdGFuY2VUb1JlcGxhY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZUluc3RhbmNlVmVyc2lvbiA9IHNlbmRQb3N0KHVybCwgcmVzb3VyY2VVaWQsIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksCisJCQkJYWNjZXB0SGVhZGVyRGF0YSk7CisKKwkJaWYgKGNoYW5nZVJlc291cmNlSW5zdGFuY2VWZXJzaW9uLmdldEVycm9yQ29kZSgpID09IDIwMAorCQkJCXx8IGNoYW5nZVJlc291cmNlSW5zdGFuY2VWZXJzaW9uLmdldEVycm9yQ29kZSgpID09IDIwMSkgeworCQkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJCS8vIFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzCisJCQkvLyBjb252ZXJ0UmVzb3VyY2VJbnN0YW5jZVJlc3BvbnNlVG9KYXZhT2JqZWN0ID0KKwkJCS8vIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2VUb0phdmFPYmplY3QoY3JlYXRlUmVzb3VyY2VJbnN0YW5jZS5nZXRSZXNwb25zZSgpKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyBmcm9tSnNvbiA9IGdzb24uZnJvbUpzb24oY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb24uZ2V0UmVzcG9uc2UoKSwKKwkJCQkJQ29tcG9uZW50SW5zdGFuY2VSZXFEZXRhaWxzLmNsYXNzKTsKKworCQkJY29tcG9uZW50SW5zdGFuY2VUb1JlcGxhY2Uuc2V0VW5pcXVlSWQoZnJvbUpzb24uZ2V0VW5pcXVlSWQoKSk7CisKKwkJfQorCisJCXJldHVybiBjaGFuZ2VSZXNvdXJjZUluc3RhbmNlVmVyc2lvbjsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvbihTdHJpbmcgY29tcG9uZW50VW5pcXVlSWQsCisJCQlTdHJpbmcgc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQsIFN0cmluZyBzZXJ2aWNlVW5pcXVlSWQsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHJlc291cmNlVWlkID0gKCJ7XCJjb21wb25lbnRVaWRcIjpcIiIgKyBzZXJ2aWNlVW5pcXVlSWQgKyAiXCJ9Iik7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ0hBTkdFX19SRVNPVVJDRV9JTlNUQU5DRV9WRVJTSU9OLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIENvbXBvbmVudFR5cGVFbnVtLmZpbmRQYXJhbUJ5VHlwZShjb21wb25lbnRUeXBlKSwgY29tcG9uZW50VW5pcXVlSWQsCisJCQkJc2VydmljZUluc3RhbmNlVG9SZXBsYWNlVW5pcXVlSWQpOworCQlSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb24gPSBzZW5kUG9zdCh1cmwsIHJlc291cmNlVWlkLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLAorCQkJCWFjY2VwdEhlYWRlckRhdGEpOworCQlyZXR1cm4gY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb247CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0NvbXBvbmVudFJlc3RVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvQ29tcG9uZW50UmVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlYmU0YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0NvbXBvbmVudFJlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBSZXFEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9kdWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRSZXN0VXRpbHMgZXh0ZW5kcyBCYXNlUmVzdFV0aWxzIHsKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlDb21wb25lbnRSZXFEZXRhaWxzIGNvbXBvbmVudFJlcURldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IG51bGw7CisJCWlmIChjb21wb25lbnRSZXFEZXRhaWxzIGluc3RhbmNlb2YgUmVzb3VyY2VSZXFEZXRhaWxzKSB7CisJCQljb21wb25lbnRUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0U7CisJCX0gZWxzZSBpZiAoY29tcG9uZW50UmVxRGV0YWlscyBpbnN0YW5jZW9mIFNlcnZpY2VSZXFEZXRhaWxzKSB7CisJCQljb21wb25lbnRUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRTsKKwkJfSBlbHNlIGlmIChjb21wb25lbnRSZXFEZXRhaWxzIGluc3RhbmNlb2YgUHJvZHVjdFJlcURldGFpbHMpIHsKKwkJCWNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUOworCQl9CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0NPTVBPTkVOVF9SRVFVSVJNRU5UU19DQVBBQklMSVRJRVMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKGNvbXBvbmVudFR5cGUpLAorCQkJCWNvbXBvbmVudFJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBzZW5kR2V0KHVybCwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBDYXBSZXFEZWYgZ2V0QW5kUGFyc2VDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyhVc2VyIHVzZXIsIENvbXBvbmVudFJlcURldGFpbHMgY29tcG9uZW50RGV0YWlscykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBnZXRDb21wb25lbnRSZXFDYXAgPSBnZXRDb21wb25lbnRSZXF1aXJtZW50c0NhcGFiaWxpdGllcyh1c2VyLCBjb21wb25lbnREZXRhaWxzKTsKKwkJUmVzb3VyY2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGdldENvbXBvbmVudFJlcUNhcCk7CisJCUNhcFJlcURlZiBjYXBSZXFEZWYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0KGdldENvbXBvbmVudFJlcUNhcC5nZXRSZXNwb25zZSgpLCBDYXBSZXFEZWYuY2xhc3MpOworCQlyZXR1cm4gY2FwUmVxRGVmOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0NvbnN1bWVyUmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Db25zdW1lclJlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTNkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Db25zdW1lclJlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Db25zdW1lckRhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIENvbnN1bWVyUmVzdFV0aWxzIGV4dGVuZHMgQmFzZVJlc3RVdGlscyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9TVUNDRVNTID0gMjAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX0NSRUFURUQgPSAyMDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfREVMRVRFID0gMjA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX05PVF9GT1VORCA9IDQwNDsKKwlVdGlscyB1dGlscyA9IG5ldyBVdGlscygpOworCXByaXZhdGUgc3RhdGljIExvbmcgZXhwZWN0ZWRzTGFzdHVwZGF0ZWR0aW1lOworCXByaXZhdGUgc3RhdGljIExvbmcgZXhwZWN0ZWRMYXN0QXV0aGVudGljYXRpb25UaW1lOworCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXIoQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBjb25zdW1lckRhdGFEZWZpbml0aW9uLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfQ09OU1VNRVIsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCVN0cmluZyB1c2VySWQgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKGNvbnN1bWVyRGF0YURlZmluaXRpb24pOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHVybCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1c2VyQm9keUpzb24pOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ29uc3VtZXJSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRQb3N0KHVybCwgdXNlckJvZHlKc29uLCBoZWFkZXJzTWFwKTsKKwkJaWYgKGNyZWF0ZUNvbnN1bWVyUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBnZXRDb25zdW1lckRhdGFPYmplY3QgPSBwYXJzZUNvbXN1bWVyUmVzcChjcmVhdGVDb25zdW1lclJlc3BvbnNlKTsKKwkJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lKGdldENvbnN1bWVyRGF0YU9iamVjdC5nZXRDb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWUoKSk7CisJCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyTGFzdEF1dGhlbnRpY2F0aW9uVGltZShnZXRDb25zdW1lckRhdGFPYmplY3QuZ2V0Q29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lKCkpOworCQkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRMYXN0TW9kZmllckF0dWlkKGdldENvbnN1bWVyRGF0YU9iamVjdC5nZXRMYXN0TW9kZmllckF0dWlkKCkpOworCQl9CisJCXJldHVybiBjcmVhdGVDb25zdW1lclJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVySHR0cENzcEF0dVVpZElzTWlzc2luZyhDb25zdW1lckRhdGFEZWZpbml0aW9uIGNvbnN1bWVyRGF0YURlZmluaXRpb24sIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNSRUFURV9DT05TVU1FUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisJCWhlYWRlcnNNYXAucmVtb3ZlKCJVU0VSX0lEIik7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbihjb25zdW1lckRhdGFEZWZpbml0aW9uKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXJsKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHVzZXJCb2R5SnNvbik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVDb25zdW1lclJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCB1c2VyQm9keUpzb24sIGhlYWRlcnNNYXApOworCQlpZiAoY3JlYXRlQ29uc3VtZXJSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIGdldENvbnN1bWVyRGF0YU9iamVjdCA9IHBhcnNlQ29tc3VtZXJSZXNwKGNyZWF0ZUNvbnN1bWVyUmVzcG9uc2UpOworCQkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWUoZ2V0Q29uc3VtZXJEYXRhT2JqZWN0LmdldENvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZSgpKTsKKwkJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uc2V0Q29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lKGdldENvbnN1bWVyRGF0YU9iamVjdC5nZXRDb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUoKSk7CisJCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldExhc3RNb2RmaWVyQXR1aWQoZ2V0Q29uc3VtZXJEYXRhT2JqZWN0LmdldExhc3RNb2RmaWVyQXR1aWQoKSk7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZUNvbnN1bWVyUmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVsZXRlQ29uc3VtZXJIdHRwQ3NwQXR1VWlkSXNNaXNzaW5nKENvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX0NPTlNVTUVSLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKworCQlTdHJpbmcgdXNlcklkID0gc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKwkJaGVhZGVyc01hcC5yZW1vdmUoIlVTRVJfSUQiKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKGNvbnN1bWVyRGF0YURlZmluaXRpb24pOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1cmwpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXNlckJvZHlKc29uKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZUNvbnN1bWVyUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kRGVsZXRlKHVybCwgaGVhZGVyc01hcCk7CisJCXJldHVybiBkZWxldGVDb25zdW1lclJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBwYXJzZUNvbXN1bWVyUmVzcChSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgYm9keVRvUGFyc2UgPSByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJdHJ5IHsKKwkJCUNvbnN1bWVyRGF0YURlZmluaXRpb24gY29tcG9uZW50ID0gbWFwcGVyLnJlYWRWYWx1ZShib2R5VG9QYXJzZSwgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbi5jbGFzcyk7CisJCQlyZXR1cm4gY29tcG9uZW50OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZUNvbnN1bWVyKENvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX0NPTlNVTUVSLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKworCQlTdHJpbmcgdXNlcklkID0gc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1cmwpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlQ29uc3VtZXJSZXNwb25zZSA9IGh0dHAuaHR0cFNlbmREZWxldGUodXJsLCBoZWFkZXJzTWFwKTsKKwkJcmV0dXJuIGRlbGV0ZUNvbnN1bWVyUmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0Q29uc3VtZXIoQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBjb25zdW1lckRhdGFEZWZpbml0aW9uLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfQ09OU1VNRVIsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkpOworCisJCVN0cmluZyB1c2VySWQgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHVybCk7CisJCVJlc3RSZXNwb25zZSBnZXRDb25zdW1lclJlc3BvbnNlID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCQlyZXR1cm4gZ2V0Q29uc3VtZXJSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVDb25zdW1lclJlcVZzUmVzcChDb25zdW1lckRhdGFEZWZpbml0aW9uIGNvbnN1bWVyRGVmaW5pdGlvbiwgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBnZXRDb25zdW1lckRhdGFPYmplY3QpIHsKKworCQlTdHJpbmcgZXhwZWN0ZWQ7CisKKwkJZXhwZWN0ZWQgPSBjb25zdW1lckRlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCk7CisJCWFzc2VydEVxdWFscygiY29uc3VtZXIgbmFtZSAtICIsIGV4cGVjdGVkLCBnZXRDb25zdW1lckRhdGFPYmplY3QuZ2V0Q29uc3VtZXJOYW1lKCkpOworCisJCWV4cGVjdGVkID0gY29uc3VtZXJEZWZpbml0aW9uLmdldENvbnN1bWVyUGFzc3dvcmQoKS50b0xvd2VyQ2FzZSgpOworCQlhc3NlcnRFcXVhbHMoImNvbnN1bWVyIHBhc3N3b3JkICAtICIsIGV4cGVjdGVkLCBnZXRDb25zdW1lckRhdGFPYmplY3QuZ2V0Q29uc3VtZXJQYXNzd29yZCgpKTsKKworCQlleHBlY3RlZCA9IGNvbnN1bWVyRGVmaW5pdGlvbi5nZXRMYXN0TW9kZmllckF0dWlkKCk7CisJCWFzc2VydEVxdWFscygiY29uc3VtZXIgTGFzdCBNb2RmaWVyIEF0dWlkIC0gIiwgZXhwZWN0ZWQsIGdldENvbnN1bWVyRGF0YU9iamVjdC5nZXRMYXN0TW9kZmllckF0dWlkKCkpOworCisJCWV4cGVjdGVkID0gY29uc3VtZXJEZWZpbml0aW9uLmdldENvbnN1bWVyU2FsdCgpOworCQlhc3NlcnRFcXVhbHMoImNvbnN1bWVyIFNhbHQgLSAiLCBleHBlY3RlZCwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0LmdldENvbnN1bWVyU2FsdCgpKTsKKworCQlleHBlY3RlZHNMYXN0dXBkYXRlZHRpbWUgPSBjb25zdW1lckRlZmluaXRpb24uZ2V0Q29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lKCk7CisJCWFzc2VydEVxdWFscygiY29uc3VtZXIgTGFzdCB1cGRhdGVkIHRpbWUgLSAiLCBleHBlY3RlZHNMYXN0dXBkYXRlZHRpbWUsIGdldENvbnN1bWVyRGF0YU9iamVjdC5nZXRDb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWUoKSk7CisKKwkJZXhwZWN0ZWRMYXN0QXV0aGVudGljYXRpb25UaW1lID0gY29uc3VtZXJEZWZpbml0aW9uLmdldENvbnN1bWVyTGFzdEF1dGhlbnRpY2F0aW9uVGltZSgpOworCQlhc3NlcnRFcXVhbHMoImNvbnN1bWVyIExhc3QgYXV0aGVudGljYXRpb24gdGltZSAtICIsIGV4cGVjdGVkTGFzdEF1dGhlbnRpY2F0aW9uVGltZSwgZ2V0Q29uc3VtZXJEYXRhT2JqZWN0LmdldENvbnN1bWVyTGFzdEF1dGhlbnRpY2F0aW9uVGltZSgpKTsKKwl9CisKKwkvLy8vLyBOZXcKKwlwdWJsaWMgZW51bSBFY29tcENvbnN1bWVyQXVkaXRKc29uS2V5c0VudW0geworCQlBQ1RJT04oIkFDVElPTiIpLCBNT0RJRklFUigiTU9ESUZJRVIiKSwgRUNPTVBfVVNFUigiRUNPTVBfVVNFUiIpLCBTVEFUVVMoIlNUQVRVUyIpLCBERVNDKCJERVNDUklQVElPTiIpOworCQlwcml2YXRlIFN0cmluZyBhdWRpdEpzb25LZXlOYW1lOworCisJCXByaXZhdGUgRWNvbXBDb25zdW1lckF1ZGl0SnNvbktleXNFbnVtKFN0cmluZyBhdWRpdEpzb25LZXlOYW1lKSB7CisJCQl0aGlzLmF1ZGl0SnNvbktleU5hbWUgPSBhdWRpdEpzb25LZXlOYW1lOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBdWRpdEpzb25LZXlOYW1lKCkgeworCQkJcmV0dXJuIGF1ZGl0SnNvbktleU5hbWUudG9Mb3dlckNhc2UoKTsKKwkJfQorCX0KKworCS8qCisJICogcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VBcnRpZmF0QXVkaXRTdWNjZXNzKFN0cmluZyBhY3Rpb24sIEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdCwgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyAsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9CisJICogQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHVzZXIpOyBTdHJpbmcgYXVkaXRBY3Rpb24gPSBhY3Rpb247IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGF1ZGl0QWN0aW9uKTsgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoIiIpOworCSAqIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZSgoTGlmZWN5Y2xlU3RhdGVFbnVtLiBOT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMCIpOworCSAqIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCApKTsgQXVkaXRVdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBudWxsKTsgfQorCSAqLworCisJLyoKKwkgKiBwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZUFydGlmYXRWYWxpZGF0ZUF1ZGl0V2l0aEVycm9yTWVzc2FnZShTdHJpbmcgYWN0aW9uU3RhdHVzLCBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBTdHJpbmcgYXVkaXRBY3Rpb24sIFN0cmluZyBzZXRDdXJyU3RhdGUsIE9iamVjdCAuLi4gdmFyaWFibGVzKXRocm93cyBFeGNlcHRpb24geyBFcnJvckluZm8gZXJyb3JJbmZvID0KKwkgKiB1dGlscy5wYXJzZVlhbWwoYWN0aW9uU3RhdHVzKTsgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0ID0gQ29udmVydG9yLmNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihyZXNvdXJjZURldGFpbHMsIHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCksIHNkbmNVc2VyRGV0YWlscyk7CisJICogZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYXVkaXRBY3Rpb24pOyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJTdGF0ZShzZXRDdXJyU3RhdGUpOworCSAqIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSkgOyBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoZXJyb3JJbmZvLmdldEF1ZGl0RGVzYyh2YXJpYWJsZXMpICk7IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QXJ0aWZhY3ROYW1lKCIiKTsKKwkgKiBBdWRpdFV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYXVkaXRBY3Rpb24sIG51bGwpOyB9CisJICovCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9FY29tcFVzZXJSZXN0VXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0Vjb21wVXNlclJlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTcxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9FY29tcFVzZXJSZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnJlc3RmdWwuZG9tYWluLkVjb21wUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnJlc3RmdWwuZG9tYWluLkVjb21wVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW4uU3RhcnRUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIEVjb21wVXNlclJlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCisJc3RhdGljIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFVzZXJSZXN0VXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKwlzdGF0aWMgU3RyaW5nIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKwlzdGF0aWMgU3RyaW5nIGFjY2VwdEhlYWRlckRhdGUgPSAiYXBwbGljYXRpb24vanNvbiI7CisJc3RhdGljIFN0cmluZyBlY29tcFVzZXJuYW1lID0gIjEyMzQ1IjsKKwlzdGF0aWMgU3RyaW5nIGVjb21wUGFzc3dvcmQgPSAiMTIzNDUiOworCisJcHVibGljIEVjb21wVXNlclJlc3RVdGlscygpIHsKKwkJc3VwZXIoKTsKKworCQlTdGFydFRlc3QuZW5hYmxlTG9nZ2VyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgcHVzaFVzZXIoRWNvbXBVc2VyIGVjb21wVXNlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5FQ09NUF9VU0VSTkFNRS5nZXRWYWx1ZSgpLCBlY29tcFVzZXJuYW1lKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uRUNPTVBfUEFTU1dPUkQuZ2V0VmFsdWUoKSwgZWNvbXBQYXNzd29yZCk7CisKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKGVjb21wVXNlcik7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkVDT01QX1BVU0hfVVNFUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgdXNlcjoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlVzZXIgYm9keToge30iLCB1c2VyQm9keUpzb24pOworCQlsb2dnZXIuZGVidWcoIlVzZXIgaGVhZGVyczoge30iLCBoZWFkZXJzTWFwKTsKKworCQlSZXN0UmVzcG9uc2Ugc2VuZFB1c2hVc2VyUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRQdXNoVXNlclJlc3BvbnNlOworCX0KKworCS8qCisJICogbG9naW5JZCAtIGVxdWFscyB0byB1c2VySWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBlZGl0VXNlcihTdHJpbmcgbG9naW5JZCwgRWNvbXBVc2VyIGVjb21wVXNlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5FQ09NUF9VU0VSTkFNRS5nZXRWYWx1ZSgpLCBlY29tcFVzZXJuYW1lKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uRUNPTVBfUEFTU1dPUkQuZ2V0VmFsdWUoKSwgZWNvbXBQYXNzd29yZCk7CisKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKGVjb21wVXNlcik7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkVDT01QX0VESVRfVVNFUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgbG9naW5JZCk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBPU1QgcmVxdWVzdCB0byBlZGl0IHVzZXI6IHt9IiwgdXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJVc2VyIGJvZHk6IHt9IiwgdXNlckJvZHlKc29uKTsKKwkJbG9nZ2VyLmRlYnVnKCJVc2VyIGhlYWRlcnM6IHt9IiwgaGVhZGVyc01hcCk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRFZGl0VXNlclJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCB1c2VyQm9keUpzb24sIGhlYWRlcnNNYXApOworCisJCXJldHVybiBzZW5kRWRpdFVzZXJSZXNwb25zZTsKKwl9CisKKwkvKgorCSAqIGxvZ2luSWQgLSBlcXVhbHMgdG8gdXNlcklkCisJICovCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0VXNlcihTdHJpbmcgbG9naW5JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5FQ09NUF9VU0VSTkFNRS5nZXRWYWx1ZSgpLCBlY29tcFVzZXJuYW1lKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uRUNPTVBfUEFTU1dPUkQuZ2V0VmFsdWUoKSwgZWNvbXBQYXNzd29yZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkVDT01QX0dFVF9VU0VSLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBsb2dpbklkKTsKKworCQlsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gZ2V0IHVzZXI6IHt9IiwgdXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJVc2VyIGhlYWRlcnM6IHt9IiwgaGVhZGVyc01hcCk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRHZXRVc2VyUmVxdWVzdCA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gc2VuZEdldFVzZXJSZXF1ZXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldEFsbFVzZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5FQ09NUF9VU0VSTkFNRS5nZXRWYWx1ZSgpLCBlY29tcFVzZXJuYW1lKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uRUNPTVBfUEFTU1dPUkQuZ2V0VmFsdWUoKSwgZWNvbXBQYXNzd29yZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkVDT01QX0dFVF9BTExfVVNFUlMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBQT1NUIHJlcXVlc3QgdG8gZ2V0IGFsbCB1c2Vyczoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlVzZXIgaGVhZGVyczoge30iICwgaGVhZGVyc01hcCk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRHZXRBbGxVc2Vyc1JlcXVlc3QgPSBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRHZXRBbGxVc2Vyc1JlcXVlc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0QWxsQXZhaWxhYmxlUm9sZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkVDT01QX1VTRVJOQU1FLmdldFZhbHVlKCksIGVjb21wVXNlcm5hbWUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5FQ09NUF9QQVNTV09SRC5nZXRWYWx1ZSgpLCBlY29tcFBhc3N3b3JkKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuRUNPTVBfR0VUX0FMTF9BVkFJTEFCTEVfUk9MRVMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIEdFVCByZXF1ZXN0IHRvIGdldCBhbGwgYXZhaWxhYmxlIHJvbGVzOiB7fSIsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiVXNlciBoZWFkZXJzOiB7fSIsIGhlYWRlcnNNYXApOworCisJCVJlc3RSZXNwb25zZSBzZW5kVXBkYXRlVXNlclJlcXVlc3QgPSBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRVcGRhdGVVc2VyUmVxdWVzdDsKKwl9CisKKwkvKgorCSAqIGxvZ2luSWQgLSBlcXVhbHMgdG8gdXNlcklkCisJICovCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgcHVzaFVzZXJSb2xlcyhTdHJpbmcgbG9naW5JZCwgTGlzdDxFY29tcFJvbGU+IHJvbGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkVDT01QX1VTRVJOQU1FLmdldFZhbHVlKCksIGVjb21wVXNlcm5hbWUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5FQ09NUF9QQVNTV09SRC5nZXRWYWx1ZSgpLCBlY29tcFBhc3N3b3JkKTsKKworCQlTdHJpbmcgcm9sZUJvZHlKc29uID0gZ3Nvbi50b0pzb24ocm9sZXMpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5FQ09NUF9QVVNIX1VTRVJfUk9MRVMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJbG9naW5JZCk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBPU1QgcmVxdWVzdCB0byBwdXNoIHVzZXIgcm9sZToge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlJvbGVzIGJvZHk6IHt9Iiwgcm9sZUJvZHlKc29uKTsKKwkJbG9nZ2VyLmRlYnVnKCJSZXF1ZXN0IGhlYWRlcnM6IHt9IiwgaGVhZGVyc01hcCk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRwdXNoVXNlclJvbGVzUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHJvbGVCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRwdXNoVXNlclJvbGVzUmVzcG9uc2U7CisJfQorCisJLyoKKwkgKiBsb2dpbklkIC0gZXF1YWxzIHRvIHVzZXJJZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldFVzZXJSb2xlcyhTdHJpbmcgbG9naW5JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5FQ09NUF9VU0VSTkFNRS5nZXRWYWx1ZSgpLCBlY29tcFVzZXJuYW1lKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uRUNPTVBfUEFTU1dPUkQuZ2V0VmFsdWUoKSwgZWNvbXBQYXNzd29yZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkVDT01QX0dFVF9VU0VSX1JPTEVTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCWxvZ2luSWQpOworCisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBHRVQgcmVxdWVzdCB0byBnZXQgdXNlciByb2xlczoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlVzZXIgaGVhZGVyczoge30iLCBoZWFkZXJzTWFwKTsKKworCQlSZXN0UmVzcG9uc2Ugc2VuZEdldFVzZXJSb2xlc1JlcXVlc3QgPSBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRHZXRVc2VyUm9sZXNSZXF1ZXN0OworCX0KKworCS8vIFRPRE8gISEhISEhISEhISEhISEKKwkvKgorCSAqIEFzayBFbGkgaWYgaW1wbGVtZW50YXRpb24gb2YgdXNlcnMgaXMgbmVlZGVkIERFTEVURSBFQ09NUCBVU0VSCisJICovCisKKwkvKgorCSAqIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsgRWNvbXBVc2VyIGVjb21wVXNlciA9IG5ldworCSAqIEVjb21wVXNlcigpOyBlY29tcFVzZXIuc2V0Rmlyc3ROYW1lKCJUZXN0Iik7CisJICogZWNvbXBVc2VyLnNldExhc3ROYW1lKCJUZXN0b3ZpY2giKTsKKwkgKiBlY29tcFVzZXIuc2V0RW1haWwoInR0ZXNAaW50bC5zZGMuY29tIik7IGVjb21wVXNlci5zZXRMb2dpbklkKCJ0dDAwMDQiKTsKKwkgKiBlY29tcFVzZXIuc2V0QWN0aXZlKHRydWUpOworCSAqIAorCSAqIEVjb21wUm9sZSByb2xlVG9VcGRhdGUgPSBuZXcgRWNvbXBSb2xlKCk7IHJvbGVUb1VwZGF0ZS5zZXRJZChuZXcKKwkgKiBMb25nKDYpKTsgcm9sZVRvVXBkYXRlLnNldE5hbWUoIlBST0RVQ1RfU1RSQVRFR0lTVCIpOyBMaXN0PEVjb21wUm9sZT4KKwkgKiBsaXN0T2ZSb2xlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsgbGlzdE9mUm9sZXMuYWRkKHJvbGVUb1VwZGF0ZSk7CisJICogCisJICogdHJ5IHsKKwkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiBUZXN0aW5nIHB1c2hVc2VyIik7CisJICogU3lzdGVtLm91dC5wcmludGxuKHB1c2hVc2VyKGVjb21wVXNlcikpOworCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIFRlc3RpbmcgZWRpdFVzZXIiKTsKKwkgKiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZWRpdFVzZXIoInR0MDAwMSIsIGVjb21wVXNlcikpOworCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIFRlc3RpbmcgZ2V0VXNlciIpOworCSAqIC8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRVc2VyKGVjb21wVXNlci5nZXRMb2dpbklkKCkpKTsgU3lzdGVtLm91dC4KKwkgKiBwcmludGxuKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gVGVzdGluZyBnZXRBbGxVc2VycyIpOyAvLworCSAqIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbGxVc2VycygpKTsgU3lzdGVtLm91dC4KKwkgKiBwcmludGxuKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gVGVzdGluZyBnZXRBbGxBdmFpbGFibGVSb2xlcyIKKwkgKiApOyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsQXZhaWxhYmxlUm9sZXMoKS50b1N0cmluZygpKTsgU3lzdGVtLm91dC4KKwkgKiBwcmludGxuKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gVGVzdGluZyBwdXNoVXNlclJvbGVzIik7IC8vCisJICogU3lzdGVtLm91dC5wcmludGxuKHB1c2hVc2VyUm9sZXMoInR0MDAwMSIsIGxpc3RPZlJvbGVzKSk7IFN5c3RlbS5vdXQuCisJICogcHJpbnRsbigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIFRlc3RpbmcgZ2V0VXNlclJvbGVzIik7IC8vCisJICogU3lzdGVtLm91dC5wcmludGxuKGdldFVzZXJSb2xlcygidHQwMDAxIikpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IC8vCisJICogVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jayBlLnByaW50U3RhY2tUcmFjZSgpOyB9IH0KKwkgKi8KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L0dyb3VwUmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Hcm91cFJlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OWM4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Hcm91cFJlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKK3B1YmxpYyBjbGFzcyBHcm91cFJlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjY2VwdEhlYWRlckRhdGUgPSAiYXBwbGljYXRpb24vanNvbiI7CisJc3RhdGljIENvbmZpZyBjb25maWcgPSBDb25maWcuaW5zdGFuY2UoKTsKKwlwdWJsaWMgc3RhdGljIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRHcm91cEJ5SWQoQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGdyb3VwSWQsIFVzZXIgdXNlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfR1JPVVBfQllfSUQsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgZ3JvdXBJZCk7CisKKwkJUmVzdFJlc3BvbnNlIHNlbmRHZXRTZXJ2ZXJSZXF1ZXN0ID0gc2VuZEdldCh1cmwsIHVzZXIuZ2V0VXNlcklkKCksIGhlYWRlcnNNYXApOworCisJCXJldHVybiBzZW5kR2V0U2VydmVyUmVxdWVzdDsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvSW1wb3J0UmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9JbXBvcnRSZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U0ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvSW1wb3J0UmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNsaWVudFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLk11bHRpcGFydEVudGl0eUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLmNvbnRlbnQuRmlsZUJvZHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLmNvbnRlbnQuU3RyaW5nQm9keTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQ2xvc2VhYmxlSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuSHR0cENsaWVudHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ucmVzdC5IdHRwUmVzdENsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5JbXBvcnRUZXN0VHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGkuUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEltcG9ydFJlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEltcG9ydFJlc3RVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZG93bmxvYWRDc2FySGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKwlzdGF0aWMgeworCQlkb3dubG9hZENzYXJIZWFkZXJzLnB1dCgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgc3RhdGljIEludGVnZXIgaW1wb3J0Tm9ybWF0aXZlUmVzb3VyY2UoTm9ybWF0aXZlVHlwZXNFbnVtIHJlc291cmNlLCBVc2VyUm9sZUVudW0gdXNlclJvbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJTXVsdGlwYXJ0RW50aXR5QnVpbGRlciBtcEJ1aWxkZXIgPSBNdWx0aXBhcnRFbnRpdHlCdWlsZGVyLmNyZWF0ZSgpOworCisJCW1wQnVpbGRlci5hZGRQYXJ0KCJyZXNvdXJjZVppcCIsIG5ldyBGaWxlQm9keShnZXRUZXN0WmlwRmlsZShyZXNvdXJjZS5nZXRGb2xkZXJOYW1lKCkpKSk7CisJCW1wQnVpbGRlci5hZGRQYXJ0KCJyZXNvdXJjZU1ldGFkYXRhIiwgbmV3IFN0cmluZ0JvZHkoZ2V0VGVzdEpzb25TdHJpbmdPZkZpbGUocmVzb3VyY2UuZ2V0Rm9sZGVyTmFtZSgpLCByZXNvdXJjZS5nZXRGb2xkZXJOYW1lKCkgKyAiLmpzb24iKSwgQ29udGVudFR5cGUuQVBQTElDQVRJT05fSlNPTikpOworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuSU1QT1JUX1JFU09VUkNFX05PUk1BVElWRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCXRyeSB7CisJCQlIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdCh1cmwpOworCQkJaHR0cFBvc3QuYWRkSGVhZGVyKCJVU0VSX0lEIiwgdXNlclJvbGUuZ2V0VXNlcklkKCkpOworCQkJaHR0cFBvc3Quc2V0RW50aXR5KG1wQnVpbGRlci5idWlsZCgpKTsKKwkJCXJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoaHR0cFBvc3QpOworCQkJcmV0dXJuIHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCX0gZmluYWxseSB7CisJCQljbG9zZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJCWNsb3NlSHR0cENsaWVudChjbGllbnQpOworCisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgaW1wb3J0UmVzb3VyY2VCeU5hbWUoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciBpbXBvcnRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJTXVsdGlwYXJ0RW50aXR5QnVpbGRlciBtcEJ1aWxkZXIgPSBNdWx0aXBhcnRFbnRpdHlCdWlsZGVyLmNyZWF0ZSgpOworCisJCW1wQnVpbGRlci5hZGRQYXJ0KCJyZXNvdXJjZVppcCIsIG5ldyBGaWxlQm9keShnZXRUZXN0WmlwRmlsZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKSkpOworCQltcEJ1aWxkZXIuYWRkUGFydCgicmVzb3VyY2VNZXRhZGF0YSIsIG5ldyBTdHJpbmdCb2R5KGdldFRlc3RKc29uU3RyaW5nT2ZGaWxlKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCksIHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkgKyAiLmpzb24iKSwgQ29udGVudFR5cGUuQVBQTElDQVRJT05fSlNPTikpOworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuSU1QT1JUX1JFU09VUkNFX05PUk1BVElWRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCXRyeSB7CisJCQlIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdCh1cmwpOworCQkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IG5ldyBSZXN0UmVzcG9uc2UoKTsKKwkJCWh0dHBQb3N0LmFkZEhlYWRlcigiVVNFUl9JRCIsIGltcG9ydGVyLmdldFVzZXJJZCgpKTsKKwkJCWh0dHBQb3N0LnNldEVudGl0eShtcEJ1aWxkZXIuYnVpbGQoKSk7CisJCQlyZXNwb25zZSA9IGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCUh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisJCQlTdHJpbmcgcmVzcG9uc2VCb2R5ID0gbnVsbDsKKwkJCWlmIChlbnRpdHkgIT0gbnVsbCkgeworCQkJCUlucHV0U3RyZWFtIGluc3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKKwkJCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJCUlPVXRpbHMuY29weShpbnN0cmVhbSwgd3JpdGVyKTsKKwkJCQlyZXNwb25zZUJvZHkgPSB3cml0ZXIudG9TdHJpbmcoKTsKKwkJCQl0cnkgeworCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaW5zdHJlYW0uY2xvc2UoKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSk7CisJCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2VCb2R5KTsKKworCQkJaWYgKHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldFVVSUQoUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShyZXN0UmVzcG9uc2UpKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzdFJlc3BvbnNlKSk7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24oUmVzcG9uc2VQYXJzZXIuZ2V0VmVyc2lvbkZyb21SZXNwb25zZShyZXN0UmVzcG9uc2UpKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0Q3JlYXRvclVzZXJJZChpbXBvcnRlci5nZXRVc2VySWQoKSk7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldENyZWF0b3JGdWxsTmFtZShpbXBvcnRlci5nZXRGdWxsTmFtZSgpKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKworCQl9IGZpbmFsbHkgeworCQkJY2xvc2VSZXNwb25zZShyZXNwb25zZSk7CisJCQljbG9zZUh0dHBDbGllbnQoY2xpZW50KTsKKworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBpbXBvcnROZXdSZXNvdXJjZUJ5TmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBVc2VyUm9sZUVudW0gdXNlclJvbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNdWx0aXBhcnRFbnRpdHlCdWlsZGVyIG1wQnVpbGRlciA9IE11bHRpcGFydEVudGl0eUJ1aWxkZXIuY3JlYXRlKCk7CisKKwkJbXBCdWlsZGVyLmFkZFBhcnQoInJlc291cmNlWmlwIiwgbmV3IEZpbGVCb2R5KGdldFRlc3RaaXBGaWxlKHJlc291cmNlTmFtZSkpKTsKKwkJbXBCdWlsZGVyLmFkZFBhcnQoInJlc291cmNlTWV0YWRhdGEiLCBuZXcgU3RyaW5nQm9keShnZXRUZXN0SnNvblN0cmluZ09mRmlsZShyZXNvdXJjZU5hbWUsIHJlc291cmNlTmFtZSArICIuanNvbiIpLCBDb250ZW50VHlwZS5BUFBMSUNBVElPTl9KU09OKSk7CisJCUh0dHBFbnRpdHkgcmVxdWVzdEVudGl0eSA9IG1wQnVpbGRlci5idWlsZCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLklNUE9SVF9VU0VSX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnMucHV0KCJVU0VSX0lEIiwgdXNlclJvbGUuZ2V0VXNlcklkKCkpOworCisJCXJldHVybiBIdHRwUmVxdWVzdC5zZW5kSHR0cFBvc3RXaXRoRW50aXR5KHJlcXVlc3RFbnRpdHksIHVybCwgaGVhZGVycyk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgaW1wb3J0Tm9ybWF0aXZlUmVzb3VyY2VCeU5hbWUoU3RyaW5nIHJlc291cmNlTmFtZSwgVXNlclJvbGVFbnVtIHVzZXJSb2xlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTXVsdGlwYXJ0RW50aXR5QnVpbGRlciBtcEJ1aWxkZXIgPSBNdWx0aXBhcnRFbnRpdHlCdWlsZGVyLmNyZWF0ZSgpOworCisJCW1wQnVpbGRlci5hZGRQYXJ0KCJyZXNvdXJjZVppcCIsIG5ldyBGaWxlQm9keShnZXRUZXN0WmlwRmlsZShyZXNvdXJjZU5hbWUpKSk7CisJCW1wQnVpbGRlci5hZGRQYXJ0KCJyZXNvdXJjZU1ldGFkYXRhIiwgbmV3IFN0cmluZ0JvZHkoZ2V0VGVzdEpzb25TdHJpbmdPZkZpbGUocmVzb3VyY2VOYW1lLCByZXNvdXJjZU5hbWUgKyAiLmpzb24iKSwgQ29udGVudFR5cGUuQVBQTElDQVRJT05fSlNPTikpOworCQlIdHRwRW50aXR5IHJlcXVlc3RFbnRpdHkgPSBtcEJ1aWxkZXIuYnVpbGQoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5JTVBPUlRfUkVTT1VSQ0VfTk9STUFUSVZFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnMucHV0KCJVU0VSX0lEIiwgdXNlclJvbGUuZ2V0VXNlcklkKCkpOworCisJCXJldHVybiBIdHRwUmVxdWVzdC5zZW5kSHR0cFBvc3RXaXRoRW50aXR5KHJlcXVlc3RFbnRpdHksIHVybCwgaGVhZGVycyk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgaW1wb3J0VGVzdFJlc291cmNlKEltcG9ydFRlc3RUeXBlc0VudW0gcmVzb3VyY2UsIFVzZXJSb2xlRW51bSB1c2VyUm9sZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQlNdWx0aXBhcnRFbnRpdHlCdWlsZGVyIG1wQnVpbGRlciA9IE11bHRpcGFydEVudGl0eUJ1aWxkZXIuY3JlYXRlKCk7CisKKwkJbXBCdWlsZGVyLmFkZFBhcnQoInJlc291cmNlWmlwIiwgbmV3IEZpbGVCb2R5KGdldFRlc3RaaXBGaWxlKHJlc291cmNlLmdldEZvbGRlck5hbWUoKSkpKTsKKwkJbXBCdWlsZGVyLmFkZFBhcnQoInJlc291cmNlTWV0YWRhdGEiLCBuZXcgU3RyaW5nQm9keShnZXRUZXN0SnNvblN0cmluZ09mRmlsZShyZXNvdXJjZS5nZXRGb2xkZXJOYW1lKCksIHJlc291cmNlLmdldEZvbGRlck5hbWUoKSArICIuanNvbiIpLCBDb250ZW50VHlwZS5BUFBMSUNBVElPTl9KU09OKSk7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5JTVBPUlRfUkVTT1VSQ0VfTk9STUFUSVZFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGNsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJdHJ5IHsKKwkJCUh0dHBQb3N0IGh0dHBQb3N0ID0gbmV3IEh0dHBQb3N0KHVybCk7CisJCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbmV3IFJlc3RSZXNwb25zZSgpOworCQkJaHR0cFBvc3QuYWRkSGVhZGVyKCJVU0VSX0lEIiwgVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJJZCgpKTsKKwkJCWh0dHBQb3N0LnNldEVudGl0eShtcEJ1aWxkZXIuYnVpbGQoKSk7CisJCQlyZXNwb25zZSA9IGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCUh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisJCQlTdHJpbmcgcmVzcG9uc2VCb2R5ID0gbnVsbDsKKwkJCWlmIChlbnRpdHkgIT0gbnVsbCkgeworCQkJCUlucHV0U3RyZWFtIGluc3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKKwkJCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJCUlPVXRpbHMuY29weShpbnN0cmVhbSwgd3JpdGVyKTsKKwkJCQlyZXNwb25zZUJvZHkgPSB3cml0ZXIudG9TdHJpbmcoKTsKKwkJCQl0cnkgeworCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaW5zdHJlYW0uY2xvc2UoKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSk7CisJCQkvLyByZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2UuZ2V0RW50aXR5KCkudG9TdHJpbmcoKSk7CisJCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2VCb2R5KTsKKwkJCXJldHVybiByZXN0UmVzcG9uc2U7CisJCX0gZmluYWxseSB7CisJCQljbG9zZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJCWNsb3NlSHR0cENsaWVudChjbGllbnQpOworCisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIEJvb2xlYW4gcmVtb3ZlTm9ybWF0aXZlVHlwZVJlc291cmNlKE5vcm1hdGl2ZVR5cGVzRW51bSBjdXJyZW50KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ2xpZW50UHJvdG9jb2xFeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcihVc2VyUm9sZUVudW0uQURNSU4uZ2V0Rmlyc3ROYW1lKCksIFVzZXJSb2xlRW51bS5BRE1JTi5nZXRMYXN0TmFtZSgpLCBVc2VyUm9sZUVudW0uQURNSU4uZ2V0VXNlcklkKCksIG51bGwsIG51bGwsIG51bGwpOworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlciwgY3VycmVudC5nZXROb3JtYXRpdmVOYW1lKCksICIxLjAiKTsKKwkJaWYgKGRlbGV0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUltcG9ydFRlc3RUeXBlc1Jlc3AoSW1wb3J0VGVzdFR5cGVzRW51bSBjdXJyUmVzb3VyY2UsIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbiB7CisKKwkJLy8gYXNzZXJ0VHJ1ZSggc3RhdHVzICE9IFJlc291cmNlVXRpbHMuU1RBVFVTX0NPREVfSU1QT1JUX1NVQ0NFU1MgKTsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoY3VyclJlc291cmNlLmdldEFjdGlvblN0YXR1cygpLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgcmVzdFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCS8vIHZhbGlkYXRlIGNyZWF0ZSBzZXJ2aWNlIHJlc3BvbnNlIHZzIGFjdHVhbAorCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gKGN1cnJSZXNvdXJjZS5nZXRFcnJvclBhcmFtcygpICE9IG51bGwgPyBjdXJyUmVzb3VyY2UuZ2V0RXJyb3JQYXJhbXMoKSA6IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKwkJaWYgKHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSAhPSAyMDApIHsKKwkJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihjdXJyUmVzb3VyY2UuZ2V0QWN0aW9uU3RhdHVzKCkubmFtZSgpLCB2YXJpYWJsZXMsIHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZXN0SnNvblN0cmluZ09mRmlsZShTdHJpbmcgZm9sZGVyTmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBTdHJpbmcgc291cmNlRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzIjsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXIoKTsKKwkJamF2YS5uaW8uZmlsZS5QYXRoIGZpbGVQYXRoID0gRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLmdldFBhdGgoc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXJOYW1lLCBmaWxlTmFtZSk7CisJCWJ5dGVbXSBmaWxlQ29udGVudCA9IEZpbGVzLnJlYWRBbGxCeXRlcyhmaWxlUGF0aCk7CisJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhmaWxlQ29udGVudCk7CisJCXJldHVybiBjb250ZW50OworCX0KKworCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0VGVzdFppcEZpbGUoU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBzb3VyY2VEaXIgPSBjb25maWcuZ2V0SW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0RpcigpOworCQlqYXZhLm5pby5maWxlLlBhdGggZmlsZVBhdGggPSBGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkuZ2V0UGF0aChzb3VyY2VEaXIgKyBGaWxlLnNlcGFyYXRvciArIGVsZW1lbnROYW1lLCAibm9ybWF0aXZlLXR5cGVzLW5ldy0iICsgZWxlbWVudE5hbWUgKyAiLnppcCIpOworCQlyZXR1cm4gZmlsZVBhdGgudG9GaWxlKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZUh0dHBDbGllbnQoQ2xvc2VhYmxlSHR0cENsaWVudCBjbGllbnQpIHsKKwkJdHJ5IHsKKwkJCWlmIChjbGllbnQgIT0gbnVsbCkgeworCQkJCWNsaWVudC5jbG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjbG9zZSBjbGllbnQgb3IgcmVzcG9uc2U6ICIsIGUpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZVJlc3BvbnNlKENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSkgeworCQl0cnkgeworCQkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5jbG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjbG9zZSBjbGllbnQgb3IgcmVzcG9uc2U6IHt9IiwgZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZUFzQnl0ZUFycmF5IGdldENzYXIoU3RyaW5nIGNzYXJVaWQsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9DU0FSX1VTSU5HX1NJTVVMQVRPUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgY3NhclVpZCk7CisKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKworCQkvLyBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQkvLyBTdHJpbmcgdXNlckJvZHlKc29uID0gZ3Nvbi50b0pzb24ocmVzb3VyY2VEZXRhaWxzKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXJsKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHVzZXJCb2R5SnNvbik7CisKKwkJSHR0cFJlc3RDbGllbnQgaHR0cFJlc3RDbGllbnQgPSBuZXcgSHR0cFJlc3RDbGllbnQoKTsKKworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwRW50cnkgOiBoZWFkZXJzTWFwLmVudHJ5U2V0KCkpIHsKKworCQkJZG93bmxvYWRDc2FySGVhZGVycy5wdXQobWFwRW50cnkuZ2V0S2V5KCksIG1hcEVudHJ5LmdldFZhbHVlKCkpOworCQl9CisJCVJlc3RSZXNwb25zZUFzQnl0ZUFycmF5IGRvR2V0QXNCeXRlQXJyYXkgPSBodHRwUmVzdENsaWVudC5kb0dldEFzQnl0ZUFycmF5KHVybCwgZG93bmxvYWRDc2FySGVhZGVycyk7CisJCS8vIFJlc3RSZXNwb25zZSBnZXRDc2FyID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCisJCXJldHVybiBkb0dldEFzQnl0ZUFycmF5OworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRHcm91cFR5cGVaaXBGaWxlKFN0cmluZyBlbGVtZW50TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXIoKTsKKwkJc291cmNlRGlyICs9IEZpbGUuc2VwYXJhdG9yICsgIi4uIiArIEZpbGUuc2VwYXJhdG9yICsgImltcG9ydFR5cGVzVGVzdCIgKyBGaWxlLnNlcGFyYXRvcjsKKwkJamF2YS5uaW8uZmlsZS5QYXRoIGZpbGVQYXRoID0gRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLmdldFBhdGgoc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBlbGVtZW50TmFtZSwgZWxlbWVudE5hbWUgKyAiLnppcCIpOworCQlyZXR1cm4gZmlsZVBhdGgudG9GaWxlKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgaW1wb3J0TmV3R3JvdXBUeXBlQnlOYW1lKFN0cmluZyBncm91cFR5cGVOYW1lLCBVc2VyUm9sZUVudW0gdXNlclJvbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNdWx0aXBhcnRFbnRpdHlCdWlsZGVyIG1wQnVpbGRlciA9IE11bHRpcGFydEVudGl0eUJ1aWxkZXIuY3JlYXRlKCk7CisKKwkJbXBCdWlsZGVyLmFkZFBhcnQoImdyb3VwVHlwZXNaaXAiLCBuZXcgRmlsZUJvZHkoZ2V0R3JvdXBUeXBlWmlwRmlsZShncm91cFR5cGVOYW1lKSkpOworCQlIdHRwRW50aXR5IHJlcXVlc3RFbnRpdHkgPSBtcEJ1aWxkZXIuYnVpbGQoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5JTVBPUlRfR1JPVVBfVFlQRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzLnB1dCgiVVNFUl9JRCIsIHVzZXJSb2xlLmdldFVzZXJJZCgpKTsKKworCQlyZXR1cm4gSHR0cFJlcXVlc3Quc2VuZEh0dHBQb3N0V2l0aEVudGl0eShyZXF1ZXN0RW50aXR5LCB1cmwsIGhlYWRlcnMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvSW5wdXRzUmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9JbnB1dHNSZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTdiZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvSW5wdXRzUmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0SW5wdXRzTWFwOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKKy8qKgorICogUmVzdFV0aWxzIGZvciBpbnB1dHMKKyAqIAorICogQGF1dGhvciBpbDA2OTUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbnB1dHNSZXN0VXRpbHMgZXh0ZW5kcyBCYXNlUmVzdFV0aWxzIHsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbnB1dHNSZXN0VXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKwkKKwkvKioKKwkgKiBBZGQgaW5wdXRzIHRvIHNlcnZpY2UKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQHBhcmFtIGlucHV0cworCSAqIEBwYXJhbSB1c2VyUm9sZQorCSAqIEByZXR1cm4ge0BsaW5rIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZX0KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGFkZElucHV0KENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudEluc3RJbnB1dHNNYXAgaW5wdXRzLCBVc2VyUm9sZUVudW0gdXNlclJvbGUpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQUREX0lOUFVUUywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCVN0cmluZyBqc29uID0gbmV3IEdzb24oKS50b0pzb24oaW5wdXRzKTsKKwkJcmV0dXJuIHNlbmRQb3N0KHVybCwganNvbiwgdXNlclJvbGUuZ2V0VXNlcklkKCksIGFjY2VwdEhlYWRlckRhdGEpOworCX0KKworCS8qKgorCSAqIEdldCBhbGwgQ29tcG9uZW50IGlucHV0cworCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnQKKwkgKiBAcmV0dXJuIHtAbGluayBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2V9CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRDb21wb25lbnRJbnB1dHMoQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJLy9zZXJ2aWNlcy97Y29tcG9uZW50SWR9L2lucHV0cworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9DT01QT05FTlRfSU5QVVRTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CQkKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLmdldFVzZXJJZCgpKTsKKwl9CisJCisJLyoqCisJICogR2V0IGFsbCBpbnB1dHMgb2YgY29tcG9uZW50IGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHBhcmVudENvbXBvbmVudAorCSAqIEBwYXJhbSBjb21wb25lbnRJbnN0YW5jZQorCSAqIEByZXR1cm4ge0BsaW5rIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZX0KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzKENvbXBvbmVudCBwYXJlbnRDb21wb25lbnQsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQkvL3tjb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L2NvbXBvbmVudEluc3RhbmNlcy97aW5zdGFuY2VJZH0ve29yaWdpbkNvbW9uZW50VWlkfS9pbnB1dHMJCQorCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9DT01QT05FTlRfSU5TVEFOQ0VfSU5QVVRTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUocGFyZW50Q29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSksIHBhcmVudENvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKSk7CisJCXJldHVybiBzZW5kR2V0KHVybCwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRVc2VySWQoKSk7CisJfQorCQorCS8qKgorCSAqIERlbGV0ZSBpbnB1dCBmcm9tIGNvbXBvbmVudAorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRDb21wb25lbnQKKwkgKiBAcGFyYW0gaW5wdXRJZAorCSAqIEByZXR1cm4ge0BsaW5rIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZX0KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZUlucHV0RnJvbUNvbXBvbmVudChDb21wb25lbnQgcGFyZW50Q29tcG9uZW50LCBTdHJpbmcgaW5wdXRJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkZWxldGVJbnB1dEZyb21Db21wb25lbnQoQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKHBhcmVudENvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpLCBwYXJlbnRDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgaW5wdXRJZCk7CisJfQorCisJLyoqCisJICogRGVsZXRlIGlucHV0IGZyb20gY29tcG9uZW50CisJICogCisJICogQHBhcmFtIGNvbXBvbmVudFR5cGUKKwkgKiBAcGFyYW0gY29tcG9uZW50SWQKKwkgKiBAcGFyYW0gaW5wdXRVbmlxdWVJZAorCSAqIEByZXR1cm4ge0BsaW5rIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZX0KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZUlucHV0RnJvbUNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgaW5wdXRVbmlxdWVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJLy97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9kZWxldGUve2lucHV0SWR9L2lucHV0CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX0lOUFVUX0JZX0lELCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCwgaW5wdXRVbmlxdWVJZCk7CisJCXJldHVybiBzZW5kRGVsZXRlKHVybCwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKS5nZXRVc2VySWQoKSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvTGlmZWN5Y2xlUmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9MaWZlY3ljbGVSZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY1MWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvTGlmZWN5Y2xlUmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwzNjAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EaXN0cmlidXRpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvZHVjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgTGlmZWN5Y2xlUmVzdFV0aWxzIGV4dGVuZHMgQmFzZVJlc3RVdGlscyB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpZmVjeWNsZVJlc3RVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlQgPSAiY29tbWVudCI7CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCVN0cmluZyB2ZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtIExpZmVDeWNsZVN0YXRlc0VudW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBjaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgTGlmZUN5Y2xlU3RhdGVzRW51bSwKKwkJCQljcmVhdGVMaWZlY3ljbGVDb21tZW50SnNvbihDT01NRU5UKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlTdHJpbmcgdmVyc2lvbiwgTGlmZUN5Y2xlU3RhdGVzRW51bSBMaWZlQ3ljbGVTdGF0ZXNFbnVtLCBTdHJpbmcgTGlmZWN5Y2xlQ2hhbmdlSW5mbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0sIExpZmVjeWNsZUNoYW5nZUluZm8pOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIExpZmVDeWNsZVN0YXRlc0VudW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJcmV0dXJuIGNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLAorCQkJCWNyZWF0ZUxpZmVjeWNsZUNvbW1lbnRKc29uKENPTU1FTlQpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlU3RhdGUoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgU3RyaW5nIG1vZGlmaWVyVXNlcklkLAorCQkJTGlmZUN5Y2xlU3RhdGVzRW51bSBMaWZlQ3ljbGVTdGF0ZXNFbnVtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcigpOworCQl1c2VyLnNldFVzZXJJZChtb2RpZmllclVzZXJJZCk7CisJCXJldHVybiBjaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdXNlciwgTGlmZUN5Y2xlU3RhdGVzRW51bSwgY3JlYXRlTGlmZWN5Y2xlQ29tbWVudEpzb24oQ09NTUVOVCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZVN0YXRlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCUxpZmVDeWNsZVN0YXRlc0VudW0gTGlmZUN5Y2xlU3RhdGVzRW51bSwgU3RyaW5nIExpZmVjeWNsZUNoYW5nZUluZm8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DSEFOR0VfUkVTT1VSQ0VfTElGRUNZQ0xFX1NUQVRFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ1cmw6ICIgKyB1cmwpOworCisJCVJlc3RSZXNwb25zZSBMaWZlQ3ljbGVTdGF0ZXNFbnVtUmVzb3VyY2VSZXNwb25zZSA9IHNlbmRQb3N0KHVybCwgTGlmZWN5Y2xlQ2hhbmdlSW5mbywKKwkJCQlzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJaWYgKExpZmVDeWNsZVN0YXRlc0VudW1SZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1MpIHsKKwkJCVN0cmluZyBzdGF0ZUZyb21Kc29uUmVzcG9uc2UgPSBSZXNwb25zZVBhcnNlcgorCQkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKExpZmVDeWNsZVN0YXRlc0VudW1SZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJsaWZlY3ljbGVTdGF0ZSIpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24oUmVzcG9uc2VQYXJzZXIuZ2V0VmVyc2lvbkZyb21SZXNwb25zZShMaWZlQ3ljbGVTdGF0ZXNFbnVtUmVzb3VyY2VSZXNwb25zZSkpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKExpZmVDeWNsZVN0YXRlc0VudW1SZXNvdXJjZVJlc3BvbnNlKSk7CisJCQlpZiAoc3RhdGVGcm9tSnNvblJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLnZhbHVlT2Yoc3RhdGVGcm9tSnNvblJlc3BvbnNlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIExpZmVDeWNsZVN0YXRlc0VudW1SZXNvdXJjZVJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VTdGF0ZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJU3RyaW5nIHZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0gTGlmZUN5Y2xlU3RhdGVzRW51bSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXsKKwkJCXJldHVybiBjaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIHZlcnNpb24sIExpZmVDeWNsZVN0YXRlc0VudW0sCisJCQkJCWNyZWF0ZUxpZmVjeWNsZUNvbW1lbnRKc29uKENPTU1FTlQpKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VTdGF0ZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLAorCQkJTGlmZUN5Y2xlU3RhdGVzRW51bSBMaWZlQ3ljbGVTdGF0ZXNFbnVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJeworCQkJcmV0dXJuIGNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgbnVsbCwgTGlmZUN5Y2xlU3RhdGVzRW51bSwKKwkJCQkJY3JlYXRlTGlmZWN5Y2xlQ29tbWVudEpzb24oQ09NTUVOVCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2hhbmdlU2VydmljZVN0YXRlKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIExpZmVDeWNsZVN0YXRlc0VudW0sIFN0cmluZyBsaWZlY3ljbGVDaGFuZ2VJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJeworCQkJcmV0dXJuIGNoYW5nZVNlcnZpY2VTdGF0ZShzZXJ2aWNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgbnVsbCwgTGlmZUN5Y2xlU3RhdGVzRW51bSwKKwkJCQkJbGlmZWN5Y2xlQ2hhbmdlSW5mbyk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlU3RhdGUoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCVN0cmluZyB2ZXJzaW9uLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtIExpZmVDeWNsZVN0YXRlc0VudW0sIFN0cmluZyBsaWZlY3ljbGVDaGFuZ2VJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHNkbmNNb2RpZmllckRldGFpbHMpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ0hBTkdFX1NFUlZJQ0VfTElGRUNZQ0xFX1NUQVRFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksIExpZmVDeWNsZVN0YXRlc0VudW0pOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInVybDogIiArIHVybCk7CisJCVJlc3RSZXNwb25zZSBMaWZlQ3ljbGVTdGF0ZXNFbnVtU2VydmljZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCBsaWZlY3ljbGVDaGFuZ2VJbmZvLCBoZWFkZXJzTWFwKTsKKwkJaWYgKExpZmVDeWNsZVN0YXRlc0VudW1TZXJ2aWNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfU1VDQ0VTUykgeworCQkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyCisJCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoTGlmZUN5Y2xlU3RhdGVzRW51bVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAidW5pcXVlSWQiKTsKKwkJCXNlcnZpY2VEZXRhaWxzLnNldFVuaXF1ZUlkKHNlcnZpY2VVbmlxdWVJZCk7CisJCQlTdHJpbmcgc2VydmljZVZlcnNpb24gPSBSZXNwb25zZVBhcnNlcgorCQkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKExpZmVDeWNsZVN0YXRlc0VudW1TZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgInZlcnNpb24iKTsKKwkJCXNlcnZpY2VEZXRhaWxzLnNldFZlcnNpb24oc2VydmljZVZlcnNpb24pOworCQkJU3RyaW5nIHN0YXRlRnJvbUpzb25SZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoTGlmZUN5Y2xlU3RhdGVzRW51bVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibGlmZWN5Y2xlU3RhdGUiKTsKKwkJCXNlcnZpY2VEZXRhaWxzLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS52YWx1ZU9mKHN0YXRlRnJvbUpzb25SZXNwb25zZSkpOworCQl9CisJCXJldHVybiBMaWZlQ3ljbGVTdGF0ZXNFbnVtU2VydmljZVJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RTdGF0ZShQcm9kdWN0IHByb2R1Y3QsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCUxpZmVDeWNsZVN0YXRlc0VudW0gTGlmZUN5Y2xlU3RhdGVzRW51bSwgU3RyaW5nIGxpZmVjeWNsZUNoYW5nZUluZm8pIHRocm93cyBFeGNlcHRpb24geworCQl7CisJCQlyZXR1cm4gX2NoYW5nZVByb2R1Y3RTdGF0ZShwcm9kdWN0LCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLCBsaWZlY3ljbGVDaGFuZ2VJbmZvKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNoYW5nZVByb2R1Y3RTdGF0ZShQcm9kdWN0IHByb2R1Y3QsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCUxpZmVDeWNsZVN0YXRlc0VudW0gTGlmZUN5Y2xlU3RhdGVzRW51bSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXsKKwkJCXJldHVybiBfY2hhbmdlUHJvZHVjdFN0YXRlKHByb2R1Y3QsIHNkbmNNb2RpZmllckRldGFpbHMsIExpZmVDeWNsZVN0YXRlc0VudW0sIENPTU1FTlQpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdFN0YXRlKFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3REZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIExpZmVDeWNsZVN0YXRlc0VudW0pIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ0hBTkdFX1BST0RVQ1RfTElGRUNZQ0xFX1NUQVRFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHByb2R1Y3REZXRhaWxzLmdldFVuaXF1ZUlkKCksIExpZmVDeWNsZVN0YXRlc0VudW0pOworCQlSZXN0UmVzcG9uc2UgTGlmZUN5Y2xlU3RhdGVzRW51bVNlcnZpY2VSZXNwb25zZSA9IHNlbmRQb3N0KHVybCwgY3JlYXRlTGlmZWN5Y2xlQ29tbWVudEpzb24oQ09NTUVOVCksCisJCQkJc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSwgYWNjZXB0SGVhZGVyRGF0YSk7CisJCWlmIChMaWZlQ3ljbGVTdGF0ZXNFbnVtU2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1MpIHsKKwkJCVN0cmluZyBwcm9kdWN0VW5pcXVlSWQgPSBSZXNwb25zZVBhcnNlcgorCQkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKExpZmVDeWNsZVN0YXRlc0VudW1TZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgInVuaXF1ZUlkIik7CisJCQlwcm9kdWN0RGV0YWlscy5zZXRVbmlxdWVJZChwcm9kdWN0VW5pcXVlSWQpOworCQkJU3RyaW5nIHByb2R1Y3RWZXJzaW9uID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShMaWZlQ3ljbGVTdGF0ZXNFbnVtU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJ2ZXJzaW9uIik7CisJCQlwcm9kdWN0RGV0YWlscy5zZXRWZXJzaW9uKHByb2R1Y3RWZXJzaW9uKTsKKwkJCVN0cmluZyBuZXdMaWZlY3ljbGVTdGF0ZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoTGlmZUN5Y2xlU3RhdGVzRW51bVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibGlmZWN5Y2xlU3RhdGUiKTsKKwkJCXByb2R1Y3REZXRhaWxzLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS52YWx1ZU9mKG5ld0xpZmVjeWNsZVN0YXRlKSk7CisJCX0KKwkJcmV0dXJuIExpZmVDeWNsZVN0YXRlc0VudW1TZXJ2aWNlUmVzcG9uc2U7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VDb21wb25lbnRTdGF0ZShDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIExpZmVDeWNsZVN0YXRlc0VudW0pIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ0hBTkdFX0NPTVBPTkVOVF9MSUZFQ1lDTEVfU1RBVEUsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpLAorCQkJCWNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtKTsKKwkJUmVzdFJlc3BvbnNlIExpZmVDeWNsZVN0YXRlc0VudW1TZXJ2aWNlUmVzcG9uc2UgPSBzZW5kUG9zdCh1cmwsIGNyZWF0ZUxpZmVjeWNsZUNvbW1lbnRKc29uKENPTU1FTlQpLAorCQkJCXNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCksIGFjY2VwdEhlYWRlckRhdGEpOworCQlpZiAoTGlmZUN5Y2xlU3RhdGVzRW51bVNlcnZpY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9TVUNDRVNTKSB7CisJCQlTdHJpbmcgcHJvZHVjdFVuaXF1ZUlkID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkJLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShMaWZlQ3ljbGVTdGF0ZXNFbnVtU2VydmljZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJ1bmlxdWVJZCIpOworCQkJY29tcG9uZW50LnNldFVuaXF1ZUlkKHByb2R1Y3RVbmlxdWVJZCk7CisJCQlTdHJpbmcgcHJvZHVjdFZlcnNpb24gPSBSZXNwb25zZVBhcnNlcgorCQkJCQkuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKExpZmVDeWNsZVN0YXRlc0VudW1TZXJ2aWNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgInZlcnNpb24iKTsKKwkJCWNvbXBvbmVudC5zZXRWZXJzaW9uKHByb2R1Y3RWZXJzaW9uKTsKKwkJCVN0cmluZyBuZXdMaWZlY3ljbGVTdGF0ZSA9IFJlc3BvbnNlUGFyc2VyCisJCQkJCS5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoTGlmZUN5Y2xlU3RhdGVzRW51bVNlcnZpY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAibGlmZWN5Y2xlU3RhdGUiKTsKKwkJCWNvbXBvbmVudC5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0udmFsdWVPZihuZXdMaWZlY3ljbGVTdGF0ZSkpOworCQl9CisJCXJldHVybiBMaWZlQ3ljbGVTdGF0ZXNFbnVtU2VydmljZVJlc3BvbnNlOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2VydGlmeVJlc291cmNlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJLy8gaWYgKHJlc3RSZXNwb25zZVJlc291cmNlLmdldEVycm9yQ29kZSgpID09IDIwMCl7CisJCXJlc3RSZXNwb25zZVJlc291cmNlID0gTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZVJlc291cmNlU3RhdGUocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QpOworCQkvLyB9ZWxzZQorCQkvLyByZXR1cm4gcmVzdFJlc3BvbnNlUmVzb3VyY2U7CisJCVVzZXIgdGVzdGVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlpZiAocmVzdFJlc3BvbnNlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQlyZXN0UmVzcG9uc2VSZXNvdXJjZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VSZXNvdXJjZVN0YXRlKHJlc291cmNlRGV0YWlscywgdGVzdGVyRGV0YWlscywKKwkJCQkJTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQl9IGVsc2UKKwkJCXJldHVybiByZXN0UmVzcG9uc2VSZXNvdXJjZTsKKwkJaWYgKHJlc3RSZXNwb25zZVJlc291cmNlLmdldEVycm9yQ29kZSgpID09IDIwMCkgeworCQkJcmVzdFJlc3BvbnNlUmVzb3VyY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlUmVzb3VyY2VTdGF0ZShyZXNvdXJjZURldGFpbHMsIHRlc3RlckRldGFpbHMsCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCQlpZiAocmVzdFJlc3BvbnNlUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisJCQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBSZXNwb25zZVBhcnNlci5nZXRWZXJzaW9uRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZVJlc291cmNlKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCQkJcmVzb3VyY2VEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKHRlc3RlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQkJCXJlc291cmNlRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHRlc3RlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCQkJU3RyaW5nIHVuaXF1ZUlkRnJvbVJyZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZVJlc291cmNlKTsKKwkJCQlyZXNvdXJjZURldGFpbHMuc2V0VW5pcXVlSWQodW5pcXVlSWRGcm9tUnJlc3BvbnNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdFJlc3BvbnNlUmVzb3VyY2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2VydGlmeVNlcnZpY2UoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMpIHRocm93cyBFeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlU2VydmljZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOKTsKKwkJLy8gaWYgKHJlc3RSZXNwb25zZVNlcnZpY2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKXsKKwkJcmVzdFJlc3BvbnNlU2VydmljZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCk7CisJCS8vIH1lbHNlCisJCS8vIHJldHVybiByZXN0UmVzcG9uc2VTZXJ2aWNlOworCQlpZiAocmVzdFJlc3BvbnNlU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCXJlc3RSZXNwb25zZVNlcnZpY2UgPSBMaWZlY3ljbGVSZXN0VXRpbHMuY2hhbmdlU2VydmljZVN0YXRlKHNlcnZpY2VEZXRhaWxzLAorCQkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKSwgTGlmZUN5Y2xlU3RhdGVzRW51bS5TVEFSVENFUlRJRklDQVRJT04pOworCQl9IGVsc2UKKwkJCXJldHVybiByZXN0UmVzcG9uc2VTZXJ2aWNlOworCQlpZiAocmVzdFJlc3BvbnNlU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCVVzZXIgdGVzdGVyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5URVNURVIpOworCQkJcmVzdFJlc3BvbnNlU2VydmljZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlU3RhdGUoc2VydmljZURldGFpbHMsIHRlc3RlckRldGFpbHMsCisJCQkJCUxpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSk7CisJCQlpZiAocmVzdFJlc3BvbnNlU2VydmljZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKwkJCQlTdHJpbmcgbmV3VmVyc2lvbiA9IFJlc3BvbnNlUGFyc2VyLmdldFZlcnNpb25Gcm9tUmVzcG9uc2UocmVzdFJlc3BvbnNlU2VydmljZSk7CisJCQkJc2VydmljZURldGFpbHMuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKKwkJCQlzZXJ2aWNlRGV0YWlscy5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKTsKKwkJCQlzZXJ2aWNlRGV0YWlscy5zZXRMYXN0VXBkYXRlclVzZXJJZCh0ZXN0ZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJCQlzZXJ2aWNlRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHRlc3RlckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCQkJU3RyaW5nIHVuaXF1ZUlkRnJvbVJyZXNwb25zZSA9IFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlc3RSZXNwb25zZVNlcnZpY2UpOworCQkJCXNlcnZpY2VEZXRhaWxzLnNldFVuaXF1ZUlkKHVuaXF1ZUlkRnJvbVJyZXNwb25zZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3RSZXNwb25zZVNlcnZpY2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIF9jaGFuZ2VQcm9kdWN0U3RhdGUoUHJvZHVjdCBwcm9kdWN0LCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlMaWZlQ3ljbGVTdGF0ZXNFbnVtIExpZmVDeWNsZVN0YXRlc0VudW0sIFN0cmluZyBsaWZlY3ljbGVDaGFuZ2VJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ0hBTkdFX1BST0RVQ1RfTElGRUNZQ0xFX1NUQVRFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSwgTGlmZUN5Y2xlU3RhdGVzRW51bSk7CisJCVJlc3RSZXNwb25zZSBMaWZlQ3ljbGVTdGF0ZXNFbnVtU2VydmljZVJlc3BvbnNlID0gc2VuZFBvc3QodXJsLCBjcmVhdGVMaWZlY3ljbGVDb21tZW50SnNvbihsaWZlY3ljbGVDaGFuZ2VJbmZvKSwKKwkJCQlzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKworCQlyZXR1cm4gTGlmZUN5Y2xlU3RhdGVzRW51bVNlcnZpY2VSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVMaWZlY3ljbGVDb21tZW50SnNvbihTdHJpbmcgY29tbWVudENvbnRlbnQpIHsKKwkJU3RyaW5nIHJlcyA9IG51bGw7CisJCWlmIChjb21tZW50Q29udGVudCAhPSBudWxsKSB7CisJCQlyZXMgPSAie1widXNlclJlbWFya3NcIjogXCIiICsgY29tbWVudENvbnRlbnQgKyAiXCJ9IjsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0xDU19SZXNwb25zZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkJY2hlY2tTdGF0dXNDb2RlKHJlc3BvbnNlLCAiY2hhbmdlIGxpZmVjeWNsZSByZXF1ZXN0IGZhaWxlZCIsIGZhbHNlLCBTVEFUVVNfQ09ERV9TVUNDRVNTKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByZXBhcmVIZWFkZXJzTWFwKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJcmV0dXJuIGhlYWRlcnNNYXA7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2hhbmdlRGlzdHJpYnV0aW9uU3RhdHVzKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzLCBTdHJpbmcgdmVyc2lvbiwgVXNlciB1c2VyLAorCQkJU3RyaW5nIHVzZXJSZW1hcmtzLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtIHJlcURpc3RyaWJ1dGlvblN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1bmlxdWVJZCA9IHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJCWlmIChyZXFEaXN0cmlidXRpb25TdGF0dXMgPT0gRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQpIHsKKwkJCXJldHVybiBzZW5kQXBwcm92ZURpc3RyaWJ1dGlvbih1c2VyLCB1bmlxdWVJZCwgdXNlclJlbWFya3MpOworCQl9IGVsc2UgaWYgKHJlcURpc3RyaWJ1dGlvblN0YXR1cyA9PSBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9SRUpFQ1RFRCkgeworCQkJcmV0dXJuIHJlamVjdERpc3RyaWJ1dGlvbih1c2VyLCB1c2VyUmVtYXJrcywgdW5pcXVlSWQpOworCQl9IGVsc2UgaWYgKHJlcURpc3RyaWJ1dGlvblN0YXR1cyA9PSBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVEVEKSB7CisJCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCQkvLyBTdHJpbmcgdXJsID0KKwkJCS8vIFN0cmluZy5mb3JtYXQoImh0dHA6Ly8lczolcy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy90ZW1wVXJsVG9CZURlbGV0ZWQiLAorCQkJLy8gY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgdW5pcXVlSWQpOworCQkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5BQ1RJVkFURV9ESVNUUklCVVRJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJCXVuaXF1ZUlkLCAiUFJPRCIpOworCQkJcmV0dXJuIHNlbmREaXN0clN0YXRlKHVzZXIsIHVzZXJSZW1hcmtzLCB1cmwpOworCQl9IGVsc2UKKwkJCXJldHVybiBudWxsOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2Ugc2VuZEFwcHJvdmVEaXN0cmlidXRpb24oVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgdW5pcXVlSWQsIFN0cmluZyB1c2VyUmVtYXJrcykKKwkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkFQUFJPVkVfRElTVFJJQlVUSU9OLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCXVuaXF1ZUlkKTsKKwkJcmV0dXJuIHNlbmREaXN0clN0YXRlKHNkbmNNb2RpZmllckRldGFpbHMsIHVzZXJSZW1hcmtzLCB1cmwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHJlamVjdERpc3RyaWJ1dGlvbihTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlRGV0YWlscywgU3RyaW5nIHZlcnNpb24sIFVzZXIgdXNlciwKKwkJCVN0cmluZyB1c2VyUmVtYXJrcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiByZWplY3REaXN0cmlidXRpb24odXNlciwgdXNlclJlbWFya3MsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHJlamVjdERpc3RyaWJ1dGlvbihVc2VyIHVzZXIsIFN0cmluZyB1c2VyUmVtYXJrcywgU3RyaW5nIHVuaXF1ZUlkKQorCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuUkVKRUNUX0RJU1RSSUJVVElPTiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQl1bmlxdWVJZCk7CisJCXJldHVybiBzZW5kRGlzdHJTdGF0ZSh1c2VyLCB1c2VyUmVtYXJrcywgdXJsKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2Ugc2VuZERpc3RyU3RhdGUoVXNlciB1c2VyLCBTdHJpbmcgdXNlclJlbWFya3MsIFN0cmluZyB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXIpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJSZW1hcmtzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCXVzZXJSZW1hcmtzTWFwLnB1dCgidXNlclJlbWFya3MiLCB1c2VyUmVtYXJrcyk7CisKKwkJU3RyaW5nIHNlcnZpY2VCb2R5SnNvbiA9IG5ldyBKU09OT2JqZWN0KCkudG9KU09OU3RyaW5nKHVzZXJSZW1hcmtzTWFwKTsKKworCQlIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlsb2dnZXIuZGVidWcodXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgc2VydmljZToge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlNlcnZpY2UgYm9keToge30iLCBzZXJ2aWNlQm9keUpzb24pOworCQlsb2dnZXIuZGVidWcoIlNlcnZpY2UgaGVhZGVyczoge30iLCBoZWFkZXJzTWFwKTsKKwkJUmVzdFJlc3BvbnNlIHJlamVjdERpc3RyaWJ1dGlvblJlc3BvbnNlID0gaHR0cFJlcXVlc3QuaHR0cFNlbmRQb3N0KHVybCwgc2VydmljZUJvZHlKc29uLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gcmVqZWN0RGlzdHJpYnV0aW9uUmVzcG9uc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Qcm9kdWN0UmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Qcm9kdWN0UmVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MTdlZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L1Byb2R1Y3RSZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLlVybHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvZHVjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIFByb2R1Y3RSZXN0VXRpbHMgZXh0ZW5kcyBCYXNlUmVzdFV0aWxzIHsKKwlwcml2YXRlIHN0YXRpYyBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9kdWN0UmVzdFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVQcm9kdWN0KFByb2R1Y3RSZXFEZXRhaWxzIHByb2R1Y3QsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfUFJPRFVDVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCVN0cmluZyBzZXJ2aWNlQm9keUpzb24gPSBnc29uLnRvSnNvbihwcm9kdWN0KTsKKworCQlsb2dnZXIuZGVidWcoIlNlbmQgUE9TVCByZXF1ZXN0IHRvIGNyZWF0ZSBzZXJ2aWNlOiB7fSIsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VydmljZSBib2R5OiB7fSIsIHNlcnZpY2VCb2R5SnNvbik7CisKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IHNlbmRQb3N0KHVybCwgc2VydmljZUJvZHlKc29uLCB1c2VyLmdldFVzZXJJZCgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJaWYgKHJlcy5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlwcm9kdWN0LnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlcykpOworCQkJcHJvZHVjdC5zZXRWZXJzaW9uKFJlc3BvbnNlUGFyc2VyLmdldFZlcnNpb25Gcm9tUmVzcG9uc2UocmVzKSk7CisJCQlwcm9kdWN0LnNldFVVSUQoUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShyZXMpKTsKKwkJCS8vIENyZWF0b3IgZGV0YWlscyBuZXZlciBjaGFuZ2UgYWZ0ZXIgY29tcG9uZW50IGlzIGNyZWF0ZWQgLSBFbGxhLAorCQkJLy8gMTIvMS8yMDE2CisJCQlwcm9kdWN0LnNldENyZWF0b3JVc2VySWQodXNlci5nZXRVc2VySWQoKSk7CisJCQlwcm9kdWN0LnNldENyZWF0b3JGdWxsTmFtZSh1c2VyLmdldEZ1bGxOYW1lKCkpOworCQkJcHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHVzZXIuZ2V0RnVsbE5hbWUoKSk7CisJCQlwcm9kdWN0LnNldExhc3RVcGRhdGVyVXNlcklkKHVzZXIuZ2V0VXNlcklkKCkpOworCQkJcHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHVzZXIuZ2V0RnVsbE5hbWUoKSk7CisJCQlwcm9kdWN0LnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJCXByb2R1Y3Quc2V0VmVyc2lvbigiMC4xIik7CisJCQlTdHJpbmcgbGFzdFVwZGF0ZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXMuZ2V0UmVzcG9uc2UoKSwgImxhc3RVcGRhdGVEYXRlIik7CisJCQlwcm9kdWN0LnNldExhc3RVcGRhdGVEYXRlKExvbmcucGFyc2VMb25nKGxhc3RVcGRhdGUsIDEwKSk7CisJCQlwcm9kdWN0LnNldENyZWF0aW9uRGF0ZShMb25nLnBhcnNlTG9uZyhsYXN0VXBkYXRlLCAxMCkpOworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlUHJvZHVjdChQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0LCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX1BST0RVQ1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJcHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJU3RyaW5nIHNlcnZpY2VCb2R5SnNvbiA9IGdzb24udG9Kc29uKHByb2R1Y3QpOworCisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBQT1NUIHJlcXVlc3QgdG8gY3JlYXRlIHNlcnZpY2U6IHt9IiwgdXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZXJ2aWNlIGJvZHk6IHt9Iiwgc2VydmljZUJvZHlKc29uKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzID0gc2VuZFB1dCh1cmwsIHNlcnZpY2VCb2R5SnNvbiwgdXNlci5nZXRVc2VySWQoKSwgYWNjZXB0SGVhZGVyRGF0YSk7CisJCWlmIChyZXMuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfQ1JFQVRFRCkgeworCQkJcHJvZHVjdC5zZXRVbmlxdWVJZChSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShyZXMpKTsKKwkJCXByb2R1Y3Quc2V0VmVyc2lvbihSZXNwb25zZVBhcnNlci5nZXRWZXJzaW9uRnJvbVJlc3BvbnNlKHJlcykpOworCQkJcHJvZHVjdC5zZXRVVUlEKFJlc3BvbnNlUGFyc2VyLmdldFV1aWRGcm9tUmVzcG9uc2UocmVzKSk7CisJCQkvLyBDcmVhdG9yIGRldGFpbHMgbmV2ZXIgY2hhbmdlIGFmdGVyIGNvbXBvbmVudCBpcyBjcmVhdGVkIC0gRWxsYSwKKwkJCS8vIDEyLzEvMjAxNgorCQkJcHJvZHVjdC5zZXRDcmVhdG9yVXNlcklkKHVzZXIuZ2V0VXNlcklkKCkpOworCQkJcHJvZHVjdC5zZXRDcmVhdG9yRnVsbE5hbWUodXNlci5nZXRGdWxsTmFtZSgpKTsKKwkJCXByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSh1c2VyLmdldEZ1bGxOYW1lKCkpOworCQkJcHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJCXByb2R1Y3Quc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSh1c2VyLmdldEZ1bGxOYW1lKCkpOworCQkJcHJvZHVjdC5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCQlTdHJpbmcgdmFsdWVGcm9tSnNvblJlc3BvbnNlID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHJlcy5nZXRSZXNwb25zZSgpLCAidmVyc2lvbiIpOworCQkJcHJvZHVjdC5zZXRWZXJzaW9uKHZhbHVlRnJvbUpzb25SZXNwb25zZSk7CisJCQlTdHJpbmcgbGFzdFVwZGF0ZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXMuZ2V0UmVzcG9uc2UoKSwgImxhc3RVcGRhdGVEYXRlIik7CisJCQlwcm9kdWN0LnNldExhc3RVcGRhdGVEYXRlKExvbmcucGFyc2VMb25nKGxhc3RVcGRhdGUsIDEwKSk7CisJCQlwcm9kdWN0LnNldENyZWF0aW9uRGF0ZShMb25nLnBhcnNlTG9uZyhsYXN0VXBkYXRlLCAxMCkpOworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlUHJvZHVjdF9JbnZhbGlkX0pzb24oU3RyaW5nIHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfUFJPRFVDVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IHNlbmRQb3N0KHVybCwgImt1a3VtdWt1IiwgdXNlcklkLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVQcm9kdWN0KFN0cmluZyBpZCwgU3RyaW5nIHVzZXJJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX1BST0RVQ1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIGlkKTsKKwkJcmV0dXJuIHNlbmREZWxldGUodXJsLCB1c2VySWQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QoU3RyaW5nIHByb2R1Y3RJZCwgU3RyaW5nIHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9QUk9EVUNULCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBwcm9kdWN0SWQpOworCQlsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gZ2V0IHByb2R1Y3Q6IHt9IiwgdXJsKTsKKworCQlyZXR1cm4gc2VuZEdldCh1cmwsIHVzZXJJZCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0Rm9sbG93ZWQoU3RyaW5nIHVzZXJJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfRk9MTFdFRF9MSVNULCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIEdFVCByZXF1ZXN0IHRvIGdldCB1c2VyIGZvbGxvd2VkIHBhZ2U6IHt9IiwgdXJsKTsKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCB1c2VySWQpOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2hhbmdlUHJvZHVjdExpZmVDeWNsZShQcm9kdWN0IHByb2R1Y3QsIFVzZXIgdXNlck1vZGlmaWVyLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtIGxpZmVDeWNsZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAibXkgY29tbWVudCI7CisJCVJlc3RSZXNwb25zZSBjaGFuZ2VMaWZlQ3ljbGVSZXNwb25zZSA9IExpZmVjeWNsZVJlc3RVdGlscy5jaGFuZ2VQcm9kdWN0U3RhdGUocHJvZHVjdCwgdXNlck1vZGlmaWVyLCBsaWZlQ3ljbGUsCisJCQkJY2hlY2tpbkNvbW1lbnQpOworCQlpZiAoY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gU1RBVFVTX0NPREVfU1VDQ0VTUykgeworCQkJcHJvZHVjdC5zZXRMYXN0VXBkYXRlclVzZXJJZCh1c2VyTW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQkJcHJvZHVjdC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKHVzZXJNb2RpZmllci5nZXRGdWxsTmFtZSgpKTsKKwkJCVN0cmluZyBsYXRlc3RWZXJzaW9uID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoYW5nZUxpZmVDeWNsZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksCisJCQkJCSJ2ZXJzaW9uIik7CisJCQlwcm9kdWN0LnNldFZlcnNpb24obGF0ZXN0VmVyc2lvbik7CisJCQlTdHJpbmcgbGlmZWN5Y2xlU3RhdGUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkJImxpZmVjeWNsZVN0YXRlIik7CisJCQlwcm9kdWN0LnNldExpZmVjeWNsZVN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0udmFsdWVPZihsaWZlY3ljbGVTdGF0ZSkpKTsKKwkJCVN0cmluZyB1bmlxdWVJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjaGFuZ2VMaWZlQ3ljbGVSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCQkidW5pcXVlSWQiKTsKKwkJCXByb2R1Y3Quc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCQkJU3RyaW5nIGxhc3RVcGRhdGUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoY2hhbmdlTGlmZUN5Y2xlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkJImxhc3RVcGRhdGVEYXRlIik7CisJCQlwcm9kdWN0LnNldExhc3RVcGRhdGVEYXRlKChMb25nLnBhcnNlTG9uZyhsYXN0VXBkYXRlLCAxMCkpKTsKKwkJCVN0cmluZyB1dWlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNoYW5nZUxpZmVDeWNsZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJ1dWlkIik7CisJCQlwcm9kdWN0LnNldFVVSUQodXVpZCk7CisJCX0KKwkJcmV0dXJuIGNoYW5nZUxpZmVDeWNsZVJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb24oU3RyaW5nIGNvbXBvbmVudFVuaXF1ZUlkLAorCQkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBTdHJpbmcgc2VydmljZVVuaXF1ZUlkLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyByZXNvdXJjZVVpZCA9ICgie1wiY29tcG9uZW50VWlkXCI6XCIiICsgc2VydmljZVVuaXF1ZUlkICsgIlwifSIpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkNIQU5HRV9fUkVTT1VSQ0VfSU5TVEFOQ0VfVkVSU0lPTiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUoY29tcG9uZW50VHlwZSksIGNvbXBvbmVudFVuaXF1ZUlkLAorCQkJCXNlcnZpY2VJbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkKTsKKwkJUmVzdFJlc3BvbnNlIGNoYW5nZVJlc291cmNlSW5zdGFuY2VWZXJzaW9uID0gc2VuZFBvc3QodXJsLCByZXNvdXJjZVVpZCwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSwKKwkJCQlhY2NlcHRIZWFkZXJEYXRhKTsKKwkJcmV0dXJuIGNoYW5nZVJlc291cmNlSW5zdGFuY2VWZXJzaW9uOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdEJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIHByb2R1Y3ROYW1lLCBTdHJpbmcgcHJvZHVjdFZlcnNpb24sIFN0cmluZyB1c2VySWQpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9QUk9EVUNUX0JZX05BTUVfQU5EX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcHJvZHVjdE5hbWUsIHByb2R1Y3RWZXJzaW9uKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIEdFVCByZXF1ZXN0IHRvIGdldCBwcm9kdWN0IGJ5IG5hbWUgYW5kIHZlcnNpb246IHt9IiwgdXJsKTsKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCB1c2VySWQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvUHJvcGVydHlSZXN0VXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L1Byb3BlcnR5UmVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmZjVlYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L1Byb3BlcnR5UmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwzMTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVJlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9wZXJ0eVJlc3RVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlUHJvcGVydHkoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBib2R5LCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1BST1BFUlRZLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCXJlc291cmNlSWQpOworCisJCXJldHVybiBzZW5kUG9zdCh1cmwsIGJvZHksIHVzZXIuZ2V0VXNlcklkKCksIGFjY2VwdEhlYWRlckRhdGEpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZVByb3BlcnR5KFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcHJvcGVydHlJZCwgU3RyaW5nIGJvZHksIFVzZXIgdXNlcikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUFJPUEVSVFksIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJcmVzb3VyY2VJZCwgcHJvcGVydHlJZCk7CisJCXJldHVybiBzZW5kUHV0KHVybCwgYm9keSwgdXNlci5nZXRVc2VySWQoKSwgYWNjZXB0SGVhZGVyRGF0YSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0UHJvcGVydHkoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBwcm9wZXJ0eUlkLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gQ29uZmlnLmluc3RhbmNlKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1BST1BFUlRZLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZUlkLAorCQkJCXByb3BlcnR5SWQpOworCQlyZXR1cm4gc2VuZEdldCh1cmwsIHVzZXIuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVByb3BlcnR5KFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcHJvcGVydHlJZCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IENvbmZpZy5pbnN0YW5jZSgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRFTEVURV9QUk9QRVJUWSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlyZXNvdXJjZUlkLCBwcm9wZXJ0eUlkKTsKKworCQlyZXR1cm4gc2VuZERlbGV0ZSh1cmwsIHVzZXIuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBnZXRQcm9wRnJvbUxpc3RCeVByb3BOYW1lQW5kVHlwZShMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BMaXN0LAorCQkJU3RyaW5nIHByb3BOYW1lVG9VcGRhdGUsIFN0cmluZyBwcm9wVHlwZVRvVXBkYXRlKSB7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IDogcHJvcExpc3QpIHsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMocHJvcE5hbWVUb1VwZGF0ZSkKKwkJCQkJJiYgY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eS5nZXRUeXBlKCkuZXF1YWxzKHByb3BUeXBlVG9VcGRhdGUpKSB7CisJCQkJcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGdldFByb3BGcm9tTGlzdEJ5UHJvcE5hbWVUeXBlQW5kUGF0aCgKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcExpc3QsIFN0cmluZyBwcm9wTmFtZVRvVXBkYXRlLCBTdHJpbmcgcHJvcFR5cGVUb1VwZGF0ZSwKKwkJCUxpc3Q8U3RyaW5nPiBwYXRoKSB7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IDogcHJvcExpc3QpIHsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LmdldFBhdGgoKSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGdldFByb3BGcm9tTGlzdEJ5UHJvcE5hbWVBbmRUeXBlKHByb3BMaXN0LCBwcm9wTmFtZVRvVXBkYXRlLCBwcm9wVHlwZVRvVXBkYXRlKTsKKwkJCX0KKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMocHJvcE5hbWVUb1VwZGF0ZSkKKwkJCQkJJiYgY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eS5nZXRUeXBlKCkuZXF1YWxzKHByb3BUeXBlVG9VcGRhdGUpCisJCQkJCSYmIHBhdGguY29udGFpbnNBbGwoY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eS5nZXRQYXRoKCkpKSB7CisJCQkJcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGdldFByb3BGcm9tTGlzdEJ5UHJvcElkQW5kUGF0aChMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BMaXN0LAorCQkJU3RyaW5nIHByb3BJZCwgTGlzdDxTdHJpbmc+IHBhdGgpIHsKKworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSA6IHByb3BMaXN0KSB7CisJCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMocHJvcElkKQorCQkJCQkJJiYgY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eS5nZXRQYXRoKCkuZXF1YWxzKHBhdGgpKSB7CisJCQkJCXJldHVybiBjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMocHJvcElkKSkgeworCQkJCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbXBhcmVQcm9wZXJ0eUxpc3RzKExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gZXhwZWN0ZWRMaXN0LAorCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBhY3R1YWxMaXN0LCBCb29sZWFuIGlzVXBkYXRlKSB7CisKKwkJYXNzZXJ0VHJ1ZSgKKwkJCQkibGlzdCBzaXplIGFyZSBub3QgZXF1YWxzLCBleHBlY3RlZCBzaXplIGlzOiAiICsgZXhwZWN0ZWRMaXN0LnNpemUoKSArICIgLGFjdHVhbDogIiArIGFjdHVhbExpc3Quc2l6ZSgpLAorCQkJCWV4cGVjdGVkTGlzdC5zaXplKCkgPT0gYWN0dWFsTGlzdC5zaXplKCkpOworCQlCb29sZWFuIGZsYWcgPSBmYWxzZTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGV4cGVjdGVkY29tcEluc3RQcm9wIDogZXhwZWN0ZWRMaXN0KSB7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgYWN0dWFsY29tcEluc3RQcm9wIDogYWN0dWFsTGlzdCkgeworCQkJCWZsYWcgPSBjb21wYXJlUHJvcGVydHlPYmplY3RzKGV4cGVjdGVkY29tcEluc3RQcm9wLCBhY3R1YWxjb21wSW5zdFByb3AsIGlzVXBkYXRlKTsKKwkJCQlpZiAoZmxhZykgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJleHBlY3RlZDogIiArIGV4cGVjdGVkTGlzdCArICIsIGFjdHVhbDogIiArCisJCS8vIGFjdHVhbExpc3QpOworCQlsb2dnZXIuZGVidWcoImV4cGVjdGVkOiB7fSwgYWN0dWFsOiB7fSIsIGV4cGVjdGVkTGlzdCwgYWN0dWFsTGlzdCk7CisJCWFzc2VydFRydWUoImFjdHVhbCBsaXN0cyBkb2VzIG5vdCBjb250YWluIGFsbCB1bmlxZUlkcyIsIGZsYWcpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBjb21wYXJlUHJvcGVydHlPYmplY3RzKENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgZXhwZWN0ZWRDb21wSW5zdFByb3AsCisJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGFjdHVhbENvbXBJbnN0UHJvcCwgQm9vbGVhbiBpc1VwZGF0ZSkgeworCQlTdHJpbmcgdW5pcXVlSWQgPSBleHBlY3RlZENvbXBJbnN0UHJvcC5nZXRVbmlxdWVJZCgpOworCQlTdHJpbmcgdHlwZSA9IGV4cGVjdGVkQ29tcEluc3RQcm9wLmdldFR5cGUoKTsKKwkJU3RyaW5nIGRlZmF1bFZhbHVlID0gZXhwZWN0ZWRDb21wSW5zdFByb3AuZ2V0RGVmYXVsdFZhbHVlKCk7CisJCWlmIChhY3R1YWxDb21wSW5zdFByb3AuZ2V0VW5pcXVlSWQoKS5lcXVhbHModW5pcXVlSWQpCisJCQkJJiYgYWN0dWFsQ29tcEluc3RQcm9wLmdldFBhdGgoKS5lcXVhbHMoZXhwZWN0ZWRDb21wSW5zdFByb3AuZ2V0UGF0aCgpKSkgeworCQkJYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgdHlwZSBpczogIiArIHR5cGUgKyAiICxhY3R1YWw6ICIgKyBhY3R1YWxDb21wSW5zdFByb3AuZ2V0VHlwZSgpLAorCQkJCQlhY3R1YWxDb21wSW5zdFByb3AuZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSk7CisJCQlpZiAoZGVmYXVsVmFsdWUgPT0gbnVsbCkgeworCQkJCWFzc2VydFRydWUoCisJCQkJCQkiZXhwZWN0ZWQgZGVmYXVsVmFsdWUgaXM6ICIgKyBkZWZhdWxWYWx1ZSArICIgLGFjdHVhbDogIiArIGFjdHVhbENvbXBJbnN0UHJvcC5nZXREZWZhdWx0VmFsdWUoKSwKKwkJCQkJCWFjdHVhbENvbXBJbnN0UHJvcC5nZXREZWZhdWx0VmFsdWUoKSA9PSBkZWZhdWxWYWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCWFzc2VydFRydWUoCisJCQkJCQkiZXhwZWN0ZWQgZGVmYXVsVmFsdWUgaXM6ICIgKyBkZWZhdWxWYWx1ZSArICIgLGFjdHVhbDogIiArIGFjdHVhbENvbXBJbnN0UHJvcC5nZXREZWZhdWx0VmFsdWUoKSwKKwkJCQkJCWFjdHVhbENvbXBJbnN0UHJvcC5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoZGVmYXVsVmFsdWUpKTsKKwkJCX0KKwkJCWlmIChpc1VwZGF0ZSkgeworCQkJCWFzc2VydFRydWUoCisJCQkJCQkiYWN0dWFsIFtWYWx1ZV0gcGFyYW1ldGVyICIgKyBhY3R1YWxDb21wSW5zdFByb3AuZ2V0TmFtZSgpCisJCQkJCQkJCSsgInNob3VsZCBlcXVhbCB0byBleHBlY3RlZCBbVmFsdWVdOiAiICsgYWN0dWFsQ29tcEluc3RQcm9wLmdldFZhbHVlKCkgKyAiICxWYWx1ZTogIgorCQkJCQkJCQkrIGFjdHVhbENvbXBJbnN0UHJvcC5nZXRWYWx1ZSgpLAorCQkJCQkJYWN0dWFsQ29tcEluc3RQcm9wLmdldFZhbHVlKCkuZXF1YWxzKGV4cGVjdGVkQ29tcEluc3RQcm9wLmdldFZhbHVlKCkpKTsKKwkJCQlhc3NlcnROb3ROdWxsKCJ2YWx1ZUlkIGlzIG51bGwiLCBhY3R1YWxDb21wSW5zdFByb3AuZ2V0VmFsdWVVbmlxdWVVaWQoKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChkZWZhdWxWYWx1ZSA9PSBudWxsKSB7CisJCQkJCWFzc2VydFRydWUoCisJCQkJCQkJImFjdHVhbCBbVmFsdWVdIHBhcmFtZXRlciAiICsgYWN0dWFsQ29tcEluc3RQcm9wLmdldE5hbWUoKQorCQkJCQkJCQkJKyAic2hvdWxkIGVxdWFsIHRvIGV4cGVjdGVkIFtkZWZhdWx0VmFsdWVdOiAiICsgYWN0dWFsQ29tcEluc3RQcm9wLmdldFZhbHVlKCkKKwkJCQkJCQkJCSsgIiAsZGVmYXVsdFZhbHVlOiAiICsgYWN0dWFsQ29tcEluc3RQcm9wLmdldERlZmF1bHRWYWx1ZSgpLAorCQkJCQkJCWFjdHVhbENvbXBJbnN0UHJvcC5nZXRWYWx1ZSgpID09IGV4cGVjdGVkQ29tcEluc3RQcm9wLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhc3NlcnRUcnVlKAorCQkJCQkJCSJhY3R1YWwgW1ZhbHVlXSBwYXJhbWV0ZXIgIiArIGFjdHVhbENvbXBJbnN0UHJvcC5nZXROYW1lKCkKKwkJCQkJCQkJCSsgInNob3VsZCBlcXVhbCB0byBleHBlY3RlZCBbZGVmYXVsdFZhbHVlXTogIiArIGFjdHVhbENvbXBJbnN0UHJvcC5nZXRWYWx1ZSgpCisJCQkJCQkJCQkrICIgLGRlZmF1bHRWYWx1ZTogIiArIGFjdHVhbENvbXBJbnN0UHJvcC5nZXREZWZhdWx0VmFsdWUoKSwKKwkJCQkJCQlhY3R1YWxDb21wSW5zdFByb3AuZ2V0VmFsdWUoKS5lcXVhbHMoZXhwZWN0ZWRDb21wSW5zdFByb3AuZ2V0RGVmYXVsdFZhbHVlKCkpKTsKKwkJCQl9CisJCQkJYXNzZXJ0TnVsbCgidmFsdWVJZCBpcyBub3QgbnVsbCIsIGFjdHVhbENvbXBJbnN0UHJvcC5nZXRWYWx1ZVVuaXF1ZVVpZCgpKTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gYWRkUmVzb3VyY2VQcm9wZXJ0aWVzVG9MaXN0KFJlc291cmNlIHJlc291cmNlLAorCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBsaXN0VG9GaWxsKSB7CisJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3AgOiByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkpIHsKKwkJCWxpc3RUb0ZpbGwuYWRkKG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KHByb3AsIG51bGwsIG51bGwpKTsKKwkJfQorCQlyZXR1cm4gbGlzdFRvRmlsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3QoQ29tcG9uZW50IGNvbXBvbmVudCwKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gbGlzdFRvRmlsbCwgU3RyaW5nIGNvbXBvbmVudElkKSB7CisKKwkJaWYgKGNvbXBvbmVudElkICE9IG51bGwpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gbGlzdCA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKCkuZ2V0KGNvbXBvbmVudElkKTsKKwkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wIDogbGlzdCkgeworCQkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KHByb3AsIG51bGwsIG51bGwpOworCQkJCWNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuc2V0UGF0aChwcm9wLmdldFBhdGgoKSk7CisJCQkJY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZVVuaXF1ZVVpZChwcm9wLmdldFZhbHVlVW5pcXVlVWlkKCkpOworCQkJCWNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWUocHJvcC5nZXRWYWx1ZSgpKTsKKwkJCQlsaXN0VG9GaWxsLmFkZChjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCU1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4+IGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPSBjb21wb25lbnQKKwkJCQkJLmdldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMoKTsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0aWVzIDogY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcworCQkJCQkuZW50cnlTZXQoKSkgeworCQkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wIDogY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0aWVzLmdldFZhbHVlKCkpIHsKKwkJCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5ID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkocHJvcCwgbnVsbCwKKwkJCQkJCQludWxsKTsKKwkJCQkJY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXRoKHByb3AuZ2V0UGF0aCgpKTsKKwkJCQkJY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZVVuaXF1ZVVpZChwcm9wLmdldFZhbHVlVW5pcXVlVWlkKCkpOworCQkJCQljb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlKHByb3AuZ2V0VmFsdWUoKSk7CisJCQkJCWxpc3RUb0ZpbGwuYWRkKGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZhbHVlKCkuZXF1YWxzKCJSZXNvdXJjZSIpKSB7CisJCQlmb3IgKFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wIDogKChSZXNvdXJjZSkgY29tcG9uZW50KS5nZXRQcm9wZXJ0aWVzKCkpIHsKKwkJCQlsaXN0VG9GaWxsLmFkZChuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eShwcm9wLCBudWxsLCBudWxsKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxpc3RUb0ZpbGw7CisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGdldENvbXBQcm9wSW5zdExpc3RCeUluc3RJZEFuZFByb3BOYW1lKENvbXBvbmVudCBjb21wb25lbnQsCisJCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZURldGFpbHMsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgeworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BMaXN0ID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMoKQorCQkJCS5nZXQoY29tcG9uZW50SW5zdGFuY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQlpZiAocHJvcExpc3QgIT0gbnVsbCkgeworCQkJcmV0dXJuIGdldFByb3BGcm9tTGlzdEJ5UHJvcE5hbWVBbmRUeXBlKHByb3BMaXN0LCBuYW1lLCB0eXBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoUGFyYW1ldGVyKFJlc291cmNlIHJlc291cmNlLCBMaXN0PFN0cmluZz4gcGF0aCwKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gZXhwZWN0ZWRQcm9wZXJ0eUxpc3QpIHsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnR5TGlzdCA9IHJlc291cmNlLmdldFByb3BlcnRpZXMoKTsKKwkJZm9yIChQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uIDogcHJvcGVydHlMaXN0KSB7CisJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BEZXRhaWxzVG9SZW1vdmUgPSBQcm9wZXJ0eVJlc3RVdGlscy5nZXRQcm9wRnJvbUxpc3RCeVByb3BOYW1lQW5kVHlwZSgKKwkJCQkJZXhwZWN0ZWRQcm9wZXJ0eUxpc3QsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wRGV0YWlsc1RvQWRkID0gcHJvcERldGFpbHNUb1JlbW92ZTsKKwkJCXByb3BEZXRhaWxzVG9BZGQuc2V0UGF0aChwYXRoKTsKKwkJCWV4cGVjdGVkUHJvcGVydHlMaXN0LnJlbW92ZShwcm9wRGV0YWlsc1RvUmVtb3ZlKTsKKwkJCWV4cGVjdGVkUHJvcGVydHlMaXN0LmFkZChwcm9wRGV0YWlsc1RvQWRkKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlUHJvcGVydHlMaXN0V2l0aFBhdGhQYXJhbWV0ZXJPbkNvbXBJbnN0KFNlcnZpY2Ugc2VydmljZSwgTGlzdDxTdHJpbmc+IHBhdGgsCisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGV4cGVjdGVkUHJvcGVydHlMaXN0KSB7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gc2VydmljZVByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlzZXJ2aWNlUHJvcGVydHlMaXN0ID0gUHJvcGVydHlSZXN0VXRpbHMuYWRkQ29tcG9uZW50SW5zdFByb3BlcnRpZXNUb0xpc3Qoc2VydmljZSwgc2VydmljZVByb3BlcnR5TGlzdCwKKwkJCQlwYXRoLmdldCgwKSk7CisKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHNlcnZpY2VDb21wSW5zdFByb3BlcnR5IDogc2VydmljZVByb3BlcnR5TGlzdCkgeworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wRGV0YWlsc1RvUmVtb3ZlID0gUHJvcGVydHlSZXN0VXRpbHMuZ2V0UHJvcEZyb21MaXN0QnlQcm9wTmFtZVR5cGVBbmRQYXRoKAorCQkJCQlleHBlY3RlZFByb3BlcnR5TGlzdCwgc2VydmljZUNvbXBJbnN0UHJvcGVydHkuZ2V0TmFtZSgpLCBzZXJ2aWNlQ29tcEluc3RQcm9wZXJ0eS5nZXRUeXBlKCksCisJCQkJCXNlcnZpY2VDb21wSW5zdFByb3BlcnR5LmdldFBhdGgoKSk7CisJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BEZXRhaWxzVG9BZGQgPSBwcm9wRGV0YWlsc1RvUmVtb3ZlOworCQkJTGlzdDxTdHJpbmc+IHRlbXBQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZm9yIChTdHJpbmcgdGVtcFBhdGggOiBwYXRoKSB7CisJCQkJdGVtcFBhdGhMaXN0LmFkZCh0ZW1wUGF0aCk7CisJCQl9CisJCQkvLyBwYXRoIHBhcmFtZXRlciBjYW4gbm90IGNvbnRhaW4gdGhlIHNhbWUgc2VydmljZSB1bmlxdWUgSUQgdHdpY2UKKwkJCWlmIChwcm9wRGV0YWlsc1RvQWRkLmdldFBhdGgoKSAhPSBudWxsCisJCQkJCSYmICFwcm9wRGV0YWlsc1RvQWRkLmdldFBhdGgoKS5nZXQoMCkuY29udGFpbnMoc2VydmljZS5nZXRVbmlxdWVJZCgpKSkgeworCQkJCWlmICghcHJvcERldGFpbHNUb0FkZC5nZXRQYXRoKCkuY29udGFpbnNBbGwodGVtcFBhdGhMaXN0KSkgeworCQkJCQl0ZW1wUGF0aExpc3QuYWRkQWxsKHByb3BEZXRhaWxzVG9BZGQuZ2V0UGF0aCgpKTsKKwkJCQl9CisJCQl9CisJCQlwcm9wRGV0YWlsc1RvQWRkLnNldFBhdGgodGVtcFBhdGhMaXN0KTsKKwkJCWV4cGVjdGVkUHJvcGVydHlMaXN0LnJlbW92ZShwcm9wRGV0YWlsc1RvUmVtb3ZlKTsKKwkJCWV4cGVjdGVkUHJvcGVydHlMaXN0LmFkZChwcm9wRGV0YWlsc1RvQWRkKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aE9uUmVzb3VyY2UoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdERldGFpbHMsIFJlc291cmNlIHJlc291cmNlLAorCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBsaXN0LCBDb21wb25lbnQgY29udGFpbmVyKSB7CisJCUxpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChjb250YWluZXIgIT0gbnVsbCkgeworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29udGFpbmVyLmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA6IGNvbXBvbmVudEluc3RhbmNlcykgeworCQkJCWlmIChjb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpLmVxdWFscyhjb21wb25lbnRJbnN0RGV0YWlscy5nZXROb3JtYWxpemVkTmFtZSgpKSkgeworCQkJCQlwYXRoLmFkZChjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCX0gZWxzZSB7CisJCQlwYXRoLmFkZChjb21wb25lbnRJbnN0RGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQl1cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aFBhcmFtZXRlcihyZXNvdXJjZSwgcGF0aCwgbGlzdCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVByb3BlcnR5TGlzdFdpdGhQYXRoT25Db21wb25lbnRJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0RGV0YWlscywKKwkJCVNlcnZpY2Ugc2VydmljZSwgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBsaXN0KSB7CisJCUxpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXBhdGguYWRkKGNvbXBvbmVudEluc3REZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworCQl1cGRhdGVQcm9wZXJ0eUxpc3RXaXRoUGF0aFBhcmFtZXRlck9uQ29tcEluc3Qoc2VydmljZSwgcGF0aCwgbGlzdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvUmVzb3VyY2VSZXN0VXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L1Jlc291cmNlUmVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmZmQyZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L1Jlc291cmNlUmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSw1NzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNsaWVudFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlbGF0aW9uc2hpcEluc3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuSW1wb3J0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR2VuZXJhbFV0aWxpdHk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VSZXN0VXRpbHMgZXh0ZW5kcyBCYXNlUmVzdFV0aWxzIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzb3VyY2VSZXN0VXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8vICoqKioqKiBDUkVBVEUgKioqKioqKgorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlTdHJpbmcgdXNlcklkID0gc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbihyZXNvdXJjZURldGFpbHMpOworCQlTdHJpbmcgY2FsY3VsYXRlTUQ1ID0gR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlTdHJpbmcodXNlckJvZHlKc29uKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ29udGVudF9NRDUuZ2V0VmFsdWUoKSwgY2FsY3VsYXRlTUQ1KTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXJsKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHVzZXJCb2R5SnNvbik7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCB1c2VyQm9keUpzb24sIGhlYWRlcnNNYXApOworCQlpZiAoY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlyZXNvdXJjZURldGFpbHMuc2V0VVVJRChSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpKTsKKwkJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKFJlc3BvbnNlUGFyc2VyLmdldFZlcnNpb25Gcm9tUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VSZXNwb25zZSkpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpKTsKKwkJCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJsYXN0VXBkYXRlclVzZXJJZCIpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKGxhc3RVcGRhdGVyVXNlcklkKTsKKwkJCVN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgImxhc3RVcGRhdGVyRnVsbE5hbWUiKTsKKwkJCXJlc291cmNlRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKGxhc3RVcGRhdGVyRnVsbE5hbWUpOworCQkJLy8gQ3JlYXRvciBkZXRhaWxzIG5ldmVyIGNoYW5nZSBhZnRlciBjb21wb25lbnQgaXMgY3JlYXRlZCAtIEVsbGEsCisJCQkvLyAxMi8xLzIwMTYKKwkJCXJlc291cmNlRGV0YWlscy5zZXRDcmVhdG9yVXNlcklkKHVzZXJJZCk7CisJCQlyZXNvdXJjZURldGFpbHMuc2V0Q3JlYXRvckZ1bGxOYW1lKHNkbmNNb2RpZmllckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVzcG9uc2U7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVJbXBvcnRSZXNvdXJjZShJbXBvcnRSZXFEZXRhaWxzIGltcG9ydFJlcURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycykgdGhyb3dzIEpTT05FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQ1JFQVRFX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIHJlc291cmNlSW1wb3J0Qm9keUpzb24gPSBnc29uLnRvSnNvbihpbXBvcnRSZXFEZXRhaWxzKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odXJsKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlSW1wb3J0Qm9keUpzb24pOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisJCWlmIChhZGRpdGlvbmFsSGVhZGVycyAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dEFsbChhZGRpdGlvbmFsSGVhZGVycyk7CisJCX0gZWxzZSB7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5Db250ZW50X01ENS5nZXRWYWx1ZSgpLCBBcnRpZmFjdFJlc3RVdGlscy5jYWxjdWxhdGVNRDUocmVzb3VyY2VJbXBvcnRCb2R5SnNvbikpOworCQl9CisKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlUmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHJlc291cmNlSW1wb3J0Qm9keUpzb24sIGhlYWRlcnNNYXApOworCQlpZiAoY3JlYXRlUmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlpbXBvcnRSZXFEZXRhaWxzLnNldFZlcnNpb24oUmVzcG9uc2VQYXJzZXIuZ2V0VmVyc2lvbkZyb21SZXNwb25zZShjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKSk7CisJCQlpbXBvcnRSZXFEZXRhaWxzLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpKTsKKwkJCS8vIENyZWF0b3IgZGV0YWlscyBuZXZlciBjaGFuZ2UgYWZ0ZXIgY29tcG9uZW50IGlzIGNyZWF0ZWQgLSBFbGxhLAorCQkJLy8gMTIvMS8yMDE2CisJCQlpbXBvcnRSZXFEZXRhaWxzLnNldENyZWF0b3JVc2VySWQodXNlcklkKTsKKwkJCWltcG9ydFJlcURldGFpbHMuc2V0Q3JlYXRvckZ1bGxOYW1lKHNkbmNNb2RpZmllckRldGFpbHMuZ2V0RnVsbE5hbWUoKSk7CisJCQlpbXBvcnRSZXFEZXRhaWxzLnNldFRvc2NhUmVzb3VyY2VOYW1lKFJlc3BvbnNlUGFyc2VyLmdldFRvc2NhUmVzb3VyY2VOYW1lRnJvbVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UpKTsKKwkJCWltcG9ydFJlcURldGFpbHMuc2V0RGVyaXZlZExpc3QoUmVzcG9uc2VQYXJzZXIuZ2V0RGVyaXZlZExpc3RGcm9tSnNvbihjcmVhdGVSZXNvdXJjZVJlc3BvbnNlKSk7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVzcG9uc2U7CisKKwl9CisKKwkvLyAqKioqKiBERUxFVEUgKioqKgorCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJaWYgKHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpICE9IG51bGwpIHsKKwkJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX1JFU09VUkNFX0JZX05BTUVfQU5EX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlRGV0YWlscy5nZXROYW1lKCksIHZlcnNpb24pOworCQkJcmV0dXJuIHNlbmREZWxldGUodXJsLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBtYXJrUmVzb3VyY2VUb0RlbGV0ZShTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHVzZXJJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuREVMRVRFX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZUlkKTsKKwkJUmVzdFJlc3BvbnNlIHNlbmREZWxldGUgPSBzZW5kRGVsZXRlKHVybCwgdXNlcklkKTsKKworCQlyZXR1cm4gc2VuZERlbGV0ZTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgdXNlcklkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQpOworCQlSZXN0UmVzcG9uc2Ugc2VuZERlbGV0ZSA9IHNlbmREZWxldGUodXJsLCB1c2VySWQpOworCisJCWRlbGV0ZU1hcmtlZFJlc291cmNlcyh1c2VySWQpOworCisJCXJldHVybiBzZW5kRGVsZXRlOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU1hcmtlZFJlc291cmNlcyhTdHJpbmcgdXNlcklkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgdXJsOworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCXVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfTUFSS0VEX1JFU09VUkNFUywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCXNlbmREZWxldGUodXJsLCB1c2VySWQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyByZXNvdXJjZU5hbWUsIFN0cmluZyByZXNvdXJjZVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfUkVTT1VSQ0VfQllfTkFNRV9BTkRfVkVSU0lPTiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgcmVzb3VyY2VOYW1lLCByZXNvdXJjZVZlcnNpb24pOworCQlSZXN0UmVzcG9uc2Ugc2VuZERlbGV0ZSA9IHNlbmREZWxldGUodXJsLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlkZWxldGVNYXJrZWRSZXNvdXJjZXMoc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJcmV0dXJuIHNlbmREZWxldGU7CisJfQorCisJcHVibGljIHN0YXRpYyBCb29sZWFuIGRlbGV0ZVJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5kZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKSwgcmVzb3VyY2VOYW1lLCByZXNvdXJjZVZlcnNpb24pOworCQlyZXR1cm4gY2hlY2tFcnJvckNvZGUoZGVsZXRlUmVzcG9uc2UpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiByZW1vdmVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VJZCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENsaWVudFByb3RvY29sRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZCwgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkFETUlOKS5nZXRVc2VySWQoKSk7CisJCXJldHVybiBjaGVja0Vycm9yQ29kZShyZXNwb25zZSk7CisJfQorCisJLy8gKioqKioqKioqKioqKiogR0VUICoqKioqKioqKioqKioKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZShVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyB1bmlxdWVJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1JFU09VUkNFLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCB1bmlxdWVJZCk7CisJCXJldHVybiBzZW5kR2V0KHVybCwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0TW9kdWxlKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgbW9kdWxlSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfTU9EVUxFX0JZX0lELCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjb21wb25lbnRJZCwgbW9kdWxlSWQpOworCQlyZXR1cm4gc2VuZEdldCh1cmwsIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldExhdGVzdFJlc291cmNlRnJvbUNzYXJVdWlkKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIGNzYXJVdWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfUkVTT1VSQ0VfQllfQ1NBUl9VVUlELCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBjc2FyVXVpZCk7CisJCXJldHVybiBzZW5kR2V0KHVybCwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIHJlc291cmNlVmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1JFU09VUkNFX0JZX05BTUVfQU5EX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlyZXR1cm4gc2VuZEdldCh1cmwsIHVzZXJJZCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VMaXN0KFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0ZPTExXRURfTElTVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldFJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkKSB0aHJvd3MgQ2xpZW50UHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFJlc291cmNlKEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTiksIHJlc291cmNlSWQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldExhdGVzdFJlc291cmNlRnJvbUNzYXJVdWlkKFN0cmluZyBjc2FyVXVpZCkgdGhyb3dzIENsaWVudFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRMYXRlc3RSZXNvdXJjZUZyb21Dc2FyVXVpZChFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pLCBjc2FyVXVpZCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2VMYXRlc3RWZXJzaW9uTGlzdChVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9SRVNPVVJDRV9sQVRFU1RfVkVSU0lPTiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHB1dEFsbENhdGVnb3JpZXNUb3dhcmRzQ2F0YWxvZ0ZlV2l0aFV1aWROb3RBbGxvd2VkKFN0cmluZyB1dWlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfQUxMX0NBVEVHT1JJRVNfRkUsIGNvbmZpZy5nZXRDYXRhbG9nRmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nRmVQb3J0KCksIEJhc2VSZXN0VXRpbHMuUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5YX0VDT01QX1JFUVVFU1RfSURfSEVBREVSLmdldFZhbHVlKCksIHV1aWQpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBVVCByZXF1ZXN0IHRvIGdldCBhbGwgY2F0ZWdvcmllcyAoc2hvdWxkIGJlIDQwNSk6IHt9IiwgdXJsKTsKKwkJcmV0dXJuIGh0dHAuaHR0cFNlbmRCeU1ldGhvZCh1cmwsICJQVVQiLCBudWxsLCBoZWFkZXJzTWFwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRBbGxUYWdzVG93YXJkc0NhdGFsb2dCZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9UQUdTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKworCQkvLyBsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gZ2V0IGFsbCB0YWdzOiB7fSIsIHVybCk7CisJCXJldHVybiBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRBbGxQcm9wZXJ0eVNjb3Blc1Rvd2FyZHNDYXRhbG9nQmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9QUk9QRVJUWV9TQ09QRVNfTElTVCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCAiY3MwMDA4Iik7CisKKwkJLy8gbG9nZ2VyLmRlYnVnKCJTZW5kIEdFVCByZXF1ZXN0IHRvIGdldCBhbGwgcHJvcGVydHkgc2NvcGVzOiB7fSIsIHVybCk7CisJCXJldHVybiBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRBbGxBcnRpZmFjdFR5cGVzVG93YXJkc0NhdGFsb2dCZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9BUlRJRkFDVFMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCAiY3MwMDA4Iik7CisKKwkJLy8gbG9nZ2VyLmRlYnVnKCJTZW5kIEdFVCByZXF1ZXN0IHRvIGdldCBhbGwgcHJvcGVydHkgc2NvcGVzOiB7fSIsIHVybCk7CisJCXJldHVybiBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRDb25maWd1cmF0aW9uVG93YXJkc0NhdGFsb2dCZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0NPTkZJR1VSQVRJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgImNzMDAwOCIpOworCisJCS8vIGxvZ2dlci5kZWJ1ZygiU2VuZCBHRVQgcmVxdWVzdCB0byBnZXQgYWxsIHByb3BlcnR5IHNjb3Blczoge30iLCB1cmwpOworCQlyZXR1cm4gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2Ugc2VuZE9wdGlvbnNUb3dhcmRzQ2F0YWxvZ0ZlV2l0aFV1aWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfQUxMX0NBVEVHT1JJRVNfRkUsIGNvbmZpZy5nZXRDYXRhbG9nRmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nRmVQb3J0KCksIEJhc2VSZXN0VXRpbHMuUkVTT1VSQ0VfQ09NUE9ORU5UX1RZUEUpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGEpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIE9QVElPTlMgcmVxdWVzdCBmb3IgY2F0ZWdvcmllczoge30iLCB1cmwpOworCQlyZXR1cm4gaHR0cC5odHRwU2VuZEJ5TWV0aG9kKHVybCwgIk9QVElPTlMiLCBudWxsLCBoZWFkZXJzTWFwKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFVQREFURSAqKioqKioqKioqKioqCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VNZXRhZGF0YShSZXNvdXJjZVJlcURldGFpbHMgdXBkYXRlZFJlc291cmNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgdW5pcXVlSWQsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUkVTT1VSQ0VfTUVUQURBVEEsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHVuaXF1ZUlkKTsKKworCQlTdHJpbmcgQ29udGVudFR5cGVTdHJpbmcgPSBTdHJpbmcuZm9ybWF0KCIlczslcyIsIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSwgZW5jb2RpbmcpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbih1cGRhdGVkUmVzb3VyY2VEZXRhaWxzKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisKKwkJUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlUmVzcG9uc2UgPSBzZW5kUHV0KHVybCwgdXNlckJvZHlKc29uLCB1c2VySWQsIENvbnRlbnRUeXBlU3RyaW5nKTsKKworCQl1cGRhdGVkUmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24oUmVzcG9uc2VQYXJzZXIuZ2V0VmVyc2lvbkZyb21SZXNwb25zZSh1cGRhdGVSZXNvdXJjZVJlc3BvbnNlKSk7CisJCXVwZGF0ZWRSZXNvdXJjZURldGFpbHMuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VSZXNwb25zZSkpOworCisJCXJldHVybiB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlVEVTVChSZXNvdXJjZSByZXNvdXJjZSwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgdW5pcXVlSWQsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUkVTT1VSQ0VfTUVUQURBVEEsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHVuaXF1ZUlkKTsKKworCQlTdHJpbmcgQ29udGVudFR5cGVTdHJpbmcgPSBTdHJpbmcuZm9ybWF0KCIlczslcyIsIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSwgZW5jb2RpbmcpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbihyZXNvdXJjZSk7CisJCVN0cmluZyB1c2VySWQgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlID0gc2VuZFB1dCh1cmwsIHVzZXJCb2R5SnNvbiwgdXNlcklkLCBDb250ZW50VHlwZVN0cmluZyk7CisJCXJldHVybiB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlTWV0YWRhdGEoUmVzb3VyY2VSZXFEZXRhaWxzIHVwZGF0ZWRSZXNvdXJjZURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHVuaXF1ZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHVwZGF0ZVJlc291cmNlTWV0YWRhdGEodXBkYXRlZFJlc291cmNlRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgdW5pcXVlSWQsICIiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZU1ldGFkYXRhKFN0cmluZyBqc29uLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyByZXNvdXJjZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX1JFU09VUkNFX01FVEFEQVRBLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByZXNvdXJjZUlkKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlID0gc2VuZFB1dCh1cmwsIGpzb24sIHVzZXJJZCwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJcmV0dXJuIHVwZGF0ZVJlc291cmNlUmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlUmVzb3VyY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgcmVzb3VyY2VJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfUkVTT1VSQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlSWQpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKHJlc291cmNlRGV0YWlscyk7CisJCVN0cmluZyBjYWxjdWxhdGVNRDUgPSBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeVN0cmluZyh1c2VyQm9keUpzb24pOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5Db250ZW50X01ENS5nZXRWYWx1ZSgpLCBjYWxjdWxhdGVNRDUpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSB1cGRhdGVSZXNvdXJjZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFB1dCh1cmwsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisJCWlmICh1cGRhdGVSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1VQREFURV9TVUNDRVNTKSB7CisJCQlyZXNvdXJjZURldGFpbHMuc2V0VVVJRChSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKHVwZGF0ZVJlc291cmNlUmVzcG9uc2UpKTsKKwkJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKFJlc3BvbnNlUGFyc2VyLmdldFZlcnNpb25Gcm9tUmVzcG9uc2UodXBkYXRlUmVzb3VyY2VSZXNwb25zZSkpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHVwZGF0ZVJlc291cmNlUmVzcG9uc2UpKTsKKwkJCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh1cGRhdGVSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCksICJsYXN0VXBkYXRlclVzZXJJZCIpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldExhc3RVcGRhdGVyVXNlcklkKGxhc3RVcGRhdGVyVXNlcklkKTsKKwkJCVN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHVwZGF0ZVJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgImxhc3RVcGRhdGVyRnVsbE5hbWUiKTsKKwkJCXJlc291cmNlRGV0YWlscy5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKGxhc3RVcGRhdGVyRnVsbE5hbWUpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldENyZWF0b3JVc2VySWQodXNlcklkKTsKKwkJCXJlc291cmNlRGV0YWlscy5zZXRDcmVhdG9yRnVsbE5hbWUoc2RuY01vZGlmaWVyRGV0YWlscy5nZXRGdWxsTmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2VSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMsIFVzZXIgbW9kaWZpZXIsIFN0cmluZyB2ZlJlc291cmNlVW5pcXVlSWQpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXRDb21wb25lbnRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGV0YWlscyk7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2UgPSBDb21wb25lbnRJbnN0YW5jZVJlc3RVdGlscy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgbW9kaWZpZXIsIHZmUmVzb3VyY2VVbmlxdWVJZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlSZXNvdXJjZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlSW5zdGFuY2VSZXNwb25zZSk7CisJCXJldHVybiBjcmVhdGVSZXNvdXJjZUluc3RhbmNlUmVzcG9uc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMoSlNPTk9iamVjdCBib2R5LCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgYm9keUpzb24gPSBnc29uLnRvSnNvbihib2R5KTsKKwkJY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQVNTT0NJQVRFX19SRVNPVVJDRV9JTlNUQU5DRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlyZXR1cm4gc2VuZFBvc3QodXJsLCBib2R5SnNvbiwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSwgbnVsbCk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRGb2xsb3dlZExpc3QoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9GT0xMV0VEX0xJU1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCQlyZXR1cm4gc2VuZEdldCh1cmwsIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxSZXNvdXJjZT4gcmVzdFJlc3BvbnNlVG9SZXNvdXJjZU9iamVjdExpc3QoU3RyaW5nIHJlc3RSZXNwb25zZSkgeworCQlKc29uRWxlbWVudCBqZWxlbWVudCA9IG5ldyBKc29uUGFyc2VyKCkucGFyc2UocmVzdFJlc3BvbnNlKTsKKwkJSnNvbkFycmF5IGpzb25BcnJheSA9IGplbGVtZW50LmdldEFzSnNvbkFycmF5KCk7CisJCUxpc3Q8UmVzb3VyY2U+IHJlc3RSZXNwb25zZUFycmF5ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqc29uQXJyYXkuc2l6ZSgpOyBpKyspIHsKKwkJCVN0cmluZyByZXNvdXJjZVN0cmluZyA9IChTdHJpbmcpIGpzb25BcnJheS5nZXQoaSkudG9TdHJpbmcoKTsKKwkJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VTdHJpbmcpOworCQkJcmVzdFJlc3BvbnNlQXJyYXkuYWRkKHJlc291cmNlKTsKKwkJfQorCisJCXJldHVybiByZXN0UmVzcG9uc2VBcnJheTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2VPYmplY3RGcm9tUmVzb3VyY2VMaXN0QnlVaWQoTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VMaXN0LCBTdHJpbmcgdWlkKSB7CisJCWlmIChyZXNvdXJjZUxpc3QgIT0gbnVsbCAmJiByZXNvdXJjZUxpc3Quc2l6ZSgpID4gMCkgeworCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlTGlzdCkgeworCQkJCWlmIChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLmVxdWFscyh1aWQpKQorCQkJCQlyZXR1cm4gcmVzb3VyY2U7CisJCQl9CisJCX0gZWxzZQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBudWxsOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXJlc291cmNlCisJLy8gYXNzb2NpYXRlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBhc3NvY2lhdGUyUmVzb3VyY2VJbnN0YW5jZXMoQ29tcG9uZW50IGNvbnRhaW5lciwgQ29tcG9uZW50SW5zdGFuY2UgZnJvbU5vZGUsIENvbXBvbmVudEluc3RhbmNlIHRvTm9kZSwgU3RyaW5nIGFzc29jVHlwZSwgVXNlciBzZG5jVXNlckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBhc3NvY2lhdGUyUmVzb3VyY2VJbnN0YW5jZXMoY29udGFpbmVyLCBmcm9tTm9kZS5nZXRVbmlxdWVJZCgpLCB0b05vZGUuZ2V0VW5pcXVlSWQoKSwgYXNzb2NUeXBlLCBzZG5jVXNlckRldGFpbHMpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGFzc29jaWF0ZTJSZXNvdXJjZUluc3RhbmNlcyhDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgZnJvbU5vZGUsIFN0cmluZyB0b05vZGUsIFN0cmluZyBhc3NvY1R5cGUsIFVzZXIgc2RuY1VzZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVJlbGF0aW9uc2hpcEluc3REYXRhIHJlbGF0aW9uc2hpcEluc3REYXRhID0gbmV3IFJlbGF0aW9uc2hpcEluc3REYXRhKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNNYXAgPSBjb21wb25lbnQuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRNYXAgPSBjb21wb25lbnQuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGllc0xpc3QgPSBjYXBhYmlsaXRpZXNNYXAuZ2V0KGFzc29jVHlwZSk7CisJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1aXJlbWVudExpc3QgPSByZXF1aXJlbWVudE1hcC5nZXQoYXNzb2NUeXBlKTsKKworCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxdWlyZW1lbnREZWZpbml0aW9uRnJvbSA9IGdldFJlcXVpcmVtZW50RGVmaW5pdGlvbkJ5T3duZXJJZChyZXF1aXJlbWVudExpc3QsIGZyb21Ob2RlKTsKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb25UbyA9IGdldENhcGFiaWxpdHlEZWZpbml0aW9uQnlPd25lcklkKGNhcGFiaWxpdGllc0xpc3QsIHRvTm9kZSk7CisJCXJlbGF0aW9uc2hpcEluc3REYXRhLnNldENhcGFiaWxpdHlPd25lcklkKGNhcGFiaWxpdHlEZWZpbml0aW9uVG8uZ2V0T3duZXJJZCgpKTsKKwkJcmVsYXRpb25zaGlwSW5zdERhdGEuc2V0Q2FwYWJpbHR5SWQoY2FwYWJpbGl0eURlZmluaXRpb25Uby5nZXRVbmlxdWVJZCgpKTsKKwkJcmVsYXRpb25zaGlwSW5zdERhdGEuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJlcXVpcmVtZW50RGVmaW5pdGlvbkZyb20uZ2V0T3duZXJJZCgpKTsKKwkJcmVsYXRpb25zaGlwSW5zdERhdGEuc2V0UmVxdWlyZW1lbnRJZChyZXF1aXJlbWVudERlZmluaXRpb25Gcm9tLmdldFVuaXF1ZUlkKCkpOworCisJCUpTT05PYmplY3QgYXNzb2NCb2R5ID0gYXNzb2NCdWlsZGVyKHJlbGF0aW9uc2hpcEluc3REYXRhLCBjYXBhYmlsaXR5RGVmaW5pdGlvblRvLCByZXF1aXJlbWVudERlZmluaXRpb25Gcm9tLCB0b05vZGUsIGZyb21Ob2RlKTsKKwkJcmV0dXJuIFJlc291cmNlUmVzdFV0aWxzLmFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKGFzc29jQm9keSwgc2RuY1VzZXJEZXRhaWxzLCBjb21wb25lbnQpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSlNPTk9iamVjdCBhc3NvY0J1aWxkZXIoUmVsYXRpb25zaGlwSW5zdERhdGEgcmVsYXRpb25zaGlwSW5zdERhdGEsIENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEZWZpbml0aW9uVG8sIFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZmluaXRpb25Gcm9tLCBTdHJpbmcgdG9Ob2RlLCBTdHJpbmcgZnJvbU5vZGUpIHsKKworCQlTdHJpbmcgdHlwZSA9IGNhcGFiaWxpdHlEZWZpbml0aW9uVG8uZ2V0VHlwZSgpOworCQlTdHJpbmcgcmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudERlZmluaXRpb25Gcm9tLmdldE5hbWUoKTsKKwkJU3RyaW5nIGNhcGFiaWxpdHkgPSByZXF1aXJlbWVudERlZmluaXRpb25Gcm9tLmdldE5hbWUoKTsKKworCQlKU09OT2JqZWN0IHdyYXBwZXIgPSBuZXcgSlNPTk9iamVjdCgpOworCQlKU09OQXJyYXkgcmVsYXRpb25zaGlwc0FycmF5ID0gbmV3IEpTT05BcnJheSgpOworCQlKU09OT2JqZWN0IHJlbGF0aW9uc2hpcCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCUpTT05PYmplY3Qgc2ltcGxlT2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKworCQlyZWxhdGlvbnNoaXAucHV0KCJ0eXBlIiwgdHlwZSk7CisJCXNpbXBsZU9iamVjdC5wdXQoInJlbGF0aW9uc2hpcCIsIHJlbGF0aW9uc2hpcCk7CisJCXNpbXBsZU9iamVjdC5wdXQoInJlcXVpcmVtZW50IiwgcmVxdWlyZW1lbnQpOworCQlzaW1wbGVPYmplY3QucHV0KCJjYXBhYmlsaXR5IiwgY2FwYWJpbGl0eSk7CisJCXNpbXBsZU9iamVjdC5wdXQoImNhcGFiaWxpdHlVaWQiLCByZWxhdGlvbnNoaXBJbnN0RGF0YS5nZXRDYXBhYmlsdHlJZCgpKTsKKwkJc2ltcGxlT2JqZWN0LnB1dCgiY2FwYWJpbGl0eU93bmVySWQiLCByZWxhdGlvbnNoaXBJbnN0RGF0YS5nZXRDYXBhYmlsaXR5T3duZXJJZCgpKTsKKwkJc2ltcGxlT2JqZWN0LnB1dCgicmVxdWlyZW1lbnRPd25lcklkIiwgcmVsYXRpb25zaGlwSW5zdERhdGEuZ2V0UmVxdWlyZW1lbnRPd25lcklkKCkpOworCQlzaW1wbGVPYmplY3QucHV0KCJyZXF1aXJlbWVudFVpZCIsIHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFJlcXVpcmVtZW50SWQoKSk7CisJCXJlbGF0aW9uc2hpcHNBcnJheS5hZGQoc2ltcGxlT2JqZWN0KTsKKworCQlBcnJheUxpc3Q8T2JqZWN0PiByZWxhdGlvbnNoaXBzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KHJlbGF0aW9uc2hpcHNBcnJheSk7CisJCXdyYXBwZXIucHV0KCJmcm9tTm9kZSIsIGZyb21Ob2RlKTsKKwkJd3JhcHBlci5wdXQoInRvTm9kZSIsIHRvTm9kZSk7CisJCXdyYXBwZXIucHV0KCJyZWxhdGlvbnNoaXBzIiwgcmVsYXRpb25zaGlwcyk7CisJCXJldHVybiB3cmFwcGVyOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQ2FwYWJpbGl0eURlZmluaXRpb24gZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25CeU93bmVySWQoTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0eURlZmluaXRpb25MaXN0LCBTdHJpbmcgb3duZXJJZCkgeworCisJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gOiBjYXBhYmlsaXR5RGVmaW5pdGlvbkxpc3QpIHsKKwkJCWlmIChjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRPd25lcklkKCkuZXF1YWxzKG93bmVySWQpKSB7CisJCQkJcmV0dXJuIGNhcGFiaWxpdHlEZWZpbml0aW9uOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlcXVpcmVtZW50RGVmaW5pdGlvbiBnZXRSZXF1aXJlbWVudERlZmluaXRpb25CeU93bmVySWQoTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcXVpcmVtZW50RGVmaW5pdGlvbkxpc3QsIFN0cmluZyBvd25lcklkKSB7CisKKwkJZm9yIChSZXF1aXJlbWVudERlZmluaXRpb24gcmVxdWlyZW1lbnREZWZpbml0aW9uIDogcmVxdWlyZW1lbnREZWZpbml0aW9uTGlzdCkgeworCQkJaWYgKHJlcXVpcmVtZW50RGVmaW5pdGlvbi5nZXRPd25lcklkKCkuZXF1YWxzKG93bmVySWQpKSB7CisJCQkJcmV0dXJuIHJlcXVpcmVtZW50RGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSaVVuaXF1ZUlkQnlSaU5hbWUoQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lKSB7CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlTdHJpbmcgbmFtZSA9IG51bGw7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkuZXF1YWxzKHJlc291cmNlSW5zdGFuY2VOYW1lKSkgeworCQkJCW5hbWUgPSBjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY29udmVydFJlc291cmNlR2V0UmVzcG9uc2VUb0phdmFPYmplY3QoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGdldCByZXNvdXJjZSIsIDIwMCwgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJldHVybiBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZUluc3RhbmNlVmVyc2lvbihTdHJpbmcgY29udGFpbmVyVW5pcXVlSWQsIFN0cmluZyBpbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBTdHJpbmcgbmV3UmVzb3VyY2VVbmlxdWVJZCwgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gUHJvZHVjdFJlc3RVdGlscy5jaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uKGNvbnRhaW5lclVuaXF1ZUlkLCBpbnN0YW5jZVRvUmVwbGFjZVVuaXF1ZUlkLCBuZXdSZXNvdXJjZVVuaXF1ZUlkLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCBjb21wb25lbnRUeXBlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L1Jlc3BvbnNlUGFyc2VyLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9SZXNwb25zZVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2I5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9SZXNwb25zZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNTQxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uVmVyc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuSnNvbkRlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5tb2R1bGUuU2ltcGxlTW9kdWxlOworaW1wb3J0IG9yZy5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb2R1Y3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbi5Qcm9wZXJ0eUNvbnN0cmFpbnRKYWNrc29uRGVzZXJpYWxpc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVzcEphdmFPYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBSZXNwb25zZVBhcnNlciB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFSSUFOVF9VVUlEID0gImludmFyaWFudFVVSUQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9JRCA9ICJ1bmlxdWVJZCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVUlEID0gInV1aWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOX1RZUEUgPSAib3JpZ2luVHlwZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9TQ0FfUkVTT1VSQ0VfTkFNRSA9ICJ0b3NjYVJlc291cmNlTmFtZSI7CisKKwlzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoUmVzcG9uc2VQYXJzZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbHVlRnJvbUpzb25SZXNwb25zZShTdHJpbmcgcmVzcG9uc2UsIFN0cmluZyBmaWVsZE5hbWUpIHsKKwkJdHJ5IHsKKwkJCUpTT05PYmplY3QganNvblJlc3AgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKHJlc3BvbnNlKTsKKwkJCU9iamVjdCBmaWVsZFZhbHVlID0ganNvblJlc3AuZ2V0KGZpZWxkTmFtZSk7CisJCQlyZXR1cm4gZmllbGRWYWx1ZS50b1N0cmluZygpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UoUmVzdFJlc3BvbnNlIHJlc3BvbnNlKSB7CisJCXJldHVybiBnZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgVU5JUVVFX0lEKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnZhcmlhbnRVdWlkKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQlyZXR1cm4gZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHJlc3BvbnNlLmdldFJlc3BvbnNlKCksIElOVkFSSUFOVF9VVUlEKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVdWlkRnJvbVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQlyZXR1cm4gZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHJlc3BvbnNlLmdldFJlc3BvbnNlKCksIFVVSUQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tUmVzcG9uc2UoUmVzdFJlc3BvbnNlIHJlc3BvbnNlKSB7CisJCXJldHVybiBnZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgTkFNRSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvbkZyb21SZXNwb25zZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkJcmV0dXJuIFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXNwb25zZS5nZXRSZXNwb25zZSgpLCBWRVJTSU9OKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlRnJvbVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQlyZXR1cm4gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHJlc3BvbnNlLmdldFJlc3BvbnNlKCksIE9SSUdJTl9UWVBFKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUb3NjYVJlc291cmNlTmFtZUZyb21SZXNwb25zZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkJcmV0dXJuIGdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXNwb25zZS5nZXRSZXNwb25zZSgpLCBUT1NDQV9SRVNPVVJDRV9OQU1FKTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVzcEphdmFPYmplY3QgcGFyc2VKc29uTGlzdFJldHVyblJlc291cmNlRGV0YWlsc09iaihSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlLAorCQkJU3RyaW5nIHJlc291cmNlVHlwZSwgU3RyaW5nIHNlYXJjaFBhdHRlcm4sIFN0cmluZyBleHBlY3RlZFJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gR3NvbiBnc29uID0gbmV3IEdzb247CisKKwkJSnNvbkVsZW1lbnQgakVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKwkJSnNvbk9iamVjdCBqT2JqZWN0ID0gakVsZW1lbnQuZ2V0QXNKc29uT2JqZWN0KCk7CisJCUpzb25BcnJheSBhcnJheU9mT2JqZWN0cyA9IChKc29uQXJyYXkpIGpPYmplY3QuZ2V0KHJlc291cmNlVHlwZSk7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCVJlc291cmNlUmVzcEphdmFPYmplY3QganNvblRvSmF2YU9iamVjdCA9IG5ldyBSZXNvdXJjZVJlc3BKYXZhT2JqZWN0KCk7CisKKwkJZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBhcnJheU9mT2JqZWN0cy5zaXplKCk7IGNvdW50ZXIrKykgeworCQkJSnNvbk9iamVjdCBqSGl0T2JqZWN0ID0gKEpzb25PYmplY3QpIGFycmF5T2ZPYmplY3RzLmdldChjb3VudGVyKTsKKworCQkJbWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGdzb24uZnJvbUpzb24oakhpdE9iamVjdC50b1N0cmluZygpLCBtYXAuZ2V0Q2xhc3MoKSk7CisJCQlpZiAobWFwLmdldChzZWFyY2hQYXR0ZXJuKS50b1N0cmluZygpLmNvbnRhaW5zKGV4cGVjdGVkUmVzdWx0KSkgeworCisJCQkJanNvblRvSmF2YU9iamVjdCA9IGdzb24uZnJvbUpzb24oak9iamVjdCwgUmVzb3VyY2VSZXNwSmF2YU9iamVjdC5jbGFzcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGpzb25Ub0phdmFPYmplY3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KFN0cmluZyByZXNwb25zZSkgeworCisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCWZpbmFsIFNpbXBsZU1vZHVsZSBtb2R1bGUgPSBuZXcgU2ltcGxlTW9kdWxlKCJjdXN0b21lclNlcmlhbGl6YXRpb25Nb2R1bGUiLAorCQkJCW5ldyBWZXJzaW9uKDEsIDAsIDAsICJzdGF0aWMgdmVyc2lvbiIpKTsKKwkJSnNvbkRlc2VyaWFsaXplcjxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGRlc3JpYWxpemVyID0gbmV3IFByb3BlcnR5Q29uc3RyYWludEphY2tzb25EZXNlcmlhbGlzZXIoKTsKKwkJYWRkRGVzZXJpYWxpemVyKG1vZHVsZSwgUHJvcGVydHlDb25zdHJhaW50LmNsYXNzLCBkZXNyaWFsaXplcik7CisKKwkJbWFwcGVyLnJlZ2lzdGVyTW9kdWxlKG1vZHVsZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJlc291cmNlID0gbWFwcGVyLnJlYWRWYWx1ZShyZXNwb25zZSwgUmVzb3VyY2UuY2xhc3MpOworCQkJbG9nZ2VyLmRlYnVnKHJlc291cmNlLnRvU3RyaW5nKCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0cnkgeworCQkJCUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IEFycmF5cy5hc0xpc3QobWFwcGVyLnJlYWRWYWx1ZShyZXNwb25zZS50b1N0cmluZygpLCBSZXNvdXJjZVtdLmNsYXNzKSk7CisJCQkJcmVzb3VyY2UgPSByZXNvdXJjZXMuZ2V0KDApOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjb252ZXJ0UHJvcGVydHlSZXNwb25zZVRvSmF2YU9iamVjdChTdHJpbmcgcmVzcG9uc2UpIHsKKworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQlmaW5hbCBTaW1wbGVNb2R1bGUgbW9kdWxlID0gbmV3IFNpbXBsZU1vZHVsZSgiY3VzdG9tZXJTZXJpYWxpemF0aW9uTW9kdWxlIiwKKwkJCQluZXcgVmVyc2lvbigxLCAwLCAwLCAic3RhdGljIHZlcnNpb24iKSk7CisJCUpzb25EZXNlcmlhbGl6ZXI8UHJvcGVydHlDb25zdHJhaW50PiBkZXNyaWFsaXplciA9IG5ldyBQcm9wZXJ0eUNvbnN0cmFpbnRKYWNrc29uRGVzZXJpYWxpc2VyKCk7CisJCWFkZERlc2VyaWFsaXplcihtb2R1bGUsIFByb3BlcnR5Q29uc3RyYWludC5jbGFzcywgZGVzcmlhbGl6ZXIpOworCisJCW1hcHBlci5yZWdpc3Rlck1vZHVsZShtb2R1bGUpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BlcnR5RGVmaW5pdGlvbiA9IG51bGw7CisJCXRyeSB7CisJCQlwcm9wZXJ0eURlZmluaXRpb24gPSBtYXBwZXIucmVhZFZhbHVlKHJlc3BvbnNlLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LmNsYXNzKTsKKwkJCWxvZ2dlci5kZWJ1Zyhwcm9wZXJ0eURlZmluaXRpb24udG9TdHJpbmcoKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnR5RGVmaW5pdGlvbjsKKwl9CisKKwkvLyBwdWJsaWMgc3RhdGljIFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzCisJLy8gY29udmVydFJlc291cmNlSW5zdGFuY2VSZXNwb25zZVRvSmF2YU9iamVjdChTdHJpbmcgcmVzcG9uc2UpIHsKKwkvLworCS8vIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJLy8gZmluYWwgU2ltcGxlTW9kdWxlIG1vZHVsZSA9IG5ldworCS8vIFNpbXBsZU1vZHVsZSgiY3VzdG9tZXJTZXJpYWxpemF0aW9uTW9kdWxlIiwgbmV3IFZlcnNpb24oMSwgMCwgMCwgInN0YXRpYworCS8vIHZlcnNpb24iKSk7CisJLy8gSnNvbkRlc2VyaWFsaXplcjxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGRlc3JpYWxpemVyID0gbmV3CisJLy8gUHJvcGVydHlDb25zdHJhaW50SmFja3NvbkRlc2VyaWFsaXNlcigpOworCS8vIGFkZERlc2VyaWFsaXplcihtb2R1bGUsIFByb3BlcnR5Q29uc3RyYWludC5jbGFzcywgZGVzcmlhbGl6ZXIpOworCS8vCisJLy8gbWFwcGVyLnJlZ2lzdGVyTW9kdWxlKG1vZHVsZSk7CisJLy8gUmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBudWxsOworCS8vIHRyeSB7CisJLy8gcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMgPSBtYXBwZXIucmVhZFZhbHVlKHJlc3BvbnNlLAorCS8vIFJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzLmNsYXNzKTsKKwkvLyBsb2dnZXIuZGVidWcocmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMudG9TdHJpbmcoKSk7CisJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCS8vIH0KKwkvLworCS8vIHJldHVybiByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsczsKKwkvLyB9CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Kc29uKE9iamVjdCBvYmplY3QpIHsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJcmV0dXJuIGdzb24udG9Kc29uKG9iamVjdCk7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdERlZmluaXRpb24gY29udmVydEFydGlmYWN0RGVmaW5pdGlvblJlc3BvbnNlVG9KYXZhT2JqZWN0KFN0cmluZyByZXNwb25zZSkgeworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJYXJ0aWZhY3REZWZpbml0aW9uID0gbWFwcGVyLnJlYWRWYWx1ZShyZXNwb25zZSwgQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKTsKKwkJCWxvZ2dlci5kZWJ1ZyhhcnRpZmFjdERlZmluaXRpb24udG9TdHJpbmcoKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCQlyZXR1cm4gYXJ0aWZhY3REZWZpbml0aW9uOworCisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgY29udmVydEFydGlmYWN0UmVxRGV0YWlsc1RvSmF2YU9iamVjdChTdHJpbmcgcmVzcG9uc2UpIHsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3RSZXFEZXRhaWxzID0gbnVsbDsKKwkJLy8gdHJ5IHsKKwkJLy8KKwkJLy8gYXJ0aWZhY3REZWZpbml0aW9uID0gbWFwcGVyLnJlYWRWYWx1ZShyZXNwb25zZSwKKwkJLy8gQXJ0aWZhY3RSZXFEZXRhaWxzLmNsYXNzKTsKKwkJLy8gbG9nZ2VyLmRlYnVnKGFydGlmYWN0RGVmaW5pdGlvbi50b1N0cmluZygpKTsKKwkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCS8vIH0KKwkJLy8KKwkJLy8gcmV0dXJuIGFydGlmYWN0RGVmaW5pdGlvbjsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJYXJ0aWZhY3RSZXFEZXRhaWxzID0gZ3Nvbi5mcm9tSnNvbihyZXNwb25zZSwgQXJ0aWZhY3RSZXFEZXRhaWxzLmNsYXNzKTsKKwkJcmV0dXJuIGFydGlmYWN0UmVxRGV0YWlsczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIDxUPiBUIHBhcnNlVG9PYmplY3QoU3RyaW5nIGpzb24sIENsYXNzPFQ+IGNsYXp6KSB7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVQgb2JqZWN0OworCQl0cnkgeworCQkJb2JqZWN0ID0gZ3Nvbi5mcm9tSnNvbihqc29uLCBjbGF6eik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlvYmplY3QgPSBwYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoanNvbiwgY2xhenopOworCQl9CisJCXJldHVybiBvYmplY3Q7CisJfQorCisJcHVibGljIHN0YXRpYyA8VD4gVCBwYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoU3RyaW5nIGpzb24sIENsYXNzPFQ+IGNsYXp6KSB7CisJCS8vIEdlbmVyaWMgY29udmVydAorCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQlUIG9iamVjdCA9IG51bGw7CisJCWZpbmFsIFNpbXBsZU1vZHVsZSBtb2R1bGUgPSBuZXcgU2ltcGxlTW9kdWxlKCJjdXN0b21lclNlcmlhbGl6YXRpb25Nb2R1bGUiLAorCQkJCW5ldyBWZXJzaW9uKDEsIDAsIDAsICJzdGF0aWMgdmVyc2lvbiIpKTsKKwkJSnNvbkRlc2VyaWFsaXplcjxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGRlc3JpYWxpemVyID0gbmV3IFByb3BlcnR5Q29uc3RyYWludEphY2tzb25EZXNlcmlhbGlzZXIoKTsKKwkJYWRkRGVzZXJpYWxpemVyKG1vZHVsZSwgUHJvcGVydHlDb25zdHJhaW50LmNsYXNzLCBkZXNyaWFsaXplcik7CisJCW1hcHBlci5yZWdpc3Rlck1vZHVsZShtb2R1bGUpOworCQl0cnkgeworCQkJb2JqZWN0ID0gbWFwcGVyLnJlYWRWYWx1ZShqc29uLCBjbGF6eik7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzOiAiK2NsYXp6LmdldFNpbXBsZU5hbWUoKSsiLCBqc29uOgorCQkJLy8gIitqc29uKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiBvYmplY3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgY29udmVydEFydGlmYWN0RGVmaW5pdGlvblRvQXJ0aWZhY3RSZXFEZXRhaWxzT2JqZWN0KAorCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbikgeworCisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdFJlcURldGFpbHMgPSBudWxsOworCQkvLyB0cnkgeworCQkvLworCQkvLyBhcnRpZmFjdERlZmluaXRpb24gPSBtYXBwZXIucmVhZFZhbHVlKHJlc3BvbnNlLAorCQkvLyBBcnRpZmFjdFJlcURldGFpbHMuY2xhc3MpOworCQkvLyBsb2dnZXIuZGVidWcoYXJ0aWZhY3REZWZpbml0aW9uLnRvU3RyaW5nKCkpOworCQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJLy8gfQorCQkvLworCQkvLyByZXR1cm4gYXJ0aWZhY3REZWZpbml0aW9uOworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgYXJ0RGVmID0gZ3Nvbi50b0pzb24oYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkJYXJ0aWZhY3RSZXFEZXRhaWxzID0gZ3Nvbi5mcm9tSnNvbihhcnREZWYsIEFydGlmYWN0UmVxRGV0YWlscy5jbGFzcyk7CisJCXJldHVybiBhcnRpZmFjdFJlcURldGFpbHM7CisJfQorCisJcHVibGljIHN0YXRpYyA8VD4gdm9pZCBhZGREZXNlcmlhbGl6ZXIoU2ltcGxlTW9kdWxlIG1vZHVsZSwgQ2xhc3M8VD4gY2xhenosCisJCQlmaW5hbCBKc29uRGVzZXJpYWxpemVyPFQ+IGRlc2VyaWFsaXplcikgeworCQltb2R1bGUuYWRkRGVzZXJpYWxpemVyKGNsYXp6LCBkZXNlcmlhbGl6ZXIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU2VydmljZSBjb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KFN0cmluZyByZXNwb25zZSkgeworCisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCWZpbmFsIFNpbXBsZU1vZHVsZSBtb2R1bGUgPSBuZXcgU2ltcGxlTW9kdWxlKCJjdXN0b21lclNlcmlhbGl6YXRpb25Nb2R1bGUiLAorCQkJCW5ldyBWZXJzaW9uKDEsIDAsIDAsICJzdGF0aWMgdmVyc2lvbiIpKTsKKwkJSnNvbkRlc2VyaWFsaXplcjxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGRlc3JpYWxpemVyID0gbmV3IFByb3BlcnR5Q29uc3RyYWludEphY2tzb25EZXNlcmlhbGlzZXIoKTsKKwkJYWRkRGVzZXJpYWxpemVyKG1vZHVsZSwgUHJvcGVydHlDb25zdHJhaW50LmNsYXNzLCBkZXNyaWFsaXplcik7CisKKwkJbWFwcGVyLnJlZ2lzdGVyTW9kdWxlKG1vZHVsZSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IG51bGw7CisJCXRyeSB7CisJCQlzZXJ2aWNlID0gbWFwcGVyLnJlYWRWYWx1ZShyZXNwb25zZSwgU2VydmljZS5jbGFzcyk7CisJCQlsb2dnZXIuZGVidWcoc2VydmljZS50b1N0cmluZygpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiBzZXJ2aWNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvZHVjdCBjb252ZXJ0UHJvZHVjdFJlc3BvbnNlVG9KYXZhT2JqZWN0KFN0cmluZyByZXNwb25zZSkgeworCisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCVByb2R1Y3QgcHJvZHVjdCA9IG51bGw7CisJCXRyeSB7CisJCQlwcm9kdWN0ID0gbWFwcGVyLnJlYWRWYWx1ZShyZXNwb25zZSwgUHJvZHVjdC5jbGFzcyk7CisJCQlsb2dnZXIuZGVidWcocHJvZHVjdC50b1N0cmluZygpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiBwcm9kdWN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50SW5zdGFuY2UgY29udmVydENvbXBvbmVudEluc3RhbmNlUmVzcG9uc2VUb0phdmFPYmplY3QoU3RyaW5nIHJlc3BvbnNlKSB7CisKKwkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJZmluYWwgU2ltcGxlTW9kdWxlIG1vZHVsZSA9IG5ldyBTaW1wbGVNb2R1bGUoImN1c3RvbWVyU2VyaWFsaXphdGlvbk1vZHVsZSIsCisJCQkJbmV3IFZlcnNpb24oMSwgMCwgMCwgInN0YXRpYyB2ZXJzaW9uIikpOworCQlKc29uRGVzZXJpYWxpemVyPFByb3BlcnR5Q29uc3RyYWludD4gZGVzcmlhbGl6ZXIgPSBuZXcgUHJvcGVydHlDb25zdHJhaW50SmFja3NvbkRlc2VyaWFsaXNlcigpOworCQlhZGREZXNlcmlhbGl6ZXIobW9kdWxlLCBQcm9wZXJ0eUNvbnN0cmFpbnQuY2xhc3MsIGRlc3JpYWxpemVyKTsKKworCQltYXBwZXIucmVnaXN0ZXJNb2R1bGUobW9kdWxlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBudWxsOworCQl0cnkgeworCQkJY29tcG9uZW50SW5zdGFuY2UgPSBtYXBwZXIucmVhZFZhbHVlKHJlc3BvbnNlLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcyk7CisJCQlsb2dnZXIuZGVidWcoY29tcG9uZW50SW5zdGFuY2UudG9TdHJpbmcoKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2U7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0VmFsdWVzRnJvbUpzb25BcnJheShSZXN0UmVzcG9uc2UgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdFR5cGVzQXJyYXlGcm9tQXBpID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwkJb3JnLmpzb24uSlNPTk9iamVjdCByZXNwb25zZU9iamVjdCA9IG5ldyBvcmcuanNvbi5KU09OT2JqZWN0KG1lc3NhZ2UuZ2V0UmVzcG9uc2UoKSk7CisJCUpTT05BcnJheSBqQXJyID0gcmVzcG9uc2VPYmplY3QuZ2V0SlNPTkFycmF5KCJhcnRpZmFjdFR5cGVzIik7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqQXJyLmxlbmd0aCgpOyBpKyspIHsKKwkJCW9yZy5qc29uLkpTT05PYmplY3Qgak9iaiA9IGpBcnIuZ2V0SlNPTk9iamVjdChpKTsKKwkJCVN0cmluZyB2YWx1ZSA9IGpPYmouZ2V0KCJuYW1lIikudG9TdHJpbmcoKTsKKworCQkJYXJ0aWZhY3RUeXBlc0FycmF5RnJvbUFwaS5hZGQodmFsdWUpOworCQl9CisJCXJldHVybiBhcnRpZmFjdFR5cGVzQXJyYXlGcm9tQXBpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZU1ENUhlYWRlcihBcnRpZmFjdFJlcURldGFpbHMgYXJ0aWZhY3REZXRhaWxzKSB7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyBqc29uQm9keSA9IGdzb24udG9Kc29uKGFydGlmYWN0RGV0YWlscyk7CisJCS8vIGNhbGN1bGF0ZSBNRDUgZm9yIGpzb24gYm9keQorCQlyZXR1cm4gY2FsY3VsYXRlTUQ1KGpzb25Cb2R5KTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZU1ENShTdHJpbmcgZGF0YSkgeworCQlTdHJpbmcgY2FsY3VsYXRlZE1kNSA9IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5kaWdlc3QuRGlnZXN0VXRpbHMubWQ1SGV4KGRhdGEpOworCQkvLyBlbmNvZGUgYmFzZS02NCByZXN1bHQKKwkJYnl0ZVtdIGVuY29kZUJhc2U2NCA9IEJhc2U2NC5lbmNvZGVCYXNlNjQoY2FsY3VsYXRlZE1kNS5nZXRCeXRlcygpKTsKKwkJU3RyaW5nIGVuY29kZUJhc2U2NFN0ciA9IG5ldyBTdHJpbmcoZW5jb2RlQmFzZTY0KTsKKwkJcmV0dXJuIGVuY29kZUJhc2U2NFN0cjsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRBdWRpdEZyb21NZXNzYWdlKE1hcCBhdWRpdGluZ01lc3NhZ2UpIHsKKwkJTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBhdWRpdExpc3QgPSBuZXcgQXJyYXlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KCk7CisJCS8vIEpzb25FbGVtZW50IGpFbGVtZW50ID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShhdWRpdGluZ01lc3NhZ2UpOworCQkvLyBKc29uT2JqZWN0IGpPYmplY3QgPSBqRWxlbWVudC5nZXRBc0pzb25PYmplY3QoKTsKKwkJLy8gSnNvbk9iamVjdCBoaXRzT2JqZWN0ID0gKEpzb25PYmplY3QpIGpPYmplY3QuZ2V0KCJoaXRzIik7CisJCS8vIEpzb25BcnJheSBoaXRzQXJyYXkgPSAoSnNvbkFycmF5KSBoaXRzT2JqZWN0LmdldCgiaGl0cyIpOworCQkvLworCQkvLyBJdGVyYXRvcjxKc29uRWxlbWVudD4gaGl0c0l0ZXJhdG9yID0gaGl0c0FycmF5Lml0ZXJhdG9yKCk7CisJCS8vIHdoaWxlKGhpdHNJdGVyYXRvci5oYXNOZXh0KCkpCisJCS8vIHsKKwkJLy8gSnNvbkVsZW1lbnQgbmV4dEhpdCA9IGhpdHNJdGVyYXRvci5uZXh0KCk7CisJCS8vIEpzb25PYmplY3QgakhpdE9iamVjdCA9IG5leHRIaXQuZ2V0QXNKc29uT2JqZWN0KCk7CisJCS8vIEpzb25PYmplY3QgalNvdXJjZU9iamVjdCA9IChKc29uT2JqZWN0KSBqSGl0T2JqZWN0LmdldCgiX3NvdXJjZSIpOworCQkvLworCQkvLyBHc29uIGdzb249bmV3IEdzb24oKTsKKwkJLy8gU3RyaW5nIGF1ZGl0VW5wYXJzZWQgPSBqU291cmNlT2JqZWN0LnRvU3RyaW5nKCk7CisJCS8vCisJCS8vIE1hcDxTdHJpbmcsT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigpOworCQkvLyBtYXAgPSAoTWFwPFN0cmluZyxPYmplY3Q+KSBnc29uLmZyb21Kc29uKGF1ZGl0VW5wYXJzZWQsCisJCS8vIG1hcC5nZXRDbGFzcygpKTsKKworCQlhdWRpdExpc3QuYWRkKGF1ZGl0aW5nTWVzc2FnZSk7CisJCS8vIH0KKwkJcmV0dXJuIGF1ZGl0TGlzdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBwYXJzZUNhdGVnb3JpZXMoUmVzdFJlc3BvbnNlIGdldEFsbENhdGVnb3JpZXNSZXN0KSB7CisKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdHJ5IHsKKwkJCUpzb25FbGVtZW50IGpFbGVtZW50ID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShnZXRBbGxDYXRlZ29yaWVzUmVzdC5nZXRSZXNwb25zZSgpKTsKKwkJCUpzb25BcnJheSBjYWdlZ29yaWVzID0gakVsZW1lbnQuZ2V0QXNKc29uQXJyYXkoKTsKKwkJCUl0ZXJhdG9yPEpzb25FbGVtZW50PiBpdGVyID0gY2FnZWdvcmllcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJSnNvbkVsZW1lbnQgbmV4dCA9IGl0ZXIubmV4dCgpOworCQkJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3QobmV4dC50b1N0cmluZygpLCBDYXRlZ29yeURlZmluaXRpb24uY2xhc3MpOworCQkJCWNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKKwkJCX0KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiBjYXRlZ29yaWVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgSlNPTkFycmF5IGdldExpc3RGcm9tSnNvbihSZXN0UmVzcG9uc2UgcmVzLCBTdHJpbmcgZmllbGQpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKwkJU3RyaW5nIHZhbHVlRnJvbUpzb25SZXNwb25zZSA9IGdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXMuZ2V0UmVzcG9uc2UoKSwgZmllbGQpOworCQlKU09OQXJyYXkgakFyciA9IG5ldyBKU09OQXJyYXkodmFsdWVGcm9tSnNvblJlc3BvbnNlKTsKKworCQlyZXR1cm4gakFycjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXREZXJpdmVkTGlzdEZyb21Kc29uKFJlc3RSZXNwb25zZSByZXMpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKwkJSlNPTkFycmF5IGxpc3RGcm9tSnNvbiA9IGdldExpc3RGcm9tSnNvbihyZXMsICJkZXJpdmVkTGlzdCIpOworCQlMaXN0PFN0cmluZz4gbHN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdEZyb21Kc29uLmxlbmd0aCgpOyBpKyspIHsKKwkJCWxzdC5hZGQobGlzdEZyb21Kc29uLmdldFN0cmluZyhpKSk7CisJCX0KKworCQlyZXR1cm4gbHN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0U3RyaW5nVG9NYXAoU3RyaW5nIG9iaikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG9iamVjdCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBKU09OVmFsdWUucGFyc2Uob2JqKTsKKwkJcmV0dXJuIG9iamVjdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0TGlzdE9mTWFwc0Zyb21Kc29uKFJlc3RSZXNwb25zZSByZXMsIFN0cmluZyBmaWVsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKwkJSlNPTkFycmF5IGxpc3RGcm9tSnNvbiA9IGdldExpc3RGcm9tSnNvbihyZXMsIGZpZWxkKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0RnJvbUpzb24ubGVuZ3RoKCk7IGkrKykgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0U3RyaW5nVG9NYXAgPSBjb252ZXJ0U3RyaW5nVG9NYXAobGlzdEZyb21Kc29uLmdldFN0cmluZyhpKSk7CisJCQlsaXN0LmFkZChjb252ZXJ0U3RyaW5nVG9NYXApOworCQl9CisJCXJldHVybiBsaXN0OworCisJfQorCisJcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEpzb25WYWx1ZUFzTWFwKFJlc3RSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGtleSkgeworCQlTdHJpbmcgdmFsdWVGaWVsZCA9IGdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXNwb25zZS5nZXRSZXNwb25zZSgpLCBrZXkpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRUb01hcCA9IGNvbnZlcnRTdHJpbmdUb01hcCh2YWx1ZUZpZWxkKTsKKwkJcmV0dXJuIGNvbnZlcnRUb01hcDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKc29uT2JqZWN0VmFsdWVCeUtleShTdHJpbmcgbWV0YWRhdGEsIFN0cmluZyBrZXkpIHsKKwkJSnNvbkVsZW1lbnQgamVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKG1ldGFkYXRhKTsKKworCQlKc29uT2JqZWN0IGpvYmplY3QgPSBqZWxlbWVudC5nZXRBc0pzb25PYmplY3QoKTsKKwkJT2JqZWN0IG9iaiA9IGpvYmplY3QuZ2V0KGtleSk7CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gb2JqLnRvU3RyaW5nKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEFycmF5TGlzdDxDb21wb25lbnQ+PiBjb252ZXJ0Q2F0YWxvZ1Jlc3BvbnNlVG9KYXZhT2JqZWN0KFN0cmluZyByZXNwb25zZSkgeworCisJCU1hcDxTdHJpbmcsIEFycmF5TGlzdDxDb21wb25lbnQ+PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxDb21wb25lbnQ+PigpOworCisJCUpzb25FbGVtZW50IGpFbGVtZW50ID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShyZXNwb25zZSk7CisJCUpzb25PYmplY3Qgak9iamVjdCA9IGpFbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQlKc29uQXJyYXkgakFyclJlb3VzcmNlcyA9IGpPYmplY3QuZ2V0QXNKc29uQXJyYXkoInJlc291cmNlcyIpOworCQlKc29uQXJyYXkgakFyclNlcnZpY2VzID0gak9iamVjdC5nZXRBc0pzb25BcnJheSgic2VydmljZXMiKTsKKwkJSnNvbkFycmF5IGpBcnJQcm9kdWN0cyA9IGpPYmplY3QuZ2V0QXNKc29uQXJyYXkoInByb2R1Y3RzIik7CisKKwkJLy8vLy8vLy8gUkVTT1VSQ0UvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlBcnJheUxpc3Q8Q29tcG9uZW50PiByZXN0UmVzcG9uc2VBcnJheSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqQXJyUmVvdXNyY2VzLnNpemUoKTsgaSsrKSB7CisJCQlTdHJpbmcgcmVzb3VyY2VTdHJpbmcgPSAoU3RyaW5nKSBqQXJyUmVvdXNyY2VzLmdldChpKS50b1N0cmluZygpOworCQkJY29tcG9uZW50ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VTdHJpbmcpOworCQkJcmVzdFJlc3BvbnNlQXJyYXkuYWRkKGNvbXBvbmVudCk7CisJCX0KKworCQltYXAucHV0KCJyZXNvdXJjZXMiLCByZXN0UmVzcG9uc2VBcnJheSk7CisKKwkJLy8vLy8vLy8vIFNFUlZJQ0UvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCXJlc3RSZXNwb25zZUFycmF5ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWNvbXBvbmVudCA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgakFyclNlcnZpY2VzLnNpemUoKTsgaSsrKSB7CisJCQlTdHJpbmcgcmVzb3VyY2VTdHJpbmcgPSAoU3RyaW5nKSBqQXJyU2VydmljZXMuZ2V0KGkpLnRvU3RyaW5nKCk7CisJCQljb21wb25lbnQgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0U2VydmljZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlU3RyaW5nKTsKKwkJCXJlc3RSZXNwb25zZUFycmF5LmFkZChjb21wb25lbnQpOworCQl9CisKKwkJbWFwLnB1dCgic2VydmljZXMiLCByZXN0UmVzcG9uc2VBcnJheSk7CisKKwkJLy8vLy8vLy8vIFBST0RVQ1QvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlyZXN0UmVzcG9uc2VBcnJheSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljb21wb25lbnQgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGpBcnJQcm9kdWN0cy5zaXplKCk7IGkrKykgeworCQkJU3RyaW5nIHJlc291cmNlU3RyaW5nID0gKFN0cmluZykgakFyclByb2R1Y3RzLmdldChpKS50b1N0cmluZygpOworCQkJY29tcG9uZW50ID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFByb2R1Y3RSZXNwb25zZVRvSmF2YU9iamVjdChyZXNvdXJjZVN0cmluZyk7CisJCQlyZXN0UmVzcG9uc2VBcnJheS5hZGQoY29tcG9uZW50KTsKKwkJfQorCisJCW1hcC5wdXQoInByb2R1Y3RzIiwgcmVzdFJlc3BvbnNlQXJyYXkpOworCisJCXJldHVybiBtYXA7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9TZXJ2aWNlUmVzdFV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9TZXJ2aWNlUmVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyYzc0YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy9yZXN0L1NlcnZpY2VSZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgU2VydmljZVJlc3RVdGlscyBleHRlbmRzIEJhc2VSZXN0VXRpbHMgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTZXJ2aWNlUmVzdFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNhY2hlQ29udHJvbCA9ICJuby1jYWNoZSI7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgYWNjZXB0SGVhZGVyRGF0ZSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKwkvLyAqKioqKiogQ1JFQVRFICoqKioqKioKKworCXByaXZhdGUgc3RhdGljIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHZlcnNpb24sIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRFTEVURV9TRVJWSUNFX0JZX05BTUVfQU5EX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VOYW1lLCB2ZXJzaW9uKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCVJlc3RSZXNwb25zZSBzZW5kRGVsZXRlID0gc2VuZERlbGV0ZSh1cmwsIHVzZXJJZCk7CisJCWRlbGV0ZU1hcmtlZFNlcnZpY2VzKHVzZXJJZCk7CisJCXJldHVybiBzZW5kRGVsZXRlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlbGV0ZVNlcnZpY2VCeUlkKFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyB1c2VySWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgc2VydmljZUlkKTsKKwkJUmVzdFJlc3BvbnNlIHNlbmREZWxldGUgPSBzZW5kRGVsZXRlKHVybCwgdXNlcklkKTsKKwkJZGVsZXRlTWFya2VkU2VydmljZXModXNlcklkKTsKKwkJcmV0dXJuIHNlbmREZWxldGU7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU1hcmtlZFNlcnZpY2VzKFN0cmluZyB1c2VySWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyB1cmw7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRFTEVURV9NQVJLRURfU0VSVklDRVMsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCQlzZW5kRGVsZXRlKHVybCwgdXNlcklkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVTZXJ2aWNlKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfU0VSVklDRSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCVN0cmluZyBzZXJ2aWNlQm9keUpzb24gPSBnc29uLnRvSnNvbihzZXJ2aWNlKTsKKworCQlsb2dnZXIuZGVidWcoIlNlbmQgUE9TVCByZXF1ZXN0IHRvIGNyZWF0ZSBzZXJ2aWNlOiB7XSIsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VydmljZSBib2R5OiB7fSIsIHNlcnZpY2VCb2R5SnNvbik7CisKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IHNlbmRQb3N0KHVybCwgc2VydmljZUJvZHlKc29uLCB1c2VyLmdldFVzZXJJZCgpLCBhY2NlcHRIZWFkZXJEYXRhKTsKKwkJaWYgKHJlcy5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9DUkVBVEVEKSB7CisJCQlzZXJ2aWNlLnNldFVuaXF1ZUlkKFJlc3BvbnNlUGFyc2VyLmdldFVuaXF1ZUlkRnJvbVJlc3BvbnNlKHJlcykpOworCQkJc2VydmljZS5zZXRWZXJzaW9uKFJlc3BvbnNlUGFyc2VyLmdldFZlcnNpb25Gcm9tUmVzcG9uc2UocmVzKSk7CisJCQlzZXJ2aWNlLnNldFVVSUQoUmVzcG9uc2VQYXJzZXIuZ2V0VXVpZEZyb21SZXNwb25zZShyZXMpKTsKKwkJCS8vIENyZWF0b3IgZGV0YWlscyBuZXZlciBjaGFuZ2UgYWZ0ZXIgY29tcG9uZW50IGlzIGNyZWF0ZWQgLSBFbGxhLAorCQkJLy8gMTIvMS8yMDE2CisJCQlzZXJ2aWNlLnNldENyZWF0b3JVc2VySWQodXNlci5nZXRVc2VySWQoKSk7CisJCQlzZXJ2aWNlLnNldENyZWF0b3JGdWxsTmFtZSh1c2VyLmdldEZ1bGxOYW1lKCkpOworCQl9CisKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVTZXJ2aWNlKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5VUERBVEVfU0VSVklDRV9NRVRBREFUQSwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlzZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlTdHJpbmcgc2VydmljZUJvZHlKc29uID0gZ3Nvbi50b0pzb24oc2VydmljZSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBVVCByZXF1ZXN0IHRvIGNyZWF0ZSBzZXJ2aWNlOiB7fSIsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiU2VydmljZSBib2R5OiB7fSIsIHNlcnZpY2VCb2R5SnNvbik7CisKKwkJUmVzdFJlc3BvbnNlIHJlcyA9IHNlbmRQdXQodXJsLCBzZXJ2aWNlQm9keUpzb24sIHVzZXIuZ2V0VXNlcklkKCksIGFjY2VwdEhlYWRlckRhdGEpOworCQlpZiAocmVzLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX0NSRUFURUQpIHsKKwkJCXNlcnZpY2Uuc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzKSk7CisJCQlzZXJ2aWNlLnNldFZlcnNpb24oUmVzcG9uc2VQYXJzZXIuZ2V0VmVyc2lvbkZyb21SZXNwb25zZShyZXMpKTsKKwkJfQorCisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0U2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlUmVxRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1NFUlZJQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJc2VydmljZVJlcURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBnZXRTZXJ2aWNlRnJvbVVybCh1cmwsIHNkbmNNb2RpZmllckRldGFpbHMsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlSWQsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1NFUlZJQ0UsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHNlcnZpY2VJZCk7CisJCXJldHVybiBnZXRTZXJ2aWNlRnJvbVVybCh1cmwsIHNkbmNNb2RpZmllckRldGFpbHMsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBzZXJ2aWNlTmFtZSwKKwkJCVN0cmluZyBzZXJ2aWNlVmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9TRVJWSUNFX0JZX05BTUVfQU5EX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uKTsKKwkJcmV0dXJuIGdldFNlcnZpY2VGcm9tVXJsKHVybCwgc2RuY01vZGlmaWVyRGV0YWlscywgZmFsc2UpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VGcm9tVXJsKFN0cmluZyB1cmwsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgYm9vbGVhbiBpc0NhY2hlZCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHNkbmNNb2RpZmllckRldGFpbHMsIGlzQ2FjaGVkKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gY3JlYXRlIHNlcnZpY2U6IHt9IiwgdXJsKTsKKwkJbG9nZ2VyLmRlYnVnKCJTZXJ2aWNlIGhlYWRlcnM6IHt9IiwgaGVhZGVyc01hcCk7CisJCVJlc3RSZXNwb25zZSBzZW5kR2V0U2VydmVyUmVxdWVzdCA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gc2VuZEdldFNlcnZlclJlcXVlc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByZXBhcmVIZWFkZXJzTWFwKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgYm9vbGVhbiBpc0NhY2hlZCkgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaWYgKGlzQ2FjaGVkKQorCQkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ0FDSEVfQ09OVFJPTC5nZXRWYWx1ZSgpLCBjYWNoZUNvbnRyb2wpOworCisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCXJldHVybiBoZWFkZXJzTWFwOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGFwcHJvdmVTZXJ2aWNlRGlzdHJpYnV0aW9uKFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyB1c2VySWQpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXRlKHNlcnZpY2VJZCwgdXNlcklkLCBVcmxzLkFQUFJPVkVfRElTVFJJQlVUSU9OKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSByZWplY3RTZXJ2aWNlRGlzdHJpYnV0aW9uKFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyB1c2VySWQpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gY2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXRlKHNlcnZpY2VJZCwgdXNlcklkLCBVcmxzLlJFSkVDVF9ESVNUUklCVVRJT04pOworCX0KKworCS8vIEJlbm55CisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgcmVqZWN0U2VydmljZURpc3RyaWJ1dGlvbihTdHJpbmcgc2VydmljZUlkLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgY29tbWVudCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuUkVKRUNUX0RJU1RSSUJVVElPTiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlzZXJ2aWNlSWQpOworCQlTdHJpbmcgdXNlckJvZHlKc29uID0gZ3Nvbi50b0pzb24oY29tbWVudCk7CisJCXJldHVybiBzZW5kUG9zdCh1cmwsIHVzZXJCb2R5SnNvbiwgdXNlcklkLCBhY2NlcHRIZWFkZXJEYXRhKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjaGFuZ2VTZXJ2aWNlRGlzdHJpYnV0aW9uU3RhdGUoU3RyaW5nIHNlcnZpY2VJZCwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGRpc3RyaWJ1dGlvblVybCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KGRpc3RyaWJ1dGlvblVybCwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgc2VydmljZUlkKTsKKwkJU3RyaW5nIGRlZkNvbW1lbnQgPSAieyB1c2VyUmVtYXJrcyA6IFwidGhpcyBpcyBhbiB0ZXN0XCIgfSI7CisJCVN0cmluZyB1c2VyQm9keUpzb24gPSBnc29uLnRvSnNvbihkZWZDb21tZW50KTsKKwkJcmV0dXJuIHNlbmRQb3N0KHVybCwgdXNlckJvZHlKc29uLCB1c2VySWQsIGFjY2VwdEhlYWRlckRhdGEpOworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0U2VydmljZUxhdGVzdFZlcnNpb25MaXN0KFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1NFUlZJQ0VfbEFURVNUX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJcmV0dXJuIHNlbmRHZXQodXJsLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VCeUh0dHBNZXRob2QoU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywKKwkJCVN0cmluZyBtZXRob2QsIFN0cmluZyB1cmxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcChzZG5jTW9kaWZpZXJEZXRhaWxzLCB0cnVlKTsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBzZXJ2aWNlQm9keUpzb24gPSBnc29uLnRvSnNvbihzZXJ2aWNlRGV0YWlscyk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQodXJscywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCS8vIFRPRE86IEFERCBBVVRIRU5USUNBVElPTiBJTiBSRVFVRVNUCisJCWxvZ2dlci5kZWJ1Zyh1cmwpOworCQlsb2dnZXIuZGVidWcoIlNlbmQge30gcmVxdWVzdCB0byBjcmVhdGUgdXNlcjoge30iLCBtZXRob2QsIHVybCk7CisJCWxvZ2dlci5kZWJ1ZygiVXNlciBib2R5OiB7fSIsIHNlcnZpY2VCb2R5SnNvbik7CisJCWxvZ2dlci5kZWJ1ZygiVXNlciBoZWFkZXJzOiB7fSIsIGhlYWRlcnNNYXApOworCQlSZXN0UmVzcG9uc2Ugc2VuZENyZWF0ZVVzZXJSZXF1ZXN0ID0gaHR0cC5odHRwU2VuZEJ5TWV0aG9kKHVybCwgbWV0aG9kLCBzZXJ2aWNlQm9keUpzb24sIGhlYWRlcnNNYXApOworCisJCXJldHVybiBzZW5kQ3JlYXRlVXNlclJlcXVlc3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyBzZXJ2aWNlTmFtZSwKKwkJCVN0cmluZyBzZXJ2aWNlVmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHNkbmNNb2RpZmllckRldGFpbHMsIHRydWUpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkRFTEVURV9TRVJWSUNFX0JZX05BTUVfQU5EX1ZFUlNJT04sIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksCisJCQkJY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uKTsKKwkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc3BvbnNlID0gaHR0cC5odHRwU2VuZERlbGV0ZSh1cmwsIGhlYWRlcnNNYXApOworCisJCXJldHVybiBkZWxldGVSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRGb2xsb3dlZChVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLkdFVF9GT0xMV0VEX0xJU1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlTm90QWJzdGFyY3RSZXNwb25zZSA9IGh0dHBSZXF1ZXN0Lmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIGdldFJlc291cmNlTm90QWJzdGFyY3RSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEpTT05BcnJheSBnZXRMaXN0QXJyYXlGcm9tUmVzdFJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UpIHsKKwkJU3RyaW5nIGpzb24gPSByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwkJSlNPTk9iamVjdCBqc29uUmVzcCA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UoanNvbik7CisJCUpTT05BcnJheSBzZXJ2aWNlc0FycmF5ID0gKEpTT05BcnJheSkganNvblJlc3AuZ2V0KCJzZXJ2aWNlcyIpOworCisJCWxvZ2dlci5kZWJ1Zygic2VydmljZXMgPSB7fSIsIHNlcnZpY2VzQXJyYXkpOworCisJCXJldHVybiBzZXJ2aWNlc0FycmF5OworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvVXNlclJlc3RVdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3Jlc3QvVXNlclJlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjM5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvcmVzdC9Vc2VyUmVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuVXJsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW4uU3RhcnRUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIFVzZXJSZXN0VXRpbHMgZXh0ZW5kcyBCYXNlUmVzdFV0aWxzIHsKKworCXN0YXRpYyBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVc2VyUmVzdFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisJc3RhdGljIFN0cmluZyBjb250ZW50VHlwZUhlYWRlckRhdGEgPSAiYXBwbGljYXRpb24vanNvbiI7CisJc3RhdGljIFN0cmluZyBhY2NlcHRIZWFkZXJEYXRlID0gImFwcGxpY2F0aW9uL2pzb24iOworCisJcHVibGljIFVzZXJSZXN0VXRpbHMoKSB7CisJCXN1cGVyKCk7CisKKwkJU3RhcnRUZXN0LmVuYWJsZUxvZ2dlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZVVzZXIoVXNlciBzZG5jVXNlckRldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKHNkbmNVc2VyRGV0YWlscyk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5DUkVBVEVfVVNFUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJTZW5kIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgdXNlcjoge30iLCB1cmwpOworCQlsb2dnZXIuZGVidWcoIlVzZXIgYm9keToge30iLCB1c2VyQm9keUpzb24pOworCQlsb2dnZXIuZGVidWcoIlVzZXIgaGVhZGVyczoge30iLCBoZWFkZXJzTWFwKTsKKwkJUmVzdFJlc3BvbnNlIHNlbmRDcmVhdGVVc2VyUmVxdWVzdCA9IGh0dHAuaHR0cFNlbmRQb3N0KHVybCwgdXNlckJvZHlKc29uLCBoZWFkZXJzTWFwKTsKKworCQlyZXR1cm4gc2VuZENyZWF0ZVVzZXJSZXF1ZXN0OworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZGVhY3RpdmF0ZVVzZXIoVXNlciBzZG5jVXNlckRldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRlbGV0ZVVzZXIoc2RuY1VzZXJEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZUFjdGl2YXRlVXNlcihVc2VyIHNkbmNVc2VyRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZGVsZXRlVXNlcihzZG5jVXNlckRldGFpbHMsIHNkbmNNb2RpZmllckRldGFpbHMsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBkZWxldGVVc2VyKFVzZXIgc2RuY1VzZXJEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIGJvb2xlYW4gaXNGb3JjZURlbGV0ZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlpZiAoaXNGb3JjZURlbGV0ZSkgeworCQkJaGVhZGVyc01hcC5wdXQoVXNlci5GT1JDRV9ERUxFVEVfSEVBREVSX0ZMQUcsIFVzZXIuRk9SQ0VfREVMRVRFX0hFQURFUl9GTEFHKTsKKwkJfQorCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ERUxFVEVfVVNFUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwKKwkJCQlzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlSZXN0UmVzcG9uc2Ugc2VuZERlbGV0ZVVzZXJSZXF1ZXN0ID0gaHR0cC5odHRwU2VuZERlbGV0ZSh1cmwsIGhlYWRlcnNNYXApOworCQlyZXR1cm4gc2VuZERlbGV0ZVVzZXJSZXF1ZXN0OworCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBkYXRlVXNlcihVc2VyIHNkbmNVc2VyRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcihzZG5jTW9kaWZpZXJEZXRhaWxzKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQl1c2VyLnNldFVzZXJJZChTdHJpbmdVdGlscy5FTVBUWSk7CisJCXVzZXIuc2V0Um9sZShTdHJpbmdVdGlscy5FTVBUWSk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJU3RyaW5nIHVzZXJCb2R5SnNvbiA9IGdzb24udG9Kc29uKHVzZXIpOworCQlsb2dnZXIuZGVidWcoInVzZXJCb2R5SnNvbjoge30iLCB1c2VyQm9keUpzb24pOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVVBEQVRFX1VTRVIsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCVJlc3RSZXNwb25zZSBzZW5kVXBkYXRlVXNlclJlcXVlc3QgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIHVzZXJCb2R5SnNvbiwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRVcGRhdGVVc2VyUmVxdWVzdDsKKwl9CisKKwkvLy8gQmVubnkKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSB1cGRhdGVVc2VyUm9sZShVc2VyIHNkbmNVc2VyRGV0YWlscywgVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgdXNlcklkVG9VcGRhdGUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgdXNlckJvZHlKc29uID0gZ3Nvbi50b0pzb24oc2RuY1VzZXJEZXRhaWxzKTsKKwkJbG9nZ2VyLmRlYnVnKCJ1c2VyQm9keUpzb246IHt9IiwgdXNlckJvZHlKc29uKTsKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChVcmxzLlVQREFURV9VU0VSX1JPTEUsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJdXNlcklkVG9VcGRhdGUpOworCQlSZXN0UmVzcG9uc2Ugc2VuZFVwZGF0ZVVzZXJSZXF1ZXN0ID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCB1c2VyQm9keUpzb24sIGhlYWRlcnNNYXApOworCisJCXJldHVybiBzZW5kVXBkYXRlVXNlclJlcXVlc3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRVc2VyKFVzZXIgc2RuY1VzZXJEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1VTRVIsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksCisJCQkJc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJUmVzdFJlc3BvbnNlIHNlbmRHZXRVc2VyUmVxdWVzdCA9IGh0dHAuaHR0cFNlbmRHZXQodXJsLCBoZWFkZXJzTWFwKTsKKwkJcmV0dXJuIHNlbmRHZXRVc2VyUmVxdWVzdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldEFsbEFkbWluVXNlcnMoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksIGNvbnRlbnRUeXBlSGVhZGVyRGF0YSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCBhY2NlcHRIZWFkZXJEYXRlKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKworCQkvLyBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQkvLyBTdHJpbmcgdXNlckJvZHlKc29uID0gZ3Nvbi50b0pzb24oc2RuY01vZGlmaWVyRGV0YWlscyk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih1c2VyQm9keUpzb24pOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9BRE1JTl9VU0VSUywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBmb2xsb3dpbmcgdXJsOiB7fSBhbmQgaGVhZGVyczoge30iLCB1cmwsIGhlYWRlcnNNYXAudG9TdHJpbmcoKSk7CisJCVJlc3RSZXNwb25zZSBzZW5kR2V0VXNlclJlcXVlc3QgPSBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHNlbmRHZXRVc2VyUmVxdWVzdDsKKworCX0KKworCS8vIFVTNTcxMjU1CisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0VXNlcnNCeVJvbGVzKFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJvbGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCBjb250ZW50VHlwZUhlYWRlckRhdGEpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgYWNjZXB0SGVhZGVyRGF0ZSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlTdHJpbmcgdXJsOworCQlpZiAocm9sZXMgPT0gIi8iKSB7CisJCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX0FMTF9VU0VSUywgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCX0gZWxzZSB7CisJCQl1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1VTRVJTX0JZX1JPTEVTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCByb2xlcyk7CisKKwkJfQorCQlsb2dnZXIuZGVidWcoIlNlbmQgZm9sbG93aW5nIHVybDoge30gYW5kIGhlYWRlcnM6IHt9IiwgdXJsLCBoZWFkZXJzTWFwLnRvU3RyaW5nKCkpOworCQlSZXN0UmVzcG9uc2Ugc2VuZEdldFVzZXJSZXF1ZXN0ID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCQlyZXR1cm4gc2VuZEdldFVzZXJSZXF1ZXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldFVzZXJzQnlSb2xlc0h0dHBDc3BBdHVVaWRJc01pc3NpbmcoVXNlciBzZG5jTW9kaWZpZXJEZXRhaWxzLCBTdHJpbmcgcm9sZXMpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgY29udGVudFR5cGVIZWFkZXJEYXRhKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksIGFjY2VwdEhlYWRlckRhdGUpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQloZWFkZXJzTWFwLnJlbW92ZSgiVVNFUl9JRCIpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1VTRVJTX0JZX1JPTEVTLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLAorCQkJCXJvbGVzKTsKKwkJbG9nZ2VyLmRlYnVnKAorCQkJCSJTZW5kIGZvbGxvd2luZyB1cmwgd2l0aG91dCBVU0VSX0lEIGhlYWRlciA6ICIgKyB1cmwgKyAiICBoZWFkZXJzOiAiICsgaGVhZGVyc01hcC50b1N0cmluZygpKTsKKworCQlSZXN0UmVzcG9uc2Ugc2VuZEdldFVzZXJSZXF1ZXN0ID0gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCQlyZXR1cm4gc2VuZEdldFVzZXJSZXF1ZXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGF1dGhvcml6ZWRVc2VyVG93YXJkc0NhdGFsb2dCZShVc2VyIHNkbmNVc2VyRGV0YWlscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCWlmIChzZG5jVXNlckRldGFpbHMuZ2V0Rmlyc3ROYW1lKCkgIT0gbnVsbCkgeworCQkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uSFRUUF9DU1BfRklSU1ROQU1FLmdldFZhbHVlKCksIHNkbmNVc2VyRGV0YWlscy5nZXRGaXJzdE5hbWUoKSk7CisJCX0KKwkJaWYgKHNkbmNVc2VyRGV0YWlscy5nZXRMYXN0TmFtZSgpICE9IG51bGwpIHsKKwkJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkhUVFBfQ1NQX0xBU1ROQU1FLmdldFZhbHVlKCksIHNkbmNVc2VyRGV0YWlscy5nZXRMYXN0TmFtZSgpKTsKKwkJfQorCQlpZiAoc2RuY1VzZXJEZXRhaWxzLmdldEVtYWlsKCkgIT0gbnVsbCkgeworCQkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uSFRUUF9DU1BfRU1BSUwuZ2V0VmFsdWUoKSwgc2RuY1VzZXJEZXRhaWxzLmdldEVtYWlsKCkpOworCQl9CisKKwkJbG9nZ2VyLmRlYnVnKCJoZWFkZXJzTWFwOiB7fSIsIGhlYWRlcnNNYXAudG9TdHJpbmcoKSk7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuQVVUSE9SSVpFX1VTRVIsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCQlsb2dnZXIuZGVidWcoIlNlbmQgR0VUIHJlcXVlc3QgdG8gbG9naW4gYXMgc2VhbCB1c2VyIDoge30iLCB1cmwpOworCQlyZXR1cm4gaHR0cC5odHRwU2VuZEdldCh1cmwsIGhlYWRlcnNNYXApOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGF1dGhvcml6ZWRVc2VyVG93YXJkc0NhdGFsb2dCZVFBKFVzZXIgc2RuY1VzZXJEZXRhaWxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5DT05URU5UX1RZUEUuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLlVTRVJfSUQuZ2V0VmFsdWUoKSwgc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpKTsKKwkJaWYgKHNkbmNVc2VyRGV0YWlscy5nZXRGaXJzdE5hbWUoKSAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5IVFRQX0NTUF9GSVJTVE5BTUUuZ2V0VmFsdWUoKSwgc2RuY1VzZXJEZXRhaWxzLmdldEZpcnN0TmFtZSgpKTsKKwkJfQorCQlpZiAoc2RuY1VzZXJEZXRhaWxzLmdldExhc3ROYW1lKCkgIT0gbnVsbCkgeworCQkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uSFRUUF9DU1BfTEFTVE5BTUUuZ2V0VmFsdWUoKSwgc2RuY1VzZXJEZXRhaWxzLmdldExhc3ROYW1lKCkpOworCQl9CisJCWlmIChzZG5jVXNlckRldGFpbHMuZ2V0RW1haWwoKSAhPSBudWxsKSB7CisJCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5IVFRQX0NTUF9FTUFJTC5nZXRWYWx1ZSgpLCBzZG5jVXNlckRldGFpbHMuZ2V0RW1haWwoKSk7CisJCX0KKworCQlsb2dnZXIuZGVidWcoImhlYWRlcnNNYXA6IHt9IiwgaGVhZGVyc01hcC50b1N0cmluZygpKTsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5BVVRIT1JJWkVfVVNFUiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisJCWxvZ2dlci5kZWJ1ZygiU2VuZCBHRVQgcmVxdWVzdCB0byBsb2dpbiBhcyBzZWFsIHVzZXIgOiB7fSIsIHVybCk7CisJCXJldHVybiBodHRwLmh0dHBTZW5kR2V0KHVybCwgaGVhZGVyc01hcCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9BcnRpZmFjdFZhbGlkYXRpb25VdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWI1MjBjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vQXJ0aWZhY3RWYWxpZGF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDIyOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5Kc29uUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uSnNvblByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGVjb2RlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKKworcHVibGljIGNsYXNzIEFydGlmYWN0VmFsaWRhdGlvblV0aWxzIHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZXNjID0gImRlc2NyaXB0aW9uIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RUeXBlID0gImFydGlmYWN0VHlwZSI7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFydGlmYWN0TmFtZSA9ICJhcnRpZmFjdE5hbWUiOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBhcnRpZmFjdENoZWNrc3VtID0gImFydGlmYWN0Q2hlY2tzdW0iOworCXByaXZhdGUgc3RhdGljIFN0cmluZyB1bmlxdWVJZCA9ICJ1bmlxdWVJZCI7CisJcHJvdGVjdGVkIFV0aWxzIHV0aWxzOworCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlSW5mb3JtYXRpb25hbEFydGlmYWN0KEFydGlmYWN0UmVxRGV0YWlscyBleHBlY3RlZEFydGlmYWN0LAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhY3R1YWxBcnRpZmFjdCkgeworCQlhc3NlcnRUcnVlKCJkZXNjcmlwdGlvbiBpcyBub3QgYXMgZXhwZWN0ZWQiLAorCQkJCWV4cGVjdGVkQXJ0aWZhY3QuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoYWN0dWFsQXJ0aWZhY3QuZ2V0KGRlc2MpLnRvU3RyaW5nKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgiYXJ0aWZhY3RUeXBlIGlzIG5vdCBhcyBleHBlY3RlZCIsCisJCQkJZXhwZWN0ZWRBcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKS50b1VwcGVyQ2FzZSgpLmVxdWFscyhhY3R1YWxBcnRpZmFjdC5nZXQoYXJ0aWZhY3RUeXBlKS50b1N0cmluZygpKSk7CisJCWFzc2VydFRydWUoImFydGlmYWN0TmFtZSBpcyBub3QgYXMgZXhwZWN0ZWQiLAorCQkJCWV4cGVjdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzKGFjdHVhbEFydGlmYWN0LmdldChhcnRpZmFjdE5hbWUpLnRvU3RyaW5nKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgidW5pcXVlSWQgaXMgbm90IGFzIGV4cGVjdGVkIiwKKwkJCQlleHBlY3RlZEFydGlmYWN0LmdldFVuaXF1ZUlkKCkuZXF1YWxzKGFjdHVhbEFydGlmYWN0LmdldCh1bmlxdWVJZCkudG9TdHJpbmcoKSkpOworCQlhc3NlcnRUcnVlKCJkZXNjcmlwdGlvbiBpcyBub3QgYXMgZXhwZWN0ZWQiLCBleHBlY3RlZEFydGlmYWN0LmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpCisJCQkJLmVxdWFscyhhY3R1YWxBcnRpZmFjdC5nZXQoImFydGlmYWN0TGFiZWwiKS50b1N0cmluZygpKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXJ0aWZhY3RzTnVtYmVySW5Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtIGFydGlmYWN0R3JvdXBUeXBlLAorCQkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUsIGludCBleHBlY3RlZE51bWJlcikgeworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHM7CisJCWludCBjb3VudGVyID0gMDsKKwkJaWYgKGFydGlmYWN0R3JvdXBUeXBlID09IEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5UKSB7CisJCQlkZXBsb3ltZW50QXJ0aWZhY3RzID0gY29tcG9uZW50LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJfSBlbHNlIHsKKwkJCWRlcGxveW1lbnRBcnRpZmFjdHMgPSBjb21wb25lbnQuZ2V0QXJ0aWZhY3RzKCk7CisJCX0KKwkJaWYgKGRlcGxveW1lbnRBcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uIDogZGVwbG95bWVudEFydGlmYWN0cy52YWx1ZXMoKSkgeworCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzKGFydGlmYWN0VHlwZS5nZXRUeXBlKCkpKSB7CisJCQkJCWNvdW50ZXIrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiAiICsgYXJ0aWZhY3RHcm91cFR5cGUuZ2V0VHlwZSgpICsgIiBhcnRpZmFjdHMgaW4gY29tcG9uZW50IiwgZXhwZWN0ZWROdW1iZXIsCisJCQkJY291bnRlcik7CisJfQorCisJLy8gQmVubnkKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVBcnRpZmFjdHNOdW1iZXJJbkNvbXBvbmVudEluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLAorCQkJQXJ0aWZhY3RHcm91cFR5cGVFbnVtIGFydGlmYWN0R3JvdXBUeXBlLCBBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSwgaW50IGV4cGVjdGVkTnVtYmVyKSB7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IG51bGw7CisJCWludCBjb3VudGVyID0gMDsKKwkJaWYgKGFydGlmYWN0R3JvdXBUeXBlID09IEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5UKSB7CisJCQlkZXBsb3ltZW50QXJ0aWZhY3RzID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQl9CisJCWlmIChkZXBsb3ltZW50QXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IGRlcGxveW1lbnRBcnRpZmFjdHMudmFsdWVzKCkpIHsKKwkJCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhhcnRpZmFjdFR5cGUuZ2V0VHlwZSgpKSkgeworCQkJCQljb3VudGVyKys7CisJCQkJfQorCQkJfQorCQl9CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgIiArIGFydGlmYWN0R3JvdXBUeXBlLmdldFR5cGUoKSArICIgYXJ0aWZhY3RzIGluIGNvbXBvbmVudCIsIGV4cGVjdGVkTnVtYmVyLAorCQkJCWNvdW50ZXIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRVNBcnRpZmFjdERhdGEgcGFyc2VBcnRpZmFjdFJlc3BGcm9tRVMoUmVzdFJlc3BvbnNlIHJlc1Jlc3BvbnNlKQorCQkJdGhyb3dzIEpzb25QYXJzZUV4Y2VwdGlvbiwgSnNvblByb2Nlc3NpbmdFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBib2R5VG9QYXJzZSA9IHJlc1Jlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisJCUpzb25FbGVtZW50IGpFbGVtZW50ID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShib2R5VG9QYXJzZSk7CisJCUpzb25FbGVtZW50IGpzb3VyY2VFbGVtZW50ID0gakVsZW1lbnQuZ2V0QXNKc29uT2JqZWN0KCkuZ2V0KCJfc291cmNlIik7CisKKwkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJRVNBcnRpZmFjdERhdGEgZXNBcnRpZmFjdE9iamVjdCA9IG1hcHBlci5yZWFkVmFsdWUoanNvdXJjZUVsZW1lbnQudG9TdHJpbmcoKSwgRVNBcnRpZmFjdERhdGEuY2xhc3MpOworCisJCS8vIGxvZ2dlci5kZWJ1ZygiZ290IGFydGlmYWN0IGRldGFpbHMgZnJvbSBFbGFzdGljU2VhcmNoIGFzIGpzb24iKTsKKworCQlyZXR1cm4gZXNBcnRpZmFjdE9iamVjdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUFydGlmYWN0UmVxVnNSZXNwKEFydGlmYWN0UmVxRGV0YWlscyBleHBlY3RlZEFydGlmYWN0RGV0YWlscywKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhY3R1YWxBcnRpZmFjdEphdmFPYmplY3QpIHsKKwkJU3RyaW5nIGV4cGVjdGVkOworCisJCWV4cGVjdGVkID0gZXhwZWN0ZWRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCk7CisJCWlmIChleHBlY3RlZCA9PSBudWxsKQorCQkJZXhwZWN0ZWQgPSAiIjsKKwkJYXNzZXJ0RXF1YWxzKCJhcnRpZmFjdCBuYW1lIGlzIG5vdCBjb3JyZWN0ICIsIGV4cGVjdGVkLCBhY3R1YWxBcnRpZmFjdEphdmFPYmplY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCisJCWV4cGVjdGVkID0gZXhwZWN0ZWRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3RUeXBlKCk7CisJCWlmIChleHBlY3RlZCA9PSBudWxsKQorCQkJZXhwZWN0ZWQgPSAiIjsKKwkJYXNzZXJ0RXF1YWxzKCJhcnRpZmFjdCB0eXBlIGlzIG5vdCBjb3JyZWN0ICIsIGV4cGVjdGVkLCBhY3R1YWxBcnRpZmFjdEphdmFPYmplY3QuZ2V0QXJ0aWZhY3RUeXBlKCkpOworCisJCWV4cGVjdGVkID0gZXhwZWN0ZWRBcnRpZmFjdERldGFpbHMuZ2V0RGVzY3JpcHRpb24oKTsKKwkJaWYgKGV4cGVjdGVkID09IG51bGwpCisJCQlleHBlY3RlZCA9ICIiOworCQlhc3NlcnRFcXVhbHMoImFydGlmYWN0IGRlc2NyaXB0aW9uIGlzIG5vdCBjb3JyZWN0ICIsIGV4cGVjdGVkLCBhY3R1YWxBcnRpZmFjdEphdmFPYmplY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJZXhwZWN0ZWQgPSBleHBlY3RlZEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdExhYmVsKCk7CisJCWlmIChleHBlY3RlZCA9PSBudWxsIHx8IGV4cGVjdGVkID09ICIiKSB7CisJCQlleHBlY3RlZCA9IGV4cGVjdGVkQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3Vic3RyaW5nKDAsCisJCQkJCWV4cGVjdGVkQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpLmxhc3RJbmRleE9mKCIuIikpOworCQkJLy8gZXhwZWN0ZWQgPSB0bXAuc3Vic3RyaW5nKDAsCisJCQkvLyBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkubGFzdEluZGV4T2YoIi4iKSk7CisJCX0KKwkJYXNzZXJ0RXF1YWxzKCJhcnRpZmFjdCBsYWJlbCBpcyBub3QgY29ycmVjdCAiLCBleHBlY3RlZCwgYWN0dWFsQXJ0aWZhY3RKYXZhT2JqZWN0LmdldEFydGlmYWN0TGFiZWwoKSk7CisKKwkJZXhwZWN0ZWQgPSBleHBlY3RlZEFydGlmYWN0RGV0YWlscy5nZXRVcmwoKTsKKwkJaWYgKGV4cGVjdGVkICE9ICIiKSB7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbEFydGlmYWN0SmF2YU9iamVjdC5nZXRBcGlVcmwoKSk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpLAorCQkJCQlhY3R1YWxBcnRpZmFjdEphdmFPYmplY3QuZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKTsKKwkJfQorCisJCS8vIGFzc2VydEVxdWFscyh2YWxpZENoZWNrc3VtLAorCQkvLyBhY3R1YWxBcnRpZmFjdEphdmFPYmplY3QuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpKTsKKworCQkvLyBleHBlY3RlZCA9IGV4cGVjdGVkQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKTsKKwkJLy8gaWYgKGV4cGVjdGVkICE9ICIiKQorCQkvLyB7CisJCS8vIGFzc2VydEVxdWFscyhleHBlY3RlZCwKKwkJLy8gYWN0dWFsQXJ0aWZhY3RKYXZhT2JqZWN0LmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSk7CisJCS8vIH0KKworCQlib29sZWFuIGFjdHVhbCA9IGFjdHVhbEFydGlmYWN0SmF2YU9iamVjdC5nZXRNYW5kYXRvcnkoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQXJ0aWZhY3REZXRhaWxzLmlzTWFuZGF0b3J5KCksIGFjdHVhbCk7CisKKwkJaWYgKGFjdHVhbEFydGlmYWN0SmF2YU9iamVjdC5nZXRTZXJ2aWNlQXBpKCkpIHsKKworCQkJYm9vbGVhbiBhY3R1YWwyID0gYWN0dWFsQXJ0aWZhY3RKYXZhT2JqZWN0LmdldFNlcnZpY2VBcGkoKTsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZEFydGlmYWN0RGV0YWlscy5pc1NlcnZpY2VBcGkoKSwgYWN0dWFsMik7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUVzQXJ0aWZhY3RSZXFWc1Jlc3AoQXJ0aWZhY3RSZXFEZXRhaWxzIGV4cGVjdGVkQXJ0aWZhY3RJbmZvLAorCQkJRVNBcnRpZmFjdERhdGEgZXNBcnRpZmFjdERhdGEpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZXhwZWN0ZWRBcnRpZmFjdFVpZCA9IGV4cGVjdGVkQXJ0aWZhY3RJbmZvLmdldFVuaXF1ZUlkKCk7CisJCWlmIChleHBlY3RlZEFydGlmYWN0VWlkID09IG51bGwpCisJCQlleHBlY3RlZEFydGlmYWN0VWlkID0gIiI7CisJCWFzc2VydEVxdWFscygiYXJ0aWZhY3QgbmFtZSBpcyBub3QgY29ycmVjdCAiLCBleHBlY3RlZEFydGlmYWN0VWlkLCBlc0FydGlmYWN0RGF0YS5nZXRJZCgpKTsKKworCQlTdHJpbmcgYWN0dWFsUGF5bG9hZCA9IERlY29kZXIuZW5jb2RlKGVzQXJ0aWZhY3REYXRhLmdldERhdGEoKS5hcnJheSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhcnRpZmFjdCBwYXlsb2FkRGF0YSBpcyBub3QgY29ycmVjdCAiLCBleHBlY3RlZEFydGlmYWN0SW5mby5nZXRQYXlsb2FkKCksIGFjdHVhbFBheWxvYWQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldExpc3RPZkFydGlmYWN0RnJvbUZvbGRlcihTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBzb3VyY2VEaXIgPSBjb25maWcuZ2V0UmVzb3VyY2VDb25maWdEaXIoKTsKKwkJU3RyaW5nIHRlc3RSZXNvdXJjZXNQYXRoID0gc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXJOYW1lOworCQlMaXN0PFN0cmluZz4gbGlzdG9mRmlsZXMgPSBGaWxlVXRpbHMuZ2V0RmlsZUxpc3RGcm9tQmFzZURpcmVjdG9yeUJ5VGVzdE5hbWUodGVzdFJlc291cmNlc1BhdGgpOworCQlyZXR1cm4gbGlzdG9mRmlsZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFJlcURldGFpbHMgcmVwbGFjZURlZmF1bHRBcnRXaXRoQXJ0RnJvbUxpc3RfKEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzLAorCQkJU3RyaW5nIGhlYXRFeHRlbnNpb24sIFN0cmluZyBmb2xkZXJOYW1lLCBpbnQgcG9zaXRpb25Jbmxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBleHQgPSBoZWF0RXh0ZW5zaW9uOworCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldFJlc291cmNlQ29uZmlnRGlyKCk7CisJCVN0cmluZyB0ZXN0UmVzb3VyY2VzUGF0aCA9IHNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgZm9sZGVyTmFtZTsKKwkJTGlzdDxTdHJpbmc+IGxpc3RGaWxlTmFtZSA9IEZpbGVVdGlscy5nZXRGaWxlTGlzdEZyb21CYXNlRGlyZWN0b3J5QnlUZXN0TmFtZSh0ZXN0UmVzb3VyY2VzUGF0aCk7CisJCS8vIGxvZ2dlci5kZWJ1ZygibGlzdEZpbGVOYW1lOiB7fSIsIGxpc3RGaWxlTmFtZS5nZXQocG9zaXRpb25Jbmxpc3QpKTsKKwkJU3RyaW5nIHBheWxvYWQgPSBGaWxlVXRpbHMubG9hZFBheWxvYWRGaWxlKGxpc3RGaWxlTmFtZSwgZXh0LCB0cnVlKTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZShsaXN0RmlsZU5hbWUuZ2V0KHBvc2l0aW9uSW5saXN0KSArICIuIiArIGV4dCk7CisJCXJldHVybiBoZWF0QXJ0aWZhY3REZXRhaWxzOworCX0KKworCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RSZXFEZXRhaWxzIHJlcGxhY2VEZWZhdWx0QXJ0V2l0aEFydEZyb21MaXN0KEFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzLAorCQkJU3RyaW5nIGhlYXRFeHRlbnNpb24sIFN0cmluZyBmb2xkZXJOYW1lLCBpbnQgcG9zaXRpb25Jbmxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IGxpc3RPZkFydGlmYWN0RnJvbUZvbGRlciA9IGdldExpc3RPZkFydGlmYWN0RnJvbUZvbGRlcihmb2xkZXJOYW1lKTsKKwkJLy8gbG9nZ2VyLmRlYnVnKCJsaXN0RmlsZU5hbWU6IHt9IiwgbGlzdE9mQXJ0aWZhY3RGcm9tRm9sZGVyLmdldChwb3NpdGlvbklubGlzdCkpOworCQlTdHJpbmcgcGF5bG9hZCA9IEZpbGVVdGlscy5sb2FkUGF5bG9hZEZpbGVGcm9tTGlzdFVzaW5nUG9zaXRpb24obGlzdE9mQXJ0aWZhY3RGcm9tRm9sZGVyLCBoZWF0RXh0ZW5zaW9uLCB0cnVlLAorCQkJCXBvc2l0aW9uSW5saXN0KTsKKwkJaGVhdEFydGlmYWN0RGV0YWlscy5zZXRQYXlsb2FkKHBheWxvYWQpOworCQloZWF0QXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZShoZWF0QXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpCisJCQkJKyBsaXN0T2ZBcnRpZmFjdEZyb21Gb2xkZXIuZ2V0KHBvc2l0aW9uSW5saXN0KSArICIuIiArIGhlYXRFeHRlbnNpb24pOworCQlyZXR1cm4gaGVhdEFydGlmYWN0RGV0YWlsczsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9BdWRpdFZhbGlkYXRpb25VdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vQXVkaXRWYWxpZGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODI0OThhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vQXVkaXRWYWxpZGF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDEzMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmphdmF0dXBsZXMuUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5Lkdyb3VwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkF1ZGl0RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXVkaXRKc29uS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRBdXRoZW50aWNhdGlvbkF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZENhdGVnb3J5QXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkRXh0ZXJuYWxBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRHZXRVc2VyTGlzdEF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFByb2R1Y3RBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZXhwZWN0ZWQuRXhwZWN0ZWRVc2VyQ1JVREF1ZGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW4uU3RhcnRUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLkFydGlmYWN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuY2Fzc2FuZHJhLkNhc3NhbmRyYVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNhdGVnb3J5UmVzdFV0aWxzLkNhdGVnb3J5QXVkaXRKc29uS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Db25zdW1lclJlc3RVdGlscy5FY29tcENvbnN1bWVyQXVkaXRKc29uS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNvbHVtbkRlZmluaXRpb25zOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Sb3c7CisKK3B1YmxpYyBjbGFzcyBBdWRpdFZhbGlkYXRpb25VdGlscyB7CisJcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihBdWRpdFZhbGlkYXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBhdWRpdEtleVNwYWNlTmFtZSA9ICJzZGNhdWRpdCI7CisKKwlwdWJsaWMgQXVkaXRWYWxpZGF0aW9uVXRpbHMoKSB7CisJCXN1cGVyKCk7CisKKwkJU3RhcnRUZXN0LmVuYWJsZUxvZ2dlcigpOworCQlsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEF1ZGl0RGVzY3JpcHRpb24oRXJyb3JJbmZvIGVycm9ySW5mbywgTGlzdDxTdHJpbmc+IHZhcmlhYmxlcykgeworCisJCVN0cmluZyBhdWRpdERlc2MgPSBlcnJvckluZm8uZ2V0TWVzc2FnZUlkKCkgKyAiOiAiICsgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMuc2l6ZSgpOyBpKyspIHsKKwkJCWlmIChhdWRpdERlc2MuY29udGFpbnMoIiUiICsgKGkgKyAxKSkpIHsKKwkJCQlhdWRpdERlc2MgPSBhdWRpdERlc2MucmVwbGFjZSgiJSIgKyAoaSArIDEpLCB2YXJpYWJsZXMuZ2V0KGkpKTsKKwkJCX0KKwkJfQorCisJCS8vIGxvZ2dlci5kZWJ1ZygiYXVkaXQgZGVzY3JpcHRpb24gLSB7fSIsIGF1ZGl0RGVzYyk7CisJCXJldHVybiBhdWRpdERlc2M7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kaWZpZXJTdHJpbmcoU3RyaW5nIHVzZXJOYW1lLCBTdHJpbmcgdWlkKSB7CisKKwkJaWYgKHVzZXJOYW1lLmlzRW1wdHkoKSAmJiB1aWQuaXNFbXB0eSgpKQorCQkJcmV0dXJuICIoVU5LTk9XTikiOworCisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlzYi5hcHBlbmQodXNlck5hbWUpLmFwcGVuZCgiKCIpLmFwcGVuZCh1aWQpLmFwcGVuZCgiKSIpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUF1ZGl0RG93bmxvYWRFeHRlcm5hbEFQSShFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LAorCQkJU3RyaW5nIGFjdGlvbiwgU3RyaW5nIGJvZHksIGJvb2xlYW4gY2hlY2tBbGxGaWVsZHMpIHRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFjdHVhbEF1ZGl0UmVjb3JkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkvLyBBbmRyZXkncyBjb21tZW50CisJCS8vIGFjdHVhbEF1ZGl0UmVjb3JkcyA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgYm9keSk7CisJCWFjdHVhbEF1ZGl0UmVjb3JkcyA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgbnVsbCk7CisKKwkJLy8gTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBhY3R1YWxBdWRpdFJlY29yZHMgPSBuZXcKKwkJLy8gQXJyYXlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KCk7CisJCS8vIGFjdHVhbEF1ZGl0UmVjb3JkcyA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uVG9MaXN0KGFjdGlvbiwgYm9keSk7CisKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsIEF1ZGl0SnNvbktleXNFbnVtLkFDVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIGFjdGlvbik7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLCBBdWRpdEpzb25LZXlzRW51bS5SRVNPVVJDRV9OQU1FLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRSZXNvdXJjZU5hbWUoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLCBBdWRpdEpzb25LZXlzRW51bS5SRVNPVVJDRV9UWVBFLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKSk7CisKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsIEF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0U3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkcywgQXVkaXRKc29uS2V5c0VudW0uREVTQ1JJUFRJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldERlc2MoKSk7CisKKwkJLy8gdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsCisJCS8vIEF1ZGl0SnNvbktleXNFbnVtLkNPTlNVTUVSX0lELmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJLy8gcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0Q09OU1VNRVJfSUQoKSk7CisJCS8vIHZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLAorCQkvLyBBdWRpdEpzb25LZXlzRW51bS5SRVNPVVJDRV9VUkwuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkvLyByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRSRVNPVVJDRV9VUkwoKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVBdWRpdChFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBTdHJpbmcgYWN0aW9uLAorCQkJU3RyaW5nIGJvZHksIGJvb2xlYW4gY2hlY2tBbGxGaWVsZHMpIHRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFjdHVhbEF1ZGl0UmVjb3JkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkvLyBBbmRyZXkncyBjb21tZW50CisJCS8vIGFjdHVhbEF1ZGl0UmVjb3JkcyA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgYm9keSk7CisJCWFjdHVhbEF1ZGl0UmVjb3JkcyA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgbnVsbCk7CisKKwkJaWYgKChyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRNb2RpZmllck5hbWUoKSAhPSBudWxsKSAmJiAocmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXJVaWQoKSAhPSBudWxsKSkgeworCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoZ2V0TW9kaWZpZXJTdHJpbmcocmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXJOYW1lKCksCisJCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldE1vZGlmaWVyVWlkKCkpKTsKKwkJfQorCisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLCBBdWRpdEpzb25LZXlzRW51bS5BQ1RJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBhY3Rpb24pOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkcywgQXVkaXRKc29uS2V5c0VudW0uUkVTT1VSQ0VfTkFNRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0UmVzb3VyY2VOYW1lKCkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkcywgQXVkaXRKc29uS2V5c0VudW0uUkVTT1VSQ0VfVFlQRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0UmVzb3VyY2VUeXBlKCkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkcywgQXVkaXRKc29uS2V5c0VudW0uUFJFVl9WRVJTSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRQcmV2VmVyc2lvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfVkVSU0lPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0Q3VyclZlcnNpb24oKSk7CisKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsIEF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRNb2RpZmllclVpZCgpKTsKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsIEF1ZGl0SnNvbktleXNFbnVtLlBSRVZfU1RBVEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFByZXZTdGF0ZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfU1RBVEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEN1cnJTdGF0ZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZHMsIEF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0U3RhdHVzKCkpOworCQkvLyB2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCS8vIERvdWJsZS5wYXJzZURvdWJsZShyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRTdGF0dXMoKSkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkcywgQXVkaXRKc29uS2V5c0VudW0uREVTQ1JJUFRJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldERlc2MoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLCBBdWRpdEpzb25LZXlzRW51bS5DT01NRU5ULmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRDb21tZW50KCkpOworCQkvLyB2YWxpZGF0ZUZpZWxkKG1hcDIsCisJCS8vIEF1ZGl0SnNvbktleXNFbnVtLkFSVElGQUNUX0RBVEEuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkvLyByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRBcnRpZmFjdERhdGEoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLCBBdWRpdEpzb25LZXlzRW51bS5UT1NDQV9OT0RFX1RZUEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFRvc2NhTm9kZVR5cGUoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLCBBdWRpdEpzb25LZXlzRW51bS5DVVJSX0FSVElGQUNUX1VVSUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEN1cnJBcnRpZmFjdFV1aWQoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmRzLCBBdWRpdEpzb25LZXlzRW51bS5QUkVWX0FSVElGQUNUX1VVSUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFByZXZBcnRpZmFjdFV1aWQoKSk7CisKKwkJdmFsaWRhdGVBdGlmYWN0RGF0YUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkcywgQXVkaXRKc29uS2V5c0VudW0uQVJUSUZBQ1RfREFUQS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0QXJ0aWZhY3REYXRhKCksIGNoZWNrQWxsRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVFeHRlcm5hbEF1ZGl0KEV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHRlcm5hbEF1ZGl0T2JqZWN0LCBTdHJpbmcgYWN0aW9uLAorCQkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4gYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBhY3R1YWxBdWRpdFJlY29yZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlhY3R1YWxBdWRpdFJlY29yZCA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgYm9keSk7CisKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZCwgQXVkaXRKc29uS2V5c0VudW0uQUNUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgYWN0aW9uKTsKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZCwgQXVkaXRKc29uS2V5c0VudW0uQ09OU1VNRVJfSUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4dGVybmFsQXVkaXRPYmplY3QuZ2V0Q09OU1VNRVJfSUQoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmQsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX1VSTC5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXh0ZXJuYWxBdWRpdE9iamVjdC5nZXRSRVNPVVJDRV9VUkwoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmQsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX05BTUUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4dGVybmFsQXVkaXRPYmplY3QuZ2V0UkVTT1VSQ0VfTkFNRSgpKTsKKwkJdmFsaWRhdGVGaWVsZChhY3R1YWxBdWRpdFJlY29yZCwgQXVkaXRKc29uS2V5c0VudW0uU0VSVklDRV9JTlNUQU5DRV9JRC5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXh0ZXJuYWxBdWRpdE9iamVjdC5nZXRTRVJWSUNFX0lOU1RBTkNFX0lEKCkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkLCBBdWRpdEpzb25LZXlzRW51bS5SRVNPVVJDRV9UWVBFLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHRlcm5hbEF1ZGl0T2JqZWN0LmdldFJFU09VUkNFX1RZUEUoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmQsIEF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXh0ZXJuYWxBdWRpdE9iamVjdC5nZXRTVEFUVVMoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmQsIEF1ZGl0SnNvbktleXNFbnVtLkRFU0NSSVBUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHRlcm5hbEF1ZGl0T2JqZWN0LmdldERFU0MoKSk7CisJCXZhbGlkYXRlRmllbGQoYWN0dWFsQXVkaXRSZWNvcmQsIEF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHRlcm5hbEF1ZGl0T2JqZWN0LmdldE1PRElGSUVSKCkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkLCBBdWRpdEpzb25LZXlzRW51bS5QUkVWX0FSVElGQUNUX1VVSUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4dGVybmFsQXVkaXRPYmplY3QuZ2V0UFJFVl9BUlRJRkFDVF9VVUlEKCkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkLCBBdWRpdEpzb25LZXlzRW51bS5DVVJSX0FSVElGQUNUX1VVSUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4dGVybmFsQXVkaXRPYmplY3QuZ2V0Q1VSUl9BUlRJRkFDVF9VVUlEKCkpOworCQl2YWxpZGF0ZUZpZWxkKGFjdHVhbEF1ZGl0UmVjb3JkLCBBdWRpdEpzb25LZXlzRW51bS5BUlRJRkFDVF9EQVRBLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHRlcm5hbEF1ZGl0T2JqZWN0LmdldEFSVElGQUNUX0RBVEEoKSk7CisKKwl9CisKKwlwdWJsaWMgZW51bSBBcnRpZmFjdERhdGFGaWVsZEVudW0geworCQlhdHRHcm91cCwgYXJ0TGFibGUsIGFydFR5cGUsIGFydE5hbWUsIGFydFRpbWVvdXQsIGFydFBheWxvYWRVVUlELCBhcnRWZXJzaW9uLCBhcnRVVUlECisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUF0aWZhY3REYXRhRmllbGQoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAsIFN0cmluZyBhdWRpdEpzb25LZXlOYW1lLAorCQkJU3RyaW5nIGV4cGVjdGVkQXJ0aWZhY3REYXRhLCBib29sZWFuIGNoZWNrQWxsRmllbGRzKSB7CisJCU1hcDxBcnRpZmFjdERhdGFGaWVsZEVudW0sIFN0cmluZz4gZXhwZWN0ZWRBcnRpZmFjdERhdGFGaWxlZHMgPSBuZXcgSGFzaE1hcDxBcnRpZmFjdERhdGFGaWVsZEVudW0sIFN0cmluZz4oKTsKKwkJTWFwPEFydGlmYWN0RGF0YUZpZWxkRW51bSwgU3RyaW5nPiBhY3R1YWxBdGlmYWN0RGF0YUZpbGVkcyA9IG5ldyBIYXNoTWFwPEFydGlmYWN0RGF0YUZpZWxkRW51bSwgU3RyaW5nPigpOworCQlpZiAoZXhwZWN0ZWRBcnRpZmFjdERhdGEgIT0gbnVsbCkgeworCQkJU3RyaW5nW10gZXhwZWN0ZWQgPSBleHBlY3RlZEFydGlmYWN0RGF0YS5zcGxpdCgiLCIpOworCisJCQlhc3NlcnRUcnVlKCJBdWRpdCBmaWVsZCAiICsgYXVkaXRKc29uS2V5TmFtZSArICIgbm90IGZvdW5kIiwgbWFwLmNvbnRhaW5zS2V5KGF1ZGl0SnNvbktleU5hbWUpKTsKKwkJCVN0cmluZyBhY3R1YWxWYWx1ZSA9IChTdHJpbmcpIG1hcC5nZXQoYXVkaXRKc29uS2V5TmFtZSk7CisJCQlTdHJpbmdbXSBhY3R1YWwgPSBhY3R1YWxWYWx1ZS5zcGxpdCgiLCIpOworCisJCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDEgJiYgYWN0dWFsLmxlbmd0aCA9PSAxKSB7CisJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQXJ0aWZhY3REYXRhLCBhY3R1YWxWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlhc3NlcnRFcXVhbHMoQXJ0aWZhY3REYXRhRmllbGRFbnVtLnZhbHVlcygpLmxlbmd0aCwgZXhwZWN0ZWQubGVuZ3RoKTsKKwkJCWFzc2VydEVxdWFscyhBcnRpZmFjdERhdGFGaWVsZEVudW0udmFsdWVzKCkubGVuZ3RoLCBhY3R1YWwubGVuZ3RoKTsKKworCQkJZm9yIChBcnRpZmFjdERhdGFGaWVsZEVudW0gZmllbGQgOiBBcnRpZmFjdERhdGFGaWVsZEVudW0udmFsdWVzKCkpIHsKKworCQkJCWV4cGVjdGVkQXJ0aWZhY3REYXRhRmlsZWRzLnB1dChmaWVsZCwgZXhwZWN0ZWRbZmllbGQub3JkaW5hbCgpXSk7CisJCQkJYWN0dWFsQXRpZmFjdERhdGFGaWxlZHMucHV0KGZpZWxkLCBhY3R1YWxbZmllbGQub3JkaW5hbCgpXSk7CisJCQl9CisJCQlmb3IgKE1hcC5FbnRyeTxBcnRpZmFjdERhdGFGaWVsZEVudW0sIFN0cmluZz4gZW50cnkgOiBleHBlY3RlZEFydGlmYWN0RGF0YUZpbGVkcy5lbnRyeVNldCgpKSB7CisJCQkJQXJ0aWZhY3REYXRhRmllbGRFbnVtIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJaWYgKGNoZWNrQWxsRmllbGRzIHx8ICghZmllbGQuZXF1YWxzKEFydGlmYWN0RGF0YUZpZWxkRW51bS5hcnRWZXJzaW9uKQorCQkJCQkJJiYgIWZpZWxkLmVxdWFscyhBcnRpZmFjdERhdGFGaWVsZEVudW0uYXJ0VVVJRCkpKSB7CisJCQkJCWFzc2VydFRydWUoIkF1ZGl0IGZpZWxkIEFydGlmYWN0RGF0YSBkb3NuJ3QgY29udGFpbnQgIiArIGZpZWxkLAorCQkJCQkJCWFjdHVhbEF0aWZhY3REYXRhRmlsZWRzLmNvbnRhaW5zS2V5KGZpZWxkKSk7CisJCQkJCWFzc2VydEVxdWFscygiQXVkaXQgZmllbGQgQXJ0aWZhY3REYXRhIGRvc24ndCBlcXVhbCAiICsgZmllbGQsCisJCQkJCQkJZXhwZWN0ZWRBcnRpZmFjdERhdGFGaWxlZHMuZ2V0KGZpZWxkKSwgYWN0dWFsQXRpZmFjdERhdGFGaWxlZHMuZ2V0KGZpZWxkKSk7CisJCQkJfQorCisJCQl9CisJCX0KKwl9CisKKwkvLyAvL0Jlbm55CisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRWNvbXBDb25zdW1lckF1ZGl0KEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQgZWNvbXBDb25zdW1lckF1ZGl0SmF2YU9iamVjdCwgU3RyaW5nIGFjdGlvbikKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBmaXhlZEFjdGlvbiA9IEJhc2VSZXN0VXRpbHMuZW5jb2RlVXJsRm9yRG93bmxvYWQoYWN0aW9uKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCW1hcDIgPSBwYXJzZUF1ZGl0UmVzb3VyY2VCeUFjdGlvbihmaXhlZEFjdGlvbiwgbnVsbCk7CisKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBFY29tcENvbnN1bWVyQXVkaXRKc29uS2V5c0VudW0uTU9ESUZJRVIuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWVjb21wQ29uc3VtZXJBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgRWNvbXBDb25zdW1lckF1ZGl0SnNvbktleXNFbnVtLkVDT01QX1VTRVIuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWVjb21wQ29uc3VtZXJBdWRpdEphdmFPYmplY3QuZ2V0RWNvbVVzZXIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgRWNvbXBDb25zdW1lckF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZWNvbXBDb25zdW1lckF1ZGl0SmF2YU9iamVjdC5nZXRTdGF0dXMoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgRWNvbXBDb25zdW1lckF1ZGl0SnNvbktleXNFbnVtLkRFU0MuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWVjb21wQ29uc3VtZXJBdWRpdEphdmFPYmplY3QuZ2V0RGVzYygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBFY29tcENvbnN1bWVyQXVkaXRKc29uS2V5c0VudW0uQUNUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgYWN0aW9uKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZWNvbXBDb25zdW1lckF1ZGl0U3VjY2VzcyhTdHJpbmcgYWN0aW9uLCBDb25zdW1lckRhdGFEZWZpbml0aW9uIGNvbnN1bWVyRGF0YURlZmluaXRpb24sCisJCQlVc2VyIHVzZXIsIGludCBzdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworCQlFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0IGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQoKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGFjdGlvbik7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEVjb21Vc2VyKAorCQkJCWNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJOYW1lKCkgKyAiLCIgKyBjb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyU2FsdCgpLnRvTG93ZXJDYXNlKCkKKwkJCQkJCSsgIiwiICsgY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclBhc3N3b3JkKCkudG9Mb3dlckNhc2UoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIodXNlci5nZXRGdWxsTmFtZSgpICsgIigiICsgdXNlci5nZXRVc2VySWQoKSArICIpIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRWNvbXBDb25zdW1lckF1ZGl0KGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LCBhY3Rpb24pOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVFY29tcENvbnN1bWVyQXVkaXRGYWlsdXJlKFN0cmluZyBhY3Rpb24sIENvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJCVVzZXIgdXNlciwgQWN0aW9uU3RhdHVzIGVycm9yTWVzc2FnZSwgT2JqZWN0Li4uIHZhcmlhYmxlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHZhbGlkYXRlIGF1ZGl0CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChlcnJvck1lc3NhZ2UubmFtZSgpKTsKKwkJRXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdCBleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0KCk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhY3Rpb24pOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRFY29tVXNlcigKKwkJCQljb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpICsgIiwiICsgY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclNhbHQoKS50b0xvd2VyQ2FzZSgpCisJCQkJCQkrICIsIiArIGNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJQYXNzd29yZCgpLnRvTG93ZXJDYXNlKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKHZhcmlhYmxlcykpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcih1c2VyLmdldEZ1bGxOYW1lKCkgKyAiKCIgKyB1c2VyLmdldFVzZXJJZCgpICsgIikiKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFY29tcENvbnN1bWVyQXVkaXQoZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3QsIGFjdGlvbik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUVjb21wQ29uc3VtZXJBdWRpdEZhaWx1cmUoU3RyaW5nIGFjdGlvbiwgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkJVXNlciB1c2VyLCBBY3Rpb25TdGF0dXMgZXJyb3JNZXNzYWdlLCBPYmplY3QuLi4gdmFyaWFibGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdmFsaWRhdGUgYXVkaXQKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKGVycm9yTWVzc2FnZS5uYW1lKCkpOworCQlFeHBlY3RlZEVjb21Db25zdW1lckF1ZGl0IGV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXQoKTsKKwkJLy8gU3RyaW5nIGF1ZGl0QWN0aW9uID0gQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFNfQVVESVRfQUNUSU9OOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYWN0aW9uKTsKKwkJZXhwZWN0ZWRFY29tQ29uc3VtZXJBdWRpdEphdmFPYmplY3Quc2V0RWNvbVVzZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lck5hbWUoKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGVycm9ySW5mby5nZXRBdWRpdERlc2ModmFyaWFibGVzKSk7CisJCWV4cGVjdGVkRWNvbUNvbnN1bWVyQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKHVzZXIuZ2V0RnVsbE5hbWUoKSArICIoIiArIHVzZXIuZ2V0VXNlcklkKCkgKyAiKSIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUVjb21wQ29uc3VtZXJBdWRpdChleHBlY3RlZEVjb21Db25zdW1lckF1ZGl0SmF2YU9iamVjdCwgYWN0aW9uKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFVTNTcxMjU1CisJcHVibGljIHN0YXRpYyB2b2lkIEdldExpc3RPZlVzZXJzQnlSb2xlc0F1ZGl0RmFpbHVyZShTdHJpbmcgYWN0aW9uLCBTdHJpbmcgcm9sZXMsIGludCBzdGF0dXMsIFVzZXIgdXNlck1vZGlmaWVyLAorCQkJQWN0aW9uU3RhdHVzIGVycm9yTWVzc2FnZSwgT2JqZWN0Li4uIHZhcmlhYmxlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChlcnJvck1lc3NhZ2UubmFtZSgpKTsKKwkJRXhwZWN0ZWRHZXRVc2VyTGlzdEF1ZGl0IGV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRHZXRVc2VyTGlzdEF1ZGl0KCk7IC8vIFN0cmluZworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXVkaXRBY3Rpb24KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTX0FVRElUX0FDVElPTjsKKwkJZXhwZWN0ZWRHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYWN0aW9uKTsKKwkJZXhwZWN0ZWRHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKHZhcmlhYmxlcykpOworCisJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3Quc2V0RGV0YWlscyhyb2xlcyk7CisJCWlmIChlcnJvck1lc3NhZ2UgPT0gQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUgfHwgZXJyb3JNZXNzYWdlID09IEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OKSB7CisJCQlleHBlY3RlZEdldExpc3RPZlVzZXJzQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKCIoVU5LTk9XTikiKTsKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3QKKwkJCQkJLnNldE1vZGlmaWVyKHVzZXJNb2RpZmllci5nZXRGdWxsTmFtZSgpICsgIigiICsgdXNlck1vZGlmaWVyLmdldFVzZXJJZCgpICsgIikiKTsKKwkJfQorCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0R2V0TGlzdE9mVXNlcnNCeVJvbGVzKGV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3QsIGFjdGlvbik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIEdldExpc3RPZlVzZXJzQnlSb2xlc0F1ZGl0U3VjY2VzcyhTdHJpbmcgYWN0aW9uLCBTdHJpbmcgcm9sZXMsIFVzZXIgdXNlciwgaW50IHN0YXR1cykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlFeHBlY3RlZEdldFVzZXJMaXN0QXVkaXQgZXhwZWN0ZWRHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZEdldFVzZXJMaXN0QXVkaXQoKTsKKwkJZXhwZWN0ZWRHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oYWN0aW9uKTsKKwkJZXhwZWN0ZWRHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJZXhwZWN0ZWRHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllcih1c2VyLmdldEZ1bGxOYW1lKCkgKyAiKCIgKyB1c2VyLmdldFVzZXJJZCgpICsgIikiKTsKKwkJZXhwZWN0ZWRHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdC5zZXREZXRhaWxzKHJvbGVzKTsKKwkJdmFsaWRhdGVBdWRpdEdldExpc3RPZlVzZXJzQnlSb2xlcyhleHBlY3RlZEdldExpc3RPZlVzZXJzQXVkaXRKYXZhT2JqZWN0LCBhY3Rpb24pOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUF1ZGl0R2V0TGlzdE9mVXNlcnNCeVJvbGVzKEV4cGVjdGVkR2V0VXNlckxpc3RBdWRpdCBHZXRMaXN0T2ZVc2Vyc0F1ZGl0SmF2YU9iamVjdCwKKwkJCVN0cmluZyBhY3Rpb24pIHRocm93cyBFeGNlcHRpb24geworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwMiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQltYXAyID0gcGFyc2VBdWRpdFJlc291cmNlQnlBY3Rpb24oYWN0aW9uLCBudWxsKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5BQ1RJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBhY3Rpb24pOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksIEdldExpc3RPZlVzZXJzQXVkaXRKYXZhT2JqZWN0LmdldFN0YXR1cygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5NT0RJRklFUi5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uREVTQ1JJUFRJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCUdldExpc3RPZlVzZXJzQXVkaXRKYXZhT2JqZWN0LmdldERlc2MoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uREVUQUlMUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3QuZ2V0RGV0YWlscygpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVBdWRpdEltcG9ydChFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LCBTdHJpbmcgYWN0aW9uKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCW1hcDIgPSBwYXJzZUF1ZGl0UmVzb3VyY2VCeUFjdGlvbihhY3Rpb24sIG51bGwpOworCisJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKAorCQkJCWdldE1vZGlmaWVyU3RyaW5nKHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldE1vZGlmaWVyTmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRNb2RpZmllclVpZCgpKSk7CisKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5BQ1RJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBhY3Rpb24pOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX1RZUEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5QUkVWX1ZFUlNJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFByZXZWZXJzaW9uKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfVkVSU0lPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0Q3VyclZlcnNpb24oKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uTU9ESUZJRVIuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRNb2RpZmllclVpZCgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5QUkVWX1NUQVRFLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0UHJldlN0YXRlKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfU1RBVEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRDdXJyU3RhdGUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0U3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkRFU0NSSVBUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0RGVzYygpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUF1ZGl0RGlzdHJpYnV0aW9uKEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIFN0cmluZyBhY3Rpb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJbWFwMiA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgbnVsbCk7CisKKwkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoCisJCQkJZ2V0TW9kaWZpZXJTdHJpbmcocmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXJOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldE1vZGlmaWVyVWlkKCkpKTsKKworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkFDVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIGFjdGlvbik7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uUkVTT1VSQ0VfTkFNRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0UmVzb3VyY2VOYW1lKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX1RZUEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DVVJSX1ZFUlNJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEN1cnJWZXJzaW9uKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXJVaWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uQ1VSUl9TVEFURS5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEN1cnJTdGF0ZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5EUFJFVl9TVEFUVVMuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldERwcmV2U3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkRDVVJSX1NUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0RGN1cnJTdGF0dXMoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0U3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkRFU0NSSVBUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0RGVzYygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DT01NRU5ULmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0Q29tbWVudCgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5ESUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXREaXN0cmlidXRpb25JZCgpKTsKKworCX0KKworCS8vIEJlbm55CisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXVkaXRfRGlzdHJpYnV0aW9uKEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QsCisJCQlTdHJpbmcgYWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGFjdGlvblRvTGlzdCA9IGdldEF1ZGl0TGlzdEJ5QWN0aW9uKHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEFjdGlvbigpLCAxKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAyID0gYWN0aW9uVG9MaXN0LmdldCgwKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5BQ1RJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBhY3Rpb24pOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX05BTUUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFJlc291cmNlTmFtZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5SRVNPVVJDRV9UWVBFLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uQ1VSUl9WRVJTSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRDdXJyVmVyc2lvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5NT0RJRklFUi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldE1PRElGSUVSKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfU1RBVEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRDdXJyU3RhdGUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uRFBSRVZfU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXREcHJldlN0YXR1cygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5EQ1VSUl9TVEFUVVMuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldERjdXJyU3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFN0YXR1cygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5ERVNDUklQVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldERlc2MoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uQ09NTUVOVC5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldENvbW1lbnQoKSk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUF1ZGl0Tm90aWZpY2F0aW9uKEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIFN0cmluZyBhY3Rpb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJbWFwMiA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgbnVsbCk7CisKKwkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoCisJCQkJZ2V0TW9kaWZpZXJTdHJpbmcocmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXJOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldE1vZGlmaWVyVWlkKCkpKTsKKworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkFDVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIGFjdGlvbik7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uUkVTT1VSQ0VfTkFNRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0UmVzb3VyY2VOYW1lKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX1RZUEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DVVJSX1ZFUlNJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEN1cnJWZXJzaW9uKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfU1RBVEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRDdXJyU3RhdGUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0U3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkRFU0NSSVBUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0RGVzYygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5ESUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXREaXN0cmlidXRpb25JZCgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5UT1BJQ19OQU1FLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0VG9waWNOYW1lKCkpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXVkaXQoRXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdCBleHBlY3RlZERpc3REb3dubG9hZEF1ZGl0LCBTdHJpbmcgYWN0aW9uKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCW1hcDIgPSBwYXJzZUF1ZGl0UmVzb3VyY2VCeUFjdGlvbihhY3Rpb24sIG51bGwpOworCisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uQUNUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgYWN0aW9uKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5TVEFUVVMuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBleHBlY3RlZERpc3REb3dubG9hZEF1ZGl0LmdldFN0YXR1cygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5ERVNDUklQVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIGV4cGVjdGVkRGlzdERvd25sb2FkQXVkaXQuZ2V0RGVzYygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DT05TVU1FUl9JRC5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdC5nZXRDb25zdW1lcklkKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX1VSTC5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXhwZWN0ZWREaXN0RG93bmxvYWRBdWRpdC5nZXRSZXNvdXJjZVVybCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUF1ZGl0RGVwbG95KEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIFN0cmluZyBhY3Rpb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJbWFwMiA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uKGFjdGlvbiwgbnVsbCk7CisKKwkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXJVaWQoCisJCQkJZ2V0TW9kaWZpZXJTdHJpbmcocmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXJOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldE1vZGlmaWVyVWlkKCkpKTsKKworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkFDVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIGFjdGlvbik7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uUkVTT1VSQ0VfTkFNRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0UmVzb3VyY2VOYW1lKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX1RZUEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DVVJSX1ZFUlNJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEN1cnJWZXJzaW9uKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXJVaWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0U3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkRFU0NSSVBUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0RGVzYygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5ESUQuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXREaXN0cmlidXRpb25JZCgpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUF1ZGl0UHJvZHVjdChFeHBlY3RlZFByb2R1Y3RBdWRpdCBwcm9kdWN0RXhwZWN0ZWRBdWRpdCwgU3RyaW5nIGFjdGlvbiwKKwkJCUF1ZGl0SnNvbktleXNFbnVtLi4uIGFkZGl0aW9uYWxGaWVsZHMpIHRocm93cyBFeGNlcHRpb24geworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwMiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQltYXAyID0gcGFyc2VBdWRpdFJlc291cmNlQnlBY3Rpb24oYWN0aW9uLCBudWxsKTsKKworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkFDVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIGFjdGlvbik7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uUkVTT1VSQ0VfTkFNRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcHJvZHVjdEV4cGVjdGVkQXVkaXQuZ2V0UkVTT1VSQ0VfTkFNRSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5SRVNPVVJDRV9UWVBFLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlwcm9kdWN0RXhwZWN0ZWRBdWRpdC5nZXRSRVNPVVJDRV9UWVBFKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlBSRVZfVkVSU0lPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcHJvZHVjdEV4cGVjdGVkQXVkaXQuZ2V0UFJFVl9WRVJTSU9OKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfVkVSU0lPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJcHJvZHVjdEV4cGVjdGVkQXVkaXQuZ2V0Q1VSUl9WRVJTSU9OKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlBSRVZfU1RBVEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBwcm9kdWN0RXhwZWN0ZWRBdWRpdC5nZXRQUkVWX1NUQVRFKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkNVUlJfU1RBVEUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBwcm9kdWN0RXhwZWN0ZWRBdWRpdC5nZXRDVVJSX1NUQVRFKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcHJvZHVjdEV4cGVjdGVkQXVkaXQuZ2V0TU9ESUZJRVIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcHJvZHVjdEV4cGVjdGVkQXVkaXQuZ2V0U1RBVFVTKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLkRFU0NSSVBUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcHJvZHVjdEV4cGVjdGVkQXVkaXQuZ2V0REVTQygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5TRVJWSUNFX0lOU1RBTkNFX0lELmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlwcm9kdWN0RXhwZWN0ZWRBdWRpdC5nZXRTRVJWSUNFX0lOU1RBTkNFX0lEKCkpOworCQlpZiAoYWRkaXRpb25hbEZpZWxkcyAhPSBudWxsKSB7CisJCQlMaXN0PEF1ZGl0SnNvbktleXNFbnVtPiBmaWVsZHNMaXN0ID0gQXJyYXlzLmFzTGlzdChhZGRpdGlvbmFsRmllbGRzKTsKKwkJCWlmIChmaWVsZHNMaXN0LmNvbnRhaW5zKEF1ZGl0SnNvbktleXNFbnVtLkNPTU1FTlQpKSB7CisJCQkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DT01NRU5ULmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcHJvZHVjdEV4cGVjdGVkQXVkaXQuZ2V0Q09NTUVOVCgpKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0QXVkaXRMaXN0QnlBY3Rpb24oU3RyaW5nIGFjdGlvbiwgaW50IGV4cGVjdGVkTnVtT2ZBdWRpdCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGFjdGlvblRvTGlzdCA9IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uVG9MaXN0KGFjdGlvbiwgbnVsbCk7CisJCWFzc2VydEVxdWFscygicmVjaWV2ZWQgZGlmZmVyZW50IGF1ZGl0cyBudW1iZXIgdGhhbiBleHBlY3RlZCIsIGV4cGVjdGVkTnVtT2ZBdWRpdCwgYWN0aW9uVG9MaXN0LnNpemUoKSk7CisJCXJldHVybiBhY3Rpb25Ub0xpc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXV0aGVudGljYXRpb25BdWRpdChFeHBlY3RlZEF1dGhlbnRpY2F0aW9uQXVkaXQgZXhwZWN0ZWRBdWRpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gYWN0aW9uVG9MaXN0ID0gZ2V0QXVkaXRMaXN0QnlBY3Rpb24oZXhwZWN0ZWRBdWRpdC5nZXRBY3Rpb24oKSwgMSk7CisJCWFzc2VydEVxdWFscygiZXhwZWN0ZWQgbnVtYmVyIG9mIEVTIGFjdGlvbiBpcyAxIiwgMSwgYWN0aW9uVG9MaXN0LnNpemUoKSk7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBhY3Rpb25Ub0xpc3QuZ2V0KDApOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgQXVkaXRFbnVtLkFDVElPTi5nZXRWYWx1ZSgpLCBleHBlY3RlZEF1ZGl0LmdldEFjdGlvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIEF1ZGl0RW51bS5VUkwuZ2V0VmFsdWUoKSwgZXhwZWN0ZWRBdWRpdC5nZXRVcmwoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBBdWRpdEVudW0uVVNFUi5nZXRWYWx1ZSgpLCBleHBlY3RlZEF1ZGl0LmdldFVzZXIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBBdWRpdEVudW0uQVVUSF9TVEFUVVMuZ2V0VmFsdWUoKSwgZXhwZWN0ZWRBdWRpdC5nZXRBdXRoU3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgQXVkaXRFbnVtLlJFQUxNLmdldFZhbHVlKCksIGV4cGVjdGVkQXVkaXQuZ2V0UmVhbG0oKSk7CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmllbGQoTWFwPFN0cmluZywgT2JqZWN0PiBhY3R1YWxBdWRpdFJlY29yZCwgU3RyaW5nIGpzb25GaWVsZCwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKwkJaWYgKGV4cGVjdGVkVmFsdWUgPT0gbnVsbCkgeworCQkJLy8gfHwgY2hhbmdlZCB0byAmJgorCQkJaWYgKGFjdHVhbEF1ZGl0UmVjb3JkLmNvbnRhaW5zS2V5KGpzb25GaWVsZCkpIHsKKwkJCQlhc3NlcnRUcnVlKCJBdWRpdCBmaWVsZCAiICsganNvbkZpZWxkICsgIjogZXhwZWN0ZWQgbnVsbCwgYWN0dWFsICIgKyBhY3R1YWxBdWRpdFJlY29yZC5nZXQoanNvbkZpZWxkKSwKKwkJCQkJCWFjdHVhbEF1ZGl0UmVjb3JkLmdldChqc29uRmllbGQpLnRvU3RyaW5nKCkuZXF1YWxzKCJudWxsIikKKwkJCQkJCQkJfHwgYWN0dWFsQXVkaXRSZWNvcmQuZ2V0KGpzb25GaWVsZCkudG9TdHJpbmcoKS5lcXVhbHMoQ29uc3RhbnRzLkVNUFRZX1NUUklORykpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlhc3NlcnRUcnVlKCJBdWRpdCBmaWVsZCAiICsganNvbkZpZWxkICsgIiBub3QgZm91bmQgaW4gYWN0dWFsIiwgYWN0dWFsQXVkaXRSZWNvcmQuY29udGFpbnNLZXkoanNvbkZpZWxkKSk7CisJCQlPYmplY3QgZm91bmRWYWx1ZSA9IGFjdHVhbEF1ZGl0UmVjb3JkLmdldChqc29uRmllbGQpOworCQkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkVmFsdWUsIGZvdW5kVmFsdWUpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wYXJlRWxlbWVudHMoT2JqZWN0IGV4cGVjdGVkVmFsdWUsIE9iamVjdCBmb3VuZFZhbHVlKSB7CisJCWlmIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlhc3NlcnRUcnVlKCJBY3R1YWwgdmFsdWUgIiArIGZvdW5kVmFsdWUgKyAiIGlzIG5vdCBzdHJpbmciLCBmb3VuZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKTsKKwkJCWFzc2VydFRydWUoIkV4cGVjdGVkICIgKyBleHBlY3RlZFZhbHVlICsgIiBub3QgZXF1YWwgdG8gYWN0dWFsICIgKyBmb3VuZFZhbHVlLAorCQkJCQlmb3VuZFZhbHVlLmVxdWFscyhleHBlY3RlZFZhbHVlKSk7CisJCX0KKwkJLyoKKwkJICogZWxzZSBpZiggZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE51bWJlcil7IGFzc2VydFRydWUoZm91bmRWYWx1ZQorCQkgKiBpbnN0YW5jZW9mIE51bWJlcik7IGFzc2VydFRydWUoZm91bmRWYWx1ZSA9PSBleHBlY3RlZFZhbHVlKTsgfQorCQkgKi8KKwkJZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKwkJCWFzc2VydFRydWUoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pOworCQkJYXNzZXJ0VHJ1ZShmb3VuZFZhbHVlID09IGV4cGVjdGVkVmFsdWUpOworCQl9IGVsc2UgaWYgKGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBNYXApIHsKKwkJCWFzc2VydFRydWUoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIE1hcCk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGZvdW5kTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGZvdW5kVmFsdWU7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGV4Y3BlY3RlZE1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBleHBlY3RlZFZhbHVlOworCQkJYXNzZXJ0VHJ1ZShmb3VuZE1hcC5zaXplKCkgPT0gZXhjcGVjdGVkTWFwLnNpemUoKSk7CisJCQlJdGVyYXRvcjxTdHJpbmc+IGZvdW5ka2V5SXRyID0gZm91bmRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChmb3VuZGtleUl0ci5oYXNOZXh0KCkpIHsKKwkJCQlTdHJpbmcgZm91bmRLZXkgPSBmb3VuZGtleUl0ci5uZXh0KCk7CisJCQkJYXNzZXJ0VHJ1ZShleGNwZWN0ZWRNYXAuY29udGFpbnNLZXkoZm91bmRLZXkpKTsKKwkJCQljb21wYXJlRWxlbWVudHMoZXhjcGVjdGVkTWFwLmdldChmb3VuZEtleSksIGZvdW5kTWFwLmdldChmb3VuZEtleSkpOworCQkJfQorCisJCX0gZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCWFzc2VydFRydWUoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpOworCQkJTGlzdDxPYmplY3Q+IGZvdW5kTGlzdCA9IChMaXN0PE9iamVjdD4pIGZvdW5kVmFsdWU7CisJCQlMaXN0PE9iamVjdD4gZXhjcGVjdGVkTGlzdCA9IChMaXN0PE9iamVjdD4pIGV4cGVjdGVkVmFsdWU7CisJCQlhc3NlcnRUcnVlKGZvdW5kTGlzdC5zaXplKCkgPT0gZXhjcGVjdGVkTGlzdC5zaXplKCkpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZExpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCQljb21wYXJlRWxlbWVudHMoZXhjcGVjdGVkTGlzdC5nZXQoaSksIGZvdW5kTGlzdC5nZXQoaSkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlhc3NlcnRUcnVlKGZvdW5kVmFsdWUuZXF1YWxzKGV4cGVjdGVkVmFsdWUpKTsKKwkJfQorCX0KKworCS8vIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJzZUF1ZGl0UmVzb3VyY2VCeUFjdGlvbihTdHJpbmcKKwkvLyBhY3Rpb24sIFN0cmluZyBib2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkvLworCS8vIE1hcCBhdWRpdGluZ01lc3NhZ2UgPSBudWxsOworCS8vIGF1ZGl0aW5nTWVzc2FnZSA9IHJldHJpZXZlQXVkaXRNZXNzYWdlc0J5UGF0dGVybihhY3Rpb24sIG51bGwpOworCS8vCisJLy8gcmV0dXJuIGF1ZGl0aW5nTWVzc2FnZTsKKwkvLworCS8vIH0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJzZUF1ZGl0UmVzb3VyY2VCeUFjdGlvbihTdHJpbmcgYWN0aW9uLAorCQkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4gYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTWFwIGF1ZGl0aW5nTWVzc2FnZSA9IG51bGw7CisJCWF1ZGl0aW5nTWVzc2FnZSA9IHJldHJpZXZlQXVkaXRNZXNzYWdlc0J5UGF0dGVybihhY3Rpb24sIGJvZHkpOworCisJCXJldHVybiBhdWRpdGluZ01lc3NhZ2U7CisKKwl9CisKKwkvLyBwdWJsaWMgc3RhdGljIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4KKwkvLyBwYXJzZUF1ZGl0UmVzb3VyY2VCeUFjdGlvblRvTGlzdChTdHJpbmcgYWN0aW9uLCBTdHJpbmcgYm9keSkgdGhyb3dzCisJLy8gRXhjZXB0aW9uIHsKKwkvLworCS8vIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gYXVkaXRMaXN0ID0gbmV3IEFycmF5TGlzdDxNYXA8U3RyaW5nLAorCS8vIE9iamVjdD4+KCk7CisJLy8KKwkvLy8vIFN0cmluZyBhdWRpdGluZ01lc3NhZ2UgPSBudWxsOworCS8vCisJLy8gTWFwIGF1ZGl0aW5nTWVzc2FnZSA9IG51bGw7CisJLy8gYXVkaXRpbmdNZXNzYWdlID0gcmV0cmlldmVBdWRpdE1lc3NhZ2VzQnlQYXR0ZXJuKGFjdGlvbik7CisJLy8KKwkvLyBpZiAoYm9keSA9PSBudWxsKSB7CisJLy8vLyBTdHJpbmcgcGF0dGVybiA9ICIvX3NlYXJjaD9xPUFDVElPTjpcIiIgKyBhY3Rpb24gKyAiXCIiOworCS8vLy8gYXVkaXRpbmdNZXNzYWdlID0gcmV0cmlldmVBdWRpdE1lc3NhZ2VzQnlQYXR0ZXJuKGFjdGlvbik7CisJLy8vLyBhdWRpdGluZ01lc3NhZ2UgPSByZXRyaWV2ZUF1ZGl0TWVzc2FnZXNCeVBhdHRlcm4ocGF0dGVybik7CisJLy8gfSBlbHNlIHsKKwkvLy8vIGF1ZGl0aW5nTWVzc2FnZSA9IHJldHJpZXZlQXVkaXRNZXNzYWdlc1VzaW5nQm9keShib2R5KTsKKwkvLyB9CisJLy8KKwkvLyByZXR1cm4gUmVzcG9uc2VQYXJzZXIuZ2V0QXVkaXRGcm9tTWVzc2FnZShhdWRpdGluZ01lc3NhZ2UpOworCS8vCisJLy8gfQorCisJcHVibGljIHN0YXRpYyBMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHBhcnNlQXVkaXRSZXNvdXJjZUJ5QWN0aW9uVG9MaXN0KFN0cmluZyBhY3Rpb24sCisJCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPiBib2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGF1ZGl0TGlzdCA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKworCQkvLyBTdHJpbmcgYXVkaXRpbmdNZXNzYWdlID0gbnVsbDsKKworCQlNYXAgYXVkaXRpbmdNZXNzYWdlID0gbnVsbDsKKworCQlpZiAoYm9keSA9PSBudWxsIHx8IGJvZHkuaXNFbXB0eSgpKSB7CisJCQlhdWRpdGluZ01lc3NhZ2UgPSByZXRyaWV2ZUF1ZGl0TWVzc2FnZXNCeVBhdHRlcm4oYWN0aW9uLCBudWxsKTsKKwkJCS8vIFN0cmluZyBwYXR0ZXJuID0gIi9fc2VhcmNoP3E9QUNUSU9OOlwiIiArIGFjdGlvbiArICJcIiI7CisJCQkvLyBhdWRpdGluZ01lc3NhZ2UgPSByZXRyaWV2ZUF1ZGl0TWVzc2FnZXNCeVBhdHRlcm4oYWN0aW9uKTsKKwkJCS8vIGF1ZGl0aW5nTWVzc2FnZSA9IHJldHJpZXZlQXVkaXRNZXNzYWdlc0J5UGF0dGVybihwYXR0ZXJuKTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGl0aW5nTWVzc2FnZSA9IHJldHJpZXZlQXVkaXRNZXNzYWdlc0J5UGF0dGVybihhY3Rpb24sIGJvZHkpOworCQkJLy8gYXVkaXRpbmdNZXNzYWdlID0gcmV0cmlldmVBdWRpdE1lc3NhZ2VzVXNpbmdCb2R5KGJvZHkpOworCQl9CisKKwkJcmV0dXJuIFJlc3BvbnNlUGFyc2VyLmdldEF1ZGl0RnJvbU1lc3NhZ2UoYXVkaXRpbmdNZXNzYWdlKTsKKworCX0KKworCXB1YmxpYyBKU09OT2JqZWN0IGJ1aWxkRWxhc3RpY1F1ZXJ5U3RyaW5nT2JqZWN0KFN0cmluZyBkZWZhdWx0RmllbGQsIFN0cmluZyBxdWVyeVZhbHVlKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisKKwkJSlNPTk9iamVjdCBxdWVyeV9zdHJpbmcgPSBuZXcgSlNPTk9iamVjdCgpOworCQlKU09OT2JqZWN0IGpTT05PYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqU09OT2JqZWN0LnB1dCgiZGVmYXVsdF9maWVsZCIsIGRlZmF1bHRGaWVsZCk7CisJCWpTT05PYmplY3QucHV0KCJxdWVyeSIsIHF1ZXJ5VmFsdWUpOworCisJCXF1ZXJ5X3N0cmluZy5wdXQoInF1ZXJ5X3N0cmluZyIsIGpTT05PYmplY3QpOworCisJCXJldHVybiBxdWVyeV9zdHJpbmc7CisJfQorCisJcHVibGljIHN0YXRpYyBKU09OT2JqZWN0IGJ1aWxkRWxhc3RpY1F1ZXJ5Qm9keShMaXN0PEpTT05PYmplY3Q+IGxpc3RPYmplY3RzKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisKKwkJSlNPTk9iamVjdCBxdWVyeSA9IG5ldyBKU09OT2JqZWN0KCk7CisJCUpTT05PYmplY3QgYm9vbCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCUpTT05PYmplY3QgbXVzdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCUpTT05BcnJheSBtdXN0QSA9IG5ldyBKU09OQXJyYXkoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RPYmplY3RzLnNpemUoKTsgaSsrKSB7CisJCQlKU09OT2JqZWN0IG1hdGNoID0gbmV3IEpTT05PYmplY3QoKTsKKwkJCW1hdGNoLnB1dCgibWF0Y2giLCBsaXN0T2JqZWN0cy5nZXQoaSkpOworCQkJbXVzdEEucHV0KG1hdGNoKTsKKworCQl9CisKKwkJbXVzdC5wdXQoIm11c3QiLCBtdXN0QSk7CisJCWJvb2wucHV0KCJib29sIiwgbXVzdCk7CisJCXF1ZXJ5LnB1dCgicXVlcnkiLCBib29sKTsKKworCQlyZXR1cm4gcXVlcnk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmV0cmlldmVBdWRpdE1lc3NhZ2VzVXNpbmdCb2R5KFN0cmluZyBxdWVyeV9zdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlIdHRwUmVxdWVzdCBnZXRBdWRpdGluZ01lc3NhZ2UgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCVN0cmluZyBib2R5ID0gcXVlcnlfc3RyaW5nOworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuR0VUX1NFQVJDSF9EQVRBX0ZST01fRVMsIGNvbmZpZy5nZXRFc0hvc3QoKSwgY29uZmlnLmdldEVzUG9ydCgpLCAiX3NlYXJjaCIpOworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gZ2V0QXVkaXRpbmdNZXNzYWdlLmh0dHBTZW5kUG9zdCh1cmwsIGJvZHksIGhlYWRlcnNNYXApOworCisJCXJldHVybiByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcCByZXRyaWV2ZUF1ZGl0TWVzc2FnZXNCeVBhdHRlcm4oU3RyaW5nIGFjdGlvbiwgTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4gYm9keSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJLy8gZ2V0IGNhc3NhbmRyYSB0YWJsZSBuYW1lIGJ5IGFjdGlvbgorCQlTdHJpbmcgZXNUeXBlID0gQXVkaXRpbmdBY3Rpb25FbnVtLmdldEFjdGlvbkJ5TmFtZShhY3Rpb24pLmdldEF1ZGl0aW5nRXNUeXBlKCk7CisKKwkJTGlzdDxQYWlyPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4+IG15RmllbGRzID0gbmV3IEFycmF5TGlzdDxQYWlyPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4+KCk7CisJCVBhaXI8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPiBteVBhaXIgPSBuZXcgUGFpcjxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+KAorCQkJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb24pOworCQlteUZpZWxkcy5hZGQoMCwgbXlQYWlyKTsKKwkJaWYgKGJvZHkgIT0gbnVsbCAmJiAhYm9keS5pc0VtcHR5KCkpIHsKKwkJCWZvciAoTWFwLkVudHJ5PEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4gbWFwRWxlbWVudCA6IGJvZHkuZW50cnlTZXQoKSkgeworCQkJCW15RmllbGRzLmFkZChuZXcgUGFpcjxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+KG1hcEVsZW1lbnQuZ2V0S2V5KCksIG1hcEVsZW1lbnQuZ2V0VmFsdWUoKSkpOworCQkJfQorCQl9CisKKwkJTGlzdDxSb3c+IGZldGNoRnJvbVRhYmxlID0gQ2Fzc2FuZHJhVXRpbHMuZmV0Y2hGcm9tVGFibGUoYXVkaXRLZXlTcGFjZU5hbWUsIGVzVHlwZSwgbXlGaWVsZHMpOworCQlhc3NlcnRUcnVlKCJleHBlY3RlZCBvbiBmZXRjaGluZyBmcm9tIGRhdGEgYmFzZSBvbmUgcmVjb3JkIG9ubHksIGFjdHVhbDogIiArIGZldGNoRnJvbVRhYmxlLnNpemUoKSwKKwkJCQlmZXRjaEZyb21UYWJsZS5zaXplKCkgPT0gMSk7CisJCVJvdyByb3cgPSBmZXRjaEZyb21UYWJsZS5nZXQoMCk7CisKKwkJQ29sdW1uRGVmaW5pdGlvbnMgY29sdW1uRGVmaW5pdGlvbnMgPSByb3cuZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdHNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlZmluaXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQlyZXN1bHRzTWFwLnB1dChjb2x1bW5EZWZpbml0aW9ucy5nZXROYW1lKGkpLCByb3cuZ2V0T2JqZWN0KGNvbHVtbkRlZmluaXRpb25zLmdldE5hbWUoaSkpID09IG51bGwgPyAibnVsbCIKKwkJCQkJOiByb3cuZ2V0T2JqZWN0KGNvbHVtbkRlZmluaXRpb25zLmdldE5hbWUoaSkpLnRvU3RyaW5nKCkpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdHNNYXA7CisJfQorCisJLy8gcHVibGljIHN0YXRpYyBNYXAgcmV0cmlldmVBdWRpdE1lc3NhZ2VzQnlQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MKKwkvLyBJT0V4Y2VwdGlvbiB7CisJLy8KKwkvLy8vIENvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkvLy8vIEh0dHBSZXF1ZXN0IGdldEF1ZGl0aW5nTWVzc2FnZSA9IG5ldyBIdHRwUmVxdWVzdCgpOworCS8vLy8gU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5HRVRfU0VBUkNIX0RBVEFfRlJPTV9FUywKKwkvLyBjb25maWcuZ2V0RXNIb3N0KCksIGNvbmZpZy5nZXRFc1BvcnQoKSwgcGF0dGVybik7CisJLy8vLyBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gZ2V0QXVkaXRpbmdNZXNzYWdlLmh0dHBTZW5kR2V0KHVybCwgbnVsbCk7CisJLy8KKwkvLy8vIGdldCBjYXNzYW5kcmEgdGFibGUgbmFtZSBieSBhY3Rpb24KKwkvLyBTdHJpbmcgZXNUeXBlID0KKwkvLyBBdWRpdGluZ0FjdGlvbkVudW0uZ2V0QWN0aW9uQnlOYW1lKHBhdHRlcm4pLmdldEF1ZGl0aW5nRXNUeXBlKCk7CisJLy8vLyBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uQnlOYW1lID0KKwkvLyBBdWRpdGluZ0FjdGlvbkVudW0uZ2V0QWN0aW9uQnlOYW1lKHBhdHRlcm4pOworCS8vCisJLy8vLyBNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPiBteUZpZWxkcz0gbmV3CisJLy8gSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+KCk7CisJLy8vLyBteUZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04gLCBwYXR0ZXJuKTsKKwkvLworCS8vIExpc3Q8UGFpcjxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+PiBteUZpZWxkcyA9IG5ldworCS8vIEFycmF5TGlzdDxQYWlyPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIFN0cmluZz4+KCk7CisJLy8gUGFpcjxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+IG15UGFpciA9IG5ldworCS8vIFBhaXI8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgU3RyaW5nPihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTgorCS8vICwgcGF0dGVybik7CisJLy8gbXlGaWVsZHMuYWRkKDAsIG15UGFpcik7CisJLy8KKwkvLworCS8vIExpc3Q8Um93PiBmZXRjaEZyb21UYWJsZSA9IENhc3NhbmRyYVV0aWxzLmZldGNoRnJvbVRhYmxlKCJzZGNhdWRpdCIsCisJLy8gZXNUeXBlLCBteUZpZWxkcyk7CisJLy8gUm93IHJvdyA9IGZldGNoRnJvbVRhYmxlLmdldCgwKTsKKwkvLworCS8vCisJLy8gQ29sdW1uRGVmaW5pdGlvbnMgY29sdW1uRGVmaW5pdGlvbnMgPSByb3cuZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKTsKKwkvLy8vIFN0cmluZyBzdHJpbmcgPSByb3cuZ2V0U3RyaW5nKGNvbHVtbkRlZmluaXRpb25zLmdldE5hbWUoMSkpOworCS8vCisJLy8vLyBTdHJpbmcgbWV0YURhdGEgPSByb3cuZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKS50b1N0cmluZygpOworCS8vLy8gbWV0YURhdGEgPW1ldGFEYXRhLnJlcGxhY2VBbGwoIlxcKCguKj8pXFwpfFxcW3xcXF18Q29sdW1ucyIsICIiKTsKKwkvLy8vIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUxpc3QgPSBuZXcKKwkvLyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG1ldGFEYXRhLnNwbGl0KCIsICIpKSk7CisJLy8KKwkvLworCS8vCisJLy8gTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHRzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJLy8KKwkvLworCS8vIGZvciAoaW50IGk9MCA7IGkgPCBjb2x1bW5EZWZpbml0aW9ucy5zaXplKCkgOyBpKyspeworCS8vIHJlc3VsdHNNYXAucHV0KGNvbHVtbkRlZmluaXRpb25zLmdldE5hbWUoaSkgLAorCS8vIHJvdy5nZXRPYmplY3QoY29sdW1uRGVmaW5pdGlvbnMuZ2V0TmFtZShpKSkgPT0gbnVsbCA/ICJudWxsIiA6CisJLy8gcm93LmdldE9iamVjdChjb2x1bW5EZWZpbml0aW9ucy5nZXROYW1lKGkpKS50b1N0cmluZygpKTsKKwkvLyB9CisJLy8vLyBmb3IgKFN0cmluZyBzdHJpbmcgOiBtZXRhRGF0YUxpc3QpIHsKKwkvLy8vIHJlc3VsdHNNYXAucHV0KHN0cmluZyAsIHJvdy5nZXRTdHJpbmcoc3RyaW5nKSk7CisJLy8vLyB9CisJLy8vLworCS8vCisJLy8vLyBTdHJpbmcgZGF0YVN0cmluZyA9IGZldGNoRnJvbVRhYmxlLnRvU3RyaW5nKCk7CisJLy8vLyBkYXRhU3RyaW5nID0gZGF0YVN0cmluZy5yZXBsYWNlQWxsKCJcXFt8XFxdfFJvdyIsICIiKTsKKwkvLy8vIExpc3Q8U3RyaW5nPiBkYXRhQXJyYXkgPSBuZXcKKwkvLyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KGRhdGFTdHJpbmcuc3BsaXQoIiwgIikpKTsKKwkvLy8vCisJLy8vLworCS8vLy8gTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHRzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJLy8vLyBmb3IgKGludCBpPTAgOyBpPG1ldGFEYXRhTGlzdC5zaXplKCkgOyBpKyspIHsKKwkvLy8vIHJlc3VsdHNNYXAucHV0KG1ldGFEYXRhTGlzdC5nZXQoaSksIGRhdGFBcnJheS5nZXQoaSkpOworCS8vLy8gfQorCS8vLy8KKwkvLy8vIHJldHVybiByZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKTsKKwkvLyByZXR1cm4gcmVzdWx0c01hcDsKKwkvLyB9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2F0ZWdvcnlBdWRpdFN1Y2Nlc3MoU3RyaW5nIGFjdGlvbiwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiwgVXNlciB1c2VyLCBpbnQgc3RhdHVzLAorCQkJU3RyaW5nIHJlc291cmNlVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5QXVkaXRTdWNjZXNzSW50ZXJuYWwoYWN0aW9uLCBjYXRlZ29yeURlZmluaXRpb24sIG51bGwsIG51bGwsIHVzZXIsIHN0YXR1cywgcmVzb3VyY2VUeXBlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2F0ZWdvcnlBdWRpdEZhaWx1cmUoU3RyaW5nIGFjdGlvbiwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGF0YURlZmluaXRpb24sIFVzZXIgdXNlciwKKwkJCUFjdGlvblN0YXR1cyBlcnJvck1lc3NhZ2UsIGludCBzdGF0dXMsIFN0cmluZyByZXNvdXJjZVR5cGUsIE9iamVjdC4uLiB2YXJpYWJsZXMpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeUF1ZGl0RmFpbHVyZUludGVybmFsKGFjdGlvbiwgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiwgbnVsbCwgbnVsbCwgdXNlciwgZXJyb3JNZXNzYWdlLCBzdGF0dXMsCisJCQkJcmVzb3VyY2VUeXBlLCB2YXJpYWJsZXMpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzdWJDYXRlZ29yeUF1ZGl0U3VjY2VzcyhTdHJpbmcgYWN0aW9uLCBDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uLAorCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgVXNlciB1c2VyLCBpbnQgc3RhdHVzLCBTdHJpbmcgcmVzb3VyY2VUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2F0ZWdvcnlBdWRpdFN1Y2Nlc3NJbnRlcm5hbChhY3Rpb24sIGNhdGVnb3J5RGVmaW5pdGlvbiwgc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBudWxsLCB1c2VyLCBzdGF0dXMsCisJCQkJcmVzb3VyY2VUeXBlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ3JvdXBpbmdBdWRpdFN1Y2Nlc3MoU3RyaW5nIGFjdGlvbiwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeURlZmluaXRpb24sIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24sIFVzZXIgdXNlciwgaW50IHN0YXR1cywKKwkJCVN0cmluZyByZXNvdXJjZVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQljYXRlZ29yeUF1ZGl0U3VjY2Vzc0ludGVybmFsKGFjdGlvbiwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzdWJDYXRlZ29yeURlZmluaXRpb24sIGdyb3VwaW5nRGVmaW5pdGlvbiwgdXNlciwKKwkJCQlzdGF0dXMsIHJlc291cmNlVHlwZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHN1YkNhdGVnb3J5QXVkaXRGYWlsdXJlKFN0cmluZyBhY3Rpb24sIENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURhdGFEZWZpbml0aW9uLAorCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgVXNlciB1c2VyLCBBY3Rpb25TdGF0dXMgZXJyb3JNZXNzYWdlLCBpbnQgc3RhdHVzLAorCQkJU3RyaW5nIHJlc291cmNlVHlwZSwgT2JqZWN0Li4uIHZhcmlhYmxlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNhdGVnb3J5QXVkaXRGYWlsdXJlSW50ZXJuYWwoYWN0aW9uLCBjYXRlZ29yeURhdGFEZWZpbml0aW9uLCBzdWJDYXRlZ29yeURlZmluaXRpb24sIG51bGwsIHVzZXIsIGVycm9yTWVzc2FnZSwKKwkJCQlzdGF0dXMsIHJlc291cmNlVHlwZSwgdmFyaWFibGVzKTsKKwl9CisKKwkvLyBORVcgQmVubnkKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ3JvdXBpbmdBdWRpdEZhaWx1cmUoU3RyaW5nIGFjdGlvbiwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeURlZmluaXRpb24sIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24sIFVzZXIgdXNlciwKKwkJCUFjdGlvblN0YXR1cyBlcnJvck1lc3NhZ2UsIGludCBzdGF0dXMsIFN0cmluZyByZXNvdXJjZVR5cGUsIE9iamVjdC4uLiB2YXJpYWJsZXMpIHRocm93cyBFeGNlcHRpb24geworCQlncm91cGluZ0F1ZGl0RmFpbHVyZUludGVybmFsKGFjdGlvbiwgY2F0ZWdvcnlEZWZpbml0aW9uLCBzdWJDYXRlZ29yeURlZmluaXRpb24sIGdyb3VwaW5nRGVmaW5pdGlvbiwgdXNlciwKKwkJCQllcnJvck1lc3NhZ2UsIHN0YXR1cywgcmVzb3VyY2VUeXBlLCB2YXJpYWJsZXMpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZ3JvdXBpbmdBdWRpdEZhaWx1cmVJbnRlcm5hbChTdHJpbmcgYWN0aW9uLCBDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeURlZmluaXRpb24sIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24sIFVzZXIgdXNlciwKKwkJCUFjdGlvblN0YXR1cyBlcnJvck1lc3NhZ2UsIGludCBzdGF0dXMsIFN0cmluZyByZXNvdXJjZVR5cGUsIE9iamVjdC4uLiB2YXJpYWJsZXMpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoZXJyb3JNZXNzYWdlLm5hbWUoKSk7CisJCUV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCBleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCgpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhY3Rpb24pOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKHVzZXIuZ2V0RnVsbE5hbWUoKSArICIoIiArIHVzZXIuZ2V0VXNlcklkKCkgKyAiKSIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldENhdGVnb3J5TmFtZShjYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCVN0cmluZyBzdWJDYXRlZ29yeU5hbWUgPSAoc3ViQ2F0ZWdvcnlEZWZpbml0aW9uICE9IG51bGwgPyBzdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpCisJCQkJOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdWJDYXRlZ29yeU5hbWUoc3ViQ2F0ZWdvcnlOYW1lKTsKKwkJU3RyaW5nIGdyb3VwaW5nTmFtZSA9IChncm91cGluZ0RlZmluaXRpb24gIT0gbnVsbCA/IGdyb3VwaW5nRGVmaW5pdGlvbi5nZXROYW1lKCkgOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRHcm91cGluZ05hbWUoZ3JvdXBpbmdOYW1lKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKHZhcmlhYmxlcykpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNhdGVnb3J5QXVkaXQoZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCwgYWN0aW9uKTsKKwl9CisKKwkvLy8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNhdGVnb3J5QXVkaXRTdWNjZXNzSW50ZXJuYWwoU3RyaW5nIGFjdGlvbiwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeURlZmluaXRpb24sIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24sIFVzZXIgdXNlciwgaW50IHN0YXR1cywKKwkJCVN0cmluZyByZXNvdXJjZVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQkvLyByZXNvdXJjZVR5cGUgPSBTZXJ2aWNlL1Jlc291cmNlL1Byb2R1Y3QKKwkJRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0IGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0KCk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGFjdGlvbik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIodXNlci5nZXRGdWxsTmFtZSgpICsgIigiICsgdXNlci5nZXRVc2VySWQoKSArICIpIik7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0Q2F0ZWdvcnlOYW1lKGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlTdHJpbmcgc3ViQ2F0ZWdvcnlOYW1lID0gKHN1YkNhdGVnb3J5RGVmaW5pdGlvbiAhPSBudWxsID8gc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKQorCQkJCTogQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3ViQ2F0ZWdvcnlOYW1lKHN1YkNhdGVnb3J5TmFtZSk7CisJCVN0cmluZyBncm91cGluZ05hbWUgPSAoZ3JvdXBpbmdEZWZpbml0aW9uICE9IG51bGwgPyBncm91cGluZ0RlZmluaXRpb24uZ2V0TmFtZSgpIDogQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0R3JvdXBpbmdOYW1lKGdyb3VwaW5nTmFtZSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlBdWRpdChleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LCBhY3Rpb24pOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIEJFTk5OTk5OTk5ZCisJcHVibGljIGVudW0gVXNlckF1ZGl0SnNvbktleXNFbnVtIHsKKwkJQUNUSU9OKCJBQ1RJT04iKSwgTU9ESUZJRVIoIk1PRElGSUVSIiksIFNUQVRVUygiU1RBVFVTIiksIERFU0MoIkRFU0NSSVBUSU9OIiksIFVTRVJfQUZURVIoCisJCQkJIlVTRVJfQUZURVIiKSwgVVNFUl9CRUZPUkUoIlVTRVJfQkVGT1JFIik7CisJCXByaXZhdGUgU3RyaW5nIGF1ZGl0SnNvbktleU5hbWU7CisKKwkJcHJpdmF0ZSBVc2VyQXVkaXRKc29uS2V5c0VudW0oU3RyaW5nIGF1ZGl0SnNvbktleU5hbWUpIHsKKwkJCXRoaXMuYXVkaXRKc29uS2V5TmFtZSA9IGF1ZGl0SnNvbktleU5hbWU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldEF1ZGl0SnNvbktleU5hbWUoKSB7CisJCQlyZXR1cm4gYXVkaXRKc29uS2V5TmFtZS50b0xvd2VyQ2FzZSgpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQWRkVXNlckF1ZGl0KEV4cGVjdGVkVXNlckNSVURBdWRpdCBleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3QsIFN0cmluZyBhY3Rpb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGFjdGlvblRvTGlzdCA9IGdldEF1ZGl0TGlzdEJ5QWN0aW9uKGV4cGVjdGVkQWRkVXNlckF1ZGl0SmF2YU9iamVjdC5nZXRBY3Rpb24oKSwgMSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gYWN0aW9uVG9MaXN0LmdldCgwKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFVzZXJBdWRpdEpzb25LZXlzRW51bS5BQ1RJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBhY3Rpb24pOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgVXNlckF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBVc2VyQXVkaXRKc29uS2V5c0VudW0uVVNFUl9BRlRFUi5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXhwZWN0ZWRBZGRVc2VyQXVkaXRKYXZhT2JqZWN0LmdldFVzZXJBZnRlcigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFVzZXJBdWRpdEpzb25LZXlzRW51bS5VU0VSX0JFRk9SRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXhwZWN0ZWRBZGRVc2VyQXVkaXRKYXZhT2JqZWN0LmdldFVzZXJCZWZvcmUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBVc2VyQXVkaXRKc29uS2V5c0VudW0uU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3QuZ2V0U3RhdHVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgVXNlckF1ZGl0SnNvbktleXNFbnVtLkRFU0MuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBleHBlY3RlZEFkZFVzZXJBdWRpdEphdmFPYmplY3QuZ2V0RGVzYygpKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY2F0ZWdvcnlBdWRpdEZhaWx1cmVJbnRlcm5hbChTdHJpbmcgYWN0aW9uLCBDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeURlZmluaXRpb24sIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24sIFVzZXIgdXNlciwKKwkJCUFjdGlvblN0YXR1cyBlcnJvck1lc3NhZ2UsIGludCBzdGF0dXMsIFN0cmluZyByZXNvdXJjZVR5cGUsIE9iamVjdC4uLiB2YXJpYWJsZXMpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB2YWxpZGF0ZSBhdWRpdAorCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoZXJyb3JNZXNzYWdlLm5hbWUoKSk7CisJCUV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCBleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0ID0gbmV3IEV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCgpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhY3Rpb24pOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyKHVzZXIuZ2V0RnVsbE5hbWUoKSArICIoIiArIHVzZXIuZ2V0VXNlcklkKCkgKyAiKSIpOworCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LnNldENhdGVnb3J5TmFtZShjYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCVN0cmluZyBzdWJDYXRlZ29yeU5hbWUgPSAoc3ViQ2F0ZWdvcnlEZWZpbml0aW9uICE9IG51bGwgPyBzdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpCisJCQkJOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdWJDYXRlZ29yeU5hbWUoc3ViQ2F0ZWdvcnlOYW1lKTsKKwkJU3RyaW5nIGdyb3VwaW5nTmFtZSA9IChncm91cGluZ0RlZmluaXRpb24gIT0gbnVsbCA/IGdyb3VwaW5nRGVmaW5pdGlvbi5nZXROYW1lKCkgOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRHcm91cGluZ05hbWUoZ3JvdXBpbmdOYW1lKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlKTsKKwkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0RGVzYyhlcnJvckluZm8uZ2V0QXVkaXREZXNjKHZhcmlhYmxlcykpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNhdGVnb3J5QXVkaXQoZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdCwgYWN0aW9uKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVHZXRDYXRlZ29yeUhpcmFyY2h5KEV4cGVjdGVkQ2F0ZWdvcnlBdWRpdCBleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LCBTdHJpbmcgYWN0aW9uKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBhY3Rpb25Ub0xpc3QgPSBnZXRBdWRpdExpc3RCeUFjdGlvbihleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LmdldEFjdGlvbigpLCAxKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBhY3Rpb25Ub0xpc3QuZ2V0KDApOworCisJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIoZ2V0TW9kaWZpZXJTdHJpbmcoZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5nZXRNb2RpZmllck5hbWUoKSwKKwkJCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LmdldE1vZGlmaWVyVWlkKCkpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIENhdGVnb3J5QXVkaXRKc29uS2V5c0VudW0uQUNUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgYWN0aW9uKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIENhdGVnb3J5QXVkaXRKc29uS2V5c0VudW0uTU9ESUZJRVIuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QuZ2V0TW9kaWZpZXIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBDYXRlZ29yeUF1ZGl0SnNvbktleXNFbnVtLkRFVEFJTFMuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QuZ2V0RGV0YWlscygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIENhdGVnb3J5QXVkaXRKc29uS2V5c0VudW0uU1RBVFVTLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LmdldFN0YXR1cygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIENhdGVnb3J5QXVkaXRKc29uS2V5c0VudW0uREVTQ1JJUFRJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QuZ2V0RGVzYygpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNhdGVnb3J5QXVkaXQoRXhwZWN0ZWRDYXRlZ29yeUF1ZGl0IGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QsIFN0cmluZyBhY3Rpb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGFjdGlvblRvTGlzdCA9IGdldEF1ZGl0TGlzdEJ5QWN0aW9uKGV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QuZ2V0QWN0aW9uKCksIDEpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IGFjdGlvblRvTGlzdC5nZXQoMCk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBDYXRlZ29yeUF1ZGl0SnNvbktleXNFbnVtLkFDVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIGFjdGlvbik7CisJCXZhbGlkYXRlRmllbGQobWFwLCBDYXRlZ29yeUF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LmdldE1vZGlmaWVyKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgQ2F0ZWdvcnlBdWRpdEpzb25LZXlzRW51bS5DQVRFR09SWV9OQU1FLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LmdldENhdGVnb3J5TmFtZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIENhdGVnb3J5QXVkaXRKc29uS2V5c0VudW0uU1VCX0NBVEVHT1JZX05BTUUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCWV4cGVjdGVkQ2F0cmdvcnlBdWRpdEphdmFPYmplY3QuZ2V0U3ViQ2F0ZWdvcnlOYW1lKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgQ2F0ZWdvcnlBdWRpdEpzb25LZXlzRW51bS5HUk9VUElOR19OQU1FLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LmdldEdyb3VwaW5nTmFtZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIENhdGVnb3J5QXVkaXRKc29uS2V5c0VudW0uUkVTT1VSQ0VfVFlQRS5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBDYXRlZ29yeUF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksCisJCQkJZXhwZWN0ZWRDYXRyZ29yeUF1ZGl0SmF2YU9iamVjdC5nZXRTdGF0dXMoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBDYXRlZ29yeUF1ZGl0SnNvbktleXNFbnVtLkRFU0NSSVBUSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlleHBlY3RlZENhdHJnb3J5QXVkaXRKYXZhT2JqZWN0LmdldERlc2MoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIEdldENhdGVnb3J5SGllcmFyY2h5QXVkaXRTdWNjZXNzKFN0cmluZyBhY3Rpb24sIFN0cmluZyBjb21wb25lbnRUeXBlLCBVc2VyIHVzZXIsIGludCBzdGF0dXMpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXhwZWN0ZWRHZXRVc2VyTGlzdEF1ZGl0IGV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRHZXRVc2VyTGlzdEF1ZGl0KCk7CisJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGFjdGlvbik7CisJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQlleHBlY3RlZEdldExpc3RPZlVzZXJzQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3Quc2V0TW9kaWZpZXIodXNlci5nZXRGdWxsTmFtZSgpICsgIigiICsgdXNlci5nZXRVc2VySWQoKSArICIpIik7CisJCWV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3Quc2V0RGV0YWlscyhjb21wb25lbnRUeXBlLnRvTG93ZXJDYXNlKCkpOworCQl2YWxpZGF0ZUF1ZGl0R2V0TGlzdE9mVXNlcnNCeVJvbGVzKGV4cGVjdGVkR2V0TGlzdE9mVXNlcnNBdWRpdEphdmFPYmplY3QsIGFjdGlvbik7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRBcnRpZmFjdERhdGFBdWRpdChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uLmdldFRpbWVvdXQoKSA9PSBudWxsKSB7CisJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0VGltZW91dCgwKTsKKwkJfQorCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uICE9IG51bGwpIHsKKwkJCXNiLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSA9PSBudWxsID8gbnVsbAorCQkJCQk6IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpLmdldFR5cGUoKSkuYXBwZW5kKCIsIikuYXBwZW5kKCInIikKKwkJCQkJLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RMYWJlbCgpKS5hcHBlbmQoIiciKS5hcHBlbmQoIiwiKQorCQkJCQkuYXBwZW5kKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdFR5cGUoKSkuYXBwZW5kKCIsIikKKwkJCQkJLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCkpLmFwcGVuZCgiLCIpLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0VGltZW91dCgpKQorCQkJCQkuYXBwZW5kKCIsIikuYXBwZW5kKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCkpOworCQkJc2IuYXBwZW5kKCIsIik7CisJCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VmVyc2lvbigpICE9IG51bGwpIHsKKwkJCQlzYi5hcHBlbmQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VmVyc2lvbigpKTsKKwkJCX0gZWxzZSB7CisJCQkJc2IuYXBwZW5kKCIgIik7CisJCQl9CisJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RVVUlEKCkgIT0gbnVsbCkgeworCQkJCXNiLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RVVUlEKCkpOworCQkJfSBlbHNlIHsKKwkJCQlzYi5hcHBlbmQoIiAiKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZE1pc3NpbmdJbmZvcm1hdGlvbkF1ZGl0T2JqZWN0KFN0cmluZyBBY3Rpb24sCisJCQlTdHJpbmcgcmVzb3VyY2VVaWQsIENvbXBvbmVudFR5cGUgcmVzb3VyY2VUeXBlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZEF1ZGl0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRBY3Rpb24oQWN0aW9uKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRSZXNvdXJjZU5hbWUocmVzb3VyY2VVaWQpOworCQlleHBlY3RlZEF1ZGl0LnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUuZ2V0VmFsdWUoKSk7CisJCWV4cGVjdGVkQXVkaXQuc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldEN1cnJWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRNb2RpZmllck5hbWUoIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldE1vZGlmaWVyVWlkKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0UHJldkFydGlmYWN0VXVpZCgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyckFydGlmYWN0VXVpZCgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0QXJ0aWZhY3REYXRhKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRTdGF0dXMoIjQwMyIpOworCQlleHBlY3RlZEF1ZGl0LnNldERlc2MoYnVpbGRBdWRpdERlc2NyaXB0aW9uKAorCQkJCW5ldyBFcnJvclZhbGlkYXRpb25VdGlscygpLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OLm5hbWUoKSksCisJCQkJbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpKTsKKwkJcmV0dXJuIGV4cGVjdGVkQXVkaXQ7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkQ29tcG9uZW50Tm90Rm91bmRBdWRpdE9iamVjdChTdHJpbmcgQWN0aW9uLAorCQkJU3RyaW5nIHJlc291cmNlVWlkLCBDb21wb25lbnRUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIGFydGlmYWN0VWlkLCBVc2VyIHVzZXIsCisJCQlBcnJheUxpc3Q8U3RyaW5nPiBub3RGb3VuZENvbXBvbmVudCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCVN0cmluZyBkZXNjID0gbnVsbDsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkQXVkaXQgPSBuZXcgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCgpOworCQlleHBlY3RlZEF1ZGl0LnNldEFjdGlvbihBY3Rpb24pOworCQlleHBlY3RlZEF1ZGl0LnNldFJlc291cmNlTmFtZShyZXNvdXJjZVVpZCk7CisJCWV4cGVjdGVkQXVkaXQuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZS5nZXRWYWx1ZSgpKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyclZlcnNpb24oIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldE1vZGlmaWVyTmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRNb2RpZmllclVpZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldEN1cnJTdGF0ZSgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0UHJldkFydGlmYWN0VXVpZCgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyckFydGlmYWN0VXVpZChhcnRpZmFjdFVpZCk7CisJCWV4cGVjdGVkQXVkaXQuc2V0QXJ0aWZhY3REYXRhKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRTdGF0dXMoIjQwNCIpOworCisJCWlmIChyZXNvdXJjZVR5cGUuZ2V0VmFsdWUoKSA9PSBDb21wb25lbnRUeXBlLlNFUlZJQ0UuZ2V0VmFsdWUoKSkgeworCQkJZGVzYyA9IGJ1aWxkQXVkaXREZXNjcmlwdGlvbigKKwkJCQkJbmV3IEVycm9yVmFsaWRhdGlvblV0aWxzKCkucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5ELm5hbWUoKSksCisJCQkJCW5vdEZvdW5kQ29tcG9uZW50KTsKKwkJfSBlbHNlIGlmIChyZXNvdXJjZVR5cGUuZ2V0VmFsdWUoKSA9PSBDb21wb25lbnRUeXBlLlJFU09VUkNFLmdldFZhbHVlKCkpCisJCQlkZXNjID0gYnVpbGRBdWRpdERlc2NyaXB0aW9uKAorCQkJCQluZXcgRXJyb3JWYWxpZGF0aW9uVXRpbHMoKS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELm5hbWUoKSksCisJCQkJCW5vdEZvdW5kQ29tcG9uZW50KTsKKworCQlleHBlY3RlZEF1ZGl0LnNldERlc2MoZGVzYyk7CisJCXJldHVybiBleHBlY3RlZEF1ZGl0OworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZEFydGlmYWN0Tm90Rm91bmRBdWRpdE9iamVjdChTdHJpbmcgQWN0aW9uLCBTdHJpbmcgcmVzb3VyY2VVaWQsCisJCQlDb21wb25lbnRUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIGFydGlmYWN0VWlkLCBVc2VyIHVzZXIsIFN0cmluZyBjdXJyU3RhdGUsIFN0cmluZyBjdXJyVmVyc2lvbikKKwkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlTdHJpbmcgZGVzYyA9IG51bGw7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZEF1ZGl0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRBY3Rpb24oQWN0aW9uKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRSZXNvdXJjZU5hbWUocmVzb3VyY2VVaWQpOworCQlleHBlY3RlZEF1ZGl0LnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUuZ2V0VmFsdWUoKSk7CisJCWV4cGVjdGVkQXVkaXQuc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldEN1cnJWZXJzaW9uKGN1cnJWZXJzaW9uKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRNb2RpZmllck5hbWUodXNlci5nZXRGaXJzdE5hbWUoKSArICIgIiArIHVzZXIuZ2V0TGFzdE5hbWUoKSk7CisJCWV4cGVjdGVkQXVkaXQuc2V0TW9kaWZpZXJVaWQodXNlci5nZXRVc2VySWQoKSk7CisJCWV4cGVjdGVkQXVkaXQuc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRDdXJyU3RhdGUoY3VyclN0YXRlKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRQcmV2QXJ0aWZhY3RVdWlkKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRDdXJyQXJ0aWZhY3RVdWlkKGFydGlmYWN0VWlkKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRBcnRpZmFjdERhdGEoIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldFN0YXR1cygiNDA0Iik7CisKKwkJZGVzYyA9IGJ1aWxkQXVkaXREZXNjcmlwdGlvbigKKwkJCQluZXcgRXJyb3JWYWxpZGF0aW9uVXRpbHMoKS5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5ELm5hbWUoKSksCisJCQkJQXJyYXlzLmFzTGlzdCgiIikpOworCisJCWV4cGVjdGVkQXVkaXQuc2V0RGVzYyhkZXNjKTsKKwkJcmV0dXJuIGV4cGVjdGVkQXVkaXQ7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkQXJ0aWZhY3ROb3RGb3VuZEF1ZGl0T2JqZWN0KFN0cmluZyBBY3Rpb24sCisJCQlTdHJpbmcgcmVzb3VyY2VOYW1lLCBDb21wb25lbnRUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIGFydGlmYWN0VWlkLCBMaWZlY3ljbGVTdGF0ZUVudW0gbGlmZWN5Y2xlLAorCQkJVXNlciB1c2VyLCBTdHJpbmcgY3VyclZlcnNpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlTdHJpbmcgZGVzYyA9IG51bGw7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZEF1ZGl0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRBY3Rpb24oQWN0aW9uKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRSZXNvdXJjZU5hbWUocmVzb3VyY2VOYW1lKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlLmdldFZhbHVlKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRDdXJyVmVyc2lvbihjdXJyVmVyc2lvbik7CisJCWV4cGVjdGVkQXVkaXQuc2V0TW9kaWZpZXJOYW1lKHVzZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyLmdldExhc3ROYW1lKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldE1vZGlmaWVyVWlkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyclN0YXRlKGxpZmVjeWNsZS5uYW1lKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZBcnRpZmFjdFV1aWQoIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldEN1cnJBcnRpZmFjdFV1aWQoYXJ0aWZhY3RVaWQpOworCQlleHBlY3RlZEF1ZGl0LnNldEFydGlmYWN0RGF0YSgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0U3RhdHVzKCI0MDQiKTsKKworCQlkZXNjID0gYnVpbGRBdWRpdERlc2NyaXB0aW9uKAorCQkJCW5ldyBFcnJvclZhbGlkYXRpb25VdGlscygpLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQubmFtZSgpKSwKKwkJCQluZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisKKwkJZXhwZWN0ZWRBdWRpdC5zZXREZXNjKGRlc2MpOworCQlyZXR1cm4gZXhwZWN0ZWRBdWRpdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXN0cmljdGVkT3BlcmF0aW9uQXVkaXRPYmplY3QoU3RyaW5nIEFjdGlvbiwKKwkJCVN0cmluZyByZXNvdXJjZU5hbWVPclVpZCwgQ29tcG9uZW50VHlwZSByZXNvdXJjZVR5cGUsIFN0cmluZyBhcnRpZmFjdFVpZCwgVXNlciB1c2VyLCBTdHJpbmcgY3VyclZlcnNpb24sCisJCQlTdHJpbmcgY3VyclN0YXRlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGRlc2MgPSBudWxsOworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRBdWRpdCA9IG5ldyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KCk7CisJCWV4cGVjdGVkQXVkaXQuc2V0QWN0aW9uKEFjdGlvbik7CisJCWV4cGVjdGVkQXVkaXQuc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZU9yVWlkKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlLmdldFZhbHVlKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRDdXJyVmVyc2lvbihjdXJyVmVyc2lvbik7CisJCWV4cGVjdGVkQXVkaXQuc2V0TW9kaWZpZXJOYW1lKHVzZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyLmdldExhc3ROYW1lKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldE1vZGlmaWVyVWlkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyclN0YXRlKGN1cnJTdGF0ZSk7CisJCWV4cGVjdGVkQXVkaXQuc2V0UHJldkFydGlmYWN0VXVpZCgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyckFydGlmYWN0VXVpZChhcnRpZmFjdFVpZCk7CisJCWV4cGVjdGVkQXVkaXQuc2V0QXJ0aWZhY3REYXRhKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRTdGF0dXMoIjQwOSIpOworCisJCWRlc2MgPSBidWlsZEF1ZGl0RGVzY3JpcHRpb24oCisJCQkJbmV3IEVycm9yVmFsaWRhdGlvblV0aWxzKCkucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OLm5hbWUoKSksCisJCQkJbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCisJCWV4cGVjdGVkQXVkaXQuc2V0RGVzYyhkZXNjKTsKKwkJcmV0dXJuIGV4cGVjdGVkQXVkaXQ7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkSW52YWxpZENvbnRlbnRBdWRpdE9iamVjdChTdHJpbmcgQWN0aW9uLCBTdHJpbmcgcmVzb3VyY2VOYW1lLAorCQkJQ29tcG9uZW50VHlwZSByZXNvdXJjZVR5cGUsIFN0cmluZyBhcnRpZmFjdFVpZCwgVXNlciB1c2VyLCBTdHJpbmcgY3VyclZlcnNpb24sIFN0cmluZyBjdXJyU3RhdGUsCisJCQlBcnJheUxpc3Q8U3RyaW5nPiBpbnZhbGlkQ29udGVudExpc3QpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlyZXR1cm4gZXhwZWN0ZWRJbnZhbGlkQ29udGVudEF1ZGl0T2JqZWN0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQsIEFjdGlvbiwgcmVzb3VyY2VOYW1lLCByZXNvdXJjZVR5cGUsCisJCQkJYXJ0aWZhY3RVaWQsIHVzZXIsIGN1cnJWZXJzaW9uLCBjdXJyU3RhdGUsIGludmFsaWRDb250ZW50TGlzdCk7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkSW52YWxpZENvbnRlbnRBdWRpdE9iamVjdChBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLAorCQkJU3RyaW5nIEFjdGlvbiwgU3RyaW5nIHJlc291cmNlTmFtZSwgQ29tcG9uZW50VHlwZSByZXNvdXJjZVR5cGUsIFN0cmluZyBhcnRpZmFjdFVpZCwgVXNlciB1c2VyLAorCQkJU3RyaW5nIGN1cnJWZXJzaW9uLCBTdHJpbmcgY3VyclN0YXRlLCBBcnJheUxpc3Q8U3RyaW5nPiBpbnZhbGlkQ29udGVudExpc3QpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlTdHJpbmcgZGVzYyA9IG51bGw7CisKKwkJRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZEF1ZGl0ID0gbmV3IEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QoKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRBY3Rpb24oQWN0aW9uKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRSZXNvdXJjZU5hbWUocmVzb3VyY2VOYW1lKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlLmdldFZhbHVlKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZWZXJzaW9uKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRDdXJyVmVyc2lvbihjdXJyVmVyc2lvbik7CisJCWV4cGVjdGVkQXVkaXQuc2V0TW9kaWZpZXJOYW1lKHVzZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyLmdldExhc3ROYW1lKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldE1vZGlmaWVyVWlkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyclN0YXRlKGN1cnJTdGF0ZSk7CisJCWV4cGVjdGVkQXVkaXQuc2V0UHJldkFydGlmYWN0VXVpZCgiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyckFydGlmYWN0VXVpZChhcnRpZmFjdFVpZCk7CisJCWV4cGVjdGVkQXVkaXQuc2V0QXJ0aWZhY3REYXRhKCIiKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRTdGF0dXMoIjQwMCIpOworCisJCWRlc2MgPSBidWlsZEF1ZGl0RGVzY3JpcHRpb24obmV3IEVycm9yVmFsaWRhdGlvblV0aWxzKCkucGFyc2VFcnJvckNvbmZpZ1lhbWwoYWN0aW9uU3RhdHVzLm5hbWUoKSksCisJCQkJaW52YWxpZENvbnRlbnRMaXN0KTsKKworCQlleHBlY3RlZEF1ZGl0LnNldERlc2MoZGVzYyk7CisJCXJldHVybiBleHBlY3RlZEF1ZGl0OworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBleHBlY3RlZFN1Y2Nlc3NBdWRpdE9iamVjdChTdHJpbmcgQWN0aW9uLCBTdHJpbmcgcmVzb3VyY2VOYW1lLAorCQkJQ29tcG9uZW50VHlwZSByZXNvdXJjZVR5cGUsIEFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdFJlcSwgVXNlciB1c2VyLCBTdHJpbmcgY3VyclZlcnNpb24sIFN0cmluZyBjdXJyU3RhdGUsCisJCQlTdHJpbmcgcHJldkFydGlmYWN0VXVpZCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRBdWRpdCA9IG5ldyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KCk7CisJCWV4cGVjdGVkQXVkaXQuc2V0QWN0aW9uKEFjdGlvbik7CisJCWV4cGVjdGVkQXVkaXQuc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7CisJCWV4cGVjdGVkQXVkaXQuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZS5nZXRWYWx1ZSgpKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyclZlcnNpb24oY3VyclZlcnNpb24pOworCQlleHBlY3RlZEF1ZGl0LnNldE1vZGlmaWVyTmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRNb2RpZmllclVpZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRQcmV2U3RhdGUoIiIpOworCQlleHBlY3RlZEF1ZGl0LnNldEN1cnJTdGF0ZShjdXJyU3RhdGUpOworCQlleHBlY3RlZEF1ZGl0LnNldFByZXZBcnRpZmFjdFV1aWQocHJldkFydGlmYWN0VXVpZCk7CisJCWV4cGVjdGVkQXVkaXQuc2V0Q3VyckFydGlmYWN0VXVpZChhcnRpZmFjdFJlcS5nZXRVbmlxdWVJZCgpKTsKKwkJZXhwZWN0ZWRBdWRpdAorCQkJCS5zZXRBcnRpZmFjdERhdGEoYnVpbGRBcnRpZmFjdERhdGFBdWRpdChBcnRpZmFjdFV0aWxzLmNvbnZlcnRBcnRpZmFjdFJlcVRvRGVmaW5pdGlvbihhcnRpZmFjdFJlcSkpKTsKKwkJZXhwZWN0ZWRBdWRpdC5zZXRTdGF0dXMoIjIwMCIpOworCQlleHBlY3RlZEF1ZGl0LnNldERlc2MoIk9LIik7CisJCXJldHVybiBleHBlY3RlZEF1ZGl0OworCX0KKworCXB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBmaWx0ZXJBdWRpdEJ5VXVpZChTdHJpbmcgYWN0aW9uLCBTdHJpbmcgdXVpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWFjdGlvbk1hcC5wdXQoIkFDVElPTiIsIGFjdGlvbik7CisJCUpTT05PYmplY3QgYWN0aW9uSnNvbk9iamVjdCA9IG5ldyBKU09OT2JqZWN0KGFjdGlvbk1hcCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gdXVpZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQl1dWlkTWFwLnB1dCgiU0VSVklDRV9JTlNUQU5DRV9JRCIsIHV1aWQpOworCQlKU09OT2JqZWN0IHV1aWRKc29uT2JqZWN0ID0gbmV3IEpTT05PYmplY3QodXVpZE1hcCk7CisKKwkJTGlzdDxKU09OT2JqZWN0PiBmaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxKU09OT2JqZWN0PihBcnJheXMuYXNMaXN0KGFjdGlvbkpzb25PYmplY3QsIHV1aWRKc29uT2JqZWN0KSk7CisJCUpTT05PYmplY3QgYm9keSA9IGJ1aWxkRWxhc3RpY1F1ZXJ5Qm9keShmaWx0ZXJzKTsKKwkJcmV0dXJuIGJvZHk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXVkaXQoRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCByZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgU3RyaW5nIGFjdGlvbikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGFjdGlvblRvTGlzdCA9IGdldEF1ZGl0TGlzdEJ5QWN0aW9uKHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEFjdGlvbigpLCAxKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAyID0gYWN0aW9uVG9MaXN0LmdldCgwKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5BQ1RJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLCBhY3Rpb24pOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlJFU09VUkNFX05BTUUuZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFJlc291cmNlTmFtZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5SRVNPVVJDRV9UWVBFLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uUFJFVl9WRVJTSU9OLmdldEF1ZGl0SnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5nZXRQcmV2VmVyc2lvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DVVJSX1ZFUlNJT04uZ2V0QXVkaXRKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldEN1cnJWZXJzaW9uKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLk1PRElGSUVSLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0TU9ESUZJRVIoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uUFJFVl9TVEFURS5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFByZXZTdGF0ZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5DVVJSX1NUQVRFLmdldEF1ZGl0SnNvbktleU5hbWUoKSwgcmVzb3VyY2VBdWRpdEphdmFPYmplY3QuZ2V0Q3VyclN0YXRlKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcDIsIEF1ZGl0SnNvbktleXNFbnVtLlNUQVRVUy5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldFN0YXR1cygpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAyLCBBdWRpdEpzb25LZXlzRW51bS5ERVNDUklQVElPTi5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldERlc2MoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwMiwgQXVkaXRKc29uS2V5c0VudW0uQ09NTUVOVC5nZXRBdWRpdEpzb25LZXlOYW1lKCksIHJlc291cmNlQXVkaXRKYXZhT2JqZWN0LmdldENvbW1lbnQoKSk7CisJfQorCisJLy8vLy8vIHNlcnZpY2UgYXVkaXQgdmFsaWRhdGlvbi8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIHN0YXRpYyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGNvbnN0cnVjdEZpZWxkc0ZvckF1ZGl0VmFsaWRhdGlvbihTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlUmVxRGV0YWlscywKKwkJCVN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgVXNlciBzZG5jVXNlckRldGFpbHMpIHsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBuZXcgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCgpOworCisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKCJDcmVhdGUiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllclVpZChzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlTdHJpbmcgdXNlckZpcnN0TGFzdE5hbWUgPSBzZG5jVXNlckRldGFpbHMuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyBzZG5jVXNlckRldGFpbHMuZ2V0TGFzdE5hbWUoKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRNb2RpZmllck5hbWUodXNlckZpcnN0TGFzdE5hbWUpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cygiMjAwIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0RGVzYygiT0siKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZU5hbWUoc2VydmljZVJlcURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRSZXNvdXJjZVR5cGUoIlNlcnZpY2UiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbihTdHJpbmcudmFsdWVPZihGbG9hdC5wYXJzZUZsb2F0KHNlcnZpY2VWZXJzaW9uKSAtIDAuMWYpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyVmVyc2lvbihzZXJ2aWNlVmVyc2lvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q29tbWVudChudWxsKTsKKworCQlyZXR1cm4gZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oU2VydmljZVJlcURldGFpbHMgc2VydmljZVJlcURldGFpbHMsCisJCQlTdHJpbmcgc2VydmljZVZlcnNpb24sIFVzZXIgc2RuY1VzZXJEZXRhaWxzLCBBY3Rpb25TdGF0dXMgZXJyb3JTdGF0dXMsIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMpCisJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBjb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oCisJCQkJc2VydmljZVJlcURldGFpbHMsIHNlcnZpY2VWZXJzaW9uLCBzZG5jVXNlckRldGFpbHMpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoZXJyb3JTdGF0dXMubmFtZSgpKTsKKworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlTdHJpbmcgYXVkaXREZXNjID0gQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKGF1ZGl0RGVzYyk7CisKKwkJcmV0dXJuIGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy92YWxpZGF0aW9uL0Jhc2VWYWxpZGF0aW9uVXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy92YWxpZGF0aW9uL0Jhc2VWYWxpZGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjNlZTMzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vQmFzZVZhbGlkYXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKKworcHVibGljIGNsYXNzIEJhc2VWYWxpZGF0aW9uVXRpbHMgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfU1VDQ0VTUyA9IDIwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9DUkVBVEVEID0gMjAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX0RFTEVURSA9IDIwNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQgPSA0MDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfU1VDQ0VTU19OT19DT05URU5UID0gMjA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX1NVQ0NFU1NfREVMRVRFID0gMjA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT0RFX0lOVkFMSURfQ09OVEVOVCA9IDQwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9NSVNTSU5HX0RBVEEgPSA0MDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPREVfTUlTU0lOR19JTkZPUk1BVElPTiA9IDQwMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX0FDQ0VTUyA9IDQwMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9SRVNUUklDVEVEX09QRVJBVElPTiA9IDQwOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ERV9BTFJFQURZX0VYSVNUUyA9IDQwOTsKKworCS8vIC0tLS0tLQorCXByb3RlY3RlZCBzdGF0aWMgQm9vbGVhbiBjaGVja0Vycm9yQ29kZShSZXN0UmVzcG9uc2UgZGVsZXRlUmVzcG9uc2UpIHsKKwkJaWYgKGRlbGV0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IFNUQVRVU19DT0RFX1NVQ0NFU1MKKwkJCQl8fCBkZWxldGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBTVEFUVVNfQ09ERV9ERUxFVEUpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLyAqKiogU1RBVFVTIENPREUgVkFMSURBVElPTiBVVElJVElFUyAqKioqCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrU3RhdHVzQ29kZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBhc3NlcnRNZXNzYWdlLCBib29sZWFuIEFORCwgaW50Li4uIHN0YXR1c2VzKSB7CisJCWludCBzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCk7CisJCWZvciAoaW50IHN0YXR1cyA6IHN0YXR1c2VzKSB7CisJCQlpZiAoQU5EICYmIHN0YXR1c0NvZGUgIT0gc3RhdHVzKSB7CisJCQkJQXNzZXJ0LmZhaWwoYXNzZXJ0TWVzc2FnZSArICIgc3RhdHVzOiAiICsgc3RhdHVzQ29kZSk7CisJCQl9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT0gc3RhdHVzKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmICghQU5EKSB7CisJCQlBc3NlcnQuZmFpbChhc3NlcnRNZXNzYWdlICsgIiBzdGF0dXM6ICIgKyBzdGF0dXNDb2RlKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0RlbGV0ZVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQljaGVja1N0YXR1c0NvZGUocmVzcG9uc2UsICJkZWxldGUgcmVxdWVzdCBmYWlsZWQiLCBmYWxzZSwgU1RBVFVTX0NPREVfREVMRVRFLCBTVEFUVVNfQ09ERV9OT1RfRk9VTkQsCisJCQkJU1RBVFVTX0NPREVfU1VDQ0VTUyk7IC8vIFNUQVRVU19DT0RFX1NVQ0NFU1MgZm9yIGRlQWN0aXZhdGUgdXNlcgorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0NyZWF0ZVJlc3BvbnNlKFJlc3RSZXNwb25zZSByZXNwb25zZSkgeworCQljaGVja1N0YXR1c0NvZGUocmVzcG9uc2UsICJjcmVhdGUgcmVxdWVzdCBmYWlsZWQiLCBmYWxzZSwgU1RBVFVTX0NPREVfQ1JFQVRFRCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrU3VjY2VzcyhSZXN0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkJY2hlY2tTdGF0dXNDb2RlKHJlc3BvbnNlLCAicmVxdWVzdCBmYWlsZWQiLCBmYWxzZSwgU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrRXJyb3JSZXNwb25zZShSZXN0UmVzcG9uc2UgZXJyb3JSZXNwb25zZSwgQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywKKwkJCVN0cmluZy4uLiBleHBlY3RlZFZhcmlhYmxlcykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCS8vIEV4cGVjdGVkIGVycm9yCisJCUVycm9ySW5mbyBleHBlY3RlZEVycm9yID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCVN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSBleHBlY3RlZEVycm9yLmdldE1lc3NhZ2UoKTsKKworCQkvLyBBY3R1YWwgZXJyb3IKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZXJyb3JSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc3BvbnNlRm9ybWF0LmNsYXNzKTsKKwkJU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRUZXh0KCk7CisJCVN0cmluZ1tdIGFjdHVhbFZhcmlhYmxlcyA9IHJlc3BvbnNlRm9ybWF0LmdldFZhcmlhYmxlcygpOworCisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlcnJvciBtZXNzYWdlIiwgZXhwZWN0ZWRNZXNzYWdlLCBhY3R1YWxNZXNzYWdlKTsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGVycm9yIHZhcmlhYmxlcyIsIEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRWYXJpYWJsZXMpLCBBcnJheXMuYXNMaXN0KGFjdHVhbFZhcmlhYmxlcykpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0Vycm9yTWVzc2FnZVJlc3BvbnNlKFJlc3RSZXNwb25zZSBlcnJvclJlc3BvbnNlLCBBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzKQorCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCS8vIEV4cGVjdGVkIGVycm9yCisJCUVycm9ySW5mbyBleHBlY3RlZEVycm9yID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCVN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSBleHBlY3RlZEVycm9yLmdldE1lc3NhZ2UoKTsKKworCQkvLyBBY3R1YWwgZXJyb3IKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoZXJyb3JSZXNwb25zZS5nZXRSZXNwb25zZSgpLAorCQkJCVJlc3BvbnNlRm9ybWF0LmNsYXNzKTsKKwkJU3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRUZXh0KCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGVycm9yIG1lc3NhZ2UiLCBleHBlY3RlZE1lc3NhZ2UsIGFjdHVhbE1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy92YWxpZGF0aW9uL0NhdGVnb3J5VmFsaWRhdGlvblV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9DYXRlZ29yeVZhbGlkYXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjI5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9DYXRlZ29yeVZhbGlkYXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5Hcm91cGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNhdGVnb3J5UmVzdFV0aWxzOworCitwdWJsaWMgY2xhc3MgQ2F0ZWdvcnlWYWxpZGF0aW9uVXRpbHMgeworCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUNhdGVnb3J5RXhpc3RJbkdldFJlc3BvbnNlKFJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yeVJlc3QsCisJCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uKSB7CisKKwkJaW50IGNhdGVnb3JpZXNOdW0gPSBDYXRlZ29yeVJlc3RVdGlscy5nZXRNYXRjaGluZ0NhdGVnb3JpZXNOdW0oZ2V0QWxsQ2F0ZWdvcnlSZXN0LCBjYXRlZ29yeURlZmluaXRpb24pOworCQlhc3NlcnRFcXVhbHMoImNhdGVnb3J5ICIgKyBjYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpICsgIiBub3QgZm91bmQgZHVyaW5nIGdldCBvciBmb3VuZCBtb3JlIHRoYW4gb25jZSIsIDEsCisJCQkJY2F0ZWdvcmllc051bSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcnlSZXN0LAorCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbikgeworCisJCWludCBjYXRlZ29yaWVzTnVtID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0TWF0Y2hpbmdDYXRlZ29yaWVzTnVtKGdldEFsbENhdGVnb3J5UmVzdCwgY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKCJjYXRlZ29yeSAiICsgY2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKSArICIgc2hvdWxkJ3QgYmUgZm91bmQgZHVyaW5nIGdldCIsIDAsIGNhdGVnb3JpZXNOdW0pOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlTdWJDYXRlZ29yeUV4aXN0SW5HZXRSZXNwb25zZShSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcnlSZXN0LCBTdHJpbmcgcGFyZW50Q2F0ZWdvcnlJZCwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbikgeworCisJCWludCBzdWJDYXRlZ29yaWVzTnVtID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0TWF0Y2hpbmdTdWJDYXRlZ29yaWVzTnVtKGdldEFsbENhdGVnb3J5UmVzdCwgcGFyZW50Q2F0ZWdvcnlJZCwKKwkJCQlleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCWFzc2VydEVxdWFscygKKwkJCQkic3ViLWNhdGVnb3J5ICIgKyBleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkKKwkJCQkJCSsgIiBub3QgZm91bmQgZHVyaW5nIGdldCBvciBmb3VuZCBtb3JlIHRoYW4gb25jZSBmb3IgcGFyZW50SWQgIiArIHBhcmVudENhdGVnb3J5SWQsCisJCQkJMSwgc3ViQ2F0ZWdvcmllc051bSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUdyb3VwaW5nRXhpc3RJbkdldFJlc3BvbnNlKFJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yeVJlc3QsIFN0cmluZyBwYXJlbnRDYXRlZ29yeUlkLAorCQkJU3RyaW5nIHN1YkNhdGVnb3J5SWQsIEdyb3VwaW5nRGVmaW5pdGlvbiBleHBlY3RlZEdyb3VwaW5nRGVmaW5pdGlvbikgeworCisJCWludCBncm91cGluZ051bSA9IENhdGVnb3J5UmVzdFV0aWxzLmdldE1hdGNoaW5nR3JvdXBpbmdOdW0oZ2V0QWxsQ2F0ZWdvcnlSZXN0LCBwYXJlbnRDYXRlZ29yeUlkLCBzdWJDYXRlZ29yeUlkLAorCQkJCWV4cGVjdGVkR3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJzdWItY2F0ZWdvcnkgIiArIGV4cGVjdGVkR3JvdXBpbmdEZWZpbml0aW9uLmdldE5hbWUoKQorCQkJCQkJKyAiIG5vdCBmb3VuZCBkdXJpbmcgZ2V0IG9yIGZvdW5kIG1vcmUgdGhhbiBvbmNlIGZvciBwYXJlbnRJZCAiICsgcGFyZW50Q2F0ZWdvcnlJZCwKKwkJCQkxLCBncm91cGluZ051bSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUdyb3VwaW5nTm90RXhpc3RJbkdldFJlc3BvbnNlKFJlc3RSZXNwb25zZSBnZXRBbGxDYXRlZ29yeVJlc3QsIFN0cmluZyBwYXJlbnRDYXRlZ29yeUlkLAorCQkJU3RyaW5nIHN1YkNhdGVnb3J5SWQsIEdyb3VwaW5nRGVmaW5pdGlvbiBleHBlY3RlZEdyb3VwaW5nRGVmaW5pdGlvbikgeworCisJCWludCBncm91cGluZ051bSA9IENhdGVnb3J5UmVzdFV0aWxzLmdldE1hdGNoaW5nR3JvdXBpbmdOdW0oZ2V0QWxsQ2F0ZWdvcnlSZXN0LCBwYXJlbnRDYXRlZ29yeUlkLCBzdWJDYXRlZ29yeUlkLAorCQkJCWV4cGVjdGVkR3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJzdWItY2F0ZWdvcnkgIiArIGV4cGVjdGVkR3JvdXBpbmdEZWZpbml0aW9uLmdldE5hbWUoKQorCQkJCQkJKyAiIG5vdCBmb3VuZCBkdXJpbmcgZ2V0IG9yIGZvdW5kIG1vcmUgdGhhbiBvbmNlIGZvciBwYXJlbnRJZCAiICsgcGFyZW50Q2F0ZWdvcnlJZCwKKwkJCQkwLCBncm91cGluZ051bSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVN1YkNhdGVnb3J5Tm90RXhpc3RzSW5HZXRSZXNwb25zZShSZXN0UmVzcG9uc2UgZ2V0QWxsQ2F0ZWdvcnlSZXN0LCBTdHJpbmcgcGFyZW50Q2F0ZWdvcnlJZCwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbikgeworCisJCWludCBzdWJDYXRlZ29yaWVzTnVtID0gQ2F0ZWdvcnlSZXN0VXRpbHMuZ2V0TWF0Y2hpbmdTdWJDYXRlZ29yaWVzTnVtKGdldEFsbENhdGVnb3J5UmVzdCwgcGFyZW50Q2F0ZWdvcnlJZCwKKwkJCQlleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbik7CisJCWFzc2VydEVxdWFscygic3ViLWNhdGVnb3J5ICIgKyBleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkKKwkJCQkrICIgc2hvdWxkJ3QgYmUgZm91bmQgZHVyaW5nIGdldCBmb3IgcGFyZW50SWQgIiArIHBhcmVudENhdGVnb3J5SWQsIDAsIHN1YkNhdGVnb3JpZXNOdW0pOworCX0KKworCS8vLyBORUUgQmVubnkKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVDcmVhdGVHcm91cFJlc3BvbnNlKFJlc3RSZXNwb25zZSBjcmVhdGVTdWJDYXRlZ29yeVJlc3QsCisJCQlHcm91cGluZ0RlZmluaXRpb24gZXhwZWN0ZWRHcm91cERlZmluaXRpb24pIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyByZXNwb25zZSA9IGNyZWF0ZVN1YkNhdGVnb3J5UmVzdC5nZXRSZXNwb25zZSgpOworCQlKU09OT2JqZWN0IGpvYmplY3QgPSBuZXcgSlNPTk9iamVjdChyZXNwb25zZSk7CisJCWFzc2VydFRydWUoam9iamVjdC5nZXQoIm5hbWUiKS5lcXVhbHMoZXhwZWN0ZWRHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUoam9iamVjdC5nZXQoIm5vcm1hbGl6ZWROYW1lIikuZXF1YWxzKGV4cGVjdGVkR3JvdXBEZWZpbml0aW9uLmdldE5vcm1hbGl6ZWROYW1lKCkpKTsKKwkJLy8gYXNzZXJ0Tm90TnVsbChqb2JqZWN0LmdldCgibm9ybWFsaXplZE5hbWUiKSk7CisJCWFzc2VydE5vdE51bGwoam9iamVjdC5nZXQoInVuaXF1ZUlkIikpOworCQlleHBlY3RlZEdyb3VwRGVmaW5pdGlvbi5zZXRVbmlxdWVJZChqb2JqZWN0LmdldCgidW5pcXVlSWQiKS50b1N0cmluZygpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZVN1YkNhdGVnb3J5UmVzcG9uc2UoUmVzdFJlc3BvbnNlIGNyZWF0ZVN1YkNhdGVnb3J5UmVzdCwKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHJlc3BvbnNlID0gY3JlYXRlU3ViQ2F0ZWdvcnlSZXN0LmdldFJlc3BvbnNlKCk7CisJCUpTT05PYmplY3Qgam9iamVjdCA9IG5ldyBKU09OT2JqZWN0KHJlc3BvbnNlKTsKKwkJYXNzZXJ0VHJ1ZShqb2JqZWN0LmdldCgibmFtZSIpLmVxdWFscyhleHBlY3RlZFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0Tm90TnVsbChqb2JqZWN0LmdldCgibm9ybWFsaXplZE5hbWUiKSk7CisJCWFzc2VydE5vdE51bGwoam9iamVjdC5nZXQoInVuaXF1ZUlkIikpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNyZWF0ZUNhdGVnb3J5UmVzcG9uc2UoUmVzdFJlc3BvbnNlIGNyZWF0ZUNhdGVnb3J5UmVzdCwKKwkJCUNhdGVnb3J5RGVmaW5pdGlvbiBleHBlY3RlZENhdGVnb3J5RGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyByZXNwb25zZSA9IGNyZWF0ZUNhdGVnb3J5UmVzdC5nZXRSZXNwb25zZSgpOworCQlKU09OT2JqZWN0IGpvYmplY3QgPSBuZXcgSlNPTk9iamVjdChyZXNwb25zZSk7CisJCWFzc2VydFRydWUoam9iamVjdC5nZXQoIm5hbWUiKS5lcXVhbHMoZXhwZWN0ZWRDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUoam9iamVjdC5nZXQoIm5vcm1hbGl6ZWROYW1lIikuZXF1YWxzKGV4cGVjdGVkQ2F0ZWdvcnlEZWZpbml0aW9uLmdldE5vcm1hbGl6ZWROYW1lKCkpKTsKKwkJYXNzZXJ0Tm90TnVsbChqb2JqZWN0LmdldCgidW5pcXVlSWQiKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9Dc2FyVmFsaWRhdGlvblV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9Dc2FyVmFsaWRhdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmOWU4NAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy92YWxpZGF0aW9uL0NzYXJWYWxpZGF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUucGFyc2VyLkpTT05QYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Hcm91cEhlYXRNZXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvcGVydHlIZWF0TWV0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlR5cGVIZWF0TWV0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXMuVG9zY2FEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnRvc2NhLmRhdGF0eXBlcy5Ub3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy50b3NjYS5kYXRhdHlwZXMuVG9zY2FSZXF1aXJlbWVudHNOb2RlVGVtcGxhdGVzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQmFzZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkltcG9ydFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGkuUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuWmlwVXRpbDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgQ3NhclZhbGlkYXRpb25VdGlscyB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENzYXJWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENzYXJQYXlsb2FkKFN0cmluZyBjc2FyTmFtZSwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXkgY3NhciA9IEltcG9ydFJlc3RVdGlscy5nZXRDc2FyKGNzYXJOYW1lLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJYXNzZXJ0VHJ1ZSgiUmV0dXJuIHJlc3BvbnNlIGNvZGUgZGlmZmVyZW50IGZyb20gMjAwIiwgY3Nhci5nZXRIdHRwU3RhdHVzQ29kZSgpID09IEJhc2VSZXN0VXRpbHMuU1RBVFVTX0NPREVfU1VDQ0VTUyk7CisJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gcmVhZFppcCA9IG51bGw7CisJCWJ5dGVbXSBkYXRhID0gY3Nhci5nZXRSZXNwb25zZSgpOworCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoID4gMCkgeworCQkJcmVhZFppcCA9IFppcFV0aWwucmVhZFppcChkYXRhKTsKKworCQl9CisKKwkJYnl0ZVtdIGFydGlmYWN0c0JzID0gcmVhZFppcC5nZXQoZmlsZUxvY2F0aW9uKTsKKwkJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoYXJ0aWZhY3RzQnMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworCisJCXJldHVybiBzdHI7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8VHlwZUhlYXRNZXRhRGVmaW5pdGlvbj4gZ2V0TGlzdFR5cGVIZWF0TWV0YURlZmluaXRpb24oU3RyaW5nIGNzYXJVVUlEKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgYXJ0aWZhY3RIZWF0TWV0YUxvY2F0aW9uID0gIkFydGlmYWN0cy9IRUFULm1ldGEiOworCQlKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7CisJCVN0cmluZyBjc2FyUGF5bG9hZCA9IGdldENzYXJQYXlsb2FkKGNzYXJVVUlELCBhcnRpZmFjdEhlYXRNZXRhTG9jYXRpb24pOworCQlpZiAoY3NhclBheWxvYWQgIT0gbnVsbCkgeworCQkJT2JqZWN0IHBhcnNlID0gcGFyc2VyLnBhcnNlKGNzYXJQYXlsb2FkKTsKKwkJCUpTT05PYmplY3QganNvbk9iamVjdCA9IChKU09OT2JqZWN0KSBwYXJzZTsKKwkJCUpTT05PYmplY3QganNvbk9iamVjdEltcG9ydFN0cnVjdHVyZSA9IChKU09OT2JqZWN0KSBqc29uT2JqZWN0LmdldCgiaW1wb3J0U3RydWN0dXJlIik7CisJCQlMaXN0PFR5cGVIZWF0TWV0YURlZmluaXRpb24+IGxpc3RIZWF0TWV0YURlZmVuaXRpb24gPSBuZXcgQXJyYXlMaXN0PFR5cGVIZWF0TWV0YURlZmluaXRpb24+KCk7CisJCQlsaXN0SGVhdE1ldGFEZWZlbml0aW9uID0gZ2V0QXJ0aWZhY3RzQnlHcm91cChqc29uT2JqZWN0SW1wb3J0U3RydWN0dXJlLCBsaXN0SGVhdE1ldGFEZWZlbml0aW9uKTsKKwkJCXJldHVybiBsaXN0SGVhdE1ldGFEZWZlbml0aW9uOworCQl9CisJCXJldHVybiBudWxsOworCisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFR5cGVIZWF0TWV0YURlZmluaXRpb24+IGdldEFydGlmYWN0c0J5R3JvdXAoSlNPTk9iamVjdCBqc29uT2JqZWN0SW1wb3J0U3RydWN0dXJlLCBMaXN0PFR5cGVIZWF0TWV0YURlZmluaXRpb24+IGxpc3RIZWF0TWV0YURlZmVuaXRpb24pIHsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJU2V0PE9iamVjdD4gdHlwZVNldCA9IGpzb25PYmplY3RJbXBvcnRTdHJ1Y3R1cmUua2V5U2V0KCk7CisJCWZvciAoT2JqZWN0IHR5cGUgOiB0eXBlU2V0KSB7CisJCQlUeXBlSGVhdE1ldGFEZWZpbml0aW9uIGhlYXRNZXRhRGVmZW5pdGlvbiA9IG5ldyBUeXBlSGVhdE1ldGFEZWZpbml0aW9uKCk7CisJCQlsb2cuZGVidWcodHlwZS50b1N0cmluZygpKTsKKwkJCWxvZy5kZWJ1Zygie30iLCBqc29uT2JqZWN0SW1wb3J0U3RydWN0dXJlLmdldCh0eXBlKSk7CisJCQlKU09OQXJyYXkgYXJyYXkgPSAoSlNPTkFycmF5KSBqc29uT2JqZWN0SW1wb3J0U3RydWN0dXJlLmdldCh0eXBlKTsKKwkJCWhlYXRNZXRhRGVmZW5pdGlvbi5zZXRUeXBlTmFtZSgoU3RyaW5nKSB0eXBlKTsKKwkJCUxpc3Q8R3JvdXBIZWF0TWV0YURlZmluaXRpb24+IGdyb3VwSGVhdE1ldGFEZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8R3JvdXBIZWF0TWV0YURlZmluaXRpb24+KCk7CisJCQloZWF0TWV0YURlZmVuaXRpb24uc2V0R3JvdXBIZWF0TWV0YURlZmluaXRpb24oZmV0Y2hBcnRpZmFjdEJ5R3JvdXAoYXJyYXksIGdyb3VwSGVhdE1ldGFEZWZpbml0aW9ucywgdHJ1ZSkpOworCQkJbGlzdEhlYXRNZXRhRGVmZW5pdGlvbi5hZGQoaGVhdE1ldGFEZWZlbml0aW9uKTsKKwkJfQorCQlyZXR1cm4gbGlzdEhlYXRNZXRhRGVmZW5pdGlvbjsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8R3JvdXBIZWF0TWV0YURlZmluaXRpb24+IGZldGNoQXJ0aWZhY3RCeUdyb3VwKEpTT05BcnJheSBhcnJheSwgTGlzdDxHcm91cEhlYXRNZXRhRGVmaW5pdGlvbj4gbGlzdEdyb3VwSGVhdE1ldGFEZWZpbml0aW9uLCBCb29sZWFuIG9wZW5OZXdHcm91cCkgeworCisJCUdyb3VwSGVhdE1ldGFEZWZpbml0aW9uIGdyb3VwSGVhdE1ldGFEZWZpbml0aW9uOworCisJCWlmIChhcnJheSAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5LnNpemUoKTsgaSsrKSB7CisJCQkJaWYgKG9wZW5OZXdHcm91cCkgeworCQkJCQlncm91cEhlYXRNZXRhRGVmaW5pdGlvbiA9IG5ldyBHcm91cEhlYXRNZXRhRGVmaW5pdGlvbigpOworCQkJCQlpbnQgZ3JvdXBOdW1iZXIgPSBsaXN0R3JvdXBIZWF0TWV0YURlZmluaXRpb24uc2l6ZSgpICsgMTsKKwkJCQkJbG9nLmRlYnVnKCJncm91cE5hbWU9e30iLCBncm91cE51bWJlcik7CisJCQkJCWdyb3VwSGVhdE1ldGFEZWZpbml0aW9uLnNldEdyb3VwKGdyb3VwTnVtYmVyKTsKKwkJCQkJbGlzdEdyb3VwSGVhdE1ldGFEZWZpbml0aW9uLmFkZChncm91cEhlYXRNZXRhRGVmaW5pdGlvbik7CisJCQkJCVByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uIHByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uID0gbmV3IFByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uKCk7CisJCQkJCXByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uLnNldE5hbWUoImlzQmFzZSIpOworCQkJCQlwcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbi5zZXRWYWx1ZShmYWxzZSk7CisJCQkJCWdyb3VwSGVhdE1ldGFEZWZpbml0aW9uLnNldFByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uKHByb3BlcnR5SGVhdE1ldGFEZWZpbml0aW9uKTsKKwkJCQl9CisJCQkJZ3JvdXBIZWF0TWV0YURlZmluaXRpb24gPSBsaXN0R3JvdXBIZWF0TWV0YURlZmluaXRpb24uZ2V0KGxpc3RHcm91cEhlYXRNZXRhRGVmaW5pdGlvbi5zaXplKCkgLSAxKTsKKwkJCQlKU09OT2JqZWN0IGpzb25PYmplY3QgPSAoSlNPTk9iamVjdCkgYXJyYXkuZ2V0KGkpOworCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCVNldDxPYmplY3Q+IGdyb3Vwc0tleSA9IGpzb25PYmplY3Qua2V5U2V0KCk7CisJCQkJZm9yIChPYmplY3QgZ3JvdXBLZXkgOiBncm91cHNLZXkpIHsKKwkJCQkJU3RyaW5nIGdyb3VwS2V5U3RyID0gKFN0cmluZykgZ3JvdXBLZXk7CisJCQkJCWlmIChncm91cEtleVN0ci5lcXVhbHMoImlzQmFzZSIpKSB7CisJCQkJCQlQcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbiBwcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbiA9IG5ldyBQcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbigpOworCQkJCQkJcHJvcGVydHlIZWF0TWV0YURlZmluaXRpb24uc2V0TmFtZShncm91cEtleVN0cik7CisJCQkJCQlwcm9wZXJ0eUhlYXRNZXRhRGVmaW5pdGlvbi5zZXRWYWx1ZSgoYm9vbGVhbikganNvbk9iamVjdC5nZXQoZ3JvdXBLZXlTdHIpKTsKKwkJCQkJCWlmICghZ3JvdXBIZWF0TWV0YURlZmluaXRpb24uZ2V0UHJvcGVydHlIZWF0TWV0YURlZmluaXRpb24oKS5lcXVhbHMocHJvcGVydHlIZWF0TWV0YURlZmluaXRpb24pKSB7CisJCQkJCQkJZ3JvdXBIZWF0TWV0YURlZmluaXRpb24uZ2V0UHJvcGVydHlIZWF0TWV0YURlZmluaXRpb24oKS5zZXRWYWx1ZSgoYm9vbGVhbikganNvbk9iamVjdC5nZXQoZ3JvdXBLZXlTdHIpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoZ3JvdXBLZXlTdHIuZXF1YWxzKCJmaWxlTmFtZSIpIHx8IGdyb3VwS2V5U3RyLmVxdWFscygiZW52IikpIHsKKwkJCQkJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAoU3RyaW5nKSBqc29uT2JqZWN0LmdldChncm91cEtleVN0cik7CisJCQkJCQlMaXN0PFN0cmluZz4gbGlzdEFydGlmYWN0TmFtZXMgPSBncm91cEhlYXRNZXRhRGVmaW5pdGlvbi5nZXRBcnRpZmFjdExpc3QoKTsKKwkJCQkJCWxpc3RBcnRpZmFjdE5hbWVzLmFkZChhcnRpZmFjdE5hbWUpOworCQkJCQkJZ3JvdXBIZWF0TWV0YURlZmluaXRpb24uc2V0QXJ0aWZhY3RMaXN0KGxpc3RBcnRpZmFjdE5hbWVzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICghZ3JvdXBLZXlTdHIuZXF1YWxzKCJpc0Jhc2UiKSkgeworCQkJCQkJCWZldGNoQXJ0aWZhY3RCeUdyb3VwKChKU09OQXJyYXkpIGpzb25PYmplY3QuZ2V0KGdyb3VwS2V5U3RyKSwgbGlzdEdyb3VwSGVhdE1ldGFEZWZpbml0aW9uLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGxpc3RHcm91cEhlYXRNZXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJbnRlZ2VyIGdldEFydGlmYWN0Q291bnQoTGlzdDxUeXBlSGVhdE1ldGFEZWZpbml0aW9uPiBsaXN0SGVhdE1ldGFEZWZlbml0aW9uLCBCb29sZWFuIGlzRW52SW5jbHVkZWQpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJTGlzdDxTdHJpbmc+IHVuaXFlQXJ0aWZhY3RMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJZm9yIChUeXBlSGVhdE1ldGFEZWZpbml0aW9uIHR5cGVIZWF0TWV0YURlZmluaXRpb24gOiBsaXN0SGVhdE1ldGFEZWZlbml0aW9uKSB7CisJCQlmb3IgKEdyb3VwSGVhdE1ldGFEZWZpbml0aW9uIGdyb3VwSGVhdE1ldGFEZWZpbml0aW9uIDogdHlwZUhlYXRNZXRhRGVmaW5pdGlvbi5nZXRHcm91cEhlYXRNZXRhRGVmaW5pdGlvbigpKSB7CisJCQkJaWYgKGlzRW52SW5jbHVkZWQpIHsKKwkJCQkJY291bnQgPSBjb3VudCArIGdyb3VwSGVhdE1ldGFEZWZpbml0aW9uLmdldEFydGlmYWN0TGlzdCgpLnNpemUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGdyb3VwSGVhdE1ldGFEZWZpbml0aW9uLmdldEFydGlmYWN0TGlzdCgpKSB7CisJCQkJCQlpZiAoIWZpbGVOYW1lLmNvbnRhaW5zKCIuZW52IikgJiYgIXVuaXFlQXJ0aWZhY3RMaXN0LmNvbnRhaW5zKGZpbGVOYW1lKSkgeworCQkJCQkJCXVuaXFlQXJ0aWZhY3RMaXN0LmFkZChmaWxlTmFtZSk7CisJCQkJCQkJY291bnQgPSBjb3VudCArIDE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KKworCXByaXZhdGUgc3RhdGljIEludGVnZXIgZ2V0R3JvdXBDb3VudChMaXN0PFR5cGVIZWF0TWV0YURlZmluaXRpb24+IGxpc3RIZWF0TWV0YURlZmVuaXRpb24pIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJZm9yIChUeXBlSGVhdE1ldGFEZWZpbml0aW9uIHR5cGVIZWF0TWV0YURlZmluaXRpb24gOiBsaXN0SGVhdE1ldGFEZWZlbml0aW9uKSB7CisJCQljb3VudCA9IGNvdW50ICsgdHlwZUhlYXRNZXRhRGVmaW5pdGlvbi5nZXRHcm91cEhlYXRNZXRhRGVmaW5pdGlvbigpLnNpemUoKTsKKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdyb3VwTmFtZUJ1aWxkZXIoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJU3RyaW5nIHNlcGFyYXRvciA9ICI6OiI7CisJCVN0cmluZyBtb2R1bGUgPSAibW9kdWxlLSI7CisJCVN0cmluZyBncm91cE5hbWUgPSByZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCkgKyBzZXBhcmF0b3IgKyBtb2R1bGU7CisJCXJldHVybiBncm91cE5hbWU7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQ3NhclZmQXJ0aWZhY3QoU3RyaW5nIGNzYXJVVUlELCBSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTGlzdDxUeXBlSGVhdE1ldGFEZWZpbml0aW9uPiBsaXN0VHlwZUhlYXRNZXRhRGVmaW5pdGlvbiA9IGdldExpc3RUeXBlSGVhdE1ldGFEZWZpbml0aW9uKGNzYXJVVUlEKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgZ3JvdXAgY291bnQsIGV4cGVjdGVkOiAiICsgZ2V0R3JvdXBDb3VudChsaXN0VHlwZUhlYXRNZXRhRGVmaW5pdGlvbikgKyAiLCBhY3R1YWw6ICIgKyByZXNvdXJjZS5nZXRHcm91cHMoKS5zaXplKCksIGdldEdyb3VwQ291bnQobGlzdFR5cGVIZWF0TWV0YURlZmluaXRpb24pID09IHJlc291cmNlLmdldEdyb3VwcygpLnNpemUoKSk7CisJCWFzc2VydFRydWUoImNoZWNrIGFydGlmYWN0IGNvdW50LCBleHBlY3RlZDogIiArIGdldEFydGlmYWN0Q291bnQobGlzdFR5cGVIZWF0TWV0YURlZmluaXRpb24sIGZhbHNlKSArICIsIGFjdHVhbDogIiArIHJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS5zaXplKCksCisJCQkJZ2V0QXJ0aWZhY3RDb3VudChsaXN0VHlwZUhlYXRNZXRhRGVmaW5pdGlvbiwgZmFsc2UpID09IHJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS5zaXplKCkpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVG9zY2FEZWZpbml0b25PYmplY3RWc1Jlc291cmNlKFRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24sIFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlhc3NlcnRUcnVlKCJjaGVjayByZXNvdXJjZSBpbnN0YW5jZSBjb3VudCwgZXhwZWN0ZWQ6ICIgKyBnZXRSZXNvdXJjZUluc3RhbmNlQ291bnQodG9zY2FEZWZpbml0aW9uKSArICIsIGFjdHVhbDogIiArIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSwKKwkJCQlnZXRSZXNvdXJjZUluc3RhbmNlQ291bnQodG9zY2FEZWZpbml0aW9uKSA9PSByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zaXplKCkpOworCQlhc3NlcnRUcnVlKCJjaGVjayByZXNvdXJjZSBpbnN0YW5jZSByZWxhdGlvbiBjb3VudCwgZXhwZWN0ZWQ6ICIgKyBnZXRSZXNvdXJjZUluc3RhbmNlUmVsYXRpb25Db3VudCh0b3NjYURlZmluaXRpb24pICsgIiwgYWN0dWFsOiAiICsgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKCkuc2l6ZSgpLAorCQkJCWdldFJlc291cmNlSW5zdGFuY2VSZWxhdGlvbkNvdW50KHRvc2NhRGVmaW5pdGlvbikgPT0gcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKCkuc2l6ZSgpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBnZXRSZXNvdXJjZUluc3RhbmNlQ291bnQoVG9zY2FEZWZpbml0aW9uIHRvc2NhRGVmaW5pdGlvbikgeworCisJCXJldHVybiB0b3NjYURlZmluaXRpb24uZ2V0VG9zY2FUb3BvbG9neVRlbXBsYXRlKCkuZ2V0VG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24oKS5zaXplKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldFJlc291cmNlSW5zdGFuY2VSZWxhdGlvbkNvdW50KFRvc2NhRGVmaW5pdGlvbiB0b3NjYURlZmluaXRpb24pIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJTGlzdDxUb3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbj4gdG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24gPSB0b3NjYURlZmluaXRpb24uZ2V0VG9zY2FUb3BvbG9neVRlbXBsYXRlKCkuZ2V0VG9zY2FOb2RlVGVtcGxhdGVzVG9wb2xvZ3lUZW1wbGF0ZURlZmluaXRpb24oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5zaXplKCk7IGkrKykgeworCQkJTGlzdDxUb3NjYVJlcXVpcmVtZW50c05vZGVUZW1wbGF0ZXNEZWZpbml0aW9uPiByZXF1aXJlbWVudHMgPSB0b3NjYU5vZGVUZW1wbGF0ZXNUb3BvbG9neVRlbXBsYXRlRGVmaW5pdGlvbi5nZXQoaSkuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCQlpZiAocmVxdWlyZW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKFRvc2NhUmVxdWlyZW1lbnRzTm9kZVRlbXBsYXRlc0RlZmluaXRpb24gcmVxdWlyZW1lbnQgOiByZXF1aXJlbWVudHMpIHsKKwkJCQkJaWYgKHJlcXVpcmVtZW50LmdldE5vZGUoKSAhPSBudWxsKSB7CisJCQkJCQljb3VudCA9IGNvdW50ICsgMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCisJLy8gbm90IGZpbmlzaGVkIHlldAorCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVDc2FyVmZncm91cChTdHJpbmcgY3NhclVVSUQsIFJlc291cmNlIHJlc291cmNlKSB7CisKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcyA9IHJlc291cmNlLmdldEdyb3VwcygpOworCQlmb3IgKEdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24gOiBncm91cHMpIHsKKwkJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHMgPSBncm91cERlZmluaXRpb24uZ2V0QXJ0aWZhY3RzKCk7CisJCQlhc3NlcnRUcnVlKCJncm91cCBkZXNjcmlwdGlvbiBpcyBudWxsIiwgZ3JvdXBEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCk7CisJCQlhc3NlcnRUcnVlKCJJbnZhcmlhbnRVVUlEIGlzIG51bGwiLCBncm91cERlZmluaXRpb24uZ2V0SW52YXJpYW50VVVJRCgpICE9IG51bGwpOworCQkJLy8gZ3JvdXBEZWZpbml0aW9uLmdldE1lbWJlcnMoKTsKKwkJCWFzc2VydFRydWUoIm5hbWUgZm9ybWF0IG1pc21hdGNoLCBleHBlY3RlZDogIiArIGdyb3VwTmFtZUJ1aWxkZXIocmVzb3VyY2UpICsgIlswLTldLCBhY3R1YWw6ICIgKyBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLCBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLmNvbnRhaW5zKGdyb3VwTmFtZUJ1aWxkZXIocmVzb3VyY2UpKSk7CisJCQkvLyBncm91cERlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCQkJLy8gZ3JvdXBEZWZpbml0aW9uLmdldFByb3BlcnR5VmFsdWVDb3VudGVyKCk7CisJCQlhc3NlcnRUcnVlKGdyb3VwRGVmaW5pdGlvbi5nZXRUeXBlKCkuZXF1YWxzKGdldEdyb3VwVHlwZSgpKSk7CisJCX0KKworCQlTdHJpbmcgZXhwZWN0ZWRDc2FyVVVJRCA9IGNzYXJVVUlEOworCQkvLyBTdHJpbmcgZXhwZWN0ZWRUb3NjYVJlc291cmNlTmFtZSA9ICJvcmcub3BlbmVjb21wLnJlc291cmNlLnZmLiIgKworCQkvLyBXb3JkVXRpbHMuY2FwaXRhbGl6ZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQkvLworCQkvLyBhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRDc2FyVVVJRCwKKwkJLy8gcmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksCisJCS8vIGV4cGVjdGVkQ3NhclVVSUQuZXF1YWxzKHJlc291cmNlLmdldENzYXJVVUlEKCkpKTsKKwkJLy8gYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsKKwkJLy8gYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsCisJCS8vIHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLAorCQkvLyBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhyZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisJCS8vCisJCS8vIFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0KKwkJLy8gUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCS8vIFJlc291cmNlIGdldFJlc291cmNlID0KKwkJLy8gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJLy8gUmVzb3VyY2UuY2xhc3MpOworCQkvLyBhc3NlcnRUcnVlKCJjc2FyVVVJRCA6ICIgKyBidWlsZEFzc2VydE1lc3NhZ2UoZXhwZWN0ZWRDc2FyVVVJRCwKKwkJLy8gZ2V0UmVzb3VyY2UuZ2V0Q3NhclVVSUQoKSksCisJCS8vIGV4cGVjdGVkQ3NhclVVSUQuZXF1YWxzKGdldFJlc291cmNlLmdldENzYXJVVUlEKCkpKTsKKwkJLy8gYXNzZXJ0VHJ1ZSgidG9zY2FSZXNvdXJjZU5hbWUgOiAiICsKKwkJLy8gYnVpbGRBc3NlcnRNZXNzYWdlKGV4cGVjdGVkVG9zY2FSZXNvdXJjZU5hbWUsCisJCS8vIGdldFJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpLAorCQkvLyBleHBlY3RlZFRvc2NhUmVzb3VyY2VOYW1lLmVxdWFscyhnZXRSZXNvdXJjZS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBUeXBlKCkgeworCQlyZXR1cm4gIm9yZy5vcGVuZWNvbXAuZ3JvdXBzLlZmTW9kdWxlIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy92YWxpZGF0aW9uL0Vycm9yVmFsaWRhdGlvblV0aWxzLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9FcnJvclZhbGlkYXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWEwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9FcnJvclZhbGlkYXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuRXJyb3JJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FeGNlcHRpb25FbnVtVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOworCitwdWJsaWMgY2xhc3MgRXJyb3JWYWxpZGF0aW9uVXRpbHMgeworCisJc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihTdHJpbmcgZXJyb3JUeXBlLCBMaXN0PFN0cmluZz4gdmFyaWFibGVzLCBTdHJpbmcgYWN0dWFsUmVzcG9uc2UpCisJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uIHsKKworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gcGFyc2VFcnJvckNvbmZpZ1lhbWwoZXJyb3JUeXBlKTsKKwkJSlNPTk9iamVjdCBleHBlY3RlZFJlc3BvbnNlQm9keSA9IG51bGw7CisJCWlmIChlcnJvckluZm8uZ2V0TWVzc2FnZUlkKCkgIT0gbnVsbCkgeworCQkJaWYgKGVycm9ySW5mby5nZXRNZXNzYWdlSWQoKS5jb250YWlucygiU1ZDIikpIHsKKwkJCQlleHBlY3RlZFJlc3BvbnNlQm9keSA9IHJlc3RFeGNlcHRpb25Gb3JtYXRCdWlsZGVyKGVycm9ySW5mby5nZXRNZXNzYWdlSWQoKSwgZXJyb3JJbmZvLmdldE1lc3NhZ2UoKSwKKwkJCQkJCXZhcmlhYmxlcywgRXhjZXB0aW9uRW51bVR5cGUuU0VSVklDRV9FWENFUFRJT04uZ2V0VmFsdWUoKSk7CisJCQl9IGVsc2UgeworCQkJCWV4cGVjdGVkUmVzcG9uc2VCb2R5ID0gcmVzdEV4Y2VwdGlvbkZvcm1hdEJ1aWxkZXIoZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpLCBlcnJvckluZm8uZ2V0TWVzc2FnZSgpLAorCQkJCQkJdmFyaWFibGVzLCBFeGNlcHRpb25FbnVtVHlwZS5QT0xJQ1lfRVhDUFRJT04uZ2V0VmFsdWUoKSk7CisJCQl9CisJCX0KKwkJYWN0dWFsUmVzcG9uc2UgPSBhY3R1YWxSZXNwb25zZS5yZXBsYWNlQWxsKCJcXG4iLCAiIik7CisJCWxvZ2dlci5kZWJ1ZygiYWN0dWFsUmVzcG9uc2UgLSB7fSIsIGFjdHVhbFJlc3BvbnNlKTsKKwkJbG9nZ2VyLmRlYnVnKCJleHBlY3RlZFJlc3BvbnNlQm9keSAtIHt9IiwgZXhwZWN0ZWRSZXNwb25zZUJvZHkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXNwb25zZUJvZHksIG5ldyBKU09OT2JqZWN0KGFjdHVhbFJlc3BvbnNlKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBKU09OT2JqZWN0IHJlc3RFeGNlcHRpb25Gb3JtYXRCdWlsZGVyKFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyB0ZXh0LCBMaXN0PFN0cmluZz4gdmFyaWFibGVzLAorCQkJU3RyaW5nIHR5cGUpIHsKKworCQlKU09OT2JqZWN0IHNpbXBsZUVsZW1lbnRzID0gbmV3IEpTT05PYmplY3QoKTsKKwkJSlNPTk9iamVjdCBleGNlcHRpb25UeXBlID0gbmV3IEpTT05PYmplY3QoKTsKKwkJSlNPTk9iamVjdCByZXF1ZXN0RXJyb3IgPSBuZXcgSlNPTk9iamVjdCgpOworCisJCXRyeSB7CisJCQlzaW1wbGVFbGVtZW50cy5wdXQoIm1lc3NhZ2VJZCIsIG1lc3NhZ2VJZCk7CisJCQlzaW1wbGVFbGVtZW50cy5wdXQoInRleHQiLCB0ZXh0KTsKKwkJCXNpbXBsZUVsZW1lbnRzLnB1dCgidmFyaWFibGVzIiwgdmFyaWFibGVzKTsKKwkJCWV4Y2VwdGlvblR5cGUucHV0KHR5cGUsIHNpbXBsZUVsZW1lbnRzKTsKKwkJCXJlcXVlc3RFcnJvci5wdXQoInJlcXVlc3RFcnJvciIsIGV4Y2VwdGlvblR5cGUpOworCisJCX0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCXJldHVybiByZXF1ZXN0RXJyb3I7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVycm9ySW5mbyBwYXJzZUVycm9yQ29uZmlnWWFtbChTdHJpbmcgZXJyb3IpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlZYW1sIHlhbWwgPSBuZXcgWWFtbCgpOworCQlFcnJvckluZm8gZXJySW5mbyA9IG51bGw7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIGVycm9yQ29uZmlndXJhdGlvbkZpbGUgPSBjb25maWcuZ2V0RXJyb3JDb25maWd1cmF0aW9uRmlsZSgpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShlcnJvckNvbmZpZ3VyYXRpb25GaWxlKTsKKwkJLy8gRmlsZSBmaWxlID0gbmV3CisJCS8vIEZpbGUoIi4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwiKTsKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCQlNYXA8PywgPz4gbWFwID0gKE1hcDw/LCA/PikgeWFtbC5sb2FkKGlucHV0U3RyZWFtKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKG1hcC5nZXQoImVycm9ycyIpKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCU1hcDxTdHJpbmcsIEVycm9ySW5mbz4gZXJyb3JNYXAgPSAoTWFwPFN0cmluZywgRXJyb3JJbmZvPikgbWFwLmdldCgiZXJyb3JzIik7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVycm9ySW5mbyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBlcnJvck1hcC5nZXQoZXJyb3IpOworCisJCVN0cmluZyBtZXNzYWdlID0gKFN0cmluZykgZXJyb3JJbmZvLmdldCgibWVzc2FnZSIpOworCQlTdHJpbmcgbWVzc2FnZUlkID0gKFN0cmluZykgZXJyb3JJbmZvLmdldCgibWVzc2FnZUlkIik7CisJCWludCBjb2RlID0gKEludGVnZXIpIGVycm9ySW5mby5nZXQoImNvZGUiKTsKKwkJZXJySW5mbyA9IG5ldyBFcnJvckluZm8oY29kZSwgbWVzc2FnZSwgbWVzc2FnZUlkKTsKKworCQlyZXR1cm4gZXJySW5mbzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy92YWxpZGF0aW9uL1Byb2R1Y3RWYWxpZGF0aW9uVXRpbHMuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlscy92YWxpZGF0aW9uL1Byb2R1Y3RWYWxpZGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTUxMTRjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vUHJvZHVjdFZhbGlkYXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb2R1Y3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuR3JvdXBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3QuQ29tcG9uZW50T3BlcmF0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBQcm9kdWN0VmFsaWRhdGlvblV0aWxzIHsKKworCXN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsUHJvZHVjdHMoUHJvZHVjdCBleHBlY3RlZFByb2R1Y3QsIFByb2R1Y3QgYWN0dWFsUHJvZHVjdCkgeworCQljb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QsIG51bGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wYXJlRXhwZWN0ZWRBbmRBY3R1YWxQcm9kdWN0cyhQcm9kdWN0IGV4cGVjdGVkUHJvZHVjdCwgUHJvZHVjdCBhY3R1YWxQcm9kdWN0LAorCQkJQ29tcG9uZW50T3BlcmF0aW9uRW51bSBvcGVyYXRpb24pIHsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9kdWN0LmdldE5hbWUoKSwgYWN0dWFsUHJvZHVjdC5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9kdWN0LmdldEZ1bGxOYW1lKCksIGFjdHVhbFByb2R1Y3QuZ2V0RnVsbE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFByb2R1Y3QuZ2V0RGVzY3JpcHRpb24oKSwgYWN0dWFsUHJvZHVjdC5nZXREZXNjcmlwdGlvbigpKTsKKworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRDb250YWN0cyA9IGV4cGVjdGVkUHJvZHVjdC5nZXRDb250YWN0cygpOworCQlMaXN0PFN0cmluZz4gYWN0dWFsQ29udGFjdHMgPSBhY3R1YWxQcm9kdWN0LmdldENvbnRhY3RzKCk7CisJCWFzc2VydFRydWUoCisJCQkJIkV4cGVjdGVkIGNvbnRhY3RzOiIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWRDb250YWN0cy50b0FycmF5KCkpICsgIiwgYWN0dWFsIGNvbnRhY3RzOiIKKwkJCQkJCSsgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbENvbnRhY3RzLnRvQXJyYXkoKSksCisJCQkJZXhwZWN0ZWRDb250YWN0cy5zaXplKCkgPT0gYWN0dWFsQ29udGFjdHMuc2l6ZSgpICYmIGV4cGVjdGVkQ29udGFjdHMuY29udGFpbnNBbGwoYWN0dWFsQ29udGFjdHMpCisJCQkJCQkmJiBhY3R1YWxDb250YWN0cy5jb250YWluc0FsbChleHBlY3RlZENvbnRhY3RzKSk7CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkVGFncyA9IGV4cGVjdGVkUHJvZHVjdC5nZXRUYWdzKCk7CisJCUxpc3Q8U3RyaW5nPiBhY3R1YWxUYWdzID0gYWN0dWFsUHJvZHVjdC5nZXRUYWdzKCk7CisJCWFzc2VydFRydWUoCisJCQkJIkV4cGVjdGVkIHRhZ3M6IiArIEFycmF5cy50b1N0cmluZyhleHBlY3RlZFRhZ3MudG9BcnJheSgpKSArICIsIGFjdHVhbCB0YWdzOiIKKwkJCQkJCSsgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbFRhZ3MudG9BcnJheSgpKSwKKwkJCQlleHBlY3RlZFRhZ3Muc2l6ZSgpID09IGFjdHVhbFRhZ3Muc2l6ZSgpICYmIGV4cGVjdGVkVGFncy5jb250YWluc0FsbChhY3R1YWxUYWdzKQorCQkJCQkJJiYgYWN0dWFsVGFncy5jb250YWluc0FsbChleHBlY3RlZFRhZ3MpKTsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9kdWN0LmdldExpZmVjeWNsZVN0YXRlKCksIGFjdHVhbFByb2R1Y3QuZ2V0TGlmZWN5Y2xlU3RhdGUoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFByb2R1Y3QuZ2V0VmVyc2lvbigpLCBhY3R1YWxQcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFByb2R1Y3QuaXNIaWdoZXN0VmVyc2lvbigpLCBhY3R1YWxQcm9kdWN0LmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFByb2R1Y3QuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYWN0dWFsUHJvZHVjdC5nZXROb3JtYWxpemVkTmFtZSgpKTsKKworCQljb21wYXJlQ2F0ZWdvcmllcyhleHBlY3RlZFByb2R1Y3QsIGFjdHVhbFByb2R1Y3QpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9kdWN0LmdldExhc3RVcGRhdGVyVXNlcklkKCksIGFjdHVhbFByb2R1Y3QuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSk7CisJCWlmIChvcGVyYXRpb24gIT0gbnVsbCkgeworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvZHVjdC5nZXRDcmVhdG9yVXNlcklkKCksIGFjdHVhbFByb2R1Y3QuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJfQorCisJCUxvbmcgbGFzdFVwZGF0ZURhdGUgPSBhY3R1YWxQcm9kdWN0LmdldExhc3RVcGRhdGVEYXRlKCk7CisJCUxvbmcgY3JlYXRpb25EYXRlID0gYWN0dWFsUHJvZHVjdC5nZXRDcmVhdGlvbkRhdGUoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhbGxWZXJzaW9ucyA9IGFjdHVhbFByb2R1Y3QuZ2V0QWxsVmVyc2lvbnMoKTsKKworCQlpZiAob3BlcmF0aW9uICE9IG51bGwpIHsKKwkJCWlmIChvcGVyYXRpb24gPT0gQ29tcG9uZW50T3BlcmF0aW9uRW51bS5VUERBVEVfQ09NUE9ORU5UCisJCQkJCXx8IG9wZXJhdGlvbiA9PSBDb21wb25lbnRPcGVyYXRpb25FbnVtLkNIQU5HRV9TVEFURV9DSEVDS09VVAorCQkJCQl8fCBvcGVyYXRpb24gPT0gQ29tcG9uZW50T3BlcmF0aW9uRW51bS5DSEFOR0VfU1RBVEVfQ0hFQ0tJTgorCQkJCQl8fCBvcGVyYXRpb24gPT0gQ29tcG9uZW50T3BlcmF0aW9uRW51bS5DSEFOR0VfU1RBVEVfVU5ET19DSEVDS09VVCkgeworCQkJCWFzc2VydFRydWUoIkxhc3QgdXBkYXRlIGRhdGU6IiArIGxhc3RVcGRhdGVEYXRlICsgIiwgY3JlYXRpb24gZGF0ZTogIiArIGNyZWF0aW9uRGF0ZSwKKwkJCQkJCWxhc3RVcGRhdGVEYXRlID4gMCAmJiBjcmVhdGlvbkRhdGUgPiAwICYmIGxhc3RVcGRhdGVEYXRlID4gY3JlYXRpb25EYXRlKTsKKwkJCX0gZWxzZSB7CisJCQkJYXNzZXJ0VHJ1ZSgiTGFzdCB1cGRhdGUgZGF0ZToiICsgbGFzdFVwZGF0ZURhdGUgKyAiLCBjcmVhdGlvbiBkYXRlOiAiICsgY3JlYXRpb25EYXRlLAorCQkJCQkJbGFzdFVwZGF0ZURhdGUgPiAwICYmIGxhc3RVcGRhdGVEYXRlLmVxdWFscyhjcmVhdGlvbkRhdGUpKTsKKwkJCX0KKwkJfQorCisJCS8vIENoZWNrIFVVSURzCisJCS8vIElmIGp1c3QgY3JlYXRlZCwgbm8gd2F5IHRvIHRlc3QgdGhlIFVVSURzIHRoZW1zZWx2ZXMKKwkJLy8gSWYgdXBkYXRlZCwgd2UgZXhwZWN0IHRoZSBVVUlEcyBvZiBhY3R1YWwgdG8gbWF0Y2ggdGhlIGV4cGVjdGVkCisJCVN0cmluZyB1bmlxdWVJZCA9IGFjdHVhbFByb2R1Y3QuZ2V0VW5pcXVlSWQoKTsKKwkJaWYgKG9wZXJhdGlvbiA9PSBDb21wb25lbnRPcGVyYXRpb25FbnVtLkNSRUFURV9DT01QT05FTlQpIHsKKwkJCVVVSUQuZnJvbVN0cmluZyh1bmlxdWVJZCk7CisJCQlVVUlELmZyb21TdHJpbmcoYWN0dWFsUHJvZHVjdC5nZXRVVUlEKCkpOworCQkJVVVJRC5mcm9tU3RyaW5nKGFjdHVhbFByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJCWFzc2VydFRydWUoYWxsVmVyc2lvbnMuc2l6ZSgpID09IDEpOworCQkJYXNzZXJ0VHJ1ZShhbGxWZXJzaW9ucy5nZXQoIjAuMSIpLmVxdWFscyh1bmlxdWVJZCkpOworCQl9IGVsc2UgeworCQkJaWYgKG9wZXJhdGlvbiA9PSBDb21wb25lbnRPcGVyYXRpb25FbnVtLkNIQU5HRV9TVEFURV9DSEVDS09VVCkgeworCQkJCWFzc2VydEZhbHNlKGV4cGVjdGVkUHJvZHVjdC5nZXRVbmlxdWVJZCgpLmVxdWFscyh1bmlxdWVJZCkpOworCQkJCS8vIEFzc2lnbmluZyB0aGUgdXBkYXRlZCB1bmlxdWVJZCB0byBleHBlY3RlZCBzbyB0aGF0IGl0IGNhbiBiZQorCQkJCS8vIHBhc3NlZCB0byBmdXJ0aGVyIGxvZ2ljCisJCQkJZXhwZWN0ZWRQcm9kdWN0LnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJCX0gZWxzZSBpZiAob3BlcmF0aW9uICE9IG51bGwpIHsKKwkJCQlhc3NlcnRUcnVlKGV4cGVjdGVkUHJvZHVjdC5nZXRVbmlxdWVJZCgpLmVxdWFscyh1bmlxdWVJZCkpOworCQkJfQorCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvZHVjdC5nZXRVVUlEKCksIGFjdHVhbFByb2R1Y3QuZ2V0VVVJRCgpKTsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZFByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpLCBhY3R1YWxQcm9kdWN0LmdldEludmFyaWFudFVVSUQoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXBhcmVDYXRlZ29yaWVzKFByb2R1Y3QgZXhwZWN0ZWRQcm9kdWN0LCBQcm9kdWN0IGFjdHVhbFByb2R1Y3QpIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGV4cGVjdGVkQ2F0ZWdvcmllcyA9IGV4cGVjdGVkUHJvZHVjdC5nZXRDYXRlZ29yaWVzKCk7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBhY3R1YWxDYXRlZ29yaWVzID0gYWN0dWFsUHJvZHVjdC5nZXRDYXRlZ29yaWVzKCk7CisJCWlmIChleHBlY3RlZENhdGVnb3JpZXMgIT0gbnVsbCAmJiBhY3R1YWxDYXRlZ29yaWVzICE9IG51bGwpIHsKKwkJCWludCBleHBTaXplID0gZXhwZWN0ZWRDYXRlZ29yaWVzLnNpemUoKTsKKwkJCWludCBhY3RTaXplID0gYWN0dWFsQ2F0ZWdvcmllcy5zaXplKCk7CisKKwkJCWFzc2VydFRydWUoIkV4cGVjdGVkIHNpemU6IiArIGV4cFNpemUgKyAiLCBhY3R1YWwgc2l6ZToiICsgYWN0U2l6ZSwgZXhwU2l6ZSA9PSBhY3RTaXplKTsKKworCQkJZm9yIChDYXRlZ29yeURlZmluaXRpb24gYWN0dWFsRGVmaW5pdGlvbiA6IGFjdHVhbENhdGVnb3JpZXMpIHsKKwkJCQlpbnQgbGFzdEluZGV4T2ZDYXQgPSBleHBlY3RlZENhdGVnb3JpZXMubGFzdEluZGV4T2YoYWN0dWFsRGVmaW5pdGlvbik7CisJCQkJYXNzZXJ0VHJ1ZSgiQWN0dWFsIGNhdGVnb3J5ICIgKyBhY3R1YWxEZWZpbml0aW9uICsgIiBub3QgZm91bmQgaW4gZXhwZWN0ZWQuIiwgbGFzdEluZGV4T2ZDYXQgIT0gLTEpOworCQkJCUNhdGVnb3J5RGVmaW5pdGlvbiBleHBlY3RlZERlZmluaXRpb24gPSBleHBlY3RlZENhdGVnb3JpZXMuZ2V0KGxhc3RJbmRleE9mQ2F0KTsKKwkJCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gYWN0dWFsU3ViY2F0ZWdvcmllcyA9IGFjdHVhbERlZmluaXRpb24uZ2V0U3ViY2F0ZWdvcmllcygpOworCQkJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBleHBlY3RlZFN1YmNhdGVnb3JpZXMgPSBleHBlY3RlZERlZmluaXRpb24uZ2V0U3ViY2F0ZWdvcmllcygpOworCQkJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIGFjdHVhbFN1YiA6IGFjdHVhbFN1YmNhdGVnb3JpZXMpIHsKKwkJCQkJbGFzdEluZGV4T2ZDYXQgPSBleHBlY3RlZFN1YmNhdGVnb3JpZXMubGFzdEluZGV4T2YoYWN0dWFsU3ViKTsKKwkJCQkJYXNzZXJ0VHJ1ZSgiQWN0dWFsIHN1YmNhdGVnb3J5ICIgKyBhY3R1YWxTdWIgKyAiIG5vdCBmb3VuZCBpbiBleHBlY3RlZC4iLCBsYXN0SW5kZXhPZkNhdCAhPSAtMSk7CisJCQkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBleHBlY3RlZFN1YiA9IGV4cGVjdGVkU3ViY2F0ZWdvcmllcy5nZXQobGFzdEluZGV4T2ZDYXQpOworCQkJCQlMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4gYWN0dWFsR3JvdXBpbmdzID0gYWN0dWFsU3ViLmdldEdyb3VwaW5ncygpOworCQkJCQlMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4gZXhwZWN0ZWRHcm91cGluZ3MgPSBleHBlY3RlZFN1Yi5nZXRHcm91cGluZ3MoKTsKKwkJCQkJZm9yIChHcm91cGluZ0RlZmluaXRpb24gYWN0dWFsR3JvdXBpbmcgOiBhY3R1YWxHcm91cGluZ3MpIHsKKwkJCQkJCWxhc3RJbmRleE9mQ2F0ID0gZXhwZWN0ZWRHcm91cGluZ3MubGFzdEluZGV4T2YoYWN0dWFsR3JvdXBpbmcpOworCQkJCQkJYXNzZXJ0VHJ1ZSgiQWN0dWFsIGdyb3VwaW5nICIgKyBhY3R1YWxTdWIgKyAiIG5vdCBmb3VuZCBpbiBleHBlY3RlZC4iLCBsYXN0SW5kZXhPZkNhdCAhPSAtMSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWZvciAoQ2F0ZWdvcnlEZWZpbml0aW9uIGV4cGVjdGVkRGVmaW5pdGlvbiA6IGV4cGVjdGVkQ2F0ZWdvcmllcykgeworCQkJCWludCBsYXN0SW5kZXhPZkNhdCA9IGFjdHVhbENhdGVnb3JpZXMubGFzdEluZGV4T2YoZXhwZWN0ZWREZWZpbml0aW9uKTsKKwkJCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBjYXRlZ29yeSAiICsgZXhwZWN0ZWREZWZpbml0aW9uICsgIiBub3QgZm91bmQgaW4gYWN0dWFsLiIsIGxhc3RJbmRleE9mQ2F0ICE9IC0xKTsKKwkJCQlDYXRlZ29yeURlZmluaXRpb24gYWN0dWFsRGVmaW5pdGlvbiA9IGFjdHVhbENhdGVnb3JpZXMuZ2V0KGxhc3RJbmRleE9mQ2F0KTsKKwkJCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gYWN0dWFsU3ViY2F0ZWdvcmllcyA9IGFjdHVhbERlZmluaXRpb24uZ2V0U3ViY2F0ZWdvcmllcygpOworCQkJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBleHBlY3RlZFN1YmNhdGVnb3JpZXMgPSBleHBlY3RlZERlZmluaXRpb24uZ2V0U3ViY2F0ZWdvcmllcygpOworCQkJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIGV4cGVjdGVkU3ViIDogZXhwZWN0ZWRTdWJjYXRlZ29yaWVzKSB7CisJCQkJCWxhc3RJbmRleE9mQ2F0ID0gYWN0dWFsU3ViY2F0ZWdvcmllcy5sYXN0SW5kZXhPZihleHBlY3RlZFN1Yik7CisJCQkJCWFzc2VydFRydWUoIkV4cGVjdGVkIHN1YmNhdGVnb3J5ICIgKyBleHBlY3RlZFN1YiArICIgbm90IGZvdW5kIGluIGFjdHVhbC4iLCBsYXN0SW5kZXhPZkNhdCAhPSAtMSk7CisJCQkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBhY3R1YWxTdWIgPSBhY3R1YWxTdWJjYXRlZ29yaWVzLmdldChsYXN0SW5kZXhPZkNhdCk7CisJCQkJCUxpc3Q8R3JvdXBpbmdEZWZpbml0aW9uPiBhY3R1YWxHcm91cGluZ3MgPSBhY3R1YWxTdWIuZ2V0R3JvdXBpbmdzKCk7CisJCQkJCUxpc3Q8R3JvdXBpbmdEZWZpbml0aW9uPiBleHBlY3RlZEdyb3VwaW5ncyA9IGV4cGVjdGVkU3ViLmdldEdyb3VwaW5ncygpOworCQkJCQlmb3IgKEdyb3VwaW5nRGVmaW5pdGlvbiBleHBlY3RlZEdyb3VwaW5nIDogZXhwZWN0ZWRHcm91cGluZ3MpIHsKKwkJCQkJCWxhc3RJbmRleE9mQ2F0ID0gYWN0dWFsR3JvdXBpbmdzLmxhc3RJbmRleE9mKGV4cGVjdGVkR3JvdXBpbmcpOworCQkJCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZ3JvdXBpbmcgIiArIGV4cGVjdGVkR3JvdXBpbmcgKyAiIG5vdCBmb3VuZCBpbiBhY3R1YWwuIiwKKwkJCQkJCQkJbGFzdEluZGV4T2ZDYXQgIT0gLTEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVByb2R1Y3RzTm90RXhpc3RJblVzZXJGb2xsb3dlZFBhZ2UoVXNlciB1c2VyLCBQcm9kdWN0Li4uIG5vbkV4cGVjdGVkUHJvZHVjdHMpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbXBvbmVudCA9ICJwcm9kdWN0cyI7CisJCUJvb2xlYW4gaXNFeGlzdDsKKwkJUHJvZHVjdCBub25FeHBlY3RlZFByb2R1Y3Q7CisJCVJlc3RSZXNwb25zZSBnZXRGb2xsb3dlZFBhZ2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldEZvbGxvd2VkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlKU09OQXJyYXkgZm9sbG93ZWRQcm9kdWN0ZXMgPSBnZXRMaXN0QXJyYXlGcm9tUmVzdFJlc3BvbnNlKGdldEZvbGxvd2VkUGFnZSwgY29tcG9uZW50KTsKKwkJaWYgKGZvbGxvd2VkUHJvZHVjdGVzICE9IG51bGwpIHsgLy8gaWYgYW55IHByb2R1Y3QgZXhpc3QgaW4gZm9sbG93ZWQKKwkJCQkJCQkJCQkJLy8gcGFnZQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25FeHBlY3RlZFByb2R1Y3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJbm9uRXhwZWN0ZWRQcm9kdWN0ID0gbm9uRXhwZWN0ZWRQcm9kdWN0c1tpXTsKKwkJCQlpc0V4aXN0ID0gZmFsc2U7CisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBmb2xsb3dlZFByb2R1Y3Rlcy5zaXplKCk7IGsrKykgeworCQkJCQlKU09OT2JqZWN0IGpvYmplY3QgPSAoSlNPTk9iamVjdCkgZm9sbG93ZWRQcm9kdWN0ZXMuZ2V0KGspOworCQkJCQlpZiAoam9iamVjdC5nZXQoInV1aWQiKS50b1N0cmluZygpLmVxdWFscyhub25FeHBlY3RlZFByb2R1Y3QuZ2V0VVVJRCgpKSkgeworCQkJCQkJaXNFeGlzdCA9IHRydWU7CisJCQkJCQlrID0gZm9sbG93ZWRQcm9kdWN0ZXMuc2l6ZSgpOworCQkJCQl9CisJCQkJfQorCQkJCWFzc2VydEZhbHNlKGlzRXhpc3QpOworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tVc2VyRm9sbG93ZWRQYWdlKFVzZXIgdXNlciwgUHJvZHVjdC4uLiBleHBlY3RlZFByb2R1Y3RzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbXBvbmVudCA9ICJwcm9kdWN0cyI7CisJCUJvb2xlYW4gaXNFeGlzdDsKKwkJUHJvZHVjdCBleHBlY3RlZFByb2R1Y3Q7CisJCVJlc3RSZXNwb25zZSBnZXRGb2xsb3dlZFBhZ2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldEZvbGxvd2VkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlKU09OQXJyYXkgZm9sbG93ZWRQcm9kdWN0ZXMgPSBnZXRMaXN0QXJyYXlGcm9tUmVzdFJlc3BvbnNlKGdldEZvbGxvd2VkUGFnZSwgY29tcG9uZW50KTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgaWYgYW55IGZvbGxvd2VkUHJvZHVjdGVzIHJlY2VpdmVkICIsIGZvbGxvd2VkUHJvZHVjdGVzICE9IG51bGwpOworCQlhc3NlcnRUcnVlKCJjaGVjayBpZiBhbnkgZXhwZWN0ZWRQcm9kdWN0cyBhbmQgZm9sbG93ZWRQcm9kdWN0ZXMgYXJlIHRoZSBzYW1lIHNpemUiLAorCQkJCWV4cGVjdGVkUHJvZHVjdHMubGVuZ3RoID09IGZvbGxvd2VkUHJvZHVjdGVzLnNpemUoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRQcm9kdWN0cy5sZW5ndGg7IGkrKykgeworCQkJZXhwZWN0ZWRQcm9kdWN0ID0gZXhwZWN0ZWRQcm9kdWN0c1tpXTsKKwkJCWlzRXhpc3QgPSBmYWxzZTsKKwkJCWZvciAoaW50IGsgPSAwOyBrIDwgZm9sbG93ZWRQcm9kdWN0ZXMuc2l6ZSgpOyBrKyspIHsKKwkJCQlKU09OT2JqZWN0IGpvYmplY3QgPSAoSlNPTk9iamVjdCkgZm9sbG93ZWRQcm9kdWN0ZXMuZ2V0KGspOworCQkJCS8vIGlmKGpvYmplY3QuZ2V0KCJ1dWlkIikudG9TdHJpbmcoKS5lcXVhbHMoZXhwZWN0ZWRQcm9kdWN0LmdldFVVSUQoKSkpCisJCQkJaWYgKGpvYmplY3QuZ2V0KCJ1bmlxdWVJZCIpLnRvU3RyaW5nKCkuZXF1YWxzKGV4cGVjdGVkUHJvZHVjdC5nZXRVbmlxdWVJZCgpKSkgeworCisJCQkJCVN0cmluZyBwcm9kdWN0U3RyaW5nID0gam9iamVjdC50b0pTT05TdHJpbmcoKTsKKwkJCQkJUHJvZHVjdCBhY3R1YWxQcm9kdWN0ID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKHByb2R1Y3RTdHJpbmcsIFByb2R1Y3QuY2xhc3MpOworCQkJCQlQcm9kdWN0VmFsaWRhdGlvblV0aWxzLmNvbXBhcmVFeHBlY3RlZEFuZEFjdHVhbFByb2R1Y3RzKGV4cGVjdGVkUHJvZHVjdCwgYWN0dWFsUHJvZHVjdCwgbnVsbCk7CisJCQkJCWlzRXhpc3QgPSB0cnVlOworCQkJCQlrID0gZm9sbG93ZWRQcm9kdWN0ZXMuc2l6ZSgpOworCQkJCX0KKwkJCX0KKwkJCWFzc2VydFRydWUoaXNFeGlzdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBKU09OQXJyYXkgZ2V0TGlzdEFycmF5RnJvbVJlc3RSZXNwb25zZShSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlLCBTdHJpbmcgbHN0KSB7CisJCVN0cmluZyBqc29uID0gcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisJCUpTT05PYmplY3QganNvblJlc3AgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKGpzb24pOworCQlKU09OQXJyYXkgcmVzb3VyY2VzID0gKEpTT05BcnJheSkganNvblJlc3AuZ2V0KGxzdCk7CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9SZXNvdXJjZVZhbGlkYXRpb25VdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQ0MGRmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDM1NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JbnRlcmZhY2VEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXNwSmF2YU9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzcEpzb25LZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VWYWxpZGF0aW9uVXRpbHMgeworCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmVzb3VyY2VSZXFWc1Jlc3AoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywKKwkJCVJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCkgeworCisJCVN0cmluZyBleHBlY3RlZDsKKworCQlleHBlY3RlZCA9IHJlc291cmNlRGV0YWlscy5nZXREZXNjcmlwdGlvbigpOworCQlhc3NlcnRFcXVhbHMoInJlc291cmNlIGRlc2NyaXB0aW9uIC0gIiwgZXhwZWN0ZWQsIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJZXhwZWN0ZWQgPSByZXNvdXJjZURldGFpbHMuZ2V0VmVuZG9yTmFtZSgpOworCQlhc3NlcnRFcXVhbHMoInJlc291cmNlIHZlbmRvck5hbWUgLSAiLCBleHBlY3RlZCwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRWZW5kb3JOYW1lKCkpOworCisJCWV4cGVjdGVkID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlbmRvclJlbGVhc2UoKTsKKwkJYXNzZXJ0RXF1YWxzKCJyZXNvdXJjZSB2ZW5kb3JSZWxlYXNlTmFtZSAtICIsIGV4cGVjdGVkLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFZlbmRvclJlbGVhc2UoKSk7CisKKwkJZXhwZWN0ZWQgPSByZXNvdXJjZURldGFpbHMuZ2V0Q29udGFjdElkKCk7CisJCWFzc2VydEVxdWFscygicmVzb3VyY2UgY29udGFjdElkIC0gIiwgZXhwZWN0ZWQsIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0Q29udGFjdElkKCkpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmVzb3VyY2VSZXFWc1Jlc3AoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgUmVzb3VyY2UgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCkgeworCisJCVN0cmluZyBleHBlY3RlZDsKKworCQlleHBlY3RlZCA9IHJlc291cmNlRGV0YWlscy5nZXREZXNjcmlwdGlvbigpOworCQlhc3NlcnRFcXVhbHMoInJlc291cmNlIGRlc2NyaXB0aW9uIC0gIiwgZXhwZWN0ZWQsIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJZXhwZWN0ZWQgPSByZXNvdXJjZURldGFpbHMuZ2V0VmVuZG9yTmFtZSgpOworCQlhc3NlcnRFcXVhbHMoInJlc291cmNlIHZlbmRvck5hbWUgLSAiLCBleHBlY3RlZCwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRWZW5kb3JOYW1lKCkpOworCisJCWV4cGVjdGVkID0gcmVzb3VyY2VEZXRhaWxzLmdldFZlbmRvclJlbGVhc2UoKTsKKwkJYXNzZXJ0RXF1YWxzKCJyZXNvdXJjZSB2ZW5kb3JSZWxlYXNlTmFtZSAtICIsIGV4cGVjdGVkLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFZlbmRvclJlbGVhc2UoKSk7CisKKwkJZXhwZWN0ZWQgPSByZXNvdXJjZURldGFpbHMuZ2V0Q29udGFjdElkKCk7CisJCWFzc2VydEVxdWFscygicmVzb3VyY2UgY29udGFjdElkIC0gIiwgZXhwZWN0ZWQsIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0Q29udGFjdElkKCkpOworCisJCS8vIFZhbGlkYXRpbmcgZGVkdXBsaWNhdGlvbiBvZiB0YWdzCisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZFRhZ3MgPSByZXNvdXJjZURldGFpbHMuZ2V0VGFncygpOworCQlpZiAoZXhwZWN0ZWRUYWdzICE9IG51bGwpIHsKKwkJCVNldDxTdHJpbmc+IGhzID0gbmV3IExpbmtlZEhhc2hTZXQ8PihleHBlY3RlZFRhZ3MpOworCQkJZXhwZWN0ZWRUYWdzLmNsZWFyKCk7CisJCQlleHBlY3RlZFRhZ3MuYWRkQWxsKGhzKTsKKwkJCUxpc3Q8U3RyaW5nPiByZWNlaXZlZFRhZ3MgPSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFRhZ3MoKTsKKwkJCWFzc2VydEVxdWFscygicmVzb3VyY2UgdGFncyAtICIsIGV4cGVjdGVkVGFncywgcmVjZWl2ZWRUYWdzKTsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTW9kZWxPYmplY3RzKFJlc291cmNlIGV4cGVjdGVkLCBSZXNvdXJjZSBhY3R1YWwpIHRocm93cyBFeGNlcHRpb24geworCisJCWNvbXBhcmVFbGVtZW50cyhleHBlY3RlZC5nZXRVbmlxdWVJZCgpLCBhY3R1YWwuZ2V0VW5pcXVlSWQoKSk7CisJCWNvbXBhcmVFbGVtZW50cyhleHBlY3RlZC5nZXROYW1lKCksIGFjdHVhbC5nZXROYW1lKCkpOworCQljb21wYXJlRWxlbWVudHMoZXhwZWN0ZWQuZ2V0VmVyc2lvbigpLCBhY3R1YWwuZ2V0VmVyc2lvbigpKTsKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldENyZWF0b3JVc2VySWQoKSwgYWN0dWFsLmdldENyZWF0b3JVc2VySWQoKSk7CisJCWNvbXBhcmVFbGVtZW50cyhleHBlY3RlZC5nZXRDcmVhdG9yRnVsbE5hbWUoKSwgYWN0dWFsLmdldENyZWF0b3JGdWxsTmFtZSgpKTsKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldExhc3RVcGRhdGVyVXNlcklkKCksIGFjdHVhbC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldExhc3RVcGRhdGVyRnVsbE5hbWUoKSwgYWN0dWFsLmdldExhc3RVcGRhdGVyRnVsbE5hbWUoKSk7CisJCWNvbXBhcmVFbGVtZW50cyhleHBlY3RlZC5nZXRDcmVhdG9yRnVsbE5hbWUoKSwgYWN0dWFsLmdldENyZWF0b3JGdWxsTmFtZSgpKTsKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldENyZWF0aW9uRGF0ZSgpLCBhY3R1YWwuZ2V0Q3JlYXRpb25EYXRlKCkpOworCQljb21wYXJlRWxlbWVudHMoZXhwZWN0ZWQuZ2V0TGFzdFVwZGF0ZURhdGUoKSwgYWN0dWFsLmdldExhc3RVcGRhdGVEYXRlKCkpOworCQljb21wYXJlRWxlbWVudHMoZXhwZWN0ZWQuZ2V0RGVzY3JpcHRpb24oKSwgYWN0dWFsLmdldERlc2NyaXB0aW9uKCkpOworCQljb21wYXJlRWxlbWVudHMoZXhwZWN0ZWQuZ2V0SWNvbigpLCBhY3R1YWwuZ2V0SWNvbigpKTsKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldExhc3RVcGRhdGVEYXRlKCksIGFjdHVhbC5nZXRMYXN0VXBkYXRlRGF0ZSgpKTsKKwkJLy8gVE9ETyBjb21wYXJlIHRhZ3MKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldENhdGVnb3JpZXMoKSwgYWN0dWFsLmdldENhdGVnb3JpZXMoKSk7CisJCWNvbXBhcmVFbGVtZW50cyhleHBlY3RlZC5nZXRMaWZlY3ljbGVTdGF0ZSgpLCBhY3R1YWwuZ2V0TGlmZWN5Y2xlU3RhdGUoKSk7CisJCWNvbXBhcmVFbGVtZW50cyhleHBlY3RlZC5nZXRWZW5kb3JOYW1lKCksIGFjdHVhbC5nZXRWZW5kb3JOYW1lKCkpOworCQljb21wYXJlRWxlbWVudHMoZXhwZWN0ZWQuZ2V0VmVuZG9yUmVsZWFzZSgpLCBhY3R1YWwuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldENvbnRhY3RJZCgpLCBhY3R1YWwuZ2V0Q29udGFjdElkKCkpOworCQljb21wYXJlRWxlbWVudHMoZXhwZWN0ZWQuZ2V0VVVJRCgpLCBhY3R1YWwuZ2V0VVVJRCgpKTsKKwkJY29tcGFyZUVsZW1lbnRzKGV4cGVjdGVkLmdldFZlcnNpb24oKSwgYWN0dWFsLmdldFZlcnNpb24oKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXNwKFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UsIFJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyByZXNwb25zZSA9IHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpOworCisJCXZhbGlkYXRlUmVzcChyZXNwb25zZSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCwgZ3Nvbik7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXNwKFN0cmluZyByZXNwb25zZSwgUmVzb3VyY2VSZXNwSmF2YU9iamVjdCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LCBHc29uIGdzb24pIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQltYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZ3Nvbi5mcm9tSnNvbihyZXNwb25zZSwgbWFwLmdldENsYXNzKCkpOworCisJCS8vIERlLWR1cGxpY2F0aW5nIHRoZSB0YWdzIGxpc3QgZm9yIGNvbXBhcmlzb24KKwkJTGlzdDxTdHJpbmc+IHRhZ3MgPSByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFRhZ3MoKTsKKwkJaWYgKHRhZ3MgIT0gbnVsbCkgeworCQkJU2V0PFN0cmluZz4gaHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KHRhZ3MpOworCQkJdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihocyk7CisJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LnNldFRhZ3ModGFncyk7CisJCQl0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGhzKTsKKwkJCXJlc291cmNlUmVzcEphdmFPYmplY3Quc2V0VGFncyh0YWdzKTsKKwkJfQorCisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlJFU09VUkNFX05BTUUuZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0TmFtZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uUkVTT1VSQ0VfREVTQy5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldERlc2NyaXB0aW9uKCkpOworCQkvLyB2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5DQVRFR09SSUVTLmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkvLyByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldENhdGVnb3JpZXMoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlZFTkRPUl9OQU1FLmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFZlbmRvck5hbWUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlZFTkRPUl9SRUxFQVNFLmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uQ09OVEFDVF9JRC5nZXRSZXNwSnNvbktleU5hbWUoKSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRDb250YWN0SWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLklDT04uZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0SWNvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uSVNfQUJTVFJBQ1QuZ2V0UmVzcEpzb25LZXlOYW1lKCksCisJCQkJQm9vbGVhbi52YWx1ZU9mKHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0QWJzdHJhY3R0KCkpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uSElHSEVTVF9WRVJTSU9OLmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCUJvb2xlYW4udmFsdWVPZihyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldElzSGlnaGVzdFZlcnNpb24oKSkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5VTklRVUVfSUQuZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VW5pcXVlSWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlJFU09VUkNFX1ZFUlNJT04uZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VmVyc2lvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uTElGRV9DWUNMRV9TVEFURS5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldExpZmVjeWNsZVN0YXRlKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5UQUdTLmdldFJlc3BKc29uS2V5TmFtZSgpLCB0YWdzKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uQ1JFQVRPUl9VU0VSX0lELmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uQ1JFQVRPUl9GVUxMX05BTUUuZ2V0UmVzcEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRDcmVhdG9yRnVsbE5hbWUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkxBU1RfVVBEQVRFUl9BVFRfVUlELmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkxBU1RfVVBEQVRFUl9GVUxMX05BTUUuZ2V0UmVzcEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5DT1NULmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldENvc3QoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkxJQ0VOU0VfVFlQRS5nZXRSZXNwSnNvbktleU5hbWUoKSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRMaWNlbnNlVHlwZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uUkVTT1VSQ0VfVFlQRS5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFJlc291cmNlVHlwZSgpLnRvU3RyaW5nKCkpOworCQlpZiAocmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMoIlZGIikpIHsKKwkJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkRFUklWRURfRlJPTS5nZXRSZXNwSnNvbktleU5hbWUoKSwgbnVsbCk7CisJCX0gZWxzZSB7CisJCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5ERVJJVkVEX0ZST00uZ2V0UmVzcEpzb25LZXlOYW1lKCksCisJCQkJCXJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVyaXZlZEZyb20oKSk7CisJCX0KKworCQl2YWxpZGF0ZUNhdGVnb3JpZXMocmVzb3VyY2VSZXNwSmF2YU9iamVjdCwgbWFwKTsKKworCQlTdHJpbmcgdXVpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShyZXNwb25zZSwgUmVzcEpzb25LZXlzRW51bS5VVUlELmdldFJlc3BKc29uS2V5TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgiVVVJRCBpcyBlbXB0eSIsIHV1aWQgIT0gbnVsbCAmJiAhdXVpZC5pc0VtcHR5KCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVDYXRlZ29yaWVzKFJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXApIHsKKwkJYXNzZXJ0VHJ1ZShSZXNwSnNvbktleXNFbnVtLkNBVEVHT1JJRVMuZ2V0UmVzcEpzb25LZXlOYW1lKCkgKyAiIGlzIG1pc3NpbmciLAorCQkJCW1hcC5jb250YWluc0tleShSZXNwSnNvbktleXNFbnVtLkNBVEVHT1JJRVMuZ2V0UmVzcEpzb25LZXlOYW1lKCkpKTsKKwkJT2JqZWN0IGZvdW5kVmFsdWUgPSBtYXAuZ2V0KFJlc3BKc29uS2V5c0VudW0uQ0FURUdPUklFUy5nZXRSZXNwSnNvbktleU5hbWUoKSk7CisJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gZm91bmRMaXN0ID0gKExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4pIGZvdW5kVmFsdWU7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBleGNwZWN0ZWRMaXN0ID0gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRDYXRlZ29yaWVzKCk7CisKKwkJYXNzZXJ0VHJ1ZShmb3VuZExpc3Quc2l6ZSgpID09IGV4Y3BlY3RlZExpc3Quc2l6ZSgpKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZExpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCUNhdGVnb3J5RGVmaW5pdGlvbiBleHBDYXQgPSBleGNwZWN0ZWRMaXN0LmdldChpKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gZm91biA9IGZvdW5kTGlzdC5nZXQoaSk7CisJCQlhc3NlcnRUcnVlKCJleHBlY3RlZCAiICsgZXhwQ2F0LmdldE5hbWUoKSArICIgbm90IGVxdWFsIHRvIGFjdHVhbCAiICsgZm91bmRWYWx1ZSwKKwkJCQkJZm91bi5nZXQoIm5hbWUiKS5lcXVhbHMoZXhwQ2F0LmdldE5hbWUoKSkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmllbGQoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAsIFN0cmluZyBqc29uRmllbGQsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7CisJCWlmIChleHBlY3RlZFZhbHVlID09IG51bGwpIHsKKwkJCWFzc2VydFRydWUoanNvbkZpZWxkICsgIiBpcyBleHBlY3RlZCB0byBiZSBudWxsIiwgIW1hcC5jb250YWluc0tleShqc29uRmllbGQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydFRydWUoanNvbkZpZWxkICsgIiBpcyBtaXNzaW5nIiwgbWFwLmNvbnRhaW5zS2V5KGpzb25GaWVsZCkpOworCQkJT2JqZWN0IGZvdW5kVmFsdWUgPSBtYXAuZ2V0KGpzb25GaWVsZCk7CisJCQljb21wYXJlRWxlbWVudHMoZXhwZWN0ZWRWYWx1ZSwgZm91bmRWYWx1ZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29tcGFyZUVsZW1lbnRzKE9iamVjdCBleHBlY3RlZFZhbHVlLCBPYmplY3QgZm91bmRWYWx1ZSkgeworCQlpZiAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJYXNzZXJ0VHJ1ZShmb3VuZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKTsKKwkJCWFzc2VydFRydWUoImV4cGVjdGVkICIgKyBleHBlY3RlZFZhbHVlICsgIiBub3QgZXF1YWwgdG8gYWN0dWFsICIgKyBmb3VuZFZhbHVlLAorCQkJCQlmb3VuZFZhbHVlLmVxdWFscyhleHBlY3RlZFZhbHVlKSk7CisJCX0KKwkJZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKwkJCWFzc2VydFRydWUoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pOworCQkJYXNzZXJ0VHJ1ZShmb3VuZFZhbHVlID09IGV4cGVjdGVkVmFsdWUpOworCQl9IGVsc2UgaWYgKGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBNYXApIHsKKwkJCWFzc2VydFRydWUoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIE1hcCk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGZvdW5kTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGZvdW5kVmFsdWU7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGV4Y3BlY3RlZE1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBleHBlY3RlZFZhbHVlOworCQkJYXNzZXJ0VHJ1ZShmb3VuZE1hcC5zaXplKCkgPT0gZXhjcGVjdGVkTWFwLnNpemUoKSk7CisJCQlJdGVyYXRvcjxTdHJpbmc+IGZvdW5ka2V5SXRyID0gZm91bmRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChmb3VuZGtleUl0ci5oYXNOZXh0KCkpIHsKKwkJCQlTdHJpbmcgZm91bmRLZXkgPSBmb3VuZGtleUl0ci5uZXh0KCk7CisJCQkJYXNzZXJ0VHJ1ZShleGNwZWN0ZWRNYXAuY29udGFpbnNLZXkoZm91bmRLZXkpKTsKKwkJCQljb21wYXJlRWxlbWVudHMoZXhjcGVjdGVkTWFwLmdldChmb3VuZEtleSksIGZvdW5kTWFwLmdldChmb3VuZEtleSkpOworCQkJfQorCisJCX0gZWxzZSBpZiAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCWFzc2VydFRydWUoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpOworCQkJTGlzdDxPYmplY3Q+IGZvdW5kTGlzdCA9IChMaXN0PE9iamVjdD4pIGZvdW5kVmFsdWU7CisJCQlMaXN0PE9iamVjdD4gZXhjcGVjdGVkTGlzdCA9IChMaXN0PE9iamVjdD4pIGV4cGVjdGVkVmFsdWU7CisJCQlhc3NlcnRUcnVlKGZvdW5kTGlzdC5zaXplKCkgPT0gZXhjcGVjdGVkTGlzdC5zaXplKCkpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZExpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCQljb21wYXJlRWxlbWVudHMoZXhjcGVjdGVkTGlzdC5nZXQoaSksIGZvdW5kTGlzdC5nZXQoaSkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlhc3NlcnRUcnVlKGZvdW5kVmFsdWUuZXF1YWxzKGV4cGVjdGVkVmFsdWUpKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVV1aWRBZnRlckNoYW5naW5nU3RhdHVzKFN0cmluZyBvbGRVdWlkLCBTdHJpbmcgbmV3VXVpZCkgeworCQlyZXR1cm4gb2xkVXVpZC5lcXVhbHMobmV3VXVpZCk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXNwQXJ0KFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UsIFJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VSZXNwSmF2YU9iamVjdCwKKwkJCVN0cmluZyBpbnRlcmZhemUpIHRocm93cyBFeGNlcHRpb24geworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCVN0cmluZyByZXNwb25zZSA9IHJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCW1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBnc29uLmZyb21Kc29uKHJlc3BvbnNlLCBtYXAuZ2V0Q2xhc3MoKSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnc29uLmZyb21Kc29uKHJlc3BvbnNlLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSByZXNvdXJjZS5nZXRBcnRpZmFjdHMoKTsKKwkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50ZXJmYWNlcyA9IG51bGw7CisKKwkJaWYgKGludGVyZmF6ZSAhPSBudWxsKSB7CisJCQlpbnRlcmZhY2VzID0gcmVzb3VyY2UuZ2V0SW50ZXJmYWNlcygpOworCQkJTWFwPFN0cmluZywgT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBpbnRlcmZhY2VzLmdldChpbnRlcmZhemUpLmdldE9wZXJhdGlvbnMoKTsKKwkJCS8vIG9wZXJhdGlvbi5nZXQoImNvbmZpZ3VyZSIpLmdldFVuaXF1ZUlkKCk7CisJCX0KKworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5SRVNPVVJDRV9OQU1FLmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldE5hbWUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlJFU09VUkNFX0RFU0MuZ2V0UmVzcEpzb25LZXlOYW1lKCksCisJCQkJcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXREZXNjcmlwdGlvbigpKTsKKwkJLy8gdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uQ0FURUdPUklFUy5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJLy8gcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRDYXRlZ29yaWVzKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5ERVJJVkVEX0ZST00uZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0RGVyaXZlZEZyb20oKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlZFTkRPUl9OQU1FLmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFZlbmRvck5hbWUoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlZFTkRPUl9SRUxFQVNFLmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uQ09OVEFDVF9JRC5nZXRSZXNwSnNvbktleU5hbWUoKSwgcmVzb3VyY2VSZXNwSmF2YU9iamVjdC5nZXRDb250YWN0SWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLklDT04uZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0SWNvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uSVNfQUJTVFJBQ1QuZ2V0UmVzcEpzb25LZXlOYW1lKCksCisJCQkJQm9vbGVhbi52YWx1ZU9mKHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0QWJzdHJhY3R0KCkpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uSElHSEVTVF9WRVJTSU9OLmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCUJvb2xlYW4udmFsdWVPZihyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldElzSGlnaGVzdFZlcnNpb24oKSkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5VTklRVUVfSUQuZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VW5pcXVlSWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLlJFU09VUkNFX1ZFUlNJT04uZ2V0UmVzcEpzb25LZXlOYW1lKCksIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0VmVyc2lvbigpKTsKKwkJdmFsaWRhdGVGaWVsZChtYXAsIFJlc3BKc29uS2V5c0VudW0uTElGRV9DWUNMRV9TVEFURS5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldExpZmVjeWNsZVN0YXRlKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5UQUdTLmdldFJlc3BKc29uS2V5TmFtZSgpLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldFRhZ3MoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkNSRUFUT1JfVVNFUl9JRC5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldENyZWF0b3JVc2VySWQoKSk7CisJCXZhbGlkYXRlRmllbGQobWFwLCBSZXNwSnNvbktleXNFbnVtLkNSRUFUT1JfRlVMTF9OQU1FLmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0Q3JlYXRvckZ1bGxOYW1lKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5MQVNUX1VQREFURVJfQVRUX1VJRC5nZXRSZXNwSnNvbktleU5hbWUoKSwKKwkJCQlyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQl2YWxpZGF0ZUZpZWxkKG1hcCwgUmVzcEpzb25LZXlzRW51bS5MQVNUX1VQREFURVJfRlVMTF9OQU1FLmdldFJlc3BKc29uS2V5TmFtZSgpLAorCQkJCXJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpKTsKKworCQkvLyB2YWxpZGF0ZSBudW1iZXIgb2YgYXJ0aWZhY3RzCisJCWlmIChyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldEFydGlmYWN0cygpICE9IG51bGwpIHsKKworCQkJLy8gYXNzZXJ0RXF1YWxzKCJjaGVjayBudW1iZXIgb2YgYXJ0aWZhY3RzIiwKKwkJCS8vIHJlc291cmNlUmVzcEphdmFPYmplY3QuZ2V0QXJ0aWZhY3RzKCkuc2l6ZSgpLCBhcnRpZmFjdHMuc2l6ZSgpKTsKKwkJCWludCBpdGVyTnVtID0gLTE7CisJCQlBcnJheUxpc3Q8U3RyaW5nPiBteUFydGlmYWNhdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCUl0ZXJhdG9yIGl0ID0gYXJ0aWZhY3RzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQlpdGVyTnVtKys7CisJCQkJTWFwLkVudHJ5IHBhaXIgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHBhaXIuZ2V0S2V5KCkgKyAiID0gIiArIHBhaXIuZ2V0VmFsdWUoKSk7CisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIG15QXJ0aWZhY3QgPSBhcnRpZmFjdHMuZ2V0KHBhaXIuZ2V0S2V5KCkpOworCQkJCW15QXJ0aWZhY2F0cy5hZGQobXlBcnRpZmFjdC5nZXRFc0lkKCkpOworCQkJCWl0LnJlbW92ZSgpOyAvLyBhdm9pZHMgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCisJCQl9CisJCQkvLyBhc3NlcnRUcnVlKCJjaGVjayBzZXJ2aWNlIGNvbnRhaW5zCisJCQkvLyBhcnRpZmFjdHMiLG15QXJ0aWZhY2F0cy5jb250YWluc0FsbChyZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldEFydGlmYWN0cygpKSk7CisJCX0KKworCQkvLyB2YWxpZGF0ZSBudW1iZXIgb2YgaW50ZXJmYWNlczoKKworCQlpZiAoaW50ZXJmYXplICE9IG51bGwpIHsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgbnVtYmVyIG9mIGludGVyZmFjZXMiLCByZXNvdXJjZVJlc3BKYXZhT2JqZWN0LmdldEludGVyZmFjZXMoKS5zaXplKCksCisJCQkJCWludGVyZmFjZXMuc2l6ZSgpKTsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VJc0Fic3RhcnRjdChMaXN0PFJlc291cmNlPiByZXNvdXJjZUxpc3QsIEJvb2xlYW4gYm9vbCkgeworCQlpZiAocmVzb3VyY2VMaXN0ICE9IG51bGwgJiYgcmVzb3VyY2VMaXN0LnNpemUoKSA+IDApIHsKKwkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZUxpc3QpIHsKKwkJCQlpZiAocmVzb3VyY2UuaXNBYnN0cmFjdCgpLmVxdWFscyhib29sKSkKKwkJCQkJY29udGludWU7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXNvdXJjZVZlcnNpb24oUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBleHBlY3RlZFZlcnNpb24pIHsKKwkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlLmVxdWFscygiIikpIHsKKwkJCWFzc2VydFRydWUoImV4cGVjdGVkIHJlc291cmNlIHZlcnNpb24gaXM6ICIgKyBleHBlY3RlZFZlcnNpb24gKyAiLCBidXQgYWN0dWFsIGlzOiAiICsgcmVzb3VyY2UuZ2V0VmVyc2lvbigpLAorCQkJCQlyZXNvdXJjZS5nZXRWZXJzaW9uKCkuZXF1YWxzKGV4cGVjdGVkVmVyc2lvbikpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vU2VydmljZVZhbGlkYXRpb25VdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vU2VydmljZVZhbGlkYXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmQ3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9TZXJ2aWNlVmFsaWRhdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEZhbHNlOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRpc3RyaWJ1dGlvblN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlVmFsaWRhdGlvblV0aWxzIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzLCBTZXJ2aWNlIHNlcnZpY2UsIFVzZXIgdXNlciwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSBsaWZlY3ljbGVTdGF0ZSkgeworCQl2YWxpZGF0ZVNlcnZpY2VSZXNwb25zZU1ldGFEYXRhKHNlcnZpY2VEZXRhaWxzLCBzZXJ2aWNlLCB1c2VyLCB1c2VyLCBsaWZlY3ljbGVTdGF0ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlU2VydmljZVJlc3BvbnNlTWV0YURhdGEoU2VydmljZVJlcURldGFpbHMgZXhwZWN0ZWRTZXJ2aWNlLCBTZXJ2aWNlIHNlcnZpY2UsCisJCQlVc2VyIGNyZWF0b3JVc2VyLCBVc2VyIHVwZGF0ZXJVc2VyLCBMaWZlY3ljbGVTdGF0ZUVudW0gbGlmZUN5Y2xlU3RhdGUpIHsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkVGFncyA9IGV4cGVjdGVkU2VydmljZS5nZXRUYWdzKCk7CisJCWV4cGVjdGVkVGFncy5hZGQoZXhwZWN0ZWRTZXJ2aWNlLmdldE5hbWUoKSk7CisJCUxpc3Q8U3RyaW5nPiByZWNlaXZlZFRhZ3MgPSBzZXJ2aWNlLmdldFRhZ3MoKTsKKwkJaWYgKGV4cGVjdGVkVGFncyAhPSBudWxsKSB7CisJCQlTZXQ8U3RyaW5nPiBocyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oZXhwZWN0ZWRUYWdzKTsKKwkJCWV4cGVjdGVkVGFncy5jbGVhcigpOworCQkJZXhwZWN0ZWRUYWdzLmFkZEFsbChocyk7CisJCX0KKworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHNlcnZpY2UgbmFtZSBvbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsIGV4cGVjdGVkU2VydmljZS5nZXROYW1lKCksCisJCQkJc2VydmljZS5nZXROYW1lKCkpOworCQkvLyBjaGVjayBzaXplIG9mIGxpc3QKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBvbmx5IDEgY2F0ZWdvcnkgcmV0dXJuZWQgb24gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCAxLAorCQkJCWV4cGVjdGVkU2VydmljZS5nZXRDYXRlZ29yaWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBzZXJ2aWNlIG5hbWUgb24gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBleHBlY3RlZFNlcnZpY2UuZ2V0TmFtZSgpLAorCQkJCXNlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBjYXRlZ29yaWVzIG9uIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkJCQlleHBlY3RlZFNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKS5nZXROYW1lKCksIHNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHRhZyBsaXN0IG9uIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXhwZWN0ZWRUYWdzLCByZWNlaXZlZFRhZ3MpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIGRlc2NyaXB0aW9uIG9uIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgZXhwZWN0ZWRTZXJ2aWNlLmdldERlc2NyaXB0aW9uKCksCisJCQkJc2VydmljZS5nZXREZXNjcmlwdGlvbigpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayB2ZW5kb3IgbmFtZSBvbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJCS8vIGV4cGVjdGVkU2VydmljZS5nZXRWZW5kb3JOYW1lKCksIHNlcnZpY2UuZ2V0VmVuZG9yTmFtZSgpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJDaGVjayB2ZW5kb3IgcmVsZWFzZSBvbiByZXNwb25zZSBhZnRlciBjcmVhdGUgc2VydmljZSIsCisJCS8vIGV4cGVjdGVkU2VydmljZS5nZXRWZW5kb3JSZWxlYXNlKCksIHNlcnZpY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBhdHRDb250YW50IG5hbWUgb24gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCQkJCWV4cGVjdGVkU2VydmljZS5nZXRDb250YWN0SWQoKS50b0xvd2VyQ2FzZSgpLCBzZXJ2aWNlLmdldENvbnRhY3RJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBpY29uIG5hbWUgb24gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBleHBlY3RlZFNlcnZpY2UuZ2V0SWNvbigpLCBzZXJ2aWNlLmdldEljb24oKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgTGFzdFVwZGF0ZXJVc2VySWQgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCB1cGRhdGVyVXNlci5nZXRVc2VySWQoKSwgc2VydmljZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayBMYXN0VXBkYXRlck5hbWUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCQkJCXVwZGF0ZXJVc2VyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXBkYXRlclVzZXIuZ2V0TGFzdE5hbWUoKSwgc2VydmljZS5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIENyZWF0b3JVc2VySWQgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBjcmVhdG9yVXNlci5nZXRVc2VySWQoKSwgc2VydmljZS5nZXRDcmVhdG9yVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIENyZWF0b3JOYW1lIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkJCQljcmVhdG9yVXNlci5nZXRGaXJzdE5hbWUoKSArICIgIiArIGNyZWF0b3JVc2VyLmdldExhc3ROYW1lKCksIHNlcnZpY2UuZ2V0Q3JlYXRvckZ1bGxOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHZlcnNpb24gYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBleHBlY3RlZFNlcnZpY2UuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCS8vIGFzc2VydEVxdWFscygiQ2hlY2sgVW5pcXVlSWQgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBTRVJWSUNFX1BSRUZJWCArCisJCS8vIHNlcnZpY2VEZXRhaWxzLmdldFNlcnZpY2VOYW1lKCkudG9Mb3dlckNhc2UoKSsiLiIgKworCQkvLyBzZXJ2aWNlQmFzZVZlcnNpb24sIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEZhbHNlKCJDaGVjayB1dWlkIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgc2VydmljZS5nZXRVVUlEKCkuaXNFbXB0eSgpKTsKKworCQkvLyBhc3NlcnRUcnVlKCJjaGVjayBjcmVhdGlvbiBkYXRlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwKKwkJLy8gc2VydmljZS5nZXRDcmVhdGlvbkRhdGUoKSAhPSBudWxsKTsKKwkJLy8gYXNzZXJ0VHJ1ZSgiY2hlY2sgdXBkYXRlIGRhdGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLAorCQkvLyBzZXJ2aWNlLmdldExhc3RVcGRhdGVEYXRlKCkgIT0gbnVsbCk7CisKKwkJaWYgKGxpZmVDeWNsZVN0YXRlICE9IG51bGwpCisJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIExpZmVjeWNsZVN0YXRlIGFmdGVyIGNyZWF0ZSBzZXJ2aWNlIiwgbGlmZUN5Y2xlU3RhdGUsIHNlcnZpY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSk7CisJCWVsc2UKKwkJCWFzc2VydEVxdWFscygiQ2hlY2sgTGlmZWN5Y2xlU3RhdGUgYWZ0ZXIgY3JlYXRlIHNlcnZpY2UiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQkJc2VydmljZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgY29uc3RydWN0RmllbGRzRm9yQXVkaXRWYWxpZGF0aW9uKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VSZXFEZXRhaWxzLAorCQkJU3RyaW5nIHNlcnZpY2VWZXJzaW9uLCBVc2VyIHNkbmNVc2VyRGV0YWlscykgeworCisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IG5ldyBFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0KCk7CisKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRBY3Rpb24oIkNyZWF0ZSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyVWlkKHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKSk7CisJCVN0cmluZyB1c2VyRmlyc3RMYXN0TmFtZSA9IHNkbmNVc2VyRGV0YWlscy5nZXRGaXJzdE5hbWUoKSArICIgIiArIHNkbmNVc2VyRGV0YWlscy5nZXRMYXN0TmFtZSgpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldE1vZGlmaWVyTmFtZSh1c2VyRmlyc3RMYXN0TmFtZSk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDAiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlTmFtZShzZXJ2aWNlUmVxRGV0YWlscy5nZXROYW1lKCkpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFJlc291cmNlVHlwZSgiU2VydmljZSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZWZXJzaW9uKFN0cmluZy52YWx1ZU9mKEZsb2F0LnBhcnNlRmxvYXQoc2VydmljZVZlcnNpb24pIC0gMC4xZikpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEN1cnJWZXJzaW9uKHNlcnZpY2VWZXJzaW9uKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2U3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDdXJyU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRDb21tZW50KG51bGwpOworCisJCXJldHVybiBleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRGlzdHJ1YnRpb25TdGF0dXNWYWx1ZShSZXN0UmVzcG9uc2UgcmVzcG9uc2UsCisJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtIGV4cGVjdGVkRGlzdHJpYnV0aW9uVmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0dWFsRGlzdHJpYnV0aW9uVmFsdWUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UocmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQkiZGlzdHJpYnV0aW9uU3RhdHVzIik7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZERpc3RyaWJ1dGlvblZhbHVlLm5hbWUoKSwgYWN0dWFsRGlzdHJpYnV0aW9uVmFsdWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vVXNlclZhbGlkYXRpb25VdGlscy5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxzL3ZhbGlkYXRpb24vVXNlclZhbGlkYXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTQzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbHMvdmFsaWRhdGlvbi9Vc2VyVmFsaWRhdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5Vc2VyU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXNlcnMuQWRkVXNlckF1ZGl0TWVzc2FnZUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXNlcnMuVXNlckF1ZGl0SmF2YU9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EYlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBVc2VyVmFsaWRhdGlvblV0aWxzIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29tcGFyZUV4cGVjdGVkQW5kQWN0dWFsVXNlcnMoVXNlciBleHBlY3RlZCwgVXNlciBhY3R1YWwpIHsKKworCQlTdHJpbmcgYWN0dWFsRmlyc3ROYW1lID0gYWN0dWFsLmdldEZpcnN0TmFtZSgpOworCQlTdHJpbmcgZXhwZWN0ZWRGaXJzdE5hbWUgPSBleHBlY3RlZC5nZXRGaXJzdE5hbWUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIGZpcnN0IG5hbWUgLSAiLCBleHBlY3RlZEZpcnN0TmFtZSwgYWN0dWFsRmlyc3ROYW1lKTsKKworCQlTdHJpbmcgYWN0dWFsTGFzdE5hbWUgPSBhY3R1YWwuZ2V0TGFzdE5hbWUoKTsKKwkJU3RyaW5nIGV4cGVjdGVkTGFzdE5hbWUgPSBleHBlY3RlZC5nZXRMYXN0TmFtZSgpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgbGFzdCBuYW1lIC0gIiwgZXhwZWN0ZWRMYXN0TmFtZSwgYWN0dWFsTGFzdE5hbWUpOworCisJCVN0cmluZyBhY3R1YWxVc2VySWQgPSBhY3R1YWwuZ2V0VXNlcklkKCk7CisJCVN0cmluZyBleHBlY3RlZFVzZXJJZCA9IGV4cGVjdGVkLmdldFVzZXJJZCgpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgdXNlcklkIC0gIiwgZXhwZWN0ZWRVc2VySWQsIGFjdHVhbFVzZXJJZCk7CisKKwkJU3RyaW5nIGFjdHVhbEVtYWlsID0gYWN0dWFsLmdldEVtYWlsKCk7CisJCVN0cmluZyBleHBlY3RlZEVtYWlsID0gZXhwZWN0ZWQuZ2V0RW1haWwoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIGVtYWlsIC0gIiwgZXhwZWN0ZWRFbWFpbCwgYWN0dWFsRW1haWwpOworCisJCUxvbmcgYWN0dWFsTGFzdExvZ2luVGltZSA9IGFjdHVhbC5nZXRMYXN0TG9naW5UaW1lKCk7CisJCUxvbmcgZXhwZWN0ZWRMYXN0TG9naW5UaW1lID0gZXhwZWN0ZWQuZ2V0TGFzdExvZ2luVGltZSgpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgbGFzdCBsb2dpbiB0aW1lIC0gIiwgZXhwZWN0ZWRMYXN0TG9naW5UaW1lLCBhY3R1YWxMYXN0TG9naW5UaW1lKTsKKworCQlTdHJpbmcgYWN0dWFsUm9sZSA9IGFjdHVhbC5nZXRSb2xlKCk7CisJCWlmIChleHBlY3RlZC5nZXRSb2xlKCkgPT0gbnVsbCkgeworCQkJU3RyaW5nIGV4cGVjdGVkUm9sZSA9IFVzZXJSb2xlRW51bS5ERVNJR05FUi5uYW1lKCk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgcm9sZSAtICIsIGV4cGVjdGVkUm9sZSwgYWN0dWFsUm9sZSk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgZXhwZWN0ZWRSb2xlID0gZXhwZWN0ZWQuZ2V0Um9sZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIHJvbGUgLSAiLCBleHBlY3RlZFJvbGUsIGFjdHVhbFJvbGUpOworCQl9CisKKwkJVXNlclN0YXR1c0VudW0gYWN0dWFsU3RhdHVzID0gZXhwZWN0ZWQuZ2V0U3RhdHVzKCk7CisJCVVzZXJTdGF0dXNFbnVtIGV4cGVjdGVkU3RhdHVzID0gZXhwZWN0ZWQuZ2V0U3RhdHVzKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBzdGF0dXMgLSAiLCBleHBlY3RlZFN0YXR1cywgYWN0dWFsU3RhdHVzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVEZWxldGVVc2VyQXVkaXRNZXNzYWdlKFVzZXIgc2RuY1VzZXJEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsCisJCQlTdHJpbmcgcmVzcG9uc2VDb2RlLCBTdHJpbmcgcmVzcG9uc2VNZXNzYWdlLCBBZGRVc2VyQXVkaXRNZXNzYWdlSW5mbyBhZGRVc2VyQXVkaXRNZXNzYWdlSW5mbykgeworCQlTdHJpbmcgYWN0aW9uID0gIkRlbGV0ZVVzZXIiOworCQl2YWxpZGF0ZVVzZXJBdWRpdE1lc3NhZ2Uoc2RuY1VzZXJEZXRhaWxzLCBzZG5jTW9kaWZpZXJEZXRhaWxzLCByZXNwb25zZUNvZGUsIHJlc3BvbnNlTWVzc2FnZSwKKwkJCQlhZGRVc2VyQXVkaXRNZXNzYWdlSW5mbywgYWN0aW9uKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVVc2VyQXVkaXRNZXNzYWdlKFVzZXIgc2RuY1VzZXJEZXRhaWxzLCBVc2VyIHNkbmNNb2RpZmllckRldGFpbHMsIFN0cmluZyByZXNwb25zZUNvZGUsCisJCQlTdHJpbmcgcmVzcG9uc2VNZXNzYWdlLCBBZGRVc2VyQXVkaXRNZXNzYWdlSW5mbyBhZGRVc2VyQXVkaXRNZXNzYWdlSW5mbywgU3RyaW5nIGV4cGVjdGVkQWN0aW9uKSB7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBhdWRpdCBhY3Rpb24gLSAiLCBleHBlY3RlZEFjdGlvbiwgYWRkVXNlckF1ZGl0TWVzc2FnZUluZm8uZ2V0QUNUSU9OKCkpOworCisJCS8vIFN0cmluZyBleHBlY3RlZE1vZGlmaWVyRmlyc3RMYXN0TmFtZSA9CisJCS8vIHNkbmNNb2RpZmllckRldGFpbHMuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKworCQkvLyBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldExhc3ROYW1lKCk7CisJCS8vIGFzc2VydEVxdWFscygiY2hlY2sgYXVkaXQgbW9kaWZpZXIgbmFtZSAtICIsCisJCS8vIGV4cGVjdGVkTW9kaWZpZXJGaXJzdExhc3ROYW1lLAorCQkvLyBhZGRVc2VyQXVkaXRNZXNzYWdlSW5mby5nZXRNT0RJRklFUl9OQU1FKCkpOworCQlTdHJpbmcgZnVsbE5hbWUgPSBzZG5jTW9kaWZpZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCk7CisJCWlmIChzZG5jTW9kaWZpZXJEZXRhaWxzLmdldEZ1bGxOYW1lKCkuZXF1YWxzKCIgIikpIHsKKwkJCWZ1bGxOYW1lID0gIiI7CisJCX0KKwkJU3RyaW5nIGV4cGVjdGVkTW9kaWZpZXJJZCA9IGZ1bGxOYW1lICsgIigiICsgc2RuY01vZGlmaWVyRGV0YWlscy5nZXRVc2VySWQoKSArICIpIjsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBhdWRpdCBtb2RpZmllciB1aWQgLSAiLCBleHBlY3RlZE1vZGlmaWVySWQsIGFkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvLmdldE1PRElGSUVSKCkpOworCisJCVN0cmluZyBleHBlY3RlZFVzZXJGaXJzdExhc3ROYW1lID0gc2RuY1VzZXJEZXRhaWxzLmdldEZpcnN0TmFtZSgpICsgIiAiICsgc2RuY1VzZXJEZXRhaWxzLmdldExhc3ROYW1lKCk7CisJCWlmIChleHBlY3RlZFVzZXJGaXJzdExhc3ROYW1lLmVxdWFscygibnVsbCBudWxsIikpIHsKKwkJCWV4cGVjdGVkVXNlckZpcnN0TGFzdE5hbWUgPSAiIjsKKwkJfQorCisJCVN0cmluZyBlbWFpbCA9IChzZG5jVXNlckRldGFpbHMuZ2V0RW1haWwoKSA9PSBudWxsKSA/ICIiIDogc2RuY1VzZXJEZXRhaWxzLmdldEVtYWlsKCk7CisJCVN0cmluZyByb2xlID0gKHNkbmNVc2VyRGV0YWlscy5nZXRSb2xlKCkgPT0gbnVsbCkgPyAiREVTSUdORVIiIDogc2RuY1VzZXJEZXRhaWxzLmdldFJvbGUoKTsKKworCQlTdHJpbmcgZm9ybWF0ZWRVc2VyID0gU3RyaW5nLmZvcm1hdCgiJXMsJXMsJXMsJXMiLCBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCksIGV4cGVjdGVkVXNlckZpcnN0TGFzdE5hbWUsCisJCQkJZW1haWwsIHJvbGUpOworCisJCS8vCisJCS8vIFN0cmluZyBleHBlY3RlZFVzZXJGaXJzdExhc3ROYW1lID0gc2RuY1VzZXJEZXRhaWxzLmdldEZpcnN0TmFtZSgpICsgIgorCQkvLyAiICsgc2RuY1VzZXJEZXRhaWxzLmdldExhc3ROYW1lKCk7CisJCS8vIGlmIChleHBlY3RlZFVzZXJGaXJzdExhc3ROYW1lLmVxdWFscygibnVsbCBudWxsIikpIHsKKwkJLy8gZXhwZWN0ZWRVc2VyRmlyc3RMYXN0TmFtZSA9ICIiOworCQkvLyB9CisJCS8vCisJCS8vIFN0cmluZyBleHBlY3RlZFVzZXJGaXJzdExhc3ROYW1lID0gIiI7CisJCS8vIGV4cGVjdGVkVXNlckZpcnN0TGFzdE5hbWUgKz0gc2RuY1VzZXJEZXRhaWxzLmdldEZpcnN0TmFtZSgpID09IG51bGwgPworCQkvLyAiIiA6IHNkbmNVc2VyRGV0YWlscy5nZXRGaXJzdE5hbWUoKTsKKwkJLy8gU3RyaW5nIGxhc3ROYW1lID0gc2RuY1VzZXJEZXRhaWxzLmdldExhc3ROYW1lKCkgPT0gbnVsbCA/ICIiIDoKKwkJLy8gc2RuY1VzZXJEZXRhaWxzLmdldExhc3ROYW1lKCk7CisJCS8vIGlmIChleHBlY3RlZFVzZXJGaXJzdExhc3ROYW1lLmlzRW1wdHkoKSkgeworCQkvLyBleHBlY3RlZFVzZXJGaXJzdExhc3ROYW1lID0gbGFzdE5hbWU7CisJCS8vIH0gZWxzZSB7CisJCS8vIGV4cGVjdGVkVXNlckZpcnN0TGFzdE5hbWUgKz0gIiAiICsgbGFzdE5hbWU7CisJCS8vIH0KKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGF1ZGl0IHVzZXIgbmFtZSAtICIsIGZvcm1hdGVkVXNlciwgYWRkVXNlckF1ZGl0TWVzc2FnZUluZm8uZ2V0VVNFUigpKTsKKworCQkvLyBTdHJpbmcgZXhwZWN0ZWRVc2VyVWlkID0gc2RuY1VzZXJEZXRhaWxzLmdldFVzZXJJZCgpOworCQkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIGF1ZGl0IHVzZXIgdWlkIC0gIiwgZXhwZWN0ZWRVc2VyVWlkLAorCQkvLyBhZGRVc2VyQXVkaXRNZXNzYWdlSW5mby5nZXRVU0VSX1VJRCgpKTsKKwkJLy8KKwkJLy8gU3RyaW5nIGV4cGVjdGVkVXNlckVtYWlsID0gc2RuY1VzZXJEZXRhaWxzLmdldEVtYWlsKCkgPT0gbnVsbCA/ICIiIDoKKwkJLy8gc2RuY1VzZXJEZXRhaWxzLmdldEVtYWlsKCk7CisJCS8vIC8vVE9ETzogZXNvZmVyIGNoZWNrIHdpdGggQW5kcmV5LiBBdWRpdCByZXR1cm4gIiIgYnV0IGluIHVzZXIgd2UgaGF2ZQorCQkvLyBudWxsCisJCS8vIGFzc2VydEVxdWFscygiY2hlY2sgYXVkaXQgdXNlciBlbWFpbCAtICIsIGV4cGVjdGVkVXNlckVtYWlsLAorCQkvLyBhZGRVc2VyQXVkaXRNZXNzYWdlSW5mby5nZXRVU0VSX0VNQUlMKCkpOworCQkvLworCQkvLyBTdHJpbmcgZXhwZWN0ZWRVc2VyUm9sZSA9IHNkbmNVc2VyRGV0YWlscy5nZXRSb2xlKCk7CisJCS8vIGlmIChleHBlY3RlZFVzZXJSb2xlID09bnVsbCl7CisJCS8vIGV4cGVjdGVkVXNlclJvbGUgPSAiREVTSUdORVIiOworCQkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIGF1ZGl0IHVzZXIgcm9sZSAtICIsIGV4cGVjdGVkVXNlclJvbGUsCisJCS8vIGFkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvLmdldFVTRVJfUk9MRSgpKTsKKwkJLy8gfWVsc2V7CisJCS8vIGFzc2VydEVxdWFscygiY2hlY2sgYXVkaXQgdXNlciByb2xlIC0gIiwgZXhwZWN0ZWRVc2VyUm9sZSwKKwkJLy8gYWRkVXNlckF1ZGl0TWVzc2FnZUluZm8uZ2V0VVNFUl9ST0xFKCkpOworCQkvLyB9CisKKwkJU3RyaW5nIGV4cGVjdGVkVXNlclJlc3BvbnNlQ29kZSA9IHJlc3BvbnNlQ29kZTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBhdWRpdCB1c2VyIHJlc3BvbnNlIGNvZGUgLSAiLCBleHBlY3RlZFVzZXJSZXNwb25zZUNvZGUsCisJCQkJYWRkVXNlckF1ZGl0TWVzc2FnZUluZm8uZ2V0U1RBVFVTKCkpOworCisJCVN0cmluZyBleHBlY3RlZFVzZXJSZXNwb25zZU1lc3NhZ2UgPSByZXNwb25zZU1lc3NhZ2U7CisJCWFzc2VydEVxdWFscygiY2hlY2sgYXVkaXQgdXNlciByZXNwb25zZSBtZXNzYWdlIC0gIiwgZXhwZWN0ZWRVc2VyUmVzcG9uc2VNZXNzYWdlLAorCQkJCWFkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvLmdldERFU0MoKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVEYXRhQWdhaW5zdEF1ZGl0REJfYWNjZXNzKFVzZXIgc2RuY1VzZXJEZXRhaWxzLCBVc2VyQXVkaXRKYXZhT2JqZWN0IGF1ZGl0SmF2YU9iamVjdCwKKwkJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UsIEVycm9ySW5mbyBlcnJvckluZm8sIExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMpIHsKKworCQl2YWxpZGF0ZUF1ZGl0RGF0YUFnYWluc3RBdWRpdERiSW5BY2Nlc3Moc2RuY1VzZXJEZXRhaWxzLCBhdWRpdEphdmFPYmplY3QsIHJlc3RSZXNwb25zZSwgZXJyb3JJbmZvLCB2YXJpYWJsZXMpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXVkaXREYXRhQWdhaW5zdEF1ZGl0RGJJbkFjY2VzcyhVc2VyIHNkbmNVc2VyRGV0YWlscywKKwkJCVVzZXJBdWRpdEphdmFPYmplY3QgYXVkaXRKYXZhT2JqZWN0LCBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlLCBFcnJvckluZm8gZXJyb3JJbmZvLAorCQkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcykgeworCisJCVN0cmluZyBleHBlY3RlZDsKKworCQlleHBlY3RlZCA9ICJBY2Nlc3MiOworCQlhc3NlcnRFcXVhbHMoIkFDVElPTi0gIiwgZXhwZWN0ZWQsIGF1ZGl0SmF2YU9iamVjdC5nZXRBQ1RJT04oKSk7CisKKwkJaWYgKHNkbmNVc2VyRGV0YWlscy5nZXRGaXJzdE5hbWUoKSAhPSBTdHJpbmdVdGlscy5FTVBUWSAmJiBzZG5jVXNlckRldGFpbHMuZ2V0TGFzdE5hbWUoKSAhPSBTdHJpbmdVdGlscy5FTVBUWSkgeworCQkJZXhwZWN0ZWQgPSBzZG5jVXNlckRldGFpbHMuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyBzZG5jVXNlckRldGFpbHMuZ2V0TGFzdE5hbWUoKTsKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkID0gU3RyaW5nVXRpbHMuRU1QVFk7CisJCX0KKwkJU3RyaW5nIGZvcm1hdGVkVXNlciA9IFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIGV4cGVjdGVkLCBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRUcnVlKAorCQkJCSJjaGVjayBhdWRpdCB1c2VyOiBleHBlY3RlZCBzdGFydCB3aXRoIC0gIiArIGZvcm1hdGVkVXNlciArICIgLGFjdHVhbCAtICIgKyBhdWRpdEphdmFPYmplY3QuZ2V0VVNFUigpLAorCQkJCWF1ZGl0SmF2YU9iamVjdC5nZXRVU0VSKCkuc3RhcnRzV2l0aChmb3JtYXRlZFVzZXIpKTsKKworCQlleHBlY3RlZCA9IHJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKS50b1N0cmluZygpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGF1ZGl0IHVzZXIgc3RhdHVzIGNvZGUgLSAiLCBleHBlY3RlZCwgYXVkaXRKYXZhT2JqZWN0LmdldFNUQVRVUygpKTsKKworCQlpZiAocmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCB8fCByZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKSB7CisJCQlleHBlY3RlZCA9IGVycm9ySW5mby5nZXRNZXNzYWdlKCk7CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcyk7CisJCX0KKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGF1ZGl0IHVzZXIgZGVzYyAtICIsIGV4cGVjdGVkLCBhdWRpdEphdmFPYmplY3QuZ2V0REVTQygpKTsKKworCQkvLyBleHBlY3RlZCA9IHNkbmNVc2VyRGV0YWlscy5nZXRVc2VySWQoKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhdWRpdEphdmFPYmplY3QuZ2V0VVNFUigpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVVzZXJEZXRhaWxzT25SZXNwb25zZShVc2VyIHNkbmNVc2VyRGV0YWlscywgU3RyaW5nIHVzZXJEZXRhaWxzT25SZXNwb25zZSkgeworCisJCVN0cmluZyBhY3R1YWxGaXJzdE5hbWUgPSBVdGlscy5nZXRKc29uT2JqZWN0VmFsdWVCeUtleSh1c2VyRGV0YWlsc09uUmVzcG9uc2UsICJmaXJzdE5hbWUiKTsKKwkJU3RyaW5nIGV4cGVjdGVkRmlyc3ROYW1lID0gc2RuY1VzZXJEZXRhaWxzLmdldEZpcnN0TmFtZSgpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgZmlyc3QgbmFtZSAtICIsIGV4cGVjdGVkRmlyc3ROYW1lLCBhY3R1YWxGaXJzdE5hbWUpOworCisJCVN0cmluZyBhY3R1YWxMYXN0TmFtZSA9IFV0aWxzLmdldEpzb25PYmplY3RWYWx1ZUJ5S2V5KHVzZXJEZXRhaWxzT25SZXNwb25zZSwgImxhc3ROYW1lIik7CisJCVN0cmluZyBleHBlY3RlZExhc3ROYW1lID0gc2RuY1VzZXJEZXRhaWxzLmdldExhc3ROYW1lKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBsYXN0IG5hbWUgLSAiLCBleHBlY3RlZExhc3ROYW1lLCBhY3R1YWxMYXN0TmFtZSk7CisKKwkJU3RyaW5nIGFjdHVhbFVzZXJJZCA9IFV0aWxzLmdldEpzb25PYmplY3RWYWx1ZUJ5S2V5KHVzZXJEZXRhaWxzT25SZXNwb25zZSwgInVzZXJJZCIpOworCQlTdHJpbmcgZXhwZWN0ZWRVc2VySWQgPSBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciB1c2VySWQgLSAiLCBleHBlY3RlZFVzZXJJZCwgYWN0dWFsVXNlcklkKTsKKworCQlTdHJpbmcgYWN0dWFsRW1haWwgPSBVdGlscy5nZXRKc29uT2JqZWN0VmFsdWVCeUtleSh1c2VyRGV0YWlsc09uUmVzcG9uc2UsICJlbWFpbCIpOworCQlTdHJpbmcgZXhwZWN0ZWRFbWFpbCA9IHNkbmNVc2VyRGV0YWlscy5nZXRFbWFpbCgpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgZW1haWwgLSAiLCBleHBlY3RlZEVtYWlsLCBhY3R1YWxFbWFpbCk7CisKKwkJU3RyaW5nIGFjdHVhbFJvbGUgPSBVdGlscy5nZXRKc29uT2JqZWN0VmFsdWVCeUtleSh1c2VyRGV0YWlsc09uUmVzcG9uc2UsICJyb2xlIik7CisJCWlmIChzZG5jVXNlckRldGFpbHMuZ2V0Um9sZSgpID09IG51bGwpIHsKKwkJCVN0cmluZyBleHBlY3RlZFJvbGUgPSBVc2VyUm9sZUVudW0uREVTSUdORVIubmFtZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIHJvbGUgLSAiLCBleHBlY3RlZFJvbGUsIGFjdHVhbFJvbGUpOworCQl9IGVsc2UgeworCQkJU3RyaW5nIGV4cGVjdGVkUm9sZSA9IHNkbmNVc2VyRGV0YWlscy5nZXRSb2xlKCk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgcm9sZSAtICIsIGV4cGVjdGVkUm9sZSwgYWN0dWFsUm9sZSk7CisJCX0KKworCQlTdHJpbmcgYWN0dWFsU3RhdHVzID0gVXRpbHMuZ2V0SnNvbk9iamVjdFZhbHVlQnlLZXkodXNlckRldGFpbHNPblJlc3BvbnNlLCAic3RhdHVzIik7CisJCVN0cmluZyBleHBlY3RlZFN0YXR1cyA9IHNkbmNVc2VyRGV0YWlscy5nZXRTdGF0dXMoKS5uYW1lKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBzdGF0dXMgLSAiLCBleHBlY3RlZFN0YXR1cywgYWN0dWFsU3RhdHVzKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgQWRkVXNlckF1ZGl0TWVzc2FnZUluZm8gZ2V0QWRkVXNlckF1ZGl0TWVzc2FnZShTdHJpbmcgYWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQlTdHJpbmcgaW5kZXggPSAiYXVkaXRpbmdldmVudHMqIjsKKwkJU3RyaW5nIHR5cGUgPSAidXNlcmFkbWluZXZlbnQiOworCQlTdHJpbmcgcGF0dGVybiA9ICIvX3NlYXJjaD9xPUFDVElPTjpcIiIgKyBhY3Rpb24gKyAiXCIiOworCQlTdHJpbmcgYXVkaXRpbmdNZXNzYWdlID0gRGJVdGlscy5yZXRyaWV2ZUF1ZGl0TWVzc2FnZXNCeVBhdHRlcm4ocGF0dGVybik7CisJCS8vIFN0cmluZyBhdWRpdGluZ01lc3NhZ2UgPSByZXRyaWV2ZUF1ZGl0TWVzc2FnZUJ5SW5kZXhUeXBlKGluZGV4LCB0eXBlLAorCQkvLyBwYXR0ZXJuKTsKKwkJSnNvbkVsZW1lbnQgakVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKGF1ZGl0aW5nTWVzc2FnZSk7CisJCUpzb25PYmplY3Qgak9iamVjdCA9IGpFbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQlKc29uT2JqZWN0IGhpdHNPYmplY3QgPSAoSnNvbk9iamVjdCkgak9iamVjdC5nZXQoImhpdHMiKTsKKwkJSnNvbkFycmF5IGhpdHNBcnJheSA9IChKc29uQXJyYXkpIGhpdHNPYmplY3QuZ2V0KCJoaXRzIik7CisJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgaGl0c0FycmF5LnNpemUoKTspeworCQlpZiAoaGl0c0FycmF5ICE9IG51bGwpIHsKKwkJCUpzb25PYmplY3QgakhpdE9iamVjdCA9IChKc29uT2JqZWN0KSBoaXRzQXJyYXkuZ2V0KDApOworCQkJSnNvbk9iamVjdCBqU291cmNlT2JqZWN0ID0gKEpzb25PYmplY3QpIGpIaXRPYmplY3QuZ2V0KCJfc291cmNlIik7CisJCQlBZGRVc2VyQXVkaXRNZXNzYWdlSW5mbyBhZGRVc2VyQXVkaXRNZXNzYWdlSW5mbyA9IG5ldyBBZGRVc2VyQXVkaXRNZXNzYWdlSW5mbygpOworCQkJYWRkVXNlckF1ZGl0TWVzc2FnZUluZm8gPSBnc29uLmZyb21Kc29uKGpTb3VyY2VPYmplY3QsIEFkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvLmNsYXNzKTsKKwkJCXJldHVybiBhZGRVc2VyQXVkaXRNZXNzYWdlSW5mbzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUFkZFVzZXJBdWRpdE1lc3NhZ2UoVXNlciBzZG5jVXNlckRldGFpbHMsIFVzZXIgc2RuY01vZGlmaWVyRGV0YWlscywgU3RyaW5nIHJlc3BvbnNlQ29kZSwKKwkJCVN0cmluZyByZXNwb25zZU1lc3NhZ2UsIEFkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvIGFkZFVzZXJBdWRpdE1lc3NhZ2VJbmZvKSB7CisKKwkJU3RyaW5nIGFjdGlvbiA9ICJBZGRVc2VyIjsKKwkJdmFsaWRhdGVVc2VyQXVkaXRNZXNzYWdlKHNkbmNVc2VyRGV0YWlscywgc2RuY01vZGlmaWVyRGV0YWlscywgcmVzcG9uc2VDb2RlLCByZXNwb25zZU1lc3NhZ2UsCisJCQkJYWRkVXNlckF1ZGl0TWVzc2FnZUluZm8sIGFjdGlvbik7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy93ZWJTZWFsQWNjZXNzL05lb0phdmFPYmplY3QuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy93ZWJTZWFsQWNjZXNzL05lb0phdmFPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzE5NjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3dlYlNlYWxBY2Nlc3MvTmVvSmF2YU9iamVjdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMud2ViU2VhbEFjY2VzczsKKworcHVibGljIGNsYXNzIE5lb0phdmFPYmplY3QgeworCisJU3RyaW5nIHVzZXJJZDsKKwlTdHJpbmcgZmlyc3ROYW1lOworCVN0cmluZyBsYXN0TmFtZTsKKwlTdHJpbmcgZW1haWw7CisJU3RyaW5nIHJvbGU7CisJU3RyaW5nIGxhYmVsOworCVN0cmluZyBlbGVtZW50VHlwZTsKKworCXB1YmxpYyBOZW9KYXZhT2JqZWN0KFN0cmluZyB1c2VySWQsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIGVtYWlsLCBTdHJpbmcgcm9sZSwgU3RyaW5nIGxhYmVsLAorCQkJU3RyaW5nIGVsZW1lbnRUeXBlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCQl0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKKwkJdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOworCQl0aGlzLmVtYWlsID0gZW1haWw7CisJCXRoaXMucm9sZSA9IHJvbGU7CisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworCX0KKworCXB1YmxpYyBOZW9KYXZhT2JqZWN0KCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcklkKCkgeworCQlyZXR1cm4gdXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJJZChTdHJpbmcgdXNlcklkKSB7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgeworCQlyZXR1cm4gZmlyc3ROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKSB7CisJCXRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7CisJCXJldHVybiBsYXN0TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpIHsKKwkJdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7CisJCXJldHVybiBlbWFpbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpIHsKKwkJdGhpcy5lbWFpbCA9IGVtYWlsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpIHsKKwkJcmV0dXJuIHJvbGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkgeworCQl0aGlzLnJvbGUgPSByb2xlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKwkJdGhpcy5sYWJlbCA9IGxhYmVsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGUoKSB7CisJCXJldHVybiBlbGVtZW50VHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VHlwZShTdHJpbmcgZWxlbWVudFR5cGUpIHsKKwkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUXVlcnlVc2VyTmVvNGpJbmZvIFt1c2VySWQ9IiArIHVzZXJJZCArICIsIGZpcnN0TmFtZT0iICsgZmlyc3ROYW1lICsgIiwgbGFzdE5hbWU9IiArIGxhc3ROYW1lCisJCQkJKyAiLCBlbWFpbD0iICsgZW1haWwgKyAiLCByb2xlPSIgKyByb2xlICsgIiwgbGFiZWw9IiArIGxhYmVsICsgIiwgZWxlbWVudFR5cGU9IiArIGVsZW1lbnRUeXBlICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4dGVybmFsQXBpcy9HZXRBc3NldFNlcnZsZXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leHRlcm5hbEFwaXMvR2V0QXNzZXRTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhODUyNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leHRlcm5hbEFwaXMvR2V0QXNzZXRTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leHRlcm5hbEFwaXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50czsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQXNzZXRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdFVpRG93bmxvYWREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuYXBpLkNvbXBvbmVudEJhc2VUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5VcmxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlQXNzZXRTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZUFzc2V0U3RydWN0dXJlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZEV4dGVybmFsQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuSHR0cEhlYWRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXNzZXRSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BdWRpdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIEdldEFzc2V0U2VydmxldCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBVc2VyIHNkbmNVc2VyRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluVXNlckRldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uQURNSU4pOworCXByb3RlY3RlZCBDb25zdW1lckRhdGFEZWZpbml0aW9uIGNvbnN1bWVyRGF0YURlZmluaXRpb247CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIEdldEFzc2V0U2VydmxldCgpIHsKKwkJc3VwZXIobmFtZSwgR2V0QXNzZXRTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24geworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRDb25zdW1lcih0cnVlKTsKKwkJLy8gY29uc3VtZXJEYXRhRGVmaW5pdGlvbiA9CisJCS8vIENvbnN1bWVyUmVzdFV0aWxzLmdldERlZmF1bHRDb25zdW1lckRldGFpbHMoKTsKKwkJLy8gUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc3BvbnNlID0KKwkJLy8gQ29uc3VtZXJSZXN0VXRpbHMuZGVsZXRlQ29uc3VtZXIoY29uc3VtZXJEYXRhRGVmaW5pdGlvbiwKKwkJLy8gc2RuY0FkbWluVXNlckRldGFpbHMpOworCQkvLyBCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShkZWxldGVSZXNwb25zZSwgImRlbGV0ZSBvcGVyYXRpb24KKwkJLy8gZmlsZWQiLCBmYWxzZSwgNDA0LDIwMCk7OworCQkvLworCQkvLyBSZXN0UmVzcG9uc2UgY3JlYXRlUmVzcG9uc2UgPQorCQkvLyBDb25zdW1lclJlc3RVdGlscy5jcmVhdGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCQkvLyBzZG5jQWRtaW5Vc2VyRGV0YWlscyk7CisJCS8vIEJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNwb25zZSk7CisKKwl9CisKKwkvLyBAQWZ0ZXJNZXRob2QKKwkvLyBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb257CisJLy8gUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc3BvbnNlID0KKwkvLyBDb25zdW1lclJlc3RVdGlscy5kZWxldGVDb25zdW1lcihjb25zdW1lckRhdGFEZWZpbml0aW9uLAorCS8vIHNkbmNBZG1pblVzZXJEZXRhaWxzKTsKKwkvLyBCYXNlUmVzdFV0aWxzLmNoZWNrU3RhdHVzQ29kZShkZWxldGVSZXNwb25zZSwgImRlbGV0ZSBvcGVyYXRpb24gZmlsZWQiLAorCS8vIGZhbHNlLCA0MDQsMjAwKTsKKwkvLworCS8vIH0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBc3NldFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRBc3NldE5hbWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlJlc291cmNlMSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChyZXNvdXJjZS5nZXROYW1lKCkpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJSZXNvdXJjZTIiKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsIHRydWUpLmdldExlZnQoKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiUmVzb3VyY2UzIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiUmVzb3VyY2U0Iik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiUmVzb3VyY2U1Iik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHJlc291cmNlLmdldE5hbWUoKSk7CisKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlJlc291cmNlNiIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChyZXNvdXJjZS5nZXROYW1lKCkpOworCisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKCJSZXNvdXJjZTciKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULCB0cnVlKS5nZXRMZWZ0KCk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHJlc291cmNlLmdldE5hbWUoKSk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHJlc291cmNlLmdldE5hbWUoKSk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCI3IFZGIHJlc291cmNlcyB3ZXJlIGNyZWF0ZWQiKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUyk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCUxpc3Q8UmVzb3VyY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VBc3NldExpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRSZXNvdXJjZUFzc2V0TGlzdChhc3NldFJlc3BvbnNlKTsKKwkJTGlzdDxTdHJpbmc+IGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0UmVzb3VyY2VOYW1lc0xpc3QocmVzb3VyY2VBc3NldExpc3QpOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhnZXRBY3R1YWxBc3NldE5hbWVzTGlzdCwgZXhwZWN0ZWRBc3NldE5hbWVzTGlzdCwgIkVsZW1lbnQiKTsKKworCQlBc3NldFJlc3RVdGlscy5jaGVja1Jlc291cmNlVHlwZUluT2JqZWN0TGlzdChyZXNvdXJjZUFzc2V0TGlzdCwgUmVzb3VyY2VUeXBlRW51bS5WRik7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRBc3NldExpc3RBdWRpdChBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9MSVNUKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkQXNzZXROYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uT1RIRVIsIEFydGlmYWN0VHlwZUVudW0uT1RIRVIsIHRydWUpOworCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKwkJc2VydmljZURldGFpbHMuc2V0TmFtZSgiU2VydmljZTEiKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVTZXJ2aWNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChzZXJ2aWNlLmdldE5hbWUoKSk7CisKKwkJc2VydmljZURldGFpbHMuc2V0TmFtZSgiU2VydmljZTIiKTsKKwkJY3JlYXRlU2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVTZXJ2aWNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydGlmYWN0RGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKTsKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQoc2VydmljZS5nZXROYW1lKCkpOworCisJCXNlcnZpY2VEZXRhaWxzLnNldE5hbWUoIlNlcnZpY2UzIik7CisJCWNyZWF0ZVNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydGlmYWN0RGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKTsKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQoc2VydmljZS5nZXROYW1lKCkpOworCisJCXNlcnZpY2VEZXRhaWxzLnNldE5hbWUoIlNlcnZpY2U0Iik7CisJCWNyZWF0ZVNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQoc2VydmljZS5nZXROYW1lKCkpOworCisJCXNlcnZpY2VEZXRhaWxzLnNldE5hbWUoIlNlcnZpY2U1Iik7CisJCWNyZWF0ZVNlcnZpY2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscy5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKworCQlzZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJTZXJ2aWNlNiIpOworCQljcmVhdGVTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2UpOworCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVNlcnZpY2UuZ2V0UmVzcG9uc2UoKSwgU2VydmljZS5jbGFzcyk7CisJCWFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZShhcnRpZmFjdERldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChzZXJ2aWNlLmdldE5hbWUoKSk7CisKKwkJc2VydmljZURldGFpbHMuc2V0TmFtZSgiU2VydmljZTciKTsKKwkJY3JlYXRlU2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVTZXJ2aWNlKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVTZXJ2aWNlLmdldFJlc3BvbnNlKCksIFNlcnZpY2UuY2xhc3MpOworCQlhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UgPSBBcnRpZmFjdFJlc3RVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UoYXJ0aWZhY3REZXRhaWxzLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCBzZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRklDQVRJT05SRVFVRVNULCB0cnVlKS5nZXRMZWZ0KCk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQoc2VydmljZS5nZXROYW1lKCkpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiNyBTZXJ2aWNlcyB3ZXJlIGNyZWF0ZWQiKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlNFUlZJQ0VTKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJTGlzdDxTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU+IHNlcnZpY2VBc3NldExpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlQXNzZXRMaXN0KGFzc2V0UmVzcG9uc2UpOworCQlMaXN0PFN0cmluZz4gZ2V0QWN0dWFsQXNzZXROYW1lc0xpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlTmFtZXNMaXN0KHNlcnZpY2VBc3NldExpc3QpOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhnZXRBY3R1YWxBc3NldE5hbWVzTGlzdCwgZXhwZWN0ZWRBc3NldE5hbWVzTGlzdCwgIkVsZW1lbnQiKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfQVNTRVRfTElTVCk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LCBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0FTU0VUX0xJU1QuZ2V0TmFtZSgpLCBudWxsKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0VG9zY2FNb2RlbFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlJlc291cmNlMSIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJUmVzdFJlc3BvbnNlIGNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLCBzZG5jVXNlckRldGFpbHMpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCUh0dHBSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50VG9zY2FNb2RlbChBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgcmVzb3VyY2UuZ2V0VVVJRCgpKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlTdHJpbmcgYXJ0SWQgPSByZXNvdXJjZS5nZXRUb3NjYUFydGlmYWN0cygpLmdldCgiYXNzZXR0b3NjYWNzYXIiKS5nZXRFc0lkKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuVUlfRE9XTkxPQURfUkVTT1VSQ0VfQVJUSUZBQ1QsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGFydElkKTsKKwkJSHR0cEdldCBodHRwR2V0ID0gY3JlYXRlR2V0UmVxdWVzdCh1cmwpOworCQlIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUoaHR0cEdldCk7CisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzcG9uc2UuZ2V0RW50aXR5KCkuZ2V0Q29udGVudCgpOworCQlBcnRpZmFjdFVpRG93bmxvYWREYXRhIGFydGlmYWN0VWlEb3dubG9hZERhdGEgPSBnZXRBcnRpZmFjdFVpRG93bmxvYWREYXRhKElPVXRpbHMudG9TdHJpbmcoaW5wdXRTdHJlYW0pKTsKKwkJYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudFRvc2NhTW9kZWwoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIHJlc291cmNlLmdldFVVSUQoKSk7CisJCWlucHV0U3RyZWFtID0gYXNzZXRSZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRDb250ZW50KCk7CisJCWludCBsZW4gPSAoaW50KSBhc3NldFJlc3BvbnNlLmdldEVudGl0eSgpLmdldENvbnRlbnRMZW5ndGgoKTsKKwkJYnl0ZVtdIHJlcyA9IG5ldyBieXRlW2xlbl07CisJCWlucHV0U3RyZWFtLnJlYWQocmVzLCAwLCBsZW4pOworCQlieXRlW10gZnJvbVVpRG93bmxvYWQgPSBhcnRpZmFjdFVpRG93bmxvYWREYXRhLmdldEJhc2U2NENvbnRlbnRzKCkuZ2V0Qnl0ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2U2NC5lbmNvZGVCYXNlNjQocmVzKSwgZnJvbVVpRG93bmxvYWQpOworCQlTdHJpbmcgZmlsZU5hbWUgPSBhc3NldFJlc3BvbnNlLmdldEZpcnN0SGVhZGVyKENvbnN0YW50cy5DT05URU5UX0RJU1BPU0lUSU9OX0hFQURFUikuZ2V0VmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGZpbGVOYW1lLCBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZCgiYXR0YWNobWVudDsgZmlsZW5hbWU9XCIiKS5hcHBlbmQoYXJ0aWZhY3RVaURvd25sb2FkRGF0YS5nZXRBcnRpZmFjdE5hbWUoKSkuYXBwZW5kKCJcIiIpLnRvU3RyaW5nKCkpOworCX0KKworCXByaXZhdGUgSHR0cEdldCBjcmVhdGVHZXRSZXF1ZXN0KFN0cmluZyB1cmwpIHsKKwkJSHR0cEdldCBodHRwR2V0ID0gbmV3IEh0dHBHZXQodXJsKTsKKwkJaHR0cEdldC5hZGRIZWFkZXIoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCBzZG5jVXNlckRldGFpbHMuZ2V0VXNlcklkKCkpOworCQlyZXR1cm4gaHR0cEdldDsKKwl9CisKKwlwcml2YXRlIEFydGlmYWN0VWlEb3dubG9hZERhdGEgZ2V0QXJ0aWZhY3RVaURvd25sb2FkRGF0YShTdHJpbmcgYXJ0aWZhY3RVaURvd25sb2FkRGF0YVN0cikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJdHJ5IHsKKwkJCUFydGlmYWN0VWlEb3dubG9hZERhdGEgYXJ0aWZhY3RVaURvd25sb2FkRGF0YSA9IG1hcHBlci5yZWFkVmFsdWUoYXJ0aWZhY3RVaURvd25sb2FkRGF0YVN0ciwgQXJ0aWZhY3RVaURvd25sb2FkRGF0YS5jbGFzcyk7CisJCQlyZXR1cm4gYXJ0aWZhY3RVaURvd25sb2FkRGF0YTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4dGVybmFsQXBpcy9HZXRGaWx0ZXJlZEFzc2V0U2VydmxldC5qYXZhIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4dGVybmFsQXBpcy9HZXRGaWx0ZXJlZEFzc2V0U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODZjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXh0ZXJuYWxBcGlzL0dldEZpbHRlcmVkQXNzZXRTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw0MzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leHRlcm5hbEFwaXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQXNzZXRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EaXN0cmlidXRpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmFwaS5Db21wb25lbnRCYXNlVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZUFzc2V0U3RydWN0dXJlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTGlmZUN5Y2xlU3RhdGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuU2VydmljZUNhdGVnb3JpZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmV4cGVjdGVkLkV4cGVjdGVkRXh0ZXJuYWxBdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5BdG9taWNPcGVyYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXJ0aWZhY3RSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Bc3NldFJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkJhc2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5TZXJ2aWNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5FcnJvclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBHZXRGaWx0ZXJlZEFzc2V0U2VydmxldCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5RmlsdGVyS2V5ID0gImNhdGVnb3J5IjsKKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBzdWJDYXRlZ29yeUZpbHRlcktleSA9ICJzdWJDYXRlZ29yeSI7CisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgZGlzdHJpYnV0aW9uU3RhdHVzRmlsdGVyS2V5ID0gImRpc3RyaWJ1dGlvblN0YXR1cyI7CisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgc2VydmljZUtleSA9ICJzZXJ2aWNlIjsKKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyByZXNvdXJjZUtleSA9ICJyZXNvdXJjZSI7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIEdldEZpbHRlcmVkQXNzZXRTZXJ2bGV0KCkgeworCQlzdXBlcihuYW1lLCBHZXRGaWx0ZXJlZEFzc2V0U2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24geworCQlBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0Q29uc3VtZXIodHJ1ZSk7CisJfQorCisJLy8gUkVTT1VSQ0UKKwkvLyBTdWNjZXNzCisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQXNzZXRCeVNwZWNpZmllZENhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULmdldENhdGVnb3J5KCkgfTsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkQXNzZXROYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZTEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGLCBOb3JtYXRpdmVUeXBlc0VudW0uQ09NUFVURSwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQocmVzb3VyY2UxLmdldE5hbWUoKSk7CisJCVJlc291cmNlIHJlc291cmNlMiA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZVJlc291cmNlc0J5VHlwZU5vcm1UeXBlQW5kQ2F0cmVnb3J5KFJlc291cmNlVHlwZUVudW0uVkYsIE5vcm1hdGl2ZVR5cGVzRW51bS5EQVRBQkFTRSwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19ORVRXT1JLX0VMRU1FTlRTLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChyZXNvdXJjZTIuZ2V0TmFtZSgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRiwgTm9ybWF0aXZlVHlwZXNFbnVtLkNPTVBVVEUsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfQ09OTkVDVElWSVRZX0NPTl9QT0lOVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgZmlsdGVyKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJTGlzdDxSZXNvdXJjZUFzc2V0U3RydWN0dXJlPiByZXNvdXJjZUFzc2V0TGlzdCA9IEFzc2V0UmVzdFV0aWxzLmdldFJlc291cmNlQXNzZXRMaXN0KGFzc2V0UmVzcG9uc2UpOworCQlMaXN0PFN0cmluZz4gZ2V0QWN0dWFsQXNzZXROYW1lc0xpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRSZXNvdXJjZU5hbWVzTGlzdChyZXNvdXJjZUFzc2V0TGlzdCk7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0LCBleHBlY3RlZEFzc2V0TmFtZXNMaXN0LCAiRWxlbWVudCIpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXNzZXRMaXN0QXVkaXQoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCX0KKworCS8vIDIgcmVzb3VyY2VzIGhhcyB0aGUgc2FtZSBjYXRlZ29yeSBhbmQgZGlmZmVyZW50IHN1YmNhdGVnb3J5CisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFzc2V0QnlTcGVjaWZpZWRDYXRlZ29yeUFuZFN1YkNhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0FCU1RSQUNULmdldENhdGVnb3J5KCksIHN1YkNhdGVnb3J5RmlsdGVyS2V5ICsgIj0iICsgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVC5nZXRTdWJDYXRlZ29yeSgpIH07CisJCS8vIFN0cmluZ1tdIGZpbHRlcjIgPSB7Y2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKworCQkvLyBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX05FVFdPUktfRUxFTUVOVFMuZ2V0Q2F0ZWdvcnkoKSwKKwkJLy8gc3ViQ2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKworCQkvLyBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX05FVFdPUktfRUxFTUVOVFMuZ2V0U3ViQ2F0ZWdvcnkoKX07CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZEFzc2V0TmFtZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRiwgTm9ybWF0aXZlVHlwZXNFbnVtLkNPTVBVVEUsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHJlc291cmNlMS5nZXROYW1lKCkpOworCQlSZXNvdXJjZSByZXNvdXJjZTIgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGLCBOb3JtYXRpdmVUeXBlc0VudW0uREFUQUJBU0UsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfTkVUV09SS19FTEVNRU5UUywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgZmlsdGVyKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJTGlzdDxTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU+IHJlc291cmNlQXNzZXRMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZUFzc2V0TGlzdChhc3NldFJlc3BvbnNlKTsKKwkJTGlzdDxTdHJpbmc+IGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZU5hbWVzTGlzdChyZXNvdXJjZUFzc2V0TGlzdCk7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0LCBleHBlY3RlZEFzc2V0TmFtZXNMaXN0LCAiRWxlbWVudCIpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXNzZXRMaXN0QXVkaXQoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBc3NldEJ5U3BlY2lmaWVkU3ViQ2F0ZWdvcnlBbmRDYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSBmaWx0ZXIgPSB7IHN1YkNhdGVnb3J5RmlsdGVyS2V5ICsgIj0iICsgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19EQVRBQkFTRS5nZXRTdWJDYXRlZ29yeSgpLCBjYXRlZ29yeUZpbHRlcktleSArICI9IiArIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfREFUQUJBU0UuZ2V0Q2F0ZWdvcnkoKSwgfTsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkQXNzZXROYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZTEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVSZXNvdXJjZXNCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeShSZXNvdXJjZVR5cGVFbnVtLlZGLCBOb3JtYXRpdmVUeXBlc0VudW0uQ09NUFVURSwgUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19BQlNUUkFDVCwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlUmVzb3VyY2VzQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoUmVzb3VyY2VUeXBlRW51bS5WRiwgTm9ybWF0aXZlVHlwZXNFbnVtLkRBVEFCQVNFLCBSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0RBVEFCQVNFLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChyZXNvdXJjZTIuZ2V0TmFtZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgZmlsdGVyKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJTGlzdDxTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU+IHJlc291cmNlQXNzZXRMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZUFzc2V0TGlzdChhc3NldFJlc3BvbnNlKTsKKwkJTGlzdDxTdHJpbmc+IGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZU5hbWVzTGlzdChyZXNvdXJjZUFzc2V0TGlzdCk7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0LCBleHBlY3RlZEFzc2V0TmFtZXNMaXN0LCAiRWxlbWVudCIpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXNzZXRMaXN0QXVkaXQoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCX0KKworCS8vIEZhaWx1cmUKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQXNzZXRDYXRlZ29yeU5vdEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSBmaWx0ZXIgPSB7IGNhdGVnb3J5RmlsdGVyS2V5ICsgIj0iICsgIk5vdEV4aXN0aW5nQ2F0ZWdvcnkiIH07CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRDb21wb25lbnRMaXN0QnlBc3NldFR5cGUodHJ1ZSwgQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIGZpbHRlcik7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIGFzc2V0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBhc3NldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFzc2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KHJlc291cmNlS2V5LCBjYXRlZ29yeUZpbHRlcktleSwgIk5vdEV4aXN0aW5nQ2F0ZWdvcnkiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLCBhc3NldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXNzZXRMaXN0QXVkaXQoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRTVEFUVVMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRERVNDKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcykpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNULmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFzc2V0U3ViQ2F0ZWdvcnlOb3RFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gZmlsdGVyID0geyBjYXRlZ29yeUZpbHRlcktleSArICI9IiArIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QuZ2V0Q2F0ZWdvcnkoKSwgc3ViQ2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyAiTm90RXhpc3RpbmdTdWJDYXRlZ29yeSIgfTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgZmlsdGVyKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfU1VCX0NBVEVHT1JZX05PVF9GT1VORF9GT1JfQ0FURUdPUlkubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCBhc3NldFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgYXNzZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBhc3NldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgiUmVzb3VyY2UiLCAiTm90RXhpc3RpbmdTdWJDYXRlZ29yeSIsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLkdFTkVSSUNfQUJTVFJBQ1QuZ2V0Q2F0ZWdvcnkoKSk7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9OT1RfRk9VTkRfRk9SX0NBVEVHT1JZLm5hbWUoKSwgdmFyaWFibGVzLCBhc3NldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXNzZXRMaXN0QXVkaXQoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRTVEFUVVMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRERVNDKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcykpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNULmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFzc2V0Q2F0ZWdvcnlOb3RFeGlzdHNTdWJDYXRlZ29yeUV4aXN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSBmaWx0ZXIgPSB7IHN1YkNhdGVnb3J5RmlsdGVyS2V5ICsgIj0iICsgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX0dFVEVXQVkuZ2V0U3ViQ2F0ZWdvcnkoKSwgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyAiTm90RXhpc3RpbmdDYXRlZ29yeSIgfTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgZmlsdGVyKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5ELm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgYXNzZXRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGFzc2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgYXNzZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QocmVzb3VyY2VLZXksIGNhdGVnb3J5RmlsdGVyS2V5LCAiTm90RXhpc3RpbmdDYXRlZ29yeSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXMsIGFzc2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRBc3NldExpc3RBdWRpdChBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNUKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRSRVNPVVJDRV9VUkwoQXNzZXRSZXN0VXRpbHMuYnVpbGRVcmxXaXRoRmlsdGVyKGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuZ2V0UkVTT1VSQ0VfVVJMKCksIGZpbHRlcikpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LnNldFNUQVRVUyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LnNldERFU0MoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LCBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QuZ2V0TmFtZSgpLCBudWxsKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQXNzZXRJbnZhbGlkRmlsdGVyS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgc3ViQ2F0ZWdvcnlGaWx0ZXJLZXkgKyAiMT0iICsgUmVzb3VyY2VDYXRlZ29yeUVudW0uTkVUV09SS19MMl8zX0dFVEVXQVkuZ2V0U3ViQ2F0ZWdvcnkoKSwgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyAiTm90RXhpc3RpbmdDYXRlZ29yeSIgfTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgZmlsdGVyKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJTFRFUl9LRVkubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCBhc3NldFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgYXNzZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBhc3NldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChzdWJDYXRlZ29yeUZpbHRlcktleSArICIxIiwgIlsiICsgc3ViQ2F0ZWdvcnlGaWx0ZXJLZXkgKyAiLCAiICsgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiXSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfRklMVEVSX0tFWS5uYW1lKCksIHZhcmlhYmxlcywgYXNzZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LnNldFJFU09VUkNFX1VSTChBc3NldFJlc3RVdGlscy5idWlsZFVybFdpdGhGaWx0ZXIoZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5nZXRSRVNPVVJDRV9VUkwoKSwgZmlsdGVyKSk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0U1RBVFVTKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0REVTQyhBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNFUlZJQ0UKKwkvLyBTdWNjZXNzCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRCeVNwZWNpZmllZENhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFkuZ2V0VmFsdWUoKSB9OworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRBc3NldE5hbWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCVNlcnZpY2Ugc2VydmljZTEgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVTZXJ2aWNlQnlDYXRlZ29yeShTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFksIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHNlcnZpY2UxLmdldE5hbWUoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRDb21wb25lbnRMaXN0QnlBc3NldFR5cGUodHJ1ZSwgQXNzZXRUeXBlRW51bS5TRVJWSUNFUywgZmlsdGVyKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJTGlzdDxTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU+IHNlcnZpY2VBc3NldExpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlQXNzZXRMaXN0KGFzc2V0UmVzcG9uc2UpOworCQlMaXN0PFN0cmluZz4gZ2V0QWN0dWFsQXNzZXROYW1lc0xpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlTmFtZXNMaXN0KHNlcnZpY2VBc3NldExpc3QpOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhnZXRBY3R1YWxBc3NldE5hbWVzTGlzdCwgZXhwZWN0ZWRBc3NldE5hbWVzTGlzdCwgIkVsZW1lbnQiKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRCeVNwZWNpZmllZENhdGVnb3J5QW5kRGlzdHJpYnV0aW9uU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFkuZ2V0VmFsdWUoKSwgZGlzdHJpYnV0aW9uU3RhdHVzRmlsdGVyS2V5ICsgIj0iICsgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEIH07CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZEFzc2V0TmFtZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLCBBcnRpZmFjdFR5cGVFbnVtLk9USEVSLCB0cnVlKTsKKworCQlTZXJ2aWNlIHNlcnZpY2UxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlU2VydmljZUJ5Q2F0ZWdvcnkoU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChzZXJ2aWNlMS5nZXROYW1lKCkpOworCQlTZXJ2aWNlIHNlcnZpY2UyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlU2VydmljZUJ5Q2F0ZWdvcnkoU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydGlmYWN0RGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgc2VydmljZTIuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSk7CisJCXNlcnZpY2UyID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChzZXJ2aWNlMi5nZXROYW1lKCkpOworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50TGlzdEJ5QXNzZXRUeXBlKHRydWUsIEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIGZpbHRlcik7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCUxpc3Q8U2VydmljZUFzc2V0U3RydWN0dXJlPiBzZXJ2aWNlQXNzZXRMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZUFzc2V0TGlzdChhc3NldFJlc3BvbnNlKTsKKwkJTGlzdDxTdHJpbmc+IGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZU5hbWVzTGlzdChzZXJ2aWNlQXNzZXRMaXN0KTsKKwkJVXRpbHMuY29tcGFyZUFycmF5TGlzdHMoZ2V0QWN0dWFsQXNzZXROYW1lc0xpc3QsIGV4cGVjdGVkQXNzZXROYW1lc0xpc3QsICJFbGVtZW50Iik7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRBc3NldExpc3RBdWRpdChBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLCBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LnNldFJFU09VUkNFX1VSTChBc3NldFJlc3RVdGlscy5idWlsZFVybFdpdGhGaWx0ZXIoZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5nZXRSRVNPVVJDRV9VUkwoKSwgZmlsdGVyKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LCBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QuZ2V0TmFtZSgpLCBudWxsKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VBc3NldEJ5RGlzdHJpYnV0aW9uU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgZGlzdHJpYnV0aW9uU3RhdHVzRmlsdGVyS2V5ICsgIj0iICsgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEIH07CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZEFzc2V0TmFtZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdERldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk9USEVSLCBBcnRpZmFjdFR5cGVFbnVtLk9USEVSLCB0cnVlKTsKKworCQlTZXJ2aWNlIHNlcnZpY2UxID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlU2VydmljZUJ5Q2F0ZWdvcnkoU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChzZXJ2aWNlMS5nZXROYW1lKCkpOworCQlTZXJ2aWNlIHNlcnZpY2UyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlU2VydmljZUJ5Q2F0ZWdvcnkoU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlSZXN0UmVzcG9uc2UgYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydGlmYWN0RGV0YWlscywgRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSwgc2VydmljZTIuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSk7CisJCXNlcnZpY2UyID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlTZXJ2aWNlUmVzdFV0aWxzLmFwcHJvdmVTZXJ2aWNlRGlzdHJpYnV0aW9uKHNlcnZpY2UyLmdldFVuaXF1ZUlkKCksIFVzZXJSb2xlRW51bS5HT1ZFUk5PUi5nZXRVc2VySWQoKSk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRDb21wb25lbnRMaXN0QnlBc3NldFR5cGUodHJ1ZSwgQXNzZXRUeXBlRW51bS5TRVJWSUNFUywgZmlsdGVyKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJTGlzdDxTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU+IHNlcnZpY2VBc3NldExpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlQXNzZXRMaXN0KGFzc2V0UmVzcG9uc2UpOworCQlMaXN0PFN0cmluZz4gZ2V0QWN0dWFsQXNzZXROYW1lc0xpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlTmFtZXNMaXN0KHNlcnZpY2VBc3NldExpc3QpOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhnZXRBY3R1YWxBc3NldE5hbWVzTGlzdCwgZXhwZWN0ZWRBc3NldE5hbWVzTGlzdCwgIkVsZW1lbnQiKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCX0KKworCS8vIEZhaWx1cmUKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VBc3NldENhdGVnb3J5Tm90RXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyAiTm90RXhpc3RpbmdDYXRlZ29yeSIgfTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLCBmaWx0ZXIpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCBhc3NldFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgYXNzZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBhc3NldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChzZXJ2aWNlS2V5LCBjYXRlZ29yeUZpbHRlcktleSwgIk5vdEV4aXN0aW5nQ2F0ZWdvcnkiKTsKKwkJRXJyb3JWYWxpZGF0aW9uVXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLCBhc3NldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0QXNzZXRMaXN0QXVkaXQoQXNzZXRUeXBlRW51bS5TRVJWSUNFUywgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNUKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRSRVNPVVJDRV9VUkwoQXNzZXRSZXN0VXRpbHMuYnVpbGRVcmxXaXRoRmlsdGVyKGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuZ2V0UkVTT1VSQ0VfVVJMKCksIGZpbHRlcikpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LnNldFNUQVRVUyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LnNldERFU0MoQXVkaXRWYWxpZGF0aW9uVXRpbHMuYnVpbGRBdWRpdERlc2NyaXB0aW9uKGVycm9ySW5mbywgdmFyaWFibGVzKSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LCBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QuZ2V0TmFtZSgpLCBudWxsKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VBc3NldEludmFsaWREaXN0cmlidXRpb25TdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gZmlsdGVyID0geyBkaXN0cmlidXRpb25TdGF0dXNGaWx0ZXJLZXkgKyAiPSIgKyAiTm90RXhpc3RpbmdEaXN0cmlidXRpb25TdGF0dXMiIH07CisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50TGlzdEJ5QXNzZXRUeXBlKHRydWUsIEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIGZpbHRlcik7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORC5uYW1lKCkpOworCisJCWFzc2VydE5vdE51bGwoImNoZWNrIHJlc3BvbnNlIG9iamVjdCBpcyBub3QgbnVsbCBhZnRlciBjcmVhdGUgcmVzb3VjZSIsIGFzc2V0UmVzcG9uc2UpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBlcnJvciBjb2RlIGV4aXN0cyBpbiByZXNwb25zZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBhc3NldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGVycm9ySW5mby5nZXRDb2RlKCksIGFzc2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCisJCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KHNlcnZpY2VLZXksIGRpc3RyaWJ1dGlvblN0YXR1c0ZpbHRlcktleSwgIk5vdEV4aXN0aW5nRGlzdHJpYnV0aW9uU3RhdHVzIik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywgYXNzZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRTVEFUVVMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRERVNDKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcykpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNULmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRDYXRlZ29yeUV4aXRzRGlzdHJpYnV0aW9uU3RhdHVzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSBmaWx0ZXIgPSB7IGNhdGVnb3J5RmlsdGVyS2V5ICsgIj0iICsgU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLmdldFZhbHVlKCksIGRpc3RyaWJ1dGlvblN0YXR1c0ZpbHRlcktleSArICI9IiArICJOb3RFeGlzdGluZ0Rpc3RyaWJ1dGlvblN0YXR1cyIgfTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldENvbXBvbmVudExpc3RCeUFzc2V0VHlwZSh0cnVlLCBBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLCBmaWx0ZXIpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gRXJyb3JWYWxpZGF0aW9uVXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQubmFtZSgpKTsKKworCQlhc3NlcnROb3ROdWxsKCJjaGVjayByZXNwb25zZSBvYmplY3QgaXMgbm90IG51bGwgYWZ0ZXIgY3JlYXRlIHJlc291Y2UiLCBhc3NldFJlc3BvbnNlKTsKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgZXJyb3IgY29kZSBleGlzdHMgaW4gcmVzcG9uc2UgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgYXNzZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBjcmVhdGUgcmVzb3VyY2UiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBhc3NldFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKworCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdChzZXJ2aWNlS2V5LCBkaXN0cmlidXRpb25TdGF0dXNGaWx0ZXJLZXksICJOb3RFeGlzdGluZ0Rpc3RyaWJ1dGlvblN0YXR1cyIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXMsIGFzc2V0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRBc3NldExpc3RBdWRpdChBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLCBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QpOworCQlleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LnNldFJFU09VUkNFX1VSTChBc3NldFJlc3RVdGlscy5idWlsZFVybFdpdGhGaWx0ZXIoZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5nZXRSRVNPVVJDRV9VUkwoKSwgZmlsdGVyKSk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0U1RBVFVTKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0REVTQyhBdWRpdFZhbGlkYXRpb25VdGlscy5idWlsZEF1ZGl0RGVzY3JpcHRpb24oZXJyb3JJbmZvLCB2YXJpYWJsZXMpKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0U2VydmljZUFzc2V0Q2F0ZWdvcnlOb3RFeGlzdHNEaXN0cmlidXRpb25TdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gZmlsdGVyID0geyBkaXN0cmlidXRpb25TdGF0dXNGaWx0ZXJLZXkgKyAiPSIgKyBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQsIGNhdGVnb3J5RmlsdGVyS2V5ICsgIj0iICsgIk5vdEV4aXN0aW5nQ2F0ZWdvcnkiIH07CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRDb21wb25lbnRMaXN0QnlBc3NldFR5cGUodHJ1ZSwgQXNzZXRUeXBlRW51bS5TRVJWSUNFUywgZmlsdGVyKTsKKwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IEVycm9yVmFsaWRhdGlvblV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5ELm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgYXNzZXRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGFzc2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgYXNzZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3Qoc2VydmljZUtleSwgY2F0ZWdvcnlGaWx0ZXJLZXksICJOb3RFeGlzdGluZ0NhdGVnb3J5Iik7CisJCUVycm9yVmFsaWRhdGlvblV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywgYXNzZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRTVEFUVVMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRERVNDKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcykpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNULmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRJbnZhbGlkRmlsdGVyS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGZpbHRlciA9IHsgZGlzdHJpYnV0aW9uU3RhdHVzRmlsdGVyS2V5ICsgIjE9IiArIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCwgY2F0ZWdvcnlGaWx0ZXJLZXkgKyAiPSIgKyBTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFkuZ2V0VmFsdWUoKSB9OworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0Q29tcG9uZW50TGlzdEJ5QXNzZXRUeXBlKHRydWUsIEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIGZpbHRlcik7CisJCUVycm9ySW5mbyBlcnJvckluZm8gPSBFcnJvclZhbGlkYXRpb25VdGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUxURVJfS0VZLm5hbWUoKSk7CisKKwkJYXNzZXJ0Tm90TnVsbCgiY2hlY2sgcmVzcG9uc2Ugb2JqZWN0IGlzIG5vdCBudWxsIGFmdGVyIGNyZWF0ZSByZXNvdWNlIiwgYXNzZXRSZXNwb25zZSk7CisJCWFzc2VydE5vdE51bGwoImNoZWNrIGVycm9yIGNvZGUgZXhpc3RzIGluIHJlc3BvbnNlIGFmdGVyIGNyZWF0ZSByZXNvdXJjZSIsIGFzc2V0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgY3JlYXRlIHJlc291cmNlIiwgZXJyb3JJbmZvLmdldENvZGUoKSwgYXNzZXRSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoZGlzdHJpYnV0aW9uU3RhdHVzRmlsdGVyS2V5ICsgIjEiLCAiWyIgKyBjYXRlZ29yeUZpbHRlcktleSArICIsICIgKyBkaXN0cmlidXRpb25TdGF0dXNGaWx0ZXJLZXkgKyAiXSIpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLklOVkFMSURfRklMVEVSX0tFWS5uYW1lKCksIHZhcmlhYmxlcywgYXNzZXRSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVCk7CisJCWV4cGVjdGVkQXNzZXRMaXN0QXVkaXQuc2V0UkVTT1VSQ0VfVVJMKEFzc2V0UmVzdFV0aWxzLmJ1aWxkVXJsV2l0aEZpbHRlcihleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LmdldFJFU09VUkNFX1VSTCgpLCBmaWx0ZXIpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRTVEFUVVMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRBc3NldExpc3RBdWRpdC5zZXRERVNDKEF1ZGl0VmFsaWRhdGlvblV0aWxzLmJ1aWxkQXVkaXREZXNjcmlwdGlvbihlcnJvckluZm8sIHZhcmlhYmxlcykpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9GSUxURVJFRF9BU1NFVF9MSVNULmdldE5hbWUoKSwgbnVsbCk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXh0ZXJuYWxBcGlzL0dldFNwZWNpZmljQXNzZXRNZXRhZGF0YVNlcnZsZXQuamF2YSBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leHRlcm5hbEFwaXMvR2V0U3BlY2lmaWNBc3NldE1ldGFkYXRhU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDMwNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXh0ZXJuYWxBcGlzL0dldFNwZWNpZmljQXNzZXRNZXRhZGF0YVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDc3MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmV4dGVybmFsQXBpczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkFzc2V0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGlzdHJpYnV0aW9uU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VBc3NldFN0cnVjdHVyZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VBc3NldFN0cnVjdHVyZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5MaWZlQ3ljbGVTdGF0ZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZEV4dGVybmFsQXVkaXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQXRvbWljT3BlcmF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuQXNzZXRSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5CYXNlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuTGlmZWN5Y2xlUmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMudmFsaWRhdGlvbi5BdWRpdFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy52YWxpZGF0aW9uLkVycm9yVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgR2V0U3BlY2lmaWNBc3NldE1ldGFkYXRhU2VydmxldCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoR2V0QXNzZXRTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlAUnVsZQorCXB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJcHVibGljIEdldFNwZWNpZmljQXNzZXRNZXRhZGF0YVNlcnZsZXQoKSB7CisJCXN1cGVyKG5hbWUsIEdldFNwZWNpZmljQXNzZXRNZXRhZGF0YVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdENvbnN1bWVyKHRydWUpOworCX0KKworCS8vIGdldCBzcGVjaWZpYyBhc3NldCBtZXRhZGF0YQorCisJLy8gUmVzb3VyY2UKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQXNzZXRNZXRhZGF0YVN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldEFzc2V0TWV0YWRhdGFCeUFzc2V0VHlwZUFuZFV1aWQodHJ1ZSwgQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsCisJCQkJcmVzb3VyY2VWRi5nZXRVVUlEKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhhc3NldFJlc3BvbnNlKTsKKworCQlSZXNvdXJjZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgcmVzb3VyY2VBc3NldE1ldGFkYXRhID0gQXNzZXRSZXN0VXRpbHMuZ2V0UmVzb3VyY2VBc3NldE1ldGFkYXRhKGFzc2V0UmVzcG9uc2UpOworCQlBc3NldFJlc3RVdGlscy5yZXNvdXJjZU1ldGFkYXRhVmFsaWRhdGlvcihyZXNvdXJjZUFzc2V0TWV0YWRhdGEsIHJlc291cmNlVkYsIEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdEFzc2V0TWV0YWRhdGFBdWRpdChBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgcmVzb3VyY2VWRik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfQVNTRVRfTUVUQURBVEEuZ2V0TmFtZSgpLCBudWxsKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFJlc291cmNlQXNzZXRNZXRhZGF0YVdpdGhSZXNvdXJjZUluc3RhbmNlc1N1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlMiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UyLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCXJlc291cmNlVkYgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoCisJCQkJUmVzb3VyY2VSZXN0VXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VWRi5nZXRVbmlxdWVJZCgpKS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRBc3NldE1ldGFkYXRhQnlBc3NldFR5cGVBbmRVdWlkKHRydWUsIEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLAorCQkJCXJlc291cmNlVkYuZ2V0VVVJRCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJUmVzb3VyY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlIHJlc291cmNlQXNzZXRNZXRhZGF0YSA9IEFzc2V0UmVzdFV0aWxzLmdldFJlc291cmNlQXNzZXRNZXRhZGF0YShhc3NldFJlc3BvbnNlKTsKKwkJQXNzZXRSZXN0VXRpbHMucmVzb3VyY2VNZXRhZGF0YVZhbGlkYXRpb3IocmVzb3VyY2VBc3NldE1ldGFkYXRhLCByZXNvdXJjZVZGLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUyk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRBc3NldE1ldGFkYXRhQXVkaXQoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIHJlc291cmNlVkYpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwKKwkJCQlBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0FTU0VUX01FVEFEQVRBLmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFzc2V0TWV0YWRhdGFXaXRoTm9uQ2VydGlmaWVkUmVzb3VyY2VJbnN0YW5jZXNTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVJlc291cmNlIHJlc291cmNlMiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZTIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlMyA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UzLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QsIHRydWUpCisJCQkJLmdldExlZnQoKTsKKworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlMiwgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlMywgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUpOworCisJCS8vIGNlcnRpZnkgcmVzb3VyY2UyIGFuZCBhZGQgdG8gVkYoVkYgd2l0aCByZXNvdXJjZTIgMC4xLCAxLjAgYW5kIDEuMQorCQkvLyB2ZXJzaW9ucykKKwkJcmVzb3VyY2UyID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZTIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UyLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCXJlc291cmNlMiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlMiwgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUpOworCQlyZXNvdXJjZVZGID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKAorCQkJCVJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlVkYuZ2V0VW5pcXVlSWQoKSkuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0QXNzZXRNZXRhZGF0YUJ5QXNzZXRUeXBlQW5kVXVpZCh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywKKwkJCQlyZXNvdXJjZVZGLmdldFVVSUQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCVJlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSByZXNvdXJjZUFzc2V0TWV0YWRhdGEgPSBBc3NldFJlc3RVdGlscy5nZXRSZXNvdXJjZUFzc2V0TWV0YWRhdGEoYXNzZXRSZXNwb25zZSk7CisJCUFzc2V0UmVzdFV0aWxzLnJlc291cmNlTWV0YWRhdGFWYWxpZGF0aW9yKHJlc291cmNlQXNzZXRNZXRhZGF0YSwgcmVzb3VyY2VWRiwgQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0QXNzZXRNZXRhZGF0YUF1ZGl0KEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCByZXNvdXJjZVZGKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsCisJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQS5nZXROYW1lKCksIG51bGwpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBc3NldE1ldGFkYXRhV2l0aFJlc291cmNlSW5zdGFuY2VzVmZJblN1Ym1pdEZvclRlc3RpbmdTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVJlc291cmNlIHJlc291cmNlMiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZTIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlMyA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UzLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UyLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UzLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisKKwkJLy8gY2VydGlmeSByZXNvdXJjZTIgYW5kIGFkZCB0byBWRihWRiB3aXRoIHJlc291cmNlMiAxLjAsIDIuMCBhbmQgMy4wCisJCS8vIHZlcnNpb25zKQorCQlyZXNvdXJjZTIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZTIsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJcmVzb3VyY2UyID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZTIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UyLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCXJlc291cmNlVkYgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZJQ0FUSU9OUkVRVUVTVCwgdHJ1ZSkKKwkJCQkuZ2V0TGVmdCgpOworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0QXNzZXRNZXRhZGF0YUJ5QXNzZXRUeXBlQW5kVXVpZCh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywKKwkJCQlyZXNvdXJjZVZGLmdldFVVSUQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCVJlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSByZXNvdXJjZUFzc2V0TWV0YWRhdGEgPSBBc3NldFJlc3RVdGlscy5nZXRSZXNvdXJjZUFzc2V0TWV0YWRhdGEoYXNzZXRSZXNwb25zZSk7CisJCUFzc2V0UmVzdFV0aWxzLnJlc291cmNlTWV0YWRhdGFWYWxpZGF0aW9yKHJlc291cmNlQXNzZXRNZXRhZGF0YSwgcmVzb3VyY2VWRiwgQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0QXNzZXRNZXRhZGF0YUF1ZGl0KEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCByZXNvdXJjZVZGKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsCisJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQS5nZXROYW1lKCksIG51bGwpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBc3NldE1ldGFkYXRhV2l0aFJlc291cmNlSW5zdGFuY2VzVmZJblN0YXJ0Q2VydGlmaWNhdGlvblN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlMiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlSZXNvdXJjZSByZXNvdXJjZTMgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQywgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzb3VyY2UzID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZTMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZTIsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZTMsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKworCQkvLyBjZXJ0aWZ5IHJlc291cmNlMiBhbmQgYWRkIHRvIFZGKFZGIHdpdGggcmVzb3VyY2UyIDEuMCwgMi4wIGFuZCAzLjAKKwkJLy8gdmVyc2lvbnMpCisJCXJlc291cmNlMiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlMiwgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUpOworCQlyZXNvdXJjZTIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZTIsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJcmVzb3VyY2VWRiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLlNUQVJUQ0VSVElGSUNBVElPTiwgdHJ1ZSkKKwkJCQkuZ2V0TGVmdCgpOworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0QXNzZXRNZXRhZGF0YUJ5QXNzZXRUeXBlQW5kVXVpZCh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywKKwkJCQlyZXNvdXJjZVZGLmdldFVVSUQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCVJlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSByZXNvdXJjZUFzc2V0TWV0YWRhdGEgPSBBc3NldFJlc3RVdGlscy5nZXRSZXNvdXJjZUFzc2V0TWV0YWRhdGEoYXNzZXRSZXNwb25zZSk7CisJCUFzc2V0UmVzdFV0aWxzLnJlc291cmNlTWV0YWRhdGFWYWxpZGF0aW9yKHJlc291cmNlQXNzZXRNZXRhZGF0YSwgcmVzb3VyY2VWRiwgQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0QXNzZXRNZXRhZGF0YUF1ZGl0KEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCByZXNvdXJjZVZGKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsCisJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQS5nZXROYW1lKCksIG51bGwpOworCX0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VBc3NldE1ldGFkYXRhV2l0aFJlc291cmNlSW5zdGFuY2VzQ2VydGlmaWVkVkZTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVJlc291cmNlIHJlc291cmNlMiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZTIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlMyA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UzLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UyLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UzLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisKKwkJLy8gY2VydGlmeSByZXNvdXJjZTIgYW5kIGFkZCB0byBWRihWRiB3aXRoIHJlc291cmNlMiAxLjAsIDIuMCBhbmQgMy4wCisJCS8vIHZlcnNpb25zKQorCQlyZXNvdXJjZTIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZTIsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJcmVzb3VyY2UyID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZTIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2UyLCByZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCXJlc291cmNlVkYgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRBc3NldE1ldGFkYXRhQnlBc3NldFR5cGVBbmRVdWlkKHRydWUsIEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLAorCQkJCXJlc291cmNlVkYuZ2V0VVVJRCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJUmVzb3VyY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlIHJlc291cmNlQXNzZXRNZXRhZGF0YSA9IEFzc2V0UmVzdFV0aWxzLmdldFJlc291cmNlQXNzZXRNZXRhZGF0YShhc3NldFJlc3BvbnNlKTsKKwkJQXNzZXRSZXN0VXRpbHMucmVzb3VyY2VNZXRhZGF0YVZhbGlkYXRpb3IocmVzb3VyY2VBc3NldE1ldGFkYXRhLCByZXNvdXJjZVZGLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUyk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRBc3NldE1ldGFkYXRhQXVkaXQoQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMsIHJlc291cmNlVkYpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwKKwkJCQlBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0FTU0VUX01FVEFEQVRBLmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRSZXNvdXJjZUFzc2V0TWV0YWRhdGFXaXRoTm9uQ2VydGlmaWVkUmVzb3VyY2VJbnN0YW5jZXNBbmRBcnRpZmFjdHNTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVJlc291cmNlIHJlc291cmNlMiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZTIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UzID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRkMsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlMyA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UzLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGSUNBVElPTlJFUVVFU1QsIHRydWUpCisJCQkJLmdldExlZnQoKTsKKworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlMiwgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlMywgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uVkVORE9SX0xJQ0VOU0UsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5BUFBDX0NPTkZJRywgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlLAorCQkJCXRydWUpOworCQlyZXNvdXJjZVZGID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKAorCQkJCVJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlVkYuZ2V0VW5pcXVlSWQoKSkuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0QXNzZXRNZXRhZGF0YUJ5QXNzZXRUeXBlQW5kVXVpZCh0cnVlLCBBc3NldFR5cGVFbnVtLlJFU09VUkNFUywKKwkJCQlyZXNvdXJjZVZGLmdldFVVSUQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCVJlc291cmNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSByZXNvdXJjZUFzc2V0TWV0YWRhdGEgPSBBc3NldFJlc3RVdGlscy5nZXRSZXNvdXJjZUFzc2V0TWV0YWRhdGEoYXNzZXRSZXNwb25zZSk7CisJCUFzc2V0UmVzdFV0aWxzLnJlc291cmNlTWV0YWRhdGFWYWxpZGF0aW9yKHJlc291cmNlQXNzZXRNZXRhZGF0YSwgcmVzb3VyY2VWRiwgQXNzZXRUeXBlRW51bS5SRVNPVVJDRVMpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0QXNzZXRNZXRhZGF0YUF1ZGl0KEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCByZXNvdXJjZVZGKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsCisJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQS5nZXROYW1lKCksIG51bGwpOworCX0KKworCS8vIEltcG9ydCBDU0FSCisKKwkvLyBTZXJ2aWNlCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRNZXRhZGF0YVN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTZXJ2aWNlIHNlcnZpY2UgPSBBdG9taWNPcGVyYXRpb25VdGlscy5jcmVhdGVEZWZhdWx0U2VydmljZShVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0QXNzZXRNZXRhZGF0YUJ5QXNzZXRUeXBlQW5kVXVpZCh0cnVlLCBBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLAorCQkJCXNlcnZpY2UuZ2V0VVVJRCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJU2VydmljZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgc2VydmljZUFzc2V0TWV0YWRhdGEgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlQXNzZXRNZXRhZGF0YShhc3NldFJlc3BvbnNlKTsKKwkJQXNzZXRSZXN0VXRpbHMuc2VydmljZU1ldGFkYXRhVmFsaWRhdGlvcihzZXJ2aWNlQXNzZXRNZXRhZGF0YSwgc2VydmljZSwgQXNzZXRUeXBlRW51bS5TRVJWSUNFUyk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRBc3NldE1ldGFkYXRhQXVkaXQoQXNzZXRUeXBlRW51bS5TRVJWSUNFUywgc2VydmljZSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfQVNTRVRfTUVUQURBVEEuZ2V0TmFtZSgpLCBudWxsKTsKKwl9CisKKwlAVGVzdCAvLyAoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIGdldFNlcnZpY2VBc3NldE1ldGFkYXRhV2l0aFJlc291cmNlSW5zdGFuY2VzU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCVJlc291cmNlIHJlc291cmNlVkYgPSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jcmVhdGVSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZVZGID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VWRiwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJc2VydmljZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihTZXJ2aWNlUmVzdFV0aWxzCisJCQkJLmdldFNlcnZpY2Uoc2VydmljZS5nZXRVbmlxdWVJZCgpLCBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKS5nZXRSZXNwb25zZSgpLAorCQkJCVNlcnZpY2UuY2xhc3MpOworCisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0QXNzZXRNZXRhZGF0YUJ5QXNzZXRUeXBlQW5kVXVpZCh0cnVlLCBBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLAorCQkJCXNlcnZpY2UuZ2V0VVVJRCgpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJU2VydmljZURldGFpbGVkQXNzZXRTdHJ1Y3R1cmUgc2VydmljZUFzc2V0TWV0YWRhdGEgPSBBc3NldFJlc3RVdGlscy5nZXRTZXJ2aWNlQXNzZXRNZXRhZGF0YShhc3NldFJlc3BvbnNlKTsKKwkJQXNzZXRSZXN0VXRpbHMuc2VydmljZU1ldGFkYXRhVmFsaWRhdGlvcihzZXJ2aWNlQXNzZXRNZXRhZGF0YSwgc2VydmljZSwgQXNzZXRUeXBlRW51bS5TRVJWSUNFUyk7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRBc3NldE1ldGFkYXRhQXVkaXQoQXNzZXRUeXBlRW51bS5TRVJWSUNFUywgc2VydmljZSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfQVNTRVRfTUVUQURBVEEuZ2V0TmFtZSgpLCBudWxsKTsKKworCX0KKworCUBUZXN0IC8vIChlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgZ2V0U2VydmljZUFzc2V0TWV0YWRhdGFXaXRoTm9uQ2VydGlmaWVkUmVzb3VyY2VJbnN0YW5jZXNXaXRoQXJ0aWZhY3RzU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCisJCVNlcnZpY2Ugc2VydmljZSA9IEF0b21pY09wZXJhdGlvblV0aWxzLmNyZWF0ZURlZmF1bHRTZXJ2aWNlKFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VWRiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uVkVORE9SX0xJQ0VOU0UsIHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJcmVzb3VyY2VWRiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGMiA9IEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNyZWF0ZVJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSkubGVmdCgpLnZhbHVlKCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLnVwbG9hZEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUcsIHJlc291cmNlVkYyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSwgdHJ1ZSk7CisJCXJlc291cmNlVkYyID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGMiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlVkYsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VWRjIsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlKTsKKwkJcmVzb3VyY2VWRiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZVZGLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCisJCS8vIHNlcnZpY2Ugd2l0aCAwLjEsIDAuMSBhbmQgMS4wIFJJcyB2ZXJzaW9ucworCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKFNlcnZpY2VSZXN0VXRpbHMKKwkJCQkuZ2V0U2VydmljZShzZXJ2aWNlLmdldFVuaXF1ZUlkKCksIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpLmdldFJlc3BvbnNlKCksCisJCQkJU2VydmljZS5jbGFzcyk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRBc3NldE1ldGFkYXRhQnlBc3NldFR5cGVBbmRVdWlkKHRydWUsIEFzc2V0VHlwZUVudW0uU0VSVklDRVMsCisJCQkJc2VydmljZS5nZXRVVUlEKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhhc3NldFJlc3BvbnNlKTsKKworCQlTZXJ2aWNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSBzZXJ2aWNlQXNzZXRNZXRhZGF0YSA9IEFzc2V0UmVzdFV0aWxzLmdldFNlcnZpY2VBc3NldE1ldGFkYXRhKGFzc2V0UmVzcG9uc2UpOworCQlBc3NldFJlc3RVdGlscy5zZXJ2aWNlTWV0YWRhdGFWYWxpZGF0aW9yKHNlcnZpY2VBc3NldE1ldGFkYXRhLCBzZXJ2aWNlLCBBc3NldFR5cGVFbnVtLlNFUlZJQ0VTKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdEFzc2V0TWV0YWRhdGFBdWRpdChBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLCBzZXJ2aWNlKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsCisJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQS5nZXROYW1lKCksIG51bGwpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRNZXRhZGF0YVdpdGhDZXJ0aWZpZWRSZXNvdXJjZUluc3RhbmNlc0FuZEFydGlmYWN0c09uUklzQW5kU2VydmljZVN1Y2Nlc3MoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5WRU5ET1JfTElDRU5TRSwgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUsIHRydWUpOworCQlyZXNvdXJjZVZGID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCVJlc291cmNlIHJlc291cmNlVkYyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5BUFBDX0NPTkZJRywgcmVzb3VyY2VWRjIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJcmVzb3VyY2VWRjIgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlVkYyLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VWRiwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZVZGMiwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUpOworCQlyZXNvdXJjZVZGID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsIHRydWUpLmdldExlZnQoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9JTlZFTlRPUllfUFJPRklMRSwgcmVzb3VyY2VWRiwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpOworCQlyZXNvdXJjZVZGID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlVkYsIHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSk7CisKKwkJLy8gc2VydmljZSB3aXRoIHJlc291cmNlVkYgMS4wKDEgYXJ0KSwgMi4wKDIgYXJ0KSB2ZXJzaW9ucyBhbmQKKwkJLy8gcmVzb3VyY2VWRjIgMS4wKDEgYXJ0KSwgc2VydmljZSAxIGFydGlmYWN0IHZlcnNpb24KKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9JTlZFTlRPUllfUFJPRklMRSwgc2VydmljZSwKKwkJCQlVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUsIHRydWUpOworCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKFNlcnZpY2VSZXN0VXRpbHMKKwkJCQkuZ2V0U2VydmljZShzZXJ2aWNlLmdldFVuaXF1ZUlkKCksIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpLmdldFJlc3BvbnNlKCksCisJCQkJU2VydmljZS5jbGFzcyk7CisKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRBc3NldE1ldGFkYXRhQnlBc3NldFR5cGVBbmRVdWlkKHRydWUsIEFzc2V0VHlwZUVudW0uU0VSVklDRVMsCisJCQkJc2VydmljZS5nZXRVVUlEKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2Vzcyhhc3NldFJlc3BvbnNlKTsKKworCQlTZXJ2aWNlRGV0YWlsZWRBc3NldFN0cnVjdHVyZSBzZXJ2aWNlQXNzZXRNZXRhZGF0YSA9IEFzc2V0UmVzdFV0aWxzLmdldFNlcnZpY2VBc3NldE1ldGFkYXRhKGFzc2V0UmVzcG9uc2UpOworCQlBc3NldFJlc3RVdGlscy5zZXJ2aWNlTWV0YWRhdGFWYWxpZGF0aW9yKHNlcnZpY2VBc3NldE1ldGFkYXRhLCBzZXJ2aWNlLCBBc3NldFR5cGVFbnVtLlNFUlZJQ0VTKTsKKworCQkvLyBWYWxpZGF0ZSBhdWRpdCBtZXNzYWdlCisJCUV4cGVjdGVkRXh0ZXJuYWxBdWRpdCBleHBlY3RlZEFzc2V0TGlzdEF1ZGl0ID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdEFzc2V0TWV0YWRhdGFBdWRpdChBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLCBzZXJ2aWNlKTsKKwkJQXVkaXRWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVFeHRlcm5hbEF1ZGl0KGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQsCisJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9BU1NFVF9NRVRBREFUQS5nZXROYW1lKCksIG51bGwpOworCisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRNZXRhZGF0YVdpdGhSZXNvdXJjZUluc3RhbmNlc1NlcnZpY2VJblN1Ym1pdEZvclRlc3RpbmdTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gQXRvbWljT3BlcmF0aW9uVXRpbHMuY3JlYXRlRGVmYXVsdFNlcnZpY2UoVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKworCQlSZXNvdXJjZSByZXNvdXJjZVZGID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5WRU5ET1JfTElDRU5TRSwgcmVzb3VyY2VWRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLAorCQkJCXRydWUsIHRydWUpOworCQlyZXNvdXJjZVZGID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZVZGLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCVJlc291cmNlIHJlc291cmNlVkYyID0gQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY3JlYXRlUmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKS5sZWZ0KCkudmFsdWUoKTsKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMudXBsb2FkQXJ0aWZhY3RCeVR5cGUoQXJ0aWZhY3RUeXBlRW51bS5BUFBDX0NPTkZJRywgcmVzb3VyY2VWRjIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwKKwkJCQl0cnVlLCB0cnVlKTsKKwkJcmVzb3VyY2VWRiA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2VWRjIsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisKKwkJQXRvbWljT3BlcmF0aW9uVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbXBvbmVudENvbnRhaW5lcihyZXNvdXJjZVZGLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIHRydWUpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29tcG9uZW50Q29udGFpbmVyKHJlc291cmNlVkYyLCBzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsCisJCQkJdHJ1ZSk7CisJCXJlc291cmNlVkYgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFLCByZXNvdXJjZVZGLAorCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSk7CisJCXJlc291cmNlVkYgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlVkYsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCUF0b21pY09wZXJhdGlvblV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db21wb25lbnRDb250YWluZXIocmVzb3VyY2VWRiwgc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCB0cnVlKTsKKworCQkvLyBzZXJ2aWNlIHdpdGggcmVzb3VyY2VWRiAxLjAoMSBhcnQpLCAyLjAoMiBhcnQpIHZlcnNpb25zIGFuZAorCQkvLyByZXNvdXJjZVZGMiAxLjAoMSBhcnQpLCBzZXJ2aWNlIDEgYXJ0aWZhY3QgdmVyc2lvbgorCQlBdG9taWNPcGVyYXRpb25VdGlscy51cGxvYWRBcnRpZmFjdEJ5VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFLCBzZXJ2aWNlLAorCQkJCVVzZXJSb2xlRW51bS5ERVNJR05FUiwgdHJ1ZSwgdHJ1ZSk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldEFzc2V0TWV0YWRhdGFCeUFzc2V0VHlwZUFuZFV1aWQodHJ1ZSwgQXNzZXRUeXBlRW51bS5TRVJWSUNFUywKKwkJCQlzZXJ2aWNlLmdldFVVSUQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCVNlcnZpY2VEZXRhaWxlZEFzc2V0U3RydWN0dXJlIHNlcnZpY2VBc3NldE1ldGFkYXRhID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZUFzc2V0TWV0YWRhdGEoYXNzZXRSZXNwb25zZSk7CisJCUFzc2V0UmVzdFV0aWxzLnNlcnZpY2VNZXRhZGF0YVZhbGlkYXRpb3Ioc2VydmljZUFzc2V0TWV0YWRhdGEsIHNlcnZpY2UsIEFzc2V0VHlwZUVudW0uU0VSVklDRVMpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0QXNzZXRNZXRhZGF0YUF1ZGl0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIHNlcnZpY2UpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwKKwkJCQlBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0FTU0VUX01FVEFEQVRBLmdldE5hbWUoKSwgbnVsbCk7CisJfQorCisJQFRlc3QgLy8gKGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCBnZXRTZXJ2aWNlQXNzZXRNZXRhZGF0YVNlcnZpY2VOb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBzZXJ2aWNlVXVpZCA9ICJub3RFeGlzdGluZ1NlcnZpY2VVdWlkIjsKKwkJUmVzdFJlc3BvbnNlIGFzc2V0UmVzcG9uc2UgPSBBc3NldFJlc3RVdGlscy5nZXRBc3NldE1ldGFkYXRhQnlBc3NldFR5cGVBbmRVdWlkKHRydWUsIEFzc2V0VHlwZUVudW0uU0VSVklDRVMsCisJCQkJc2VydmljZVV1aWQpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJQXJyYXlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXZhcmlhYmxlcy5hZGQoc2VydmljZVV1aWQpOworCQlFcnJvclZhbGlkYXRpb25VdGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywKKwkJCQlhc3NldFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCX0KKworCS8vIEFkZCB0byBzZXJ2aWNlIFZGIGluc3RhbmNlIGltcG9ydGVkIGZyb20gQ1NBUgorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRGaWx0ZXJlZFJlc291cmNlQXNzZXRTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkQXNzZXROYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkKKwkJCQkuZ2V0RGVmYXVsdFJlc291cmNlKFJlc291cmNlQ2F0ZWdvcnlFbnVtLkFQUExJQ0FUSU9OX0w0X0FQUF9TRVJWRVIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiUmVzb3VyY2UxIik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCVJlc291cmNlIHJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJZXhwZWN0ZWRBc3NldE5hbWVzTGlzdC5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfQk9SREVSKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlJlc291cmNlMiIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLm5hbWUoKSk7CisJCWNyZWF0ZVJlc291cmNlID0gUmVzb3VyY2VSZXN0VXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2UpOworCQlyZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLnBhcnNlVG9PYmplY3RVc2luZ01hcHBlcihjcmVhdGVSZXNvdXJjZS5nZXRSZXNwb25zZSgpLCBSZXNvdXJjZS5jbGFzcyk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tPVVQsIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCisJCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZShSZXNvdXJjZUNhdGVnb3J5RW51bS5HRU5FUklDX0lORlJBU1RSVUNUVVJFKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoIlJlc291cmNlMyIpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJY3JlYXRlUmVzb3VyY2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsCisJCQkJRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFVzZXIoVXNlclJvbGVFbnVtLkRFU0lHTkVSKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tDcmVhdGVSZXNwb25zZShjcmVhdGVSZXNvdXJjZSk7CisJCXJlc291cmNlID0gUmVzcG9uc2VQYXJzZXIucGFyc2VUb09iamVjdFVzaW5nTWFwcGVyKGNyZWF0ZVJlc291cmNlLmdldFJlc3BvbnNlKCksIFJlc291cmNlLmNsYXNzKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfRklSRVdBTEwpOworCQlyZXNvdXJjZURldGFpbHMuc2V0TmFtZSgiUmVzb3VyY2U0Iik7CisJCXJlc291cmNlRGV0YWlscy5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQljcmVhdGVSZXNvdXJjZSA9IFJlc291cmNlUmVzdFV0aWxzLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVJlc291cmNlKTsKKwkJcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlUmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSwgUmVzb3VyY2UuY2xhc3MpOworCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUocmVzb3VyY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXJlc291cmNlID0gKFJlc291cmNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShyZXNvdXJjZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHJlc291cmNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlleHBlY3RlZEFzc2V0TmFtZXNMaXN0LmFkZChyZXNvdXJjZS5nZXROYW1lKCkpOworCisJCWxvZy5kZWJ1ZygiNCByZXNvdXJjZXMgY3JlYXRlZCIpOworCQlTdHJpbmcgcXVlcnkgPSAiY2F0ZWdvcnk9QXBwbGljYXRpb24lMjBMNCUyQiI7CisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0RmlsdGVyZWRDb21wb25lbnRMaXN0KEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCBxdWVyeSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFzc2V0UmVzcG9uc2UpOworCisJCUxpc3Q8UmVzb3VyY2VBc3NldFN0cnVjdHVyZT4gcmVzb3VyY2VBc3NldExpc3QgPSBBc3NldFJlc3RVdGlscy5nZXRSZXNvdXJjZUFzc2V0TGlzdChhc3NldFJlc3BvbnNlKTsKKwkJTGlzdDxTdHJpbmc+IGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0UmVzb3VyY2VOYW1lc0xpc3QocmVzb3VyY2VBc3NldExpc3QpOworCQlVdGlscy5jb21wYXJlQXJyYXlMaXN0cyhnZXRBY3R1YWxBc3NldE5hbWVzTGlzdCwgZXhwZWN0ZWRBc3NldE5hbWVzTGlzdCwgIkVsZW1lbnQiKTsKKworCQlBc3NldFJlc3RVdGlscy5jaGVja1Jlc291cmNlVHlwZUluT2JqZWN0TGlzdChyZXNvdXJjZUFzc2V0TGlzdCwgUmVzb3VyY2VUeXBlRW51bS5WRik7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldERlZmF1bHRGaWx0ZXJlZEFzc2V0TGlzdEF1ZGl0KEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCAiPyIgKyBxdWVyeSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRGaWx0ZXJlZFJlc291cmNlQXNzZXRDYXRlZ29yeU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHF1ZXJ5ID0gImNhdGVnb3J5PUFwcGxpY2F0aW9uJTIwTDMlMkIiOworCQlSZXN0UmVzcG9uc2UgYXNzZXRSZXNwb25zZSA9IEFzc2V0UmVzdFV0aWxzLmdldEZpbHRlcmVkQ29tcG9uZW50TGlzdChBc3NldFR5cGVFbnVtLlJFU09VUkNFUywgcXVlcnkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrRXJyb3JSZXNwb25zZShhc3NldFJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORCwgInJlc291cmNlIiwKKwkJCQkiY2F0ZWdvcnkiLCAiQXBwbGljYXRpb24gTDMrIik7CisKKwkJLy8gVmFsaWRhdGUgYXVkaXQgbWVzc2FnZQorCQlFeHBlY3RlZEV4dGVybmFsQXVkaXQgZXhwZWN0ZWRBc3NldExpc3RBdWRpdCA9IEVsZW1lbnRGYWN0b3J5CisJCQkJLmdldEZpbHRlcmVkQXNzZXRMaXN0QXVkaXRDYXRlZ29yeU5vdEZvdW5kKEFzc2V0VHlwZUVudW0uUkVTT1VSQ0VTLCAiPyIgKyBxdWVyeSwgIkFwcGxpY2F0aW9uIEwzKyIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUV4dGVybmFsQXVkaXQoZXhwZWN0ZWRBc3NldExpc3RBdWRpdCwKKwkJCQlBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QuZ2V0TmFtZSgpLCBudWxsKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0RmlsdGVyZWRTZXJ2aWNlQXNzZXRTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkQXNzZXROYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldEFydGlmYWN0QnlUeXBlKEFydGlmYWN0VHlwZUVudW0uT1RIRVIsCisJCQkJQXJ0aWZhY3RUeXBlRW51bS5PVEhFUiwgdHJ1ZSk7CisKKwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlzZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJTZXJ2aWNlMSIpOworCQlSZXN0UmVzcG9uc2UgY3JlYXRlU2VydmljZSA9IFNlcnZpY2VSZXN0VXRpbHMuY3JlYXRlU2VydmljZShzZXJ2aWNlRGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpKTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja0NyZWF0ZVJlc3BvbnNlKGNyZWF0ZVNlcnZpY2UpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKworCQlzZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJTZXJ2aWNlMiIpOworCQljcmVhdGVTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJUmVzdFJlc3BvbnNlIGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSA9IEFydGlmYWN0UmVzdFV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSgKKwkJCQlhcnRpZmFjdERldGFpbHMsIEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUiksIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJCUJhc2VSZXN0VXRpbHMuY2hlY2tTdWNjZXNzKGFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdFRvU2VydmljZSk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKworCQlTZXJ2aWNlUmVxRGV0YWlscyBjZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhzZXJ2aWNlKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZURpc3RyaWJ1dGlvblN0YXR1cyhjZXJ0aWZ5U2VydmljZSwgY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5HT1ZFUk5PUiksIG51bGwsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5kaXN0cmlidXRlU2VydmljZShzZXJ2aWNlLCBmYWxzZSk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKworCQlzZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJTZXJ2aWNlMyIpOworCQljcmVhdGVTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9TZXJ2aWNlKGFydGlmYWN0RGV0YWlscywKKwkJCQlFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpLCBzZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrU3VjY2VzcyhhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3RUb1NlcnZpY2UpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DRVJUSUZZLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNFUlRJRlksIHRydWUpLmdldExlZnQoKTsKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0VSVElGWSwgdHJ1ZSkuZ2V0TGVmdCgpOworCQljZXJ0aWZ5U2VydmljZSA9IG5ldyBTZXJ2aWNlUmVxRGV0YWlscyhzZXJ2aWNlKTsKKwkJTGlmZWN5Y2xlUmVzdFV0aWxzLmNoYW5nZURpc3RyaWJ1dGlvblN0YXR1cyhjZXJ0aWZ5U2VydmljZSwgY2VydGlmeVNlcnZpY2UuZ2V0VmVyc2lvbigpLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5HT1ZFUk5PUiksIG51bGwsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQpOworCQlBdG9taWNPcGVyYXRpb25VdGlscy5kaXN0cmlidXRlU2VydmljZShzZXJ2aWNlLCBmYWxzZSk7CisJCWV4cGVjdGVkQXNzZXROYW1lc0xpc3QuYWRkKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKworCQlzZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJTZXJ2aWNlNCIpOworCQljcmVhdGVTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLSU4sIHRydWUpLmdldExlZnQoKTsKKworCQlzZXJ2aWNlRGV0YWlscy5zZXROYW1lKCJTZXJ2aWNlNSIpOworCQljcmVhdGVTZXJ2aWNlID0gU2VydmljZVJlc3RVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VEZXRhaWxzLAorCQkJCUVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5ERVNJR05FUikpOworCQlCYXNlUmVzdFV0aWxzLmNoZWNrQ3JlYXRlUmVzcG9uc2UoY3JlYXRlU2VydmljZSk7CisJCXNlcnZpY2UgPSBSZXNwb25zZVBhcnNlci5wYXJzZVRvT2JqZWN0VXNpbmdNYXBwZXIoY3JlYXRlU2VydmljZS5nZXRSZXNwb25zZSgpLCBTZXJ2aWNlLmNsYXNzKTsKKwkJc2VydmljZSA9IChTZXJ2aWNlKSBBdG9taWNPcGVyYXRpb25VdGlscworCQkJCS5jaGFuZ2VDb21wb25lbnRTdGF0ZShzZXJ2aWNlLCBVc2VyUm9sZUVudW0uREVTSUdORVIsIExpZmVDeWNsZVN0YXRlc0VudW0uQ0hFQ0tJTiwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS09VVCwgdHJ1ZSkuZ2V0TGVmdCgpOworCQlzZXJ2aWNlID0gKFNlcnZpY2UpIEF0b21pY09wZXJhdGlvblV0aWxzCisJCQkJLmNoYW5nZUNvbXBvbmVudFN0YXRlKHNlcnZpY2UsIFVzZXJSb2xlRW51bS5ERVNJR05FUiwgTGlmZUN5Y2xlU3RhdGVzRW51bS5DSEVDS0lOLCB0cnVlKS5nZXRMZWZ0KCk7CisJCXNlcnZpY2UgPSAoU2VydmljZSkgQXRvbWljT3BlcmF0aW9uVXRpbHMKKwkJCQkuY2hhbmdlQ29tcG9uZW50U3RhdGUoc2VydmljZSwgVXNlclJvbGVFbnVtLkRFU0lHTkVSLCBMaWZlQ3ljbGVTdGF0ZXNFbnVtLkNIRUNLT1VULCB0cnVlKS5nZXRMZWZ0KCk7CisKKwkJU3RyaW5nIHF1ZXJ5ID0gImRpc3RyaWJ1dGlvblN0YXR1cz1EaXN0cmlidXRlZCI7CisJCVJlc3RSZXNwb25zZSBhc3NldFJlc3BvbnNlID0gQXNzZXRSZXN0VXRpbHMuZ2V0RmlsdGVyZWRDb21wb25lbnRMaXN0KEFzc2V0VHlwZUVudW0uU0VSVklDRVMsIHF1ZXJ5KTsKKwkJQmFzZVJlc3RVdGlscy5jaGVja1N1Y2Nlc3MoYXNzZXRSZXNwb25zZSk7CisKKwkJTGlzdDxTZXJ2aWNlQXNzZXRTdHJ1Y3R1cmU+IHJlc291cmNlQXNzZXRMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZUFzc2V0TGlzdChhc3NldFJlc3BvbnNlKTsKKwkJTGlzdDxTdHJpbmc+IGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0ID0gQXNzZXRSZXN0VXRpbHMuZ2V0U2VydmljZU5hbWVzTGlzdChyZXNvdXJjZUFzc2V0TGlzdCk7CisJCVV0aWxzLmNvbXBhcmVBcnJheUxpc3RzKGdldEFjdHVhbEFzc2V0TmFtZXNMaXN0LCBleHBlY3RlZEFzc2V0TmFtZXNMaXN0LCAiRWxlbWVudCIpOworCisJCS8vIFZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2UKKwkJRXhwZWN0ZWRFeHRlcm5hbEF1ZGl0IGV4cGVjdGVkQXNzZXRMaXN0QXVkaXQgPSBFbGVtZW50RmFjdG9yeQorCQkJCS5nZXREZWZhdWx0RmlsdGVyZWRBc3NldExpc3RBdWRpdChBc3NldFR5cGVFbnVtLlNFUlZJQ0VTLCAiPyIgKyBxdWVyeSk7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRXh0ZXJuYWxBdWRpdChleHBlY3RlZEFzc2V0TGlzdEF1ZGl0LAorCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVC5nZXROYW1lKCksIG51bGwpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvcG9zdC9JbnN0YWxsLmphdmEgYi9hc2RjLXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvcG9zdC9JbnN0YWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0OTRmZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9wb3N0L0luc3RhbGwuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMucG9zdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdyYXBoQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKKworcHVibGljIGNsYXNzIEluc3RhbGwgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKworCQlpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09IDApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IG9yZy5vcGVuZWNvbXAuc2RjLnBvc3QuSW5zdGFsbCBwYXRoX3RvX3RpdGFuLnByb3BlcnRpZXMiKTsKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisJCVN0cmluZyB0aXRhblByb3BzRmlsZSA9IGFyZ3NbMF07CisKKwkJaWYgKCFpc0ZpbGVFeGlzdHModGl0YW5Qcm9wc0ZpbGUpKSB7CisJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJfQorCisJCWlmICghY3JlYXRlVGl0YW5TY2hlbWEodGl0YW5Qcm9wc0ZpbGUpKSB7CisJCQlTeXN0ZW0uZXhpdCgzKTsKKwkJfQorCisJCVN5c3RlbS5leGl0KDApOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY3JlYXRlVGl0YW5TY2hlbWEoU3RyaW5nIHRpdGFuUHJvcHNGaWxlKSB7CisJCVRpdGFuR3JhcGhDbGllbnQgdGl0YW5HcmFwaENsaWVudCA9IG5ldyBUaXRhbkdyYXBoQ2xpZW50KCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHRpdGFuR3JhcGhDbGllbnQuY3JlYXRlR3JhcGgodGl0YW5Qcm9wc0ZpbGUsIHRydWUpOworCQlpZiAoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0sgPT0gc3RhdHVzKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGFuIHNjaGVtYSAsaW5kZXhlcyBhbmQgZGVmYXVsdCB2YWx1ZXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkJIlByb2JsZW0gd2hpbGUgY3JlYXRpbmcgdGl0YW4gc2NoZW1hICxpbmRleGVzIGFuZCBkZWZhdWx0IHZhbHVlcy4gKCIgKyBzdGF0dXMubmFtZSgpICsgIikiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGaWxlRXhpc3RzKFN0cmluZyB0aXRhblByb3BzRmlsZSkgeworCQlGaWxlIGYgPSBuZXcgRmlsZSh0aXRhblByb3BzRmlsZSk7CisJCWlmICghZi5leGlzdHMoKSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKHRpdGFuUHJvcHNGaWxlICsgIiBub3QgZm91bmQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXMgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxM2U5MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDM0IEBACisjIERlZmluZSB0aGUgcm9vdCBsb2dnZXIgd2l0aCBhcHBlbmRlciBmaWxlCitsb2c0ai5yb290TG9nZ2VyID0gSU5GTywgRklMRSwgc3Rkb3V0CisKKyMgRGVmaW5lIHRoZSBmaWxlIGFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5GSUxFPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuRklMRS5GaWxlPSR7dGFyZ2V0bG9nfWxvZ3MvY2ktbG9nLm91dAorCisjIERlZmluZSB0aGUgbGF5b3V0IGZvciBmaWxlIGFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5GSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLkZJTEUubGF5b3V0LmNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICU1cCBbJTEwY10gOiAlbSVuCisKKyMgU2V0IHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBiZWZvcmUgcm9sbG92ZXIKK2xvZzRqLmFwcGVuZGVyLkZJTEUubWF4RmlsZVNpemU9NU1CCisKKyMgU2V0IHRoZSB0aGUgYmFja3VwIGluZGV4Citsb2c0ai5hcHBlbmRlci5GSUxFLm1heEJhY2t1cEluZGV4PTEwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpcmVjdCBsb2cgbWVzc2FnZXMgdG8gc3Rkb3V0Citsb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5UYXJnZXQ9U3lzdGVtLm91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKKyNsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICUtNXAgJWN7MX06JUwgLSAlbSVuCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICU1cCAlMTBjOiVMIC0gJW0lbgorCitsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHk9SU5GTworbG9nNGoubG9nZ2VyLmNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmRpc2tzdG9yYWdlLmNhc3NhbmRyYS5DYXNzYW5kcmFUcmFuc2FjdGlvbj1JTkZPLCBGSUxFLCBzdGRvdXQKKworbG9nNGoubG9nZ2VyLm9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzPUlORk8sIEZJTEUsIHN0ZG91dAorbG9nNGouYWRkaXRpdml0eS5vcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscz1mYWxzZQorCisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLXBhY2thZ2VzLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWEzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2VzOgorIC0gb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5nZW5lcmFsCisgLSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnVzZXIKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvcGVydHkKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlCisgLSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlCisgLSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuYXJ0aWZhY3RzCisgLSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmltcG9ydHMKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuY2F0ZWdvcnkKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZGlzdHJpYnV0aW9uICAKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzMwODEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy55YW1sCkBAIC0wLDAgKzEsODggQEAKK291dHB1dEZvbGRlcjogdGFyZ2V0CityZXBvcnROYW1lOiBpbmRleC5odG1sCitjYXRhbG9nQmVIb3N0OiBiZWhvc3QKK2NhdGFsb2dGZUhvc3Q6IGZlaG9zdAorZXNIb3N0OiBlc2hvc3QKK2Rpc3JpYnV0aW9uQ2xpZW50SG9zdDogZGlzQ2xpZW50CitjYXRhbG9nRmVQb3J0OiA4MTgxCitjYXRhbG9nQmVQb3J0OiA4MDgwCitkaXNyaWJ1dGlvbkNsaWVudFBvcnQ6IDgxODEKK2VzUG9ydDogOTIwMAorbmVvSG9zdDogbmVvSG9zdAorbmVvUG9ydDogNzQ3NAorbmVvREJ1c2VybmFtZTogbmVvNGoJCituZW9EQnBhc3N3b3JkOiAxMjM0NTYKKworcmVzb3VyY2VDb25maWdEaXI6IHNyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cworY29tcG9uZW50c0NvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMKK2ltcG9ydFJlc291cmNlQ29uZmlnRGlyOiAuLi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvY2FwYWJpbGl0eS10eXBlcworaW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMKK2Vycm9yQ29uZmlndXJhdGlvbkZpbGU6IC4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKK2NvbmZpZ3VyYXRpb25GaWxlOiAuLi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvY29uZmlndXJhdGlvbi55YW1sCitpbXBvcnRUeXBlc0NvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFR5cGVzVGVzdAorCisKK3RpdGFuUHJvcGVydGllc0ZpbGU6IHNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RpdGFuLnByb3BlcnRpZXMKK2Nhc3NhbmRyYUhvc3Q6IDEyNy4wLjAuMQorY2Fzc2FuZHJhQXV0aGVudGljYXRlOiBmYWxzZQorY2Fzc2FuZHJhVXNlcm5hbWU6IGtva28KK2Nhc3NhbmRyYVBhc3N3b3JkOiBib2JvCitjYXNzYW5kcmFTc2w6IGZhbHNlCitjYXNzYW5kcmFUcnVzdHN0b3JlUGF0aCA6IC9wYXRoL3BhdGgKK2Nhc3NhbmRyYVRydXN0c3RvcmVQYXNzd29yZCA6IDEyMzEyMworY2Fzc2FuZHJhQXVkaXRLZXlTcGFjZTogc2RjQXVkaXQKK2Nhc3NhbmRyYUFydGlmYWN0S2V5U3BhY2U6IHNkY0FydGlmYWN0CisKKworc3RvcE9uQ2xhc3NGYWlsdXJlOiBmYWxzZQorCisjTGlzdCBvZiBub24tYWJzdHJhY3QgcmVzb3VyY2VzIHRvIGtlZXAgZHVyaW5nIHRpdGFuIGNsZWFudXAgYmV0d2VlbiB0ZXN0cworI09ubHkgMS4wIHZlcnNpb24gd2lsbCBiZSBrZXB0CityZXNvdXJjZXNOb3RUb0RlbGV0ZToKKyAgICAgLSBDb21wdXRlCisgICAgIC0gRGF0YWJhc2UKKyAgICAgLSBPYmplY3RTdG9yYWdlCisgICAgIC0gQmxvY2tTdG9yYWdlCisgICAgIC0gTG9hZEJhbGFuY2VyCisgICAgIC0gUG9ydAorICAgICAtIE5ldHdvcmsKKyAgICAgLSBSb290CisgICAgIC0gQ29udGFpbmVyQXBwbGljYXRpb24KKyAgICAgLSBDb250YWluZXJSdW50aW1lCisgICAgIC0gREJNUworICAgICAtIFNvZnR3YXJlQ29tcG9uZW50CisgICAgIC0gV2ViQXBwbGljYXRpb24KKyAgICAgLSBXZWJTZXJ2ZXIKKyAgICAgLSBDaW5kZXJWb2x1bWUKKyAgICAgLSBDb250cmFpbFZpcnR1YWxOZXR3b3JrCisgICAgIC0gTmV1dHJvbk5ldAorICAgICAtIE5ldXRyb25Qb3J0CisgICAgIC0gTm92YVNlcnZlcgorICAgICAtIEFic3RyYWN0U3Vic3RpdHV0ZQorICAgICAtIENvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlCisgICAgIC0gQ29udHJhaWxDb21wdXRlCisgICAgIC0gQ29udHJhaWxOZXR3b3JrUnVsZXMKKyAgICAgLSBDb250cmFpbFBvcnQKKyAgICAgLSBDb250cmFpbFYyTmV0d29ya1J1bGVzCisgICAgIC0gQ29udHJhaWxWMlZpcnR1YWxNYWNoaW5lSW50ZXJmYWNlCisgICAgIC0gQ29udHJhaWxWMlZpcnR1YWxOZXR3b3JrCisgICAgIC0gQ29udHJhaWxWaXJ0dWFsTmV0d29yaworICAgICAtIFZMIEVMSU5FCisgICAgIC0gU2VjdXJpdHlSdWxlcworICAgICAtIFZMCisKKyNSZXNvdXJjZSBjYXRlZ29yaWVzIHRvIGtlZXAgKGluY2x1ZGluZyBhbGwgdGhlaXIgc3ViY2F0ZWdvcmllcykKK3Jlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlOgorICAgICAtIEdlbmVyaWMKKyAgICAgLSBOZXR3b3JrIEwyLTMKKyAgICAgLSBOZXR3b3JrIEw0KworICAgICAtIEFwcGxpY2F0aW9uIEw0KworICAgICAtIE5ldHdvcmsgQ29ubmVjdGl2aXR5CisgICAgIC0gRGNhZUNvbXBvbmVudAorCisjU2VydmljZSBjYXRlZ29yaWVzIHRvIGtlZXAKK3NlcnZpY2VDYXRlZ29yaWVzTm90VG9EZWxldGU6CisgICAgIC0gTW9iaWxpdHkKKyAgICAgLSBOZXR3b3JrIEwxLTMKKyAgICAgLSBOZXR3b3JrIEw0KworICAgICAtIFZvSVAgQ2FsbCBDb250cm9sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90ZXN0bmdMaWZlQ3ljbGUueG1sIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90ZXN0bmdMaWZlQ3ljbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzkwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3Rlc3RuZ0xpZmVDeWNsZS54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIj4KKzxzdWl0ZSBuYW1lPSJsaWZlQ3ljbGUiIHBhcmFsbGVsPSJub25lIj4KKyAgPHRlc3QgbmFtZT0iVGVzdCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUxDU19jZXJpZmljYXRpb25DSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlUmVzb3VyY2VMQ1NUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTX1VuZG9DaGVja091dENJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VMQ1NfVW5kb0NoZWNrT3V0Q0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTX1N0YXJ0Q2VydGlmaWNhdGlvbkNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VMQ1NfQ2hlY2tpbkNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU19DaGVja091dENJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VDZXJ0V2l0aFJlc291cmNlSW5zdGFuY2VzIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuQ3Jvc3NDaGVja091dFRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5DZXJ0aWZ5VkZXaXRoTm90Q2VydFJJcyIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU19yZXF1ZXN0NENlckNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkNsZWFudXBJbnRlcm1lZGlhdGVSZW91cmNlcyIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VMQ1NfQ2hlY2tPdXRDSVQiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NfY2VyaWZpY2F0aW9uQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuQ2VydGlmeVNlcnZpY2VXaXRoTm90Q2VydFJJIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTX0NoZWNrSW5DSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlTENTX3JlcXVlc3Q0Q2VyQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTYmFzZVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlTENTX1N0YXJ0Q2VydGlmaWNhdGlvbkNJVGVzdCIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PiA8IS0tIFRlc3QgLS0+Cis8L3N1aXRlPiA8IS0tIGxpZmVDeWNsZSAtLT4KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvdGl0YW4ucHJvcGVydGllcyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvdGl0YW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmUxOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90aXRhbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOCBAQAorc3RvcmFnZS5iYWNrZW5kPWNhc3NhbmRyYQorI3N0b3JhZ2UuaG9zdG5hbWU9Y2Fzc2FuZHJhaG9zdAorc3RvcmFnZS5ob3N0bmFtZT1sb2NhbGhvc3QKK3N0b3JhZ2UucG9ydD05MTYwCisKK2NhY2hlLmRiLWNhY2hlID0gZmFsc2UKKworCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RydXN0c3RvcmUgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RydXN0c3RvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlYzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvdHJ1c3RzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9zY3JpcHRzL3N0YXJ0VGVzdC5zaCBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3NjcmlwdHMvc3RhcnRUZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2FkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9zY3JpcHRzL3N0YXJ0VGVzdC5zaApAQCAtMCwwICsxLDg4IEBACisjIS9iaW4vYmFzaAorCitmdW5jdGlvbiB1c2FnZSB7CisJZWNobyAiVXNhZ2U6ICQwIDxqYXIgZmlsZT4iCit9CisKK2Z1bmN0aW9uIGV4aXRPbkVycm9yKCkgeworICAgICAgICBpZiBbICQxIC1uZSAwIF0KKyAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIkZhaWxlZCBydW5uaW5nIHRhc2sgJDIiCisgICAgICAgICAgICAgICAgZXhpdCAyCisgICAgICAgIGZpCit9CisKK2lmIFsgJCMgLWx0IDEgXQordGhlbgorCXVzYWdlCisJZXhpdCAyCitmaQorCitDVVJSRU5UX0RJUj1gcHdkYAorQkFTRURJUj0kKGRpcm5hbWUgJDApCisKK2lmIFsgJHtCQVNFRElSOjA6MX0gPSAiLyIgXQordGhlbgorICAgICAgICBGVUxMX1BBVEg9JEJBU0VESVIKK2Vsc2UKKyAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworTE9HU19QUk9QX0ZJTEU9ZmlsZToke0ZVTExfUEFUSH0vY29uZi9sb2c0ai5wcm9wZXJ0aWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1RBUkdFVF9ESVI9JHtGVUxMX1BBVEh9L3RhcmdldAorQ09ORl9GSUxFPSR7RlVMTF9QQVRIfS9jb25mL3NkYy55YW1sCitERUJVRz10cnVlCitNYWluQ2xhc3M9b3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucnVuLlN0YXJ0VGVzdAorCitKQVJfRklMRT0kMQorU1VJVEVfRklMRT0kMgorCisjVEFSR0VUX0RJUj1gZWNobyAke1RBUkdFVF9ESVJ9IHwgc2VkICdzL1wvL1wvL2cnYAorI2VjaG8gJFRBUkdFVF9ESVIKKworVEVTVFNfRElSPS9vcHQvYXBwL3NkYy9jaS9yZXNvdXJjZXMvdGVzdHMKK0NPTVBPTkVOVFNfRElSPS9vcHQvYXBwL3NkYy9jaS9yZXNvdXJjZXMvY29tcG9uZW50cworCisjc2VkIC1pICdzI1wob3V0cHV0Rm9sZGVyOlwpLiojXDEgJyR7VEFSR0VUX0RJUn0nI2cnICRDT05GX0ZJTEUKKyNzZWQgLWkgJ3MjXChyZXNvdXJjZUNvbmZpZ0RpcjpcKS4qI1wxICcke1RFU1RTX0RJUn0nI2cnICRDT05GX0ZJTEUKKyNzZWQgLWkgJ3MjXChjb21wb25lbnRzQ29uZmlnRGlyOlwpLiojXDEgJyR7Q09NUE9ORU5UU19ESVJ9JyNnJyAkQ09ORl9GSUxFCitUQVJHRVRfTE9HX0RJUj0iJHtUQVJHRVRfRElSfS8iCisKKyMgbWtkaXIgLXAgJHtUQVJHRVRfRElSfQorI2lmIFsgLWQgJHtUQVJHRVRfRElSfSBdCisjdGhlbgorIyAgICAgcm0gLXJmICR7VEFSR0VUX0RJUn0vKgorI2V4aXRPbkVycm9yICQ/ICJGYWlsZWRfdG9fZGVsZXRlX3RhcmdldF9kaXIiCisjZmkKKworZGVidWdfcG9ydD04ODAwCisjSkFWQV9PUFRJT049Ii1qYXZhYWdlbnQ6L3Zhci90bXAvamFjb2NvL2xpYi9qYWNvY29hZ2VudC5qYXI9ZGVzdGZpbGU9amFjb2NvLWl0LmV4ZWMiCitKQVZBX09QVElPTj0iIgorY2FzZSAiJDIiIGluCisJLWRlYnVnKSBlY2hvICJEZWJ1ZyBtb2RlLCBMaXN0ZW4gb24gcG9ydCAkZGVidWdfcG9ydCI7IEpBVkFfT1BUSU9OPSItWGRlYnVnIC1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPSR7ZGVidWdfcG9ydH0iIDs7CisJIiIpIGVjaG8gIlN0YW5kYXJkIG1vZGUiOzsKKwkqKSBlY2hvICJVU0FHRTogc3RhcnRUZXN0LnNoIFstZGVidWddIjs7Citlc2FjCisKK2NtZD0iamF2YSAkSkFWQV9PUFRJT04gLURkaXNwbGF5RXhjZXB0aW9uPXRydWUgLUR0YXJnZXRsb2c9JHtUQVJHRVRfTE9HX0RJUn0gLURjb25maWcucmVzb3VyY2U9JHtDT05GX0ZJTEV9IC1EZGVidWc9JHtERUJVR30gLURsb2c0ai5jb25maWd1cmF0aW9uPSR7TE9HU19QUk9QX0ZJTEV9IC1jcCAkSkFSX0ZJTEUgJHtNYWluQ2xhc3N9ICRTVUlURV9GSUxFIiAKKworI2VjaG8gJGNtZAorI2NvbnNvbGU9YCRjbWRgCisKK2lmIFsgJERFQlVHID09ICJ0cnVlIiBdCit0aGVuCisJJGNtZAorZWxzZQorCSRjbWQgPj4gL2Rldi9udWxsCitmaSAKK3N0YXR1cz1gZWNobyAkP2AKKworCisKK2VjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgorZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMgc3RhdHVzIGlzICR7c3RhdHVzfSAjIyMjIyMjIyMjIyMjIyMjIyIgCitlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKworZXhpdCAkc3RhdHVzIAorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2FydGlmYWN0cy54bWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2FydGlmYWN0cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyMjliOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvYXJ0aWZhY3RzLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9IkFydGlmYWN0cyIgPgorCTx0ZXN0IG5hbWU9IkFydGlmYWN0cyI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuRG93bmxvYWRDb21wb25lbnRBcnQiIC8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5BcnRpZmFjdFNlcnZsZXRUZXN0IiAvPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuVmFsaWRhdGVIZWF0QXJ0RmllbGRzVHlwZXMiIC8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5QbGFjZUhvbGRlclZhbGlkYXRpb25zIiAvPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuVmFsaWRhdGVBcnRSZXNwb25zZSIgLz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5DcnVkQXJ0IiAvPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorPC9zdWl0ZT4gPCEtLSBBcnRpZmFjdHMgLS0+CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2NhdGVnb3J5LnhtbCBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvY2F0ZWdvcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTBiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2NhdGVnb3J5LnhtbApAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9ImNhdGVnb3J5IiA+CisgIDx0ZXN0IG5hbWU9IlRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuY2F0ZWdvcnkuQ2F0ZWdvcmllc1Rlc3RzIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5jYXRlZ29yeS5Hcm91cGluZ1Rlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5LlN1YkNhdGVnb3JpZXNUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+IDwhLS0gVGVzdCAtLT4KKzwvc3VpdGU+IDwhLS0gY2F0ZWdvcnkgLS0+CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2NpRnVsbC54bWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2NpRnVsbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3NzY3MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvY2lGdWxsLnhtbApAQCAtMCwwICsxLDIyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIj4KKzxzdWl0ZSBuYW1lPSJjaUZ1bGwiIGNvbmZpZ2ZhaWx1cmVwb2xpY3k9ImNvbnRpbnVlIiB2ZXJib3NlPSIyIj4KKwk8dGVzdCBuYW1lPSJDYXRlZ29yeSI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuY2F0ZWdvcnkuRWxlbWVudHNBcGlUZXN0IiAvPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuY2F0ZWdvcnkuQ2F0ZWdvcmllc1Rlc3RzIj4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iaW1wb3J0Q2F0ZWdvcmllcyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iZ2V0U2VydmljZUNhdGVnb3J5SGllcmFyY2h5U3VjY2Vzc0Zsb3ciIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5LkNhdGFsb2dEYXRhQXBpVGVzdCIgLz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5Lkdyb3VwaW5nVGVzdCIgPgorCQkJCTxtZXRob2RzPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJjcmVhdGVQcm9kdWN0R3JvdXBGb3JOb25FeGlzdGluZ0NhdGVnb3J5IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJjcmVhdGVQcm9kdWN0R3JvdXBGb3JOb25FeGlzdGluZ1N1bkNhdGVnb3J5IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJnZXRQcm9kdWN0Q2F0ZWdvcnlIaWVyYXJjaHlTdWNjZXNzRmxvdyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJCisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5jYXRlZ29yeS5TdWJDYXRlZ29yaWVzVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZVByb2R1Y3RTdWJDYXRlZ29yeUZvck5vbkV4aXN0aW5nQ2F0ZWdvcnkiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZVJlc291cmNlU3ViQ2F0ZWdvcnlGb3JOb25FeGlzdGluZ0NhdGVnb3J5IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJnZXRSZXNvdXJjZUNhdGVnb3J5SGllcmFyY2h5U3VjY2Vzc0Zsb3ciIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJPC9jbGFzc2VzPgorCTwvdGVzdD4gPCEtLSBUZXN0IC0tPgorCTx0ZXN0IG5hbWU9IkRpc3RyaWJ1dGlvbiI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5kaXN0cmlidXRpb24uQXV0aGFudGljYXRpb25UZXN0cyIgLz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZGlzdHJpYnV0aW9uLkRpc3RyaWJ1dGlvbkRvd25sb2FkQXJ0aWZhY3RUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3RfU2VydmljZVZlcnNpb25Ob3RGb3VuZCIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PiA8IS0tIFRlc3QgLS0+CisJPHRlc3QgbmFtZT0iR2VuZXJhbCI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5nZW5lcmFsLk1hbmFnZUVjb21wQ29uc3VtZXJDcmVkZW50aWFscyI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZUVjb21wQ3JlZGVudGlhbHNCeU5vRXhpc3RpbmdJVXNlciIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZ2VuZXJhbC5GZVByb3h5VGVzdCIgLz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmdlbmVyYWwuVXVpZFRlc3QiIC8+CisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+CisJPHRlc3QgbmFtZT0iUmVzb3VyY2UiPgorCQk8Y2xhc3Nlcz4KKwkJCTwhLS0gPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5TaW11bHRhbmVvdXNBcGlUZXN0IiAvPiAtLT4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UuQ29tcG9uZW50UmVsYXRpb25zaGlwSW5WZlRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJhc3NvY2lhdGVPbmVPZlR3b0NQc1RvVmxfVGhlbkRpc2NvY2NpYXRlIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJkaXNhc3NvY2lhdGVSZWxhdGlvbkluVmZOb3RGb3VuZCIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5VcGRhdGVSZXNvdXJjZU1ldGFkYXRhVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9IlVwZGF0ZVJlc291cmNlQ2F0ZWdvcnlfbmVnYXRpdmVGbG93IiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLlZGUmVzb3VyY2VJbnN0YW5jZU5hbWVDUlVEIi8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLlZmQ29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZUFsbEF0b21pY0luc3RhbmNlc1Rlc3RHZXRSZXFDYXBBUElfc3VjIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJjcmVhdGVWZmNJbnN0YW5jZV9Vc2VySWRJc0VtcHR5IiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5SZXNvdXJjZUFwaVRlc3QiIC8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLlZhbGlkYXRlRXh0ZW5kZWRWZkRhdGEiIC8+CisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+CisJPHRlc3QgbmFtZT0iUHJvZHVjdCI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RVbmRvQ2hlY2tvdXRUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0idW5kb0NoZWNrT3V0Tm90RXhpc3QiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5Qcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZVNlcnZpY2VJbnN0YW5jZU5hbWVJc051bGwiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5DaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25Ub05vbkV4aXNpdGluZ1NlcnZpY2VWZXJzaW9uIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdEdldEZvbGxvd2VkVGVzdCIgLz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5Qcm9kdWN0VG9zY2FZYW1sR2VuZXJhdGlvblRlc3QiIC8+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RDaGVja2luVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNoZWNrSW5Qcm9kdWN0Tm90RXhpc3QiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdENoZWNrb3V0VGVzdCIgLz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdENydWRUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0idXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uUmVtb3ZlU3BhY2VzRnJvbUJlZ2lubmluZyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0idXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uUmVtb3ZlU3BhY2VzRnJvbVRoZUVuZCIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0idXBkYXRlUHJvZHVjdERlc2NyaXB0aW9uVmFsaWRDaGFyYWN0ZXJzMDIiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5Qcm9kdWN0Q3JlYXRlV2l0aFZhbGlkYXRpb25zVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZVByb2R1Y3REZXNjcmlwdGlvblJlbW92ZVNwYWNlc0Zyb21CZWdpbm5pbmciIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZVByb2R1Y3REZXNjcmlwdGlvblJlbW92ZVNwYWNlc0Zyb21UaGVFbmQiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNyZWF0ZVByb2R1Y3REZXNjcmlwdGlvblZhbGlkQ2hhcmFjdGVyczAxIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJjcmVhdGVQcm9kdWN0RGVzY3JpcHRpb25WYWxpZENoYXJhY3RlcnMwMiIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCTx0ZXN0IG5hbWU9IlNlcnZpY2UiPgorCQk8Y2xhc3Nlcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5HZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvblRlc3QiIC8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuQ3JlYXRlU2VydmljZU1ldGFkYXRhQXBpVGVzdCIgLz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5SZXFDYXBPY2N1cnJlbmNlc1Rlc3QiIC8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuQ2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXR1c0FwaVRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJhcHByb3ZlQ2VydGlmaWVkU2VydmljZV9ieURlc2lnbmVyIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJhcHByb3ZlQ2VydGlmaWVkU2VydmljZV9ieU9wcyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iYXBwcm92ZUNlcnRpZmllZFNlcnZpY2VfYnlUZXN0ZXIiIC8+CisJCQkJCTxleGNsdWRlCisJCQkJCQluYW1lPSJkaXN0cmlidXRpb25TdGF0dXNDaGFuZ2VfYXBwcm92ZV9SZWplY3RfQXBycm92ZUJ5c2RuY0FkbWluRGV0YWlscyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0icmVqZWN0Q2VydGlmaWVkU2VydmljZV9ieURlc2lnbmVyIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJyZWplY3RDZXJ0aWZpZWRTZXJ2aWNlX2J5T3BzIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJyZWplY3RDZXJ0aWZpZWRTZXJ2aWNlX2J5VGVzdGVyIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJyZWplY3RDZXJ0aWZpZWRTZXJ2aWNlX2J5c2RuY0FkbWluRGV0YWlscyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0icmVqZWN0Q2VydGlmaWVkU2VydmljZV9ieXNkbmNHb3Zlcm5vckRlYXRhaWxzIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJyZWplY3ROb3RDZXJ0aWZpZWRTZXJ2aWNlX2NoZWNrZWRpbiIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0icmVqZWN0Tm90Q2VydGlmaWVkU2VydmljZV9jaGVja2VvdXQiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9InJlamVjdE5vdENlcnRpZmllZFNlcnZpY2VfaW5Qcm9ncmVzcyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0icmVqZWN0Tm90Q2VydGlmaWVkU2VydmljZV9yZWFkeUZvckNlciIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0icmVqZWN0U2VydmljZU5vdEZvdW5kIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuU2VydmljZUNvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJhc3NvY2lhdGVBZnRlckNoZWNrb3V0QWxsSW5zdGFuY2VzVGVzdCIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iYXNzb2NpYXRlQWZ0ZXJEZWxldGluZ1Jlc291cmNlVGVzdCIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iYXNzb2NpYXRlRGlzc29jaWF0ZVR3b1ZGcyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iYXNzb2NpYXRlSW5zdGFuY2VzSW5Ud29TZXJ2aWNlVmVyc2lvbnNUZXN0IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJhc3NvY2lhdGVOb3RDb21waXRhYmxlUmVxQ2FwVGVzdCIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iYXNzb2NpYXRlT25jZUFnYWluRXhpc3RpbmdSZWxhdGlvblRlc3QiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VUb1Jlc291cmNlSW5zdGFuY2VOb3RGb3VuZFRlc3QiIC8+CisJCQkJCTxleGNsdWRlCisJCQkJCQluYW1lPSJhc3NvY2lhdGVUd29SZWxhdGlvbnNfQ2hlY2tpbkNoZWNrb3V0X0Rpc3NvaWNhdGVPbmVSZWxhdGlvbkluU2Vjb25kVmVyc2lvbiIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVdpdGhFbXB0eVVzZXJJZFRlc3QiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImRlbGV0ZU5vdEZvdW5kUmVzb3VyY2VJbnN0YW5jZVRlc3QiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImRlbGV0ZVJlc291cmNlSW5zdGFuY2VXaXRoRW1wdHlVc2VySWRUZXN0IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJkaXNzb2NpYXRlT25jZUFnYWluVGVzdCIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iZGlzc29jaWF0ZVJlbGF0aW9uTm90Rm91bmRUZXN0IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJkaXNzb2ljYXRlUmVsYXRpb25XaGlsZUluc3RhbmNlTm90Rm91bmQiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImRpc3NvaWNhdGVXaXRoRW1wdHlVc2VySWRzSGVhZGVyVGVzdCIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0icmVsYXRpb25EZWxldGVkQWZ0ZXJEZWxldGluZ1Jlc291cmNlSW5zdGFuY2VUZXN0IiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuVXBkYXRlU2VydmljZU1ldGFkYXRhVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxleGNsdWRlIG5hbWU9ImNhdGVnb3J5VmFsaWRhdGlvblRlc3Q2IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJjYXRlZ29yeVZhbGlkYXRpb25UZXN0NyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iZGVzY3JpcHRpb25WYWxpZGF0aW9uVGVzdDExIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJkZXNjcmlwdGlvblZhbGlkYXRpb25UZXN0MTIiIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9ImRlc2NyaXB0aW9uVmFsaWRhdGlvblRlc3QxMyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0iZGVzY3JpcHRpb25WYWxpZGF0aW9uVGVzdDciIC8+CisJCQkJCTxleGNsdWRlIG5hbWU9InNlcnZpY2VOYW1lVmFsaWRhdGlvblRlc3QxNyIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0idXBkYXRlQ2VydGlmaWVkU2VydmljZSIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0idXBkYXRlQ2hlY2tvdXRDZXJ0aWZpZWRTZXJ2aWNlIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJ1cGRhdGVTZXJ2aWNlQnlNZXRob2RfZGVsZXRlIiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJ1cGRhdGVTZXJ2aWNlQnlNZXRob2RfZ2V0IiAvPgorCQkJCQk8ZXhjbHVkZSBuYW1lPSJ1cGRhdGVTZXJ2aWNlQnlNZXRob2RfcG9zdCIgLz4KKwkJCQkJPGV4Y2x1ZGUgbmFtZT0idXBkYXRlU2VydmljZU5vdEV4aXN0IiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuR2V0QWxsU2VydmljZVZlcnNpb25zIiAvPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCTx0ZXN0IG5hbWU9IkFydGlmYWN0cyI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuRG93bmxvYWRDb21wb25lbnRBcnQiIC8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5BcnRpZmFjdFNlcnZsZXRUZXN0IiAvPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuVmFsaWRhdGVIZWF0QXJ0RmllbGRzVHlwZXMiIC8+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5QbGFjZUhvbGRlclZhbGlkYXRpb25zIiAvPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuVmFsaWRhdGVBcnRSZXNwb25zZSIgLz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5DcnVkQXJ0IiAvPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorPC9zdWl0ZT4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9leHRlcm5hbEFwaXMueG1sIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9leHRlcm5hbEFwaXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjM2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2V4dGVybmFsQXBpcy54bWwKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIj4KKzxzdWl0ZSBuYW1lPSJleHRlcm5hbEFwaXMiIGNvbmZpZ2ZhaWx1cmVwb2xpY3k9ImNvbnRpbnVlIiB2ZXJib3NlPSIyIj4KKwk8dGVzdCBuYW1lPSJFeHRlcm5hbEFwaXMiPgorCQk8Y2xhc3Nlcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5leHRlcm5hbEFwaXMuR2V0QXNzZXRTZXJ2bGV0IiAvPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmV4dGVybmFsQXBpcy5HZXRGaWx0ZXJlZEFzc2V0U2VydmxldCIvPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmV4dGVybmFsQXBpcy5HZXRTcGVjaWZpY0Fzc2V0TWV0YWRhdGFTZXJ2bGV0Ii8+CisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+Cis8L3N1aXRlPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2dlbmVyYWwueG1sIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9nZW5lcmFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdlNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9nZW5lcmFsLnhtbApAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9IkdlbmVyYWwiID4KKyAgPHRlc3QgbmFtZT0iVGVzdCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5nZW5lcmFsLlNhbXBsZVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmdlbmVyYWwuTWFuYWdlRWNvbXBDb25zdW1lckNyZWRlbnRpYWxzIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5nZW5lcmFsLlV1aWRUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+IDwhLS0gVGVzdCAtLT4KKzwvc3VpdGU+IDwhLS0gR2VuZXJhbCAtLT4KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvaW1wb3J0cy54bWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2ltcG9ydHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGE1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2ltcG9ydHMueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgbmFtZT0iSW1wb3J0cyIgPgorICA8dGVzdCBuYW1lPSJJbXBvcnRzIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydEdlbmVyaWNSZXNvdXJjZUNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0cy5JbXBvcnRDc2FyUmVzb3VyY2VUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydE5ld1Jlc291cmNlQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydFRvc2NhUmVzb3VyY2VUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+IDwhLS0gVGVzdCAtLT4KKzwvc3VpdGU+IDwhLS0gSW1wb3J0cyAtLT4KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvcHJvZHVjdC54bWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL3Byb2R1Y3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTQ5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL3Byb2R1Y3QueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgbmFtZT0iUHJvZHVjdCIgPgorICA8dGVzdCBuYW1lPSJUZXN0Ij4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdExpZmVjeWNsZVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdFVuZG9DaGVja291dFRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdENoZWNraW5UZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RDaGVja291dFRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdENydWRUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RDb21wb25lbnRJbnN0YW5jZUNSVURUZXN0Ii8+ICAgICAgCisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+IDwhLS0gVGVzdCAtLT4KKzwvc3VpdGU+IDwhLS0gUHJvZHVjdCAtLT4KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvcHJvcGVydHkueG1sIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9wcm9wZXJ0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0Zjg5NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvcHJvcGVydHkueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgbmFtZT0iUHJvcGVydHkiID4KKyAgPHRlc3QgbmFtZT0iVGVzdCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eS5Qcm9wZXJ0eUFwaXNUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eS5Qcm9wZXJ0eVNlcnZsZXRUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eS5BZGRpdGlvbmFsSW5mb3JtYXRpb25TZXJ2bGV0VGVzdCIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PiA8IS0tIFRlc3QgLS0+Cis8L3N1aXRlPiA8IS0tIFByb3BlcnR5IC0tPgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9yZXNvdXJjZS54bWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL3Jlc291cmNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjIzMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9yZXNvdXJjZS54bWwKQEAgLTAsMCArMSwzMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgbmFtZT0iU2FuaXR5IiBjb25maWdmYWlsdXJlcG9saWN5PSJjb250aW51ZSIgPgorCQorCTwhLS0KKwkgICAgIAk8bGlzdGVuZXJzPgorICAgICAgICA8bGlzdGVuZXIgY2xhc3MtbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkludm9rZWRNZXRob2RMaXN0ZW5lciIgLz4KKyAgICA8L2xpc3RlbmVycz4KKwktLT4KKworCisgIDx0ZXN0IHZlcmJvc2U9IjIiIG5hbWU9IlNhbml0eSI+CisgICAgPGNsYXNzZXM+CisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5BcnRpZmFjdFNlcnZsZXRUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idXBhZHRlQXJ0aWZhY3RXaXRoUGF5TG9hZFRvUmVzb3VyY3NlVGVzdCIvPgorCQkJCTxpbmNsdWRlIG5hbWU9ImNyZWF0ZUFuZFVwZGF0ZUFydGlmYWN0VG9JbnRlcmZhY2UiLz4KKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuYXJ0aWZhY3RzLkNydWRBcnQiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJhZGRIZWF0QXJ0aWZhY3RUb1Jlc291cmNlQW5kQ2VydGlmeSIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuTENTX0FydGlmYWN0cyI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9IkxDU19pbmhlcml0X2FydGlmYWN0Ii8+CisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5WYWxpZGF0ZUFydFJlc3BvbnNlIi8+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5jYXRlZ29yeS5DYXRhbG9nRGF0YUFwaVRlc3QiLz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5LkVsZW1lbnRzQXBpVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImdldEFsbEFydGlmYWN0VHlwZXMiLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJnZXRDb25maWd1cmF0aW9uIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0iZ2V0QWxsUHJvcGVydHlTY29wZXNTdWNjZXNzIi8+CisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZGlzdHJpYnV0aW9uLkF1dGhhbnRpY2F0aW9uVGVzdHMiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJkb3dubG9hZFNlcnZpY2VBcnRpZmFjdFN1Y2Nlc3NXaXRoQXV0YW50aWNhdGlvbiIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZGlzdHJpYnV0aW9uLkRpc3RyaWJ1dGlvbkRvd25sb2FkQXJ0aWZhY3RUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0U3VjY2VzcyIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5nZW5lcmFsLkJhc2ljSHR0cEF1dGhlbnRpY2F0aW9uVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9InNlbmRBdXRoZW50aWNhdGVkUmVxdWVzdFRlc3Rfc3VjY2VzcyIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CQorCQkKKwkKKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmdlbmVyYWwuRmVQcm94eVRlc3QiLz4KKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZ2VuZXJhbC5NYW5hZ2VFY29tcENvbnN1bWVyQ3JlZGVudGlhbHMiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJkZWxldGVFY29tcENyZWRlbnRpYWxzTWV0aG9kRGVsZXRlIi8+CisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZ2VuZXJhbC5VdWlkVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RFMkVVdWlkSGVhZGVyUmV0dXJuZWRBbmRQcmVzZXJ2ZWQiLz4KKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0cy5JbXBvcnRHZW5lcmljUmVzb3VyY2VDSVRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJpbXBvcnRBbGxUZXN0UmVzb3VyY2VzIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0idGVzdEltcG9ydENoZWNrb3V0QW5kVXBkYXRlVXNlclJlc291cmNlIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0idGVzdEltcG9ydFdpdGhVcGRhdGVOb3JtYXRpdmVUeXBlIi8+CisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0cy5JbXBvcnROZXdSZXNvdXJjZUNJVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImltcG9ydEFsbFRlc3RSZXNvdXJjZXNfdG9WYWxpZGF0ZU5ld0FQSSIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydFRvc2NhUmVzb3VyY2VUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iaW1wb3J0VG9zY2FSZXNvdXJjZSIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuQ2xlYW51cEludGVybWVkaWF0ZVJlb3VyY2VzIj4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idGVzdDI4Ii8+CisJCQkJPGluY2x1ZGUgbmFtZT0idGVzdDI5Ii8+CisJCQkJPGluY2x1ZGUgbmFtZT0idGVzdDMwIi8+CisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5DbGVhbnVwSW50ZXJtZWRpYXRlU2VydmljZXNUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idGVzdENsZWFudXBJbnRlcm1lZGlhdGVTZXJ2aWNlcyIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlJlc291cmNlTENTX2NlcmlmaWNhdGlvbkNJVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9InZlcmlmeUFsbFByZXZWZXJEZWxldGVkIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0idmVyaWZ5U3RhcnRXaXRoRGVzaWduZXJDZXJ0QnlBZG1pbiIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuUmVzb3VyY2VMQ1NfQ2hlY2tJbkNJVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImNoZWNrSW5UZXN0X3N1YyIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuUmVzb3VyY2VMQ1NfQ2hlY2tPdXRDSVRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJjaGVja091dFRlc3RfY3VyclN0YXRlX1JFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OX293bmVyRFNJR05FUl9wZXJmb3JtQnlBRE1JTl9zdWMiLz4KKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlJlc291cmNlTENTX3JlcXVlc3Q0Q2VyQ0lUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0icmVxNGNlcl9mcm9tQ2hlY2tPdXRfZGVzaWduZXJfYWRtaW4iLz4KKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuUmVzb3VyY2VMQ1NfU3RhcnRDZXJ0aWZpY2F0aW9uQ0lUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0ic3RhcnRDZXJfc3VjIi8+CisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKworCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuUmVzb3VyY2VMQ1NfVW5kb0NoZWNrT3V0Q0lUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idW5kb0NoZWNrT3V0VGVzdF9pbXBvcnRfb3V0QWRtaW5fdW5kb091dF9kZXNpZ25lciIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUNlcnRXaXRoTWFuZGF0b3J5QXJ0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iQ2VydFNlcnZpY2VXaXRoSGVhdERlcGxveUFydE9uUmVzb3VyY2UiLz4KKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlQ2VydFdpdGhSZXNvdXJjZUluc3RhbmNlcyI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImNlcnRTZXJ2aWNlV2l0aENlcnRSZXNvdXJjZSIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eS5BZGRpdGlvbmFsSW5mb3JtYXRpb25TZXJ2bGV0VGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImNyZWF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdER1cmluZ0xpZmVjeWNsZSIvPgorCQkJCTxpbmNsdWRlIG5hbWU9InVwZGF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdCIvPgorCQkJCTxpbmNsdWRlIG5hbWU9ImRlbGV0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdCIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eS5Qcm9wZXJ0eUFwaXNUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idGVzdFByb3BlcnR5QXBpcyIvPgorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eS5Qcm9wZXJ0eVNlcnZsZXRUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iY3JlYXRlQ2FzY2FkZVZmUmVzb3VyY2UiLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJjcmVhdGVQcm9wZXJ0eVRlc3RTZXRDbGVhckRlZmF1bHRWYWx1ZUluZXRlZ3IiLz4JCQkJCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5HZXRBbGxMYXRlc3RWZXJzaW9uTm9uQWJzdGFyY3RSZXNvdXJjZXMiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJyZXNvdXJjZUNlcnRpZmllZFR3aWNlQ291dENpbkNvdXQiLz4JCQkJCQkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UuR2V0QWxsUmVzb3VyY2VWZXJzaW9ucyI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImdldFJlc291cmNlQWxsVmVyc2lvbnNfdmVyc2lvbjE1Ii8+CQkJCQkJCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLkdldEZvbGx3ZWRFbGVtZW50c1Rlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJnZXRSZXNvdXJjZXNMaXN0Qm9sb25nc1RvU3BlY2lmaWNEZXNpZ25lciIvPgkJCQkJCQorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5HZXRSZXNvdXJjZUFic3RyYWN0QXBpVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImdldEFic3RyYWN0UmVzb3VyY2VMaXN0Ii8+CQkJCQkJCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLkdldFJlc291cmNlTm90QWJzdHJhY3RBcGlUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iZ2V0Tm90QWJzdHJhY3RSZXNvdXJjZUxpc3QiLz4JCQkJCQkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLkdldFJlc291cmNlVGFnc0FwaVRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJnZXRNb2RpZmllZFJlc291cmNlVGFnc0xpc3QiLz4JCQkJCQkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UuUmVzb3VyY2VBcGlUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idXBkYXRlUmVzb3VyY2VNZXRhZGF0YVN1Y2Nlc3MiLz4JCQkJCQkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCTwhLS0gCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLlJlc291cmNlSW5zdGFuY2VOYW1lQ1JVRCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9InVwZGF0ZVJlc291cmNlSW5zdGFuY2VOYW1lQWZ0ZXJTZXJ2aWNlQ2VydGlmaWNhdGlvbiIvPgkJCQkJCQorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJLS0+Cis8IS0tIAkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UuUmVzb3VyY2VJbnN0YW5jZVNlcnZsZXRUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idXBkYXRlUklfc3VjIi8+CQkJCQkJCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4gLS0+CisKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UuVXBkYXRlUmVzb3VyY2VNZXRhZGF0YVRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJVcGRhdGVEZXJpdmVkRnJvbVN1Y2Nlc3MiLz4JCQkJCQkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKworCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlLkdldENvbXBvbmVudEF1ZGl0QXBpVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RTZXJ2aWNlQXVkaXRDZXJ0aWZpZWRWZXJzaW9uIi8+CQkJCQkJCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuU2VydmljZUFwaVRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJjcmVhdGVTZXJ2aWNlVGVzdCIvPgkKKwkJCQk8aW5jbHVkZSBuYW1lPSJnZXRGb2xsb3dlZFNlcnZpY2VzVGVzdGVyIi8+CQkJCQkJCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuU2VydmljZUluZm9ybWF0aW9uYWxBcnRpZmFjdEFwaVRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJhZGRBcnRpZmFjdFN1Y2Nlc3NmdWx5Ii8+CQorCQkJCTxpbmNsdWRlIG5hbWU9ImRlbGV0ZUFydGlmYWN0Ii8+CQkJCQkJCisJCQkJPGluY2x1ZGUgbmFtZT0idXBkYXRlQXJ0aWZhY3RNZXRhZGF0YVN1Y2Nlc3NmdWxseSIvPgkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5VcGRhdGVTZXJ2aWNlTWV0YWRhdGFUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0idXBkYXRlU2VydmljZVN1Y2Nlc3NmdWxseSIvPgkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLkFjdGl2YXRlRGVBY3RpdmF0ZURlbGV0ZVVzZXIiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJhdXRob3JpemVEZUFjdGl2YXRlZFVzZXIiLz4JCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJCisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnVzZXIuQ3JlYXRlVXNlckFwaVRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJjcmVhdGVVc2VyIi8+CQorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLkdvdmVybm9yV29ya3NwYWNlQXBpVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImdvdmVybm9yTGlzdF9BbGxDZXJ0aWZpZWRWZXJzaW9uc09mU2VydmljZSIvPgkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQkKKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlci5PcHNXb3Jrc3BhY2VBcGlUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0ib3BzTGlzdF9BbGxDZXJ0aWZpZWRWZXJzaW9uc09mU2VydmljZUFwcHJvdmVkIi8+CQorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCQorCQk8IS0tIFByb2R1Y3QgdGVzdHMgc3RhcnQtLT4KKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5Qcm9kdWN0Q2hlY2tpblRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJjaGVja0luUHJvZHVjdEJ5Q3JlYXRvciIvPgkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LkNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25UZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iY2hhbmdlU2VydmljZUluc3RhbmNlVmVyc2lvbkJ5UG0iLz4JCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5Qcm9kdWN0Q2hlY2tvdXRUZXN0Ij4KKwkJCSAgPG1ldGhvZHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iY2hlY2tPdXRQcm9kdWN0QnlQbU5vdEluQ29udGFjdHMiLz4JCisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5Qcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VDUlVEVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImNyZWF0ZVNlcnZpY2VJbnN0YW5jZVRlc3QiLz4JCisJCQkJPGluY2x1ZGUgbmFtZT0iZGVsZXRlU2VydmljZUluc3RhbmNlQnlQbSIvPgkKKwkJCQk8aW5jbHVkZSBuYW1lPSJ1cGRhdGVTZXJ2aWNlSW5zdGFuY2VOYW1lQnlQbSIvPgkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RDcnVkVGVzdCI+CisJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9ImNyZWF0ZU1hbnlHcm91cGluZ3NEaWZmQ2F0ZWdvcmllcyIvPgkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RHZXRGb2xsb3dlZFRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJmb2xsb3dlZFBhZ2VUZXN0Ii8+CQorCQkJICA8L21ldGhvZHM+CisJCTwvY2xhc3M+CisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdFVuZG9DaGVja291dFRlc3QiPgorCQkJICA8bWV0aG9kcz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJ1bmRvQ2hlY2tPdXRQcm9kdWN0QnlQbSIvPgkKKwkJCSAgPC9tZXRob2RzPgorCQk8L2NsYXNzPgorCQk8IS0tIFByb2R1Y3QgdGVzdHMgZW5kLS0+CisJIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PiA8IS0tIFRlc3QgLS0+Cis8L3N1aXRlPiA8IS0tIFNhbml0eSAtLT4KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvc2FuaXR5LnhtbCBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvc2FuaXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI0Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9zYW5pdHkueG1sCkBAIC0wLDAgKzEsMzg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9IlNhbml0eSIgY29uZmlnZmFpbHVyZXBvbGljeT0iY29udGludWUiIHZlcmJvc2U9IjIiPgorCisgICA8bGlzdGVuZXJzPgorICAgICAgICA8bGlzdGVuZXIgY2xhc3MtbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucnVuLkV4dGVudFJlcG9ydGVyTkciIC8+CisgICAgPC9saXN0ZW5lcnM+CisKKwk8dGVzdCBuYW1lPSJzYW5pdHlFMkVmbG93cyI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnNhbml0eS5DcnVkRTJFIiAvPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCisJPHRlc3QgbmFtZT0iR2VuZXJhbCI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5nZW5lcmFsLkJhc2ljSHR0cEF1dGhlbnRpY2F0aW9uVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9InNlbmRBdXRoZW50aWNhdGVkUmVxdWVzdFRlc3Rfc3VjY2VzcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZ2VuZXJhbC5GZVByb3h5VGVzdCIgLz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZ2VuZXJhbC5NYW5hZ2VFY29tcENvbnN1bWVyQ3JlZGVudGlhbHMiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJkZWxldGVFY29tcENyZWRlbnRpYWxzTWV0aG9kRGVsZXRlIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5nZW5lcmFsLlV1aWRUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idGVzdEUyRVV1aWRIZWFkZXJSZXR1cm5lZEFuZFByZXNlcnZlZCIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCQorCTx0ZXN0IG5hbWU9IkFydGlmYWN0T25JbnN0YW5jZSI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuQ3J1ZEFydCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImFkZERjYWVJbnZlbnRvcnlUb3NjYUFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlQW5kQ2VydGlmeSIgLz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iYWRkRGNhZUludmVudG9yeUpzb25BcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImFkZERjYWVJbnZlbnRvcnlQb2xpY3lBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImFkZERjYWVJbnZlbnRvcnlEb2NBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImFkZERjYWVJbnZlbnRvcnlCbHVlUHJpbnRBcnRpZmFjdFRvUmVzb3VyY2VJbnN0YW5jZUFuZENlcnRpZnkiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImFkZERjYWVJbnZlbnRvcnlFdmVudEFydGlmYWN0VG9SZXNvdXJjZUluc3RhbmNlQW5kQ2VydGlmeSIgLz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idXBkYXRlQXJ0aWZhY3REZXNjcmlwdGlvblRvUmVzb3VyY2VJbnN0YW5jZSIgLz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iZGVsZXRlQXJ0aWZhY3RUb1Jlc291cmNlSW5zdGFuY2UiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJPC9jbGFzc2VzPgorCTwvdGVzdD4KKworCTx0ZXN0IG5hbWU9IkFydGlmYWN0Ij4KKwkJPGNsYXNzZXM+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5BcnRpZmFjdFNlcnZsZXRUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idXBhZHRlQXJ0aWZhY3RXaXRoUGF5TG9hZFRvUmVzb3VyY3NlVGVzdCIgLz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iY3JlYXRlQW5kVXBkYXRlQXJ0aWZhY3RUb0ludGVyZmFjZSIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMuQ3J1ZEFydCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImFkZEhlYXRBcnRpZmFjdFRvUmVzb3VyY2VBbmRDZXJ0aWZ5IiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisKKwkJCisKKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmFydGlmYWN0cy5WYWxpZGF0ZUFydFJlc3BvbnNlIiAvPgorCQkJCisJCQkKKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuYXJ0aWZhY3RzLkRvd25sb2FkQ29tcG9uZW50QXJ0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iZG93bmxvYWRBcnRpZmFjdEZyb21SZXNvdXJjZVRlc3QiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImRvd25sb2FkQXJ0aWZhY3RGcm9tU2VydmljZVRlc3QiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJPC9jbGFzc2VzPgorCTwvdGVzdD4KKworCTx0ZXN0IG5hbWU9IlNlcnZpY2UiPgorCQk8Y2xhc3Nlcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5HZXRDb21wb25lbnRBdWRpdEFwaVRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ0ZXN0U2VydmljZUF1ZGl0Q2VydGlmaWVkVmVyc2lvbiIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCisJCQk8IS0tIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuU2VydmljZUFwaVRlc3QiPiAKKwkJCQk8bWV0aG9kcz4gPGluY2x1ZGUgbmFtZT0iY3JlYXRlU2VydmljZVRlc3QiIC8+IDxpbmNsdWRlIG5hbWU9ImdldEZvbGxvd2VkU2VydmljZXNUZXN0ZXIiIAorCQkJCS8+IDwvbWV0aG9kcz4gPC9jbGFzcz4gLS0+CisKKwkJCTwhLS0gPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5TZXJ2aWNlSW5mb3JtYXRpb25hbEFydGlmYWN0QXBpVGVzdCI+IAorCQkJCTxtZXRob2RzPiA8aW5jbHVkZSBuYW1lPSJhZGRBcnRpZmFjdFN1Y2Nlc3NmdWx5IiAvPiA8aW5jbHVkZSBuYW1lPSJkZWxldGVBcnRpZmFjdCIgCisJCQkJLz4gPGluY2x1ZGUgbmFtZT0idXBkYXRlQXJ0aWZhY3RNZXRhZGF0YVN1Y2Nlc3NmdWxseSIgLz4gPC9tZXRob2RzPiA8L2NsYXNzPiAtLT4KKworCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlLlVwZGF0ZVNlcnZpY2VNZXRhZGF0YVRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ1cGRhdGVTZXJ2aWNlU3VjY2Vzc2Z1bGx5IiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+CisKKwk8dGVzdCBuYW1lPSJSZXNvdXJjZSI+CisJCTxjbGFzc2VzPgorCQkJPCEtLSA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5HZXRBbGxMYXRlc3RWZXJzaW9uTm9uQWJzdGFyY3RSZXNvdXJjZXMiPiAKKwkJCQk8bWV0aG9kcz4gPGluY2x1ZGUgbmFtZT0icmVzb3VyY2VDZXJ0aWZpZWRUd2ljZUNvdXRDaW5Db3V0IiAvPiA8L21ldGhvZHM+IAorCQkJCTwvY2xhc3M+IC0tPgorCisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLkdldEFsbFJlc291cmNlVmVyc2lvbnMiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJnZXRSZXNvdXJjZUFsbFZlcnNpb25zX3ZlcnNpb24xNSIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCisJCQk8IS0tIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLkdldEZvbGx3ZWRFbGVtZW50c1Rlc3QiPiAKKwkJCQk8bWV0aG9kcz4gPGluY2x1ZGUgbmFtZT0iZ2V0UmVzb3VyY2VzTGlzdEJvbG9uZ3NUb1NwZWNpZmljRGVzaWduZXIiIC8+IDwvbWV0aG9kcz4gCisJCQkJPC9jbGFzcz4gLS0+CisKKwkJCTwhLS0gPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UuR2V0UmVzb3VyY2VBYnN0cmFjdEFwaVRlc3QiPiAKKwkJCQk8bWV0aG9kcz4gPGluY2x1ZGUgbmFtZT0iZ2V0QWJzdHJhY3RSZXNvdXJjZUxpc3QiIC8+IDwvbWV0aG9kcz4gPC9jbGFzcz4gLS0+CisKKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UuR2V0UmVzb3VyY2VOb3RBYnN0cmFjdEFwaVRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJnZXROb3RBYnN0cmFjdFJlc291cmNlTGlzdCIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCisJCQk8IS0tIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLkdldFJlc291cmNlVGFnc0FwaVRlc3QiPiAKKwkJCQk8bWV0aG9kcz4gPGluY2x1ZGUgbmFtZT0iZ2V0TW9kaWZpZWRSZXNvdXJjZVRhZ3NMaXN0IiAvPiA8L21ldGhvZHM+IDwvY2xhc3M+IC0tPgorCisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5SZXNvdXJjZUFwaVRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ1cGRhdGVSZXNvdXJjZU1ldGFkYXRhU3VjY2VzcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPCEtLSA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5SZXNvdXJjZUluc3RhbmNlTmFtZUNSVUQiPiAKKwkJCQk8bWV0aG9kcz4gPGluY2x1ZGUgbmFtZT0idXBkYXRlUmVzb3VyY2VJbnN0YW5jZU5hbWVBZnRlclNlcnZpY2VDZXJ0aWZpY2F0aW9uIi8+IAorCQkJCTwvbWV0aG9kcz4gPC9jbGFzcz4gLS0+CisJCQk8IS0tIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNlLlJlc291cmNlSW5zdGFuY2VTZXJ2bGV0VGVzdCI+IAorCQkJCTxtZXRob2RzPiA8aW5jbHVkZSBuYW1lPSJ1cGRhdGVSSV9zdWMiLz4gPC9tZXRob2RzPiA8L2NsYXNzPiAtLT4KKworCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZS5VcGRhdGVSZXNvdXJjZU1ldGFkYXRhVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9IlVwZGF0ZURlcml2ZWRGcm9tU3VjY2VzcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCTx0ZXN0IG5hbWU9IlByb2R1Y3QiPgorCQk8Y2xhc3Nlcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdENoZWNraW5UZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iY2hlY2tJblByb2R1Y3RCeUNyZWF0b3IiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5DaGFuZ2VTZXJ2aWNlSW5zdGFuY2VWZXJzaW9uVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImNoYW5nZVNlcnZpY2VJbnN0YW5jZVZlcnNpb25CeVBtIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RDaGVja291dFRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJjaGVja091dFByb2R1Y3RCeVBtTm90SW5Db250YWN0cyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9kdWN0LlByb2R1Y3RDb21wb25lbnRJbnN0YW5jZUNSVURUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iY3JlYXRlU2VydmljZUluc3RhbmNlVGVzdCIgLz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iZGVsZXRlU2VydmljZUluc3RhbmNlQnlQbSIgLz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idXBkYXRlU2VydmljZUluc3RhbmNlTmFtZUJ5UG0iIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdENydWRUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iY3JlYXRlTWFueUdyb3VwaW5nc0RpZmZDYXRlZ29yaWVzIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb2R1Y3QuUHJvZHVjdEdldEZvbGxvd2VkVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImZvbGxvd2VkUGFnZVRlc3QiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvZHVjdC5Qcm9kdWN0VW5kb0NoZWNrb3V0VGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9InVuZG9DaGVja091dFByb2R1Y3RCeVBtIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8IS0tIFByb2R1Y3QgdGVzdHMgZW5kIC0tPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCTx0ZXN0IG5hbWU9IkNhdGFsb2ciPgorCQk8Y2xhc3Nlcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5LkNhdGFsb2dEYXRhQXBpVGVzdCIgLz4KKwkJPC9jbGFzc2VzPgorCTwvdGVzdD4KKworCTx0ZXN0IG5hbWU9ImRpc3RyaWJ1dGlvbiI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5kaXN0cmlidXRpb24uQXV0aGFudGljYXRpb25UZXN0cyI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImRvd25sb2FkU2VydmljZUFydGlmYWN0U3VjY2Vzc1dpdGhBdXRhbnRpY2F0aW9uIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisKKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuZGlzdHJpYnV0aW9uLkRpc3RyaWJ1dGlvbkRvd25sb2FkQXJ0aWZhY3RUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0U3VjY2VzcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCisJPHRlc3QgbmFtZT0iQ2F0ZWdvcnkiPgorCQk8Y2xhc3Nlcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmNhdGVnb3J5LkVsZW1lbnRzQXBpVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdldEFsbEFydGlmYWN0VHlwZXMiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdldENvbmZpZ3VyYXRpb24iIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdldEFsbFByb3BlcnR5U2NvcGVzU3VjY2VzcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCisJPHRlc3QgbmFtZT0iSW1wb3J0cyI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydEdlbmVyaWNSZXNvdXJjZUNJVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImltcG9ydEFsbFRlc3RSZXNvdXJjZXMiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RJbXBvcnRDaGVja291dEFuZFVwZGF0ZVVzZXJSZXNvdXJjZSIgLz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idGVzdEltcG9ydFdpdGhVcGRhdGVOb3JtYXRpdmVUeXBlIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmltcG9ydHMuSW1wb3J0TmV3UmVzb3VyY2VDSVRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJpbXBvcnRBbGxUZXN0UmVzb3VyY2VzX3RvVmFsaWRhdGVOZXdBUEkiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKworCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydFRvc2NhUmVzb3VyY2VUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iaW1wb3J0VG9zY2FSZXNvdXJjZSIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5pbXBvcnRzLkltcG9ydFRvc2NhQ2FwYWJpbGl0aWVzV2l0aFByb3BlcnRpZXMiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJpbXBvcnROb2RlVHlwZVdpdGhDYXBhYmlsaXR5V2l0aFByb3BlcnRpZXNGcm9tWW1sU3VjY2VlZCIgLz4KKwkJCQkJPCEtLQorCQkJCQlUaGlzIHRlc3QgcmVxdWlyZSB0aGUgb25ib2FyZGluZyBzaW11bGF0b3IuIAorCQkJCQk8aW5jbHVkZSBuYW1lPSJpbXBvcnRSZXNvdXJjZVdpdGhDYXBhYmlsaXR5V2l0aFByb3BlcnRpZXNPdmVycmlkaW5nQ2FwVHlwZVByb3BlcnRpZXNTdWNjZWVkIiAvPiAKKwkJCQkJLS0+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0cy5Dc2FyVXRpbHNUZXN0Ij4KKwkJCTwvY2xhc3M+CisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+IDwhLS0gVGVzdCAtLT4KKworCTx0ZXN0IG5hbWU9ImF0dHJpYnV0ZSI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hdHRyaWJ1dGUuQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGVUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idGVzdFVwZGF0ZUF0dHJpYnV0ZU9uUmVzb3VyY2VJbnN0YW5jZSIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCisJPHRlc3QgbmFtZT0iaW5wdXRzIj4KKwkJPGNsYXNzZXM+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmlucHV0cy5JbnB1dHNBcGlUZXN0cyI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RJbnB1dHNNYWluRnVuY3Rpb25hbGl0eSIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCQorCTx0ZXN0IG5hbWU9InByb3BlcnR5Ij4KKwkJPGNsYXNzZXM+CisJCQk8Y2xhc3MKKwkJCQluYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb3BlcnR5LkFkZGl0aW9uYWxJbmZvcm1hdGlvblNlcnZsZXRUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iY3JlYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25UZXN0RHVyaW5nTGlmZWN5Y2xlIiAvPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ1cGRhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvblRlc3QiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImRlbGV0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uVGVzdCIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eS5Qcm9wZXJ0eUFwaXNUZXN0Ij4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idGVzdFByb3BlcnR5QXBpcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucHJvcGVydHkuQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eVRlc3QiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJuZXN0ZWRWZlJlc291cmNlUHJvcGVydHkzTGV2ZWxzIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisKKworCisJCQk8IS0tIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnByb3BlcnR5LlByb3BlcnR5U2VydmxldFRlc3QiPiAKKwkJCQk8bWV0aG9kcz4gPGluY2x1ZGUgbmFtZT0iY3JlYXRlQ2FzY2FkZVZmUmVzb3VyY2UiIC8+IDxpbmNsdWRlIG5hbWU9ImNyZWF0ZVByb3BlcnR5VGVzdFNldENsZWFyRGVmYXVsdFZhbHVlSW5ldGVnciIgCisJCQkJLz4gPC9tZXRob2RzPiA8L2NsYXNzPiAtLT4KKwkJPC9jbGFzc2VzPgorCTwvdGVzdD4KKworCTx0ZXN0IG5hbWU9IlVzZXIiPgorCQk8Y2xhc3Nlcz4KKworCQkJPCEtLSBjbGFzcworCQkJCW5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlci5BY3RpdmF0ZURlQWN0aXZhdGVEZWxldGVVc2VyIj4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0iYXV0aG9yaXplRGVBY3RpdmF0ZWRVc2VyIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3MtLT4KKworCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlci5DcmVhdGVVc2VyQXBpVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImNyZWF0ZVVzZXIiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKworCQkJPGNsYXNzCisJCQkJbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLkdvdmVybm9yV29ya3NwYWNlQXBpVGVzdCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdvdmVybm9yTGlzdF9BbGxDZXJ0aWZpZWRWZXJzaW9uc09mU2VydmljZSIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+CisJCisJPHRlc3QgbmFtZT0iRXh0ZXJuYWxBcGlzIj4KKwkJPGNsYXNzZXM+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuZXh0ZXJuYWxBcGlzLkdldEFzc2V0U2VydmxldCIgPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJnZXRSZXNvdXJjZUFzc2V0U3VjY2VzcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmV4dGVybmFsQXBpcy5HZXRGaWx0ZXJlZEFzc2V0U2VydmxldCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdldFJlc291cmNlQXNzZXRCeVNwZWNpZmllZENhdGVnb3J5QW5kU3ViQ2F0ZWdvcnkiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdldFNlcnZpY2VBc3NldEJ5U3BlY2lmaWVkQ2F0ZWdvcnlBbmREaXN0cmlidXRpb25TdGF0dXMiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5leHRlcm5hbEFwaXMuR2V0U3BlY2lmaWNBc3NldE1ldGFkYXRhU2VydmxldCI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdldFJlc291cmNlQXNzZXRNZXRhZGF0YVdpdGhSZXNvdXJjZUluc3RhbmNlc1N1Y2Nlc3MiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9ImdldFNlcnZpY2VBc3NldE1ldGFkYXRhV2l0aENlcnRpZmllZFJlc291cmNlSW5zdGFuY2VzQW5kQXJ0aWZhY3RzT25SSXNBbmRTZXJ2aWNlU3VjY2VzcyIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCisKKworCisKKworCis8L3N1aXRlPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL3NlcnZpY2UueG1sIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9zZXJ2aWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQ1NjMwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9zZXJ2aWNlLnhtbApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9IlNlcnZpY2UiID4KKyAgIDx0ZXN0IG5hbWU9IlNlcnZpY2UiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5HZXRTZXJ2aWNlTGF0ZXN0VmVyc2lvblRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuQ3JlYXRlU2VydmljZU1ldGFkYXRhQXBpVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5SZXFDYXBPY2N1cnJlbmNlc1Rlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuQ2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXR1c0FwaVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuU2VydmljZUNvbXBvbmVudEluc3RhbmNlQ1JVRFRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuVXBkYXRlU2VydmljZU1ldGFkYXRhVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZS5HZXRBbGxTZXJ2aWNlVmVyc2lvbnMiLz4KKyAgICAgICAgPC9jbGFzc2VzPiAKKyAgICA8L3Rlc3Q+Cis8L3N1aXRlPiA8IS0tIFNlcnZpY2UgLS0+CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL3Rlc3RuZ0xpZmVDeWNsZS54bWwgYi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL3Rlc3RuZ0xpZmVDeWNsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmMTg2OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvdGVzdG5nTGlmZUN5Y2xlLnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9ImxpZmVDeWNsZSIgPgorICA8dGVzdCBuYW1lPSJUZXN0Ij4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlTENTX2NlcmlmaWNhdGlvbkNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VSZXNvdXJjZUxDU1Rlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NfVW5kb0NoZWNrT3V0Q0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUxDU19VbmRvQ2hlY2tPdXRDSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NfU3RhcnRDZXJ0aWZpY2F0aW9uQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUxDU19DaGVja2luQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTX0NoZWNrT3V0Q0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUNlcnRXaXRoUmVzb3VyY2VJbnN0YW5jZXMiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5Dcm9zc0NoZWNrT3V0VGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkNlcnRpZnlWRldpdGhOb3RDZXJ0UklzIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTX3JlcXVlc3Q0Q2VyQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuQ2xlYW51cEludGVybWVkaWF0ZVJlb3VyY2VzIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUxDU19DaGVja091dENJVCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU19jZXJpZmljYXRpb25DSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5DZXJ0aWZ5U2VydmljZVdpdGhOb3RDZXJ0UkkiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NfQ2hlY2tJbkNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VMQ1NfcmVxdWVzdDRDZXJDSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NiYXNlVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VMQ1NfU3RhcnRDZXJ0aWZpY2F0aW9uQ0lUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+IDwhLS0gVGVzdCAtLT4KKzwvc3VpdGU+IDwhLS0gbGlmZUN5Y2xlIC0tPgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy91c2VyLnhtbCBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvdXNlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4OTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvdXNlci54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIj4KKzxzdWl0ZSBuYW1lPSJVc2VyIiA+CisgIDx0ZXN0IG5hbWU9IlRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlci5BdXRob3JpemVkVXNlckFwaVRlc3RfZXh0ZW5kIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLkF1dGhvcml6ZWRVc2VyQXBpVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlci5PcHNXb3Jrc3BhY2VBcGlUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLlVzZXJBcGlUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLkdldEFsbEFkbWluVXNlcnNBcGlUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLkNSVURVc2VyVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlci5DcmVhdGVVc2VyQXBpVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlci5Hb3Zlcm5vcldvcmtzcGFjZUFwaVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnVzZXIuR2V0TGlzdHNPZlRlc3RlclVzZXJBcGlUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS51c2VyLkFjdGl2YXRlRGVBY3RpdmF0ZURlbGV0ZVVzZXIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4gPCEtLSBUZXN0IC0tPgorPC9zdWl0ZT4gPCEtLSBVc2VyIC0tPgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9hcGFjaGUvYXBhY2hlLXR5cGUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9hcGFjaGUvYXBhY2hlLXR5cGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MGIxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL2FwYWNoZS9hcGFjaGUtdHlwZS55bWwKQEAgLTAsMCArMSw1MCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IFRPU0NBIHNpbXBsZSBwcm9maWxlIHdpdGggQXBhY2hlLgordGVtcGxhdGVfbmFtZTogYXBhY2hlLXR5cGUKK3RlbXBsYXRlX3ZlcnNpb246IDIuMC4wLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy13ZWJTZXJ2ZXI6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgYWxpZW4ubm9kZXMuQXBhY2hlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuV2ViU2VydmVyCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoZSBUT1NDQSBBcGFjaGUgTm9kZSBUeXBlIHJlcHJlc2VudHMgYW4gYXBhY2hlIGNvbXBvbmVudAorICAgICAgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgVE9TQ0EgQ29tcHV0ZSBOb2RlIFR5cGUuCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogYWxpZW4uY2FwYWJpbGl0aWVzLkFwYWNoZUNvbnRhaW5lcgorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL2FwYWNoZS5wbmcKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdmVyc2lvbjoKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgICBkZWZhdWx0OiAyLjQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBlcXVhbDogMi40CisgICAgICBwb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBQb3J0IGZvciB0aGUgQXBhY2hlIHNlcnZlcgorICAgICAgICBkZWZhdWx0OiA4MAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEKKyAgICAgIGRvY3VtZW50X3Jvb3Q6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgZGVmYXVsdDogIi92YXIvd3d3IgorICAgIGludGVyZmFjZXM6CisgICAgICBTdGFuZGFyZDoKKyAgICAgICAgY3JlYXRlOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgcG9ydF0gfQorICAgICAgICAgICAgRE9DX1JPT1Q6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZG9jdW1lbnRfcm9vdF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL2luc3RhbGxfYXBhY2hlLnNoCisgICAgICAgIHN0YXJ0OiBzY3JpcHRzL3N0YXJ0X2FwYWNoZS5zaAorCitjYXBhYmlsaXR5X3R5cGVzOgorICBhbGllbi5jYXBhYmlsaXRpZXMuQXBhY2hlQ29udGFpbmVyOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL2FwYWNoZS9pbWFnZXMvYXBhY2hlLnBuZyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvYXBhY2hlL2ltYWdlcy9hcGFjaGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOWY0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL2FwYWNoZS9pbWFnZXMvYXBhY2hlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL2FwYWNoZS9zY3JpcHRzL2luc3RhbGxfYXBhY2hlLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9hcGFjaGUvc2NyaXB0cy9pbnN0YWxsX2FwYWNoZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdmOWExCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9hcGFjaGUvc2NyaXB0cy9pbnN0YWxsX2FwYWNoZS5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vYmFzaAorCitlY2hvICJVc2luZyBhcHQtZ2V0LiBJbnN0YWxsaW5nIGFwYWNoZTIgb24gb25lIG9mIHRoZSBmb2xsb3dpbmcgOiBEZWJpYW4sIFVidW50dSwgTWludCIKK0xPQ0s9Ii90bXAvbG9ja2FwdGdldCIKK0RFRkFVTFRfUE9SVD04MAorCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJHtMT0NLfSIgJj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICJBcGFjaGUgdGFrZSB0aGUgbG9jayIKKyAgICBicmVhazsKKyAgZmkKKyAgZWNobyAiV2FpdGluZyB0aGUgZW5kIG9mIG9uZSBvZiBvdXIgcmVjaXBlcy4uLiIKKyAgc2xlZXAgMC41Citkb25lCisKK3doaWxlIHN1ZG8gZnVzZXIgL3Zhci9saWIvZHBrZy9sb2NrID4vZGV2L251bGwgMj4mMSA7IGRvCisgIGVjaG8gIldhaXRpbmcgZm9yIG90aGVyIHNvZnR3YXJlIG1hbmFnZXJzIHRvIGZpbmlzaC4uLiIKKyAgc2xlZXAgMC41Citkb25lCisKK3N1ZG8gcm0gLWYgL3Zhci9saWIvZHBrZy9sb2NrCitzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IChzbGVlcCAxNTsgc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCBleGl0ICR7MX0pCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBhcGFjaGUyIHx8IGV4aXQgJHsxfQorcm0gLXJmICIke0xPQ0t9IgorCitzdWRvIC9ldGMvaW5pdC5kL2FwYWNoZTIgc3RvcAoraWYgWyAhIC1kICRET0NfUk9PVCBdOyB0aGVuCisgIGV2YWwgInN1ZG8gbWtkaXIgLXAgJERPQ19ST09UIgorZmkKK2V2YWwgInN1ZG8gY2hvd24gLVIgd3d3LWRhdGE6d3d3LWRhdGEgJERPQ19ST09UIgorCitpZiBbWyAoIiRQT1JUIiA9PSAiJERFRkFVTFRfUE9SVCIpIF1dOyB0aGVuCisgIGVjaG8gIlVzZSBkZWZhdWx0IHBvcnQgZm9yIEFwYWNoZSA6ICRERUZBVUxUX1BPUlQiCitlbHNlCisgIGVjaG8gIlJlcGxhY2luZyBwb3J0ICRERUZBVUxUX1BPUlQgd2l0aCAkUE9SVC4uLiIKKyAgc3VkbyBzZWQgLWkgLWUgInMvJERFRkFVTFRfUE9SVC8kUE9SVC9nIiAvZXRjL2FwYWNoZTIvcG9ydHMuY29uZiB8fCBleGl0ICR7MX0KK2ZpCisKK2VjaG8gIkNoYW5nZSBjb25maWcgb2YgYXBhY2hlMiIKK2lmIHN1ZG8gdGVzdCAtZiAiL2V0Yy9hcGFjaGUyL3NpdGVzLWF2YWlsYWJsZS9kZWZhdWx0IjsgdGhlbgorICBlY2hvICJDaGFuZ2UgdGhlIERvY3VtZW50Um9vdCBvZiBhcGFjaGUyIG9uIFVidW50dSA8IDE0LjA0IgorICBzdWRvIHNlZCAtaSAtZSAicyNEb2N1bWVudFJvb3QgL3Zhci93d3cjRG9jdW1lbnRSb290ICRET0NfUk9PVCNnIiAvZXRjL2FwYWNoZTIvc2l0ZXMtYXZhaWxhYmxlL2RlZmF1bHQKK2ZpCitpZiBzdWRvIHRlc3QgLWYgIi9ldGMvYXBhY2hlMi9zaXRlcy1hdmFpbGFibGUvMDAwLWRlZmF1bHQuY29uZiI7IHRoZW4KKyAgZWNobyAiQ2hhbmdlIHRoZSBEb2N1bWVudFJvb3Qgb2YgQXBhY2hlMiBvbiBVYnVudHUgPj0gMTQuMDQiCisgIHN1ZG8gc2VkIC1pIC1lICJzI0RvY3VtZW50Um9vdCAvdmFyL3d3dy9odG1sI0RvY3VtZW50Um9vdCAkRE9DX1JPT1QjZyIgL2V0Yy9hcGFjaGUyL3NpdGVzLWF2YWlsYWJsZS8wMDAtZGVmYXVsdC5jb25mCitmaQorCitzdWRvIGJhc2ggLWMgImVjaG8gU2VydmVyTmFtZSBsb2NhbGhvc3QgPj4gL2V0Yy9hcGFjaGUyL2FwYWNoZTIuY29uZiIKKworZWNobyAiU3RhcnQgYXBhY2hlMiB3aGl0aCBuZXcgY29uZiIKK3N1ZG8gL2V0Yy9pbml0LmQvYXBhY2hlMiBzdGFydAorZWNobyAiRW5kIG9mICQwIgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9hcGFjaGUvc2NyaXB0cy9zdGFydF9hcGFjaGUuc2ggYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL2FwYWNoZS9zY3JpcHRzL3N0YXJ0X2FwYWNoZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhjNTZlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9hcGFjaGUvc2NyaXB0cy9zdGFydF9hcGFjaGUuc2gKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKworc2VydmljZT0iYXBhY2hlMiIKKworaWYgKCggJChwcyAtZWYgfCBncmVwIC12IGdyZXAgfCBncmVwICRzZXJ2aWNlIHwgd2MgLWwpID4gMCApKQordGhlbgorICBzdWRvIC9ldGMvaW5pdC5kLyRzZXJ2aWNlIHJlc3RhcnQKK2Vsc2UKKyAgc3VkbyAvZXRjL2luaXQuZC8kc2VydmljZSBzdGFydAorZmkKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvREJNUy9pbWFnZXMvcmVsYXRpb25hbF9kYi5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL0RCTVMvaW1hZ2VzL3JlbGF0aW9uYWxfZGIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTYzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL0RCTVMvaW1hZ2VzL3JlbGF0aW9uYWxfZGIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvREJNUy9ub3JtYXRpdmUtdHlwZXMtREJNUy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL0RCTVMvbm9ybWF0aXZlLXR5cGVzLURCTVMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTI0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL0RCTVMvbm9ybWF0aXZlLXR5cGVzLURCTVMueW1sCkBAIC0wLDAgKzEsMzYgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKKwordGVtcGxhdGVfbmFtZTogdG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVMKK3RlbXBsYXRlX2F1dGhvcjogVE9TQ0EgVEMKK3RlbXBsYXRlX3ZlcnNpb246IDEuMC4wLndkMDMtU05BUFNIT1QKKworZGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBub3JtYXRpdmUgdHlwZXMgZGVmaW5pdGlvbi4KK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1zb2Z0d2FyZUNvbXBvbmVudDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAKK25vZGVfdHlwZXM6CisgIHRvc2NhLm5vZGVzLkRCTVM6CisgICAgYWJzdHJhY3Q6IHRydWUKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoZSBUT1NDQSBEQk1TIG5vZGUgcmVwcmVzZW50cyBhIHR5cGljYWwgcmVsYXRpb25hbCwgU1FMIERhdGFiYXNlIE1hbmFnZW1lbnQgU3lzdGVtIHNvZnR3YXJlIGNvbXBvbmVudCBvciBzZXJ2aWNlLgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL3JlbGF0aW9uYWxfZGIucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRibXNfcm9vdF9wYXNzd29yZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UuCisgICAgICBkYm1zX3BvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbdG9zY2Eubm9kZXMuRGF0YWJhc2VdCisgICAgICBlbmRwb2ludDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkRhdGFiYXNlRW5kcG9pbnQKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9ibG9ja1N0b3JhZ2UvaW1hZ2VzL3ZvbHVtZS5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2Jsb2NrU3RvcmFnZS9pbWFnZXMvdm9sdW1lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZhMTdiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9ibG9ja1N0b3JhZ2UvaW1hZ2VzL3ZvbHVtZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9ibG9ja1N0b3JhZ2Uvbm9ybWF0aXZlLXR5cGVzLWJsb2NrU3RvcmFnZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2Jsb2NrU3RvcmFnZS9ub3JtYXRpdmUtdHlwZXMtYmxvY2tTdG9yYWdlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjk0MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9ibG9ja1N0b3JhZ2Uvbm9ybWF0aXZlLXR5cGVzLWJsb2NrU3RvcmFnZS55bWwKQEAgLTAsMCArMSw0MCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtYmxvY2tTdG9yYWdlCit0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UCisKK2Rlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgbm9ybWF0aXZlIHR5cGVzIGRlZmluaXRpb24uCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoZSBUT1NDQSBCbG9ja1N0b3JhZ2Ugbm9kZSBjdXJyZW50bHkgcmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkKKyAgICAgIG9mZmVyaW5nIGV2ZW5seSBzaXplZCBibG9ja3Mgb2YgZGF0YSBmcm9tIHdoaWNoIHJhdyBzdG9yYWdlIHZvbHVtZXMgY2FuIGJlIGNyZWF0ZWQuCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvdm9sdW1lLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBzaXplOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfdGhhbjogMAorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHJlcXVlc3RlZCBzdG9yYWdlIHNpemUgaW4gTWVnYUJ5dGVzIChNQikuCisgICAgICB2b2x1bWVfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IElEIG9mIGFuIGV4aXN0aW5nIHZvbHVtZSAodGhhdCBpcyBpbiB0aGUgYWNjZXNzaWJsZSBzY29wZSBvZiB0aGUgcmVxdWVzdGluZyBhcHBsaWNhdGlvbikuCisgICAgICBzbmFwc2hvdF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogU29tZSBpZGVudGlmaWVyIHRoYXQgcmVwcmVzZW50cyBhbiBleGlzdGluZyBzbmFwc2hvdCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGJsb2NrIHN0b3JhZ2UgKHZvbHVtZSkuCisgICAgYXR0cmlidXRlczoKKyAgICAgIHZvbHVtZV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJRCBwcm92aWRlZCBieSB0aGUgb3JjaGVzdHJhdG9yIGZvciBuZXdseSBjcmVhdGVkIHZvbHVtZXMuCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgYXR0YWNobWVudDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvY29tcHV0ZS9pbWFnZXMvY29tcHV0ZS5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2NvbXB1dGUvaW1hZ2VzL2NvbXB1dGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTI5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2NvbXB1dGUvaW1hZ2VzL2NvbXB1dGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvY29tcHV0ZS9ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2NvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTcyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2NvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGUueW1sCkBAIC0wLDAgKzEsNzcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKKwordGVtcGxhdGVfbmFtZTogdG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGUKK3RlbXBsYXRlX2F1dGhvcjogVE9TQ0EgVEMKK3RlbXBsYXRlX3ZlcnNpb246IDEuMC4wLndkMDMtU05BUFNIT1QKKworZGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBub3JtYXRpdmUgdHlwZXMgZGVmaW5pdGlvbi4KK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgICMgSW5mcmFzdHJ1Y3R1cmUgY29tcG9uZW50cworICB0b3NjYS5ub2Rlcy5Db21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBSZXByZXNlbnRzIGEgcmVhbCBvciB2aXJ0dWFsIG1hY2hpbmUgb3Ig4oCYc2VydmVy4oCZLiBJbmZvcm1hdGlvbnMgc3BlY2lmaWVkIG9uIHRoZSBDb21wdXRlCisgICAgICBub2RlIHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBtYWNoaW5lIHRoYXQgZml0cyB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzIGluIHRoZSBjbG91ZAorICAgICAgYXZhaWxhYmxlIG1hY2hpbmVzLiBJZiBubyBzaXppbmcgaW5mb3JtYXRpb25zIGFyZSBzcGVjaWZpZWQgdGhlIGNsb3Vk4oCZcyBwcm92aWRlciBkZWZhdWx0CisgICAgICBtYWNoaW5lIHdpbGwgYmUgdXNlZC4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gc3BlY2lmeSB0aGUgcmVxdWlyZWQgY3B1cyBhbmQgbWVtb3J5CisgICAgICBhdCBsZWFzdC4KKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy9jb21wdXRlLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBudW1fY3B1czoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSAgZ3JlYXRlcl90aGFuOiAwCisgICAgICAgIGRlc2NyaXB0aW9uOiBOdW1iZXIgb2YgKGFjdHVhbCBvciB2aXJ0dWFsKSBDUFVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29tcHV0ZSBub2RlLgorICAgICAgbWVtX3NpemU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl90aGFuOiAwCisgICAgICAgIGRlc2NyaXB0aW9uOiBTaXplIG9mIG1lbW9yeSwgaW4gTWVnYWJ5dGVzIChNQiksIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGUgQ29tcHV0ZSBub2RlLgorICAgICAgZGlza19zaXplOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfdGhhbjogMAorICAgICAgICBkZXNjcmlwdGlvbjogU2l6ZSBvZiB0aGUgbG9jYWwgZGlzaywgaW4gR2lnYWJ5dGVzIChHQiksIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGUgQ29tcHV0ZSBub2RlLgorICAgICAgb3NfYXJjaDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbIng4Nl8zMiIsICJ4ODZfNjQiXQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGhvc3QgT3BlcmF0aW5nIFN5c3RlbSAoT1MpIGFyY2hpdGVjdHVyZS4KKyAgICAgIG9zX3R5cGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyJsaW51eCIsICJhaXgiLCAibWFjIG9zIiwgIndpbmRvd3MiXQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGhvc3QgT3BlcmF0aW5nIFN5c3RlbSAoT1MpIHR5cGUuCisgICAgICBvc19kaXN0cmlidXRpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBob3N0IE9wZXJhdGluZyBTeXN0ZW0gKE9TKSBkaXN0cmlidXRpb24uCisgICAgICBvc192ZXJzaW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgaG9zdCBPcGVyYXRpbmcgU3lzdGVtIHZlcnNpb24uCisgICAgYXR0cmlidXRlczoKKyAgICAgIGlwX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogPgorICAgICAgICAgIFRoZSBwcmltYXJ5IElQIGFkZHJlc3MgYXNzaWduZWQgYnkgdGhlIGNsb3VkIHByb3ZpZGVyIHRoYXQgYXBwbGljYXRpb25zIG1heSB1c2UgdG8gYWNjZXNzIHRoZSBDb21wdXRlIG5vZGUuCisgICAgICAgICAgTm90ZTogVGhpcyBpcyB1c2VkIGJ5IHRoZSBwbGF0Zm9ybSBwcm92aWRlciB0byBjb252ZXkgdGhlIHByaW1hcnkgYWRkcmVzcyB1c2VkIHRvIGFjY2VzcyB0aGUgY29tcHV0ZSBub2RlLiAgRnV0dXJlIHdvcmtpbmcgZHJhZnRzIHdpbGwgYWRkcmVzcyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IGZsb2F0aW5nIG9yIG11bHRpcGxlIElQIGFkZHJlc3Nlcy4KKyAgICByZXF1aXJlbWVudHM6CisgICAgICBuZXR3b3JrOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29ubmVjdGl2aXR5CisgICAgICAgIGxvd2VyX2JvdW5kOiAwCisgICAgICAgIHVwcGVyX2JvdW5kOiB1bmJvdW5kZWQKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHByb3BlcnRpZXM6CisgICAgICAgICAgdmFsaWRfbm9kZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XQorICAgICAgYXR0YWNoOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgc2NhbGFibGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9kYXRhYmFzZS9pbWFnZXMvcmVsYXRpb25hbF9kYi5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2RhdGFiYXNlL2ltYWdlcy9yZWxhdGlvbmFsX2RiLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2E2MzJlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9kYXRhYmFzZS9pbWFnZXMvcmVsYXRpb25hbF9kYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9kYXRhYmFzZS9ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2UueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9kYXRhYmFzZS9ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2UueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmY1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL2RhdGFiYXNlL25vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZS55bWwKQEAgLTAsMCArMSw0MSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2UKK3RlbXBsYXRlX2F1dGhvcjogVE9TQ0EgVEMKK3RlbXBsYXRlX3ZlcnNpb246IDEuMC4wLndkMDMtU05BUFNIT1QKKworZGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBub3JtYXRpdmUgdHlwZXMgZGVmaW5pdGlvbi4KK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIHRvc2NhLm5vZGVzLkRhdGFiYXNlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBCYXNlIHR5cGUgZm9yIHRoZSBzY2hlbWEgYW5kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgREJNUy4KKyAgICAgIFRoZSBUT1NDQSBEYXRhYmFzZSBub2RlIHJlcHJlc2VudHMgYSBsb2dpY2FsIGRhdGFiYXNlIHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIGhvc3RlZCBieSBhIFRPU0NBIERCTVMgbm9kZS4KKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy9yZWxhdGlvbmFsX2RiLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl91c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgc3BlY2lhbCB1c2VyIGFjY291bnQgdXNlZCBmb3IgZGF0YWJhc2UgYWRtaW5pc3RyYXRpb24uCisgICAgICBkYl9wYXNzd29yZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgZGJfcG9ydDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuREJNUworICAgICAgICByZWxhdGlvbnNoaXBfdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGRhdGFiYXNlX2VuZHBvaW50OiB0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9uZXR3b3JrL2ltYWdlcy9uZXR3b3JrLnBuZyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvbmV0d29yay9pbWFnZXMvbmV0d29yay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZjE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvbmV0d29yay9pbWFnZXMvbmV0d29yay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9uZXR3b3JrL25vcm1hdGl2ZS10eXBlcy1uZXR3b3JrLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvbmV0d29yay9ub3JtYXRpdmUtdHlwZXMtbmV0d29yay55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4NjBmOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvbmV0d29yay9ub3JtYXRpdmUtdHlwZXMtbmV0d29yay55bWwKQEAgLTAsMCArMSwzOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtbmV0d29yawordGVtcGxhdGVfYXV0aG9yOiBUT1NDQSBUQwordGVtcGxhdGVfdmVyc2lvbjogMS4wLjAud2QwMy1TTkFQU0hPVAorCitkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLgoraW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgdG9zY2Eubm9kZXMuTmV0d29yazoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgVGhlIFRPU0NBIE5ldHdvcmsgbm9kZSByZXByZXNlbnRzIGEgc2ltcGxlLCBsb2dpY2FsIG5ldHdvcmsgc2VydmljZS4KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgaXBfdmVyc2lvbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogNAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyA0LCA2IF0KKyAgICAgIGNpZHI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGdhdGV3YXlfaXA6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIG5ldHdvcmtfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgbmV0d29ya19pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGNvbm5lY3Rpb246CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db25uZWN0aXZpdHkKKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy9uZXR3b3JrLnBuZwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9vYmplY3RTdG9yYWdlL2ltYWdlcy9vYmplY3RzdG9yZS5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL29iamVjdFN0b3JhZ2UvaW1hZ2VzL29iamVjdHN0b3JlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIwNjNjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9vYmplY3RTdG9yYWdlL2ltYWdlcy9vYmplY3RzdG9yZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9vYmplY3RTdG9yYWdlL25vcm1hdGl2ZS10eXBlcy1vYmplY3RTdG9yYWdlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvb2JqZWN0U3RvcmFnZS9ub3JtYXRpdmUtdHlwZXMtb2JqZWN0U3RvcmFnZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2ZmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvb2JqZWN0U3RvcmFnZS9ub3JtYXRpdmUtdHlwZXMtb2JqZWN0U3RvcmFnZS55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtb2JqZWN0U3RvcmFnZQordGVtcGxhdGVfYXV0aG9yOiBUT1NDQSBUQwordGVtcGxhdGVfdmVyc2lvbjogMS4wLjAud2QwMy1TTkFQU0hPVAorCitkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLgoraW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgdG9zY2Eubm9kZXMuT2JqZWN0U3RvcmFnZToKKyAgICBhYnN0cmFjdDogdHJ1ZQorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBUaGUgVE9TQ0EgT2JqZWN0U3RvcmFnZSBub2RlIHJlcHJlc2VudHMgc3RvcmFnZSB0aGF0IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHN0b3JlIGRhdGEgYXMgb2JqZWN0cyAob3IgQkxPQnMgb2YgZGF0YSkKKyAgICAgIHdpdGhvdXQgY29uc2lkZXJhdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBvciBkZXZpY2VzLgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL29iamVjdHN0b3JlLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBzdG9yZV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIG9iamVjdCBzdG9yZSAob3IgY29udGFpbmVyKS4KKyAgICAgIHN0b3JlX3NpemU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMAorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHJlcXVlc3RlZCBpbml0aWFsIHN0b3JhZ2Ugc2l6ZSBpbiBHaWdhYnl0ZXMuCisgICAgICBzdG9yZV9tYXhzaXplOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfdGhhbjogMAorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHJlcXVlc3RlZCBtYXhpbXVtIHN0b3JhZ2Ugc2l6ZSBpbiBHaWdhYnl0ZXMuCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL3Jvb3QvaW1hZ2VzL3Jvb3QucG5nIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9yb290L2ltYWdlcy9yb290LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzBmMWMzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9yb290L2ltYWdlcy9yb290LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL3Jvb3Qvbm9ybWF0aXZlLXR5cGVzLXJvb3QueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9yb290L25vcm1hdGl2ZS10eXBlcy1yb290LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRjMTZjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9yb290L25vcm1hdGl2ZS10eXBlcy1yb290LnltbApAQCAtMCwwICsxLDE2OCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdAordGVtcGxhdGVfYXV0aG9yOiBUT1NDQSBUQwordGVtcGxhdGVfdmVyc2lvbjogMS4wLjAud2QwMy1TTkFQU0hPVAorCitkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLgorCitub2RlX3R5cGVzOgorICB0b3NjYS5ub2Rlcy5Sb290OgorICAgIGFic3RyYWN0OiB0cnVlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgKHJvb3QpIFRPU0NBIE5vZGUgVHlwZSB0aGF0IGFsbCBvdGhlciBUT1NDQSBub2RlcyBzaG91bGQgZXh0ZW5kcy4KKyAgICAgIFRoaXMgYWxsb3dzIGFsbCBUT1NDQSBub2RlcyB0byBoYXZlIGEgY29uc2lzdGVudCBzZXQgb2YgZmVhdHVyZXMgZm9yIG1vZGVsaW5nIGFuZCBtYW5hZ2VtZW50CisgICAgICAoZS5nLCBjb25zaXN0ZW50IGRlZmluaXRpb25zIGZvciByZXF1aXJlbWVudHMsIGNhcGFiaWxpdGllcywgYW5kIGxpZmVjeWNsZSBpbnRlcmZhY2VzKS4KKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy9yb290LnBuZworICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICByZXF1aXJlbWVudHM6CisgICAgICBkZXBlbmRlbmN5OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgICAgICBsb3dlcl9ib3VuZDogMAorICAgICAgICB1cHBlcl9ib3VuZDogdW5ib3VuZGVkCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgcm9vdDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICBpbnRlcmZhY2VzOgorICAgICAgdG9zY2EuaW50ZXJmYWNlcy5ub2RlLmxpZmVjeWNsZS5TdGFuZGFyZDoKKyAgICAgICAgZGVzY3JpcHRpb246ID4KKyAgICAgICAgICBUaGlzIGxpZmVjeWNsZSBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgZXNzZW50aWFsLCBub3JtYXRpdmUgb3BlcmF0aW9ucyB0aGF0IFRPU0NBIG5vZGVzIG1heSBzdXBwb3J0LgorICAgICAgICBjcmVhdGU6CisgICAgICAgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBjcmVhdGUgb3BlcmF0aW9uLgorICAgICAgICBjb25maWd1cmU6CisgICAgICAgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBjb25maWd1cmUgb3BlcmF0aW9uIChwcmUtc3RhcnQpLgorICAgICAgICBzdGFydDoKKyAgICAgICAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIHN0YXJ0IG9wZXJhdGlvbi4KKyAgICAgICAgcG9zdF9zdGFydDoKKyAgICAgICAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIHBvc3QtY29uZmlndXJlIG9wZXJhdGlvbiAocG9zdC1zdGFydCkKKyAgICAgICAgc3RvcDoKKyAgICAgICAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIHN0b3Agb3BlcmF0aW9uLgorICAgICAgICBkZWxldGU6CisgICAgICAgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBkZWxldGUgb3BlcmF0aW9uLgorCisKK2NhcGFiaWxpdHlfdHlwZXM6CisgIHRvc2NhLmNhcGFiaWxpdGllcy5Sb290OgorICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBkZWZhdWx0IChyb290KSBUT1NDQSBDYXBhYmlsaXR5IFR5cGUgZGVmaW5pdGlvbiB0aGF0IGFsbCBvdGhlciBUT1NDQSBDYXBhYmlsaXR5IFR5cGVzIGRlcml2ZSBmcm9tLgorICB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdmFsaWRfbm9kZV90eXBlczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbGlzdCBvZiBvbmUgb3IgbW9yZSBuYW1lcyBvZiBOb2RlIFR5cGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBhcyAgY29udGFpbmVlcyB0aGF0IGRlY2xhcmUgdGhlIENvbnRhaW5lciB0eXBlIGFzIGEgQ2FwYWJpbGl0eS4KKyAgdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcHJvdG9jb2w6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiB0Y3AKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxCisgICAgICAgICAtIGxlc3Nfb3JfZXF1YWw6IDY1NTM1CisgICAgICBzZWN1cmU6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgIHVybF9wYXRoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgIHRvc2NhLmNhcGFiaWxpdGllcy5EYXRhYmFzZUVuZHBvaW50OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgdGhlIGRlZmF1bHQgVE9TQ0EgdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIG9yIGV4dGVuZGVkIHRvIGRlZmluZSBhIHNwZWNpYWxpemVkIGRhdGFiYXNlIGVuZHBvaW50IGNhcGFiaWxpdHkuCisgIHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyB0aGUgZGVmYXVsdCBUT1NDQSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgb3IgZXh0ZW5kZWQgdG8gZGVmaW5lIGEgbmV0d29yayBlbmRwb2ludCBjYXBhYmlsaXR5LgorICB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBtaW5faW50YW5jZXM6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMQorICAgICAgbWF4X2ludGFuY2VzOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDEKKyAgICAgIGRlZmF1bHRfaW5zdGFuY2VzOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDEKKyAgdG9zY2EuY2FwYWJpbGl0aWVzLkNvbm5lY3Rpdml0eToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisKK3JlbGF0aW9uc2hpcF90eXBlczoKKyAgdG9zY2EucmVsYXRpb25zaGlwcy5Sb290OgorICAgIGFic3RyYWN0OiB0cnVlCisgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgdGhlIGRlZmF1bHQgKHJvb3QpIFRPU0NBIFJlbGF0aW9uc2hpcCBUeXBlIGRlZmluaXRpb24gdGhhdCBhbGwgb3RoZXIgVE9TQ0EgUmVsYXRpb25zaGlwIFR5cGVzIGRlcml2ZSBmcm9tLgorICAgIHZhbGlkX3RhcmdldHM6IFsgdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QgXQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBpbnRlcmZhY2VzOgorICAgICAgdG9zY2EuaW50ZXJmYWNlcy5yZWxhdGlvbnNoaXAuQ29uZmlndXJlOgorICAgICAgICBkZXNjcmlwdGlvbjogPgorICAgICAgICAgIFRoZSBsaWZlY3ljbGUgaW50ZXJmYWNlcyBkZWZpbmUgdGhlIGVzc2VudGlhbCwgbm9ybWF0aXZlIG9wZXJhdGlvbnMgdGhhdCBlYWNoIFRPU0NBIFJlbGF0aW9uc2hpcCBUeXBlcyBtYXkgc3VwcG9ydC4KKyAgICAgICAgcHJlX2NvbmZpZ3VyZV9zb3VyY2U6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBwcmUtY29uZmlndXJlIHRoZSBzb3VyY2UgZW5kcG9pbnQuCisgICAgICAgIHByZV9jb25maWd1cmVfdGFyZ2V0OgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBPcGVyYXRpb24gdG8gcHJlLWNvbmZpZ3VyZSB0aGUgdGFyZ2V0IGVuZHBvaW50LgorICAgICAgICBwb3N0X2NvbmZpZ3VyZV9zb3VyY2U6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBwb3N0LWNvbmZpZ3VyZSB0aGUgc291cmNlIGVuZHBvaW50LgorICAgICAgICBwb3N0X2NvbmZpZ3VyZV90YXJnZXQ6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBwb3N0LWNvbmZpZ3VyZSB0aGUgdGFyZ2V0IGVuZHBvaW50LgorICAgICAgICBhZGRfdGFyZ2V0OgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBPcGVyYXRpb24gdG8gbm90aWZ5IHRoZSBzb3VyY2Ugbm9kZSBvZiBhIHRhcmdldCBub2RlIGJlaW5nIGFkZGVkIHZpYSBhIHJlbGF0aW9uc2hpcC4KKyAgICAgICAgYWRkX3NvdXJjZToKKyAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIG5vdGlmeSB0aGUgdGFyZ2V0IG5vZGUgb2YgYSBzb3VyY2Ugbm9kZSB3aGljaCBpcyBub3cgIGF2YWlsYWJsZSB2aWEgYSByZWxhdGlvbnNoaXAuCisgICAgICAgIHJlbW92ZV90YXJnZXQ6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgdGhlIHNvdXJjZSBub2RlIG9mIGEgdGFyZ2V0IG5vZGUgYmVpbmcgcmVtb3ZlZCBmcm9tIGEgcmVsYXRpb25zaGlwLgorICAgICAgICByZW1vdmVfc291cmNlOgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBPcGVyYXRpb24gdG8gbm90aWZ5IHRoZSB0YXJnZXQgbm9kZSBvZiBhIHNvdXJjZSBub2RlIGJlaW5nIHJlbW92ZWQgZnJvbSBhIHJlbGF0aW9uc2hpcC4KKyAgICAgICAgdGFyZ2V0X2NoYW5nZWQ6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgc291cmNlIHNvbWUgcHJvcGVydHkgb3IgYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQuCisgICAgICAgIHNvdXJjZV9jaGFuZ2VkOgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBPcGVyYXRpb24gdG8gbm90aWZ5IHRhcmdldCBzb21lIHByb3BlcnR5IG9yIGF0dHJpYnV0ZSBvZiB0aGUgc291cmNlLgorICB0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBBIGdlbmVyaWMgZGVwZW5kcyBvbiByZWxhdGlvbnNoaXAuCisgIHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT246CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbgorICAgIGRlc2NyaXB0aW9uOiBSZWxhdGlvbnNoaXAgdG8gdXNlIHRvIGRlc2NyaWJlIHRoYXQgdGhlIHNvdXJjZSBpcyBob3N0ZWQgKGluc3RhbGxlZC8gZGVwbG95ZWQpIG9uIHRoZSB0YXJnZXQgbm9kZS4KKyAgICB2YWxpZF90YXJnZXRzOiBbIHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIgXQorICB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RzVG86CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbgorICAgIHZhbGlkX3RhcmdldHM6IFsgdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50IF0KKyAgdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hUbzoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuUm9vdAorICAgIHZhbGlkX3RhcmdldHM6IFsgdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQgXQorICAgIHByb3BlcnRpZXM6CisgICAgICBsb2NhdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gbWluX2xlbmd0aDogMQorICAgICAgZGV2aWNlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgIHRvc2NhLnJlbGF0aW9uc2hpcHMuTmV0d29yazoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuUm9vdAorICAgIHZhbGlkX3NvdXJjZXM6IFsgdG9zY2EuY2FwYWJpbGl0aWVzLkNvbm5lY3Rpdml0eSBdCisgICAgdmFsaWRfdGFyZ2V0czogWyB0b3NjYS5jYXBhYmlsaXRpZXMuQ29ubmVjdGl2aXR5IF0KKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Sb290OgorICAgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0EgQXJ0aWZhY3QgVHlwZSBhbGwgb3RoZXIgVE9TQ0EgQXJ0aWZhY3QgVHlwZXMgZGVyaXZlIGZyb20uCisgIHRvc2NhLmFydGlmYWN0cy5GaWxlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuYXJ0aWZhY3RzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogVGhpcyBhcnRpZmFjdCB0eXBlIGlzIHVzZWQgd2hlbiBhbiBhcnRpZmFjdCBkZWZpbml0aW9uIG5lZWRzIHRvIGhhdmUgaXRzIGFzc29jaWF0ZWQgZmlsZSBzaW1wbHkgdHJlYXRlZCBhcyBhIGZpbGUgYW5kIG5vIHNwZWNpYWwgaGFuZGxpbmcvaGFuZGxlcnMgYXJlIGludm9rZWQuCisgIHRvc2NhLmFydGlmYWN0cy5TaGVsbFNjcmlwdDoKKyAgICBkZXNjcmlwdGlvbjogQSBzaGVsbCBzY3JpcHQgKC5zaCBmaWxlKQorICAgIGZpbGVfZXh0OiBbIHNoIF0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvc29mdHdhcmVDb21wb25lbnQvaW1hZ2VzL3NvZnR3YXJlLnBuZyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvc29mdHdhcmVDb21wb25lbnQvaW1hZ2VzL3NvZnR3YXJlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzljNTMyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9zb2Z0d2FyZUNvbXBvbmVudC9pbWFnZXMvc29mdHdhcmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvc29mdHdhcmVDb21wb25lbnQvbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvc29mdHdhcmVDb21wb25lbnQvbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGUwNGFmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy9zb2Z0d2FyZUNvbXBvbmVudC9ub3JtYXRpdmUtdHlwZXMtc29mdHdhcmVDb21wb25lbnQueW1sCkBAIC0wLDAgKzEsMjUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKKwordGVtcGxhdGVfbmFtZTogdG9zY2Etbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50Cit0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UCisKK2Rlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgbm9ybWF0aXZlIHR5cGVzIGRlZmluaXRpb24uCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorCisgIHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50OgorICAgIGFic3RyYWN0OiB0cnVlCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoZSBUT1NDQSBTb2Z0d2FyZUNvbXBvbmVudCBOb2RlIFR5cGUgcmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50CisgICAgICB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBUT1NDQSBDb21wdXRlIE5vZGUgVHlwZS4KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL3NvZnR3YXJlLnBuZworCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL3dlYkFwcGxpY2F0aW9uL2ltYWdlcy9uZXR3b3JrLnBuZyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvd2ViQXBwbGljYXRpb24vaW1hZ2VzL25ldHdvcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmYxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL3dlYkFwcGxpY2F0aW9uL2ltYWdlcy9uZXR3b3JrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL3dlYkFwcGxpY2F0aW9uL25vcm1hdGl2ZS10eXBlcy13ZWJBcHBsaWNhdGlvbi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL3dlYkFwcGxpY2F0aW9uL25vcm1hdGl2ZS10eXBlcy13ZWJBcHBsaWNhdGlvbi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkMDA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NvbXBvbmVudHMvbm9ybWF0aXZlVHlwZXMvd2ViQXBwbGljYXRpb24vbm9ybWF0aXZlLXR5cGVzLXdlYkFwcGxpY2F0aW9uLnltbApAQCAtMCwwICsxLDIxIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCisKK3RlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy13ZWJBcHBsaWNhdGlvbgordGVtcGxhdGVfYXV0aG9yOiBUT1NDQSBUQwordGVtcGxhdGVfdmVyc2lvbjogMS4wLjAud2QwMy1TTkFQU0hPVAorCitkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLgoraW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXdlYlNlcnZlcjoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAKK25vZGVfdHlwZXM6CisgIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBUaGUgVE9TQ0EgV2ViQXBwbGljYXRpb24gbm9kZSByZXByZXNlbnRzIGEgc29mdHdhcmUgYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgVE9TQ0EgV2ViU2VydmVyIG5vZGUuICBTcGVjaWZpYyB0eXBlcyBvZiB3ZWIgYXBwbGljYXRpb25zIHN1Y2ggYXMgSmF2YSwgZXRjLiBjb3VsZCBiZSBkZXJpdmVkIGZyb20gdGhpcyB0eXBlLgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL25ldHdvcmsucG5nCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiB0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy93ZWJTZXJ2ZXIvbm9ybWF0aXZlLXR5cGVzLXdlYlNlcnZlci55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzL25vcm1hdGl2ZVR5cGVzL3dlYlNlcnZlci9ub3JtYXRpdmUtdHlwZXMtd2ViU2VydmVyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJlNGIyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cy9ub3JtYXRpdmVUeXBlcy93ZWJTZXJ2ZXIvbm9ybWF0aXZlLXR5cGVzLXdlYlNlcnZlci55bWwKQEAgLTAsMCArMSwyNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtd2ViU2VydmVyCit0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UCisKK2Rlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgbm9ybWF0aXZlIHR5cGVzIGRlZmluaXRpb24uCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtc29mdHdhcmVDb21wb25lbnQ6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgdG9zY2Eubm9kZXMuV2ViU2VydmVyOgorICAgIGFic3RyYWN0OiB0cnVlCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudAorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBUaGUgVE9TQ0EgV2ViU2VydmVyIE5vZGUgVHlwZSByZXByZXNlbnRzIGFuIGFic3RyYWN0IHNvZnR3YXJlIGNvbXBvbmVudCBvciBzZXJ2aWNlIHRoYXQgaXMgY2FwYWJsZSBvZiBob3N0aW5nIGFuZCBwcm92aWRpbmcgbWFuYWdlbWVudCBvcGVyYXRpb25zIGZvciBvbmUgb3IgbW9yZSBXZWJBcHBsaWNhdGlvbiBub2RlcworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGFwcF9lbmRwb2ludDogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICBzZWN1cmVfZW5kcG9pbnQ6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29uZmlndXJhdGlvbi55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29uZmlndXJhdGlvbi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOTEzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSwzODIgQEAKK2lkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOgorICAgLSBIVFRQX0lWX1VTRVIKKyAgIC0gSFRUUF9DU1BfRklSU1ROQU1FCisgICAtIEhUVFBfQ1NQX0xBU1ROQU1FCisgICAtIEhUVFBfSVZfUkVNT1RFX0FERFJFU1MKKyAgIC0gSFRUUF9DU1BfV1NUWVBFCisKKworCisjIGNhdGFsb2cgYmFja2VuZCBob3N0bmFtZQorYmVGcWRuOiBzZGNjYXRhbG9nLmF0dC5jb20KKworIyBjYXRhbG9nIGJhY2tlbmQgaHR0cCBwb3J0CitiZUh0dHBQb3J0OiA4MDgwCisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgY29udGV4dAorYmVDb250ZXh0OiAvc2RjL3Jlc3QvY29uZmlnL2dldAorCisjIGNhdGFsb2cgYmFja2VuZCBwcm90b2NvbAorYmVQcm90b2NvbDogaHR0cAorCisjIGNhdGFsb2cgYmFja2VuZCBzc2wgcG9ydAorYmVTc2xQb3J0OiA4NDQzCisKK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKwordGl0YW5DZmdGaWxlOiAvaG9tZS92YWdyYW50L2NhdGFsb2ctYmUvY29uZmlnL2NhdGFsb2ctYmUvdGl0YW4ucHJvcGVydGllcwordGl0YW5Jbk1lbW9yeUdyYXBoOiBmYWxzZQordGl0YW5Mb2NrVGltZW91dDogMzAKK3RpdGFuUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM6IDMKK3RpdGFuSGVhbHRoQ2hlY2tSZWFkVGltZW91dDogMQorZXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczogMwordWViSGVhbHRoQ2hlY2tSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczogMTUKK3VlYkhlYWx0aENoZWNrUmVhZFRpbWVvdXQ6IDQKKworIyBQcm90b2NvbHMKK3Byb3RvY29sczoKKyAgIC0gaHR0cAorICAgLSBodHRwcworCisjIFVzZXJzCit1c2VyczoKKyAgICB0b206IHBhc3N3ZAorICAgIGJvYjogcGFzc3dkCisgICAgCituZW80ajoKKyAgICBob3N0OiBuZW80amhvc3QKKyAgICBwb3J0OiA3NDc0CisgICAgdXNlcjogbmVvNGoKKyAgICBwYXNzd29yZDogIjEyMzQ1IgorICAgIAorCisjQXBwbGljYXRpb24tc3BlY2lmaWMgc2V0dGluZ3Mgb2YgRVMKK2VsYXN0aWNTZWFyY2g6CisgICAgIyBNYXBwaW5nIG9mIGluZGV4IHByZWZpeCB0byB0aW1lLWJhc2VkIGZyYW1lLiBGb3IgZXhhbXBsZSwgaWYgYmVsb3cgaXMgY29uZmlndXJlZDoKKyAgICAjCisgICAgIyAtIGluZGV4UHJlZml4OiBhdWRpdGluZ2V2ZW50cworICAgICMgICAgY3JlYXRpb25QZXJpb2Q6IG1pbnV0ZQorICAgICMKKyAgICAjIHRoZW4gRVMgb2JqZWN0IG9mIHR5cGUgd2hpY2ggaXMgbWFwcGVkIHRvICJhdWRpdGluZ2V2ZW50cy0qIiB0ZW1wbGF0ZSwgYW5kIGNyZWF0ZWQgb24gMjAxNS0xMi0yMyAxMzoyNDo1NCwgd2lsbCBlbnRlciAiYXVkaXRpbmdldmVudHMtMjAxNS0xMi0yMy0xMy0yNCIgaW5kZXguCisgICAgIyBBbm90aGVyIG9iamVjdCBjcmVhdGVkIG9uIDIwMTUtMTItMjMgMTM6MjU6NTQsIHdpbGwgZW50ZXIgImF1ZGl0aW5nZXZlbnRzLTIwMTUtMTItMjMtMTMtMjUiIGluZGV4LgorICAgICMgSWYgY3JlYXRpb25QZXJpb2Q6IG1vbnRoLCBib3RoIG9mIHRoZSBhYm92ZSB3aWxsIGVudGVyICJhdWRpdGluZ2V2ZW50cy0yMDE1LTEyIiBpbmRleC4KKyAgICAjCisgICAgIyBQTEVBU0UgTk9URTogdGhlIHRpbWVzdGFtcHMgYXJlIGNyZWF0ZWQgaW4gVVRDL0dNVCB0aW1lem9uZSEgVGhpcyBpcyBuZWVkZWQgc28gdGhhdCB0aW1lc3RhbXBzIHdpbGwgYmUgY29ycmVjdGx5IHByZXNlbnRlZCBpbiBLaWJhbmEuCisgICAgIworICAgICMgTGVnYWwgdmFsdWVzIGZvciBjcmVhdGlvblBlcmlvZCAtIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgbm9uZSAobWVhbmluZyBubyB0aW1lLWJhc2VkIGJlaGF2aW91cikuCisgICAgIworICAgICMgSWYgbm8gY3JlYXRpb25QZXJpb2QgaXMgY29uZmlndXJlZCBmb3IgaW5kZXhQcmVmaXgsIGRlZmF1bHQgYmVoYXZvdXIgaXMgY3JlYXRpb25QZXJpb2Q6IG1vbnRoLgorCisgICAgaW5kaWNlc1RpbWVGcmVxdWVuY3k6CisgICAgICAtIGluZGV4UHJlZml4OiBhdWRpdGluZ2V2ZW50cworICAgICAgICBjcmVhdGlvblBlcmlvZDogbW9udGgKKyAgICAgIC0gaW5kZXhQcmVmaXg6IG1vbml0b3JpbmdfZXZlbnRzCisgICAgICAgIGNyZWF0aW9uUGVyaW9kOiBtb250aAorCithcnRpZmFjdFR5cGVzOgorICAgLSBDSEVGCisgICAtIFBVUFBFVAorICAgLSBTSEVMTAorICAgLSBZQU5HCisgICAtIFlBTkdfWE1MCisgICAtIEhFQVQKKyAgIC0gQlBFTAorICAgLSBER19YTUwKKyAgIC0gTVVSQU5PX1BLRworICAgLSBXT1JLRkxPVworICAgLSBORVRXT1JLX0NBTExfRkxPVworICAgLSBPVEhFUgorCitsaWNlbnNlVHlwZXM6CisgICAtIFVzZXIKKyAgIC0gSW5zdGFsbGF0aW9uCisgICAtIENQVQorCisjRGVwbG95bWVudCBhcnRpZmFjdHMgcGxhY2VIb2xkZXIKK3Jlc291cmNlVHlwZXM6ICZhbGxSZXNvdXJjZVR5cGVzCisgIC0gVkZDCisgIC0gQ1AKKyAgLSBWTAorICAtIFZGCisgCisjIHZhbGlkRm9yUmVzb3VyY2VUeXBlcyB1c2FnZQorIyAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorIyAgICAgICAgLSBWRgorIyAgICAgICAgLSBWTAorZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzOgorICBoZWF0OgorICAgICAgZGlzcGxheU5hbWU6ICJCYXNlIEhFQVQgVGVtcGxhdGUiCisgICAgICB0eXBlOiBIRUFUCisgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgIGhlYXRWb2w6CisgICAgICBkaXNwbGF5TmFtZTogIlZvbHVtZSBIRUFUIFRlbXBsYXRlIgorICAgICAgdHlwZTogSEVBVF9WT0wKKyAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgaGVhdE5ldDoKKyAgICAgIGRpc3BsYXlOYW1lOiAiTmV0d29yayBIRUFUIFRlbXBsYXRlIgorICAgICAgdHlwZTogSEVBVF9ORVQKKyAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgCitkZXBsb3ltZW50UmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0czoKKyAgaGVhdEVudjoKKyAgICAgIGRpc3BsYXlOYW1lOiAiSEVBVCBFTlYiCisgICAgICB0eXBlOiBIRUFUX0VOVgorICAgICAgZGVzY3JpcHRpb246ICJBdXRvLWdlbmVyYXRlZCBIRUFUIEVudmlyb25tZW50IGRlcGxveW1lbnQgYXJ0aWZhY3QiCisgICAgICBmaWxlRXh0ZW5zaW9uOiAiZW52IgorCisjSW5mb3JtYXRpb25hbCBhcnRpZmFjdHMgcGxhY2VIb2xkZXIKK2V4Y2x1ZGVSZXNvdXJjZUNhdGVnb3J5OgorICAtIEdlbmVyaWMKK2luZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0czoKKyAgZmVhdHVyZXM6CisgICAgICBkaXNwbGF5TmFtZTogRmVhdHVyZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIGNhcGFjaXR5OgorICAgICAgZGlzcGxheU5hbWU6IENhcGFjaXR5CisgICAgICB0eXBlOiBPVEhFUgorICB2ZW5kb3JUZXN0UmVzdWx0OgorICAgICAgZGlzcGxheU5hbWU6IFZlbmRvciBUZXN0IFJlc3VsdAorICAgICAgdHlwZTogT1RIRVIKKyAgdGVzdFNjcmlwdHM6CisgICAgICBkaXNwbGF5TmFtZTogVGVzdCBTY3JpcHRzCisgICAgICB0eXBlOiBPVEhFUgorICBjbG91ZFF1ZXN0aW9ubmFpcmU6CisgICAgICBkaXNwbGF5TmFtZTogQ2xvdWQgUXVlc3Rpb25uYWlyZSAoY29tcGxldGVkKQorICAgICAgdHlwZTogT1RIRVIKKyAgSEVBVFRlbXBsYXRlRnJvbVZlbmRvcjoKKyAgICAgIGRpc3BsYXlOYW1lOiBIRUFUIFRlbXBsYXRlIGZyb20gVmVuZG9yCisgICAgICB0eXBlOiBIRUFUCisgIHJlc291cmNlU2VjdXJpdHlUZW1wbGF0ZToKKyAgICAgIGRpc3BsYXlOYW1lOiBSZXNvdXJjZSBTZWN1cml0eSBUZW1wbGF0ZQorICAgICAgdHlwZTogT1RIRVIKKyAgICAgIAorZXhjbHVkZVNlcnZpY2VDYXRlZ29yeToKKworaW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdHM6CisgIHNlcnZpY2VBcnRpZmFjdFBsYW46CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZSBBcnRpZmFjdCBQbGFuCisgICAgICB0eXBlOiBPVEhFUgorICBzdW1tYXJ5T2ZJbXBhY3RzVG9FQ09NUEVsZW1lbnRzOgorICAgICAgZGlzcGxheU5hbWU6IFN1bW1hcnkgb2YgaW1wYWN0cyB0byBFQ09NUCBlbGVtZW50cyxPU1NzLCBCU1NzCisgICAgICB0eXBlOiBPVEhFUgorICBjb250cm9sTG9vcEZ1bmN0aW9uczoKKyAgICAgIGRpc3BsYXlOYW1lOiBDb250cm9sIExvb3AgRnVuY3Rpb25zCisgICAgICB0eXBlOiBPVEhFUgorICBkaW1lbnNpb25pbmdJbmZvOgorICAgICAgZGlzcGxheU5hbWU6IERpbWVuc2lvbmluZyBJbmZvCisgICAgICB0eXBlOiBPVEhFUgorICBhZmZpbml0eVJ1bGVzOgorICAgICAgZGlzcGxheU5hbWU6IEFmZmluaXR5IFJ1bGVzCisgICAgICB0eXBlOiBPVEhFUgorICBvcGVyYXRpb25hbFBvbGljaWVzOgorICAgICAgZGlzcGxheU5hbWU6IE9wZXJhdGlvbmFsIFBvbGljaWVzCisgICAgICB0eXBlOiBPVEhFUgorICBzZXJ2aWNlU3BlY2lmaWNQb2xpY2llczoKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlLXNwZWNpZmljIFBvbGljaWVzCisgICAgICB0eXBlOiBPVEhFUgorICBlbmdpbmVlcmluZ1J1bGVzOgorICAgICAgZGlzcGxheU5hbWU6IEVuZ2luZWVyaW5nIFJ1bGVzIChFUkQpCisgICAgICB0eXBlOiBPVEhFUgorICBkaXN0cmlidXRpb25JbnN0cnVjdGlvbnM6CisgICAgICBkaXNwbGF5TmFtZTogRGlzdHJpYnV0aW9uIEluc3RydWN0aW9ucworICAgICAgdHlwZTogT1RIRVIKKyAgY2VydGlmaWNhdGlvblRlc3RSZXN1bHRzOgorICAgICAgZGlzcGxheU5hbWU6IFREIENlcnRpZmljYXRpb24gVGVzdCBSZXN1bHRzCisgICAgICB0eXBlOiBPVEhFUgorICBkZXBsb3ltZW50Vm90aW5nUmVjb3JkOgorICAgICAgZGlzcGxheU5hbWU6IERlcGxveW1lbnQgVm90aW5nIFJlY29yZAorICAgICAgdHlwZTogT1RIRVIKKyAgc2VydmljZVF1ZXN0aW9ubmFpcmU6CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZSBRdWVzdGlvbm5haXJlCisgICAgICB0eXBlOiBPVEhFUgorICBzZXJ2aWNlU2VjdXJpdHlUZW1wbGF0ZToKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlIFNlY3VyaXR5IFRlbXBsYXRlCisgICAgICB0eXBlOiBPVEhFUgorICAgICAgCitzZXJ2aWNlQXBpQXJ0aWZhY3RzOgorICBjb25maWd1cmF0aW9uOgorICAgICAgZGlzcGxheU5hbWU6IENvbmZpZ3VyYXRpb24KKyAgICAgIHR5cGU6IE9USEVSCisgIGluc3RhbnRpYXRpb246CisgICAgICBkaXNwbGF5TmFtZTogSW5zdGFudGlhdGlvbgorICAgICAgdHlwZTogT1RIRVIKKyAgbW9uaXRvcmluZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBNb25pdG9yaW5nCisgICAgICB0eXBlOiBPVEhFUgorICByZXBvcnRpbmc6CisgICAgICBkaXNwbGF5TmFtZTogUmVwb3J0aW5nCisgICAgICB0eXBlOiBPVEhFUgorICBsb2dnaW5nOgorICAgICAgZGlzcGxheU5hbWU6IExvZ2dpbmcKKyAgICAgIHR5cGU6IE9USEVSCisgIHRlc3Rpbmc6CisgICAgICBkaXNwbGF5TmFtZTogVGVzdGluZworICAgICAgdHlwZTogT1RIRVIKKworCithZGRpdGlvbmFsSW5mb3JtYXRpb25NYXhOdW1iZXJPZktleXM6IDUwCisKK3N5c3RlbU1vbml0b3Jpbmc6CisgICAgZW5hYmxlZDogZmFsc2UKKyAgICBpc1Byb3h5OiBmYWxzZQorICAgIHByb2JlSW50ZXJ2YWxJblNlY29uZHM6IDE1CisKK2RlZmF1bHRIZWF0QXJ0aWZhY3RUaW1lb3V0TWludXRlczogNjAKKworc2VydmljZURlcGxveW1lbnRBcnRpZmFjdHM6CisgICAgWUFOR19YTUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIFZORl9DQVRBTE9HOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBNT0RFTF9JTlZFTlRPUllfUFJPRklMRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgTU9ERUxfUVVFUllfU1BFQzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgT1RIRVI6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisKK3Jlc291cmNlRGVwbG95bWVudEFydGlmYWN0czoKKyAgICBIRUFUOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5YW1sCisgICAgICAgICAgICAtIHltbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgSEVBVF9WT0w6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHlhbWwKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBIRUFUX05FVDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIFlBTkdfWE1MOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIFZORl9DQVRBTE9HOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIFZGX0xJQ0VOU0U6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgVkVORE9SX0xJQ0VOU0U6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEU6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgTU9ERUxfUVVFUllfU1BFQzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBBUFBDX0NPTkZJRzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgICAgICAtIGpzb24KKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIE9USEVSOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisKK3Jlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzOgorICAgIEhFQVRfRU5WOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBlbnYKKworcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHM6CisKKworcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydDoKKyAgICAgQ1A6CisgICAgICAgLSB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICAgICAgCitjYXBhYmlsaXRpZXNUb0NvbnN1bWVCZWZvcmVDZXJ0OgorCit1bkxvZ2dlZFVybHM6CisgICAtIC9zZGMyL3Jlc3QvaGVhbHRoQ2hlY2sKKworY2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbjoKKyAgICBjbGVhbkludGVydmFsSW5NaW51dGVzOiAxNDQwCisgICAgY29tcG9uZW50c1RvQ2xlYW46CisgICAgICAgLSBSZXNvdXJjZQorICAgICAgIC0gU2VydmljZQorCithcnRpZmFjdHNJbmRleDogcmVzb3VyY2VzCisKK2Nhc3NhbmRyYUNvbmZpZzoKKyAgICBjYXNzYW5kcmFIb3N0czogWydsb2NhbGhvc3QnXQorICAgIGxvY2FsRGF0YUNlbnRlcjoKKyAgICByZWNvbm5lY3RUaW1lb3V0IDogMzAwMDAKKyAgICBhdXRoZW50aWNhdGU6IGZhbHNlCisgICAgdXNlcm5hbWU6IGtva28KKyAgICBwYXNzd29yZDogYm9ibworICAgIHNzbDogZmFsc2UKKyAgICB0cnVzdHN0b3JlUGF0aCA6IC9wYXRoL3BhdGgKKyAgICB0cnVzdHN0b3JlUGFzc3dvcmQgOiAxMjMxMjMKKyAgICBrZXlTcGFjZXM6CisgICAgICAgIC0geyBuYW1lOiBzZGNhdWRpdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgIC0geyBuYW1lOiBzZGNhcnRpZmFjdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgCitoZWF0RW52QXJ0aWZhY3RIZWFkZXI6CisgICAgIiIKK2hlYXRFbnZBcnRpZmFjdEZvb3RlcjoKKyAgICAiIgorCitvbmJvYXJkaW5nOgorICAgIHByb3RvY29sOiBodHRwCisgICAgaG9zdDogbG9jYWxob3N0CisgICAgcG9ydDogODE4MQorICAgIGRvd25sb2FkQ3NhclVyaTogIi9vbmJvYXJkaW5nY2kvb25icmVzdC9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cy9wYWNrYWdlcyIKKworc3dpdGNob3ZlckRldGVjdG9yOgorICAgIGdCZUZxZG46IAorICAgIGdGZUZxZG46IAorICAgIGJlVmlwOiAxLjIuMy40CisgICAgZmVWaXA6IDEuMi4zLjQKKyAgICBiZVJlc29sdmVBdHRlbXB0czogMworICAgIGZlUmVzb2x2ZUF0dGVtcHRzOiAzCisgICAgZW5hYmxlZDogZmFsc2UKKyAgICBpbnRlcnZhbDogNjAKKyAgICBjaGFuZ2VQcmlvcml0eVVzZXI6IGVjb21wYXNkYworICAgIGNoYW5nZVByaW9yaXR5UGFzc3dvcmQ6IGVjb21wYXNkYzEyMworICAgIHB1Ymxpc2hOZXR3b3JrVXJsOiAiaHR0cDovL2xvY2FsaG9zdC9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL3VwZGF0ZV9uZXR3b3JrP3VzZXI9cm9vdCIKKyAgICBwdWJsaXNoTmV0d29ya0JvZHk6ICd7Im5vdGUiOiJwdWJsaXNoIG5ldHdvcmsifScKKyAgICBncm91cHM6CisgICAgICBiZVNldDogeyBjaGFuZ2VQcmlvcml0eVVybDogImh0dHA6Ly9sb2NhbGhvc3QvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tQkUuZWNvbXAuaWRucy5jaXA/dXNlcj1yb290IiwKKyAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5Qm9keTogJ3sibmFtZSI6IkFJTy1CRS5lY29tcC5pZG5zLmNpcCIsInVyaSI6Ii9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL3NpdGVzL0FJTy1CRS5lY29tcC5pZG5zLmNpcCIsIm5vX2FkX3JlZGlyZWN0aW9uIjpmYWxzZSwidjRncm91cHMiOnsiZmFpbG92ZXJfZ3JvdXBzIjpbIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9tZ19iZSIsIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9ic19iZSJdLCJmYWlsb3Zlcl9wb2xpY3kiOlsiRkFJTEFMTCJdfSwiY29tbWVudCI6IkFJTyBCRSBHLWZxZG4iLCJpbnRlbmRlZF9hcHBfcHJvdG8iOiJETlMifSd9CisgICAgICBmZVNldDogeyBjaGFuZ2VQcmlvcml0eVVybDogImh0dHA6Ly9jb3JhLndlYi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL3NpdGVzL0FJTy1GRS5lY29tcC5pZG5zLmNpcD91c2VyPXJvb3QiLAorICAgICAgICAgICAgICAgY2hhbmdlUHJpb3JpdHlCb2R5OiAneyJjb21tZW50IjoiQUlPIEctZnFkbiIsIm5hbWUiOiJBSU8tRkUuZWNvbXAuaWRucy5jaXAiLCJ2NGdyb3VwcyI6eyJmYWlsb3Zlcl9ncm91cHMiOlsiL2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvZ3JvdXBzL2dyb3VwX21nX2ZlIiwiL2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvZ3JvdXBzL2dyb3VwX2JzX2ZlIl0sImZhaWxvdmVyX3BvbGljeSI6WyJGQUlMQUxMIl19LCJub19hZF9yZWRpcmVjdGlvbiI6ZmFsc2UsImludGVuZGVkX2FwcF9wcm90byI6IkROUyIsInVyaSI6Ii9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL3NpdGVzL0FJTy1GRS5lY29tcC5pZG5zLmNpcC5hdHQuY29tIn0nfQorCisKK2FwcGxpY2F0aW9uTDFDYWNoZToKKyAgICBkYXRhdHlwZXM6CisgICAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICAgICAgZmlyc3RSdW5EZWxheTogMTAKKyAgICAgICAgcG9sbEludGVydmFsSW5TZWM6IDYwCisKK2FwcGxpY2F0aW9uTDJDYWNoZToKKyAgICBlbmFibGVkOiBmYWxzZQorICAgIGNhdGFsb2dMMUNhY2hlOgorICAgICAgICBlbmFibGVkOiB0cnVlCisgICAgICAgIHJlc291cmNlc1NpemVJbkNhY2hlOiAzMDAKKyAgICAgICAgc2VydmljZXNTaXplSW5DYWNoZTogMjAwCisgICAgICAgIHByb2R1Y3RzU2l6ZUluQ2FjaGU6IDEwMAorICAgIHF1ZXVlOgorICAgICAgICBzeW5jSW50ZXJ2YWxJblNlY29uZGVzOiA2MAorICAgICAgICB3YWl0T25TaHV0RG93bkluTWludXRlczogMzAKKyAgICAgICAgbnVtYmVyT2ZDYWNoZVdvcmtlcnM6IDQKKyAgICAgICAgCit0b3NjYVZhbGlkYXRvcnM6CisgICAgc3RyaW5nTWF4TGVuZ3RoOiAxMDI0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvRkNHSV93aXRoX2lucHV0cy5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvRkNHSV93aXRoX2lucHV0cy5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDJjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9GQ0dJX3dpdGhfaW5wdXRzLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvTERTQTFfd2l0aF9pbnB1dHMuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL0xEU0ExX3dpdGhfaW5wdXRzLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1MWNlMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL0xEU0ExX3dpdGhfaW5wdXRzLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHMuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2NzhhNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYS5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGFiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9WRl9SSTJfRzRfd2l0aEFydGlmYWN0c19hLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfYi5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGFlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9WRl9SSTJfRzRfd2l0aEFydGlmYWN0c19iLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfZ3JvdXBfbmFtaW5nLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9WRl9SSTJfRzRfd2l0aEFydGlmYWN0c19ncm91cF9uYW1pbmcuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQ2NGFmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfZ3JvdXBfbmFtaW5nLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfZ3JvdXBfbmFtaW5nX2EuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19hLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4MTlhZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19hLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfZ3JvdXBfbmFtaW5nX2FkZF91cGRhdGUuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19hZGRfdXBkYXRlLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19hZGRfdXBkYXRlLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfZ3JvdXBfbmFtaW5nX2RlbGV0ZV91cGRhdGUuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19kZWxldGVfdXBkYXRlLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MDhkMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL1ZGX1JJMl9HNF93aXRoQXJ0aWZhY3RzX2dyb3VwX25hbWluZ19kZWxldGVfdXBkYXRlLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfdXBkYXRlLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9WRl9SSTJfRzRfd2l0aEFydGlmYWN0c191cGRhdGUuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU0OTdhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvVkZfUkkyX0c0X3dpdGhBcnRpZmFjdHNfdXBkYXRlLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvanNvblByb3BlcnR5VHlwZVRlc3QuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL2pzb25Qcm9wZXJ0eVR5cGVUZXN0LmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhMmVmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL2pzb25Qcm9wZXJ0eVR5cGVUZXN0LmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvbXljb21wdXRlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL215Y29tcHV0ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMGMwMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL215Y29tcHV0ZS55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy5teWNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSAKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICBwcm9wZXJ0eUZvclRlc3Q6CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0ZXN0CisgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICAgICAgZGVmYXVsdDogc3VjY2VzcworICAgICAgICAgICMgbWluX2luc3RhbmNlcyBwcm9wZXJ0eSBzaG91bGQgb3ZlcnJpZGUgcHJvcGVydHkgZnJvbSB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUgCisgICAgICAgICAgbWluX2luc3RhbmNlczogCisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgICAgICBkZWZhdWx0OiAzCisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL215Y29tcHV0ZTIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvbXljb21wdXRlMi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0NzlhMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL215Y29tcHV0ZTIueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMubXljb21wdXRlMjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlIAorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHByb3BlcnR5Rm9yVGVzdDoKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgICAgZGVzY3JpcHRpb246IHRlc3QKKyAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgICAgICBkZWZhdWx0OiBzdWNjZXNzCisgICAgICAgICAgIyBtaW5faW5zdGFuY2VzIHByb3BlcnR5IHNob3VsZCBvdmVycmlkZSBwcm9wZXJ0eSBmcm9tIHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSAKKyAgICAgICAgICBtaW5faW5zdGFuY2VzOiAKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgICAgIGRlZmF1bHQ6IDMKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvbXljb21wdXRlX2ZhaWxlZC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9teWNvbXB1dGVfZmFpbGVkLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ4ZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvbXljb21wdXRlX2ZhaWxlZC55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy5teWNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSAKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICBwcm9wZXJ0eUZvclRlc3Q6CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0ZXN0CisgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICAgICAgZGVmYXVsdDogc3VjY2VzcworICAgICAgICAgICMgbWluX2luc3RhbmNlcyBwcm9wZXJ0eSBzaG91bGQgb3ZlcnJpZGUgcHJvcGVydHkgZnJvbSB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUgCisgICAgICAgICAgbWluX2luc3RhbmNlczogCisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICAgIGRlZmF1bHQ6IDMKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9vcmlnMkcuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDljZDBhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHVjAwMS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHVjAwMS5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTA0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9vcmlnMkdWMDAxLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHVjAwMV9hLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9vcmlnMkdWMDAxX2EuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzM3MWFjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHVjAwMV9hLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHVjAwNi1yZW1vdmUtYWxsLW5lc3RlZC1hcnRpZmFjdHMuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL29yaWcyR1YwMDYtcmVtb3ZlLWFsbC1uZXN0ZWQtYXJ0aWZhY3RzLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOTU1NAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL29yaWcyR1YwMDYtcmVtb3ZlLWFsbC1uZXN0ZWQtYXJ0aWZhY3RzLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHVjAwOC1jaGFuZ2UtbmVzdGVkLW9hbS1maWxlQ29udGVudC5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHVjAwOC1jaGFuZ2UtbmVzdGVkLW9hbS1maWxlQ29udGVudC5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzVhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy9vcmlnMkdWMDA4LWNoYW5nZS1uZXN0ZWQtb2FtLWZpbGVDb250ZW50LmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHX2EuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL29yaWcyR19hLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2YWQxMgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL29yaWcyR19hLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvb3JpZzJHX3VwZGF0ZWQuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL29yaWcyR191cGRhdGVkLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2OGVhYgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL29yaWcyR191cGRhdGVkLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmYuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZhbGlkX3ZmLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiZjE1OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZhbGlkX3ZmLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYS5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYmYxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zl9hLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYi5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGI2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zl9iLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYy5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfYy5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTM1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zl9jLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfZC5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfZC5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NmRmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zl9kLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfZi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmFsaWRfdmZfZi5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTRiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92YWxpZF92Zl9mLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfcmVsYXRlX2J5X2NhcF9uYW1lLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92Zl9yZWxhdGVfYnlfY2FwX25hbWUuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE3ZWZiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfcmVsYXRlX2J5X2NhcF9uYW1lLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92Zl93aXRoX2NhcF9wcm9wX292ZXJyaWRlX2NhcF90eXBlX3Byb3AuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjk4ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wMS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wMS5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTYxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92Zl93aXRoX2NhcF9wcm9wX292ZXJyaWRlX2NhcF90eXBlX3Byb3AxLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wMV9mYWlsZWQuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZmX3dpdGhfY2FwX3Byb3Bfb3ZlcnJpZGVfY2FwX3R5cGVfcHJvcDFfZmFpbGVkLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0NWViZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZmX3dpdGhfY2FwX3Byb3Bfb3ZlcnJpZGVfY2FwX3R5cGVfcHJvcDFfZmFpbGVkLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wX2ZhaWxlZC5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdmZfd2l0aF9jYXBfcHJvcF9vdmVycmlkZV9jYXBfdHlwZV9wcm9wX2ZhaWxlZC5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjM4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9jc2Fycy92Zl93aXRoX2NhcF9wcm9wX292ZXJyaWRlX2NhcF90eXBlX3Byb3BfZmFpbGVkLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY3NhcnMvdm1tY19yZWxhdGVfYnlfY2FwX25hbWUuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZtbWNfcmVsYXRlX2J5X2NhcF9uYW1lLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhMTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2NzYXJzL3ZtbWNfcmVsYXRlX2J5X2NhcF9uYW1lLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9MQU5fQ29ubmVjdG9yL0xBTl9Db25uZWN0b3IuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vTEFOX0Nvbm5lY3Rvci9MQU5fQ29ubmVjdG9yLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmNTkzOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vTEFOX0Nvbm5lY3Rvci9MQU5fQ29ubmVjdG9yLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiTEFOX0Nvbm5lY3Rvci55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAib3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLkNvbm5lY3Rvci5MQU5fQ29ubmVjdG9yIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBMQU5fQ29ubmVjdG9yIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuQ29ubmVjdG9yLkxBTl9Db25uZWN0b3IiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL0xBTl9Db25uZWN0b3IvTEFOX0Nvbm5lY3Rvci55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL0xBTl9Db25uZWN0b3IvTEFOX0Nvbm5lY3Rvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmZjM2OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vTEFOX0Nvbm5lY3Rvci9MQU5fQ29ubmVjdG9yLnltbApAQCAtMCwwICsxLDIzIEBACitvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuQ29ubmVjdG9yLkxBTl9Db25uZWN0b3I6CisgICNUaGUgTEFOX0Nvbm5lY3RvciBub2RlIGNvbm5lY3RzIFJvdXRlciBhbmQgVk5GX0NvbnRhaW5lcgorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLkNvbm5lY3RvcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiAKKyAgICAgICAgI29yIGNhbGxlZDogdmxhbl9pZAorICAgICAgICB0eXBlOiBzdHJpbmcgCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICBuZXR3b3JrX3R5cGU6CisgICAgICAgICNUaGUgdGVjaG5vbG9neSB0eXBlcyB1c2VkIGJ5IExBTiBjb25uZWN0b3IKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgYXR0cmlidXRlczoKKyAgICAgIG5ldHdvcmtfaXBfYWRkcmVzczoKKyAgICAgICAgI2lwIGFkZHJlc3MgaXMgZ2VuZXJhdGVkIG9ubHkgYWZ0ZXIgdGhlIG5vZGUgaXMgaW5zdGFudGlhdGVkIGF0IHJ1bi10aW1lCisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gY29ubmVjdFRvUm91dGVyIDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5Sb3V0ZXIKKyAgICAgIC0gY29ubmVjdFRvVk5GIDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5WTkZfQ29udGFpbmVyCisgICAgICAjVGhlc2UgdHdvIGV4cGxpY2l0IHJlcXVpcmVtZW50cyBzcGVjaWZ5IHRoZSBMQU5fQ29ubmVjdG9yIGhhcyB0d28gImNvbm5lY3RUbyIgdG8gY29ubmVjdCB0byB0aGUgbm9kZSBvZiBSb3V0ZXIgdHlwZSBhbmQgVk5GX0NvbnRhaW5lciB0eXBlIHJlc3BlY3RpdmVseQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9MQU5fQ29ubmVjdG9yL0xBTl9Db25uZWN0b3IuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9MQU5fQ29ubmVjdG9yL0xBTl9Db25uZWN0b3IuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDJmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL0xBTl9Db25uZWN0b3IvTEFOX0Nvbm5lY3Rvci56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkYvVk5GLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL1ZORi9WTkYuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWI0MjZjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkYvVk5GLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiVk5GLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuVk5GIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBWTkYgTm9kZSBUeXBlLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkluZnJhc3RydWN0dXJlIiwKKyAgInRhZ3MiOiBbCisgICAgIm9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5WTkYiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL1ZORi9WTkYueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkYvVk5GLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJlNjIzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkYvVk5GLnltbApAQCAtMCwwICsxLDE2IEBACitvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuVk5GOgorICAjVGhlIFZORiBub2RlIGlzIHJlcXVpcmVkIHRvIGJlIGhvc3RlZCBieSBhIFZORl9Db250YWluZXIKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHNlcnZpY2VfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgYXR0cmlidXRlczoKKyAgICAgICNhdHRyaWJ1dGUgbWVhbnMgdGhlIHZhbHVlIGlzIGZ1bGZpbGxlZCBhdCBydW4tdGltZS4gCisgICAgICBzZXJ2aWNlX2lkOgorICAgICAgI0luIHRoaXMgY2FzZSwgd2UgY29uc2lkZXIgdGhlIFZORiBub2RlIG9ubHkgaGFzIHRoZSBzZXJ2aWNlX2lkIHZhbHVlIHdoZW4gdGhlIG5vZGUgaXMgaW5zdGFudGlhdGVkCisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHJlcXVpcmVtZW50czoKKyAgICAgICN0aGUgImhvc3QiIHJlcXVpcmVtZW50IGNhbiBlc3RhYmxpc2ggdGhlIHJlbGF0aW9uc2hpcCB3aXRoIGEgVk5GX0NvbnRhaW5lciBub2RlCisgICAgICAtIGhvc3QgOgorICAgICAgICAgIGNhcGFiaWxpdHk6IG9yZy5vcGVuZWNvbXAuYXNkYy5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgbm9kZTogb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlZORl9Db250YWluZXIgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkYvVk5GLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vVk5GL1ZORi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxMDgxZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vVk5GL1ZORi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkZfQ29udGFpbmVyL1ZORl9Db250YWluZXIuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vVk5GX0NvbnRhaW5lci9WTkZfQ29udGFpbmVyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzNDc3OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vVk5GX0NvbnRhaW5lci9WTkZfQ29udGFpbmVyLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiVk5GX0NvbnRhaW5lci55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAib3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlZORl9Db250YWluZXIiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIFZORl9Db250YWluZXIgTm9kZSBUeXBlLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkluZnJhc3RydWN0dXJlIiwKKyAgInRhZ3MiOiBbCisgICAgIm9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5WTkZfQ29udGFpbmVyIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkZfQ29udGFpbmVyL1ZORl9Db250YWluZXIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkZfQ29udGFpbmVyL1ZORl9Db250YWluZXIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZGQ4MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkZfQ29udGFpbmVyL1ZORl9Db250YWluZXIueW1sCkBAIC0wLDAgKzEsMTAgQEAKK29yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5WTkZfQ29udGFpbmVyOgorICAjVGhlIFZORl9Db250YWluZXIgbm9kZSBwcm92aWRlcyB0aGUgY2FwYWJpbGl0eSB0byBob3N0IFZORnMuIAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlJvb3QKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgI1RoZSAiaG9zdCIgY2FwYWJpbGl0eSBhbGxvd3Mgb3RoZXIgVE9TQ0Egbm9kZXMgKFZORikgdGhhdCByZXF1aXJlcyBzdWNoIGEgY2FwYWJpbGl0eSB0byBjb25uZWN0IHRvIHRoaXMgbm9kZQorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmFzZGMuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgY29ubmVjdFRvOiAKKyAgICAgICNUaGUgImNvbm5lY3RUbyIgY2FwYWJpbGl0eSBhbGxvd3Mgb3RoZXIgVE9TQ0Egbm9kZXMgKGNvbm5lY3RvcnMpIHRoYXQgcmVxdWlyZXMgc3VjaCBhIGNhcGFiaWxpdHkgdG8gY29ubmVjdCB0byB0aGlzIG5vZGUuICAgIAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmFzZGMuY2FwYWJpbGl0aWVzLkVuZHBvaW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkZfQ29udGFpbmVyL1ZORl9Db250YWluZXIuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9WTkZfQ29udGFpbmVyL1ZORl9Db250YWluZXIuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL1ZORl9Db250YWluZXIvVk5GX0NvbnRhaW5lci56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9XQU5fQ29ubmVjdG9yL1dBTl9Db25uZWN0b3IuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vV0FOX0Nvbm5lY3Rvci9XQU5fQ29ubmVjdG9yLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiMDg4MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vV0FOX0Nvbm5lY3Rvci9XQU5fQ29ubmVjdG9yLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiV0FOX0Nvbm5lY3Rvci55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAib3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLkNvbm5lY3Rvci5XQU5fQ29ubmVjdG9yIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBXQU5fQ29ubmVjdG9yIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuQ29ubmVjdG9yLldBTl9Db25uZWN0b3IiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL1dBTl9Db25uZWN0b3IvV0FOX0Nvbm5lY3Rvci55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL1dBTl9Db25uZWN0b3IvV0FOX0Nvbm5lY3Rvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZDU4NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vV0FOX0Nvbm5lY3Rvci9XQU5fQ29ubmVjdG9yLnltbApAQCAtMCwwICsxLDI1IEBACitvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuQ29ubmVjdG9yLldBTl9Db25uZWN0b3I6CisgICNUaGUgV0FOX0Nvbm5lY3RvciBub2RlIG9ubHkgY29ubmVjdHMgdG8gUm91dGVyCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuQ29ubmVjdG9yCisgICAgcHJvcGVydGllczogCisgICAgICBjdXN0b21lcl9pZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgdnBuX2lkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nIAorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgdnBuX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZyAKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgIG5ldHdvcmtfdHlwZToKKyAgICAgICNUaGUgdGVjaG5vbG9neSB0eXBlcyB1c2VkIGJ5IFdBTiBjb25uZWN0b3IKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgYXR0cmlidXRlczoKKyAgICAgIG5ldHdvcmtfaXBfYWRkcmVzczoKKyAgICAgICAgI2lwIGFkZHJlc3MgaXMgZ2VuZXJhdGVkIG9ubHkgYWZ0ZXIgdGhlIG5vZGUgaXMgaW5zdGFudGlhdGVkIGF0IHJ1bi10aW1lCisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gY29ubmVjdFRvIDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmFzZGMuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICAgICAgbm9kZTogb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlJvdXRlcgorICAgICAgI1RoaXMgZXhwbGljaXQgcmVxdWlyZW1lbnQgc3BlY2lmaWVzIFdBTl9Db25uZWN0b3IgaGFzIG9ubHkgb25lICJjb25uZWN0VG8iIHRvIGNvbm5lY3QgdG8gdGhlIG5vZGUgb2YgUm91dGVyIHR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL1dBTl9Db25uZWN0b3IvV0FOX0Nvbm5lY3Rvci56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL1dBTl9Db25uZWN0b3IvV0FOX0Nvbm5lY3Rvci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5MzgyMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vV0FOX0Nvbm5lY3Rvci9XQU5fQ29ubmVjdG9yLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL2NhcGFiaWxpdHlUeXBlc1dhbkxhbi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL2NhcGFiaWxpdHlUeXBlc1dhbkxhbi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5ODkyMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY2FwYWJpbGl0eVR5cGVzV2FuTGFuLnltbApAQCAtMCwwICsxLDQgQEAKK29yZy5vcGVuZWNvbXAuYXNkYy5jYXBhYmlsaXRpZXMuRW5kcG9pbnQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKK29yZy5vcGVuZWNvbXAuYXNkYy5jYXBhYmlsaXRpZXMuQ29udGFpbmVyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY2FwYWJpbGl0eVR5cGVzV2FuTGFuLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY2FwYWJpbGl0eVR5cGVzV2FuTGFuLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjliZTMyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9jYXBhYmlsaXR5VHlwZXNXYW5MYW4uemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY29ubmVjdG9yL2Nvbm5lY3Rvci5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9jb25uZWN0b3IvY29ubmVjdG9yLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZTg2YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY29ubmVjdG9yL2Nvbm5lY3Rvci5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImNvbm5lY3Rvci55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAib3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLkNvbm5lY3RvciIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgY29ubmVjdG9yIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJBYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuQ29ubmVjdG9yIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9jb25uZWN0b3IvY29ubmVjdG9yLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY29ubmVjdG9yL2Nvbm5lY3Rvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljOTM2MQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY29ubmVjdG9yL2Nvbm5lY3Rvci55bWwKQEAgLTAsMCArMSwxMCBAQAorb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLkNvbm5lY3RvcjoKKyAgI0Nvbm5lY3RvciBpcyB0aGUgcGFyZW50IG5vZGUgb2YgYm90aCBXQU4gYW5kIExBTiBjb25uZWN0b3JzLiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5Sb290CisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBjb25uZWN0VG86IAorICAgICAgICAgIGNhcGFiaWxpdHk6IG9yZy5vcGVuZWNvbXAuYXNkYy5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICAgICAgICAjdGhlIHJlcXVpcmVtZW50IGNhbiBlc3RhYmxpc2ggdGhlIHJlbGF0aW9uc2hpcCB3aXRoIGEgbm9kZSBwcm92aWRpbmcgc3VjaCBjYXBhYmlsaXR5CisgICAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLmFzZGMucmVsYXRpb25zaGlwcy5Db25uZWN0c1RvCisgICAgICAgICAgI29jY3VycmVuY2VzIG1lYW5zIGhvdyBtYW55IHRpbWVzIHRoaXMgcmVxdWlyZW1lbnQgY2FuIGFwcGVhciBpbiBvbmUgbm9kZS4gCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCBVTkJPVU5ERURdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9jb25uZWN0b3IvY29ubmVjdG9yLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY29ubmVjdG9yL2Nvbm5lY3Rvci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzNzMwMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vY29ubmVjdG9yL2Nvbm5lY3Rvci56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9kZWxldGVSZXNvdXJjZXNMYW5XYW5EZW1vLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9kZWxldGVSZXNvdXJjZXNMYW5XYW5EZW1vLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTkyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL2RlbGV0ZVJlc291cmNlc0xhbldhbkRlbW8uc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gdXNhZ2UgeworCWVjaG8gIlVzYWdlOiAkMCA8aG9zdElwPiA8aG9zdFBvcnQ+IgorfQorCitmdW5jdGlvbiBkZWxldGVSZXNvdXJjZSgpIHsKKwkKKwlFTEVNRU5UX05BTUU9JDEKKwllY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJlbW92aW5nIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IFN0YXJ0ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisJY3VybCAtWCAiREVMRVRFIiAtSCAiVVNFUl9JRDogamgwMDAzIiAke0hPU1RfSVB9OiR7SE9TVF9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvcmVzXyR7RUxFTUVOVF9OQU1FfSIuMS4wIgorCWVjaG8gIiIKKwllY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJlbW92aW5nIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisJZWNobyAiIgorCWVjaG8gIiIKKwllY2hvICIiCit9CitpZiBbICQjIC1sdCAyIF0KK3RoZW4KKwl1c2FnZQorCWV4aXQgMgorZmkKKworSE9TVF9JUD0kMQorSE9TVF9QT1JUPSQyCisKKworZGVsZXRlUmVzb3VyY2UgIm9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5Db25uZWN0b3IuTEFOX0Nvbm5lY3RvciIKK2RlbGV0ZVJlc291cmNlICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuQ29ubmVjdG9yLldBTl9Db25uZWN0b3IiCitkZWxldGVSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLkNvbm5lY3RvciIKK2RlbGV0ZVJlc291cmNlICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuVk5GIgorZGVsZXRlUmVzb3VyY2UgIm9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5WTkZfQ29udGFpbmVyIgorZGVsZXRlUmVzb3VyY2UgIm9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5Sb3V0ZXIiCitkZWxldGVSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlJvb3QiCisKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9pbXBvcnRSZXNvdXJjZXNMYW5XYW5EZW1vLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9pbXBvcnRSZXNvdXJjZXNMYW5XYW5EZW1vLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTA2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL2ltcG9ydFJlc291cmNlc0xhbldhbkRlbW8uc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gdXNhZ2UgeworCWVjaG8gIlVzYWdlOiAkMCA8aG9zdElwPiA8aG9zdFBvcnQ+IgorfQorCitmdW5jdGlvbiBhZGRSZXNvdXJjZSgpIHsKKwkKKwlFTEVNRU5UX05BTUU9JDEKKwllY2hvIC1lICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFkZGluZyBFbGVtZW50ICR7RUxFTUVOVF9OQU1FfSBTdGFydCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgorCUNVUlJFTlRfWklQX0ZJTEU9Li8ke0VMRU1FTlRfTkFNRX0vJHtFTEVNRU5UX05BTUV9LnppcAorCUNVUlJFTlRfSlNPTl9GSUxFPS4vJHtFTEVNRU5UX05BTUV9LyR7RUxFTUVOVF9OQU1FfS5qc29uCisJSlNPTl9DT05URU5UPWBwYXN0ZSAtcyAke0NVUlJFTlRfSlNPTl9GSUxFfWAKKwljdXJsIC12IC1GIHJlc291cmNlTWV0YWRhdGE9IiR7SlNPTl9DT05URU5UfSIgLUYgcmVzb3VyY2VaaXA9QCR7Q1VSUkVOVF9aSVBfRklMRX0gLUggIlVTRVJfSUQ6IGpoMDAwMyIgJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL211bHRpcGFydAorCWVjaG8gICIiCisJZWNobyAtZSAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBZGRpbmcgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKworfQoraWYgWyAkIyAtbHQgMiBdCit0aGVuCisJdXNhZ2UKKwlleGl0IDIKK2ZpCisKK0hPU1RfSVA9JDEKK0hPU1RfUE9SVD0kMgorCisjQWRkIFRoZSBDYXBhYmlsaXR5VHlwZXMKK2h0dHBfY29kZT0kKGN1cmwgLXMgLW8gL2Rldi9udWxsIC13ICIle2h0dHBfY29kZX0iIC12IC1GIGNhcGFiaWxpdHlUeXBlWmlwPUBjYXBhYmlsaXR5VHlwZXNXYW5MYW4uemlwIC1IICJVU0VSX0lEOiBqaDAwMDMiICR7SE9TVF9JUH06JHtIT1NUX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3VwbG9hZFR5cGUvY2FwYWJpbGl0eSkKK2lmIFsgJHtodHRwX2NvZGV9IC1lcSAyMDEgIF07IHRoZW4KKwllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIFRoZSBDYXBhYmlsaXR5VHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCitlbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA1MDAgXTsgdGhlbgorCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGYWlsZWQgdG8gYWRkIENhcGFiaWxpdHlUeXBlcyBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKKwlleGl0IDEKK2Vsc2UKKwllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRmFpbGVkIHRvIGFkZCBDYXBhYmlsaXR5VHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZXhpdCAxCitmaQorCithZGRSZXNvdXJjZSAicm9vdCIKK2FkZFJlc291cmNlICJyb3V0ZXIiCithZGRSZXNvdXJjZSAiVk5GX0NvbnRhaW5lciIKK2FkZFJlc291cmNlICJWTkYiCithZGRSZXNvdXJjZSAiY29ubmVjdG9yIgorYWRkUmVzb3VyY2UgIldBTl9Db25uZWN0b3IiCithZGRSZXNvdXJjZSAiTEFOX0Nvbm5lY3RvciIKKworCisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm9vdC9yb290Lmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL3Jvb3Qvcm9vdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Y2JiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL3Jvb3Qvcm9vdC5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogInJvb3QueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAicmVzb3VyY2VOYW1lIjogIm9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5Sb290IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJBYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuUm9vdCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm9vdC9yb290LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm9vdC9yb290LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU3ZDBmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9yb290L3Jvb3QueW1sCkBAIC0wLDAgKzEsMyBAQAorb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlJvb3Q6CisgICNEZWZpbmUgdGhlIHJvb3Qgbm9kZSBmb3IgQVNEQyBtb2RlbGluZworICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm9vdC9yb290LnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm9vdC9yb290LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjYwNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9yb290L3Jvb3QuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm91dGVyL3JvdXRlci5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9yb3V0ZXIvcm91dGVyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllNDY2OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm91dGVyL3JvdXRlci5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogInJvdXRlci55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAib3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlJvdXRlciIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgUm91dGVyIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLmFzZGMubm9kZXMuUm91dGVyIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZGVtb1Jlc291cmNlc1dhbkxhbi9yb3V0ZXIvcm91dGVyLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm91dGVyL3JvdXRlci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5ODY2MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm91dGVyL3JvdXRlci55bWwKQEAgLTAsMCArMSwxMyBAQAorb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLlJvdXRlcjoKKyAgI1RoZSBSb3V0ZXIgbm9kZSBoYXMgYSBwcm9wZXJ0eSAicm91dGluZ190YWJsZSIgd2hpY2ggaXMgYSBsaXN0LiBUaGUgZW50cnkgb2YgdGhlIHJvdXRpbmdfdGFibGUgaXMgdGhlIGN1c3RvbWl6ZWQgZGF0YSB0eXBlICJSb3V0aW5nVGFibGVFbnRyeSIKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICByb3V0aW5nX3RhYmxlOiAKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgIyJlbnRyeV9zY2hlbWEiIGlzIHRoZSBUT1NDQSBzcGVjIHRvIGRlc2NyaWJlIHRoZSB0eXBlIG9mIHRoZSBsaXN0IGl0ZW0KKyAgICAgICAgdHlwZTogUm91dGluZ1RhYmxlRW50cnkKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBjb25uZWN0VG86IAorICAgICAgICAjVGhlICJjb25uZWN0VG8iIGNhcGFiaWxpdHkgYWxsb3dzIG90aGVyIFRPU0NBIG5vZGVzIChjb25uZWN0b3JzKSB0aGF0IHJlcXVpcmVzIHN1Y2ggYSBjYXBhYmlsaXR5IHRvIGNvbm5lY3QgdG8gdGhpcyBub2RlLiAgICAKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5hc2RjLmNhcGFiaWxpdGllcy5FbmRwb2ludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2RlbW9SZXNvdXJjZXNXYW5MYW4vcm91dGVyL3JvdXRlci56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL3JvdXRlci9yb3V0ZXIuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZmY4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9kZW1vUmVzb3VyY2VzV2FuTGFuL3JvdXRlci9yb3V0ZXIuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDRlMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvZXJyb3ItY29uZmlndXJhdGlvbi55YW1sCkBAIC0wLDAgKzEsMTU3NiBAQAor77u/IyBFcnJvcnMKK2Vycm9yczoKKyAgICBPSzogeworICAgICAgICBjb2RlOiAyMDAsCisgICAgICAgIG1lc3NhZ2U6ICJPSyIKKyAgICB9CisgICAgQ1JFQVRFRDogeworICAgICAgICBjb2RlOiAyMDEsCisgICAgICAgIG1lc3NhZ2U6ICJPSyIKKyAgICB9CisgICAgTk9fQ09OVEVOVDogeworICAgICAgICBjb2RlOiAyMDQsCisgICAgICAgIG1lc3NhZ2U6ICJObyBDb250ZW50IgorICAgIH0KKyMtLS0tLS0tLVBPTDQwNTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgTk9UX0FMTE9XRUQ6IHsKKyAgICAgICAgY29kZTogNDA1LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1ldGhvZCBub3QgYWxsb3dlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w0MDUwIgorICAgIH0KKyMtLS0tLS0tLVBPTDUwMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgR0VORVJBTF9FUlJPUjogeworICAgICAgICBjb2RlOiA1MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW50ZXJuYWwgU2VydmVyIEVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDUwMDAiCisgICAgfQorIy0tLS0tLS0tLVBPTDUwMDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIE1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRDogeworICAgICAgICBjb2RlOiA0MDAgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nICdYLUVDT01QLUluc3RhbmNlSUQnIEhUVFAgaGVhZGVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDUwMDEiCisgICAgfQorIy0tLS0tLS0tLVBPTDUwMDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIEFVVEhfUkVRVUlSRUQ6IHsKKyAgICAgICAgY29kZTogNDAxICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBBUEkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMiIKKyAgICB9CisjLS0tLS0tLS0tUE9MNTAwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgQVVUSF9GQUlMRUQ6IHsKKyAgICAgICAgY29kZTogNDAzICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBBUEkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfQ09OVEVOVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX0lORk9STUFUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nIGluZm9ybWF0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gVXNlcnMncyBVU0VSX0lEICAgICAKKyAgICBVU0VSX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXNlciAnJTEnIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgZW1haWwgYWRkcmVzcyAgICAgCisgICAgSU5WQUxJRF9FTUFJTF9BRERSRVNTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGVtYWlsIGFkZHJlc3MgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHJvbGUKKyAgICBJTlZBTElEX1JPTEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgcm9sZSAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gVXNlcnMncyBVU0VSX0lEICAgICAKKyAgICBVU0VSX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgd2l0aCAnJTEnIElEIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgREVMRVRFX1VTRVJfQURNSU5fQ09ORkxJQ1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFuIGFkbWluaXN0cmF0b3IgY2FuIG9ubHkgYmUgZGVsZXRlZCBieSBhbm90aGVyIGFkbWluaXN0cmF0b3IuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgdXNlcklkICAgICAKKyAgICBJTlZBTElEX1VTRVJfSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgdXNlcklkICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwOCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA0OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX01JU1NJTkdfQ09OVEFDVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGNvbnRhY3QgaWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA0OSIKKyAgICB9IAorIy0tLS0tLS0tLVNWQzQwNTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlL0FkZGl0aW9uYWwgcGFyYW1ldGVyCisjICUyIC0gc2VydmljZS9yZXNvdXJjZS9sYWJlbCBuYW1lCisgICAgQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgd2l0aCBuYW1lICclMicgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSByZXNvdXJjZS9zZXJ2aWNlIAorICAgIENPTVBPTkVOVF9NSVNTSU5HX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgJTEgY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1MSIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDUyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIENPTVBPTkVOVF9NSVNTSU5HX1RBR1M6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXQgbGVhc3Qgb25lIHRhZyBoYXMgdG8gYmUgc3BlY2lmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTIiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyAlMSBkZXNjcmlwdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDUzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDU0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTEgLSByZXNvdXJjZS9zZXJ2aWNlCisgICAgQ09NUE9ORU5UX0lOVkFMSURfQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gSW52YWxpZCAlMSBjYXRlZ29yeS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDU0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDU1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfVkVORE9SX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyB2ZW5kb3IgbmFtZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDU1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDU2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfVkVORE9SX1JFTEVBU0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyB2ZW5kb3IgcmVsZWFzZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDU2IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNTctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgIE1JU1NJTkdfREVSSVZFRF9GUk9NX1RFTVBMQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgZGVyaXZlZCBmcm9tIHRlbXBsYXRlIHNwZWNpZmljYXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDU4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHNlcnZpY2UvcmVzb3VyY2UKKyAgICBDT01QT05FTlRfTUlTU0lOR19JQ09OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgJTEgaWNvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDU4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDU5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHNlcnZpY2UvcmVzb3VyY2UKKyAgICBDT01QT05FTlRfSU5WQUxJRF9JQ09OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEludmFsaWQgJTEgaWNvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDU5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDYwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBQQVJFTlRfUkVTT1VSQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIERlcml2ZWQgZnJvbSByZXNvdXJjZSB0ZW1wbGF0ZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgIE1VTFRJUExFX1BBUkVOVF9SRVNPVVJDRV9GT1VORDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNdWx0aXBsZSBkZXJpdmVkIGZyb20gcmVzb3VyY2UgdGVtcGxhdGUgaXMgbm90IGFsbG93ZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MSIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDYyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHNlcnZpY2UvcmVzb3VyY2UKKyAgICBNSVNTSU5HX0NPTVBPTkVOVF9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgJTEgbmFtZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDYyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDYzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICAjJTHCoCAtwqAgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorICAgIFJFU09VUkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDYzIgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorICAgIENPTVBPTkVOVF9JTlZBTElEX0RFU0NSSVBUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGRlc2NyaXB0aW9uIGNvbnRhaW5zIG5vbi1lbmdsaXNoIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gbWF4IHJlc291cmNlL3NlcnZpY2UgbmFtZSBsZW5ndGggCisgICAgQ09NUE9ORU5UX0RFU0NSSVBUSU9OX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgZGVzY3JpcHRpb24gZXhjZWVkcyBsaW1pdCBvZiAlMiBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gbWF4IGxlbmd0aCAgIAorICAgIENPTVBPTkVOVF9UQUdTX0VYQ0VFRF9MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUYWdzIG92ZXJhbGwgbGVuZ3RoIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDY3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWF4IGxlbmd0aCAgCisgICAgVkVORE9SX05BTUVfRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBWZW5kb3IgbmFtZSBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIG1heCBsZW5ndGggIAorICAgIFZFTkRPUl9SRUxFQVNFX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVmVuZG9yIHJlbGVhc2UgZXhjZWVkcyBsaW1pdCBvZiAlMSBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjgiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA2OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlL1Byb2R1Y3QKKyAgICBDT01QT05FTlRfSU5WQUxJRF9DT05UQUNUX0lEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGNvbnRhY3QgaWQgc2hvdWxkIGJlIGluIGZvcm1hdCAnbW5ubm5ubicgb3IgJ2Fhbm5uYScgb3IgJ2Fhbm5ubicsIHdoZXJlIG09bSAsYT1hLXpBLVogYW5kIG49MC05IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA3MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisgICAgSU5WQUxJRF9DT01QT05FTlRfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBuYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDcxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfVkVORE9SX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgQ29udGVudC4gVmVuZG9yIG5hbWUgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBjaGFyYWN0ZXJzIGxpa2UgPD46IlwvfD8qIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gcmVndWxhciBzcGFjZS4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDcxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDcyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfVkVORE9SX1JFTEVBU0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgQ29udGVudC4gVmVuZG9yIHJlbGVhc2UgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBjaGFyYWN0ZXJzIGxpa2UgPD46IlwvfD8qIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gcmVndWxhciBzcGFjZS4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDcyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDczLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyMgJTIgLSBtYXggIHJlc291cmNlL3NlcnZpY2UgbmFtZSAgCisgICAgQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBuYW1lIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDczIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDgwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfSU5fQ0hFQ0tPVVRfU1RBVEU6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIGxvY2tlZCBmb3IgbW9kaWZpY2F0aW9uIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDgxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEwqBvZsKgbGFzdCBtb2RpZmllcgorICAgIENPTVBPTkVOVF9JTl9DRVJUX0lOX1BST0dSRVNTX1NUQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiBpcyBsb2NrZWQgZm9yIGNlcnRpZmljYXRpb24gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODEiCisgICAgfQorCisjLS0tLS0tLS0tLS1TVkM0MDgyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfU0VOVF9GT1JfQ0VSVElGSUNBVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgc2VudCBmb3IgY2VydGlmaWNhdGlvbiBieSAlMyAlNCglNSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4MiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MDgzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ09NUE9ORU5UX1ZFUlNJT05fQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVmVyc2lvbiBvZiB0aGlzICUxIHdhcyBhbHJlYWR5IHByb21vdGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODMiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfQUxSRUFEWV9DSEVDS0VEX0lOOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mICclMScgJTIgd2FzIGFscmVhZHkgY2hlY2tlZC1pbiBieSAlMyAlNCglNSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4NCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MDg1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlL3Byb2R1Y3TCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0CisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEwqBvZsKgbGFzdCBtb2RpZmllcgorICAgIENPTVBPTkVOVF9DSEVDS09VVF9CWV9BTk9USEVSX1VTRVI6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICUyIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBvdXQgYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODUiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgIC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoCAtIHJlc291cmNlL3NlcnZpY2UKKyAgICBDT01QT05FTlRfSU5fVVNFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiBpcyBpbiB1c2UgYnkgYW5vdGhlciB1c2VyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODYiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLSBjb21wb25lbnTCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0CisgICAgQ09NUE9ORU5UX0hBU19ORVdFUl9WRVJTSU9OOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBDaGVja2luZyBvdXQgb2YgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIG9mIHRoZSAnJTEnICUyIGlzIG5vdCBhbGxvd2VkIGFzIGEgbmV3ZXIgdmVyc2lvbiBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4NyIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MDg4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0FMUkVBRFlfQ0VSVElGSUVEOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJTEgJTIgaGFzIGFscmVhZHkgYmVlbiBjZXJ0aWZpZWQgYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisgICAgQ09NUE9ORU5UX05PVF9SRUFEWV9GT1JfQ0VSVElGSUNBVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgbm90IHJlYWR5IGZvciBjZXJ0aWZpY2F0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODkiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxwqAtwqBwcm9wZXJ0ecKgbmFtZQorICAgIFBST1BFUlRZX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcHJvcGVydHkgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTAwIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBQUk9QRVJUWV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBQcm9wZXJ0eSB3aXRoICclMScgbmFtZSBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTAxIgorICAgIH0KKworIy0tLS0tLS0tLS0tU1ZDNDEwMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgY2FwYWJpbGl0eSB0eXBlIG5hbWUgCisgICAgQ0FQQUJJTElUWV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IENhcGFiaWxpdHkgVHlwZSB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTAyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBVVRIX0ZBSUxFRF9JTlZBTElERV9IRUFERVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQXV0aG9yaXphdGlvbiBoZWFkZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDExNCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTE1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBjYXBhYmlsaXR5IHR5cGUgbmFtZSAKKyAgICBNSVNTSU5HX0NBUEFCSUxJVFlfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIENhcGFiaWxpdHkgVHlwZSAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTUiCisgICAgfQorICAgIFJFU09VUkNFX0lOU1RBTkNFX0JBRF9SRVFVRVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDExNiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTE3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqByZXNvdXJjZSBpbnN0YW5jZSBuYW1lCisjICUywqAtwqByZXNvdXJjZSBpbnN0YW5jZSBuYW1lCisjICUzwqAtwqByZXF1aXJlbWVudCBuYW1lCisgICAgUkVTT1VSQ0VfSU5TVEFOQ0VfTUFUQ0hfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNYXRjaCBub3QgZm91bmQgYmV0d2VlbiByZXNvdXJjZSBpbnN0YW5jZSAnJTEnIGFuZCByZXNvdXJjZSBpbnN0YW5jZSAnJTInIGZvciByZXF1aXJlbWVudCAnJTMnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTciCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlMsKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlM8KgLcKgcmVxdWlyZW1lbnQgbmFtZQorICAgIFJFU09VUkNFX0lOU1RBTkNFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc291cmNlIGluc3RhbmNlcyAnJTEnIGFuZCAnJTInIGFyZSBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCByZXF1aXJlbWVudCAnJTMnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlMsKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlM8KgLcKgcmVxdWlyZW1lbnQgbmFtZQorICAgIFJFU09VUkNFX0lOU1RBTkNFX1JFTEFUSU9OX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTm8gcmVsYXRpb24gZm91bmQgYmV0d2VlbiByZXNvdXJjZSBpbnN0YW5jZXMgJyUxJyBhbmQgJyUyJyBmb3IgcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoFVzZXIncyBVU0VSX0lECisgICAgVVNFUl9JTkFDVElWRTogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXNlciAlMSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjAiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgVXNlcidzIFVTRVJfSUQKKyAgICBVU0VSX0hBU19BQ1RJVkVfRUxFTUVOVFM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgd2l0aCAlMSBJRCBjYW4gbm90IGJlIGRlbGV0ZWQgc2luY2UgaXQgaGFzIGFjdGl2ZSBlbGVtZW50cyhyZXNvdXJjZXMvc2VydmljZXMvYXJ0aWZhY3RzKS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIxIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoGFydGlmYWN0IHR5cGUKKyAgICBBUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgYXJ0aWZhY3QgdHlwZSAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFSVElGQUNUX0xPR0lDQUxfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgbG9naWNhbCBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjMiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfQVJUSUZBQ1RfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBhcnRpZmFjdCB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMS1hcnRpZmFjdCBuYW1lCisgICAgQVJUSUZBQ1RfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICclMScgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEyNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDEyNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0Ly4uLgorIyAlMsKgLSBmaWVsZCAodGFnLCB2ZW5kb3IgbmFtZS4uLikKKyAgICBJTlZBTElEX0ZJRUxEX0ZPUk1BVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogIEludmFsaWQgJTEgJTIgZm9ybWF0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjYiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFSVElGQUNUX0lOVkFMSURfTUQ1OiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGFydGlmYWN0IGNoZWNrc3VtLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjciCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfQVJUSUZBQ1RfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBNaXNzaW5nIGFydGlmYWN0IG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEyOCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTI5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTUlTU0lOR19QUk9KRUNUX0NPREU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBQUk9KRUNUX0NPREUgbnVtYmVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjkiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElOVkFMSURfUFJPSkVDVF9DT0RFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFBST0pFQ1RfQ09ERSBudW1iZXIgbXVzdCBiZSBudW1lcmljIGZyb20gNSB1cCB0byAxMCBkaWdpdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzMCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTMxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxLXJlc291cmNlL3NlcnZpY2UKKyMgJTItc3J0aWZhY3QvYXJ0aWZhY3RzCisjICUzLXNlbWljb2xvbW4gc2VwYXJhdGVkIGxpc3Qgb2YgYXJ0aWZhY3QgCisgICAgQ09NUE9ORU5UX01JU1NJTkdfTUFOREFUT1JZX0FSVElGQUNUUzogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBtYW5kYXRvcnkgaW5mb3JtYXRpb25hbCAlMSAlMjogWyUzXS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTMxIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBsaWZlY3ljbGUgIHR5cGUgbmFtZQorICAgIExJRkVDWUNMRV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IExpZmVjeWNsZSBUeXBlIHdpdGggbmFtZSAnJTEnIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHNlcnZpY2UgdmVyc2lvbgorIyAlMiAtIHNlcnZpY2UgbmFtZQorICAgIFNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBWZXJzaW9uICUxIG9mICclMicgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIGZvciBkaXN0cmlidXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzMyIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTM0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTUlTU0lOR19MSUZFQ1lDTEVfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIGludGVyZmFjZSBsaWZlLWN5Y2xlIHR5cGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDEzNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTZXJ2aWNlIGNhdGVnb3J5IGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHNlcnZpY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gZGlzdHJpYnV0aW9uIGVudmlyb25tZW50IG5hbWUgICAgCisgICAgRElTVFJJQlVUSU9OX0VOVklST05NRU5UX05PVF9BVkFJTEFCTEU6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gZW52aXJvbm1lbnQgJyUxJyBpcyBub3QgYXZhaWxhYmxlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gZGlzdHJpYnV0aW9uIGVudmlyb25tZW50IG5hbWUgICAgCisgICAgRElTVFJJQlVUSU9OX0VOVklST05NRU5UX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCAnJTEnIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDEzOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgRElTVFJJQlVUSU9OX0VOVklST05NRU5UX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgZGlzdHJpYnV0aW9uIGVudmlyb25tZW50LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorIyAlMSAtIHNlcnZpY2UgbmFtZQorICAgIERJU1RSSUJVVElPTl9BUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFNlcnZpY2UgJyUxJyBjYW5ub3QgYmUgZGlzdHJpYnV0ZWQgZHVlIHRvIG1pc3NpbmcgZGVwbG95bWVudCBhcnRpZmFjdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDIwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gbWF4IGljb24gbmFtZSBsZW5ndGggICAKKyAgICBDT01QT05FTlRfSUNPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGljb24gbmFtZSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDIwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDMwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNUUklDVEVEX0FDQ0VTUzogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzdHJpY3RlZCBhY2Nlc3MuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDMwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDMwMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNUUklDVEVEX09QRVJBVElPTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzdHJpY3RlZCBvcGVyYXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDMwMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgTUlTU0lOR19CT0RZOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgcmVxdWVzdCBib2R5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX1BVQkxJQ19LRVk6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgJ2FwaVB1YmxpY0tleScuIiAsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZfRE9FU19OT1RfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAgQm9keSAgOiBNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgJ2Rpc3RyRW52TmFtZScuIiAsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDUwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHNlcnZpY2UgbmFtZQorICAgIFNFUlZJQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyBzZXJ2aWNlIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwMyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTA0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyMgJTIgLSBzZXJ2aWNlL3Jlc291cmNlIHZlcnNpb24KKyAgICBDT01QT05FTlRfVkVSU0lPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIHZlcnNpb24gJTIgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA0IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ1MDUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjJTEtYXJ0aWZhY3QgbmFtZQorIAorICAgIEFSVElGQUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTU0lOR19FTlZfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlciAnZGlzdHJFbnZOYW1lJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTA3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIENPTVBPTkVOVF9JTlZBTElEX1RBR1NfTk9fQ09NUF9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE9uZSBvZiB0aGUgdGFncyBzaG91bGQgYmUgdGhlIGNvbXBvbmVudCBuYW1lLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDciCisgICAgfQorIAorIy0tLS0tLS0tLVNWQzQ1MDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTZXJ2aWNlIG5hbWUgY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgc2VydmljZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwOCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTA5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFNFUlZJQ0VfSUNPTl9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSWNvbiBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSBzZXJ2aWNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTEwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGljb24gbmFtZSBtYXggbGVuZ3RoCisgICAgU0VSVklDRV9JQ09OX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gSWNvbiBuYW1lIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTEwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTExLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIERJU1RSSUJVVElPTl9SRVFVRVNURURfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBEaXN0cmlidXRpb24gSUQKKyAgICBESVNUUklCVVRJT05fUkVRVUVTVEVEX0ZBSUxFRDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiAnJTEnIGZhaWxlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTEyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSBjYXRlZ29yeSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lDT05fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEljb24gY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgcmVzb3VyY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfVkVORE9SX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZlbmRvciBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0RFUklWRURfRlJPTV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRGVyaXZlZCBmcm9tIHJlc291cmNlIHRlbXBsYXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIG1heCBsZW5ndGggCisgICAgQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFNpbmdsZSB0YWcgZXhjZWVkcyBsaW1pdCBvZiAlMSBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9ERUZBVUxUX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBtaXNtYXRjaCBpbiBkYXRhLXR5cGUgb2NjdXJyZWQgZm9yIHByb3BlcnR5ICUxLiBkYXRhIHR5cGUgaXMgJTIgYW5kIGRlZmF1bHQgdmFsdWUgZm91bmQgaXMgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlIG9yIHJlc291cmNlIAorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fTUFYX05VTUJFUl9SRUFDSEVEOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNYXhpbWFsIG51bWJlciBvZiBhZGRpdGlvbmFsICUxIHBhcmFtZXRlcnMgd2FzIHJlYWNoZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fRU1QVFlfU1RSSU5HX05PVF9BTExPV0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxhYmVsIGFuZCB2YWx1ZSBjYW5ub3QgYmUgZW1wdHkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBsYWJlbC92YWx1ZQorIyAlMiAtIE1heGltYWwgbGVuZ3RoIG9mICUxCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gJTEgZXhjZWVkcyBsaW1pdCBvZiAlMiBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX0tFWV9OT1RfQUxMT1dFRF9DSEFSQUNURVJTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGFiZWwgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBjaGFyYWN0ZXJzIGxpa2UgPD46IlwvfD8qIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gcmVndWxhciBzcGFjZS4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTIzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX1ZBTFVFX05PVF9BTExPV0VEX0NIQVJBQ1RFUlM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgQ29udGVudC4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBjb250YWlucyBub24tZW5nbGlzaCBjaGFyYWN0ZXJzLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyByZXNvdXJjZSBpbnN0YW5jZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgQVNEQ19WRVJTSU9OX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA1MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogQVNEQyB2ZXJzaW9uIGNhbm5vdCBiZSBkaXNwbGF5ZWQuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEtYXJ0aWZhY3QgdXJsL2FydGlmYWN0IGxhYmVsL2FydGlmYWN0IGRlc2NyaXB0aW9uL1ZORiBTZXJ2aWNlIEluZGljYXRvcgorICAgIE1JU1NJTkdfREFUQTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBNaXNzaW5nICUxLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxLWFydGlmYWN0IHVybC9hcnRpZmFjdCBsYWJlbC9hcnRpZmFjdCBkZXNjcmlwdGlvbi9hcnRpZmFjdCBuYW1lCisjICUyIC0gTWF4aW1hbCBsZW5ndGggb2YgJTEKKyAgICBFWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTMwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEFSVElGQUNUX0lOVkFMSURfVElNRU9VVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBcnRpZmFjdCBUaW1lb3V0IHNob3VsZCBiZSBzZXQgdG8gdmFsaWQgcG9zaXRpdmUgbm9uLXplcm8gbnVtYmVyIG9mIG1pbnV0ZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0lTX1ZORl9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVk5GIEluZGljYXRvciBjYW5ub3QgYmUgdXBkYXRlZCBmb3IgY2VydGlmaWVkIHNlcnZpY2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzMSIKKyAgICB9CisgIy0tLS0tLS0tLVNWQzQ1MzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EX09OX1NFUlZJQ0U6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHJlc291cmNlIGluc3RhbmNlIHdhcyBub3QgZm91bmQgb24gdGhlIHNlcnZpY2UgJyUyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzIiCisgICAgfQorICMtLS0tLS0tLS1TVkM0NTMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICMgJTEgLSAgIkhFQVQiLyJIRUFUX0VOViIvIk1VUkFOT19QS0ciLyJZQU5HX1hNTCIgCisgICAgV1JPTkdfQVJUSUZBQ1RfRklMRV9FWFRFTlNJT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgZmlsZSBleHRlbnNpb24gZm9yICUxIGFydGlmYWN0IHR5cGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzMyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTM0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSEVBVCIvIkhFQVRfRU5WIiAgICAgICAgICAgICAKKyAgICBJTlZBTElEX1lBTUw6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVwbG9hZGVkIFlBTUwgZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTM0IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQ1MzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gICJIRUFUIiAgICAgICAgICAgICAKKyAgICBJTlZBTElEX0RFUExPWU1FTlRfQVJUSUZBQ1RfSEVBVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSBhcnRpZmFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisjICUyIC0gIHJlc291cmNlL3NlcnZpY2UgbmFtZSAKKyMgJTMgLSAgIkhFQVQiLyJIRUFUX0VOViIvIk1VUkFOT19QS0ciIAorIyAlNCAtICAiSEVBVCIvIkhFQVRfRU5WIi8iTVVSQU5PX1BLRworICAgIERFUExPWU1FTlRfQVJUSUZBQ1RfT0ZfVFlQRV9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgJyUyJyBhbHJlYWR5IGhhcyBhIGRlcGxveW1lbnQgYXJ0aWZhY3Qgb2YgJTMgdHlwZSAuUGxlYXNlIGRlbGV0ZSBvciB1cGRhdGUgYW4gZXhpc3RpbmcgJTQgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNiIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTM3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfSEVBVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBIRUFUIGFydGlmYWN0LiBIRUFUX0VOViBhcnRpZmFjdCBjYW5ub3QgYmUgdXBsb2FkZWQgd2l0aG91dCBjb3JyZXNwb25kaW5nIEhFQVQgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNNQVRDSF9IRUFUX1ZTX0hFQVRfRU5WOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGFydGlmYWN0IGNvbnRlbnQuIFBhcmFtZXRlcidzIHNldCBpbiBIRUFUX0VOViAnJTEnIGFydGlmYWN0IGRvZXNuJ3QgbWF0Y2ggdGhlIHBhcmFtZXRlcnMgaW4gSEVBVCAnJTInIGFydGlmYWN0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9SRVNPVVJDRV9QQVlMT0FEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJlc291cmNlIHBheWxvYWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1RPU0NBX0ZJTEVfRVhURU5TSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGZvciBUT1NDQSB0ZW1wbGF0ZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfWUFNTF9GSUxFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIFlBTUwgZmlsZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfVE9TQ0FfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgVE9TQ0EgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBOT1RfUkVTT1VSQ0VfVE9TQ0FfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEltcG9ydGVkIFNlcnZpY2UgVE9TQ0EgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBOT1RfU0lOR0xFX1JFU09VUkNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBUT1NDQSB0ZW1wbGF0ZSBzaG91bGQgY29udGFpbiBvbmUgcmVzb3VyY2UgZGVmaW5pdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQ0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQ1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfUkVTT1VSQ0VfTkFNRVNQQUNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJlc291cmNlIG5hbWVzcGFjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQ1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQ2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBpbiBBU0RDIENhdGFsb2cuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1JFU09VUkNFX0NIRUNLU1VNOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJlc291cmNlIGNoZWNrc3VtLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgIyUxwqAgLcKgIENvbnN1bWVyIHNhbHQKKyAgICBJTlZBTElEX0xFTkdUSDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSBsZW5ndGguIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1MCIKKyAgICB9CisgICAgIy0tLS0tLS0tLVNWQzQ1NTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgICMlMcKgIC3CoCBFQ09NUCBVc2VyIG5hbWUKKyAgICBFQ09NUF9VU0VSX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRUNPTVAgVXNlciAnJTEnIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENPTlNVTUVSX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBFQ09NUCBVc2VyIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMlMcKgIC3CoCBDb25zdW1lciBuYW1lIC8gQ29uc3VtZXIgcGFzc3dvcmQvIENvbnN1bWVyIHNhbHQgCisgICAgSU5WQUxJRF9DT05URU5UX1BBUkFNOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBpcyBpbnZhbGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTMiCisgICAgfQorICAgICMtLS0tLS0tLS1TVkM0NTU0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisgICAgQ09NUE9ORU5UX0FSVElGQUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGFydGlmYWN0IGRvZXNuJ3QgYmVsb25nIHRvIHNwZWNpZmllZCAlMS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gIlNlcnZpY2UgbmFtZSIKKyAgICBTRVJWSUNFX0RFUExPWU1FTlRfQVJUSUZBQ1RfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyBzZXJ2aWNlIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4gU2VydmljZSBoYXMgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgZGVwbG95bWVudCBhcnRpZmFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyUxIC0gIlJlc291cmNlIi8iU2VydmljZSIvIlByb2R1Y3QiCisjJTIgLSAiY2F0ZWdvcnkiCisgICAgQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSAlMiBuYW1lIGxlbmd0aC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyUxIC0gIlJlc291cmNlIi8iU2VydmljZSIvIlByb2R1Y3QiCisjJTIgLSAiY2F0ZWdvcnkiCisgICAgQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSAlMiBuYW1lIGZvcm1hdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyUxIC0gIlJlc291cmNlIi8iU2VydmljZSIvIlByb2R1Y3QiCisjJTIgLSAiY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfQ0FURUdPUllfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGNhdGVnb3J5IG5hbWUgJyUyJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBWQUxJREFURURfUkVTT1VSQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTdWJtaXQgZm9yIFRlc3RpbmcgaXMgbm90IHBlcm1pdHRlZCBhcyB5b3VyICclMScgaW5jbHVkZXMgbm9uLXZhbGlkYXRlZCAnJTInIHJlc291cmNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAic2VydmljZSIvIlZGIgorIyAlMiAtICJSZXNvdXJjZSBuYW1lIgorICAgIEZPVU5EX0FMUkVBRFlfVkFMSURBVEVEX1JFU09VUkNFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTdWJtaXQgZm9yIFRlc3RpbmcgaXMgbm90IHBlcm1pdHRlZCBhcyB5b3VyICclMScgaW5jbHVkZXMgbm9uLXZhbGlkYXRlZCAnJTInIHJlc291cmNlLiBQbGVhc2UgdXNlIGFscmVhZHkgYXZhaWxhYmxlIHZhbGlkYXRlZCByZXNvdXJjZSB2ZXJzaW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAic2VydmljZSIvIlZGIgorIyAlMiAtICJSZXNvdXJjZSBuYW1lIgorICAgIEZPVU5EX0xJU1RfVkFMSURBVEVEX1JFU09VUkNFUzogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4gUGxlYXNlIHVzZSBvbmUgb2YgYXZhaWxhYmxlIHZhbGlkYXRlZCByZXNvdXJjZSB2ZXJzaW9ucy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTYwIgorICAgIH0gIAorIy0tLS0tLS0tLVNWQzQ1NjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAicmVzb3VyY2UiLyJwcm9kdWN0IgorIyAlMiAtICJjYXRlZ29yeSIKKyMgJTIgLSAiY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJTEgJTIgJyUzJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiUmVzb3VyY2UiLyJQcm9kdWN0IgorIyAlMiAtICJzdWItY2F0ZWdvcnkgbmFtZSIKKyMgJTIgLSAiY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfU1VCX0NBVEVHT1JZX0VYSVNUU19GT1JfQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIHN1Yi1jYXRlZ29yeSAnJTInIGFscmVhZHkgZXhpc3RzIHVuZGVyICclMycgY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJQcm9kdWN0IgorIyAlMiAtICJncm91cGluZyBuYW1lIgorIyAlMiAtICJzdWItY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfR1JPVVBJTkdfRVhJU1RTX0ZPUl9TVUJfQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGdyb3VwaW5nICclMicgYWxyZWFkeSBleGlzdHMgdW5kZXIgJyUzJyBzdWItY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gcHJvZHVjdMKgbmFtZQorICAgIFBST0RVQ1RfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyBwcm9kdWN0IHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiSEVBVCIgICAKKyMgJTIgIC0gcGFyYW1ldGVyIHR5cGUgKCJzdHJpbmciICwgImJvb2xlYW4iICwgIm51bWJlciIpIAorIyAlMyAtICBwYXJhbWV0ZXIgbmFtZQorICAgIElOVkFMSURfSEVBVF9QQVJBTUVURVJfVkFMVUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgYXJ0aWZhY3QuIEludmFsaWQgJTIgdmFsdWUgc2V0IGZvciAnJTMnIHBhcmFtZXRlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJIRUFUIiAgIAorIyAlMiAgLSBwYXJhbWV0ZXIgdHlwZSAoInN0cmluZyIgLCAiYm9vbGVhbiIgLCAibnVtYmVyIikgCisgICAgSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkICUxIGFydGlmYWN0LiBVbnN1cHBvcnRlZCAnJTInIHBhcmFtZXRlciB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gICJZQU5HX1hNTCIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9YTUw6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVwbG9hZGVkIFhNTCBmaWxlIGZvciAlMSBhcnRpZmFjdCBpcyBpbnZhbGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIlVzZXIgTmFtZSBhbmQgVXNlcklkIiAgIAorIyAlMiAgLSJjaGVja2VkLW91dCIvImluLWNlcnRpZmljYXRpb24iCisgICAgQ0FOTk9UX0RFTEVURV9VU0VSX1dJVEhfQUNUSVZFX0VMRU1FTlRTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIGNhbm5vdCBiZSBkZWxldGVkLiBVc2VyICclMScgaGFzICUyIHByb2plY3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIlVzZXIgTmFtZSBhbmQgVXNlcklkIiAgIAorIyAlMiAgLSJjaGVja2VkLW91dCIvImluLWNlcnRpZmljYXRpb24iCisgICAgQ0FOTk9UX1VQREFURV9VU0VSX1dJVEhfQUNUSVZFX0VMRU1FTlRTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSb2xlIGNhbm5vdCBiZSBjaGFuZ2VkLiBVc2VyICclMScgaGFzICUyIHByb2plY3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgVVBEQVRFX1VTRVJfQURNSU5fQ09ORkxJQ1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFuIGFkbWluaXN0cmF0b3IgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGhpcy9oZXIgcm9sZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFNFUlZJQ0VfQ0FOTk9UX0NPTlRBSU5fU1VCQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFN1YiBjYXRlZ29yeSBjYW5ub3QgYmUgZGVmaW5lZCBmb3Igc2VydmljZSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIlJlc291cmNlIi8iU2VydmljZSIKKyAgICBDT01QT05FTlRfVE9PX01VQ0hfQ0FURUdPUklFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgbXVzdCBoYXZlIG9ubHkgMSBjYXRlZ29yeSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NzQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfVE9PX01VQ0hfU1VCQ0FURUdPUklFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgbXVzdCBoYXZlIG9ubHkgMSBzdWIgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIENPTVBPTkVOVF9NSVNTSU5HX1NVQkNBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nIHN1YiBjYXRlZ29yeSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzUiCisgICAgfQorICMtLS0tLS0tLS1TVkM0NTc2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJjb21wb25lbnQgdHlwZSIKKyAgICBVTlNVUFBPUlRFRF9FUlJPUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvciA6IFJlcXVlc3RlZCBjb21wb25lbnQgdHlwZSAlMSBpcyB1bnN1cHBvcnRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc2IgorICAgIH0KKyAgICAjLS0tLS0tLS0tU1ZDNDU3Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAicmVzb3VyY2UgdHlwZSIKKyAgICBSRVNPVVJDRV9DQU5OT1RfQ09OVEFJTl9SRVNPVVJDRV9JTlNUQU5DRVM6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgOiBSZXNvdXJjZSBvZiB0eXBlICUxIGNhbm5vdCBjb250YWluIHJlc291cmNlIGluc3RhbmNlcy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisjICUyIC0gIHJlc291cmNlL3NlcnZpY2UgbmFtZSAKKyMgJTMgLSAgImFydGlmYWN0IG5hbWUiIAorICAgIERFUExPWU1FTlRfQVJUSUZBQ1RfTkFNRV9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgJyUyJyBhbHJlYWR5IGhhcyBhIGRlcGxveW1lbnQgYXJ0aWZhY3QgbmFtZWQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJDYXRlZ29yeSIvIlN1Yi1DYXRlZ29yeSIvIkdyb3VwIgorIyAlMiAtICBjYXRlZ29yeS9zdWItY2F0ZWdvcnkvZ3JvdXBpbmcgbmFtZS4KKyAgICBJTlZBTElEX0dST1VQX0FTU09DSUFUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGdyb3VwIGFzc29jaWF0aW9uLiAlMSAnJTInIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBFTVBUWV9QUk9EVUNUX0NPTlRBQ1RTX0xJU1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gQXQgbGVhc3Qgb25lIFByb2R1Y3QgQ29udGFjdCBoYXMgdG8gYmUgc3BlY2lmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gdXNlcklkCisgICAgSU5WQUxJRF9QUk9EVUNUX0NPTlRBQ1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gVXNlciAnJTEnIGNhbm5vdCBiZSBzZXQgYXMgUHJvZHVjdCBDb250YWN0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gUHJvZHVjdAorIyAlMiAtICJhYmJyZXZpYXRlZCIvImZ1bGwiCisgICAgTUlTU0lOR19PTkVfT0ZfQ09NUE9ORU5UX05BTUVTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIE1pc3NpbmcgJTEgJTIgbmFtZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgyIgorICAgIH0gICAgCisjLS0tLS0tLS0tU1ZDNDU4My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJJY29uIgorIyAlMiAtICJyZXNvdXJjZSIvInNlcnZpY2UiLyJwcm9kdWN0IgorICAgIENPTVBPTkVOVF9QQVJBTUVURVJfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlICUyIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxICAtIHNlcnZpY2UvVkYgbmFtZSAKKyMgJTIgLSAic2VydmljZSIgLyJWRiIKKyMgJTMgLSAgcmVzb3VyY2UgaW5zdGFuY2Ugb3JpZ2luIHR5cGUKKyMgJTQgLSAgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZSAKKyMgJTUgLSAgcmVxdWlyZW1lbnQvY2FwYWJpbGl0eQorIyAlNiAtICByZXF1aXJlbWVudC9jYXBhYmlsaXR5IG5hbWUKKyMgJTcgLSAgImZ1bGZpbGxlZCIgKGZvciByZXEpLyJjb25zdW1lZCAoZm9yIGNhcCkiCisgICAgUkVRX0NBUF9OT1RfU0FUSVNGSUVEX0JFRk9SRV9DRVJUSUZJQ0FUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAgUmVxdWVzdGVkICclMScgJTIgaXMgbm90IHJlYWR5IGZvciBjZXJ0aWZpY2F0aW9uLiAgJTMgJyU0JyBoYXMgdG8gaGF2ZSAlNSAnJTYnICU3LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9PQ0NVUlJFTkNFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBvY2N1cnJlbmNlcyBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMtLS0tLS0tLS1TVkM0NTg2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfU0VSVklDRV9BUElfVVJMOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIFNlcnZpY2UgQVBJIFVSTC4gUGxlYXNlIGNoZWNrIHdoZXRoZXIgeW91ciBVUkwgaGFzIGEgdmFsaWQgZG9tYWluIGV4dGVuc2lvbiBhbmQgZG9lcyBub3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgLSAjPyZAJSs7LD0kPD5+XmBcW117fXwiKiEnLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogRGF0YSB0eXBlICUxIGFscmVhZHkgZXhpc3RzLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lIAorICAgIERBVEFfVFlQRV9OT1JfUFJPUEVSVElFU19ORUlUSEVSX0RFUklWRURfRlJPTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBEYXRhIHR5cGUgJTEuIERhdGEgdHlwZSBtdXN0IGhhdmUgZWl0aGVyIGEgdmFsaWQgZGVyaXZlZCBmcm9tIGRlY2xhcmF0aW9uIG9yIGF0IGxlYXN0IG9uZSB2YWxpZCBwcm9wZXJ0eScsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lIAorICAgIERBVEFfVFlQRV9QUk9QRVJUSUVTX0NBTk5PVF9CRV9FTVBUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBEYXRhIHR5cGUgJTEuICdwcm9wZXJ0aWVzJyBwYXJhbWV0ZXIgY2Fubm90IGJlIGVtcHR5IGlmIHByb3ZpZGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIFByb3BlcnR5IHR5cGUgbmFtZSAKKyMgJTIgIC0gUHJvcGVydHkgbmFtZQorICAgIElOVkFMSURfUFJPUEVSVFlfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBQcm9wZXJ0eSB0eXBlICUxIGluIHByb3BlcnR5ICUyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIFByb3BlcnR5IGlubmVyIHR5cGUKKyMgJTIgIC0gUHJvcGVydHkgbmFtZSAKKyAgICBJTlZBTElEX1BST1BFUlRZX0lOTkVSX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgcHJvcGVydHkgaW5uZXIgdHlwZSAlMSwgaW4gcHJvcGVydHkgJTIiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTkxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBjb21wb25lbnQgaW5zdGFuY2UgbmFtZQorIyAlMiAgLSAicmVzb3VyY2UgaW5zdGFuY2UiLyJzZXJ2aWNlIGluc3RhbmNlIgorICAgIENPTVBPTkVOVF9JTlNUQU5DRV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBjb21wb25lbnQgaW5zdGFuY2UgbmFtZQorIyAlMiAtICJyZXNvdXJjZSBpbnN0YW5jZSIvInNlcnZpY2UgaW5zdGFuY2UiCisjICUzIC0gInJlc291cmNlLyJzZXJ2aWNlIi8icHJvZHVjdCIKKyMgJTQgLSBjb250YWluZXIgbmFtZSAKKyAgICBDT01QT05FTlRfSU5TVEFOQ0VfTk9UX0ZPVU5EX09OX0NPTlRBSU5FUjogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgd2FzIG5vdCBmb3VuZCBvbiB0aGUgJTMgJyU0Jy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTkzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTEgLSByZXF1aXJlbWVudCAvIGNhcGFiaWxpdHkKKyMlMiAtIHJlcXVpcmVtZW50IG5hbWUKKyAgICBJTVBPUlRfRFVQTElDQVRFX1JFUV9DQVBfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgVE9TQ0EgdGVtcGxhdGUgY29udGFpbnMgbW9yZSB0aGFuIG9uZSAlMSBuYW1lZCAnJTInLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMSAtIHJlcXVpcmVtZW50IC8gY2FwYWJpbGl0eQorIyUyIC0gcmVxdWlyZW1lbnQgbmFtZQorIyUzIC0gcGFyZW50IGNvbnRhaW5pbmcgdGhlIHJlcXVpcmVtZW50IAorICAgIElNUE9SVF9SRVFfQ0FQX05BTUVfRVhJU1RTX0lOX0RFUklWRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEltcG9ydGVkIFRPU0NBIHRlbXBsYXRlIGNvbnRhaW5zICUxICclMicgdGhhdCBpcyBhbHJlYWR5IGRlZmluZWQgYnkgZGVyaXZlZCB0ZW1wbGF0ZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZQorICAgIERBVEFfVFlQRV9ERVJJVkVEX0lTX01JU1NJTkc6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGFuY2VzdG9yIGRhdGEgdHlwZSAlMSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHN5c3RlbS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZQorIyAlMiAgLSBQcm9wZXJ0eSBuYW1lcworICAgIERBVEFfVFlQRV9QUk9QRVJUWV9BTFJFQURZX0RFRklORURfSU5fQU5DRVNUT1I6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGRhdGEgdHlwZSAlMSBjb250YWlucyBwcm9wZXJ0aWVzIG5hbWVkICUyIHdoaWNoIGFyZSBhbHJlYWR5IGRlZmluZWQgaW4gb25lIG9mIGl0cyBhbmNlc3RvcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfRFVQTElDQVRFX1BST1BFUlRZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgZHVwbGljYXRlIHByb3BlcnR5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisjICUyICAtIFByb3BlcnR5IG5hbWVzCisgICAgREFUQV9UWVBFX1BST0VQUlRZX0NBTk5PVF9IQVZFX1NBTUVfVFlQRV9PRl9EQVRBX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGRhdGEgdHlwZSAlMSBjb250YWlucyBwcm9wZXJ0aWVzICUyIHdoaWNoIHRoZWlyIHR5cGUgaXMgdGhpcyBkYXRhIHR5cGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfQ0FOTk9UX0hBVkVfUFJPUEVSVElFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZGF0YSB0eXBlICUxIGNhbm5vdCBoYXZlIHByb3BlcnRpZXMgc2luY2UgaXQgaXMgb2YgdHlwZSBzY2FsYXIiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVE9TQ0EgeWFtbCBmaWxlICUxIGNhbm5vdCBiZSBtb2RlbGVkIHRvIFZGIGFzIGl0IGRvZXMgbm90IGNvbnRhaW4gJ3RvcG9sb2d5X3RlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHlhbWwgZmlsZSBuYW1lCisjICUyIC0gbm9kZV90ZW1wbGF0ZSBsYWJlbAorIyAlMyAtIG5vZGVfdGVtcGxhdGUgdHlwZQorICAgIElOVkFMSURfTk9ERV9URU1QTEFURTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVE9TQ0EgeWFtbCBmaWxlICclMScgY29udGFpbnMgbm9kZV90ZW1wbGF0ZSAnJTInIG9mIHR5cGUgJyUzJyB0aGF0IGRvZXMgbm90IHJlcHJlc2VudCBleGlzdGluZyBWRkMvQ1AvVkwiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjAyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGNvbXBvbmVudCB0eXBlCisjICUywqAtIGNvbXBvbmVudMKgbmFtZQorIyAlM8KgLSBzdGF0ZQorICAgIElMTEVHQUxfQ09NUE9ORU5UX1NUQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBDb21wb25lbnQgaW5zdGFuY2Ugb2YgJTEgY2FuIG5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgdGhlIGNvbXBvbmVudCAnJTInIGlzIGluIGFuIGlsbGVnYWwgc3RhdGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIENTQVJfSU5WQUxJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVE9TQ0EgQ1NBUiAnJTEnIGlzIGludmFsaWQuICdUT1NDQS1NZXRhZGF0YS9Ub3NjYS5tZXRhJyBmaWxlIG11c3QgYmUgcHJvdmlkZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIENTQVJfSU5WQUxJRF9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIENTQVIgJyUxJyBpcyBpbnZhbGlkLiBJbnZhbGlkICdUT1NDQS1NZXRhZGF0YS9Ub3NjYS5tZXRhJyBmaWxlIGZvcm1hdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHByb3BlcnR5IG5hbWUKKyMgJTLCoC0gcHJvcGVydHkgdHlwZQorIyAlMyAtIHByb3BlcnR5IGlubmVyVHlwZQorIyAlNMKgLSBkZWZhdWx0IHZhbHVlIGlzCisgICAgSU5WQUxJRF9DT01QTEVYX0RFRkFVTFRfVkFMVUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBvZiBwcm9wZXJ0eSAlMS4gRGF0YSB0eXBlIGlzICUyIHdpdGggaW5uZXIgdHlwZSAlMyBhbmQgZGVmYXVsdCB2YWx1ZSBmb3VuZCBpcyAlNC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjA3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGNzYXIgZmlsZSBuYW1lCisgICAgQ1NBUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIENTQVIgJyUxJyBpcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBhcnRpZmFjdCBuYW1lCisjICUywqAtIGNvbXBvbmVudCB0eXBlCisjICUzIC0gYWN0dWFsIGNvbXBvbmVudCB0eXBlCisgICAgTUlTTUFUQ0hfQkVUV0VFTl9BUlRJRkFDVF9UWVBFX0FORF9DT01QT05FTlRfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgJTEgaXMgb25seSBjb21wYXRpYmxlIHdpdGggY29tcG9uZW50IG9mIHR5cGUgJTIsIGJ1dCBjb21wb25lbnQgdHlwZSBpcyAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA4IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQ2MDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gICJJTlZBTElEX0pTT04iICAgICAgICAgICAgIAorICAgIElOVkFMSURfSlNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXBsb2FkZWQgSlNPTiBmaWxlIGZvciAlMSBhcnRpZmFjdCBpcyBpbnZhbGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyMgJTLCoC3CoG1pc3NpbmcgZmlsZSBuYW1lCisgICAgWUFNTF9OT1RfRk9VTkRfSU5fQ1NBUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvciAtIFRPU0NBIENTQVIgJTEgaXMgaW52YWxpZC4gVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YSByZWZlcnMgdG8gZmlsZSAlMiB0aGF0IGlzIG5vdCBwcm92aWRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjEwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjExLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTEgLSBncm91cCBuYW1lCisgICAgR1JPVVBfTUVNQkVSX0VNUFRZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEdyb3VwICUxIG1lbWJlciBsaXN0IHdhcyBwcm92aWRlZCBidXQgZG9lcyBub3QgaGF2ZSB2YWx1ZXMiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjExIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjEyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBncm91cCBuYW1lIAorICAgIEdST1VQX1RZUEVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogR3JvdXAgdHlwZSAlMSBhbHJlYWR5IGV4aXN0cy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjEyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGdyb3VwIG5hbWUKKyMgJTLCoC0gVkYgbmFtZShjb21wb25lbnQgbmFtZSkKKyMgJTMgLSBhY3R1YWwgY29tcG9uZW50IHR5cGUgW1ZGXQorICAgIEdST1VQX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEdyb3VwIHdpdGggbmFtZSAnJTEnIGFscmVhZHkgZXhpc3RzIGluICUyICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTMiCisgICAgfSAgIAorIy0tLS0tLS0tLVNWQzQ2MTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXAgdHlwZQorICAgIEdST1VQX1RZUEVfSVNfSU5WQUxJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBHcm91cCB0eXBlICUxIGRvZXMgbm90IGV4aXN0IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cCBuYW1lCisgICAgR1JPVVBfTUlTU0lOR19HUk9VUF9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgR3JvdXAgVHlwZSBmb3IgZ3JvdXAgJyUxJyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtZW1iZXIgbmFtZQorIyAlMiAtIGdyb3VwIG5hbWUKKyMgJTMgLSBWRiBuYW1lCisjICU0IC0gY29tcG9uZW50IHR5cGUgW1ZGIF0KKyAgICBHUk9VUF9JTlZBTElEX0NPTVBPTkVOVF9JTlNUQU5DRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogbWVtYmVyICUxIGxpc3RlZCBpbiBncm91cCAlMiBpcyBub3QgcGFydCBvZiAlMyAlNC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE2IgorICAgIH0gICAgICAgICAgICAgICAgIAorIy0tLS0tLS0tLVNWQzQ2MTctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtZW1iZXIgbmFtZQorIyAlMiAtIGdyb3VwIG5hbWUKKyMgJTMgLSBncm91cCB0eXBlCisgICAgR1JPVVBfSU5WQUxJRF9UT1NDQV9OQU1FX09GX0NPTVBPTkVOVF9JTlNUQU5DRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogbWVtYmVyICUxIGxpc3RlZCBpbiBncm91cCAlMiBpcyBub3QgcGFydCBvZiBhbGxvd2VkIG1lbWJlcnMgb2YgZ3JvdXAgdHlwZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjE4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMcKgLcKgbWlzc2luZyBmaWxlIG5hbWUKKyMgJTLCoC3CoGNzYXIgZmlsZSBuYW1lCisgICAgQVJUSUZBQ1RfTk9UX0ZPVU5EX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGlzIGRlZmluZWQgaW4gQ1NBUiAlMiBtYW5pZmVzdCBidXQgaXMgbm90IHByb3ZpZGVkIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxOCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLcKgYXJ0aWZhY3QgdHlwZQorIyAlMyAtIGV4aXN0aW5nIGFydGlmYWN0IHR5cGUKKyAgICBBUlRJRkFDVF9BTFJBRFlfRVhJU1RfSU5fRElGRkVSRU5UX1RZUEVfSU5fQ1NBUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogYXJ0aWZhY3QgJTEgaW4gdHlwZSAlMiBhbHJlYWR5IGV4aXN0cyBpbiB0eXBlICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgRkFJTEVEX1JFVFJJVkVfQVJUSUZBQ1RTX1RZUEVTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBGYWlsZWQgdG8gcmV0cmlldmUgbGlzdCBvZiBzdXBvcnRlZCBhcnRpZmFjdCB0eXBlcy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjIwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjIxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMcKgLSBhcnRpZmFjdCBuYW1lCisjICUywqAtIG1hc3RlciAKKyAgICBBUlRJRkFDVF9BTFJBRFlfRVhJU1RfSU5fTUFTVEVSX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGFscmVhZHkgZXhpc3RzIGluIG1hc3RlciAlMiAuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBhcnRpZmFjdCB0eXBlIAorIyAlM8KgLSBtYXN0ZXIgbmFtZQorIyAlNCAtIG1hc3RlciB0eXBlCisgICAgQVJUSUZBQ1RfTk9UX1ZBTElEX0lOX01BU1RFUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogYXJ0aWZhY3QgJTEgaW4gdHlwZSAlMiBjYW4gbm90IGJlIGV4aXN0cyB1bmRlciBtYXN0ZXIgJTMgaW4gdHlwZSAlNC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjIyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMcKgLSBhcnRpZmFjdCBuYW1lCisjICUywqAtIGFydGlmYWN0IHR5cGUgCisjICUzwqAtIGVudiBuYW1lCisjICU0IC0gZXhpc3RpbmcgZW52CisgICAgQVJUSUZBQ1RfTk9UX1ZBTElEX0VOVjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgJTEgaW4gdHlwZSAlMiB3aXRoIGVudiAlMyBhbHJlYWR5IGV4aXN0cyB3aXRoIGFub3RoZXIgZW52ICU0IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cHMgbmFtZXMKKyMgJTIgLSBWRiBuYW1lCisjICUzIC0gY29tcG9uZW50IHR5cGUgW1ZGIF0KKyAgICBHUk9VUF9JU19NSVNTSU5HOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBncm91cHMgJyUxJyBjYW5ub3QgYmUgZm91bmQgdW5kZXIgJTIgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cHMgbmFtZQorICAgIEdST1VQX0FSVElGQUNUX0FMUkVBRFlfQVNTT0NJQVRFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBcnRpZmFjdCBhbHJlYWR5IGFzc29jaWF0ZWQgdG8gZ3JvdXAgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjI2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGdyb3VwcyBuYW1lCisgICAgR1JPVVBfQVJUSUZBQ1RfQUxSRUFEWV9ESVNTT0NJQVRFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBcnRpZmFjdCBhbHJlYWR5IGRpc3NvY2lhdGVkIGZyb20gZ3JvdXAgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjI3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gcHJvcGVydHkgbmFtZQorIyAlMiAtIGdyb3VwIG5hbWUKKyMgJTMgLSBncm91cCB0eXBlIG5hbWUKKyAgICBHUk9VUF9QUk9QRVJUWV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IHByb3BlcnR5ICUxIGxpc3RlZCBpbiBncm91cCAlMiBpcyBub3QgZXhpc3QgaW4gZ3JvdXAgdHlwZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI3IgorICAgIH0gICAKKyMtLS0tLS0tLS1TVkM0NjI4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTEgLSBjc2FyVVVJRAorIyAlMiAtIFZGIG5hbWUKKyAgICBWU1BfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRoZSBWU1Agd2l0aCBVVUlEICUxIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZvciBWRiAlMi4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIG9yIHVwZGF0ZSB0aGUgZXhpc3RpbmcgVkYuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyOCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gVkYgbmFtZQorICAgIE1JU1NJTkdfQ1NBUl9VVUlEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgQ3NhciBVVUlEIG9yIHBheWxvYWQgbmFtZSBpcyBtaXNzaW5nIGZvciBWRiAlMS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjMwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTEgLSBWRiBuYW1lCisjICUyIC0gbmV3IGNzYXJVVUlECisjICUzIC0gb2xkIGNzYXJVVUlECisgICAgUkVTT1VSQ0VfTElOS0VEX1RPX0RJRkZFUkVOVF9WU1A6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc291cmNlICUxIGNhbm5vdCBiZSB1cGRhdGVkIHVzaW5nIENzYXJVVUlEICUyIHNpbmNlIHRoZSByZXNvdXJjZSBpcyBsaW5rZWQgdG8gYSBkaWZmZXJlbnQgVlNQIHdpdGggY3NhclVVSUQgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gcG9saWN5IG5hbWUgCisgICAgUE9MSUNZX1RZUEVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUG9saWN5IHR5cGUgJTEgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHRhcmdldCBuYW1lCisjICUyIC0gcG9saWN5IHR5cGUgbmFtZQorICAgIFRBUkdFVFNfTk9OX1ZBTElEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiB0YXJnZXQgJTEgbGlzdGVkIGluIHBvbGljeSB0eXBlICUyIGlzIG5vdCBhIGdyb3VwIG9yIHJlc291cmNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBwb2xpY3kgbmFtZQorICAgIFRBUkdFVFNfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gUG9saWN5ICUxIHRhcmdldCBsaXN0IHdhcyBwcm92aWRlZCBidXQgZG9lcyBub3QgaGF2ZSB2YWx1ZXMiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjMzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjM0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgREFUQV9UWVBFX0NBTk5PVF9CRV9FTVBUWTogeworICAgICAgICBjb2RlOiA1MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRGF0YSB0eXBlcyBhcmUgZW1wdHkuIFBsZWFzZSBpbXBvcnQgdGhlIGRhdGEgdHlwZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIGNzYXIgdXVpZAorICAgIFJFU09VUkNFX0ZST01fQ1NBUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IHJlc291cmNlIGZyb20gY3NhciB1dWlkICUxIG5vdCBmb3VuZCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzUiCisgICAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9IU1MvSFNTLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSFNTL0hTUy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjBhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSFNTL0hTUy5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIkhTUy55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAiYXR0Lm5vZGVzLmltcy5IU1MiLAorICAiZGVzY3JpcHRpb24iOiAiVGhlIGhvbWUgc3Vic2NyaWJlciBzZXJ2ZXIgKEhTUyksIG9yIHVzZXIgcHJvZmlsZSBzZXJ2ZXIgZnVuY3Rpb24gKFVQU0YpLCBpcyBhIG1hc3RlciB1c2VyIGRhdGFiYXNlIHRoYXQgc3VwcG9ydHMgdGhlIElNUyBuZXR3b3JrIGVudGl0aWVzIHRoYXQgYWN0dWFsbHkgaGFuZGxlIGNhbGxzLiBJdCBjb250YWlucyB0aGUgc3Vic2NyaXB0aW9uLXJlbGF0ZWQgaW5mb3JtYXRpb24gKHN1YnNjcmliZXIgcHJvZmlsZXMpLCBwZXJmb3JtcyBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiBvZiB0aGUgdXNlciwgYW5kIGNhbiBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdWJzY3JpYmVyJ3MgbG9jYXRpb24gYW5kIElQIGluZm9ybWF0aW9uLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIklNUyIsCisgICJ0YWdzIjogWworICAgICJhdHQubm9kZXMuaW1zLkhTUyIsICJJTVNfVEFHIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0hTUy9IU1MueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0hTUy9IU1MueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDA1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSFNTL0hTUy55bWwKQEAgLTAsMCArMSwxOCBAQAorYXR0Lm5vZGVzLmltcy5IU1M6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgY2FwYWJpbGl0aWVzOgorICAgIGljc2NmX2VuZHBvaW50OgorICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdFRvCisgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgICAgZGVzY3JpcHRpb246IENvbm5lY3Rpb24gd2l0aCBvbmUgb3JlIG1vcmUgSS1DU0NGIGZ1bmN0aW9ucyAKKyAgICBzY3NjZl9lbmRwb2ludDoKKyAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RUbworICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICAgIGRlc2NyaXB0aW9uOiBDb25uZWN0aW9uIHdpdGggb25lIG9yZSBtb3JlIFMtQ1NDRiBmdW5jdGlvbnMKKyAgcmVxdWlyZW1lbnRzOgorICAgIGRhdGFiYXNlX2VuZHBvaW50OiAKKyAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5EYXRhYmFzZSAgCisgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RzVG8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSFNTL0hTUy55bWwub2xkIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0hTUy9IU1MueW1sLm9sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTgxOTFlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0hTUy9IU1MueW1sLm9sZApAQCAtMCwwICsxLDI4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitkZXNjcmlwdGlvbjogPgorICBUaGUgaG9tZSBzdWJzY3JpYmVyIHNlcnZlciAoSFNTKSwgb3IgdXNlciBwcm9maWxlIHNlcnZlciBmdW5jdGlvbiAoVVBTRiksIAorICBpcyBhIG1hc3RlciB1c2VyIGRhdGFiYXNlIHRoYXQgc3VwcG9ydHMgdGhlIElNUyBuZXR3b3JrIGVudGl0aWVzIHRoYXQgYWN0dWFsbHkgaGFuZGxlIGNhbGxzLiAKKyAgSXQgY29udGFpbnMgdGhlIHN1YnNjcmlwdGlvbi1yZWxhdGVkIGluZm9ybWF0aW9uIChzdWJzY3JpYmVyIHByb2ZpbGVzKSwgCisgIHBlcmZvcm1zIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIG9mIHRoZSB1c2VyLCBhbmQgY2FuIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIAorICBzdWJzY3JpYmVyJ3MgbG9jYXRpb24gYW5kIElQIGluZm9ybWF0aW9uLgorICAKK25vZGVfdHlwZXM6CisgIGF0dC5ub2Rlcy5pbXMuSFNTOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBpY3NjZl9lbmRwb2ludDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0VG8KKyAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICAgICAgZGVzY3JpcHRpb246IENvbm5lY3Rpb24gd2l0aCBvbmUgb3JlIG1vcmUgSS1DU0NGIGZ1bmN0aW9ucyAKKyAgICAgIHNjc2NmX2VuZHBvaW50OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RUbworICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgICAgICBkZXNjcmlwdGlvbjogQ29ubmVjdGlvbiB3aXRoIG9uZSBvcmUgbW9yZSBTLUNTQ0YgZnVuY3Rpb25zCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgZGF0YWJhc2VfZW5kcG9pbnQ6IAorICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuRGF0YWJhc2UgIAorICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9IU1MvSFNTLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9IU1MvSFNTLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDg5NDlmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0hTUy9IU1MuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9JQ1NDRi9JQ1NDRi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0lDU0NGL0lDU0NGLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliZjU4YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9JQ1NDRi9JQ1NDRi5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIklDU0NGLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJhdHQubm9kZXMuaW1zLklDU0NGIiwKKyAgImRlc2NyaXB0aW9uIjogIkludGVycm9nYXRpbmctQ1NDRiAoSS1DU0NGKSBpcyBhIFNJUCBmdW5jdGlvbiBsb2NhdGVkIGF0IHRoZSBlZGdlIG9mIGFuIGFkbWluaXN0cmF0aXZlIGRvbWFpbi4gSXRzIElQIGFkZHJlc3MgaXMgcHVibGlzaGVkIGluIHRoZSBEb21haW4gTmFtZSBTeXN0ZW0gKEROUykgb2YgdGhlIGRvbWFpbih1c2luZyBOQVBUUiBhbmQgU1JWIHR5cGUgb2YgRE5TIHJlY29yZHMpLCBzbyB0aGF0IHJlbW90ZSBzZXJ2ZXJzIGNhbiBmaW5kIGl0LCBhbmQgdXNlIGl0IGFzIGEgZm9yd2FyZGluZyBwb2ludCAoZS5nLiwgcmVnaXN0ZXJpbmcpIGZvciBTSVAgcGFja2V0cyB0byB0aGlzIGRvbWFpbi5JdCBxdWVyaWVzIHRoZSBIU1MgdG8gcmV0cmlldmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFMtQ1NDRiBhbmQgYXNzaWduIGl0IHRvIGEgdXNlciBwZXJmb3JtaW5nIFNJUCAgcmVnaXN0cmF0aW9uLiBJdCBhbHNvIGZvcndhcmRzIFNJUCByZXF1ZXN0IG9yIHJlc3BvbnNlIHRvIHRoZSBTLUNTQ0YuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiSU1TIiwKKyAgInRhZ3MiOiBbCisgICAgImF0dC5ub2Rlcy5pbXMuSUNTQ0YiLCAiSU1TX1RBRyIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9JQ1NDRi9JQ1NDRi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSUNTQ0YvSUNTQ0YueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDY4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSUNTQ0YvSUNTQ0YueW1sCkBAIC0wLDAgKzEsMTMgQEAKK2F0dC5ub2Rlcy5pbXMuSUNTQ0Y6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgY2FwYWJpbGl0aWVzOgorICAgIHBjc2NmX2VuZHBvaW50OgorICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdFRvCisgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgICAgZGVzY3JpcHRpb246IENvbm5lY3Rpb24gd2l0aCBvbmUgb3JlIG1vcmUgUC1DU0NGIGZ1bmN0aW9ucyAKKyAgcmVxdWlyZW1lbnRzOgorICAgIGhzc19lbmRwb2ludDogCisgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQgIAorICAgICAgbm9kZTogYXR0Lm5vZGVzLmltcy5IU1MKKyAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0c1RvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0lDU0NGL0lDU0NGLnltbC5vbGQgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSUNTQ0YvSUNTQ0YueW1sLm9sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODNmOGRiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL0lDU0NGL0lDU0NGLnltbC5vbGQKQEAgLTAsMCArMSwyNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworZGVzY3JpcHRpb246ID4KKyAgSW50ZXJyb2dhdGluZy1DU0NGIChJLUNTQ0YpIGlzIGEgU0lQIGZ1bmN0aW9uIGxvY2F0ZWQgYXQgdGhlIGVkZ2Ugb2YgYW4gYWRtaW5pc3RyYXRpdmUgZG9tYWluLgorICBJdHMgSVAgYWRkcmVzcyBpcyBwdWJsaXNoZWQgaW4gdGhlIERvbWFpbiBOYW1lIFN5c3RlbSAoRE5TKSBvZiB0aGUgZG9tYWluCisgICh1c2luZyBOQVBUUiBhbmQgU1JWIHR5cGUgb2YgRE5TIHJlY29yZHMpLCBzbyB0aGF0IHJlbW90ZSBzZXJ2ZXJzIGNhbiBmaW5kIGl0LCAKKyAgYW5kIHVzZSBpdCBhcyBhIGZvcndhcmRpbmcgcG9pbnQgKGUuZy4sIHJlZ2lzdGVyaW5nKSBmb3IgU0lQIHBhY2tldHMgdG8gdGhpcyBkb21haW4uCisgIEl0IHF1ZXJpZXMgdGhlIEhTUyB0byByZXRyaWV2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgUy1DU0NGIGFuZCBhc3NpZ24gaXQgdG8gYSB1c2VyIHBlcmZvcm1pbmcgU0lQIAorICByZWdpc3RyYXRpb24uIEl0IGFsc28gZm9yd2FyZHMgU0lQIHJlcXVlc3Qgb3IgcmVzcG9uc2UgdG8gdGhlIFMtQ1NDRi4KKyAgCitub2RlX3R5cGVzOgorICBhdHQubm9kZXMuaW1zLklDU0NGOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBwY3NjZl9lbmRwb2ludDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0VG8KKyAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICAgICAgZGVzY3JpcHRpb246IENvbm5lY3Rpb24gd2l0aCBvbmUgb3JlIG1vcmUgUC1DU0NGIGZ1bmN0aW9ucyAKKyAgICByZXF1aXJlbWVudHM6CisgICAgICBoc3NfZW5kcG9pbnQ6IAorICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQgIAorICAgICAgICBub2RlOiBhdHQubm9kZXMuaW1zLkhTUworICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9JQ1NDRi9JQ1NDRi56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSUNTQ0YvSUNTQ0YuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODM3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvSUNTQ0YvSUNTQ0YuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9QQ1NDRi9QQ1NDRi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1BDU0NGL1BDU0NGLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4ZWUwOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9QQ1NDRi9QQ1NDRi5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIlBDU0NGLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJhdHQubm9kZXMuaW1zLlBDU0NGIiwKKyAgImRlc2NyaXB0aW9uIjogIkEgUHJveHktQ1NDRiAoUC1DU0NGKSBpcyBhIFNJUCBwcm94eSB0aGF0IGlzIHRoZSBmaXJzdCBwb2ludCBvZiBjb250YWN0IGZvciB0aGUgSU1TIHRlcm1pbmFsLiBJdCBjYW4gYmUgbG9jYXRlZCBlaXRoZXIgaW4gdGhlIHZpc2l0ZWQgbmV0d29yayAoaW4gZnVsbCBJTVMgbmV0d29ya3MpIG9yIGluIHRoZSBob21lIG5ldHdvcmsgKHdoZW4gdGhlIHZpc2l0ZWQgbmV0d29yayBpcyBub3QgSU1TIGNvbXBsaWFudCB5ZXQpLiBUaGUgUC1DU0NGIGlzIGF0IGl0cyBjb3JlIGEgc3BlY2lhbGl6ZWQgU0JDIGZvciB0aGUgVXNlciBuZXR3b3JrIGludGVyZmFjZSB3aGljaCBub3Qgb25seXByb3RlY3RzIHRoZSBuZXR3b3JrLCBidXQgYWxzbyB0aGUgSU1TIHRlcm1pbmFsLiBUaGUgdXNlIG9mIGFuIGFkZGl0aW9uYWwgU0JDIGJldHdlZW4gdGhlIElNUyB0ZXJtaW5hbCBhbmQgdGhlIFAtQ1NDRiBpcyB1bm5lY2Vzc2FyeSBhbmQgaW5mZWFzaWJsZSBkdWUgdG8gdGhlIHNpZ25hbGluZyBiZWluZyBlbmNyeXB0ZWQgb24gdGhpcyBsZWcuIFRoZSB0ZXJtaW5hbCBkaXNjb3ZlcnMgaXRzIFAtQ1NDRiB3aXRoIGVpdGhlciBESENQLCBvciBpdCBtYXkgYmUgY29uZmlndXJlZCAoZS5nLiBkdXJpbmcgaW5pdGlhbCBwcm92aXNpb25pbmcgb3IgdmlhIGEgM0dQUCBJTVMgTWFuYWdlbWVudCBPYmplY3QgKE1PKSkgb3IgaW4gdGhlIElTSU0gb3IgYXNzaWduZWQgaW4gdGhlIFBEUCBDb250ZXh0IChpbiBHZW5lcmFsIFBhY2tldCBSYWRpbyBTZXJ2aWNlIChHUFJTKSkuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiSU1TIiwKKyAgInRhZ3MiOiBbCisgICAgImF0dC5ub2Rlcy5pbXMuUENTQ0YiLCAiSU1TX1RBRyIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9QQ1NDRi9QQ1NDRi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvUENTQ0YvUENTQ0YueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGUzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvUENTQ0YvUENTQ0YueW1sCkBAIC0wLDAgKzEsMTMgQEAKK2F0dC5ub2Rlcy5pbXMuUENTQ0Y6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgY2FwYWJpbGl0aWVzOgorICAgIHBjc2NmX2VuZHBvaW50OgorICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LlB1YmxpYworICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RUbworICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICAgIGRlc2NyaXB0aW9uOiBDb25uZWN0aW9uIHdpdGggb25lIG9yZSBtb3JlIFVBcworICByZXF1aXJlbWVudHM6CisgICAgaWNzY2ZfZW5kcG9pbnQ6IAorICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50ICAKKyAgICAgIG5vZGU6IGF0dC5ub2Rlcy5pbXMuSUNTQ0YKKyAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0c1RvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1BDU0NGL1BDU0NGLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9QQ1NDRi9QQ1NDRi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhNmJhYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9QQ1NDRi9QQ1NDRi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1NDU0NGL1NDU0NGLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvU0NTQ0YvU0NTQ0YuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjg5M2RkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1NDU0NGL1NDU0NGLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiU0NTQ0YueW1sIiwKKyAgInJlc291cmNlTmFtZSI6ICJhdHQubm9kZXMuaW1zLlNDU0NGIiwKKyAgImRlc2NyaXB0aW9uIjogIkEgU2VydmluZy1DU0NGIChTLUNTQ0YpIGlzIHRoZSBjZW50cmFsIG5vZGUgb2YgdGhlIHNpZ25hbGluZyBwbGFuZS4gSXQgaXMgYSBTSVAgc2VydmVyLCBidXQgcGVyZm9ybXMgc2Vzc2lvbiBjb250cm9sIHRvby4gSXQgaXMgYWx3YXlzIGxvY2F0ZWQgaW4gdGhlIGhvbWUgbmV0d29yay4gSXQgdXNlcyBEaWFtZXRlciBDeCBhbmQgRHggaW50ZXJmYWNlcyB0byB0aGUgSFNTIHRvIGRvd25sb2FkIHVzZXIgcHJvZmlsZXMgYW5kIHVwbG9hZCB1c2VyLXRvLVMtQ1NDRiBhc3NvY2lhdGlvbnMgKHRoZSB1c2VyIHByb2ZpbGUgaXMgb25seSBjYWNoZWQgbG9jYWxseSBmb3IgcHJvY2Vzc2luZyByZWFzb25zIG9ubHkgYW5kIGlzIG5vdCBjaGFuZ2VkKS4gQWxsIG5lY2Vzc2FyeSBzdWJzY3JpYmVyIHByb2ZpbGUgaW5mb3JtYXRpb24gaXMgbG9hZGVkIGZyb20gdGhlIEhTUy4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJJTVMiLAorICAiY29udGFjdElkIjogamgwMDAzLAorICAidGFncyI6IFsKKyAgICAiYXR0Lm5vZGVzLmltcy5TQ1NDRiIsICJJTVNfVEFHIgorICBdCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvU0NTQ0YvU0NTQ0YueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1NDU0NGL1NDU0NGLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY3MmRkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1NDU0NGL1NDU0NGLnltbApAQCAtMCwwICsxLDEzIEBACithdHQubm9kZXMuaW1zLlNDU0NGOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgIGNhcGFiaWxpdGllczoKKyAgICBpY3NjZl9lbmRwb2ludDoKKyAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RUbworICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICAgIGRlc2NyaXB0aW9uOiBDb25uZWN0aW9uIHdpdGggb25lIG9yZSBtb3JlIEktQ1NDRiBmdW5jdGlvbnMgCisgIHJlcXVpcmVtZW50czoKKyAgICBoc3NfZW5kcG9pbnQ6IAorICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50ICAKKyAgICAgIG5vZGU6IGF0dC5ub2Rlcy5pbXMuSFNTCisgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9TQ1NDRi9TQ1NDRi55bWwub2xkIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1NDU0NGL1NDU0NGLnltbC5vbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmYjFiMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9TQ1NDRi9TQ1NDRi55bWwub2xkCkBAIC0wLDAgKzEsMjMgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK2Rlc2NyaXB0aW9uOiA+CisgIEEgU2VydmluZy1DU0NGIChTLUNTQ0YpIGlzIHRoZSBjZW50cmFsIG5vZGUgb2YgdGhlIHNpZ25hbGxpbmcgcGxhbmUuIAorICBJdCBpcyBhIFNJUCBzZXJ2ZXIsIGJ1dCBwZXJmb3JtcyBzZXNzaW9uIGNvbnRyb2wgdG9vLiBJdCBpcyBhbHdheXMgbG9jYXRlZCBpbiB0aGUgaG9tZSBuZXR3b3JrLiAKKyAgSXQgdXNlcyBEaWFtZXRlciBDeCBhbmQgRHggaW50ZXJmYWNlcyB0byB0aGUgSFNTIHRvIGRvd25sb2FkIHVzZXIgcHJvZmlsZXMgYW5kIHVwbG9hZCAKKyAgdXNlci10by1TLUNTQ0YgYXNzb2NpYXRpb25zICh0aGUgdXNlciBwcm9maWxlIGlzIG9ubHkgY2FjaGVkIGxvY2FsbHkgZm9yIHByb2Nlc3NpbmcgcmVhc29ucyBvbmx5CisgIGFuZCBpcyBub3QgY2hhbmdlZCkuIEFsbCBuZWNlc3Nhcnkgc3Vic2NyaWJlciBwcm9maWxlIGluZm9ybWF0aW9uIGlzIGxvYWRlZCBmcm9tIHRoZSBIU1MuCisgIAorbm9kZV90eXBlczoKKyAgYXR0Lm5vZGVzLmltcy5TQ1NDRjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaWNzY2ZfZW5kcG9pbnQ6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdFRvCisgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBDb25uZWN0aW9uIHdpdGggb25lIG9yZSBtb3JlIEktQ1NDRiBmdW5jdGlvbnMgCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgaHNzX2VuZHBvaW50OiAKKyAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50ICAKKyAgICAgICAgbm9kZTogYXR0Lm5vZGVzLmltcy5IU1MKKyAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RzVG8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvU0NTQ0YvU0NTQ0YuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1NDU0NGL1NDU0NGLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTU3OWRjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL1NDU0NGL1NDU0NGLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvY29tcHV0ZS9jb21wdXRlLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvY29tcHV0ZS9jb21wdXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyNTc3OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9jb21wdXRlL2NvbXB1dGUuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJjb21wdXRlLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSByZWFsIG9yIHZpcnR1YWwgbWFjaGluZSBvciBzZXJ2ZXIuIEluZm9ybWF0aW9uIHNwZWNpZmllZCBvbiB0aGUgQ29tcHV0ZQorICAgICAgbm9kZSB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgbWFjaGluZSB0aGF0IGZpdHMgdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBpbiB0aGUgY2xvdWQKKyAgICAgIGF2YWlsYWJsZSBtYWNoaW5lcy4gSWYgbm8gc2l6aW5nIGluZm9ybWF0aW9uIGFyZSBzcGVjaWZpZWQgdGhlIGNsb3VkIHByb3ZpZGVyIGRlZmF1bHQKKyAgICAgIG1hY2hpbmUgd2lsbCBiZSB1c2VkLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzcGVjaWZ5IHRoZSByZXF1aXJlZCAgQ1BVcyBhbmQgbWVtb3J5CisgICAgICBhdCBsZWFzdC4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5Db21wdXRlIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL2NvbXB1dGUvY29tcHV0ZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvY29tcHV0ZS9jb21wdXRlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTEwMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL2NvbXB1dGUvY29tcHV0ZS55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6CisgIHRvc2NhLm5vZGVzLkNvbXB1dGU6CisgICAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgICBhdHRyaWJ1dGVzOgorICAgICAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgbmV0d29ya3M6CisgICAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgICAgICBwb3J0czoKKyAgICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgICAgICByZXF1aXJlbWVudHM6CisgICAgICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgICBob3N0OiAKKyAgICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgICAgICBlbmRwb2ludCA6CisgICAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICAgICAgb3M6IAorICAgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgICAgIHNjYWxhYmxlOgorICAgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICAgICAgYmluZGluZzoKKyAgICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvY29tcHV0ZS9jb21wdXRlLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9jb21wdXRlL2NvbXB1dGUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTEzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvY29tcHV0ZS9jb21wdXRlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvZGVsZXRlUmVzb3VyY2VzRGVtby5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9kZWxldGVSZXNvdXJjZXNEZW1vLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OWE0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvZGVsZXRlUmVzb3VyY2VzRGVtby5zaApAQCAtMCwwICsxLDM2IEBACisjIS9iaW4vYmFzaAorCitmdW5jdGlvbiB1c2FnZSB7CisJZWNobyAiVXNhZ2U6ICQwIDxob3N0SXA+IDxob3N0UG9ydD4iCit9CisKK2Z1bmN0aW9uIGRlbGV0ZVJlc291cmNlKCkgeworCQorCUVMRU1FTlRfTkFNRT0kMQorCWVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUmVtb3ZpbmcgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gU3RhcnQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKwljdXJsIC1YICJERUxFVEUiIC1IICJVU0VSX0lEOiBqaDAwMDMiICR7SE9TVF9JUH06JHtIT1NUX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy9yZXNfJHtFTEVNRU5UX05BTUV9Ii4xLjAiCisJZWNobyAiIgorCWVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUmVtb3ZpbmcgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKwllY2hvICIiCisJZWNobyAiIgorCWVjaG8gIiIKK30KK2lmIFsgJCMgLWx0IDIgXQordGhlbgorCXVzYWdlCisJZXhpdCAyCitmaQorCitIT1NUX0lQPSQxCitIT1NUX1BPUlQ9JDIKKworZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLnJvb3QiCitkZWxldGVSZXNvdXJjZSAidG9zY2Eubm9kZXMuY29tcHV0ZSIKK2RlbGV0ZVJlc291cmNlICJ0b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudCIKK2RlbGV0ZVJlc291cmNlICJ0b3NjYS5ub2Rlcy5sb2FkYmFsYW5jZXIiCitkZWxldGVSZXNvdXJjZSAiYXR0Lm5vZGVzLmltcy5oc3MiCitkZWxldGVSZXNvdXJjZSAiYXR0Lm5vZGVzLmltcy5pY3NjZiIKK2RlbGV0ZVJlc291cmNlICJhdHQubm9kZXMuaW1zLnBjc2NmIgorZGVsZXRlUmVzb3VyY2UgImF0dC5ub2Rlcy5pbXMuc2NzY2YiCisKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL2ltcG9ydFJlc291cmNlc0RlbW8uc2ggYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvaW1wb3J0UmVzb3VyY2VzRGVtby5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJlYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL2ltcG9ydFJlc291cmNlc0RlbW8uc2gKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gdXNhZ2UgeworCWVjaG8gIlVzYWdlOiAkMCA8aG9zdElwPiA8aG9zdFBvcnQ+IgorfQorCitmdW5jdGlvbiBhZGRSZXNvdXJjZSgpIHsKKwkKKwlFTEVNRU5UX05BTUU9JDEKKwllY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFkZGluZyBFbGVtZW50ICR7RUxFTUVOVF9OQU1FfSBTdGFydCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgorCUNVUlJFTlRfWklQX0ZJTEU9Li8ke0VMRU1FTlRfTkFNRX0vJHtFTEVNRU5UX05BTUV9LnppcAorCUNVUlJFTlRfSlNPTl9GSUxFPS4vJHtFTEVNRU5UX05BTUV9LyR7RUxFTUVOVF9OQU1FfS5qc29uCisJSlNPTl9DT05URU5UPWBwYXN0ZSAtcyAke0NVUlJFTlRfSlNPTl9GSUxFfWAKKwljdXJsIC12IC1GIHJlc291cmNlTWV0YWRhdGE9IiR7SlNPTl9DT05URU5UfSIgLUYgcmVzb3VyY2VaaXA9QCR7Q1VSUkVOVF9aSVBfRklMRX0gLUggIlVTRVJfSUQ6IGpoMDAwMyIgJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL211bHRpcGFydAorCWVjaG8gIiIKKwllY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFkZGluZyBFbGVtZW50ICR7RUxFTUVOVF9OQU1FfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgorCWVjaG8gIiIKKwllY2hvICIiCisJZWNobyAiIgorfQoraWYgWyAkIyAtbHQgMiBdCit0aGVuCisJdXNhZ2UKKwlleGl0IDIKK2ZpCisKK0hPU1RfSVA9JDEKK0hPU1RfUE9SVD0kMgorCithZGRSZXNvdXJjZSAicm9vdCIKK2FkZFJlc291cmNlICJjb21wdXRlIgorYWRkUmVzb3VyY2UgInNvZnR3YXJlQ29tcG9uZW50IgorYWRkUmVzb3VyY2UgImxvYWRCYWxhbmNlciIKK2FkZFJlc291cmNlICJIU1MiCithZGRSZXNvdXJjZSAiSUNTQ0YiCithZGRSZXNvdXJjZSAiUENTQ0YiCithZGRSZXNvdXJjZSAiU0NTQ0YiCisKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9sb2FkQmFsYW5jZXIvbG9hZEJhbGFuY2VyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0ZGMzYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9sb2FkQmFsYW5jZXIvbG9hZEJhbGFuY2VyLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAibG9hZEJhbGFuY2VyLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5Mb2FkQmFsYW5jZXIiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBsb2dpY2FsIGZ1bmN0aW9uIHRoYXQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgRmxvYXRpbmcgQWRkcmVzcyB0byBkaXN0cmlidXRlIGFuIGFwcGxpY2F0aW9u4oCZcyB0cmFmZmljIChsb2FkKSBhY3Jvc3MgYSBudW1iZXIgb2YgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbiAoZS5nLiwgZm9yIGEgY2x1c3RlcmVkIG9yIHNjYWxlZCBhcHBsaWNhdGlvbikuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiSW5mcmFzdHJ1Y3R1cmUiLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMuTG9hZEJhbGFuY2VyIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzA1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvbG9hZEJhbGFuY2VyL2xvYWRCYWxhbmNlci55bWwKQEAgLTAsMCArMSwxNiBAQAordG9zY2Eubm9kZXMuTG9hZEJhbGFuY2VyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QgCisgIHByb3BlcnRpZXM6CisgICAgIyBUQkQKKyAgICBhbGdvcml0aG0gOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogZXhwZXJpbWVudGFsCisgIGNhcGFiaWxpdGllcyA6CisgICAgY2xpZW50OiAKKyAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5QdWJsaWMKKyAgICAgIGRlc2NyaXB0aW9uOiB0aGUgRmxvYXRpbmcgKElQKSBjbGllbnTigJlzIG9uIHRoZSBwdWJsaWMgbmV0d29yayBjYW4gY29ubmVjdCB0bworICByZXF1aXJlbWVudHM6IAorICAgIC0gYXBwbGljYXRpb246IAorICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLlJvdXRlc1RvCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvbG9hZEJhbGFuY2VyL2xvYWRCYWxhbmNlci56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvbG9hZEJhbGFuY2VyL2xvYWRCYWxhbmNlci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZGMyMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9sb2FkQmFsYW5jZXIvbG9hZEJhbGFuY2VyLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvcm9vdC9yb290Lmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvcm9vdC9yb290Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5NmNmOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9yb290L3Jvb3QuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJyb290LnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJBYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5Sb290IgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL3Jvb3Qvcm9vdC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvcm9vdC9yb290LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFhY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL3Jvb3Qvcm9vdC55bWwKQEAgLTAsMCArMSwyMSBAQAordG9zY2Eubm9kZXMuUm9vdDoKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBOb2RlIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgTm9kZSBUeXBlcyBkZXJpdmUgZnJvbQorICBhdHRyaWJ1dGVzOgorICAgIHRvc2NhX2lkOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgdG9zY2FfbmFtZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgIHN0YXRlOgorICAgICAgdHlwZTogc3RyaW5nCisgIGNhcGFiaWxpdGllczoKKyAgICBmZWF0dXJlOiAKKyAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgIHJlcXVpcmVtZW50czoKKyAgICAtIGRlcGVuZGVuY3kgOgorICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Sb290IAorICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uCisgICAgICAgIG9jY3VycmVuY2VzOiBbIDAsIFVOQk9VTkRFRCBdCisgIGludGVyZmFjZXM6IAorICAgIFN0YW5kYXJkOgorICAgICAgdHlwZTogdG9zY2EuaW50ZXJmYWNlcy5ub2RlLmxpZmVjeWNsZS5TdGFuZGFyZApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL3Jvb3Qvcm9vdC56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvcm9vdC9yb290LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFmZGZiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL3Jvb3Qvcm9vdC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL3NvZnR3YXJlQ29tcG9uZW50L3NvZnR3YXJlQ29tcG9uZW50Lmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvc29mdHdhcmVDb21wb25lbnQvc29mdHdhcmVDb21wb25lbnQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjM3OWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL3NvZnR3YXJlQ29tcG9uZW50L3NvZnR3YXJlQ29tcG9uZW50Lmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAic29mdHdhcmVDb21wb25lbnQueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAicmVzb3VyY2VOYW1lIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJBYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvc29mdHdhcmVDb21wb25lbnQvc29mdHdhcmVDb21wb25lbnQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2EzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRBdHRSZXNvdXJjZXMvc29mdHdhcmVDb21wb25lbnQvc29mdHdhcmVDb21wb25lbnQueW1sCkBAIC0wLDAgKzEsMTUgQEAKK3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICAjIGRvbWFpbi1zcGVjaWZpYyBzb2Z0d2FyZSBjb21wb25lbnQgdmVyc2lvbgorICAgIGNvbXBvbmVudF92ZXJzaW9uOiAKKyAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGFkbWluX2NyZWRlbnRpYWw6IAorICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICByZXF1aXJlbWVudHM6CisgICAgLSBob3N0OiAKKyAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0QXR0UmVzb3VyY2VzL3NvZnR3YXJlQ29tcG9uZW50L3NvZnR3YXJlQ29tcG9uZW50LnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzOWI4NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydEF0dFJlc291cmNlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLmNhcGFiaWxpdGllcy55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLmNhcGFiaWxpdGllcy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2ViYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMuY2FwYWJpbGl0aWVzLnlhbWwKQEAgLTAsMCArMSwxMyBAQAorYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorCithc2RjLmNhcGFiaWxpdGllcy5Db250YWluZXI6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorCisjIGJpbmRpbmcgYSBWRFUgdG8gYSBDUAorYXNkYy5jYXBhYmlsaXRpZXMubmZ2LlZpcnR1YWxCaW5kYWJsZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorCisjIGxpbmtpbmcgYSBWTCB0byBhIENQCithc2RjLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTW9kdWxlL2FzZGMubm9kZXMuTW9kdWxlLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTW9kdWxlL2FzZGMubm9kZXMuTW9kdWxlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3MjdhYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5Nb2R1bGUvYXNkYy5ub2Rlcy5Nb2R1bGUuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJhc2RjLm5vZGVzLk1vZHVsZS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogImFzZGMubm9kZXMuTW9kdWxlIiwKKyAgImRlc2NyaXB0aW9uIjogIk5vZGUgVHlwZSB0aGF0IHJlcHJlc2VudHMgYSBNb2R1bGUiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL0Fic3RyYWN0IiwKKyAgInRhZ3MiOiBbCisgICAgImFzZGMubm9kZXMuTW9kdWxlIiwgIm1vZHVsZSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5Nb2R1bGUvYXNkYy5ub2Rlcy5Nb2R1bGUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLk1vZHVsZS9hc2RjLm5vZGVzLk1vZHVsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1MTU2YgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5Nb2R1bGUvYXNkYy5ub2Rlcy5Nb2R1bGUueW1sCkBAIC0wLDAgKzEsMiBAQAorYXNkYy5ub2Rlcy5Nb2R1bGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLk1vZHVsZS9hc2RjLm5vZGVzLk1vZHVsZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTW9kdWxlL2FzZGMubm9kZXMuTW9kdWxlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODAwM2YxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLk1vZHVsZS9hc2RjLm5vZGVzLk1vZHVsZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLk5ldHdvcmsvYXNkYy5ub2Rlcy5OZXR3b3JrLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTmV0d29yay9hc2RjLm5vZGVzLk5ldHdvcmsuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTJiYmVlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLk5ldHdvcmsvYXNkYy5ub2Rlcy5OZXR3b3JrLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiYXNkYy5ub2Rlcy5OZXR3b3JrLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiYXNkYy5ub2Rlcy5OZXR3b3JrIiwKKyAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgdGhlIGRlZmF1bHQgQVQmVCBUT1NDQSBOZXR3b3JrIE5vZGUgVHlwZSB0aGF0IGFsbCBvdGhlciBBVCZUIE5ldHdvcmsgVE9TQ0Egbm9kZXMgc2hvdWxkIGV4dGVuZHMuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9BYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJhc2RjLm5vZGVzLk5ldHdvcmsiLCAiTmV0d29yayIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5OZXR3b3JrL2FzZGMubm9kZXMuTmV0d29yay55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTmV0d29yay9hc2RjLm5vZGVzLk5ldHdvcmsueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTZlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTmV0d29yay9hc2RjLm5vZGVzLk5ldHdvcmsueW1sCkBAIC0wLDAgKzEsMiBAQAorYXNkYy5ub2Rlcy5OZXR3b3JrOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5OZXR3b3JrL2FzZGMubm9kZXMuTmV0d29yay56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTmV0d29yay9hc2RjLm5vZGVzLk5ldHdvcmsuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2ZhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuTmV0d29yay9hc2RjLm5vZGVzLk5ldHdvcmsuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5Sb290L2FzZGMubm9kZXMuUm9vdC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLlJvb3QvYXNkYy5ub2Rlcy5Sb290Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxZGRhNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5Sb290L2FzZGMubm9kZXMuUm9vdC5qc29uCkBAIC0wLDAgKzEsMTMgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImFzZGMubm9kZXMuUm9vdC55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogImFzZGMubm9kZXMuUm9vdCIsCisgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIHRoZSBkZWZhdWx0IChyb290KSBBVCZUIFRPU0NBIE5vZGUgVHlwZSB0aGF0IGFsbCBvdGhlciBBVCZUIFRPU0NBIG5vZGVzIHNob3VsZCBleHRlbmRzLgorICAgIFRoaXMgYWxsb3dzIGFsbCBBVCZUIFRPU0NBIG5vZGVzIHRvIGhhdmUgYSBjb25zaXN0ZW50IHNldCBvZiBmZWF0dXJlcyBmb3IgbW9kZWxpbmcgYW5kIG1hbmFnZW1lbnQgKGUuZywgY29uc2lzdGVudCBkZWZpbml0aW9ucyBmb3IgcmVxdWlyZW1lbnRzLCBjYXBhYmlsaXRpZXMsIGFuZCBsaWZlY3ljbGUgaW50ZXJmYWNlcykuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9BYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJhc2RjLm5vZGVzLlJvb3QiCisgIF0KK30KKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLlJvb3QvYXNkYy5ub2Rlcy5Sb290LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5Sb290L2FzZGMubm9kZXMuUm9vdC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZTFlNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5Sb290L2FzZGMubm9kZXMuUm9vdC55bWwKQEAgLTAsMCArMSwzIEBACithc2RjLm5vZGVzLlJvb3Q6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMuUm9vdC9hc2RjLm5vZGVzLlJvb3QuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLlJvb3QvYXNkYy5ub2Rlcy5Sb290LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDUzYmYzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLlJvb3QvYXNkYy5ub2Rlcy5Sb290LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLkVDQV9PQU0vYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX09BTS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNL2FzZGMubm9kZXMubW9kdWxlLkVDQV9PQU0uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEyMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNL2FzZGMubm9kZXMubW9kdWxlLkVDQV9PQU0uanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJhc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX09BTSIsCisgICJkZXNjcmlwdGlvbiI6ICJPcGVyYXRpb24sIEFkbWluaXN0cmF0aW9uICYgTWFuYWdlbWVudCBvZiB2TU1TQyBFQ0EgVFJYIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiYXBwbGljYXRpb25TZXJ2ZXIiLAorICAiY2F0ZWdvcnkiOiAiQXBwbGljYXRpb24gTGF5ZXIgNCsvQXBwbGljYXRpb24gU2VydmVycyIsCisgICJ0YWdzIjogWworICAgICJhc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNIiwgIk1NU0MgT0FNIiwgIkVDQSIsICJNTVNDIiwgInZNTVNDIiwgIk1vYmlsaXR5IgorICBdCit9CisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX09BTS9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX09BTS9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRjOTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNL2FzZGMubm9kZXMubW9kdWxlLkVDQV9PQU0ueW1sCkBAIC0wLDAgKzEsOSBAQAorYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX09BTToKKyAgZGVyaXZlZF9mcm9tOiBhc2RjLm5vZGVzLk1vZHVsZQorICByZXF1aXJlbWVudHM6CisgICAgLSBvYW1fY29ubmVjdGlvbjoKKyAgICAgICAgY2FwYWJpbGl0eTogYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZQorICAgICAgICBub2RlOiBhc2RjLm5vZGVzLm5ldHdvcmsuT0FNCisgICAgLSBpbnRlcm5hbF9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNL2FzZGMubm9kZXMubW9kdWxlLkVDQV9PQU0uemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNL2FzZGMubm9kZXMubW9kdWxlLkVDQV9PQU0uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OWVmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLkVDQV9PQU0vYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX09BTS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYL2FzZGMubm9kZXMubW9kdWxlLkVDQV9UUlguanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX1RSWC9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4MDk5MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX1RSWC9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYLmpzb24KQEAgLTAsMCArMSwxMiBAQAoreworICAicGF5bG9hZE5hbWUiOiAiYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX1RSWC55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogImFzZGMubm9kZXMubW9kdWxlLkVDQV9UUlgiLAorICAiZGVzY3JpcHRpb24iOiAiRXh0ZXJuYWwgQ29udGVudCBBZGFwdGlvbiBUcmFuc2NvZGVyLiBUcmFuc2NvZGVzIGFuZCBhZGFwdHMgTU1TIGNvbnRlbnQgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpZXMgb2YgcmVjZWl2aW5nIE1TIG9yIFVFLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImFwcGxpY2F0aW9uU2VydmVyIiwKKyAgImNhdGVnb3J5IjogIkFwcGxpY2F0aW9uIExheWVyIDQrL0FwcGxpY2F0aW9uIFNlcnZlcnMiLAorICAidGFncyI6IFsKKyAgICAiYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX1RSWCIsICJDb250ZW50IEFkYXB0YXRpb24gVHJhbnNjb2RlciIsICJNTVNDIiwgInZNTVNDIiwgIk1vYmlsaXR5IgorICBdCit9CisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX1RSWC9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX1RSWC9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmE1MjBkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYL2FzZGMubm9kZXMubW9kdWxlLkVDQV9UUlgueW1sCkBAIC0wLDAgKzEsMTIgQEAKK2FzZGMubm9kZXMubW9kdWxlLkVDQV9UUlg6CisgIGRlcml2ZWRfZnJvbTogYXNkYy5ub2Rlcy5Nb2R1bGUKKyAgcmVxdWlyZW1lbnRzOgorICAgIC0gb2FtX2Nvbm5lY3Rpb246CisgICAgICAgIGNhcGFiaWxpdHk6IGFzZGMuY2FwYWJpbGl0aWVzLk5ldHdvcmtJbnRlcmZhY2UKKyAgICAgICAgbm9kZTogYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTQorICAgIC0gdHJhZmZpY19jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5UcmFmZmljCisgICAgLSBpbnRlcm5hbF9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYL2FzZGMubm9kZXMubW9kdWxlLkVDQV9UUlguemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5FQ0FfVFJYL2FzZGMubm9kZXMubW9kdWxlLkVDQV9UUlguemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTExYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLkVDQV9UUlgvYXNkYy5ub2Rlcy5tb2R1bGUuRUNBX1RSWC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0vYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLkY1X0xUTS9hc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UwYjhhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0vYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNLmpzb24KQEAgLTAsMCArMSwxMiBAQAoreworICAicGF5bG9hZE5hbWUiOiAiYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNIiwKKyAgImRlc2NyaXB0aW9uIjogInZNTVNDIExvY2FsIFRyYWZmaWMgTWFuYWdlciBzZXJ2ZXMgYXMgdGhlIGxvYWQgYmFsYW5jZXIgZm9yIHRyYWZmaWMgY29taW5nIGludG8gdGhlIHZNTVNDLiBUcmFmZmljIGZyb20gTU1TQyBkZXNpZ25hdGVkIHRvIGV4dGVybmFsIG5ldHdvcmsgcGFzc2VzIHZpYSBGNS4gQWxzbywgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEVDQSBhbmQgTU1TQyBpcyB2aWEgRjUiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJsb2FkQmFsYW5jZXIiLAorICAiY2F0ZWdvcnkiOiAiQXBwbGljYXRpb24gTGF5ZXIgNCsvTG9hZCBCYWxhbmNlciIsCisgICJ0YWdzIjogWworICAgICJhc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0iLCAiRjUiLCAiTG9hZCBCYWxhbmNlciIsICJ2TU1TQyIsICJNb2JpbGl0eSIKKyAgXQorfQorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLkY1X0xUTS9hc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0ueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0vYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTBjZDBhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0vYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNLnltbApAQCAtMCwwICsxLDEyIEBACithc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE06CisgIGRlcml2ZWRfZnJvbTogYXNkYy5ub2Rlcy5Nb2R1bGUKKyAgcmVxdWlyZW1lbnRzOgorICAgIC0gY29yZV9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5Db3JlCisgICAgLSBkbXpfY29ubmVjdGlvbjoKKyAgICAgICAgY2FwYWJpbGl0eTogYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZQorICAgICAgICBub2RlOiBhc2RjLm5vZGVzLm5ldHdvcmsuRE1aCisgICAgLSB0cmFmZmljX2Nvbm5lY3Rpb246CisgICAgICAgIGNhcGFiaWxpdHk6IGFzZGMuY2FwYWJpbGl0aWVzLk5ldHdvcmtJbnRlcmZhY2UKKyAgICAgICAgbm9kZTogYXNkYy5ub2Rlcy5uZXR3b3JrLlRyYWZmaWMgICAgICAgIApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5GNV9MVE0vYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNL2FzZGMubm9kZXMubW9kdWxlLkY1X0xUTS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiOWJiYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNL2FzZGMubm9kZXMubW9kdWxlLkY1X0xUTS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5NTVNDL2FzZGMubm9kZXMubW9kdWxlLk1NU0MuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5NTVNDLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwMzg4MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5NTVNDLmpzb24KQEAgLTAsMCArMSwxMiBAQAoreworICAicGF5bG9hZE5hbWUiOiAiYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogImFzZGMubm9kZXMubW9kdWxlLk1NU0MiLAorICAiZGVzY3JpcHRpb24iOiAiQWNjZXB0cyBNTVMgbWVzc2FnZXMgdmlhIEY1IGFuZCBkaXN0cmlidXRlcyBhbW9uZyBNTVNDcy4gTWVzc2FnZXMgYXJlIGZyb20gdXNlciBtb2JpbGUgZGV2aWNlIG9yIGZyb20gYW5vdGhlciBNZXNzYWdlIFNlcnZpY2UiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJhcHBsaWNhdGlvblNlcnZlciIsCisgICJjYXRlZ29yeSI6ICJBcHBsaWNhdGlvbiBMYXllciA0Ky9BcHBsaWNhdGlvbiBTZXJ2ZXJzIiwKKyAgInRhZ3MiOiBbCisgICAgImFzZGMubm9kZXMubW9kdWxlLk1NU0MiLCAiTU1TQyIsICJ2TU1TQyIsICJNb2JpbGl0eSIKKyAgXQorfQorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1YjIwZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5NTVNDLnltbApAQCAtMCwwICsxLDEyIEBACithc2RjLm5vZGVzLm1vZHVsZS5NTVNDOgorICBkZXJpdmVkX2Zyb206IGFzZGMubm9kZXMuTW9kdWxlCisgIHJlcXVpcmVtZW50czoKKyAgICAtIG9hbV9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5PQU0KKyAgICAtIGNpbmRlcl9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5DaW5kZXIKKyAgICAtIHRyYWZmaWNfY29ubmVjdGlvbjoKKyAgICAgICAgY2FwYWJpbGl0eTogYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZQorICAgICAgICBub2RlOiBhc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYyAgICAgICAgCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmOGRkOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5NTVNDLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfQkUvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfQkUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjg5ZTRkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfQkUuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJhc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRSIsCisgICJkZXNjcmlwdGlvbiI6ICJUaGUgQmFjayBFbmQgb2YgYSBOZXR3b3JrIE1lc3NhZ2UgU3RvcmFnZSBhbGxvd3MgZXh0ZXJuYWwgbXVsdGltZWRpYSBjb250ZW50IHRvIHVzZSBTTVRQIGUtbWFpbCBtZWNoYW5pc20gdG8gc3VibWl0IE1NUyBtZXNzYWdlcyIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImFwcGxpY2F0aW9uU2VydmVyIiwKKyAgImNhdGVnb3J5IjogIkFwcGxpY2F0aW9uIExheWVyIDQrL0FwcGxpY2F0aW9uIFNlcnZlcnMiLAorICAidGFncyI6IFsKKyAgICAiYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRSIsICJNTVNDIiwgInZNTVNDIiwgIk5ldHdvcmsgTWVzc2FnZSBTdG9yYWdlIiwgIkJhY2sgRW5kIiwgIk1vYmlsaXR5IgorICBdCit9CisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRS9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRS9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDYwYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfQkUueW1sCkBAIC0wLDAgKzEsOSBAQAorYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRToKKyAgZGVyaXZlZF9mcm9tOiBhc2RjLm5vZGVzLk1vZHVsZQorICByZXF1aXJlbWVudHM6CisgICAgLSBvYW1fY29ubmVjdGlvbjoKKyAgICAgICAgY2FwYWJpbGl0eTogYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZQorICAgICAgICBub2RlOiBhc2RjLm5vZGVzLm5ldHdvcmsuT0FNCisgICAgLSBpbnRlcm5hbF9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfQkUuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0JFL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfQkUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTM1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfQkUvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfRkUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4MGIyNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogImFzZGMubm9kZXMubW9kdWxlLk5FTVNfRkUiLAorICAiZGVzY3JpcHRpb24iOiAiVGhlIEZyb250IEVuZCBvZiBhIE5ldHdvcmsgTWVzc2FnZSBTdG9yYWdlIGFsbG93cyBleHRlcm5hbCBtdWx0aW1lZGlhIGNvbnRlbnQgdG8gdXNlIFNNVFAgZS1tYWlsIG1lY2hhbmlzbSB0byBzdWJtaXQgTU1TIG1lc3NhZ2VzIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAib2JqZWN0U3RvcmFnZSIsCisgICJjYXRlZ29yeSI6ICJBcHBsaWNhdGlvbiBMYXllciA0Ky9BcHBsaWNhdGlvbiBTZXJ2ZXJzIiwKKyAgInRhZ3MiOiBbCisgICAgImFzZGMubm9kZXMubW9kdWxlLk5FTVNfRkUiLCAiTU1TQyIsICJ2TU1TQyIsICJOZXR3b3JrIE1lc3NhZ2UgU3RvcmFnZSIsICJGcm9udCBFbmQiLCAiTW9iaWxpdHkiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfRkUvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfRkUvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2YWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFLnltbApAQCAtMCwwICsxLDE1IEBACithc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFOgorICBkZXJpdmVkX2Zyb206IGFzZGMubm9kZXMuTW9kdWxlCisgIHJlcXVpcmVtZW50czoKKyAgICAtIG9hbV9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5PQU0KKyAgICAtIGNpbmRlcl9jb25uZWN0aW9uOgorICAgICAgICBjYXBhYmlsaXR5OiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCisgICAgICAgIG5vZGU6IGFzZGMubm9kZXMubmV0d29yay5DaW5kZXIKKyAgICAtIHRyYWZmaWNfY29ubmVjdGlvbjoKKyAgICAgICAgY2FwYWJpbGl0eTogYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZQorICAgICAgICBub2RlOiBhc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYworICAgIC0gaW50ZXJuYWxfY29ubmVjdGlvbjoKKyAgICAgICAgY2FwYWJpbGl0eTogYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZQorICAgICAgICBub2RlOiBhc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19GRS9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGViMWNjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFL2FzZGMubm9kZXMubW9kdWxlLk5FTVNfRkUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci9hc2RjLm5vZGVzLm5ldHdvcmsuQ2luZGVyLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5DaW5kZXIvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTdjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5DaW5kZXIvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImFzZGMubm9kZXMubmV0d29yay5DaW5kZXIueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJhc2RjLm5vZGVzLm5ldHdvcmsuQ2luZGVyIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYWNjZXNzIHRvIGNsb3VkIHNoYXJlZCBzdG9yYWUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29yayIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL05ldHdvcmsgRWxlbWVudHMiLAorICAidGFncyI6IFsKKyAgICAiYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlciIsICJOZXR3b3JrIiwgIkNpbmRlciIsICJDbG91ZCIKKyAgXQorfQorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5DaW5kZXIvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5DaW5kZXIvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiMzRkMgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci9hc2RjLm5vZGVzLm5ldHdvcmsuQ2luZGVyLnltbApAQCAtMCwwICsxLDUgQEAKK2FzZGMubm9kZXMubmV0d29yay5DaW5kZXI6CisgIGRlcml2ZWRfZnJvbTogYXNkYy5ub2Rlcy5OZXR3b3JrCisgIGNhcGFiaWxpdGllczoKKyAgICBjaW5kZXJfY29ubmVjdGlvbjoKKyAgICAgIHR5cGU6IGFzZGMuY2FwYWJpbGl0aWVzLk5ldHdvcmtJbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci9hc2RjLm5vZGVzLm5ldHdvcmsuQ2luZGVyLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNpbmRlci9hc2RjLm5vZGVzLm5ldHdvcmsuQ2luZGVyLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjEwYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuQ2luZGVyL2FzZGMubm9kZXMubmV0d29yay5DaW5kZXIuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNhNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuQ29yZS9hc2RjLm5vZGVzLm5ldHdvcmsuQ29yZS5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImFzZGMubm9kZXMubmV0d29yay5Db3JlLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBDbG91ZCBDb3JlIG5ldHdvcmsgd2hpY2ggcHJvdmlkZSBpbnRlcmZhY2UgdG8gb3RoZXIgc2VydmljZXMuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29yayIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL05ldHdvcmsgRWxlbWVudHMiLAorICAidGFncyI6IFsKKyAgICAiYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUiLCAiTmV0d29yayIsICJDb3JlIiwgIkNsb3VkIgorICBdCit9CisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuQ29yZS9hc2RjLm5vZGVzLm5ldHdvcmsuQ29yZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0Y2VlZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUueW1sCkBAIC0wLDAgKzEsNSBAQAorYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmU6CisgICAgZGVyaXZlZF9mcm9tOiBhc2RjLm5vZGVzLk5ldHdvcmsKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBjb3JlX2Nvbm5lY3Rpb246CisgICAgICAgIHR5cGU6IGFzZGMuY2FwYWJpbGl0aWVzLk5ldHdvcmtJbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuQ29yZS9hc2RjLm5vZGVzLm5ldHdvcmsuQ29yZS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4MmZlZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUvYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWi9hc2RjLm5vZGVzLm5ldHdvcmsuRE1aLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5ETVovYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDQxMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5ETVovYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWi5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImFzZGMubm9kZXMubmV0d29yay5ETVoueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJhc2RjLm5vZGVzLm5ldHdvcmsuRE1aIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgRE1aIG5ldHdvcmsuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29yayIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL05ldHdvcmsgRWxlbWVudHMiLAorICAidGFncyI6IFsKKyAgICAiYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWiIsICJOZXR3b3JrIiwgIkRNWiIsICJDbG91ZCIKKyAgXQorfQorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5ETVovYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5ETVovYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0MWFlNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWi9hc2RjLm5vZGVzLm5ldHdvcmsuRE1aLnltbApAQCAtMCwwICsxLDUgQEAKK2FzZGMubm9kZXMubmV0d29yay5ETVo6CisgICAgZGVyaXZlZF9mcm9tOiBhc2RjLm5vZGVzLk5ldHdvcmsKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBkbXpfY29ubmVjdGlvbjoKKyAgICAgICAgdHlwZTogYXNkYy5jYXBhYmlsaXRpZXMuTmV0d29ya0ludGVyZmFjZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuRE1aL2FzZGMubm9kZXMubmV0d29yay5ETVouemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuRE1aL2FzZGMubm9kZXMubmV0d29yay5ETVouemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjk2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5ETVovYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwvYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbC9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNmMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwvYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgSW50ZXJuYWwgTmV0d29yayIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIm5ldHdvcmsiLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9OZXR3b3JrIEVsZW1lbnRzIiwKKyAgInRhZ3MiOiBbCisgICAgImFzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbCIsICJOZXR3b3JrIiwgIkNsb3VkIgorICBdCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbC9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwvYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI2ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwvYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsLnltbApAQCAtMCwwICsxLDUgQEAKKyAgYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsOgorICAgIGRlcml2ZWRfZnJvbTogYXNkYy5ub2Rlcy5OZXR3b3JrCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgZG16X2Nvbm5lY3Rpb246CisgICAgICAgIHR5cGU6IGFzZGMuY2FwYWJpbGl0aWVzLk5ldHdvcmtJbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLkludGVybmFsL2FzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbC56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbC9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTdjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbC9hc2RjLm5vZGVzLm5ldHdvcmsuSW50ZXJuYWwuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTS9hc2RjLm5vZGVzLm5ldHdvcmsuT0FNLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5PQU0vYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTg5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5PQU0vYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTS5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImFzZGMubm9kZXMubmV0d29yay5PQU0ueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJhc2RjLm5vZGVzLm5ldHdvcmsuT0FNIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgQVQmVCBPcGVyYXRpb24sIEFkbWluaXN0cmF0aW9uIGFuZCBNYW5hZ2VtZW50IChPQSZNKSBuZXR3b3JrLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIm5ldHdvcmsiLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9OZXR3b3JrIEVsZW1lbnRzIiwKKyAgInRhZ3MiOiBbCisgICAgImFzZGMubm9kZXMubmV0d29yay5PQU0iLCAiTmV0d29yayIsICJPQU0iLCAiQ2xvdWQiCisgIF0KK30KKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuT0FNL2FzZGMubm9kZXMubmV0d29yay5PQU0ueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuT0FNL2FzZGMubm9kZXMubmV0d29yay5PQU0ueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDg3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5PQU0vYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTS55bWwKQEAgLTAsMCArMSw1IEBACithc2RjLm5vZGVzLm5ldHdvcmsuT0FNOgorICBkZXJpdmVkX2Zyb206IGFzZGMubm9kZXMuTmV0d29yaworICBjYXBhYmlsaXRpZXM6CisgICAgb2FtX2Nvbm5lY3Rpb246CisgICAgICB0eXBlOiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5PQU0vYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5PQU0vYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmYmI3OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLk9BTS9hc2RjLm5vZGVzLm5ldHdvcmsuT0FNLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4MjY5MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLlRyYWZmaWMvYXNkYy5ub2Rlcy5uZXR3b3JrLlRyYWZmaWMuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJhc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYy55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogImFzZGMubm9kZXMubmV0d29yay5UcmFmZmljIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgTmV0d29yayBUcmFmZmljIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29yayIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL05ldHdvcmsgRWxlbWVudHMiLAorICAidGFncyI6IFsKKyAgICAiYXNkYy5ub2Rlcy5uZXR3b3JrLlRyYWZmaWMiLCAiTmV0d29yayIsICJDbG91ZCIKKyAgXQorfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYy9hc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBiYzhlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9hc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYy9hc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYy55bWwKQEAgLTAsMCArMSw1IEBACithc2RjLm5vZGVzLm5ldHdvcmsuVHJhZmZpYzoKKyAgICBkZXJpdmVkX2Zyb206IGFzZGMubm9kZXMuTmV0d29yaworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGRtel9jb25uZWN0aW9uOgorICAgICAgICB0eXBlOiBhc2RjLmNhcGFiaWxpdGllcy5OZXR3b3JrSW50ZXJmYWNlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvYXNkYy5ub2Rlcy5uZXR3b3JrLlRyYWZmaWMvYXNkYy5ub2Rlcy5uZXR3b3JrLlRyYWZmaWMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGQ0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljL2FzZGMubm9kZXMubmV0d29yay5UcmFmZmljLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2NhcGFiaWxpdHlUeXBlcy56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2NhcGFiaWxpdHlUeXBlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmMGNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvY2FwYWJpbGl0eVR5cGVzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2RlbGV0ZU5vcm1hdGl2ZS5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLU1NU0MvZGVsZXRlTm9ybWF0aXZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDZkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2RlbGV0ZU5vcm1hdGl2ZS5zaApAQCAtMCwwICsxLDM1IEBACisjIS9iaW4vYmFzaAorCitmdW5jdGlvbiB1c2FnZSB7CisJZWNobyAiVXNhZ2U6ICQwIDxob3N0SXA+IDxob3N0UG9ydD4gPHJlc291cmNlTmFtZT4iCit9CisKK2Z1bmN0aW9uIGRlbGV0ZVJlc291cmNlKCkgeworCisJRUxFTUVOVF9OQU1FPSQxCisJZWNobyAtZSAiIyMjIyMjIyMjIyMjIyMjIFJlbW92aW5nIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IFN0YXJ0ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisJaHR0cF9jb2RlPSQoY3VybCAtcyAtbyAvZGV2L251bGwgLXcgIiV7aHR0cF9jb2RlfSIgLVggIkRFTEVURSIgLUggIlVTRVJfSUQ6IGpoMDAwMyIgJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzL3Jlc18ke0VMRU1FTlRfTkFNRX0iLjEuMCIpCisJaWYgWyAke2h0dHBfY29kZX0gLWVxIDIwNCAgXTsgdGhlbgorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyBSZW1vdmluZyBFbGVtZW50ICR7RUxFTUVOVF9OQU1FfSBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyNcblxuXG4iCisJZWxpZiBbICR7aHR0cF9jb2RlfSAtZXEgNTAwIF07IHRoZW4KKwkJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMgRmFpbGVkIHRvIHJlbW92ZSBFbGVtZW50ICR7RUxFTUVOVF9OQU1FfSBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyNcblxuXG4iCisJCWV4aXQgMQorCWVsaWYgWyAke2h0dHBfY29kZX0gLWVxIDQwNCBdOyB0aGVuCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IG5vdCBmb3VuZCBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyNcblxuXG4iCisJZWxzZQorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyBGYWlsZWQgdG8gcmVtb3ZlIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjI1xuXG5cbiIKKwkJZXhpdCAxCisJZmkKK30KK2lmIFsgJCMgLWx0IDMgXQordGhlbgorCXVzYWdlCisJZXhpdCAyCitmaQorCitIT1NUX0lQPSQxCitIT1NUX1BPUlQ9JDIKKworZGVsZXRlUmVzb3VyY2UgJDMgCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9pbXBvcnROb3JtYXRpdmUuc2ggYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1NTVNDL2ltcG9ydE5vcm1hdGl2ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU2OGRkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtTU1TQy9pbXBvcnROb3JtYXRpdmUuc2gKQEAgLTAsMCArMSw4NSBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gdXNhZ2UgeworCWVjaG8gIlVzYWdlOiAkMCA8aG9zdElwPiA8aG9zdFBvcnQ+IDx1c2VySWQ+IgorfQorCitmdW5jdGlvbiBhZGRSZXNvdXJjZSgpIHsKKworCUVMRU1FTlRfTkFNRT0kMQorCWVjaG8gLWUgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IFN0YXJ0ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisJQ1VSUkVOVF9aSVBfRklMRT0uLyR7RUxFTUVOVF9OQU1FfS8ke0VMRU1FTlRfTkFNRX0uemlwCisJQ1VSUkVOVF9KU09OX0ZJTEU9Li8ke0VMRU1FTlRfTkFNRX0vJHtFTEVNRU5UX05BTUV9Lmpzb24KKwlzZWQgLWkgJ3MvInVzZXJJZCI6ICIuKiIsLyJ1c2VySWQiOiAiJyR7QVRUX1VJRH0nIiwvJyAke0NVUlJFTlRfSlNPTl9GSUxFfQorCUpTT05fQ09OVEVOVD1gcGFzdGUgLXMgJHtDVVJSRU5UX0pTT05fRklMRX1gCisJaHR0cF9jb2RlPSQoY3VybCAtcyAtbyAvZGV2L251bGwgLXcgIiV7aHR0cF9jb2RlfSIgLXYgLUYgcmVzb3VyY2VNZXRhZGF0YT0iJHtKU09OX0NPTlRFTlR9IiAtRiByZXNvdXJjZVppcD1AJHtDVVJSRU5UX1pJUF9GSUxFfSAtSCBVU0VSX0lEOiR7QVRUX1VJRH0gJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL211bHRpcGFydCkKKwlpZiBbICR7aHR0cF9jb2RlfSAtZXEgMjAxICBdOyB0aGVuCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBZGRpbmcgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKKwllbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA0MDkgXTsgdGhlbgorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWxyZWFkeSBleGlzdHMgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZWxpZiBbICR7aHR0cF9jb2RlfSAtZXEgNTAwIF07IHRoZW4KKwkJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJCWV4aXQgMQorCWZpCit9CitpZiBbICQjIC1sdCAzIF0KK3RoZW4KKwl1c2FnZQorCWV4aXQgMgorZmkKKworSE9TVF9JUD0kMQorSE9TVF9QT1JUPSQyCitBVFRfVUlEPSQzCitOT19DQVBTPSQ0CisKK2lmIFsgIiROT19DQVBTIiA9ICJub2NhcHMiIF07IHRoZW4KKwllY2hvICJTa2lwcGluZyBDYXBzIGltcG9ydC4uLiIKK2Vsc2UKKwkjQWRkIFRoZSBDYXBhYmlsaXR5VHlwZXMKKwlodHRwX2NvZGU9JChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyAiJXtodHRwX2NvZGV9IiAtdiAtRiBjYXBhYmlsaXR5VHlwZVppcD1AY2FwYWJpbGl0eVR5cGVzLnppcCAtSCAiVVNFUl9JRDogamgwMDAzIiAke0hPU1RfSVB9OiR7SE9TVF9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2NhcGFiaWxpdHkpCisJaWYgWyAke2h0dHBfY29kZX0gLWVxIDIwMSAgXTsgdGhlbgorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIFRoZSBDYXBhYmlsaXR5VHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZWxpZiBbICR7aHR0cF9jb2RlfSAtZXEgNTAwIF07IHRoZW4KKwkJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgQ2FwYWJpbGl0eVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCQlleGl0IDEKKwllbHNlCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGYWlsZWQgdG8gYWRkIENhcGFiaWxpdHlUeXBlcyBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKKwkJZXhpdCAxCisJZmkKKwkjQWRkIFRoZSBJbnRlcmZhY2VMaWZlY3ljbGVUeXBlcworCSNodHRwX2NvZGU9JChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyAiJXtodHRwX2NvZGV9IiAtdiAtRiBpbnRlcmZhY2VMaWZlY3ljbGVUeXBlWmlwPUBpbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy56aXAgLUggIlVTRVJfSUQ6IGpoMDAwMyIgJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkVHlwZS9pbnRlcmZhY2VMaWZlY3ljbGUpCisJI2lmIFsgJHtodHRwX2NvZGV9IC1lcSAyMDEgIF07IHRoZW4KKwkjCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBZGRpbmcgVGhlIEludGVyZmFjZUxpZmVjeWNsZVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCSNlbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA0MDkgXTsgdGhlbgorCSMgICAgZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFscmVhZHkgZXhpc3RzIEludGVyZmFjZUxpZmVjeWNsZVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCSNlbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA1MDAgXTsgdGhlbgorCSMJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJIwlleGl0IDEKKwkjZWxzZQorCSMJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJIwlleGl0IDEKKwkjZmkKK2ZpCisKK2FkZFJlc291cmNlICJhc2RjLm5vZGVzLlJvb3QiCithZGRSZXNvdXJjZSAiYXNkYy5ub2Rlcy5OZXR3b3JrIgorYWRkUmVzb3VyY2UgImFzZGMubm9kZXMubmV0d29yay5DaW5kZXIiCithZGRSZXNvdXJjZSAiYXNkYy5ub2Rlcy5uZXR3b3JrLkNvcmUiCithZGRSZXNvdXJjZSAiYXNkYy5ub2Rlcy5uZXR3b3JrLkRNWiIKK2FkZFJlc291cmNlICJhc2RjLm5vZGVzLm5ldHdvcmsuT0FNIgorYWRkUmVzb3VyY2UgImFzZGMubm9kZXMubmV0d29yay5UcmFmZmljIgorYWRkUmVzb3VyY2UgImFzZGMubm9kZXMubmV0d29yay5JbnRlcm5hbCIKK2FkZFJlc291cmNlICJhc2RjLm5vZGVzLk1vZHVsZSIKK2FkZFJlc291cmNlICJhc2RjLm5vZGVzLm1vZHVsZS5FQ0FfT0FNIgorYWRkUmVzb3VyY2UgImFzZGMubm9kZXMubW9kdWxlLkVDQV9UUlgiCithZGRSZXNvdXJjZSAiYXNkYy5ub2Rlcy5tb2R1bGUuRjVfTFRNIgorYWRkUmVzb3VyY2UgImFzZGMubm9kZXMubW9kdWxlLk1NU0MiCithZGRSZXNvdXJjZSAiYXNkYy5ub2Rlcy5tb2R1bGUuTkVNU19CRSIKK2FkZFJlc291cmNlICJhc2RjLm5vZGVzLm1vZHVsZS5ORU1TX0ZFIgorCisKKworCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvVkNFX0Jyb2NhZGVfVG9zY2EueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL1ZDRV9Ccm9jYWRlX1Rvc2NhLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MTc5MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL1ZDRV9Ccm9jYWRlX1Rvc2NhLnlhbWwKQEAgLTAsMCArMSw4MzQgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV9wcm9maWxlX2Zvcl9uZnZfMV8wXzAKK3Rvc2NhX2RlZmF1bHRfbmFtZXNwYWNlOiBOZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIG5hbWVzcGFjZQorZGVzY3JpcHRpb246IHZDRUJyb2NhZGUgYW5kIEJhc2UgVHlwZXMgZm9yIFZORiwgQ29ubmVjdGlvbiBQb2ludCwgVmlydHVhbCBMaW5rLCBldGMgYmFzZWQgb24gVk5GIE1vZGVsaW5nIEd1aWRlbGluZXMKKworbWV0YWRhdGE6IAorICB0ZW1wbGF0ZV9uYW1lOiBWQ0VfQnJvY2FkZS55YW1sCisgIHRlbXBsYXRlX2F1dGhvcjogS2F6aSBGYXJvb3F1aSAoS0Y2NTkzKQorICB0ZW1wbGF0ZV92ZXJzaW9uOiAiMC4xIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIERhdGEgVHlwZXMgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjZGF0YV90eXBlczoKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOT0RFIFRZUEUgREVGSU5JVElPTlMgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitub2RlX3R5cGVzOiAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyAgIFRPU0NBICAgVk5GIE5vZGUgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICB0b3NjYS5ub2Rlcy5uZnYuVk5GOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICB2bmZfY2F0ZWdvcnk6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFJvdXRlciwgRlcsIExCLCBETlMgYXJlIGV4YW1wbGUgY2F0ZWdvcmllcworICAgICAgaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSUQgb2YgdGhpcyBWTkYKKyAgICAgIHZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIHRoZSB2ZW5kb3Igd2hvIHByb3ZpZGVzIHRoaXMgVk5GCisgICAgICB2ZXJzaW9uOgorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICAgIGRlc2NyaXB0aW9uOiB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBmb3IgdGhpcyBWTkYKKyAgICAgICNkZXZpY2VfY29uZmlnOiAKKyAgICAgICAjIHR5cGU6IG1hcAorICAgICAgICAjZW50cnlfc2NoZW1hOiAKKyAgICAgICAgICMgdHlwZTogc3RyaW5nCisgICAgICAgICNkZWZhdWx0OiAKKyAgICAgICAgICMgcDE6IDEKKyAgICAgICAgICMgcDI6IDIKKyAgICAgICAgICAjcDM6IDMKKyAgICAjcmVxdWlyZW1lbnRzOgorICAgICAjIC0gdmlydHVhbExpbms6CisgICAgICAgICAgI2NhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlCisgICAgICAgICAgI29jY3VycmVuY2VzOiBbMSwgVU5CT1VOREVEXQorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMgICBBU0RDICAgIFZORiBOb2RlICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMubmZ2LlZORgorICAKKyAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFRPU0NBICBWRFUgTm9kZSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIAorICB0b3NjYS5ub2Rlcy5uZnYuVkRVOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgICAgI3Byb3BlcnRpZXM6IAorICAgIAorICAgIGNhcGFiaWxpdGllczogCisgICAgICBoaWdoX2F2YWlsYWJpbGl0eTogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuSEEKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCBVTkJPVU5ERURdICMgdGhpcyBpcyBkZWZhdWx0CisgICAgICAKKyAgICAgIHZpcnR1YWxfYmluZGluZzogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZQorICAgICAgICBvY2N1cnJlbmNlczogWzEsIFVOQk9VTkRFRF0gIyB0aGlzIGlzIGRlZmF1bHQKKyAgICAgICAKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBoaWdoX2F2YWlsYWJpbGl0eTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5mdi5IQQorICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwxXQorICAgICAgICAKKyAgICAgIC0gaG9zdDogIyNJcyBob3N0ZWQgaW4gYSBWTQorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjdGhpcyBpcyBkZWZhdWx0CisgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBU0RDIFZEVSBOb2RlIyMjIyMjICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5uZnYuVkRVCisgICAgZGVzY3JpcHRpb246IEEgVkRVIGlzIGEgY29tcHV0ZSBjb21wb25lbnQgb2YgVk5GICAgICAgCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFRPU0NBIENQIE5vZGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgdG9zY2Eubm9kZXMubmZ2LkNQOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIHR5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gdmlydHVhbGJpbmRpbmc6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZQorICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0gI3RoaXMgaXMgZGVmYXVsdAorICAgICAgICAKKyAgICAgIC0gdmlydHVhbGxpbms6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjdGhpcyBpcyBkZWZhdWx0CisgICAgICAgIAorICAgIGF0dHJpYnV0ZXM6IAorICAgICAgaXBfYWRkcmVzczogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAjIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQVNEQyBDUCBOb2RlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUDogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5uZnYuQ1AKKyAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyBJUEFHIFZMQU4gQ29ubmVjdG9yIENQIE5vZGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3I6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIGlwYWdfbmV0d29ya19uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAKKyAgICAgIGlwYWdfbmV0d29ya190eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAKKyAgICAgIGlwYWdfbmV0d29ya191dWlkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAKKyAgICAgIHZsYW5fc2VnbWVudF9pZHM6IAorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICBkZXNjcmlwdGlvbjogbGlzdCBvZiBzZWdtZW50YXRpb24gSWRzLgorICAgICAgICAKKyAgICAgIAorICAgICNhdHRyaWJ1dGVzOiAKKyAgICBjYXBhYmlsaXRpZXM6IAorICAgICAgZHVtbXlfY2FwYWJpbGl0eTogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5JUEFHX1ZMQU5fQ29ubmVjdG9yCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGNhcGFiaWxpdHkgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtb2RlbCB0aGlzIENvbm5lY3RvciBhcyBhIGNvbXBvbmVudCBvZiBWQ0UgVk5GLCBiZWNhdXNlIE5vZGUgVGVtcGxhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBBU0RDIFRlYW0KKyAgICAKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSB2aXJ0dWFsQmluZGluZ1JlcXVpcmVtZW50OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZQorICAgICAgICAgICNub2RlOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVCisgICAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxCaW5kc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjZGVmYXVsdAorICAgICAgICAgIAorICAgICAgLSB2aXJ0dWFsTGlua2luZ3JlcXVpcmVtZW50OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlCisgICAgICAgICAgI25vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZMCisgICAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxMaW5rc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjZGVmYXVsdAorICAgICAgICAgIAorICAgICNpbnRlcmZhY2VzOiAKKyAgICAgICNzdGFuZGFyZDogCisgICAgICAgICNjb25maWd1cmU6IAorICAgICAgICAgICNpbXBsZW1lbnRhdGlvbjogY29uZmlndXJlLnNoCisgICAgICAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyBWUEUgVkxBTiBDb25uZWN0b3IgQ1AgTm9kZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuVlBFX1ZMQU5fQ29ubmVjdG9yOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQCisgICAgcHJvcGVydGllczogCisgICAgICB2cGVfbmV0d29ya19uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAKKyAgICAgIHZwZV9uZXR3b3JrX3R5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIAorICAgICAgdnBlX25ldHdvcmtfdXVpZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgCisgICAgICB2bGFuX3NlZ21lbnRfaWRzOiAKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgZGVzY3JpcHRpb246IGxpc3Qgb2Ygc2VnbWVudGF0aW9uIElkcy4KKyAgICAgICAgCisgICAgICAKKyAgICAjYXR0cmlidXRlczogCisgICAgY2FwYWJpbGl0aWVzOiAKKyAgICAgIGR1bW15X2NhcGFiaWxpdHk6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVlBFX1ZMQU5fQ29ubmVjdG9yCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGNhcGFiaWxpdHkgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtb2RlbCB0aGlzIENvbm5lY3RvciBhcyBhIGNvbXBvbmVudCBvZiBWQ0UgVk5GLCBiZWNhdXNlIE5vZGUgVGVtcGxhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBBU0RDIFRlYW0KKyAgICAKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSB2aXJ0dWFsQmluZGluZ1JlcXVpcmVtZW50OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZQorICAgICAgICAgICNub2RlOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVCisgICAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxCaW5kc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjZGVmYXVsdAorICAgICAgICAgIAorICAgICAgLSB2aXJ0dWFsTGlua2luZ3JlcXVpcmVtZW50OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlCisgICAgICAgICAgI25vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZMCisgICAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxMaW5rc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjZGVmYXVsdAorICAgICAgICAgIAorICAgICNpbnRlcmZhY2VzOiAKKyAgICAgICNzdGFuZGFyZDogCisgICAgICAgICNjb25maWd1cmU6IAorICAgICAgICAgICNpbXBsZW1lbnRhdGlvbjogY29uZmlndXJlLnNoCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMgT0FNIFZMQU4gQ29ubmVjdG9yIENQIE5vZGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3RvcjogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUAorICAgIHByb3BlcnRpZXM6IAorICAgICAgb2FtX25ldHdvcmtfbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgCisgICAgICBvYW1fbmV0d29ya190eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAKKyAgICAgIG9hbV9uZXR3b3JrX3V1aWQ6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIAorICAgICAgdmxhbl9zZWdtZW50X2lkczogCisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIGRlc2NyaXB0aW9uOiBsaXN0IG9mIHNlZ21lbnRhdGlvbiBJZHMuCisgICAgICAgIAorICAgICAgCisgICAgI2F0dHJpYnV0ZXM6IAorICAgIGNhcGFiaWxpdGllczogCisgICAgICBkdW1teV9jYXBhYmlsaXR5OiAKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2Lk9BTV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBjYXBhYmlsaXR5IGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbW9kZWwgdGhpcyBDb25uZWN0b3IgYXMgYSBjb21wb25lbnQgb2YgVkNFIFZORiwgYmVjYXVzZSBOb2RlIFRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQVNEQyBUZWFtCisgICAgICAgIAorICAgIHJlcXVpcmVtZW50czogCisgICAgICAtIHZpcnR1YWxCaW5kaW5nUmVxdWlyZW1lbnQ6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WRFUuVmlydHVhbEJpbmRhYmxlCisgICAgICAgICAgI25vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuVmlydHVhbEJpbmRzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICNkZWZhdWx0CisgICAgICAgICAgCisgICAgICAtIHZpcnR1YWxMaW5raW5ncmVxdWlyZW1lbnQ6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WaXJ0dWFsTGlua2FibGUKKyAgICAgICAgICAjbm9kZTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuVmlydHVhbExpbmtzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICNkZWZhdWx0CisgICAgICAgICAgCisgICAgI2ludGVyZmFjZXM6IAorICAgICAgI3N0YW5kYXJkOiAKKyAgICAgICAgI2NvbmZpZ3VyZTogCisgICAgICAgICAgI2ltcGxlbWVudGF0aW9uOiBjb25maWd1cmUuc2ggICAgICAgCisgICAgICAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIFRPU0NBICAgVkwgTm9kZSBUeXBlICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgdG9zY2Eubm9kZXMubmZ2LlZMOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIHZlbmRvcjogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgdGhlIHZlbmRvciB3aG8gcHJvdmlkZXMgdGhpcyBWTAorICAgICAgICAKKyAgICBjYXBhYmlsaXRpZXM6IAorICAgICAgdmlydHVhbGxpbmthYmxlOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5mdi5WaXJ0dWFsTGlua2FibGUKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCBVTkJPVU5ERURdICMgdGhpcyBpcyBkZWZhdWx0CisgICAgICAgIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFTREMgVkwgTm9kZSAgVFlQRSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZMOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMubmZ2LlZMCisgICAgCisgICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQVNEQyBWTkYgTm9kZSBUWVBFICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORjogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5uZnYuVk5GCisgICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQVNEQyBSb3V0aW5nIENhdGVnb3J5IFZEVSAjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Sb3V0aW5nQ2F0ZWdvcnlWRFU6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVCisgICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgdkNFX0Jyb2NhZGVfVkRVIE5vZGUgIFRZUEUgICMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFU6I3BhaGFyb25pIC0gcmVuYW1lZCBmcm9tIG9yZy5vcGVuZWNvbXAucmVzb3VyY2Uudi9WQ0VfQnJvY2FkZV9WRFUgdG8ga2VlcCBjb252ZW50aW9uCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUm91dGluZ0NhdGVnb3J5VkRVCisgICAgZGVzY3JpcHRpb246IERlZmluaXRpb24gb2YgVkNFIEJyb2NhZGUgVkRVCisgICAgcHJvcGVydGllczogCisgICAgICB2bmZfY2F0ZWdvcnk6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IGlucHV0IHByb3ZpZGVkIGF0IFJFU09VUkNFIElOSkVDVElPTiBUSU1FIGluIEFTREMgVE9PTAorICAgICAgdmNlX3R5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IGlucHV0IHByb3ZpZGVkIGF0IFJFU09VUkNFIElOSkVDVElPTiBUSU1FIGluIEFTREMgVE9PTAorICAgICAgdmVuZG9yOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBpbnB1dCBwcm92aWRlZCBhdCBSRVNPVVJDRSBJTkpFQ1RJT04gVElNRSBpbiBBU0RDIFRPT0wKKyAgICAgIHZlcnNpb246IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IGlucHV0IHByb3ZpZGVkIGF0IFJFU09VUkNFIElOSkVDVElPTiBUSU1FIGluIEFTREMgVE9PTAorICAgICAgaW1hZ2VfaWQ6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IERFU0lHTiBUSU1FIGJ5IFNlcnZpY2UgQ29tcG9zZXIgb3IgRGVzaWduZXIgLXZDRSBpbWFnZSB1c2VkIHRvIGJvb3QgVk0KKyAgICAgIGZsYXZvcl9pZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciAtIFZNIFNpemUsIFNNQUxMLCBNRURJVU0sIExBUkdFCisgICAgICB1c2VybmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciAtbG9naW4gdXNlciBJZCBvZiBSb3V0ZXIKKyAgICAgIHBhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJIElucHV0IHByb3ZpZGVkIGF0IERFU0lHTiBUSU1FIGJ5IFNlcnZpY2UgQ29tcG9zZXIgb3IgRGVzaWduZXIgLSBwYXNzd29yZCBmb3IgbG9naW4gCisgICAgICBkb21haW5fbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciBvciAocGVyaGFwcyBwcmUtZGVmaW5lZCBmb3IgZWFjaCBDbG91ZCBSZWdpb24pIC0gbG9naW4gZG9tYWluCisgICAgICB0aW1lX3pvbmU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IERFU0lHTiBUSU1FIGJ5IFNlcnZpY2UgQ29tcG9zZXIgb3IgRGVzaWduZXIgb3IgKHBlcmhhcHMgcHJlLWRlZmluZWQgZm9yIGVhY2ggQ2xvdWQgUmVnaW9uKSAtIHRpbWUgem9uZSB0byBzZXQgZm9yIHZDRQorICAgICAgbG9naW5fc2Vzc2lvbl90aW1lb3V0OiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBERVNJR04gVElNRSBieSBTZXJ2aWNlIENvbXBvc2VyIG9yIERlc2lnbmVyIG9yIChwZXJoYXBzIHByZS1kZWZpbmVkIGZvciBlYWNoIENsb3VkIFJlZ2lvbikgLSB1c2VyIGxvZ2luIHNlc3Npb24gdGltZW91dAorICAgICAgaXBhZ192bGFuX2JhbmR3aWR0aDogCisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IERFU0lHTiBUSU1FIGJ5IFNlcnZpY2UgQ29tcG9zZXIgb3IgRGVzaWduZXIgLSBiYW5kd2lkdGggIGFsbG9jYXRpb24gb2YgY3VzdG9tZXIgVkxBTiByZXF1ZXN0ZWQgYnkgY3VzdG9tZXIKKyAgICAgIHZwZV92bGFuX2ludGVyZmFjZV9xb3NfbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciAtIFFvUyBQb2xpY3kgbmFtZSB0byBiZSBhcHBsaWVkIHRvIHRoaXMgaW50ZXJmYWNlCisgICAgICBpcGFnX3ZsYW5faW50ZXJmYWNlX3Fvc19uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBERVNJR04gVElNRSBieSBTZXJ2aWNlIENvbXBvc2VyIG9yIERlc2lnbmVyIC0gUW9TIFBvbGljeSBuYW1lIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBpbnRlcmZhY2UKKyAgICAgIGhvc3RuYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIEhvc3QgVk0gaXMgY3JlYXRlZCBmaXJzdCBhbmQgdGhpcyB2YWx1ZSBpcyBpbnB1dCB3aGVuIHRoZSB2Q0UgaW1hZ2UgaXMgbGF0ZXIgb24gaW5zdGFsbGVkIGJ5IENsb3VkLVBPCisgICAgICBob3N0X2lwOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIEhvc3QgVk0gSVAKKyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIENsb3VkIGF2YWlsYWJpbGl0eSB6b25lIHdoZXJlIFZNIGlzIGNyZWF0ZWQKKyAgICAgIG9hbV9sb29wYmFja192bGFuX2lwX2FkZHJlc3M6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gT0FNIE5ldHdvcmsgaXMgcHJlLWNyZWF0ZWQgLSBhbHJlYWR5IGV4aXN0cyBpbiBEYXRhIENlbnRlcgorICAgICAgaXBhZ192bGFuX2lwX2FkZHJlc3M6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gSVBBRyBWTEFOIE5ldHdvcmsgaXMgY3JlYXRlZCBieSBDbG91ZC1QTyBiZWZvcmUgdGhlIHZDRSBpcyBjcmVhdGVkIG9yIGluc3RhbGxlZAorICAgICAgdnBlX3ZsYW5faXBfYWRkcmVzczogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgUlVOIFRJTUUgYnkgQ2xvdWQtUE8gLSBWUEUgVkxBTiBOZXR3b3JrIGlzIGNyZWF0ZWQgYnkgQ2xvdWQtUE8gYmVmb3JlIHRoZSB2Q0UgaXMgY3JlYXRlZCAvIGluc3RhbGxlZAorICAgICAgdnBlX3ZsYW5faWQ6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gVkxBTiBJZCBpcyBjcmVhdGVkIGZpcnN0IGJ5IENsb3VkLVBPLiBJdCBpcyByZXF1aXJlZCB0byBhcHBseSBWUEUgUW9TIFBvbGljeQorICAgICAgaXBhZ192bGFuX2lkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIFZMQU4gSWQgaXMgY3JlYXRlZCBmaXJzdCBieSBDbG91ZC1QTy4gSXQgaXMgcmVxdWlyZWQgdG8gYXBwbHkgSVBBRyBRb1MgUG9saWN5CisgICAgICBvYW1fdmxhbl9pbnRlcmZhY2VfbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgUlVOIFRJTUUgYnkgQ2xvdWQtUE8gLSBUaGlzIGludGVyZmNlIGlzIGNyZWF0ZWQgZmlyc3QgYnkgQ2xvdWQtUE8uIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byB3aGljaCBRb1MgcG9saWN5IGlzIGFwcGxpZWQKKyAgICAgIHZwZV92bGFuX2ludGVyZmFjZV9uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIFRoaXMgaW50ZXJmY2UgaXMgY3JlYXRlZCBmaXJzdCBieSBDbG91ZC1QTy4gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIHdoaWNoIFFvUyBwb2xpY3kgaXMgYXBwbGllZAorICAgICAgaXBhZ192bGFuX2ludGVyZmFjZV9uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIFRoaXMgaW50ZXJmY2UgaXMgY3JlYXRlZCBmaXJzdCBieSBDbG91ZC1QTy4gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIHdoaWNoIFFvUyBwb2xpY3kgaXMgYXBwbGllZAorICAgICMjIyMjIyMjIyMjIyNBVFRSSUJVVEVTIG9mIHZDRSAtIFRoZXNlIHZhbHVlcyBhcmUgb3V0cHV0dGVkIGJ5IENsb3VkLVBPIHdoZW4gdkNFIGlzIGNyZWF0ZWQgLyBpbnN0YWxsZWQgIyMjIyMjIyMjIyMjIyMKKyAgICBhdHRyaWJ1dGVzOiAKKyAgICAgIHZjZV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE5hbWUgYXNzaWduZWQgdG8gdkNFIGJ5IENsb3VkLVBPCisgICAgICBvYW1fbG9vcGJhY2tfdmxhbl9pcGFkZHJlczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJUCBBZGRyZXNzIGFzc2lnbmVkIGJ5IENsb3VkLVBPIHRvIE9BTSBWTEFOCisgICAgICBpcGFnX3ZsYW5faXBhZGRyZXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSVAgQWRkcmVzcyBhc3NpZ25lZCBieSBDbG91ZC1QTyB0byBJUEFHIFZMQU4KKyAgICAgIHZwZV92bGFuX2lwYWRkcmVzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElQIEFkZHJlc3MgYXNzaWduZWQgYnkgQ2xvdWQtUE8gdG8gVlBFIFZMQU4KKyAgICAgIHZuZl9pZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogdW5pcXVlIGlkIGFzc2lnbmVkIHRvIFZORiBieSBDbG91ZC1QTyAtIHVzZWQgZm9yIEFBSSBtZXRhZGF0YQorICAgIAorICAgICMjIyMjIyMjIyMjIyNDQVBBQklMSVRJRVMgb2YgdkNFIC0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIGNhcGFiaWxpdGllczogCisgICAgICBjZV9yb3V0aW5nX2NhcGFiaWxpdHk6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuQ0VSb3V0aW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBiYXNlIGNhcGFiaWxpdHkgb2YgdkNFCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgVU5CT1VOREVEXSAjIGRlZmF1bHQKKyAgICAgICAgCisgICAgICBzdGF0aWNfcm91dGluZzogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5TdGF0aWNSb3V0aW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBvcHRpb25hbCBjYXBhYmlsaXR5IG9mIHRoZSB2Q0UKKyAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdCisgICAgICAgIAorICAgICAgYmdwX3JvdXRpbmc6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuQkdQUm91dGluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyB0aGUgb3B0aW9uYWwgY2FwYWJpbGl0eSBvZiB0aGUgdkNFCisgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXQorICAgICAgCisgICAgICB2aXJ0dWFsX2JpbmRhYmxlOiAKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZEVS5WaXJ0dWFsQmluZGFibGUjIHBhaGFyb25pIC0gY2hhbmdlZCB0byBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYudmR1LlZpcnR1YWxCaW5kYWJsZSBmcm9tIHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZSAtIHdhcyBpdCBpbnRlbnRpb25hbD8/CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBpbnRlcm5hbCBjYXBhYmlsaXR5IG9mIHRoZSBWRFUgdG8gc3VwcG9ydCBCaW5kaW5nIHRvIENvbm5lY3Rpb24gUG9pbnRzCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgVU5CT1VOREVEXQorICAgICAgICAKKyAgICAgIGR1bW15X2NhcGFiaWxpdHk6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVkNFX0Jyb2NhZGVfUm91dGluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBjYXBhYmlsaXR5IGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbW9kZWwgVkNFIFZEVSBhcyBhIGNvbXBvbmVudCBvZiBWQ0UgVk5GLCBiZWNhdXNlIE5vZGUgVGVtcGxhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBBU0RDIFRlYW0KKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjUkVRVUlSRU1FTlRTIG9mIHZDRSAtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHJlcXVpcmVtZW50czogCisgICAgICAtIG5hdDogIyBBIHZDRSAgbWF5IGhhdmUgYSByZXF1aXJlbWVudCB0byBjb25uZWN0IHRvIGEgVk5GIG9mZmVyaW5nIHRoaXMgY2FwYWJpbGl0eSwgZHVyaW5nIHNlcnZpY2UgY29tcG9zaXRpb24KKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLk5ldHdvcmtBZGRyZXNzVHJhbnNsYXRpb25DYXBhYmlsaXR5CisgICAgICAgICAgbm9kZTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuQ25uZWN0c1RvTkFUCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCAxXQorICAgICAgICAgIAorICAgICAgLSBwYXQ6ICMgQSB2Q0UgIG1heSBoYXZlIGEgcmVxdWlyZW1lbnQgdG8gY29ubmVjdCB0byBhIFZORiBvZmZlcmluZyB0aGlzIGNhcGFiaWxpdHksIGR1cmluZyBzZXJ2aWNlIGNvbXBvc2l0aW9uCisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5Qb3J0QWRkcmVzc1RyYW5zbGF0aW9uQ2FwYWJpbGl0eQorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVICNwYWhhcm9uaSAtIHJlbmFtZWQgZnJvbSBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUG9ydEFkZHJlc3NUcmFuc2xhdGlvbkNhdGVnb3J5VkRVLiBSZXNvdXJjZSBuYW1lIGNhbiBiZSB1cCB0byA1MCBjaGFycworICAgICAgICAgIHJlbGF0aW9uc2hpcDogb3JnLm9wZW5lY29tcC5yZWxhdGlvbnNoaXBzLm5mdi5Dbm5lY3RzVG9QQVQKKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIDFdCisgICAgICAgICAgCisgICAgICAKKyAgICAgIC0gZmlyZXdhbGw6ICMgQSB2Q0UgIG1heSBoYXZlIGEgcmVxdWlyZW1lbnQgdG8gY29ubmVjdCB0byBhIFZORiBvZmZlcmluZyB0aGlzIGNhcGFiaWxpdHksIGR1cmluZyBzZXJ2aWNlIGNvbXBvc2l0aW9uCisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5GaXJld2FsbENhcGFiaWxpdHkgIAorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5GaXJld2FsbENhdGVnb3J5VkRVIAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogb3JnLm9wZW5lY29tcC5yZWxhdGlvbnNoaXBzLm5mdi5Dbm5lY3RzVG9GaXJld2FsbAorICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgMV0gICAgIAorICAgICAgICAgIAorICAgICAgLSBkaGNwOiAgIyBBIHZDRSAgbWF5IGhhdmUgYSByZXF1aXJlbWVudCB0byBjb25uZWN0IHRvIGEgVk5GIG9mZmVyaW5nIHRoaXMgY2FwYWJpbGl0eSwgZHVyaW5nIHNlcnZpY2UgY29tcG9zaXRpb24KKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLkRIQ1BDYXBhYmlsaXR5CisgICAgICAgICAgbm9kZTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogb3JnLm9wZW5lY29tcC5yZWxhdGlvbnNoaXBzLm5mdi5Dbm5lY3RzVG9ESENQCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCAxXQorICAgICAgICAgIAorICAgICAgLSBkbnM6ICAjIEEgdkNFICBtYXkgaGF2ZSBhIHJlcXVpcmVtZW50IHRvIGNvbm5lY3QgdG8gYSBWTkYgb2ZmZXJpbmcgdGhpcyBjYXBhYmlsaXR5LCBkdXJpbmcgc2VydmljZSBjb21wb3NpdGlvbgorICAgICAgICAgIGNhcGFiaWxpdHk6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuRE5TQ2FwYWJpbGl0eQorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ETlNDYXRlZ29yeVZEVQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogb3JnLm9wZW5lY29tcC5yZWxhdGlvbnNoaXBzLm5mdi5Dbm5lY3RzVG9ETlMKKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIDFdCisgICAgICAgICAgCisgICAgICAtIGhvc3RlZF9vbjogICMgQSB2Q0UgIG5lZWRzIHRvIGJlIGhvc3RlZCBpbiBhIFZNCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICNkZWZhdWx0CisgICAgCisgICAgICAgIAorICAgICAgCisgICAgICAgICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyB2Q0VfQnJvY2FkZV9WTkYgTm9kZSAgVFlQRSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIElOIFRIRSBBQlNFTkNFIE9GIE5PREUgVEVNUExBVEUsIHRoZSB2Q0VfQnJvY2FkZV9WTkYgTm9kZSBUeXBlIGlzIG1vZGVsZWQgYXMgUkVRVUlSSU5HOiAjIyMjIworIyMjIyMjIyMjIyMgMS4gdmNlX0Jyb2NhZGVfVkRVIE5vZGUgICAgICAgICAgICAgICAKKyMjIyMjIyMjIyMjIDIuIG9hbV92bGFuX2Nvbm5lY3RvciBOb2RlCisjIyMjIyMjIyMjIyAzLiBpcGFnX3ZsYW5fY29ubmVjdG9yIE5vZGUKKyMjIyMjIyMjIyMjIDQuIHZwZV92bGFuX2Nvbm5lY3RvciBOb2RlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5WQ0VfQnJvY2FkZV9WTkY6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gdmNlX2Jyb2NhZGVfdmR1OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVkNFX0Jyb2NhZGVfUm91dGluZworICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUKKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdCisgICAgICAgICAgCisgICAgICAtIG9hbV92bGFuX2Nvbm5lY3RvcjoKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuT0FNX1ZMQU5fQ29ubmVjdG9yCisgICAgICAgICAgbm9kZTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXQorICAgICAgICAgIAorICAgICAgLSB2cGVfdmxhbl9jb25uZWN0b3I6CisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZQRV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0KKyAgICAgICAgICAKKyAgICAgIC0gaXBhZ192bGFuX2Nvbm5lY3RvcjogCisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LklQQUdfVkxBTl9Db25uZWN0b3IKKyAgICAgICAgICBub2RlOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5JUEFHX1ZMQU5fQ29ubmVjdG9yCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBBU0RDICBOQVQgVkRVIE5vZGUgIFRZUEUgICMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVOiAjcGFoYXJvbmkgLSByZW5hbWVkIGZyb20gb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyZXNzVHJhbnNsYXRpb25DYXRlZ29yeVZEVS4gUmVzb3VyY2UgbmFtZSBjYW4gYmUgdXAgdG8gNTAgY2hhcnMgaW4gQVNEQworICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVCisgICAgY2FwYWJpbGl0aWVzOiAjcGFoYXJvbmkgLSBhZGRlZCB0byBjb25uZWN0IHRvIFZDRV9Ccm9jYWRlX1ZEVQorICAgICAgbmF0OiAKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5OZXR3b3JrQWRkcmVzc1RyYW5zbGF0aW9uQ2FwYWJpbGl0eQorICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBjYXBhYmlsaXR5IGhhcyBiZWVuIGludHJvZHVjZWQKKyAgICAjIyMjIyMjIyMjIyMjIyNGdXJ0aGVyIGRldGFpbHMgZGVzY3JpYmVkIGluIE5BVCBWTkYgVE9TQ0EgTW9kZWwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBBVCBWRFUgTm9kZSAgVFlQRSAgIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFU6ICNwYWhhcm9uaSAtIHJlbmFtZWQgZnJvbSBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUG9ydEFkZHJlc3NUcmFuc2xhdGlvbkNhdGVnb3J5VkRVLiBSZXNvdXJjZSBuYW1lIGNhbiBiZSB1cCB0byA1MCBjaGFycyBpbiBBU0RDCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUKKyAgICBjYXBhYmlsaXRpZXM6ICNwYWhhcm9uaSAtIGFkZGVkIHRvIGNvbm5lY3QgdG8gVkNFX0Jyb2NhZGVfVkRVCisgICAgICBwYXQ6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLlBvcnRBZGRyZXNzVHJhbnNsYXRpb25DYXBhYmlsaXR5CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGNhcGFiaWxpdHkgaGFzIGJlZW4gaW50cm9kdWNlZAorICAgICMjIyMjIyMjIyMjIyMjI0Z1cnRoZXIgZGV0YWlscyBkZXNjcmliZWQgaW4gUEFUIFZORiBUT1NDQSBNb2RlbAorICAgIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZpcmV3YWxsICBWRFUgTm9kZSAgVFlQRSAgIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFU6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVCisgICAgY2FwYWJpbGl0aWVzOiAjcGFoYXJvbmkgLSBhZGRlZCB0byBjb25uZWN0IHRvIFZDRV9Ccm9jYWRlX1ZEVQorICAgICAgZmlyZXdhbGw6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLkZpcmV3YWxsQ2FwYWJpbGl0eQorICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBjYXBhYmlsaXR5IGhhcyBiZWVuIGludHJvZHVjZWQKKyAgICAjIyMjIyMjIyMjIyMjIyNGdXJ0aGVyIGRldGFpbHMgZGVzY3JpYmVkIGluIEZpcmV3YWxsIFZORiBUT1NDQSBNb2RlbAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgREhDUCAgVkRVIE5vZGUgIFRZUEUgICMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ESENQQ2F0ZWdvcnlWRFU6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVCisgICAgY2FwYWJpbGl0aWVzOiAjcGFoYXJvbmkgLSBhZGRlZCB0byBjb25uZWN0IHRvIFZDRV9Ccm9jYWRlX1ZEVQorICAgICAgZGhjcDogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuREhDUENhcGFiaWxpdHkKKyAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgY2FwYWJpbGl0eSBoYXMgYmVlbiBpbnRyb2R1Y2VkCisgICAgIyMjIyMjIyMjIyMjIyMjRnVydGhlciBkZXRhaWxzIGRlc2NyaWJlZCBpbiBESENQIFZORiBUT1NDQSBNb2RlbAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRE5TICBWRFUgTm9kZSAgVFlQRSAgIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVQorICAgIGNhcGFiaWxpdGllczogI3BhaGFyb25pIC0gYWRkZWQgdG8gY29ubmVjdCB0byBWQ0VfQnJvY2FkZV9WRFUKKyAgICAgIGRuczogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuRE5TQ2FwYWJpbGl0eQorICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBjYXBhYmlsaXR5IGhhcyBiZWVuIGludHJvZHVjZWQKKyAgICAjIyMjIyMjIyMjIyMjIyNGdXJ0aGVyIGRldGFpbHMgZGVzY3JpYmVkIGluIEROUyBWTkYgVE9TQ0EgTW9kZWwKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENBUEFCSUxJVFkgVFlQRSBERUZJTklUSU9OUyAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NhcGFiaWxpdHlfdHlwZXM6ICAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUT1NDQSBDYXBhYmlsaXR5OiBWaXJ0dWFsQmluZGFibGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZTogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCAKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5uZnYuVkRVXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQVNEQyBDYXBhYmlsaXR5OiBWaXJ0dWFsQmluZGFibGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZTogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2LlZEVS5WaXJ0dWFsQmluZGFibGUKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFVdCisgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUT1NDQSAgQ2FwYWJpbGl0eTogVmlydHVhbExpbmthYmxlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2LlZpcnR1YWxMaW5rYWJsZTogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCAjI3BhaGFyb25pIC0gY2hhbmdlZCBmcm9tIHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlIC0gY2Fubm90IGRlcml2ZSBmcm9tIGl0c2VsZgorICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZMXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQVNEQyBDYXBhYmlsaXR5OiBWaXJ0dWFsTGlua2FibGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290IAorICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLm5mdi5WTF0KKyAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogSGlnaEF2YWlsYWJpbGl0eSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuSEE6IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5uZnYuVkRVXQorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjQ2FwYWJpbGl0eTogR2VuZXJpYyBhc2RjIGNhcGFiaWxpdHkgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAorICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDYXBhYmlsaXR5OiBHRU5FUklDIFJPVVRJTkcgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAorICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuUm91dGluZ0NhcGFiaWxpdHk6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICByb3V0aW5nX3R5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IHNvbWUgYmFzaWMgcm91dGluZyBkZXNjcmlwdG9yLCBpZiBhbnk/Pz8KKyAgICAgICAgY29uc3RyYWludHM6IAorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbVEJEMSwgVEJEbl0KKyAgICAjYXR0cmlidXRlczogPz8/CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlJvdXRpbmdDYXRlZ29yeVZEVV0KKyAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDYXBhYmlsaXR5OiBDRSBST1VUSU5HICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LkNFUm91dGluZzogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuUm91dGluZ0NhcGFiaWxpdHkKKyAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IFBFIFJPVVRJTkcgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAorICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuUEVSb3V0aW5nOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5Sb3V0aW5nQ2FwYWJpbGl0eQorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IFAgUk9VVElORyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5QUm91dGluZzogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuUm91dGluZ0NhcGFiaWxpdHkKKyAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IEJHUCBST1VUSU5HICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LkJHUFJvdXRpbmc6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlJvdXRpbmdDYXBhYmlsaXR5CisgICAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDYXBhYmlsaXR5OiBTVEFUSUMgUk9VVElORyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5TdGF0aWNSb3V0aW5nOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5Sb3V0aW5nQ2FwYWJpbGl0eQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogTmV0d29yayBBZGRyZXNzIFRyYW5zbGF0aW9uICAjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5OZXR3b3JrQWRkcmVzc1RyYW5zbGF0aW9uQ2FwYWJpbGl0eTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIG5hdF90eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBzb21lIGJhc2ljIE5BVCBkZXNjcmlwdG9yLCBpZiBhbnk/Pz8KKyAgICAgICAgY29uc3RyYWludHM6IAorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbVEJEMSwgVEJEbl0KKyAgICAjYXR0cmlidXRlczogPz8/CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFVdCisgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogUG9ydCBBZGRyZXNzIFRyYW5zbGF0aW9uICAjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5Qb3J0QWRkcmVzc1RyYW5zbGF0aW9uQ2FwYWJpbGl0eTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHBhdF90eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBzb21lIGJhc2ljIFBBVCBkZXNjcmlwdG9yLCBpZiBhbnk/Pz8KKyAgICAgICAgY29uc3RyYWludHM6IAorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbVEJEMSwgVEJEbl0KKyAgICAjYXR0cmlidXRlczogPz8/CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFVdICAKKyAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IEZJUkVXQUxMICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuRmlyZXdhbGxDYXBhYmlsaXR5OiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgZmlyZXdhbGxfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogc29tZSBiYXNpYyBGaXJld2FsbCBDYXBhYmlsaXR5IGRlc2NyaXB0b3IsIGlmIGFueT8/PworICAgICAgICBjb25zdHJhaW50czogCisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFtUQkQxLCBUQkRuXQorICAgICNhdHRyaWJ1dGVzOiA/Pz8KKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVV0gIAorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogREhDUCAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5ESENQQ2FwYWJpbGl0eTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIGRoY3BfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogc29tZSBiYXNpYyBESENQICBDYXBhYmlsaXR5IGRlc2NyaXB0b3IsIGlmIGFueT8/PworICAgICAgICBjb25zdHJhaW50czogCisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFtUQkQxLCBUQkRuXQorICAgICNhdHRyaWJ1dGVzOiA/Pz8KKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVXSAgCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IEROUyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuRE5TQ2FwYWJpbGl0eTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIGRuc190eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBzb21lIGJhc2ljIEROUyAgQ2FwYWJpbGl0eSBkZXNjcmlwdG9yLCBpZiBhbnk/Pz8KKyAgICAgICAgY29uc3RyYWludHM6IAorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbVEJEMSwgVEJEbl0KKyAgICAjYXR0cmlidXRlczogPz8/CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVXSAgCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IHZDRSBCcm9jYWRlIFJPVVRJTkcgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIERVTU1ZCisgICMjIyMjIyMjIyMjIyMjIFRISVMgSVMgQ0FQQUJJTElUWSBJUyBPTkxZIE9GRkVSRUQgQlkgU1BFQ0lGSUMgQlJPQ0FERSBWRFUgIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi52Q0VfQnJvY2FkZV9Sb3V0aW5nOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5DRVJvdXRpbmcKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogT0FNIFZMQW4gQ29ubmVjdG9yICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyBEVU1NWQorICAjIyMjIyMjIyMjIyMjIyBUSElTIElTIENBUEFCSUxJVFkgSVMgT05MWSBPRkZFUkVEIEJZIFNQRUNJRklDIENvbm5lY3RvciAjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2Lk9BTV9WTEFOX0Nvbm5lY3RvcjogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogSVBBRyBWTEFuIENvbm5lY3RvciAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMgRFVNTVkKKyAgIyMjIyMjIyMjIyMjIyMgVEhJUyBJUyBDQVBBQklMSVRZIElTIE9OTFkgT0ZGRVJFRCBCWSBTUEVDSUZJQyBDb25uZWN0b3IgIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5JUEFHX1ZMQU5fQ29ubmVjdG9yOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5JUEFHX1ZMQU5fQ29ubmVjdG9yXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogVlBFIFZMQW4gQ29ubmVjdG9yICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyBEVU1NWQorICAjIyMjIyMjIyMjIyMjIyBUSElTIElTIENBUEFCSUxJVFkgSVMgT05MWSBPRkZFUkVEIEJZIFNQRUNJRklDIENvbm5lY3RvciAjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZQRV9WTEFOX0Nvbm5lY3RvcjogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuVlBFX1ZMQU5fQ29ubmVjdG9yXQorICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJFTEFUSU9OU0hJUCBUWVBFIERFRklOSVRJT05TICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAKK3JlbGF0aW9uc2hpcF90eXBlczoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNUT1NDQSBSZWxhdGlvbnNoaXA6IFZpcnR1YWxCaW5kc1RvICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisgIHRvc2NhLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxCaW5kc1RvOiAgIAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0c1RvCisgICAgZGVzY3JpcHRpb246IFJlcHJlc2VudHMgdGhlIHJlbGF0aW9uc0hJUCBiZXR3ZWVuIFZEVSBhbmQgQ1AgTm9kZSBUeXBlcworICAgIHZhbGlkX3RhcmdldF90eXBlczogW3Rvc2NhLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZV0KKyAgICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNBU0RDICBSZWxhdGlvbnNoaXA6IFZpcnR1YWxCaW5kc1RvICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisgIG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuVmlydHVhbEJpbmRzVG86ICAgCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5mdi5WaXJ0dWFsQmluZHNUbworICAgIGRlc2NyaXB0aW9uOiBSZXByZXNlbnRzIHRoZSByZWxhdGlvbnNISVAgYmV0d2VlbiBWRFUgYW5kIENQIE5vZGUgVHlwZXMKKyAgICB2YWxpZF90YXJnZXRfdHlwZXM6IFtvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVkRVLlZpcnR1YWxCaW5kYWJsZV0KKyAgICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUT1NDQSAgUmVsYXRpb25zaGlwOiBWaXJ0dWFsTGlua3NUbyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisgIHRvc2NhLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxMaW5rc1RvOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbworICAgIGRlc2NyaXB0aW9uOiBSZXByZXNlbnRzIHRoZSByZWxhdGlvbnNISVAgYmV0d2VlbiBDUCBhbmQgVkwgTm9kZSBUeXBlcworICAgIHZhbGlkX3RhcmdldF90eXBlczogW3Rvc2NhLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlXSAKKyAgICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBU0RDICAgUmVsYXRpb25zaGlwOiBWaXJ0dWFsTGlua3NUbyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisgIG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuVmlydHVhbExpbmtzVG86IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0c1RvCisgICAgZGVzY3JpcHRpb246IFJlcHJlc2VudHMgdGhlIHJlbGF0aW9uc0hJUCBiZXR3ZWVuIENQIGFuZCBWTCBOb2RlIFR5cGVzCisgICAgdmFsaWRfdGFyZ2V0X3R5cGVzOiBbb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZpcnR1YWxMaW5rYWJsZV0gCisgICAgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICBBU0RDIFJlbGF0aW9uc2hpcDogQ29ubmVjdHNUb05BVCAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisgIG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuQ25uZWN0c1RvTkFUOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbworICAgIGRlc2NyaXB0aW9uOiBSZXByZXNlbnRzIHRoZSByZWxhdGlvbnNISVAgYmV0d2VlbiBhIFZORiBhbmQgTkFUIGNhcGFibGUgTm9kZQorICAgICNwcm9wZXJ0aWVzOiAKKyAgICAjYXR0cmlidXRlczogCisgICAgI2ludGVyZmFjZXM6IAorICAgIHZhbGlkX3RhcmdldF90eXBlczogW29yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuTmV0d29ya0FkZHJlc3NUcmFuc2xhdGlvbkNhcGFiaWxpdHldIAorICAgIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgQVNEQyBSZWxhdGlvbnNoaXA6IENvbm5lY3RzVG9QQVQgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorICBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LkNubmVjdHNUb1BBVDogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RzVG8KKyAgICBkZXNjcmlwdGlvbjogUmVwcmVzZW50cyB0aGUgcmVsYXRpb25zSElQIGJldHdlZW4gYSBWTkYgYW5kIFBBVCBjYXBhYmxlIE5vZGUKKyAgICAjcHJvcGVydGllczogCisgICAgI2F0dHJpYnV0ZXM6IAorICAgICNpbnRlcmZhY2VzOiAKKyAgICB2YWxpZF90YXJnZXRfdHlwZXM6IFtvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLlBvcnRBZGRyZXNzVHJhbnNsYXRpb25DYXBhYmlsaXR5XSAKKyAgICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIEFTREMgUmVsYXRpb25zaGlwOiBDb25uZWN0c1RvRmlyZXdhbGwgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorICBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LkNubmVjdHNUb0ZpcmV3YWxsOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbworICAgIGRlc2NyaXB0aW9uOiBSZXByZXNlbnRzIHRoZSByZWxhdGlvbnNISVAgYmV0d2VlbiBhIFZORiBhbmQgRmlyZXdhbGwgY2FwYWJsZSBOb2RlCisgICAgI3Byb3BlcnRpZXM6IAorICAgICNhdHRyaWJ1dGVzOiAKKyAgICAjaW50ZXJmYWNlczogCisgICAgdmFsaWRfdGFyZ2V0X3R5cGVzOiBbb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5GaXJld2FsbENhcGFiaWxpdHldICAgIAorICAgIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgQVNEQyBSZWxhdGlvbnNoaXA6IENvbm5lY3RzVG9ETlMgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorICBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LkNubmVjdHNUb0ROUzogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RzVG8KKyAgICBkZXNjcmlwdGlvbjogUmVwcmVzZW50cyB0aGUgcmVsYXRpb25zSElQIGJldHdlZW4gYSBWTkYgYW5kIEROUyBjYXBhYmxlIE5vZGUKKyAgICAjcHJvcGVydGllczogCisgICAgI2F0dHJpYnV0ZXM6IAorICAgICNpbnRlcmZhY2VzOiAKKyAgICB2YWxpZF90YXJnZXRfdHlwZXM6IFtvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLkROU0NhcGFiaWxpdHldICAKKyAgICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIEFTREMgUmVsYXRpb25zaGlwOiBDb25uZWN0c1RvREhDUCAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisgIG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuQ25uZWN0c1RvREhDUDogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkNvbm5lY3RzVG8KKyAgICBkZXNjcmlwdGlvbjogUmVwcmVzZW50cyB0aGUgcmVsYXRpb25zSElQIGJldHdlZW4gYSBWTkYgYW5kIERIQ1AgY2FwYWJsZSBOb2RlCisgICAgI3Byb3BlcnRpZXM6IAorICAgICNhdHRyaWJ1dGVzOiAKKyAgICAjaW50ZXJmYWNlczogCisgICAgdmFsaWRfdGFyZ2V0X3R5cGVzOiBbb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZORi5ESENQQ2FwYWJpbGl0eV0gCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvY2FwYWJpbGl0eVR5cGVzLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL2NhcGFiaWxpdHlUeXBlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL2NhcGFiaWxpdHlUeXBlcy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvaW1wb3J0VmNlQnJvY2FkZS5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL2ltcG9ydFZjZUJyb2NhZGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmNTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL2ltcG9ydFZjZUJyb2NhZGUuc2gKQEAgLTAsMCArMSw4OSBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gdXNhZ2UgeworCWVjaG8gIlVzYWdlOiAkMCA8aG9zdElwPiA8aG9zdFBvcnQ+IDx1c2VySWQ+IgorfQorCitmdW5jdGlvbiBhZGRSZXNvdXJjZSgpIHsKKworCUVMRU1FTlRfTkFNRT0kMQorCWVjaG8gLWUgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IFN0YXJ0ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisJQ1VSUkVOVF9aSVBfRklMRT0uLyR7RUxFTUVOVF9OQU1FfS8ke0VMRU1FTlRfTkFNRX0uemlwCisJQ1VSUkVOVF9KU09OX0ZJTEU9Li8ke0VMRU1FTlRfTkFNRX0vJHtFTEVNRU5UX05BTUV9Lmpzb24KKwlzZWQgLWkgJ3MvInVzZXJJZCI6ICIuKiIsLyJ1c2VySWQiOiAiJyR7QVRUX1VJRH0nIiwvJyAke0NVUlJFTlRfSlNPTl9GSUxFfQorCUpTT05fQ09OVEVOVD1gcGFzdGUgLXMgJHtDVVJSRU5UX0pTT05fRklMRX1gCisJaHR0cF9jb2RlPSQoY3VybCAtcyAtbyAvZGV2L251bGwgLXcgIiV7aHR0cF9jb2RlfSIgLXYgLUYgcmVzb3VyY2VNZXRhZGF0YT0iJHtKU09OX0NPTlRFTlR9IiAtRiByZXNvdXJjZVppcD1AJHtDVVJSRU5UX1pJUF9GSUxFfSAtSCBVU0VSX0lEOiR7QVRUX1VJRH0gJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL211bHRpcGFydCkKKwlpZiBbICR7aHR0cF9jb2RlfSAtZXEgMjAxICBdOyB0aGVuCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBZGRpbmcgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKKwllbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA0MDkgXTsgdGhlbgorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWxyZWFkeSBleGlzdHMgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZWxpZiBbICR7aHR0cF9jb2RlfSAtZXEgNTAwIF07IHRoZW4KKwkJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJCWV4aXQgMQorCWZpCit9CitpZiBbICQjIC1sdCAzIF0KK3RoZW4KKwl1c2FnZQorCWV4aXQgMgorZmkKKworSE9TVF9JUD0kMQorSE9TVF9QT1JUPSQyCitBVFRfVUlEPSQzCitOT19DQVBTPSQ0CisKK2lmIFsgIiROT19DQVBTIiA9ICJub2NhcHMiIF07IHRoZW4KKwllY2hvICJTa2lwcGluZyBDYXBzIGltcG9ydC4uLiIKK2Vsc2UKKwkjQWRkIFRoZSBDYXBhYmlsaXR5VHlwZXMKKwlodHRwX2NvZGU9JChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyAiJXtodHRwX2NvZGV9IiAtdiAtRiBjYXBhYmlsaXR5VHlwZVppcD1AY2FwYWJpbGl0eVR5cGVzLnppcCAtSCAiVVNFUl9JRDogamgwMDAzIiAke0hPU1RfSVB9OiR7SE9TVF9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2NhcGFiaWxpdHkpCisJaWYgWyAke2h0dHBfY29kZX0gLWVxIDIwMSAgXTsgdGhlbgorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIFRoZSBDYXBhYmlsaXR5VHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZWxpZiBbICR7aHR0cF9jb2RlfSAtZXEgNTAwIF07IHRoZW4KKwkJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgQ2FwYWJpbGl0eVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCQlleGl0IDEKKwllbHNlCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGYWlsZWQgdG8gYWRkIENhcGFiaWxpdHlUeXBlcyBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKKwkJZXhpdCAxCisJZmkKKwkjQWRkIFRoZSBJbnRlcmZhY2VMaWZlY3ljbGVUeXBlcworCSNodHRwX2NvZGU9JChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyAiJXtodHRwX2NvZGV9IiAtdiAtRiBpbnRlcmZhY2VMaWZlY3ljbGVUeXBlWmlwPUBpbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy56aXAgLUggIlVTRVJfSUQ6IGpoMDAwMyIgJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkVHlwZS9pbnRlcmZhY2VMaWZlY3ljbGUpCisJI2lmIFsgJHtodHRwX2NvZGV9IC1lcSAyMDEgIF07IHRoZW4KKwkjCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBZGRpbmcgVGhlIEludGVyZmFjZUxpZmVjeWNsZVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCSNlbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA0MDkgXTsgdGhlbgorCSMgICAgZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFscmVhZHkgZXhpc3RzIEludGVyZmFjZUxpZmVjeWNsZVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCSNlbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA1MDAgXTsgdGhlbgorCSMJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJIwlleGl0IDEKKwkjZWxzZQorCSMJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJIwlleGl0IDEKKwkjZmkKK2ZpCisKK2FkZFJlc291cmNlICJ0b3NjYS5ub2Rlcy5uZnYuQ1AiCithZGRSZXNvdXJjZSAidG9zY2Eubm9kZXMubmZ2LlZEVSIKKworYWRkUmVzb3VyY2UgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQIgorYWRkUmVzb3VyY2UgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVSIKKworYWRkUmVzb3VyY2UgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LnZkdS5Sb3V0aW5nQ2F0ZWdvcnlWRFUiCithZGRSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYudmR1LlZDRV9Ccm9jYWRlX1ZEVSIKK2FkZFJlc291cmNlICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5JUEFHX1ZMQU5fQ29ubmVjdG9yIgorYWRkUmVzb3VyY2UgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLk9BTV9WTEFOX0Nvbm5lY3RvciIKK2FkZFJlc291cmNlICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5WUEVfVkxBTl9Db25uZWN0b3IiCisKKyNhZGRSZXNvdXJjZSAidG9zY2Eubm9kZXMubmZ2LlZMIgorI2FkZFJlc291cmNlICJ0b3NjYS5ub2Rlcy5uZnYuVk5GIgorI2FkZFJlc291cmNlICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTCIKKyNhZGRSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GIgorI2FkZFJlc291cmNlICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUG9ydEFkZHJDYXRlZ29yeVZEVSIKKyNhZGRSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORiIKKyNhZGRSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVSIKKyNhZGRSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVIgorI2FkZFJlc291cmNlICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVSIKKyNhZGRSZXNvdXJjZSAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUiCisKKworZXhpdCAwCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5JUEFHX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3IuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuSVBBR19WTEFOX0Nvbm5lY3Rvci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MGZkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5JUEFHX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3IuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5JUEFHX1ZMQU5fQ29ubmVjdG9yLnlhbWwiLAorICAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5JUEFHX1ZMQU5fQ29ubmVjdG9yIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSB2aXJ0dWFsIG9yIHBoeXNpY2FsIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBORlYgYW5kIHRoZSBMQU4uIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAicG9ydCIsCisgICJjYXRlZ29yeSI6ICJOZXR3b3JrIExheWVyIDItMy9MQU4gQ29ubmVjdG9ycyIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5JUEFHX1ZMQU5fQ29ubmVjdG9yIiwgIkxBTiBDb25uZWN0b3IiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5JUEFHX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3IueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuSVBBR19WTEFOX0Nvbm5lY3Rvci55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWNjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5JUEFHX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3IueWFtbApAQCAtMCwwICsxLDQ4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIElQQUcgVkxBTiBDb25uZWN0b3IgQ1AgTm9kZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOgorICAgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLklQQUdfVkxBTl9Db25uZWN0b3I6IAorICAgICAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQCisgICAgICAgIHByb3BlcnRpZXM6IAorICAgICAgICAgIGlwYWdfbmV0d29ya19uYW1lOiAKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIAorICAgICAgICAgIGlwYWdfbmV0d29ya190eXBlOiAKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIAorICAgICAgICAgIGlwYWdfbmV0d29ya191dWlkOiAKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIAorICAgICAgICAgIHZsYW5fc2VnbWVudF9pZHM6IAorICAgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGxpc3Qgb2Ygc2VnbWVudGF0aW9uIElkcy4KKyAgICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAjYXR0cmlidXRlczogCisgICAgICAgIGNhcGFiaWxpdGllczogCisgICAgICAgICAgZHVtbXlfY2FwYWJpbGl0eTogCisgICAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuSVBBR19WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgY2FwYWJpbGl0eSBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIG1vZGVsIHRoaXMgQ29ubmVjdG9yIGFzIGEgY29tcG9uZW50IG9mIFZDRSBWTkYsIGJlY2F1c2UgTm9kZSBUZW1wbGF0ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFTREMgVGVhbQorICAgICAgICAKKyAgICAgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgICAgICAtIHZpcnR1YWxCaW5kaW5nUmVxdWlyZW1lbnQ6IAorICAgICAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYudmR1LlZpcnR1YWxCaW5kYWJsZQorICAgICAgICAgICAgICAjbm9kZTogb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLnZDRV9Ccm9jYWRlX1ZEVQorICAgICAgICAgICAgICByZWxhdGlvbnNoaXA6IG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuVmlydHVhbEJpbmRzVG8KKyAgICAgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjZGVmYXVsdAorICAgICAgICAgICAgICAKKyAgICAgICAgICAtIHZpcnR1YWxMaW5raW5ncmVxdWlyZW1lbnQ6IAorICAgICAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlCisgICAgICAgICAgICAgICNub2RlOiBvcmcub3BlbmVjb21wLmFzZGMubm9kZXMubmZ2LlZMCisgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcDogb3JnLm9wZW5lY29tcC5yZWxhdGlvbnNoaXBzLm5mdi5WaXJ0dWFsTGlua3NUbworICAgICAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICNkZWZhdWx0CisgICAgICAgICAgICAgIAorICAgICAgICAjaW50ZXJmYWNlczogCisgICAgICAgICAgI3N0YW5kYXJkOiAKKyAgICAgICAgICAgICNjb25maWd1cmU6IAorICAgICAgICAgICAgICAjaW1wbGVtZW50YXRpb246IGNvbmZpZ3VyZS5zaAorICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuSVBBR19WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5JUEFHX1ZMQU5fQ29ubmVjdG9yLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuSVBBR19WTEFOX0Nvbm5lY3Rvci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkZGM4YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLklQQUdfVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuSVBBR19WTEFOX0Nvbm5lY3Rvci56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3Rvci5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3Rvci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjlhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5PQU1fVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuY3AuT0FNX1ZMQU5fQ29ubmVjdG9yLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLk9BTV9WTEFOX0Nvbm5lY3RvciIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgdmlydHVhbCBvciBwaHlzaWNhbCBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgTkZWIGFuZCB0aGUgT0FNLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogInBvcnQiLAorICAiY2F0ZWdvcnkiOiAiTmV0d29yayBMYXllciAyLTMvTEFOIENvbm5lY3RvcnMiLAorICAidGFncyI6IFsKKyAgICAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuY3AuT0FNX1ZMQU5fQ29ubmVjdG9yIiwgIk9BTSBDb25uZWN0b3IiLCAiT0FNIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3Rvci55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3Rvci55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmN2M4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5PQU1fVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yLnlhbWwKQEAgLTAsMCArMSw0OCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyBPQU0gVkxBTiBDb25uZWN0b3IgQ1AgTm9kZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5PQU1fVkxBTl9Db25uZWN0b3I6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIG9hbV9uZXR3b3JrX25hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIAorICAgICAgb2FtX25ldHdvcmtfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgCisgICAgICBvYW1fbmV0d29ya191dWlkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAKKyAgICAgIHZsYW5fc2VnbWVudF9pZHM6IAorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICBkZXNjcmlwdGlvbjogbGlzdCBvZiBzZWdtZW50YXRpb24gSWRzLgorICAgICAgICAKKyAgICAgIAorICAgICNhdHRyaWJ1dGVzOiAKKyAgICBjYXBhYmlsaXRpZXM6IAorICAgICAgZHVtbXlfY2FwYWJpbGl0eTogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5PQU1fVkxBTl9Db25uZWN0b3IKKyAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgY2FwYWJpbGl0eSBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIG1vZGVsIHRoaXMgQ29ubmVjdG9yIGFzIGEgY29tcG9uZW50IG9mIFZDRSBWTkYsIGJlY2F1c2UgTm9kZSBUZW1wbGF0ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFTREMgVGVhbQorICAgICAgICAKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSB2aXJ0dWFsQmluZGluZ1JlcXVpcmVtZW50OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYudmR1LlZpcnR1YWxCaW5kYWJsZQorICAgICAgICAgICNub2RlOiBvcmcub3BlbmVjb21wLmFzZGMubm9kZXMudkNFX0Jyb2NhZGVfVkRVCisgICAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxCaW5kc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjZGVmYXVsdAorICAgICAgICAgIAorICAgICAgLSB2aXJ0dWFsTGlua2luZ3JlcXVpcmVtZW50OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlCisgICAgICAgICAgI25vZGU6IG9yZy5vcGVuZWNvbXAuYXNkYy5ub2Rlcy5uZnYuVkwKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5uZnYuVmlydHVhbExpbmtzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICNkZWZhdWx0CisgICAgICAgICAgCisgICAgI2ludGVyZmFjZXM6IAorICAgICAgI3N0YW5kYXJkOiAKKyAgICAgICAgI2NvbmZpZ3VyZTogCisgICAgICAgICAgI2ltcGxlbWVudGF0aW9uOiBjb25maWd1cmUuc2ggICAgICAgCisgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5PQU1fVkxBTl9Db25uZWN0b3IuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuT0FNX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3Rvci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3NmZiMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5PQU1fVkxBTl9Db25uZWN0b3IuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3IuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3IuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTkzMzVkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuVlBFX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3Rvci5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLlZQRV9WTEFOX0Nvbm5lY3Rvci55YW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5WUEVfVkxBTl9Db25uZWN0b3IiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHZpcnR1YWwgb3IgcGh5c2ljYWwgaW50ZXJmYWNlIGJldHdlZW4gdGhlIE5GViBhbmQgdGhlIFdBTi4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJwb3J0IiwKKyAgImNhdGVnb3J5IjogIk5ldHdvcmsgTGF5ZXIgMi0zL1dBTiBDb25uZWN0b3JzIiwKKyAgInRhZ3MiOiBbCisgICAgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLlZQRV9WTEFOX0Nvbm5lY3RvciIsICJXQU4gQ29ubmVjdG9yIgorICBdCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuVlBFX1ZMQU5fQ29ubmVjdG9yLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3Ivb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuVlBFX1ZMQU5fQ29ubmVjdG9yLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmNzM4MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3IueWFtbApAQCAtMCwwICsxLDQ4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIFZQRSBWTEFOIENvbm5lY3RvciBDUCBOb2RlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLlZQRV9WTEFOX0Nvbm5lY3RvcjogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUAorICAgIHByb3BlcnRpZXM6IAorICAgICAgdnBlX25ldHdvcmtfbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgCisgICAgICB2cGVfbmV0d29ya190eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAKKyAgICAgIHZwZV9uZXR3b3JrX3V1aWQ6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIAorICAgICAgdmxhbl9zZWdtZW50X2lkczogCisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIGRlc2NyaXB0aW9uOiBsaXN0IG9mIHNlZ21lbnRhdGlvbiBJZHMuCisgICAgICAgIAorICAgICAgCisgICAgI2F0dHJpYnV0ZXM6IAorICAgIGNhcGFiaWxpdGllczogCisgICAgICBkdW1teV9jYXBhYmlsaXR5OiAKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZQRV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBjYXBhYmlsaXR5IGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbW9kZWwgdGhpcyBDb25uZWN0b3IgYXMgYSBjb21wb25lbnQgb2YgVkNFIFZORiwgYmVjYXVzZSBOb2RlIFRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQVNEQyBUZWFtCisgICAgCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gdmlydHVhbEJpbmRpbmdSZXF1aXJlbWVudDogCisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LnZkdS5WaXJ0dWFsQmluZGFibGUKKyAgICAgICAgICAjbm9kZTogb3JnLm9wZW5lY29tcC5hc2RjLm5vZGVzLnZDRV9Ccm9jYWRlX1ZEVQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogb3JnLm9wZW5lY29tcC5yZWxhdGlvbnNoaXBzLm5mdi5WaXJ0dWFsQmluZHNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0gI2RlZmF1bHQKKyAgICAgICAgICAKKyAgICAgIC0gdmlydHVhbExpbmtpbmdyZXF1aXJlbWVudDogCisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZpcnR1YWxMaW5rYWJsZQorICAgICAgICAgICNub2RlOiBvcmcub3BlbmVjb21wLmFzZGMubm9kZXMubmZ2LlZMCisgICAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMubmZ2LlZpcnR1YWxMaW5rc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXSAjZGVmYXVsdAorICAgICAgICAgIAorICAgICNpbnRlcmZhY2VzOiAKKyAgICAgICNzdGFuZGFyZDogCisgICAgICAgICNjb25maWd1cmU6IAorICAgICAgICAgICNpbXBsZW1lbnRhdGlvbjogY29uZmlndXJlLnNoCisgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3IuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuVlBFX1ZMQU5fQ29ubmVjdG9yL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3Rvci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwOGZjOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLlZQRV9WTEFOX0Nvbm5lY3Rvci9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3IuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzNlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQIiwKKyAgImRlc2NyaXB0aW9uIjogIkFUVCBDUCBlbGVtZW50IiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9BYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNmJkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC55YW1sCkBAIC0wLDAgKzEsNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFTREMgQ1AgTm9kZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1A6IAorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5uZnYuQ1AKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkMjQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUm91dGluZ0NhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Sb3V0aW5nQ2F0ZWdvcnlWRFUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Sb3V0aW5nQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlJvdXRpbmdDYXRlZ29yeVZEVS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjczYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUm91dGluZ0NhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Sb3V0aW5nQ2F0ZWdvcnlWRFUuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi52ZHUuUm91dGluZ0NhdGVnb3J5VkRVLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LnZkdS5Sb3V0aW5nQ2F0ZWdvcnlWRFUiLAorICAiZGVzY3JpcHRpb24iOiAiTm9kZSBUeXBlIHRoYXQgcmVwcmVzZW50cyBhIE1vZHVsZSIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvSW5mcmFzdHJ1Y3R1cmUiLAorICAidGFncyI6IFsKKyAgICAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYudmR1LlJvdXRpbmdDYXRlZ29yeVZEVSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Sb3V0aW5nQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlJvdXRpbmdDYXRlZ29yeVZEVS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlJvdXRpbmdDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUm91dGluZ0NhdGVnb3J5VkRVLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiYzY0YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Sb3V0aW5nQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlJvdXRpbmdDYXRlZ29yeVZEVS55YW1sCkBAIC0wLDAgKzEsNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFTREMgUm91dGluZyBDYXRlZ29yeSBWRFUgIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6ICAgCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LnZkdS5Sb3V0aW5nQ2F0ZWdvcnlWRFU6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUm91dGluZ0NhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Sb3V0aW5nQ2F0ZWdvcnlWRFUuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlJvdXRpbmdDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUm91dGluZ0NhdGVnb3J5VkRVLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODUzYTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlJvdXRpbmdDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUm91dGluZ0NhdGVnb3J5VkRVLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlZDRV9Ccm9jYWRlX1ZEVS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjY5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi52ZHUuVkNFX0Jyb2NhZGVfVkRVLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LnZkdS5WQ0VfQnJvY2FkZV9WRFUiLAorICAiZGVzY3JpcHRpb24iOiAiQnJvY2FkZSBWeWF0dGEgNTYwMCB2Um91dGVyIHVzZWQgYXMgVmlydHVhbCBDdXN0b21lciBFZGdlICh2Q0UpIGRlbGl2ZXJzIGhpZ2ggdGhyb3VnaHB1dCBvbiBnZW5lcmFsLXB1cnBvc2UgeDg2IHNlcnZlci4gaXQgaXMgYmFzZWQgb24gb3BlbiBzdGFuZGFyZHMsIG9wZW4gcHJvdG9jb2xzIGFuZCBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggbGVnYWN5IG5ldHdvcmtzLiBJdCBoYXMgYWR2YW5jZWQgZnVuY3Rpb25hbGl0eSB0byBiZSBhYmxlIHRvIGRlcGxveSBpbiBhIHZhcmlldHkgb2YgbmV0d29yayBlbnZpcm9ubWVudHMuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiYnJvY2FkZSIsCisgICJjYXRlZ29yeSI6ICJOZXR3b3JrIExheWVyIDItMy9Sb3V0ZXIiLAorICAidGFncyI6IFsKKyAgICAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYudmR1LlZDRV9Ccm9jYWRlX1ZEVSIsICJ2Q0UiLCAiQnJvY2FkZSIsICJHYW1tYSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlZDRV9Ccm9jYWRlX1ZEVS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlZDRV9Ccm9jYWRlX1ZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhNzMyYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlZDRV9Ccm9jYWRlX1ZEVS55YW1sCkBAIC0wLDAgKzEsMTU2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgdkNFX0Jyb2NhZGVfVkRVIE5vZGUgIFRZUEUgICMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYudmR1LlZDRV9Ccm9jYWRlX1ZEVToKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LnZkdS5Sb3V0aW5nQ2F0ZWdvcnlWRFUKKyAgICBkZXNjcmlwdGlvbjogRGVmaW5pdGlvbiBvZiBWQ0UgQnJvY2FkZSBWRFUKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIHZuZl9jYXRlZ29yeTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQgcHJvdmlkZWQgYXQgUkVTT1VSQ0UgSU5KRUNUSU9OIFRJTUUgaW4gQVNEQyBUT09MCisgICAgICB2Y2VfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQgcHJvdmlkZWQgYXQgUkVTT1VSQ0UgSU5KRUNUSU9OIFRJTUUgaW4gQVNEQyBUT09MCisgICAgICB2ZW5kb3I6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IGlucHV0IHByb3ZpZGVkIGF0IFJFU09VUkNFIElOSkVDVElPTiBUSU1FIGluIEFTREMgVE9PTAorICAgICAgdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQgcHJvdmlkZWQgYXQgUkVTT1VSQ0UgSU5KRUNUSU9OIFRJTUUgaW4gQVNEQyBUT09MCisgICAgICBpbWFnZV9pZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciAtdkNFIGltYWdlIHVzZWQgdG8gYm9vdCBWTQorICAgICAgZmxhdm9yX2lkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBERVNJR04gVElNRSBieSBTZXJ2aWNlIENvbXBvc2VyIG9yIERlc2lnbmVyIC0gVk0gU2l6ZSwgU01BTEwsIE1FRElVTSwgTEFSR0UKKyAgICAgIHVzZXJuYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBERVNJR04gVElNRSBieSBTZXJ2aWNlIENvbXBvc2VyIG9yIERlc2lnbmVyIC1sb2dpbiB1c2VyIElkIG9mIFJvdXRlcgorICAgICAgcGFzc3dvcmQ6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IEkgSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciAtIHBhc3N3b3JkIGZvciBsb2dpbiAKKyAgICAgIGRvbWFpbl9uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBERVNJR04gVElNRSBieSBTZXJ2aWNlIENvbXBvc2VyIG9yIERlc2lnbmVyIG9yIChwZXJoYXBzIHByZS1kZWZpbmVkIGZvciBlYWNoIENsb3VkIFJlZ2lvbikgLSBsb2dpbiBkb21haW4KKyAgICAgIHRpbWVfem9uZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciBvciAocGVyaGFwcyBwcmUtZGVmaW5lZCBmb3IgZWFjaCBDbG91ZCBSZWdpb24pIC0gdGltZSB6b25lIHRvIHNldCBmb3IgdkNFCisgICAgICBsb2dpbl9zZXNzaW9uX3RpbWVvdXQ6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IERFU0lHTiBUSU1FIGJ5IFNlcnZpY2UgQ29tcG9zZXIgb3IgRGVzaWduZXIgb3IgKHBlcmhhcHMgcHJlLWRlZmluZWQgZm9yIGVhY2ggQ2xvdWQgUmVnaW9uKSAtIHVzZXIgbG9naW4gc2Vzc2lvbiB0aW1lb3V0CisgICAgICBpcGFnX3ZsYW5fYmFuZHdpZHRoOiAKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgREVTSUdOIFRJTUUgYnkgU2VydmljZSBDb21wb3NlciBvciBEZXNpZ25lciAtIGJhbmR3aWR0aCAgYWxsb2NhdGlvbiBvZiBjdXN0b21lciBWTEFOIHJlcXVlc3RlZCBieSBjdXN0b21lcgorICAgICAgdnBlX3ZsYW5faW50ZXJmYWNlX3Fvc19uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBERVNJR04gVElNRSBieSBTZXJ2aWNlIENvbXBvc2VyIG9yIERlc2lnbmVyIC0gUW9TIFBvbGljeSBuYW1lIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBpbnRlcmZhY2UKKyAgICAgIGlwYWdfdmxhbl9pbnRlcmZhY2VfcW9zX25hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IERFU0lHTiBUSU1FIGJ5IFNlcnZpY2UgQ29tcG9zZXIgb3IgRGVzaWduZXIgLSBRb1MgUG9saWN5IG5hbWUgdG8gYmUgYXBwbGllZCB0byB0aGlzIGludGVyZmFjZQorICAgICAgaG9zdG5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gSG9zdCBWTSBpcyBjcmVhdGVkIGZpcnN0IGFuZCB0aGlzIHZhbHVlIGlzIGlucHV0IHdoZW4gdGhlIHZDRSBpbWFnZSBpcyBsYXRlciBvbiBpbnN0YWxsZWQgYnkgQ2xvdWQtUE8KKyAgICAgIGhvc3RfaXA6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gSG9zdCBWTSBJUAorICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gQ2xvdWQgYXZhaWxhYmlsaXR5IHpvbmUgd2hlcmUgVk0gaXMgY3JlYXRlZAorICAgICAgb2FtX2xvb3BiYWNrX3ZsYW5faXBfYWRkcmVzczogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgUlVOIFRJTUUgYnkgQ2xvdWQtUE8gLSBPQU0gTmV0d29yayBpcyBwcmUtY3JlYXRlZCAtIGFscmVhZHkgZXhpc3RzIGluIERhdGEgQ2VudGVyCisgICAgICBpcGFnX3ZsYW5faXBfYWRkcmVzczogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgUlVOIFRJTUUgYnkgQ2xvdWQtUE8gLSBJUEFHIFZMQU4gTmV0d29yayBpcyBjcmVhdGVkIGJ5IENsb3VkLVBPIGJlZm9yZSB0aGUgdkNFIGlzIGNyZWF0ZWQgb3IgaW5zdGFsbGVkCisgICAgICB2cGVfdmxhbl9pcF9hZGRyZXNzOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIFZQRSBWTEFOIE5ldHdvcmsgaXMgY3JlYXRlZCBieSBDbG91ZC1QTyBiZWZvcmUgdGhlIHZDRSBpcyBjcmVhdGVkIC8gaW5zdGFsbGVkCisgICAgICB2cGVfdmxhbl9pZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSW5wdXQgcHJvdmlkZWQgYXQgUlVOIFRJTUUgYnkgQ2xvdWQtUE8gLSBWTEFOIElkIGlzIGNyZWF0ZWQgZmlyc3QgYnkgQ2xvdWQtUE8uIEl0IGlzIHJlcXVpcmVkIHRvIGFwcGx5IFZQRSBRb1MgUG9saWN5CisgICAgICBpcGFnX3ZsYW5faWQ6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gVkxBTiBJZCBpcyBjcmVhdGVkIGZpcnN0IGJ5IENsb3VkLVBPLiBJdCBpcyByZXF1aXJlZCB0byBhcHBseSBJUEFHIFFvUyBQb2xpY3kKKyAgICAgIG9hbV92bGFuX2ludGVyZmFjZV9uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnB1dCBwcm92aWRlZCBhdCBSVU4gVElNRSBieSBDbG91ZC1QTyAtIFRoaXMgaW50ZXJmY2UgaXMgY3JlYXRlZCBmaXJzdCBieSBDbG91ZC1QTy4gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIHdoaWNoIFFvUyBwb2xpY3kgaXMgYXBwbGllZAorICAgICAgdnBlX3ZsYW5faW50ZXJmYWNlX25hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gVGhpcyBpbnRlcmZjZSBpcyBjcmVhdGVkIGZpcnN0IGJ5IENsb3VkLVBPLiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gd2hpY2ggUW9TIHBvbGljeSBpcyBhcHBsaWVkCisgICAgICBpcGFnX3ZsYW5faW50ZXJmYWNlX25hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElucHV0IHByb3ZpZGVkIGF0IFJVTiBUSU1FIGJ5IENsb3VkLVBPIC0gVGhpcyBpbnRlcmZjZSBpcyBjcmVhdGVkIGZpcnN0IGJ5IENsb3VkLVBPLiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gd2hpY2ggUW9TIHBvbGljeSBpcyBhcHBsaWVkCisgICAgIyMjIyMjIyMjIyMjI0FUVFJJQlVURVMgb2YgdkNFIC0gVGhlc2UgdmFsdWVzIGFyZSBvdXRwdXR0ZWQgYnkgQ2xvdWQtUE8gd2hlbiB2Q0UgaXMgY3JlYXRlZCAvIGluc3RhbGxlZCAjIyMjIyMjIyMjIyMjIworICAgIGF0dHJpYnV0ZXM6IAorICAgICAgdmNlX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogTmFtZSBhc3NpZ25lZCB0byB2Q0UgYnkgQ2xvdWQtUE8KKyAgICAgIG9hbV9sb29wYmFja192bGFuX2lwYWRkcmVzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElQIEFkZHJlc3MgYXNzaWduZWQgYnkgQ2xvdWQtUE8gdG8gT0FNIFZMQU4KKyAgICAgIGlwYWdfdmxhbl9pcGFkZHJlczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJUCBBZGRyZXNzIGFzc2lnbmVkIGJ5IENsb3VkLVBPIHRvIElQQUcgVkxBTgorICAgICAgdnBlX3ZsYW5faXBhZGRyZXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSVAgQWRkcmVzcyBhc3NpZ25lZCBieSBDbG91ZC1QTyB0byBWUEUgVkxBTgorICAgICAgdm5mX2lkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiB1bmlxdWUgaWQgYXNzaWduZWQgdG8gVk5GIGJ5IENsb3VkLVBPIC0gdXNlZCBmb3IgQUFJIG1ldGFkYXRhCisgICAgCisgICAgIyMjIyMjIyMjIyMjI0NBUEFCSUxJVElFUyBvZiB2Q0UgLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgY2FwYWJpbGl0aWVzOiAKKyAgICAgIGNlX3JvdXRpbmdfY2FwYWJpbGl0eTogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5DRVJvdXRpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgdGhlIGJhc2UgY2FwYWJpbGl0eSBvZiB2Q0UKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCBVTkJPVU5ERURdICMgZGVmYXVsdAorICAgICAgICAKKyAgICAgIHN0YXRpY19yb3V0aW5nOiAKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlN0YXRpY1JvdXRpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgdGhlIG9wdGlvbmFsIGNhcGFiaWxpdHkgb2YgdGhlIHZDRQorICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0KKyAgICAgICAgCisgICAgICBiZ3Bfcm91dGluZzogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5CR1BSb3V0aW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBvcHRpb25hbCBjYXBhYmlsaXR5IG9mIHRoZSB2Q0UKKyAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdCisgICAgICAKKyAgICAgIHZpcnR1YWxfYmluZGFibGU6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYudmR1LlZpcnR1YWxCaW5kYWJsZQorICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyB0aGUgaW50ZXJuYWwgY2FwYWJpbGl0eSBvZiB0aGUgVkRVIHRvIHN1cHBvcnQgQmluZGluZyB0byBDb25uZWN0aW9uIFBvaW50cworICAgICAgICBvY2N1cnJlbmNlczogWzEsIFVOQk9VTkRFRF0KKyAgICAgICAgCisgICAgICBkdW1teV9jYXBhYmlsaXR5OiAKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZDRV9Ccm9jYWRlX1JvdXRpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgY2FwYWJpbGl0eSBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIG1vZGVsIFZDRSBWRFUgYXMgYSBjb21wb25lbnQgb2YgVkNFIFZORiwgYmVjYXVzZSBOb2RlIFRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQVNEQyBUZWFtCisgICAgCisgICAgIyMjIyMjIyMjIyMjI1JFUVVJUkVNRU5UUyBvZiB2ZHUgLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBvYW1fdmxhbl9jb25uZWN0b3I6CisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2Lk9BTV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLk9BTV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0c1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXQorICAgICAgICAgIAorICAgICAgLSB2cGVfdmxhbl9jb25uZWN0b3I6CisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZQRV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLlZQRV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Db25uZWN0c1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXQorICAgICAgICAgIAorICAgICAgLSBpcGFnX3ZsYW5fY29ubmVjdG9yOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuSVBBR19WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LmNwLklQQUdfVkxBTl9Db25uZWN0b3IKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0KKyAgICAgICAgICAKKyAgICAgIC0gaG9zdGVkX29uOiAgIyBBIHZDRSAgbmVlZHMgdG8gYmUgaG9zdGVkIGluIGEgVk0KKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0gI2RlZmF1bHQKKyAgICAKKyAgICAgICAgCisgICAgICAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlZDRV9Ccm9jYWRlX1ZEVS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWIwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5WQ0VfQnJvY2FkZV9WRFUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjIzMDkwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS55YW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUiLAorICAiZGVzY3JpcHRpb24iOiAiTm9kZSBUeXBlIHRoYXQgcmVwcmVzZW50cyBhIE1vZHVsZSIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvQWJzdHJhY3QiLAorICAidGFncyI6IFsKKyAgICAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTVhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLnlhbWwKQEAgLTAsMCArMSw1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5uZnYuVkRVCisgICAgICBkZXNjcmlwdGlvbjogQSBWRFUgaXMgYSBjb21wdXRlIGNvbXBvbmVudCBvZiBWTkYgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjlhOGIyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ESENQQ2F0ZWdvcnlWRFUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdiNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVS55YW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAicmVzb3VyY2VOYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ESENQQ2F0ZWdvcnlWRFUiLAorICAiZGVzY3JpcHRpb24iOiAiTm9kZSBUeXBlIHRoYXQgcmVwcmVzZW50cyBhIE1vZHVsZSIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvTmV0d29yayBFbGVtZW50cyIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ESENQQ2F0ZWdvcnlWRFUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGYxNTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVLnlhbWwKQEAgLTAsMCArMSwxMCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERIQ1AgIFZEVSBOb2RlICBUWVBFICAjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVQorICAgIGNhcGFiaWxpdGllczogI3BhaGFyb25pIC0gYWRkZWQgdG8gY29ubmVjdCB0byBWQ0VfQnJvY2FkZV9WRFUKKyAgICAgIGRoY3A6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLkRIQ1BDYXBhYmlsaXR5CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGNhcGFiaWxpdHkgaGFzIGJlZW4gaW50cm9kdWNlZAorICAgICMjIyMjIyMjIyMjIyMjI0Z1cnRoZXIgZGV0YWlscyBkZXNjcmliZWQgaW4gREhDUCBWTkYgVE9TQ0EgTW9kZWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ESENQQ2F0ZWdvcnlWRFUuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBiMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkRIQ1BDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuREhDUENhdGVnb3J5VkRVLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0MTlkMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ETlNDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUueWFtbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUiLAorICAiZGVzY3JpcHRpb24iOiAiTm9kZSBUeXBlIHRoYXQgcmVwcmVzZW50cyBhIE1vZHVsZSIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvTmV0d29yayBFbGVtZW50cyIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhYTlmMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ETlNDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUueWFtbApAQCAtMCwwICsxLDEwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRE5TICBWRFUgTm9kZSAgVFlQRSAgIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVQorICAgIGNhcGFiaWxpdGllczogI3BhaGFyb25pIC0gYWRkZWQgdG8gY29ubmVjdCB0byBWQ0VfQnJvY2FkZV9WRFUKKyAgICAgIGRuczogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuRE5TQ2FwYWJpbGl0eQorICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBjYXBhYmlsaXR5IGhhcyBiZWVuIGludHJvZHVjZWQKKyAgICAjIyMjIyMjIyMjIyMjIyNGdXJ0aGVyIGRldGFpbHMgZGVzY3JpYmVkIGluIEROUyBWTkYgVE9TQ0EgTW9kZWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5ETlNDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjdhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRE5TQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkROU0NhdGVnb3J5VkRVLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBiMDMzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVS55YW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAicmVzb3VyY2VOYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5GaXJld2FsbENhdGVnb3J5VkRVIiwKKyAgImRlc2NyaXB0aW9uIjogIk5vZGUgVHlwZSB0aGF0IHJlcHJlc2VudHMgYSBNb2R1bGUiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL05ldHdvcmsgRWxlbWVudHMiLAorICAidGFncyI6IFsKKyAgICAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjJkZmNiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUueWFtbApAQCAtMCwwICsxLDEwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRmlyZXdhbGwgIFZEVSBOb2RlICBUWVBFICAjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUKKyAgICBjYXBhYmlsaXRpZXM6ICNwYWhhcm9uaSAtIGFkZGVkIHRvIGNvbm5lY3QgdG8gVkNFX0Jyb2NhZGVfVkRVCisgICAgICBmaXJld2FsbDogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuRmlyZXdhbGxDYXBhYmlsaXR5CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGNhcGFiaWxpdHkgaGFzIGJlZW4gaW50cm9kdWNlZAorICAgICMjIyMjIyMjIyMjIyMjI0Z1cnRoZXIgZGV0YWlscyBkZXNjcmliZWQgaW4gRmlyZXdhbGwgVk5GIFRPU0NBIE1vZGVsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLkZpcmV3YWxsQ2F0ZWdvcnlWRFUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OGI2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuRmlyZXdhbGxDYXRlZ29yeVZEVS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4ZjZmZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUueWFtbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuTmV0d29ya0FkZHJDYXRlZ29yeVZEVSIsCisgICJkZXNjcmlwdGlvbiI6ICJOb2RlIFR5cGUgdGhhdCByZXByZXNlbnRzIGEgTW9kdWxlIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9OZXR3b3JrIEVsZW1lbnRzIiwKKyAgInRhZ3MiOiBbCisgICAgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzY2NjMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkckNhdGVnb3J5VkRVLnlhbWwKQEAgLTAsMCArMSwxMCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgQVNEQyAgTkFUIFZEVSBOb2RlICBUWVBFICAjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuTmV0d29ya0FkZHJDYXRlZ29yeVZEVTogI3BhaGFyb25pIC0gcmVuYW1lZCBmcm9tIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5OZXR3b3JrQWRkcmVzc1RyYW5zbGF0aW9uQ2F0ZWdvcnlWRFUuIFJlc291cmNlIG5hbWUgY2FuIGJlIHVwIHRvIDUwIGNoYXJzIGluIEFTREMKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVQorICAgIGNhcGFiaWxpdGllczogI3BhaGFyb25pIC0gYWRkZWQgdG8gY29ubmVjdCB0byBWQ0VfQnJvY2FkZV9WRFUKKyAgICAgIG5hdDogCisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WTkYuTmV0d29ya0FkZHJlc3NUcmFuc2xhdGlvbkNhcGFiaWxpdHkKKyAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgY2FwYWJpbGl0eSBoYXMgYmVlbiBpbnRyb2R1Y2VkCisgICAgIyMjIyMjIyMjIyMjIyMjRnVydGhlciBkZXRhaWxzIGRlc2NyaWJlZCBpbiBOQVQgVk5GIFRPU0NBIE1vZGVsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLk5ldHdvcmtBZGRyQ2F0ZWdvcnlWRFUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZWYyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuTmV0d29ya0FkZHJDYXRlZ29yeVZEVS9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuTmV0d29ya0FkZHJDYXRlZ29yeVZEVS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhMmRkOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFUueWFtbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUG9ydEFkZHJDYXRlZ29yeVZEVSIsCisgICJkZXNjcmlwdGlvbiI6ICJOb2RlIFR5cGUgdGhhdCByZXByZXNlbnRzIGEgTW9kdWxlIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9OZXR3b3JrIEVsZW1lbnRzIiwKKyAgInRhZ3MiOiBbCisgICAgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFUueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhYWQyZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVLnlhbWwKQEAgLTAsMCArMSwxMCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBBVCBWRFUgTm9kZSAgVFlQRSAgIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFU6ICNwYWhhcm9uaSAtIHJlbmFtZWQgZnJvbSBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuUG9ydEFkZHJlc3NUcmFuc2xhdGlvbkNhdGVnb3J5VkRVLiBSZXNvdXJjZSBuYW1lIGNhbiBiZSB1cCB0byA1MCBjaGFycyBpbiBBU0RDCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUKKyAgICBjYXBhYmlsaXRpZXM6ICNwYWhhcm9uaSAtIGFkZGVkIHRvIGNvbm5lY3QgdG8gVkNFX0Jyb2NhZGVfVkRVCisgICAgICBwYXQ6IAorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVk5GLlBvcnRBZGRyZXNzVHJhbnNsYXRpb25DYXBhYmlsaXR5CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGNhcGFiaWxpdHkgaGFzIGJlZW4gaW50cm9kdWNlZAorICAgICMjIyMjIyMjIyMjIyMjI0Z1cnRoZXIgZGV0YWlscyBkZXNjcmliZWQgaW4gUEFUIFZORiBUT1NDQSBNb2RlbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVS5Qb3J0QWRkckNhdGVnb3J5VkRVLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFkNjczCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFUvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkRVLlBvcnRBZGRyQ2F0ZWdvcnlWRFUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZML29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZMLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTI0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZMLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwiLAorICAiZGVzY3JpcHRpb24iOiAiTm9kZSBUeXBlIHRoYXQgcmVwcmVzZW50cyBhIE1vZHVsZSIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvQWJzdHJhY3QiLAorICAidGFncyI6IFsKKyAgICAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzA5MDcyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwueWFtbApAQCAtMCwwICsxLDcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBU0RDIFZMIE5vZGUgIFRZUEUgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLm5mdi5WTAorICAgIAorICAgIApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVkwuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDE5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5WQ0VfQnJvY2FkZV9WTkYuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY4MzAxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi55YW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAicmVzb3VyY2VOYW1lIjogIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5WQ0VfQnJvY2FkZV9WTkYiLAorICAiZGVzY3JpcHRpb24iOiAiTm9kZSBUeXBlIHRoYXQgcmVwcmVzZW50cyBhIE1vZHVsZSIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvTmV0d29yayBFbGVtZW50cyIsCisgICJ0YWdzIjogWworICAgICJvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5WQ0VfQnJvY2FkZV9WTkYueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQwZmUwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GLnlhbWwKQEAgLTAsMCArMSwzMiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgdkNFX0Jyb2NhZGVfVk5GIE5vZGUgIFRZUEUgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyBJTiBUSEUgQUJTRU5DRSBPRiBOT0RFIFRFTVBMQVRFLCB0aGUgdkNFX0Jyb2NhZGVfVk5GIE5vZGUgVHlwZSBpcyBtb2RlbGVkIGFzIFJFUVVJUklORzogIyMjIyMKKyMjIyMjIyMjIyMjIDEuIHZjZV9Ccm9jYWRlX1ZEVSBOb2RlICAgICAgICAgICAgICAgCisjIyMjIyMjIyMjIyAyLiBvYW1fdmxhbl9jb25uZWN0b3IgTm9kZQorIyMjIyMjIyMjIyMgMy4gaXBhZ192bGFuX2Nvbm5lY3RvciBOb2RlCisjIyMjIyMjIyMjIyA0LiB2cGVfdmxhbl9jb25uZWN0b3IgTm9kZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORgorICAgIHJlcXVpcmVtZW50czogCisgICAgICAtIHZjZV9icm9jYWRlX3ZkdTogCisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZDRV9Ccm9jYWRlX1JvdXRpbmcKKyAgICAgICAgICBub2RlOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WRFUuVkNFX0Jyb2NhZGVfVkRVCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXQorICAgICAgICAgIAorICAgICAgLSBvYW1fdmxhbl9jb25uZWN0b3I6CisgICAgICAgICAgY2FwYWJpbGl0eTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2Lk9BTV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG5vZGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LkNQLk9BTV9WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0KKyAgICAgICAgICAKKyAgICAgIC0gdnBlX3ZsYW5fY29ubmVjdG9yOgorICAgICAgICAgIGNhcGFiaWxpdHk6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WUEVfVkxBTl9Db25uZWN0b3IKKyAgICAgICAgICBub2RlOiBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5DUC5WUEVfVkxBTl9Db25uZWN0b3IKKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdCisgICAgICAgICAgCisgICAgICAtIGlwYWdfdmxhbl9jb25uZWN0b3I6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5JUEFHX1ZMQU5fQ29ubmVjdG9yCisgICAgICAgICAgbm9kZTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuQ1AuSVBBR19WTEFOX0Nvbm5lY3RvcgorICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0KKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYuVkNFX0Jyb2NhZGVfVk5GLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5WQ0VfQnJvY2FkZV9WTkYvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4ZjkxNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5WQ0VfQnJvY2FkZV9WTkYvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLlZDRV9Ccm9jYWRlX1ZORi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2U4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAib3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GIiwKKyAgImRlc2NyaXB0aW9uIjogIk5vZGUgVHlwZSB0aGF0IHJlcHJlc2VudHMgYSBNb2R1bGUiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL0Fic3RyYWN0IiwKKyAgInRhZ3MiOiBbCisgICAgIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORiIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODcyY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi55YW1sCkBAIC0wLDAgKzEsNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFTREMgVk5GIE5vZGUgVFlQRSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkY6IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMubmZ2LlZORgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC9vcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5WTkYvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhlMzNkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuVk5GL29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZORi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvdG9zY2Eubm9kZXMubmZ2LlZML3Rvc2NhLm5vZGVzLm5mdi5WTC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvdG9zY2Eubm9kZXMubmZ2LlZML3Rvc2NhLm5vZGVzLm5mdi5WTC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YmNmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC90b3NjYS5ub2Rlcy5uZnYuVkwvdG9zY2Eubm9kZXMubmZ2LlZMLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAidG9zY2Eubm9kZXMubmZ2LlZMLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJyZXNvdXJjZU5hbWUiOiAidG9zY2Eubm9kZXMubmZ2LlZMIiwKKyAgImRlc2NyaXB0aW9uIjogIlRPU0NBIFZMIGJhc2UgZWxlbWVudCIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvQWJzdHJhY3QiLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMubmZ2LlZMIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvdG9zY2Eubm9kZXMubmZ2LlZML3Rvc2NhLm5vZGVzLm5mdi5WTC55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvdG9zY2Eubm9kZXMubmZ2LlZML3Rvc2NhLm5vZGVzLm5mdi5WTC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmNjOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC90b3NjYS5ub2Rlcy5uZnYuVkwvdG9zY2Eubm9kZXMubmZ2LlZMLnlhbWwKQEAgLTAsMCArMSwxNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIFRPU0NBICAgVkwgTm9kZSBUeXBlICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgdG9zY2Eubm9kZXMubmZ2LlZMOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIHZlbmRvcjogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgdGhlIHZlbmRvciB3aG8gcHJvdmlkZXMgdGhpcyBWTAorICAgICAgICAKKyAgICBjYXBhYmlsaXRpZXM6IAorICAgICAgdmlydHVhbGxpbmthYmxlOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5mdi5WaXJ0dWFsTGlua2FibGUKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCBVTkJPVU5ERURdICMgdGhpcyBpcyBkZWZhdWx0CisgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L3Rvc2NhLm5vZGVzLm5mdi5WTC90b3NjYS5ub2Rlcy5uZnYuVkwuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvdG9zY2Eubm9kZXMubmZ2LlZML3Rvc2NhLm5vZGVzLm5mdi5WTC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3YmE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L3Rvc2NhLm5vZGVzLm5mdi5WTC90b3NjYS5ub2Rlcy5uZnYuVkwuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L3Rvc2NhLm5vZGVzLm5mdi5WTkYvdG9zY2Eubm9kZXMubmZ2LlZORi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvcmVzb3VyY2VzVG9GaXgvdG9zY2Eubm9kZXMubmZ2LlZORi90b3NjYS5ub2Rlcy5uZnYuVk5GLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2MDQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L3Rvc2NhLm5vZGVzLm5mdi5WTkYvdG9zY2Eubm9kZXMubmZ2LlZORi5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogInRvc2NhLm5vZGVzLm5mdi5WTkYueWFtbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5uZnYuVk5GIiwKKyAgImRlc2NyaXB0aW9uIjogIlRPU0NBIFZORiBiYXNlIGVsZW1lbnQiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yeSI6ICJHZW5lcmljL0Fic3RyYWN0IiwKKyAgInRhZ3MiOiBbCisgICAgInRvc2NhLm5vZGVzLm5mdi5WTkYiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC90b3NjYS5ub2Rlcy5uZnYuVk5GL3Rvc2NhLm5vZGVzLm5mdi5WTkYueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L3Rvc2NhLm5vZGVzLm5mdi5WTkYvdG9zY2Eubm9kZXMubmZ2LlZORi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjk0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC90b3NjYS5ub2Rlcy5uZnYuVk5GL3Rvc2NhLm5vZGVzLm5mdi5WTkYueWFtbApAQCAtMCwwICsxLDMwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMgICBUT1NDQSAgIFZORiBOb2RlICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit0b3NjYS5ub2Rlcy5uZnYuVk5GOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICB2bmZfY2F0ZWdvcnk6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFJvdXRlciwgRlcsIExCLCBETlMgYXJlIGV4YW1wbGUgY2F0ZWdvcmllcworICAgICAgaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSUQgb2YgdGhpcyBWTkYKKyAgICAgIHZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIHRoZSB2ZW5kb3Igd2hvIHByb3ZpZGVzIHRoaXMgVk5GCisgICAgICB2ZXJzaW9uOgorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICAgIGRlc2NyaXB0aW9uOiB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSBmb3IgdGhpcyBWTkYKKyAgICAgICNkZXZpY2VfY29uZmlnOiAKKyAgICAgICAjIHR5cGU6IG1hcAorICAgICAgICAjZW50cnlfc2NoZW1hOiAKKyAgICAgICAgICMgdHlwZTogc3RyaW5nCisgICAgICAgICNkZWZhdWx0OiAKKyAgICAgICAgICMgcDE6IDEKKyAgICAgICAgICMgcDI6IDIKKyAgICAgICAgICAjcDM6IDMKKyAgICAjcmVxdWlyZW1lbnRzOgorICAgICAjIC0gdmlydHVhbExpbms6CisgICAgICAgICAgI2NhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlCisgICAgICAgICAgI29jY3VycmVuY2VzOiBbMSwgVU5CT1VOREVEXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Jlc291cmNlc1RvRml4L3Rvc2NhLm5vZGVzLm5mdi5WTkYvdG9zY2Eubm9kZXMubmZ2LlZORi56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC90b3NjYS5ub2Rlcy5uZnYuVk5GL3Rvc2NhLm5vZGVzLm5mdi5WTkYuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTBjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS9yZXNvdXJjZXNUb0ZpeC90b3NjYS5ub2Rlcy5uZnYuVk5GL3Rvc2NhLm5vZGVzLm5mdi5WTkYuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5DUC90b3NjYS5ub2Rlcy5uZnYuQ1AuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5DUC90b3NjYS5ub2Rlcy5uZnYuQ1AuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjgyYTlhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvdG9zY2Eubm9kZXMubmZ2LkNQL3Rvc2NhLm5vZGVzLm5mdi5DUC5qc29uCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogInRvc2NhLm5vZGVzLm5mdi5DUC55YW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJ0b3NjYS5ub2Rlcy5uZnYuQ1AiLAorICAiZGVzY3JpcHRpb24iOiAiVE9TQ0EgQ1AgYmFzZSBlbGVtZW50IiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcnkiOiAiR2VuZXJpYy9BYnN0cmFjdCIsCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5uZnYuQ1AiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuQ1AvdG9zY2Eubm9kZXMubmZ2LkNQLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuQ1AvdG9zY2Eubm9kZXMubmZ2LkNQLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxYTRiZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5DUC90b3NjYS5ub2Rlcy5uZnYuQ1AueWFtbApAQCAtMCwwICsxLDI0IEBACisgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFRPU0NBIENQIE5vZGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOgorICAgIHRvc2NhLm5vZGVzLm5mdi5DUDogCisgICAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgICBwcm9wZXJ0aWVzOiAKKyAgICAgICAgICB0eXBlOiAKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHJlcXVpcmVtZW50czogCisgICAgICAgICAgLSB2aXJ0dWFsYmluZGluZzogCisgICAgICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYudmR1LlZpcnR1YWxCaW5kYWJsZQorICAgICAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICN0aGlzIGlzIGRlZmF1bHQKKyAgICAgICAgICAgIAorICAgICAgICAgIC0gdmlydHVhbGxpbms6IAorICAgICAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2LlZpcnR1YWxMaW5rYWJsZQorICAgICAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICN0aGlzIGlzIGRlZmF1bHQKKyAgICAgICAgICAgIAorICAgICAgICBhdHRyaWJ1dGVzOiAKKyAgICAgICAgICBpcF9hZGRyZXNzOiAKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgICAgIyByZXF1aXJlZDogZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuQ1AvdG9zY2Eubm9kZXMubmZ2LkNQLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5DUC90b3NjYS5ub2Rlcy5uZnYuQ1AuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzI4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuQ1AvdG9zY2Eubm9kZXMubmZ2LkNQLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuVkRVL3Rvc2NhLm5vZGVzLm5mdi5WRFUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5WRFUvdG9zY2Eubm9kZXMubmZ2LlZEVS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjAzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuVkRVL3Rvc2NhLm5vZGVzLm5mdi5WRFUuanNvbgpAQCAtMCwwICsxLDExIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJ0b3NjYS5ub2Rlcy5uZnYuVkRVLnlhbWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogInRvc2NhLm5vZGVzLm5mdi5WRFUiLAorICAiZGVzY3JpcHRpb24iOiAiVE9TQ0EgVkRVIGJhc2UgZWxlbWVudCIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3J5IjogIkdlbmVyaWMvQWJzdHJhY3QiLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMubmZ2LlZEVSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5WRFUvdG9zY2Eubm9kZXMubmZ2LlZEVS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvdG9zY2Eubm9kZXMubmZ2LlZEVS90b3NjYS5ub2Rlcy5uZnYuVkRVLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjYmE4MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5WRFUvdG9zY2Eubm9kZXMubmZ2LlZEVS55YW1sCkBAIC0wLDAgKzEsMjggQEAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVE9TQ0EgIFZEVSBOb2RlICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOgorICAgICAgdG9zY2Eubm9kZXMubmZ2LlZEVTogCisgICAgICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudAorICAgICAgICAgICNwcm9wZXJ0aWVzOiAKKyAgICAgICAgICAKKyAgICAgICAgICBjYXBhYmlsaXRpZXM6IAorICAgICAgICAgICAgaGlnaF9hdmFpbGFiaWxpdHk6IAorICAgICAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2LkhBCisgICAgICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgVU5CT1VOREVEXSAjIHRoaXMgaXMgZGVmYXVsdAorICAgICAgICAgICAgCisgICAgICAgICAgICB2aXJ0dWFsX2JpbmRpbmc6IAorICAgICAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2LnZkdS5WaXJ0dWFsQmluZGFibGUKKyAgICAgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCBVTkJPVU5ERURdICMgdGhpcyBpcyBkZWZhdWx0CisgICAgICAgICAgICAgCisgICAgICAgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgICAgICAgIC0gaGlnaF9hdmFpbGFiaWxpdHk6IAorICAgICAgICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuSEEKKyAgICAgICAgICAgICAgICBvY2N1cnJlbmNlczogWzAsMV0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAtIGhvc3Q6ICMjSXMgaG9zdGVkIGluIGEgVk0KKyAgICAgICAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0gI3RoaXMgaXMgZGVmYXVsdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3Rvc2NhLm5vZGVzLm5mdi5WRFUvdG9zY2Eubm9kZXMubmZ2LlZEVS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuVkRVL3Rvc2NhLm5vZGVzLm5mdi5WRFUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTRlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS1WQ0UtQnJvY2FkZS90b3NjYS5ub2Rlcy5uZnYuVkRVL3Rvc2NhLm5vZGVzLm5mdi5WRFUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3ZjZS5icm9jYWRlLmNhcGFiaWxpdGllcy55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UtVkNFLUJyb2NhZGUvdmNlLmJyb2NhZGUuY2FwYWJpbGl0aWVzLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NTc1NAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlLVZDRS1Ccm9jYWRlL3ZjZS5icm9jYWRlLmNhcGFiaWxpdGllcy55YW1sCkBAIC0wLDAgKzEsMTkxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVE9TQ0EgQ2FwYWJpbGl0eTogVmlydHVhbEJpbmRhYmxlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2LnZkdS5WaXJ0dWFsQmluZGFibGU6IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QgCisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMubmZ2LlZEVV0KKyAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUT1NDQSAgQ2FwYWJpbGl0eTogVmlydHVhbExpbmthYmxlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2LlZpcnR1YWxMaW5rYWJsZTogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCAjI3BhaGFyb25pIC0gY2hhbmdlZCBmcm9tIHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlIC0gY2Fubm90IGRlcml2ZSBmcm9tIGl0c2VsZgorICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZMXSAKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogSGlnaEF2YWlsYWJpbGl0eSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIHRvc2NhLmNhcGFiaWxpdGllcy5uZnYuSEE6IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5uZnYuVkRVXQorCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBU0RDIENhcGFiaWxpdHk6IFZpcnR1YWxCaW5kYWJsZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi52ZHUuVmlydHVhbEJpbmRhYmxlOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5uZnYudmR1LlZpcnR1YWxCaW5kYWJsZQorICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LlZEVV0KKyAgCisgIAorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQVNEQyBDYXBhYmlsaXR5OiBWaXJ0dWFsTGlua2FibGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuVmlydHVhbExpbmthYmxlOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290IAorICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLm5mdi5WTF0KKyAgIAorCisgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNDYXBhYmlsaXR5OiBHZW5lcmljIGFzZGMgY2FwYWJpbGl0eSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLlJvb3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IEdFTkVSSUMgUk9VVElORyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5Sb3V0aW5nQ2FwYWJpbGl0eTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHJvdXRpbmdfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogc29tZSBiYXNpYyByb3V0aW5nIGRlc2NyaXB0b3IsIGlmIGFueT8/PworICAgICAgICBjb25zdHJhaW50czogCisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFtUQkQxLCBUQkRuXQorICAgICNhdHRyaWJ1dGVzOiA/Pz8KKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi52ZHUuUm91dGluZ0NhdGVnb3J5VkRVXQorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IENFIFJPVVRJTkcgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAorICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuQ0VSb3V0aW5nOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5Sb3V0aW5nQ2FwYWJpbGl0eQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogUEUgUk9VVElORyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5QRVJvdXRpbmc6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlJvdXRpbmdDYXBhYmlsaXR5CisgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogUCBST1VUSU5HICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlBSb3V0aW5nOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5Sb3V0aW5nQ2FwYWJpbGl0eQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogQkdQIFJPVVRJTkcgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAorICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuQkdQUm91dGluZzogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYuUm91dGluZ0NhcGFiaWxpdHkKKyAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IFNUQVRJQyBST1VUSU5HICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlN0YXRpY1JvdXRpbmc6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlJvdXRpbmdDYXBhYmlsaXR5CisgICAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDYXBhYmlsaXR5OiBOZXR3b3JrIEFkZHJlc3MgVHJhbnNsYXRpb24gICMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIAorICBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZnYudm5mLk5ldHdvcmtBZGRyZXNzVHJhbnNsYXRpb25DYXBhYmlsaXR5OiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmF0X3R5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IHNvbWUgYmFzaWMgTkFUIGRlc2NyaXB0b3IsIGlmIGFueT8/PworICAgICAgICBjb25zdHJhaW50czogCisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFtUQkQxLCBUQkRuXQorICAgICNhdHRyaWJ1dGVzOiA/Pz8KKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi52ZHUuTmV0d29ya0FkZHJlc3NUcmFuc2xhdGlvbkNhdGVnb3J5VkRVXQorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IFBvcnQgQWRkcmVzcyBUcmFuc2xhdGlvbiAgIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi52bmYuUG9ydEFkZHJlc3NUcmFuc2xhdGlvbkNhcGFiaWxpdHk6IAorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBwYXRfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogc29tZSBiYXNpYyBQQVQgZGVzY3JpcHRvciwgaWYgYW55Pz8/CisgICAgICAgIGNvbnN0cmFpbnRzOiAKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogW1RCRDEsIFRCRG5dCisgICAgI2F0dHJpYnV0ZXM6ID8/PworICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAucmVzb3VyY2UubmZ2LnZkdS5Qb3J0QWRkcmVzc1RyYW5zbGF0aW9uQ2F0ZWdvcnlWRFVdICAKKyAgICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IEZJUkVXQUxMICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi52bmYuRmlyZXdhbGxDYXBhYmlsaXR5OiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgZmlyZXdhbGxfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogc29tZSBiYXNpYyBGaXJld2FsbCBDYXBhYmlsaXR5IGRlc2NyaXB0b3IsIGlmIGFueT8/PworICAgICAgICBjb25zdHJhaW50czogCisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFtUQkQxLCBUQkRuXQorICAgICNhdHRyaWJ1dGVzOiA/Pz8KKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi52ZHUuRmlyZXdhbGxDYXRlZ29yeVZEVV0gIAorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogREhDUCAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LnZuZi5ESENQQ2FwYWJpbGl0eTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIGRoY3BfdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogc29tZSBiYXNpYyBESENQICBDYXBhYmlsaXR5IGRlc2NyaXB0b3IsIGlmIGFueT8/PworICAgICAgICBjb25zdHJhaW50czogCisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFtUQkQxLCBUQkRuXQorICAgICNhdHRyaWJ1dGVzOiA/Pz8KKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi52ZHUuREhDUENhdGVnb3J5VkRVXSAgCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IEROUyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi52bmYuRE5TQ2FwYWJpbGl0eTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIGRuc190eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBzb21lIGJhc2ljIEROUyAgQ2FwYWJpbGl0eSBkZXNjcmlwdG9yLCBpZiBhbnk/Pz8KKyAgICAgICAgY29uc3RyYWludHM6IAorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbVEJEMSwgVEJEbl0KKyAgICAjYXR0cmlidXRlczogPz8/CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYudmR1LkROU0NhdGVnb3J5VkRVXSAgCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhcGFiaWxpdHk6IHZDRSBCcm9jYWRlIFJPVVRJTkcgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIERVTU1ZCisgICMjIyMjIyMjIyMjIyMjIFRISVMgSVMgQ0FQQUJJTElUWSBJUyBPTkxZIE9GRkVSRUQgQlkgU1BFQ0lGSUMgQlJPQ0FERSBWRFUgIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5WQ0VfQnJvY2FkZV9Sb3V0aW5nOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5DRVJvdXRpbmcKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi52ZHUuVkNFX0Jyb2NhZGVfVkRVXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogT0FNIFZMQW4gQ29ubmVjdG9yICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyBEVU1NWQorICAjIyMjIyMjIyMjIyMjIyBUSElTIElTIENBUEFCSUxJVFkgSVMgT05MWSBPRkZFUkVEIEJZIFNQRUNJRklDIENvbm5lY3RvciAjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2Lk9BTV9WTEFOX0Nvbm5lY3RvcjogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuY3AuT0FNX1ZMQU5fQ29ubmVjdG9yXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogSVBBRyBWTEFuIENvbm5lY3RvciAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMgRFVNTVkKKyAgIyMjIyMjIyMjIyMjIyMgVEhJUyBJUyBDQVBBQklMSVRZIElTIE9OTFkgT0ZGRVJFRCBCWSBTUEVDSUZJQyBDb25uZWN0b3IgIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCisgIG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5mdi5JUEFHX1ZMQU5fQ29ubmVjdG9yOiAKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLlJvb3QKKyAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLnJlc291cmNlLm5mdi5jcC5JUEFHX1ZMQU5fQ29ubmVjdG9yXQorICAgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2FwYWJpbGl0eTogVlBFIFZMQW4gQ29ubmVjdG9yICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyBEVU1NWQorICAjIyMjIyMjIyMjIyMjIyBUSElTIElTIENBUEFCSUxJVFkgSVMgT05MWSBPRkZFUkVEIEJZIFNQRUNJRklDIENvbm5lY3RvciAjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKKyAgb3JnLm9wZW5lY29tcC5jYXBhYmlsaXRpZXMubmZ2LlZQRV9WTEFOX0Nvbm5lY3RvcjogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5Sb290CisgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5uZnYuY3AuVlBFX1ZMQU5fQ29ubmVjdG9yXQorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvREJNUy9EQk1TLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9EQk1TL0RCTVMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTBhMzBhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvREJNUy9EQk1TLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1EQk1TLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiREJNUyIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgdHlwaWNhbCByZWxhdGlvbmFsLCBTUUwgRGF0YWJhc2UgTWFuYWdlbWVudCBTeXN0ZW0gc29mdHdhcmUgY29tcG9uZW50IG9yIHNlcnZpY2UuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJEQk1TIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvREJNUy9ub3JtYXRpdmUtdHlwZXMtbmV3LURCTVMueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvREJNUy9ub3JtYXRpdmUtdHlwZXMtbmV3LURCTVMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTE5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9EQk1TL25vcm1hdGl2ZS10eXBlcy1uZXctREJNUy55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5EQk1TOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcm9vdF9wYXNzd29yZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBvcHRpb25hbCByb290IHBhc3N3b3JkIGZvciB0aGUgREJNUyBzZXJ2aWNlCisgICAgICBwb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIHBvcnQgdGhlIERCTVMgc2VydmljZSB3aWxsIGxpc3RlbiB0byBmb3IgZGF0YSBhbmQgcmVxdWVzdHMgCisgICAgY2FwYWJpbGl0aWVzOiAgICAKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogWyB0b3NjYS5ub2Rlcy5EYXRhYmFzZSBdCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9EQk1TL25vcm1hdGl2ZS10eXBlcy1uZXctREJNUy56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9EQk1TL25vcm1hdGl2ZS10eXBlcy1uZXctREJNUy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiZGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL0RCTVMvbm9ybWF0aXZlLXR5cGVzLW5ldy1EQk1TLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ibG9ja1N0b3JhZ2UvYmxvY2tTdG9yYWdlLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ibG9ja1N0b3JhZ2UvYmxvY2tTdG9yYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlZjVjMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2Jsb2NrU3RvcmFnZS9ibG9ja1N0b3JhZ2UuanNvbgpAQCAtMCwwICsxLDIwIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LWJsb2NrU3RvcmFnZS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIkJsb2NrU3RvcmFnZSIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2VydmVyLWxvY2FsIGJsb2NrIHN0b3JhZ2UgZGV2aWNlIChpLmUuLCBub3Qgc2hhcmVkKSBvZmZlcmluZyBldmVubHkgc2l6ZWQgYmxvY2tzIG9mIGRhdGEgZnJvbSB3aGljaCByYXcgc3RvcmFnZSB2b2x1bWVzIGNhbiBiZSBjcmVhdGVkLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIm9iamVjdFN0b3JhZ2UiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJCbG9ja1N0b3JhZ2UiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ibG9ja1N0b3JhZ2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1ibG9ja1N0b3JhZ2UueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvYmxvY2tTdG9yYWdlL25vcm1hdGl2ZS10eXBlcy1uZXctYmxvY2tTdG9yYWdlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI5NjUyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvYmxvY2tTdG9yYWdlL25vcm1hdGl2ZS10eXBlcy1uZXctYmxvY2tTdG9yYWdlLnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgc2l6ZTogCisgICAgICAgIHR5cGU6IHNjYWxhci11bml0LnNpemUKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxIE1CCisgICAgICB2b2x1bWVfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHNuYXBzaG90X2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYXR0YWNobWVudDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ibG9ja1N0b3JhZ2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1ibG9ja1N0b3JhZ2UuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvYmxvY2tTdG9yYWdlL25vcm1hdGl2ZS10eXBlcy1uZXctYmxvY2tTdG9yYWdlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjkwZTlkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvYmxvY2tTdG9yYWdlL25vcm1hdGl2ZS10eXBlcy1uZXctYmxvY2tTdG9yYWdlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jYXBhYmlsaXR5VHlwZXMueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2FwYWJpbGl0eVR5cGVzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQ2NjFiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2FwYWJpbGl0eVR5cGVzLnltbApAQCAtMCwwICsxLDE0OCBAQAordG9zY2EuY2FwYWJpbGl0aWVzLlJvb3Q6IAorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIHJvb3QgQ2FwYWJpbGl0eSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIENhcGFiaWxpdHkgVHlwZXMgZGVyaXZlIGZyb20KK3Rvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290Cit0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAordG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIG51bV9jcHVzOiAKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMQorICAgIGNwdV9mcmVxdWVuY3k6CisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5mcmVxdWVuY3kKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMC4xIEdIegorICAgIGRpc2tfc2l6ZTogCisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAgTUIKKyAgICBtZW1fc2l6ZTogCisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAgTUIKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHByb3RvY29sOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZWZhdWx0OiB0Y3AKKyAgICBwb3J0OgorICAgICAgdHlwZTogUG9ydERlZgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc2VjdXJlOgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICB1cmxfcGF0aDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHBvcnRfbmFtZTogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIG5ldHdvcmtfbmFtZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgICAgZGVmYXVsdDogUFJJVkFURQorICAgIGluaXRpYXRvcjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVmYXVsdDogc291cmNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgc291cmNlLCB0YXJnZXQsIHBlZXIgXQorICAgIHBvcnRzOgorICAgICAgdHlwZTogbWFwCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIG1pbl9sZW5ndGg6IDEKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogUG9ydFNwZWMKKyAgYXR0cmlidXRlczoKKyAgICBpcF9hZGRyZXNzOgorICAgICAgdHlwZTogc3RyaW5nCit0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5QdWJsaWM6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgIHByb3BlcnRpZXM6CisgICAgIyBDaGFuZ2UgdGhlIGRlZmF1bHQgbmV0d29ya19uYW1lIHRvIHVzZSB0aGUgZmlyc3QgcHVibGljIG5ldHdvcmsgZm91bmQKKyAgICBuZXR3b3JrX25hbWU6IFBVQkxJQworICAgIGZsb2F0aW5nOgorICAgICAgZGVzY3JpcHRpb246ID4gCisgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBwdWJsaWMgYWRkcmVzcyBzaG91bGQgYmUgYWxsb2NhdGVkIGZyb20gYSBwb29sIG9mIGZsb2F0aW5nIElQcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldHdvcmsuCisgICAgICB0eXBlOiBib29sZWFuCisgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgc3RhdHVzOiBleHBlcmltZW50YWwKKyAgICBkbnNfbmFtZToKKyAgICAgIGRlc2NyaXB0aW9uOiBUaGUgb3B0aW9uYWwgbmFtZSB0byByZWdpc3RlciB3aXRoIEROUyAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlICAgIAorICAgICAgc3RhdHVzOiBleHBlcmltZW50YWwKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgIyBDaGFuZ2UgRW5kcG9pbnQgc2VjdXJlIGluZGljYXRvciB0byB0cnVlIGZyb20gaXRzIGRlZmF1bHQgb2YgZmFsc2UKKyAgcHJvcGVydGllczoKKyAgICBzZWN1cmU6IHRydWUKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5EYXRhYmFzZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQgCit0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisgIHByb3BlcnRpZXM6CisgICAgYXJjaGl0ZWN0dXJlOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UgCisgICAgdHlwZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgZGlzdHJpYnV0aW9uOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICB2ZXJzaW9uOgorICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCit0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBtaW5faW5zdGFuY2VzOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgZGVmYXVsdDogMQorICAgIG1heF9pbnN0YW5jZXM6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBkZWZhdWx0OiAxCisgICAgZGVmYXVsdF9pbnN0YW5jZXM6CisgICAgICB0eXBlOiBpbnRlZ2VyCit0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorCisKK3Rvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIuRG9ja2VyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgcHJvcGVydGllczoKKyAgICB2ZXJzaW9uOgorICAgICAgdHlwZTogbGlzdAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBlbnRyeV9zY2hlbWE6IHZlcnNpb24KKyAgICBwdWJsaXNoX2FsbDoKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBwdWJsaXNoX3BvcnRzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOiBQb3J0U3BlYworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgZXhwb3NlX3BvcnRzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOiBQb3J0U3BlYworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdm9sdW1lczoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKK3Rvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2FwYWJpbGl0eVR5cGVzLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NhcGFiaWxpdHlUeXBlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiNjZlNgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NhcGFiaWxpdHlUeXBlcy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2FwYWJpbGl0eVR5cGVzQ2kuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2FwYWJpbGl0eVR5cGVzQ2kuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MGNkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jYXBhYmlsaXR5VHlwZXNDaS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2F0ZWdvcnlUeXBlcy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jYXRlZ29yeVR5cGVzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODhhMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY2F0ZWdvcnlUeXBlcy55bWwKQEAgLTAsMCArMSw4OSBAQAorc2VydmljZXM6CisgICAgTW9iaWxpdHk6CisgICAgICBuYW1lOiAiTW9iaWxpdHkiCisgICAgICBpY29uczogWydtb2JpbGl0eSddCisgICAgTmV0d29ya19MMV8zOgorICAgICAgbmFtZTogIk5ldHdvcmsgTDEtMyIKKyAgICAgIGljb25zOiBbJ25ldHdvcmtfbF8xLTMnXQorICAgIE5ldHdvcmtfTDQ6CisgICAgICBuYW1lOiAiTmV0d29yayBMNCsiCisgICAgICBpY29uczogWyduZXR3b3JrX2xfNCddCisgICAgVm9JUF9DYWxsX0NvbnRyb2w6CisgICAgICBuYW1lOiAiVm9JUCBDYWxsIENvbnRyb2wiCisgICAgICBpY29uczogWydjYWxsX2NvbnRyb2xsJ10KK3Jlc291cmNlczoKKyAgTmV0d29ya0xheWVyMjM6CisgICAgbmFtZTogIk5ldHdvcmsgTDItMyIKKyAgICBzdWJjYXRlZ29yaWVzOiAKKyAgICAgIFJvdXRlcjoKKyAgICAgICAgICBuYW1lOiAiUm91dGVyIgorICAgICAgICAgIGljb25zOiBbJ3JvdXRlcicsJ3ZSb3V0ZXInXQorICAgICAgR2F0ZXdheToKKyAgICAgICAgICBuYW1lOiAiR2F0ZXdheSIKKyAgICAgICAgICBpY29uczogWydnYXRld2F5J10KKyAgICAgIFdBTl9Db25uZWN0b3JzOgorICAgICAgICAgIG5hbWU6ICJXQU4gQ29ubmVjdG9ycyIKKyAgICAgICAgICBpY29uczogWyduZXR3b3JrJywnY29ubmVjdG9yJywncG9ydCddCisgICAgICBMQU5fQ29ubmVjdG9yczoKKyAgICAgICAgICBuYW1lOiAiTEFOIENvbm5lY3RvcnMiCisgICAgICAgICAgaWNvbnM6IFsnbmV0d29yaycsJ2Nvbm5lY3RvcicsJ3BvcnQnXQorICAgICAgSW5mcmFzdHJ1Y3R1cmU6CisgICAgICAgICAgICAgICAgbmFtZTogIkluZnJhc3RydWN0dXJlIgorICAgICAgICAgICAgICAgIGljb25zOiBbJ3VjcGUnXQorICBOZXR3b3JrTGF5ZXI0OgorICAgIG5hbWU6ICJOZXR3b3JrIEw0KyIKKyAgICBzdWJjYXRlZ29yaWVzOiAKKyAgICAgIENvbW1vbl9OZXR3b3JrX1Jlc291cmNlczoKKyAgICAgICAgICBuYW1lOiAiQ29tbW9uIE5ldHdvcmsgUmVzb3VyY2VzIgorICAgICAgICAgIGljb25zOiBbJ25ldHdvcmsnXQorICBBcHBsaWNhdGlvbkxheWVyNDoKKyAgICBuYW1lOiAiQXBwbGljYXRpb24gTDQrIgorICAgIHN1YmNhdGVnb3JpZXM6IAorICAgICAgQm9yZGVyX0VsZW1lbnQ6CisgICAgICAgICAgbmFtZTogIkJvcmRlciBFbGVtZW50IgorICAgICAgICAgIGljb25zOiBbJ2JvcmRlckVsZW1lbnQnXQorICAgICAgQXBwbGljYXRpb25fU2VydmVyOgorICAgICAgICAgIG5hbWU6ICJBcHBsaWNhdGlvbiBTZXJ2ZXIiCisgICAgICAgICAgaWNvbnM6IFsnYXBwbGljYXRpb25TZXJ2ZXInXQorICAgICAgV2ViX1NlcnZlcjoKKyAgICAgICAgICBuYW1lOiAiV2ViIFNlcnZlciIKKyAgICAgICAgICBpY29uczogWydhcHBsaWNhdGlvblNlcnZlciddCisgICAgICBDYWxsX0NvbnRyb2w6CisgICAgICAgICAgbmFtZTogIkNhbGwgQ29udHJvbCIKKyAgICAgICAgICBpY29uczogWydjYWxsX2NvbnRyb2xsJ10KKyAgICAgIE1lZGlhX1NlcnZlcnM6CisgICAgICAgICAgbmFtZTogIk1lZGlhIFNlcnZlcnMiCisgICAgICAgICAgaWNvbnM6IFsnYXBwbGljYXRpb25TZXJ2ZXInXQorICAgICAgTG9hZF9CYWxhbmNlcjoKKyAgICAgICAgICBuYW1lOiAiTG9hZCBCYWxhbmNlciIKKyAgICAgICAgICBpY29uczogWydsb2FkQmFsYW5jZXInXQorICAgICAgRGF0YWJhc2U6CisgICAgICAgICAgbmFtZTogIkRhdGFiYXNlIgorICAgICAgICAgIGljb25zOiBbJ2RhdGFiYXNlJ10KKyAgICAgIEZpcmV3YWxsOgorICAgICAgICAgIG5hbWU6ICJGaXJld2FsbCIKKyAgICAgICAgICBpY29uczogWydmaXJld2FsbCddCisgIEdlbmVyaWM6CisgICAgbmFtZTogIkdlbmVyaWMiCisgICAgc3ViY2F0ZWdvcmllczogCisgICAgICBJbmZyYXN0cnVjdHVyZToKKyAgICAgICAgICBuYW1lOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICAgICAgaWNvbnM6IFsnY29ubmVjdG9yJ10KKyAgICAgIEFic3RyYWN0OgorICAgICAgICAgIG5hbWU6ICJBYnN0cmFjdCIKKyAgICAgICAgICBpY29uczogWydvYmplY3RTdG9yYWdlJywgJ2NvbXB1dGUnXQorICAgICAgTmV0d29ya19FbGVtZW50czoKKyAgICAgICAgICBuYW1lOiAiTmV0d29yayBFbGVtZW50cyIKKyAgICAgICAgICBpY29uczogWyduZXR3b3JrJywgJ2Nvbm5lY3RvciddCisgICAgICBEYXRhYmFzZToKKyAgICAgICAgICBuYW1lOiAiRGF0YWJhc2UiCisgICAgICAgICAgaWNvbnM6IFsnZGF0YWJhc2UnXQorICBOZXR3b3JrQ29ubmVjdGl2aXR5OgorICAgIG5hbWU6ICJOZXR3b3JrIENvbm5lY3Rpdml0eSIKKyAgICBzdWJjYXRlZ29yaWVzOgorICAgICAgQ29ubmVjdGlvblBvaW50czoKKyAgICAgICAgICBuYW1lOiAiQ29ubmVjdGlvbiBQb2ludHMiCisgICAgICAgICAgaWNvbnM6IFsnY3AnXQorICAgICAgVmlydHVhbExpbmtzOgorICAgICAgICAgIG5hbWU6ICJWaXJ0dWFsIExpbmtzIgorICAgICAgICAgIGljb25zOiBbJ3ZsJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jYXRlZ29yeVR5cGVzLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NhdGVnb3J5VHlwZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTg0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jYXRlZ29yeVR5cGVzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jb21wdXRlL2NvbXB1dGUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbXB1dGUvY29tcHV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Nzc1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jb21wdXRlL2NvbXB1dGUuanNvbgpAQCAtMCwwICsxLDI0IEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LWNvbXB1dGUueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJDb21wdXRlIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSByZWFsIG9yIHZpcnR1YWwgbWFjaGluZSBvciBzZXJ2ZXIuIEluZm9ybWF0aW9uIHNwZWNpZmllZCBvbiB0aGUgQ29tcHV0ZQorICAgICAgbm9kZSB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgbWFjaGluZSB0aGF0IGZpdHMgdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBpbiB0aGUgY2xvdWQKKyAgICAgIGF2YWlsYWJsZSBtYWNoaW5lcy4gSWYgbm8gc2l6aW5nIGluZm9ybWF0aW9uIGFyZSBzcGVjaWZpZWQgdGhlIGNsb3VkIHByb3ZpZGVyIGRlZmF1bHQKKyAgICAgIG1hY2hpbmUgd2lsbCBiZSB1c2VkLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzcGVjaWZ5IHRoZSByZXF1aXJlZCAgQ1BVcyBhbmQgbWVtb3J5CisgICAgICBhdCBsZWFzdC4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJjb21wdXRlIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidGFncyI6IFsKKyAgICAiQ29tcHV0ZSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy1jb21wdXRlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy1jb21wdXRlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIwN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29tcHV0ZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWNvbXB1dGUueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuQ29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctY29tcHV0ZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctY29tcHV0ZS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhN2MzMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy1jb21wdXRlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jb250YWluZXJBcHBsaWNhdGlvbi9jb250YWluZXJBcHBsaWNhdGlvbi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29udGFpbmVyQXBwbGljYXRpb24vY29udGFpbmVyQXBwbGljYXRpb24uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzEzZTU2YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lckFwcGxpY2F0aW9uL2NvbnRhaW5lckFwcGxpY2F0aW9uLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJBcHBsaWNhdGlvbi55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIkFwcGxpY2F0aW9uIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYW4gYXBwbGljYXRpb24gdGhhdCByZXF1aXJlcyBDb250YWluZXItbGV2ZWwgdmlydHVhbGl6YXRpb24gdGVjaG5vbG9neS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFic3RyYWN0IgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIkFwcGxpY2F0aW9uIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29udGFpbmVyQXBwbGljYXRpb24vbm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJBcHBsaWNhdGlvbi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9jb250YWluZXJBcHBsaWNhdGlvbi9ub3JtYXRpdmUtdHlwZXMtbmV3LWNvbnRhaW5lckFwcGxpY2F0aW9uLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODEzZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29udGFpbmVyQXBwbGljYXRpb24vbm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJBcHBsaWNhdGlvbi55bWwKQEAgLTAsMCArMSw5IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkNvbnRhaW5lci5BcHBsaWNhdGlvbjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db250YWluZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lckFwcGxpY2F0aW9uL25vcm1hdGl2ZS10eXBlcy1uZXctY29udGFpbmVyQXBwbGljYXRpb24uemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29udGFpbmVyQXBwbGljYXRpb24vbm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJBcHBsaWNhdGlvbi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhM2JjMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lckFwcGxpY2F0aW9uL25vcm1hdGl2ZS10eXBlcy1uZXctY29udGFpbmVyQXBwbGljYXRpb24uemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lclJ1bnRpbWUvY29udGFpbmVyUnVudGltZS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29udGFpbmVyUnVudGltZS9jb250YWluZXJSdW50aW1lLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzYmYzOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lclJ1bnRpbWUvY29udGFpbmVyUnVudGltZS5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctY29udGFpbmVyUnVudGltZS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIlJ1bnRpbWUiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBvcGVyYXRpbmcgc3lzdGVtLWxldmVsIHZpcnR1YWxpemF0aW9uIHRlY2hub2xvZ3kgdXNlZCB0byBydW4gbXVsdGlwbGUgYXBwbGljYXRpb24gc2VydmljZXMgb24gYSBzaW5nbGUgQ29tcHV0ZSBob3N0LiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiQWJzdHJhY3QiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidGFncyI6IFsKKyAgICAiUnVudGltZSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lclJ1bnRpbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJSdW50aW1lLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lclJ1bnRpbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJSdW50aW1lLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmExMGEwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29udGFpbmVyUnVudGltZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWNvbnRhaW5lclJ1bnRpbWUueW1sCkBAIC0wLDAgKzEsOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5Db250YWluZXIuUnVudGltZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lclJ1bnRpbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJSdW50aW1lLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2NvbnRhaW5lclJ1bnRpbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1jb250YWluZXJSdW50aW1lLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQwNDcyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvY29udGFpbmVyUnVudGltZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWNvbnRhaW5lclJ1bnRpbWUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2RhdGFiYXNlL2RhdGFiYXNlLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9kYXRhYmFzZS9kYXRhYmFzZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDllMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9kYXRhYmFzZS9kYXRhYmFzZS5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctZGF0YWJhc2UueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJEYXRhYmFzZSIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgbG9naWNhbCBkYXRhYmFzZSB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBob3N0ZWQgYnkgYSBEQk1TIG5vZGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJEYXRhYmFzZSIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJEYXRhYmFzZSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2RhdGFiYXNlL25vcm1hdGl2ZS10eXBlcy1uZXctZGF0YWJhc2UueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvZGF0YWJhc2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1kYXRhYmFzZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2NjE1MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2RhdGFiYXNlL25vcm1hdGl2ZS10eXBlcy1uZXctZGF0YWJhc2UueW1sCkBAIC0wLDAgKzEsMjcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuRGF0YWJhc2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogdGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZm9yIGRhdGEKKyAgICAgIHVzZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHVzZXIgYWNjb3VudCBuYW1lIGZvciBEQiBhZG1pbmlzdHJhdGlvbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHBhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBvcHRpb25hbCBwYXNzd29yZCBmb3IgdGhlIERCIHVzZXIgYWNjb3VudAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkRCTVMKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBkYXRhYmFzZV9lbmRwb2ludDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5EYXRhYmFzZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvZGF0YWJhc2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1kYXRhYmFzZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9kYXRhYmFzZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWRhdGFiYXNlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThiMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvZGF0YWJhc2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1kYXRhYmFzZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvZGVsZXRlTm9ybWF0aXZlLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvZGVsZXRlTm9ybWF0aXZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNzBmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9kZWxldGVOb3JtYXRpdmUuc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gdXNhZ2UgeworCWVjaG8gIlVzYWdlOiAkMCA8aG9zdElwPiA8aG9zdFBvcnQ+IgorfQorCitmdW5jdGlvbiBkZWxldGVSZXNvdXJjZSgpIHsKKwkKKwlFTEVNRU5UX05BTUU9JDEKKwllY2hvIC1lICIjIyMjIyMjIyMjIyMjIyMgUmVtb3ZpbmcgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gU3RhcnQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKwlodHRwX2NvZGU9JChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyAiJXtodHRwX2NvZGV9IiAtWCAiREVMRVRFIiAtSCAiVVNFUl9JRDogamgwMDAzIiAke0hPU1RfSVB9OiR7SE9TVF9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvcmVzXyR7RUxFTUVOVF9OQU1FfSIuMS4wIikKKwlpZiBbICR7aHR0cF9jb2RlfSAtZXEgMjA0ICBdOyB0aGVuCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIFJlbW92aW5nIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjI1xuXG5cbiIKKwllbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA1MDAgXTsgdGhlbgorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyBGYWlsZWQgdG8gcmVtb3ZlIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjI1xuXG5cbiIKKwkJZXhpdCAxCisJZWxpZiBbICR7aHR0cF9jb2RlfSAtZXEgNDA0IF07IHRoZW4KKwkJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gbm90IGZvdW5kIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjI1xuXG5cbiIKKwllbHNlCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byByZW1vdmUgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjXG5cblxuIgorCQlleGl0IDEKKwlmaQorfQoraWYgWyAkIyAtbHQgMiBdCit0aGVuCisJdXNhZ2UKKwlleGl0IDIKK2ZpCisKK0hPU1RfSVA9JDEKK0hPU1RfUE9SVD0kMgorCitkZWxldGVSZXNvdXJjZSAidG9zY2Eubm9kZXMuUm9vdCIKK2RlbGV0ZVJlc291cmNlICJ0b3NjYS5ub2Rlcy5Db21wdXRlIgorZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IgorZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLldlYlNlcnZlciIKK2RlbGV0ZVJlc291cmNlICJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIKK2RlbGV0ZVJlc291cmNlICJ0b3NjYS5ub2Rlcy5EQk1TIgorZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLkRhdGFiYXNlIgorZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLk9iamVjdFN0b3JhZ2UiCitkZWxldGVSZXNvdXJjZSAidG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlIgorZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLkNvbnRhaW5lci5SdW50aW1lIgorZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLkNvbnRhaW5lci5BcHBsaWNhdGlvbiIKK2RlbGV0ZVJlc291cmNlICJ0b3NjYS5ub2Rlcy5Mb2FkQmFsYW5jZXIiCitkZWxldGVSZXNvdXJjZSAidG9zY2Eubm9kZXMubmV0d29yay5Qb3J0IgorZGVsZXRlUmVzb3VyY2UgInRvc2NhLm5vZGVzLm5ldHdvcmsuTmV0d29yayIKKworZXhpdCAwCisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2ltcG9ydE5vcm1hdGl2ZS5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2ltcG9ydE5vcm1hdGl2ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQyMGNlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvaW1wb3J0Tm9ybWF0aXZlLnNoCkBAIC0wLDAgKzEsODkgQEAKKyMhL2Jpbi9iYXNoCisKK2Z1bmN0aW9uIHVzYWdlIHsKKwllY2hvICJVc2FnZTogJDAgPGhvc3RJcD4gPGhvc3RQb3J0PiA8dXNlcklkPiIKK30KKworZnVuY3Rpb24gYWRkUmVzb3VyY2UoKSB7CisJCisJRUxFTUVOVF9OQU1FPSQxCisJZWNobyAtZSAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBZGRpbmcgRWxlbWVudCAke0VMRU1FTlRfTkFNRX0gU3RhcnQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKwlDVVJSRU5UX1pJUF9GSUxFPS4vJHtFTEVNRU5UX05BTUV9L25vcm1hdGl2ZS10eXBlcy1uZXctJHtFTEVNRU5UX05BTUV9LnppcAorCUNVUlJFTlRfSlNPTl9GSUxFPS4vJHtFTEVNRU5UX05BTUV9LyR7RUxFTUVOVF9OQU1FfS5qc29uCisJc2VkIC1pICdzLyJ1c2VySWQiOiAiLioiLC8idXNlcklkIjogIicke0FUVF9VSUR9JyIsLycgJHtDVVJSRU5UX0pTT05fRklMRX0KKwlKU09OX0NPTlRFTlQ9YHBhc3RlIC1zICR7Q1VSUkVOVF9KU09OX0ZJTEV9YAorCWh0dHBfY29kZT0kKGN1cmwgLXMgLW8gL2Rldi9udWxsIC13ICIle2h0dHBfY29kZX0iIC12IC1GIHJlc291cmNlTWV0YWRhdGE9IiR7SlNPTl9DT05URU5UfSIgLUYgcmVzb3VyY2VaaXA9QCR7Q1VSUkVOVF9aSVBfRklMRX0gLUggVVNFUl9JRDoke0FUVF9VSUR9ICR7SE9TVF9JUH06JHtIT1NUX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3VwbG9hZC9tdWx0aXBhcnQpCisJaWYgWyAke2h0dHBfY29kZX0gLWVxIDIwMSAgXTsgdGhlbgorCQllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZWxpZiBbICR7aHR0cF9jb2RlfSAtZXEgNDA5IF07IHRoZW4KKwkJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFscmVhZHkgZXhpc3RzIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCWVsaWYgWyAke2h0dHBfY29kZX0gLWVxIDUwMCBdOyB0aGVuCisJCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGYWlsZWQgdG8gYWRkIEVsZW1lbnQgJHtFTEVNRU5UX05BTUV9IHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCQlleGl0IDEKKwlmaQorfQoraWYgWyAkIyAtbHQgMyBdCit0aGVuCisJdXNhZ2UKKwlleGl0IDIKK2ZpCisKK0hPU1RfSVA9JDEKK0hPU1RfUE9SVD0kMgorQVRUX1VJRD0kMworCisjQWRkIFRoZSBDYXBhYmlsaXR5VHlwZXMKK2h0dHBfY29kZT0kKGN1cmwgLXMgLW8gL2Rldi9udWxsIC13ICIle2h0dHBfY29kZX0iIC12IC1GIGNhcGFiaWxpdHlUeXBlWmlwPUBjYXBhYmlsaXR5VHlwZXMuemlwIC1IICJVU0VSX0lEOiBqaDAwMDMiICR7SE9TVF9JUH06JHtIT1NUX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3VwbG9hZFR5cGUvY2FwYWJpbGl0eSkKK2lmIFsgJHtodHRwX2NvZGV9IC1lcSAyMDEgIF07IHRoZW4KKwllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIFRoZSBDYXBhYmlsaXR5VHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCitlbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA1MDAgXTsgdGhlbgorCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGYWlsZWQgdG8gYWRkIENhcGFiaWxpdHlUeXBlcyBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKKwlleGl0IDEKK2Vsc2UKKwllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRmFpbGVkIHRvIGFkZCBDYXBhYmlsaXR5VHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZXhpdCAxCitmaQorI0FkZCBUaGUgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMKK2h0dHBfY29kZT0kKGN1cmwgLXMgLW8gL2Rldi9udWxsIC13ICIle2h0dHBfY29kZX0iIC12IC1GIGludGVyZmFjZUxpZmVjeWNsZVR5cGVaaXA9QGludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnppcCAtSCAiVVNFUl9JRDogamgwMDAzIiAke0hPU1RfSVB9OiR7SE9TVF9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2ludGVyZmFjZUxpZmVjeWNsZSkKK2lmIFsgJHtodHRwX2NvZGV9IC1lcSAyMDEgIF07IHRoZW4KKwllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWRkaW5nIFRoZSBJbnRlcmZhY2VMaWZlY3ljbGVUeXBlcyBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKK2VsaWYgWyAke2h0dHBfY29kZX0gLWVxIDQwOSBdOyB0aGVuCisgICAgZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFscmVhZHkgZXhpc3RzIEludGVyZmFjZUxpZmVjeWNsZVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgkKK2VsaWYgWyAke2h0dHBfY29kZX0gLWVxIDUwMCBdOyB0aGVuCisJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZXhpdCAxCitlbHNlCisJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCisJZXhpdCAxCitmaQorI0FkZCBUaGUgQ2F0ZWdvcnlUeXBlcworaHR0cF9jb2RlPSQoY3VybCAtcyAtbyAvZGV2L251bGwgLXcgIiV7aHR0cF9jb2RlfSIgLXYgLUYgY2F0ZWdvcmllc1ppcD1AY2F0ZWdvcnlUeXBlcy56aXAgLUggIlVTRVJfSUQ6IGpoMDAwMyIgJHtIT1NUX0lQfToke0hPU1RfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkVHlwZS9jYXRlZ29yaWVzKQoraWYgWyAke2h0dHBfY29kZX0gLWVxIDIwMSAgXTsgdGhlbgorCWVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBZGRpbmcgVGhlIENhdGVnb3J5VHlwZXMgc3RhdHVzIGNvZGU6JHtodHRwX2NvZGV9IEVuZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuXG4iCitlbGlmIFsgJHtodHRwX2NvZGV9IC1lcSA0MDkgXTsgdGhlbgorICAgIGVjaG8gLWUgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBbHJlYWR5IGV4aXN0cyBDYXRlZ29yeVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgkKK2VsaWYgWyAke2h0dHBfY29kZX0gLWVxIDUwMCBdOyB0aGVuCisJZWNobyAtZSAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZhaWxlZCB0byBhZGQgQ2F0ZWdvcnlUeXBlcyBzdGF0dXMgY29kZToke2h0dHBfY29kZX0gRW5kICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG5cbiIKKwlleGl0IDEKK2Vsc2UKKwllY2hvIC1lICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRmFpbGVkIHRvIGFkZCBDYXRlZ29yeVR5cGVzIHN0YXR1cyBjb2RlOiR7aHR0cF9jb2RlfSBFbmQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cblxuIgorCWV4aXQgMQorZmkKKworYWRkUmVzb3VyY2UgInJvb3QiCithZGRSZXNvdXJjZSAiY29tcHV0ZSIKK2FkZFJlc291cmNlICJzb2Z0d2FyZUNvbXBvbmVudCIKK2FkZFJlc291cmNlICJ3ZWJTZXJ2ZXIiCithZGRSZXNvdXJjZSAid2ViQXBwbGljYXRpb24iCithZGRSZXNvdXJjZSAiREJNUyIKK2FkZFJlc291cmNlICJkYXRhYmFzZSIKK2FkZFJlc291cmNlICJvYmplY3RTdG9yYWdlIgorYWRkUmVzb3VyY2UgImJsb2NrU3RvcmFnZSIKK2FkZFJlc291cmNlICJjb250YWluZXJSdW50aW1lIgorYWRkUmVzb3VyY2UgImNvbnRhaW5lckFwcGxpY2F0aW9uIgorYWRkUmVzb3VyY2UgImxvYWRCYWxhbmNlciIKK2FkZFJlc291cmNlICJwb3J0IgorYWRkUmVzb3VyY2UgIm5ldHdvcmsiCisKK2V4aXQgMAorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9pbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9pbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2NzExOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnltbApAQCAtMCwwICsxLDExIEBACit0b3NjYS5pbnRlcmZhY2VzLm5vZGUubGlmZWN5Y2xlLlN0YW5kYXJkOgorICBjcmVhdGU6CisgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBjcmVhdGUgb3BlcmF0aW9uLgorICBjb25maWd1cmU6CisgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBjb25maWd1cmUgb3BlcmF0aW9uLgorICBzdGFydDoKKyAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIHN0YXJ0IG9wZXJhdGlvbi4KKyAgc3RvcDoKKyAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIHN0b3Agb3BlcmF0aW9uLgorICBkZWxldGU6CisgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBkZWxldGUgb3BlcmF0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNmOTNhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmRkYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvbG9hZEJhbGFuY2VyL2xvYWRCYWxhbmNlci5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctbG9hZEJhbGFuY2VyLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiTG9hZEJhbGFuY2VyIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgbG9naWNhbCBmdW5jdGlvbiB0aGF0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIEZsb2F0aW5nIEFkZHJlc3MgdG8gZGlzdHJpYnV0ZSBhbiBhcHBsaWNhdGlvbuKAmXMgdHJhZmZpYyAobG9hZCkgYWNyb3NzIGEgbnVtYmVyIG9mIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gKGUuZy4sIGZvciBhIGNsdXN0ZXJlZCBvciBzY2FsZWQgYXBwbGljYXRpb24pLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImxvYWRCYWxhbmNlciIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIkxvYWRCYWxhbmNlciIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL2xvYWRCYWxhbmNlci9ub3JtYXRpdmUtdHlwZXMtbmV3LWxvYWRCYWxhbmNlci55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9sb2FkQmFsYW5jZXIvbm9ybWF0aXZlLXR5cGVzLW5ldy1sb2FkQmFsYW5jZXIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODU3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9sb2FkQmFsYW5jZXIvbm9ybWF0aXZlLXR5cGVzLW5ldy1sb2FkQmFsYW5jZXIueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuTG9hZEJhbGFuY2VyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdCAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgIyBUQkQKKyAgICAgIGFsZ29yaXRobSA6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBleHBlcmltZW50YWwKKyAgICBjYXBhYmlsaXRpZXMgOgorICAgICAgY2xpZW50OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LlB1YmxpYworICAgICAgICBkZXNjcmlwdGlvbjogdGhlIEZsb2F0aW5nIChJUCkgY2xpZW504oCZcyBvbiB0aGUgcHVibGljIG5ldHdvcmsgY2FuIGNvbm5lY3QgdG8KKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBhcHBsaWNhdGlvbjogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLlJvdXRlc1RvCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9sb2FkQmFsYW5jZXIvbm9ybWF0aXZlLXR5cGVzLW5ldy1sb2FkQmFsYW5jZXIuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvbG9hZEJhbGFuY2VyL25vcm1hdGl2ZS10eXBlcy1uZXctbG9hZEJhbGFuY2VyLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWZlZDZmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvbG9hZEJhbGFuY2VyL25vcm1hdGl2ZS10eXBlcy1uZXctbG9hZEJhbGFuY2VyLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9uZXR3b3JrL25ldHdvcmsuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL25ldHdvcmsvbmV0d29yay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWViMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9uZXR3b3JrL25ldHdvcmsuanNvbgpAQCAtMCwwICsxLDIxIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LW5ldHdvcmsueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJOZXR3b3JrIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBzaW1wbGUgLCBsb2dpY2FsIG5ldHdvcmsgc2VydmljZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJuZXR3b3JrIiwKKyAgInJlc291cmNlVHlwZSI6ICJWTCIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIk5ldHdvcmsiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9uZXR3b3JrL25vcm1hdGl2ZS10eXBlcy1uZXctbmV0d29yay55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9uZXR3b3JrL25vcm1hdGl2ZS10eXBlcy1uZXctbmV0d29yay55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmOWQzZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL25ldHdvcmsvbm9ybWF0aXZlLXR5cGVzLW5ldy1uZXR3b3JrLnltbApAQCAtMCwwICsxLDQxIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTmV0d29yazoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgaXBfdmVyc2lvbjoKKyAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgICAgZGVmYXVsdDogNAorICAgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgNCwgNiBdCisgICAgICAgIGNpZHI6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXJ0X2lwOgorICAgICAgICAgIHR5cGU6IHN0cmluZyAKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZW5kX2lwOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBnYXRld2F5X2lwOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBuZXR3b3JrX25hbWU6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIG5ldHdvcmtfaWQ6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHNlZ21lbnRhdGlvbl9pZDoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UgCisgICAgICAgIG5ldHdvcmtfdHlwZToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UgCisgICAgICAgIHBoeXNpY2FsX25ldHdvcms6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9uZXR3b3JrL25vcm1hdGl2ZS10eXBlcy1uZXctbmV0d29yay56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9uZXR3b3JrL25vcm1hdGl2ZS10eXBlcy1uZXctbmV0d29yay56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwZGFlYgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL25ldHdvcmsvbm9ybWF0aXZlLXR5cGVzLW5ldy1uZXR3b3JrLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ub3JtYXRpdmUtcG9ydC9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm9ybWF0aXZlLXBvcnQvbm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDE1NDBiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm9ybWF0aXZlLXBvcnQvbm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0LnltbApAQCAtMCwwICsxLDMxIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLm5ldHdvcmsuUG9ydDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgaXBfYWRkcmVzczoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgb3JkZXI6CisgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgICAgZGVmYXVsdDogMCAKKyAgICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMAorICAgICAgICBpc19kZWZhdWx0OgorICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgICBpcF9yYW5nZV9zdGFydDoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgaXBfcmFuZ2VfZW5kOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSAgCisgICAgICByZXF1aXJlbWVudHM6CisgICAgICAgLSBsaW5rOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkxpbmtzVG8gCisgICAgICAgLSBiaW5kaW5nOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuQmluZHNUbyAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL25vcm1hdGl2ZS1wb3J0L25vcm1hdGl2ZS10eXBlcy1uZXctcG9ydC56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ub3JtYXRpdmUtcG9ydC9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTAzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ub3JtYXRpdmUtcG9ydC9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL25vcm1hdGl2ZS1wb3J0L3BvcnQuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL25vcm1hdGl2ZS1wb3J0L3BvcnQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjYyZDdmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm9ybWF0aXZlLXBvcnQvcG9ydC5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctcG9ydC55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIlBvcnQiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgYXNzb2NpYXRlcyBiZXR3ZWVuIENvbXB1dGUgYW5kIE5ldHdvcmsgbm9ybWF0aXZlIHR5cGVzLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogInBvcnQiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJOZXR3b3JrIEVsZW1lbnRzIgorICAgICAgfQorICAgIF0KKyAgfQorXSwgIAorICJ0YWdzIjogWworICAgICJQb3J0IgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm90bWF0aXZlLW5ldHdvcmsvbmV0d29yay5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm90bWF0aXZlLW5ldHdvcmsvbmV0d29yay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjQ5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ub3RtYXRpdmUtbmV0d29yay9uZXR3b3JrLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1uZXR3b3JrLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiTmV0d29yayIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2ltcGxlICwgbG9naWNhbCBuZXR3b3JrIHNlcnZpY2UuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29yayIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIk5ldHdvcmsiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ub3RtYXRpdmUtbmV0d29yay9ub3JtYXRpdmUtdHlwZXMtbmV3LW5ldHdvcmsueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm90bWF0aXZlLW5ldHdvcmsvbm9ybWF0aXZlLXR5cGVzLW5ldy1uZXR3b3JrLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJlODc3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm90bWF0aXZlLW5ldHdvcmsvbm9ybWF0aXZlLXR5cGVzLW5ldy1uZXR3b3JrLnltbApAQCAtMCwwICsxLDQxIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLm5ldHdvcmsuTmV0d29yazoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgaXBfdmVyc2lvbjoKKyAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgICAgZGVmYXVsdDogNAorICAgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgNCwgNiBdCisgICAgICAgIGNpZHI6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXJ0X2lwOgorICAgICAgICAgIHR5cGU6IHN0cmluZyAKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZW5kX2lwOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBnYXRld2F5X2lwOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBuZXR3b3JrX25hbWU6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIG5ldHdvcmtfaWQ6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHNlZ21lbnRhdGlvbl9pZDoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UgCisgICAgICAgIG5ldHdvcmtfdHlwZToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UgCisgICAgICAgIHBoeXNpY2FsX25ldHdvcms6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9ub3RtYXRpdmUtbmV0d29yay9ub3JtYXRpdmUtdHlwZXMtbmV3LW5ldHdvcmsuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm90bWF0aXZlLW5ldHdvcmsvbm9ybWF0aXZlLXR5cGVzLW5ldy1uZXR3b3JrLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWM1ZmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvbm90bWF0aXZlLW5ldHdvcmsvbm9ybWF0aXZlLXR5cGVzLW5ldy1uZXR3b3JrLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9vYmplY3RTdG9yYWdlL25vcm1hdGl2ZS10eXBlcy1uZXctb2JqZWN0U3RvcmFnZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9vYmplY3RTdG9yYWdlL25vcm1hdGl2ZS10eXBlcy1uZXctb2JqZWN0U3RvcmFnZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzMzhjMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL29iamVjdFN0b3JhZ2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1vYmplY3RTdG9yYWdlLnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLk9iamVjdFN0b3JhZ2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNpemU6IAorICAgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMCBHQgorICAgICAgbWF4c2l6ZToKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAgR0IKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBzdG9yYWdlX2VuZHBvaW50OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL29iamVjdFN0b3JhZ2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1vYmplY3RTdG9yYWdlLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL29iamVjdFN0b3JhZ2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1vYmplY3RTdG9yYWdlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTA0NmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvb2JqZWN0U3RvcmFnZS9ub3JtYXRpdmUtdHlwZXMtbmV3LW9iamVjdFN0b3JhZ2UuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL29iamVjdFN0b3JhZ2Uvb2JqZWN0U3RvcmFnZS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvb2JqZWN0U3RvcmFnZS9vYmplY3RTdG9yYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3YjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL29iamVjdFN0b3JhZ2Uvb2JqZWN0U3RvcmFnZS5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctb2JqZWN0U3RvcmFnZS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIk9iamVjdFN0b3JhZ2UiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBzdG9yYWdlIHRoYXQgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gc3RvcmUgZGF0YSBhcyBvYmplY3RzIChvciBCTE9CcyBvZiBkYXRhKSB3aXRob3V0IGNvbnNpZGVyYXRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gb3IgZGV2aWNlcy4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJvYmplY3RTdG9yYWdlIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLAorICJ0YWdzIjogWworICAgICJPYmplY3RTdG9yYWdlIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvcG9ydC9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2UvcG9ydC9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDcxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9wb3J0L25vcm1hdGl2ZS10eXBlcy1uZXctcG9ydC55bWwKQEAgLTAsMCArMSwzMSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLlBvcnQ6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIGlwX2FkZHJlc3M6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIG9yZGVyOgorICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICAgIGRlZmF1bHQ6IDAgCisgICAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAKKyAgICAgICAgaXNfZGVmYXVsdDoKKyAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgICAgaXBfcmFuZ2Vfc3RhcnQ6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGlwX3JhbmdlX2VuZDoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UgIAorICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgIC0gbGluazogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5MaW5rc1RvIAorICAgICAgIC0gYmluZGluZzoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkJpbmRzVG8gCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9wb3J0L25vcm1hdGl2ZS10eXBlcy1uZXctcG9ydC56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9wb3J0L25vcm1hdGl2ZS10eXBlcy1uZXctcG9ydC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ODhhNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3BvcnQvbm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9wb3J0L3BvcnQuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3BvcnQvcG9ydC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTA2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9wb3J0L3BvcnQuanNvbgpAQCAtMCwwICsxLDIxIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJQb3J0IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBsb2dpY2FsIGVudGl0eSB0aGF0IGFzc29jaWF0ZXMgYmV0d2VlbiBDb21wdXRlIGFuZCBOZXR3b3JrIG5vcm1hdGl2ZSB0eXBlcy4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJwb3J0IiwKKyAgInJlc291cmNlVHlwZSI6ICJDUCIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIk5ldHdvcmsgRWxlbWVudHMiCisgICAgICB9CisgICAgXQorICB9CitdLCAgCisgInRhZ3MiOiBbCisgICAgIlBvcnQiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9yb290L25vcm1hdGl2ZS10eXBlcy1uZXctcm9vdC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9yb290L25vcm1hdGl2ZS10eXBlcy1uZXctcm9vdC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliMWRlOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3Jvb3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1yb290LnltbApAQCAtMCwwICsxLDIzIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLlJvb3Q6CisgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBOb2RlIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgTm9kZSBUeXBlcyBkZXJpdmUgZnJvbQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN0YXRlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBmZWF0dXJlOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGRlcGVuZGVuY3kgOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuUm9vdCAKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgMCwgVU5CT1VOREVEIF0KKyAgICBpbnRlcmZhY2VzOiAKKyAgICAgIFN0YW5kYXJkOgorICAgICAgICB0eXBlOiB0b3NjYS5pbnRlcmZhY2VzLm5vZGUubGlmZWN5Y2xlLlN0YW5kYXJkCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9yb290L25vcm1hdGl2ZS10eXBlcy1uZXctcm9vdC56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9yb290L25vcm1hdGl2ZS10eXBlcy1uZXctcm9vdC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1ODNlOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3Jvb3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1yb290LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9yb290L3Jvb3QuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3Jvb3Qvcm9vdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjcwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9yb290L3Jvb3QuanNvbgpAQCAtMCwwICsxLDIwIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXJvb3QueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJSb290IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFic3RyYWN0IgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIlJvb3QiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9zb2Z0d2FyZUNvbXBvbmVudC9ub3JtYXRpdmUtdHlwZXMtbmV3LXNvZnR3YXJlQ29tcG9uZW50LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3NvZnR3YXJlQ29tcG9uZW50L25vcm1hdGl2ZS10eXBlcy1uZXctc29mdHdhcmVDb21wb25lbnQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTQ2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9zb2Z0d2FyZUNvbXBvbmVudC9ub3JtYXRpdmUtdHlwZXMtbmV3LXNvZnR3YXJlQ29tcG9uZW50LnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICAjIGRvbWFpbi1zcGVjaWZpYyBzb2Z0d2FyZSBjb21wb25lbnQgdmVyc2lvbgorICAgICAgY29tcG9uZW50X3ZlcnNpb246IAorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgYWRtaW5fY3JlZGVudGlhbDogCisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3NvZnR3YXJlQ29tcG9uZW50L25vcm1hdGl2ZS10eXBlcy1uZXctc29mdHdhcmVDb21wb25lbnQuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvc29mdHdhcmVDb21wb25lbnQvbm9ybWF0aXZlLXR5cGVzLW5ldy1zb2Z0d2FyZUNvbXBvbmVudC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2MWVlYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3NvZnR3YXJlQ29tcG9uZW50L25vcm1hdGl2ZS10eXBlcy1uZXctc29mdHdhcmVDb21wb25lbnQuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3NvZnR3YXJlQ29tcG9uZW50L3NvZnR3YXJlQ29tcG9uZW50Lmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDEyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctc29mdHdhcmVDb21wb25lbnQueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJTb2Z0d2FyZUNvbXBvbmVudCIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJTb2Z0d2FyZUNvbXBvbmVudCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3dlYkFwcGxpY2F0aW9uL25vcm1hdGl2ZS10eXBlcy1uZXctd2ViQXBwbGljYXRpb24ueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvd2ViQXBwbGljYXRpb24vbm9ybWF0aXZlLXR5cGVzLW5ldy13ZWJBcHBsaWNhdGlvbi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5YTc3NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3dlYkFwcGxpY2F0aW9uL25vcm1hdGl2ZS10eXBlcy1uZXctd2ViQXBwbGljYXRpb24ueW1sCkBAIC0wLDAgKzEsMTUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb246CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIGNvbnRleHRfcm9vdDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYXBwX2VuZHBvaW50OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuV2ViU2VydmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS93ZWJBcHBsaWNhdGlvbi9ub3JtYXRpdmUtdHlwZXMtbmV3LXdlYkFwcGxpY2F0aW9uLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3dlYkFwcGxpY2F0aW9uL25vcm1hdGl2ZS10eXBlcy1uZXctd2ViQXBwbGljYXRpb24uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNmQ5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS93ZWJBcHBsaWNhdGlvbi9ub3JtYXRpdmUtdHlwZXMtbmV3LXdlYkFwcGxpY2F0aW9uLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS93ZWJBcHBsaWNhdGlvbi93ZWJBcHBsaWNhdGlvbi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvd2ViQXBwbGljYXRpb24vd2ViQXBwbGljYXRpb24uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzI1YzY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvd2ViQXBwbGljYXRpb24vd2ViQXBwbGljYXRpb24uanNvbgpAQCAtMCwwICsxLDIwIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXdlYkFwcGxpY2F0aW9uLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiV2ViQXBwbGljYXRpb24iLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIFdlYiBTZXJ2ZXIgbm9kZS4gIFNwZWNpZmljIHR5cGVzIG9mIHdlYiBhcHBsaWNhdGlvbnMgc3VjaCBhcyBKYXZhLCBldGMuIGNvdWxkIGJlIGRlcml2ZWQgZnJvbSB0aGlzIHR5cGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJXZWJBcHBsaWNhdGlvbiIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3dlYlNlcnZlci9ub3JtYXRpdmUtdHlwZXMtbmV3LXdlYlNlcnZlci55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS93ZWJTZXJ2ZXIvbm9ybWF0aXZlLXR5cGVzLW5ldy13ZWJTZXJ2ZXIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTU3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS93ZWJTZXJ2ZXIvbm9ybWF0aXZlLXR5cGVzLW5ldy13ZWJTZXJ2ZXIueW1sCkBAIC0wLDAgKzEsMTEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuV2ViU2VydmVyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICAjIFByaXZhdGUsIGxheWVyIDQgZW5kcG9pbnRzIAorICAgICAgZGF0YV9lbmRwb2ludDogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICBhZG1pbl9lbmRwb2ludDogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluCisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3dlYlNlcnZlci9ub3JtYXRpdmUtdHlwZXMtbmV3LXdlYlNlcnZlci56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS93ZWJTZXJ2ZXIvbm9ybWF0aXZlLXR5cGVzLW5ldy13ZWJTZXJ2ZXIuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODc2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZS93ZWJTZXJ2ZXIvbm9ybWF0aXZlLXR5cGVzLW5ldy13ZWJTZXJ2ZXIuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3dlYlNlcnZlci93ZWJTZXJ2ZXIuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlL3dlYlNlcnZlci93ZWJTZXJ2ZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDc0ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2Uvd2ViU2VydmVyL3dlYlNlcnZlci5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctd2ViU2VydmVyLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiV2ViU2VydmVyIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYW4gYWJzdHJhY3Qgc29mdHdhcmUgY29tcG9uZW50IG9yIHNlcnZpY2UgdGhhdCBpcyBjYXBhYmxlIG9mIGhvc3RpbmcgYW5kIHByb3ZpZGluZyBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgZm9yIG9uZSBvciBtb3JlIFdlYiBBcHBsaWNhdGlvbiBub2Rlcy4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFic3RyYWN0IgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIldlYlNlcnZlciIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvVlNQUGFja2FnZS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9WU1BQYWNrYWdlLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhYTc3NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvVlNQUGFja2FnZS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvY2FzZVNlbnNpdGl2ZVRlc3RfMS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9jYXNlU2Vuc2l0aXZlVGVzdF8xLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxNjdjZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvY2FzZVNlbnNpdGl2ZVRlc3RfMS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvY2FzZVNlbnNpdGl2ZVRlc3RfMi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9jYXNlU2Vuc2l0aXZlVGVzdF8yLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YmM1YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvY2FzZVNlbnNpdGl2ZVRlc3RfMi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvY3NhcnMuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9jc2Fycy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3ZjVkZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvY3NhcnMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvZml2ZUxpbmVzQXNCbG9jazAuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvZml2ZUxpbmVzQXNCbG9jazAuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzBhNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9maXZlTGluZXNBc0Jsb2NrMC5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2NzYXJzL2ludmFsaWRDc2FyVmVyc2lvbi5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2ZhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2NzYXJzL2ludmFsaWRDc2FyVmVyc2lvbi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uMi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9pbnZhbGlkQ3NhclZlcnNpb24yLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwMDI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uMi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uMy5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9pbnZhbGlkQ3NhclZlcnNpb24zLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5YTgwYgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uMy5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uNC5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9pbnZhbGlkQ3NhclZlcnNpb240LmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjY2I0NAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uNC5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uNS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9pbnZhbGlkQ3NhclZlcnNpb241LmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyOTExMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvaW52YWxpZENzYXJWZXJzaW9uNS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlMS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9sb25nTmFtZXNJblRvc2NhTWV0YUZpbGUxLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2MWJmZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlMS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlMi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9sb25nTmFtZXNJblRvc2NhTWV0YUZpbGUyLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZmJkOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlMi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlMy5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9sb25nTmFtZXNJblRvc2NhTWV0YUZpbGUzLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmZGY2YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlMy5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlNC5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9sb25nTmFtZXNJblRvc2NhTWV0YUZpbGU0LmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYTA1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlNC5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlNS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9sb25nTmFtZXNJblRvc2NhTWV0YUZpbGU1LmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhM2ZiOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbG9uZ05hbWVzSW5Ub3NjYU1ldGFGaWxlNS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbWlzc2luZ0VudHJ5RGVmaW50aW9uUGFpci5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9taXNzaW5nRW50cnlEZWZpbnRpb25QYWlyLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhNThiYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbWlzc2luZ0VudHJ5RGVmaW50aW9uUGFpci5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbWlzc2luZ09uZUxpbmVJblRvc2NhTWV0YS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9taXNzaW5nT25lTGluZUluVG9zY2FNZXRhLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5NDljZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbWlzc2luZ09uZUxpbmVJblRvc2NhTWV0YS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9ja192Zi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9tb2NrX3ZmLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzN2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9ja192Zi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9ja192ZjIuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9ja192ZjIuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFhNjVlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9tb2NrX3ZmMi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9yZVRoYW5PbmVNZXRhRmlsZS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9tb3JlVGhhbk9uZU1ldGFGaWxlLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0YWRhMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9yZVRoYW5PbmVNZXRhRmlsZS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9yZVRoZW5PbmVZYW1sRmlsZS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9tb3JlVGhlbk9uZVlhbWxGaWxlLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxNWM2MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbW9yZVRoZW5PbmVZYW1sRmlsZS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9DU0FSVmVyc2lvbi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9ub0NTQVJWZXJzaW9uLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhMjFjMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9DU0FSVmVyc2lvbi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9DcmVhdGVkQnlWYWx1ZS5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9ub0NyZWF0ZWRCeVZhbHVlLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwOGIxOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9DcmVhdGVkQnlWYWx1ZS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9FbnRyeURlZmluaXRpb25zVmFsdWUuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9FbnRyeURlZmluaXRpb25zVmFsdWUuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2EwZThmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9ub0VudHJ5RGVmaW5pdGlvbnNWYWx1ZS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9OZXdMaW5lQWZ0ZXJCTG9jazAuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9OZXdMaW5lQWZ0ZXJCTG9jazAuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM3ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9ub05ld0xpbmVBZnRlckJMb2NrMC5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm9UT1NDQU1ldGFGaWxlVmVyc2lvblZhbHVlLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2NzYXJzL25vVE9TQ0FNZXRhRmlsZVZlcnNpb25WYWx1ZS5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjRkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2NzYXJzL25vVE9TQ0FNZXRhRmlsZVZlcnNpb25WYWx1ZS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm90Q29udGFpbllhbWxBbmRNZXRhRmlsZXMuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm90Q29udGFpbllhbWxBbmRNZXRhRmlsZXMuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA1OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9ub3RDb250YWluWWFtbEFuZE1ldGFGaWxlcy5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvbm90Q29udGFpbllhbWxGaWxlLmNzYXIgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2NzYXJzL25vdENvbnRhaW5ZYW1sRmlsZS5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2MyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2NzYXJzL25vdENvbnRhaW5ZYW1sRmlsZS5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvc29tZVZhbHVlQWZ0ZXJCbG9jazAuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvc29tZVZhbHVlQWZ0ZXJCbG9jazAuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjAwYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy9zb21lVmFsdWVBZnRlckJsb2NrMC5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdG9zY2FGb2xkZXJOb3RFeGlzdHMuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdG9zY2FGb2xkZXJOb3RFeGlzdHMuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E3ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy90b3NjYUZvbGRlck5vdEV4aXN0cy5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdG9zY2FNZXRhRmlsZU5vdEV4aXN0cy5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy90b3NjYU1ldGFGaWxlTm90RXhpc3RzLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlNzE3OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdG9zY2FNZXRhRmlsZU5vdEV4aXN0cy5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdG9zY2FNZXRhT3V0c2lkZVRoZUZvbGRlci5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy90b3NjYU1ldGFPdXRzaWRlVGhlRm9sZGVyLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkNjk4NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdG9zY2FNZXRhT3V0c2lkZVRoZUZvbGRlci5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdW5kZXJzY29yZUluc3RlYWRPZkRhc2guY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdW5kZXJzY29yZUluc3RlYWRPZkRhc2guY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE3ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy91bmRlcnNjb3JlSW5zdGVhZE9mRGFzaC5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdmFsaWRDc2FyVmVyc2lvbi5jc2FyIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy92YWxpZENzYXJWZXJzaW9uLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhYzZlMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdmFsaWRDc2FyVmVyc2lvbi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdmFsaWRfdmYuY3NhciBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdmFsaWRfdmYuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWJmMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy92YWxpZF92Zi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdmFsaWRfdmZfemlwLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvY3NhcnMvdmFsaWRfdmZfemlwLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjkyMmFlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9jc2Fycy92YWxpZF92Zl96aXAuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY2F0ZWdvcnkvZW1wdHlfY2F0ZWdvcnkuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY2F0ZWdvcnkvZW1wdHlfY2F0ZWdvcnkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2UxZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9jYXRlZ29yeS9lbXB0eV9jYXRlZ29yeS5qc29uCkBAIC0wLDAgKzEsMjIgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfY2F0ZWdvcnkueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJhZG1pbmlkIiwKKyAgIm5hbWUiOiAidG9zY2Eubm9kZXMuZW1wdHlfY2F0ZWdvcnkiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLCAKKyAgInRhZ3MiOiBbCisgICAgInRvc2NhLm5vZGVzLmVtcHR5X2NhdGVnb3J5IgorICBdLAorICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9jYXRlZ29yeS9ub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X2NhdGVnb3J5LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jYXRlZ29yeS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiNWFjOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jYXRlZ29yeS55bWwKQEAgLTAsMCArMSwxNiBAQAordG9zY2Eubm9kZXMubWlzc2luZ191c2VySWQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHNpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgIHZvbHVtZV9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc25hcHNob3RfaWQ6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICBjYXBhYmlsaXRpZXM6CisgICAgYXR0YWNobWVudDogCisgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9jYXRlZ29yeS9ub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X2NhdGVnb3J5LnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jYXRlZ29yeS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3Nzg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jYXRlZ29yeS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9jb250YWN0L2VtcHR5X2NvbnRhY3QuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY29udGFjdC9lbXB0eV9jb250YWN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwNDNmNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY29udGFjdC9lbXB0eV9jb250YWN0Lmpzb24KQEAgLTAsMCArMSwyMiBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jb250YWN0LnltbCIsCisgICJjb250YWN0SWQiOiAiIiwKKyAgIm5hbWUiOiAidG9zY2Eubm9kZXMuZW1wdHlfY29udGFjdCIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2VydmVyLWxvY2FsIGJsb2NrIHN0b3JhZ2UgZGV2aWNlIChpLmUuLCBub3Qgc2hhcmVkKSBvZmZlcmluZyBldmVubHkgc2l6ZWQgYmxvY2tzIG9mIGRhdGEgZnJvbSB3aGljaCByYXcgc3RvcmFnZSB2b2x1bWVzIGNhbiBiZSBjcmVhdGVkLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwgCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5lbXB0eV9jb250YWN0IgorICBdLAorICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9jb250YWN0L25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfY29udGFjdC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2NvbnRhY3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jb250YWN0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDljMTExCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9jb250YWN0L25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfY29udGFjdC55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLm1pc3NpbmdfY29udGFjdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgc2l6ZTogCisgICAgICAgIHR5cGU6IHNjYWxhci11bml0LnNpemUKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxIE1CCisgICAgICB2b2x1bWVfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHNuYXBzaG90X2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYXR0YWNobWVudDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2NvbnRhY3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jb250YWN0LnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfY29udGFjdC9ub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X2NvbnRhY3QuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTBmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2NvbnRhY3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9jb250YWN0LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2Rlc2MvZW1wdHlfZGVzYy5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9kZXNjL2VtcHR5X2Rlc2MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWE0YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9kZXNjL2VtcHR5X2Rlc2MuanNvbgpAQCAtMCwwICsxLDIyIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X2Rlc2MueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJhZG1pbmlkIiwKKyAgIm5hbWUiOiAidG9zY2Eubm9kZXMuZW1wdHlfZGVzYyIsCisgICJkZXNjcmlwdGlvbiI6ICIiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwgCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5lbXB0eV9kZXNjIgorICBdLAorICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9kZXNjL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfZGVzYy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2Rlc2Mvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9kZXNjLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI1YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9kZXNjL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfZGVzYy55bWwKQEAgLTAsMCArMSwxNiBAQAordG9zY2Eubm9kZXMubWlzc2luZ191c2VySWQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHNpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgIHZvbHVtZV9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc25hcHNob3RfaWQ6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICBjYXBhYmlsaXRpZXM6CisgICAgYXR0YWNobWVudDogCisgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9kZXNjL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfZGVzYy56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2Rlc2Mvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9kZXNjLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA1YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9kZXNjL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfZGVzYy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9pY29uL2VtcHR5X2ljb24uanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfaWNvbi9lbXB0eV9pY29uLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5ODBjZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfaWNvbi9lbXB0eV9pY29uLmpzb24KQEAgLTAsMCArMSwyMiBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9pY29uLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAidG9zY2Eubm9kZXMuZW1wdHlfaWNvbiIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2VydmVyLWxvY2FsIGJsb2NrIHN0b3JhZ2UgZGV2aWNlIChpLmUuLCBub3Qgc2hhcmVkKSBvZmZlcmluZyBldmVubHkgc2l6ZWQgYmxvY2tzIG9mIGRhdGEgZnJvbSB3aGljaCByYXcgc3RvcmFnZSB2b2x1bWVzIGNhbiBiZSBjcmVhdGVkLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwgCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5lbXB0eV9pY29uIgorICBdLAorICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9pY29uL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfaWNvbi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2ljb24vbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9pY29uLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI1YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9pY29uL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfaWNvbi55bWwKQEAgLTAsMCArMSwxNiBAQAordG9zY2Eubm9kZXMubWlzc2luZ191c2VySWQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHNpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgIHZvbHVtZV9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc25hcHNob3RfaWQ6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICBjYXBhYmlsaXRpZXM6CisgICAgYXR0YWNobWVudDogCisgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9pY29uL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfaWNvbi56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X2ljb24vbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9pY29uLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTAwNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9pY29uL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfaWNvbi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9wYXlsb2FkTmFtZS9lbXB0eV9wYXlsb2FkTmFtZS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9wYXlsb2FkTmFtZS9lbXB0eV9wYXlsb2FkTmFtZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDZjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X3BheWxvYWROYW1lL2VtcHR5X3BheWxvYWROYW1lLmpzb24KQEAgLTAsMCArMSwyMiBAQAoreworICAicGF5bG9hZE5hbWUiOiAiIiwKKyAgImNvbnRhY3RJZCI6ICJhZG1pbmlkIiwKKyAgIm5hbWUiOiAidG9zY2Eubm9kZXMuZW1wdHlfcGF5bG9hZE5hbWUiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLCAKKyAgInRhZ3MiOiBbCisgICAgInRvc2NhLm5vZGVzLmVtcHR5X3BheWxvYWROYW1lIgorICBdLAorICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9wYXlsb2FkTmFtZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X3BheWxvYWROYW1lLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfcGF5bG9hZE5hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9wYXlsb2FkTmFtZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiNWFjOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfcGF5bG9hZE5hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9wYXlsb2FkTmFtZS55bWwKQEAgLTAsMCArMSwxNiBAQAordG9zY2Eubm9kZXMubWlzc2luZ191c2VySWQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHNpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgIHZvbHVtZV9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc25hcHNob3RfaWQ6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICBjYXBhYmlsaXRpZXM6CisgICAgYXR0YWNobWVudDogCisgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9wYXlsb2FkTmFtZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X3BheWxvYWROYW1lLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfcGF5bG9hZE5hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9wYXlsb2FkTmFtZS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZDJkZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfcGF5bG9hZE5hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9wYXlsb2FkTmFtZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9yZXNvdXJjZV9uYW1lL2VtcHR5X3Jlc291cmNlX25hbWUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfcmVzb3VyY2VfbmFtZS9lbXB0eV9yZXNvdXJjZV9uYW1lLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmOGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfcmVzb3VyY2VfbmFtZS9lbXB0eV9yZXNvdXJjZV9uYW1lLmpzb24KQEAgLTAsMCArMSwxNiBAQAoreworCSJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X3Jlc291cmNlX25hbWUueW1sIiwKKwkiY29udGFjdElkIjogImFkbWluaWQiLAorCSJuYW1lIjogIiIsCisJImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBzZXJ2ZXItbG9jYWwgYmxvY2sgc3RvcmFnZSBkZXZpY2UgKGkuZS4sIG5vdCBzaGFyZWQpIG9mZmVyaW5nIGV2ZW5seSBzaXplZCBibG9ja3Mgb2YgZGF0YSBmcm9tIHdoaWNoIHJhdyBzdG9yYWdlIHZvbHVtZXMgY2FuIGJlIGNyZWF0ZWQuIiwKKwkicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisJCX1dCisJfV0sCisJInRhZ3MiOiBbImVtcHR5X3Jlc291cmNlX25hbWUiXSwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X3Jlc291cmNlX25hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9yZXNvdXJjZV9uYW1lLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfcmVzb3VyY2VfbmFtZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X3Jlc291cmNlX25hbWUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDBjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X3Jlc291cmNlX25hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9yZXNvdXJjZV9uYW1lLnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubWlzc2luZ191c2VySWQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHNpemU6IAorICAgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgICAgdm9sdW1lX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzbmFwc2hvdF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9yZXNvdXJjZV9uYW1lL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfcmVzb3VyY2VfbmFtZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X3Jlc291cmNlX25hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV9yZXNvdXJjZV9uYW1lLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDBhNzRhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV9yZXNvdXJjZV9uYW1lL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfcmVzb3VyY2VfbmFtZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV90YWcvZW1wdHlfdGFnLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X3RhZy9lbXB0eV90YWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDI4YmFhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV90YWcvZW1wdHlfdGFnLmpzb24KQEAgLTAsMCArMSwxNiBAQAoreworCSJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X3RhZy55bWwiLAorCSJjb250YWN0SWQiOiAiYWRtaW5pZCIsCisJIm5hbWUiOiAidG9zY2Eubm9kZXMuZW1wdHlfdGFnIiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsiIl0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV90YWcvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV90YWcueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV90YWcvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV90YWcueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDBjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2VtcHR5X3RhZy9ub3JtYXRpdmUtdHlwZXMtbmV3LWVtcHR5X3RhZy55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLm1pc3NpbmdfdXNlcklkOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBzaXplOiAKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEgTUIKKyAgICAgIHZvbHVtZV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc25hcHNob3RfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhdHRhY2htZW50OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfdGFnL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfdGFnLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvZW1wdHlfdGFnL25vcm1hdGl2ZS10eXBlcy1uZXctZW1wdHlfdGFnLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc1ZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9lbXB0eV90YWcvbm9ybWF0aXZlLXR5cGVzLW5ldy1lbXB0eV90YWcuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0IF9tdWx0aXBsZV90YWdzL2ltcG9ydCBfbXVsdGlwbGVfdGFncy5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnQgX211bHRpcGxlX3RhZ3MvaW1wb3J0IF9tdWx0aXBsZV90YWdzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzNjE4MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0IF9tdWx0aXBsZV90YWdzL2ltcG9ydCBfbXVsdGlwbGVfdGFncy5qc29uCkBAIC0wLDAgKzEsMTggQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnQgX211bHRpcGxlX3RhZ3MueW1sIiwKKwkiY29udGFjdElkIjogImFkbWluaWQiLAorCSJuYW1lIjogInRvc2NhLm5vZGVzLmltcG9ydCBfbXVsdGlwbGVfdGFncyIsCisJImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBzZXJ2ZXItbG9jYWwgYmxvY2sgc3RvcmFnZSBkZXZpY2UgKGkuZS4sIG5vdCBzaGFyZWQpIG9mZmVyaW5nIGV2ZW5seSBzaXplZCBibG9ja3Mgb2YgZGF0YSBmcm9tIHdoaWNoIHJhdyBzdG9yYWdlIHZvbHVtZXMgY2FuIGJlIGNyZWF0ZWQuIiwKKwkicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisJCX1dCisJfV0sCisJInRhZ3MiOiBbInRvc2NhLm5vZGVzLmltcG9ydCBfbXVsdGlwbGVfdGFncyIsCisJImltcG9ydCBfbXVsdGlwbGVfdGFncyIsCisJImltcG9ydCBfbXVsdGlwbGVfdGFnczIiXSwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydCBfbXVsdGlwbGVfdGFncy9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydCBfbXVsdGlwbGVfdGFncy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydCBfbXVsdGlwbGVfdGFncy9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydCBfbXVsdGlwbGVfdGFncy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiNWFjOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0IF9tdWx0aXBsZV90YWdzL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0IF9tdWx0aXBsZV90YWdzLnltbApAQCAtMCwwICsxLDE2IEBACit0b3NjYS5ub2Rlcy5taXNzaW5nX3VzZXJJZDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgIHByb3BlcnRpZXM6CisgICAgc2l6ZTogCisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxIE1CCisgICAgdm9sdW1lX2lkOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBzbmFwc2hvdF9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgIGNhcGFiaWxpdGllczoKKyAgICBhdHRhY2htZW50OiAKKyAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydCBfbXVsdGlwbGVfdGFncy9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydCBfbXVsdGlwbGVfdGFncy56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydCBfbXVsdGlwbGVfdGFncy9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydCBfbXVsdGlwbGVfdGFncy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlMWZhYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0IF9tdWx0aXBsZV90YWdzL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0IF9tdWx0aXBsZV90YWdzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3QvaW1wb3J0UmVzb3VyY2U0dGVzdC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0L2ltcG9ydFJlc291cmNlNHRlc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmE0YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0L2ltcG9ydFJlc291cmNlNHRlc3QuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdC55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJpbXBvcnRSZXNvdXJjZTR0ZXN0Il0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0L25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2U2YWYzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0L25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdC55bWwKQEAgLTAsMCArMSwzMCBAQAor77u/dG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLmltcG9ydFJlc291cmNlNHRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBOb2RlIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgTm9kZSBUeXBlcyBkZXJpdmUgZnJvbQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN0YXRlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBmZWF0dXJlMjogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkZXBlbmRlbmN5MiA6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5pbXBvcnRSZXNvdXJjZTR0ZXN0IAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWyAwLCBVTkJPVU5ERUQgXQorICAgIHByb3BlcnRpZXM6CisgICAgICByb290X3Bhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cyAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdC9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3QuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0L25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2OTQyOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdC9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3QuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdENQL2ltcG9ydFJlc291cmNlNHRlc3RDUC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0Q1AvaW1wb3J0UmVzb3VyY2U0dGVzdENQLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3ZDhhMgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdENQL2ltcG9ydFJlc291cmNlNHRlc3RDUC5qc29uCkBAIC0wLDAgKzEsMTcgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0Q1AueW1sIiwKKwkiY29udGFjdElkIjogImpoMDAwMyIsCisJIm5hbWUiOiAiaW1wb3J0UmVzb3VyY2U0dGVzdCIsCisJImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsiaW1wb3J0UmVzb3VyY2U0dGVzdCJdLAorCSJyZXNvdXJjZVR5cGUiIDogIlZGQyIsCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0Q1Avbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0Q1AueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0Q1Avbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0Q1AueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGNlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RDUC9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RDUC55bWwKQEAgLTAsMCArMSwzMCBAQAor77u/dG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLkNQLmltcG9ydFJlc291cmNlNHRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBOb2RlIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgTm9kZSBUeXBlcyBkZXJpdmUgZnJvbQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN0YXRlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBmZWF0dXJlMjogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkZXBlbmRlbmN5MiA6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5pbXBvcnRSZXNvdXJjZTR0ZXN0IAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWyAwLCBVTkJPVU5ERUQgXQorICAgIHByb3BlcnRpZXM6CisgICAgICByb290X3Bhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cyAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdENQL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdENQLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdENQL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdENQLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTc3Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0Q1Avbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0Q1AuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2UvaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2UuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2UvaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTE0Y2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0TWlzc2luZ05hbWVTcGFjZS9pbXBvcnRSZXNvdXJjZTR0ZXN0TWlzc2luZ05hbWVTcGFjZS5qc29uCkBAIC0wLDAgKzEsMTcgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0TWlzc2luZ05hbWVTcGFjZS55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJpbXBvcnRSZXNvdXJjZTR0ZXN0Il0sCisJInJlc291cmNlVHlwZSIgOiAiVkZDIiwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RNaXNzaW5nTmFtZVNwYWNlL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2UueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0TWlzc2luZ05hbWVTcGFjZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RNaXNzaW5nTmFtZVNwYWNlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTNlYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0TWlzc2luZ05hbWVTcGFjZS9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RNaXNzaW5nTmFtZVNwYWNlLnltbApAQCAtMCwwICsxLDMwIEBACivvu790b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAudmZjLmltcG9ydFJlc291cmNlNHRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBOb2RlIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgTm9kZSBUeXBlcyBkZXJpdmUgZnJvbQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN0YXRlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBmZWF0dXJlMjogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkZXBlbmRlbmN5MiA6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5pbXBvcnRSZXNvdXJjZTR0ZXN0IAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWyAwLCBVTkJPVU5ERUQgXQorICAgIHByb3BlcnRpZXM6CisgICAgICByb290X3Bhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cyAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2Uvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0TWlzc2luZ05hbWVTcGFjZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RNaXNzaW5nTmFtZVNwYWNlL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2UuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjBjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RNaXNzaW5nTmFtZVNwYWNlL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdE1pc3NpbmdOYW1lU3BhY2UuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVua25vd24vaW1wb3J0UmVzb3VyY2U0dGVzdFVua25vd24uanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVua25vd24vaW1wb3J0UmVzb3VyY2U0dGVzdFVua25vd24uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU5ZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VW5rbm93bi9pbXBvcnRSZXNvdXJjZTR0ZXN0VW5rbm93bi5qc29uCkBAIC0wLDAgKzEsMTcgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VW5rbm93bi55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJpbXBvcnRSZXNvdXJjZTR0ZXN0Il0sCisJInJlc291cmNlVHlwZSIgOiAiVkZDIiwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVbmtub3duL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFVua25vd24ueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VW5rbm93bi9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVbmtub3duLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTVhNjFhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VW5rbm93bi9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVbmtub3duLnltbApAQCAtMCwwICsxLDMwIEBACivvu790b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuVW5rbm93bi5pbXBvcnRSZXNvdXJjZTR0ZXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0EgTm9kZSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIE5vZGUgVHlwZXMgZGVyaXZlIGZyb20KKyAgICBhdHRyaWJ1dGVzOgorICAgICAgdG9zY2FfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdG9zY2FfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdGF0ZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgZmVhdHVyZTI6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gZGVwZW5kZW5jeTIgOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuaW1wb3J0UmVzb3VyY2U0dGVzdCAKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgMCwgVU5CT1VOREVEIF0KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcm9vdF9wYXNzd29yZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBvcHRpb25hbCByb290IHBhc3N3b3JkIGZvciB0aGUgREJNUyBzZXJ2aWNlCisgICAgICBwb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIHBvcnQgdGhlIERCTVMgc2VydmljZSB3aWxsIGxpc3RlbiB0byBmb3IgZGF0YSBhbmQgcmVxdWVzdHMgCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVbmtub3duL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFVua25vd24uemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VW5rbm93bi9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVbmtub3duLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I4MWMzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VW5rbm93bi9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVbmtub3duLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVZlbmRvck5hbWVBbmRDYXRlZ29yeS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlVmVuZG9yTmFtZUFuZENhdGVnb3J5L2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTlhZmZlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlVmVuZG9yTmFtZUFuZENhdGVnb3J5L2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVZlbmRvck5hbWVBbmRDYXRlZ29yeS55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiTmV0d29yayBMMi0zIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiUm91dGVyIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJpbXBvcnRSZXNvdXJjZTR0ZXN0Il0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NhYWFhYWFhYWFhYWFhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlVmVuZG9yTmFtZUFuZENhdGVnb3J5LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVZlbmRvck5hbWVBbmRDYXRlZ29yeS9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDg4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlVmVuZG9yTmFtZUFuZENhdGVnb3J5LnltbApAQCAtMCwwICsxLDEyIEBACivvu790b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuaW1wb3J0UmVzb3VyY2U0dGVzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogdXBkYXRlIHVwZGF0ZQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN0YXRlOgorICAgICAgICB0eXBlOiBzdHJpbmcKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVZlbmRvck5hbWVBbmRDYXRlZ29yeS9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlVmVuZG9yTmFtZUFuZENhdGVnb3J5L25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVZlbmRvck5hbWVBbmRDYXRlZ29yeS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5MmExYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVZlbmRvck5hbWVBbmRDYXRlZ29yeS9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVWZW5kb3JOYW1lQW5kQ2F0ZWdvcnkuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFiODM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlV2l0aG91dFJlcUNhcC9pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlV2l0aG91dFJlcUNhcC5qc29uCkBAIC0wLDAgKzEsMTcgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlV2l0aG91dFJlcUNhcC55bWwiLAorCSJjb250YWN0SWQiOiAiY3MwMDA0IiwKKwkibmFtZSI6ICJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLlVwZGF0ZSIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkidXBkYXRlZFRhZyJdLAorCSJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKwkidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC4zLjMzIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlV2l0aG91dFJlcUNhcC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVXaXRob3V0UmVxQ2FwL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODBlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVXaXRob3V0UmVxQ2FwL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAueW1sCkBAIC0wLDAgKzEsMTIgQEAKK++7v3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5pbXBvcnRSZXNvdXJjZTR0ZXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0EgTm9kZSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIE5vZGUgVHlwZXMgZGVyaXZlIGZyb20KKyAgICBhdHRyaWJ1dGVzOgorICAgICAgdG9zY2FfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdG9zY2FfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdGF0ZToKKyAgICAgICAgdHlwZTogc3RyaW5nCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVXaXRob3V0UmVxQ2FwL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFVwZGF0ZVdpdGhvdXRSZXFDYXAuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlV2l0aG91dFJlcUNhcC9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVXaXRob3V0UmVxQ2FwLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA1ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VXBkYXRlV2l0aG91dFJlcUNhcC9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RVcGRhdGVXaXRob3V0UmVxQ2FwLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWRi9pbXBvcnRSZXNvdXJjZTR0ZXN0VkYuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGL2ltcG9ydFJlc291cmNlNHRlc3RWRi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmJhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWRi9pbXBvcnRSZXNvdXJjZTR0ZXN0VkYuanNvbgpAQCAtMCwwICsxLDE3IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZGLnltbCIsCisJImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorCSJuYW1lIjogImltcG9ydFJlc291cmNlNHRlc3QiLAorCSJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKwkicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisJCX1dCisJfV0sCisJInRhZ3MiOiBbImltcG9ydFJlc291cmNlNHRlc3QiXSwKKwkicmVzb3VyY2VUeXBlIiA6ICJWRkMiLAorCSJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKwkidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZGLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZGLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc5YWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VkYvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VkYueW1sCkBAIC0wLDAgKzEsMzAgQEAKK++7v3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Ri5pbXBvcnRSZXNvdXJjZTR0ZXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0EgTm9kZSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIE5vZGUgVHlwZXMgZGVyaXZlIGZyb20KKyAgICBhdHRyaWJ1dGVzOgorICAgICAgdG9zY2FfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdG9zY2FfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdGF0ZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgZmVhdHVyZTI6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gZGVwZW5kZW5jeTIgOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuaW1wb3J0UmVzb3VyY2U0dGVzdCAKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgMCwgVU5CT1VOREVEIF0KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcm9vdF9wYXNzd29yZDogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBvcHRpb25hbCByb290IHBhc3N3b3JkIGZvciB0aGUgREJNUyBzZXJ2aWNlCisgICAgICBwb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIHBvcnQgdGhlIERCTVMgc2VydmljZSB3aWxsIGxpc3RlbiB0byBmb3IgZGF0YSBhbmQgcmVxdWVzdHMgCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWRi9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RWRi56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWRi9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RWRi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjNjUyZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZGLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWRkMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGQy5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VkZDL2ltcG9ydFJlc291cmNlNHRlc3RWRkMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWUyZTMyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VkZDL2ltcG9ydFJlc291cmNlNHRlc3RWRkMuanNvbgpAQCAtMCwwICsxLDE3IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZGQy55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJpbXBvcnRSZXNvdXJjZTR0ZXN0Il0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJyZXNvdXJjZVR5cGUiIDogIlZGQyIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWRkMvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VkZDLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGQy9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RWRkMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjM0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWRkMvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VkZDLnltbApAQCAtMCwwICsxLDMwIEBACivvu790b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuVkZDLmltcG9ydFJlc291cmNlNHRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBOb2RlIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgTm9kZSBUeXBlcyBkZXJpdmUgZnJvbQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN0YXRlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBmZWF0dXJlMjogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkZXBlbmRlbmN5MiA6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5pbXBvcnRSZXNvdXJjZTR0ZXN0IAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWyAwLCBVTkJPVU5ERUQgXQorICAgIHByb3BlcnRpZXM6CisgICAgICByb290X3Bhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cyAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGQy9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RWRkMuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VkZDL25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZGQy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhODA5OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZGQy9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RWRkMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZML2ltcG9ydFJlc291cmNlNHRlc3RWTC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0VkwvaW1wb3J0UmVzb3VyY2U0dGVzdFZMLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4NTMwYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZML2ltcG9ydFJlc291cmNlNHRlc3RWTC5qc29uCkBAIC0wLDAgKzEsMTcgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VkwueW1sIiwKKwkiY29udGFjdElkIjogImpoMDAwMyIsCisJInJlc291cmNlVHlwZSIgOiAiVkZDIiwKKwkibmFtZSI6ICJpbXBvcnRSZXNvdXJjZTR0ZXN0IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJpbXBvcnRSZXNvdXJjZTR0ZXN0Il0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0Vkwvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VkwueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0Vkwvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VkwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODg4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydFJlc291cmNlNHRlc3RWTC9ub3JtYXRpdmUtdHlwZXMtbmV3LWltcG9ydFJlc291cmNlNHRlc3RWTC55bWwKQEAgLTAsMCArMSwzMCBAQAor77u/dG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLlZsLmltcG9ydFJlc291cmNlNHRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBOb2RlIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgTm9kZSBUeXBlcyBkZXJpdmUgZnJvbQorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0b3NjYV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0b3NjYV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN0YXRlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBmZWF0dXJlMjogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkZXBlbmRlbmN5MiA6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5pbXBvcnRSZXNvdXJjZTR0ZXN0IAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWyAwLCBVTkJPVU5ERUQgXQorICAgIHByb3BlcnRpZXM6CisgICAgICByb290X3Bhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cyAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZML25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZMLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0UmVzb3VyY2U0dGVzdFZML25vcm1hdGl2ZS10eXBlcy1uZXctaW1wb3J0UmVzb3VyY2U0dGVzdFZMLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTFhMjhiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRSZXNvdXJjZTR0ZXN0Vkwvbm9ybWF0aXZlLXR5cGVzLW5ldy1pbXBvcnRSZXNvdXJjZTR0ZXN0VkwuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0X2NhcGFiaWxpdGllc1R5cGVzL2NhcGFiaWxpdHlUeXBlcy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydF9jYXBhYmlsaXRpZXNUeXBlcy9jYXBhYmlsaXR5VHlwZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmUyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydF9jYXBhYmlsaXRpZXNUeXBlcy9jYXBhYmlsaXR5VHlwZXMueW1sCkBAIC0wLDAgKzEsMTQxIEBACit0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdDogCisgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0Egcm9vdCBDYXBhYmlsaXR5IFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgQ2FwYWJpbGl0eSBUeXBlcyBkZXJpdmUgZnJvbQordG9zY2EuY2FwYWJpbGl0aWVzLk5vZGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKK3Rvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXI6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBudW1fY3B1czogCisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEKKyAgICBjcHVfZnJlcXVlbmN5OgorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuZnJlcXVlbmN5CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAuMSBHSHoKKyAgICBkaXNrX3NpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwIE1CCisgICAgbWVtX3NpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwIE1CCit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBwcm90b2NvbDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVmYXVsdDogdGNwCisgICAgcG9ydDoKKyAgICAgIHR5cGU6IFBvcnREZWYKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHNlY3VyZToKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgdXJsX3BhdGg6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBwb3J0X25hbWU6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBuZXR3b3JrX25hbWU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZSAKKyAgICAgIGRlZmF1bHQ6IFBSSVZBVEUKKyAgICBpbml0aWF0b3I6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlZmF1bHQ6IHNvdXJjZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbIHNvdXJjZSwgdGFyZ2V0LCBwZWVyIF0KKyAgICBwb3J0czoKKyAgICAgIHR5cGU6IG1hcAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBtaW5fbGVuZ3RoOiAxCisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IFBvcnRTcGVjCisgIGF0dHJpYnV0ZXM6CisgICAgaXBfYWRkcmVzczoKKyAgICAgIHR5cGU6IHN0cmluZwordG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LlB1YmxpYzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgcHJvcGVydGllczoKKyAgICAjIENoYW5nZSB0aGUgZGVmYXVsdCBuZXR3b3JrX25hbWUgdG8gdXNlIHRoZSBmaXJzdCBwdWJsaWMgbmV0d29yayBmb3VuZAorICAgIG5ldHdvcmtfbmFtZTogUFVCTElDCisgICAgZmxvYXRpbmc6CisgICAgICBkZXNjcmlwdGlvbjogPiAKKyAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHB1YmxpYyBhZGRyZXNzIHNob3VsZCBiZSBhbGxvY2F0ZWQgZnJvbSBhIHBvb2wgb2YgZmxvYXRpbmcgSVBzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yay4KKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICBzdGF0dXM6IGV4cGVyaW1lbnRhbAorICAgIGRuc19uYW1lOgorICAgICAgZGVzY3JpcHRpb246IFRoZSBvcHRpb25hbCBuYW1lIHRvIHJlZ2lzdGVyIHdpdGggRE5TIAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UgICAgCisgICAgICBzdGF0dXM6IGV4cGVyaW1lbnRhbAordG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAjIENoYW5nZSBFbmRwb2ludCBzZWN1cmUgaW5kaWNhdG9yIHRvIHRydWUgZnJvbSBpdHMgZGVmYXVsdCBvZiBmYWxzZQorICBwcm9wZXJ0aWVzOgorICAgIHNlY3VyZTogdHJ1ZQordG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkRhdGFiYXNlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludCAKK3Rvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW06CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBhcmNoaXRlY3R1cmU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZSAKKyAgICB0eXBlOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBkaXN0cmlidXRpb246CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHZlcnNpb246CisgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICByZXF1aXJlZDogZmFsc2UKK3Rvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIG1pbl9pbnN0YW5jZXM6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBkZWZhdWx0OiAxCisgICAgbWF4X2luc3RhbmNlczoKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIGRlZmF1bHQ6IDEKKyAgICBkZWZhdWx0X2luc3RhbmNlczoKKyAgICAgIHR5cGU6IGludGVnZXIKK3Rvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisKKwordG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lci5Eb2NrZXI6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICBwcm9wZXJ0aWVzOgorICAgIHZlcnNpb246CisgICAgICB0eXBlOiBsaXN0CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGVudHJ5X3NjaGVtYTogdmVyc2lvbgorICAgIHB1Ymxpc2hfYWxsOgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHB1Ymxpc2hfcG9ydHM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBlbnRyeV9zY2hlbWE6IFBvcnRTcGVjCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBleHBvc2VfcG9ydHM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBlbnRyeV9zY2hlbWE6IFBvcnRTcGVjCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICB2b2x1bWVzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydF9jYXBhYmlsaXRpZXNUeXBlcy9jYXBhYmlsaXR5VHlwZXMuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRfY2FwYWJpbGl0aWVzVHlwZXMvY2FwYWJpbGl0eVR5cGVzLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk0NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRfY2FwYWJpbGl0aWVzVHlwZXMvY2FwYWJpbGl0eVR5cGVzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydF9jYXBhYmlsaXRpZXNUeXBlcy9jYXBhYmlsaXR5VHlwZXNDaS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydF9jYXBhYmlsaXRpZXNUeXBlcy9jYXBhYmlsaXR5VHlwZXNDaS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwY2Q3NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvaW1wb3J0X2NhcGFiaWxpdGllc1R5cGVzL2NhcGFiaWxpdHlUeXBlc0NpLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydF9jYXBhYmlsaXRpZXNUeXBlcy9jYXBhYmlsaXR5VHlwZXNDaV9NaXNzaW5nRGVyaXZlZEZyb20ueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRfY2FwYWJpbGl0aWVzVHlwZXMvY2FwYWJpbGl0eVR5cGVzQ2lfTWlzc2luZ0Rlcml2ZWRGcm9tLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWZhYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRfY2FwYWJpbGl0aWVzVHlwZXMvY2FwYWJpbGl0eVR5cGVzQ2lfTWlzc2luZ0Rlcml2ZWRGcm9tLnltbApAQCAtMCwwICsxLDEzMiBAQAordG9zY2EuY2FwYWJpbGl0aWVzLlJvb3Q6IAorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIHJvb3QgQ2FwYWJpbGl0eSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIENhcGFiaWxpdHkgVHlwZXMgZGVyaXZlIGZyb20KK3Rvc2NhLmNhcGFiaWxpdGllcy5Ob2RlOgordG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcjoKKyAgcHJvcGVydGllczoKKyAgICBudW1fY3B1czogCisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEKKyAgICBjcHVfZnJlcXVlbmN5OgorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuZnJlcXVlbmN5CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAuMSBHSHoKKyAgICBkaXNrX3NpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwIE1CCisgICAgbWVtX3NpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwIE1CCit0b3NjYS5jYXBhYmlsaXRpZXMuVGVzdC5DaToKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludDoKKyAgcHJvcGVydGllczoKKyAgICBwcm90b2NvbDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVmYXVsdDogdGNwCisgICAgcG9ydDoKKyAgICAgIHR5cGU6IFBvcnREZWYKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHNlY3VyZToKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgdXJsX3BhdGg6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBwb3J0X25hbWU6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBuZXR3b3JrX25hbWU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZSAKKyAgICAgIGRlZmF1bHQ6IFBSSVZBVEUKKyAgICBpbml0aWF0b3I6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlZmF1bHQ6IHNvdXJjZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbIHNvdXJjZSwgdGFyZ2V0LCBwZWVyIF0KKyAgICBwb3J0czoKKyAgICAgIHR5cGU6IG1hcAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBtaW5fbGVuZ3RoOiAxCisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IFBvcnRTcGVjCisgIGF0dHJpYnV0ZXM6CisgICAgaXBfYWRkcmVzczoKKyAgICAgIHR5cGU6IHN0cmluZwordG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LlB1YmxpYzoKKyAgcHJvcGVydGllczoKKyAgICAjIENoYW5nZSB0aGUgZGVmYXVsdCBuZXR3b3JrX25hbWUgdG8gdXNlIHRoZSBmaXJzdCBwdWJsaWMgbmV0d29yayBmb3VuZAorICAgIG5ldHdvcmtfbmFtZTogUFVCTElDCisgICAgZmxvYXRpbmc6CisgICAgICBkZXNjcmlwdGlvbjogPiAKKyAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIHB1YmxpYyBhZGRyZXNzIHNob3VsZCBiZSBhbGxvY2F0ZWQgZnJvbSBhIHBvb2wgb2YgZmxvYXRpbmcgSVBzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0d29yay4KKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICBzdGF0dXM6IGV4cGVyaW1lbnRhbAorICAgIGRuc19uYW1lOgorICAgICAgZGVzY3JpcHRpb246IFRoZSBvcHRpb25hbCBuYW1lIHRvIHJlZ2lzdGVyIHdpdGggRE5TIAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UgICAgCisgICAgICBzdGF0dXM6IGV4cGVyaW1lbnRhbAordG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluOgorICAjIENoYW5nZSBFbmRwb2ludCBzZWN1cmUgaW5kaWNhdG9yIHRvIHRydWUgZnJvbSBpdHMgZGVmYXVsdCBvZiBmYWxzZQorICBwcm9wZXJ0aWVzOgorICAgIHNlY3VyZTogdHJ1ZQordG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkRhdGFiYXNlOgordG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbToKKyAgcHJvcGVydGllczoKKyAgICBhcmNoaXRlY3R1cmU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZSAKKyAgICB0eXBlOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBkaXN0cmlidXRpb246CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHZlcnNpb246CisgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICByZXF1aXJlZDogZmFsc2UKK3Rvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZToKKyAgcHJvcGVydGllczoKKyAgICBtaW5faW5zdGFuY2VzOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgZGVmYXVsdDogMQorICAgIG1heF9pbnN0YW5jZXM6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBkZWZhdWx0OiAxCisgICAgZGVmYXVsdF9pbnN0YW5jZXM6CisgICAgICB0eXBlOiBpbnRlZ2VyCit0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZToKKworCit0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLkRvY2tlcjoKKyAgcHJvcGVydGllczoKKyAgICB2ZXJzaW9uOgorICAgICAgdHlwZTogbGlzdAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBlbnRyeV9zY2hlbWE6IHZlcnNpb24KKyAgICBwdWJsaXNoX2FsbDoKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBwdWJsaXNoX3BvcnRzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOiBQb3J0U3BlYworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgZXhwb3NlX3BvcnRzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOiBQb3J0U3BlYworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdm9sdW1lczoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRfY2FwYWJpbGl0aWVzVHlwZXMvY2FwYWJpbGl0eVR5cGVzQ2lfV2l0aG91dFJvb3QueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9pbXBvcnRfY2FwYWJpbGl0aWVzVHlwZXMvY2FwYWJpbGl0eVR5cGVzQ2lfV2l0aG91dFJvb3QueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzdkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL2ltcG9ydF9jYXBhYmlsaXRpZXNUeXBlcy9jYXBhYmlsaXR5VHlwZXNDaV9XaXRob3V0Um9vdC55bWwKQEAgLTAsMCArMSwxNDEgQEAKK3Rvc2NhLmNhcGFiaWxpdGllcy5Ob2RlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290Cit0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisgIHByb3BlcnRpZXM6CisgICAgbnVtX2NwdXM6IAorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxCisgICAgY3B1X2ZyZXF1ZW5jeToKKyAgICAgIHR5cGU6IHNjYWxhci11bml0LmZyZXF1ZW5jeQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwLjEgR0h6CisgICAgZGlza19zaXplOiAKKyAgICAgIHR5cGU6IHNjYWxhci11bml0LnNpemUKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMCBNQgorICAgIG1lbV9zaXplOiAKKyAgICAgIHR5cGU6IHNjYWxhci11bml0LnNpemUKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMCBNQgordG9zY2EuY2FwYWJpbGl0aWVzLlRlc3QuQ2k6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHByb3RvY29sOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZWZhdWx0OiB0Y3AKKyAgICBwb3J0OgorICAgICAgdHlwZTogUG9ydERlZgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc2VjdXJlOgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICB1cmxfcGF0aDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHBvcnRfbmFtZTogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIG5ldHdvcmtfbmFtZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgICAgZGVmYXVsdDogUFJJVkFURQorICAgIGluaXRpYXRvcjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVmYXVsdDogc291cmNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgc291cmNlLCB0YXJnZXQsIHBlZXIgXQorICAgIHBvcnRzOgorICAgICAgdHlwZTogbWFwCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIG1pbl9sZW5ndGg6IDEKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogUG9ydFNwZWMKKyAgYXR0cmlidXRlczoKKyAgICBpcF9hZGRyZXNzOgorICAgICAgdHlwZTogc3RyaW5nCit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuUHVibGljOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICBwcm9wZXJ0aWVzOgorICAgICMgQ2hhbmdlIHRoZSBkZWZhdWx0IG5ldHdvcmtfbmFtZSB0byB1c2UgdGhlIGZpcnN0IHB1YmxpYyBuZXR3b3JrIGZvdW5kCisgICAgbmV0d29ya19uYW1lOiBQVUJMSUMKKyAgICBmbG9hdGluZzoKKyAgICAgIGRlc2NyaXB0aW9uOiA+IAorICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgcHVibGljIGFkZHJlc3Mgc2hvdWxkIGJlIGFsbG9jYXRlZCBmcm9tIGEgcG9vbCBvZiBmbG9hdGluZyBJUHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXR3b3JrLgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgIHN0YXR1czogZXhwZXJpbWVudGFsCisgICAgZG5zX25hbWU6CisgICAgICBkZXNjcmlwdGlvbjogVGhlIG9wdGlvbmFsIG5hbWUgdG8gcmVnaXN0ZXIgd2l0aCBETlMgCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZSAgICAKKyAgICAgIHN0YXR1czogZXhwZXJpbWVudGFsCit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW46CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICMgQ2hhbmdlIEVuZHBvaW50IHNlY3VyZSBpbmRpY2F0b3IgdG8gdHJ1ZSBmcm9tIGl0cyBkZWZhdWx0IG9mIGZhbHNlCisgIHByb3BlcnRpZXM6CisgICAgc2VjdXJlOiB0cnVlCit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuRGF0YWJhc2U6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50IAordG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIGFyY2hpdGVjdHVyZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgIHR5cGU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGRpc3RyaWJ1dGlvbjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdmVyc2lvbjoKKyAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgIHJlcXVpcmVkOiBmYWxzZQordG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisgIHByb3BlcnRpZXM6CisgICAgbWluX2luc3RhbmNlczoKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIGRlZmF1bHQ6IDEKKyAgICBtYXhfaW5zdGFuY2VzOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgZGVmYXVsdDogMQorICAgIGRlZmF1bHRfaW5zdGFuY2VzOgorICAgICAgdHlwZTogaW50ZWdlcgordG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKworCit0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLkRvY2tlcjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgIHByb3BlcnRpZXM6CisgICAgdmVyc2lvbjoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZW50cnlfc2NoZW1hOiB2ZXJzaW9uCisgICAgcHVibGlzaF9hbGw6CisgICAgICB0eXBlOiBib29sZWFuCisgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcHVibGlzaF9wb3J0czoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYTogUG9ydFNwZWMKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGV4cG9zZV9wb3J0czoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYTogUG9ydFNwZWMKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHZvbHVtZXM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBlbnRyeV9zY2hlbWE6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19jYXRlZ29yeS9taXNzaW5nX2NhdGVnb3J5Lmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfY2F0ZWdvcnkvbWlzc2luZ19jYXRlZ29yeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYTdkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfY2F0ZWdvcnkvbWlzc2luZ19jYXRlZ29yeS5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19jYXRlZ29yeS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogInRvc2NhLm5vZGVzLm1pc3NpbmdfY2F0ZWdvcnkiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsICAKKyAgInRhZ3MiOiBbCisgICAgInRvc2NhLm5vZGVzLm1pc3NpbmdfY2F0ZWdvcnkiCisgIF0sCisgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfY2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2NhdGVnb3J5LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19jYXRlZ29yeS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfY2F0ZWdvcnkueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDBjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfY2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2NhdGVnb3J5LnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubWlzc2luZ191c2VySWQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHNpemU6IAorICAgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgICAgdm9sdW1lX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzbmFwc2hvdF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2NhdGVnb3J5L25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19jYXRlZ29yeS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfY2F0ZWdvcnkvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2NhdGVnb3J5LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWEwMWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2NhdGVnb3J5L25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19jYXRlZ29yeS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2NvbnRhY3QvbWlzc2luZ19jb250YWN0Lmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfY29udGFjdC9taXNzaW5nX2NvbnRhY3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjNlNWFlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2NvbnRhY3QvbWlzc2luZ19jb250YWN0Lmpzb24KQEAgLTAsMCArMSwyMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2NvbnRhY3QueW1sIiwKKyAgIm5hbWUiOiAidG9zY2Eubm9kZXMubWlzc2luZ19jb250YWN0IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBzZXJ2ZXItbG9jYWwgYmxvY2sgc3RvcmFnZSBkZXZpY2UgKGkuZS4sIG5vdCBzaGFyZWQpIG9mZmVyaW5nIGV2ZW5seSBzaXplZCBibG9ja3Mgb2YgZGF0YSBmcm9tIHdoaWNoIHJhdyBzdG9yYWdlIHZvbHVtZXMgY2FuIGJlIGNyZWF0ZWQuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sICAKKyAgInRhZ3MiOiBbCisgICAgInRvc2NhLm5vZGVzLm1pc3NpbmdfY29udGFjdCIKKyAgXSwKKyAgInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19jb250YWN0L25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19jb250YWN0LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19jb250YWN0L25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19jb250YWN0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDljMTExCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2NvbnRhY3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2NvbnRhY3QueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5taXNzaW5nX2NvbnRhY3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHNpemU6IAorICAgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgICAgdm9sdW1lX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzbmFwc2hvdF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2NvbnRhY3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2NvbnRhY3QuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2NvbnRhY3Qvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2NvbnRhY3QuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDE0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfY29udGFjdC9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfY29udGFjdC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlcml2ZWRfZnJvbS9taXNzaW5nX2Rlcml2ZWRfZnJvbS5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlcml2ZWRfZnJvbS9taXNzaW5nX2Rlcml2ZWRfZnJvbS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTU1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfZGVyaXZlZF9mcm9tL21pc3NpbmdfZGVyaXZlZF9mcm9tLmpzb24KQEAgLTAsMCArMSwxNiBAQAoreworCSJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfZGVyaXZlZF9mcm9tLnltbCIsCisJImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorCSJuYW1lIjogInRvc2NhLm5vZGVzLm1pc3NpbmdfZGVyaXZlZF9mcm9tIiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsidG9zY2Eubm9kZXMubWlzc2luZ19kZXJpdmVkX2Zyb20iXSwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfZGVyaXZlZF9mcm9tL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19kZXJpdmVkX2Zyb20ueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlcml2ZWRfZnJvbS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfZGVyaXZlZF9mcm9tLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjA2OWVjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlcml2ZWRfZnJvbS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfZGVyaXZlZF9mcm9tLnltbApAQCAtMCwwICsxLDE1IEBACit0b3NjYS5ub2Rlcy5taXNzaW5nX3VzZXJJZDogIAorICBwcm9wZXJ0aWVzOgorICAgIHNpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgIHZvbHVtZV9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc25hcHNob3RfaWQ6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICBjYXBhYmlsaXRpZXM6CisgICAgYXR0YWNobWVudDogCisgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlcml2ZWRfZnJvbS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfZGVyaXZlZF9mcm9tLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19kZXJpdmVkX2Zyb20vbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2Rlcml2ZWRfZnJvbS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlM2Q0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19kZXJpdmVkX2Zyb20vbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2Rlcml2ZWRfZnJvbS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlc2MvbWlzc2luZ19kZXNjLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfZGVzYy9taXNzaW5nX2Rlc2MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWMzODk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlc2MvbWlzc2luZ19kZXNjLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworCSJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfZGVzYy55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJ0b3NjYS5ub2Rlcy5taXNzaW5nX2Rlc2MiLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsidG9zY2Eubm9kZXMubWlzc2luZ19kZXNjIl0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlc2Mvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2Rlc2MueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlc2Mvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2Rlc2MueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDBjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfZGVzYy9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfZGVzYy55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLm1pc3NpbmdfdXNlcklkOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBzaXplOiAKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEgTUIKKyAgICAgIHZvbHVtZV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc25hcHNob3RfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhdHRhY2htZW50OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19kZXNjL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19kZXNjLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19kZXNjL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19kZXNjLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDUxNzRkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2Rlc2Mvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2Rlc2MuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19pY29uL21pc3NpbmdfaWNvbi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2ljb24vbWlzc2luZ19pY29uLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5Yjc1NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19pY29uL21pc3NpbmdfaWNvbi5qc29uCkBAIC0wLDAgKzEsMTUgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2ljb24ueW1sIiwKKwkiY29udGFjdElkIjogImpoMDAwMyIsCisJIm5hbWUiOiAidG9zY2Eubm9kZXMubWlzc2luZ19pY29uIiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJ0b3NjYS5ub2Rlcy5taXNzaW5nX2ljb24iXSwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfaWNvbi9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfaWNvbi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfaWNvbi9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfaWNvbi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkMGM3MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19pY29uL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19pY29uLnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubWlzc2luZ191c2VySWQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHNpemU6IAorICAgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgICAgdm9sdW1lX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzbmFwc2hvdF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2ljb24vbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2ljb24uemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX2ljb24vbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX2ljb24uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDhlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfaWNvbi9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfaWNvbi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3BheWxvYWROYW1lL21pc3NpbmdfcGF5bG9hZE5hbWUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19wYXlsb2FkTmFtZS9taXNzaW5nX3BheWxvYWROYW1lLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkZjBmNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19wYXlsb2FkTmFtZS9taXNzaW5nX3BheWxvYWROYW1lLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJ0b3NjYS5ub2Rlcy5taXNzaW5nX3BheWxvYWROYW1lIiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsidG9zY2Eubm9kZXMubWlzc2luZ19wYXlsb2FkTmFtZSJdLAorCSJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKwkidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19wYXlsb2FkTmFtZS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfcGF5bG9hZE5hbWUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3BheWxvYWROYW1lL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19wYXlsb2FkTmFtZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkMGM3MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19wYXlsb2FkTmFtZS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfcGF5bG9hZE5hbWUueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5taXNzaW5nX3VzZXJJZDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgc2l6ZTogCisgICAgICAgIHR5cGU6IHNjYWxhci11bml0LnNpemUKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxIE1CCisgICAgICB2b2x1bWVfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHNuYXBzaG90X2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYXR0YWNobWVudDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfcGF5bG9hZE5hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3BheWxvYWROYW1lLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19wYXlsb2FkTmFtZS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfcGF5bG9hZE5hbWUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzIzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfcGF5bG9hZE5hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3BheWxvYWROYW1lLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfcmVzb3VyY2VfbmFtZS9taXNzaW5nX3Jlc291cmNlX25hbWUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19yZXNvdXJjZV9uYW1lL21pc3NpbmdfcmVzb3VyY2VfbmFtZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjdlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfcmVzb3VyY2VfbmFtZS9taXNzaW5nX3Jlc291cmNlX25hbWUuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19yZXNvdXJjZV9uYW1lLnltbCIsCisJImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorCSJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2VydmVyLWxvY2FsIGJsb2NrIHN0b3JhZ2UgZGV2aWNlIChpLmUuLCBub3Qgc2hhcmVkKSBvZmZlcmluZyBldmVubHkgc2l6ZWQgYmxvY2tzIG9mIGRhdGEgZnJvbSB3aGljaCByYXcgc3RvcmFnZSB2b2x1bWVzIGNhbiBiZSBjcmVhdGVkLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yeSI6ICJHZW5lcmljL0luZnJhc3RydWN0dXJlIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsibWlzc2luZ19yZXNvdXJjZV9uYW1lIl0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3Jlc291cmNlX25hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3Jlc291cmNlX25hbWUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3Jlc291cmNlX25hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3Jlc291cmNlX25hbWUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDBjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfcmVzb3VyY2VfbmFtZS9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfcmVzb3VyY2VfbmFtZS55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLm1pc3NpbmdfdXNlcklkOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBzaXplOiAKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEgTUIKKyAgICAgIHZvbHVtZV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc25hcHNob3RfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhdHRhY2htZW50OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19yZXNvdXJjZV9uYW1lL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19yZXNvdXJjZV9uYW1lLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ19yZXNvdXJjZV9uYW1lL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ19yZXNvdXJjZV9uYW1lLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDI5NGI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3Jlc291cmNlX25hbWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3Jlc291cmNlX25hbWUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ190YWdzL21pc3NpbmdfdGFncy5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3RhZ3MvbWlzc2luZ190YWdzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjODQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ190YWdzL21pc3NpbmdfdGFncy5qc29uCkBAIC0wLDAgKzEsMTUgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3RhZ3MueW1sIiwKKwkiY29udGFjdElkIjogImpoMDAwMyIsCisJIm5hbWUiOiAidG9zY2Eubm9kZXMubWlzc2luZ190YWdzIiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSAoaS5lLiwgbm90IHNoYXJlZCkgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfdGFncy9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfdGFncy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfdGFncy9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfdGFncy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkMGM3MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvbWlzc2luZ190YWdzL25vcm1hdGl2ZS10eXBlcy1uZXctbWlzc2luZ190YWdzLnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UubWlzc2luZ191c2VySWQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHNpemU6IAorICAgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMSBNQgorICAgICAgdm9sdW1lX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzbmFwc2hvdF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3RhZ3Mvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3RhZ3MuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9taXNzaW5nX3RhZ3Mvbm9ybWF0aXZlLXR5cGVzLW5ldy1taXNzaW5nX3RhZ3MuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjE5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL21pc3NpbmdfdGFncy9ub3JtYXRpdmUtdHlwZXMtbmV3LW1pc3NpbmdfdGFncy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9teUNvbXB1dGUvbXlDb21wdXRlLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL215Q29tcHV0ZS9teUNvbXB1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjIxNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9teUNvbXB1dGUvbXlDb21wdXRlLmpzb24KQEAgLTAsMCArMSwyNCBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1teUNvbXB1dGUueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJ0b3NjYS5ub2Rlcy5NeUNvbXB1dGUiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHJlYWwgb3IgdmlydHVhbCBtYWNoaW5lIG9yIHNlcnZlci4gSW5mb3JtYXRpb24gc3BlY2lmaWVkIG9uIHRoZSBDb21wdXRlCisgICAgICBub2RlIHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBtYWNoaW5lIHRoYXQgZml0cyB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzIGluIHRoZSBjbG91ZAorICAgICAgYXZhaWxhYmxlIG1hY2hpbmVzLiBJZiBubyBzaXppbmcgaW5mb3JtYXRpb24gYXJlIHNwZWNpZmllZCB0aGUgY2xvdWQgcHJvdmlkZXIgZGVmYXVsdAorICAgICAgbWFjaGluZSB3aWxsIGJlIHVzZWQuIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHNwZWNpZnkgdGhlIHJlcXVpcmVkICBDUFVzIGFuZCBtZW1vcnkKKyAgICAgIGF0IGxlYXN0LiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMuTXlDb21wdXRlIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9teUNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy1teUNvbXB1dGUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9teUNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy1teUNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjkzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL215Q29tcHV0ZS9ub3JtYXRpdmUtdHlwZXMtbmV3LW15Q29tcHV0ZS55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9teUNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy1teUNvbXB1dGUuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9teUNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy1teUNvbXB1dGUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmI4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL215Q29tcHV0ZS9ub3JtYXRpdmUtdHlwZXMtbmV3LW15Q29tcHV0ZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9wb3J0SW52YWxpZERlZmF1bHRWYWx1ZS9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnRJbnZhbGlkRGVmYXVsdFZhbHVlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvcG9ydEludmFsaWREZWZhdWx0VmFsdWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0SW52YWxpZERlZmF1bHRWYWx1ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZmQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvcG9ydEludmFsaWREZWZhdWx0VmFsdWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0SW52YWxpZERlZmF1bHRWYWx1ZS55bWwKQEAgLTAsMCArMSwyOSBAQAordG9zY2Eubm9kZXMubmV0d29yay5Qb3J0SW52YWxpZERlZmF1bHRWYWx1ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgaXBfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgb3JkZXI6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgZGVmYXVsdDogMS41IAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAKKyAgICAgIGlzX2RlZmF1bHQ6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICBpcF9yYW5nZV9zdGFydDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgaXBfcmFuZ2VfZW5kOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlICAKKyAgICByZXF1aXJlbWVudHM6CisgICAgIC0gbGluazogCisgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkxpbmtzVG8gCisgICAgIC0gYmluZGluZzoKKyAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuQmluZHNUbyAKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvcG9ydEludmFsaWREZWZhdWx0VmFsdWUvbm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0SW52YWxpZERlZmF1bHRWYWx1ZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3BvcnRJbnZhbGlkRGVmYXVsdFZhbHVlL25vcm1hdGl2ZS10eXBlcy1uZXctcG9ydEludmFsaWREZWZhdWx0VmFsdWUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDAyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3BvcnRJbnZhbGlkRGVmYXVsdFZhbHVlL25vcm1hdGl2ZS10eXBlcy1uZXctcG9ydEludmFsaWREZWZhdWx0VmFsdWUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvcG9ydEludmFsaWREZWZhdWx0VmFsdWUvcG9ydEludmFsaWREZWZhdWx0VmFsdWUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvcG9ydEludmFsaWREZWZhdWx0VmFsdWUvcG9ydEludmFsaWREZWZhdWx0VmFsdWUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZlMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy9wb3J0SW52YWxpZERlZmF1bHRWYWx1ZS9wb3J0SW52YWxpZERlZmF1bHRWYWx1ZS5qc29uCkBAIC0wLDAgKzEsMTYgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0SW52YWxpZERlZmF1bHRWYWx1ZS55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJ0b3NjYS5ub2Rlcy5uZXR3b3JrLlBvcnRJbnZhbGlkRGVmYXVsdFZhbHVlIiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgYXNzb2NpYXRlcyBiZXR3ZWVuIENvbXB1dGUgYW5kIE5ldHdvcmsgbm9ybWF0aXZlIHR5cGVzLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAicG9ydCIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiTmV0d29yayBFbGVtZW50cyIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsidG9zY2Eubm9kZXMubmV0d29yay5Qb3J0SW52YWxpZERlZmF1bHRWYWx1ZSJdLAorCSJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKwkidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlckNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy11c2VyQ29tcHV0ZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlckNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTA5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlckNvbXB1dGUueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5Db21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlckNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy11c2VyQ29tcHV0ZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlckNvbXB1dGUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlckNvbXB1dGUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlckNvbXB1dGUvdXNlckNvbXB1dGUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlckNvbXB1dGUvdXNlckNvbXB1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjEwYzBiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy91c2VyQ29tcHV0ZS91c2VyQ29tcHV0ZS5qc29uCkBAIC0wLDAgKzEsMjYgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctdXNlckNvbXB1dGUueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJ0b3NjYS5ub2Rlcy51c2VyQ29tcHV0ZSIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgcmVhbCBvciB2aXJ0dWFsIG1hY2hpbmUgb3Igc2VydmVyLiBJbmZvcm1hdGlvbiBzcGVjaWZpZWQgb24gdGhlIENvbXB1dGUKKyAgICAgIG5vZGUgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIG1hY2hpbmUgdGhhdCBmaXRzIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgaW4gdGhlIGNsb3VkCisgICAgICBhdmFpbGFibGUgbWFjaGluZXMuIElmIG5vIHNpemluZyBpbmZvcm1hdGlvbiBhcmUgc3BlY2lmaWVkIHRoZSBjbG91ZCBwcm92aWRlciBkZWZhdWx0CisgICAgICBtYWNoaW5lIHdpbGwgYmUgdXNlZC4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gc3BlY2lmeSB0aGUgcmVxdWlyZWQgIENQVXMgYW5kIG1lbW9yeQorICAgICAgYXQgbGVhc3QuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy51c2VyQ29tcHV0ZSIKKyAgXSwKKyAgInZlbmRvck5hbWUiOiAiVXNlclZlbmRvciIsCisgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMS4xIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlclVwZGF0ZUNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy11c2VyVXBkYXRlQ29tcHV0ZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJVcGRhdGVDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlclVwZGF0ZUNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzMzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJVcGRhdGVDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlclVwZGF0ZUNvbXB1dGUueW1sCkBAIC0wLDAgKzEsMjkgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5Db21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlclVwZGF0ZUNvbXB1dGUvbm9ybWF0aXZlLXR5cGVzLW5ldy11c2VyVXBkYXRlQ29tcHV0ZS56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJVcGRhdGVDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlclVwZGF0ZUNvbXB1dGUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlY2VhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3VzZXJVcGRhdGVDb21wdXRlL25vcm1hdGl2ZS10eXBlcy1uZXctdXNlclVwZGF0ZUNvbXB1dGUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlclVwZGF0ZUNvbXB1dGUvdXNlclVwZGF0ZUNvbXB1dGUuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdXNlclVwZGF0ZUNvbXB1dGUvdXNlclVwZGF0ZUNvbXB1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTYzYzQzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy91c2VyVXBkYXRlQ29tcHV0ZS91c2VyVXBkYXRlQ29tcHV0ZS5qc29uCkBAIC0wLDAgKzEsMjIgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctdXNlclVwZGF0ZUNvbXB1dGUueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJ0b3NjYS5ub2Rlcy51c2VyQ29tcHV0ZSIsCisgICJkZXNjcmlwdGlvbiI6ICJTaG9ydCBkZXNjcmlwdGlvbiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidmVuZG9yTmFtZSI6ICJVcGRhdGVkVmVuZG9yIiwKKyAgInZlbmRvclJlbGVhc2UiOiAiMS4xLjIiLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMudXNlckNvbXB1dGUiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3MDY2MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX2hhcHB5U2NlbmFyaW9zL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX2hhcHB5U2NlbmFyaW9zLnltbApAQCAtMCwwICsxLDM5IEBACit2YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3M6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgY29tcG9uZW50X3ZlcnNpb246IAorICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgYWRtaW5fY3JlZGVudGlhbDogCisgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdmFsaWRhdGlvbl90ZXN0MTogCisgICAgICB0eXBlOiBib29sZWFuCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICB2YWxpZGF0aW9uX3Rlc3QyOiAKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICB2YWxpZGF0aW9uX3Rlc3QzOiAKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZGVmYXVsdDogMTIzNAorICAgIHZhbGlkYXRpb25fdGVzdDQ6IAorICAgICAgdHlwZTogZmxvYXQKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZGVmYXVsdDogMTIzLjEyMworICAgIHZhbGlkYXRpb25fdGVzdDU6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGRlZmF1bHQ6IGNvb29sU3RyaW5nCisgICAgdmFsaWRhdGlvbl90ZXN0NjogCisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGRlZmF1bHQ6IGNvb29sU3RyaW5nCQkgIAkgIAorICByZXF1aXJlbWVudHM6CisgICAgLSBob3N0OiAKKyAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3Mvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3MuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3Mvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3MuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDRkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3MvdmFsaWRhdGVQcm9wb3J0aWVzX2hhcHB5U2NlbmFyaW9zLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy92YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM1YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfaGFwcHlTY2VuYXJpb3MvdmFsaWRhdGVQcm9wb3J0aWVzX2hhcHB5U2NlbmFyaW9zLmpzb24KQEAgLTAsMCArMSwxNCBAQAoreworCSJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc19oYXBweVNjZW5hcmlvcy55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIsCisJImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlSW5pdC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVJbml0L25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlSW5pdC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3Nzg3NAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlSW5pdC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQueW1sCkBAIC0wLDAgKzEsMjEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVJbml0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICAjIGRvbWFpbi1zcGVjaWZpYyBzb2Z0d2FyZSBjb21wb25lbnQgdmVyc2lvbgorICAgICAgY29tcG9uZW50X3ZlcnNpb246IAorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgYWRtaW5fY3JlZGVudGlhbDogCisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgdmFsaWRhdGlvbl90ZXN0OiAKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogMTIzNDU2CSAgICAKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVJbml0LnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlSW5pdC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjJkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVJbml0LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlSW5pdC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVJbml0L3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGY0YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVJbml0L3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQuanNvbgpAQCAtMCwwICsxLDE0IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlSW5pdC55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIsCisJImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJBYnN0cmFjdCIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDUyOWFkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVTdHJpbmcvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVTdHJpbmcueW1sCkBAIC0wLDAgKzEsMjEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVTdHJpbmc6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICB2YWxpZGF0aW9uX3Rlc3Q6IAorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBhYmNkCSAgICAKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZVN0cmluZy56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZVN0cmluZy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4YmEwZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZVN0cmluZy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVTdHJpbmcuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZVN0cmluZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZmYyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZVN0cmluZy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUJvb2xlYW5fdmFsdWVTdHJpbmcuanNvbgpAQCAtMCwwICsxLDE0IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVCb29sZWFuX3ZhbHVlU3RyaW5nLnltbCIsCisJImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorCSJuYW1lIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkFic3RyYWN0IgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCJdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlQm9vbGVhbi9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVCb29sZWFuLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4vbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlQm9vbGVhbi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlOGM5YgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4vbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlQm9vbGVhbi55bWwKQEAgLTAsMCArMSwyMSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVCb29sZWFuOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICAjIGRvbWFpbi1zcGVjaWZpYyBzb2Z0d2FyZSBjb21wb25lbnQgdmVyc2lvbgorICAgICAgY29tcG9uZW50X3ZlcnNpb246IAorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgYWRtaW5fY3JlZGVudGlhbDogCisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgdmFsaWRhdGlvbl90ZXN0OiAKKyAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHRydWUJICAgIAorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4vbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlQm9vbGVhbi56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVCb29sZWFuL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzdhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVCb29sZWFuL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4uemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4vdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4uanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4vdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZUJvb2xlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTc2OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlQm9vbGVhbi92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlQm9vbGVhbi5qc29uCkBAIC0wLDAgKzEsMTQgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlQm9vbGVhbi55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIsCisJImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJBYnN0cmFjdCIKKwkJfV0KKwl9XSwKKwkidGFncyI6IFsidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVTdHJpbmcueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlNWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVTdHJpbmcueW1sCkBAIC0wLDAgKzEsMjEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlU3RyaW5nOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICAjIGRvbWFpbi1zcGVjaWZpYyBzb2Z0d2FyZSBjb21wb25lbnQgdmVyc2lvbgorICAgICAgY29tcG9uZW50X3ZlcnNpb246IAorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgYWRtaW5fY3JlZGVudGlhbDogCisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgdmFsaWRhdGlvbl90ZXN0OiAKKyAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IGFiY2QJICAgIAorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVTdHJpbmcuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllYzRkNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVTdHJpbmcuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlU3RyaW5nLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVTdHJpbmcvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYWI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlRmxvYXRfdmFsdWVTdHJpbmcvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVGbG9hdF92YWx1ZVN0cmluZy5qc29uCkBAIC0wLDAgKzEsMTQgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUZsb2F0X3ZhbHVlU3RyaW5nLnltbCIsCisJImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorCSJuYW1lIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkFic3RyYWN0IgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCJdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVCb29sZWFuL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlQm9vbGVhbi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4vbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVCb29sZWFuLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJkM2JhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVCb29sZWFuL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlQm9vbGVhbi55bWwKQEAgLTAsMCArMSwyMSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW46CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICB2YWxpZGF0aW9uX3Rlc3Q6IAorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiB0cnVlCSAgICAKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4vbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVCb29sZWFuLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlQm9vbGVhbi9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzZmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4vbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVCb29sZWFuLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4vdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlQm9vbGVhbi5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVCb29sZWFuL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjE0NWQyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVCb29sZWFuL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4uanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUJvb2xlYW4ueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkFic3RyYWN0IgorCQl9XQorCX1dLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0L25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlRmxvYXQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFlM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0LnltbApAQCAtMCwwICsxLDIxIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlRmxvYXQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICB2YWxpZGF0aW9uX3Rlc3Q6IAorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiAwLjEyMwkgICAgCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0LnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlRmxvYXQvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiNjlkZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlRmxvYXQvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2Y1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0L3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZUZsb2F0Lmpzb24KQEAgLTAsMCArMSwxNiBAQAoreworICAicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVGbG9hdC55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiQWJzdHJhY3QiCisJCX1dCisJfV0sCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlU3RyaW5nLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlU3RyaW5nLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQ3MjNlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVTdHJpbmcvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVTdHJpbmcueW1sCkBAIC0wLDAgKzEsMjEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVTdHJpbmc6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICB2YWxpZGF0aW9uX3Rlc3Q6IAorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBhYmNkCSAgICAKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3ZTIxNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlU3RyaW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlU3RyaW5nLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVTdHJpbmcuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVJbml0X3ZhbHVlU3RyaW5nL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTRiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUluaXRfdmFsdWVTdHJpbmcuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlSW5pdF92YWx1ZVN0cmluZy55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkFic3RyYWN0IgorCQl9XQorCX1dLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTGlzdF92YWx1ZVVybENyZWRlbnRpYWwvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVMaXN0X3ZhbHVlVXJsQ3JlZGVudGlhbC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTGlzdF92YWx1ZVVybENyZWRlbnRpYWwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2YzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTGlzdF92YWx1ZVVybENyZWRlbnRpYWwvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsLnltbApAQCAtMCwwICsxLDUwIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVMaXN0X3ZhbHVlVXJsQ3JlZGVudGlhbDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgIyBkb21haW4tc3BlY2lmaWMgc29mdHdhcmUgY29tcG9uZW50IHZlcnNpb24KKyAgICAgIGNvbXBvbmVudF92ZXJzaW9uOiAKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGFkbWluX2NyZWRlbnRpYWw6IAorICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHZhbGlkYXRpb25fdGVzdDogCisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIHByb3RvY29sOiBwcm90b2NvbDF+ISNAfiQlXiooKVtdOzonInxcLworICAgICAgICAgICAgICB0b2tlbjogdG9rZW4xCisgICAgICAgICAgICAtIHByb3RvY29sOiBwcm90b2NvbDJ+ISNAfiQlXiooKVtdOzonInxcLworICAgICAgICAgICAgICB0b2tlbjogdG9rZW4yIAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorICAgIGF0dHJpYnV0ZXM6CisgICAgICB2YWxpZGF0aW9uX3Rlc3RfbGlzdDogCisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIHByb3RvY29sOiBwcm90b2NvbDF+ISNAfiQlXiooKVtdOzonInxcLworICAgICAgICAgICAgICB0b2tlbjogdG9rZW4xCisgICAgICAgICAgICAtIHByb3RvY29sOiBwcm90b2NvbDJ+ISNAfiQlXiooKVtdOzonInxcLworICAgICAgICAgICAgICB0b2tlbjogdG9rZW4yIAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorICAgICAgdmFsaWRhdGlvbl90ZXN0X21hcDogCisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleTE6CisgICAgICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sMX4hI0B+JCVeKigpW107OicifFwvCisgICAgICAgICAgICAgICAgdG9rZW46IHRva2VuMQorICAgICAgICAgICAga2V5MjoKKyAgICAgICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2wyfiEjQH4kJV4qKClbXTs6JyJ8XC8KKyAgICAgICAgICAgICAgICB0b2tlbjogdG9rZW4yCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsICAgICAgCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVMaXN0X3ZhbHVlVXJsQ3JlZGVudGlhbC56aXAgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTGlzdF92YWx1ZVVybENyZWRlbnRpYWwvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGIxY2UxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVMaXN0X3ZhbHVlVXJsQ3JlZGVudGlhbC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTGlzdF92YWx1ZVVybENyZWRlbnRpYWwuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVMaXN0X3ZhbHVlVXJsQ3JlZGVudGlhbC92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkNmJiZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVMaXN0X3ZhbHVlVXJsQ3JlZGVudGlhbC92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZUxpc3RfdmFsdWVVcmxDcmVkZW50aWFsLmpzb24KQEAgLTAsMCArMSwxNiBAQAoreworCSJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTGlzdF92YWx1ZVVybENyZWRlbnRpYWwueW1sIiwKKwkiY29udGFjdElkIjogImpoMDAwMyIsCisJIm5hbWUiOiAicmVzb3VyY2VMaXN0VmFsdWVDcmVkZW50aWFsIiwKKwkiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisJInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkFic3RyYWN0IgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJyZXNvdXJjZUxpc3RWYWx1ZUNyZWRlbnRpYWwiXSwKKwkidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisJInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwX3ZhbHVlVXJsQ3JlZGVudGlhbC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwX3ZhbHVlVXJsQ3JlZGVudGlhbC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwX3ZhbHVlVXJsQ3JlZGVudGlhbC9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwX3ZhbHVlVXJsQ3JlZGVudGlhbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlMTRiMgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsLnltbApAQCAtMCwwICsxLDI5IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICAjIGRvbWFpbi1zcGVjaWZpYyBzb2Z0d2FyZSBjb21wb25lbnQgdmVyc2lvbgorICAgICAgY29tcG9uZW50X3ZlcnNpb246IAorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgYWRtaW5fY3JlZGVudGlhbDogCisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgdmFsaWRhdGlvbl90ZXN0OiAKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5MToKKyAgICAgICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2wxCisgICAgICAgICAgICAgICAgdG9rZW46IHRva2VuMQorICAgICAgICAgICAga2V5MjoKKyAgICAgICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2wyCisgICAgICAgICAgICAgICAgdG9rZW46IHRva2VuMgorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThmMDkzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZU1hcF92YWx1ZVVybENyZWRlbnRpYWwvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZU1hcF92YWx1ZVVybENyZWRlbnRpYWwuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwX3ZhbHVlVXJsQ3JlZGVudGlhbC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZU1hcF92YWx1ZVVybENyZWRlbnRpYWwvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMGJlYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXBfdmFsdWVVcmxDcmVkZW50aWFsL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwX3ZhbHVlVXJsQ3JlZGVudGlhbC5qc29uCkBAIC0wLDAgKzEsMTYgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAibm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZU1hcF92YWx1ZVVybENyZWRlbnRpYWwueW1sIiwKKwkiY29udGFjdElkIjogImpoMDAwMyIsCisJIm5hbWUiOiAicmVzb3VyY2VNYXBWYWx1ZUNyZWRlbnRpYWwiLAorCSJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKwkicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiQWJzdHJhY3QiCisJCX1dCisJfV0sCisJInRhZ3MiOiBbInJlc291cmNlTWFwVmFsdWVDcmVkZW50aWFsIl0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVN0cmluZ192YWx1ZVN0cmluZ19zcGVjaWFsX2NoYXJzL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfc3BlY2lhbF9jaGFycy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3NwZWNpYWxfY2hhcnMvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVN0cmluZ192YWx1ZVN0cmluZ19zcGVjaWFsX2NoYXJzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzEwOWQxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVN0cmluZ192YWx1ZVN0cmluZ19zcGVjaWFsX2NoYXJzL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfc3BlY2lhbF9jaGFycy55bWwKQEAgLTAsMCArMSwxOSBAQAordmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfc3BlY2lhbF9jaGFyczoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgIHByb3BlcnRpZXM6CisgICAgIyBkb21haW4tc3BlY2lmaWMgc29mdHdhcmUgY29tcG9uZW50IHZlcnNpb24KKyAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICB2YWxpZGF0aW9uX3Rlc3Q6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGRlZmF1bHQ6IH4hI0B+CSAgICAKKyAgcmVxdWlyZW1lbnRzOgorICAgIC0gaG9zdDogCisgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfc3BlY2lhbF9jaGFycy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVN0cmluZ192YWx1ZVN0cmluZ19zcGVjaWFsX2NoYXJzLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3NwZWNpYWxfY2hhcnMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfc3BlY2lhbF9jaGFycy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZjY2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3NwZWNpYWxfY2hhcnMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfc3BlY2lhbF9jaGFycy5qc29uCkBAIC0wLDAgKzEsMTYgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfc3BlY2lhbF9jaGFycy55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBnZW5lcmljIHNvZnR3YXJlIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBDb21wdXRlIE5vZGUgVHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiQWJzdHJhY3QiCisJCX1dCisJfV0sCisgICJ0YWdzIjogWworICAgICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfdHJpbW1pbmcvbm9ybWF0aXZlLXR5cGVzLW5ldy12YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVN0cmluZ192YWx1ZVN0cmluZ190cmltbWluZy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3RyaW1taW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfdHJpbW1pbmcueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2QxNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3RyaW1taW5nL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfdHJpbW1pbmcueW1sCkBAIC0wLDAgKzEsMTkgQEAKK3ZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgY29tcG9uZW50X3ZlcnNpb246IAorICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgYWRtaW5fY3JlZGVudGlhbDogCisgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdmFsaWRhdGlvbl90ZXN0OiAKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZGVmYXVsdDogdHJ1ZQkgICAgCisgIHJlcXVpcmVtZW50czoKKyAgICAtIGhvc3Q6IAorICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3RyaW1taW5nL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3RyaW1taW5nLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3RyaW1taW5nL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlU3RyaW5nX3ZhbHVlU3RyaW5nX3RyaW1taW5nLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkOTMyMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfdHJpbW1pbmcvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVTdHJpbmdfdmFsdWVTdHJpbmdfdHJpbW1pbmcuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlQm9vbGVhbl92YWx1ZUluaXQueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorCSJjYXRlZ29yaWVzIjogW3sKKwkJIm5hbWUiOiAiR2VuZXJpYyIsCisJCSJzdWJjYXRlZ29yaWVzIjogW3sKKwkJCSJuYW1lIjogIkFic3RyYWN0IgorCQl9XQorCX1dLAorICAidGFncyI6IFsKKyAgICAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlVGVzdERhdGFUeXBlL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXAueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVRlc3REYXRhVHlwZS9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWIxM2IzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVRlc3REYXRhVHlwZS9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwLnltbApAQCAtMCwwICsxLDMyIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmFsaWRhdGVQcm9wb3J0aWVzX3R5cGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBteXByb3A6CisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvQ29tcGxleAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGFkZHJlc3Nlc01hcDoKKyAgICAgICAgICAgIGtleTE6CisgICAgICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sMQorICAgICAgICAgICAgICAgIHRva2VuOiB0b2tlbjEKKyAgICAgICAgICAgIGtleTI6CisgICAgICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sMgorICAgICAgICAgICAgICAgIHRva2VuOiB0b2tlbjIKKyAgICAgICAgICBhZGRyZXNzZXNMaXN0OiAKKyAgICAgICAgICAgIC0gcHJvdG9jb2w6IHByb3RvY29sMX4hI0B+JCVeKigpW107OicifFwvCisgICAgICAgICAgICAgIHRva2VuOiB0b2tlbjEKKyAgICAgICAgICAgIC0gcHJvdG9jb2w6IHByb3RvY29sMn4hI0B+JCVeKigpW107OicifFwvCisgICAgICAgICAgICAgIHRva2VuOiB0b2tlbjIKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlVGVzdERhdGFUeXBlL25vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXAuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVRlc3REYXRhVHlwZS9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGYwNDcwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cy92YWxpZGF0ZVByb3BvcnRpZXNfdHlwZVRlc3REYXRhVHlwZS9ub3JtYXRpdmUtdHlwZXMtbmV3LXZhbGlkYXRlUHJvcG9ydGllc190eXBlTWFwLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlVGVzdERhdGFUeXBlL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlVGVzdERhdGFUeXBlLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZVRlc3RzL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlVGVzdERhdGFUeXBlL3ZhbGlkYXRlUHJvcG9ydGllc190eXBlVGVzdERhdGFUeXBlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1MTU0NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVUZXN0RGF0YVR5cGUvdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVUZXN0RGF0YVR5cGUuanNvbgpAQCAtMCwwICsxLDE2IEBACit7CisJInBheWxvYWROYW1lIjogIm5vcm1hdGl2ZS10eXBlcy1uZXctdmFsaWRhdGVQcm9wb3J0aWVzX3R5cGVNYXAueW1sIiwKKwkiY29udGFjdElkIjogImpoMDAwMyIsCisJIm5hbWUiOiAicmVzb3VyY2VNYXBWYWx1ZVRlc3QiLAorCSJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKwkicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiQWJzdHJhY3QiCisJCX1dCisJfV0sCisJInRhZ3MiOiBbInJlc291cmNlTWFwVmFsdWVUZXN0Il0sCisJInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorCSJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L2NhdGVnb3J5VHlwZXNUZXN0LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFR5cGVzVGVzdC9jYXRlZ29yeVR5cGVzVGVzdC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwZjMzZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFR5cGVzVGVzdC9jYXRlZ29yeVR5cGVzVGVzdC55bWwKQEAgLTAsMCArMSwyMyBAQAorc2VydmljZXM6CisgICAgTW9iaWxpdHk6CisgICAgICBuYW1lOiAiTW9iaWxpdHkxIgorICAgICAgaWNvbnM6IFsnbW9iaWxpdHknXQorICAgIE5ldHdvcmtfTDFfMzoKKyAgICAgIG5hbWU6ICJOZXR3b3JrIEwxLTMxIgorICAgICAgaWNvbnM6IFsnbmV0d29ya19sXzEtMyddCityZXNvdXJjZXM6CisgIE5ldHdvcmtMYXllcjIzOgorICAgIG5hbWU6ICJOZXR3b3JrIExheWVyIDItMzEiCisgICAgc3ViY2F0ZWdvcmllczogCisgICAgICBSb3V0ZXI6CisgICAgICAgICAgbmFtZTogIlJvdXRlciIKKyAgICAgICAgICBpY29uczogWydyb3V0ZXInXQorICAgICAgR2F0ZXdheToKKyAgICAgICAgICBuYW1lOiAiR2F0ZXdheSIKKyAgICAgICAgICBpY29uczogWydnYXRld2F5J10KKyAgICAgIFdBTl9Db25uZWN0b3JzOgorICAgICAgICAgIG5hbWU6ICJXQU4gQ29ubmVjdG9ycyIKKyAgICAgICAgICBpY29uczogWydjb25uZWN0b3InXQorICAgICAgTEFOX0Nvbm5lY3RvcnM6CisgICAgICAgICAgbmFtZTogIkxBTiBDb25uZWN0b3JzIgorICAgICAgICAgIGljb25zOiBbJ2Nvbm5lY3RvciddCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRUeXBlc1Rlc3QvY2F0ZWdvcnlUeXBlc1Rlc3QuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L2NhdGVnb3J5VHlwZXNUZXN0LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGI3YWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L2NhdGVnb3J5VHlwZXNUZXN0LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRUeXBlc1Rlc3QvbXlIZWF0U3RhY2sxL215SGVhdFN0YWNrMS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRUeXBlc1Rlc3QvbXlIZWF0U3RhY2sxL215SGVhdFN0YWNrMS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0ZWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFR5cGVzVGVzdC9teUhlYXRTdGFjazEvbXlIZWF0U3RhY2sxLnltbApAQCAtMCwwICsxLDEzIEBACitvcmcub3BlbmVjb21wLmdyb3Vwcy5NeUhlYXRTdGFjazE6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZ3JvdXBzLlJvb3QKKyAgZGVzY3JpcHRpb246IEdyb3VwZWQgYWxsIGhlYXQgcmVzb3VyY2VzIHdoaWNoIGFyZSBpbiB0aGUgc2FtZSBoZWF0IHN0YWNrCisgIHByb3BlcnRpZXM6CisgICAgaGVhdF9maWxlczoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGRlc2NyaXB0aW9uOiBIZWF0IGZpbGVzIHdoaWNoIGFzc29jaWF0ZSB0byB0aGlzIGdyb3VwL2hlYXQgc3RhY2sKKyAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICB1cmxfY3JlZGVudGlhbDoKKyAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L215SGVhdFN0YWNrMS9teUhlYXRTdGFjazEuemlwIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L215SGVhdFN0YWNrMS9teUhlYXRTdGFjazEuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTdiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRUeXBlc1Rlc3QvbXlIZWF0U3RhY2sxL215SGVhdFN0YWNrMS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L215SGVhdFN0YWNrMi9teUhlYXRTdGFjazIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L215SGVhdFN0YWNrMi9teUhlYXRTdGFjazIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZmJiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRUeXBlc1Rlc3QvbXlIZWF0U3RhY2syL215SGVhdFN0YWNrMi55bWwKQEAgLTAsMCArMSwxNCBAQAorb3JnLm9wZW5lY29tcC5ncm91cHMuTXlIZWF0U3RhY2syOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmdyb3Vwcy5Sb290CisgIGRlc2NyaXB0aW9uOiBHcm91cGVkIGFsbCBoZWF0IHJlc291cmNlcyB3aGljaCBhcmUgaW4gdGhlIHNhbWUgaGVhdCBzdGFjaworICBtZW1iZXJzOiBbIHRvc2NhLm5vZGVzLkNvbXB1dGUgXQorICBwcm9wZXJ0aWVzOgorICAgIGhlYXRfZmlsZXM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBkZXNjcmlwdGlvbjogSGVhdCBmaWxlcyB3aGljaCBhc3NvY2lhdGUgdG8gdGhpcyBncm91cC9oZWF0IHN0YWNrCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgdXJsX2NyZWRlbnRpYWw6CisgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFR5cGVzVGVzdC9teUhlYXRTdGFjazIvbXlIZWF0U3RhY2syLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFR5cGVzVGVzdC9teUhlYXRTdGFjazIvbXlIZWF0U3RhY2syLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDc1YzdmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0L215SGVhdFN0YWNrMi9teUhlYXRTdGFjazIuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL290aGVyL21hcHBpbmcuanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL290aGVyL21hcHBpbmcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzEwZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3RoZXIvbWFwcGluZy5qc29uCkBAIC0wLDAgKzEsMTgyIEBACit7ICJvcmRlciI6IDEsICJ0ZW1wbGF0ZSI6ICJhdWRpdGluZ2V2ZW50cy0qIiwgInNldHRpbmdzIjoge30sICJtYXBwaW5ncyI6Cit7IAorImRpc3RyaWJ1dGlvbmRvd25sb2FkZXZlbnQiOgorICAgICAgICB7ICJwcm9wZXJ0aWVzIjogeyAKKyAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgICAgICAgICAiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgICAgICAgICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiUkVTT1VSQ0VfVVJMIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwKKyAgICJhdWRpdGluZ2dldHVlYmNsdXN0ZXJldmVudCI6IAorICAgICAgICB7ICJwcm9wZXJ0aWVzIjogeyAKKyAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgICAgICAgICAiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgICAgICAgICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwKKyAgImRpc3RyaWJ1dGlvbnN0YXR1c2V2ZW50IjogCisgICAgICAgIHsgInByb3BlcnRpZXMiOiB7IAorICAgICAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sIAorICAgICAgICAgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAgICAgICAgICJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJSRVNPVVJDRV9VUkwiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJESUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJUT1BJQ19OQU1FIjp7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgIkNPTlNVTUVSX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9fSwgCisgICAgICAgICAgIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IH0sCisiZGlzdHJpYnV0aW9uZW5naW5lZXZlbnQiOiAKKyAgICAgICAgeyAicHJvcGVydGllcyI6IHsgCisgICAgICAgICAgIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfSwgCisgICAgICAgICAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAgCisgICAgICAgICAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlRPUElDX05BTUUiOnsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAiUk9MRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiQVBJX0tFWSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICJEX0VOViI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwKKyAgInVzZXJhY2Nlc3NldmVudCI6IHsgCisgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7IAorICAgICAgICAgICAgICAgICAgIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfSwgCisgICAgICAgICAgICAgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAgICAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgICAgICAgICAgICAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgICAgICJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICAgICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAgICAgICAgICJVU0VSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgICAgICAgICAgICAgICAgICJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfX0sIAorInJlc291cmNlYWRtaW5ldmVudCI6IAorICAgICAgICAgICAgICB7ICJwcm9wZXJ0aWVzIjogeyAKKyAgICAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sCisgICAgICAgICAiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgICAgICAgICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIkNVUlJfVkVSU0lPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICJDVVJSX1NUQVRFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIkRJRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICJNT0RJRklFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIlBSRVZfVkVSU0lPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICJQUkVWX1NUQVRFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIlJFU09VUkNFX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICJSRVNPVVJDRV9UWVBFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAiRFBSRVZfU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAiRENVUlJfU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIlRPU0NBX05PREVfVFlQRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICJDT01NRU5UIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAiQVJUSUZBQ1RfREFUQSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICJQUkVWX0FSVElGQUNUX1VVSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAiQ1VSUl9BUlRJRkFDVF9VVUlEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9IH0sIAorICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH19ICwgCisidXNlcmFkbWluZXZlbnQiOiAKKyAgICAgICAgeyAicHJvcGVydGllcyI6IHsgCisgICAgICAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sIAorICAgICAgICAgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAgICAgICAgICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJVU0VSX0FGVEVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJVU0VSX0JFRk9SRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiTU9ESUZJRVIiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfX0sCisgICAgICAgICAgIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IH0sCisiZGlzdHJpYnV0aW9ubm90aWZpY2F0aW9uZXZlbnQiOgorICAgICAgICAgICAgICAgICB7InByb3BlcnRpZXMiOnsKKyAgICAgICAgICAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgICAgICAgICAgICAgICAgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAgICAgICAgICJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgICAgICAgICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAgICAgICAgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICAgICAgICAgIkNVUlJfU1RBVEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgICAiQ1VSUl9WRVJTSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICAgIkRJRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAgICJNT0RJRklFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICAgIlJFU09VUkNFX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgICAgICAgICAiUkVTT1VSQ0VfVFlQRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAgICJUT1BJQ19OQU1FIjp7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgICAgICAgICAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwKKyAiY2F0ZWdvcnlldmVudCI6ICAgICAgICAgIAorICAgICAgICAgIHsgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIk1PRElGSUVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiQ0FURUdPUllfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiU1VCX0NBVEVHT1JZX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIkdST1VQSU5HX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlJFU09VUkNFX1RZUEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgICAgICAgICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9fSwgCisgICAgICAgICAgICAgIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IH0sCisgImF1dGhldmVudCI6IHsgCisgICAgICAgICJwcm9wZXJ0aWVzIjogeyAKKyAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgICAgICAgICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiVVJMIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiVVNFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiQVVUSF9TVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCJ0eXBlIjogInN0cmluZyIgfSAsIAorICAgICAgICAgICJSRUFMTSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsInR5cGUiOiAic3RyaW5nIiB9fSAsICAgICAgICAgICAgIAorICAgICAgICAgICJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfX0sIAorICJjb25zdW1lcmV2ZW50IjogICAgICAgICAgCisgICAgICAgICAgeyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAiTU9ESUZJRVIiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJFQ09NUF9VU0VSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH19LCAKKyAgICAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwKKyAgImdldHVzZXJzbGlzdGV2ZW50IjogICAgICAgICAgCisgICAgICAgICAgeyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjp7CisgICAgICAgICAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAiTU9ESUZJRVIiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJERVRBSUxTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH19LCAKKyAgICAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwgICAgCisgImdldGNhdGVnb3J5aGllcmFyY2h5ZXZlbnQiOgorICAgICAgICAgIHsgICAgICAgICAgICAicHJvcGVydGllcyI6eworICAgICAgICAgICJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgIk1PRElGSUVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiREVUQUlMUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9fSwgCisgICAgICAgICAgICAgIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IH0sCisgImRpc3RyaWJ1dGlvbmRlcGxveWV2ZW50IjogCisgICAgICAgICAgeyAgICAgICAgInByb3BlcnRpZXMiOiB7ICAgICAgICAgIAorICAgICAgICAgICAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAgICAgICAgICAgIkNVUlJfVkVSU0lPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgICAgCisgICAgICAgICAgICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAgICAgICAgIAorICAgICAgICAgICAgIkRJRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgICAiTU9ESUZJRVIiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgICAgICAgICAKKyAgICAgICAgICAgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAgICJSRVNPVVJDRV9OQU1FIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sICAgICAgICAgCisgICAgICAgICAgICAiUkVTT1VSQ0VfVFlQRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAgICAgICAgICAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgICAgICAgICAgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAgIAorICAgICAgICAgICAgIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfX0sCisgICAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfX0sIAorICAgICAgICAgICAgImFsaWFzZXMiOiB7ICJsYXN0XzNfbW9udGhzIjoge319fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2FkZFlhbmdYbWxBcnRpZmFjdFRvUmVzb3VyY2UueG1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvYWRkWWFuZ1htbEFydGlmYWN0VG9SZXNvdXJjZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxNTM4NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2FkZFlhbmdYbWxBcnRpZmFjdFRvUmVzb3VyY2UueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGRhdGE+CisgIDxzcG9ydHM+CisgICAgPHBlcnNvbj4KKyAgICAgIDxuYW1lPkxpb25lbCBBbmRyZXMgTWVzc2k8L25hbWU+CisgICAgICA8YmlydGhkYXk+MTk4Ny0wNi0yNFQwMDowMDowMC0wMDowMDwvYmlydGhkYXk+CisgICAgPC9wZXJzb24+CisgICAgPHBlcnNvbj4KKyAgICAgIDxuYW1lPkNyaXN0aWFubyBSb25hbGRvPC9uYW1lPgorICAgICAgPGJpcnRoZGF5PjE5ODUtMDItMDVUMDA6MDA6MDAtMDA6MDA8L2JpcnRoZGF5PgorICAgIDwvcGVyc29uPgorICAgIDx0ZWFtPgorICAgICAgPG5hbWU+RkMgQmFyY2Vsb25hPC9uYW1lPgorICAgICAgPHBsYXllcj4KKyAgICAgICAgPG5hbWU+TGlvbmVsIEFuZHJlcyBNZXNzaTwvbmFtZT4KKyAgICAgICAgPHNlYXNvbj5DaGFtcGlvbnMgTGVhZ3VlIDIwMTQtMjAxNTwvc2Vhc29uPgorICAgICAgICA8bnVtYmVyPjEwPC9udW1iZXI+CisgICAgICAgIDxzY29yZXM+NDM8L3Njb3Jlcz4KKyAgICAgIDwvcGxheWVyPgorICAgIDwvdGVhbT4KKyAgICA8dGVhbT4KKyAgICAgIDxuYW1lPlJlYWwgTWFkcmlkPC9uYW1lPgorICAgICAgPHBsYXllcj4KKyAgICAgICAgPG5hbWU+Q3Jpc3RpYW5vIFJvbmFsZG88L25hbWU+CisgICAgICAgIDxzZWFzb24+Q2hhbXBpb25zIExlYWd1ZSAyMDE0LTIwMTU8L3NlYXNvbj4KKyAgICAgICAgPG51bWJlcj43PC9udW1iZXI+CisgICAgICAgIDxzY29yZXM+NDg8L3Njb3Jlcz4KKyAgICAgIDwvcGxheWVyPgorICAgIDwvdGVhbT4KKyAgPC9zcG9ydHM+CisKKzwvZGF0YT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9IZWF0RGVwbG95bWVudEFydGlmYWN0cy9hc2NfaGVhdCAwIDIueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2FzY19oZWF0IDAgMi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzU0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9IZWF0RGVwbG95bWVudEFydGlmYWN0cy9hc2NfaGVhdCAwIDIueWFtbApAQCAtMCwwICsxLDc4NyBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3RoZV9TQ1BfbmFtZQorICB2bmZfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBJRCBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3Roc19TQ1BfaWQKKworICBmbGF2b3Jfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3JfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgaW1hZ2Vfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2JlCisgIGltYWdlX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9mZSAgICAKKyAgaW1hZ2Vfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX3NtcAorICBpbWFnZV9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9kYgorCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4yIEZFIENsdXN0ZXIvS0EKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmsyIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4zIENsdXN0ZXIKKyAgaW50X3ZzY3BfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmszIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU40IERCCisgIGludF92c2NwX2RiX25ldHdvcmtfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrNCBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9BCisgIFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0IKKyAgQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBDUklDS0VUX09DUworICBPQU1fZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBPQU0KKyAgYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlM19PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZGIwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGRiMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgdm1fc2NwX2JlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0gICAgCisgIHZtX3NjcF9iZTJfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMgorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTNfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMworICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFNAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKworcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTBfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUyOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTIgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTJfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTJfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMzoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUzIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUzX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTNfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTNfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUzX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTQ6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlNCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlNF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlNF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzAgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUwX3BvcnRfMDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHN9fV0KKworICBmZTBfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzEgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUxX3BvcnRfMToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHN9fV0KKworICBmZTFfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIxX09BTV9kaXJlY3RfaXBzfX1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvYXNjX2hlYXQgMCAyLnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2FzY19oZWF0IDAgMi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMjcyNgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2FzY19oZWF0IDAgMi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvYXNjX2hlYXRfbmV0IDAgMi55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvYXNjX2hlYXRfbmV0IDAgMi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzU0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9IZWF0RGVwbG95bWVudEFydGlmYWN0cy9hc2NfaGVhdF9uZXQgMCAyLnlhbWwKQEAgLTAsMCArMSw3ODcgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMjoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMzoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlNDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKworICB2bmZfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIG5hbWUgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aGVfU0NQX25hbWUKKyAgdm5mX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgSUQgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aHNfU0NQX2lkCisKKyAgZmxhdm9yX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGltYWdlX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9iZQorICBpbWFnZV9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZmUgICAgCisgIGltYWdlX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9zbXAKKyAgaW1hZ2VfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZGIKKworICBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMiBGRSBDbHVzdGVyL0tBCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMiBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMyBDbHVzdGVyCisgIGludF92c2NwX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMyBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFONCBEQgorICBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazQgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQQorICBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9CCisgIENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgQ1JJQ0tFVF9PQ1MKKyAgT0FNX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgT0FNCisgIGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTJfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTNfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTRfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGRiMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBkYjEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHZtX3NjcF9iZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNICAgIAorICB2bV9zY3BfYmUyX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTIKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUzX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTMKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmU0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTQKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMjoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUyIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUyX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTJfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTJfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUyX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTM6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMyB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlM19wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlM19wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmU0OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTQgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTRfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTRfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8wIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMF9wb3J0XzA6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8xIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMV9wb3J0XzE6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUxX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMV9PQU1fZGlyZWN0X2lwc319XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2hlYXRFbnZmaWxlLmVudiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2hlYXRFbnZmaWxlLmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM1NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaGVhdEVudmZpbGUuZW52CkBAIC0wLDAgKzEsNzg3IEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTI6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTM6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTQ6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisKKyAgdm5mX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhlX1NDUF9uYW1lCisgIHZuZl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIElEIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhzX1NDUF9pZAorCisgIGZsYXZvcl9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBpbWFnZV9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfYmUKKyAgaW1hZ2Vfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2ZlICAgIAorICBpbWFnZV9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2Vfc21wCisgIGltYWdlX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2RiCisKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjIgRkUgQ2x1c3Rlci9LQQorICBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazIgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjMgQ2x1c3RlcgorICBpbnRfdnNjcF9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazMgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjQgREIKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcms0IEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0EKKyAgU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQgorICBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIENSSUNLRVRfT0NTCisgIE9BTV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIE9BTQorICBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBkYjAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZGIxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICB2bV9zY3BfYmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTSAgICAKKyAgdm1fc2NwX2JlMl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUyCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlM19uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUzCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlNF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkU0CisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTFfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTI6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMiB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMl9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMl9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUzOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTMgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTNfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTNfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlNDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmU0IH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmU0X3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTRfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTRfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmU0X3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTBfcG9ydF8wOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwc319XQorCisgIGZlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTFfcG9ydF8xOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwc319XQorCisgIGZlMV9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjFfT0FNX2RpcmVjdF9pcHN9fV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9IZWF0RGVwbG95bWVudEFydGlmYWN0cy9oZWF0SW52YWxpZEZvcm1hdC55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaGVhdEludmFsaWRGb3JtYXQueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzBkNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaGVhdEludmFsaWRGb3JtYXQueWFtbApAQCAtMCwwICsxLDkgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworCitwYXJhbWV0ZXJzOgorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaGVhdF9taW5pLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9IZWF0RGVwbG95bWVudEFydGlmYWN0cy9oZWF0X21pbmkueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQ1NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaGVhdF9taW5pLnlhbWwKQEAgLTAsMCArMSwxMyBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisKK3BhcmFtZXRlcnM6CisgIHZuZl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3RoZV9TQ1BfbmFtZQorCityZXNvdXJjZXM6CisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaW52YWxpZEpzb24uanNvbiBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2ludmFsaWRKc29uLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhM2U4OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2ludmFsaWRKc29uLmpzb24KQEAgLTAsMCArMSwxMSBAQAoreworICAgICJnbG9zc2FyeSI6IHsKKyAgICAgICAgInRpdGxlIjogImV4YW1wbGUgZ2xvc3NhcnkiLAorCQkiR2xvc3NEaXYiOiB7CisgICAgICAgICAgICAidGl0bGUiOiAiUyIsCisJCQkiR2xvc3NMaXN0IjogeworICAgICAgICAgICAgICAgICJHbG9zc0VudHJ5IjogeworICAgICAgICAgICAgICAgICAgICAiSUQiOiAiU0dNTCIsCisJCQkJCSJTb3J0QXMiOiAiU0dNTCIsCisJCQkJCSJHbG9zc1Rlcm0iOiAiU3RhbmRhcmQgR2VuZXJhbGl6ZWQgTWFya3VwIExhbmd1YWdlIiwKKwkJCQkJIkFjcm9ueW0iOiAiU0dNTCIsCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9IZWF0RGVwbG95bWVudEFydGlmYWN0cy9pbnZhbGlkWWFtbEZvcm1hdC55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaW52YWxpZFlhbWxGb3JtYXQueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzUxMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaW52YWxpZFlhbWxGb3JtYXQueWFtbApAQCAtMCwwICsxLDc4NyBAQAorCWhlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMjoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMzoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlNDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKworICB2bmZfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIG5hbWUgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aGVfU0NQX25hbWUKKyAgdm5mX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgSUQgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aHNfU0NQX2lkCisKKyAgZmxhdm9yX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGltYWdlX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9iZQorICBpbWFnZV9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZmUgICAgCisgIGltYWdlX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9zbXAKKyAgaW1hZ2VfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZGIKKworICBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMiBGRSBDbHVzdGVyL0tBCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMiBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMyBDbHVzdGVyCisgIGludF92c2NwX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMyBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFONCBEQgorICBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazQgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQQorICBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9CCisgIENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgQ1JJQ0tFVF9PQ1MKKyAgT0FNX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgT0FNCisgIGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTJfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTNfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTRfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGRiMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBkYjEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHZtX3NjcF9iZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNICAgIAorICB2bV9zY3BfYmUyX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTIKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUzX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTMKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmU0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTQKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMjoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUyIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUyX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTJfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTJfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUyX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTM6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMyB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlM19wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlM19wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmU0OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTQgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTRfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTRfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8wIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMF9wb3J0XzA6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8xIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMV9wb3J0XzE6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUxX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMV9PQU1fZGlyZWN0X2lwc319XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2ludmFsaWRZYW5nWG1sLnhtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2ludmFsaWRZYW5nWG1sLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTc4ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvaW52YWxpZFlhbmdYbWwueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzxkYXRhIHhtbG5zPSJ1cm46aWV0ZjpwYXJhbXM6eG1sOm5zOm5ldGNvbmY6YmFzZToxLjAiPgorCisgIDxzcG9ydHMgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLmNvbS9leGFtcGxlLXNwb3J0cyI+CisgICAgPHBlcnNvbj4KKyAgICAgIDxuYW1lPkxpb25lbCBBbmRy77+9cyBNZXNzaTwvbmFtZT4KKyAgICAgIDxiaXJ0aGRheT4xOTg3LTA2LTI0VDAwOjAwOjAwLTAwOjAwPC9iaXJ0aGRheT4KKyAgICA8L3BlcnNvbj4KKyAgICA8cGVyc29uPgorICAgICAgPG5hbWU+Q3Jpc3RpYW5vIFJvbmFsZG88L25hbWU+CisgICAgICA8YmlydGhkYXk+MTk4NS0wMi0wNVQwMDowMDowMC0wMDowMDwvYmlydGhkYXk+CisgICAgPC9wZXJzb24+CisgICAgPHRlYW0+CisgICAgICA8bmFtZT5GQyBCYXJjZWxvbmE8L25hbWU+CisgICAgICA8cGxheWVyPgorICAgICAgICA8bmFtZT5MaW9uZWwgQW5kcu+/vXMgTWVzc2k8L25hbWU+CisgICAgICAgIDxzZWFzb24+Q2hhbXBpb25zIExlYWd1ZSAyMDE0LzIwMTU8L3NlYXNvbj4KKyAgICAgICAgPG51bWJlcj4xMDwvbnVtYmVyPgorICAgICAgICA8c2NvcmVzPjQzPC9zY29yZXM+CisgICAgICA8L3BsYXllcj4KKyAgICA8L3RlYW0+CisgICAgPHRlYW0+CisgICAgICA8bmFtZT5SZWFsIE1hZHJpZDwvbmFtZT4KKyAgICAgIDxwbGF5ZXI+CisgICAgICAgIDxuYW1lPkNyaXN0aWFubyBSb25hbGRvPC9uYW1lPgorICAgICAgICA8c2Vhc29uPkNoYW1waW9ucyBMZWFndWUgMjAxNC8yMDE1PC9zZWFzb24+CisgICAgICAgIDxudW1iZXI+NzwvbnVtYmVyPgorICAgICAgICA8c2NvcmVzPjQ4PC9zY29yZXM+CisgICAgICA8L3BsYXllcj4KKyAgICA8L3RlYW0+CisgIDwvc3BvcnRzPgorCisKKworPC9kYXRhPgorPC9kYXRhPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2pzb25BcnRpZmFjdC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvanNvbkFydGlmYWN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjYTU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL2pzb25BcnRpZmFjdC5qc29uCkBAIC0wLDAgKzEsMjIgQEAKK3sKKyAgICAiZ2xvc3NhcnkiOiB7CisgICAgICAgICJ0aXRsZSI6ICJleGFtcGxlIGdsb3NzYXJ5IiwKKwkJIkdsb3NzRGl2IjogeworICAgICAgICAgICAgInRpdGxlIjogIlMiLAorCQkJIkdsb3NzTGlzdCI6IHsKKyAgICAgICAgICAgICAgICAiR2xvc3NFbnRyeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgIklEIjogIlNHTUwiLAorCQkJCQkiU29ydEFzIjogIlNHTUwiLAorCQkJCQkiR2xvc3NUZXJtIjogIlN0YW5kYXJkIEdlbmVyYWxpemVkIE1hcmt1cCBMYW5ndWFnZSIsCisJCQkJCSJBY3JvbnltIjogIlNHTUwiLAorCQkJCQkiQWJicmV2IjogIklTTyA4ODc5OjE5ODYiLAorCQkJCQkiR2xvc3NEZWYiOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAicGFyYSI6ICJBIG1ldGEtbWFya3VwIGxhbmd1YWdlLCB1c2VkIHRvIGNyZWF0ZSBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgRG9jQm9vay4iLAorCQkJCQkJIkdsb3NzU2VlQWxzbyI6IFsiR01MIiwgIlhNTCJdCisgICAgICAgICAgICAgICAgICAgIH0sCisJCQkJCSJHbG9zc1NlZSI6ICJtYXJrdXAiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL290aGVyLnR4dCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL0hlYXREZXBsb3ltZW50QXJ0aWZhY3RzL290aGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjhmNzdjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvSGVhdERlcGxveW1lbnRBcnRpZmFjdHMvb3RoZXIudHh0CkBAIC0wLDAgKzEsMyBAQAorY21kMQorY21kMgorY21kMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL1Jlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMvYmx1ZVByaW50U2FtcGxlQXJ0aWZhY3QueG1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy9ibHVlUHJpbnRTYW1wbGVBcnRpZmFjdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjNDZiNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL1Jlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMvYmx1ZVByaW50U2FtcGxlQXJ0aWZhY3QueG1sCkBAIC0wLDAgKzEsMyBAQAorPHRlc3Q+CisJZGZzZnNkZnNkZgorPC90ZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL1Jlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMvZG9jU2FtcGxlQXJ0aWZhY3QuZG9jeCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL1Jlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMvZG9jU2FtcGxlQXJ0aWZhY3QuZG9jeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjgxZjUzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy9kb2NTYW1wbGVBcnRpZmFjdC5kb2N4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL1Jlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMvZW1mU2FtcGxlQXJ0aWZhY3QuZW1mIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy9lbWZTYW1wbGVBcnRpZmFjdC5lbWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0NzhmNgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL1Jlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMvZW1mU2FtcGxlQXJ0aWZhY3QuZW1mCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBpcyBzYW1wbGUgRU1GIGZpbGUKK1dlIGN1cnJlbnRseSBub3QgY2hlY2tpbmcgdGhlIGZpbGUgY29udGVudC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9SZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzL2VtZlNhbXBsZUFydGlmYWN0LnhtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL1Jlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMvZW1mU2FtcGxlQXJ0aWZhY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzQ2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9SZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzL2VtZlNhbXBsZUFydGlmYWN0LnhtbApAQCAtMCwwICsxLDMgQEAKKzx0ZXN0PgorCWRmc2ZzZGZzZGYKKzwvdGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9SZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzL2V2ZW50U2FtcGxlQXJ0aWZhY3QueG1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy9ldmVudFNhbXBsZUFydGlmYWN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGM0NmI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy9ldmVudFNhbXBsZUFydGlmYWN0LnhtbApAQCAtMCwwICsxLDMgQEAKKzx0ZXN0PgorCWRmc2ZzZGZzZGYKKzwvdGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9SZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzL2pzb25TYW1wbGVBcnRpZmFjdC5qc29uIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy9qc29uU2FtcGxlQXJ0aWZhY3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQ5YTllCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy9qc29uU2FtcGxlQXJ0aWZhY3QuanNvbgpAQCAtMCwwICsxLDMgQEAKK3sKKyAgICAidGVzdCI6ICJUaGlzIGlzIHRlc3QiCit9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9SZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzL3Rvc2NhU2FtcGxlQXJ0aWZhY3QueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy90b3NjYVNhbXBsZUFydGlmYWN0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGNjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cy90b3NjYVNhbXBsZUFydGlmYWN0LnltbApAQCAtMCwwICsxLDUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuQ1A6CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLnJvb3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9hZGRIZWF0QXJ0aWZhY3RUb1NlcnZpY2VBbmRTZXJ0aWZ5L2FzY19oZWF0IDAgMi55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvYWRkSGVhdEFydGlmYWN0VG9TZXJ2aWNlQW5kU2VydGlmeS9hc2NfaGVhdCAwIDIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM1NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvYWRkSGVhdEFydGlmYWN0VG9TZXJ2aWNlQW5kU2VydGlmeS9hc2NfaGVhdCAwIDIueWFtbApAQCAtMCwwICsxLDc4NyBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3RoZV9TQ1BfbmFtZQorICB2bmZfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBJRCBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3Roc19TQ1BfaWQKKworICBmbGF2b3Jfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3JfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgaW1hZ2Vfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2JlCisgIGltYWdlX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9mZSAgICAKKyAgaW1hZ2Vfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX3NtcAorICBpbWFnZV9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9kYgorCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4yIEZFIENsdXN0ZXIvS0EKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmsyIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4zIENsdXN0ZXIKKyAgaW50X3ZzY3BfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmszIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU40IERCCisgIGludF92c2NwX2RiX25ldHdvcmtfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrNCBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9BCisgIFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0IKKyAgQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBDUklDS0VUX09DUworICBPQU1fZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBPQU0KKyAgYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlM19PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZGIwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGRiMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgdm1fc2NwX2JlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0gICAgCisgIHZtX3NjcF9iZTJfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMgorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTNfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMworICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFNAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKworcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTBfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUyOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTIgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTJfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTJfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMzoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUzIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUzX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTNfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTNfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUzX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTQ6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlNCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlNF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlNF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzAgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUwX3BvcnRfMDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHN9fV0KKworICBmZTBfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzEgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUxX3BvcnRfMToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHN9fV0KKworICBmZTFfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIxX09BTV9kaXJlY3RfaXBzfX1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0U3VjY2Vzcy9vcmcub3BlbnN0YWNrLlJhbGx5LnppcCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2Rvd25sb2FkUmVzb3VyY2VBcnRpZmFjdFN1Y2Nlc3Mvb3JnLm9wZW5zdGFjay5SYWxseS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2Rvd25sb2FkUmVzb3VyY2VBcnRpZmFjdFN1Y2Nlc3Mvb3JnLm9wZW5zdGFjay5SYWxseS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdEZpbGVDb250ZW50VGVzdC9pbWFnZXMvbXlzcWwucG5nIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdEZpbGVDb250ZW50VGVzdC9pbWFnZXMvbXlzcWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0RmlsZUNvbnRlbnRUZXN0L2ltYWdlcy9teXNxbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdEZpbGVDb250ZW50VGVzdC9teXNxbC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0RmlsZUNvbnRlbnRUZXN0L215c3FsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTEyZjgwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdEZpbGVDb250ZW50VGVzdC9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC1nZXRSZXNvdXJjZUFydGlmYWN0RmlsZUNvbnRlbnRUZXN0Cit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjEuMS1TTkFQU0hPVAordGVtcGxhdGVfYXV0aG9yOiBGYXN0Q29ubmVjdAorCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2U6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVM6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgYWxpZW4ubm9kZXMuTXlzcWwtZ2V0UmVzb3VyY2VBcnRpZmFjdEZpbGVDb250ZW50VGVzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZQorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvbXlzcWwucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRiX3BvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMzMwNgorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLgorICAgICAgZGJfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIGRlZmF1bHQ6IHdvcmRwcmVzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICBkYl91c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHNwZWNpYWwgdXNlciBhY2NvdW50IHVzZWQgZm9yIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uLgorICAgICAgZGJfcGFzc3dvcmQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIOKAmGRiX3VzZXLigJkgcHJvcGVydHkuCisgICAgICBiaW5kX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogdHJ1ZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IElmIHRydWUsdGhlIHNlcnZlciBhY2NlcHRzIFRDUC9JUCBjb25uZWN0aW9ucyBvbiBhbGwgc2VydmVyIGhvc3QgSVB2NCBpbnRlcmZhY2VzLgorICAgICAgc3RvcmFnZV9wYXRoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogL21vdW50ZWRTdG9yYWdlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbICIvbW91bnRlZFN0b3JhZ2UiLCAiL3Zhci9teXNxbCIgXQorICAgIGludGVyZmFjZXM6CisgICAgICBTdGFuZGFyZDoKKyAgICAgICAgY3JlYXRlOiBzY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKKyAgICAgICAgc3RhcnQ6CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgVk9MVU1FX0hPTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgc3RvcmFnZV9wYXRoXSB9CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICAgIERCX05BTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfbmFtZV0gfQorICAgICAgICAgICAgREJfVVNFUjogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl91c2VyXSB9CisgICAgICAgICAgICBEQl9QQVNTV09SRDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wYXNzd29yZF0gfQorICAgICAgICAgICAgQklORF9BRFJFU1M6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgYmluZF9hZGRyZXNzXSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvc3RhcnRfbXlzcWwuc2gKKyAgICAgIGZhc3Rjb25uZWN0LmNsb3VkaWZ5LmV4dGVuc2lvbnM6CisgICAgICAgICBzdGFydF9kZXRlY3Rpb246CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvbXlzcWxfc3RhcnRfZGV0ZWN0aW9uLmdyb292eQorICAgIGFydGlmYWN0czoKKyAgICAgIC0gc2NyaXB0czogc2NyaXB0cworICAgICAgICB0eXBlOiB0b3NjYS5hcnRpZmFjdHMuRmlsZQorCitjYXBhYmlsaXR5X3R5cGVzOgorICBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZToKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorCithcnRpZmFjdF90eXBlczoKKyAgdG9zY2EuYXJ0aWZhY3RzLkdyb292eVNjcmlwdDoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0RmlsZUNvbnRlbnRUZXN0L3NjcmlwdHMvaW5zdGFsbF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RGaWxlQ29udGVudFRlc3Qvc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGJjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0RmlsZUNvbnRlbnRUZXN0L3NjcmlwdHMvaW5zdGFsbF9teXNxbC5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCitlY2hvICJEZWJpYW4gYmFzZWQgTVlTUUwgaW5zdGFsbCA1Li4uIgorTE9DSz0iL3RtcC9sb2NrYXB0Z2V0IgorCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJHtMT0NLfSIgJj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICJNeVNRTCB0YWtlIHRoZSBsb2NrIgorICAgIGJyZWFrOworICBmaQorICBlY2hvICJXYWl0aW5nIHRoZSBlbmQgb2Ygb25lIG9mIG91ciByZWNpcGVzLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKKword2hpbGUgc3VkbyBmdXNlciAvdmFyL2xpYi9kcGtnL2xvY2sgPi9kZXYvbnVsbCAyPiYxIDsgZG8KKyAgZWNobyAiV2FpdGluZyBmb3Igb3RoZXIgc29mdHdhcmUgbWFuYWdlcnMgdG8gZmluaXNoLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKK3N1ZG8gcm0gLWYgL3Zhci9saWIvZHBrZy9sb2NrCisKK3N1ZG8gYXB0LWdldCB1cGRhdGUgfHwgKHNsZWVwIDE1OyBzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IGV4aXQgJHsxfSkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgLXkgaW5zdGFsbCBteXNxbC1zZXJ2ZXItNS41IHB3Z2VuIHx8IGV4aXQgJHsxfQorcm0gLXJmICIke0xPQ0t9IgorCitzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKK3N1ZG8gcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qCitzdWRvIHJtIC1yZiAvdmFyL2xpYi9teXNxbC8qCitlY2hvICJNeVNRTCBJbnN0YWxsYXRpb24gY29tcGxldGUuIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RGaWxlQ29udGVudFRlc3Qvc2NyaXB0cy9zdGFydF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RGaWxlQ29udGVudFRlc3Qvc2NyaXB0cy9zdGFydF9teXNxbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhiZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdEZpbGVDb250ZW50VGVzdC9zY3JpcHRzL3N0YXJ0X215c3FsLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vYmFzaAorCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5WIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkVOViBWQVIgVVNFRCBWT0xVTUVfSE9NRSA6ICRWT0xVTUVfSE9NRSIKK2VjaG8gIkVOViBWQVIgVVNFRCBQT1JUICAgICAgICA6ICRQT1JUIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX05BTUUgICAgIDogJERCX05BTUUiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfVVNFUiAgICAgOiAkREJfVVNFUiIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9QQVNTV09SRCA6ICREQl9QQVNTV09SRCIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCitDVVJSRU5UX1BBVEg9YGRpcm5hbWUgIiQwImAKKworZnVuY3Rpb24gU3RhcnRNeVNRTCB7CisgIGVjaG8gIlN0YXJ0aW5nIE1ZU1FMLi4uIgorICBzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKKyAgc3VkbyAvdXNyL2Jpbi9teXNxbGRfc2FmZSA+IC9kZXYvbnVsbCAyPiYxICYKKyAgUkVUPTEKKyAgd2hpbGUgW1sgUkVUIC1uZSAwIF1dOyBkbworICAgIGVjaG8gIj0+IFdhaXRpbmcgZm9yIGNvbmZpcm1hdGlvbiBvZiBNeVNRTCBzZXJ2aWNlIHN0YXJ0dXAiCisgICAgc2xlZXAgNQorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJzdGF0dXMiID4gL2Rldi9udWxsIDI+JjEKKyAgICBSRVQ9JD8KKyAgZG9uZQorfQorCitmdW5jdGlvbiBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMIHsKKyAgTVlTUUxfREFUQV9ESVI9JFZPTFVNRV9IT01FL2RhdGEKKyAgTVlTUUxfTE9HPSRWT0xVTUVfSE9NRS9sb2dzCisKKyAgZWNobyAiU2V0dGluZyBkYXRhIGRpcmVjdG9yeSB0byAkTVlTUUxfREFUQV9ESVIgYW4gbG9ncyB0byAkTVlTUUxfTE9HIC4uLiIKKyAgaWYgc3VkbyB0ZXN0ICEgLWQgJE1ZU1FMX0RBVEFfRElSOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgREFUQSBkaXIgPiAkTVlTUUxfREFUQV9ESVIgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0RBVEFfRElSCisgICAgIyBteXNxbCBhcyBvd25lciBhbmQgZ3JvdXAgb3duZXIKKyAgICBzdWRvIGNob3duIC1SIG15c3FsOm15c3FsICRNWVNRTF9EQVRBX0RJUgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZCAkTVlTUUxfTE9HOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgTE9HIGRpciA+ICRNWVNRTF9MT0cgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0xPRworICAgICMgbXlzcWwgYXMgb3duZXIgYW5kIGdyb3VwIG93bmVyCisgICAgc3VkbyBjaG93biAtUiBteXNxbDpteXNxbCAkTVlTUUxfTE9HCisgIGZpCisKKyAgIyBlZGl0IGFwcCBteXNxbCBwZXJtaXNzaW9uIGluIDogL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBDT1VOVF9MSU5FPWBzdWRvIGNhdCAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkIHwgd2MgLWxgCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0RBVEFfRElSLyByLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9EQVRBX0RJUi8qKiByd2ssIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0xPRy8gciwiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfTE9HLyoqIHJ3aywiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKworICAjIHJlbG9hZCBhcHAgcGVybWlzc2lvbiBtYW5hZ2VyIHNlcnZpY2UKKyAgc3VkbyBzZXJ2aWNlIGFwcGFybW9yIHJlbG9hZAorfQorCitmdW5jdGlvbiBVcGRhdGVNeVNRTENvbmYgeworICBlY2hvICJVcGRhdGluZyBNeVNRTCBjb25mIGZpbGVzIFtEQVRBLCBMT0dTXS4uLiIKKyAgc3VkbyBzZWQgLWkgInM6L3Zhci9saWIvbXlzcWw6JE1ZU1FMX0RBVEFfRElSOmciIC9ldGMvbXlzcWwvbXkuY25mCisgIHN1ZG8gc2VkIC1pICJzOi92YXIvbG9nL215c3FsL2Vycm9yLmxvZzokTVlTUUxfTE9HL2Vycm9yLmxvZzpnIiAvZXRjL215c3FsL215LmNuZgorICBzdWRvIHNlZCAtaSAiczozMzA2OiRQT1JUOmciIC9ldGMvbXlzcWwvbXkuY25mCisKKyAgaWYgc3VkbyB0ZXN0ICEgLWYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZjsgdGhlbgorICAgIHN1ZG8gY3AgL2V0Yy9teXNxbC9teS5jbmYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmY7IHRoZW4KKyAgICBzdWRvIGNwICRjb25maWdzL215c3FsZF9jaGFyc2V0LmNuZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmYKKyAgZmkKKworICBpZiBbICIkQklORF9BRFJFU1MiID09ICJ0cnVlIiBdOyB0aGVuCisgICAgc3VkbyBzZWQgLWkgInMvYmluZC1hZGRyZXNzLiovYmluZC1hZGRyZXNzID0gMC4wLjAuMC8iIC9ldGMvbXlzcWwvbXkuY25mCisgIGZpCit9CisKK2Z1bmN0aW9uIEluaXRNeVNRTERiIHsKKyAgIyBjcmVhdGUgZGF0YWJhc2UgREJfTkFNRQorICBpZiBbICIkREJfTkFNRSIgXTsgdGhlbgorICAgIGVjaG8gIklOSVQgREFUQUJBU0UgJERCX05BTUUiCisgICAgc3VkbyBteXNxbCAtdSByb290IC1lICJDUkVBVEUgREFUQUJBU0UgJERCX05BTUUiOworICBmaQorCisgICMgY3JlYXRlIHVzZXIgYW5kIGdpdmUgcmlnaHRzCisgIGlmIFsgIiREQl9VU0VSIiBdOyB0aGVuCisgICAgZWNobyAiQ1JFQVRFIFVTRVIgJERCX1VTRVIgV0lUSCBQQVNTV09SRCAkREJfUEFTU1dPUkQgQU5EIEdSQU5EIFJJR0hUUyBPTiAkREJfTkFNRSIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiQ1JFQVRFIFVTRVIgJyR7REJfVVNFUn0nQCclJyBJREVOVElGSUVEIEJZICckREJfUEFTU1dPUkQnIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiAke0RCX05BTUV9LiogVE8gJyR7REJfVVNFUn0nQCclJyBXSVRIIEdSQU5UIE9QVElPTiIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiRkxVU0ggUFJJVklMRUdFUyIKKyAgZmkKK30KKworIyBDcmVhdGUgYSBuZXcgZGF0YWJhc2UgcGF0aCB0byB0aGUgYXR0Y2hlZCB2b2x1bWUKK2lmIHN1ZG8gdGVzdCAhIC1kICRWT0xVTUVfSE9NRS9kYXRhOyB0aGVuCisgIGVjaG8gIj0+IEFuIGVtcHR5IG9yIHVuaW5pdGlhbGl6ZWQgTXlTUUwgdm9sdW1lIGlzIGRldGVjdGVkIGluICRWT0xVTUVfSE9NRS9kYXRhIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorICBlY2hvICI9PiBJbml0IG5ldyBkYXRhYmFzZSBwYXRoIHRvICRNWVNRTF9EQVRBX0RJUiIKKyAgc3VkbyBteXNxbF9pbnN0YWxsX2RiIC0tYmFzZWRpcj0vdXNyIC0tZGF0YWRpcj0kTVlTUUxfREFUQV9ESVIKKyAgZWNobyAiPT4gTXlTUUwgZGF0YWJhc2UgaW5pdGlhbGl6ZWQgISIKK2Vsc2UKKyAgZWNobyAiPT4gVXNpbmcgYW4gZXhpc3Rpbmcgdm9sdW1lIG9mIE15U1FMIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorZmkKKworIyBGaW5hbGx5IHN0YXJ0IE15U1FMIHdpdGggbmV3IGNvbmZpZ3VyYXRpb24KK1N0YXJ0TXlTUUwKK0luaXRNeVNRTERiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0L215c3FsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC9teXNxbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZTI0NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC1nZXRSZXNvdXJjZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QKK3RlbXBsYXRlX3ZlcnNpb246IDEuMS4xLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUzoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICBhbGllbi5ub2Rlcy5NeXNxbC1nZXRSZXNvdXJjZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBBIG5vZGUgdG8gaW5zdGFsbCBNeVNRTCB2NS41IGRhdGFiYXNlIHdpdGggZGF0YQorICAgICAgb24gYSBzcGVjaWZpYyBhdHRhY2hlZCB2b2x1bWUuCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2U6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Hcm9vdnlTY3JpcHQ6CisgICAgZGVzY3JpcHRpb246IEEgZ3Jvb3Z5IHNjcmlwdCAoLmdyb292eSBmaWxlKQorICAgIGZpbGVfZXh0OiBbZ3Jvb3Z5XQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdExpc3RUZXN0L2ltYWdlcy9teXNxbC5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0TGlzdFRlc3QvaW1hZ2VzL215c3FsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTAyZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdExpc3RUZXN0L2ltYWdlcy9teXNxbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdExpc3RUZXN0L215c3FsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RMaXN0VGVzdC9teXNxbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmOWJiZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RMaXN0VGVzdC9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC1HZXRSZXNvdXJjZUFydGlmYWN0TGlzdFRlc3QKK3RlbXBsYXRlX3ZlcnNpb246IDEuMS4xLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUzoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICBhbGllbi5ub2Rlcy5NeXNxbC1HZXRSZXNvdXJjZUFydGlmYWN0TGlzdFRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBBIG5vZGUgdG8gaW5zdGFsbCBNeVNRTCB2NS41IGRhdGFiYXNlIHdpdGggZGF0YQorICAgICAgb24gYSBzcGVjaWZpYyBhdHRhY2hlZCB2b2x1bWUuCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2U6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Hcm9vdnlTY3JpcHQ6CisgICAgZGVzY3JpcHRpb246IEEgZ3Jvb3Z5IHNjcmlwdCAoLmdyb292eSBmaWxlKQorICAgIGZpbGVfZXh0OiBbZ3Jvb3Z5XQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdExpc3RUZXN0L3NjcmlwdHMvaW5zdGFsbF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RMaXN0VGVzdC9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RMaXN0VGVzdC9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiRGViaWFuIGJhc2VkIE1ZU1FMIGluc3RhbGwgNS4uLiIKK0xPQ0s9Ii90bXAvbG9ja2FwdGdldCIKKword2hpbGUgdHJ1ZTsgZG8KKyAgaWYgbWtkaXIgIiR7TE9DS30iICY+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiTXlTUUwgdGFrZSB0aGUgbG9jayIKKyAgICBicmVhazsKKyAgZmkKKyAgZWNobyAiV2FpdGluZyB0aGUgZW5kIG9mIG9uZSBvZiBvdXIgcmVjaXBlcy4uLiIKKyAgc2xlZXAgMC41Citkb25lCisKK3doaWxlIHN1ZG8gZnVzZXIgL3Zhci9saWIvZHBrZy9sb2NrID4vZGV2L251bGwgMj4mMSA7IGRvCisgIGVjaG8gIldhaXRpbmcgZm9yIG90aGVyIHNvZnR3YXJlIG1hbmFnZXJzIHRvIGZpbmlzaC4uLiIKKyAgc2xlZXAgMC41Citkb25lCitzdWRvIHJtIC1mIC92YXIvbGliL2Rwa2cvbG9jaworCitzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IChzbGVlcCAxNTsgc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCBleGl0ICR7MX0pCitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IC15IGluc3RhbGwgbXlzcWwtc2VydmVyLTUuNSBwd2dlbiB8fCBleGl0ICR7MX0KK3JtIC1yZiAiJHtMT0NLfSIKKworc3VkbyAvZXRjL2luaXQuZC9teXNxbCBzdG9wCitzdWRvIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgorc3VkbyBybSAtcmYgL3Zhci9saWIvbXlzcWwvKgorZWNobyAiTXlTUUwgSW5zdGFsbGF0aW9uIGNvbXBsZXRlLiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0TGlzdFRlc3Qvc2NyaXB0cy9zdGFydF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RMaXN0VGVzdC9zY3JpcHRzL3N0YXJ0X215c3FsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0TGlzdFRlc3Qvc2NyaXB0cy9zdGFydF9teXNxbC5zaApAQCAtMCwwICsxLDEwNSBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVOViAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICJFTlYgVkFSIFVTRUQgVk9MVU1FX0hPTUUgOiAkVk9MVU1FX0hPTUUiCitlY2hvICJFTlYgVkFSIFVTRUQgUE9SVCAgICAgICAgOiAkUE9SVCIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9OQU1FICAgICA6ICREQl9OQU1FIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX1VTRVIgICAgIDogJERCX1VTRVIiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfUEFTU1dPUkQgOiAkREJfUEFTU1dPUkQiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworQ1VSUkVOVF9QQVRIPWBkaXJuYW1lICIkMCJgCisKK2Z1bmN0aW9uIFN0YXJ0TXlTUUwgeworICBlY2hvICJTdGFydGluZyBNWVNRTC4uLiIKKyAgc3VkbyAvZXRjL2luaXQuZC9teXNxbCBzdG9wCisgIHN1ZG8gL3Vzci9iaW4vbXlzcWxkX3NhZmUgPiAvZGV2L251bGwgMj4mMSAmCisgIFJFVD0xCisgIHdoaWxlIFtbIFJFVCAtbmUgMCBdXTsgZG8KKyAgICBlY2hvICI9PiBXYWl0aW5nIGZvciBjb25maXJtYXRpb24gb2YgTXlTUUwgc2VydmljZSBzdGFydHVwIgorICAgIHNsZWVwIDUKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAic3RhdHVzIiA+IC9kZXYvbnVsbCAyPiYxCisgICAgUkVUPSQ/CisgIGRvbmUKK30KKworZnVuY3Rpb24gQWxsb3dGaWxlU3lzdGVtVG9NeVNRTCB7CisgIE1ZU1FMX0RBVEFfRElSPSRWT0xVTUVfSE9NRS9kYXRhCisgIE1ZU1FMX0xPRz0kVk9MVU1FX0hPTUUvbG9ncworCisgIGVjaG8gIlNldHRpbmcgZGF0YSBkaXJlY3RvcnkgdG8gJE1ZU1FMX0RBVEFfRElSIGFuIGxvZ3MgdG8gJE1ZU1FMX0xPRyAuLi4iCisgIGlmIHN1ZG8gdGVzdCAhIC1kICRNWVNRTF9EQVRBX0RJUjsgdGhlbgorICAgIGVjaG8gIkNyZWF0aW5nIERBVEEgZGlyID4gJE1ZU1FMX0RBVEFfRElSIC4uLiIKKyAgICBzdWRvIG1rZGlyIC1wICRNWVNRTF9EQVRBX0RJUgorICAgICMgbXlzcWwgYXMgb3duZXIgYW5kIGdyb3VwIG93bmVyCisgICAgc3VkbyBjaG93biAtUiBteXNxbDpteXNxbCAkTVlTUUxfREFUQV9ESVIKKyAgZmkKKyAgaWYgc3VkbyB0ZXN0ICEgLWQgJE1ZU1FMX0xPRzsgdGhlbgorICAgIGVjaG8gIkNyZWF0aW5nIExPRyBkaXIgPiAkTVlTUUxfTE9HIC4uLiIKKyAgICBzdWRvIG1rZGlyIC1wICRNWVNRTF9MT0cKKyAgICAjIG15c3FsIGFzIG93bmVyIGFuZCBncm91cCBvd25lcgorICAgIHN1ZG8gY2hvd24gLVIgbXlzcWw6bXlzcWwgJE1ZU1FMX0xPRworICBmaQorCisgICMgZWRpdCBhcHAgbXlzcWwgcGVybWlzc2lvbiBpbiA6IC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgQ09VTlRfTElORT1gc3VkbyBjYXQgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZCB8IHdjIC1sYAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9EQVRBX0RJUi8gciwiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfREFUQV9ESVIvKiogcndrLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9MT0cvIHIsIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0xPRy8qKiByd2ssIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisKKyAgIyByZWxvYWQgYXBwIHBlcm1pc3Npb24gbWFuYWdlciBzZXJ2aWNlCisgIHN1ZG8gc2VydmljZSBhcHBhcm1vciByZWxvYWQKK30KKworZnVuY3Rpb24gVXBkYXRlTXlTUUxDb25mIHsKKyAgZWNobyAiVXBkYXRpbmcgTXlTUUwgY29uZiBmaWxlcyBbREFUQSwgTE9HU10uLi4iCisgIHN1ZG8gc2VkIC1pICJzOi92YXIvbGliL215c3FsOiRNWVNRTF9EQVRBX0RJUjpnIiAvZXRjL215c3FsL215LmNuZgorICBzdWRvIHNlZCAtaSAiczovdmFyL2xvZy9teXNxbC9lcnJvci5sb2c6JE1ZU1FMX0xPRy9lcnJvci5sb2c6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgc3VkbyBzZWQgLWkgInM6MzMwNjokUE9SVDpnIiAvZXRjL215c3FsL215LmNuZgorCisgIGlmIHN1ZG8gdGVzdCAhIC1mIC91c3Ivc2hhcmUvbXlzcWwvbXktZGVmYXVsdC5jbmY7IHRoZW4KKyAgICBzdWRvIGNwIC9ldGMvbXlzcWwvbXkuY25mIC91c3Ivc2hhcmUvbXlzcWwvbXktZGVmYXVsdC5jbmYKKyAgZmkKKyAgaWYgc3VkbyB0ZXN0ICEgLWYgL2V0Yy9teXNxbC9jb25mLmQvbXlzcWxkX2NoYXJzZXQuY25mOyB0aGVuCisgICAgc3VkbyBjcCAkY29uZmlncy9teXNxbGRfY2hhcnNldC5jbmYgL2V0Yy9teXNxbC9jb25mLmQvbXlzcWxkX2NoYXJzZXQuY25mCisgIGZpCisKKyAgaWYgWyAiJEJJTkRfQURSRVNTIiA9PSAidHJ1ZSIgXTsgdGhlbgorICAgIHN1ZG8gc2VkIC1pICJzL2JpbmQtYWRkcmVzcy4qL2JpbmQtYWRkcmVzcyA9IDAuMC4wLjAvIiAvZXRjL215c3FsL215LmNuZgorICBmaQorfQorCitmdW5jdGlvbiBJbml0TXlTUUxEYiB7CisgICMgY3JlYXRlIGRhdGFiYXNlIERCX05BTUUKKyAgaWYgWyAiJERCX05BTUUiIF07IHRoZW4KKyAgICBlY2hvICJJTklUIERBVEFCQVNFICREQl9OQU1FIgorICAgIHN1ZG8gbXlzcWwgLXUgcm9vdCAtZSAiQ1JFQVRFIERBVEFCQVNFICREQl9OQU1FIjsKKyAgZmkKKworICAjIGNyZWF0ZSB1c2VyIGFuZCBnaXZlIHJpZ2h0cworICBpZiBbICIkREJfVVNFUiIgXTsgdGhlbgorICAgIGVjaG8gIkNSRUFURSBVU0VSICREQl9VU0VSIFdJVEggUEFTU1dPUkQgJERCX1BBU1NXT1JEIEFORCBHUkFORCBSSUdIVFMgT04gJERCX05BTUUiCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkNSRUFURSBVU0VSICcke0RCX1VTRVJ9J0AnJScgSURFTlRJRklFRCBCWSAnJERCX1BBU1NXT1JEJyIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gJHtEQl9OQU1FfS4qIFRPICcke0RCX1VTRVJ9J0AnJScgV0lUSCBHUkFOVCBPUFRJT04iCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkZMVVNIIFBSSVZJTEVHRVMiCisgIGZpCit9CisKKyMgQ3JlYXRlIGEgbmV3IGRhdGFiYXNlIHBhdGggdG8gdGhlIGF0dGNoZWQgdm9sdW1lCitpZiBzdWRvIHRlc3QgISAtZCAkVk9MVU1FX0hPTUUvZGF0YTsgdGhlbgorICBlY2hvICI9PiBBbiBlbXB0eSBvciB1bmluaXRpYWxpemVkIE15U1FMIHZvbHVtZSBpcyBkZXRlY3RlZCBpbiAkVk9MVU1FX0hPTUUvZGF0YSIKKyAgQWxsb3dGaWxlU3lzdGVtVG9NeVNRTAorICBVcGRhdGVNeVNRTENvbmYKKyAgZWNobyAiPT4gSW5pdCBuZXcgZGF0YWJhc2UgcGF0aCB0byAkTVlTUUxfREFUQV9ESVIiCisgIHN1ZG8gbXlzcWxfaW5zdGFsbF9kYiAtLWJhc2VkaXI9L3VzciAtLWRhdGFkaXI9JE1ZU1FMX0RBVEFfRElSCisgIGVjaG8gIj0+IE15U1FMIGRhdGFiYXNlIGluaXRpYWxpemVkICEiCitlbHNlCisgIGVjaG8gIj0+IFVzaW5nIGFuIGV4aXN0aW5nIHZvbHVtZSBvZiBNeVNRTCIKKyAgQWxsb3dGaWxlU3lzdGVtVG9NeVNRTAorICBVcGRhdGVNeVNRTENvbmYKK2ZpCisKKyMgRmluYWxseSBzdGFydCBNeVNRTCB3aXRoIG5ldyBjb25maWd1cmF0aW9uCitTdGFydE15U1FMCitJbml0TXlTUUxEYgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RNZXRhZGF0YU5vQ29udGVudFRlc3QvbXlzcWwueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhTm9Db250ZW50VGVzdC9teXNxbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmZjRmMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RNZXRhZGF0YU5vQ29udGVudFRlc3QvbXlzcWwueW1sCkBAIC0wLDAgKzEsODUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKK2Rlc2NyaXB0aW9uOiBNeVNRTCBSREJNUyBpbnN0YWxsYXRpb24gb24gYSBzcGVjaWZpYyBtb3VudGVkIHZvbHVtZSBwYXRoLgordGVtcGxhdGVfbmFtZTogbXlzcWwtZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhTm9Db250ZW50VGVzdAordGVtcGxhdGVfdmVyc2lvbjogMS4xLjEtU05BUFNIT1QKK3RlbXBsYXRlX2F1dGhvcjogRmFzdENvbm5lY3QKKworaW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGU6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLk15c3FsLWdldFJlc291cmNlQXJ0aWZhY3RNZXRhZGF0YU5vQ29udGVudFRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBBIG5vZGUgdG8gaW5zdGFsbCBNeVNRTCB2NS41IGRhdGFiYXNlIHdpdGggZGF0YQorICAgICAgb24gYSBzcGVjaWZpYyBhdHRhY2hlZCB2b2x1bWUuCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2U6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Hcm9vdnlTY3JpcHQ6CisgICAgZGVzY3JpcHRpb246IEEgZ3Jvb3Z5IHNjcmlwdCAoLmdyb292eSBmaWxlKQorICAgIGZpbGVfZXh0OiBbZ3Jvb3Z5XQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhVGVzdC9pbWFnZXMvbXlzcWwucG5nIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhVGVzdC9pbWFnZXMvbXlzcWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0TWV0YWRhdGFUZXN0L2ltYWdlcy9teXNxbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhVGVzdC9teXNxbC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0TWV0YWRhdGFUZXN0L215c3FsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjdlNGEwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhVGVzdC9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC1nZXRSZXNvdXJjZUFydGlmYWN0TWV0YWRhdGFUZXN0Cit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjEuMS1TTkFQU0hPVAordGVtcGxhdGVfYXV0aG9yOiBGYXN0Q29ubmVjdAorCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2U6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVM6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgYWxpZW4ubm9kZXMuTXlzcWwtZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhVGVzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZQorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvbXlzcWwucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRiX3BvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMzMwNgorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLgorICAgICAgZGJfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIGRlZmF1bHQ6IHdvcmRwcmVzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICBkYl91c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHNwZWNpYWwgdXNlciBhY2NvdW50IHVzZWQgZm9yIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uLgorICAgICAgZGJfcGFzc3dvcmQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIOKAmGRiX3VzZXLigJkgcHJvcGVydHkuCisgICAgICBiaW5kX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogdHJ1ZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IElmIHRydWUsdGhlIHNlcnZlciBhY2NlcHRzIFRDUC9JUCBjb25uZWN0aW9ucyBvbiBhbGwgc2VydmVyIGhvc3QgSVB2NCBpbnRlcmZhY2VzLgorICAgICAgc3RvcmFnZV9wYXRoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogL21vdW50ZWRTdG9yYWdlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbICIvbW91bnRlZFN0b3JhZ2UiLCAiL3Zhci9teXNxbCIgXQorICAgIGludGVyZmFjZXM6CisgICAgICBTdGFuZGFyZDoKKyAgICAgICAgY3JlYXRlOiBzY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKKyAgICAgICAgc3RhcnQ6CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgVk9MVU1FX0hPTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgc3RvcmFnZV9wYXRoXSB9CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICAgIERCX05BTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfbmFtZV0gfQorICAgICAgICAgICAgREJfVVNFUjogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl91c2VyXSB9CisgICAgICAgICAgICBEQl9QQVNTV09SRDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wYXNzd29yZF0gfQorICAgICAgICAgICAgQklORF9BRFJFU1M6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgYmluZF9hZGRyZXNzXSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvc3RhcnRfbXlzcWwuc2gKKyAgICAgIGZhc3Rjb25uZWN0LmNsb3VkaWZ5LmV4dGVuc2lvbnM6CisgICAgICAgICBzdGFydF9kZXRlY3Rpb246CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvbXlzcWxfc3RhcnRfZGV0ZWN0aW9uLmdyb292eQorICAgIGFydGlmYWN0czoKKyAgICAgIC0gc2NyaXB0czogc2NyaXB0cworICAgICAgICB0eXBlOiB0b3NjYS5hcnRpZmFjdHMuRmlsZQorCitjYXBhYmlsaXR5X3R5cGVzOgorICBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZToKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorCithcnRpZmFjdF90eXBlczoKKyAgdG9zY2EuYXJ0aWZhY3RzLkdyb292eVNjcmlwdDoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0TWV0YWRhdGFUZXN0L3NjcmlwdHMvaW5zdGFsbF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RNZXRhZGF0YVRlc3Qvc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGJjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRSZXNvdXJjZUFydGlmYWN0TWV0YWRhdGFUZXN0L3NjcmlwdHMvaW5zdGFsbF9teXNxbC5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCitlY2hvICJEZWJpYW4gYmFzZWQgTVlTUUwgaW5zdGFsbCA1Li4uIgorTE9DSz0iL3RtcC9sb2NrYXB0Z2V0IgorCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJHtMT0NLfSIgJj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICJNeVNRTCB0YWtlIHRoZSBsb2NrIgorICAgIGJyZWFrOworICBmaQorICBlY2hvICJXYWl0aW5nIHRoZSBlbmQgb2Ygb25lIG9mIG91ciByZWNpcGVzLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKKword2hpbGUgc3VkbyBmdXNlciAvdmFyL2xpYi9kcGtnL2xvY2sgPi9kZXYvbnVsbCAyPiYxIDsgZG8KKyAgZWNobyAiV2FpdGluZyBmb3Igb3RoZXIgc29mdHdhcmUgbWFuYWdlcnMgdG8gZmluaXNoLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKK3N1ZG8gcm0gLWYgL3Zhci9saWIvZHBrZy9sb2NrCisKK3N1ZG8gYXB0LWdldCB1cGRhdGUgfHwgKHNsZWVwIDE1OyBzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IGV4aXQgJHsxfSkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgLXkgaW5zdGFsbCBteXNxbC1zZXJ2ZXItNS41IHB3Z2VuIHx8IGV4aXQgJHsxfQorcm0gLXJmICIke0xPQ0t9IgorCitzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKK3N1ZG8gcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qCitzdWRvIHJtIC1yZiAvdmFyL2xpYi9teXNxbC8qCitlY2hvICJNeVNRTCBJbnN0YWxsYXRpb24gY29tcGxldGUuIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RNZXRhZGF0YVRlc3Qvc2NyaXB0cy9zdGFydF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RNZXRhZGF0YVRlc3Qvc2NyaXB0cy9zdGFydF9teXNxbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhiZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhVGVzdC9zY3JpcHRzL3N0YXJ0X215c3FsLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vYmFzaAorCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5WIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkVOViBWQVIgVVNFRCBWT0xVTUVfSE9NRSA6ICRWT0xVTUVfSE9NRSIKK2VjaG8gIkVOViBWQVIgVVNFRCBQT1JUICAgICAgICA6ICRQT1JUIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX05BTUUgICAgIDogJERCX05BTUUiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfVVNFUiAgICAgOiAkREJfVVNFUiIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9QQVNTV09SRCA6ICREQl9QQVNTV09SRCIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCitDVVJSRU5UX1BBVEg9YGRpcm5hbWUgIiQwImAKKworZnVuY3Rpb24gU3RhcnRNeVNRTCB7CisgIGVjaG8gIlN0YXJ0aW5nIE1ZU1FMLi4uIgorICBzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKKyAgc3VkbyAvdXNyL2Jpbi9teXNxbGRfc2FmZSA+IC9kZXYvbnVsbCAyPiYxICYKKyAgUkVUPTEKKyAgd2hpbGUgW1sgUkVUIC1uZSAwIF1dOyBkbworICAgIGVjaG8gIj0+IFdhaXRpbmcgZm9yIGNvbmZpcm1hdGlvbiBvZiBNeVNRTCBzZXJ2aWNlIHN0YXJ0dXAiCisgICAgc2xlZXAgNQorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJzdGF0dXMiID4gL2Rldi9udWxsIDI+JjEKKyAgICBSRVQ9JD8KKyAgZG9uZQorfQorCitmdW5jdGlvbiBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMIHsKKyAgTVlTUUxfREFUQV9ESVI9JFZPTFVNRV9IT01FL2RhdGEKKyAgTVlTUUxfTE9HPSRWT0xVTUVfSE9NRS9sb2dzCisKKyAgZWNobyAiU2V0dGluZyBkYXRhIGRpcmVjdG9yeSB0byAkTVlTUUxfREFUQV9ESVIgYW4gbG9ncyB0byAkTVlTUUxfTE9HIC4uLiIKKyAgaWYgc3VkbyB0ZXN0ICEgLWQgJE1ZU1FMX0RBVEFfRElSOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgREFUQSBkaXIgPiAkTVlTUUxfREFUQV9ESVIgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0RBVEFfRElSCisgICAgIyBteXNxbCBhcyBvd25lciBhbmQgZ3JvdXAgb3duZXIKKyAgICBzdWRvIGNob3duIC1SIG15c3FsOm15c3FsICRNWVNRTF9EQVRBX0RJUgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZCAkTVlTUUxfTE9HOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgTE9HIGRpciA+ICRNWVNRTF9MT0cgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0xPRworICAgICMgbXlzcWwgYXMgb3duZXIgYW5kIGdyb3VwIG93bmVyCisgICAgc3VkbyBjaG93biAtUiBteXNxbDpteXNxbCAkTVlTUUxfTE9HCisgIGZpCisKKyAgIyBlZGl0IGFwcCBteXNxbCBwZXJtaXNzaW9uIGluIDogL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBDT1VOVF9MSU5FPWBzdWRvIGNhdCAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkIHwgd2MgLWxgCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0RBVEFfRElSLyByLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9EQVRBX0RJUi8qKiByd2ssIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0xPRy8gciwiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfTE9HLyoqIHJ3aywiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKworICAjIHJlbG9hZCBhcHAgcGVybWlzc2lvbiBtYW5hZ2VyIHNlcnZpY2UKKyAgc3VkbyBzZXJ2aWNlIGFwcGFybW9yIHJlbG9hZAorfQorCitmdW5jdGlvbiBVcGRhdGVNeVNRTENvbmYgeworICBlY2hvICJVcGRhdGluZyBNeVNRTCBjb25mIGZpbGVzIFtEQVRBLCBMT0dTXS4uLiIKKyAgc3VkbyBzZWQgLWkgInM6L3Zhci9saWIvbXlzcWw6JE1ZU1FMX0RBVEFfRElSOmciIC9ldGMvbXlzcWwvbXkuY25mCisgIHN1ZG8gc2VkIC1pICJzOi92YXIvbG9nL215c3FsL2Vycm9yLmxvZzokTVlTUUxfTE9HL2Vycm9yLmxvZzpnIiAvZXRjL215c3FsL215LmNuZgorICBzdWRvIHNlZCAtaSAiczozMzA2OiRQT1JUOmciIC9ldGMvbXlzcWwvbXkuY25mCisKKyAgaWYgc3VkbyB0ZXN0ICEgLWYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZjsgdGhlbgorICAgIHN1ZG8gY3AgL2V0Yy9teXNxbC9teS5jbmYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmY7IHRoZW4KKyAgICBzdWRvIGNwICRjb25maWdzL215c3FsZF9jaGFyc2V0LmNuZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmYKKyAgZmkKKworICBpZiBbICIkQklORF9BRFJFU1MiID09ICJ0cnVlIiBdOyB0aGVuCisgICAgc3VkbyBzZWQgLWkgInMvYmluZC1hZGRyZXNzLiovYmluZC1hZGRyZXNzID0gMC4wLjAuMC8iIC9ldGMvbXlzcWwvbXkuY25mCisgIGZpCit9CisKK2Z1bmN0aW9uIEluaXRNeVNRTERiIHsKKyAgIyBjcmVhdGUgZGF0YWJhc2UgREJfTkFNRQorICBpZiBbICIkREJfTkFNRSIgXTsgdGhlbgorICAgIGVjaG8gIklOSVQgREFUQUJBU0UgJERCX05BTUUiCisgICAgc3VkbyBteXNxbCAtdSByb290IC1lICJDUkVBVEUgREFUQUJBU0UgJERCX05BTUUiOworICBmaQorCisgICMgY3JlYXRlIHVzZXIgYW5kIGdpdmUgcmlnaHRzCisgIGlmIFsgIiREQl9VU0VSIiBdOyB0aGVuCisgICAgZWNobyAiQ1JFQVRFIFVTRVIgJERCX1VTRVIgV0lUSCBQQVNTV09SRCAkREJfUEFTU1dPUkQgQU5EIEdSQU5EIFJJR0hUUyBPTiAkREJfTkFNRSIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiQ1JFQVRFIFVTRVIgJyR7REJfVVNFUn0nQCclJyBJREVOVElGSUVEIEJZICckREJfUEFTU1dPUkQnIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiAke0RCX05BTUV9LiogVE8gJyR7REJfVVNFUn0nQCclJyBXSVRIIEdSQU5UIE9QVElPTiIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiRkxVU0ggUFJJVklMRUdFUyIKKyAgZmkKK30KKworIyBDcmVhdGUgYSBuZXcgZGF0YWJhc2UgcGF0aCB0byB0aGUgYXR0Y2hlZCB2b2x1bWUKK2lmIHN1ZG8gdGVzdCAhIC1kICRWT0xVTUVfSE9NRS9kYXRhOyB0aGVuCisgIGVjaG8gIj0+IEFuIGVtcHR5IG9yIHVuaW5pdGlhbGl6ZWQgTXlTUUwgdm9sdW1lIGlzIGRldGVjdGVkIGluICRWT0xVTUVfSE9NRS9kYXRhIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorICBlY2hvICI9PiBJbml0IG5ldyBkYXRhYmFzZSBwYXRoIHRvICRNWVNRTF9EQVRBX0RJUiIKKyAgc3VkbyBteXNxbF9pbnN0YWxsX2RiIC0tYmFzZWRpcj0vdXNyIC0tZGF0YWRpcj0kTVlTUUxfREFUQV9ESVIKKyAgZWNobyAiPT4gTXlTUUwgZGF0YWJhc2UgaW5pdGlhbGl6ZWQgISIKK2Vsc2UKKyAgZWNobyAiPT4gVXNpbmcgYW4gZXhpc3Rpbmcgdm9sdW1lIG9mIE15U1FMIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorZmkKKworIyBGaW5hbGx5IHN0YXJ0IE15U1FMIHdpdGggbmV3IGNvbmZpZ3VyYXRpb24KK1N0YXJ0TXlTUUwKK0luaXRNeVNRTERiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0UmVzb3VyY2VBcnRpZmFjdFBheWxvYWROb0NvbnRlbnRUZXN0L215c3FsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RQYXlsb2FkTm9Db250ZW50VGVzdC9teXNxbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3N2E2NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFJlc291cmNlQXJ0aWZhY3RQYXlsb2FkTm9Db250ZW50VGVzdC9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC1nZXRSZXNvdXJjZUFydGlmYWN0UGF5bG9hZE5vQ29udGVudFRlc3QKK3RlbXBsYXRlX3ZlcnNpb246IDEuMS4xLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUzoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICBhbGllbi5ub2Rlcy5NeXNxbC1nZXRSZXNvdXJjZUFydGlmYWN0UGF5bG9hZE5vQ29udGVudFRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBBIG5vZGUgdG8gaW5zdGFsbCBNeVNRTCB2NS41IGRhdGFiYXNlIHdpdGggZGF0YQorICAgICAgb24gYSBzcGVjaWZpYyBhdHRhY2hlZCB2b2x1bWUuCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2U6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Hcm9vdnlTY3JpcHQ6CisgICAgZGVzY3JpcHRpb246IEEgZ3Jvb3Z5IHNjcmlwdCAoLmdyb292eSBmaWxlKQorICAgIGZpbGVfZXh0OiBbZ3Jvb3Z5XQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UxL2ltYWdlcy9teXNxbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3Jlc291cmNlMS9teXNxbC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UxL215c3FsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGEwYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3Jlc291cmNlMS9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdAordGVtcGxhdGVfdmVyc2lvbjogMS4xLjEtU05BUFNIT1QKK3RlbXBsYXRlX2F1dGhvcjogRmFzdENvbm5lY3QKKworaW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGU6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuRGF0YWJhc2UKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgQSBub2RlIHRvIGluc3RhbGwgTXlTUUwgdjUuNSBkYXRhYmFzZSB3aXRoIGRhdGEKKyAgICAgIG9uIGEgc3BlY2lmaWMgYXR0YWNoZWQgdm9sdW1lLgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6CisgICAgICAgIHR5cGU6IGFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0CisgICAgICAgIHByb3BlcnRpZXM6CisgICAgICAgICAgdmFsaWRfbm9kZV90eXBlczogWyB0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiBdCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgIHR5cGU6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy9teXNxbC5wbmcKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgZGJfcG9ydDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZWZhdWx0OiAzMzA2CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcG9ydCBvbiB3aGljaCB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGRhdGEuCisgICAgICBkYl9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgZGVmYXVsdDogd29yZHByZXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgIGRiX3VzZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgc3BlY2lhbCB1c2VyIGFjY291bnQgdXNlZCBmb3IgZGF0YWJhc2UgYWRtaW5pc3RyYXRpb24uCisgICAgICBkYl9wYXNzd29yZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgYWNjb3VudCBwcm92aWRlZCBpbiB0aGUg4oCYZGJfdXNlcuKAmSBwcm9wZXJ0eS4KKyAgICAgIGJpbmRfYWRkcmVzczoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZWZhdWx0OiB0cnVlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogSWYgdHJ1ZSx0aGUgc2VydmVyIGFjY2VwdHMgVENQL0lQIGNvbm5lY3Rpb25zIG9uIGFsbCBzZXJ2ZXIgaG9zdCBJUHY0IGludGVyZmFjZXMuCisgICAgICBzdG9yYWdlX3BhdGg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAvbW91bnRlZFN0b3JhZ2UKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgIi9tb3VudGVkU3RvcmFnZSIsICIvdmFyL215c3FsIiBdCisgICAgaW50ZXJmYWNlczoKKyAgICAgIFN0YW5kYXJkOgorICAgICAgICBjcmVhdGU6IHNjcmlwdHMvaW5zdGFsbF9teXNxbC5zaAorICAgICAgICBzdGFydDoKKyAgICAgICAgICBpbnB1dHM6CisgICAgICAgICAgICBWT0xVTUVfSE9NRTogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBzdG9yYWdlX3BhdGhdIH0KKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgICAgREJfTkFNRTogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9uYW1lXSB9CisgICAgICAgICAgICBEQl9VU0VSOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3VzZXJdIH0KKyAgICAgICAgICAgIERCX1BBU1NXT1JEOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3Bhc3N3b3JkXSB9CisgICAgICAgICAgICBCSU5EX0FEUkVTUzogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBiaW5kX2FkZHJlc3NdIH0KKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogc2NyaXB0cy9zdGFydF9teXNxbC5zaAorICAgICAgZmFzdGNvbm5lY3QuY2xvdWRpZnkuZXh0ZW5zaW9uczoKKyAgICAgICAgIHN0YXJ0X2RldGVjdGlvbjoKKyAgICAgICAgICBpbnB1dHM6CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogc2NyaXB0cy9teXNxbF9zdGFydF9kZXRlY3Rpb24uZ3Jvb3Z5CisgICAgYXJ0aWZhY3RzOgorICAgICAgLSBzY3JpcHRzOiBzY3JpcHRzCisgICAgICAgIHR5cGU6IHRvc2NhLmFydGlmYWN0cy5GaWxlCisKK2NhcGFiaWxpdHlfdHlwZXM6CisgIGFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisKK2FydGlmYWN0X3R5cGVzOgorICB0b3NjYS5hcnRpZmFjdHMuR3Jvb3Z5U2NyaXB0LWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0OgorICAgIGRlc2NyaXB0aW9uOiBBIGdyb292eSBzY3JpcHQgKC5ncm9vdnkgZmlsZSkKKyAgICBmaWxlX2V4dDogW2dyb292eV0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC9yZXNvdXJjZTEvc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3Jlc291cmNlMS9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC9yZXNvdXJjZTEvc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKK2VjaG8gIkRlYmlhbiBiYXNlZCBNWVNRTCBpbnN0YWxsIDUuLi4iCitMT0NLPSIvdG1wL2xvY2thcHRnZXQiCisKK3doaWxlIHRydWU7IGRvCisgIGlmIG1rZGlyICIke0xPQ0t9IiAmPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIk15U1FMIHRha2UgdGhlIGxvY2siCisgICAgYnJlYWs7CisgIGZpCisgIGVjaG8gIldhaXRpbmcgdGhlIGVuZCBvZiBvbmUgb2Ygb3VyIHJlY2lwZXMuLi4iCisgIHNsZWVwIDAuNQorZG9uZQorCit3aGlsZSBzdWRvIGZ1c2VyIC92YXIvbGliL2Rwa2cvbG9jayA+L2Rldi9udWxsIDI+JjEgOyBkbworICBlY2hvICJXYWl0aW5nIGZvciBvdGhlciBzb2Z0d2FyZSBtYW5hZ2VycyB0byBmaW5pc2guLi4iCisgIHNsZWVwIDAuNQorZG9uZQorc3VkbyBybSAtZiAvdmFyL2xpYi9kcGtnL2xvY2sKKworc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCAoc2xlZXAgMTU7IHN1ZG8gYXB0LWdldCB1cGRhdGUgfHwgZXhpdCAkezF9KQorc3VkbyBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCAteSBpbnN0YWxsIG15c3FsLXNlcnZlci01LjUgcHdnZW4gfHwgZXhpdCAkezF9CitybSAtcmYgIiR7TE9DS30iCisKK3N1ZG8gL2V0Yy9pbml0LmQvbXlzcWwgc3RvcAorc3VkbyBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKK3N1ZG8gcm0gLXJmIC92YXIvbGliL215c3FsLyoKK2VjaG8gIk15U1FMIEluc3RhbGxhdGlvbiBjb21wbGV0ZS4iClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3Jlc291cmNlMS9zY3JpcHRzL3N0YXJ0X215c3FsLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3Jlc291cmNlMS9zY3JpcHRzL3N0YXJ0X215c3FsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UxL3NjcmlwdHMvc3RhcnRfbXlzcWwuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTlYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRU5WIFZBUiBVU0VEIFZPTFVNRV9IT01FIDogJFZPTFVNRV9IT01FIgorZWNobyAiRU5WIFZBUiBVU0VEIFBPUlQgICAgICAgIDogJFBPUlQiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfTkFNRSAgICAgOiAkREJfTkFNRSIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9VU0VSICAgICA6ICREQl9VU0VSIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX1BBU1NXT1JEIDogJERCX1BBU1NXT1JEIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK0NVUlJFTlRfUEFUSD1gZGlybmFtZSAiJDAiYAorCitmdW5jdGlvbiBTdGFydE15U1FMIHsKKyAgZWNobyAiU3RhcnRpbmcgTVlTUUwuLi4iCisgIHN1ZG8gL2V0Yy9pbml0LmQvbXlzcWwgc3RvcAorICBzdWRvIC91c3IvYmluL215c3FsZF9zYWZlID4gL2Rldi9udWxsIDI+JjEgJgorICBSRVQ9MQorICB3aGlsZSBbWyBSRVQgLW5lIDAgXV07IGRvCisgICAgZWNobyAiPT4gV2FpdGluZyBmb3IgY29uZmlybWF0aW9uIG9mIE15U1FMIHNlcnZpY2Ugc3RhcnR1cCIKKyAgICBzbGVlcCA1CisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgInN0YXR1cyIgPiAvZGV2L251bGwgMj4mMQorICAgIFJFVD0kPworICBkb25lCit9CisKK2Z1bmN0aW9uIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwgeworICBNWVNRTF9EQVRBX0RJUj0kVk9MVU1FX0hPTUUvZGF0YQorICBNWVNRTF9MT0c9JFZPTFVNRV9IT01FL2xvZ3MKKworICBlY2hvICJTZXR0aW5nIGRhdGEgZGlyZWN0b3J5IHRvICRNWVNRTF9EQVRBX0RJUiBhbiBsb2dzIHRvICRNWVNRTF9MT0cgLi4uIgorICBpZiBzdWRvIHRlc3QgISAtZCAkTVlTUUxfREFUQV9ESVI7IHRoZW4KKyAgICBlY2hvICJDcmVhdGluZyBEQVRBIGRpciA+ICRNWVNRTF9EQVRBX0RJUiAuLi4iCisgICAgc3VkbyBta2RpciAtcCAkTVlTUUxfREFUQV9ESVIKKyAgICAjIG15c3FsIGFzIG93bmVyIGFuZCBncm91cCBvd25lcgorICAgIHN1ZG8gY2hvd24gLVIgbXlzcWw6bXlzcWwgJE1ZU1FMX0RBVEFfRElSCisgIGZpCisgIGlmIHN1ZG8gdGVzdCAhIC1kICRNWVNRTF9MT0c7IHRoZW4KKyAgICBlY2hvICJDcmVhdGluZyBMT0cgZGlyID4gJE1ZU1FMX0xPRyAuLi4iCisgICAgc3VkbyBta2RpciAtcCAkTVlTUUxfTE9HCisgICAgIyBteXNxbCBhcyBvd25lciBhbmQgZ3JvdXAgb3duZXIKKyAgICBzdWRvIGNob3duIC1SIG15c3FsOm15c3FsICRNWVNRTF9MT0cKKyAgZmkKKworICAjIGVkaXQgYXBwIG15c3FsIHBlcm1pc3Npb24gaW4gOiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIENPVU5UX0xJTkU9YHN1ZG8gY2F0IC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQgfCB3YyAtbGAKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfREFUQV9ESVIvIHIsIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0RBVEFfRElSLyoqIHJ3aywiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfTE9HLyByLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9MT0cvKiogcndrLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorCisgICMgcmVsb2FkIGFwcCBwZXJtaXNzaW9uIG1hbmFnZXIgc2VydmljZQorICBzdWRvIHNlcnZpY2UgYXBwYXJtb3IgcmVsb2FkCit9CisKK2Z1bmN0aW9uIFVwZGF0ZU15U1FMQ29uZiB7CisgIGVjaG8gIlVwZGF0aW5nIE15U1FMIGNvbmYgZmlsZXMgW0RBVEEsIExPR1NdLi4uIgorICBzdWRvIHNlZCAtaSAiczovdmFyL2xpYi9teXNxbDokTVlTUUxfREFUQV9ESVI6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgc3VkbyBzZWQgLWkgInM6L3Zhci9sb2cvbXlzcWwvZXJyb3IubG9nOiRNWVNRTF9MT0cvZXJyb3IubG9nOmciIC9ldGMvbXlzcWwvbXkuY25mCisgIHN1ZG8gc2VkIC1pICJzOjMzMDY6JFBPUlQ6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKworICBpZiBzdWRvIHRlc3QgISAtZiAvdXNyL3NoYXJlL215c3FsL215LWRlZmF1bHQuY25mOyB0aGVuCisgICAgc3VkbyBjcCAvZXRjL215c3FsL215LmNuZiAvdXNyL3NoYXJlL215c3FsL215LWRlZmF1bHQuY25mCisgIGZpCisgIGlmIHN1ZG8gdGVzdCAhIC1mIC9ldGMvbXlzcWwvY29uZi5kL215c3FsZF9jaGFyc2V0LmNuZjsgdGhlbgorICAgIHN1ZG8gY3AgJGNvbmZpZ3MvbXlzcWxkX2NoYXJzZXQuY25mIC9ldGMvbXlzcWwvY29uZi5kL215c3FsZF9jaGFyc2V0LmNuZgorICBmaQorCisgIGlmIFsgIiRCSU5EX0FEUkVTUyIgPT0gInRydWUiIF07IHRoZW4KKyAgICBzdWRvIHNlZCAtaSAicy9iaW5kLWFkZHJlc3MuKi9iaW5kLWFkZHJlc3MgPSAwLjAuMC4wLyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgZmkKK30KKworZnVuY3Rpb24gSW5pdE15U1FMRGIgeworICAjIGNyZWF0ZSBkYXRhYmFzZSBEQl9OQU1FCisgIGlmIFsgIiREQl9OQU1FIiBdOyB0aGVuCisgICAgZWNobyAiSU5JVCBEQVRBQkFTRSAkREJfTkFNRSIKKyAgICBzdWRvIG15c3FsIC11IHJvb3QgLWUgIkNSRUFURSBEQVRBQkFTRSAkREJfTkFNRSI7CisgIGZpCisKKyAgIyBjcmVhdGUgdXNlciBhbmQgZ2l2ZSByaWdodHMKKyAgaWYgWyAiJERCX1VTRVIiIF07IHRoZW4KKyAgICBlY2hvICJDUkVBVEUgVVNFUiAkREJfVVNFUiBXSVRIIFBBU1NXT1JEICREQl9QQVNTV09SRCBBTkQgR1JBTkQgUklHSFRTIE9OICREQl9OQU1FIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJDUkVBVEUgVVNFUiAnJHtEQl9VU0VSfSdAJyUnIElERU5USUZJRUQgQlkgJyREQl9QQVNTV09SRCciCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkdSQU5UIEFMTCBQUklWSUxFR0VTIE9OICR7REJfTkFNRX0uKiBUTyAnJHtEQl9VU0VSfSdAJyUnIFdJVEggR1JBTlQgT1BUSU9OIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJGTFVTSCBQUklWSUxFR0VTIgorICBmaQorfQorCisjIENyZWF0ZSBhIG5ldyBkYXRhYmFzZSBwYXRoIHRvIHRoZSBhdHRjaGVkIHZvbHVtZQoraWYgc3VkbyB0ZXN0ICEgLWQgJFZPTFVNRV9IT01FL2RhdGE7IHRoZW4KKyAgZWNobyAiPT4gQW4gZW1wdHkgb3IgdW5pbml0aWFsaXplZCBNeVNRTCB2b2x1bWUgaXMgZGV0ZWN0ZWQgaW4gJFZPTFVNRV9IT01FL2RhdGEiCisgIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwKKyAgVXBkYXRlTXlTUUxDb25mCisgIGVjaG8gIj0+IEluaXQgbmV3IGRhdGFiYXNlIHBhdGggdG8gJE1ZU1FMX0RBVEFfRElSIgorICBzdWRvIG15c3FsX2luc3RhbGxfZGIgLS1iYXNlZGlyPS91c3IgLS1kYXRhZGlyPSRNWVNRTF9EQVRBX0RJUgorICBlY2hvICI9PiBNeVNRTCBkYXRhYmFzZSBpbml0aWFsaXplZCAhIgorZWxzZQorICBlY2hvICI9PiBVc2luZyBhbiBleGlzdGluZyB2b2x1bWUgb2YgTXlTUUwiCisgIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwKKyAgVXBkYXRlTXlTUUxDb25mCitmaQorCisjIEZpbmFsbHkgc3RhcnQgTXlTUUwgd2l0aCBuZXcgY29uZmlndXJhdGlvbgorU3RhcnRNeVNRTAorSW5pdE15U1FMRGIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL2ltYWdlcy9teXNxbC5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL2ltYWdlcy9teXNxbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwMmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC9yZXNvdXJjZTIvaW1hZ2VzL215c3FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL215c3FsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC9yZXNvdXJjZTIvbXlzcWwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWZmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL215c3FsLnltbApAQCAtMCwwICsxLDg1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCitkZXNjcmlwdGlvbjogTXlTUUwgUkRCTVMgaW5zdGFsbGF0aW9uIG9uIGEgc3BlY2lmaWMgbW91bnRlZCB2b2x1bWUgcGF0aC4KK3RlbXBsYXRlX25hbWU6IG15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MgordGVtcGxhdGVfdmVyc2lvbjogMS4xLjEtU05BUFNIT1QKK3RlbXBsYXRlX2F1dGhvcjogRmFzdENvbm5lY3QKKworaW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGU6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdDIKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisKK2FydGlmYWN0X3R5cGVzOgorICB0b3NjYS5hcnRpZmFjdHMuR3Jvb3Z5U2NyaXB0LWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MjoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL3NjcmlwdHMvaW5zdGFsbF9teXNxbDIuc2ggYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL3NjcmlwdHMvaW5zdGFsbF9teXNxbDIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC9yZXNvdXJjZTIvc2NyaXB0cy9pbnN0YWxsX215c3FsMi5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCitlY2hvICJEZWJpYW4gYmFzZWQgTVlTUUwgaW5zdGFsbCA1Li4uIgorTE9DSz0iL3RtcC9sb2NrYXB0Z2V0IgorCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJHtMT0NLfSIgJj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICJNeVNRTCB0YWtlIHRoZSBsb2NrIgorICAgIGJyZWFrOworICBmaQorICBlY2hvICJXYWl0aW5nIHRoZSBlbmQgb2Ygb25lIG9mIG91ciByZWNpcGVzLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKKword2hpbGUgc3VkbyBmdXNlciAvdmFyL2xpYi9kcGtnL2xvY2sgPi9kZXYvbnVsbCAyPiYxIDsgZG8KKyAgZWNobyAiV2FpdGluZyBmb3Igb3RoZXIgc29mdHdhcmUgbWFuYWdlcnMgdG8gZmluaXNoLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKK3N1ZG8gcm0gLWYgL3Zhci9saWIvZHBrZy9sb2NrCisKK3N1ZG8gYXB0LWdldCB1cGRhdGUgfHwgKHNsZWVwIDE1OyBzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IGV4aXQgJHsxfSkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgLXkgaW5zdGFsbCBteXNxbC1zZXJ2ZXItNS41IHB3Z2VuIHx8IGV4aXQgJHsxfQorcm0gLXJmICIke0xPQ0t9IgorCitzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKK3N1ZG8gcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qCitzdWRvIHJtIC1yZiAvdmFyL2xpYi9teXNxbC8qCitlY2hvICJNeVNRTCBJbnN0YWxsYXRpb24gY29tcGxldGUuIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC9yZXNvdXJjZTIvc2NyaXB0cy9zdGFydF9teXNxbDIuc2ggYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL3NjcmlwdHMvc3RhcnRfbXlzcWwyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0SW52YWxpZFZlcnNpb25Ob3RGb3VuZFRlc3QvcmVzb3VyY2UyL3NjcmlwdHMvc3RhcnRfbXlzcWwyLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vYmFzaAorCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5WIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkVOViBWQVIgVVNFRCBWT0xVTUVfSE9NRSA6ICRWT0xVTUVfSE9NRSIKK2VjaG8gIkVOViBWQVIgVVNFRCBQT1JUICAgICAgICA6ICRQT1JUIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX05BTUUgICAgIDogJERCX05BTUUiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfVVNFUiAgICAgOiAkREJfVVNFUiIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9QQVNTV09SRCA6ICREQl9QQVNTV09SRCIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCitDVVJSRU5UX1BBVEg9YGRpcm5hbWUgIiQwImAKKworZnVuY3Rpb24gU3RhcnRNeVNRTCB7CisgIGVjaG8gIlN0YXJ0aW5nIE1ZU1FMLi4uIgorICBzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKKyAgc3VkbyAvdXNyL2Jpbi9teXNxbGRfc2FmZSA+IC9kZXYvbnVsbCAyPiYxICYKKyAgUkVUPTEKKyAgd2hpbGUgW1sgUkVUIC1uZSAwIF1dOyBkbworICAgIGVjaG8gIj0+IFdhaXRpbmcgZm9yIGNvbmZpcm1hdGlvbiBvZiBNeVNRTCBzZXJ2aWNlIHN0YXJ0dXAiCisgICAgc2xlZXAgNQorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJzdGF0dXMiID4gL2Rldi9udWxsIDI+JjEKKyAgICBSRVQ9JD8KKyAgZG9uZQorfQorCitmdW5jdGlvbiBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMIHsKKyAgTVlTUUxfREFUQV9ESVI9JFZPTFVNRV9IT01FL2RhdGEKKyAgTVlTUUxfTE9HPSRWT0xVTUVfSE9NRS9sb2dzCisKKyAgZWNobyAiU2V0dGluZyBkYXRhIGRpcmVjdG9yeSB0byAkTVlTUUxfREFUQV9ESVIgYW4gbG9ncyB0byAkTVlTUUxfTE9HIC4uLiIKKyAgaWYgc3VkbyB0ZXN0ICEgLWQgJE1ZU1FMX0RBVEFfRElSOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgREFUQSBkaXIgPiAkTVlTUUxfREFUQV9ESVIgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0RBVEFfRElSCisgICAgIyBteXNxbCBhcyBvd25lciBhbmQgZ3JvdXAgb3duZXIKKyAgICBzdWRvIGNob3duIC1SIG15c3FsOm15c3FsICRNWVNRTF9EQVRBX0RJUgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZCAkTVlTUUxfTE9HOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgTE9HIGRpciA+ICRNWVNRTF9MT0cgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0xPRworICAgICMgbXlzcWwgYXMgb3duZXIgYW5kIGdyb3VwIG93bmVyCisgICAgc3VkbyBjaG93biAtUiBteXNxbDpteXNxbCAkTVlTUUxfTE9HCisgIGZpCisKKyAgIyBlZGl0IGFwcCBteXNxbCBwZXJtaXNzaW9uIGluIDogL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBDT1VOVF9MSU5FPWBzdWRvIGNhdCAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkIHwgd2MgLWxgCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0RBVEFfRElSLyByLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9EQVRBX0RJUi8qKiByd2ssIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0xPRy8gciwiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfTE9HLyoqIHJ3aywiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKworICAjIHJlbG9hZCBhcHAgcGVybWlzc2lvbiBtYW5hZ2VyIHNlcnZpY2UKKyAgc3VkbyBzZXJ2aWNlIGFwcGFybW9yIHJlbG9hZAorfQorCitmdW5jdGlvbiBVcGRhdGVNeVNRTENvbmYgeworICBlY2hvICJVcGRhdGluZyBNeVNRTCBjb25mIGZpbGVzIFtEQVRBLCBMT0dTXS4uLiIKKyAgc3VkbyBzZWQgLWkgInM6L3Zhci9saWIvbXlzcWw6JE1ZU1FMX0RBVEFfRElSOmciIC9ldGMvbXlzcWwvbXkuY25mCisgIHN1ZG8gc2VkIC1pICJzOi92YXIvbG9nL215c3FsL2Vycm9yLmxvZzokTVlTUUxfTE9HL2Vycm9yLmxvZzpnIiAvZXRjL215c3FsL215LmNuZgorICBzdWRvIHNlZCAtaSAiczozMzA2OiRQT1JUOmciIC9ldGMvbXlzcWwvbXkuY25mCisKKyAgaWYgc3VkbyB0ZXN0ICEgLWYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZjsgdGhlbgorICAgIHN1ZG8gY3AgL2V0Yy9teXNxbC9teS5jbmYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmY7IHRoZW4KKyAgICBzdWRvIGNwICRjb25maWdzL215c3FsZF9jaGFyc2V0LmNuZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmYKKyAgZmkKKworICBpZiBbICIkQklORF9BRFJFU1MiID09ICJ0cnVlIiBdOyB0aGVuCisgICAgc3VkbyBzZWQgLWkgInMvYmluZC1hZGRyZXNzLiovYmluZC1hZGRyZXNzID0gMC4wLjAuMC8iIC9ldGMvbXlzcWwvbXkuY25mCisgIGZpCit9CisKK2Z1bmN0aW9uIEluaXRNeVNRTERiIHsKKyAgIyBjcmVhdGUgZGF0YWJhc2UgREJfTkFNRQorICBpZiBbICIkREJfTkFNRSIgXTsgdGhlbgorICAgIGVjaG8gIklOSVQgREFUQUJBU0UgJERCX05BTUUiCisgICAgc3VkbyBteXNxbCAtdSByb290IC1lICJDUkVBVEUgREFUQUJBU0UgJERCX05BTUUiOworICBmaQorCisgICMgY3JlYXRlIHVzZXIgYW5kIGdpdmUgcmlnaHRzCisgIGlmIFsgIiREQl9VU0VSIiBdOyB0aGVuCisgICAgZWNobyAiQ1JFQVRFIFVTRVIgJERCX1VTRVIgV0lUSCBQQVNTV09SRCAkREJfUEFTU1dPUkQgQU5EIEdSQU5EIFJJR0hUUyBPTiAkREJfTkFNRSIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiQ1JFQVRFIFVTRVIgJyR7REJfVVNFUn0nQCclJyBJREVOVElGSUVEIEJZICckREJfUEFTU1dPUkQnIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiAke0RCX05BTUV9LiogVE8gJyR7REJfVVNFUn0nQCclJyBXSVRIIEdSQU5UIE9QVElPTiIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiRkxVU0ggUFJJVklMRUdFUyIKKyAgZmkKK30KKworIyBDcmVhdGUgYSBuZXcgZGF0YWJhc2UgcGF0aCB0byB0aGUgYXR0Y2hlZCB2b2x1bWUKK2lmIHN1ZG8gdGVzdCAhIC1kICRWT0xVTUVfSE9NRS9kYXRhOyB0aGVuCisgIGVjaG8gIj0+IEFuIGVtcHR5IG9yIHVuaW5pdGlhbGl6ZWQgTXlTUUwgdm9sdW1lIGlzIGRldGVjdGVkIGluICRWT0xVTUVfSE9NRS9kYXRhIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorICBlY2hvICI9PiBJbml0IG5ldyBkYXRhYmFzZSBwYXRoIHRvICRNWVNRTF9EQVRBX0RJUiIKKyAgc3VkbyBteXNxbF9pbnN0YWxsX2RiIC0tYmFzZWRpcj0vdXNyIC0tZGF0YWRpcj0kTVlTUUxfREFUQV9ESVIKKyAgZWNobyAiPT4gTXlTUUwgZGF0YWJhc2UgaW5pdGlhbGl6ZWQgISIKK2Vsc2UKKyAgZWNobyAiPT4gVXNpbmcgYW4gZXhpc3Rpbmcgdm9sdW1lIG9mIE15U1FMIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorZmkKKworIyBGaW5hbGx5IHN0YXJ0IE15U1FMIHdpdGggbmV3IGNvbmZpZ3VyYXRpb24KK1N0YXJ0TXlTUUwKK0luaXRNeVNRTERiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3RvcG9sb2d5LnR4dCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC90b3BvbG9neS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzYzNlOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC90b3BvbG9neS50eHQKQEAgLTAsMCArMSBAQAoreyJpZCI6IjZhNGIyZjlkLTdmZTEtNDgyZC1hZjExLTk3ZjQ4M2RmZjViNyIsImRlbGVnYXRlSWQiOiI5YzA2MzM0OS0yMjU5LTQwZmUtOTdmMS03YzQwZTY1OWUxYjAiLCJkZWxlZ2F0ZVR5cGUiOiJ0b3BvbG9neXRlbXBsYXRlIiwiZGVwZW5kZW5jaWVzIjpbeyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVMiLCJ2ZXJzaW9uIjoiMS4wLjAud2QwMy1TTkFQU0hPVCJ9LHsibmFtZSI6Im15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MiIsInZlcnNpb24iOiIxLjEuMS1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1zb2Z0d2FyZUNvbXBvbmVudCIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGUiLCJ2ZXJzaW9uIjoiMS4wLjAud2QwMy1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290IiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJteXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsInZlcnNpb24iOiIxLjEuMS1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZSIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn1dLCJub2RlVGVtcGxhdGVzIjpbeyJrZXkiOiJNeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsInZhbHVlIjp7InR5cGUiOiJhbGllbi5ub2Rlcy5NeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiYmluZF9hZGRyZXNzIjoidHJ1ZSIsInN0b3JhZ2VfcGF0aCI6Ii9tb3VudGVkU3RvcmFnZSIsImRiX3BvcnQiOiIzMzA2IiwiZGJfbmFtZSI6IndvcmRwcmVzcyIsImRiX3VzZXIiOiJwYXNzIiwiZGJfcGFzc3dvcmQiOiJwYXNzIn0sImF0dHJpYnV0ZXMiOnsidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjp7Imhvc3RlZE9uQ29tcHV0ZSI6eyJ0eXBlIjoidG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbiIsInRhcmdldCI6IkNvbXB1dGUiLCJyZXF1aXJlbWVudE5hbWUiOiJob3N0IiwicmVxdWlyZW1lbnRUeXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInRhcmdldGVkQ2FwYWJpbGl0eU5hbWUiOiJob3N0In19LCJyZXF1aXJlbWVudHMiOnsiZGVwZW5kZW5jeSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwiaG9zdCI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInByb3BlcnRpZXMiOm51bGx9fSwiY2FwYWJpbGl0aWVzIjp7ImRhdGFiYXNlX2VuZHBvaW50Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludCIsInByb3BlcnRpZXMiOnsicG9ydCI6bnVsbCwicHJvdG9jb2wiOnsidmFsdWUiOiJ0Y3AiLCJkZWZpbml0aW9uIjpmYWxzZX0sInVybF9wYXRoIjpudWxsLCJzZWN1cmUiOnsidmFsdWUiOiJmYWxzZSIsImRlZmluaXRpb24iOmZhbHNlfX19LCJob3N0Ijp7InR5cGUiOiJhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsInByb3BlcnRpZXMiOnsidmFsaWRfbm9kZV90eXBlcyI6bnVsbH19LCJyb290Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9fSwiYXJ0aWZhY3RzIjp7InNjcmlwdHMiOnsiYXJ0aWZhY3RUeXBlIjoidG9zY2EuYXJ0aWZhY3RzLkZpbGUiLCJhcnRpZmFjdFJlZiI6InNjcmlwdHMiLCJhcnRpZmFjdE5hbWUiOiJzY3JpcHRzIiwiYXJ0aWZhY3RSZXBvc2l0b3J5IjpudWxsfX19fSx7ImtleSI6IkNvbXB1dGUiLCJ2YWx1ZSI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiZGlza19zaXplIjpudWxsLCJudW1fY3B1cyI6bnVsbCwib3NfZGlzdHJpYnV0aW9uIjpudWxsLCJvc19hcmNoIjpudWxsLCJtZW1fc2l6ZSI6bnVsbCwib3NfdHlwZSI6bnVsbCwib3NfdmVyc2lvbiI6bnVsbH0sImF0dHJpYnV0ZXMiOnsiaXBfYWRkcmVzcyI6bnVsbCwidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjpudWxsLCJyZXF1aXJlbWVudHMiOnsiZGVwZW5kZW5jeSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwibmV0d29yayI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLkNvbm5lY3Rpdml0eSIsInByb3BlcnRpZXMiOm51bGx9fSwiY2FwYWJpbGl0aWVzIjp7Imhvc3QiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLCJwcm9wZXJ0aWVzIjp7InZhbGlkX25vZGVfdHlwZXMiOm51bGx9fSwicm9vdCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwiYXR0YWNoIjp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudCIsInByb3BlcnRpZXMiOm51bGx9LCJzY2FsYWJsZSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlIiwicHJvcGVydGllcyI6eyJtYXhfaW50YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJkZWZhdWx0X2luc3RhbmNlcyI6eyJ2YWx1ZSI6IjEiLCJkZWZpbml0aW9uIjpmYWxzZX0sIm1pbl9pbnRhbmNlcyI6eyJ2YWx1ZSI6IjEiLCJkZWZpbml0aW9uIjpmYWxzZX19fX0sImFydGlmYWN0cyI6bnVsbH19LHsia2V5IjoiTXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyIiwidmFsdWUiOnsidHlwZSI6ImFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MiIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiYmluZF9hZGRyZXNzIjoidHJ1ZSIsInN0b3JhZ2VfcGF0aCI6Ii9tb3VudGVkU3RvcmFnZSIsImRiX3BvcnQiOiIzMzA2IiwiZGJfbmFtZSI6IndvcmRwcmVzcyIsImRiX3VzZXIiOiJwYXNzIiwiZGJfcGFzc3dvcmQiOiJwYXNzIn0sImF0dHJpYnV0ZXMiOnsidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjp7Imhvc3RlZE9uQ29tcHV0ZSI6eyJ0eXBlIjoidG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbiIsInRhcmdldCI6IkNvbXB1dGUiLCJyZXF1aXJlbWVudE5hbWUiOiJob3N0IiwicmVxdWlyZW1lbnRUeXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInRhcmdldGVkQ2FwYWJpbGl0eU5hbWUiOiJob3N0In19LCJyZXF1aXJlbWVudHMiOnsiZGVwZW5kZW5jeSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwiaG9zdCI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInByb3BlcnRpZXMiOm51bGx9fSwiY2FwYWJpbGl0aWVzIjp7ImRhdGFiYXNlX2VuZHBvaW50Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludCIsInByb3BlcnRpZXMiOnsicG9ydCI6bnVsbCwicHJvdG9jb2wiOnsidmFsdWUiOiJ0Y3AiLCJkZWZpbml0aW9uIjpmYWxzZX0sInVybF9wYXRoIjpudWxsLCJzZWN1cmUiOnsidmFsdWUiOiJmYWxzZSIsImRlZmluaXRpb24iOmZhbHNlfX19LCJob3N0Ijp7InR5cGUiOiJhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdDIiLCJwcm9wZXJ0aWVzIjp7InZhbGlkX25vZGVfdHlwZXMiOm51bGx9fSwicm9vdCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfX0sImFydGlmYWN0cyI6eyJzY3JpcHRzIjp7ImFydGlmYWN0VHlwZSI6InRvc2NhLmFydGlmYWN0cy5GaWxlIiwiYXJ0aWZhY3RSZWYiOiJzY3JpcHRzIiwiYXJ0aWZhY3ROYW1lIjoic2NyaXB0cyIsImFydGlmYWN0UmVwb3NpdG9yeSI6bnVsbH19fX1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC90b3BvbG9neVRlbXBsYXRlLnR4dCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RJbnZhbGlkVmVyc2lvbk5vdEZvdW5kVGVzdC90b3BvbG9neVRlbXBsYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQwODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdEludmFsaWRWZXJzaW9uTm90Rm91bmRUZXN0L3RvcG9sb2d5VGVtcGxhdGUudHh0CkBAIC0wLDAgKzEsMiBAQAoreyJpZCI6IjljMDYzMzQ5LTIyNTktNDBmZS05N2YxLTdjNDBlNjU5ZTFiMCIsIm5hbWUiOiJBbmRyZXkiLCJkZXNjcmlwdGlvbiI6bnVsbCwidG9wb2xvZ3lJZCI6IjZhNGIyZjlkLTdmZTEtNDgyZC1hZjExLTk3ZjQ4M2RmZjViNyJ9CisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0L3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QvcmVzb3VyY2UxL2ltYWdlcy9teXNxbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwMmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0L3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0L3Jlc291cmNlMS9teXNxbC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC9yZXNvdXJjZTEvbXlzcWwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTJjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC9yZXNvdXJjZTEvbXlzcWwueW1sCkBAIC0wLDAgKzEsODUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKK2Rlc2NyaXB0aW9uOiBNeVNRTCBSREJNUyBpbnN0YWxsYXRpb24gb24gYSBzcGVjaWZpYyBtb3VudGVkIHZvbHVtZSBwYXRoLgordGVtcGxhdGVfbmFtZTogbXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QKK3RlbXBsYXRlX3ZlcnNpb246IDEuMS4xLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUzoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICBhbGllbi5ub2Rlcy5NeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdAorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvbXlzcWwucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRiX3BvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMzMwNgorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLgorICAgICAgZGJfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIGRlZmF1bHQ6IHdvcmRwcmVzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICBkYl91c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHNwZWNpYWwgdXNlciBhY2NvdW50IHVzZWQgZm9yIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uLgorICAgICAgZGJfcGFzc3dvcmQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIOKAmGRiX3VzZXLigJkgcHJvcGVydHkuCisgICAgICBiaW5kX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogdHJ1ZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IElmIHRydWUsdGhlIHNlcnZlciBhY2NlcHRzIFRDUC9JUCBjb25uZWN0aW9ucyBvbiBhbGwgc2VydmVyIGhvc3QgSVB2NCBpbnRlcmZhY2VzLgorICAgICAgc3RvcmFnZV9wYXRoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogL21vdW50ZWRTdG9yYWdlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbICIvbW91bnRlZFN0b3JhZ2UiLCAiL3Zhci9teXNxbCIgXQorICAgIGludGVyZmFjZXM6CisgICAgICBTdGFuZGFyZDoKKyAgICAgICAgY3JlYXRlOiBzY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKKyAgICAgICAgc3RhcnQ6CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgVk9MVU1FX0hPTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgc3RvcmFnZV9wYXRoXSB9CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICAgIERCX05BTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfbmFtZV0gfQorICAgICAgICAgICAgREJfVVNFUjogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl91c2VyXSB9CisgICAgICAgICAgICBEQl9QQVNTV09SRDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wYXNzd29yZF0gfQorICAgICAgICAgICAgQklORF9BRFJFU1M6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgYmluZF9hZGRyZXNzXSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvc3RhcnRfbXlzcWwuc2gKKyAgICAgIGZhc3Rjb25uZWN0LmNsb3VkaWZ5LmV4dGVuc2lvbnM6CisgICAgICAgICBzdGFydF9kZXRlY3Rpb246CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvbXlzcWxfc3RhcnRfZGV0ZWN0aW9uLmdyb292eQorICAgIGFydGlmYWN0czoKKyAgICAgIC0gc2NyaXB0czogc2NyaXB0cworICAgICAgICB0eXBlOiB0b3NjYS5hcnRpZmFjdHMuRmlsZQorCitjYXBhYmlsaXR5X3R5cGVzOgorICBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorCithcnRpZmFjdF90eXBlczoKKyAgdG9zY2EuYXJ0aWZhY3RzLkdyb292eVNjcmlwdC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC9yZXNvdXJjZTIvaW1hZ2VzL215c3FsLnBuZyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0L3Jlc291cmNlMi9pbWFnZXMvbXlzcWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC9yZXNvdXJjZTIvaW1hZ2VzL215c3FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC9yZXNvdXJjZTIvbXlzcWwueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QvcmVzb3VyY2UyL215c3FsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY0ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QvcmVzb3VyY2UyL215c3FsLnltbApAQCAtMCwwICsxLDg1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCitkZXNjcmlwdGlvbjogTXlTUUwgUkRCTVMgaW5zdGFsbGF0aW9uIG9uIGEgc3BlY2lmaWMgbW91bnRlZCB2b2x1bWUgcGF0aC4KK3RlbXBsYXRlX25hbWU6IG15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MgordGVtcGxhdGVfdmVyc2lvbjogMS4xLjEtU05BUFNIT1QKK3RlbXBsYXRlX2F1dGhvcjogRmFzdENvbm5lY3QKKworaW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGU6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDIKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QyOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisKK2FydGlmYWN0X3R5cGVzOgorICB0b3NjYS5hcnRpZmFjdHMuR3Jvb3Z5U2NyaXB0LWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MjoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC90b3BvbG9neS50eHQgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC90b3BvbG9neS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5MzUxOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0L3RvcG9sb2d5LnR4dApAQCAtMCwwICsxIEBACit7ImlkIjoiMzI5M2M5YzgtYTE2Mi00M2ZjLWI4ZDEtNDMxMzk5Zjg5Y2I3IiwiZGVsZWdhdGVJZCI6IjI1ODQ1Y2NlLTA1YzgtNDUwMi1iNWZlLWFiZmQ2YmQ2ZjI4ZSIsImRlbGVnYXRlVHlwZSI6InRvcG9sb2d5dGVtcGxhdGUiLCJkZXBlbmRlbmNpZXMiOlt7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUyIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50IiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZSIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoibXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QyIiwidmVyc2lvbiI6IjEuMS4xLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3QiLCJ2ZXJzaW9uIjoiMS4wLjAud2QwMy1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZSIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn1dLCJub2RlVGVtcGxhdGVzIjpbeyJrZXkiOiJNeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDIiLCJ2YWx1ZSI6eyJ0eXBlIjoiYWxpZW4ubm9kZXMuTXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QyIiwibmFtZSI6bnVsbCwicHJvcGVydGllcyI6eyJiaW5kX2FkZHJlc3MiOiJ0cnVlIiwic3RvcmFnZV9wYXRoIjoiL21vdW50ZWRTdG9yYWdlIiwiZGJfcG9ydCI6IjMzMDYiLCJkYl9uYW1lIjoid29yZHByZXNzIiwiZGJfdXNlciI6InBhc3MiLCJkYl9wYXNzd29yZCI6InBhc3MifSwiYXR0cmlidXRlcyI6eyJ0b3NjYV9pZCI6bnVsbCwidG9zY2FfbmFtZSI6bnVsbH0sInJlbGF0aW9uc2hpcHMiOm51bGwsInJlcXVpcmVtZW50cyI6eyJkZXBlbmRlbmN5Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9LCJob3N0Ijp7InR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwicHJvcGVydGllcyI6bnVsbH19LCJjYXBhYmlsaXRpZXMiOnsiZGF0YWJhc2VfZW5kcG9pbnQiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5EYXRhYmFzZUVuZHBvaW50IiwicHJvcGVydGllcyI6eyJwb3J0IjpudWxsLCJwcm90b2NvbCI6eyJ2YWx1ZSI6InRjcCIsImRlZmluaXRpb24iOmZhbHNlfSwidXJsX3BhdGgiOm51bGwsInNlY3VyZSI6eyJ2YWx1ZSI6ImZhbHNlIiwiZGVmaW5pdGlvbiI6ZmFsc2V9fX0sImhvc3QiOnsidHlwZSI6ImFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MiIsInByb3BlcnRpZXMiOnsidmFsaWRfbm9kZV90eXBlcyI6bnVsbH19LCJyb290Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9fSwiYXJ0aWZhY3RzIjp7InNjcmlwdHMiOnsiYXJ0aWZhY3RUeXBlIjoidG9zY2EuYXJ0aWZhY3RzLkZpbGUiLCJhcnRpZmFjdFJlZiI6InNjcmlwdHMiLCJhcnRpZmFjdE5hbWUiOiJzY3JpcHRzIiwiYXJ0aWZhY3RSZXBvc2l0b3J5IjpudWxsfX19fSx7ImtleSI6IkNvbXB1dGUiLCJ2YWx1ZSI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiZGlza19zaXplIjpudWxsLCJudW1fY3B1cyI6bnVsbCwib3NfZGlzdHJpYnV0aW9uIjpudWxsLCJvc19hcmNoIjpudWxsLCJtZW1fc2l6ZSI6bnVsbCwib3NfdHlwZSI6bnVsbCwib3NfdmVyc2lvbiI6bnVsbH0sImF0dHJpYnV0ZXMiOnsiaXBfYWRkcmVzcyI6bnVsbCwidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjp7ImRlcGVuZHNPbk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MiI6eyJ0eXBlIjoidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iLCJ0YXJnZXQiOiJNeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDIiLCJyZXF1aXJlbWVudE5hbWUiOiJkZXBlbmRlbmN5IiwicmVxdWlyZW1lbnRUeXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJ0YXJnZXRlZENhcGFiaWxpdHlOYW1lIjoicm9vdCJ9fSwicmVxdWlyZW1lbnRzIjp7ImRlcGVuZGVuY3kiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiwicHJvcGVydGllcyI6bnVsbH0sIm5ldHdvcmsiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Db25uZWN0aXZpdHkiLCJwcm9wZXJ0aWVzIjpudWxsfX0sImNhcGFiaWxpdGllcyI6eyJob3N0Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwicHJvcGVydGllcyI6eyJ2YWxpZF9ub2RlX3R5cGVzIjpudWxsfX0sInJvb3QiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiwicHJvcGVydGllcyI6bnVsbH0sImF0dGFjaCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQiLCJwcm9wZXJ0aWVzIjpudWxsfSwic2NhbGFibGUiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSIsInByb3BlcnRpZXMiOnsibWF4X2ludGFuY2VzIjp7InZhbHVlIjoiMSIsImRlZmluaXRpb24iOmZhbHNlfSwiZGVmYXVsdF9pbnN0YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJtaW5faW50YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9fX19LCJhcnRpZmFjdHMiOm51bGx9fV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QvdG9wb2xvZ3lUZW1wbGF0ZS50eHQgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdC90b3BvbG9neVRlbXBsYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM0MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QvdG9wb2xvZ3lUZW1wbGF0ZS50eHQKQEAgLTAsMCArMSwyIEBACit7ImlkIjoiMjU4NDVjY2UtMDVjOC00NTAyLWI1ZmUtYWJmZDZiZDZmMjhlIiwibmFtZSI6IlNlcnZpY2VBcnRMaXN0Tm9Db250ZW50IiwiZGVzY3JpcHRpb24iOm51bGwsInRvcG9sb2d5SWQiOiIzMjkzYzljOC1hMTYyLTQzZmMtYjhkMS00MzEzOTlmODljYjcifQorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTEvaW1hZ2VzL215c3FsLnBuZyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTEvaW1hZ2VzL215c3FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTEvbXlzcWwueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvcmVzb3VyY2UxL215c3FsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGEwYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvcmVzb3VyY2UxL215c3FsLnltbApAQCAtMCwwICsxLDg1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCitkZXNjcmlwdGlvbjogTXlTUUwgUkRCTVMgaW5zdGFsbGF0aW9uIG9uIGEgc3BlY2lmaWMgbW91bnRlZCB2b2x1bWUgcGF0aC4KK3RlbXBsYXRlX25hbWU6IG15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0Cit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjEuMS1TTkFQU0hPVAordGVtcGxhdGVfYXV0aG9yOiBGYXN0Q29ubmVjdAorCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2U6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVM6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgYWxpZW4ubm9kZXMuTXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3Q6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBBIG5vZGUgdG8gaW5zdGFsbCBNeVNRTCB2NS41IGRhdGFiYXNlIHdpdGggZGF0YQorICAgICAgb24gYSBzcGVjaWZpYyBhdHRhY2hlZCB2b2x1bWUuCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Hcm9vdnlTY3JpcHQtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3Q6CisgICAgZGVzY3JpcHRpb246IEEgZ3Jvb3Z5IHNjcmlwdCAoLmdyb292eSBmaWxlKQorICAgIGZpbGVfZXh0OiBbZ3Jvb3Z5XQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvcmVzb3VyY2UxL3NjcmlwdHMvaW5zdGFsbF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMS9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMS9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiRGViaWFuIGJhc2VkIE1ZU1FMIGluc3RhbGwgNS4uLiIKK0xPQ0s9Ii90bXAvbG9ja2FwdGdldCIKKword2hpbGUgdHJ1ZTsgZG8KKyAgaWYgbWtkaXIgIiR7TE9DS30iICY+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiTXlTUUwgdGFrZSB0aGUgbG9jayIKKyAgICBicmVhazsKKyAgZmkKKyAgZWNobyAiV2FpdGluZyB0aGUgZW5kIG9mIG9uZSBvZiBvdXIgcmVjaXBlcy4uLiIKKyAgc2xlZXAgMC41Citkb25lCisKK3doaWxlIHN1ZG8gZnVzZXIgL3Zhci9saWIvZHBrZy9sb2NrID4vZGV2L251bGwgMj4mMSA7IGRvCisgIGVjaG8gIldhaXRpbmcgZm9yIG90aGVyIHNvZnR3YXJlIG1hbmFnZXJzIHRvIGZpbmlzaC4uLiIKKyAgc2xlZXAgMC41Citkb25lCitzdWRvIHJtIC1mIC92YXIvbGliL2Rwa2cvbG9jaworCitzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IChzbGVlcCAxNTsgc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCBleGl0ICR7MX0pCitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IC15IGluc3RhbGwgbXlzcWwtc2VydmVyLTUuNSBwd2dlbiB8fCBleGl0ICR7MX0KK3JtIC1yZiAiJHtMT0NLfSIKKworc3VkbyAvZXRjL2luaXQuZC9teXNxbCBzdG9wCitzdWRvIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgorc3VkbyBybSAtcmYgL3Zhci9saWIvbXlzcWwvKgorZWNobyAiTXlTUUwgSW5zdGFsbGF0aW9uIGNvbXBsZXRlLiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTEvc2NyaXB0cy9zdGFydF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMS9zY3JpcHRzL3N0YXJ0X215c3FsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTEvc2NyaXB0cy9zdGFydF9teXNxbC5zaApAQCAtMCwwICsxLDEwNSBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVOViAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICJFTlYgVkFSIFVTRUQgVk9MVU1FX0hPTUUgOiAkVk9MVU1FX0hPTUUiCitlY2hvICJFTlYgVkFSIFVTRUQgUE9SVCAgICAgICAgOiAkUE9SVCIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9OQU1FICAgICA6ICREQl9OQU1FIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX1VTRVIgICAgIDogJERCX1VTRVIiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfUEFTU1dPUkQgOiAkREJfUEFTU1dPUkQiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworQ1VSUkVOVF9QQVRIPWBkaXJuYW1lICIkMCJgCisKK2Z1bmN0aW9uIFN0YXJ0TXlTUUwgeworICBlY2hvICJTdGFydGluZyBNWVNRTC4uLiIKKyAgc3VkbyAvZXRjL2luaXQuZC9teXNxbCBzdG9wCisgIHN1ZG8gL3Vzci9iaW4vbXlzcWxkX3NhZmUgPiAvZGV2L251bGwgMj4mMSAmCisgIFJFVD0xCisgIHdoaWxlIFtbIFJFVCAtbmUgMCBdXTsgZG8KKyAgICBlY2hvICI9PiBXYWl0aW5nIGZvciBjb25maXJtYXRpb24gb2YgTXlTUUwgc2VydmljZSBzdGFydHVwIgorICAgIHNsZWVwIDUKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAic3RhdHVzIiA+IC9kZXYvbnVsbCAyPiYxCisgICAgUkVUPSQ/CisgIGRvbmUKK30KKworZnVuY3Rpb24gQWxsb3dGaWxlU3lzdGVtVG9NeVNRTCB7CisgIE1ZU1FMX0RBVEFfRElSPSRWT0xVTUVfSE9NRS9kYXRhCisgIE1ZU1FMX0xPRz0kVk9MVU1FX0hPTUUvbG9ncworCisgIGVjaG8gIlNldHRpbmcgZGF0YSBkaXJlY3RvcnkgdG8gJE1ZU1FMX0RBVEFfRElSIGFuIGxvZ3MgdG8gJE1ZU1FMX0xPRyAuLi4iCisgIGlmIHN1ZG8gdGVzdCAhIC1kICRNWVNRTF9EQVRBX0RJUjsgdGhlbgorICAgIGVjaG8gIkNyZWF0aW5nIERBVEEgZGlyID4gJE1ZU1FMX0RBVEFfRElSIC4uLiIKKyAgICBzdWRvIG1rZGlyIC1wICRNWVNRTF9EQVRBX0RJUgorICAgICMgbXlzcWwgYXMgb3duZXIgYW5kIGdyb3VwIG93bmVyCisgICAgc3VkbyBjaG93biAtUiBteXNxbDpteXNxbCAkTVlTUUxfREFUQV9ESVIKKyAgZmkKKyAgaWYgc3VkbyB0ZXN0ICEgLWQgJE1ZU1FMX0xPRzsgdGhlbgorICAgIGVjaG8gIkNyZWF0aW5nIExPRyBkaXIgPiAkTVlTUUxfTE9HIC4uLiIKKyAgICBzdWRvIG1rZGlyIC1wICRNWVNRTF9MT0cKKyAgICAjIG15c3FsIGFzIG93bmVyIGFuZCBncm91cCBvd25lcgorICAgIHN1ZG8gY2hvd24gLVIgbXlzcWw6bXlzcWwgJE1ZU1FMX0xPRworICBmaQorCisgICMgZWRpdCBhcHAgbXlzcWwgcGVybWlzc2lvbiBpbiA6IC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgQ09VTlRfTElORT1gc3VkbyBjYXQgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZCB8IHdjIC1sYAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9EQVRBX0RJUi8gciwiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfREFUQV9ESVIvKiogcndrLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9MT0cvIHIsIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0xPRy8qKiByd2ssIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisKKyAgIyByZWxvYWQgYXBwIHBlcm1pc3Npb24gbWFuYWdlciBzZXJ2aWNlCisgIHN1ZG8gc2VydmljZSBhcHBhcm1vciByZWxvYWQKK30KKworZnVuY3Rpb24gVXBkYXRlTXlTUUxDb25mIHsKKyAgZWNobyAiVXBkYXRpbmcgTXlTUUwgY29uZiBmaWxlcyBbREFUQSwgTE9HU10uLi4iCisgIHN1ZG8gc2VkIC1pICJzOi92YXIvbGliL215c3FsOiRNWVNRTF9EQVRBX0RJUjpnIiAvZXRjL215c3FsL215LmNuZgorICBzdWRvIHNlZCAtaSAiczovdmFyL2xvZy9teXNxbC9lcnJvci5sb2c6JE1ZU1FMX0xPRy9lcnJvci5sb2c6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgc3VkbyBzZWQgLWkgInM6MzMwNjokUE9SVDpnIiAvZXRjL215c3FsL215LmNuZgorCisgIGlmIHN1ZG8gdGVzdCAhIC1mIC91c3Ivc2hhcmUvbXlzcWwvbXktZGVmYXVsdC5jbmY7IHRoZW4KKyAgICBzdWRvIGNwIC9ldGMvbXlzcWwvbXkuY25mIC91c3Ivc2hhcmUvbXlzcWwvbXktZGVmYXVsdC5jbmYKKyAgZmkKKyAgaWYgc3VkbyB0ZXN0ICEgLWYgL2V0Yy9teXNxbC9jb25mLmQvbXlzcWxkX2NoYXJzZXQuY25mOyB0aGVuCisgICAgc3VkbyBjcCAkY29uZmlncy9teXNxbGRfY2hhcnNldC5jbmYgL2V0Yy9teXNxbC9jb25mLmQvbXlzcWxkX2NoYXJzZXQuY25mCisgIGZpCisKKyAgaWYgWyAiJEJJTkRfQURSRVNTIiA9PSAidHJ1ZSIgXTsgdGhlbgorICAgIHN1ZG8gc2VkIC1pICJzL2JpbmQtYWRkcmVzcy4qL2JpbmQtYWRkcmVzcyA9IDAuMC4wLjAvIiAvZXRjL215c3FsL215LmNuZgorICBmaQorfQorCitmdW5jdGlvbiBJbml0TXlTUUxEYiB7CisgICMgY3JlYXRlIGRhdGFiYXNlIERCX05BTUUKKyAgaWYgWyAiJERCX05BTUUiIF07IHRoZW4KKyAgICBlY2hvICJJTklUIERBVEFCQVNFICREQl9OQU1FIgorICAgIHN1ZG8gbXlzcWwgLXUgcm9vdCAtZSAiQ1JFQVRFIERBVEFCQVNFICREQl9OQU1FIjsKKyAgZmkKKworICAjIGNyZWF0ZSB1c2VyIGFuZCBnaXZlIHJpZ2h0cworICBpZiBbICIkREJfVVNFUiIgXTsgdGhlbgorICAgIGVjaG8gIkNSRUFURSBVU0VSICREQl9VU0VSIFdJVEggUEFTU1dPUkQgJERCX1BBU1NXT1JEIEFORCBHUkFORCBSSUdIVFMgT04gJERCX05BTUUiCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkNSRUFURSBVU0VSICcke0RCX1VTRVJ9J0AnJScgSURFTlRJRklFRCBCWSAnJERCX1BBU1NXT1JEJyIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gJHtEQl9OQU1FfS4qIFRPICcke0RCX1VTRVJ9J0AnJScgV0lUSCBHUkFOVCBPUFRJT04iCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkZMVVNIIFBSSVZJTEVHRVMiCisgIGZpCit9CisKKyMgQ3JlYXRlIGEgbmV3IGRhdGFiYXNlIHBhdGggdG8gdGhlIGF0dGNoZWQgdm9sdW1lCitpZiBzdWRvIHRlc3QgISAtZCAkVk9MVU1FX0hPTUUvZGF0YTsgdGhlbgorICBlY2hvICI9PiBBbiBlbXB0eSBvciB1bmluaXRpYWxpemVkIE15U1FMIHZvbHVtZSBpcyBkZXRlY3RlZCBpbiAkVk9MVU1FX0hPTUUvZGF0YSIKKyAgQWxsb3dGaWxlU3lzdGVtVG9NeVNRTAorICBVcGRhdGVNeVNRTENvbmYKKyAgZWNobyAiPT4gSW5pdCBuZXcgZGF0YWJhc2UgcGF0aCB0byAkTVlTUUxfREFUQV9ESVIiCisgIHN1ZG8gbXlzcWxfaW5zdGFsbF9kYiAtLWJhc2VkaXI9L3VzciAtLWRhdGFkaXI9JE1ZU1FMX0RBVEFfRElSCisgIGVjaG8gIj0+IE15U1FMIGRhdGFiYXNlIGluaXRpYWxpemVkICEiCitlbHNlCisgIGVjaG8gIj0+IFVzaW5nIGFuIGV4aXN0aW5nIHZvbHVtZSBvZiBNeVNRTCIKKyAgQWxsb3dGaWxlU3lzdGVtVG9NeVNRTAorICBVcGRhdGVNeVNRTENvbmYKK2ZpCisKKyMgRmluYWxseSBzdGFydCBNeVNRTCB3aXRoIG5ldyBjb25maWd1cmF0aW9uCitTdGFydE15U1FMCitJbml0TXlTUUxEYgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMi9pbWFnZXMvbXlzcWwucG5nIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvcmVzb3VyY2UyL2ltYWdlcy9teXNxbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwMmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMi9pbWFnZXMvbXlzcWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMi9teXNxbC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTIvbXlzcWwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWZmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTIvbXlzcWwueW1sCkBAIC0wLDAgKzEsODUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKK2Rlc2NyaXB0aW9uOiBNeVNRTCBSREJNUyBpbnN0YWxsYXRpb24gb24gYSBzcGVjaWZpYyBtb3VudGVkIHZvbHVtZSBwYXRoLgordGVtcGxhdGVfbmFtZTogbXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjEuMS1TTkFQU0hPVAordGVtcGxhdGVfYXV0aG9yOiBGYXN0Q29ubmVjdAorCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2U6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVM6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgYWxpZW4ubm9kZXMuTXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuRGF0YWJhc2UKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgQSBub2RlIHRvIGluc3RhbGwgTXlTUUwgdjUuNSBkYXRhYmFzZSB3aXRoIGRhdGEKKyAgICAgIG9uIGEgc3BlY2lmaWMgYXR0YWNoZWQgdm9sdW1lLgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6CisgICAgICAgIHR5cGU6IGFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MgorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvbXlzcWwucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRiX3BvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMzMwNgorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLgorICAgICAgZGJfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIGRlZmF1bHQ6IHdvcmRwcmVzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICBkYl91c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHNwZWNpYWwgdXNlciBhY2NvdW50IHVzZWQgZm9yIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uLgorICAgICAgZGJfcGFzc3dvcmQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIOKAmGRiX3VzZXLigJkgcHJvcGVydHkuCisgICAgICBiaW5kX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogdHJ1ZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IElmIHRydWUsdGhlIHNlcnZlciBhY2NlcHRzIFRDUC9JUCBjb25uZWN0aW9ucyBvbiBhbGwgc2VydmVyIGhvc3QgSVB2NCBpbnRlcmZhY2VzLgorICAgICAgc3RvcmFnZV9wYXRoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogL21vdW50ZWRTdG9yYWdlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbICIvbW91bnRlZFN0b3JhZ2UiLCAiL3Zhci9teXNxbCIgXQorICAgIGludGVyZmFjZXM6CisgICAgICBTdGFuZGFyZDoKKyAgICAgICAgY3JlYXRlOiBzY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKKyAgICAgICAgc3RhcnQ6CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgVk9MVU1FX0hPTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgc3RvcmFnZV9wYXRoXSB9CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICAgIERCX05BTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfbmFtZV0gfQorICAgICAgICAgICAgREJfVVNFUjogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl91c2VyXSB9CisgICAgICAgICAgICBEQl9QQVNTV09SRDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wYXNzd29yZF0gfQorICAgICAgICAgICAgQklORF9BRFJFU1M6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgYmluZF9hZGRyZXNzXSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvc3RhcnRfbXlzcWwuc2gKKyAgICAgIGZhc3Rjb25uZWN0LmNsb3VkaWZ5LmV4dGVuc2lvbnM6CisgICAgICAgICBzdGFydF9kZXRlY3Rpb246CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvbXlzcWxfc3RhcnRfZGV0ZWN0aW9uLmdyb292eQorICAgIGFydGlmYWN0czoKKyAgICAgIC0gc2NyaXB0czogc2NyaXB0cworICAgICAgICB0eXBlOiB0b3NjYS5hcnRpZmFjdHMuRmlsZQorCitjYXBhYmlsaXR5X3R5cGVzOgorICBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdDI6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Hcm9vdnlTY3JpcHQtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyOgorICAgIGRlc2NyaXB0aW9uOiBBIGdyb292eSBzY3JpcHQgKC5ncm9vdnkgZmlsZSkKKyAgICBmaWxlX2V4dDogW2dyb292eV0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMi9zY3JpcHRzL2luc3RhbGxfbXlzcWwyLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvcmVzb3VyY2UyL3NjcmlwdHMvaW5zdGFsbF9teXNxbDIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3Jlc291cmNlMi9zY3JpcHRzL2luc3RhbGxfbXlzcWwyLnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKK2VjaG8gIkRlYmlhbiBiYXNlZCBNWVNRTCBpbnN0YWxsIDUuLi4iCitMT0NLPSIvdG1wL2xvY2thcHRnZXQiCisKK3doaWxlIHRydWU7IGRvCisgIGlmIG1rZGlyICIke0xPQ0t9IiAmPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIk15U1FMIHRha2UgdGhlIGxvY2siCisgICAgYnJlYWs7CisgIGZpCisgIGVjaG8gIldhaXRpbmcgdGhlIGVuZCBvZiBvbmUgb2Ygb3VyIHJlY2lwZXMuLi4iCisgIHNsZWVwIDAuNQorZG9uZQorCit3aGlsZSBzdWRvIGZ1c2VyIC92YXIvbGliL2Rwa2cvbG9jayA+L2Rldi9udWxsIDI+JjEgOyBkbworICBlY2hvICJXYWl0aW5nIGZvciBvdGhlciBzb2Z0d2FyZSBtYW5hZ2VycyB0byBmaW5pc2guLi4iCisgIHNsZWVwIDAuNQorZG9uZQorc3VkbyBybSAtZiAvdmFyL2xpYi9kcGtnL2xvY2sKKworc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCAoc2xlZXAgMTU7IHN1ZG8gYXB0LWdldCB1cGRhdGUgfHwgZXhpdCAkezF9KQorc3VkbyBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCAteSBpbnN0YWxsIG15c3FsLXNlcnZlci01LjUgcHdnZW4gfHwgZXhpdCAkezF9CitybSAtcmYgIiR7TE9DS30iCisKK3N1ZG8gL2V0Yy9pbml0LmQvbXlzcWwgc3RvcAorc3VkbyBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKK3N1ZG8gcm0gLXJmIC92YXIvbGliL215c3FsLyoKK2VjaG8gIk15U1FMIEluc3RhbGxhdGlvbiBjb21wbGV0ZS4iClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvcmVzb3VyY2UyL3NjcmlwdHMvc3RhcnRfbXlzcWwyLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvcmVzb3VyY2UyL3NjcmlwdHMvc3RhcnRfbXlzcWwyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC9yZXNvdXJjZTIvc2NyaXB0cy9zdGFydF9teXNxbDIuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTlYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRU5WIFZBUiBVU0VEIFZPTFVNRV9IT01FIDogJFZPTFVNRV9IT01FIgorZWNobyAiRU5WIFZBUiBVU0VEIFBPUlQgICAgICAgIDogJFBPUlQiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfTkFNRSAgICAgOiAkREJfTkFNRSIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9VU0VSICAgICA6ICREQl9VU0VSIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX1BBU1NXT1JEIDogJERCX1BBU1NXT1JEIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK0NVUlJFTlRfUEFUSD1gZGlybmFtZSAiJDAiYAorCitmdW5jdGlvbiBTdGFydE15U1FMIHsKKyAgZWNobyAiU3RhcnRpbmcgTVlTUUwuLi4iCisgIHN1ZG8gL2V0Yy9pbml0LmQvbXlzcWwgc3RvcAorICBzdWRvIC91c3IvYmluL215c3FsZF9zYWZlID4gL2Rldi9udWxsIDI+JjEgJgorICBSRVQ9MQorICB3aGlsZSBbWyBSRVQgLW5lIDAgXV07IGRvCisgICAgZWNobyAiPT4gV2FpdGluZyBmb3IgY29uZmlybWF0aW9uIG9mIE15U1FMIHNlcnZpY2Ugc3RhcnR1cCIKKyAgICBzbGVlcCA1CisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgInN0YXR1cyIgPiAvZGV2L251bGwgMj4mMQorICAgIFJFVD0kPworICBkb25lCit9CisKK2Z1bmN0aW9uIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwgeworICBNWVNRTF9EQVRBX0RJUj0kVk9MVU1FX0hPTUUvZGF0YQorICBNWVNRTF9MT0c9JFZPTFVNRV9IT01FL2xvZ3MKKworICBlY2hvICJTZXR0aW5nIGRhdGEgZGlyZWN0b3J5IHRvICRNWVNRTF9EQVRBX0RJUiBhbiBsb2dzIHRvICRNWVNRTF9MT0cgLi4uIgorICBpZiBzdWRvIHRlc3QgISAtZCAkTVlTUUxfREFUQV9ESVI7IHRoZW4KKyAgICBlY2hvICJDcmVhdGluZyBEQVRBIGRpciA+ICRNWVNRTF9EQVRBX0RJUiAuLi4iCisgICAgc3VkbyBta2RpciAtcCAkTVlTUUxfREFUQV9ESVIKKyAgICAjIG15c3FsIGFzIG93bmVyIGFuZCBncm91cCBvd25lcgorICAgIHN1ZG8gY2hvd24gLVIgbXlzcWw6bXlzcWwgJE1ZU1FMX0RBVEFfRElSCisgIGZpCisgIGlmIHN1ZG8gdGVzdCAhIC1kICRNWVNRTF9MT0c7IHRoZW4KKyAgICBlY2hvICJDcmVhdGluZyBMT0cgZGlyID4gJE1ZU1FMX0xPRyAuLi4iCisgICAgc3VkbyBta2RpciAtcCAkTVlTUUxfTE9HCisgICAgIyBteXNxbCBhcyBvd25lciBhbmQgZ3JvdXAgb3duZXIKKyAgICBzdWRvIGNob3duIC1SIG15c3FsOm15c3FsICRNWVNRTF9MT0cKKyAgZmkKKworICAjIGVkaXQgYXBwIG15c3FsIHBlcm1pc3Npb24gaW4gOiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIENPVU5UX0xJTkU9YHN1ZG8gY2F0IC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQgfCB3YyAtbGAKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfREFUQV9ESVIvIHIsIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0RBVEFfRElSLyoqIHJ3aywiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfTE9HLyByLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9MT0cvKiogcndrLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorCisgICMgcmVsb2FkIGFwcCBwZXJtaXNzaW9uIG1hbmFnZXIgc2VydmljZQorICBzdWRvIHNlcnZpY2UgYXBwYXJtb3IgcmVsb2FkCit9CisKK2Z1bmN0aW9uIFVwZGF0ZU15U1FMQ29uZiB7CisgIGVjaG8gIlVwZGF0aW5nIE15U1FMIGNvbmYgZmlsZXMgW0RBVEEsIExPR1NdLi4uIgorICBzdWRvIHNlZCAtaSAiczovdmFyL2xpYi9teXNxbDokTVlTUUxfREFUQV9ESVI6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgc3VkbyBzZWQgLWkgInM6L3Zhci9sb2cvbXlzcWwvZXJyb3IubG9nOiRNWVNRTF9MT0cvZXJyb3IubG9nOmciIC9ldGMvbXlzcWwvbXkuY25mCisgIHN1ZG8gc2VkIC1pICJzOjMzMDY6JFBPUlQ6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKworICBpZiBzdWRvIHRlc3QgISAtZiAvdXNyL3NoYXJlL215c3FsL215LWRlZmF1bHQuY25mOyB0aGVuCisgICAgc3VkbyBjcCAvZXRjL215c3FsL215LmNuZiAvdXNyL3NoYXJlL215c3FsL215LWRlZmF1bHQuY25mCisgIGZpCisgIGlmIHN1ZG8gdGVzdCAhIC1mIC9ldGMvbXlzcWwvY29uZi5kL215c3FsZF9jaGFyc2V0LmNuZjsgdGhlbgorICAgIHN1ZG8gY3AgJGNvbmZpZ3MvbXlzcWxkX2NoYXJzZXQuY25mIC9ldGMvbXlzcWwvY29uZi5kL215c3FsZF9jaGFyc2V0LmNuZgorICBmaQorCisgIGlmIFsgIiRCSU5EX0FEUkVTUyIgPT0gInRydWUiIF07IHRoZW4KKyAgICBzdWRvIHNlZCAtaSAicy9iaW5kLWFkZHJlc3MuKi9iaW5kLWFkZHJlc3MgPSAwLjAuMC4wLyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgZmkKK30KKworZnVuY3Rpb24gSW5pdE15U1FMRGIgeworICAjIGNyZWF0ZSBkYXRhYmFzZSBEQl9OQU1FCisgIGlmIFsgIiREQl9OQU1FIiBdOyB0aGVuCisgICAgZWNobyAiSU5JVCBEQVRBQkFTRSAkREJfTkFNRSIKKyAgICBzdWRvIG15c3FsIC11IHJvb3QgLWUgIkNSRUFURSBEQVRBQkFTRSAkREJfTkFNRSI7CisgIGZpCisKKyAgIyBjcmVhdGUgdXNlciBhbmQgZ2l2ZSByaWdodHMKKyAgaWYgWyAiJERCX1VTRVIiIF07IHRoZW4KKyAgICBlY2hvICJDUkVBVEUgVVNFUiAkREJfVVNFUiBXSVRIIFBBU1NXT1JEICREQl9QQVNTV09SRCBBTkQgR1JBTkQgUklHSFRTIE9OICREQl9OQU1FIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJDUkVBVEUgVVNFUiAnJHtEQl9VU0VSfSdAJyUnIElERU5USUZJRUQgQlkgJyREQl9QQVNTV09SRCciCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkdSQU5UIEFMTCBQUklWSUxFR0VTIE9OICR7REJfTkFNRX0uKiBUTyAnJHtEQl9VU0VSfSdAJyUnIFdJVEggR1JBTlQgT1BUSU9OIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJGTFVTSCBQUklWSUxFR0VTIgorICBmaQorfQorCisjIENyZWF0ZSBhIG5ldyBkYXRhYmFzZSBwYXRoIHRvIHRoZSBhdHRjaGVkIHZvbHVtZQoraWYgc3VkbyB0ZXN0ICEgLWQgJFZPTFVNRV9IT01FL2RhdGE7IHRoZW4KKyAgZWNobyAiPT4gQW4gZW1wdHkgb3IgdW5pbml0aWFsaXplZCBNeVNRTCB2b2x1bWUgaXMgZGV0ZWN0ZWQgaW4gJFZPTFVNRV9IT01FL2RhdGEiCisgIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwKKyAgVXBkYXRlTXlTUUxDb25mCisgIGVjaG8gIj0+IEluaXQgbmV3IGRhdGFiYXNlIHBhdGggdG8gJE1ZU1FMX0RBVEFfRElSIgorICBzdWRvIG15c3FsX2luc3RhbGxfZGIgLS1iYXNlZGlyPS91c3IgLS1kYXRhZGlyPSRNWVNRTF9EQVRBX0RJUgorICBlY2hvICI9PiBNeVNRTCBkYXRhYmFzZSBpbml0aWFsaXplZCAhIgorZWxzZQorICBlY2hvICI9PiBVc2luZyBhbiBleGlzdGluZyB2b2x1bWUgb2YgTXlTUUwiCisgIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwKKyAgVXBkYXRlTXlTUUxDb25mCitmaQorCisjIEZpbmFsbHkgc3RhcnQgTXlTUUwgd2l0aCBuZXcgY29uZmlndXJhdGlvbgorU3RhcnRNeVNRTAorSW5pdE15U1FMRGIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC90b3BvbG9neS50eHQgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC90b3BvbG9neS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzYzNlOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0L3RvcG9sb2d5LnR4dApAQCAtMCwwICsxIEBACit7ImlkIjoiNmE0YjJmOWQtN2ZlMS00ODJkLWFmMTEtOTdmNDgzZGZmNWI3IiwiZGVsZWdhdGVJZCI6IjljMDYzMzQ5LTIyNTktNDBmZS05N2YxLTdjNDBlNjU5ZTFiMCIsImRlbGVnYXRlVHlwZSI6InRvcG9sb2d5dGVtcGxhdGUiLCJkZXBlbmRlbmNpZXMiOlt7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUyIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoibXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyIiwidmVyc2lvbiI6IjEuMS4xLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50IiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZSIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3QiLCJ2ZXJzaW9uIjoiMS4wLjAud2QwMy1TTkFQU0hPVCJ9LHsibmFtZSI6Im15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0IiwidmVyc2lvbiI6IjEuMS4xLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlIiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifV0sIm5vZGVUZW1wbGF0ZXMiOlt7ImtleSI6Ik15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0IiwidmFsdWUiOnsidHlwZSI6ImFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0IiwibmFtZSI6bnVsbCwicHJvcGVydGllcyI6eyJiaW5kX2FkZHJlc3MiOiJ0cnVlIiwic3RvcmFnZV9wYXRoIjoiL21vdW50ZWRTdG9yYWdlIiwiZGJfcG9ydCI6IjMzMDYiLCJkYl9uYW1lIjoid29yZHByZXNzIiwiZGJfdXNlciI6InBhc3MiLCJkYl9wYXNzd29yZCI6InBhc3MifSwiYXR0cmlidXRlcyI6eyJ0b3NjYV9pZCI6bnVsbCwidG9zY2FfbmFtZSI6bnVsbH0sInJlbGF0aW9uc2hpcHMiOnsiaG9zdGVkT25Db21wdXRlIjp7InR5cGUiOiJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIiwidGFyZ2V0IjoiQ29tcHV0ZSIsInJlcXVpcmVtZW50TmFtZSI6Imhvc3QiLCJyZXF1aXJlbWVudFR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwidGFyZ2V0ZWRDYXBhYmlsaXR5TmFtZSI6Imhvc3QifX0sInJlcXVpcmVtZW50cyI6eyJkZXBlbmRlbmN5Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9LCJob3N0Ijp7InR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwicHJvcGVydGllcyI6bnVsbH19LCJjYXBhYmlsaXRpZXMiOnsiZGF0YWJhc2VfZW5kcG9pbnQiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5EYXRhYmFzZUVuZHBvaW50IiwicHJvcGVydGllcyI6eyJwb3J0IjpudWxsLCJwcm90b2NvbCI6eyJ2YWx1ZSI6InRjcCIsImRlZmluaXRpb24iOmZhbHNlfSwidXJsX3BhdGgiOm51bGwsInNlY3VyZSI6eyJ2YWx1ZSI6ImZhbHNlIiwiZGVmaW5pdGlvbiI6ZmFsc2V9fX0sImhvc3QiOnsidHlwZSI6ImFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0IiwicHJvcGVydGllcyI6eyJ2YWxpZF9ub2RlX3R5cGVzIjpudWxsfX0sInJvb3QiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiwicHJvcGVydGllcyI6bnVsbH19LCJhcnRpZmFjdHMiOnsic2NyaXB0cyI6eyJhcnRpZmFjdFR5cGUiOiJ0b3NjYS5hcnRpZmFjdHMuRmlsZSIsImFydGlmYWN0UmVmIjoic2NyaXB0cyIsImFydGlmYWN0TmFtZSI6InNjcmlwdHMiLCJhcnRpZmFjdFJlcG9zaXRvcnkiOm51bGx9fX19LHsia2V5IjoiQ29tcHV0ZSIsInZhbHVlIjp7InR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwibmFtZSI6bnVsbCwicHJvcGVydGllcyI6eyJkaXNrX3NpemUiOm51bGwsIm51bV9jcHVzIjpudWxsLCJvc19kaXN0cmlidXRpb24iOm51bGwsIm9zX2FyY2giOm51bGwsIm1lbV9zaXplIjpudWxsLCJvc190eXBlIjpudWxsLCJvc192ZXJzaW9uIjpudWxsfSwiYXR0cmlidXRlcyI6eyJpcF9hZGRyZXNzIjpudWxsLCJ0b3NjYV9pZCI6bnVsbCwidG9zY2FfbmFtZSI6bnVsbH0sInJlbGF0aW9uc2hpcHMiOm51bGwsInJlcXVpcmVtZW50cyI6eyJkZXBlbmRlbmN5Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9LCJuZXR3b3JrIjp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29ubmVjdGl2aXR5IiwicHJvcGVydGllcyI6bnVsbH19LCJjYXBhYmlsaXRpZXMiOnsiaG9zdCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsInByb3BlcnRpZXMiOnsidmFsaWRfbm9kZV90eXBlcyI6bnVsbH19LCJyb290Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9LCJhdHRhY2giOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50IiwicHJvcGVydGllcyI6bnVsbH0sInNjYWxhYmxlIjp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUiLCJwcm9wZXJ0aWVzIjp7Im1heF9pbnRhbmNlcyI6eyJ2YWx1ZSI6IjEiLCJkZWZpbml0aW9uIjpmYWxzZX0sImRlZmF1bHRfaW5zdGFuY2VzIjp7InZhbHVlIjoiMSIsImRlZmluaXRpb24iOmZhbHNlfSwibWluX2ludGFuY2VzIjp7InZhbHVlIjoiMSIsImRlZmluaXRpb24iOmZhbHNlfX19fSwiYXJ0aWZhY3RzIjpudWxsfX0seyJrZXkiOiJNeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdDIiLCJ2YWx1ZSI6eyJ0eXBlIjoiYWxpZW4ubm9kZXMuTXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyIiwibmFtZSI6bnVsbCwicHJvcGVydGllcyI6eyJiaW5kX2FkZHJlc3MiOiJ0cnVlIiwic3RvcmFnZV9wYXRoIjoiL21vdW50ZWRTdG9yYWdlIiwiZGJfcG9ydCI6IjMzMDYiLCJkYl9uYW1lIjoid29yZHByZXNzIiwiZGJfdXNlciI6InBhc3MiLCJkYl9wYXNzd29yZCI6InBhc3MifSwiYXR0cmlidXRlcyI6eyJ0b3NjYV9pZCI6bnVsbCwidG9zY2FfbmFtZSI6bnVsbH0sInJlbGF0aW9uc2hpcHMiOnsiaG9zdGVkT25Db21wdXRlIjp7InR5cGUiOiJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIiwidGFyZ2V0IjoiQ29tcHV0ZSIsInJlcXVpcmVtZW50TmFtZSI6Imhvc3QiLCJyZXF1aXJlbWVudFR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwidGFyZ2V0ZWRDYXBhYmlsaXR5TmFtZSI6Imhvc3QifX0sInJlcXVpcmVtZW50cyI6eyJkZXBlbmRlbmN5Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9LCJob3N0Ijp7InR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwicHJvcGVydGllcyI6bnVsbH19LCJjYXBhYmlsaXRpZXMiOnsiZGF0YWJhc2VfZW5kcG9pbnQiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5EYXRhYmFzZUVuZHBvaW50IiwicHJvcGVydGllcyI6eyJwb3J0IjpudWxsLCJwcm90b2NvbCI6eyJ2YWx1ZSI6InRjcCIsImRlZmluaXRpb24iOmZhbHNlfSwidXJsX3BhdGgiOm51bGwsInNlY3VyZSI6eyJ2YWx1ZSI6ImZhbHNlIiwiZGVmaW5pdGlvbiI6ZmFsc2V9fX0sImhvc3QiOnsidHlwZSI6ImFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MiIsInByb3BlcnRpZXMiOnsidmFsaWRfbm9kZV90eXBlcyI6bnVsbH19LCJyb290Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9fSwiYXJ0aWZhY3RzIjp7InNjcmlwdHMiOnsiYXJ0aWZhY3RUeXBlIjoidG9zY2EuYXJ0aWZhY3RzLkZpbGUiLCJhcnRpZmFjdFJlZiI6InNjcmlwdHMiLCJhcnRpZmFjdE5hbWUiOiJzY3JpcHRzIiwiYXJ0aWZhY3RSZXBvc2l0b3J5IjpudWxsfX19fV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvdG9wb2xvZ3lUZW1wbGF0ZS50eHQgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdC90b3BvbG9neVRlbXBsYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQwODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QvdG9wb2xvZ3lUZW1wbGF0ZS50eHQKQEAgLTAsMCArMSwyIEBACit7ImlkIjoiOWMwNjMzNDktMjI1OS00MGZlLTk3ZjEtN2M0MGU2NTllMWIwIiwibmFtZSI6IkFuZHJleSIsImRlc2NyaXB0aW9uIjpudWxsLCJ0b3BvbG9neUlkIjoiNmE0YjJmOWQtN2ZlMS00ODJkLWFmMTEtOTdmNDgzZGZmNWI3In0KKwpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UxL2ltYWdlcy9teXNxbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3Jlc291cmNlMS9teXNxbC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UxL215c3FsLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGEwYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3Jlc291cmNlMS9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdAordGVtcGxhdGVfdmVyc2lvbjogMS4xLjEtU05BUFNIT1QKK3RlbXBsYXRlX2F1dGhvcjogRmFzdENvbm5lY3QKKworaW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGU6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuRGF0YWJhc2UKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgQSBub2RlIHRvIGluc3RhbGwgTXlTUUwgdjUuNSBkYXRhYmFzZSB3aXRoIGRhdGEKKyAgICAgIG9uIGEgc3BlY2lmaWMgYXR0YWNoZWQgdm9sdW1lLgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6CisgICAgICAgIHR5cGU6IGFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0CisgICAgICAgIHByb3BlcnRpZXM6CisgICAgICAgICAgdmFsaWRfbm9kZV90eXBlczogWyB0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiBdCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgIHR5cGU6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy9teXNxbC5wbmcKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgZGJfcG9ydDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZWZhdWx0OiAzMzA2CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcG9ydCBvbiB3aGljaCB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGRhdGEuCisgICAgICBkYl9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgZGVmYXVsdDogd29yZHByZXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgIGRiX3VzZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgc3BlY2lhbCB1c2VyIGFjY291bnQgdXNlZCBmb3IgZGF0YWJhc2UgYWRtaW5pc3RyYXRpb24uCisgICAgICBkYl9wYXNzd29yZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgYWNjb3VudCBwcm92aWRlZCBpbiB0aGUg4oCYZGJfdXNlcuKAmSBwcm9wZXJ0eS4KKyAgICAgIGJpbmRfYWRkcmVzczoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZWZhdWx0OiB0cnVlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogSWYgdHJ1ZSx0aGUgc2VydmVyIGFjY2VwdHMgVENQL0lQIGNvbm5lY3Rpb25zIG9uIGFsbCBzZXJ2ZXIgaG9zdCBJUHY0IGludGVyZmFjZXMuCisgICAgICBzdG9yYWdlX3BhdGg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAvbW91bnRlZFN0b3JhZ2UKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgIi9tb3VudGVkU3RvcmFnZSIsICIvdmFyL215c3FsIiBdCisgICAgaW50ZXJmYWNlczoKKyAgICAgIFN0YW5kYXJkOgorICAgICAgICBjcmVhdGU6IHNjcmlwdHMvaW5zdGFsbF9teXNxbC5zaAorICAgICAgICBzdGFydDoKKyAgICAgICAgICBpbnB1dHM6CisgICAgICAgICAgICBWT0xVTUVfSE9NRTogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBzdG9yYWdlX3BhdGhdIH0KKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgICAgREJfTkFNRTogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9uYW1lXSB9CisgICAgICAgICAgICBEQl9VU0VSOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3VzZXJdIH0KKyAgICAgICAgICAgIERCX1BBU1NXT1JEOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3Bhc3N3b3JkXSB9CisgICAgICAgICAgICBCSU5EX0FEUkVTUzogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBiaW5kX2FkZHJlc3NdIH0KKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogc2NyaXB0cy9zdGFydF9teXNxbC5zaAorICAgICAgZmFzdGNvbm5lY3QuY2xvdWRpZnkuZXh0ZW5zaW9uczoKKyAgICAgICAgIHN0YXJ0X2RldGVjdGlvbjoKKyAgICAgICAgICBpbnB1dHM6CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogc2NyaXB0cy9teXNxbF9zdGFydF9kZXRlY3Rpb24uZ3Jvb3Z5CisgICAgYXJ0aWZhY3RzOgorICAgICAgLSBzY3JpcHRzOiBzY3JpcHRzCisgICAgICAgIHR5cGU6IHRvc2NhLmFydGlmYWN0cy5GaWxlCisKK2NhcGFiaWxpdHlfdHlwZXM6CisgIGFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisKK2FydGlmYWN0X3R5cGVzOgorICB0b3NjYS5hcnRpZmFjdHMuR3Jvb3Z5U2NyaXB0LWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0OgorICAgIGRlc2NyaXB0aW9uOiBBIGdyb292eSBzY3JpcHQgKC5ncm9vdnkgZmlsZSkKKyAgICBmaWxlX2V4dDogW2dyb292eV0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS9yZXNvdXJjZTEvc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3Jlc291cmNlMS9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS9yZXNvdXJjZTEvc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKK2VjaG8gIkRlYmlhbiBiYXNlZCBNWVNRTCBpbnN0YWxsIDUuLi4iCitMT0NLPSIvdG1wL2xvY2thcHRnZXQiCisKK3doaWxlIHRydWU7IGRvCisgIGlmIG1rZGlyICIke0xPQ0t9IiAmPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIk15U1FMIHRha2UgdGhlIGxvY2siCisgICAgYnJlYWs7CisgIGZpCisgIGVjaG8gIldhaXRpbmcgdGhlIGVuZCBvZiBvbmUgb2Ygb3VyIHJlY2lwZXMuLi4iCisgIHNsZWVwIDAuNQorZG9uZQorCit3aGlsZSBzdWRvIGZ1c2VyIC92YXIvbGliL2Rwa2cvbG9jayA+L2Rldi9udWxsIDI+JjEgOyBkbworICBlY2hvICJXYWl0aW5nIGZvciBvdGhlciBzb2Z0d2FyZSBtYW5hZ2VycyB0byBmaW5pc2guLi4iCisgIHNsZWVwIDAuNQorZG9uZQorc3VkbyBybSAtZiAvdmFyL2xpYi9kcGtnL2xvY2sKKworc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCAoc2xlZXAgMTU7IHN1ZG8gYXB0LWdldCB1cGRhdGUgfHwgZXhpdCAkezF9KQorc3VkbyBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCAteSBpbnN0YWxsIG15c3FsLXNlcnZlci01LjUgcHdnZW4gfHwgZXhpdCAkezF9CitybSAtcmYgIiR7TE9DS30iCisKK3N1ZG8gL2V0Yy9pbml0LmQvbXlzcWwgc3RvcAorc3VkbyBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKK3N1ZG8gcm0gLXJmIC92YXIvbGliL215c3FsLyoKK2VjaG8gIk15U1FMIEluc3RhbGxhdGlvbiBjb21wbGV0ZS4iClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3Jlc291cmNlMS9zY3JpcHRzL3N0YXJ0X215c3FsLnNoIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3Jlc291cmNlMS9zY3JpcHRzL3N0YXJ0X215c3FsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UxL3NjcmlwdHMvc3RhcnRfbXlzcWwuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTlYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRU5WIFZBUiBVU0VEIFZPTFVNRV9IT01FIDogJFZPTFVNRV9IT01FIgorZWNobyAiRU5WIFZBUiBVU0VEIFBPUlQgICAgICAgIDogJFBPUlQiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfTkFNRSAgICAgOiAkREJfTkFNRSIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9VU0VSICAgICA6ICREQl9VU0VSIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX1BBU1NXT1JEIDogJERCX1BBU1NXT1JEIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK0NVUlJFTlRfUEFUSD1gZGlybmFtZSAiJDAiYAorCitmdW5jdGlvbiBTdGFydE15U1FMIHsKKyAgZWNobyAiU3RhcnRpbmcgTVlTUUwuLi4iCisgIHN1ZG8gL2V0Yy9pbml0LmQvbXlzcWwgc3RvcAorICBzdWRvIC91c3IvYmluL215c3FsZF9zYWZlID4gL2Rldi9udWxsIDI+JjEgJgorICBSRVQ9MQorICB3aGlsZSBbWyBSRVQgLW5lIDAgXV07IGRvCisgICAgZWNobyAiPT4gV2FpdGluZyBmb3IgY29uZmlybWF0aW9uIG9mIE15U1FMIHNlcnZpY2Ugc3RhcnR1cCIKKyAgICBzbGVlcCA1CisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgInN0YXR1cyIgPiAvZGV2L251bGwgMj4mMQorICAgIFJFVD0kPworICBkb25lCit9CisKK2Z1bmN0aW9uIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwgeworICBNWVNRTF9EQVRBX0RJUj0kVk9MVU1FX0hPTUUvZGF0YQorICBNWVNRTF9MT0c9JFZPTFVNRV9IT01FL2xvZ3MKKworICBlY2hvICJTZXR0aW5nIGRhdGEgZGlyZWN0b3J5IHRvICRNWVNRTF9EQVRBX0RJUiBhbiBsb2dzIHRvICRNWVNRTF9MT0cgLi4uIgorICBpZiBzdWRvIHRlc3QgISAtZCAkTVlTUUxfREFUQV9ESVI7IHRoZW4KKyAgICBlY2hvICJDcmVhdGluZyBEQVRBIGRpciA+ICRNWVNRTF9EQVRBX0RJUiAuLi4iCisgICAgc3VkbyBta2RpciAtcCAkTVlTUUxfREFUQV9ESVIKKyAgICAjIG15c3FsIGFzIG93bmVyIGFuZCBncm91cCBvd25lcgorICAgIHN1ZG8gY2hvd24gLVIgbXlzcWw6bXlzcWwgJE1ZU1FMX0RBVEFfRElSCisgIGZpCisgIGlmIHN1ZG8gdGVzdCAhIC1kICRNWVNRTF9MT0c7IHRoZW4KKyAgICBlY2hvICJDcmVhdGluZyBMT0cgZGlyID4gJE1ZU1FMX0xPRyAuLi4iCisgICAgc3VkbyBta2RpciAtcCAkTVlTUUxfTE9HCisgICAgIyBteXNxbCBhcyBvd25lciBhbmQgZ3JvdXAgb3duZXIKKyAgICBzdWRvIGNob3duIC1SIG15c3FsOm15c3FsICRNWVNRTF9MT0cKKyAgZmkKKworICAjIGVkaXQgYXBwIG15c3FsIHBlcm1pc3Npb24gaW4gOiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIENPVU5UX0xJTkU9YHN1ZG8gY2F0IC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQgfCB3YyAtbGAKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfREFUQV9ESVIvIHIsIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0RBVEFfRElSLyoqIHJ3aywiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfTE9HLyByLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9MT0cvKiogcndrLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorCisgICMgcmVsb2FkIGFwcCBwZXJtaXNzaW9uIG1hbmFnZXIgc2VydmljZQorICBzdWRvIHNlcnZpY2UgYXBwYXJtb3IgcmVsb2FkCit9CisKK2Z1bmN0aW9uIFVwZGF0ZU15U1FMQ29uZiB7CisgIGVjaG8gIlVwZGF0aW5nIE15U1FMIGNvbmYgZmlsZXMgW0RBVEEsIExPR1NdLi4uIgorICBzdWRvIHNlZCAtaSAiczovdmFyL2xpYi9teXNxbDokTVlTUUxfREFUQV9ESVI6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgc3VkbyBzZWQgLWkgInM6L3Zhci9sb2cvbXlzcWwvZXJyb3IubG9nOiRNWVNRTF9MT0cvZXJyb3IubG9nOmciIC9ldGMvbXlzcWwvbXkuY25mCisgIHN1ZG8gc2VkIC1pICJzOjMzMDY6JFBPUlQ6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKworICBpZiBzdWRvIHRlc3QgISAtZiAvdXNyL3NoYXJlL215c3FsL215LWRlZmF1bHQuY25mOyB0aGVuCisgICAgc3VkbyBjcCAvZXRjL215c3FsL215LmNuZiAvdXNyL3NoYXJlL215c3FsL215LWRlZmF1bHQuY25mCisgIGZpCisgIGlmIHN1ZG8gdGVzdCAhIC1mIC9ldGMvbXlzcWwvY29uZi5kL215c3FsZF9jaGFyc2V0LmNuZjsgdGhlbgorICAgIHN1ZG8gY3AgJGNvbmZpZ3MvbXlzcWxkX2NoYXJzZXQuY25mIC9ldGMvbXlzcWwvY29uZi5kL215c3FsZF9jaGFyc2V0LmNuZgorICBmaQorCisgIGlmIFsgIiRCSU5EX0FEUkVTUyIgPT0gInRydWUiIF07IHRoZW4KKyAgICBzdWRvIHNlZCAtaSAicy9iaW5kLWFkZHJlc3MuKi9iaW5kLWFkZHJlc3MgPSAwLjAuMC4wLyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgZmkKK30KKworZnVuY3Rpb24gSW5pdE15U1FMRGIgeworICAjIGNyZWF0ZSBkYXRhYmFzZSBEQl9OQU1FCisgIGlmIFsgIiREQl9OQU1FIiBdOyB0aGVuCisgICAgZWNobyAiSU5JVCBEQVRBQkFTRSAkREJfTkFNRSIKKyAgICBzdWRvIG15c3FsIC11IHJvb3QgLWUgIkNSRUFURSBEQVRBQkFTRSAkREJfTkFNRSI7CisgIGZpCisKKyAgIyBjcmVhdGUgdXNlciBhbmQgZ2l2ZSByaWdodHMKKyAgaWYgWyAiJERCX1VTRVIiIF07IHRoZW4KKyAgICBlY2hvICJDUkVBVEUgVVNFUiAkREJfVVNFUiBXSVRIIFBBU1NXT1JEICREQl9QQVNTV09SRCBBTkQgR1JBTkQgUklHSFRTIE9OICREQl9OQU1FIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJDUkVBVEUgVVNFUiAnJHtEQl9VU0VSfSdAJyUnIElERU5USUZJRUQgQlkgJyREQl9QQVNTV09SRCciCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkdSQU5UIEFMTCBQUklWSUxFR0VTIE9OICR7REJfTkFNRX0uKiBUTyAnJHtEQl9VU0VSfSdAJyUnIFdJVEggR1JBTlQgT1BUSU9OIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJGTFVTSCBQUklWSUxFR0VTIgorICBmaQorfQorCisjIENyZWF0ZSBhIG5ldyBkYXRhYmFzZSBwYXRoIHRvIHRoZSBhdHRjaGVkIHZvbHVtZQoraWYgc3VkbyB0ZXN0ICEgLWQgJFZPTFVNRV9IT01FL2RhdGE7IHRoZW4KKyAgZWNobyAiPT4gQW4gZW1wdHkgb3IgdW5pbml0aWFsaXplZCBNeVNRTCB2b2x1bWUgaXMgZGV0ZWN0ZWQgaW4gJFZPTFVNRV9IT01FL2RhdGEiCisgIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwKKyAgVXBkYXRlTXlTUUxDb25mCisgIGVjaG8gIj0+IEluaXQgbmV3IGRhdGFiYXNlIHBhdGggdG8gJE1ZU1FMX0RBVEFfRElSIgorICBzdWRvIG15c3FsX2luc3RhbGxfZGIgLS1iYXNlZGlyPS91c3IgLS1kYXRhZGlyPSRNWVNRTF9EQVRBX0RJUgorICBlY2hvICI9PiBNeVNRTCBkYXRhYmFzZSBpbml0aWFsaXplZCAhIgorZWxzZQorICBlY2hvICI9PiBVc2luZyBhbiBleGlzdGluZyB2b2x1bWUgb2YgTXlTUUwiCisgIEFsbG93RmlsZVN5c3RlbVRvTXlTUUwKKyAgVXBkYXRlTXlTUUxDb25mCitmaQorCisjIEZpbmFsbHkgc3RhcnQgTXlTUUwgd2l0aCBuZXcgY29uZmlndXJhdGlvbgorU3RhcnRNeVNRTAorSW5pdE15U1FMRGIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL2ltYWdlcy9teXNxbC5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL2ltYWdlcy9teXNxbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwMmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS9yZXNvdXJjZTIvaW1hZ2VzL215c3FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL215c3FsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS9yZXNvdXJjZTIvbXlzcWwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWZmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL215c3FsLnltbApAQCAtMCwwICsxLDg1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCitkZXNjcmlwdGlvbjogTXlTUUwgUkRCTVMgaW5zdGFsbGF0aW9uIG9uIGEgc3BlY2lmaWMgbW91bnRlZCB2b2x1bWUgcGF0aC4KK3RlbXBsYXRlX25hbWU6IG15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MgordGVtcGxhdGVfdmVyc2lvbjogMS4xLjEtU05BUFNIT1QKK3RlbXBsYXRlX2F1dGhvcjogRmFzdENvbm5lY3QKKworaW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGU6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdDIKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisKK2FydGlmYWN0X3R5cGVzOgorICB0b3NjYS5hcnRpZmFjdHMuR3Jvb3Z5U2NyaXB0LWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MjoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL3NjcmlwdHMvaW5zdGFsbF9teXNxbDIuc2ggYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL3NjcmlwdHMvaW5zdGFsbF9teXNxbDIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS9yZXNvdXJjZTIvc2NyaXB0cy9pbnN0YWxsX215c3FsMi5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCitlY2hvICJEZWJpYW4gYmFzZWQgTVlTUUwgaW5zdGFsbCA1Li4uIgorTE9DSz0iL3RtcC9sb2NrYXB0Z2V0IgorCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJHtMT0NLfSIgJj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICJNeVNRTCB0YWtlIHRoZSBsb2NrIgorICAgIGJyZWFrOworICBmaQorICBlY2hvICJXYWl0aW5nIHRoZSBlbmQgb2Ygb25lIG9mIG91ciByZWNpcGVzLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKKword2hpbGUgc3VkbyBmdXNlciAvdmFyL2xpYi9kcGtnL2xvY2sgPi9kZXYvbnVsbCAyPiYxIDsgZG8KKyAgZWNobyAiV2FpdGluZyBmb3Igb3RoZXIgc29mdHdhcmUgbWFuYWdlcnMgdG8gZmluaXNoLi4uIgorICBzbGVlcCAwLjUKK2RvbmUKK3N1ZG8gcm0gLWYgL3Zhci9saWIvZHBrZy9sb2NrCisKK3N1ZG8gYXB0LWdldCB1cGRhdGUgfHwgKHNsZWVwIDE1OyBzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IGV4aXQgJHsxfSkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgLXkgaW5zdGFsbCBteXNxbC1zZXJ2ZXItNS41IHB3Z2VuIHx8IGV4aXQgJHsxfQorcm0gLXJmICIke0xPQ0t9IgorCitzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKK3N1ZG8gcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qCitzdWRvIHJtIC1yZiAvdmFyL2xpYi9teXNxbC8qCitlY2hvICJNeVNRTCBJbnN0YWxsYXRpb24gY29tcGxldGUuIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS9yZXNvdXJjZTIvc2NyaXB0cy9zdGFydF9teXNxbDIuc2ggYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL3NjcmlwdHMvc3RhcnRfbXlzcWwyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTEvcmVzb3VyY2UyL3NjcmlwdHMvc3RhcnRfbXlzcWwyLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vYmFzaAorCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5WIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkVOViBWQVIgVVNFRCBWT0xVTUVfSE9NRSA6ICRWT0xVTUVfSE9NRSIKK2VjaG8gIkVOViBWQVIgVVNFRCBQT1JUICAgICAgICA6ICRQT1JUIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX05BTUUgICAgIDogJERCX05BTUUiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfVVNFUiAgICAgOiAkREJfVVNFUiIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9QQVNTV09SRCA6ICREQl9QQVNTV09SRCIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCitDVVJSRU5UX1BBVEg9YGRpcm5hbWUgIiQwImAKKworZnVuY3Rpb24gU3RhcnRNeVNRTCB7CisgIGVjaG8gIlN0YXJ0aW5nIE1ZU1FMLi4uIgorICBzdWRvIC9ldGMvaW5pdC5kL215c3FsIHN0b3AKKyAgc3VkbyAvdXNyL2Jpbi9teXNxbGRfc2FmZSA+IC9kZXYvbnVsbCAyPiYxICYKKyAgUkVUPTEKKyAgd2hpbGUgW1sgUkVUIC1uZSAwIF1dOyBkbworICAgIGVjaG8gIj0+IFdhaXRpbmcgZm9yIGNvbmZpcm1hdGlvbiBvZiBNeVNRTCBzZXJ2aWNlIHN0YXJ0dXAiCisgICAgc2xlZXAgNQorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJzdGF0dXMiID4gL2Rldi9udWxsIDI+JjEKKyAgICBSRVQ9JD8KKyAgZG9uZQorfQorCitmdW5jdGlvbiBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMIHsKKyAgTVlTUUxfREFUQV9ESVI9JFZPTFVNRV9IT01FL2RhdGEKKyAgTVlTUUxfTE9HPSRWT0xVTUVfSE9NRS9sb2dzCisKKyAgZWNobyAiU2V0dGluZyBkYXRhIGRpcmVjdG9yeSB0byAkTVlTUUxfREFUQV9ESVIgYW4gbG9ncyB0byAkTVlTUUxfTE9HIC4uLiIKKyAgaWYgc3VkbyB0ZXN0ICEgLWQgJE1ZU1FMX0RBVEFfRElSOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgREFUQSBkaXIgPiAkTVlTUUxfREFUQV9ESVIgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0RBVEFfRElSCisgICAgIyBteXNxbCBhcyBvd25lciBhbmQgZ3JvdXAgb3duZXIKKyAgICBzdWRvIGNob3duIC1SIG15c3FsOm15c3FsICRNWVNRTF9EQVRBX0RJUgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZCAkTVlTUUxfTE9HOyB0aGVuCisgICAgZWNobyAiQ3JlYXRpbmcgTE9HIGRpciA+ICRNWVNRTF9MT0cgLi4uIgorICAgIHN1ZG8gbWtkaXIgLXAgJE1ZU1FMX0xPRworICAgICMgbXlzcWwgYXMgb3duZXIgYW5kIGdyb3VwIG93bmVyCisgICAgc3VkbyBjaG93biAtUiBteXNxbDpteXNxbCAkTVlTUUxfTE9HCisgIGZpCisKKyAgIyBlZGl0IGFwcCBteXNxbCBwZXJtaXNzaW9uIGluIDogL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBDT1VOVF9MSU5FPWBzdWRvIGNhdCAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkIHwgd2MgLWxgCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0RBVEFfRElSLyByLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9EQVRBX0RJUi8qKiByd2ssIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0xPRy8gciwiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfTE9HLyoqIHJ3aywiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKworICAjIHJlbG9hZCBhcHAgcGVybWlzc2lvbiBtYW5hZ2VyIHNlcnZpY2UKKyAgc3VkbyBzZXJ2aWNlIGFwcGFybW9yIHJlbG9hZAorfQorCitmdW5jdGlvbiBVcGRhdGVNeVNRTENvbmYgeworICBlY2hvICJVcGRhdGluZyBNeVNRTCBjb25mIGZpbGVzIFtEQVRBLCBMT0dTXS4uLiIKKyAgc3VkbyBzZWQgLWkgInM6L3Zhci9saWIvbXlzcWw6JE1ZU1FMX0RBVEFfRElSOmciIC9ldGMvbXlzcWwvbXkuY25mCisgIHN1ZG8gc2VkIC1pICJzOi92YXIvbG9nL215c3FsL2Vycm9yLmxvZzokTVlTUUxfTE9HL2Vycm9yLmxvZzpnIiAvZXRjL215c3FsL215LmNuZgorICBzdWRvIHNlZCAtaSAiczozMzA2OiRQT1JUOmciIC9ldGMvbXlzcWwvbXkuY25mCisKKyAgaWYgc3VkbyB0ZXN0ICEgLWYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZjsgdGhlbgorICAgIHN1ZG8gY3AgL2V0Yy9teXNxbC9teS5jbmYgL3Vzci9zaGFyZS9teXNxbC9teS1kZWZhdWx0LmNuZgorICBmaQorICBpZiBzdWRvIHRlc3QgISAtZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmY7IHRoZW4KKyAgICBzdWRvIGNwICRjb25maWdzL215c3FsZF9jaGFyc2V0LmNuZiAvZXRjL215c3FsL2NvbmYuZC9teXNxbGRfY2hhcnNldC5jbmYKKyAgZmkKKworICBpZiBbICIkQklORF9BRFJFU1MiID09ICJ0cnVlIiBdOyB0aGVuCisgICAgc3VkbyBzZWQgLWkgInMvYmluZC1hZGRyZXNzLiovYmluZC1hZGRyZXNzID0gMC4wLjAuMC8iIC9ldGMvbXlzcWwvbXkuY25mCisgIGZpCit9CisKK2Z1bmN0aW9uIEluaXRNeVNRTERiIHsKKyAgIyBjcmVhdGUgZGF0YWJhc2UgREJfTkFNRQorICBpZiBbICIkREJfTkFNRSIgXTsgdGhlbgorICAgIGVjaG8gIklOSVQgREFUQUJBU0UgJERCX05BTUUiCisgICAgc3VkbyBteXNxbCAtdSByb290IC1lICJDUkVBVEUgREFUQUJBU0UgJERCX05BTUUiOworICBmaQorCisgICMgY3JlYXRlIHVzZXIgYW5kIGdpdmUgcmlnaHRzCisgIGlmIFsgIiREQl9VU0VSIiBdOyB0aGVuCisgICAgZWNobyAiQ1JFQVRFIFVTRVIgJERCX1VTRVIgV0lUSCBQQVNTV09SRCAkREJfUEFTU1dPUkQgQU5EIEdSQU5EIFJJR0hUUyBPTiAkREJfTkFNRSIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiQ1JFQVRFIFVTRVIgJyR7REJfVVNFUn0nQCclJyBJREVOVElGSUVEIEJZICckREJfUEFTU1dPUkQnIgorICAgIHN1ZG8gbXlzcWwgLXVyb290IC1lICJHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiAke0RCX05BTUV9LiogVE8gJyR7REJfVVNFUn0nQCclJyBXSVRIIEdSQU5UIE9QVElPTiIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiRkxVU0ggUFJJVklMRUdFUyIKKyAgZmkKK30KKworIyBDcmVhdGUgYSBuZXcgZGF0YWJhc2UgcGF0aCB0byB0aGUgYXR0Y2hlZCB2b2x1bWUKK2lmIHN1ZG8gdGVzdCAhIC1kICRWT0xVTUVfSE9NRS9kYXRhOyB0aGVuCisgIGVjaG8gIj0+IEFuIGVtcHR5IG9yIHVuaW5pdGlhbGl6ZWQgTXlTUUwgdm9sdW1lIGlzIGRldGVjdGVkIGluICRWT0xVTUVfSE9NRS9kYXRhIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorICBlY2hvICI9PiBJbml0IG5ldyBkYXRhYmFzZSBwYXRoIHRvICRNWVNRTF9EQVRBX0RJUiIKKyAgc3VkbyBteXNxbF9pbnN0YWxsX2RiIC0tYmFzZWRpcj0vdXNyIC0tZGF0YWRpcj0kTVlTUUxfREFUQV9ESVIKKyAgZWNobyAiPT4gTXlTUUwgZGF0YWJhc2UgaW5pdGlhbGl6ZWQgISIKK2Vsc2UKKyAgZWNobyAiPT4gVXNpbmcgYW4gZXhpc3Rpbmcgdm9sdW1lIG9mIE15U1FMIgorICBBbGxvd0ZpbGVTeXN0ZW1Ub015U1FMCisgIFVwZGF0ZU15U1FMQ29uZgorZmkKKworIyBGaW5hbGx5IHN0YXJ0IE15U1FMIHdpdGggbmV3IGNvbmZpZ3VyYXRpb24KK1N0YXJ0TXlTUUwKK0luaXRNeVNRTERiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3RvcG9sb2d5LnR4dCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS90b3BvbG9neS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzYzNlOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS90b3BvbG9neS50eHQKQEAgLTAsMCArMSBAQAoreyJpZCI6IjZhNGIyZjlkLTdmZTEtNDgyZC1hZjExLTk3ZjQ4M2RmZjViNyIsImRlbGVnYXRlSWQiOiI5YzA2MzM0OS0yMjU5LTQwZmUtOTdmMS03YzQwZTY1OWUxYjAiLCJkZWxlZ2F0ZVR5cGUiOiJ0b3BvbG9neXRlbXBsYXRlIiwiZGVwZW5kZW5jaWVzIjpbeyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVMiLCJ2ZXJzaW9uIjoiMS4wLjAud2QwMy1TTkFQU0hPVCJ9LHsibmFtZSI6Im15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MiIsInZlcnNpb24iOiIxLjEuMS1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1zb2Z0d2FyZUNvbXBvbmVudCIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGUiLCJ2ZXJzaW9uIjoiMS4wLjAud2QwMy1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290IiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJteXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsInZlcnNpb24iOiIxLjEuMS1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZSIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn1dLCJub2RlVGVtcGxhdGVzIjpbeyJrZXkiOiJNeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsInZhbHVlIjp7InR5cGUiOiJhbGllbi5ub2Rlcy5NeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiYmluZF9hZGRyZXNzIjoidHJ1ZSIsInN0b3JhZ2VfcGF0aCI6Ii9tb3VudGVkU3RvcmFnZSIsImRiX3BvcnQiOiIzMzA2IiwiZGJfbmFtZSI6IndvcmRwcmVzcyIsImRiX3VzZXIiOiJwYXNzIiwiZGJfcGFzc3dvcmQiOiJwYXNzIn0sImF0dHJpYnV0ZXMiOnsidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjp7Imhvc3RlZE9uQ29tcHV0ZSI6eyJ0eXBlIjoidG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbiIsInRhcmdldCI6IkNvbXB1dGUiLCJyZXF1aXJlbWVudE5hbWUiOiJob3N0IiwicmVxdWlyZW1lbnRUeXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInRhcmdldGVkQ2FwYWJpbGl0eU5hbWUiOiJob3N0In19LCJyZXF1aXJlbWVudHMiOnsiZGVwZW5kZW5jeSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwiaG9zdCI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInByb3BlcnRpZXMiOm51bGx9fSwiY2FwYWJpbGl0aWVzIjp7ImRhdGFiYXNlX2VuZHBvaW50Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludCIsInByb3BlcnRpZXMiOnsicG9ydCI6bnVsbCwicHJvdG9jb2wiOnsidmFsdWUiOiJ0Y3AiLCJkZWZpbml0aW9uIjpmYWxzZX0sInVybF9wYXRoIjpudWxsLCJzZWN1cmUiOnsidmFsdWUiOiJmYWxzZSIsImRlZmluaXRpb24iOmZhbHNlfX19LCJob3N0Ijp7InR5cGUiOiJhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdCIsInByb3BlcnRpZXMiOnsidmFsaWRfbm9kZV90eXBlcyI6bnVsbH19LCJyb290Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9fSwiYXJ0aWZhY3RzIjp7InNjcmlwdHMiOnsiYXJ0aWZhY3RUeXBlIjoidG9zY2EuYXJ0aWZhY3RzLkZpbGUiLCJhcnRpZmFjdFJlZiI6InNjcmlwdHMiLCJhcnRpZmFjdE5hbWUiOiJzY3JpcHRzIiwiYXJ0aWZhY3RSZXBvc2l0b3J5IjpudWxsfX19fSx7ImtleSI6IkNvbXB1dGUiLCJ2YWx1ZSI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiZGlza19zaXplIjpudWxsLCJudW1fY3B1cyI6bnVsbCwib3NfZGlzdHJpYnV0aW9uIjpudWxsLCJvc19hcmNoIjpudWxsLCJtZW1fc2l6ZSI6bnVsbCwib3NfdHlwZSI6bnVsbCwib3NfdmVyc2lvbiI6bnVsbH0sImF0dHJpYnV0ZXMiOnsiaXBfYWRkcmVzcyI6bnVsbCwidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjpudWxsLCJyZXF1aXJlbWVudHMiOnsiZGVwZW5kZW5jeSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwibmV0d29yayI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLkNvbm5lY3Rpdml0eSIsInByb3BlcnRpZXMiOm51bGx9fSwiY2FwYWJpbGl0aWVzIjp7Imhvc3QiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLCJwcm9wZXJ0aWVzIjp7InZhbGlkX25vZGVfdHlwZXMiOm51bGx9fSwicm9vdCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwiYXR0YWNoIjp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudCIsInByb3BlcnRpZXMiOm51bGx9LCJzY2FsYWJsZSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlIiwicHJvcGVydGllcyI6eyJtYXhfaW50YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJkZWZhdWx0X2luc3RhbmNlcyI6eyJ2YWx1ZSI6IjEiLCJkZWZpbml0aW9uIjpmYWxzZX0sIm1pbl9pbnRhbmNlcyI6eyJ2YWx1ZSI6IjEiLCJkZWZpbml0aW9uIjpmYWxzZX19fX0sImFydGlmYWN0cyI6bnVsbH19LHsia2V5IjoiTXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdFRlc3QyIiwidmFsdWUiOnsidHlwZSI6ImFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3RUZXN0MiIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiYmluZF9hZGRyZXNzIjoidHJ1ZSIsInN0b3JhZ2VfcGF0aCI6Ii9tb3VudGVkU3RvcmFnZSIsImRiX3BvcnQiOiIzMzA2IiwiZGJfbmFtZSI6IndvcmRwcmVzcyIsImRiX3VzZXIiOiJwYXNzIiwiZGJfcGFzc3dvcmQiOiJwYXNzIn0sImF0dHJpYnV0ZXMiOnsidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjp7Imhvc3RlZE9uQ29tcHV0ZSI6eyJ0eXBlIjoidG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbiIsInRhcmdldCI6IkNvbXB1dGUiLCJyZXF1aXJlbWVudE5hbWUiOiJob3N0IiwicmVxdWlyZW1lbnRUeXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInRhcmdldGVkQ2FwYWJpbGl0eU5hbWUiOiJob3N0In19LCJyZXF1aXJlbWVudHMiOnsiZGVwZW5kZW5jeSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwiaG9zdCI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsInByb3BlcnRpZXMiOm51bGx9fSwiY2FwYWJpbGl0aWVzIjp7ImRhdGFiYXNlX2VuZHBvaW50Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludCIsInByb3BlcnRpZXMiOnsicG9ydCI6bnVsbCwicHJvdG9jb2wiOnsidmFsdWUiOiJ0Y3AiLCJkZWZpbml0aW9uIjpmYWxzZX0sInVybF9wYXRoIjpudWxsLCJzZWN1cmUiOnsidmFsdWUiOiJmYWxzZSIsImRlZmluaXRpb24iOmZhbHNlfX19LCJob3N0Ijp7InR5cGUiOiJhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0VGVzdDIiLCJwcm9wZXJ0aWVzIjp7InZhbGlkX25vZGVfdHlwZXMiOm51bGx9fSwicm9vdCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfX0sImFydGlmYWN0cyI6eyJzY3JpcHRzIjp7ImFydGlmYWN0VHlwZSI6InRvc2NhLmFydGlmYWN0cy5GaWxlIiwiYXJ0aWZhY3RSZWYiOiJzY3JpcHRzIiwiYXJ0aWZhY3ROYW1lIjoic2NyaXB0cyIsImFydGlmYWN0UmVwb3NpdG9yeSI6bnVsbH19fX1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS90b3BvbG9neVRlbXBsYXRlLnR4dCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMS90b3BvbG9neVRlbXBsYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQwODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UxL3RvcG9sb2d5VGVtcGxhdGUudHh0CkBAIC0wLDAgKzEsMiBAQAoreyJpZCI6IjljMDYzMzQ5LTIyNTktNDBmZS05N2YxLTdjNDBlNjU5ZTFiMCIsIm5hbWUiOiJBbmRyZXkiLCJkZXNjcmlwdGlvbiI6bnVsbCwidG9wb2xvZ3lJZCI6IjZhNGIyZjlkLTdmZTEtNDgyZC1hZjExLTk3ZjQ4M2RmZjViNyJ9CisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMi9yZXNvdXJjZTEvaW1hZ2VzL215c3FsLnBuZyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMi9yZXNvdXJjZTEvaW1hZ2VzL215c3FsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTAyZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UyL3Jlc291cmNlMS9pbWFnZXMvbXlzcWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMi9yZXNvdXJjZTEvbXlzcWwueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UyL3Jlc291cmNlMS9teXNxbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlMmM4YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMi9yZXNvdXJjZTEvbXlzcWwueW1sCkBAIC0wLDAgKzEsODUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKK2Rlc2NyaXB0aW9uOiBNeVNRTCBSREJNUyBpbnN0YWxsYXRpb24gb24gYSBzcGVjaWZpYyBtb3VudGVkIHZvbHVtZSBwYXRoLgordGVtcGxhdGVfbmFtZTogbXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QKK3RlbXBsYXRlX3ZlcnNpb246IDEuMS4xLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUzoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICBhbGllbi5ub2Rlcy5NeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdAorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvbXlzcWwucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRiX3BvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMzMwNgorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLgorICAgICAgZGJfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIGRlZmF1bHQ6IHdvcmRwcmVzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICBkYl91c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHNwZWNpYWwgdXNlciBhY2NvdW50IHVzZWQgZm9yIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uLgorICAgICAgZGJfcGFzc3dvcmQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIOKAmGRiX3VzZXLigJkgcHJvcGVydHkuCisgICAgICBiaW5kX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVmYXVsdDogdHJ1ZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IElmIHRydWUsdGhlIHNlcnZlciBhY2NlcHRzIFRDUC9JUCBjb25uZWN0aW9ucyBvbiBhbGwgc2VydmVyIGhvc3QgSVB2NCBpbnRlcmZhY2VzLgorICAgICAgc3RvcmFnZV9wYXRoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogL21vdW50ZWRTdG9yYWdlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbICIvbW91bnRlZFN0b3JhZ2UiLCAiL3Zhci9teXNxbCIgXQorICAgIGludGVyZmFjZXM6CisgICAgICBTdGFuZGFyZDoKKyAgICAgICAgY3JlYXRlOiBzY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKKyAgICAgICAgc3RhcnQ6CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgVk9MVU1FX0hPTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgc3RvcmFnZV9wYXRoXSB9CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICAgIERCX05BTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfbmFtZV0gfQorICAgICAgICAgICAgREJfVVNFUjogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl91c2VyXSB9CisgICAgICAgICAgICBEQl9QQVNTV09SRDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wYXNzd29yZF0gfQorICAgICAgICAgICAgQklORF9BRFJFU1M6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgYmluZF9hZGRyZXNzXSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvc3RhcnRfbXlzcWwuc2gKKyAgICAgIGZhc3Rjb25uZWN0LmNsb3VkaWZ5LmV4dGVuc2lvbnM6CisgICAgICAgICBzdGFydF9kZXRlY3Rpb246CisgICAgICAgICAgaW5wdXRzOgorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvbXlzcWxfc3RhcnRfZGV0ZWN0aW9uLmdyb292eQorICAgIGFydGlmYWN0czoKKyAgICAgIC0gc2NyaXB0czogc2NyaXB0cworICAgICAgICB0eXBlOiB0b3NjYS5hcnRpZmFjdHMuRmlsZQorCitjYXBhYmlsaXR5X3R5cGVzOgorICBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorCithcnRpZmFjdF90eXBlczoKKyAgdG9zY2EuYXJ0aWZhY3RzLkdyb292eVNjcmlwdC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTIvcmVzb3VyY2UyL2ltYWdlcy9teXNxbC5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTIvcmVzb3VyY2UyL2ltYWdlcy9teXNxbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwMmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMi9yZXNvdXJjZTIvaW1hZ2VzL215c3FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTIvcmVzb3VyY2UyL215c3FsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2dldFNlcnZpY2VMaXN0VGVzdC9TZXJ2aWNlMi9yZXNvdXJjZTIvbXlzcWwueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjRkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTIvcmVzb3VyY2UyL215c3FsLnltbApAQCAtMCwwICsxLDg1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCitkZXNjcmlwdGlvbjogTXlTUUwgUkRCTVMgaW5zdGFsbGF0aW9uIG9uIGEgc3BlY2lmaWMgbW91bnRlZCB2b2x1bWUgcGF0aC4KK3RlbXBsYXRlX25hbWU6IG15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MgordGVtcGxhdGVfdmVyc2lvbjogMS4xLjEtU05BUFNIT1QKK3RlbXBsYXRlX2F1dGhvcjogRmFzdENvbm5lY3QKKworaW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGU6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1EQk1TOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZS1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDIKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QyOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisKK2FydGlmYWN0X3R5cGVzOgorICB0b3NjYS5hcnRpZmFjdHMuR3Jvb3Z5U2NyaXB0LWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MjoKKyAgICBkZXNjcmlwdGlvbjogQSBncm9vdnkgc2NyaXB0ICguZ3Jvb3Z5IGZpbGUpCisgICAgZmlsZV9leHQ6IFtncm9vdnldCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTIvdG9wb2xvZ3kudHh0IGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UyL3RvcG9sb2d5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzkzNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UyL3RvcG9sb2d5LnR4dApAQCAtMCwwICsxIEBACit7ImlkIjoiMzI5M2M5YzgtYTE2Mi00M2ZjLWI4ZDEtNDMxMzk5Zjg5Y2I3IiwiZGVsZWdhdGVJZCI6IjI1ODQ1Y2NlLTA1YzgtNDUwMi1iNWZlLWFiZmQ2YmQ2ZjI4ZSIsImRlbGVnYXRlVHlwZSI6InRvcG9sb2d5dGVtcGxhdGUiLCJkZXBlbmRlbmNpZXMiOlt7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUyIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50IiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZSIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn0seyJuYW1lIjoibXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QyIiwidmVyc2lvbiI6IjEuMS4xLVNOQVBTSE9UIn0seyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3QiLCJ2ZXJzaW9uIjoiMS4wLjAud2QwMy1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZSIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn1dLCJub2RlVGVtcGxhdGVzIjpbeyJrZXkiOiJNeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDIiLCJ2YWx1ZSI6eyJ0eXBlIjoiYWxpZW4ubm9kZXMuTXlzcWwtZ2V0U2VydmljZUFydGlmYWN0TGlzdE5vQ29udGVudFRlc3QyIiwibmFtZSI6bnVsbCwicHJvcGVydGllcyI6eyJiaW5kX2FkZHJlc3MiOiJ0cnVlIiwic3RvcmFnZV9wYXRoIjoiL21vdW50ZWRTdG9yYWdlIiwiZGJfcG9ydCI6IjMzMDYiLCJkYl9uYW1lIjoid29yZHByZXNzIiwiZGJfdXNlciI6InBhc3MiLCJkYl9wYXNzd29yZCI6InBhc3MifSwiYXR0cmlidXRlcyI6eyJ0b3NjYV9pZCI6bnVsbCwidG9zY2FfbmFtZSI6bnVsbH0sInJlbGF0aW9uc2hpcHMiOm51bGwsInJlcXVpcmVtZW50cyI6eyJkZXBlbmRlbmN5Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9LCJob3N0Ijp7InR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwicHJvcGVydGllcyI6bnVsbH19LCJjYXBhYmlsaXRpZXMiOnsiZGF0YWJhc2VfZW5kcG9pbnQiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5EYXRhYmFzZUVuZHBvaW50IiwicHJvcGVydGllcyI6eyJwb3J0IjpudWxsLCJwcm90b2NvbCI6eyJ2YWx1ZSI6InRjcCIsImRlZmluaXRpb24iOmZhbHNlfSwidXJsX3BhdGgiOm51bGwsInNlY3VyZSI6eyJ2YWx1ZSI6ImZhbHNlIiwiZGVmaW5pdGlvbiI6ZmFsc2V9fX0sImhvc3QiOnsidHlwZSI6ImFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MiIsInByb3BlcnRpZXMiOnsidmFsaWRfbm9kZV90eXBlcyI6bnVsbH19LCJyb290Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9fSwiYXJ0aWZhY3RzIjp7InNjcmlwdHMiOnsiYXJ0aWZhY3RUeXBlIjoidG9zY2EuYXJ0aWZhY3RzLkZpbGUiLCJhcnRpZmFjdFJlZiI6InNjcmlwdHMiLCJhcnRpZmFjdE5hbWUiOiJzY3JpcHRzIiwiYXJ0aWZhY3RSZXBvc2l0b3J5IjpudWxsfX19fSx7ImtleSI6IkNvbXB1dGUiLCJ2YWx1ZSI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiZGlza19zaXplIjpudWxsLCJudW1fY3B1cyI6bnVsbCwib3NfZGlzdHJpYnV0aW9uIjpudWxsLCJvc19hcmNoIjpudWxsLCJtZW1fc2l6ZSI6bnVsbCwib3NfdHlwZSI6bnVsbCwib3NfdmVyc2lvbiI6bnVsbH0sImF0dHJpYnV0ZXMiOnsiaXBfYWRkcmVzcyI6bnVsbCwidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjp7ImRlcGVuZHNPbk15c3FsLWdldFNlcnZpY2VBcnRpZmFjdExpc3ROb0NvbnRlbnRUZXN0MiI6eyJ0eXBlIjoidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iLCJ0YXJnZXQiOiJNeXNxbC1nZXRTZXJ2aWNlQXJ0aWZhY3RMaXN0Tm9Db250ZW50VGVzdDIiLCJyZXF1aXJlbWVudE5hbWUiOiJkZXBlbmRlbmN5IiwicmVxdWlyZW1lbnRUeXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJ0YXJnZXRlZENhcGFiaWxpdHlOYW1lIjoicm9vdCJ9fSwicmVxdWlyZW1lbnRzIjp7ImRlcGVuZGVuY3kiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiwicHJvcGVydGllcyI6bnVsbH0sIm5ldHdvcmsiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Db25uZWN0aXZpdHkiLCJwcm9wZXJ0aWVzIjpudWxsfX0sImNhcGFiaWxpdGllcyI6eyJob3N0Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwicHJvcGVydGllcyI6eyJ2YWxpZF9ub2RlX3R5cGVzIjpudWxsfX0sInJvb3QiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiwicHJvcGVydGllcyI6bnVsbH0sImF0dGFjaCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQiLCJwcm9wZXJ0aWVzIjpudWxsfSwic2NhbGFibGUiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSIsInByb3BlcnRpZXMiOnsibWF4X2ludGFuY2VzIjp7InZhbHVlIjoiMSIsImRlZmluaXRpb24iOmZhbHNlfSwiZGVmYXVsdF9pbnN0YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJtaW5faW50YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9fX19LCJhcnRpZmFjdHMiOm51bGx9fV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UyL3RvcG9sb2d5VGVtcGxhdGUudHh0IGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvZ2V0U2VydmljZUxpc3RUZXN0L1NlcnZpY2UyL3RvcG9sb2d5VGVtcGxhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzQyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9nZXRTZXJ2aWNlTGlzdFRlc3QvU2VydmljZTIvdG9wb2xvZ3lUZW1wbGF0ZS50eHQKQEAgLTAsMCArMSwyIEBACit7ImlkIjoiMjU4NDVjY2UtMDVjOC00NTAyLWI1ZmUtYWJmZDZiZDZmMjhlIiwibmFtZSI6IlNlcnZpY2VBcnRMaXN0Tm9Db250ZW50IiwiZGVzY3JpcHRpb24iOm51bGwsInRvcG9sb2d5SWQiOiIzMjkzYzljOC1hMTYyLTQzZmMtYjhkMS00MzEzOTlmODljYjcifQorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0QXJ0aWZhY3RQYXJhbWV0ZXJzL2hlYXRXaXRoUGFyYW1zTWlzc2luZ0RlZmF1bHQueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRBcnRpZmFjdFBhcmFtZXRlcnMvaGVhdFdpdGhQYXJhbXNNaXNzaW5nRGVmYXVsdC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYWQ1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0QXJ0aWZhY3RQYXJhbWV0ZXJzL2hlYXRXaXRoUGFyYW1zTWlzc2luZ0RlZmF1bHQueWFtbApAQCAtMCwwICsxLDYwMyBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9taXNzaW5nX2RlZmF1bHQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGxhYmVsOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTFfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTI6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMiB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMl9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMl9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUzOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTMgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTNfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTNfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlNDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmU0IH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmU0X3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTRfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTRfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmU0X3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTBfcG9ydF8wOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwc319XQorCisgIGZlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTFfcG9ydF8xOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwc319XQorCisgIGZlMV9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjFfT0FNX2RpcmVjdF9pcHN9fV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0QXJ0aWZhY3RQYXJhbWV0ZXJzL2hlYXRXaXRoUGFyYW1zTWlzc2luZ0Rlc2MueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRBcnRpZmFjdFBhcmFtZXRlcnMvaGVhdFdpdGhQYXJhbXNNaXNzaW5nRGVzYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWEyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0QXJ0aWZhY3RQYXJhbWV0ZXJzL2hlYXRXaXRoUGFyYW1zTWlzc2luZ0Rlc2MueWFtbApAQCAtMCwwICsxLDYwMyBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9taXNzaW5nX2Rlc2M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogVGhpc19pc190aGVfU0NQX25hbWUKKyAgICBsYWJlbDogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTFfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTI6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMiB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMl9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMl9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUzOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTMgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTNfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTNfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlNDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmU0IH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmU0X3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTRfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTRfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmU0X3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTBfcG9ydF8wOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwc319XQorCisgIGZlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTFfcG9ydF8xOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwc319XQorCisgIGZlMV9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjFfT0FNX2RpcmVjdF9pcHN9fV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0QXJ0aWZhY3RQYXJhbWV0ZXJzL2hlYXRXaXRoUGFyYW1zTWlzc2luZ1R5cGUueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRBcnRpZmFjdFBhcmFtZXRlcnMvaGVhdFdpdGhQYXJhbXNNaXNzaW5nVHlwZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTI3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0QXJ0aWZhY3RQYXJhbWV0ZXJzL2hlYXRXaXRoUGFyYW1zTWlzc2luZ1R5cGUueWFtbApAQCAtMCwwICsxLDYwMyBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9taXNzaW5nX2Rlc2M6CisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhlX1NDUF9uYW1lCisgICAgbGFiZWw6IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICAKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMjoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUyIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUyX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTJfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTJfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUyX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTM6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMyB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlM19wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlM19wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmU0OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTQgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTRfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTRfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8wIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMF9wb3J0XzA6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8xIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMV9wb3J0XzE6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUxX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMV9PQU1fZGlyZWN0X2lwc319XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRBcnRpZmFjdFBhcmFtZXRlcnMvaGVhdFdpdGhWYWxpZFBhcmFtcy55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaGVhdEFydGlmYWN0UGFyYW1ldGVycy9oZWF0V2l0aFZhbGlkUGFyYW1zLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzNTQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRBcnRpZmFjdFBhcmFtZXRlcnMvaGVhdFdpdGhWYWxpZFBhcmFtcy55YW1sCkBAIC0wLDAgKzEsNzg3IEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTI6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTM6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTQ6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisKKyAgdm5mX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhlX1NDUF9uYW1lCisgIHZuZl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIElEIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhzX1NDUF9pZAorCisgIGZsYXZvcl9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBpbWFnZV9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfYmUKKyAgaW1hZ2Vfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2ZlICAgIAorICBpbWFnZV9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2Vfc21wCisgIGltYWdlX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2RiCisKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjIgRkUgQ2x1c3Rlci9LQQorICBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazIgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjMgQ2x1c3RlcgorICBpbnRfdnNjcF9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazMgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjQgREIKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcms0IEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0EKKyAgU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQgorICBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIENSSUNLRVRfT0NTCisgIE9BTV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIE9BTQorICBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBkYjAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZGIxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICB2bV9zY3BfYmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTSAgICAKKyAgdm1fc2NwX2JlMl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUyCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlM19uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUzCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlNF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkU0CisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTFfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTI6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMiB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMl9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMl9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUzOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTMgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTNfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTNfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlNDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmU0IH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmU0X3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTRfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTRfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmU0X3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTBfcG9ydF8wOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwc319XQorCisgIGZlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTFfcG9ydF8xOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwc319XQorCisgIGZlMV9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjFfT0FNX2RpcmVjdF9pcHN9fV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0RW52L2FydGlmYWN0XzEueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRFbnYvYXJ0aWZhY3RfMS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNGE4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0RW52L2FydGlmYWN0XzEueWFtbApAQCAtMCwwICsxLDE0NCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBjaXR5IG5hbWUKKyAgICBkZWZhdWx0OiBIdWxvbgorICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKKyAgcHJpdmF0ZV9idWlsZGluZzoKKyAgICB0eXBlOiBib29sZWFuCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogdHJ1ZQorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0RW52L2FydGlmYWN0XzIueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRFbnYvYXJ0aWZhY3RfMi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDA0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9oZWF0RW52L2FydGlmYWN0XzIueWFtbApAQCAtMCwwICsxLDQ2OSBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKK3BhcmFtZXRlcnM6CisgIGNpdHlfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogY2l0eSBuYW1lCisgICAgZGVmYXVsdDogSHVsb24KKyAgYWRkcmVzczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogYWRkcmVzcworICAgIGRlZmF1bHQ6IE5hcmtpcworICBob21lX251bWJlcjoKKyAgICB0eXBlOiBudW1iZXIKKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiAxNAorICBwcml2YXRlX2J1aWxkaW5nOgorICAgIHR5cGU6IGJvb2xlYW4KKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiB0cnVlCityZXNvdXJjZXM6CisgIGJlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMjoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUyIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUyX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTJfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTJfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUyX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTM6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMyB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlM19wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlM19wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmU0OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTQgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTRfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTRfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8wIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMF9wb3J0XzA6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8xIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMV9wb3J0XzE6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUxX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMV9PQU1fZGlyZWN0X2lwc319XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRFbnYveXVsaS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaGVhdEVudi95dWxpLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0YTg1YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2hlYXRFbnYveXVsaS55YW1sCkBAIC0wLDAgKzEsMTQ0IEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorICBjaXR5X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IEh1bG9uCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorICBwcml2YXRlX2J1aWxkaW5nOgorICAgIHR5cGU6IGJvb2xlYW4KKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiB0cnVlCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9CaW5kaW5nQXNzZXQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0JpbmRpbmdBc3NldC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExNzI0NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9CaW5kaW5nQXNzZXQueW1sCkBAIC0wLDAgKzEsMTQgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3A6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHR5cGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAtIFZpcnR1YWxCaW5kaW5nOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuQmluZHNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DUEhhc05vUmVxQ2FwLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DUEhhc05vUmVxQ2FwLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzA5ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0NQSGFzTm9SZXFDYXAueW1sCkBAIC0wLDAgKzEsOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5DUDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DUEhhc05vUmVxQ2FwX0Rlcml2ZWRGcm9tTXlDb21wdXRlMS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvQ1BIYXNOb1JlcUNhcF9EZXJpdmVkRnJvbU15Q29tcHV0ZTEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OGU3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvQ1BIYXNOb1JlcUNhcF9EZXJpdmVkRnJvbU15Q29tcHV0ZTEueW1sCkBAIC0wLDAgKzEsOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5DUDoKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlMQorICAgIHByb3BlcnRpZXM6CisgICAgICB0eXBlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0NQV2l0aEF0dHJpYnV0ZXMueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0NQV2l0aEF0dHJpYnV0ZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWZlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvQ1BXaXRoQXR0cmlidXRlcy55bWwKQEAgLTAsMCArMSw1OSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5DUDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgaXBfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogQWxsb3cgdGhlIHVzZXIgdG8gc2V0IGEgc3RhdGljIElQLgorICAgICAgb3JkZXI6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IDAKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBvcmRlciBvZiB0aGUgTklDIG9uIHRoZSBjb21wdXRlIGluc3RhbmNlIChlLmcuIGV0aDIpLgorICAgICAgaXNfZGVmYXVsdDoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IOKAnElmIGlzX2RlZmF1bHQ9dHJ1ZSB0aGlzIHBvcnQgd2lsbCBiZSB1c2VkIGZvciB0aGUgZGVmYXVsdCBnYXRld2F5IHJvdXRlLiBPbmx5IG9uZSBwb3J0IHRoYXQgaXMgYXNzb2NpYXRlZCB0byBzaW5nbGUgY29tcHV0ZSBub2RlIGNhbiBzZXQgYXMgaXNfZGVmYXVsdD10cnVlLuKAnQorICAgICAgaXBfcmFuZ2Vfc3RhcnQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IOKAnERlZmluZXMgdGhlIHN0YXJ0aW5nIElQIG9mIGEgcmFuZ2UgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgVkZDIGluc3RhbmNlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQb3J0LuKAnQorICAgICAgaXBfcmFuZ2VfZW5kOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiDigJxEZWZpbmVzIHRoZSBlbmRpbmcgSVAgb2YgYSByYW5nZSB0byBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBjb21wdXRlIGluc3RhbmNlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQb3J0LuKAnQorICAgICAgaXNfdGFnZ2VkOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogCisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJIZWxsbyIKKyAgICAgICAgdmFsdWU6ICJIZWxsb1dvcmQiCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgZGVmYXVsdDogIkRlZmF1bHRWYWx1ZVB1YmxpY0FkZHJlc3MiCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSB2aXJ0dWFsTGluazoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkxpbmtzVG8KKyAgICAgIC0gdmlydHVhbGJpbmRpbmc6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5CaW5kc1RvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0Nhc2VJbnNlbnNpdGl2ZUNhcFRlc3RfMS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvQ2FzZUluc2Vuc2l0aXZlQ2FwVGVzdF8xLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWU2YzRmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0Nhc2VJbnNlbnNpdGl2ZUNhcFRlc3RfMS55bWwKQEAgLTAsMCArMSwzNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTE6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgY2FwYUJpbGl0eTogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DYXNlSW5zZW5zaXRpdmVDYXBUZXN0XzIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0Nhc2VJbnNlbnNpdGl2ZUNhcFRlc3RfMi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwZTRmYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DYXNlSW5zZW5zaXRpdmVDYXBUZXN0XzIueW1sCkBAIC0wLDAgKzEsMzQgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGUyOgorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGUxCisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgQ2FwYWJpbGl0eTogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DYXNlSW5zZW5zaXRpdmVSZXFUZXN0XzEueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0Nhc2VJbnNlbnNpdGl2ZVJlcVRlc3RfMS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwOTdhOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DYXNlSW5zZW5zaXRpdmVSZXFUZXN0XzEueW1sCkBAIC0wLDAgKzEsMzQgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGUxOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSByZXF1aXJFbWVudDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvQ2FzZUluc2Vuc2l0aXZlUmVxVGVzdF8yLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9DYXNlSW5zZW5zaXRpdmVSZXFUZXN0XzIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzFmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvQ2FzZUluc2Vuc2l0aXZlUmVxVGVzdF8yLnltbApAQCAtMCwwICsxLDM0IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlMjoKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlMQorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBSZXF1aXJlbWVudDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0Rlcml2ZWRGcm9tQ1BXaXRoT3duUmVxLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9EZXJpdmVkRnJvbUNQV2l0aE93blJlcS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNGFjZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9EZXJpdmVkRnJvbUNQV2l0aE93blJlcS55bWwKQEAgLTAsMCArMSwxNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5MQU46CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLkNQCisgICAgcHJvcGVydGllczoKKyAgICAgIHR5cGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIHZpcnR1YWxMaW5rOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuTGlua3NUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9EZXJpdmVkRnJvbVdlYkFwcGxpY2F0aW9uX0hhc05vUmVxVHlwZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRGVyaXZlZEZyb21XZWJBcHBsaWNhdGlvbl9IYXNOb1JlcVR5cGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmY0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRGVyaXZlZEZyb21XZWJBcHBsaWNhdGlvbl9IYXNOb1JlcVR5cGUueW1sCkBAIC0wLDAgKzEsMjcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNoaWxkV2ViQXBwbGljYXRpb246CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbgorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkaWZmOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiAKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgZGVmZjogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRGlmZmVyZW50Q2FwRnJvbVJvb3QueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0RpZmZlcmVudENhcEZyb21Sb290LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc5YmIzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0RpZmZlcmVudENhcEZyb21Sb290LnltbApAQCAtMCwwICsxLDI2IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlBc3NldDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gdGVzdDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0RpZmZlcmVudFJlcUFuZENhcC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRGlmZmVyZW50UmVxQW5kQ2FwLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThjZDViCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0RpZmZlcmVudFJlcUFuZENhcC55bWwKQEAgLTAsMCArMSwzNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTE6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIERlcGVuZGVuY1k6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgRmVhVHVyRTogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRGlmZmVyZW50UmVxQ2FwRnJvbUNvbXB1dGUxLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9EaWZmZXJlbnRSZXFDYXBGcm9tQ29tcHV0ZTEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MmQwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRGlmZmVyZW50UmVxQ2FwRnJvbUNvbXB1dGUxLnltbApAQCAtMCwwICsxLDIyIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlMjoKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlMQorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkaWZmOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0RpZmZlcmVudFJlcUNhcEZyb21Db21wdXRlMi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRGlmZmVyZW50UmVxQ2FwRnJvbUNvbXB1dGUyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTMyY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0RpZmZlcmVudFJlcUNhcEZyb21Db21wdXRlMi55bWwKQEAgLTAsMCArMSwyNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTM6CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTEKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gZGlmZjogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBkZWZmOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0RpZmZlcmVudFJlcUZyb21Db21wdXRlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9EaWZmZXJlbnRSZXFGcm9tQ29tcHV0ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0MzhiYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9EaWZmZXJlbnRSZXFGcm9tQ29tcHV0ZS55bWwKQEAgLTAsMCArMSwzMiBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTE6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIHRlc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9GYXRoZXJIYXNOb1JlcUNhcC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRmF0aGVySGFzTm9SZXFDYXAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWFiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvRmF0aGVySGFzTm9SZXFDYXAueW1sCkBAIC0wLDAgKzEsOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5DUDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUwMS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMGE5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDEueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfYm9vbGVhbjoKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gZmFsc2UKKyAgICAgICAgICAgIC0gdHJ1ZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29vbGVhbgorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTAyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFmODljCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTAyLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSBmYWxzZQorICAgICAgICAgICAgLSB0cnVlZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUwMy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGQ5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDMueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIGZhbHNlCisgICAgICAgICAgICAtIDMKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjM3N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA0LnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSBmYWxzZQorICAgICAgICAgICAgLSAzLjU2CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA1LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUwNS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2YjQzNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUwNS55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAwMDAKKyAgICAgICAgICAgIC0gMy41NgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUwNi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDYueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjNjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDYueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIDEwMDAwCisgICAgICAgICAgICAtIGFhYWEKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDcueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU2ZTlkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA3LnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAxMDAwMAorICAgICAgICAgICAgLSB0cnVlCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA4LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUwOC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiMjFhNgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUwOC55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAuNTAKKyAgICAgICAgICAgIC0gdHJ1ZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMDkueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzI4NTkxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTA5LnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAxMC41MAorICAgICAgICAgICAgLSBhc2RjCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxMC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMTAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjU0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMTAueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIDEwLjUwCisgICAgICAgICAgICAtIDUwMAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMTEueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTExLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDI4YjUxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTExLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAxMC41MAorICAgICAgICAgICAgLSA1MDAuMEAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTEyLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxMi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0MDI1MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxMi55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAwMDAKKyAgICAgICAgICAgIC0gMyMKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMTMueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTEzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI1OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTEzLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSBmYWxzZQorICAgICAgICAgICAgLSB0cnVlJQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxNC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMTQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjYzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTGlzdFByb3BlcnR5RmFsdXJlMTQueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIGZhbHNlCisgICAgICAgICAgICAtIGZhbHNlZQorICAgICAgICAgICAgLSB0cnVlCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTE1LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxNS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlOGNhYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxNS55bWwKQEAgLTAsMCArMSwxOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAuNQorICAgICAgICAgICAgLSAxMC42eAorICAgICAgICAgICAgLSAyMC41CisgICAgICAgICAgICAtIDMwLjUKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL0xpc3RQcm9wZXJ0eUZhbHVyZTE2LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxNi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZWE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9MaXN0UHJvcGVydHlGYWx1cmUxNi55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9ib29sZWFuOgorICAgICAgICAgIHR5cGU6IGtva28KKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSBmYWxzZQorICAgICAgICAgICAgLSB0cnVlCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDEueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmYwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUwMS55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9ib29sZWFuOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIGZhbHNlCisgICAgICAgICAgICAtIHRydWUKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vb2xlYW4KKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YWJiODcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUwMi55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSBmYWxzZQorICAgICAgICAgICAgLSB0cnVlZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTAzLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTAzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY5YjZlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDMueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gZmFsc2UKKyAgICAgICAgICAgIC0gMworICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA0LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRjNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDQueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gZmFsc2UKKyAgICAgICAgICAgIC0gMy41NgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA1LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA1LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE2ZmYxCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDUueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAwMDAKKyAgICAgICAgICAgIC0gMy41NgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA2LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA2LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjc5MDRkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDYueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAwMDAKKyAgICAgICAgICAgIC0gYWFhYQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA3LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTEyM2YzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDcueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAwMDAKKyAgICAgICAgICAgIC0gdHJ1ZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA4LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA4LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I1MWZiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMDgueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAuNTAKKyAgICAgICAgICAgIC0gdHJ1ZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUwOS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUwOS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjOGRlZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTA5LnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIDEwLjUwCisgICAgICAgICAgICAtIGFzZGMKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTAueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjQ0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxMC55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAxMC41MAorICAgICAgICAgICAgLSA1MDAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTEueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzdkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxMS55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAxMC41MAorICAgICAgICAgICAgLSA1MDAuMEAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTIueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmJjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxMi55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAxMDAwMAorICAgICAgICAgICAgLSAzIworICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTEzLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTEzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc1YWFlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTMueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcGVydHk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gZmFsc2UKKyAgICAgICAgICAgIC0gdHJ1ZSUKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxNC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxNC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4NzIxMgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTE0LnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X3Byb3BlcnR5OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIGZhbHNlCisgICAgICAgICAgICAtIGZhbHNlZQorICAgICAgICAgICAgLSB0cnVlCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL01hcFByb3BlcnR5RmFsdXJlMTUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjNlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxNS55bWwKQEAgLTAsMCArMSwxOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLkxpbmtUZXN0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBteV9wcm9wZXJ0eToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAxMC41CisgICAgICAgICAgICAtIDEwLjZ4CisgICAgICAgICAgICAtIDIwLjUKKyAgICAgICAgICAgIC0gMzAuNQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxNi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTWFwUHJvcGVydHlGYWx1cmUxNi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZWE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NYXBQcm9wZXJ0eUZhbHVyZTE2LnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIG15X2Jvb2xlYW46CisgICAgICAgICAgdHlwZToga29rbworICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIGZhbHNlCisgICAgICAgICAgICAtIHRydWUKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTXlGYXRoZXJDb21wdXRlX05vUmVxQ2FwLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9NeUZhdGhlckNvbXB1dGVfTm9SZXFDYXAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzU2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvTXlGYXRoZXJDb21wdXRlX05vUmVxQ2FwLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlGYXRoZXJDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvU2FtZUNhcEFzQ29tcHV0ZS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvU2FtZUNhcEFzQ29tcHV0ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMzMzZQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9TYW1lQ2FwQXNDb21wdXRlLnltbApAQCAtMCwwICsxLDI2IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGUxOgorICAgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgYXR0cmlidXRlczoKKyAgICAgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIG5ldHdvcmtzOgorICAgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICAgICAgcG9ydHM6CisgICAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICAgIGhvc3Q6IAorICAgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgICAgICBPUzogCisgICAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICAgICAgQklORElORzoKKyAgICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL1NhbWVSZXFBc0NvbXB1dGUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL1NhbWVSZXFBc0NvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOGIyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvU2FtZVJlcUFzQ29tcHV0ZS55bWwKQEAgLTAsMCArMSwyMyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlMToKKyAgICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgIGF0dHJpYnV0ZXM6CisgICAgICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICBuZXR3b3JrczoKKyAgICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgICAgIHBvcnRzOgorICAgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAgICAtIExPQ0FMX1NUT1JBR0U6IAorICAgICAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCAxXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9TYW1lUmVxQXNDb21wdXRlX0Rlcml2ZWRGcm9tTXlDb21wdXRlMS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvU2FtZVJlcUFzQ29tcHV0ZV9EZXJpdmVkRnJvbU15Q29tcHV0ZTEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDEzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvU2FtZVJlcUFzQ29tcHV0ZV9EZXJpdmVkRnJvbU15Q29tcHV0ZTEueW1sCkBAIC0wLDAgKzEsMjMgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTI6CisgICAgICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGUxCisgICAgICAgIGF0dHJpYnV0ZXM6CisgICAgICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICBuZXR3b3JrczoKKyAgICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgICAgIHBvcnRzOgorICAgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAgICAtIExPQ0FMX1NUT1JBR0U6IAorICAgICAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCAyXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9jb21wdXRlQ2FwMTEueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2NvbXB1dGVDYXAxMS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlYTBiOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9jb21wdXRlQ2FwMTEueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMudmZjMzoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXQorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvY29tcHV0ZUNhcDFVTkJPVU5ERUQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2NvbXB1dGVDYXAxVU5CT1VOREVELnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGVmYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2NvbXB1dGVDYXAxVU5CT1VOREVELnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmZjLnZmYzI6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICBvY2N1cnJlbmNlczogWzEsIFVOQk9VTkRFRF0KKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2Rlcml2ZWRGcm9tTXlDb21wdXRlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9kZXJpdmVkRnJvbU15Q29tcHV0ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3YmVjMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9kZXJpdmVkRnJvbU15Q29tcHV0ZS55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLkRlcml2ZWRGcm9tTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGUKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvZGVyaXZlZEZyb21XZWJBcHBEZXJpdmVkUmVxQ2FwLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9kZXJpdmVkRnJvbVdlYkFwcERlcml2ZWRSZXFDYXAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzliZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvZGVyaXZlZEZyb21XZWJBcHBEZXJpdmVkUmVxQ2FwLnltbApAQCAtMCwwICsxLDE1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlXZWJBcHA6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBjb250ZXh0X3Jvb3Q6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGFwcF9lbmRwb2ludDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAjZGVyaXZlZCBmcm9tIFdlYkFwcGxpY2F0aW9uJ3MgdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50ICJhcHBfZW5kcG9pbnQiCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLkRvY2tlciAjZGVyaXZlZCBmcm9tIFdlYkFwcGxpY2F0aW9uJ3MgdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciAiaG9zdCIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnRBdHRyaWJ1dGVTdWNjZXNzRmxvdy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0QXR0cmlidXRlU3VjY2Vzc0Zsb3cueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYTlhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0QXR0cmlidXRlU3VjY2Vzc0Zsb3cueW1sCkBAIC0wLDAgKzEsNTMgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGVUZXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBteVByb3A6CisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIGRlc2NyaXRwaW9uOiBoZXkgRGVzYworICAgICAgICBkZWZhdWx0OiAKKyAgICAgICAgICAicHJvdG9jb2wiIDogaGV5MQorICAgICAgICAgICJ0b2tlbl90eXBlIiA6IGhleTIKKyAgICAgICAgICAidG9rZW4iIDogaGV5MworICAgICAgICAgICJrZXlzIiA6IHsia2V5QSIgOiAidmFsMSIgLCBrZXlCIDogdmFsMn0KKyAgICAgICAgICAidXNlciIgOiBoZXk0CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0YXR1czogc3VwcG9ydGVkCisgICAgICAgIGRlZmF1bHQ6IG15RGVmYXVsdAorICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IHZhbDEgLCBrZXlCIDogdmFsMn0KKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzIGlzIG15IGRlc2NyaXB0aW9uCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgInByb3RvY29sIiA6IGhleTEKKyAgICAgICAgICAidG9rZW5fdHlwZSIgOiBoZXkyCisgICAgICAgICAgInRva2VuIiA6IGhleTMKKyAgICAgICAgICAia2V5cyIgOiB7ImtleUEiIDogInZhbDEiICwga2V5QiA6IHZhbDJ9CisgICAgICAgICAgInVzZXIiIDogaGV5NAorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0Q2FwYWJpbGl0eU5hbWVFeGlzdHNPblBhcmVudC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0Q2FwYWJpbGl0eU5hbWVFeGlzdHNPblBhcmVudC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ZGI2YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnRDYXBhYmlsaXR5TmFtZUV4aXN0c09uUGFyZW50LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlMToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIEJpbmRpbmc6ICMiYmluZGluZyIgZXhpc3RzIG9uIHBhcmVudAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0RHVwbGljYXRlQ2FwYWJpbGl0eS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0RHVwbGljYXRlQ2FwYWJpbGl0eS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjMzk1MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnREdXBsaWNhdGVDYXBhYmlsaXR5LnltbApAQCAtMCwwICsxLDQyIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdIAorICAgICAgLSBMT0NBTF9TdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgU2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnREdXBsaWNhdGVSZXF1aXJlbWVudHMueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydER1cGxpY2F0ZVJlcXVpcmVtZW50cy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhYjNhYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnREdXBsaWNhdGVSZXF1aXJlbWVudHMueW1sCkBAIC0wLDAgKzEsNDAgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gCisgICAgICAtIExPQ0FMX1N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydExpc3RQcm9wZXJ0eUJhZERlZmF1bHQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydExpc3RQcm9wZXJ0eUJhZERlZmF1bHQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmYwODgKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0TGlzdFByb3BlcnR5QmFkRGVmYXVsdC55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLlRlc3RSZXNvdXJjZToKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcDoKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTIKKyAgICAgICAgICAgIC0gdHJ1ZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgIGxpbms6CisgICAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnRMaXN0UHJvcGVydHlHb29kRGVmYXVsdC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0TGlzdFByb3BlcnR5R29vZERlZmF1bHQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODY0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0TGlzdFByb3BlcnR5R29vZERlZmF1bHQueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfcHJvcDoKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gZmFsc2UKKyAgICAgICAgICAgIC0gdHJ1ZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydExpc3RQcm9wZXJ0eVN1Y2Nlc3NGbG93LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnRMaXN0UHJvcGVydHlTdWNjZXNzRmxvdy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1MmRmNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnRMaXN0UHJvcGVydHlTdWNjZXNzRmxvdy55bWwKQEAgLTAsMCArMSwxOTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgbXlfYm9vbGVhbjoKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gZmFsc2UKKyAgICAgICAgICAgIC0gdHJ1ZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIG15X2Jvb2xlYW5fYXJyYXk6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IFsgdHJ1ZSAsIGZhbHNlIF0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkdXBsaWNhdGVfYm9vbGVhbl92YWx1ZXM6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IFsgdHJ1ZSAsIGZhbHNlICwgdHJ1ZSBdCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgYm9vbGVhbl9udWxsX3ZhbHVlOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSB0cnVlCisgICAgICAgICAgICAtCisgICAgICAgICAgICAtIGZhbHNlCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgbXlfaW50ZWdlcnM6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIDAKKyAgICAgICAgICAgIC0gMTAwMAorICAgICAgICAgICAgLSAtMTAwMAorICAgICAgICAgICAgLSA1MAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIG15X2ludGVnZXJzX2FycmF5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiBbIDEwICwgLTEwMDAsIDAgXQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGR1cGxpY2F0ZV9pbnRlZ2Vyc192YWx1ZXM6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IFsgMTAgLCAxMCwgLTEwMDAsIDAgXQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfbnVsbF92YWx1ZToKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gMTAwMAorICAgICAgICAgICAgLQorICAgICAgICAgICAgLSAyMDAwCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgbXlfc3RyaW5nOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSA8Yj5hc2RjPGI+CisgICAgICAgICAgICAtICQ/XkBlY29tcCQhIyUoKV8tfkArKl4uLi47Oy93IworICAgICAgICAgICAgLSB1YworICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgbXlfc3RyaW5nX2FycmF5OgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiBbICA8Yj5BQUE8L2I+LCB+JH4jYmJiJV4qXy0sIHF3ZSAsIDEuMyAsIDxiPjUwMDwvYj4gLCB0cnVlIF0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19udWxsX3ZhbHVlOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSA8Yj5hc2RjPGI+CisgICAgICAgICAgICAtCisgICAgICAgICAgICAtIHVjCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfc3BhY2VfdmFsdWU6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAtIDxiPiAgYXNkYzxiPgorICAgICAgICAgICAgLSAgICAKKyAgICAgICAgICAgIC0gICAgIHVjCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkdXBsaWNhdGVfc3RyaW5nX3ZhbHVlczoKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gYXNkYworICAgICAgICAgICAgLSBhc2RjCisgICAgICAgICAgICAtIHVjCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBteV9mbG9hdDoKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC0gNgorICAgICAgICAgICAgLSAxMDAwLjAwMDAwMQorICAgICAgICAgICAgLSAtMy4wZgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBteV9mbG9hdF9hcnJheToKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDogWyAwLjAxICwgLTUuMCAsIDIuMWYgXQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBkdXBsaWNhdGVfZmxvYXRfdmFsdWVzOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSAwLjAKKyAgICAgICAgICAgIC0gMC4wCisgICAgICAgICAgICAtIDQuNTU1NTU1CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X25vX2RlZmF1bHRfdmFsdWVzOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBmbG9hdF9udWxsX3ZhbHVlOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSA2CisgICAgICAgICAgICAtCisgICAgICAgICAgICAtIC0zLjBmCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3NwYWNlX3ZhbHVlOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLSA2CisgICAgICAgICAgICAtIAorICAgICAgICAgICAgLSAtMy4wZgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBpbnRlZ2VyX25vX2RlZmF1bHRfdmFsdWVzOgorICAgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHN0cmluZ19ub19kZWZhdWx0X3ZhbHVlczoKKyAgICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGJvb2xlYW5fbm9fZGVmYXVsdF92YWx1ZXM6CisgICAgICAgICAgdHlwZTogbGlzdAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydE1hcFByb3BlcnR5U3VjY2Vzc0Zsb3cueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydE1hcFByb3BlcnR5U3VjY2Vzc0Zsb3cueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTY2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0TWFwUHJvcGVydHlTdWNjZXNzRmxvdy55bWwKQEAgLTAsMCArMSw0NTIgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5MaW5rVGVzdDoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgICAgcHJvcGVydGllczoKKyAgICAgICAgc3RyaW5nX3Byb3AwMToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IHZhbDEgLCBrZXlCIDogdmFsMn0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMDI6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAidmFsMSIgLCBrZXlCIDogInZhbDIifQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AwMzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogInZhbDEiICwga2V5QiA6IHZhbDJ9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDA0OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHsia2V5QSIgOiAxMCAsIGtleUIgOiA8Yj50cnVlPC9iPiB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDA1OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHsia2V5QSIgOiAgLCBrZXlCIDogIkJpZyIgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AwNjoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogYWFhQSAgLCBrZXlCIDogbnVsbCB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDA3OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHsia2V5QSIgOiBOVUxMICAsIGtleUIgOiBOdWxsIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMDg6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDogeyJrZXlBIiA6ICIiICAsIGtleUIgOiAiYWJjZCIgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AwOToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogIiAgIiAgLCBrZXlCIDogImFiY2QiIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMTA6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDogeyJrZXlBIiA6ICIgICAgYWFhYSIgICwga2V5QiA6ICIgICAgYmJiYiIgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxMToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogImFhYWEgICAgICAiICAsIGtleUIgOiAiYmJiYiAgICAgIiB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDEyOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHsia2V5QSIgOiAiICAgICBhYWFhICAgICAgIiAgLCBrZXlCIDogIiAgICAgYmJiYiAgICBjY2NjYyAgICIgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxMzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6ICJhYWFhIgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxNDoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6ICIgICAgICBhYWFhICAgICAgICAiCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDE1OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogQWJjRAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxNjoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6ICAgICAgICAgQWJjRAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxNzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6ICAgICAgICAgQWJjRCAgICAgIAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxODoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IDxiPkFiY0Q8L2I+ICAgICAgCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDE5OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogPGI+QWJjRCAgICAgIAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AyMDoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IGFhYWEKKyAgICAgICAgICAgIGtleWEgOiBhYWFhCisgICAgICAgICAgICBLZXlhIDogQWFhYQorICAgICAgICAgICAgS0VZQSA6IG5ubm4KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMjE6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiBOVUxMCisgICAgICAgICAgICBrZXlCIDogbnVsbAorICAgICAgICAgICAga2V5QyA6IE51bGwKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMjI6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGludGVnZXJfcHJvcDAxOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogMSAsIGtleUIgOiAxMDAwfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDAyOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogTnVsbCAsIGtleUIgOiBOVUxMICxrZXlDIDogbnVsbCB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMDM6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAgLCBrZXlCIDogLTYwMH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AwMzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6ICAgICAgICAgICAgODAwICAsIGtleUIgOiAgICAgICAgICAtNjAwfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDA0OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogICAgICAgICAgICAgICwga2V5QiA6ICAgICAgICAgIC02MDB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMDU6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAxMDAgICAgICAgICAgICAgICwga2V5QiA6IDAgICAgICB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMDY6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAxMDAgLCBrZXlCIDogMDB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMDc6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAgIDEwMCAgICAsIGtleUIgOiAgICAxMDAgICAgICAgIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AwODoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IDEwMAorICAgICAgICAgICAga2V5QiA6IDIwMAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDA5OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogICAgICAgICAgICAxMDAKKyAgICAgICAgICAgIGtleUIgOiAyMDAgICAgICAgICAgIAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDEwOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogbnVsbAorICAgICAgICAgICAga2V5QSA6IE51bGwKKyAgICAgICAgICAgIGtleUIgOiAxMTExCisgICAgICAgICAgICBrZXlCIDogMjIyMgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDExOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogbnVsbAorICAgICAgICAgICAga2V5QiA6IE51bGwKKyAgICAgICAgICAgIGtleUMgOiBOVUxMCisgICAgICAgICAgICBrZXlEIDogCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMTI6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AxMzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IDEwMCAsIGtleUEgOiAyMDB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgYm9vbGVhbl9wcm9wMDE6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiB0cnVlICwga2V5QiA6IGZhbHNlICwga2V5QyA6IGZhbHNlIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBib29sZWFuX3Byb3AwMjoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IFRSVUUgLCBrZXlCIDogRkFMU0UgLCBrZXlDIDogRmFsc2UgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGJvb2xlYW5fcHJvcDAzOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogbnVsbAorICAgICAgICAgICAga2V5QiA6IE51bGwKKyAgICAgICAgICAgIGtleUMgOiBOVUxMCisgICAgICAgICAgICBrZXlEIDogCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgYm9vbGVhbl9wcm9wMDQ6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiBOdWxsICwga2V5QiA6IE5VTEwgLGtleUMgOiBudWxsICxrZXlEIDogfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGJvb2xlYW5fcHJvcDA1OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogICAgICB0cnVlICwga2V5QiA6IGZhbHNlICAgICAsIGtleUMgOiAgICAgZmFsc2UgICAgICAgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGJvb2xlYW5fcHJvcDA2OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogICAgIHRydWUKKyAgICAgICAgICAgIGtleUIgOiB0cnVlCisgICAgICAgICAgICBrZXlDIDogICAgICAgZmFsc2UKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBib29sZWFuX3Byb3AwNzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGJvb2xlYW5fcHJvcDA4OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogZmFsc2UKKyAgICAgICAgICAgIGtleUEgOiB0cnVlCisgICAgICAgICAgICBrZXlCIDogdHJ1ZQorICAgICAgICAgICAga2V5QiA6IGZhbHNlCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgYm9vbGVhbl9wcm9wMDk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiB0cnVlLGtleUEgOiBmYWxzZSxrZXlCIDogZmFsc2Usa2V5QiA6IHRydWV9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZmxvYXRfcHJvcDAxOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogMS4yMCAsIGtleUIgOiAzLjU2ZiAsIGtleUMgOiAzM30KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgZmxvYXRfcHJvcDAyOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogMC4wMCwga2V5QiA6IDAuMCAsIGtleUMgOiAwIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgZmxvYXRfcHJvcDAzOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogbnVsbCwga2V5QiA6IE51bGwgLCBrZXlDIDogTlVMTCAsIGtleUQgOiB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AwNDoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6ICAgICAgMS4yMCAsIGtleUIgOiAzLjU2ZiAgICAgICAsIGtleUMgOiAgICAgIDMzICAgICAgICB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AwNToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IDMzCisgICAgICAgICAgICBrZXlCIDogMS4yMDAwCisgICAgICAgICAgICBrZXlDIDogMy42MDdmCisgICAgICAgICAgICBrZXlEIDogMAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBmbG9hdF9wcm9wMDY6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAgICAgICAzMworICAgICAgICAgICAga2V5QiA6IDEuMjAwMCAgICAgIAorICAgICAgICAgICAga2V5QyA6ICAgIDMuNjA3ZiAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgZmxvYXRfcHJvcDA3OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogbnVsbAorICAgICAgICAgICAga2V5QiA6IE51bGwKKyAgICAgICAgICAgIGtleUMgOiBOVUxMCisgICAgICAgICAgICBrZXlEIDogCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AwODoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBmbG9hdF9wcm9wMDk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAzLjUKKyAgICAgICAgICAgIGtleUEgOiAwLjAxCisgICAgICAgICAgICBrZXlCIDogMy42CisgICAgICAgICAgICBrZXlCIDogCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AxMDoKKyAgICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IDAuMDAwMn0KKyAgICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgZmxvYXRfcHJvcDExOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogMC4wMDAgLCBrZXlBIDogMDAzLjU2Ziwga2V5QiA6IDMzfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgY2FwYWJpbGl0aWVzOgorICAgICAgICBsaW5rOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydFJlcXVpcmVtZW50TmFtZUV4aXN0c09uUGFyZW50LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnRSZXF1aXJlbWVudE5hbWVFeGlzdHNPblBhcmVudC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNjI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9pbXBvcnRSZXF1aXJlbWVudE5hbWVFeGlzdHNPblBhcmVudC55bWwKQEAgLTAsMCArMSwzNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTE6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIExvY2FsX1N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydFJlcXVpcmVtZW50TmFtZUV4aXN0c09uUGFyZW50X0Rlcml2ZWRGcm9tTXlDb21wdXRlMS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvaW1wb3J0UmVxdWlyZW1lbnROYW1lRXhpc3RzT25QYXJlbnRfRGVyaXZlZEZyb21NeUNvbXB1dGUxLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU5NTUyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL2ltcG9ydFJlcXVpcmVtZW50TmFtZUV4aXN0c09uUGFyZW50X0Rlcml2ZWRGcm9tTXlDb21wdXRlMS55bWwKQEAgLTAsMCArMSwzNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTI6CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTEKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gTG9jYWxfU3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL21pc3NpbmdDYXBJbkNhcERlZmluaXRpb24ueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL21pc3NpbmdDYXBJbkNhcERlZmluaXRpb24ueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTExNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbWlzc2luZ0NhcEluQ2FwRGVmaW5pdGlvbi55bWwKQEAgLTAsMCArMSwzNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK2Rlc2NyaXB0aW9uOiBUZW1wbGF0ZSBmb3IgdlNDUCAtLSBjb25uZWN0YWJsZSB0byBPQ1MtRlcgLS0gdGVtcG9yYXJ5IG1vZGVsIGZvciAxNjAyIGRlbW8KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgbW9kZWwgY2FwdHVyZSBmb3VyIHN1Yi1jb21wb25lbnRzIChWRFVzKSBhbmQgdGhlaXIgY29ubmVjdGl2aXR5IHRvIHNpeAorIyBuZXR3b3Jrcy4gCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK25vZGVfdHlwZXM6CisKKyNUaGUgbm9kZSB0eXBlIGZvciB2U0NQCisjdXNlZCBmb3Igc3Vic3RpdHV0aW9uIG1hcHBpbmcsIG9yIHRvIGRlc2NyaWJlIHZTQ1AgcmVzb3VyY2UgaW4gQVNEQyBzdHVkaW8KKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52U0NQLTAzLTE2OiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBzaWd0cmFuX2Nvbm5lY3Rpb24xOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgICAtIHNpZ3RyYW5fY29ubmVjdGlvbjI6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgIC0gb2NzX2Nvbm5lY3Rpb246CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgIC0gb2FtX2Nvbm5lY3Rpb246IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgICAtIGZpcmV3YWxsOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm5ldHdvcmtJbnRlcmZhY2VOb3RGb3VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9taXNzaW5nQ2FwSW5SZXFEZWZpbml0aW9uLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9taXNzaW5nQ2FwSW5SZXFEZWZpbml0aW9uLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTAwZGFmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL21pc3NpbmdDYXBJblJlcURlZmluaXRpb24ueW1sCkBAIC0wLDAgKzEsMjUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitkZXNjcmlwdGlvbjogVGVtcGxhdGUgZm9yIHZTQ1AgLS0gY29ubmVjdGFibGUgdG8gT0NTLUZXIC0tIHRlbXBvcmFyeSBtb2RlbCBmb3IgMTYwMiBkZW1vCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIG1vZGVsIGNhcHR1cmUgZm91ciBzdWItY29tcG9uZW50cyAoVkRVcykgYW5kIHRoZWlyIGNvbm5lY3Rpdml0eSB0byBzaXgKKyMgbmV0d29ya3MuIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitub2RlX3R5cGVzOgorCisjVGhlIG5vZGUgdHlwZSBmb3IgdlNDUAorI3VzZWQgZm9yIHN1YnN0aXR1dGlvbiBtYXBwaW5nLCBvciB0byBkZXNjcmliZSB2U0NQIHJlc291cmNlIGluIEFTREMgc3R1ZGlvCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudlNDUC0wMy0xNjogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gc2lndHJhbl9jb25uZWN0aW9uMToKKyAgICAgICAgICBjYXBhYmlsaXR5OiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5uZXR3b3JrSW50ZXJmYWNlTm90Rm91bmQKKyAgICAgIC0gc2lndHJhbl9jb25uZWN0aW9uMjoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorICAgICAgLSBvY3NfY29ubmVjdGlvbjoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorICAgICAgLSBvYW1fY29ubmVjdGlvbjogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgIC0gZmlyZXdhbGw6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDaGlsZENvbXB1dGVfTm9SZXFDYXAueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q2hpbGRDb21wdXRlX05vUmVxQ2FwLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzViMjAyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q2hpbGRDb21wdXRlX05vUmVxQ2FwLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDaGlsZENvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLk15RmF0aGVyQ29tcHV0ZQorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDaGlsZFdlYkFwcF9EZXJpdmVkRnJvbUNvbnRhaW5lci55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDaGlsZFdlYkFwcF9EZXJpdmVkRnJvbUNvbnRhaW5lci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4NTlkNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNoaWxkV2ViQXBwX0Rlcml2ZWRGcm9tQ29udGFpbmVyLnltbApAQCAtMCwwICsxLDE1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDaGlsZFdlYkFwcDoKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlXZWJBcHAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgY29udGV4dF9yb290OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhcHBfZW5kcG9pbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YmY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVEZXJpdmVkRnJvbU5vdEV4aXN0cy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlRGVyaXZlZEZyb21Ob3RFeGlzdHMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjgwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlRGVyaXZlZEZyb21Ob3RFeGlzdHMueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290Tm90RXhpc3RzCisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZUluY29ycmVjdERlZmVuaXRpb25WZXJzaW9uVmFsdWUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZUluY29ycmVjdERlZmVuaXRpb25WZXJzaW9uVmFsdWUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYTNhZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlSW5jb3JyZWN0RGVmZW5pdGlvblZlcnNpb25WYWx1ZS55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2FTaW1wbGVZYW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVJbmNvcnJlY3ROYW1lU3BhY2VGb3JtYXQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZUluY29ycmVjdE5hbWVTcGFjZUZvcm1hdC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhNjEzZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVJbmNvcnJlY3ROYW1lU3BhY2VGb3JtYXQueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZTIuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVOb0RlZmVuaXRpb25WZXJzaW9uLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVOb0RlZmVuaXRpb25WZXJzaW9uLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg0ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZU5vRGVmZW5pdGlvblZlcnNpb24ueW1sCkBAIC0wLDAgKzEsMzQgQEAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZU9jY3VyZW5jeVN1Y2Nlc3MueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZU9jY3VyZW5jeVN1Y2Nlc3MueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYWU2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlT2NjdXJlbmN5U3VjY2Vzcy55bWwKQEAgLTAsMCArMSw3NyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgVU5CT1VOREVEXQorICAgICAgLSBsb2NhbF9zdG9yYWdlMjAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxXQorICAgICAgLSBsb2NhbF9zdG9yYWdlMzAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxMF0KKyAgICAgIC0gbG9jYWxfc3RvcmFnZTQwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMTAwMDAwMDBdCisgICAgICAtIGxvY2FsX3N0b3JhZ2U1MDA6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzIsIDNdCisgICAgICAtIGxvY2FsX3N0b3JhZ2VOb09jY3VycmVuY2VzNjAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvICAgICAgICAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnROb09jY3VycmVuY2UgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBlbmRwb2ludDIwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbgorICAgICAgICBvY2N1cnJlbmNlczogWzEsIDJdICAKKyAgICAgIGVuZHBvaW50MzAwIDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgMV0gIAorICAgICAgZW5kcG9pbnQ0MDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4KKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxMF0gIAorICAgICAgZW5kcG9pbnQ1MDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4KKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAxMDAwMDAwMF0gIAorICAgICAgZW5kcG9pbnQ2MDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4KKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCBVTkJPVU5ERUQgIF0gICAKKyAgICAgIGVuZHBvaW50NzAwIDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluCisgICAgICAgIG9jY3VycmVuY2VzOiBbMiwgNCAgXSAgCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZVBhcnNzaW5nRmFsdXJlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVQYXJzc2luZ0ZhbHVyZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0M2FkZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVQYXJzc2luZ0ZhbHVyZS55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW5zOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZVJlcU5hbWVFeGlzdHNPbkRlcml2ZWQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZVJlcU5hbWVFeGlzdHNPbkRlcml2ZWQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDkyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlUmVxTmFtZUV4aXN0c09uRGVyaXZlZC55bWwKQEAgLTAsMCArMSwzNCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZTE6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIExvY2FsX1N0b3JhZ2U6ICMibG9jYWxfc3RvcmFnZSIgZXhpc3RzIG9uIHBhcmVudAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZVZGLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVWRi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlNzcxZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVWRi55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLlZGLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlV2l0aE5vZGVUeXBlc1R3aWNlLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUNvbXB1dGVXaXRoTm9kZVR5cGVzVHdpY2UueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjIwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlV2l0aE5vZGVUeXBlc1R3aWNlLnltbApAQCAtMCwwICsxLDQyIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuZXhhbXBsZS5UcmFuc2FjdGlvblN1YnN5c3RlbToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBtZXNzYWdlX3JlY2VpdmVyOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGRhdGFiYXNlX2VuZHBvaW50OiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuRGF0YWJhc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlDb21wdXRlV2l0aFRvcG9sb2d5VGVtcGxhdGUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZVdpdGhUb3BvbG9neVRlbXBsYXRlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDUxZWIyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215Q29tcHV0ZVdpdGhUb3BvbG9neVRlbXBsYXRlLnltbApAQCAtMCwwICsxLDQ0IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAordG9wb2xvZ3lfdGVtcGxhdGU6CisgIGRlc2NyaXB0aW9uOiBUZW1wbGF0ZSBvZiBhbiBhcHBsaWNhdGlvbiBjb25uZWN0aW5nIHRvIGEgZGF0YWJhc2UuCisgCisgIG5vZGVfdGVtcGxhdGVzOgorICAgIHdlYl9hcHA6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbi5NeVdlYkFwcAorICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgICAtIGhvc3Q6IHdlYl9zZXJ2ZXIKKyAgICAgICAgLSBkYXRhYmFzZV9lbmRwb2ludDogZGIKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215RmF0aGVyV2ViQXBwX2RlcnZpZWRGcm9tRG9ja2VyLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUZhdGhlcldlYkFwcF9kZXJ2aWVkRnJvbURvY2tlci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhOWExNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teUZhdGhlcldlYkFwcF9kZXJ2aWVkRnJvbURvY2tlci55bWwKQEAgLTAsMCArMSwxNiBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15V2ViQXBwOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgY29udGV4dF9yb290OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhcHBfZW5kcG9pbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIEhPU3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIuRG9ja2VyCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuV2ViU2VydmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgMSwgMiBdCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlMaW5rVkwueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215TGlua1ZMLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc5NmQyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL215TGlua1ZMLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTXlMaW5rOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9teVBvcnRDUC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlQb3J0Q1AueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjU1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbXlQb3J0Q1AueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5NeVBvcnQ6CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLlBvcnQKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgICBub2RlOiBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLk15TGluaworICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5CaW5kVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL25vQ29udGVudC55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvbm9Db250ZW50LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL25vQ29udGVudC55bWwKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwMS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMDEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDdhMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMDEueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2UxMDA6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzIsIDBdCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTAyLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwMi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4N2I2MwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwMi55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbLTEsIDJdCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTAzLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwMy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmZGZmYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwMy55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMSwgLTJdCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA0LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwNC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhNTgyZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwNC55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbICwgMl0KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMDUueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA1LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM2YTkzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA1LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgMSwgXQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50MTAwIDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwNi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMDYueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWY1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMDYueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2UxMDA6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWyAwICwgMCBdCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA3LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwNy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkOTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUwNy55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbIEAgLCAxIF0KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMDgueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA4LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGVmYzk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA4LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgMS4wICwgMi4wIF0KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMDkueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmVjN2VhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTA5LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgIjEiICwgIjIiIF0KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMTAueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTEwLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RlNDI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTEwLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgIF0KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMTEueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTExLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRhZTNhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTExLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsgVU5CT1VOREVEICwgVU5CT1VOREVEICBdCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTMxLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzMS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMDM0YQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzMS55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50MTAwIDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgICBvY2N1cnJlbmNlczogWyAyLCAxXSAgCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTMyLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzMi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1ZWJhOQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzMi55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50MTAwIDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgICBvY2N1cnJlbmNlczogWyAtMSwgMl0gIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzMy55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNDJlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzMueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2UxMDA6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsgMSwgLTJdICAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzQueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTM0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTk1M2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTM0LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICAgIG9jY3VycmVuY2VzOiBbICwgMl0gIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzNS55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODk4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzUueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2UxMDA6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsgMSAsIF0gIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzNi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzYueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTQ0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzYueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2UxMDA6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludDEwMCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsgMCAsIDAgXSAgCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTM3LnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzNy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4Yzk4MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9vY2N1cmVuY3lGYWx1cmUzNy55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTEwMDogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50MTAwIDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgICBvY2N1cnJlbmNlczogWyAwICwgIyBdICAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzgueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTM4LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM0NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTM4LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICAgIG9jY3VycmVuY2VzOiBbIDEuMCAsIDIuMCBdICAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlMzkueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTM5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQzMzhkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTM5LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICAgIG9jY3VycmVuY2VzOiBbICIxIiAsICIyIiBdICAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlNDAueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTQwLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGEzMmJhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTQwLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICAgIG9jY3VycmVuY2VzOiBbICBdICAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvb2NjdXJlbmN5RmFsdXJlNDEueW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTQxLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzAyNGEzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL29jY3VyZW5jeUZhbHVyZTQxLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlMTAwOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQxMDAgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICAgIG9jY3VycmVuY2VzOiBbIFVOQk9VTkRFRCwgVU5CT1VOREVEIF0gIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9zb2Z0d2FyZUNvbXBvbmVudFJlcTExLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9zb2Z0d2FyZUNvbXBvbmVudFJlcTExLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJkYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvaW1wb3J0VG9zY2FSZXNvdXJjZUJ5Q3JlYXRlVXJsL3NvZnR3YXJlQ29tcG9uZW50UmVxMTEueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMudmZjNDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgIyBkb21haW4tc3BlY2lmaWMgc29mdHdhcmUgY29tcG9uZW50IHZlcnNpb24KKyAgICAgIGNvbXBvbmVudF92ZXJzaW9uOiAKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGFkbWluX2NyZWRlbnRpYWw6IAorICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzEsIDFdICAgCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvc29mdHdhcmVDb21wb25lbnRSZXExMi55bWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9pbXBvcnRUb3NjYVJlc291cmNlQnlDcmVhdGVVcmwvc29mdHdhcmVDb21wb25lbnRSZXExMi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NmJjZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2ltcG9ydFRvc2NhUmVzb3VyY2VCeUNyZWF0ZVVybC9zb2Z0d2FyZUNvbXBvbmVudFJlcTEyLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmZjLnZmYzE6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFsxLCAyXSAgIApkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdGVzdENzYXJBUEkvdG9wb2xvZ3kudHh0IGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdGVzdENzYXJBUEkvdG9wb2xvZ3kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NmFmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90ZXN0Q3NhckFQSS90b3BvbG9neS50eHQKQEAgLTAsMCArMSBAQAoreyJpZCI6ImMyNTgxMWZjLWUwM2YtNDAxZC05M2NhLTQ1ZDliZDMxMjcwMyIsImRlbGVnYXRlSWQiOiIxNzcxMGE4OC1mM2Q4LTQ4M2QtYWRlZC1hZmVlMjkwNmE4YzEiLCJkZWxlZ2F0ZVR5cGUiOiJ0b3BvbG9neXRlbXBsYXRlIiwiZGVwZW5kZW5jaWVzIjpbeyJuYW1lIjoidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50IiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtd2ViU2VydmVyIiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJhcGFjaGUtdHlwZSIsInZlcnNpb24iOiIyLjAuMC1TTkFQU0hPVCJ9LHsibmFtZSI6InRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlIiwidmVyc2lvbiI6IjEuMC4wLndkMDMtU05BUFNIT1QifSx7Im5hbWUiOiJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdCIsInZlcnNpb24iOiIxLjAuMC53ZDAzLVNOQVBTSE9UIn1dLCJub2RlVGVtcGxhdGVzIjpbeyJrZXkiOiJDb21wdXRlXzIiLCJ2YWx1ZSI6eyJ0eXBlIjoidG9zY2Eubm9kZXMuQ29tcHV0ZSIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsiZGlza19zaXplIjpudWxsLCJudW1fY3B1cyI6bnVsbCwib3NfZGlzdHJpYnV0aW9uIjpudWxsLCJvc19hcmNoIjpudWxsLCJtZW1fc2l6ZSI6bnVsbCwib3NfdHlwZSI6bnVsbCwib3NfdmVyc2lvbiI6bnVsbH0sImF0dHJpYnV0ZXMiOnsiaXBfYWRkcmVzcyI6bnVsbCwidG9zY2FfaWQiOm51bGwsInRvc2NhX25hbWUiOm51bGx9LCJyZWxhdGlvbnNoaXBzIjpudWxsLCJyZXF1aXJlbWVudHMiOnsiZGVwZW5kZW5jeSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwibmV0d29yayI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLkNvbm5lY3Rpdml0eSIsInByb3BlcnRpZXMiOm51bGx9fSwiY2FwYWJpbGl0aWVzIjp7Imhvc3QiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLCJwcm9wZXJ0aWVzIjp7InZhbGlkX25vZGVfdHlwZXMiOm51bGx9fSwicm9vdCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiLCJwcm9wZXJ0aWVzIjpudWxsfSwiYXR0YWNoIjp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudCIsInByb3BlcnRpZXMiOm51bGx9LCJzY2FsYWJsZSI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlIiwicHJvcGVydGllcyI6eyJtYXhfaW50YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJkZWZhdWx0X2luc3RhbmNlcyI6eyJ2YWx1ZSI6IjEiLCJkZWZpbml0aW9uIjpmYWxzZX0sIm1pbl9pbnRhbmNlcyI6eyJ2YWx1ZSI6IjEiLCJkZWZpbml0aW9uIjpmYWxzZX19fX0sImFydGlmYWN0cyI6bnVsbH19LHsia2V5IjoiQXBhY2hlIiwidmFsdWUiOnsidHlwZSI6ImFsaWVuLm5vZGVzLkFwYWNoZSIsIm5hbWUiOm51bGwsInByb3BlcnRpZXMiOnsicG9ydCI6IjgwIiwiZG9jdW1lbnRfcm9vdCI6Ii92YXIvd3d3IiwidmVyc2lvbiI6IjIuNCJ9LCJhdHRyaWJ1dGVzIjp7InRvc2NhX2lkIjpudWxsLCJ0b3NjYV9uYW1lIjpudWxsfSwicmVsYXRpb25zaGlwcyI6eyJhdHRhY2hUb0NvbXB1dGVfMiI6eyJ0eXBlIjoidG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hUbyIsInRhcmdldCI6IkNvbXB1dGVfMiIsInJlcXVpcmVtZW50TmFtZSI6ImRlcGVuZGVuY3kiLCJyZXF1aXJlbWVudFR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInRhcmdldGVkQ2FwYWJpbGl0eU5hbWUiOiJhdHRhY2gifX0sInJlcXVpcmVtZW50cyI6eyJkZXBlbmRlbmN5Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9LCJob3N0Ijp7InR5cGUiOiJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwicHJvcGVydGllcyI6bnVsbH19LCJjYXBhYmlsaXRpZXMiOnsic2VjdXJlX2VuZHBvaW50Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiLCJwcm9wZXJ0aWVzIjp7InBvcnQiOm51bGwsInByb3RvY29sIjp7InZhbHVlIjoidGNwIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJ1cmxfcGF0aCI6bnVsbCwic2VjdXJlIjp7InZhbHVlIjoiZmFsc2UiLCJkZWZpbml0aW9uIjpmYWxzZX19fSwiYXBwX2VuZHBvaW50Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiLCJwcm9wZXJ0aWVzIjp7InBvcnQiOm51bGwsInByb3RvY29sIjp7InZhbHVlIjoidGNwIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJ1cmxfcGF0aCI6bnVsbCwic2VjdXJlIjp7InZhbHVlIjoiZmFsc2UiLCJkZWZpbml0aW9uIjpmYWxzZX19fSwiaG9zdCI6eyJ0eXBlIjoiYWxpZW4uY2FwYWJpbGl0aWVzLkFwYWNoZUNvbnRhaW5lciIsInByb3BlcnRpZXMiOnsidmFsaWRfbm9kZV90eXBlcyI6bnVsbH19LCJyb290Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCIsInByb3BlcnRpZXMiOm51bGx9fSwiYXJ0aWZhY3RzIjpudWxsfX0seyJrZXkiOiJDb21wdXRlIiwidmFsdWUiOnsidHlwZSI6InRvc2NhLm5vZGVzLkNvbXB1dGUiLCJuYW1lIjpudWxsLCJwcm9wZXJ0aWVzIjp7ImRpc2tfc2l6ZSI6bnVsbCwibnVtX2NwdXMiOm51bGwsIm9zX2Rpc3RyaWJ1dGlvbiI6bnVsbCwib3NfYXJjaCI6bnVsbCwibWVtX3NpemUiOm51bGwsIm9zX3R5cGUiOm51bGwsIm9zX3ZlcnNpb24iOm51bGx9LCJhdHRyaWJ1dGVzIjp7ImlwX2FkZHJlc3MiOm51bGwsInRvc2NhX2lkIjpudWxsLCJ0b3NjYV9uYW1lIjpudWxsfSwicmVsYXRpb25zaGlwcyI6bnVsbCwicmVxdWlyZW1lbnRzIjp7ImRlcGVuZGVuY3kiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiwicHJvcGVydGllcyI6bnVsbH0sIm5ldHdvcmsiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Db25uZWN0aXZpdHkiLCJwcm9wZXJ0aWVzIjpudWxsfX0sImNhcGFiaWxpdGllcyI6eyJob3N0Ijp7InR5cGUiOiJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwicHJvcGVydGllcyI6eyJ2YWxpZF9ub2RlX3R5cGVzIjpudWxsfX0sInJvb3QiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiwicHJvcGVydGllcyI6bnVsbH0sImF0dGFjaCI6eyJ0eXBlIjoidG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQiLCJwcm9wZXJ0aWVzIjpudWxsfSwic2NhbGFibGUiOnsidHlwZSI6InRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSIsInByb3BlcnRpZXMiOnsibWF4X2ludGFuY2VzIjp7InZhbHVlIjoiMSIsImRlZmluaXRpb24iOmZhbHNlfSwiZGVmYXVsdF9pbnN0YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9LCJtaW5faW50YW5jZXMiOnsidmFsdWUiOiIxIiwiZGVmaW5pdGlvbiI6ZmFsc2V9fX19LCJhcnRpZmFjdHMiOm51bGx9fV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdGVzdENzYXJBUEkvdG9wb2xvZ3lUZW1wbGF0ZS50eHQgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90ZXN0Q3NhckFQSS90b3BvbG9neVRlbXBsYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ZkZjAyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdGVzdENzYXJBUEkvdG9wb2xvZ3lUZW1wbGF0ZS50eHQKQEAgLTAsMCArMSBAQAoreyJpZCI6IjE3NzEwYTg4LWYzZDgtNDgzZC1hZGVkLWFmZWUyOTA2YThjMSIsIm5hbWUiOiJNaWNoYWVsVGVzdDIiLCJkZXNjcmlwdGlvbiI6bnVsbCwidG9wb2xvZ3lJZCI6ImMyNTgxMWZjLWUwM2YtNDAxZC05M2NhLTQ1ZDliZDMxMjcwMyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2wxMF9mYWxzZS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2wxMF9mYWxzZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmFhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDEwX2ZhbHNlLnlhbWwKQEAgLTAsMCArMSwxNDAgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisgIGNpdHlfbmFtZToKKyAgICB0eXBlOiBib29sZWFuCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IE5PCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDExX2ZhbHNlLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDExX2ZhbHNlLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiMjkyMwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9ib29sMTFfZmFsc2UueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IGJvb2xlYW4KKyAgICBkZXNjcmlwdGlvbjogY2l0eSBuYW1lCisgICAgZGVmYXVsdDogMAorICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2wxMl9mYWxzZS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2wxMl9mYWxzZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDUxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDEyX2ZhbHNlLnlhbWwKQEAgLTAsMCArMSwxNDAgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisgIGNpdHlfbmFtZToKKyAgICB0eXBlOiBib29sZWFuCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IE9GRgorICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2wxX3RydWUueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9ib29sMV90cnVlLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1M2U0YwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9ib29sMV90cnVlLnlhbWwKQEAgLTAsMCArMSwxNDAgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisgIGNpdHlfbmFtZToKKyAgICB0eXBlOiBib29sZWFuCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IHQKKyAgYWRkcmVzczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogYWRkcmVzcworICAgIGRlZmF1bHQ6IEFsb25pbQorICBob21lX251bWJlcjoKKyAgICB0eXBlOiBudW1iZXIKKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiA4CityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9ib29sMl90cnVlLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDJfdHJ1ZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjczYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDJfdHJ1ZS55YW1sCkBAIC0wLDAgKzEsMTQwIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorICBjaXR5X25hbWU6CisgICAgdHlwZTogYm9vbGVhbgorICAgIGRlc2NyaXB0aW9uOiBjaXR5IG5hbWUKKyAgICBkZWZhdWx0OiB0cnVlCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDNfdHJ1ZS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2wzX3RydWUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjgwZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2wzX3RydWUueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IGJvb2xlYW4KKyAgICBkZXNjcmlwdGlvbjogY2l0eSBuYW1lCisgICAgZGVmYXVsdDogb24KKyAgYWRkcmVzczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogYWRkcmVzcworICAgIGRlZmF1bHQ6IEFsb25pbQorICBob21lX251bWJlcjoKKyAgICB0eXBlOiBudW1iZXIKKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiA4CityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9ib29sNF90cnVlLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDRfdHJ1ZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDc3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDRfdHJ1ZS55YW1sCkBAIC0wLDAgKzEsMTQwIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorICBjaXR5X25hbWU6CisgICAgdHlwZTogYm9vbGVhbgorICAgIGRlc2NyaXB0aW9uOiBjaXR5IG5hbWUKKyAgICBkZWZhdWx0OiB5CisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDVfdHJ1ZS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w1X3RydWUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI0MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w1X3RydWUueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IGJvb2xlYW4KKyAgICBkZXNjcmlwdGlvbjogY2l0eSBuYW1lCisgICAgZGVmYXVsdDogeWVzCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDZfdHJ1ZS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w2X3RydWUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI4NjJiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w2X3RydWUueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IGJvb2xlYW4KKyAgICBkZXNjcmlwdGlvbjogY2l0eSBuYW1lCisgICAgZGVmYXVsdDogMQorICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w3X2ZhbHNlLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDdfZmFsc2UueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmFkOGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w3X2ZhbHNlLnlhbWwKQEAgLTAsMCArMSwxNDAgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisgIGNpdHlfbmFtZToKKyAgICB0eXBlOiBib29sZWFuCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IEYKKyAgYWRkcmVzczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogYWRkcmVzcworICAgIGRlZmF1bHQ6IEFsb25pbQorICBob21lX251bWJlcjoKKyAgICB0eXBlOiBudW1iZXIKKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiA4CityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9ib29sOF9mYWxzZS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w4X2ZhbHNlLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzNWUyYQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9ib29sOF9mYWxzZS55YW1sCkBAIC0wLDAgKzEsMTQwIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorICBjaXR5X25hbWU6CisgICAgdHlwZTogYm9vbGVhbgorICAgIGRlc2NyaXB0aW9uOiBjaXR5IG5hbWUKKyAgICBkZWZhdWx0OiBGQUxTRQorICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w5X2ZhbHNlLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfYm9vbDlfZmFsc2UueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY4ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X2Jvb2w5X2ZhbHNlLnlhbWwKQEAgLTAsMCArMSwxNDAgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisgIGNpdHlfbmFtZToKKyAgICB0eXBlOiBib29sZWFuCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IE4KKyAgYWRkcmVzczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogYWRkcmVzcworICAgIGRlZmF1bHQ6IEFsb25pbQorICBob21lX251bWJlcjoKKyAgICB0eXBlOiBudW1iZXIKKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiA4CityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3RtcC9wb3NpdGl2ZV9hcnRpZmFjdF9udW1iZXIxLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfbnVtYmVyMS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjN2Y4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfbnVtYmVyMS55YW1sCkBAIC0wLDAgKzEsMTQwIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorICBjaXR5X25hbWU6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IDEyCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy90bXAvcG9zaXRpdmVfYXJ0aWZhY3RfbnVtYmVyMi55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X251bWJlcjIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGVjMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdG1wL3Bvc2l0aXZlX2FydGlmYWN0X251bWJlcjIueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBjaXR5IG5hbWUKKyAgICBkZWZhdWx0OiAxMi4xMgorICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdXBsb2FkQ29tcG9uZW50L2ltYWdlcy9teXNxbC5wbmcgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy91cGxvYWRDb21wb25lbnQvaW1hZ2VzL215c3FsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTAyZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdXBsb2FkQ29tcG9uZW50L2ltYWdlcy9teXNxbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdXBsb2FkQ29tcG9uZW50L215c3FsLnltbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3VwbG9hZENvbXBvbmVudC9teXNxbC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlYjRkNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3VwbG9hZENvbXBvbmVudC9teXNxbC55bWwKQEAgLTAsMCArMSw4NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworZGVzY3JpcHRpb246IE15U1FMIFJEQk1TIGluc3RhbGxhdGlvbiBvbiBhIHNwZWNpZmljIG1vdW50ZWQgdm9sdW1lIHBhdGguCit0ZW1wbGF0ZV9uYW1lOiBteXNxbC11cGxvYWRDb21wb25lbnQKK3RlbXBsYXRlX3ZlcnNpb246IDEuMS4xLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZToxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUzoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICBhbGllbi5ub2Rlcy5NeXNxbC11cGxvYWRDb21wb25lbnQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBBIG5vZGUgdG8gaW5zdGFsbCBNeVNRTCB2NS41IGRhdGFiYXNlIHdpdGggZGF0YQorICAgICAgb24gYSBzcGVjaWZpYyBhdHRhY2hlZCB2b2x1bWUuCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2UKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgICAgdHlwZTogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL215c3FsLnBuZworICAgIHByb3BlcnRpZXM6CisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDMzMDYKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZGF0YS4KKyAgICAgIGRiX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiB3b3JkcHJlc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlLgorICAgICAgZGJfdXNlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHBhc3MKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSDigJhkYl91c2Vy4oCZIHByb3BlcnR5LgorICAgICAgYmluZF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiB0cnVlLHRoZSBzZXJ2ZXIgYWNjZXB0cyBUQ1AvSVAgY29ubmVjdGlvbnMgb24gYWxsIHNlcnZlciBob3N0IElQdjQgaW50ZXJmYWNlcy4KKyAgICAgIHN0b3JhZ2VfcGF0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IC9tb3VudGVkU3RvcmFnZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyAiL21vdW50ZWRTdG9yYWdlIiwgIi92YXIvbXlzcWwiIF0KKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZTogc2NyaXB0cy9pbnN0YWxsX215c3FsLnNoCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFZPTFVNRV9IT01FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHN0b3JhZ2VfcGF0aF0gfQorICAgICAgICAgICAgUE9SVDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wb3J0XSB9CisgICAgICAgICAgICBEQl9OQU1FOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX25hbWVdIH0KKyAgICAgICAgICAgIERCX1VTRVI6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfdXNlcl0gfQorICAgICAgICAgICAgREJfUEFTU1dPUkQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcGFzc3dvcmRdIH0KKyAgICAgICAgICAgIEJJTkRfQURSRVNTOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGJpbmRfYWRkcmVzc10gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL3N0YXJ0X215c3FsLnNoCisgICAgICBmYXN0Y29ubmVjdC5jbG91ZGlmeS5leHRlbnNpb25zOgorICAgICAgICAgc3RhcnRfZGV0ZWN0aW9uOgorICAgICAgICAgIGlucHV0czoKKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgIGltcGxlbWVudGF0aW9uOiBzY3JpcHRzL215c3FsX3N0YXJ0X2RldGVjdGlvbi5ncm9vdnkKKyAgICBhcnRpZmFjdHM6CisgICAgICAtIHNjcmlwdHM6IHNjcmlwdHMKKyAgICAgICAgdHlwZTogdG9zY2EuYXJ0aWZhY3RzLkZpbGUKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2U6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKworYXJ0aWZhY3RfdHlwZXM6CisgIHRvc2NhLmFydGlmYWN0cy5Hcm9vdnlTY3JpcHQ6CisgICAgZGVzY3JpcHRpb246IEEgZ3Jvb3Z5IHNjcmlwdCAoLmdyb292eSBmaWxlKQorICAgIGZpbGVfZXh0OiBbZ3Jvb3Z5XQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvdXBsb2FkQ29tcG9uZW50L3NjcmlwdHMvaW5zdGFsbF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3VwbG9hZENvbXBvbmVudC9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3VwbG9hZENvbXBvbmVudC9zY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiRGViaWFuIGJhc2VkIE1ZU1FMIGluc3RhbGwgNS4uLiIKK0xPQ0s9Ii90bXAvbG9ja2FwdGdldCIKKword2hpbGUgdHJ1ZTsgZG8KKyAgaWYgbWtkaXIgIiR7TE9DS30iICY+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiTXlTUUwgdGFrZSB0aGUgbG9jayIKKyAgICBicmVhazsKKyAgZmkKKyAgZWNobyAiV2FpdGluZyB0aGUgZW5kIG9mIG9uZSBvZiBvdXIgcmVjaXBlcy4uLiIKKyAgc2xlZXAgMC41Citkb25lCisKK3doaWxlIHN1ZG8gZnVzZXIgL3Zhci9saWIvZHBrZy9sb2NrID4vZGV2L251bGwgMj4mMSA7IGRvCisgIGVjaG8gIldhaXRpbmcgZm9yIG90aGVyIHNvZnR3YXJlIG1hbmFnZXJzIHRvIGZpbmlzaC4uLiIKKyAgc2xlZXAgMC41Citkb25lCitzdWRvIHJtIC1mIC92YXIvbGliL2Rwa2cvbG9jaworCitzdWRvIGFwdC1nZXQgdXBkYXRlIHx8IChzbGVlcCAxNTsgc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCBleGl0ICR7MX0pCitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IC15IGluc3RhbGwgbXlzcWwtc2VydmVyLTUuNSBwd2dlbiB8fCBleGl0ICR7MX0KK3JtIC1yZiAiJHtMT0NLfSIKKworc3VkbyAvZXRjL2luaXQuZC9teXNxbCBzdG9wCitzdWRvIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKgorc3VkbyBybSAtcmYgL3Zhci9saWIvbXlzcWwvKgorZWNobyAiTXlTUUwgSW5zdGFsbGF0aW9uIGNvbXBsZXRlLiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy91cGxvYWRDb21wb25lbnQvc2NyaXB0cy9zdGFydF9teXNxbC5zaCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3VwbG9hZENvbXBvbmVudC9zY3JpcHRzL3N0YXJ0X215c3FsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGJkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy91cGxvYWRDb21wb25lbnQvc2NyaXB0cy9zdGFydF9teXNxbC5zaApAQCAtMCwwICsxLDEwNSBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVOViAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICJFTlYgVkFSIFVTRUQgVk9MVU1FX0hPTUUgOiAkVk9MVU1FX0hPTUUiCitlY2hvICJFTlYgVkFSIFVTRUQgUE9SVCAgICAgICAgOiAkUE9SVCIKK2VjaG8gIkVOViBWQVIgVVNFRCBEQl9OQU1FICAgICA6ICREQl9OQU1FIgorZWNobyAiRU5WIFZBUiBVU0VEIERCX1VTRVIgICAgIDogJERCX1VTRVIiCitlY2hvICJFTlYgVkFSIFVTRUQgREJfUEFTU1dPUkQgOiAkREJfUEFTU1dPUkQiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworQ1VSUkVOVF9QQVRIPWBkaXJuYW1lICIkMCJgCisKK2Z1bmN0aW9uIFN0YXJ0TXlTUUwgeworICBlY2hvICJTdGFydGluZyBNWVNRTC4uLiIKKyAgc3VkbyAvZXRjL2luaXQuZC9teXNxbCBzdG9wCisgIHN1ZG8gL3Vzci9iaW4vbXlzcWxkX3NhZmUgPiAvZGV2L251bGwgMj4mMSAmCisgIFJFVD0xCisgIHdoaWxlIFtbIFJFVCAtbmUgMCBdXTsgZG8KKyAgICBlY2hvICI9PiBXYWl0aW5nIGZvciBjb25maXJtYXRpb24gb2YgTXlTUUwgc2VydmljZSBzdGFydHVwIgorICAgIHNsZWVwIDUKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAic3RhdHVzIiA+IC9kZXYvbnVsbCAyPiYxCisgICAgUkVUPSQ/CisgIGRvbmUKK30KKworZnVuY3Rpb24gQWxsb3dGaWxlU3lzdGVtVG9NeVNRTCB7CisgIE1ZU1FMX0RBVEFfRElSPSRWT0xVTUVfSE9NRS9kYXRhCisgIE1ZU1FMX0xPRz0kVk9MVU1FX0hPTUUvbG9ncworCisgIGVjaG8gIlNldHRpbmcgZGF0YSBkaXJlY3RvcnkgdG8gJE1ZU1FMX0RBVEFfRElSIGFuIGxvZ3MgdG8gJE1ZU1FMX0xPRyAuLi4iCisgIGlmIHN1ZG8gdGVzdCAhIC1kICRNWVNRTF9EQVRBX0RJUjsgdGhlbgorICAgIGVjaG8gIkNyZWF0aW5nIERBVEEgZGlyID4gJE1ZU1FMX0RBVEFfRElSIC4uLiIKKyAgICBzdWRvIG1rZGlyIC1wICRNWVNRTF9EQVRBX0RJUgorICAgICMgbXlzcWwgYXMgb3duZXIgYW5kIGdyb3VwIG93bmVyCisgICAgc3VkbyBjaG93biAtUiBteXNxbDpteXNxbCAkTVlTUUxfREFUQV9ESVIKKyAgZmkKKyAgaWYgc3VkbyB0ZXN0ICEgLWQgJE1ZU1FMX0xPRzsgdGhlbgorICAgIGVjaG8gIkNyZWF0aW5nIExPRyBkaXIgPiAkTVlTUUxfTE9HIC4uLiIKKyAgICBzdWRvIG1rZGlyIC1wICRNWVNRTF9MT0cKKyAgICAjIG15c3FsIGFzIG93bmVyIGFuZCBncm91cCBvd25lcgorICAgIHN1ZG8gY2hvd24gLVIgbXlzcWw6bXlzcWwgJE1ZU1FMX0xPRworICBmaQorCisgICMgZWRpdCBhcHAgbXlzcWwgcGVybWlzc2lvbiBpbiA6IC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgQ09VTlRfTElORT1gc3VkbyBjYXQgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZCB8IHdjIC1sYAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9EQVRBX0RJUi8gciwiIC9ldGMvYXBwYXJtb3IuZC91c3Iuc2Jpbi5teXNxbGQKKyAgc3VkbyBzZWQgLWkgIiQoKCRDT1VOVF9MSU5FKSkgaSAkTVlTUUxfREFUQV9ESVIvKiogcndrLCIgL2V0Yy9hcHBhcm1vci5kL3Vzci5zYmluLm15c3FsZAorICBzdWRvIHNlZCAtaSAiJCgoJENPVU5UX0xJTkUpKSBpICRNWVNRTF9MT0cvIHIsIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisgIHN1ZG8gc2VkIC1pICIkKCgkQ09VTlRfTElORSkpIGkgJE1ZU1FMX0xPRy8qKiByd2ssIiAvZXRjL2FwcGFybW9yLmQvdXNyLnNiaW4ubXlzcWxkCisKKyAgIyByZWxvYWQgYXBwIHBlcm1pc3Npb24gbWFuYWdlciBzZXJ2aWNlCisgIHN1ZG8gc2VydmljZSBhcHBhcm1vciByZWxvYWQKK30KKworZnVuY3Rpb24gVXBkYXRlTXlTUUxDb25mIHsKKyAgZWNobyAiVXBkYXRpbmcgTXlTUUwgY29uZiBmaWxlcyBbREFUQSwgTE9HU10uLi4iCisgIHN1ZG8gc2VkIC1pICJzOi92YXIvbGliL215c3FsOiRNWVNRTF9EQVRBX0RJUjpnIiAvZXRjL215c3FsL215LmNuZgorICBzdWRvIHNlZCAtaSAiczovdmFyL2xvZy9teXNxbC9lcnJvci5sb2c6JE1ZU1FMX0xPRy9lcnJvci5sb2c6ZyIgL2V0Yy9teXNxbC9teS5jbmYKKyAgc3VkbyBzZWQgLWkgInM6MzMwNjokUE9SVDpnIiAvZXRjL215c3FsL215LmNuZgorCisgIGlmIHN1ZG8gdGVzdCAhIC1mIC91c3Ivc2hhcmUvbXlzcWwvbXktZGVmYXVsdC5jbmY7IHRoZW4KKyAgICBzdWRvIGNwIC9ldGMvbXlzcWwvbXkuY25mIC91c3Ivc2hhcmUvbXlzcWwvbXktZGVmYXVsdC5jbmYKKyAgZmkKKyAgaWYgc3VkbyB0ZXN0ICEgLWYgL2V0Yy9teXNxbC9jb25mLmQvbXlzcWxkX2NoYXJzZXQuY25mOyB0aGVuCisgICAgc3VkbyBjcCAkY29uZmlncy9teXNxbGRfY2hhcnNldC5jbmYgL2V0Yy9teXNxbC9jb25mLmQvbXlzcWxkX2NoYXJzZXQuY25mCisgIGZpCisKKyAgaWYgWyAiJEJJTkRfQURSRVNTIiA9PSAidHJ1ZSIgXTsgdGhlbgorICAgIHN1ZG8gc2VkIC1pICJzL2JpbmQtYWRkcmVzcy4qL2JpbmQtYWRkcmVzcyA9IDAuMC4wLjAvIiAvZXRjL215c3FsL215LmNuZgorICBmaQorfQorCitmdW5jdGlvbiBJbml0TXlTUUxEYiB7CisgICMgY3JlYXRlIGRhdGFiYXNlIERCX05BTUUKKyAgaWYgWyAiJERCX05BTUUiIF07IHRoZW4KKyAgICBlY2hvICJJTklUIERBVEFCQVNFICREQl9OQU1FIgorICAgIHN1ZG8gbXlzcWwgLXUgcm9vdCAtZSAiQ1JFQVRFIERBVEFCQVNFICREQl9OQU1FIjsKKyAgZmkKKworICAjIGNyZWF0ZSB1c2VyIGFuZCBnaXZlIHJpZ2h0cworICBpZiBbICIkREJfVVNFUiIgXTsgdGhlbgorICAgIGVjaG8gIkNSRUFURSBVU0VSICREQl9VU0VSIFdJVEggUEFTU1dPUkQgJERCX1BBU1NXT1JEIEFORCBHUkFORCBSSUdIVFMgT04gJERCX05BTUUiCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkNSRUFURSBVU0VSICcke0RCX1VTRVJ9J0AnJScgSURFTlRJRklFRCBCWSAnJERCX1BBU1NXT1JEJyIKKyAgICBzdWRvIG15c3FsIC11cm9vdCAtZSAiR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gJHtEQl9OQU1FfS4qIFRPICcke0RCX1VTRVJ9J0AnJScgV0lUSCBHUkFOVCBPUFRJT04iCisgICAgc3VkbyBteXNxbCAtdXJvb3QgLWUgIkZMVVNIIFBSSVZJTEVHRVMiCisgIGZpCit9CisKKyMgQ3JlYXRlIGEgbmV3IGRhdGFiYXNlIHBhdGggdG8gdGhlIGF0dGNoZWQgdm9sdW1lCitpZiBzdWRvIHRlc3QgISAtZCAkVk9MVU1FX0hPTUUvZGF0YTsgdGhlbgorICBlY2hvICI9PiBBbiBlbXB0eSBvciB1bmluaXRpYWxpemVkIE15U1FMIHZvbHVtZSBpcyBkZXRlY3RlZCBpbiAkVk9MVU1FX0hPTUUvZGF0YSIKKyAgQWxsb3dGaWxlU3lzdGVtVG9NeVNRTAorICBVcGRhdGVNeVNRTENvbmYKKyAgZWNobyAiPT4gSW5pdCBuZXcgZGF0YWJhc2UgcGF0aCB0byAkTVlTUUxfREFUQV9ESVIiCisgIHN1ZG8gbXlzcWxfaW5zdGFsbF9kYiAtLWJhc2VkaXI9L3VzciAtLWRhdGFkaXI9JE1ZU1FMX0RBVEFfRElSCisgIGVjaG8gIj0+IE15U1FMIGRhdGFiYXNlIGluaXRpYWxpemVkICEiCitlbHNlCisgIGVjaG8gIj0+IFVzaW5nIGFuIGV4aXN0aW5nIHZvbHVtZSBvZiBNeVNRTCIKKyAgQWxsb3dGaWxlU3lzdGVtVG9NeVNRTAorICBVcGRhdGVNeVNRTENvbmYKK2ZpCisKKyMgRmluYWxseSBzdGFydCBNeVNRTCB3aXRoIG5ldyBjb25maWd1cmF0aW9uCitTdGFydE15U1FMCitJbml0TXlTUUxEYgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3lhbWxGaWVsZHNWYWxpZGF0aW9uL2FydGlmYWN0X3Vuc3VwcG9ydGVkLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy95YW1sRmllbGRzVmFsaWRhdGlvbi9hcnRpZmFjdF91bnN1cHBvcnRlZC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGI4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy95YW1sRmllbGRzVmFsaWRhdGlvbi9hcnRpZmFjdF91bnN1cHBvcnRlZC55YW1sCkBAIC0wLDAgKzEsMTQwIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorICBjaXR5X25hbWU6CisgICAgdHlwZTogbnVtYmVyMTIzCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IDEyLjEyCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy95YW1sRmllbGRzVmFsaWRhdGlvbi9uZWdhdGl2ZV9hcnRpZmFjdF9ib29sMS55YW1sIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMveWFtbEZpZWxkc1ZhbGlkYXRpb24vbmVnYXRpdmVfYXJ0aWZhY3RfYm9vbDEueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTExOWYzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMveWFtbEZpZWxkc1ZhbGlkYXRpb24vbmVnYXRpdmVfYXJ0aWZhY3RfYm9vbDEueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IGJvb2xlYW4KKyAgICBkZXNjcmlwdGlvbjogY2l0eSBuYW1lCisgICAgZGVmYXVsdDogSworICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMveWFtbEZpZWxkc1ZhbGlkYXRpb24vbmVnYXRpdmVfYXJ0aWZhY3RfYm9vbDIueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3lhbWxGaWVsZHNWYWxpZGF0aW9uL25lZ2F0aXZlX2FydGlmYWN0X2Jvb2wyLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljMDlhNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3lhbWxGaWVsZHNWYWxpZGF0aW9uL25lZ2F0aXZlX2FydGlmYWN0X2Jvb2wyLnlhbWwKQEAgLTAsMCArMSwxNDAgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisgIGNpdHlfbmFtZToKKyAgICB0eXBlOiBib29sZWFuCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IDExCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy95YW1sRmllbGRzVmFsaWRhdGlvbi9uZWdhdGl2ZV9hcnRpZmFjdF9udW1iZXIxLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy95YW1sRmllbGRzVmFsaWRhdGlvbi9uZWdhdGl2ZV9hcnRpZmFjdF9udW1iZXIxLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0ODk4NwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3lhbWxGaWVsZHNWYWxpZGF0aW9uL25lZ2F0aXZlX2FydGlmYWN0X251bWJlcjEueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBjaXR5IG5hbWUKKyAgICBkZWZhdWx0OiAxLjJOb28KKyAgYWRkcmVzczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogYWRkcmVzcworICAgIGRlZmF1bHQ6IEFsb25pbQorICBob21lX251bWJlcjoKKyAgICB0eXBlOiBudW1iZXIKKyAgICBkZXNjcmlwdGlvbjogaG9tZV9udW1iZXIKKyAgICBkZWZhdWx0OiA4CityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3lhbWxGaWVsZHNWYWxpZGF0aW9uL25lZ2F0aXZlX2FydGlmYWN0X251bWJlcjIueWFtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3lhbWxGaWVsZHNWYWxpZGF0aW9uL25lZ2F0aXZlX2FydGlmYWN0X251bWJlcjIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzBlMDdhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMveWFtbEZpZWxkc1ZhbGlkYXRpb24vbmVnYXRpdmVfYXJ0aWZhY3RfbnVtYmVyMi55YW1sCkBAIC0wLDAgKzEsMTQwIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorICBjaXR5X25hbWU6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGNpdHkgbmFtZQorICAgIGRlZmF1bHQ6IDEgMiAzCisgIGFkZHJlc3M6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGFkZHJlc3MKKyAgICBkZWZhdWx0OiBBbG9uaW0KKyAgaG9tZV9udW1iZXI6CisgICAgdHlwZTogbnVtYmVyCisgICAgZGVzY3JpcHRpb246IGhvbWVfbnVtYmVyCisgICAgZGVmYXVsdDogOAorcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy95YW1sRmllbGRzVmFsaWRhdGlvbi9uZWdhdGl2ZV9hcnRpZmFjdF9zdHJpbmcxLnlhbWwgYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy95YW1sRmllbGRzVmFsaWRhdGlvbi9uZWdhdGl2ZV9hcnRpZmFjdF9zdHJpbmcxLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyZWYwNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3lhbWxGaWVsZHNWYWxpZGF0aW9uL25lZ2F0aXZlX2FydGlmYWN0X3N0cmluZzEueWFtbApAQCAtMCwwICsxLDE0MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyAgY2l0eV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBjaXR5IG5hbWUKKyAgICBkZWZhdWx0OiDXqdec15XXnQorICBhZGRyZXNzOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBhZGRyZXNzCisgICAgZGVmYXVsdDogQWxvbmltCisgIGhvbWVfbnVtYmVyOgorICAgIHR5cGU6IG51bWJlcgorICAgIGRlc2NyaXB0aW9uOiBob21lX251bWJlcgorICAgIGRlZmF1bHQ6IDgKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnLmpzb24gYi9hc2RjLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWM5ZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnLmpzb24KQEAgLTAsMCArMSwxMiBAQAoreworCitjYXRhbG9nQmVIb3N0OiBiZWhvc3QsCitjYXRhbG9nRmVIb3N0OiBmZWhvc3QsCitlc0hvc3Q6IGVzaG9zdCwKK2NhdGFsb2dGZVBvcnQ6IDgwODAsCitjYXRhbG9nQmVQb3J0OiA4MDgwLAorZXNQb3J0OiA5MjAwLAorcmVzb3VyY2VDb25maWdEaXI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMiLAorY29tcG9uZW50c0NvbmZpZ0RpcjogInNyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzIgorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkYy10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nYmFjay10ZXN0LnhtbCBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjZTlkMQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGMtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWwKQEAgLTAsMCArMSwxMyBAQAorPCEtLSBvbmx5IG9uZSBsaW5lLCBzaHV0IHVwIGxvZ2JhY2sgISAtLT4KKzxjb25maWd1cmF0aW9uPgorICAgIDxhcHBlbmRlciBuYW1lPSJTVERPVVQiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLkNvbnNvbGVBcHBlbmRlciI+CisgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgPFBhdHRlcm4+CisgICAgICAgICAgICAgICAgJWR7eXl5eS1NTS1kZCBISDptbTpzc30gWyV0aHJlYWRdICUtNWxldmVsICVsb2dnZXJ7MzZ9IC0gJW1zZyVuCisgICAgICAgICAgICA8L1BhdHRlcm4+CisgICAgICAgIDwvZW5jb2Rlcj4KKyAgICA8L2FwcGVuZGVyPgorICAgIDxyb290IGxldmVsPSJvZmYiPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iU1RET1VUIiAvPgorICAgIDwvcm9vdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjLXRlc3RzL3RhcmJhbGwueG1sIGIvYXNkYy10ZXN0cy90YXJiYWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGJjMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy90YXJiYWxsLnhtbApAQCAtMCwwICsxLDcxIEBACis8YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+CisgIDxpZD5iaW48L2lkPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhcjwvZm9ybWF0PgorICA8L2Zvcm1hdHM+CisgIDxmaWxlcz4KKyAgICA8ZmlsZT4KKyAgICAgICAgPHNvdXJjZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LWphci13aXRoLWRlcGVuZGVuY2llcy5qYXI8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8ZGVzdE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyPC9kZXN0TmFtZT4KKyAgICA8L2ZpbGU+CisgICAgPGZpbGU+CisgICAgICAgIDxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2NpL3NjcmlwdHMvc3RhcnRUZXN0LnNoPC9zb3VyY2U+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Li88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPnN0YXJ0VGVzdC5zaDwvZGVzdE5hbWU+CisgICAgPC9maWxlPgorICAgIDwhLS1maWxlPgorICAgICAgICA8c291cmNlPnNyYy9tYWluL3Jlc291cmNlcy9jaS9zY3JpcHRzL3Bvc3RpbnN0YWxsPC9zb3VyY2U+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Li88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPnBvc3RpbnN0YWxsPC9kZXN0TmFtZT4KKyAgICA8L2ZpbGUtLT4KKyAgICA8ZmlsZT4KKyAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9zZGMueWFtbDwvc291cmNlPgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPnNkYy55YW1sPC9kZXN0TmFtZT4KKyAgICA8L2ZpbGU+CisgICAgPGZpbGU+CisgICAgICAgIDxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLXBhY2thZ2VzLnlhbWw8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT5jb25mPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDxkZXN0TmFtZT5zZGMtcGFja2FnZXMueWFtbDwvZGVzdE5hbWU+CisgICAgPC9maWxlPgorICAgIDxmaWxlPgorICAgICAgICA8c291cmNlPnNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXM8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT5jb25mPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDxkZXN0TmFtZT5sb2c0ai5wcm9wZXJ0aWVzPC9kZXN0TmFtZT4KKyAgICA8L2ZpbGU+CisgICAgPGZpbGU+CisgICAgICAgIDxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvdGl0YW4ucHJvcGVydGllczwvc291cmNlPgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPnRpdGFuLnByb3BlcnRpZXM8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZT4KKyAgICAgICAgPHNvdXJjZT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbDwvc291cmNlPgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPmVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbDwvZGVzdE5hbWU+CisgICAgPC9maWxlPgorICAgICAgPGZpbGU+CisgICAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWw8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT5jb25mPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDxkZXN0TmFtZT5jb25maWd1cmF0aW9uLnlhbWw8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICAKKyAgICAKKyAgICAKKyAgPC9maWxlcz4KKyAgCisgIDxmaWxlU2V0cz4gIAorICAJPGZpbGVTZXQ+CisJCTxkaXJlY3Rvcnk+c3JjL3Rlc3QvcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Li88L291dHB1dERpcmVjdG9yeT4KKwk8L2ZpbGVTZXQ+CisJPGZpbGVTZXQ+CisJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uL3Rlc3RTdWl0ZXM8L291dHB1dERpcmVjdG9yeT4KKwk8L2ZpbGVTZXQ+CisJCisgIDwvZmlsZVNldHM+CisgIAorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvdGVzdG5nLnhtbCBiL2FzZGMtdGVzdHMvdGVzdG5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQ3ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy90ZXN0bmcueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgbmFtZT0iU3VpdGUiID4KKyAgIDxsaXN0ZW5lcnM+CisgICAgICAgIDxsaXN0ZW5lciBjbGFzcy1uYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW4uRXh0ZW50UmVwb3J0ZXJORyIgLz4KKyAgICA8L2xpc3RlbmVycz4KKyAgPHRlc3QgbmFtZT0iVGVzdCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5jYXRlZ29yeS5DYXRlZ29yaWVzVGVzdHMiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4gPCEtLSBUZXN0IC0tPgorPC9zdWl0ZT4gPCEtLSBTdWl0ZSAtLT4KKworCisKZGlmZiAtLWdpdCBhL2FzZGMtdGVzdHMvdGVzdG5nTGlmZUN5Y2xlLnhtbCBiL2FzZGMtdGVzdHMvdGVzdG5nTGlmZUN5Y2xlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM5MGRjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkYy10ZXN0cy90ZXN0bmdMaWZlQ3ljbGUueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgbmFtZT0ibGlmZUN5Y2xlIiBwYXJhbGxlbD0ibm9uZSI+CisgIDx0ZXN0IG5hbWU9IlRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLlNlcnZpY2VMQ1NfY2VyaWZpY2F0aW9uQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZVJlc291cmNlTENTVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU19VbmRvQ2hlY2tPdXRDSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlTENTX1VuZG9DaGVja091dENJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU19TdGFydENlcnRpZmljYXRpb25DSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlTENTX0NoZWNraW5DSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NfQ2hlY2tPdXRDSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlQ2VydFdpdGhSZXNvdXJjZUluc3RhbmNlcyIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkNyb3NzQ2hlY2tPdXRUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuQ2VydGlmeVZGV2l0aE5vdENlcnRSSXMiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NfcmVxdWVzdDRDZXJDSVRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5DbGVhbnVwSW50ZXJtZWRpYXRlUmVvdXJjZXMiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5TZXJ2aWNlTENTX0NoZWNrT3V0Q0lUIi8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuTENTX2NlcmlmaWNhdGlvbkNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkNlcnRpZnlTZXJ2aWNlV2l0aE5vdENlcnRSSSIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU19DaGVja0luQ0lUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUxDU19yZXF1ZXN0NENlckNJVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUubGlmZWN5Y2xlLkxDU2Jhc2VUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUuU2VydmljZUxDU19TdGFydENlcnRpZmljYXRpb25DSVRlc3QiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4gPCEtLSBUZXN0IC0tPgorPC9zdWl0ZT4gPCEtLSBsaWZlQ3ljbGUgLS0+CmRpZmYgLS1naXQgYS9hc2RjdG9vbC8uZ2l0aWdub3JlIGIvYXNkY3Rvb2wvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmY1M2QwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKy9iaW4vCisvYnVpbGQvCisvdGFyZ2V0LwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvLnB5ZGV2cHJvamVjdCBiL2FzZGN0b29sLy5weWRldnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlOWY0MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sLy5weWRldnByb2plY3QKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzw/ZWNsaXBzZS1weWRldiB2ZXJzaW9uPSIxLjAiPz48cHlkZXZfcHJvamVjdD4KKzxweWRldl9wcm9wZXJ0eSBuYW1lPSJvcmcucHl0aG9uLnB5ZGV2LlBZVEhPTl9QUk9KRUNUX0lOVEVSUFJFVEVSIj5EZWZhdWx0PC9weWRldl9wcm9wZXJ0eT4KKzxweWRldl9wcm9wZXJ0eSBuYW1lPSJvcmcucHl0aG9uLnB5ZGV2LlBZVEhPTl9QUk9KRUNUX1ZFUlNJT04iPnB5dGhvbiAyLjc8L3B5ZGV2X3Byb3BlcnR5PgorPC9weWRldl9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvcG9tLnhtbCBiL2FzZGN0b29sL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2NmM4OAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3BvbS54bWwKQEAgLTAsMCArMSw0MzQgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisJPGFydGlmYWN0SWQ+c2RjdG9vbDwvYXJ0aWZhY3RJZD4KKwk8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNkYy1tYWluPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCisJPGRlcGVuZGVuY2llcz4KKwkJPCEtLSBBU0RDIGRlcGVuZGVuY2llcyAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbi1iZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y29tbW9uLWJlLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb24tYXBwLWFwaTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y29tbW9uLWFwcC1hcGkudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjLmJlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2F0YWxvZy1kYW88L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2NhdGFsb2ctZGFvLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhdGFsb2ctbW9kZWw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2NhdGFsb2ctbW9kZWwudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2F0YWxvZy1iZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7YXNkYy5mdWxsLnZlcnNpb259PC92ZXJzaW9uPgorCQkJCisJCQk8IS0tIENvbW1lbnQgT3V0IGluIG9yZGVyIHRvIGRlYnVnIGluIGVjbGlwc2UgLS0+CisJCQk8Y2xhc3NpZmllcj5jbGFzc2VzPC9jbGFzc2lmaWVyPgorCQkJCisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4gIAorCQkKKwkJPCEtLSBBU0RDIGRlcGVuZGVuY2llcyBlbmQgLS0+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpldHR5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjkuMi4xMC52MjAxNTAzMTA8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIGxpc3RlbiB0byBmaWxlIGNoYW5nZXMgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1qY2ktY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+OS4yLjEwLnYyMDE1MDMxMDwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItamV0dHktaHR0cDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4xNDwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gc2xmNGogKyBsb2diYWNrIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y2gucW9zLmxvZ2JhY2s8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5sb2diYWNrLWNsYXNzaWM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTwhLS0gZ3Jvb3Z5IC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5ncm9vdnk8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5ncm9vdnktYWxsPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1jb25maWd1cmF0aW9uMjwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisKKwkJPCEtLSBUSVRBTiAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udGhpbmthdXJlbGl1cy50aXRhbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRpdGFuLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3RpdGFuLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmpzb248L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPmpzb248L2FydGlmYWN0SWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQk8L2V4Y2x1c2lvbnM+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS50aGlua2F1cmVsaXVzLnRpdGFuPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGl0YW4tY2Fzc2FuZHJhPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHt0aXRhbi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD50aW5rZXJncmFwaC1ncmVtbGluPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+My4wLjEtaW5jdWJhdGluZzwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS50aW5rZXJwb3A8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5ncmVtbGluLWdyb292eTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuMC4xLWluY3ViYXRpbmc8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS50aW5rZXJwb3AuYmx1ZXByaW50czwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmJsdWVwcmludHMtc2FpbC1ncmFwaDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuNS4wPC92ZXJzaW9uPgorCQkJPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udGlua2VycG9wLmJsdWVwcmludHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5ibHVlcHJpbnRzLWdyYXBoLXNhaWw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjYuMDwvdmVyc2lvbj4KKwkJCTxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gVElUQU4gZW5kIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmphY2tzb24tY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7amFja3Nvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmphY2tzb24tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZ3NvbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8IS0tIFNwcmluZyA0IGRlcGVuZGVuY2llcyAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctZXhwcmVzc2lvbjwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj40LjAuNy5SRUxFQVNFPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy1hb3A8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBTcHJpbmcgNCBkZXBlbmRlbmNpZXMgZW5kIC0tPgorCQk8IS0tIEphdmFDb25maWcgbmVlZCB0aGlzIGxpYnJhcnkgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuMi40PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnlhbWw8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZnVuY3Rpb25hbGphdmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5mdW5jdGlvbmFsamF2YTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWxhc3RpY3NlYXJjaDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmVsYXN0aWNzZWFyY2g8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhZm9ybWF0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhZm9ybWF0LXlhbWw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWxhc3RpY3NlYXJjaC5wbHVnaW48L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zaGllbGQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2VsYXN0aWMtc2VhcmNoLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBDQVNTQU5EUkEgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmRhdGFzdGF4LmNhc3NhbmRyYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhc3NhbmRyYS1kcml2ZXItY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y2Fzc2FuZHJhLmRyaXZlci52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtZHJpdmVyLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2Nhc3NhbmRyYS5kcml2ZXIudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBDQVNTQU5EUkEgRU5EIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUucG9pPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tLnNwcmluZ3NvdXJjZS5vcmcuYXBhY2hlLnBvaTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuOS4wLkZJTkFMPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmpkb208L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qZG9tPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+My4wLjI8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBUZW1wb3JhcnksIHRpbGwgYnVpbGRpbmcgdGhlIHBvcHVsYXRlIHRhc2sgd2hpY2ggYWRkaW5nIGFsbCBjb21wb25lbnRzIAorCQl0byBjYWNoZS4gV2Ugd2lsbCB1c2UgU2VyaWFsaXphdGlvbiBVdGlscy4gLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+ZGUucnVlZGlnZXJtb2VsbGVyPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+ZnN0PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi40NzwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQorCQkJPCEtLSB0ZXN0aW5nIC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+NC4xMjwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisJCQk8IS0tIHRlc3RpbmcgZW5kIC0tPgorCQk8L2RlcGVuZGVuY2llcz4KKworCQk8YnVpbGQ+CisJCQk8cGx1Z2lucz4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c2tpcD50cnVlPC9za2lwPgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorCisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi41LjU8L3ZlcnNpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+Y3JlYXRlLmphci53aXRoLmRlcGVuZGVuY2llczwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJCTxjb25maWd1cmF0aW9uPgorCisJCQkJCQkJPGRlc2NyaXB0b3JSZWZzPgorCQkJCQkJCQk8ZGVzY3JpcHRvclJlZj5qYXItd2l0aC1kZXBlbmRlbmNpZXM8L2Rlc2NyaXB0b3JSZWY+CisJCQkJCQkJPC9kZXNjcmlwdG9yUmVmcz4KKwkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi42PC92ZXJzaW9uPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKwkJCQkJCQk8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KKwkJCQkJCQk8ZGVzY3JpcHRvcj4ke3Byb2plY3QuYmFzZWRpcn0vdGFyYmFsbC54bWw8L2Rlc2NyaXB0b3I+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQk8aWQ+YXNzZW1ibGUtZmlsZTwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjMuMC4yPC92ZXJzaW9uPgorCisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+Y29weS1zZGN0b29sLWNhc3NhbmRyYTwvaWQ+CisJCQkJCQk8cGhhc2U+aW5zdGFsbDwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+Y29weS1yZXNvdXJjZXM8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QucGFyZW50LmJhc2VkaXJ9L3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1yZXBvL2Nvb2tib29rcy9jYXNzYW5kcmEtYWN0aW9ucy9maWxlcy9kZWZhdWx0PC9vdXRwdXREaXJlY3Rvcnk+CisJCQkJCQkJPHJlc291cmNlcz4KKwkJCQkJCQkJPHJlc291cmNlPgorCQkJCQkJCQkJPGRpcmVjdG9yeT4uL3RhcmdldDwvZGlyZWN0b3J5PgorCQkJCQkJCQkJPGluY2x1ZGVzPgorCQkJCQkJCQkJCTxpbmNsdWRlPnNkY3Rvb2wudGFyPC9pbmNsdWRlPgorCQkJCQkJCQkJPC9pbmNsdWRlcz4KKwkJCQkJCQkJPC9yZXNvdXJjZT4KKwkJCQkJCQk8L3Jlc291cmNlcz4KKwkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CQkKKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL1V0aWxzLmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3ZDNlYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvVXRpbHMuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLkVsZW1lbnRIZWxwZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5GYWN0b3J5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKKworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuaW1wbC5BdWRpdGluZ01hbmFnZXI7CisKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm8uZXJyb3JzLlJlc3BvbnNlRm9ybWF0OworCitwdWJsaWMgY2xhc3MgVXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworCXB1YmxpYyBzdGF0aWMgUmVzcG9uc2UgYnVpbGRPa1Jlc3BvbnNlKAorCQkJLyoKKwkJCSAqIFJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2VXcmFwcGVyLAorCQkJICovaW50IHN0YXR1cywgT2JqZWN0IGVudGl0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycykgeworCQkvLyBpbnQgc3RhdHVzID0gZXJyb3JSZXNwb25zZVdyYXBwZXIuZ2V0U3RhdHVzKCk7CisJCVJlc3BvbnNlQnVpbGRlciByZXNwb25zZUJ1aWxkZXIgPSBSZXNwb25zZS5zdGF0dXMoc3RhdHVzKTsKKwkJaWYgKGVudGl0eSAhPSBudWxsKSB7CisJCQlsb2cudHJhY2UoInJldHVybmVkIGVudGl0eSBpcyB7fSIsIGVudGl0eS50b1N0cmluZygpKTsKKwkJCXJlc3BvbnNlQnVpbGRlciA9IHJlc3BvbnNlQnVpbGRlci5lbnRpdHkoZW50aXR5KTsKKwkJfQorCQlpZiAoYWRkaXRpb25hbEhlYWRlcnMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEhlYWRlciA6IGFkZGl0aW9uYWxIZWFkZXJzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcgaGVhZGVyTmFtZSA9IGFkZGl0aW9uYWxIZWFkZXIuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIGhlYWRlclZhbHVlID0gYWRkaXRpb25hbEhlYWRlci5nZXRWYWx1ZSgpOworCQkJCWxvZy50cmFjZSgiQWRkaW5nIGhlYWRlciB7fSB3aXRoIHZhbHVlIHt9IHRvIHRoZSByZXNwb25zZSIsIGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKTsKKwkJCQlyZXNwb25zZUJ1aWxkZXIuaGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBUaXRhbkdyYXBoIG9wZW5HcmFwaChDb25maWd1cmF0aW9uIGNvbmYpIHsKKworCQlUaXRhbkdyYXBoIGdyYXBoID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJZ3JhcGggPSBUaXRhbkZhY3Rvcnkub3Blbihjb25mKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gc3RhcnQgb3BlbiBncmFwaCIsIGUpOworCQl9CisKKwkJcmV0dXJuIGdyYXBoOworCisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZlcnRleExlZnRDb250YWluc1JpZ2h0UHJvcHMoTWFwPFN0cmluZywgT2JqZWN0PiBsZWZ0UHJvcHMsIE1hcDxTdHJpbmcsIE9iamVjdD4gcmlnaHRQcm9wcykgeworCisJCWlmIChyaWdodFByb3BzICE9IG51bGwpIHsKKworCQkJZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiByaWdodFByb3BzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJT2JqZWN0IGxlZnRWYWx1ZSA9IGxlZnRQcm9wcy5nZXQoa2V5KTsKKwkJCQlPYmplY3QgcmlnaHRWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJaWYgKGxlZnRWYWx1ZSA9PSBudWxsKSB7CisJCQkJCWlmIChyaWdodFZhbHVlID09IG51bGwpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJbG9nLmRlYnVnKCJUaGUga2V5IHt9IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgcHJvcGVydGllcyB7fSIsIGtleSwgbGVmdFByb3BzKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIGlmIChmYWxzZSA9PSBsZWZ0VmFsdWUgaW5zdGFuY2VvZiBNYXAgJiYgZmFsc2UgPT0gbGVmdFZhbHVlCisJCQkJLy8gaW5zdGFuY2VvZiBMaXN0KSB7CisJCQkJaWYgKGZhbHNlID09IGxlZnRWYWx1ZS5lcXVhbHMocmlnaHRWYWx1ZSkpIHsKKwkJCQkJbG9nLnRyYWNlKCJUaGUgdmFsdWUgb2Yga2V5IHt9IGlzIGRpZmZlcmVudCBiZXR3ZWVuIHByb3BlcnRpZXMge30gdnMge30iLCBrZXksIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJLy8gfQorCQkJfQorCisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhFbGVtZW50IGVsZW1lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgZmFsc2UgPT0gcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKworCQkJT2JqZWN0W10gcHJvcGVydHlLZXlWYWx1ZXMgPSBuZXcgT2JqZWN0W3Byb3BlcnRpZXMuc2l6ZSgpICogMl07CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJCXByb3BlcnR5S2V5VmFsdWVzW2krK10gPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlwcm9wZXJ0eUtleVZhbHVlc1tpKytdID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCX0KKworCQkJRWxlbWVudEhlbHBlci5hdHRhY2hQcm9wZXJ0aWVzKGVsZW1lbnQsIHByb3BlcnR5S2V5VmFsdWVzKTsKKworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcyhFbGVtZW50IGVsZW1lbnQpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQk7CisKKwkJaWYgKGVsZW1lbnQua2V5cygpICE9IG51bGwgJiYgZWxlbWVudC5rZXlzKCkuc2l6ZSgpID4gMCkgeworCQkJTWFwPFN0cmluZywgUHJvcGVydHk+IHByb3BlcnR5TWFwID0gRWxlbWVudEhlbHBlci5wcm9wZXJ0eU1hcChlbGVtZW50LAorCQkJCQllbGVtZW50LmtleXMoKS50b0FycmF5KG5ldyBTdHJpbmdbZWxlbWVudC5rZXlzKCkuc2l6ZSgpXSkpOworCisJCQlmb3IgKEVudHJ5PFN0cmluZywgUHJvcGVydHk+IGVudHJ5IDogcHJvcGVydHlNYXAuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLnZhbHVlKCk7CisKKwkJCQlyZXN1bHQucHV0KGtleSwgdmFsdWUpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL0RhdGFNaWdyYXRpb24uamF2YSBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9EYXRhTWlncmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ZWE5YgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9EYXRhTWlncmF0aW9uLmphdmEKQEAgLTAsMCArMSw4MzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsOworCitpbXBvcnQgY29tLmNhcnJvdHNlYXJjaC5ocHBjLmN1cnNvcnMuT2JqZWN0Q3Vyc29yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN5c3RlbVV0aWxzOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmFjdGlvbi5zZWFyY2guU2VhcmNoUmVzcG9uc2U7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY2x1c3Rlci5tZXRhZGF0YS5JbmRleE1ldGFEYXRhOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU9wZW5NYXA7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY29tbW9uLnNldHRpbmdzLlNldHRpbmdzOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNvbW1vbi51bml0LlRpbWVWYWx1ZTsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5pbmRleC5xdWVyeS5RdWVyeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guaW5kZXgucXVlcnkuUXVlcnlCdWlsZGVyczsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5zZWFyY2guU2VhcmNoSGl0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuQXJ0aWZhY3RDYXNzYW5kcmFEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5BdWRpdENhc3NhbmRyYURhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLkNhc3NhbmRyYU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZXMuRWxhc3RpY1NlYXJjaENsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy4qOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCisvKioKKyAqIENyZWF0ZWQgYnkgbWxhbmRvIG9uIDUvMTYvMjAxNi4KKyAqLworcHVibGljIGNsYXNzIERhdGFNaWdyYXRpb24geworCisJcHJpdmF0ZSBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJcHJpdmF0ZSBPYmplY3RNYXBwZXIganNvbk1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEYXRhTWlncmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcm90ZWN0ZWQgRWxhc3RpY1NlYXJjaENsaWVudCBlbGFzdGljU2VhcmNoQ2xpZW50OworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgQXVkaXRDYXNzYW5kcmFEYW8gYXVkaXRDYXNzYW5kcmFEYW87CisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBBcnRpZmFjdENhc3NhbmRyYURhbyBhcnRpZmFjdENhc3NhbmRyYURhbzsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGF0ZUZvcm1hdFBhdHRlcm4gPSAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiI7CisJcHJpdmF0ZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBzaW1wbGVEYXRlRm9ybWF0OworCisJLyoqCisJICogdGhlIG1ldGhvZCBleHBvcnRzIGFuZCBpbXBvcnRzIHRoZSByZWNvcmRzIGZyb20gRVMgdG8gY2Fzc2FuZHJhIHRoZSBmbG93CisJICogd2lsbCBjaGVjayB0byBzZWUgaWYgdGhlIGZpbGVzIGFyZSBub3QgZW1wdHkgaWYgdGhlIGZpbGVzIGFyZSBub3QgZW1wdHkKKwkgKiB0aGUgZXhwb3J0IHdpbGwgYmUgc2tpcGVkIGFuZCB0aGUgZmxvdyB3aWxsIHVzZSB0aGUgZXhpc3RpbmcgZmlsZXMuIHRoZQorCSAqIGZsb3cgd2lsbCBjaGVjayBpZiB0aGUgdGFibGVzIGluIGNhc3NhbmRyYSBhcmUgZW1wdHksIGlmIHRoZSB0YWJsZXMgYXJlCisJICogbm90IGVtcHR5IHRoZSBwcm9jZXMgd2lsbCBzdG9wIGFuZCBleGl0LiBpZiB0aGUgdGFibGVzIGFyZSBlbXB0eSB0aGUKKwkgKiBtZXRob2Qgd2lsbCBpbXBvcnQgdGhlIHJlY29yZHMgZnJvbSB0aGUgZmlsZXMuIGluIGNhc2Ugb2YgYSBmYWlsIHRoZSBmbG93CisJICogd2lsbCBleGl0IGFuZCBjbGVhciBhbGwgdGhlIENhc3NhbmRyYSB0YWJsZXMuCisJICoKKwkgKiBAcGFyYW0gYXBwQ29uZmlnRGlyCisJICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIGRpciBpbiB3aWNoIHRoZSBvdXRwdXQgZmlsZXMgd2lsbCBiZQorCSAqICAgICAgICAgICAgc3RvcmVkCisJICogQHBhcmFtIGV4cG9ydEZyb21FcworCSAqICAgICAgICAgICAgc2hvdWxkIHRoZSBlcyBiZSBleHBvcnRlZCBhZ2FpbiBhbmQgb3ZlcndyaXRlIHRoZSBvbGQgZXhwb3J0CisJICogQHBhcmFtIGltcG9ydFRvQ2Fzc2FuZHJhCisJICogICAgICAgICAgICBzaG91bGQgd2UgaW1wb3J0IHRoZSBkYXRhIGludG8gY2Fzc2FuZHJhCisJICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBtaWdyYXRlRGF0YUVTVG9DYXNzbmRyYShTdHJpbmcgYXBwQ29uZmlnRGlyLCBib29sZWFuIGV4cG9ydEZyb21FcywgYm9vbGVhbiBpbXBvcnRUb0Nhc3NhbmRyYSkgeworCQlpbml0Rm9ybWF0ZXIoKTsKKwkJaWYgKCFpbml0RXNDbGllbnQoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJTWFwPFRhYmxlLCBGaWxlPiBmaWxlcyA9IGNyZWF0ZU91dFB1dEZpbGVzKGFwcENvbmZpZ0RpciwgZXhwb3J0RnJvbUVzKTsKKwkJaWYgKGZpbGVzID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZXhwb3J0RnJvbUVzICYmIGZpbGVzRW1wdHkoZmlsZXMpKSB7CisJCQlNYXA8VGFibGUsIFByaW50V3JpdGVyPiBwcmludGVyV3JpdGVyc01hcCA9IGNyZWF0ZVdyaXRlcnMoZmlsZXMpOworCQkJaWYgKHByaW50ZXJXcml0ZXJzTWFwID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQl0cnkgeworCQkJCUltbXV0YWJsZU9wZW5NYXA8U3RyaW5nLCBJbmRleE1ldGFEYXRhPiBpbmRleERhdGEgPSBnZXRJbmRleERhdGEoKTsKKwkJCQlmb3IgKE9iamVjdEN1cnNvcjxTdHJpbmc+IGtleSA6IGluZGV4RGF0YS5rZXlzKCkpIHsKKwkJCQkJaWYgKCJyZXNvdXJjZXMiLmVxdWFsc0lnbm9yZUNhc2Uoa2V5LnZhbHVlKSkgeworCQkJCQkJaWYgKCFleHBvcnRBcnRpZmFjdHMoa2V5LnZhbHVlLCBwcmludGVyV3JpdGVyc01hcCkpIHsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoa2V5LnZhbHVlLnN0YXJ0c1dpdGgoImF1ZGl0aW5nZXZlbnRzIikpIHsKKwkJCQkJCWlmICghZXhwb3J0QXVkaXQoa2V5LnZhbHVlLCBwcmludGVyV3JpdGVyc01hcCkpIHsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChlbGFzdGljU2VhcmNoQ2xpZW50ICE9IG51bGwpIHsKKwkJCQkJZWxhc3RpY1NlYXJjaENsaWVudC5jbG9zZSgpOworCQkJCX0KKwkJCQlmb3IgKFByaW50V3JpdGVyIHdyaXRlciA6IHByaW50ZXJXcml0ZXJzTWFwLnZhbHVlcygpKSB7CisJCQkJCXdyaXRlci5jbG9zZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaW1wb3J0VG9DYXNzYW5kcmEgJiYgIWltcG9ydFRvQ2Fzc25kcmEoZmlsZXMpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdEZvcm1hdGVyKCkgeworCQlzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZGF0ZUZvcm1hdFBhdHRlcm4pOworCQlzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGluaXRFc0NsaWVudCgpIHsKKwkJU3RyaW5nIGNvbmZpZ0hvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbmZpZy5ob21lIik7CisJCVVSTCB1cmwgPSBudWxsOworCQlTZXR0aW5ncyBzZXR0aW5ncyA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoU3lzdGVtVXRpbHMuSVNfT1NfV0lORE9XUykgeworCQkJCXVybCA9IG5ldyBVUkwoImZpbGU6Ly8vIiArIGNvbmZpZ0hvbWUgKyAiL2VsYXN0aWNzZWFyY2gueW1sIik7CisJCQl9IGVsc2UgeworCQkJCXVybCA9IG5ldyBVUkwoImZpbGU6IiArIGNvbmZpZ0hvbWUgKyAiL2VsYXN0aWNzZWFyY2gueW1sIik7CisJCQl9CisJCQlsb2cuZGVidWcoIlVSTCB7fSIsIHVybCk7CisJCQlzZXR0aW5ncyA9IFNldHRpbmdzLnNldHRpbmdzQnVpbGRlcigpLmxvYWRGcm9tUGF0aChQYXRocy5nZXQodXJsLnRvVVJJKCkpKS5idWlsZCgpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gfCBVUklTeW50YXhFeGNlcHRpb24gZTEpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBVUkwgaW4gb3JkZXIgdG8gbG9hZCBlbGFzdGljc2VhcmNoIHltbCIsIGUxKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJdGhpcy5lbGFzdGljU2VhcmNoQ2xpZW50ID0gbmV3IEVsYXN0aWNTZWFyY2hDbGllbnQoKTsKKwkJdGhpcy5lbGFzdGljU2VhcmNoQ2xpZW50LnNldENsdXN0ZXJOYW1lKHNldHRpbmdzLmdldCgiY2x1c3Rlci5uYW1lIikpOworCQl0aGlzLmVsYXN0aWNTZWFyY2hDbGllbnQuc2V0TG9jYWwoc2V0dGluZ3MuZ2V0KCJlbGFzdGljU2VhcmNoLmxvY2FsIikpOworCQl0aGlzLmVsYXN0aWNTZWFyY2hDbGllbnQuc2V0VHJhbnNwb3J0Q2xpZW50KHNldHRpbmdzLmdldCgiZWxhc3RpY1NlYXJjaC50cmFuc3BvcnRjbGllbnQiKSk7CisJCXRyeSB7CisJCQllbGFzdGljU2VhcmNoQ2xpZW50LmluaXRpYWxpemUoKTsKKwkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjbGVhcnMgYWxsIHRoZSBjYXNzYW5kcmEgdGFibGVzCisJICovCisJcHJpdmF0ZSB2b2lkIHRydW5jYXRlQ2Fzc2FuZHJhVGFibGUoKSB7CisJCWxvZy5pbmZvKCJpbXBvcnQgZmFpbGVkLiB0cnVuY2F0aW5nIENhc3NhbmRyYSB0YWJsZXMuIik7CisJCWFydGlmYWN0Q2Fzc2FuZHJhRGFvLmRlbGV0ZUFsbEFydGlmYWN0cygpOworCQlhdWRpdENhc3NhbmRyYURhby5kZWxldGVBbGxBdWRpdCgpOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgaW1wb3J0cyB0aGUgcmVjb3JkcyBmcm9tIHRoZSBmaWxlcyBpbnRvIGNhc3NhbmRyYQorCSAqIAorCSAqIEBwYXJhbSBmaWxlcworCSAqICAgICAgICAgICAgYSBtYXAgb2YgZmlsZXMgaG9sZGluZworCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisJICovCisJcHJpdmF0ZSBib29sZWFuIGltcG9ydFRvQ2Fzc25kcmEoTWFwPFRhYmxlLCBGaWxlPiBmaWxlcykgeworCQlsb2cuaW5mbygic3RhcnRpbmcgdG8gaW1wb3J0IGRhdGUgaW50byBDYXNzYW5kcmEuIik7CisJCWlmICghdmFsaWR0YVRhYmxzTm90RW1wdHkoZmlsZXMpKQorCQkJcmV0dXJuIHRydWU7CisJCWZvciAoVGFibGUgdGFibGUgOiBmaWxlcy5rZXlTZXQoKSkgeworCQkJbG9nLmluZm8oImltcG9ydGluZyByZWNvcmRlcyBpbnRvIHt9IiwgdGFibGUuZ2V0VGFibGVEZXNjcmlwdGlvbigpLmdldFRhYmxlTmFtZSgpKTsKKwkJCWlmICghaGFuZGxlSW1wb3J0KGZpbGVzLCB0YWJsZSkpIHsKKwkJCQl0cnVuY2F0ZUNhc3NhbmRyYVRhYmxlKCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWxvZy5pbmZvKCJmaW5pc2hlZCB0byBpbXBvcnQgZGF0ZSBpbnRvIENhc3NhbmRyYS4iKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHZhbGlkdGFUYWJsc05vdEVtcHR5KE1hcDxUYWJsZSwgRmlsZT4gZmlsZXMpIHsKKwkJZm9yIChUYWJsZSB0YWJsZSA6IGZpbGVzLmtleVNldCgpKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzPiBpc1RhYmxlRW1wdHlSZXMgPSBjaGVja0lmVGFibGVJc0VtcHR5KHRhYmxlKTsKKwkJCWlmIChpc1RhYmxlRW1wdHlSZXMuaXNSaWdodCgpIHx8ICFpc1RhYmxlRW1wdHlSZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQlsb2cuZXJyb3IoIkNhc3NhbmRyYSB0YWJsZSB7fSBpcyBub3QgZW1wdHkgb3BlcmF0aW9uIGFib3J0ZWQuIiwKKwkJCQkJCXRhYmxlLmdldFRhYmxlRGVzY3JpcHRpb24oKS5nZXRUYWJsZU5hbWUoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgcmV0cmlldmVzIHRoZSBmaWVsZHMgZnJvbSB0aGUgZ2l2ZW4gbWFwIGFuZCBwcmFwcnMgdGhlbSBmb3IKKwkgKiBzdG9yYWdlIGFzIGFuIGF1ZGl0IGFjY29yZGluZyB0byB0aGUgdGFibGUgbmFtZQorCSAqIAorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIHRoZSBtYXAgZnJvbSB3aGljaCB3ZSB3aWxsIHJldHJpdmUgdGhlIGZpZWxkcyBlbnVtIHZhbHVlcworCSAqIEBwYXJhbSB0YWJsZQorCSAqICAgICAgICAgICAgdGhlIHRhYmxlIHdlIGFyZSBnb2luZyB0byBzdG9yZSB0aGUgcmVjb3JkIGluLgorCSAqIEByZXR1cm4gYSBlbnVtbWFwIHJlcHJlc2VudGluZyB0aGUgYXVkaXQgcmVjb3JkIHRoYXQgaXMgZ29pbmcgdG8gYmUKKwkgKiAgICAgICAgIGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gY3JlYXRlQXVkaXRNYXAoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAsIFRhYmxlIHRhYmxlKSB7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCXN3aXRjaCAodGFibGUpIHsKKwkJY2FzZSBVU0VSX0FETUlOX0VWRU5UOgorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLCBtYXAuZ2V0KCJUSU1FU1RBTVAiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELCBtYXAuZ2V0KCJSRVFVRVNUX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRCwgbWFwLmdldCgiU0VSVklDRV9JTlNUQU5DRV9JRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgbWFwLmdldCgiQUNUSU9OIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWFwLmdldCgiREVTQyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgbWFwLmdldCgiU1RBVFVTIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVVNFUl9BRlRFUiwgbWFwLmdldCgiVVNFUl9BRlRFUiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1VTRVJfQkVGT1JFLCBtYXAuZ2V0KCJVU0VSX0JFRk9SRSIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbWFwLmdldCgiTU9ESUZJRVIiKSk7CisJCQlicmVhazsKKwkJY2FzZSBVU0VSX0FDQ0VTU19FVkVOVDoKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCwgbWFwLmdldCgiVElNRVNUQU1QIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCwgbWFwLmdldCgiUkVRVUVTVF9JRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsIG1hcC5nZXQoIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIG1hcC5nZXQoIkFDVElPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1hcC5nZXQoIkRFU0MiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIG1hcC5nZXQoIlNUQVRVUyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1VTRVJfVUlELCBtYXAuZ2V0KCJVU0VSIikpOworCQkJYnJlYWs7CisJCWNhc2UgUkVTT1VSQ0VfQURNSU5fRVZFTlQ6CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAsIG1hcC5nZXQoIlRJTUVTVEFNUCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQsIG1hcC5nZXQoIlJFUVVFU1RfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCBtYXAuZ2V0KCJTRVJWSUNFX0lOU1RBTkNFX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfSU5WQVJJQU5UX1VVSUQsIG1hcC5nZXQoIklOVkFSSUFOVF9VVUlEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBtYXAuZ2V0KCJBQ1RJT04iKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtYXAuZ2V0KCJERVNDIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBtYXAuZ2V0KCJTVEFUVVMiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sIG1hcC5nZXQoIkNVUlJfVkVSU0lPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUsIG1hcC5nZXQoIkNVUlJfU1RBVEUiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIG1hcC5nZXQoIkRJRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbWFwLmdldCgiTU9ESUZJRVIiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9QUkVWX1ZFUlNJT04sIG1hcC5nZXQoIlBSRVZfVkVSU0lPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfU1RBVEUsIG1hcC5nZXQoIlBSRVZfU1RBVEUiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCBtYXAuZ2V0KCJSRVNPVVJDRV9OQU1FIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwgbWFwLmdldCgiUkVTT1VSQ0VfVFlQRSIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RQUkVWX1NUQVRVUywgbWFwLmdldCgiRFBSRVZfU1RBVFVTIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfRENVUlJfU1RBVFVTLCBtYXAuZ2V0KCJEQ1VSUl9TVEFUVVMiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UT1NDQV9OT0RFX1RZUEUsIG1hcC5nZXQoIlRPU0NBX05PREVfVFlQRSIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQsIG1hcC5nZXQoIkNPTU1FTlQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BUlRJRkFDVF9EQVRBLCBtYXAuZ2V0KCJBUlRJRkFDVF9EQVRBIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUFJFVl9BUlRJRkFDVF9VVUlELCBtYXAuZ2V0KCJQUkVWX0FSVElGQUNUX1VVSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DVVJSX0FSVElGQUNUX1VVSUQsIG1hcC5nZXQoIkNVUlJfQVJUSUZBQ1RfVVVJRCIpKTsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSSUJVVElPTl9ET1dOTE9BRF9FVkVOVDoKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCwgbWFwLmdldCgiVElNRVNUQU1QIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCwgbWFwLmdldCgiUkVRVUVTVF9JRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsIG1hcC5nZXQoIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIG1hcC5nZXQoIkFDVElPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1hcC5nZXQoIkRFU0MiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIG1hcC5nZXQoIlNUQVRVUyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9SRVNPVVJDRV9VUkwsIG1hcC5nZXQoIlJFU09VUkNFX1VSTCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwgbWFwLmdldCgiQ09OU1VNRVJfSUQiKSk7CisJCQlicmVhazsKKwkJY2FzZSBESVNUUklCVVRJT05fRU5HSU5FX0VWRU5UOgorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLCBtYXAuZ2V0KCJUSU1FU1RBTVAiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELCBtYXAuZ2V0KCJSRVFVRVNUX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRCwgbWFwLmdldCgiU0VSVklDRV9JTlNUQU5DRV9JRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgbWFwLmdldCgiQUNUSU9OIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWFwLmdldCgiREVTQyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgbWFwLmdldCgiU1RBVFVTIikpOworCQkJaWYgKG1hcC5nZXQoIlRPUElDX05BTUUiKSAhPSBudWxsKSB7CisJCQkJaWYgKG1hcC5nZXQoIlRPUElDX05BTUUiKS5jb250YWlucygiLVNUQVRVUy0iKSkgeworCQkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fU1RBVFVTX1RPUElDX05BTUUsCisJCQkJCQkJbWFwLmdldCgiVE9QSUNfTkFNRSIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX1RPUElDX05BTUUsCisJCQkJCQkJbWFwLmdldCgiVE9QSUNfTkFNRSIpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfVE9QSUNfTkFNRSwKKwkJCQkJCW1hcC5nZXQoIkRTVEFUVVNfVE9QSUMiKSk7CisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX05PVElGSUNBVElPTl9UT1BJQ19OQU1FLAorCQkJCQkJbWFwLmdldCgiRE5PVElGX1RPUElDIikpOworCQkJfQorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1RPUElDX05BTUUsIG1hcC5nZXQoIlRPUElDX05BTUUiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUk9MRSwgbWFwLmdldCgiUk9MRSIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9BUElfS0VZLCBtYXAuZ2V0KCJBUElfS0VZIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0VOVlJJT05NRU5UX05BTUUsIG1hcC5nZXQoIkRfRU5WIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELCBtYXAuZ2V0KCJDT05TVU1FUl9JRCIpKTsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSSUJVVElPTl9OT1RJRklDQVRJT05fRVZFTlQ6CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAsIG1hcC5nZXQoIlRJTUVTVEFNUCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQsIG1hcC5nZXQoIlJFUVVFU1RfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCBtYXAuZ2V0KCJTRVJWSUNFX0lOU1RBTkNFX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBtYXAuZ2V0KCJBQ1RJT04iKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtYXAuZ2V0KCJERVNDIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBtYXAuZ2V0KCJTVEFUVVMiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1NUQVRFLCBtYXAuZ2V0KCJDVVJSX1NUQVRFIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9WRVJTSU9OLCBtYXAuZ2V0KCJDVVJSX1ZFUlNJT04iKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIG1hcC5nZXQoIkRJRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbWFwLmdldCgiTU9ESUZJRVIiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCBtYXAuZ2V0KCJSRVNPVVJDRV9OQU1FIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwgbWFwLmdldCgiUkVTT1VSQ0VfVFlQRSIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9UT1BJQ19OQU1FLCBtYXAuZ2V0KCJUT1BJQ19OQU1FIikpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVUSU9OX1NUQVRVU19FVkVOVDoKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCwgbWFwLmdldCgiVElNRVNUQU1QIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCwgbWFwLmdldCgiUkVRVUVTVF9JRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsIG1hcC5nZXQoIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIG1hcC5nZXQoIkFDVElPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1hcC5nZXQoIkRFU0MiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIG1hcC5nZXQoIlNUQVRVUyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9SRVNPVVJDRV9VUkwsIG1hcC5nZXQoIlJFU09VUkNFX1VSTCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRCwgbWFwLmdldCgiRElEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1RPUElDX05BTUUsIG1hcC5nZXQoIlRPUElDX05BTUUiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsIG1hcC5nZXQoIkNPTlNVTUVSX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1NUQVRVU19USU1FLCBtYXAuZ2V0KCJTVEFUVVNfVElNRSIpKTsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlQ6CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAsIG1hcC5nZXQoIlRJTUVTVEFNUCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQsIG1hcC5nZXQoIlJFUVVFU1RfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCBtYXAuZ2V0KCJTRVJWSUNFX0lOU1RBTkNFX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBtYXAuZ2V0KCJBQ1RJT04iKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtYXAuZ2V0KCJERVNDIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBtYXAuZ2V0KCJTVEFUVVMiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIG1hcC5nZXQoIkRJRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIG1hcC5nZXQoIlJFU09VUkNFX05BTUUiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLCBtYXAuZ2V0KCJSRVNPVVJDRV9UWVBFIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELCBtYXAuZ2V0KCJNT0RJRklFUiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTiwgbWFwLmdldCgiQ1VSUl9WRVJTSU9OIikpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVDoKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCwgbWFwLmdldCgiVElNRVNUQU1QIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCwgbWFwLmdldCgiUkVRVUVTVF9JRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsIG1hcC5nZXQoIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIG1hcC5nZXQoIkFDVElPTiIpKTsKKwkJCWlmIChtYXAuZ2V0KCJTVEFUVVNfREVTQyIpICE9IG51bGwpIHsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtYXAuZ2V0KCJTVEFUVVNfREVTQyIpKTsKKwkJCX0gZWxzZSB7CisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWFwLmdldCgiREVTQyIpKTsKKwkJCX0KKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgbWFwLmdldCgiU1RBVFVTIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELCBtYXAuZ2V0KCJDT05TVU1FUl9JRCIpKTsKKwkJCWJyZWFrOworCQljYXNlIEFVVEhfRVZFTlQ6CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAsIG1hcC5nZXQoIlRJTUVTVEFNUCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgbWFwLmdldCgiQUNUSU9OIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWFwLmdldCgiREVTQyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQsIG1hcC5nZXQoIlJFUVVFU1RfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIG1hcC5nZXQoIlNUQVRVUyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfVVNFUiwgbWFwLmdldCgiVVNFUiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfVVJMLCBtYXAuZ2V0KCJVUkwiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BVVRIX1NUQVRVUywgbWFwLmdldCgiQVVUSF9TVEFUVVMiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BVVRIX1JFQUxNLCBtYXAuZ2V0KCJSRUFMTSIpKTsKKwkJCWJyZWFrOworCQljYXNlIENPTlNVTUVSX0VWRU5UOgorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLCBtYXAuZ2V0KCJUSU1FU1RBTVAiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIG1hcC5nZXQoIkFDVElPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1hcC5nZXQoIkRFU0MiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIG1hcC5nZXQoIlNUQVRVUyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbWFwLmdldCgiTU9ESUZJRVIiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELCBtYXAuZ2V0KCJSRVFVRVNUX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRUNPTVBfVVNFUiwgbWFwLmdldCgiRUNPTVBfVVNFUiIpKTsKKwkJCWJyZWFrOworCQljYXNlIENBVEVHT1JZX0VWRU5UOgorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLCBtYXAuZ2V0KCJUSU1FU1RBTVAiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIG1hcC5nZXQoIkFDVElPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1hcC5nZXQoIkRFU0MiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIG1hcC5nZXQoIlNUQVRVUyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbWFwLmdldCgiTU9ESUZJRVIiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELCBtYXAuZ2V0KCJSRVFVRVNUX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRCwgbWFwLmdldCgiU0VSVklDRV9JTlNUQU5DRV9JRCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0NBVEVHT1JZX05BTUUsIG1hcC5nZXQoIkNBVEVHT1JZX05BTUUiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVUJfQ0FURUdPUllfTkFNRSwgbWFwLmdldCgiU1VCX0NBVEVHT1JZX05BTUUiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9HUk9VUElOR19OQU1FLCBtYXAuZ2V0KCJHUk9VUElOR19OQU1FIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwgbWFwLmdldCgiUkVTT1VSQ0VfVFlQRSIpKTsKKwkJCWJyZWFrOworCQljYXNlIEdFVF9VU0VSU19MSVNUX0VWRU5UOgorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLCBtYXAuZ2V0KCJUSU1FU1RBTVAiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIG1hcC5nZXQoIkFDVElPTiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1hcC5nZXQoIkRFU0MiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIG1hcC5nZXQoIlNUQVRVUyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbWFwLmdldCgiTU9ESUZJRVIiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELCBtYXAuZ2V0KCJSRVFVRVNUX0lEIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVUQUlMUywgbWFwLmdldCgiREVUQUlMUyIpKTsKKwkJCWJyZWFrOworCQljYXNlIEdFVF9DQVRFR09SWV9ISUVSQVJDSFlfRVZFTlQ6CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAsIG1hcC5nZXQoIlRJTUVTVEFNUCIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgbWFwLmdldCgiQUNUSU9OIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWFwLmdldCgiREVTQyIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgbWFwLmdldCgiU1RBVFVTIikpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELCBtYXAuZ2V0KCJNT0RJRklFUiIpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQsIG1hcC5nZXQoIlJFUVVFU1RfSUQiKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVRBSUxTLCBtYXAuZ2V0KCJERVRBSUxTIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhdWRpdGluZ0ZpZWxkcyA9IG51bGw7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gYXVkaXRpbmdGaWVsZHM7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCByZWFkcyB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBpbnRlbmRlZCBmb3IgYSBnaXZlbiB0YWJsZSwgYW5kCisJICogc29yZXMgdGhlbSBpbiBjYXNzYW5kcmEKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZXMKKwkgKiAgICAgICAgICAgIGEgbWFwIG9mIGZpbGVzIGZyb20gd2hpY2ggdGhlIHJlY29yZGVzIHdpbGwgYmUgcmV0cmlldmVkLgorCSAqIEBwYXJhbSB0YWJsZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdlIHdhbnQgdG8gbG9vayB1cCBpbiB0aGUgZmlsZXMgYW5kIHNvcmUKKwkgKiAgICAgICAgICAgIGluIENhc3NhbmRyYSAvLyAqIEBwYXJhbSBzdG9yZSB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuCisJICogICAgICAgICAgICBzdG9yaW5nIHJlY29yZGVzIGluIGNhc3NuZHJhCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFuZGxlSW1wb3J0KE1hcDxUYWJsZSwgRmlsZT4gZmlsZXMsIFRhYmxlIHRhYmxlKSB7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVzLmdldCh0YWJsZSkpKTsKKwkJCVN0cmluZyBsaW5lID0gbnVsbDsKKwkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgcmVzID0gbnVsbDsKKwkJCQlpZiAoVGFibGUuQVJUSUZBQ1QuZXF1YWxzKHRhYmxlKSkgeworCQkJCQlyZXMgPSBhcnRpZmFjdENhc3NhbmRyYURhby5zYXZlQXJ0aWZhY3QoanNvbk1hcHBlci5yZWFkVmFsdWUobGluZSwgRVNBcnRpZmFjdERhdGEuY2xhc3MpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlUeXBlIHR5cGUgPSBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIFN0cmluZz4+KCkgeworCQkJCQl9LmdldFR5cGUoKTsKKwkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBnc29uLmZyb21Kc29uKGxpbmUsIHR5cGUpOworCQkJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBjcmVhdGVBdWRpdE1hcChtYXAsIHRhYmxlKTsKKwkJCQkJQXVkaXRpbmdHZW5lcmljRXZlbnQgcmVjb3JkRm9yQ2Fzc2FuZHJhID0gbnVsbDsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJlY29yZEZvckNhc3NhbmRyYSA9IGNyZWF0ZUF1ZGl0UmVjb3JkKGF1ZGl0aW5nRmllbGRzKTsKKwkJCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJCQkJbG9nLmVycm9yKCJmaWxlZCB0byBwYXJzZSB0aW1lIHN0ZW1wIGluIHJlY29yZWQge30iLCBhdWRpdGluZ0ZpZWxkcyk7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKworCQkJCQlyZXMgPSBhdWRpdENhc3NhbmRyYURhby5zYXZlUmVjb3JkKHJlY29yZEZvckNhc3NhbmRyYSk7CisJCQkJfQorCQkJCWlmICghcmVzLmVxdWFscyhDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWxvZy5lcnJvcigic2F2ZSByZWNvcmVkIHRvIGNhc3NuZHJhIHt9IGZhaWxlZCB3aXRoIHN0YXR1cyB7fSBhYm9ydGluZy4iLAorCQkJCQkJCXRhYmxlLmdldFRhYmxlRGVzY3JpcHRpb24oKS5nZXRUYWJsZU5hbWUoKSwgcmVzKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byByZWFkIGZpbGUiLCBlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChiciAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJYnIuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGNsb3NlIGZpbGUgcmVhZGVyIiwgZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjaGVja3MgaWYgdGhlIGdpdmVuIHRhYmxlIGlzIGVtcHR5CisJICogCisJICogQHBhcmFtIHRhYmxlCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGFibGUgd2Ugd2FudCB0byBjaGVjaworCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgaXMgZW1wdHkKKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM+IGNoZWNrSWZUYWJsZUlzRW1wdHkoVGFibGUgdGFibGUpIHsKKwkJaWYgKFRhYmxlLkFSVElGQUNULmVxdWFscyh0YWJsZSkpIHsKKwkJCXJldHVybiBhcnRpZmFjdENhc3NhbmRyYURhby5pc1RhYmxlRW1wdHkodGFibGUuZ2V0VGFibGVEZXNjcmlwdGlvbigpLmdldFRhYmxlTmFtZSgpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBhdWRpdENhc3NhbmRyYURhby5pc1RhYmxlRW1wdHkodGFibGUuZ2V0VGFibGVEZXNjcmlwdGlvbigpLmdldFRhYmxlTmFtZSgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBmaWxlc0VtcHR5KE1hcDxUYWJsZSwgRmlsZT4gZmlsZXMpIHsKKwkJZm9yIChUYWJsZSB0YWJsZSA6IGZpbGVzLmtleVNldCgpKSB7CisJCQlGaWxlIGZpbGUgPSBmaWxlcy5nZXQodGFibGUpOworCQkJaWYgKGZpbGUubGVuZ3RoKCkgIT0gMCkgeworCQkJCWxvZy5pbmZvKCJmaWxlOnt9IGlzIG5vdCBlbXB0eSBza2lwcGluZyBleHBvcnQiLCB0YWJsZS5nZXRUYWJsZURlc2NyaXB0aW9uKCkuZ2V0VGFibGVOYW1lKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIHJlYWRzIHRoZSByZWNvcmRzIGZyb20gZXMgaW5kZXggb2YgYXVkaXQncyBpbnRvIGEgZmlsZSBhcworCSAqIGpzb24ncy4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBpbmRleCB3ZSB3YW50CisJICogQHBhcmFtIHByaW50ZXJXcml0ZXJzTWFwCisJICogICAgICAgICAgICBhIG1hcCBvZiB0aGUgd3JpdGVycyB3ZSB1c2UgdG8gd3JpdGUgdG8gYSBmaWxlLgorCSAqIEByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBleHBvcnQgd2FzIHN1Y2Nlc3NmdWwuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGV4cG9ydEF1ZGl0KFN0cmluZyB2YWx1ZSwgTWFwPFRhYmxlLCBQcmludFdyaXRlcj4gcHJpbnRlcldyaXRlcnNNYXApIHsKKwkJbG9nLmluZm8oInN0cmF0bmcgdG8gZXhwb3J0IGF1ZGl0IGRhdGEgZnJvbSBlcyBpbmRleHt9IHRvIGZpbGUuIiwgdmFsdWUpOworCQlRdWVyeUJ1aWxkZXIgcXVlcnlCdWlsZGVyID0gUXVlcnlCdWlsZGVycy5tYXRjaEFsbFF1ZXJ5KCk7CisJCVNlYXJjaFJlc3BvbnNlIHNjcm9sbFJlc3AgPSBlbGFzdGljU2VhcmNoQ2xpZW50LmdldENsaWVudCgpLnByZXBhcmVTZWFyY2godmFsdWUpLnNldFNjcm9sbChuZXcgVGltZVZhbHVlKDYwMDAwKSkKKwkJCQkuc2V0UXVlcnkocXVlcnlCdWlsZGVyKS5zZXRTaXplKDEwMCkuZXhlY3V0ZSgpLmFjdGlvbkdldCgpOworCQl3aGlsZSAodHJ1ZSkgeworCQkJZm9yIChTZWFyY2hIaXQgaGl0IDogc2Nyb2xsUmVzcC5nZXRIaXRzKCkuZ2V0SGl0cygpKSB7CisJCQkJUHJpbnRXcml0ZXIgb3V0ID0gcHJpbnRlcldyaXRlcnNNYXAuZ2V0KFR5cGVUb1RhYmxlTWFwcGluZy5nZXRUYWJsZUJ5VHlwZShoaXQuZ2V0VHlwZSgpKSk7CisJCQkJb3V0LnByaW50bG4oaGl0LmdldFNvdXJjZUFzU3RyaW5nKCkpOworCQkJfQorCQkJc2Nyb2xsUmVzcCA9IGVsYXN0aWNTZWFyY2hDbGllbnQuZ2V0Q2xpZW50KCkucHJlcGFyZVNlYXJjaFNjcm9sbChzY3JvbGxSZXNwLmdldFNjcm9sbElkKCkpCisJCQkJCS5zZXRTY3JvbGwobmV3IFRpbWVWYWx1ZSg2MDAwMCkpLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKTsKKwkJCWlmIChzY3JvbGxSZXNwLmdldEhpdHMoKS5nZXRIaXRzKCkubGVuZ3RoID09IDApIHsKKwkJCQlicmVhazsKKworCQkJfQorCQl9CisKKwkJbG9nLmluZm8oImV4cG9ydCBhdWRpdCBkYXRhIGZyb20gZXMgdG8gZmlsZS4gZmluaXNoZWQgc3VjY3Nlc2Z1bGx5Iik7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgcmVhZHMgdGhlIHJlY29yZHMgZnJvbSBlcyBpbmRleCBvZiByZXNvdXJjZXMgaW50byBhIGZpbGUgYXMKKwkgKiBqc29uJ3MuCisJICoKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBpbmRleCB3ZSB3YW50IHRvIHJlYWQKKwkgKiBAcGFyYW0gcHJpbnRlcldyaXRlcnNNYXAKKwkgKiAgICAgICAgICAgIGEgbWFwIG9mIHRoZSB3cml0ZXJzIHdlIHVzZSB0byB3cml0ZSB0byBhIGZpbGUuCisJICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIGV4cG9ydCB3YXMgc3VjY2Vzc2Z1bC4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gZXhwb3J0QXJ0aWZhY3RzKFN0cmluZyBpbmRleCwgTWFwPFRhYmxlLCBQcmludFdyaXRlcj4gcHJpbnRlcldyaXRlcnNNYXApIHsKKwkJbG9nLmluZm8oInN0cmF0bmcgdG8gZXhwb3J0IGFydGlmYWN0IGRhdGEgZnJvbSBlcyB0byBmaWxlLiIpOworCQlQcmludFdyaXRlciBvdXQgPSBwcmludGVyV3JpdGVyc01hcC5nZXQoVGFibGUuQVJUSUZBQ1QpOworCQlRdWVyeUJ1aWxkZXIgcXVlcnlCdWlsZGVyID0gUXVlcnlCdWlsZGVycy5tYXRjaEFsbFF1ZXJ5KCk7CisJCVNlYXJjaFJlc3BvbnNlIHNjcm9sbFJlc3AgPSBlbGFzdGljU2VhcmNoQ2xpZW50LmdldENsaWVudCgpLnByZXBhcmVTZWFyY2goaW5kZXgpLnNldFNjcm9sbChuZXcgVGltZVZhbHVlKDYwMDAwKSkKKwkJCQkuc2V0UXVlcnkocXVlcnlCdWlsZGVyKS5zZXRTaXplKDEwMCkuZXhlY3V0ZSgpLmFjdGlvbkdldCgpOworCQl3aGlsZSAodHJ1ZSkgeworCQkJZm9yIChTZWFyY2hIaXQgaGl0IDogc2Nyb2xsUmVzcC5nZXRIaXRzKCkuZ2V0SGl0cygpKSB7CisJCQkJOworCQkJCW91dC5wcmludGxuKGhpdC5nZXRTb3VyY2VBc1N0cmluZygpKTsKKwkJCX0KKwkJCXNjcm9sbFJlc3AgPSBlbGFzdGljU2VhcmNoQ2xpZW50LmdldENsaWVudCgpLnByZXBhcmVTZWFyY2hTY3JvbGwoc2Nyb2xsUmVzcC5nZXRTY3JvbGxJZCgpKQorCQkJCQkuc2V0U2Nyb2xsKG5ldyBUaW1lVmFsdWUoNjAwMDApKS5leGVjdXRlKCkuYWN0aW9uR2V0KCk7CisJCQlpZiAoc2Nyb2xsUmVzcC5nZXRIaXRzKCkuZ2V0SGl0cygpLmxlbmd0aCA9PSAwKSB7CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCisJCWxvZy5pbmZvKCJleHBvcnQgYXJ0aWZhY3QgZGF0YSBmcm9tIGVzIHRvIGZpbGUuIGZpbmlzaGVkIHN1Y2NzZXNmdWxseSIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIHJldHJpZXZlcyBhbGwgdGhlIGluZGV4ZXMgZnJvbSBlbGFzdGljc2VhcmNoCisJICogCisJICogQHJldHVybiBhIG1hcCBvZiBpbmRleGVzIGFuZCB0aGVyZSBtZXRhZGF0YQorCSAqLworCXByaXZhdGUgSW1tdXRhYmxlT3Blbk1hcDxTdHJpbmcsIEluZGV4TWV0YURhdGE+IGdldEluZGV4RGF0YSgpIHsKKwkJcmV0dXJuIGVsYXN0aWNTZWFyY2hDbGllbnQuZ2V0Q2xpZW50KCkuYWRtaW4oKS5jbHVzdGVyKCkucHJlcGFyZVN0YXRlKCkuZ2V0KCkuZ2V0U3RhdGUoKS5nZXRNZXRhRGF0YSgpCisJCQkJLmdldEluZGljZXMoKTsKKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIGNyZWF0ZXMgYWxsIHRoZSBmaWxlcyBhbmQgZGlyIHdoaWNoIGhvbGRzIHRoZW0uIGluIGNhc2UgdGhlCisJICogZmlsZXMgZXhpc3QgdGhleSB3aWxsIG5vdCBiZSBjcmVhdGVkIGFnYWluLgorCSAqIAorCSAqIEBwYXJhbSBhcHBDb25maWdEaXIKKwkgKiAgICAgICAgICAgIHRoZSBiYXNlIHBhdGggdW5kZXIgd2hpY2ggdGhlIG91dHB1dCBkaXIgd2lsbCBiZSBjcmVhdGVkIGFuZAorCSAqICAgICAgICAgICAgdGhlIGV4cG9ydCByZXN1bHQgZmlsZXMgdGhlIGNyZWF0ZWQgZmlsZXNhIGFyZSBuYW1lZCBhY2NvcmRpbmcKKwkgKiAgICAgICAgICAgIHRvIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbnRvIHdoaWNoIGl0IHdpbGwgYmUgaW1wb3J0ZWQuCisJICogQHBhcmFtIGV4cG9ydFRvRXMKKwkgKiAgICAgICAgICAgIGlmIHRydWUgYWxsIHRoZSBleHBvcnQgZmlsZXMgd2lsbCBiZSByZWNyZWF0ZWQKKwkgKiBAcmV0dXJudGhlIHJldHVybnMgYSBtYXAgb2YgdGFibGVzIGFuZCB0aGUgZmlsZXMgcmVwcmVzZW50aW5nIHRoZW0gdGhlbQorCSAqLworCXByaXZhdGUgTWFwPFRhYmxlLCBGaWxlPiBjcmVhdGVPdXRQdXRGaWxlcyhTdHJpbmcgYXBwQ29uZmlnRGlyLCBib29sZWFuIGV4cG9ydFRvRXMpIHsKKwkJTWFwPFRhYmxlLCBGaWxlPiByZXN1bHQgPSBuZXcgRW51bU1hcDxUYWJsZSwgRmlsZT4oVGFibGUuY2xhc3MpOworCQlGaWxlIG91dHB1dERpciA9IG5ldyBGaWxlKGFwcENvbmZpZ0RpciArICIvb3V0cHV0LyIpOworCQlpZiAoIWNyZWF0ZU91dFB1dEZvbGRlcihvdXRwdXREaXIpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlmb3IgKFRhYmxlIHRhYmxlIDogVGFibGUudmFsdWVzKCkpIHsKKwkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG91dHB1dERpciArICIvIiArIHRhYmxlLmdldFRhYmxlRGVzY3JpcHRpb24oKS5nZXRUYWJsZU5hbWUoKSk7CisJCQlpZiAoZXhwb3J0VG9FcykgeworCQkJCXRyeSB7CisJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7CisJCQkJCQlGaWxlcy5kZWxldGUoZmlsZS50b1BhdGgoKSk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGRlbGV0ZSBvdXRwdXQgZmlsZSAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlmaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyICsgIi8iICsgdGFibGUuZ2V0VGFibGVEZXNjcmlwdGlvbigpLmdldFRhYmxlTmFtZSgpKTsKKwkJCX0KKwkJCWlmICghZmlsZS5leGlzdHMoKSkgeworCQkJCXRyeSB7CisJCQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBmaWxlICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBlKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQkJcmVzdWx0LnB1dCh0YWJsZSwgZmlsZSk7CisKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY3JlYXRlIHRoZSB3cml0ZXJzIHRvIGVhY2ggZmlsZQorCSAqIAorCSAqIEBwYXJhbSBmaWxlcworCSAqICAgICAgICAgICAgYSBtYXAgb2YgdGhlIGZpbGVzIGFjY29yZGluZyB0byB0YWJsZQorCSAqIEByZXR1cm4gcmV0dXJucyBhIG1hcCBvZiB3cml0ZXJzIGFjY29yZGluZyB0byB0YWJsZS4KKwkgKi8KKwlwcml2YXRlIE1hcDxUYWJsZSwgUHJpbnRXcml0ZXI+IGNyZWF0ZVdyaXRlcnMoTWFwPFRhYmxlLCBGaWxlPiBmaWxlcykgeworCQlNYXA8VGFibGUsIFByaW50V3JpdGVyPiBwcmludGVyV3JpdGVyc01hcCA9IG5ldyBFbnVtTWFwPD4oVGFibGUuY2xhc3MpOworCQl0cnkgeworCQkJZm9yIChUYWJsZSB0YWJsZSA6IGZpbGVzLmtleVNldCgpKSB7CisJCQkJbG9nLmluZm8oImNyZWF0aW5nIHdyaXRlciBmb3Ige30iLCB0YWJsZSk7CisJCQkJRmlsZSBmaWxlID0gZmlsZXMuZ2V0KHRhYmxlKTsKKwkJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZmlsZSwgdHJ1ZSk7CisJCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIoZncpOworCQkJCVByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihidyk7CisJCQkJcHJpbnRlcldyaXRlcnNNYXAucHV0KHRhYmxlLCBvdXQpOworCQkJCWxvZy5pbmZvKCJjcmVhdGluZyB3cml0ZXIgZm9yIHt9IHdhcyBzdWNjZXNzZnVsIiwgdGFibGUpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoImNyZWF0ZSB3cml0ZXIgdG8gZmlsZSBmYWlsZWQiLCBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBwcmludGVyV3JpdGVyc01hcDsKKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIGNyZWF0ZXMgdGhlIG91dHB1dCBkaXIgaW4gY2FzZSBpdCBkb2VzIG5vdCBleGlzdAorCSAqIAorCSAqIEBwYXJhbSBvdXRwdXREaXIKKwkgKiAgICAgICAgICAgIHRoZSBwYXRoIHVuZGVyIHdpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQuCisJICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIGNyZWF0ZSB3YXMgc3VjY3Nlc2Z1bCBvciB0aGUgZGlyIGFscmVhZHkgZXhpc3RzCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNyZWF0ZU91dFB1dEZvbGRlcihGaWxlIG91dHB1dERpcikgeworCQlpZiAoIW91dHB1dERpci5leGlzdHMoKSkgeworCQkJbG9nLmluZm8oImNyZWF0aW5nIG91dHB1dCBkaXIiICsgb3V0cHV0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCXRyeSB7CisJCQkJRmlsZXMuY3JlYXRlRGlyZWN0b3JpZXMob3V0cHV0RGlyLnRvUGF0aCgpKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IGRpciIgKyBvdXRwdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgZW51bSBUeXBlVG9UYWJsZU1hcHBpbmcgeworCQlVU0VSX0FETUlOX0VWRU5UX1RZUEUoQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5VU0VSX0FETUlOX0VWRU5UX1RZUEUsCisJCQkJVGFibGUuVVNFUl9BRE1JTl9FVkVOVCksIFVTRVJfQUNDRVNTX0VWRU5UX1RZUEUoQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5VU0VSX0FDQ0VTU19FVkVOVF9UWVBFLAorCQkJCQkJVGFibGUuVVNFUl9BQ0NFU1NfRVZFTlQpLCBSRVNPVVJDRV9BRE1JTl9FVkVOVF9UWVBFKAorCQkJCQkJCQlBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUsCisJCQkJCQkJCVRhYmxlLlJFU09VUkNFX0FETUlOX0VWRU5UKSwgRElTVFJJQlVUSU9OX0RPV05MT0FEX0VWRU5UX1RZUEUoCisJCQkJCQkJCQkJQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fRE9XTkxPQURfRVZFTlRfVFlQRSwKKwkJCQkJCQkJCQlUYWJsZS5ESVNUUklCVVRJT05fRE9XTkxPQURfRVZFTlQpLCBESVNUUklCVVRJT05fRU5HSU5FX0VWRU5UX1RZUEUoCisJCQkJCQkJCQkJCQlBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9FTkdJTkVfRVZFTlRfVFlQRSwKKwkJCQkJCQkJCQkJCVRhYmxlLkRJU1RSSUJVVElPTl9FTkdJTkVfRVZFTlQpLCBESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX0VWRU5UX1RZUEUoCisJCQkJCQkJCQkJCQkJCUF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX05PVElGSUNBVElPTl9FVkVOVF9UWVBFLAorCQkJCQkJCQkJCQkJCQlUYWJsZS5ESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX0VWRU5UKSwgRElTVFJJQlVUSU9OX1NUQVRVU19FVkVOVF9UWVBFKAorCQkJCQkJCQkJCQkJCQkJCUF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX1NUQVRVU19FVkVOVF9UWVBFLAorCQkJCQkJCQkJCQkJCQkJCVRhYmxlLkRJU1RSSUJVVElPTl9TVEFUVVNfRVZFTlQpLCBESVNUUklCVVRJT05fREVQTE9ZX0VWRU5UX1RZUEUoCisJCQkJCQkJCQkJCQkJCQkJCQlBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlRfVFlQRSwKKwkJCQkJCQkJCQkJCQkJCQkJCVRhYmxlLkRJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlQpLCBESVNUUklCVVRJT05fR0VUX1VFQl9DTFVTVEVSX0VWRU5UX1RZUEUoCisJCQkJCQkJCQkJCQkJCQkJCQkJCUF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVF9UWVBFLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlUYWJsZS5ESVNUUklCVVRJT05fR0VUX1VFQl9DTFVTVEVSX0VWRU5UKSwgQVVUSF9FVkVOVF9UWVBFKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVUSF9FVkVOVF9UWVBFLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVRhYmxlLkFVVEhfRVZFTlQpLCBDT05TVU1FUl9FVkVOVF9UWVBFKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5DT05TVU1FUl9FVkVOVF9UWVBFLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJVGFibGUuQ09OU1VNRVJfRVZFTlQpLCBDQVRFR09SWV9FVkVOVF9UWVBFKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkNBVEVHT1JZX0VWRU5UX1RZUEUsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVRhYmxlLkNBVEVHT1JZX0VWRU5UKSwgR0VUX1VTRVJTX0xJU1RfRVZFTlRfVFlQRSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkdFVF9VU0VSU19MSVNUX0VWRU5UX1RZUEUsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJVGFibGUuR0VUX1VTRVJTX0xJU1RfRVZFTlQpLCBHRVRfQ0FURUdPUllfSElFUkFSQ0hZX0VWRU5UX1RZUEUoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkdFVF9DQVRFR09SWV9ISUVSQVJDSFlfRVZFTlRfVFlQRSwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVRhYmxlLkdFVF9DQVRFR09SWV9ISUVSQVJDSFlfRVZFTlQpOworCisJCVN0cmluZyB0eXBlTmFtZTsKKwkJVGFibGUgdGFibGU7CisKKwkJVHlwZVRvVGFibGVNYXBwaW5nKFN0cmluZyB0eXBlTmFtZSwgVGFibGUgdGFibGUpIHsKKwkJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwkJCXRoaXMudGFibGUgPSB0YWJsZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisJCQlyZXR1cm4gdHlwZU5hbWU7CisJCX0KKworCQlwdWJsaWMgVGFibGUgZ2V0VGFibGUoKSB7CisJCQlyZXR1cm4gdGFibGU7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIFRhYmxlIGdldFRhYmxlQnlUeXBlKFN0cmluZyB0eXBlKSB7CisJCQlmb3IgKFR5cGVUb1RhYmxlTWFwcGluZyBtYXBwaW5nIDogVHlwZVRvVGFibGVNYXBwaW5nLnZhbHVlcygpKSB7CisJCQkJaWYgKG1hcHBpbmcuZ2V0VHlwZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisJCQkJCXJldHVybiBtYXBwaW5nLmdldFRhYmxlKCk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIEF1ZGl0aW5nR2VuZXJpY0V2ZW50IGNyZWF0ZUF1ZGl0UmVjb3JkKEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykKKwkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisJCUF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtID0gQXVkaXRpbmdBY3Rpb25FbnVtCisJCQkJLmdldEFjdGlvbkJ5TmFtZSgoU3RyaW5nKSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04pKTsKKwkJU3RyaW5nIHRhYmxlTmFtZSA9IGFjdGlvbkVudW0uZ2V0QXVkaXRpbmdFc1R5cGUoKTsKKwkJQXVkaXRpbmdHZW5lcmljRXZlbnQgZXZlbnQgPSBudWxsOworCQlEYXRlIGRhdGUgPSBudWxsOworCQlzd2l0Y2ggKHRhYmxlTmFtZSkgeworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuVVNFUl9BRE1JTl9FVkVOVF9UWVBFOgorCQkJVXNlckFkbWluRXZlbnQgdXNlckFkbWluRXZlbnQgPSBuZXcgVXNlckFkbWluRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQl1c2VyQWRtaW5FdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSB1c2VyQWRtaW5FdmVudDsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVUSF9FVkVOVF9UWVBFOgorCQkJQXV0aEV2ZW50IGF1dGhFdmVudCA9IG5ldyBBdXRoRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQlhdXRoRXZlbnQuc2V0VGltZXN0YW1wMShkYXRlKTsKKwkJCWV2ZW50ID0gYXV0aEV2ZW50OworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5DQVRFR09SWV9FVkVOVF9UWVBFOgorCQkJQ2F0ZWdvcnlFdmVudCBjYXRlZ29yeUV2ZW50ID0gbmV3IENhdGVnb3J5RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQljYXRlZ29yeUV2ZW50LnNldFRpbWVzdGFtcDEoZGF0ZSk7CisJCQlldmVudCA9IGNhdGVnb3J5RXZlbnQ7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEU6CisJCQlSZXNvdXJjZUFkbWluRXZlbnQgcmVzb3VyY2VBZG1pbkV2ZW50ID0gbmV3IFJlc291cmNlQWRtaW5FdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlkYXRlID0gc2ltcGxlRGF0ZUZvcm1hdC5wYXJzZSgoU3RyaW5nKSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVApKTsKKwkJCXJlc291cmNlQWRtaW5FdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSByZXNvdXJjZUFkbWluRXZlbnQ7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlVTRVJfQUNDRVNTX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBVc2VyQWNjZXNzRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJVXNlckFjY2Vzc0V2ZW50IHVzZXJBY2Nlc3NFdmVudCA9IG5ldyBVc2VyQWNjZXNzRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQl1c2VyQWNjZXNzRXZlbnQuc2V0VGltZXN0YW1wMShkYXRlKTsKKwkJCWV2ZW50ID0gdXNlckFjY2Vzc0V2ZW50OworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fU1RBVFVTX0VWRU5UX1RZUEU6CisJCQlEaXN0cmlidXRpb25TdGF0dXNFdmVudCBkaXN0cmlidXRpb25TdGF0dXNFdmVudCA9IG5ldyBEaXN0cmlidXRpb25TdGF0dXNFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlkYXRlID0gc2ltcGxlRGF0ZUZvcm1hdC5wYXJzZSgoU3RyaW5nKSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVApKTsKKwkJCWRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50LnNldFRpbWVzdGFtcDEoZGF0ZSk7CisJCQlldmVudCA9IGRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50OworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fRE9XTkxPQURfRVZFTlRfVFlQRToKKwkJCURpc3RyaWJ1dGlvbkRvd25sb2FkRXZlbnQgZGlzdHJpYnV0aW9uRG93bmxvYWRFdmVudCA9IG5ldyBEaXN0cmlidXRpb25Eb3dubG9hZEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwkJCWRhdGUgPSBzaW1wbGVEYXRlRm9ybWF0LnBhcnNlKChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCkpOworCQkJZGlzdHJpYnV0aW9uRG93bmxvYWRFdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSBkaXN0cmlidXRpb25Eb3dubG9hZEV2ZW50OworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fRU5HSU5FX0VWRU5UX1RZUEU6CisJCQlEaXN0cmlidXRpb25FbmdpbmVFdmVudCBkaXN0cmlidXRpb25FbmdpbmVFdmVudCA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmVFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlkYXRlID0gc2ltcGxlRGF0ZUZvcm1hdC5wYXJzZSgoU3RyaW5nKSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVApKTsKKwkJCWRpc3RyaWJ1dGlvbkVuZ2luZUV2ZW50LnNldFRpbWVzdGFtcDEoZGF0ZSk7CisJCQlldmVudCA9IGRpc3RyaWJ1dGlvbkVuZ2luZUV2ZW50OworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX0VWRU5UX1RZUEU6CisJCQlEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudCBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudCA9IG5ldyBEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudCgKKwkJCQkJYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQlkaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudDsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0RFUExPWV9FVkVOVF9UWVBFOgorCQkJRGlzdHJpYnV0aW9uRGVwbG95RXZlbnQgZGlzdHJpYnV0aW9uRGVwbG95RXZlbnQgPSBuZXcgRGlzdHJpYnV0aW9uRGVwbG95RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQlkaXN0cmlidXRpb25EZXBsb3lFdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSBkaXN0cmlidXRpb25EZXBsb3lFdmVudDsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVF9UWVBFOgorCQkJQXVkaXRpbmdHZXRVZWJDbHVzdGVyRXZlbnQgYXVkaXRpbmdHZXRVZWJDbHVzdGVyRXZlbnQgPSBuZXcgQXVkaXRpbmdHZXRVZWJDbHVzdGVyRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQlhdWRpdGluZ0dldFVlYkNsdXN0ZXJFdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSBhdWRpdGluZ0dldFVlYkNsdXN0ZXJFdmVudDsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQ09OU1VNRVJfRVZFTlRfVFlQRToKKwkJCUNvbnN1bWVyRXZlbnQgY29uc3VtZXJFdmVudCA9IG5ldyBDb25zdW1lckV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwkJCWRhdGUgPSBzaW1wbGVEYXRlRm9ybWF0LnBhcnNlKChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCkpOworCQkJY29uc3VtZXJFdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSBjb25zdW1lckV2ZW50OworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5HRVRfVVNFUlNfTElTVF9FVkVOVF9UWVBFOgorCQkJR2V0VXNlcnNMaXN0RXZlbnQgZ2V0VXNlcnNMaXN0RXZlbnQgPSBuZXcgR2V0VXNlcnNMaXN0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQlnZXRVc2Vyc0xpc3RFdmVudC5zZXRUaW1lc3RhbXAxKGRhdGUpOworCQkJZXZlbnQgPSBnZXRVc2Vyc0xpc3RFdmVudDsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuR0VUX0NBVEVHT1JZX0hJRVJBUkNIWV9FVkVOVF9UWVBFOgorCQkJR2V0Q2F0ZWdvcnlIaWVyYXJjaHlFdmVudCBnZXRDYXRlZ29yeUhpZXJhcmNoeUV2ZW50ID0gbmV3IEdldENhdGVnb3J5SGllcmFyY2h5RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJZGF0ZSA9IHNpbXBsZURhdGVGb3JtYXQucGFyc2UoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKSk7CisJCQlnZXRDYXRlZ29yeUhpZXJhcmNoeUV2ZW50LnNldFRpbWVzdGFtcDEoZGF0ZSk7CisJCQlldmVudCA9IGdldENhdGVnb3J5SGllcmFyY2h5RXZlbnQ7CisJCQlicmVhazsKKworCQl9CisJCXJldHVybiBldmVudDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9Fc1RvQ2Fzc2FuZHJhRGF0YU1pZ3JhdGlvbkNvbmZpZy5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL0VzVG9DYXNzYW5kcmFEYXRhTWlncmF0aW9uQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMwNDcxZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9Fc1RvQ2Fzc2FuZHJhRGF0YU1pZ3JhdGlvbkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5BcnRpZmFjdENhc3NhbmRyYURhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLkF1ZGl0Q2Fzc2FuZHJhRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuQ2Fzc2FuZHJhQ2xpZW50OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkJlYW47CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQ29uZmlndXJhdGlvbjsKKworQENvbmZpZ3VyYXRpb24KK3B1YmxpYyBjbGFzcyBFc1RvQ2Fzc2FuZHJhRGF0YU1pZ3JhdGlvbkNvbmZpZyB7CisJQEJlYW4obmFtZSA9ICJEYXRhTWlncmF0aW9uQmVhbiIpCisJcHVibGljIERhdGFNaWdyYXRpb24gZGF0YU1pZ3JhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBEYXRhTWlncmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJhcnRpZmFjdC1jYXNzYW5kcmEtZGFvIikKKwlwdWJsaWMgQXJ0aWZhY3RDYXNzYW5kcmFEYW8gYXJ0aWZhY3RDYXNzYW5kcmFEYW8oKSB7CisJCXJldHVybiBuZXcgQXJ0aWZhY3RDYXNzYW5kcmFEYW8oKTsKKwl9CisKKwlAQmVhbihuYW1lID0gImF1ZGl0LWNhc3NhbmRyYS1kYW8iKQorCXB1YmxpYyBBdWRpdENhc3NhbmRyYURhbyBhdWRpdENhc3NhbmRyYURhbygpIHsKKwkJcmV0dXJuIG5ldyBBdWRpdENhc3NhbmRyYURhbygpOworCX0KKworCUBCZWFuKG5hbWUgPSAiY2Fzc2FuZHJhLWNsaWVudCIpCisJcHVibGljIENhc3NhbmRyYUNsaWVudCBjYXNzYW5kcmFDbGllbnQoKSB7CisJCXJldHVybiBuZXcgQ2Fzc2FuZHJhQ2xpZW50KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvR3JhcGhNTENvbnZlcnRlci5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL0dyYXBoTUxDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjYyMDcyCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL0dyYXBoTUxDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDY5NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbmZpZ3VyYXRpb24uQmFzZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRGlyZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuaW8uSW9Db3JlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLmdyYXBoc29uLkdyYXBoU09OV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuRWxlbWVudEhlbHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuRWRnZTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuRmFjdG9yeTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoUXVlcnk7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKy8vaW1wb3J0IGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy5EaXJlY3Rpb247CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMuRWRnZTsKKy8vaW1wb3J0IGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy5WZXJ0ZXg7CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMudXRpbC5FbGVtZW50SGVscGVyOworLy9pbXBvcnQgY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLnV0aWwuaW8uZ3JhcGhzb24uR3JhcGhTT05SZWFkZXI7CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMudXRpbC5pby5ncmFwaHNvbi5HcmFwaFNPTldyaXRlcjsKKworcHVibGljIGNsYXNzIEdyYXBoTUxDb252ZXJ0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdyYXBoTUxDb252ZXJ0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCXB1YmxpYyBib29sZWFuIGltcG9ydEdyYXBoKFN0cmluZ1tdIGFyZ3MpIHsKKworCQlUaXRhbkdyYXBoIGdyYXBoID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyB0aXRhbkZpbGVMb2NhdGlvbiA9IGFyZ3NbMV07CisJCQlTdHJpbmcgaW5wdXRGaWxlID0gYXJnc1syXTsKKwkJCWdyYXBoID0gb3BlbkdyYXBoKHRpdGFuRmlsZUxvY2F0aW9uKTsKKworCQkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPj4gcHJvcGVydGllc0NyaXRlcmlhVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+IGltbXV0YWJsZVBhaXIxID0gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KCJoZWFsdGhjaGVja2lzIiwgIkdPT0QiKTsKKwkJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+IGltbXV0YWJsZVBhaXIyID0gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KCJub2RlTGFiZWwiLCAidXNlciIpOworCQkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4gaW1tdXRhYmxlUGFpcjMgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4oIm5vZGVMYWJlbCIsCisJCQkJCSJyZXNvdXJjZUNhdGVnb3J5Iik7CisJCQlJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBpbW11dGFibGVQYWlyNCA9IG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPigibm9kZUxhYmVsIiwKKwkJCQkJInNlcnZpY2VDYXRlZ29yeSIpOworCisJCQlwcm9wZXJ0aWVzQ3JpdGVyaWFUb0RlbGV0ZS5hZGQoaW1tdXRhYmxlUGFpcjEpOworCQkJcHJvcGVydGllc0NyaXRlcmlhVG9EZWxldGUuYWRkKGltbXV0YWJsZVBhaXIyKTsKKwkJCXByb3BlcnRpZXNDcml0ZXJpYVRvRGVsZXRlLmFkZChpbW11dGFibGVQYWlyMyk7CisJCQlwcm9wZXJ0aWVzQ3JpdGVyaWFUb0RlbGV0ZS5hZGQoaW1tdXRhYmxlUGFpcjQpOworCisJCQlib29sZWFuIHJlc3VsdCA9IGltcG9ydEpzb25HcmFwaChncmFwaCwgaW5wdXRGaWxlLCBwcm9wZXJ0aWVzQ3JpdGVyaWFUb0RlbGV0ZSk7CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJCS8vIGdyYXBoLnNodXRkb3duKCk7CisJCQkJZ3JhcGguY2xvc2UoKTsKKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIGJvb2xlYW4gZXhwb3J0R3JhcGgoU3RyaW5nW10gYXJncykgeworCisJCVRpdGFuR3JhcGggZ3JhcGggPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIHRpdGFuRmlsZUxvY2F0aW9uID0gYXJnc1sxXTsKKwkJCVN0cmluZyBvdXRwdXREaXJlY3RvcnkgPSBhcmdzWzJdOworCQkJZ3JhcGggPSBvcGVuR3JhcGgodGl0YW5GaWxlTG9jYXRpb24pOworCisJCQlTdHJpbmcgcmVzdWx0ID0gZXhwb3J0SnNvbkdyYXBoKGdyYXBoLCBvdXRwdXREaXJlY3RvcnkpOworCisJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhwb3J0ZWQgZmlsZT0iICsgcmVzdWx0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJCS8vIGdyYXBoLnNodXRkb3duKCk7CisJCQkJZ3JhcGguY2xvc2UoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZXhwb3J0R3JhcGhNbChTdHJpbmdbXSBhcmdzKSB7CisKKwkJVGl0YW5HcmFwaCBncmFwaCA9IG51bGw7CisJCVN0cmluZyByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIHRpdGFuRmlsZUxvY2F0aW9uID0gYXJnc1sxXTsKKwkJCVN0cmluZyBvdXRwdXREaXJlY3RvcnkgPSBhcmdzWzJdOworCQkJZ3JhcGggPSBvcGVuR3JhcGgodGl0YW5GaWxlTG9jYXRpb24pOworCisJCQlyZXN1bHQgPSBleHBvcnRHcmFwaE1sKGdyYXBoLCBvdXRwdXREaXJlY3RvcnkpOworCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4cG9ydGVkIGZpbGU9IiArIHJlc3VsdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJCWdyYXBoLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBib29sZWFuIGZpbmRFcnJvckluSnNvbkdyYXBoKFN0cmluZ1tdIGFyZ3MpIHsKKworCQlUaXRhbkdyYXBoIGdyYXBoID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyB0aXRhbkZpbGVMb2NhdGlvbiA9IGFyZ3NbMV07CisJCQlTdHJpbmcgb3V0cHV0RGlyZWN0b3J5ID0gYXJnc1syXTsKKwkJCWdyYXBoID0gb3BlbkdyYXBoKHRpdGFuRmlsZUxvY2F0aW9uKTsKKworCQkJU3RyaW5nIHJlc3VsdCA9IGZpbmRFcnJvckluSnNvbkdyYXBoKGdyYXBoLCBvdXRwdXREaXJlY3RvcnkpOworCisJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhwb3J0ZWQgZmlsZT0iICsgcmVzdWx0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJCS8vIGdyYXBoLnNodXRkb3duKCk7CisJCQkJZ3JhcGguY2xvc2UoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBUaXRhbkdyYXBoIG9wZW5HcmFwaChTdHJpbmcgdGl0YW5GaWxlTG9jYXRpb24pIHsKKworCQlUaXRhbkdyYXBoIGdyYXBoID0gVGl0YW5GYWN0b3J5Lm9wZW4odGl0YW5GaWxlTG9jYXRpb24pOworCisJCXJldHVybiBncmFwaDsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZXhwb3J0SnNvbkdyYXBoKFRpdGFuR3JhcGggZ3JhcGgsIFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKKworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworCQkvLyBHcmFwaE1MV3JpdGVyIGdyYXBoTUxXcml0ZXIgPSBuZXcgR3JhcGhNTFdyaXRlcihncmFwaCk7CisKKwkJU3RyaW5nIG91dHB1dEZpbGUgPSBvdXRwdXREaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArICJleHBvcnRHcmFwaC4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmpzb24iOworCisJCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworCQl0cnkgeworCQkJb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpKTsKKworCQkJLy8gR3JhcGhTT05Xcml0ZXIub3V0cHV0R3JhcGgoZ3JhcGgsIG91dHB1dEZpbGUpOworCQkJZmluYWwgR3JhcGhTT05Xcml0ZXIuQnVpbGRlciBidWlsZGVyID0gR3JhcGhTT05Xcml0ZXIuYnVpbGQoKTsKKwkJCWZpbmFsIEdyYXBoU09OTWFwcGVyIG1hcHBlciA9IG5ld0dyYXBoU09OTWFwcGVyKGdyYXBoKTsKKwkJCWJ1aWxkZXIubWFwcGVyKG1hcHBlcik7CisJCQlmaW5hbCBHcmFwaFNPTldyaXRlciB3cml0ZXIgPSBidWlsZGVyLmNyZWF0ZSgpOworCQkJd3JpdGVyLndyaXRlR3JhcGgob3V0LCBncmFwaCk7CisKKwkJCS8vIEdyYXBoU09OV3JpdGVyIGNyZWF0ZSA9IEdyYXBoU09OV3JpdGVyLmJ1aWxkKCkuIGNyZWF0ZSgpOworCQkJLy8gY3JlYXRlLndyaXRlR3JhcGgob3V0LCBncmFwaCk7CisKKwkJCS8vIGdyYXBoLmNvbW1pdCgpOworCQkJZ3JhcGgudHgoKS5jb21taXQoKTsKKworCQkJcmVzdWx0ID0gb3V0cHV0RmlsZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCWdyYXBoLnR4KCkucm9sbGJhY2soKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaWYgKG91dCAhPSBudWxsKSB7CisJCQkJCW91dC5jbG9zZSgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGV4cG9ydEdyYXBoTWwoVGl0YW5HcmFwaCBncmFwaCwgU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKwkJU3RyaW5nIG91dHB1dEZpbGUgPSBvdXRwdXREaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArICJleHBvcnRHcmFwaC4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmdyYXBobWwiOworCQl0cnkgeworCQkJdHJ5IChmaW5hbCBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSkpKSB7CisJCQkJZ3JhcGguaW8oSW9Db3JlLmdyYXBobWwoKSkud3JpdGVyKCkubm9ybWFsaXplKHRydWUpLmNyZWF0ZSgpLndyaXRlR3JhcGgob3MsIGdyYXBoKTsKKwkJCX0KKwkJCXJlc3VsdCA9IG91dHB1dEZpbGU7CisJCQlncmFwaC50eCgpLmNvbW1pdCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZ3JhcGgudHgoKS5yb2xsYmFjaygpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgR3JhcGhTT05NYXBwZXIgbmV3R3JhcGhTT05NYXBwZXIoZmluYWwgR3JhcGggZ3JhcGgpIHsKKwkJZmluYWwgR3JhcGhTT05NYXBwZXIuQnVpbGRlciBidWlsZGVyID0gZ3JhcGguaW8oSW9Db3JlLmdyYXBoc29uKCkpLm1hcHBlcigpOworCQkvLyBEaWZmZXJlbnQgZmFpbHVyZSB3aXRoIGVtYmVkZGVkIHR5cGUgaW5mby4KKwkJLy8gYnVpbGRlci5lbWJlZFR5cGVzKHRydWUpOworCQlyZXR1cm4gYnVpbGRlci5jcmVhdGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpbXBvcnRKc29uR3JhcGgoVGl0YW5HcmFwaCBncmFwaCwgU3RyaW5nIGdyYXBoSnNvbkZpbGUsCisJCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+PiBwcm9wZXJ0aWVzQ3JpdGVyaWFUb0RlbGV0ZSkgeworCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisKKwkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOworCisJCXRyeSB7CisKKwkJCWlmIChwcm9wZXJ0aWVzQ3JpdGVyaWFUb0RlbGV0ZSAhPSBudWxsKSB7CisJCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBwcm9wZXJ0aWVzQ3JpdGVyaWFUb0RlbGV0ZQorCisJCQkJKSB7CisKKwkJCQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGdyYXBoLnF1ZXJ5KCkuaGFzKGtleSwgdmFsdWUpLnZlcnRpY2VzKCkuaXRlcmF0b3IoKTsKKwkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJVmVydGV4IHZlcnRleCA9IChWZXJ0ZXgpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCXZlcnRleC5yZW1vdmUoKTsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZlIHZlcnRleCBvZiB0eXBlICIgKyBrZXkgKyAiIGFuZCB2YWx1ZSAiICsgdmFsdWUpOworCQkJCQl9CisKKwkJCQl9CisJCQl9CisJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShncmFwaEpzb25GaWxlKTsKKwkJCWlmIChmYWxzZSA9PSBmaWxlLmlzRmlsZSgpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlICIgKyBncmFwaEpzb25GaWxlICsgIiBjYW5ub3QgYmUgZm91bmQuIik7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGdyYXBoSnNvbkZpbGUpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQmVmb3JlIGltcG9ydGluZyBmaWxlICIgKyBncmFwaEpzb25GaWxlKTsKKworCQkJLy8gR3JhcGhTT05SZWFkZXIuaW5wdXRHcmFwaChncmFwaCwgZ3JhcGhKc29uRmlsZSk7CisJCQlHcmFwaFNPTlJlYWRlciBjcmVhdGUgPSBHcmFwaFNPTlJlYWRlci5idWlsZCgpLmNyZWF0ZSgpOworCQkJY3JlYXRlLnJlYWRHcmFwaChpcywgZ3JhcGgpOworCisJCQkvLyBncmFwaC5jb21taXQoKTsKKwkJCWdyYXBoLnR4KCkuY29tbWl0KCk7CisKKwkJCXJlc3VsdCA9IHRydWU7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIGltcG9ydCBncmFwaCAiICsgZS5nZXRNZXNzYWdlKCkpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCS8vIGdyYXBoLnJvbGxiYWNrKCk7CisJCQlncmFwaC50eCgpLnJvbGxiYWNrKCk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChpcyAhPSBudWxsKSB7CisJCQkJCWlzLmNsb3NlKCk7CisJCQkJfQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHVibGljIFN0cmluZyBmaW5kRXJyb3JJbkpzb25HcmFwaChUaXRhbkdyYXBoIGdyYXBoLCBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CisKKwkJYm9vbGVhbiBydW5WZXJ0ZXhTY2FuID0gZmFsc2U7CisJCWJvb2xlYW4gcnVuRWRnZVNjYW4gPSBmYWxzZTsKKworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworCQkvLyBHcmFwaE1MV3JpdGVyIGdyYXBoTUxXcml0ZXIgPSBuZXcgR3JhcGhNTFdyaXRlcihncmFwaCk7CisKKwkJU3RyaW5nIG91dHB1dEZpbGUgPSBvdXRwdXREaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArICJleHBvcnRHcmFwaC4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmpzb24iOworCisJCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworCQl0cnkgeworCQkJb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpKTsKKworCQkJaWYgKHJ1bkVkZ2VTY2FuKSB7CisKKwkJCQlWZXJ0ZXggdmVydGV4RnJvbSA9IG51bGw7CisJCQkJVmVydGV4IHZlcnRleFRvID0gbnVsbDsKKwkJCQlFZGdlIGVkZ2UgPSBudWxsOworCisJCQkJLy8gSXRlcmFibGU8RWRnZT4gZWRnZXMgPSBncmFwaC5nZXRFZGdlcygpOworCQkJCS8vIEl0ZXJhYmxlPEVkZ2U+IGVkZ2VzID0gZ3JhcGgucXVlcnkoKS5lZGdlcygpOworCQkJCUl0ZXJhYmxlPFRpdGFuRWRnZT4gZWRnZXMgPSBncmFwaC5xdWVyeSgpLmVkZ2VzKCk7CisJCQkJLy8gSXRlcmF0b3I8RWRnZT4gaXRlcmF0b3IgPSBlZGdlcy5pdGVyYXRvcigpOworCQkJCUl0ZXJhdG9yPFRpdGFuRWRnZT4gaXRlcmF0b3IgPSBlZGdlcy5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKworCQkJCQl0cnkgeworCisJCQkJCQllZGdlID0gaXRlcmF0b3IubmV4dCgpOworCisJCQkJCQkvLyB2ZXJ0ZXhGcm9tID0gZWRnZS5nZXRWZXJ0ZXgoRGlyZWN0aW9uLk9VVCk7CisJCQkJCQkvLyB2ZXJ0ZXhUbyA9IGVkZ2UuZ2V0VmVydGV4KERpcmVjdGlvbi5JTik7CisJCQkJCQl2ZXJ0ZXhGcm9tID0gZWRnZS5vdXRWZXJ0ZXgoKTsKKwkJCQkJCXZlcnRleFRvID0gZWRnZS5pblZlcnRleCgpOworCisJCQkJCQlCYXNlQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7CisJCQkJCQljb25mLnNldFByb3BlcnR5KCJzdG9yYWdlLmJhY2tlbmQiLCAiaW5tZW1vcnkiKTsKKwkJCQkJCVRpdGFuR3JhcGggb3BlbkdyYXBoID0gVXRpbHMub3BlbkdyYXBoKGNvbmYpOworCisJCQkJCQlUaXRhblZlcnRleCBhZGRWZXJ0ZXhGcm9tID0gb3BlbkdyYXBoLmFkZFZlcnRleCgpOworCQkJCQkJLy8gRWxlbWVudEhlbHBlci5zZXRQcm9wZXJ0aWVzKGFkZFZlcnRleEZyb20sCisJCQkJCQkvLyBFbGVtZW50SGVscGVyLmdldFByb3BlcnRpZXModmVydGV4RnJvbSkpOworCQkJCQkJVXRpbHMuc2V0UHJvcGVydGllcyhhZGRWZXJ0ZXhGcm9tLCBVdGlscy5nZXRQcm9wZXJ0aWVzKHZlcnRleEZyb20pKTsKKworCQkJCQkJVGl0YW5WZXJ0ZXggYWRkVmVydGV4VG8gPSBvcGVuR3JhcGguYWRkVmVydGV4KCk7CisJCQkJCQkvLyBFbGVtZW50SGVscGVyLnNldFByb3BlcnRpZXMoYWRkVmVydGV4VG8sCisJCQkJCQkvLyBFbGVtZW50SGVscGVyLmdldFByb3BlcnRpZXModmVydGV4VG8pKTsKKwkJCQkJCVV0aWxzLnNldFByb3BlcnRpZXMoYWRkVmVydGV4VG8sIFV0aWxzLmdldFByb3BlcnRpZXModmVydGV4VG8pKTsKKworCQkJCQkJLy8gRWRnZSBhZGRFZGdlID0gb3BlbkdyYXBoLmFkZEVkZ2UobnVsbCwgYWRkVmVydGV4RnJvbSwKKwkJCQkJCS8vIGFkZFZlcnRleFRvLCBlZGdlLmdldExhYmVsKCkpOworCisJCQkJCQkvLyBFZGdlIGVkZ2UgPSB0R3JhcGguYWRkRWRnZShudWxsLAorCQkJCQkJLy8gZnJvbVYubGVmdCgpLnZhbHVlKCksIHRvVi5sZWZ0KCkudmFsdWUoKSwgdHlwZSk7CisKKwkJCQkJCUVkZ2UgYWRkRWRnZSA9IGFkZFZlcnRleEZyb20uYWRkRWRnZShlZGdlLmxhYmVsKCksIGFkZFZlcnRleFRvKTsKKwkJCQkJCS8vIEVsZW1lbnRIZWxwZXIuc2V0UHJvcGVydGllcyhhZGRFZGdlLAorCQkJCQkJLy8gRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKGVkZ2UpKTsKKwkJCQkJCVV0aWxzLnNldFByb3BlcnRpZXMoYWRkRWRnZSwgVXRpbHMuZ2V0UHJvcGVydGllcyhlZGdlKSk7CisKKwkJCQkJCS8vIGxvZy5pbmZvKCJmcm9tVmVydGV4PSIgKworCQkJCQkJLy8gRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcnRleEZyb20pKTsKKwkJCQkJCWxvZy5pbmZvKCJmcm9tVmVydGV4PSIgKyBVdGlscy5nZXRQcm9wZXJ0aWVzKHZlcnRleEZyb20pKTsKKwkJCQkJCS8vIGxvZy5pbmZvKCJ0b1ZlcnRleD0iICsKKwkJCQkJCS8vIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXJ0ZXhUbykpOworCQkJCQkJbG9nLmluZm8oInRvVmVydGV4PSIgKyBVdGlscy5nZXRQcm9wZXJ0aWVzKHZlcnRleFRvKSk7CisJCQkJCQkvLyBsb2cuaW5mbygiZWRnZT0iICsgZWRnZS5nZXRMYWJlbCgpICsgIiAiICsKKwkJCQkJCS8vIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyhlZGdlKSk7CisJCQkJCQlsb2cuaW5mbygiZWRnZT0iICsgZWRnZS5sYWJlbCgpICsgIiAiICsgVXRpbHMuZ2V0UHJvcGVydGllcyhlZGdlKSk7CisKKwkJCQkJCS8vIEdyYXBoU09OV3JpdGVyLm91dHB1dEdyYXBoKG9wZW5HcmFwaCwgb3V0cHV0RmlsZSk7CisJCQkJCQlHcmFwaFNPTldyaXRlciBjcmVhdGUgPSBHcmFwaFNPTldyaXRlci5idWlsZCgpLmNyZWF0ZSgpOworCQkJCQkJY3JlYXRlLndyaXRlR3JhcGgob3V0LCBvcGVuR3JhcGgpOworCisJCQkJCQkvLyBvcGVuR3JhcGgucm9sbGJhY2soKTsKKwkJCQkJCW9wZW5HcmFwaC50eCgpLnJvbGxiYWNrKCk7CisKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisKKwkJCQkJCS8vIGxvZy5lcnJvcigiZnJvbVZlcnRleD0iICsKKwkJCQkJCS8vIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXJ0ZXhGcm9tKSk7CisJCQkJCQlsb2cuZXJyb3IoImZyb21WZXJ0ZXg9IiArIFV0aWxzLmdldFByb3BlcnRpZXModmVydGV4RnJvbSkpOworCQkJCQkJLy8gbG9nLmVycm9yKCJ0b1ZlcnRleD0iICsKKwkJCQkJCS8vIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXJ0ZXhUbykpOworCQkJCQkJbG9nLmVycm9yKCJ0b1ZlcnRleD0iICsgVXRpbHMuZ2V0UHJvcGVydGllcyh2ZXJ0ZXhUbykpOworCQkJCQkJLy8gbG9nLmVycm9yKCJlZGdlPSIgKyBlZGdlLmdldExhYmVsKCkgKyAiICIgKworCQkJCQkJLy8gRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKGVkZ2UpKTsKKwkJCQkJCWxvZy5lcnJvcigiZWRnZT0iICsgZWRnZS5sYWJlbCgpICsgIiAiICsgVXRpbHMuZ2V0UHJvcGVydGllcyhlZGdlKSk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBncmFwaC5yb2xsYmFjaygpOworCQkJCWdyYXBoLnR4KCkucm9sbGJhY2soKTsKKworCQkJfQorCisJCQlpZiAocnVuVmVydGV4U2NhbikgeworCisJCQkJVmVydGV4IHZlcnRleCA9IG51bGw7CisJCQkJLy8gSXRlcmFibGU8VmVydGV4PiB2ZXJ0aWNlcyA9IGdyYXBoLmdldFZlcnRpY2VzKCk7CisKKwkJCQkvLyBJdGVyYXRvcjxWZXJ0ZXg+IGl0ZXJhdG9yVmVydGV4ID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCQlJdGVyYXRvcjxWZXJ0ZXg+IGl0ZXJhdG9yVmVydGV4ID0gZ3JhcGgudmVydGljZXMoKTsKKwkJCQl3aGlsZSAoaXRlcmF0b3JWZXJ0ZXguaGFzTmV4dCgpKSB7CisKKwkJCQkJdHJ5IHsKKworCQkJCQkJdmVydGV4ID0gaXRlcmF0b3JWZXJ0ZXgubmV4dCgpOworCisJCQkJCQkvLyBJdGVyYWJsZTxFZGdlPiBlZGdlczIgPQorCQkJCQkJLy8gdmVydGV4LmdldEVkZ2VzKERpcmVjdGlvbi5CT1RIKTsKKworCQkJCQkJLy8gSXRlcmF0b3I8RWRnZT4gaXRlcmF0b3IyID0gZWRnZXMyLml0ZXJhdG9yKCk7CisJCQkJCQlJdGVyYXRvcjxFZGdlPiBpdGVyYXRvcjIgPSB2ZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLkJPVEgpOworCQkJCQkJaWYgKGZhbHNlID09IGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKKworCQkJCQkJCUJhc2VDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQmFzZUNvbmZpZ3VyYXRpb24oKTsKKwkJCQkJCQljb25mLnNldFByb3BlcnR5KCJzdG9yYWdlLmJhY2tlbmQiLCAiaW5tZW1vcnkiKTsKKwkJCQkJCQlUaXRhbkdyYXBoIG9wZW5HcmFwaCA9IFV0aWxzLm9wZW5HcmFwaChjb25mKTsKKworCQkJCQkJCVRpdGFuVmVydGV4IGFkZFZlcnRleEZyb20gPSBvcGVuR3JhcGguYWRkVmVydGV4KCk7CisJCQkJCQkJLy8gRWxlbWVudEhlbHBlci5zZXRQcm9wZXJ0aWVzKGFkZFZlcnRleEZyb20sCisJCQkJCQkJLy8gRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcnRleCkpOworCQkJCQkJCVV0aWxzLnNldFByb3BlcnRpZXMoYWRkVmVydGV4RnJvbSwgVXRpbHMuZ2V0UHJvcGVydGllcyh2ZXJ0ZXgpKTsKKworCQkJCQkJCS8vIGxvZy5pbmZvKCJmcm9tVmVydGV4PSIgKworCQkJCQkJCS8vIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyhhZGRWZXJ0ZXhGcm9tKSk7CisJCQkJCQkJbG9nLmluZm8oImZyb21WZXJ0ZXg9IiArIFV0aWxzLmdldFByb3BlcnRpZXMoYWRkVmVydGV4RnJvbSkpOworCisJCQkJCQkJLy8gR3JhcGhTT05Xcml0ZXIub3V0cHV0R3JhcGgob3BlbkdyYXBoLAorCQkJCQkJCS8vIG91dHB1dEZpbGUpOworCQkJCQkJCUdyYXBoU09OV3JpdGVyIGNyZWF0ZSA9IEdyYXBoU09OV3JpdGVyLmJ1aWxkKCkuY3JlYXRlKCk7CisJCQkJCQkJY3JlYXRlLndyaXRlR3JhcGgob3V0LCBvcGVuR3JhcGgpOworCisJCQkJCQkJLy8gb3BlbkdyYXBoLnJvbGxiYWNrKCk7CisJCQkJCQkJb3BlbkdyYXBoLnR4KCkucm9sbGJhY2soKTsKKworCQkJCQkJfQorCisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCisJCQkJCQkvLyBsb2cuZXJyb3IoInZlcnRleD0iICsKKwkJCQkJCS8vIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXJ0ZXgpKTsKKworCQkJCQkJR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeVtdIHZhbHVlcyA9IEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkudmFsdWVzKCk7CisKKwkJCQkJCS8vIE9iamVjdCBwcm9wZXJ0eTEgPQorCQkJCQkJLy8gdmVydGV4LmdldFByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSEVBTFRIX0NIRUNLLmdldFByb3BlcnR5KCkpOworCQkJCQkJT2JqZWN0IHByb3BlcnR5MSA9IHZlcnRleC52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkhFQUxUSF9DSEVDSy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wZXJ0eTEpOworCisJCQkJCQkvLyBPYmplY3QgcHJvcGVydHkyID0gdmVydGV4LmdldFByb3BlcnR5KCJoZWFsdGhjaGVjayIpOworCQkJCQkJT2JqZWN0IHByb3BlcnR5MiA9IHZlcnRleC52YWx1ZSgiaGVhbHRoY2hlY2siKTsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wZXJ0eTIpOworCisJCQkJCQkvLyBmb3IgKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkgdmFsdWUgOiB2YWx1ZXMpIHsKKwkJCQkJCS8vCisJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocHJvcGVydHkpOworCQkJCQkJLy8gfQorCisJCQkJCQlicmVhazsKKworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gZ3JhcGgucm9sbGJhY2soKTsKKwkJCQlncmFwaC50eCgpLnJvbGxiYWNrKCk7CisKKwkJCX0KKworCQkJLy8gSXRlcmFibGU8VmVydGV4PiB2ZXJ0aWNlczIgPQorCQkJLy8gZ3JhcGguZ2V0VmVydGljZXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5IRUFMVEhfQ0hFQ0suZ2V0UHJvcGVydHkoKSwKKwkJCS8vICJHT09EIik7CisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMyID0gZ3JhcGgucXVlcnkoKQorCQkJCQkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSEVBTFRIX0NIRUNLLmdldFByb3BlcnR5KCksICJHT09EIikudmVydGljZXMoKTsKKwkJCTsKKwkJCVZlcnRleCBuZXh0ID0gdmVydGljZXMyLml0ZXJhdG9yKCkubmV4dCgpOworCisJCQlCYXNlQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7CisJCQljb25mLnNldFByb3BlcnR5KCJzdG9yYWdlLmJhY2tlbmQiLCAiaW5tZW1vcnkiKTsKKwkJCVRpdGFuR3JhcGggb3BlbkdyYXBoID0gVXRpbHMub3BlbkdyYXBoKGNvbmYpOworCisJCQkvLyBUaXRhblZlcnRleCBhZGRWZXJ0ZXhGcm9tID0gb3BlbkdyYXBoLmFkZFZlcnRleCgpOworCQkJLy8KKwkJCS8vIGFkZFZlcnRleEZyb20uc2V0UHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5IRUFMVEhfQ0hFQ0suZ2V0UHJvcGVydHkoKSwKKwkJCS8vICJHT09EIik7CisJCQkvLyBhZGRWZXJ0ZXhGcm9tLnNldFByb3BlcnR5KCJoZWFsdGhjaGVjayIsCisJCQkvLyBuZXh0LmdldFByb3BlcnR5KCJoZWFsdGhjaGVjayIpKTsKKwkJCS8vCisJCQkvLyAvL25leHQucmVtb3ZlKCk7CisJCQkvLworCQkJLy8gbmV4dC5yZW1vdmVQcm9wZXJ0eSgiaGVhbHRoY2hlY2siKTsKKwkJCS8vIG5leHQucmVtb3ZlUHJvcGVydHkoImhlYWx0aGNoZWNraXMiKTsKKwkJCS8vCisJCQkvLyBuZXh0LnJlbW92ZSgpOworCisJCQkvLyBHcmFwaFNPTldyaXRlci5vdXRwdXRHcmFwaChvcGVuR3JhcGgsIG91dHB1dEZpbGUpOworCisJCQlmb3IgKE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0gOiBOb2RlVHlwZUVudW0udmFsdWVzKCkpIHsKKwkJCQlyZW1vdmVOb2Rlc0J5TGFiZWwoZ3JhcGgsIG5vZGVUeXBlRW51bS5nZXROYW1lKCkpOworCQkJfQorCisJCQkvLyBHcmFwaFNPTldyaXRlci5vdXRwdXRHcmFwaChncmFwaCwgb3V0cHV0RmlsZSk7CisKKwkJCUdyYXBoU09OV3JpdGVyIGNyZWF0ZSA9IEdyYXBoU09OV3JpdGVyLmJ1aWxkKCkuY3JlYXRlKCk7CisJCQljcmVhdGUud3JpdGVHcmFwaChvdXQsIGdyYXBoKTsKKworCQkJLy8gZ3JhcGgucm9sbGJhY2soKTsKKwkJCWdyYXBoLnR4KCkucm9sbGJhY2soKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCS8vIGdyYXBoLnJvbGxiYWNrKCk7CisJCQlncmFwaC50eCgpLnJvbGxiYWNrKCk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChvdXQgIT0gbnVsbCkgeworCQkJCQlvdXQuY2xvc2UoKTsKKwkJCQl9CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGVzQnlMYWJlbChUaXRhbkdyYXBoIGdyYXBoLCBTdHJpbmcgbGFiZWwpIHsKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBsYWJlbCkKKwkJCQkudmVydGljZXMoKTsKKwkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVmVydGV4IG5leHQyID0gaXRlcmF0b3IubmV4dCgpOworCQkJbmV4dDIucmVtb3ZlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJHcmFwaChUaXRhbkdyYXBoIGdyYXBoKSB7CisKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS52ZXJ0aWNlcygpOworCisJCWxvbmcgZXJhc2VkID0gMDsKKworCQlpZiAodmVydGljZXMgIT0gbnVsbCkgeworCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlWZXJ0ZXggdmVydGV4ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCS8vIGdyYXBoLnJlbW92ZVZlcnRleCh2ZXJ0ZXgpOworCQkJCXZlcnRleC5yZW1vdmUoKTsKKwkJCQllcmFzZWQrKzsKKwkJCX0KKworCQl9CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJBZnRlciBlcmFzaW5nICIgKyBlcmFzZWQgKyAiIHZlcnRpY2VzLiIpOworCQkvLyBncmFwaC5jb21taXQoKTsKKwkJZ3JhcGgudHgoKS5jb21taXQoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGV4cG9ydFVzZXJzKFRpdGFuR3JhcGggZ3JhcGgsIFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHVzZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVN0cmluZyByZXN1bHQgPSBudWxsOworCisJCS8vIEdyYXBoTUxXcml0ZXIgZ3JhcGhNTFdyaXRlciA9IG5ldyBHcmFwaE1MV3JpdGVyKGdyYXBoKTsKKworCQlTdHJpbmcgb3V0cHV0RmlsZSA9IG91dHB1dERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgInVzZXJzLiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuanNvbiI7CisKKwkJRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJVGl0YW5HcmFwaFF1ZXJ5IGdyYXBoUXVlcnkgPSBncmFwaC5xdWVyeSgpLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksCisJCQkJCU5vZGVUeXBlRW51bS5Vc2VyLmdldE5hbWUoKSk7CisKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gZ3JhcGhRdWVyeS52ZXJ0aWNlcygpOworCisJCQlpZiAodmVydGljZXMgIT0gbnVsbCkgeworCQkJCWZvciAoVmVydGV4IHYgOiB2ZXJ0aWNlcykgeworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKHYpOworCQkJCQlwcm9wZXJ0aWVzLnJlbW92ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCkpOworCQkJCQl1c2Vycy5hZGQocHJvcGVydGllcyk7CisJCQkJfQorCQkJfQorCisJCQlncmFwaC50eCgpLmNvbW1pdCgpOworCisJCQlTdHJpbmcganNvblVzZXJzID0gZ3Nvbi50b0pzb24odXNlcnMpOworCisJCQlmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0cHV0RmlsZSk7CisJCQlmaWxlV3JpdGVyLndyaXRlKGpzb25Vc2Vycyk7CisKKwkJCXJlc3VsdCA9IG91dHB1dEZpbGU7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlncmFwaC50eCgpLnJvbGxiYWNrKCk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChmaWxlV3JpdGVyICE9IG51bGwpIHsKKwkJCQkJZmlsZVdyaXRlci5jbG9zZSgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKEVsZW1lbnQgZWxlbWVudCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCTsKKworCQlpZiAoZWxlbWVudC5rZXlzKCkgIT0gbnVsbCAmJiBlbGVtZW50LmtleXMoKS5zaXplKCkgPiAwKSB7CisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eT4gcHJvcGVydHlNYXAgPSBFbGVtZW50SGVscGVyLnByb3BlcnR5TWFwKGVsZW1lbnQsCisJCQkJCWVsZW1lbnQua2V5cygpLnRvQXJyYXkobmV3IFN0cmluZ1tlbGVtZW50LmtleXMoKS5zaXplKCldKSk7CisKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eT4gZW50cnkgOiBwcm9wZXJ0eU1hcC5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCU9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCkudmFsdWUoKTsKKworCQkJCXJlc3VsdC5wdXQoa2V5LCB2YWx1ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBleHBvcnRVc2VycyhTdHJpbmdbXSBhcmdzKSB7CisKKwkJVGl0YW5HcmFwaCBncmFwaCA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgdGl0YW5GaWxlTG9jYXRpb24gPSBhcmdzWzFdOworCQkJU3RyaW5nIG91dHB1dERpcmVjdG9yeSA9IGFyZ3NbMl07CisJCQlncmFwaCA9IG9wZW5HcmFwaCh0aXRhbkZpbGVMb2NhdGlvbik7CisKKwkJCVN0cmluZyByZXN1bHQgPSBleHBvcnRVc2VycyhncmFwaCwgb3V0cHV0RGlyZWN0b3J5KTsKKworCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4cG9ydGVkIGZpbGU9IiArIHJlc3VsdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGdyYXBoICE9IG51bGwpIHsKKwkJCQkvLyBncmFwaC5zaHV0ZG93bigpOworCQkJCWdyYXBoLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvR3JhcGhNTERhdGFBbmFseXplci5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL0dyYXBoTUxEYXRhQW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE2M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL0dyYXBoTUxEYXRhQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDM2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUucG9pLmhzc2YudXNlcm1vZGVsLkhTU0ZXb3JrYm9vazsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuUm93OworaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5TaGVldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuV29ya2Jvb2s7CitpbXBvcnQgb3JnLmpkb20yLkRvY3VtZW50OworaW1wb3J0IG9yZy5qZG9tMi5FbGVtZW50OworaW1wb3J0IG9yZy5qZG9tMi5maWx0ZXIuRWxlbWVudEZpbHRlcjsKK2ltcG9ydCBvcmcuamRvbTIuaW5wdXQuU0FYQnVpbGRlcjsKK2ltcG9ydCBvcmcuamRvbTIudXRpbC5JdGVyYXRvckl0ZXJhYmxlOworCitwdWJsaWMgY2xhc3MgR3JhcGhNTERhdGFBbmFseXplciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01QT05FTlRfU0hFRVRfSEVBREVSID0geyAidW5pcXVlSWQiLCAidHlwZSIsICJuYW1lIiwgInRvc2NhUmVzb3VyY2VOYW1lIiwKKwkJCSJyZXNvdXJjZVR5cGUiLCAidmVyc2lvbiIsICJkZWxldGVkIiwgImhhc05vbkNhbGN1bGF0ZWRSZXFDYXAiIH07CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09NUE9ORU5UX0lOU1RBTkNFU19TSEVFVF9IRUFERVIgPSB7ICJ1bmlxdWVJZCIsICJuYW1lIiwgIm9yaWdpblVpZCIsICJvcmlnaW5UeXBlIiwKKwkJCSJjb250YWluZXJVaWQiIH07CisKKwlwdWJsaWMgU3RyaW5nIGFuYWx5emVHcmFwaE1MRGF0YShTdHJpbmdbXSBhcmdzKSB7CisJCVN0cmluZyByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIG1sRmlsZUxvY2F0aW9uID0gYXJnc1swXTsKKwkJCXJlc3VsdCA9IF9hbmFseXplR3JhcGhNTERhdGEobWxGaWxlTG9jYXRpb24pOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJBbmFseXplZCBNTCBmaWxlPSIgKyBtbEZpbGVMb2NhdGlvbiArICIsIFhMUyByZXN1bHQ9IiArIHJlc3VsdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBfYW5hbHl6ZUdyYXBoTUxEYXRhKFN0cmluZyBtbEZpbGVMb2NhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gUGFyc2UgTUwgZmlsZQorCQlTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOworCQlGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZShtbEZpbGVMb2NhdGlvbik7CisJCURvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KSBidWlsZGVyLmJ1aWxkKHhtbEZpbGUpOworCisJCS8vIFhMUyBkYXRhIGZpbGUgbmFtZQorCQlTdHJpbmcgb3V0cHV0RmlsZSA9IG1sRmlsZUxvY2F0aW9uLnJlcGxhY2UoIi5ncmFwaG1sIiwgIi54bHMiKTsKKwkJV29ya2Jvb2sgd2IgPSBuZXcgSFNTRldvcmtib29rKCk7CisJCUZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOworCQl3cml0ZUNvbXBvbmVudHMod2IsIGRvY3VtZW50KTsKKwkJd3JpdGVDb21wb25lbnRJbnN0YW5jZXMod2IsIGRvY3VtZW50KTsKKwkJd2Iud3JpdGUoZmlsZU91dCk7CisJCWZpbGVPdXQuY2xvc2UoKTsKKwkJcmV0dXJuIG91dHB1dEZpbGU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlQ29tcG9uZW50cyhXb3JrYm9vayB3YiwgRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwkJU2hlZXQgY29tcG9uZW50c1NoZWV0ID0gd2IuY3JlYXRlU2hlZXQoIkNvbXBvbmVudHMiKTsKKwkJUm93IGN1cnJlbnRSb3cgPSBjb21wb25lbnRzU2hlZXQuY3JlYXRlUm93KDApOworCQlmb3IgKGludCBpID0gMDsgaSA8IENPTVBPTkVOVF9TSEVFVF9IRUFERVIubGVuZ3RoOyBpKyspIHsKKwkJCWN1cnJlbnRSb3cuY3JlYXRlQ2VsbChpKS5zZXRDZWxsVmFsdWUoQ09NUE9ORU5UX1NIRUVUX0hFQURFUltpXSk7CisJCX0KKworCQlMaXN0PENvbXBvbmVudFJvdz4gY29tcG9uZW50cyA9IGdldENvbXBvbmVudHMoZG9jdW1lbnQpOworCQlpbnQgcm93TnVtID0gMTsKKwkJZm9yIChDb21wb25lbnRSb3cgcm93IDogY29tcG9uZW50cykgeworCQkJY3VycmVudFJvdyA9IGNvbXBvbmVudHNTaGVldC5jcmVhdGVSb3cocm93TnVtKyspOworCQkJY3VycmVudFJvdy5jcmVhdGVDZWxsKDApLnNldENlbGxWYWx1ZShyb3cuZ2V0VW5pcXVlSWQoKSk7CisJCQljdXJyZW50Um93LmNyZWF0ZUNlbGwoMSkuc2V0Q2VsbFZhbHVlKHJvdy5nZXRUeXBlKCkpOworCQkJY3VycmVudFJvdy5jcmVhdGVDZWxsKDIpLnNldENlbGxWYWx1ZShyb3cuZ2V0TmFtZSgpKTsKKwkJCWN1cnJlbnRSb3cuY3JlYXRlQ2VsbCgzKS5zZXRDZWxsVmFsdWUocm93LmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQkJY3VycmVudFJvdy5jcmVhdGVDZWxsKDQpLnNldENlbGxWYWx1ZShyb3cuZ2V0UmVzb3VyY2VUeXBlKCkpOworCQkJY3VycmVudFJvdy5jcmVhdGVDZWxsKDUpLnNldENlbGxWYWx1ZShyb3cuZ2V0VmVyc2lvbigpKTsKKwkJCWN1cnJlbnRSb3cuY3JlYXRlQ2VsbCg2KS5zZXRDZWxsVmFsdWUocm93LmdldElzRGVsZXRlZCgpICE9IG51bGwgPyByb3cuZ2V0SXNEZWxldGVkKCkudG9TdHJpbmcoKSA6ICJmYWxzZSIpOworCQkJY3VycmVudFJvdy5jcmVhdGVDZWxsKDcpLnNldENlbGxWYWx1ZShyb3cuZ2V0SGFzTm9uQ2FsY3VsYXRlZFJlcUNhcCgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUNvbXBvbmVudEluc3RhbmNlcyhXb3JrYm9vayB3YiwgRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwkJU2hlZXQgY29tcG9uZW50c1NoZWV0ID0gd2IuY3JlYXRlU2hlZXQoIkNvbXBvbmVudEluc3RhbmNlcyIpOworCQlSb3cgY3VycmVudFJvdyA9IGNvbXBvbmVudHNTaGVldC5jcmVhdGVSb3coMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgQ09NUE9ORU5UX0lOU1RBTkNFU19TSEVFVF9IRUFERVIubGVuZ3RoOyBpKyspIHsKKwkJCWN1cnJlbnRSb3cuY3JlYXRlQ2VsbChpKS5zZXRDZWxsVmFsdWUoQ09NUE9ORU5UX0lOU1RBTkNFU19TSEVFVF9IRUFERVJbaV0pOworCQl9CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VSb3c+IGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRJbnN0YW5jZXMoZG9jdW1lbnQpOworCQlpbnQgcm93TnVtID0gMTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZVJvdyByb3cgOiBjb21wb25lbnRzKSB7CisJCQljdXJyZW50Um93ID0gY29tcG9uZW50c1NoZWV0LmNyZWF0ZVJvdyhyb3dOdW0rKyk7CisJCQljdXJyZW50Um93LmNyZWF0ZUNlbGwoMCkuc2V0Q2VsbFZhbHVlKHJvdy5nZXRVbmlxdWVJZCgpKTsKKwkJCWN1cnJlbnRSb3cuY3JlYXRlQ2VsbCgxKS5zZXRDZWxsVmFsdWUocm93LmdldE5hbWUoKSk7CisJCQljdXJyZW50Um93LmNyZWF0ZUNlbGwoMikuc2V0Q2VsbFZhbHVlKHJvdy5nZXRPcmlnaW5VaWQoKSk7CisJCQljdXJyZW50Um93LmNyZWF0ZUNlbGwoMykuc2V0Q2VsbFZhbHVlKHJvdy5nZXRPcmlnaW5UeXBlKCkpOworCQkJY3VycmVudFJvdy5jcmVhdGVDZWxsKDQpLnNldENlbGxWYWx1ZShyb3cuZ2V0Q29udGFpbmVyVWlkKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudFJvdz4gZ2V0Q29tcG9uZW50cyhEb2N1bWVudCBkb2N1bWVudCkgeworCQlMaXN0PENvbXBvbmVudFJvdz4gcmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldFJvb3RFbGVtZW50KCk7CisJCUVsZW1lbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEVsZW1lbnRGaWx0ZXIoImdyYXBoIik7CisJCUVsZW1lbnQgZ3JhcGggPSByb290LmdldERlc2NlbmRhbnRzKGZpbHRlcikubmV4dCgpOworCQlmaWx0ZXIgPSBuZXcgRWxlbWVudEZpbHRlcigiZWRnZSIpOworCQlJdGVyYXRvckl0ZXJhYmxlPEVsZW1lbnQ+IGVkZ2VzID0gZ3JhcGguZ2V0RGVzY2VuZGFudHMoZmlsdGVyKTsKKwkJU2V0PFN0cmluZz4gY29tcG9uZW50c0hhdmluZ1JlcU9yQ2FwID0gbmV3IEhhc2hTZXQ8PigpOworCQlmaWx0ZXIgPSBuZXcgRWxlbWVudEZpbHRlcigiZGF0YSIpOworCQlmb3IgKEVsZW1lbnQgZWRnZSA6IGVkZ2VzKSB7CisJCQlJdGVyYXRvckl0ZXJhYmxlPEVsZW1lbnQ+IGRhdGFOb2RlcyA9IGVkZ2UuZ2V0RGVzY2VuZGFudHMoZmlsdGVyKTsKKwkJCWZvciAoRWxlbWVudCBkYXRhIDogZGF0YU5vZGVzKSB7CisJCQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gZGF0YS5nZXRBdHRyaWJ1dGVWYWx1ZSgia2V5Iik7CisJCQkJc3dpdGNoIChhdHRyaWJ1dGVWYWx1ZSkgeworCQkJCWNhc2UgImxhYmVsRSI6CisJCQkJCVN0cmluZyBlZGdlTGFiZWwgPSBkYXRhLmdldFRleHQoKTsKKwkJCQkJaWYgKGVkZ2VMYWJlbC5lcXVhbHMoIlJFUVVJUkVNRU5UIikgfHwgZWRnZUxhYmVsLmVxdWFscygiQ0FQQUJJTElUWSIpKSB7CisJCQkJCQljb21wb25lbnRzSGF2aW5nUmVxT3JDYXAuYWRkKGVkZ2UuZ2V0QXR0cmlidXRlVmFsdWUoInNvdXJjZSIpKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmaWx0ZXIgPSBuZXcgRWxlbWVudEZpbHRlcigibm9kZSIpOworCQlJdGVyYXRvckl0ZXJhYmxlPEVsZW1lbnQ+IG5vZGVzID0gZ3JhcGguZ2V0RGVzY2VuZGFudHMoZmlsdGVyKTsKKwkJZmlsdGVyID0gbmV3IEVsZW1lbnRGaWx0ZXIoImRhdGEiKTsKKwkJZm9yIChFbGVtZW50IGVsZW1lbnQgOiBub2RlcykgeworCQkJSXRlcmF0b3JJdGVyYWJsZTxFbGVtZW50PiBkYXRhTm9kZXMgPSBlbGVtZW50LmdldERlc2NlbmRhbnRzKGZpbHRlcik7CisJCQlDb21wb25lbnRSb3cgY29tcG9uZW50Um93ID0gbmV3IENvbXBvbmVudFJvdygpOworCQkJYm9vbGVhbiBpc0NvbXBvbmVudCA9IGZhbHNlOworCQkJZm9yIChFbGVtZW50IGRhdGEgOiBkYXRhTm9kZXMpIHsKKwkJCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBkYXRhLmdldEF0dHJpYnV0ZVZhbHVlKCJrZXkiKTsKKwkJCQlzd2l0Y2ggKGF0dHJpYnV0ZVZhbHVlKSB7CisJCQkJY2FzZSAibm9kZUxhYmVsIjoKKwkJCQkJU3RyaW5nIG5vZGVMYWJlbCA9IGRhdGEuZ2V0VGV4dCgpOworCQkJCQlpZiAobm9kZUxhYmVsLmVxdWFscygicmVzb3VyY2UiKSB8fCBub2RlTGFiZWwuZXF1YWxzKCJzZXJ2aWNlIikpIHsKKwkJCQkJCWlzQ29tcG9uZW50ID0gdHJ1ZTsKKwkJCQkJCWNvbXBvbmVudFJvdy5zZXRUeXBlKG5vZGVMYWJlbCk7CisJCQkJCQlTdHJpbmcgY29tcG9uZW50SWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKCJpZCIpOworCQkJCQkJY29tcG9uZW50Um93LnNldEhhc05vbkNhbGN1bGF0ZWRSZXFDYXAoY29tcG9uZW50c0hhdmluZ1JlcU9yQ2FwLmNvbnRhaW5zKGNvbXBvbmVudElkKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAidWlkIjoKKwkJCQkJY29tcG9uZW50Um93LnNldFVuaXF1ZUlkKGRhdGEuZ2V0VGV4dCgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAibmFtZSI6CisJCQkJCWNvbXBvbmVudFJvdy5zZXROYW1lKGRhdGEuZ2V0VGV4dCgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAidG9zY2FSZXNvdXJjZU5hbWUiOgorCQkJCQljb21wb25lbnRSb3cuc2V0VG9zY2FSZXNvdXJjZU5hbWUoZGF0YS5nZXRUZXh0KCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlICJyZXNvdXJjZVR5cGUiOgorCQkJCQljb21wb25lbnRSb3cuc2V0UmVzb3VyY2VUeXBlKGRhdGEuZ2V0VGV4dCgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAidmVyc2lvbiI6CisJCQkJCWNvbXBvbmVudFJvdy5zZXRWZXJzaW9uKGRhdGEuZ2V0VGV4dCgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAiZGVsZXRlZCI6CisJCQkJCWNvbXBvbmVudFJvdy5zZXRJc0RlbGV0ZWQoQm9vbGVhbi5wYXJzZUJvb2xlYW4oZGF0YS5nZXRUZXh0KCkpKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGlzQ29tcG9uZW50KSB7CisJCQkJcmVzLmFkZChjb21wb25lbnRSb3cpOworCQkJfQorCQl9CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluc3RhbmNlUm93PiBnZXRDb21wb25lbnRJbnN0YW5jZXMoRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVJvdz4gcmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldFJvb3RFbGVtZW50KCk7CisJCUVsZW1lbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEVsZW1lbnRGaWx0ZXIoImdyYXBoIik7CisJCUVsZW1lbnQgZ3JhcGggPSByb290LmdldERlc2NlbmRhbnRzKGZpbHRlcikubmV4dCgpOworCQlmaWx0ZXIgPSBuZXcgRWxlbWVudEZpbHRlcigibm9kZSIpOworCQlJdGVyYXRvckl0ZXJhYmxlPEVsZW1lbnQ+IG5vZGVzID0gZ3JhcGguZ2V0RGVzY2VuZGFudHMoZmlsdGVyKTsKKwkJZmlsdGVyID0gbmV3IEVsZW1lbnRGaWx0ZXIoImRhdGEiKTsKKwkJZm9yIChFbGVtZW50IGVsZW1lbnQgOiBub2RlcykgeworCQkJSXRlcmF0b3JJdGVyYWJsZTxFbGVtZW50PiBkYXRhTm9kZXMgPSBlbGVtZW50LmdldERlc2NlbmRhbnRzKGZpbHRlcik7CisJCQlDb21wb25lbnRJbnN0YW5jZVJvdyBjb21wb25lbnRJbnN0Um93ID0gbmV3IENvbXBvbmVudEluc3RhbmNlUm93KCk7CisJCQlib29sZWFuIGlzQ29tcG9uZW50SW5zdCA9IGZhbHNlOworCQkJZm9yIChFbGVtZW50IGRhdGEgOiBkYXRhTm9kZXMpIHsKKwkJCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBkYXRhLmdldEF0dHJpYnV0ZVZhbHVlKCJrZXkiKTsKKwkJCQlzd2l0Y2ggKGF0dHJpYnV0ZVZhbHVlKSB7CisJCQkJY2FzZSAibm9kZUxhYmVsIjoKKwkJCQkJU3RyaW5nIG5vZGVMYWJlbCA9IGRhdGEuZ2V0VGV4dCgpOworCQkJCQlpZiAobm9kZUxhYmVsLmVxdWFscygicmVzb3VyY2VJbnN0YW5jZSIpKSB7CisJCQkJCQlpc0NvbXBvbmVudEluc3QgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgInVpZCI6CisJCQkJCWNvbXBvbmVudEluc3RSb3cuc2V0VW5pcXVlSWQoZGF0YS5nZXRUZXh0KCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlICJuYW1lIjoKKwkJCQkJY29tcG9uZW50SW5zdFJvdy5zZXROYW1lKGRhdGEuZ2V0VGV4dCgpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAib3JpZ2luVHlwZSI6CisJCQkJCWNvbXBvbmVudEluc3RSb3cuc2V0T3JpZ2luVHlwZShkYXRhLmdldFRleHQoKSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChpc0NvbXBvbmVudEluc3QpIHsKKwkJCQkvLyBBc3N1bWluZyB0aGUgdWlkIGlzIGluIHN0YW5kYXJkIGZvcm0gb2YKKwkJCQkvLyA8Y29udGFpbmVyPi48b3JpZ2luPi48bmFtZT4KKwkJCQlTdHJpbmcgdW5pcXVlSWQgPSBjb21wb25lbnRJbnN0Um93LmdldFVuaXF1ZUlkKCk7CisJCQkJaWYgKHVuaXF1ZUlkICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nW10gc3BsaXQgPSB1bmlxdWVJZC5zcGxpdCgiXFwuIik7CisJCQkJCWlmIChzcGxpdC5sZW5ndGggPT0gMykgeworCQkJCQkJY29tcG9uZW50SW5zdFJvdy5zZXRDb250YWluZXJVaWQoc3BsaXRbMF0pOworCQkJCQkJY29tcG9uZW50SW5zdFJvdy5zZXRPcmlnaW5VaWQoc3BsaXRbMV0pOworCQkJCQl9CisJCQkJfQorCQkJCXJlcy5hZGQoY29tcG9uZW50SW5zdFJvdyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwcml2YXRlIGNsYXNzIENvbXBvbmVudFJvdyB7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisJCXByaXZhdGUgU3RyaW5nIHR5cGU7CisJCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCXByaXZhdGUgU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lOworCQlwcml2YXRlIFN0cmluZyByZXNvdXJjZVR5cGU7CisJCXByaXZhdGUgU3RyaW5nIHZlcnNpb247CisJCXByaXZhdGUgQm9vbGVhbiBpc0RlbGV0ZWQ7CisJCXByaXZhdGUgQm9vbGVhbiBoYXNOb25DYWxjdWxhdGVkUmVxQ2FwOworCisJCXB1YmxpYyBCb29sZWFuIGdldEhhc05vbkNhbGN1bGF0ZWRSZXFDYXAoKSB7CisJCQlyZXR1cm4gaGFzTm9uQ2FsY3VsYXRlZFJlcUNhcDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEhhc05vbkNhbGN1bGF0ZWRSZXFDYXAoQm9vbGVhbiBoYXNOb25DYWxjdWxhdGVkUmVxQ2FwKSB7CisJCQl0aGlzLmhhc05vbkNhbGN1bGF0ZWRSZXFDYXAgPSBoYXNOb25DYWxjdWxhdGVkUmVxQ2FwOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJCXJldHVybiB1bmlxdWVJZDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRUb3NjYVJlc291cmNlTmFtZSgpIHsKKwkJCXJldHVybiB0b3NjYVJlc291cmNlTmFtZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFRvc2NhUmVzb3VyY2VOYW1lKFN0cmluZyB0b3NjYVJlc291cmNlTmFtZSkgeworCQkJdGhpcy50b3NjYVJlc291cmNlTmFtZSA9IHRvc2NhUmVzb3VyY2VOYW1lOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VUeXBlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKwkJCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQkJcmV0dXJuIHZlcnNpb247CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCQl9CisKKwkJcHVibGljIEJvb2xlYW4gZ2V0SXNEZWxldGVkKCkgeworCQkJcmV0dXJuIGlzRGVsZXRlZDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldElzRGVsZXRlZChCb29sZWFuIGRlbGV0ZWQpIHsKKwkJCXRoaXMuaXNEZWxldGVkID0gZGVsZXRlZDsKKwkJfQorCX0KKworCXByaXZhdGUgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2VSb3cgeworCQlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBTdHJpbmcgb3JpZ2luVWlkOworCQlwcml2YXRlIFN0cmluZyBvcmlnaW5UeXBlOworCQlwcml2YXRlIFN0cmluZyBjb250YWluZXJVaWQ7CisKKwkJcHVibGljIFN0cmluZyBnZXRDb250YWluZXJVaWQoKSB7CisJCQlyZXR1cm4gY29udGFpbmVyVWlkOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0Q29udGFpbmVyVWlkKFN0cmluZyBjb250YWluZXJVaWQpIHsKKwkJCXRoaXMuY29udGFpbmVyVWlkID0gY29udGFpbmVyVWlkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJCXJldHVybiB1bmlxdWVJZDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRPcmlnaW5VaWQoKSB7CisJCQlyZXR1cm4gb3JpZ2luVWlkOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0T3JpZ2luVWlkKFN0cmluZyBjb21wb25lbnRVaWQpIHsKKwkJCXRoaXMub3JpZ2luVWlkID0gY29tcG9uZW50VWlkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRPcmlnaW5UeXBlKCkgeworCQkJcmV0dXJuIG9yaWdpblR5cGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRPcmlnaW5UeXBlKFN0cmluZyBvcmlnaW5UeXBlKSB7CisJCQl0aGlzLm9yaWdpblR5cGUgPSBvcmlnaW5UeXBlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL1BvcHVsYXRlQ29tcG9uZW50Q2FjaGUuamF2YSBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9Qb3B1bGF0ZUNvbXBvbmVudENhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyZDUzNAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9Qb3B1bGF0ZUNvbXBvbmVudENhY2hlLmphdmEKQEAgLTAsMCArMSwzODggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5DYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5Db21wb25lbnRDYXNzYW5kcmFEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLkNvbXBvbmVudENhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlByb2R1Y3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5TZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudENhY2hlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5TZXJpYWxpemF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuWmlwVXRpbDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogQ3JlYXRlZCBieSBlc29mZXIgb24gOS8xLzIwMTYuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1bGF0ZUNvbXBvbmVudENhY2hlIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQb3B1bGF0ZUNvbXBvbmVudENhY2hlLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIENvbXBvbmVudENhc3NhbmRyYURhbyBjb21wb25lbnRDYXNzYW5kcmFEYW87CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBTZXJ2aWNlT3BlcmF0aW9uIHNlcnZpY2VPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFByb2R1Y3RPcGVyYXRpb24gcHJvZHVjdE9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgQ29tcG9uZW50Q2FjaGUgY29tcG9uZW50Q2FjaGU7CisKKwlwcml2YXRlIHZvaWQgZXhpdChTdHJpbmcgc3RhZ2UsIGludCBpKSB7CisJCWxvZy5lcnJvcigiRmFpbGVkIG9uICIgKyBzdGFnZSk7CisJCVN5c3RlbS5leGl0KGkpOworCisJfQorCisJcHVibGljIHZvaWQgcG9wdWxhdGVDYWNoZSgpIHsKKwkJcG9wdWxhdGVDYWNoZShDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCXBvcHVsYXRlQ2FjaGUoQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCXBvcHVsYXRlQ2FjaGUoQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ2FjaGUoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0pIHsKKworCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0VGl0YW5HZW5lcmljRGFvKCkuZ2V0R3JhcGgoKTsKKwkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisJCUl0ZXJhYmxlIHZlcnRpY2VzID0gdGl0YW5HcmFwaC5xdWVyeSgpCisJCQkJLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIGNvbXBvbmVudFR5cGVFbnVtLm5hbWUoKS50b0xvd2VyQ2FzZSgpKS52ZXJ0aWNlcygpOworCisJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJVGl0YW5WZXJ0ZXggdmVydGV4ID0gKFRpdGFuVmVydGV4KSBpdGVyYXRvci5uZXh0KCk7CisKKwkJCS8vIFZlcnRleFByb3BlcnR5PE9iamVjdD4gc3RhdGUgPQorCQkJLy8gdmVydGV4LnByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSk7CisJCQkvLyBTdHJpbmcgc3RhdGVWYWx1ZSA9IChTdHJpbmcpc3RhdGUudmFsdWUoKTsKKworCQkJLy8gaWYgKGZhbHNlID09CisJCQkvLyBzdGF0ZVZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQubmFtZSgpKQorCQkJLy8gKSB7CisJCQlWZXJ0ZXhQcm9wZXJ0eTxPYmplY3Q+IHVpZCA9IHZlcnRleC5wcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCVN0cmluZyB1aWRWYWx1ZSA9IChTdHJpbmcpIHVpZC52YWx1ZSgpOworCisJCQlsaXN0LmFkZCh1aWRWYWx1ZSk7CisJCQkvLyB9CisJCX0KKworCQlpbnQgY291bnRlciA9IDA7CisJCWZvciAoU3RyaW5nIGNvbXBvbmVudFVpZCA6IGxpc3QpIHsKKworCQkJbG9uZyB0aW1lMSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyBQYXkgYXR0ZW50aW9uLiBUaGUgY29tcG9uZW50IGlzIGZldGNoZWQgZnJvbSB0aGUgY2FjaGUgaW4gY2FzZSBpdAorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpcworCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBhbHJlYWR5CisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHRoZXJlLgorCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGVFbnVtKSB7CisJCQljYXNlIFJFU09VUkNFOgorCQkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VSZXMgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRDb21wb25lbnQoY29tcG9uZW50VWlkLAorCQkJCQkJZmFsc2UpOworCQkJCWlmIChyZXNvdXJjZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJZXhpdCgiZ2V0IHJlc291cmNlIiwgMSk7CisJCQkJfQorCQkJCWNvbXBvbmVudCA9IHJlc291cmNlUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCWJyZWFrOworCQkJY2FzZSBTRVJWSUNFOgorCQkJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlUmVzID0gc2VydmljZU9wZXJhdGlvbi5nZXRDb21wb25lbnQoY29tcG9uZW50VWlkLCBmYWxzZSk7CisJCQkJaWYgKHNlcnZpY2VSZXMuaXNSaWdodCgpKSB7CisJCQkJCWV4aXQoImdldCBzZXJ2aWNlIiwgMSk7CisJCQkJfQorCQkJCWNvbXBvbmVudCA9IHNlcnZpY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBST0RVQ1Q6CisJCQkJRWl0aGVyPFByb2R1Y3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHByb2R1Y3RSZXMgPSBwcm9kdWN0T3BlcmF0aW9uLmdldENvbXBvbmVudChjb21wb25lbnRVaWQsIGZhbHNlKTsKKwkJCQlpZiAocHJvZHVjdFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJZXhpdCgiZ2V0IHByb2R1Y3QiLCAxKTsKKwkJCQl9CisJCQkJY29tcG9uZW50ID0gcHJvZHVjdFJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkgeworCQkJCWV4aXQoImdldCBjb21wb25lbnQiLCAxKTsKKwkJCX0KKworCQkJbG9uZyB0aW1lMiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmZXRjaCByZXNvdXJjZSAiICsgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmV0Y2ggcmVzb3VyY2UgdGltZSBpcyAiICsgKHRpbWUyIC0gdGltZTEpICsKKwkJCS8vICIgbXMiKTsKKworCQkJYm9vbGVhbiBzZXRDb21wb25lbnQgPSBjb21wb25lbnRDYWNoZS5zZXRDb21wb25lbnQoY29tcG9uZW50LCBjb21wb25lbnRUeXBlRW51bS5nZXROb2RlVHlwZSgpKTsKKwkJCWlmIChzZXRDb21wb25lbnQpIHsKKwkJCQljb3VudGVyKys7CisJCQl9CisKKwkJCS8qCisJCQkgKiBFaXRoZXI8Ynl0ZVtdLCBCb29sZWFuPiB2YWx1ZVJlcyA9CisJCQkgKiBTZXJpYWxpemF0aW9uVXRpbHMuc2VyaWFsaXplRXh0KGNvbXBvbmVudCk7CisJCQkgKiAKKwkJCSAqIGlmICh2YWx1ZVJlcy5pc1JpZ2h0KCkpIHsgZXhpdCgic2VyaWFsaXplIGNvbXBvbmVudCAiICsKKwkJCSAqIGNvbXBvbmVudC5nZXROYW1lKCksIDIpOyB9IGJ5dGVbXSB2YWx1ZSA9CisJCQkgKiB2YWx1ZVJlcy5sZWZ0KCkudmFsdWUoKTsgbG9nLmluZm8oImJ5dGVbXSBzaXplIGlzICIgKworCQkJICogdmFsdWUubGVuZ3RoKTsgLy9TeXN0ZW0ub3V0LnByaW50bG4oImJ5dGVbXSBzaXplIGlzICIgKworCQkJICogdmFsdWUubGVuZ3RoKTsKKwkJCSAqIAorCQkJICogYnl0ZVtdIHppcHBlZCA9IG51bGw7IHRyeSB7IHppcHBlZCA9IFppcFV0aWwuemlwQnl0ZXModmFsdWUpOworCQkJICogLy9TeXN0ZW0ub3V0LnByaW50bG4oImJ5dGVbXSBzaXplIGFmdGVyIHppcCBpcyAiICsKKwkJCSAqIHppcHBlZC5sZW5ndGgpOworCQkJICogCisJCQkgKiBDb21wb25lbnRDYWNoZURhdGEgY29tcG9uZW50Q2FjaGVEYXRhID0gbmV3IENvbXBvbmVudENhY2hlRGF0YSgpOworCQkJICogY29tcG9uZW50Q2FjaGVEYXRhLnNldERhdGFBc0FycmF5KHppcHBlZCk7CisJCQkgKiBjb21wb25lbnRDYWNoZURhdGEuc2V0SXNaaXBwZWQodHJ1ZSk7CisJCQkgKiBjb21wb25lbnRDYWNoZURhdGEuc2V0SWQoY29tcG9uZW50VWlkKTsKKwkJCSAqIGNvbXBvbmVudENhY2hlRGF0YS5zZXRNb2RpZmljYXRpb25UaW1lKG5ldworCQkJICogRGF0ZShjb21wb25lbnQuZ2V0TGFzdFVwZGF0ZURhdGUoKSkpOworCQkJICogY29tcG9uZW50Q2FjaGVEYXRhLnNldFR5cGUoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKS5uYW1lKCkuCisJCQkgKiB0b0xvd2VyQ2FzZSgpKTsKKwkJCSAqIAorCQkJICogbG9uZyBhdmVyYWdlSW5zZXJ0VGltZUluTWlsbGkgPQorCQkJICogd3JpdGVSZXNvdXJjZVRvQ2Fzc2FuZHJhQ29tcG9uZW50KGNvbXBvbmVudENhY2hlRGF0YSk7IGxvZy4KKwkJCSAqIGluZm8oIkFmdGVyIGFkZGluZyBjb21wb25lbnQge30gdG8gY2Fzc2FuZHJhLiBJbnNlcnQgdGltZSBpcyB7fSBtcy4iCisJCQkgKiAsIGNvbXBvbmVudFVpZCwgYXZlcmFnZUluc2VydFRpbWVJbk1pbGxpKTsKKwkJCSAqIAorCQkJICogfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQkgKiBlLnByaW50U3RhY2tUcmFjZSgpOyB9CisJCQkgKi8KKworCQl9CisKKwkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIHNhdmVkIGNvbXBvbmVudHMgb2YgdHlwZSB7fSBpcyB7fS4gVG90YWwgc2l6ZSBpcyB7fSIsIGNvbXBvbmVudFR5cGVFbnVtLCBjb3VudGVyLAorCQkJCWxpc3Quc2l6ZSgpKTsKKworCX0KKworCXByaXZhdGUgbG9uZyB3cml0ZVJlc291cmNlVG9DYXNzYW5kcmFDb21wb25lbnQoQ29tcG9uZW50Q2FjaGVEYXRhIGNvbXBvbmVudENhY2hlRGF0YSkgeworCisJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJLy8gY2FsbCB0byBjYXNzYW5kcmEgcmVhZAorCQlDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgc2F2ZUFydGlmYWN0ID0gY29tcG9uZW50Q2Fzc2FuZHJhRGFvLnNhdmVDb21wb25lbnQoY29tcG9uZW50Q2FjaGVEYXRhKTsKKwkJaWYgKHNhdmVBcnRpZmFjdCAhPSBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWV4aXQoIndyaXRlUmVzb3VyY2VUb0Nhc3NhbmRyYSIsIDMpOworCQl9CisKKwkJbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJcmV0dXJuIChlbmRUaW1lIC0gc3RhcnRUaW1lKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVzZXJpYWxpemVCeVRocmVhZHMoTGlzdDxFU0FydGlmYWN0RGF0YT4gbGlzdCwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yLCBpbnQgdGhyZWFkTnVtYmVyKSB7CisKKwkJbG9uZyBmdWxsU2VhcmNoU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJLy8gZm9yIChpbnQgayA9MDsgayA8IHBhcnRzOyBrKyspIHsKKworCQlMaXN0PExpc3Q8RVNBcnRpZmFjdERhdGE+PiBsaXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZE51bWJlcjsgaSsrKSB7CisJCQlsaXN0cy5hZGQobmV3IEFycmF5TGlzdDw+KCkpOworCQl9CisKKwkJTGlzdDxGdXR1cmU8TGlzdDxSZXNvdXJjZT4+PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJbGlzdHMuZ2V0KGkgJSB0aHJlYWROdW1iZXIpLmFkZChsaXN0LmdldChpKSk7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZE51bWJlcjsgaSsrKSB7CisKKwkJCS8vIENhbGxhYmxlPExpc3Q8UmVzb3VyY2U+PiB3b3JrZXIgPSBuZXcKKwkJCS8vIE15RGVzcmlhbGl6YWJsZXRDYWxsYWJsZShsaXN0cy5nZXQoaSksIGkpOworCQkJQ2FsbGFibGU8TGlzdDxSZXNvdXJjZT4+IHdvcmtlciA9IG5ldyBNeTNyZFBhcnR5RGVzcmlhbGl6YWJsZXRDYWxsYWJsZShsaXN0cy5nZXQoaSksIGkpOworCQkJRnV0dXJlPExpc3Q8UmVzb3VyY2U+PiBzdWJtaXQgPSBleGVjdXRvci5zdWJtaXQod29ya2VyKTsKKwkJCXJlc3VsdHMuYWRkKHN1Ym1pdCk7CisJCX0KKworCQlsb25nIGZ1bGxTZWFyY2hTdGFydDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJZm9yIChGdXR1cmU8TGlzdDxSZXNvdXJjZT4+IGZ1dHVyZSA6IHJlc3VsdHMpIHsKKwkJCXRyeSB7CisJCQkJd2hpbGUgKGZhbHNlID09IGZ1dHVyZS5pc0RvbmUoKSkgeworCQkJCQlUaHJlYWQuc2xlZXAoMSk7CisJCQkJfQorCisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCQlsb25nIGZ1bGxTZWFyY2hFbmQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWxvZy5pbmZvKCJlc29mZXIgdGltZSB3YWl0IHRvIHRocmVhZHMgZmluaXNoICIgKyAoKGZ1bGxTZWFyY2hFbmQyIC0gZnVsbFNlYXJjaFN0YXJ0MikpICsgIiBtcyIpOworCQkvLyB9CisJCWxvbmcgZnVsbFNlYXJjaEVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCWxvZy5pbmZvKCJlc29mZXIgZnVsbCBkZXNyaWFsaXplIHRpbWUgIiArICgoZnVsbFNlYXJjaEVuZCAtIGZ1bGxTZWFyY2hTdGFydCkpICsgIiBtcyIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oImVzb2ZlciBmdWxsIGRlc3JpYWxpemUgdGltZSAiICsgKChmdWxsU2VhcmNoRW5kIC0gZnVsbFNlYXJjaFN0YXJ0KSkgKyAiIG1zIik7CisJfQorCisJcHVibGljIGNsYXNzIE15RGVzcmlhbGl6YWJsZXRDYWxsYWJsZSBpbXBsZW1lbnRzIENhbGxhYmxlPExpc3Q8UmVzb3VyY2U+PiB7CisKKwkJTGlzdDxFU0FydGlmYWN0RGF0YT4gbGlzdDsKKwkJaW50IGk7CisKKwkJcHVibGljIE15RGVzcmlhbGl6YWJsZXRDYWxsYWJsZShMaXN0PEVTQXJ0aWZhY3REYXRhPiBsaXN0LCBpbnQgaSkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMubGlzdCA9IGxpc3Q7CisJCQl0aGlzLmkgPSBpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBMaXN0PFJlc291cmNlPiBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWxvbmcgc3RhcnRTZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCWxvbmcgZW5kU2VyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb25nIHN0YXJ0VW56aXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCWxvbmcgZW5kVW56aXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkJbG9uZyBhdmdVbnppcCA9IDA7CisJCQlsb25nIGF2Z1NlciA9IDA7CisJCQlmb3IgKEVTQXJ0aWZhY3REYXRhIGVzQXJ0aWZhY3REYXRhIDogbGlzdCkgeworCisJCQkJYnl0ZVtdIGRhdGFBc0FycmF5ID0gZXNBcnRpZmFjdERhdGEuZ2V0RGF0YUFzQXJyYXkoKTsKKwkJCQlzdGFydFVuemlwID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQkJZGF0YUFzQXJyYXkgPSBaaXBVdGlsLnVuemlwKGRhdGFBc0FycmF5KTsKKwkJCQllbmRVbnppcCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJCWF2Z1VuemlwICs9IChlbmRVbnppcCAtIHN0YXJ0VW56aXApOworCisJCQkJc3RhcnRTZXIgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJCQlFaXRoZXI8T2JqZWN0LCBCb29sZWFuPiBkZXNlcmlhbGl6ZSA9IFNlcmlhbGl6YXRpb25VdGlscy5kZXNlcmlhbGl6ZShkYXRhQXNBcnJheSk7CisJCQkJZW5kU2VyID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQkJYXZnU2VyICs9IChlbmRTZXIgLSBzdGFydFNlcik7CisJCQkJLy8gRWl0aGVyPE9iamVjdCwgQm9vbGVhbj4gZGVzZXJpYWxpemUgPQorCQkJCS8vIFNlcmlhbGl6YXRpb25VdGlscy5kZXNlcmlhbGl6ZShlc0FydGlmYWN0RGF0YS5nZXREYXRhQXNBcnJheSgpKTsKKwkJCQlpZiAoZGVzZXJpYWxpemUuaXNSaWdodCgpKSB7CisJCQkJCWV4aXQoImNvbnZlcnRCeXRlQXJyYXlUb1Jlc291cmNlICIgKyBkZXNlcmlhbGl6ZS5yaWdodCgpLnZhbHVlKCksIDUpOworCQkJCX0KKworCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBkZXNlcmlhbGl6ZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFmdGVyIGRlc3JpYWxpemUgVFsiICsgaSArICJdcmVzb3VyY2UgIiArCisJCQkJLy8gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQl9CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWZ0ZXIgZGVzcmlhbGl6ZSBhdmVyYWdlIGRlc3JpYWxpemUgIiArIGxpc3Quc2l6ZSgpICsgIiBUWyIgKyBpICsgIl0gIgorCQkJCQkrIChhdmdTZXIgLyAxMDAwIC8gbGlzdC5zaXplKCkpICsgIiBtaWNybyIpOworCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCQkiQWZ0ZXIgZGVzcmlhbGl6ZSBhdmVyYWdlIHVuemlwIFRbIiArIGkgKyAiXSAiICsgKGF2Z1VuemlwIC8gMTAwMCAvIGxpc3Quc2l6ZSgpKSArICIgbWljcm8iKTsKKworCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyBtYXliZSByZWdpc3RlciBtb3N0IGZyZXF1ZW50bHkgdXNlZCBjbGFzc2VzIG9uIGNvbmYKKwkJCS8vIHdyaXRlCisJCQkvLyBieXRlIGJhcnJheVtdID0gY29uZi5hc0J5dGVBcnJheShteVNlcmlhbGl6YWJsZU9iamVjdCk7CisJCQkvLyByZWFkCisJCQkvLyBNeU9iamVjdCBvYmplY3QgPSAoTXlPYmplY3QpY29uZi5hc09iamVjdChiYXJyYXkpOworCisJCQlyZXR1cm4gcmVzb3VyY2VzOworCQl9CisJfQorCisJcHVibGljIGNsYXNzIE15M3JkUGFydHlEZXNyaWFsaXphYmxldENhbGxhYmxlIGltcGxlbWVudHMgQ2FsbGFibGU8TGlzdDxSZXNvdXJjZT4+IHsKKworCQlMaXN0PEVTQXJ0aWZhY3REYXRhPiBsaXN0OworCQlpbnQgaTsKKworCQlwdWJsaWMgTXkzcmRQYXJ0eURlc3JpYWxpemFibGV0Q2FsbGFibGUoTGlzdDxFU0FydGlmYWN0RGF0YT4gbGlzdCwgaW50IGkpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLmxpc3QgPSBsaXN0OworCQkJdGhpcy5pID0gaTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgTGlzdDxSZXNvdXJjZT4gY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworCQkJTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlsb25nIHN0YXJ0U2VyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb25nIGVuZFNlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJbG9uZyBzdGFydFVuemlwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb25nIGVuZFVuemlwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCWxvbmcgYXZnVW56aXAgPSAwOworCQkJbG9uZyBhdmdTZXIgPSAwOworCQkJZm9yIChFU0FydGlmYWN0RGF0YSBlc0FydGlmYWN0RGF0YSA6IGxpc3QpIHsKKworCQkJCWJ5dGVbXSBkYXRhQXNBcnJheSA9IGVzQXJ0aWZhY3REYXRhLmdldERhdGFBc0FycmF5KCk7CisJCQkJc3RhcnRVbnppcCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJCWRhdGFBc0FycmF5ID0gWmlwVXRpbC51bnppcChkYXRhQXNBcnJheSk7CisJCQkJZW5kVW56aXAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJCQlhdmdVbnppcCArPSAoZW5kVW56aXAgLSBzdGFydFVuemlwKTsKKworCQkJCXN0YXJ0U2VyID0gU3lzdGVtLm5hbm9UaW1lKCk7CisKKwkJCQlFaXRoZXI8UmVzb3VyY2UsIEJvb2xlYW4+IGRlc2VyaWFsaXplRXh0ID0gU2VyaWFsaXphdGlvblV0aWxzLmRlc2VyaWFsaXplRXh0KGRhdGFBc0FycmF5LAorCQkJCQkJUmVzb3VyY2UuY2xhc3MsICIiKTsKKworCQkJCWlmIChkZXNlcmlhbGl6ZUV4dC5pc0xlZnQoKSkgeworCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRlc2VyaWFsaXplRXh0LmxlZnQoKS52YWx1ZSgpOworCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCkuc2l6ZSgpKTsKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlLmdldFJlcXVpcmVtZW50cygpLnNpemUoKSk7CisJCQkJCWVuZFNlciA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJCQlhdmdTZXIgKz0gKGVuZFNlciAtIHN0YXJ0U2VyKTsKKwkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWZ0ZXIgZGVzcmlhbGl6ZSBUWyIgKyBpICsgIl1yZXNvdXJjZQorCQkJCQkvLyAiICsgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQkJfQorCQkJfQorCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFmdGVyIGRlc3JpYWxpemUgYXZlcmFnZSBkZXNyaWFsaXplICIgKyBsaXN0LnNpemUoKSArICIgVFsiICsgaSArICJdICIKKwkJCQkJKyAoYXZnU2VyIC8gMTAwMCAvIGxpc3Quc2l6ZSgpKSArICIgbWljcm8iKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkJIkFmdGVyIGRlc3JpYWxpemUgYXZlcmFnZSB1bnppcCBUWyIgKyBpICsgIl0gIiArIChhdmdVbnppcCAvIDEwMDAgLyBsaXN0LnNpemUoKSkgKyAiIG1pY3JvIik7CisKKwkJCXJldHVybiByZXNvdXJjZXM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9Qcm9kdWN0TG9naWMuamF2YSBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9Qcm9kdWN0TG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE1YzgzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL1Byb2R1Y3RMb2dpYy5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5GYWN0b3J5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBDcmVhdGVkIGJ5IG1sYW5kbyBvbiAyLzIzLzIwMTYuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWN0TG9naWMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2R1Y3RMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIGJvb2xlYW4gZGVsZXRlQWxsUHJvZHVjdHMoU3RyaW5nIHRpdGFuRmlsZSwgU3RyaW5nIGJlSG9zdCwgU3RyaW5nIGJlUG9ydCwgU3RyaW5nIGFkbWluVXNlcikgeworCQlsb2cuZGVidWcoInJldHJpZXZpbmcgYWxsIHByb2R1Y3RzIGZyb20gZ3JhcGgiKTsKKwkJUmVzdFV0aWxzIHJlc3RVdGlscyA9IG51bGw7CisJCXRyeSB7CisJCQlMaXN0PFN0cmluZz4gcHJvZHVjdExpc3QgPSBnZXRBbGxQcm9kdWN0cyh0aXRhbkZpbGUpOworCQkJcmVzdFV0aWxzID0gbmV3IFJlc3RVdGlscygpOworCQkJaWYgKHByb2R1Y3RMaXN0ICE9IG51bGwpIHsKKwkJCQlmb3IgKFN0cmluZyBwcm9kdWN0VWlkIDogcHJvZHVjdExpc3QpIHsKKwkJCQkJSW50ZWdlciBzdGF0dXMgPSByZXN0VXRpbHMuZGVsZXRlUHJvZHVjdChwcm9kdWN0VWlkLCBiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyKTsKKwkJCQl9CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCBwcm9kdWN0cyBmcm9tIGdyYXBoIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3RVdGlscyAhPSBudWxsKSB7CisJCQkJcmVzdFV0aWxzLmNsb3NlQ2xpZW50KCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRBbGxQcm9kdWN0cyhTdHJpbmcgdGl0YW5GaWxlKSB7CisJCVRpdGFuR3JhcGggZ3JhcGggPSBudWxsOworCQl0cnkgeworCQkJZ3JhcGggPSBvcGVuR3JhcGgodGl0YW5GaWxlKTsKKwkJCUxpc3Q8U3RyaW5nPiBwcm9kdWN0c1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlJdGVyYWJsZSB2ZXJ0aWNlcyA9IGdyYXBoLnF1ZXJ5KCkKKwkJCQkJLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIE5vZGVUeXBlRW51bS5Qcm9kdWN0LmdldE5hbWUoKSkudmVydGljZXMoKTsKKwkJCWlmICh2ZXJ0aWNlcyAhPSBudWxsKSB7CisJCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXIgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCQlWZXJ0ZXggdmVydGV4ID0gaXRlci5uZXh0KCk7CisJCQkJCVN0cmluZyBpZCA9IHZlcnRleC52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJcHJvZHVjdHNUb0RlbGV0ZS5hZGQoaWQpOworCQkJCX0KKwkJCX0KKworCQkJZ3JhcGgudHgoKS5jb21taXQoKTsKKwkJCXJldHVybiBwcm9kdWN0c1RvRGVsZXRlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCWdyYXBoLnR4KCkucm9sbGJhY2soKTsKKwkJCXJldHVybiBudWxsOworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJCWdyYXBoLmNsb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIFRpdGFuR3JhcGggb3BlbkdyYXBoKFN0cmluZyB0aXRhbkZpbGVMb2NhdGlvbikgeworCisJCVRpdGFuR3JhcGggZ3JhcGggPSBUaXRhbkZhY3Rvcnkub3Blbih0aXRhbkZpbGVMb2NhdGlvbik7CisKKwkJcmV0dXJuIGdyYXBoOworCisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvUmVzdFV0aWxzLmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvUmVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1NmNhMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9SZXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBEZWxldGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50Lkh0dHBDbGllbnRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIENyZWF0ZWQgYnkgbWxhbmRvIG9uIDIvMjMvMjAxNi4KKyAqLworcHVibGljIGNsYXNzIFJlc3RVdGlscyB7CisKKwlmaW5hbCBTdHJpbmcgREVMRVRFX1BST0RVQ1QgPSAiaHR0cDovLyVzOiVzL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Byb2R1Y3RzLyVzIjsKKwlmaW5hbCBJbnRlZ2VyIERFTEVURV9TVUNDU0VTX1JFU1BPTlNFID0gMjAwOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc3RVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCUNsb3NlYWJsZUh0dHBDbGllbnQgaHR0cENsaWVudDsKKworCXB1YmxpYyBSZXN0VXRpbHMoKSB7CisJCXRoaXMuaHR0cENsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwl9CisKKwlwcml2YXRlIENsb3NlYWJsZUh0dHBSZXNwb25zZSBleGFjdXRlUmVxdWVzdChIdHRwVXJpUmVxdWVzdCBodHRwUmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJbG9nLmRlYnVnKCJyZWNlaXZlZCBodHRwIHJlcXVlc3Q6IHt9IiwgaHR0cFJlcXVlc3QudG9TdHJpbmcoKSk7CisJCXJldHVybiBodHRwQ2xpZW50LmV4ZWN1dGUoaHR0cFJlcXVlc3QpOworCX0KKworCXB1YmxpYyB2b2lkIGNsb3NlQ2xpZW50KCkgeworCQlsb2cuZGVidWcoImNsb3NpbmcgaHR0cCBjbGllbnQiKTsKKwkJdHJ5IHsKKwkJCXRoaXMuaHR0cENsaWVudC5jbG9zZSgpOworCQkJbG9nLmRlYnVnKCJjbG9zZWQgaHR0cCBjbGllbnQiKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJjbG9zZSBodHRwIGNsaWVudCBmYWlsZWQiLCBlKTsKKworCQl9CisJfQorCisJcHVibGljIEludGVnZXIgZGVsZXRlUHJvZHVjdChTdHJpbmcgcHJvZHVjdFVpZCwgU3RyaW5nIGJlSG9zdCwgU3RyaW5nIGJlUG9ydCwgU3RyaW5nIGFkbWluVXNlcikgeworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdChERUxFVEVfUFJPRFVDVCwgYmVIb3N0LCBiZVBvcnQsIHByb2R1Y3RVaWQpOworCQlIdHRwRGVsZXRlIGRlbGV0ZVJlcXVlc3QgPSBuZXcgSHR0cERlbGV0ZSh1cmwpOworCQlkZWxldGVSZXF1ZXN0LnNldEhlYWRlcigiVVNFUl9JRCIsIGFkbWluVXNlcik7CisJCXRyeSAoQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gdGhpcy5odHRwQ2xpZW50LmV4ZWN1dGUoZGVsZXRlUmVxdWVzdCkpIHsKKwkJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJaWYgKERFTEVURV9TVUNDU0VTX1JFU1BPTlNFLmVxdWFscyhzdGF0dXMpKSB7CisJCQkJbG9nLmRlYnVnKCJQcm9kdWN0IHVpZDp7fSBzdWNjc2VzZnVsbHkgZGVsZXRlZCIsIHByb2R1Y3RVaWQpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZXJyb3IoIlByb2R1Y3QgdWlkOnt9IGRlbGV0ZSBmYWlsZWQgc3RhdHVzIHt9IiwgcHJvZHVjdFVpZCwgc3RhdHVzKTsKKwkJCX0KKwkJCXJldHVybiBzdGF0dXM7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiUHJvZHVjdCB1aWQ6IiArIHByb2R1Y3RVaWQgKyAiIGRlbGV0ZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9VcGRhdGVQcm9wZXJ0eU9uVmVydGV4LmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvVXBkYXRlUHJvcGVydHlPblZlcnRleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODAwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvVXBkYXRlUHJvcGVydHlPblZlcnRleC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuRmFjdG9yeTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoUXVlcnk7CisKK3B1YmxpYyBjbGFzcyBVcGRhdGVQcm9wZXJ0eU9uVmVydGV4IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVcGRhdGVQcm9wZXJ0eU9uVmVydGV4LmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgSW50ZWdlciB1cGRhdGVQcm9wZXJ0eU9uU2VydmljZUF0TGVhc3RDZXJ0aWZpZWQoU3RyaW5nIHRpdGFuRmlsZSwgTWFwPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZVRvU2V0LAorCQkJTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBvckNyaXRlcmlhKSB7CisKKwkJVGl0YW5HcmFwaCBncmFwaCA9IG51bGw7CisKKwkJSW50ZWdlciBudW1iZXJPZlVwZGF0ZWRWZXJ0ZXhlcyA9IDA7CisKKwkJdHJ5IHsKKwkJCWdyYXBoID0gb3BlbkdyYXBoKHRpdGFuRmlsZSk7CisKKwkJCWlmIChvckNyaXRlcmlhICE9IG51bGwgJiYgZmFsc2UgPT0gb3JDcml0ZXJpYS5pc0VtcHR5KCkpIHsKKworCQkJCWZvciAoTWFwPFN0cmluZywgT2JqZWN0PiBjcml0ZXJpYSA6IG9yQ3JpdGVyaWEpIHsKKworCQkJCQlUaXRhbkdyYXBoUXVlcnk8PyBleHRlbmRzIFRpdGFuR3JhcGhRdWVyeT4gcXVlcnkgPSBncmFwaC5xdWVyeSgpOworCisJCQkJCWlmIChjcml0ZXJpYSAhPSBudWxsICYmICFjcml0ZXJpYS5pc0VtcHR5KCkpIHsKKwkJCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGNyaXRlcmlhLmVudHJ5U2V0KCkpIHsKKwkJCQkJCQlxdWVyeSA9IHF1ZXJ5LmhhcyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHF1ZXJ5CisJCQkJCQkJLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKQorCQkJCQkJCS52ZXJ0aWNlcygpLml0ZXJhdG9yKCk7CisKKwkJCQkJYm9vbGVhbiBpc0ZvdW5kQXRMZWFzdE9uZUNlcnRpZmllZFNlcnZpY2UgPSBmYWxzZTsKKwkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJVmVydGV4IHZlcnRleCA9IChWZXJ0ZXgpIGl0ZXJhdG9yLm5leHQoKTsKKworCQkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBsZWZ0UHJvcHMgPSBVdGlscy5nZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisJCQkJCQlib29sZWFuIHZlcnRleExlZnRDb250YWluc1JpZ2h0UHJvcHMgPSBVdGlscy52ZXJ0ZXhMZWZ0Q29udGFpbnNSaWdodFByb3BzKGxlZnRQcm9wcywgY3JpdGVyaWEpOworCQkJCQkJaWYgKGZhbHNlID09IHZlcnRleExlZnRDb250YWluc1JpZ2h0UHJvcHMpIHsKKwkJCQkJCQlsb2cuZGVidWcoIklnbm9yZSB2ZXJ0ZXggc2luY2UgcHJvcGVydGllcyBpdCBkb2VzIG5vdCBjb250YWlucyBwcm9wZXJ0aWVzIHt9LiBWZXJ0ZXggcHJvcGVydGllcyBhcmU6IHt9IiwgY3JpdGVyaWEsIGxlZnRQcm9wcyk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJCWlzRm91bmRBdExlYXN0T25lQ2VydGlmaWVkU2VydmljZSA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmICh0cnVlID09IGlzRm91bmRBdExlYXN0T25lQ2VydGlmaWVkU2VydmljZSkgeworCisJCQkJCQlJbnRlZ2VyIGN1cnJlbnROdW1iZXJPZlVwZGF0ZXMgPSB1cGRhdGVWZXJ0ZXhlcyhrZXlWYWx1ZVRvU2V0LCBncmFwaCwgY3JpdGVyaWEpOworCisJCQkJCQlpZiAoY3VycmVudE51bWJlck9mVXBkYXRlcyAhPSBudWxsKSB7CisJCQkJCQkJbnVtYmVyT2ZVcGRhdGVkVmVydGV4ZXMgKz0gY3VycmVudE51bWJlck9mVXBkYXRlczsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgeworCQkJCQkJbG9nLmRlYnVnKCJObyBjZXJ0aWZpZWQgc2VydmljZSB3YXMgZm91bmQgZm9yIGNyaXRlcmlhIHt9IiwgY3JpdGVyaWEpOworCQkJCQl9CisJCQkJfQorCisJCQl9CisKKwkJCS8vIGdyYXBoLmNvbW1pdCgpOworCQkJZ3JhcGgudHgoKS5jb21taXQoKTsKKworCQkJcmV0dXJuIG51bWJlck9mVXBkYXRlZFZlcnRleGVzOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJLy8gZ3JhcGgucm9sbGJhY2soKTsKKwkJCWdyYXBoLnR4KCkucm9sbGJhY2soKTsKKworCQkJcmV0dXJuIG51bGw7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChncmFwaCAhPSBudWxsKSB7CisJCQkJLy8gZ3JhcGguc2h1dGRvd24oKTsKKwkJCQlncmFwaC5jbG9zZSgpOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIEludGVnZXIgdXBkYXRlVmVydGV4ZXMoTWFwPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZVRvU2V0LCBUaXRhbkdyYXBoIGdyYXBoLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGNyaXRlcmlhKSB7CisJCUludGVnZXIgbnVtYmVyT2ZVcGRhdGVkVmVydGV4ZXNQZXJTZXJ2aWNlID0gMDsKKworCQlUaXRhbkdyYXBoUXVlcnk8PyBleHRlbmRzIFRpdGFuR3JhcGhRdWVyeT4gdXBkYXRlUXVlcnkgPSBncmFwaC5xdWVyeSgpOworCisJCWlmIChjcml0ZXJpYSAhPSBudWxsICYmICFjcml0ZXJpYS5pc0VtcHR5KCkpIHsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGNyaXRlcmlhLmVudHJ5U2V0KCkpIHsKKwkJCQl1cGRhdGVRdWVyeSA9IHVwZGF0ZVF1ZXJ5LmhhcyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQl9CisJCX0KKwkJSXRlcmF0b3IgdXBkYXRlSXRlcmF0b3IgPSB1cGRhdGVRdWVyeS52ZXJ0aWNlcygpLml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKHVwZGF0ZUl0ZXJhdG9yLmhhc05leHQoKSkgeworCisJCQlWZXJ0ZXggdmVydGV4ID0gKFZlcnRleCkgdXBkYXRlSXRlcmF0b3IubmV4dCgpOworCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGxlZnRQcm9wcyA9IFV0aWxzLmdldFByb3BlcnRpZXModmVydGV4KTsKKworCQkJYm9vbGVhbiB2ZXJ0ZXhMZWZ0Q29udGFpbnNSaWdodFByb3BzID0gVXRpbHMudmVydGV4TGVmdENvbnRhaW5zUmlnaHRQcm9wcyhsZWZ0UHJvcHMsIGNyaXRlcmlhKTsKKwkJCWlmIChmYWxzZSA9PSB2ZXJ0ZXhMZWZ0Q29udGFpbnNSaWdodFByb3BzKSB7CisJCQkJbG9nLmRlYnVnKCJJZ25vcmUgdmVydGV4IHNpbmNlIHByb3BlcnRpZXMgaXQgZG9lcyBub3QgY29udGFpbnMgcHJvcGVydGllcyB7fS4gVmVydGV4IHByb3BlcnRpZXMgYXJlIHt9IiwgY3JpdGVyaWEsIGxlZnRQcm9wcyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChrZXlWYWx1ZVRvU2V0ICE9IG51bGwpIHsKKwkJCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGtleVZhbHVlVG9TZXQuZW50cnlTZXQoKSkgeworCQkJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJCU9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQkJLy8gdmVydGV4LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOworCQkJCQl2ZXJ0ZXgucHJvcGVydHkoa2V5LCB2YWx1ZSk7CisJCQkJCS8vaWYobG9nLmlzRGVidWdFbmFibGVkKCkpeworCQkJCQkvLyBsb2cuZGVidWcoIkFmdGVyIHNldHRpbmcgdmVydGV4OiB7fSB7fSB3aXRoIGtleSB2YWx1ZToge30sIHt9IiwgCisJCQkJCS8vIHZlcnRleC5nZXRQcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSksIAorCQkJCQkvLyB2ZXJ0ZXguZ2V0UHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRVJTSU9OLmdldFByb3BlcnR5KCkpLAorCQkJCQkvLyBrZXksIHZhbHVlKTsKKwkJCQkJLy99CisJCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgc2V0dGluZyB2ZXJ0ZXg6IHt9IHt9IHdpdGgga2V5IHZhbHVlOiB7fSwge30iLCAKKwkJCQkJCQl2ZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpLAorCQkJCQkJCXZlcnRleC5wcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZFUlNJT04uZ2V0UHJvcGVydHkoKSksCisJCQkJCQkJa2V5LCB2YWx1ZSk7CisJCQkJCW51bWJlck9mVXBkYXRlZFZlcnRleGVzUGVyU2VydmljZSsrOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJbG9nLmluZm8oCisJCQkJIlRoZSBudW1iZXIgb2YgdXBkYXRlZCBzZXJ2aWNlcyBmb3IgY3JpdGVyaWEgIiArIGNyaXRlcmlhICsgIiBpcyAiICsgbnVtYmVyT2ZVcGRhdGVkVmVydGV4ZXNQZXJTZXJ2aWNlKTsKKwkJcmV0dXJuIG51bWJlck9mVXBkYXRlZFZlcnRleGVzUGVyU2VydmljZTsKKwl9CisKKwlwdWJsaWMgVGl0YW5HcmFwaCBvcGVuR3JhcGgoU3RyaW5nIHRpdGFuRmlsZUxvY2F0aW9uKSB7CisKKwkJVGl0YW5HcmFwaCBncmFwaCA9IFRpdGFuRmFjdG9yeS5vcGVuKHRpdGFuRmlsZUxvY2F0aW9uKTsKKworCQlyZXR1cm4gZ3JhcGg7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MDQvQWRkR3JvdXBVdWlkLmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0FkZEdyb3VwVXVpZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGZlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0FkZEdyb3VwVXVpZC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkdyb3VwRGF0YTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBBZGRHcm91cFV1aWQgeworCisJcHVibGljIHN0YXRpYyBib29sZWFuIGFkZEdyb3VwVXVpZHMoVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbywgTG9nZ2VyIGxvZywgYm9vbGVhbiBpblRyc2Fuc2FjdGlvbikgeworCisJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKworCQl0cnkgeworCisJCQlsb2cuZGVidWcoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBmaW5kIGFsbCBncm91cHMiKTsKKworCQkJRWl0aGVyPExpc3Q8R3JvdXBEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbEdyb3VwcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5Hcm91cCwKKwkJCQkJbnVsbCwgbnVsbCwgR3JvdXBEYXRhLmNsYXNzKTsKKworCQkJaWYgKGFsbEdyb3Vwcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxHcm91cHMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZmluZGluZyBhbGwgZ3JvdXBzLiBTdGF0dXMgaXMge30iLCBzdGF0dXMpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EICYmIHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKworCQkJTGlzdDxHcm91cERhdGE+IGdyb3VwcyA9IGFsbEdyb3Vwcy5sZWZ0KCkudmFsdWUoKTsKKworCQkJbG9nLmluZm8oIlRoZSBudW1iZXIgb2YgZ3JvdXBzIGZldGNoZWQgaXMge30iLCBncm91cHMgPT0gbnVsbCA/IDAgOiBncm91cHMuc2l6ZSgpKTsKKworCQkJaW50IG51bWJlck9mVXBkYXRlcyA9IDA7CisJCQlpZiAoZmFsc2UgPT0gZ3JvdXBzLmlzRW1wdHkoKSkgeworCQkJCU1hcDxTdHJpbmcsIExpc3Q8R3JvdXBEYXRhPj4gaW52YXJpYW50SWRUb0dyb3VwcyA9IGdyb3Vwcy5zdHJlYW0oKQorCQkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KHAgLT4gcC5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuZ2V0SW52YXJpYW50VVVJRCgpKSk7CisKKwkJCQkvLyBBbGwgdGhlIGdyb3VwcyB3aXRoIHRoZSBzYW1lIGludmFyaWFudFVVSUQgc2hvdWxkIGhhdmUgdGhlCisJCQkJLy8gc2FtZSBncm91cCBVVUlEIHNpbmNlIHVwZGF0ZSBWRiBmbG93IHdpdGggQ1NBUiB3YXMgbm90CisJCQkJLy8gc3VwcG9ydGVkIGluIHRoZSBFMkUgZW52aXJvbm1lbnQuCisKKwkJCQlsb2cuaW5mbygiVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgaW52YXJpYW50VXVpZHMgaXMge30iLAorCQkJCQkJaW52YXJpYW50SWRUb0dyb3VwcyA9PSBudWxsID8gMCA6IGludmFyaWFudElkVG9Hcm91cHMuc2l6ZSgpKTsKKworCQkJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PEdyb3VwRGF0YT4+IGVudHJ5IDogaW52YXJpYW50SWRUb0dyb3Vwcy5lbnRyeVNldCgpKSB7CisKKwkJCQkJU3RyaW5nIGludmFyaWFudFV1aWQgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQkJTGlzdDxHcm91cERhdGE+IGdyb3Vwc0RhdGEgPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJCWdyb3Vwc0RhdGEuZm9yRWFjaChwIC0+IGJ1aWxkZXIuYXBwZW5kKHAuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCkgKyAiLCIpKTsKKworCQkJCQlTdHJpbmcgZ3JvdXBVVUlEID0gZ3JvdXBzRGF0YS5nZXQoMCkuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLmdldEdyb3VwVVVJRCgpOworCisJCQkJCWlmIChncm91cFVVSUQgPT0gbnVsbCkgeworCisJCQkJCQlncm91cFVVSUQgPSBVbmlxdWVJZEJ1aWxkZXIuZ2VuZXJhdGVVVUlEKCk7CisKKwkJCQkJCWxvZy5kZWJ1ZygiQmVmb3JlIHVwZGF0aW5nIGdyb3VwcyB7fSB3aXRoIGdyb3VwVVVJRCB7fSIsIGJ1aWxkZXIudG9TdHJpbmcoKSwgZ3JvdXBVVUlEKTsKKworCQkJCQkJZm9yIChHcm91cERhdGEgZ3JvdXBEYXRhIDogZ3JvdXBzRGF0YSkgeworCisJCQkJCQkJbnVtYmVyT2ZVcGRhdGVzKys7CisJCQkJCQkJZ3JvdXBEYXRhLmdldEdyb3VwRGF0YURlZmluaXRpb24oKS5zZXRHcm91cFVVSUQoZ3JvdXBVVUlEKTsKKwkJCQkJCQlFaXRoZXI8R3JvdXBEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKGdyb3VwRGF0YSwKKwkJCQkJCQkJCUdyb3VwRGF0YS5jbGFzcyk7CisJCQkJCQkJaWYgKHVwZGF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBncm91cCAiICsgZ3JvdXBEYXRhICsgIi4gRXJyb3IgaXMge30iLAorCQkJCQkJCQkJCXVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpLnRvU3RyaW5nKCkpOworCQkJCQkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQkJbG9nLmRlYnVnKCJBZnRlciB1cGRhdGluZyBncm91cHMge30gd2l0aCBncm91cFVVSUQge30iLCBidWlsZGVyLnRvU3RyaW5nKCksIGdyb3VwVVVJRCk7CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKworCQkJbG9nLmluZm8oIlRoZSBudW1iZXIgb2YgZ3JvdXBzIHVwZGF0ZWQgd2l0aCBncm91cFVVSUQgaXMgIiArIG51bWJlck9mVXBkYXRlcyk7CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWxvZy5pbmZvKCJGaW5pc2ggdXBkYXRpbmcgZ3JvdXBVVUlEcy4gU3RhdHVzIGlzIHt9LiIsIHJlc3VsdCk7CisJCQlpZiAoaW5UcnNhbnNhY3Rpb24gPT0gZmFsc2UpIHsKKwkJCQlpZiAocmVzdWx0ID09IGZhbHNlKSB7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MDQvQWxsb3dNdWx0aXBsZUhlYXRzLmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0FsbG93TXVsdGlwbGVIZWF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MWNmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0FsbG93TXVsdGlwbGVIZWF0cy5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkFydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBBbGxvd011bHRpcGxlSGVhdHMgeworCisJcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFuZFVwZGF0ZUhlYXRQbGFjZUhvbGRlcnMoVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbywgTG9nZ2VyIGxvZywKKwkJCWJvb2xlYW4gaW5UcnNhbnNhY3Rpb24pIHsKKworCQlib29sZWFuIHJlc3VsdCA9IHRydWU7CisKKwkJdHJ5IHsKKworCQkJTGlzdDxBcnRpZmFjdERhdGE+IGFydGlmYWN0c1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlMaXN0PEFydGlmYWN0RGF0YT4gYXJ0aWZhY3RzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJU3RyaW5nW10gcGhMYWJlbHMgPSB7ICJoZWF0IiwgImhlYXR2b2wiLCAiaGVhdG5ldCIgfTsKKworCQkJZm9yIChTdHJpbmcgYXJ0aWZhY3RMYWJlbCA6IHBoTGFiZWxzKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCisJCQkJcHJvcGVydGllcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9MQUJFTC5nZXRQcm9wZXJ0eSgpLCBhcnRpZmFjdExhYmVsKTsKKworCQkJCUVpdGhlcjxMaXN0PEFydGlmYWN0RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxIZWF0QXJ0aWZhY3RzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIHByb3BlcnRpZXMsIG51bGwsIEFydGlmYWN0RGF0YS5jbGFzcyk7CisKKwkJCQlpZiAoYWxsSGVhdEFydGlmYWN0cy5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsSGVhdEFydGlmYWN0cy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCisJCQkJfQorCisJCQkJTGlzdDxBcnRpZmFjdERhdGE+IGxpc3QgPSBhbGxIZWF0QXJ0aWZhY3RzLmxlZnQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiRm91bmQge30gYXJ0aWZhY3RzIHdpdGggbGFiZWwge30iLCAobGlzdCA9PSBudWxsID8gMCA6IGxpc3Quc2l6ZSgpKSwgYXJ0aWZhY3RMYWJlbCk7CisKKwkJCQlpZiAobGlzdCAhPSBudWxsICYmIGZhbHNlID09IGxpc3QuaXNFbXB0eSgpKSB7CisKKwkJCQkJZm9yIChBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhIDogbGlzdCkgeworCQkJCQkJU3RyaW5nIGVzSWQgPSBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEVzSWQoKTsKKwkJCQkJCWlmIChlc0lkID09IG51bGwgfHwgdHJ1ZSA9PSBlc0lkLmlzRW1wdHkoKSkgeworCQkJCQkJCWFydGlmYWN0c1RvRGVsZXRlLmFkZChhcnRpZmFjdERhdGEpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlhcnRpZmFjdHNUb1VwZGF0ZS5hZGQoYXJ0aWZhY3REYXRhKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGZhbHNlID09IGFydGlmYWN0c1RvRGVsZXRlLmlzRW1wdHkoKSkgeworCQkJCWZvciAoQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA6IGFydGlmYWN0c1RvRGVsZXRlKSB7CisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiR29pbmcgdG8gZGVsZXRlIGFydGlmYWN0ICIgKworCQkJCQkvLyBhcnRpZmFjdERhdGEpOworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGRlbGV0ZSBhcnRpZmFjdCB7fSIsIGFydGlmYWN0RGF0YSk7CisJCQkJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoYXJ0aWZhY3REYXRhLAorCQkJCQkJCUFydGlmYWN0RGF0YS5jbGFzcyk7CisJCQkJCWlmIChkZWxldGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIGFydGlmYWN0IG5vZGUge30iLCBkZWxldGVOb2RlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRGVsZXRlIGFydGlmYWN0IG5vZGUge30iLCBkZWxldGVOb2RlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJbG9nLmRlYnVnKCJOdW1iZXIgb2YgZGVsZXRlZCBhcnRpZmFjdHMgaXMge30iLCBhcnRpZmFjdHNUb0RlbGV0ZS5zaXplKCkpOworCisJCQlpbnQgY291bnRlciA9IDA7CisJCQlpZiAoZmFsc2UgPT0gYXJ0aWZhY3RzVG9VcGRhdGUuaXNFbXB0eSgpKSB7CisJCQkJZm9yIChBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhIDogYXJ0aWZhY3RzVG9VcGRhdGUpIHsKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb2luZyB0byB1cGRhdGUgYXJ0aWZhY3QgIiArCisJCQkJCS8vIGFydGlmYWN0RGF0YSk7CisKKwkJCQkJaWYgKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0TWFuZGF0b3J5KCkgIT0gbnVsbAorCQkJCQkJCSYmIHRydWUgPT0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRNYW5kYXRvcnkoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byB1cGRhdGUgYXJ0aWZhY3Qge30iLCBhcnRpZmFjdERhdGEpOworCQkJCQkJY291bnRlcisrOworCQkJCQkJYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5zZXRNYW5kYXRvcnkoZmFsc2UpOworCQkJCQkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZWROb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkJCS51cGRhdGVOb2RlKGFydGlmYWN0RGF0YSwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJCQkJCWlmICh1cGRhdGVkTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgYXJ0aWZhY3Qgbm9kZSB7fSIsIHVwZGF0ZWROb2RlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlsb2cuZGVidWcoIlVwZGF0ZSBhcnRpZmFjdCBub2RlIHt9IiwgdXBkYXRlZE5vZGUubGVmdCgpLnZhbHVlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlsb2cuZGVidWcoIk51bWJlciBvZiB1cGRhdGVkIGFydGlmYWN0cyBpcyB7fSIsIGNvdW50ZXIpOworCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoaW5UcnNhbnNhY3Rpb24gPT0gZmFsc2UpIHsKKwkJCQlpZiAocmVzdWx0ID09IGZhbHNlKSB7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MDQvQXBwQ29uZmlnLmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0FwcENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Mjk5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0FwcENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNTM4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLlBvcHVsYXRlQ29tcG9uZW50Q2FjaGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDcuQ3Nhck1pZ3JhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLm1pZ3JhdGlvbi52MTYxMC5UaXRhbkZpeFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjEwLlRvc2NhQXJ0aWZhY3RzQWxpZ25tZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmF1ZGl0aW5nLmFwaS5JQXVkaXRpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmF1ZGl0aW5nLmltcGwuQXVkaXRpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5JRGlzdHJpYnV0aW9uRW5naW5lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5TZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Hcm91cEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLklucHV0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlByb2R1Y3RCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Qcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5SZXNvdXJjZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc291cmNlSW1wb3J0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuU2VydmljZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlZGQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5BcnRpZmFjdENhc3NhbmRyYURhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLkF1ZGl0Q2Fzc2FuZHJhRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuQ2Fzc2FuZHJhQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuQ29tcG9uZW50Q2Fzc2FuZHJhRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5lcy5FbGFzdGljU2VhcmNoQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsLkF1ZGl0aW5nRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR3JhcGhDbGllbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLkNvbXBvbmVudENhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUVsZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUdyYXBoTG9ja09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JVXNlckFkbWluT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5BZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkFydGlmYWN0T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5BdHRyaWJ1dGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNhY2hlTWFuZ2VyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNhcGFiaWxpdHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Db21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ3Nhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuR3JhcGhMb2NrT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Hcm91cE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuR3JvdXBUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5IZWF0UGFyYW1ldGVyc09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuSW5wdXRzT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5JbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkxpZmVjeWNsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuT25ib2FyZGluZ0NsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvZHVjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlcXVpcmVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuU2VydmljZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVXNlckFkbWluT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLkNzYXJVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5Ub3NjYUV4cG9ydEhhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5JVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247CisKK0BDb25maWd1cmF0aW9uCitwdWJsaWMgY2xhc3MgQXBwQ29uZmlnIHsKKwlAQmVhbihuYW1lID0gInNlcnZpY2VNaWdyYXRpb25CZWFuIikKKwlwdWJsaWMgU2VydmljZU1pZ3JhdGlvbiBzZXJ2aWNlTWlncmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IFNlcnZpY2VNaWdyYXRpb24oKTsKKwl9CisKKwlAQmVhbihuYW1lID0gInZmY05hbWluZ0FsaWdubWVudEJlYW4iKQorCXB1YmxpYyBWZmNOYW1pbmdBbGlnbm1lbnQgdmZjTmFtaW5nQWxpZ25tZW50KCkgeworCQlyZXR1cm4gbmV3IFZmY05hbWluZ0FsaWdubWVudCgpOworCX0KKworCUBCZWFuKG5hbWUgPSAiZGVyaXZlZEZyb21BbGlnbm1lbnQiKQorCXB1YmxpYyBEZXJpdmVkRnJvbUFsaWdubWVudCBkZXJpdmVkRnJvbUFsaWdubWVudCgpIHsKKwkJcmV0dXJuIG5ldyBEZXJpdmVkRnJvbUFsaWdubWVudCgpOworCX0KKworCUBCZWFuKG5hbWUgPSAiZ3JvdXBzQWxpZ25tZW50IikKKwlwdWJsaWMgR3JvdXBzQWxpZ25tZW50IGdyb3Vwc0FsaWdubWVudCgpIHsKKwkJcmV0dXJuIG5ldyBHcm91cHNBbGlnbm1lbnQoKTsKKwl9CisKKwlAQmVhbihuYW1lID0gImNzYXJNaWdyYXRpb24iKQorCXB1YmxpYyBDc2FyTWlncmF0aW9uIGNzYXJNaWdyYXRpb24oKSB7CisJCXJldHVybiBuZXcgQ3Nhck1pZ3JhdGlvbigpOworCX0KKworCUBCZWFuKG5hbWUgPSAidGl0YW4tZ2VuZXJpYy1kYW8iKQorCXB1YmxpYyBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKCkgeworCQlyZXR1cm4gbmV3IFRpdGFuR2VuZXJpY0RhbygpOworCX0KKworCUBCZWFuKG5hbWUgPSAidGl0YW4tY2xpZW50IiwgaW5pdE1ldGhvZCA9ICJjcmVhdGVHcmFwaCIpCisJcHVibGljIFRpdGFuR3JhcGhDbGllbnQgdGl0YW5DbGllbnQoKSB7CisJCXJldHVybiBuZXcgVGl0YW5HcmFwaENsaWVudCgpOworCX0KKworCUBCZWFuKG5hbWUgPSAicmVzb3VyY2Utb3BlcmF0aW9uIikKKwlwdWJsaWMgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VPcGVyYXRpb24oKTsKKwl9CisKKwlAQmVhbihuYW1lID0gInNlcnZpY2Utb3BlcmF0aW9uIikKKwlwdWJsaWMgU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IFNlcnZpY2VPcGVyYXRpb24oKTsKKwl9CisKKwlAQmVhbihuYW1lID0gImNvbXBvbmVudC1pbnN0YW5jZS1vcGVyYXRpb24iKQorCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbigpOworCX0KKworCUBCZWFuKG5hbWUgPSAiY2FwYWJpbGl0eS1pbnN0YW5jZU9wZXJhdGlvbiIpCisJcHVibGljIENhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbiBjYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJwcm9wZXJ0eS1vcGVyYXRpb24iKQorCXB1YmxpYyBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eU9wZXJhdGlvbigpOworCX0KKworCUBCZWFuKG5hbWUgPSAiYXR0cmlidXRlLW9wZXJhdGlvbiIpCisJcHVibGljIEF0dHJpYnV0ZU9wZXJhdGlvbiBhdHRyaWJ1ZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPcGVyYXRpb24oKTsKKwl9CisKKwlAQmVhbihuYW1lID0gImFwcGxpY2F0aW9uLWRhdGF0eXBlLWNhY2hlIikKKwlwdWJsaWMgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIGFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZSgpIHsKKwkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUoKTsKKwl9CisKKwlAQmVhbihuYW1lID0gInJlcXVpcmVtZW50LW9wZXJhdGlvbiIpCisJcHVibGljIFJlcXVpcmVtZW50T3BlcmF0aW9uIHJlcXVpcmVtZW50T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IFJlcXVpcmVtZW50T3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJjYXBhYmlsaXR5LW9wZXJhdGlvbiIpCisJcHVibGljIENhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBDYXBhYmlsaXR5T3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJpbnRlcmZhY2Utb3BlcmF0aW9uIikKKwlwdWJsaWMgSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24oKTsKKwl9CisKKwlAQmVhbihuYW1lID0gImVsZW1lbnQtb3BlcmF0aW9uIikKKwlwdWJsaWMgSUVsZW1lbnRPcGVyYXRpb24gZWxlbWVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBFbGVtZW50T3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJhZGRpdGlvbmFsLWluZm9ybWF0aW9uLW9wZXJhdGlvbiIpCisJcHVibGljIElBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24gYWRkaW9BZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJjYXBhYmlsaXR5LXR5cGUtb3BlcmF0aW9uIikKKwlwdWJsaWMgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24oKTsKKwl9CisKKwlAQmVhbihuYW1lID0gImFydGlmYWN0LW9wZXJhdGlvbiIpCisJcHVibGljIEFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEFydGlmYWN0T3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJoZWF0LXBhcmFtZXRlci1vcGVyYXRpb24iKQorCXB1YmxpYyBIZWF0UGFyYW1ldGVyc09wZXJhdGlvbiBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBIZWF0UGFyYW1ldGVyc09wZXJhdGlvbigpOworCX0KKworCUBCZWFuKG5hbWUgPSAicHJvZHVjdC1vcGVyYXRpb24iKQorCXB1YmxpYyBQcm9kdWN0T3BlcmF0aW9uIHByb2R1Y3RPcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgUHJvZHVjdE9wZXJhdGlvbigpOworCX0KKworCUBCZWFuKG5hbWUgPSAibGlmZWN5Y2xlLW9wZXJhdGlvbiIpCisJcHVibGljIExpZmVjeWNsZU9wZXJhdGlvbiBsaWZlY3ljbGVPcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgTGlmZWN5Y2xlT3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJncm91cC1vcGVyYXRpb24iKQorCXB1YmxpYyBHcm91cE9wZXJhdGlvbiBncm91cE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBHcm91cE9wZXJhdGlvbigpOworCX0KKworCUBCZWFuKG5hbWUgPSAiZ3JvdXAtdHlwZS1vcGVyYXRpb24iKQorCXB1YmxpYyBHcm91cFR5cGVPcGVyYXRpb24gZ3JvdXBUeXBlT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEdyb3VwVHlwZU9wZXJhdGlvbigpOworCX0KKworCUBCZWFuKG5hbWUgPSAiYXR0cmlidXRlLW9wZXJhdGlvbiIpCisJcHVibGljIEF0dHJpYnV0ZU9wZXJhdGlvbiBhdHRyaWJ1dGVPcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgQXR0cmlidXRlT3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJ0aXRhbkZpeFV0aWxzIikKKwlwdWJsaWMgVGl0YW5GaXhVdGlscyB0aXRhbkZpeFV0aWxzKCkgeworCQlyZXR1cm4gbmV3IFRpdGFuRml4VXRpbHMoKTsKKwl9CisKKwlAQmVhbihuYW1lID0gInBvcHVsYXRlQ29tcG9uZW50Q2FjaGUiKQorCXB1YmxpYyBQb3B1bGF0ZUNvbXBvbmVudENhY2hlIHBvcHVsYXRlQ29tcG9uZW50Q2FjaGUoKSB7CisJCXJldHVybiBuZXcgUG9wdWxhdGVDb21wb25lbnRDYWNoZSgpOworCX0KKworCUBCZWFuKG5hbWUgPSAiYXJ0aWZhY3QtY2Fzc2FuZHJhLWRhbyIpCisJcHVibGljIEFydGlmYWN0Q2Fzc2FuZHJhRGFvIGFydGlmYWN0Q2Fzc2FuZHJhRGFvKCkgeworCQlyZXR1cm4gbmV3IEFydGlmYWN0Q2Fzc2FuZHJhRGFvKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJjb21wb25lbnQtY2Fzc2FuZHJhLWRhbyIpCisJcHVibGljIENvbXBvbmVudENhc3NhbmRyYURhbyBjb21wb25lbnRDYXNzYW5kcmFEYW8oKSB7CisJCXJldHVybiBuZXcgQ29tcG9uZW50Q2Fzc2FuZHJhRGFvKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJjYXNzYW5kcmEtY2xpZW50IikKKwlwdWJsaWMgQ2Fzc2FuZHJhQ2xpZW50IGNhc3NhbmRyYUNsaWVudCgpIHsKKwkJcmV0dXJuIG5ldyBDYXNzYW5kcmFDbGllbnQoKTsKKwl9CisKKwlAQmVhbihuYW1lID0gImNhY2hlTWFuZ2VyLW9wZXJhdGlvbiIpCisJcHVibGljIENhY2hlTWFuZ2VyT3BlcmF0aW9uIGNhY2hlTWFuZ2VyT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IENhY2hlTWFuZ2VyT3BlcmF0aW9uKCk7CisJfQorCisJQEJlYW4obmFtZSA9ICJjb21wb25lbnQtY2FjaGUiKQorCXB1YmxpYyBDb21wb25lbnRDYWNoZSBjb21wb25lbnRDYWNoZSgpIHsKKwkJcmV0dXJuIG5ldyBDb21wb25lbnRDYWNoZSgpOworCX0KKworCUBCZWFuKG5hbWUgPSAiaW5wdXQtb3BlcmF0aW9uIikKKwlwdWJsaWMgSW5wdXRzT3BlcmF0aW9uIGlucHV0c09wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBJbnB1dHNPcGVyYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBBdWRpdENhc3NhbmRyYURhbworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gImF1ZGl0LWNhc3NhbmRyYS1kYW8iKQorCXB1YmxpYyBBdWRpdENhc3NhbmRyYURhbyBhdWRpdENhc3NhbmRyYURhbygpIHsKKwkJcmV0dXJuIG5ldyBBdWRpdENhc3NhbmRyYURhbygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIFVzZXJCdXNpbmVzc0xvZ2ljCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAidXNlckJ1c2luZXNzTG9naWMiKQorCXB1YmxpYyBJVXNlckJ1c2luZXNzTG9naWMgdXNlckJ1c2luZXNzTG9naWMoKSB7CisJCXJldHVybiBuZXcgVXNlckJ1c2luZXNzTG9naWMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBVc2VyQWRtaW5PcGVyYXRpb24KKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJQEJlYW4obmFtZSA9ICJ1c2VyLW9wZXJhdGlvbiIpCisJcHVibGljIElVc2VyQWRtaW5PcGVyYXRpb24gdXNlck9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBVc2VyQWRtaW5PcGVyYXRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBHcmFwaExvY2tPcGVyYXRpb24KKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJQEJlYW4obmFtZSA9ICJncmFwaC1sb2NrLW9wZXJhdGlvbiIpCisJcHVibGljIElHcmFwaExvY2tPcGVyYXRpb24gZ3JhcGhMb2NrT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEdyYXBoTG9ja09wZXJhdGlvbigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIEF1ZGl0aW5nRGFvCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAiYXVkaXRpbmdEYW8iKQorCXB1YmxpYyBBdWRpdGluZ0RhbyBhdWRpdGluZ0RhbygpIHsKKwkJcmV0dXJuIG5ldyBBdWRpdGluZ0RhbygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIEF1ZGl0aW5nTWFuYWdlcgorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gImF1ZGl0aW5nTWFuYWdlciIpCisJcHVibGljIElBdWRpdGluZ01hbmFnZXIgYXVkaXRpbmdNYW5hZ2VyKCkgeworCQlyZXR1cm4gbmV3IEF1ZGl0aW5nTWFuYWdlcigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIFNlcnZpY2VCdXNpbmVzc0xvZ2ljCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAic2VydmljZUJ1c2luZXNzTG9naWMiKQorCXB1YmxpYyBTZXJ2aWNlQnVzaW5lc3NMb2dpYyBzZXJ2aWNlQnVzaW5lc3NMb2dpYygpIHsKKwkJcmV0dXJuIG5ldyBTZXJ2aWNlQnVzaW5lc3NMb2dpYygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIENvbXBvbmVudHNVdGlscworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gImNvbXBvbmVudFV0aWxzIikKKwlwdWJsaWMgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudFV0aWxzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvbmVudHNVdGlscygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIFRvc2NhQXJ0aWZhY3RzQWxpZ25tZW50CisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAidG9zY2FBcnRpZmFjdHNBbGlnbm1lbnQiKQorCXB1YmxpYyBUb3NjYUFydGlmYWN0c0FsaWdubWVudCB0b3NjYUFydGlmYWN0c0FsaWdubWVudCgpIHsKKwkJcmV0dXJuIG5ldyBUb3NjYUFydGlmYWN0c0FsaWdubWVudCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIEFydGlmYWN0c0J1c2luZXNzTG9naWMKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJQEJlYW4obmFtZSA9ICJhcnRpZmFjdEJ1c2luZXNzTG9naWMiKQorCXB1YmxpYyBBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0QnVzaW5lc3NMb2dpYygpIHsKKwkJcmV0dXJuIG5ldyBBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAicmVzb3VyY2VCdXNpbmVzc0xvZ2ljIikKKwlwdWJsaWMgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIHJlc291cmNlQnVzaW5lc3NMb2dpYygpIHsKKwkJcmV0dXJuIG5ldyBSZXNvdXJjZUJ1c2luZXNzTG9naWMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBMaWZlY3ljbGVCdXNpbmVzc0xvZ2ljCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAibGlmZWN5Y2xlQnVzaW5lc3NMb2dpYyIpCisJcHVibGljIExpZmVjeWNsZUJ1c2luZXNzTG9naWMgbGlmZWN5Y2xlQnVzaW5lc3NMb2dpYygpIHsKKwkJcmV0dXJuIG5ldyBMaWZlY3ljbGVCdXNpbmVzc0xvZ2ljKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgU2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXIKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJQEJlYW4obmFtZSA9ICJzZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlciIpCisJcHVibGljIFNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyIHNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyKCkgeworCQlyZXR1cm4gbmV3IFNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgRGlzdHJpYnV0aW9uRW5naW5lCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAiZGlzdHJpYnV0aW9uRW5naW5lIikKKwlwdWJsaWMgSURpc3RyaWJ1dGlvbkVuZ2luZSBkaXN0cmlidXRpb25FbmdpbmUoKSB7CisJCS8vIFRoaXMgZGVwZW5kZW5jeSBpcyBuZWVkZWQgZm9yIGluaXRpYWxpemluZyBjb250ZXh0IGJ1dCBpcyBub3QgdXNlZAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBFbGFzdGljU2VhcmNoQ2xpZW50CisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAiZWxhc3RpY3NlYXJjaC1jbGllbnQiKQorCXB1YmxpYyBFbGFzdGljU2VhcmNoQ2xpZW50IGVsYXN0aWNzZWFyY2hDbGllbnQoKSB7CisJCS8vIFRoaXMgZGVwZW5kZW5jeSBpcyBuZWVkZWQgZm9yIGluaXRpYWxpemluZyBjb250ZXh0IGJ1dCBpcyBub3QgdXNlZAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBQcm9kdWN0QnVzaW5lc3NMb2dpYworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gInByb2R1Y3RCdXNpbmVzc0xvZ2ljIikKKwlwdWJsaWMgUHJvZHVjdEJ1c2luZXNzTG9naWMgcHJvZHVjdEJ1c2luZXNzTG9naWMoKSB7CisJCXJldHVybiBuZXcgUHJvZHVjdEJ1c2luZXNzTG9naWMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBQcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAicHJvZHVjdENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyIpCisJcHVibGljIFByb2R1Y3RDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgcHJvZHVjdENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYygpIHsKKwkJcmV0dXJuIG5ldyBQcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgVG9zY2FFeHBvcnRIYW5kbGVyCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAidG9zY2EtZXhwb3J0LWhhbmRsZXIiKQorCXB1YmxpYyBUb3NjYUV4cG9ydEhhbmRsZXIgdG9zY2FFeHBvcnRIYW5kbGVyKCkgeworCQlyZXR1cm4gbmV3IFRvc2NhRXhwb3J0SGFuZGxlcigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIENzYXJPcGVyYXRpb24KKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJQEJlYW4obmFtZSA9ICJjc2FyLW9wZXJhdGlvbiIpCisJcHVibGljIENzYXJPcGVyYXRpb24gY3Nhck9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBDc2FyT3BlcmF0aW9uKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgT25ib2FyZGluZ0NsaWVudAorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gIm9uYm9hcmRpbmctY2xpZW50IikKKwlwdWJsaWMgT25ib2FyZGluZ0NsaWVudCBvbmJvYXJkaW5nQ2xpZW50KCkgeworCQlyZXR1cm4gbmV3IE9uYm9hcmRpbmdDbGllbnQoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBWRkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gInZmQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIikKKwlwdWJsaWMgVkZDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgdmZDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMoKSB7CisJCXJldHVybiBuZXcgVkZDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBSZXNvdXJjZUltcG9ydE1hbmFnZXIKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJQEJlYW4obmFtZSA9ICJyZXNvdXJjZUltcG9ydE1hbmFnZXIiKQorCXB1YmxpYyBSZXNvdXJjZUltcG9ydE1hbmFnZXIgcmVzb3VyY2VJbXBvcnRNYW5hZ2VyKCkgeworCQlyZXR1cm4gbmV3IFJlc291cmNlSW1wb3J0TWFuYWdlcigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIEdyb3VwQnVzaW5lc3NMb2dpYworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gImdyb3VwQnVzaW5lc3NMb2dpYyIpCisJcHVibGljIEdyb3VwQnVzaW5lc3NMb2dpYyBncm91cEJ1c2luZXNzTG9naWMoKSB7CisJCXJldHVybiBuZXcgR3JvdXBCdXNpbmVzc0xvZ2ljKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgSW5wdXRzQnVzaW5lc3NMb2dpYworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gImlucHV0c0J1c2luZXNzTG9naWMiKQorCXB1YmxpYyBJbnB1dHNCdXNpbmVzc0xvZ2ljIGlucHV0c0J1c2luZXNzTG9naWMoKSB7CisJCXJldHVybiBuZXcgSW5wdXRzQnVzaW5lc3NMb2dpYygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIENvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gImNvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYyIpCisJcHVibGljIENvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYyBjb21wb3NpdGlvbkJ1c2luZXNzTG9naWMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgQ3NhclV0aWxzCisJICogCisJICogQHJldHVybgorCSAqLworCUBCZWFuKG5hbWUgPSAiY3Nhci11dGlscyIpCisJcHVibGljIENzYXJVdGlscyBjc2FyVXRpbHMoKSB7CisJCXJldHVybiBuZXcgQ3NhclV0aWxzKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgU2VydmljZUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAQmVhbihuYW1lID0gInNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMiKQorCXB1YmxpYyBTZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIHNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMoKSB7CisJCXJldHVybiBuZXcgU2VydmljZUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9EZXJpdmVkRnJvbUFsaWdubWVudC5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9EZXJpdmVkRnJvbUFsaWdubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZGRjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0Rlcml2ZWRGcm9tQWxpZ25tZW50LmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLm1pZ3JhdGlvbi52MTYwNDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBEZXJpdmVkRnJvbUFsaWdubWVudCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFZmY05hbWluZ0FsaWdubWVudC5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBuZXdEZXJpdmVkRnJvbVZhbHVlc0hNID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCisJcHVibGljIGJvb2xlYW4gYWxpZ25EZXJpdmVkRnJvbTE2MDQoU3RyaW5nIGFwcENvbmZpZ0RpciwgU3RyaW5nIGRhdGFJbnB1dEZpbGVEaXIpIHsKKwkJbG9nLmRlYnVnKCJTdGFydGVkIGFsaWduRGVyaXZlZEZyb20xNjA0IHByb2NlZHVyZS4uIik7CisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCXRyeSB7CisJCQlpZiAoIWdldERlcml2ZWRGcm9tVmFsdWVzRnJvbUZpbGUoZGF0YUlucHV0RmlsZURpcikpIHsKKwkJCQlsb2cuZXJyb3IoIlN0YXJ0ZWQgYWxpZ25EZXJpdmVkRnJvbTE2MDQgcHJvY2VkdXJlIHdhcyBmYWlsZWQuIE1pc3NpbmcgZGF0YSBpbiB0aGUgaW5wdXQgZGF0YSBmaWxlLiIpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlyZXN1bHQgPSBjaGFuZ2VEZXJpdmVkRnJvbSgpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKCFyZXN1bHQpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQlsb2cuZGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKKwkJCQlsb2cuZGVidWcoImFsaWduRGVyaXZlZEZyb20xNjA0IHByb2NlZHVyZSBGQUlMRUQhISIpOworCQkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworCQkJfSBlbHNlIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQkJbG9nLmRlYnVnKCJhbGlnbkRlcml2ZWRGcm9tMTYwNCBwcm9jZWR1cmUgZW5kZWQgc3VjY2Vzc2Z1bGx5ISIpOworCQkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoYW5nZURlcml2ZWRGcm9tKCkgeworCQlNYXA8U3RyaW5nLCBSZXNvdXJjZU1ldGFkYXRhRGF0YT4gcmVzb3VyY2VzSE0gPSBnZXRMYXRlc3RWZXJzaW9uc09mUmVzb3VyY2VzKCk7CisJCWlmIChyZXNvdXJjZXNITSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlNYXA8U3RyaW5nLCBSZXNvdXJjZU1ldGFkYXRhRGF0YT4gZGVyaXZlZEZyb21SZXNvdXJjZXNITSA9IGdldExhdGVzdENlcnRpZmllZFZlcnNpb25zT2ZEZXJpdmVkRnJvbVJlc291cmNlcygpOworCQlpZiAoZGVyaXZlZEZyb21SZXNvdXJjZXNITSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdXBkYXRlRWRnZXMocmVzb3VyY2VzSE0sIGRlcml2ZWRGcm9tUmVzb3VyY2VzSE0pOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVFZGdlcyhNYXA8U3RyaW5nLCBSZXNvdXJjZU1ldGFkYXRhRGF0YT4gcmVzb3VyY2VzSE0sCisJCQlNYXA8U3RyaW5nLCBSZXNvdXJjZU1ldGFkYXRhRGF0YT4gZGVyaXZlZEZyb21SZXNvdXJjZXNITSkgeworCQlsb2cuZGVidWcoIlVwZGF0aW5nIG9mIEVkZ2VzIGhhcyBiZWVuIHN0YXJ0ZWQuLiIpOworCQlmb3IgKEVudHJ5PFN0cmluZywgUmVzb3VyY2VNZXRhZGF0YURhdGE+IHBhaXIgOiByZXNvdXJjZXNITS5lbnRyeVNldCgpKSB7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSBjdXJSZXNvdXJjZSA9IHBhaXIuZ2V0VmFsdWUoKTsKKwkJCVN0cmluZyB1bmlxZUlEID0gKFN0cmluZykgY3VyUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50UmVzb3VyY2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHVuaXFlSUQsCisJCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAocGFyZW50UmVzb3VyY2VSZXMuaXNMZWZ0KCkpIHsKKwkJCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHZhbHVlID0gcGFyZW50UmVzb3VyY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcGFyZW50UmVzb3VyY2VEYXRhID0gdmFsdWUuZ2V0S2V5KCk7CisJCQkJbG9nLmRlYnVnKCJEZWxldGluZyBvbGQgcmVsYXRpb24uLiIpOworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRpbmdSZWxhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkJLmRlbGV0ZVJlbGF0aW9uKGN1clJlc291cmNlLCBwYXJlbnRSZXNvdXJjZURhdGEsIEdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00pOworCQkJCWlmIChkZWxldGluZ1JlbGF0aW9uUmVzLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkNvdWxkbid0IGRlbGV0ZSByZWxhdGlvbiBmcm9tIHJlc291cmNlIHt9IHRvIHJlc291cmNlIHt9LCBlcnJvcjoge30iLAorCQkJCQkJCWN1clJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksCisJCQkJCQkJcGFyZW50UmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksCisJCQkJCQkJZGVsZXRpbmdSZWxhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhIG5ld0Rlcml2ZWRGcm9tUmVzb3VyY2UgPSBkZXJpdmVkRnJvbVJlc291cmNlc0hNLmdldChwYWlyLmdldEtleSgpKTsKKwkJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0aW5nUmVsYXRpb25SZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJCS5jcmVhdGVSZWxhdGlvbihjdXJSZXNvdXJjZSwgbmV3RGVyaXZlZEZyb21SZXNvdXJjZSwgR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgbnVsbCk7CisJCQkJaWYgKGNyZWF0aW5nUmVsYXRpb25SZXMuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiQ291bGRuJ3QgY3JlYXRlIHJlbGF0aW9uIGZyb20gcmVzb3VyY2Uge30gdG8gcmVzb3VyY2Uge30sIGVycm9yOiB7fSIsCisJCQkJCQkJY3VyUmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwKKwkJCQkJCQluZXdEZXJpdmVkRnJvbVJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksCisJCQkJCQkJY3JlYXRpbmdSZWxhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsb2cuZXJyb3IoIkNvdWxkbid0IGdldCBkZXJpdmVkIGZyb20gcmVzb3VyY2UgZm9yIGNoaWxkIHJlc291cmNlIHt9LCBlcnJvcjoge30iLCBwYWlyLmdldEtleSgpLAorCQkJCQkJcGFyZW50UmVzb3VyY2VSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXNvdXJjZU1ldGFkYXRhRGF0YT4gZ2V0TGF0ZXN0Q2VydGlmaWVkVmVyc2lvbnNPZkRlcml2ZWRGcm9tUmVzb3VyY2VzKCkgeworCQlsb2cuZGVidWcoIkdldHRpbmcgbGF0ZXN0IGNlcnRpZmllZCB2ZXJzaW9ucyBvZiBkZXJpdmVkIGZyb20gcmVzb3VyY2VzIGFjY29yZGluZyBpbnB1dCBmaWxlIik7CisJCU1hcDxTdHJpbmcsIFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZXNITSA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VNZXRhZGF0YURhdGE+KCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBudWxsOworCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBwYWlyIDogbmV3RGVyaXZlZEZyb21WYWx1ZXNITS5lbnRyeVNldCgpKSB7CisJCQlwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVE9TQ0FfUkVTT1VSQ0VfTkFNRS5nZXRQcm9wZXJ0eSgpLCBwYWlyLmdldFZhbHVlKCkpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCksIHRydWUpOworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaGlnaGVzdFZlcnNpb25SZXNvdXJjZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAoaGlnaGVzdFZlcnNpb25SZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkNvdWxkbid0IGdldCByZXNvdXJjZSB7fSBmcm9tIERCLCBlcnJvcjoge30iLCBwYWlyLmdldFZhbHVlKCksCisJCQkJCQloaWdoZXN0VmVyc2lvblJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBoaWdoZXN0VmVyc2lvblJlc291cmNlQUwgPSBoaWdoZXN0VmVyc2lvblJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKGhpZ2hlc3RWZXJzaW9uUmVzb3VyY2VBTCA9PSBudWxsKSB7CisJCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgcmVzb3VyY2Uge30uIE5vIHJlc291cmNlIGZvdW5kIiwgcGFpci5nZXRWYWx1ZSgpKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlID0gaGlnaGVzdFZlcnNpb25SZXNvdXJjZUFMLmdldCgwKTsKKwkJCVN0cmluZyBzdGF0ZSA9IHJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRTdGF0ZSgpOworCQkJaWYgKCFzdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpKSB7CisJCQkJbG9nLmVycm9yKAorCQkJCQkJImFsaWduRGVyaXZlZEZyb20xNjA0IHByb2NlZHVyZSBGQUlMRUQhISBEZXJpdmVkIGZyb20gcmVzb3VyY2Uge30gaXMgbm90IGNlcnRpZmllZC4gUGxlYXNlIGNlcnRpZnkgbWFudWFsbHkgYW5kIHJlcGVhdCB0aGUgcHJvY2VkdXJlLiIsCisJCQkJCQlwYWlyLmdldFZhbHVlKCkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmVzb3VyY2VzSE0ucHV0KHBhaXIuZ2V0S2V5KCksIHJlc291cmNlKTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VzSE07CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXNvdXJjZU1ldGFkYXRhRGF0YT4gZ2V0TGF0ZXN0VmVyc2lvbnNPZlJlc291cmNlcygpIHsKKwkJbG9nLmRlYnVnKCJHZXR0aW5nIGxhdGVzdCB2ZXJzaW9ucyBvZiByZXNvdXJjZXMgYWNjb3JkaW5nIGlucHV0IGZpbGUiKTsKKwkJTWFwPFN0cmluZywgUmVzb3VyY2VNZXRhZGF0YURhdGE+IHJlc291cmNlc0hNID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXNvdXJjZU1ldGFkYXRhRGF0YT4oKTsKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgZm91bmRSZXNvdXJjZSA9IG51bGw7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBudWxsOworCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBwYWlyIDogbmV3RGVyaXZlZEZyb21WYWx1ZXNITS5lbnRyeVNldCgpKSB7Ly8gZmlsdGVyCisJCQlwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBwYWlyLmdldEtleSgpKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaGlnaGVzdFZlcnNpb25SZXNvdXJjZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAoaGlnaGVzdFZlcnNpb25SZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkNvdWxkbid0IGdldCByZXNvdXJjZSB7fSBmcm9tIERCLCBlcnJvcjoge30iLCBwYWlyLmdldEtleSgpLAorCQkJCQkJaGlnaGVzdFZlcnNpb25SZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gaGlnaGVzdFZlcnNpb25SZXNvdXJjZUFMID0gaGlnaGVzdFZlcnNpb25SZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChoaWdoZXN0VmVyc2lvblJlc291cmNlQUwgPT0gbnVsbCkgeworCQkJCWxvZy5lcnJvcigiQ291bGRuJ3QgZ2V0IHJlc291cmNlIHt9LiBObyByZXNvdXJjZSBmb3VuZCIsIHBhaXIuZ2V0S2V5KCkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKGhpZ2hlc3RWZXJzaW9uUmVzb3VyY2VBTC5zaXplKCkgPiAyKSB7CisJCQkJbG9nLmVycm9yKCJJbnZhbGlkIHJlc3BvbnNlLiBGb3VuZCBtb3JlIHRoYW4gdHdvIGhpZ2hlc3QgdmVyc2lvbiByZXNvdXJjZXMgd2l0aCBuYW1lIHt9LiIsCisJCQkJCQlwYWlyLmdldEtleSgpKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWZvdW5kUmVzb3VyY2UgPSBoaWdoZXN0VmVyc2lvblJlc291cmNlQUwuZ2V0KDApOworCQkJaWYgKGhpZ2hlc3RWZXJzaW9uUmVzb3VyY2VBTC5zaXplKCkgPT0gMikgeworCQkJCWZvdW5kUmVzb3VyY2UgPSBmb3VuZFJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRTdGF0ZSgpCisJCQkJCQkuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKSA/IGhpZ2hlc3RWZXJzaW9uUmVzb3VyY2VBTC5nZXQoMSkgOiBmb3VuZFJlc291cmNlOworCQkJfQorCQkJcmVzb3VyY2VzSE0ucHV0KHBhaXIuZ2V0S2V5KCksIGZvdW5kUmVzb3VyY2UpOworCQl9CisJCXJldHVybiByZXNvdXJjZXNITTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gZ2V0RGVyaXZlZEZyb21WYWx1ZXNGcm9tRmlsZShTdHJpbmcgZGF0YUlucHV0RmlsZURpcikgeworCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7CisJCVN0cmluZyBjdXJQYWlyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGRhdGFJbnB1dEZpbGVEaXIpKTsKKwkJCXdoaWxlICgoY3VyUGFpciA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlTdHJpbmdbXSBwYWlyID0gY3VyUGFpci5zcGxpdCgiICIpOworCQkJCWlmIChwYWlyLmxlbmd0aCA8IDIpIHsKKwkJCQkJbG9nLmVycm9yKAorCQkJCQkJCSJFeHBlY3RlZCBhdCBsZWFzdCB0d28gdG9rZW5zIGluIGV2ZXJ5IGxpbmUuIFVzYWdlOiA8cmVzb3VyY2VfbmFtZT4gPG5ld19kZXJpdmVkX2Zyb21fbmFtZT4iKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlTdHJpbmcgZGVyaXZlZEZyb20gPSBwYWlyW3BhaXIubGVuZ3RoIC0gMV07CisJCQkJU3RyaW5nIG5hbWUgPSBjdXJQYWlyLnN1YnN0cmluZygwLCBjdXJQYWlyLmxlbmd0aCgpIC0gZGVyaXZlZEZyb20ubGVuZ3RoKCkgLSAxKTsKKwkJCQluZXdEZXJpdmVkRnJvbVZhbHVlc0hNLnB1dChuYW1lLCBkZXJpdmVkRnJvbSk7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiU3RhcnRlZCBhbGlnbkRlcml2ZWRGcm9tMTYwNCBwcm9jZWR1cmUgd2FzIGZhaWxlZC4gTWlzc2luZyBpbnB1dCBkYXRhIGZpbGUuIiwgZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiU3RhcnRlZCBhbGlnbkRlcml2ZWRGcm9tMTYwNCBwcm9jZWR1cmUgd2FzIGZhaWxlZC4gVGhlIGlucHV0IGRhdGEgZmlsZSBpcyBlbXB0eS4iLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChiciAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJYnIuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNsb3NlIGZpbGUgcmVhZGVyIiwgZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L0dyb3Vwc0FsaWdubWVudC5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9Hcm91cHNBbGlnbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWJjZGRmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9Hcm91cHNBbGlnbm1lbnQuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjA0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdyb3VwRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBcnRpZmFjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JR3JvdXBPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuR3JvdXBUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5VbmlxdWVJZEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBHcm91cHNBbGlnbm1lbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlcnZpY2VNaWdyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSVRJQUxfVkVSU0lPTiA9ICIxLjAiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0dST1VQX1ZGX01PRFVMRSA9ICJvcmcub3BlbmVjb21wLmdyb3Vwcy5WZk1vZHVsZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRSA9ICI6Om1vZHVsZS0iOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgSUFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uOworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgSUdyb3VwT3BlcmF0aW9uIGdyb3VwT3BlcmF0aW9uOworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgR3JvdXBUeXBlT3BlcmF0aW9uIGdyb3VwVHlwZU9wZXJhdGlvbjsKKworCXB1YmxpYyBib29sZWFuIGFsaWduR3JvdXBzKFN0cmluZyBhcHBDb25maWdEaXIpIHsKKworCQlsb2cuZGVidWcoIlN0YXJ0ZWQgdGhlIGFsaWduIGdyb3VwcyBwcm9jZWR1cmUgLi4uIik7CisJCWxvZy5kZWJ1ZygiR2V0dGluZyBhbGwgcmVzb3VyY2VzIHdpdGggcmVzb3VyY2VzIik7CisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCXRyeSB7CisKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCXByb3BlcnRpZXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxWZlJlc291cmNlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BlcnRpZXMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQkJaWYgKGFsbFZmUmVzb3VyY2VzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiQ291bGRuJ3QgZ2V0IFZGIHJlc291cmNlcyBmcm9tIERCLCBlcnJvcjoge30iLCBhbGxWZlJlc291cmNlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZXNMaXN0ID0gYWxsVmZSZXNvdXJjZXMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAocmVzb3VyY2VzTGlzdCA9PSBudWxsKSB7CisJCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgVkYgcmVzb3VyY2VzIGZyb20gREIsIG5vIHJlc291cmNlcyBmb3VuZCIpOworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlsb2cuZGVidWcoIkZvdW5kIHt9IFZGIHJlc291cmNlcyIsIHJlc291cmNlc0xpc3Quc2l6ZSgpKTsKKwkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2UgOiByZXNvdXJjZXNMaXN0KSB7CisJCQkJcmVzdWx0ID0gY3JlYXRlR3JvdXBJZkNvbnRhaW5zQXJ0aWZhY3RzKHJlc291cmNlKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmICghcmVzdWx0KSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQkJbG9nLmRlYnVnKCJUaGUgYWxpZ24gZ3JvdXBzIHByb2NlZHVyZSBGQUlMRUQhISIpOworCQkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworCQkJfSBlbHNlIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQkJbG9nLmRlYnVnKCJUaGUgYWxpZ24gZ3JvdXBzIHByb2NlZHVyZSBlbmRlZCBzdWNjZXNzZnVsbHkhIik7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVHcm91cElmQ29udGFpbnNBcnRpZmFjdHMoUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2UpIHsKKworCQlTdHJpbmcgdW5pcXVlSWQgPSByZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQlFaXRoZXI8TWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWxsQXJ0aWZhY3RzUmVzID0gYXJ0aWZhY3RPcGVyYXRpb24KKwkJCQkuZ2V0QXJ0aWZhY3RzKHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUpOworCQlpZiAoYWxsQXJ0aWZhY3RzUmVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgcmVzb3VyY2UgYXJ0aWZhY3RzIGZyb20gREIsIGVycm9yOiB7fSIsIGFsbEFydGlmYWN0c1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzSE0gPSBhbGxBcnRpZmFjdHNSZXMubGVmdCgpLnZhbHVlKCk7CisJCUFycmF5TGlzdDxTdHJpbmc+IGZvdW5kQXJ0aWZhY3RzQUwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gY3VyQXJ0aWZhY3QgOiBhcnRpZmFjdHNITS52YWx1ZXMoKSkgeworCQkJU3RyaW5nIGF0cmlmYWN0VHlwZSA9IGN1ckFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpOworCQkJaWYgKGF0cmlmYWN0VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9WT0wuZ2V0VHlwZSgpKQorCQkJCQl8fCBhdHJpZmFjdFR5cGUuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVULmdldFR5cGUoKSkKKwkJCQkJfHwgYXRyaWZhY3RUeXBlLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSkpIHsKKwkJCQlmb3VuZEFydGlmYWN0c0FMLmFkZChjdXJBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJCX0KKwkJfQorCQlpZiAoZm91bmRBcnRpZmFjdHNBTC5zaXplKCkgPiAwKSB7CisJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsR3JvdXBzUmVzID0gZ3JvdXBPcGVyYXRpb24KKwkJCQkJLmdldEFsbEdyb3Vwc0Zyb21HcmFwaCh1bmlxdWVJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJCWludCBncm91cENvdW50ZXIgPSAxOworCQkJaWYgKGFsbEdyb3Vwc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQlpZiAoYWxsR3JvdXBzUmVzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LLm5hbWUoKSkKKwkJCQkJCXx8IGFsbEdyb3Vwc1Jlcy5yaWdodCgpLnZhbHVlKCkubmFtZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQubmFtZSgpKSkgeworCQkJCQlsb2cuZGVidWcoIk5vdCBmb3VuZCBncm91cHMgcmVzb3VyY2UgcmVsYXRlZCB0byByZXNvdXJjZSB7fSwgcmVzcG9uc2U6IHt9IiwKKwkJCQkJCQlyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpLCBhbGxHcm91cHNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZXJyb3IoIk5vdCBmb3VuZCBncm91cHMgcmVzb3VyY2UgcmVsYXRlZCB0byByZXNvdXJjZSB7fSwgREIgZXJyb3I6IHt9IiwKKwkJCQkJCQlyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpLCBhbGxHcm91cHNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYWxsR3JvdXBzUmVzLmxlZnQoKS52YWx1ZSgpICE9IG51bGwgJiYgYWxsR3JvdXBzUmVzLmxlZnQoKS52YWx1ZSgpLnNpemUoKSA+IDApIHsKKwkJCQlncm91cENvdW50ZXIgKz0gYWxsR3JvdXBzUmVzLmxlZnQoKS52YWx1ZSgpLnNpemUoKTsKKwkJCQlmb3IgKEdyb3VwRGVmaW5pdGlvbiBjdXJHcm91cCA6IGFsbEdyb3Vwc1Jlcy5sZWZ0KCkudmFsdWUoKSkgeworCQkJCQlmb3IgKFN0cmluZyBjdXJHcm91cEFydGlmYWN0IDogY3VyR3JvdXAuZ2V0QXJ0aWZhY3RzKCkpIHsKKwkJCQkJCWlmIChmb3VuZEFydGlmYWN0c0FMLmNvbnRhaW5zKGN1ckdyb3VwQXJ0aWZhY3QpKSB7CisJCQkJCQkJZm91bmRBcnRpZmFjdHNBTC5yZW1vdmUoY3VyR3JvdXBBcnRpZmFjdCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoZm91bmRBcnRpZmFjdHNBTC5zaXplKCkgPiAwKSB7CisJCQkJR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA9IG5ldyBHcm91cERlZmluaXRpb24oKTsKKwkJCQlncm91cERlZmluaXRpb24uc2V0TmFtZShyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpICsgTU9EVUxFICsgZ3JvdXBDb3VudGVyKTsKKwkJCQlncm91cERlZmluaXRpb24uc2V0VHlwZShERUZBVUxUX0dST1VQX1ZGX01PRFVMRSk7CisJCQkJZ3JvdXBEZWZpbml0aW9uLnNldEFydGlmYWN0cyhmb3VuZEFydGlmYWN0c0FMKTsKKwkJCQlsb2cuZGVidWcoIkNyZWF0aW5nIG5ldyBncm91cCB7fSBmb3IgVkYgcmVzb3VyY2Uge30iLCBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLAorCQkJCQkJcmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisJCQkJcmV0dXJuIGNyZWF0ZUdyb3VwKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBncm91cERlZmluaXRpb24pOworCisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUdyb3VwKE9iamVjdCB1bmlxdWVJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbikgeworCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0gPSBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisJCVN0cmluZyBncm91cFR5cGUgPSBncm91cERlZmluaXRpb24uZ2V0VHlwZSgpOworCisJCUVpdGhlcjxHcm91cFR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRHcm91cFR5cGVSZXMgPSBncm91cFR5cGVPcGVyYXRpb24KKwkJCQkuZ2V0TGF0ZXN0R3JvdXBUeXBlQnlUeXBlKGdyb3VwVHlwZSwgdHJ1ZSk7CisJCWlmIChnZXRHcm91cFR5cGVSZXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoIkNvdWxkbid0IGdldCBncm91cHR5cGUgYnkgdHlwZSB7fSBmcm9tIERCLCBlcnJvcjoge30iLCBncm91cFR5cGUsCisJCQkJCWdldEdyb3VwVHlwZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGVEZWZpbml0aW9uID0gZ2V0R3JvdXBUeXBlUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCVN0cmluZyBpbnZhcmlhbnRVVUlEID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkSW52YXJpYW50VVVJRCgpOworCQlncm91cERlZmluaXRpb24uc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKwkJZ3JvdXBEZWZpbml0aW9uLnNldFZlcnNpb24oSU5JVElBTF9WRVJTSU9OKTsKKwkJZ3JvdXBEZWZpbml0aW9uLnNldFR5cGVVaWQoZ3JvdXBUeXBlRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRHcm91cFRvR3JhcGhSZXMgPSBncm91cE9wZXJhdGlvbi5hZGRHcm91cChub2RlVHlwZUVudW0sCisJCQkJKFN0cmluZykgdW5pcXVlSWQsIGdyb3VwRGVmaW5pdGlvbiwgdHJ1ZSk7CisKKwkJaWYgKGFkZEdyb3VwVG9HcmFwaFJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiQ291bGRuJ3QgYWRkIGdyb3VwIHt9IHRvIGdyYXBoLCBlcnJvcjoge30iLCBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLAorCQkJCQlhZGRHcm91cFRvR3JhcGhSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlsb2cuZGVidWcoIlRoZSBncm91cCB7fSBoYXMgYmVlbiBjcmVhdGVkIiwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9NaWdyYXRpb25DYXRlZ29yeS5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9NaWdyYXRpb25DYXRlZ29yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDVmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L01pZ3JhdGlvbkNhdGVnb3J5LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjA0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY2F0ZWdvcnkuQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIE1pZ3JhdGlvbkNhdGVnb3J5IGV4dGVuZHMgQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgb2xkTmFtZTsKKworCUxpc3Q8TWlncmF0aW9uU3ViQ2F0ZWdvcnk+IHN1YmNhdGVnb3JpZXM7CisKKwlwdWJsaWMgU3RyaW5nIGdldE9sZE5hbWUoKSB7CisJCXJldHVybiBvbGROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9sZE5hbWUoU3RyaW5nIG9sZE5hbWUpIHsKKwkJdGhpcy5vbGROYW1lID0gb2xkTmFtZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxNaWdyYXRpb25TdWJDYXRlZ29yeT4gZ2V0U3ViY2F0ZWdvcmllcygpIHsKKwkJcmV0dXJuIHN1YmNhdGVnb3JpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3ViY2F0ZWdvcmllcyhMaXN0PE1pZ3JhdGlvblN1YkNhdGVnb3J5PiBzdWJjYXRlZ29yaWVzKSB7CisJCXRoaXMuc3ViY2F0ZWdvcmllcyA9IHN1YmNhdGVnb3JpZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L01pZ3JhdGlvblN1YkNhdGVnb3J5LmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L01pZ3JhdGlvblN1YkNhdGVnb3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4ODY2MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MDQvTWlncmF0aW9uU3ViQ2F0ZWdvcnkuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIE1pZ3JhdGlvblN1YkNhdGVnb3J5IGV4dGVuZHMgU3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgb2xkTmFtZTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0T2xkTmFtZSgpIHsKKwkJcmV0dXJuIG9sZE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0T2xkTmFtZShTdHJpbmcgb2xkTmFtZSkgeworCQl0aGlzLm9sZE5hbWUgPSBvbGROYW1lOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9TZXJ2aWNlTWlncmF0aW9uLmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA0L1NlcnZpY2VNaWdyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdmMDVkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9TZXJ2aWNlTWlncmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNzAzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uZmlsZS5GaWxlcy5yZWFkQWxsQnl0ZXM7CitpbXBvcnQgc3RhdGljIGphdmEubmlvLmZpbGUuUGF0aHMuZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWRnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuUmVsYXRpb25FbmRQb2ludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkNvbXBvbmVudEluc3RhbmNlRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk9yaWdpblR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5BZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Db21wb25lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkxpZmVjeWNsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvZHVjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5TZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5VbmlxdWVJZEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50SW5zdGFuY2VEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudE1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9kdWN0TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlbGF0aW9uc2hpcEluc3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlcXVpcmVtZW50RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5TZXJ2aWNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlRhZ0RhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51dGlscy5Db21tb25CZVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5FZGdlOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlTWlncmF0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PUk1BVElWRV9PTERfTkFNRVMgPSB7IAorCQkJInRvc2NhLm5vZGVzLm5ldHdvcmsuTmV0d29yayIsICJ0b3NjYS5ub2Rlcy5uZXR3b3JrLlBvcnQiLAorCQkJInRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZSIsICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwgInRvc2NhLm5vZGVzLkNvbnRhaW5lci5BcHBsaWNhdGlvbiIsCisJCQkidG9zY2Eubm9kZXMuQ29udGFpbmVyLlJ1bnRpbWUiLCAidG9zY2Eubm9kZXMuRGF0YWJhc2UiLCAidG9zY2Eubm9kZXMuREJNUyIsICJ0b3NjYS5ub2Rlcy5Mb2FkQmFsYW5jZXIiLAorCQkJInRvc2NhLm5vZGVzLk9iamVjdFN0b3JhZ2UiLCAidG9zY2Eubm9kZXMuUm9vdCIsICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCIsCisJCQkidG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24iLCAidG9zY2Eubm9kZXMuV2ViU2VydmVyIiwgfTsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTZXJ2aWNlTWlncmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFNlcnZpY2VPcGVyYXRpb24gc2VydmljZU9wZXJhdGlvbjsKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFByb2R1Y3RPcGVyYXRpb24gcHJvZHVjdE9wZXJhdGlvbjsKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIExpZmVjeWNsZU9wZXJhdGlvbiBsaWZlY3ljbGVPcGVyYWlvbjsKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uIGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbjsKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uIGNvbXBvbmVudEluc3RhbmNlT3BlcmFpb247CisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBJRWxlbWVudE9wZXJhdGlvbiBlbGVtZW50T3BlcmF0aW9uOworCisJcHVibGljIGJvb2xlYW4gbWlncmF0ZTE2MDJ0bzE2MDQoU3RyaW5nIGFwcENvbmZpZ0RpcikgeworCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisKKwkJdHJ5IHsKKworCQkJaWYgKCFhZGRSZXNvdXJjZUNvdW50ZXJUb1Jlc291cmNlcygpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIHJlc291cmNlIGluc3RhbmNlIGNvdW50ZXIgb24gcmVzb3VyY2VzIik7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWlmICghdXBkYXRlQ29tcG9uZW50SW5zdGFuY2VUeXBlKCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgY29tcG9uZW50IGluc3RhbmNlIHR5cGUiKTsKKwkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJLy8gZml4IFZGCisJCQlpZiAoIWZpeERlcml2ZWRWZigpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZml4IFZGcyIpOworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQkvLyB1cGRhdGUgaW5zdGFuY2VzIGFuZCByZWxhdGlvbgorCQkJaWYgKCF1cGRhdGVDYWxjdWxhdGVkRWRnZXMoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBjYWxjdWxhdGVkIGVkZ2VzIGZvciBWRiBpbnN0YW5jZXMiKTsKKwkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJLy8gdXBkYXRlIGluc3RhbmNlcyBhbmQgcmVsYXRpb24KKwkJCWlmICghdXBkYXRlUmVsYXRpb25zKCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgSW5zdGFuY2UgQW5kIFJlbGF0aW9ucyBpbiBzZXJ2aWNlcyIpOworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlpZiAoIXVwZGF0ZUNhdGVnb3JpZXMoYXBwQ29uZmlnRGlyKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBjYXRlZ29yaWVzIik7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJaWYgKCFBbGxvd011bHRpcGxlSGVhdHMucmVtb3ZlQW5kVXBkYXRlSGVhdFBsYWNlSG9sZGVycyh0aXRhbkdlbmVyaWNEYW8sIGxvZywgdHJ1ZSkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgaGVhdCBwbGFjZSBob2xkZXJzIik7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJaWYgKCFBZGRHcm91cFV1aWQuYWRkR3JvdXBVdWlkcyh0aXRhbkdlbmVyaWNEYW8sIGxvZywgdHJ1ZSkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgZ3JvdXAgVVVJRHMiKTsKKwkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSB0cnVlOworCQl9IGZpbmFsbHkgeworCQkJaWYgKCFyZXN1bHQpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0gZWxzZSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUNhdGVnb3JpZXMoU3RyaW5nIGFwcENvbmZpZ0RpcikgeworCQkvLyBTdHJpbmcgY2F0ZWdvcnlNaWdyYXRpb25GaWxlID0gYXBwQ29uZmlnRGlyICsgRmlsZS5zZXBhcmF0b3IgKworCQkvLyAiY2F0ZWdvcnlNaWdyYXRpb24ueWFtbCI7CisJCVN0cmluZyBjYXRlZ29yeU1pZ3JhdGlvbkZpbGUgPSBhcHBDb25maWdEaXIgKyAiY2F0ZWdvcnlNaWdyYXRpb24ueWFtbCI7CisKKwkJTWFwPFN0cmluZywgTGlzdDxNaWdyYXRpb25DYXRlZ29yeT4+IGNhdGVnb3JpZXNGcm9tWW1sOworCQl0cnkgeworCQkJY2F0ZWdvcmllc0Zyb21ZbWwgPSBjcmVhdGVDYXRlZ29yaWVzRnJvbVltbChjYXRlZ29yeU1pZ3JhdGlvbkZpbGUpOworCQkJaWYgKGNhdGVnb3JpZXNGcm9tWW1sID09IG51bGwgfHwgY2F0ZWdvcmllc0Zyb21ZbWwuaXNFbXB0eSgpKSB7CisJCQkJbG9nLmRlYnVnKCJ1cGRhdGVDYXRlZ29yaWVzIGZhaWxlZCB0byBsb2FkIGNhdGVnb3JpZXMgZm9ybSBtaWdyYXRpb24gZmlsZSB7fSIsIGNhdGVnb3J5TWlncmF0aW9uRmlsZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gbG9hZCBjYXRlZ29yeSBtaWdyYXRpb24gZmlsZSA6e30gZXJyb3I6IHt9IixjYXRlZ29yeU1pZ3JhdGlvbkZpbGUsIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxNaWdyYXRpb25DYXRlZ29yeT4+IGVudHJ5IDogY2F0ZWdvcmllc0Zyb21ZbWwuZW50cnlTZXQoKSkgeworCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShlbnRyeS5nZXRLZXkoKSk7CisJCQlpZiAoY29tcG9uZW50VHlwZSAhPSBudWxsKSB7CisJCQkJc3dpdGNoIChjb21wb25lbnRUeXBlKSB7CisJCQkJY2FzZSBSRVNPVVJDRToKKwkJCQkJaWYgKHVwZGF0ZVJlc291cmNlQ2F0ZWdvcmllcyhlbnRyeS5nZXRWYWx1ZSgpKSA9PSBmYWxzZSkgeworCQkJCQkJbG9nLmRlYnVnKCJ1cGRhdGVDYXRlZ29yaWVzIGZhaWxlZCB0byB1cGRhdGUgcmVzb3VyY2UgY2F0ZWdvcmllcyIpOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0VSVklDRToKKwkJCQkJaWYgKHVwZGF0ZVNlcnZpY2VDYXRlZ29yaWVzKGVudHJ5LmdldFZhbHVlKCkpID09IGZhbHNlKSB7CisJCQkJCQlsb2cuZGVidWcoInVwZGF0ZUNhdGVnb3JpZXMgZmFpbGVkIHRvIHVwZGF0ZSBzZXJ2aWNlIGNhdGVnb3JpZXMiKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlsb2cuZGVidWcoInVwZGF0ZUNhdGVnb3JpZXMgbm8gY2hhbmdlcyBmb3IgY2F0ZWdvcmllcyBmcm9tIHR5cGUge30iLCBjb21wb25lbnRUeXBlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygidXBkYXRlQ2F0ZWdvcmllcyBmYWlsZWQgbm90IHN1cHBvcnRlZCBjb21wb25lbnQgZmlsZSBpbiBtaWdyYXRpb24gY2F0ZWdvcmllcyBmaWxlIHt9IiwgZW50cnkuZ2V0S2V5KCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdXBkYXRlU2VydmljZUNhdGVnb3JpZXMoTGlzdDxNaWdyYXRpb25DYXRlZ29yeT4gY2F0ZWdvcmllcykgeworCQlsb2cuZGVidWcoInVwZGF0ZVNlcnZpY2VDYXRlZ29yaWVzIFNUQVJURUQiKTsKKwkJRWl0aGVyPExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBzZXJ2aWNlQ2F0ZWdvcmllcyA9IGVsZW1lbnRPcGVyYXRpb24KKwkJCQkuZ2V0QWxsQ2F0ZWdvcmllcyhOb2RlVHlwZUVudW0uU2VydmljZU5ld0NhdGVnb3J5LCB0cnVlKTsKKwkJaWYgKHNlcnZpY2VDYXRlZ29yaWVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVTZXJ2aWNlQ2F0ZWdvcmllcyBmYWlsZWQgZmV0Y2ggYWxsIHNlcnZpY2UgY2F0ZWdvcmllcyAsZXJyb3I6IHt9Iiwgc2VydmljZUNhdGVnb3JpZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlmb3IgKE1pZ3JhdGlvbkNhdGVnb3J5IG5ld0NhdCA6IGNhdGVnb3JpZXMpIHsKKworCQkJaWYgKG5ld0NhdC5nZXRPbGROYW1lKCkgPT0gbnVsbCkgeworCQkJCS8vIGFkZCBuZXcKKwkJCQlib29sZWFuIGV4aXN0ID0gZmFsc2U7CisJCQkJZm9yIChDYXRlZ29yeURlZmluaXRpb24gY2F0SW5EQiA6IHNlcnZpY2VDYXRlZ29yaWVzLmxlZnQoKS52YWx1ZSgpKSB7CisJCQkJCWlmIChuZXdDYXQuZ2V0TmFtZSgpLmVxdWFscyhjYXRJbkRCLmdldE5hbWUoKSkpIHsKKwkJCQkJCWV4aXN0ID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghZXhpc3QpIHsKKwkJCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24obmV3Q2F0KTsKKwkJCQkJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBlbGVtZW50T3BlcmF0aW9uCisJCQkJCQkJLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSwgdHJ1ZSk7CisJCQkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgc2VydmljZSBjYXRlZ29yeSB7fSwgZXJyb3I6IHt9IiwgY2F0ZWdvcnlEZWZpbml0aW9uLCByZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlsb2cuZGVidWcoInNlcnZpY2UgY2F0ZWdvcnkge30gY3JlYXRlZCIsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyB1cGRhdGUgZXhpc3QKKwkJCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRJbkRCIDogc2VydmljZUNhdGVnb3JpZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQkJaWYgKG5ld0NhdC5nZXRPbGROYW1lKCkuZXF1YWxzKGNhdEluREIuZ2V0TmFtZSgpKSkgeworCQkJCQkJRWl0aGVyPENhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVNpbmdsZVJlc3VsdCA9IHVwZGF0ZVNpbmdsZVJlc291cmNlQ2F0ZWdvcnkoCisJCQkJCQkJCW5ld0NhdCwgTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSk7CisJCQkJCQlpZiAodXBkYXRlU2luZ2xlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWxvZy5kZWJ1ZygidXBkYXRlU2VydmljZUNhdGVnb3JpZXMgRU5ERUQiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlU2luZ2xlUmVzb3VyY2VDYXRlZ29yeShNaWdyYXRpb25DYXRlZ29yeSBuZXdDYXQsCisJCQlOb2RlVHlwZUVudW0gbm9kZXR5cGUpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgbmV3Q2F0LmdldE9sZE5hbWUoKSk7CisJCUVpdGhlcjxMaXN0PENhdGVnb3J5RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXRlZ29yeUVpdGhlciA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKG5vZGV0eXBlLAorCQkJCXByb3BlcnRpZXMsIENhdGVnb3J5RGF0YS5jbGFzcyk7CisJCWlmIChjYXRlZ29yeUVpdGhlci5pc1JpZ2h0KCkgJiYgY2F0ZWdvcnlFaXRoZXIucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHt9IGNhdGVnb3JpZXMsIGZvciBuYW1lIHt9IGVycm9yIHt9Iiwgbm9kZXR5cGUsIG5ld0NhdC5nZXRPbGROYW1lKCksCisJCQkJCWNhdGVnb3J5RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNhdGVnb3J5RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJTGlzdDxDYXRlZ29yeURhdGE+IGNhdGVnb3J5TGlzdCA9IChjYXRlZ29yeUVpdGhlci5pc0xlZnQoKSA/IGNhdGVnb3J5RWl0aGVyLmxlZnQoKS52YWx1ZSgpIDogbnVsbCk7CisJCWlmIChjYXRlZ29yeUxpc3QgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJObyB7fSBjYXRlZ29yaWVzLCBmb3IgbmFtZSB7fSBlcnJvciB7fSIsIG5vZGV0eXBlLCBuZXdDYXQuZ2V0T2xkTmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhID0gY2F0ZWdvcnlMaXN0LmdldCgwKTsKKwkJY2F0ZWdvcnlEYXRhLmdldENhdGVnb3J5RGF0YURlZmluaXRpb24oKS5zZXROYW1lKG5ld0NhdC5nZXROYW1lKCkpOworCQljYXRlZ29yeURhdGEuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpLnNldEljb25zKG5ld0NhdC5nZXRJY29ucygpKTsKKwkJY2F0ZWdvcnlEYXRhLmdldENhdGVnb3J5RGF0YURlZmluaXRpb24oKQorCQkJCS5zZXROb3JtYWxpemVkTmFtZShWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MobmV3Q2F0LmdldE5hbWUoKSkpOworCQlFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKGNhdGVnb3J5RGF0YSwKKwkJCQlDYXRlZ29yeURhdGEuY2xhc3MpOworCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSB7fSBjYXRlZ29yeSB7fSBlcnJvciB7fSIsIG5vZGV0eXBlLCBjYXRlZ29yeURhdGEsIHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCWxvZy5kZWJ1ZygiVXBkYXRlIHt9IGNhdGVnb3J5IHt9ICIsIG5vZGV0eXBlLCBjYXRlZ29yeURhdGEpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQodXBkYXRlTm9kZS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVJlc291cmNlQ2F0ZWdvcmllcyhMaXN0PE1pZ3JhdGlvbkNhdGVnb3J5PiBjYXRlZ29yaWVzKSB7CisJCWxvZy5kZWJ1ZygidXBkYXRlUmVzb3VyY2VDYXRlZ29yaWVzIFNUQVJURUQiKTsKKwkJRWl0aGVyPExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiByZXNvdXJjZUNhdGVnb3JpZXMgPSBlbGVtZW50T3BlcmF0aW9uCisJCQkJLmdldEFsbENhdGVnb3JpZXMoTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnksIHRydWUpOworCQlpZiAocmVzb3VyY2VDYXRlZ29yaWVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVSZXNvdXJjZUNhdGVnb3JpZXMgZmFpbGVkIGZldGNoIGFsbCByZXNvdXJjZSBjYXRlZ29yaWVzICxlcnJvciAiCisJCQkJCSsgcmVzb3VyY2VDYXRlZ29yaWVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChNaWdyYXRpb25DYXRlZ29yeSBuZXdDYXQgOiBjYXRlZ29yaWVzKSB7CisJCQlpZiAobmV3Q2F0LmdldE9sZE5hbWUoKSA9PSBudWxsKSB7CisJCQkJLy8gYWRkIG5ldworCQkJCS8vIGNoZWNrIGlmIGFscmVhZHkgY3JlYXRlZCBpbiBwcmV2aW91cyBydW5uaW5nCisJCQkJYm9vbGVhbiBleGlzdCA9IGZhbHNlOworCQkJCWZvciAoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdEluREIgOiByZXNvdXJjZUNhdGVnb3JpZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQkJaWYgKG5ld0NhdC5nZXROYW1lKCkuZXF1YWxzKGNhdEluREIuZ2V0TmFtZSgpKSkgeworCQkJCQkJZXhpc3QgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghZXhpc3QpIHsKKwkJCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24obmV3Q2F0KTsKKwkJCQkJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiByZXN1bHRDYXQgPSBlbGVtZW50T3BlcmF0aW9uCisJCQkJCQkJLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5RGVmaW5pdGlvbiwgTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnksIHRydWUpOworCQkJCQlpZiAocmVzdWx0Q2F0LmlzUmlnaHQoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHJlc291cmNlIGNhdGVnb3J5IHt9LCBlcnJvcjoge30iLCBjYXRlZ29yeURlZmluaXRpb24sIHJlc3VsdENhdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCWxvZy5kZWJ1ZygicmVzb3VyY2UgY2F0ZWdvcnkge30gY3JlYXRlZCIsIGNhdGVnb3J5RGVmaW5pdGlvbik7CisKKwkJCQkJTGlzdDxNaWdyYXRpb25TdWJDYXRlZ29yeT4gblN1YkNhdCA9IG5ld0NhdC5nZXRTdWJjYXRlZ29yaWVzKCk7CisJCQkJCUxpc3Q8TWlncmF0aW9uU3ViQ2F0ZWdvcnk+IG5ld1N1YmNhdCA9IG5TdWJDYXQ7CisJCQkJCUxpc3Q8TWlncmF0aW9uU3ViQ2F0ZWdvcnk+IHN1YmNhdGVnb3JpZXMgPSBuZXdTdWJjYXQ7CisJCQkJCWZvciAoTWlncmF0aW9uU3ViQ2F0ZWdvcnkgbXN1YmNhdCA6IHN1YmNhdGVnb3JpZXMpIHsKKwkJCQkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJjYXQgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKG1zdWJjYXQpOworCQkJCQkJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiByZXN1bHRTdWJjYXQgPSBlbGVtZW50T3BlcmF0aW9uLmNyZWF0ZVN1YkNhdGVnb3J5KAorCQkJCQkJCQlyZXN1bHRDYXQubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKSwgc3ViY2F0LCBOb2RlVHlwZUVudW0uUmVzb3VyY2VTdWJjYXRlZ29yeSwgdHJ1ZSk7CisJCQkJCQlpZiAocmVzdWx0U3ViY2F0LmlzUmlnaHQoKSkgeworCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSByZXNvdXJjZSBzdWIgY2F0ZWdvcnkge30gZXJyb3I6IHt9Iiwgc3ViY2F0LCByZXN1bHRTdWJjYXQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlsb2cuZGVidWcoInJlc291cmNlIHN1YiBjYXRlZ29yeSB7fSBjcmVhdGVkIGZvciBjYXRlZ29yeSB7fSIsIGNhdGVnb3J5RGVmaW5pdGlvbiwgcmVzdWx0Q2F0LmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIHVwZGF0ZSBleGlzdAorCQkJCWZvciAoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdEluREIgOiByZXNvdXJjZUNhdGVnb3JpZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQkJaWYgKG5ld0NhdC5nZXRPbGROYW1lKCkuZXF1YWxzKGNhdEluREIuZ2V0TmFtZSgpKSkgeworCQkJCQkJRWl0aGVyPENhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVNpbmdsZVJlc3VsdCA9IHVwZGF0ZVNpbmdsZVJlc291cmNlQ2F0ZWdvcnkoCisJCQkJCQkJCW5ld0NhdCwgTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnkpOworCQkJCQkJaWYgKHVwZGF0ZVNpbmdsZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisKKwkJCQkJCUNhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEgPSB1cGRhdGVTaW5nbGVSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJCQlmb3IgKE1pZ3JhdGlvblN1YkNhdGVnb3J5IG1pZ1N1YkNhdCA6IG5ld0NhdC5nZXRTdWJjYXRlZ29yaWVzKCkpIHsKKwkJCQkJCQlpZiAobWlnU3ViQ2F0LmdldE9sZE5hbWUoKSA9PSBudWxsKSB7CisJCQkJCQkJCS8vIGNyZWF0ZSBuZXcgb25lCisJCQkJCQkJCWJvb2xlYW4gZXhpc3RTdWIgPSBmYWxzZTsKKwkJCQkJCQkJZm9yIChTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0SW5EYiA6IGNhdEluREIuZ2V0U3ViY2F0ZWdvcmllcygpKSB7CisJCQkJCQkJCQlpZiAoc3ViQ2F0SW5EYi5nZXROYW1lKCkuZXF1YWxzKG1pZ1N1YkNhdC5nZXROYW1lKCkpKSB7CisJCQkJCQkJCQkJZXhpc3RTdWIgPSB0cnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlmICghZXhpc3RTdWIpIHsKKwkJCQkJCQkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJjYXQgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKG1pZ1N1YkNhdCk7CisKKwkJCQkJCQkJCUVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gcmVzdWx0U3ViY2F0ID0gZWxlbWVudE9wZXJhdGlvbgorCQkJCQkJCQkJCQkuY3JlYXRlU3ViQ2F0ZWdvcnkoKFN0cmluZykgY2F0ZWdvcnlEYXRhLmdldFVuaXF1ZUlkKCksIHN1YmNhdCwKKwkJCQkJCQkJCQkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2VTdWJjYXRlZ29yeSwgdHJ1ZSk7CisJCQkJCQkJCQlpZiAocmVzdWx0U3ViY2F0LmlzUmlnaHQoKSkgeworCQkJCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSByZXNvdXJjZSBzdWIgY2F0ZWdvcnkge30gZXJyb3I6IHt9Iiwgc3ViY2F0LCByZXN1bHRTdWJjYXQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlsb2cuZGVidWcoInJlc291cmNlIHN1YiBjYXRlZ29yeSB7fSIsIGNhdGVnb3J5RGF0YSwgcmVzdWx0U3ViY2F0LmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAodXBkYXRlU2luZ2xlU3ViQ2F0ZWdvcnkobmV3Q2F0LCBtaWdTdWJDYXQsCisJCQkJCQkJCQkJdXBkYXRlU2luZ2xlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKSA9PSBmYWxzZSkgeworCQkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVNpbmdsZVN1YkNhdGVnb3J5KE1pZ3JhdGlvbkNhdGVnb3J5IG5ld0NhdCwgTWlncmF0aW9uU3ViQ2F0ZWdvcnkgbWlnU3ViQ2F0LAorCQkJQ2F0ZWdvcnlEYXRhIGNhdGVnb3J5RGF0YSkgeworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8U3ViQ2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN1YmNhdGVnb3JpZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VOZXdDYXRlZ29yeSksCisJCQkJCQkoU3RyaW5nKSBjYXRlZ29yeURhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLlNVQl9DQVRFR09SWSwKKwkJCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZVN1YmNhdGVnb3J5LCBTdWJDYXRlZ29yeURhdGEuY2xhc3MpOworCisJCWlmIChzdWJjYXRlZ29yaWVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHJlc291cmNlIHN1YiBjYXRlZ29yaWVzLCBmb3IgbmFtZSB7fSBlcnJvciB7fSIsIG5ld0NhdC5nZXRPbGROYW1lKCksCisJCQkJCXN1YmNhdGVnb3JpZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZvciAoSW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4gcGFpciA6IHN1YmNhdGVnb3JpZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCWlmIChwYWlyLmdldEtleSgpLmdldFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkuZXF1YWxzKG1pZ1N1YkNhdC5nZXRPbGROYW1lKCkpKSB7CisJCQkJU3ViQ2F0ZWdvcnlEYXRhIHN1YkNhdGVnb3J5RGF0YSA9IHBhaXIuZ2V0S2V5KCk7CisJCQkJc3ViQ2F0ZWdvcnlEYXRhLmdldFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24oKS5zZXROYW1lKG1pZ1N1YkNhdC5nZXROYW1lKCkpOworCQkJCXN1YkNhdGVnb3J5RGF0YS5nZXRTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uKCkuc2V0SWNvbnMobWlnU3ViQ2F0LmdldEljb25zKCkpOworCQkJCXN1YkNhdGVnb3J5RGF0YS5nZXRTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uKCkKKwkJCQkJCS5zZXROb3JtYWxpemVkTmFtZShWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MobWlnU3ViQ2F0LmdldE5hbWUoKSkpOworCQkJCUVpdGhlcjxTdWJDYXRlZ29yeURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVTdWJOb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkudXBkYXRlTm9kZShzdWJDYXRlZ29yeURhdGEsIFN1YkNhdGVnb3J5RGF0YS5jbGFzcyk7CisJCQkJaWYgKHVwZGF0ZVN1Yk5vZGUuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSByZXNvdXJjZSBzdWIgY2F0ZWdvcnkge30gZXJyb3Ige30iLCBzdWJDYXRlZ29yeURhdGEsCisJCQkJCQkJdXBkYXRlU3ViTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiVXBkYXRlIHJlc291cmNlIHN1YmNhdGVnb3J5IGNhdGVnb3J5IHt9ICIsIHN1YkNhdGVnb3J5RGF0YSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PE1pZ3JhdGlvbkNhdGVnb3J5Pj4gY3JlYXRlQ2F0ZWdvcmllc0Zyb21ZbWwoU3RyaW5nIGNhdGVnb3JpZXNUeXBlc1ltbCkgeworCQlTdHJpbmcgeWFtbEFzU3RyaW5nOworCQl0cnkgeworCQkJeWFtbEFzU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQWxsQnl0ZXMoZ2V0KGNhdGVnb3JpZXNUeXBlc1ltbCkpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGxvYWQgY2F0ZWdvcnkgaW1wb3J0IGZpbGUgZXhjZXB0aW9uIDogIiwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWxvZy5kZWJ1ZygicmVjZWl2ZWQgeWFtbDoge30iLCB5YW1sQXNTdHJpbmcpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5ldyBZYW1sKCkubG9hZCh5YW1sQXNTdHJpbmcpOworCQlNYXA8U3RyaW5nLCBMaXN0PE1pZ3JhdGlvbkNhdGVnb3J5Pj4gYWxsQ2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGNhdGVnb3J5RW50cnlJdHIgPSB0b3NjYUpzb24uZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoY2F0ZWdvcnlFbnRyeUl0ci5oYXNOZXh0KCkpIHsKKwkJCUVudHJ5PFN0cmluZywgT2JqZWN0PiBjYXRlZ29yeVR5cGVFbnRyeSA9IGNhdGVnb3J5RW50cnlJdHIubmV4dCgpOworCQkJU3RyaW5nIGNhdGVnb3J5VHlwZSA9IGNhdGVnb3J5VHlwZUVudHJ5LmdldEtleSgpOworCQkJTGlzdDxNaWdyYXRpb25DYXRlZ29yeT4gY2F0ZWdvcmllc1BlclR5cGUgPSBudWxsOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXRlZ29yeVBlclR5cGUgPSBudWxsOworCQkJc3dpdGNoIChjYXRlZ29yeVR5cGUpIHsKKwkJCWNhc2UgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FOgorCQkJCWNhdGVnb3J5UGVyVHlwZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBjYXRlZ29yeVR5cGVFbnRyeS5nZXRWYWx1ZSgpOworCQkJCWNhdGVnb3JpZXNQZXJUeXBlID0gY3JlYXRlU2VydmljZUNhdGVnb3JpZXMoY2F0ZWdvcnlQZXJUeXBlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRToKKwkJCQljYXRlZ29yeVBlclR5cGUgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgY2F0ZWdvcnlUeXBlRW50cnkuZ2V0VmFsdWUoKTsKKwkJCQljYXRlZ29yaWVzUGVyVHlwZSA9IGNyZWF0ZVJlc291cmNlQ2F0ZWdvcmllcyhjYXRlZ29yeVBlclR5cGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUX1BBUkFNX05BTUU6CisJCQkJLy8gVE9ETworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsb2cuZGVidWcoIk5vdCBzdXBwb3J0ZWQgY2F0ZWdvcnkgdHlwZSAtIHt9IiwgY2F0ZWdvcnlUeXBlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjYXRlZ29yaWVzUGVyVHlwZSAhPSBudWxsKSB7CisJCQkJYWxsQ2F0ZWdvcmllcy5wdXQoY2F0ZWdvcnlUeXBlLCBjYXRlZ29yaWVzUGVyVHlwZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFsbENhdGVnb3JpZXM7CisJfQorCisJcHJpdmF0ZSBMaXN0PE1pZ3JhdGlvbkNhdGVnb3J5PiBjcmVhdGVTZXJ2aWNlQ2F0ZWdvcmllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IGNhdGVnb3JpZXMpIHsKKwkJTGlzdDxNaWdyYXRpb25DYXRlZ29yeT4gY2F0ZWdyb2llc0RlZiA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlTdHJpbmcgY2F0TmFtZSA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiBpY29ucyA9IG51bGw7CisJCVN0cmluZyBvbGROYW1lID0gbnVsbDsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBjYXRlZ29yaWVzLmVudHJ5U2V0KCkpIHsKKwkJCU1pZ3JhdGlvbkNhdGVnb3J5IGNhdERlZiA9IG5ldyBNaWdyYXRpb25DYXRlZ29yeSgpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXRlZ29yeSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJY2F0TmFtZSA9IChTdHJpbmcpIGNhdGVnb3J5LmdldCgibmFtZSIpOworCQkJY2F0RGVmLnNldE5hbWUoY2F0TmFtZSk7CisJCQlpY29ucyA9IChMaXN0PFN0cmluZz4pIGNhdGVnb3J5LmdldCgiaWNvbnMiKTsKKwkJCWNhdERlZi5zZXRJY29ucyhpY29ucyk7CisJCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MoY2F0TmFtZSk7CisJCQljYXREZWYuc2V0Tm9ybWFsaXplZE5hbWUobm9ybWFsaXplZE5hbWUpOworCQkJb2xkTmFtZSA9IChTdHJpbmcpIGNhdGVnb3J5LmdldCgib2xkTmFtZSIpOworCQkJY2F0RGVmLnNldE9sZE5hbWUob2xkTmFtZSk7CisJCQljYXRlZ3JvaWVzRGVmLmFkZChjYXREZWYpOworCQl9CisKKwkJcmV0dXJuIGNhdGVncm9pZXNEZWY7CisJfQorCisJcHJpdmF0ZSBMaXN0PE1pZ3JhdGlvbkNhdGVnb3J5PiBjcmVhdGVSZXNvdXJjZUNhdGVnb3JpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBjYXRlZ29yeVBlclR5cGUpIHsKKwkJTGlzdDxNaWdyYXRpb25DYXRlZ29yeT4gY2F0ZWdyb2llc0RlZiA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBjYXRlZ29yeVBlclR5cGUuZW50cnlTZXQoKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXRlZ29yeSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJTWlncmF0aW9uQ2F0ZWdvcnkgY2F0RGVmID0gbmV3IE1pZ3JhdGlvbkNhdGVnb3J5KCk7CisJCQlTdHJpbmcgY2F0TmFtZSA9IChTdHJpbmcpIGNhdGVnb3J5LmdldCgibmFtZSIpOworCQkJY2F0RGVmLnNldE5hbWUoY2F0TmFtZSk7CisJCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MoY2F0TmFtZSk7CisJCQljYXREZWYuc2V0Tm9ybWFsaXplZE5hbWUobm9ybWFsaXplZE5hbWUpOworCQkJU3RyaW5nIG9sZE5hbWUgPSAoU3RyaW5nKSBjYXRlZ29yeS5nZXQoIm9sZE5hbWUiKTsKKwkJCWNhdERlZi5zZXRPbGROYW1lKG9sZE5hbWUpOworCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHN1YmNhdGVnb3JpZXMgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgY2F0ZWdvcnkuZ2V0KCJzdWJjYXRlZ29yaWVzIik7CisJCQlMaXN0PE1pZ3JhdGlvblN1YkNhdGVnb3J5PiBzdWJjYXRlRGVmID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBzdWJjYXRlZ29yeSA6IHN1YmNhdGVnb3JpZXMuZW50cnlTZXQoKSkgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gc3ViY2F0ZWdvcnlJbmZvID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHN1YmNhdGVnb3J5LmdldFZhbHVlKCk7CisJCQkJTWlncmF0aW9uU3ViQ2F0ZWdvcnkgc3ViRGVmID0gbmV3IE1pZ3JhdGlvblN1YkNhdGVnb3J5KCk7CisJCQkJU3RyaW5nIHN1YmNhdGVnb3J5TmFtZSA9IChTdHJpbmcpIHN1YmNhdGVnb3J5SW5mby5nZXQoIm5hbWUiKTsKKwkJCQlzdWJEZWYuc2V0TmFtZShzdWJjYXRlZ29yeU5hbWUpOworCQkJCUxpc3Q8U3RyaW5nPiBzdWJjYXRlZ29yeUljb25zID0gKExpc3Q8U3RyaW5nPikgc3ViY2F0ZWdvcnlJbmZvLmdldCgiaWNvbnMiKTsKKwkJCQlzdWJEZWYuc2V0SWNvbnMoc3ViY2F0ZWdvcnlJY29ucyk7CisJCQkJbm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3Moc3ViY2F0ZWdvcnlOYW1lKTsKKwkJCQlzdWJEZWYuc2V0Tm9ybWFsaXplZE5hbWUobm9ybWFsaXplZE5hbWUpOworCQkJCW9sZE5hbWUgPSAoU3RyaW5nKSBzdWJjYXRlZ29yeUluZm8uZ2V0KCJvbGROYW1lIik7CisJCQkJc3ViRGVmLnNldE9sZE5hbWUob2xkTmFtZSk7CisKKwkJCQlzdWJjYXRlRGVmLmFkZChzdWJEZWYpOworCQkJfQorCisJCQljYXREZWYuc2V0U3ViY2F0ZWdvcmllcyhzdWJjYXRlRGVmKTsKKwkJCWNhdGVncm9pZXNEZWYuYWRkKGNhdERlZik7CisJCX0KKwkJcmV0dXJuIGNhdGVncm9pZXNEZWY7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUNhbGN1bGF0ZWRFZGdlcygpIHsKKwkJbG9nLmRlYnVnKCJ1cGRhdGUgY2FsY3VsYXRlZCBlZGdlcyBTVEFSVEVEIik7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbEluc3RhbmNlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCBudWxsLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCQlpZiAoYWxsSW5zdGFuY2VzLmlzUmlnaHQoKSAmJiAhYWxsSW5zdGFuY2VzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJbG9nLmRlYnVnKAorCQkJCQkidXBkYXRlQ2FsY3VsYXRlZEVkZ2VzIGZhaWxlZCBmZXRjaCBhbGwgcmVzb3VyY2UgaW5zdGFuY2VzICxlcnJvciAiICsgYWxsSW5zdGFuY2VzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGFsbEluc3RhbmNlcy5pc1JpZ2h0KCkgJiYgYWxsSW5zdGFuY2VzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVDYWxjdWxhdGVkRWRnZXMgLSBubyBWRnMiKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VEYXRhPiBsaXN0T2ZJbnN0YW5jZXMgPSBhbGxJbnN0YW5jZXMubGVmdCgpLnZhbHVlKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VEYXRhIGluc3RhbmNlIDogbGlzdE9mSW5zdGFuY2VzKSB7CisJCQkvLyBjaGVjayBpZiBhbHJlYWR5IGhhdmUgY2FsY3VsYXRlZCBlZGdlcworCQkJbG9nLmRlYnVnKCJzdGFydCBoYW5kbGUgaW5zdGFuY2Uge30iLCBpbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCWJvb2xlYW4gbmVlZFByb2Nlc3MgPSB0cnVlOworCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZmNpID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwKKwkJCQkJCQlpbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSwKKwkJCQkJCQlDYXBhYmlsaXR5RGF0YS5jbGFzcyk7CisJCQlpZiAodmZjaS5pc1JpZ2h0KCkpIHsKKwkJCQlpZiAoIXZmY2kucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJCWxvZy5kZWJ1ZygiY3JlYXRlQ2FsY3VsYXRlZENhcGFiaWxpdGllc0Zvckluc3RhbmNlIGZhaWxlZCB0byBmZXRjaCBpbnN0YW5jZSBmb3IgcmVzb3VyY2Uge30gZXJyb3I6IHt9IiwgCisJCQkJCQkJaW5zdGFuY2UuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuZ2V0Q29tcG9uZW50VWlkKCksCisJCQkJCQkJdmZjaS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodmZjaS5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPiAwKSB7CisJCQkJCW5lZWRQcm9jZXNzID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmZjaVJlcSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksCisJCQkJCQkJaW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfUkVRVUlSRU1FTlQsIE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudCwKKwkJCQkJCQlSZXF1aXJlbWVudERhdGEuY2xhc3MpOworCQkJaWYgKHZmY2lSZXEuaXNSaWdodCgpKSB7CisJCQkJaWYgKCF2ZmNpUmVxLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCQlsb2cuZGVidWcoImNyZWF0ZUNhbGN1bGF0ZWRDYXBhYmlsaXRpZXNGb3JJbnN0YW5jZSBmYWlsZWQgdG8gZmV0Y2ggaW5zdGFuY2UgZm9yIHJlc291cmNlIHt9IGVycm9yOiB7fSIsCisJCQkJCQkJaW5zdGFuY2UuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuZ2V0Q29tcG9uZW50VWlkKCksCisJCQkJCQkJdmZjaVJlcS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodmZjaVJlcS5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPiAwKSB7CisJCQkJCW5lZWRQcm9jZXNzID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmZjaVJlcUZGID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwKKwkJCQkJCQlpbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVF9GVUxMRklMTEVELAorCQkJCQkJCU5vZGVUeXBlRW51bS5SZXF1aXJlbWVudCwgUmVxdWlyZW1lbnREYXRhLmNsYXNzKTsKKwkJCWlmICh2ZmNpUmVxRkYuaXNSaWdodCgpKSB7CisKKwkJCQlpZiAoIXZmY2lSZXFGRi5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0aWVzRm9ySW5zdGFuY2UgZmFpbGVkIHRvIGZldGNoIGluc3RhbmNlIGZvciByZXNvdXJjZSAiCisJCQkJCQkJKyBpbnN0YW5jZS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKS5nZXRDb21wb25lbnRVaWQoKSArICIgZXJyb3IgIgorCQkJCQkJCSsgdmZjaVJlcUZGLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICh2ZmNpUmVxRkYubGVmdCgpLnZhbHVlKCkuc2l6ZSgpID4gMCkgeworCQkJCQluZWVkUHJvY2VzcyA9IGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG5lZWRQcm9jZXNzID09IGZhbHNlKSB7CisJCQkJbG9nLmRlYnVnKCJ1cGRhdGVDYWxjdWxhdGVkRWRnZXMgOiBmb3IgaW5zdGFuY2Uge30gY2FsY3VsYXRlZCBjYXBhYmlsdHkvcmVxdWlyZW1lbnQgYWxyZWFkeSBjcmVhdGVkIiwgaW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlTdHJpbmcgb3JpZ2luSWQgPSBpbnN0YW5jZS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKS5nZXRDb21wb25lbnRVaWQoKTsKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VFID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2Uob3JpZ2luSWQsIHRydWUpOworCQkJaWYgKHJlc291cmNlRS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoInVwZGF0ZUNhbGN1bGF0ZWRFZGdlcyBmYWlsZWQgdG8gZmV0Y2ggb3JpZ2luIHJlc291cmNlIHdpdGggaWQge30gZXJyb3I6IHt9Iiwgb3JpZ2luSWQsIHJlc291cmNlRS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VFLmxlZnQoKS52YWx1ZSgpOworCQkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHMgPSByZXNvdXJjZS5nZXRSZXF1aXJlbWVudHMoKTsKKwkJCWlmIChjcmVhdGVDYWxjdWxhdGVkUmVxdWlyZW1lbnRzRm9ySW5zdGFuY2UoaW5zdGFuY2UsIHJlcXVpcmVtZW50cykgIT0gdHJ1ZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXMgPSByZXNvdXJjZS5nZXRDYXBhYmlsaXRpZXMoKTsKKwkJCWlmIChjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0aWVzRm9ySW5zdGFuY2UoaW5zdGFuY2UsIGNhcGFiaWxpdGllcykgIT0gdHJ1ZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiZmluaXNoIGhhbmRsZSBpbnN0YW5jZSB7fSIsIGluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQl9CisJCWxvZy5kZWJ1ZygidXBkYXRlIGNhbGN1bGF0ZWQgZWRnZXMgRU5ERUQiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUNhbGN1bGF0ZWRDYXBhYmlsaXRpZXNGb3JJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZURhdGEgaW5zdGFuY2UsCisJCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzKSB7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGVudHJ5IDogY2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQlFaXRoZXI8Q2FwYWJpbGl0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXBOb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoCisJCQkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSksIGNhcGFiaWxpdHkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCUNhcGFiaWxpdHlEYXRhLmNsYXNzKTsKKwkJCQlpZiAoY2FwTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0aWVzRm9ySW5zdGFuY2UgZmFpbGVkIHRvIGZldGNoIGNhcGFiaWxpdHkgbm9kZSAgd2l0aCBpZCAiCisJCQkJCQkJKyBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCkgKyAiIGVycm9yICIgKyBjYXBOb2RlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5LmdldE5hbWUoKSk7CisJCQkJaWYgKGZpbGxFZGdlUHJvcGVydGllcyhpbnN0YW5jZSwgcHJvcHMpICE9IHRydWUpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oaW5zdGFuY2UsCisJCQkJCQljYXBOb2RlLmxlZnQoKS52YWx1ZSgpLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZLCBwcm9wcyk7CisJCQkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKAorCQkJCQkJCSJGYWlsZWQgdG8gY3JlYXRlIGNhbGN1bGF0ZWQgcmVxdWlyZW1lbnQgZnJvbSBjb21wb25lbnQgaW5zdGFuY2Uge30gdG8gcmVxdWlyZW1lbnQge30sIGVycm9yOiB7fSIsCisJCQkJCQkJaW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgY2FwTm9kZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpLCB0aXRhbk9wZXJhdGlvblN0YXR1cyk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJbG9nLmRlYnVnKCJDQUxDVUxBVEVEX0NBUEFCSUxJVFkgd2FzIGNyZWF0ZWQgZnJvbSB7fSB0byB7fSB3aXRoIHByb3BzOiB7fSIsIGNhcE5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKSwgaW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgcHJvcHMpOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBmaWxsRWRnZVByb3BlcnRpZXMoQ29tcG9uZW50SW5zdGFuY2VEYXRhIGluc3RhbmNlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzKSB7CisJCWlmIChpbnN0YW5jZS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKS5nZXRPcmlnaW5UeXBlKCkuZXF1YWxzKE9yaWdpblR5cGVFbnVtLlZGKSkgeworCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmZjaSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLAorCQkJCQkJCWluc3RhbmNlLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldENvbXBvbmVudFVpZCgpLCBHcmFwaEVkZ2VMYWJlbHMuUkVTT1VSQ0VfSU5TVCwKKwkJCQkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJCWlmICh2ZmNpLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiY3JlYXRlQ2FsY3VsYXRlZENhcGFiaWxpdGllc0Zvckluc3RhbmNlIGZhaWxlZCB0byBmZXRjaCBpbnN0YW5jZSBmb3IgcmVzb3VyY2Uge30gZXJyb3I6IHt9IiwKKwkJCQkJCWluc3RhbmNlLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldENvbXBvbmVudFVpZCgpLAorCQkJCQkJdmZjaS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCUltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSB2ZmNpLmxlZnQoKS52YWx1ZSgpLmdldCgwKTsKKwkJCVN0cmluZyB2ZmNpSWQgPSBpbW11dGFibGVQYWlyLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpOworCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk9XTkVSX0lELmdldFByb3BlcnR5KCksIHZmY2lJZCk7CisJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuU09VUkNFLmdldFByb3BlcnR5KCksCisJCQkJCWltbXV0YWJsZVBhaXIuZ2V0TGVmdCgpLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldENvbXBvbmVudFVpZCgpKTsKKworCQl9IGVsc2UgeworCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk9XTkVSX0lELmdldFByb3BlcnR5KCksIGluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlNPVVJDRS5nZXRQcm9wZXJ0eSgpLAorCQkJCQlpbnN0YW5jZS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKS5nZXRDb21wb25lbnRVaWQoKSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUNhbGN1bGF0ZWRSZXF1aXJlbWVudHNGb3JJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZURhdGEgaW5zdGFuY2UsCisJCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50cykgeworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gZW50cnkgOiByZXF1aXJlbWVudHMuZW50cnlTZXQoKSkgeworCQkJZm9yIChSZXF1aXJlbWVudERlZmluaXRpb24gcmVxdWlyZW1lbnQgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJRWl0aGVyPFJlcXVpcmVtZW50RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZSgKKwkJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudCksIHJlcXVpcmVtZW50LmdldFVuaXF1ZUlkKCksCisJCQkJCQlSZXF1aXJlbWVudERhdGEuY2xhc3MpOworCQkJCWlmIChyZXFOb2RlLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoInVwZGF0ZUNhbGN1bGF0ZWRFZGdlcyBmYWlsZWQgdG8gZmV0Y2ggcmVxdWlyZW1lbnQgbm9kZSAgd2l0aCBpZCB7fSBlcnJvcjoge30iLCByZXF1aXJlbWVudC5nZXRVbmlxdWVJZCgpLCByZXFOb2RlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCByZXF1aXJlbWVudC5nZXROYW1lKCkpOworCisJCQkJaWYgKGZpbGxFZGdlUHJvcGVydGllcyhpbnN0YW5jZSwgcHJvcHMpICE9IHRydWUpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oaW5zdGFuY2UsCisJCQkJCQlyZXFOb2RlLmxlZnQoKS52YWx1ZSgpLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVCwgcHJvcHMpOworCQkJCWlmIChjcmVhdGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5kZWJ1ZygKKwkJCQkJCQkiRmFpbGVkIHRvIGNyZWF0ZSBjYWxjdWxhdGVkIHJlcXVpcmVtZW50IGZyb20gY29tcG9uZW50IGluc3RhbmNlIHt9IHRvIHJlcXVpcmVtZW50IHt9LCBlcnJvcjoge30iLAorCQkJCQkJCWluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHJlcU5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKSwgdGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVCB3YXMgY3JlYXRlZCBmcm9tIHt9IHRvIHt9IHdpdGggcHJvcHM6IHt9IiwgcmVxTm9kZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpLCBpbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBwcm9wcyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVJlbGF0aW9ucygpIHsKKwkJbG9nLmRlYnVnKCJ1cGRhdGUgcmVsYXRpb25zIGFuZCBlZGdlcyBTVEFSVEVEIik7CisJCUVpdGhlcjxMaXN0PFJlbGF0aW9uc2hpcEluc3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbFJlbGF0aW9ucyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZWxhdGlvbnNoaXBJbnN0LCBudWxsLCBSZWxhdGlvbnNoaXBJbnN0RGF0YS5jbGFzcyk7CisJCWlmIChhbGxSZWxhdGlvbnMuaXNSaWdodCgpKSB7CisJCQlpZiAoYWxsUmVsYXRpb25zLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCWxvZy5kZWJ1ZygidXBkYXRlUmVsYXRpb25zIDogTm8gcmVsYXRpb25zIHRvIHVwZGF0ZS4gdXBkYXRlUmVsYXRpb25zIEVOREVEIik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlsb2cuZGVidWcoInVwZGF0ZVJlbGF0aW9ucyA6IGZhaWxlZCB0byBmZXRjaCBhbGwgcmVsYXRpb24gbm9kZXMgLCBlcnJvciAiLCBhbGxSZWxhdGlvbnMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlmb3IgKFJlbGF0aW9uc2hpcEluc3REYXRhIHJlbCA6IGFsbFJlbGF0aW9ucy5sZWZ0KCkudmFsdWUoKSkgeworCQkJLy8gcmVsLnNldAorCQkJaWYgKHJlbC5nZXRDYXBhYmlsaXR5T3duZXJJZCgpICE9IG51bGwgJiYgcmVsLmdldFJlcXVpcmVtZW50T3duZXJJZCgpICE9IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoInVwZGF0ZVJlbGF0aW9ucyA6IGZvciByZWxhdGlvbiB7fSBhbGwgZmllbGRzIGFscmVkeSBmaXhlZCAtPiB7fSIsIHJlbC5nZXRVbmlxdWVJZCgpLCByZWwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gdXBkYXRlIGNhcGFiaWxpdHkgcGFyYW1ldGVycworCQkJaWYgKHVwZGF0ZUNhcGFiaWx0eUZpZWxkc0luUmVsYXRpb24ocmVsKSAhPSB0cnVlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvLyB1cGRhdGUgcmVxdWlyZW1lbnQgcGFyYW1ldGVycyBhbmQgc2V0IGNhbGN1bGF0ZWQgZWRnZSB0byBmdWxsCisJCQkvLyBmaWxsZWQKKwkJCWlmICh1cGRhdGVSZXF1aXJlbWVudEZpZWxkc0luUmVsYXRpb24ocmVsKSAhPSB0cnVlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlFaXRoZXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocmVsLAorCQkJCQlSZWxhdGlvbnNoaXBJbnN0RGF0YS5jbGFzcyk7CisJCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoInVwZGF0ZVJlbGF0aW9ucyA6IGZhaWxlZCB0byB1cGRhdGUgcmVsYXRpb24gbm9kZSB3aXRoIGlkIHt9LCBlcnJvcjoge30iLCByZWwuZ2V0VW5pcXVlSWQoKSwgdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiUmVsYXRpb25zIHdhcyB1cGRhdGVkIHdpdGggdmFsdWVzIHt9IiwgcmVsKTsKKwkJfQorCQlsb2cuZGVidWcoInVwZGF0ZSByZWxhdGlvbnMgYW5kIGVkZ2VzIEVOREVEIik7CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVSZXF1aXJlbWVudEZpZWxkc0luUmVsYXRpb24oUmVsYXRpb25zaGlwSW5zdERhdGEgcmVsKSB7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcUluc3QgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0UGFyZW50Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVsYXRpb25zaGlwSW5zdCksIHJlbC5nZXRVbmlxdWVJZCgpLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLlJFTEFUSU9OU0hJUF9JTlNULCBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJaWYgKHJlcUluc3QuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoInVwZGF0ZVJlbGF0aW9ucyA6IGZhaWxlZCB0byBmZXRjaCBjYXBhYmlsdHkgY29tcG9uZW50IGluc3RhbmNlIGZvciByZWxhdGlvbiB7fSwgZXJyb3I6IHt9IiwgcmVsLmdldFVuaXF1ZUlkKCksIHJlcUluc3QucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDb21wb25lbnRJbnN0YW5jZURhdGEgcmVxdWlyZW1lbnRJbnN0YW5jZURhdGEgPSByZXFJbnN0LmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VEYXRhRGVmaW5pdGlvbiByZXFSSSA9IHJlcXVpcmVtZW50SW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpOworCQlpZiAocmVxUkkuZ2V0T3JpZ2luVHlwZSgpLmVxdWFscyhPcmlnaW5UeXBlRW51bS5WRikpIHsKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZmY0luc3RJbk9yaWdWZiA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Q2hpbGRCeUVkZ2VDcml0ZXJpYShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLAorCQkJCQkJCXJlcVJJLmdldENvbXBvbmVudFVpZCgpLCBHcmFwaEVkZ2VMYWJlbHMuUkVTT1VSQ0VfSU5TVCwgTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsCisJCQkJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzLCBudWxsKTsKKwkJCWlmICh2ZmNJbnN0SW5PcmlnVmYuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJ1cGRhdGVSZWxhdGlvbnMgOiBmYWlsZWQgdG8gZmV0Y2ggVkZDIGluc3RhbmNlIGluIG9yaWdpbiBWRiB3aXRoIGlkIHt9LCBlcnJvcjoge30iLCByZXFSSS5nZXRDb21wb25lbnRVaWQoKSwgdmZjSW5zdEluT3JpZ1ZmLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmVsLnNldFJlcXVpcmVtZW50T3duZXJJZCh2ZmNJbnN0SW5PcmlnVmYubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpLmdldFVuaXF1ZUlkKCkpOworCQl9IGVsc2UgeworCQkJcmVsLnNldFJlcXVpcmVtZW50T3duZXJJZChyZXFSSS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQkvLyBnZXQgdmVydGV4CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleFJlcVJJID0gdGl0YW5HZW5lcmljRGFvLmdldFZlcnRleEJ5UHJvcGVydHkoCisJCQkJVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLCByZXF1aXJlbWVudEluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJaWYgKHZlcnRleFJlcVJJLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVSZWxhdGlvbnMgOiBmYWlsZWQgdG8gZmV0Y2ggdmV0ZXJ4IGZvciBpbnN0YW5jZSB7fSwgZXJyb3I6IHt9IiwgcmVxdWlyZW1lbnRJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSwgdmVydGV4UmVxUkkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlTdHJpbmdbXSBzcGxpdElkcyA9IHJlbC5nZXRVbmlxdWVJZCgpLnNwbGl0KCJcXC4iKTsKKwkJU3RyaW5nIHJlcU5hbWUgPSBzcGxpdElkc1tzcGxpdElkcy5sZW5ndGggLSAxXTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcmVxTmFtZSk7CisJCUVpdGhlcjxMaXN0PEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWRnZXNGb3JOb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE91dGdvaW5nRWRnZXNCeUNyaXRlcmlhKHZlcnRleFJlcVJJLmxlZnQoKS52YWx1ZSgpLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVCwgcHJvcHMpOworCQlpZiAoZWRnZXNGb3JOb2RlLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVSZWxhdGlvbnMgOiBmYWlsZWQgdG8gZmV0Y2ggZWRnZXMgZm9yIGluc3RhbmNlIHt9LCBlcnJvcjoge30iLCByZXF1aXJlbWVudEluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBlZGdlc0Zvck5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlFZGdlIGVkZ2UgPSBlZGdlc0Zvck5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0KDApOworCQlTdHJpbmcgcmVxSWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoKFRpdGFuVmVydGV4KSBlZGdlLmluVmVydGV4KCksCisJCQkJR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCXJlbC5zZXRSZXF1aXJlbWVudElkKHJlcUlkKTsKKworCQkvLyBjaGFuZ2UgZWRnZSBsYWJlbAorCQlUaXRhbkVkZ2UgbmV3RWRnZSA9IChUaXRhbkVkZ2UpIHZlcnRleFJlcVJJLmxlZnQoKS52YWx1ZSgpCisJCQkJLmFkZEVkZ2UoR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfUkVRVUlSRU1FTlRfRlVMTEZJTExFRC5nZXRQcm9wZXJ0eSgpLCBlZGdlLmluVmVydGV4KCkpOworCQl0aXRhbkdlbmVyaWNEYW8uc2V0UHJvcGVydGllcyhuZXdFZGdlLCB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyhlZGdlKSk7CisJCWVkZ2UucmVtb3ZlKCk7CisKKwkJbG9nLmRlYnVnKCJFZGdlIHdhcyBjaGFuZ2VkIHRvIENBTENVTEFURURfUkVRVUlSRU1FTlRfRlVMTEZJTExFRCBmb3IgcmVsYXRpb24gYmV0d2VlbiB7fSBhbmQge30iLCByZXFJZCwgcmVxdWlyZW1lbnRJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gdXBkYXRlQ2FwYWJpbHR5RmllbGRzSW5SZWxhdGlvbihSZWxhdGlvbnNoaXBJbnN0RGF0YSByZWwpIHsKKwkJLy8gdXBkYXRlIGNhcGFiaWxpdHkgcGFyYW1ldGVycworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXBJbnN0ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkQnlFZGdlQ3JpdGVyaWEoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlbGF0aW9uc2hpcEluc3QpLAorCQkJCQkJcmVsLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX05PREUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLAorCQkJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzLCBudWxsKTsKKwkJaWYgKGNhcEluc3QuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoInVwZGF0ZVJlbGF0aW9ucyA6IGZhaWxlZCB0byBmZXRjaCBjYXBhYmlsdHkgY29tcG9uZW50IGluc3RhbmNlIGZvciByZWxhdGlvbiB7fSwgZXJyb3I6IHt9IiwgcmVsLmdldFVuaXF1ZUlkKCksIGNhcEluc3QucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDb21wb25lbnRJbnN0YW5jZURhdGEgY2FwYWJpbHR5SW5zdGFuY2VEYXRhID0gY2FwSW5zdC5sZWZ0KCkudmFsdWUoKS5nZXRMZWZ0KCk7CisJCUNvbXBvbmVudEluc3RhbmNlRGF0YURlZmluaXRpb24gY2FwUkkgPSBjYXBhYmlsdHlJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCk7CisJCWlmIChjYXBSSS5nZXRPcmlnaW5UeXBlKCkuZXF1YWxzKE9yaWdpblR5cGVFbnVtLlZGKSkgeworCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmZjSW5zdEluT3JpZ1ZmID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXRDaGlsZEJ5RWRnZUNyaXRlcmlhKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksCisJCQkJCQkJY2FwUkkuZ2V0Q29tcG9uZW50VWlkKCksIEdyYXBoRWRnZUxhYmVscy5SRVNPVVJDRV9JTlNULCBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSwKKwkJCQkJCQlDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MsIG51bGwpOworCQkJaWYgKHZmY0luc3RJbk9yaWdWZi5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoInVwZGF0ZVJlbGF0aW9ucyA6IGZhaWxlZCB0byBmZXRjaCBWRkMgaW5zdGFuY2UgaW4gb3JpZ2luIFZGIHdpdGggaWQge30sIGVycm9yOiB7fSIsIGNhcFJJLmdldENvbXBvbmVudFVpZCgpLCB2ZmNJbnN0SW5PcmlnVmYucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZWwuc2V0Q2FwYWJpbGl0eU93bmVySWQodmZjSW5zdEluT3JpZ1ZmLmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpKTsKKwkJfSBlbHNlIHsKKwkJCXJlbC5zZXRDYXBhYmlsaXR5T3duZXJJZChjYXBSSS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCisJCS8vIGdldCB2ZXJ0ZXgKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4Q2FwUkkgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0VmVydGV4QnlQcm9wZXJ0eSgKKwkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIGNhcGFiaWx0eUluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJaWYgKHZlcnRleENhcFJJLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVSZWxhdGlvbnMgOiBmYWlsZWQgdG8gZmV0Y2ggdmV0ZXJ4IGZvciBpbnN0YW5jZSB7fSwgZXJyb3I6IHt9IiwgY2FwYWJpbHR5SW5zdGFuY2VEYXRhLmdldFVuaXF1ZUlkKCksIHZlcnRleENhcFJJLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJLy8gU3RyaW5nW10gc3BsaXRJZHMgPSByZWwuZ2V0VW5pcXVlSWQoKS5zcGxpdCgiXFwuIik7CisJCVN0cmluZyBjYXBOYW1lID0gKFN0cmluZykgY2FwSW5zdC5sZWZ0KCkudmFsdWUoKS5nZXRSaWdodCgpLmdldFByb3BlcnRpZXMoKQorCQkJCS5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsvLyBzcGxpdElkc1tzcGxpdElkcy5sZW5ndGgKKwkJCQkJCQkJCQkJCQkJCQkJCS8vIC0gMV07CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGNhcE5hbWUpOworCQlFaXRoZXI8TGlzdDxFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVkZ2VzRm9yTm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRPdXRnb2luZ0VkZ2VzQnlDcml0ZXJpYSh2ZXJ0ZXhDYXBSSS5sZWZ0KCkudmFsdWUoKSwgR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfQ0FQQUJJTElUWSwgcHJvcHMpOworCQlpZiAoZWRnZXNGb3JOb2RlLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVSZWxhdGlvbnMgOiBmYWlsZWQgdG8gZmV0Y2ggZWRnZXMgZm9yIGluc3RhbmNlIHt9LCBlcnJvcjoge30iLCBjYXBhYmlsdHlJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSwgZWRnZXNGb3JOb2RlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJRWRnZSBlZGdlID0gZWRnZXNGb3JOb2RlLmxlZnQoKS52YWx1ZSgpLmdldCgwKTsKKwkJU3RyaW5nIGNhcElkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KChUaXRhblZlcnRleCkgZWRnZS5pblZlcnRleCgpLAorCQkJCUdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQlyZWwuc2V0Q2FwYWJpbHR5SWQoY2FwSWQpOworCisJCXJldHVybiB0cnVlOworCX0KKworCS8vIHByaXZhdGUgYm9vbGVhbiBmaXhEZXJpdmVkRnYoKSB7CisJLy8gTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCS8vIHByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSwKKwkvLyBSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJLy8gRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsVkYgPQorCS8vIHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcHMsCisJLy8gUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCS8vIGlmIChhbGxWRi5pc1JpZ2h0KCkgJiYKKwkvLyAhYWxsVkYucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJLy8gbG9nLmRlYnVnKCJmaXhEZXJpdmVkRnYgZmFpbGVkIGZldGNoIGFsbCBWRiByZXNvdXJjZXMsZXJyb3Ige30iLCBhbGxWRi5yaWdodCgpLnZhbHVlKCkpOworCS8vIHJldHVybiBmYWxzZTsKKwkvLyB9CisJLy8gaWYgKCBhbGxWRi5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgKXsKKwkvLyBsb2cuZGVidWcoImZpeERlcml2ZWRGdiAtIG5vIFZGIik7CisJLy8gcmV0dXJuIHRydWU7CisJLy8gfQorCS8vIFNldDxTdHJpbmc+IGZpbmlzaGVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8PigpOworCS8vCisJLy8gZm9yIChSZXNvdXJjZU1ldGFkYXRhRGF0YSBtZXRhZGF0YSA6IGFsbFZGLmxlZnQoKS52YWx1ZSgpKSB7CisJLy8gQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBtZXRhZGF0YUREID0KKwkvLyBtZXRhZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCk7CisJLy8KKwkvLyBpZiAoIWZpbmlzaGVkUmVzb3VyY2VzLmNvbnRhaW5zKG1ldGFkYXRhREQuZ2V0VW5pcXVlSWQoKSkpIHsKKwkvLyBFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBwcm9jZXNzZWRJZHMgPQorCS8vIGhhbmRsZVZmR3JvdXAobWV0YWRhdGEpOworCS8vIGlmIChwcm9jZXNzZWRJZHMuaXNSaWdodCgpKSB7CisJLy8gbG9nLmRlYnVnKCJmaXhEZXJpdmVkRnYgZmFpbGVkIHRvIHByb2Nlc3MgRlYgZ3JvdXAge30iLCBwcm9jZXNzZWRJZHMucmlnaHQoKS52YWx1ZSgpKTsKKwkvLyByZXR1cm4gZmFsc2U7CisJLy8gfQorCS8vIGZpbmlzaGVkUmVzb3VyY2VzLmFkZEFsbChwcm9jZXNzZWRJZHMubGVmdCgpLnZhbHVlKCkpOworCS8vIH0KKwkvLyB9CisJLy8gcmV0dXJuIHRydWU7CisJLy8gfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBoYW5kbGVWZkdyb3VwKFJlc291cmNlTWV0YWRhdGFEYXRhIG1ldGFkYXRhKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgbWV0YWRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisKKwkJTGlzdDxTdHJpbmc+IGZpbmlzaGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsVkZCeU5hbWUgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChhbGxWRkJ5TmFtZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZml4RGVyaXZlZEZ2IGZhaWxlZCBmZXRjaCBhbGwgVkYgcmVzb3VyY2VzLGVycm9yIHt9IiwgYWxsVkZCeU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCQlTZXQ8U3RyaW5nPiBub25EdXBsaWNhdGVkSWQgPSBuZXcgSGFzaFNldDw+KCk7CisJCVN0cmluZyB1dWlkMTAgPSBudWxsOworCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIG1kYXRhIDogYWxsVkZCeU5hbWUubGVmdCgpLnZhbHVlKCkpIHsKKwkJCVN0cmluZyB2ZXJzaW9uID0gbWRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKTsKKwkJCWlmICh2ZXJzaW9uLmVxdWFscygiMS4wIikpIHsKKwkJCQl1dWlkMTAgPSBtZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VVVJRCgpOworCQkJCS8vIGJyZWFrOworCQkJfQorCQkJbm9uRHVwbGljYXRlZElkLmFkZCgoU3RyaW5nKSBtZGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlpZiAodXVpZDEwID09IG51bGwpIHsKKwkJCXV1aWQxMCA9IGFsbFZGQnlOYW1lLmxlZnQoKS52YWx1ZSgpLmdldCgwKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VVVJRCgpOworCQl9CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSwgUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VVUlELmdldFByb3BlcnR5KCksIHV1aWQxMCk7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsVkZCeVVVSUQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChhbGxWRkJ5VVVJRC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZml4RGVyaXZlZEZ2IGZhaWxlZCBmZXRjaCBhbGwgVkYgcmVzb3VyY2VzIGJ5IFVVSUQgIHt9LCBlcnJvcjoge30iLCB1dWlkMTAsIGFsbFZGQnlVVUlELnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwkJZm9yIChSZXNvdXJjZU1ldGFkYXRhRGF0YSBtZGF0YSA6IGFsbFZGQnlVVUlELmxlZnQoKS52YWx1ZSgpKSB7CisJCQlub25EdXBsaWNhdGVkSWQuYWRkKChTdHJpbmcpIG1kYXRhLmdldFVuaXF1ZUlkKCkpOworCQl9CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmaXhEZXJpdmVkRnYgZmFpbGVkIC0gTm8gdGl0YW4gZ3JhcGggLGVycm9yIHt9IiwgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCQkvLyBNYXA8U3RyaW5nLCBTdHJpbmc+IGRlcml2ZWRNYXBwaW5nID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKFN0cmluZyByZXNvdXJjZUlkIDogbm9uRHVwbGljYXRlZElkKSB7CisJCQkvLyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGhhbmRsZVNpbmdsZVZmUmVzdWx0ID0KKwkJCS8vIGhhbmRsZVNpbmdsZVZmKGZpbmlzaGVkLCBkZXJpdmVkTWFwcGluZywgcmVzb3VyY2VJZCk7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGhhbmRsZVNpbmdsZVZmUmVzdWx0ID0gaGFuZGxlU2luZ2xlVmYoZmluaXNoZWQsIHJlc291cmNlSWQpOworCQkJaWYgKCFoYW5kbGVTaW5nbGVWZlJlc3VsdC5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlsb2cuZGVidWcoImZpeERlcml2ZWRGdiBmYWlsZWQgLSBoYW5kbGVTaW5nbGVWZlJlc3VsdCBmYWlsZWQgZm9yIHJlc291cmNlIHt9LCBlcnJvcjoge30iLCByZXNvdXJjZUlkLCBoYW5kbGVTaW5nbGVWZlJlc3VsdCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChmaW5pc2hlZCk7CisJfQorCisJLy8gcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGhhbmRsZVNpbmdsZVZmKExpc3Q8U3RyaW5nPiBmaW5pc2hlZCwKKwkvLyBNYXA8U3RyaW5nLCBTdHJpbmc+IGRlcml2ZWRNYXBwaW5nLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBoYW5kbGVTaW5nbGVWZihMaXN0PFN0cmluZz4gZmluaXNoZWQsIFN0cmluZyByZXNvdXJjZUlkKSB7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleEJ5UHJvcGVydHkgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0VmVydGV4QnlQcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCByZXNvdXJjZUlkKTsKKwkJaWYgKHZlcnRleEJ5UHJvcGVydHkuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZpeERlcml2ZWRGdiBmYWlsZWQgdG8gZmV0Y2ggcmVzb3VyY2UgYnkgaWQge30sIGVycm9yOiB7fSIsIHJlc291cmNlSWQsIHZlcnRleEJ5UHJvcGVydHkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwkJVmVydGV4IHZlcnRleFIgPSB2ZXJ0ZXhCeVByb3BlcnR5LmxlZnQoKS52YWx1ZSgpOworCQlJdGVyYXRvcjxWZXJ0ZXg+IHZlcnRleERJdGVyID0gdmVydGV4Ui52ZXJ0aWNlcyhEaXJlY3Rpb24uT1VULCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLmdldFByb3BlcnR5KCkpOworCQlpZiAodmVydGV4REl0ZXIgIT0gbnVsbCAmJiB2ZXJ0ZXhESXRlci5oYXNOZXh0KCkpIHsKKwkJCS8vIG1vdmUgZWRnZXMKKwkJCS8vIG11c3QgYmUgb25seSBvbmUKKwkJCVRpdGFuVmVydGV4IHZlcnRleEQgPSAoVGl0YW5WZXJ0ZXgpIHZlcnRleERJdGVyLm5leHQoKTsKKwkJCVN0cmluZyBpZERlcml2ZWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkodmVydGV4RCwKKwkJCQkJR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisKKwkJCS8vIFRPRE8gY2xvbmUgcmVzb3VyY2UKKworCQkJLy8gVE9ETyBhZGQgaW5zdGFuY2Ugb2YgbmV3IHJlc291cmNlIHRvIFZGCisKKwkJCS8vIGFkZCB0byB2ZiBpbnN0YW5jZSBvZiB2ZmMKKwkJCWZpbmlzaGVkLmFkZChyZXNvdXJjZUlkKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiTm8gZGVyaXZlZCBlZGdlcyBmb3IgcmVzb3VyY2UgIGlkIHt9IiwgcmVzb3VyY2VJZCk7CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlVHlwZSgpIHsKKwkJbG9nLmRlYnVnKCJ1cGRhdGUgY29tcG9uZW50IGluc3RhbmNlcyB0eXBlIFNUQVJURUQiKTsKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbEluc3RhbmNlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCBudWxsLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCQlpZiAoYWxsSW5zdGFuY2VzLmlzUmlnaHQoKSkgeworCQkJaWYgKGFsbEluc3RhbmNlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQlsb2cuZGVidWcoInVwZGF0ZUNvbXBvbmVudEluc3RhbmNlVHlwZTogIG5vIGluc3RhbmNlcyB0aSB1cGRhdGUgIik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlsb2cuZGVidWcoInVwZGF0ZUNvbXBvbmVudEluc3RhbmNlVHlwZSBmYWlsZWQgZmV0Y2ggYWxsIHJlc291cmNlIGluc3RhbmNlcyAsZXJyb3Ige30iLCBhbGxJbnN0YW5jZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VEYXRhPiBsaXN0T2ZJbnN0YW5jZXMgPSBhbGxJbnN0YW5jZXMubGVmdCgpLnZhbHVlKCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VEYXRhIGluc3RhbmNlIDogbGlzdE9mSW5zdGFuY2VzKSB7CisJCQlTdHJpbmcgb3JpZ2luSWQgPSBpbnN0YW5jZS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKS5nZXRDb21wb25lbnRVaWQoKTsKKwkJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlUmVzb3VyY2UgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZSgKKwkJCQkJVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgb3JpZ2luSWQsIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAobm9kZVJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygidXBkYXRlQ29tcG9uZW50SW5zdGFuY2VUeXBlIGZhaWxlZCB0byBmZXRjaCBvcmlnaW4gcmVzb3VyY2Ugd2l0aCBpZCB7fSwgZXJyb3I6IHt9Iiwgb3JpZ2luSWQsIG5vZGVSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCVJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlID0gKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG5vZGVSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKQorCQkJCQkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5nZXRSZXNvdXJjZVR5cGUoKTsKKwkJCWlmIChyZXNvdXJjZVR5cGUgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygidXBkYXRlQ29tcG9uZW50SW5zdGFuY2VUeXBlIGZhaWxlZCwgbm8gcmVzb3VyY2UgdHlwZSBmb3Igb3JpZ2luIHJlc291cmNlIHdpdGggaWQge30iLCBvcmlnaW5JZCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJT3JpZ2luVHlwZUVudW0gb3JpZ2luVHlwZTsKKwkJCXN3aXRjaCAocmVzb3VyY2VUeXBlKSB7CisJCQljYXNlIFZGOgorCQkJCW9yaWdpblR5cGUgPSBPcmlnaW5UeXBlRW51bS5WRjsKKwkJCQlicmVhazsKKwkJCWNhc2UgVkZDOgorCQkJCW9yaWdpblR5cGUgPSBPcmlnaW5UeXBlRW51bS5WRkM7CisJCQkJYnJlYWs7CisJCQljYXNlIFZMOgorCQkJCW9yaWdpblR5cGUgPSBPcmlnaW5UeXBlRW51bS5WTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1A6CisJCQkJb3JpZ2luVHlwZSA9IE9yaWdpblR5cGVFbnVtLkNQOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsb2cuZGVidWcoInVwZGF0ZUNvbXBvbmVudEluc3RhbmNlVHlwZSBmYWlsZWQsIG5vIHN1cHBvcnRlZCByZXNvdXJjZSB0eXBlIHt9IGZvciBvcmlnaW4gcmVzb3VyY2Ugd2l0aCBpZCB7fSIsIHJlc291cmNlVHlwZSwgb3JpZ2luSWQpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWluc3RhbmNlLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLnNldE9yaWdpblR5cGUob3JpZ2luVHlwZSk7CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUoaW5zdGFuY2UsCisJCQkJCUNvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisJCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoInVwZGF0ZUNvbXBvbmVudEluc3RhbmNlVHlwZSBmYWlsZWQsIGZhaWxlZCB0byB1cGRhdGUgY29tcG9uZW50IGluc3RhbmNlIG5vZGUgd2l0aCBpZCB7fSwgZXJyb3I6IHt9IiwgaW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiRm9yIGluc3RhbmNlIHdpdGggaWQge30gdGhlIG9yaWdpbiB0eXBlIHdhcyBkZXRlY3RlZCBhcyB7fSIsIGluc3RhbmNlLmdldFVuaXF1ZUlkKCksIG9yaWdpblR5cGUpOworCQl9CisJCWxvZy5kZWJ1ZygidXBkYXRlIGNvbXBvbmVudCBpbnN0YW5jZXMgdHlwZSBFTkRFRCIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYWRkUmVzb3VyY2VDb3VudGVyVG9SZXNvdXJjZXMoKSB7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsUmVzb3VyY2VzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBudWxsLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChhbGxSZXNvdXJjZXMuaXNSaWdodCgpKSB7CisJCQlpZiAoYWxsUmVzb3VyY2VzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCWxvZy5kZWJ1ZygiYWRkUmVzb3VyY2VDb3VudGVyVG9SZXNvdXJjZXMgLSBubyByZXNvdXJjZXMiKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiYWRkUmVzb3VyY2VDb3VudGVyVG9SZXNvdXJjZXMgZmFpbGVkIGZldGNoIGFsbCByZXNvdXJjZXMsZXJyb3Ige30iLCBhbGxSZXNvdXJjZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlIDogYWxsUmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpKSB7CisJCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhCeVByb3BlcnR5ID0gdGl0YW5HZW5lcmljRGFvLmdldFZlcnRleEJ5UHJvcGVydHkoCisJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJaWYgKHZlcnRleEJ5UHJvcGVydHkuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gYWRkIGluc3RhbmNlQ291bnRlciB0byBWRiB7fSAuIGVycm9yIGlzOiB7fSIsIHJlc291cmNlLmdldFVuaXF1ZUlkKCksCisJCQkJCQl2ZXJ0ZXhCeVByb3BlcnR5LnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCVZlcnRleCB2ZlZlcnRleCA9IHZlcnRleEJ5UHJvcGVydHkubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoIXZmVmVydGV4LnByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5TVEFOQ0VfQ09VTlRFUi5nZXRQcm9wZXJ0eSgpKS5pc1ByZXNlbnQoKSkgeworCQkJCXZmVmVydGV4LnByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5TVEFOQ0VfQ09VTlRFUi5nZXRQcm9wZXJ0eSgpLCAwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gZml4RGVyaXZlZFZmKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbFZGID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBwcm9wcywgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAoYWxsVkYuaXNSaWdodCgpKSB7CisJCQlpZiAoYWxsVkYucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJbG9nLmRlYnVnKCJmaXhEZXJpdmVkVmYgLSBubyBWRnMiKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiZml4RGVyaXZlZEZ2IGZhaWxlZCBmZXRjaCBhbGwgVkYgcmVzb3VyY2VzLGVycm9yIHt9IiwgYWxsVkYucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gdmZVdWlkVG9WZmNVdWlkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgbWV0YWRhdGEgOiBhbGxWRi5sZWZ0KCkudmFsdWUoKSkgeworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uCisJCQkJCS5nZXRSZXNvdXJjZShtZXRhZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCQlpZiAoZWl0aGVyUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gbWlncmF0ZSBWRiB7fSBmcm9tIHZlcnNpb24gMTYwMiB0byB2ZXJzaW9uIDE2MDQuIGVycm9yIGlzOiB7fSIsCisJCQkJCQltZXRhZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgZWl0aGVyUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJUmVzb3VyY2UgdmZSZXNvdXJjZSA9IGVpdGhlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHZmUmVzb3VyY2UuZ2V0RGVyaXZlZEZyb20oKSA9PSBudWxsIHx8IHZmUmVzb3VyY2UuZ2V0RGVyaXZlZEZyb20oKS5pc0VtcHR5KCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUJvb2xlYW4gaXNWZkRlbGV0ZWQgPSB2ZlJlc291cmNlLmdldElzRGVsZXRlZCgpOworCQkJU3RyaW5nIHZmVVVJRCA9IHZmUmVzb3VyY2UuZ2V0VVVJRCgpOworCQkJU3RyaW5nIHZmY1VVSUQgPSB2ZlV1aWRUb1ZmY1V1aWQuZ2V0T3JEZWZhdWx0KHZmVVVJRCwgbnVsbCk7CisJCQlpZiAodmZjVVVJRCA9PSBudWxsKSB7CisJCQkJdmZjVVVJRCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCQkJdmZVdWlkVG9WZmNVdWlkLnB1dCh2ZlVVSUQsIHZmY1VVSUQpOworCQkJfQorCisJCQkvLyBoYW5kbGUgbGlmZWN5Y2xlCisJCQlTdHJpbmcgdmZVbmlxdWVJZCA9IHZmUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSB2ZmNUYXJnZXRTdGF0ZSA9IHZmUmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKTsKKwkJCWlmICh2ZmNUYXJnZXRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKQorCQkJCQl8fCB2ZmNUYXJnZXRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpKSB7CisJCQkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJCQl1c2VyLnNldFVzZXJJZCh2ZlJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQkJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja2luQ29tcG9uZW50ID0gbGlmZWN5Y2xlT3BlcmFpb24KKwkJCQkJCS5jaGVja2luQ29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdmZSZXNvdXJjZSwgdXNlciwgdXNlciwgdHJ1ZSk7CisJCQkJaWYgKGNoZWNraW5Db21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGNoZWNraW4gVkYge30uIGVycm9yPXt9IiwgdmZVbmlxdWVJZCwgY2hlY2tpbkNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodmZjVGFyZ2V0U3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKSkgeworCQkJCXZmY1RhcmdldFN0YXRlID0gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTjsKKwkJCX0KKworCQkJLy8gZGVsZXRlIFZGIFByb3BlcnRpZXMKKwkJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gdmZSZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCk7CisJCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgeworCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxQcm9wZXJ0aWVzID0gcHJvcGVydHlPcGVyYXRpb24KKwkJCQkJCS5kZWxldGVBbGxQcm9wZXJ0aWVzQXNzb2NpYXRlZFRvTm9kZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHZmVW5pcXVlSWQpOworCQkJCWlmIChkZWxldGVBbGxQcm9wZXJ0aWVzLmlzUmlnaHQoKQorCQkJCQkJJiYgIWRlbGV0ZUFsbFByb3BlcnRpZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkKKwkJCQkJCSYmICFkZWxldGVBbGxQcm9wZXJ0aWVzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZGVsZXRlIHByb3BlcnRpZXMgb2YgVkYge30gLiBlcnJvciBpczoge30iLAorCQkJCQkJCW1ldGFkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCWRlbGV0ZUFsbFByb3BlcnRpZXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQkvLyBkZWxldGUgVkYgQWRkaXRpb25hbCBJbmZvCisJCQlMaXN0PEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24+IGFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IHZmUmVzb3VyY2UuZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCk7CisJCQlpZiAoYWRkaXRpb25hbEluZm9ybWF0aW9uICE9IG51bGwgJiYgIWFkZGl0aW9uYWxJbmZvcm1hdGlvbi5pc0VtcHR5KCkpIHsKKwkJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycyA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbgorCQkJCQkJLmRlbGV0ZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcnMoTm9kZVR5cGVFbnVtLlJlc291cmNlLCB2ZlVuaXF1ZUlkLCB0cnVlKTsKKwkJCQlpZiAoZGVsZXRlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycy5pc1JpZ2h0KCkKKwkJCQkJCSYmICFkZWxldGVBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXJzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykKKwkJCQkJCSYmICFkZWxldGVBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXJzLnJpZ2h0KCkudmFsdWUoKQorCQkJCQkJCQkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBkZWxldGUgcHJvcGVydGllcyBvZiBWRiB7fSAuIGVycm9yIGlzOiB7fSIsCisJCQkJCQkJbWV0YWRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJZGVsZXRlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCS8vIGRlbGV0ZSBWRiBkZXJpdmVkRnJvbQorCQkJR3JhcGhSZWxhdGlvbiBkZXJpdmVkRnJvbVJlbGF0aW9uID0gbmV3IEdyYXBoUmVsYXRpb24oR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTS5nZXRQcm9wZXJ0eSgpKTsKKwkJCWRlcml2ZWRGcm9tUmVsYXRpb24uc2V0RnJvbShuZXcgUmVsYXRpb25FbmRQb2ludChOb2RlVHlwZUVudW0uUmVzb3VyY2UsCisJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHZmVW5pcXVlSWQpKTsKKwkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlRGVyaXZlZEZyb21SZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZGVsZXRlT3V0Z29pbmdSZWxhdGlvbihkZXJpdmVkRnJvbVJlbGF0aW9uKTsKKwkJCWlmIChkZWxldGVEZXJpdmVkRnJvbVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGRlbGV0ZSBkZXJpdmVkRnJvbSByZWxhdGlvbiBvZiBWRiB7fSAuIGVycm9yIGlzOiB7fSIsCisJCQkJCQltZXRhZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCWRlbGV0ZURlcml2ZWRGcm9tUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvLyBjcmVhdGUgVkZDCisJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVZGQyA9IGNyZWF0ZVZGQyhtZXRhZGF0YSwgdmZSZXNvdXJjZSwgdmZjVVVJRCwKKwkJCQkJdmZjVGFyZ2V0U3RhdGUpOworCQkJaWYgKGNyZWF0ZVZGQy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBzcGxpdCBWRiB7fSB0byBWRkMuIGVycm9yIGlzOiB7fSIsCisJCQkJCQltZXRhZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgY3JlYXRlVkZDLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCVJlc291cmNlIHZmY1Jlc291cmNlID0gY3JlYXRlVkZDLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKCFjcmVhdGVWZmNJbnN0YW5jZU9uVmYodmZjUmVzb3VyY2UsIHZmVW5pcXVlSWQpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJLy8gdXBkYXRlIFZGQyB0byBkZWxldGVkIGlmIHJlcXVpcmVkCisJCQlpZiAoaXNWZkRlbGV0ZWQgIT0gbnVsbCAmJiBpc1ZmRGVsZXRlZCkgeworCQkJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG1hcmtSZXNvdXJjZVRvRGVsZXRlID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkJCS5tYXJrQ29tcG9uZW50VG9EZWxldGUodmZjUmVzb3VyY2UsIHRydWUpOworCQkJCWlmIChtYXJrUmVzb3VyY2VUb0RlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gbWFyayBpc0RlbGV0ZWQgb24gVkZDIHt9IC4gZXJyb3IgaXM6IHt9IiwgdmZjUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCQltYXJrUmVzb3VyY2VUb0RlbGV0ZS5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVWRkMoUmVzb3VyY2VNZXRhZGF0YURhdGEgbWV0YWRhdGEsIFJlc291cmNlIHZmY1Jlc291cmNlLAorCQkJU3RyaW5nIHV1aWQsIExpZmVjeWNsZVN0YXRlRW51bSB2ZmNUYXJnZXRTdGF0ZSkgeworCisJCUJvb2xlYW4gaGlnaGVzdFZlcnNpb24gPSB2ZmNSZXNvdXJjZS5pc0hpZ2hlc3RWZXJzaW9uKCk7CisJCS8vIFJlc291cmNlIHZmY1Jlc291cmNlID0gbmV3IFJlc291cmNlKChSZXNvdXJjZU1ldGFkYXRhRGVmaW5pdGlvbikKKwkJLy8gdmZSZXNvdXJjZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSk7CisJCS8vIFN0cmluZyBjb21wb25lbnROYW1lID0gdmZjUmVzb3VyY2UuZ2V0TmFtZSgpKyJWRkMiOworCQkvLyB2ZmNSZXNvdXJjZS5zZXROYW1lKGNvbXBvbmVudE5hbWUpOworCQkvLyB2ZmNSZXNvdXJjZS5zZXROb3JtYWxpemVkTmFtZShWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSk7CisJCS8vIHZmY1Jlc291cmNlLnNldFN5c3RlbU5hbWUoVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoY29tcG9uZW50TmFtZSkpOworCQl2ZmNSZXNvdXJjZS5zZXRVbmlxdWVJZChudWxsKTsKKwkJdmZjUmVzb3VyY2Uuc2V0VVVJRCh1dWlkKTsKKwkJdmZjUmVzb3VyY2Uuc2V0QWxsVmVyc2lvbnMobnVsbCk7CisJCXZmY1Jlc291cmNlLnNldEFydGlmYWN0cyhudWxsKTsKKwkJdmZjUmVzb3VyY2Uuc2V0RGVwbG95bWVudEFydGlmYWN0cyhudWxsKTsKKwkJdmZjUmVzb3VyY2Uuc2V0Q29tcG9uZW50SW5zdGFuY2VzKG51bGwpOworCQl2ZmNSZXNvdXJjZS5zZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKG51bGwpOworCQl2ZmNSZXNvdXJjZS5zZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMobnVsbCk7CisJCXZmY1Jlc291cmNlLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGQyk7CisJCXZmY1Jlc291cmNlLnNldElzRGVsZXRlZChmYWxzZSk7CisKKwkJdmZjUmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUodmZjVGFyZ2V0U3RhdGUpOworCQkvLyB2ZmNSZXNvdXJjZS5zZXREZXJpdmVkRnJvbSh2ZlJlc291cmNlLmdldERlcml2ZWRGcm9tKCkpOworCQkvLyB2ZmNSZXNvdXJjZS5zZXRQcm9wZXJ0aWVzKHZmUmVzb3VyY2UuZ2V0UHJvcGVydGllcygpKTsKKwkJLy8gdmZjUmVzb3VyY2Uuc2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKHZmUmVzb3VyY2UuZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkpOworCQkvLyB2ZmNSZXNvdXJjZS5zZXRDYXRlZ29yaWVzKHZmUmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpKTsKKwkJLy8gdmZjUmVzb3VyY2Uuc2V0VGFncyh2ZlJlc291cmNlLmdldFRhZ3MoKSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmNyZWF0ZVJlc291cmNlKHZmY1Jlc291cmNlLCB0cnVlKTsKKwkJaWYgKGNyZWF0ZVJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlOworCQl9CisJCVJlc291cmNlIGFmdGVyQ3JlYXRlUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4QnlQcm9wZXJ0eSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIGFmdGVyQ3JlYXRlUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWlmICh2ZXJ0ZXhCeVByb3BlcnR5LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlOworCQl9CisJCVZlcnRleCBuZXdWZmNWZXJ0ZXggPSB2ZXJ0ZXhCeVByb3BlcnR5LmxlZnQoKS52YWx1ZSgpOworCQluZXdWZmNWZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VVUlELmdldFByb3BlcnR5KCksIHV1aWQpOworCQlpZiAoIWhpZ2hlc3RWZXJzaW9uKSB7CisJCQluZXdWZmNWZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgZmFsc2UpOworCQl9CisJCXJldHVybiBjcmVhdGVSZXNvdXJjZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY3JlYXRlVmZjSW5zdGFuY2VPblZmKFJlc291cmNlIHZmY1Jlc291cmNlLCBTdHJpbmcgdmZVbmlxdWVJZCkgeworCQkvLyBjcmVhdGUgVkZDIGluc3RhbmNlIG9uIFZGCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gbmV3IENvbXBvbmVudEluc3RhbmNlKCk7CisJCWNvbXBvbmVudEluc3RhbmNlLnNldENvbXBvbmVudFVpZCh2ZmNSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJY29tcG9uZW50SW5zdGFuY2Uuc2V0UG9zWCgiNTUwIik7CisJCWNvbXBvbmVudEluc3RhbmNlLnNldFBvc1koIjMwMCIpOworCQljb21wb25lbnRJbnN0YW5jZS5zZXROYW1lKHZmY1Jlc291cmNlLmdldE5hbWUoKSk7CisJCWNvbXBvbmVudEluc3RhbmNlLnNldEljb24odmZjUmVzb3VyY2UuZ2V0SWNvbigpKTsKKwkJY29tcG9uZW50SW5zdGFuY2Uuc2V0VG9zY2FDb21wb25lbnROYW1lKHZmY1Jlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQlFaXRoZXI8U3RyaW5nLCBCb29sZWFuPiBoYW5kbGVOYW1lTG9naWMgPSBoYW5kbGVOYW1lTG9naWMoY29tcG9uZW50SW5zdGFuY2UsIHZmVW5pcXVlSWQsIHZmY1Jlc291cmNlLmdldE5hbWUoKSk7CisJCWlmIChoYW5kbGVOYW1lTG9naWMuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgbG9naWNhbCBuYW1lIGZvciB2ZmMgaW5zdGFuY2UiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYWlvbgorCQkJCS5jcmVhdGVDb21wb25lbnRJbnN0YW5jZSh2ZlVuaXF1ZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGhhbmRsZU5hbWVMb2dpYy5sZWZ0KCkudmFsdWUoKSwKKwkJCQkJCWNvbXBvbmVudEluc3RhbmNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUpOworCisJCWlmIChjcmVhdGVDb21wb25lbnRJbnN0YW5jZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSB2ZmMgaW5zdGFuY2Ugb24gdmYge30uIGVycm9yOiB7fSIsIHZmVW5pcXVlSWQsCisJCQkJCWNyZWF0ZUNvbXBvbmVudEluc3RhbmNlLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gaGFuZGxlTmFtZUxvZ2ljKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsCisJCQlTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEluTnVtYmVyU3RhdHVzID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkuaW5jcmVhc2VBbmRHZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIoY29udGFpbmVyQ29tcG9uZW50SWQsIHRydWUpOworCisJCWlmIChjb21wb25lbnRJbk51bWJlclN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBjb21wb25lbnQgaW5zdGFuY2UgbnVtYmVyIGZvciBjb250YWluZXIgY29tcG9uZW50IHt9ICIsIGNvbnRhaW5lckNvbXBvbmVudElkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZmFsc2UpOworCQl9CisJCVN0cmluZyByZXNvdXJjZUluTnVtYmVyID0gY29tcG9uZW50SW5OdW1iZXJTdGF0dXMubGVmdCgpLnZhbHVlKCkudG9TdHJpbmcoKTsKKwkJY29tcG9uZW50SW5zdGFuY2Uuc2V0Q29tcG9uZW50TmFtZShyZXNvdXJjZU5hbWUpOworCQljb21wb25lbnRJbnN0YW5jZS5zZXROYW1lKHJlc291cmNlTmFtZSk7CisJCVN0cmluZyBsb2dpY2FsTmFtZSA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmFpb24uY3JlYXRlQ29tcG9uZW50SW5zdExvZ2ljYWxOYW1lKHJlc291cmNlSW5OdW1iZXIsIHJlc291cmNlTmFtZSk7CisKKwkJQm9vbGVhbiBlaXRoZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZU5hbWUobG9naWNhbE5hbWUsIGNvbXBvbmVudEluc3RhbmNlLCB0cnVlKTsKKwkJaWYgKCFlaXRoZXJWYWxpZGF0aW9uKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZhbHNlKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZUluTnVtYmVyKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZU5hbWUoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lLCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlLAorCQkJYm9vbGVhbiBpc0NyZWF0ZSkgeworCisJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU3RyaW5nTm90RW1wdHkocmVzb3VyY2VJbnN0YW5jZU5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXROb3JtYWxpemVkTmFtZShWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50SW5zdGFuY2VOYW1lKHJlc291cmNlSW5zdGFuY2VOYW1lKSk7CisJCWlmICghaXNDcmVhdGUpIHsKKwkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZU5hbWVMZW5ndGgocmVzb3VyY2VJbnN0YW5jZU5hbWUpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZUluc3RhbmNlTmFtZShyZXNvdXJjZUluc3RhbmNlTmFtZSkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKworCX0KKworCXB1YmxpYyBib29sZWFuIG1pZ3JhdGUxNjA0dG8xNjA3KFN0cmluZyBhcHBDb25maWdEaXIpIHsKKwkJbG9nLmRlYnVnKCJTdGFydGVkIHRoZSBtaWdyYXRpb24gcHJvY2VkdXJlIGZyb20gdmVyc2lvbiAxNjA0IHRvIHZlcnNpb24gMTYwNyAuLi4iKTsKKwkJbG9nLmRlYnVnKCJHZXR0aW5nIGFsbCByZXNvdXJjZXMgd2l0aCByZXNvdXJjZXMiKTsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlRWl0aGVyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbFJlc291cmNlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIG51bGwsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChhbGxSZXNvdXJjZXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgcmVzb3VyY2VzIGZyb20gREIsIGVycm9yOiB7fSIsIGFsbFJlc291cmNlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZXNMaXN0ID0gYWxsUmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJlc291cmNlc0xpc3QgPT0gbnVsbCkgeworCQkJCWxvZy5lcnJvcigiQ291bGRuJ3QgZ2V0IHJlc291cmNlcyBmcm9tIERCLCBubyByZXNvdXJjZXMgZm91bmQiKTsKKwkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJbG9nLmRlYnVnKCJGb3VuZCB7fSByZXNvdXJjZXMiLCByZXNvdXJjZXNMaXN0LnNpemUoKSk7CisJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlIDogcmVzb3VyY2VzTGlzdCkgeworCQkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOworCQkJCWxvZy5kZWJ1ZygiQ2hlY2tpbmcgcmVzb3VyY2Uge30iLCByZXNvdXJjZU5hbWUpOworCQkJCWlmIChpc05vcm1hdGl2ZShyZXNvdXJjZU5hbWUpKSB7CisJCQkJCXJlc291cmNlRWl0aGVyID0gY2hhbmdlTm9ybWF0aXZlVHlwZU5hbWUocmVzb3VyY2UpOworCQkJCQlpZiAocmVzb3VyY2VFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZXJyb3IoIkRCIGVycm9yIGR1cmluZyBuYW1lIGNoYW5naW5nIik7CisJCQkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSByZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpLmdldFJlc291cmNlVHlwZSgpLm5hbWUoKQorCQkJCQkJLmVxdWFscygiVkYiKSkgeworCQkJCQlyZXNvdXJjZUVpdGhlciA9IHNldFZmVG9zY2FSZXNvdXJjZU5hbWUocmVzb3VyY2UpOworCQkJCQlpZiAocmVzb3VyY2VFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZXJyb3IoIkRCIGVycm9yIGR1cmluZyB0b3NjYSByZXNvdXJjZSBuYW1lIHNldHRpbmciKTsKKwkJCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJlc3VsdCA9IGFkZEludmFyaWFudFVVSURzKGFwcENvbmZpZ0Rpcik7CisJCX0gZmluYWxseSB7CisJCQlpZiAoIXJlc3VsdCkgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworCQkJCWxvZy5kZWJ1ZygiVGhlIG1pZ3JhdGlvbiBwcm9jZWR1cmUgZnJvbSB2ZXJzaW9uIDE2MDQgdG8gdmVyc2lvbiAxNjA3IEZBSUxFRCEhIik7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQlsb2cuZGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKKwkJCQlsb2cuZGVidWcoIlRoZSBtaWdyYXRpb24gcHJvY2VkdXJlIGZyb20gdmVyc2lvbiAxNjA0IHRvIHZlcnNpb24gMTYwNyBlbmRlZCBzdWNjZXNzZnVsbHkhIik7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgYm9vbGVhbiBhZGRJbnZhcmlhbnRVVUlEcyhTdHJpbmcgYXBwQ29uZmlnRGlyKSB7CisJCWxvZy5kZWJ1ZygiU3RhcnRlZCBhZGRpbmcgb2YgSW52YXJpYW50VVVJRCAuLi4iKTsKKwkJbG9nLmRlYnVnKCJHZXR0aW5nIGFsbCByZXNvdXJjZXMgd2l0aCBoaWdoZXN0IHZlcnNpb24iKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisKKwkJTGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+IGZ1bGxDb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+KCk7CisKKwkJLy8gZ2V0dGluZyByZXNvdXJjZXMKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsSGlnaGVzdFZlcnNpb25SZXNvdXJjZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChhbGxIaWdoZXN0VmVyc2lvblJlc291cmNlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiQ291bGRuJ3QgZ2V0IHJlc291cmNlcyB3aXRoIGhpZ2hlc3QgdmVyc2lvbiBmcm9tIERCLCBlcnJvcjoge30iLAorCQkJCQlhbGxIaWdoZXN0VmVyc2lvblJlc291cmNlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGFsbEhpZ2hlc3RWZXJzaW9uUmVzb3VyY2VzQUwgPSBhbGxIaWdoZXN0VmVyc2lvblJlc291cmNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGFsbEhpZ2hlc3RWZXJzaW9uUmVzb3VyY2VzQUwgPT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgcmVzb3VyY2VzIHdpdGggaGlnaGVzdCB2ZXJzaW9uIGZyb20gREIsIG5vIHJlc291cmNlcyBmb3VuZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWxvZy5kZWJ1ZygiRm91bmQge30gcmVzb3VyY2VzIiwgYWxsSGlnaGVzdFZlcnNpb25SZXNvdXJjZXNBTC5zaXplKCkpOworCQlmdWxsQ29tcG9uZW50TGlzdC5hZGRBbGwoYWxsSGlnaGVzdFZlcnNpb25SZXNvdXJjZXNBTCk7CisKKwkJLy8gZ2V0dGluZyBzZXJ2aWNlcworCQlFaXRoZXI8TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbEhpZ2hlc3RWZXJzaW9uU2VydmljZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uU2VydmljZSwgcHJvcHMsIFNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAoYWxsSGlnaGVzdFZlcnNpb25TZXJ2aWNlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiQ291bGRuJ3QgZ2V0IHNlcnZpY2VzIHdpdGggaGlnaGVzdCB2ZXJzaW9uIGZyb20gREIsIGVycm9yOiB7fSIsCisJCQkJCWFsbEhpZ2hlc3RWZXJzaW9uU2VydmljZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlMaXN0PFNlcnZpY2VNZXRhZGF0YURhdGE+IGFsbEhpZ2hlc3RWZXJzaW9uU2VydmljZXNBTCA9IGFsbEhpZ2hlc3RWZXJzaW9uU2VydmljZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChhbGxIaWdoZXN0VmVyc2lvblNlcnZpY2VzQUwgPT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgc2VydmljZXMgd2l0aCBoaWdoZXN0IHZlcnNpb24gZnJvbSBEQiwgbm8gc2VydmljZXMgZm91bmQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlsb2cuZGVidWcoIkZvdW5kIHt9IHNlcnZpY2VzIiwgYWxsSGlnaGVzdFZlcnNpb25TZXJ2aWNlc0FMLnNpemUoKSk7CisJCWZ1bGxDb21wb25lbnRMaXN0LmFkZEFsbChhbGxIaWdoZXN0VmVyc2lvblNlcnZpY2VzQUwpOworCisJCUxpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiByZWR1Y2VkQ29tcG9uZW50c0FMID0gcmVkdWNlSGlnaGVzdFZlcnNpb25SZXNvdXJjZXNMaXN0KGZ1bGxDb21wb25lbnRMaXN0KTsKKworCQkvLyBnZXR0aW5nIHByb2R1Y3RzCisJCUVpdGhlcjxMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsSGlnaGVzdFZlcnNpb25Qcm9kdWN0cyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5Qcm9kdWN0LCBwcm9wcywgUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChhbGxIaWdoZXN0VmVyc2lvblByb2R1Y3RzLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgcHJvZHVjdHMgd2l0aCBoaWdoZXN0IHZlcnNpb24gZnJvbSBEQiwgZXJyb3I6IHt9IiwKKwkJCQkJYWxsSGlnaGVzdFZlcnNpb25Qcm9kdWN0cy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUxpc3Q8UHJvZHVjdE1ldGFkYXRhRGF0YT4gYWxsSGlnaGVzdFZlcnNpb25Qcm9kdWN0c0FMID0gYWxsSGlnaGVzdFZlcnNpb25Qcm9kdWN0cy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGFsbEhpZ2hlc3RWZXJzaW9uUHJvZHVjdHNBTCA9PSBudWxsKSB7CisJCQlsb2cuZXJyb3IoIkNvdWxkbid0IGdldCBwcm9kdWN0cyB3aXRoIGhpZ2hlc3QgdmVyc2lvbiBmcm9tIERCLCBubyBwcm9kdWN0cyBmb3VuZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWxvZy5kZWJ1ZygiRm91bmQge30gcHJvZHVjdHMiLCBhbGxIaWdoZXN0VmVyc2lvblByb2R1Y3RzQUwuc2l6ZSgpKTsKKworCQlMaXN0PENvbXBvbmVudE1ldGFkYXRhRGF0YT4gZnVsbFByb2R1Y3RMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+KCk7CisJCWZ1bGxQcm9kdWN0TGlzdC5hZGRBbGwoYWxsSGlnaGVzdFZlcnNpb25Qcm9kdWN0c0FMKTsKKwkJTGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+IHJlZHVjZWRQcm9kdWN0QUwgPSByZWR1Y2VIaWdoZXN0VmVyc2lvblJlc291cmNlc0xpc3QoZnVsbFByb2R1Y3RMaXN0KTsKKworCQlmb3IgKENvbXBvbmVudE1ldGFkYXRhRGF0YSBwcm9kdWN0IDogcmVkdWNlZFByb2R1Y3RBTCkgeworCQkJaWYgKCFzZXRQcm9kdWN0SW52YXJpYW50VVVJRElmRXhpc3RzKChQcm9kdWN0TWV0YWRhdGFEYXRhKSBwcm9kdWN0KSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZWR1Y2VkQ29tcG9uZW50c0FMLmFkZEFsbChyZWR1Y2VkUHJvZHVjdEFMKTsKKworCQlsb2cuZGVidWcoIlJlZHVjZWQgbGlzdCBvZiBIaWdoZXN0IFZlcnNpb24gQ29tcG9uZW50cyBjb250YWlucyB7fSBjb21wb25lbnRzIiwgcmVkdWNlZENvbXBvbmVudHNBTC5zaXplKCkpOworCQlmb3IgKENvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnRNZXRhRGF0YSA6IHJlZHVjZWRDb21wb25lbnRzQUwpIHsKKworCQkJU3RyaW5nIGludmFyaWFudFVVSUQgPSBjb21wb25lbnRNZXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0SW52YXJpYW50VVVJRCgpOworCQkJbG9nLmRlYnVnKCJvbGQgaW52YXJpYW50VVVJRCB7fSIsIGludmFyaWFudFVVSUQpOworCQkJaWYgKGludmFyaWFudFVVSUQgPT0gbnVsbCB8fCBpbnZhcmlhbnRVVUlELmlzRW1wdHkoKSkgeworCQkJCWludmFyaWFudFVVSUQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRJbnZhcmlhbnRVVUlEKCk7CisJCQkJY29tcG9uZW50TWV0YURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldEludmFyaWFudFVVSUQoaW52YXJpYW50VVVJRCk7CisJCQl9CisJCQlsb2cuZGVidWcoIm5ldyBpbnZhcmlhbnRVVUlEIHt9IiwgY29tcG9uZW50TWV0YURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldEludmFyaWFudFVVSUQoKSk7CisJCQlFaXRoZXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkudXBkYXRlTm9kZShjb21wb25lbnRNZXRhRGF0YSwgQ29tcG9uZW50TWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiREIgZXJyb3IgZHVyaW5nIHdoaWxlIHVwZGF0aW5nIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwKKwkJCQkJCWNvbXBvbmVudE1ldGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksIHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlsb2cuZGVidWcoInVwZGF0ZWQgaW52YXJpYW50VVVJRCB7fSIsCisJCQkJCXVwZGF0ZU5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldEludmFyaWFudFVVSUQoKSk7CisJCQlpZiAoIWlzT25seVZlcnNpb24oY29tcG9uZW50TWV0YURhdGEpKSB7CisJCQkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IG51bGw7CisJCQkJc3dpdGNoIChOb2RlVHlwZUVudW0uZ2V0QnlOYW1lKGNvbXBvbmVudE1ldGFEYXRhLmdldExhYmVsKCkpKSB7CisJCQkJY2FzZSBSZXNvdXJjZToKKwkJCQkJY29tcG9uZW50T3BlcmF0aW9uID0gcmVzb3VyY2VPcGVyYXRpb247CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2VydmljZToKKwkJCQkJY29tcG9uZW50T3BlcmF0aW9uID0gc2VydmljZU9wZXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQcm9kdWN0OgorCQkJCQljb21wb25lbnRPcGVyYXRpb24gPSBwcm9kdWN0T3BlcmF0aW9uOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50UmVzdWx0ID0gY29tcG9uZW50T3BlcmF0aW9uCisJCQkJCQkuZ2V0Q29tcG9uZW50KChTdHJpbmcpIGNvbXBvbmVudE1ldGFEYXRhLmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJCWlmIChnZXRDb21wb25lbnRSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiREIgZXJyb3IgZHVyaW5nIHdoaWxlIGdldHRpbmcgY29tcG9uZW50IHdpdGggdW5pcXVlSUQge30sIGVycm9yOiB7fSIsCisJCQkJCQkJY29tcG9uZW50TWV0YURhdGEuZ2V0VW5pcXVlSWQoKSwgZ2V0Q29tcG9uZW50UmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldENvbXBvbmVudFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAoY29tcG9uZW50ID09IG51bGwpIHsKKwkJCQkJbG9nLmVycm9yKCJUaGUgY29tcG9uZW50IHJlY2VpdmVkIGZyb20gREIgaXMgZW1wdHkiKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWxsVmVyc2lvbnMgPSBjb21wb25lbnQuZ2V0QWxsVmVyc2lvbnMoKTsKKwkJCQlsb2cuZGVidWcoImZvdW5kIHt9IHZlcnNpb25zIGZvciBjb21wb25lbnQge30iLCBhbGxWZXJzaW9ucy5zaXplKCksIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQkJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNFaXRoZXIgPSB1cGRhdGVBbGxWZXJzaW9ucyhhbGxWZXJzaW9ucywgaW52YXJpYW50VVVJRCk7CisJCQkJaWYgKHJlc0VpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJEQiBlcnJvciBkdXJpbmcgaW52YXJpYW50VVVJRCBhZGRpbmciKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNPbmx5VmVyc2lvbihDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50TWV0YURhdGEpIHsKKwkJU3RyaW5nIHZlcnNpb24gPSBjb21wb25lbnRNZXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpOworCQlpZiAodmVyc2lvbi5lcXVhbHMoIjAuMSIpKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gc2V0UHJvZHVjdEludmFyaWFudFVVSURJZkV4aXN0cyhQcm9kdWN0TWV0YWRhdGFEYXRhIHByb2R1Y3QpIHsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0VmVydGV4UmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldFZlcnRleEJ5UHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgcHJvZHVjdC5nZXRVbmlxdWVJZCgpKTsKKwkJaWYgKGdldFZlcnRleFJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiREIgZXJyb3IgZHVyaW5nIHJldHJpZXZpbmcgcHJvZHVjdCB2ZXJ0ZXgge30iLCBwcm9kdWN0LmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVZlcnRleCBwcm9kdWN0VmVydGV4ID0gZ2V0VmVydGV4UmVzLmxlZnQoKS52YWx1ZSgpOworCQlTdHJpbmcgaW52YXJpYW50VVVJRCA9IHByb2R1Y3RWZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT05TVEFOVF9VVUlELmdldFByb3BlcnR5KCkpOworCQlpZiAoaW52YXJpYW50VVVJRCAhPSBudWxsICYmICFpbnZhcmlhbnRVVUlELmlzRW1wdHkoKSkgeworCQkJcHJvZHVjdC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBbGxWZXJzaW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbFZlcnNpb25zLAorCQkJU3RyaW5nIGludmFyaWFudFVVSUQpIHsKKworCQlpZiAoYWxsVmVyc2lvbnMgIT0gbnVsbCkgeworCQkJZm9yIChTdHJpbmcgdW5pcXVlSUQgOiBhbGxWZXJzaW9ucy52YWx1ZXMoKSkgeworCQkJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXROb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoCisJCQkJCQlHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCB1bmlxdWVJRCwgQ29tcG9uZW50TWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCQlpZiAoZ2V0Tm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJEQiBlcnJvciBkdXJpbmcgd2hpbGUgZ2V0dGluZyBjb21wb25lbnQgd2l0aCB1bmlxdWVJRCB7fSwgZXJyb3I6IHt9IiwgdW5pcXVlSUQsCisJCQkJCQkJZ2V0Tm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJfQorCQkJCUNvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnQgPSBnZXROb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCWNvbXBvbmVudC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKwkJCQlFaXRoZXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkJLnVwZGF0ZU5vZGUoY29tcG9uZW50LCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJCWxvZy5kZWJ1ZygidXBkYXRlZCBjaGlsZCBpbnZhcmlhbnRVVUlEIHt9IiwKKwkJCQkJCXVwZGF0ZU5vZGVSZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldEludmFyaWFudFVVSUQoKSk7CisJCQkJaWYgKHVwZGF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiREIgZXJyb3IgZHVyaW5nIHdoaWxlIHVwZGF0aW5nIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwKKwkJCQkJCQljb21wb25lbnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwgdXBkYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiByZWR1Y2VIaWdoZXN0VmVyc2lvblJlc291cmNlc0xpc3QoCisJCQlMaXN0PENvbXBvbmVudE1ldGFkYXRhRGF0YT4gYWxsSGlnaGVzdFZlcnNpb25SZXNvdXJjZXMpIHsKKwkJTGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+IHJlc3VsdExpc3QgPSBudWxsOworCQlNYXA8U3RyaW5nLCBDb21wb25lbnRNZXRhZGF0YURhdGE+IHJlc3VsdEhNID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21wb25lbnRNZXRhZGF0YURhdGE+KCk7CisJCWZvciAoQ29tcG9uZW50TWV0YWRhdGFEYXRhIHJlc291cmNlIDogYWxsSGlnaGVzdFZlcnNpb25SZXNvdXJjZXMpIHsKKwkJCWlmIChyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0SW52YXJpYW50VVVJRCgpICE9IG51bGwKKwkJCQkJJiYgIXJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRJbnZhcmlhbnRVVUlEKCkuaXNFbXB0eSgpKSB7CisJCQkJbG9nLmRlYnVnKCJpbnZhcmlhbnRVVUlEIHt9ICIsIHJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJU3RyaW5nIGN1clVVSUQgPSByZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VVVJRCgpOworCQkJaWYgKHJlc3VsdEhNLmNvbnRhaW5zS2V5KGN1clVVSUQpKSB7CisJCQkJaW50IGlzSGlnaGVzdCA9IHJlc3VsdEhNLmdldChjdXJVVUlEKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpCisJCQkJCQkuY29tcGFyZVRvKHJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCkpOworCQkJCWlmIChpc0hpZ2hlc3QgPiAwKSB7CisJCQkJCWxvZy5kZWJ1ZygidmVyc2lvbiB7fSBpcyBncmVhdCB0aGFuIHt9ICIsCisJCQkJCQkJcmVzdWx0SE0uZ2V0KGN1clVVSUQpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCksCisJCQkJCQkJcmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXJlc3VsdEhNLnB1dChjdXJVVUlELCByZXNvdXJjZSk7CisJCX0KKwkJcmVzdWx0TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPihyZXN1bHRITS52YWx1ZXMoKSk7CisJCXJldHVybiByZXN1bHRMaXN0OworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc05vcm1hdGl2ZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgTk9STUFUSVZFX09MRF9OQU1FUy5sZW5ndGg7ICsraSkgeworCQkJaWYgKE5PUk1BVElWRV9PTERfTkFNRVNbaV0uZXF1YWxzKHJlc291cmNlTmFtZSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNoYW5nZU5vcm1hdGl2ZVR5cGVOYW1lKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlKSB7CisKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7CisKKwkJaWYgKHJlc291cmNlTmFtZSAhPSBudWxsICYmICFyZXNvdXJjZU5hbWUuaXNFbXB0eSgpKSB7CisJCQlsb2cuZGVidWcoIkZvdW5kIG5vcm1hdGl2ZSB0eXBlIHRvIGNoYW5nZSAtIHt9IiwgcmVzb3VyY2VOYW1lKTsKKwkJCVN0cmluZyBvbGROYW1lID0gcmVzb3VyY2VOYW1lOworCQkJU3RyaW5nW10gc3BsaXRlZE5hbWUgPSByZXNvdXJjZU5hbWUuc3BsaXQoIlxcLiIpOworCQkJU3RyaW5nIG5ld05hbWUgPSBzcGxpdGVkTmFtZVtzcGxpdGVkTmFtZS5sZW5ndGggLSAxXTsKKwkJCVN0cmluZyBuZXdTeXN0ZW1OYW1lID0gVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUobmV3TmFtZSk7CisJCQlTdHJpbmcgbmV3Tm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShuZXdOYW1lKTsKKwkJCWxvZy5kZWJ1ZygiU2V0dGluZyBuYW1lIHRvIGJlIHt9IiwgbmV3TmFtZSk7CisKKwkJCXJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXROYW1lKG5ld05hbWUpOworCQkJbG9nLmRlYnVnKCJTZXR0aW5nIHN5c3RlbSBuYW1lIHRvIGJlIHt9IiwgbmV3U3lzdGVtTmFtZSk7CisJCQlyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3lzdGVtTmFtZShuZXdTeXN0ZW1OYW1lKTsKKwkJCWxvZy5kZWJ1ZygiU2V0dGluZyBub3JtYWxpemVkIG5hbWUgdG8gYmUge30iLCBuZXdOb3JtYWxpemVkTmFtZSk7CisJCQlyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0Tm9ybWFsaXplZE5hbWUobmV3Tm9ybWFsaXplZE5hbWUpOworCQkJbG9nLmRlYnVnKCJVcGRhdGluZyB0YWcgaW4gbWV0YWRhdGEgdG8gYmUge30iLCBuZXdOYW1lKTsKKwkJCXJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRUYWdzKCkucmVtb3ZlKG9sZE5hbWUpOworCQkJcmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFRhZ3MoKS5hZGQobmV3TmFtZSk7CisKKwkJCWxvZy5kZWJ1ZygiQ3JlYXRpbmcgdGFnIG5vZGUgd2l0aCBuYW1lIHt9IiwgbmV3TmFtZSk7CisJCQlUYWdEYXRhIHRhZ0RhdGEgPSBuZXcgVGFnRGF0YSgpOworCQkJdGFnRGF0YS5zZXROYW1lKG5ld05hbWUpOworCQkJRWl0aGVyPFRhZ0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUodGFnRGF0YSwgVGFnRGF0YS5jbGFzcyk7CisJCQlpZiAoY3JlYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRhZyBub2RlIHt9LCBlcnJvcjoge30uIiwgbmV3TmFtZSwgY3JlYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJCQorCQkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKHJlc291cmNlLAorCQkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkRCIGVycm9yIGR1cmluZyB3aGlsZSB1cGRhdGluZyBub3JtYXRpdmUgdHlwZSB7fSwgZXJyb3I6IHt9IiwKKwkJCQkJCXJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksIHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisJCQlsb2cuZGVidWcoIk5vcm1hdGl2ZSB0eXBlIHt9IHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZCIsIHJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZW5lcmF0ZUFuZFNldFRvc2NhUmVzb3VyY2VOYW1lKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlLAorCQkJU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lKSB7CisJCWlmICh0b3NjYVJlc291cmNlTmFtZSA9PSBudWxsKSB7CisJCQl0b3NjYVJlc291cmNlTmFtZSA9IENvbW1vbkJlVXRpbHMuZ2VuZXJhdGVUb3NjYVJlc291cmNlTmFtZSgKKwkJCQkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIHJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuZ2V0UmVzb3VyY2VUeXBlKCkubmFtZSgpLAorCQkJCQlyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3lzdGVtTmFtZSgpKTsKKwkJfQorCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVUb3NjYVJlc291cmNlTmFtZUV4aXN0cyA9IHJlc291cmNlT3BlcmF0aW9uCisJCQkJLnZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVFeGlzdHModG9zY2FSZXNvdXJjZU5hbWUpOworCQlpZiAodmFsaWRhdGVUb3NjYVJlc291cmNlTmFtZUV4aXN0cy5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IHZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVFeGlzdHMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJDb3VsZG4ndCB2YWxpZGF0ZSB0b3NjYVJlc291cmNlTmFtZSB1bmlxdWVuZXNzIC0gZXJyb3I6IHt9Iiwgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMpOworCQl9CisJCWlmICh2YWxpZGF0ZVRvc2NhUmVzb3VyY2VOYW1lRXhpc3RzLmxlZnQoKS52YWx1ZSgpKSB7CisJCQlsb2cuZGVidWcoIlNldHRpbmcgdG9zY2EgcmVzb3VyY2UgbmFtZSB0byBiZSB7fSIsIHRvc2NhUmVzb3VyY2VOYW1lKTsKKwkJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSByZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpCisJCQkJCS5zZXRUb3NjYVJlc291cmNlTmFtZSh0b3NjYVJlc291cmNlTmFtZSk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0gZWxzZSB7CisJCQkvLyBBcyBhZ3JlZWQgd2l0aCBSZW5hbmEgLSBjYW5ub3QgYmUgZml4ZWQgYXV0b21hdGljYWxseQorCQkJbG9nLndhcm4oInRvc2NhUmVzb3VyY2VOYW1lIHt9IGlzIG5vdCB1bmlxdWUhIENhbm5vdCBzZXQgaXQuIENvbnRpbnVpbmcuLi4iKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChmYWxzZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSGVhdFBsYWNlSG9sZGVycyhTdHJpbmcgYXBwQ29uZmlnRGlyKSB7CisKKwkJaWYgKCFBbGxvd011bHRpcGxlSGVhdHMucmVtb3ZlQW5kVXBkYXRlSGVhdFBsYWNlSG9sZGVycyh0aXRhbkdlbmVyaWNEYW8sIGxvZywgZmFsc2UpKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgaGVhdCBwbGFjZSBob2xkZXJzIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2V0VmZUb3NjYVJlc291cmNlTmFtZShSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZSkgeworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKTsKKwkJU3RyaW5nIHJlc291cmNlVHlwZSA9ICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSByZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpLmdldFJlc291cmNlVHlwZSgpCisJCQkJLm5hbWUoKTsKKwkJU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lID0gQ29tbW9uQmVVdGlscy5nZW5lcmF0ZVRvc2NhUmVzb3VyY2VOYW1lKHJlc291cmNlVHlwZSwKKwkJCQlyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3lzdGVtTmFtZSgpKTsKKwkJbG9nLmRlYnVnKCJTZXR0aW5nIHRvc2NhIHJlc291cmNlIG5hbWUge30gdG8gVkYge30iLCB0b3NjYVJlc291cmNlTmFtZSwgcmVzb3VyY2VOYW1lKTsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIHJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuc2V0VG9zY2FSZXNvdXJjZU5hbWUodG9zY2FSZXNvdXJjZU5hbWUpOworCisJCUVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShyZXNvdXJjZSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJEQiBlcnJvciBkdXJpbmcgd2hpbGUgdXBkYXRpbmcgVkYgdG9zY2EgcmVzb3VyY2UgbmFtZSB7fSwgZXJyb3I6IHt9IiwKKwkJCQkJcmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwgdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJCWxvZy5kZWJ1ZygiVG9zY2EgcmVzb3VyY2UgbmFtZSBvZiBWRiB7fSB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQiLAorCQkJCXJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gdGVzdEFkZEdyb3VwVXVpZHMoU3RyaW5nIGFwcENvbmZpZ0RpcikgeworCisJCWlmICghQWRkR3JvdXBVdWlkLmFkZEdyb3VwVXVpZHModGl0YW5HZW5lcmljRGFvLCBsb2csIGZhbHNlKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gdXBkYXRlIGdyb3VwIFVVSURzIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNC9WZmNOYW1pbmdBbGlnbm1lbnQuamF2YSBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MDQvVmZjTmFtaW5nQWxpZ25tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiOTM1MQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MDQvVmZjTmFtaW5nQWxpZ25tZW50LmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLm1pZ3JhdGlvbi52MTYwNDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5UYWdEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnV0aWxzLkNvbW1vbkJlVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBWZmNOYW1pbmdBbGlnbm1lbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFZmY05hbWluZ0FsaWdubWVudC5jbGFzcy5nZXROYW1lKCkpOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlwdWJsaWMgYm9vbGVhbiBhbGlnblZmY05hbWVzMTYwNChTdHJpbmcgYXBwQ29uZmlnRGlyKSB7CisJCWxvZy5kZWJ1ZygiU3RhcnRlZCBhbGlnblZmY05hbWVzMTYwNCBwcm9jZWR1cmUuLiIpOworCQlsb2cuZGVidWcoIkdldHRpbmcgYWxsIHJlc291cmNlcyB3aXRoIHJlc291cmNlVHlwZSA9IFZGQy9DUC9WTCIpOworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQl0cnkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBub3RQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCQkJbm90UHJvcGVydGllcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVNPVVJDRV9UWVBFLmdldFByb3BlcnR5KCksIFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbFZmY1Jlc291cmNlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIG51bGwsIG5vdFByb3BlcnRpZXMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChhbGxWZmNSZXNvdXJjZXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBnZXQgVkZDIHJlc291cmNlcyBmcm9tIERCLCBlcnJvcjoge30iLCBhbGxWZmNSZXNvdXJjZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gdmZjTGlzdCA9IGFsbFZmY1Jlc291cmNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmICh2ZmNMaXN0ID09IG51bGwpIHsKKwkJCQlsb2cuZXJyb3IoIkNvdWxkbid0IGdldCBWRkMvQ1AvVkwgcmVzb3VyY2VzIGZyb20gREIsIG5vIHJlc291cmNlcyBmb3VuZCIpOworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlsb2cuZGVidWcoIkZvdW5kIHt9IFZGQy9DUC9WTCByZXNvdXJjZXMiLCB2ZmNMaXN0LnNpemUoKSk7CisJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHZmYyA6IHZmY0xpc3QpIHsKKwkJCQlsb2cuZGVidWcoIkNoZWNraW5nIHJlc291cmNlIHt9IiwgdmZjLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJCWJvb2xlYW4gd2FzQ2hhbmdlZCA9IGZhbHNlOworCisJCQkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZmY0VpdGhlciA9IGZpeFRvc2NhTmFtZUVtcHR5KHZmYyk7CisJCQkJaWYgKHZmY0VpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJEQiBlcnJvciBkdXJpbmcgY2hlY2tJc1Rvc2NhTmFtZUVtcHR5IC0gZXhpdGluZy4uLiIpOworCQkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQkJd2FzQ2hhbmdlZCA9IHdhc0NoYW5nZWQgfCB2ZmNFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJCQl2ZmNFaXRoZXIgPSBmaXhWZmNUb3NjYU5hbWVIYXNWZih2ZmMpOworCQkJCWlmICh2ZmNFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiREIgZXJyb3IgZHVyaW5nIGNoZWNrSXNWZmNUb3NjYU5hbWVIYXNWZiAtIGV4aXRpbmcuLi4iKTsKKwkJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJCXdhc0NoYW5nZWQgPSB3YXNDaGFuZ2VkIHwgdmZjRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCisJCQkJaWYgKHdhc0NoYW5nZWQpIHsKKwkJCQkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlVmZjID0gdXBkYXRlVmZjKHZmYyk7CisJCQkJCWlmICh1cGRhdGVWZmMuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZXJyb3IoIkRCIGVycm9yIGR1cmluZyB3aGlsZSB1cGRhdGluZyByZXNvdXJjZSB7fSwgZXJyb3I6IHt9IC0gZXhpdGluZy4uLiIsCisJCQkJCQkJCXZmYy5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpLCB1cGRhdGVWZmMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCQlsb2cuZGVidWcoIlJlc291cmNlIHt9IHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZCIsIHZmYy5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKKwkJCQl9CisKKwkJCX0KKwkJCXJlc3VsdCA9IHRydWU7CisJCX0gZmluYWxseSB7CisJCQlpZiAoIXJlc3VsdCkgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworCQkJCWxvZy5kZWJ1ZygiYWxpZ25WZmNOYW1lczE2MDQgcHJvY2VkdXJlIEZBSUxFRCEhIik7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQlsb2cuZGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKKwkJCQlsb2cuZGVidWcoImFsaWduVmZjTmFtZXMxNjA0IHByb2NlZHVyZSBlbmRlZCBzdWNjZXNzZnVsbHkhIik7CisJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlVmZjKFJlc291cmNlTWV0YWRhdGFEYXRhIHZmYykgeworCQlyZXR1cm4gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUodmZjLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZml4VG9zY2FOYW1lRW1wdHkoUmVzb3VyY2VNZXRhZGF0YURhdGEgdmZjKSB7CisJCVN0cmluZyB0b3NjYVJlc291cmNlTmFtZSA9ICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSB2ZmMuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKQorCQkJCS5nZXRUb3NjYVJlc291cmNlTmFtZSgpOworCQlpZiAodG9zY2FSZXNvdXJjZU5hbWUgPT0gbnVsbCB8fCB0b3NjYVJlc291cmNlTmFtZS50cmltKCkuZXF1YWxzKENvbnN0YW50cy5FTVBUWV9TVFJJTkcpKSB7CisJCQlsb2cuZGVidWcoIlRvc2NhIHJlc291cmNlIG5hbWUgaXMgZW1wdHkgLSBzZXR0aW5nIG5ldyB0b3NjYSBuYW1lLi4uIik7CisJCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2VuZXJhdGVBbmRTZXRUb3NjYVJlc291cmNlTmFtZSA9IGdlbmVyYXRlQW5kU2V0VG9zY2FSZXNvdXJjZU5hbWUoCisJCQkJCXZmYywgbnVsbCk7CisJCQlpZiAoZ2VuZXJhdGVBbmRTZXRUb3NjYVJlc291cmNlTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdlbmVyYXRlQW5kU2V0VG9zY2FSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGZpeFZmY1Rvc2NhTmFtZUhhc1ZmKFJlc291cmNlTWV0YWRhdGFEYXRhIHZmYykgeworCQlTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWUgPSAoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgdmZjLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkKKwkJCQkuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKTsKKwkJaWYgKHRvc2NhUmVzb3VyY2VOYW1lLmNvbnRhaW5zKCIudmYuIikpIHsKKwkJCWxvZy5kZWJ1ZygiVG9zY2EgcmVzb3VyY2UgbmFtZSB7fSBpcyBWRi1zdHlsZSAtIHNldHRpbmcgbmV3IHRvc2NhIG5hbWUuLi4iLCB0b3NjYVJlc291cmNlTmFtZSk7CisJCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2VuZXJhdGVBbmRTZXRUb3NjYVJlc291cmNlTmFtZSA9IGdlbmVyYXRlQW5kU2V0VG9zY2FSZXNvdXJjZU5hbWUoCisJCQkJCXZmYywgbnVsbCk7CisJCQlpZiAoZ2VuZXJhdGVBbmRTZXRUb3NjYVJlc291cmNlTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdlbmVyYXRlQW5kU2V0VG9zY2FSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCX0KKworCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2VuZXJhdGVBbmRTZXRUb3NjYVJlc291cmNlTmFtZShSZXNvdXJjZU1ldGFkYXRhRGF0YSB2ZmMsCisJCQlTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWUpIHsKKwkJaWYgKHRvc2NhUmVzb3VyY2VOYW1lID09IG51bGwpIHsKKwkJCXRvc2NhUmVzb3VyY2VOYW1lID0gQ29tbW9uQmVVdGlscy5nZW5lcmF0ZVRvc2NhUmVzb3VyY2VOYW1lKAorCQkJCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgdmZjLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuZ2V0UmVzb3VyY2VUeXBlKCkubmFtZSgpLAorCQkJCQl2ZmMuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN5c3RlbU5hbWUoKSk7CisJCX0KKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVFeGlzdHMgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCS52YWxpZGF0ZVRvc2NhUmVzb3VyY2VOYW1lRXhpc3RzKHRvc2NhUmVzb3VyY2VOYW1lKTsKKwkJaWYgKHZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVFeGlzdHMuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgPSB2YWxpZGF0ZVRvc2NhUmVzb3VyY2VOYW1lRXhpc3RzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiQ291bGRuJ3QgdmFsaWRhdGUgdG9zY2FSZXNvdXJjZU5hbWUgdW5pcXVlbmVzcyAtIGVycm9yOiB7fSIsIHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlT3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCQlpZiAodmFsaWRhdGVUb3NjYVJlc291cmNlTmFtZUV4aXN0cy5sZWZ0KCkudmFsdWUoKSkgeworCQkJbG9nLmRlYnVnKCJTZXR0aW5nIHRvc2NhIHJlc291cmNlIG5hbWUgdG8gYmUge30iLCB0b3NjYVJlc291cmNlTmFtZSk7CisJCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgdmZjLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuc2V0VG9zY2FSZXNvdXJjZU5hbWUodG9zY2FSZXNvdXJjZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9IGVsc2UgeworCQkJLy8gQXMgYWdyZWVkIHdpdGggUmVuYW5hIC0gY2Fubm90IGJlIGZpeGVkIGF1dG9tYXRpY2FsbHkKKwkJCWxvZy53YXJuKCJ0b3NjYVJlc291cmNlTmFtZSB7fSBpcyBub3QgdW5pcXVlISBDYW5ub3Qgc2V0IGl0LiBDb250aW51aW5nLi4uIik7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNy9Dc2FyTWlncmF0aW9uLmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjA3L0NzYXJNaWdyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTQxZWVjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9pbXBsL21pZ3JhdGlvbi92MTYwNy9Dc2FyTWlncmF0aW9uLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjA3OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5FbGVtZW50SGVscGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDc2FyTWlncmF0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3Nhck1pZ3JhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlQ3NhclJlc291cmNlcygpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCBSZXNvdXJjZVR5cGVFbnVtLlZGLm5hbWUoKSk7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcHMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJaWYgKGJ5Q3JpdGVyaWEuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCBWRiByZXNvdXJjZXMgYnkgY3JpdGVyaWEgIiwgYnlDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IHJlc291cmNlcyA9IGJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCk7CisKKwkJdHJ5IHsKKwkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgZGF0YSA6IHJlc291cmNlcykgeworCQkJCWlmIChkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRDc2FyVVVJRCgpICE9IG51bGwpIHsKKwkJCQkJbG9nLmRlYnVnKCJWRiB7fSB3aXRoIENTQVIge30iLCBkYXRhLmdldFVuaXF1ZUlkKCksIGRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldENzYXJVVUlEKCkpOworCQkJCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhCeVByb3BlcnR5ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkJLmdldFZlcnRleEJ5UHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgZGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJaWYgKHZlcnRleEJ5UHJvcGVydHkuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCB2ZXJ0ZXggd2l0aCBpZCB7fSAuIHNraXAgcmVzb3VyY2Uge30gIiwgZGF0YS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCQlkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJVmVydGV4IHZlcnRleCA9IHZlcnRleEJ5UHJvcGVydHkubGVmdCgpLnZhbHVlKCk7CisJCQkJCUl0ZXJhdG9yPFZlcnRleFByb3BlcnR5PE9iamVjdD4+IHByb3BlcnRpZXMgPSB2ZXJ0ZXgKKwkJCQkJCQkucHJvcGVydGllcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNTQVJfVVVJRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKSB7CisJCQkJCQlWZXJ0ZXhQcm9wZXJ0eTxPYmplY3Q+IG5leHQgPSBwcm9wZXJ0aWVzLm5leHQoKTsKKwkJCQkJCW5leHQucmVtb3ZlKCk7CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNsZWFuIENTQVIgVVVJRC4gcm9sbGJhY2siKTsKKwkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjEwL1RpdGFuRml4VXRpbHMuamF2YSBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MTAvVGl0YW5GaXhVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWM5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjEwL1RpdGFuRml4VXRpbHMuamF2YQpAQCAtMCwwICsxLDM4NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjEwOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYWNoZU1hbmdlck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogQ3JlYXRlZCBieSBtbGFuZG8gb24gOC8xNy8yMDE2LgorICovCitwdWJsaWMgY2xhc3MgVGl0YW5GaXhVdGlscyB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRpdGFuRml4VXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbzsKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIENhY2hlTWFuZ2VyT3BlcmF0aW9uIGNhY2hlTWFuZ2VyT3BlcmF0aW9uOworCisJcHVibGljIGJvb2xlYW4gZml4SWNvbnNJbk5vcm1hdGl2ZXMoKSB7CisJCWxvZy5pbmZvKCJzdGFydGluZyBmaXgiKTsKKwkJU3RyaW5nIHZsTmFtZSA9ICJWTCI7CisJCVN0cmluZyBlbGluZU5hbWUgPSAiVkxfRUxJTkUiOworCQlTdHJpbmcgZWxpbmVGaXhlZE5hbWUgPSAiVkwgRUxJTkUiOworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCWlmIChncmFwaFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCBncmFwaCBvYmplY3QuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlib29sZWFuIG9wZXJhdGlvbkZhaWxlZCA9IGZhbHNlOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHZsVmVydGljZVByb3BlcnRpZXMgPSBudWxsOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVsaW5lVmVydGljZVByb3BlcnRpZXMgPSBudWxsOworCisJCXRyeSB7CisJCQlUaXRhbkdyYXBoIHRpdGFuR3JhcGggPSBncmFwaFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCWxvZy5pbmZvKCJsb29rIHVwIHZsIDp7fSIsIHZsTmFtZSk7CisKKwkJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IHRpdGFuR3JhcGgucXVlcnkoKQorCQkJCQkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLmdldE5hbWUoKSkKKwkJCQkJLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgdmxOYW1lKQorCQkJCQkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCksIHRydWUpLnZlcnRpY2VzKCk7CisKKwkJCWlmICh2ZXJ0aWNlcyA9PSBudWxsKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0ICB2ZXJuaWNlIGZvciByZXNvdXJjZSBuYW1lIHt9IiwgdmxOYW1lKTsKKwkJCQlvcGVyYXRpb25GYWlsZWQgPSB0cnVlOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCUxpc3Q8VGl0YW5WZXJ0ZXg+IHZlcnRleExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgaXRlcmF0b3Igb3ZlciB2ZXJ0aWNlcyBvYmplY3QgcmV0dXJuZWQgZm9yIHJlc291cmNlIGlkIHt9IiwgdmxOYW1lKTsKKwkJCQlvcGVyYXRpb25GYWlsZWQgPSB0cnVlOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVRpdGFuVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQl2ZXJ0ZXhMaXN0LmFkZCh2ZXJ0ZXgpOworCQkJfQorCisJCQlpZiAoISh2ZXJ0ZXhMaXN0LnNpemUoKSA9PSAxKSkgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCAxIHZlcnRleCBmb3IgcmVzb3VyY2Uge30gd2l0aCBoaWdoZXN0IHRydWUuIGluc3RlYWQgZ290IHt9IiwgdmxOYW1lLAorCQkJCQkJdmVydGV4TGlzdC5zaXplKCkpOworCQkJCW9wZXJhdGlvbkZhaWxlZCA9IHRydWU7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlUaXRhblZlcnRleCB2bFZlcnRleCA9IHZlcnRleExpc3QuZ2V0KDApOworCisJCQlsb2cuaW5mbygibG9vayB1cCBlbGluZTp7fSIsIGVsaW5lTmFtZSk7CisKKwkJCWJvb2xlYW4gdmxfZWxpbmVfZm91bmQgPSB0cnVlOworCisJCQl2ZXJ0aWNlcyA9IHRpdGFuR3JhcGgucXVlcnkoKQorCQkJCQkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLmdldE5hbWUoKSkKKwkJCQkJLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgZWxpbmVOYW1lKQorCQkJCQkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCksIHRydWUpLnZlcnRpY2VzKCk7CisKKwkJCWlmICh2ZXJ0aWNlcyA9PSBudWxsKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0ICB2ZXJ0aWNlcyBvYmplY3QgcmV0dXJuZWQgZm9yIHJlc291cmNlIHt9IiwgZWxpbmVOYW1lKTsKKwkJCQlvcGVyYXRpb25GYWlsZWQgPSB0cnVlOworCisJCQkJdmxfZWxpbmVfZm91bmQgPSBmYWxzZTsKKwkJCX0KKworCQkJaWYgKHZsX2VsaW5lX2ZvdW5kKSB7CisJCQkJaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJCXZlcnRleExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkgeworCQkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgaXRlcmF0b3Igb3ZlciB2ZXJ0aWNlcyBvYmplY3QgcmV0dXJuZWQgZm9yIHJlc291cmNlIGlkIHt9IiwgZWxpbmVOYW1lKTsKKwkJCQkJb3BlcmF0aW9uRmFpbGVkID0gdHJ1ZTsKKworCQkJCQl2bF9lbGluZV9mb3VuZCA9IGZhbHNlOworCQkJCX0KKworCQkJCWlmICh2bF9lbGluZV9mb3VuZCkgeworCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCQl2ZXJ0ZXhMaXN0LmFkZCh2ZXJ0ZXgpOworCQkJCQl9CisKKwkJCQkJaWYgKCEodmVydGV4TGlzdC5zaXplKCkgPT0gMSkpIHsKKwkJCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCAxIHZlcnRleCBmb3IgcmVzb3VyY2UgIHt9IHdpdGggaGlnaGVzdCB0cnVlLiBpbnN0ZWFkIGdvdCB7fSIsCisJCQkJCQkJCWVsaW5lTmFtZSwgdmVydGV4TGlzdC5zaXplKCkpOworCQkJCQkJb3BlcmF0aW9uRmFpbGVkID0gdHJ1ZTsKKworCQkJCQkJdmxfZWxpbmVfZm91bmQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKCF2bF9lbGluZV9mb3VuZCkgeworCQkJCWxvZy5pbmZvKCJsb29rIHVwIGVsaW5lOnt9IiwgZWxpbmVGaXhlZE5hbWUpOworCQkJCXZsX2VsaW5lX2ZvdW5kID0gdHJ1ZTsKKwkJCQlvcGVyYXRpb25GYWlsZWQgPSBmYWxzZTsKKworCQkJCXZlcnRpY2VzID0gdGl0YW5HcmFwaC5xdWVyeSgpCisJCQkJCQkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLmdldE5hbWUoKSkKKwkJCQkJCS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGVsaW5lRml4ZWROYW1lKQorCQkJCQkJLmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKS52ZXJ0aWNlcygpOworCisJCQkJaWYgKHZlcnRpY2VzID09IG51bGwpIHsKKwkJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0ICB2ZXJ0aWNlcyBvYmplY3QgcmV0dXJuZWQgZm9yIHJlc291cmNlIHt9IiwgZWxpbmVGaXhlZE5hbWUpOworCQkJCQlvcGVyYXRpb25GYWlsZWQgPSB0cnVlOworCisJCQkJCXZsX2VsaW5lX2ZvdW5kID0gZmFsc2U7CisJCQkJfQorCisJCQkJaWYgKHZsX2VsaW5lX2ZvdW5kKSB7CisJCQkJCWl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCQkJdmVydGV4TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkgeworCQkJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0IGl0ZXJhdG9yIG92ZXIgdmVydGljZXMgb2JqZWN0IHJldHVybmVkIGZvciByZXNvdXJjZSBpZCB7fSIsCisJCQkJCQkJCWVsaW5lRml4ZWROYW1lKTsKKwkJCQkJCW9wZXJhdGlvbkZhaWxlZCA9IHRydWU7CisKKwkJCQkJCXZsX2VsaW5lX2ZvdW5kID0gZmFsc2U7CisJCQkJCX0KKworCQkJCQlpZiAodmxfZWxpbmVfZm91bmQpIHsKKwkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCQkJdmVydGV4TGlzdC5hZGQodmVydGV4KTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKCEodmVydGV4TGlzdC5zaXplKCkgPT0gMSkpIHsKKwkJCQkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgMSB2ZXJ0ZXggZm9yIHJlc291cmNlICB7fSB3aXRoIGhpZ2hlc3QgdHJ1ZS4gaW5zdGVhZCBnb3Qge30iLAorCQkJCQkJCQkJZWxpbmVGaXhlZE5hbWUsIHZlcnRleExpc3Quc2l6ZSgpKTsKKwkJCQkJCQlvcGVyYXRpb25GYWlsZWQgPSB0cnVlOworCisJCQkJCQkJdmxfZWxpbmVfZm91bmQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKCF2bF9lbGluZV9mb3VuZCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJVGl0YW5WZXJ0ZXggZWxpbmVWZXJ0ZXggPSB2ZXJ0ZXhMaXN0LmdldCgwKTsKKworCQkJCXZsVmVydGljZVByb3BlcnRpZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyh2bFZlcnRleCk7CisKKwkJCQlsb2cuaW5mbygiVkwgVmVydGljZSAgUHJvcGVydGllcyB7fSIsIHZsVmVydGljZVByb3BlcnRpZXMpOworCQkJCWlmICgibmV0d29yayIuZXF1YWxzKHZsVmVydGljZVByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSUNPTi5nZXRQcm9wZXJ0eSgpKSkpIHsKKwkJCQkJbG9nLmluZm8oIm5vdGhpbmcgdG8gdXBkYXRlIGluIHZsIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmluZm8oInVwZGF0aW5nIHByb3BlcnR5IGljb24gb2YgdmwiKTsKKwkJCQkJdmxWZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JQ09OLmdldFByb3BlcnR5KCksICJuZXR3b3JrIik7CisJCQkJfQorCisJCQkJZWxpbmVWZXJ0aWNlUHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKGVsaW5lVmVydGV4KTsKKworCQkJCWxvZy5pbmZvKCJlbGluZSB2ZXJ0aWNlICBQcm9wZXJ0aWVzIHt9IiwgZWxpbmVWZXJ0aWNlUHJvcGVydGllcyk7CisJCQkJaWYgKCJuZXR3b3JrIi5lcXVhbHMoZWxpbmVWZXJ0aWNlUHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JQ09OLmdldFByb3BlcnR5KCkpKSkgeworCQkJCQlsb2cuaW5mbygibm90aGluZyB0byB1cGRhdGUgaW4gZWxpbmUiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuaW5mbygidXBkYXRpbmcgcHJvcGVydHkgaWNvbiBvZiBlbGluZSIpOworCQkJCQllbGluZVZlcnRleC5wcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklDT04uZ2V0UHJvcGVydHkoKSwgIm5ldHdvcmsiKTsKKwkJCQl9CisKKwkJCQlpZiAoIlZMIEVMSU5FIi5lcXVhbHMoZWxpbmVWZXJ0aWNlUHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpKSkgeworCQkJCQlsb2cuaW5mbygibm90aGluZyB0byB1cGRhdGUgaW4gZWxpbmUiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuaW5mbygidXBkYXRpbmcgcHJvcGVydHkgbmFtZSBhbmQgdGFnIG9mIGVsaW5lIik7CisJCQkJCWVsaW5lVmVydGV4LnByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBlbGluZUZpeGVkTmFtZSk7CisJCQkJCUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJCXRhZ3MuYWRkKCJWTCBFTElORSIpOworCQkJCQllbGluZVZlcnRleC5wcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRBR1MuZ2V0UHJvcGVydHkoKSwgbmV3IEdzb24oKS50b0pzb24odGFncykpOworCQkJCX0KKworCQkJCWxvZy5pbmZvKCJwcmludCBjdXJyZW50IHByb3BlcnRpZXMgc3RhdGUiKTsKKworCQkJCXZsVmVydGljZVByb3BlcnRpZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyh2bFZlcnRleCk7CisKKwkJCQlsb2cuaW5mbygidmVydGljZSB2bCBQcm9wZXJ0aWVzIHt9IiwgdmxWZXJ0aWNlUHJvcGVydGllcyk7CisJCQkJZWxpbmVWZXJ0aWNlUHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKGVsaW5lVmVydGV4KTsKKworCQkJCWxvZy5pbmZvKCJ2ZXJ0aWNlIGVsaW5lIFByb3BlcnRpZXMge30iLCBlbGluZVZlcnRpY2VQcm9wZXJ0aWVzKTsKKwkJCX0KKworCQkJdHJ5IHsKKwkJCQlUaHJlYWQuc2xlZXAoMzAgKiAxMDAwKTsKKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2cuZXJyb3IoImV4Y2VwdGlvbiIsIGUpOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0gZmluYWxseSB7CisJCQlpZiAob3BlcmF0aW9uRmFpbGVkKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQlpZiAodmxWZXJ0aWNlUHJvcGVydGllcyAhPSBudWxsKSB7CisJCQkJCWNhY2hlTWFuZ2VyT3BlcmF0aW9uLnVwZGF0ZUNvbXBvbmVudEluQ2FjaGUoCisJCQkJCQkJKFN0cmluZykgdmxWZXJ0aWNlUHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSksIHRpbWUsCisJCQkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJCQl9CisJCQkJaWYgKGVsaW5lVmVydGljZVByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJCQljYWNoZU1hbmdlck9wZXJhdGlvbi51cGRhdGVDb21wb25lbnRJbkNhY2hlKAorCQkJCQkJCShTdHJpbmcpIGVsaW5lVmVydGljZVByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpLAorCQkJCQkJCXRpbWUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogaW4gMTYxMCB3ZSBlbmNvdW50ZXIgYW4gaXNzdWUgdGhhdCBpZiBhIGNhcGFiaWxpdHkgcHJvcGVydHkgb3ZlcnJpZGVzIGEKKwkgKiBwcm9wZXJ0eSBvZiBhIGRlcml2ZWQgY2FwYWJpbGl0eSB0aGVuIGl0IHdhcyBjcmVhdGVkIHdpdGggb3V0IGEgcHJvcGVydHkKKwkgKiB0eXBlIHdoZW4gaXQgd2FzIGZpcnN0IGltcG9ydGVkIGFzIHBhcnQgb2YgdGhlIGNhcGFiaWxpdHkgdHlwZXMuIHRoaXMKKwkgKiB3aWxsIGFkZCBwcm9wZXJ0eSB0eXBlIHRvIHRoZSBwcm9wZXJ0aWVzIG1pc3NpbmcgaXQuCisJICovCisJcHVibGljIGJvb2xlYW4gZml4Q2FwYWJpbHR5UHJvcGVydHlUeXBlcygpIHsKKworCQlTdHJpbmcgcHJvcGVydHlJZFNlY3VyZSA9ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4uc2VjdXJlIjsKKwkJU3RyaW5nIHByb3BlcnR5SWROZXR3b3JrTmFtZSA9ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuUHVibGljLm5ldHdvcmtfbmFtZSI7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKworCQlpZiAoZ3JhcGhSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgZ3JhcGggb2JqZWN0LiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJYm9vbGVhbiBvcGVyYXRpb25GYWlsZWQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCVRpdGFuR3JhcGggdGl0YW5HcmFwaCA9IGdyYXBoUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJbG9nLmluZm8oImxvb2sgdXAgcHJvcGVydHlJZFNlY3VyZTp7fSIsIHByb3BlcnR5SWRTZWN1cmUpOworCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gdGl0YW5HcmFwaC5xdWVyeSgpCisJCQkJCS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlByb3BlcnR5KSwgcHJvcGVydHlJZFNlY3VyZSkudmVydGljZXMoKTsKKwkJCWlmICh2ZXJ0aWNlcyA9PSBudWxsKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0ICB2ZXJ0aWNlcyBvYmplY3QgcmV0dXJuZWQgZm9yIHJlc291cmNlIGlkIHt9IiwgcHJvcGVydHlJZFNlY3VyZSk7CisJCQkJb3BlcmF0aW9uRmFpbGVkID0gdHJ1ZTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJTGlzdDxUaXRhblZlcnRleD4gdmVydGV4TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCBpdGVyYXRvciBvdmVyIHZlcnRpY2VzIG9iamVjdCByZXR1cm5lZCBmb3IgcmVzb3VyY2UgaWQgIiArIHByb3BlcnR5SWRTZWN1cmUpOworCQkJCW9wZXJhdGlvbkZhaWxlZCA9IHRydWU7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJVGl0YW5WZXJ0ZXggdmVydGV4ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCXZlcnRleExpc3QuYWRkKHZlcnRleCk7CisJCQl9CisKKwkJCWlmICghKHZlcnRleExpc3Quc2l6ZSgpID09IDEpKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0IDEgdmVydGV4IGZvciByZXNvdXJjZSBpZCB7fSBpbnN0ZWFkIGdvdCB7fSIsIHByb3BlcnR5SWRTZWN1cmUsCisJCQkJCQl2ZXJ0ZXhMaXN0LnNpemUoKSk7CisJCQkJb3BlcmF0aW9uRmFpbGVkID0gdHJ1ZTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCVRpdGFuVmVydGV4IHByb3BlcnR5VmVydGljZVNlY3VyZSA9IHZlcnRleExpc3QuZ2V0KDApOworCisJCQlsb2cuaW5mbygibG9vayB1cCBwcm9wZXJ0eUlkTmV0d29ya05hbWU6e30iLCBwcm9wZXJ0eUlkTmV0d29ya05hbWUpOworCQkJdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkKKwkJCQkJLmhhcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUHJvcGVydHkpLCBwcm9wZXJ0eUlkTmV0d29ya05hbWUpLnZlcnRpY2VzKCk7CisJCQlpZiAodmVydGljZXMgPT0gbnVsbCkgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCAgdmVydGljZXMgb2JqZWN0IHJldHVybmVkIGZvciByZXNvdXJjZSBpZCB7fSIsIHByb3BlcnR5SWROZXR3b3JrTmFtZSk7CisJCQkJb3BlcmF0aW9uRmFpbGVkID0gdHJ1ZTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXZlcnRleExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgaXRlcmF0b3Igb3ZlciB2ZXJ0aWNlcyBvYmplY3QgcmV0dXJuZWQgZm9yIHJlc291cmNlIGlkIHt9IiwKKwkJCQkJCXByb3BlcnR5SWROZXR3b3JrTmFtZSk7CisJCQkJb3BlcmF0aW9uRmFpbGVkID0gdHJ1ZTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJdmVydGV4TGlzdC5hZGQodmVydGV4KTsKKwkJCX0KKworCQkJaWYgKCEodmVydGV4TGlzdC5zaXplKCkgPT0gMSkpIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgMSB2ZXJ0ZXggZm9yIHJlc291cmNlIGlkIHt9IGluc3RlYWQgZ290IHt9IiwgcHJvcGVydHlJZE5ldHdvcmtOYW1lLAorCQkJCQkJdmVydGV4TGlzdC5zaXplKCkpOworCQkJCW9wZXJhdGlvbkZhaWxlZCA9IHRydWU7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlUaXRhblZlcnRleCBwcm9wZXJ0eVZlcnRpY2VOZXR3b3JrTmFtZSA9IHZlcnRleExpc3QuZ2V0KDApOworCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHZlcnRpY2VOZXR3b3JrTmFtZVByb3BlcnRpZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldFByb3BlcnRpZXMocHJvcGVydHlWZXJ0aWNlTmV0d29ya05hbWUpOworCisJCQlsb2cuaW5mbygidmVydGljZSBOZXR3b3JrTmFtZSBQcm9wZXJ0aWVzIHt9IiwgdmVydGljZU5ldHdvcmtOYW1lUHJvcGVydGllcyk7CisJCQlPYmplY3QgdHlwZSA9IHZlcnRpY2VOZXR3b3JrTmFtZVByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCWlmICh0eXBlID09IG51bGwgfHwgIiIuZXF1YWxzKHR5cGUpKSB7CisJCQkJbG9nLmluZm8oInVwZGF0aW5nIHByb3BlcnR5IFZlcnRpY2UgTmV0d29yayBOYW1lIik7CisJCQkJcHJvcGVydHlWZXJ0aWNlTmV0d29ya05hbWUucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCksICJzdHJpbmciKTsKKwkJCX0KKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiB2ZXJ0aWNlU2VjdXJlUHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKHByb3BlcnR5VmVydGljZVNlY3VyZSk7CisKKwkJCWxvZy5pbmZvKCJ2ZXJ0aWNlIFNlY3VyZSBQcm9wZXJ0aWVzIHt9IiwgdmVydGljZVNlY3VyZVByb3BlcnRpZXMpOworCisJCQl0eXBlID0gdmVydGljZVNlY3VyZVByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRS5nZXRQcm9wZXJ0eSgpKTsKKworCQkJaWYgKHR5cGUgPT0gbnVsbCB8fCAiIi5lcXVhbHModHlwZSkpIHsKKwkJCQlsb2cuaW5mbygidXBkYXRpbmcgcHJvcGVydHkgVmVydGljZSBTZWN1cmUiKTsKKwkJCQlwcm9wZXJ0eVZlcnRpY2VTZWN1cmUucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCksICJib29sZWFuIik7CisJCQl9CisKKwkJCWxvZy5pbmZvKCJwcmludCBjdXJyZW50IHByb3BlcnRpZXMgc3RhdGUiKTsKKworCQkJdmVydGljZU5ldHdvcmtOYW1lUHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKHByb3BlcnR5VmVydGljZU5ldHdvcmtOYW1lKTsKKworCQkJbG9nLmluZm8oInZlcnRpY2UgTmV0d29ya05hbWUgUHJvcGVydGllcyB7fSIsIHZlcnRpY2VOZXR3b3JrTmFtZVByb3BlcnRpZXMpOworCisJCQl2ZXJ0aWNlU2VjdXJlUHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKHByb3BlcnR5VmVydGljZVNlY3VyZSk7CisKKwkJCWxvZy5pbmZvKCJ2ZXJ0aWNlIFNlY3VyZSBQcm9wZXJ0aWVzIHt9IiwgdmVydGljZVNlY3VyZVByb3BlcnRpZXMpOworCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChvcGVyYXRpb25GYWlsZWQpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0gZWxzZSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjEwL1Rvc2NhQXJ0aWZhY3RzQWxpZ25tZW50LmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL2ltcGwvbWlncmF0aW9uL3YxNjEwL1Rvc2NhQXJ0aWZhY3RzQWxpZ25tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3YTU3MAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvaW1wbC9taWdyYXRpb24vdjE2MTAvVG9zY2FBcnRpZmFjdHNBbGlnbm1lbnQuamF2YQpAQCAtMCwwICsxLDQ2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjEwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlNlcnZpY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUFydGlmYWN0T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkFic3RyYWN0T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5VbmlxdWVJZEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudE1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5TZXJ2aWNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5XcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlN0cmVhbVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKioKKyAqIFRoaXMgQ2xhc3MgaG9sZHMgdGhlIGxvZ2ljIHRvIGFkZCBUb3NjYSBBcnRpZmFjdHMgcGxhY2Vob2xkZXIgYW5kIHBheWxvYWQuPGJyPgorICogVGhpcyBhZGRpdGlvbiBpcyBkb25lIGZvciBvbGQgdmVyc2lvbiBvZiBTZXJ2aWNlcyBhbmQgUmVzb3VyY2VzIChwcmUgMTYxMCkgdGhhdCB3ZXJlbid0IGNyZWF0ZWQgd2l0aCB0aGVtLjxicj4KKyAqIAorICogQGF1dGhvciBtc2hpdHJpdCA8YnI+CisgKiAKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUb3NjYUFydGlmYWN0c0FsaWdubWVudCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBTZXJ2aWNlQnVzaW5lc3NMb2dpYyBzZXJ2aWNlQnVzaW5lc3NMb2dpYzsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUb3NjYUFydGlmYWN0c0FsaWdubWVudC5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1BSRUZJWCA9ICJUb3NjYSBBcnRpZmFjdCBBbGlnbm1lbnQgRXJyb3I6ICI7CisKKwkvLyBBUEkgdGhhdCBGZXRjaGVzIFJlc291cmNlCisJcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFJlc291cmNlPiByZXNvdXJjZUZldGNoZXIgPSBjb21wb25lbnRNRCAtPiBnZXRDb21wb25lbnQoY29tcG9uZW50TUQsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkvLyBBUEkgdGhhdCBGZXRjaGVzIFNlcnZpY2UKKwlwcml2YXRlIGZpbmFsIEZ1bmN0aW9uPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgU2VydmljZT4gc2VydmljZUZldGNoZXIgPSBjb21wb25lbnRNRCAtPiBnZXRDb21wb25lbnQoY29tcG9uZW50TUQsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCS8vIENsYXNzIEdldHRlcnMKKwlwcml2YXRlIGZpbmFsIFN1cHBsaWVyPENsYXNzPFJlc291cmNlTWV0YWRhdGFEYXRhPj4gcmVzb3VyY2VDbGFzc0dldHRlciA9ICgpIC0+IFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzOworCXByaXZhdGUgZmluYWwgU3VwcGxpZXI8Q2xhc3M8U2VydmljZU1ldGFkYXRhRGF0YT4+IHNlcnZpY2VDbGFzc0dldHRlciA9ICgpIC0+IFNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3M7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBob2xkcyB0aGUgbG9naWMgdG8gYWRkIFRvc2NhIEFydGlmYWN0cyBwbGFjZWhvbGRlciBhbmQgcGF5bG9hZC48YnI+CisJICogCisJICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWQgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhbGlnblRvc2NhQXJ0aWZhY3RzKCkgeworCQlXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGFsbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZXNXaXRob3V0VG9zY2FQbGFjZUhvbGRlciA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PFNlcnZpY2VNZXRhZGF0YURhdGE+IGFsbFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUxpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4gc2VydmljZXNXaXRob3V0VG9zY2FQbGFjZUhvbGRlciA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlsb2cuZGVidWcoImFsaWduVG9zY2FBcnRpZmFjdHMgU3RhcnQiKTsKKwkJdHJ5IHsKKworCQkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuaW5mbygiRmV0Y2hpbmcgYWxsIHJlc291cmNlcyIpOworCQkJCWZpbGxBbGxDb21wb25ldE9mU3BlY2lmaWNUeXBlKGFsbFJlc291cmNlcywgTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZUNsYXNzR2V0dGVyLCBlcnJvcldyYXBwZXIpOworCQkJfQorCisJCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCS8vIEZpbHRlciBSZXNvdXJjZXMgV2l0aG91dCBUb3NjYSBBcnRpZmFjdHMKKwkJCQlsb2cuaW5mbygiZmlsdGVyaW5nIHJlc291cmNlcyB0byBhZGQgdG9zY2EgcGxhY2Vob2xkZXIiKTsKKwkJCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZWxldmFudFJlc291cmNlcyA9IGdldENvbXBvbmVudHNXaXRoTWlzc2luZ1Rvc2NhQXJ0aWZhY3RzKHJlc291cmNlQ2xhc3NHZXR0ZXIsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgYWxsUmVzb3VyY2VzKTsKKwkJCQlmaWxsTGlzdE9yV3JhcHBlcihlcnJvcldyYXBwZXIsIHJlc291cmNlc1dpdGhvdXRUb3NjYVBsYWNlSG9sZGVyLCBlaXRoZXJSZWxldmFudFJlc291cmNlcyk7CisJCQl9CisKKwkJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJLy8gQWRkIFBsYWNlSG9sZGVycyBUbyBSZXNvdXJjZXMKKwkJCQlsb2cuaW5mbygiYWRkaW5nIHRvc2NhIHBsYWNlaG9sZGVycyBhcnRpZmFjdHMgdG8gcmVzb3VyY2VzIik7CisJCQkJYWRkVG9zY2FBcnRpZmFjdFRvQ29tcG9uZW50cyhyZXNvdXJjZXNXaXRob3V0VG9zY2FQbGFjZUhvbGRlciwgcmVzb3VyY2VGZXRjaGVyLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGVycm9yV3JhcHBlcik7CisJCQl9CisJCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCS8vIEFkZCBwYXlsb2FkIHRvIFJlc291cmNlcworCQkJCWxvZy5pbmZvKCJnZW5lcmF0aW5nIHBheWxvYWQgdG8gdG9zY2EgYXJ0aWZhY3RzIG9uIHJlc291cmNlcyIpOworCQkJCWZpbGxSZXNvdXJjZXNQYXlsb2FkKGFsbFJlc291cmNlcywgZXJyb3JXcmFwcGVyKTsKKwkJCX0KKworCQkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuaW5mbygiRmV0Y2hpbmcgYWxsIHNlcnZpY2VzIik7CisJCQkJZmlsbEFsbENvbXBvbmV0T2ZTcGVjaWZpY1R5cGUoYWxsU2VydmljZXMsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBzZXJ2aWNlQ2xhc3NHZXR0ZXIsIGVycm9yV3JhcHBlcik7CisJCQl9CisJCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCS8vIEZpbHRlciBTZXJ2aWNlcyBXaXRob3V0IFRvc2NhIEFydGlmYWN0cworCQkJCWxvZy5pbmZvKCJmaWx0ZXJpbmcgc2VydmljZXMgdG8gYWRkIHRvc2NhIHBsYWNlaG9sZGVyIik7CisJCQkJRWl0aGVyPExpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZWxldmFudFNlcnZpY2VzID0gZ2V0Q29tcG9uZW50c1dpdGhNaXNzaW5nVG9zY2FBcnRpZmFjdHMoc2VydmljZUNsYXNzR2V0dGVyLCBOb2RlVHlwZUVudW0uU2VydmljZSwgYWxsU2VydmljZXMpOworCQkJCWZpbGxMaXN0T3JXcmFwcGVyKGVycm9yV3JhcHBlciwgc2VydmljZXNXaXRob3V0VG9zY2FQbGFjZUhvbGRlciwgZWl0aGVyUmVsZXZhbnRTZXJ2aWNlcyk7CisJCQl9CisKKwkJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJLy8gQWRkIFBsYWNlSG9sZGVycyBUbyBTZXJ2aWNlcworCQkJCWxvZy5pbmZvKCJhZGRpbmcgdG9zY2EgcGxhY2Vob2xkZXJzIGFydGlmYWN0cyB0byBzZXJ2aWNlcyIpOworCQkJCWFkZFRvc2NhQXJ0aWZhY3RUb0NvbXBvbmVudHMoc2VydmljZXNXaXRob3V0VG9zY2FQbGFjZUhvbGRlciwgc2VydmljZUZldGNoZXIsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBlcnJvcldyYXBwZXIpOworCQkJfQorCisJCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCS8vIEZpbHRlciBTZXJ2aWNlcyBmb3IgUGF5bG9hZCBBZGQKKwkJCQkvLyBBZGQgcGF5bG9hZCB0byBTZXJ2aWNlcworCQkJCWxvZy5pbmZvKCJnZW5lcmF0aW5nIHBheWxvYWQgdG8gdG9zY2EgYXJ0aWZhY3RzIG9uIHNlcnZpY2VzIik7CisJCQkJZmlsbFRvc2NhQXJ0aWZhY3RQYXlsb2FkKGFsbFNlcnZpY2VzLCBzZXJ2aWNlRmV0Y2hlciwgZXJyb3JXcmFwcGVyKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCQlyZXR1cm4gZXJyb3JXcmFwcGVyLmlzRW1wdHkoKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBmaWxsUmVzb3VyY2VzUGF5bG9hZChMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBhbGxSZXNvdXJjZXMsIFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlcikgeworCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJLy8gRmlyc3QgT25seSBOb24gVkYgKENQLCBWTCAmIFZGQykKKwkJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGJhc2ljUmVzb3VyY2VzID0gYWxsUmVzb3VyY2VzLnN0cmVhbSgpLmZpbHRlcihlIC0+IGlzQmFzaWNSZXNvdXJjZSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkvLyBGaWx0ZXIgcmVzb3VyY2VzIGZvciBQYXlsb2FkIEFkZAorCQkJLy8gQWRkIHBheWxvYWQgdG8gcmVzb3VyY2VzCisJCQlmaWxsVG9zY2FBcnRpZmFjdFBheWxvYWQoYmFzaWNSZXNvdXJjZXMsIHJlc291cmNlRmV0Y2hlciwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJLy8gVkZzCisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBjb21wbGV4UmVzb3VyY2UgPSBhbGxSZXNvdXJjZXMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGUuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5nZXRSZXNvdXJjZVR5cGUoKSA9PSBSZXNvdXJjZVR5cGVFbnVtLlZGKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJLy8gRmlsdGVyIHJlc291cmNlcyBmb3IgUGF5bG9hZCBBZGQKKwkJCS8vIEFkZCBwYXlsb2FkIHRvIHJlc291cmNlcworCQkJZmlsbFRvc2NhQXJ0aWZhY3RQYXlsb2FkKGNvbXBsZXhSZXNvdXJjZSwgcmVzb3VyY2VGZXRjaGVyLCBlcnJvcldyYXBwZXIpOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzQmFzaWNSZXNvdXJjZShSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24gcmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSB7CisJCWZpbmFsIFJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlID0gcmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldFJlc291cmNlVHlwZSgpOworCQlib29sZWFuIGlzQmFzaWNSZXNvdXJjZSA9IHJlc291cmNlVHlwZSA9PSBSZXNvdXJjZVR5cGVFbnVtLkNQIHx8IHJlc291cmNlVHlwZSA9PSBSZXNvdXJjZVR5cGVFbnVtLlZMIHx8IHJlc291cmNlVHlwZSA9PSBSZXNvdXJjZVR5cGVFbnVtLlZGQzsKKwkJcmV0dXJuIGlzQmFzaWNSZXNvdXJjZTsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhPiB2b2lkIGZpbGxBbGxDb21wb25ldE9mU3BlY2lmaWNUeXBlKExpc3Q8VD4gY29tcG9uZW50cywgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdXBwbGllcjxDbGFzczxUPj4gY2xhc3NHZXR0ZXIsIFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlcikgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfREVMRVRFRC5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKwkJRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDb21wb25lbnRNRCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKG5vZGVUeXBlLCBudWxsLCBwcm9wcywgY2xhc3NHZXR0ZXIuZ2V0KCkpOworCQlpZiAoZWl0aGVyQ29tcG9uZW50TUQuaXNMZWZ0KCkpIHsKKwkJCWNvbXBvbmVudHMuYWRkQWxsKGVpdGhlckNvbXBvbmVudE1ELmxlZnQoKS52YWx1ZSgpKTsKKwkJfSBlbHNlIHsKKwkJCWZpbmFsIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yVHlwZSA9IGVpdGhlckNvbXBvbmVudE1ELnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChlcnJvclR5cGUgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmVycm9yKCJ7fSBXaGVuIGZldGNoaW5nIGFsbCBjb21wb25lbnRzIG9mIHR5cGU6e30gYSB0aXRhbiBlcnJvciBvY2N1cmVkOnt9IiwgRVJST1JfUFJFRklYLCBub2RlVHlwZS5nZXROYW1lKCksIGVycm9yVHlwZS5uYW1lKCkpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JUeXBlKTsKKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSA8VCBleHRlbmRzIENvbXBvbmVudE1ldGFkYXRhRGF0YSwgUiBleHRlbmRzIENvbXBvbmVudD4gdm9pZCBhZGRUb3NjYUFydGlmYWN0VG9Db21wb25lbnRzKExpc3Q8VD4gcmVsZXZhbnRSZXNvdXJjZXMsIEZ1bmN0aW9uPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgUj4gY29tcG9uZW50Q29udmVydG9yLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIpIHsKKworCQkvLyBUaGlzIFN0cmVhbSBjb250YWlucyBhbGwgY3JlYXRlIHRvc2NhIHBsYWNlaG9sZGVyIHJlc3VsdHMKKwkJU3RyZWFtPFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFRvc2NhVG9Db21wb25lbnRzUmVzdWx0c1N0cmVhbSA9IHJlbGV2YW50UmVzb3VyY2VzLnN0cmVhbSgpLm1hcChlIC0+IGFkZFRvc2NhQXJ0aWZhY3RzKGUsIG5vZGVUeXBlLCBjb21wb25lbnRDb252ZXJ0b3IpKTsKKwkJLy8gRXhlY3V0ZSB0aGUgc3RyZWFtLCBhbmQgY29sbGVjdCBlcnJvcgorCQlPcHRpb25hbDxTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvcHRpb25hbEVycm9yID0gYWRkVG9zY2FUb0NvbXBvbmVudHNSZXN1bHRzU3RyZWFtLmZpbHRlcihlIC0+IGUgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykuZmluZEZpcnN0KCk7CisKKwkJLy8gSGFuZGxlIGVycm9yCisJCWlmIChvcHRpb25hbEVycm9yLmlzUHJlc2VudCgpKSB7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9DUkVBVEVEKTsKKwkJfQorCX0KKworCXByaXZhdGUgPFIgZXh0ZW5kcyBDb21wb25lbnQ+IFIgZ2V0Q29tcG9uZW50KENvbXBvbmVudE1ldGFkYXRhRGF0YSBtZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0pIHsKKwkJUiByZXN1bHQgPSBudWxsOworCQlFaXRoZXI8UiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQ29tcG9uZW50ID0gc2VydmljZUJ1c2luZXNzTG9naWMuZ2V0Q29tcG9uZW50KG1kLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRUeXBlRW51bSk7CisJCWlmIChlaXRoZXJDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoInt9IFdoZW4gZmV0Y2hpbmcgY29tcG9uZW50IHt9IG9mIHR5cGU6e30gd2l0aCB1bmlxdWVJZDp7fSIsIEVSUk9SX1BSRUZJWCwgbWQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwgY29tcG9uZW50VHlwZUVudW0uZ2V0VmFsdWUoKSwgbWQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCkpOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gZWl0aGVyQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHBvcHVsYXRlVG9zY2FBcnRpZmFjdHNXaXRoTG9nKENvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgdXNlciwgYm9vbGVhbiBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBzaG91bGRMb2NrKSB7CisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmV0OworCQl0cnkgeworCQkJcmV0ID0gc2VydmljZUJ1c2luZXNzTG9naWMucG9wdWxhdGVUb3NjYUFydGlmYWN0cyhjb21wb25lbnQsIHVzZXIsIGlzSW5DZXJ0aWZpY2F0aW9uUmVxdWVzdCwgaW5UcmFuc2FjdGlvbiwgc2hvdWxkTG9jayk7CisJCQlpZiAocmV0LmlzTGVmdCgpKSB7CisJCQkJbG9nLmRlYnVnKCJBZGRlZCBwYXlsb2FkIHRvIHRvc2NhIGFydGlmYWN0cyBvZiBjb21wb25lbnQge30gb2YgdHlwZTp7fSB3aXRoIHVuaXF1ZUlkOnt9IiwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKS5nZXRWYWx1ZSgpLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCQl9CisJCQlyZXR1cm4gcmV0OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJ7fSBFeGNlcHRpb24gT2NjdXJlZCBXaGVuIGZpbGxpbmcgdG9zY2EgYXJ0aWZhY3QgcGF5bG9hZCBmb3IgY29tcG9uZW50IHt9IG9mIHR5cGU6e30gd2l0aCB1bmlxdWVJZDp7fSIsIEVSUk9SX1BSRUZJWCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKS5uYW1lKCksIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBlKTsKKwkJCXRocm93IGU7CisJCX0KKwl9CisKKwlwcml2YXRlIDxSIGV4dGVuZHMgQ29tcG9uZW50LCBUIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhPiB2b2lkIGZpbGxUb3NjYUFydGlmYWN0UGF5bG9hZChMaXN0PFQ+IHJlbGV2YW50Q29tcG9uZW50cywgRnVuY3Rpb248Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBSPiBjb21wb25lbnRDcmVhdG9yLCBXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIpIHsKKworCQlmaW5hbCBVc2VyIGR1bW15VXNlciA9IGJ1aWxkRHVtbXlVc2VyKCk7CisJCS8vIFN0cmVhbSBmb3IgYWxsIGZpbGwgcGF5bG9hZCByZXN1bHRzCisJCVN0cmVhbTxJbW11dGFibGVQYWlyPENvbXBvbmVudCwgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0Pj4+CisJCS8vIEZpbHRlciBlbGVtZW50cyB0aGF0IG5lZWRzIGdlbmVyYXRpb24gb2YgdG9zY2EgcGF5bG9hZAorCQlmaWxsVG9zY2FQYXlsb2FkUmVzdWx0c1N0cmVhbSA9IHJlbGV2YW50Q29tcG9uZW50cy5zdHJlYW0oKS5maWx0ZXIoZSAtPiBpc0dlbmVyYXRlVG9zY2FQYXlsb2FkKGUpKQorCQkJCS8vIENvbnZlcnRzIENvbXBvbmVudE1ldGFkYXRhRGF0YSB0byBDb21wb25lbnQKKwkJCQkubWFwKGUgLT4gY29tcG9uZW50Q3JlYXRvci5hcHBseShlKSkKKwkJCQkvLyBGb3IgZWFjaCBjb21wb25lbnQgZ2VuZXJhdGUgcGF5bG9hZCBmb3IgdG9zY2EKKwkJCQkvLyBhcnRpZmFjdHMKKwkJCQkubWFwKGNvbXBvbmVudCAtPiB7CisJCQkJCXJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxDb21wb25lbnQsIEVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4+KGNvbXBvbmVudCwgcG9wdWxhdGVUb3NjYUFydGlmYWN0c1dpdGhMb2coY29tcG9uZW50LCBkdW1teVVzZXIsIHRydWUsIHRydWUsIGZhbHNlKSk7CisJCQkJfSk7CisKKwkJdHJ5IHsKKwkJCS8vIGV4ZWN1dGUgYW5kIHRoZSBzdHJlYW0KKwkJCU9wdGlvbmFsPENvbXBvbmVudD4gb3B0aW9uYWxFcnJvciA9IGZpbGxUb3NjYVBheWxvYWRSZXN1bHRzU3RyZWFtLgorCQkJLy8gZmlsdGVyIGluIGVycm9yCisJCQkJCWZpbHRlcihlIC0+IGUuZ2V0UmlnaHQoKS5pc1JpZ2h0KCkpCisJCQkJCS8vIGNvbnZlcnQgdGhlIHJlc3VsdCB0byBlcnJvciBhbmQgZXhlY3V0ZSB0aGUgc3RyZWFtCisJCQkJCS5tYXAoZSAtPiBlLmdldExlZnQoKSkuZmluZEZpcnN0KCk7CisKKwkJCS8vIENoZWNrIGlmIGVycm9yIG9jY3VycmVkCisJCQlpZiAob3B0aW9uYWxFcnJvci5pc1ByZXNlbnQoKSkgeworCQkJCUNvbXBvbmVudCBjb21wb25lbnQgPSBvcHRpb25hbEVycm9yLmdldCgpOworCQkJCWxvZy5lcnJvcigie30gV2hlbiBmaWxsaW5nIHRvc2NhIGFydGlmYWN0IHBheWxvYWQgZm9yIGNvbXBvbmVudCB7fSBvZiB0eXBlOnt9IHdpdGggdW5pcXVlSWQ6e30iLCBFUlJPUl9QUkVGSVgsIGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkubmFtZSgpLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KFRpdGFuT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJ7fSBXaGVuIGZpbGxpbmcgdG9zY2EgYXJ0aWZhY3QgcGF5bG9hZCBmb3IgY29tcG9uZW50cyA6IHt9IiwgRVJST1JfUFJFRklYLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KFRpdGFuT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJfQorCisJcHJpdmF0ZSA8UiBleHRlbmRzIENvbXBvbmVudD4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRUb3NjYUFydGlmYWN0cyhDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIEZ1bmN0aW9uPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgUj4gY29tcG9uZW50Q3JlYXRvcikgeworCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJUiBjb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q3JlYXRvci5hcHBseShjb21wb25lbnQpOworCisJCS8vIEZldGNoIGFydGlmYWN0cyB0byBiZSBBZGRlZAorCQlFaXRoZXI8TGlzdDxBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJUb3NjYUFydGlmYWN0cyA9IGdldFRvc2NhQXJ0aWZhY3RzVG9BZGQoY29tcG9uZW50RGVmaW5pdGlvbik7CisJCWlmIChlaXRoZXJUb3NjYUFydGlmYWN0cy5pc1JpZ2h0KCkpIHsKKwkJCXJlc3VsdCA9IGVpdGhlclRvc2NhQXJ0aWZhY3RzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfSBlbHNlIHsKKwkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiB0b3NjYUFydGlmYWN0c1RvQWRkID0gZWl0aGVyVG9zY2FBcnRpZmFjdHMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoIUNvbGxlY3Rpb25VdGlscy5pc0VtcHR5KGVpdGhlclRvc2NhQXJ0aWZhY3RzLmxlZnQoKS52YWx1ZSgpKSkgeworCQkJCWZpbmFsIFN0cmVhbTxJbW11dGFibGVQYWlyPEFydGlmYWN0RGVmaW5pdGlvbiwgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4+PiBjcmVhdGVkVG9zY2FQbGFjZUhvbGRlclN0cmVhbSA9IHRvc2NhQXJ0aWZhY3RzVG9BZGQuc3RyZWFtKCkKKwkJCQkJCS8vIGNyZWF0ZXMgdGhlIGFydGlmYWN0IGluIHRoZSBncmFwaAorCQkJCQkJLm1hcChhcnRpZmFjdERlZiAtPiBuZXcgSW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+PihhcnRpZmFjdERlZiwKKwkJCQkJCQkJYXJ0aWZhY3RPcGVyYXRpb24uYWRkQXJpZmFjdFRvQ29tcG9uZW50KGFydGlmYWN0RGVmLCBjb21wb25lbnREZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIG5vZGVUeXBlLCBmYWxzZSwgdHJ1ZSkpKTsKKworCQkJCS8vIEV4ZWN1dGUgdGhlIHN0cmVhbSwgYW5kIGNvbGxlY3QgZXJyb3IKKwkJCQlPcHRpb25hbDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4+IG9wdGlvbmFsRXJyb3IgPSBjcmVhdGVkVG9zY2FQbGFjZUhvbGRlclN0cmVhbS5maWx0ZXIoZSAtPiBlLmdldFJpZ2h0KCkuaXNSaWdodCgpKS5tYXAoZSAtPiBuZXcgSW1tdXRhYmxlUGFpcjw+KGUuZ2V0TGVmdCgpLCBlLmdldFJpZ2h0KCkucmlnaHQoKS52YWx1ZSgpKSkKKwkJCQkJCS5maW5kRmlyc3QoKTsKKworCQkJCS8vIEluIGNhc2UgZXJyb3Igb2NjdXJyZWQKKwkJCQlpZiAob3B0aW9uYWxFcnJvci5pc1ByZXNlbnQoKSkgeworCQkJCQlBcnRpZmFjdERlZmluaXRpb24gdG9zY2FBcnRpZmFjdCA9IG9wdGlvbmFsRXJyb3IuZ2V0KCkuZ2V0TGVmdCgpOworCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VFcnJvciA9IG9wdGlvbmFsRXJyb3IuZ2V0KCkuZ2V0UmlnaHQoKTsKKwkJCQkJbG9nLmVycm9yKCJ7fSBXaGVuIGFkZGluZyB0b3NjYSBhcnRpZmFjdCBvZiB0eXBlIHt9IHRvIGNvbXBvbmVudCB7fSBvZiB0eXBlOnt9ICIgKyAid2l0aCB1bmlxdWVJZDp7fSBhIHN0b3JhZ2VFcnJvciBvY2N1cnJlZDp7fSIsIEVSUk9SX1BSRUZJWCwgdG9zY2FBcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKSwgY29tcG9uZW50LmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksCisJCQkJCQkJbm9kZVR5cGUuZ2V0TmFtZSgpLCBjb21wb25lbnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIHN0b3JhZ2VFcnJvci5uYW1lKCkpOworCisJCQkJCXJlc3VsdCA9IHN0b3JhZ2VFcnJvcjsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkFkZGVkIHRvc2NhIGFydGlmYWN0cyB0byBjb21wb25lbnQge30gb2YgdHlwZTp7fSB3aXRoIHVuaXF1ZUlkOnt9IiwgY29tcG9uZW50LmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksIG5vZGVUeXBlLmdldE5hbWUoKSwgY29tcG9uZW50LmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpKTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSA8UiBleHRlbmRzIENvbXBvbmVudD4gRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0VG9zY2FBcnRpZmFjdHNUb0FkZChSIGNvbXBvbmVudERlZmluaXRpb24pIHsKKworCQlFaXRoZXI8TGlzdDxBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQ7CisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiB0b3NjYUFydGlmYWN0c0FscmVhZHlFeGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAoIU1hcFV0aWxzLmlzRW1wdHkoY29tcG9uZW50RGVmaW5pdGlvbi5nZXRUb3NjYUFydGlmYWN0cygpKSkgeworCQkJdG9zY2FBcnRpZmFjdHNBbHJlYWR5RXhpc3QuYWRkQWxsKGNvbXBvbmVudERlZmluaXRpb24uZ2V0VG9zY2FBcnRpZmFjdHMoKS52YWx1ZXMoKSk7CisJCX0KKworCQkvLyBTZXQgVG9zY2EgQXJ0aWZhY3RzIG9uIGNvbXBvbmVudAorCQlzZXJ2aWNlQnVzaW5lc3NMb2dpYy5zZXRUb3NjYUFydGlmYWN0c1BsYWNlSG9sZGVycyhjb21wb25lbnREZWZpbml0aW9uLCBidWlsZER1bW15VXNlcigpKTsKKworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gdG9zY2FBcnRpZmFjdHNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAoIU1hcFV0aWxzLmlzRW1wdHkoY29tcG9uZW50RGVmaW5pdGlvbi5nZXRUb3NjYUFydGlmYWN0cygpKSkgeworCQkJZmluYWwgQ29sbGVjdGlvbjxBcnRpZmFjdERlZmluaXRpb24+IGFsbFRvc2NhQXJ0aWZhY3RzID0gY29tcG9uZW50RGVmaW5pdGlvbi5nZXRUb3NjYUFydGlmYWN0cygpLnZhbHVlcygpOworCQkJU2V0PFN0cmluZz4gYXJ0aWZhY3RUeXBlc0V4aXN0ID0gdG9zY2FBcnRpZmFjdHNBbHJlYWR5RXhpc3Quc3RyZWFtKCkubWFwKGUgLT4gZS5nZXRBcnRpZmFjdFR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCQkJdG9zY2FBcnRpZmFjdHNUb0FkZCA9IGFsbFRvc2NhQXJ0aWZhY3RzLnN0cmVhbSgpLmZpbHRlcihlIC0+ICFhcnRpZmFjdFR5cGVzRXhpc3QuY29udGFpbnMoZS5nZXRBcnRpZmFjdFR5cGUoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh0b3NjYUFydGlmYWN0c1RvQWRkKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5lcnJvcigie30gZmFpbGVkIHRvIGFkZCB0b3NjYSBhcnRpZmFjdHMgaW4gYnVzc2luZXNzIGxvZ2ljIHRvIGNvbXBvbmVudCB7fSBvZiB0eXBlOnt9IHdpdGggdW5pcXVlSWQ6e30iLCBFUlJPUl9QUkVGSVgsIGNvbXBvbmVudERlZmluaXRpb24uZ2V0TmFtZSgpLCBjb21wb25lbnREZWZpbml0aW9uLmdldENvbXBvbmVudFR5cGUoKS5nZXRWYWx1ZSgpLAorCQkJCQljb21wb25lbnREZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5EKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgVXNlciBidWlsZER1bW15VXNlcigpIHsKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQoIm1pZ3JhdGlvblRhc2siKTsKKwkJcmV0dXJuIHVzZXI7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzR2VuZXJhdGVUb3NjYVBheWxvYWQoQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudCkgeworCQlmaW5hbCBTdHJpbmcgc3RhdGUgPSBjb21wb25lbnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCk7CisJCWJvb2xlYW4gY29tcG9uZW50TGlmZUN5Y2xlU3RhdGVJc1ZhbGlkID0gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTi5uYW1lKCkuZXF1YWxzKHN0YXRlKSB8fCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkuZXF1YWxzKHN0YXRlKTsKKworCQlyZXR1cm4gIWNvbXBvbmVudExpZmVDeWNsZVN0YXRlSXNWYWxpZDsKKworCX0KKworCXByaXZhdGUgPFQ+IHZvaWQgZmlsbExpc3RPcldyYXBwZXIoV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gd3JhcHBlciwgTGlzdDxUPiBsaXN0VG9GaWxsLCBFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlcikgeworCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJZmluYWwgVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3JUeXBlID0gZWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChlcnJvclR5cGUgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJd3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JUeXBlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxpc3RUb0ZpbGwuYWRkQWxsKGVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhPiBFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudHNXaXRoTWlzc2luZ1Rvc2NhQXJ0aWZhY3RzKFN1cHBsaWVyPENsYXNzPFQ+PiBjbGFzc0dldHRlciwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBMaXN0PFQ+IGFsbENvbXBvbmVudHMpIHsKKworCQlFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKwkJU3RyZWFtPEltbXV0YWJsZVBhaXI8VCwgRWl0aGVyPExpc3Q8QXJ0aWZhY3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+Pj4gY29tcG9uZW50c1dpdGhUb3NjYVN0cmVhbSA9CisJCQkJLy8gQ3JlYXRlIGEgU3RyZWFtIG9mIHBhaXJzIDogY29tcG9uZW50IGFuZCBpdHMgVG9zY2EgQXJ0aWZhY3RzCisJCQkJYWxsQ29tcG9uZW50cy5zdHJlYW0oKS5tYXAoZSAtPiBuZXcgSW1tdXRhYmxlUGFpcjw+KGUsIGdldFRvc2NhQXJ0aWZhdGNzKGUsIG5vZGVUeXBlKSkpOworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBFaXRoZXI8TGlzdDxBcnRpZmFjdERhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+PiBjb21wb25lbnRzV2l0aFRvc2NhQXJ0aWZhY3RzID0KKwkJCQkvLyBDb2xsZWN0IHRoZSBzdHJlYW0gdG8gbGlzdC4KKwkJCQkvLyBpbiBjYXNlIGdldFRvc2NhQXJ0aWZhdGNzIGZhaWxlZCwgdGhlIGZpcnN0IGZhaWx1cmUgaXMKKwkJCQkvLyBhZGRlZCB0byB0aGUgbGlzdAorCQkJCS8vICh0aGUgY29sbGVjdGlvbiBzdG9wcyBhZnRlciBmaXJzdCBmYWlsdXJlKQorCQkJCVN0cmVhbVV0aWxzLnRha2VXaGlsZVBsdXNPbmVOb0V2YWwoY29tcG9uZW50c1dpdGhUb3NjYVN0cmVhbSwgZSAtPiBlLmdldFJpZ2h0KCkuaXNMZWZ0KCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJLy8gcmV0cmlldmUgdGhlIGZhaWx1cmUgb3B0aW9uYWwgKGl0IG1heSBvciBtYXkgbm90IGV4aXN0KQorCQlPcHRpb25hbDxUaXRhbk9wZXJhdGlvblN0YXR1cz4gaXNFcnJvck9jY3VyZWQgPSBjb21wb25lbnRzV2l0aFRvc2NhQXJ0aWZhY3RzLnN0cmVhbSgpCisJCQkJLy8gY29udmVydCB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcGFpciBvZiB0eXBlIEVpdGhlcgorCQkJCS5tYXAoZSAtPiBlLmdldFJpZ2h0KCkpCisJCQkJLy8gRmlsdGVyIGluIG9ubHkgdGhlIGVycm9ycworCQkJCS5maWx0ZXIoZSAtPiBlLmlzUmlnaHQoKSkuCisJCQkJLy8gbWFwIHRoZSBlcnJvciBmcm9tIEVpdGhlciB0byBUaXRhbk9wZXJhdGlvblN0YXR1cworCQkJCW1hcChlIC0+IGUucmlnaHQoKS52YWx1ZSgpKS5maW5kRmlyc3QoKTsKKworCQkvLyBJbiBjYXNlIGZhaWx1cmUgb2NjdXJyZWQKKwkJaWYgKGlzRXJyb3JPY2N1cmVkLmlzUHJlc2VudCgpKSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoaXNFcnJvck9jY3VyZWQuZ2V0KCkpOworCQkJLy8gSW4gY2FzZSBOTyBmYWlsdXJlIG9jY3VycmVkCisJCX0gZWxzZSB7CisJCQlMaXN0PFQ+IGZpbHRlcmVkQ29tcG9uZW50cyA9IGNvbXBvbmVudHNXaXRoVG9zY2FBcnRpZmFjdHMuc3RyZWFtKCkKKwkJCQkJLy8gRmlsdGVyIGluIG9ubHkgZWxlbWVudHMgdGhhdCBkb2VzIE5PVCBoYXZlIHRvc2NhCisJCQkJCS8vIGFydGlmYWN0cworCQkJCQkuZmlsdGVyKGUgLT4gaXNOb3RDb250YWluQWxsVG9zY2FBcnRpZmFjdHMoZSkpCisJCQkJCS8vIENvbnZlcnQgYmFjayB0byBDb21wb25lbnRzIExpc3QgJiBjb2xsZWN0CisJCQkJCS5tYXAoZSAtPiBlLmdldExlZnQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZmlsdGVyZWRDb21wb25lbnRzKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSA8VCBleHRlbmRzIENvbXBvbmVudE1ldGFkYXRhRGF0YT4gYm9vbGVhbiBpc05vdENvbnRhaW5BbGxUb3NjYUFydGlmYWN0cyhJbW11dGFibGVQYWlyPFQsIEVpdGhlcjxMaXN0PEFydGlmYWN0RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4gcGFpcikgeworCisJCWZpbmFsIExpc3Q8QXJ0aWZhY3REYXRhPiBhcnRpZmFjdExpc3QgPSBwYWlyLmdldFJpZ2h0KCkubGVmdCgpLnZhbHVlKCk7CisKKwkJU2V0PEFydGlmYWN0VHlwZUVudW0+IGZpbHRlcmVkVG9zY2FMaXN0ID0gYXJ0aWZhY3RMaXN0LnN0cmVhbSgpLgorCQkvLyBDb252ZXJ0IHRvIEFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQltYXAoZSAtPiBlLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKSkuCisJCQkJLy8gRmlsdGVyIGluIE9ubHkgVG9zY2EgQXJ0aWZhY3RzCisJCQkJZmlsdGVyKGUgLT4gZS5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpID09IEFydGlmYWN0R3JvdXBUeXBlRW51bS5UT1NDQSkuCisJCQkJLy8gQ29udmVydCBUbyBBcnRpZmFjdFR5cGVFbnVtCisJCQkJbWFwKGUgLT4gQXJ0aWZhY3RUeXBlRW51bS5maW5kVHlwZShlLmdldEFydGlmYWN0VHlwZSgpKSkuCisJCQkJLy8gRmlsdGVyIE91dCBudWxscyBpbiBjYXNlIG9mIFR5cGUgbm90IGZvdW5kCisJCQkJZmlsdGVyKGUgLT4gZSAhPSBudWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisKKwkJYm9vbGVhbiB0b3NjYUFyaWZhY3RDb250YWluZWQgPSBmaWx0ZXJlZFRvc2NhTGlzdC5jb250YWlucyhBcnRpZmFjdFR5cGVFbnVtLlRPU0NBX0NTQVIpICYmIGZpbHRlcmVkVG9zY2FMaXN0LmNvbnRhaW5zKEFydGlmYWN0VHlwZUVudW0uVE9TQ0FfVEVNUExBVEUpOworCQlyZXR1cm4gIXRvc2NhQXJpZmFjdENvbnRhaW5lZDsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhPiBFaXRoZXI8TGlzdDxBcnRpZmFjdERhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0VG9zY2FBcnRpZmF0Y3MoVCBjb21wb25lbnQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCisJCUVpdGhlcjxMaXN0PEFydGlmYWN0RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQ7CisJCS8vIEFsbCBUaGUgQXJ0aWZhY3RzIG9mIHRoZSBDb21wb25lbnQKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQ29tcG9uZW50QXJ0aWZhY3RzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjb21wb25lbnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCQkJR3JhcGhFZGdlTGFiZWxzLkFSVElGQUNUX1JFRiwgTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCisJCWlmIChlaXRoZXJDb21wb25lbnRBcnRpZmFjdHMuaXNMZWZ0KCkpIHsKKwkJCS8vIENvbnZlcnQgQXJ0aWZhY3QgRWRnZSBQYWlyIHRvIEFydGlmYWN0CisJCQlMaXN0PEFydGlmYWN0RGF0YT4gdG9zY2FBcnRpZmFjdHMgPSBlaXRoZXJDb21wb25lbnRBcnRpZmFjdHMubGVmdCgpLnZhbHVlKCkuc3RyZWFtKCkKKwkJCQkJLy8gbWFwIEltbXV0YWJsZVBhaXI8QXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2U+IHRvCisJCQkJCS8vIEFydGlmYWN0RGF0YQorCQkJCQkubWFwKGUgLT4gZS5nZXRMZWZ0KCkpCisJCQkJCS8vIEZpbHRlciBpbiBvbmx5IFRvc2NhIEFydGlmYWN0cworCQkJCQkuZmlsdGVyKGFydGlmYWN0IC0+IGFydGlmYWN0LmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpID09IEFydGlmYWN0R3JvdXBUeXBlRW51bS5UT1NDQSkKKwkJCQkJLy8gQ29sbGVjdAorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRvc2NhQXJ0aWZhY3RzKTsKKwkJfSBlbHNlIGlmIChlaXRoZXJDb21wb25lbnRBcnRpZmFjdHMucmlnaHQoKS52YWx1ZSgpID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQobmV3IEFycmF5TGlzdDw+KCkpOworCQl9IGVsc2UgeworCQkJZmluYWwgVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5FcnJvciA9IGVpdGhlckNvbXBvbmVudEFydGlmYWN0cy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoInt9IFdoZW4gZmV0Y2hpbmcgYXJ0aWZhY3RzIGZvciBjb21wb25lbnQge30gb2YgdHlwZTp7fSB3aXRoIHVuaXF1ZUlkOnt9IGEgdGl0YW5FcnJvciBvY2N1cnJlZDp7fSIsIEVSUk9SX1BSRUZJWCwgY29tcG9uZW50LmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksIG5vZGVUeXBlLmdldE5hbWUoKSwKKwkJCQkJY29tcG9uZW50LmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCB0aXRhbkVycm9yLm5hbWUoKSk7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh0aXRhbkVycm9yKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL21haW4vRGF0YVNjaGVtYU1lbnUuamF2YSBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvbWFpbi9EYXRhU2NoZW1hTWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOWNkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL21haW4vRGF0YVNjaGVtYU1lbnUuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5TZGNTY2hlbWFCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBEYXRhU2NoZW1hTWVudSB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGF0YVNjaGVtYU1lbnUuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBvcGVyYXRpb24gPSBhcmdzWzBdOworCisJCVN0cmluZyBhcHBDb25maWdEaXIgPSBhcmdzWzFdOworCisJCWlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPCAyKSB7CisJCQl1c2FnZUFuZEV4aXQoKTsKKwkJfQorCisJCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksCisJCQkJYXBwQ29uZmlnRGlyKTsKKwkJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJdHJ5IHsKKworCQkJc3dpdGNoIChvcGVyYXRpb24udG9Mb3dlckNhc2UoKSkgeworCQkJY2FzZSAiY3JlYXRlLWNhc3NhbmRyYS1zdHJ1Y3R1cmVzIjoKKwkJCQlsb2cuZGVidWcoIlN0YXJ0IGNyZWF0ZSBjYXNzYW5kcmEga2V5c3BhY2UsIHRhYmxlcyBhbmQgaW5kZXhlcyIpOworCQkJCWlmIChTZGNTY2hlbWFCdWlsZGVyLmNyZWF0ZVNjaGVtYSgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiY3JlYXRlIGNhc3NhbmRyYSBrZXlzcGFjZSwgdGFibGVzIGFuZCBpbmRleGVzIHN1Y2Nlc3NmdWxsIik7CisJCQkJCVN5c3RlbS5leGl0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiY3JlYXRlIGNhc3NhbmRyYSBrZXlzcGFjZSwgdGFibGVzIGFuZCBpbmRleGVzIGZhaWxlZCIpOworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQljYXNlICJjcmVhdGUtdGl0YW4tc3RydWN0dXJlcyI6CisJCQkJbG9nLmRlYnVnKCJTdGFydCBjcmVhdGUgdGl0YW4ga2V5c3BhY2UsIHRhYmxlcyBhbmQgaW5kZXhlcyIpOworCQkJCWlmIChTZGNTY2hlbWFCdWlsZGVyLmNyZWF0ZVNjaGVtYSgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiY3JlYXRlIGNhc3NhbmRyYSBrZXlzcGFjZSwgdGFibGVzIGFuZCBpbmRleGVzIHN1Y2Nlc3NmdWxsIik7CisJCQkJCVN5c3RlbS5leGl0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiY3JlYXRlIGNhc3NhbmRyYSBrZXlzcGFjZSwgdGFibGVzIGFuZCBpbmRleGVzIGZhaWxlZCIpOworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQljYXNlICJjbGVhbi1jYXNzbmRyYSI6CisJCQkJbG9nLmRlYnVnKCJTdGFydCBjbGVhbiBrZXlzcGFjZSwgdGFibGVzIik7CisJCQkJaWYgKFNkY1NjaGVtYUJ1aWxkZXIuZGVsZXRlU2NoZW1hKCkpIHsKKwkJCQkJbG9nLmRlYnVnKCIgc3VjY2Vzc2Z1bGwiKTsKKwkJCQkJU3lzdGVtLmV4aXQoMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCIgZmFpbGVkIik7CisJCQkJCVN5c3RlbS5leGl0KDIpOworCQkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJdXNhZ2VBbmRFeGl0KCk7CisJCQl9CisJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQl0LnByaW50U3RhY2tUcmFjZSgpOworCQkJbG9nLmRlYnVnKCJjcmVhdGUgY2Fzc2FuZHJhIGtleXNwYWNlLCB0YWJsZXMgYW5kIGluZGV4ZXMgZmFpbGVkIik7CisJCQlTeXN0ZW0uZXhpdCgzKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2VBbmRFeGl0KCkgeworCQlEYXRhU2NoZW1lVXNhZ2UoKTsKKwkJU3lzdGVtLmV4aXQoMSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBEYXRhU2NoZW1lVXNhZ2UoKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGNyZWF0ZS1jYXNzYW5kcmEtc3RydWN0dXJlcyA8Y29uZmlndXJhdGlvbiBkaXI+ICIpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvbWFpbi9Fc1RvQ2Fzc2FuZHJhRGF0YU1pZ3JhdGlvbk1lbnUuamF2YSBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvbWFpbi9Fc1RvQ2Fzc2FuZHJhRGF0YU1pZ3JhdGlvbk1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzAwOGIzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9tYWluL0VzVG9DYXNzYW5kcmFEYXRhTWlncmF0aW9uTWVudS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwuRGF0YU1pZ3JhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLkVzVG9DYXNzYW5kcmFEYXRhTWlncmF0aW9uQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjA0LkFwcENvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLm1pZ3JhdGlvbi52MTYwNC5TZXJ2aWNlTWlncmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5TZGNTY2hlbWFCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dDsKKworcHVibGljIGNsYXNzIEVzVG9DYXNzYW5kcmFEYXRhTWlncmF0aW9uTWVudSB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWlncmF0aW9uTWVudS5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8IDIpIHsKKwkJCXVzYWdlQW5kRXhpdCgpOworCQl9CisJCVN0cmluZyBvcGVyYXRpb24gPSBhcmdzWzBdOworCisJCVN0cmluZyBhcHBDb25maWdEaXIgPSBhcmdzWzFdOworCQlTeXN0ZW0uc2V0UHJvcGVydHkoImNvbmZpZy5ob21lIiwgYXBwQ29uZmlnRGlyKTsKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwKKwkJCQlhcHBDb25maWdEaXIpOworCQlDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uU291cmNlKTsKKworCQlBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dCgKKwkJCQlFc1RvQ2Fzc2FuZHJhRGF0YU1pZ3JhdGlvbkNvbmZpZy5jbGFzcyk7CisJCURhdGFNaWdyYXRpb24gZGF0YU1pZ3JhdGlvbiA9IG51bGw7CisJCXRyeSB7CisJCQlzd2l0Y2ggKG9wZXJhdGlvbi50b0xvd2VyQ2FzZSgpKSB7CisJCQljYXNlICJlcy10by1jYXNzbmRyYS1taWdyYXRpb24iOgorCQkJCWRhdGFNaWdyYXRpb24gPSAoRGF0YU1pZ3JhdGlvbikgY29udGV4dC5nZXRCZWFuKCJEYXRhTWlncmF0aW9uQmVhbiIpOworCQkJCWxvZy5kZWJ1ZygiU3RhcnQgbWlncmF0aW9uIGZyb20gRVMgdG8gQyogIik7CisJCQkJaWYgKGRhdGFNaWdyYXRpb24ubWlncmF0ZURhdGFFU1RvQ2Fzc25kcmEoYXBwQ29uZmlnRGlyLCB0cnVlLCB0cnVlKSkgeworCQkJCQlsb2cuZGVidWcoIm1pZ3JhdGlvbiBmcm9tIEVTIHRvIEMqIHdhcyBmaW5pc2hlZCBzdWNjZXNzZnVsbCIpOworCQkJCQlTeXN0ZW0uZXhpdCgwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIm1pZ3JhdGlvbiBmcm9tIEVTIHRvIEMqIGZhaWxlZCIpOworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICJlcy10by1jYXNzbmRyYS1taWdyYXRpb24tZXhwb3J0LW9ubHkiOgorCQkJCWRhdGFNaWdyYXRpb24gPSAoRGF0YU1pZ3JhdGlvbikgY29udGV4dC5nZXRCZWFuKCJEYXRhTWlncmF0aW9uQmVhbiIpOworCQkJCWxvZy5kZWJ1ZygiU3RhcnQgbWlncmF0aW9uIGV4cG9ydCBvbmx5IGZyb20gRVMgdG8gQyogIik7CisJCQkJaWYgKGRhdGFNaWdyYXRpb24ubWlncmF0ZURhdGFFU1RvQ2Fzc25kcmEoYXBwQ29uZmlnRGlyLCB0cnVlLCBmYWxzZSkpIHsKKwkJCQkJbG9nLmRlYnVnKCJtaWdyYXRpb24gZXhwb3J0IG9ubHkgZnJvbSBFUyB0byBDKiB3YXMgZmluaXNoZWQgc3VjY2Vzc2Z1bGwiKTsKKwkJCQkJU3lzdGVtLmV4aXQoMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJtaWdyYXRpb24gZXhwb3J0IG9ubHkgZnJvbSBFUyB0byBDKiBmYWlsZWQiKTsKKwkJCQkJU3lzdGVtLmV4aXQoMik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAiZXMtdG8tY2Fzc25kcmEtbWlncmF0aW9uLWltcG9ydC1vbmx5IjoKKwkJCQlkYXRhTWlncmF0aW9uID0gKERhdGFNaWdyYXRpb24pIGNvbnRleHQuZ2V0QmVhbigiRGF0YU1pZ3JhdGlvbkJlYW4iKTsKKwkJCQlsb2cuZGVidWcoIlN0YXJ0IG1pZ3JhdGlvbiBpbXBvcnQgb25seSBmcm9tIEVTIHRvIEMqICIpOworCQkJCWlmIChkYXRhTWlncmF0aW9uLm1pZ3JhdGVEYXRhRVNUb0Nhc3NuZHJhKGFwcENvbmZpZ0RpciwgZmFsc2UsIHRydWUpKSB7CisJCQkJCWxvZy5kZWJ1ZygibWlncmF0aW9uIGltcG9ydCBvbmx5IGZyb20gRVMgdG8gQyogd2FzIGZpbmlzaGVkIHN1Y2Nlc3NmdWxsIik7CisJCQkJCVN5c3RlbS5leGl0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygibWlncmF0aW9uIGltcG9ydCBvbmx5IGZyb20gRVMgdG8gQyogZmFpbGVkIik7CisJCQkJCVN5c3RlbS5leGl0KDIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdXNhZ2VBbmRFeGl0KCk7CisJCQl9CisJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQl0LnByaW50U3RhY2tUcmFjZSgpOworCQkJU3lzdGVtLmV4aXQoMyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlQW5kRXhpdCgpIHsKKwkJTWlncmF0aW9uVXNhZ2UoKTsKKwkJU3lzdGVtLmV4aXQoMSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBNaWdyYXRpb25Vc2FnZSgpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCSJVc2FnZTogZXMtdG8tY2Fzc25kcmEtbWlncmF0aW9uL2VzLXRvLWNhc3NuZHJhLW1pZ3JhdGlvbi1pbXBvcnQtb25seS9lcy10by1jYXNzbmRyYS1taWdyYXRpb24tZXhwb3J0LW9ubHkgPGNvbmZpZ3VyYXRpb24gZGlyPiIpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvbWFpbi9FeHBvcnRJbXBvcnRNZW51LmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL21haW4vRXhwb3J0SW1wb3J0TWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNmYxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL21haW4vRXhwb3J0SW1wb3J0TWVudS5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwuR3JhcGhNTENvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLkdyYXBoTUxEYXRhQW5hbHl6ZXI7CisKK3B1YmxpYyBjbGFzcyBFeHBvcnRJbXBvcnRNZW51IHsKKworCXByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2VBbmRFeGl0KCkgeworCQlleHBvcnRVc2FnZSgpOworCQlpbXBvcnRVc2FnZSgpOworCQlleHBvcnRVc2Vyc1VzYWdlKCk7CisKKwkJU3lzdGVtLmV4aXQoMSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbXBvcnRVc2FnZSgpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogaW1wb3J0IDx0aXRhbi5wcm9wZXJ0aWVzPiA8Z3JhcGggZmlsZSBsb2NhdGlvbj4iKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGV4cG9ydFVzYWdlKCkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBleHBvcnQgPHRpdGFuLnByb3BlcnRpZXM+IDxvdXRwdXQgZGlyZWN0b3J5PiIpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZGF0YVJlcG9ydFVzYWdlKCkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBnZXQtZGF0YS1yZXBvcnQtZnJvbS1ncmFwaC1tbCA8ZnVsbCBwYXRoIG9mIC5ncmFwaG1sIGZpbGU+Iik7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBvcnRVc2Vyc1VzYWdlKCkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBleHBvcnR1c2VycyA8dGl0YW4ucHJvcGVydGllcz4gPG91dHB1dCBkaXJlY3Rvcnk+Iik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8IDEpIHsKKwkJCXVzYWdlQW5kRXhpdCgpOworCQl9CisKKwkJU3RyaW5nIG9wZXJhdGlvbiA9IGFyZ3NbMF07CisJCUdyYXBoTUxDb252ZXJ0ZXIgZ3JhcGhNTENvbnZlcnRlciA9IG5ldyBHcmFwaE1MQ29udmVydGVyKCk7CisJCXN3aXRjaCAob3BlcmF0aW9uLnRvTG93ZXJDYXNlKCkpIHsKKworCQljYXNlICJleHBvcnQiOgorCQkJYm9vbGVhbiBpc1ZhbGlkID0gdmVyaWZ5UGFyYW1zTGVuZ3RoKGFyZ3MsIDMpOworCQkJaWYgKGZhbHNlID09IGlzVmFsaWQpIHsKKwkJCQlleHBvcnRVc2FnZSgpOworCQkJCVN5c3RlbS5leGl0KDEpOworCQkJfQorCisJCQlib29sZWFuIHJlc3VsdCA9IGdyYXBoTUxDb252ZXJ0ZXIuZXhwb3J0R3JhcGgoYXJncyk7CisJCQlpZiAocmVzdWx0ID09IGZhbHNlKSB7CisJCQkJU3lzdGVtLmV4aXQoMik7CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlICJpbXBvcnQiOgorCQkJaXNWYWxpZCA9IHZlcmlmeVBhcmFtc0xlbmd0aChhcmdzLCAzKTsKKwkJCWlmIChmYWxzZSA9PSBpc1ZhbGlkKSB7CisJCQkJaW1wb3J0VXNhZ2UoKTsKKwkJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJCX0KKwkJCXJlc3VsdCA9IGdyYXBoTUxDb252ZXJ0ZXIuaW1wb3J0R3JhcGgoYXJncyk7CisJCQlpZiAocmVzdWx0ID09IGZhbHNlKSB7CisJCQkJU3lzdGVtLmV4aXQoMik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICJleHBvcnR1c2VycyI6CisJCQlpc1ZhbGlkID0gdmVyaWZ5UGFyYW1zTGVuZ3RoKGFyZ3MsIDMpOworCQkJaWYgKGZhbHNlID09IGlzVmFsaWQpIHsKKwkJCQlpbXBvcnRVc2FnZSgpOworCQkJCVN5c3RlbS5leGl0KDEpOworCQkJfQorCQkJcmVzdWx0ID0gZ3JhcGhNTENvbnZlcnRlci5leHBvcnRVc2VycyhhcmdzKTsKKwkJCWlmIChyZXN1bHQgPT0gZmFsc2UpIHsKKwkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgImZpbmRwcm9ibGVtIjoKKwkJCWlzVmFsaWQgPSB2ZXJpZnlQYXJhbXNMZW5ndGgoYXJncywgMyk7CisJCQlpZiAoZmFsc2UgPT0gaXNWYWxpZCkgeworCQkJCWltcG9ydFVzYWdlKCk7CisJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQl9CisJCQlyZXN1bHQgPSBncmFwaE1MQ29udmVydGVyLmZpbmRFcnJvckluSnNvbkdyYXBoKGFyZ3MpOworCQkJaWYgKHJlc3VsdCA9PSBmYWxzZSkgeworCQkJCVN5c3RlbS5leGl0KDIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgImV4cG9ydC1hcy1ncmFwaC1tbCI6CisJCQlpc1ZhbGlkID0gdmVyaWZ5UGFyYW1zTGVuZ3RoKGFyZ3MsIDMpOworCQkJaWYgKGZhbHNlID09IGlzVmFsaWQpIHsKKwkJCQlleHBvcnRVc2FnZSgpOworCQkJCVN5c3RlbS5leGl0KDEpOworCQkJfQorCQkJU3RyaW5nIG1sRmlsZSA9IGdyYXBoTUxDb252ZXJ0ZXIuZXhwb3J0R3JhcGhNbChhcmdzKTsKKwkJCWlmIChtbEZpbGUgPT0gbnVsbCkgeworCQkJCVN5c3RlbS5leGl0KDIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgImV4cG9ydC1hcy1ncmFwaC1tbC13aXRoLWRhdGEtcmVwb3J0IjoKKwkJCWlzVmFsaWQgPSB2ZXJpZnlQYXJhbXNMZW5ndGgoYXJncywgMyk7CisJCQlpZiAoZmFsc2UgPT0gaXNWYWxpZCkgeworCQkJCWV4cG9ydFVzYWdlKCk7CisJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQl9CisJCQltbEZpbGUgPSBncmFwaE1MQ29udmVydGVyLmV4cG9ydEdyYXBoTWwoYXJncyk7CisJCQlpZiAobWxGaWxlID09IG51bGwpIHsKKwkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCX0KKwkJCVN0cmluZ1tdIGRhdGFBcmdzID0gbmV3IFN0cmluZ1tdIHsgbWxGaWxlIH07CisJCQltbEZpbGUgPSBuZXcgR3JhcGhNTERhdGFBbmFseXplcigpLmFuYWx5emVHcmFwaE1MRGF0YShkYXRhQXJncyk7CisJCQlpZiAobWxGaWxlID09IG51bGwpIHsKKwkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICJnZXQtZGF0YS1yZXBvcnQtZnJvbS1ncmFwaC1tbCI6CisJCQlpc1ZhbGlkID0gdmVyaWZ5UGFyYW1zTGVuZ3RoKGFyZ3MsIDIpOworCQkJaWYgKGZhbHNlID09IGlzVmFsaWQpIHsKKwkJCQlkYXRhUmVwb3J0VXNhZ2UoKTsKKwkJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJCX0KKwkJCWRhdGFBcmdzID0gbmV3IFN0cmluZ1tdIHsgYXJnc1sxXSB9OworCQkJbWxGaWxlID0gbmV3IEdyYXBoTUxEYXRhQW5hbHl6ZXIoKS5hbmFseXplR3JhcGhNTERhdGEoZGF0YUFyZ3MpOworCQkJaWYgKG1sRmlsZSA9PSBudWxsKSB7CisJCQkJU3lzdGVtLmV4aXQoMik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlQW5kRXhpdCgpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHZlcmlmeVBhcmFtc0xlbmd0aChTdHJpbmdbXSBhcmdzLCBpbnQgaSkgeworCQlpZiAoYXJncyA9PSBudWxsKSB7CisJCQlpZiAoaSA+IDApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmIChhcmdzLmxlbmd0aCA+PSBpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL21haW4vTWlncmF0aW9uTWVudS5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9tYWluL01pZ3JhdGlvbk1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2VkNDYwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9tYWluL01pZ3JhdGlvbk1lbnUuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLm1haW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwuUG9wdWxhdGVDb21wb25lbnRDYWNoZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLm1pZ3JhdGlvbi52MTYwNC5BcHBDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQuRGVyaXZlZEZyb21BbGlnbm1lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQuR3JvdXBzQWxpZ25tZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjA0LlNlcnZpY2VNaWdyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MDQuVmZjTmFtaW5nQWxpZ25tZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLmltcGwubWlncmF0aW9uLnYxNjA3LkNzYXJNaWdyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5taWdyYXRpb24udjE2MTAuVGl0YW5GaXhVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLm1pZ3JhdGlvbi52MTYxMC5Ub3NjYUFydGlmYWN0c0FsaWdubWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0OworCitwdWJsaWMgY2xhc3MgTWlncmF0aW9uTWVudSB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWlncmF0aW9uTWVudS5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX01JR0FSVElPTl9CRUFOID0gInNlcnZpY2VNaWdyYXRpb25CZWFuIjsKKworCXByaXZhdGUgc3RhdGljIGVudW0gTWlncmF0aW9uT3BlcmF0aW9uRW51bSB7CisJCU1JR1JBVElPTl8xNjAyXzE2MDQoIm1pZ3JhdGUtMTYwMi0xNjA0IiwgU0VSVklDRV9NSUdBUlRJT05fQkVBTiksIAorCQlBTElHTl9ERVJJVkVEX0ZST01fMTYwNCgiYWxpZ24tZGVyaXZlZC1mcm9tLTE2MDQiLCAiZGVyaXZlZEZyb21BbGlnbm1lbnQiKSwgCisJCU1JR1JBVEVfMTYwNF8xNjA3KCJtaWdyYXRlLTE2MDQtMTYwNyIsIFNFUlZJQ0VfTUlHQVJUSU9OX0JFQU4pLCAKKwkJQUxJR05fVkZDX05BTUVTXzE2MDQoImFsaWduLXZmYy1uYW1lcy0xNjA0IiwgInZmY05hbWluZ0FsaWdubWVudEJlYW4iKSwgCisJCVRFU1RfUkVNT1ZFX0hFQVRfUExBQ0VIT0xERVJTKCJ0ZXN0cmVtb3ZlaGVhdHBsYWNlaG9sZGVycyIsCVNFUlZJQ0VfTUlHQVJUSU9OX0JFQU4pLCAKKwkJVEVTVF9BRERfR1JPVVBfVVVJRFMoInRlc3RhZGRncm91cHV1aWRzIiwgU0VSVklDRV9NSUdBUlRJT05fQkVBTiksIAorCQlBTElHTl9HUk9VUFMoImFsaWduLWdyb3VwcyIsICJncm91cHNBbGlnbm1lbnQiKSwgCisJCUNMRUFOX0NTQVIoImNsZWFuLWNzYXIiLCAiY3Nhck1pZ3JhdGlvbiIpLCAKKwkJUE9QVUxBVEVfQ09NUE9ORU5UX0NBQ0hFKCJwb3B1bGF0ZS1jb21wb25lbnQtY2FjaGUiLCAicG9wdWxhdGVDb21wb25lbnRDYWNoZSIpLCAKKwkJRklYX1BST1BFUlRJRVMoImZpeC1wcm9wZXJ0aWVzIiwgInRpdGFuRml4VXRpbHMiKSwgCisJCUFMSUdOX1RPU0NBX0FSVElGQUNUUygiYWxpZ24tdG9zY2EtYXJ0aWZhY3RzIiwgInRvc2NhQXJ0aWZhY3RzQWxpZ25tZW50IiksIAorCQlGSVhfSUNPTlMoImZpeC1pY29ucyIsICJ0aXRhbkZpeFV0aWxzIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWUsIGJlYW5OYW1lOworCisJCXB1YmxpYyBzdGF0aWMgTWlncmF0aW9uT3BlcmF0aW9uRW51bSBmaW5kQnlWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCU9wdGlvbmFsPE1pZ3JhdGlvbk9wZXJhdGlvbkVudW0+IG9wdGlvbmFsRm91bmQgPSBBcnJheXMuYXNMaXN0KE1pZ3JhdGlvbk9wZXJhdGlvbkVudW0udmFsdWVzKCkpLnN0cmVhbSgpLmZpbHRlcihlIC0+IGUuZ2V0VmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkuZmluZEFueSgpOworCQkJcmV0dXJuIG9wdGlvbmFsRm91bmQuaXNQcmVzZW50KCkgPyBvcHRpb25hbEZvdW5kLmdldCgpIDogbnVsbDsKKwkJfQorCisJCU1pZ3JhdGlvbk9wZXJhdGlvbkVudW0oU3RyaW5nIHZhbHVlLCBTdHJpbmcgYmVhbk5hbWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJCXRoaXMuYmVhbk5hbWUgPSBiZWFuTmFtZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldEJlYW5OYW1lKCkgeworCQkJcmV0dXJuIGJlYW5OYW1lOworCQl9CisJfTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisJCWlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPCAyKSB7CisJCQl1c2FnZUFuZEV4aXQoKTsKKwkJfQorCQlNaWdyYXRpb25PcGVyYXRpb25FbnVtIG9wZXJhdGlvbkVudW0gPSBNaWdyYXRpb25PcGVyYXRpb25FbnVtLmZpbmRCeVZhbHVlKGFyZ3NbMF0pOworCQlTdHJpbmcgYXBwQ29uZmlnRGlyID0gYXJnc1sxXTsKKwkJU3RyaW5nIGRhdGFJbnB1dEZpbGVEaXIgPSBudWxsOworCQlpZiAob3BlcmF0aW9uRW51bSA9PSBNaWdyYXRpb25PcGVyYXRpb25FbnVtLkFMSUdOX0RFUklWRURfRlJPTV8xNjA0KSB7CisJCQlkYXRhSW5wdXRGaWxlRGlyID0gYXJnc1syXTsKKwkJfQorCQlBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBpbml0Q29udGV4dChhcHBDb25maWdEaXIpOworCQl0cnkgeworCQkJU2VydmljZU1pZ3JhdGlvbiBzZXJ2aWNlTWlncmF0aW9uID0gKFNlcnZpY2VNaWdyYXRpb24pIGNvbnRleHQuZ2V0QmVhbihTRVJWSUNFX01JR0FSVElPTl9CRUFOKTsKKwkJCXN3aXRjaCAob3BlcmF0aW9uRW51bSkgeworCQkJY2FzZSBNSUdSQVRJT05fMTYwMl8xNjA0OgorCQkJCWxvZy5kZWJ1ZygiU3RhcnQgVGl0YW4gbWlncmF0aW9uIGZyb20gMTYwMiB2ZXJzaW9uIHRvIDE2MDQiKTsKKwkJCQlpZiAoc2VydmljZU1pZ3JhdGlvbi5taWdyYXRlMTYwMnRvMTYwNChhcHBDb25maWdEaXIpKSB7CisJCQkJCWxvZy5kZWJ1ZygiVGl0YW4gbWlncmF0aW9uIGZyb20gMTYwMiB2ZXJzaW9uIHRvIDE2MDQgd2FzIGZpbmlzaGVkIHN1Y2Nlc3NmdWxsIik7CisJCQkJCVN5c3RlbS5leGl0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiVGl0YW4gbWlncmF0aW9uIGZyb20gMTYwMiB2ZXJzaW9uIHRvIDE2MDQgd2FzIGZhaWxlZCIpOworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQljYXNlIE1JR1JBVEVfMTYwNF8xNjA3OgorCQkJCWxvZy5kZWJ1ZygiU3RhcnQgVGl0YW4gbWlncmF0aW9uIGZyb20gMTYwNCB2ZXJzaW9uIHRvIDE2MDciKTsKKwkJCQlpZiAoc2VydmljZU1pZ3JhdGlvbi5taWdyYXRlMTYwNHRvMTYwNyhhcHBDb25maWdEaXIpKSB7CisJCQkJCWxvZy5kZWJ1ZygiVGl0YW4gbWlncmF0aW9uIGZyb20gMTYwNCB2ZXJzaW9uIHRvIDE2MDcgd2FzIGZpbmlzaGVkIHN1Y2Nlc3NmdWxsIik7CisJCQkJCVN5c3RlbS5leGl0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiVGl0YW4gbWlncmF0aW9uIGZyb20gMTYwNCB2ZXJzaW9uIHRvIDE2MDcgd2FzIGZhaWxlZCIpOworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFMSUdOX1ZGQ19OQU1FU18xNjA0OgorCQkJCVZmY05hbWluZ0FsaWdubWVudCB2ZmNOYW1pbmdBbGlnbm1lbnQgPSAoVmZjTmFtaW5nQWxpZ25tZW50KSBjb250ZXh0LmdldEJlYW4ob3BlcmF0aW9uRW51bS5nZXRCZWFuTmFtZSgpKTsKKwkJCQlsb2cuZGVidWcoIlN0YXJ0IFZGQyBuYW1pbmcgYWxpZ25tZW50IG9uIDE2MDQiKTsKKwkJCQlpZiAodmZjTmFtaW5nQWxpZ25tZW50LmFsaWduVmZjTmFtZXMxNjA0KGFwcENvbmZpZ0RpcikpIHsKKwkJCQkJbG9nLmRlYnVnKCJWRkMgbmFtaW5nIGFsaWdubWVudCBvbiAxNjA0IHdhcyBmaW5pc2hlZCBzdWNjZXNzZnVsbCIpOworCQkJCQlTeXN0ZW0uZXhpdCgwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIlZGQyBuYW1pbmcgYWxpZ25tZW50IG9uIDE2MDQgd2FzIGZhaWxlZCIpOworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRFU1RfUkVNT1ZFX0hFQVRfUExBQ0VIT0xERVJTOgorCQkJCWJvb2xlYW4gY2hlY2sgPSBzZXJ2aWNlTWlncmF0aW9uLnRlc3RSZW1vdmVIZWF0UGxhY2VIb2xkZXJzKGFwcENvbmZpZ0Rpcik7CisJCQkJaWYgKGNoZWNrID09IHRydWUpIHsKKwkJCQkJU3lzdGVtLmV4aXQoMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3lzdGVtLmV4aXQoMik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBURVNUX0FERF9HUk9VUF9VVUlEUzoKKwkJCQljaGVjayA9IHNlcnZpY2VNaWdyYXRpb24udGVzdEFkZEdyb3VwVXVpZHMoYXBwQ29uZmlnRGlyKTsKKwkJCQlpZiAoY2hlY2sgPT0gdHJ1ZSkgeworCQkJCQlTeXN0ZW0uZXhpdCgwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFMSUdOX0RFUklWRURfRlJPTV8xNjA0OgorCQkJCURlcml2ZWRGcm9tQWxpZ25tZW50IGRlcml2ZWRGcm9tQWxpZ25tZW50ID0gKERlcml2ZWRGcm9tQWxpZ25tZW50KSBjb250ZXh0LmdldEJlYW4ob3BlcmF0aW9uRW51bS5nZXRCZWFuTmFtZSgpKTsKKwkJCQlsb2cuZGVidWcoIlN0YXJ0IGRlcml2ZWQgZnJvbSBhbGlnbm1lbnQgb24gMTYwNCIpOworCQkJCWlmIChkZXJpdmVkRnJvbUFsaWdubWVudC5hbGlnbkRlcml2ZWRGcm9tMTYwNChhcHBDb25maWdEaXIsIGRhdGFJbnB1dEZpbGVEaXIpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRGVyaXZlZCBmcm9tIGFsaWdubWVudCBvbiAxNjA0IHdhcyBmaW5pc2hlZCBzdWNjZXNzZnVsbCIpOworCQkJCQlTeXN0ZW0uZXhpdCgwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkRlcml2ZWQgZnJvbSBhbGlnbm1lbnQgb24gMTYwNCB3YXMgZmFpbGVkIik7CisJCQkJCVN5c3RlbS5leGl0KDIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQUxJR05fR1JPVVBTOgorCQkJCUdyb3Vwc0FsaWdubWVudCBncm91cHNBbGlnbm1lbnQgPSAoR3JvdXBzQWxpZ25tZW50KSBjb250ZXh0LmdldEJlYW4ob3BlcmF0aW9uRW51bS5nZXRCZWFuTmFtZSgpKTsKKwkJCQlsb2cuZGVidWcoIlN0YXJ0IGRlcml2ZWQgZnJvbSBhbGlnbm1lbnQgb24gMTYwNCIpOworCQkJCWlmIChncm91cHNBbGlnbm1lbnQuYWxpZ25Hcm91cHMoYXBwQ29uZmlnRGlyKSkgeworCQkJCQlsb2cuZGVidWcoIkdyb3VwcyBhbGlnbm1lbnQgd2FzIGZpbmlzaGVkIHN1Y2Nlc3NmdWxsIik7CisJCQkJCVN5c3RlbS5leGl0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR3JvdXBzIGFsaWdubWVudCB3YXMgZmFpbGVkIik7CisJCQkJCVN5c3RlbS5leGl0KDIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ0xFQU5fQ1NBUjoKKwkJCQlsb2cuZGVidWcoIlN0YXJ0IHJlbW92ZSBDU0FSIHJlc291cmNlcyIpOworCQkJCUNzYXJNaWdyYXRpb24gY3Nhck1pZ3JhdGlvbiA9IChDc2FyTWlncmF0aW9uKSBjb250ZXh0LmdldEJlYW4ob3BlcmF0aW9uRW51bS5nZXRCZWFuTmFtZSgpKTsKKwkJCQkvLyBUT0RPIFNob3cgdG8gTWljaGFlbCBMIGZpeGVkIHJldHVybiB2YWx1ZQorCQkJCWlmIChjc2FyTWlncmF0aW9uLnJlbW92ZUNzYXJSZXNvdXJjZXMoKSkgeworCQkJCQlsb2cuZGVidWcoIlJlbW92ZSBDU0FSIHJlc291cmNlcyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkiKTsKKwkJCQkJU3lzdGVtLmV4aXQoMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJSZW1vdmUgQ1NBUiByZXNvdXJjZXMgZmFpbGVkIik7CisJCQkJCVN5c3RlbS5leGl0KDIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUE9QVUxBVEVfQ09NUE9ORU5UX0NBQ0hFOgorCQkJCVBvcHVsYXRlQ29tcG9uZW50Q2FjaGUgcG9wdWxhdGVDb21wb25lbnRDYWNoZSA9IChQb3B1bGF0ZUNvbXBvbmVudENhY2hlKSBjb250ZXh0LmdldEJlYW4ob3BlcmF0aW9uRW51bS5nZXRCZWFuTmFtZSgpKTsKKwkJCQkvLyBUT0RPIFNob3cgdG8gTWljaGFlbCBMIE5vIHJldHVybiB2YWx1ZSBhbHdheXMgcmV0dXJucyAwCisJCQkJcG9wdWxhdGVDb21wb25lbnRDYWNoZS5wb3B1bGF0ZUNhY2hlKCk7CisJCQkJU3lzdGVtLmV4aXQoMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZJWF9QUk9QRVJUSUVTOgorCQkJCWxvZy5kZWJ1ZygiU3RhcnQgZml4IGNhcGFiaWxpdHkgcHJvcGVydGllcyB0eXBlcyIpOworCQkJCVRpdGFuRml4VXRpbHMgdGl0YW5GaXhVdGlscyA9IChUaXRhbkZpeFV0aWxzKSBjb250ZXh0LmdldEJlYW4ob3BlcmF0aW9uRW51bS5nZXRCZWFuTmFtZSgpKTsKKwkJCQkvLyBUT0RPIFNob3cgdG8gTWljaGFlbCBMIGZpeGVkIHJldHVybiB2YWx1ZQorCQkJCWlmICh0aXRhbkZpeFV0aWxzLmZpeENhcGFiaWx0eVByb3BlcnR5VHlwZXMoKSkgeworCQkJCQlsb2cuZGVidWcoIkZpeCBjYXBhYmlsaXR5IHByb3BlcnRpZXMgdHlwZXMgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5Iik7CisJCQkJCVN5c3RlbS5leGl0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiRml4IGNhcGFiaWxpdHkgcHJvcGVydGllcyB0eXBlcyBmYWlsZWQiKTsKKwkJCQkJU3lzdGVtLmV4aXQoMik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBGSVhfSUNPTlM6CisJCQkJbG9nLmRlYnVnKCJTdGFydCBmaXggaWNvbnMgb2YgdmwgYW5kIGVsaW5lIik7CisJCQkJdGl0YW5GaXhVdGlscyA9IChUaXRhbkZpeFV0aWxzKSBjb250ZXh0LmdldEJlYW4ob3BlcmF0aW9uRW51bS5nZXRCZWFuTmFtZSgpKTsKKwkJCQkvLyBUT0RPIFNob3cgdG8gTWljaGFlbCBMIGZpeGVkIHJldHVybiB2YWx1ZQorCQkJCWlmICh0aXRhbkZpeFV0aWxzLmZpeEljb25zSW5Ob3JtYXRpdmVzKCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGaXggaWNvbnMgb2YgdmwgYW5kIGVsaW5lIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSIpOworCQkJCQlTeXN0ZW0uZXhpdCgwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkZpeCBpY29ucyBvZiB2bCBhbmQgZWxpbmUgZmFpbGVkIik7CisJCQkJCVN5c3RlbS5leGl0KDIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQUxJR05fVE9TQ0FfQVJUSUZBQ1RTOgorCQkJCWxvZy5kZWJ1ZygiU3RhcnQgYWxpZ24gdG9zY2EgYXJ0aWZhY3RzIik7CisJCQkJVG9zY2FBcnRpZmFjdHNBbGlnbm1lbnQgdG9zY2FBcnRpZmFjdHNBbGlnbm1lbnQgPSAoVG9zY2FBcnRpZmFjdHNBbGlnbm1lbnQpIGNvbnRleHQuZ2V0QmVhbihvcGVyYXRpb25FbnVtLmdldEJlYW5OYW1lKCkpOworCQkJCWJvb2xlYW4gaXNTdWNjZXNzZnVsID0gdG9zY2FBcnRpZmFjdHNBbGlnbm1lbnQuYWxpZ25Ub3NjYUFydGlmYWN0cygpOworCQkJCWlmIChpc1N1Y2Nlc3NmdWwpIHsKKwkJCQkJbG9nLmRlYnVnKCJUb3NjYSBBcnRpZmFjdHMgYWxpZ25tZW50IHdhcyBmaW5pc2hlZCBzdWNjZXNzZnVsbCIpOworCQkJCQlTeXN0ZW0uZXhpdCgwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIlRvc2NhIEFydGlmYWN0cyBhbGlnbm1lbnQgaGFzIGZhaWxlZCIpOworCQkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXVzYWdlQW5kRXhpdCgpOworCQkJfQorCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKKwkJCVN5c3RlbS5leGl0KDMpOworCQl9IGZpbmFsbHkgeworCQkJY29udGV4dC5jbG9zZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dCBpbml0Q29udGV4dChTdHJpbmcgYXBwQ29uZmlnRGlyKSB7CisJCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksIGFwcENvbmZpZ0Rpcik7CisJCUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25Tb3VyY2UpOworCQlBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dChBcHBDb25maWcuY2xhc3MpOworCQlyZXR1cm4gY29udGV4dDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlQW5kRXhpdCgpIHsKKwkJTWlncmF0aW9uVXNhZ2UoKTsKKwkJU3lzdGVtLmV4aXQoMSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBNaWdyYXRpb25Vc2FnZSgpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogbWlncmF0ZS0xNjAyLTE2MDQgPGNvbmZpZ3VyYXRpb24gZGlyPiIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBtaWdyYXRlLTE2MDQtMTYwNyA8Y29uZmlndXJhdGlvbiBkaXI+Iik7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGFsaWduLXZmYy1uYW1lcy0xNjA0IDxjb25maWd1cmF0aW9uIGRpcj4iKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogYWxpZ24tZGVyaXZlZC1mcm9tLTE2MDQgPGNvbmZpZ3VyYXRpb24gZGlyPiA8ZGF0YV9pbnB1dF9maWxlIGRpcj4iKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogYWxpZ24tZ3JvdXBzIDxjb25maWd1cmF0aW9uIGRpcj4iKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogZml4LXByb3BlcnRpZXMgPGNvbmZpZ3VyYXRpb24gZGlyPiIpOworCX0KK30KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvbWFpbi9SZW1vdmVVdGlscy5qYXZhIGIvYXNkY3Rvb2wvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9hc2RjdG9vbC9tYWluL1JlbW92ZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlY2U3NQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvbWFpbi9SZW1vdmVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5tYWluOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wuaW1wbC5Qcm9kdWN0TG9naWM7CisKKy8qKgorICogQ3JlYXRlZCBieSBtbGFuZG8gb24gMi8yMy8yMDE2LgorICovCitwdWJsaWMgY2xhc3MgUmVtb3ZlVXRpbHMgeworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8IDEpIHsKKwkJCXJlbW92ZVVzYWdlKCk7CisJCX0KKworCQlTdHJpbmcgb3BlcmF0aW9uID0gYXJnc1swXTsKKworCQlzd2l0Y2ggKG9wZXJhdGlvbi50b0xvd2VyQ2FzZSgpKSB7CisKKwkJY2FzZSAicmVtb3ZlLXByb2R1Y3RzIjoKKworCQkJYm9vbGVhbiBpc1ZhbGlkID0gdmVyaWZ5UGFyYW1zTGVuZ3RoKGFyZ3MsIDUpOworCQkJaWYgKGZhbHNlID09IGlzVmFsaWQpIHsKKwkJCQlyZW1vdmVVc2FnZSgpOworCQkJCVN5c3RlbS5leGl0KDEpOworCQkJfQorCisJCQlQcm9kdWN0TG9naWMgcHJvZHVjdExvZ2ljID0gbmV3IFByb2R1Y3RMb2dpYygpOworCQkJYm9vbGVhbiByZXN1bHQgPSBwcm9kdWN0TG9naWMuZGVsZXRlQWxsUHJvZHVjdHMoYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7CisKKwkJCWlmIChyZXN1bHQgPT0gZmFsc2UpIHsKKwkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVtb3ZlVXNhZ2UoKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVVc2FnZSgpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogcmVtb3ZlLXByb2R1Y3RzIDx0aXRhbi5wcm9wZXJ0aWVzPiA8QkUgaG9zdD4gPEJFIHBvcnQ+IDxhZG1pbiB1c2VyPiIpOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmVyaWZ5UGFyYW1zTGVuZ3RoKFN0cmluZ1tdIGFyZ3MsIGludCBpKSB7CisJCWlmIChhcmdzID09IG51bGwpIHsKKwkJCWlmIChpID4gMCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaWYgKGFyZ3MubGVuZ3RoID49IGkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL21haW4vVXBkYXRlSXNWbmZNZW51LmphdmEgYi9hc2RjdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2FzZGN0b29sL21haW4vVXBkYXRlSXNWbmZNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyMDUxMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYXNkY3Rvb2wvbWFpbi9VcGRhdGVJc1ZuZk1lbnUuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLm1haW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5pbXBsLlVwZGF0ZVByb3BlcnR5T25WZXJ0ZXg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgVXBkYXRlSXNWbmZNZW51IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVcGRhdGVJc1ZuZk1lbnUuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2VBbmRFeGl0KCkgeworCQl1cGRhdGVJc1ZuZlRydWVVc2FnZSgpOworCQlTeXN0ZW0uZXhpdCgxKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUlzVm5mVHJ1ZVVzYWdlKCkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkJIlVzYWdlOiB1cGRhdGVJc1ZuZlRydWUgPHRpdGFuLnByb3BlcnRpZXM+IDxzeXN0ZW1TZXJ2aWNlTmFtZTEsc3lzdGVtU2VydmljZU5hbWUyLC4uLixzeXN0ZW1TZXJ2aWNlTmFtZU4+Iik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8IDEpIHsKKwkJCXVzYWdlQW5kRXhpdCgpOworCQl9CisKKwkJVXBkYXRlUHJvcGVydHlPblZlcnRleCB1cGRhdGVQcm9wZXJ0eU9uVmVydGV4ID0gbmV3IFVwZGF0ZVByb3BlcnR5T25WZXJ0ZXgoKTsKKwkJU3RyaW5nIG9wZXJhdGlvbiA9IGFyZ3NbMF07CisKKwkJc3dpdGNoIChvcGVyYXRpb24udG9Mb3dlckNhc2UoKSkgeworCisJCWNhc2UgInVwZGF0ZWlzdm5mdHJ1ZSI6CisJCQlib29sZWFuIGlzVmFsaWQgPSB2ZXJpZnlQYXJhbXNMZW5ndGgoYXJncywgMyk7CisJCQlpZiAoZmFsc2UgPT0gaXNWYWxpZCkgeworCQkJCXVwZGF0ZUlzVm5mVHJ1ZVVzYWdlKCk7CisJCQkJU3lzdGVtLmV4aXQoMSk7CisJCQl9CisKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4ga2V5VmFsdWVUb1NldCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWtleVZhbHVlVG9TZXQucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfVk5GLmdldFByb3BlcnR5KCksIHRydWUpOworCisJCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IG9yQ3JpdGVyaWEgPSBidWlsZENyaXRlcmlhRnJvbVN5c3RlbVNlcnZpY2VOYW1lcyhhcmdzWzJdKTsKKwkJCUludGVnZXIgdXBkYXRlUHJvcGVydHlPblNlcnZpY2VBdExlYXN0Q2VydGlmaWVkID0gdXBkYXRlUHJvcGVydHlPblZlcnRleAorCQkJCQkudXBkYXRlUHJvcGVydHlPblNlcnZpY2VBdExlYXN0Q2VydGlmaWVkKGFyZ3NbMV0sIGtleVZhbHVlVG9TZXQsIG9yQ3JpdGVyaWEpOworCisJCQlpZiAodXBkYXRlUHJvcGVydHlPblNlcnZpY2VBdExlYXN0Q2VydGlmaWVkID09IG51bGwpIHsKKwkJCQlTeXN0ZW0uZXhpdCgyKTsKKwkJCX0gZWxzZSBpZiAodXBkYXRlUHJvcGVydHlPblNlcnZpY2VBdExlYXN0Q2VydGlmaWVkLmludFZhbHVlKCkgPj0gMCkgeworCQkJCWxvZy5kZWJ1ZygiTnVtYmVyIG9mIHVwZGF0ZWQgc2VydmljZXMgaXMge30iLCB1cGRhdGVQcm9wZXJ0eU9uU2VydmljZUF0TGVhc3RDZXJ0aWZpZWQuaW50VmFsdWUoKSk7CisJCQkJU3lzdGVtLmV4aXQoMCk7CisJCQl9CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2VBbmRFeGl0KCk7CisJCX0KKworCX0KKworCXByaXZhdGUgc3RhdGljIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gYnVpbGRDcml0ZXJpYUZyb21TeXN0ZW1TZXJ2aWNlTmFtZXMoU3RyaW5nIHN5c3RlbUxpc3QpIHsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHN5c3RlbU5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJU3RyaW5nW10gc3BsaXQgPSBzeXN0ZW1MaXN0LnNwbGl0KCIsIik7CisJCWlmIChzcGxpdCAhPSBudWxsKSB7CisJCQlmb3IgKFN0cmluZyBzeXN0ZW1OYW1lIDogc3BsaXQpIHsKKwkJCQlzeXN0ZW1OYW1lID0gc3lzdGVtTmFtZS50cmltKCk7CisKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCQkJbWFwLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNZU1RFTV9OQU1FLmdldFByb3BlcnR5KCksIHN5c3RlbU5hbWUpOworCQkJCW1hcC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uU2VydmljZS5nZXROYW1lKCkpOworCisJCQkJc3lzdGVtTmFtZXMuYWRkKG1hcCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gc3lzdGVtTmFtZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB2ZXJpZnlQYXJhbXNMZW5ndGgoU3RyaW5nW10gYXJncywgaW50IGkpIHsKKwkJaWYgKGFyZ3MgPT0gbnVsbCkgeworCQkJaWYgKGkgPiAwKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoYXJncy5sZW5ndGggPj0gaSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWNvbnRleHQueG1sIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWNvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNWFlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tY29udGV4dC54bWwKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeG1sbnM6YW9wPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2FvcCIgeG1sbnM6dXRpbD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsIgorICB4c2k6c2NoZW1hTG9jYXRpb249IgorICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTMuMS54c2QKKyAgICAgICAgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvdXRpbC9zcHJpbmctdXRpbC0zLjAueHNkIj4KKworICAKKyAgPHV0aWw6cHJvcGVydGllcyBpZD0iZWxhc3RpY3NlYXJjaENvbmZpZyIgbG9jYXRpb249ImZpbGU6JHtjb25maWcuaG9tZX0vZWxhc3RpY3NlYXJjaC55bWwiIC8+CisgIAorPC9iZWFucz4KZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvY2F0ZWdvcnlNaWdyYXRpb24ueWFtbCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvY2F0ZWdvcnlNaWdyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjJkZDBhCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jYXRlZ29yeU1pZ3JhdGlvbi55YW1sCkBAIC0wLDAgKzEsMTEzIEBACitzZXJ2aWNlczoKKyAgICBNb2JpbGl0eToKKyAgICAgIG5hbWU6ICJNb2JpbGl0eSIKKyAgICAgIG9sZE5hbWU6ICJNb2JpbGl0eSIKKyAgICAgIGljb25zOiBbJ21vYmlsaXR5J10KKyAgICBOZXR3b3JrX0wxXzM6CisgICAgICBuYW1lOiAiTmV0d29yayBMMS0zIgorICAgICAgb2xkTmFtZTogIk5ldHdvcmsgTDEtMyIKKyAgICAgIGljb25zOiBbJ25ldHdvcmtfbF8xLTMnXQorICAgIE5ldHdvcmtfTDQ6CisgICAgICBuYW1lOiAiTmV0d29yayBMNCsiCisgICAgICBvbGROYW1lOiAiTmV0d29yayBMNCIKKyAgICAgIGljb25zOiBbJ25ldHdvcmtfbF80J10KKyAgICBWb0lQX0NhbGxfQ29udHJvbDoKKyAgICAgIG5hbWU6ICJWb0lQIENhbGwgQ29udHJvbCIKKyAgICAgIG9sZE5hbWU6ICJWb0lQIENhbGwgQ29udHJvbCIKKyAgICAgIGljb25zOiBbJ2NhbGxfY29udHJvbGwnXQorcmVzb3VyY2VzOgorICBOZXR3b3JrTGF5ZXIyMzoKKyAgICBuYW1lOiAiTmV0d29yayBMMi0zIgorICAgIG9sZE5hbWU6ICJOZXR3b3JrIExheWVyIDItMyIKKyAgICBzdWJjYXRlZ29yaWVzOiAKKyAgICAgIFJvdXRlcjoKKyAgICAgICAgICBuYW1lOiAiUm91dGVyIgorICAgICAgICAgIG9sZE5hbWU6ICJSb3V0ZXIiCisgICAgICAgICAgaWNvbnM6IFsncm91dGVyJywndlJvdXRlciddCisgICAgICBHYXRld2F5OgorICAgICAgICAgIG5hbWU6ICJHYXRld2F5IgorICAgICAgICAgIG9sZE5hbWU6ICJHYXRld2F5IgorICAgICAgICAgIGljb25zOiBbJ2dhdGV3YXknXQorICAgICAgV0FOX0Nvbm5lY3RvcnM6CisgICAgICAgICAgbmFtZTogIldBTiBDb25uZWN0b3JzIgorICAgICAgICAgIG9sZE5hbWU6ICJXQU4gQ29ubmVjdG9ycyIKKyAgICAgICAgICBpY29uczogWyduZXR3b3JrJywnY29ubmVjdG9yJywncG9ydCddCisgICAgICBMQU5fQ29ubmVjdG9yczoKKyAgICAgICAgICBuYW1lOiAiTEFOIENvbm5lY3RvcnMiCisgICAgICAgICAgb2xkTmFtZTogIkxBTiBDb25uZWN0b3JzIgorICAgICAgICAgIGljb25zOiBbJ25ldHdvcmsnLCdjb25uZWN0b3InLCdwb3J0J10KKyAgICAgIEluZnJhc3RydWN0dXJlOgorICAgICAgICAgIG5hbWU6ICJJbmZyYXN0cnVjdHVyZSIKKyAgICAgICAgICBpY29uczogWyd1Y3BlJ10KKyAgTmV0d29ya0xheWVyNDoKKyAgICBuYW1lOiAiTmV0d29yayBMNCsiCisgICAgb2xkTmFtZTogIk5ldHdvcmsgTGF5ZXIgNCsiCisgICAgc3ViY2F0ZWdvcmllczogCisgICAgICBDb21tb25fTmV0d29ya19SZXNvdXJjZXM6CisgICAgICAgICAgbmFtZTogIkNvbW1vbiBOZXR3b3JrIFJlc291cmNlcyIKKyAgICAgICAgICBvbGROYW1lOiAiQ29tbW9uIE5ldHdvcmsgUmVzb3VyY2VzIgorICAgICAgICAgIGljb25zOiBbJ25ldHdvcmsnXQorICBBcHBsaWNhdGlvbkxheWVyNDoKKyAgICBuYW1lOiAiQXBwbGljYXRpb24gTDQrIgorICAgIG9sZE5hbWU6ICJBcHBsaWNhdGlvbiBMYXllciA0KyIKKyAgICBzdWJjYXRlZ29yaWVzOiAKKyAgICAgIEJvcmRlcl9FbGVtZW50OgorICAgICAgICAgIG5hbWU6ICJCb3JkZXIgRWxlbWVudCIKKyAgICAgICAgICBvbGROYW1lOiAiQm9yZGVyIEVsZW1lbnRzIgorICAgICAgICAgIGljb25zOiBbJ2JvcmRlckVsZW1lbnQnXQorICAgICAgQXBwbGljYXRpb25fU2VydmVyOgorICAgICAgICAgIG5hbWU6ICJBcHBsaWNhdGlvbiBTZXJ2ZXIiCisgICAgICAgICAgb2xkTmFtZTogIkFwcGxpY2F0aW9uIFNlcnZlcnMiCisgICAgICAgICAgaWNvbnM6IFsnYXBwbGljYXRpb25TZXJ2ZXInXQorICAgICAgV2ViX1NlcnZlcjoKKyAgICAgICAgICBuYW1lOiAiV2ViIFNlcnZlciIKKyAgICAgICAgICBvbGROYW1lOiAiV2ViIFNlcnZlciIKKyAgICAgICAgICBpY29uczogWydhcHBsaWNhdGlvblNlcnZlciddCisgICAgICBDYWxsX0NvbnRyb2w6CisgICAgICAgICAgbmFtZTogIkNhbGwgQ29udHJvbCIKKyAgICAgICAgICBvbGROYW1lOiAiQ2FsbCBDb250cm9sIgorICAgICAgICAgIGljb25zOiBbJ2NhbGxfY29udHJvbGwnXQorICAgICAgTWVkaWFfU2VydmVyczoKKyAgICAgICAgICBuYW1lOiAiTWVkaWEgU2VydmVycyIKKyAgICAgICAgICBvbGROYW1lOiAiTWVkaWEgU2VydmVycyIKKyAgICAgICAgICBpY29uczogWydhcHBsaWNhdGlvblNlcnZlciddCisgICAgICBMb2FkX0JhbGFuY2VyOgorICAgICAgICAgIG5hbWU6ICJMb2FkIEJhbGFuY2VyIgorICAgICAgICAgIG9sZE5hbWU6ICJMb2FkIEJhbGFuY2VyIgorICAgICAgICAgIGljb25zOiBbJ2xvYWRCYWxhbmNlciddCisgICAgICBEYXRhYmFzZToKKyAgICAgICAgICBuYW1lOiAiRGF0YWJhc2UiCisgICAgICAgICAgb2xkTmFtZTogIkRhdGFiYXNlIgorICAgICAgICAgIGljb25zOiBbJ2RhdGFiYXNlJ10KKyAgICAgIEZpcmV3YWxsOgorICAgICAgICAgIG5hbWU6ICJGaXJld2FsbCIKKyAgICAgICAgICBpY29uczogWydmaXJld2FsbCddCisgIEdlbmVyaWM6CisgICAgbmFtZTogIkdlbmVyaWMiCisgICAgb2xkTmFtZTogIkdlbmVyaWMiCisgICAgc3ViY2F0ZWdvcmllczogCisgICAgICBJbmZyYXN0cnVjdHVyZToKKyAgICAgICAgICBuYW1lOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICAgICAgb2xkTmFtZTogIkluZnJhc3RydWN0dXJlIgorICAgICAgICAgIGljb25zOiBbJ2Nvbm5lY3RvciddCisgICAgICBBYnN0cmFjdDoKKyAgICAgICAgICBuYW1lOiAiQWJzdHJhY3QiCisgICAgICAgICAgb2xkTmFtZTogIkFic3RyYWN0IgorICAgICAgICAgIGljb25zOiBbJ29iamVjdFN0b3JhZ2UnLCAnY29tcHV0ZSddCisgICAgICBOZXR3b3JrX0VsZW1lbnRzOgorICAgICAgICAgIG5hbWU6ICJOZXR3b3JrIEVsZW1lbnRzIgorICAgICAgICAgIG9sZE5hbWU6ICJOZXR3b3JrIEVsZW1lbnRzIgorICAgICAgICAgIGljb25zOiBbJ25ldHdvcmsnLCAnY29ubmVjdG9yJ10KKyAgICAgIERhdGFiYXNlOgorICAgICAgICAgIG5hbWU6ICJEYXRhYmFzZSIKKyAgICAgICAgICBvbGROYW1lOiAiRGF0YWJhc2UiCisgICAgICAgICAgaWNvbnM6IFsnZGF0YWJhc2UnXQorICBOZXR3b3JrQ29ubmVjdGl2aXR5OgorICAgIG5hbWU6ICJOZXR3b3JrIENvbm5lY3Rpdml0eSIKKyAgICBzdWJjYXRlZ29yaWVzOgorICAgICAgQ29ubmVjdGlvblBvaW50czoKKyAgICAgICAgICBuYW1lOiAiQ29ubmVjdGlvbiBQb2ludHMiCisgICAgICAgICAgaWNvbnM6IFsnY3AnXQorICAgICAgVmlydHVhbExpbmtzOgorICAgICAgICAgIG5hbWU6ICJWaXJ0dWFsIExpbmtzIgorICAgICAgICAgIGljb25zOiBbJ3ZsJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZ3VyYXRpb24ueWFtbCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvY29uZmlndXJhdGlvbi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDQyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDM3NiBAQAoraWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHM6CisgICAtIEhUVFBfSVZfVVNFUgorICAgLSBIVFRQX0NTUF9GSVJTVE5BTUUKKyAgIC0gSFRUUF9DU1BfTEFTVE5BTUUKKyAgIC0gSFRUUF9JVl9SRU1PVEVfQUREUkVTUworICAgLSBIVFRQX0NTUF9XU1RZUEUKKworCisKKyMgY2F0YWxvZyBiYWNrZW5kIGhvc3RuYW1lCitiZUZxZG46IHNkY2NhdGFsb2cKKworIyBjYXRhbG9nIGJhY2tlbmQgaHR0cCBwb3J0CitiZUh0dHBQb3J0OiA4MDgwCisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgY29udGV4dAorYmVDb250ZXh0OiAvc2RjL3Jlc3QvY29uZmlnL2dldAorCisjIGNhdGFsb2cgYmFja2VuZCBwcm90b2NvbAorYmVQcm90b2NvbDogaHR0cAorCisjIGNhdGFsb2cgYmFja2VuZCBzc2wgcG9ydAorYmVTc2xQb3J0OiA4NDQzCisKK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKwordGl0YW5DZmdGaWxlOiBzcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL3RpdGFuLnByb3BlcnRpZXMKK3RpdGFuSW5NZW1vcnlHcmFwaDogZmFsc2UKK3RpdGFuTG9ja1RpbWVvdXQ6IDMwCit0aXRhblJlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOiAzCit0aXRhbkhlYWx0aENoZWNrUmVhZFRpbWVvdXQ6IDEKK2VzUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM6IDMKK3VlYkhlYWx0aENoZWNrUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM6IDE1Cit1ZWJIZWFsdGhDaGVja1JlYWRUaW1lb3V0OiA0CisKKyMgUHJvdG9jb2xzCitwcm90b2NvbHM6CisgICAtIGh0dHAKKyAgIC0gaHR0cHMKKworIyBVc2VycwordXNlcnM6CisgICAgdG9tOiBwYXNzd2QKKyAgICBib2I6IHBhc3N3ZAorICAgIAorbmVvNGo6CisgICAgaG9zdDogbmVvNGpob3N0CisgICAgcG9ydDogNzQ3NAorICAgIHVzZXI6IG5lbzRqCisgICAgcGFzc3dvcmQ6ICIxMjM0NSIKKyAgICAKKworI0FwcGxpY2F0aW9uLXNwZWNpZmljIHNldHRpbmdzIG9mIEVTCitlbGFzdGljU2VhcmNoOgorICAgICMgTWFwcGluZyBvZiBpbmRleCBwcmVmaXggdG8gdGltZS1iYXNlZCBmcmFtZS4gRm9yIGV4YW1wbGUsIGlmIGJlbG93IGlzIGNvbmZpZ3VyZWQ6CisgICAgIworICAgICMgLSBpbmRleFByZWZpeDogYXVkaXRpbmdldmVudHMKKyAgICAjICAgIGNyZWF0aW9uUGVyaW9kOiBtaW51dGUKKyAgICAjCisgICAgIyB0aGVuIEVTIG9iamVjdCBvZiB0eXBlIHdoaWNoIGlzIG1hcHBlZCB0byAiYXVkaXRpbmdldmVudHMtKiIgdGVtcGxhdGUsIGFuZCBjcmVhdGVkIG9uIDIwMTUtMTItMjMgMTM6MjQ6NTQsIHdpbGwgZW50ZXIgImF1ZGl0aW5nZXZlbnRzLTIwMTUtMTItMjMtMTMtMjQiIGluZGV4LgorICAgICMgQW5vdGhlciBvYmplY3QgY3JlYXRlZCBvbiAyMDE1LTEyLTIzIDEzOjI1OjU0LCB3aWxsIGVudGVyICJhdWRpdGluZ2V2ZW50cy0yMDE1LTEyLTIzLTEzLTI1IiBpbmRleC4KKyAgICAjIElmIGNyZWF0aW9uUGVyaW9kOiBtb250aCwgYm90aCBvZiB0aGUgYWJvdmUgd2lsbCBlbnRlciAiYXVkaXRpbmdldmVudHMtMjAxNS0xMiIgaW5kZXguCisgICAgIworICAgICMgUExFQVNFIE5PVEU6IHRoZSB0aW1lc3RhbXBzIGFyZSBjcmVhdGVkIGluIFVUQy9HTVQgdGltZXpvbmUhIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgdGltZXN0YW1wcyB3aWxsIGJlIGNvcnJlY3RseSBwcmVzZW50ZWQgaW4gS2liYW5hLgorICAgICMKKyAgICAjIExlZ2FsIHZhbHVlcyBmb3IgY3JlYXRpb25QZXJpb2QgLSB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIG5vbmUgKG1lYW5pbmcgbm8gdGltZS1iYXNlZCBiZWhhdmlvdXIpLgorICAgICMKKyAgICAjIElmIG5vIGNyZWF0aW9uUGVyaW9kIGlzIGNvbmZpZ3VyZWQgZm9yIGluZGV4UHJlZml4LCBkZWZhdWx0IGJlaGF2b3VyIGlzIGNyZWF0aW9uUGVyaW9kOiBtb250aC4KKworICAgIGluZGljZXNUaW1lRnJlcXVlbmN5OgorICAgICAgLSBpbmRleFByZWZpeDogYXVkaXRpbmdldmVudHMKKyAgICAgICAgY3JlYXRpb25QZXJpb2Q6IG1vbnRoCisgICAgICAtIGluZGV4UHJlZml4OiBtb25pdG9yaW5nX2V2ZW50cworICAgICAgICBjcmVhdGlvblBlcmlvZDogbW9udGgKKworYXJ0aWZhY3RUeXBlczoKKyAgIC0gQ0hFRgorICAgLSBQVVBQRVQKKyAgIC0gU0hFTEwKKyAgIC0gWUFORworICAgLSBZQU5HX1hNTAorICAgLSBIRUFUCisgICAtIEJQRUwKKyAgIC0gREdfWE1MCisgICAtIE1VUkFOT19QS0cKKyAgIC0gV09SS0ZMT1cKKyAgIC0gTkVUV09SS19DQUxMX0ZMT1cKKyAgIC0gVE9TQ0FfVEVNUExBVEUKKyAgIC0gVE9TQ0FfQ1NBUgorICAgLSBBQUlfU0VSVklDRV9NT0RFTAorICAgLSBBQUlfVkZfTU9ERUwKKyAgIC0gQUFJX1ZGX01PRFVMRV9NT0RFTAorICAgLSBBQUlfVkZfSU5TVEFOQ0VfTU9ERUwKKyAgIC0gT1RIRVIKKworbGljZW5zZVR5cGVzOgorICAgLSBVc2VyCisgICAtIEluc3RhbGxhdGlvbgorICAgLSBDUFUKKworI0RlcGxveW1lbnQgYXJ0aWZhY3RzIHBsYWNlSG9sZGVyCityZXNvdXJjZVR5cGVzOiAmYWxsUmVzb3VyY2VUeXBlcworICAtIFZGQworICAtIENQCisgIC0gVkwKKyAgLSBWRgorIAorIyB2YWxpZEZvclJlc291cmNlVHlwZXMgdXNhZ2UKKyMgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyMgICAgICAgIC0gVkYKKyMgICAgICAgIC0gVkwKK2RlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0czoKKyAgaGVhdDoKKyAgICAgIGRpc3BsYXlOYW1lOiAiQmFzZSBIRUFUIFRlbXBsYXRlIgorICAgICAgdHlwZTogSEVBVAorICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICBoZWF0Vm9sOgorICAgICAgZGlzcGxheU5hbWU6ICJWb2x1bWUgSEVBVCBUZW1wbGF0ZSIKKyAgICAgIHR5cGU6IEhFQVRfVk9MCisgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgIGhlYXROZXQ6CisgICAgICBkaXNwbGF5TmFtZTogIk5ldHdvcmsgSEVBVCBUZW1wbGF0ZSIKKyAgICAgIHR5cGU6IEhFQVRfTkVUCisgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgIAorZGVwbG95bWVudFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHM6CisgIGhlYXRFbnY6CisgICAgICBkaXNwbGF5TmFtZTogIkhFQVQgRU5WIgorICAgICAgdHlwZTogSEVBVF9FTlYKKyAgICAgIGRlc2NyaXB0aW9uOiAiQXV0by1nZW5lcmF0ZWQgSEVBVCBFbnZpcm9ubWVudCBkZXBsb3ltZW50IGFydGlmYWN0IgorICAgICAgZmlsZUV4dGVuc2lvbjogImVudiIKKworI3Rvc2NhIGFydGlmYWN0cyBwbGFjZWhvbGRlcnMKK3Rvc2NhQXJ0aWZhY3RzOgorICBhc3NldFRvc2NhVGVtcGxhdGU6CisgICAgICBhcnRpZmFjdE5hbWU6IC10ZW1wbGF0ZS55bWwKKyAgICAgIGRpc3BsYXlOYW1lOiBUb3NjYSBUZW1wbGF0ZQorICAgICAgdHlwZTogVE9TQ0FfVEVNUExBVEUKKyAgICAgIGRlc2NyaXB0aW9uOiBUT1NDQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXNzZXQKKyAgYXNzZXRUb3NjYUNzYXI6CisgICAgICBhcnRpZmFjdE5hbWU6IC1jc2FyLmNzYXIKKyAgICAgIGRpc3BsYXlOYW1lOiBUb3NjYSBNb2RlbAorICAgICAgdHlwZTogVE9TQ0FfQ1NBUgorICAgICAgZGVzY3JpcHRpb246IFRPU0NBIGRlZmluaXRpb24gcGFja2FnZSBvZiB0aGUgYXNzZXQKKworI0luZm9ybWF0aW9uYWwgYXJ0aWZhY3RzIHBsYWNlSG9sZGVyCitleGNsdWRlUmVzb3VyY2VDYXRlZ29yeToKKyAgLSBHZW5lcmljCitpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHM6CisgIGZlYXR1cmVzOgorICAgICAgZGlzcGxheU5hbWU6IEZlYXR1cmVzCisgICAgICB0eXBlOiBPVEhFUgorICBjYXBhY2l0eToKKyAgICAgIGRpc3BsYXlOYW1lOiBDYXBhY2l0eQorICAgICAgdHlwZTogT1RIRVIKKyAgdmVuZG9yVGVzdFJlc3VsdDoKKyAgICAgIGRpc3BsYXlOYW1lOiBWZW5kb3IgVGVzdCBSZXN1bHQKKyAgICAgIHR5cGU6IE9USEVSCisgIHRlc3RTY3JpcHRzOgorICAgICAgZGlzcGxheU5hbWU6IFRlc3QgU2NyaXB0cworICAgICAgdHlwZTogT1RIRVIKKyAgY2xvdWRRdWVzdGlvbm5haXJlOgorICAgICAgZGlzcGxheU5hbWU6IENsb3VkIFF1ZXN0aW9ubmFpcmUgKGNvbXBsZXRlZCkKKyAgICAgIHR5cGU6IE9USEVSCisgIEhFQVRUZW1wbGF0ZUZyb21WZW5kb3I6CisgICAgICBkaXNwbGF5TmFtZTogSEVBVCBUZW1wbGF0ZSBmcm9tIFZlbmRvcgorICAgICAgdHlwZTogSEVBVAorICByZXNvdXJjZVNlY3VyaXR5VGVtcGxhdGU6CisgICAgICBkaXNwbGF5TmFtZTogUmVzb3VyY2UgU2VjdXJpdHkgVGVtcGxhdGUKKyAgICAgIHR5cGU6IE9USEVSCisgCitleGNsdWRlU2VydmljZUNhdGVnb3J5OgorCitpbmZvcm1hdGlvbmFsU2VydmljZUFydGlmYWN0czoKKyAgc2VydmljZUFydGlmYWN0UGxhbjoKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlIEFydGlmYWN0IFBsYW4KKyAgICAgIHR5cGU6IE9USEVSCisgIHN1bW1hcnlPZkltcGFjdHNUb0VDT01QRWxlbWVudHM6CisgICAgICBkaXNwbGF5TmFtZTogU3VtbWFyeSBvZiBpbXBhY3RzIHRvIEVDT01QIGVsZW1lbnRzLE9TU3MsIEJTU3MKKyAgICAgIHR5cGU6IE9USEVSCisgIGNvbnRyb2xMb29wRnVuY3Rpb25zOgorICAgICAgZGlzcGxheU5hbWU6IENvbnRyb2wgTG9vcCBGdW5jdGlvbnMKKyAgICAgIHR5cGU6IE9USEVSCisgIGRpbWVuc2lvbmluZ0luZm86CisgICAgICBkaXNwbGF5TmFtZTogRGltZW5zaW9uaW5nIEluZm8KKyAgICAgIHR5cGU6IE9USEVSCisgIGFmZmluaXR5UnVsZXM6CisgICAgICBkaXNwbGF5TmFtZTogQWZmaW5pdHkgUnVsZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIG9wZXJhdGlvbmFsUG9saWNpZXM6CisgICAgICBkaXNwbGF5TmFtZTogT3BlcmF0aW9uYWwgUG9saWNpZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIHNlcnZpY2VTcGVjaWZpY1BvbGljaWVzOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2Utc3BlY2lmaWMgUG9saWNpZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIGVuZ2luZWVyaW5nUnVsZXM6CisgICAgICBkaXNwbGF5TmFtZTogRW5naW5lZXJpbmcgUnVsZXMgKEVSRCkKKyAgICAgIHR5cGU6IE9USEVSCisgIGRpc3RyaWJ1dGlvbkluc3RydWN0aW9uczoKKyAgICAgIGRpc3BsYXlOYW1lOiBEaXN0cmlidXRpb24gSW5zdHJ1Y3Rpb25zCisgICAgICB0eXBlOiBPVEhFUgorICBjZXJ0aWZpY2F0aW9uVGVzdFJlc3VsdHM6CisgICAgICBkaXNwbGF5TmFtZTogVEQgQ2VydGlmaWNhdGlvbiBUZXN0IFJlc3VsdHMKKyAgICAgIHR5cGU6IE9USEVSCisgIGRlcGxveW1lbnRWb3RpbmdSZWNvcmQ6CisgICAgICBkaXNwbGF5TmFtZTogRGVwbG95bWVudCBWb3RpbmcgUmVjb3JkCisgICAgICB0eXBlOiBPVEhFUgorICBzZXJ2aWNlUXVlc3Rpb25uYWlyZToKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlIFF1ZXN0aW9ubmFpcmUKKyAgICAgIHR5cGU6IE9USEVSCisgIHNlcnZpY2VTZWN1cml0eVRlbXBsYXRlOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2UgU2VjdXJpdHkgVGVtcGxhdGUKKyAgICAgIHR5cGU6IE9USEVSCisgICAgICAKK3NlcnZpY2VBcGlBcnRpZmFjdHM6CisgIGNvbmZpZ3VyYXRpb246CisgICAgICBkaXNwbGF5TmFtZTogQ29uZmlndXJhdGlvbgorICAgICAgdHlwZTogT1RIRVIKKyAgaW5zdGFudGlhdGlvbjoKKyAgICAgIGRpc3BsYXlOYW1lOiBJbnN0YW50aWF0aW9uCisgICAgICB0eXBlOiBPVEhFUgorICBtb25pdG9yaW5nOgorICAgICAgZGlzcGxheU5hbWU6IE1vbml0b3JpbmcKKyAgICAgIHR5cGU6IE9USEVSCisgIHJlcG9ydGluZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBSZXBvcnRpbmcKKyAgICAgIHR5cGU6IE9USEVSCisgIGxvZ2dpbmc6CisgICAgICBkaXNwbGF5TmFtZTogTG9nZ2luZworICAgICAgdHlwZTogT1RIRVIKKyAgdGVzdGluZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBUZXN0aW5nCisgICAgICB0eXBlOiBPVEhFUgorCisKK2FkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5czogNTAKKworc3lzdGVtTW9uaXRvcmluZzoKKyAgICBlbmFibGVkOiBmYWxzZQorICAgIGlzUHJveHk6IGZhbHNlCisgICAgcHJvYmVJbnRlcnZhbEluU2Vjb25kczogMTUKKworZGVmYXVsdEhlYXRBcnRpZmFjdFRpbWVvdXRNaW51dGVzOiA2MAorCitzZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0czoKKyAgICBZQU5HX1hNTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgQUFJX1NFUlZJQ0VfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIEFBSV9WRl9NT0RVTEVfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIEFBSV9WRl9JTlNUQU5DRV9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sIAorICAgIE9USEVSOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorCityZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHM6CisgICAgSEVBVDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICBIRUFUX1ZPTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICBIRUFUX05FVDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICBZQU5HX1hNTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgQUFJX1ZGX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIEFBSV9WRl9NT0RVTEVfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGIAorICAgIE9USEVSOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorCityZXNvdXJjZUluc3RhbmNlRGVwbG95bWVudEFydGlmYWN0czoKKyAgICBIRUFUX0VOVjoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0gZW52CisKK3Jlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzOgorCisKK3JlcXVpcmVtZW50c1RvRnVsZmlsbEJlZm9yZUNlcnQ6CisgICAgIENQOgorICAgICAgIC0gdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAKK2NhcGFiaWxpdGllc1RvQ29uc3VtZUJlZm9yZUNlcnQ6CisKK3VuTG9nZ2VkVXJsczoKKyAgIC0gL3NkYzIvcmVzdC9oZWFsdGhDaGVjaworCitjbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uOgorICAgIGNsZWFuSW50ZXJ2YWxJbk1pbnV0ZXM6IDE0NDAKKyAgICBjb21wb25lbnRzVG9DbGVhbjoKKyAgICAgICAtIFJlc291cmNlCisgICAgICAgLSBTZXJ2aWNlCisKK2FydGlmYWN0c0luZGV4OiByZXNvdXJjZXMKK2Nhc3NhbmRyYUNvbmZpZzoKKyAgICBjYXNzYW5kcmFIb3N0czogWydsb2NhbGhvc3QnXQorICAgIGxvY2FsRGF0YUNlbnRlcjoKKyAgICByZWNvbm5lY3RUaW1lb3V0IDogMzAwMDAKKyAgICBhdXRoZW50aWNhdGU6IGZhbHNlCisgICAgdXNlcm5hbWU6IGtva28KKyAgICBwYXNzd29yZDogYm9ibworICAgIHNzbDogZmFsc2UKKyAgICB0cnVzdHN0b3JlUGF0aCA6IC9wYXRoL3BhdGgKKyAgICB0cnVzdHN0b3JlUGFzc3dvcmQgOiAxMjMxMjMKKyAgICBrZXlTcGFjZXM6CisgICAgICAgIC0geyBuYW1lOiBzZGNhdWRpdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgIC0geyBuYW1lOiBzZGNhcnRpZmFjdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgIC0geyBuYW1lOiBzZGNjb21wb25lbnQsIHJlcGxpY2F0aW9uU3RyYXRlZ3k6IFNpbXBsZVN0cmF0ZWd5LCByZXBsaWNhdGlvbkluZm86IFsnMSddfQorCisKK3N3aXRjaG92ZXJEZXRlY3RvcjoKKyAgICBnQmVGcWRuOiAKKyAgICBnRmVGcWRuOiAKKyAgICBiZVZpcDogMS4yLjMuNAorICAgIGZlVmlwOiAxLjIuMy40CisgICAgYmVSZXNvbHZlQXR0ZW1wdHM6IDMKKyAgICBmZVJlc29sdmVBdHRlbXB0czogMworICAgIGVuYWJsZWQ6IGZhbHNlCisgICAgaW50ZXJ2YWw6IDYwCisgICAgY2hhbmdlUHJpb3JpdHlVc2VyOiBlY29tcGFzZGMKKyAgICBjaGFuZ2VQcmlvcml0eVBhc3N3b3JkOiBlY29tcGFzZGMxMjMKKyAgICBwdWJsaXNoTmV0d29ya1VybDogCisgICAgcHVibGlzaE5ldHdvcmtCb2R5OiAneyJub3RlIjoicHVibGlzaCBuZXR3b3JrIn0nCisgICAgZ3JvdXBzOgorICAgICAgYmVTZXQ6IHsgY2hhbmdlUHJpb3JpdHlVcmw6ICJodHRwOi8vbG9jYWxob3N0LyIsCisgICAgICAgICAgICAgICBjaGFuZ2VQcmlvcml0eUJvZHk6ICd7Im5hbWUiOiJBSU8tQkUuZWNvbXAuaWRucy5jaXAiLCJ1cmkiOiIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tQkUuZWNvbXAuaWRucy5jaXAiLCJub19hZF9yZWRpcmVjdGlvbiI6ZmFsc2UsInY0Z3JvdXBzIjp7ImZhaWxvdmVyX2dyb3VwcyI6WyIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfbWdfYmUiLCIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfYnNfYmUiXSwiZmFpbG92ZXJfcG9saWN5IjpbIkZBSUxBTEwiXX0sImNvbW1lbnQiOiJBSU8gQkUgRy1mcWRuIiwiaW50ZW5kZWRfYXBwX3Byb3RvIjoiRE5TIn0nfQorICAgICAgZmVTZXQ6IHsgY2hhbmdlUHJpb3JpdHlVcmw6ICJodHRwOi8vbG9jYWxob3N0LyIsCisgICAgICAgICAgICAgICBjaGFuZ2VQcmlvcml0eUJvZHk6ICd7ImNvbW1lbnQiOiJBSU8gRy1mcWRuIiwibmFtZSI6IkFJTy1GRS5lY29tcC5pZG5zLmNpcCIsInY0Z3JvdXBzIjp7ImZhaWxvdmVyX2dyb3VwcyI6WyIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfbWdfZmUiLCIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfYnNfZmUiXSwiZmFpbG92ZXJfcG9saWN5IjpbIkZBSUxBTEwiXX0sIm5vX2FkX3JlZGlyZWN0aW9uIjpmYWxzZSwiaW50ZW5kZWRfYXBwX3Byb3RvIjoiRE5TIiwidXJpIjoiL2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvc2l0ZXMvQUlPLUZFLmVjb21wLmlkbnMuY2lwLmF0dC5jb20ifSd9CisgICAgCisKK2hlYXRFbnZBcnRpZmFjdEhlYWRlcjoKKyAgICAiIgoraGVhdEVudkFydGlmYWN0Rm9vdGVyOgorICAgICIiCisKK2FwcGxpY2F0aW9uTDFDYWNoZToKKyAgICBkYXRhdHlwZXM6CisgICAgICAgIGVuYWJsZWQ6IGZhbHNlCisgICAgICAgIGZpcnN0UnVuRGVsYXk6IDEwCisgICAgICAgIHBvbGxJbnRlcnZhbEluU2VjOiA2MAorCithcHBsaWNhdGlvbkwyQ2FjaGU6CisgICAgZW5hYmxlZDogZmFsc2UKKyAgICBjYXRhbG9nTDFDYWNoZToKKyAgICAgICAgZW5hYmxlZDogZmFsc2UKKyAgICAgICAgcmVzb3VyY2VzU2l6ZUluQ2FjaGU6IDMwMAorICAgICAgICBzZXJ2aWNlc1NpemVJbkNhY2hlOiAyMDAKKyAgICAgICAgcHJvZHVjdHNTaXplSW5DYWNoZTogMTAwCisgICAgcXVldWU6CisgICAgICAgIHN5bmNJbnRlcnZhbEluU2Vjb25kZXM6IDYwCisgICAgICAgIHdhaXRPblNodXREb3duSW5NaW51dGVzOiAzMAorICAgICAgICBudW1iZXJPZkNhY2hlV29ya2VyczogNAorCit0b3NjYVZhbGlkYXRvcnM6CisgICAgc3RyaW5nTWF4TGVuZ3RoOiAxMDI0CitkaXNhYmxlQXVkaXQ6IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2VsYXN0aWNzZWFyY2gueW1sIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lbGFzdGljc2VhcmNoLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTgwOGFkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lbGFzdGljc2VhcmNoLnltbApAQCAtMCwwICsxLDM5MiBAQAorCitlbGFzdGljU2VhcmNoLmxvY2FsOiB0cnVlCitlbGFzdGljU2VhcmNoLnRyYW5zcG9ydGNsaWVudDogZmFsc2UKK2NsdXN0ZXIubmFtZTogZWxhc3RpY3NlYXJjaF8xXzVfMjIyMgorICAKK2Rpc2NvdmVyeS56ZW4ucGluZy5tdWx0aWNhc3QuZW5hYmxlZDogZmFsc2UKK2Rpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0LmVuYWJsZWQ6IHRydWUKK2Rpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0Lmhvc3RzOiAxLjIuMy40Cit0cmFuc3BvcnQuY2xpZW50LmluaXRpYWxfbm9kZXM6CisgICAtIDEuMi4zLjQ6OTMwMAorCisKKyNwbHVnaW4udHlwZXM6ICJEZWxldGVCeVF1ZXJ5UGx1Z2luIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRWxhc3RpY3NlYXJjaCBDb25maWd1cmF0aW9uIEV4YW1wbGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGFuIG92ZXJ2aWV3IG9mIHZhcmlvdXMgY29uZmlndXJhdGlvbiBzZXR0aW5ncywKKyMgdGFyZ2V0ZWQgYXQgb3BlcmF0aW9ucyBzdGFmZi4gQXBwbGljYXRpb24gZGV2ZWxvcGVycyBzaG91bGQKKyMgY29uc3VsdCB0aGUgZ3VpZGUgYXQgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZT4uCisjCisjIFRoZSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGlzIGNvdmVyZWQgYXQKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L3NldHVwLmh0bWw+LgorIworIyBFbGFzdGljc2VhcmNoIGNvbWVzIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgbW9zdCBzZXR0aW5ncywKKyMgc28geW91IGNhbiB0cnkgaXQgb3V0IHdpdGhvdXQgYm90aGVyaW5nIHdpdGggY29uZmlndXJhdGlvbi4KKyMKKyMgTW9zdCBvZiB0aGUgdGltZSwgdGhlc2UgZGVmYXVsdHMgYXJlIGp1c3QgZmluZSBmb3IgcnVubmluZyBhIHByb2R1Y3Rpb24KKyMgY2x1c3Rlci4gSWYgeW91J3JlIGZpbmUtdHVuaW5nIHlvdXIgY2x1c3Rlciwgb3Igd29uZGVyaW5nIGFib3V0IHRoZQorIyBlZmZlY3Qgb2YgY2VydGFpbiBjb25maWd1cmF0aW9uIG9wdGlvbiwgcGxlYXNlIF9kbyBhc2tfIG9uIHRoZQorIyBtYWlsaW5nIGxpc3Qgb3IgSVJDIGNoYW5uZWwgW2h0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9jb21tdW5pdHldLgorCisjIEFueSBlbGVtZW50IGluIHRoZSBjb25maWd1cmF0aW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcworIyBieSBwbGFjaW5nIHRoZW0gaW4gJHsuLi59IG5vdGF0aW9uLiBGb3IgZXhhbXBsZToKKyMKKyMgbm9kZS5yYWNrOiAke1JBQ0tfRU5WX1ZBUn0KKworIyBGb3IgaW5mb3JtYXRpb24gb24gc3VwcG9ydGVkIGZvcm1hdHMgYW5kIHN5bnRheCBmb3IgdGhlIGNvbmZpZyBmaWxlLCBzZWUKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L3NldHVwLWNvbmZpZ3VyYXRpb24uaHRtbD4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDbHVzdGVyICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ2x1c3RlciBuYW1lIGlkZW50aWZpZXMgeW91ciBjbHVzdGVyIGZvciBhdXRvLWRpc2NvdmVyeS4gSWYgeW91J3JlIHJ1bm5pbmcKKyMgbXVsdGlwbGUgY2x1c3RlcnMgb24gdGhlIHNhbWUgbmV0d29yaywgbWFrZSBzdXJlIHlvdSdyZSB1c2luZyB1bmlxdWUgbmFtZXMuCisjCisjIGNsdXN0ZXIubmFtZTogZWxhc3RpY3NlYXJjaAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBOb2RlIG5hbWVzIGFyZSBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgb24gc3RhcnR1cCwgc28geW91J3JlIHJlbGlldmVkCisjIGZyb20gY29uZmlndXJpbmcgdGhlbSBtYW51YWxseS4gWW91IGNhbiB0aWUgdGhpcyBub2RlIHRvIGEgc3BlY2lmaWMgbmFtZToKKyMKKyMgbm9kZS5uYW1lOiAiRnJhbnogS2Fma2EiCisKKyMgRXZlcnkgbm9kZSBjYW4gYmUgY29uZmlndXJlZCB0byBhbGxvdyBvciBkZW55IGJlaW5nIGVsaWdpYmxlIGFzIHRoZSBtYXN0ZXIsCisjIGFuZCB0byBhbGxvdyBvciBkZW55IHRvIHN0b3JlIHRoZSBkYXRhLgorIworIyBBbGxvdyB0aGlzIG5vZGUgdG8gYmUgZWxpZ2libGUgYXMgYSBtYXN0ZXIgbm9kZSAoZW5hYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgbm9kZS5tYXN0ZXI6IHRydWUKKyMKKyMgQWxsb3cgdGhpcyBub2RlIHRvIHN0b3JlIGRhdGEgKGVuYWJsZWQgYnkgZGVmYXVsdCk6CisjCisjIG5vZGUuZGF0YTogdHJ1ZQorCisjIFlvdSBjYW4gZXhwbG9pdCB0aGVzZSBzZXR0aW5ncyB0byBkZXNpZ24gYWR2YW5jZWQgY2x1c3RlciB0b3BvbG9naWVzLgorIworIyAxLiBZb3Ugd2FudCB0aGlzIG5vZGUgdG8gbmV2ZXIgYmVjb21lIGEgbWFzdGVyIG5vZGUsIG9ubHkgdG8gaG9sZCBkYXRhLgorIyAgICBUaGlzIHdpbGwgYmUgdGhlICJ3b3JraG9yc2UiIG9mIHlvdXIgY2x1c3Rlci4KKyMKKyMgbm9kZS5tYXN0ZXI6IGZhbHNlCisjIG5vZGUuZGF0YTogdHJ1ZQorIworIyAyLiBZb3Ugd2FudCB0aGlzIG5vZGUgdG8gb25seSBzZXJ2ZSBhcyBhIG1hc3RlcjogdG8gbm90IHN0b3JlIGFueSBkYXRhIGFuZAorIyAgICB0byBoYXZlIGZyZWUgcmVzb3VyY2VzLiBUaGlzIHdpbGwgYmUgdGhlICJjb29yZGluYXRvciIgb2YgeW91ciBjbHVzdGVyLgorIworIyBub2RlLm1hc3RlcjogdHJ1ZQorIyBub2RlLmRhdGE6IGZhbHNlCisjCisjIDMuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBiZSBuZWl0aGVyIG1hc3RlciBub3IgZGF0YSBub2RlLCBidXQKKyMgICAgdG8gYWN0IGFzIGEgInNlYXJjaCBsb2FkIGJhbGFuY2VyIiAoZmV0Y2hpbmcgZGF0YSBmcm9tIG5vZGVzLAorIyAgICBhZ2dyZWdhdGluZyByZXN1bHRzLCBldGMuKQorIworIyBub2RlLm1hc3RlcjogZmFsc2UKKyMgbm9kZS5kYXRhOiBmYWxzZQorCisjIFVzZSB0aGUgQ2x1c3RlciBIZWFsdGggQVBJIFtodHRwOi8vbG9jYWxob3N0OjkyMDAvX2NsdXN0ZXIvaGVhbHRoXSwgdGhlCisjIE5vZGUgSW5mbyBBUEkgW2h0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fbm9kZXNdIG9yIEdVSSB0b29scworIyBzdWNoIGFzIDxodHRwOi8vd3d3LmVsYXN0aWNzZWFyY2gub3JnL292ZXJ2aWV3L21hcnZlbC8+LAorIyA8aHR0cDovL2dpdGh1Yi5jb20va2FybWkvZWxhc3RpY3NlYXJjaC1wYXJhbWVkaWM+LAorIyA8aHR0cDovL2dpdGh1Yi5jb20vbHVrYXMtdmxjZWsvYmlnZGVzaz4gYW5kCisjIDxodHRwOi8vbW9iei5naXRodWIuY29tL2VsYXN0aWNzZWFyY2gtaGVhZD4gdG8gaW5zcGVjdCB0aGUgY2x1c3RlciBzdGF0ZS4KKworIyBBIG5vZGUgY2FuIGhhdmUgZ2VuZXJpYyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgd2hpY2ggY2FuIGxhdGVyIGJlIHVzZWQKKyMgZm9yIGN1c3RvbWl6ZWQgc2hhcmQgYWxsb2NhdGlvbiBmaWx0ZXJpbmcsIG9yIGFsbG9jYXRpb24gYXdhcmVuZXNzLiBBbiBhdHRyaWJ1dGUKKyMgaXMgYSBzaW1wbGUga2V5IHZhbHVlIHBhaXIsIHNpbWlsYXIgdG8gbm9kZS5rZXk6IHZhbHVlLCBoZXJlIGlzIGFuIGV4YW1wbGU6CisjCisjIG5vZGUucmFjazogcmFjazMxNAorCisjIEJ5IGRlZmF1bHQsIG11bHRpcGxlIG5vZGVzIGFyZSBhbGxvd2VkIHRvIHN0YXJ0IGZyb20gdGhlIHNhbWUgaW5zdGFsbGF0aW9uIGxvY2F0aW9uCisjIHRvIGRpc2FibGUgaXQsIHNldCB0aGUgZm9sbG93aW5nOgorIyBub2RlLm1heF9sb2NhbF9zdG9yYWdlX25vZGVzOiAxCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEluZGV4ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFlvdSBjYW4gc2V0IGEgbnVtYmVyIG9mIG9wdGlvbnMgKHN1Y2ggYXMgc2hhcmQvcmVwbGljYSBvcHRpb25zLCBtYXBwaW5nCisjIG9yIGFuYWx5emVyIGRlZmluaXRpb25zLCB0cmFuc2xvZyBzZXR0aW5ncywgLi4uKSBmb3IgaW5kaWNlcyBnbG9iYWxseSwKKyMgaW4gdGhpcyBmaWxlLgorIworIyBOb3RlLCB0aGF0IGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gY29uZmlndXJlIGluZGV4IHNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IKKyMgYSBjZXJ0YWluIGluZGV4LCBlaXRoZXIgd2hlbiBjcmVhdGluZyBpdCBvciBieSB1c2luZyB0aGUgaW5kZXggdGVtcGxhdGVzIEFQSS4KKyMKKyMgU2VlIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9pbmRleC1tb2R1bGVzLmh0bWw+IGFuZAorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvaW5kaWNlcy1jcmVhdGUtaW5kZXguaHRtbD4KKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyMgU2V0IHRoZSBudW1iZXIgb2Ygc2hhcmRzIChzcGxpdHMpIG9mIGFuIGluZGV4ICg1IGJ5IGRlZmF1bHQpOgorIworIyBpbmRleC5udW1iZXJfb2Zfc2hhcmRzOiA1CisKKyMgU2V0IHRoZSBudW1iZXIgb2YgcmVwbGljYXMgKGFkZGl0aW9uYWwgY29waWVzKSBvZiBhbiBpbmRleCAoMSBieSBkZWZhdWx0KToKKyMKKyMgaW5kZXgubnVtYmVyX29mX3JlcGxpY2FzOiAxCisKKyMgTm90ZSwgdGhhdCBmb3IgZGV2ZWxvcG1lbnQgb24gYSBsb2NhbCBtYWNoaW5lLCB3aXRoIHNtYWxsIGluZGljZXMsIGl0IHVzdWFsbHkKKyMgbWFrZXMgc2Vuc2UgdG8gImRpc2FibGUiIHRoZSBkaXN0cmlidXRlZCBmZWF0dXJlczoKKyMKK2luZGV4Lm51bWJlcl9vZl9zaGFyZHM6IDEKK2luZGV4Lm51bWJlcl9vZl9yZXBsaWNhczogMAorCisjIFRoZXNlIHNldHRpbmdzIGRpcmVjdGx5IGFmZmVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgaW5kZXggYW5kIHNlYXJjaCBvcGVyYXRpb25zCisjIGluIHlvdXIgY2x1c3Rlci4gQXNzdW1pbmcgeW91IGhhdmUgZW5vdWdoIG1hY2hpbmVzIHRvIGhvbGQgc2hhcmRzIGFuZAorIyByZXBsaWNhcywgdGhlIHJ1bGUgb2YgdGh1bWIgaXM6CisjCisjIDEuIEhhdmluZyBtb3JlICpzaGFyZHMqIGVuaGFuY2VzIHRoZSBfaW5kZXhpbmdfIHBlcmZvcm1hbmNlIGFuZCBhbGxvd3MgdG8KKyMgICAgX2Rpc3RyaWJ1dGVfIGEgYmlnIGluZGV4IGFjcm9zcyBtYWNoaW5lcy4KKyMgMi4gSGF2aW5nIG1vcmUgKnJlcGxpY2FzKiBlbmhhbmNlcyB0aGUgX3NlYXJjaF8gcGVyZm9ybWFuY2UgYW5kIGltcHJvdmVzIHRoZQorIyAgICBjbHVzdGVyIF9hdmFpbGFiaWxpdHlfLgorIworIyBUaGUgIm51bWJlcl9vZl9zaGFyZHMiIGlzIGEgb25lLXRpbWUgc2V0dGluZyBmb3IgYW4gaW5kZXguCisjCisjIFRoZSAibnVtYmVyX29mX3JlcGxpY2FzIiBjYW4gYmUgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBhbnl0aW1lLAorIyBieSB1c2luZyB0aGUgSW5kZXggVXBkYXRlIFNldHRpbmdzIEFQSS4KKyMKKyMgRWxhc3RpY3NlYXJjaCB0YWtlcyBjYXJlIGFib3V0IGxvYWQgYmFsYW5jaW5nLCByZWxvY2F0aW5nLCBnYXRoZXJpbmcgdGhlCisjIHJlc3VsdHMgZnJvbSBub2RlcywgZXRjLiBFeHBlcmltZW50IHdpdGggZGlmZmVyZW50IHNldHRpbmdzIHRvIGZpbmUtdHVuZQorIyB5b3VyIHNldHVwLgorCisjIFVzZSB0aGUgSW5kZXggU3RhdHVzIEFQSSAoPGh0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9BL19zdGF0dXM+KSB0byBpbnNwZWN0CisjIHRoZSBpbmRleCBzdGF0dXMuCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBhdGhzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGF0aC5ob21lOiAvc3JjL3Rlc3QvcmVzb3VyY2VzCisjIFBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiAodGhpcyBmaWxlIGFuZCBsb2dnaW5nLnltbCk6CisjCitwYXRoLmNvbmY6IC9zcmMvdGVzdC9yZXNvdXJjZXMKKworIyBQYXRoIHRvIGRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSBpbmRleCBkYXRhIGFsbG9jYXRlZCBmb3IgdGhpcyBub2RlLgorIworcGF0aC5kYXRhOiB0YXJnZXQvZXNkYXRhCisjCisjIENhbiBvcHRpb25hbGx5IGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBsb2NhdGlvbiwgY2F1c2luZyBkYXRhIHRvIGJlIHN0cmlwZWQgYWNyb3NzCisjIHRoZSBsb2NhdGlvbnMgKGEgbGEgUkFJRCAwKSBvbiBhIGZpbGUgbGV2ZWwsIGZhdm91cmluZyBsb2NhdGlvbnMgd2l0aCBtb3N0IGZyZWUKKyMgc3BhY2Ugb24gY3JlYXRpb24uIEZvciBleGFtcGxlOgorIworIyBwYXRoLmRhdGE6IC9wYXRoL3RvL2RhdGExLC9wYXRoL3RvL2RhdGEyCisKKyMgUGF0aCB0byB0ZW1wb3JhcnkgZmlsZXM6CisjCitwYXRoLndvcms6IC90YXJnZXQvZXN3b3JrCisKKyMgUGF0aCB0byBsb2cgZmlsZXM6CisjCitwYXRoLmxvZ3M6IC90YXJnZXQvZXNsb2dzCisKKyMgUGF0aCB0byB3aGVyZSBwbHVnaW5zIGFyZSBpbnN0YWxsZWQ6CisjCisjIHBhdGgucGx1Z2luczogL3BhdGgvdG8vcGx1Z2lucworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBQbHVnaW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBJZiBhIHBsdWdpbiBsaXN0ZWQgaGVyZSBpcyBub3QgaW5zdGFsbGVkIGZvciBjdXJyZW50IG5vZGUsIHRoZSBub2RlIHdpbGwgbm90IHN0YXJ0LgorIworIyBwbHVnaW4ubWFuZGF0b3J5OiBtYXBwZXItYXR0YWNobWVudHMsbGFuZy1ncm9vdnkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNZW1vcnkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRWxhc3RpY3NlYXJjaCBwZXJmb3JtcyBwb29ybHkgd2hlbiBKVk0gc3RhcnRzIHN3YXBwaW5nOiB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0CisjIGl0IF9uZXZlcl8gc3dhcHMuCisjCisjIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gbG9jayB0aGUgbWVtb3J5OgorIworIyBib290c3RyYXAubWxvY2thbGw6IHRydWUKKworIyBNYWtlIHN1cmUgdGhhdCB0aGUgRVNfTUlOX01FTSBhbmQgRVNfTUFYX01FTSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAorIyB0byB0aGUgc2FtZSB2YWx1ZSwgYW5kIHRoYXQgdGhlIG1hY2hpbmUgaGFzIGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUKKyMgZm9yIEVsYXN0aWNzZWFyY2gsIGxlYXZpbmcgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXRzZWxmLgorIworIyBZb3Ugc2hvdWxkIGFsc28gbWFrZSBzdXJlIHRoYXQgdGhlIEVsYXN0aWNzZWFyY2ggcHJvY2VzcyBpcyBhbGxvd2VkIHRvIGxvY2sKKyMgdGhlIG1lbW9yeSwgZWcuIGJ5IHVzaW5nIGB1bGltaXQgLWwgdW5saW1pdGVkYC4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTmV0d29yayBBbmQgSFRUUCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRWxhc3RpY3NlYXJjaCwgYnkgZGVmYXVsdCwgYmluZHMgaXRzZWxmIHRvIHRoZSAwLjAuMC4wIGFkZHJlc3MsIGFuZCBsaXN0ZW5zCisjIG9uIHBvcnQgWzkyMDAtOTMwMF0gZm9yIEhUVFAgdHJhZmZpYyBhbmQgb24gcG9ydCBbOTMwMC05NDAwXSBmb3Igbm9kZS10by1ub2RlCisjIGNvbW11bmljYXRpb24uICh0aGUgcmFuZ2UgbWVhbnMgdGhhdCBpZiB0aGUgcG9ydCBpcyBidXN5LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkKKyMgdHJ5IHRoZSBuZXh0IHBvcnQpLgorCisjIFNldCB0aGUgYmluZCBhZGRyZXNzIHNwZWNpZmljYWxseSAoSVB2NCBvciBJUHY2KToKKyMKKyMgbmV0d29yay5iaW5kX2hvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IHRoZSBhZGRyZXNzIG90aGVyIG5vZGVzIHdpbGwgdXNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhpcyBub2RlLiBJZiBub3QKKyMgc2V0LCBpdCBpcyBhdXRvbWF0aWNhbGx5IGRlcml2ZWQuIEl0IG11c3QgcG9pbnQgdG8gYW4gYWN0dWFsIElQIGFkZHJlc3MuCisjCisjIG5ldHdvcmsucHVibGlzaF9ob3N0OiAxOTIuMTY4LjAuMQorCisjIFNldCBib3RoICdiaW5kX2hvc3QnIGFuZCAncHVibGlzaF9ob3N0JzoKKyMKKyMgbmV0d29yay5ob3N0OiAxOTIuMTY4LjAuMQorCisjIFNldCBhIGN1c3RvbSBwb3J0IGZvciB0aGUgbm9kZSB0byBub2RlIGNvbW11bmljYXRpb24gKDkzMDAgYnkgZGVmYXVsdCk6CisjCisjIHRyYW5zcG9ydC50Y3AucG9ydDogOTMwMAorCisjIEVuYWJsZSBjb21wcmVzc2lvbiBmb3IgYWxsIGNvbW11bmljYXRpb24gYmV0d2VlbiBub2RlcyAoZGlzYWJsZWQgYnkgZGVmYXVsdCk6CisjCisjIHRyYW5zcG9ydC50Y3AuY29tcHJlc3M6IHRydWUKKworIyBTZXQgYSBjdXN0b20gcG9ydCB0byBsaXN0ZW4gZm9yIEhUVFAgdHJhZmZpYzoKKyMKKyMgaHR0cC5wb3J0OiA5MjAwCisKKyMgU2V0IGEgY3VzdG9tIGFsbG93ZWQgY29udGVudCBsZW5ndGg6CisjCisjIGh0dHAubWF4X2NvbnRlbnRfbGVuZ3RoOiAxMDBtYgorCisjIERpc2FibGUgSFRUUCBjb21wbGV0ZWx5OgorIworIyBodHRwLmVuYWJsZWQ6IGZhbHNlCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgR2F0ZXdheSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoZSBnYXRld2F5IGFsbG93cyBmb3IgcGVyc2lzdGluZyB0aGUgY2x1c3RlciBzdGF0ZSBiZXR3ZWVuIGZ1bGwgY2x1c3RlcgorIyByZXN0YXJ0cy4gRXZlcnkgY2hhbmdlIHRvIHRoZSBzdGF0ZSAoc3VjaCBhcyBhZGRpbmcgYW4gaW5kZXgpIHdpbGwgYmUgc3RvcmVkCisjIGluIHRoZSBnYXRld2F5LCBhbmQgd2hlbiB0aGUgY2x1c3RlciBzdGFydHMgdXAgZm9yIHRoZSBmaXJzdCB0aW1lLAorIyBpdCB3aWxsIHJlYWQgaXRzIHN0YXRlIGZyb20gdGhlIGdhdGV3YXkuCisKKyMgVGhlcmUgYXJlIHNldmVyYWwgdHlwZXMgb2YgZ2F0ZXdheSBpbXBsZW1lbnRhdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMtZ2F0ZXdheS5odG1sPi4KKworIyBUaGUgZGVmYXVsdCBnYXRld2F5IHR5cGUgaXMgdGhlICJsb2NhbCIgZ2F0ZXdheSAocmVjb21tZW5kZWQpOgorIworIyBnYXRld2F5LnR5cGU6IGxvY2FsCisKKyMgU2V0dGluZ3MgYmVsb3cgY29udHJvbCBob3cgYW5kIHdoZW4gdG8gc3RhcnQgdGhlIGluaXRpYWwgcmVjb3ZlcnkgcHJvY2VzcyBvbgorIyBhIGZ1bGwgY2x1c3RlciByZXN0YXJ0ICh0byByZXVzZSBhcyBtdWNoIGxvY2FsIGRhdGEgYXMgcG9zc2libGUgd2hlbiB1c2luZyBzaGFyZWQKKyMgZ2F0ZXdheSkuCisKKyMgQWxsb3cgcmVjb3ZlcnkgcHJvY2VzcyBhZnRlciBOIG5vZGVzIGluIGEgY2x1c3RlciBhcmUgdXA6CisjCitnYXRld2F5LnJlY292ZXJfYWZ0ZXJfbm9kZXM6IDEKKworIyBTZXQgdGhlIHRpbWVvdXQgdG8gaW5pdGlhdGUgdGhlIHJlY292ZXJ5IHByb2Nlc3MsIG9uY2UgdGhlIE4gbm9kZXMKKyMgZnJvbSBwcmV2aW91cyBzZXR0aW5nIGFyZSB1cCAoYWNjZXB0cyB0aW1lIHZhbHVlKToKKyMKKyMgZ2F0ZXdheS5yZWNvdmVyX2FmdGVyX3RpbWU6IDVtCisKKyMgU2V0IGhvdyBtYW55IG5vZGVzIGFyZSBleHBlY3RlZCBpbiB0aGlzIGNsdXN0ZXIuIE9uY2UgdGhlc2UgTiBub2RlcworIyBhcmUgdXAgKGFuZCByZWNvdmVyX2FmdGVyX25vZGVzIGlzIG1ldCksIGJlZ2luIHJlY292ZXJ5IHByb2Nlc3MgaW1tZWRpYXRlbHkKKyMgKHdpdGhvdXQgd2FpdGluZyBmb3IgcmVjb3Zlcl9hZnRlcl90aW1lIHRvIGV4cGlyZSk6CisjCitnYXRld2F5LmV4cGVjdGVkX25vZGVzOiAxCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUmVjb3ZlcnkgVGhyb3R0bGluZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoZXNlIHNldHRpbmdzIGFsbG93IHRvIGNvbnRyb2wgdGhlIHByb2Nlc3Mgb2Ygc2hhcmRzIGFsbG9jYXRpb24gYmV0d2VlbgorIyBub2RlcyBkdXJpbmcgaW5pdGlhbCByZWNvdmVyeSwgcmVwbGljYSBhbGxvY2F0aW9uLCByZWJhbGFuY2luZywKKyMgb3Igd2hlbiBhZGRpbmcgYW5kIHJlbW92aW5nIG5vZGVzLgorCisjIFNldCB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVjb3ZlcmllcyBoYXBwZW5pbmcgb24gYSBub2RlOgorIworIyAxLiBEdXJpbmcgdGhlIGluaXRpYWwgcmVjb3ZlcnkKKyMKKyMgY2x1c3Rlci5yb3V0aW5nLmFsbG9jYXRpb24ubm9kZV9pbml0aWFsX3ByaW1hcmllc19yZWNvdmVyaWVzOiA0CisjCisjIDIuIER1cmluZyBhZGRpbmcvcmVtb3Zpbmcgbm9kZXMsIHJlYmFsYW5jaW5nLCBldGMKKyMKKyMgY2x1c3Rlci5yb3V0aW5nLmFsbG9jYXRpb24ubm9kZV9jb25jdXJyZW50X3JlY292ZXJpZXM6IDIKKworIyBTZXQgdG8gdGhyb3R0bGUgdGhyb3VnaHB1dCB3aGVuIHJlY292ZXJpbmcgKGVnLiAxMDBtYiwgYnkgZGVmYXVsdCAyMG1iKToKKyMKKyMgaW5kaWNlcy5yZWNvdmVyeS5tYXhfYnl0ZXNfcGVyX3NlYzogMjBtYgorCisjIFNldCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG9wZW4gY29uY3VycmVudCBzdHJlYW1zIHdoZW4KKyMgcmVjb3ZlcmluZyBhIHNoYXJkIGZyb20gYSBwZWVyOgorIworIyBpbmRpY2VzLnJlY292ZXJ5LmNvbmN1cnJlbnRfc3RyZWFtczogNQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRGlzY292ZXJ5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEaXNjb3ZlcnkgaW5mcmFzdHJ1Y3R1cmUgZW5zdXJlcyBub2RlcyBjYW4gYmUgZm91bmQgd2l0aGluIGEgY2x1c3RlcgorIyBhbmQgbWFzdGVyIG5vZGUgaXMgZWxlY3RlZC4gTXVsdGljYXN0IGRpc2NvdmVyeSBpcyB0aGUgZGVmYXVsdC4KKworIyBTZXQgdG8gZW5zdXJlIGEgbm9kZSBzZWVzIE4gb3RoZXIgbWFzdGVyIGVsaWdpYmxlIG5vZGVzIHRvIGJlIGNvbnNpZGVyZWQKKyMgb3BlcmF0aW9uYWwgd2l0aGluIHRoZSBjbHVzdGVyLiBJdHMgcmVjb21tZW5kZWQgdG8gc2V0IGl0IHRvIGEgaGlnaGVyIHZhbHVlCisjIHRoYW4gMSB3aGVuIHJ1bm5pbmcgbW9yZSB0aGFuIDIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCisjCisjIGRpc2NvdmVyeS56ZW4ubWluaW11bV9tYXN0ZXJfbm9kZXM6IDEKKworIyBTZXQgdGhlIHRpbWUgdG8gd2FpdCBmb3IgcGluZyByZXNwb25zZXMgZnJvbSBvdGhlciBub2RlcyB3aGVuIGRpc2NvdmVyaW5nLgorIyBTZXQgdGhpcyBvcHRpb24gdG8gYSBoaWdoZXIgdmFsdWUgb24gYSBzbG93IG9yIGNvbmdlc3RlZCBuZXR3b3JrCisjIHRvIG1pbmltaXplIGRpc2NvdmVyeSBmYWlsdXJlczoKKyMKKyMgZGlzY292ZXJ5Lnplbi5waW5nLnRpbWVvdXQ6IDNzCisKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy1kaXNjb3ZlcnktemVuLmh0bWw+CisKKyMgVW5pY2FzdCBkaXNjb3ZlcnkgYWxsb3dzIHRvIGV4cGxpY2l0bHkgY29udHJvbCB3aGljaCBub2RlcyB3aWxsIGJlIHVzZWQKKyMgdG8gZGlzY292ZXIgdGhlIGNsdXN0ZXIuIEl0IGNhbiBiZSB1c2VkIHdoZW4gbXVsdGljYXN0IGlzIG5vdCBwcmVzZW50LAorIyBvciB0byByZXN0cmljdCB0aGUgY2x1c3RlciBjb21tdW5pY2F0aW9uLXdpc2UuCisjCisjIDEuIERpc2FibGUgbXVsdGljYXN0IGRpc2NvdmVyeSAoZW5hYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgZGlzY292ZXJ5Lnplbi5waW5nLm11bHRpY2FzdC5lbmFibGVkOiBmYWxzZQorIworIyAyLiBDb25maWd1cmUgYW4gaW5pdGlhbCBsaXN0IG9mIG1hc3RlciBub2RlcyBpbiB0aGUgY2x1c3RlcgorIyAgICB0byBwZXJmb3JtIGRpc2NvdmVyeSB3aGVuIG5ldyBub2RlcyAobWFzdGVyIG9yIGRhdGEpIGFyZSBzdGFydGVkOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcudW5pY2FzdC5ob3N0czogWyJob3N0MSIsICJob3N0Mjpwb3J0Il0KKworIyBFQzIgZGlzY292ZXJ5IGFsbG93cyB0byB1c2UgQVdTIEVDMiBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBkaXNjb3ZlcnkuCisjCisjIFlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGNsb3VkLWF3cyBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBFQzIgZGlzY292ZXJ5LgorIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzLWRpc2NvdmVyeS1lYzIuaHRtbD4KKyMKKyMgU2VlIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvdHV0b3JpYWxzL2VsYXN0aWNzZWFyY2gtb24tZWMyLz4KKyMgZm9yIGEgc3RlcC1ieS1zdGVwIHR1dG9yaWFsLgorCisjIEdDRSBkaXNjb3ZlcnkgYWxsb3dzIHRvIHVzZSBHb29nbGUgQ29tcHV0ZSBFbmdpbmUgQVBJIGluIG9yZGVyIHRvIHBlcmZvcm0gZGlzY292ZXJ5LgorIworIyBZb3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBjbG91ZC1nY2UgcGx1Z2luIGZvciBlbmFibGluZyB0aGUgR0NFIGRpc2NvdmVyeS4KKyMKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8aHR0cHM6Ly9naXRodWIuY29tL2VsYXN0aWNzZWFyY2gvZWxhc3RpY3NlYXJjaC1jbG91ZC1nY2U+LgorCisjIEF6dXJlIGRpc2NvdmVyeSBhbGxvd3MgdG8gdXNlIEF6dXJlIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGRpc2NvdmVyeS4KKyMKKyMgWW91IGhhdmUgdG8gaW5zdGFsbCB0aGUgY2xvdWQtYXp1cmUgcGx1Z2luIGZvciBlbmFibGluZyB0aGUgQXp1cmUgZGlzY292ZXJ5LgorIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxodHRwczovL2dpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC9lbGFzdGljc2VhcmNoLWNsb3VkLWF6dXJlPi4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBTbG93IExvZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgU2hhcmQgbGV2ZWwgcXVlcnkgYW5kIGZldGNoIHRocmVzaG9sZCBsb2dnaW5nLgorCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5Lndhcm46IDEwcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5xdWVyeS5pbmZvOiA1cworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5xdWVyeS5kZWJ1ZzogMnMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQucXVlcnkudHJhY2U6IDUwMG1zCisKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQuZmV0Y2gud2FybjogMXMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQuZmV0Y2guaW5mbzogODAwbXMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQuZmV0Y2guZGVidWc6IDUwMG1zCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLmZldGNoLnRyYWNlOiAyMDBtcworCisjaW5kZXguaW5kZXhpbmcuc2xvd2xvZy50aHJlc2hvbGQuaW5kZXgud2FybjogMTBzCisjaW5kZXguaW5kZXhpbmcuc2xvd2xvZy50aHJlc2hvbGQuaW5kZXguaW5mbzogNXMKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC5kZWJ1ZzogMnMKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC50cmFjZTogNTAwbXMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHQyBMb2dnaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyNtb25pdG9yLmp2bS5nYy55b3VuZy53YXJuOiAxMDAwbXMKKyNtb25pdG9yLmp2bS5nYy55b3VuZy5pbmZvOiA3MDBtcworI21vbml0b3IuanZtLmdjLnlvdW5nLmRlYnVnOiA0MDBtcworCisjbW9uaXRvci5qdm0uZ2Mub2xkLndhcm46IDEwcworI21vbml0b3IuanZtLmdjLm9sZC5pbmZvOiA1cworI21vbml0b3IuanZtLmdjLm9sZC5kZWJ1ZzogMnMKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTUwMDllCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSwxNjcxIEBACisjIEVycm9ycworZXJyb3JzOgorICAgIE9LOiB7CisgICAgICAgIGNvZGU6IDIwMCwKKyAgICAgICAgbWVzc2FnZTogIk9LIgorICAgIH0KKyAgICBDUkVBVEVEOiB7CisgICAgICAgIGNvZGU6IDIwMSwKKyAgICAgICAgbWVzc2FnZTogIk9LIgorICAgIH0KKyAgICBOT19DT05URU5UOiB7CisgICAgICAgIGNvZGU6IDIwNCwKKyAgICAgICAgbWVzc2FnZTogIk5vIENvbnRlbnQiCisgICAgfQorIy0tLS0tLS0tUE9MNDA1MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBOT1RfQUxMT1dFRDogeworICAgICAgICBjb2RlOiA0MDUsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWV0aG9kIG5vdCBhbGxvd2VkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDQwNTAiCisgICAgfQorIy0tLS0tLS0tUE9MNTAwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBHRU5FUkFMX0VSUk9SOiB7CisgICAgICAgIGNvZGU6IDUwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMCIKKyAgICB9CisjLS0tLS0tLS0tUE9MNTAwMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgJ1gtRUNPTVAtSW5zdGFuY2VJRCcgSFRUUCBoZWFkZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMSIKKyAgICB9CisjLS0tLS0tLS0tUE9MNTAwMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgQVVUSF9SRVFVSVJFRDogeworICAgICAgICBjb2RlOiA0MDEgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEFQSS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w1MDAyIgorICAgIH0KKyMtLS0tLS0tLS1QT0w1MDAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBBVVRIX0ZBSUxFRDogeworICAgICAgICBjb2RlOiA0MDMgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBOb3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIEFQSS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w1MDAzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9DT05URU5UOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwMCIKKyAgICB9Iy0tLS0tLS0tLVNWQzQwMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX0NPTlRFTlQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTU0lOR19JTkZPUk1BVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBpbmZvcm1hdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDAyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgVVNFUl9JRCAgICAgCisgICAgVVNFUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIGVtYWlsIGFkZHJlc3MgICAgIAorICAgIElOVkFMSURfRU1BSUxfQUREUkVTUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBlbWFpbCBhZGRyZXNzICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSByb2xlCisgICAgSU5WQUxJRF9ST0xFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJvbGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgVVNFUl9JRCAgICAgCisgICAgVVNFUl9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIHdpdGggJyUxJyBJRCBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIERFTEVURV9VU0VSX0FETUlOX0NPTkZMSUNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBbiBhZG1pbmlzdHJhdG9yIGNhbiBvbmx5IGJlIGRlbGV0ZWQgYnkgYW5vdGhlciBhZG1pbmlzdHJhdG9yLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDciCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIHVzZXJJZCAgICAgCisgICAgSU5WQUxJRF9VU0VSX0lEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHVzZXJJZCAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyAlMSBjb250YWN0IGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNDkiCisgICAgfSAKKyMtLS0tLS0tLS1TVkM0MDUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZS9BZGRpdGlvbmFsIHBhcmFtZXRlcgorIyAlMiAtIHNlcnZpY2UvcmVzb3VyY2UvbGFiZWwgbmFtZQorICAgIENPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIHdpdGggbmFtZSAnJTInIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gcmVzb3VyY2Uvc2VydmljZSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19DQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTEiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19UQUdTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEF0IGxlYXN0IG9uZSB0YWcgaGFzIHRvIGJlIHNwZWNpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDUyIgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9NSVNTSU5HX0RFU0NSSVBUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgJTEgZGVzY3JpcHRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gcmVzb3VyY2Uvc2VydmljZQorICAgIENPTVBPTkVOVF9JTlZBTElEX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEludmFsaWQgJTEgY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX1ZFTkRPUl9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgdmVuZG9yIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX1ZFTkRPUl9SRUxFQVNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgdmVuZG9yIHJlbGVhc2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NiIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDU3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBNSVNTSU5HX0RFUklWRURfRlJPTV9URU1QTEFURTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIGRlcml2ZWQgZnJvbSB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTciCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX01JU1NJTkdfSUNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGljb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1OCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX0lOVkFMSURfSUNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBJbnZhbGlkICUxIGljb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgUEFSRU5UX1JFU09VUkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBEZXJpdmVkIGZyb20gcmVzb3VyY2UgdGVtcGxhdGUgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDYwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDYxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBNVUxUSVBMRV9QQVJFTlRfUkVTT1VSQ0VfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTXVsdGlwbGUgZGVyaXZlZCBmcm9tIHJlc291cmNlIHRlbXBsYXRlIGlzIG5vdCBhbGxvd2VkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjEiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA2Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgTUlTU0lOR19DT01QT05FTlRfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgIyUxwqAgLcKgIHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyAgICBSRVNPVVJDRV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHJlc291cmNlIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDY0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyAgICBDT01QT05FTlRfSU5WQUxJRF9ERVNDUklQVElPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBkZXNjcmlwdGlvbiBjb250YWlucyBub24tZW5nbGlzaCBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorIyAlMiAtIG1heCByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgbGVuZ3RoIAorICAgIENPTVBPTkVOVF9ERVNDUklQVElPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGRlc2NyaXB0aW9uIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDY2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIG1heCBsZW5ndGggICAKKyAgICBDT01QT05FTlRfVEFHU19FWENFRURfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGFncyBvdmVyYWxsIGxlbmd0aCBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIG1heCBsZW5ndGggIAorICAgIFZFTkRPUl9OQU1FX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVmVuZG9yIG5hbWUgZXhjZWVkcyBsaW1pdCBvZiAlMSBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtYXggbGVuZ3RoICAKKyAgICBWRU5ET1JfUkVMRUFTRV9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciByZWxlYXNlIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY4IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZS9Qcm9kdWN0CisgICAgQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVF9JRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBjb250YWN0IGlkIHNob3VsZCBiZSBpbiBmb3JtYXQgJ21ubm5ubm4nIG9yICdhYW5ubmEnIG9yICdhYW5ubm4nLCB3aGVyZSBtPW0gLGE9YS16QS1aIGFuZCBuPTAtOSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorICAgIElOVkFMSURfQ09NUE9ORU5UX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgbmFtZSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGNoYXJhY3RlcnMgbGlrZSA8PjoiXC98PyogYW5kIHNwYWNlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiByZWd1bGFyIHNwYWNlLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNzAiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA3MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1ZFTkRPUl9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciBuYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA3Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1ZFTkRPUl9SRUxFQVNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciByZWxlYXNlIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA3My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gbWF4ICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgIAorICAgIENPTVBPTkVOVF9OQU1FX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgbmFtZSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA4MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0lOX0NIRUNLT1VUX1NUQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiBpcyBsb2NrZWQgZm9yIG1vZGlmaWNhdGlvbiBieSAlMyAlNCglNSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA4MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfSU5fQ0VSVF9JTl9QUk9HUkVTU19TVEFURTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgbG9ja2VkIGZvciBjZXJ0aWZpY2F0aW9uIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgxIgorICAgIH0KKworIy0tLS0tLS0tLS0tU1ZDNDA4Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX1NFTlRfRk9SX0NFUlRJRklDQVRJT046IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIHNlbnQgZm9yIGNlcnRpZmljYXRpb24gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENPTVBPTkVOVF9WRVJTSU9OX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZlcnNpb24gb2YgdGhpcyAlMSB3YXMgYWxyZWFkeSBwcm9tb3RlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgzIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdMKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlL3Byb2R1Y3QKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0FMUkVBRFlfQ0hFQ0tFRF9JTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiAnJTEnICUyIHdhcyBhbHJlYWR5IGNoZWNrZWQtaW4gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfQ0hFQ0tPVVRfQllfQU5PVEhFUl9VU0VSOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSAlMiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgb3V0IGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg1IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoCAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAgLSByZXNvdXJjZS9zZXJ2aWNlCisgICAgQ09NUE9ORU5UX0lOX1VTRTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgaW4gdXNlIGJ5IGFub3RoZXIgdXNlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg2IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC0gY29tcG9uZW50wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorICAgIENPTVBPTkVOVF9IQVNfTkVXRVJfVkVSU0lPTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQ2hlY2tpbmcgb3V0IG9mIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBvZiB0aGUgJyUxJyAlMiBpcyBub3QgYWxsb3dlZCBhcyBhIG5ld2VyIHZlcnNpb24gZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODciCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEwqBvZsKgbGFzdCBtb2RpZmllcgorICAgIENPTVBPTkVOVF9BTFJFQURZX0NFUlRJRklFRDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICUxICUyIGhhcyBhbHJlYWR5IGJlZW4gY2VydGlmaWVkIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorICAgIENPTVBPTkVOVF9OT1RfUkVBRFlfRk9SX0NFUlRJRklDQVRJT046IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBQUk9QRVJUWV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHByb3BlcnR5IHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoHByb3BlcnR5wqBuYW1lCisgICAgUFJPUEVSVFlfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUHJvcGVydHkgd2l0aCAnJTEnIG5hbWUgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMSIKKyAgICB9CisKKyMtLS0tLS0tLS0tLVNWQzQxMDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoGNhcGFiaWxpdHkgdHlwZSBuYW1lIAorICAgIENBUEFCSUxJVFlfVFlQRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBDYXBhYmlsaXR5IFR5cGUgd2l0aCBuYW1lICclMScgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTE0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQVVUSF9GQUlMRURfSU5WQUxJREVfSEVBREVSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIEF1dGhvcml6YXRpb24gaGVhZGVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgY2FwYWJpbGl0eSB0eXBlIG5hbWUgCisgICAgTUlTU0lOR19DQVBBQklMSVRZX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBDYXBhYmlsaXR5IFR5cGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE1IgorICAgIH0KKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9CQURfUkVRVUVTVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTYiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlMsKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlM8KgLcKgcmVxdWlyZW1lbnQgbmFtZQorICAgIFJFU09VUkNFX0lOU1RBTkNFX01BVENIX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWF0Y2ggbm90IGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2UgJyUxJyBhbmQgcmVzb3VyY2UgaW5zdGFuY2UgJyUyJyBmb3IgcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE3IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTLCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTPCoC3CoHJlcXVpcmVtZW50IG5hbWUKKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSBpbnN0YW5jZXMgJyUxJyBhbmQgJyUyJyBhcmUgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTLCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTPCoC3CoHJlcXVpcmVtZW50IG5hbWUKKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9SRUxBVElPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE5vIHJlbGF0aW9uIGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2VzICclMScgYW5kICclMicgZm9yIHJlcXVpcmVtZW50ICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDExOSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTIwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBVc2VyJ3MgVVNFUl9JRAorICAgIFVTRVJfSU5BQ1RJVkU6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgJTEgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIwIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoFVzZXIncyBVU0VSX0lECisgICAgVVNFUl9IQVNfQUNUSVZFX0VMRU1FTlRTOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIHdpdGggJTEgSUQgY2FuIG5vdCBiZSBkZWxldGVkIHNpbmNlIGl0IGhhcyBhY3RpdmUgZWxlbWVudHMocmVzb3VyY2VzL3NlcnZpY2VzL2FydGlmYWN0cykuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEyMSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTIyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBhcnRpZmFjdCB0eXBlCisgICAgQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGFydGlmYWN0IHR5cGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBUlRJRkFDVF9MT0dJQ0FMX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0IGxvZ2ljYWwgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIzIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX0FSVElGQUNUX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgYXJ0aWZhY3QgdHlwZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI0IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEtYXJ0aWZhY3QgbmFtZQorICAgIEFSVElGQUNUX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBcnRpZmFjdCAnJTEnIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMjYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdC8uLi4KKyMgJTLCoC0gZmllbGQgKHRhZywgdmVuZG9yIG5hbWUuLi4pCisgICAgSU5WQUxJRF9GSUVMRF9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICBJbnZhbGlkICUxICUyIGZvcm1hdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI2IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBUlRJRkFDVF9JTlZBTElEX01ENTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBhcnRpZmFjdCBjaGVja3N1bS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI3IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX0FSVElGQUNUX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gTWlzc2luZyBhcnRpZmFjdCBuYW1lLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfUFJPSkVDVF9DT0RFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgUFJPSkVDVF9DT0RFIG51bWJlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlZBTElEX1BST0pFQ1RfQ09ERTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBQUk9KRUNUX0NPREUgbnVtYmVyIG11c3QgYmUgbnVtZXJpYyBmcm9tIDUgdXAgdG8gMTAgZGlnaXRzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzAiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMS1yZXNvdXJjZS9zZXJ2aWNlCisjICUyLXNydGlmYWN0L2FydGlmYWN0cworIyAlMy1zZW1pY29sb21uIHNlcGFyYXRlZCBsaXN0IG9mIGFydGlmYWN0IAorICAgIENPTVBPTkVOVF9NSVNTSU5HX01BTkRBVE9SWV9BUlRJRkFDVFM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgbWFuZGF0b3J5IGluZm9ybWF0aW9uYWwgJTEgJTI6IFslM10uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzMSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTMyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbGlmZWN5Y2xlICB0eXBlIG5hbWUKKyAgICBMSUZFQ1lDTEVfVFlQRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBMaWZlY3ljbGUgVHlwZSB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTMyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBzZXJ2aWNlIHZlcnNpb24KKyMgJTIgLSBzZXJ2aWNlIG5hbWUKKyAgICBTRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVmVyc2lvbiAlMSBvZiAnJTInIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzdHJpYnV0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzMiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfTElGRUNZQ0xFX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBpbnRlcmZhY2UgbGlmZS1jeWNsZSB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9DQVRFR09SWV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU2VydmljZSBjYXRlZ29yeSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSBzZXJ2aWNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCBuYW1lICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfQVZBSUxBQkxFOiB7CisgICAgICAgIGNvZGU6IDUwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIGVudmlyb25tZW50ICclMScgaXMgbm90IGF2YWlsYWJsZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCBuYW1lICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gZW52aXJvbm1lbnQgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzciCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9JTlZBTElEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyMgJTEgLSBzZXJ2aWNlIG5hbWUKKyAgICBESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTZXJ2aWNlICclMScgY2Fubm90IGJlIGRpc3RyaWJ1dGVkIGR1ZSB0byBtaXNzaW5nIGRlcGxveW1lbnQgYXJ0aWZhY3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQyMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorIyAlMiAtIG1heCBpY29uIG5hbWUgbGVuZ3RoICAgCisgICAgQ09NUE9ORU5UX0lDT05fRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBpY29uIG5hbWUgZXhjZWVkcyBsaW1pdCBvZiAlMiBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQyMDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQzMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTVFJJQ1RFRF9BQ0NFU1M6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc3RyaWN0ZWQgYWNjZXNzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQzMDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQzMDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTVFJJQ1RFRF9PUEVSQVRJT046IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc3RyaWN0ZWQgb3BlcmF0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQzMDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIE1JU1NJTkdfQk9EWTogeworICAgICAgICBjb2RlOiA0MDAgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nIHJlcXVlc3QgYm9keS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTUlTU0lOR19QVUJMSUNfS0VZOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICdhcGlQdWJsaWNLZXknLiIgLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBESVNUUklCVVRJT05fRU5WX0RPRVNfTk9UX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgIEJvZHkgIDogTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICdkaXN0ckVudk5hbWUnLiIgLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ1MDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBzZXJ2aWNlIG5hbWUKKyAgICBTRVJWSUNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgc2VydmljZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDMiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUwNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gc2VydmljZS9yZXNvdXJjZSB2ZXJzaW9uCisgICAgQ09NUE9ORU5UX1ZFUlNJT05fTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSB2ZXJzaW9uICUyIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwNCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0NTA1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyUxLWFydGlmYWN0IG5hbWUKKyAKKyAgICBBUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICclMScgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfRU5WX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgJ2Rpc3RyRW52TmFtZScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUwNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfSU5WQUxJRF9UQUdTX05PX0NPTVBfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBPbmUgb2YgdGhlIHRhZ3Mgc2hvdWxkIGJlIHRoZSBjb21wb25lbnQgbmFtZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA3IgorICAgIH0KKyAKKyMtLS0tLS0tLS1TVkM0NTA4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFNFUlZJQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU2VydmljZSBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHNlcnZpY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDgiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUwOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0lDT05fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEljb24gY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgc2VydmljZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBpY29uIG5hbWUgbWF4IGxlbmd0aAorICAgIFNFUlZJQ0VfSUNPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEljb24gbmFtZSBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBESVNUUklCVVRJT05fUkVRVUVTVEVEX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gRGlzdHJpYnV0aW9uIElECisgICAgRElTVFJJQlVUSU9OX1JFUVVFU1RFRF9GQUlMRUQ6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gJyUxJyBmYWlsZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9DQVRFR09SWV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgY2F0ZWdvcnkgY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgcmVzb3VyY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9JQ09OX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJY29uIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX1ZFTkRPUl9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBWZW5kb3IgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9ERVJJVkVEX0ZST01fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IERlcml2ZWQgZnJvbSByZXNvdXJjZSB0ZW1wbGF0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBtYXggbGVuZ3RoIAorICAgIENPTVBPTkVOVF9TSU5HTEVfVEFHX0VYQ0VFRF9MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBTaW5nbGUgdGFnIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfREVGQVVMVF9WQUxVRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogbWlzbWF0Y2ggaW4gZGF0YS10eXBlIG9jY3VycmVkIGZvciBwcm9wZXJ0eSAlMS4gZGF0YSB0eXBlIGlzICUyIGFuZCBkZWZhdWx0IHZhbHVlIGZvdW5kIGlzICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZSBvciByZXNvdXJjZSAKKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX01BWF9OVU1CRVJfUkVBQ0hFRDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWF4aW1hbCBudW1iZXIgb2YgYWRkaXRpb25hbCAlMSBwYXJhbWV0ZXJzIHdhcyByZWFjaGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX0VNUFRZX1NUUklOR19OT1RfQUxMT1dFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsYWJlbCBhbmQgdmFsdWUgY2Fubm90IGJlIGVtcHR5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gbGFiZWwvdmFsdWUKKyMgJTIgLSBNYXhpbWFsIGxlbmd0aCBvZiAlMQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uICUxIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTIyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9LRVlfTk9UX0FMTE9XRURfQ0hBUkFDVEVSUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBDb250ZW50LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxhYmVsIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9WQUxVRV9OT1RfQUxMT1dFRF9DSEFSQUNURVJTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gY29udGFpbnMgbm9uLWVuZ2xpc2ggY2hhcmFjdGVycy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcmVzb3VyY2UgaW5zdGFuY2Ugd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEFTRENfVkVSU0lPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEFTREMgdmVyc2lvbiBjYW5ub3QgYmUgZGlzcGxheWVkLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxLWFydGlmYWN0IHVybC9hcnRpZmFjdCBsYWJlbC9hcnRpZmFjdCBkZXNjcmlwdGlvbi9WTkYgU2VydmljZSBJbmRpY2F0b3IKKyAgICBNSVNTSU5HX0RBVEE6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gTWlzc2luZyAlMS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMS1hcnRpZmFjdCB1cmwvYXJ0aWZhY3QgbGFiZWwvYXJ0aWZhY3QgZGVzY3JpcHRpb24vYXJ0aWZhY3QgbmFtZQorIyAlMiAtIE1heGltYWwgbGVuZ3RoIG9mICUxCisgICAgRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBBUlRJRkFDVF9JTlZBTElEX1RJTUVPVVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgVGltZW91dCBzaG91bGQgYmUgc2V0IHRvIHZhbGlkIHBvc2l0aXZlIG5vbi16ZXJvIG51bWJlciBvZiBtaW51dGVzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9JU19WTkZfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZORiBJbmRpY2F0b3IgY2Fubm90IGJlIHVwZGF0ZWQgZm9yIGNlcnRpZmllZCBzZXJ2aWNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzEiCisgICAgfQorICMtLS0tLS0tLS1TVkM0NTMyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORF9PTl9TRVJWSUNFOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyByZXNvdXJjZSBpbnN0YW5jZSB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2aWNlICclMi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTMyIgorICAgIH0KKyAjLS0tLS0tLS0tU1ZDNDUzMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAjICUxIC0gICJIRUFUIi8iSEVBVF9FTlYiLyJNVVJBTk9fUEtHIi8iWUFOR19YTUwiIAorICAgIFdST05HX0FSVElGQUNUX0ZJTEVfRVhURU5TSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGZvciAlMSBhcnRpZmFjdCB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzMiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAgIkhFQVQiLyJIRUFUX0VOViIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9ZQU1MOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVcGxvYWRlZCBZQU1MIGZpbGUgZm9yICUxIGFydGlmYWN0IGlzIGludmFsaWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTM1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSEVBVCIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9ERVBMT1lNRU5UX0FSVElGQUNUX0hFQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorIyAlMiAtICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgCisjICUzIC0gICJIRUFUIi8iSEVBVF9FTlYiLyJNVVJBTk9fUEtHIiAKKyMgJTQgLSAgIkhFQVQiLyJIRUFUX0VOViIvIk1VUkFOT19QS0cKKyAgICBERVBMT1lNRU5UX0FSVElGQUNUX09GX1RZUEVfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICclMicgYWxyZWFkeSBoYXMgYSBkZXBsb3ltZW50IGFydGlmYWN0IG9mICUzIHR5cGUgLlBsZWFzZSBkZWxldGUgb3IgdXBkYXRlIGFuIGV4aXN0aW5nICU0IGFydGlmYWN0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzYiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUzNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX0hFQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgSEVBVCBhcnRpZmFjdC4gSEVBVF9FTlYgYXJ0aWZhY3QgY2Fubm90IGJlIHVwbG9hZGVkIHdpdGhvdXQgY29ycmVzcG9uZGluZyBIRUFUIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTTUFUQ0hfSEVBVF9WU19IRUFUX0VOVjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBhcnRpZmFjdCBjb250ZW50LiBQYXJhbWV0ZXIncyBzZXQgaW4gSEVBVF9FTlYgJyUxJyBhcnRpZmFjdCBkb2Vzbid0IG1hdGNoIHRoZSBwYXJhbWV0ZXJzIGluIEhFQVQgJyUyJyBhcnRpZmFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTM4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTM5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfUkVTT1VSQ0VfUEFZTE9BRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBwYXlsb2FkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9UT1NDQV9GSUxFX0VYVEVOU0lPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBmaWxlIGV4dGVuc2lvbiBmb3IgVE9TQ0EgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1lBTUxfRklMRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBZQU1MIGZpbGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1RPU0NBX1RFTVBMQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIFRPU0NBIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTk9UX1JFU09VUkNFX1RPU0NBX1RFTVBMQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBTZXJ2aWNlIFRPU0NBIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTk9UX1NJTkdMRV9SRVNPVVJDRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgVE9TQ0EgdGVtcGxhdGUgc2hvdWxkIGNvbnRhaW4gb25lIHJlc291cmNlIGRlZmluaXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1JFU09VUkNFX05BTUVTUEFDRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBuYW1lc3BhY2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gQVNEQyBDYXRhbG9nLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9SRVNPVVJDRV9DSEVDS1NVTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBjaGVja3N1bS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQ5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICMlMcKgIC3CoCBDb25zdW1lciBzYWx0CisgICAgSU5WQUxJRF9MRU5HVEg6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgbGVuZ3RoLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTAiCisgICAgfQorICAgICMtLS0tLS0tLS1TVkM0NTUxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICAjJTHCoCAtwqAgRUNPTVAgVXNlciBuYW1lCisgICAgRUNPTVBfVVNFUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEVDT01QIFVzZXIgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDT05TVU1FUl9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRUNPTVAgVXNlciBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTUyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTUzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjJTHCoCAtwqAgQ29uc3VtZXIgbmFtZSAvIENvbnN1bWVyIHBhc3N3b3JkLyBDb25zdW1lciBzYWx0IAorICAgIElOVkFMSURfQ09OVEVOVF9QQVJBTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTUzIgorICAgIH0KKyAgICAjLS0tLS0tLS0tU1ZDNDU1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorICAgIENPTVBPTkVOVF9BUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBhcnRpZmFjdCBkb2Vzbid0IGJlbG9uZyB0byBzcGVjaWZpZWQgJTEuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJTZXJ2aWNlIG5hbWUiCisgICAgU0VSVklDRV9ERVBMT1lNRU5UX0FSVElGQUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgc2VydmljZSBpcyBub3QgcmVhZHkgZm9yIGNlcnRpZmljYXRpb24uIFNlcnZpY2UgaGFzIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGRlcGxveW1lbnQgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IgorICAgIENPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEg6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgJTIgbmFtZSBsZW5ndGguIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IgorICAgIENPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgJTIgbmFtZSBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0NBVEVHT1JZX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBjYXRlZ29yeSBuYW1lICclMicgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJzZXJ2aWNlIi8iVkYiCisjICUyIC0gIlJlc291cmNlIG5hbWUiCisgICAgVkFMSURBVEVEX1JFU09VUkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBGT1VORF9BTFJFQURZX1ZBTElEQVRFRF9SRVNPVVJDRTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4gUGxlYXNlIHVzZSBhbHJlYWR5IGF2YWlsYWJsZSB2YWxpZGF0ZWQgcmVzb3VyY2UgdmVyc2lvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTYwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBGT1VORF9MSVNUX1ZBTElEQVRFRF9SRVNPVVJDRVM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFN1Ym1pdCBmb3IgVGVzdGluZyBpcyBub3QgcGVybWl0dGVkIGFzIHlvdXIgJyUxJyBpbmNsdWRlcyBub24tdmFsaWRhdGVkICclMicgcmVzb3VyY2UuIFBsZWFzZSB1c2Ugb25lIG9mIGF2YWlsYWJsZSB2YWxpZGF0ZWQgcmVzb3VyY2UgdmVyc2lvbnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2MCIKKyAgICB9ICAKKyMtLS0tLS0tLS1TVkM0NTYxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInJlc291cmNlIi8icHJvZHVjdCIKKyMgJTIgLSAiY2F0ZWdvcnkiCisjICUzIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICUxICUyICclMycgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTYxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTYyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gIlJlc291cmNlIi8iUHJvZHVjdCIKKyMgJTIgLSAic3ViLWNhdGVnb3J5IG5hbWUiCisjICUzIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9FWElTVFNfRk9SX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBzdWItY2F0ZWdvcnkgJyUyJyBhbHJlYWR5IGV4aXN0cyB1bmRlciAnJTMnIGNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiUHJvZHVjdCIKKyMgJTIgLSAiZ3JvdXBpbmcgbmFtZSIKKyMgJTMgLSAic3ViLWNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0dST1VQSU5HX0VYSVNUU19GT1JfU1VCX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBncm91cGluZyAnJTInIGFscmVhZHkgZXhpc3RzIHVuZGVyICclMycgc3ViLWNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIHByb2R1Y3TCoG5hbWUKKyAgICBQUk9EVUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcHJvZHVjdCB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIkhFQVQiICAgCisjICUyICAtIHBhcmFtZXRlciB0eXBlICgic3RyaW5nIiAsICJib29sZWFuIiAsICJudW1iZXIiKSAKKyMgJTMgLSAgcGFyYW1ldGVyIG5hbWUKKyAgICBJTlZBTElEX0hFQVRfUEFSQU1FVEVSX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkICUxIGFydGlmYWN0LiBJbnZhbGlkICUyIHZhbHVlIHNldCBmb3IgJyUzJyBwYXJhbWV0ZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiSEVBVCIgICAKKyMgJTIgIC0gcGFyYW1ldGVyIHR5cGUgKCJzdHJpbmciICwgImJvb2xlYW4iICwgIm51bWJlciIpIAorICAgIElOVkFMSURfSEVBVF9QQVJBTUVURVJfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSBhcnRpZmFjdC4gVW5zdXBwb3J0ZWQgJyUyJyBwYXJhbWV0ZXIgdHlwZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiWUFOR19YTUwiICAgICAgICAgICAgIAorICAgIElOVkFMSURfWE1MOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVcGxvYWRlZCBYTUwgZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJVc2VyIE5hbWUgYW5kIFVzZXJJZCIgICAKKyMgJTIgIC0iY2hlY2tlZC1vdXQiLyJpbi1jZXJ0aWZpY2F0aW9uIgorICAgIENBTk5PVF9ERUxFVEVfVVNFUl9XSVRIX0FDVElWRV9FTEVNRU5UUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXNlciBjYW5ub3QgYmUgZGVsZXRlZC4gVXNlciAnJTEnIGhhcyAlMiBwcm9qZWN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJVc2VyIE5hbWUgYW5kIFVzZXJJZCIgICAKKyMgJTIgIC0iY2hlY2tlZC1vdXQiLyJpbi1jZXJ0aWZpY2F0aW9uIgorICAgIENBTk5PVF9VUERBVEVfVVNFUl9XSVRIX0FDVElWRV9FTEVNRU5UUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUm9sZSBjYW5ub3QgYmUgY2hhbmdlZC4gVXNlciAnJTEnIGhhcyAlMiBwcm9qZWN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFVQREFURV9VU0VSX0FETUlOX0NPTkZMSUNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBbiBhZG1pbmlzdHJhdG9yIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBoaXMvaGVyIHJvbGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0NBTk5PVF9DT05UQUlOX1NVQkNBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTdWIgY2F0ZWdvcnkgY2Fubm90IGJlIGRlZmluZWQgZm9yIHNlcnZpY2UiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisgICAgQ09NUE9ORU5UX1RPT19NVUNIX0NBVEVHT1JJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIG11c3QgaGF2ZSBvbmx5IDEgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX1RPT19NVUNIX1NVQkNBVEVHT1JJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc291cmNlIG11c3QgaGF2ZSBvbmx5IDEgc3ViIGNhdGVnb3J5IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19TVUJDQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBzdWIgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc1IgorICAgIH0KKyAjLS0tLS0tLS0tU1ZDNDU3Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiY29tcG9uZW50IHR5cGUiCisgICAgVU5TVVBQT1JURURfRVJST1I6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgOiBSZXF1ZXN0ZWQgY29tcG9uZW50IHR5cGUgJTEgaXMgdW5zdXBwb3J0ZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NiIKKyAgICB9CisgICAgIy0tLS0tLS0tLVNWQzQ1NzctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gInJlc291cmNlIHR5cGUiCisgICAgUkVTT1VSQ0VfQ0FOTk9UX0NPTlRBSU5fUkVTT1VSQ0VfSU5TVEFOQ0VTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yIDogUmVzb3VyY2Ugb2YgdHlwZSAlMSBjYW5ub3QgY29udGFpbiByZXNvdXJjZSBpbnN0YW5jZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorIyAlMiAtICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgCisjICUzIC0gICJhcnRpZmFjdCBuYW1lIiAKKyAgICBERVBMT1lNRU5UX0FSVElGQUNUX05BTUVfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICclMicgYWxyZWFkeSBoYXMgYSBkZXBsb3ltZW50IGFydGlmYWN0IG5hbWVkICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3OCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiQ2F0ZWdvcnkiLyJTdWItQ2F0ZWdvcnkiLyJHcm91cCIKKyMgJTIgLSAgY2F0ZWdvcnkvc3ViLWNhdGVnb3J5L2dyb3VwaW5nIG5hbWUuCisgICAgSU5WQUxJRF9HUk9VUF9BU1NPQ0lBVElPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBncm91cCBhc3NvY2lhdGlvbi4gJTEgJyUyJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgRU1QVFlfUFJPRFVDVF9DT05UQUNUU19MSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIEF0IGxlYXN0IG9uZSBQcm9kdWN0IENvbnRhY3QgaGFzIHRvIGJlIHNwZWNpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTgxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHVzZXJJZAorICAgIElOVkFMSURfUFJPRFVDVF9DT05UQUNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIFVzZXIgJyUxJyBjYW5ub3QgYmUgc2V0IGFzIFByb2R1Y3QgQ29udGFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTgyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFByb2R1Y3QKKyMgJTIgLSAiYWJicmV2aWF0ZWQiLyJmdWxsIgorICAgIE1JU1NJTkdfT05FX09GX0NPTVBPTkVOVF9OQU1FUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBNaXNzaW5nICUxICUyIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4MiIKKyAgICB9ICAgIAorIy0tLS0tLS0tLVNWQzQ1ODMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiSWNvbiIKKyMgJTIgLSAicmVzb3VyY2UiLyJzZXJ2aWNlIi8icHJvZHVjdCIKKyAgICBDT01QT05FTlRfUEFSQU1FVEVSX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSAlMiBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAgLSBzZXJ2aWNlL1ZGIG5hbWUgCisjICUyIC0gInNlcnZpY2UiIC8iVkYiCisjICUzIC0gIHJlc291cmNlIGluc3RhbmNlIG9yaWdpbiB0eXBlCisjICU0IC0gIHJlc291cmNlIGluc3RhbmNlIG5hbWUgCisjICU1IC0gIHJlcXVpcmVtZW50L2NhcGFiaWxpdHkKKyMgJTYgLSAgcmVxdWlyZW1lbnQvY2FwYWJpbGl0eSBuYW1lCisjICU3IC0gICJmdWxmaWxsZWQiIChmb3IgcmVxKS8iY29uc3VtZWQgKGZvciBjYXApIgorICAgIFJFUV9DQVBfTk9UX1NBVElTRklFRF9CRUZPUkVfQ0VSVElGSUNBVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogIFJlcXVlc3RlZCAnJTEnICUyIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4gICUzICclNCcgaGFzIHRvIGhhdmUgJTUgJyU2JyAlNy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfT0NDVVJSRU5DRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgb2NjdXJyZW5jZXMgZm9ybWF0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjLS0tLS0tLS0tU1ZDNDU4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1NFUlZJQ0VfQVBJX1VSTDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBTZXJ2aWNlIEFQSSBVUkwuIFBsZWFzZSBjaGVjayB3aGV0aGVyIHlvdXIgVVJMIGhhcyBhIHZhbGlkIGRvbWFpbiBleHRlbnNpb24gYW5kIGRvZXMgbm90IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIC0gIz8mQCUrOyw9JDw+fl5gXFtde318IiohJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUgCisgICAgREFUQV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IERhdGEgdHlwZSAlMSBhbHJlYWR5IGV4aXN0cy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfTk9SX1BST1BFUlRJRVNfTkVJVEhFUl9ERVJJVkVEX0ZST006IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgRGF0YSB0eXBlICUxLiBEYXRhIHR5cGUgbXVzdCBoYXZlIGVpdGhlciBhIHZhbGlkIGRlcml2ZWQgZnJvbSBkZWNsYXJhdGlvbiBvciBhdCBsZWFzdCBvbmUgdmFsaWQgcHJvcGVydHknLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfUFJPUEVSVElFU19DQU5OT1RfQkVfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgRGF0YSB0eXBlICUxLiAncHJvcGVydGllcycgcGFyYW1ldGVyIGNhbm5vdCBiZSBlbXB0eSBpZiBwcm92aWRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBQcm9wZXJ0eSB0eXBlIG5hbWUgCisjICUyICAtIFByb3BlcnR5IG5hbWUKKyAgICBJTlZBTElEX1BST1BFUlRZX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgUHJvcGVydHkgdHlwZSAlMSBpbiBwcm9wZXJ0eSAlMi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTkwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBQcm9wZXJ0eSBpbm5lciB0eXBlCisjICUyICAtIFByb3BlcnR5IG5hbWUgCisgICAgSU5WQUxJRF9QUk9QRVJUWV9JTk5FUl9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHByb3BlcnR5IGlubmVyIHR5cGUgJTEsIGluIHByb3BlcnR5ICUyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gY29tcG9uZW50IGluc3RhbmNlIG5hbWUKKyMgJTIgIC0gInJlc291cmNlIGluc3RhbmNlIi8ic2VydmljZSBpbnN0YW5jZSIKKyAgICBDT01QT05FTlRfSU5TVEFOQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gY29tcG9uZW50IGluc3RhbmNlIG5hbWUKKyMgJTIgLSAicmVzb3VyY2UgaW5zdGFuY2UiLyJzZXJ2aWNlIGluc3RhbmNlIgorIyAlMyAtICJyZXNvdXJjZS8ic2VydmljZSIvInByb2R1Y3QiCisjICU0IC0gY29udGFpbmVyIG5hbWUgCisgICAgQ09NUE9ORU5UX0lOU1RBTkNFX05PVF9GT1VORF9PTl9DT05UQUlORVI6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIHdhcyBub3QgZm91bmQgb24gdGhlICUzICclNCcuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxIC0gcmVxdWlyZW1lbnQgLyBjYXBhYmlsaXR5CisjJTIgLSByZXF1aXJlbWVudCBuYW1lCisgICAgSU1QT1JUX0RVUExJQ0FURV9SRVFfQ0FQX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEltcG9ydGVkIFRPU0NBIHRlbXBsYXRlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgJTEgbmFtZWQgJyUyJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTEgLSByZXF1aXJlbWVudCAvIGNhcGFiaWxpdHkKKyMlMiAtIHJlcXVpcmVtZW50IG5hbWUKKyMlMyAtIHBhcmVudCBjb250YWluaW5nIHRoZSByZXF1aXJlbWVudCAKKyAgICBJTVBPUlRfUkVRX0NBUF9OQU1FX0VYSVNUU19JTl9ERVJJVkVEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBUT1NDQSB0ZW1wbGF0ZSBjb250YWlucyAlMSAnJTInIHRoYXQgaXMgYWxyZWFkeSBkZWZpbmVkIGJ5IGRlcml2ZWQgdGVtcGxhdGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfREVSSVZFRF9JU19NSVNTSU5HOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBhbmNlc3RvciBkYXRhIHR5cGUgJTEgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzeXN0ZW0uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyMgJTIgIC0gUHJvcGVydHkgbmFtZXMKKyAgICBEQVRBX1RZUEVfUFJPUEVSVFlfQUxSRUFEWV9ERUZJTkVEX0lOX0FOQ0VTVE9SOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgcHJvcGVydGllcyBuYW1lZCAlMiB3aGljaCBhcmUgYWxyZWFkeSBkZWZpbmVkIGluIG9uZSBvZiBpdHMgYW5jZXN0b3JzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisgICAgREFUQV9UWVBFX0RVUExJQ0FURV9QUk9QRVJUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZGF0YSB0eXBlICUxIGNvbnRhaW5zIGR1cGxpY2F0ZSBwcm9wZXJ0eS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZQorIyAlMiAgLSBQcm9wZXJ0eSBuYW1lcworICAgIERBVEFfVFlQRV9QUk9FUFJUWV9DQU5OT1RfSEFWRV9TQU1FX1RZUEVfT0ZfREFUQV9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgcHJvcGVydGllcyAlMiB3aGljaCB0aGVpciB0eXBlIGlzIHRoaXMgZGF0YSB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisgICAgREFUQV9UWVBFX0NBTk5PVF9IQVZFX1BST1BFUlRJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGRhdGEgdHlwZSAlMSBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzIHNpbmNlIGl0IGlzIG9mIHR5cGUgc2NhbGFyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBOT1RfVE9QT0xPR1lfVE9TQ0FfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIHlhbWwgZmlsZSAlMSBjYW5ub3QgYmUgbW9kZWxlZCB0byBWRiBhcyBpdCBkb2VzIG5vdCBjb250YWluICd0b3BvbG9neV90ZW1wbGF0ZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjAxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSB5YW1sIGZpbGUgbmFtZQorIyAlMiAtIG5vZGVfdGVtcGxhdGUgbGFiZWwKKyMgJTMgLSBub2RlX3RlbXBsYXRlIHR5cGUKKyAgICBJTlZBTElEX05PREVfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIHlhbWwgZmlsZSAnJTEnIGNvbnRhaW5zIG5vZGVfdGVtcGxhdGUgJyUyJyBvZiB0eXBlICclMycgdGhhdCBkb2VzIG5vdCByZXByZXNlbnQgZXhpc3RpbmcgVkZDL0NQL1ZMIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjb21wb25lbnQgdHlwZQorIyAlMsKgLSBjb21wb25lbnTCoG5hbWUKKyMgJTPCoC0gc3RhdGUKKyAgICBJTExFR0FMX0NPTVBPTkVOVF9TVEFURTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQ29tcG9uZW50IGluc3RhbmNlIG9mICUxIGNhbiBub3QgYmUgY3JlYXRlZCBiZWNhdXNlIHRoZSBjb21wb25lbnQgJyUyJyBpcyBpbiBhbiBpbGxlZ2FsIHN0YXRlICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyAgICBDU0FSX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIENTQVIgJyUxJyBpcyBpbnZhbGlkLiAnVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YScgZmlsZSBtdXN0IGJlIHByb3ZpZGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyAgICBDU0FSX0lOVkFMSURfRk9STUFUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUT1NDQSBDU0FSICclMScgaXMgaW52YWxpZC4gSW52YWxpZCAnVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YScgZmlsZSBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBwcm9wZXJ0eSBuYW1lCisjICUywqAtIHByb3BlcnR5IHR5cGUKKyMgJTMgLSBwcm9wZXJ0eSBpbm5lclR5cGUKKyMgJTTCoC0gZGVmYXVsdCB2YWx1ZSBpcworICAgIElOVkFMSURfQ09NUExFWF9ERUZBVUxUX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgb2YgcHJvcGVydHkgJTEuIERhdGEgdHlwZSBpcyAlMiB3aXRoIGlubmVyIHR5cGUgJTMgYW5kIGRlZmF1bHQgdmFsdWUgZm91bmQgaXMgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIENTQVJfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUT1NDQSBDU0FSICclMScgaXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBjb21wb25lbnQgdHlwZQorIyAlMyAtIGFjdHVhbCBjb21wb25lbnQgdHlwZQorICAgIE1JU01BVENIX0JFVFdFRU5fQVJUSUZBQ1RfVFlQRV9BTkRfQ09NUE9ORU5UX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICUxIGlzIG9ubHkgY29tcGF0aWJsZSB3aXRoIGNvbXBvbmVudCBvZiB0eXBlICUyLCBidXQgY29tcG9uZW50IHR5cGUgaXMgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwOCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NjA5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSU5WQUxJRF9KU09OIiAgICAgICAgICAgICAKKyAgICBJTlZBTElEX0pTT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVwbG9hZGVkIEpTT04gZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjEwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGNzYXIgZmlsZSBuYW1lCisjICUywqAtwqBtaXNzaW5nIGZpbGUgbmFtZQorICAgIFlBTUxfTk9UX0ZPVU5EX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgLSBUT1NDQSBDU0FSICUxIGlzIGludmFsaWQuIFRPU0NBLU1ldGFkYXRhL1Rvc2NhLm1ldGEgcmVmZXJzIHRvIGZpbGUgJTIgdGhhdCBpcyBub3QgcHJvdmlkZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gZ3JvdXAgbmFtZQorICAgIEdST1VQX01FTUJFUl9FTVBUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBHcm91cCAlMSBtZW1iZXIgbGlzdCB3YXMgcHJvdmlkZWQgYnV0IGRvZXMgbm90IGhhdmUgdmFsdWVzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gZ3JvdXAgbmFtZSAKKyAgICBHUk9VUF9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEdyb3VwIHR5cGUgJTEgYWxyZWFkeSBleGlzdHMuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cCBuYW1lCisjICUywqAtIFZGIG5hbWUoY29tcG9uZW50IG5hbWUpCisjICUzIC0gYWN0dWFsIGNvbXBvbmVudCB0eXBlIFtWRl0KKyAgICBHUk9VUF9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBHcm91cCB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cyBpbiAlMiAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjEzIgorICAgIH0gICAKKyMtLS0tLS0tLS1TVkM0NjE0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGdyb3VwIHR5cGUKKyAgICBHUk9VUF9UWVBFX0lTX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gR3JvdXAgdHlwZSAlMSBkb2VzIG5vdCBleGlzdCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXAgbmFtZQorICAgIEdST1VQX01JU1NJTkdfR1JPVVBfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIEdyb3VwIFR5cGUgZm9yIGdyb3VwICclMSciLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWVtYmVyIG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gVkYgbmFtZQorIyAlNCAtIGNvbXBvbmVudCB0eXBlIFtWRiBdCisgICAgR1JPVVBfSU5WQUxJRF9DT01QT05FTlRfSU5TVEFOQ0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IG1lbWJlciAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IHBhcnQgb2YgJTMgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNiIKKyAgICB9ICAgICAgICAgICAgICAgICAKKyMtLS0tLS0tLS1TVkM0NjE3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWVtYmVyIG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gZ3JvdXAgdHlwZQorICAgIEdST1VQX0lOVkFMSURfVE9TQ0FfTkFNRV9PRl9DT01QT05FTlRfSU5TVEFOQ0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IG1lbWJlciAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IHBhcnQgb2YgYWxsb3dlZCBtZW1iZXJzIG9mIGdyb3VwIHR5cGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC3CoG1pc3NpbmcgZmlsZSBuYW1lCisjICUywqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIEFSVElGQUNUX05PVF9GT1VORF9JTl9DU0FSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBhcnRpZmFjdCAlMSBpcyBkZWZpbmVkIGluIENTQVIgJTIgbWFuaWZlc3QgYnV0IGlzIG5vdCBwcm92aWRlZCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIGFydGlmYWN0IG5hbWUKKyMgJTLCoC3CoGFydGlmYWN0IHR5cGUKKyMgJTMgLSBleGlzdGluZyBhcnRpZmFjdCB0eXBlCisgICAgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX0RJRkZFUkVOVF9UWVBFX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGluIHR5cGUgJTIgYWxyZWFkeSBleGlzdHMgaW4gdHlwZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjIwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEZBSUxFRF9SRVRSSVZFX0FSVElGQUNUU19UWVBFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRmFpbGVkIHRvIHJldHJpZXZlIGxpc3Qgb2Ygc3Vwb3J0ZWQgYXJ0aWZhY3QgdHlwZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBtYXN0ZXIgCisgICAgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX01BU1RFUl9JTl9DU0FSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBhcnRpZmFjdCAlMSBhbHJlYWR5IGV4aXN0cyBpbiBtYXN0ZXIgJTIgLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIGFydGlmYWN0IG5hbWUKKyMgJTLCoC0gYXJ0aWZhY3QgdHlwZSAKKyMgJTPCoC0gbWFzdGVyIG5hbWUKKyMgJTQgLSBtYXN0ZXIgdHlwZQorICAgIEFSVElGQUNUX05PVF9WQUxJRF9JTl9NQVNURVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGluIHR5cGUgJTIgY2FuIG5vdCBiZSBleGlzdHMgdW5kZXIgbWFzdGVyICUzIGluIHR5cGUgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBhcnRpZmFjdCB0eXBlIAorIyAlM8KgLSBlbnYgbmFtZQorIyAlNCAtIGV4aXN0aW5nIGVudgorICAgIEFSVElGQUNUX05PVF9WQUxJRF9FTlY6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICUxIGluIHR5cGUgJTIgd2l0aCBlbnYgJTMgYWxyZWFkeSBleGlzdHMgd2l0aCBhbm90aGVyIGVudiAlNCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXBzIG5hbWVzCisjICUyIC0gVkYgbmFtZQorIyAlMyAtIGNvbXBvbmVudCB0eXBlIFtWRiBdCisgICAgR1JPVVBfSVNfTUlTU0lORzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZ3JvdXBzICclMScgY2Fubm90IGJlIGZvdW5kIHVuZGVyICUyICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXBzIG5hbWUKKyAgICBHUk9VUF9BUlRJRkFDVF9BTFJFQURZX0FTU09DSUFURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGdyb3VwICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cHMgbmFtZQorICAgIEdST1VQX0FSVElGQUNUX0FMUkVBRFlfRElTU09DSUFURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgYWxyZWFkeSBkaXNzb2NpYXRlZCBmcm9tIGdyb3VwICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHByb3BlcnR5IG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gZ3JvdXAgdHlwZSBuYW1lCisgICAgR1JPVVBfUFJPUEVSVFlfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBwcm9wZXJ0eSAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IGV4aXN0IGluIGdyb3VwIHR5cGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gY3NhclVVSUQKKyMgJTIgLSBWRiBuYW1lCisgICAgVlNQX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgVlNQIHdpdGggVVVJRCAlMSB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmb3IgVkYgJTIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBvciB1cGRhdGUgdGhlIGV4aXN0aW5nIFZGLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMSAtIFZGIG5hbWUKKyAgICBNSVNTSU5HX0NTQVJfVVVJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIENzYXIgVVVJRCBvciBwYXlsb2FkIG5hbWUgaXMgbWlzc2luZyBmb3IgVkYgJTEuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gVkYgbmFtZQorIyAlMiAtIG5ldyBjc2FyVVVJRAorIyAlMyAtIG9sZCBjc2FyVVVJRAorICAgIFJFU09VUkNFX0xJTktFRF9UT19ESUZGRVJFTlRfVlNQOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSAlMSBjYW5ub3QgYmUgdXBkYXRlZCB1c2luZyBDc2FyVVVJRCAlMiBzaW5jZSB0aGUgcmVzb3VyY2UgaXMgbGlua2VkIHRvIGEgZGlmZmVyZW50IFZTUCB3aXRoIGNzYXJVVUlEICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIHBvbGljeSBuYW1lIAorICAgIFBPTElDWV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFBvbGljeSB0eXBlICUxIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSB0YXJnZXQgbmFtZQorIyAlMiAtIHBvbGljeSB0eXBlIG5hbWUKKyAgICBUQVJHRVRTX05PTl9WQUxJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogdGFyZ2V0ICUxIGxpc3RlZCBpbiBwb2xpY3kgdHlwZSAlMiBpcyBub3QgYSBncm91cCBvciByZXNvdXJjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjMyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gcG9saWN5IG5hbWUKKyAgICBUQVJHRVRTX0VNUFRZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFBvbGljeSAlMSB0YXJnZXQgbGlzdCB3YXMgcHJvdmlkZWQgYnV0IGRvZXMgbm90IGhhdmUgdmFsdWVzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIERBVEFfVFlQRV9DQU5OT1RfQkVfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IERhdGEgdHlwZXMgYXJlIGVtcHR5LiBQbGVhc2UgaW1wb3J0IHRoZSBkYXRhIHR5cGVzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBjc2FyIHV1aWQKKyAgICBSRVNPVVJDRV9GUk9NX0NTQVJfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiByZXNvdXJjZSBmcm9tIGNzYXIgdXVpZCAlMSBub3QgZm91bmQiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfQ0FOTk9UX0JFX1VQREFURURfQkFEX1JFUVVFU1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IERhdGEgdHlwZSAlMSBjYW5ub3QgYmUgdXBncmFkZWQuIFRoZSBuZXcgZGF0YSB0eXBlIGRvZXMgbm90IGNvbnRhaW4gb2xkIHByb3BlcnRpZXMgb3IgdGhlIHR5cGUgb2Ygb25lIG9mIHRoZSBwcm9wZXJ0aWVzIGhhcyBiZWVuIGNoYW5nZWQuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzNiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0NjM3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoGF0dHJpYnV0ZcKgbmFtZQorICAgIEFUVFJJQlVURV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIGF0dHJpYnV0ZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzciCisgICAgfSAgICAKKyMtLS0tLS0tLS0tLVNWQzQ2MzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgYXR0cmlidXRlwqBuYW1lCisgICAgQVRUUklCVVRFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEF0dHJpYnV0ZSB3aXRoICclMScgbmFtZSBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjM4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ2MzktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBQUk9QRVJUWV9OQU1FX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBQcm9wZXJ0eSB3aXRoICclMScgbmFtZSBhbmQgZGlmZmVyZW50IHR5cGUgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzOSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0NjQwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoHByb3BlcnR5wqBuYW1lCisgICAgSU5WQUxJRF9QUk9QRVJUWTogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBwcm9wZXJ0eSByZWNlaXZlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjQwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjQxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgaW52YWxpZCBmaWx0ZXIKKyMlMsKgLcKgdmFsaWQgZmlsdGVycworICAgIElOVkFMSURfRklMVEVSX0tFWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIGZpbHRlciAlMSBpcyBub3QgYXBwbGljYWJsZS4gUGxlYXNlIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmaWx0ZXJzOiAlMiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2NDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxwqAtwqBhc3NldCB0eXBlCisjJTLCoC3CoGZpbHRlcgorICAgIE5PX0FTU0VUU19GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJObyAlMSB3ZXJlIGZvdW5kIHRvIG1hdGNoIGNyaXRlcmlhICUyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJSZXNvdXJjZSIvIlByb2R1Y3QiCisjICUyIC0gInN1Yi1jYXRlZ29yeSBuYW1lIgorIyAlMyAtICJjYXRlZ29yeSBuYW1lIgorICAgIENPTVBPTkVOVF9TVUJfQ0FURUdPUllfTk9UX0ZPVU5EX0ZPUl9DQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgc3ViLWNhdGVnb3J5ICclMicgbm90IGZvdW5kIHVuZGVyIGNhdGVnb3J5ICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIEZvcm1hdAorICAgIENPUlJVUFRFRF9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGZvcm1hdCBpcyBjb3JydXB0ZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJncm91cFR5cGUiCisgICAgSU5WQUxJRF9WRl9NT0RVTEVfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBncm91cCB0eXBlICclMScgKHNob3VsZCBiZSBWZk1vZHVsZSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJncm91cE5hbWUiCisgICAgSU5WQUxJRF9WRl9NT0RVTEVfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBWRiBNb2R1bGUgbmFtZSAnJTEnIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDYiCisgICAgfQorICAgIAorIy0tLS0tLS0tLVNWQzQ2NDctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAibW9kaWZpZWROYW1lIgorICAgIElOVkFMSURfVkZfTU9EVUxFX05BTUVfTU9ESUZJQ0FUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIFZGIE1vZHVsZSBuYW1lIG1vZGlmaWNhdGlvbiwgY2FuIG5vdCBtb2RpZnkgJyUxJyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDciCisgICAgfQorCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2xvZ2JhY2sueG1sIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9sb2diYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg1ODdiCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9sb2diYWNrLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNvbmZpZ3VyYXRpb24+CisJPHByb3BlcnR5IHNjb3BlPSJzeXN0ZW0iIG5hbWU9IkVDT01QLWNvbXBvbmVudC1uYW1lIiB2YWx1ZT0iQVNEQyIgLz4KKwk8cHJvcGVydHkgc2NvcGU9InN5c3RlbSIgbmFtZT0iRUNPTVAtc3ViY29tcG9uZW50LW5hbWUiIHZhbHVlPSJBU0RDLVRPT0wiIC8+CisJPHByb3BlcnR5IG5hbWU9ImRlZmF1bHQtbG9nLXBhdHRlcm4iCisJCXZhbHVlPSIlZHt5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWFhYfXwlWHt1dWlkfXwlWHtzZXJ2aWNlSW5zdGFuY2VJRH18JXRocmVhZHx8JHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX18JVh7dXNlcklkfXwlbGV2ZWx8JVh7YWxhcm1TZXZlcml0eX18JVh7bG9jYWxBZGRyfXwke2JlRnFkbn18JVh7cmVtb3RlQWRkcn18JWxvZ2dlcnszNX18JVh7dGltZXJ9fEFjdGl2aXR5VHlwZT0mbHQ7JU0mZ3Q7LCBEZXNjPSZsdDslbXNnJmd0OyVuIiAvPgorCQorCTxhcHBlbmRlciBuYW1lPSJERUJVR19ST0xMSU5HIgorCQljbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgorCQk8ZmlsZT4ke0hPTUV9L2FzZGN0b29sL2xvZ3MvJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nPC9maWxlPgorCisJCTwhLS0gYWNjZXB0IERFQlVHIGFuZCBUUkFDRSBsZXZlbCAtLT4KKwkJPCEtLTxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+LS0+CisJCQk8IS0tPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguR0V2ZW50RXZhbHVhdG9yIj4tLT4KKwkJCQk8IS0tPGV4cHJlc3Npb24+LS0+CisJCQkJCTwhLS1lLmxldmVsLnRvSW50KCkgJmx0Oz0gREVCVUcudG9JbnQoKS0tPgorCQkJCTwhLS08L2V4cHJlc3Npb24+LS0+CisJCQk8IS0tPC9ldmFsdWF0b3I+LS0+CisJCQk8IS0tPE9uTWlzbWF0Y2g+REVOWTwvT25NaXNtYXRjaD4tLT4KKwkJCTwhLS08T25NYXRjaD5ORVVUUkFMPC9Pbk1hdGNoPi0tPgorCQk8IS0tPC9maWx0ZXI+LS0+CisKKwkJPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorCQkJPGZpbGVOYW1lUGF0dGVybj4ke0hPTUV9L2FzZGN0b29sL2xvZ3MvJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nLiVpCisJCQk8L2ZpbGVOYW1lUGF0dGVybj4KKwkJCTxtaW5JbmRleD4xPC9taW5JbmRleD4KKwkJCTxtYXhJbmRleD4xMDwvbWF4SW5kZXg+CisJCTwvcm9sbGluZ1BvbGljeT4KKworCQk8dHJpZ2dlcmluZ1BvbGljeQorCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKwkJCTxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKwkJPC90cmlnZ2VyaW5nUG9saWN5PgorCQk8ZW5jb2Rlcj4KKwkJCTxwYXR0ZXJuPiR7ZGVmYXVsdC1sb2ctcGF0dGVybn08L3BhdHRlcm4+CisJCTwvZW5jb2Rlcj4KKwk8L2FwcGVuZGVyPgorCisJPHJvb3QgbGV2ZWw9IkRFQlVHIj4KKwkJPGFwcGVuZGVyLXJlZiByZWY9IkRFQlVHX1JPTExJTkciIC8+CisJPC9yb290PgorCTxsb2dnZXIgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMiIGxldmVsPSJERUJVRyIgLz4KKworPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvdGl0YW4ucHJvcGVydGllcyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvdGl0YW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmIwZWJjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy90aXRhbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMyBAQAorc3RvcmFnZS5iYWNrZW5kPWNhc3NhbmRyYQorc3RvcmFnZS5ob3N0bmFtZT1sb2NhbGhvc3QKK3N0b3JhZ2UucG9ydD05MTYwCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL1JFQURNRS50eHQgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwMDZlZgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDQzIEBACitBU0RDIGVsYXN0aWNzZWFyY2ggdG9vbAorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgdG9vbCBwdXJwb3NlIGlzIHRvIGVhc2UgYW5kIGFsbG93IHVwZGF0aW5nIGVsYXN0aWNzZWFyY2ggaW5kaWNlcy4KKworSW4gb3JkZXIgdG8gdXNlIHRoZSBzY3JpcHRzLCB5b3UgbmVlZCB0byB2ZXJpZnkgUHl0aG9uIGlzIGluc3RhbGxlZCBhbmQgdG8gaW5zdGFsbCB0aGUgZWxhc3RpY3NlYXJjLXB5IGxpYnJhcnk6CisJVmVyaWZ5IHBpcCBpcyBpbnN0YWxsZWQ6CQkkY29tbWFuZCAtdiBwaXAKKwlpZiBub3QgaW5zdGFsbGVkOgkKKwkJRG93bmxvYWQgaHR0cHM6Ly9ib290c3RyYXAucHlwYS5pby9nZXQtcGlwLnB5CisJCSRweXRob24gZ2V0LXBpcC5weSAgKHNlZSBpbnN0cnVjdGlvbjogaHR0cHM6Ly9waXAucHlwYS5pby9lbi9sYXRlc3QvaW5zdGFsbGluZy8jaW5zdGFsbGluZy13aXRoLWdldC1waXAtcHkpCisJJHBpcCBpbnN0YWxsIGVsYXN0aWNzZWFyY2gKKworCitUb29sIGNvbnRhaW5zOgorCS0gaW5kZXhfb3BzLnB5CisJICBUaGlzIHNjcmlwdCBpbmNsdWRlcyBvcGVyYXRpb25zIG9uIGVsYXN0aWNzZWFyY2ggaW5kZXg6CisJICAKKwkgIGNyZWF0ZSBpbmRleDoKKwkJJHB5dGhvbiBpbmRleF9vcHMucHkgLW8gY3JlYXRlIC1hIDxlbGFzdGljc2VhcmNoIGhvc3RuYW1lPiAtbiA8aW5kZXhOYW1lPiAtZiA8aW5kZXggbWFwcGluZyBmaWxlPgorCQkKKwkgIGRlbGV0ZSBpbmRleDoKKwkJJHB5dGhvbiBpbmRleF9vcHMucHkgLW8gZGVsZXRlIC1hIDxlbGFzdGljc2VhcmNoIGhvc3RuYW1lPiAtbiA8aW5kZXhOYW1lPgorCSAgCisJICBjb3B5IGluZGV4IChhc3N1bWVzIGRlc3RpbmF0aW9uIGluZGV4IGFscmVhZHkgZXhpc3RzKToKKwkgICAgJHB5dGhvbiBpbmRleF9vcHMucHkgLW8gbW92ZSAtYSA8ZWxhc3RpY3NlYXJjaCBob3N0bmFtZT4gLW4gPGluZGV4TmFtZT4gLXQgPHRvSW5kZXg+CisJCQorCQkKKwktIGZpbGVfdXRpbHMucHkKKwkgIFRoaXMgc2NyaXB0IGluY2x1ZGVzIG9wZXJhdGlvbnMgb24gZmlsZXMgCisJICAKKwktIGF1ZGl0X21pZ3JhdGlvbl8xNjAyLnB5CisJICBUaGlzIHNjcmlwdCBydW4gZnVsbCBmbG93IHRvIG1pZ3JhdGUgYXVkaXQgaW5mb3JtYXRpb24gZnJvbSBwcmV2aW91cyB2ZXJzaW9ucyB0byBBU0RDIDE2MDIKKwkgIEl0IGhhcyAyIGlucHV0czoKKwkgICAxLiBjb25maWdfcHJvcGVydGllcy5weSAtIHRoaXMgZmlsZSBob2xkcyBjb25maWd1cmF0aW9uIChob3N0bmFtZSwgaW5kZXggbmFtZSwgaW5kZXggbWFwcGluZyBmaWxlIGV0Yy4pCisJICAgMi4gZm9sZGVyIG9mIGZpZWxkcyBtYXBwaW5nIHBlciBlbGFzdGljc2VhcmNoIHR5cGUgKG1hcCBvbGQgZmllbGQgdG8gbmV3IGZpZWxkKQorCSAgVGhlIGZsb3cgb2YgdGhpcyBzY3JpcHQgaXMgYXMgZm9sbG93OgorCSAgICogY3JlYXRlIHRlbXAgaW5kZXggd2l0aCBjb3JyZWN0IGluZGV4IG1hcHBpbmcKKwkgICAqIHNjYW4gdGhlIGF1ZGl0IGluZGV4IHRvIGdldCBhbGwgcmVjb3JkcworCSAgICogbWFuaXB1bGF0ZSBmaWVsZHMgZGF0YSBhbmQgaW5zZXJ0IGl0IHRvIHRlbXAgaW5kZXgKKwkgICAqIGRlbGV0ZSBhdWRpdCBpbmRleCAKKwkgICAqIGNyZWF0ZSBhdWRpdCBpbmRleCB3aXRoIGNvcnJlY3QgbWFwcGluZworCSAgICogY29weSBmcm9tIHRlbXAgaW5kZXggdG8gbmV3bHkgY3JlYXRlZCBhdWRpdCBpbmRleAorCSAgICogZGVsZXRlIHRlbXAgaW5kZXgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL2F1ZGl0TWFwcGluZ3MudHh0IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9hdWRpdE1hcHBpbmdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU3N2NjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9hdWRpdE1hcHBpbmdzLnR4dApAQCAtMCwwICsxLDE2OSBAQAoreyAic2V0dGluZ3MiOiB7fSwgIm1hcHBpbmdzIjogIAoreyAKKyJkaXN0cmlidXRpb25kb3dubG9hZGV2ZW50IjogCit7ICJwcm9wZXJ0aWVzIjogeyAKKyAgIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sIAorICAiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAgCisgICJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJSRVNPVVJDRV9VUkwiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IH0sCisgICJhdWRpdGluZ2dldHVlYmNsdXN0ZXJldmVudCI6IAoreyAicHJvcGVydGllcyI6IHsgCisgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IH0sCisgICJkaXN0cmlidXRpb25zdGF0dXNldmVudCI6IAoreyAicHJvcGVydGllcyI6IHsgCisgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiUkVTT1VSQ0VfVVJMIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkRJRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJUT1BJQ19OQU1FIjp7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICJDT05TVU1FUl9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfX0sIAorICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwKKyJkaXN0cmlidXRpb25lbmdpbmVldmVudCI6IAoreyAicHJvcGVydGllcyI6IHsgCisgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiVE9QSUNfTkFNRSI6eyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAiUk9MRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkFQSV9LRVkiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgIkRfRU5WIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH19LCAKKyAgIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IH0sCisgICJ1c2VyYWNjZXNzZXZlbnQiOiB7IAorICAgICJwcm9wZXJ0aWVzIjogeyAKKyAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgIlVTRVJfVUlEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICJVU0VSX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfX0gLCAKKyAgICAgICJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfX0sIAorICAgICAgInJlc291cmNlYWRtaW5ldmVudCI6IAorICAgICAgeyAicHJvcGVydGllcyI6IHsgCisgICAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAiQ1VSUl9WRVJTSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIkNVUlJfU1RBVEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAiRElEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIk1PRElGSUVSX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICJQUkVWX1ZFUlNJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAiTU9ESUZJRVJfVUlEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIlBSRVZfU1RBVEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAiUkVTT1VSQ0VfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIlJFU09VUkNFX1RZUEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICJEUFJFVl9TVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICJEQ1VSUl9TVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAiQ09NTUVOVCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgIkFSVElGQUNUX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0gfSwgCisgICAgICAgICJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfX0gLCAKKyAgICAgICAgInVzZXJhZG1pbmV2ZW50IjogCisgICAgICAgIHsgInByb3BlcnRpZXMiOiB7IAorICAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfSwgCisgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiTU9ESUZJRVJfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiVVNFUl9FTUFJTCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlVTRVJfUk9MRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlVTRVJfQUZURVJfRU1BSUwiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJVU0VSX0JFRk9SRV9ST0xFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiVVNFUl9BRlRFUl9ST0xFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgICAgICAiVVNFUl9VSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJVU0VSX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlVTRVJfQkVGT1JFX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAgICAgIlVTRVJfQkVGT1JFX0VNQUlMIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICJNT0RJRklFUl9VSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICJVU0VSX0FGVEVSX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSB9LCAKKyAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwgCisiZGlzdHJpYnV0aW9ubm90aWZpY2F0aW9uZXZlbnQiOiAKKyB7InByb3BlcnRpZXMiOnsgCisgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfSwgCisgICJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIkNVUlJfU1RBVEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiQ1VSUl9WRVJTSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAiRElEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAgCisgICJNT0RJRklFUl9OQU1FIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiTU9ESUZJRVJfVUlEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlJFU09VUkNFX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJSRVNPVVJDRV9UWVBFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAiVE9QSUNfTkFNRSI6eyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9fX0sCisiY2F0ZWdvcnlldmVudCI6Cit7InByb3BlcnRpZXMiOnsKKyAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJNT0RJRklFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiQ0FURUdPUllfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlNVQl9DQVRFR09SWV9OQU1FIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiR1JPVVBJTkdfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlJFU09VUkNFX1RZUEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAgCisgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfX0sIAorICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwKKyAiYXV0aGV2ZW50IjogeyAKKyAgICJwcm9wZXJ0aWVzIjogeyAKKyAgICAgICJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LCAKKyAgICAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgIlVSTCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICAgICAiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgICAgIlVTRVIiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSAsCisgICAgICAiQVVUSF9TVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCJ0eXBlIjogInN0cmluZyIgfSAsIAorICAgICAgIlJFQUxNIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwidHlwZSI6ICJzdHJpbmciIH19ICwgCisgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH19LCAKKyAiY29uc3VtZXJldmVudCI6ICAKKyAgeyJwcm9wZXJ0aWVzIjp7CisgICJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICJNT0RJRklFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LCAKKyAgIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgCisgICJFQ09NUF9VU0VSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfX0sIAorICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gfSwgIAorICJkaXN0cmlidXRpb25kZXBsb3lldmVudCI6IAorICAgICAgICAgIHsgICAgICAgICJwcm9wZXJ0aWVzIjogeyAgICAgICAgICAKKyAgICAgICAgICAgICJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAKKyAgICAgICAgICAgICJDVVJSX1ZFUlNJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sICAgIAorICAgICAgICAgICAgIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgICAgICAgICAKKyAgICAgICAgICAgICJESUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICAgIk1PRElGSUVSX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgICAgICAgICAKKyAgICAgICAgICAgICJNT0RJRklFUl9VSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sIAorICAgICAgICAgICAgIlJFU09VUkNFX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwgICAgICAgICAKKyAgICAgICAgICAgICJSRVNPVVJDRV9UWVBFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LCAgCisgICAgICAgICAgICAiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgIAorICAgICAgICAgICAgIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwgICAgCisgICAgICAgICAgICAiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfX19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL2F1ZGl0X21pZ3JhdGlvbl8xNjAyLnB5IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9hdWRpdF9taWdyYXRpb25fMTYwMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYxZWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9hdWRpdF9taWdyYXRpb25fMTYwMi5weQpAQCAtMCwwICsxLDEzMiBAQAoraW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHN0cmluZworaW1wb3J0IGpzb24KK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCitmcm9tIGVsYXN0aWNzZWFyY2ggaW1wb3J0IEVsYXN0aWNzZWFyY2gKK2ltcG9ydCBlbGFzdGljc2VhcmNoCitpbXBvcnQgZWxhc3RpY3NlYXJjaC5oZWxwZXJzCitmcm9tIGVsYXN0aWNzZWFyY2guY2xpZW50IGltcG9ydCBJbmRpY2VzQ2xpZW50CitpbXBvcnQgc3lzLCBvcworZnJvbSBpbmRleF9vcHMgaW1wb3J0IGNyZWF0ZUluZGV4LCBkZWxldGVJbmRleCwgY29weUluZGV4Citmcm9tIGNvbmZpZ19wcm9wZXJ0aWVzIGltcG9ydCBnZXRHbG9iYWxWYXIgCitmcm9tIGZpbGVfdXRpbHMgaW1wb3J0IHJlYWRGaWxlVG9Kc29uCisKK2RlZiB1cGRhdGVGaWVsZE5hbWVzKGNsaWVudCwgcXVlcnlGcm9tLCBmcm9tSW5kZXgsIGRlc3RJbmRleCwgYWRkVVRDKToKKyAgICB0eXBlc0Rpcj0idHlwZXMiCisgICAgdHlwZUZpZWxkcyA9IHt9CisgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIodHlwZXNEaXIpOgorICAgICAgIHByaW50IGZpbGVuYW1lCisgICAgICAgZmllbGROYW1lcz1yZWFkRmlsZVRvSnNvbih0eXBlc0Rpcitvcy5zZXArZmlsZW5hbWUpCisgICAgICAgCisgICAgICAgdHlwZT1maWxlbmFtZS5zcGxpdCgiLiIpWzBdCisgICAgICAgdHlwZUZpZWxkc1t0eXBlXSA9IGZpZWxkTmFtZXMKKyAgIAorICAgIGNsaWVudC5pbmRpY2VzLnJlZnJlc2goaW5kZXg9ZnJvbUluZGV4KQorICAgIHJlcyA9IGVsYXN0aWNzZWFyY2guaGVscGVycy5zY2FuKGNsaWVudCwgcXVlcnk9cXVlcnlGcm9tLCBpbmRleD1mcm9tSW5kZXgpCisgICAgICAgCisgICAgYWN0aW9ucyA9IFtdCisgICAgZm9yIGkgaW4gcmVzOgorICAgICAgIHJlc190eXBlID0gaVsnX3R5cGUnXQorICAgICAgIGZpZWxkTmFtZXMgPSB0eXBlRmllbGRzLmdldChyZXNfdHlwZSkKKyAgICAgICBpZiAoZmllbGROYW1lcyAhPSBOb25lKToKKyAgICAgICAgIGFjdGlvbj17fQorICAgICAgICAgZm9yIGZpZWxkIGluIGlbJ19zb3VyY2UnXToKKyAgICAgICAgICAgICB1cGRhdGVkTmFtZT1maWVsZE5hbWVzLmdldChmaWVsZCkKKyAgICAgICAgICAgICBpZiAodXBkYXRlZE5hbWUgIT0gTm9uZSk6ICAgICAgICAKKyAgICAgICAgICAgICAgICAgaWYgKGZpZWxkID09ICd0aW1lc3RhbXAnIGFuZCBhZGRVVEMgPT0gVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICB2YWx1ZSs9IiBVVEMiCisgICAgICAgICAgICAgICAgIHZhbHVlPWlbJ19zb3VyY2UnXS5nZXQoZmllbGQpICAgCisgICAgICAgICAgICAgICAgIGFjdGlvblt1cGRhdGVkTmFtZV09dmFsdWUKKyAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICBhY3Rpb25bZmllbGRdPWlbJ19zb3VyY2UnXS5nZXQoZmllbGQpCisgICAgICAgICBpWydfc291cmNlJ109YWN0aW9uCisgICAgICAgCisgICAgICAgaVsnX2luZGV4J109ZGVzdEluZGV4CisgICAgICAgaS5wb3AoJ19pZCcsIE5vbmUpCisgICAgICAgYWN0aW9ucy5hcHBlbmQoaSkKKworICAgIGJ1bGtfcmVzID0gZWxhc3RpY3NlYXJjaC5oZWxwZXJzLmJ1bGsoY2xpZW50LCBhY3Rpb25zKQorICAgIHByaW50ICJidWxrIHJlc3BvbnNlOiAiLCBidWxrX3JlcworCisKKworZGVmIHVwZGF0ZUFsbHJlY29yZHNXaXRoVVRDKGNsaWVudCwgcXVlcnlGcm9tLCBmcm9tSW5kZXgsIGRlc3RJbmRleCk6CisKKyAgICAjc2NhbiBpbmRpY2VzCisgICAgY2xpZW50LmluZGljZXMucmVmcmVzaChpbmRleD1mcm9tSW5kZXgpCisgICAgcmVzID0gZWxhc3RpY3NlYXJjaC5oZWxwZXJzLnNjYW4oY2xpZW50LCBxdWVyeT1xdWVyeUZyb20sIGluZGV4PWZyb21JbmRleCkKKworICAgIGFjdGlvbnMgPSBbXQorICAgIGZvciBpIGluIHJlczoKKyAgICAgICAgcHJpbnQgaQorICAgICAgICBpWydfaW5kZXgnXT1kZXN0SW5kZXgKKyAgICAgICAgaVsnX3NvdXJjZSddWydUSU1FU1RBTVAnXSs9IiBVVEMiCisgICAgICAgIGFjdGlvbnMuYXBwZW5kKGkpCisKKyAgICBidWxrX3JlcyA9IGVsYXN0aWNzZWFyY2guaGVscGVycy5idWxrKGNsaWVudCwgYWN0aW9ucykKKyAgICBwcmludCAiYnVsayByZXNwb25zZTogIiwgYnVsa19yZXMKKworCitkZWYgcHJpbnRRdWVyeVJlc3VsdHMoY2xpZW50LCBteVF1ZXJ5LCBpbmRleE5hbWUpOgorICAgIGNsaWVudC5pbmRpY2VzLnJlZnJlc2goaW5kZXg9aW5kZXhOYW1lKQorICAgIHJlcyA9IGVsYXN0aWNzZWFyY2guaGVscGVycy5zY2FuKGNsaWVudCwgcXVlcnk9bXlRdWVyeSwgaW5kZXg9aW5kZXhOYW1lKQorICAgIGZvciBpIGluIHJlczoKKyAgICAgICBwcmludCBpCisKK2RlZiBtYWluKCk6CisgICBwcmludCAic3RhcnQgc2NyaXB0IGZvciBjaGFuZ2luZyBmaWVsZHMiCisgICBwcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgCisgICAjIGluaXRpYWxpemUgZXMKKyAgIGVzID0gRWxhc3RpY3NlYXJjaChbZ2V0R2xvYmFsVmFyKCdob3N0JyldKQorCisgICB0cnk6CisgICAgbWFwcGluZz1yZWFkRmlsZVRvSnNvbihnZXRHbG9iYWxWYXIoJ21hcHBpbmdGaWxlTmFtZScpKQorICAgIHJlcyA9IGNyZWF0ZUluZGV4KGVzLCBnZXRHbG9iYWxWYXIoJ3RlbXBJbmRleE5hbWUnKSwgbWFwcGluZykKKyAgICBpZiAocmVzICE9IDApOgorICAgICAgcHJpbnQgInNjcmlwdCByZXN1bHRzIGluIGVycm9yIgorICAgICAgc3lzLmV4aXQoMSkKKworICAgIHByaW50ICJzY2FuIGF1ZGl0IGluZGV4IGFuZCBtYW5pcHVsYXRlIGRhdGEiCisgICAgcHJpbnQgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKworICAgIHByaW50ICJzdGFydCB0aW1lOiAiLCBkYXRldGltZS5ub3coKS50aW1lKCkKKyAgICB1cGRhdGVGaWVsZE5hbWVzKGVzLCBnZXRHbG9iYWxWYXIoJ21hdGNoQWxsUXVlcnknKSwgZ2V0R2xvYmFsVmFyKCdvcmlnSW5kZXhOYW1lJyksIGdldEdsb2JhbFZhcigndGVtcEluZGV4TmFtZScpLCBnZXRHbG9iYWxWYXIoJ2FkZFVUQycpKQorICAgCisgICAgcHJpbnQgInJlLWNyZWF0ZSBvcmlnaW5hbCBpbmRleCIKKyAgICBwcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICByZXMgPSBjcmVhdGVJbmRleChlcywgZ2V0R2xvYmFsVmFyKCdvcmlnSW5kZXhOYW1lJyksIG1hcHBpbmcpCisgICAgaWYgKHJlcyAhPSAwKToKKyAgICAgIHByaW50ICJzY3JpcHQgcmVzdWx0cyBpbiBlcnJvciIKKyAgICAgIHN5cy5leGl0KDEpCisgICAKKyAgICBwcmludCAiY29weSBkYXRhIGZyb20gdGVtcCBpbmRleCB0byBvcmlnaW5hbCIKKyAgICBwcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgIHJlcyA9IGNvcHlJbmRleChlcywgZ2V0R2xvYmFsVmFyKCd0ZW1wSW5kZXhOYW1lJyksIGdldEdsb2JhbFZhcignb3JpZ0luZGV4TmFtZScpKQorICAgIGlmIChyZXMgIT0gMCk6CisgICAgICBwcmludCAic2NyaXB0IHJlc3VsdHMgaW4gZXJyb3IiCisgICAgICBzeXMuZXhpdCgxKQorICAgCisgICAgcHJpbnQgImRlbGV0ZSB0ZW1wIGluZGV4IgorICAgIHByaW50ICI9PT09PT09PT09PT09PT09PT0iCisgICAgcmVzID0gZGVsZXRlSW5kZXgoZXMsIGdldEdsb2JhbFZhcigndGVtcEluZGV4TmFtZScpKQorICAgIGlmIChyZXMgIT0gMCk6CisgICAgICBwcmludCAic2NyaXB0IHJlc3VsdHMgaW4gZXJyb3IiCisgICAgICBzeXMuZXhpdCgxKQorICAgCisgICAKKyAgICBwcmludCAiZW5kIHRpbWU6ICIsIGRhdGV0aW1lLm5vdygpLnRpbWUoKQorCisgICBleGNlcHQgRXhjZXB0aW9uLCBlcnJvcjoKKyAgICAgIHByaW50ICJBbiBleGNlcHRpb24gd2FzIHRocm93biEiCisgICAgICBwcmludCBzdHIoZXJyb3IpCisgICAgICByZXR1cm4gMgorICAKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgbWFpbigpCisKKworCisKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9jb25maWdfcHJvcGVydGllcy5weSBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvY29uZmlnX3Byb3BlcnRpZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5NzMwMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvY29uZmlnX3Byb3BlcnRpZXMucHkKQEAgLTAsMCArMSwxMSBAQAorZ2xvYmFsVmFycz17CisgICJob3N0IjogIjEyNy4wLjAuMSIsCisgICJvcmlnSW5kZXhOYW1lIjogInRlbXBfYXVkaXQiLAorICAidGVtcEluZGV4TmFtZSI6ICJ0ZW1wX2F1ZGl0MiIsCisgICJhZGRVVEMiOiBGYWxzZSwKKyAgIm1hcHBpbmdGaWxlTmFtZSI6ICJhdWRpdE1hcHBpbmdzLnR4dCIsCisgICJtYXRjaEFsbFF1ZXJ5Ijp7InF1ZXJ5IjogeyJtYXRjaF9hbGwiOiB7fX19Cit9CisKK2RlZiBnZXRHbG9iYWxWYXIocHJvcGVydHlOYW1lKToKKyAgcmV0dXJuIGdsb2JhbFZhcnMuZ2V0KHByb3BlcnR5TmFtZSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL2ZpbGVfdXRpbHMucHkgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL2ZpbGVfdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzOTAyMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvZmlsZV91dGlscy5weQpAQCAtMCwwICsxLDIxIEBACitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgc3RyaW5nCitpbXBvcnQganNvbgorZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKK2Zyb20gZWxhc3RpY3NlYXJjaCBpbXBvcnQgRWxhc3RpY3NlYXJjaAoraW1wb3J0IGVsYXN0aWNzZWFyY2gKK2ltcG9ydCBlbGFzdGljc2VhcmNoLmhlbHBlcnMKK2Zyb20gZWxhc3RpY3NlYXJjaC5jbGllbnQgaW1wb3J0IEluZGljZXNDbGllbnQKK2ltcG9ydCBzeXMsIG9zCisKK2RlZiByZWFkRmlsZVRvSnNvbihmaWxlTmFtZSk6CisgICBwcmludCAicmVhZCBmaWxlICIsIGZpbGVOYW1lCisgICBmbz1vcGVuKGZpbGVOYW1lKQorICAgdHJ5OgorICAgICBqc29uX21hcHBpbmc9anNvbi5sb2FkKGZvKQorICAgICBmby5jbG9zZSgpCisgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgcHJpbnQgImVycm9yIGluIHJlYWRpbmcgZmlsZSAiICwgZmlsZU5hbWUKKyAgICAgZm8uY2xvc2UoKQorICAgICByYWlzZQorICAgcmV0dXJuIGpzb25fbWFwcGluZwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9nZXQtcGlwLnB5IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9nZXQtcGlwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTZjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL2dldC1waXAucHkKQEAgLTAsMCArMSwxNzc1OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEhpIFRoZXJlIQorIyBZb3UgbWF5IGJlIHdvbmRlcmluZyB3aGF0IHRoaXMgZ2lhbnQgYmxvYiBvZiBiaW5hcnkgZGF0YSBoZXJlIGlzLCB5b3UgbWlnaHQKKyMgZXZlbiBiZSB3b3JyaWVkIHRoYXQgd2UncmUgdXAgdG8gc29tZXRoaW5nIG5lZmFyaW91cyAoZ29vZCBmb3IgeW91IGZvciBiZWluZworIyBwYXJhbm9pZCEpLiBUaGlzIGlzIGEgYmFzZTg1IGVuY29kaW5nIG9mIGEgemlwIGZpbGUsIHRoaXMgemlwIGZpbGUgY29udGFpbnMKKyMgYW4gZW50aXJlIGNvcHkgb2YgcGlwLgorIworIyBQaXAgaXMgYSB0aGluZyB0aGF0IGluc3RhbGxzIHBhY2thZ2VzLCBwaXAgaXRzZWxmIGlzIGEgcGFja2FnZSB0aGF0IHNvbWVvbmUKKyMgbWlnaHQgd2FudCB0byBpbnN0YWxsLCBlc3BlY2lhbGx5IGlmIHRoZXkncmUgbG9va2luZyB0byBydW4gdGhpcyBnZXQtcGlwLnB5CisjIHNjcmlwdC4gUGlwIGhhcyBhIGxvdCBvZiBjb2RlIHRvIGRlYWwgd2l0aCB0aGUgc2VjdXJpdHkgb2YgaW5zdGFsbGluZworIyBwYWNrYWdlcywgdmFyaW91cyBlZGdlIGNhc2VzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLCBhbmQgb3RoZXIgc3VjaCBzb3J0IG9mCisjICJ0cmliYWwga25vd2xlZGdlIiB0aGF0IGhhcyBiZWVuIGVuY29kZWQgaW4gaXRzIGNvZGUgYmFzZS4gQmVjYXVzZSBvZiB0aGlzCisjIHdlIGJhc2ljYWxseSBpbmNsdWRlIGFuIGVudGlyZSBjb3B5IG9mIHBpcCBpbnNpZGUgdGhpcyBibG9iLiBXZSBkbyB0aGlzCisjIGJlY2F1c2UgdGhlIGFsdGVybmF0aXZlcyBhcmUgYXR0ZW1wdCB0byBpbXBsZW1lbnQgYSAibWluaXBpcCIgdGhhdCBwcm9iYWJseQorIyBkb2Vzbid0IGRvIHRoaW5ncyBjb3JyZWN0bHkgYW5kIGhhcyB3ZWlyZCBlZGdlIGNhc2VzLCBvciBjb21wcmVzcyBwaXAgaXRzZWxmCisjIGRvd24gaW50byBhIHNpbmdsZSBmaWxlLgorIworIyBJZiB5b3UncmUgd29uZGVyaW5nIGhvdyB0aGlzIGlzIGNyZWF0ZWQsIGl0IGlzIHVzaW5nIGFuIGludm9rZSB0YXNrIGxvY2F0ZWQKKyMgaW4gdGFza3MvZ2VuZXJhdGUucHkgY2FsbGVkICJpbnN0YWxsZXIiLiBJdCBjYW4gYmUgaW52b2tlZCBieSB1c2luZworIyBgYGludm9rZSBnZW5lcmF0ZS5pbnN0YWxsZXJgYC4KKworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBwa2d1dGlsCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgc3RydWN0CitpbXBvcnQgdGVtcGZpbGUKKworIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgorUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyCitQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKKworaWYgUFkzOgorICAgIGl0ZXJieXRlcyA9IGl0ZXIKK2Vsc2U6CisgICAgZGVmIGl0ZXJieXRlcyhidWYpOgorICAgICAgICByZXR1cm4gKG9yZChieXRlKSBmb3IgYnl0ZSBpbiBidWYpCisKK3RyeToKKyAgICBmcm9tIGJhc2U2NCBpbXBvcnQgYjg1ZGVjb2RlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2I4NWFscGhhYmV0ID0gKGIiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAgICAgICAgICBiImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6ISMkJSYoKSorLTs8PT4/QF5fYHt8fX4iKQorCisgICAgZGVmIGI4NWRlY29kZShiKToKKyAgICAgICAgX2I4NWRlYyA9IFtOb25lXSAqIDI1NgorICAgICAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoaXRlcmJ5dGVzKF9iODVhbHBoYWJldCkpOgorICAgICAgICAgICAgX2I4NWRlY1tjXSA9IGkKKworICAgICAgICBwYWRkaW5nID0gKC1sZW4oYikpICUgNQorICAgICAgICBiID0gYiArIGInficgKiBwYWRkaW5nCisgICAgICAgIG91dCA9IFtdCisgICAgICAgIHBhY2tJID0gc3RydWN0LlN0cnVjdCgnIUknKS5wYWNrCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihiKSwgNSk6CisgICAgICAgICAgICBjaHVuayA9IGJbaTppICsgNV0KKyAgICAgICAgICAgIGFjYyA9IDAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBpdGVyYnl0ZXMoY2h1bmspOgorICAgICAgICAgICAgICAgICAgICBhY2MgPSBhY2MgKiA4NSArIF9iODVkZWNbY10KKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgZm9yIGosIGMgaW4gZW51bWVyYXRlKGl0ZXJieXRlcyhjaHVuaykpOgorICAgICAgICAgICAgICAgICAgICBpZiBfYjg1ZGVjW2NdIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWQgYmFzZTg1IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAlZCcgJSAoaSArIGopCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHBhY2tJKGFjYykpCisgICAgICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Jhc2U4NSBvdmVyZmxvdyBpbiBodW5rIHN0YXJ0aW5nIGF0IGJ5dGUgJWQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGkpCisKKyAgICAgICAgcmVzdWx0ID0gYicnLmpvaW4ob3V0KQorICAgICAgICBpZiBwYWRkaW5nOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzotcGFkZGluZ10KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBib290c3RyYXAodG1wZGlyPU5vbmUpOgorICAgICMgSW1wb3J0IHBpcCBzbyB3ZSBjYW4gdXNlIGl0IHRvIGluc3RhbGwgcGlwIGFuZCBtYXliZSBzZXR1cHRvb2xzIHRvbworICAgIGltcG9ydCBwaXAKKyAgICBmcm9tIHBpcC5jb21tYW5kcy5pbnN0YWxsIGltcG9ydCBJbnN0YWxsQ29tbWFuZAorCisgICAgIyBXcmFwcGVyIHRvIHByb3ZpZGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBsb3dlc3QgcHJpb3JpdHkKKyAgICBjbGFzcyBDZXJ0SW5zdGFsbENvbW1hbmQoSW5zdGFsbENvbW1hbmQpOgorICAgICAgICBkZWYgcGFyc2VfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgICAgICMgSWYgY2VydCBpc24ndCBzcGVjaWZpZWQgaW4gY29uZmlnIG9yIGVudmlyb25tZW50LCB3ZSBwcm92aWRlIG91cgorICAgICAgICAgICAgIyBvd24gY2VydGlmaWNhdGUgdGhyb3VnaCBkZWZhdWx0cy4KKyAgICAgICAgICAgICMgVGhpcyBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGN1c3RvbSBjZXJ0IGFueXdoZXJlIG9uZSBsaWtlczoKKyAgICAgICAgICAgICMgY29uZmlnLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhcmd2LgorICAgICAgICAgICAgaWYgbm90IHNlbGYucGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpLmNlcnQ6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZGVmYXVsdHNbImNlcnQiXSA9IGNlcnRfcGF0aCAgIyBjYWxjdWxhdGVkIGJlbG93CisgICAgICAgICAgICByZXR1cm4gc3VwZXIoQ2VydEluc3RhbGxDb21tYW5kLCBzZWxmKS5wYXJzZV9hcmdzKGFyZ3MpCisKKyAgICBwaXAuY29tbWFuZHNfZGljdFsiaW5zdGFsbCJdID0gQ2VydEluc3RhbGxDb21tYW5kCisKKyAgICAjIFdlIGFsd2F5cyB3YW50IHRvIGluc3RhbGwgcGlwCisgICAgcGFja2FnZXMgPSBbInBpcCJdCisKKyAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdXMgbm90IHRvIGluc3RhbGwgc2V0dXB0b29scworICAgIGlmICItLW5vLXNldHVwdG9vbHMiIGluIHN5cy5hcmd2IG9yIG9zLmVudmlyb24uZ2V0KCJQSVBfTk9fU0VUVVBUT09MUyIpOgorICAgICAgICBhcmdzID0gW3ggZm9yIHggaW4gc3lzLmFyZ3ZbMTpdIGlmIHggIT0gIi0tbm8tc2V0dXB0b29scyJdCisgICAgZWxzZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorCisgICAgICAgICMgV2Ugd2FudCB0byBzZWUgaWYgc2V0dXB0b29scyBpcyBhdmFpbGFibGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8KKyAgICAgICAgIyBpbnN0YWxsIGl0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBzZXR1cHRvb2xzICAjIG5vcWEKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFja2FnZXMgKz0gWyJzZXR1cHRvb2xzIl0KKworICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB1cyBub3QgdG8gaW5zdGFsbCB3aGVlbAorICAgIGlmICItLW5vLXdoZWVsIiBpbiBhcmdzIG9yIG9zLmVudmlyb24uZ2V0KCJQSVBfTk9fV0hFRUwiKToKKyAgICAgICAgYXJncyA9IFt4IGZvciB4IGluIGFyZ3MgaWYgeCAhPSAiLS1uby13aGVlbCJdCisgICAgZWxzZToKKyAgICAgICAgIyBXZSB3YW50IHRvIHNlZSBpZiB3aGVlbCBpcyBhdmFpbGFibGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCBpdC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHdoZWVsICAjIG5vcWEKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgYXJncyArPSBbIndoZWVsIl0KKworICAgIGRlbGV0ZV90bXBkaXIgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgIyBDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIGFjdCBhcyBhIHdvcmtpbmcgZGlyZWN0b3J5IGlmIHdlIHdlcmUKKyAgICAgICAgIyBub3QgZ2l2ZW4gb25lLgorICAgICAgICBpZiB0bXBkaXIgaXMgTm9uZToKKyAgICAgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICAgICAgZGVsZXRlX3RtcGRpciA9IFRydWUKKworICAgICAgICAjIFdlIG5lZWQgdG8gZXh0cmFjdCB0aGUgU1NMIGNlcnRpZmljYXRlcyBmcm9tIHJlcXVlc3RzIHNvIHRoYXQgdGhleQorICAgICAgICAjIGNhbiBiZSBwYXNzZWQgdG8gLS1jZXJ0CisgICAgICAgIGNlcnRfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsICJjYWNlcnQucGVtIikKKyAgICAgICAgd2l0aCBvcGVuKGNlcnRfcGF0aCwgIndiIikgYXMgY2VydDoKKyAgICAgICAgICAgIGNlcnQud3JpdGUocGtndXRpbC5nZXRfZGF0YSgicGlwLl92ZW5kb3IucmVxdWVzdHMiLCAiY2FjZXJ0LnBlbSIpKQorCisgICAgICAgICMgRXhlY3V0ZSB0aGUgaW5jbHVkZWQgcGlwIGFuZCB1c2UgaXQgdG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpcCBhbmQKKyAgICAgICAgIyBzZXR1cHRvb2xzIGZyb20gUHlQSQorICAgICAgICBzeXMuZXhpdChwaXAubWFpbihbImluc3RhbGwiLCAiLS11cGdyYWRlIl0gKyBwYWNrYWdlcyArIGFyZ3MpKQorICAgIGZpbmFsbHk6CisgICAgICAgICMgUmVtb3ZlIG91ciB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICAgIGlmIGRlbGV0ZV90bXBkaXIgYW5kIHRtcGRpcjoKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodG1wZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKworZGVmIG1haW4oKToKKyAgICB0bXBkaXIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICAjIENyZWF0ZSBhIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKworICAgICAgICAjIFVucGFjayB0aGUgemlwZmlsZSBpbnRvIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICAgIHBpcF96aXAgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAicGlwLnppcCIpCisgICAgICAgIHdpdGggb3BlbihwaXBfemlwLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGI4NWRlY29kZShEQVRBLnJlcGxhY2UoYiJcbiIsIGIiIikpKQorCisgICAgICAgICMgQWRkIHRoZSB6aXBmaWxlIHRvIHN5cy5wYXRoIHNvIHRoYXQgd2UgY2FuIGltcG9ydCBpdAorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGlwX3ppcCkKKworICAgICAgICAjIFJ1biB0aGUgYm9vdHN0cmFwCisgICAgICAgIGJvb3RzdHJhcCh0bXBkaXI9dG1wZGlyKQorICAgIGZpbmFsbHk6CisgICAgICAgICMgQ2xlYW4gdXAgb3VyIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICBpZiB0bXBkaXI6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisKK0RBVEEgPSBiIiIiCitQKWg+QDZhV0FLMm10ZXk3RHQ1NDAwRVdfMDA2RWkwMDBqRjAwM31sYTQlbjlYPk10QlV0Y2I4ZDdXQnVaYC15S3xLRmQyYnJ3aWtXb19CCis7dSFybjwqcFF9SmZ2eWVHX1ZvZCZBOz1iT2JDRCZEbCM7bUh6V2NqN2t8SmZ2U3ZDITtDR21LN0psXzN5Y2dvNEx1VWFMKVQ4aT4zVWYhCit7Sy0peVVMdlg8NDNyUmxuRFRGS0x0aUN0YUVoR2sxdDY+WTspe1hDaE5fZUhoWWg7bX5lRTdqZkFPYFM9Xz9lbCNtT0NWSTtPdHRUNUM3CispPXl3V3QmUnU7TyhpcyMwMG11UyhUcU1VbW1sT0RRV0V2eHtvQyVnV3E1VTVUM1I5RncqWU1LXiFMbl5iNVhKV3EzPjhZen03aUhLPmltCitldUNTKz8+fnZ1U20zYHhMWX5pcUtWbSMlVCs1eVI+VnhUJVI0Uj1rakhHOWVhPHE7KmE8N0UtIWVDU25KR0BUayhTRnZSaiRTNkVpTDxzCitNcT43JSZPdk9zZEJOOU5UUXVydFVlcXJ1eHl6YntkbjtYT09ZfDEyVDZpWX5IX0tDRUN5R3BfbWh8eyFgd1RgfUhJNkwzPDdIbVNNRHBLCitTdHtSb3ArM0dnaWFGdypPRDgleUhreGRJSDNAK0ZANHlOSlBkZ2UjJTFvMCVBT2VRQlJRJVk+ZzlXTldVdHxWSSoqKTlKIVlidihuWUA1Cit+ZjkqTiM+ZzxAOyp6IWwzXzRjck89WWlzdUdlIz1XRTRTMkZVayU4YXBYWWt0QGFBKV9OVyNDKlZPcThPNXtTZ1cmbj1Rdj52MGF0NzEmCitgVShGMD9ibEYwYkB6clZOQmpUIUlwSiRPeD4lS3I7QFQxaVJYeHZpRnN8VyNCP0ptJkcwPTBzam8jVFFuYFhPPTcqQTRCbH5geExZPHE5CitIVjcoVztfWDMoa2g7Ny1rZDRrdn5eUE5OZn5eUlNLeUU8QEY5M1BObURab2o0KUBAP349M1JuPDx6WkJOYVN1WmJMUSEqTFkzdSFaYTxqCis5UnohWGZgMWt7QyQ1S2tfWT5fTUJWKEM7cFYrOFEpfWpFbncyJEV3X08rNkg4WihGO3pOekdYS0pFKFcyc3ZNfnRaZ2RyelBqS0k1MkpICisocDZQVUk7KyQ1aGpsJkVULWxFZj5ybj9MKlZ9P3kmZz5IdDVoI1M1VGpsdX0rK2BkUFpPbztCWCUkNWFiJVJOKDdEXzZNV3NecUwlbFBGCitLUitWWX1jWTkmUHRZKHQzWkVkeng8dDFZbEhgcVM/VGRyXzReVzlNPXYqMGBTJWR8Y3Nza158ZHw5OCFPSXFUcmVuT2JEKUNVOE8mTGM+CitneE5jPkJ4TT4meTMtMFhaUDlUcU9ZRExST2A9OCh0RThNMyhmcDB0ZH59JHNGQkhmSzFZbFo/OWp4M2xAcDAzKDx0cCZEcl9GJjQzQV9ZCit7SjIkMyFEYCF2ezQobWNRUnBqQ0MyakhoYGlCIVg2I0l9KWdTP1dtR2NMfT4jP2FwcHRyJV9yYThOVDtHcGU+VWokamlIO1QwJCs9WT1BCis8bF5kUFZScGM9OHx2LUdDPVBKaUpxZiE8M0M0VnwxQCEzWXdZZDVFRkJkbEN7UlheQUZWVk92bWBpZXFrYCYhSSlpMStucHRvST5iJStECitiUDkjaE1tO3woZyppLXpSMT5tUTM7Qnh9TTFLO1R9OUIwYnJiMkh0c3ImYUMyRDt+Z1MmWjQ3WTBjPGZuU2l6fV9KN3RidmhSM2ZXPiRhCit0TiVsd15yTTNIVm5LKjVhT1p+UHtLKlJvT2ZxUz1QUUVRdEVySV5tcnwqc0VCZmAzO2t6eTYtRytGSHtzJnchVV5HanxnZEBYO2x7Y2BGCitxKiYwfWFmZ2E3dUVeX3JBS3REeCVmY0Ymb3EtZ2Rpa2B0YV4ofEBIaV4tJkAkLWplfVp4V3hGbnJ+eGEpY1l5Nkdgbjt9JEk4TTkwSHkwCitKNDJjdUhEMztURTQ5d0E7WVZkaCVIRFE0YVItdjhpXnleRmg1UFhJZEdNUXd9VGM0cDJObjZAUEtEdDNjbzNDVUFZT1A3KWc+Y2xOJld1CisjSTZaUWBqTWFMQVdieTs2Z0BxSyNnNmFPbm5Zal92MWp1eEVsJUVqeFZwTiZlRF5OPmBTU0pFViZhOTdLMXh+RExkcWNkb3YyeWA1ayRlCitZN1FEaiZlR3E0TjhSVHwmVT4heT8mYyhHNzNfY2kpNTlVRHhzNzE/cT0oKEIwPmN6bChYdVhHKy05PEZkKzsmR1VWZEkxSytmTTlhV0ohCitofCZRPVRmcU85OXlSTiFxVjVicUFlLVRFUDljdHVYNCope1pKSD9ReEI9bWxVblVhK3wjdXhSZW8peyhgKVhmOEEkc29hWHltU0hYfEQ1CiteSDxGaCZmJnZ5c3FzViE8YllhZ1JWcE1NdDdOa3s3QkU/JVYyS1hGVFRvdXpEZio9JWwjaEUzT29ya1VwWHdmbDVxU011IUc0WUpFeGdlCitvditydGtjR2haRGlIZllCNkE3KFB8aCQoVWBFWChnR1RAa05WYE8yd0ByejlgTiFyaFVjV2BWWUVBQ2s9MUNwZElsM3U0X2R1KDBTbDV9CitEXlozdzQ9JXVidHVSaFQ5WEhhOD87IyhoI2JjU2x4dEJib3hBJFBCLSNiTnVSelkxQnpAaClDSmpKcT57bGBmRWYhIUVLU3A+MTgmKzxJCitRV3V8JSVYMT5oODtYSTE5dHZPLXIoVjcmeylYaFI5TW0wNz93YWZ9JUI1RE9BdyhocEd7eWZOdWg5ejxNPChKKX1CYWIrTlYrMFdwJlN1CithOGExdmhURGFLYEpKT3J3JXc3JVdJYVVwZFlUeFpQfHJiKk4/Sm9jT3w3NStrWGdvIXYqTV5SNnpFelRmfXYyOzgmZkRGSChabCVDJjZ0CitHaU0zRkdDSlgwZmtTT2duR0pacUMxNTdgKnwzYSRWdFZjKiFOQ1J6QXFYSkIjbkdiV0M8b0wjS1dhaFRmb0lxWCVOTWxIUkomQTl9TmBsCisqciRvZ3ojdDFGeDRTVXN6XihVbShFfDxaQ1R3YnlBdGltX1VOWVVrZzc/ezhNclFAWV8/JWZeRGVJa05lNmo4KFJ1Ul9teDVyeXAyTkBTCis/Mz9jdDdAdXF9ViltPHZkJF4rJD9+d2JWPVN3fUY1SmVgV3o0eWl2eTIzS15PdHtobVN9VVpDOz1KJERxaU1ifCZ6cWAmb1l8MEsmYUJ1CitZWlhIe1RPUmdYZWIjVz9gSDhtITVMZ0FUM3IjP31kNGhXckJTbENyI2UjTXA/T2h4N1l1PlFkUklYRWRlSHxgdnNPTnBUWjQxZ2ppITxfCitObHlkcHY4dXBQNW1CWCU2Sm5mYnFobTwyWTRodWhmPHQ2O28pXzIkKzRzd3p9cSVRZFQ1WVJ+US1CakJ7fiNpVnBiMD9BWERBOD9LeDJrCitnVVdGUTZaN1luPlZ6WHx0SUxRZEApX0Z0YWkyKXFmRCFzPndtPzxYKHp+aGtmKmpqdVFlNTZ7NiZkKkxAOzdBVWNmQGRqOXg+ZWtsNThLCitqXzFWSzs2VSU9IXdhaFRQRyVRLTRtdlJVNzFJbFQ9M0VqTT51JXFyMl5KT2hmPkQlcWtmaDFBcH0/KjxHWmRQX0JFTVVnfVpURTQqNG0rCitRKWJnYnFHUkZWcHZAVXQ5JHVjWFF5WVNjd25UOTEqc3wlVm5qJjc8REsycnJPLTNSOFRuUEJzT2VXWjZgejJAbHMlMU4jS311X1IoS0p1CitDJW1tb3A/XzVMMUZ0YSVXYUV1KTZMamFAWUN8RUk3eisjfHAlRmM+SnFwZiZqYCMwdXdCS2ZZbTxBO1ZZJFl0Tmc5bGNGRHd0UkopM1JNCisqVlNHZjttXzhyS2hHQDt3Qj4xPH1scm5wQGN7TFk0TThsRChFRSRvPClqbz9UVT1oIUUpViVHKz82bT9HPVczelUySkdpfjAyOWAwUVkyCisjSWBXR2BGfnBNQThTQSZeUVJLSFhxeStMeVFoP3spSXg1fFh9KXBXZVRFYHt0ZEstTCpjIT8qUjk3aTQjdDlvZj1LIUcweG92PitHaExUCisweEpwVns2KnIzWDd5PjNyRiMwJVhBQUBuWndVMVhrZ0R1TmowNGYhaFVPWUdTYXNqSUQkbiZjYS1ea0Y4akYhYF9rfWcwQ3JxVGdKSUxsCis+Kzg0ST1Xck5MQXN+UXVmT240ZVFNfExRZk1ZIz9FXmI1WFB4QXZXd281WmZvUShsZigzOUpCQj1tOU88ZXkoU258Kns7PjMldXFwRSkmCitpQTs0QmUyN3ZXYVItYnUhdHhISiF7dDtIb1UtX3k1ZT5hPUUjJX4jTFdUJERVYyhJT3wtWE4kdFc1I3BRcG1XRWhLRm43MEYhQiVAQ25OCitAM0pIWUoqZkNhcFZmQlVhM1F5ODxpZUY3YFgqZEF9U3ZNRTtsa2BxJjtzJHIjfTN9IU8/bHN9S1kyKC1ifDlDTSEkdmhiVSlLanJRfW5tCit7dnRCd090YHBrTGx1MSNAZ195QGpnKyZUaFA7TkNQRDE8IVRSPVdPKW5rKjgoIVVDSWM4RG9icnI9alhJT3YqK2pwRGoxX3k5Z1Vwez1ZCitJWns4K3xvMEoqSDBZI0pQNWJ1OD1QRkYoKFNpQHlae1lWc0BRXyNyaW00SFF2MnRRd0BaWWl7I1ktaj9XSzJuTTF4UzkmZFR2aiktU31uCistdUEmYSpnXjArMTAobigyOCtWTUk5XmxEZnw/YmVIaHErPFApcGAlTmJ2bU1pKzZ8dTRhZHFWWDQ3JFkqdXEzNnd1ey04b3VQQyYwJm9uCis8NGtpektlJWZCdHF4V0NLSHNRJE4wUXgoTjRsYiY7Jn41Nytwamhxej9TTn10RGJaQU4/PnJOLWQ4bDY4LWFKOFY+eWI3bzhDVCVzZ2d0Cit4NG9+VENmV05UNUZXVUEqfkx0NCp1Yj8ocCZeY3F9YGxLdmY7KmYzUVo9QFBve2pSTFo4e1BQNyFiIWt3aXhzPzlXR3Z1T303KCpzLUdvCis4PURlYzwydWJQPTtwZ018ZmA0PUBBTW49X2hBMl4rRWxfa35Ie2NiYzVhP3skQTFaIXRxMF4zdXZeVDxiNSN3SHJHOSZLOEZoUCtLO3VFCitoMlFHNWApVyQ7K2I0KyEkSE0/U0ZRX0VaPDJ4T01gc351YjsyLSo+Yk1MZUwqMTFZKis5ZXIpYGJCSzJTWj1NND91My1fJExHO0BXOS1vCis0PG5MYzJnaWVmUip3KlBlRHZeQzhLb1JtOSlydSpaK3J6JDBTJndZbGVDXmdXblVzfGdsZ3BQQU9vUzJGYXh9T3s2b2YqNVEzeHVPMXltCithemg1cHZUISQyJCMxR2Y2Tz91cTM0STgzRyQ0YEh5MmsxMF5IRjc+cUpBeFBrVkU2fSV1X3FURTR8cnIqWHU7K1AqaU5uWXkpKS1qb2tMCitfRTw+I2tPazFMT3RBMUM3cihMQz1rR0F2PURgKSs2QkVSV203dT9sYGFSZXZKQnhWWmNhcmpLTTVqeTF3PWFIQFZoUlZSRzJuVlNhTlFDCispb2hLT1NWREAkbz9mQm9MKURxVmJQfmMpN1BXdDFweiEtRCs4M1RBZTxjSmxrez0rQHVrIWdNNzB1LWRXekgqQ2VIKmFmKDwtYndDUTRaCitvUCpESH5FeCo1JEpUQGsmODdPYVN8X3V6ZDZfMk5GTlZFP0BPMGlGe1N4bD43V3tFRGhFJHp5QGo/MkBQK3AoZlc4dUQtKUchKFJRO0pvCit4YSpRKVMyeWZjM2xYK3RMN05iUFhATzVqNEYjNCFIVDluelFUcio/ZWJMblhyOW9IdVFEcHxYX3h9TTxPOUtRSDAwMDA4MFB+ZD1NQHZiCitoV2l0VCkwN3dEPTAxcDVGMEJ+dD1GSkU3NlZRRnEoVW9MUVlVNkRedSEhUWlSQEJJeyhjNCZ1MiN+RW57aiQ5RzxENzQ4TWt0UUtfUnJjCisrJXZ5PV5UJUFmYjE/TyR3O0dibSpqVEMhMEorPy0tMiY+dEI2TFBsTkJPO2hoOVphY2hTKTltMlkhZkhUZzE5PUktZyk+LTUpVVp5Kl95CitnIzExZShuQzJvJU5GQ3J1TjMtelNIbHlea3Z2JjRUKURBWUV2UjBnXzlQNUIpbSVCayNaa0J2IyZUOCl2IWdxPSElVGFObm1Cd0MhXlB5CittbTU9XkpOPFJueyFsWiktRVgzciVUbVpteXV2fUlxMkVJQVZyWH1POTtfSWR2OW5EZk0kcWN5YWAwWHYyRCRJR3Fgdlgycns4bW0kNkRQCitodXR0WkxnUV5VeSVhKjQ/JUBETiE4KykkZUYjQDZgdG98PmU8LUBYX1RCd0ladl4pSDtAV2IxPTRkaT9QbHBuO3xOVTJDJSlOeThySkV+CitTaUskI1MyOT5YYm5RdW9PbnxnV2F4WEtTdU85S1FIMDAwMDgwUH5kPU4xbmFjcy1fRDcwQ18wQDAxXk5JMEJ+dD1GSmZWSFduKnRgWkRECitSP0Vedjl4OGYkT2NJUCFhYjEpKVY/WTJtdXRJfjtIYlZDPU8/eEAmQ2UxYk1XMzJuc15CWHEjSkVecGNibC09aEVoWDg2I1BOP1AxTFA5CitHQTlvRVotMUoqMTszZFhwK2ZQUWBZYzc4ek9Rc1p3S3R1YWYxZFg3RkU+bmlvdChRRk9HRFZvTkFwbUFhSVNRb15AOEF2SC1DTzV+K3gpCitQNWZ3eCQjYEEqU3VLIVBvZXlxSSNqUD5yKzJBVCV6cjxtdkglPSlXRWIxPG9uS3xTJT5iQi1MUkN8ZlRyNSpGPGJoO2FBVVo5Smo3aHJaCitRa1FBWWloWWZlaUg5Tj1ZMzREbWAwaj0mMXc/OFhfUEF1YjdUeCR3bm1Ia2okKmZSMSYyekt6eHMqYlYkc01mUDlYdWpXSmRUKHt6bWphCit2TVhCRERKa1FSIUd7Wl5GJntBeDdzVX5mPyh1Xjxsc1ZHKV9UfCtLRm9rcFAyTHRCVlR2ITUkNzFNS2NIVjY8NER1fmt+O1RLJmxLLUNICis1SXNuJCVeIzNjTEdRKm5FflgxfHRQdk1ucTBuMyMyX3RjTXohMGNjJCt4KWQzIWc9aSNsYjlaYHJlc2VQPj1oeFNsKlRCcENyfV5jRklkCit6fSFYVjxyUHVQQEgkQDlGJlZtY0c1Ym8xYS14VVJ8SFJwSXpTRiZeTEZwaSEqdlF5TExFNzRNfkJxPUdCNjBycys8S15fVWQ2eHQjeHBRCitJTy1OMTN0O3ZQQkxwcjlgJX1TI2h6dWUwX0B8VEFGTlMhKFZRTT81b0k2KTd6and4QjdpR3AjO0ZfeiUrTmlQWG5iX0pWYXJjUE1ATilgCituOENORTxiTEZnV2JfZm5hV1BRcClONmtObzRZViRGe01TaTElRkhjJXlfVzN1Mj9MN1ZOMEV5ODJLUig7TGs8RCV5KzVNYiElWTVHdVEhCispeWlJZHVoaFE8UHZ9RWE0IUZVfDhNfTZ9MENIT0JXSURfcChXNn5hRFFieGNCOyUwMEchR2FmRFF5TUZsdWZ+SyFwZztqayU/Z2UkZTV9CitkUlBZPHhsWiFPMGU4OCR+SjFTdzMrTjg3VlRzOX41TjlWPkZJTSZ5e3BVaGk9LXdySUhacT1VQmRTXzBmQntVUHBScmRkV2UwNn1kJDAoCitgVGI0aXY4Ryp+YShJSDJCMyphITxmT1FKUlMqcjUhKm9HbDI1MUhOQHdtPmVZfk51MElXVWVmO2dXbTZWZWo/SGd8X2lsfmghXk5oZ3VoCis+TnNEMyEqbiV4b0AoRFlfT3xQVmJCYXZYSVpFTHlQe0Q7d2UhZ2AtRW5RKUZIWU0wTFFxRjNxSCswNUZ0SD9sSysxN3JReyhufXR1NEY7CittaTJ+IyF4djFaeG81d0VmTntTfW9ra3x4XmI+UEJxPXM8Wmw2KFd3KFh+KSp7V0xrT0NYJGQ9Q1RLVVU8dmQkV2hnbzA+cHZ0QnM9UWZVCit3RihoUnpJYTU8fiopaD80JWZKV0NTSHFWYUY2XzA9WkpuS141TilQJEZHMDFWV0d2Skt8NCk3cXlva0xoM0ApU3wmX31lPGRLVj4wan1CCitqdjl5bnAoQjZYfihCLU5JdC09Tz1DbCZWKCt7QW9rTSgoKzM8ZkhvbVckODNwSiUwPyl5clhFKHlRaEB7NihXYnJ7I2BHZ05MKGEkJkFSCismNCQoLShecDJOV15VOUw9bCpaQl9gKSVgJk1eSUBWI3RLWT1MRVJ8ams1Nj0tMTVvMHwoTCFaX3ArZilJU2dBdVh9c1NfWDteRk5yaEYxCisjOUBneTNVa1RYZUJwQ2chRXdIMXdHdTleZXhOSjBvbSR4TlNfWCVaNitaRm5HZ3AkJklrbmlNPSpnOV9jKFAzR3dpVD5ERit7RytiMy1ACit7Z1RkcnNpKXlTSCtlcn1rV3NjIVAkUTJJdSEqIWw/emNOI1NyJm9KTUE4eUlwXypgMjM1PFpTeC1MRkpzRUl8I0xTJCtyPlJCbFNCO1FACit4UCZhcj1ER1FIWDJPVjM7ckU7eFl6YEByPk1FUW9TKHhuekNZMUFDQHJ4e2R1MyFaYSo9IyNIUVVXMmxzUytCV0djQGJXJWlncXstZCNkCitVNjJ6N0p+ZygmTTdYTHB1TnJ7dlgxUG1lajx2bURsbktEQHIzJipuY3cmbDM2RDZHVGl8KzlyVih7c2hNOV8zVTxiYHVkX3FWdEhkIzJwCis8ZDRCflQlc294aSNKcEB9Jk5JaCgofGpCMyZLODtROD4zNlpOIyFONmEmalhLSj5OKjZoIT8yIylwSzU3ZThebzJrKjZzPnIhP1FGbztwCit4P15OajhXaEcxKSZVTm9XTll2RTVScjQoI0gkajxYZnskNno7dHVCTF5WaHY3RUJ8KDRSWFYrfSheWDRGfnFhTygqY29GOGJ9bDBNflhrCishMDNuNzNnJFQ4Zj5UM25vVHo5SjNKal9sQUYjRyhrR3FeTnArWXlKUUc9KV5LdTduLXY0SiE3bS08TWFUe1piPyhRWnNeOX0rQnRkPzxuCiswdXcqTEA8TnBEOW5pZVQrTXlEYmQ2NiZBcSNgSFdrKEZ+ZkNaSHl2VXkqRkI9YHxteXU+OVRUemBAWW89QjYkTnJyayFtKUU3KyNJRDh1Cit1RkMpfj01dHFPbUNvIzxadXshK2xDaXM5KUNfSFJTISpZRXhmTChaOytIZjx6Q0FAKztfenpgVV5RS05KS1RBMWdmbWxAbD9FWHE2fCFwCismSG85c3UhSG1oQVR3UkBXRCQ1YUEmOW9TUVloSUVWQlFUZUZYQytqMmkzVUZYfEYhZiVgTTA5Mip3WDNqPnpSXjNNKkBuZSFhREYtT3BZCitfMjB8YXF6aT1FU1RiV3cmZ3NBbG0pYTEzUU18OHhAV2B+bDlmK35tP3JAMDJiJFQwKy17Z01sXjxDTXkpbmx7YmtCK210SDhxY3dUbzBUCitiQUY+YiM3cnIrITc+dWlBMnRsWWx6e1JYPmRVaDVlVHloMXM5XztmWT9DSCE5b0piS2ktM05IM0ZuO3RkNF8rJjRyWjVmTWwrbm8zfE8hCitOPnBxfWVUaCNDWkJCPzJCIz1oP1FfI34jeVdTeD8hYHZtZTlLN3J1VVorPWxGPTBMPS0qM2MkJDJ2dzU/UnAyWTBuP2V6LUBWJTVkalErCitqRGRWYEQ0O2V0MWkhclBVZiZuKip0PT9neDNAZDhNXkBGWlNYNUA1aiE/MykkREFCO2xia0VaeSpeQmc5aSZeTCNwZWZkU1c+NkYrRDBeCisqOXROeClleyRFJDZxUj55YUhkM0plMXZeP059KVM4KUkzRG1mUWMjTil1WFptJF96Tz82QS0jNzVCRVYkbGFgeSFiVigpM0Z9T3NFTWZfCitGT2BiMXojSkhYT3tMUEN+eDBWd1NgPk14RjIyM3VJVClkJmdOSGx4MSoxRURFNFg7QnhVTW1NV0xeUCYhXzJ+fDIoXzd5YGlzOVopY1p0CitPTyVZLXIhcDtTVk93JE1ea3xJeGxUSHwhdHczdXlmbkIpKyUhb09YTWlOfGBKezF5bG8qJlF2UnN1cHh3PylGKmFfSWdnUDZFeDMyfGJnCitnPGs7cnM7amwwfEhEezdZZGopdzYlI2gkRl9yQGtgYFh1JlRDekhfXkk0UGMxZ1VvYXN4XjhJNTRAfENlYzN8IWBkeyt3RmphJSglKGg9Cis8MiswWENKUFlCNChuYEwjKD5iaG12NUhqS2pjaEhUflpOTCReSVdOZ2Z7XlpLc0g1RShkJnJrfStHVUs5JEVpfnl9ejB+bHJUPzl4SkktCituNVd6cWRLRG10bzs2RGd1RTU8fiFZSE4zVCVYI1FAWWZDdjtGNVRhQGN+Ym5iODVmSGhtWXBqVjg+TlMpJSk2cE5qUFZqQkRvLTN4Vmg1CitQI3ZsOWpXajdsSytiaDI2eGxFSz5RKnVNfjJKXi1qU0c5fDVSPiZWdXl1REI/TnFeMTcqMz4mK3ZNPVc3M3t7RXp4anVEM3IrSlYyO058CitlPHRKNGlQU0ltZy1mKlZJeDdHT1kjM08oTEhYMiYtdj42NVNSazV8MXFseENmUnkmPm01N3pPQ1F0ViUmI3xRSmBoVlBQYHUodkBAOU5SCitTbiZ1Zn1eTVJCTC1Hcj1UVTFUejAjdlktMXYzR2ZhYyFDTW4tRTZnUUgzc1cwUGsjYD0tdyU4QDRCfkded3ZabkdHNDdyIUMmcn42QllsCis/Zj40XyRHOzdSVyEpIWspUl9wWGlXYWVvRXRCZ3UoSHt1ZjQ5elQ3Z1hNUWpFJjJlNHZTcUU/JWk9XiFsfmNmTV9zWDxQX2xQOD5Rb1lDCitVY1hWX1Vqb1FlaW5ZbW9wODs7Y3E8cmBAMi1DT2A3OF43JkgmaVBuZ3FLTkVgeDZnJDckZFN4PHIjdW5faWJGNGwkQk8kN1lXRzZobmRWCitpZ2gwUFkjTn1QWWMzRTxMUVNiUF9KWnModS1eQXF+PHhBSzUyR05hPz90SjRjU2VAYWBhQ31kKiVZTEZeMVowKmk+V3REQz83PnVPWmMyCit5Wj9pWTMwQkF5YnMzZj1rUT5fO3h4VDBPSWBhY2BFM3lHJDR+WFROVmwyRz5zO3RlcCMmR3BWM0IlSkw3RCNYK3ZwKkF7YCg9SHoqY2J+CitWe1k1ZmBOKnJZYShWQypPdzBfLVRBO01uVF51MGdXT2BxfH5vKEYhN3J+K09Za19tPX58SXZNMjJWfTBOQEVvc2EhI0xQbXlUaE9Say1+Cis1TypDWTd2YjJwKVQkfHh9Tz1URUE/JCpzY2N6PEJnO1FJYyY1KXh3KFpBJTwmYHZsUERZZlQkVjdBKiVQPUNpamV2VnwoQ0Y7JSQwPj8oCitjdiFTcWYtKXlne256cnpqWFU2QlRgKmpMN2oyb0g+Rio1c1ptfXBaNUNQZGRvP3Qrend4YGVXZShOY0tgeWEjaEA2b1RnUDdrUnBTd0VqCitvOUNGRzt2K2s9I0ZBeVVAMUJKRkhsUFoxUVktTzAwO297bEA+P1pGdkxCazM7K1AoQzskS3YwMDAxUlg+YyFNVlJMMTBWUkNiMmF4UVJyCitvbXk+ZytfKHxgP3E1Tnk1bEJrYz5MckpNRzNyQ3B5eGJXbUYyU01jN3NuTzI1X2d4aUJubCs4PiVGND95KSU0fk5KKG91WDlVaSFHI3QoCitoPWpFQjlTRjY/RXNiV05RbnYwZm5SNE9La1YhSDJFdEpURjtpaVEtJHclNUk2TUx+R2UzOEBMKUN7ZyNDNzU0a1pnP3B8fSU2fGxnaFN+Cis2YWNxNH5ybm15e0hxQENUUzshNXxMKkRBLX5lay1NPTc4QGJ6M3JwNFVFLXd6T3QlU0BLZSs8Wll5RFJqbVZgYEJ3Wl5WSHFQaE5fNCVYCitlMVdrLVFjcU1LY1UhPT4+dEduKGIoTEQoc3FLJVdKbEY0MmxpZHVCOG47a2JUPnQxYnRnRVNzYnwzSipgPUxTUXszS2dSdWV6PkxNR3JICitBKVlyP1lmRmZ3SSh+SjMoYUsxVFVyOzJ8SVJLaEUoJjFDckQlJnp2TXFsc0JxS0xxJiU2eygyVjdJUmB1Q1VIRlU0dyY0e3RNQVFQeHhgCitAPGxTT1BydENiYHleeVRIU2tVUzBwKyhLYWpSSnN6MFIoVSt+NVE2TlFiTEFsWWEpZTYqKH11NSNUWDxBU1lXLWtEckQhJihVP3ZgaWdECitBZVIjYHRRS1g5MStja01qPHFwKCl7cmNnRXBXSF9IYjdeXlkwPDRBMyp6YCkxNEl7TVh5T3ZldCRufTJVbVliYm1OMG5EaG02OTY9OShZCis7aWNTJURaMyo9Z091RXstXj84aEh3Z3hwdkduM3N8QEBYNjQ8blVOaU5yVDZDRD8wbk1mP3VVREZNY3hqSm87R3AqakEyRiNTfVBZZU1oCitvbGUlQmB7dzExckt8XnxCQFNIWlBWfStPS1Bwa2lXaUNLUEIpMXtzc0c7U3IlQCVDZTRBJFpLSDFuQ1VfUkN5RF97KmFuS2R+PWlqVm82CityIWhUPW9MXj9OeD58bmhSYFFzPiQ4eUNra0dhdzRidjJNUXUpUWU8e0ZuWmpgKjRvJFc9QU48KkN9YylVemhGWG18SzJUTjlTPXUxVDYpCitaQmV3VkUyfHZuSkteVVB5N3BULXZwWj92VkErQXp5Xil0SFBmY0VWQCYpbGdLQGlXV0RkZUl9a1BOKSg/dGF2ZGRxZD1mUTMlZ0xqVFpICisqYSEzYEItcUpaT18raHJoNFE9djVXJmBQejd2d1l+UVdeUCl5amtHR1RTJSFvZWRHTmhUaGRGQDJjYC0lQ3F6eG0jMmYjeylBfFFDenUqCismeWNNWkF2MnVVbkV0SHx0cHtFOSN6N2I7MVR8M2A0QSktM0F3ajg8XnwmaW1jQkt4b2opSnRRfGJCPjhNKVI3dEdXdSt3eUp6d31RZXgmCitHRUJ2KXl8fGNnKmM9S0EjRCNrRkEwVlA0dTNAWj8xQEY+bDZIOXEtRHBOIX5Zd21rQnFnSmlIUihyQzBpJnArNnhoP0clI3VmM0chPmN4CitPdDtNY2FuVC16YXNOJUA9QWQhVjBueytUdytCYlJPJX19b0ZQNjx0eDlYTTAqMll0SG8kZ2ZrM2JlQG1FY0tLT0tMX0Jwa1FDdVNnZkBhCitIMzAtNUx3Y2VHKmR0VXNjb2BvY28tJFJDeDI0KEVSdiF1WnFAbGJgQ08oV21IUWxmcHRAMGpvVTBiT25CNE0+K1BiflR7JGBQLS1CdVhACitsUkg3V1I8UjEwSk8yVFJGan5uV1VxaVlpI0YkbVNhaUheMkxoRnVFQm19RD43YkJtPksqd09mdT5TKzBnSGtXcXU+QmlQZyo2NUJjeFB8CitxbENzO28zYWlQMFJ7Y2dATGQ4SHNNeSs1YnNkfTViZDNpQm1FR0MlTSFDcnE4MzBoa2okPEpkMVJhJjFkR19pRm9tYWQtUmJgPXBIUVlsCitURUJ1aWNBNFJQWVQ7aDg1MWZnLW1EaTUjbU1qZnd5TEx1RFk2UT53V2pyT3RBWGF1NTZBVElGOGA8WWdZa2taKzlRcW1pRHopRzBhX256Cis5WTdNNCtzLUxfeVV5ZW02N2JkZiRUUD9lPSNCTmFMN09Sa1E/RCZrREcmam1gcDF0ME9WUj0hM2Nab0FTTilvIWBvJkpJMktCZiYkSVhsCitQWVNCYDV4QnJYTzM2d01Tc00rcWNsYThDNXY8Nil6fmRvVT03cm55OTJrVmQ1N0wjKj1iSFFxZyZ7dVdmRzk3bFBNKTwyNkpHOGcmWFY7CityU29iTSRobSo5JjVuNmxmUW9eVEJMRjxiTUgjfTBeTnpyJFhJajxne1lCcz1fd2BNS21Fbj1EZmpIP01DSzF5flJJPihfQyQtYG8yX1ZCCis1T1IjbStCR0tlMmM5TVk9MTZKZj8lQWFHI0hzQTMrPyFIYW9wcFo9fHJxNjdOVlU+KE58eXtHezFHblI+TUBIMGJvSl5sdDd3PzwoIW12CishJmxTSi1mSF99b2JzVDFBPXw0Xj0+KGNoX1NtVl5uY3VHU19wT2FUS19WTWk5cUNXXj4odmFgY145cV41SXNubml2Kl9CaWYmeGdTRUJMCituTXpPZUluKGFsQEJoTzRJQTZmX3RNTV5oLXZGaDVwKyNEYzlCcFkwZVcofWZwPGdyYXdUZmhNJTw4MzZjWCtxWHFBbCg/ZiQ/ZW9Nejt8CisoV0FBNnYlPHV8YTlST05FSngjazJ8aHxEV1B5d1U+Qj5KfHQqeipqUm5gWDE1M29URk07Plc1T0gxYllMTUYxeWF0WExKOVNPKHZhTnJvCitaZ0ZeRjtKNClGdlpuUzQyUFhneEJmbzlhd2BYRT5jVHRqMHVmSWVke2E3cUN8dnwtayNEaWJ4YkxnJktpZz9BbXglJVg0MDRtfSoxRzR3CitGMz04eypDTlJjflFUc2t0MDl9UH1NV2ZkP0E1MWVlTitLMCNeUHpidiEycmxjTmN0Qn1fXlA9fmtmQmtnKGJNZmkrQTBMejEhTk9UWjkxCitNJCE5YT99TmklPW5LV2lLKEVxUm50bk12bHdeTjd8bXVNQ3xJd0Q7OV4qbUBiP3ZwPFVBMV8kJip6ZlNoO0xxdm1seXd2YT9aRXdKKU16CitDQTx1cGBJQVhwbEM8Kzk8bVYjcTAtPj4wXm0xdGBSKzMkZUY1Jmo5UGs5JSVGWXt8R3tudnVrSCRgbHFiRzVWenlTd2kjUHFaYT5eak1YCis8UWhHYlN+dmx+JCo+fVIkZUJOXyFGPWMkKm5DLVQrfk9yZEBBKz4zTGFDaThrbGkhIyZmZW1XS1JeUT03Yik8XmphK2x8QStJbnpOTEw7CisyUkB3VU95NkZzZmt1YU0qamVPVmlQeXFWSWYkXi1ZVjI7cVRaI3Q3MXVyWklve2tnJk9iZyUrfD0xfE9YITR1fERDd09oPCV5WjQyUjZVCishPClnK0Zsa358a29HeGB9MnVweyokamhqbG5oJjkqYmZ0fVYrbGp+cXBFbC1QeSUjRThZSCNAOHZSKnhPaVc2MyVfRWo8NTE+V0ArYT1BCitqQns7dGp5anAlcT1kZ1p8NlZoX2RWZnsjVF54JjgjdFUwaTM2LXAhKTxhdjFSZHF6QCQzO0ZgVjVscTQpSXdXTWNJOUhSeFV9PFEpS3lECitPV35tTWEpZUYoZ2V8TXB3NEpRYzxJWHVgNV5FdVdOeGomJX5aIXFvSj5HU1MyWmUhSyhLYEpPfGo5emB4LSE9VkY1UTZGZSZESmx8Pmo2Cit2a2kjMjZEQiM9TE9kOD14VkglbHFDX3VDISo2MjJOaTc3fHxMXnwtd3J9IUN2azA7KFh2IzFTTEQpM2Upblk/eXNGNEhtbkUwKihGN154CistTGRxPHxybHt0PnZqVil5YnlvckthMnV4WHwxM0tiVGJKWiplaHpBV043OylkZW97YnhgR24qNkd8TkkhLWhsJSpKK2pCeWVwajxjP0AwCisoKGJkYkNhSHxKTTNXN3dGMGFlS3tzT2tgWihffXlTam9ufSo/ZlFReChvY2xQaWc+OCU3RD5fcGojZHhTcmUqaFNibnhAUTQhZ3NDZDxlCitMdHYodTdsQlV3QVhtVkt8IU1aT2BKZURXWHZvbiQ8cVIpSDBvWi1QK3h+UW4oVyZXUTlge0diRGh6PnAoeUduRDI1UlhzQGhgIWkhIXtiCitwZEUqLWAqcHQjQT02OzQqPX4qVFJqWFVBbjhJcSFWaUZCQGU0MX1yelhyd0hgVUNpPTVZRmZYITl3PGQ4Pj85MTJoT1hYd2Y3cXAhUEFtCit4dn01MmgpKGZxRGYoNn5PPHRYd188UTN0TzRzPHE+ZStUVXh3cTlPSW1aeHd5QlhFSXErNXpSK3EqPT9Db1ZnZ2FsWnA8MlRTZj5CMkB7Cis7dSVZRntmP1B2WDsyNlQrK35EUU5UdElrPCpMZFR0aWdQQDd3fDc9MFVqanZZeiVoJDBmXk9aVTVjOzE+XjJ3QTdgb0lkUyRCWUVLdTdKCis3SXVyUUNvSmAyKj1QSGtiMGRqWUcwajI+dG01KVgkRkRxd1RATFFAIUAlQFMoJmBSSktMTTxZZFJlU1coT2pfbHJnKnVed1lwe29xJWU3CisoI0QkbFFoV2N0MnJ0bEBURjNsWTIyZnIkRVp7OVB6fExGPDI5bUVuX0dWLTBobDVUNSlzc1JHd0B5OXs1eCE2U21KZz13WiFZNmE/a314CitNIXg0Vj1neWpONCRuSTVNcy0xSHl4Q2B2RVpRdDQ5UHQxQXd2V2Eyb1hWbVg7Q294I24jNU54V1Y3S1dMLV41bUxgUntQZmxpVjd4T2R7CitMZ2taTXE0c0hWYit3ZUxFS18qLU81eXppZXVlbGtjWHg9cSE0VW8kSjEjcTs5eyV2cmNQM3shNS1rb21NeDIyc0k+OW8tV1lFSk85MWd+Cit5RHp2TWc9ZVQwSnIpcHJvMEZ1SkxQPjlOfXBgRUpYI3xkOGkyIStmQ24kYH55ZjlfYnolKVBzSEtyQ2w3eGE1JDZaRjdrRStuR1NFc2FwCitpSWxTUkEkV3w7cWxQT2NjMDw9KWl5eGQpcyR0MUZUJkUkY1Z3WUdvdFgtKDgyPCNNe0cjdGoqMCE3V3dSa05vSTVATkNTITQmTiRzSGJICit3fn5pLVJXSzspRj9hPkpCfnZgU0hOQzZINCg3dykoVFNCT3tnWV9hZX1mTEtZRDZBKWgkU2ZLNTlvMEp5NyhHRSs0Nnh2dGlEUiMoXyRKCitwZ1J+MykhJGVKI2ZKTmBJM3UwMTIyYXFnOVRoVlUlbXFJLUBzfFI2OThabnRHJGV8ck49LTFGTDNhUCExV3g7bzRKZmYkdjEteFctTkVNCituMWope3ZMXiY3JGdOcE5mQnZATVcjMz1eJigpfWZvX01JSFpxNTB0QSRKT3MxMkRIKSphb3spKVRySGIocngtPnxGO20oXih0TSNpYi1LCitKdD89NzVTPmJncEhxNk5BO3tRLWYwfFhRUjAwME84Xk9ZN3lSV3otZzB9dWNKWjgtbns1ZFopSGFBfE5hVntLJF9hQ0IqSlpnVmJoZENlCitSQlp5VUd1Y2x7Tl8xO2FeJmJtPXd9ITtFXkVZcjlGWEclO2VRRTB6V2E+T0BKTFBqfWJqb2dIbzF8R3hKQC1qT0YrYV5lPGZmWXVXRWAxCitycDA5e0NoUyhhNVoydHJudUo4ZUpBZiRZTFFAYj1nKkNHYGQrVVFQc04wYmRAV3lSPCNuXmheNzxed2JYXmApfDVyMnJlZllVOztXKTt6Cis3bzFIalZ1fjE4enF7eCtLZzZ0SWhUMzlPfmhNUlJ4NEBCTGQ9eWVSeG1HezQkLX1DKTxTMFo8dXNPNnJIVng/R0ZpWlhiLWZqVXdOYXpGCitZVk1VUEw/dnNaT2Q9ez4rMFNDNzNSVE96IWBJeUYzfWBNSVJUc0dibC1NKXR2ZHRHbys+OXp8a2F8WChoP14zSzUqZSkycmNwJSQ7Q2IjCis1MlZhKERvfHBHUEgzKHYlajl3TVZYY1UxTW12eS1qWH1XQml3cE04Pl5ya0I3TSMjQS1eUmBoYmU7K2Eydk1zV3ZFT1g8KWZQTjVIJmE8CishfkAjN31uNSY8dHpETn1MJXtfNSk4PEBJJj9eNzhmNylYdDQ4PGhgczU1VVIxO2ZNZ09+RVl2NTVYKj8zfT9gbkpYWUFVYGo+eTIjQSVjCis3fnZkQDdja0NlNH5XVTR3KmptMlE5IW5XeVNnbWJWTWxQWndvNipNK1JOUSRwbnB3Pz9KK1lvK29Aemo8Q31sNyhqcEk2cTZqZDtqTCpeCis8e2M+Y0pwIzctZHx0N09WN3tGVXRYcGN1aWowQ3NrNX1JIU1aKztNa0JCP3Y1fmhiV2V1Y2NtZzUhNmZoMUg8UEtYUnQwUkRaYUs+N3RKCisqX1c5cD1sQG4mTGpiZmBofWxlbD1HelV9ZU0zNTU9JldKdWl3bjY/RzEqQ01INk0jeHdLY1MhY2N0fTN1Y3M+LTRKaCRSN048VHJXNXpMCitNVDBaYzhBMTVyJXZiSFAxWGRRcn47dkA0cSNHYzUtIWIpZ3R8NGJOTCZDPjlKdHlGNlRSKFdVajwmPypJd0skQkd0WD5MbVkzQm47cnt0CitjTmo0Y1M1YlU7aDh0a2gwKWZjdEReWT1JYDB1eHpjZSttengqb35RRng9Wmxuc2hvZnQxVmVIcV9IKVd4RUU0YWBgJkxMSjJhKVo9WXMtCis3N1RNM3EhcTJxVF85TClhNUExT0FKUFBlM2hsPDBlbDgjeS17PllxeVVuckQmQEsjdFZPNEtvcWFgN1NRYX0zRGRNeW0yMHApOzg/YktnCitDR09kbmsyOSR5JG08TkZwUHxRU19xfilUYCtHYipfQ1MwKCNGTjRVdHxwZ3JleEY5O3tlQjA2alIhUlozKSpSLVZZSGcjWD8wPjV3VSohCis1dk07bF53QlhQaXx1JEwhSDFjY0RXamNDb0BQemZhNjQwU0FUQW12XytpYCk8Ryt7PDFySCFKMzl2XnxFfWhqWlQ3Xm8zbGdteGFYMmtXCisoJHV8eT5KcUd9bUxJOzZFUnQjPHxpS2xxYldWZ0F4UX5Cd2koQl99QHwzPVJgaStMN3xrSmMpJFFqbXh9QiR5TW5PXig5eFl6P15NKiRnCis0JHNueGtAUEdmSnQ5am8zRGVtc3FAKktuWlckMFA9bEcoLWs0P25TeU83d1hXYTVpbj9CQlg3JG5Lb0E5Y04yViNeYUJTKlVieFgodFBRCitSREFRNjVwZnd4Vn0hS31XbyV4YkNuRSMxMDt7RCN7d1FzRVJ2WG0mRkU3WkUrYFNqWnVKO25ISFRsPmhYYkBFY0wzYj4wbkJEVmxvezg+CiskVW8mKWolSSQhb3Y/eDleKEkqSys0SkAtPWJ4TXR+Sk9AaWhlTzxMe2pKMD1AWUF7bmNaYTghP0VoUmFUQFZkKmlxRl9JOTJ4SWoxUC01CitORSgzQ0o1fHExYjVPblUlbzFpezFEZTd5TV4wOUBNS2hxfVl2MG1kPXNOfDlnU2NDXlAxUUR1LTRWa1hvTU82eGN9fiRWPWJNeEpmZFZWCiteI3leV2pMIyM7UjV6fXZRLTloPyk/QzN8PkFecU9pZ1d+bDMhfGpOfnNaWThnVWpmQ2E8fWVZekZjQWI5a2w+R2VvJmRxSGpUMGJKayhhCis5QGVoTHM2bWcmUTZzZE1HTiFGa0EmcDh4aldIKmhZMUZQJW59WX1TIVNNfDFAUHMxenhqQzJfS2pvKFN1fnRDJWp4QUt8M1NiZHlyZEdsCislYEBwUzVubFgpKjMxUGotbnpwfV41PlJFRjh1YDRoNl9LeFZ1b2tuPGlZZWwwSjhxZW1CQGd+TUUzZlNvfWRVflZiOXFYbXhrcU1YdDlmCitNQUY5KlBebmolVEw/R01taSZ5ZkNfKTQqO1diKHMwVGE4ek1Ea1htQ0UjVDNwVCshTGNCJkA7cWZnI1U9VGpSWVVfVVNfbTRFNnp7bmpBCitMUnBZUjZuJmRvdEFpIyZWVW5OKjV6LSVIWVcwcEllZDgxUmdaIWo3P000KnNXeyRaWHJvX0N4bEd6JXdrVjI4KlpMdWdJS35rSGxAZVVGCitaalYpXk4ybHMoTylQJmY8a0w2KzgwQ3BAQzJNTFIlOX1LKU9IWXk5KTQjQWwxV25SaTU8QTN4eWtGT3pPcDxZYXgtNzJPUyQ9dX15d2t3CitNVGFEeT8lNHlKZTY1ZyozSCpJe3JtKTgldyMzc3Y9bysoMUZGcnozaFFSSSpBJFowP0hBckpXcEx2dyZmYmh8alVpcCtsSGtVOFZMXiNlCitCaVFtbGYyPTJsK1leNDgtTGtvbEVjJFEzKVRGVip3ey17PXwleTJrYm1SJDVVOU44VlpnbDFJUmRWakJSZGhRKztOdCYjcz1pNkJ0cm95CitpdmpIbSVMVlR2MUskSkFuP1JeWE49Y1UoUV5+Kj5kaTdBKn1CeDNAYGljOW9QTE42OG8kUT4tUSlrfUBrYnZ1R3lUQ0U4KGFfZDZQPV4lCisoNy0tX1ZhPH1LblBhKCFYREh2aWJhOEFaX3F4Zn1RISY7UCVyK3JJOFEpS0lnQDVOME5hdnhuTTI4PGBzeV5vSzJvbChVSH1IX2MyVWpMCit4T2hEPmBEQlBYUUlvKXxSTn1RakdkNWQ+Q0x9ZG5yWDkxUGRCV05ZYUp0WCVTaiE9JSg8NzRUKXpKNHRqdnB+I3hzV1R1Umwwamkwc2VwCis8ZSgtdyooUVd0ITBzRGZaeiklcChFeTtXT0UoczE2eGd2Wmc8PHF2fFpOZkhJIWpIUFh6OX5Paz47N3JnbmZhYjUmdyRsOH42SFNNNDdgCitvclRkcChkMS1vWWhDWj5uNzMwelgyM0NuMkFMNj9pSUxaSlJhTj5KXnhvVHEqSTJGN3RMYEhPRll7ezdvJj5qKnVoblBoSmZSZUN+R3FJCit6VlhsSWI2QClLP21MRSZDSyM4Wmh8fTtXVio4NCh4IUBVVG51VERpdiRufDQwJFJeX348fHhRMS1NcTlMLShrd0hPM3N4QXNkanVsTjxrCitobWR8VHJWPXFQJVVpbF9Ybl5ufiUqPTlLKyMyUT9GQTU8M2N4cHQ1bHB2MDNhTEVTUTxKP2hVa0wqamUpTSt9ajVPKDJMT1lsOzNCUkpQCis5N2smentaWjxpMj9HJH57VWYwdiUmenU5ND1mQzhgdmQtMn07aDAxYVBPNDhCQzlGYkpDKG9iTFBXV2dMTChNMV9hQ1Q7KHBZMyNyaX1wCittUikwUGdpJVN5WC1LI1haWEYmeDVDXmIjLWxwPTk3VWdDcFhIRHZJRHw0bjcoUEtNSylCSXxfKGMwbnlfVzVNNzt9fEtzZSVXaShYNm5TCitHV30hcm5VM14jKiNBP0NjU1dwTXZmeDhaNVhTTm5vNXEqe3deey18Qz1UbTxoYm5iRX1TMm9HY1cpezJGbFgzJnFGeHI1OG5xN3woT1p5Cis1Vk9neXold2U/JH5zeWh5OEZRI2Zqc0p4Nm1fJC1jaEBjJH47RXZvclloJnl9byZLX1FUfjdpKlIqSmVhbndneERpeURqKXk2MDglfmRRCit3TUxDRU57fEJIS0NrN1M1X2RBIWl5Z2hBcVpDezVeNSo5MUlgUCMxT3VTUUA1fCtzJjJ2N1ZhYDVOUEZYeFQ+JDBzYCh7TkJKeSFTZmNXCitlNykxQyFIVlZqaGJfdGZFdmJPZzU9ez4oS2o5alk2YGg4bktsPjwyaitFRzkxSGgzVCFfPXxvd0Bxb1ItUGtycjtZYlB3Y090cUJyQmE3CitWak1zbW5UU2ZyMSZrYiZAcTdCWk5BcUpAbGhOJmpRPTRQS2YrYno7KG1MUz84VCt3dVc9Z2FeQjkpLVU1REliaGA+KytRMzVGQUd2ZkwkCitDRk84IzRgMWIteDNqeHJyQytAUmJ7cUUpOHwoKEcoLSY2ciozVmxWVygtb302UmdLfGYzfjsmWm93eUh6bGQ2U19LSnJPfWMtOFlvI3Z5CitsMHlEMjRrZHNUSjxsTkgkVm47SGB2P2ROJXVuOSpYMmokUXdMWjB4TW9Le0tFQl5aTGEqNCoxd0ZwXlF0PnhfeD4oJTMlfjZwazdLd3gzCitFaTJwdygzNkZNYFFoX0RkRmk7NTI7RTN4M2prKCtaZXd+dGZ8QD03ZnpiT2ZfaFc9RmQlI0p3eiZxb3pCS1Q7KztfWSUlaWBWNi1RdjcmCisrRXZPPXliZGt+MipeejFsQVhyP2NaMGsoPHBKJE0lNCE/OGU4cn4oPFN4UyYkLVBzUjA1JXZ1aGUmS1Nfck5pI0E4WHAqWFN5P19ZZVFyCit1O0soVCs8aGk4VE5fSnMjWl5lc01GayE9Mzw5UUtYJkYyd0FkLSVqMDBXcTJ7Zl8hX1NSZkNzeGc9M3hFUFBkfVl0WGFrWlpXalp4U1p5CitAMlhhTyFsdTF4SkpxYTVJN24xbGdeQVkhUD9eTGtIODNxWGhmPzVYWn5iRkNtKncjbHYpdTxCTzhnIXwkUDNxQHkwSzFXclJIdEUtPnIqCiszMm1TNCQ7P0A9K3JMYnhsWmhyeExwJWFBfSVnTElPa19LbWx3JFZRcj59MF5aUG4qIz9TY1ZJV0Y5IUU3aGM3MUhjJGsqQjAtTUljb0stCitBMUBULXphaiotdHZgd0RxWmwraWdzMmh9V3cqMktnWC1IMDc+SXlWSUFeQVVSdTNBSD1tSFQxYkp9Z2ZeVTI9NWFMS3tPdDNJVUstUHtJCitBLS15K1o7WjFgYjlyRUUje29YazdOWlpHczxEfVFiKGJUKiVDZGtQLT1MKmROaEZ6QTA5WUolKmhySTthNFZ+YFR6PzgyI0F2TFNfPG1XCisqey01QWM0QG5rQ0smdCZIK250Y3Mjd0hSfChzM3ppXmtLd0xLQ19JWSFkMzsjNyhXNGQ0O3wtWnsmIW45U04jY24oJVE5NiM1TFgmellqCitGYTZwNnQ3WlM9YzVqSlVhKkVPfnB4cGVNaChxLUB+XjJtWlh7fjkpQmhGZ3d7THdIdlhqO0h4Zn4rVH49OzNQX2VweFBWNXYtI0c4X3VNCit4azBhPHdvdGA+SSE8UzwocGIod3xyKW1uK2grOFE4Kmo5aDB2bU45SmZhYmhwcFchcUNXWjJoNytJQygkUVQ5YEhwa2NARFRWe0hOQygkCitldHFOUG9aQCREZDt7YCtkKmkhdSlgY0xMMFMmUVBjS3s7Nl9VNWhNN2ApSG8xe09CTndyZz0yJFdtYkBjY2pvSElMcmx1JUNjS01zMkIlCitid24yXjxfMkJqJEE1I1c/SzAkUDFBc2RPT158elJhYWMyaHZNNG1mWihMYXZQaGlpQ2l2RFBMIXFISDAlRERSOEJsI0FvaztIJEMpV30zCitvPjxwOXJ2dVVIUT9mazB8XnRaZX5BZmwhPnVeQjFubmhySkJjKDVCS29eUGx9MzVwbX48R2Yzd0hLNTg7TFpzPEg+Yk1iNz4jMXBqbHVgCitmYCV1WTJsflpqWG02bHMlUDVUT2lUPkJgI0pVNm9McEhlQzNqMCZ+QUR9Nj03SEE7UWNOQEchVDRIbVVhdzt1PVlaUnAwaX1WWVBzeUByCitoelZ+KzZkV29CfDhvSSZ6VGdTZllVTEM+MElCY29xcDJPcFFDPXJXVk1GcWRpdU9JXj5lQ0NwWm5NI1oyY1RmNjdlMzhicz5GLSZ+STMjCitBNFlWTEp9TTdyJE4pWHRZfEVDO1gxPCt+NHkqbFhNfVZxLWd1eG5kJH0qfnpkKyYyVW91RkI9KVVlYXxoQE9MbisoNkFDbmtRPTYpfj1wCitkNHlpZyZHMzhmaz5CNmx1MUZMJUM3JGFAMjxkSUhDaW5JdiEjOEFPb3dVelpScnltejY/OXJUN3g9UVVXVCp7WFBodEMxS1pVKmFJSHxDCis3aTEmNnxlKnVWSCpsJG9ranQ7PmJaPSpmcjQjbTlJNDhCP1JgNGdRaHxQSFJkX3EkcEoxPj4xZW9sRG0qMF5TcHpqcDNXbkB5S3JYKjgyCiteVEtQTHwkM0ZfWSs/aTNfaih4N1c/cyRYdChQZWxORXNaSHhjdD5hZCNzI2NgR3cleEZQaSpGTDY0d1lLaGlFQWppJGBGQ0pKSjMyVGF8CitIaThPWTBIMF5Je0YjUWlIS2o9cEoyVFdKZj9HPzZZKEtQTjdGdCM0STBQJDtvWXc2ZSRJQkUxX1AjKDgyK08rK3h9fV91N1dTYSozZj5eCit3UEUlbilWQW87TUdiQGZmTmlEUSQ8NDd9dHNpYCM+I0dMezhtVDwmLWgtbDdGc1IhOSowPCpQSEhBJkswXlZyVUJsUktZVn5+JWR8RzlwCitkMmg8KlJzNjBhWFR9TyR9ZEMrUHkoOGE8UlFzMl94VF58U1VrOzhIU2FXVE1yY297IWs/TzhDS2M8NUU5N3ZUUV5QKWg+QDZhV0FLMm10CitleTdEb2NKJmN4RnEwMDYqejAwMGpGMDAzfWxhNCUkVWNXIUtOVlByMEZkRj8mQGJLNXFTenglSmlEJnJ5NSU4Yik/WilWLWA/eGt0RV48CitBMXw7YEMkM14pYSp2TnZ0VlNPT1VxSkgyMWdQYHY1PXlxLTNXJUgjQFU7bm9jODt6e0E3QyF9fHVqWHpIfnsoPyE+SWpaOU5mdFQlUGppCit0SXwmVyFLNy1lOyp2Xj1rc01AelJHbzBsdTZlWHI4MTlKbk9jPl9tSER9cD9JdSg5P0p1Z1glPWZaaEV7a2V1ZXkpcVBZX31VfSt0JjhtCitycCgkIS1LQD47TXcpTUdnQGZCKVRpZDBUPiY+RGw8LXRNUVkpPWpaZGB1JSUzaF91KF8xYG1re08hfjheekRtdGFWcCs2b2pqMHRiR2QyCis3ODh2PzFHPDk8bEgyV3FpNn5KOH0paSVXQE5wRUQ4Kkctfnx5SlRKOE5SQE89Ml8hSEJabjgjNmt0eEJDUX5MZXo/djRDPUNzcGVKJmA8CisxdzAyQnV1bzxMRG8lME1gKVJHWERSTHdIQ3RudSV7PW1BKSZ+SSYwXnZ6VSNXcVdvZiY7LW84SFQtX2F0UVNGemZaTUp3O3huUH1FK0JqCitycnNgZWJkWWllS1NKVU88Q3Yzc1lAWkdhfSF9PVBIfERjYmhhWDBHfmA8UXt6PEw2ez1NOyhOIUNHbyNHUGkxVGNxNXJLLUV5SDElOTY9Cis9QWk+dnYxRlNjJURCMD5GeDhFPVZ6fjhvPTx9YkJuU31MMWxZc09XeGtTZ0okUVh2JHRMV2YrMC07SXMkNW9XM1F4bV5VMThkTTRTPm96CislVT9KM3ZIe0cjJTN6QSYhfUNwMWRCY19VSm9ERD13Z0RRYXVwfD14UyFkMClZPXxJem16JWs1M3x8TDQ2fGZMYzIkKmNoZEZGTUo8PUxpCit7amZNR0Ryc1B3ODF9eVhUP1E4dkdBQmU3OW5lST5GSkEmWjhAVTU4UnFkbVFTMjdEdmMyRk5rOFM4TkI+SHIqVj5taEpRbTFfWHdlbGA3CitpZU10KXQpK2RjaH0kK0JoTm58SWpmIXlmWXRgSn1HZXJZYCVUO01wXk53diNlJE5CJl80YHYlc01VPGBXIUZJP2tObzJEPHxIKk1XTGE+CitLTn1UYklwZHAzY2h4ODE+LWJBV2Q8ZnEjKEkyQWByKktMTWRWZHVPbn1CTVRKVSUwP3x4RkBLNCYtdkBQJV9aNGRaT1peSkhHR2hZRnoyCit7ODVMeSRjK2ZtUEtfUGJafmFJODRPQHg8TmpDd2E7KXBCWjhzS0FldVRkK1ZYbkFZV2RsPnl5RWNJZHpvMkp2bnBXOHcpWX14QTwjSGk5CisxPXxWTXpHfndzaX09WjhMalMmenopX1hSMWFLR2J7Nj1ubyFKcn1qWGpoV0QzaEo3ODlyTFdzVkM/cjY9fUV6JlMybUxxQHFVNWB6P1RVCit1LSgpNXhIP1ktVXpyenorJnM2X1QoK35aJEMhMX0lO3g8fGRDajcqLWo7QnN6O0RBIUQwV1Q2SElIbzUlNEZWeDN6bmNxRFdBZnBFSFJ5Cit0LWNvQnxzZEJLbmAjcCRWdHAxbWZoKFRSbiF0Q0p4Ql54SGk+ZitFWEBqU1ZfJD5rSkg/Sy1kR3cmREspNHMxYEt7Zktxfj5EQ0xiVHNwCitGIWt2ZU1+XnBGdVozYX0/YWckPioyMENrUWI0Sks9bTMhNndOaGBLMnpaKmM8QnRjczlQOXFCPDZMcHNhPzJfbjNZaFk1eVohKWtvcjRqCitVOEdre3REN217UyVoXnRme0wzeEJWflNXcCk2cW9Ne0VTeUpeKkooWFFlTiRoeilzR0lpSjxPcW04M0l8bjVjZ0c+Vmo7amRQaXQqYFAtCisrP3xOS2l6az05cTRSNjhpUz1ZMVNwaT4qZH4hTUs1djVeTThtcVlLY21xMi1jc2pMVEw5QDtPRj5DO1dpO1IhUClmfW17WWpCXyhIdH19CitgUTs2V3NpVHdEKj9aT1IkUFBCfnRoQzE9cmB4aHdCbiVrbjlPaHMxWko+dSgzPDklXl84SHl9dGtZME1mSXV9MCQ7KEg4TUZFZXsmJG5jCitEKHt4Rkc+RWh3YXtFOEJSJk8jdUErNTdWQzJoYWlUKXdNaEYyPSg+a0xmQ1YhZzBjTik8cz0pe3NsbGk5ZWYhTE18cSt4fFJjfjh4KVBRCisxTHBgQ1djXkpiMTIyZC0qfVVOMDBIdEJ3X2E9XzY5ITF8TWtwPEVsPUAoTiMzbkREeUZ3V04kfElfd3I8cEVKZWxGVG9sS19pNyVaanFUCis1aT1UZFZRS0AoS01LcztJNH1BZkx6N2JITXFCeHdPZUNqJiUqcCEtR2RkOGY9biZpRz50KS1FTVBsO2IrJG59ZngtNUshcTxzP2k/bE18CitnQztRZ1pRYk13Uz8rXjc0dFlDZjk1NyVWO04oJX0oOEtqRyhUJGBwRipMPj5kTkpfeE5jPmZ7V1hlPnMxelNfIzJCfHg2R09IfiheO2FeCitfMHA3Zms9PDV7VkA3a1dhe2l6LV47b25JXjRxLWdgY09kWVM+Qlo1TE9Md3F5SnMyUCU+SUhvQFVUc18zSCFjb2lMK2ZkYk9jUllqb0c5CithVGFxe0YrZEA1b19aOG5BUGBvKDdfbW1VJG1ONTMzS1FAfGVuZDt6SHA5NTUrWCpeTU0rK083KHZYS3h7KDlmJkxwPiNtbSNITV9UclhuCistMF9NRXRVQHBmVWJgPkxLI3t1NUdlOz50U0cqMGhHOFE1JHJ+VFF3MmFZOzt6Nm5DPCh3OCRNSHF5SzdAZm5zV1gxO0V3Rj5GSXwkSWwwCitQK1dkSEFtRX13TT94Xj9DUiFUWW9CQm5KUn1OfmMhO29yaUQ1MVBpe283M01pdTBNQX1qSFZuT0tTMjJjN3xKJm5KIURETlFDMGVkelpUCitfbUg8QFB1bXRgOVFYKlV5MXFzKFVjdjBaVTtFPHQzQllIKylvMHlDRTx1fXMmdylNU2lEQCpNQCR8V1czakxqTndCVXM5eShIKXhUM01oCityR3g1bk0qU0FALVI4IVh3YFZyPCttOVUqTVNjfmltY2JBOVk0QX4jKDFRSDMmUiVFVyp0ZkYxe09YcERTa3F8QD9wbE1UZyVONVpaN2BECitxdzMoUkVAZTFAdkc/RyQqTHhmRmptI2VxK1BXemRzVG4qJCRiI0l+dzIwdHBsYVR2JTUydTl2RVhBflZqd1YyTHVzMUErTEdfVz54fURACit8YztwKlZkVlYyQmJVMTk1U0M1QkotKnI9cE1sNzFnRSNTXkIqSmJnMDFVNVFpZXprditiNEU5Kz0kcVdfSTJ1ZyZmaDZBI35oY2thWHkyCitAZnZfMH1jKF9JTVQ8LWY/IylodiQlaGdxY3ZadDRoR082M3FuI2BES3Z3K0RWRkhIVlNgR30oRT4pP0wwIzZqcVY1YDtxUX1YTz9yQ0pGCitwKHZVfEJAPGAhITl3ZG57ZkE5PFl3UlFwcSooOE8yWTh6Mlg0dWA3YiMkT0JDNFByb0xWT3NJenJyWE00STFHe0BHUWxpRnIxbUNyV319Cit5UmdUaW1rdGw8MTJ9bzk4cGx5PEVIciFsb2hFbUo0P25UIzckKj1efDlQUm4tVWBuOW88NXhwMXJycWRxXlcqcl5ZbWQtUTIlNzJYISpnCismcDRINkNUZ2FENG80QVlYO2N7dWw4KE9aLTlNR1kzKkh8SUp+NygyMDUqUGJOdVROQDctWkg4ZWVuWE9NNVc/UVQhJFpgRCg0Q1B8NilqCisjSTQoYS0ocWYkK080cUBxYHopITQ0ST5+VyVmdV51KU1haGg5OU5IKDdPSkhuT3Fye2M1WVdCKWFxWjRUcmZ1dWFkSDR9d0RMd15qci1ICitmWilFPkotaFpiQmMmIVZnI09xZl87RzA3c3A9PW80YChuU0l+Vj1fLTArXyNpQWdNO04taXNNKj5jVWowdDVKRT93ajUlI2ImaD55fSpyCis1MHNXQkRkeEVWb0sxTnBPQUopZDw5QCF0IzxhXlomKy1edER7eChoNklqVkMkQjZ5dVNsfk47S2o4RHBHZStVKUVzTz1PdEJjVnYoUENTCitfa2t6dFhMMz13QE83c2pueXZTNjBecXI7e3ZeVGBfbnw9dGFJQTwrdGtTTFowO0hAPVJsV19sYHokJEFjanIybHNPYjxwM0NzK0pYOGBACittbkU+T3p1KGVyRX1aQiN6Qy0tN3Q/USRlQTV1czZ8Wnp5eylXUmUmYEpfTkQ+fE1zdnk9Uy1+NjBfREt0fTYjU3NQWGg3MH1ARCVIOE9XCitARSp4azdVYWxVTjBzSmgxQVJgJDYtazQ+MGQ/SVheKWVKIT0xe1pVY2hHbi1kJEcpNU85RWR3WXIoR2g7WHo7SGkkeGdeVyN7ZWgkYiF6Cis/ZikycU9NX0wqdytwJEFQcntNYSZmaW90KXpMXkdebysjb3QkXiU3aEBuP29HbkJGZ3NQPD8rRTdaKzBmazB0UUk/I3pCVmVGYzVLTkMmCisya05FN2hLbUJWVjVNOzxrT1ZHcTtQRyQ7ND5tOzdMaz1IVDdLNk17eEpDe3Y/OFFWdGc8c1o3dW1YWHdOVDdhNVpKMzZNTV9TTHNQR2FnCit5QTxrP2g4ZHlCc2QyaFhpaTRJa1Nke2xyZTlncnVTPnRxT3hDWmQ7eig7ZUUmO0BQYzA9dzMtNmcoZzlzaH1VZTlqbGdtaU47ZDA0RE4xCityOEskPHMpMVRxSWZWdTJBcnshKTtXckA5PGVAVjQlN0pGKVlFazBLP0d6Nz5seVRQQm1DbD0yRGZ6YVF+MFRqSzRXZTZTOzQ1Pk00O2BaCitQSUM8P1M4XiMxJEleX3pFe05oNmU4MiFeRUR6WitUcnNFcW5mMWtJSWJzdjBvUnBzPUcyTGFSTih4UkJ0QDQzLUIyWTV3UFVrcW8xe0MtCis2TEZaVUlWI2V4QCtZZitsPVBTRERzJiZkcXJRU1ZKcmIkIWgtWT1GYjxnWVRrd0BpUzxOTjhfPnd6d1ktRkF4b21pSWtiUDM+QE8kPzM2CismbFR6I18tUmYtJU8jdVlUdkZoTHMofEgtTUY3ZTR4eT0tZ0Q9WGQlVU10b3hYM15FWj0lVEN0VS1hRkomTlVxV2xJeU9nX1d3JkNFV05mCitVKElOKnVEeEs8Pyoha3xkZSgxaVg/OWdkV0xBUUt7Jlk1eGEqdkU2fGcpSXs1MncwO1I1SXVZVD01Nn0mKXl3Qm0mP3JsPm93OGE7Qmx4Cis9NW9KJiY0djh7Xkg0LTloSjxzOWcqMk9GWm1NR1pLaDBEeGE1bnxneTBQPGpkO19Ib1pIJS1NY0pkTiRFPF5QYV51V3okdXkrN1B6PzY4CitjYGFrJC0wQWUmISEjNzM7X15uZ2tTfmR4fmAreUZ4a34rR1FXQGYrQmlIKVNsOTFaVXhHWTVpa2FYYCt6SU1ibkxlPXFiV3c7QUJfVXdyCit7ZnRjLUBJPW1JSWxFfUVfK0plej47aFFDRXs/cXV+JFE7RT1TV2tnK3RGXzMpTzR6e35UWnxjdVQxWGlofUU8Ty00QXQ4IThVQW1xYEAwCitiKEB1PD5lZzNtOS04aUNDVDN7UjAhZ3x1WXdUdSl0c1RIWkAjJHwmZl9rYzklfGJpeHNyY2paPVBYPFY2PEp+WnFYNTZTbjNEYHolZEFxCitwNUErUTx5NzJWcSYqQnh1QTQ1VVckMEM8P09YOTVRVjg+SEJON1pXI3cxYmBONGhrPVQ3aTUhXzBXNlN0SnNKUjU2fkltYURGYjs4STJHCitoVjVlUVlvQjFFdVUlVVdjfWJ8fkJlWGJyRCU+KGZUWk4pfmw5bW5BcXpyeCQ/TzwmYTFANHkpRH52YyRSdUtNUikhRD4+bWBfIylkfF5hCis+VWsyPCtVKGleWUlFYigxcTJaeU5OSFFRNTg2dk1+aSN1clkzbWQ5WnZxM0pqN2lHU3EwTiRIYH1aYlNlI2s2b05AKHE/ckZtd09GeHY0Cit7ISt1M2thYS1MYm1XUypLdVQoVkU0UnN6PihJdWxKbChONmJiOGBvMilEX2Byez1aa1EkKDVqUUh1SEpLJVZuOFI7Rlg/QWRieHpSLT5aCitEc198bnMwJnFCekg4fSNMbjRFZzJtaHpTYmQwPCkhaClFJT8qKSgrI2h0aENwaEQ/ZzdfVFNFc2YkND12TldpMzlRdk9HPStxQ08lLUspCis/dlNGMlBpYmFpWHk1MFModiU2STklemxUdTRJR1BONVRQNGo+fXVOKSRSNHgyMHtMZ093QTwxNmM4VlVKb0F0JlJ4ajVePzZBbU8kRF9sCit7bWpSZXEobHkkcTIofCVfbjQ7M3ZaaH5PdklHTStxc0VXVXM5MCRnSXtLKWFRPSN9cC1+djZhR1JzTG83b0k9YUN7Wj5+YGl6IXFDcEhTCitIZlBRWVVIUDApeWU0V3Y+UFY4IzdiKDZPTUVaTnF+NF8oNCQ8WTN3Z1M7SWt5Zm1Ac3J8WVR2NG5Jcncpb2tqZV5xKzA5KzdhcFk5UzB4CitDVXI0UzRVPTEoRzFrWXBwXmxkVGo5bDhGbCRfT21ySj1PUzxkK1B3OGhARU5KU01gQz9pUitmUEMrZEtSbVhURjQkK2ZsUnt7SVgjfTxQCit3VStJdyZiNzY7JiY3QzNuakc5VXAwJmAkTER0SHZzcSFfakVWT09xKSlNTFZDViNEZWRMO2s0UCNaajk7SFFoanE/aEFpM3s1Z0skLVVGCitsNn1AM2BiNC1vckFYR3VJZmlUbyo1PE5GSjlXdDNye3dpRFRLPEczaE5eKVlwRkxBJE9iY3F9LWU4UW49O3ljezlHWjUobmg4UD40QiZMCitYMWlQKTYmJmtXPSN5dyExYVJQOXw9VjFePHcoUGVWbzIqYVZ6KT9AeytFezUqT2FxXnxgV0hBNCFwbEJOYF5Bbj5jYSZheFVsdDJXXmJ5Cit4O0BBfGdGcilRODtrR1NjfUY1RCUjV0xCNXRDNHVBISkrJmlaMWtWY25VSWJtbU5pfEd3fm8tQ1dYK3ImPyUzOXViKk4+fV5EclklK0FtCitORnV4KnNze1llOEVydStPNikza29lSXdARmtnR2c5OSlfXiVjRWdgWEVJViRNK0FoZFNuNVg3TVF7Y1J+NFNqYGJhO25ZWihteTlnNFV8Citrb2VVdmYoJk9JbG5RNUx5aEFVWWZzOVRmTkArZzE5QllVRnohdXEqKjw4bGEmcCVeRHtOdT5hbSlKR0xCJWNER1o8WGNebWd+Yn0obVRxCit3XzxlP3A4VnV8JnRAdTtgbz5YVEFfLU1wYCtsUlBjVDJjTUl0Nk1wYTJaTUNoOFJvWVdFcUgwTEQ2dC1QNkEjRzJzWXE8SCREbnY1ekImCis4cHlYUG1NJThfX3Z1TG45NktSUExAdy0zY1Y/WT9sXkIqY2JqVCZIWWokM2NgQ2BKJVc+VWpPYSRvdGJIcU45QjUtMWUxYlopOFFtYGNYCitvPiF5cFJ1dClGfWdwXkZYcz07bG5oLUBsLTU7QDNQI35Zd0pVRXVme1g3NTg4IyVHbTIoV1ZnZktRMDt9SlVDanhVQ2huTm5KMGVud3B7CiskfSM+RWMxRFMyTTR8NnFIR35kZVoydSNhVEVQbGoxdUVGUW9nPy17MyZpVlhtVTBeN30rYWZfczVeYTd1bklUbSghbnJ2KXh6P0BnYlUrCithPTJFIzc8SkhzYEhSYTxyOGsmLUZZRWRtZ2hfRlkkXzBkc3FYdXdLUnBkTlVRIWshXlF7e3QqX2ByJT5ZIV50NTw0YUhTOGh5KD4wUTNiCisqUExMYyMzakFVWUAre3l2bVF2byNSWUdVJnNGTn1XWHE9KH1XRVZlNDNMNVQ0O3dqUXpQZn1HNT9AcTYycmorRWZTS2RhYWVpN0l9SiljCitiZVIoQk18cXBDS1YydCFCWDVTe0dXPlN4ZnJOVn4ma2lsdE0xRisqeX5PPWc3MjM/SE47I2E+THJ6VFlGYV8hM3M/PHVsek1KWGtEKHAoCitrcGtPVl4wVyV7cW9QRVZoT2dCc1Ihd0FoNTEwcjUzKH5iWlJDKEdnKXo2UHBUIUl4Mno9QmN6Syo3VFAjXzN0cSU9SU9KaTNHRVI/c0RTCis4YTlwPUwlaG9ULXIwaXFeRlMtMWRHSVgmZG83NHF4fCpOR3BnfnA5anJiMERRalhIXjhrUi1aXkR3TkdoWExRJDZZakUldDh0bz5VP0c9Cis5TGp9JGY0VjJ1TW1IKioxOyh7fGhpfjdaelIkZVMzO0piM2dDVitFYHdhdiQ+SThqMm1aNV9kXmZuOz8jJThlbGhEVE5oK25rT2k1NE9HCitEZ1pAI3c4Mj5qRCNebHRxIW5ZVmFLYHNTNTBMP2AzZmIhSU5QOTNMVj54OTh1NlZeeiRKc0B+UV5uJVFZRmlEZ2pgbHNVdChUUn1pSV9YCis3YDhDSl5+VS1rSTJhMGc5QmxyQi1xPkMmJmdLNTZLcHREOWZkYnM2dU9uPEw9TzBtVHQwMXx6ZkpWPX5ScWt4S3laJGI2alo8SDdXNkNMCitGa1U0OTB6IzxpJTN6M0xHcX4paEYoZ081UVIjQEJ0bG1vVnJiV1lVKXlnY35mOXV4ZVVBckpRXjt6cFAoVWgjbEFpJkQtTHJKQUYzJEBLCitybksod2pRM0p2N2dBaGpodiVnS3p2eCk5alpTQj5HKyo5Vi1vUUhgeCZfYktmQm11VUFRT088TEZ5RTxYUyU/cDBzbHlMISMmVDBmfEBnCitqJlQ3Vz5KTyhxNSs2bXhrWkBgajtlMUxCaU51dUhpSj9RSjJoenRreXVRa0VNMi1kQFFZcWw2bkx7PW4kQl94dDNMUEpvdFglVE1oeGxFCitOX0gwZ1hUNEZDZHlTOFRoTHNvV0RDbGFra0pSTDAxWHUtX25gJGBBdjBgPzUlS047e0p1Zi1VWmBAJkR3PEduNUlrcylmWEJEU25JakBgCitYTmhaNjtUVX5hRnY+S2N2aDRPYG5eOVJLT3gxfEFhRTU8JGJFYEZ7bnl1SmBQPlpiUzhwKVo1ZFJVTmZgODgrfiZAVDJ3ZyhuWmJldzlvCitKeCNaZGJAamdFUCR4Qm51dXpENCQ8bzl5akhQWT55dnxAck56OUhUcnt8UUBORzVSNlI4WVM/IU55SWZ3MGZ1S1VSSHRPcy00cHpENFAjCitFJipueT9JaXlEPW4jUjZRJjVaYXFKZTFVUFBNSU44QlgzK2BZVTBRKlFVe3Z0WGNPIylVJXZ4aFhPU19SbV55K2p5eGJCcTI7em0mfT58Cit3NG8qPl5teDhsVTxVMCp6UTl4M0FjKzVMUHhZVUB7TnxNdGE5WSozbU8xU09FaXt8YnEmT0lyMmx3JE5ePUFQYVBrYlZ0OTNMTX5jWjBCCitZOGJRRWE9fFh1PktpN3BIJE1DP3VWaVREeURFLUB3NFhhSGBCN15vZVkxSFlTOXF+dzxnOTw5fTVKamZYZTMoUzcqQThFPlAlNWd2Xz84CitSUWhmR2g1Vjg8VzckQXRwKDc/OTU7aEN4bTJAfDMxNFIkeShyc1cmR3Q9TDRiOHpENjBIbktjcWs5fE15RE9OKzB6RWpXYiQxNlhTWjVTCit1Wj57MzlALURhVm9NX1J9Jkg8TjwoWS12UG01Jnt2IXdCWElRd2huTGFoUXs4JDgwNWV5JnNkZDQkTDFEMHchYFBedjJsXng2IUN+NEdICisye2hoZjxiT2BKKWRgdGp6UjFJITFFVmJvfT1HbWlvbDsmdXRGRzNXKk1TbXAqdWsyPFB9cTw2PjlAfXMkJVU3JUsxZ0g/Nyk+OERsUDdSCitCK2ZERiMoZmx7NTJQJlNQOH5BZWtWM3sod2daZj8pR0FDZWk0KDV+dWF4TV9UUyFeeXA1ekdPYUlZM3NqZ2FlMnlCKk53QURfd1khQXNvCitDVFc5SGEmMC1HLU9mQjE5OEQ7WHJEViZKcXVmPTkzM3x7eUwmWGUtbWRaUEIyQT1Zbzs9cCU3YEdZRnlBWDRmWCRMUjU7QnIyKjkpLUA2CitCZE5oUm93MyojO2A1TCk8RGFoYmBecDVzKjZKTnE1NXpTYFBNOHlfR2h0KU9LY28+aV5FQWxIPjB4NFJIcGZmWSQqXytfeSFEbDlud3dFCisqMF9ifGpwX0pCRChTLXBNR0tHNFZQUU5aJUgrJXZvck1ycTkhc1o8clZ9ZkFCO2hQJlI5RlRDeVhHWFZ6RTBmQ0JmPyo9NmJDJDVefTA4Cis5UUhyNFNNWGllKF5LM2ZXdWpHaC16VGtWeChtRnZeUF53QDB2aX5EYikla1ZWc1hPdntsWVROPjlaKkRqYjhVYFQjc1FQfXk9IztjR3BaCitYOX1FWG95bTEwX3t3NkIhamBSX2t1JTdGUldvWTc7KEBqaSt0cGxNaEhSfDgqb2pXWElAaTklRjhKeEw+VyFWJDk9U0FhaHtgJjxKOVVRCislTW9HfW89PXBZIzVePCopJSEoKVVKTWglXnhXJiVreVVrN3lmJHUzYnN+NjEyeihAVDdYZGdLM2EoVUcpPEgmN0RtSk8jY0JqZHJfTlMhCit0NE1qWDd9a1I7IThDZz5rOGkwNkEjVEY0RCtqcW1lM0AjRElHMzA7NVp3c14zXmNWQXJYVVFjJmtaPyt1NT0rcGchSlUqWTliS0BHPSV7CitBeVBZfTQwP2Y+U0tKaGU9YTBnVzJodCMoWFBjSmI+cmIqeTsraik5XkNJQWxtY1JtPlktc0VSOyRfVHVpWmkyeGIlQ1A3OW4+ZF5NJSg4CitBVCl4e2JoOG5ie3MobmRQVzgyaiZBWFBTQ09DbT92WHFkJkA5WD82N19tZCV4KSNHK2lrU2heTnptOGZeXjstKGQ8NVN7cndLKVpYfSs7CitBOEVNPHFwSlg7OUFsVjc7IzIzNiVZODZNPH1uYWAoTl9RcD1MTCYkTk9pYjQhOWxiOCo1e3JNMktCeDJue1FvQiN3ailIPVdxRUttKTctCitjc1hJUCZfU1lXcnhiaVBMMld2TmY7TnA1bzVfNEB9a1IpK05oRT57S0JsUD8wYT5EV2Q7aiRkTyshbTFxe3hiTDZDaE99UXpzSiFMNEBiCis4KTdNcjhVPH1jNSVwdmxZP2tDbzdRUmRvQzVmRyg5OF9wVDd6K05RYXIhKyh3WjMmR05GKUJiSSRiOWA9YSZMd000c0A7OUgpT05lWUxGCis1fUFeXnV8LWtvdXUwJSVwK3VYZ3R0N2AlWSRDYz1tPD9VcmojKFJ9MzgkT0pob153KEFXTmR4K0k2OUpIVCR6XmNtQiNGPlMrWXN6Y1FeCis+c1FLc219Jm5idyRhbVkjMlJwNGtTfGBBbnkkWDROaypRYmt1MGV4byQyLT03QSo1aTd6eH0yVllrNkxLflVSI2gkUzwkLVIyaCV3ckVACitleU9RUz5jTntSR1VPUHVrIT9XdCRLMXl1dUE9V1RjNDYob1QwMDsyNGd5LUd0MCs2JEdaMCVLYmFpczxFVUdLNnljRllKYW4mY1V6aGAjCis5OSRYRCEqUGRGTzEjfCozZ1VOU088VHspe3tXZjVqdzVsJSVuMVJ0dnpCdGx+ITAwZCh3ZFRNRE41eCMmaTlORTgmQ0Qpek9HYjlPSis4CituaSRuaHNmaTRkWnF5V29KaVY8IzJMMiN3UyFjXkdkckdAK2F8OFJ7VE1YPmtpUGhgVGd1eVQ8MSN4Y1h0SUZlTGk4JUl5V01vYnIkVCswCit0JG9ORURgP29INyshODlidCQzMnBXMjlhSnJmWDNnY1NjcSV+KyV4Y0h5RiFNNz5sQ2NEek85VT9+PXZ2QERxK3NMITk7SE1acEJSP1B4CitCbiR8bENOM1pVWTQ5WChlbHhYPjtJMUcyby1eMiZpcz9+aFR+cjEtSi1tZUplZjc5LVReYFMze3tfZCF6PTl2JXRuWkp3Jk9kYj8+cDFeCitVQmRKXnQ4UXdmSnVNd3c8WTNQPUt5IVdOPTF7T0U7KDQtNlBNa344aWo4ZlpqNlZKRSRHTjxEeWUhKElNczh+TG1AbSpoOyt4bHcrUFdeCitVM213dzN5NVNMUSZRX2pxc3NqR2dIJTxWOXtxWCRGLV5CVGdTM2x3KztxP3g+P3lqdDxHTXtlUj04RitFQVYqJUI5MTYlZXBmc0t2MW56CitCZzBHY0FFPyplSzVGNDBoYSNESUwhbnhvYWcxfEBNakJGRWJ6dEF4VShBWjlVaCN8WDZuYVcxN2p1TElPcmJ5cnc1M2dwO2lrQVlyfiFTCitvMEVLbVAyPXBaO2pZIz1XWChwcUJKdEsyRyNkZml+RXI8VnJ7TUo9dHV6T3I2QEtuNFFQRjtQSU1WekVBQCpeT3IjamJHMjc9R31vR0RfCit8OVRDRkBJVkVocl5YZERGQUYmNn5EP2FRP19LJSk1R1M9LWprdWJKWXJLJFl4MlhVNlprR3pJUlFRbHt4Z2pZakh4YTxjSHA/PkA2RkZZCitXMWs1Qm5hK2dpMXk2OWFYaUJBXmhDYUp5NzE1KT9xe1hMcmZCdy1DSn4lQEMraSVvTUh+N1lTezdxTlVyOHM1Kkd8JXZEZW1WbERFa1d1CitgVC1wQz0zSE9USztJQ1o3SnhVO0JadTMofGEhe09Ed0s/N289QkN4SHV4QmpER1ZDUXFLaGZSY0RSXypoTE90I1RUezBjY29Kfi1nSkFwCitqWmItNlRjZGdNc0JmJCRGK18pPTgrPH5VKXRkKS02cUtoYS0zYyM4Kk9rciFqe3VPS0EkY2BzQzd2KmltaTxzRy1oM0p9fXdvJCY3bzdkCitKKFFQNVRve09nQV5qVmdDJWtATjdJVD9PalJ7YkwtNX12QjwySWN5ZWx4a0oqOEs2Mk5zfnhKVG8wR14paGlkNXh2VENeKH4rK0ZFaTRpCittdTJFVGszRiNKcHItblkjTj9ybzAtR3dfRn12QXM/TjdgdiV5dVpoNz5VOSQxWWp9U3A3d047ciMmalVLUUxyd15SJVlCS212UC1iZTEwCitZMC0mQD10NEdGcHktM3xJYGsxKGszST0jTHd5I0ZabXNzRktNMlJ8eyVEaj1efXFJQnp+TUQ+Mjl2UktDdkgxSlFffi0/KjUzazlkfGFUCit2QmlJMHNvbCRORmJ5RF4mMnxRN3tgPH1rTlJoME9kVjFJcU97WlElajtabW5tTjZWI1BqS3JlbVRtaUBsdDM2Um9COWB4aUtQKn1wcUNpCitLXk8qN2B9VThmRW1odXZDTFhXREB5SH1IcE49ayZgVjhgPXgqMnM1bDc8diZlP3NwWmgxQ0dTeiUye18yb21BX2d1YyttcFcyR3YhSy1qCisqUGowdThTS20hck0/QHFKKXAmLXlyeTRqbHdJMllySz87KDJFfjRCPCFqJnpMY2QxYiMkXmR1N2dkPXdUZ3JlfCkmdVJSeFpwZCtPPHBJCit3ak9DTTlLKjRDPD1GZ0p9OTdMaGQ+azM5bH5gN19sMlZJKCtnKGpie0ZUIVNzME1eeDgkSV8mfD5PNl47VUlrX14/VmdUdXJDXmI7bHBOCis4WGkxJmMhYm4kRl9RLTZPK35rO0JoVDN3ZFBrOVg4d2I7bjNAN1FAVHxaTkFQRk92UC0wTm1OOVdydD4oNCRjZypRY0U9aGtINmxJcUg8Cis0Nm0pNUJ5WSp9MDIzSW1PNVBlRlUhKn5SVlFxNnQha2dYNEo+JT5NYj5kM0BSKSlXJGtoMFRBUFpJeVEzPkJoJUZYOzxNXmJ8bkYqa0ZECit0UER6XmV5O3NLUmghLX1sfGtpOFhMQUJDfXI4NFFORnpoWX4mR1Y1TWNjaEA5K2JSfHxfYVd4cUFLXjBpemx+ek1vZWRYMGglX2dqJnFICitEWVApKm42dzI9TUlZa2Z1aVFNO1NIWWR7Kl5fcHR6K31ibHVSWlhtc3RBXyFkMFFNT1QoNCVzOUJgZ0YjV3xvR3diPm5udTFVMzQ8KWwwCit6K2sqYTR5VHhDOE9jPzhuNWRrPyVMS31XRz0jMjxXYlNwNmFmVU1yQHRrcjFsMjhGI2FtXzxYYkxGYXpYMmN7SENkU0Q9RFRDPzxnUDlACitMZExucW4wIzRNTkNvLT9LKX1ASExRNT5jI2sydmYqbHBjaGBfalBKdmhPRT5vV25uYFYtfERyQTwhJG15KnF2YVdCakJ3ekkoVjtkZTZDCitAZCN1cXQqNX1USEJXIWwhKkMzWWIqNldpN3V7SGJIMDBTTDVOQDBAZE1uJjEqWHNXO18kMDd1NlIoeHkxWCFXKG97Sm5eYGI8fXV5R3xGCitgdlJzUmAtRTBgZXNTbFUwUFckP19NOXtiUkIrQ0AlSHp5T0YtcGlWKGt7TDRMU151Z3hLTFZGKCFLT1g3YVFgRzl2Y2trLXYtTWYoQGEoCittO0Z4ZVRUZjZWZWI5T2V1OGtPKXNgNCshQj9yYSZDTy1pTz19Kit8QT0/aXI0VShVeiE9YzZRWnsyJEp+e202Tn5WIUNrWGNtcXg8al9ACitCMFNwJlNmMWhAI0kxQUBjazRvSzV2NSZgP0BNTGRIISV9dU1QLU5GQFlqRzRmfVU3KyQkZCppVThUaCE4dV9IS15aZWBYMWgpTWZFa154Cit2UiQkME5UMDI4PiZUcF97bGt0TzlrNEw1cl5gb0BfNVMoSWA/NXBVNnhCQ3Nkb0NJc3w3cWsrUUZwNUozTkV3KWZxQm1CMjd9dl8lKEp0CitoJSRhIyh0ZEs/QihPPHtWcj4rI0F5KFVNYHJvbjhPJUFoZXVjaSg2R3hhemJaXn55PVVLP1l7VnN1aHU+Mz9yb157fVJlITRrfl5fcXshCis0KlQ/JHRNZDFKZm1IPEhAKUNjaGBVPT5aS2hvY0l8O2pmbCUwUWhlQyZDREtkbzttamUjYHpwaW02VFAtUGJRSk9zcFkwU15TKzNLOyEmCitfP3pMP2RsaUpZK1JlVDtAXkV0RGlCU1ZVMmNRezsqP18lKlE9Sjg5Vzx+PXtFaSFQKWg+QDZhV0FLMm10ZXk3RHc0P1A1c3NaMDA4TCgwCiswMHBIMDAzfWxhNCUoZVZgWHIzWD5WP0dFXnY5Smx1ZEtmRmM2MEN7dU1qRXY+Y0tqej5VeHJJS1g1JjB+fDlPWWFRPChPSi1MSjxsaUl0CitnREI5MyZmdUhuZVY9IX48aHJpIWU+T0EoX0QmJXg4Mz4qRGM8NmkjRmt0Znk0Xi1FNilyIys3d2AqZ0ZMYzFNc0tYP2clZC1YTzMrRC0zCitPUlclaz5WYXZuNGg/bT5uXmpFSmROS2F5SVB6ZVNlZlI9Q0JVe1FXPjhxaXdJPU0hUktvZUEmQWspUztUeihpcXAwNH5IT150MHB0IUFBCitFU18+TUlRP18pbXk8aW1ySCZmTlowIXI5XnhJcnNRU00tQzg3cEBzJlheOHhrKlpLZ28qcGI0U3ZETWJvPmsxVylhMyNJK3pgQikjPShpCitUTiZEKH1UZjlHMHFjNWNzQnZxR3xHP3gkK0JWZypKSkJXaz41V2l3JFlgTFBfQT04IUxxN0dARnhvcVJYWHc9bT5oUjBwaFI8ZXF9SGE5Cis0OFheSG80Q20yJntrO2RjXlI7enN2KjhUaV5IU3skK2IpMkB4JjFCY3pmTW5ueyZpQCg5Tk1tKkFRRCt9YHxBa3hjMmp4dWZoQnt3akE0CitQITRoSVg2ZGpNSTxrK3RpRVBhcyVac2dVRzxSdU1Dbk1LZFpiQmEyS0JMbCMye3BtWHNkUmdmK0k/ajBGKk16Xk1KY3k/bnRoailhNn10CitQIUZZRVFWMSVxTVoqVTQ9XlIqK2djX3woQ2JqQFhzJnFhfFBaTChzMGQ0RHd5YDNGTjJfOFA4O29zYzh4N2Y/JEIxUVktTzAwO297bEA+Cis+V1V8T0k+RiNySlB4JlF6UzAwMDFSWD5jIVRaZShTNkVedjlwZWdBdmdIaj8tNnt3ckFkdlhVQiFpTWB2cUo+UjskWT9Ac0N5bEkqelBUCitQQip0V1FUdmtqMEhlc3c1UmhgfFdSaz1ROUk8MDBfIz9DaHRAM1RgSDVuMDJtQWdeOV9UK1ZEUCUhSEY9QHhxKkNqd1FIIUswbFVNcyE3CituMzl9N1Yza2wyWk89VXZNTSpwWV97QXJ5R3FTd054cz5aUmcrfWJiLUNVKFk5QGFsOXFJUyReNSFObFpwQCRhbl9NOHcla141I280aFApCisxRVI8X1lTSFlyWWhfQzNqakVjbVQtV0FCeXwrSjBgPlYzJEh+Ql8yYD5uRXt3cT4xdiprO1lqeXR2SihnMVM+NU5pVmtmSGw0aiEjaUZjCitJRHclR3xfb19+SilxMCZAbntJOGhzI1p4PkMtUXA2ZjhXMSlyR0Q5fHheViNMSCU9R2s8JVQrR1lVSkImdjhZc0N3Kl9jaykpcjVycWxCCitKfFZtVjNYKj9nckl2dSN5dzJ+K3o/UWsyeXVUanpnS0dobE8pKVl+OzdAazhUJjBYYC1TPEhfciUtKENGbFoxKEtHLSNtTUhkR1cpYCVTCittJGk8RXZMY3luZ2ZTVGolWEs9dDtVeitlKnpkT3JQbzFZbFlELUV7YSRBX1YrJnZuIXs/RTgwPGlhcyl9WXRaYCo/RSEoNDRXdlhKM15vCis3WVgxVSs/aGdXIVhHMGNnMTNve0VfaFpsZDVXWmBEOShHWV9ZIzY+THclN3FLX0JGZG04Wks9YW98SD1sTlBPTWl8KFNNWk1ic3hSUzR2CitCV0h3Kl4wcnUpKn19QnstSUw0Tm4tXyFgbiFaXzYzaT1aS2lAKWUpVFhqPHxSNjk+dElfPFl4Ry1OKFdzfG1sRyhlJCold3JjeWspMzJLCitCIyk3ZTNvI0V7eV88TDVBU3Y5OCktS2JgXnJEZU9NZEcxaUJmd2dLaj4jdjlnQ3gkRXUtdUIlTWt6YCUmczx7SUF7Nm0reHg3cXclaE4oCis7NjMke0NwZ01aQlEqRGU2bFR4NVBQRkpDO1hzPEp2ZEktMVJCPldIVkRDdlMoKEw5Zmx6dlNfTXVKKTkpTjwpKWQ8b0FxcCE2XnBmK1pICitOSjdLO0NANFRQUEhHI2hwfm9Lfn5sOWlyXmg1Wj9ibylOVnEjc1NNO3dNKjIkVmtESmhwcHQ+KG5TbENzS2FXT1h2U1JPKlp7KU5JY2xKCistV2BEYmlJRmNAPUxZOXs2OX59TjAtbEB7YG1VWT8xJEdFfDg/PjU1Kj1oaEkhPFdtSDY8fiNOd087SU1pdzEyS3p0cXowSW5XUGxFSWhxCismdj5GZ0BaYWxsb349PFlfVk1LTy1fcG5VLT1wOGhLQSlZUEpVVGZJS1BgI1FPPi1+SExlVTJ4MHQtKTcpTlE+MlE9Km1ee0JBVTNQQkVLCit9c25+cC0pcGVxbTVVPWoxZ3pTN2xvNTg1T3t4azlHQCExaSN2YHxhaDFvOSRwWDB1VlAqMkllbDZEVG9CRyFhWV4zPWNyNFFsY0xlTz82Cis0P2p7ZkM7SFk5Zkw2Vip1bmNrR3VvanF1PilyKGE8OVBWTVJBJFpkTSF3S1ZZfGpvbCR1I09kQDlvbmNncGNFMkpTezJgOTN6ZHJ0PWB1CitpbUw+eHVtNWw+UmdSZFhPJWVxKD5HP2g+KE41biVIVnl8NWpQTz5nXnZzand9K3FkaDIlTCU0VmdpWmVeKipUVD9+VGszdXgxKzIocVlDCitCIUdudiFxVmBrZCFgRF47d3t2MlZtN05wOUFjOTI9P1opXiFEb3gqdzJGNnVMRyNYWFgpJTBMMSNeQTJrO356QSE9MUZvQ2ZrR2k0VX0yCisqRXpfJm18TiZrQF4+bWF5YHhTMFZuZWRzaFBIZ1FJMGAjMlpNTVghSjdXa312bkckbHc9NDs4TkglQDUlSWpvRi0+QEJWITgoPE9felY1Cit0TXJCMDx2Nmp+MWUzaHVJLXBfSXcxOG9lQW55LXFTSG1aYkhEc2h3WTlmVEc3JWBnbmVOcGloVUFaeV5gN0g8Kzd4bSFIUnd2Zm9Hb1JDCis0Z1A0U01wcH1XfTJKPDt0TW0ofGlYQiNWMERWVWkhfVlJekhwS34rVnpKfEIlSWBxaSE9IypyXmB3Wk9+MWlyOFJuPD4lU0RSdWt0N05wCismUnE2SXhXUUtYJjBYKXZrdjBmcWtuISQwb3pQcE0tfmNNc2xIb1AmZVBwU2JCal8xS0BHR3gtZG99TSY5aUNyOSh1N3d4QCh8IWUhPFlLCisteUIjOEJ1WXoyPl9pWFBaQ2R6TlE3YyYlamVCOE9ANkZKJWg0NlFlaUhkJU5ye3JlQCZiIVVtSlg2ZiQjcV8yKXhMZDBAPn5IfV49e29qCit7MCtoSiMwc152UkFESD97TFlzS0pEXnpmR2d3YnFQOW9QRVFnY3tyOGctQzZASz8jMClGSnskcTxPK3BVdFpDZVg7c35wKWdzQk5uO2xsCis8U3UqSXQ4Un51dntjcXpJP1o/UjxjbG1uWlA7WilDRU5PJW1hNipmI1k2dnhYdnI3SSF2YHQhQ3dvazU9MTAmO3xkITBhZDUjMkw/dVBgCitrYzJ+YGBGRVUzJSNybVhnOWEjPDRuP1g1RTdCS2E3d2ZtPWMje1piIXQ3SEBaaUVhMllpS01OekVxKXRgQ0FWX31DdVRAM0Z3JStxaHNfCitNT1RYVWJqQVomblI7OXNeZCVwSl5kYkh5dHE3Z29ETXA/SGBlQnYyUnZES0h+dkQ3IXo2WWsyR3lOei0rSFlCSUxefWA7bk91eShhUTs1CitiWUJNalR2dUshOFYjMDRnV0M9STVEMD0tRXdfdSFxKjUjY3N1VHRDJXxRJHFDaEdiOVReQV87Q0t2aFU4KmJXSUo4MjFsR3VmQSorKWpwCiswfHs5QmhoSGRVSC1hfkJTezJrMmxKYylmJXFRZWF2MVVjdV85fi1VJXx2VVlEVyNSbVF1MmI8YDlgaEUrZHljUWtHN3AhSEtWWjRLS0ckCitRITMmeTRqfiRIfCRWNmF5dExvYl94bUNpS05wUWBVaVYwaXpkdj84NjxIWWNBQX5yQiR3Y3lvTGY4K1BhLXo7PnVlSCsyMzcmQzx4QVRQCitoWCpRSzlWSXFqSUpROFBsaHNCbGxjZ1d8dVVRbFliRUozQEM0XnNVe3NibmlUWnh3RVRuXi13JlBVT3pGKmtFZmcjeGFxZGpGMkFpeWBeCitnT2RBUyhaTTl2PztERUNONURLOWxiNVA1QTEqXnFiI2dQOzdiVilSOX1fPGlyO0BkMjBxXmJuPm5SYEVKTCUjQ0xEcnl0PyFvbXVhMERQCisxJElfPGBJbilvZmw9KWAtbTNzMzNFMmBXQyFwVHxBaXU5Zm1Ven16KzIzaHY7YD14TVQ1ejJoJkJqVSM5dTgyXzNFYW5HKCg8ZTF5ZzZXCitiQ2s/dWBoTnVxQ0ZXakotKT56UnJtYlFsQC1BJlZ0O3RFI3tRRTNsVzdkNTE2cEJVd2wpN2BubEZ6LW16Ymx3N2UpWjBLT1I+e15BPzh+Cit4S01QU2E+NT1mS3JiY1MpckNMWF9eYSQ1Xi0pJjhjbH1YRnoxeHJDSWViVDJHN14wdG9PKE1DfTY0JEw3NSp9RypmUmdZfFN3bVU0QjVHCit9Oyg3Iy1PN2QqdWFVVChiMHltQGcrbExwKWBDWVlvbWBUNUR+bXpYSjx8THI7PnNnZkZ8SW5xam0xQjtOODZVd001MEA0WiRTfGlpOCQrCitPT2lHeENEOXByYFd7RkBzVUN3QCQoPklrS3M8NWU2alQrUGA3czx7JGxIZ1ZhbXdJVDU5VEB+dz93SnpAaH1xZipWN3g8YWphMkhTaUtqCishaz4mR1FaaGo0WTVGRiVwe3VLWCtidzQpbWxKPXc/fihrRlRsOE42O1p3antQakI3bCNBVU8hZ30oR0hWK1pRZiRSZ1k/QWw3Pmd9TW1CCitiNHt8eHlIK0YyN0s7dkBZVjl6Ym5gOFJsXk5hdWZ7QEVHem56fm83JUg0VmFkTCFCTlc/ZiEwR2xYPFhVcz5wdTU9Mk1xeSQ2THZGeHEmCitDKmZxdT12KTltZWZETnRLMnVrYSVudTl3NCFeKHJ2UyRGVFZeLWplKWkreSYyI2k2Xj9STVl+XkI/JVFYSHF3c3JSSFkpY3p3aWkpd1cwCislUy1LUSRFemNEPlVHXkI0XmhWcGBZdGlmWGNUVj1JfmdUfjNoWSNMLW5vWiZoflFpRG8tQTFzejY7dSVYY1M0Iyg3P0trRXNAa3t5aTV8Cit3cFI+QGB8PXVDPmhicFJeNCRgQ00hJXQpLXpaRHxsSi0wdlh2fjZXVGVxR18pQmhTZlopPlREU2R1RFZ7dkQhdCNSWGcteS0lQVF7Ml5LCituaFlsVy1KWkJSIUFEYVohenN5Qz5oYUhVVipraW5zcVdfMm9xRW9OMU5zRXpBbUh7MCQ8QUM/aXdhYWR9WiMzLSM2NSFMUjNtPEZWYm16CitAUXBLZHlSYHlXajREPSNASzMtRTBzaD9lezc5aXQ1d2wqJV5reFRBI3FTWjdDVDJAcF4xUldnZSo1P2VUeVk1WisjQCg8aEYjOHg7VGtRCis4ZSl+OzlUSXlDfHE8TThiTUd8QWtpKl8+NGp7TlN8T2VreHswU3p8THtXXlcxQEBRfS1zRyl5NzRIVGN3aFUyM1VMdytsOFBxa3BXQk1LCit8VEh4UyluX35YSilhWVhyKmpBeVNxTUJOMzBpTSohTzV+QntNWWBkKURNVnpKJFNsU0JLRSMzOWohVzdiO3pRRygpUm5ZR3AtNyF4fipgCit+PXFtbjBCfkh4blNvQG01THhTUlM0cV5CZzJyMyMhRTxBUmcqQHVvbXdAYDwpKHlSJVlRaVQrVEl1OF9UdEQlNkRxN3g3flRmcjBwYE89CitldDZ6Z0Y5X1V5aW8ta2sze3xnRys1ZU5pSHhIZzlKP1B4Jmx8UkYzZShjdjxvJU4rTUd7NlQkaVpyPEQjJHVIbC1SY1pnQH1RVy1gS1BTCitleyF1dyUkbDlWRmpnQ2Y4YTk4Z1puUGVZS14kUkdFZmtpZjE0ND9waChBZmkoI0NGbVFBMjl5XkolSnEzcDV6dEA9Vjt7c2RpK35MPiUxCiteRn1pZDcrdGU2YiU/NHZYekFQSmNtYXJQamY/JUJzWHFvYEV4eUJGM0w/bHQ+Xk9vKHUyI3J4bUJGPk16MjVQcEx4M1lxRGY3YntpN1d0CitCfSZOZlZGUXpDPX5BWHhUZmpBYk9gU31maE5iaT1ZZ0hCVWw9KEBUPUc5TlU2UlA2aT54WlViK29CNX5kR14/VEJnckFAfkpkWSlYb3luCitPVEkjZnhYKCZWRzlLOG5HTXhCQjU9TUFmTVFHeWR0fWhYbVFTWCtXZ3didGRmZlRJVGw+dWkobmtAYTR2SF9pbk91UndMMUdKREVpaT01CitWYVVaU2NMUT00Q1JQeDR1YzFeaz5heTlmSXwwQ0JuSjl5IVk5KD9xRUZmJSZfRzFXbWdTV1drX1dvOCVOUTIkajNaTXA5b19iPWZ3NDA/CisjTj5jPnJvU2lAaGgpWWZ2dlpKYzM2dHUlP215O3RgbEhiYHBiX01BQ15QbTs1QnZMTEM2K1p9Y2htXjI1V3tGakVIQ3JBQTE4WUtrJDdKCis7dmJ0Y0ZZVXV3eE1aJDZzVyklMkFpQFIyfGEyNlJgeyp+REE3diZzY2w9aWchRkFLdyNafncwKz5ucyR0TE9YKDNfbV9yUXYhJWIzMnNhCitjWEYrQz9udz0wT0ZVPkp5eGg+cTl6UyVvQ01gR19GUm0qfVo7PWh7S3IqPV91aTZfbjlob3hpQ1o5bTxfRlVVKiNKSE9tPUlrQGVfaz84CitSfk50KWgpKTFKP3lpWiRKdjxIcn44NDZBbld2U3k0K2dvdG0kKkJDal9WIVgyZ25uaXMyRklBa3BTTGtOYXY1fHxoWmZmRzAqRlZNUGc0Cit0TSlhbn1QdWUlZEg+QWdUMmFsVncrVn0/cnY3NztKe2pDKW5aO1EpU0BSMlhhYyZzUml4YD5ISmomMUV6ZENgUW1NPHIqQGNjPjgkPytNCitLMFZpNFYlKzdhTjAjMlN1fnteVEVfeFdWeHtnQyR7QikmQWNjI0A8RD9PamVNazklVFRoJD9KNjxFK2J6QnU+JGZwPUs3b3RJUV9ATVhrCitrMUUpcV8/MzZGdUhgVHNkXmY+dWhDOXBIMXd+SkNSd05STGFXQzhyfSZQfE5HUXI3cT4ta0FzfVRCY2w0VClDdmVMZGAzIXQ+IWZTa2FsCitWem8pVF4oNklodyUrbk4zdS0hSnM9UHArYjAzNmNFPERtT15OSztmdm02cDlgemdYNSZFZGg2UnQjezJzYjF8X3ppVEw3dGBjckA1RyVpCitqO1dITSh5SykhZGZWeUFXMFNiJHJZfCFTckx5IUFuPnJMe0k8TiFrUW05TTJTNjJldTh3KHpWallaYnU3Mm5CfEJARzx0Nz4+UCp9fD9qCitUI3ozOEckOSU8aGQrVjVXUWFXKiRvXnNqU1UmQnlDbUIjKXwxRiRKJjcmV2xtNWt1JDFkMHF0MzZuZDYmTVUxdHZYfE5kNTtOTj9nQTVZCitFcH5pdXQoQzNjMEUhTnRtbjtWejZ7ZyVCIUAzVzlsI3RhWlljIzklRz1sQ15NKXk2KXxJfCN1e21XfnlHPkNiKllqb15sN301bVlsdWJoCituYTdDKHgpISRrfCk3dDxLcDR4Pm42OURwZVBuTyVQYnltd2VvKjt0OWVTZyY3ciQlJTdaSjkmenYmeUMyeXNecTBrTVhUKkdHPVFsJWo8CitKcXZeaHU2OCo7UU41Nj4/WSMxdGdVbTkjbkVma2lTQSl6bWcmeVRpYUkjJT8lUFU3TUIpNTRqPStaJip2bXhkSF5GTkprKChISG9XWVh0CishbyFjWUFTeHZWcWl4MmxaTlU1NXl6TEBpVUF6cnhuT0sjPjJvMEgyWXxRbFA8SzFJTzFqbFEhI0oxdSV6cUsjQm8lJSgxQ1RnUEBlWVhqCistenBFczRueCt2XzBUJTdfXzE5O2BRUyZvQmVJSipISnlnPX5SeiolQTxUeDRAMFlXREN5bnJXN21HO2NxTGdCTSRtaWYmMm50cVVQdityCis1Qk5JRllsYkhhcWN2PFZhakprMzlRZXVGanhieFgpQEZ0KiFrPVFiMjFlfmxvWlNxWE05Z3M7X1NLclBJVmVmd1otR0htTVpJMEA8e1U4Cis0X1FfTDNKWDdgTjlWJjE0K25pMCZ1eV5fVmdKOGcxWkh+Wip5XnJuQzF9fj1kYWxqT3c2V3dtSTVCWC1kNWhGPkhVKzMkKip+XjV4VlV2Cis/cWExJXAmMDdAWW1sbD55M1NQJT9FTGFubyEpQCQtKU8lZlhmXmhTY096eiNJdDtBO3YxdX0rQzI2Pk5sJUxqWV84JF5vVTNZSmZjRTAzCitNLW9MNDUhekgoe3VIKV4kKTlvTjs9aSpvKWhoI2Q8JFJHeXJ3MlhxVXsoRGgrb051bVFxPGlzNmViezgyMCNPUXMwX0sxYEBZakxYdTtjCitIWUJAM3N0ZFNjNGViUkY0P0R1WHtvJk1CSThQSCQtNzZqYTdBJkM7T0F3OWhgalk0Nk5TU3pYV3s8ekx4SzE/MkUpcmptSEA7K3tfKjRNCis3aHIxYXF3IzhAYUohO3VjcmU+XzE8ISE/Z1ctX2M1KCQ5U0pjeyt8KEF5VTlxWl5nekBFK3pjY3JvJk8pLWhVZkJgdldoaEUhOU1Ucmp5Cis+aik4dDBmYSNMTjlqOzN9Z1hncjhndVRPcG4+P3N3fDYjaW95dW14I3otb1BmWkAwYXZ2UEdYS2U2V1cpRXQ3KTFSTG5fa3Uld1JvNXwrCitvYVBiMjk4X05lQnlfMntvQ19qazY5ZEJpdmc8fko2bW9aUURoOGtzZW94JGczaVM+eWwqXkVRckRDYlRYZ08rMzJrPjJUTz9xX1lxTyFlCitaVyU/RFg5YzQ1STx7WnpDSWs+KjVRPihrZj1Beyp8K2xHSis2fjZCcTtnY1RrdShjJmw8RzZKM3trO25yKmklOWdtZj80ZlFMaVdCPmEjCituVERiRzQtRU5nSEFLcHVDdlBjUDJBYF5tPHo9PXNEbGAwVWhsTU41RGZtNzB+XktIJXlDaklhNUAyblVUYCt8eHNAMVBIVzN2PkpPbDx7Cisqcmk1QW9yd1JMPjw5dWhAWUBHJXg2cWJyMk5lQnIyT04pPmc3X2FWQiFEVTJrdlg8Ykd4K097Y0F7WW10fiopLXYjOWlZI3RTa2U+TSkrCitFdDJ6ZGxePkVgM3AmZ2hYPUJpfUQhPiZZPEg9NTtya29VaXVCbnBJd05ObUI1MU83JEs1TVB3UHBDTUVhdmdDQmlvdGdwYGpidTZueH5ECishfWJIanhDYncxQ3J1UCNibntMJlJDWG43OUt6PnpZJk9OMnEwSTZXRkllMldsfVY5UyhQU2ZUaHVzZjVGNU1jPmx8VFkqTVR2WWpNOV5wCittfXNoWFQkejZFcmdPOGdOIWBtZmh0TDtrb3lMKFhOOS0wSzYmPU9eKi03O31gKnwma31FS0BMbUx5NlNBVDslIVJ0JS1IZTcwVDc3bVR7Cit0ezdYeG9laGRsfXA7OyZ4WXwwaEBGTXJPcE9FSD9NSCFGe2gzRFhSU1B1O3gxVjFednZXS1BFbDg1YyVPWGQ3aFRlNihHc1Aqd1RWPzA8Cit4QDFJQ3dgWkhJMGc7KXJ6V1U4NTU/KChFVDZLP3dHV08xQzU1U004STJfaENYT0xYM1lNRWxZYnI/PDs/a1BUKmNlc2NnVXxDRF9EeSMrCitLKGVAOD9jcHd9S0E1TkZVMTlUbithODNnRGo8I1p+WnRMeGRvZFlLIyZsWjZjVD5DYFVEPDU9Oz1TaCpSX2tVQFJWOHt0Xkd7UXVNVXVqCiszS1deSj8wNSlrdE9kJjRqPmFYcHJ8PSopNDtkaFppIyNtdmE9RUA7XjlNXlooYz1mcFMzTnE2R1JGSmVCQ0p7Ji1PWEVlaTN5ZTExJFhGCitMPCMobk50YEkoUXBKdDJzPCV7clY7ZCZ0P2lKVmpiP2x4KjcpQCpPd0ZTTXokfGJiU0U9a2BqQ1I0WTQ9a0tOb00zYVYjZ25ZLXh1flkrCitveiR7NE5IcHpQKCkqX2NyMWl7VFY5eHFHcXtoeWUwd2dBazBRfDgodkh3PW1ENjY9PzUocHRSNHp2UyRXMHpiUz9qfXFCUiV2VzlISm57CitIX217YU5NXjBZKDNePS1nbmNkTU98YGRiRz50S09vfCpBVUFYPmFVYD4tWFpSfTAqPitVdkdxSVJZZ3VRano0RUw/Vl43dloxaipfT197Cit5c00tcU9YTH12LTYzY3t3O3M8aH1MeyVBQSt3JkQ9UFk8THFyaHg9O29JTGwkJTIyOT1BeHtvaSE/PEFMIyNAV0wtKXdOPzMrPnF8c21RCitQMEg2fmp1Qz1HKFM0UkRqPXkmVXRFIVE4QHJrPnB5PEdnd0AkO1g0QTM0PylReDNAbUZ7N1opNj9MTEo7flMpdnNhPC1+WkorMVhJNTdfCitkJmRsdkdibClHYyV6aCljYW1TNlYxXzg9TXZhQyY5PEVjNWpKcCtDd2RaNm4zUCpPRipFQSpmTCgpNkBvbyhWeHRrc0RBbVZXPlphVzRsCitWV1cwYi1OQzY7QyY5eUx3Q3whYzxpfUVsJn1XRjBVZnUrI0dIOXJSTVl9e3RUSH1kJVhZSkkqR3U+bz8+YHZpJGdjVzk5fVRvNWNHWUZPCis/amlSQnFDKShQUW1uWXEyalp1bCpsYF9vPG83Qlc/WE81JlFBWTxtUE0qTUBKYnw7MjNVTHNYVjIkR342IUJ7b3ElPlc3O1oxbHgjNCpSCitpQC1hKiR5NnBHTEdoXn1jQzA8dEo5TkZ4OC0qM2hPN207SSsqPCEmJlVfLSFjN3U/dH1YaDB9c0gpIylBMVdfckBxZ0c5S2lYVjRyQkEmCistM0lAXlhKI3g9MlV7NUpHMVREbFhpODhkVkN8NzgkMVllIUdpO3JWTzM0KnF6aDtKamEpP2lAM1otNStBJWYqd1dpJHg+fkUjP3BfcC0jCitOPTMwczhqd1JVN0ZfTTBIMWBFMXR0KjhsS15eQWE9UlU0dj5yPGtUUTsoQUBGSkx3JHJBWl4zSUdnNENCenUjTWthPXN2ZWQ3eylCUiQkCitvSjFNKU0pNFhNbWg/eVZ4fDM+V1ptJjZqflAjIzI7UURYU2h8bFFue2xSNDlaSE08anB8Tnc1XnJIMGg9fSkzSVhKP14tNkpNSms2bigqCitTdXsjT2V+WmNvYnApSGs1b15NPkZGbnxVcTxLSnBpMEAqTkk5MmFFaUMkcHZ4eGE8eDtZUUhvXnVVOXRSeGUzY3l5I3RsUz18I3RKP0UtCis+M0lFYF4oWk1BZyFhZThnTiRSTWFeVmxgcHw3K2ZRZGMwaEclMzZ8YEIpYkJoViY8VkUydzJsODNqdEdtNWQ2VSpOTCtSdEowZ2d1ZjF8CitrKlUrcSF1UHI9dzdgNVpqVl5eRE5SaWdVdFRAYlp9dSg2MU9wbWhWZlF7UnlubEp0ZVEqTm12NDt0dFNzeTw/Q3RtdnVzZ0xsd0h4MGVkCitHalh0YDlhfEpKSXpZVn5NITlfcFViRFdeRUoxaDlhRCptb3dkeXI/PjI/bStNNHVkVUFGWmpoN3UxI05HI28lPUFKUGh0eShzSzRDJFIkCit1aH47JDtuNHEqTTYqPlgjfH1rVn4memdeU2p1NTReZSR5bD1rdm8kI3pBdiprKWs3Z1VVUyZqPjd0PiEhYUIrSyFRbGl1STc1NmUlIVgpCislZnN8fXBLWnd8RTlVdlYlIzY1QzUyeHdJcE1eYVBKP0oqWEs8ck18azJTSGVHa3Fyc0ljcHUzZFBDQVgkSHohJCpeLVk8diNFMDtNdkNACit1dmtudTB4ckw7UnJXTntpZTIjbjBQfFNGe2RkSjh4PU1gLXo2bSlHaDEmKWZFMWZUYkx2K3ZETENlYlc8V1V4WFdpZ0ckbWUjJmxrJGZtCitXMCM7KzMjYTIoZkBSfktvVChrX3gkVnJzJEEpMWJDYTlCYGQrZT5kZUtVJFB0MSRwT09NYXtINCFKb2xvaDtzSEk4U2VfdGA9ZGZUbkJ0Cis0T1pLbXwqZWd3Un1Qd00tczZIRn4wamZAQVRCd0swQ1BBbTMzcEtGQFd2d3c/PldxdWRFTUBEREUtOTtYUEM8SHAkY3dtZV52XkxNc0dvCitnTSpIRz4re35fMlZfezVRZTQkdjZ6KkhWWV41c0pjaGYoezElczdKWTFgLV8te2krI2Y0PUtPNU5xZWE+QFN4PTR3cH5sKVhqYnQodTdeCisyZn07MUIzPHt4eUxgS0tFI3BDazY1alh+UDlmQj8qVztXS0w9djVUYFZtcyFGKlcrJCFPKD4zYHNOWENJKko1eylKU0p4YSthQndQSztNCispbnROUXd3PTFNbUBMS0pKb1NKMDNVYTUzalpieSRobDsqbWooWj5WdkA5cyshTyRsQTJoJHxYVGU3KDFZZ0lARzZkOU1mRm1wJGwjWXg/CitneT55eSsyb3lsYiExV0RARk17Y2EwanVWWEo4fCZMTVRieDliZyFMVio/QGUzUDNIQ1M3LUFmJExmQ08qdGM+XiYma1ozRFc3bU9MK3dzCitzKCk0KEl0bUche3dkSXhrekZtY1g0TzRCdUR2IzFvJVhKZVV6P2xPfX0hSzd4emU0T19BQTFQR3BrYktZdTZlSktfe1ZKYWx0RV5vOWBACis2WiQhVytZNnw4MmVteUpRSndTWTBDKWEwVSk4eV8mRiE+UTJNZjdHVlkmd3BKOD1WUV9pOzVfYypKLVVuPDJISHoxMmVISm9udXFxaXJnCit6ckZmWGBwdyhOKHxeREVYOGJTMSZRYT9fSWh8YV9acnA9di02bXViUzNVQjZ6fl9uITlnMztDdkdFaSpifSZpbzN5MWdQMj16cXNabmUlCitnZDZCV0V4IUFGNi0+Q1RKTFpFODJHUSRySjVTaDNeQkdFbT9XcTx1eU4/ViRidkhYXzFfaGxDMldrJFc0RXZ4Sz92KTR3YTh2WFg/dX5WCitXcUZebkV8eXQpPUozfkM7N09VX2h4TEtCPGB3e1p6PmBmbFY0PyQ3el4yM0lvdSM0QCRMdztOdEc9I31mbDE2JkI5QEI2KHBaM2hpNS1nCitnaW8teUgtSGdQTzdZcVo2aCYyIU83WSkhdz1FNHBqdSVSdTY/MFUxfSp5QVV2cjVMJnZET0Vke2JlME5vKXFYOD0oZ3h9KWdLcUNIZX1yCislJkhxV0czWVYmN09PS2hucmZxUm1NRmg7QCNeMlUtRHZFdlMxakxeYjNBeVk/JS0zci08dUZMITd1KCVvUWBFaCQ0WUIlI3FjcDJ7b2g9CishUiUwdSZ8JGs2XzZodTlPWCFYIXBWPDkxX3dHU195T25QMytEcyFoZktPY0dYV0MjJHl8ezBPMmEtQmAmPU5mI1ZsKXd1O3dOak1mWjAxCitAS0ZjNnBtWGZwX3spc0plRGx7ZXdoNzNYWDEwJSUmc0N5NCpsZy1RZSFeemA7O3J5Ji15NWt0OGY2MkZ6NmxhSE4hTjVpOGdeIXwhITxkCitWdkRadH1ydD5KO2heVkh6Yz1nREtLYTFNeXd5PF5QPGo+JEArQXdAPnJHamN1cFFENStfV1NzRnJaPDg8MTRgPnVqM059dm1rU2NMY0JFCisrS3lkc34mYkswKTZFISorb1kpJmxJSl9vMmhYSUpqcERwLTw/KU5ZSDQ8OUZTWnFsTU09YUtzWkx8PEwxdFp3bk1+bHZya3I7OUFWIWc2Cit0UVRHPU45fGpBTFooU3BDITIjJW4lV0hZLVphUFl4dUxZJGU7WTI3bU08aWxOZnhUJXtANCY9fEJWJlFhNzRodDYzdGtMZ3MhclI/QER5CitUTz9BSipgaFhDNyRibT9DQFcyVkNeK1k+SWVUREolfTdGP0xQSW1oKFV1WVd8Rk9BISFRPlpYek8oeHYpKWhwKClOT1hJeWpWI2xGQ3NYCithczctOHlCd31sYm8+eiNjNkpiZiRAYUZRdHZ+RFBwbGZqZlhAfmxCQjlIeHsoYF8wX1I2a1dCdzFsUnVzNTk/emxaPFUqU0BpciYmeUhqCitKdTZSaj9jX2FoLU5wUCNTdWMrZGN6QGo8b05MMVVuSF9nMEIjQjBBWEh3dnt4TkV6KSpYcFdiWSgrcz17QmFld20xODFGJiR3KTUhNFozCituVjhla15DZykyfkNEWEo4bHM0aH5NV0N0TVNMemFxfnluTW91WiNoQUYja2VVN2l4X3k1fSVOfU9mTzEqK2gmKjZlY2I0Izc3MDxRUWlsCiswVjY8RXhkVkA/YEM+amVCZn1SISNRRT10OUwzbntrTy1EeUBjOFcqKXMydiQtZH43RWJjcER0dEA4YUNPPWpiKF56eDZrNnZwbTEqKU0lCitySUZ1Zkl4b25tNzNoUTMhb3k0WCh2OSV4cyktKnReaVNGU0JTUk5LamlYcCRTRzxxTyZhY3J8RGxtKE97cHlAeHZWSG5FQmt1aS13e0JKCisqJHRMUCNHVHxIeUc7bVh3di03bTZUcmV2RXVtbUUzNzdqRUo/Z0JQbTFFcyN0QnpxRTNDKDMzUihaQkMhZEc0TClrOH5AQ2JeNk1NN28qCismSnchMVUjbX5jT081K3c+K3VWIzJWNWQ7RUN5fV5sI05vTioyXkwkYGxeO0h2Kk02Q2tMcm93YV9ibV54b2JaY2xuOTd9WVZORGY8ZUxvCiskKCoybGtrZFlxVSplTzFuMm5CNU9DUV4pWEtVPitLbnI1PHpKK19IJilKRWx+dzJjVDwoUz9kWVdJYWNZWXEqVk1qRlozRGwoYFlkfEJLCitCTTY5PzdZeFgwZTdwPnpLS2xebX12VyZ6MXtRN0hNQ2lMaEwqdjJTYW9Od3VgeTRmOW5MIU1UR0x6aS1veCtTZUU7R1ZkfkwwKFBuK29FCitqeWQ8ajRxUFAmJGVvP2dIRzZ3b3FJTzk4ZzROOHt1aGhCYzJOPUUwcmhqPW57cjZkVl4+OTNHfE43JExsd0omQmx1UiFTUXkyXmV1WGJ7Cis4aT04UzdsaGAjOWBYUS1LXitrOTNrfmBEKDhLO2xkJHh4dnN2SjlMJk9LKHpJJG1SNGpKI25pISE7elpDOFNtZnB6ek0wPUJgeWJRJTJZCitWM2JIXkRxdGFEWkthYXp2QlkpOzZGcVF2cHVeemt+cypfRkZtQjBwLT0oVSN8fF5MSS02SVglXmZodVo3YU8yUitoIStENHpeakdRKjJHCitiIzwmYGlgSyFrJjx5PSMkUUo8dXV+XnZWMlYoc0opOTN8MjVwZ29sKE9rJXF2K2lURXEoWWd1aG5XJnxuI31uTihKM3F8YktRYmo7fTF5Cit2eTtOY0N4d3gqT0Yqdlc7KlYybiNVY09aUEI7d1Bzc3swOGN2N2ZHdlElNntLU1hsP1JPK0BuX0R4MT47ZCtYZno7I0tfczs+JUlqNmF7CisrPyZgSSZgWUtHeHxgOChoUzBVPyY7YSpETDQ4OU9We1VefSlKVjZpRiE0SH1kNnExKVNgTm58Kig7OFRHc0N3eXYtWWlyJHpWRkwofXlwCitQbDU2VUFTJkVOe3d9PWdGM2slQTg+JG4kbHFBeDJvZTVyRiE+MSRqcFFqMUAmUD5JQnBXTFJfaCM0fjtQQCU0KkMqTS04M3NnUEJWZ1VlCitQYlRNKWtWWkpPcSZjI3Uqc05UWHx3RlN0TzlfSilOVjRHP1dkJDdKQlJqZlVPd01ebT16a0krUlcmRH5TITtTPzhEdlE9MXJefHY9WTQkCitrfEBgRzJ6d2UydyMpSmU5YXxzV3NBLS19KyMkeGBFSnhgM20pI2ZrYT5jVVV4JXYjdm4hQjR0MkhSbEB8YFZPbXpwKkM7OD1ud2klSmwmCitGWDJ5ME8xMWk8dX11amJNd1JoJSg8NntIN2soUEd3bGx3P15GJSQhP3JoWl9eLXt9b09kUmFLTzB5N3h1RzdIQGAkdGNVTkxSailFQ2UmCis8cD1sQSpsbEBeJjt6fFV6ZTVVTW8hRFBlYXdZRGF1KWNmbjZZb1F7OWt9T0pzQ1ZDY0RvQUY8IW97PzYza3NaS3F2MGBleGY5Jjw7QFR9CitGeUJjYGJQZnNyc05ydFYxIWdTZ2ZXQV9CbCo9OzJ1Xnxqbko/NCorQjM8fikrZUx0QGUkY1lMKyZGZjM0K1pJQyhPMVhvSlJ6ekRzWFd7CitPOD0rUy02SzMhJWgjbDs+LU1WS2UqY1VPUXNlMFVifD9nWlBUTkN5fn0mWHtScUJ+NEU3eFQ4TExxTm40OzBqMFFmNn43IXVaJTNZUXIoCisyTSljQVlKdHBKSCVOVU8pWnI7LV9aXlU1ZEh+MjRyaEMpTmxAMWBkbHN1UFA0OGhacTBwdip6UENTM3Q1NDs/bXZyenJ7NVpmPm1aeSlWCit9IyZiU2FpcGdHamhMSy1gRD0mMy1qREImZEVHJkVQemZjKHdfVFhDaG9TO2xafk8lYGtrZyFKbCtPJnV5akF0QHF9Nnxfck9+YHxEfkc3Cis4SiZkNzF7KXdyWD5ie19lM3hSMU5XaFJSUTBuWl9CZGoqZlhnRFY/OX1tYGRFOWIlND04OypEVigqP0xhIzRfTW15X2d8b3ZRWEVWZTQ+CiskRjtWVEdJXiZEbT00MDZ0TjlgP3ZkfS05TSpYSGtFIT16aSNjUW00blErJDtlUiRMa3N2KHEyKmZuekAlc2dkcnJVPFJXSzBtSTEobzYmCismT2k8cG1YaTleaF5edHhkY2RUZ3VAOVMpTHI1RWpPK3lQdnhFRjA/Nktod1lxNDZudmtPZ2RSKjFQSjZyZDFVcSNqdjRUPFJCSFYxLTghCit3QDVjVUw3ayh8S3YrKTR4VlhKJFMreV9YY09sel9PTWVTSGo/Rk11YWxlX2F+I3FDaV5nQDEjJGtian5fP3N7UWNuaEFSMTF9KGdXb0I4CitTYyo4KXVabDtMTTgmY1d0K1Z2JCojLXlpbXl+a2tlc3xXSW1SKGpvYihvUjlXbUJISUk/TXx1QGx5ITNHPCFsM19ER312b30mXiozRiFDCitWN1dvYEMxMUpAR0UwODZyYSRwPldYWDVXb191VFdHM0F1RE5KYFpLaG1OPGwkOUR4VEV5bCNMaTZHeGQ4V2JAekZQKEFacVVkek1tN0tvCis0OWc5eHhBZWhYUzRabExSYTEtIyh3X0V3ZiMkYUZNM0RkTzEpSGloNWBqQklFKENeVWl0ezM1NTg9RklZfEopSVcmIyhkWVojc3VKbnFICitmcGp8Zn5rITE2X1IxZExwKFJgT3JXU1hgdntDKUlUJHBabklGNHdvPyg+WlY5YiZMVFNtVD4yUXFgNFFFQzwoKjFJJnBicyglQSNmc28pCisrcWladm1rVjw5Q21MQ3BrN3dlQTxCIUMyNjgodT41R0ZBVkpiZkdkRk9+fE12SGhybWF3WFpCVHp0ZHMtVUlaQ3lGJWZvVUlibkFsdSUqCitTPVFZJn5odHgmSGI5ZStDPWAwVylPI1pkSEpIaD8tQy0zKz8mWDM1QU9wZmh0WGpZYT5FVHcxfj5NMCsmTUNnRUlEcll0ays+WXVwPUdjCitYQUlIe1ooZEYoMntfRVRVVXNiK2p6YHVKOWtxZjAwelleYT5iPUBOKFFTN1hRTWBfOHE1UzNDO31WV2JMVj4rRmM/MDshbkNMI0JpZXplCishM2t8fkgpa0NBez1tQFNGO0shenRedkZ9X0AqIWpWKSMqKDZtP0NTKHsrOGlnUTVUZzgxOEZjS3NFOXJzOT02amBwWjIkcGhQV1VhWUA5CitFTz93JXluWDh9M0F5U2JKQ2R5PzZVejZyYF9IUylqTV80aUdUVnVuTjRZMm5FP1Ywd2E0YXEza3tNNVF7JjJ6UkYoKFN9TDsrbX48NXFOCitPfUEoPjtmbnZ6WHpjU3tsTEwmVW0pWGpwcnp8I31FIyhaZituYXd+dTQ1OyhVPWJzTD4jT15hdkZQb2VsR1leYm5HP152cyU2YWcjVW9XCisyKmJuKCNCUD1RbkVrK2p8TkBaaDEtbXszUWlZdSVYfGw+aUl8R3M8MT9+MHBOVnMpUGMlbmxVM1hAcXdJJWRvOD5iM3dldDhHKHdaNnN2CitxZncyRHl7S01RWUI/Q1k5Xz1gMHJGRUVMXz9KYlApUV9eb1NpIXJRWDwqdnhwcjx7fDs8RmxrUis2dT1GbFNjOCQ4X1Z4ek95KTgldlUoCis3LWpBfl45MjBVY2FJT0FmPEgzNnpMK2xqb1FMViZDaXpJeXF5c0pfRGkpJEtNblErNGdROzM9O2J8MFVkYDRFM1U7dikyUUZmYXtyZWgzCit5UEI5SWElQCFtVWxPR3I9Pnl6OSVDTlZMXmdAWjZkVXUyMz14M044VnN4eWIhWWdeaypYQ057R1AoT1B6O0AyZCk0ZW9nWFNUb3UrPU5ICit+UlNFXlQ1Ym9jQHVSLVB8aEdNVDs0YTdrXns+LWM3bjI4Nk5VQl9NNHR1OztJeT40Rl5MTjJMPit0Q09VUHMle1hvKmlqYT5TTDJkSHtvCiswSjM2Izx9Xzd4WU9JU3MzdEF1eDwwMn1TMDZPUyZURXZoO3JOYTxaOXs4Q2NweS02YUwmSWtiOFMqUTslQVY5YHFQKWJNZnRyTDA7aE1HCitJZXFHI2Yka0t6T0k2fkQ4PkVLeSRTPTlZR0crTGo3KVJldTVLWmApZ29XaH1EM304ejF+OWd5b0J7bFh0SHhLKHtUVXlnazY/YmZfJj49CisyQHg8VDgzRTYwdD9DbWx+RnJ8eSMpMGMxbU44JjkwPHU/eH1rSXckJXtHMHp3an5+cWJecnljfnVUMDJBeTl9SWhOPmx6dEVKVlRJNktBCitaJil7JEEzNEY5PXltRXhNTjxjJTAtQ1FPeWRrcDVTJTVMbXo0NV93bz9qU2YrbSRYIUxXZW1JVyZ3I3Y7TlglOXt4Q25HdFhpSCpNYGJ+CituWDZLNXApUzJhdDIrTWs2Plh2cEw5Ym9XP0d2bHs7b05wMy1gRT9OOD05K2d2WCk5bVM5Z0EzUygpYGVEZk03YkQ7Nkp2SnNsP2F0OzJ2CithYWtfM0dwNCVKY0RoN3dSVEJjdGB6bDkrWVROeElxRzJoRWN4LX1RJG0+PlNFeTsmcDBnUHh6Y14xV2lsdVEkY318S3koR3pNQUxoRGRqCitrWEc1O25HIWdCZDtGKGZnbiM+b1UmekB3JXVtMC0kR2NoMFJAeWNobURQc0dHc0x+cUErI2VpbWBQYXdLOVhOays0Xm9jN0UjbzsteFdPCitrIXdVJSNgJndkbipHc3BtYG8rPSs2UzYtPlJzbyV4USZEMlZCb34peFV6V3s8JHo5eypIeDQ5TT1xZTFWNj1TNntoNThqYl5GPmMqKjNHCitaYm5McVVPPDx+JldBOUBnVF5KXmdIPno9Oys4aUBKMjJRak94VWlCX1JkPDw3X1M5dnBUPkpaMip3QyZKflMrN0ItWk59NiQ3bDNxPTR8CitWYm12NVNEKTNUeWp+Nj5fVmNlK0UtKkpCYjhtailyVll0NHdBSlNsUVlHbCRzZyZ7V05Gej9kPz11NnAzfUoyZ2BUaCEtamx4IU9EPlROCit3Nm9xVkVMQVNgdkJHR3lzTT90RH5JI2pHdX1OeEs8MEJ+K089PlclelpDaTklekthYzxve0gxRUBlNkRTYSlaSkA2Z157V0w+bkZGbDNECitjWkYyd2Fpe0N7dzJlei1UPSRyTU1BU1d8QDhfZXB8TVEheEZVUH12RyYoPiFtTz9LO0s0e0x3eklJMCNrQUhRPj93SkIyZnNgal5ndmBGCitlaytuNjRCTkZ5Ynt6bV90cDhnTDFgUih1ZEtjYD4pRUJeRDwkPzR4Vmk/N0QjMihEZnQpeWwpTV97KTItVk9lND83SWM+bWo9cTI3P2tHCis+PWFsSHE2SGpEQSR8NmtvWmBLYXplcWxzQlNiPUFKKjkqY2w4RlRPRF5kU3xPVzh4az10K1RTS2M0czd3aGBBcTglX1JOU2xufmh+LUJCCit7PiNGNDh0JEwlaU9TaD5iKHVCfD1zXiF4dSpSa0xOXmVyRnVgdXJ8ciFnMXI5YFRjPHJRNj1TVk97KHZ4e2d6WW8xNFo9OFhmJWktRF5zCiszanRzWndDRXhsa0xCM0Z+ZiYldTZOO3U7RUFMWCFzdX1WJEdicnRESyZNbkd8WlcjNSF3fENiMFI/OWM3USMzYnohZHZAOyprcjBqX1FFCitgfmRjeGE9bk1EZU9QY1hJQigoKGgxUUVPWCMrfGxyWChNPEFDOyZsKEpmLUdnQHdffWN9LSZQTmYpKnxwKlQ7TXYofDUxPnd1OXJ2Nj00CityPTdEfkY4RzYjRER+TF47R2ZCeFFreGJsVCNtbTgxbXwtS0h1ZHtyXmt1YllQKjMrPUlOeEA8Iz80bUlWVEVQWDJKQipFZl40N1ZNYEVKCitJSGQ4JDdDNyMjP1FwX0UwUEY5YjJAYW81Sn1VVUtpZ2tCMlNadWImZz07dUttZXo8YWNaS0BSQjdSZ0VqWUt3Qj5SZWZoJjFYRj5OM0wjCit9c2QjfUg+VF9oS3pMYHlEfWwlUHI7UnlXRjR0P2dqMiQjLUc8U0szUlE4MDFSYHg5RHRQfVAkOFJsPFI2IUhUZUVLNmF5VyFXTl9PJWhxCiszU3owNG03QV9xO1JeNTx+NklYdi1PJkZuMChvQ0A1WmtfJGdXQX5ySFRXNl5gP1krdkdtOTZmSjRDVGpiNzAlI15TdWBYWkpxdUhwLWhtCis7fj9yUjhzZ29aM0ZqQDdgX2EqSF4yRll6TD9meHBmZllJWDFCd2AhNmQjZjZCPjNjLWNZXmRkayp3SGt0KmRSRSs9bEl9U2JgWVREIStsCitRZCg9c3JabXQyUitBdjJ4PU9aZFEyMmRYP1N+TlJTcipULShgOE1RYVFZSHhpTGlPfS1sQUNlJjdpTD16NX1jI0NoMCtLPTJkQk4kKWotCis9JCklNTctViMoPkxWNj11PW5ERHNRODVPfURZYjk0RDNDSTJHQFFpU0NIdkJ1NigxJnpJd3hqbilgcSo3PGJ8QkpPWVE8Pz51YHRETERyCitSNDlGQlBYNF83WjdkaSNwV2k1bHhlQTQ4aXBvMmtvVUN6RjZ0PjxENmVRPWVyTzwlO3dNXll1KS1GPFBwdmJPOXYpOCtZNTFlYXFeaCo5CitQfGokUCVeJm9OZz47JXcmXjIyentKTmImMyZGYXtBUlBtcy1vcFBVKyklYiNJRjdjKSllamR6SV9FO0A7dT1KTXU0Mj89c3EhLT5tajJMCitSSk5zYnY3NWpTP3c7NnxDaS0zQDZQJCtVVVZGUi08aE4oXmsyeUd9JU9ucXo2VkVrMkpWUjE/Pld6K1FAcD5kSV49SHZiMn1jRSshZilICitWZEtZOzsmI0h4bFg5fkxAc15xcTR6cnh+KkdnVz90KW81O0tfbk90YC1aLT5jY1B8TGJofm9yTEM7UlJsKlNwNUFiKE57bXFZS1A5NCg0CiteUFZVSiRTe2pkNygmWWlDXjV9UUJ+VWNJKl93YzVsY150aUdJSUQ/QzdhVyRlcVBNc3dsV0BmWnE5fH1CODlLNEQ0MUdGNVpBRG1ASTdNCit3JVBwVitZb3E+dF45SVlMXk1lP2QzX29WWHwqJlhFT2NXPVlTPTtXY2wmcGdUSjBjNUBRTEw4U0Z2dCtkPF8/P0FWTSFhcFF9dG1hejtvCitjPkl3TUw4dnlRXn5gSTJ6aExPXkdxbDhiLVp8LTRhKUg4QkBLe05ibSEpYlZlKlJhZkpAe0s2YXVVRjZqe15RSTkwWXRZMyQkWDdISWVVCitTLVJEVl5SJkNwLXwzKThqUS1NR1p8dkBTQCk4QEtJYVN9MXJuJVohY0Q8K0I3WDhHckgpMWJ4a0VJK25tczl5aU1gdXZGa3A0O34yQUNZCitSPUtJZXJlN3pmX1poNzBMUkF7XjRaWiUjRi04VSgzUXwoQmA9UWJVTVgpQyQzPjMlWmFePmB3Jk9CdkZJUkFyVX1lcVdiLWcpb1BmVj9YCisrVFApaD5ANmFXQUsybXRleTdEcjNAeHBPPVUwMDh0RTAwMG1HMDAzfWxhNCYzY1ZffGVAWipGcmdhQ3lDMFUybyZLNkBCLXdVX0I0QXI7CitkIXAwKTBwazZ4b1NxQyltc2YjI3ppMz18RHFFYmoqemBZRHBATnlWKDhoSkA9QjVCYDI5fWk9dWduTyE4amRkK3JBaElVYkwlT2ZKMVBsCitAcSYtdlAkZmZEMj0lalloeSlqczxwbSNHb2RUeldteVg2b0FyN29sK1ZaR0BufigkUiVGP19Acl9ra0NpSiM4KShnM0VyZmpeKiF0Yz4yCitqXjhSQE9YdTMzcnVVV0Iocj88SVBKN2pUQDcqWnVRKXExTmI/TC1tRCVmezRwWE8kfWx+c3xwTSN1SD49UyhiTHk7OzBuV0lydGF6NypuCit4c0xVQGk/b3NRU3ErdmBlXnklezUjcnNkbyF9UCFlUz1XV091eUZLM3lnQz0oSEMwaDYoSUdsfGIpSjNxPEdZS2lNZlR6UmBwcl9EaUpPCityU3dDUk9mWDw1eUdUczQoJT1ISUt6OCQrPEJKVV5ifWJNOU9AJnoxRlZwMzQqWiZ9JDlOM0xhV05ve2dmYSpRemo5Jk9nM2NUPWooT0ozCithVE1KMUFKT2FZTkRmd1deanNFKkhtfWNCXlooOWpeWHZkR1VtVyEqI0UlUWRsPj91PTNWYXVnaVV1WHE9c3d6XjB0TGprTX11bmw7OXNSCitQTTtISClnOT1SXyVuVCNRV3Q+a0NjIUIxfH1VREB0Sn5nPyFEVTlVVSh5RHV+JE8mMF5+T2NGIURUP203dDc3WUc5I056Y2s4dVdJTHVkCitAfTZXJEJvKSt8d1d5N0FkSWUhcURKTTdgP3hvZUhhZz5QSSY4NmFVOWtvYCppP3l4X1Q4IU9QaDRGO1NOMEJ6YShUKiY4TjMrZyE8YGlsCit6bzA1JipWTXlJOCtaaVB3MF9tb3YqXlQ3amo5eCg1SXxKdTFjNDJuTlo+IXw/bDxlND5NKG5pUCY9ZXt8dUdub1RrJlFRbkAremtjNjtPCituNyt0JWU/RylfVT9RLTY8KkRHVkB9bD1AQ1Y1TCtiI1IqQjd2SnBsRmpNaXROS1lFYDVoe0ZHYkhXSTdFWE1OM3FuZUs1QXZqTDxXPjcmCitrMVhlVnpGN1dtcyh9SFVqdnxtdnI9S3FFWmlqR0lgKTBfa2llJjwzaVF6d2tmNlIwWGc2JTU3WCg0Njs4UkAmK0VGPnEwR2dGd3QmLUV0Cis9dEkzXmY3eU5qdC1NdVR6PHE+dXw9ZVMqSmlse0cjUCRSI15AenVRZ3lNb1QzaiEoeDkxOyFmYUtmN2EoVnYhMCYrPWB7OXwtWUFnbmNGCitoeVFnY2I1I2cjKHlLaStCTUw2RWpHRj0+MiZmdkhxbEhWWFp2M2RYRyMhb0pTOSMyVlRJUDUxbVgqM0QmeXtvUXJVZFlATHQrek43UGFOCitiN3Z2SnNjY24mIUR2PjtlbV40KWhJbkZieXcmcCZuQ1MjfVIyLWM1MlR6PCVnLW8zdU9URCZgZCVrSUlabGM0TmAxVyQ/eDt5KDJjSl4/CitWTzJDPWdeM2JMPikrZSYpfTN+N2Yrd3xhVVNgVHxaUGB1flhwN3olPFgyI08jV2FpbUlUT0FpfGtHfCghRko4V3otO0FmKyYhO1VsWXlrCitrPlZ2Q3xOeiZOT00yJXx4PEdyVUdHVW92NEd8XnckbGc/QyN7cmpGPzc1WSpTVWJ5M05xWUFhayMrWilCO2VgXmdheUFKSHBwQzlaOXdECis0RWZJa1AxPGw7O2FqNVp3TDlBY3I4blo/Z3MyRThWOTx8S3AlOCRxPzZ2OzNFQ2F9TEQ3fDJaUGkqb0ItNFg0X09MSUhzUz1XcU5XKVVgCityISU0ZjJSLUFKYlNtbEAmdzRBTChLK2YzdSpESVZnQ3wqS3ZmSStFV2NkZX1wek1KRkIpQUohQ2laY3JBOG09YVZSRlJZejE3d2w+cDBJCishYkV8WEdiKzkwPF91Tl9kPFJRR1ZFe2EjP0Itbk9CeVBSfnBBbT0mcmNvfEopVFRAVkA9JXBja1JkVEIpP1FoVTVgYWh4Tlh+dVB0V3omCisjPzlSQHNub1hoPFU1WCFGQGx9eXt7S2M5RkVVI25qYHVGdjhBJiY4ND5tdHt6WmpNXmk2Y1pnWXhTQWJjcSpLfWx8JjlwMSZQXk91QHVACis+fTYpWWVjWk9aekRzKzFzUC1CTkkqV3BWVXBGbXgwdlB5UH1fRV8ofCpQVTg0KWE5Xlo7U3JfOzNGV24+OClgNkB0UmR1UXtRPWEwaENCCit8VTxIV2RMMHZ2cmsoKGJAfGlWI2lfVmNzd08zcll4JUM9NDZEcGVPbUc0c0N5OD1NTDk3UjQmezZgSHVwPkM7P2Z3QTReTDdPMXBuRWR5Cis0QjtBbiRROEtNYHtqYnR7LUVpRnhQJlJGLSQ1TDkjQDxvVmNNWCNvMmFYUCRAMGJUJU5FUkRnYjgpWj03fnJKIWxXdjV3OzJNZzlDdyRVCis/SE5xTnxIKFhaSzsrY3BNa0VAOTNSa3Y4VUFgd0koOWUyOD5iWXlkMiM5TnVlNlktUHliRlg2aTlWJWpwYmdHcmJwPWNGdUd4dG5yMEA0CituPTZtMCtvNUNJWiUwJndvbHl4I2tic3BjelAmQ0BoOHZzMHVpdCl5PHJyJUtUPFRsM3FSMENKSnIhZSgwS19GRktYSjIhZVZNcVJ5a2xrCis2NiEyUSN1Tks/PndLZUR8Q2srfWxWWTlxMn1jZilzLXFBQzAmZHZfRysxY2RNZFkkYndIPHNhTDJHclpDKGMmc2E7IVdNX0dLeSREbW9jCitCTExfR3pLb088YWNEIWFYQTdmc1ErcCRFT1Y9Qz9fd0h+MEk1M2A+Q0FkMEBqfFFgVF42U0MpSFIkKXBkdW0yS1k9eHc5ZyVTSngzKlZNCisoMnFEQEZ0T0xZe3RjVUhpfEloJWs4QlBTRUUxNTw9dUc0bTdrQ21idk57UDFOXzh2cWVkYlZDaH1STH4yaEV8Y0xvfUthI2lJSkJqKWN6CitRJDItaXJ4Zyt6IU04OEA2TkJJMTJ1JVk0cTJBdVQmZy0rWVdqbT89MDd8S1BfeVRgJnVFPzAyeHMqdHVndzVZWCg5X3B0cEdqfnpoZEZpCitPI3Y5e21tUzkoUCllfH18ZC1KRGc/NCRNTlNGfjJldUkrI2p2NkplUXF0Iy08YFkwdHFhckg5enw9SllTMCNUa0h3ODlPUSF6OC1lYnlFCisqK1AmZC0tam1BYWppQ3JUdDR4fHFhUCg/aSpIPzshKVExN1NXd0dlbkFmPDJGaiVFbmNrcFQ0YFZzXlpzKz43dX55MT01WURpKCVyIyVLCitEVEdnQ0MtPmUmY3BfN3tmc1ZuR2VQZVc7ZDV7cmIkPVJvOz51TTcoV2hDYT5fMXF3dVYtdylAVllVNHh9dlheaGd7Jj4+UXpIYCUjY012Cis5O3A1TCtvKzlTWXMoPTV4WjdIcHY2c0BgNjNELWY5cnMyNEp3NnBUPEM3RFJLSnh3flUqQz5Ee30jRD1UZ1Q2KzNDampVMj8zZCRpVm9ECitISEVCfjlGbUgwQ0V0VytBNkA1MSt5Iytqdnc2SmNORyVaPCFDPTtfUktLRXMyXzQ2YyZQJHgocm9WaXx8NXp9bD5nTG0oKkw4UDRXT2RxCispU0FmWUptJXUpQ1RqZj5HcUFlJSVtU3hLYnVWSWZqMVk3MkQrekNqRiNHQmZUU1VzSD81bEhnaWJ2ZWZAbm5XPWV2KGkoJH11eXt8ZU8tCitVaUIha3xtR0cwc2JSbSpOKT1HTDNGMDJnfkJFTTVuUVJ3d3tFNkhaJG5eNUtmKFRncmVvZ0RMWnIpezk8d1hpZ1EjMG5CI3Z1TV8rTzc4CitKYEcpSjRNZTN7VV9FUV5KTGQ8dW1vTUN5OVIxQjxBX3xBZlIkbW9ZbnRzaV89ait7JUpvYDwlUm9Pcmd7ODx7O1dubHppPn0wOChuSG1yCis+RGtMcDMxOWk/RW83b29sQGc4ZkAoJTM+aH4lbkpeZSRyUGVRU2w9dWMjWlZYZ3tQPlI2eSshQmh5cWNyPCh6UnpHMHcqRkoteHRkLXN5Cis7NV8wV1RuPEl+cmBZWE5rbkZfPm1DbzZ2SXFwZEM3JEpzPDNaWiV5WFV2VF9FcmI/WV8md1B8JCY8Rj9RMXs7NUNEQVFJVGFVIUBIeUp3CitwVE56ZEdiOzB1S2xZKGkxeXshbHA2PDlNfGQlKiFHO1g5RU9nRWtlV0w+OWxLN2V7P3RNV2s8NDY1e3EyJmBQb0M1UzA2YVZVPnR0cldtCitCbCtYcVpsazxGUDwpRGQkS1ZxVG0zPiZGUXpGaHdCZEtNZ0tuMCl6diFHTlczPUNzY3x+QUgyNWArZXZRQkc3eVhnRyQweUlEWXJ3Skk+CitDSEUlTjJYNSk/PE1qMGA0Pj0yMHxYUVIwMDBPOF5PWTd5P0BeRGVeI3VSYE9BIUQ3NWRaKUhhQXxOYWFBan5iR0J0RXpYTEJ4YWQ5N0cmCitaYChFeXs7cHJhKiQ3MFR2Z1g4RCs4SHkzdUlSUldTJWJGTjNTQD4jJWUyRXhxQk4zOVZpZilGeVE0Jnp2ZlE5NFcqfntvbSVIYmxkc1JsCitHKFFqT0cjU0FBKnVFfjk9e3ZyM20rPm9vK1NMRlFjMmxBPmNEclVxPTxpaE84ZCQhZmRYZno1b3N3X3lGWmZhOTJvfkE/O1JqQ1lORF8hCitRYjtjND9kMi08YlUtSUx5Rl9qdTJnNm1xTUJ6Xkw2a0FuQDVBJTFYSHIra2lpMHlmV217dURAMlFSQzdZY3EqODJLRmUxeVd5eU1EVjloCiswa194aFc8MmlKVD9SZVE5ZjxPPklRM2xUSSNTK0VYJChocmZkJEUlaWduUkNiZEIxN3JiNEJwSStGYSF5cjlsVj8jJXw2Y0VaISRLR1pMCis5cGY8dmdJYWF0Q2QwP2F2QytwMGRIP1BARmZYdUBqQyZtdU11Ujwzb1o/PzRDb34qeE1rUUh1cHV7MEdoLUE1dkByPipVQTBUV1ZodS1BCitBdmF+JSVFbkslTHM8WWN0ZzZ0aUAqRV88Jjd7aGkqXzVoQ3Z8LTk8XmVfIT8qJlJFNnw5MUM8YCh5I1RTdVZuM3c/d0JeXkpEdjJ5UlJBCismbmhsUkl7RUVnNmA4d2RKQzdgM0o2JlF4ZVo3QyF6U1Zncl91fEA4YWJ2LXtATSF0KWpTd29Gd3R3Pzd5YGg8a3tMZTk9WWE2JkYqe2c2CitKcXhKV09+THgqOFpLNzlCOU5EMnRaZUkkYEp1ZWUtdW5lQlh9e1lYcHRQIWglQU9VN3hLcHRkeWhSd25JPVhNP1VRajkkS2B0Kkx0UE09Cis1eT4kJF8hRV8/M1k+aDdtfHx6KDdpSHVlKG5TQnNUI0pndFAzJWt4WD5PR3FEakVzblFEaD09Nkx7MD1xRDttfH0meXB5JDREcWFlZSh0CityKndMNEpWZT8+KE9qQmlwZ2twSGRAQUF5bnVlaHBPRSk+UEFDeE1weGxjKkNvOEJfVEdzXnZFKipPN3ViMDFFQ2VCUnpjVz5IKVRyWSN4CitQayoqeE5LdTFxNVZzWH5Uc0JvdGFXdlBVV1ExOE16VHBiSSQ2WSEpT05oYEc9MDQ4NTlqblcmN1ZIKWJTYDAmUng8NH19P14tSnUqakhnCis/Q35KVHhCd1RIYW52PFMleDZvMHw1aDAwVWE/OXlKJD59bUNsVC1aaCglYzd8dW5PYW80cE42JjtCbGlOaVpFOzFpaSlYeFB+TXQ3d2k0CitQU3h+dThkNkQ5MDZHJkQ4VyMoZVhiLVo0ZVBjVz1PYjVaSmJXdl89MW9FJTtjZ3h2bHpfO0NEe09yXzwtPm9uK1RVNWAzVmVQdCh0JTFmCit6PT8lQT1VUHQpJnFLfEVvQ180Rkk3SjFMeGRrNSZOS2g+SmBoWnZXfVNlMXJzZzRwM2JMQkcja3FzZEZGMGImQE00dUJrO2twPDdiOGhYCis+TXJiX2IyIWhJRklVanZrPyNJUWRtdXp7S2dmb3NpenBSK0dQbCU5P0FyaWdhXkwxZEswIUBRfTBmTDQtM3AwTGlBamlAQ1NuLXBfYChECituTXwjU0UocSk/N2RSM0s0NU4taFMoPikrY3I/TWNIZlopJHU0bF8oaGdtWlApaSYoZ0c0N0pSVT5VVUwkPn10P208VlpqUDlRX31pJDZ9Cis5K1Q2UGgwYng8fW50RWJhRFNuTjVydmE0Uj5MYjdwX0pXeEIqJTE/I25WUktrWXAxPUtZKmtyVG5ubld3LWVHUkAjYW1ib1A2SDVNST5aCitHSCNxN2xlX0pPTCg0dDslOE4kMEIjR3ZOQD5WPUNHdl9hclVXQlR2K1dyaEtEMUZselJkK0NVM1B8OF9saTx5K3szci1xY2hyNDV1UDBqCitRPEd2ZHhaaFlubGxRcyRjcilebUJTNShpMHVKSV9RUCRrI093ZGEyUn5II3E4UykqZyVfcDBDbiFMcXhnM2ktc3VAfXtPbiU4R1pPN01mCisjdzRfNzRAPDloZjRQdUhebGB+Kj5GMm90en5IMVQmRipPX241aTtkPmV7Q0puNk9UU0c5dG5wcW9vI2xDPXZqdVB6QikpZ21gO1l8NWFlCis/PF5AZXApfTNoVzZyViNKcVApTXNAZ3xqSGB8IXs1ez0hNjt+MXBqaTNaO3ppYGJtd3VHS0A/aGtnaUpWa151UV5Ud2p6cH50Ui1XSispCit0KCQqeXlqK01PRCt8RUptNUNaMFRFcSRvRCtPP1dKb3NIVjJQNHFSN3E0YD9senFpWFZTPUlRV18tYCM+M2JTPGUkTnFXT0J0PlR4UW98CisoLWdaS3Y5c2ZgeypkN0t7KVdYUiskakN2aFBVfFg2Vl85SiozLW9rTCViMlNwbGFwdWlic3JBSSslLVl4Sm9GQi1iY0o5MnpRNTJiTz1FCitjRzYtNEVtXklsYj15WFdNWlBaMUh+cUI1VkVxS2s8RFM3NGclbHt0QnMmbkF5SGBid1l4bWRyYSorJipJPWtEbXBsakhXU1VAVD5GT2dVCitlIURie3NUfTswfFhRUjAwME84Xk9ZN3krcEtyP2VFPExlb0Ijai02OTUxSmFBfE5hYjk3O0piI3FeMVopOWIyRV52ODBpJE15KUZjM3hlCitiQll7NlRlbUsxNkVScTRCKzEwKHB3Tk9+aU54Z283UjJ0fWYxZnd5RyVKeSptWVBRcV5fPEArN2o9SnAoeU53SGVqQzdaLXk4NE1VVHdmCitRTXtjMWxGckpaYUQxWHlIdkBVUXI3PnQ0eDxWY0txSWE7X242RF9mcTFLVUIxd3I7STxmRnplTF5lNXhqcUd7bV5QKWg+QDZhV0FLMm10CitleTdEdUErJWghfTcwMDhRQjAwMGFDMDAzfWxhNCZhZ1dvMndHYUN5QndYPjs3aHZFVEo4Q2Q7VDZ1JENZdEExfXEyUih3emlFMCgxYTw9Cis4MlQ1NV9LTG1rNj1JMV94S2AjUSoqRUgzeURlKGF3N2hSVDZRYF56YClmXm1PPDFeaUMjfE1fMjc7USZ4PnltWCpxaXg9SGRwRF5AQmdRCitaO1kwSmpJOVJSOyRWT1JfbERDPTI/K2NKR0RzYGNnYWQpd1JPQCZrMHQ8V1MoUiVRJElHXjlEOz51d1ROQzdEVVlCez49JE19JEooQmx9CithPXBvTjRHcjJpXn1WXihSYUtQY1ZjOGFvclkhVD95dHF5MytkUHxfJEdsdnYwOGpIKyo2dUZhQithZFB0aEJrU1pgJnJiP0x3fmBkJXZACitfOEA9OHYwWW1lPU97eE4jc1VMQXE9U2koVWBeNUNKdEAxaXE+VWpSeUMlUmFhc3BkakBvbiQjNlFQc0xLTVBKakNLLXB4UUQ4QVE0VDJACitoPXkqRmo5bmhLaF9kfVhOeDx5P2lkKyFsRzZxXjJ9PkdIJUtra2VJMnF6YD88TFMzJHBEPXVNTkFNUXk1RjdXWVk+cjlhQFB6Sk57XiR5CisoM1VfZUlWOHAhdGh+a2U3PzMxMGM9bjI4bWU1XzJPMXo8PTI8NTw4TG0keT9BPk96eD92ZVVvWU9vRkR9Mm1gMG1TPjdaIXt+U1pfWGdfCitHeXk8Rj5NUDMlb0dTN0RZekVFOUM2KndIJndhTmJ2O3VXQEJgalR2dWRXKyQoQGQ9PWF0UkB3fGhXZ2shK0NwKHp0SFl2VGJHcnJDSytZCispP3UldU5WdndkbT0mb21uaSQ+PTJMfTVKezEoLVZEJSYmYCR0IXclMzN5YjRJPH17R0U1TlRWK1h7THhJXkB5MXl3P2B5cUFaciNZOWxRCisyaC1PYF4tIzYtOU97NDg/SzdJNylaeD9UX0U/PDJZZkJvdl4+bzRENGUpYTdJZDw+cT4pTSpHY3V2QEB1PVZuJCFFOFRvYz99OWtTUUkyCitDUXcjYnZaUnk0PzhDb3E2UElzYj1WR35wU000NXNzIUt1bWJBJUIzUENZNyFBVnhzOVojQmJAaENCaF5jb2AmcDRTYVU5ZS1VKFVFYmp9Cis/b0Y3Jl9OZldpRXxLTHRqQHFYfHpoWDhMa3lRdkwoKWQ3UmxOSEo1ejR+dEV3eTtMPThvZylhWF57SGhIR0xCKWExJHptSHpmeDNCcT07CistMElmUkMlX304VmQrNzVfY0k0JnMteX4wSUkyP0teJG9xWDxfYj4wI1Ime2hUI3hkMVhGUFghbks5cjRlYU1vV2xQc1gxO3Awc3lSeShkCithTlJCZSU8Yzt9NUNrZlhpSiZxVkFsMl8/TXI7IXdjJXg4aDd9Y1UldHdWLWhjTVB+T3cwZXlJc31YQihUX19yMyl1MEU7dV5zKD0hfXVnCisxV0dXYiU1KjhkN29mPlkwPSY5ayF0UlN7VDd7VzdPPXx1dzYjUX1vUzNIKkVNR2pMTXU2aWA7eElIelo3c30lXkJgeitPZFlYa15kPFFWCit7diozaSg1N0RhZHthRlcoLTRsSHc8RyMtdnl7RmF5SDlrTlFoNWZPJFVabkxIcXtDPEViUnBkTElMSyt2RFRVPTckMzdXRyFoM28oaUo2CitQIU0wbF4kUGwrQU9rP3NaanozPz97NXlQbUAlM197NnhLdiZZVG4zNCEta35KYEhxZGt6QHRocUk8TnFMfTZROEtAYE1mVDVETjlyUDRNCitKaFRtJWxrVDgtOFBJeFRLKXt1N3c0UnJ7TWVqayNpNE51MUEkOG5zI3lMc0kqcDxUM3FaRjNPRHg2fVdHclJzPDdpQSVrbnQlSFBlR1NxCitOdkRBVD59JWo5NWZCPGdyd35aN1R0JDVWQ01ka3RYJERKfFA8bVcpeE17e3k4aDhhVC07czNpdDA3QnE0WkpoNWhTLU1zeXVIbTlNOT47CitZbzlCa2cjQSVWYFgxWTFUTEVrMD8kKFdUY2JWVU5NSyYxZytBLWg1a3BmM1hEUFZaKUpKV2I3aXZ+P3IhRHQjPEd1RCpac0UlYnpXOT4mCisyTnVAYXtNeXdodSVDcz1xe0M5NT9vYjQyfkU3SEdtWUk5SE42RVNwZll0Vk9UXkR6TH5fdTtgdHVZbm88JmJkMWFkMSFEdjZoUlZYQVB6CitoQWVYIWF7MDRzYU9CR0hUTChfUDtuZVdFK2M7JT85YCZuNEN8ZGYwUzdmVHozSl85SGc1dHcxXkAtJigtOGVEcF8hJDhIV299JjR8K1FrCis/MnFKcVB8VUBKXk8/aDVRZFVUbzdGeURrO1E2UTlgZDlUU2haZlhSbzNpS2ZOV3FZPDBecXQzUDY0TyokbFk2VmJ9QDBMWEUwfHVQfD8qCitAbiE/eDArdUZpRSNQdWNhMlRjekJsVllaM3cmUERwcnpTejMzSWdvMXd3YGpSVWQkeF5CVTtCQlYhNlU+PntHUjA0LUlhRENGVHBpVUdmCiskOHg9YUBvKERwYGg7YFE+NDVNNTlLRndDVFpofi14aXdwUTUkZyVYcC1xJDR6SWVncXlJN2YqSyQoRGUzQm5YO3YxS3FwX3dObSlidEdnCit2fXkpYDFJWTZ+UDMpJmwqblF4YWZOTG9jcWxPT2B2aVpgV3RmWmY0VFk+dHw9NXhROT45SzY0TUJvISM3K2VxOXpkRSZ3dmNRTGs0PC1LCitEQUNTI20lTHI0XmhnJXgmV25HTXM+O14jVE1XXmNRcTU9b2pORGk+JVFEaChvPClrUFdQUUdFKk5Kb18jYn0lTGdtKSFMfDN5JXUxWVRQCis3TDshZVQzd2ZCKn1ORTVZNEA7V31GQGI0b2dGKXZTcVNwSzNLdTshflZqSHEkckNGRUNpTWA9VXEpWkI0WjR7MVJhdXEpKGA3bXojQFoqCitockh1ZCF7cipOKzJvP3MpSXAhWC1EWDNCX2tgYEAzM1kmIzYwRSktZU50ZjBLZDJZKzAkQS1GQWhybXdAdFU+RDk5QVQjNUZrVkAmKEB4CitMYiMrbHlzUGZkeHFhekB6QlFtY00mdyVjdGl8PH10ZURgKnk/OTx6Q0Y1aD94OyNkI3BVNlIkPjNgZCUhdSYmV215Zk82ayg4Y0NGPFE/CishJV9pUHNkM3xTfEVzfXRIJSghKCgkd2hJYyFFaH0yPmNPUXB7ZkpXQlg0U0liJlFlVG1oTEs+cUx1KXZ4LVNvZXlQcSp+bWI9d0AtYURNCit1MnNvQ1RkYFc4JTBOR19AZHtkODclJD96fVpuNCRjTUJRVm9FR3k7MDB+aDZmMjhXUmpVentgJk9oYHNxI1IzbihgaXpEMTdvZDwlM0JzCis1VFg3QjA0PlBUZVZpZnVRVW8pRGdsYWV6QURlQnliP31mREZrVkhTNyQlI15RWT9iJigqVjJyfHlmVUE3RXUqZDBuaWExdEwzUFBmRE8mCitzfHZqaDVPaXFsZ2o7VlJ2bWZhVEx4UnR6XmhnVWF0a1EpYklJWlQ+NUdUZ2M1dFhuK3FiZm94RlIpMDUtcVpzZzw4b2Jnaz1DQV47fm0hCit3SXxYaXxjN3lhRGAqeWZwVVczdjRYTDZvVClzdnlLJHlzWitrektYJUZecDE4MSpZZ0NEVnxRbHNIJlNQK1hVMHxYPW02MnU0ZX45I3ViCitUMTslUU9lMmRzTG4waUlpMT5SbGEpdkpWV3NFUDxvYz1qdmxlcGFRNHp6a1lGYTF+fnhUbk5MfChmdnd2d0pCNl9YLXF6RElISnVKQlBDCitLaDlqO1RXblhmc0RrP1cyIzEtMUswWHlecTsoIX5FOzw5I35lT0cjJmtwciF7bFEoZUY7TSpoeTJLQE4zXjlNVUtaI3FneFBrcDt8MyZsCitWU3hIaHZDUjBfMlo4fXN5NyMzemsyZnhzflRiKzZkRSlMKDJlRj1GKU81b2ZNJE1YSEEzfXFKamw3K3I3ajtYdmtEem0xdWxwRG9wPWkwCisxWU0+UjtiSlI5VkE2cm9mdnBBZXNpRFpVQ2wpPXp6ZXdfMGNSdVIoVDJeOVkzM3l0eE8jKVZ7KEpBcFE9dEl+XnhDTl8oLW95TTMhZjxhCitkNUV0WmwxTjtmRWMlWGpqalI4REs+UDQxS3g8RCRQSDY5Zl8zSmkkNEp3UXxldT8xYVUyTnQoKmU7STdyZVhibm0wNilUN098dHx2Nn5HCitSKGFgQSEoNj4hamgyaFUlQmpAXlgkXm82PHFCNnsqWDQzNjs7VSV5TjdJZVo9dDJCdj8jQmUmJS13KVQ0ZktFdX1qY0pieWJQeiRXa2hTCitlWWopb2NTczJncCNGTlZGMjZTOENLTFcyT01BJUtDaiVma3RPXlc0cHFtYnF6Kk9vMlAxM3ZUc0EwaCZtdzI5bDAjP2x1UXpRZnt+KDA4CitCQzQ9PDRIV1JuaT82aCpuKzM+XmYxSz53NXxvcGVWQGAxeSRsZTVCTzcjcSVjQXk5Y2hSYVVUTSYkaDJlOEJXeHNQOEBMJE02aFN6UWYyCitHZVE+bD5XOUJ2VHpvcVhpTU0qJXZnTE1tVXBlKD9TT2hQYjQ+VlVyaGMlTFhvRTJENCpWdjUtamBNTD1BSWwofDtSPiFOO3w8fkVeUWB5CitHYkRtaVRXXnhQflFNS0RaJDVCcmZee1o9aUlIeEJKJERvaTBgZGAxeWFFJVpkYFdCN3ZPZEwkYzI7WUAwRGxWV0hmVDBYVkhTTGd+TkZfCis5NCN6U29AKVV+UmJ7V0FoQHQmPjgkVWdUQz1DcCFnWCQzS1dBJFlqelopI1oxV0ItLW5VOTZ3MmVUUjt0JiZ4bFNfOHEqKT80aHY8SG4hCitQZloyTmBYZ0w5P0olWkUjJmRVYWVCSGBgS2JBIV9jLVF1KC1YUm1TUEQtST9CZTgzcyNOPCp1WlFMZDFMU01remQycTY1JUFtcDc8dSpTCis3YEZDQFdkJjdzSXxUZVBRP3xsKlo+YXhQRFMpNCo/dnZXeXR5VEtFakE+MW16d30jbjk1flFtJGBPSSFLJSZOMTNKUHQ9LTcjQ3U9cWkjCisyJlBnJjdWKzkmbHBMJXlUUW1YR0J6TTxIb3Aydj9YbmhQYUJoYGMyRGNqTVdxYGV1fGxOb35CSSYzMXhHe3ohYkVCI0w9VnJTXjFzbV5JCispJkQzcVYqNX5MRW5+YE1aK3duPWQqfiE4fE84ODlpOS1MSXAwMlMwUTdfSmxKbStaSlR7I05Vc2wqITY0OTB+WVlXVTBUXipXRFo3WmMjCit0Kktqe1lrQyo1RzEheTt2RkVSZkoqQHUya3hGWmR8aUR2WihmUkh7c0dNenFTMih0clYlPUI5Qy07MVhpR0JFUkFyJnpjb3FeU1E7eCRYCitfR21LcVUhVEt7MWE7cDFsRGJ5aD5IN24qe2ViI25EN3VMMlF5ckljMHE3dj54KkpNWStrZXg5UCt5dD9VLTBwbFlDXy0pc3NYMnZKRUwwCitDe0hYI29PWiMleSNDez9edHApeUE2NmFAP0JfdzhFPkAlaHIwUkJkIU0kSWk0aFJrMkMkWElHV1djJCR6KnFeKjRrSnNldjgtRU1mV3Z4CitKR3M/X2RAdXpCQ0Uzb0hmfE9wQnZNOXtgdHtWUWJ2ITx0Q19xTDQjKSY9USlXWmdHJDBNUD1xaFMpc3plRiMrRTZhXz5aVUQ9fTNZKm16CislbyhgOTg3WnFWdEx1QTglblVETl4zcDN+Yyo9RCpDQml5biY/ZXYxdEgqWiR+X1crZXtTYWUkUz5iZm1MWG51YHM4cjBRZHJaJlNCZEFQCitsOWlkcjRiPDg7dDxQTnA5Q2lhMCpEVn4leGt1eDctdmQ8Tzx3dyM8NUIzTkh7JEZPIVd6RkFGcWx0U019WUpuUkNMe2o+aFokbHJrbHR4CitYJnRlcGs2PUReWi1gc2tpO280cEVVR3A2K1A2YnVGI2pVX31QZVE4MTs0SillfT1qN2dmPk1tKjlqQF5VYGNacGMleiUwVmlrVnxzPz5FCitKI2B3XnZxVEM7RX5TLU5mN3VEPU1WN0dURDtqZmNjeGpmJGxGdjtpRXdWUzlsejdFUkpVYEtlbHdZMnRhZmpjezclczdAajlaJEApUTJRCitNa2swVmJgI304RGNSTEtHJTUzYVBaZjd0MDF1MjtBcVFfZWErIz4hPFhPe1klQlNKPT0/JlA0RE88TUYyPDdeaVJYY0ZyOEVSMTlnJk08CitaaCRNZUpoKDZHQklNY15fZiVeSiVOXmN6U2h4Q0JaRntfcXdJRjI7Q3gzX3F+NjFyNEBodF4mYnEzKztoM3tBQTY0XiVvckV0LU1gS25zCitkQ1JmJk5ZPj5RP2pzdHVVVnkyNEdQPUxaQCM9OHh5SElBeyNfK3BfWCZkT1FXVzY7SksxSyk4cGxVfiVBSEpeU2BxUmUqe3crcX1zKHVxCitlNnlgeHtsJGFrRVY3bi1Pd0A5MWVKSU54RDJ2eiMmPms+Z288YGtoWmBiSW4pb1oqY2d3b2ozOT5NK2hEbjttd1VORjxtUTBJRFk5cUNWCitNZUJYVWBtWUNKbzE3bTc4bitVNSp9RDRQayFEfTUwWWdnbzEpWUpjWmg3VElqQikxQFc/endhcDw8d2poMkZALTN9WTl8TEVQTGk4KTErCithMEZPZVNpdjYrciVxU3UodHdWQF8oQWl3WWBOSns3WG9BfClCJEpvWmlhUiMtYUhGTWl5PEcyTGZCKjdsZmFMSkxwY3gtUWxxbjdpcmRKCis2WkVyfiRzTSNrVENxN2hUa0ErNUtxNHRRX1p4NnY1e2krTCNuI0V3N0g3TERnd0hpQnFFNCM+UmlzbXNmU1hnYHUmX19VNzIteHRWWDtECitMXm1ae2NvQnNqUDtHRj18MzkteztFd0U7LSVXIXAzPkNQUEBYNzQ4RTtgeEdDNWZqbEZpV08xI2pBfjVscUNIeHhpTSRtMHxxRkB4TiFGCis2PUMwSkFrfG5oSTk5blZQZitZX2V4MjEycD5YPWBmJVNMSktpcjFJck9UNUpLVDdINz1MNXpmQ0x5OWQrS144QW17b0tMYm02NzZfRmRmCisjdGJeJEdRY2BDSlBNamJPUXlpZXZEdUpieC1kZU1saWc8XyppRmtPPH05JllYMiVCPGlISnRlXldHWWJRTkZ6YDJFIXp8TUFhblVpKikpCistdWA3Mi1aJjxKPyYyMDJASjdUI1plJDNZWCpCZS0zKmtyOysjfHw4OHhSVjRZRyVMV0xsa3ZeWDhib2p7WnpFJG5VZHs1RUYlbDFUUCFECishPiM9MiR7Y3A+JUV6Kmc0ajRRUDxgMk1VVnpDPHM8Ryk+dmJyYFhCSUNqS1RLVFZ6YT1wIWROTj9Zam59PTZ4ZHVtKyEzczBEV0prZmNBCis4OSgxPWB0U25TJU09Z0tAJTdxNGdWNUJFTjMhZTZ7VG1XPUByRWhzWEwhUj41WlVsMVNwb3JLQzVsP0haa3lXIVkoWnskZ2ZGPX4qZmhlCis1LUEpc1FeZnZNKzt3dUZzQT94cEFnS3o4eyp5e1EpcWFvPDBjWjFmVjUtc3I0WmdZa2ohOU41RCVtdDM5ZTZKNW1lcmAqdj5Oei04OHQkCitLR01ASnVyJX0xRFF5JEdONyZ3QUZSc2xhSEpeKnhPRjBVTUdmbn1NR0olTmh3amVDb14xdGJ4VVoqPHdrVyh9JW9FJX03VDR2LUNXSFdSCitkIS17cXF5d1hLcDtPIz8kYDFGIVNlWmp9KDBTXigjNyhFZnhQZEdfUjVwKzRlYF9EfTl+blBmeHYoMnZAUDVHN3Z+ZG1eR1RuRyNnUVdkCit7djJVal5QR3s1PiZ8JSlfQjlmOTxUQzNacCswPHR6Q29BQ2ljOCtlR2xnKTBFb05UaHEyPytkRipDJFdeYUMrKm5pS0l0PjY+ayVFVEQ2CitMKzdkZzY5X2Vxcnt4WnkhOEJ1TEZ8PkApQTVCPkIzdUZ7NmJ4SXVeeXgmQzdJMGlkYTJ7YCNmdnI/Y3o+MVFDWTFSZUtgY2RUeyF2cCgtCitXQCk3OH5+RDF5ZUFyIW16KWMxTEN+fSFKaz9ARE1FRmQpbWpOfio3fGpBZHFmSW47c3EpWClybnQ9XyVrMUl6P1JxakY2cG5iXiMtS2FqCiskP2s9bzU+Y2BkKTVZJU1QdjdxYURfLVA5OSM8NFRVYmZVdHFKVHp2ViROOEg1dWR6dGc/JGMrJH4hQ00oalUxYEF5WTZLQ3g/QWpMUkxQCis4YUg1RjFUPnErOWVgRDIzJEQ+O3UzP2U+UzckTyNmTz43TkN1aDhQZnVSaXhfV1NPeCNlfm5ja253RWAqNms3c2lxbUVpUDAmLSp0QV4qCitrZGdXYi1VJWNyWV80fGE4Yi1oPnFwIWZROGp2bUomYl5PdD47KXNNWilpJXJIS2o1MkB2dHY3UjBfPF9Yb2UlQmxveVVSSylleT5NY3EpCitjWi1ILV41PDhfaTFhViM8elY8TTdqYiZvK2E2Yj1DTEV+dXR+dGlBN0d4IW5IeTlqQCEpXldVU2gweyhlKkxKTEh7MlAhQGVrWVp0dGokCitTWUx7QSF+WVMoMXkzQ0VFfXV5Q3Qje2xyRTd4eExxTDVkaj9gPkdNV1EqJWlFendscW03OClMPjtgVFQ5K1duMmpfUnFWKzRsQz0/c0xZCit4b3NhQnNfNyFoaysmKms0Wj1LUV55R05TQGQ1UjFebjhEPU51X2BOOX16YWVlQXZ8YyR6OFFFRiQkNGd8JXktS25FVSptTl9zKk4+S158CislV2JuKkdaMT04cnlDVThQdD5XPmdoNUV+TCt4I0dwdGQ4PjY3YFZ7QXBGUWI3YT0lT0FjYzw7I1M0TXV6cGN0Kk1MV0AhVT1eeShCISQ+Cis2V3d9Y0JJcTJ2TS1MK2xXZnE7P3taKCo0UHJrV2RJYi1URnJoVEYlMGdWKSpDcjxMY0hvSz9fd0s8dVN+e3d6OSQjIVY7aGxQdmRUQD97Cit+b3pfTElqdnBtOHZlZDheMi0qcllPN3dgfitLbSZfZmBvMGZpSHEmPCFZe2lAVXcmeGtUcHJLQyYrQHZpczFlRHx4YjJjYypBfDFfcTd9Cit9am9MMGlvWG1tbTtFb3J6Jmk5ZUw5VmQ0d2hhdktTYVJoQW1YZyZKOzVfP3owTWc4b0ljajJ7MmdrT31INHN3OCl5JUNGLWkycDxmMXJBCitqLWB1S3twX2JPPW9Daz9zeH5QREhSNXw8QUNnO3lQT1o8LVhkMDNBflhaYGdXNDF6azx+SlZZbVY7T25XR05KcGx6Kmo9dCtPKztEKUd+CitGfDd3JlcyOCl9bDlZfkdAb0BwMUVWc0NCNXwtcGJycDxlTmp+TDg0cCV4TmRZZ1MpTj4mN0JYPEJSOUM8VjJZST44RmVEdUQqWUJmaFNtCitCeT8lVDc+YnQ5LWV1QW5uRy1aTTNUTGMpWEltbEZlXz1uSF5oekU7Ym5kJDg7eSstdyVoTmhRO0NlTT8raytNPW1meExUI2hzNk5AQUVVCitxMXp5TVd1IyN9JGZtcXVKVE9OV2tIbk1VYHZIZilNcEF1OztuPnttQXdmJSMhKTcrI191cGBVREhKaF9icW5+SWtRbCU0fnVjIVBrSUVoCit9OGAhWU10ViZvPnRAeldufiV3X1g/Q2RnfEMqO3tnPG05UF9zZ3YzSTc2cm8oPCR5KjlfbEVvVi0kanAhQn0yIWwzYnY/KHtpNnUhVjNPCisqP1dfNV9nPyM7Wjc5KFdZQnFnZFo1Sko2PUo/I0M/YyRgN3lec3o0MWQlVTR8Yj1aOVVAUSs4cilgSiNSdmJWQ0U5b1R1P3RTeCFfREdnCisxaFd+YU5USz4yWGk5RG5DVlA+NGpFMkREZEo1V047S2NgRHBGTz5xY19AZCE4UnYoel8zQHN6OT8qXnszTEtfJEVmeUNhcipyWlgyVnZsCitxR1ImY0lmVWE0PC0xJnxMakIrc25pNTIxPnlpMD8zKFlySyEmTU13cj0mVzVebj9kJTF4XiEtIVVmKVVCaV5yXmNffHFAYVhWajdFfDYzCitnRWdCSTJ1WTMpRGVodDZ6MCRRZEs4fEw/TyVyYE15cihte2lucmJDMWVhKnopb0lEVkhoRD17TmtORnlCOFl4cDIqUyhtSSsyYG59IUJtCitleVVXbWxVSkR9YzBXciZreUAhfCh2OTk7ej9ZPkRoanxfeHlmbDVhUDlMeSQwNylaPE8hdXhxdFRfeGc+Tml5bThiQmVNSGMpX24jcyRACitSall5M1l4UFI0TVkzPmclTzYrR2pjYHooKXNGUlBxKnkxS2tXVkgqY2tEN3FxUTQ5eWpGd0A4UH5MN3NyRFFRZ1RjY0g5NSF6XjVrfTR9CisqaChHKDc7Km9rUSp7dCZnPmo/ZzVyZTdgS0xvYSE/IXJNYXRFTVBGMVA8KFFUZkhpYEkxfihZPGJYckRXcG10VkhZaHB5Xi1NbUdacVB8CitoV0lvPDg4USt9MlZvd0ZxR3EoSGI/OUBLVSskSEgqeHk1cE9WZylTZzRqYWJQUmojUiN6NHZ9QSFFIzJHYGlDPTJUYjRRX1FFej12RT8jCitQUiElbUU7aUp6NnRUSEZFZWF0UXltYDZEPCVMOWledVFTflJBNmV2UFpNVTd2cWklU1pCbHZKeDQ0K0d0OEpAOzBQaTMwcUhMKD9zRHorCitoU0lzVlQhdTx6KEdNVV8lMW5UTUY7JDl5dWBBRjRLOFJVfVAkanptMVdHeyg9R1k+WUc8KnRVOWtzSWF0akhxfnt1c0QlWlk/Zj9RQ0t7Cit2O0g3Qj5uZWQ8UzJALTQkdW5qOXFJVHhBd294JFoqe01oI01eTzFTbHd7a2hPIVpOJEMzaXpJTkl6TWszNDhMT3dXTHw1bzk3KilDJk5xCis2RUskMD1mZ1k5PUhtPHZLTmVSfDZHNTk1Z2MzbTVaOX5jTUBWJndLSDhnc3E4PWBycjhqI0w0PVFFSTQoS3JUQmJoSWBtc05He0k8MCooCis8MDJEa19OflVqQ0Uhc1JXUyQlbGV5MjhtNkNweDFWOVVESlBPeWB2WER+Pn5WcnAxVU4kM2tPPUhWTDlSa3ZeMF9KNDwoOFM+dG1UWmZ8CitoN2poNnpmVyNLaSh6RjBiZCkrdEVBVkNQV3dgdDExUT9xMTkmeCY9cjFmUjJhRkVfelh9OT1iZllJWXdUekNmVWBBX250cSg7aUxuPCRBCis1RktHX2NgJlhPVSheZ1ItVz9EWih6ViV5ekA5YkR+QWtrfVVBTjVfLUduTlB7e3Q1TWlRcipgOyR7bmRTeSlaN0koYlFyMF5NKFUoflA+Citrdjt1dihlPGJjbXBIcClMNXAzb2JlZCZRREJZfWpoOG5rRkY0eSstTl5CJSpnSlpHbSs/QFhkJHE1cDlnMHFHcVc7TXVTRjM0Sjx5antpCitrbX05TWQ9VEU1TXdZIWokPnlpNjtnajJnJT9BSHk1bHF2P1U1d0dzITBfYDc7Tyt0ZUY7bXsyeUpaWUtna0l5Pl58R3FiNXJ8PmRISyRhCit2JlJBcC1eZGQ2UXl2SVlyQWd7cnNsWEdqOFVlWnBRXkJXe1J3bk8qRTZyRkpFPFI3PlByIWo3ZHokQ1lyQ1c7YmdDQ0VQMFQ2cWw8SGkzCis+LTxVIyNISiZtNCpmOD5OTGZIeCUoVmc9UjkjXj5DfD1uWXpETVFQMHBYXmo5cmpoK2NXPjUhQjswfD9LS1kyPV98NmxJQl9leWMmQmZ8Cit1QnJuUjx5V0BIbzwkZGl2answI2tINm49PUZmZmhZLXB2TUpeYGhtNTQpc2QjTXFkRjlTSFNKSl5UTEFUOCt5QkJKaCFJclpzcmVsdGUyCisjSjA+VURYX2VQez5QOXhwIVBxTVkjfDhWM3dwZ2VCNnlKdXFLMUNBd2tYaUxKYnFLIVRWcDAoek5hbSFzOXdMYEVtTXVMcHAmT2BBSFg0CitOdjxadVRAS0VgWS1FWHl2bFY4dm92cj5IbTZRPj0+KWRHMXl3ZnklIzZacTZiaHxVWGJXQlVEWUp5PyRwcXZrVElQSUUwMlhMS3Z4T05pCitQanBWRmp7elJxMStXPSNBWU10IW5ubkVvKmhnRD0zaVZvREVnQlpiY01SI148YTlZPW1AeGYhZXs7QSFNb19qPE9fJl9naERWZE1ZPkQ2CitZMzwhJDk7cDFCOXl0KXdSbD1OK2E1e0lfP35IPjlKIW9eJi13ZWpmP19AWHR1RHpMQXJleyRVQztrNEY9M0BMVj5rcDJfPVVDS1JYOGExCitNWXpYcj9rbmdgSVAzYyElIWQ9Jjw8dER2bkwkTERoVHFCVGM/QmUyMzxgJE9VcFNEXkNwQXt6TiNiJSk9aExvS1V2fUkzRV9MMGBrI2UtCis5Mj5kTGVwYjNsOChLI3t6I0hqMGVpTHBWLWlvflNuSzM/cVNCVG1GPUpnfF4wJD9RdnZ+RGBoWGtmUHtxKGZnckBxNEFWLTRSOUIyNTVACityQS1qIzVDKGspQ3tCYXVSKTtBdFVKKlZWc0RfaGVQbE5FS1RoU3habXR3VXYkcUkkPFR3K15tYXt2ITs+NGRyM1ZVSURKc28wZXI3NzU8CitaKU5aREo9Q21nNyo9cD5OV25mX01ZJDU3QXpXVWtLITtiYWNLeyV5e1g9UWtCQlZ6cUNMakRaJjZsKUNGdDJyMHlkKX5qbjZXRkQ8JXt9CitHKiQ5PykoWGtjWSFgZC1eRE1aNVlqZmlTPkxZME5Vbm85QnxGQGVpJlg7cDs+Z3JQXnt4a2lBSGRYZTI3YW1UeytxanVmM05PNjYlfUlfCitKPSVSQ0prZEsrRFh4P1Q7dClMfk55MSUyYEs4dz1xaHZULTxmV1B1UmReeFEpNkxhMWZFbW9HeXVxKFF+azFIZCl4PWNEI2lPRXAtK2lvCitFMnVHYjt5ckw1R2s5ZWYkbm1OX1cxOzNlR2w9K1dpOG5haUF0V2JXSHc8YmlPMksqVE92dkM9NEZZQU9xJjJkaENyJFlyakRIOD9vdWkyCis9P0l2fDNDOzdxc3pDMjtWbys5OS1mKDt4WnVwYHo7WlNiZCRgeT9QRkkrJUA7TUkoeUx9SzNYdG9OUFpVZ2hPSCR2ZFN3NGt8dCU8dV5kCis7TjlScG4wdWB4NWFOPHEocWErIVZsdyY8T2soXlFJV1ZTQkhZWSY3TmkqKFNmND8oXzNRdER5bDRveHRyT1huSCo8TkJzc3AtVWYoKEMpCit0QURzRjU5VjQ+YVUlcH1qRT1TYipgSmM8RiUjXnQzTldeVXVHcExRdVhYI3B1QW5EYGF8MFR2fGdUU2BaM19LNlI0WktCYFo8UD93QWNQCitaWX1oVmR+JF8xRGNvTjtDfVFyRSYyM08xJmgmQkxeaTA1WHxLeldiMzRsVj9mdVpId1M4c2QzemswSjJ9aW9xND5fOzRpSVgqUS05XylJCitTeCRoNU0wQFY9QHNTJUNodj4mNXVWfXhPTlJ8YyFIOSUkdHFuQGBUXjF2PzJaN2dQP19wfFUrKFM9S3JSM3k3ZVA3JitAXnBXKyhhamQ0Cit1WD9hPyp2LUwmWVQwNXM4a09tVkVkNFFOdHZmentUPllfVVRxM04lbV9MLUcjMXN4Q3lPTDdfLUBVOGV5KD5AYCM2S3tVSnlAbkQ5PyRACis9KD1lMzc5fShkYVpgYDQoOH0pPTFfRnpPVmN6Um9oN3Y4aSpLPzw7bUUxWGpAQVdgWEk+Sm5kSWI2cm1Eb1NtUDM7fml9M15PVEkxc21RCit6fCF7Q1BHaU1wUDhPX09lJW4lWHomVTU2LTdNbnZVKWFuTVZRQTI8d1ZZT3podmlJJiNPSTc2cV9SKzFhWVk1T3M1d2ZUUFY4c21EUTVQCis4fnk9P2p1fj9xPyFDTk1OcmlAJVB+eVdPc3JnakduWWpYPCZ8fTJKbHp6VlYtI1leQEI0IXp7WGg7Z2UkJTUle0IkSyVjO1N4bUZeVmdMCis+Qz5na0lyM3kyTXlXV3U+T3tibXhKRH1CJDYlNVk9KCUhIUI4Y2pGNWl1PjhGR2xLenkzbV9mbG5pZXU8ZnElelRMPHE7bSZoZEJKUGJoCitSZzJNPkZpTDhtUDRwTGQ/ekVPWEhsRClhTytsIWBkZGVzU0A0MWRCOCR9Jj5tOG1hV3trantoZmNWajdFa1lseGlPNkh6bkZNc2cyT2pICit9ZGN5Pl5VSUZxMmN0cVpsbCo8ITRxWHFEcTt6OHtWNCVCMHFvbm9tY0lTUzM0PFJFODdXYmQzST1OeHsqXnlWbmV8TmxAUGljWkBGTSV8Cit6Xi1JSihEc1k5SV9ARytMOWVDem10SnUpeEdHWUZkdGJBbWtweCZpMSE8QVhyOzUxYEBJMUhVKEUrYTJyNlE3M0ojZXtvaDFLQz9nX0NCCitGb28laDtSTyYxR29Tc30oMT9CUUZgdURUYzx8T3E0Kl8rRzJaJD1TWTIxPktacWBDP3F6fEQ3VSFyPztwJElCaXFANUdqOW1ibyVCWUI3CiszSEVZTzBgV1chWEYhSEh6Vyl6T34wYTBDeHNxNE17VGFYWCRnY0h7blgzKmIyO3lBMHh3VWhNWktpWTJrWSVpSjhpayVDWVJWaDFQX3smCitjdWdLT0cwa3Q1T2IpfjEyQEcmPnstelFGNWwhfDxBXitNdENQdDgoXmNEY0I4KXswU2BCRz4henFDN3NnJT5BY1BRQTYkdChBTUpIdk91CitqbENUNDlRUmNhKHtiNkQ0bnc3YjNQMjRvJDl+Pn01QEsrJiZfKVRYfCFyWU0tO2VKTV9wQVUqdnlTaVFRUFp7d2UrS2VzakU/blF0e0l3Cis2U2soUGc+QWFYe0s4czs0RD5rY3ozdSpNbCt1VzU7d21qPmZRbWU7e0Y8XjlYc2JxWGU1amo1YnNmOChmNTRvX0tnbklRKTh5UHdyTjxKCis0ajZlS2loYipCTSgkQGFsfERQdklMPmFRaD4rYUwqfWxpMU9MZTEyQiRGaGZfYjs8cChoIVVYJmE4JSReMmFMd1FpSigtempkMXRsMmM4CitQcmlXX1lkUnw5YTVxXyghOFcmVTFodHZySnRXQGJOWkRIKHpERkxPSFAxdzBOUHFOeDgrRCk3Z3ZJUUpxQzlSPU5kJTFZe2ItTCZYcERaCitENHZ7cXJaaDZnMkxQR2gkSCpGM1R1R1FHc3IpcTB7YE4lJGJnR05oWG5JTGpKQzJuUCZWIzxDeGNeN280bFE1PWlGVncrQiU9azRBKTNACis1Wmh3TShjWjM2ZGdPWHdaUVB4UnlyPm57U2QxZ2JleTxZO2R3dz8zdXFtXzQxSHdDaTxRKzMqTGoyWUcqe2ZrPyFCfFFiSkxAdTMwdkkwCitXe0kkP0d9P31+Qzs5N2FMVDg8eTJ3bS1QWWEwZTA7MTB4T3czYVpSTXkxTjVEfm5aXk0yTl5Dfj1kJip4ZmRvSVBESiZKZjNTPCFgaXpiCis8ZkN3ZW8mP3p7I3deNC1vOURGN35yO0wzfkphSDZkVCM/dlZMbXR9I2gkRjg3bSpBST9PXnp1VkhFY0M0ezs0dWNPMjg+TmduQTAwbVZJCiszJnNibTFxQyo9SUxNe1ckLVkodE96R2srRT9wM09VOV92WGs1OVNVVThMV25fRmtnS3I1cXlBNkNwdl5TKlk1UzIjcGVkaGx4eTY+a15uCisqRUh2VUduVWYhZWtfbXJzbiplWCMwbnQpWGpeUyo9NlBURTdlVm1uQztWMEBqcnItTHt7Y2AtMHxYUVIwMDBPOF5PWTd5blkzRUxWKn4mCitJJW4xTWg3WFNiTmFBfE5hVXZfMH5XTiZnV1V0ZWklWD4/eS1FXnY4YFI+NitqSFcwbipEK3VMS3lMSUhHS3c0bWQ5MihlKkUpZXVrdzgkCitZPzIkVkZrU1d9YChRcjVhYns9SUtWJCFve25xQl5XNCZUd1k8PURwI2pYYDF3XiYrLUZ4bTlhdU9RUjYzbXNjdDdLPmhWcnBzbUtYYTNwCitmakpMfmpXYFVVV25peVQjPXNkSkVHRFhJazxObzlNfXQ/V0UzPDxYJmsrUUpxczJPfkZvP1UxSjdhaUdvQ0ZmYGc/PnNKMCF2RUhudjt1CisjPTFGXmJ2bF4me3h2SzNGUkVmSSkhYmJ3eCQoQkA0T30xVz1WP1VnezNeTjJSflRLYkh3YjheK0ZjVD0pcUdTem1zSEktKVUzS0A1V2BsCitedihSfmp4SUBGaUgjWSVtX1ZSTGc7IU0hLWRIRWJNd058ZDxiaS0mRj81d2lkMWtQZUN7RCthKzhJUGMwXypgKVA4XzVqaD5yc2h5ZDVZCitMZkFJM0N3OHBwRT9hMENyU1g3bnJJSWglakgmOHwoPj9gSHFOQ2VvTyZ9dlUyYj9QYWRMZHRfd0kpZG99XnZQIVg7bV9ZVEFHYUl2VWZpCitQfDteVGNkcVRFXnorT0xFKld7LVp3QCt4SmkjNXM/RkIyd1VoczJwdn4jenU9ZV5mbj9lUVlhZTFQJTNCVnN0ZWt3dTQ2YEUzIW5fcFZpCittenFrQHdYMG9+Pn03VGh0eEhTdDFVSSN6bU1lSzsodSNfKkNjM2N6d34wMEtrUntDQSZiTWRqaWlTTkBVbmE8KGRFKXd0QntsbG9nMDJKCit+YyEtc15GP35AUnpEJEsmSkxgYW1sQSZ4NyZ+VD1IWWpzSTU4I3p5WkNvOGUqP1F0d3pMMmJmbTVDQG1yMC0hKWU3ZzQhbkcxalpiPGomCithU2RSKHphZ0ppPW9WS0picGtAUXJXJG10aEg9RktHJkRnMHBnSnNfVHpNR35pT3pXRjVhM0xkZzFqV1JBQHBAYjB4JFF9MUAkMEc8OStZCiskKjZXP30lfWB7ZVkxZ29KKDZjNHd8NTtvNWRtIWlDeCp4UCZ8TT4yd3BFREBHS0JabTYzaS1neHlGfW9iRWpoME5ydTU2M3VpMk5rVSgqCithWXg2JVVfdyZlTHJvYjY0KlVUPT52MnRXQkcqRjBaYiM5Umc0ZzJJYT52JG1ZeUZzMWJTSF9OYn1vPVdQeWNuQVR1KSo1Pj0/c0ViRUNuCishSG09QlgqNEZSRlVQUU99TGZwJnc3MTMrYSVrQXo4dXNWc35hO3VhI2U8Uy1LSyQmKGV7SFQ8cWRKR0RtcmdWT0I0dGpGZncqQTx5cTFJCitSbVE2cGc4YlpvKChMLUFObXkmc1M4UyRuRGdNOzRyQn52dlgtV0MjQUFtQzV8ZWFOXzYxZTdEeSswRDlkSytVUCNuS0pSTT9wJUhiJThFCisoV0AjQkYlQj9+aHd9Ki1oYTFhZUNUP2t9ZDBhfFJ7SSRVeWJuRiVTcT5vSHZHb24tV2F6dEVBaCFUP2wqemliSEtFZTwjQUxzZFE4fDZ7CitSKGkrRmc7PUh8PHA4NHZzMVZURnYmJlotejsrTjc3b08rJmBeRFh5MEE1Ymd3VVkhcTIxflV4RmhUMktkUSNnbmJNTkVqRTA3KylUQHo+CitgJlcqQ3orPDNGY3FeT3NURzsqQHFKKChnSEF4P0dBTVBKNUdZdEIjWHEhdU8oIT1RQSs3KEROY0tXIVZyd15WVDUydz8/QmVhYSh6MTs0CitYazBTTD07JF59QWFKc0JoMUpUXmFhKHlSaW9UQUlRQ0kkcCkpJDw+X1UpbSQ7e1BGSSUkZHBOOz9VYTZPZihSYDkhYStWNjVwNCl+VGc+CitnJW85IUZwfTVnZlYhbHRhJXAwQEducUgwfFhRUjAwME84Xk9ZN3locUplKkdkbG5QRD5uZkU3eXRrT2FBfE5hVXZfMH5XTiZnV1g+ZWc9CitXTzhNNWIxcmFzP1J8VDk4QGFMUHxOMGFkPXtoOEJpWHRoUm1LRG9jJEZVUWdHeDV4d2FneUVqSXlfQ1hEUm9TQ2JHbjspV1Y4M1BaJmwmCitfPXc/JXJKKVlkKno0NiMyUCQoMSVnK2loNSF2VEFwdCM5Kz47PDlBSmUqWVEhVzBxWWtWfEpkLWRWMj9xZVZmZVV3MjBAZCUtSHVvekdhCisocTlfSzhBVDR8WGwoQG1NPj9BMWpjJEUhRmtkd1lCUGB9P29oQX1ZISpUTyFmeG1gSTwwZT5GT1NLZ01ob3JPQTQ7akxJWlNwfnk2a0A+CitgYXE/RUJtREdFMEhOYF4lKXpLTk1edVRBJEB7UktgY14+e0VRQ2h7UXloTWRfUm9ePUxsTjxEIVUqSl5VKC0laishdlJCKm9iXzctYHpWCit3MV5ZUSpRRWpHR1dQVG8jaUY7RFZiJlNjKFAyJklGRlhhLXJrPTAxLX5lPjQ4OVV5NmxLMWRtM3c9VyR5SjtlJjtfNyEjIykxM3pjKDFRCitfQ1I4PHYoKnxwSCUpLXJFbjk1VDhUUGM7bzZQOGtOc15ZNkBeJjI7UF9HVUQ9eXZ3WHtQdUtAIUtibmVUVzBBK1hEX34pI3B7eTJpJnBXCitRSmtONG9ZYUpEWlBYam9HK007VX1IU016U0N3JlgjcHgxMUFUTEpeJEBiOGxhbzN7UT56eEFSMmspNTVme3daU3pWI3dHckRgRlVzR01OCis9cmU7ekxzV2c7PnVHeTJRcTNXVkUrempiKT9fe24xIWl4ZUIlaTxkPXdkUz9uQl98V3Q9PXtsTnlZRU42PXtKenk/KCsrYUgwNDFIR2wwCituVW5WUjU1cz1xNWxLQE1UWVpTeDVvQ0QhSkMxUVole3NOZz1vUi0hNjtPY0BtfGRvZCl3bCo2SnF8WmZseGN3MmJae0grfVZRPmRUZXIzCis9LURGNDEhNktxKHZFfXYkI0ZJPmlVWSt1YDJPNCtXNE9yRlc1PGtKJUpgJTBtSDhfRzBlYDJLYEJzMGZmTFp1SUszekB7aHM8diRyPUBtCispciRwYGsrKzBqazk3YXhkcnBfVlYwe0wxNjkwTzYjKWo8aVZ8Rn5XV3RCJXM1c045XmkqWjJQYCVvcG0wMUtDR058cjY0Tk99PkkldjxMCit6e08+OSU4UDJIdmp3PkhRTXszX1dYZGlFJW15RE1kK2s8Zyl6NlptVGAhTjJXfEc2OUlQYDt+SmMqKHtpXns/TnN7PntTcSRsbDRodE5ECitBRW1GS0pWbDIoUnpQN3xpeEt9JktPNiVvdU1ack5hMSVMJGlET1FfMk1SOzNCM2VgOCQrK0IxdDtjP3RjdiZlOWhDblNhOEdGemh7SipPCit6ZX5sYkt9a087VkhyUT4xOU02V0BGIU1xOXZUZylJdGBLcT0kZzBhbno0KFZKelB2fXx8bWZ5MHFUbmJMJHFHaXY9PkpLMVBKK2MxNmRrCit8cjMpcW0wKlExQUJfJGNrSER3N1lQfTRzNmhYXnpEIV9VUGU4fEB3cj08fmlJO1BoWGt9emkmV0hAT0tVKUc+SGhHX3coZWs/LTdYQm8/CitfO1lmVHIwczBfazlhMW5ATUthZnYkQ00yNU0oRkRASzVuXzRmO3NxZztsU2gmKmYjekdXYThCKVQ9eHhWRXhGVDdgWCFsTCg/ZyRQYlNMCit9REI/MGNuWiFSJENnU19RI1ZvcVlrfnY+bU56XjZzSF5+SHBZI1ByWmEyakFOKmdUNjEpUmFwZ3Z5OFFKOEZ+cXY8VD48WmRDUDkmbEM+Cit8KGEoI01xR35IWWp5KjJrcXZpI3lHRFQrLXo9PVZwJWojZGxldDZqdilNVkVLMChfandsOFRIZSt2VlEjMjI0KS0jMV5uNipFJTdwQC1RCitjQ2JPUl5ocyVtdnBleU5FamhRa1pmPyZFeVk8OzZEOVpSYCtqN1c/Z29WOHVHaEdnfW1PT2k5fmtzKkktWDtXRnxeclJnPSsrPlc8IW4oCitPcmgmPU5SdWN1P15CQnZLPm54cEpuOWskUns3SXo0UHo/SXtObV95RmI0RjZFdUgzI0Q5O356aFJNNzdWOHo/MV5oS3labiZlPylfKVpwCitwP3dOeyVqaiFwNCEwQXUoP0JhRkhXRUdCSHdkIXQ7JkslZ3BZQjY4PHM8fUk2bV96bWhfPjN8em5hd2g9bzRefiFxeGBZWHN+VFp1cWN2CitBNnZCYnV4RnlDVkFMJEVZIz9ZN1FAJHIwPlVsX0FRdn5rS18zNmpGIUs7Tk5EQiVtP2JkQil4KFdVWG5GbUYzM2gqfUU7KykhbDtLV3lOCitOX1VNQkpVd359UFI2Iyo2alNmKEY4Snw0MmBXVnRseE9wKWliTldnWTtETlYoZVpoREtGNztUb049KkpKI1d1cSZ2UVl0QTE4fmNHd3NlCitoN09XTC0yP01wWnAtcj5MeWg/Wj1gc2s3Kyp6eWQ8PTgjOVJPb0JMVSFsI3xIUEomWW0xRmBtZnF3NytQI0ZzKW1fNlBKQ2F7X0VmZyh0CitENytnWTBwPkorVzdPZGg3T0dPO3N4ejQteiQySGdGZytlPkVDKmsoKmpMWEpYKXtnQz5JSjRyQmRUOEo/cFdTUDJkbVUySGEqRjt0IyNBCitOTmlmJHhTPkBzMXZjejNXSTJ2dDx5YmYqcHBNdWgzeXR8KmkjPWpXWG5WUmhNbUtpbTlCNnU7b35ifGBaNDUtckxkekRYPjh3MF5wS3MhCit5LSFjZzl3cHM9bWRIRmRGISNtRHs5MUhjJjlTd3NKI19tPzMkRyohWTVnYHhVYG1vRWFDPmQtZTNScHJWQUtQcmx5UmNTI1cqaFEoVGZOCis3JDY1YHhwVEF8d0lpJTEpLXBNTmc+cUVeeytETCoqfCN1cn5+TGgmWlJVbz1+SVB0dl5sb28weDxINHhXNEVAcFljKWtuRG54SnRtenZyCitKfjJXdSM+LVIyQHtEOUpTazQ5PHltd0IockQ8SkhyVX50SjVVcVFFU2tHRFJ7aXA4OWBUJUpnQU1kRz1oKFlRfmNjMSg5YikkS1VhSkFuCitBVTJOSGw1ZzRCT1c9LUNLJFltPWw8bVdBenM1NUYtPlMkbn1IRD9GPHdKPjRCI3dDNld5TEI3bCVDWiprS2VAKmZQYWFJU29PJnFBe2Y+Cit2V0xjV3ViNX0zIyomV1lRP04rdkhzYFokM1pDO1JDPnckZVN7aCNmd151WjslUGVDc0RLMjYpS0RJM2lecktGenkqUk8yTUBDJjkmYjN2Cit9M318LVFjVVBiYiVrMHxLRyo3P3c8PWhUO1d4PSY7dzZCekFkez9DempLOEdUalBJPkF6O0FPIz8+M1R5QHN9VVV1XlAlcjBTalJ7JDxgCis+alhnTHd2WWt4IyNGZndDUSFgekdXbHxIOy0hNmhxPTw5UiVuKG1+NFglc2U/JGpyRTloeUxCWEYhUT1oKGJCRGNUIXxtSW57cUlzKFlfCitjP0ZLIWdGcXRFOXg+MFN3PXhlQmEhYzctTklxTnBVUWFiU31kUUI0VnQoMlE3QFpQenNpYEJLfk87VkBNcXx1RT10MTJzKmxmUFJ1QXwwCitnXnM9V3ZPM0ttJS1Fa3YxTCtfZHRfNytqKUFRRnpjQTJqSXVAKml3I1lGbHFhO09fMDdxcSE8T1RQPlZEJjdHRFp0ZzM5MDxYPHFxczF2CitYQjI9cGBiPEE/bDRxUlk4NFQhNiotbkhQaXo9MEBkRmI5Z2t5LWE5QFdWSH04dlhxVjhgdUZYOXk9JVVUYEZlJUR3fEUjSSY+RDktfXUjCis0JGJTT3tpVm8jNWF5fEtIb00oOVdQXyl5e1lLa3Ite3pESndZYj8pb250c1FEeiZkPUZrI1ZXPEdrJkRVJj1DdntEWClIdDIxcjx5cDg1CitAR29xYEtgbGRMdT9xYWtWbyYqemJlSXk9PnpIfGJ+ZDh0eVBKQnFqUjxNVj0lbDtfT0hLZHpHWVp7SF9+MSNyWkVtPXtIUEJtTDBNfHJ6Cis2Y3Z2MDFJNkpvI3RyJXFlNVleZFM1dzMmVSlYIytJTUxVNFM3PXc8KSppPChyIWJXMStmUkZKSGMtJDw/bDYjdGJkQjJHNTdSZWg+Y0Y+CitVMCV9VWEhWSRLUzJfTVY8NkokR15mSlkhOTFKNj5RSjd0Qy0xKWQ7bUB6V0peJFp0Q1YlX1dgVEk5TmUqZnpBOCU2NGF4dXctUzl9Uy1aCisrYnNDd1YwZHpMSlRRQXpRU1B7WmJVYld6SzhEbnIjRDhqeEx7MG9xKmN5Xj8meml1VGZFZDdyXigqJlFseVpWZUcoelJvRDNrcWRrTiEzCis4Q35kT3NEWTwjWjQxPkw+ayg4aT52PE5BbHB1ezVCPClCdz9FOF8wO2lTdVhgR20jYWVYJkJDRGhefDQ2b0tjezRMM3V0by1fNUdGZ0l0CitOJHIwZktmYXNXNnYrRmd1JjhgN28mNUY/bD1DaVVkXlE0eHpsPnxsQFdqZmhjVThGfVM5b156dnlyUUxGNXhZfVNDRDdJd1pDNjtDSU8jCisyYUIxaFR0d08lbmdFWmdUJW9MRzMtI0JQRz8kNyVYJXc/OHZQN0Y+UmdBNUJNfVI5amV7QW1TZzJxcFJGK19WeShfenhVKWAqI35QTVRXCis4IW5DYX5Zfk5fR152cFQ3SnJjJEA/YiNseEVpeTc3fG55azg0X3RmaEtRczAqbTRWZUUzQ2oxTTctKklkR2V5M3lEUF5NSXdIWGpzPDxzCitrTFB2MDdpWCVkdXxBNy1hWiMpQjUpX3JMPGtoc0Ijd1Z+T0QqZ0ApWDJBMzUoOSk8bWlNYj13NG0xV09pQlYobTtJMGwtdlRaUlplI1FvCit2Y2EqQjcrZilSPiVLKFFJZVg+e0llbW5XQC1KMmg2YjIwXm1gbFF7Yjx1WTBxWU4zbl45e3ooSkxkWUhkSHB8dStKaj03cSNpZT1waHgxCitYO0xobHFEKSE4UGBhYSN4LW5KJTswQ3ZWakBSQm04dnM8cUNJVGdHQU9kUlNGKkphVVUzUn41emUoSjRFc0VjPC1PJWN7YilCS3JWKyFMCitjM1VBSUpFfD1wJCZ1T0ple2s3eGEtQGlTYXxKb3lCRmdTPFclJmhmJkZCeHh7QCghYyNEUWkldlkwNW5vPj1rPHAwSFdCYkYkJmJGPHxECit8MmZpZDJBS1ZzWChpIVRBfnxQaHBwMlpjaHdsYE88XikpbDJRIStwVHx+K0VTQF9uKEUpbyl3c2FONDJBQSlAdmtDbko0RnZqcSZTc3xBCitPaE5uNTI+anB3WEJaQXk+KHJUe144NE84VGVyMSM2ZFR4R0ApR2M4UHlXKj1MME1HVG9pb3tGPzs9Sm9sJFclIzVAY0NBQEswbFZaaT96CiszV1l2JG5RUWd3Z0I9SFVYWGozPn5lPHExdzNfRzR9Q0A+KFhUSUpeUChyP1d3cH5RaTQkYUw7Pj1LJUw5KGtGdm0kUTRDcmlwYFFabGdvCiswSzZgenZ6OG96P1p6K25TVEhNdFIrSlFSZjVWeHArUUJqbnJjd2lNX1VFO21Lbl5jcFp8ZmMxczw7IUU+QHtWNExfOyMqcVBJbkF6OWh9CitJVXR2NzlpdHJyPkQxVXFmM0YtPXhASG1mKW9+JjlpN2UhKnhOe2Mqek5RS2x1NDx4VnVsJWpoK1NtTn0jc29he244Yz1tRTMrVDltU2E0Cit+fiFRP1dSSURxOzR9KD1AI0xxKzdMcmsqRjxgczF+IytXc00jQmJ0KjQhcEB4I0NsTTJiam5LcV9jQ1ZQP0duTEhBc28/JnpedUJ7eWklCityTj9mT0dKfFZxKio8Jn1ld09oTVZlfiRIbD0rMWBrWX5rKiUkJEVHeH0kfD4xJG01JjxoQTM9YDxhXy0tVTlzaCF7T2ojWih7aTQ9JFV4CisjeGNxeiR3X05lSD9uO0lYY1N9ZjVURGZGeCohODZkWlloVVZkUkNTZmAlQ1k9Nn56dlVxLVJRbkJ2WU5AVXJvZlpyS1gmVipiXmN0dkN6CitgNU9wS0J2TX48e2s4RVBhYUE2fHlSPHwkJXEldlFPPWZ2VyZ0Yld7YjVPazMtPlR1TFpGcUM+a3A0eXs3ZDZjSlFgSDdLIT95RntSRlhKCis4dX1SaXFZKmcoRkFLYnFUYU16NClmJiZjT0M/cEcqbC09T1hvNmpSTGsjQ18pKWcxUSUqVG1YS35jT2dfYzhtYFpKKUpuQCk1Z0l9UUlOCitmfUwte00tWDIhP1Q7cT5vYHtESWF+P2NENTRCUG5XeGNpJW14VihiKTV0N1RZMj0manBydHZOMF5qSk44c35odjUwQiYhJXhVenk1Ty1ECitEdyVmaHQ3NEpwZERKWC1CSm9ydFlwLX1kMkp8MHFwN2tocjNfTnBSMlVOUkVSeHhKTFQqcEAhM2c/O3NtPEVSRjUhWHBeRGNvcHc4RylXCis5WXBIM1p2JXE9NTEmVEdHbUZ3dVhoWUo/fDZPVmVaO3Y5UkpmVElVcjYwdXA3O3lwQ19SXjkyczZFK2tDNEFtS01jZDxjUChHZTQkMUVICistNjQ4b35TYn0tZyNIKkZDTUpGN0whIWFRNSYzQSgxeHJYU0tXUng9PFltTlVfWWY4em0pXmRfaX1RajxzPGptcylRYXtsVipsOU97c1F3CishKCRzX087ay13VUVoemE2LTMmXmM5SSNkQ3l9eEl1dW1jX0o8VDdgbFk7S1R1JENVZnkjM2lnQkI8VVNATUxQfEpuVTJ8ZXtGRHcoQWhiCitRc3xUNz4hNilnZyFJUldhLUh2RiM1YHFxZVd7SSp6KUUpTXc2XjN5aXpyYjc/UHBNeW9FX2Neekt9bXI8bH1NNjtDLSVITCFCKWpJM0xMCitGKkBNRWctMCtVWU9wYE5gO20hU0gweHt6eURhV3FebFghaTJPZXREX0tmdUN7bFZ9Vjc+I34hdTsxeDk5OWIwVEl3bGxAO3pAZGwpcTdGCitDaiM+P3k4VFJ7dylBe3R8XnQ1M14mSHdNREh8QD1sSFR1Xk9uakgoKU9qKEFOJHNMMnIhNG00PTQkYFc/eT9wQnRiZyFVMSM1N1p5UT5eCisxenZQan1OQ2NuMEVZMnZsSiM+SSlzSjYlQjd5Z0QkdWpBeCVIISRMfXdVbjdWLSVLPGg8P00mVWZQQExRU018ME1PLSNUKFh0azErendKCitBO0ZreWAldEVlY2hLPl97MHBzZEV9aHg8VjQyUEtkamdxRUk7WVh0MFZtXzh2Y2VIMj9oa1RGIWQ/SHI0c0t7ZEdyPHI7bWdPdVpzcDApCisraEtLbihjVWQoK089U1JOOH4oNU5tbC1EZSFrcVN8TzQ4andffjt3WHJxYDVlUElEdzN8M2lyMCQ8UVBHa1pKPFdgfjFvZCgmRSlKfXRJCitpcXV6YVpaSyUhVCpjNzR4Z0w5LUJGcGJDYkc+VE1AWTFyPEZ+ezc/UmZ6dkNGU1lgUzM8YTUjKlZzPnlWV1crazluaXAhLWYkV3pRQyoqCitPUFpSTmk3KTA1flNnNW41Jj8hQlMrMjJ7KXtzSTtTLVF6bFdAbHNxflR5fFZ1e09gZDwrWkdqSjVud2tSVmZFXnkjaXskRWxCckNmd3g5Cit2djZKVXkocHYkbFJIV3VGJioqaWZXYH4+cTAqUER7M2JGUlNtU2ktY3ooPCU3Ulohbz43MiMheipsVmJeYEMhKitDVF9PeVojNz1XVmVgCit3NHQzI3c8UzVmJXhRVn1+eEFJKmJWPjA+OCVvKGF7KjRUIUJKV1JlKWBrRVpuOThGd0c0ZmMkdFJOcTc4O21SJkBAKygwKX5OZXNzaTZ0CittNTt5MWpZJkBuQHdObj1oOVVhdHNGbzM1ZXxqTzNJO25gOz5NU09pTituU0d2Y2opOFQ5Tyo7SztrSnNuMXF4V0BIe0NMST8xRDYpbHN3CitOKEgxQERnSj91Wm9uaFQ8c3VSPnN3PDE1R2kyMHNUX051X3BtdjB8K1lJcXt1XkYmVXQ7MSVtMSZKXmozYnNsITtwUjg4d2I7Tlo8eiRJCittZTRnJColVGliP1htMkt+SmgtdiZxfl9YOzs3QTFSI1F+I3g4cH55TmpvVGJDTjckMzJMLVlaejxLK19uVFdwfH00TF9OP3pEeikkIU5HCit+VTI5K1lpcXE7YlNrXil8VS0kfGZnSUJaR0hpSE4rPktLUVNyLXNCSCZVWjROQCl3aCNCb2Q1Q3N7ZnxBb0JFQ2kheT0rJHZDNE9qWFJ3CislMW8mIztXUTYoaC1rTn4tRktoLU9zfCZLKT1yQjUzejlxTkJOWjV3Ylk8QEFvZCMtJnY1JmlOKmdKYTl8Pi1VcV5UK2k+I1FLNVc8bk1HCis8KGEhdG1jJFFeSnx9N2lxbmN8X0k7Rjc+P19jPFd1b3Aqc1o4fXN0cmJoNiY9dTM7NnIme3UlR0Y9YlUyZCplbEFfVUBfeFVYWWhpRzwqCis8RSU2UWNEKSRleVQ7ckU5SWQwbDxObzYjOXpjPHZSMVNsM3YrbmNeVnQ1eWMrWUEmPmNAMFhsZnxZV1VaMz9tLXUkPSR7Yng3K3IxIzAwCitSZHxtOGRLK35YOVFjNHRVVWokMmFxQk9uUGZHYUF6KDU4ayFVKjYlb29SZytYPy1hS3F6PE8hUj9XcTRgQFpeWG9PJVIoVCY5Zk5vem58CitHWV9tfUVaVzNBd0wyWUVjLSVwflQ0QUtlc1MyVns5QmxQK3N9cHxmc0JNPkxIPFkxPEJPOGxsV3I+Pl5IUzx5T2JtVnM9eFM0MUNGe2lUCit3RCYlNkxwdG9eT0g/WEtvMSNULXwxdU5+O0pxWkYtQlNJZlVvdFdxOCZgUFB0SFVlJTREUVMpMWkrOzgzYll5RGpQOURJYF4qZXxVTTk7CiskIVYtalZmfUY+elIoNCFAUD5Id0Mrdn5gaVdRdiVAOEAzPXJWNyh4M3s+Ulg3I2JPbXQ8T2hEdXxLMlJgNXZCPzU0SGMrWTxsQW1INTViCitrJElKTztmVVlPUCNPfnl2P30+UjdqKlViWkx8YXprRz8lJUtkUDhJVHtZNGRzfWc/VEwjTDViKndFMWRQPjtgNHpOaVdjdDJwOV5LcDNzCisxbzRSeVREa3ZOb3dkdGFsSnRldT8hSXlXP0l9Yj4wN3U1P3xJbUdBVWxiPH5pakZfX255N0lOTGNeRl81WmBWfkNHMEBOVXFyNXszWGo2CitzMTtjKjdxZGU3OWBWa29RMHlFU3tsKFhyTXdzaVpkOSVjIWBscT5EZWNGWE5sR1VFZF8mcDJVUi13WE5DQjFCVWxuNzl9KDhZQTZxV28yCitgY1NnQEAwdkRqTFkzZiZwdlVPU0krcGsxY29+WFZMNjM9MkA2dWlNOWR4cWVwWDEtQVBSbTtiMXFzaUZERDREKn1nbGY1YWdua1g0bDxoCitFe0Q7UH5ISTU7Km9PKzMqd351NXxBcnc1SjAzcjAyfmFsRGpVZGJ4anhXTGpwVGclQWtke3VGIVZBVSV1Jk9TUjJqWT40KXRISkEpMmFECisrUko2czwjOD56cF9+IzZpJSZOQmdibGl5cmVufX14KzVRTElVaX16K2MmbldNRk1paTtPRmE9KElkK0t6Z3dAczNQSHpLWUJIcj9zQmdJCitiVjNNa0hzS18oMCNHcFh8T304ckY+S3UmODRUclV9ZWwqUldFZFpsfHhANTRGdTA2UWluS0Rub1laMWdBanl0UD8mUjZUfmBiaklnKCt9CitZNm54QylGQG9tblhvNS0hMGJiaEZJaj1jPT1Gbzk2WndDZ3VwIzRsPUZxOGN5azNOYE5kZWZOfT15VHRuNHI3TSFOM1pZZ35HMGhvdnV8CitvO0FAVEp4OSZjcDZpeEJIOGdSK2p6VVhXMjNoKCR9Z1NoeXhaYXVjTzw3RXBZVHVOZjUmVFIofURfVU1rcEV7QkdSNGAhcTleTTdLVlZxCitiMEBubE0tQ0xsc0JiKDV+SCEqJSpfc3N4JTAjfl95PUFZcW03IXVkMTJ9Znk3fS07ejFzUWZxQXtCMnordUt9I1lrZGc5MWwqIXp+RmN4CitTa20lVklAfXpNZl4kPXFzXnJ9LTVmI3YqdiZ+KFktPGteZTNEM3JhSHkqQntzfDZlNWVzKk8tbH4+MXxXO1k1Qm0zOVNtUUw1JERZRlAmCitTQ1ZXeytsZD4xP1k2YmFNP0U+T3loWVoqe2RFTiY1OXxFbDdvdmo7cHV5M2phQ2ZqSHZDdDNLeCNLVWR3LTxfUFRuKGl0TmNJemI/MERhCituWnVUOXkrT0Y5WCtDSWk/dFo1Nyt2a2BrKElzQT5kdllEdVlEUmE1Q15XbjlHYV9uKz8rVnU7I24oeEklbGgwQ3dlaDBJV21FbzZ0KWB3CitpVWJSUHBMNG9XdHlhSUxvNjllZjBSR2ImKjszWlAtNncke1gocj1MfURRYDEkcTFAWmteR0QkNTA4VXJ9T0RyfTFUVW0xRy1PWGw4ajw2CitjKG5XNjF3V0Z4aUF8eTBnYGx7VHFTY3ZrUn1ZdTBPVWdgTmZmJTklQFRlJUM4JmBNP3cyZC1PTCpIPGElUEhOKTh4cDJBR09AZjxMYWdECitoal43OyNVYGtpJGV8IzNzaHJXQlpYPnwoN05OMWR0S0ltKWBVOVRqbExxY0lvSChnNlNiU0pmZF9aXzVLSn1qNEVnfU5XcS1YRHxaVzFFCitoM09KUmEzI0tBSSFOUXs+Z28zR3tiYUZJJlplOCpnN1o0aT0ldCo4aiVmSjx4U3ohPHFALTktVnJSPDkpVHptK3twRVdOJmc1dS1tI1pSCitEa0BFVTViKkswPU5xfkd0S28qbz9eVFZ2IVdGd2tye1ozTGFgWkwqdT5XOyZObEUzVEdgWGYyYHl6I08pU3RkZXc3MnEmJlMzQnRhSk49Citfa0tLakVuN2JWWSZSV309aHFmTEc0czF8NXRsMloyKyY3b0ktaDJCXilkUFYkOVM2Qy1XUXhRczEtOFZfbUZ3MW9xa0IyY25yT0lzZ31jCismTkxBYn5OSGFWPiFyVGc/TiFLXklYU2hrXyY8UjBoNFV1RSohY2MzeXhIZGd8VlIjJld6dyYjTkNhP18kWiFuPVFGZlRHfTk7a2oyR0FfCitvOXNHbihMenBkb2R8JEMpd3pZI1c/NTQtQjhPSFRhMmVpS2FQUEJJN0EmV3J7WV51dCNRP2ZLbHBlTUtES0g9KklNUEhoUGBoK35BVWFoCis0X00peGNfXyU+JntEQCVrKEVDQzJHWUR7bEFHKVhKSDhRTWpXS2gke3UoQTwlRk9RIUNvWlF6ank4dTxmODtGI3dtQiVlZzd9e0xXUllrCitnKj1vQE5yMzRtVmdmcTVzP2teQGVIT04wc0EzQjYra0Q7UTFnITFhYVRyJlNEMmFnckI5YGo0PmJrRS1HNC1BfGlLQk9HeFlENjxuaDRBCitBMzhxaz1ONkQ/VHVhYD5+UWMkQGE2el48RmFkPGYoakNaV0NnNGBMZnorZWElWiFhK3dFa2ZnZ0YpbVpmfUluSVdQSGAwNyk5M1hDSDw9CisobTxFezluVnZifEdqMzg7clE8aU4tTD1wLV5kV2lpIXJkMlkmSHomJWhqeUN7dmczO0RgZEEmaTB0UmQzem5EZGU9Zj1sRHlOM0I7Q2NPCitkJEA1X0IrJF9+Q0FnK0o+YHpxMSl9TnNHRTBPVm1mQiF4SHoxN3QzdkNvX0Y2TGU/SilpcTEkQkBsd0Q/YE95YndreV8lIXRzZEAyUCkzCis/QX5hS0FZRndPRi1rV31rKlEpQz1ORX5WPXFgJkYkZntPQCM8X1BIcFJKeCtwUH1RPlBeaWBNUz9CQWhGJGlpOXVQNFFpT2JRVEpoWm1uCitrMyhXQ1RvdztzdTFmTzw4OWNvJmhnRHJBfU1KdUBuWG9NKiMqbVUjVzlxTjc/WEIhQ0shXj87K2ooPiN8cT5iWXItM190OTUqNHB3SiYpCitWKkQ0MHkyMz9gRzNAbk8pTiZiP1NBZjtvKH5GKVp1V2ptRTZsNiRQTF5zSDlxQ3EoIXRQfi1WUG4yPk10OHEqUntuTGVKOXo7TE5OJTA2Cis4WD1FdmA4WWpoRDM0anQtYk55MmZxITFgOXlkLVRJalRsaVI8O3pJMCUldGAxbkdwcGR0dWpPV31GITB8V2FTR0Q1PDhBWkNPakxeej5JCitRVEZmYGcoVj8rO3xlMmAkSkhxTyVUYlFHKlVQN1h6S1ZoS3tBX0Bpcj47ZlI/Rjw5Kns9SSgqTnlqKHV8SHlFVyZwMz1uQVk1eXBnezEwCiteNFZOPy1TKFZ3OU5pZypEP15UdHk2OWghUEpzdjhJZjg0REhPNW9kWWw3aHNMP3t0TUg4WDNfRUlAOXxIZnxPPlArfVZgWi1LUm9QYEx7CitCb21CUXQ9Rk9vM3AhdlBXVChtfDVxQmlCNGR0IUpWb2wyT0IjVWwyeGE7bmRnVEx1JDR4R1hBaG94RDNDZUdMTVN7LTdAJnp4bkxxWkpPCitSYGlJYzxxUnNRfUF2N2JeczYlbXM7IyNfVXlhZSo3MUE0Xi1KVE4yWWQlYzhXNDdea207Ki1nYiVneSY1bys0fTZBemBmSSZPO1AzOWZgCis9TGZqMW8pRjBGa0c8Y0VnOUBTO1JNUWA5SjxfcTJ5cU1YRHswRmFDV3kqbWFySzFQOz9CRUBjPyZEaXNmPDFhPGBlJl8xfXt3S2h0LUJrCitDP0NzSS1aMTIkVUY/TytRQmApNzhTXnBwVCZneUx5dWBXVmZCNn4rJmQ4dWkzJFFpZWFre2Q4JGVqa0F2UygmYjU1cT91VkxtK3M0V0M4CisoYFk2P3MhZyRJMDI0azhCZSNPdkxmaFNKbTYoZnA4VXY1X3hrNU56QkE8aUcrKEB7Kl4/MiNDb2JidXArY3xte0E7IVp7U2JPO1FlT0t5Cit+czd7alBHT0djek9uYV8rSTR8T2llYWd8TlgwV01CaWIwSTdPbEpxayotTTY2S2A8Qjhlc0Z6eDBJSSU1QmM1UGBtODNCOV8zbzUzIUFmCitSSUo7VnVhNVM/QT5zMTY8aWpDVnNmMzdnaCNHRXpDZk5VV3c8aXhlfVdQZm5EKk9nUyNAcV9TQUY7KSNYdCZMMTlmZz92ZldNeTNaNGNKCitUZTF+PTE+VFdzWmZMUVE/Plkhe31hcmRyJmA7QTh8P0lPdXMqKHA+OU8tKCt+Y3RyTHwxY3xrTXo0ZSZhR0FFZTRJdHsrJXNwNSpHWEMjCitZclR9cFd6c0d0KTx4R2psU31SJG1QeXdqPnRwUERFYGN1fVhiQl87djlFOXFiWSojSGBiRzd0UkpIekF1VGs1VlBKY3pSYnFUNCEqZ1hQCitFRU0hMn5nQ1FHMCR2X154dyN+ZTJSfUlxfno1YGAqU2VAWVY4eH1+RkdOREkhYk19ZG5CYHgoIWItcjl1T2pkfVFqbXUjT0RsUlRjOEN6CiswR2N4ZFgxSUtQVmRUQ1ZFampoKEg9NEBeVjBnejRMNV8pMmJvYzRRRnI/eTJNRiQyZXZgeW5XNHYkSXApMHU9azlaNU81Py13JSg0UWQhCitgNzJpTmF5MCFLJndOKGQ3eH1GRXwwV2VIaiV8Uz8yUGp3ZER3fDY/ayQ1SzVuZipaZT0pbUgrKjE8Tnd2VyFTWER9UVJxcDdedng8VDJZCishbEEqZ2tka3RgSW5TfU5CRUxGJkxGTjYodXR4IzYxNVFYakhAa1lUUCtOYzAmVT9lUXlRMGRORmBtQlVsczQ2Nnp9QiZEYyp+SlUmUlpxCitDdnRJVXpNSyRFZzYla2VeWnU8YFVHQmVAVXwlc29KKFhDZSZoVSM+ajJgZm09fWpFdWBpPXtVQkR2Yy1CQ0ZNajcxWk8/MW9xNilAe2EyCis/NTshQ1JfWk9AcGo0eVRLVm11bD9BS1ghOXg/PypeTztAYXcrZDVDS3FCNT0obm0jR3VRQXtMUzNiQmQkP2x0NUc1fXhlfk1ybX1JdGdsCis5ZzFvOWQhNUEqbVVERzwjQ2tOQ3V8V0FFMkgzU1JiWEg+cnpTYnQxbzVYNDVUZFN9WEMqYmVZVF5QfmhtfmVfXjRrSlV9aDY4aTgkNmgzCitlYVVhdlBRSUJxRS1QZjx6NVVDTEE+fEN2eHNBVnV0Vml2XlR0Pz9wYU9scTw9PXVUNjM5WT51RUllWmJla2ZHaCh1aV5PRXlER3wjOG1SCitJdFopd1dnfVEtRTY2LT0zcWhtYj0ybkpERmdsaXpaV05YSHMlQjNtKk5jeF5rWEVYMHx0WDZrYl9aJj91WU9vaztGVkFBfVcyIWRMUEM+CitleFNjTkNgan5gSWAoSEhgcj80U2BEcHw1WlloQk5oZmhJU181V35nOX1tVUR3aEswQmlBfD00bWolKjhfVl9WeV9TZXozWntHZCF7aHVfCit7cnZvUjU0K3JNaUtrKjVLdmZiKHJoUjM2KTw3WCQmV2VVZHVONH11d0hAPj1CKGo1fFV1X0lPM1piZ3J1cWtfQl5vMjVEXjZed0NNRUNSCitSYEd8V34lSyVjdE0kcjFpQmdnLV9uXyh2Yzk3e1lnaD1rVlFOMjtjUVQzWkAqJChLRGw/ZzZhM19FZUIjTnFET3lgR1l9Wj40M0E8Rz9fCitHaC0kZ3d0e3pibXhyZzM+aVUpckE+bV53YzxMMUVfQ3w5REl0Xkoqa2NXWW07QXVROUo1amBvbVhJcyh8eEAkYj1TMDFWfFg9N3E8MUZqCitOeXAyTUpYQm5BJl9uSE90ISljN1U1QCtKWVl4M2N8SE1WJHhSS1h7P0teTzhGQjhNPXhvTzxDOzw+dk14Y3omK2hPIUo7YFghcztiPyFTCisrQV57JnN+aHZEWiV9ZVZ0SSRgVFVAcE1udGlrbCtxKCZNI1JOTXxaZ2RiQzdwXzI3YElRPSpIejdTVzsqOWZDZEdma3JsQ0xWWmVtYWxeCitLSl5iTm4pTDJ2X2tBfUVSez8wPiErPHt3Uk08bk8tNDF2YFRmNyhSa09SZkJISn0xUjkyY3B8NWZaVEFzKzc5Yzk9eWdeeWR1RntsPDNVCitTdVk4cWtHSXB5KmQ+STFZU28rdmN1cThhKSRrcVo1fk88fnA+TDZxdGxmQndBPFBPN0lnNHhZfk8tM0F+fElIail5dCoqQFE8M0RWM1BUCityZV4xPTc5YHlCPDFnNjYwZVlJbmc2ZE0yTz88Tj5veD4ocURQclFzN2RJPXVJR2M7V2dLOHleP25xZDRQVHp2dns+R1pfU2lRd0ZVfWwmCis9WWcqUj9vaGdqNWljeyRxcSlYTSRPdmFlPFBzekBrTUloNCZGUC1AcGctY1FkKSY8VmNJZyVBcTQyZ1JsTSt6Q3wxIyQmeFNSXnhBT0o5CitFMUs/amZaaVVPQ1hPekEqfDJrdWpOWWBObiRxWmNLeTF3IXA5Yl8tZTxyLTwoN0IpP2JNVnF2dSZKa2w/bkoyN2RffiQtZXRBbG1GPUQ2Cis1NnlVQXpxVytIRm14PjVpZWRHdDx6Y3FTRD4tfnAqNDtST2VfMHZGaUVpaFA/M1psWWBoT0l8NF9SWDsyLXctOTZvXjdOPCk1ezB9MyY5CitpYXFGKzZ1JUxEQz5meEZHflpLdWdVcWEyXjtEbVJObyZ0O0ptdV5LTnNIMTRGc3tBcmMlJntkUnpuSXsrTVZDeDR6eFo+NCFvI1ZedlgzCitYeCF7SnBQT0YzdDF8M1QkaEB4MTdzOV5HZyVsSn1IVD8qbihhPGthJWFuRVFmcmlZdXJpN1V0cXZmYXJwdWdjO2s3e3EhNHJMQnw4cXY7CitaK0dGVk8pLWxRRiVCKSRYTiF3RGB5ZCRaK3J6XjNMWDlTV3FnNmJGPEZuMzs8KE5QUjNiXmsta0ApaWYwZj0hISQtLVV1c2FtXihJcX0qCitgKj8rfkpVbTlSVUZYPUpsd2QkK1d3YlFHK0hxXmNeR3hSJSZLI2w9LSRYUWZSTC1+RDJ2VCl4Kkx0QXoyPlgpOXxLSyhtPWR1S0RIVX4hCitjP2o/SzF1WG83KWVkdkcwTDtoQzM2JkA+djFLbFByanpxZzFNejgreiFFJEVkOWYhezA2QVo+U0wrfkEkMEQ3P3FpKzNEOFI1S1JmdlY3Cis9R3shKFl6MTJ+dEomIWZFT04hUEctS0FhfHsobWdXbi0xU3NyMjVkJTcoc3VKbFFjUjVVTXNBSn5VNVR7cylxdGwhWXozVCU5JWU/e3p8Citwakk/UUskZ2JFIVJUZWU/VFBtclhtTVN3VDxQe24ocUdzZCVtPGJmTHVtO0kwT21zd3w2XllISEAzZDJmU15xel8/WU1KMHN8OWE3PWg4CitvQEhkdHdrfWJlVE1+QHB8JlFTSjl4TTIzXjZua2ZxTFAqdjluN0l1N2NIeWZ1fUd+b2gjfFQ+SmE3cGpwR3spJldLKGRlfktrUmYwSEJRCiskbip+e2U1M1ZkM3AjcjZJOGBofSMwSSZ4XyVDWD1TIUpxLVg3UHBpPiozJkl1cUYhQ29nZ21vK3g5MDFqa2dkKHVNTl5gZyE7KXJKZHBOCitnS2ZnTERLfXZZd253djdya2V9dHJsck83NHluUXxCQTN0VHN5e0REYW9VXk84NU1HR0xQPU9EcHJ5IWIyNkpnV0JFWVgocGtSaTljVVduCitSP3pTV3xyU1M3Mi1SWGlrVTVmV3VvZ3hCMVFpKWdQMFY3e2pZUCgrRG5WTz5ST3ZmZUU1QEpQalBeK3F0UmRnYC08SCQxQDxPKHhmSV5hCis7OCZuWTFrUXgoWVBrOzMpYmdNUDh+PkhpWnN3IzFpRiZ4ejR9MForT3phbXlvfmw0YylHfVkzRCZZQGxIQWhJLVFFYXIqc0dVZn41VEljCitzTHZraGZrbE1Kbmd2Z2w/KWE+YXpQMU44OUF0RjFERUtrSGFvJDRsdlNtNzRne1Bwajh9UkN1PmdQRytTZCk9RUVkVHVwfiRCVTJqaEZ0Cit4UGVsO0dnO2FSNVghNGorayU3d0ZVKSh8KCN5S2doNEQjKThxN1p2RnlnZ2o4fSYjKTY3Z3BrSnB2V3teT2U3dlhYakJ6UmN+Wi1LRHt6CitjN1pIXlVLYVZuTz51KmhmMCUhLUg1JWIwSTNPMHItYERCZ3h1PHxyRUNMejhNRXcxVT0qVmhlN2U1VzhALVlNaihLNzJuYFFqJiZ6OWFtCitNdDkjVC1zSHNNfiFWSVcjWkVyUCFtSDUhSVd7KnVaXjhZS1o5SHUzS2JYdEJ6X2RjaX40Yn5VSUw0U2RDZXowKUwoXjRzOTtlfD9yNyFkCitKVCpAdEtsTTRFbHNsYEdzP00hdjAoSEVGTCN+JEk5T3MrNCgjNTRuRXlvUkd0fGJxNmwxeXA2YSV8cTVBS2hSI0dufW42KyZ3RCRGN2k3CitrN2VeNld2aSlkdylSKiRCSkF5Jkc+bG1ZfHVRI3hLZyFMRC1DcSg3bmN0NV5jZ3dhK2E7cWVCcFEtMm5vfTZvKXcyMk9AO1lQJi0wfF5vCit8Qmt2TFgqRSFkdVBPXnIpNiFDU0s3NGpwREY4Smhyb35gdlJMJigxcnxKMzF5K05iNUtxfW1eSG5+bkF4NjwqXmpDT2shanJwI1l5eVJzCitnclJYS3RzfVEpJVg+UzB7OGk3bD9wKU9LWiFwXjw8ZlQ8Izg2JWxoIzdnU3pgWld7VFd6fTw9QElkRGpaNUEyJT5xTiVWb3JVSVNab0tmCiteNUpYR1M0KzljK0ktPmRRfXtOK15lVVQ2JUI2a1FWcXgwTTE3bFdmaVJvaHRSalE+WlAmXitCY2UrKW8lNGw5eWN6TnEtbUZISXRoJHJGCitWSGxyfW58N0lAfj5yaV9uYHB3SiNlOGk5IShzPnBnUXUlQnlKM1JZRmotcyVOP0wxdER2aip1MjNZb21FRV9zNStVcCl4IWFrUTU3MXpiCitae1chX0dGbWwtMzFlYlNoai1RYDBsO3UhWE5NPkFidlcjTnF6S1VndCY7eDdVR3JnQk9gbnMhNjh2YnBXO0Z3UyhKSDFoaj9ROUlITzAmCitkbSRsc2s1fCtAc3ZeYV5CPWo5O2d1UXleMndPRnFqYis2bkVSNj45I2VLJXxaIXZwMyZtUXlCVmtaKypxaFFPdUp6P1BCQFZGeHk4Yjw4Cis4MFdlMz47RC1mLUdiZD5gOD5yZ25HdEBAPkAxOEJRcFUjbD4kd213aUYtIVRCOGRfLVUtSkc4T3Q8cChiU0ZtUXI7SXs2O24qLUp0NGBsCismQTUzdjJjdEA0OGQ7Tk9vVTExUjZ7UFVaNHlodGMwREk5O01qayhAKnp2Zz00cjtlXngrZEFlJCQxVXhhSTlmZ0NmcmdMJTFKX3lLekxaCit1Q2RBbmN3WXZiNX11MlN5Zi01fVJObnNgcE9XZWg+Yy1WYWp6O0ZVYER5ekooXlBhSy1HaFJgUnc1YGxyfEhRI08zMl5UaEdMMmtiUlQ4CitaNmVQaCghYElLSFkzIU55fmg2S0psZnc8fEFaVGBmVkV4PHgkflkkdkx3KT1YOyFsRjUzYH1RI31DMHtmez0taHU9dUBBS2p3ezg+WEA1CitNPkZITXE4eVl3Oyk0JlIrJW9qRzB2TEZTdGNJcj1SXkE2P3gzZUZVUmtEb288KmhzU2pEdzJHVXlodS17K2cxWVhoODt4JTtxcHdfWGZFCis0ITJ6WCE+RHcrX0w8d0VmRVpyakB1dU5DNXgpRWxgUkM+ZUwzR3wqY0U7Zk1ieFNQYXlfVT9pS1UlZnF0bnQoMGtod0p6JUV4bS1iQ31WCit5P2RMJj1oa09CNyZeMmskOW8jK2djREcofG54UWtDWlZ3ZHpJPTBAKUcwKUhqNm5qI0UobDRkRXJpcH5+PEltNUhWWCV0OGcoNFJheT4yCitPI1REQGxNekpIKUpwbWBBcDYtUHF1aXlTJWcpNDMtQ3grfGBrOV9OTTk7Y1A+bllTI1MyPD9WO1N1S3pvUnlmX14lYUFUSzIzRjZJNiRxCitScH10QlMtPGIhVlkpUz1VISl1SzEhKCV4QHcjJEl1c2ZtRGVBQ19KWEYtKkcmQCFkbTtaYlJpelhkRWI2IXB6am12fFM2ITRVNTBNWiliCitGNjBpR2NOfVBuaEg9fj1nKDc1S0hncSp9dnhaJjFyNXQ4bCV5Ym5oMTUydU9sTV9mfGFvOElEXjFAIzdmSEhKSz1ePkY/JVhEb05qT1hXCis5TXxPO1JIeD08OUVCYSRNYXNYIUlXKStgRzBVWEozcC1iPXFeenBtTCVeQyY0QERffFpRMnNFbVFeY3c7Pmk+cHM1TzZTVmFjP05DQkI5CismWjc5bmd0WStrdFU0a1BEWHsxQUhDMWYpI31TSmUxVDtBekhoJmN2XzJeYiRFZyEmaGc1NEA9O2FOZzQqZGgpZGllQEVjLW97cVRAQWwmCit8YmomQ2E2czZMfDJePmY2dElDTkhpXmdedVFUaUVsUUxXOWA4QFlPbnB+aEA3UmdWaCRhNVRGcDskWDhFSk1lVTlDQWw5LSVeRyM2bnwrCis/MWMtezBZcXpvR09qQUhFX2w1dUc2SyNBbENGX20tJGlrMiYkQipJfVRAWj97OG12SkBqNzdSKHQkSGdFOHs9eldARjQ0en1EbE4yPFpHCitsVXE2TXVKLSVBQGQmcEFNfXZMXlQySl5ZYFppS3dTXj07SDt+cVFHZG83T3tvJEt1V3AoQXRPRyNFZEotR3xee0VGRHwjJGt3WWllOHg5CitLTTw9UnxtamQ4YzhWKk9JbDB5SVk1LVR3MFNQOChZLVBhOXYhekJne2lrTiY/bTJwSDtScVBxOzFqZkE3dSkzNnBCbFBLUXgtRXFVJi0lCitffGNzMWAmKUQjK3dQcXVSWntHPk0hckptTjdkT0dOI21ld3twPj5uZmhnWDFtNU10IVhTUmJ9amUyWSkkYGlpK0U7VUtXJDVXQGFtKlA5CitPPXh2RHtMPnUqI2x3MWZ0SUhkQVF0fFo0UXtreEVmNGlkPFFVekBmUUctODFwWWVzMVJjaDcyOzJDe14kRVE/PGNSbmBeJnJjUTFWMjV5Cis5Rm9XKSRkPmI7bXpBPEkpbjhAIzVQMGQ0NUM0YURkRTkwT2dISzUoZzBAfGU/ZjREVSpRen4rclROQDJsYz1MMHZKb3ZeNnYlJnp7NSZvCitiIUMyc3RJdClKe3VRKypQYj1VWkJ2czh5c2lTSzV6VmJpKmQ5TTcrSjZIQkt0PCNuajllYjVwLUtKTkszVmhOR0paNW1saGhYV0pfJlFTCitpbkEwPEVWb1gqXkkrMllXeUwoQS0pI2A7JnRtQCh+WnxjIXBhSUE5M158Z0NWTCNhX0NHM2hzJWQyaTJjLX5XPGxRczVlVlNkX1E7MF8wCitgXl5QbnNEQEVGfChXeFJ9VUI1XjB1eF5CX3hRSWRQYmpqJGsmM2hwR3RtMH47UzBWSTBzWT5pNj8lcGx2WWg7IyhFZHFFdDdJJnN1dDhKCitQN3NIXz5fPnIqcWlNLXEyeGlUZTFHfkJeISkhQyo4ayEzIWYmSFJiOFZ9alRWQWR3Kj01TWgyJHl1O1k4YDtiNTlwKGNeMyZTUjA+ZjtWCisofCN9cmpVIXZ7Xnt3eXk0NU8+VlltfXlQeSUoRmk9WXBYO3xFeERCIVoyYT5XP21tUD03TCRtT3R9XjRKeExAT1FVTS1VM2khZ3FRfnc8CitffjA4NTIxRFJ0LUVYNCZBdF8qKzh8OEI7SVQlZDNlRnpoOWskYCpISXo0VWlxYV80aTcxeEtTOzR7Vz9ZN1l4TldpZH0/Yld+NSo8MEY9CitEPSk0Sn44dU12NWc/ZztgbHpgZ0liJCRFLSlNZyZ2ZkxzdGRVajJlJm0tcjd5SyhgR15gfCUyNFlXYSohSzg3UXN5M3RDfGRmbWEtQXlxCit7TFJnX1MkangpLSNZLW9gQTVaMShLREBNe1NZe0BZKDJidkA/eGxDai15TVBTSSNGYmI2VkNESyY5R3B6RXROM1VkRkVhNTJxfTR9Qlk/CisoRDhNejYwTz1+RyZaUj5OVkN1YzxEdzRWXkNgNE8rYG4wZD5JLVh6OT47bWY8JFZSXzJ+PnhsazVvTSZwNEooN2BpWCU/d0AtKmBRa0VgCitUPm5vdHNiNSt7fCNTeF9aU0w8SEJlfk54NTgrX2BwKSteVEFOXllBcWdBPyh6NWBUaFd5a2htQiNXeHZIJCVQOUtAZUMzNno3cypVVHwqCitSa1h4ZC17b2FpK3ZXR3RJRGVyJnBaPHNMXlhjaC0xUWJLcXVpJCFjJGw3WThwUXNLNyZUfnZjRkc4bmZxV2NQVERibVhZJEg4OWZFUD1ZCit0KkxTPWY+Y1N4NEZvZlBYeyFaUio+I0VxVG4wUkg5WXlYUF82T2x+bHthclVWUXE1REN5IWQpZVFEVE9PXm1WKGlnRClsMDYxWnB4d2JUCisod0JzbHBVVipJeyo8Zk9OSHp5TXlpWVgqUXJ2LXBsSGlYTEFtZW57ejh4TjJMPyVZKWc2Rkp2MVlaZ01+MSNIS1l0PnEqc2AoNjYtI3tUCitkTG8xNmJVeXlCd3lBQ3ZLQkl0MjR5R0BXZSFyYWRkYnNiYCpCfCUwPVI/az9jdHpzMzhjdmNtZHtrVD1uYX1XY2IzSVpfPChLZ2MjIVYqCitrZkF+YnZ6elFWUmwqbjMtQnBvOUs1MTdYZz9vYm9aeXppQ0goSS1oO2RAaSNMSEN4REFvb35iUEVwdjk0RllnQ3ZxRz1nIWhvK2ZWa3VkCitlTWV7TDVsUm1DbHZQLUFwQXEqPjJkaG9ZeDhUcmVyTG98dSg2bkxxRHpNKWBpNDFDSG0lYjhnSC1rSWEqXlgqQXc0P2lpeU07eVp0dGtOCitoKSlAdXdgRyU1ekZaWiFCeEpeaTlabTwqOEtzVjlGQ2BhOSMjaG9ZUktNUH1SJmZDSkJ3N2g2Yz5WPTkzYFh4I2xTe3AzSkNuaXdOPE1sCitGeyQpMzw3cDlPIWNCdU9vRncqcHFQN3s/IUtAQXZtKmBZUkQ2d3tVLS1DKjtrXkNtP1QxSFVzWFlVWnhPOEEtK2hgUjNeY2Nhe3J7PkE/CitJZU4qdnV9KUwmdXZiWkB4NFZDfSVMV3UtTnxUS0YweClMZ01iKUk/d1F1MiVuciUxYWs/fVY/SiE/aEdgcXZIXzhJe1dORUlrdkBQWVdaCitjaXB+Q3stYjMhTl5TSio9RCtvRFRGaFR1V3VTfWc/blpBOEcmQkp4NzRxek82d31fTjJOWlo0I1okV0BmRzI/P2R2Rmg1fi0zd0BWYCkjCitQYiY2cjBuVTsyc3U7P1RyRXVwV09MWnxrUkppSCopdVFwWT5qN0B+IT51OUZTMjZlQXhhdSRHb1d+Xnw3JXJqOzgwZDxEY0Rgdj1SZCZ8Cis8Jlc7IWRQb25BK3JjU1YrYkVlZX5jRWApPl5oKXRwVyFuYCFkSl5uQDZHXihNdEB4bFI5fjBrTjFyd0o7VF9SQEJqMEctcTdBV2xwJXpfCitXQyoyaj9UYDRIfnpYe2JSd2tuYHZTYGVSdCs5ZWJzd1YheWdHb0NvJHFleFprNkVSeHB1Y1koK1p5YDN2P0dNI00+X2h5YUxtb0o1cVg/Cit3I2ExMGdgNkk3R0k9TCtuTmgrQkNWaWtjZn5WMW9oQWN5fiY8ZHpPVGcoOWRYd35tdTA9RFJwckp8akRUXjQoeXNsSWQkVGZhVn5mKzt2CitkKEo2YHw8U1J0YS1Ld1FXSWNQdHc7VWlBKU55YEoxdFleXyg3NUl6ekJyKT1KVz5DYVAqUDxGYnh+WWNaJlRrSjAycCkqVD1tOElxSHEpCitwMj9aKVlJTihnV3FUI1k8K1U5aSgxM3c/YkY9MGI5cipMSnNlQ04waU1MWDdsemtfeWpmdDBQNHFRRmIkcUBXNTF5PDhIR0pRQDFLIyg8CiswaVo4MzBRMUBYUEgpNyZ8X3pQV1NKeVlASnlyfDVQY0YpY2xENkBoJWJAakpLYj9mQmNIWlF1a3ZJQGhOOFcwYWtyK0xLNiVlQWhhMVJ9CisoeHJAKHs1bTQ+dSYyZXtKWHJfYWFxPTJKYWZEUS0xWVI8ZkFKYX1IMTE8MiRKc3JQTzd1bU07dCF1YXQtaHhZRzZibWpHMyZ2Vn14MDtlCitEVj0kRGErVilFTDB2dHpXJiZlMT09VTR8KH1laU11dUlfWG5yKj5CO0c3dExoUzxEbSlySzlyZDQkJEQ7dShgb3BLc2hiSz9SJi09JkVQCitlI3c1NCNyUTlQbG5eQzxHeT5JK3ZLTEFZQ195bzREKGxjTykqXmpGMUhqYj88ajZ0bFlSdzF5JEFSeU15fHt7em9NVzFpaGtNJXtkOVo+Cited1h+bHBmV05EMkRpbyVzIX17MmBSb2hCUnB5QG9FY1BwVkBZI2V5SDR5KGp2QUlfLVlIPzclRGxBOXl6RjVOLW9wKFdVdFExMCNmWjRyCit8NVJpWjtnbSlQd1hvdnVsRX4yT3VZZVh6bGlGJEsxRWNgfl5ecCpvem87LVc1WFczc3NSZ0QqdTxANCUrdDl7flZnM3x7YitAIzQqOHd8CitBMDN9aU9yV3tTcEQ2JUNJRCZ5UFJEYTJgSiRAUH1vYGNOfG17ViQodFcxJWV+KmBvUXomMCFSTVk/dmpAR3hKJngkPik3aEUlaj8rTVomCitKeEx6WU5VZDltVVc5OENyXkFQenxlaEhKWXEyM3FQYTtNITwjdVUza0ghZUxyNyNrc1JKKGs1WDZpPzc5fUFSeitoSiRKUT1TYjtNSG5yCitnJE9ZY3UzaU17Qmw3QlAtTjtJXz1vVGspRDtEfnJjZm97NXxKNlJrY1FENkpYcCElKWlqPUN7Rk43bHd6ZmFjQ0ZgUGkraGp5d3QzTypOCitnam9keWFDPTFKdkRNOFlHUzZiWilkdH40eCE3R3JrXyRPclpDUSs7Mzg1b3NRSzQ9Qj1ARSN2bmYjeFJoNVdIJUEzbHg4emB8ez9YcFRvCis2ZG9YO29MOV8wRWctNVYqMiNlJlYlb2Y+Wk9HSn1ZYnpFajZKKSNaZyQkUFcqcDxBMT5lTVJLVzlAYkQkRD1ANT5fen5lWWJ0YHZ1MTItCis1OV5+ZXFIRzs9SV5DO2c1KWdOJmYwMXhxZjJPa1d6N1QoKX5oU2FOd1BeM2JzNFRZNlo1TzFgQnRVcHAjIUxzMlUhe0s3JVc+cWc1T3M9CitMYyM3ZGNkblEyQFZ1SD5ueFpgSWlZdlpqOTVma21VY0NrbVNZKXt8WlRObGxje3J5YyZ7UjlnSi1halE8S3JaWHU0PEdXMnNubDI/cD5aCis0NHo4akchNTI+N2BCTTQjQTRoVzxTYEJCdytkM0hvKkckbyZmN0lFc3U4bVBPUGpKUmVmeHBBTEYrMFhuPTR8VFJfIUFodEY4SzU/TmhXCitJNllsIzJVVn0yem8tSU0qWDAtUklvPGs0elhFVV9gdEU9IUpxWUJ3V04rSWglN3Q4KUVMUGBVJFJuVDZrYjl2T2lTZmlCWFZ6a19DVEptCistLWpOcyQ1MUwoJUExS3l8MldHQipyaHI3JUFONXRlT1otaD4rUSlSQSl4dHR8c0F5I0xVOXIkemJ+R3xOXnk1SlJ3VXJmVmwreiokZjV3Cit+XipAVm4jM0chRSsoLUpJaDNydHsoPmhMWkJucSNjTCVpXkB5PGw+bUBJXzhpTWJRO0VHPW45Xm41SUJnfUs7QCMjZTRFSDIqS2psOC1VCitIQXslUGRQWmd0a1dyc2Nnd1Z6SSVkPk4jJFdjIzRDdTBMQnl9NFNgPX5vYExufV9aJTstLUwkK0lYUHZmOWZIQnppdm5gKG5zcEF9OH5ECis/fHQxNGVhfHFofjNSYyMqNClMSHdPRHd2aVRNNHlDIVpKMzxnI1J2Tm48SS14VGZKJTVlPSZwa0Rec2Nhd2hYR0NfVmV2flMjZCg5ZU1yCit3TGcreTJqMSo/aVR7TzNoSW1Zez9UTXojbkFmNzVPUyFzUm9+Km9zaVB6TWJZKldVPlV9R3V8JEFZS0xLYXk4e18oUWhBJUxwKkY/YWFXCitTY2MzSGgrbHtsQFdTWFZEb3VAOVooJjIzQUdURyE0TUFefGFwTG5CaU9IY2xBQG10JSRfRHgrIzxKWml3dVBidmJzOHV+e3Btc29sdz0zCitGaz8mRHFJLTFTYXI1dWZ5TmJLVCNEJTVHRnlecyZsR1ZAUCZnbTJZRVFCejUhbUVrOUVQMjZwdkYmdDBUKVUxfnQ9amF8ZldYTG9wZEcoCis0Xl5GQCFSc1lHI2JrI0lYeks/dnhySkxwQStjJSF1VkApZGxuQClrQi10JUFPJFhMJGEjdnErcmJjZSNCKjVTP2AyP2U7UjVKZjJiYXQ1CitpZkE7KWcwPnxEd188fmU2XzlTPiNDWT53c0hIbVUod0lFQ3RDI2NfNi0keT9oZEd6UnE5WEpuVnp0Rik7WDdwSkZtXmMtdjArc085S1FICiswMDAwODBQfmQ9TV8/V1lqYjtHPTAwamQ4MDJseE8wQn50PUZKRT9MWmUod0FGTEdycWM0Y200WipuZWhkMzkzM1pvKTdPejR0M1RjMVN3CitXTzYtV2xYWTdQZjZ1PlBXQSszXnRLLSRPOE56K25rRVFpIV8tZ0JPeE9QOVdMMFhrcE01YyRVeF9TQkRJWXI2ZX1JOSZzb3FCeDtMKmY2CisjM2J2Vl59QDhlZ0Y9T2EwKkZEUjkyJGU+YlhTcmtXWDtPY2RZdlJvSXl0OU45QlR6dGpjOFhRKFB3OHpmWHtSNmZLZ1dDUUtpUVNAMWN2CitlXkFvcX1CRFk2Jnp9WWRReXcxK3IwO0FzPCtTajU3MG1Udl5za187KkoocF9XVzhDbT1Od2ZfeUJMblhfNitRRjVicG0qNWE1T29GX0ZyCisjcH1iJjRGelZMVWR2WXdoTnI8XzJKQjJDblBefndUQTNqejdRcTIzTDdGdTB8IVNZMmRTP3duISNIXikoMzVqVWBpRXUmLUJYME9nMSokCitnVj5kbVRjYUNuU3NaYTRIel9gOVl9PC0jKH1gS1B8OCFjZ1FBKSpGRGNFZDRDPjhaNkI/YztBOD8tVmBQUF9KMiFyS051cEg9aGtGaFdQCit6Y0N8fnoodE8xZXA2OHY7WGtITThLNCo7NHUxeFh4X3c4UiRPOUtRSDAwMDA4MFB+ZD1NPElLPjNlTzF1MFE0cFIwMmNyTjBCfnQ9RkpFCis/TFplKHdBRkxHc2NhKFFXUFhEKURneTt9Y288Rip6NS1HMnEpezRoRF5RPUQ5ajQldThaeUd6a3ZaODlXalpeaTgoJj1NOCVQTD8jMWllCitxJkItfWZHPUZRaTEteGd3aSF4TEQtbD1ZNDtDcTxuTmwtV0tJZkBRMVlgWE4lSn11aT9NMSRTdktHQUJycXRWc2RsQHxIekwjWDFRYnVzCitkNS0zWVIkKytObmBqXiYmPGckT2h7aGo8U2JsfTAxMmtgKU83WTJneEQxbyojS0B7Q3tqclY3K2pLK1hOPDY/bjNhbX5vVyNZWiVzOTxzCitNeiZuN0hKPShLTTJ1ZitqQUVySWtXKk10IWMlRyE1fl55VSpHaVM9Q253d09IbCRrRXVuLVI/bklWJVdLVkg0UHl1UTE5NEZjQi1lJEYhCit7QkB5aTM2JklsRllEWmBaMD55TCVWckZ6cDNQST9EVUApZiY2bkhEUjtgemd6JFJicitEajMyZlRxP209bTImTFdoekRCUjFZanxtbGorCis0Qnh3QE5AemdeczItT1VsP3tuaDtzSCRVSCNfWlBSZjd1V1khbXZgam1tYnxeV2VzXl8kYiNvMCotOzt+JFUmLUlFdUhWZkcxOFZedl9FCitaWWcwTDB7SU50UzR7LTcpNWZrUVBRSFMrYmE/Sk88VkJobClOaEA9IWM3ayVMQzBXTWFjNWRRXmdkM0JxSzIheGRGfVhyTmEobkU9WnxDCis/YkhvKmkyR1VZKUh3PUZuVk0jcGU0ZC0kKTZmWnhzJU9UI1ckP3xFQDtlRkgyeXI5T3BjSCErfFZiVUR7P340enx0SlU7fnpWPDJHaEw+CismcXpgKm5nMjxWSEdLcjxUbDhUVlBKWCloWFl+SCE+WWdtZz5FZkY9LStYb1k9ZCg5fW8zSXI4dGkmIWpQTjthMGI4PnV+ZUJSRV5Daj5zCit6PX5WeEgkS3BhejE7VkZROTs0PTxHUjA3cGlzcChfI2lUYUVFa2RFJGlxJDY7RTR9ITtrX3gmWjJMR0l0aDIpNHBHWGV3RWhVSDM8bDFnCitjVVgmKFlnYzF9TEMtTD8+a2NsRFNJalVyJmlzP14zXjZfOGlvWTFQck1fMTlvVnMzZWF4O3xVbHJTTSo2UTwwOzhsOSV2MF9XQz1GWlloCitzI1ptPWIyPCF7VEZZSHZGSnJ3fU9fRCMwWD9UM1VscUdSdGY/akw8JExXJlA9bmtXSiMwOyRCa1FCdWg8YHV4KU9QLWIxKH4wczMzJn0pCis7Z0RTeXsyVyslfn5eIStedVNjaWUtYHdtSGRCYz1mPnp1c1MwVGpYQW5YaTl9X3VeUEFHOHtAdG10RDNNOStZYDlNJTJSWiVYbGl5U3Q5CitFIz1DNV5eLS1BbEBWMm5aQXVtOCluPilTTEdweFViVD53WTQ1TzRrdjFCaVdzWWxVPD1hISlERDFGK3k3PmJReG1+Q0w1MiRFaFg4Xm9ECit5QU5CJTVpSDJGTTlhKiVnR1IzaD4zbWVwLTcjQzBIWkIqb3UqKj5BTjlIZk4zMFhVOXxodGMxR2VOUTNlJDkjazNhS0JwKTVxI25oMzhHCitjZCZMYSU5RmQ3TE5EQ0EjYlReZ0gpP0deRUshajJKKmFuak1JY1ohOT4haUBXb147ezNJM3JxdjEoWDJyU3NUPXA5YmlvVHk5Z2EwVDFuCitWYUVBPTBQNWFNc0s/WHVVSl5LITw3S2kwaGRpYXVeYUY8a1VXTlBUTk94Zk1AJlE8TGwyYDxsQXhgQXNLU0A2Q1VLTUo9UWlmVWFuciheCisoY0lOeEA+ZyhXKF5OdnlVOHdma0k0UGF5Qms2aVhjRUBZcVUoMFZXRDszMT0rSmx9cSgkdmFiYj5We011SWRTS0RPaWcoO2cyTkQ1QVRhCitjMzJfcWc/WFpQdlFRN3g2Y3duRXRSMip3YCtwUSgxOS1yMyhIYDZlMXVXMiNjT1dkUVZIJkBUdWc+VVpsfjdWXjNHSVJ3PW99aWtVNjJPCis3O2g4PWdxPEZPSEdASUZjPHNNY0s0Mn1tJW18ajV4JW5wVkloTFNmbG9RWmI0LUNUNU4pVmYpSGttPEQtUFJ6S0sqS2g5KipZVHJYNzBICithVChzaU15M09CJWJgdHNEJUZYQ0ctOWJAZFRydm19VCVpdEZZPDhtN2pYfXRJaSNQVT9FRk90VnpLUEp2SXZQJWNwdkxvK2htITJOYXU2CitwJVljN2F9ZHYjVjM+YUNYKEstMFo/WkMlZXAlNG87fFQzeH5IVyVHeV9XPlMtR0hzMkYqdW11OEEpVGVfMSMoNEk4KyRuVkQpNGkwTENLCis4bz5sWEsxbHR0YWp3RyNaYkdGTnVMRXdwU3dAfW4mTFVTKlFCLUxJZVViZnstdGBpN2A+NXgmK0UzfTdAVz5QY1B0eGpVdipmTmY8ZThrCitXTiZ9MDEyRUU7Q3J9SDhSNHY2dVN8YHh5YmI1IXlUeDA4TmckQSpTYXF7aFFZIT9vaj5qd1BQMmg5PElHfElqey0+YSl1Oyh3K28tYSEkCis0Wkd9JklzYUkqdXpeQ2d6JktgeCQoVl44ZEZIQUxpSXNNKWhjclRfd0tAbWM7M15yNktMOTkoRXBCOVR3QnkwUDdMOH17aTNePHtpcUpsCitqTT97THhsRTJnJUxLQHA/eitEUGRXdjQ3MCFCKF51c21seFRma0lDSGMzR2t8eyo5ZHJZRl9VYDc9ZWJHYSFQIyVfS2Z1ajh5QHp9QiVXCisyPCF1ZyNFbS0wKDhmSEhKd2k/WTxmaEozOzdCdXpiXzVXeyZrU1hmJTVtT2E2MD9ZT1pETmwwQUF0ZU1OI1hnMDVMUUNjIyg8ZHJlTWZHCitrMUhAZUUmKW8/cnpZXnZsdXd2KzZLXiNnVnlHU3lhPjMhe3RRfj1Ge3IpOTgpQCMyNSFZallafSVLd009VWVHO0FJVkxAODdqOzRUKXV9CitkYTFxdT5zQzR+JnctYClxT3ctWGJ4fiFCeVJ0Y1MrRG1hN2JURTdedCF2dEZPPVpeJF5iTWRGfDdTVmNhVyViWV8oLSNnZUtgSHRNZWVZCitEOEhGPG55SThacTwjT0V+d0ZjMWwpa2cwJHBaQVl6bUpNYFhNIUpxSDMwNlled0l2Qn5BakpRSThOP2prU3lfMkV4RT8oMVlSbnA2RlFQCitNQ14rMXs3b3FNeT5GVWR2U1FLZm0lN2o7aGgzOD1tMC10LSVyND5fbjYyS3I5STBWYWtEbE5RMTM4QihhI2tTVkl2eVljNiNLSUBwe3hECisjOzBRMHV2P0BnXktGMCQoNTY8RnZRU0lwajdkbndedlQzYmMwIyE1PUpoSzRiS29ZVFJJK2t4fFgoMit2KWhmTyR7YnhKU1I4cnVKRk8qCitjP0l+LSkrTnJPJT4xPXp+O14rT1hnJSVEZjY5dHMtJF88TyhwWChHLVMzPGhFWCFpU2EtRjRwPnJ1akF6SlRHNHpEK2o7PDd0KmV3aUQ1CitVaHJOcWBYeDg+Y3QrfFBxR0Y+JSRCV194WDtzakZVK0g3YFZxUmtwQ0RhakdAM1ZUdmk0TjBuKEZeJXJqZF9KZHJnP2VSPFoxaXYzPlAlCityJFZKfUY2UEN4Y2d6QmxeOEI8Km9GLVJ6WmJPMH4rLVowfkA5MmlDXyZ9eVctNUY2O1c+WGctbSpFKnstWXdgQzl4cGhRTjcrI3lgdDJYCitGUSpMRDlAI0JuOT8yTSRSa2ExSjVaNk5AV2M2U2ZNcF8xaz8zWHFYUitsOU5uIVFBaDY/ZnRPfmpKMmZjYWAoRDtLT259eVQ/aiZ3WCsxCismZTlZb3h1c0hNVGAtSUErJHJGWDY0SD4kbV4welI7PygpdnxmbTskNVhaP3Moc3oxbHJFVWxnKjEtZ3l4Q25OTnVzfFdOdUR4RH40Vih3CitJJWViKHhsIz0wPn1IKGRHPzJYRit0MntSVEJPYjNafENfbyU9czVLRitPWmZGOHRvSlVoXm1iU0ZPKEx7QGtUUipFYDJFI0UlRjJzUEBvCitjNzs0QXpiJF5CNlJxdn16dytOc2YxaWRhVz9zRUJfRzVsSjRMPW47NTg5dXMpWU9xJDErSHFkWERIVmY7fT17RS13I1JBYWhrZEJeb2BkCitwZHI4P0FDcCl5OUBgTmI+Q342cTs9OWdsMTk2czx6NDgqRURUciZfWThnP1JEYShobCtzZGtTeG8+VSRtSDxzJShgMmVRLT0tU0krS0tVCis8RE85S1FIMDAwMDgwUH5kPU1gQ0cpUFQ/RT8wTmBAfjAxXk5JMEJ+dD1GSkU/TFplKHdBRkxQO2xFXnY5UkpeZ2RySG5QOSN1ZlM4TVc5CittLWpPUHNkelVaJWRPVms/Y19gUmhxZSk0cDdXTHk/ZmduaiU/KHc1X3xqfE5aU1EwMjJJXkVYUnxIMnctPXlTbk10cUFoe2U0aGFhO2I0Cis2PVg9d3UpMnNuOEowbVc/dC1ibVRsYU9yRmtTKzlJQE03d3Q9NWg9MC1reUdhTD5GZ0t5WSpvYjF3SXl+JnY2am85Z3sqUlFeVnw5KVdhCitjPVUoNjRGSFIwSlFaOz9feShZRmRBYmRSMiFLbz0qb0xRa3hudHxwaldYXyEqKCY5biNWaDcqKztxKnlFUV9KNTlaTHdHI21tZU1CNG9gCis0PThfJGQxSzRaPmdoYWZgOV5JNF5YUloqajdxfiE/YExVTzhkNmM7c19QN2N7N145VktJMiRlJCMmQVU0X31tU0Y5PFluOHh7KkJ3RnliCis1fXoodGtAOSNSPHRrUWU0WUB9Wmw8VT5tNEQ1U18jIWZFKkNjMSZqbF45a1hyaDJQXiNMR2BKKlJoSm8wT25JOW5XV3U4SCR6KUZ1dGh5CitgUSRQblp3RUx1M3RUOzApMS1PQVpNTmAkPHIrbkclKTJuI1dETnQmUyFAbz5xQXBMQVJXK3sxYCs+ejVjPHkzfkxaITZeQ0tgRDBMdzYxCiswMHVsT1ZmNzt0P257QDs0fnlUP05PV28kQzN9Nmk9Pj1sKWcoNDw3X3VjLWw3cF42JlRlSD9EZUBwUCgxWEFZU3JWdHpYPz9WfFdhN2g9CitFcEZjNWVWV1h0WV8/I3heUDY5MTd0OyRpb0doUmA5SjVjZXlBTC1YPy0pU0xDKWFuc3Z6enk5YXtXOHxgfFNFKyUlO0VIJlptbjd5T3smCitBKzEyZ2tZem5vcj4re1F4N3FqYk0qZ0w/eXpQViRVdiNaJTFraUVPMUUpfXVhYmI7aXFydHxYO1BAS0cqVUMhPSk5fE5pUHYlNzFnYH5HCitJbUNoVEBIem5oKFp5cXdKMD9aXjQ7JjAtMkhUbWEkZys0Y0s1XmZTR2hVZjxjIUZWd049dVRXciU1MGxHRj48cCspS0VmRjAkUiNfIXgmCiszYFVge2x6T2AqM3I0RkA/JV5Re1ptJD9zNihTZ1ExO1lQRyhuUWJ9X2t7ezR5bzE4PSErRExfbzxTYH1BUm9tRHVNNXsrLXs9Wm13fUs9CitRcjFQYjEwNXN0bjw0OWBPfERNOWthPU53bWBBR3BXal5KRmoyNjhiMzxlUl5MaUBqcHdPI3gxMFkhYnhSQDNzKn5ONW4zRGcjZEVDO0g9Cis/WklHYGczM0QxRCRud2lJfVF1QnMwcEJQQWBaYms5OWJSPVJRKVFDeWV5N0dwKF9JTEc/amBObCtuJU5SRn1vQlh2JWc4N2xWUTB4SCVZCitjM2NhMU5WWiYqJHBPJmlYPVkraFU5akVLUjRGVC18K0NmSnAtZlIyNj9Oe0lxVkteVEpVKiNjclFVS1kzaFAkY1lPbzQ7M3VVNnBvUHxzCisxdD9aTkh1ciQ3TjF2byp5YVRFKEFWZVBMJjM+PWNeY2JUX3tOUUxHcSV5ZDV6M0xwS3R3OVUyKVRXJEJwZTFNc2VFbykhJkltSk1EQXpPCit0eXNVczwyPXI7TXM0Nns9ZVhrKD0meD9RKWwpXnN3UC1eNG50ZWVeYlRmKV9vR2VLbHktJWcxMihEYk9vMUg/YVchbzlTaEBWSiE7fDZBCit8fmJKKzJgMUYyYlpHOypMZjcrYHFqY1lqekBPOUI4SFJEJjB3OyZIaDc7ajZYPz5kO1VEZ1VJfis7PUAkVmI8S1hVREohJClAfig1bm1mCis8YGhWMCFZLWduTngmRV4+b3hvN0MtJnlgaDwoUmlPQWJxK05UUmRzMXBIK1QmVDwpWV51OE14VHIwe2lVUmZqcF84KGB1ZTdrYzVVT0wmCitSPzJARnplelJoNzswREx8PWtwYTxRXi1Me0VtJWNYd1B5VEZJaGIwKzZzdHZabWhQJnNLKmFqWjhqWHJke15hb19WPmg2Y0RfQVYxWCZSCis/aGx5NSpsLStfUUNtM3V8aDZxQlUmPE0jKkFgdGVQVG1kYGA+OHlGX1ohdTVSekxJTWpOI342YkhCQHFaXkNWbzl5en5Ebz03Xz9LMmJgCitUVVJZekx7MzwtQE5nRjh6dUZ0OSV9RUR7e0JJcSZ8fkFONEFaWClOejV1KWxKcWljTGdxb0RxdjFDcHF2JCpJLTBtNj0/O3ZrQmNtZTw7Cit4amdXMGUrLWJJRzY0fWNOYmlFWHtqRUFRWkZFcyU5TFZeblpZanBWV298QUZodStAQHolVVYxRy0/MGlHY31gUVhYYiNYR3A/PFZqTW5qCitZaDtpSGBEVm5AeGE/PUY1SnpZZyhMO08+X1RATU55Unk1cjUoNSY1SU4rYSlycFdTajI9TnN9UW1fJipfYVAyXmZ4KVlpRz1pLW1mJn1NCitQcW11RyV7Nz9ZLUQ2JH1kV3k3d1NRPlp4eTRVbTR4Rn4tbV5qIUNCQ3gpJHE1ME5XNTZPe0VrO0ZASU1PWFpjckJveXhofkdsPylLQXc8CisjPGU+fVU2cXNwQS11b3prZlFPV3dxRX5yIW9WWGlEajlaKkpyQmtgcz8hQTdNcVc7S1pqbG9aP2VWfj9GMWZHYFlXcGp3WT1aY0dXVFdfCit5fi1zSFYwIWR4ZnlEVXtGJUhKJk9DX2hCPnc/TFlBWWduSjZ7JXlYPDh3UUFjJklza1VtWllQUkxfQ0pWSF85ZDVXWiRwKT1HbFBte1l4CitIREIkeH4mX2AmaXg+NXR8bUIyVCVBNzs2JFpyTWFFVj5QXl9McGxValkhV3E9VWdnMn1gJnFrbGstbE1JQmNna044cC05RmRWc0xITCsyCitpQ3U2UTB5Ymx6JmozQTUxS1BYPigjOUdqaz1ITChMbzFCK25ZTTslSz12anR1bTx9Zj55ITBHdkUzTXBqKnFyUz83N3pfOWM2cHtjOE80CitKKWFDNFNrcTAwPj01OFIoMlNLJGtmYDNoSygxTk1FWTdScV9SPEgqPG5ZS355QTVhMCZDRGw1PWR0RilLZT4kQytoRSFJZHttfEMxYjZmCitoTiFseHtQcnotJXZiK2U1T0wzbW1YNj9LRiRWT3hOTVJWbXgzVF5HaDh2RUc0KztLQGNDNjEyXlNwY2w5NkQoYk4xKmt+bnwtMnpnYEZfCis2TV9gRjQ4eT1HN0AlMSg2UlY1an43dXhQK1o9clkmfWY9THVXcjlPR2MzaEdCU2QtZW10RSZ2bjhPUkBPayE+NkY/SChHaGAhZHM3KXVpCiteOyt1bHUoX1hhSGpAVWd9SU83JDRFNyE2WnpNX2pmdXRSKHdIPGxARU5uZXotfS1eTzJYKDZvdH5+byQ1KzYjWGxrWDsmbjJzV1drWSlpCit8NyU+PjVuXyk5TGx+KTU3fUI4NDc0JiZNbTNgb313KVpoNld2Y3I8RmZNYzQmMkZtI0Z1MUY4akQraTk+QXR9PjA/NipzbXQpbmlEeWFLCitBLT9mQnVzVDtzMVUpbVRvVFNHRGtzcH1CVGdTdGQ8IztfQUA+WlZBSVB6NnoqS04zMi1eazhwfDJJMGNNa1dBfVhqczN6aTJVJj8ocjJ8Cit5fmdDWUVLTTg9IzRCOGMjRyYqSyZ1ZyVPMztIbD5tKntORU9XSEdNZSZJI1M5LTFYSjI8K2dPI0UpV2xNO29JcDU8PilwSFNvKkJATjJMCitJLWdNd2FIRl9KS1VKTH52aEVIU0pJb04jIXJgPy1QSj11RmcldDBkSGJEbD83Pm5LVEswUmtgKVF9bX5gMkt5a2RjQHl5Rn1EZGo/IWBiCitoT3w5VkM7Tk4yR3QtcHR8KCZEaiM7Qz80SntWfUgkeTJBNmMxRS08dVJ7WXJqKlR9ZDY0NGllcWFnfk1OK0kyKyY3dSs7U1RraktMQUQhCitpQHtEPm9pTlI9KWt8TypzZmpwR0pyJTshWHBvI2hTTEJNS1paTDMpMUBOcVcxPVckUXZDeHUyJm9hSWhYN0Y3dXZSRnIhamNYVEpDPFVaCis/VWR3STE2ZykreiRsS09VP355a3BHdzd+MGt8cEY/NUlnaTFialVXbCFDMVVmMng5IWRzMlBvMEBtRTB6VjxtV2ZzKX5oVzQpdEtuKUtKCisyeHQ2b3x3N3RGVW91dih9PW4jQiY8TDZxY34rOzFxfTxvM2c0Rzw2QEgwIzA2WlFpSn1ZN0lOVDl4XlQ4YChrfl9qZklsNTFRYTQpakolCitlfkVmYUZDTkRRK3d2RWhJcz9pM1dqbjZZK0RlNFpBcFVANF4oRGtVdSRwPTVhPm9OZFAtcGt7e09OZz4zNDtIcjJHSXZLPCY3MXkzJm1rCis3bX1xX1RuKCliYWRDckR1UTFeSUheKGZeP3w2OEthRV9MNG5Ua1VpdTMpP1YyfTFHMFF+N0Q7b3hhQW0qZWotJmw7cHoxbGxFV2ImZ1NDCisjMmwqMGg9JXB6WGNlcHp5and5cDwoJGc1dmZQZjQ+ezZ+fHA2bmRGWmlEbGVUVzF+UjIpQmw3e0RtSkl0Sj1VRktpX1Y1UFBSIW83emhICitfJTJqfGk1fVBiYlVAP2pCMU9BN2JOKFFrSTIxX2hwdnQyZ3RwJitDJUBVbigxSSM5UXZnRXlFbWdeTHdiLW9aKjwpWXRfYEN5e2I0S0hPCitiaC1XRFo3UHI0XllHOUwhZWdYWHcwYUBvPmAkK3ZEMElAPHROKktIMkUwLVg+RXM8KkZaU0pTSXpIRzxuRV8jVjFaOUNlVX1TZlB1MDEhCisrJFFjcEl1cF9ed2h6MVBOI2xBLXEjb0NHQFVSTHhjI1pqUyN8cXhWeVZ1QGJwMVdUZUY2eUwmI3pxanFfaC1SZkk7eEpfLXdwQHYxbSZiCiteR1hld31FI3IqRThjWGt5bVg5Zjk1PFZuRSQxVkhqdERqc25TY2xZPXNmQWNoNTZYQD1vUE5IPX5CMUZnISsmdWdMQng9MExESmI9ZD52CitfPDxZNzxudTB5RTdmTUp3bXgpeDFnMGVNOSFnQ3oyMjM5KjtpYjZKYEM4dT5zO3NxTGxkSGg+NSt1RFN4cyFVKjxnV3RQTT0lUjA7PCVHCitQOFhhcVV2OWZ5dFMzZXBIaWhXcUhkZVAlNkxRWjYqc0EtZ3l5KXp2N2w3X2t7VztnMHBBbUFYM1EqUlQ7JTFkWVc9VTgqRFlaXzttMjQ0CituZGU7Mzs9SmBxJlQkVGAqTUlxS2BlITBlVSZlTnshWGB4aHpjRHZwI2d6QXZzNmZ3KkgwKHhfVzUxWj12TnZDXkleUyQtRSt3OD88I0E2Cis4d3Z2LV8la2NndD9DelVPSE9lb1FYY0t3NTg0PkQtUF5aUzVMXyFqTmx0QTQhZ1Q+UnlyPkxYKHVgWmp5YihkZlIlcU95Z3lvbUJDN19zCisyRFNBK2h7IykhIStAWHV0aXA9MXd0MTNMS2xURVlSbFlqU0N7a0teS3prNmduRXtgI35ATnN0KW5naD5kVX5xUHU0Z0VQKjIrRUpDbyZVCitndURaKFpuMmopRHl2NndAK017Ym5PdCFnVnc+bU41QFJTUTIrdUsjVVBjM2E7ekhpP0YhKlRSKXgqUDtkZml8a1ohKC0hNF4kZERGJnF1CityYEp6X00qbD1YcjtpQ2g2ZEExS3RqJWc0X29ZPklXd1oxMSh3SnYtcmMySj56Xz9ab2IqbUhVY0t4eXVOaSMyITg1TjJuYHFmMkswNmZlCitPSWszanwpKnFObTZgYmd3STt2aE5fKXI1YTh1MFV9Z2lKTTArPXtiKiU/ej1kZERPflIxWGlnSTU7YHo5RmJZIU9yQHpgIXQqIUFMeD8oCis8UGV5MEMqdGNTcXU4ZylUb0FHcTA+IzJhaT5OUGVUalpzPlNRc05gKFg+b2B0YkBHJihASStvUVkocF99cjRLNlopXlg5Vyo/RXZtTVZfCitXSjRTc0BsN1R3NStxYElAcFdaekIyYW1IUnhGVl9OO1B5IW9wRUExWFkxKGRra3NUWVdlUDZhNDlfZVNfYGc+SDdnNClSVU4rSWV3PCVVCitzeyFuM1ohQnd8O2B6bX54YVk5PDA3SmN0PEhiaGJ4b1MxfmY9YXZFd3ZZQk93SSRyNilScilOKXdaM2w9Yz12SmxgZ2ZkaWc9JmU3VzxTCitvNV97RCk8PX53fV9PJXBPaypsaCVzeXRrSTBXVkg/KVVKUUppX1pJODVjYExyZzlMYm8zaHlDLXJ9X1IlMjtqfDVvWkN8WFpgSi1pX3lCCitkUFgmaSZVPTI/PSlQd0pIWHghN35uZTlYdmlOTjUpVS1yP19aQWJVdWxgPz1zTjdoLSpLQTBPUHY1MDlKKHEmNFMwdkdZPG9APHpwTjhoCitjIWJCZ1kyVlBySHtlTE1Qb1g5TE8jQmdVMn1hdWh3Nk0jLXx8THNRSD82SHsyZFliRnZnIT5VdFRCRllxUkx3dDQ5d3pYfkNtdUNHRSNrCitNQVBEVFomJn1mTTE2YWpxdkwrXi19IUJPOTxkYD5XbERTI3thcU5aVEpnbWUybk4+eV9iclN7Tn5GJTYrb3BOTzhudWQ2JHFmYmtoQFd5Cis5REB6UFlrbD43I3glTi13fGZ4PFRzd0VwYSkoYV4/ISN7blUlTWluIXZhYF5lTitnbWFDP0s7RjdCUWkjdWwrLVhDUFk+XnVBRDVnViUlCitFZzNKTm90VnJWTT56I2FSZGk4KS0pKmM/d2Y7OUNfPy1wJVJlUlFaSjtDZiohX3l6KXlWK3I3XndKKlcjNHJFTDhFPnF9YCl1RlpeKFRfCis5K2lNKz1lSXY5TXVJY1ZNTXY0XlUoX1p4KFFaKDQqVndCSURrK2UyVD9EdlVjJFJsX0o3NCE0YXRCSGBqKUs4SkpBampqJVQ+dFckUWxgCitBUDZyKiRRTXp2QV85YGZTfVpDJUlld25zKkJLWUc4Rkh5MjxVKyE/c3VkbG1lY28rfDQrMTg7VkFjbnYyQnNiaDtLVV87IWdlc05pJHhgCitaNGhtPmZwelg1cmBOcy0lM0ozOHhMbDs5U3kyaS03JmEyNUtvYE5BZjgmcDQjWF4lSmMlcEt7YjF6Nkl9bW1gUGxwbnkmTVhxP2N9WT98CitrXmNGRkZpeXRvZ3ZOfipZOGRpVEdEWClWe2dXQHgpYighdEsyV0RnUzgrSjl1THBUXndmZSVtOCkzP2dFeHhsKkR5M0doKjFPUk5xOHRVCiswUSs/MTIqbTc7RHkqV1JwN1RGREAyV2ZVeGNeNXslcStSSz9kPj5gY283cyltWVM1MyMtZiZqRSV5QitIYD5takFYVngkUlkzMUlBPSNKCitVOT41elRQWHc+NW8lRU5ybSk0YFdROURMeyt2eTM9Jjx2MnM1NFY2cmA7VDUqWU11Tm5FQ3tNWDtTQV95eUxmfjV2dktnK2JaTjVDTjVWCitCcERzeGEjP1ViPitJUTNacjMtXylyTkE9dUpvK1gkY3VGU2Bhe21mSj45NnVPMmBzcHVHa1M7aUgrJjxFRmx6KCp3PGQ+azRSJUZ2c3BQCit1VzBDfDI1Mj5HNV53UnN1KSZ+SEp3M18qK3xBMzRlJHF1KjBEPztKVTB5OENBfWw2Rk1JbWVBbyN2I3Z0dXtmU3ZjdTwySjgkbUdQdVdPCitzbkJ3SUwtQWd8JV42WDs2YH0qfStjY0pNekw8S2RVbEdjcVd0Pk84cXRqK3NzLW5xJllMSnVkKGJERWZUPWdFKm5NKDM8TU1ZYytDRzQhCis2MFUzTjV4Xl5AaHckalZlaU1PeiUodVRDa3YoOVM/T2FHUGMpVD96dTFfNjMzd2ZyMksyVTNsZSM0U2RqbVZSWCVWZkM2Yj12MD4/MTReCis1ZWpBYTJfPm59VyQkLXE9QSEkZkVGWmxPdzh2KHYmV0ttWkZCZ1ZzeHVMX3IhU09RbTk+U0NqI1NVWmc1fiFecCVeOS0kalVqdUo2KzJaCitwQztNS2lyZTlhQjF4OXk5PWA7VFYzVTgmM24oYTclYTdqakNZVSVuVXVsSj5MbG4tITE7antiUVJgMFhuYC1LbT1qTENmRylLQy0mbmp1CityPistSihzblFmUGB3cDQrRHx5JENwcWh7ekplWWFhZ0E4cXxUcyoxSlYjJWhYJUE5TF5yJV9IIStDb1pVa3h1X15RKTZjdjE/JDdmZyUrCitgbDg4NlVwaGYwPG50eTtMcCpEdTNZY2UxUnNuKUloNDBnSTAye1RyVUpZNVh1dFFLTHZvTyZaJGw+YGleUGAqWVk8JSsycSQ2M3tMcklOCitvQTEmaDRiaSNjIUVuclY0bVZyJUxrblgyWFF9c09ocEMjKkdkYigoT3NIRypFRGtFKDlGcVNwTT1YOWQpVWFNVWZCSUs8SVJEcFRpSG5gCitUcXw1VHh9d3BFaGh6NWM+fUklQldST340OXNmfUxXUEl4QT5qSnQ+Mm9XZC05PWR2M05Pdih5cTd6U0FlUmEpbklMPDtwQ2Qjb05tPVU2CitAUlpOaVNyZHs8V1peeCMtcj5FT3Y7TTtoNFAhSno1NTlCXmooZTEkK3x+UllXWm11aGYmZ2s8WHVxZkMmZE0ycjN9fVNfOXk8dFcqZ1RWCis9QyFhRWZGSE5iJX5uWkEqT0NvMXNPWUkmWWQobmhYXjI+eytZV1cjP1NTLXAkUiZ0eDMlWWQmN1ZxR3FwfUtJMUNzeiV1aUxJQDEzNz02Cis7YEg4NFdxZzleTUtkP0AtN3Q8Z1Rle3g4ZmNSX0V1WWY5cnBlNXstQyF5PGNEP1J6Z0tWVjt1S1g4R3MkfTFSJDMocm1US3wtT2tAP3VjCithMTZAVFVQOytjOFROc0VfQUw+ODlgY2hnLUlvc0FVVXlXSk5mdDlhNTJNVyFje15JUmpkfG5HUHR5O3pGb2lASXVKVnh4MXNVUV95Rnd+Cis/fTN0ZEBObjt6fDtKXkF5c0JpWEFTJCg1VVY4P2RDKD9KZFVgJHxBRVlCcCgtMmo5UnFrKVEpY35Sb2QwVE17Tml5X3JZSj5iUz5ue2gqCit4UmBZRHN3e1hoUkFrdEJ6Z2klTlh2X29mJE90XzRjeFVJKHNuSjFPQ0s0JDRIdGMmcjxZaiE2MURFQWM8PWdQZFN+TVNYclckdz12Nj5FCitvbyRBST0wcFhPKiZJc21STz8oM2hiNWU4M1RAOTA4YEEkeWUhJFc/Y18heFZBaFFpJEk2eVFEeTktX1A7KlcrYSFWZW9mWTMwYTdtbXNiCis9N2gxUTNlXmw2USRXZnlFXn17VmxIfkgjKTszZFExUz9Ja1Q+YDZBQntQRGg2MztLR1kjR1R4JGRuWD9HWU18NV50UGh7ZzxUUTUtTn4/CisyZHIxZSVidXhJNk0kUDVQUy02TEVLfl56cG9WanQmMCYoQ2tsTTwkVDh4bDs1UzZRK35hMWk0bDEoVENuWCZ4d0laUENadVFfOTZfeSYxCitGOShjNn4oa2Vxe09tekpXMypOek9gLXMrJkh0Wk5GeClVc014b3s1Jm9sMkg8RUUyRHBWNXVYUWlZP3tDVTZkT2h+Tk1JR29kUishVkspCis2SXhoRXQrWURzc2RBV3FyZCVSVilyT25uKFFjSkNXQHxFLX1nQDQtNmNOQnhLKUg2MCVlS2hsKFl4NUAxeWx3diN4YVRxayVWNX5WTFBBCis3YU9mM2oqKn5VNi1EPTYyTXt9ZXMxfTA9R0ZwT092P3VAJVhvbmNmeVBFPTwoNVJoMnFMb3xPT2gzVVpgZSNHRWtmb29PQXpofUN8PGBqCismR0wldGZKbytNM29eVVRseDErVjBfI0N5Qk5TU0xuRml+TWJVWEFhdXtBSCtVRHJJUHstWVp6IXE2UkxWPD5BMmc9c0xlKHM7ZTszayV2CitxYDYrOzVteCVGNFoqfm1VJEJJSWcwUlMtT3hvQ1FIQlJyb0EpWTtUfk9uXzR+M1NRU2FzQSZ1akpwZk5rZmk8K3FtPDlrWFhRMyY4OGI1Citid1VRS3lPNHlVRytMe2UwZXRtOzIkQHB3K0VaaXloTCtneE9yMkBxTXU0KzZMPGJOSkI2e311VlFrI2wtU3gtb0pESmFGVXlgbjUrK0JvCis3PXBhKGNrWHAlWGRtd2xLdlk3ZXdHazEwTjRCQFdFM0NEN25uVWh+SjFuP2BEbXZXUlo3c2toTVNwKi02KEZpIV4jfjNLTC1aZ241V1NfCisxYGsoPyFDIXFIPFJHTSF5cSEhekZXaDhNOG0zfiRAfTk1MVJNNntsYEJhaXNhOHJycH5jdm0+TCQmVnV2JTJLMmBgbWdGO0syRUZjSEM2CismanBXUVIkOzQ4NSpOKyZBIXQhI2F4PWg4Ulc3bWBzMkkrTnMoXzdBWFQwK2hnJU5MNSRCdFkhJih3bEBgMSkldXA1VV4zN3RkOWdpJW9zCis0I1g1aXx8NSQ9YmV3dGVvTHFMKW1GNmdUczl8Xyk+MDQ/K1FQe29nOWQzUmJgQVRGMTVDcitoYEFHTD55dVMoZntLUHV5dCRKOS1QaDVzCitqKkNsQl5sITgrcHBTLUQ7UkdAc253UFVwXkt2NiVnR2pVTnRLKU5rVkZpSTFQV1graXBVZG9qNzJFKTJRclBCOH5Ae3BRbERhISR+fStFCit7bHQwe2tqRT81YDkhSnoxaXorZkx2YkRMb1pTTWlmY2lIeU0oPFNsWDlpK0ZIN3FYNWtnZ0hicEAjUHQ5UHh5NnJ7KmpMUW50QkFgPkplCit5TDFac0kkdCl4UzJ+ckg9PXtTdy1oS1hAb3skK199b1M5MHBHZkhAMzl3MzRXKCFtXnZRVjl3fTw9enduNnhUQlh3dDBlZXAocElmJE8hCitwYCN7JklkPF9iU2RzRFo4fHYyZUYhUTBvSWtpYkBSWX14bDgqZE9rSSojUnFMZyVpPXE/NDNtMnh8T01UUjJLMjwmejFsMDVsSDxARDhNCit7TmYtVCgqLTZJbl96MXRjS3tZMzFXe3QrfFU7bk49USZRb1Z1OGU3O0FeRl5rPCsoSVVrWiNHVSZwLTlncXA5QzhWcTxWfDhtd1VoTFYrCitCIzYhKkpyJXBoaWRyNjcjdS04fklZe15gVlZzS0llZ3MofV9rOX54PlFhOTRid2B+Nkg4VSNnfnMkQyVWVEZob3hyVnhkVys8UWJpMGZpCitZP2RmZEVkbDN7TDhTUjBIbDJtZ0pQTFQwamtqayNqMUFEPDQ0YEReWmdVVlgrYHcoSSMjRlFicHdGY0FRaGE8VTNgQ1h6UllKRWM4MXV3CisxckZ3aGA8N2hwT01mTTlDRytEaHhpISltMlh1Kk0xVUUzaSl8aGVgKUptXiFMTGNeNDg5dnNLJU1hI3BXe2pCbjYmejNHXzlDMD1qJWAlCis9SFNASmlZSThRR0dSITh6Q3daTGsoQld8Tnk0NH1DYEI8aWBIP1FlezxSM2A7Tyg/Pk5fTF87SSp+REl7VnxXV1ghMkx3aF51aCY9YmwrCiskbypOLWkyd2FpUmZjdmJ1QyN3N25mJVJfJUFiNCZyeFJ6PmtxVVRDVyNUd1p8X0g5MmNKcjEzVHdPKEomYEJfbSUjMmIpdUJGPFJvWmtOCis3Ryo9T0pDOUpCPSRVYGNLMVBWI0teLUc3fV9HP3ojWDxrI0A8dTI5QytoZ35xNE4lY09GSnk0NWBKbVB+ak1tfWJOUUo/O3Jva3wqdlB0CitfJXU5eW17UW0zc2J8aD4heXx6Iy0mYCVgQyU+JDItLXNDaHYjYlBIITNKV2spcmA+K2dTZk8mRWtzTld9dyRtP1QlYDdpTXBNe0VfYFU9CithancxcEhNSj5CZzBAdm9nSVJwRDNTeFlDTEV0dDgjVm8rWm5LTGRAe1p0Yz5UVCVZUD01Sk1HcCVASUtjaCphbEs4KjZYK1JJTmU4YmVrCitmbmIkanRzOzE4Tm4oJGxIaStvYVNpV09ZQHNjekt7SD9Jbk90PXh5K014NF4kZVJOcGlVUTsjLXR3dSNHTHk5VyhqQVhmbDVPdFcldnlqCitWQm92e0xQVUUtI2tUa2pNYypfQ1E2KV5jbE0yKEVuezc4d1k9KU9vaVRuWF9qQFJnNUplYyZsUzVrKEludG44UV9wOX1HcE8oSDNscDxaCit9fmBmR1k1RDUqMUJ7RFBsQjVOdnFgVzBJPlotOEA0WEtgKzF7eFVXWXRkYXplQS0qUVBDcHt7eHg/JW1AXjQwPVUoamQ/TXEjaDU9JDVqCis8IVooJH15SVYkakdfe0hpMH51LTF8eVM2aDVrJkdkQE8xSlY9S21XQ2V7RSg2Yk9oaSZQZGhtQXcxOzw7UC1pR2IySDhzRk9ydENSYVZzCitJSzdVbykkcmszQ0ZKbzFgKzE4OSVGMno/PUtnaFZJWGYobE9lLTVVRjw9bkx6fFM/d345eEZNfXorZFApaD5ANmFXQUsybXRleTdEc21tCitnMm47PzAwMS1zMDAxSFkwMDN9bGE0JW5XV29+M3xheFkoUFZSQ0NfYSVeZDBGSkU3MlpmU0kxVW9MUVlqWml5byEhUWlwYXwhfC0+O1FvCitkUCN8TjZFfWdteWljUG1kQn5oU2dDcWREPlNHRTx3MnxBUk1OSWt2fWd8RSokJFlwJmI3QkVTY2MzfD1sWkIlLX4mPVZgfDRTeWohZHM2CitFdy1CeC1XJTstZDhtQEhIOTd+fXZRYERoJjt6eT84JWpJelReaGYmfmwqP002bkYzSk5tUys+YmdfOzdTR0YxN3BoWWM0aTY7bkhRSHpyCitebXFDP2Z+Pns7M1BhTlZ9VGVLPENlT3NFNSNRXz5PTkJ2VD5TXys0aWAhbzR2VzdwZ3x3eTNiI2BqTXRKOEQ4fkRWTFo0JXFUbkw7QnVSCisxKUpIOzY+UEUoVXthN1JkRjBoM1lrajZIbiNoVXN3UzF6SiN8e2N2Q0pOMFM3YzNKdVYzO1g7UXY3aj5COWxEdjBxUzIwfFhRUjAwME84CiteT1k3eUUpKDNPI3N2VFhpd14oKkFwaWdYYUF8TmFVdl8wfldOJmdXVXV8Sj5ZaGBrNVg8eyNKVlJDQ19hJnM8bGQ5N0QlWmAoRXl7O3BxCitmYX1ZPnNVMTNldnRxQTQ7KzNGNzJ2WlFFPXdtX0IlajZed0hXS3R0KEpJMiFnekJgaFZCfVlaU09oOH50eWZAeEdfd2FINiZ6P01rTFh8Cis9O2okdmkxWFJxaT5HP2AzSnJSQlFPK2BgLVdUWF54Xk9XPC1YdzMxNk1FaTlTNzxKeDNWSDI/Slc5YjVfZEZxPUptR2tjS0Fme0BxWEtQCismeWZXTylyKWhMVzNHdURSZDE7a0ErcjE2QmMoVFRtNilUVj9vaDZhaFpYN1Q7dlBNaDhNa21fZEFLdk9eUVlBdFl2TnZhcGQwUypmZFV1Citjej9uPE1acFpaPmRfPGI8YlErSlRweCNZPzdpR3I9VXpHKl47QUJTaD1zSChBM09VTi11K2NgfDkwPG11JS1ffDVLNjxDNn16WTZfV1FRCishPjRgOGEwYW4jWUVIUmxjRik3OEsoTkF+KHd1e184WT9gN1RISkFua0Z4TE1ESlR1YE0jdlhPRl9rLXRAfDxDb2E8cUlFbSVMKUQrVUM4CitJcWVmaClXZ31gJU9WUHEzekskWXZ0K1dNWllgYXZaVTNHfkhAMGglSHgjOD9pXjlvKHh0VkNediUhMzFyQSpgYXY+Z307Uk5+UDdadmooCittOHY5bXx+elRsMDhRenRYbVQ0YEBXUkojSnRWRGRMeHZ4KG9LPUt5fGwqNUR8NjNBZkQ5ZDA/cl5SbjRieHYkODxneyN3P2RURkhXelMhCitXbE1JVVorez93ciR1Kjw1Sn02Q2NMSj9lVXUwcUxYMDRVezBhfmwlPCokbVh+MCNOM255fU9iZDJYYX0odHNQVHBOJjQqIWsmTlI1dk56CitANj9+JEhSdDAhQ2t7V1lPVWo9Pno/V1h5Z0J7ISN+ZDFsQjYyYjg2ayVNLUdfUEc/SzhlPGBmWkdCXkZNVlNod2sxd2o7RTh5KSRnbVBXCitXSmdiQE5EP0l9SXgwZHslcVRXVzJeKFE9YHc+MXFRb3IqPDAqMEwqMUVUcGteP3lHaDBWU3ZyUiljS3F3S2hzVT8pRmlJKEJYWkJ1SVdiCis9TXF4d2g8OGJRUjtQK05ENmdea1NHTUwkMCZUR0pyVG47a3pJZn5FfGZkXj9EYE43ITQhNiY9cFRhJTx8KkVuJCZsTFFMeDtPSGM7QEtkCitIYSMkNTBPckh+eCpJSzQqdmI9eWMwKUM0MX0oelhDSCZed1IqTE4pRn0yKlVwTWRHISgmd1lwKDcpP1Q+d1Z0U2hxWlQwJHdjNnsoQDZjCitzZnkyMkwqRGY0bWl6eUtgWVhYWG1RcT89X1EjKCN2KTVQUW0yfVooO0wxRn0kd3VPMk00RSliQEltY0N2MVJFYG59LTBGKl5lUjBCKEgzCit8bjl5ST5uUS12eHxATypDXzEqX3l1ezVZM3YxaGBCfHlAcVZlayFpfldvWjYxTDY+YlomS35TbXtAblIobj1JME1aMjJhUDJCQDJBLVk8CitTMF4mKVUzNjtSeUQmJntVczBhXzw4Xjx2P2VFKyNQRyRIdD9lRG4/R0gyYXlrajAoVzRsWWsrOGc9UGozeG5PfmIxa3RieSk8SzQ9aENiCisrQDh3cz9kVytDTnF6ajN9VC1SIVl7WkVSZmdGeWhRbj9SNl5QKzF9KE5vTUx4N3RYbFB5MlBuKXhrY09lP3lnODs0N1QldW0+KE5feyo7CitHP3sqV1VGKTwmTFdoQDB0RzwmbCUlaTkxfFlzNSkwd2clcUV7UTs3ZUgoe3koa2MtVzc/SSh3QWV5fk83bytQK3dWSF5AT3E3Q2BoLV5FCitId09IWUlELWZFNU04ZTJ7eXxII3lsc3NKOTRDQ2hqN2MoQiRVTXZ1NT4qWFFLMlRHcVJWNGJ6JCNFJnFqb2gqUSlSdypFO0ZXPCEpRUplCitSJUZtbGxZJS03KSNUU2tILW14LTZgR2NkPV8oekMtej4rYUY4Q2JNbGhFeHhhNEBAPTAzRn5uZkElMlJyZGpmPjdAPEh4aTBmVFdJPUMjCiteY2woYG07VSR8ZUxvUyR5M2p8bFJBUVNUbmM+d2M/Q2laPlFJXyVvPy1ARTxuN09pI2AxXnMxQHcoJkZCcG4xbE9rfCYrLUY2diowVURJCitMc21JfT51YH4qPlZkREB4Y1d+KjN4XyV+SGgqI2RLcFRAJStfZERQQWhCJGZ9Qj1gMVdxSkg7RThJNDN1ZjJ5TTZfYFNUNk5pVW9rVTVoCit2YTw5KTNLQjd0N19jd3lxNnU+cDs4SXg/S0tpM3pwYTRZMzBsPzc9a3N6aFo1LVZienEjR15VXll7ZDNTOSs9fUJrTUZ4KV9BKnF3VkxHCit0c3lkY1UkP3c5cHJ0am88IyE3dndYNGlsaHg5OWpnUGlLKGQkaFkyUysxPlhNcX1kOHJFYkZPTDdfd3VpWHVfRTNKJXIkY25RTShPP3NOCis9QUo1JWNLWEwpMFJGTk1FVzA0TzlLUUgwMDAwODBQfmQ9TjFYYm9AMiZzPDA0QE9sMDMta2EwQn50PUZKRT9MWmUod0FGSm9iMlhrfXc+CitaZ2deUVklZ0Q1WD5NdEJVdGNiOGQyTnFENHVVV2NNZld8JHEjSmdQRT9rO3Voems9djFEVnRUOGxjbG1pXlNWbzFRSGkpfDlnTShNezhaCis4WkstNlJnbk12OVVgY1RJaUtJcUxNeVYldTFURnojezZPTU9zZjdveWJKd29qJCklUloxVT5yKEpQczU/ejdVUGxUQzF3VUY9TUdKSTc0Cit3MFhXQFlvKiV1a25mVWFLJVdwWilzZz43ZThuaTs9SVZ2WkshVjIoI35Ed08mU0ZxMj5pQi1eVjBYSTJBVzd9Q0NSVUM9NzdmQXNycWpACisxYFhPOUtRSDAwMDA4MFB+ZD1OQVp3IVQ9QGg1MEF2c1YwMyFlWjBCfnQ9RkpFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ0pDVlFfUzFhCit4UVJyb21Xdzc8VGVtfi0oTWp2bD1YKGlCd1V7WWBfU2ZjKkZxQD0tUXlsZ0Y8Tl56RTI2YnJOelFpcj5wTFVhdlRWeDwpRFlzZVhGaVEpCit6SGMtWj1TRkdFaiV7NjlyS0RNe2ojYH5yQmJ2TjtnfVBFWSpZSX0+IytzYTB5c0BBUzZXLX5Ve3I+QXV7I29haW0jVmZ9TmVRfClkZ1NFCiteOT5lM19qLUtgPXBHMFkkU0AtZk5Cd1JGYW5peGdPMTIxMWI8RSF1ZilvUWdXQnt5Y1lMS2pYSmd8Pk5FRn15X20lQjg1ZDc0PnMqMjc2CitNS1ZMTjhQV2BDfX5lJXI2TloyanIheDJPSG5gbWZFKHhtMGp1TUltWm9peXx7MWs2WSZBLXU8cD4qZ0JLWjx6NXpHYExvJldiKD1IXmk2Cit+c35PSGM7MXo7T1FzeTx+Qk1SdHNaQXhueXc1XnxSVHMrdU41Km1qVmFlVihQTCklQz9NbHhYSHRZV0I8ViZaTXgjXntDPTZ6TGpramlXCitlNV9qIX5IN1FNQTxsVTxlJEQwPkxmKzl6PzRNZWEwYnJwNXxHJl9ITnl0UkRUYHx0LUVTdyhwKD99ZVU9cT5CcG1hTFFibj07MTs9X2p6Cis7cjxVYVhTX0dmKio2MnNWczUoIU5aekI7WFhMSmBuTl42NitCcV58MHw1TWtzWVBNZCZkbkV3QmN7TGVQXk05fWFnRztZSDkkcEItbCkhCisjVldEWHNsMjs3ZD9iIU91KHwtTGhQaE00b0MzZSVvPGlXekJXIT9ZSDJuQVEwMDZvbER0LS1kc19WOTtSJGlYJVhkN2drSXFfS1FhMTFoCit9OE54X0BkJG9Zb2hpfUhuR0ZfQCE9T0NQVClCc1peSVhGTWAmUEZnans0aHRqYUs5aWtrLVp0MmJBZSUpdU9QIzdLTDZ6c1M9elA9cGktCitNKVNReClENXlRQXJ0cGZRTmNIREx8Sm8rTiFqQHNSVTRrKU9GVnV0NUJ1M0M9T1VxdDQ7ViZpbjs/XmRKWG4wSWlgJWYhcH5JPF5DaUx5Cis5Zzs2WHtjP2BLdVIoO1BFK3tqX3UoTk1XdWRtSFR6TVYza21FfVRWTXooS3ZlQitPPE9PanxTYzg8MVNNPDF8UDgqQFVqemQyKlF4KWApCis8aT5LXzhwOGN9X3YyZylIfCNzR2JCaEB8QG1IVj9UVT4tYT9mTFcyTj9kK1EpbmJ+QCEwUUJ2SiNtWElWVH0rNmZaRTUxM0VAJkItTDkxCitXJlYoNX1qLSQqQzclbClAbl5janJVLTNwQHV7N3FFJGJnO35qPV5FU3Y2PlE1Ql9PO1dxVyo9TWFPLTBIe3ZsPiQ9SiRUPEB3bW1yYUlRCitQTFc8O0pATyolcVh2MXQ/LUdTT3daa0lAeThYfihHQiUlTlJ7eGR2OUA4SUxUdEN6bEY1ZHxvbFJnVzlOMmozP1kxV3NFcTtzUW4pbG1OCitZOUI3RSh9NkplSFNHMD5FIz5IM0F3bFEyJmt5Y3gyRjwxRi13TXlDMU84WHhKPiZSZjdjSG9vODU8OGNJaWhuJnVvS0BOdDhhPWUpRSoyCitESDFaZj5LcGpNbDNBeXlsWDBOYE02Y2R6Um5Vd2l3SDkqLWMtQykwZVJ0OTZDSWA+QDlxUF9TaVReYTFiamJkTEdxTUxvTWA9JSYxOSgqCit2dUBhOUlIUmNKM35rMSU9YDVhNHdpakQ+bytMbUhmQi07cGImWGZgZVJwYXBqKzAzKiZHbzUxZ0wmP0hWPmF3Q3IyIW9IJDFAQ2xBJFUxCisoKV8qRFo5el9SMXM4YSRmM2d2UEZLUTAtSTNfRHtGR3JqPzBNTkU1IT5KM1UzTT48fjxVbk5VQFckO1ZTQmpFIXFaQDh1ZERoKSl9K3BKCitrMGNYflIjVmVsNWpUeHxiaTtGeWRMc1IxZGBlNH5ZS2E4fllUU2FXajZUS0tZcWN0R2VLPH08QTU9RXZrMHArREE1bGRHNCtqOWF1P0U9Cit7LWV1OXN8JV92M3NHLXlMfnt0cUJMZTs1NkZaN3g2a0N7clBDPHV2VXs4NXI4JEk4ZE8wYCRCaThvQXxJVkIhO2cxSHlIY3VkcUttJjVoCitxKFJ3PW5MPD9WKXFYSjBaPlo9MVFZLU8wMDtve2xAPj01cz5ianYwUlI5TjB7e1JhMDAwMVJYPmMhSmM0Y200WipuaFZWUGp9elZ7ZE1CCithJkslZVZfez14V2lEYGVvbCg3UmdEPz1Ae1MrckFCQmVZKXF6d0k4QjFLViQ/I1EpfDtLdGE8SzNZWGwtbzBsPzExdUctMk4yd1N6c3xCCit1eXd3T3dEdGBMKzReI3c/dVJFeEcwTW9QPDgrMnNjYW9DNmpxLX45cj5AMHphQWM1K0RRaX5gbjFtaGtXWTx4SV9IajBkUUdNbyNNdX1CCitxc2I2WlZwT3ppYH4tbTgta0xSbEZqSmpzYTlOaEtlQXRUc1hiQTZBMVNRWGJKKFlkR1BWMlhIJDxudXVgbHdFT1hqSSR3PnJJS3sydVFgCishI3kwTX1AZEBMJFR4YFp5cGJwcTZ2cV5TKkZKTCo5R3hZMj5tciZRTXcyKWNjUnI+aHxFPkcoI0V9bVd6YUstelNAeGprRn1tcWRPaz5XCistciRUKWdwRGxqVH1XPD58NSomRWJqUXJQKDdMKXxJWjgtVUNTQGJGSEVyK0Q2WSV5O1d2NnlyRGN2ajNlNlloOSRNZH5mR2hEMFApaD5ACis2YVdBSzJtdGV5N0R2THBLNjtWPjAwMWB1MDAxSFkwMDN9bGE0JW5XV29+M3xheFlfSFZgeWIjWipGdlFaKWA3UFoqNmQ0YlNganRsfV4xCis1ZjxPJTNgeE4mQ3g0NX5SPXRjfVghSzBZVUwyRyp1ZVJ+bSk3IXdgcilPYE8qP158JjV3YVVGNEhBWHNsc255VT9GUmJaX1U2PTtJVFI9CisoZnUlSjZ0KT0lU0M2Rl4hRUc3fTA0VHxgJSNsalp2dm9ERXE4dW9NWjJ1Tz1LQ1I8QyMrKFVRJTNMc3leQ3tBPlNhVz13Y14mKUp0e2FtCis/NjFJYikpQFd7XzJfUjNXbHEwfW9KMzB8WFFSMDAwTzheT1k3eSVSbTwqTEpSLV5qMylwOUNJQTJjYUF8TmFVdl8wfldOJmdXVl97PXhXCituKnR7YmFIUU9GSm9fUmJhSFFPWS1Nc1RhQ3l9a1lpfUY1QHc8S25FOTBQNUJkdVM3ZG9gZC1iNH4mbiRYeU9ldUpeJXAxWnRPKDgxRit6Cithe2FpWHxHaEtBJDh1TWE8MjNEdTNQYC1tb2YhYDJKO1VLfUlRWTAwWTtEWUBrYyQoPmkmZD9wUyhsbl5ZR3AqdW1iR0d5N1ZIakluRyhNCitATEt+ZTloSll6Y2duPm8+bDxgN1RJYW1KTyRXamNKc3hGeCp4aCZHZyRVLXlzYWxANHNJWDdaJXt1byVPam9oVTNUT2QpWkc7RjFmWUJKCitMKDVpbD5mN01HUDRtNmtAe2lkUWwtanpGNjY0MzZYQUBXVFp6eFF8KlckcVZeTTBRbGUrKUw9MDlfNUNIQSFDfSZARTtxNmVpNWgtTmxCCistWVdoYzZEVXBOLUdRRk90SlVjKm9hMmtLeWc9NkZudld6KD09c2tmaXVgSTBrfmJTbFVDKjh6bUY/SCRFUlFfPGB0dCFEWT1qISVaNzRzCit9KGNBdy1QSUgmc0sxemlwaCQtKy15Sj1AfUIrMz5McSpzPTdPRjZfNH43UUt2ZUxUWGdGTGNDWDY+YGplMntTej5hMTtWSVZzTkZINk4mCityS3JwcFBTJDBgYjMlVnRzJXx6S1YxUypwPFIpN2FPbHNFPzMjPGV2cDw7PCR5Z0kmfklKflJWX1ZJYzljLUI2Q2V+dDNVM2EmTEhnPFJCCis/UUZUIVdtREcjUkF+VVVNVWdGVj5QKW5XKFdAQEdkc0I3c2hrTGgqWTZnZVkzPUx+R0tzIWlIQzQycGR8bXo2YTBkNz8kSm9MSzFEJnZoCitsLV5JUkNkKHpCMU1mdDZxdWlhO0RJXyhOPUdRWnRLKUl8ajNJZzZUcTkoak1OdmItfipHMDRqT2AoeWMpUFpObUIrTnYjeTEtQEg5dXFsCismNmxXcygobyFkbEM2Vil6KzhTdnlDZ2B0fCk9bHcrbUBfIV5qOz0xYWtEIX49T1kwdVpCS2RqQWN4IVhLeSVHe1k8PHI+Qi0pJVB2X0ttCitrP2xILSlDWkRXTCtpMGNVQUdnXyhJbzNXQUZmJTszXjd1Rk4qcTM8U0N2UWNLJUtlKj5gbU0pKzV9MEd4dn1wZntPR01Ifl42RjlIOUUjCis8RHQ4KDt0SFMrNH5IJUEwbE9mWiUpd1k2RCNQI0Qwcz5VZER5SWdIaGU4ancrUEd2MzBpcVdYSzFMamZqVj1vMGFzYCYyZi13bUFtbDVfCiteZFhrPFhqU25WZ1hKPV9aYzc4RnBBfGRAU1VnZDF+VndpcmVXdENoLW4hNnNPQ1U3QyhnRUBnUjlsRGQ9R2Q0VXdKUkhLYFIkUn5Hb2QoCitoTjZjayEyazY1akIyciU3VVg2cCNTbW8hKit0Siple1N8WFdeQUlgbmtnNkJmJXRgbWYzaW5YbndHbCVRMyt8RFJgNHglUzxhfVhsc3lJCitXcXNuRkFeQkZ9WWtXZyNyaEZDeHNmaTYqfUZ5SVM+YUxBbGlUYXN9KSs3JkYkdX1KfGQ+M2o7VD4+Zmc9aHNReF97b209UFMkVTdQSFg+CisqOTFReGBvP0UyfUVvI2JoKGRMMHBtSz1QIz42TkcjUVB6RzNGPyVJYWRfK3R+JWZHWFBPT1UpMm47VDxaX2RZeX1PWSg/fnhnIzsmdkYkCitoNykhP3o4LUlwUyg1Mk8pXi1SUSZvbih8ZjB8a1JyTDF5OT9feXI+Vno9SlVZKktMdTgkQ3t1cW4tUjlhRyMmcWpGejlvUGNSUU95cmVKCis4WEkqfkJlUF4tUWdSWDwrYkxYaGVJbyNWRz1YaEBeYWkzNzMlRyVVV1RII3J3VmQ3cURKWHFFRyZ4RjxSdG5NSVdfeFg5bDNvVW0wTEdYCitQX2NfQ0x+Rm1NY31ASH4hTyF+XmJmZHluRUJLYVJ5IVR9PUBoOWE8WW1kOUN8YV8xcV9PJT4za0lSWlktPit6V09VYTBHamhqd19iQGUjCislej8zTHxXbVU0YFhxKWNSNF5uUj5nJEpwS3M5RnNtRDVeTmVNSC1Faj5rSHIqVSNOdTJrTUNQK0pgZEl8TFV5MyNjKGd3ZWk9a181NzxECitiPmBGaCQ4ZVE9emgmYVJYM30zcSo9WjNucktURUBDJS02dVpCc2EoUjN3RDVfQ0s2WHkjJXF2WVYpK3lNdy1pLS1fMXdZJEAxSiFwT29DCisxK2F0Vz5DeTRUQmpELUZRc2ZlPnFJZ0t6WnhHNHJZR2gqVDVyNnxNOG11K3pNenMhcz9vTzU7NjM1fiZ2alVDcXA+JE9lYFYjMWJwb0FGCitgNk1SdktBcGBBTj5IaXwyRVR8eFBxIUF3RWB0I19PUUFlZ0IzIUEhemxxaUsrcm5Pb2Z1MSM0U3MlNz88bGhma15aSHQ1SFNeN0xaWHxaCitGRzdaUzVuIz0kNWNyQF9JTHV6RSV0cTNwJk01M3NtXzs7YCpQTlVhZVclN3haUzdtWCVCRjliTU5xWl4xfWk0Pyg+JDchclk2ayY/NCpsCisyVlUoOHh9OEIzUD9VUGsqK24rZT9VS0BjeTJgY3ZNaT4yPlooc3Q/dFd0MmtiWEk5UmVaLSo2V2tqZ1FBRnRMYWY5czd7RWVjTjFYU19VCitgJWtgMj58Mip7MD9mPjRpSDhYK345R0pARTNXTXI0JXtVNk1VaG4/PzdfY2V5OHxmUX49WENYUTVONCYjTi0mWFVXaStDJXpXMnFLeHUjCis2cyNNQyNuMm9nQSZgY2NtPmYtcmcoKz48Mj84SkF5P1NAZks3dDwhYk93K3E2cEJxcmcrR1gkOCl0JkxER2I8TVFKXnErJDJJVD1hd3oyCitEd0FHR3s5VnQpLXN3SUNRMj9PZWFubnFiY0drR1ZyJFlpOWhqajkqbXEpPDVEKS1uZ1pmVSNDYVQ4e3ZtZlY1K1c1WTl1ayRPSkFMS3IxCitpXi1RZS16RlUxcFMob1I1fktjM3hvV3dqaGtLJFdyKkhjVkdTTV4mamBuSE8+P1BAekVtWGgtQSkhTWNQNk19YGlMY2FsWX5GeTVRfnswCitZJEItRSkpKFE+bWVVZmtKTkZIUl8jQUxiT2JfTnNOMGotOGZAYE5EWG5fZms3aXJocitON01rTVl4NStfN0ctYkZ6IVhGdSsqcGdzMCVrCitMaH4/eXtaJndkclVBb0cmcjBlWSYpfEJuITd7eVVDKXNpSjgjKnBHan5iT0lheCRga0dhQDlpYF9IUzdHJUpJOXhHJWlqa2ZgYWBqMXBSCistOXRleCoqQGk3NGZtQVdsPz9YJD9DK1J9VU1wM3JDejNySGJhfEU0bDtFRHVFdWhTOENYQVIyV1dKdXduQkd4OEd2dUVlUzVDTjQkPFBOCitPQCF9Ri0rQ3o0bXgrdGJUbzMtUilFbl4rRWhCI3lRTUt4IXBwfjhibDt8MCVFdk98KFQjUVN2VDl8WmtgTD1Ed303JTQmS1BkS1RvIT5GCitgISltWCh8UShueXEhND1qKVEyY2ZAX35vcWxYaHd7PGFaRFBUKWo9ZXhwZipgVXRTWHxndSQ/cmllWDZUbVF1fC1Id3BaYCVwfXd9Q2BRCit8Iz42Uk8xQnlzZUdtc2UtR3R4PkVhXkdIT3EkQD5yUD9hZFMxZ1R1dzNtT0BHMXhHUFhvdmp4Yyl0NWh6YDY/QCh9VXJlJlNXcjQ7JHNaCitTfEFHbnRzNkstcmVwa2xKeC1iekUxSEd0elAjJF9vPStBYEFKQ2U2U2s9SGh5SXtBWmdwUyFELV9DMno3PWg2UDY4bTZEcGRXQFJlKjxwCitwMWZQcj9BK3lteX0+JlRle3BscFVYaT1tT24hMjdIcXhRJCFEeFdyZUF+Qkd6Tz5kdGVnYzZCWURDNFdScDxxRC1eITNiVSgtOVV5KmZGCis5akM2OHpJKU1gWjI+KDAyLVc1THY5ajhELV5Ea1F8P1lDe0lTJSVZJnVOb0Qhc0U/eXtTJlIzNHFVJVJ1ZW5rTmI7fnJmXndJIUdEZzdLCittVXlFQlRHMEgjZj91bzE8fENtdnRXSUBTO3cxcWhzOCg5KHpveUgqPGdGVEhfK0J8Kil+ekcoQkcxenc4IXFneVB3O1Z8fFIzb0EzPFAqCit2PGtoPmI3ck54Q3M+VFE/fWtWakZfYDNmYXBlbHNVOyhAQ1kxRmM2VkEpTlkwQGRpOSZNRUBBMUVKbXE8cWxGTE9JUzJwWjxxMUEybVgoCisrMm5nUEghJiZTVyh3RXd4IV40d35mZkp1dVhHRVozNig2dndpcDUpbCZjTzx1VSNXOE9VV3Y+bWUhU3FDX1BfZGxidDJjJDkqWCNyQ1VpCitZKXdYVk4xWnI/R1l9PlMqSENvajMhSjc9SDRMdmtTejA7dGRJQ0ViX0BaR1F4RmcpKikrVGhWcF55NVpTTTFUNC1IaXZXQmxebUJ5cShmCis7QWglVD9CZ3QqaHJ6cklhJUklUSk3TmhzU1VlKTBId1F5YVZoMkNzfWFqZ2AqKHh9NHQ4VyVxRmhgNSNucD1wTkVFeWxOY3kybi1NQjs1Cit5IXkxTV42YWJ2bUNZXlk1UUd5bGlTbVRzLWA0ayFNbk42JTNjRy1DbHZnJXYxXnV1SF5pTSg/NkRrd0daWEx8aSk5LUVCKV89VlclNmg/CitCeUpFbyNzJntXdW4/ckdEWSNFVEcxI1VPIWRDc1ZSYFV2d25gYkx7cVpfP0VANSQ9dklOb3N5MFVXVntxTEdGeUQzcyhNNCFReVNJR3IpCitpX3IyYEAoVEkoPy1Ment1SHlmZHB8NTtnQytCfSF8SVBLX2NkPHhFZWVvdEBwZDU2cmRLP1Rke0wtPUF5aDdDQ0dNMiokUW1vckpAZXtaCitAdWl2Sys3ekp7UWNwTH1yJX01I0p2akAqP0Mwcm1PRW4lR3VGKUQ0VDhiUzc+MU1PM3dIPz1rbmRDajJDRj81ck9gS0FxdWBXNnAjMTYxCitwbld5Wj4jLXdTPXM3PVFTMCFMPkEzJClgJC1FPE5ZP3VZay1iYnx3eXQ7NHtOYn1yPj1PYH1IfkQ7NmE7R0dsb294YG5yUyp4KCZPSDJqCitSeXtDIXE1SVZpdWFpQE8oPExvOEZsR3AyPjhSJVNoSHQ/aGNSYFQ3YnR3YVZeVkVuUG4qSHhxVmlaKU5jKmo7c00kOGQyKEdgIVc9Kl85CitrNUh4e2pjS2otQlJ5NVcpK0c9SFpCTFJlYWNSJDdIdlh4NFBTVkt3bDNiblY1YipSKXRUR01mZzJZe1JAJTIkNUlyPCQ2SE5rNHxlY3hQCispaD5ANmFXQUsybXRleTdEcXQ+QmxWI0owMDRMaDAwMVdkMDAzfWxhNCVuV1dvfjN8YXhZX0hWYHliI1oqRnZRWilgN1NYPjRWOGEkI19BCitXcFhaWGQ3VzBsWnNScih6NTZRJCRzc243JTAtVT5hITl2YnBxSGs9N1Q3fmsyb3lFNHhUWipmcSs8SztgLVpZNVM9JnFOZ1k4KHVIKmVtCismOEt3IW9CamQ/KnkkXnxnejlmI255PkIpZlpCPmwpTm0qTWRlZihASmUre2JkSWMkQ1BqZGp8K1l6VksxaGxsKzZyOSZqMCN0PjQkNTNWCitMZk87Mk11b20hKD9JdkdTSVg1dFNIbSgmX31wdW5tbzxCfShwcHtrKjJJNlJYQSFsYDlQc2ExJkBGZCEzMlRPUyRtWH5nMCk+bWV+eD1fCiteKElvPzR2WTQ1cXpIPnsyQShqNXM1RHZCXiowZlNeKGVyVUZJO1pLZ2k+dnExdlQwUzJLQTQpIThFR2xRfDM+K3dJXk9ofCtwQkY9WipSCitVRzJUS3ZDXzclM2RMJl81azBPPCZHQHM2fSYhaFc2bCYmY2clM2tDclBXY0haP2UtbyhzaVIpJjJ4Nld9ZHwpZUV3MiVMdUZ+NE5vQmM+CitZQDI3T3t5ZlFYP1VUSVpWTnNTKWZMP0UlLXROfHEoWHYre3RiZDs1ZVZ3M31gNDYwZzs2JVp4anUpdlBwJXY0SUl0KGZwJmZQZXVQXmtsCis+TClKbzQ7fm4lPEV7PClRJChYbzY1czgjTnNZXnNlRGhPcGpkUW8kdGtUb2pIWSMtQGhBSXloSnlhV05hemtkODFLLVFsa1M/YGE2RiFWCitXbyFUPz02YUs7SkI8UnI+MVZCVChsemxQdyRYalJ5PF84aT8pZi1fQTchfGFpbXludmVuJTQ7eGozbCFyVD1eZGxqMGFndzxrMD4wKTMpCitoK3VtQVBwWlNyVWIxSWtReCklOSQkJDZPbV5RVDcqbUdaQXlLNyszI3p3VzZAJnt5KEBlOz8wPyRCbFIkVHhfazR5eVY/PHdLKFdjSG1zCitecSZMdk5LSSU7T0dmNkpMYnliejZzbD5AP1NRSGFEQUc2N2RRPlUtQWRoeGQ5IT0mPj5ZOFk5QWBmfVl+aWdHRjdxRD96KTY9UHlOR2BHCitaa0NQRG4pfGZzO1hPPWB4IShNVEVGLSlCcFclX2RHSlBBT1NWLUVhbH01fHFEMEpReCVUYXAmPF42QDs+S2VQRldCQilRNVl2YilpbFNLCitTYGRRaD92ekRATHVRUkg7XmVVbih3NShOOWIyQ3Y/NG9CZDNZWFYhT0kwWURZRGAkM2Q4SyR7fislO2A/VS19JCUrYX53VjdueURXK2VLCishV0J+UnlleDV6dysydzU+fEdIYGlfcXtnaHlHZSQhenRaTVNtR0BPaH5sVDF+MVUlckRAVT9eWDxGan1hTzdyN2ctKDdRTn1WNGxjTmY4CitePHJ2bTd1bWMhJGltKDUlPFR4SSgqU0E0bURSUHI8U0VIczEofXJ0dVRyKCV0Y2olJE1nMTQ4eDhDV20mVnV3diRMLTd4YVp3a2BzNWVTCisxOThjJEZ2dTFkNChoIT96IyZsV1ZNKkYrSklCelV4ZjR8MGZPIylrbyoycCsjIThgUXs8NmI4JmRxVGAzRiEtMHxYUVIwMDBPOF5PWTd5CituO2xpMHVtdTFCKWVpc3dDSUEyY2FBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZLQV9UYSVwcFBYPThJUGFDd3ppVGFWZn02bl5KCitkYyZRTTlnIy1xcyl1UUYweUtRJFdiPXV2UVFNSVpAa3gza0kkQkRESEdZcVp6LX1sKEQ5bTNvP0pjTH0lJkVMNnZIcUE+ZTZpUDU3TVQkCitqLSozWExPcXw/YSsma0BOblduclojbGdOSX14WDdfZXVfN1o+Vmo7PVZaTEdkb1cmTmFXSVpnTEdHOUZVRzZ6KzZaWl9pKUhaX1phfWlNCitsO0pMY0o5QSl+TlJ7PllYaW09Wm9HYV53O15TK3YjKnRrfEE8YVFiQSZ6REl4LTZVfVVUPS19OGJENzk5alh7UzN5Ozl+YShmU255cGlGCitjTn5PTikpeGt1Z0p6Pj5edEZEQHB3eWNzPVgqeypKP0coNDsqZnhSQHZrcllWSzUzRzc9MDExMkNFfUVHN0JfT0w5Z2tMOFlRZXp9SF8lCitxT0kyOWc0LVB5MXVacyNCckY/JkJVJG83eTdsTl54NytwaUFMfT9VeTJneUFYbkokd15pZHRNeyFrR3hFRTdUM2BufW9gTk9IMHotVXY+Cis9UiNONHBQJWBaSnc9MGx5LVZ2M2s2I1NafEJ0P3BJZ2M7Kkk9U21fKnVMem4+WElePSRSSm4qRTVNP3I/TH1laXRuYG88WTdLdG8qYVdiCisxZmxkeHtlaX03aUE4cVUjZk85VmtYZihrLVhaJEAjUVdrd1VLKmQ5cnxaJC1xZlZTT2lhd0I/bjZDemdoSFZxfG1HcEgzJWVqSmg4V0VQCitQVXN3UWohd3piWn1EKjRXN2hiOHVscTRWKnFHdEF9PH1aNG9aXnUkckJGYz53TUU1M0FQOzA5WiRHX1RsMilFNUxKeV9zfl5FIW01LVkkCispUW1gdy1jJGoqUk93KVpWSDwxQXApJTBWZUdLMVE9RnBwekRfdSFrbHFuMHhIX0B8MF5sMCklKmdwOWA9QjJ7XiF0d25JOSElJmU/TU5mCitRWV40PlU2ZjB0PHdJQlNVaFRrN3tVJnRMKWFmeTkhbFA3cT9NOXR1Y2whbXswU0JiViNHLX05ZWczfXBaNyV3WUoxemJnOTdFJFFgTDYjCitea1hMeUJyJXA9SG5nQTlnMmR8TjZYQT80MXIkclk3RjZgV3NYYktaKjQ8KTBlamMhKGZaeFhpYkoqQjghXik3djhFc0F+WHZUdHlzI1Z3CislUEZ4c0soTmd5fkR8SSpqNWA8SHszbnBAWWhKPXJ9eTFoOERXb0ROMXU2QDJIPDVQX1RFIUJGM1FTdjxjU3Z8YWptK3lYQnhTc2N4TWB9CityUGEoYHdeezdmTnR1TyFVaVk0TzZSc1Rveld2U0g8aHY/bnxASyRJRF9rZ3Q8RSRnMD1yREI5K3dxMUc2NztPYmIxakhOQlFaUEBYbkw7CitId354WCtjI1MreCFvUVNHJEFVbzBjKiNMLS1Ca00oWEx+QHQjeVJQSHJ7S19aR0IxQUIlXncoSnE5ZUclUzEpOG5HV3dVfEUleU9sUHVZCitqaEJfOyExTlNZOSpEQCFSKmltN2hSOEVZUEImWUgpLWI7e3VpVlBNRzEpdFMrU2tFNUVZJiRyWCt9eDxVPiY/UVZfTWk1PUlYfiQxWkR6CittXzlLKSptfXJmWUU1cis5ZUMoX25FMHVIYGZ2eGp7XmRgLUdkOylkUCE7fHBEQzs/RmVHKWN2RD50azNqbWJ9MWdNKFh7QzwtUnUlWXtxCitYT1BSVVdxQSNoRH1ZT0E5JFRMYDVvNWh+YVJBfGFCTFRvY0NPWko2X0tscmR9cUJFfFVQUTxVO1ZNeFYoI0kkTiMmaiZ6c2srNUcwXktaCitpP1VIKkhtV0tOZl5Sb0Z0TzRlQElBRjVWYSVYRHVROUZjKjBxdil1VGU1IUprWDw4UT5jeFclK0ZPK1k5NjNxQS1ENWxYP1RnWGlpblY1Cis8dWwtS0hpRzxOSCoxQHY1RDlGNy18dCRPdk8rIXMqPEs8QnZIV15VcHB0MCRwfGhwZVZPYWFeQVZjcWNlQlpLZ3kjQylkfnlueD18b0BQCitAcExqWitMdTRteE9hfCF7VVArVCU2KUdVMHJrVnxtX2wxeTFFPCZTJT4hKjl3RGtULWBiI3JQZjV3Zjh5R0dKNm0xKHZJNSZ4PDk0UFFCCislRV83KUJLR1YmVyt2WWwhYyt8OUklSHktYztxZlVyPUZEYnZZVHZRKi02Q0FDKCs9O2x3S3A9KHAtU35XTlV4PUImVkcxdzMyPjZLakE1CitiPThXJXw9MVorQkV5d1BqU0BsN3hwOFMkfWstM1U2YEYjKE5scTB4JH4oYUlwKCtrIXxMR24mOyRPWWJHOE1TVVZmNXo+N0RobEMtVEopCitjYjR5VGR6N3tKdVBsYF9hYG1MfXczPndAdXoreCZ2fUV1dF9CezFEIWtsKTxAIVNsYmc0Vz9GSjlCKkZoZyFLUlNEent7Y2AtMHxYUVIwCiswME84Xk9ZN3kzP19uPSN8SG9hRWZAZCpCPiheYmFBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZMUHliWDw9Kz5kU3h6ZmQ3VzVvCitaYD9LI3tfYkJmQyohYk1wSDcjVHFQUUJeNHtlJj48JHh4fCNiYGVtIytzNXdVZENFYzZ7Kz1ZaX5SU19ra3BFTHY3UEg4aTFrN35vRWdxCitNXkg2ZiVzTWJJeEc9QlpublJJdGpeO2UmP3N7OEJURHcmO35tOTUlQ0JiIyk0emA5VXYrVHlQcllOSnphK0FjUjtpeUhpbEgtITRHKT52Cit6NDxOPzJ6eCR5dkx1Sig7RXtsSUA7VUgkWjUpUXpJUzM4Q2xyNmBxfSk2PEVTSGB9KFViKjEwTmhuO2l9Nkk5cCR5MHNVSH0jY0ZTUU8yCitnYkpkWT18KHVPZ3Z5RFdtbFE2ZDQ9cUcwPVBeb3FFV3FHdno7e14kNXRWQHRqVEdsSSg9IU88SUNfJSU7JndkaHBIfU1MPkJhdzEkdF5OCis+UnoqdSNIdnIzM0VlRzdLXyZAeF92e0Z1X19ickpIezclJFRMK09IfTYlQWV0Qm50ZCVOQUNENnJNQVM9IUxKQUN+JUk+JDRNckVHO2xkCis0VTljTl5VdUU3b0t+U2M1PUhEPyV+ZnIlSGslKHJyNy1+SC0jTlZoYVB7XlF6V0xeX3BlZnRIPjxGTCE2JEFpMEoleDl4SipjYG1MV1NaCitXPnBQSFVnNWlFVXIxe3hEYShELVlzI2dZZjsoI0U0MCZVPWsyOEBFSFJSPigwRWxtcEYyYHpJYFJZIV47bVd0cHlPJCNvTHpzKkl5TC13CitzelJhKGpsQTZuNWcqcnNtP0FydHhpNUFeSThfdnwpViNJVmxwRGJPSGx6X1I0KEF0TmJAWjAheiNWYWJpVXMzO0NzeUpnRjdtbGchUVczCisqaGhjXylvX09MMDZRSjEoTm9sN0BySiVpNyUoK0Z0d0oxM1NJZS01IWdDVW8zKTw8eX1QdGdwNEhNbVZzX1R3MEFWa1ZPKXNuS14qbDNHCis/ZTk3RU4/fGtMOXBUNzRvT1d4cGNsWX12PmVSYXA9NDRua2xTPUw/Mzl8QHZZfHxzRCpjWDJAWkU9KWpTU01WNUp1MnwtJCUyZmV0TDh7CitkMUshKTFpZXxISF54cnA2TVQ4bW9QeGA0SGhfUWVsO1pCISQmQl82TF9TTkNEVk58cmZkantFVEdYakR4WXpNfjsqekQ+Mi1DNWxDbHZRCismVmQjT2RySy1jUns/V288VmhDLT1QQ1dgYWdobmplKUtiKk9IdH5+JXA8QG1UcjtPaT5yK3l4OEtNJEY0NHNVM3RaSCVEMDc3bjY0ZnsqCitEYWVYYipaNzJSK2VlR1VvS0pyRFAhPWlAUCoobENpZHp9M14/KkRGUl4tSzRzeXE9e0ZfWVBfNGd7Y2IyUEhpbztMTWFocmNfek40JlcrCis2WDktPiUpKjgqN3x4TDh0VihMbGU4fSNJfWxjN3thJTlyKX5VeDQmdWtXTjFlI0UwNmJGcFF7elFxQzEyQTheVTs0a2V0Nz5fcHl6ZTtoCis0c1Z4YSRzdHptOWdkbVFsRW11SmZNOSZnKTdmJERSOCNlNF5hfU9wT21jUT52N01GQF9oM3U4ZlBCc0dPTVIoJE11e1NTaSteUXtWJGUxCitvMGRAMjhxb0ApVEReJkJAZFRwRmg8dy03NXdgYnUpU0lpZSErRWkrQ2trbWlCRGxSLTRfYyZCcUxedEJIWHslcD1rUEo/TWpZYDZUdjJuCisqNU5vKDJAbG8zanhOcHBuOHhnM3xMV0hIbXlUaX1NKzNQfGE9R1hVVnUtIX1BIylsbmdRY3BtUCRsZEllUHAhU1JUPm42c0hSTT9VXiZyCitqZWJaZ3E8cSgoV3RlWTQ7e3o3I1ZYQFJ2aEU7UXctTDM/K05qO29HKVY/RkB6aFklYVdyTFB2ZlNfdDxNOTtSdUhySHNWd2pCK1hmO1A+Cis8fiR3RWE9RD49OTcxKGg4cyY8cz0/aHhoXjJfOWgmPVQ5fGJBfjYjRnlgSVlEMXZ6UF5GS2M+QUtVPD0lSTg7QlZ2WWRlWDBkZDJRMWhVCitVJlA5IztWVHJuP3pIRkdJdXghVytmbHJqZzlhMS0oVEwkanxNPj1OS0kjd2U4PEdYcGV8JUtVMTUpQXJ3VXVze0tfU3V4OTlOPF92SzlOCitDSmMqdm9BU310N1FwdUtgLXsmfU57RC01VnVEKCk8OGRgaV5Xal48a1hkSnphXmpxe298RDFEe3l5TVgpIUpwRD9DUlhgWWcoQkxvYT9ICitwQ1NhZEI2MlFFQFJDJEpaUktRLSs4R30+Q0pIQD5CWGtsQGc2Q1YrJDQxI1EwQG04KUNMQ3JAfF5mTUp6ZDdRT01Rb090YHluMjQ+ci1HCitucGQlQ3RGMCheWiEzRDEoPzRuaz9UTGBYM1c9MlhMRWlNQmxpUnU/UFJWaCZ0LT5eRko4TV5TNElDTiZ0UWwpalB6cHlJP0ooJndZfj9iCitMJkxVb19FfSRWaTtLOUhKK0U2Q0FiczMpfTE2ZUFeYVgqR05iZnRlKyNZeEFqb2BZe2pUc19OaEJIJjRyZEM5c3FnRVBFUTdIa29lRiVZCitHZEVzIzxyNFkmJGZJZjRHVFYzOCZnK1ZCWDMqckt4T1cleEV8RUBQMT5qP2NLU0xmP14kajdeWEVqPkd3UTdIdTh6JFVIT0lQUiQ0OTd8CistMy1yb3AleClkSWxLZns/R1U/OTlQMF8zSnZ6Y3FOMX5iPFVad0V1PjYqRFY9Sk5xeCg0YU1TbnlPO0MpNzFgKCl5QFA/XndWR1NFUXFeCitXU3xRfmo1XjhzbnclI0o7cVZxSyVHQ0o+KXhmOEhiJGpZfDJOZW1WYVJ6dFg4TVFnMnloMHRqdy04SkBtazNCSlZXb2ZsMGx9OyZne0tDCishWTE7Pmc3JDcoJi1QR1NBV0d0ZHFISCYhWGNRX1BJeGp9R0dAN1o+dzFvNjB4KUhPRGppaSlZbWhveTxZQ0A9biY9VmVuNG1OMCZOSTdgCitWKmh4R3tnVFdyOFhXWXRgTkQwdSkpaGdrbjE5MU1yQyhrJE0yX0oqTns5U0Itb0VAMlRHTnh9fjVYWFU7dnhyO351cnk/Z25MY2U3SVNsCisoWD8pX0VJTVI3a2tgZW5yRiVZZXpWei1iaz1DNUVvU2IqdDNVMDZtREExdkU0KjF4YzxGNjFDU1R8TncxZW1IaWB6S2ZTY2hyTCM/cV4hCitjclM/VXc/PVNmRj0pfHchZF5SMDxkZV8qdipMb1lPTEsjeWVgO3w1dD5VUnVSYEFqRGJqa3t6T318b3ZyPlE1R1RzVTRtV3ZjKEVGcFViCitFQE43KV94eWNpMkokdUBHSFYqJilYPit7eDdvMGMwdSNFbHlQKWg+QDZhV0FLMm10ZXk3RHRQRiNYYElRMDA4bTwwMDFLWjAwM31sYTQlCituV1dvfjN8YXhZX0hWYHliI1oqRnZRWilgN2phJCNfQVdwWFpYZDNCSUs0fSV+TyNka2dobzB1NWdPJkEoR2NrMTJ7SlMmTmNJZ1h7RHo3CitoWVJNcC0hV2Upc05pNGNlYVBzI1lUYmE/XzYlaUMwUnVQfXphZGM4XihOTyN0PHp0a34wTjNNZ1omaFVVO0Y5NXxPVGVtPW9LelUlO1o7CitzOzI1b3FWSWVMTDh0YG8lc1JZblk3XjFJNUlpX1kwMjFUJkU7fWlqTndIWmZPUTQoPmkxJEI2Wio1YGI0azNiQmUyVUclUDdhTlRRIVN3CitzQS05TFp+Wl9iWF5GPE5EM1daQWRYMmFmNkNlY2dJMFRtYzBaPlo9MVFZLU8wMDtve2xAPj55OWFqOXkwMDAxUzBSUjlpMDAwMVJYPmMhCitKYzRjbTRaKm5oVlZQan16VntkTUJhJkslZVZfez14V3BnaUlVdWtZPmJZRVhDYUN2PUBGPmVBZjQyQWRuaW5tPV5feUlfckRrYHhRMzkpCitwbHFRb2J4LVgpUmFxd3cjVzxUd05pblZpcWhQdFdjcGohP1NqcFYkTipReHRfS1BlRn1ReG8hLX4+I0oocl5GVGsmeClVd0omcTYqYkZtCishUjA2dVpXXkIybmhhNVMxT197cFJgQmJ6UzNNYHtRPGxUfGc5MTAqI241TDV1YT42VzJJbG9VLUMlJih4LWQ9emVQb2FMOChoZiYzY1pNCitkZlQqNUxqXyRpXk9TOGZMaCtXaSRpT2JGc29LMTtnVzY2eC10KW8tfVYmcG9GNlhIez9EZzRSUF8yNSQ+d2JTMFo+Wj0xUVktTzAwO297CitsQD4/QXJ3MEY5MXBvbGQ0RkNXdzAwMDFSWD5jIUpjNGNtNFoqbmhWVlBqfXpWe2RNQmEmSyVlVl97PXhXcGdpUFg+NFUqVl97PXhXaURgCitlb21YdmQrY3BzWD9xOSpWQTFZXnQ1X0RTITd6blQ9T0BJUHY0NVpuenE5X0RmSXpAfm5RWHVJIzl7U15WTV5YfUhDKStUNnVfKWdBXlcyCitkWk97PXRKNipwQmFSdWtjdSUxa0R1UnQ7LUtuYFRjUzMjSFJxPD9CK156PUZePHVDSCtZeEA2anszIShTKktHRFpzKj13aDEmaHg0bElwCisrcDA9dElBJnF9OGdmTDNiaTxgPWI5bW5NP3tPUyFOKkxYdmtDeEdUVWxsQXRCZTJIIXg+cXFZOVdVQ0pkaTk+Pmlrc15eUkAxdzlHMnpyCiswSzwwIVo2YUJHb3UoO1YhfD5aZ00/RWVPVV9QTl45UkZEdjB+e215VDR1RFR6e0RhMmt6Nnc/ZDkxV2B8Y04pZV9tWCh0KkMyT2EjMXI7CitxQXpmKzdfVCsoViNuWkY3O0J2OHRAam5JY3w4fStrJWFBJFEjMHcxakE8Yms8PDV0e2Z9QyMqa2N9PXNrT25KKit1UzwwbG1oTHkrISUlCitgXyQ/VDdKOEIzbmpXWWR5YGJ1NzEpKmxwOyVDWnRzUUNudHFPKWNjd1B5bnE0PGNHITc4Yy01VjZTTklxMztEbyFDK1hxfnJaQmkqaFJYCitzMEBZckpZVEBeVTxsbz13I2RMb2F4d0tgRSkhcyMtKlN6YXgjdWIyMUpmY2p3YG9rU1BAUW5HdTJCO0ZjeXt9d0NXYUo/UVYhOHExZE5VCituRlVjcyYxamI5VmRYYiRAPXBeTDdyVShoZGNlbEdeQSV5YT19ZllDemc/OE9UQjlhLWxkUmckYnEqRWJSZmJkTis3U3J5M2dkSDF4c0Q/CitaSTtudCEycl88KXprMiYpTT5gZHgtKm4hfHBuRUhYQ0NkdFMqOSV0UXx7cEY0LWVWbjYrcGJ1VyprN3I8NT8qLVgwT0hGWWBFRVZqOXNFCitOJXYxKDZIXiNWJngwfHxhfH1Zc0xSZ19CQkdSSUQ+SCloMmJWSjdiR0JfJFpJRlc3Nkd1cS1aU09PfTZfcTc3RkQtMEFWcVNRQ2ojKT98Cit9ZztyUVUpdG9VP3NaQ3dQe3B6RWpGZ3cxWjclfk4jKTxLOGAhV0daZ24wUlFnIXB7K15UUmdSaEtpJSo7MVh6UkpYaTBpeTtXWX4rOyZ3CitIU2FnSVNmbE9hdSZWPkBYbWFJUnNqNmNZaCpeP15ubV9xZU9vQmpoJEZRKGh+QlRxPFRtMDh9TCR6ajtsQWdsNClNJX1HRFExRXQofSZWCismPjslTXReMUljSW5kcG4wV3tOej9+VnBpaSVPWjc2OXBMa1hYcnNGVXw2Qy1kSDB8RGJMc0BHQS1zZUtQISg1aVh9VWltO3tFJSFURFhVCis+djt9Z2U2dVdZPjNfQDxgXj1sIyNAVX43JXAtNDJkXzhhU3xeIWFhN20pWG02NyM1aSZpfVZ3SlNwT1QwbW5Aaz8hZ0tAZmpIeTJZbmR1CiskanFTeSFYKWg+TDZRRF9FRTFxWGYkK0FzOWlYSEFAT3QxUD8xIzdVXzkpNj5HNFgtXlctUFpOWj9KJT49eT9TKU0/MTskPzRVMmcjVT9jCitzZkF7WF48VCh3WnZzcWZmYjBIcVUqZCpaSzcrVDZlUEIkeSMjPF5NRVRgcTdZVnJ7K3F1SW1aJnl5RWh+OVNfdipjeHZwPjlKVjlQMWlVCitfXmtzYmVoMjNXQWwrU1YrTmp+fDRzSFk+ZDRHey1vPkckd3VRNCEzYWFJVHByanojUEItc1coRzswU3lkU3Z5anY8LXN4JCV3eXVVYXZKCispQD1iQDl1JDhUKmxhXn4tTkJPcCV0YER0JVBLbW0hVD5edkReRVlLMUhnd09ZZTJEaXd2JU1NbXxjLUklOVR1ZztVZD88OU4wanpTX0Q0Cis7PFpNcTE/ZmVffkgwZ3Vpbm42PlNndCFjM0d1I1JLKkNKSU87aWpxVz1CMjszTT10QGlwR0h7NG9TV2ktZTA/RkYyYWZea0JreCo4eDs4CitOdFprPiRlcXVBS0kpRjRWRV5IeV9Hb3ZmWWhTMG1jSmdraFNjZWteWjs8fFNpemZpaj9TfEtgY31GdE48X2l+V3ZnWSFjanxhZXV4WF4+CiszY3VpbVgwVUNlUmBRTXoxcl8ofDQhITV8U2kydComKFJGNTNNKTc3OGV9VyhVKFVWOCMpXnN8KF48P1RWPjtCP05EcnwrUG9hPUdne1FkCitTaV8xVTs3UTdHX2RNfUtiI2BrcEk0Ym1yWUpDV1FJentqMmYraVpZQ2dWKUZAaSU8alMqJUpEWilPOUtRSDAwMDA4MFB+ZD1ON0lQTFJICitndnswTD1wYzA0QExrMEJ+dD1GSkU/TFplKHdBRkpvYjJYa313PlpnZ15RWSVnUEJWYHliX0ZMR3NNWD4ocz1WUGp9ekVedjh1USUhSCVGCitidXU+UzglITFQRSMtSWg4em0/dzk4SiNGa29qdnZGS1dARUNtd05IdmZMNHF4ZlQ2YmcqZGh5fmh2Slo0NW1xKWdJez5RN04kZkF3JlhXCistKXlxTTdleS1vcVkyNk9JRU0za1E0fEpTcGdgS0dnaVlgIW0xTEBpMHtFO310RGgoOGZgfEtoMlRrWT9uKUtjfU9EN0h1NVpna2hsT35FCit4K3JaNjI9X2MjUWlPMjxkQVg2YHNSbUF9NTZGZj89d0BuTj1IVSF2fjVVYmJPNFl2WGBgamxWfF91dSZPYitfR0MjVmt3TjN1PlVRO21kCitadC1jfDdWWTtlYm8oPCM5KEcmWChMT14wUkp6aEZhTD80VGg3UU9iSHROfGd5K3lXIVRvcFk8Wm5UNnxvWFRvZG1aRE58bllebCRlZ3VACis7fn1DVGZ+Zkh9SXoyNWpUSnoyT0JYeEpfVjA2SnMhSWNiY3MmPk1SaiNMQyZeO2ZoKGVjZSQ7bT84JiY5ZU1jY2t7PXl7eFhNej5qbTE8CisjKXxHKXRHIzIpU3pTMWY1JFpHWDMlbShqWUF5PTsqNyhhX3lnU21CZVdyJkE9Vz5HYmBHZFJOc3ojTCg5KTBJPng0REBQNitSb3g+MkxpCitOOCtGNShgQnBXaCNIZkhKQyFBQldwIT1kU0JtQyt7PTRXSSQwb1VYfDlIbEswOG1RPDFRWS1PMDA7b3tsQD49WU4yajh2MDAwMnQwMDAwCitXMDAwMVJYPmMhSmM0Y200WipuaFZaKXxVSlZRcGJBVXRlaSVYPj95LUVedjhHajZEbSZLb0NVeGB4T2ZvWTJwI1IrQ3BQUU1Ra0VpaEM/CitASUBwMnBYUDleYHxfeXR6T0psQE8qYV8pTWVPQX0kcy1wMG15U1grcT5kemZZdXFoVjFsIUhqY2Zadm55NDM0T3A2MHdVfS1kOWcxR3NMCis3I0x3UXZpWEpWbW1PMkFBNTdDQmxvT2FLPXh7SkhOOF5mcXZTR1d3PjN+KD1+LU1fSEhRb08jO2lHOH5IKXJPbjtPNGZEVXxvQSpISjdqCit1TUR7Umx5OUJPZEQreXJKaGhyMHxYUVIwMDBPOF5PWTd5bSFwRjFHeT96dDAwe3M5OH5efFNhQXxOYVV2XzB+V04mZ1dWe2RHNGEkIypACitGSlckVFgpYlZpd1V5Q3crQmcpM0BCSXtLJGMxNF9pNEFUdSU/PW1GeEN0cU40dkApcWJ+XyVgOTYrcys4QSl1eStwaT0kNz43fTNiRnNiCit2T1B+SXVxdkshRjF3e0dvITBDRDs7VnglSFpVfT4wIWV4ZEI9ejR5eTFCM1l4ZGhlcio+Oyp6YlEpQnwkQVBgfFppc0gjVWg4NH1RPEc4CitOdEVIK2ZZSGVjPkRnZiVrY001MklqRzlOKkBBKUtUVklpJmVnYjs9eGVvSDl3LVRKPlooSChpUXZEST1OYUlDSTJuKmhzbSV6UHY9JWQ3Cit7N1E0d3NhNGE9eU9RdHhGdkBMNk1SakNPVzd8IUhMdmxlUV5Ld2RjRDZ+WEY4OHdUSGpxfjVSWiROY2NuJTtPSSg/MzV9N0FES2hlfiEqCiswbHJiO1ZBYzxmZSFaJGd5YVFOQDl0Sj4ofkpuVUckdkBJKlZEe0B7S1FuMlN7Km5eRDVFay1uZ1gqYHlJNklKXnxRKTNGdFNDVTQzQE5yCitlIy1TalNITjs8aElORWdVcXc3b3hvTnRJYClaKG17dnB7TykjfXpMaTdlOTxaNmpgLTRIbzV+QX4hdnp7aStmc1QmcT1JPjdJKzZwRCo+Cit7PnIwQCVmMEVmKjEoX35pQld4VW4hfENKWEV6Jl9Ie1hDc0xoT147WSlLUjQjZ3dkQ2BOUWFnNT52VWMhcFprNnI0IUBUbGpRbyNBKj9jCit6NStlWUMlXiVXOUgpbjAzdy1ANVUlYkpmX2MoSGdHKW00UXAhVz1NRDxRalctKVlSNiV9WXhDezRebGpzPWFqTU5JIX5kJU0oeTAwMWJJCishNGw0OTJSRUMlKT1LJm9me2E0e0xAfnomR0cjN1JRcjE9bztgWDkqP0p3SFA5PlBjISp6eDNKa2FwWntvPSFKT3YqTmhgeG9CU0JqNFlKCitsPjhMYVVFUWg+Q1dSdDllaT5PeHEhdDYpeVlSViFpckZ5OXBETUc0OChyNyVlbG01OC1ERGkqezNfVExtXioqK0BMQlNWTjFmNzlUUXxjCit5MThBTFN8I3pIQ2oyTF8wOypPO3cqaF95T3MkVEpaVXVeMzhLT1klYmRIQyhqSE4oT2Z3RVNiRGUkMkp4Pmw5cVYrQm1EaiswOzIzQHsrCisrRlBpfVpuKmpvdzBSbyE9MC1GSD5uKmpvdzBSbyE9MC1GSlh8Sk1NJVhMRXE+Kih+NkRIVl5vbyU+PSRAYkFqKktZflh0fkFOWEZ+Mnk9CitQSlVYRnM5OSRmfTdKO1R4Y3Y2QEJWbGotYX05RzUtYXNfO29UKSkld3FJUW5RJlpgSGtlSmFDfXBYeHA3Yik3eEBQRChBSDVaYUt4Pl59Cis+c2J0bVhVKlApaD5ANmFXQUsybXRleTdEeFZaeEdkdWQwMDFyfDAwMUtaMDAzfWxhNCVuV1dvfjN8YXhZX1ZZO1NVNVpEQjhBWmdYakxaCisrQl5LR2NxbzRkOTdNKVpgKEskeys/Z0sra0I5bVE7ZldQSTNQV3ZhMiMpJlpKR2l9aWQtKVoxVnlHfVpEbXFSUWNabihgYD5TZHEkRy14Cis3Mm48JkQ1OTV7aGNtLXhoQ3swUldYNmspJGV2ZTx7SzhxSFJ0WTJUNlFPZHRBdHkpMnIoPCR7ZHFHWVFYTChYZU83YmtGT3d4ISpPM0JzCitiWTxfKF5DKEE2UzxHcE5NYUd7OHgpc0BgSD5YT1U3eWB8dTVHRVNKeGg8IVNSPnp9eSpHYHU9YihyQFBLUiY4PjRzUSp+Q215OVZZKXxLCitYYyNfciVZIWl5UXR4ekphaCFzJHNSNG1YUUQtYG1AKFU/JHw2R2NhXiVVeSkxXyMrODEwd255T0NOWlBUJjUkR0BJNT03JTlSJSNQVUMxCit8bzk4RkBpZkRIdkhMR0VxdntjTSVDUHl4IztQbENUOWFQc2lxJjIyQXJyTzdJayktOzFPdXMwakpmdVFYS19Id1hnIzdoZyh9U09ebHpHCitGXzJHIXVeN21ZN34ocVJUK0U2TStzMl4hZHhWUkdEUWwoZXs5SC0zejkkeDVERT48bz1RYlFDIzVpYTAtfW9PeFVII0xAZFhLOU01YnNzCiszTF41ZCUzdmdqJnd9UmtJWjw+JDZlcWtDOGYoVmNjUGIhS0J4Nnp+RUNuTENXQEV0T0lBZldMPDUxRmszNHEkb01NVG17KlNkPG9lRkUtCiswPEBCJiozbzJ2Xj4+dzFSSGZufDUhTmBTeGQrLVkqeDF0Z3pPMDVWPileTiN9NG8+WVFKWkQ2JFhmPCNaTEtFaDN0JUJCIzxHN05WUlB3Cislbkg1JnB0WDxYUUl5blV0JDJkXkRRO35XPClRPjt8ajlAYWBYYUFxUDVrZkp9NzFMV0g/SG5MaShyV1dTWTlseXRIPXFKfFl5MiRBb0I4Cit0U1I9ZTs2PXA4V19UMm9NWVlCNFBlQSRRT3VWUio+b1M/SWxUOWkyKDlaTGtMTktEPUUtRzhhYHAlKFYkNTRBTXk+elQ5aXVKJHBvc1pqCitmSiMrcGJGJFVRQHFNVSRtMzxuZlprdzUzTTdfb2lsR3RsNEYyOEJWTVlXVXIraSZOTUdBd2pOMmpNPkFId2tNKzFKSXQtOzU0TTtYYHV4Cit1aiUxR0E0aWFvaDkqRUBDM3NHNXQ9OzRqPy15bGl7bjY7M1pmOUgyOX0jX3c7QlFDYSpCP2lKdEI/KSlDJj1lU0pBMXA0M2pDViFeJV4zCit2d2ArMXR1cCZoIS0xYSZ0VlhtcDlZVnZjRU9XSTFGeURyVGAjPkU8PHchd05sSHN5aTxkRj5xKVYkXjAtSHZ5YWg8Y2dPJCgxSD9lMCs8CitRS1NLP0hIR2Y5fnZpPFZkcGJrWShfTnBGUE8wfm4qZWMxS0NVYXd0em85I2cpd0JeWEFpSkM7SiR6YyNZPGRFITtuSTt0byVZRFZITGVsCitmSEw2KXdrXmR0QD5wMGFKbDFNQXYxR21DdSFLUkZUPWktVGRaYjBKS0ZJJUQhaVV2O01kX25kOVkzPEo7Uj42RWVtcUttbCRScmBsKXpzCiskJmVVV0lhfVFMWngtfS16fXpedDEyLSluPXdVZ2RnYG9mOEN+aTBucTlyQEhRZGhDSUwpflA3N3FBaE49bWdGVFJvM3olfjFCcl4+bVM/CiswSzZvK0NyU0ImWTloQlFqdXswT05UM0dyKzYkdFZqa1d0Mk5fKyUkSiQ0PzRCWD5rdGt9PEZ+b2xPRzFaRyhjVj02TUJLV2g0WiUkPWFyCitibX0kfjBoXmBffE1XfHtke19hRmNhY1c+Q21CY0kjWn4+TE8pWVhBZXhgNDJnJU96UTJVNVBPTCUpKTYlKiUpYihPYyFtT25rUSVebVA9CitTIV56c0Z6TVphO0ZmZkFYTnJPclRKPEc0fTRxR1dycCs5Q2x8JUxMa1ZoYkMqKFhVZD9XO0BjLSQxTC09NVlaVCtgKDVfUlkwSW9wU3Z4CitYSWBXSTQ3dXl1Yi1mQF9LSFFKWDBISlh9Pmo0Tz0qSG80I3QyOHBjenpSLSYwRG9fUztKJG87NmRqYXl6eG40WXBuNlRPN29xK2hrc0s9CitNX01sUEBoOEhxKyg1UWFnbV81VTJXJT9IUkFXeUw7VGZFX1Z7TGdKSEx5a1M2NjJ3dj4wUDtPJDtNUFdFMmhQcDVJKSlkdz1JQk80R01qCitvd3lZayNKSVRwSH4/X3s+RWAzflk3b0dQezg8ZCNlVD5ocXJuMyhZIWN1UVpzLTE7LUoqMG0jenUyd35GTmJ2Qi1PVDZMK3FMIVVBXms3CismdEUqNDwrWDJrYFZlZGNCaG4pWEJBSllDZmVLKV9wbntFZk4weigrSEZWbGUjO00qYlhgfWRjMzB9ZW4wellJP3ZCdFM9Zk5hRzRndHd8CitCanxNM2NLQjMqU35NRld4eVYhYF96a3UrZmp2OSFkRlhvZnc1YTdKV0RKWT5APUxIaik0NXo3KjU1WUVjJWg9QCFaZ2hQUUh1ezB9Um59Cis7dWhWMGEkVnNaQ0cla1l1T1lyMWpnaSQ8eTltbzN5VDluPl84SStOQVk2d2FFaCp0V0RQWVImREF5enFLfUw/UVUpSTBFVE9tI18oI0IyCitRV35adzY8VEh4KUl6fm85eUpaWW0tcVEoJTRwO2BlXmV5YFRBPjltcWFAdl8wKjw1TzZgYyZTRFNoWHdqKkEqSHVjYkxOMzdvMylLOSkwCis1eGNkaWhsKUY1XzAqO3dWKWxhbDtXeE9yZyRqMiZ1QnpKQmNLZDZhU1pgbHpjMEIrVUx2dmY1YU1fY3NOe0IrIS0+WVcha00zZEVSLXQ4CitIJTlZYz9TMm9zN2RDdmZLZCNuI3xFNjFDcyFgKnJoQVU2ND8tdyVVejVSdmRHOG82ISkwYDd9aWhDOTNDPH4tVUY3YCstOXVtNSpfPXw7CitZSExmIXEmSip3ITw7JmIqTHd+WmliJnh5U1FEU01jdUgrfjcqPXUtdH18MnVHY1NuYzBuXkpuZVNyLTs+WXExa2NQUHxpdUFaKXtvJHNnCitHfXU+UE9uJU5vJUhKRT5uKmBjIzZKRzZyUDlNeWA2TFRJOXxmZTZRVXFPRkhZSnFsP1pUeUdDV3QpNU14OytFYlFlYk1qeTdYOEgqN3FHCishWmFITStUYCF0K0U7cUdyfEtpI0l4WEtBO1ZFeXltbFh+QHNJdW5odDRUOHpJRG1zPXJtbDM5SmpyVXp+fCllXytxQ05lJFdiTUFwVz5SCitIYUV0I2Y/XkVRTT4kQUFfS2NeamBaI3ZpYlR6c2FQcnhvYl8+UnJmJnw8WWw9JG9lfCtkVTF9YTFZeTwtYUE2ZWJTcmBNNEJqdDtFIUx+CitEJFl9XlU2QlotWCFnKzxPemQlQ2hzIUVQRSgraC1naDYyWHNuRkBuOWZrJnY5UmhDbk9Wak97KUoheX1QenkxMSp4Y2pjUSYwaFNLZ3ZaCitmUHQ/emZ7NnwrNU8rZz89ZnRQMndtYDBzcjE7e1ZIc2I8aD1SKl5aVUlCY1RodjNwNzJTVUEmNWYoZWY4KF5WVXM9aElfcT8+TChLKGkyCitKVlNLJS02Kj9CME9YR1g4T0N6ZHZ7fjd3aEEtTmtgKkJWP0EhdzFDPzYrO2l6QkVMTnt7OVhaP2Nxa1opb2RvY2NzfChtdFQ9UEZgaDljCishMnM1SVhFeSMtZ0A1Umk1Sj9jQyEtPmZHP3VCTEg3bWdfezEqM2BGYFhlazM9V1pKalEpPVVWNkQrX19OJiNVOzQ7JSs+PCZydEJ6YXljCisrR18lS08tM2NJUklEdzMkYEYkKVRNUTkyUFpZRSNFa2pzY2JiUWs2bFBNXmJNTVRjdz99RVJ1aHxKJiR4RFJzKk5wa0A9KmczYmZlbmV5Citna2lRMzB1bWNqRDlJe2JGZl4mUFBaKVNKe1hoKFIxX0opVzA/dkRyUyVWVGU+WUBDd0N1Y2NIVzRtMT5fP2tiMjRPPlpaK3JMUXJjSl52Cis0VmpxUkBWTmA5dFE5LStlUFRrSFRIZG4kVy1mdiYtO2o+Zk90RShoPjR0ZmVEUEJIbmBqYFRYaiZSbVdXfWV0UHAkSEBvKj9manE8eS1zCit+OX4oQGVwdHJ3NEBxIShOSi1QWlhTQ2dYK2xpO1QkKE93ZjJJdTBOVlZyKEVuIXpLaHlNU29fSDIpdC04byg5Z219dkV2dHV7Z0JxKTwwCis+QDY1VyFEbSV0aUFzTFApaD5ANmFXQUsybXRleTdEdyk0JWY8PTwwMDJEKDAwMUhZMDAzfWxhNCVuV1dvfjN8YXhZX1ZZO1NVNVpEQjhJCitaZlNJQlZRZ3UwV2lEYGVqWntyPCtifDVoYCZTVXlwKkR+alRYUCVXITxKPihoTXxgaCtoSDk3d1dlYk1pZXltb3ZpJG98QHxXeSVPJGBMCitHYDBAQmlLSTt1Xk9taVordU57MGRURFYkaF8jKChESmkqUHxjazNLSi1oRzFnXit0KS1BfUlOVStUc2M8QjdGYjQrMX1vNXBeXiZvTD4/CitNTDR1ciRNKGhWbmp2UG57cklZMko3bUNoV2NVZikzUHtsS1BzXlY2Rz5CciF+NVhJKkpwMlpoaGZ5VGotfXFSR0xCQnNyMzM4WjRqOWloCitTcFo5bWAjNUdfdlFqUCFeZCVpNF9vOWJVVUZgbiFRaGVwTk0xe1FPeG92dmRAKVR4PlU1ejFYbUdZU01YJT9BMCRgWWF4b3M5QmlaIXRvCis/PnhORXBuKylPSUR6YjN3OTg/PGxpYSVIM0UpTUo8OUslcD9ecTdVZTZEcVRIRiNETzBOUVZweTFPZy1raF49bCY8IXVVfGZ2Xmc3JV5RCitSbzJ6dEVBdUU2JSpWUWRgNnZnYikydTtTQEV1S2ImS0JkeyFIWjAyaWk8RmNeUTRDe1pvcCg4cCpYfmdTV2FhSChaR0M4d2prYClARGt4CitwRWlWKTlWJFBCLTZYdipBNVJSNy1OajI2O1dTLWJ7TXBvdXRUOEVVNTYzckdOZ1l5MElkLTBZUzxsQWVDdEhqP1UmJndCYCZ1cTU1RDAmCitJZDVCJEZYLVJ6PzFAbCN3ZFNfdEdhc2Q+VVBGdDRNdygwfDcrLWZzN0lkOWt4am1nNGkzOz4pSDdvaz9vQU9YaGAmV3d+Tn1uLSlKZFBQCit3ZzN0SUN9fXJxTFl8YFZLfE1vO2Z4Y0xKWG02TiV0VzxnP35ePjB8WFFSMDAwTzheT1k3eXYjRmtNRjlpU3EwVGNpTDlSTDZUYUF8TmFVCit2XzB+V04mZ1dWe2RHNGEkIypARkwhQmZHY3FvNGRDZ2FDWj0qJkt7X2JDfk5efl9gM0NoZDJzUUtWSFBVRmdGTjUtZSpiVUdtbkwhaWExCit3WSRYZVJzSFhzV2ljIV5raDR5ZWlYdG5fSm9DIVQ/Q2RFUygpRV9iRk9lWEIoOXshPW15IXBNaTNHT2ZeOERoO0NiIU5WeGpHdnJVZERrCitXdUA1TitpKk51azg0cEtPWEdGcHswbFV7YkJfWDNMdldlNUIkSDkoeiZmOyROY3xtVC0qfk51PzhPYFZVJVZuPTgqIUg/ZEBRR0p6JF5gCitNbmJgM25JPFZ3ezBqeXM4JCV3eVhMXiNXaXkyI298dWc0JHs8THk2Zj5hZTZuSW1+SEElU2ViKTJBSiYyeDEwaCh2JW1qPVdxcyRgWDlHCitBYkMqTDhiU25uRiUtS24hV2hYI3h2KTZRdUAoQjtJTm5jO3VzZHQ8YUVneE5oQGh4biZTcSMxU20+TWFEMyp6VXhPR0lgS0ZnUFp5KGtGCitQOXc3WDdmQUx5PnMxbWJCYmQ2aU5gcllycHwwS2EtSEZQR0A4MSVwWVFLU2I5WCR3cEJiaDBBe3pPZW9TZzhTT3lYM2tePVdFSEhkMEgzCis4Xih8WCsob2xyT1FMKj9sVkliLS17SGhrZXdvJCpkemRqISooMnEjaC11bWkrPzA5YWgkKH02WVFsMWNwRWFOeDlxND0tT2VYR3BHK1o/CitKQFgzM05TSl9IUXdmT3QzezRhb3p4R3R1fGJxeCtsc0hJOWkzXjBFdz1eR3ljdE1rdzdsTWxxRyQ7d0JudntsO2RGSU1nS2AyYnc8PnVKCis7a19aWTF6djs/PDdjNnFmSWJpR2ZTS3EmVFV3XlJ0YStOYUx0MngkLUc7OUY/MTlQO1lubjV4UiUtJDZKY2M8YF9qTEEzKDVyMlFBTDZxCisyaDtUVzIyJSpkQlhQamkqPDBTeDklWDxXeU9GWVk9OUBCfkVYXmhyI3IyR09Bb0ZoSm9XVmZiPSNDTHR4YEhxfEpgRGZadFIwUDd1bmFzCis8P3tAVnpmXk5iM2YhWiF3bV96b3l7Z2lgMGNaQktsVD02cjx4PDl1MSUzemR+TiFGR2BNPXhidypjKmJ9S3FFekk9cVcjST5pbUpGeHBXCitOZWExSENmMW80OzxAQWIwQCRELXdocntXPlcrLUNIfn5BbWJUMVFueCEyK0s2N08+SSRaVTAkY3t9KCRXanxsK3w4PlRXQDAmJTg+KlExCitTRz8wKSV2KjBAXm5MR31pI2t7NEBtNFolM3FrUDBtPCRzc1QpI2lGI0tMcmQkKXdUejwoPkIxNlRFUEJNTSZ4JFVLMyl4NkpIVDdIYWQxCis9RXNGc2d0Y2l0NiNlbDQtcD8mOS1oakVJZzYmQDhiJF5MXmtsKz5VdSktKFFxdk9ZTiRMRy1nKSVpcDVBJHQ1OTFlWjU1fFFKUzZmWDwxCitCMm80UlR9V3NNNmkhUEpLWT97O1VmY04oWDt0VC0rPkpydGl6XllWN0EtV1BJRkZzJDg2c2FZI2YyNiolVUVXYGZYPUZmVjtVKjgpbVhECit4eEBqdX1pVHlFQ3VXQDxoTDdnUEFJRUwmcER9UzlufW1FYTtIZyVmQCtjQ3tub0lySDkzNFBZX2JHJmhANzl2aXlQKSo2WEFgSDQ1clJsCisyNV9Pc2MzdFl5Q2gpY2ZVcjAmZyZEeHFaSWxMQCNWcjtFOXZ5eE1aZ31ePD9yNTY0Znh2PSF1QCFpeGpySWdnT1E0OVl5aEs7O2heKlB9CitfcWorbXU+Jkl9fTJNbiF1YlVATEY8JVV9bUs4T1N6fE1kb1MkfGQ/ODxhMj9QeVMwfG1JcSstK1NSOEVTcTA1WlFGMiZzYldQfEojZUF5Cit4VVpmVmBwZW4jczNxQXNaa3ElUmBFUmJGXlo5NlBtODEwdkxFWl4kMVRARVJJYHBeWD0xSyVkPEM4RCVKWGctZiVReUo0e3FrUkYyMV4lCitrOHtKaERhUDNILXQ4I3lfK2lvSnFxJFVPOypNOG19QysxWXFMUyFeQE4xRyhTNippUko7P2toOSVYKSUtc2t0e1QmUl5eeSFhSzM0MG5aCitVMCNQZSFvaShpMyowNVBrSEBMaVN1bE9PbkdUVENaI007ZVBvZWVlMz1hWFJEMlE+WjUma2BVVlhjJm1LO05Kez5TeVBZciYzJEhyN1ROCitARENNOChAODZMOVllQHA/YnxqU25mWHBzMERKIWVQKWg+QDZhV0FLMm10ZXk3RHRxX0NtfH5aMDAza2IwMDE4VjAwM31sYTQlbldXb34zCit8YXhZX1ZZO1NVNVpEQjhXWD5OMzdhJjBiZmRGQHdRa0o+bUNlJjwmbDMyNnNmQ1c0dTZ3XzFyeDNgM3tXb3glemp3ZXU4KCM2VmhPQmdaCitNanN5fXt4T0phdz5LKTE4bmh2Znd5YH1vfWFvekc0a2BnRlp6QG5YczAxMD99cDFfYSYqakFPS2dpKzFQSWdSOTlrVCVQeEZrUn1MbDkzCitxbVM3OTxHNC1FRHNgb0Q1KGRXOH5INWpJT3xnYyh0YUMhekx6fDdxd2NnNHIqU0FBdG0wajdVQ2REOzhSVGM2alJvcXZvOSMqJkVJUHZlCitwaCRCe3ZZRE0zdkRDYzQ/eEtzQ0V0dChnUTFjeWwteiZsNGZYbl5sRTtIPChERXhLZjklfjFoU1EjcWVedjZzO089aHBOdl4tbj5eKjR4Cistd3AmaTthaU57SyE+QzgkS0Qre0tOMGp9eUE1QFM7dVVjOCRYallPMyZPN3BNcEZ7JGwqWUY9QDIzP3otLXcrdmVHWDQtX09DPmhacE5lCitnO2tEV1AjJnY3VlNldUp2cmlpVklUJEklYSZCNkMkNV84e2dCblp6PGxKWH0tJmxlZyZpbjtLbVBTdnxYeWlaOSZGYDklN0EjIzxAPVpNCit7c0ljO2MjJEBGQDNLVyUhTzlfSzhjcjVxKSQkcG1wZjVOaz1wQHpBVng/OVZBZiFuPlo3IVg3PURhO18oWkokaXtlKHAqdFZNSipPaVkqCitzTkM7d2Q5bTYhNms9MXV2bFVJLWU9b2JufFYmdyphU1RyX0xyI3dGdGltUGBiK3x5TXx0V2B4YWdgRTN+clFHQW9TPyFrKXEyY1BQelJmCitOQjtZR28qc1gqbn5gcEZkWlNyeDxnOEtWbjZPY3JCPGtzKEBAJm9sNkxOMG1jbHJlTCo9dDIqaGNgbmAhMndlZnJeMENnY1ZWJl9kfWUzCisrKmQ1ZnBNeGJFVkFZND10TyZ5QDFsT1duX3dVX3ViQHh9R05GWDBzNl9CVEdEajxnXlMzc2VxdkkwKCoqc1c4SUgpcktYRHEhTDNNfms2CitNbmApQEJEYVhNST15KW5pOzFZbUMzd3pxQlYobzxSRWxyKC1NKms1PkQ4PWR8XnBaKVVWNkNGKCM5YmIjO0I4ajZqcHY/UyFASyhpPDhpCitLR0NpNlJCRGxWT3o9Tm8jak53RGQlPlk2NG9rMH4pVig1aEN0KzQ/YVRqb0l1KW58e2c/JUtrS2FiN09WNUxaTiFJMnNsUGBsUiF1KmkoCis+SntLP3d3K3ghZFFuQVZFPmYrOUhoWjxtY0s0XnRjdzZYOTY5KSt1TW9XYHdUQyQ3bUc5aDtMZS10QndIP19NTDh7M0VFQTZiUEZ+RFA/Cis5Xn0xUnpONVI7Zk51XkBmSjd9alVKTilARm1LM2kqfT1PTGJFQk1WMHkpS3R5dzNScWNNLVk+RkRhVHw3REUyWFBBUkQzKD4tPERTUXhwCitOZlUwJHtAOC07cD12KSo0aEwmJDtHWmsmY3Ywa0F5QmFwfldDa2B1O2p3dll3UlVgRFE+R3dBNWZLeHU7VX10Uk8kfUV4TGYhVkVEJVBQCis1JCYjaXhmKUp5Qz5HIXc8cWRwVmgzVzxQM2tKN21zWTdkQGVxSH5tcThDdH1JTlVaTlFibTFEKGooTjs3LUluNXQ3NSElMFpnZzZtPWNlCitCPG5aK2olcT9NOFlrampJa3N+S1c0Xj43KThyc3FOazV5cy0wQXo4NWBDJXtadUQ/Q2RiQHU2VDJSczxucTVleih1fDNVJiZGQzYpeTxhCit4aT44QiVZcCUmUkhxeD1pVFd5O2U1LXhJWTlKIW0wdFBTM2NWWkIwJm1XQGt2I0JHNzEjPT5oPnJjP3p3ZX1Lc29oUThefHJDIWt0JjtRCitXWnolS3BZd1h7bjJRQS00SzElWlhPZHV3TVQ/NHBCRiNkWFAmbk9oPFN8aFpjaHBPZDxpb2drZ3JMSm9aZzhJMkktQGV1VCRSN0skTyRkCis4Sng5QkZ8QDRrP01AKGNCWDMjRjFxJFM2aUYmYzxaJmU3d1AoMmtFYz43Y3d5RHkqZWJMX2FGX01ibzxnZDNhMEh0SVNpMnRfRHpHPl96CitRIUJXc14/JDktazMzXlZsbWlCKUZSaFB9fEN1JiNvenMxSlNOSHp7M299V1R7Qyh6OXZudGg1OG9gfmZ+aVJkM2lxYnYxNElhTEpaZTNJCit+KD1ieGA/WXwrOGFIPSl3aVREODljUCloPkA2YVdBSzJtdGV5N0Rzfl9kLXEpZDAwMmItMDAxOFYwMDN9bGE0JW5XV29+M3xheFl8UWI5Cis4S0pWbFE3YFg+TXRCVXRjYjhkNCpCSVpvKTdPejJfP3xhaUU8PjEhI3c8NXw/I01McWFmN3dyZHF5eDZSZmptMXtRbWA/O2t8Kz9HUlB6CitkUyFiQ25LMkxPKDFvZHV8KV8rJkxAdUBxREU+MmshI0xtaWp1KkxlMyh5WF5ORE5eQEx7WXpMIyNoZDY5e2M+UW5XMip6eig9WGNzcTBICitFV3xHN0E1OTFeP3IxYTNNbGNER0t1YlQlV0RaQW1rYDt0bHF2Y0wzTXVoYiRUNWpUSHokWFQ2R2w7Z0V7Y2lSMnpUZldSNGl1ZztiPm9QCitrYXohRD1sfWVJdHEqaHVhMmBwZWQ0ZCVnWXRXO1gqd3VOV1lhJUIkN1E7SlB6IX4yVztQPVR5UVNWfVJTRktKRyR6RG1RO1g+K1dxUzgtCitEekRlVEsoKSEhX005RUM3fmhJQ1F1NVVpOCYjNyFAQ0Y+cTd0NFo2WFE0LVVHT1ZHZD1GZE0jR0BKckpnakdDI2NkeVFOYG1fK0xePXMyCitTSFR7cHpWZz41aVpoSztDSE1FR3BIeGtzbiFII3w7WVBiJnEqVFZzKHY0O3QhLWlYVzRhIytrdCN2e1FeKSswfFhRUjAwME84Xk9ZN3l4Cit4endmUGJ2VGEpU2R0VTlSTDZUYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSVZ7ZEo2VlJTQlZkRl8yJGQpcWomO0NwQHJqeXlTezlHUXVvCituWjleT3lfMHNGWTQ0PXRvWT84XkomczNCaTxIZWFNWEd0UnFzaXZLWihSVG8wNnxHZlBrKCE2enZHOFE1YGpYWXMhJXIreiNYeC15Qy1ICit2b2FXYnVxTihTNVUqUnRnYntfMUFxaGglIyk5YWdCMVY8eHJATVFuIzl7bHIxQGs1JE5EeyZWNmt9Z0FOX0E7RiVkNm1TWEU8fUJraH1XCit6N3JwVSF2RnxZNVZHNyZGfENYYl4haDJQKnFRaT0lMSVqK198WVUlPk1VNilDK05iKHdDb2g2QlFkMikzOD5nK2hJLWA2Nl9We3ZyKT5pCitvXmd3e09vKy08O3UoKEMpIyFFRVp4cW9pfXc7Q2V4YCU3dDVsQT0ydW1iSEZZeE8/KytmeC0tfTlwRGlpZ29UMj02VGp7az51Tm0mN1koCis9P3dLN2YmdzVwVCpOZEEkRypGaklJfmFwfndxQjg1JXRoQEpDfngwc2leKiQqQ0d5ZVd3LWBlVk52KVdtMVdXeFFlUVRlO1Upe0koYzh5CitMd01IWURHKXp0MGRwcV9eK2xRYD1oIWYrIzJofFRGS1Iwck9zN3sobiQ+OXpHPU1ocE9KejFXRClNPUh7Vz5adUJ6PVhuaHduQEotVlBnCisxdWNGeTRieGAhVlkzZWo8VFFwQHhveiEjbmVUPCkpeSM0JTNrPj5RRlQ0cmYyQUpiPEdTZTlOWFB5dWBgNlFFRlgyT3hmSmlrZkNUckI0Cis3TFMwQnBrVT5WZ25kOStCRmwpZ1hKO3NCYkRhciFqfipMaEsjLU4wREtXbSVNQ0xGZ2JjTS1LPjJvWG1PTHBjKS0mJFJIaFExPn4ld2Q8CitJWChpZCNrI1ZtSSl5M1g+Y2sxdyZkeCE7eCtRNktsI2BQNm9nfkZxeS0ySUIqR2JwZWdldmBMek16cH03fiExUEpAfiV9WTZuQDZPTCheCitUJUZWUEA4WH5EeEUhUj5ZTUxpSWMxNkxgOHVrcWA9WDQkenV3Z1UlPDUtLWQ2VUZ4bmFwYlNWP1E3aSYzS0FhTlhuNShmfTZTcVc/WSMrCit5PGNTSWFfMFFfQTVHR2JTcDEzflQ4ZSNse3syZlMtTGhyLWkjXlVGMTNeZ1o2KT5BdU5Fek0zbDN6QThGaT9NUEEqWGR4KTx1ISY8KFJACis2dGElbWpyX0Y4V1FDMX53Mmx+bnFGbF8rQVdtI09xO0lFMjIoUS0oI2k0VExEcU4pdjk4dz57UnZteVJfYWt4WS0jK1FHPXJ0bDMkejhzCitGay1yaElEWlpJNStxMWgkYFU+ZmpzUiRONntpOz1raVN+U3kmQFUmJldSamNOJj1HQDk4b0Uze0RYcz0tU19hTkxJe1JSS3whJSF7K3s5Cis4b3o+O3tfWlpYeH1gXkVaKjlwQVhmTnFIcDFLU3YxUkZlPUg2PFlZeCNKM3h4OUVLPn4hfHB3clcwOCpMNj55SntTTV51YWxZQ01UeXFtCitlRiNsI2lweW9lT2tNdHJUZXVxdGRyMnYlKXRpTHRjNkpHK0JLX3x7IUlQYihkbXtoYjxyd1dkenB4XzYwO1Aoc3BHY0xAOU5MZV5CWV9MCitSeit4bGBLUmJaYFBXczhDakFvQj95WHU9PmZXI2NLSiheaypBUEBHdl9ianZDfGllQig4eDRPbVBSJUpjfiFLZG5OajFpV054OUZMKDxKCitERUhPZkp0KitqcnIlaGM7dHlwYk9sLTdQd20jZjNKZV5xNndDI2pTdlk3Q009YVJpVi1saDJ8JFZiVWg9WFVWYl9DKUF2TklfJVJhdmtVCit+UTEwbmIhJHtQTT9zQ0x4UzRfYTRiOHNgLXZGbDlYJD1kOHNUciR6TEJkSmpARmlee2x+P0FyJDdkK1kkfU48XzA2JFRXVGV4QlNoRUJrCit7JWwhSmxCVWZeZWNJe3pkcjVATSlgb1E3I1QyS1BEPU1YO1JPX3FQJXtMWTxPSkdYVmBUfF9UMXkxIypvRyZZRStPSG0hYF9qaSgxNkZaCis4VzVNZSRnNjM/cHsqPUkxZnBzMWpFcDlxcTFhUEZBQ0hXV3dNQTszTTN9bjJSIXole0lxe34qI2d1PWZgK08pKnJGeH0oN1F2K3UoVkNUCit2RlUzZ3o5VVltM2NRZT17ViVgJT5kQiNxP3VzLTlqXiF5I01IRkRXbGt5SjJBI3Q/PUgwTW8pXmp7UT9iPS1rNERhcipIQ3ExcX1gIUdpCistIWF6dWZYUUZDSzVUcTNYZz1IQ0NXb2RQaiMxNVFnayleWWhoIXpFbWI5Vkw7I1c8czJpc0cjYiV0ZGh6a3klPSE2a0xITDtzN1g8czQ4CistUm9gfjVeMGhvdDJxb05lZE49Smt7VDVTTT0xOVp6KjF8aWQyJS1XOVBgS3ZSNUBfUSUtO3RgQ3lFSjNWQ2g3KyZAaDltKThuPGNFRjE8CitYanlBWmAtKGtCYihsRF9Be2psSlcoRGwpPzFOVT9lNkp5QDFxaj1FeXprMUhMdl9wantTWEtRdm1PTHkjKnE7bntibVoobHdhdVRJWkpSCis3MWxoNXR7digyLUhHU0tgVWZIak91S2pxOSlBNntZXlQlRiN1eEp0Ui1QfjZQM3tuXiVjNUpCYF5SfnFSNjdGQm9oVStFTG5RNjQrYH1qCitOO04rWVA0WHkjJEVreX55Sz87Rk9fSm05PSsjQTlAPSRLbXg9T1A3Ny1mZCRMQnI+O0BOc3I0NWZeb3FSRndseGk+fiFNRHVmVnlwRjlxCitSN2s+e2c5fnJBSSRxWHoqNU9HKylfaTIzLTRCektfZCpILV48PG1VdEs2V1J4ayVkbn5yXmp6JXFYWCs2Xz4lUFQ1bEVhWXU5NyRnMnNqCiswaDBBUyM9SjtfclMpPzQqcGo/R2RTeFhmdWVNX0t3MDAxKzNjfDdiRHdsTi1HNXE/JCNgQnYyJENuV1YyMG13dS14VEs2ZUJpWU9NRV58CitAeGJiY0R3dTM5bXpPZX1CTEdEV2lqZnZDSlh9cXMhc0RVNXJMaDl6WTlRPm9BSUFBfGs3SlJHdnooQW94ek5iSV8jMShsV2E1eWtQeF8lCitTIylHIXp+Y1JQOV9yMiRfYG9wLSlCUXFTO0tlWEZobWJKS3U5RDA9fDZ7UGtpd0l7ekIrdyNlRHYoPnhEJGp4VjxWaEZ1OGo7IVojeF9UCitZUnVOdytvdGA4cSlnezRUPlo3ISNmR35nZlo0X2c8e2VfQjAwMllwaTNmKEN1MiNBfjc+QmNCY0FNMVVieTk8I0VmR0w0OGZpdSYqPn1+Cit6eUlfS0ZLXj1VeHt9dHVuKWFxJnsqSkxPaXo+aiY2cCs9M3o7TEN6el5jdEI2MyNPOGZRQjh2ezAhfGEtWGIjZCstOENffFgyfCUmVT8jCis7cE8weCMyRUtZTSsmSCRfZWFYXklVTy1eZ3dwP1FVKXE4QWpKXm1CfnxRb3lrcldiUnJBRWZ9IVExQU5mNFlqR1NxZD1vaVhGNFU2KTN0CitzMU1mSHR9IUp8SXkxaE4pMTk1PWsrTEJxYXNFM0NodiZvQWNART4rX1MtU0k9R3xBb302V0BxZkhNZDJ7QEgoMkFnUkJPUn0tMDx8KXM+Cis3WHpLTChxYEZmWDtsRCl2dXMyMnl8ZlIzU2AtQnZLb3MhQm52SnQ9PGVoST1HY01eNE9uQHspV2A7b01AenVHZl5QQUh4WT5FNld+Q04wCiswVU5wT1JqcGhfaGlZSFc3XlNTcHZsWnktMWI3bW84WWp5TmEreyhNaVRLcVMobk5wO0Rwdzk1QiF4dmU+cDlYNTl4Rkc8cUJON1pKNyo4CitBbj0zelFjRW5GVntuVH54YWwhSl5BbG5aZillSj16IWJJfEBJI3s7Zzc3ZXJxNTN6d1k3a2IrbVktUl9JcXtXWShaMnd0WVNBUlgrU0FVCit6TzA3QSQ+d0hrcUF6d2NZXjlwYHFTN3hoRW1OKnUmUlFzcVBHOUh8dXh3KSRiIVpUd0lLWlFPPU5rTHx9SVNfYkY9a00kJSpxZnk1KkdMCitaK097fnAqc0VIfmgrRm58eml0XmQlNjRKO3ZHUGcjSDtpJE9wdUg+a0JkPS1DU2o7YEptMHk/VVJKb29WdVRmVlJfKS1tTUxqR1lXdlBaCis/eXp4MUZhIXVOV2RMUHtJVUNuOzlkMCUzY3x9YSRvbGckYWdGJktTWjZjVWZ6fnBxbFNQeCZESW1wKngqfTV7cWNMVHV5K0Exc0ZhPEJECitvPXlYSCQjLXtlQDF5ZCVhYHp3TFZLfCt9PT90Mk4lYHlnMzJlTV57VCUxNXVeeHtiNVF3WHp6JjVSaDZwfl5rS3IhcTV1eEQpN0x3Z0FVCitxMFM/TmZzS09XMSk0eiVUQmpEM2RATSVtTHlhXl8wWk15ejd5I3U7TUJyVns0YVFgditBKDQzZj9FRXxKaUFvbT5eJlBAOzB4UWcrZj5UCit0ZmptY3wqaUA/eVNwc2gqKEhiemxJQnY1NlR4KnQ0Xjc4V0xNNFMoZmxnel9gYUdYbk9+MiVZKGI7JTd3NFpwR2VoMXokQlImPmFQQ0FLCitqJjhrJn5TbUFZT3dKVkt4SX00V2ZlZEZIO0MxYWBxSH1JLXN6VHBHajAyYztiaSNvfkEoVWgkQSN9Pl9BNDY4YU9YQ01ucztLM3tuVkZ1CityOFIqQiR9QktAVXU4aElVLVRVbGNEfk07Q15RTTtUVzZARWxNekg1dD5AQEJselhUZVB3YEJPKSZGXlN1aCRHPSl1U15AWCVmcXtBZnkjCitmX2N2Skc0aUdXMClSdiROIzNWYlR8dyYrJCZudFE/ZThALSpjUFh2ekAhITZpJV9odjxwaVdYOEowQElBfU5mX0NydHhOUUhAMWI2dEBeCiskSCVze2xOTFdURmN2ZU9yIVo+RCpPbFJ2KGEmSGhUMVY8KnRFWHlvdzt6U1koK209Wk4zLWQwSyhxO2dpSE5aYFhiYDdwakM+SzdpV0BXCitsO0J7SDRzMn00XkJPY3dFfDxNcjhgJmBhSDgqQ2ppa2lIfVJQe2JpMCReei1nRihVWGFQIUhuQHxrUHZMc2FSPjI3dVpaWnFIdj5GUG9zCisqRH41TEwxcVN0dyVKMDBndShZOFcpbmdabmdwZE5BO0xuO3A3fkk9ViUxaHAhMiY9dmlWY2puRX5zNmg4bjB7bjAxdiZPfjd6cmc/PjctCitJSDxLIUAheWBMUSk8N2JXViNqTEgwJDZQJDhGYkEwaH1JIXhUVTEwVWw2KUZjXjc9V3ste3E5O3wwZzEhUUkkM1Z4Y3IyajNOQU1xJnZKCitvI2FAZVFGWEk4RnA+Sy0lUzQyNkRFT345bmQqaSUoYjk2KHEmM0BOOSZXSENPOWxFTThNdlRlOEFEX0FrUWt2YzJNMEI3aTsjTXc/WmlTCitRTj9eXjRuQEJGU1BJTiVjeTQte3I7ekNoTE5GWmcqWClUemNgZilfZzE1I1VaOCRTQT9nKjQ7SDQmWXJ7UHJMcV4rZz5+KF99eV9ASzs5CislI0U+bjw3QCsrfF84WHlfRWx1UWNAeURPMlV3fjNaQ3EpITQyZn5LOWNTeVp6R1JMeSp6ekx6LXpWOXU8O29IdmxXRCNSfXNudmlXTU5RCitIbmMqLUlWTCtRZXU+LTZYK1N3Km89Nkwpelo4bCo2cD47WTYhSWB+XzNkMGooeTdwU1VfejdtVXxueWV7U08qRCM5WEsoXzRLOGJrPlFPCitRY0E3UUI/bHVoPHk3TklmXkYkPFhDbjArcCYoYW1SbWBGWkxSKktoUm5eVihOZnREY0VvP0MlTkstb0NGe0NTcDFeSTN0fnU5ejVQciMtCitBKjIrMnxLYjZjWn5ZQChAX2dBOVJlLT16XyFnKXd6ZnlfVE87a203VD9XU1E1S0IjYG4zT0gyKThWTSFUfiR5ZzdTTDk8ZG9WZUVVcHZVCitpVW1oNklMSGxjOUghP2AtQCMzKUBZI1I/QSt2eSgtSE8/VUErekY9Tl9yV0tmVWhtQ3Qwe25nfGRHbGQyJUwpKkFTQUFRQjZ8Z2kocVh+Cit7NUZjPklpV2I5KHZKfEx9KCFDIU9AXkttRj1sRmR1QWY2KW1sUkIlZ1FwQEVURFp9ZigydyM3NEMpN003X0xrPnh7Kz5sU1pETj9ASzFXCit4VX0hY1c9UiNgJEBIMWE9X3poVmhHSnlyI0JLUl4teVFtNytGYCZgSCR9VSQwKVRoTk44RU49PmdrYTcpTEZXcW1taiEoWERpWHoxX3Z6CitYJVZqciFraGJgRSZ3KTUyTmpGS2BDSEgzcy0zbGtKTipmTHYxeEdtOzhKUkFObmRjSExQfSs4Ril2dSV7JFFfKWt2NXZROT1MT2shRDRmCitAIXAhd3c7VTswU31xaUglJE9KeWtgeXE/RGRHODhfcVgjRDcxdlUtbk4jMjdCaWA7JWtOQklLJCtNY1BpanhnRmpIIWYpYXlUSllnQ3xRCitpY1U5RldpVHEzfDJlaDRMMmF1KTMpdlBqUDJfTkgjPXp0N1MpQEw+SS11OXZGV31ycTJSMiNleEhFYiFVQ0xBQ31QTSp9Uk5MM0JNcm1WCituQV4kVm5HV1R6THNQO15EeGRQdTYmKXU3Nl9vIXNVJEF5emMye1QxQF44R1ghbFV+d0lKM0o8RytjKF50X2pDaSZyMHoqbE89SU97SkIjCitYelY1T1BaclkoZE58U1ExTTd7O0x3d053Z05YTnVLXmd5R2UwVSE7bipqYDZud2JvY2NeX2w1YkRIcFQwZVJAZjlhWG54Jn42T1hXUGtsCitRZnhAaU0+TlJVPDU3PkN6dFE0LVFaJkgtRjxsWlhmIVpIVkcwWDtpciNtVyhlIzMlT3NeNGoraENuNlFaUGI1TDhtIWRBMnQwbG9QfkI7Cis/VWM1VkZtUT5raWwqa0IkK1UhXlcmZlpwMTI2Jj43Izlfb01CKENhfEtMJndnbGUwN0Z2VzteWih0PWRzTitOb3NLJEpOZTE+MDRgQH5QCis2bXNqcCZLTmxpUUUqTjBhREJzKTFMRFE8KGB8N0pkZWNnVWo1Mit+UW9lQTAqVSZHbjYwcXJARTBLKjs+amxvXnhwJE9LcCllKnM8T3JrCitoVC1GJmtDakw4X2MlU2RrYFYraG04YjFkQTc2QT89QlF3cEhFRFZuVEpWI3k2Tj9tfnRzUWVJNn1IMDNQZSNJWD0zRDg7YHZYXkcxLWhoCitgO31IREMmeFFFcDJgUV9mOVNEMGxiSzNTJHVidUgrOWVycm4wOUU9bldRZG1gT1l3NyhpQ1Y2JXdjcjtCRG1YX2ZuUUNpQ2I8OyN8KVVDCishKWF4UUtrTDFreGFkM0RUcCp4ckt8KSh1TFBCTSg3X1dAY0lYcXxQeXM+fCEhJkh7bjUzMEdDTXk8OS0mMmhaWDJKbHpKY28xeiYrdmR5Cit1Rz8jUHRPOztyeHk2YWFJU3xlIyVlXk5EVXB6JkUmIUltaFU9YSpZSz1tcnNjeSZ2NDN7bTU+cVNIdH5CWFBDQGZBbD5VQk1AUDZ6bEpJCitqN2BRYkoyXmVHRyt+REl+bCUtcTxSMypyMlFyWkAxZmJ8TWJ5TzM8OV9TNjl5P1JtOTBeNFhIVEQhcno8RXd6MVEoaXQtbkVuY1pYQUljCitDZyVqSmR5KHBueEBYe1ZAUmBXQkVqMjxsSW40Tn1NfmI2YEwpYmImYjVIazRpJHRxKykkbG0laTtpNHlTT2cpWnRQcHNnMlleLXZSPnNRCitGbzs4RGNzdSU0dDs+JWZMfVhvZitidlRyRnliUFM3WjRiX1VRK1lGdzl7X3s0eTVINX1TOzt5bGdjRGElamJzSUZkb2NFb2UzWSReZFpiCitNTEVBOUgrODBGcmxUJXFTKD8wbHY1VGxZVGNVajliSj5pQzZ9cEViMGBxWTIzRV9udiFqeX0rSyQ0aUt2XmszQllTe2hEWFVfRExaRGt3CitmTEttdFRzV2FgJHtYc09wZlpVM21KZVhAXmdTWWtlflN0czQlRzRrcSEoI0xtQUYxfmJUXl5YY2BKIT5DIyQ7O1ZHbE9eQFIzcUBBTzVaCitVSTFJVEdEfVlDMTRYSy0hVntLc1EwX0A7cT5zNE5TKHotcSYzSm1EQHojeVBFRD1HVy1OfXshM2h7V3c7PmJPZjE3P3VIUzdFZn5Ra2c0CitSejFxIWEwcClhWFQ0PH1gSXwwPW5PP291JFB6e297OXRFfTdzV3tFKFYqR0BeTUIhdFB4Ty12aiNgRTZkQHgydUxybHs+YWEmJW0yeVVqCit0OHokZjVZfmFpR0xSTSt8RzdiVXpYQ1p5UHlFPWRCWDttUysqbUk5S3YtVDUweEc5e25iISROeyV3T2lScTZDZ1FSenVDaW55ND1XRzd7CityWHc2MkJOX3AySkxkbHBJWXlzZStNTnMrOU1kNk90e2JlKXh4Rzlhdig4cmpGIyFiUXchNHhTRH09ZlhmKHt8ZEQlR1NZSH1GKnxLalBQCit5YGtqVlF5WUomYUh5LWw1VENuYHU/VyM7eUc8S05QfjQhMG0qWUJ1MGNgNE4/ZnVMT25ydUptNU4mUkAwZEUmfTVBcURfXlJYWEdZPmJpCitvczJCfSojMHhBRkRlXm40ejU8bH5VSHAwUDh9YVlhVik7S3JRcU12c2pLQFBnRHpONjxsUF97TiF1MEZaWTNANVRlfFVoVz03WG5XQGtjCisza1AwcjFNTUQzfEIyeW9UIT9rMD9obXV9PFc/I24+bEx9fnRnd0VUP3BMa0hJUHl5KnpnbVU8MFo3TEdiJTwoX2VQeS1hMmU1YUpHdl5PCis2cEVQVkp2SzZXQnZ5eHdfbXdzQjx6WjdAR3trRm0hWHghPWJHYCY+eTBKa2RIMGdWdzZHSD0tOVQrSlRYe09jMlNHRzFyQjQjJlVtZ3VwCitudztCc1FofVdoNihVZ3NzODR6MTZoe1N2ZE1GcWRabTVZUEFlKU88M3FFKT9IfjA9KXU8d2t4eV9pOEhuaGJNXmxwTTs3ZGohKHFPbyFOCitRYDV8Xnt0WnlII3x1T0ZoeGh0UUV0clpHdFZLYmRuWVI8RDlqdn11MmhsKGJCM25FIShUfClDYWl9IVM8QjEoYnhXXkNKdX1zbEhMRjc+Cit0ajA2P1VUX3YqITl+YkNyNmc3Q0ooR3NrQylnKUMxb01iTTlpaTt2e0dRN2NLZzZ5TVJVVyk+PiYjTXtAeVNUVEk7JHBTfDQ3RkdiZ0VPCitDTmZwQyt4UEApe3szTG43UjBMKkdSOURgZnZAJFo7MzYxPmVDWjUlbykoY0VvU0RsKU0zbzNXfjNlVCEkaG91REsyUmE/MT1UaE5zVkt4CisxKEEkQVNTPUJUelJtSWtSKlAzeUh3cTtzcVc4Vj1tbU89bHlLamVZIzdOZG1+K2UyfDJuR0Naano7MSh6fjNWNjk4ZT5UdT5NI082YFdTCit0IyV0bSg1ansmTTMxcEdxTnRhaCFMPm1mbiZrdkZ6Skt+M3ttYWtBdXJCQzVZVj5kbGMhZjw0JW9ud1cwWHBrU2ByKXwoKCtecURBUX5PCis0WTB+S1Z1ZDNVSWMqU3BsSmdaZjVuQSY1R09kJEprKlZTWVU3VGJJK2F7XyhEd2RkNyZ+PlppMTg4VXgwfFZvc25gTGtkaUlFSWxue29uCitlUWFXVkBtfV9hY1RBYGpNKkZ1dWR1QlZtcnc/bGtSTHxGXzRIflM5TWIzRTNmQT5AKDVsdGRRbSZ9MGZXZTkkcEo9NkJrXk1ecT90UH1LCitvVjJSVk42O3AxaTdaYndBZmVZQXElTDJReiFxNiNpViR8YTZXNU5QX0tuKUdlQns0SDZyaSUpdmcwUmslbDQ7cm9rZjtMeEBnb31tYkdgCitkUT4qSC1BT0Y5Xnk3akIjbF8tQChObzc0PVlCSksxPjE2eypzYk01MT90NiF1Y29IMm87aFMjPUxpdldUVW5CQCkyS3Qha0ZNTCl+MUZZCitOQiZ6NSQxO0huNnhyRityLTV9THJ2N05udTEkOD8lPX0yWF5sU3FNdjxaRj89bGRneXRWWnY4QzdNfTxpbnpJLXFqMm9qcFBLJnFgXnJeCistRXxYSEg+JkkodDZCP35vWmMqTiQ0eGdDeD9xRmVrekh1PTJ0dV9ebX1PbD96Nno5eHV4d2dWKj98bVpKekkrPjBgenROaXxnSHY5TFZJCitXdGI7dUtAQn5EUVdNKD9taFdjYWhWZ0tWdSRMU3F1PEB4KjAtNUImVUB1VUczVjl8PSQhVnZ2X3BpfnZpR0NZV2lTemFubS0xWEcrNDNDCit1ayg7OEcoZj1pYGBEXkQ4OXhaTUN6S3RwZHswTEJmbFUjS3kwayNNKipFMCF4Q0olX0s3YHhZQGlxc0NyPkxeNmx4KmN0c2VCb0pQUSN5CitkdnlpbGQ3cVU5O2R0UT5wO1RyJmJtS05KdG9nbSlePVFmLSVyVyhPc157VzVOJmlkO3FRSz4/WH5tdnchSGFUSyg7Qz5GTSlkcVdyb1RACisoQ1UrdHo5PE5qVDA4d3ElZnZXM3t1QmgoZm1iSj05T1QmdDBEc1VuZEhwPSEkKShucmtHKkw3ekZEcFlsaDFSaV5RdTleSUoxUkU0azV+CitBVzUxY2AmSlhePHJGWDRzJSE3JCR3Z25lb2ZIRkIkYGZ3cUxJa0kwZzlZezRNZDtRWSE8VElDd2AtMWhBSHBaalg7SG9gSE19bG1PJUxzCis0S2NlYlQycEVGMUB2ZyEqJClkUFIlJnBqbiljZ1goQVQxNEUhTkwpNUVhY0VmUVZXeEE3NjJFQFZkdUl7RU5lfEY2dXFoVz9XeSZ1S3ZxCis/MnMxKipvIzQqTGp0NEpsMGNBPj90TUd9KjRETVRoRE9rRno3V21qMnd0UzBeV3Y8ZUpkfEtIMmszfHZ9b2VxP3hyUHQ8KEo9PSRFdE5RCitHODE9STB9QEJ8VDB4RFFraz1ERkkzc09NTzlFR2BtVHJgMEpEXzlYXz55djt6UklSayVVdD95OSstJUpYaUM+Kkp4KlNuX0Z9X1V5emtUCisoMGM8ZH42ezhPJE1qVWdjSzB8SDBfN3ZDXmtCQGZMWlpiT1V2JXdMKSl6QWwhVmdobVBmTTU3VXxCQDUoM1g4ZXZhUHptSVU5fjVnJEgkCitQKiooUlBFUUVqMlZhY2krKnpAQjRETU9GT3NkQyFgdHBrfXpKQl54MW0pTUcyUnFfaFJhZ3FYZkg4MHxsOEZXSy1PR2w4UkpIZVc1ZEx1Cit0fE5JSTZgMnpwPmwyKz8td09ydV51ZG10Yj1mPzA1Mz5jbFNzaFlIQWVWRkY2cUZpRD0xNWJtMTwpdUNDaCs0QElJcWI+SSk7Qzt2IWxjCitzYUsrNEpMWnlWRkcxUylQOGlgOF5IZklaa3VxYnA+Zj5KM1oyYFhOcDMkOSV6cntDb29IbXAqUHAlZVckcHNjJil3VF4ySyteU2xrSW5NCit1aDR1Yj9VTXojdUxsRHJMdzF0dzhSR1hTajJCbFZDYWBXKyNZWlkqT3Z1YEVlbFFVV0RaSWtVQFRCIz1+UDNUYUImb2djQlhtJF8zZnB7Cis9JSp9cnc8Ni15JEcpcUhhbVFxVWhrYT5sflMlI3l6UFE9K2R6NDx5RHE3VV88NU9KSCg2QSskcDxgQmBKZ2o3eF9sP292MkM8OHZsU00zCit2TlhTfkk5KE1OJX5lSjxRaDJFWkM5ZlI3YlRXO0c/PSUmPmxTamxzNFgyfEF0ZXd4bilrKDYlekdfTHtZMmlFdlJ+QS0zKHpvSmw2MksyCis/K2A2cj47MnZ2JmMrKW5AdF8kR2MmMD1KTkpPPWVsWGkqVW4kRm8hdXJtRGJ6cXR8cHl4Sj5ZMyY1UEc+aigtQDdTSTBre2tIejFQfE16Cis5TUpfRlVCWWx0XndxTkpvczMxaVpTTFkkQDdkNCQoTEJaM1poOXB8Pm9YK0R3IXRpeXtSdV42d1JPTlI3fkhKfWlTMV5nNXtTRldpZkg7CitoTEl6TzEhR01LfFNEVDk9NjdgVl5NRDtlbEw8PyRzMjh3b35GZSlGJmRObnM0e21aeEo3aFlwbkgraHZIIWljWipVRERjNUNEKnZYKFJzCis8b1cleFg7U31VMGt9Jj14P1ckJnxIPUNUbDBuOTdsIy1kVDtSdkM7RDZDPlUta2AqPnYxQUplQyM/aCkyVGN+V2VlSyZHMGQzY01LemRFCitATktrck1ZZjJ8ciRJVXZ0QzlIZ1diJXpEOyowY2h2YTtFYTJWcHMtJHt7RFl7K3R1MjxXSUVyeEdMKSFrRUJNYjk1cSUpV0xhckFhQitGCitFWDAxRWcqK3thPSUoeT0zazBaazVBTUByUTF8Z2xKdEdDaTtse3E0aCM0YFc7V0Q1VlhzOFcmd1psP0Z+I3J8ZDZxNkcpNlI8WXduTXRPCis2Vms0fiYtdmFLN0xaVl9AeSZkVm8/XlNZc3peRFAqfmJfX35eXntZI2xAeXt1PGtEU01JV3h5QFUxfCRERGI9WFFhNyFAb28oN2N3P2toCisrKWVRQygrQSE0am5faGBET1ZMel5YOFdnRjkoWnpgKmUpc19YX1p4dHNfM2c0dUg1cytKTDVjKDhUQlYrIVVDLTBkajdVTlh4KVlGJGF1CitLUlp6O2piKFZ5M2g3R1JBIUtURX0yNkspZ200X1MmO1NlaXdGT2RXYldIQzJhTCkxb1dINlYjOCV4RXZjbWdwc05LYXVTTmkxdV5telokCitvbmVYUXloYEdBdm96WXNuV3xyWShgPXZvLW1gc2p4b3YwKikwREJQKiF6WnoxNzF9cHZubDlvcWQoMzVII0ZUTSlTcFk/KlFzeG9TZDxXCitVYy07ISY3RWQ7MDdsKy1zWkpgTjIpNzxJRSs8ZCZId2VEPShrWkxuJS1KaWMybFdMd3wqO3Y8RTE0OFJXNV5eUUQxI0xTVHgwJFYyWUEzCitMNGZ1Vn4lWDY3fmchZHtyWiMxUSFNXjVuJi1hPFMlWUwodH5+V0g1dk0hZ0AtI0s1dXJ1eGJuK3UjaGdAKVo4JDAyPUlzNyY7ST40JEl9CisrKmlITzVmc0k7cj44d3JRPVZVKHlgeVgrSE5DT1Bhey1fWTlvI2pVYUBhcjtZNX10Sl5JJmpBM1UyWSlXV14xR2dxSWJBMUVySWVSaF83CitJR2B5PXNpVDslQjJ8dT8oSzFBank0MCNoJV8kdmxFR3cyNHB9YX1FZnA/O1l8YmIpKzFzLWg3NDY7aENebVhWREBlc3k2a0VhcUN9TUJFCitwN3k+eURfMUo2bz8oPClHWTMrZWwpWGI7dl4lUXVtT2BhNDlvMDw9eE5tNUZYcFApYTJ5M3o2KSo2QDVXQE81QjZ4WXVRQn5IT305VVclCitRaF5IR15BaCV7YUVITGNIbnoxRj5gXk42KTNRZkQ7NktCaUlXYiUrPzZPWHQtRklwRE14YXNHamheOWlLPUA4SHh6V0dkI1k8UEB+VVlLCis2TlRZM09eJCY0UThmeVpqc1IyLTk4ZGZeeX5sUX0kfm5AbEt+ckIzeVo9fjV0YlBma3puX3o9RFBUaHZ8ME5iMyU/OCVtbX13YXgwb2gxCitXdXA/YlpOMkJgYkY8NUJUVyQ2bXNSWXBiMDNqJC0mYXJ7VV5EKSE0Z21ZOzFNeXJRPi0jfktNenxKQ0ExZjY5aCo9O0NFSWJaTVljbi1iCit0TGJ+UWFPKFV0ZkcqMiZrMjk9emxCSmYrNmYtVVQoTEM1QnVTdzA4OVI5ckk/K3duKlRLYHpMWD1DNStVJCU3b35WKVNwe09FZExJYihSCitlTWZ3Y1d4VihAb0toRSstNiF4SG1LYXlmViMoVkFlQnlYT2c9X1h2Q2F6X2hoQGYqaXNBYWB1O15UJHROcTlNUy05R0ozRWplRTl6c3tECitGMTIqKmcoWEM7YmE1SztMWkR3Mm9CKig8IXJwbTMwX0ttOFIpYU1XR3ktY2ZmUnF2S2w+e2IkWUw3fWVHWXM/IUFebFlRNnRRWGMxXjlSCitmYkMwNDxlLXRkd3dGYT9BJWJYOV9NcF5LdzN3STxqX1JOaihJQEk5IShgclRZcnBRWlpzZyQlKiUjVz1uc29xYWJ9Rit6S3c3ckUjaFI7CitDTG50N1ZiWDtTMWpQYiM8O1J4enlYTWZSQX12N0RicD1xantCXnh3JFMrYEVKeGBoVEd4V0w2LUkwbnA+U0YlN09KaXdGfFBIcTFBYnUpCitXe2JocCpLYnxlY3JGUEJDYmttYFRMZnxjZ1Ird1FfRWZXOVpVRmIkMSNNMzVURiRabn5sZVc3Oz52Smk+Pz4zbmEqfi1VcWA+SG03LT8yCis/Y31ZWnc2VTApPEA5fVgqTGAmSVckOCZYTiVMWXNKaFo9ZGxpR01CVzlsQXduRCg3YE5hdCtfQWwtRVJjP1ZUdmhYK2xwaGdRRH0xcmUjCithemQ1bjhIcG4pSWVGJDJQT3RNe21xXnRiS3kqMlVKXjxsWmJHY09SU09sP1RMTTx7UypfUlBJMkJ5bHJLZFVBNXx7d3Z5TjdpckY9OUNUCisrZ1hxc2dAeVVubUgqWEE2IygtVSFWKFIjKzB3bEQxJVdVJDNfTTt1diRRbzhsQitScEVnUSF7SG4tKHpKb1R2cFZhbmQoVEhacStNUTRyCis5aDVVX1RZYVM5a1dScWByUHopO1ZJTGtaMz8qakhxdC1kUWVyYCpifmxxM0spTSZlSkcjY0BAYjNWQGJyMEclejFWSlpDTz1mJjBjckVsCitRKEwoJGNrUCtZZTdSSkRQelV0KjlJSjgrXnJWQFp4QClpUFpLNV5FRX1HZiNCeClRQFVTKmYpQU92R2VrVnQlK1JsQV96aUpncio0WFBSCiskWSQtMStHSyh8eig+Vm04SUBeOypfUSV7ejwlckxiOSRgPFJTUSZqWD45RXRaPEcwSnlTTHNaKSY9P3MyPTRNcUZxQHIldTUpWkd3RWx+CitjR2tNfFBYZm5aJU9iWHRqRzFNM08+K0k5WUFHez55e2krVU9VQ1FVbFRGUkB0S2N4IVNMdk5LR3FrMFdJdz9kY1dxKCpWam16fDZsOXRyCitCcChGYHpNckprI21vWVo/JTBuNHRhdFReR1ZSQlZnTUk5VDBXbUApOXBObWIlX1EpbHBkZjhJdm5XMlZyc0s0QWtVK313KnhUTU57T08+CitlU0JBITgpZks3bCZhJVpyak9ObTNadU1RS0BhZVRAfkplOHIlP3pBTEh7ZSQjWUEqJkA8P1gpRyhHS0F8LTU8b1dUZF5PRn1SJDhYJHMkCis2aUV4fENuQ2x6ZmJuUW8/aDwkTEI0dillNFVhcHNQIWkyMXBzUnklbDkhPVI+PmdVbmMrTTFXNHNTJl89Pkt6PVppKHVXZTU3NVYyOSNpCitpTjEmZFNDVypEK2NURDJ0YUdHfll2WEhOUkFgM0ZNeE9KLUZIez9mJHxUMTNpT0ojZzh6IW87Z2VVajxTTT41aHh7WD5NMkIoWGZ1JnxECitnLXN4bF8yVH5GWS1Yb3QjTlpieihidEAxUlVyJE8wMExQVEc8LSgtOFM+az1tZD1NLXhDRHlUb2dCTS1GYTlvJXx1U1NkMStydWlraUxLCit0UFcoPXViVXt4aytiUGRwV2hlKT5LZk53YFdxQjxvPkc8OXRhLTkjUDljaiZTX3duelROT185WkZjUlpUYVVAelAweDl3cVNibDZwJnQqCis1SSV0eihzJWhyU1pMIUM+JnJKZTY8U2EoUGt8WiZxQFleNSEjUyowelNmZ1JgaU9Lcn1SYDcpdEVpSHxHI0I8UEJHdjVoXilSIU5CdSpRCitxdFhKNzFFaERQO255Jll3dWloc0MjaXk2ezR+fXEyWTtsQmBDVjRrUk9sZSR+djM9Vn1sPHJ1P0EqaVpWPjw0S0liVVd6My12SVFBMGtWCitBeFhLZUE7KVIodVRRPFlOMzF7WGU0RTk3ZjRCZVV8R3kwWCpXfUl8LXVMZmpkaWVoN0psfT5Aelh1T0MofDtANF90TT0lYjYwc0lxNSlkCitBSE9pWWREXjBibjhoKXpRcmRyX3QqNHFFdHN9fSQ0bTdCKXpDd3UkcmN5NmAqWFloSmtIdkpkcCE0P2FZOzBMdWNpbn5QVmA5RWNpNX5TCithNmteWDxlSUglIyhpLSk9RWhLdVhwdVhvTm10IyFeUkQzUW1PUmcjTT9xXipodC1OLXZ7R00pSWN1UUp0Tmohc3x3ZlVpd2B7cHxld197Cit9VGZ5ITd8KSFUKV55PVZifFMtK3pOSz1qRWYoO3A0fm5CY0lqIUNmcHRVITkzT1k8TFI1e3l9PEJaPlVafiNNKTFGfTJtSmlCZkIxS3l6Cit0NzM1PWZeK3dfcXM1OHl9TlhWSk5mSSRuZ1FjUylfaDF2cl49TWpyUyVgfD49JjRpcCpXPWZSbEFgcmdUdllVbndyND5vK2NtN1dZVWpgCitTZnRsQ1V9dk1lUl5lQ0Y4WkxoTzYxfWpEYX1IVTApJXF7PTMrKyYxd21xRzNDTXVYdGBIQU5SRCVOb25tTS1zV0xPOUphYWw8ez9xcHlSCitkNCVHVXdGbn5vLVdPcz1+el4hZEQjVUtDUGFCQ2UhO3xtOUEkeUQtbzg9V1ZSMl5xVGFTakRfSG1VTEJOeE9PO3M0UjBtaT1RUndTJF8yCit7blA1MiQ7WHhnNF5hbj9sTEo7KWhOJHVQVldEZWk5WW42TEIzTEh0VUp1KXpCaUx3ckZ1dyladyRkLTBhU04/cDw8d35YbnY7TkRKSzdUCitjPTdaRCN2ZnhUeEY3dSNOUl8tNjJCVlctUkl9IVNCOU1GVWJpO2NzUkp6Nnc2UHw2eGIxNlRCWEVTSmpBcUQjYW5RJkpWI3diP3tHcn1QCitmZykyNHR9WjJYcU1uaE9YI2kjTFp2JTlPMShLe3spVkVGJWZAJXowTGIhbHhqKE04bXdMZSNmJmV2K1kwPGl2NjxPI0N6UFMmaVI7Y2dmCitoQHNGdjdabWBwMGhPeHU/eGlmJEF+SD5tJXhQayRqPSE8IXpoJC1pJUphODVyMztOVDs9XihQP0RlPVp7P1p0VUh+eDNBeihkLT4kUmsjCis8P0tlUzd6STY8d0BYMk1qYE9Yc2JVTT1EPSFSPFdlRWdnTDFVeH1KemhSTi12bWBTPCpnXmQlNEg9Jkp4OCFuPyZtfDJFPkJXfDFWcVpUCituOUpHWEZMLUBlX200PXJ5JjspQWl2YFZzTXVERmJjUzU0TjV6PlRqKmBIdmpORmU7XmArQk9aej4+Q0Zqd2dVNm9iKWR+VFg1YVJZbyleCitpUF9lPTdPPGlPXihOPkZUPGA/UXFeZXNyM3hyWmstV3dZYm84YDw+O3pfJjZTcT1afTw/Qz9RJHpiejREeXwqLTJJcXtfUkVjYmg1JnlpCisoX31rZSsjV15lVjNrXys1d0B4VihZYyE3LXhtT247Wn1WSWNVKXZUSWlAOT98djl6WHEzP3IwSj5mdzZsYzt+cWRnNkw/O15iXyNQSiFgCiszc0cwYnpKPEZkZzNnP3xGUVU3fCNkPTNodTRyUmhUNWBtOFhMK3g9K3A0RnNRLSNXb1B3WClmeTB6Q0tIZTJicytqWTJObkE/WXxsZiYhCitCbGA/KzZLZHV+SkJlTClPdEViITlPPio/bGZzLVA/ZUcqKzlJS3JUSlY3V21GeyVMI1YjTHY8fl5rQ0dsJD5QPlAjWi0mclpOLTUmWTBECit2aDl7Tj5YPnQ7emItN3VDbU8mRWwpcnBaODlfZ1VsSXREOVdfRSZra3RtVyFKNUBPQVhiUHhfNkxrXnRRXztQSmRBQWZDJiRsclI3KD0pCitMamw7JEZ9cERtUmxEPHFoJjQzY1NVMzQ9LX1ldXRzK3QoSHBIaCZnK2JFI1loPEEhKHJnb3pSTHhxVWwleUAkbDZSWFFGLURzOHdQNmQkCit7OHBlYHE7VzdqX0NFKT16SF8tZVk8VU1wTlp1Nll8NVJNLX51YihxPSROfGp2SFo2cztWRkNsN3JqUFdseEg1N1dpTWBpUHU4bkVQNCo2Cisod3BSVFR7eU11RkFUQE9OKHZTYUpUQFZDTWE3cmJqO2Jqc3FWKj5CWkpsT215PXQhKm12NHwhZyMmQ3l1fGp+JVhoJVo0JTRkVFB1bHV4Cit+Q0hWZ3JQKWg+QDZhV0FLMm10ZXk3RHZ2UGZDR0xtMDA0QnIwMDE4VjAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFFOMmJZV3MpYjdkCit9WWRGXzR1Ykt8Jj89PG9oM21+bDshYSU5YlpVJj9wUm9pcFJ6bzRURWtIPWElUW0zSzt9QipeQlBCREV4Q1Rna2lze3ErYUYwYUVocFklCitXKUt0WXBVYGZkPGZNR2BidHpqbDw7bD1zMjB6aT13KGROakJaYF96KEV6O1BCdXVkMHd4I08+dXFHQ0U0PileMktNTGV7bEB8YDZfdlRCCithKms8P3h3RGlpK2I3Sj1aIzNkdHZBJm8/fjF5YksrT3Z3bEo4JFdLWXg5M0tJdEMxQihFMDleRWE+R3prQihvQUt0JXRjWSFhVitgKkc0CitQdWB4dE99X2w2Wjwxb1FGMnpiejlScTxjMk01Y2hVTTE3JWE/QD1aRmBaKFd5NktXbFJYflR1dkBBTiY8WWp3c0FWMTlWUigkaTdgaHtpCitZdEAlfVQ7LU0+eG5SO2BSdz5RPyR2Y0Ezc0ImZVVZdURQejs7JGZZNEh8ajtaKSErVkZ0b2JrNSpAXjFvaT14SDAmTDhHdGpSUDdkamNECitzbEdaKEVhSWo+ZyRSRiVLejhmZzZHOH5PMjBHJWVJcFUjfj9zWlJhPERwSzxhLSlvI31LUnhKTF5yT3VuQ1plKyFrPXlJNWNULUFJZmV+CisqKF89a0wjNm9WYERyZSo1ekteVmVzdSZTaX5GU0NwIUJ3JDdWWU9kSWpicmY2dDMjPnFUfmg4TlJ5UT9FdFNaTn58aHNxJlNXIW57c3BTCitIfWxRXyV0RzRPdk1BalpwWD1lMH4yT2BLRUw/JEpOUGFkYHR2WE51XkFtNDk4OU5xUztCMGVDWUxGcXVfPE83TH01QmsobSVscnpwVUMwCitOe0VIfihRWkhPRFUrbjwqVml3cldqIz5Ve2AzfVJKXmNXRUxnRWsmYlYqWGwxWkwhV2RZNFRaNjt0VD9gSHlla3luQkQ0RiUwRj9ePnpVCitPa0w5USpLZXkxfSFTZ3EtVVkpJnU1aUpSSHU+IW9ScTZhVHRVYzlHcjdmPmltVSV0TTBmQTs8Tj1rTDxVbCk/YnRvai1yYD9uTyN9e2h1CitHc0ZXI1RPTmQzOGlQWndgfmM9IURMMD9QVEZoTUVgdWUpYk5ramt4aWJ1ZktnV0peJTROX0hqYThFQzdTaHZ4OWs9d3swP2dqdWV2QnYhCitCSmg4PVgqRnhQMDs3diF0YmslflhgRV43Ul85bW10UGs7dEI+fWY9akdUeDtqfXtHdGZIVjdHZXFmcHMwIyZJP1k7OUVAZzllOEdLJHNpCis2U3FIUnpNPzNmeTdZRiNSTkdRQFQjSXNzPThTTGVRY0F1NjNNYnw1JmB7N3tIZFFyZm4mUTk5MDRIWVp+eTdPI3hYPSpVeUJNajZ8N2tKCitfQVBLTWFpRTdZRkdiIUFqcGFFT05WKiR8ISFiYllJeihkOEErbjBETyRyYHYwPmtYWWohc1h3IUJOPW5fP0xtTT1aZ2goZGB2VWUpQlVyCis+QkZVWDgjYWA+LW5CSlpNVSYmV2dAYFNiK3pZYTdQQTZ2MWN2Vyl6eTJBKjEoUUpweG51VX12NDhYc1VfXyMtU3c9bUtvUlNvMk5VV21NCislPjAxTGVRRnEhfTxpKXVrSE18diZ6NmNrPy1ANUNCKjFLX1QoMjU+cilkZyY1OWxQdk50QVckZW5CZz93Jnh8a0V5IVZXfXpBNURnciRDCit6ckt6Nkw1RTFJJjUzZm8pUzxVIVQlVV83Tk8jP2FvO14zR0VjempkND1iaERRQmhrVnVUQnhYJE8+Z3dUT0lPOGQrcnFpKGJBPktma1pMCis1aCgoO0Q4S2g+V0I8ej5AZllDN1JIYngjJGE3YmxyQDBjeCt6M0VOblMyIz5mNSFMN3QyQntxV2UqekZeNWI1QVRFTjJFaTljTihEJSYtCisrVTsoTil9WjZRQ2A7SDA+UlZ6UiRpXkJOVl5je2kjOU5rK0pJXnFsZGpZYFVVeSFHT1U3LWo9bFA9fD1VVyErUHpgMXA0VD1GMF8oa08hCitwS1RPcll2NGM8byRLNnVgUHkrPzVVazZANlg3O0NRWEJmcGtPRE14ZHMoZS13PVpXLSY8c3RaSGdyaDgjT0JKXitMTitjNHtPLVc+eHZpCitZTU5YcihLSFZTMiYrfnd1UVVQPHgoUXo/ZSNlXlA9fjdJdChUWD9FbW85c0c2WTJHU0RDRWtGaXRWQ25rMkhgcGx7WUo1ajleUVhVQ2MtCitqYENUdWREKkFMYHV5I3AxUlUwSVRVNEVVRjJCJiopN3JyPzl+c0NWdnIwQj48dG9EV0dAclRVO2FlQkUxdlBYI3RhNDFGZEtnSmpxS0dPCitAV2lvIzVATiswNHZVZE1UTmdGcz83dGdxRTQqWkJvbVlDMzRlR1lXPF8yLWAoZGBKeCgmPjExSFphPGdhYClWMCtiO2Uoc29yQSloKD5ACituKnN6MzVKX09BKkh8KUg3TnRPKkxLN3BaeVB+TnBsKDs3cnd4USN2JFVtKHFLI3MjfXpqdT5jN1MpMTtSWHlHYnpuVmhqRFZFUEBeS2RFCit3eEA1ZzVRejZPKTYkKzNkb0RiTHpTRU5SPUchNVYpVXYzaVVIfmxkdys5XldIM2xKPiFaM0goLXp5eFZNU3VAY0NiSzQ/OHVJZGB4bjVhCiskJi10UjZJOXxndGlVTjtraVomOElIZHdWU2JNYzZCRDhQeEl3TTJQbWpmRWxxUj9OUGlEclExeXY2SVk3cTxtYkFtY3FrRjJBUkhZJnRaCitqSk1hOVc3aGxiR1NeQHFSaTg4NXt7VHVOMmVfKjhAbVByd248THdeTGE0QjQxXnJvfj1DY0BIVExvQDs7byNONUh6PVdGY21vPm50VjFNCitlPyktT143RXRVSjBqdWYmJVlRQT53XyZoVkUmV3J6OEB9M1MmTHlRfXhJRyEkUzZPTj0hN1VCRmNjbWFBUz1TU2U3REJXIT4hJk8kUUh3CitOaz1fMmBkY0hubVlhKSpUdDwkKT1kOyRiZHcwQjs9Z2ZqPlE2VUhNQnMzVm54P1hRZWwhPis0a3wwVm8zPk13R280aUJ6ND90a2xAcUcmCitWcjM1VUpSO3w1T0RfVHhybVhoS1Y+X01PJUlmTWZBcDw5S35OdVZiSTxEPiM9UTtCWmxrdHFrQE1YVGd1NjheX1kpYmBSdEU7YSY/MDljCisjeU85QGFgY0dqb2k4eU5tM3E7TD96aUI1dHFiNlFYVz84UTB+MEhQWklNcE8kNztIRiteViNRd0pzKVgofXNCJmlXdkteQyYxZil3Z3VKCit6Q15zeipteUBRQ1EpTlJ+Y0lOUjwmRj4kT0NYej5NSiZiX043TVFvZjdFMm8lNn41eXI3LT1sTDRTMDVQbVVUYnpncUs7MCUrU0x0empiCitwPXV0MEcoQD9qYVpsWStAZHBGNW08UE5nO35VYjZ+U3VAdHQ+IVZAWVVGbHBjSG1tZXp0QGo+XnZEYkBEdGZ0TmQzZkwkfUMhS1J4e3UtCitXfEJ8emheZlgyM05kRVhYZ29tVU5WVWtEZz08JEpfX003WDQlJlpYV0pWN25xdUJzVXNCc0lkanpPQVIhdkhyYyhHK3RWSiVrQnA1VEtRCit6TTQlc3VTVzUjMTF6KlZpd2AzMkZqWmZsV2FFSjt8M311cEJ0YUNJeF9qVXl5NVFJXjxVRFJsciNmZ0M+RVQ8NiUrY1ZaZGtlTUxzSF5DCitnfjJKLWVzcGZNUGNxfG10bm92bTA4QXF5VV5pRE89ZnM/fXBBRVluOUhsTndWI0dGam5rUHFZUExPSVd1R1YwfjUzVVVBYXdOMHVTRTB5CiszRHphUk92LV8/QT5DO1I4ISVtKEY3VEZpTCkoKnk1aHF3QD9HelRYbE5kKU9XPiM/NUdLeWd1cDt9NkdHRU8rcTBMK3Y3NTBIT0ZGclZhCismMWAxTzs5cG9MY2h8c2s9OXNLYW5aeHYwdHYwYGxgMyhvZGtqVCheWn5qWjVYT0Y7PWApQExKMTZWYnBKLUVMTnlWYCNoQzNLVF55Q3o4CisrWHtRWXlBO1glV0shN0d6UTJEM2Y8IyFtciV+Rn5ifkdHb0pWd15pYmJfbSpocWt9aDZyNThyazg5VVBXVjEtP0pzUm5qbmAkbzBsdl9wCitaUkMteDdGZSo/VGYhVk4oTSl0KDJQRjhnemMoYnkxQXtyLWhTQEV6MkUrSDFtJGFxODZfZzJCVXg8WWpzd2xqRmU/Vih2UUFveVYtOX1pCitNPWZONE9DWUJxe0xJbSVQZzxmR2lIdG5ZPHcrV0V+X2d8Z0QkaWZ3WXJvcnFKQT90NVVCU0ktUmUhck5jRHdzNT9ONHNVNzJ5UVJEMjdiCitWWEE7cXRRJlBMJTxyRVljPmV0b19eNyNseURjelFlVzVAPnxQfHFIaGlBb3J3KyNgaXw2eVVqdSl5cClkJnQ/JW8yTUZgNXZocTA5WHlKCiswTjlNdnJXVHQkfU9xMiY/UkEyNiY7KHxYTSpoWDQ4UUNJQUJGSnsraDRjJUwzRWY0WFo+cXZ4T1h3MUJWcEkhMDNEcjhEWnptYjZFI1RICitxKnxQRDVtZ0gmeHNsWjV4ck4tcDBoN2c/Jn4xc21nVks+YXZ4aCFfZlBeQUVOemk9S2hDY30/Xnl9XlUrdjZ8NGBXcERnVVVLSzRBWjYxCitCRyUmdip0RTBubUJ3TndgM15DaGMqSzktNUh9R3Q4fDN0cGQoeCt7YkojOXk2QC0pZEBVQ0dyU3I0MElLb0o/fCpoXig/NDR+bCh7alZ2Cit1SEFifj16KzFpQDZyX0M3dDReOGlCTWhRQ1RTYVRoMjhjS2ozRF4pOCpeMmRvPCtAYSpLTXhkJkFJT19HM2QkbVJuNG11S3d4cGlkZ3NCCit1KXlQT3EoNG1nN2MtYDhfQG5rOyM4dHJtdm9VKD9ITlZAbjZ8LXJsWDk7LVhxOTdzI31oemdCbXJQKj0tKSVoIVdKPUpPMHdjV1p5OVpACisycTNiVHdDITtROyhhS3EpOTFDS30zQWNLRjxVZm4+ayh5RDEyPyF2ezxzVnN6WmYmMG8yYk41MHs/e1UreklmbzdmZkFkcSMraDFRJWBXCitBfG49NEcrWSo8bURvY3pjd003cTh5Z3pocTlwYzZhYi01R0txZTktdF9WRUZabnxRPURmMzFINUJSa0ghaVVpNjd0VG00QEA5VWM0OyUzCitHKnt7c0o2IXI+cDlMLXlqPklaNFIjT2F3YiQpS1Z7JEpwMiYmbk96akEqQWIoRmE3OHQ7YU4kejFkemNybSNXWio3IXpQd2hXRWNnRX0oCis+LTJwM1kxVHhsJVJKWXRuMlVoVzk/NCF5KVFhdUBhMT08e0V+MU5uckQyTVlCVnEjWiNmNjNidHNWUklGcHN5cnl0STRgS3dlWkQyWlgwCis+VjJ7U2VQNChJbGJ8MW1HdFRNY05WKCVSbGowUWAqX0UyZTc/RTdkQ1ZEd04jeUBLVzNXKEI9TjJRN1FQVlpvZyU5RlJ7UVBQPEdLKiFKCitjTzE+dmYqTW93XmU7bGp5NXlGI0Z7Z31WKzVGMzA1aH09NSpWQyQ/cH41RkpBKClFO1QoQ3JMa1VIK3drTUpOM2BubClRam8zQ2skbl8pCithVmNNMlhANTNRd2UkZkpAPGdDUDB3dFlscG5zTExUOzEyciFrUSlLdE1sOVpURUpZYFVOKkJXTnx9d19Qbjx+PExZO0V0ZV9+S0VuJntDCisqZH5afUlBTHBkel5BWkp4OElrcnV2Q0ptdzI8LXx3KGF3UTcqPzN4KkMydiNoel5UNz1FVHtmLTNyR2MwZVZqTn1HYiV5YW8jajN5KWxCCis/OyRtOSNfPUA+PktzPHl6TEFSI340cmY2JStDYEkqXiV4SmFlMyZLPmN0bWtBJUArNDNDd2tXUGU4fGNDR05qITg3T2VjVGhfbE18WFI8CitMKGR2Sl5TRzlrKyZWLVRLbUAqYW1RRHBXfW41KGNBKmpwfXkzUmd5IX1QN0YkezhpfE04Kit1KVNuPlVfKW9nIUpqKGwoVUU/SWt+dzRrCitSZWtjUWpRY05hUExDMnRNLSMwLWhFRktMb1FDYzNCYDduKGVxK0BBczIlK0k2QWppcDl4OFNmK2N2NVdAPmhVMjZgPEU3KmZ2JjFCckJDCitvTSNGOG8maGxKUmIld2diKHdFbGJFYmc4cHc+eiVsbkckWVpoKFJHYyRnQGd1Qn5AeUc5Tm4+SkwoJlhsR1RUWTVPRH4hOUE7JTNNcFpgCitNSDg2TTUqbk1JRUtjVnF3czxUZ3xSQFhEYGIhb3wjZGN3OFZwJFFoZmdaSUxYcyh+Z0Y8KmlBTGN6UkFyVUk2VDUqI2AwQGVmRkhaRVZwCiskZkppQERLLWdVTiZ6Z3FhQyhWeUpJPitodFd0cXFwPGNGaVkyMj9SRjNtfj1JNFMrSVdYWnZIfG03eTU8bVhSQyRQblEkPzZQKyReX2ZxCis7dz89MldLXipWX0MxVU81Z1paWit6cSYxT0BuI3NtNnY5T1F5dHJncWh8dypmQGokRnxfcT9RZXFScE8wK0F0PSEpVDJxeFhmdyZCJDZaCisoPD90S0RHdEJzX2d+SWRUKG8mSGNPPD5INnF7UURzX0VkQzc+aSpaYn1mbyU2M0Y1cylpY0tGWXR7OzdwbzlUbkZQcUBRKUZ0USghaHtICit7JCpyVSlyVD9aMXVSU1V4ZHB6bjhlUEc3cjAxRGpRXl8lI0orTUN8YCo3NSk/WX5GTXtoc0NVSDMoYTVpMHAwQDkheCl0M0JeVitCRz5UCis5aHt2azhrSjN3MUJlMEJGUngjSGVoQ1hxK1Nwel4/emp8VlpULWItbmszYXE+X3ZHVk15JTRNPVJeJGpMQDxwI0hRbkYzaChrdE1YU3ZzCisjYkMzfmsoSE1QcT1aMjtZeVI+Z21panhwP3M8WHtnVURTeUtJM0dDK3VhOXJRPy1pc2klUVhGYFlsc08yK1I+WGlXb2dQXjBQTVlHND5WCitsNnB3NlFPeSshbnA5PzR2QWcjKHdwP0tJPlczPm85NmYpeEQzfHprPEBDc3FIYXpMXz56UDs8R0lPU1lpcSpXISglMUArZ3h8Zn03VXtyCisxRDBFUFVMTG9fdD9gbzNQcWo5NyYrOENGV019WiNSRXooJD5yMWIxSWpPNmQ5JEZ4IXpOdWg0VFF5aXVgTFhWNnB4O15lO2tzSyN1QjNLCismTmM8ZkwxfnF3KzRnYTRBdkRLITxpfjt+LTxCal82ZUl+c3pebXpQSm88KiFHPEpOT0I9NTtlMDJ+TFYxVX1sem1IVmljeWJ+Y34wbnl6Cis7X0FoT3ZKK0tyYkt7NDEmTys/aFN3aEMrRHlTRUVPOXJQayY2ZjRzZno0QjwzQ3BwUnlMSkg5WiY2Sn19bmh+UnZrKUFRVG55eyo1VlBkCitHQnJGWkc3PTNPOSRoNkB4IVdRUH4lYjBDWE5DbiVWZnQqaUlCUW81OT1LJGNofTY7I1luMVJCKF41UnlSQGBwVEYkTntNaEArOU9oeXoxCit9I3tFYUhAP0l6ZE4+bDMrWnVwUm9ZQmJldCpFa191eSV7eGEtPD58NE9GJipxNDFtKVU0NjxFPkRKQTNCKFF0UXFPNytGP2JLRGxeLVhjCis+ZWwjWC1EZzE2dzxrXmo8QlJ2S0VxSWtMaWU8ZllUPVFnV31ibnNrflRvWmh+cU02TX5tP3MlQSpyYDBzd2B6JU9VekRxVGh0fWdUNHdLCitFMzkjOzZKOW9zaCg3KEFkak9OZjluZSZ5NXJCMFNsS3VGPWZleDV4R20wdy1jeypBcTJWOUx8cnZ8YTdjT2dpaD40XyNqWkxNXlRQYHY/CitUPGJeSDIhc3krejlLQVpuMzZuQ0R7dHo5MWhiSE04JHd9JVpvNXJ+XjN5c2RmNFZCOHY+JC12YzI7RWhlcmchU2hCfE93SWMydUcqd3NsCitrMjdRWFchN29CWjglZzc8MkBLX2lRT1MwKDR6I1AhWVZ0YHdANnFuRlNCTkdudmlvQkxuJm09ajIkUHBIfk5BZllXPCZTVzZtOXt0ZT1qCitxaXxGRUIzaCNUUT47QV5HZGVLa3pVMzR9U2FsOH0pNnFfKihrbzR1a3ZwXkRvZTJtSG5VO0l8STczaj02WnpAdSZYdmc9UD9uMTZBdkVoCitZTyV1NDFNcmFHXmdePEZrTUBxJEhsNnNTYVh7UmpwQXxnPmMhVlA7QmowZ2dDaTFEMVEhUyRFdDcqSC1jRkwoZ25lOU9jV31qdTJUKXcqCitNVGIkbUwkUnZ0PC0kalQzfDZfcmZCKzJRQS10N2BoezZEcDRNbzUkPms+YHpNMkcyVj5nKE9FJmg1IVcyQVNiMHBXZjFsQ3dSXjhUVVJjCitPMzZQPHlJTUdPNShLLX5iRyNGKVRRfG5CQThURyg/K01hNGotfE0oT0hzSlJlQGtNRW14MipLSzckK1c/cGVhOUppc3xmfHVTQTlFTT1+Cit4a25sd252PnVkKDcyUk1TaHJGbENxaWlxM3IpQW5nZzhVcHVxRVpaXkNPPGMwK1clWnR6IXx+a35gNVlrXktrQ15yJXw1Nk4mVElpOFNvCiskIXMxYCs9eUVCdzQ8XmFpZUN7VEEkaEIqVktmeHkyUVY4WW1aWj5JOUZNSVMye3BZYylvTzImPUZxJlFHPSVmYmRFdUk4cG0hMjQkOTtsCitKO3FZI35WP3pKI0lFdCFnaD1uKSh4Ji1UK19XbVN0QHlBdVZDaUlhZEF8QUxePm1pKG18TXlqPmc7KGlLKCpFRU4xX1Z8R0ArVykyXyk4Cis1ZV5MS208JDhFXlcle3pyYikmJG4kTTkpUXRMcF9EfGJuJDZHOVVAeGp2ZENHKktyTEZYKFZien5XKUBVZl9eKEFpLW1yV1NNSX4/eWJKCitqV1dYc1loKmVjaGhjVC18UHs+S2ZJRnlsKCV1XnxnQXhoPXk0WVJXaCp9NFdGQWByS2F3MGNjYXFzaEZpUUEpfWhKOTJWXzh5TnFIYy1SCitkRFZSRF51NypPZW5teVopSUVzZSY0RylTdiV3PUUpNiR3dz9lZiNvWmhaPDcpeUZwLWBxaTZtbXQrSDErdHM8KFh7OHJ3SCF4N2tiRWpHCit7UDI+bllHIS1vWVBpSzV+c3Z5fHlHSiEjbjBBZlpOLUZDKHo4KF9RfiReUDN6b2tqKCEkSFcmJFBMdEpFRHZwWE08NW4ycl9OYjxUQUNaCitsaCNscllLZWkmQE5RYFJaSVptb3M3cCtBSHQ9RkM2ZzdVSD95UWQ+SXRiSCVEMm0/bG9TZSgmcH50eHEwdV80OHtWVlg7VFpKUmo4KkFeCis1YDdkcHNtR3wjMDc2ZDluRTEtXz5HdThsQ3skNEdDN0hfaVdhI2tNRiRTdXdHam5CSk02dl5fI0ZJVTM9ekdYaTQkMVZBa1dZcCpKbzM+Cit4M0tCUzlSO3FfWjVsWDZ1Q2B3SXJfMHkjMEVHODJiOUJDMnMtZ1dhP09aJSt6Sio8eVktXy1aeTVIfnpaZHsjd0VZQU1YdFluNFQrcHReCitaPUV3V05uODJ9ck5sUF5jMUxtTkkheHM8RzstNXs/O2Y7Xj1qezlad2lSeT5xVylvT1N9M2pAcU53XkRhZjV9Zyk/WVV0M2xYWHpOaHY/CitBaT4+KF5BeFFBbkdFTzZLY3YyK0M3bXA1JGstUUlDMnxrKiRpRmJ5THUzP2p0PUxfYyViezxSfFAwa0Y9cDNMLSUlYHp5cDRDMzw0Pm4pCistOHs5TXpkVk9iWC1NcXN1dHFLR1B8OHF0I2dka3gxO0RCUGNBX3xhVWd0ZUAtaFNfK20teF5nRXchKm1JcF5wU09lVX5POyl5cCs0IW1BCis5Q0A/cEY/ITI9KElmKVFie2R8WSh1MCRtRlZzfTlNTXFpPm1DPGtsMCpIKSRhM1pwUD9XfnFqa01RNGNSe3UrO0BZam8meGBYYkZAQH0kCis9M1k+SjJRVSNPMGRneV8yTlhrVlElcXFgWmxybDc3Tkx3eWZfKm5Zcm1HVnZJdlBZM2dGRlpwJmAlJWo+TiphaWYwa1IrPjBLTjttOFE/CisjP1BpZXhKOTtHLV9yT353WEpwQTJRME9md05KMXBZJG9BPjdAWSo7XmdgO3pAUVpnN3s/IVdMelN3VSlUV19GLT9WT1NDbGhMe3UwJSRUCitmN00oakMmVXllTCFjKT8pU0JXVTRhKiFsc097R2dqc20pJUZmdWtZd2FlR3xwKzZJcDdTJnI0OSo5MTlYeF83U0RsMGc1QT1rTiktQmM2CitmbVdrcSp3WVBJWmF9RGpFZTwmRXYzekJrTHZnIXZzM2VRZGdASlBANkBRKzdTcDBaQnBDKCVMdWAjbkFWT3VqT2AwPU0+QyhRbyghejIoCitNfTRtXmF0MnctUkZ8YUhKaCo0TmFoJUd0OSg0IyVlcEdtaGxfJnN4RkUofitoTzRYMD12LTJNbFg/P3t7Zyp7MCFwKmpJQm1QNFcoYSFRCityKDtpWnxLNXdqWGRoI3lFY2Z8TFI3PlpiSzF4QlJ9dDw4NFlZXnVUWm42JH5YS0lSYXBJO2IqN2xgVGV2PEZJRj9GZ0RDZGEjazQ/UWFzCitTSXlZYHtjeGVEZkghSmA3NEVGNEVDRGhzI0xtYVBzZUZtPGp2P09AOSl5dChIKyhQa0VYcDEjVTU/Zzt0e0hGalAlSXZuM2lINnR9KUwpCitLMFc5Xlh4MUdHTDNLIzhtdkQ3ckl0QSsmKU1STyhuYUdaKT40O0VQZDZtTlM0bWc1e3tfbjN7P2lBOCFwRjA7ZnVHIzNZQFM0I285UVBiCishTmsoTTQkOUpqSFh3WFNlbHc+K2BMaXIwTSlHTUM5PE5FLSlwXntWPTVCKHg5Jn5RYihrel8mZnZEYFNtbmdVJkk/ZitEVVFHVnIqRVJRCiskc3ZSakJiK0xRSDRUfkFLKkE8aj1QNUJZSDg3WXR7MThiPz0tYCZiNWF0fGRHbjEwWXh9UlVXeTtVU2FYVmMzeT1fSmBHWSkmUnV3TWk3CitvazVIYjQxVSt6UThoP0Q/bEt5KzwlVHZCIzhfLTd2Vl9HV1YwR1FBd3s3LSRLUzxJSFBwfHgoT0RuLTgjXldzJF94bG82UWJJcVlrZCN3CithYGltM3RpVEo/dXdlVHxKTTc+IWR0T15HYztsbkd0UE58PWdQaHNTSnwmJmY9fG1QQ0U1Ky1nSCh0QXNrOCVoVGZGYnxPJnJncCQ/PFJVCis4eEpLLStne1Z8PUdLK2lZRjhaODVgRyhiYy0haitEK3xVPV4pJnRlUGF9eFomIUltdnJuVnpqOEhvV0d3ZV5JPERqME11VT9oa2wzV24yCiskXkF1PDRjamBReWdAZjxhMCEqT2UlbUwoViFiR3MjSDItWWo3RHM1RWFYeGdtNXpRSGtjVyUhI3hRQiVSZHFGWHNqWjJEWl8jVyNMSEc/CisyK1FaPntZZnc1eU8lK1dZZF90OHVsbVJ4TVh+VTNmb1lpfkR4LVBwPFN7bkFLNyhBJDR5UkhAbGEjOW14VGkwJSpEMG9zekZ0e2A9XkZiCitDUmRGKEhtYWU9czRXK1pzNXczZ01WT3A1Vm9kaCg4RVZfK0U4TjElX1kjX2htdCpxQ34rY1BSIUEhQTk7N1E5SHlHJih+YnkqZiNIbmorCitFY0R2NktkSmkmI2ZQZG9xX0MhWXROQHVufCpkJFItOTk5c0VMfDVuQCZSLSVWYVZ9aCslPyE8OV80RyUqJHB4PlNEZygtYWNYT1h5QHlMCitQUU0haX5qMStGX2gtWihzKmxYZEMmQ3BnLTVwI0M3IzQzUHdVPmJqcSNSdmozTjRfODhFWXZpTSpIUWwjcSpZXn11JXglZThDTSlAYjJsCistQTdLWiU4d3lLaGJLTSh1em5hI3Q7KClUSFptRmA9RCs+ckNRZSZhZXRpXkUzfmM5Uiszd2B1JShxZkYwaXQqcH1OYSZZM0Q/ezREMndRCitzLXJ4TUJudTsqKDU0e3dPJGBlfXdHKWFJSF9fJF5NWDdVfD96O2xyUFVzcXlWXmx7MFhWKTdGa1F6O3JtejR0eEJSPHE3WHJVbVhkbWdDCitNX1l9QFR5UXMzP3gkMmEmNl81JDB0fipXPnNvPCV3YkQ4aXZJQjsrZiZiZitjSlhCUTJ2Zj9AN2RAZkxwOTd8aElEZW0mQmJJdnZqSk10CitvNW5DeksrdCY4SlA+ej5CM3F0RWBmVz1aMCk/TVV5aF9Ie0RXSWAmdy0xISl3cTd4N2gyNkprMTZRUkY9LXgpYnBJUmlgUTRVKTlUdWtRCis3aWxQejtDcENCNG1EcmJBdlAxdCU/fj87JFh2NTJhZz4mQk5pb3ZDVChqS0NgSDdDO14mJV5ONEB4Mnd5dHoyKF5uclVJTHNDYFpmYWRaCitOVTU8PHptYHl2YlZqJj1WJVZXJTd7OVRKUG0wXi1NeE1EZTZHI3I8X3Z5TyZvfGxgKldwR2RuMWxEXiR7JF9tUysxMFNgempDO045RXgqCisqJU4+fWZIR2F4K0hTKTtOWCQ8X0tIOFJ9bzNsOzN3Z1dwRzU0a3ZDcz5qIytCTnlVO0hOOysjQTd1P3V0SWQrZGFhckxhZmElSGZ6TGxoCitNZ1IqdWRZcDxkVyVGbHNpajxRPiNYPHVqITRKS1NKQjI3e14pdyk4VFEwY3V6T1VgJF4hVTUzakprcEteR0U4UEk9VyZ3eFlQPF94N25RCitBNHQpK3dTO0JAelVhPUltfSUzMW5UQ0RZR1JBM3ttUzB3MVI4Yms3MElxUEs+cEd6JUhTWnwqNko8Jl41cnUwfTk4KTJHPnRrbV50UnQ+CitnQlNLNWZgN2lkfC1ObEA1TzUmKXNmNiUhcEZCIXheKTBhNmdkdThnZSMzQz49V3ozPityVWR7cUNXWHxXeUZKWD9STGp6JVhZXm5ZbTg5CithNjtVZk0xYVhZdFlALXZQbD49THkwMHg0NWwpNk1eREhvKDsqKkA8cnFIakVXTnJxbWY1fDlvT2IpSFkldDJHKkQwQ3FVdmxOS2Y5P2taCitPazZyVTdqMDBGPGszWWZUQ3s0QVFMNykySn5RbjFtUFNKQzJhcjE8S3tvTWw5QCpUOWxIIW1RTXk0QWFLa1U0SiRRQ1JVM21KQEFNdCRRCitJSU1OPEJXLX1tV3A3RURENlElU1FPOCQ3N2VDOWB4UXo5dzlrJC1neGBSVlMqaiVOfUpRTD41NDwxYkRFLXROfllePEF3ZHp5OVlSX0Q9CitVMG92WU1rTnFBKDM2aGJfMkNkJTY2Kmt1M0FJTEF0RFZjJXl7NSZ1ZVNRI2gwdzBrbG1xdm9qR01RMiNlISM2Rnx6Nkh7VWJvRFNGZndDCis5X3dZQzZaNGJ+S3NKI2ZYWCtedDYqRVEwWXBkN147cD9qSSNxe1pmI1V2YmlCQistT1RKdT5+QGAreTR0MmE+aXc7cCMkNCVuOWAxOSUlCitGRmAhZ0prNCZCWkQraClocmJZcCpYMyhyKitkbGdEXyhiTEd1QnpFQWIybCpHcDIodFY+UilOWiYwZChiRkkraiM1UW9UUXR0TUNFcy0yCitgc0NSJiZ7JHlEYmhxLVBabXlxIWo0VD9vcmF3YkQ3PXV+TExyenBVUVBKNTFNRXlYI2Q3bzkjUCRhTVRKfFJROXFsSFd+dC1DTU5gY09lCitiMVdzTjJgTipJbHRwQFF+KUt+PnM3ZlpgK2h3eXR0ZzB9S3wkeFZPOEVfbGsrWmthfDE5NXIhdV80WXIkSkkwJENVXnElanFRZWQpN2UoCitfS1FwTiRBT3VFc0xnUHVWbCM5KDs5NnNBQEx6SlZ2S3U7N0h1REBhZyQ3MVlaMSkqRkhwaTgmJlJCUGByN1RpUTZPIz50KHg3K1JJZXVrCit2MVZ7PVVrfSt4TGpIZUdKMG4/WXJ8WGhPezwlX2skbHhZJVQ5Y2hjVzRrM2liJFAocTtSP25ZZjJCdl50XnNhdWZJUzZrMChoZm5+PChrCis3MnYmcjdpZlk9UC1GS2JQeXxBZXJJQmRkQ1BHaXpOaCVGPjlXc1hfbD9iPVZZLSsjRio+P3E2ZzNvS01VUkxYKHMzc21UVHZ9WVd4KSMwCitHQUkrRG92RXB2NSk/MDBDcUExMCp8Kk5CPzRLd3xOUGxBbWglVVM1R3xkajJCWlBmKXFQU20yc3BLZVgrKzI9KDQ2SmdvblR0Z1huJTYxCitNYDB8VHFYVGU5QVVwVE1TdVB9N2RYSno3fkRBdVRQUS0wVW1hQyslbVo4U2hIVURPWWlJe1lPZENrYyFgJGg/PWReUERvVD97e3x7MCphCitwXyNuWHQjdnY8WHpzSmtLZTh7S1A0Z0VnPE90RDtwMldVViVNTkNXKkh4Pj5UMz0+WWZaMzYqdVQ4SXIlR01RbkpzdzRiYWBjWkkwcjI5CitiKnY2X09ecip+NERtXj5oPS1Sfmc3UzluTkQ2K2pISkIkP2JfR01JQWpvPVk1T0RYIW9Lb095dzhiM1RYMEpIaiteeTFuKj41OF9zYGUyCitmMiYlYWBgMjh5eiQ5NmpEanpANERFfTJMRHQ3e21fMWxiR31CbU0jWig9V2hjJUFudmQ0RXpIV3k+a0okX3A8aTFYIX1lZSNqQCZZalhHCit2YD9NOT5vVn12aCZiZk08Nz1aUGQ1TWtsP153YDhxJHJeP3ZYV3c5eChNTV4hO2dnTk1saVo+UzhVcGRMc0h4N0FlcDw8Nko1V0QkK3NfCittZTAyYE9hPHdTYzwoalFaYz1Pant0JlVUV2xqTGBLUUtIeHBmV2Q7JDh+QklnYlNMXlIoZSF1fSR9bmZCYndNVzBtdjc/Yzl8WC0jSyF8CittWHJlfGlsYlRTN1o+cCFGcypOPnFuWXgoYVVeQX14ZV8oOyV3OW87ZFJgMURWeG1XdTJfOSFFI0hZeUVpKklSezFMOTF+ZjBkYDt2PkYxCit7VEV8NjMzX0pfQWttRWItcHV5PD1yWigjLVlQX296PX5KUVM3RzwyOEJ7ZERaJU8mdSN5QFJ0NyMjTG17Nn4jISswKUwxaUd3WmNPRHY3CithT0k4U3o3UnBuRThsQ0BlZGo/fEd6JHt8TVByTTxOblhWQHdfSUFXMTFYfkgoOHVkYGVFN3UySnhfaGFXYU1mSjwxUE5IbEBzIWdGZDc5Cis0Q3lFUGA7S308XipJMDA5PyFmXzYmKTNzbWZ0IzUlSUU/KzA7TD9hVzRjOz05WVppbU40fiUyWmI0cSFESip7fTdpZHdUaGY1P25qeypXCitrN1MpeGtPa2JJN1VeS1pBND80QSRKMFJvRDh9JkVBVzQ8byR4Q0ghMzxxdG1YdmVTTlYpX1EpLVFqRitCY0tFXyR7TVQkX09ePmhiS0VACitoKykpcW9BUTYtNXJlSGJGK0x8PVowQ3pFR1NffnU1d2Uxe0FpXjZIYkI9PFlmM3I8M2lhMlUxU2lsUHIlO0NrSlN9UnU3WEl4QzFKKiZzCis0ezl6diQjP0M7MzExQipjKTd0eyl3RHJKaTFYc1MhYVpNRTVBbUUlX0Z4cnJ1biRjZnR+TXBuZFFsTWROfDRORlBKWlh2ZE8heipaPCUtCis2KmhqSTVpd0g9MlUyT0IoWEVCendiUEV0ZXBsMS0zZm1raHRgTF5NdmtAKWVJSXcmWXE5eT5HcUFuUmRYMmtgIVRgQSY5O3NqQ3QjV21SCituOylqRnEjbzxra2d+ZjJHfWtxRyl1T2owXl89cnB6KDdqWk5uP197KFI0VEhpVVdHYXlfQWZ8SHIwb0k9UWQ8TFImciE5ITt9fClNWWgyCitHJmI+YmdpKklqPndMSFZxPz4tVVItb2RnVFZPdUI5O21OWmVtdGk+c0h4cyUyPj1NJXVLdS1ZVEMpejVBWXdtZVlaYElNWEdSUmZzIUczCitSPDtoK30tMHNIQH1UPn5QQD1zJT1tS3FjO3A1bGA3Yzs1Nj5qYThTJEp5PitxM197XjF4YGZqfU1udFhpfHpnNipfYXYqZVgoQFU8Z2lrCisyRmpPelY8Z1F0RDw/Zm5BfkNeRyZobCRRWUFeRWt7aV9VO0xjVXZGSEBIOXBGbCZNejhXVXZ5PFFvWWFAN3I+QEtJWCV4OXVSeG1fbG1XCitBaHt3cHprdXJhblZZKkRRJGpHWU5KP09sTzlUN2xxMUV9NzV4T0RiZVVwc3dUaXdEZFE0R2s4e3FodUpYbT5DajMmdWgrMTZ2P0ZMWm1nCitTVDJpc0wwOVdFSVlQP0l2RUp0ZHl4NitFeVNqUzd5fks8Y1coMWc+WHhxQT5eeVJsYCZudmgkUzYyOyF6PkhyfGB0c29lPTcydHtjeGJjCis8Yyg4TkNSdm4taXpSYytJIz1NZFM0S0IodjNSfTc/IUM4fjV0JjtgS0lUZ1hGbVJEe0E+YkJuMFV0UChISTdFfHpQeGVRTDN9eyp5cTY2CitvPWpCNEVEXmFJWiVhUH0+MSpraXRUKGojMyhgeGF4ZHlnS35NdWBiUGU1alVKbiVTPVkodnE/OzZKQ2RPSkVwcT82e21QWk4mU1d0N2t6CitNM1NgUzgkRXdTXmM/bnI7PDYoSF5lJjdWcVYyem5DRGlxV2xsPkpsfSZIOGMyTnpWdVVNUSsyYXtQQH09R0o1M2FIb3BuUnpDcCo7aCFnCiszZiY0YGpQWVNGaXk2VClrS295PDZQdnU+K1JAKXJwMH0/SkBPSjhYP1JEfSUyNjxSNDw5cFFOZ2NeSHs/WElLOW9oYiliYzdJZjBfKzVlCitzTExaYlAzWWMpXzMlTSFPbHAyRGBSRmlOZm9AY3dTcnE0JWBDODdJK1VZam44NkpyPm5CTGtwSzBHS18tO2clOXAyS3NqZ3pBeGYjU29JCitDQi07cFE3fjU+SEZOUElxUkE8Rkp2TUw8dXooe3UwYjItWD9BMH4zNVptMldQODxJNGwyeXQoZGVBO1Q8a2pGPHFkWlhPampzfHFBVDQ4Cit8PjZ0bWdUKiRHeSVXO1N3JkxaPXZYUChtNW5gNG9meDN7Tm8jV1FBdmYxfCpPLSZ7PXU8eGwxNSNufVdRWl8ob35hZkAkbHA1bWokR09oCit5Q3prdi11fGYycFQje0ZwNzI9X0xeMT1INUQzNnlfRkZze3QxM29zeV87RzRQP0ElX1RmVW56fU05bFNyVTc/b3s5YllXRVUrbF9wMXd1CitIXlRXIWhsQlYpJmYqJSUqYlZ8a2drdiowZWxgKnEjSzEqZUhFR2RRPFg7aEJfMkF1V0VIQWlldHo7SHlwVFhnbDVxdSM0IVV9fXMxO3FvCit8NEB4WSUhMGFFKE9KcVZZU2tgNSRPS3c+XjVWXlZIVFJsOWtPbS1TM0B1eGNAI1NifnZrSjcyMWRXbFFxfil2NGpsRzE5ZEMtI1BOTSN4CitsJCNnbDNiWHYmbDV8WkYhQCpLO1coRGQ1OVZUUEUpQCZyeFgqdUhkKmZfYEF7dWRhXkU7I1F5O3pSQko4eG5lTEQ8U2wzJj4wdkgqUUFACitKR00rRT5yU3JtKjtNe0BxI1B0X0FROGkyX2JtUWRUWG8rYmNvNi0hdXhJZ1lYMzI9JipgTmFJbnExYX5hNDwpZ288YndOdVl1JTd0cTlvCit2aFpTWWdZMDtsPnhPamgqeGY5QCFyTUZgPDdpU0BPY2FLbTNGdEkpal50JV49TSFac0dRPm9fXn4/dl5QSWhKe0xCUGpHUDAoRDdJLUhhCitCQSRBcXZWZiV3M2NwTEBubn4le3VaemNVNGhZam5tbD03UmR+ezBlcyg+dCViSF5eN2dRe21YNXl6c2w/Oz1PZ0R5bXAjITx3XyRCS2pQCis+RFBaY3BTOyU9azZUMFV1WnViNmNZITU2YmJrMCZHLXpxWGxSIzR8IUNMQiZUUGpZZmZ8Wk15JW5NX0FJRkFgMTFZYWVFSEh7SyQxSTlhCitxJE5AOD9FJHZIYV5TclMoTzApdjd5b2s1M0NvcS1rcXZCWE4qJVNDe29eUk5PJXkrK3E7TzBmY213MzQ8Sj5CWTxOYzdGT15Ld18+WUZxCitEMFVnZnZ3VzY8N15fPypuXl47ViU9YjJCJEBhfnxyPzZyZXMlP2pGU20zQ2BzJEMwNGshO3VRZy11eDtUazxPZmxxVUdKVnYzNVktIyhXCis8QF5JeUZlTWFpY09paktyb0FmZVdWSFZlQ2VoK3g7OXRjWTFse1U3UkU3I3VRdD1qaGt+OXp5WnxBe2U2TE0lfld0PWV0Jj1BODxrNzNxCisoI3Ama3JpYjA9YGZtTSNJKXtGZnFGdDhab0tIM0ZyPF42eFJae2dLdW9tbE1QSkBPIX13VVVlM3t7OD9qejx+VzQhMDFMSitWJWx3UEk+CitAQT4zQThvP2AmWnVvZUtEVmglK2AhfTlUJDFpIUkxYXh5TENpVFp7SzYtPkY8dm1AaD1nNGtzUXh2OGklMHtFekU/S1pyLSRtfXxtNWVWCitnX1BZfVBONkk2dmtuSVZ+b19PNmEqZEZqQD45PUFee2lUWW5hbD99O1NaV05+dVBBfDAjRWgqZWsoSig8SFFQRypxanFlXms1RWBPK0EkCitSTEdsQFVLUCFkZzhgQjxnY1dHbTtzJHZ8YH50bGQyYkBVSE12YlAmQX4tTVIjd1FGJDYxRH53I0BEPjhBaXJsMnZHbDVFaDg/dWFVS3FTCis0Tk1MPGlFNHVURUt7Vzd1cHtsbllBPHE0Vnx2e3NYazN1WWs5czg5bE1aaiZJO2lKfXxrbWd6RklkVEdqNWtKRGVBfTM4fnhmP3JAalVrCitSYFgpb2t1PTFtajYlM1pWTTdhNGxxXkVIYkhQRCVrPCEoU1JZfGt1b3ZUVShubGZmRjVGcVp3PTRwfmNCdVZ0bG1FeGFCSHdyT0dRTEEkCitMN0xUfGBhO31JTC0kazhIdk5rbzcyezR1KUs5QVMjYCltKGBvfl9QJmU3SHNYeFNhfU1SclJpYThkWkdlYCp2VjBxeTU5cnp+Yz1zLW1jCis7Tz4hKkxSYFhTK1JrX19BVmlnUHg5fm5eIS09eDdJbnU0JHdUYGF7MSNHalp1Pm9HUEp2RXMqfnh8TmlsWXdSPzw7Rk41WHooPWl5UDttCitlPCg5fHI4SEZsTHRnYkAqfUBhYzhiKklseSlNRV88JXUmRGghbVMrNT43emZjfWN1Xm1nPklZKWo3QGJ0YCM7aDxoaiNHaXQwVWFDTlRQCit6Z2lyMkh1QmhuK0s+UXViPUBtK3A8KyteTC0wJj96IVBuUmJYTHdgeW0lakctakQlcn03RUl7fldJd1chRnxzQmNyfDlpRUtZP1U2UGtOCitkZF8rQlQ8UFhYVXBHZnlFaTNJeXQ4RXQrZzs1QmBOcFhCYFN3Zkg7cUhhWjV5e3NfJGxYZnF4SDV4XmwybT0+K1k+XyYkfXE/fFJBYFJzCismZHdOdVJMWClsPldLUVRjNihwYChxYnEycU9mKEI1fTlpKGh1R2B0TVU3JHc1bGU3LU43V1ZUUTl6YGl7cX19PEJ5Yms9MUxybmJpOT17CitzdFVVbjZIPE5YM0pNMkpydj88SG9STkJwKTt0KnJLYDRDdnVzSTswTTUlSjJRd3cwVTxnJDtWQk4xdSZ3YlcmcmF4I2xCN3VeeThYTEMwCis1eHBnO2dVO3BDQmM5RjZ7TXdSRFdvSChqaSk2KGwjcyNvdTg4c2l5RSl7ZVJjYkN0NSEhK25+MF48UktCZlc5aF9CUnpCaDR1X1hpKTlPCitDT3xFJlYjO1Q/JHRhbTZzQylQPXs5IzdTOyQtTDd9IUhOQyFvcGx6ZW5fM3pGNCE+cDM9XnBgUlZoYlYwITxtfTliRHUjWmxEJVU5U0Y/CitKemFgajNIUyQzblp2KU5aPUMoViFLKGIme3lSJjtSWHE5c2VEVjNxai1fdU88ayg9YV9TUmZhSjhgRyU1PDtnSD1QNm97IXk+Mj4+Wlk1CisyX0g7UClMJDV3MUlAPTt4NnhfcWpvQXV0e3I+P19POUtRSDAwMDA4MFB+ZD1OOCQjflRuUUJiMFBzLSYwMn19UzBCfnQ9RkpFP0xaZSh3CitBRkp4KFJiWmx2MkZLS1JNV3EyLWRkRj8jP2JLNXFTenglSmlDNl4pOSUxb1R6Y0p7UkFvNXtORiktITQ5dkVBTDwken4qcWdlMjR5JHBiCisqaytNRTV+X3FfKnoxaXhmOCQ9cX4xPHohLXQxUmZzVl9qPl5Ob1NsQWclOTBgI2BGaDRHeSptOXBKfj9AUUB8O34xPHo5O1FNemlvQCFkCit8flJgLT1UcDxuZi19I3leUU5mKTtOQCFnSXdfclZGTXdvTCVxcnJwVmNDdkNfTChhYHRVZTwhUCkxSmNBbzlTcXd3dlQ4ZD8qMzs0QmBvCitOc3hxNSFObHw/Q3NVWDwtNk88Tkl6Ozg9UEE0UjtvYVRNKWdPUG5ge0N2bUE0MG5tdWBMVSEqKE8kLU9mMjJjdFhRdk0zaHJtMitAMER+CitUNGVSRllGV3g2O2lgVkdgTDxrJWpHdChecFBld2NSPGhXX1kkVDc3RDlwQ0lxWCNHYUcyeHxWU009fnclMGhhYihyVVppJiZScitQQEJqCiste1lFR2E2U3lSUktxMzEmRFlqKi1VOENeM3lTd1dAIyE0aF9EIXVzKlhwKFVgV2pGa1BFM1dqRTtwXipJc2Erd3tAN0hvbHhiJl97V0BSCitpRHBSIzJvdlVGYVFKViE3SklGWWFDZFM3eGl2RXc3UCt+YFQxWTxNfmNpamBkSXtnbk0obD1EPFQmcyMxWnhWKUNkPE5vOVhYJUQ8VGNUCis5LVpUKShBZjtlNExRVFJ4dnBQRU5rTHtQeFh7Wnx+KztANG1WR0E3fnRHdkBYQGA8OyF3a2lsYCpYaTMrKTwtJEM4ez1KTChrQDNGYWdlCiszRTFeVTNNS09fd2t4dmZseGgkI3F1WWY9IXMjKHZ1RHJmQDcrY3lXKlNSZ08wR2M2NnYkc2BkTlA0c25XNDU9V31OTVctaGNwS1Vyand4CitDUXg9VE14I2FiRDBIKFYzNzMxb2EyY0d8KldLbnkmRWNRXmpzd0FuKFFfSmM0anRhNUB5JWM3e35qMCFEUE9UVXljQnZxNDs5Wj1Rez5uCitBeUNVYXlPOCZJKXhgTVZNJlY9SGlCcnAtQjwyPlFmTiE/JXUrPlc7aFcoSVdOPzhscTh0WFI+czIjSlZZdHlvQHdJK1EjU0U1VERVWEtjCiszdXkra1Q3cCQzSmkwKEZsRChMJnJLNyF5Yz17e3gmQiVpSFp4QmojV1dSJF5VQXZKbH48WCNyeGwxIT5LPiZXZENUSmt1TmVBMTAteTNgCitBZG9FVXNqe0hiYXFZaGk+PT1qOUEkfGh6cz8/OHxudnQlXipZdWsrWUQqRl8+RGgzX1F9fkMxYSNeUzdwT008UFg0ejZoKjkxMCZMb1QjCiskS3BeeTxtTkc9dCpnbmItcHBXM15QRFp3O0wmeSV8WDQ4R3M2d208JENQLWR7ZS16aEY7MXRLfjtYLWNpKW9hcWZIMTQ2e1kra3VkKW1YCit1P3I/RlIhb1dmekQqMWk1b0wlNTFITU0wIVFVPilAVHpUVV9tVC05KEhQP2hjIyspQ2xRXyU1X3JQTSVCJCZTZjUoZ2o5T3I9R28maz5PCitrMTI9dl9Vb0l1fW9lY0hgQXdndSQqe2ZrcDJ9bmNwVldxJXAyX2sqcGR1I3AwNTRXREw9dzJ1am8tRnxESVkobkI2SHQpdDdVWUN2ZCZDCisoMGlFR2tidkAmU0I2fDxkKU8oTkdeIykoRjZSMncrZihtVH4/Xkd0R0ckJFVsdEV0cHxsSH0xfDIyfkc9fnozMTErITMlM1gyaXFlOHRfCitSfERiOCV0RHRHbEU/WjZCNnI5fUpyOWVxbE9rWGdGWTk0dl9FJFQzZWVCI0VCRD4kVHAyZzUyX05lZzx4bTdaPkJQM3olQz9qNFVLPzZKCitkflB7Q3s4TEpYQUVAeUp+Qj9KRVhwZDJIQ0pyMDBCYjdJTG9PQ21ffm5jUHtIbm4lN0JIRD95STQ+XzFVK1BpX3U5fH1mWUArX3c9b2BPCisrakdSJDZPeyV7I0lKNWYlODQ+UkIjUjlqbEJoOXp0X1Bza3lrRFdsQis7RE1WWmVrUGQqfSMmNE9iTDdnbkBlJmpNekBVdCRXc09PR05WCis8KGdRU0E2aTBOaUFnfEBNYjw9X2xqVWxoYU9UYGNUYz01VzApYCFJX1Z0Knx2d3loTH53YXsxcmxZSDQ9ekZ6b1o7PipGM3VUVHJvaE44CitBPjZ0eWpmQVNVJTlnRSM5fjxXby1xcGl5TjVfKiE2ZjxwZyV6JnMmMm5jP3hrQTFTODYwP0J8eFV4ZEsqakNxT04rbllKYXY8NTNeTTExCishNDAjKC1obXIrYl47I0dXUFJJcjM7cT9AZWVCSEAxJHVAQm49YWdjcms5Z20tTlAwOFhHK3JxSEElP2VAaVMwWjkhR1FMOTBhWGV+KndKCitrYyp2S3teP1BOQkRVWWZYKFpGaGE7fFg4XnROOHhgaGB1c0BUOWYlKWdlOTRGcFI9YEF9R0hUZWcxPFJEcWBebUlmN3dBcTk7YFpORiZeCituTCs5fjgmPjJ0N3BSb2NDZTkjTWNAUWIraVVaaz94WlJyPmQmNmR3ZTlSVyMraD5iOVFiI2wpLVVxTkNaeUFxKUghKHdNajBaUSFPJmJ4CitoeXhKfVNWUll9I0B6LWRCc3gxJElha1RNNl99Yn1Ycmh3I3lSO3EtIWZXdTl+I1JKVGtkPD5iZDNmXkdnd2lTd3lGPTw2X0x9P1AjazJECit9UGZobzhLU0x3WSY+dERhdU1KZntRemtNSWZGeDxodzV0QnhXcVc2SXBJU15qWF42KSQ8UWEtbSYhISMwX1p2bTRqZDtoQD9IIU1BREZHCit3WlJ4e3Ypa2pzZykmZT0tVWJAZjtZd2k2N0QxKjVZcktPdjZMYUs/dExsKXRDYDlXZU8mJUpoJFRJPktOY3F6YCsya05lKkghYUtgfCVmCitGfVRUI2JzWTFhQ2pxR1MrTiUybzlLeTRNaCNqbEJvQmxHKzUhUy1VJCZuX1UwfGxVMGNYM3k7RGpfSFgyWXdVJFRGdEVTRCtge1c1ekdhCitRSSFCVW9ieUNDNilkMW9TIW85ekBicVdmIV5xSW5QN3BLO3B+TkwqUVlNfXgpQ309LUZ7fSVfam1TOD1sVTJ2UUUwaG1IZj5MRCE2MUVjCis8Vk4+e2lQU01YcTJwWGh6Q35EdiV1KnclcUI4aTVoPzBfez5pcChyUilxWkl6SnBnRH50OzY3amE+O0lKI2NiamthRCNsMzYkJngwI1M/Cit3SzY2P0hgK2R3dUNXVXhUc0JeOVR6a0BFbHReMWdlJXJ9KkdkI3BLNFE1QXNzejdeXipnbDd1NlhINnw/akxoTnVlZTh5cX4zOSokSmR+Cis1OGtLfFNydUV6UVhFN0cmLXl2M0UqOVp7MDcwITJwMW82Yj1pZSU4aVZ7RG1oMUIwMHJZMnM8fSFqOT5BbWAtQl8pN21JUz8jOWRWbmZsCitaYj1VMHBDRHpLTH5LTHB7ZyFLbVdtTDtQVUE/Pm0/Q0dVej4oTWhjKDVRZjQjY19BMEZ4K0pfMy0yMkk8VW8tcGc8JTMmYXZLIUx5UlJ0CisoJlNvRk1xRFp+ej9jb149c2kxZWpuJE9KdSpONF9iWWJzWk9AV0ZYRmQxRWAoXlpOSTNLZGpOUHhJbmI+d1dPU2p+RT8waEdXOXw/Um1RCit6R3o2akQ2TDU8N3FlaEs/ND98LW87NHQ5Zm50eTBqKW1yazF4RkdCTF87akV5VzFWY3crIzJiJWJBQTxnQldOVSR0SUoyKmB4Tml9I0JsCit9aDNsKlVfTW40ckk0PmliKGQkMHRrc0dwJXorWD8lVTF5UVVMRlpBdThtTz88MFkpKX1yMkVrWnYzdSRnNFhwT1R8M3xOQzxFOTQ5b3ZeCitDeFhsU2E+XmN7Nkw8UG13PHFfcTZUO1J1dVhKbU5Ya2NacWpyOEBEUmF6YWM8U01xMH5nPWZXYUsycWt7JnElNHNkZU5XR3ZSO0U3Vl57CitROHN4b0U5LX5EUTBpckdLQVlHWTJRPT0zUCFPVVhtcnEzLW1AeldtTlFpU21mQjw5WVYjRWNFY1RrKWJxWiU+ezk/PCVNSlFUKDQ3UyNwCis+REtmSHRpYzxtdENBYzt1MGExTzNiNipkKjZSUnJKMEombyhXJGMmI2oxfnRhcnQjJSh1MTtDbjM1KHxlYVB5M0F9Qjg5ViNNMHE/XyMrCit8X3kyel8qbnZTSG5FQkRvXzB7I3x3QVQhUEE4UGd3LSFMPzY5ayZWd3F4VDN9bT1MKUcrWTJFT00+TGlue0FZa3JgJnJxNkw4V1hgaEErCitNX3F4clJvemQqX2F2QUlVfkt3P191PSFHQ2lWSD9QZEt5SCM0VStwO0MjKFBMeCQ7eCslOCVmNSZmMD5lTXVnMjxDUGFCKGQyMXVGK0pKCitmJkAqWE80OFZXTUBBMTM+ZFViYkpCemlfRVBuZXxyYHxwVFdDV2BneENqZUtkSUZydihxVVElZ31Ge09jYjBCVXd2OE1JUC1XQnIjI3JWCis9fnlQNiZqaXN5SThibGIhSDQ9MyVBWV9ZYVl3VSshKT5UTkMkS0MzVX16WiZATFl0YnNpTzUtYT9uKFYjb2oyKndHQyt2WDBxQWh2VDM9CitEUXR8RnM+clo7JX18ZDhGZkZ0cmo7cypiUU5ZJG1ne1UqS3orJjlKU2QrQlkwYk10RGB1TURBQE55alV2QDdXPGxmJVVpS00+aVVJYUNXCit6VExoXnkpMFd8cDNIIUkrPmZCaVE2VHZwUVRAMigmalpObWJ7S2tTfnVuWjZ2bzdsPnZVeFRxc1h7LXZ3NE1tKiNjRXVIX2BXQSleTnJ6Cis0NSomdTR6OWsqd2syTVgoYVh0PypiNGhXQm1OYGpDZFhRaDU1QnRpV28kQzZgWGR6eEpWemxkX0NYQSV1djJhTXV+UVQyODMyPytuZlg0CitRIz04NUhrWTZKSylWTF9Lais2QkZ1U0leQUQ4SGtLSjhzPGNXbHs9dDxJMVYzZHdAPSlxdDVSRD0ldSY2TUIjYlN2Kz0zb3dhPUV0WFlCCitERXgmbksqZlgkPUdkVjFfQEowR2NwVCphcENqO0lkdWBTWigocks7cUxBcCV3cjV9bmBpOGJEb1lQUTB9K0JMayh5endVSH5wfmhuNUdqCiswUDJlXmtSczZSdExYSz5CITkoREBSell4VjlUSGBgLWNRZ1kxUVFaJEdIdUp1KT57T3VBb2A+dWUqUXpudU89WVRpYjRJQSUlQiNnfUF6Cit8dD5FO195UzloYGk0QyRKayp+e0dwcztJe3k3JlFIQTYyaFQ0S05CV2dMV0x3R3NYTVJ5RD4pLUdKblFrcWFTRUFkeXR4ODA9WUM+a1hECitgak42XkEjQkluSFBCPWdzZiglO1FmdXtKOSNjOVVvWDU1djBHQi0tI3QpNVBifUNWdV85dWxycmleUVVeSlFCeyZxYmtjME01O1M4MEtgCis/Zj9RJURNY1o4fEF2JnpHe1QmJD99IypAdV96d2hMdzdec256Ylo1cng4cXZsNjk+LVRBYSQtbj5HT1p9VnFCVDg2aGNwbkM2JHZ7bm1MCitsd0RjIV42cGtqelc7SXdIZStCaGtITFI5Sz1nI0g2fFo1d3IrYG9IbkdqP05QUCV6SHxwZW9qSnEpPj9WLSV9PDRBNmA8VURrYyFUUHJXCitgJSZoUiVZIXREazZJekxAb0hLbTY+aCQ2SG44fUNFNDs8NnpLNWc5N0ttUzlGeGtXSihCay1MdXhMcCE5Qm0kUTxsX09Da0MlPG4pVyF1CitBWkxrPTdqUkk8ZzRVMl4je1lHemJrSnVtKXsqYD5XZk04T0ZlTDx2dzR0UjFleCZuVkwoVnNnWWpscyZoWVk0VXBTZUF5MCFJTj1Ee3QqCishZFZGVyNvaVk8JlFibkAtUjhSa1hQKXdIUGwoTj13OTFNUk47bnZ6JllmUlFTSDc+RkNRKUxMLW93MTU9WSNybXY0O3xDTU5qZTJJRTBUCitgdClhNllLVSopI0JpVWMkYDdxM2c5aVl6WW0qcEpFMkZucXV+Y2JrPFI3VW9kWkM1eVkrZWNfYEhSXnp+P2kpUyhzV0s4NlNDaV9ObWg7CitXZ0Zmcz1AYjdwLSthLUhLdko5bmJ9Zys4U3ZNPjBOd0VWdzxZTUttIUxhcz9JeTF5NiEpXyYjV3EmTlQ5QTZeJnRPQjJ1XkBrQFZiT3hyCitDMXh9b3pacn5Rd1pWYFRNLTZIKEUkcU56KndhRlExWk1UQFRacFVwdTxqbyRGTntTbXs+KWpHSHt9SmxTYy0+Wmp3YE52ejEjYVN7NiZ0CitnVG1CQDY+fExMKnp8bWNrYU9jS2VQMSlJekZgJHslJDFoSmp1YHBxZUYqVCtzRXB+WiNXdWxUOSY8K0EybFNQfTktWSFidXU/TUwpTVI5Cisrfl4wPE9COXAhIUN4IXs8I25VZS0mZ1dSeDkwQXUlIT02SnhjazstPzQrfk84WlNCdTRjbzMhVm49fkFiWSpydXF+cHRoQmk1STFKfkNPCit8SUNVVnBAQzM7Q1BQZCpEfG5BfDUkLTJASnBGSEY3cSZzaURPQW98ZiQ8cDZ4XmZWJj9fV2UhQEt8blljSWsqPSR3aSRxWX45MFFJSGQ0Cis7JklNY3gza2Q9UGdAK2lsND8zd31MS1pqQXN8XnNXMis1PE5sZn5EfFg1PGdSMGltVjlKYH1gR0I7ZCVgazJ2bD5RT3tqT35vPWFqPDVkCitzM31kVmZ0Iz4rTn5MaUFTZW1gQmxuZmtxZSQtb0JAckRRP2BoWGxXSiY8QklIc2U5V0M8fk53e158MTAjcmdnSHpEYFUjWmxoVVZeX2h1Cit5M0g0TnRrMCpCcTVffV4zNkZaU1l0TyNQJmxjK1UobT1HQDdNS3JaWW5sNSh2MT16ZVVCeHc4QSohbDMjUXAjZTF3WXAlam5BayVvRyVFCitORDMjLWUhJldzdld3KS02RU5RZmZjNyF1dSUjMTJ1ZUJnQ1dMI1kqdkRjeGN9QjU0R2FlNCM/Z1c0cDdZeiZ0M0ZPKlNKR1BJVWdJXk4rCitrPDFqLURFeE9heylVSStvVHxVdnFPcm5jUTtyb0p5Kn0qZClRMXA/P287Rj9uamNPKi18K19TQz1XJS1nTD03YFhtY0Nna2pASzt2TiZoCis/RzxTKUpjRjsqdThIYW48S0M1VSUxPVpnbERzYXdsK0I0R2dUTlh2TkpaKlNSPnZOa0xRa0h6RUo/X2YtWS1zcEw8aWJaNSZScHZ0YD9LCitSa29ANm9XJntsajglYiRAJDQyT15TS0JKXn0lbENGQDl0S1l+dChhdkN8UHktZj9wXzN1Zz9AU0lobSZtQmBWKHc5QiFwYV98Jn57aCZnCitLcjx2Tms4OWMoZ3A8UHc5dEExNVJoOy1PRDIrT1FVP3Y/bUVDUFRrSmBfSTx7V29ta05kTnhvLWkhbU8wSDRIUGF3dTNLMDJjRnJ3JHw8CittYXR2QW41dWBSTzBYT0Fyb0JHO2o5X3h7PDFoNEkkRl98VHNraENxI2w4M2YkQzQ7fDllaDlweE94RFI7akk3RG15bWg0cDZ1T1dffT9uCitYSkhSXiNXcGhtVVRYU3BYeHhKWkNeb0d0fUBmQWsyMnQra3I7NFpTMWMyd0lKQ1JaYXdKJHlqbTZqenJHMEI1dWFqe25kSHg5bH50e1FsCitAfW1IWihyWVk4PXlJfXZNeC1GdmZDNkh4NyFLO1JieX5gUzM8KTEteXJKZHBlNkYrenYkc25AcGNjbnojNzZCPmBSVnpFI24lMzNxJUpHCis5SStRRW9fO34yXzlDVD8kRXFLWXpoRUthVlRzfSFWPjFJWExOUmo9Mm47Smw1RU9QcntAakt8ITUrUm5aeyVRVHdYcD5QY1NvNlNlUmhtCit4QX17Si1iMU18I012KHk/PSYxdlhxdFpEZD5rQip1NEA5KFFmb2lBZmpRKzhKeHxidU9uY2RfRnBYdChJVGdHdTd2KEFXR0hzMiZmQE1+Cis7ZUMjUzkxLU4yX1Z3cHBMQ0slWmxkYzlXMSZFKyV3U1BqSmdCe1F3KXJIc1A1b2Jwcz9zQHUpP2JXXkU9TUtvWjtEKnJ0PT1TamBAKVJxCitmNXg/cCQqQj59Xn1QVDtLWWYqaWVeQTUyKmlQbE9xODclXlA2bT5xWXAlOXEoZ0M7VEh9PEZFMkk/QV9fIzErbEBHTW1LNUJjVjFIcEBTCitUcnVGcWd5bmdXUyo4YlA+SVVJb0YyZmNsZylBemVKeUVkYjE/UWQlKGJ3cjFiOV9vRmheI3chPiRCOW9xaERyREgzKldvUXhrYSV1fCZXCitURThiN0lXZEVkZVFAR1U4a2dFRkM3Tz5mMGQ9T2YzV3M/SUAoNjJLdkRlWkFmWnlZcHk/bHVUazhvaz9mbiV3ZjxBPF9kTihobGx1M256Cit+JEpieElgcjZ3YDkhdVNrWXd0ciVCd094eC0yaSFhWnxPXjR4M1MjbVQzc3NxR152Slp8OCVOaDtRfihQPyEhcnwzOWI4M2smKWleYF9xCisoTSl3fVE4WG98dDxYfjRkJHIjajVMRm1VbDVfeXpqVDEjUTZ0MWglSkdEKTxBZiRlbGxYcGBMKmBBNz1ta3FgUEh6YyZ1ZUdhJVNxR3g4CistLXpXKDQyK2R1TkYjaDlfQjxJOFBBZlhgPWlMZzhaU3pYYERWYDMtYCRwbHAzVXgoZXBgMXJ0NWlqci1pcnBYb31HTVpwJEp5QTFDe3B7Cis5QTVVSDMqYmZlQVUhb1RWLTB7dEMheD85c0Z+RHUqUVlkY35FRUhsY1Q4SnY2T1VvNyt0aXw2eD9EMlN1ekZMZlVZTUMmRkxhKiV4XnFmCis5WkBrOGRyVGNCRW5ncVlXTWhwd0x7aithRiNMe1B0UDl6I1o/Pnhrd3NHdDBjeHs9WjdDMzlPezU+LWRUMVROZXBXR1RPaHg5KG48JFlHCitxbzFxcTRqdnY3S0R0YX0lJnxRT3c/NCYhPiNvZjM4YyZUNz1APXM3cDB8WFFSMDAwTzheT1k3eXBJPmtaRkVSaUN0SGJ+Ujl7Pk9WYUF8CitOYVV2XzB+V04mZ1dXTkNBQlktd1VJWTtSKj5iWj5IVkVedkE2ZVFUSDdIaj9Qfnt1TkMzY3U2SHsrVWA3ZE13NTJkPDJXMU5sWlYlS1deCisrJXdxb3piayYxczJMTlhsKHhvZDE2NzFyUHYxTzZfRnM9QUx0VDYxUE1GZyN1OGg3WWM9dztQa2BPVXx5enF2Nzd8a1ded3Z3ZH48WWliCitQX3glSEBobGRVTj1HWFdFN2t8Y3pBWFN8OWwkIUp1aX03QEd8KkZ6S05tT0h+Qm0oPk1SWUtHSDktfDtRNmsoRXtvdTB4b0I+YURoc3xVCit3PyYjWElsT31wU3JzSkVVZVEkZll9PUlaWkNQZDZJeDhCNF4pa3pYWj1PQVFgclhUP2FyM3Fia3xHVkJlRTszNjd0ajlvIT5qTEt5dV9ECitLPyZ2NkFaXzI2KG1jUWhpcWVXRyZnUy1zbi1RUlhpUnpMZSo3NVBWOTdWN2g9VHJRIWI+VDZsNlBuKXZOLSlAclRURF8+VXFvJiRUanNrCitlKFJkWmNzMzY5ZklfSTkzYW4mMjZ8ZV9COyNXZmVAZj4tQkRgaXc4KzwpUmkqN3RuJTNyVjstd3xVKj5mS3ViJmNoNyV1c0ZVYWtRJVJWCitkbjR0QUNWdkYlSUN2Q2FMTy1LNWRLa15CSCFlTlk/TzhlTDkySlc1VGlYe0poUCFRMWEoKCo8a2V8dExNb0VLR2lUbyNkNnkwSGQjRm1YCis0YHl+UFJtVkpXS3xFS3VWMX0te3Z1MkJEd3tXNyFeRXZ7c19Xb3lOdTQ+YmRqUCExMEdHTk02Q0BoZWFxej43WnxLdVYxX0tCd25FXnl8CislIXJhO3l2RWtJPWd7P1d1dWc4V1gkcjVVe3lKK0NnclZ3eEU4cGQzc0pZVDNKeH1KPlN2dVdSKEN3PCg7Yl83VFB2PSNaMD1lZU4zZFJLCit9ZV9MaEtkWD8xSS1mcT5LUm8rWSZgNn1aWFMhTkFGezBFSDI2ZFA3aEU5ZzlvNWlTSFQ5ND5gMHJaOS1wSCg2Q3ZtdFNUVGUxMlkpWitCCit7cDxUdXExWV9XIShWQ3oyc3gqTDMockdNdkFHYGRwcF9CelhTX3h+SGVqRHgoTUc2Q2taUmQjZlFEK3VRR1RySCYtcG5wVH1xQTZvSDlVCitVRWd7cktoQVBoVSomNC1+QzNxRzE/PERFdWpVZWYhYnFKaTE2dTdZfFBWYXsxOUg5MzRJUmB0Z2dHUGhaKFp0TUlSez5rc0dHKnpYMkRvCit4fWY4e05WYHh7MyNxYCQhRFhadVV+IXAlQGk1TCk5K3FRVTtYZHJQbzN0UD59Xy1aeD4+S0BCXiNLQ0lrQlBwWj0+c0dedT5Bd09ASTBICit0SChjbF5KQEMreUR5KnEyJGpSQHJyQXZILWBAfXVpXzI7V0EyKWU7YmQrV2I4cD5wfkI3I3pNTSFsfGFTKVBBYTdUSmhkIVNWNiY1en08CitEdCU/OUQxIWtweURnYCUxZDBQYXQ5cV9wejJqMktMcmItaS0+fH44Z2NAbiQ9anRZdylDPk8rQiV+QlA/byY9QUI2QGJQUCpiS3ckSFdwCitpVzxxSEg0dmx9NE42SFJnV0A7dENjZz9eaV9hLWRCMyQpR3B2XkVoYm9ieWpZaF5OLV5QQlB6O2hOc1NtJG57SlolT3xwYmgwQHwzdlFtCitGJW5CU2FvOTtmJjx0Zk5PJTN4aDw9a0FnTkhVZkgwWURtb098clU5UHE0YDhZbXstdlQxNTQ4U0ApS2Z4aWJ2YW9LZTs9bUc5UTdkTndhCisqNXkoQWdMQipAaUx9Mlg5MU0/VllWJXJaU1p9Tzx5QWYoI2xiVGV8S09YRlgpTCR+ZXhGclJtNH5EYjIqVWtqSGl2YzlLJEgyWjRyYlhyCisqJjspMGY7IXBOZ2JYaiZBUGw4R093KzdmWmhfeXg1KFIzU0goUXdNOW80eG14MnJUajJ3MWFYOXZhcUM2RzticSg/WDMmJGpVKEZiLW00CitrbFpQTEZfTHQ5aW4yXmtJNE5ObSs0QVlNdm9KRG9FVEh1MkZjXm9WQFZea0pebGRTOUlTVU9wY1RLV01Jal5rRG5tREU5JDd4U3toTm5QCit6bWlaYSZRUmctVTRuTEFqdTBWUyUtME5DVSNuTCMmZXB4PEN3IWgqckJ7UDV4I2pDU3c/Xm12aDFLPUBvYyowcWM1bWRPfU5UZmZEc0hgCit4eTdJfF42UUdCQT5HVGppbkExNmR0WFI0fCkjU2g4K0pOP2JzTiVUQjJvaTJXUD03UWpsaSZibihDaj0yPHA0PlVFanArdFNlKWtoe29SCitWKV53SVJfPmQrSkg1I3FCfSR8bSZteE1pIUNyU2Nvfmh4ZmVUdXxVbmgwYUcqdStzZ3o+N2YlX15CXlEtMCRQOVg/VnZ3bzY3WkxqR3A1CitSaHspaHBAOVk1eHVQeTV3QitGJUB1QjRGKkZwdiNNZXMqZCpKfGg/KHRgUW9XQjB8c3lEIWNaSD44RDdSIzc9YXlgYVBSaCZPUmJxfmFCCitxdTdndXApKnlxQ1hDd3szJk1lT0Z1KWV6N1J4bGtQNkczZ2twOD1zTGpHTHMybSVyZHJwcFVhKCZlVWk2M28xNSRTN20wdWdnayNVRmEpCitZeTJWUztaUW8telBNdF5Vd1M1ZzVLPWhaZF5veXg3VU5mK1QqTSlreEhYaVdtVzFEUXZYOCZ2N3I+d0pENGtlKlRweUspPWNDTG9uU0ImCis/SFdlalNzdjFQK3p9aFk/dEJrYC1fYDBFTyN+aXZiQD1tUHVhSjRZNVVQcXQkVk8rcX03RVViLXlgUk17QzJiNCs2TW9yWiVGJTIoVkxFCitEPXl4N3tAOFcxX3FhP05tQzNSOGMmTE9oN2dqcndfRChmeiUofklWNG1ZM25kUl9MSE5QSDd6cT1oS2E3SShZXk8lIV45PFZBd3lNPDJLCisxS3k+Qms4bCFqcDQyM3U3P0A3OzAoOTRAdFJVdHU9Yj88UngkcVQlO3F3Z1lmTnE9diQmeXlYOWN7VUBDXnJtazY4dWZYcEM7OzZTPjZ6Cit0dWdlPGt1c1B9LUJBOClwVlc0Kz8zJUFKRjNQbHgmVz5DcDxWVTYkO0c9KT9He0l9akBeTCZ3S2Jzc2JZRnlEZ2tnNyUrM2VTUWs0bHh4Cit0PmZxb1VoUTxBJF5TSyVzS0NpN2kqYj0zemZYUjEqY2lXVXdGMDtWMWIrZ2kwcUcwJTY7cFQqdCojQFVGY1dTcWNVe198SisyUEZqck1NCitJPmprcEBCb3l7RmJYbFczT0wlc3JgYl5GNlRlMkJ1P09qfTJKMjhUQjBLQ19ydEs/WlRpK1hjKylFRHVSRChWZk1CKV82XnVKN0ttKmByCitPdnIhVDFLdjNJMnN3UEsza2FQUSMzKmBJdE43diMqXz5nPTcxPjc1T0g0WGxfbygwNUtjZD1RTDNjMENOYUxpKDVsNm1wfT9gbXEqU0ZwCitCWE9FVGFsSnp9akZeQmJQdlpoJlJndDA3WEAhJXVQR1BDZEt+dEBHUEhEOW5ZcztBS24ySlRfNV5hcTt4MUk8e3R9ZXZUKX5vRyRXOUQ2CisqVztIZEAmczwtPlEtKk9nSEJDJGR3MlA+a0lCcFRHa3sleE43NWFzT1cmUT9+VTh6S3RHclI7KmZOS1FnNG92VzdMO2pVRnBoelFeKGAqCis3cS19RDh2YGpYSEIydUEmbXhkRSV1R2pjNGZoIVRKWmFFV1laQnpkaFdLIV8mWUM3TSl9e3lueSpgISl4fFk/Y3d4QTs7SCVRfnstO259CittcEwwel57MTBJaUFTJVdja1BmYFchNTxZeTY4Zjw/YjhuYGRvaiRrMzAlPVZUTUx5O1N5KD5TdCg3OHFTJT0pTzg1V1l9aGImNW9vVztPCitSbURhUiRUdkktaXRwbDxzbCl9Kjdgc2dYe2lTaHQ9JXpzTFchczlLQkVEUFl5bEJqQnxEJl41KGpxVUE1MEtIcnJfdT9LeHo9fENfQVg2CitJZEMqJnheVDhhUXdGV0Z5ZkRFSWZ9O2BfU25KWE48WkF2MDxBNl5HRnU4d2ZyVHNCSHFEWG5HaUp9SXhHJFlmOE5kaiNXS1NsZn0mO257CitRWGg5YGhQdD51TjtnaChTVXphNyY8Zmg2TnB5MHpodSlTTzVWJG1mbTwpSDlTU1l6NkttZFMrWDAxZl9tPiRpXjglY3pPKmR0MkpqWXxuCisjTil3WSNgY3xCIzEtPztgRWdMK2U9MHZ3cll5VT5wK1olPiM3LXxga2w8VSkpVD8yJDBWUiRVI3J2am9WQ2Jvb0dCYVd6Xkg9eil0e2s2CitjS3JKdWIyYSpoa2xqUSlyRzIpVyo3cDI0bW92dldlZyFkKGVBbTtSI1BNU2B3JW8tSWdAUnNESn1lJXojTTt4WndlR2s+KUFMMTIpJUVBCiszSCNgOSUhTCVvaWpNME4/JTErcDNPV1hFU0o0YWFQaFpZN1NrPHdRXnhfQVgoTmxid0EhbT84U0hJWUJ5VGAqdEh+Q3ZDLT83akNyVzVNCis1YngoJDxKWnpKM09aQ3V4Z2c5MWBkeyFSK2RqJnAhYWdiPkRtRDF8RHNPZnsxb1lGMkp0e0ZHcDRPbTQza05gMkIofkJjNC17Kl84RkV9Cis4NHtmNVhBMVYmZ0VfNXZBdSNZb3VzazRwfjFpKEZsKHA/e2dpUEEmMm1pK2h1Qml5YWJ6VnRaRktwbEBsa2FHYiRPcHV9OXRKbl5gaGM+Cit1RG1rMFB3WV9LbTUyaWVDZXRzTSttRCghfWIrUlBYYnMqanJ7VFc/c1NMMH59S3N5OzRkI1NSJnNTXzRRTjstIT5WZU5ANEV1OG4wNmV1CitsPGY3NjcpdklpRUo9UjJqPSlALUU3ajlVUm0+dkpQOz9xTyZ6O3VgQz13KnVIfFUtTFotOGJrd2tlVXFpZGI/THVJOWJNby1jdkpCMUZECislb2dkdmp9azQxTUhNI0huTWU2N30qQHdwUVdrKkswSEVEcFFpc04rdHRBX2NJUzg7OUx2eGl3PjslbzRjIyRLITcrQCZAbjJnN2JqKiR2CisxRlV+cWg7bmQwJGR1aj5TQCR8fmUxXyZ2PTtfMCtAdjZLPGAlaGwwdWtJUzd2Z3FAcVFVZVJybDY/NjE3dGN3e2J+OU95ekApPnw1Ty08Cis5WTNSfWBkVjVNM2NuPV57NTFJXj1JMkkzPEtjWFNXWmVBRUdBQDBZVzJTbCltMEU7blZHfTdKZnteYXAxVGtGfmFaQEl+cDg3STx9YzkzCitiMEdGaktTT1BwMDtqeDRIVip7aHp3dGw7bHojJHhVKUQ7MyN0ZEczMFFaR0xzSHA2Rm8kKXN7NFMxYyV+bExjRldyWkVMUG9NelkwZjRmCitxPHtsNUNucWJ7VzhZWlIzYCNtZ057b1ZoSmBLMDllUCVzQCFocyRXKD0wR0lId1I9I0szJUV+fFdyPEJBRiMjdkI7IShgI0lKX35HTDg7CitVKVI9Pz5pMkNxdz5XQjNiX3pFWU1mbk5NPmQjYFFVeklRdnZvKVZ5c2hEaHFVR3YhVUZacnFWfXxAVGgqaEI9Y2Q+OHZzPmk+SXk4dFghCitNM319dEB6OF58ITBCJkR1Y2QkWFF6dHdqd2h+U1AxQSpjNHZKIUxed2UzRyNPUipHUE8tc1khZGEjVjROKmhmUU1KX2lgbHpacEI2TmlDCis+O2JebzY4UEBrdCtZejk+MWxxcForeFNIb09IcCpLTXtoMzlDWVBmVE4hflplUDxUfHgmMy13NiRGSjVlNjd7M1FiMT1CMlU7Vm1HRCU/CitEWCFufUJzdGE0dF5nYU8tNyE5NnI+Pn01dH53WWAzNlclWVJTTV8jNiZIN2w9bSpqPzliU1R4I18/YGY+dChHSVJxeE0kX3R7MGlgK3ZmCitiQGNlNjtRRlhtbGNvNHEyYFJzTTFhVVZzLVV5Kn43dHM1YipiZj5iJGRMS0V2JENRZkw3VChpYC15dDFMTFVUVS0pRDVsclN+M3BxekVeCisqc21qQ1ZVaXMrUnJQZmJofGJXOyE5TT07N3h+ZEM5M3I9PFZeVjduTEZXZzU9dk1MaFI3aipzIT8/dShvWGBIck1NMytESX04TjNCYHZlCitefV4rbj1sfi1LVUkza0YxUilMN0gmQVF3ZEV6Y1dCYiV9XjY5KUlGNyZnTGhfTCtgVF84PzxYdjhtOSE+VHxTLW16REc7QHY5cSM0Q3ZwCit1SEFyc1BoT0hSY3B+QnJNNEpBWWo2fmN5al5nPT4jbEhseD1fRjAzLVJNYllLd3FpdWxtPS1sVipNbGVRTDBQcTFqKSgqOWslNFc3NENDCitlM2tJejIrWXxMKHFaQD5JPmtMUktqayVCbUlOSkBSMzAzO04wPi0xQXNXNVp8XiY7dlZEO2hJQWR3U3VFT1U8Km1sdUBwc0RiYXxVaURTCitmbE0tSnAlRFZpNzV2UUFiLX4oWlQ4ZGZoeG0lMndLS2VsVEV6SGkpNXZLQnl1cEYhNlA8aVRiR2hpb2VnWistPGBNb20lWDtGWkdCeT8oCit3YjFMKWB7aHZUZHVPQ1htQHdDTlR1aV92RVUyc3V+SUhQKF8hYlExQ2godldWfFVpNSViJTJfPzYqZjdFdyN2R0U7UGpyPHhVZXdoPEhVCiszY3J4VHd6eXJWdzJKRlNocnx3O0d5K2N0KD8qVkRsaDZRVDFBMjY1V0FzKVZPWnIzV3tUS0VAbCUjOE1JMT4+dCQlYWQzc2E9Rnp0cXcwCitRO0NCemxMUiZBNUJAek9gZVBGP3hJUVd8LTF2fHJpWjJpdWczMF90VEtMQUU/b2khM2Y1dyR+QEhQTDdrQ3V3UzEoPTxNXk8ocmU3ZU8yCis9LVc4NXhLKl9HNCpQJiZYRVVFZUE/XjhCaj09RFRrQEVOMigzNl52bXlyZz40UnhFZEA8ZG1JTGl4Pjx1OE9Bdl9oQlpqZT55UHBQYzJjCitAQWJnWG0lV1U9LXBLKytAe3R2Z3dXNnBvZ25HSXVEQE1JUVRwYCEjXk0zKk47YmBpLXN7ODZaRTU5VTdAe3NidjRGNHhiaFolS2F+UHtxCitpP1lGcm9AZFE5e3d+QXpIZ21wY0xzJFUzSSh9X1UybUhhfDJ2XmcmJmlkIV5MVkFWOThvIWZLQjRUbng/JndPc0pIWCRab0FnWiZlZXslCis+YzxeS1RTZU53NlcxT1lwRGtgeV49d0Rkezt6dX5mPDVJKXoqZHotTEg4PEBpezRncigxSF4lKFAzOWttYDN8YXFHI25yUks/elFZfS1OCisjcVp0dUlfdiVxTlJzaEUraHE2ZSVqcDg8VlVQMDEzJUVFNVVvek48Xz9IP0ZKR14kalVRU2N9QG4qYHtETTI8dUhvJHkwZW9SRngxNjJUCitfNFpJS2cte0sxSXNkZlh5X3JOeFQxTzRsbkUzbTNMemN7NSt0P1pfI1kjZ3NfMlZ8bWA3MnZhUzJaT2p7MWtCRGBHYS17ZnJrSXtvQ2l9CitKJGJFYnt1aXF6UFBLM1NJVUstVkU0T3VEPXE3SGY9JWhfS0tlNm9BPEZCJHgpX1I2MFRrWmtLK282I2QkcSNlO3V8SVhvbGlzdmpIMUQ+CitPb35jSV45bSFII3JBRG5DdlZaMVlrVyVzbGp5dGpHbTBfOCREe1YtPyhARUZNZm53X1kxfF5HR3k4V3RCcDt0ZVkxcTJWN01qKk1wMEhDCis2flNmcXUjMSZpQ04mK3E7aTYrKWh2JmpsO0Ezfms1bGlqYytoZDNuSn1SQ0gjLW1mTSlobnNNaDNQVUBrN25kKkhGb3R6WjgzSkQ8KlBWCisqK2Y8MlgxIzw9WThGZjxtPStUZH4+dUV8e3RIbEkpcFhMRG57Qj1hJTluSHpzU005KF5udVc5alBfWXQlKzJLcVNyZUFuYl5ZU1N2VSNFCitWJE9xQ3Y1XkN4ZnJnLTMlUCpDJnJgRFFud2g1PUBTcF5lPikyUThESDYqOWpfcldrZz9MMVdPKEtgMFkyUlBefUdvYlJ4LXZYQX58Q05eCitlOykzaUc1dXpOQTg2WGtGRDVZWT9uK1R5YH5EYSR1fkp3YWwtYG1MZXtWViQlKiFfcng1Tkl7bzI/SD9XK29aR31TdWokSkwhSSE/dSp6CislPGQpQGxKIz9IIyFOUD53cio+RmEhMEkyTzQ/LTFHSnNAMkN6fXQkZXNgMEVKMS1VOW80PEZyeU09RFErO1p+e19WaVNTYjkrWnJ7bmxrCitCcX0/QlYqa21vSXxZbGpLMjJyfDZJakJBYSk0ams8P21geighTWwzUmRRQzBUMiVlcHh6SmslZWpQO15sP2hoQjV1O0ZjdmNzTTV7SGViCitaeGxwezdedWc3MGVQJVY8WWojVilTb3t3N2BHUzI4bTtRcFNweTBDRnVqbnRuOy1sWUVvVmx2SjN3dXhqVlJ1X3JYPkhYfUZNJDxiVD1yCitDfng5Y0B9Y2clWTcmU15gJDZ7YXkxREtIJkQrciFVYE1hZTYjeklmMTtsYFRASFNIUzB2Rm1afHhePT8+fGRUZjk3Qz85fmZ7QG5zZCFQCitLMys9OzxzemArTDkkLUtfJSNmPEU2enp0X1ZEVjRwfEZrJXB9Pns5aUE+fEwoNVI1YkszP2ZLXzJzbnlnd1JBWDdqRiFiP35iSjVhalR4CityQiU+d2d2a2hHMTg2VChGVlJjeUApYXJzMmhZTTlmeD50bmIlNGFxZUpmQFBSdHxnSm5EWktMRDMpWk8qWCVkd3c4ayVFeGhud0NxMyt3CitsaCRDNChJYkIhNkhLN3JmaWZzP2thOWN0OWtVYkstbHpxe1hJfCh9bTs4bTxXQkN9OU0/QG5+YHw8RSVHeTxEc0t9TytpTjkjcG9WcExTCis/c0xTcmk0U1RUazVDcWJUNUVyKkEwQEQzTEJ8VEp9cTwwWXs+REAoMGBkZnVaK0FUQjBtcWpaYDcxUShSYFdObCFjc2FNcHdLYmVCPnBvCitRUW5BU0Bfdz41LVJ0PDlDZ0lESjJ0WiMlbDUtU0BLazFGJCMmIyZKdFdIOD56eXNkYiVVKXp+MTZTX1c4XjJIYihJdVIkTzY4aE0oYSZrCitnYihfQ3pzbSRxTHUtRT1XIUxPK0RxXjdOJTVEM3M2M0ppP2o8K0s2T2peMik9WUZVWTkmbjljZjlzK15keilKcDJ+NXFgVjd9OHhgSiooCit2NG9lJndoPiUlJVM5ZChsPiZ2KlBYY1YtRUF2Izk2TjslKG9wQGk5R2Q3OUlzakZDNG5UNXZAUH1CPEFnSF9ZbiomMEAjOGEyRytaTG90CitFOzAlPTAhMWNFI2I7LSU/akRCQFNnSFFoMERPUnEzUlJnbl5sTGgkIX54P3ZQfjRMTzEhZV58eDZtbkN1UTFDTz91YUxPd0w0V3w3RkQqCispLXR3VXtqKFNpVi1RdkRNLT50eUktU0E/NWptWmh9O3puKD9WPDxjUih4YHl5PExmRzA5MHlyVzk2RGRHdm91ZWQzfGlqYy1lUWBpMDxXCit9eFdtS1U8bT98ZVkyNDtRU0xnaUVjWjZrYU5VcnVLVUprWHEwTnVgYHJYfUx1JGtgeSkhO0QqbFh1azNBQ1Vyd2JiQVJKT1crYjdefjVMCitRe1MxWCF8OW5aM29+WiUtKnF2OFJFUmowaV9SMEBQSjVxYzB9TShIR0FAaGNeISZVSG8pPmBRaG1KVF98dFA7N3RmYCFndW9HVnxlbENiCiteV0A0bSFzRzlOMjQhfXVtdU1lcDZhays7UnoyNTdRQz12OVlwfW1pYDZGYHRVaChJYHBrcGBDX3h1RkdnSSZtfEdlWnNLUWUoJkRVRjRsCis7fFZIIWo7e2QrcWRPUGpAI1BtMHZ+flJHQH1yUnB2X0NAdT1oTnl4JUlFaEt3aDE0OEN+e1A9WH5uY2VFfmt7KFpEP2o2bjR8bmZRKUorCityekVZeWlrTyRXd3F3aWY7LSYqcV9FREwtTjw0cXpCYnRyN3paOShHSnFsWXFmUSM/cHNPZT1SZiFpJTRoKF9iRSh7XmR7cV9SO3dNPGdlCisjbns2fkNwWn5GVDZ5VkZhWmJCaUdTaG0jeWxQWUpJN0xvN3hhKE9SWGdxOXVpT0liOC0jS35uKzs9SlY0cUwldStyV0w5cDtFdUJ7YFROCit2fTx5OXtqaWJ6WmN8THFHd2VRQFJaKFdNRVVhYGt+U3ZjKmdDKmxxOFA7RjE4aCtMQFpYRF5LS3tBblNRcUc/OCFOUG00aE88LTU/RloyCisqayhzKWN4bDM3eDspRTg0OCRXYkNwNntfcl5NVW5wZ2Y+WmNVJXJaSCVLNDMkXmpxbylYNEk5eHBKVjNydmVhJVRCbkYrQ0ZCbyNuNyVPCis+Pk8lQSFqNCNWZTs4Z08te3ZvOD05aURAaT80dERgekwxTVB0N2wlZ15uND9PTm91S3duMWREPTlpQmg5ZCohcygzditXRWxDKT1eSip7CisqeUB0V0tva2dvO0p4ZGVkMTNgSDItbzNOOD0jVCgmSThyUEIhRCFTUW1xYmJ1PztrK0Z0JkFLMG96Yj9YPFI7Kmx6VXp7PGVsZjxTcTdQCisxWlAkI1ZBTUQzamJ1UGhvNSkkcW9zZnsjMCsodyR9IUcjM3ZwNWlmK0FvIWljTnpxPDYyd3hDfGhgVyR4cko9UmA3VWhrfHApdmUtR29CCitMcyFMQ0M0VFBQYHhLVzdXMigrWjw8e2BMbVdZe1d1RUc/dGxNUmpBMF5maFZsb0czXnU0QClYMHk1V20mUXMxZk10Z0NQVzMwYn1CRiEzCit3TnN9Mn50X3pARFZjbkY5Q2hDK3laN3ZlWFleS1ViWUchTzEtSyp1QVhNZWlXJSNocXtefUc2UDk/VlBZY2NtRTQtKnlpUSFOLVI8I3ZLCitqPiYqbEZnRD9ZR01iV3lZRTdDQCVUcSMzKGgzRCtQRz1MISs4WH5Te1BQdGA5byFLRj9lPCpxd25pemE/ZDxSfVU9K1pLRWZfUVlAei04Cit1en1nU3ZMcy1Sako7aDt6VVl0TENAWktBWD5VVmN2dWAwe1AtQ1hSNzM4XktSYVpVTCRXPTA4YE1+YXpfRDJSO21SYFFIVlpqcmlzUWN5CitpYWVfezwwJD8yJUMyeXxMJE1RMSlyTTspdzs1bnt+WCNTQWtgRUNQUDU+RGtPaDEld1NtSnVGMiFzNkJqZT1OO0ZmVH5fYV58NlJQfVIhCitLRjY9Vn48VnBRcCQoZFVHPlBZZHA+Q2liPypkRFdffjNwMGx6TXt9PXctREs8O2U+Mj05TDB2PDNKbV92dGxEJlBvTWhKcmlvR1I3UTMwCitwcHZ+Nm1ZIzg/NTlkeTlLVjIzeUBeY21WQnwmbTxrSmFlZztFS3dXK1gzaS1sKUQrWFojaGoxeVZwWldJJj4kdS13I2AoX3w4QmZ+Nm95Cis0QzJLV21fMEJmbHUyT1FnJD1FLTdGN2NuRml0dU9PKUdGLWYqaX5YJkw0KmZ0N3RuMVc2S3BPcEF2NFE+ZGpGcGJQPmFGRDxJSEpRYVQlCitDQ35rc0g/QCtiTyQkPkdYQS1AdjVEMz01eSMzMitraiVLMTVvJlNwUyE/M0NnPHUjfW9NUWgrX05ENUxpbVVqZjJmO3F0TyZleT5JMFhvCitiWUU8KnJFRUR1KDY1YXFHSz99JEUwazxNbDs5N2g5fGtMc3glQVZ7dHRpbU9TQXJHI0pfQjxMUGd3RlpeUEMyQyorWEFRZVlkQ2t+TE9ACitsNj5GT3pJdDdMbHpsJGdnLUYqKlFzV1ZYUSpFOGd1P2A2SlF7Uk9kZyoyUnRBa0J7UG8tZihRRjZwNmBVRnpLTEtUZUdScTBMYTJfPSpZCisqUlUxKjF+QSgobSY/dHslJGhQMWxlWXF5RzctdCtefn1hUjFOJXY3ZitxK1NkbFEqRyh3bTJPUTluQE9IZF5lMWckQS1qfC18WEBmZV8qCityXlRDWDZIIyh4WnMpeH5IaGlHNyEjN1BUWXAzaD8tMj4jJUNTJFJDZGFENkMzNWF3Nz5yQHx+KyZ8bj56PlVWPE9+IVVLUHs4T2Nhb3dMCis9PWA+V3g7WilCMEB4e15GVlRtTlVJTV8xdTcjK3NrbmU9ZjtJZm54OXA8X1pUNF5DWHdUREh6RTl4T1V6PUs4RChlNUc8QVBTWHJJMHwjCitHT2orNTc1ZzV8fmI/UC0rMVBYR01ieVNJUC1aMkgrSj9+LWJiYE9lPVI3OF9mSXg2cj9qJiklSVQ+LTRpdk0oQF9peXNZMXplKF5mfVghCitMcSFkdGl2bkYmNE9rK3VvRWBVdCVne19DNXIzaD10UlREb0NnTD0jO1d9elZMIUVHWW9kSVAhMjBRIVQ9Wkw5THhpcWFBaHlERCFXUzJyCitkTyVBY3wmbWtJPEpiQVFebEpVck9LOUl1NFI/IU1wOVloSlNXaTE5Rk8rN0d3cEtmb0debz9MZWU9NTFYYHhkNGJnfmtQVElVaUtDRStqCitsVS1KfTJ7YVEqUCtwZDM8IWYrTWI1RFhkS1RVTX5QIWkqME1VLXt9IUtELWpzfTFHTUF2Vj12YmJUaXlUciF7fDV+cShlJWFFZ2tYNzlSCisoOFYkQmdPY34jdWttU1J5MCFlcGpHR3xLa2kyREZOK0BrTTVWe0R5Z2JRYmA9RypmRipEIzxCbkBqfjZhREkkc0NEdDVFPEVLVHVPVnZhCitmWGVJYF8hJm1IbntNMjE3Kl92akBoWj40PTA1KSo+d15YKTM+Y3R3cHdteE4mMlcySVdeb1l5NWU8Xk4xS0JxQ319bkoxVGxGWlZGWng9Cit1M2JrTlRNPSkkbkFLOSg5NmtTU0goTTVhbjYkKi1KUS03X05tS0c0c3x+IXVTcXRAV0N5Zl8xXjs/SXoxNjRvcnQrRSpCS0gzb3I7bFY8CitRfEl8OH57RU4peHY4VU83eU1NP2soV15UP2UjPmB3KFJ1MitITF5YenJyRU1BWE13QSk7XnMydEZMU3Y2K34hek44SWxOPEJvbWJJfDVvCis7b0dwUUJsT19sJEhTXiVDOFRqcVdmPCNVcFp3eXJZdyRTNTY4ZiY/Rl97SW54aT9LNHQ0S3FwMl9MVyoyYkY5QHN8PzY9ckd7SnVnc01OCitqKEB4TWFXZ2JNUGxzQiFIZk9sKFhsU1BTUEJsOTZIQl98UExjazlHM2Q0VjtQWXt4WHpJfUVWQkY0Xmd8RWxsVHRwRkBFbTFLSSUyTmhkCitzOHlVVm9feHkpU2EmI1RqTlk7YSNibFZ4VXwlZmxWfC1ZXmVoZ3YmUEg1eHpUTkNyN2VDbD8wP2M5YUhNJWNmRl9EQExBfHhjVnJLa3BBCiswd3JYPzZ5V24yfWhLKSEka1ZkayZQZlJ0OWJ3KmJLaj9vZTB9ZHJpRypZNWRoMlAtUDV1dVRlO0tpelF6OG04TkdJalRBcTRnX0QqSU9DCisoRFpJaiEzVjhmPGEtb2M7aWRUdjlhWHdQMlFBd2lpPT1iMmIwc2kyMnFwTEgmY3UkXkpLPEBRVEd6P2k5SEgwbD4tODI2fVJ+RTIzPSl3CisqbG5EJUxUSFlvRFN2TVlVNll8bUAmc1QqVkB5eX49TktjY0c4XldfPXtqNE5wbjxjTStIIX49ZkJaM2NfNUdMTWxTVnlKOFBfRzFhZT49CitJdHR3NW5FZ3JuNGFQNmU3d2ArOFVmRUtSN1FMci1aJkVKLSZnKEolWWAzeWAldllYOyZebnk7cGF4engheGx9O3xOWXhyemtzKD0mOD9ECisrSkRJd1Y1SihjUGB7PDBJNWNYYjJmOCNtZENaV2BEWWQ5eTxrXlp1OUZuPHAzeVVFUDEwKVZwVmghZkpJUT1UfWJZTn5seGRzQ1FTYHdvCitjd1k7fGR3dmw/alE5bW87UytqYEtSckU2Ul9tWms2TlI8Ql5aJkRtTztRb2Vwe2gtKGlLZmEpcmh3dlQ9bVlAbF5+YWg7RUJAa0pZKUVQCisqSEIwPnokeitIaXMpfWYwSHVlS04mQXdCeztnVCtOOzBNd2VuSU95djFZM1Rle0gjPk4yI3A4fkY4Kk90RHE9R29VQmU/eSYoVTd1PWx4CitHa2lTOSRoRmY8SFVseGlRQkw+WEhNe1dGRV5we1BVdX0yYnQ0dHJuP2VoKUUqbTxNbT1AdVdnc2JfQTtfYCFKRTIxWVI0dzJYaVh5KGluCismVXM1ODM9IShRWlVqKVUkPCFVZVc3M1BNYmo4Yzg3TEZXb1BJZjhDTjl9c09NVVMjaXo1TUNtZ3VYPDMlcitjdVZ4MlQlQHpUVDt3Oy0yCiswfjQ7N1NRYDdIYShZU3pfdV5NJEg/ODZjeT8kVm55TEN8JVBxT29fZj9TZV9GUkopSTVkQkdpN1Q5Zm9HZnJHPzdQV2xoKTZYc21+YSFOCis5X1orVWhJYXlYdz9xI0drMy1CZFVkZ2s+SyFGMzVQUS1JSzR3RjtSPCkkUDlLS2leSXczLW5rQnxJbyU/OFpOI1UqPiVCUDlEQUo+aSkmCit+LWVRMFhRQWhfbCkrV2E+TkplSD5Say01NioqNjkoPU1sRk42e0NgO2A7eVlsQG93MVBBS00oKmRNQGI1cj1aLW1eVkp0WXM4d3sjX0FjCiteazgzIyUtXkw4eT9TK3Z2WkVWbGRJLXE9IWtaWCF4ZmQrTFc8Z09JdzZmYEY5SG5WLTExSDFKIUVnbk97cnV2bU4wJVF5aVl8V297UExzCitHPVlPUVRSUXdAJlVQSVJRUE1IY0NDOHZaVWh2bih7cCYlemM7RF9vcE9sRUt8PXo7QUM2KkxDQmpUamA7KSlPJmsxaE5Ae2dUT2deQ3pOCitCd3pORXtoen1gNkVkPz9yOFNnX2k7dSF9cXRzUkQrdnJJezBnPCV2Kll3ZnklOUxQQShaNnB9PXgrWmEqKWVVZXRjRGMzPTdvUjYmaiNlCitsVDw1UTdBX1JnRyEkUExaT31YVCRtYSM4a3B0TGJmeDdjJUQlaE04RUsxYUM4cDBEZH09UGFeO09WVjFvQUclZ3lOdTdXPTlsamVjLStGCismS19lbVg1dkNBLWUmcDU5Y3krb1ReWDE1OFg1WjlIWm4/K1gzTjhrfnZxfFY5Qmg7emZLeG9TKCZ6Pk1uJiREUClpU3dOfkMycyh5bS02Cis3KWEpRlAxQHBea3duP3VPQ2wxQztweUFxPDFHbXomKkZeMj9geUMoQFhTV3l5OzVQfFIrVFM7JDh+VF5mZiReVXUwX09ONj5eVWNzQlU7CisycT95SmEyd191fFp2Y1o3RTB4PmpIRzVRUUs4MGRsNHJwSm1HTUVFSEM7TEF2IVNsWj9wYUk3YTgzbT80I1k8ZmdGWENjQUwkfUg1Q2JECitNUkF0VW5UbDI/fGhkMG5UeHlKOGM/cThMLTdKPVY7a0ZiSkttc1Utey1nPHBUc2pzX2ojJlExJW93aHFrI3RVTVdLWGZuQnIzPnJRbDRLCitQMDtIJXFDNXtkKGtgX0VHbV9xeFdUWlJac3M7cmhnTXRmTkNlTFdANm5ZNCQyRHEkNWVGd0tmJnwhTTxzWlE0dHFhPkgqYE5mSkljOFRlCit0IXlRUDNWMkhpQlAwU3ZJPlpgVntuNGI9MGxxIVpEST8jXz81NTUlNllGJVpsfS1ic0ZYZjgmOyk5Q2ItcUlrJWhndGV3NF5OSENHVilkCitTQCgjJExgZkBrPyY5YExnTV5BfHNKVDh2c1NpPFE9PzVyVGNqY0J+dD98Py1OV1d5NjdiSUdmTSVBY1M+Z3JRNyhhSFpiWXhwQ2s3WktOCitxMGtsbTVXb2RaJHcjJH11anRISUJmPjshMSFTRklGVUx6WXlUN09DUj5+WUB1SyVpa3hgOEooQXtaMWhwcDZ6cGRkYmNMJkBLOCMtRHxMCitnRXJFK2k+SHo/XzR6IUJTK1UlSHpPX29Vc2RuZFJzLWttTSZvWEdPTXZZVSE0T1ZjUFpKMG54NkkmWDFrcylARFclJCYlaD9FOyljZE49CitNSlRzWWMlQ2EpUihWVWhSYXIlQkFOelpePEYzOUZSKDRBVVN0aTxuVDthQyVqRl5pU2dZV1AzaSRVM3tAdDMkcEZERGp7d1Vyb19yX3gqCitvZ2B2TnwhJSZZV2pLXlRkWWt8dGtkKXVuUzZjT0FhJGVKVGZEVH10fUV8KXMhNChZc3kmcU0jVkc1XlloWUhsRzgtODR1LURPMUhfdClGCistJDhQcikxX3ZRMTZfNk9AcHpFLWZRY2RQeVJUTDdCJW1sSzE+dDl2cXgkaTNTIUdLKWp2K2B+P007Yj1QNSZsdWlSPHJCMFEtXz48NTBCCis7dzAofH4/Zz1Ea2h6fklDKGItYUFSSEFBcVlDR3k7O34zKHFwYihSN2pQRG13IXQqUnB1YDhaRUc2PF47VW1iamklcDE3JXd8aHM4TiZGCitNfio1IU07T31qOXo2a2RCUl9xclZZPlp4enc9PmRWPWc/ZClDVTtFYVpFVndTMkBBb1pJd3N9NVVOQjBSUWJoPE9Xa0l2RG8hY2I0al5eCisxQy1RdEl8RG9leCNYLSktJEVmYjRFYDUmQTxvOEZ7cUchQVJ+dipUY3ZAcCRhZ3N3e3J+TDBJdDw5T3UwS01NckVnKnRHZFZMVTZ8O0JNCitBelNkWTtHZ1lCQDYrelRNWjBQVyliPStCQXJgI08jSWpaJT96RXg7PDJ6RG1HbGxvN0dNMmZtKURxXyttLV9yQVYkfEU/RXprPT41X3RTCitjc0l0P2AxZ1N8dEopQGc4PHR9dUA4O3JSdEg2ZlN1OShgczZKUlc3dV9wR3dPIVhaQ156KDFQIXZSRVBeZ0VTTkwkTTFmOVdRYEFrNDs/CitQKDxiQCNKckdZQFZ6Qk5aPSg/IztOYzgoaGkwKm92QT5AIXpKOUtXdz87YkBeck9QJWVePUlgfjQ7flNDT0ZgYjVUeWxYeVUkPDQ+V1I0CitPeCo1N3I4Q0AofjVwUGc9ekN3Q2c1eVlPfGQqWGg5bkxSVTh8MkVzcV40dXZ0TkQ1ZV95PkZYVCRiZyNrPz1vYXNibzZGIUdRMHJqUHtkCitXa28hMWBkTlkwcVQjaipfQVE4bUZHcj5rTGBYNCVoSChVaVdzdUlfVWlIJiYxP1c1VEw1UzlHZ04+XyN7Uks9N2hTYnRPcHVkYXE5MzgzCitxMjZeNFBLcHxAeTMtcFQ3fGM5UGBGZ3lPfHszYzYxOHR5R1pKeXxtMnAhJS0lSVc4Sk4xQilCZl5+Vk9KQkpvIVBRcDNmPC1TN2I/P3BACitSS0A7O0FseDxwSXBadSEwT0o7bntpNVY8QHRlQnIwWSl5UmRPTkV6TTZHQ0FESmt7Xz1BKzUyOCtNP0A5JDJAdSh5NEUxR3NmJjlXekBoCitEYmR3d0FgeSN1Z3VhX0p5SyFObWxNVXZmWGJAWnQwYHJrWnchM2RDKE1EYHRIPiYjZCNjZz97aEh5RCtNTjVGZGs1cCg2K29jdExnRyM4CitmSjFvcXkpJVQpY3x4OV9Vei1OT31qRFkqcV5WRCk7aUtqNU80Z1MlbHF3Zz1jamZGU01qTDxpPmU0YTRDN3BXOHc/T2tNQ3NyM3V0YHdrCitGfX1yVzNpIWBvNzAmK2loWkYtWjEydlcjb148UlM4QkVzRzBNZlFufjJMaWspN3hsKiZsUVBhdU9BciN3fldzc0shMUQhe3loOWk3MC0+CitCMkc/PUkya0oyY01qTTdUbzdncEZEXzxvTTNQbVYyX2RMcjV0bjVwfnZtIyZ3OWoleGlHU1B4NTtDXkVIb353PCRiPVY8TmxwSWxJRzxTCit7KDluVzQwKTgkWWM4cGkmZlEzT3JYMHxIemtCQGMpOUslenpJZ2ZVYHxxWU5wMVM5JUcwYEJCI2lOVll4MkttTWpiN0l1P20wX2NnfDh6CitfV08kQzUxVj4qVzBHTypzN2U5QCNgc2ghSG1INVE4ITxhS0dgRXpXM0Jndm1rPU9HPD52VGpHd1JyPjYzPXtJRX14fDBEdT1DdHdWaURTCitJOyRDMmNIeDM9YCNnKUo0VFBuMGd0bmtCbk4/O1VFa1UxUWlLTnQpVW9yUGlJLUdYe14tKUN1bTskLWApbFYpbUMlaVY5WmYrSSVrazI/CitCNGdPQkskNjNwUXl3ektOOVhQPHJMXlBFLU5YbzxuRExhSmwkOHQ9Ymc3bXw4YjdzaWYpWFdWJGhPTm9yNEFKKVB9ezVua1h3OWNPVns/CituM1NmRzV1QWVQSTxjMlQ1U3IoWTdBYEZYPGc8U3NFaGszXzZ7XiE2KztraFl7cVBOQUxwJm5nR30rOFdCRVRFeUJBXkdMISFILUR4MG92Cit1NCVadUJPOGlBWSpuQGZKTU5EM19KUyg4QiZVeD4/al5kYEo4R21BYDBZZjtlS35+Z3NOYD48SmU+eF5MdyFBa3tHfDdQbyN0ZmpYdExnCiskQFJTIV4wZFA3X1duIUw9RjcyNzZSRD9sU0V6eUpMdnw7SWM+Unc1diplZChFazdEXjB1TnBhfSVYM2hpYj1qJnpZelJeIU1CN3FyQXYoCittdVdxXipfX3c2TzRaaitJakwkfnpVcilwekcjVWx1U18qKHtXKSNKNzdYcGhEbm9VSXNZRlhGX1ooJmhFaGc/aFckUCtyTnViRV9WZUBxCitgVylxT09yTnIpdiFIaGRHbz4lX3RFUGFzWGY2ZHw2N152SyNeSDlSMz17KzRoQD5yWWIrU1dQIXxRRGx9OG9gemI/VClAJCQ3TnN3Y0w3Cit1QnA1JGlvfiRJZnptV2xreHlzc1dafXtKdlJsTGNyPC1Zbjd3akYocClSeylUYD9kIzZIQlUmfmM5RU5zVlZEWW1CTEVAO0J6fmRII0BpCitTKT92d1hnVTNZbzhtWUk8fnI4Z1RiRTN6YDc/fDJgdExHfC1xU3FuO3lISU5ET0hAZT4mZCNxQjU8MnZXOExTJHI0cyhpTWhLU2J1aXM7CitMa29nUDRmS2cmcXchejI7NilaMXMkTHYrMTdjO08yYCp5UClIJSskUUclUVJCNU43eW1yLUwpNTZhKn5SYDNLc3w7alIzSGx6NUxxTlp3CitlSENTKGhzX3xmVEpkODR0RzlFU1F6PigocmR7dWMxOSlYSzU7TTM+Uk9Kc2NUfUArJTdZUGBneUJHa2xIcilzXmJjKWZNMVNWPysmI2h3CitqPntqbFNTQXl0PDtFTHA1MjliKGFxKSp2dCNzaz5mbkZGaVd6enVmYFhMdj9GJD9uR1NAfDJjVWJYTDhmQDM8TkQzTHdsVFhoTkdwPk5aCitjPy1RJXxpdGI5Zz1Vemt6ZnZJTzljfHh5JjU8dWtPYSpaPVVlUnM7XmBESEw2RkArcEYtZXJqZXM2OXZDYTcjOCpgI18mST0jKVBHc2pICittIVUteHc3WT9oMzdLVGk8PjdQeTE2S0RmVyEyUGsrMlRTQSNZUXlxYHR1eW1xdmNValNLeEJePDxGbyg2OEtoVFpWVHBac25fajk7VS1vCiswTzU2ZTJQPHlwQW59TW82WCZ0dTktODVkcistZlR0TGpVSGY2YFd5RnZ6PDFEeT11QFp1YyhzRTg9R2BHWTtWQiMwZ1VKdXlmQ1lZRy00Cit4MU0/RTtfJldTfH5gKzZZTCtCTHRaVnNGK3g0O2ZIRDF9NUJTNFFpVylWbW5aVnV+PlZvJSNLZ09GUn1jWWV0SU1wWUhGPjFyazNpTTt2CisxKVktPzV+aUh0ekxpU04pSks9VUFvNDZwKnokZm1rWE03Iyk+ZldsckpLKGRvcFd2e1VYUyN8ajx2dnRnSVYwYSticHM4YXQ0SERmR0xMCitzVzRpXyZTaT1wK1VARFY8X21QJHpiQmchRFAxMFM3NmZaJU1Wa1JmcUN2bU9Ba0hOQnRXak5hNE0wMVFKanIrY2UoY0ZRdElOdCMrM0w4CitQSStENnVHM2lqemR7fkglWSZleyNSe1o0VGBHYkNrO1FnR0laSVM1dk41NWAkRkdFZkZLKEBrUz5yOEhSb0sqU25jMH1SbXQyY01jZDw8Cit0TV5tSG43fih9aVp6ekZxSkxaXlNaZ001V20wcDx7PWR5LVZrQE41KT1PaEBvQHpydjk8I0Q7WEc2KW4oWio7S0cpZkZ3WDV6UWRXJDlfCitiSmE7RTY5cDA7dHBMcyVKZShLLSg/S1hPPyZyeEZDby1XXk4oNlohOTg/VG9KMEpLRko3YFU0JHZ0MnM5e2dKS216KlQxPzd3P3ojdCpYCitae1IwYUsrTG08dzRRV0R7fFo2US0oWU5PKlVXWStDRXBZVX5QU3shSm08XkpvfUhaZ08rcEU5clQhKylBRmBpSWVtRCo1KyRAaDNFdDM4CisoPSEtNl58SDhKbyNgIWZ5NUAwdXtETUUyaiRKN047Y0MhMl97Jk9JMVo+dFRoTmI/MjVfJD1wWFljKG1LXk8jYCsoI0E3UjN5UCUqNjE3CitqSWM1S219WU0jN180aHpaXlZDRSghKlRYP2hQcmRQcFFsTWQ+JFFxb1NkN3lsPHJ8bEIobi0yUkAkRGl1MHI1Nlh1MTcpPEg1cHhrbk1SCitNUSFFO3Z5UmsqUjBqVCl3S1pxYFNCeihUckt6UFdfJGFOJWJqNUFRPTtnb3dCdmQkaX1VaVlwfSttdlozRkRYOU5xLUpJe1E/O0NeT3o5CitNMiVNcWI/WDk8NnhLdEg9JWp0N3xENGZzYzckZj1mQENlQipXSj9kRlUkP0FHdXtqbWNsdS01UnhuTjIkVEVCPUVqLVZfJHIrfDYpPzU5CitfN3A5PCk0T1Q8SCRpYEdBTEVBYkV1MmdySzxOal9ia3Bsak1xKEY7IzV3YXZyaGwtP2F4VXJYODA2d1ExRjU+RSRoJHNlKk1VamlGdjJnCistdTE+VVEqME93JlQyPyRmdUF1UUtPVmhHPClPYntuVnt2YS03TSVkVj1mNisobUhrJE9mNlFyJDZzI1J9c2F0NDBVKn4pJm40byp9Y1c/Citzai1sZWYyVzQ9b3ErQXc3MzdBfkg5WmpvJUc7YF8lSklRXisqJkZ2aEFNTU43T2R8fHFhX1ljTEZ8QW5mZFMkN29ONER0NUF6KSMjeldPCit9ZipOdHJxTV9yKkIhfj90RFYyelp4P31JUEsjWD9BeC00SDtQXmM0dG8maHNrclRpLUBAdmY8fV9tYSVyaE42MX4hfmkwRHYtYCpkS0gqCismZ1I8ZEAzNkRKcyhDY2RmQVZMZ0F2O296elFnRmVyNzJhdXQrLWgkWS1ZdkZWfkxJfFRTWENJRUlCR0l6biZudWx+M099JHM8fkp0WiNjCitQLSVJdUIhSzc4SkFTZmkyX0grMEs/TWRyZkpCeWkzSDRvKF58aykwNTNlP1YwWjNCTz0yJEBje0ZedEhmNE1rN0xGMXNQdjVERnM8SE1QCis4KiVrQF9JOG8/fDc/Nyk+ZT1KUTQheWl2U1R5c0wrfVh3JjUqPTU2fH1adkcyY0VMamNmO3xCNGlIJTh2QEBrUzRBNjhRKSFXKlB3QE1wCis+YE4obVBaQlJ2PHh8UmRZTV85QHJ8fnxUcl5mcWYrLXtISldpZSRmaSMoNH5FblhEclhGSyNxe3w4VkAwfFhRUjAwME84Xk9ZN3lwJGpCCis8S28wLV85eUlefTl7Pk9WYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSVpERFJ7V0BVNDlFXnY5eDh7MloqSHVoYSNmeUEzMz19SnRLelU7CitWaEdHNTJvXikkOUt3ITdfMj57VEVWbDJ9cyZPT1RjfCh+c1lDNGdlQ28kWl9IfVEkNTVJRShobSsxRzIqPXlBdX00SUxRYCF0U2FZfGY4Cit4ayFYU0JsKFd4Z3FyI2o8NG5WWmRIfnxLakJZe2ByQUAqcHkzfHU/c21iKlNyd3lvdmdCJG14O19tKm1XVFVkdythKmJiNF9WbVVrdU5TCis8RFg0UEF8YG98TW0wYis0JSh5IW4pRFpyJXkrUkRPWlhXQX1AcHpTcVY2PmF3JUF2c0ZLTSFuPHVHSUVYZiNXRiRAKlN0a1MyOWooKUZfCitUYnt4bVIhVytMbk4pP2kxOXkpWkVRUzRkdXdUaVFWMGpeRHNhVUN5JlBgVWlFTVB1Y0BpSlE0cFEmNmQwMHNMfkQqTFN2cXRVI09EOzY+Cit7QClwaVdsaUFULUJ5dlFfT2g8QiteVV5Nd3Q1XlZNZ18lU1E/TmxWUVRUenIjU2lLeUxNJDspeik5SUEkdnlhe2gmeXUtTnJGVDZWQXg1CitIclZTYCRANWFvTHNeUVk1e3VmJWozakRZOHlVOXFgTFFASXV+bns3MTdEKDRaOXt+YkZ6ZHEwe1VwMXBzNkBac1dVYHIrWDZeNjJ+JmZFCitJIWYyQTI4Vyl6I0h7X2JUKG9JQz5KYGBqZUJSKTYxaWApQXpAeE4xZkY+O3FEdiUmSGh5dXtCZjFSbXd5Q2lCbGBwWVRtVnZ8aC03UTJACisjWDl7NXRZSC1oYHxTQmFMfCRSdFYrQG5hUjwjM2NYPXVjc3xfXjJRS2VYc0YyVD1JNmh0UyU7KDRCS2FQMktHNT9MdCpKY1J8Qkxke3EmCitLXiR2QDBYcVIwQVpITzYoVSh9dio+c3ZATmphVlJOfkNrcDlJbkx2c216Mnkpfj5oVGs3MDRiMGViPVhmT2V7cVhBIWB5N3dxTXs7NDZaCismJDFaXmF7MDIlfDAwVSZQTEEqNERmYFE/UEF7O3loa3FLJCVLQiFgZG5pQkd2IW9SLSNveWxURjFHRypTeERacSVURX43NjFaX31ZVl8qCisqZXRPNUtUdTImKiZGOWNROEJIM3JpaDQhU0tRS0l3JVA0YlRabXdsKmFYJWV4NjU2NVA+Vy14TGVwYn4lRU9ucnhQZmhuVHwjMTBaVjtmCitMYWVnVj83fTdOPHwya2JBZlFTUnZEQFl8dWtLcGg+N2tyez9JR2hQZ3s3MzZpVWdePHNLX2Flbm1nRkAxU15lNkdLfEttQlI2bHs/UFlrCitKdDY4TGR3JFJhPGplVShHOU19NzB2b3c9Q35YdUwtXml8Uzg3PkxmUmMrV1pjdGUtO2IxLTJAWTZYUjBRb157TGJIWmMyQE1hbChae3ZICitzSV9WaUkpcDNIPkMlb2liWHJvU0RKXk4jQDs4fWUxWl87NEl4d3wlOU5md3oyRTdORHElYDlyO0diZlgzSHotPU4wMTQmUEN5ZjRJUipqCitxPzFwVipeYHItaHckam5+Jjl+U0R5QGYwQXlxYlJ7RVM9KWQta019Pzw/aUVyKDVEdFpSP2JFV3pWKytQO3ItSmczZUJ4NVkxcExBbkpsCitlZC1GRzYmLVhYMHZCcCUxY05oUlA4eEE+PW43KSoqUnp9bXtuSU5gcEpMTk1BI1NAWGQ/YTcraztpMkBtQVkkbXtgcng0JDdZaztXTiEqCismSCFCYUh8YjF5cSEzb3EmSUdKV3oqWlQtakJuK0k5P2AxMT1+O1JgbEU7dCMwI2MzZEM8NXJtMV9tKXthUkpWeE1hQlBkTjtQcX5eO3hoCiskY3UoMFRhfmxUbH5eYTIjRDk1c1l6QWYjRHZ3M0hQNnQoKSY0dTRzJT4lWFQkRUxqblQ8YFopeDtAVGZIIVYhdCQkZU5xOHFgMyN3X20wCis2LU5vcnhOUklkcjNxcyhzfXthelU/NDJPO2hGTGZQK0xGZEVNYHZ9ZjctVmdrT2RAeVY+V2c0TmFibCNjRilFU0JxZmt8bkxTIXBHdjw0Cis2dT1tXj5TbCVMMT97ZlNiPGdIYSZudDBlflhNbDQlcGcxPVdzMzYoUEgmMHYodkV1MS10ZDZZaTFadTxfKGJUOCk4UEc9M3ZIKlVlTGkrCitRTGRvbm94dX0+I0RxPndzJVkrMiRpZXd+KDhvYE01SUpldUV0UH5TT2dDMlJgO3pjIW0ySSlkdilkIXRuRlZqdz5fI0JvWHhCMW1zUkZSCitpQUF5O1B+NG5ZNTxiZngxMnZZNjZUI1E/Mm59b1deP1UtJitqbGdXZzl+aUNLdk9JYSlIMlYyKzlNRmxDM3lMb25Jc0JyIUYjUG9LPS03CishJFpjdG1MZzIrSEY/I29sdVIwYzA+KE07QSN3cyMrJDM5dGtNfFc1IUY7NjV+ek8kMH0jYGRPYWU2JUxrSGZKU2Ipak4hUmhoNHFsP1FoCiskJCU4WFlwKTtqPjlaYCRlRENANVNWb2B7UjVwZ1BTVWooeEp5KV9TQjd3aWRXd31hczs5UExHdV5NRE48ZTBud3BRPnhiMzx4Ri0xMkBVCis0ZTV9bilSZlMlbEU3ej1BJXxJZ0goJTBiNWxtaU8qSz9UOD4wPCtQNis5KjxTM2xeJChncDdHUyFXeiVSRWooVEdqU0JgODJ7NEtHMDB+CitjLWRaa2MkR2FoU2sxdnROdWoraWx0aGRYZX1XZFZnVm1lVTN6e0thZlRWTD9PKkZDcDxHbyYpOXBHU3RmRWZVdCRubkVCKldmaDs9fGthCitGUiQ4M34lO3FYQ2JkP0VuezZrfENIdW82dGhSM0ljRX1ybT5aZ2dVUSlYa098NSlSJGUjd3g1UDU2QXAjaSopalE7YWgkQWRvQD4+I2AxCis3YzhvbUtWclNAK2J0QDBFSjlhTEI7MCshUWV8SzBQR3wrVU99YXw7d2NrRkEmV2AwNnd3V3Epdmp8ayhEd0o0bXQ7e3wjbHFYYHhucyl+Cit1cGBVMXpGUmlBa1k9MkxIOHNuOV5CMSkqVEZQU292WiVJWWdDPUNJZDY1Q0t6TCFiMnpHMmtFenlrUEw7bmgtZiM2aFgzTGx4eFVrRCpFCisqWVcyWVl5UHZGbkliY3tydT0rPnJZQHIkdyRYaEomKTZLLU4pODtNU0ZwU1F9YCNPZCNRYVIpNDxYZFYoSCphJTQ0X0FpKXdoVkN2NjY3Citee0xZQDZKZVlQKVEmTm8jbSY3SHJFUj1GSjRndCMxaUFkb0wrSm93JEpQfmRzTGpiaUhKWkN7Nm1aPjU+S0FKa01OdUVFK2NeJmwyfjh9CispNFM9eD9sX0x3dFBAdGNVWXtRU2Y9JDtyRzNvaFB9cGBnLSlXPFhWZF9YRUdmeHdSUSNOPkltZDBNQ0AtcTR0M2ZTX3hfYT5faWlWYCNyCit9REZBPGg2c0hPSzN3VV9OZ2c+RWNqeEBfa2JrR3w4SmUjbEZfdFZMdTNOeEEjY051ODJEdntJZTFmRU03K1o2dHkzWkhGcTF4KFZ3ST03Cis2alJMTytPO1hpd3REdz0jcVV1R3NoTFMyd1MwZyRfUlJkfnd4eF5ZN1MwOyNPWlQkYmh0K0BvI2doQEZRdmZ6ODxPOGEqVExad15yMGI3Cis4Y0VFSVRFJDg+PTx5T2d0M25pVF8/PnAkfVFvSXA1Q35oaDtwQjR0Ri1ZO302aj13KkNmODhgalk7WU1qaVF7TEBzclR1b1ArdCQ+NWpnCitZJT1BKGMtaDh5Rz8kSlY4RTlLc0lUcFY4fERvQ0dTNjNNPyl3UX5IQUhhX3IjTHZUMUdDUmNuJUFvNkcteCtebGszb0Fxazd5ejgwekBACisoSHxvN04oJFp1VS1TcGtWcV5aUnpQbVBzWkkmYVo2PWl2NnA+NmBjVV5sPVItNlVjUkFSSFZ5X0gmRko5TVFVJXFCeDgxfXIlMEd+ZChtCiskYChWP3NpY0owSnglZ3s5XkM9ZE57VGE7fDcjLU5aQ0hha3t8dj1tVm5lPmUrNlN8dD82K0VjeUp2JmopXmJ0WFg1Pkspbj9Ye3tYYktJCitJOHpXfiFFZThFak9GIUtDYmNiVTMjWnh2YFhPTndAP350ZFdjTmZ4K08yekM0fmoyTnU8UnltSSM+PUJ7Ql9icDhQSW5CbjVielg3VUZLCitgbiZMdVd5TyZ7NmxyMHFWQHJnKmE7PEkhXiR1Q3tDMWlDbHNIVF8/WUl6bHhaTmA2MmNHPilKZG9jKXw3Y04wfV5zSWkmRzVlTlA5KGVWCitWOTZzTj1iITczPkI8dUR9dlVMfmI9IVYyJW9GejxtPk15eTB1PlgjUWQ8KFlSU2piQzJMeEpuQHRAT0N7NHYpJnVlQkEzWipxQ2tsZnAwCithMk9zWTMpT2YtSDNYX3whfX03aUB9UT91NVBEaVM3YD4qP1VaLVRySUlaaFY9YzItRXRIeWpwXyNIajdLK2lRNFE/dip+Umw7a31RXk1eCismX3BLZUYpfStOOV5wdlZhNCRyOHdEdDA+VnVYYlg2OEg1Qz9OSUc/SyFMM25uR0I7bDcpS0Bqdl4oanBZRGVGPUJkOC0pcis2YnJLQi1ACit6az9qZGYjKStgOzkhVm8pTm92TT1CUGtwSGp8fW91cXhxej9hLW1NbFF5YTxocztSQzI3OCZnYG8tdTU2Tyg2WjlAPjMxRUklbnheKzJtCiteUWNYKypuSypsRC1Kezw7K213YCFDd01KYnU3emwlMFRgXnRGNGs9dGxTTC0rLUFqVEBybl59c0kpcXQrc3pvJHpBZHVjISUyQSZVSldgCitLX3NUTjtxYn1LTUJJMXk2VHk1RWVoanMlRXF0SzxuNUVIRm1MVnZtX1NaaWFeRi00OFpyQSooNDFvfmV9RTkmayhybEoyP1ZTe1MwWTBPCitwLWhnQjlXcSokPEBxWUxZMDJYemU5biF1a29+OXc0aFA2YWpKUCVEQ0JQdTBHTE1WT1lAQkgxZyEwN2I4M0QqSSQyU2MkMTtZKk49fClPCitvRjFXWkdZUmZXUDxwbi1mdyNkPG08Wm03S3A4R0ZJWG1SP1NFUEtJPDZnUHROOSpfbHk4OWVSQzNab0VHNnMoN35YSFl4bSl7czRFVD44CitkKkgmXnpUan5WYS1XS3shMVNWU0x1MDR9RlFUUFMmbD52Q3d7eUtle0kwfEQ1cngrY1gqQjFBdFpxZ0EqTV9XZnkxUlE9JGExMlVIdWs7CisrSXtKRD5tUGR1OSEwPHIyPlA4X0hoU3Y/eV8kVXdiKD1BUmY/ZCFAYCVwP3lUQy1YI203bDwjQjIpN3paVGNhSDtzWHFXXkhwTTlZNyEyCitQKztJbCp+IWJRa1A5MTR2ZWJuQGN4MWliR3wtJnhaJWd1S2kjak9kMnJuQDZVdjJ3Uj0kO2l+dHF3WG8oQ2F+cUYqYm5wQmhwIWY2cG0wCituLXwhbTM5cGVWQDk9dE5zMG9lYCF5fDtJSV5GSSFUaW9DJT59ITBCUz8rK3xsUChEUX11Z2tWfUtYREUrfEs0eFRzbnZoR0g0N2pgMmFnCisqIUt2WDY8MDZkbSYocEg1QGBtTTs7JTxNSGpkPngtfXZJYVpeeXorX29gQGA4cWYleVVtU3UhUGQ3PzdUdW4lQis1UHtaRkNWWjhQRkZhCitiPn0mNXVjSnJZPj1nfnA9Mm1pVkZmZTI3SnA7eXJ4JD9BPkZ3e1N8ZWBwSlU9UVNzcW0jc2pDUCFaM0N6d0hIPj1MTX57bTNoWXNCRWE7CitwQUZtKClDWVZWPTdLVSFkPlJ6MiZ4NEU+KyVaKmN0XitAek9aLVZzYyt4VmQkeFA5RTRWND5OOTliQzctRDNPfi1qTHojQEwhY2d8bWg7Cit0Pkh7PnZJWi1KQmR1PTstPGA7TTdjek9YfkgpdndZMmltcHwtaXkpZypmX0BBNno3TXN2alBNe0UxWElWLSoqR0lNUHgrJEQydDc2US1mCitKNzclfWxTXz9iezJJO0o4Z2tqeEIlckFYa1QqK2l1UXl3fGwrWFAlMiQjIXtGZkZDaTZLKWRyVFJje0o+T35WZVJLMyhDZVpBYXRXKzNWCis9MSg4bjNBZXJVTiUwLSpBSkk0cFF5YDlUMGMqc0VwRHZFe3lzQU9pPEJMemNkN29eSEpFbGRIV0x4UGNrKThCRU5zQERBQzJ8bkRoSiYwCiskJCFxITBqdnVOOTBPJT87b31vTXVjWDNHRCgmU3BBOVZHYj1ue0dDZlRRd3cxQ2xDNU0lZjlSeURfJkoyK0N9KXcod0hscm5UVTB1eSUmCisoTUIrTkFiP0Y1Z1J7R2w0I1VQP21INTR7RCFkM0BSZUYoanEmaWZeWCMoPz16UnA3KEtiaEJxM1E8RHBFPFR2UFZLSTNiNCpqamtfZS14CitCazt0e0dAbDJedEVYbXFTIS1tcHdLTVZwMyF8Sml8dkhxVHlkN291RHprcj9vYT0rfDcmVztzU1BGRnlZN25ZelpObVA8IVZBdS12aVdgCis1IU17K219JXVDNCtmO1JVPEZSUzQ7QGZpYHlDU2wzZkhQVVFia085S1FIMDAwMDgwUH5kPU0/RGQpMCp3YSUwRSFwQDAzSEFVMEJ+dD1GCitKRT9MWmUod0FGSngoUmJabHYyRkt1Q1JZaGBrQ0VedjlSNztBNmF3KVZTITEjZn50YV9iMGZ3JjdrRiVZZCVQaDUkb2JFWk0jVWZ5ITk0Cislfj0rOE5oKm1xXnVPO01KfHQ0MmJCb34kTks4QFp7VSVTemBLeG9YNSoyU1lPVmE3fWBHMFV7Yn4teUg/P3JvJWU2IVVnZT9LUHxae0EqCis8IUBxQ0hANFRUMGF6cD4lWjJANHZARCp6bXRCNGp2WnlFVj8mfEFAdjg/bnw7UjVKM0Q9JGVYWjR0dWEqbDJHOCtYdnJUc0UjUGU8OFFaCitmKUJkcl84JFM+Rkx1UmgjZDc1WjVkK0VuRUkjfUJ1XlVqTypwP1o7bmxhMS1FV0NucVBMczhtMn40SjQyJllhWTIyNEg2PUlEdEFtT3ZnCithISkmVEhDaUk9VyRgVnIkLWpvVisyUXUwRH0oeld1SE1JPHB6eXc/WUNoclR0UFV6Znk7TysxNkE4eEJZQ2ttU1J0ZW1Ec21iNmFVcHtVCitCWCohdkByQFZoeXAjRU97b3RwUXgzMXd5IUtlVURJWT1kKnttI1NVNiY9ZkJ6R0JhRz9UNGxJPWkzRVd+LVZpTVhueGMtQkdZdEUqfTExCitEP01NJTJzfGkxez1PcU0tKlhNaEYlTWBnPDl4eE1mdCpxeGt0JXZUdmspemwyKDV0Z1V1RmxOalF1eFRsQTcpeERvVU9nPGdnXnE8bm9kCituNzZac2VQZUZiZEw5aGYhT29jYTc1YiNlM1FZUlJGS1l+YXdgYVdqVmg+KjtaeiZuNk8tJjBFZVllRlJARiVsYzN7JGZvRjRpIShWRCR5CitacVdNMnJZKCNJMiFnVih+cDJIYWRzSndoeWw+aXtsMFFebEZlJGVGPSNgejNHSTslPDN5S1ZZN2M3UDEyWkZRUURpR0xsTUdiTlchVDElCitWOTI8YmZuTHBOUFBoZlhXbChJYmAqUVh+SyQ0S2B4NGE3WjxNPUNNYHs+TG1DMDVQcGxgZHgxblNjUDFZUipgSmhlIVRCeD8+ST9xVjlBCithQ2IpWnZ0ZzlwfntCdChaeGEpeEMlfD1iU3FzWkF5cUFOX208RCtET2ZON3FZNFQ3dC1Ae1BOJSVxSDleUCVHO3JEZDQxJXJnfVpZdkYrCit0UjBBKitWPjx9bCE1SUAzRUZkQW1icWZ9ZFNSKzdkKUFqOU04ak8yentsNExlNjloVykwISY9ekokPEtubD52fCV6QSgmMVE2WU9RY0g1CitaQ2FQc0N6VUhpMjVPamhmU2xud05jSHNIMCNyVzQtMiE9Z3ZUWnBfTyRybEFJOTh0JiF6ayo4aipPd1NiaUI3SDx6QFFkYHN0fTZoVEc5Cis9ZyE+S0ZRWXNLXnRNU29AeyFaOUMhJkR5TFQ+OENBVVo4M2FUdkBeTHZOaDx+OSNYYz4mWElzeyswbEQ3MzgzY3ljPmBZPV89N0kyY1I8CitmbzJBK0k5fV93eWN8dVNwVUZzdlBfZURGI1lmek9SOUNRNTBGZjRQQiM/NE48WWh3dmV6amxnP21gc0Y+K1VGVzhJe2h0b0lNLXU+aj0mCis4P3c5a1ZlezhQN0w1cHdmMjBvTnxkJkdeJTUrTWQqXzMrdTY/bVUpQ0V+e3VtZ25MT0ErbEZCKmU0I3VXaHs7VGI3RC1eNUBUPCtVTCZACiswJkZOITZeOXhgNCt6QWhncUUwQTRaT3ZiJnpSaGo0IWl1PU1eUHslYz1VTShCaHRuK2hpbmh1dSpSYmF2TSYpN0BicHMwKUNVckduVE4+CitrZnQtSmRwdFU/cShUeWlCYXIhQitYP1RAaHl8USVZNWR3USZ1fnc2dDB+RGpARTNeX0lsN3Z2R2wySldNU1hRYFhveG4/cXdKNHlRTHl5CitFND5rSHojLWhrTUxraDV4MG1TJDJhT0lWQGl1KXpLK144dj8pYlJlM35qM0ZtTk18JVYpNSpUe1J1flMwbENTa2xPdmZNI298RH0oVipWCit1c1BTIX49fGVZR1d4JH0zVHFEVDdYcGN+VV9gKFBZPCVDJGZiPFh6RClHJFFmR3ExWiE2XkhlODtuYEZ4eitxM3p+eiFOSUlBY2tCP1BhCitnWjBfQ1dnY0JJRV5wey0pVmE/VX4/IUspVzZzJGcpdFVKVXNnQFotN3B0ZiE8ZG4pO0ZhWkVBZWxmd0NfX0VydzFEN1JHdCRLWlRDIUhtCis0LWpGYU9veSskMCUhZTEhSEBseXNaK3IkcC1YI0hTdT5fNkFfbGJBc0NoejhneG00M0lhYjZGVEs8bjFmbXolIzk4TD5NbXZfSl4lOFBfCitSQmtEfGJ3ZjFUe2tVSyFUZjU5KkBRbWojbz4pZFY7QkY4PW1RSHdWMSl0RytZWCRJRlNtXiVZS1JWayNlRX18VUA0NW04OXooKk92OyFPCitNa0BWbG0oI3k+STsocVZATiZLKkpndnRySz9GdDtlVVlYXkRyQ0FLMj1ZYUhvRnNNcCkme2p7PGl2JlhiTEpCYnxZa3c5TH5xWjBZJkt7CitDNGczTGx6LXdMRnJWMiV7KkJ1Wk1FQVd2ZzlZWjxWYmMoa19sPDwqbkBFVypHUEpvKGxUdjJGaXN8REZCZFRmVEBuQDApV3Bjb1ZiaCQpCitCSnstN2h+Qzxtam9Gd05BZWlsOWRKcE84cGwxc1pZUGhSJGZHRUlsfHBXQ1VQY21RT0NLcGhgMjIoWmhFSms/VUF5e2E8QTx4RWV5UkN6Cit2VD9mbVQmPnchaHU8ZFlGdEpzaUhjPzFuK0tJTjBMUUtGdmQ3SGE+cGo7PWlxTH5ZcUB0cFcjT2g9JWkxP0ZMbUlYPnw/Xjg8I3ZxQTxHCitrbXArTV9GZzB0fXNJSkFeRGo1QU9ydEoqb3lkJkR0PSNqOHNRaS1fdV5iKn5QXzghJFlzISNNN08zWU85eFZqQTk5N3A1ZWU8IztoUkhVCitJSjlfdVhqKUhVclo1MjhCNnFYJjhfTyhrN0ZqTV4xV0djVUs/cWxHVHJpeWg2ZEExNjQpUDUyKSU5UUUtRC1+WkV5O148Qz4pUHkmY21NCiteLXxrYilFUjRCYDlCKnhjU0tGTXV+JmIoak5YOy1iWiQ2dDZ1Um9KVEY5WW5fR3peKXsrbCViTG1AUT05TSMrdWcqdFROcTFWTnA5Zzc/Cit1Znd2LSVEb0NzWWBQaEB9UXQmTk1SemdDRlkwODR6S1VjLX5ocEM/c1UyfnE/JGw/KkYySFpQUF5mKmRWKTZ9KCEpd3g7TCo5dztjKVJjCitQKWg+QDZhV0FLMm10ZXk3RHhEPD9+N3xBMDA2MyQwMDE4VjAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFFvRmJZV3krYllVKVZkRj8mCitAY2lneSp6eCVJWDxLe198b3RlZ05kVXRpfVlyVjsyPilYVzF2emA1QCpIej5aWkw4S3V2eSNTK3lVcVc4MFFmQ1puc0tzeT9lKDJzeVJqCit0XzFWSW80S21naWlsUDQyNHVkPStuK0dESHNhYElwSldOVWtDbj8wfFZfalBgQy1MbS1raTB3WXoqPTQ4S29WfnFvdWQ5LXNSRn5+dFQ2Cis2WllUOXNNYT0yYmFgUEE4blJTQktBTU08PXNzYD1Nb05uWCVfQGohdXNjemtHTjQ9Sio2M0xjNlU7an4qUV5tSVl0JXZaYzxmeEAwWVlmCis2ZHp6ekBfWjZzP31KX2JiZ2F3QHJKI2Z5PXxzalRQTGdLdlp+dkxyQTVJT1IpPDlqNTk2S2IoPXBxYj8lO29SJEFyU31eZU4qWG1ifWhzCit6K3lCLTQ3TSlvWVFkN15hQERTQ28rSzxeQVk4VThiMDcmJWlvRTRAU35PYypAJiFKZkg9LUx+cTxOdXdFT15yWmg2JW4mRjd0d2A5KUU0CitCUXZGXzNTNjR1MV49SGt1d2dqbEQwYG5xbys5SlEwZVZGcWw1QGlnPy1TV0REVXowPyhvbVkheCtOdkhXWjREcH4tOzd5OXphe1Bja35kCitANEAoKFRqRV8qR35gVVV7MFpnfmthVGhfZGx1VUQ7XjMtcWtoZDdFNl5DcFl8bCUmdkh3JkAoeWxzbC1VTiRNPzxyOGtUYTUzLXMqUyk4Cit3MWtAeVgkdnF2VXdEd1N9fGhIUVFJeXBGO2FyXmVqJTJHRjxAT00/aT5xa3Y1SDl7bnZUWkstKmJlUzlSUV8lNGx6ayE0RTlwMFRBKVdSCitiS1BWdXREQ2loM0poZCt5KHIrRGxkekMtbVpuKnd0VFR7U3pFeW5YfnV2Vj9gbUtOaWB7WndXRFcydkVDJWpfeHJEcSppKW09JmNWKjR6CispbTU0UWpjNEJvM2EmJXFVM3BWaGNjbUZxUU5DTylFX2ZYcj1DSGc/aSMlSVRJUmk4O1J2Z0tlaT4/SDluPU14dEZkY1VBX0UybjFxLSZMCit9ZlZHblpfOHNoJmVSZFk5VldUbU4taFRhNmEoTUxlTylAKXJ7XnJIdShPMXNIeDV1LVd2Klk5MDMma0RMSVN3LWBoNGYqbzIzOFJfSnhUCislU0hOanBDX2ZvVXZMNThzLWwyI0YrVEp1WEBCTnM+bFAxJkVTQ0JJeDEjWFk7ckt9Y017YGRwe3c3MDtrS3RTSlp2UitWIyg0OWtBfj5eCitDXzVNbzFOYSFVND92LThGfEQrSyliPjA3Mz4zTk0wUXQmOFdmUWNrczA0dl99RSlJUXBTdjteJjlJTjI5R3xfdHtTSkBeSlIqI1I7XkZICitTczJyQUNPKjB1cHt0YT4oU2RIWkJlKkk8MU9hP0w/XjJTP0NnN05eQDJDXkk7VWswSDJqKzEtJkoraVY5UCZNM3FEemJ4V1lkVVJ2PTwpCiteVkB7dlNeJmJVZTlwXjshISkqJVUrK0JveCN1QmlLUVdFfERZSnU/JnY4SEh1KVYzQDMpcH1+bTFkSzckRksxM0h5MkcrQFJtMExBYUNwCitISHFTVnJhViFLPXF2YGVmO1BgOWM5M3EkbnFeRE8wa00yKyV5bDlNUHp4Zyo/bGgtTDZRfUJQVzVhdXR7IUNFITE/fW0jd0s/eGFOJC1uCitZPnRKPHEybEZpTEpfNFV7OWckQ252blNGcT53QGVHWVlCcCFBOHp9KFY9WilfNExXN1Q4YHVhZFpedFE9QCpneEMta05AWW58NUgzaWZiCistazU8enxzUU5EOT8jQCtBQGRndHgyWiNOJEsrVEswZ0AqdzBYTilYZF90ZEl0fSQqU0wjeyYhdVpvITt1ZU95KXRhdEBIUVVWJiEoIy1GCitmRVUqKD5lVSFvTyhVKXdGQ35vSEBnTHBudGdZQWQ7a2l2dDEjNDI2cF5tfEwtUztSQU5+X1JpcUhQPz09X1YocXJYUytUTGl5RkJXUSN3CitiSCo+M0c3b2wxOVc3d2B2M3ckUno1RyZaanIqanJKZE80PThObVFwKWdgbExQT29fM18xWCNhR1c2KXt3SHhaQ3NUQShEOF5xQWlqJFlNCitpLXRoSVJ3SVlRZykmKn1gTVhee1lASjF6bTBjPHZKTiZVb2o4bVd2Z2N9WGZOe0RFKCE9OHA8MXNvPmIzeitiMExBYEduPEVHTXdTcX00CitTdF5GYWt5Sk95PUl6MjleQTh0N3FLQWU9cHE/SWwlQz5sTj0oPkx1OCNVfDhaND8yQWhKYElaYCk+Xlo2TG12U0NjdXhiYGZZfmhGdHFUCiswa349ZGhqTDllc1dEPUchQ0tTd35nTE09bkJPX19UUnhWUz9qTSg8TT8zPWBhJTVFR3JPPjdYP0BKQyk5YF4kQVpEZWZAOCpsMTxwbVVaCitOUmRJI1ErJSlmdzVLSnF4Umwjanp+JXk0MFpSaVlTfVVjVi0hcGt6KSgzODxXVG5mZVdDJitlMnlTO1hEXldGZkgxQHQ5e3cmQnl3fXMzCitGUkVMeDBUOTViWiF9QWptWlItXz9yMXYkcVp1N2hqPCktYHF3ViZPV0AhZ0IrVjFDNGErZkc2YEomczVfej0kT2hXIVg4STNCfj05Qmg7CislRU87NHY7NzJIU2MwN15ld0w1IXlFKktJV1VoRWV9ZGk2dG5ZQyZ9Km1nfE95SlZQSDJES2teU2A7eklBeUh7b1lCV3pENEJeclR9bX1ICithZUJzPERCNE57dkghPFNYSWt1b3h7Y0c+O19wWSp+cVlPUkt+bj49T3YxNjxHdCVoRFQwWTlUPV9pXld0Jj48amJQdUpzb1RIKTgrb0ViCitQentkfCQxRTNuREx0aFlmSzxGWEZGWV4xbmo9cCU5bTVTPylOeVBII0MwbikhN0ZZOVRydHBOYFIyTTI8KUo3eThOOGo3eyhAYmIqUG9pCitATGh1QzZrSitsdyVqR21WeD91KTNDZHx5KFpeb1RVQUJsSy1qX2Mxe3MqJVIoYTtVKiMkNWtjJXkrTEkyXjZXK1pMdmhXKS1RO1J2KDtJCitucX16TnNvX31URFlgKyRJPX4/NDFZc3E9USM3WS1FIVljTj1zJFB1S1l7OW87NiRUJndKTmVRWTVfWkZtWGBPZFNASnBUJiQobl5UWUw8CistVGg8RT54cERocFh6cm18Y3NwTFdiTD0qfHAqRmpiLX5qYW04NSkoJCk2P1QhNV9pRG1LVChURj9QckI+dzhzS1FsNHkmclA8JF44Q2heCitTYilAaSp8PUZ5JktQZXQwMW1Ec0k5cmo9P2glJlJAaShoX2VuJWk3dXQ4REcoanZiZ3FhPnIxQDUxYDh9OTN2QUNaJEhkIUltfUdtI0lKCisySzghcnN+bzhmPytSU1pSOSFKSnh6eztQfCRqWGpAMm9abSg8Rk1SUX0lP0ZITzFRNj8/Q1dMNDckdUVpKFhSTGJnMEdCaSMwZGhFYnhECitKPnR9dFlpTChSP14jVFQ3XylGczZtQDNAIUFHV3I0SFBzRmRnXiQremg1QVJ+RkA3KDlDcE8rbHsoMndrUFhSJV57Zjg2QWZpV2NFQGczCitFeSVSQXdfVnVrKWd4dWUjbDFiNFdwQVFFQ1hMQkctez5fZk18UFhEYmtkNjVgVXY2eWd3Y3pgPUxlQFYraE85X3Qtan5SPHBWRypyN1N4CitNIWNtSzUrUyQkWSsoK29NSn5fMnMrM3B0Q2sxXiEld0I0MXE4Kj53MSRFSSRzNG9gS1UqZENKfT1UUkApMk5CWXEyaXRgfSlIOzNsX1NNCitXTG5MUnFYOERfNiR1VitXNkMrWk4wRXMyUWwteUkhM2ZBaGl5VmNiJSMtPkp2cGcrTnsob303cGFrbT5ANWtNWkhsISZrR0RnTz9wPUxVCitpXypnVU8lTSQ9e3clZW1nej8hdVNtRSMqU3tAO05hSGdGZ19TN2pkX2diNT95NUM8OSN3SmppcjFuUENpdDhQYEsxTnMyWCVGMSNOfXlxCitWOGVETnFLbmJmRmxoQ094TGtHTFF8JCpPPD1hXlFkfFRydn5pdWd7Y1EhfkJgOEBKNl51eExRNHZ3KjBCUmNiM2U/STlSaE0jLTdSJjNqCitUckdHRm5ne2ZYcmpaM19leDJmX0N0aWBfV25SdFU9JHIhe0xLOTxub2RgTnFHPk44Kzlie1JLXkcpJTMzNUshMkcpdzQoSCkqIXtEWChWCitQMSY1WDQmY0tCQUtHTz8wWkJgZENqNTRNLSM8SjI1bDJCN2NZPjlMbkY9VSkrRyNXWDIlSHdBOHhRVzxmPH1TNmxlMHt+USgpcXA4UGghCitEZVg0VWNYem5+X0BQTn5vZXVYKH1LaFJlbSltLUFZJFNOSEw+SmdCRn1hSz19WWpRbE07OCUtSDEtfTYrY3JlTUxmWTEhcj10YzdZI3hZCiswVG8lTzNSanc3eSM1V3Eha0FTazJQLUJfYHwlc1BFVEwjPyYydUM0SmV4eGg9U0FpTkNge3BSbFZPUkMpMWtRc2cmV1paOSNnP2g1S09uCit3Yz1IMDxjSnpPSVh8fCRrWnVwMk1gRVdjaHlTVmtJUDF5RSRBVnd3NCQrOCZRSVVHYypDLTRQN3xiUSRZSk9AN1JlfCpHVSNfb1M0RTM8CitfbSopKUMzJV4qTmZJfV94RXZEK19SKD1PV14lZ25GOX1ycTx2RSFvZSoyTGVCWFY2dFg5IWs5KVdGVWB7SCh3TkJTI1ZZSj1eVyo9d3lTCitQLVk+YmR5QnNKcUg4b1ktaHkyNjVTVChSVG1YYHIxSEJGPXc0cGktcj9pO1A0KEFCWj1mMD9lcnB+dVU0UFZXJkB3fW83b2VNdGQoKjJHCitUSTtlO0xDKit+U19FWEg7UVdwV2QhSWotK2JzSz5IPjJhMk4zRmNqJT5tV0BZIzFKRHRadTV9V1IzPTBMe1ZeNTAtPzFlYjw/VjU5eFIqCit1S2o/cUgzVFAtS084RT9ISntsQHdMemo8bWd+O2BOanwjdnN9RCp5SEFoKGlVI2kheVdgckojPTtJWjl4KiZHdz12VVhjYEx2WjFyeWZ7CitlOUdJRnBVSkdUR2BNdFVKUE1GIzdOfXZBbXwyeTJNOCVuPyR8dlorV092UTApWHg9a0FZYCkxRTtWTTIxKkw7I240N28/fGY8flpgJkdqCisjXlMmKS1DYk1OcDB3JGtXNEV1M2d3cn5SMS1kT0gwQGpVOCZ+MmNfRiNicnc8M0h3RCNqYGRfcVMzVWQ/c3klS3hedU4kMEdmbDtMMmkoCitpKGxqQktTZFg9KHJ7Z2lGOXlfe2JhNlhwVVF5UEdCPDZHRFcqSkBJTD05eXBeUDV3Y20pV2c/eXRjJWI8ZSEhYk1wVEJfc1kxYEkpP0JPCitob0NSPWJLKiNGR3NUKX5fTnR4IUY9JEQtVHY5RFM9fW5CP1FGWkdvWTQwRHVMejFVOTtsTmludXhqdjROSD1hRHJAWT5oRVM3Vz5oZWxVCit9K1NHeVombil7SC1nbW0xYFF3UHQoT2YqTDsmUmB7RkYkQVprLUxfOVpodjFYaCVqK0V9S0RHWTJ+T3FuR25vZCtZIWoyO0UqaWpDJWBhCis/YVlTb2h8TCl4UGJrWTRgS1NMPEMpRTkjLXJvanRVZXc1b3BueiRwfkU+NWNNWVJ4TzBrTmhTMiF6b3hkYTQ3eXkrQyF2eTJzUmtVP2w4CithdjMrYkZYUHxfNHVoXjx1ezNRamJGeU9HX0xzfSl5cj4jKD5qUzJ7ZUwjUTBNMUB9TE9tKSMqIUNidSVUQiFocTZ+NypSMTM7Wj11akBwCispZjZtUUArR2dLZ15PQnxtI0d+TD07Yj1HYXk2Q2Yod2deIUojSUMkJjk1X1RzenIjbElAKFUzMHVXaH1YUW0zY09WMURteWlKNz17QVJiCis9PUt+WiEhVVNtbWxxNmkqRjdfdXBEeWhtUEo0K0dvTktfO35UKX5qLVFnUHlmM0tyTj1mcl9CO0hvajRrVUp4YXZYY2d2I3J4ZCUkP1BLCisxPl9UcEFafDQmcFVMQjU5fjJRTmxFbE9oVGFqcTBRQnxuWDRmSWBeQ09GTThoTnE7QClCNWItSzZFWUYmezZeNyRyVENNJDdLNyY+MFFyCitTTjJEYD43RCtOYHUqMCNOMiY/aCo0QGgkcnU7bVBtbmtrR3srX1k+RzJSXm1gR3d1NGA0KFhAKDEqWnFxUz45NyZ9dEk1NWZfcnNWfTJDCit1QGlkN1h0TmAqTX1hQnJgOHJ6P0c7QXc2MUF7ZnJeeHhnVkBNcGFVOHFoMj9ic1VTJFVLaCNydS1UYDd0QDFMS1RpMkk0ISs1OSZmKzJDCitKOClNTHI/SW0zIW81VXxodDAoPXsxWnd8MUB7dSlpT15Le3czMnc8eDl+bEc4ckJhVkBib1l0aDt1Qlk+dEZUTGxmIUp2a1lAQXk5aEBMCisjVHhsOE0tI0Akfmh5YllpN3hhSDg1UngtKyshOGBRIzFueGJ0dCQ8fUl4TDxOTyZHTCQoN3wzdC05JGplQ2ZBTXx+Nj0ybjArPz5DRWs2Cit7N3Qte2JKdFJjNzIpKENENmdNbnpTakUoflQoTz1HQClQbiF8Q29rS1UmTXc9JFREbWxJKChES3ooZ1BNVW44TFBMbGsyUnFSYUMjcWBTCitnSHs9a3VVQUplVTAlfmxwbTUrY21XUkxYTVhLRUI5VXQtPHNvZ3d1QDIqNC1wUmRPV3wpciNtd31sQTZQdyFXVXx5b3BoM0FmaW1aemJ9CitARilBS1RGYTZpSzA9VElINXRSWVRxY3IzO0xhdG94JHc1ZEwhPX1mc1c0fFRQM2NEOXUwdm82T1hSd31WRFp0TWowd3pgP3d5O2NHZWU1CistIVU8Qk5ESz8xJUIyYlY/YXsxWkt4JFIpPERpczcwQ2FSKEtnUyZNSkF2bkRzbiVvSXFATGVCUj42OUR2SnBuXkoyWVN7Tz45YzQjdztzCitEcUE3WGRlNk49LW9eRmd+TVAhOCpody1JdWRHYnNAdUJFMClec1QrPTJqSGwoOGstaihAYDdHPUF1PUNza2JXPSorKzNnZnRFQExUSXdaCit5ZGFRQ0kmOXRDU2t2eHl6N28kVjFiZV5GTHdNX3sjKDVXdntaeCl8PStkdFZENV55e3poM0NHTEhEYUN+JWxeaV5rZ2JzS04tbDUjNHpoCituTSFNbn1vc0dhPF9YcmswIThwYiM0XiRMNmdLP19wbi1rSC1DSjdCUDF+MCpAP3BwNC0pY08xYmF6QUNsQ2k+Q0RiJF8wbmg5QlJgSjtICitxUzR2WWtRJTBiQilMSHJsdEFJUXc7bGRPa0x4fTV4Sz91KDl1PVc0IXNBZ09JXk89Vm1rQV9DX2t2Ti07XnBDWXVWKjZIdWpiZ2lRNVF7CitQYXo3IUZDPyl0MDlTKmFYc35lIU87Y0U1SjZyPlhIS0hpUWVCRHlfcndEbk40TG9ucnBRckItQWxQKmpfdWBoaXAyOHI/VyZfZFpFfEJeCitIYXhefHRBMlQjb0RWYEVyLVNFNVFCUXZyezRSfVhPPE1kVWVGZGNXaG1iPFJAaG1mdSRhN1ZmZTcpI3NrMS1DMFd1JEh2cW5rR2s4MXdOCitxSTYjOEhqWip6V2EkJnp7bnlEVnNmWChjR281REk2TF5rWCRgPEglNmFueDhWcjNxYjl0RXtBJj5Mdn53a2xLaG1ya0k0VX5KdyUqRTxXCisyck88MFBDQlQ7ZSMxfXclSTkmK05jcGw1S05yV3g/eWt9SUI7bFpwNiM1RWY9ZHRXd3xXKzMhMW12S1ReXzh3KnhYYGlYSXF7M2ZzeXJZCityYkFyclhCPShiaFAqPTA+OFFeeVRgeVVWRiZ6c1NIWjl2SjhrXzxFS0JzI09RbC1VPlEre2JTZThvYDdMR0FZJjY+JFZRZ056MnU5XyYhCitzWDVXNEg5YyEqSlQzWUtRK3l2M1k1XmVIWS1DPGFGbUJLaU5PMHd2fG1gVHd1XzxaYXJjKnNzQE1oVS1CSCNLdiNoaUtARTNLI2IoSkhFCitUWjFqM1NGeypwPiQ2a2xRb19rQHIlcmcjdDA3TS1oUz1Qb0Y1R1ozajNVYTwkZl9ReStxaWd6TWNpZnIwcGQ/KWJWc1Z4QmBqUVojayR7CitfVzFfMEpgUylJZjI1bms2WW4zaStZclRzVXdBTjY0WmtQbzQ5bSYoJW9ZWUJ2WHVoI197OSQxY3xLeGxVMWN5YmkkaW9+cVVhUmdgdTVfCit8S3dNSjg1dSU3bkMjU3lLJFFfeGd4LUhFPTF5ODlEOD1oSTZUK1VNdyhPSClyJlhrd040Iz07TWt1dncyQnVEdGczY0BoQk8pY2FaWm1iCitiM0g7KVZqKUhkLUBAUEBXfDs9e1Y4enlJKkcxcGY2PktwOTdqWSlWU2owbSpLMmVMa2hxbnFjZV9OcnVRWE0/I3E/ZTVjMHMhUSNPc2U3CitxRXN4PCM7ciN9PSs/Y3YwTFlWfXEyViE4PWgrQjxTblphdHp0Q34rSjctZ1FxaT5BRlZ0WTlAQDZzbFp2JColOTBhRTQ3NWAzSGJQUDIrCitzWnIlV2VrKnAwUSs4LStjTTg9WW57QEdSTShvRztnfGpzM0trYVVkPEchYGlWKGtXbSF7eXRmdnBVST5pfHQ1eS0jVUteOU47P3hsRStOCitHVX0wKH50S1R7eXI9V2JzLVRyVH5lcXc5OyozcntpPSghQEYmN3RXcFIlNEJjekJ2O3lVZ0AyPVp3P2ohX1E9PmF+NWMxbGRRMiFocXhLCisxMS1wYkhYQHZybV9fVE42RkhmcitpQmkma2J3KUYoczZBP3x3XjVBd2t5dyU3Yk9jJVdaVm5gVSZzJlZ7cVF9X0pOPzdvMktKc0xJZWJTCis/NHwxanMpN3ZuPDVvRntLd1hraFVwR08/UGZROCo9X0VoLWk2TU8+PkdZbSUmNT08MU1OaTMmYio7X0xeaXNuKko+MyYoRXFtX3Z0MlVwCisocTduPz07aDx2WUJ0aTlfPVl4RDU+ZDxlS2NFT3FKJWF3NGt1aGJtdUxDIW0tPTk+TXApNFA5bWRpS3hLTjt9ZGlOUTJ6KFIlYVVJVFF+CitwZF5TRU4/QUkyNCUyYH1hTmZ5UEZFTndaOFAzUXtoRylNVl5PWnFWaWYqSDZWUE1lPSRSdnB9PyFeOHs0N0N5ZXM1RDk+MzkranhaNGBlCittbmRSeHRsOHBiKitPXmtFeEs1VHZsXj1WbEZAYj4jOW5gKG9jQWxnYkt6WjR4ISk2SDRad0VOQ1AqLTRzNm9VOSgxaWdRWkgrYiE4e1FVCithbEVBejg/fX47elopJmZIRGxYUTswO34yTlE+ZFpjRmNwVz0/OH14RXxAal5Hc2l+X2tnIU5Ic2EjNTJhZFNLKjNkQGwhNm1AUCVmS3tNCis9PTFMJUg7biVHLT15KTJPX2gqaGxPJDdCaCpGRj5DNkRrcjg7TSQ0SWFJR19ydzE8JVA3ZiRTPiooTSRDZ1ZsUmRwIUIzU09xbGxOO1BeCitKUmBsPHc/VkVEKXRLZH5tNitHPi1zYkNRX2wqa3xkJiZpdTNBKE0xPnMkcjxwPUU9RTVsflV3YEZ7fWMrdEo1VyNCNXc4PCFCS3VaZlJvCitSIVZGI0JQcnFyTVQwdCt3XndwNkc3PlFxbUxlJGlBPjdVPTdQKTh+Smg5ZHxNbnxNRWxqTWZ9NFF7eVRjfE9JMmI0aVArY3Y/Q0lwVTJhCitgWGEkTVRuQ0l5cngkOSorTC0lTHMrb15pVj9iMk0taH4jZkImRVVjV3Yjez1SM189fSRaMy1LV3B+XlB8R0JKM0NlMUxjSU5JYn5IT2FJCitETGEpcUQrK0hXYnh4PmdlKyhtYmBgSj1qJFVCbj9+fGAqLT1GOWowe0VrOTFIeyR8V1lxPzY5LUN4LXVxa0xzcXBeSmRRRCRRdnlfa0tjCisxYCVlSno3TFhDMiROOGxXcE9aSiYjKS00RiZ0Wm1EYnNAfj4ldVpMalZhTkRBdnFSPUI9ZHtlK1ppQnpeISQ1K3d4fiNwOEo7QFJvd2I7CiszcjJvMkQ8d2EpeDQyPnAtPGhRMW8oa0Y8byYwey1IZDtwWHp5I058XmQ3SVomTmtAYTQjPnd8YnJ3ODk5LXlGTztxP1BWMGEtZGo1K18hCit6a3U7fSl4RCthTiolLUg2RDk/dFE+aFB6bD8pIThEVUV8U3JicSR3KChNTTRYZnM4JWRXUkstfX5WdjV9Mz5mYihmUTZ8eGJHN2w0SjRSCis0OzR4R2skTkZTQ29eO2VXX0FnOVYmPD8wQVhTPF8mcj15I15gcnw2eDReMn1JPTtqIygmbCE8JnEzP0tHMFBYWGA0c148a3QqKnZWTnxZCit8JWsqZS1LWUt5PzdgUkVWTTledzgjZk9xOVM3JSE+VSEqI3N4LTJITE9xajZhJmNvKExoWHJXVkVwSjAoOzcmJFV1TCpPcU4kJjttZ3UoCitiX20tcDJTUEx8PkFrRWwja3llPV5nQ1cpe2gqQmQoSjs8Snt9aH45TlUlfTJ1NWImaFQrdE49ISNyKU5SdCl2aT1jP2J+Vn4xPVpWXilfCitrKCR8IVRvSy1UdCREPUdLaVRfTTlqJmJ2YDdafFU4Zn02PnM3cGpGKkpuUn1tITNTZXtjdzVpXz5mZVFPbFlON0ZURi1YRXBLVn1AbWhZCit8SWo0WjEtTnNrXlZjP3MkIVhwfEhQWXpBZDxqI3ReS1Upe2Izaj9neWNSajlhRzNqKCRyKUdoIzJwez88Oz5WZyVYdGY+eUhPXyE9Xi0tCitNZGdkYD1mfERCSG8xckRQIXttallFSGpffTkkPk1rdyZwb3F9MmlxWl96RF9GeVVXJHUkfT5oTSRMe3NxNW1jOH04O1hJTE89UjRrIUxqCitldio/UCohRDROc0w0XzkobHw2Wm4/Mi01NDYlQmx4MiRMOHQ0S0dSUmVMTih7K300aThtd1dDSF5KNTtzeVhVT2Q/fEdQcXIjWj5Ua0VFCitPeXxOWmF1cjFDNS11bSg/UHgyRSZgblJxWVR+RyhKIzhFZnYheyh2YXx0KUVMYEBlaFFKJWpLNjVUM01kNk0zdE5PZV9qaz51N31Uen1YCitHeXwwYTRQc2xub2d0fnx9KXZCSXpTLSZhblIhUyFJdDMjJSlVS31ibFpUMCk4NncxUHlzbGh2dHIlWlhvVEo2Tn1ifFdoVj4rNmE7KTFGCitSfHdNREVXTEdiSlAtV0ZmYEJ7aWlkayFQKzFGSyRxSXlgaiUqaTEqfCM+N008ell6ZHgrI1pBOXpmSXE7V0JGMm52Vm85NjR2Ny02JG9FCis0QWFoZVNEUHM1WDlkSjZ6bXNsSV5FMWx8S09+d15DX3J4Tzs1JiFQeEFtdjlvPkZpZHw8bl51e1NUbFA5Zz4lRlcrKzA0Y1hjUU5eXk4+CitzPVcpSGhhc1N7cFBubEF8QkpQVjAmMClxfUVfNUkpcFZOZTtUR31TYCQhQEBDUzkkeytrQjVLPEhJQWw0cD9hOHI0aTdBbndNZCoyP3ghCitSc0UyWHRwfk5gKzJGWERIKUlDO0oxX2Q/ejFqU0dXO01oZVcqJFJWSUFOMygmO0p1cCZNI0ZEezA1Njt2O0kqdV5nd1dfd1dXbkQ/blhZCit6dUVVYTtOPikyP2B7aWY5Mjx0JVVGM0dfNV9XfmI5VGtGdSQjKC1UeiNMIXQ9eWA1cys8fTlIPkokRjxtdUxDSDw+dkY2ZDhLUG8keE0lCitSeGlLV1d8TTNFZ21yZEcmKzRNZmFnUlNxJSFsKX1IXzl0TSlPK0BlUnVJJnB1X215c2U3Nk9VPHFyM3tKSmt3THhneX1xOWElP2JkaDNXCis/QWFnSUoxQig5ciFLV1F1TW5CQiFgWUZ6SyZqSTB7fH4/WiRzP3tVLVRHPm8md0JVOypweihRJn5lZ1JaQnU7XnkyRkxpcDFhTF9lPT91Cit9LXJ2KG5NVmRoY042Wm92XlY2KEsrdmQ4Pk9Hc0lyaGl3cjtvancqOUhmQmNJS1ZvO1IhaXAtfFgtZkMhbWRaPWo7dzZGVk8weFkoSTRlCiskMjNnd3olZSZEXnpeUEFrUW9FI2x0b29qPk4mS2k1MDNpQkFFbSp8KDBgR3kqezNCOFdicC1IUUspYmoqMDYjVU5jZlpwNDJ2Ml5JeWBYCittXj0oXmZfKHlmRD1tUXtGJHRoNSl0R0RXdHhaIXJMdSpWYmBKP2F9JFU1ajt4ZGJvQ1UpYD1XREFLPD1fbWdIPDg2Wn5eIzwjRDU7NTxQCitEOFUyRVQqLTd0RSFpXlFOSUx7dXpzR3BNNWRRREtGc3dsY0hicW9JRlo1MFl8X2Ymc3pNcktIN1NoSEJ4b3hTb0tad2klMDBnRXNPQ2orCitlSng0YnpTant1MU1pTVVlKmRleG1ReEV2K1dYTTl7WWBGd1F9S1ZwTWc8JiVDNTwtZHhfM19aMVgxQCVhS2Nwc2MlOVFIfUxPWWRwYnclCitkfTF4MF52UCZLKXhwZy0mQkIwNChJRnlVQTNVRklMUCEhMUswIUM3IypTN3cpaERrZEdtfXxTKHRiamgtTmtsZElBX3cwRUVOWndISTZeCit3KHpGNGkjc1NOPHQ+MmRuWXtIZUEmJT1QenJxX0BqbWBFY1FFaWpgKmIkREJCPlVGNFZxXklYUCZ8ez48KS00MUEyKmtZWkhGcnNJJERHCitpRypiSUI2Skx8RDJ3YDZKY31HP3lGcDg/JDk2biU1Rmg/Pkp7TFdYRWBlYHdNVkVeR2xTMXAyRTZUPyYhVjV7UVpVUnZ8QS0kT0V0QEcjCitPWWZLMG49QEtiSFZJQ0N+KlhUR3hNYGV7PEwzPTNiVW43Tj5MYEI+Jk5TdV5nMUJebGdjWHt+I3x5RiEwTll1STA1WHJSQXs5RSpNPS0tCis3RHY7T3lsPUwyN1VvZzlAd3Rge3pGMk9Vb3d+SHhYekZXYyhLWSFQfHE3ZFhJPWtkeWt0dkprPkJSRk11OTU+bGEyKnlpKkBsPmhhMktHCit5SnlsZHt0dXYxREZJd0Z7VGc3PGdMMXgxOUMwJDYwM0JCPH5RZE89XmtLTXlYUyZhO1hORVJHcS1VQW9KSkJNOzk3aiNtfEdKOzJseDJ6CitVa3thajxRe1NFO1Urb3NsTVF6fjdMaiQ8PklrbGFoNCZJRG8kQzdzcyN0YnpFUzYzYnReRGU9aEtqdT9TU1JBY2tYVU8laG1JMSQlS2d+Cis1ZCNqRFZjUzY2RWVybHVJUmtPVGxKVyRwOGwtWEQ7RGwySnEzdjdqTkBPQTh3elFsS3NscklJX2QtcUA/T2F1cjxRaUxZN19HNWAmRHpTCitVYz5pfkRsQUU7YzNadFA7WHNGNz1gJTkjYnZkc1A+SXlgUnVSKjdATHxPK3hXSG17JStfZnZyPzxNRXF3O0R0NzI1aSQxQ0szPSR+cHVjCitLTm1QVTVXJCFfSVpWd29NczNscCpmO3R3azJTdW1kfTVWeD1kai11YGxRWW1YQDY/Q0RoaSh3Z0NrJn0jKiloeEwlVlZ2fUdRRk8je0ckCitvV2E0UzVpPWRhWTtDIU4zUm9xQ1JWcXZsIUpSU1Y0bmI7eHVpYDQoJXl8VFE4fjVOKzJFbioyNmNVNkZ4TiZ3VHFieXtTWSV6XnY/KXQlCit3a2RETUZzNUF2UzY2fnQ3byVjamdsMG91bVMqbmZ6eWhLVE0rM0JqMF9+PmJtRiNnIW1OJV45eW5LS2VMWTs1Q1M3STVATzdkMCVlckdwCitFcVRrJCFYWDFGVnpNWDk9USZoP2hAanJ7QVBJVShBQDA2TFJ2NWNiLSRHb3tTPEI1PStJRlIoeyNPPyVodk8qczw4KyRRNEJVa1FMQVU/Cit+UkBPTzBhVGJnUnNYZEB0WHMrKTc0eWJjWXxlekwhNkNpe0ghaVFxVXtoP0NWNXZtLUA3eV81VEQoaTdlMWZlcnNeX1NNMDJqS2hCV1IoCit1ZjNQWitSMkNQPmVGS1BYNlZkcTBJb1ora3h6Tk4/QUVEdig7YVZNNntsXiombSV0Z1UoXm5lP1UyZDRxQkdaSDs9S3tDQ3VxdiZ3PyNgCitodC09Z3J5YHAyNWM9OSVfeVFCPEpmT2otZGM/WVpQUXU/eW04d3FeamFaaVJEcHQ7X3hjPUFZfiRFVWdjRSo0KlhCVHBYX3txbXtWN2d5CitaRz1idG0hdFhSSXdWfDNsRUN9eShjfFYzRHFRcW41UFcmTiMrPXtHPlVaJSNGRU5vKFIpY18xKVIoKTUheShvT1N+dnAlK3pwbHxga2hvCitkPDYyfFVTSTZuYyl+ZWQjb2JUZGVSbkYteV9MNl9UY09wJkFRMDJuQz1XYEAkaTNMPHx2O3BBQ3FGd18pJGxAfHxPaUg7fmsmdU5KQ35nCitoMW5FbChgQC0ob018TVBgRiMpKyU2P0JMeCNBZX5HaDNDNTF7XmF9MXdMbW4wLWAjWGBFYk9PK2EzRkR2fVJDVmlTbkNmMmpqXjgqR3NjCitMdUdIQztwcz5ZZ21ZRTZhfkdFMzhFPEs0JTZSWGshZiFSNHdoSV51MVgqZzJ6UGRsVE1MI1FycmZ6YU5PalpVcFFhbkNiWT1oR0V2PWVICisyVk59N3goSWBhUCh5XldPQDVMVGJ5Uys+bjdqP0A7eHc0QWZWIX16NFF+JDZIaUByOGl3VkItXzt5PXA3fDl7RzBgQzhocCstNDNKNGVCCistdkJHOG4haWV2KzVtTCQzVkUxX2g1fSYrUnpKMnEwIW9oQm49bkhlME5IQT5qNTh8PjREXzg8JjZCajU9USorSzc9I3ROO1AtY2pqOHhvCitrNnhGaXQ4X3I+QERaUiUyP3Q9QnIxKGlgVWtTT0cwfEgqaVZhTSEjMmxqO0pqenF5PXhhMjwkNDdQQnFxZCsmb0NHczFUWXJeUWAqP3x0CiskUWVAR3BLQloyKCFIazYoVnNsZVRuPXF8M05vYS1RWjVuZjctNVZaKzV4dXwpMSk4JWEwdVEjcXEhfk16bTJENDQ8UE80T3cjPyFuK2JzCit+TmBtY1RZKT4+OTZmZ3w7bV5Jb0JXVEBBTXxUO3g2V1BLa0gwYD9vSnE3SU9YM2kjYWhZfGpac2B5cUU0O1JVKEdqRj9VKD4rNFVMdGgpCitJQXFYQj5AVUE3JW5IVVJ5bzhVdCtVdX02PHkrOE1Kb0krUCloPkA2YVdBSzJtdGV5N0RzUXhvX1RyOzAwNEk+MDAxQlcwMDN9bGE0JW5XCitXb34zfGF4WXxRYjk4S0pWbFElS2I4bUhXVmBYekxhQ3htLWR5bV89NSZ6JHhnM2FQIWBSWXxTY1Amc0RVOT9HPjkyUThFTG1tWk0hJSUzCis4d3dhWUJMOE4hcklveDtlJTx2Jm5sRCohJDhiTVolbmM7QXJLYSNwJm0pfkVxUmg3JGZHaD0oYnpXZ2diOEN7R24qc0gyT0c7KmBtRU98Cis5eUtVX1dra15OaGl7Sj1pKXVkK15vOzttZVhRaStgRGlzYExqS09na0FEJXI8c3Q/emp3KnFkciE9M0dtNzF7YjFYOUVLYCZCYlIkISFRCitHfTJWa2IoQ3ZPV3NJLXJsQD17cUUhSVI2bDZPJWJkTT58TClVPW8wcCRJejVubkw5fEdOSS1CZGY0VyRWNChIekxjSit8XmExTEI1MXBoCiteJnhXR2B2dXdrJHRoME8wMlpJbGE7JEZzPzchXz9RU2RPdUlrJihVZHpKV3MlPjw0QE8xaTYzeEQlWCo1K3p0NmlsNjd8Q0NBPmF7Mm1VCitDMkJOO2VUXzA1JCU/UEdCRzJsa3N6c3ZAUT8/TzBxbGVqJkQ9fXA/KlZ7fjJfRXwyUURTTCZOcVkrTDUlekV1K2xMRzVvZFh7OGEkIy1DCismJCFJaHBNeGM2RW00ZDxWZn5efENIOH0ybURAcy1oayY3SlozYSU5VUFYSyQpUilXU3o9Pk4lVmduWVNKZ1h2YHtiKFNTYzZ6ZUhONFg7Cit0SUNCZEl1KF88elRqbzd8MFZ9RktNQn1CIVlVPHpXUCsrZ19keUdySzNxNHEqQ2g/Z0pJaFokNEMkSjdQSC09REEyTkU4aW40WCNWa0xoCiswOF5tUHVeOFdIUUF1bDV1MF9iVj17VmxaaDlrX0YobFNubHRkZyskTzE/RHZBTy1JdWw1aERhe0xFUDJnbDNNK0o2eF9VeEl6ekVQQVIjCit1TFFOKXtwfURZeSp9a3lfQ08/SmtQQT00ZDN9VUd4aUNuWFhLPlc3cEwoVHdpSVlYNkdkczQ4QzVjamMqVXdVNGUzTk9TKzs1Z3lwNGVECitEdUopcjN2XzN6SXsxe2RQWH1qdFZGREF4LXRqYCgpQ1UmTXchRnoxZyFyLSRKMnR5KT9RZSNua3k7Q2I3ZHlzMVYlRERvUkVsc3F3aTEhCitEKC1XcUFGPD9rcCFxbSN1cGRxWFFGe2pRblZ5SUBfaF8hcSQwUmo+MElNY1Budlk1NihFNmE3Ml8mSjllV2tkfDs2Zm89eTRUNGQ9ZTxLCitRWWo0bnpVRzwwZXo0UEJhJXU7NChjTnpDMkUyNnJTNVVYd2pxZEc8K1MyOHlYKzRyUWYxc1o9UTRHRThEVUBkdER9ZWsqYExkOCQrTCF+Cis7fVg8d293eUdkWHV7MHhmKmVIJmFNWDdWIXorTiVnS2lNQVZtYyFSe01xT0I1dV9nVD9+YWlKJmxRcF9aPkdhZTh2QEMxITlmTjt9SWI4Cit7YVItNlVHJT1fZWFJd0k7RH1sLVlFXj1PRmtwNio4cEIoMStBN31wP0BCNDA0OVd8dG04KHFufFRMVEcjQndwOCM/JT5IKnlsSFY1UGN6CitkY2gyQkJPbyp0cGEtbWU5TGh8MlNAWUVgLS13X2h0Tm0oPV9UZGJRNWVHZT5helFkZjdEK3xZRm9lcGcrM30oeyphRHk+d1pgUnY/RzxRCitgdW1id3JVYjY7IzRpRGYzQypFIWFjfClgTzAhPnhJczVAU1FFLUc/IzhxRWE0M2dIbCFCXmxgcnohdVRRJXVBUklwcn5BZDIwSThoeHMoCis4STRzRFUtNz9zZStjalNvXjF1X2FYR0tTJHgreGxvdExnd0ppS0BwNWdPaFA2aCZ6NSh4K1QoUCUjKE5Wd0Q2QUNzUiR5Q3RBZHMxc3lDCitkYiRoRnVVTlIwNn08N31mc0shQTVAVz0qU0ZudXNpb25RN3c2NEdBUyZkekkqa25yJGF8RT8mJjNvRGV0WmBKKkZUZlQzNUx2XkEyYnFrCisqZWYzYWktOWd2PThpRCY8JitvQ255TzRvRHE7bVJkI2BRdH0jMEZKPl5aMyNid0ZHbVpQIXRoN2NBOzNjX3xSK1YtIzdKUkk1aDBFKUNPCit4Q1dNODNSUiVkM2Q/T1d7PnR6OEk0bz9wdmFWc0c7ejdnTzJnPFlwRDwkSyFLQ0glMmtsfUFkZUBXfUhpSzRqMG9GZ0dYbzFKPlF0TVl4CisodEYtMVIkVDFpMyVjQTBANDE7flMxfl9icFY1fUBOQDNJVT1DS01sWWJgWjh9Pypub3VBeUxYMCFGOClWJiVmQEtaZDBgZmw1SDVjQSlvCis+akx+SSZ0RCt1ZFFEOH42Uj5vbEdWZlpESyNVPkFTNm4kZ016aXhfb14xe05IK1h2Nk1uejtOa1M3cUhxMDFRWmZWbz5NNUpXRDwyKU9yCismeTlGXlNaZW56V3pIajJ5TUNfQypmRUt4XjRAQE9qQlBWO011JlZCK1FZUHZhQkYlQEJuJkhISyhfQn1zdSkpc1R7NHA/VlMlcmwyc1NXCitwWHViOVVFNC1BemIpOWFyV3ZVQGtmNGpYcz5rXj1IRlRGd3kzUys+PCU3MngpUUwkRm1UKVZCKUY5b3NCJGMxRUdqbj5ZdlV7PzVCLWxfCisob21FMSZKLWh5cUhaVnJpant7MUxEX311Znw2RD5oYXJLSCgwKEJ3biYyNUl3PHF5Jkw1M3hASGo1Uzw5Vyl0d0dpZEZuSm42dH4+cXNhCitsJjJycHtqa2FNOTNYNT1aUHQqV2h3eGg0SGBzN0p4RnlCWnxEc0pOJDc+R1VeeEZheWBhRCEzXy1XNWY0Rlk7dkYzb1JOa1MraFN9Vzk1CithbUw4KzNCWTBuSHxeVDwqX2wpMzM/Nm1rNzdHI047Qm95XnkhanA4YTdXPzRZSzs9KFBTQWpXYTQ/O19xU1NzalZlQlVtNiNnJnsqbTZxCit2WnNqcFMtNHBwQHJIdzd2YCMhRkBxc2MlJkExb1A2Q1BsTXxKby0yKlYjeHNOViZsfio4YT9rRUAwVFVhVS1mQGxWbCkyVl80WDxnT0gpCit1Y3l1a09HPkZCa3NLcGx1U2NzM0A7ZW5nNUk7eEBAejFrQVNqNGZ3dEg4cDVBOSo7UnYkREo0Um85ZWYzVTh8IWJSZFN5NVo3eEw9dj02CispN3xFYz5EYylIcUhrNkFUWS1ifUM+V2Z1PDI8PEJLKDtnTj9TQUI3ZihVcyt5dkw8S0szeCtMQip3JCV8SGBfOXB5UyYha2hGSSR4OypfCitSWXJAdGxVZWxoMVNaVHwociVgWCkpaVFjTS1vVHZoZH08byNuJWJ1XmFKNzNfMXdnS0FfTUg4WiFCdGBAVFkocFZ8OShFT3liYEokWXJ0CitxQW9ITjMqdSZAUCRpK0lnJT9XMlpSVkdxP0Y3SzZ3RF5edH1COVVRO3FpbEF8ekE+dn5hSWk3U3VvcS1USVQwQUg3QEZYNCNTLXB5QjJBCis2R1pHJDNraj1lPndjZ2ZAU2BhZEJ6fUIzWCZRMTs1OWo+alZHe2ZXeTR3c0BXcDZCb1dGb29henliNj5hR2FWbDB3e3pOMjk7cEQoYT9MCitaPCtyKyl0JUlMa0p2MDYkP2JYUFJCfkFgSUVFOzlvaVl4JkVXKn1ZSSl+ITVpVUxaZiZgcit1XlN8US04OXVlUVNvQUZIPm5GKyZEKXNFCitvRlMjVFNuZkI7bV57YlU5TCR+MSptbio1OD1FO3pxWEBPeiFZOWw9Qj1eMipabDVPaTFnMVBeZzx5QmhQZ2ppWXR+Pj5hRDtpZHpBVTBqCitaMllkUVlmfk8oYXVeSiY0WmN2YFlqYn56TFMqMCZnZnQmWHhFTCk4eyZ5eGBEcG1tT0NaVXA1aFl2OyhabkUkd1ZHN05zPSZgKEtwbGlrCis8ZF5zWV9FQWplMVA3b0A4V182REMpM0psaGg+fkFFI3JKTUIxbTB3PlRFZXJqYFVxVyEpI3l6NTJUO19GYnVYYkszJiFKcX4tMi1FaURTCitKTWRVbzlwSythenNhJGxYcmx4SG9Rfk1JKyk5M1c/QD97I2ZHMT0+R3JFQSUySW1wVz9oOzRTI0M9ZXghQ0Vzb05iWlcoSk55P3JkTmtNCit2ST9jaCEqIz81XzFnUyooc2dVYHhZU3RhQXd2PWdgOzBiQlJeSTllTH1Xd3MmQXNxJXh4aTtXKWFwPVchQHU4S1UlP3NjdVFxJjVvfFFQCitYLXxhQ2tjMlZ9JEFBb0wrMm5ARSQrbERXTFl2UF8xbGAte3NzUlpEQX54STdJMmVwLTIyVUpSdiUyNmVrbUtzPE41KGJgbFo4THNHQ1p4CisxK19Bemh6dUY8fk5jTkRiMmVgQDYhQzd7SXlnOVE+MjViQUhlUl5nTnJeQUVrbkFqYSpfZk5kdGQ2bkREXmp7PUkwe20mIStDNHs5N1JfCis/akZPJCp4eG4ocmo4JCpSYUVTNWI0ZDxTTHN2cGF3PHZrP0pIMTd9NDQtZndeaC0wYHFNWCZLblJyZitRZXlXayMmNGojTDZzMmFVNWUzCitKMmglbU0rWXYhVS0zQjNKckJQcDt3WVolbWFwaWgqJmYtRVozMTUySDEzbCM2YVU7UispPkdEZ0p3QiVeI1RgSTVGZSU9dlp7LSslPyNjCitkWH1BQTU3dD55O2IzR3EjNCtOTWJrKSUmJCtYRnp1TyUkQTJqcVdTTmJveXtlKkw7a0FeWiFtZUcrJGtpIWAkb3djVkZQdDBWNXl5bDQ1Cis5dVdBR1oyTnMyP0hBYT8qfT4wdmVvdG1RWmxgWDRyfV9lZHc8dXIlVHBtcERaPiNFNyhQd0ZqeCF6JHV3UH14OD9OQFZ6SFhUalMwZXomCis+SVVEQWhCZykheSl0MjBVSUI7ZmtgcEJJMTNxc2BVJmc7fTJUeUBWcj8wKWdNVFZUPlF2Rk5LaTkpOHgpaVB0RG47fFRtOFApaD5ANmFXCitBSzJtdGV5N0R0dl5aNiFQcjAwM3Q8MDAxNVUwMDN9bGE0JW5XV29+M3xheFl8UWI5OEtKVmxRKUphJXBnTWIxcmFzdHZoUlQrYz1Xbl4oCit6cWpUcUd3Rm95WUZmb05KVWhQc1htJm1NM3c9JlRSSVE5MUVmIzNvJTc8MG5vT2xfUSE4RzBGblM3dlMpOVlSM1pfTE14KT18ZkRYeSp5CitCU0d+NzArKUBOVHRAWkFNbmxPYUJAaUE3VWZSeG5+ZnNqK2xhaCtAJCZUeXtgbzhVanB1WW51SU0qaiNzR0d+UTxoNyVCQn4mMiFecWBNCitaSGs7KzY+RGAqMXRhSDBtOU1EY0BENHNPS2A1LTNFNVZuUUQmWDZWVX5KMkJnfUFPNUJOdk9lWFlhMWdWKWRYMSV+I35AYCordEw3QyhRCit5ZSpmVkxVanAxQEVzOERTMT54Slc1UV9ZflElby0yUHdkeU14VmVHLSlMI28oZS1mPHpCJGNSQSlxTEJAaU5QN0Mja1FvMXY7I292biVfCisqeGlZYjw9Z3luYD1RfVZ5T0ptKHArXjh9TWNCfm04cXNjVmojd1dGMmRTdj9UcXRvSjFvNnQrSmxIdz0oSTswV01XVm1DJForJWZuSGJaCituKioodHBlcG1SNT1gR2Qza1dQd3JUTDdmbUwoYkt2bTJXPGQ7fjd5NGI4QnN0eChCbXQ9OG0kVVFKan5DYTt1Y3otOD1Wdz5mRmQrem4kCismV3VoWSU+Q0RPQXl4bDtBUTtjZllrZSlBQUd6JXBaI3pFb0NCZkl0ak84P1Y4YFVhUGo0bmFRWXFQWG5lN1A3JipsN302OFZXdEgqOERnCitZfEIkb05LbDN1dT1hJD9aRzg5Z2ZOV3tiKkcjSjQre05CWk5QfXZ6MCZafSVeVEAkSjJOUDA/MHZJZ3xhVnBYY04zbTFfc1FMODZfYmBhCitOb0Y1IVhfXjVVemU3eHVSPnNKVElaemgySyo9JEEoPUppZjFEPW97NnIkIyNeYTglJXVnOGo0TkxNeD89JCF2eW5meGJ3ISRrKVhhX3hNCitgeHJiZGFNNWk5Sk50dTYoPjB+TlNvKHRDWlRCP15SR3VzZkVLNEY4PVVQYFN3T2lkIVpRTlgxVzYtMXEhb08qNkBHT1hTRG41d3lxZCgjCitIKztBZ3RxPiNjeDM3RiZGfGJMcnt1QzAtSCYxMzE4UDElcTItX21Wc3IlN2k4OSYza2xaNmI0S3BEK1EyJmkwbz9gTk0tZmZWN2F5KiFsCitaKFo+dipnMVc9IypnRW9QZWxzOFR7WWp2LXJER1c0ezBDXk5aUGskNnZuLUthKCUmWXk0Z0cofC1sZzxtJkIqI3BRSyFlZkkwKyNwKDUjCitRT2QmKzJMKXUtOGNwVF5uSXV+WmM4fi1vK0cxTSFvdWJ3MmNQaj5TJmB6XkU3SCo0R2d8QFM8QC0jWVd0U217KSVwfGM4UThOVkpmaDUyCitmbi1UZmh7UXRGcUQ1KzJxVT1VfDRMOXRYQSM2Z1B6KX4rJUkwQVE2PURTPUImJjgpYUElSjQ8aCFtaHpKbVNFWHRfezRKcUp2YDxHcG1OCitzJnFzVDMmKipgZCE3N3ktJmlrckw3RlROVHskIVp5akFlX2sqNmhlSzglaWFDSXpRb3tXUCZpVyUjbmhiPk88R0R9d303SklZO2FWd1BVCis1X3lQX3RPTmRgSzttIWlYR19jaT44M3FseVZvQit6MypDMyZHPyorYUBvTWI3a3BYclZCfFA2KjU/YSZSYFhEcDZGUjdgNFd9blVoIVhfCit1ZHwqMHh2QSRkb1RxZz9NUXo0a19ZN0loX0RWbEZETGFCXzVnd3RYKjVCZklHTG13NyEwfTZaMjZVZkM1RlpGOH43Wm5IM3RVPWB1fGc2CiswM2l5ZDVJNzBRRkJPYWBNaHIoSyhWQFVaaVJLK2Jmc0xVYkh8dil5PCFrR2FXYkNiQTx8Sy0zJU05XyhOeWxPKW1UUHJuMDBfLW9VPkteCitDK157OWhaPV89bDNDfXN8eEA2Z1VZSDNTVzlLdzxVS3xgMylwWHE5cVdFQUFKMGJlfTc3OE0lXk9Ebk5VTTN2OWEoS21yemZ6PW5+OU1eCitadTMpaEw7V3plM1FGRnNKYUpeLX59ZD8xZjdmYitpbHB1bTY+OEtUTWFodGpOQUVfS3hPMk1AX1k4Qk49USpkK2klbnVHRntPcmJZbVdYCitWeTRJa3xqKXdmR2N3Yl9vUClwZzlRKDhLYk14ajtic3FlK1ZMIXkhWllheWB1cHBKVk96R3t7dmB9RWBGYndKMVJLTXdRflp4IVZzLUZfCishUiNtaCZxNllrc0kybGAyYnxQYEFUVFQ5NjNzYXFNO2VzWndefU5CcW1tPyspU209Yn1TdUAwNiVWRFZ5K1NmSHgmb2t2PittI3s8JUVMCitScDVLVlJTdWUjMUdOQiE+NX0haj9VSW9QdTBodjFCeF8obkRman51a0J9S1FHNm50dyZ6OTtuejc7JFYmQntIMCtmRmJIZzYqTThMNHlTCitpKz00cW9jYUc2QkchbD1yS1B2XmorMHFrfHF3fDFfciRNVjMldys8JG5gSiRRTW17JWNNXlFoJmZJQWdpNEEoI2cyNXs/THp7ZmZwZ0JWCitWJlp9RGJfbjU5RVojb0B6ZUlfeVYjbS1GSUZ7cGR1WUN8VHxiMXMoYWk+O3BURFQkZG12eChaKUtUSm5kX2Z7dEt4WGI5aDVvZTY8eV55CiswbiM1Y1FGb29IJk1CQiFeSEQySXJKI3JkbU89JFBxQFZGQDxwbUdRUG5WJSRoJFctP1paRlF+TTUwczFuLUw4bktSbzsmVnY7VVdpKk51CishXz1ke0JLUW1tS1RjVGpJQihEY0VSKU4wa3NWUmdwN041WSh8N2lIfFk8cV4rMjNLZTJBfCEzTiooezBXMTx+N1k1Yn0xMHhOK1JJcGNtCitqdjt0KiVWNFE/RVk2QzEyJmhyYUA+T2pXZFY4MzcxY1RpODJ0TjI7Szs4fT44LVFHdnp+OD9eKW03WmZGKEhtbldrLVlLTntadHAmeVMmCisrTGQ3NlFKJWVzTW97Z3JwdzQxVUp7STV6KEl4fUNRcFNBOS04d3kkZSYjS1QtOTBSS0I1NENvKj56PDV6cXo8R0gqeD1XaVlxPHYqTihJCitoVFhZVGhyJWc3U0dLeT1GPzRTYHl7U2h3X3txKUB8fThhTWBwSEV1RmxSeTxwVShIXyRMOGEwZjN5dFpROWlAfGZaRWZJKHEtLW0oQ3BACitMfHpOTnloTStLbzdVSm16QnAoSj42cEtBcE1Ja085eDBOP2RSR0BsfTNheSEmUEdWU3dhQE48KEtqal5la280X0F4Iz87aExzVU5YI1BCCitVa0lKbm0ocCY8SSNSNyZRQ25Pe3tJQlI1byg0I0BRXiNsTFBLbjYjPSNhK0R2amdseHtFOz49UChhdmpHJGVaKmpoPCZOR3JhfDE3K2p2Cis0KVBaLWB7OXJfKGpBJnkmYWpaRFZoM1QhSz9QfClBVkk8JExYWlkmOzsxWXNjOT1wbU9VUURJP2JoPnBvOysqJiN+ZG52S2lzOGRrQ1glCitLb3Bkfih2c3YmVGoyITs7PHEyNjh4WVlfZERZZzU5OVpIQDxtVk03aXJneCV4OGBMY1p3Vn0lN0JnVGhmRUwkPGFwaD43Q1ImPWAza0IwCiteMCMxRkdANy07YW82JHtVZW4yUi04aCQxJT9CRG0pYUJwflY5Rm94d0M8eXReJmxYWEdxYXhydzNSPiFfSDxBR3U3Pzk8NylvKX5DOWlNCis0dmBgI2xDWDs4bTg1UHc2O0FYTXtZVGxWdzJLMT4yPEVhdUNOTU08VU4lUENmVD0wMGA4KzR2VEVuVHZDQyRZYitBO0IyMnVSb1kyWmNjCittRmA/NndoMkhEfEdaYUwkb2NMaGxkQlMrflN0QW18UXl8LWNYR2khX0NIM0Q1c3xjbEFebG9tfT0kZFYrNFdiJGhNYDYwNHNZMUBvVUxJCitNNmw+cDtpKj07Wm1WSGZoJnZlYyk+PjhUckxoKU90UHU/OG4kMU4mPHtaYT0oTkg9Vz9SMEdAeH1NKT9SKy1VJCphJSNQZy0wVClsUlRlCit2VjtlZX04UTF9RFdNemxfSWMqXzItPSFxMnF5aHdXd245UVFVK1BUbkdkLUlBUUdQbj5IdyZxdmg8KSM1MmNDZ1JuZj5fTzhaMEl7bEJrCitoJVlxbHFlPDdweSFxRjkzQWlDUzdpPl85OWclcDBfQTB2WXY2Tig8NldLa0hgRGdLQVB4O0Y7cT8+Z2w9fShQPHFXTDhNQlI/YkZUbSUoCit4VGBxVW9iYWg1S0wrJig0PEI4Zk0jb1V3OE1oRSFhSjRYIW44SnMzRl47M0NqIzs3ZmJadlo3anlHMm9jdGhnV0dNXktocENaKjZCVz1XCit1OUZWKGEwJWpCdz1+QSM0e3orJEZkTj5ZS0poZW9Ua0BRcnozdHBZTV5gMyV0blZOUyFzND16bDtWbW5+MXdCYzA4MHJHU1hzb14/OT8qCithfVEpc2xCPXNUV2cxRGxmZU5wP1czN3d6JVA+Jmd7ei0zdkNtYHVJVldmaDkxaWBtSDxfckJ7b2YrQX54WHsyKDJfbkhSIXwmXzxeMXJXCis1SX5aV1k9Ry04TD9mU0MhU05XWm4kJS1uOUgwdzFtckBsa2EoSUtaSmkpT0ZTMmdPcE9aTSo0XntBckRXKyg3R3tQayZKPHFmZWRrJFp3CitlJXJIO0NpOWFrV0hBVVJeKVA4eGFfeUpXdkhnMVh9NkB5TnIwbiUkPjY/flMpKCFJOUwzS2lJOCgqI2pQbzMhM2p2YF9qbGFmbDN9eVoyCitoakAjWGI/Xig+LXorVWg5ejlDSzlmTHtAaEZTJHhMVlpgczk0NjFxcURySClRWWA/QGozKV8oKTt2Q1h8a1pvNlp3cFk9PTtwRj53MH5tCisqUSNBLSFWUmB3SWhJZiN5JTxGZ0VnYm83NTJjVGxBJUV9cTU9Mi15a0p8WD51UykzcFlPb0coRzBzbWRpUUpLMHw2fV5VUms1alFKfDQoCitnWU9WcnI1SzwzPVYlRSZSJio9MnRVeiQ1Qz9jSVk+Jn4oKElGbW09TDFlK3hnZihnYjRRcEh1ND87ZG8la2U0a05RKXBfck5WWlJRRClUCitlOHtqa1M2VnMrQXhPfTU1WlliMkA1eVA3MHh6aHJTTyZ5fmleKENtVHdxTWRuNChFKzVAOUp2cClmekl+cW9Dbit5VCpFVCVnWWpGdDVNCis8eSlGSVBROSg5YGRVfUslPFJiTkJAOVBPLUlpMWk4NzZhMXoweF47UzFffU1QXndSNDcyQ3F5eSFWRG5XUUFLRU1uJiYmS0klVSo0OXZaCis7fV9zOVVqT1FRTytoU2RSKiM5dEsrUDZzYks8NzczMW5MX1VBKiNYfXRGR3NvZiFZeSZzfHlWTmxqLX1qbUEofkJecFg8Uz5Zd14+aSFNCitZaDBSYD8lIyUoQHR3cG5SPiMqPFAtI142Y3tETVQ4fk5HSl55WnlYYklWKUxONXlxYlF7UyNRNTtHe3QkTTZocD5HMy07bk4+UTVpfjdQCit0TlN8eytkRHljNTIxclN7Pk9pU2U+Uz9uJD9MQyFUfmQ/VmtEWGd+eUs1KllOVD1eeFRee04jVFBVWnVxaDskP0VHX1o5aWx0WXBJMGxJCit+NWAyVH4mMmd4dnQ4Yk1xLWEzY253YkohZFB4dDE0ZHd0Q2s/Q3xpWjMyZCs2PnRVKm9DKSgzfSZ6MEElRW9YU2JSQnlMLVJ6Q0NuU2RKCispPVZkJkExQm5oaT5yaXZNND1gM25XMW02KnUrT3V0VEFDbEFUcDY7WU1WS2k1I3UmdVNNUjI/YG0hPkkmYjd0SGJNIzd0RFZ4bD1Ia2Q5Cis0KHgydzw5JGRsbz9XMUA7aHtyakBgVmUkQ2l3TnpJazVkKSp1fW9qYnE1WDZXNzEtZGJ6dCQ/fUZyZm1yc3RUbFJkbFMxbVVEd2lnM05uCitrPkIpKGUzWHVodnF5QCpHZSM8Yk5AMTI+K3w5TXNXaXF0YntvRnZNbEF0O1Jrcz1FcUA1Yn1WZ2x9YDElQ1dBYEFEOWlsSGVnYSlCeEwzCis/TXhPQk59QztrJk9EYS1ZNXRpYm4oWT5wU1lQR3txYlY2d0hxRnpIIXJgLX1EJjMmYnkwYEZSe1dmZk8pWkJlbzI0QlAleSF4UUshY21WCitBZGc0SEl0YkshYllGUiZpR31Je0s4Jk9uY18pXzBeIUZiKl5WMXUhelNPYk4tJmQrNDg7QzhLREozNV4jYnVHUyZ8QikydyZyZ3FQaGB6CitGMG8jT2VyMiFxPTVwZmZZOXYzX1h3Iy14XlpXMX52ZGFpeFBBPyhKXldhYHo9SGc5cU0meCMrVUZUWjZ1Q3BLV1JHM2BFT3UmaD0qWEMlCitMelNucVZAVG8pNSZfJi1xczspKjlifCNAVVV3b28oO2NVcEAzY3JNK0khI0F6IUQ5U3VpMXhnRFdkTyFnWnBzPE1ac1UzXm9ieUgoeEdjCitwWkdlRURoRyZVSytpQWJ4NitJOG5AfGsqKDA+cjBsUjEkcVFWfHZZP0xiSCQ/QEAkdDdWbm1HOEdyJT1KKmJPUn1mNDVVQlIqQitjSW1yCitSbVl1K0godFpnP0N6SDV0QVUjfmBrc0hCKGt6d3ljZ1RlPSVAdmooUEJkLWJ8NzhYPV5hUTJ2Xn0mWH18NFpsQShWem0+KDYzK2wmfjFfCiswd3pXYmViRT5FSzhkRCN3ekhVeGRIJm09SmY1KlQ9bSRKd3pnQD9pRUV4bHBIcV5naWxiZGFwdERfezY/aG0wekkkTGUyWks7OXJBPjkzCitKXlEmJipKV18rMnszKFRBQSl2Oyk8R0VkM04yJEpxaj9xZT9fbjskJWM5WWolIz9AYntQYGB1P1Z5TFYwYmtYJTtGakhsJUVheldNd0hpCitldWt0NXttckRYZT19Y0M/XiRaPml6Ky1SNTkzWmd1TFVxPUlnSmdlVF9zKHFIMyMheSg0dnNUeC1ze1prZ083TE0ySHlvMk42TjdxfEVNCitpUFEod2t9bzFLPEZjPT5Ofj9hc001dzI0V0xgQDl6JGowamFqJDhwUFV0anokb3JBc2prN3ZzWGp4MyZ2PWNZWGlGcGc7fm8kakJERi1eCit1cEY8QyFteHdSaCN2N3xwZmRYTzdjeUsmKTc4Y2xxVikte2EqaHlQc1d5JW5sPDskX29RQj09LVZiYS1QWGU3ZzZGM0ZMaSNwVVA4QDAzCithPkxfMHwrQ3BraXEmSGFIX1EtZitxKndJVUh6UjlNLXpidFRTUChDPkxGKlhyeDQ0WUZIa3duNSFeZlojNjBLWF9lUmVRfD9SMmpwTm1zCistfV91S3pkWko3UU1aT3w5c0o9NFFCZmx1ZDFBX3ZoTzZGR2FiaTApXzVAJF5xX1RTQCZKUCloPkA2YVdBSzJtdGV5N0R3WCNHfmxQSTAwCiswMTcwUlM1UzAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFErdkdBP0MhVyRlOXdVPS1FMEk2bkkkJHQybGk3RHpEczRqMyNGKWFVe3dUCis+PX0oaEEwRlZWcz1SfTBpUEpSRTQzSkEwOXlpeXZ1aVVNKSpyM0RTS3JmQ2l1UiN4LUBfaldSPjU1c3YhR1ZfVktFQlRYajhxKkw9NiY/CisxdyFVfiZZanMhZzN8aWxfdylKd14raHZ0PWlZT0ZvcU8pTj1pR2JGLU8zKzYjRiFYe0Z+Z3MjR1IkNV5geyFXKGA5QWBHKl5+YTEmQWdjCitZPWdFNXdPYTQ2aDdWblNOPWRXd3skKDs/aXtXJDtqK3dRKm1DdyVfRCs+emZQK0AxZlV5WXRJI3VGQylNUHVBUlZaQnx4QmZuSjcxe3k0CitBVl5uOzVOZTx6PjFWKTJkZXVHKDB6KmlHTGY3QjhhanNmKntweVl2XzE3Z3RpKTJOcWp0e0EzK0lTQVVQQkA4dihiLUhZV1YrVWp5TCVvCiswTmleVUR1TVI0M3YoN141TjZraWpzMmZ7JE5vYVl2QFkhLUBlTjNtNyZzT2JUUDU+NGBWPHE9NiNzbGtFbjtwUUQpcUI1ZC1WZTk/Y3F6CitHOWZVNyRgQ0BQcjFHWW5HWUc1Y1Vndk1JPzZFUHt9SXheeE1YYWdvZXNuMCFMUX0tKnU9eHp3Xndmdl9TSE5iQ1pBemVVKSErZUh2VHE5CitueSZZSzJLPzxHNGhRdSp1R1BTcGdWJG49S2BabjBIe2Uzb0htcTtCOW0yRykmfVV7anl3ODcyY0AxfjB7UnNlMCQ8fVp7JVVmYyY2bUclCitnZC0odFZgK3hKVlRKQ0RARzZPK3VfWnYkWSt2fTNFVXU8TDwhNU1UflU4LU9TMktxMGtzI2dVYjtZR1N9a3pjXmJpd0FTRzFlWjdldzFYCitqVXI5KWlFO1VkcHhXMV9gcFA7OzNoNG8wcip4QlojaWs7WDhHQlQkb0UkJEQmUnUpTj5KP04xNDFtb2x6cFdOe3xWNWVWXylVZEFYbi1PCitkVXxJVWNNcSRXRkV9OTRzczlTS2c3TXQ3QD9YdjFeOU0+d3FlUSZWSE5mVHxFeFVrUSkxPyMlfVQhKU03aHFrOCtRTVZkZ3VTV2g3ciFSCitpRHdMM2pKaFkxaDYtRnJAe0wlJHdeWkIyVUp4JlNSaHEqTnpTLUUrR3ZzKjw1Z35lalUoN1E4dSUrX0FqQiVAaktHcHR2TWBGM3lOT04zCit0b2ltUktTQSNIclBLciktI3o9Wit7aE0yUDBzalpheU9KMjFBYyhCJDcqKHlAaTQwO1hPOWUoR0VEYntuISktS3djViFHPUVqUDgkWn1kCit5NF47Rjl2e0NOMWgzdExZcWFwN2E9I3dPTHh5WCRlP2QmUmFfVmBrdSN1QDtBT2x0I0hPPk9gQEt4QFE8R1lXO3lMWlBHWj83Yz0/dWE5Cit3S1JsUWJQNzQqcU5WaW98ejtAaWZCYHI1ck1QYC08RlU4SHlrbWQjVl5Sd34pYHZpMFNzQWZldHFmPXtja043c0wkbT9VUjY3V0R8VVQ2CitUOFZ0ZkU4Zm1iPXdsRC01fUs3MmBBZDN7VzRDNTk/Qk05WV9iPWZuTEYpPUZVTlljJmNEMW0pcSpKMFl6ZFB4IXBVVmxtUVkqX2M0JG81CisxPyF6aG5DKE1afCp3OUI8Uzs/PFMlR3Z1d29XUSVjZ29mUWR6LXhITWE7V1glQ2hhU1k1dCNAWT58XnJCfHVCKDt5bSh3VFBQd3RtfWpuCitDeyFgcExmJHtudHtSfUwmRCNvRWEyZ2FiT2ljflYkIWpAVCRteEJIIW9BLVFXSz5xP2hReWczN2RpaVpPOCpqSEZpb0J7NlRwMUU+SW9NCitsdHwyYHpHRXM5dTd0UXV0JE9kSjh0dEVRTmRzLXJeVX04V14/OW1kfWwwUnZRMXZKc0NCXnRicUJPT2UldGwoRFV2dWZeS3MwKURlRnZrCitwKyRLISFQXnIkPkVPM2slRThVJUJeNHFDIWhQPVg5bEZ0SCN1WndJMG1JeUdLezAoX05XeUh6Y21xbT5LT29xcHpIJikzam1LRHZNbmZvCitROFhvIV4yMVNxNkJRT1hlSlBGdDQtI1AhJFphR0JzR3YwXntLSkYhZ30jTm4oNW9LaTA+KCRnV0k4WWFrPzgwSVhrcWtDTVQwVFBWPHIxCitwTnJEPDdaRkBrWlg8RCNAMzdUcl8+ME9aSn5OYC1WfD47QnkqMzFUJS1tZFlAd1FaRE9HR1UpYChHfjR2Xm1rMEZNSHw5Tko3fTFYZncxCitTSUs3ckZ0O1phOFlGeHNKMXRUWHUjbWN5bHZiTyYzUVIqODk/dHQqR3hWPXNvSEs8dGB8XzAoLXhNKXF1MzY/SGAlSDswTDwxZHcpdHhaCis1TjxuYSlRTEZDbGpCbHc8K0tyR0peVnA5cCVJJDtVRTEoc1c7UChgc20zOSs9UUw+QHxlRSRuWGlvX15DaVhYUGFeXiM+bEZ3aE5RU0RWCitIczM0Pl5nMUx7PWhHRW1DZUU9MW5FXlUoOSkmI0ArM1o7a3dwSi0kQS1id3R6b0VaKSp8Szcmc3l3STZFdVFaZFNCNTsqdE1ZLXlPU3JZCithY2R4cmtNeUdLR0Nea0J7fW5FK1U9SHBjQj4+dllvVl8jWFAlY3A1eTBtNnpWMHZmU0dEKWcxaGx1VTtHNVZfJVlDVCNLLT0wOVVtOzxxCityUH5lQEVJTWZFNGA8Pl53RV5oUVF8aFBRbkUyYUZwKGp7KVE5LTlNKzhFJU8haXRuKlIhbWtTdjJfQ1otRWE2eCk0PXY9P1EhajQ+VSokCitiUnM1MCNaVGJkPi1iekptOF40R0VDUERoQ1N2PklmTHhrR0plVWAoRmFwO3pNZUZVeWgyRnlPKFlWfCMoK2Era0FPJWswSmZrRHsmMEwzCitNTi0ja2VCOy1MdDszT20qSTJ0entHNmdaOEMmKnZWeTIoQm15WDMlbmNZY256ejd5SmBRWCowKm5XKCRGPSMlIzQ2bzl6aDlgYyRRYEIwCitJRW9QZzFNRF4+dSN3cjMkdDMmeWpOKlpgfnxLOHlGcjdxQnwjPHBPIUFRZSZxckItZ1Vga0R3eFpSTENKYWF+TE1kajBXfmM3RExiJFFoCitvKnlmYHpVKHUpS1c7MTVyRnIzbStxUWpsZ3dgZ2A4UkJaa2pVPmF3PjttYEs+UnUzO0NvYlMpNlltPTxJZlJ1YHhzKlAxa3AySjFoclFjCitOTXZkTihmZlQqJUBgPkJDTHtoJUZqRT1PT1FXO09ZST8kd2AoR0BOfHpPWjEpZWRBXnBBcEtON3FTMzxWZ3QwWkF5VytpTlVxWjNQSzdRCitOdGF9Y2xuUjdsaEpLYHh3LUFiZkhISD1nJVNGOWhaQmZ7SWB5MmQ3RiQ3YlV0cSZYKXk2Y09ySm4kMTgzPlBFKjhmWEh7Kkk5V1pPSk9vCitwJj1vfDtiQ2FLOWlRVT43PHw1UEt0NDJ5cVJJcDZFcW5+a3VQPVljT19ROEF3TFple1FFOTRiQmB9dDklN191UFlrfEhkcnZSYDZoNWo/CitFcnVZIVJRRkxaNERpUTZOVlY5a3Q+TX50OGRfJEhEaVY/cCooYWc9Vm9mKWY4cC1ZaUVINlJjKmchRzxvdVNzTT9pIWN7Jj9VMikzaHlpCiskaEdzdkBhUzJDfWJiMDRJQSMhVXpfVD1qYVJCcF57VFl7eXEpPiRQKilSPl84dkBEcCorPzBjRHwtaUVJeURpQFluUjQpVWslTUotNTR3CitZTjI8JCEkOUAjYipaSUpQfSo4PEVlP2JkPHpxT1gxNnA4KH0taE9MVyp6ZmluQHNIKnZuWTFsQ21BNkM1dXJFPVpnby0mRjdrY1AmU3xUCis0YiVhSTYoQnRGZnA5IVVIVjJ3dS1JQzlYcEdedlhtTVdYbSNKSXx7X0JQJU9NSDsyK0FeVT5uYkwkfCg9Q0BiYkxVaj8rbmh6Uk9OZzNqCitnUGEkcS1nRXxaQUFgXmhwaEw5QlBwU2A8Yk83cDtLc0MobUJgUiYzKDtkM2NzKnQoMXluIz9mR09Eem8wU0I7Vih3JmxDa1RvKyg+MnItCitIQW9Xe3smJG0kfmhGJlQ7MShwO2d6MUJsWmloVm9ybm1jYm1mPWt7PkpxIUw8VFVoYF47eD5aI1IhX1pNJCg3cExJeU8jSHNBJGNvVkViCis/NFY8MHc1M1pSQWJnMWIrK3YhSyFibTB4RFpCLSVgTlpQUFgxIVZDZyU2M08reCZIQTZnTHhaekV7S19td0wxfSM9TkVmUkNYTlJOQ1d7Cis1UkowNXglVVprQ2J0JVZFTjstNkZENF5MLT1aQzFZIVIhWFZ+NitPJnU4NlZtYz9EUUVsKHcyITZ+TTQ5JEZwZHthTF9Vd01QVmp8cz1ECis1VlN6aHMyb31xVCVmTHUxUSFnZiFza1ckPzF2fXFWOT1SfFdHdilwYX5VVTMoTnlGU2Q1S3hzV2QkVV80NiVVWihQKShfPDVGI1pLO180Citaalg0YVQxSm4ybEA+ZWQmJTk9UE5WIUdETExTQ1IzcWB5T3w/TzAhNXVgXzRHV2J1Tl5UZEk3WjlvJXJPcmctJTc7WCMwbnlTZXt2JTtfCit0KVNiIX5xUnZ+fUh2dlBTSiRuUSM4KVkqZ0RES0tqUDJUK2o/I0Z4cUNLI3pQMCpZWHVJdkozWTEyMmZ3QGpzNHV1VXg1Z1pJdlpzbEF4CitgRkIhIVRFR0YmcEw/OHNtaUAwU347b3YwclpOanMqYjlVZmFgZnRKdjdYQFJNRSFVYmZZQyU+TXB7YlVFQXlpYT1PTmxPcV8yNmRxN0FfCitoUGNXZVdPdjEqcSF8d1J8M097IXp1I21kWDA7TzNLUG9JJnYzNCtGKnhJZT9OPllkbD4jPzt2ajlMYWNEZE50Jit0Pl4lREMhYHctfSYlCitpJmZ4OCZZcitZRV53OEslMCo3PlJuKDZmTDMrZTchUW8rdjtUbD52eGhFVE9KcTIxRmRrfj9QVEpxJitBPFhWUiE1Wl54Rjs9QXVSLWJOCitNZWZ+V2dnJWU1V0VFY1QlYjtVdnNLZlBHVTZSeDQ5YjVPYikzeDheY1IoTVchYXY9OSk7WHNuI1dZYzlLa0lYfXtTVkNPcDRXcEwjc0xHCitOdldKTzhRUnVxTTFgKVBsMj5MO14tPW5FTnROTFApVis2WGsmYFh3fj1PUlZ2dlJFckJgQld1NWFPSjQrdipxVzdXKUQjRTt4eGArbHRnCiteVilMU2d0KlFYfWdqa0UwKzgjTSEmWjt0K25+QT5TKzFROWUkTDVBZFZxQmpOS1lAKihsI04jVCFFT19vUUl5RDJGekd2LXBKeDNwbFphCis1YUxDTENfcVRhLSl0KDtmXz8zSWo4fmRyR1NvdENPKElKWmJgUTJBcWF8PG9vYUR5cipOZip7R3x7VjlATzRKPUMqanFwJjdWcmNZNTUhCitMczJ+YihxKHNrbWNIeVJ5TzJjR3ZjMCQkU1lQYTkxejFpRyErSyFRS0ckMmhKeCo1NlRBTnpSYUNeKzkkXj1+VmUxQFF0YiluTH5MUiY2CitQbFRqUE16ZT54TTtscWh9WV5qMD8zfHpeNjBneVU8dW5UfEEpUjF9eSlCPSlDX3RuQDE4MHZXT0RsPSV4dElSJF9tN0R4KjRrWnh+KnpGCitOKytYWmFDMmJkY1JuRk98UWt2VFJNTVg1Q1RXPiMpNWR8I15WPXs7Y0w9Z0tEIz17WGVIOy17MHNwUWlTZi1DJUJsKEt1Pjl2ZmU2cEh+CitrPChGZjNlUEtoZnx0PGlXV2lqRlRmVilINDBZSGhvRiUlU15PMF9IJWZeKmN2JGhpP251ZztGIVFwdUlgQ0ZqaTBxflMlPz5nTyRXamtRCitsT15iXyRSUFY1U2U1WHQrZmJoeSUlKDIyQVJRc1E3ekh9USZgQkM3cVAoTE9veD44cmEyamNOcC1SZ1NTaWwtRXdiUiZvWmBTN2whTSYrCitlU0xjMG4qISlrPUZsfTZNckVUX3pTK19uV19oK1JqR0h2UE5uVnNrRTU9JlFKUWZMUzVISkdTKjwqNnsqUjJCUDJ0OzNtTTFNWW1RbkhmCis7TmB8NCFCQGJzTDJXRG1sOVQ7VUEoI0wqfk5eNE5nIUg/OzxwbmkpR2NQMnhwQ2V5aUxFM1JCXyoobk5FVEIyNHNtVjJrekB1az5rSEF2CisrYUE9XiM8MHlFaEZpYF5Zb3JwOFRkQ188SDZZVyQmbFMrUyFaVjNnNTI0Z0FRUkVUOD1oYzJoYDttZ2dZfnZgT3RJZCVqMXg7UFRuSDY5CitrQllgTlRhTTR3a0JRYmRJflF5UDIxRV9xWFpFP21FLThYM2R1Y0UzNjl7Oygmb3E1ZUpPSTJla2l2ZGpIKXo8QyZ5T28hYFdRbENFUm5WCismNTw8YypKKjk1RDBVfkhHYEVOVkhxWWZzKzlHWFRTUmAybzZMbit3O1UlUzc7SERgeWJBWit4QFN8Tm5HWENyc3huZThBQ0VleGkjV2ZBCitDZSk3eUU+bXd8UF42PEJVNTZjPWxDSlJ1NnpOJjJ7bjc1ZXokUjtVdnMhbnZwbFMhN01UPnlPVXlGQCpsWHJSKC02ZUM/O2UoQypSZTJZCitSYig4VWY5VFpFdEt2Z3dAO0JfUDImfD05aXhQO3tUVE1MU1YoNn03JEwpZj9naTtGXz50UzNQQDZFZlh5cDg8cmQpeGJSVlJ7anQ8TyR6CitTJUArcSl0RDZfWkVnPmRzO2pLTillO3E9UnlscEQzPUw1eSVwK3s/b3xkJjY8dDtvQEN7TDZ0NW5SZCRqIW5KOHw5RUkqI3FWKkFPV2BGCitlenZFVEl1Kz83JGpAZXYmWik2WWdidzxIK04lKndtPUd3P2EjSEpkVDNuWT1HSSgzSD43WHs2TDNkJHAoWlhyQHlhOXE/MD1eIWU9MEp2Cis2fj5FclU0T1IpYjwlNWl0Wj9haGZBR1JmTzdoKmUwWStqVStJKzdRN20pe3NWPyNYRmt4YlZFWHVYQXZyQV4+YmdBLWBZWjtrNDh9U3lBCis/O3hgQzZvOEEzb2VhVzw1V1dNS0MyZEcjWDl3QWsySUVGZktgJiNFO3VmSnd3PnFZUW43MVImMFZCJWwhRG50YUp8fWVIYX44cDhOaGR0CisoeDgrKWBfe3VXVipNdHJsblIxSDBybmJ9OUhTZmFmQGRyfl8wRmote2ooIWZgPHtiPXQhd1JzJmc3SC1Baml5dlVuZ1JhWGopXjxeMGZXCisoJFpnezRmbk5UI1BDJWNwJHF8aSttRGJObUN3enRxQXM+VypXSXZmQjg2YWgkbWRPamktUkdoV0FHeGhqVTJMISNpa3l3SE4hMjFFRjhECitZRnd3emRsaUxoJX1TQzA4RW5fVzBPUiMmKWE8VytBUjFRZ3g0MTloYSlSNiUlZSRpMVlHISspZmJWeEE4P3t5bigrYGpCbih4QW9yJnZDCisoRzMtJFR3b1EwbFJzezA2MH4kWSR3SWFldUkrIU8xYzRPVEU5YC0wPHMtMF8wLSFCYVEraHo5bFVxenBZWiU1YUczTHRoaWA2QU5RX3I7Cis1Qj9HKkB+dEF0PWxzM00zclF4d3luPGdTbDA1enprITB8YkxEYzJ+K1lRTHg8NlBoXjIxaCFNNyElKkwjdjxefXszIU0rRT1MZ3U3eCpLCitNY2ZAe0EhTVlKRl84M2h4YSlFfl5Qd0Ule0hVTGFpZUFBZDJoNXBBLWNAYFZ2aktDKyQlfiRSZyR1MGEzTVV1QHNEKnpBQnM5Y2V4YSlCCitgYiY9K0FzZk5XPngyZylLOFIwVnRVOXNUTlNGeDFXLSUmJU5lVzJkSDlfYXxafD4zSyNwemxxOWAhdEpIPGIzM1QkaFpTUkhkdmVRKzMhCitJfGpXO2V0NnBUenh4ezhpZXg2d2wtMUs5ayR+NmJ3MmtVOEp2bVRtYmlNI2tTTnpBUS1fQ0t9Y3B2QCV7bUZ4WEhTNUomVFlqd3EteXdWCitBKVZnZVhNc2NPPHAhTSpeMD9WTXcjTUVeUyh1c1olOEpPNldnKmUqfXgyOzduX1FlalU+MDNsMDslZyFXaSN1R1NEP0M9KWA/Yik8cnRZCis9JDVnKklndDxZd1ZLal9YQntBUlM2SmpxaT9xb3MmNTxeLSh4JmxKZ19ZX3FLQzU+WmE+fHRebHU3Q0s0YmJAdnk2c1Rnans8ZHZvdlBZCitnQEN9P3VzT0FSRXlOZEpwbGA8bmNhSjgqPzJHSzUqMkZvdnNhcUdzQiFFKD91cjtWZj0wLVhQbUxAc3NhRTtwSFMyS1UoTHdgfF9rPnd2CitZJDsmUExGWD5fXnJ1cEVhNUQ3WDlPa2pjb3s8U2VTZm8xWCpPY2Q3U0RQQT58d1k4b2p8PHY8IUlqRGladDw2bDVRbiUrTnRtb2hGMWgrCis0OWliP3o+eEwwVjw4VSpKYkstJH5WSmtvPUBvdFRhaGxIRDB7Z3N3UzQ3T3IrPjJ4Z1Z4dE01YnQmSjBpSmIxYWkpZjlOQDlLQH5BUHVBCiskekBZRXYmK3oxZzJHeUMzWTBncEdKUGdfPzg2ZTJBfmdDK2RQb0VmfFFNRW9HQlA2eH5URE0lQUtTQDJrdE5pUHZQXj9jNj5oWkU8U2YzCishUk5sV2E5PyFXcWpDQlFjRzFAcGh2K01Da2lNUHsoYnBlZWgxY1RgMkQmZEkxMitkTiV+Qjl8UT1feSNXUyZ4aFZBX3JTUW1fKlBLcSowCitObXQxTHU3fX1QdUIpe31BYSRJQVFMRTNEVyN3TE0kdHBTaSZeaUYkemZXdWVXenNtT0ttRT11RFJncCkrYG4mJU1WNGlORGstU2IlI3l+CiszQCUxRztVMSFgNmYtRTcqZG92V0I/KXM5UUd2SHluVnlrIWZ5QEU/aDQ4ZGg+LVk9YGFVS1IqT3ghSCs1eCZ0MjFTQ1JwKmdjeTdlVFkrCit1JDI3JT1tbkEySCZ7cklne3hVM1FLQSg3NGMqVktLemtNbzRyUFVBPEhIIyFhUDYxbVlzKCNZOXhVN0c9PXxFJUZKamg/VlJ6aTYhXnBOCistdVlsU0slIWMpIzx3PWdhNXAldVc+TUkpTEQyNEIkcExmckxfZ3RBcDh8fVJKbEVyWV81MHErZ143YGNNeT1rZnNnNyRDXl9SblhaTTtOCittQGd0JWNDVjRMRmoldCtDYT9WVytHVUEpXnp8bz9aZVBnalM9JWZ1KDw3KDBJYU5reWwpO31fUVImTiltenF1USplcjklJSt0e1JyNTNyCitJKXhIYngrc1hEaSU9SD5HaFZjKHA2UkUwU1VKMHVpa3Qofnkzal9TQjtFbGluUj8xODYmazJeQFo8VTxnR04+USV6K3VvUS15PktSUkI4Cit4PkhhV0h+bEFVcTY5Y21UY1pmYUIrekNjYkwtaH02M1NgKnh+MnxwbSlAIVEjPl4pNzsyQSQwUT51LXNnSGB9IVl1ZmJ2QE10QkpWcG1oCitaKGt4cVNpaEpscS1LPFo0KT1tI2V1TEZDR000I3t4MHI1ZCs7aERfJnZZTXx3NCs5RzRHfmY3UFBwJH5keWRPSWtKVmwyJkVYUiZ+bzJFCitPYy0+PGl2OXt3WWJXe2BFUTFSVWhKRXM2cH5fTmtUVVZ+PlhyZzQ0MFZwWXEjJjwpeG9nPW5aX3s7MjhifTs3bUtDc1RxXlVZcDZ2LT1DCitmU3pGK0JkQGNGMHxVR3IlOXRzaEFLPWFRdVFwczhvVmcpKj5rQyNuNkl2fCglKitVSGNANVokZylGJllBO1l8a1Z+aWhWQFMqSGxeQntgCitQeFc1SStqNmt2R3pFWDI0I095XmwtVWp1dCY+YEMpYXQlPnxkYzFrK0kqWW9fczs8aSteRThkNG1jbD9jQjsjSigjZnd4IUZ8MiZHZGUzCis8RW87PnhRWChVJCVKWVooMy1KVUE+RyM9O0pqQGYhYHMoTiVLc3ROTEdgSFVPfS11ZDdINmxAXiVGcj0mTXI/P3lLX1Z9M1AtbThsNjZuCispO1c3elNGM3I/RzFiKnlZUmNuMzMhcig5MzZtP1Jhcm5NKis9YDJlKmV8YWR8WW4xOXpxNmFCPmU1aDtXPiohKio7JS14PDVwdllzUF9DCis/KURVJmIxTmx6YmojU29CYGQpUDtMdX0xMDVTanhxYS09eT18RTJIOzUmO3Q8Q1ZgLVE/TzdaRDBHQz47JCFsUGZabDFXV241ayUySn5TCitqN2FSK2RiX0NEeEp+MCp4IXpNcERRaiFkekVnbTRzWWh4UG4/eCkqZ2pAcTd3UFF+WmBDcV91I1J2cUJXQHQtfG4rI2xzK1oxbHtoIzN7CitOdClUQ14kJF5DIXt2Jjw8d2lLVW9ESU0jJktfdzZ4JHN0cGd2IVJfdl57Q2lwd2hOWXF1MCZoS2w4NUwtOHNvKGA4OVNmJGwrVTI7IUtmCitQWTZiS2FGKXpBbFQxeGlOU3ZBS3dpVGloUCs2fUxnbVNeKEpWZlZCTihAVGlnRl9PfHQkb0NkYGgpZ3hsbVkjKFNpQmJHZFpee2xHbiQ5CitYWUNjRm9nanZpS09mT183VlNJNkEoMz8tNyhtLVo+OSFuSS0+O0NfdjU3N0lHQSlFUCl+N3tKMzRScVhMNGhQVX4tUjE3MipqRmtBcW9JCitkeFZHdUo1eU8oTklzdz9OYVRMeik5WSMmaG4lMWFSTWNhY2N0MT5RZShVTHI1VkVaM2t7M09fRz59KFAyKWRAazlxMyVGJmxYUnFORnRTCit4Szx1VUM1a0FuSnRkP1JKS09uZUVUe0h9PFpQIzwlQyQkNy0kJExEWVhBcSRqaCpZQHdTRU1zeEg2KzchcjV0N0s4LXAlY25aKzVOZUFjCit7MW44Z3VuJXQzM1dvOWNRVHBndm8jYHl+OWMjVEQhNXZYUCNOKHFxOHFtSzl0I3p4NDtLbzs3dGBXUzUrXn1xRzBsWj5WMkM2NlV5KFI5CitNYzVKfiZTUGx6QnQpanckLTU7Skp9XiRvYjxYYkx1NmM0O2M7YDwxTlNAX05lJHBoMElpI1E1bGpGWCMhRWBTb29kSTBvZ1NlIzd1SGFOCitNNDc2V28yNDxGPURFKG1wZlBYfWBldio4LXI9TTg9ZlUlfWZMNVB0empVYSV+RGBpNndZfDB8e1MxT1BVQXo7bVBARDFDYU9OTmcmWjJVCit7U0JSMEFDKWA7N3AzfVhwaVFfZ1h7aEdMNlc8d2VuKUZnc2VWbFUkXnwxYCooWjQpZmRaPUI8T2hqLXlkQCE4RWI3RGdtST9fRFh3fT5lCispN3w3ODVQaV8+dj5Aaj5SUVJeZmJvODhlOHgmQ1pld0ItRzJebjEyPWstSjZlciVUOEwrKUZjNWJ+Y15jVm18IT8oU3NWIShNQj9mJGAzCitQMz84RENZRGJ4TVJyb0o8RkE2Qz1ZVkomV1VUIzBqbXh9YGBVdXB9clN7QWl6T0pON19jenBhS29eX1BxK1NAPj9mJnJ8KzYlMWdTdEVLCitoPSR0dU1pRD9JezR1N0A8RXNhMTYtb243K0BOQHN4U1V6Y2c5PVgyclg7Vzc+RmxYU0VUcXJIZjZHSWFwJHZAa1JkX3ZWSSghPCtKdzs7Cis9ZGtLYXY2Kk07UlpeYDRubiFHazZsKHdadDhDejZkUHhhZzswX3pXaDJqUyZRZWdINlgpPDFzMW4hSXJ0N2Yhfm1pMXBnV3pqY3pEX210CitlLTgwUXBBYzJZSkpxOUc4c35aMj9DUnRqNWZ6KV9eYEU5VHFuPD55UmppaCZ+PjQ/NEdYWkpYIXZ1THJAcHhJUV9pMUZCPi1YJWJBQSZCCiteVGQhRERBV3wkJnJubVV4YyRTO00pfHx5MzBQZ0BVOWI3IWcpSm0rOEZiciNXbnYxWjxwKjE2ang+OUN7cT1nQSNNTElJWTR4Tmdha1kpCituKzZUfTQzfjFiU2pMYm9rT205UEA+XzsxcDBoaVJPKiEpezFSaStgRThhVFA3MFl4VlV4OVY/MjtsdTtPKXRjVExIdD8wYlZPR2NsbD5KCitJV1ppKEN7ZW1ZNXhoVHwjV1BnNn1ad2JNK0BFVHdgVip+K3cobzJsdilFVm0/OENlRHZxeTt7elMmYldEej5nPX4pKiErTylxPGp7T3BsCitDeXhOYVp1Sj8kb0JHPHxnSHl3c0xjRztHfmVePnNfSF8xUSk3KD9jK2pYPXhkaXduc0hIOGAyXykkcFhXKW8le0NQJk1WY3FaalJLYjlQCit9MFM/TmlhaUB7WUlQazhQRmFqMUhxIUgkTyN2VTdmanFYRk45UCY9Q0Qjd2xkVi1OPmtkYjdOM21DMT5eIXohV0smfjVNeElnd08zMyQkCitRPHtNT0hjU0ZpZSttX3FgdzdmS3lCMkFKb05fbUdQSXlEeCR4SWY0akZUIUN8Sjg+ajtuZSlqV2tvSjJPRTBPbDZ3Tk1idXUoSUxvZmlICisobUtONmNTZ3FifVRvQ3U0UmFKVW0xYWoyRkNRVVc+bk5+QFM5cmhCYCVeUG8jYD4xd1hKYm9BTk9lb2Z6aStFMXM8fD5TJU5wKklMWVI9Cit8cSF9YUdVNktYTikmWnxFZnFCfTJBd3FMczIrejczSmdAVmk7dzQxMlhfdVM8fU8mXjxWQyE1WTAxOzthWlFvPEw1Ul5nSDc2fitWVm1LCitoI1VAJGErSlA0Zz0mdjsmRSN6KEdFTD13NDNqeFFLaTFYP1ZhVnpOeE4pakFGZVJoX19DVHRnSWNCWEZ6QzZjTjNKSlluMUVVV0hTbVEkCitXZjNHQ2lSdERhUX08WGFnI0F0K3slNnM+WiQyI3VOZkNZUUBsRjVDMlp7bVRzQ3xLeFdzSl5zcXF3YVcmdzZhWTg8fVBBcjlUP244Vmt9CiszYE05THheWV92R0NrWHwxeVhmPzArKGB5cjhnfHsqQS1XQCFVenwrTiE1YCk1czxFb0RRO3dpb1poZXokS3lJWk5pZH41S0AjYUZ6JkR0CiszI2N4dyhwPHs1RCM3OFRNQm5EdDQ2JG5AWjM8N1ZHb3V8bXpHdWxZfWZ1WWkoZmdUWjFYJVEmendIQlp5YXFpYjtYNWB1dmc2NkxzNVImCitINWBLQV8kKFkpa0B2JXBlUHU9ek9mPFcrU012NDhAaWFDPTVwdEs8bnQ5UGElWDJMbFE3ZFglYHVZflpzej5Ud1U1YEJ4QVd1NDIlZnU2CitiWn0zVUlHZTZtcGV9d2xWMWxEVlNYOUB4aztAPnNCVjAzVSVofDIlTkFlQEw5WmJhQUBBXiMtVWsrN0RPa0RDIWtDJjxkSFFYKzR2XlhECitYQT94YCtFPk1Lb0cmMXc4NnlfZDl4ZjxlKGNMNXBYMVJZMiUjNFFqQC1+YURFS1FiVWp8dmhYY01QK3FFSlkyO1lye0B4V1lxaktaUlRNCis3ciN0b2cyfD8yTzdvTzc1Mj9WVU9ERHMrWlhBTFBhPCFUfm4xR0pDZ0lkcVRkNWthJGgrVSZtZiVUMGImKV8rU0koeFd7aHVEPjA8Kn1YCitnclApRj9LX0pRNmo8ZGZudUZaak51Y3N9Y3lNM2J9aTBkSFRWUXNZSCowVEtxS2dORG0kUiRlIyFNXjswZis9Xj1xa0dCT1heKEYtMFdNCitXeGU5KCNlQ3NBa0QwJjJeWUJNSE8+PGdRazspST0lPWdvO2BBJG1TXyhXI15fZWtWeytnbG82MX1SWWhqZHdHTjNuTVJ3Klc5RypwWXclCitqXlQ8KD4kTSM3SXkwYmVwQ2UySE54TDdzPlhsKCVNclNzZ2k1MFJQMk1yIXdSJDVTfWEoRWsreDltU3BXPDRAQGFBLUdGbUl5biNAZChLCisqPit3OChPYnp7biMmVG1AZHkqU21wTjRfWERsJHFtcFZLWlk/WSM8eWg2NkRNQWdJM242S2E7KiM/YEleWkszVXxaUWRsfGtxK0FVZG5VCis2PWJCSVhEVlNhUG82Uzk1VzA2PFRQZyp6bEN6JjxUaFJKfHtPamttQlVDeG5Sa3lyTEVKQEMzbF9hZFJhRVJSR3AtZERiRU9AckteRkZCCitZTm0/V2w1TV5+UnFTcGEtY1JLaGk1PWhwantIQEElYTtKZUdFIUNOS1N+KSk9TFNEKj45UnBHfXV0X0trJm9VMWdBcSleZSZkO0VBaCVrCitmZmBUJntgJUN+cCg3VjtEZ0pNNyY7N01pVSt5SWQzSCglaSgyTDEzMjFxZGxBLXg5NVQxJUpZSTExfVIlIW5wWVVWUUNlIVlVKVZDaWdDCis9SCNVeXdLcVMxUUZyYEF7cDgqdThTNE1MZFcwMkl0VjtBU2B4Rmw4PVZaciUqRzNNfjlnYW5EaEFAcFJ1Wkg4OUMhKG1ANXdlITY3d0dnCis8NHhIKiVucUE0S3Y8QD1sV1AoTzB2NCojKHJRVThsRHQ5Umk9XnpVSE94Zk8rTTJHWSMleXlKQ09pKTVfRl91RXAoJjgzd0BCWT9PRF5aCitPQnNIb29ZaiQ4JF48SWIzMkVmOWw/O2tTPHp7O2QkJC1TcyoheUhVT1g1e25qdX5RbTlxV3VqaiMjbkkyJGRMPTQ0SCtKOWNEfnl0SFRZCitDZT0+b2VTQ1RXS1RHMXgodEhVUG5jJG1PPkw+PmdZUnRJfjg5PFJ7MzNLSkZQWCl7VmReRWFlfWlpdU5PTmUhQ2shfjlOOFkjPkZ+KDdFCitofXh4NGA5YXQ1OHRzPFJfOG9vbEkwRWVebzkleW1hSGs8TjgxbyRLe2QqX01JSk8hanc5Qyk/Z3xga3pocXxHSCRkfDAwPD1DU3dXcm8mCitNSXp0fj8ySV9+RjZIZWp9K2x0eGVvb2FgUzBBKj45bmZvZFM5WCg1QExrPiFsQEkyOEtAZUVBP0Y4QlYkZ309e155cmB2a09zJmVrVHBACitwTiorS09NVmQhdDNIa0Y4T09MKzJiWSUjP0k2RVc3I1Fre3gyRHYlVXN8eWQ+Y1Y8cm44MEdjWmk0M0A8NXhZQWleQTVpWHUhMygzcTV9CitacGMkTnV4XyNAalk+eSVyZlQkJHJlMiZNQHEpR217YD5IZHQ9d3stdW5jdDZHfkwqeiRXNS0qIVVLRShzTU0zOzE5U2opYTR5dlYkTyFtCitgaUNLZV9HT2NFbkp8a05sPTdSZz8tWTJBPz4wdihUKE9hbCNnT0gyZTc7ZjxaYStJOHtFO1Z5NjhBXyNXQzVPdVU5YWJAOU8kUm1yQXt5CitYbWEzTEVuU0pRI180WGx1eVR+Yyk/YUchREhIM0YjMlhVSjB8JEBfcjk4JmVwajNobGwodnZ3LWtIJXVhcjUqIXh0dm1fdnlOVk5IfEd6CitCZWpwPSV5QWNoUHokci03bzx4fT9ZcThqK0FnUiVuXiRCe003RD1KUG1MSFpHTkZkK2YoS2U8fkNMTEtxamcyPm1PcndlWWlBJVpkdCZwCisoRjdZPUshfXFSTip0JUBNOXszWjIzVW41Iyt6KENqKE5vUmojIzJ3Y1d+M3dPQztjYFFrSEwpNFFKfjMxSzR5bUQlIXZxZVFCLStRU1ZkCiskIVNGYlVrJjIyK3p0eylIJXhfejxoUCRDTDx7bVA0WUUyaT91R193eURfK3Vsck0oUGEjQzZMR0BRPTJXWTNUfSk3IW5KPF9iQiZ8RnJlCitTbCV7aFRkO3tKNlMqdW9CbjtIazBtUTB4b0U7USh5e0IzMn5ESComPT0zMTl6UGVvdVMxKWtyKyVBNztYZnVLZVdiWlVrJG00YVN7cGtwCithJFA2OENiT2Q4bCM4OXBYaE50UXZrVHltTl5HZ1p5cXNqSEVqT242S3swKkFTbEFFUEV5WTJ8KnQySUpCVWx8OHwtUkM2IVcjUThnK1g7Cis4Q35eWEs0fSVWOXBGJCh8dmtHX2h2SSlSY2NndUkpeVBwQD51cTlJVklRJldUNEVkaXYwNm1eK3M5fDJLVGgmRWhSQnJpRzx8PEppTWcyCitKNU0/QTZsT21FSCQ3dFE+R1g7TFE8UDRMbEZTfiU4eW0yNzI1MTEpTSFpey1mQUkzR3B+amFWMjEjOTxne0xCWTZZTHUpVG4wZ0ZTblZwCis8aDBnR3dQaV9haVpheisrWVFQcUNPaXFfcS1zV2V6cks7MCVGdCp0eiVQVWI2KzVsbWVkUiFRTzBKeHlfMSVHO0clNntyMjU3dC1EUmckCitAMDYtX1gwRDM8bjFgb2t8YWNpZGtAVFN5LXZIUGpLPmZsfkZ0Wi11N3ltYl4qLWpLYlJkbndiPV5mSm9QM3tQNHxhV0IyVz9VKFF+YTlHCitHOWl+ZiVFZ2RVYTNQZlA4RzFoYzdLYW1aWTYrNGF6K3NTOF9meGpxRkhAWGhKMXFoemstbWg3bnVRM3A/YVVBM15WVF5aVGV7K1EzTzk5CitebCVMOF9yeUxDN3R2P0xKQ3lVOU03dlpYWXdtWnYoQTNMJkQ2Mm0zbWh2c3hfNWVjdH5PZ0VqUF9ZTWpiXl8rfVE9KGkzYFlkdEVERjxZCitII0BwK2hLY3pkbyprY0t8I2B6KE0zdWQmX3Jndl8+WU4jb159OV5fcHN0UUFkQn5MMC1lal5ON1BIMVYjRndoajQ8LUMtSVF7QSNQRVBVCit5blo3M09OaGw4TEtmWkp2SENKJTU4JCMyTUM4WlpQT0RMOzVAWE9BemJ1dWtxKlBMIXBwdDN6VnEtam1mOExrMXFGeW9+ck5vZ15GbU1oCis2UXt9WF92ZWNfR2w8NyEwWCZQe1ZsRms0a187ell3VkFiTiZ3TCtsJTI/ODM2MVQrVGJHQG90bU8rXkNBSFkofSRHTlhhUHBhNHNZe1F8CitXUytDRT1Pb3hLZkt4WUVCUklwPlhrISZBdFo1MH1tT2tHYTRQRj5wczA2VDIxSE17V1BhWFo1Wj9yUiFlK21VO3lZMEsyeVNPPUgoemU9Cis/TF56bDQtfWF1YUsoeUhnRWdOJGU5MT9DbTVOeGQoI0VGKnlRa0k+RG1QWUljeHY4bj9mISRTaWdrXyVfWHwqbDhVWGEtZDBeVWQrIXdOCitpYjdvUFpqQzlVRWxVY2JRZ2lmc21zfF88UUx9PmhIJU9pV2Nncy1LaCgtV0UzfH1+WDNeRU8hPUs+M2NyOUIrWDA5MX1jMjh+OHhNYVFMCitgSHl3Xk1SciZSN3lUU3Fed0VeIUh0SWUmaWhLeEFucz47M3hZeUxDUjhXcE44ZjJWPzVwTFF7bU9PbGl3dFg4LVN+T29yJiozWi1fNyM5CisjcEdfWFlsQlUjMXRiOWchLVp5JjFyNjxQbkVkPkBsdmtNJktlYEVgX21LQ3U2a1RBT1dKUFBhJCo8IzdzM0RveD43VnZAYEZQe183bjtXCitrMGR0ZHo2IzlJb0Z3eG8kc2dCVVhpejREPU8yV3R4QiVMPWJJIzd8NyZuMn1GQ2ArRiFqTHhWZXdhOFNYajJ0M1YkMCp7LSNnUyo5S1pNCituWVB4dFQwXlRofW90UnlaPkU/UyE3TzhrbS01WUAqdyUzcm5qIUtuVSQpS3BDRlR5bkAxbmtZN2E+Y2NGPTI4bFpudnVwQVR2MzVCMilRCitoNlNUSlc3XjRVKXNWLV5RNXt3Jn1+M0tGXi1AJV9LdWJNOT9xY20lPWJgOyMhVms5bz95QWotSm4xPCpJUUluPmd3fipKNTtQXm5IdEVgCitUV1dGZXNwN3Ftc1gpRWF5ZVUmMihQQzUkKylFK0YwXyotVjdwZUc0bXdOP01kVEs7WE9gS2RiODg1TnV1eFE2Pjk9UT1vRzhsWW5oJjR0CitoXiMqJjlLRCs3ajVQY0gqZTJZRmByQkFmWUFhZylDQVA7X28tO2NtSSZ7LWpBYFkxX2BTMzxDOS0hNGREX3pYR2wyUiFqdnozdzdUI193CitsUlM8b1RXZiY3T09gPTN5KDgpRSY5aFRuMmBjcCF5WmZBNk4rbXtFUiVudHVQc1B9NlU7YCN6VTQjUHIpSkEzKGNyRV52PkVWem04eiZWCitNSV9UMVYrZENfIXEzNjVJPlZtUGZ5WXJ+ZXF8ZTt8V2w3VFM4SEMoemlXY3NCeGErd08oUDtEVjAxRD5pYzZ7c1l8cHJ0WHN0NUpvdjFNCit7ZDdBWSZge2hEPWkjMSpHUGVGPXVzQnRleDQ2YClQbGdIRCohVHhYYW40flB6K1BOP1dYd0xPKTxIZlZ0Ni1WRzhPfEMwQ2s4WXBUOXtZCitDVnNYXlNibDBuMT1eSUV4V0Y0fG8qRzFXSG51KypIcGlZJWg3R2FiTEFhVFFhZUJyNkV0ekREJHE7VGpLVjZ0MU0kT3RGJVVrPVVlYl5UCitKMDJmPzRTWWpXd3lAfngwVnFga0BjWkQqentjaS16KmRyUCgjTzZiaXY+U1VDbzJlSWopJG40OFVUaUtjbWZ8M21QNzVUTDZpNz8/MHh4CitubmU8TlNyYmwlSUNISng5fT1RVysqJE9UVFlpVDxGRjhIKnlBZVhUSGhwJmtpeU1qTmkhQUp8MHV0KzZNUTtyIVNtNU48V2lvaD9qa2BrCis3Ji1rTyU5SXAwX0VQY09BZ1l3TlojMEc+RTRXMCRxbzZoQH1YemhWeiU+YCR3RkE5PT9DVmBEZiE+O1FaSShkbFRvczNnMFVAfDNvfVIqCiteVHJ0blR+QlJmSFRhK3k+ITR1dURZNC1WWUNMMj9yUWljYXVEWlRra1Q4Oz5qeD98RSEzKkBnR3t2eGpoQlcoXmo/N1c+YCY4M0NCQkF4CitARmxkOF5zZ3xZaEU+SHFofVR1e09HSHgyVFkrPjY7RSUxUy1+enR+dClifmFlbCpaUkV1fFBucXgrWn1eN1lZcVVJY0NDMChoJig1UjU7CitfM3s0Zz8yOXNudXNeVTNTTlRDaW1GI1p+Izc1aEYmMzI2R29gM0tEQzJQOS19VXozVjlzfjlRTVhPd2FnWUptOWBgZXpjci1WfjYhcTF7CiteeCE8LSpgaHdXRCZRS3FHU09HU0pVd2BXbm0lWnZKLT94UHpGOzFxWH0kfkMkbkk2bzskKiVtZGw5TSF0MHphXmxWajx4SE5UMUtzSHZDCitVWHJUOVQkQXlJcm1AZ0o/SFhzfmEpRXl+YXBFZ3l3U3xMcUY5YVVITHZfKkc0YHoxRndvJG8kUiVYRUpuQVlTVDElcHpLKG1hI0U4UTtsCitAOHc+KyVeLTl6bXQxbDReXjNlI0JVYmtja3xiWkB0PVN+NHRWTE0paS1JViY+RH5HN3Ijfj84VDJfXkVlMF52RVlwe351QWkpM3RWIXRxCiswOzs0fExPeVMpbWpnJnFeLWArQllDJFA9NUokMGpETV5nZXE4KGFvODdQbT9oYHVuK0E8b35TZDY5VWBWdzg8cGpGO3BKUWgjVWFjcCpKCitPP0VuSyRRdlFuTShgYm9PMjd1TilpY2M4UGJwQjReYn1mcElsYyQpNXgxPyUocU03bSlHJEdxa0JHVXF6K2lLQVRoVV4ybXlfSGZsQFpyCis3TWgqQD5KIWApYikrXiVHMzEhSHotRjE0PEo3RTZJOU9rVUo0MV5rMEVSaXo5WXJrRn5yKFduNG9wUUlwfHFzcGJ1K0w/O1I2elVPcUE5CitodGRJS0tIYTxoJVI/a3Y1Yk9hYGZWPSlMQWQ7dXIpUEpgPj5zTjNWQVJnaDUrbXUxaDhLdGpMXnB1ZGJkIStUVTlKZmhuKG1gRShMTG9SCis7RygmSj9GbjAqYVM9eXt8YzBrYWtZNUdrUWokM1VDWTE2Qnh5JCpNPUxjdHhCPWk+RFMmeGRUTDZ0UmkmX0dJcH1CQjxMZ2hNXkp3VjZXCitpdEhoMGZLSV5QYTZYQD5BKkRBQUxKOVpVcUpHN1Vsa2hRUjZ5T3BnT14/QUVkMkE0OVl+YXx8KFZOWUkoMFhmTWA9fUZyOX1NPFRwSG1NCisobGg0Y1RnMykjZmN+RHZ5RF5qbDlyfV4qPHFZRjhiODVMM3woPEw9MW9ZZlc/bGBeUDZYbHA3YV5WaTY8K205YEdkOCRZcz5iJjcxPT9SCitUQTxuIVhXO3dgQnJpcVYkcnJPTGpiXks0O1R4IXhgJFU3QV9pT3tlPzYwQ0E8c1ojTlllQGc5fE8wR1U0OTNgR3VReypDbnpwOVZTe1h0CitaWXdERzQ1cEU3S19WVFlVLWxRX15tMW5naTBXMTdOP19WNn5kV2VLLSNSO2JgTmdPKmgyaEVFb3FvbFQ2cGY+S2JKJW99PXF1Z15DM2E9CitTRkI+YFB2OWxRIyFoODd0KD9ZYnFWZkNUQjFkbUQjdyl4TGw+QWBgOFNoYXBwKG8jezhEKnlLOzhQME4+TUJDTGtVbFFmJiRZQGZYJmlICis+RU1oNmIrSSl5e0l5IXA0MkFFKmRYekMqKGVqKFNpZiQmZUUtQ3pQO3l6QFFqNWE+SjVEMEMjTjhZV1c7I1c4Y19vUypwNDdoeCRMMXp6CitDYDRFMUhaQVAtTFBHfDFJPnx6P3JVI3NxWj0rYyhiSmhZaDsoNGxXMW1JWm8lQEheIzdrJjEoPUdGSG1+NlRFfT1qWTVBfU5LY0d0UTw9Cis+LT0kKyFQKTtza0x0bGlwazNEKDRZJGNZJCFsKTQpTzxadVc4b35DZyVHRns8WU8pWFJtQFEzKE9hJlF9TUluSX5YQmU5MEJ6ZzJNNzc8CitKTygjcl8mdnlnWVFCJWZWY2ApV091ai0+ZE0pLXQxc1QhQ3d2aE5zdS1+NzVkXjlaUCEoPmxKfTFmKFQkWiM1NSFUITBoZ05saGxDdmpuCiskViRjamBBKl52JTFMUDxHNGl2OE9HN0FPeEB7Uih+eUpjdnpMRHtkRkg8Zl8zfTU0NTdFbXY5b0lERitNI3ZSZ013anRgNyN9QmJgcCVkCitmOSQqSDx5QjxFRXRrYH1kazJQUy1LVU52T1lTXiZTKl5TM2N0WSNtZjZLNXQ3Q2RoOVJGJUdlP2I9UTtGa2xlVWR6KX1LI3ZvKig2V3NWCistTjExXmk/SzZebHQ4aXlqaisxcW1yXlgmZGlfQTNgYzQ9NDMzfnRpRWQ8NmRJQ1pYbH1VaHl5bCpSKDtHSyQ3QXU5XnlFcjR9PWxEdzwqCis0Vmg0fXZBdV81P293WjQoaGp9RkRSfDVBS15ke2hII09NO09mOXNPP2pQT1o4Ry0rPH1BPSsySXlTQFZNeGUreiFrOSE9bzR1NCkqNT1+CispQ25hVk5gPFJYNEVZZnFoZ2Y/JGQ2emt5MjZIRTtrUmtVX2ZTPz1UTmlpPkViNDxOaHB2VklWSmZpelp9RW9tUTJRMWNGN2NjcklqI18jCit8JU9XPV45UCNYYitlZj99SUJIeTA0VGlsclZeSU89YWpFT3QzO0MxNzNRb1QrUGExUHFDSEg1PGB+WSVYb3JxazJaWVM5SHljMGRiNCZmCisyMzs5a1l+WXhYVygmbz4jJEtPSzVpSF9yN0JAcDxvaXhJclMlMW92bU1YYiF3WH0zS2g/ZTN4bUo4dGFsJl8jaC1nMndCcmtJNWwlRj11CitlJWlzTEQlKmIyVGxzdiNOQXQ2MGx6NlEtWWxyMUY+Q0JFX1lFYW1RIWhaRW04ekRpeG1GQjlNQkZ8UkJ3MmAwWXI3KUZeX0A/aGN7SCoxCit3Xk9NYTJ+WnBINzNDQSpGS2NNIWpgT0oybjlIMkI3P018SHkqQUZDZCNrKyFUKyh5KVdlQFN8P15OX3laXzh4YyNrcHx2ZEYrQnoyPEctCitzaHhwdlEoZzFiSWs8eGM1RGBnZn1kNWxSMEJ4PzFPeCZwKjdWWDU+RVRmaSMoKzBCKDtJNmt4SX1kNUdlamx0JU5HWTx8Yio3cD1uLThPCis+bCpRcFctdUE1I3ZlUmBNfldNZSFqY1BNYkB1SzckaHpOYW05NERYJnhnU1FmVUVYITdEKVBRISZWaC0oI1hGTyVwWkNSM05PQ3RMaEBeCitFVWJgPnIlKUtBK181dVpNIztSTHVwMzxfUzZadVZBLTl3IWU8ZkYycVBWR3gmYyVFPiZPUnE9bVBTZD17LSR8VDFVIUlyX1A7UU5kbjhuCitqMmhlbFh3N0BaKlpCMT00RXw5NyV0ck5NSUJDY3w+WmlRd31KVzVTTlZfO3pXbTZxMDIpb0UhbGx0VHFqbyZPfCUxOWlCNXJzK2FIcFZECisrOFVIQT1AV051cmFHQl5kSG8xOHhlJjFnLVhvNm5vKXJWRlglJUdzc0wtKUk4dik2K2V0Ymk5IVI4KSNKeHd2ITlkeHZhZGpZMkt+O0ljCispNyFjb0g+PC1nI2dObUsmUHBPY0JnLXd+fmM2QDZaa0Mxb1l1KDQzd2RmSGAyPER3PVJHVjlUdmBEVXRrM0pZVDhCP255YDNvST0/N3prCit9dSkqaGc8LUJDNlBUXkMkbX5wcD9nfkEpVT81I0RwfHk8Z1AwJXpsQnpBYEYqaCZgJGV6fF9XRHNNUiE1WWheZXc9TEdOYHdYT3I1YzdmCismZjhBOUo7Zjd7MWMzcXtDe0ViVWM4byNXKl9Ie05XNl40Nzdnfio+K3AwOGNFe3dFMiFseXlzPUh2K2BOJDhpV2AqQUQxc3cmdm5Mbyg8CitjYSVmM2NmPUFmdlpeRTdWYkwjcDlheTxOKkY9KiFPO2ZDMlJHT0hiTHBzVFQ7MXU7UihaV3syb3Y0RiFENjlyVzRLJGxqRHkwX1h3aWIqCitANTlueTVTbilAb2ZwM1Q7NHxCIUFfWm1jaTFAbTcjMkxBRGcpYG4lZ0JtK1ZFJENienBWO3l4Tzh4VEBUNCQ9UmQ2aGJFdEd7MlVrZy1GCit1VnxfcnVxOHdfNnFCRT4tOU9ERF4kT3BiSWFobzMmVEZCY2UqcGVHJSZmPlAqK2VpOTExNV91a01LNHJWXy1KbHw+PHpwOVF4OVlVeD57Cit8RXxnPFRwWGw1ajhnaUZLVDw+UiVofDNgczV4PSs8UH1wb3oqb3FWUlMyWkNqayFPWElvdWxgP14kWnBLdnRqVV9EN2xzMzszbClhfF5VCitvKC0kKFRkM3dgKEU/JiR6S2Biay1vM2E9JlV7bDx5P0s5Nkk2MShRNkRffVdRPlRNJngxI09WbUs8cnp5MC1pQVAtfGhee2ZraSVpPFd5CitzUD4/VCt7TjttJFl5U3FYbnRLRWFOVVV1MGtjVjV5aXdHYiFfVHg9ejwhak0kWUNHQytLdj48ZG1XPTtDUDxTRm9GMFF0eC0rK1k+cz5PCis1WEViXyRyWHAwNUtKbzB8Ujk4UXhDKUxHYT01RmAjXykqfT5NT1RCbSQ9YClhdmYxJCl6NlhAbEM7TU80M1M9fmVNMUgrTiQxOHE0QD9WCitaKSFjRXJ0Nkd3QShGeHw+WFkzMVYlJVB9OTIqelh+eXBVSz85K21TSHtVMm1aJCtjbytzTGZXezYpPEw4R1ZtQWNGTzxKNSRwMEdCYClgCitSaV4zRVQ1ciR5YHoyMilWeypuKkllIUUxP3xoQmVMYnl4bTEkcjlyaFFkdFV5fUI5WVk3ZSRNcl5fZUstWiU4XzBmPkdjPTRWYT0peCZZCitzTiRNYzk1RnU0TGwqQklWKktYT01rKUohRXNrblFUaD5DfUQ/S0N8VUM4WXYpWmB8b1MjQFE+K2FrX3ExU213RkohSWV9R1B3MHtfQz5VCit9bit8d0RhO0MlZztkXnd7QVojSld3Nk4rS05eRSVUUjYzYj9rKUJ+aVV+TlJkOHQqTHQ7ODlPX0VBWUw4O0p9Xm0mWlFxKytRJkAjTDVLCis4JlNiYDlZSlBXN0E0eDklM1h0NHdWODR5eFJ4QGlDfWVrJDBHR205M245Y00hezF2OGY0MkM0ejJqdmQrKiFVPyVVcEU7YUFqNE0yeWhBCisjQzRaWE5BSER4TGluU308ZEZkRGJUQ291YXwkam4kfTRaPiU7b15+VGFWJGtZPmJXOUR8YjFuSlM2Yn5fUkAmSEEydFdKaDlGbW5HPT1uCismVX0mRSplaEg/QD9NRmhxT0dTfDU5NFVPRG9nSmRzSX1jVFElcz1qdDN5KDlkV3UpUihXMXFgbDtpVVNNVXlKa2pBcUQ1azlAfCRQVjxWCitTTUcybC0mUytHQ3xsXmEzMmAtLUFWMktaWVFjOVdlZERFVllIa1BSbj57dlh4MkBhV0MjM0RhOEE/e0hmd09gfFpwI3w2aCspRFYqMzUyCisrSXhfYTFrWS1ebSlDNVZLeCgtamo1PjE+NWkmbjRHK1RAbklyUEA8MXdGNlJaSm5EUSlHdllrTHIlU2Mod21EVStrYFo7ak9TZj1xTEFnCitCel5HVU9jO3txUzE7KGdSakFsb353IXBKX1NtMnNwbz07KDhiSCNiJFBPfHNKfWM5O3F5RkdKPUtaV0s1MTNvSDAoNj97SkZjcGFAbCNCCis3eUJVUVpraS11WEhuNGFQcEM9Z2Q5SUlBfExQSCZgcUsjZGN7dmpTal5tUnJrb3c5R3x0T0Z3QjErey0ocDwxbypSeCMzNExnVC1gJU9oCitBdzRkKVkqbDA3KW1ZI2FCRTRpSyE5JVVuNTBeZTs7bnl6ZnwpQjF5b3t6aHA0VSgrdnhtM1pfLVV7KDdyLSFHUUckQ2h7NEZKVDFHaktaCispSmJTNXc/RmBJWGpUP09mTDVAZWdoPkl3bkkjTmgxaE85QnVPPFRyNkZ2TytWNHtiQ2dWO201JXRmOHJFZ2ZrUHB6T2VEalhKdz1KMS1GCitCTjZUNWBWWVRpJWRTenZ2fEx+P1h7bXlgJDR0YHtGV2pCUCgmNlBkcT9KaWIhblYrRllkOFlLbj93JEYzeHxZcj1uTERqfm4pWUVPfEJqCitDR1p2dzVfQmY/fnw8eyh3UnE9e3RGS34kRlRubXtyYW81c1hlWWNoXnAob0ckZlJpUWdkZztpQWBMRlplcm9PaSpCajwlYnk9eXlQQT5wCisoNitQb2REMmh3TyloTEtyZHdLZWhSZTleOWcqKiYhRj97YnQ3UiVkOz0xJmtyUTVCaUBjNnROVSNQVEx2O2x0bG8/Yj19MCg5MnhiNFk0CiswUWklaUJNbWA0cWZ4QDc1KyRXaiRwc2hBeXwxKl5SVEU/bE83aDhEdlF2dyQmN19DRVVFR2xKbmw8Z1FHYH11SExYRDBoWWMtRGpPSzVvCitMdnBhcFNrUlE7KUtZbnw+NWh2UEV0UlVVd0t2P3ZgRjheSzBEX0dDSS1qdSQlMEthaT9rcil5QWREZXo5e2BuZTRyKkd3M2xmZHBzdjErCitOYDlWOF9yYTB7d2QtIzMycjJ1XiZUUTRAWWp9PURBKFpgbCEkfTNBV19rYWswZkxjViZDTDZ6P3VuQERXKlFyQU4pMWR5PmFFaVc2WkBnCislPDNZX2RiYiFBallOdzJnanJnV3pqaTE1bSZKPE9NdEFhVV9tbSpDYXF7RkQ7QmNZJUh4d0okUzZIQ3I8eU9sKSV3Nz9lQl5rTjR1Rzg8CitZdyVBa0xfbTttUFFlbS1HSnRaJE1SezlTKjZubE02aGQqfFNpX2FBbWp6PWU1VDJPRExEUCN+JFZhX3YmcyZRU1NiYEBkQSZ5YVlNRWtICisqWTh1PDApS1ZCXzJjVmNNak9wM2VHPGZQaT9yc0FfTGxnY0IldXcmVyo4PT1tbHI9Y21OZ0M+M3d6OSVtZSZlOXZVJWJzJX16aWs4dTc2CiswTHdtOChBa04yeXQ3QCQ4dDMwWXR3NDt0NTlvcG1wdnlwV1c5T0h6eXY3SkN1LTdyfG9AM2c7S2h4Nl9CWHxGZyg2MlhjPTY+JGM/ellDCit0eyFwT1QmaVQ+OUwySlJrWF5+ZVJmU0xsUi1eUzlZJGxvfj9afXV0fmZRSypeO0xkLUpiS3V0QG9yT3EzSmhsb3RSKVU9ciMoOHszZkMrCitYYitrNjFgZyVTUHBYZjVsdDZ5QEltRSFjOU9YezgofmpKa3FsQ0E3RDE9Vn1IUHhDSCtrdllPKWRrR0IzNVNPdzVFLWYkKmM9bUVFTyhPCitJeX1QfChXV1AmdkBfQHp4XnRhdTheSVcofil6cF53dj1LR35ZX01wTlRPcmlCJElRKkomRWI3e3h0ZFBYZ214cnhtbSMhMHFOUE8+UkVaCis0PG8yWEZeczJxJSMjYzQ4Nj1WN2ctZj5sJSFHQnpyQ2lhbSNxZ2whKSRVS1UzTyNKQHlnIVdeNG1qdEt7PCRJJklaalhSKClQb3NVc29UCit5ZFFMTVV5aGVPMH18KzZ1anlfdWN5Q2psZWlmQFFpZEAqQTtQU3VPUGZjOEVmY0p3VS1wSn5nd0g3eXk9VjhMLU94PW5IOVBRJm00Km1fCiswKm9UX0tCTXIpSjxrcS07VlAzfmpuT3ozSDgzbn0/UitKZzlRUnlBKEZLK0RRcnhpRExYcVpqak52SFFgdSpXfWZCKTdZJEtrTHcyQTtACitIUHMxWktNRjFBcFcyVGlLe2MoMDlJJUxZeWdXNjlZNE5oXnplYCY1LSRCKyhtZnM5YGV5a3NGVmZEIWErUTk7SDcyOy0oeCVDQHVWbStoCitld2lAelJEWUc1KjdpdFFnQVlfSC0qb3h0clVRaFM4WkFvbDJ1YVYkYFRzVEtUZWlraWgyRytxP09RRzYhV0laalQ5c0AwOyo7b15JX01nCittTGRwYk9ORk04cUVnemAzJWdOZjtrVXlkKkpgSiFmO2IjS1UycXB7dkg9XlRYJThMNVdCPVI0JkE/bmR2VUo+ZFd1X0duejhafnEtYkJWCityXmpFX2QjYzxuUzZUdnhgQS1WWksjI0k3PkNxQUIoR2hOcztUdF4pKDtoKilqJHlsd0BEYlhzMUJHRV9sI2R5N2dBbk9mdjMxWj0kSTc1CiswNHhoTFchKHRoXlAoMHE9b21GbykzTT4+WDl4eTdPTEx8MipxY0JgTT5ePSp+cVRrYkg7SSgyKD1iRk9KYkxqUDRVKXFsODdqI3dSYWdRCis5MzQtQilRTl5XcGclciF3dk9MTUIrK0A1PDxaTzEmcEc4UypeOTAkV0tTNkotbDhxKHp6dG0lRkdnQCVqO1ZyWktFTDw2Qkp7QlZPVGpwCitQUXIoX3Jwc2NYQDBGeWZRQWFpeWdlY0JXYD0kbUF0Sih4YFAxT1c1fG5GaWpuRCpJYE57NFRjQk9uJn0rdUQ2YzxmbEE+e3xNcWFhS3NeCit9JCtmTlpoeko8anhRNlFWZT09bStlP0hVUzFaV0o7IV55YmEzPl96QkJ7MlUlUEZnOHJNfHN1a0xZQnYkVkl8M3sjc1ped1Jxd1psRzZKCitSUEBecGsqd2QqYHlzNWRZdWErelJqezFvOzQqUUx7bEBoV2M8RHUxZndrSE5oPGZzI09ZZ2VDYHtkMFVaVUFaOy1nU1l1VCZWbUgjTFdkCitXUjZmPHQ3dEdqak8+cEswKzQ2JDRxYC1wTFR4QDs7Ul84MFVkb0lkZVY5QVkpOSQxQV4mbUxeSC1kcHttM3RNUTdPdXc3JkhEZW5EdEd2Cit1MkZTaXNnVn0lc2p3TWY7blNESFg2UVpuXmBqQ0N6JHJHO2tjRT0lPD8qTlUzam53NmxIc3oqPj91UnZ+REArYVY0USRkIUk5aCtkQk0kCis8aXZCVDU9NU8rJTFSPzJHV2FKQWpSTl9jUz40VTdIPktwbkRCXk5pIzVFY2JNX1A7PT9rb2JqYkMrYSNqeExzX3RUIThGPWlPeUx2NHFtCis/SSZKeXspMF51RVEybkMwbDA/dVRRfmJkWWlPNTMoTF48RGUoM0xGU2htSm15LV5UP2VzdCtiTChQMFNDMDZNc0EpYHJLTmtLVkVHIzdOCitRYHJwd0BsWU1ObXY2entLNVhLNGQ/P2xHIyNgbSUrUW9Ma2IrQXx9JWpBZWlJUXxCYXIxRnoxXz50c3x5LTY8ZlYrYmxRQDVlVDYkQT5hCit7S1ghQ0dLOXIzOCp3eVgkZks/bV4hbGdBRikoMlppWjBzO197dTZYN3hJOyt1blRRaD5oaGs/WlpkbTtLNU5AJkh7OzdDQDx1am0xZTJSCitGJUVSMihIVU0qRj1EPWtfTEB4bmEkPH4zNX5rPzVpfCttSVh9V2A+LV8weT9HMlEqeEZDMHcoJWRUelJULWo5aHNONUdzM2FtQzhvMnNgCitIZmNTTXNsMilSYmUkUWlXd3FRYTcldFFtWj5ebHJleHp4dj9GdSNeWUhaTCN+VkI3Nm5aay1tRFJfR3RzNzAqP0J9LXc4aj05aj1oTnM4Cit0QmJZISR5NWEtcihvNUR6fDIyO1lyKi1xMWBAI19nVkMtQy00RlE/bW8pcDJNUjkpN253bXlZWT9oUDR6TlZJOWxtU3E/ZHZQe1FlWEc+CiteK3F7amlyNkMhb0NgTkNTNFpeZ0o0T2M9ZzJkUGBrSCs0bCRNVjtPUmlpNjdiRldVZHZ+bUdkRDdzX3U5e3d0Vip7IX59Z0VxIz1ZUjZ+CitWTXlKcDAlT0BgI3BsK0duP2ppWHBGc3d4PnpQdUg2NSVEU3BaX29Cd3llJndsdjZzLUQ2Myt8dHlGVTliYkp1NmU5elkhLWVAWStfVkloCitoTkFBUmpMNn02aDx0RSVwS2g7RGRkXzByRVZFSm4/dUk8NFc7UmR0dSUkMyojRW18aj8yJn10Q0YyN2ljT3N6bkgyKHU7Rn5QWmJQIyQlCithNEN5UXEoZC1LeTw/N3pUOX11YzlWJFgrUHc9IVFhVWpKT2YlQyE7ZzlmKWxBLX57NWU+dlZsOVE/TlUoR3U4TT5HWl8zSSZCU303UGJICitOe15ZZm10Q3RFcDg5c2dZP0hWXktHJFlKZylZVmxMKEY4Z0xHZjRod2dYPlBJNylMdmQ5djtCZXdWTl89NmVtO3I8aEtQQDxib0Y3PD9XCitDbm9IYExlJSYwYHd7d2BwWndsTHpZN3hJSjckY2RLYks8bHVHVUojeE0/X3hAZ1l8ZGpaIzY9VDIhMmN1PjU9JShrbGsjSU5xRUIwQGFNCitiTnEhbk9oOTQ4R0poalljMHBWKHkmKWB5ejw5I340JmJVRFVaUXFKTjUyZV8pVl9XUF8hZTM0SSYtZnxvNXl7endkQUFxbkRWJnpWcUFICitHdz5NWXRIakkmWm5xIVhvV09oZ2gqOXtFQE5NIVNNNmFTJVB8aWszXiNVUUVjbXprZm03KiNNSGw+d1dNejUpSGxuRHhhdHFmNTdtbUFnCit0VWheZ3lwWkQ/RXlWakFZSUw1ZURUTSk2SyNjYDBFUDcwbXdqaHpjNlV0e2o0XzR0TU97XzlKbDVkY1RCSnJTNXY8QERydyp1am48ZV48Citma3RyOFooaExNKUBuYHB6U2EhTX4xWUBzSnRzNTVIRWxQRVBzVzw5NXlDZlpfTXxnRzBHSkFPeU83RDkhcU15I055Y3AtZDEhb1ooMXhVCitjIT5qZ3pPZXhuXml3SnxVX24rODRTbFk5c3FDaEs2fHByYytQRTJzQF9lITxGYHVlbV9lcD19S3JkQUl5M29sVWphU3JPMkQjNVpwWGtyCitoPWFiMEElYW51Xk1EMGlOaU5ZaUpHWU5RNHp0K2ttRCZJdl5gVVZASXlnR1F6KTI0fnlJcFk/S2MrTW9gWXt2Xj5ZYXtkfVdvYU1laFViCismKChxRW9TODIyYWEkQXdIKDctR0skaEVwM3NRKnZOWlM7JHZ6e1dWPWBsdUQwTUx+bl81NUJyJmhjdyFxbUB6VnptSF8zY095TkY8ZElNCitBYC1PKmdzbENzY0pgY3k3QEI5SkA/QGB5Nmh8Q1h+RDcmbXBmJVJYIW9EIXtVRlMjbWlDVTRjZ2Vmb256N0VlZzA1T2JtUismV214MGBHCit5amZlYzV+Pm4yJWcxX1IoZ2oxVSNXUH5FPShmeG88a289UXQoXzc4X2B7d1RiLVBtRnFJZ24zWGEhSTYtP1QxQWhhJS1RKCEhTjxlYzxHCiswaEhNaW9EYXtZYjRFVTs+Nn02TTl1USZRUTlTTE9Lc3Q3NTFgeDBCTiozPmhVfkJARS1DSCl0b1g+TjMjU2B2MHwyVCYjSSZMejR3MDwrCis+VmAlaGY+TWN0JUgqeC1MQElmTTxxSip7OWNEVDRBQ202X3dURGVFVUY0PzVjT3EwKjN4eShfI19Ye3M8U3E7JGtHclZPRVo1cm95O3FBCis9MXtXdjtMUD9YVGpBVGs3SUFXfWR4eThwQCl2YDJJTjlXRDFUbFJ2fS0/Z1hDTW5rbnh0cHVrUCVHSH1aXkYjaGtUYyQ9YylyYTI2cyt2Cis9THhRcioqMWBMKCF1NHVmdCZKdVlRMnc/Rko2WiUpdztUej89M3ZDaEliT19pVz5JXyF0SWA9NiRwSG8tdkktX2hpZSsmcEQpZjhyTnJoCitGUGY2aEE4OEZoQUl1bk1HQSsmcGkzYTBvY21JT2x8OF5MZ0YlRUA9MkNaS3hBZmQ8P3EyPXFrTW96SDQ8UXF6eT4rPjxqZEIxeEJ7UDZKCis/WWJZdGNtfj8lKCMmIVlzbF5uUTAhVFo+eUQ9bFR0PUVLPlVmNiR6XlckYnZ2UHw1JTghV1dWKl5AUF87T0EmWWdmd3Y1Y0VOYGwhMTdnCitFZEpLMDE9WWs0MSpDPFRwX1NrSFAjUjAlezc8RkZTN15BY3NgekhtbFcqdTwzTzVAMUp4cSMkKUo0RiV+eERvNTJnJk9zQ0A+bHpeUj02CithWlBIcXxvSmY1fj00czhkdjJEblohdCZoOSErKGw+PmkqQWI5dCluIVVtUnE9KWE8KXspJjUzPCEjRVpSPUgwS35gWmltbU5lTW1FbTZ4Cis1MnxpT1ZYYnZ8Pj0lQDR0d1l7SENxOWtQPD5MUHl0VlNyRkgjUHQpbXV9Tj5BWFJISiM0QHJiRkEmIyQtOWxUZGE9cTxeZ3BTISEtT3c/CiskKXZ0YnxiIzBYPTZ4WnpJXy1NVnMjWUdLJH51RjxGP3JgRT5jSnRmKnN3Kyl9ciZrKU1WMypUO1J7YzgobzNNKEAhSGxwelRgQWt6fSNqCitJJkF6eFpxRiN3aG8tbCtfS1ZRfHY0LTgpZXFZd2dkTVF0KShXVy1UWlkpQjMpPU80WFRrfTIpNHEoc3J7IWVATUJmfmQpY0FNZG5vLU0rCitqRXZBcyNUJVZFWGwwZU5xQGwpXkVrWnpzUnlKZVJqck5xOHhxPThicz4yMiY8dyRgYzNjNHNGcncxJHdhKlh7T0pnTClZWmJ9S0w7Z0YhCis1fEZpWntFVTJAcHYpX28tRCV4dCVSJG9jPEdwR0NDcSgyWGAlJl80P15lO1dkTGkpbDlrK0NTWC1ybFM5am9rclJhYkVgfXtUQnZ0PVA2Cis4ZDdYb0ApPitKWlVKTU9XUjg1YkRmMSR6cFJnb1FoQUVRNmk+IWhuRndYSEd+bj9pdSkpR2V+bUF0dTkhfGlBJX1lV1l8XzUlaSlZY2JQCis/QGghJiMmT0tNITchRzdpOHVSUCtlJm9vOTJ3QVcqN3pKY1FpbCMtWUVJNlhFbSRBTChsLTNIbCZiRmlqfkAzdjMyQShrSjgpN3RscGlkCitCcGlIcGgqZSZMbVh+Oyp7ZkFiTmkqPk1+IUIhdUM9RFModHR0LTVvNzNBSVZBeSR3bG89S01jO1dMLURmfjxUdFZXcWRYa2x4Y3teJll9CitMYnc4OHIoPG1aOEdxZis7aHhjVjlTdnkhMGhrZnxxdlZCT1VlUiNXeXs5KmMjS0JQaCl1Q0Y1M1AxbFNqJX00MnBRPkglaiY+NkZNTTwrCit2ZCtBKEEjSG10SCFWIyhKI3xCP0EyfDRnRHxBNUJtMCQxZHcjWG1QbVpaVyhRWF8kPXtmQVo0WTJzQTVQfT04NH48X2NVJVAwPlFEQlE3CitiTC1uYDh9TWUoN1l6ZDgme3QmWXYhREB8KE5ubGNrNX5ANCt4enxBTTlpRFlDTylOPXNiJUBmfCQheyY0WTlrRyEyMXxCKik/XzJBUHlACitfcSttOUolPFBgMkZ9ci02UVhkfDRmUUM1QzEwYDdWa3xNN1FjOUwmP0UxKkFzJV47enk1I0dCZC1AM2l0ZHB8P1dkKlBudGk/SUFjeXdWCitnTU45PlhIWHhBcDxhMj9hSWRfVm5uSGgxZGdhTU1FYWF8R0lgQCpGP1NPYjY4eiR5RCYxbihYdT5WVXVVUGBNTzs7QzJsNUwhRFdlRCRhCit3VWpuMHRoVHluNmlSMEwzZ1Q4dGQ9Jkx1Z3UjTmchPHh1Qn4hO3FSelVIa3FJZCtMRmpCbUl2KF5+OSZDR2ZLPk1jfj9Dd0gpbntlOSgjCitGTHowV1Y+c2ByPVN1Nmt7a2NoJnAtNUxkbjUzfnwtXzwjJXdeYF5pNmIpdk1IOV5fO3FeVVd4OWlIJW9XYnlHRDFfbzJ0OSZPfjRqQk99CisjQ3xyPlBAQ2tRJj0tJlUqSj1AZWlFIT9tQnBodiktZVpJX3VwQzVWMlE9SVAyfTkmVSk0ViM5NDE9IWRZK0kjYk01UlJzWXtPPnN8TmAmCitVJUx2JlUpakFJUDFOakpMezRFckwqM1hHbG4/cEokM1FCSV91czA0UUlXJW56UD1sQDhxbUU2VDZ9ZmVRZXNMLWctfTxufEV3UCFkcWBQCitfMTJxYEBZY2ckZDhYY2FGRUU8Ny1YYD9jbkArdjt7JnVPaXAycCs7aUtwSXlRSlNhVFA1PDBlRk0qKSU/eTJgejA1PVdEaXtpNFVLYkMlCit9cj1JUyNfQUwmMz1yUXd1JXZFcFhBQlZXPUokWjRzc34qPCQtQ2d6UUpYTldtP0tmVFplcyVHRz5aKFZKYCR3Kk4zNG5qQHMmfG1+aFBFCitlJjMlQm0zJExuci1ELSYqZGAtaXljQT4zdSRea3p7dkpwe1BDbzhFe2FaaEJZekA3P3NxMSYoZEtnMVlJQT14WX5gRzVePzRQc2lUPiZgCit+ZSZvZ01YLWo/XjlYR3tRKGE+TER1cnh1ZjNnZ059TUR6VHYzbnhVcFdHIXo0V1F6V1UjTD5mdD42enYhdj10QmUxQFE7K1Bzakhlei1lCismNlApSH0+bFVVJUF2JTU5PUIzc1Y4NGpfJkBVMEwkNXBQc1lqamo1fXRiS0xgeXlPK084Vm5zZlYlWHNuPkY4Tzl3c20pPkJfUEViRSh8CitkWEhiYylLa3clRlZnJXJQZChiSFooIX5EU0hJekBobTQ0Tj5TMklQbDJGSF9hb19hUjxGcEJEPnVvJn1UbDAwJlJ9KFleOGM1PjshSmNtCit3dWBsdTYreG0wVjR9Jil7Q3g3bD4rNS0rSTw5LUtJNH1aX1ktK3VUckw7VU8oLUZ0N0BHSlVzSGE+aXcrKSNDPWVmbFF0TlhualltdX02Citnd0I7KWFmc3Z9M2BfbXJFY2BBN2RVWVZ9VllgcF8qUER2VX44MkU/YmtOZEpHSio4OSVvSl43JXJZSDA2YXltZ2tLJldBYkJiUD9+M0AxCitWY3pJdnxXRSt5NnQ7UlBYPGZXRSYjI2FaTCpoZmZrc2VZcWE8M2FDSiNJVnR9QT5sLWtNIT1UYz1zPyQpKEk1Ymw+O1p4JWxXam4ra2VKCitebTduY0txLWt3YlUjJkI8Q3JxeDxlVTVgdXt5eWdJVExvWXd+YXZAUlZITExHRmZoYHJ+c1NqODdfbys3JlNMaFpATjAtPVc9a0JgY01wCitYK3hISHFsSnhAKHAlK301JTZJU21nWWJiTD9JdVJPSWgoWUdiMCY+e2BsPkh6PiZMPjRaO0tPQXlecW5UIVU+cmB4cyMzISpBTTNmbklDCis/ejFVRzN4I2xTbEVjaHVSRzRvZjVCI1hDSEBGclUqdmV5aFVOQFZYeWBaVGxuTTUlP0lEOVlXYD8hY3g3JWcxfE08VlNtUGxiRzljTkRmCitPfCV5PzFGN0VBYkpZaTJtTyNycGYtfE5kcFBtPV9PUDBKIWsmKkR6eWlqLWtjc3hMTjI2LWFtbUp0SjYzWjsrNmAxdExoUjs/Zjheb08wCis2ZHRBbT8kYVpaTkM0RWE+YWhwY2pSa2V1eyheZSttd1QheWF3dVgkXmI8cGx0eiskY0gmcjZueEBLaH5RcDIjSnl5KUFLRXkmRnpqI3pBCitJWlhXVTtjOVB5RkdMaHFqak1IYk8zKXlJTkBXfDRWR1lfQU1lV0JWMEo7PjI8b0UwMTwqMWJlLVd3Kjt2cDdocGVMRV5mbE83emVsOz91CitHOTkzUUM7KmpHRGJRI05SRGdLZj1FUTF7cEp6OE1OdTZNQS1JanZJRGtHNG89VkRZb01uT1I+K2Zvcj5OP09hfkc9UDE1TzxBcz9GJmdOCitFVnR6dyFzSldWazx3eC11Xmstd1Q9fTdSMGBRbjghOCM5YGdXS1hhTG0qcCMyO2B1UWZFJT0hcVQtTVFJUlpNTFJRKSsqd3ApSytJTTE+Cis7VmJGejVadWgxVW5TOW4zcytoYGZGbyEkKChYZE1WVlRofXVENzRrK2ViP0x8X0FOLW9TYlAoXmFARStoU2F7Zk9QJkotS0hsRihfTk1YCit3aX45cThyOXhgKzV4M319ODhaZ04oeyVlRTBuVEk3YH1HLVB1Ul9sbHZXKWVwISpDc1l2bi1RWGBFYzNHPW5XWTl7ajhASjtvNnBjZWkrCis1dXI9R3pFankobUJAKHZAQHIrcExnbTtXNkU0eztHIV5jRDJOMz5sI304PnpjM1BpLW97fWJPakhoSC1aYj5STExTXlU9eExTeiVeZXNJCitTKT1gKUwkQjF4KzZSUGVJWVIhX2tKQlpGemJ5d0h2eFNRSGM0eSEoYyVUQyNVUGN9JkRuWUM2aFI+USthdUtDOTl3M3w1NyE3Ky07b0IxCitoNHhEcFQrWmxGNDN8YGRjKEl5MihlSUtJZTM9SitFP3s8O0hGRzdYSzdUX2tgJiY8KyNPS347Zj8jRFVQKWM2R3ljXnZnMDttZykrfDYkCitKR2hWdFB7PHVGcVkkTUM+QE5ITz1sTkhAV3RuN2EtYU5rVHtQSVZPe2lqWilaSmolRVReYjElKXErb0okdzlqIzRXJj8mYWVKXkBOSUVWCis5UXBvUiU5fFNofkAzQCgydV4+Zyo4UFNoMkNnMz8oJGc8UzRXKXgpNSpRV3lwXiV6XnFKXzdGdlB9dHdFXj0zaUBIYWUwe3hDZ2pSN088Cis0eWskZHY1fHpXJTJjbzUxVSs8MVhCfjJAfXteSHNoNTRaQVF4RV8wITJ+S1RuT2JORDRURkVZQUsqc1JKPnlQJUAjfTNUKn1KJm56Xio4CitweXBFVW1ZR19xc2E/ZDwoZ2MmN3xNfEBHSmVMY2lTI1IoQXsoa0A4X2tuWH5vPnxZQ0lXdSErJk85XjVVKERDVTJOeyhjaTVyU3o5VWdZCituWCk2a0RBbylWYlA4dnZvO2c1V0Q4JF95OXhAaEF+YkdXMFc2LUEqYE9BfU84NHlFfWp4ekNjaXMlT3p2UmxPUExpK1hrYDhHMmpqMDxECis4PG10eFRuK05BZUhMK0pra2BOb34kN0xQQmFaOT1DbHhiVnhJb0tBSWFuRkkrWVFsJC1kYmVXWmVzISY2UEgoPj9aaDFpaTBNVUVmZzNPCisjQlA9M0NkK243VDZEUSlqYHpLNExeXjxRYVQ/UTdia3FvKSNhMyQqclc3SVZ3RndZQTVsUUZOIWhhOEl6dTE0bW02fnFUR25ld1JiN0cxCitjfjFYdDwlbj48WGZ6PEtWWEA+VDR7cGVqO25Pb2dBbEctNihQKFBzfEl3JFhNPzUwY3J7TWJVRE0zNTtqVT89RWgyciRTeXlFZEp8U1ImCis9P34we2I/WT5EP2ltJDREa1RySmkwUlp9eHVKKWRKSi0/X2VpeWxEd058dVNpYEh5S3s2VF5FISpFT0JVbj96SWUwaVpFV1BlJFM9M0xiCitjWDl9b2krPiZBP1NXWHV+ZDBnPGteKn1zRmxsfjAkJXZ3MFBTLSVjYGFLYXkhTH5OSlk8MjJ2OzlqXjZBZXFXUm51MFQlVyRJV3hyM3UoCitnTzVSYUQrWkNeSXB6TGVMIWxxSlhTaUJ3X0FJXilAel5IaiEkcmUrNygmLTgzOXFfYzJHPCRiM3NrNWReYmZpRWUlKD8rcWM+di1NS3hqCisrTH5uTGBIJSlKfWA3UDUoPTFqVHZkKWxSVm4/PlZueGdsaUItSmw2SSNkQ3U5Sj1UfXdDNTI1UkltQ2VZM0psekh9dChweCl2WWFNVVY3CitFKDJDTWw4ITVUbXdBOUpiUG9rMDNHVEF7THZpJl8tNjREbjA9amxePm5kU1lJZUM0RkBock0lKEhqVlRRNC1fYyp9N0xWNGpVIyVpQSZDCitfU2gzfCooc2IzJVdzPmVCUWVDY3lnZ2s9YU9UK3tHe2t+cD1AfEdqWn5gX0NVOCVSLTNAXihKayF4OUB3R2ZNPkxUcUpyQ00yMkA2MiFICittNUdYTFkqNl5VWXpoaitxQiVEb3FNNDllTXdEe3EqVUw5bFd2e3N5fVh6KW9pWXFac2RvPUskdm1JLUw7KmxuOT1gNUVHVFVwNH1ScCFoCitoRDJFbHg9dXpBbEl2NilRVjEyNiNuJllefFdRbnV7SXo2ZmFtaj47djt0JmolYlBMPnNMJmRyb1o7aGBAe3F3dStmNz0+RnszQGVsbU9uCit2Ym9xR0ArI3FHYmVeeHx7UiQrVGI8e293WGRYanB5cnM+fUl7RXMwOX1GbFV6I3QhfilFWWNQYTJFJUYySDRNOWNme2lufDxjOEBlUH4pCit7eCF5P0J5NWV6MyVNZ0R0cShKY3srRlpxRntUTVNyJiVXNERaVCFMe0xLTUhWS1Z0a1dsUGg2MCZvZHdPbDBSVlV0ajJufWt8N05YWCVpCitnbF5+QGl3JmQyY0t6IVVvVW1+QC1aSVFoU3hSJmtTRj19Kl9VM2BwdU5HP2ZLKnVRJG53IWp2NFlAdjdXb3tgUzNFaCg5PnlZYS1YZ2E7CitGOTM4JjV6anBmN1hAfUZXTU5uO3VhPWJtfDBkcV8yN2I+K2dITDxVSDBRYjY2Z3k/UmY/SWAyVStmeTtfTlolVW53ZSNLPT1vRXxiWD5vCis8UXFFNiZObUVoMjVMKSphN3RfSWhETTxCSlJoKUpjKk95MT8jand0V21Laz5UUXkmcEtkanF3cEZQIXBIVUVoJl8oUkQofCp6WXNnfEgjCitkcDVwIzYhQmtrY1V4JkJjY0Bya2kkIS0yJnJXcj5WVjwyOTgjX3lzJT5rbURrfEoyfkJ5ZnFqVkIoTmpaaGEpK3R4NWg/MXVjNy1NSlhYCitmRFBKVyMlI35QMys8cEIzUns5O0o9czRsO2U3QmslMTtqRUIwY0VvWFQrKUZDeyZ9dTZ9TVZCfChfYmU9T2hYUlgzQ1NOfTk+bGVmPmMwCitEMmFuQkZkPkxrbmQ3ZFNPWXZFQCVORUQ1WmRscEdId0QmRDNpaj1ecmw9Q1BiS3g1OHk4VilnKmJkJmorfVA2YER7ZUp4O2VFOUY3eE19CisxMDRNWFJkMXJNaHgkaWFhaFVzdm1zejJGQmtxZUc3cjclWS1rRE5Naz5CeCFaYDs2REN1YkhuPnM1VFRMIXJpc3txUWpCQW1SYnJvUyhXCitGYXJMWUF9MllRZjQkRCFfUnlpYnUkTVlhfnpDI3o0R1BCUWM3PTQwaz5razZQTXVGPyR1aEVBT0NJWXE/YDltTSY/ZVo7NCZBQXg8LXY9Cit2NHRRJWdSMkN2UChQUHR9eStpa2l9d0lMMmlRXnB4PT0kaTlmfWBIP0RuUShzUDw3Z1V3NTZHRitvUH43RExVRkc0JWJkXiZhOHxXKEEkCitodH53dzQyX2R0WlhDMXZgdF4pY2lET1RtYUclTUhSQVYjX2BOUUVQbUFDNjtgY0U5VDdJWD1oaD94Pz1xaGk/eTJeZkx0RkgzR0pTP1A/CistO3gobktEfHxedE5hUHEoJTtiREhYTCU8KHlueHFNY3tCKntPJUlKWXdgUVM4VHc3cjkoUzN3eCowWXlqY35ZR3hePX1aYXNKI2JYY0RKCitMbiM0M3k0Um5jSDh0TXs3VDlQaE5XMjtNcUdqeGZBI09HenNFXns3YEc+UFZRa3xxKTRWKHJkYC1WLShAUC04OEQkfWBYO1pmVCVOXnIoCis8RWlKT0hjNXkzMEIyPmwkYWorTzZOP1JKJlJnKGVZcHAtRWhiN34tfEVnc2Y/JS15Yik2bT5vPHo5aEolZkJHbWohKTlNbmVVSXhkP3ArCitmQzw7K0NaTCthanl8Z2piK1lCIVZuZiotSl5jVGZLQ3olanZjaD41M0Fsdj09RX1aOyZHMUR9UGk7Z3g1cUgyQWdXcTRMVmF6cm9xaXJHCit1ZnFOemUqdVY9KFY9MGtZOHd+djZhSjMrMVp0eC0ldSZ8eUg+dHB3V30pXmg9aVJASEdhblNYe0k4M0FMRTBqSiZ0bGpEeD1DUTFnYE94CitlN3oqIUhTbVFSdjJ1e2BsQEkkZyl5T0pEc0J+dWUyI2U4V21XUXhSYWhjVWNTY2JkSVlBQDc/VTw7eGJPPF9veDtJS1dTbWM9Wm85aCE2CitIUmNEIyhSRn4mR2cqSXVzcTdCNC09ZVhsTSUtfjg0QFJhbUBnRzxSLW5tbjdKNFNaUW5OI2JnPUN9TjNkVUQ/KiFUWis8Vj5zMyk1WGJVCitDI1R1SyslVzJwZ1FBdUNtV0N2PUYyQjxUP012QVVBbSU1NDNOJmElNkN0SF9DU3F0a1l3Sj4yUGRMeGZVR1Jje195VGU9TEh5M0QhPikhCitgfVlgWipqO1ljN2pZKkBQRG9wY2t9cSF1ZDRObXBWSVAwfXtGcW51WlJKdz4xQTwtb2JBZDZ+elNzZm1gdUE/UXJGM01jPz42O1NYS28zCismN2pyPkB3XjZaRVJkfURmIXFEMXErN3N6N2VKMXg5UEE9dWVBQ1c/c2MxNnZpQkJOaiopRz1TczElWl81bnF7ZXd8UCkhYXUmTzFTSn04Cis9YFhnK2tSVVBEckYwV29hK1B5aHNxbTlSTkpMNnFQbypDO2sjJWlDWV5mQlFOTj1mRnQociowRis4fSRWQERsLVJRPntHOytuJnZpUSVZCitFbj0qe0l3OGc8Mm00X1c8Sj4mKFVNP1BSRD5taiEoZGRNRmtvN1E5KXZaMDRgN2tiRSpMSnVrV2h0ZkA4OUslPy1Fa0ZhQVhob0s0KEdwCitRRG4oKFlDTGk7RitQLXF7KSQhVm55Jl8wVGUpP3R0NilDQWhxanRUP21fTEx5flc+emtldzJuKSNuRHcxR3l2Q2VSVGx0azhDVmtYPGo1CitqN3BUcSlMUXA0OUZ3UjdvOSFkR0N5eUxUfjZfX1AoU3NKaEtvPlZAUF5MWTAyN0tpcEg/Nit8NCE2NyRVT0o3Jl4hciE9MDRrTFVAUFFtCitYPDg4dDh+NXpFbEZxJHVVcHhKVHJaMHRoPj5LZ0Y8Yl54cGZVVkcoSE0kdTVER3omVCN+S0VGd0x8VGgoY3Z9JH5KX0okfW0pQDNgT302CitkSHRwS25wRH5USHBzYXlgVjVTcCZMfGdtcCpEUUJSPFFXMnJIYjB7cGpiWGNDYG4tYFlGOD9LTm50bio+IWgwRCNIc3NIMDN4V1ZkQCNLCitxeWR8ejsyZSYzY1ZfMmZ9ciFGT1V1V1E/ZVBMZjNAbEBHTHM7WC0+RFVjMDJLbyROPE50N3M1S0RBfkRERXV1b1BvTWs7TnE5ez5sNXY/Cis1MiE2ZHE1TVQtYmBYYn1hNiRYWX1ZUU1UIXAoOXd6RXJjNEB3PkoqNzY1SnsyZmJjMU12QjYwcSRkV3U5OGpIRX5gS3woXjhzNUIwIzQ9CitvaVBtdGw8MUNHSVdgJj0/WjlYdW9FYGZsQCFVbmB4P29NYVAkRlpNMmVxVD80T2JJIUlfN24+YlhJYTJ5UV4/O3x4KkV+YyQkUCplJFAjCitkYzdqdXZUYUFjdU9ifDlWaGd2WVByXnFPcG1IMll3Wm5mQ2E2Y0dtNnEpbiQpQT4hSCpkdjI/SUFpJGtGNyReNVVqWWloMChxMDVvdTdHCitwcTU2Wkw2JighYVJvYWNBI2BCaEBsQStoLVU+Tyl5ekVRUzdXUFgkQSVhPXZ7SDliZEc+M2c4dER+e0lTPiNnSFZTK3xWK3FgcC08JXghCis9cEVHUzA5aC01WWQ2XmlQUDhGdEAxPkBLMmg/TzNBd1A9RytUMFp8KFF0Rmg8N1pxRlImTnI8VkJgZVNxKjsmZjNiTUNNZTBZO1JaRHEzCitJRitmKmhwdUllVldYbyheJllFaHZ9TUJGVEU0ZWBSSmRDTFNEOSt3SGFxc1dyM0ghTCNLUmBmPGZaM3Y2U2w4TkM/eFEjRmlHMUR3czF4CitYe2BIJWR6K1MjJnFDKGMjS1R6ZDs2dHlhMnIrT2xPeDh5V2JpV2NjbzYoST5xY2lRUHZ4RlMqPkdUUl9mU0xmYDFkLUI1Kz0lVntyciN0Cis3V3wqdGB8IXhEVzVWeihsK0d9bVFEJHtEc0NXPilOTCptN25fKVpUWExoWGRfeWkpITtPIWFFWD80RjlaQU80MkB8ZVlzUyttcVJeXlp8Cis7UmJLKGM3emdsRjc0RkJ5TEBFVEx6WUVGUmB1MUFCNHR5b14kdDtVb0p0KFZydXx+dE5iTGd4aFhpdjReb19xWHhDS2Q0Pi1tfDJIUWI8Cis0RjYoe1I7fHFncHZfVGJwN2M1TEluJFMkTXM7I0FZOVR1Jk4jOEVHezdobFAwSTUkZ21wYD9MNFUxK21pd1ZwbiVnWE5lVT0wal4zJVNmCitfVGVSYnl2M3BYTkVnITJLanFlYHMkcStgfFI4d3pXbHRgWm03aVlzbUZabktwPzgxKzZDSTdWZ2tvelRvT2UqczNkKFkxSlFmNSUwI011CisqYlQ9WHNQJFNANio/VD17Z35AVVRjKmBvdSs2K209TkhBWVF5VWpPZWBPbHxyMElhRWoyTk9hXytPVWhVWkVLQDVtMS1DPzxae3sqLTZ4Cit1QnlKaVhyYTJfeStnJWd5eG48JUgmSFIjYT5aLTd9REliemYzeWs0NDA4fW9sQlYoLUl2YytCI2g1RmFHKiUzQHI+Q354SHlUZ0lqXzJ5CitVY3smczwhRU9kWCkyXj9ZWElTQkxQRmxCIWxeOFRUZ04qSyE+TSVpPV8mX1lee2NPQ21ZJTQoPjhGe29VRD1veDJAPlQ8KTZnK05CRV9eCitAUzdrQyFLVmRlV3E0WjxzcVlPbFppQFBacE97UDYwSlMlUURxMmZIXzxaIWpyYzsxOS1DYTNuVmQ7LVVYO0V2P0FiRkZMcWhMb312QjFXCittNWR8JEc7KXI9ajJyWEJoMWNJekNPTnlUXlRvU05ZQE9qRWd6QjJ8NGBAdU80ZV56I3hnOTVTOGxUeWEqWnZFNSp1QitLcVVxKjhVWC1KCitxO3xGP3d0b21JSXF4PTlfYE57UVl8cCl7bzNfdUhkbD5eQVUmTCtTPiZ4Wkg+IyE2O00zZ2dwYHVrTng1MDJieUF8fk07RnNZN3d6cGEkCit3c0hqMmluakd5aG5UPCtOUHE/LWdNNXZiV0BmMCp0SXA+e2VgUlY2WjdvKDdAbnB8JEdqRyVHWSRAV1g7JGs8PyVjaE1aUDJsV1dYX2AzCitnPkMzWk4wM1U7Xn5rJj9iRGlmISswRV41SCFzU2JsQVlWJS1uODRudl9+WXEtPG1qZVRHcF40bCR+aWVqKkNGM0g+e3grTj99YTk1ZTY1Cisja25kZEVHPTMhR09NPzlieTlob2QqaHNMQlVeUXJuU2E3fkg7PEB1PVRGQTdKZDZ+QDFXTF9vbkR3KV5HeWlSNWZuS2ZrQWwzODJraD1XCitkPCEmUWVHcjhHRSpSdVF4ej0oeiFuT0VvNVctX0NgPShBRitkRlNgKHFeLTY/X0xrVX1FQFRASkg3RmE5U2ZxUHZZSm4rWjBITU54UXsxCisxP0NeKjI8fiE1O3tFbHsmZDgpcmtre1daPyE7Q2tWVzcxPSk4SVRxYytvPDxSeFctMk0peHBHRTBpNXY4fW1DVFpYJWhwRFRwcERDb01nCit9RjglN3V0bFFLeWBLWXZ4RGdoUDxFTSNiMjttJHRzYFJxS3xIfjVmfk5gNjMzM1RjQUJlaT9MfWxISE9nQSMhJFpTSnE4IX16VmJTMUx8CituSnZndmsqT2xua3hhKz5idDlHMFF1PHZAdSNzVHoyUjN5Ujx2Pns1KVA7RGpVa3xvIV8zQUZvPHgyVkIxWThCYExhbm1NeXUpO15zS1ZsCitHQFJ2V0pQSUQ9O0JNNVdGan5ZSzN7T0lyI2tEc1VVbFVyN2JifndPenhhNnE4LUBLIzM7JUlRR2F2KT83emJ4OHlmYm9YdW9RdDg4ZDU4CitDQGljOXRlUmNaVU9Ydll8MTRPT3RBJD12b34xQn0wcTlLTz9ocVdZOStyPm47P0BBNHQkVzVnLXNYQlFTQHtKbytJYVZSQ25DeWd+dlJTCityWGMpcmAwOE0xJGZndzB1UjJSPTNgcVdTO0oteT1IOHN5O2JtbHczMkxKPlBBRTd2KGskTGJ6YjZyJloyX1dtVGktalooWVl1N1RAa0JhCistJG0tVldaODthPG9lY2p3VmhzTjRFSjA3bi1KTkQrPkl5Kjk8T3tlRGtEKU0yb3xWVnZCfClmM21WalkpTUMyQD47UWN7dEgmUkRPUHZ3Cit0O3VUMzBPWjtReG4zXmQ5TnxqakhSVmN0KyZqMDR5WnxtOGZoTnxaZ1NtOTlEIzhkWWEkSmtTMn15fCk/OEBUVzN7RUg9LTlvSDVlPCk1CitRR1BEVUMtTkwwcmVFYmB5KHRjc3NUNTRESWsrZERrUlAmNVczQz1Ja1VVUWsxNUEmQUc/MT94WGlieDR+TDZBfjhRdSVEUyFLSnkraXh1CitsT2lse0xSNXxfPH4oMzErMyFmYWIwM2UjS3FZfWokR2VicVZodU8zKERzcGh0NXFNSWM/N2B7ZVBUSjUlSDdIdlZAPWZiPENQakJsTSM4CitzJF50KSpmP29ROHR5Xk08dlZIUHI1NTY1NFB6Kk1zJHokaCRfbSVCUXpHYyRlIU1UYFBBS3RLfTF6PHJROWs/Y0ZVUTV0cVcrQnx6VUBECitsVGxaV1BKbTV4a1ZoO1JYWGY0YlJ7RWpGKW03Q0BIZCNpY2x7Zygwb34rPUZicWBGVHxLVUx7TX1fUHdraX48c0M8UjBRZTMyIUZoUnhKCit4KngkZXtjVTUjNHoqZmJWcj5hRVRDYlMmRkBrM1ZwUUt8dzBsQm9iZ015PHB2WmpQallnWGlfeV9WLV8tZFNhRC1pPm8wI0FXcTZNVEclCisxemFffGhOfFR+dkJ7eihSJSpMelNTYzQhKGdwITI5PDRqcl5nI2tGI0BzemxfJn5uSXRZZ1YwJSVgRj1ZJUhlZFRnU155dXk9dHJXUj8oCit6c2x4X2FSZ2dQY2pKaSluZ0Uzbkl+MiglPH1FaDNRfi16JXZwMmtEckgwWlUzRnVYZiMwSV94PyQ9OHN0dHRqU3dPOHRUNUZFXlJgJWJ+CitSbyUtS054VmEoI2swdmRAQTx0Rz4zKT5La3p0VUxfMWtBMXY9PjV1NXRUK0RQKHNHZyVCaEk0e2lJekM2aWdeSGZLZFpST0c/PXAhe1ZaCitpemVSPEg7bGtMcTlUYy1kdU4+X1JSMUlPaDt4NkRVTm41SGE5RGFePm0tdHNgJVdEOz9NMm93eU5xOy0qc20zPWtgXlc7dU9jQ3N0NCtQCitpWFNhNWZqRGstNzYoKzAtaWdCSyM+eUU5ZypzKylnb3dEJEU7UWUmMHl2azQjeHRBKEpUUiZ3aUMhdmtlM0pPMDlFdVVzPHUrLTdrdCpxCitXPjRaZH5EIU9jMEg1O2VXVU4jU0c8OSRsfGd8UktBVFEqPk9uKDFjeSQmUDgjTmw7WiFldSFSVmYqcXBnS1owV1FOKXdWODZuaTVLUG5aCitgI1pTQXR6KFhMOGVIbXI2Q2J0JUpDTCpmVHA0bUtCT15oZn4+amBVal9GdURlOT5OP3NLSU13cFJNYEQjcUhRXnlrWj9jWks7cEVkWWpNCisqRG5PfFZPRSViMEcwZ0puVWs7OEMpPFBnUlotbS1ObUxuaz1kcjBwRVUkQ0Q/ZSZeSkIhZntkSGdieDMjR0F0aWBpKWw2KWRTeXw0Unc5Cit1Yz9FK2d0dmFWd0w7e24/bHdUNCE0YT9tY2BWdlVkSWJLUHx9YT8rbGgtJll3P004b042I0o+PVI7ZGxIblptcFpqZHxYTUBYZCp2RFN0Cis8aWxPfW5zOz8kU0U7WXVvN2M9LUY9RFpxbHsmaWI/MWgkSCFtMjlvUjdSVkp4ays9dVZ9K2UqOzRwdDQ5cEdrQT44T2ZzbkQlaz00diZmCitmKzh4dkZOT0U+NzliRlNSK1RHWShvYjhZNnN3M1VhekU2bF9zUkt2JUx+ckJmQDxLVjNxPmk2U1hZZCVeYEVsJit4dklTLVA3V0FDJlZ9CitJPCZVaGFrVVJgYWZ2Q3MxX2l3SVNQO0IzKiF0dTNpa2l7QFE0RDBKR3hfVjM0NSZVbmtwKE50UkcpTn5JKz42XitgcklGV2hIdEZAaShiCitvO0BsRWpJYklId0lxd3oqNV47K316fD95STVGTj1UM2JoentYNkhyd3UkJmUwWGVuVT0pNDhYaHg4c15OJTVqPTt6b20qLVlWaDxDRCRECitETCQlUHB7RzVEKHEqMnlkUkwpUiFufSNAXiYtd3VocmYlcjA7UEM9QjdRV3N0KW0lMyFAcSRGSV49OzBZajxKcWIjbzQ8Ym9xZjUpdU1PCit0QnNCYzJ+fHpGUTd4e2x1MVFKJlduI2MyM1gmfVBLZzQwMypEYSZ8NUNpUnFHV35nK3Y9dndEZVphRXlEZUYtcmIpIS1iNk1EWCRXc3o1CitybEFMYmM7ZFg/bV95RUpidjRMcHRVPmlqdjcpNVlGQ3RFSilSTDJFc2E2dWN2MStIfm0mPFJ7WEVQeE1vaXdjOGhAVDw1eip+aGwtKTBeCitIfF9pdjI2cXhlcGdvSEJlfDxgXjEzZmhBYWMlMHpRVGBHNjh8S3FwYSp0JSRuIzFhYWA7YUgtVDFneXZRJXRqcEhJU34jTVMhdWxOJm0oCitnN21SKWI9eTU8KjMlIyk+SVhLNT1eLSZJS3JOd0Ikaz9VIWJ6MjMkdW1nWDxAb3JoNn1UZUMwPnxybUh7eVJFTWVrUlozel5ueVR3ek9KCit1UXozXjlqcU4hcWl5VzMpOUVhTnw+RTJPQCRkP3VAaCNuPD5tLXJzTik0WCVnQC1HUVY/T2VEOWl6dD99UW1eSVdFazIlUnlsZHdkQHc9CithTFlEZmo8UmVQPUZedDxncWRvMkx6d0I3Kk15bUFjfk98VG1JY0J6U1lgYHppbHREUCg8fXV0M1kmfENkPG9haHhjdEkwVDNFNFgmb1Y/Cis8YWc+JiZ6cHo0WHdGQzwqS0RvQWQzaFQ/VGJ7RSNBdXl6I0k2fGxNcj51T2s/Z2NZWUlTYmlVRi0zTjdMeE9FclBkMTF2QzQ5aHBkM05nCislYlArMGVpOSglWnFHUFhjakhWS2FwI3JgS0AjVVpBYTwtJlJ6KjJUaCNVZEI9P3RoaHRPUVlmdDBmbiYpUioye3VeVkhKQyVNaG9qekxCCitGdEc3eFc4amppNnN4WVgkd25pcVgqMFUwODhiZn5CTGRWdVBvfVJZNGl8cDwzKlAyVHAwU1JPM3xEJjIzPTRFVWEjQG8pdVBUR2NDdTNSCitTb01HIXMtcmR4dj0oeGIoNjNAMHFmaHNzKTJSNnU9PkVkU1hjdktFZnY7YVNQTyshMlchNXRNIT1kYnRPSDtqb2d8fGlpPz4wLUJPY1pXCitWYTRmaW1PeD0wNHJefj05UitKd1ZTTzRfSDw1X2puOTtWKSZNP0I8TUMmQVcqd05feFRjUzlWLWNqb21FNCV6NHh1fj5HQHZfU2kkd2l9CitlbmoqVnc3Y0s9cFRIazNjcjQzfjchbGl5akYwLSZWKUV3MTk+b2lvM0glQ2d6UnFIZmRifT5wV1pNMDZLV1M0UTBpPHtRelkxdzc0PGtDCitzJmxxJFB+Ti1rPXhRQFpUWk9MQjQ3SSVVYyg5Vk0zbHR5OGg9KG99S0ApO2k2U1U4O3ZrWFpMSEo9RV5QP0IkbylTKHxwPEduQisxKj4kCitGZ0lzU3F2JnYwQzU3R1dHdStXPCZqOE9qaT52OXBfLTAoU3FuN3YzOTFoeX5RS0x4P25yN2c8MSRMbF83VEc1Ymcmb0VybituWGojcyN3CitLS0ZjcjglOy10fWU1JVc/Jnd1R00lfHkrT2prWGlOUXlsMDYpUnJibXEjKTx+enl4RXBnQjk2QmZUamBCcT48MyhNbiklOGtHZTtEamEzCitMMX5xYWtVZjJYdGtxRjEmQF9eeXtoKENjPUR1WUU+YFBtazJmQklHY3pqVmgoNk5MVUtBZU9EYVY8QnUkfG8rPVJ0K0BtUmExdFFBen17CitOMCZ9RX1ya25WKnpRU34tdi13RUhANnQhfTteXnVzcndfNDk/fXBBJVpEXlotIS1vYzJqUWlfRWU/dT9pSjZlQGk+UT9uSTQpbSEtY0lJCisyY1g+X2UraEJlPjc+OXZPRCk/JXgySHQhVXQ4aklfKmxnenV0UWluP2tXRUp4Zik3aGVtT1U/IztSZzx6O3JTKj1TQ0lrYXI9X2dUNUtWCit6YG87WT1fSE9DVSpEMCFiI1BvSFFOJVdYSURfIVBFM3BtYGZoeHVgSDU8V3MlOFA3QWVYdDZGcWdBKmJOJEVUdmY4cTVLVUJIIXU4UFlaCisxWEV9RS1QPj9Ee19yN1VOTjBARn1SeTZhTlk5Kj03Jm4jbEAmT2E2KikjNXVpLWNYMlNaYj12Xzx1Z0hkWVRHbFJTRm8kNTRRSjlRT0VwCit1ejgwUDtHd3pnTTFUclF5KDkpMHVaXmZ8dUZVQzQ5eFcqXlkjeHVCKGNaRj9DV2pjMzxFPkxYLWQxeCZTfFBXMiZ8S3hhZiNAKzBZa35ECis5YCkxe2FybHVXc0Y3RyhIU04lZSpuV1M1Q0gmeGlwWWErYU0rcXRaQWJrRn5wcyhxSndqSURmYTlfc0ZCaiYpYTY/LTEqUSFEam0pSjdhCitIKClJQkswJmUqTmxkQmVqTTdUMklLZHQtWllZISNIXlYwMU5BSUdUMWlIYWwtVFlObmFzJlY/UHprRE1gOyt3SDkwMGghMylIcVZ9THA9Cis1cH0xU3J6IT5LKWlRWUZNM1MjLVgrM2FnYmJoQm1LYFB7akhgN2A+TUhyalhwQ01ndGJyemA9dTwzT08jPjBwekAlS2FCLTtVeFVZR3xoCit7fSh6O2xMVCQpbWQ+fWVHUmtOYDFsRDlecSlAWD5DIzs8O2IxX1ZDY08laW03VTZ6Z3xleCtPJnk3SjYxQ0s2O01DdzIxck02elJCNUlfCitXQHhHLUJEOWUkQF91UGhVREVuX2Y7ckIkYDk0RCZGclZJSE9WfGZiWkJ+UD4/Izw1NmIyanVLTzFjc3lyYWc4K0tqdCtGYGVDeFl7bCVhCis/V1pPeCQtOWN4SiYyY0NCNSR9Q0xYQURpVCNnT09PU0FTISE3PlZgNmhVWVdsWHhVaEkqWERiMUk7KmlNdHxxVE95VGc/d1JHKmMlOWozCithc2FnYzBoOWdkQThGVyMrfjI+WnxUZjh6NTUyfnQ0PnU+QCVaUXdaaTB0UiZiKmFGWENFTDZoR1k+cH5EZjVLQXpNQWRfR2chSFdjKzZDCis1V3ZOQU5xcmdFdHMrQy01VlBDM3U9KDhvP19CPy0zail4SlluPXpgbUw+U0FzNENlZ3lwcGg3eWI9RmM4Y3FTV0t7alU8MUtrZl4hNWwxCitQX3cqX1h4b2cxVklFNTFmdkt0MzEkKyFMYT5vdzdye3dfPmpkXlVESVM1RUt0c0B2QWR6NCFLXzxaemZfVmg1NU5zeWNPPmx6WEppK3l3CitRbl92VD9hczM3KUlyQmk4ZztEeTUqPlNXcW1DVUpzazhiJHlHTz9rYmtOLXlpSnNAYlljJmllZGEqR0MxQVpuVFk1Nk1rNCtDN24qZnsjCitqQy0tNCZEMnJtZlNiJlkpbGxpZSY3QWV2aCNzOyF6N1MwQi0yO21aKmxOVUs5IXd7ZEJHZnRtUjMxbT8hPDUmKk1WfHgxUSV+RHc9e1Z7Citxc3ZUU0J4ODVCYSMpQzc2LWhqNDA8P2dPbHVGbyNsM2dJRUluKkBsc1A2RGEzX3RiWmR1UjN7V0dqKWpSM2pycnBsTFVkQERIfnFvMjdsCitrOEhpdklNM1EhYmZtZiprcmE1KUhzSFBVSUwlSGMqciorfG9xNFN0NHZZUUlrKSQ2I0M1PHNmO0NCcjs8eDVySUFPeio9IygkV201PUhVCitMYURhT0FHIVAhWTc1fFd3Mi1EYTU/MU9qN21hREFLX0J6Y2J4Rm8lWHo5UEg9e0AmeyVYb01OOH0yPlQ+OHRqIyprOSVPK0x8ck4tNVBXCithP0thLTJzeDNgbTJkfUx6JUViWldGJUxGJHN4K3NCRTN1elVaTn5UPGdBb2FGRl9tMUdLMGVDMzE+Q3kkQC05TUNaK2I2Q19RayZJNGUlCitKPChibEdObzVOaCE5QytkP2NAbnVeNkpIbTVJRHRBK3pkZ2RRcyt2MmRzKnV7bl8/SVFlYEpmJjhjKCNVRFRpRSZKNUhgJkRmTFY7QzJFCit6TGw2PG1rTzA7MTxvYDFxdWNoPE13cm82KWBvdVA4UTxYTF5CNjMhOCZoVzdOfCE1MG5iJnsqa0VhOGs7eEYkeil9I1BfMVVMeTJ6YEg5CitBJTwjZTA8ayReaUo/KjxRVnZ8S0ZePyQlNFhyeDNrOWJeWk9oNWZsRXtXV2A0ZmJ7QmxLMkE+OUhCcEdVRWJCOHxwY2o/eHpFUWRIOU9gCis1WDhyaSZYViZpb20+JiV1JilDWUVHJWVKTXM1cWYlbU5NOUxofkVWPVQ0ajlOOGJlVjFlTXEjPyE2T041QlJ0alQ0eHErVklUMWArSDl0Cit7JUpnJkVWLUE8NUdeaUdxPyY1JjExQTF5YGhTT0M+Z1NYeSR+IzMpVH1pakQ5aW1LZzFWOGk/e2I7JXZiSXtXRCowUG5qO20tRGB2OGtXCis/I302U1M5ej5tR2lGWlJpezRfVDhiTn1oNChDPkgocGBANjkybWZrcGBzKn1OMlU2PmlNeDAhRiZrIS15VnN5JENFX3ZjeiE5dDNZVENYCitlPSp7QTE4OWQ7a0YhezZ3eyFwSWFkNWtmO0lyb2tzcD12WFZibGxkVXIkIXJieHVYVzsqdjItJXFsaiVsZzJRdD9sKlJoVWQyOVBQdnhjCitvfVRhTE02WEdDUHhiPTFaTkJhSGYjP0Q0QkRRPldLZHNPQ0B0RTxTO1V5QUBkMGB2OWpuK0NpVnQ2a3tLdTNNeEdkX0c1JihLTUE3I3Z5CisrU3ppcGclUjBUeiU7KG1UWTR3Q1E1cyVwdUwkfjQheS02VzVIQnpOT2A7bmxfaWg4UWYjQyhRSXpJbmB0MiolUDVtNHF0dTVrRmsjPkImCispUGUtZkp0PkEhYU9Hbm5qaEAtWSV1S1IyIU1gMko8SUpINllodiV9NyNTSnFndlZEeT1eJnN3QWJ6O0JpdXIzYU4lNzdrTTV8RntPIWFqCis3KUFVZWI9MSFxVU1JbzNvUT5uO00oVnclNXtwWjE+elQ+Wl9fM3V1PEpPMmh5JkRgczZSd0lBKUwoSClHdiVBa2YreFJuV3tfT0FiUGw+CitEay0hQV9EMUQtcVVIMnJePzFNS1NsPylSejMwZHtxTl9WQFckI3t2Sjx6ZHhmTmV7SlpgX1JaR3N6RGJ0cHVLI3wmXnchYmMmXyYjPCZXCitkTnVHfGVpUkohZnZ8Sm9FZ3IxPHgmOV5zbmFeendxS3FGRTRySil1cWNgVGZYQTttOCh7LWRFP0VzWkB2QV94Xzk2RV94a3JZZTZWclQ8Cit9RHc3XnprUjNaciElTXlrZmBCVTd6alZ2dj1SO1UraDB7QFgrQlNNfns4XikkeS1TZH5APkQ+MkpVTHs+PDVQS2IqZ0NAa2RNTHJLLXo2Cit7ZTAhPkZUWTs5e0BhYn1udyE3aHN7UHxPWExqfXVqIXNSU1JaV3tVWn1DNyY3dVF3fndyPG4qcD59VFZKOU87eUBGU2hvazlPKG0tbVFDCismb3t2NTVAa0ZvUWVLZWs0LWFmdjV7c0RuTytUZjdCcH1MZkA8NUtsJDxJXilIT3c3IzYmZEhzV212MWxAT3JBM0puVVNNTGs0Yip8Pyo3CitrQ25fZ0otemZKJURjSy1rNkAoPTQ1OXVYUFVlP1dCMWxkKjlGMmdNSF9rfXp+d1YkJCN0UGY2dX1jbU13KiR7JTs2SEo1d0Roc298SitoCis0Uz9teXVuTzh5NDh1cFI9KHF3NlFPO3ZIIzEpez1BS1Nxa1d4eWxaX3FQaUtiRnxWeCEpWkJ0O0VqMUwtJGJ0V3h4NTVvQylNVldUcWhxCit3QDU2bTxmN0FWb0loXyohJGJxISFrMi0jdnY+QCVJan1ROFFHfmhsTUBVbmhLIXRTeERVKE09TTVTPUt8anRBb3Q+N0dtbkElc3EmVHJECitgRyZBQGhLdkd6ZGBfLTBTR1k7PFFaZykjUWNNfUlAMFQrcmk0OXszMF41ZG87JVFQYEppQjtDRiRyYEl2eHtmWEVOPGlFTD1zJnxOZU5ZCitlTXBHUExKZVE9aW87P0VNbFpyYFJCY1Uhbjk9aTxHSiZXZlNRIUdZZVUzei1ETzY1RXlIK09Qd1phc04hMFIwNyNMPHlOUFUjdzcpPkA1CitGMSFMYXJ1e2kmQGtRe19KPC0xYFhrS0MlbFZgNyV6SlZYXyReV2BmZSU5Y0ZvVzI5aExPKDc8aHd5I0EhUEIjQGFhdWtrMnVWUGZXRTZsCisoIV5WdWJXTilvUkR3UV80RzZ0UFctaDkzaThSISMjbTRpdX1pbHdYUW4zSnd+aG0pd3hMY0RtV141RGZsUWpEMHdVU084SEUrPUI/emI8CitmLUk/YlcrNXNMIU93RU47cEliWjBweyEwKS1JeUhmfjhgd3Z7YmJwJW1BbDZ3M0JKUFJ1M2k7dkAqJVl+TkReRW1EMztLMSRrM2RQK0o8CitlNEwqZ2wkOH5mRlBJfmhvK3MzQ15yJkgoTilMO1I+eXcoPVhSNjJ+b35re0pBVk5QKnBFWHU1RHRCTmBmej5gfW9GTkMrMWJ3YlNhU1N0CisjSHw4NmxlOWFWVCMyQitoTVRYXyhXciNYViRyfnI/UGRfJSNuMzUtak55ISNnJF9NRXFVOElTJGtQZ3pJY3ZGIUU7dis4TnUhSXpZRil1CitZbXEhRT51QSM2al9qZH1VOVRhckZDVFE5IzFIQT1SKW9OVkVjVjNmQGkxTDdoYyFYcTVReithVH1mQV9IUEMmUk1QOXQ8UmFlZ1dTSE01CitQIX5HUyZMTHlxcjlCTXolVUwjaDUpVlU3cmBFP3ZeaG10JEJoJjVpVFFCcFE8K0dzQj8xbCo9cWUxe1d6bGBXbyN4WVZefXNVQEpwbDRPCitQIUxmUFJYU31zVDNaeUwhRFowbj1wQyRsdkgoRVVRUU47N1NVUFBOMlJfakNUQT8rVkNeY15sWl5WanNUdFloKW9DTDBKTil6WTI3YD9eCislUXZKRjM4fXsxJSMza1QyKnBTRTxyb2MoZHkqZCZLO3dST2MjazgqNFNJRjEpWjQzI2BOK0NReEJNUDlXaXd1SHByWGt6c0tAMWA+ZVZACitFTkAmZGV2R3loUEw2SzgoWDs2QDJORl8kJHYkOWdpTXh9O2lpSHNoLXNmPkhUbVk9UjRuP2pENjhRSj5ZTzIxIzFoQ1ZNVkJSZlNEMWQmCitMe19MXmtPQXc7UjFZXnYjUTJAU1EwRjIkUmlWTXM/JjxyYEErWUBGe1N4dz4pP1JMVEMwKDV2N3FAdGtjc159P3A9TUtSaj8lZiZ1eVhqCitIRiZKSmFwYXdUQylJI3ZHK3pGWGN3Pz08I1J8cUtrJnwkKVlhMS1jajYqI0pQSkpHKllqNTxCZUpSWSh1YGZyQG53JU8tN25wcE90SHZgCitxO2htOExMKy1PcVQqVjE4az0taCR3X0NlTzM8alooVWU3PmZ5VzR4WjYjdk5ZO09zbyZvSWRLaUojNHslNCgjb3JXWXRCeig0KzlzUm49Cis+OX5LelQ8cXsoIUd+e1BxN3hvODNVV15WczY/dkpzaVIwMWcyMG5NRG5CRERIJmRVaV5lM1orPXJpPnhgVDl9ZXZDIz5fRF5+WERvdHJ3Cis9Q2VOcFAoY0d5SVY9RT4janVTcE5nISFkeEQoPyYzYm9jY0M/dlo9QEpGRDtRS2RqNVd7WVE0YXg0K2lDelc7dDN8OV5HVXV7WE5hX2RuCiticWUpOzN8e21VRXAkOXZ5OXs9VUd3PU1PVk10RnhBSVhSX2Fval5ufWkmUyFlZXo1VENeeFZMfTgkb2w+Izh1KlZJVFpofDM4KypmV2tFCitHVzVKI0olZk5PeTxxeVhXYGhCcG4rdz5GKWt0PWpxc355bkVObkU8PTYpaFVGUG5hUFJXQ0lySEJCTUB7d3A4YDVgVChZXkJ6ZSZPRW5UCitRMGVHe0NfUkl4QnQ1TD5paDMpO0dlJTxeMmhWPGY5dSVnVSMraWZIVEdafVgzWUoxbyFkNi1ROH5nSWVnM284PC1mTXFyTTtjKWM5Sj1FCitHJCMkMGhNaWElYiZ9WDVOMTZgWCV3PFUpbGpnVDxFZWpYWWt1bnZnYnw3TEteWVVvO1EmUE8/bjNSJVhofDAtSnB5NClDRlVLOEVBK3o7CispNmd4YThKM2w4PUE4eUZZakhLYWByMmRDa1NibCFTXy1yfGFwKmVMfnZoUkB0NURxNkghTVg+Z2pYay0+PClqKWpeLSZ+XjN7MSUpI012Cis1JCFIXnt6I2VLWChvSDVnbyhRbTNqS1F0I1BCVUstc1BJSDE2V1F3ZmUhZjFZanY9YT1lMUVAcUd4IVQqeUd4PG59Jnk0aiNgUGRMNGgwCis5fFc3OW9xNGRPN000N01fYHR1ZT8xT0liPmpEdGhaUDEpSiZTdk1Be2A3XjV7UkJASjwqSW4tbXJ3RWokans1NzRMTmlpSFhHZ3xKSkQ1CitJP2lYWSFheCNeRCsjU01QPnJ3aVVrTjM9biQoPERiVX5IbypffEBNfENpQ1lBI0E9Yzd2SkBXNS0xTF49bGdvSDtTfWFTS2h9UWhoP1Y9CitHRXlVX2pIOEpnZ2B8UXZWRGgjRzwjQmchaHZAdFd7YUVBcEAlcF5ASmJnWVl7MElCIVkoaDZCR3ZrP3RoPSptVENnZiZoaHZ5aDYrJEV3CitKdlNFQnEyNTR1V1czRmZPPyZkaGVrVTE9eSNKV149SytxITlDWTckZXlrWmxVbndscGxhSTUxT3NYbk1neDtaNkw/dCs2QDR5Y2ZQcXxECitoaGxvJExeZXIlam5vK05TX2I1VUdMPjxEMyNzVztxRl5jeCUjR1c5ZU1FcTUzfmIwQ3A4T0dFMGdEeVh5OGNYQlpDVVd5JVJKfkYhP0JRCitHWiNHTm58NSlZTXV6RE5IKnckSThqPHEtWShEMVpTVCk0ejtkZD9TYjk4dUMqNiQpKWxZYWNvWGIpZz0mUlJxWmt3UXNuT1hxNXl9IytHCithdEN5QGMoQnZaR0xEdj02VFVIZ3tyY1JQMVU1dGVwNzBiQCVsVyRWJWcpUTstdztaOXdqZ3xXODZmIXllc2JQT0ROJX5xVEh3RTh9d08yCitHcExPNk1VOVkrSnR3emFJMyUlOWh1RUFIO19JPF9EUzE8Z3stYzUpaFVsZHRjdHpyVXNtO2RJY3hDZldsfFZJPVdFWWliJXVoI1J7ZnVkCis4QjxzP3dTY0htNGIrZEhYIXd9YVc3IThWeWdTe0RYSDxlPlhzXzMwayNfUVB9bCRLNUo7WWNCNVlJNT9UXmpMZSlFQTFjd1ZJIzlzMmM9CiswfDVAVFB0JklzJmpvUndOQXdHJGVmQnlOP2xQR1k/clYjRExlUSZmM1U8NzRIMnA4cSRWYXZXUE9vMDRXcWVxOFNpaSMtfjRjUkpWZXhCCitteG1gX0o/THt8RWR1QFNeVU1fdUZyZVB+UHoreFdZPmd2SSg2S19XMG9ENElEMGohI3w7fiFMZnFTKlFqSyhzY2JmcntoSGhPSnRXNzQ9CitfMDQ9RCFYQXsoU3RJO3taWk43U0FHd1otXjFuaWNzYjR4KiohcnZsalFWQSRhIWJWP3BjaDktNEQ8TVVAdWFoakI2NyllNmZ1NDRCNEQxCitgPHJDe1MjbW5LcjJ7KjVVWCRObm0rQElHPWw3PVV6RDM2R3B6UXkoP0M8NiptNCNBZl99WmhtWlg0RiRkaDhtUWY3U2hOeyhtKzYtVGVSCithe1FjKzhfRDkkXmNwVChNaUxXfVhWPlBGQUVjYVUtJWxscEBfPkllUmRwdjVWPWlBJW5fcysrPGAtMTxPJE12cHtqUXc0b3t+LWtibzFlCitSRGl6TlRNWW4lUmVAJXxeRHxKUWp5ZSpRMEsxPkVDZlhZWilPWkY1aTBvSHxvaERZN0BkbSgxN0tOYWw+P1hSeV9tPT9hVTV4dDc5THRVCis5PyRlVjI0Kys/R3Q4WTtMO0dATHtzS25aaDRoZDQ2UkZjNDRKdTw7YzZJVS0tSlA0Skg5LUBYMFlKKWh6a3NncCohKGhDZz1WeUU4VyNeCitETEJOVmpVR1MlaUt5R24/K0RlRnBYZGVmcUB7R0FmNGM4ZzVkPFExVWlCTWYrcS1pNjFXcW4yfDV3RDV3c3oyQzFecFFCNSkqTjFocDAmCit5R34jc0k3NHY0Qjg1THA9M2F0d2Z7Z18wMnYhZypDUmopP3BQLWxebGkrRUJyakIpRV87N2xVQ20yQVdCTTJiUzVjRVhhMVMqMT5BOWRfCitKIUNgYE9mXmBJfDM2PkhwQ1lWbiFpKG5kb2ZncUQwbTAlUlhQPVoqM1Yxa3xtb2R7Z3pAUXdzRTdsfEglRjl+KUx0UzRBWHUkVyp6ITQhCitnY2Y/eHRYfDZRXk5aVXApIy18ZzYpeFopNTk8LXZHZWJDJjQpZiN8Mld4RVRuS2Z5UXYjSWJMcldiUUVgSiQzS1Q2YEg3KEwhI215YGZRCit5fSt3a0A4d1pEYUBXSm43V3ImZUhuTl5IKDJmJnoqeXFafXBfPE5KfVE+RCNlJnsmNlREbkhzUEVfb3Zhe3RAV097PUJIbSMjO2NwPW1eCitFMyluakxMQiU2TFQ/KlVCaChqI0V5cG5qa3FLSXJ5RnN7R3NUNz5ZfkFQSCNyQF5HeFVhcDdgLWdYTi0rTEdMNkwpZDlHfiRsRnQlbHJICitVVW0hQFVZKGFXSjZgcCVWPm0lWmQzVz0oVnsyNylAOHh+JVNoYGMpZChRfis/XmdHSUlEXzZAPil4azRMKlg2ay1wPkA7aUc2SSFgK3k9CitsX0xOUDJJRFN9N3BjN2FzSjFgcjZkaVU8bGB1RmU4bDlHfkdNbihvUjhqVnMjNiZLVGdGPzsjdG0pVjxkelI1b049cCRCTVVlM1AkYGZHCitPa19IOENOLUNffSNVVH5aYk8rPXNEVSkrTVo/M3EwSWthI2BCdWhiVHxzR1U0eytCNXtYIXVRdTY7YF4ofmRrPyo8PTthRTxyVDU4YEBvCitxVl5mQiR+KkV+WFZLYG5rZXUofWUlelg7KVIzREtnKEp6ZlY0LXN6TG07dnw4IUMyO3VpMU49ck1tTX1EdUJ7ND5lRDdWbmdQRSYxYzJGCitoeEBPKHRCcEwyKX0+LXExfT4wd01oU2E8UylIYnsreWMrTDFfdiU7OCVPLT1KKWg9MU81WDRuWUh1dypZM1o4SDFLfFYkZiMldlBANzVWCispNFM4QmBgU0ZWYnBJaERBcjBsRElgUXN8KT5vdUM2Yj9SOHtaWm84RHQ3LU4zTmF0V3JLKX1GNzAmPUVmT3hNdGFBPFh4Yl5BcUYwSiZjCitkMys2UXhVOTE1UntzJmhMLUN0OUNzSkw4JktnOVZUIT94R2QzVTdwYEB+dkUyIS1jbWZlPFdkJXliKWZVM3Zvajc3VT5KekJ5WG1nRD9nCitHcXRMPER+YmpHMUxsdnRwJTRMQV9rNipILSR4ZU02STtjVmxELVVXJlhjcm1qaGEzRjlkYTNTYy0hUk18cnVtMmdKYH1wezx4VlNpJGtkCitWTmhkRkdqVkppYyhATGlZQ0NaP2xhWEh3cXA8ZSo4R1FhTiZaTCZ2VVdkdll6X1ReOz9gIzZWSyo4JVF2VE9YR1BudVkpX2sqIS19WWkoCit6Yko2dzdue3NJQUxQWiYlWSZhQ1FIJDQ3ZTtiXkR7Y0N8MyZWeUQrbnlIZF5BNEhHNkpzVX47KFN2d0ZEJmhgZWRNcllSPlc2ci0hdSZBCitlWTYxUzdqZ2JtYkBoNUN4Y0ZKZDNPamVedUZqbn5iQzd9RTFDJWglR1BwP1BnZmh+SmE9UTF8VGl2PktWOyZ3Sk9yejFUa2RQMS03OGJeCiskcW9ZT0g0SVZ0MEJfPH1hNWhGJmgoVzZKUiFxZ30+ZSpBYmdWWnNFS202Z1R2XjcySWdGQDVAVV9QUX5ZejRKXjZgPUMoRU95ZVdqe0U2CitYZ2FaVlV9SEJaTXJuR3dYXkVza2NkJW94a0l5cXdFK0tsZGEleWxOdXJ4czlfWWM1dnBvbzNxZWVvY1ZzdlNAMSM1TWpoWlJ7N2NUQkpqCit2UE0/PldtUzc8UGBja3cwPWE/aEkjUkZMTzN5I3RjP2tURk1xSlRFdCNAPV9SJmckcjg0Nz1+QXwwI1J8NCYlXkZkXj4oe1Ntbj5LOXtlCitjN2o8ZSMoeVJUK2UzeSFyNyopb1BHQSRYS2RmVGVlQSUyMU1KOT1Ca2FwQnpob3kqb0BDI0Ngel5iMjtSSE1PRGAjaVZvKXZzaVN5ez1oCitVJUFBN3hYSWJvdDU7Y2RiK3pDWEpvYkhQZTI4YlAye0Rhb0EhRSZtWjw8cU1aJUdZVSVeemVUKz4/I3VnVnxJKmlNYEFodX0lRGFfOVpgCit9XnJ4JjEjcVVEI0g1NU9EOz5TfF81ZnB6cyNoPTFrdjNWNEtEYUMofTsrSXFXcVpJJFZQNWtaQFVxfHR1cVdBYGl6a3VTdU1lJW5+ezM4CitfcTFqWVozO3tRUExEPUdkSmloc2k8ZXhMNCkjZ2xsTE9WZ0t5MkZCSmVwZ0dOM0deWHZPTXRIT3A8MG17Qnw4XzlyPU87MEtYJVhYQi0pCitIPVdQNWQ/I3pZRTNKUTJmM1dLYVMjNFQzMGhEeyMxJVRrSyErKmAyVksoNiVfdnsjbEsoXnBNO05pWVJiN0pZfmE0SV8wMUBMMyFJLXBACit6b0Q5LWswSyFxV0k1SHtGZjtIV3tVciVPPz1qcCNqfCRRVyo9bj5uRmxwbktYITtYfDA7YFN5d3l7VGQqKDdlY3NBcGNtTkxGKjFMTj1TCitXJkZ0Wkh1MlJJLTtkKFFRdjkoTGUrdEU0Sz1EXm97MH1KcEhqMk44OyF+Y0JQRS01fjYjdUY8e3U3a0tsYXhYUnI3KHc1U1ZKbDdxNz0/CitqM1JoY2tfTnltbio5VVdVVi1qYzhpI1dVYUs0LVUlYUJLWEk2dSVlNjUyZzQrREU+SCNVcUpFYVF2NCtwe3wkPTJrPmM7NV89aE98WF5MCitORTZKSTVsS3dGQzZrPldvfUB3LSN9Q24kYmppYShzPFBvbnRxRGdHTjJlPj1yTFglb054bFBvPjlQVH1HRyF1b31ZXj9lcm1jK1lPYFVBCitsRGRafWtvOTdaVipGNWZLdn04WDZYbiteYzdnOV5Lc2dfd1RCdDVEYHRAXmRDKUBoPV5wNSN9SkBAZjNAciU2Qml5QzZIM1dQaEtHZ3IzCitybF9pMGxJYlRAfkc/fDlqNlA2MkA4KTFyfSk2RF9ZKW8tZVVzfnVqRVJkO29+VnYpP1VILTxtUXJ4PEB+RkNOZjVmTnNWYDhGMVcwRF9rCistUUpELURMX3YtSz0pKmQ5fnk/cDtXNWJfVGVvZzZgM29HfnlRbTR0WGx3ZShaUUhiTntiWXk7OzJ7RCRzeiZfcTI+NkQ8emZKM2hwT2pJCitIZUg9TVp7TiZLRXhQZFYta3Vre35rVSlGNGNJX1QmKFZ8N0NTbVhmeklQcDtXOXFJKjBNbHJ4WUpUZmppQ01HVTJ1NS1OcjxscDBRayQlCis2cGg/dk5AaGA2WG5JPCVEbyEyaHdIeTwoWV5lej9kJkRZZkthMWR6KjVyMD1QWHFhdSFyakVOSU9oI1p2aUM7WEVtSmFzQEpoU0tOfDcxCitnP1JZWUpmWFB4Zm4pdG1faj04NE0pPE4xfnp4M1oxT307Vnc9dDBXQ0Y9RiVmWjglMkF5SzVmNFluPj03Q2k3VXQjUDstbT5waiFUWTxqCisrQypDUUBBVFMrXjFpN0E0amBwMTcjMUNSZGpAUHJXPjZjKnZHWUw2RmErQjB8LU4pNyM5O3RqOHh8ej1JXldWWnQ5P1ZGcSVCV2B3PWh1CitfPUpib2A2bm0kM21jP3U+Rm5mMyo2P0pjOXZ4QWFle3dqMjRBTVNlQDJyRD1jcXAtSjQ2RX07YDRFSFluencyPkNePFlYUjc8P1ptfkh5CitmR3IrWX5VfGJsTFczLUpvKHZKfHs8bkhlc3U4cHFtRSU2VmZBMz07NTlxQWo/en1xSCREd15vOXBhJE03cnY0TXh6Pzx7KHE4Z1h0JkAmCitgUmw+YW1HVHV+Iz9zNFEyXkxMMTApX20pIT5kMll5JUF3bkswKWMzY185JmIrUiVqUlo4dlh9RzEqflhjWFoyYz5SJXpyUCo2eDdjUl8/CitvbENiQ1MkM2gwR1VVZTM4QlM+WkAkb3ZTc1lgKkkjRj1TRmFZYiFVckZHQW1xVzFLbUooQTNTWDdLJHpDT1NWP0RfVnlMUm5qMk0tPDt2CitjZFV0LT9NWSkmYXcwNyYkRnRrRHQ3dHVXJWxiWVNBPVp2K2kkPElLbVBjR0V2bn0xZVJAQX4lY2hfMF5DJTU7e3hyfjB5SWVTcTJEKyY8CismXjw+My01YWJHLV5lYHFIYTN7PVdzfj9ad3VxbCpAQUNeWmVxWGhUUFhsNSsmRkZKIXV3RDJCI3JMRTVJKksxZEBrZGhwTmZkdCQjYX5BCis4SCZGYjI2dSlrcWA7Vk9SQTM1ZCFSeW4xRSt5YHslJl9PS3l3LTtLKzRzUEIwXnkhMWtKVVhhNWJhM25OPTtOSlRUZWZfSl9eZkBHcDU0Ciswaj0rPnV8dElKfiMoMGhrUnlZfWNvVk96TyY/Jkh6TmdMVWZpYytXbCRIfHhgaTA8P1ZLZmshJCQrTzIxdz1GTklPQjBIJG5KczxDKlFuCitsendhVU9mSDxwVWt1K0NBUTx4a31abnNncU5TJDZRPUdJNXozPF9gfVVyJkVVfC13UjJsJUpMZkthQEkyaHEzRiR4Tlg1WDZMbnM7czF3Cis1YlFSdVNkSWVibSZDQjZ5OyVocn5FeFN3ZHY4LXFmWnxYVCQpSnZLa25oLT8mMHlNaG9HKyRKPHZmdGBsekpvQ357I2U3PmpUWUdUZCNVCisrUmkybiFlZ1VFWEs4JjEqTDZLRGZ+ZkQ9JikmelFaMFRyWDE1Uj9Ue31hI09TKjhjUipoMH5eYkxZK3xRfipBYT4peTAhUXxlajdhbEtTCitoOz5hMjVEYTFBbXJOc1pLJDNhZkYjZUlmSHhuZygoYD5VNVBVIUZ3YyZMPnh7VClGdTMmcC1jMlc2IXl0ZSl7UEduY3JXKGUqRnJ+T1Y2CitKXmVmc0A5ZC1qO14/Q2Q7KGdNPDZYR2BZIz9VYHE8aDtqZmUqPktYJntnV2JEIz9AQWBoc154dmdic0lUeVdUK29LV2JnUigqSXokSl5KCit1PChgKiF+MGszVnU2UHg8bFYkRlZAZ3p5SlB3UFY7WExmMS1pWUlReS18VnlQcnImbUtLYF50Rm5MaWxUbn5gZ3Q+e3AwRVh7OWgwYG0wCisya0QyR1p8bzR3Z2g0OCZCRitybTZoZFBRJmFPaExwT047X193Rj5LMTZOTTJXan5HYCojT15ncU9ob15VcHUkQUFSJUBDO2EkX0FBVHRDCit6SHMzSnpqKk4/S1lhS3dLWFQtVjIhfVclQmYkTVUjYWFJVGB8blRSdlNySjM2NEBlNkNleHRZK313eC0zbF93YVRuKmY/Sjs8WTd5TFI1CitDcktMfUtkM21BaSsjKF8oZExyR3dpdlA4MSpFcT5DaUBKOTA+UHV5fjtMQGNfeXU3XkpURiE/SzlwY303Xk5xbGg+UE8lWGA8WExtX15ECitIOyM1LXRHZk1nekY2Mzw9IzwoRlMtaTBeSnVud0g7eHxERkgoPiN4X29gcyVCWGUpIT5zPzx1ZEYydUV+MlB3bVpAYTlEdTJlLShke3I7Cit3S3dmV0hFdUs+XmY+MD5FRlBMJE5FK2tRTjA5WERkKmhUZng+SEBPU1h2eHBVYHlzPmQkRzZTRnxXanZZRyR7QHs8M0NyXnF4SUQ3VzJjCituNk1YNlYhJTxkRjxGUjBjYWJqNTE2UG92Pm45eDspXmM/ey17SDB7fll5amB9Uz5hYF9UST5hPDdGeXdQQ05uZzh6KmhII2lNTGc4dV5vCiswPWsyYjBsQCNqZmRsLUxQZD8jUD1iVTZfKFN9an1zRT5YN182WSMpZC12YFlaUk55PzZUJUp9JjxCOXUmYHdaQ3ote3gtb2E7fD05KHNeCistcE05TTdgMygwQWJLYmswXkM2I2V7YExqVmY0Z3p4N2AyczdlK0I8LStxTnhvY1gjKEM4R1pydm0jN2F4MU1vJGVxZys3YD5IQGdLaj1LCitOdXlZQj9Sanh0QWkxN0dqflhhVXxSZjdKMkglYlo2WD1VakpgYkx9Q3t7cjdZM3lfYWElI3Jma3pMLSh6bWNsbnN9MSpiVyR0KnVAOVNNCithQzQtVWA1OTBpYFkhXyZlPGM/RXc2ZV5kMEJAUGpEWG82X3IwfHBnUXBUZl4jcFRBXlU2MlpgNSswYzckYHlIbWhwbHpWTlRFdF9DbTlfCit4QVNnTGNBfndHKkNVPEs/YHNKOXw2YjQ9cz54biV1ej8rOH1MOCtVN0U4QWdhIzQqUG85ISE9PVVZKGVGQGhmcVFSSD1DaWpHZGY1dEorCistOU4zcmY5PW9rciFqKm97WGg3aCN2PX1CU1NKZGZxZyt1Sjs0QVFrTEk+SjdfelpsSGNBPVBQN2tDb1JhejJufmgjfiV1YGRYcVA8U14lCitmMlA3SWEpRTF1RCFGa1deZTt0NDdpeCtrNCozRm1kVkZCNzFgaipEJTBJJVBUemZrYDAkR0N1YT14MSE3I1BpZmZMQnFHNE0tdlReTThvCis9QGAyOVM7NVdJM1h7QlBkOCQhVk9hMmNTVSNnXnRHUnEla15mLU1ZbihlNik8T25ISXhlbkgwKWolK1UhWHAxUjJTdXBjLWRlMWBLbChECiswNGlvezQ5SW1HLTwoWVJ+QUN4XkkpKGJGV1hPSGNkVjV7PTRCJV4qckNsJEVPU1I9ZCp4Nl9AcDVuO0N0fE9McGxeJSEwWF9uQEFxJXlaCisleio4dEJmSzF3ZnckPDIwV3VISVVnYUA1ZFNecnY0cW9yWioxQiNYcHF9O1p9ZHNqcipALTA9fjFHZ15NX0wzTzMjZU9AYkEqNGk8U1JyCitqSz9eQ019NDZFVm13Z2wwX18zczNKdClZYGFORiRRWXdGRVlBfUNlYXRMMlpHJU88O0BUNUB4SWZgZilQSXdHR0MoKXBeWFY5UnVYWUAmCispZCNLIVphe2RALXB6PkZMTUQyZ0NOYWtRO18pfnVgX0BDT14wPzAjWGF8I15fRXVhRDghUUZUWl9Aa2ZQRyRWfF5fcEZ3YE8qRV9fOGVUCitVQF9+JjJZe09LeTkhTlBnYzEqdHV3UGxgRUoqUGNPeCh3OyRzKHdAO0xfNTRJNlF7NTFNdkA/dF5CeGhMeEckXyFKaj5nKUVMSk9XUE1TCisqPDd2Pl5XOEdnfClFNnIhT1pnI1VLKzY5NCpsaUgybU5WZFJmUWdIM3ltaz10fEZGe3dgcUkzU0pCTn10cSZYejJQJHF5M1Y9cFhCQGJ6CitQYFIpTkpnMGp7THdHTTFrWnA1JFVGKXlhS2wpdSRZdD11Y25nXlUmJlMxcWR+O3pTZjFoWjBtdU9mXkc8Pj13aGhNKV5kMChBUENERUJoCiticlBWb1hJYU1Sdjh7M1ooTylTMTl+MmJTOWQpNHErQUh0fFpvcGxrMSR7c0lkKDNPbFooXiolKm9KNEAlbURybyhYZ3A3aF85Y2Y8P0QhCitzaFZBKFU+WFF+X2g0SnxsYHwtSU07b0xNbm9FTjE9YUleNiN7QHZHeTFyND9gTXNIY2h4RXVifC13WGFIZD0+ejItfnwmbjBkS1NpO0h9CitnTmBnbUxVN34/TiExcG5geCttfi04OGFeWiVIY2xyUnM0YnY5Z05CdGQ0TkdKaTdKYE5le3JIQDhxOUhBVTdwNnVFOHR8WWAzYksoZ2RfCitRWlB8SXVlKTQxKmoyU2k1I0RmOUlXZElPSE0pWjBxRCs/Y3xSP3tAe21TT1dfcUpmQnh3VnFKaTROMlNtZmE8QFNzfD4yK2dZekFVZFZlCis+cGRsRlY1RVM9UTZ7JW5QYHx6R3xWSSNyVnxaIzhwO0BCankyeEAwRHN+SSFULWU5dnB+ITIqfFloJmI/WEVAX2R8ejUzKnVVaWU4NnxpCiteNV5BNSF6Vjw4WHdPNmdgWHJAMnViQDZAWDxqSVFET2JtekNtSSRJNGZCWUc2NV52N2RUfHd+PSMjPjFXUS01MDh0P3lzenJ6MW90K3FSCitHMERnMWwmYjg5ZWtkQXhOXjJaO3d7QXxUNXtJbUp0ZTdoLXRlPEhXJTRMMHEwd01AZ1NHN2JNQ0szWHNfakYpQ2VHfmZ8MzI5M3xMMWp+CitMRDxMPypqJlpqLTxvV3xjcGc5aV9lJDxFSUg5SnIhQXE3NClsNzc3fHtgUm1XPjFTWjs0ISNQJUMmKTIpJnYmdEF+JnQtQ1padCZid3tzCitJMXxgdkMoNnBkUj5KWkBuZENGVVReYnJLUC19cHVrR1F6Mzh9Q28hfipBdzZYOSQrQjRENk5JIUc4ciM7R1A7bGhPIylPWWU4SiRtcnU8CitZY35QJV5IcXpJWF4kMjh3Pl9NZkJ0O1l1RHx7RVRoWkA4N0hXKFo7RWt+WGVIQ09PJGZLQUs7Nlp5bl5vRWh3eyFhNmFSUnp9ZXRqSEtrCis8bzNMZitRT2dWfExMY254eyQwaFJLZFNqdVU+dj5YPSZOMXNpe0Bla0JXTCZ4cEV+Ukctd2J7TkohdmlXbzcpdTdobUx5N2NVbjBWMTVzCitMSz9CQURqMXZrU244U2J1XnJ6ck1qRF5UIW1wT3RUZUd+Wks7R2VIOXNGTmBZQnBDems4R1hfI1F7c1VCcFUlSTZnTSYtczteSm4yZX44Cit4PyhZKVZ4KTIyPTlzMTAtUzw1UStnO25YSEwtaypIKE5nKlNBX1N0OEdBQW1iPk1JOS04clBLJUwxTWd2OzFHeEAkZiVicWxFIXMySGdLCitjfCR0M2k5LXpoeWIoeipwfndjPik2aTdjV198TTY4MSNaQERlPTteSmJTbjMlfUJjSjBhXmQrYWV6dmJEZWtjJVdfQTAlJWE2QXVSeSNsCisjKHwzKSZ0QU5APXJeMkcoSmwqMkZCLWlyaWIkXyZ5Vk0pelN6dWZ7UHg+MXNfKis9ZXxZKWptLSh6JnYjdT4jdzIwNH5JckYhdG9fZE9CCitXQGRfVnIrS0J8Q0Q0RiYwWGwmaj14OWdfKSp2dHJnWVBqJHFwZV4pMGBvfD9LfUpIfGZ0RSVkQkxDKWhENUpsK3spNVFXYzMwJSk9Nj9VCit8dihNZkpvPUhoYjA/Pyl2OFhrWkFhWHh3U1dLajxvR25CTypnJTAyZ3tGT0NkJW5lfG9KKW4pQ0p2NDBaN18pOFg5KypGfnpxdE59d2d2Cit0dFVWNDRUajJUfnxveU5xKEBNK1ZnaUZ5REh6YHRMPWV0aGB3O2xkcXQwMiZrazRhJlMxYjF9JSo7Q3RXKzZGZGFrWTxVWVo2fmE/ckAtCitLSUhjZlhBckgkSTBzI05XWG15YUBtPVZaOWt7enpiezZNeCMtKi18K0JvdUc4c3dAN30jZEote0R2OHEoMWlaeipqPEZ+TFhaNTVRT0drCis1UEJaYFVjP3liPSY+d0Y5aU5YX2syRzt6YjtnVXYoVFFtWnJ2KHFLPjErWmtsS2YhQXRmYiskSHZBQS1kZXFTd1pJPWBqV1VORmMldlBsCit8QTlNWFF9N1JEWkx8Wmwwa2pGRWkkMGllemZJfVBhJnZSalFONkYrd1FDb3lEMjJ8KWBGYDw3elA5cEBRbXoyWjdsOUFlRWhwSW15Tlg0Cis3cCEoKi1aLU5JZk14bChBSUxkaz1gY2FmQWB1YDBaSHRfZX1kcnlwa3xOaSZDTUxkKT5tNkxffnckVV8zUDl4bFJrUT1UUWh1LTZVXioyCitJKGdaelgzcFc1UkJ5cmFGcjFUTHM9dnt+WClBeG1Vc1dyQEMoK1BXQ3UoQVIqITYrVDJlSylYYnBmS05+ZD0jeT5iQT1yXkY+SW42TEB0CitvK3o3aDMyeW8kZUVORUI+fjtZUmtqNnliYXR5N2tDSjVWYX1YNm9jYiY9UFRNfWZPIyNGfktaQ3ZxNUJMWGpBXj5tKVVDV20qI35SfWJkCit3Y3U4aW58cW1NZ0ZKcW8mXzN8ZXo3cStQflBaK1h6VWpBMW4/QmIrRDZ2JjFeJWNUTVRVVDAyWWU0K0xZYm90eV5QS0xmNCR1Njtjdl9UCis9cCExQXU/PVp+aThjMDdxZWsoVVVWMklKd3s1dkFmTjxhP0BIKlp4MV57PE9LU0ZadHZpfTBeMClOfjJGTzVBNXo/VD88SyE+djRrTnlMCitGOW1YU0RJIzlOb0gqZTt6eXorfFJYUWQ0VEspMTNzNTRqMk47MkF9S0t6LSgkNGh8MGc3MktgKCttNEkyR0t7VGtiRlZyOXRYUSFeIzBPCittbjU4OGspY25mX2VYaTt6e2BTZ3Z5JD90ZEk0X3Y1eTNJMzw/ZHpMYyl4KSZ8Vm54fj9fTCoyaileYFBrRlAtcDBpcGk2KWIzYlgpcyVICishfCFHeHg7YmNLdGAwT1dtdFpBbTJtJiE4YFBGMFBxJmYtTWU+LWVpdm5jXzZtTG57JThscGtFe1BkK3koeCY+en53NVNsNTMqMUlBOXNGCitYO2NrMk47aHFjQXxfaT1TMTB+OStkVDYpQzFucD1jQkpoS1NweTNxMVBhcXw3cUw+e0B+cXZAJWkyTy1MQH0renBgJERhdDRqeWI+Z0dqCitCcUxhO3R9dzI0Xz1qPUZnWDJnWmBmbXAwZnFmN0UkazlFI208RV5hbFBBfFFYTVFfJF41aXAmZzxoM1J2aS14UmdLWE4jQ2l7bT55OVZqCitvPFhiRzg8XktmIU1ZNzJ5KEByKVdXWWJ3VFUxWVBmWT0rOGFrISo2d3cxWmp5eUIjKEE4eFF2UElMcUx+P2piODt5Xm1sWSFIb3Y8TVo4CiswIShyYFdTWlYmUXVCaVVDJlZ9NldZdU9DZUVlZ3lVVCpvS1g1WE9Pd3VHODtaYytUWWYyVVR9YHswbW1nQjhgZ3JNUX1FaSFgS1dgT0FPCitCVjBheFdZfVliUGZzQ3g0cFRPYDxra2daXytVJmZsb050KXpiR0dXQU8qTmpfZ212aDQodGYkPEg0Q3FXbUlIP0U5N0ZYX3AhNzc5SXxSCiskan5mQCozeGRlJklaSG0mcEk7ZCp1SHhfMkh7MSZsKzJPeTBYX3FTd0VMJHtAVm9Dc0x3cXt7cFFDPTcmPXF2OD0+Y2RlZyRqZFNkMERZCitJX0hPZnkpUnZGWFl8dUVYVTxHbnltKWFVYURlUURgMilzQl55P1VsJntzcDJnYDVJRSp6dF9DKWFlVk08QUpedFl1ZUU3VWAteDZ3bS1gCitzYXshdXlYNDhDT2YtPTl5SlF3KndqeiphJWF+e1l8d2gjMVdQeUh6QWA9QmVeYyh0Km1pK2F6TTJLKnJNeDgze0RhTCl0RTFtbzlGN2YkCitqd09eSVMxYkFofURJUUEjYmxQXmhuKH1aKTktZEVXX1Y5U3J0ND8paXVPeSpiaGQ5cExjNnE+KUxrZXIpbnlBSzJQNDtkSl5WRXAtSE50CitSZHghK0oyKjxkeXNaVj1oVTBQdzNrT0tjMHx1WlA0KzZBRUJkeXRgbUJ+NW5xVT9kekpoI2o/O1dVZDswWTA2S3dVfWlhWk13dmh7bX47CitiSldqPiR6QSp3OU95N1NMbHpFOHR8aHwqM20lTTJPU2dtKFBPTEJLUGRTX3s7fTFTSHFeZlo3ZC0xX3tsdXlRWCs4RyhsfW1pYUZaRlElCitLUEVRZCQ1Ml5rPk1pcVExM2pJe3BYTnleT09gQjJ3OGFCP2dVP34mZnhab0VzP2FaQk8/ZE41eHFxck55ITFRZ2Q0eDtJNWxQcEVIVVdMCis3WlRecmVyY1J4alR+dCZ3IUIrUFE5SSRTSnZjUUEmYj9CUGptR3lubEdoc2F4ezBKUXJiUT5tRnpjZyl9MVRXNmE1STZ7YUpZMSp5WmtUCiteVlUyc0RrRnpVWnpQTj5qI0wwNXp8T3t8Uzh7RF5nTj12U2JkNUlRYjd8TExod0JDcX43ezF+I29lKkhyeEQ9alRlUy1OeS1CSEFNNmA7CitnQjtIKmk1MnomeUd0TCtBfm11Zm4/T0pNIUIwYSNfRUNIVWEkemJjTXpHMnh9U092RilSd3lTMyRpdzU/fkpjX3kzc3t8U25JMFBfT08/CitOQkRAZHIlaEZFI0w2WnBOfClNMDwySDNtKUYtPCtxNFBqbmFyfUR0VnFUSWtLamtqY05EP3Q+aVg/cG5WK0VATGd1JkN2KUpuSFApPmlRCitHZGl+OC0kS1UlVUVNNmdwLXxRfStCfHBrZjVfaSNIbUFKeStHfmw+NE04M1U5P0hDMCoqNkcwUCF7TnE7RC1uTCt4TVFTWVpIeX1xWWJZCiskK1cka3dvO0diLV9NQUMkdlFRNHNKQD1nR190NVdSPl9oKCNVTzsoKDdtPkhFJmd0aUtVLUY7TTlqNytZZkZDbyV0aCV5JDwmUUIxPmx8CiszcU1IeXAkTVF6YyNtZmxib3JxbTdVOzxIOFp7T2I4SGBJUjR6KllUc0ZqdnJxdzlEKGNgOXNlblBkbk56RyNLZzBxcGBse2s2fXN0K2owCitgPystYUlrQzE1UWRgcCFBaWZBQyUyQyVTbkZsXkA7bz1RPCZIYnB6ITAkc1pvNXgzJVJgTntBdGViQkxEUjUrdCp2QyhAZ34oZ0B1SlZXCis1PHImcXRSJmkjRUJFZElgRCE4MyZoJW1HV1M4NSEka1FqZG1CKzY0YWEwV05SekBIQ0VtS0h7TVZ+anVWS3tnI1hKeVdKQGhpckVzPm5YCitNfiltUj0pVClwYkhsbigjJktuREJfKXIyJi1lYm9wVU5NM2xsKlpCeDxzclNNQEw3Q147aDY5WTBATjc/JnVFYDlmYHNOJHtNbzU0PlY1CitIV0BjdU5DdGw3YzgzYFlEVzZ1OSliRT9pTEQ9UGJpPkZNZGFxMnN8Q3tqZyFmSU8rb1dINSErI2BUfkBAIWlVTnA1eWhtaj5VUyM3WERPCit9YUcoWjF8TnVPLXwrMCQ4QjwzfTJoP05IdVclTE5aJkVnZ0Nkdj0zVzcwX3AoJDBeJEp8bG0rXjJecUloT2B9WGI2dkhSMGVpMXQ1IXtgCit7MkpVdz1KT25SQkNfZnk0T208R0Z7MjJPbF9hcHVrTzhfZnp5azJuVzdWYFV+dCErXn1ILWo+SyR4QTk7KVhrdGd+ZWxnVHN6PjB3UENWCis/TyNFPW9VdGc5eFpndFhjcXtKMlc2bkZAal9tUFA2Y3YxKFhqTHs8WmFFcjtUbzNobmdxdDl5dTNXb0goOy0tdmFYMndMUm9gdV52VERMCis5ZWQrMTx9TENeS0dmSFV7PVlGaTZkQ3lhX3V1RXNtTXMlJiNwb05jPUFgSHB8N1BBSWY4P1cjenUrYSV0SHxKSmR4fkJYSURwNVg8R31qCitVbU12UzllUyZ7Q1ohNyl4dmomUU8yN01wdWRId3FKO0o9QCFFSn5UUWUpNHg4ZH40JFJIdiNTSSYtJUIhS0RDe1RMKGthTmB9UCpfWFcjCis3RmUhRlhwJDBUVFl7Pm9xWVpkWkwqSlpVYGFkXmJQaCRNRUlMbXYzQ1RhXiglYHFrZGtxWDNmOWVjO2soRnttIX58PiNrNTVJZDh4SHdzCis1Qn5qO21JIWllOWx8I2tQMGZlT0pfe0dLUWdec1pBZlpqU3FjVk1NVllIUyNNRHFYTmRvPHFhOSp5NDFSciY8eyR+RHE8djdLQnd4UkpQCis5KEtPaUkxQDBYfj1NakpmcE5KXmt2REYod3F0TT19ezdFZUQ+Nm5qflR7YjxifTRUJSF6RGUhSVluKklxO1RXPy0rKUVCaU18LTNHRTJECitEJktiO3smWTI4bHExUTg8SygjJD04dUBhVnk9TD5paVlNJk85KElNU31gWEY/JTtwcWAmTURKa2E0Y2o5UEhLV1FXfV94V0EyNXlBTGYwCitTY0x2YkI2RVh+QkQmVVFOM2xIV25rUVlDQVZVa0cwX05scmh0PzZKTDBkcUUjQUw8RVhrZ15CJGxpODYlLWgjWGJTcjQpJVdMP1pSKS01CitkK1g8KkpWZmJjOzVqVGtYUD0oKjh7cCZaV2FkWXh9QjRpV1E3JG5LRWFGPms9IVh9WjNAJFJwdTwmZXV9OHkhel5eTExTNSg1JE0lV20qCitBSSV2aVJZT14rTjhTS0YldDBnVjs/ZEtOPVRBelhoRWZfNzVteURXM05XYHw/WD9qKjBUYjlJN05rPFpyI3YyRTIjOTkoOzxyOTVRNXhDCit7eSYpc0xTdG10bUdTSl84MHA8bXJaJCtmQnh+Q2hgJmpSemlyeiNBKig2LWFuTnI9PTBiZy1LZWZkTGM4dWs9e0V6VFR7VlJLdGtRVDtDCis8ZDUrUF44fT1nZXdvSnBCSFFAcnItMylwTDBMZG8xZSEyclY/N0NSRzAoPT55PSZMNWRVNWQtSTxFX0pDMTRJUnV6UD9LIyNzZ3p4WjUjCitqcmRHUigpMUdrUm5qS0RiNj5tNmkmN1I/JFItN0R3KTdCZ3FQSWJpXyZSVFAxOGphTEQ7aU5TdUlpeTtndihgaW9zVFFaS0lrVnVEe0NzCitgWip2elR3RE9zNz5gNXw0NWREJWh2PEk/cTZEZnp2IUdSRWNRPG1hUnJkWDNBOzNRRWIoPlJzVTNNVip6Qm9zcClgSHpleHdALXVSPkwlCitNa08pXnpGbktyXipFKnBPJDs3azhgTlhLTFAzSmNebUdBN3srVkZpZSUtJHQ2IWUkdzt+QVF7KGU4M05rWUY8TXNKZ1BoME91YWQ5MFg2CiswMHhKWFIwJnQ4YDMydUtSVVowWFFEb0BpYHRrR0hWemp8Z21nKHUkO3tWeD1eTmJWRXxLZHA/e29MdWdadEZPSE1vekpYbkdJc3FtKmFnCitfXnxrfWg9fU5je2Y3XmlFJnFBez1pVl8wPEhNNj9ubFF+JW5yQWQrbnZJJW1uJlg8Y0opMyFUXkB7VHY+eV87XyQ3YHxJK2deTFR6VnJJCitjJWd5Xj8/QDtmZC1qbG8rY3JXdlEkOXM/V1ZlZ0NIS1kzU3NKTlB7NCk2VkJIQUFnQDxwSiNudUAlaEIobVFQYihqYzx6WTFtOCkldndjCitfa2UmfkN9eDN5bmF6alZKPntWd3t8YGFTMnIhVCpyfF94X14tSXN+YyV5I2Z+cD9oTT0pY3B8Vn0oOEVGZ0t+WF5vTENIWm1LP09sMkw1CitxVDMzKSZJJVd6ZX54Pkw1Rjk1QTlSaDN+aXFGTWVTJFcoUzIyKyg/VSg1WWVMdEJMWDV6fGo9eUcqcmN5SzdeQUZGPFVTRH5+YFEtVCZgCitPTm91Kj1NIVMrZGlOQT9EOUZ9Xk4/PngtKV9GaXpOeCt3M0FjO0Jtd2tXcnQ/fDk+PiomfHE/P0ohemVybXJTZSFjeUN7WCthQXtvPyNhCitfPkpgJkAwYUJfKnt8NW8/RHZ4MlFvblY2QEIzfT4rdjwxQkAxJFIpLXh+b1owOyZUWjNZOzNhRztrWUh6eW49XjApdHxMbDdod3JXZHtgCisjeyRCPEM3Xz4pd01FamsjUSpoVHtPfFZ+WmUoLWFfOC1oT3p3aE1WQUJyaGJrQDZmKVBlZHFOM3VDRyZRdDU5ZT5GYVVKWSNBIXhvbVRUCis1JXs7amNTZSU0ZkxaZm4kQEZMKkJWVDxgZ2JYU3dINSYob2V+aUFyYSRock4xd15gcUp2PUI0K1Y9cnpyMmxoPH55M3RwR0tuc2A2cDlwCitIVkU+VzZ6cmBIYjtOX2M4Z0hlSFFzRl9jYFdzI14qUG0/IU11XiYtcmZrSkA1T0FaPyo1RWUqS0JzJCRwPnU/ZXNoMCpWK0Z1fERwYnd7CitgMzZiXlooQk9ze2JQYVZGQ1JFQ0l2aGJGZ3N2dCEwdiNmMG5HIzNQYHcyUEp7MzRGYTktZGBNRSU9PUJ8JlMwSl90RzwpSj5iSSZEVCFYCitLQnMqe3lIV2VHX0ZMX0Y/SH00ISFSPjw4IVFSMTEhN2x8QDF2ZStVamVSZU5VSkdTSFZURF8oM3A5bkE9UVhjczA+T0ZTQ0VndTxWdHRQCitJJmhjQzE3ZklOQjtlVyNhLUdENnROcjVpfT9nX2pTN19Zc2t0PGlvSUpTeWF3a1FFYFV1Uz8mQGAhYURrMU1YJUdfNE1gSD1pUzA1ei1OCitSe2h+RW5WTzlHWSF5ZEpQNztIYGpuMUt0bX43O3I3MWJ6clorPGlJKEJaRyhtY2pTNGFaRWVrcUM5Q2xRRExoQkl7TUQ7USlXTlhPWWtmCitSfCNnIX4teFVnLUFGSilzOWVrQXxLQXpFNFlhNnJxWEhxLWhwdFBISFl7ZSQpSn0+RkJCVTREJWV8SW4/dGgmb3N8V1Bvdzl2cDBoamBkCitjTnJTbiYpYiZ4NlBoQUpyOCZ1XlplRzZkJCNja0BfTlJybkErQlF1Z3paanowUHx6XlBjN1hydVh+YW1FT08yMmw/b0g1YDlNY2pQdUZ4CiskQE1BbG5KKCg/VXBfQlU/WEM2TT08fGAhSHNhO0lKX281VHp3IUNiPU8tVHItPUBCO2Q+YF9DI0o4KWoyZW13Wi16ZVdGZUZ5dEs8QD0wCitwdkcyPmlBTnpqbWQmJjAoQHAlKkNhOzt5dS0kMV9ffDB3fUsxbCROezhgdlctQ0A/bH5lJkQqbThOc1c5UFh7fU1iUGVlaDUpcU9TR0N3Cis0Kz8rRFBHJVVDJVhkbz4zJS0pc0tSd0RONHtJcDZhYTt5fE88YjZ6aWRlZUNzJVNHODl5UVFfajwjPUVgdVc4VEJQJDlTaUN6dzVvaGAhCitaMmY8TmIlWHFmYi1uQzhxZXlAUntTfExZVmdVXzROKCRlYjt3YD88YztXYH5GMWp1LWRuIVV6JVUwVSFJQDRlfURmV3s9QHkje2o+WkZ7CitiJjJuX2tZb1VzczlgUD4tO3pTWn08UDRgaT5MKz1scDsyPy18ZjlVe3RgRUFicnJwcG8qWTlMQzFvY1h9ZjV7d0pXdWUhVFI3fkElITdkCitoZVFKWlZvNUxCUyN5UWprKVAqZXN1Z2MpRj1ieFAtayNvcnoyfHJAQF95M2lYUCp8blVjTjgtelVUWDtAOHk2VzB1OTxOKzg/eHohOVJ4CitKYWA8JT1LUzdoRThMM0l1ak1JJFFPd3tDUHdyRi1+elNaMilfPEpVTVIoaSZIPCRDPyNyU3xzc2UkKGVlcEk/MUFeQDhudSl4TUFXamA3CitYIyZHKCY4WH17JXJmY2x6MXpnVEsoLX1yVSRVKnh+dXpndkszS3R3PHl3WG1ySEdYaD5GNG19V1hKbTdTfGdAOCl8SHZgbXgoYlVlZTEzCit3T0k4WjxhKU87OUBaZWwzSDAxX3VWYDEtfWAqSH4zUHBIKnN0Q3pNZyUqPktoSlBTNGR9ZFJCTyg4e19ncFJSfWJIYmVzQjAhYG5MYDY0CiteUmkwc3JQeEYrVGczZiVjLXY0NEVga2VWRFJfQmp2PThUTHFhQm0lblNLOCNIc0hpZVNgWHJANEw5fl4xY1c5cDZZd0NafS1yRVAoJGRGCismXkpPNEJLYEZ1MyZ1MW1PX2IocyYxdWJiRGdnJmltMWhmMlNJPEJ5aVJyfW1iQlI5fGRNQF5TKj5rRHEzZVFXUFMzUiRMKV9CJT5qYGhtCismbm9CKE18Rnc3aUVLVVNyN35nfTRETjxZIUd6VGVDcXpJVHxjVkBHQCZPUzRuIVhpYilBUWxsKVkhTml6QXQkSURjdHprMk5mOUFNaVU8CitkbkIxT095S19YbW5MVyhPQzRtP29kaVlwPTx4PCFoQkRYeGclbkBncGlWVkA1JEBCRGUqLUBgT0JaRjA+JWBeYks9NFc4bUBwNWEtcGJDCitafF97K2MmPWk/P30pOX11fWU8aTYoYStZanlVX1BLMzRScC02KT5iNF5lWGVXLXVYQXVhS1NhU25FO21jaV9Ucnl6MUlfdjlmZ1dZMTEtCitENTgoJEtKQWNSUDc3PCFHNSFBezNiY248IytqR15RcmtLX3IhaT96cUVKa0h9KWUoeUwheGNgOFJJU0N7WnQkamZ6cERaZUZnVURjV0xSCitedSQxbnNQP2ZxcDxGcl83aCk+clZqJmBLJSNGS0FIfD1JISkxPzY+dDItYEtVSW1tQDhMIX5neW9UNUZgcmFvbUBVKz0jbz40dWNufGV2CisjKHAmbWFLYylTPSlGWj9hNzxzRGc4K0VFWUhZU0Z+UVlfRFdxREdldXVBWUJpKThjRVpiTVVQeVckVUtadmY1VU1RbVNrOXRVaEpjJj5DCis1UjI7OFlWYkxZZyVne3ZXZ0N9TFBnOTA/P2UkIVlSWm1YZ1ZZMTBhdChEND5XRTkteGQwZHtqfXhDYnNZIyt0QClKZHVYN0U3UHshNmp7CiskfWw7U2ZnezxDeHJkZj5WNk04QnRfezNqfjtBaEIrPj1mRj5ne0RyMGg4IyRgZSNXbEUtSE1yTmZoUDNjSTtKUTFmTGB8Xjt1ZG5OLUpRCit3ZnorRFYwX2tyS15HfXN1RT5vU3loeTtzO1drKnh2aDNvVUcxcmNZTns2YndXSSNPTHhjKHlEcGFVWXE1am9oUCloPkA2YVdBSzJtdGV5Cis3RHNHcXkkbl5qMDAwMWYwUlM1UzAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFEreUclalUkVyNxakpjdlJJREZuVDdGTmhVQU9BUGZXCiskaTc7cTFLQkI+ekk3SHtiakdVMWZpNGA8ZVAmNjIrcHdlKGd2NFNMP093RipKN0YldCNQZ2A1SFJxTFp3VU1pVWNeNTdacDYraV9RO1MyCit7Zl8oJiFeYV8oQWRwUDdWTCt3YjEqLXRXOEwmcXJwPyszJnNmK1V2RX4rN3JCR3huTENwQXN6azxMbDlPOXtHVWhvQEJiMztIKXpjMkxCCitoWVlIbE1yRjY0LXExXnRuRz9TZ0BleHs8fn1MeFZOQ3tqe0VNclVuI2lydTdhQS1lRlo8aHVmUkwpIyk1bkFwTDVxR2QzbzZgdnlGNUFfCis+YnJBR1Mrbl58R0huRiopPDJnQUchMVh1N35PU3pBaWdgLV9rVzd6VU0hN2JKdUp0eVN9VE8oKGZfTC0pNFVRaGB4WEw8RXB2WC1rSFc7Cis7Uys+OEtnJHJGXzttMSRXTGxSblI+KD1xN0tBUEVALWp+PUVyYnNUMlo9PjZwVklgdmg5NSV6eDNJQFRLeiFsJEc9UWg0RT9GdTBiP1c7CitHa0hXLVVpIWMhJTdGZE04Uj4xZGNpKHQ8bFBAdXlpJSl0U0NBcVojeCpPZUxZWjt2MX1xQDZrWTY2TE4lM1ZjdTRXRFdARG9fPURQMHZPCitGREhGTkd6P2h1NGVDLTYzZkFIZClDNlUld3Z8MFRTYlAreTdfVlpjTS0raXAzelQ7bkFSY3RNJlkldkgjUkAzVClTPWVlWTJWTkRmMDZICitFWCQhVmxyUUBPMCh3bnR3a095YTx1R2dSaDB+KF5KWSNJeHs1eCYtQG98NThXR0pBTndPV0kpYWhPYE43RTQwPWUjPjRBN0lBP1MmeTBLCitgdlAqTjl0WTBrUD1gVVJ3Rz5mKGFISlY9cDtqcTIzKkIqI09vXjF6UH5+Y3dBbmRPQ2hDUT5zNjFQYUkkdHtvaUdLcDVUN35PaUlHMWt+CitnaVh6eEhwIThoRjFzOTJUI2xQJV48VitCVHs7Zj5WTWs8a3hNV3Y9d0ZqYjtqKjBKZl8qdUpsWlhSfnFDV2psOShhZUBmPCtleX1pKG1CCithQEViOUk1ZnR7ODluKDh4cm5wTEYpLTFEYCg3KEVfO1B6KGYkQVNJaSVhTyZkZipJMHVYQCshQGJoRkczTGNnOD5pd0J+JUF7Wm8kYj9ACitjU2JUbkEoRTc9PX0rKlBkWXdGYHA4SGlhN0AmakNmbUN1M1NpcEpCKWglRF4xY08xNWhTTGxIe0JWbDhJfmUrWDF7TnpyJFlMOXd0UWlTCitqWEROaEFBNj5tN25+ei1vKEs3S3djJXR4Tn1hX31PTnlOfkNYQGIhWnkzLUg4KCYxTE4zKGVHSjhuaGhLclZzfDxoOWFvS3Rfe3dNJSk0CitRJGtPd294bX47PU13YkspYTVIcD8rNj91ZDNPcm1vQHZATSp1YkxgJDFUSzNwVjt3PW5aQkViRE9TMUJGdkk/aWNpSX51YTNoZ3BtJitRCitDI31TdHN+dmxweTJwQSZlSn0jOzhVUmV1a31tQUhYdng5NHVXPkhAejI9I3tDZz1ET1BJS2BmZitoNGU9IUQqQ3B8fFUhR21ESSVgOyhmCitIO3RFPzFXTEhhTlJ3WC1Gdj5Pcl5leHFCMT48ZmJOT1cxT0JycHgxSj4tX0IyUWFAVj1qfU9hIV9Kd3IyYmVsOXdubU93Zi0xNWs1cl82Citjez1NfGZ3VnxBUiszZlBJJUBMan5uMEUzYVYxPXZRSmVGUVpNKWo2JkxLK18qWFM9SmVENENOWm1BVXZ5eTRBSnszQjNMRUl1THs1fjU4Cit7YDR1bl9qb1N1RjNMZklaPU0jYV49QWFQOTwzeClQZypRaWFWWDRsWmAoJnliX0BVQTNeZVlBdis2dTUqfjElZU1mQVNoQnNPLUVlTiVnCitwPjVga3liNm8xXl4hYjRKdVk9KGFUMktZS0hSfUM8SklTeE5mbmwwKmkkKlhAQld5Q0c3eT5fdXtaPj1OJlZReD9xPTNKZ35XQkdscH5jCitDY15uUEQ5WU5qLWxLKzV2Sz0/YDBAJjRhd1AlM0R1aikxbzFBdygpRjc0Y19zbHA1ZG0tYnU0KVRyfCVVaW9kUHl5fC0+WSZie29MVHkrCittIzB4I28zO2hOUWVNZzE5K2VuMnZ1dXVncl5rLWhFPHx3fTl5I1JAO2FYemlTbWp3JVV6SEs5NGBOe3ltUWJ2ZEBAV0U2ODcjPG14dFc/CisweVZnV3UxMTs5ZEIlI3dCKGRJMlhvQ0Rmc0ZXKnBiTTc1ZDRCZSFRQFhiN2VOJlJTRUYkTW4tPkNZPU5TTVNkO31edmttOUg9M31NMDBTCiswWXNGeUd8cGJYU0dwJTthcXJeTVM4QVZpPUdLPjkwYiRPQE08OFI8I25hYTR4TDswdzZ3JTNPTVAzI2IwMmgjU2FjalFQJGEzOU9oIUV4CiteXnMjeFZvJVZ1fD1vIz42emsrdCtMdmZGMFI7eXo8TDEpWiVNWnxUNVgzNzZ2XyVqRmFCJmxFYyY9V2JaKGtITH1LcllFODRVPmF8dHlECitgUEtEbGxETlZyUjcyUz4wP3tqTW1zb14lYTcmaTdgYEwkSHclJX1GdypmbVYqRHRtUnRSc3tJZys3TnpTdmA7QE07fmBwcX5UVktPdGA3CitWd3RUY2pzTCk9O1MjRShALXg0M1ZodWBrU1JhNFVtcn40MnwtSkpgRSpPdWllVnJeTnJrfVZyQysxKnoybTJMJGpoeCViJEBrXmx6dGheCitLfGRtNjY5Q0dgez80WHxkSSM7VypuTEdaR3prQD5EZDZYOVFMMlJMc2JRYW0wenVTI0kkTmw+e3VxQWQye3pWY0w7REszdSFMP2o1TD02CismcilJUnVEbzgzMGpUNzd7fUhzP3thSklHVnVWSTQ5PjhYaDBXRCRRQU1tY35+SXt4Vj4yQ1QmazAyKjRkbUdRMEtlcyk2e3smcDhXYG4mCis5S2heUHU3ZWpPMHgka2B7bVZUMysmMjgpbiUxLTx2ZWtQWStyM2g4djhQfTZCLUl0WlRwZUUyMyZUYUJkfFZ0Myk+UDVXMUdrSmFnWVVJCiswRGc2eXl9RTNjNUU9KT5AQHk5ayg2eWZyQEZLe15iI3A8WEdANTs/JFBOMj42SW5RaXZ2fTgrV2hXNzQ5VUBHd3N+UU59VVI8WGBQLUJ8CitMWWticyRZdElLViZyRUJFdzMwQEArSExAIV9Pb05yaW5RdSlVWHxII3hvMkEtRHEkK1Rge2BYYSs1Xl5ER050ZE42bk9QVlhXQkNYZDktCit1V1hsR3JrbksrajRoKSkzd3Y+REpfMDhwWWQwRURfWTVZM3laQXlrMUp6YkNWO2Z5ZiswbWladXY8a31HU1RlVyZYKkc7JD1ma3RjZGpgCis1ZSZ6dl5tbk9nK2d6dk82ITlaNHA5KTx5ZyM3LTRpcDZQfTtaNmE7KTdFelprZ2wwMiQoRCt7NGZ1Tklid05lNlhTPHZHX18zTm8+NndaCitXb193Z2hkPiM/YVQrLUJAOUY4LVZLaT5qZDQmMDFTKyRnJHx4VmhPU1FNYExqSlp6PmwoXndKeiNxVVp0Z3RvKlZJTm5RdVZiXkB7LVY0CitPLShmbUBXflo4TDR4Xj81UU9FK09CKGV0QVNVXk1ATmkhTCZSe0glSyM8bEQjYzQmeFJmJFkmSHQ/bGxXUzc5ZkhmezNVaCQ1SnVIRyomCitfdm1HI3hrVyg4RGVYWVQrQktne0whKHNDXj5uPj8hRXA8dl8qKj5KKTVpODwhSWBvflhlVGspejt9elc2eWgrY2hifmg9NVdpPHhkIWgqCitadlllKSNDJVBpSmgoZz1KTFNtbCt9Wi1CKlFtZStCUE1MXkNldzlxfm51S2l7PjBSO0hyZFpNdGB6JnJIRFRUaE18PSlIJTtPXj89YCZqCitBUlBOMG1XPjs/JC1PQ2sjP0B3Q2l3YTBoY0ZZTkFXUCgjemBfTFBGP05ZXldmc08jSlIpbXZncXJEcDxNdyhMem9uM1FebypTSk9AfHg2CitWU2dfOFRkNEExb29UZmZJYDRxYTA8VGxuOV93S3h2MCRjM3p0UHUySF8maTd7ZmAweyp0ek83JW44UHAhUkMmUUQhYXJTPXl5Z084YWRwCis1cVRMKHZuMU1ia3JzcH5uOyhkNkdsdjFReSo8JCl0VSpaKWRkeXNqJUJYSTBIO2FMMHh2R3R9YypPUCQ2d3poXjhJbUttZG9STklHPV5OCishM0lOQigkbXFxR2NANTkzRmYlaChqenI5UmZhSGw/UiFFRXR3YTk3eyRrajJzWTswN3JmUDs7TCF1bWVzdzsqI3M4RENWa2Bhem5DSUA+CitSPmZhS1JHI31ZUjZ2b1VeXy1YemEhdU1EdUU3UWNHTFA7JWgyUHE3OFYrZH48eFhARSRFLSlPfHZ7WUhEfTljWWkxaTF6Sn1AcSRvV0UmCislQCM2cjErOXU+fGRaNmo/fkxpb1hmc3FscFcrZTlecE85SUFVcSZEOCo7ZWBueHg9WXk5Y2c7QEYwS2pgMHVhP3YpcT1ZU2tMMF5EZVc5CitFKUVRNEdlWkA+Jl5wYHd0OE5eWG0lWilOKmN0aXZOMyoxR3RodSFBM04zRnAtWUNTRl5CZmNsV1NhO3N4aF5oJUsjd1BxflE9WSlMYTM+Cis4QmZEJGQrLThyXi1yS3koU2B3ST5XUUI7cG1AbzZscGJUbiZ8RXEraHUhOWh0ODROXz1zUHxQR3FGUXN7UWY1REQrcmpDVFJLPlF3VGJ6CitTdyRPTH1vPSRtR3FkWUZ3eWF7d1coJl5OTHJKJU1JYFhpSU97QSFnWlhscEphM0FOT2VuRzBzemJhUDVTcU1hRUp1KX1nQmZPNjc/QW5PCitleCFUVXl6T217ODd7emU5MjZGWTw5PyRHJn5IWTcjeUxQTF5oeTlmYzJsKzE2eFo1RUt+d19RWCshaUYqazxXMDVCQGJgUWRhSk1+aGZ2CitvbCFpWCpeVU8xN2lFa2JmYXBSR3tFPDB9M1Z7ZTk4fStzYCU+ZW8rPGdjQnlpfFRoTD1ycT1eNF4wRyt1YU54VT1RKEYwc0I2dmR2UGBZCitDeTUyJTU4ekYya3BMYXdeQVdDcGxJbEtmOGBZP2VlWXZpMGA3TTR1Pi1gVmZkXzN2eDtqXlRAZHdiezFyT1JLKSlJaklIJi1zd1dKQE9JCitFJTJnPDdfZkg5TVEhbXZRI0h1PHY2JGJqKXkodylTUEVibz9nSjB4TlVYYG56TDl6az4jJCtnZClmRT9vLVN8RUgrbldjeCkxb29EYz9aCit6dk9EKFJ7bThRTnBpN19HOVNDVmFfalhVZmVKJDFfdDVPcSZHN29sRGtyc2N6S3dXWEdDU1N5cERgezlyUm5NMGkycTNidCo+QUp9bE8+CisyQyZ6eUAoMzF0cSZjTyZnYWZhaiRFe3o0JXYtUHA1bTY7V0Q9VWphcWJZNTRfbShJKV9aUCN9QjBpeD1gVmhrbjQlVEhfPCh0elhWdjAzCiszMnJlanFadGZPQU1jSX4tJmhAVyVsQTQzVDl2QkZuOWE2fVVRfnVgPCR1PjtQKjVDQXRYdmV0dktZZ0clNjB6bSNNRjtNJlV4SHY9R2kwCitSS2Q3YSs3dkY+WnFLeHtwSmB4d3UwdEVEQ2E+K0RhI0Q+cTV6dSUrPlJJPj4xaU4wMEpqWEh3JH4oc09ze3ptaDgrRipKU3QhZ3ZPTiYtCit6Jnp4Rjgqdyl2NE1OcWQ4PTZuQF9rOFYkQlFANT87MVJHaHpNQio0Nm5fc3k9ZVRCVGNZdmE/eW45TiVNLTJaPTs4TXdqNlpuYzxzMyFXCis5QHA0ck0/ZlBDQEFacSYrQEN4PHdHNGowYW00NTVjSFh2dU8xM0ErTiFeNFk2KkJENHV3KT56Xl9vVUxMcTRDKHROTm1Ma2dkUH5ITm98CitxUmBtTVEqLUJNfC1HRE4kK2YyX01lbm8ra0h1d2dJNmt5SzFUQnsjQDZrO1gpZCZ7bk1rRmM2cCpgdl9vYnkjZlJhT3VRVlgwYXl3WTd4Cit5dFQmdVcwQm9vTTFwRyNRSTRjMj5MRkxNUkNNUi0oIVZad25wM0IzPVpkQyQ0QjBTRVM0T2Q4REhUSyh6SXM1PkBQRkZ+ZlEzeVFxKT0jCitCQWFVJFBpYj0jMSRMSSNnYV89JXpCaGJAX3trdVl4anQkSXJhP1Y+djBTOHJNLUpPeWdZMGQwIyRwS3FebmhTNUhUZFMye2NAYl82clpyCitHdSpnbkpHKEt6cndQcklxM29pQ2NHZU9mMUpCRzJwdGc8IXozQShyZDUtUVR0MT1NfiZrdihYdjl2fTZiaHA9VHVaMEMqbE8xfD9aRTFFCitXJX4mcjNGTFBVSzRnO0o9dkd3cnw3Kl9yRU1UZk9AZ09hMCstdlglRC1EREIjVWxzVFdMenlMcTsodmpjcUs2JHBifS0xa3ZwI0oxJE5GCityTmBzSjlaRVdJbEA/QCo9Rz9YXkt+aTw3ZlIpN3F+UTFiMGhsOVFNeiklR1MyekFYO2U8djZ7bUBsaz9HZHQ0fkpiJSFnMTxkK0hqWkM9CitET057dn5NdnNPc1NFJEB6OUEyTWRGYSRyNmZ7Sj9zTFdXZl5NYHU3bHBHPVgzP3lFJFdHU3VNb193SFhwWnwwdW4zaXdATT1STUN3Z2A7Cit5YCsxUHMmeVVIanE8V202dXd1WXg4S3FecFY8eDFhNVl+eUckNHYtYCVTcWlPYTJ+XmtkM3deT0ZLT05rQ0cqIzFnPW0qcDMmfmtWQmk5CitZOD4wV044UiZ2JClPMDhRNF5MPm1pNzt6OXFjJWVaZkhKajZ6WjlgPUtKYipKKE1rfVVtV3ZCWnEzKDZPNU0jQ1doaXt3bHxob1lgaXR6CitFJSt8PisxUWt+TGFXUGhFQ0Y8PElubD58TkRDP3M+IXhZdSNxWkx2PyVZLVNmNFh7QmIwVjEoWjlCfVVtUDxidmwxKG83bEtLaEhweU9lCitEOHM3MH08TjdGKXxYYnc8PG1VfiQ8YHc7aSNSfHUkMWR8SG1gU3UrUkokJGolNCl2Ym9QVXhzUXxePkA/P05eZWY5ZXI+bXV1UFJxKlRfCituektXQz9Be0hHSH4xeV9EcWRxZ054PUpZPDdyXmRUfnZUOE8rUlRidUE1KCRLMHhMOU5PY18ofk9ASDE3ZDgwRj8oIWMmUFM5UEhHKDJ6CiskMXxIXkkja3ZCfTJVPFUobWE+dkUzI3tUd3g/Sjtzcj8zS09CRyZXPFNfUEB5ZyZXWHdhfS14V2gwJkU3XyUmJTJsPT4/STVHbEYjTkt7Cis+UHFxMEMtbFh0OUpGcWYkQCF0cWwzblViV1VxckIkU1FqcDU0Nk9tbnhSUkxIaz9jO3B8TldEWWFtNldmJkEkTSo9RSgqTGB4az40RkspCithVEFARSNHOzlfZmlBQ2A9TVNDcSh2Pk9gSyk8Z2Z4d1RGaWdKaE5BZyFpK0twOGkweWNrcW97TFdFMVRyRkZoQVJZdVhFdyY5YkRnPVJzCitOUk5zcE8/MjBpVkZYZDJrSE1SfXhUV1d0SmxEV1k2cmB9SlZaT2RfYDUzYFBkeFRtKVklPz5fant6VSlHbnFJbWBRRjstWCU2fGBUI2hkCishSm8pV3g3JGgzdF8wNlYhcFYkS1oyMFV0ayVUcyVpVnd7dn5yT1haISZhMlI2fWklWEo0RU5KLTUqSHk0ZCtZJFh9SWFgUkEpQFZZOFZXCiswKCR0ME5UP3V7V1VAMGROMUBAQXQ7akU+VUVXcFZoKTt9ajlKQkc5PlMrV0FXRUJaY3NuMnkxZHo+cGsjaitGQ0dGWlgoM1U8e1g3dyVfCitLKmFXUkY1MnxYU0c1c0hoaXlEMkcyMHtmNnxzR3RqY0BnPzwtQnxzd0IyZkpmeUF0SXB8UkUwMnY0TEFHVFJASEBOdDRMWTx0RmhVU0skCitYeSNmYGlWeU1TZzszZ1J2biZFdDQxd21sI0RxUHQrOzYqTFomTEordCVVdlI0IzxPcHNRNUwkQVMpMVghOVA4QXIhQCZZeCkweGJ6YzdKCis0RXpDV19DME1CT3olSUJVU2Qmbk1TbW9Ye2ImbUpsYjdXRCsjWDkwRlZYN0x4UiNxYzMkIzkjRmoqJm10TzdLfV49Rns4ek9yS3J9UyZ9Cis7P3gmdXE8UWxNP31WbS15KDVQP1N3UmhSXkVuaTZOeTZWKk19aSQhJD9hRmV7eiVffUtAM1lwYzxMeWR3ZzZrMF5DWmdzTyUyP2c8c2pZCitJKCp2c0cqJCRHZD5Rd24kfGdtODxrZGI7QjdYWGB5aVEzT18jX25QSGs8fjk8fTJtRUdAZStKeH49U2tRUVA+cTJLeVpmVVU9YTVwTXNoCiswNjF3WDZiRiUzWkZiO0hSdjtyU0d0ZE1UaGgtT25PZSFjajxTUks4RU5YcVJLeWpDQkZCfD48Q3w9WC1Pb0YqSik/X2paZF85bkJmY09gCis0eFE4I3kqU2BjJihBdmxYdHEhMXo4RWslUXU1Ul9SSUtvWTRwU3JKSEk3MnA/PD03WUx2VU45YDM8XmtCTyZOI1UhcG5UJkx5RkRvRT5iCitTVDJsdT5WTn09aSZMTCgzdDdlJWtOeWwjPFQ/Nk1haTg/PzRjTW5gaCFIRSp1dWYpSmYjK3pObzUyajI/XjklSX0teiY8ZV9gRyg+dTdgCitYUHU/MjRaYzJaZygmK3QxPkA9cCk8fndHJVdwUC1jQVdMbSZJSitGTiMyQz53ZkFnRDFEckV2flJ+KnNGOzxsd3ZoZXFse0ElND1UZzhpCishKU0wYyhzajtSZy19PHVDLVdVRTlGVjdQcy1gaT9RNjN2Q19BUU1kbEt0XyM7UT4oWEAqbn5kRiNKSnM9MTt+P1koajdMJmBsOyhOP2ozCis4K0h9WFFLbEh9JUdHSy1VcFpmbVhEY0pyLXReR3BLQnlDWkt8byFuTCo0MyN7fCYzSnt5SDtgKnlyaFAxI3VaTU94QH48RlFaYk9gZUh+Cis8M3E3Rmo/XkV8M1FANXN4dEd+K0I3ZUdVeUpFMExOJEl6P1BfO2g4TzhYdSVnZ2YxX3t6SzUmNThEZS1POzdDdWEmPEswKTJoaHRQeSRtCiskOFA/MytkaUwxS0A9fCVXOW4lPSR8cT5uYUI9MFp0UDdzYns0YX5Ja3FfTXg1KjNBczNaYk1FMUVYeDR7ez1EVFBxTiQtYT0/MTNGYGczCitgSXRPMVNAP2NLPFl6eFdaNDYrU1F5ZnV5RDJORSpIWk9AfDt1eSZTJDlzOCRZZWxldGtXMDdoS0ozN3sqIXBeLXZeQU1lSnNnaDViYndQCistTClQMVZ0WERCQUk1OWl0RzY+dlV6OE5wcVMlP3A/SiRtI1BDNW57fGxmeHk5dllgKnJ8QXNmKEtTd2JBVUluMUJ3ezd1bmpnZWtpJHFRCitLakomdjh3cjh0Nm9RVnshPFBnODNjMGNlOz9NI1ZOZndiUmJ7aE9QP1Fnezt5UHtKcW4lZkN7cm9fTypUNmcqOTdsOEg8SiY1RDQ+SClJCisqI3Q1fGdPemFZclk4ai1gWmNufSVuJGhGUTdpd1h9MD97ZVEpcjh8Z018N0cpJU5AJHE9R1NRTSZXRXJmOH5QM0VHRzdAK2ZRYE87MVhgCislbHpyezlgVCR5ITEpXjh3N3g1PGNZTXItXmJuQj1OVCshb0sjc2M5UlhmIVojP3JYc2xzbHooUVJnPVkxJEIyeDBWVVooeyhNYG4zQilMCitVK15IY1kzIWpeO3lPc19VcXJ5UCR6WGBJTVckeGB1UGk+JlRAP2NWWkVDX0U4azBLdEVQUypIeksxUC15fUElMFZaV1Qrb18mdyF0fXdnCitOfmU9MmRLUiFVeWtIRzFselRfVSskY05uciFyQ21qbG4mPkpFMDFmIXd5flRZKD15aDQtWVJiczl1eTVZYylLNU1HezsxVXlWekFSczB2CitwbF9edjVfXjAhcE9kV3hhQDZPTHFkXkJoanppe2NJUkV3PCZnNV5YTmc7TyFsN0A8PG1pdT5aZ311QHxyfn5UZyFCJUlaczhFYmdtM1g9CitqRk5ONCo1RVZZcSh9OV85MD19ZjVFd2l2NCN+VFVybVhtS1UoI3B+c09tUDdxajNQJlR3VDlGNzhadXkoRnI0NE1EJG9SRSFAMXtHU3srCitCJjI8NTZyNEdAcXZZQTxgUmcoeXk1RjQ/NGd6YUpKV2BnPDJiMmdvdztwQHFkcmw0c3R8P0ZXVU5lNkFpMisqKnB0N1ZZPEZ4TzlIe1BjCitzY00xT3lAMzcoZWUtWnZRKH5Se2B4SDRoWFV7KCpwM2A7WVg0Nzg8M0EpTVU3JSgwTDNkMVo4c3loJkpDYlE2TnBSKT8kPmQkeDwlX08hCit7KGRLVGB6N2tOY0tfPm1kYlIxP0pIPnEoQnBac19GJXR9Qk17OXlkPjlHNXBLYkYtSiQ4NHRRZS1zeHRzUUZPOytrKXcoamhmNV9gIV5vCitjX0A5PCNrXjIpQmBIejhwYWZtcCplcExTRj5mczBsPjJVLU5Ycl9eMClmbz5FaG03RDR1ME5eYFIpUHZgQGI+c2hmPTwyeDg5KSpBNWYrCitfUlZJP0pefD13eG9HKlJEUTcxaFJ0I0g3Q3huVzNCQnJScFlLaHQ/bS1OODsrKF9sJHM1WUxES0FPVnlzdzEoJE55MjNvT0hkRy1vOClhCis2MmJpTm5MSXNDMSQwXjZAZj15dFFyXjhVaVN7YnV0XzJ8JkNXT14kVGJPZkNoNnYtMUBhQlB8KFpNcHJIe29iTikpI0VnWF9WY0Ioe25CCisqS0l0d1ByJUpTPSRubTRUaUQxTkFqT0R0MVNaJThiVTdgQUtgXnAyTT1jYilsIyYyRTBxMjQoUExGQHpxfTVMZkRXK1p2dzY3Iy0wY0JwCit9Jldyemk1UldAWEJ6JGBaOTwwI2NLSWM2aG9CfXM1WnRqWGpeUFZsSmlFWjcyRE1SZmlEXlM8cGd+JHhvKkpVe0lCOTxrTWNJNXNpXmIoCitTQlhaI2VsUWMkKit4THo2VkdkNCV+emwleDZ5RHVfN2QkOFFmY0RYcUthV1lVb3tBeWQzaTBYajhrNkxzU1YyRFQ8amRBVldeaSo8P3J7CitILStlTjdraVpffStoamJxYjhsRjlhWCYhbXRacytRPSpUSiEkSlQ2QC1NZWNKbyROMmZpPSQxOURuS2o0MFk7JG89SFAwaThRWVJJPDBwCitWO0t3WGZCX25uMVNxI2E1PUt4LUV+WWJfSD1CRFVrP0goPGdBMFhvT0tgVzRhPk1FS0drMHBMSmF4NGA+SFNIaztPSUpmQk5GQSR7Ql4xCitiay00PzVpaCliZ2QrOWw4eldKJURaaGg8N0Y7Nj07e0Q2PXthXkhiX3NOQ0ptUz9AbjZMSXsxYkV3a1NFenJGWUR6aD1rcWBsbWFGQkRUCiswdDJTPm4rZSN0TDs4MypOblVrPEUhOGkxZmxUemdmViNeNEBSWiR0JCotaUZqQyk7NitnI3ctPWZeN3xHXklAeGY8N3ZxYkxrODRjfiE9CitlUWhVaUUhb3t5dnB9LX1COz5OcFBAMjlFNks8RThYZ0RqV2V5NjdXMFFYeV9AZ0I1MWhnIWF4PWZIYl8tWTxkb2ZjeDghRSNUSWF3KiV+Ciszb0hvY05eaikwbCg7U1FiVFVlNWZGVlR7YDN9NHlgNXtIfl5KWlRqc3tTfWd5YEAod19rd2QyOzJTbjhILXEzbGl3cG5RJENfTGwtOUF2Cis5b3dkUH4hWVBIcEh7XztnY09FJEEjQkp2RTdoPV5wenQ0V1dCWElNNSV5c3s0K2I0dUZMVypNSktTKGB8d2YrV0B5Rlk4TzRmNUZ+KjBjCithNUgxUF9ZTEM1PmNxeigld295an56YGBebXBLe3FGJFVLWnVVcDlCTmAlJkVYT3hAMU9+Uj8kdX5kOzxEbzstMj49cTE9K3hDenRufUs+Cit4dXthP0E0d3tKKj1BX3o+NCk+ITNkKypUZVkjKnFxK2VvNkVZSjliMTV9WEV4IzY7ZlEqQHRRRCs9T2BNLVc4QCVNYF8ySzx1VjklQEF2CitWMC1PTlFYa1F1PEh0ZDZESGcqK0V0cSVsNTNuRlBuTj4ld3hYZytJKUNadDx6a3N0fD9BajBnVG5IXig0Sn5qVnc4OXs1M1RIb2VxYDdHCitZMj49ZmsmflptMVIxeTsobjFUc0ExMmwrbDBjejRKbElFaVUtYGdeYWBIUi1lK1kpalNAYjhiYnk7RCEkWmQodHUzKU5yekh3cU4qISEpCiskWnNBeHpFcGhxNjFqTnZJRzBtbWpfSCFCP2xDPzBNbWRQYSlUJDw2KSpuPnsmaz1EPFhyPGl7a188Kk0jXnpUSUckQWhSWTZXZzdkQyZkCityelFORGNQdHZKeiNtKExgc2smMXJRPHo1fGZmZTJKMmkkSjZqe1M0a1MkMzghJD1lS0U7KT15MVVyc1VPMzZqMmVIT1B5cSQwbXB8byM2CitlMF4zcX4/Smp3WGhWMHNnJiN3e0Y1TjZeLVUhbFFISnhedVFAek10TDNnWlVgU31fRG50JSNLSX1QZUwlWmBoMntlVHk9VSFrLW9yNG8/CismJiMqcnAxPG1PJlZ3QjI+ZWhrd3UkODhKb08hZi1mXjQ/Zm03bnM+VEZ3XzRyJlNKKHRWYTFpZFFUZ3kkMm5HOTNQQUE9V1RTUkdXMDtwCitsJT5IOUVBPXZ+cFV+WjEme1MpOFo5U2VRMXh3MiZTeCpuc3RiJj9AdWRtfVlnYylDPWBaa2NvJHpEQEJxKUojVVo1PmAtfkQmXj5QSi1pCit3OG1SYis9M15HNmBRKFNrN14lTGw8Nk9CKX16c3whQVAqdCEtdTtaZjRPJUdiWEVYeC1JYFI8S2teZjgpMmA4MjNacWVvbzJHbVhQekVeCit+XzVUZU58P2lEWChvaCZZZEQ7ZWNaY0J7XkViMlY4c1NyTGB2dng7VDVsZkhPfVdZJiZ6VnoqZnsmeVpnUHg0U0VJfXtYIU9zeFA5U1drCisxWTE5NkozVGY3ciorSEpFVSUoVXtQK3RGTURXXnBYSXVNQU80a2drV2E0cThpPyVVUD9lTV8mP1ZJYCRLWipKSm52QVlZYHJLMzhrLUJHCitkX2h7fkxzd2wjZ1VAYV9DO3BZfGRPdD5hKz9RKiNgaT1HSUFMVHh9eFpjUDFgUHJ2M0U1RE0pSF8+Z05RXzRobHBPUmYwYU5CRitWSXE9CitWbShrKk4rdnxFZFNFQVNCc0NHNT5KJjwoSzNqJlNySVVJPmIrYWAhbWx1NkRSIz5lYXktLTNOYGt5fWxxZykqXjhrRGplMnRSV2pkK1gwCitvXzRwVHZWPk4hNWxDZSl0Mj9wIV5PaXAjQyg/bWlPSW49Mihfb21fVm1eJkloVzgzbT1oKj49Unx6ZFZPejh+NDw1R00/UUUoJjBTVlJ9CitZaGRrfih1YS1CfXMyaFZuZSVPQz0hYTlHMjhnPSpYKUhwQ287YUx4b3tPYWlOODdDaUtGfUtMQEpuanM4SWNib2FWPE9IN3g8REYtRkAhCitCRT9QbE1Te1FSZ3IjQT47SyQ7aUdna2RFUkxQaVN0QllyK1RpYX5MJTZXYUhWP1hlVUBTN3A1Qj5yQE5CX2hKRiMxTCReNlYlSzsrVyg8Cis3SGElMmdFO2RUeD1FYWlhe3pwVjE2VmdEPHVZX0JJdlQoeno3JUtfVE1Yd2s4cFIqWVFFVjEpNnlMJXF6TFZWRmgySCZkcGc2XzBWTU0xCit7d0EoQElVbW1eUGlzI3d4KFk2czVWYVopYCl3ZShjY0cjMUtqUzg5TmNGfCNzTHRDQFlGYzlsOWo4LTYwRjdAY3AjZ3s/aG0rZlJnPTs4CisqMUttTTctc145UiQhYGZlVmxGaXtVSkp9cSo2XnYmNjd1O1UzMlUmSU5EZHZKeGVEUzR4MWxBNmhieilsUm5qUkAxQGxwOCFEPVReaylhCitPU28qNSoyfiN+VTQ5QH0rJFBTaH5BNEIobGwqXl5GZ1M+WW4zfiRAek13SXlKdlEtMiRNVj5PZE8/WXZDP1RrKD83ez02PjI4WmIjITQzCitoeCtScVRObFJ1d3VoUXVtVWBuMWdRcWtTdlA5JnA+IVpNYSspQ1liZEdCNUMraHc0PSU/dWZlSl9pYmJpKSF7Wl96JFpMLVchdU4hQERqCitSYWlQNE8tJCZONX4ldERmSUFJVF5YdEAhZGp3X2ZiIV9PSz9uJHJgdz9WSCpjaE9PbD9OWkVWeHFFMWROK2s4VEMzS2VkMTVgfWl0OyNyCit+MS1mX1hxa1EyKnA8eiVZNE9WZGsmeSsralREM3MoYm18JHsjP2E1OVM9WXlxK1o8bmp3a0JGNkhAZDRwdEQ/NyR1VD0ka29nPHBmSFo1CitxbCtvXkNvbzlxMjImenFjZ3FUfUVIMF5ObTZjS08qY2IqYkdGSSF+QEA7azJrbGpeQF5hKHcpfGF5ZHQrdmoofHgwe1UzPi1vbzlkby18CitBNDB4KSEle3l8VWl7NEY9JmNhYV51eU10TTxudHdTd3oqWGhuPipTZCVtalNqIyNTZFl3IzxuU1M3bD1gc1VmKHI9Kj1aaW1iX1ZvMmZOCitkQ35pKSRFWHNFdXJfSih3SHdXWnpgR0RhI1hoXmx3bW1raDJeUXQqM2NLSEtXdnEmK0ZAUWhLZ1VDa2NHd1NYdk4zKyRBQ1Q5YjIle048CitjMnpzeDwrXndJdn5LdGc0Y0YjPyY9a0ZYdzA3KmZxYFdjZEZwe2FHdkszXlNpfGUzYXpxPEgxOzlAIyEoSH5sY3A8JFlPQnReK1k/YkVMCitZWHk9dXlGdCRtbjdSWnJlQmQ7MnwqeUlUNkFHb3Q0Vnp2SUVWUTdFcHVpTEhYYDZEeHIzd25tdUBnYnBKLWR7aCpPNU1LKUt9SjJAcVJjCit3TWVnS21MRmAobCFndjJoT0V4VSEjVkQwLXBRWlZnTmQ5YiRyVE80KW4/KjB1NHV2LTU2USgjM2dHZHkwVnFHVlQpP0ZwYV8+bDxMZG8hCis7bz1MVWJTTWxfUnF7dl5uV3lnYXxwY29yaUU5LTJXOUdhU3VOYjFja3thaHI1LX0weFQjOG45czhjb3c1UyUmbT9rTDZ7cDBZJCZPWl5ICitpP2VuTFZNdF5CalczbmoxTiQ5P04mO3tqZj43VGZ9TS0oR1Zec2I8bShRTUF9REZzZXJNcT5IUi1IWEE1PUUwYjVnXzFeOT1EMSZDJHR5CitYc3hXXjQwQjxNVko3MjUmY0d8Nk94JXc/RmM+IXk0N1pFKlhuX3ZtNWp8Mz01JE5PLS1hIWktfEI/KFpQXjZ0Nnd1fCtSJGY0YUc0K09SCitNNTI3ND10cCFBeUNgaCN8cDlIdTdLaHJBWTx+IWctV1dqNGQqUSFLY1h1a0dHc0hLKlU2fmlkVlkwS2QpbENNOWFKJDheenZBdDgjJGh6Cis2ZjNlM2l1UHR6RjY2RHs1YGhKWT1PTGBTYnN6SUg4ZEgmbWljZ2VQeUxLKSljfF8pdVg+Q1kyaGtvcCV0fDQxS0AhOUJzdEcpQi0tUSgqCittQnM8RChjITBvb210Iz5oZiRmejx4Z20kRXhASTBLQzUwKm5fRk1DN0RCVyY/bSY4d3AjMVAwZzM5eTFIWUohVmRoU2okUHhpSG45Kjh2CityK2MjaihMPGs/TkwyNyM/TVFQP3dDYXg1cWEzJjlkbjVGNXUjTCs5cU1PJmE+Tj4kbmgqUjReMyorRnQ4SG4oa15ZVztmVDJzWndlUkQmCis4akVGanIhcSk7b3hqYjd3QD9tPE1kNiFoTjF8Vj5IWGZkVkBzS29EQUheZm1CSUo1U144b0U4UylkYSgqPTRqdkNmbWJAOXZSX2Y+IUpHCitkUV95KXZ6Z2NaQmZEeSM2MFIlQGN5SyFuP3BLPWJ4VD48NUZ6Nj98c3tqXkF+WjNucUZ3QEpeMHdPI2lLJXV9KSNEOG95KHZufU1gXlVpCitkblA2PFAtfEMpbHNyYUcyK1VCd0wrZWJfcmh4WF9JWGluOEB1NXEwZjhFezR9Yk4lMVlUeF5Rb2hgVGd3dkIlYSRNO2JGdH0me0EjaWBNCitCaktnVEEhOWsjXnFAbktpN1dyPlM8Pz9mbS16cG1AVnJaNXQkb1pTKGQ0REQ3Sk05aGgkZ3JnK1BqWHJoXkhTNE5RfFFVZXZzXkoxfHFFCit3N1Q9d3FzVHx3VThEWHMjMk0+bWRXYFJKeVVkfmVKZGB0NERgKURfMV4mZEY2aUhDIWRgUXVffHxzK0R2U0JnRlRUMUJsMDd4JiRVUXNNCismb1kmYUt2N0pOSUFtKkVraFNeTUo9Z2VTQHIrT3pmNjBVd3QxYEh7eF9iRj9JZjghYmNKd3t8NHFYK3E4d1EoUndCNjAoNz58STM7Sj80CitGN3NHQkI3R3dGeTRMfjw7YTZtbHxlMFJkJTk7Z3ByOHZKI15VbjExMEtXVztSI3BjMkEyUX1iPlNBbUM0e0dkd2t0PkglKGVrNEwyVUE0CitJYEF3SzxkeSMwVHMjaHIqUVZjaHJFWXBKY2dZZD53fV96T2hOT21oNmBOZmcmI2NNTipJPTdGcU1VbmRmMUojJXQyLTM0P3dOdyQkbjFGCisxPW88KFdYMXtZYUxGYUklYl9YaG4obUlgcDk/Z35zP1lxfG9QTENZRFZmSyl5ZFZHbSg2WUspJE9kTVBecF97U1dsfUIkKj1fb1olfXViCitQNUdPZEAyUzFsdkQ1bk5lYUZ0Tnh8MmY2dWQkXllrIUpAQDIqTnhAST9iRF88fEpDe2g+KzA3aWJedkdiI0F2Mj1wIWNrYj1paSFxbDRmCis1ZlQ0WSlqJVM/WGRuXnFaeDd3I3RHJHU9eEF6VUM7PGRjKCY7OyMpZVZtRzQydnF6NkQwbkYrPEcxZXtLKm9RI0ZTWWkmemY2KHczWngwCitBaTMyJCQ5LV4wcmc1PnRNQChpPlJBQSopYERnUS1QdFZpUGJxREtzKShldVNMNVkqWlZCMnM9RnB7PSVBO0V8S3ZPcyVzNTI5emw/M0QoCitNakNsQk1ZQFhUdzlPSitBYUskPWZ2M1BOT3hKIXZOPGxKe0c5PSQ/fVFYeXxzVkBRc31fYEhBQFFDQjVgMW0qUHZPOWNqVz1JZU50cGQtCiswXldRO3I/QVgtIyhRcGlAJTY3ISNiZ3QxQDZjYCVedEw1RkxHNkNrV1dmQ2ZpKylQSkE/RTZJYjcjcEk1aChvY2x0ZnBmfGhYZ2ktWk9BCit4QjheQz5PbzQyIyEtVXJyRWB9RUV2cmU1JXI7e2QjSE9IWU5JMS1PMV5yeFRgLX0wUW1qVH55MzJ2Kk9FWWQ5OzlPNHx4S2dmKU52eU5nCit3K0dlIyRnSTclZkZyYmJfWm1pdDVoPk40K004c0FAJTAmaXNzPG93IShaWGFaTSFaMyEmMEI3Nk9wYX1POVl+TVNINTh3eytNQT9fbD1wCisjOWA3eDw3U3pGYy1JZEZ7bSlUI21pMXFXS1l+NH1aJmtxZE9aaVNZaWc5Jj8rPmwoajMxQSg8NHkmMH5+ekAtJCFLZ2dpJXBsdElsbn0xCitvVXY9VUZPZH0pV0lqXm1RfT9xK1lweXxheVdXaGxfaDlNO15eQHVFZH1RVD9KWHpgb0lFbzl8Qz0oPE9KT0J1P3JDVzsqKzgpSmlFUld8CitYJChpPT4jVmI8aVVue09xdi1TX1Myaj9jfD9aNmh6WmotdDU9MFVndU8rUGc0cCtXKV4jckZNanIrdj1aZyhaZmBOcio4MVBVPEZZXzttCitVTEJ7U3BSY21LYDxTM3lPdFVUQ0ZAQSkyMUJ5JF5oYTs5X0BjOVd5YmEjc0VNTlUwPDw0WFFYckslbFA7TG5DUWkyV0hzZTBDKHZlNSlwCis1P0d+N3NzKzk4a155ekQhYUFkJiZXUWR4eWgxTmojWDQ2ZG1uOUdsZShYaHFMR0VSQSUzKFA1QyU5IygwUmB4KTg2TmA/WUZMYlp4WHJTCis9THd4S2Y+MTJoVEBmdkorPip2c1YwLU0xfSpOWEw1O0wmflVAaWVqaUBpZz9zUVN6a1B0RnpHKlJjdWUhWk1BY1g/TU1BcD4tX0F+QXA2CitSMVoyX3taayl6aXJSNWFobCEoS0Z8TyZscktCUEVvc1RCcWJTU1lATnhaPioxUkI1diFgV1RQJE0pKW8lO018fkZiRlY0Vz1Rdkh6dCk4CitlPldWUD1XcyV6Jm0+Oz96dChGSnJ3cSRJS19WZX5SSGV7dEo0bEU/ZUBrYXRGKzckKllEamE4an18dlVXKmp3bGM9c0ZmUTVoR0dBcWJfCitwJlZBP1JTM34lRTljQXQ7TCRIN1hpWFo9SzFMY0wraWR5NUhKJjNKcyg8Q01CTVNWdio4aWlmO2sxO19pRXkheHYmbE5GJDI1d2FDb0taCitTcUtaN3pMJE9CRTgxN1BXVlNeTlolZDtDOTxqYSs/V280YVpmaC13aEBpSD1qe1gyLVNyKmtKPX1VKmg9eFdZXzAhRVlnbVVVOTsrZHxqCisqN0Qzcjd6TGhnY2U3RHwkWitNY1p0PUB4SmU8MmRPallkMkt0czBIKUNUTyMmTncjK0N2cll0dThAZyUkeWpHOC1FZ3JuZ251SDBhZE1fCisoZWs2MSZlcStXJEI2P04pRTA2c2xDTyRiJE8qRk53QVJ7OGJAKnU1MX0oV2whcUZXVlNvRXkjUkl3b313QzIzVyNzTmsyej11bT41WTtTCitCdG8zQCR6eEchQXpJSDBFdyp2LVdfWjllYyR2dH1fU2c1dWEtSFNAJVgzN3Q4VkkkdURkKlpjWmh5U31HZyU5fSNqa0E+PntDMnVZRSZZCis2NVdiNTxLMEotMEt1YUhBZXE2cnk9SVdkRX0xfCpqSG04QklaYXklKFV0PE08QCVqKThudDhIM3g5PmxUJmZDbGo5fkgpPy1VMWFeQ1pFCitMZGlqZmI5Uil3SVE8JDUwRF5NQ0E4QEdpPCYlLXJPfHo+bW82KUl3ZmM9aEo9SWMhTWd7WnBCd2AwSS1TK1pgIV54fmBaMEFqSHRSWD0yCitfanR0U1NnciQ7T25+KWEoMGttb3QlNzl6aHkhVHQ2Y2p7QEZvfHthJl9HT1h9I3Z4RHV1Vjsmb3FUc0tPSnVQMTZhKiVRbWFAMitlTF5LCitHeHpnTyZqJnxVNm5mI3A1Z0N5Q3lWUytvOGwhI1UkfDxncXJPKkV5ZGlJZ3dVQ2tMWl5jbXlWO3JiOGplfT9iaER9ezFee2VAciNiNUtjCisrclg+LW1JdU92Zmp3czxTQGY1e1NDNHZPZ3k1KT4jQVo9cGJNNWZneHhUdmJPX3JSaitDd1p+T34xUUwtek51UldBJUhqZHRSQ0EqTH17CitzRXJjPChDe3ItdU1LZSEyU1UxITYxcjJ3RVc3JFhqal97dmNUVFRzVnV6Kkhle2Z7dTZ8fXdlJDFNc3gmKlJEQHo+bGYtSGxfPCpNQCRRCis8ZDZFekFaQkZVRWVPbDBZUFl3KlpjenElUyZOXjIwNkRga059KkdDWU0rMGNucitYPSphcXd1JGJheHxpa31AeGBPeHMxeyRsZFNEWH1hCitpa3JmTyQ2UT1raGxFUXhXYVlfbXMhWWs9a0NZP1JkWj1fIyNeUF9WUyRpR0tHX0AkX3ZufExEPClKI1Y4WnIrNjwxTnVaJWRDcnBFQDczCitme0YhaEk4P3ZHKXs4K21CZkBeNFUmPXZMT3Q/eFBFSEg0RH0hO3FxUGI0TFV7T0Z+X21rPD18I1cmQCMxQkpqck8mRXx8aSgrOzRDU3JSCishNV9JRWA8SmNIYTdhUnMyQ0JTY1l4dkMhflV0M3xTUzNqKC0lLW92UlhsYj5jQjBSN0JGNW1IeyVsS2F6ZTdNVD5rbkk9TylLKm9jKyhjCit4MTgqRyo1a21wWERDSTVEdHVtbnJ6MX1QOzgtOFBUa2J9dzg1cWVQQk1uOTc+eWdIe2tIc1l5SypfSCVzckZ4c1ZkdjRvR3I1clN+STl0CitieWZNc1NGanZhdUIzfmVCTitvNy11Xzc3YmFxa0QoT199ZFBTM0o5Y2xxKXgraVl5cSZNa3hlYmA3WE87YXlBanBDT2R3T2djfTIpYX1YCitsa2kjWGs/cSVjck9rPn1HYTtXNmApa097PVdSb218XntaaWtGc0tSQXZZPGRjZV8oOVV7IXZQNzhoUT8kck1mUSs0ZHl3b1UheUlEb04pCitLalpScGkoTU1gc3U3aDFzeXg8bWZKX3xmUmd1SHJ1T0h0Z1UmMUdqQlZkSzxQYGMhMX4qOSorblRAPzZqPFl5R1N2JFBOUTluJlZ7fWg2Cit6d2AwPWxONGBfQGVPbzMyUzlNcnc8OTc9e2x8eHFaKUtEQihyZ3lkOX5uaz82I3tVRWIxSlBiKWRWQjleUHFxTV9rOXM9Y2Mta3B5ZnR4CisrbXYqSyh3XklVPklXZlp2dUI4YHFlUz1eWURQa2dPPmI0KUdvI2FzdjRvLSRJazxYdXtLSEZHWD98b2c3WD9IZ1Z5P1hCKGdlMkZoWUA0CitQejA4c2JaT2BVdGJHcEY5em41dk8mSEtlbUwzZjFkb282KGN+V1Z1YSpfNyQmZVg3X0dZbmZ8dCNOQjY5ejFXeUlFVDVvUzZoOXtmRyZSCitIMS1OPGVMemRYfkt4RD5pekl1PlFubkA+XndOaEd4OGphcypNQSojQGNaJl53JileNTBkblEmc2MkUXkkY082aWAkTCtPV3ApRT8odHJGCitYU0c2Un49aHFnaTFsaUFOZ1Jfc1ZSXmV+JWtLKXZffDc+RUlpQD14dmpkI3c1V25WRylIezlhfiREO2V9MTkpfj9jaGlZUHVfPXw7UFBQCis7RCtkNWF8MG15K3BydlJNQkNYPztGXnd5aD9uaTFubEM7WUxNSzZQMDU5aHhCJWZHRihtRUE9Yzs3VGF7UmtTRzJ7OEBJb3BFTFRMK0xqCitEa3ZHcjUmQnYmSikpeyRFJn4wUyROaG50JDtxYiQlfnF7Q0YwJDlzc3xJQjl6UkdvQmFEdTM9Mi1DQWRDPVNra1M2dTRGTlcjQ3o3YmErCislSkgqdkIpN3BAJHpsIXFBb2NfJDlDbi13ZGQ1UjwkcXI9RUpOaHJZeCVsVjhESn1LYVJMPUtfRTNRd19valR+RzhmNDh7V0c8fldgcVYqCit0R3I0RmZFeFJAV1ohKjMkX0BNQnQjJntgPTV6LWM2bnA2dUxRUWhwcDQyZ1hrSHBJdnxYX1cyRks9OH5ZVkJhTV5abmZnVy1IJlduNkY9Cit0U3pNOG0/YCQoJmFgI0VKKzZBUDNvSEwqfnYmcVY4R0JFOzw+WUdSUVhaaWE/ZG97d1h5RnhzbFVXZipSKiM/cFpCY0Y5RT48ISF4czBSCitSRjRmY0Z5dDBRNzk1JjA5S0gkcG9idE5ffHRiNXE3KkJlO0RIbjkzPCRpSnx2UVZJJk9RMyFsZ2hQZHVWMyo0Sn0/Kk1YP21VO2hQNHA+CitqcihBTD5eVWA9a2V2fXBhLXo0NXRMZnVkSnx4UDNnfjZreX1tI0phcTNEdkVwbFpOZl5vY1gyTFU5fVgkK2gwM2FtdW1ZSHdIeldnPnAkCitGM2J2WV53QlMmMTtTUV8hbHleYzQybzs3UDNYZzZzbz17JlgmSiNQY3V4MVJZWkxVSTJmT2tpeVQ3THNyKD8lZnYjSGVAdEIqQj9qZlhQCituTEoyKWJRb3JueCsoI3ZHK0VKak5iTVN0ST1wUWdvPyYlIVdLNWhmUkNjdzVEVGZeOzNaTWYwTHBnRko2NF9tVjVhRFgqTkNsI3hTdlBhCitVYUV2VFN1KVpadEA1RGpBc3o7TH1xJV4+P0AjRUNEZ2l9a31UYmVma3s+bjt9U3ZuYH56Nz85YXdFc2hfPnZvNDJKZCtoR2VXVyo5MFVZCitSKkdZXnUmY3dlRkdnPlJNLUUmOG5eMXYlQiVPNThyRkp6Y09YayQkRTQ8Uj5nOSNePDxXcHVAT2FUMEd7fm5GfWJRNjNhPlBydVJuQEw+CitSXyN4WjYkWWE3Qz5gWDNwI3RscWdRNntwfDNaVFNaUT1mPzBEVU5HP09Ya2xyKXc+K281NjVaMGlPKl4haFFpR296T0xkMSZBeCF2Xkw1CitpU3FwZV5LMER+aHdRVyM3YHl8IUklZ2NMSXNnazBnKDdtd3JuX2N9VlQ9JV9efTdzTCVmMnVaUVNNP2BydGI5PyNlcHdIdn5VMkJmSWIqCitmKC1iT0ZwbGN1PjFpVGJwNCRVc2A3UmBaMWl9cGoyK3xYR1Itd2JuPCohITsrWG8oJikreHduMXFuO15WdHREeVZ5RUgpPFlnaDgmR3lUCitNPiNvOVg8KHopMHI2RUxQTGNaWkVmcyR9LTlTNm5lamp5fX4kJlRfI1FySW9uSGpqZ2lVbEJRaVokSmBCfU9XQk1VIWBxY1k+S3BCZjxeCitaQnBrOXZRLWh1QTI8QG55WUdWbSk0JXMwVn1SJStkMEpucGNpI0RsZCYtNDBrVSY3WUQ0Mj5UajlQSFhEYmAwUyhPJXZXUiRiKXU3Yz44CitNemU5JFY7cFktUDx7cjB7OzJYcFA8MDkwJVQjfkRaUVdwbUNoaFc3K2tMWW5IVkFaNEA2T0xLbkpzX0QtbyFfY05KTDRwJkpFXmZ3eFFtCitlKXlHQV8/KVg7MEg1PkdCeSNNKig0VTlePnJZRnlyU243Q3ojOCNBUzhvOHk7THNuMSZqSmVoa2R8Pz5IMVApXnImUFBoRzlmZ2B1UXNNCitwVEQlZXBPZjJDVW0hfnFtN3dNPkg7dkJMNU84ZkBtZE1TUGJOailGR2ZyZ0kzPz90ZEpAZitCZ2gteDBQUj5XRktkfXxaMkJQfSkra0E0CitBY01IblpzZkwhI1hXdCVrSHIyPDd4JT1Jb0NEO3JIREdaRFdaWnM4Z0lNUiM3M0xpWUh0QFElT1FWOzY9JVU/NiZsbjtaR1ZhPVFHX3okCitOI19SZHxXIXUwPDlkVGBZR3srV2wxRTIjKDRkemNibSlEMmJDdmwrSitVTSpOdGVaY2d2JSlJfCkjak9OeC1EXyY+P1VnSDw9aVVvPVVwCitXfFNvKWdDS1MjPV9edCRgSlQwN1E+bW0xJCheaklCelFjSiU2eW9GJVN1JW8qRG1+QyNBKFBAQ2IqcjJ0UWB4TTxzcCllQyRBU0hrX0AkCisxX2liMFRUfUFZWElsKXpReU98WXs+Tl5sVjwrMFZ0OUowJW15T3lSbUhmQ1o8ant0MU8mdnBtcnU5UTBVPSU9NHUzd1dNIUx2M2pYRSZVCitlRWE5MzE1P2VzXkY7R3c2Z3hkeWBzaT9DTkpyVEAlOE8mUjdZVWtNUCRDSUpiQykkYzxhJDlqeWo1YWwzRlo8bG9mYitGeVZJcGRRcGVACis+eFFoPE1mbWReRz8zKkZAPChBbU95R1RSK3NVO0FVbkxHOFc1MTQtJV5XOGBfZVEweDUpbC1fKCZkVlFkbG1SNTN3X04jN2h6TnljYEhpCituRXs2anJWZSk2UG91cU1ncT48X2hpZW04OCYpKGd2SHVpRW1DN2R8PmtjalclXjkhMG9wK3BXdkkmMyQxdT49Rm5EdDFuUitXSmA7cGhzCitJc1lzQzZ3aTxVeH14V3A9QF89WG1xent3blo3UElkMytEb1lDKndqJjxHNSR+bi1edjc1fSRnRWJFKVpIJik2ajh8TDB2aDBIVjsreFBHCit1cDVzRUt6enBvMGdQOGIjfFcwWTBuWXt8d1JsSV4xclFpPjBTOWo1PExfNG5RfSsoIUMpZFdyOHVjaXkkZV8mfTFwNzluUi19JXYkWClLCit5ZjhHTnRHN0heRCp0YXFuQkY2c3tsR09kTUIxV2EzckdFITJRYzVkd0NHYEN+akM0N3NjNiY9PE1SRmppbUZffiYyV2RZYHdHUyFgV1FACitJOzBfSTApKE1AfitjY2x0dy0pdE9rKmg2fE8haz9lfXFUPj9pVWRtV191JWpPOWNXQyRobi10anx5YWxvbWs5MHdXI3VIbzlTQztOVHZECitCNFB1eTJ2TkNfZzxrb19QdyZGLSU1cm1ZPDdYZ1VaTF5TN3kyM2RCemdUKDI5bCYhWTE7fURvcHpPOyhhRk1qZVA0Kk5kWmpXamRgK3VFCitXPSp4KXNCJGIpMUd1R2YxQyoyQEBIeE5IPFhucjRtdFdMb21IemIybH04TU91b0NAN04kZUspejh9TFQ8P2VJRVh5USY1UyNKZ3dMZlVwCiskX3FzTmJ9OHlQTSh6Y0V5Yz5kaWRlNVZOVVpVdS0kaU1KUWVKSV43aFM1SzBidXNtPihqZTMoTTw1Yk5PVVFMY3UtbkRePiZrdkUyI3N0CitGaXFqI25SVkFAbkZyQiNUJTljWkJHOHF2aHsmUHh4MCtWeGpHOUdYMUtkbWVLKXFwaGdQdH5qSSVBeTAoQENJMUBoam5HWTc/NmhOOVF4CitJRFd4cEpkaE94OHlnPl98YnJ1Qzx4SnlSYzZTTjNtNlczOClrNVRkcyFMVjRfMF8oX3RzV09QSm1DWk9SMHBxTWAkUXNmQjFDSHtVTjttCitQU3Q2c0w9TVFfSHZFP0ttTnVfSXg+TVRRX2RSPDFFek9NPEt9bjRWZT9tQHAySXEpXjVXYUQ1NWoxbVN4dVojP2IhZzZicyM5Q1JlcC16Cit4I2srYHhDTG5JPURrSzN9VW5tVEJ+KUY9ajJBTVU8QUlETTtCTz5PWFJBcmxIdXB0WV4pbHwjNXhQZiU9SDF2QzcwWXYxWTteWEYzVkxkCit2YjdUJDNheC1mVSkjVkghcylOMFJjaWRSOCkoVlQ3Z311eEp7MmckQlghQDxObHwkeDJqRGZlKGx0cVdnSjgmLWpXPWgoSjdNQWktUW5+CitmP3phZyorcH5sMHUlOUkpXilBSFgmdGQwRXRyaX5jd096PiFNQUZkSHgjVW8tZHUoVmhGcmg9OXg1a1EzSGlGPkdHIVc/eEFLa1Q7eHk7CislQ0kje2R0UnRlXjgoVlI0S1Y4U09BZkx1Pn53PXlieEREO1lfd3khfFJmWH1TWnBScjY8JU0/UzxRU35WNDF+N15CVWtDX20oNj8mY1NzCitAISMpZWxvVHRPdk9sKiFfYC1jbjc2akdCVjdWNiY7SGl2MEM+YHI1bEkqZ1pkNGooY3h8ZEItK1dBK1MwS2hpb1ZUMygxcDhVOTt8Q3lUCitwdygtV0IoWn5uS05PQ0lPSzQ5TkpzUWdyaUhzaF9LNXxgbCE7bCZXQnx5Tzs9NjVIPWBHfWsyRDR+WDF9KCRHOUdWK2VHXmVUT2tRIXEmCitWO2FIMFhwYUJMQWVSYTNNPSo9V2hlOF44Tzg4Wm0zcmM0RXd+S0Z4UHc8YyNqYHw7ZCV1KVpQdEg+P0M8M3F1V1N3WWhGUUghblZCTlg0CitBaTRnNktfSyVWNWwmNVZXbExBNmsydzghbChAaHY4WCE4SiVxKlZTNjIxOFdnP25CY0F7dT84XjQ9PGM0UnxVfUZyYEszYGdCJUB0U2F4CityI2s8bnRnVjtrUT1GI1hhJUdgKnw4VTNxfTRmQT97SUorMjNhR0cjTG9nTi1HUC1wSkBIO2FSdSNkbDR3eTE/PXwhOzdqSypvTDdYOWtuCitpUSlpdUhmejlLNzBGMjBGR0dkX0ZHSm9xOVRtSCtoIUlNVjxJdkVOP3Bzc3hPYGlQcW1iXmQtME1fT2ZOODtBMVgpYEc/PldeeFdTRE1vCitFYVc0RC15THApdisyfiVVSUdyOzQ8MFlEWVdmIyY9RyMmRGA/I05QRGFvM2hwfGM0cVVYQHR5LUlTRTR8SkctMSlvY0NUUWkjbiRUUUs9Cit3PzllaVRsd1VmVilSYXdCfnRhUzxuQGFHaGtBZjkjYHYyVF40TWJGciE0UD5ZY00/NVExVDR0ZW4/bUlKZGktcUc0WGx0UV9SO1g7ZzM8Cis8PW1fRmk5V3BXWDR1e1l4KFV0cUhiKk58SVElanUhVXoxenZkaGlQPjFsQ1htNnYqKTJDUERrbjJqcX5kVm9IfWBDTyElc3VBKCNqTVUpCisqYEwpO2tET1BIMno/bUJFa3I2azdpT04oNnohVmElLUV4T15JQShxbGBadSR3WnJvOElhRDBDYW51V0N8V2AqS3ZhdGowNTB0IWBgVD5oCit1enA9VSRDUEl0PUZxRCFVTzxobX55Q3grcT9JMyNPQDQ/TUIzXlhLS256YyVwPk17WkFAOEBiWSp3Mks2VUslRGRNZGxedDVONGN8PnlICitJZ3RjdXlDaUB7KEQ1M3paNHlwWlE5VjYkWmIjTlp5RWZwbER7U1hMMnE7VStYNFF6ZldManIteGwkPUUlZTR9Mzgwd3A0b0BJS0J4Oy1iCis3PlBaMktQSUhGI3BNOThfd2FrUE57cVlsVmROSDZKLWZAdTNKciVrNThfPXozeyM8RWhCaEI2RXs5NVFaJT9rYDhAemdRNjtVSklzeSYwCitAbWhTVDNIVkp8PDU/Wit8aFZLYndrYX4+fSVFQSgoYGQ0K3Fiez90Z195PUZ6cUByV09iO0xUKihMQ0c4JjNgdF5oT3w2YXtzZ2JuZDF4CitoZl9LfDZNeG83K3pIbUJEM0dNMERxTl5fMChFZyk4UTRwQnVkN2xVaEAyTnRCKG40aiFxWTgjSnslcmZ4cSpRQiYqWWtvczhGQSRnNFVqCitDUWU3ZTc7a3Z1YWd4PHNPaUVZJWpsb0g9KXVVSUVIaEAwYHRfJWFRPH14Y15MVWlie1duXjFEQC0jMiRVe09DZF54YXljKy16REFeXmk8CithOFFSIyZ5YW9PVSYqOT8lZV49M3A4KV41MT09SCZ3S0RSO1NKdFpeN0thP0FIKWItSyspSkxlJGthKHYwfihBbHtgX2x3dnt5Mm1DQForCit4dlRselJ5WDdXMm1ROHJRPW0kazJtKG9mWjRYI3VsRE5WJSlGLVp9JSh5Tlo1Yn1NJVd6SnpZPE9iWl5ZcUNLfHdsKVJhOVd8bjQjNlllCit0XnRtX0llMnpWXipaYCtZcSYpIV4zcTxwcHFEVmEzd1I/RTUjQEp2eyUrR0hKWlhqbWJzRUV3dGlmTG5kSUBDUURHZzZ+NDY8PjtINlp9CitySjg3RGVOKWc0NHNGRU9NeVliQURBVzs8SmI4czNFTGpveGpFRWF+KCNFVUE8dU9TKmpabi16T3hOa1VyVCZAO1Z9eUFzfUlffHBaUSs4CitmalBEZ0ZoU18taSlNUj02d1Y9eEdyPW5aU3o2ZTRVRWJtd2xYVjtXM0BLS05fV1I/R2lySkR6X1QjaVVmYjkrSnY9dWdzdFduVEszeGhXCis3QSoxJVdxb3l5JGNEWlQoPUh+ST8oKiZXbktDUlBqYCE1dXx0O3ZiYV9hXkx1IXcxXnwzQSVvYjhRLThsYHRnKk5yPXJpfTdPfGV2SDVtCitRU0o0Rj5WNTdtX0wyQnhsUmo4dCt3QCRDZVZ9SzhabXlAWGs2Nm5wMGlFUyR0USF9VD0mbldPVEZLcTBsJEUwYE99VmZmZjZHVFhyeVR2CispbCM5eW90WD9UQjdjJF4ka1VPU35qPUx+UWoodz5Raz4waih5WSQ9VytsOGIxWSF5eD42NUokKHlPZCRlWT9JYXRMVStlbC1gcDIjcWYoCit2ZFpHJFlCbk1XQld1OHhuQyNNTklwKUQ3dHs2aUNOZWlMM1lKRjNnWn0leUorO0xiKnxUSGF0NiZPbjUjVUdQTEN+VWdlRERsWEpDPmNhCitrdUV7dkF8YmFoMHstITZPc21QbXt+RCYqTnBqYnV0VDl2PVZ6X3pEOzwoVCNRYURmb00+WipvUiYmNXhETH1MZyg4PDQlMTxWPzI0OV93CitUejNvVzEtMUozT3d+KU4qVDB+WSFvS1pKPzY5eDspRCQ2KjdeTzdoT1V5VUBSRUdKZ1BmMkRfOzc+SC1oeV9XS0Vydj1KbzEocTRzKzE5Cit6WVA7OWpzR3MpRypFbSMmKHRAbG5aTiQwVzxJKEhuXy0+V21iZDhfTkE/KWJrTUJYM3ckUl9UaHU9bX1BKF97SUZTKng7R05qdEE5ejZACitnNCU2WSRGMCZiWFNkUHwhelFAJGxSakhtI1MwTCFtbXp9YHd1dj40I1ZtcyhSSWowPj1YfDElWilnP0ZoST5hIWx2JVkjbWpRa0J2dUp6Cit3NUEockR+PihUWTwxcUBYMXdJUCY3WGgrcjxNcU1lRVIpUjFQPnNOKm1NK2JKNkJTJll2JiZOPDVTQE9SMiQlaG49R1EzKHteOFV6PkwjCit+PzkySWJsSG9jZ2JXKT19S210fjx5KmcjWDI+KGgkYk41TFYta1VXSzd5O2NyNUQlLTE9dERVX2FiU1duQzhmPDxvdmJlfip+TFhDMWtJCitzU0IkR1BXRmx4Q3lzfDJmb2ZOJERhcnlsU1I0Xjh0clpIUnFEZjY7a3tRVCMkPGFOP3ljMCprPSpjfEVZYG5GaFgkPkhsUz4qU09XTVRuCitwRD07NzV+aHVkbF9RNG48SD5UT0NKV3AjRzVvTl9eZEdDaTJsdGxgSTMpRjBgVTRsa3IlZXB3NXNVYjR1K3EhKzxFZzNCIWNSQEYjYWtBCis5WkFLcXhpaTZQTzc5a0M9SUxwT1YtJVV5MlNYe3slZmhVcTZac1RgUFheKHRCYTEtbkNla3M1ZFdmYkRiOWQlM0V6RnhDZDI8M1VCbzw1Cit2NS1DaXJNQFVAbHEwYj5le2dmKkIzQWxKQFhvdVlmfVgjOVBnNl48dH5oV1pBb3FgaHspPzdgV0dQSW1XSmwzNjE7dnxzWEV5JlB7I1NPCitoWntlfDhweyprU2hLVnxfR1FLQkA5P0clMnpFVGJAWEAzJil3KCpzSjRzM2orV0hNPWlaJHI1XmxNPiE3WTJvbztMTTZ8S3tYaE04VyZrCitFOE5wLVEjbH5UKUk8RiQ4fTEmenZYekItQm9GQmdXQTFJUHItQXE5WHtvJUF0eFEkdiltUjIxcVBRY2pjSmE/SigrZ3o7OElXTmw4I1VUCis1JjRtKS0jN3VneX0lP3R0JXl1d18kbE5RXjw2TVI1YHU5QFhXdmNxRUo9JH1XQyh+LSZsc2RkYz1aLWVTN0lMLVBWWmIzOSM8STdtRE5PCitMVUklRitQJkxaV24jcnNRMTMtSHc0cSNJNG9QMnY5RWFjQDlBUTFocTNlSWM7JjgjOyR2bl9IWUopNT0wRllkKHluKkoqVjdLMFg7d0VfCisobk5qY21AQCk3RG9pfTRPPUJZNzNfKkRMeTI8SElZRUhJaE1FNiRqayhzcTlifXlBfXpgNVVENCZseTAzeGJiQXRXKjVkOGRoM01vXztBCitJPT13KldwT05sVipfWEd4dXFGIyMkVTExck56az5vMVR5eSNldElfR1RVYVdvaTEhX3UzR2E1N1FMbiM0VlNZdy1NOUd+KUxkTSM+V0VBCit6ZjhIU1NxbT8tUW4kSDlSVXo4ME9sNGBPb25tNW5yLSlrRmxuM3whKm0rYDdCcEt3LUUpbj4pb2RMWjg4PmhfSnYzNj1fRXpjJDt4PjNoCisqPjdxNUNEVkhJOENeOHNYV08pVUhsZGdFT2ptKWd0WkhjSjhvOClQVHlnZiopI18ySENMMkMpY2AmX05aN3ZYM1dMQiNRTj1pXnRWfVkhCis7cnBkLTsjWndKKG9WKGlIc2tHPTU9endyS3RsK014eFR7NWE1bSQ2LTh9VHxCd0l3WkNEO3NPc3UrfURWTVZxKnl4aFVvPjE9U2h2THhVCit3U2tLWD0rMkZ6dV9sMTNDUSpeVjtYRkkjfilKY3d1NEtRLXQ3WDgtKShIMFJJbHpCdkN0KGF5PUBpcmdYOVlBPztJbXUzfCEwMiVlSFlWCitgPUU5aWc8UTA+OWRuPH5RMUslPFZZbDRheiFrTVUlTHF5e0xgRnM3YihJWkFQRFlJUndVZjxiJmtPZXwkbll0Sjw5dyUwcClibllSPCMyCitSWSkzPzRucHdBTXMmeSRJYncyaG48dj14YHAlcitYZmlSSm9hRSFNUzQkWHpgOU1ZWTczMHA9QzVrTGp0ekJDcT8ycnl0eUFzWWwydWY0Cisja1ZBQHh+RUhpSSQmKUpseCNyckdsZXQlO2RpKT8wOFQrQm1CSjNoMSZgcTZTXzdfcTsmKkI+M04+eCRGeDkrdFcxQjgkVXRPMGhXIWxpCitVa3F2IVg2ezQkY2BUN0JFTURpbHw4cCZKNnpabX58ZTckKlI3MFlgRlE7aEs9dEkmdlcoKGp0MnU5bjxFKllDfFA+MU55MTE4SnVKJEFMCis4RVBXJVlzTjJQa2VzQCRqXk5MTWFWNGBlOUFqMTleYStMIS1JdCN1N04+WWhNIXlvRylYQmt1QGt8OFhSSGtrcSUxbDZ2NHZVa3ZhMmAxCitAe3JwUmM4TkNDeGI4OUE5JlMqKntRYUR8JCF9JTZeb3QzXy1nO3tsdnRjYmxLWDNDamk8QnVNMkhoRURpTFk9cEZWVHlVMyt1TyFRcGQrCithMnJoaEQoN0NfaCRuZ3pMT2s9e1RSKWlTPClDa01pJElOcD0+RHt2fXl8Z1o4dzFpWXpHQVVKdChjcSl1VlEwdXpFQnskeUpaMEUxM2I8Cis1cno2aTByb0NoI3soNFB0di0qPjArYjk1QHZedGpsSFUzPXs2cnx8SFpTZlolcShNaCE5X3NJdzt8PFdIWGw0Jit1WWxoVHFzdjxwYXx4CitsKGJVeUJaRmEkRSFyUzBqLXF9entlQHtEZmgjVmhYWHVnRyFyOFJAPGtDdC14WlYtaWpQNEBoKWxKUzlWVjtrWWl5JklIdDc7K1gyU3EkCitlSl8qKihPVWlXUz5vSkZWNkd8S3EjSzI5I0BsNWZNd21vQEBBMSlFVV5ITld9WkFxIyE8eF9xdG85angzJktpdS1sWXtKa2p0QE8zRmx9Cit3cjtUWGJeMW9gSjVDQypRQFFvT2wtdCp9bzVLeVoqKDRwQzQ8YmR2c14+QTV2bUBfdFgwZ3YmazZiY2RydjR7VDw7KiFlNFlPNVdVfEhZCitpU29CI1RaKXIhR0poal8wWiphdVV8Tlc/cmY5WU98bSR0TCQtRnZwempYR0dPPjVpNm9pO0o1KVRnTD11SEsoYEA8U1A9S2J2KnVGZylCCitWfUAwWm99RDBaZSZnKmx3U3o2IyRyaSk4aFRiODZzQC10QGxWYFM0PUJMPUFIdEp2OGEmK1NGNnI2WihJP0AzaG1qTDY3ZE9ENF48WHR4CitkWT0tayowUE19Qz5FOyt0cFY9IX40MmBXSntYfDNCPkVrRW1vKm5ZdihlRndUdEN1ZngkVk94UmNJRWFMR2VoNntSfm1pdj8tQm5SZmsjCislPiQ7PVZOJU1CYXQwcVh8MlhTPV4tbn02SlUzVUl4TzFrfTVzekZWMGgjfH04KXhlVDUhSEp7SWc9aSZTQHlTX1dMTnspSWhNbCppKShkCitUamNKVnV7Sz5HS0dFX1I/bnBhQkllWmxXPEBgd3ZsKygxXlNTQihkJHRRa2MrRmZfVyYoaSszNG0qIVQ+Uyswb2xkITdLUlc8b1ZVfjNsCitYJj9uQHx0bTg3Y3YjSCVXZ0J9Jll4UCRsJTgyc0JBLWZ0Y3gxYjs1Z1cxSlg2QXB5Xlk8dnB7Rl45V25gUCMmO1E3eXtAfkBgK3dxKldxCitXKzRXNUxkRiUxVCN6M04jZWMrJDhfczh3PD9mJEY9d3BYTUl7dUo/djZkVCVaUVgwPiFxQT96Kyh2YjAwQ3g1KXNeWD0oZDdyR01gNU1qCisldiY+JXw+anUyVjgjcyoqQCN7ajh1T3piM3ExUSskTmoqflpoVlAqaiQjQEArTSFMTiZrMGtgIWB5cjxlc0c5Y14+VFJucyFFazskUSF1CitZSz5gNDdzQ0NqVGMzaykld0AwYlBiPGMhNnlWIUwyMTBedkNgJEtocTBnWEJDPE1mZyFXOSQxdVkoKFpxZklDdz9Nb15xPjZXNUAqLVBqCityPCpDX0gyI2hhWCstalNTWjJ6dFMmKUNTRTQlMz10T2NQfFBCeFopXngxI3peT2tZRn1pcXpTJj5ZMX5QX0ZKdD5sSUtfNEN6NW99bH1qCispZmRwTkVgTV8oJClSTmwxQlpOUk5PUiUtRkJjYHtVRGl0WSE0TWNmbEZ+QCEqT0oxVld6RCpHRDZwSWpBejQ+KjhYejs1TjhZK0IxbGFFCisqNXBAdmpuTFZfcU1iMFB3Q2MlYF5kVHRpO0dpeD1RNjtWeTI4eTxVcT9BNmdUOGRjeGN2NkM0JHx3JW1GbHU9KGRIRi0kQz1AQCNfdT1tCis7VlVzITRrKG9GMk5se09Rejhwc31gREpyVEBzTDQ+a30rfEdMI0Z2fTR9QipXI3FkcnVxcGQkaXtMQzs8eXdwRlRgamA0QV51SXYlP1UjCit+fVozNGl4biFsbUJzNmcjYWRuOFpvd1Q2WjxvOTdrQ0s5fGBfO1g5SWRJbGN8aSlSJDVjaFUyQVZGaUJ6YURSSFlpJkN1MHNKbnxYXzImCitMYkh5PVE3YWB4UUxUbCtgMTk5LUl0VmRGdmE9JVF3a3V3VWJWWTAoZTFWe0ZXcm0yO0U8MStYeEJeS1ZFKn5VdTVWa2xHVVNvOShWXittCitPPXtJPyQ3amxVRHs/Y2UqOzVJe31KaElBJFg1aV4kKWF2Q299WCklOXUkUmNtVEVMKVpiJUB6VT1EdzVgQE8kUTg0P1Jwd3Ixa3p5QHZoCistPHVSTVRyZChYcmFsVW9JZGAka0RfOENDO1NZSj9CXjVsQkdjLW9LMUcrZjNSSi1hUURMfVVWb3lVYVpPYHJqR0d7Qy0pcXFnaktmb2E4CisjKig3IVU3YCpIVCYoYlBfXk5kUHFuSWV7PWdmcldkKjZyISZeVklnRyhIWEhObHFJbmlpdT9TbilhQDFSMXhqQVljRDlqakZ9UXNRLUFoCis+TDxOK1dYPW0tOTZlfHR5My14az5lI1dPTElAbjNrNSkzQT9kSWNPfDFLQHg3ez1Oa3tkZ0VIU3g5MH07R3FXRU85O2tAfXJ5czslMV58CisodlBeMy0+V14kUmVQJk4lX0gwME4tamV1OUFtekEpcWopNm4kU0VyI28xeV9lO2JHfWlXSmc5ZUpoMTw9N3I4cF9aO2xEYz8hZ2BnQmolCitlPXpfNEZUNjNKV3tOfD56WGE4YjBDWDt3bXxvYkAzdzJWeCMtK3NmfWdkPk1hX1FlZEtxc3p7UGA7dVp2Nk1+cyhBaFAtZl5hQjt0Z2BjCitaUHcyPUVmVlpLRHljT20zcGA9cjJOQjhOR1g8aEo2T1UrVGJNSFBuMlB4VCgrQTdAKVpadysqbmozQzUhfVl9YT5uOzNUci1Dfm96fnN1CitgIysyTVBKbSNmZUZQKTcqXnMja0BiSkVRbWgtMTtkYld8IWpaYmM4ZXZOXjZ3QG9eaXYqZWBZazFwRlBQM2EkbUQrS2pJZWdjY1pBOSUwCis3YDRmREFmJlY0dVd3cCM+aHJfdiVte3N2fXZVMCRQQXwwJmBPVk5QMTs5QzN2ZSlNKEladiNhcUpUX3kzIWJyaCF0U1FrSzk4TkxQLXpsCit3ZStOVzFON3tGTmFuOT1hUlVTdWAtNlllbztVUDFSVntxcSRRPnBpQXRTcm94KH5xVjx4eVcjTWA4MUlHPHg4T1VxUzVxTkllM1h9TzxZCitWZTh5SytEZ2lSJlFubjhKdVVqMGBYcUx0VnVKX3R0QF5wJX1tdWZDaHVBOyg0QTAoXzwrZk1YJjkwZ1dNMn0tcCpzWk87QWtyZCR2NVZDCisoRkluSHpGQn1sLVIlLXZYQWI5bFg8NTM8Wj4qYmA5bTs3S0NaUkolM2tJN1R2NCN3TXRtYCNrQUp1RzsmeipAYik4UFYmKj4zUmBIUjhuCitxNihIfjJOYXZvcEY+LWBOdCVNYz9tcShWUFBob2tgOCl4dWtLP2hZVVVSfWw7bDhkX0pEKlV3I2NaPkxWRT9SZmx5NDNfdDhsM3Aod05PCis2KEV4LWZVS24hOyNDbmNqOTc3THpmVDkqU3FOVDs3NyNSVSREKXNiTm0rOEBYYzV1P0JBTkN2JnVfNGVUbW82a0pNcFJEQHRHclg0e3s/CitySGkmT0V+bEV2TD45WjxtZV93d1V3Ni08Zy1fRV5QVyRXYzxtYzxjdXlvYVluZy1aSSt+STBzcEdhKlNhR3dMY2NYRjE5dnEyYmE3RHw/CismayUjazdxeStFSm1UWCZsRU00WX5QbWZmfjBNWm1+Wll3SHpFYGdJMy1rWkBOUEQ1WUl8MzBrKXUhTVZRQyswMXBybTc8TiVga2NzTntHCit1SDlTSVZtTjJxTkNZZCMzV3xyPC1NNGg1NHFEMkJBMGtITXQ1YWdmXz1KSEROYld4SVE3YkJtMjs7Q0poT3VqKXZvcURCdyROMHFfcW1qCis+O2g/fEx7VDNeRyhKRkIrSEsoYFpzPm5jdDN1cCpGbEp5TWRkcTNuV15SSHYzWFp0U3d1ZlBgJExTeWtvXyM/dlJEbF9+VTZxWCglJmZyCittVXF9bkNJTlV7RU1ENTVRO3A2TXJlb192bFJBTEhlYVVJaDRuS0RBTH5nRDZMeXpsezVjSDtrZX5JJUp6Q3sxVnxBZH5FeypkfkdOMl9PCis7eVNQVUNDYWBxbkFGdyhxfW5XPyRQKTdvRm0zPm5DNV5BcW1zaF9XOGYwSylVOEgxQUp8LXk0ZHUhe1RvbCFtaD4wUXs+eSp6d0xRc1NtCisxZ0Q4dTEtfnR8QUEmQkhsVUI4eVpyayVWTWFeUCpAKlIrek4lXmNHY3RXdWBIVjBlX0RFNjZSfjJWZTFXNX52T3kjQk5oTkw1fHFheHt1CiszJmBXdEtLbkJUel4/dnQlOW9ZcWMrKjhSJDA2RkVReUpQTmZCcHxYdGRzSVJlJTdodiVJWiVreFh9PndAeTIhYk1SX3R5WVhDSmtPPyllCisrK21USCNlVXB3TExnYHNuSjxVa3tmYjQmZFNOIUtNaDVzUjV2RytnNkQ/YWZTcHpOaytQbHtKdV5LNDR8bEFrP3V5eTdtM1NLTnx9U0RiCitPKno8OStrbmtpbSFgTDhmdXZFX3QjI2YkRnl1a25nbV9ZSF93WjIyR0s3MVI1TntsdVRuNnRDRDRja3leZDNSZ2dfcTFDJT0+PFJJVEp7CitVcVdVVUJhVUBydWROMjg+citiODVXZVRhVmktNShERUVWeyRhTihPPWFsVGlkUGAtPlQxQTBKJjAzT1VGZTNpN2pDbD55ZDlzdGomalhyCiteKmFXZUIyQ05vTTMpYFlvPm97ZSpmUDV0flVjMVVIeyglRmxQR0U0ZlgkQzBBdH0oOTQhailzUCVMS2pBTVlMNC04O3p7Zl9+UnBGSnNACitGQFVsNGdhRjJBQ2s4T0tVMyVJOCN3cWBRM3Q7VTBtR0oqfDBPS19YTzZ8JkZzUXx7YHtYWXZ9Qj1vQG0jQDNTcTdebTw2I3dofj03XmhHCitHPENPbiUwdkxCY3xET1VGQXRtcXNWKCgxPXFPN3tjQGpFT3NFSU5hTmZ9KU5KaXNGS1RpSzVCS3BmZmxxP3A3OXszX2BJPyE7RTZOZkl4Cit2R2hIYkJ2bVgoI1FaPnc5cWl1O0MmT0ohejdYN3YhM1JFbFdve2h4RjFlVEQlKz9mdV42YH5KVE1BSjRobHgjISZWKyYlN2JKT3tBMT0+CitmKCUxTmsyd1V+S2FeRHk4Y2dvdDYkVGUhVVhpT1B0K3JJS1VZSGxqQl83ZkJGRjl1eCZSdno/aS01VyhPRnJadkUyLTcpIShjIX53Pi10Cit4WE92KjZUe0dII3h3I1c5d31rVV5IeFBgMmJAPUw2WlpGezNzcigqcDNzNzhgQ0ktaipndlI5RXoqeUk3MF9ya08jQ240WXhZYl98VEdECitBN351SzRtMXZRST8hMG80PlhxTWtJMXlPZ3wzc0dYUk1qZUhkcWB8KkpOYDxRKTI+VG5UdmQ9KEolaVlKa3k4KzZASTMxRUktcVRfQ3AtCitAN2dhUl8jZ1dGfDt6KG1SYWlwPU1JTVVjbzlCRkpManheJGFqdXd0SXs/ZmtYQmFLN3dCO01eRVk0b1VmPFZzQ30ofihCamczM280bSNgCitDeSpSY0BqWUFoYHJYfXIoKk5hR31AQmFOKSNsI2V0PC1RcX1OeiU3cTcpP1g3eDhoQDZMR0BnfUBHPUF3ZyhzKSFwKHp4JHRNO2ZeX3lyCitYe3NrMkRyTT9OR3RtSnVRd2pLM3dtLVBlVUFNI04+PkVtWlE0NipmWmlRI1hUK1MqNyUleT9GPmxiQ2B7cyEqdFZoOG8qQm93dV8qTjMwCittaDN1LVQqYEtrQjZZT2B5R2NHWXc9MDE3N2pKeV8kfShqZWNaUGlYSGBETTJSN0BUYSpSd0s9aXt0LShXODxldUg1Vjw8RStmclRPTWNPCitfVCR2PE9+elU2OXBrSm8qfE8leitEXzZhTT5OdTg5PCFkMExhSCNXVT5GaTRqU3c4UVp9aj5DVGJGMll0aXtKOSlaT3x0aFd+PEpPT3Z3Cit9YDxxeGJIWCZeYiN8SjNJXilzfnt6fkZ9VylQTXo+QSFPSUMjPEUrfCopcEV2JXc2SC0+JGJNaWlZSHxyWVI1cDU0Mio3VFRufGFvbl9iCitvNnBTKyRsK2UzJnNxU35yY0Roc1ApWVRIV185bEBwM1BsenFocCp3SDVNfjFIfi1XODtgKktBZD0zVjJZNVBzMi0oeX0+a25lYzIrbHdyCitxU0d0IW0+PVVGcDMoIz9wSjsodGR3YVVwOHU+OXBfZkFFcHpNNj9vR3F7eU1LcGY4a09ISXhNNmRkK3djOzBYKEJ4VTRsU007bGtXJVNgCispYTE/JWh1PWRod0FlQUx2XzgxPClONkY/V0Z3R1pnOWktI3pnOSQ5ODFXQE04VzQzTSlIOWcmZXhQRVhheihYejAtMVduSiMhYmJiRHJ5CitaKDtFQytQPG17R1paQDJoNi1LdWpgPHo2VmJFPD8jRnJWfSV5e2tLYHhAIV8qRDw1X3gtOWMzczwwaW1rTSZgKkgqQ1ROcEU5ektiPF4xCitvQHxTM2ZhbFRvY1l+cjJGdl9iNk15Y2ghQj85K1lOJVIqJndXXylRIyYtYSVDWiN3KFZpMlhSZkZBV15mZzc7I2FkVEpVJSVpaWYwZmlDCit4RnNzYzJSJSU/dT1HaF44ckduPEs9KEE1fldNX2NjejBKWF9leS1lcnpVMlF1c3g+KGl1bzthemt7SH4rYDZSWHheUFhUfHttVHQlOEJ2Cis3cXZgKVd0eUo3V3tOTE9RJmxFc04wPEhVIVJCMC0zVGducHooJW4lVilDdk42QG9YaDdReTM0UHB4dm9CYHhtZnFgbXswVyRSeyszPlYhCitKZXh6KmRHb3gqdU44VkZSYTgjJm0zbXdrPm5lTCtwaHJTc2VgXzc2SGZkU3RFYisrM2lwY0RYN1ZFQC1DdCZWMGJieEk4WmQ+VHlNRDdBCitKZFZNXlFrT2RGNEh7TE1gfDErWGMobFA/VERidEBhTm4+VDEzaypaK1RHVkw9VVBOfjlwJjVrYz98en1rK080JSVDaGtxWTJETH48JEF7CislWkMyTX5ARWlAa1FGdSZ4N3UzcWFrTyVTUWMwM0xvdmUkan5PWipyT14qPDNxTmQ3YDdKa319QmA+QVQ8M2plcmZZcm9lJCVIaWBSQEw3CitBSkBRPHJES1dzeGFkKTxTQ24/MSZAX0czPU8yYzUjakslMT8lI3FjKXw8YXJGXzNgRHpGOzgtTXdUSzFie3B6TWZDMUhRWTJDIVEyQSUmCis2KGV3M1kkeSo+UG4/Wj84NGpjV1hidjIhfWBVNXY8bT0oJV5heXVqbmVnPn41KGtwd2N4UUU0bksxeWB+ejVVbjAxQD48SVAkb3hkbndeCithR25NI1hUeHV4a3AmQ2IlVX1BTEhMTHl3ayo7cE5WM3chWmwoQTY7N1dyPV4kNlAhM0g3VVkpVTRwJSkmV3M3NzFtSkloQTducnkoMFNaCitlRStaYEt5ejRFVT98X3EmRVJeJTVMUmlzaF52LVMway00JXZhI0paVWszdkROfk9WZDdqdl51YTRWPTtocjhoVzZ4TSl9UzZJezVzLXBYCis/Wmc+YVZDTzA+MWdnM1FFO0lxazFpUTkyRGBHVG8qdGRGaVZPPEMoJmRZQDhYd3BhfTwtRFhyeHBfeWEqVn4yT2VeRVJzRFAxcEh+Kns5Cis2fk9NTHxre25SVy0qc2g3b2EwVHMqK2RwdD97bHFkfEtRKyRDTDxMdn1OOFAyY19FJkIyUmMrOEpxTzBaeUxJb2V2UmxDZXA+dn0/flJHCitAOHdZaGByUnltTDQqalM5M0tGJSh1UDZJQFJsIXBfK35oSUFgOXptNSg1KTBFYTtoM0RPQG9lSXlsd1IrUGR3JDJ9TyhMVXkpZWF1RHM3CispM0xOZUZuKTUlJk56aUUkbnc7T0I8R1JaWW5XVFozc0k3MTdJaWBtTWk+VnVNdFdQKVoqYH5UckpJS0k+VzlRU3MkJSorN0RAbGJ+YFY/CitTZW1UaW1vTThkZ0lZdFNpVVZ2UG0hIXNQd2R+Smh0JUR3Uj5zMzVoU1JFYmYjLTlZK3RpZCV1LTd+Q2YjdUxGJVVTX2wyPVZATH5faH5tCitWRkFGK0R7elN1UU9LWSFgbDxhdC0jR2JOY28+eSNRVE55JUxGMmVJQG87RmAkV3IoaUNgZnRPWV88NFI8JjkoaiFjSmE4WF96SGt9X1pMCitkPjg4WUAqX0V2VW8+YWV1PWN7fmFnPnNJUmlfdmk2bFktT3FZOHd+TCZiJDxucyZ5OGo3YHxnSDkzPztxcml1KXBle2hSfTtqa0B2Ykc7CitMey16OUxvdU89OWdDYHsoRmhhMFFGVHE3TDk/bkp6R0JPaTdXVkpkQW54N0J8QHpQXnsmUEk+SEViU3kzU05uZG9DfWZBRiFsX0dfcmpxCit5KUtFcURYQm9KU3ZOezYqSCFePnZ4WWJrJGA5U0hLM3F7cTJrc1goJjQjNl5tdi0+ej5wcFh6bWozTzwwP2I8MnVRczFUS24jMSttTVdHCitJTFBqVTdXPEcyTStJV0xYN2smT2hwSHFgZTBJe15eKER2Z1hIK0VXczZ1WnFQJUhTeDRwLUtpN0hGQ3AxRFlEY29zREpNblMyMDxkdjM3CitaOS1kZi08MExpQzlEKXhRZVBMYiRZeEAkRmphQyZKKyFxMGJ1d2JTRmxPUjc/ZnFUO01FRk1rKVgkJHckSS1TRFBpOEQ3YUUxZylBJT5tCis4SztaNGxXKyYlUUQ7TGI7SWhoRHJtZHU/VSpnZE9NYWZYdHN4UUlnQ0c+aD5HPURpbms9bW9HNVYxXlRrS0lqQnhXWj98VVk/UyhTKURUCitQdFFIY019fWJNRShCSX5FU2QqRX17XyplTzd5QVo9dUdAQWlQRUtBdiomKFU8IWBxUzdLS2B2KTBiQ2AmI0xCTzMjYklKMm9Rc0tMZm5PCis1cHgrMjUlY3s0WkBCeyE/fDZlZipicEJCYSlIMmFlTzhsOz0zQ2tBPyRjIT1mY2dINDlNNXB5JXtnKUxIaE1Vb1hMSzg9Mm84Mj8hTUBLCitfXyNXMmQlYXpTdlVzNV4/JFVuclNHYzRCSDNhKWFySVg5d25hZkBjPllpS0tENWMzM2pHRChEV01eVUpjTW5jc1BIOGR4TlRjMT83PTZxCistMihSP0ZBQ0x4SyF7Z3FedGxiU0BjJCpFO01nWTZPbCllUGQ9djZgODheSHo9SkR1Sz02WHpLWj9Qa3JHdGptbEFyUFVoWCZ9R181WiFgCitCKlhzaXc2Q25QNjRpd2FFe0l9ZlkzYF5RM0tCdShlWE99VTJ3JnA3RUxlaytefnAyfXchUUhSJXZNSVArXkZELUVOe143VnhxUEpnQlpUCit3WUxUK0U4dTBxSVJWZj83NlU9RUpQVD82STFrdj5BJEhyfTgpMTRmWihhYSlqLSohNWRTPVpSJlZWKjZCOSYxbE9SYHdYUjB7U0s0SzxRCitOYz9feTZfb28zPmcwPUtkWnc/aiZkZCQtanJtSW8wQytpaW5iNj1eM29mZTxYfC1YXmFkdnhqRTFrP1hoSVV0JD1XNCtHd3krKFhCdTRsCitwUlNMP180cmJ1bWpwQWRPe2R5O21fTXk5YnEte0EkNXZScUhzT2lQOHVVMEVibkx9PD5kUHtOZ1h1KE5VUG1afGNxY1M4YX5gUzxPN15nCitVTXtQVVIpJnpvWUtXZClDeUdgKjdfQ0lqIXZwWDY+Rldqcnp4VGlLb0tXOEcmRT8rTzVzRHlEX1o9alBfST1CYChpKlpXNHgwdX5fcFFpCiske1h7OWg7X0hlO0stdU12QyM+M0xaUCs1aEFaZ15HfS07cnleZmZJaTtsJnxzRytqezJsbVV6RUhLZkpCYUR0NC0zWEE2Q157QUw2QHR4Cit6WTlmPHI7P2ZZWT8/Yld1SFJBI0JIYW55JDE1LUA9clBeKFVSM19RME0ycWZHP1d5KTI7YF9wZmgkNHdyYFN0IUMjSGRhKHpDUlUxR01TCis2ITU7ZnZwSkQyfVBCa3prT1NeSz9QJSRZTj90dVVJTDN9VjA4OVV5eG1uPmN2LVBIVHBSdUMhWjVzUTFPekRsUXVTMVkoWXwrIUMhYnNvCitXam1zJXw3I0lFQVpXQWdePllmP1AwLVBHbWZwSWt4ZUJZcyZNYzQjUm5aLStBfD0hYndZdnVBdjgwJHtgUjQ1I0k3T1kjZ3s+Q3Q7eVowCitQNThBUnhfPH1OanBkcWZCdjA+TXtRVTkoSHtFI1ZicDAwaGg2NW5qeVV5fjI1THo2THJ3QmxMNXVucHlJITxUd3tOZXApS3BuVG1HZj5aCitibykheW02MXlrJVJaeWFtcnt6KiEkdWJGbX5Idk5JYFR2Nk83dikkJWk9dU1wI05wRSQzdCFrc1Z6Z0Qjb0AyYENkbXN8ZD1fdChicWApCitofTVSVTRmeXU8Z3BXSk1NUEQ4KktnWTIzeDwpcWZzQVo/KDdVdGFzODZZK3FsSEdyOFF5QVJXPWQ5LWlXdW1LV21qSUJDMUBTKWBhdSlyCitQSzFFWUx4UlVZPmktKjI7fkleYHFocWdWWkIldiZjcm9oWH44TmVpeXRuUCpNJkZuYj5Xd25JJWZDNm0meXlRPnNjWFA+cl9aKmQ3KlQxCitgQi0tayM7Rz1qWVZGNzM+e3NJSzJYS0JHbXMhKXxpaG91V18zJmJBc30rVFpZMXhGa2JZPUpUeiNXOyEoenR3bFY0JVUxVTlgU0NPJmhpCitvR0puMjVDP0IpKyspbE5Ac0kwelduUlVDfmJzejMwMTVaIV9lSDdhNUhFd3UoRDs7WERRZE0qdzNFS0NecCV4WXxSI3A9e0ljeU4tUnxHCis1PEZpeVplZThzZ21RODJZUjZALW82dTZuRyEzeXc2MHh7QjQtTl9uKylsMHZNdVpqbzE4LXtZJlRzLW8+fHdRcmBYPXdUUFc7eVJKN3hVCitRQzBUeWU5VDRobiM3K1c+M15oRUVPN1IyQVFnT1Q2e0ZWcEsoZyt9WDA7Uyo1RDUtVktrYkUpMVVLU1ZwUHdjWHdQaFliP2RgMTk+bzlVCithayNpNmZ2LU9aYiNLTnFBU1plQHIoYCV5QUJzXmJAcW5abHsoZTdzNXR2aVkhVnRAYXFGNWhwRCowYnQ+UDtUX0oqMXlZPWtjRFZ2RFk+CithbypuemhyWjVXQDN4N3ItOE1NbGp3fHwzUld5WSEtYWBLNHZTa2xPNE9kV0M7SW82ZXNFKD40SE8yUiErQ2xTTUV+V2d6bXJPd1cqMyYoCitGa0Ngci1GOHIrS3J8VjU0ZzxOMSNZU318bXhHeWk2Tmd+SD1qViNkeHJ7ZERUdTRIUGskdjd0O1RWNWtuMF88czFAc1NgWV9wKnA+Zmo1CitURHRhVkUoampQZ14tQ0dyQnpnRHZkI31qY1NqQ2BESD9kR2B6JipKMEtNYDB4ezF5fFlZYTkkcjVmM0AzQ0heZmF9YGtGUUpWbGQ5c3ZwCit+Xz83d19HaSEzenZxRFApVm55VEQ+fGo8OTkoR1l3fFlxO1g7Uk8kPSFoUFdWV2A8fihqRno2aXcydzEyUEZMeX5nSUY7JFAtRiFEQFhfCit0e3pOTHl4NUNoTzJTcXhXYzhGOz56KChKPEh2aUgkaHtSbXhhJnFXbnNQfmpFJXVvNmZMZVMxMjRIO3VyUkgjVmlMYVk2RmR1LWgldEhaCit0OT9MVEJSOyFlNjcjTHx7LU0/PVpufGFaRV9wVkg2amNARkx5fHllNUVFQit3KzhkV0pxYDJ7bXJ7P3QoOGpQdTw4b0o/bHpoPmM1IUMoCit6WiFtTE9LZCFicVpvVkNrPDxgZWloWCRrPCRZUjdnQXp5K1UjNG99MVhMZTRQOzVLQDZVUHdOdDFvQ1ZsYEUydXJXS1Y3MyotTyNhUlRICitue0lWZHc8TT9UV31JPGx0NGIhMW5xeXBWanskZVF4OTt2Oyt8UzxoQ0lBeEN0QEtTMjR2JUp5dH4+WX5DX01YdVBNKH1QZypidFBkbjdvCitqQFhlQTlIJUhNWUBPIyNfemJBUD1KKHdBKmw5U1QoVCRzY0VDPjt5I1RsJHhvRnlSKzNkaz5EUmNAZStqb2c+VDZ3ZmNGTTJBeV9DelohCit7diNpK0lvI0lET1hWY0hEUFN3dnopSWRDelI7eU17cWVBdFUld3txcWlUfHV9M01Zd0R6bEZJa2ApbVNTI0w9aT9mQlo3PWRaIVlefDhwCiswNDlPRnBqXmcwNFJpTHkrTkdHTlh0dF8rUEZfe01hRjcpeVk/c2A1VFpwWTwlfS1ad1FGb1dac0BmRExze1g4K0U4Tm4+K0ZfR013aypzCiswbU10eE47JVlMcCo3MnVHdC0qUDVWVjg3YW1tcXxecGxzakEpYGRUbFVnYkM5WmdNT3ImdklIJntefUJvTXJySz18R1V9em5XeFIrdFVHCis2KylBMVZHOy03OE0hX21ibGRpeCgqZHw1UUVvSHNuaTtBR0pkZmdUTzIhRVlDTXFsKHU9RWVecCYjWFFfUiUocWlaWFhgPDZhSmAyMHNlCitaezgjJishaDFffUAwPFc1WCZGOSlNNmBvX2lOcTJlfU5AS2smKEZBMTVvLW89XktHJjF7ZkohOzk9VVBjXyNleXJoREZHZWdaTCh8UFJuCisoZFM3WDdoRCZ2QV8pN0hHMU8jWUtHIU9FejtvVFRELXR6Y1ZVQ1VucG9KN1pqSWZYJHl6Ukp6fi01KGlKUHd+X0kyUzZrYXZ2LVVJVXtZCit1NEhiRytpSzdHKWNuRiE/bi1zZF9xZzVGYEA1UXgzZWprI1gkeno3dXlxOEc9ZlpFa2J6fUI1OHglO1pGZSpZZzRza2VNUH1NdkdqKz9OCit7aFM7RkhVV1VkRGhZX3pvKnAlWmlWKFlYQ1RpLUpNY2lialBmdnY4Rjh6dzZfKTJicXpaUDJtWmM5P058SDVnUClkQmNZa2UzNH5CJjAlCit+Z088UT1hcERrMmViSVN4fkg0cDFBXzlBJHEofCNSbl56M21td2w9KFJ3XiRxMipXaCskdXtOeClJbWxRPWRpfStId0Amb0xHVnhuJW55CitKJDUobis9fGo1e2VFdEhuVDlVTTxjaVQlWFpLQDNoYG8qd0QqNVdPRXFMdXdJKTdhS3cpbEA5NkQzbFYkKT5XJGgjK1R7ezszU0pjS31gCitnPWgwVHYrSys4PSkobVIpU24rSTxGTDs7Z1dIc0xYQVpVJGBCckpQZShQODVrQHRVWEAkaU5tfSlUQVlYZSVGaGkjTkRZOHVscDZWfVFiCis2TCNxQld2SmZiKERVMi1felpCa0pLTENtWU93UmgxbkpsTDR2bHMze0ZYSVZgPH5pJlpxKW41T2JpVCs9U0hgRSppSn1wbDc3eCplYzZECis9YVFANEYzMiNXPGUlJjIhTnJmVExNU0w5RmdXOTRDTjQwfTtyTGN3STZjXm9aXmBgcjZmdHhTajIrVXttTUZqNGY+KUg5fXglaT9iM3QxCitaRTVtNW17b3cpZ3FtQyhFQV45e0MrN3UjKyFQR1BKOXBBU2EySi0hVjEld1B9ZTQpfTJ5KCpKfHF4PEs3PUVnRTlHTSk8T0c5SXpXZUE7CisoODByNmFxMm9ZP0tzMD1wNSVzUSg1d0I/Y3QpZys4djdhczAkUTJnbUVAd1pPNF9aP0lTXl9McjcmVSgoJTxmVkJ6MGByem9jMG15bl57CitoWHRxPEBhWi1KOCQmRiZEUWxnSEU8NEhteiVtYU5ReDRhKVF2Mnh2NTZJTWNJSyp1YFR5eCtgKz9FXjlVZE1zbUpRdWU+YTxjSGAyKmA9CiszbH5RQzVMO3h+THtEa3JxajtFX25MOSh7OWliTlFCMG10IXA3dVcwPms4RkhgMHl1YGRwIWNaSUpLKEEra0ppanprekQla0xQTmQrQHAqCit5QT4oOSlwMENmZGR9ST1qQ35aayVBZnMwNlh+Pz0+PGM5YTU8LUgwcXllajw9N3g4bzFlUndfYTJnVTVoOFZ+eSgpK0I7V0RSNVJFTDFBCitRY3lvOU1BIUckek5SYzEkWmMrUkRHZHIlIXRCKE43SypgajU8LUt8ZFZQUH1wQTstc24mOX1jZE1SVnF9KWNyUWZaITtseXd4eWEjMm18Cis2N0RteU1TYlhGQE4yZDctVz5VNGFUQFhzcylhNl5WNGNpMSZgRT0lNCFVPzghO1BuNGcqUCY+ZzZAQVE1XlJ5JDc4MXI0aHo1X3Mrb2hfCislTDh9KTY0ZE9UY25ybDFORTBganJLRTtqY3h8Vz5Gdl5KcWllTiZAQWhoVW9vaDlfOWpPLVlaayZtPEBWKUl2cHtLJHQmVU1qMHNFWUNKCitDQXpsO1BjZCk3d3g9dzlwSHopSW9OIUsoLU4zNCFnS0hAM2E2T35jdCpYI3swYm0rfi1LUj1sdSQ/RSZfVDB7VVZzSng1Xz97Un51ZmsqCis+czFfQTc4SEwpPHcqVG1rRGlTRFQ7eFo2JTN5OHQpUjxURT9SNFZMOHE8Z01tS0I7dHxWKlpHcEgreTNPZU8xV2pjYlpMYnVfLW5BMW9uCis7UnJId0drND9DKF9gbi1aJjZzKXdRKU5sOCYtaHN+I2RvT2R0VzAtNyVMO1pGYXQxOFY3N0tNXzAyQmR6d28zJDtzYSRgMWJgMjZobDhoCis2X3lqPHtPPXBlVENqbkluNkd3aG12WCNlPGVnZ01CQV5lLWAzazUjWEFfP2BXQ0VlPT5oZ0A2Jj5ja1VJdG04dHFmUGFRMEU3RlYkOFhACittWDVDJlpgYj44YHdMdytCemU/UUZ7VSs+dDJJNTk2SGwwKkI0eUR5KCpURW17ejk+YVB2fEg9KTdWZWNkJGJQSHFQa19ZUzcxfjc/d1VoCitKVSpqcHI+N0FneDs1STNVVFUtbzBIWjtUYl4mT29MQXl8VjBUPUQ3KE95RCgmS1RXP3dzbDdLM2hvPCowdHNVPDZnMDMkSTE3PFV7eGFfCis3Pnh8dUleMjFrZGFOWEJEZ1k8TzJvSlRCIV5vMkRwUE1PM3EyPCtTKG5JdmFXVnEqcHMpK2pNZVM7OHFBR3N1SHk1T0lwKUh1RmQ0KXFvCitQJDBjRmV9WGcoKlkoSDBXVWs0S30wZnJHRUBRPGdvc3czKW10ZjlmY20mK2BaSkJIdVppYz5aajYkeyhZTTU3Vn4rKTMqLW9CKCVkIUZpCisyPXVqZG14fHRfdHtLSWZVNmFOc2FjNUdvQ0AxJkF2Q3dwRG93TDlzNmxHSkF8aUxgUnNHRCFRT3o2Nnw8Pmw4PXJje1MhYjZYejdaOFElCitMcmUmYXhMX3YyTDJ3fkpiJFM/cn0zT3xQITQ7ckVMQ3J4aEt+P2VPQSpDPDdGdHtRdXBkenM8TUJlKCM8LX0+bCg2fkNkR1VEa3kqKnhECisqX0l2YyNVPGAtNUpubzJCaExhJGc4PEU2KUlqV25YK2Q/NE9LJSpALXBUQnw1S3MhbyVTYCk5KlJtLXNPWD4qPip8VHZBLWw3SW9rKlYyCitTXkU1RCp2fDtuJmR2VkpJITY7Tmt7Pis8VyM8fDhGciVYK3VwbjhzWCkwZjRDQDt3e3VwcVF+TkU9b1N8JCEtK0VKQjZ1I2J5dDNJYksjCis7O2tUYDxmdmlQTy0jWnVTV0hQcnYqQVJHY2JxJD0pMGBLeFdzV1p3emhnTEclTUlESEtROUxWQ3J0QlRmTFpfMyR8Pj57MFdRUXxmQzByCitFe3FWaHMpUXNWJU1fREFAXmpVNVBeYUZ7PzQ3YTxpT0l4YklJMCtveFNkVm9UZjwyM2s9aCZWJkRxV3VSUyZ1az1vcWQ+Vlc9Q19NKm1jCisheEwhazg+WW9iS3FNMFd2I3RWOGQ9RWEhOSNII1R3QW96d1gzWj0yPHktMCMrflFJZCtpWXFHcXwlPWg/WnVeb2k4JVIlYzFOP3dWVDtYCit3LUZUKWApZSV4NGVuTyU9b1Upc1BaMVJGQ215Rzt8MD54JiF4QWE2Un1CKXUmSU1tYG15JGxpKUJ+JGdkaXopVXUjPjB7dGlXa1g+UiVPCit2dnMrayQlNFI/I3ZvRnJSbS1AVG5uS2hzU1gqKmIyaz9EOVd3PWZnJE1RcnM3Pkxre0taTlpyeGkxY2VWOTxTRWZjTihJPChjMz9iUXpoCismTD56Qjlsd0tPMDdEJGRFYEYxMjR1aEQ+fWArVEc/WWI8ZFJWN1N0Q1dxNCp4ZVZkKTlSWURmP15DQSkhMVI5OXpvaDgmeD07TkNjIzFeCisqTzBKQGhGVFFkTlg2bXhHMXJCRClJKV50M0xoJmdye1F7aVNkOHhZMyhaVFpwdmIwWFpWKy1+LXx5e0Z5KyE4NF5BND9aclVjej0oSHM1CitXbUZrcDBCd2l3PXFWWG8kaCtxNTwoTEFrdGMmVkApVTNQSVhHc1NQN3lVJHdQQlYqPX5BSUJfenI4ZFBQTWc0ZC1Ndmxwd0twMlg5NUlVCitFNEhZM1FENylTN2g9XlFiUiN6WG4wJXVgbkdaVkshNz0lJUImcTwrQnVZXm0tcHFhfXZ2O1d0MEZ5JHdxKmc3dmA9R2xiRG5HOUhPUGRGCitxYipvaXJGUC1YQTVrZXttYVlyVUZMelAwMCQ3PjVaTnpkTno3Kl9RR2xzJmFyPnQlUHBiME1VVSFnJnY7SSpuYlFEd2cqKUBzKnI/cy1pCithdG5gRWslUlFaXjtfZn0mUVkzcmxmSTg5d1BXP0xIVz00MDF0VmVOMHlAVG9UTHM1UHJMQ2FCcncmOXZ3UHhnbChhcXZVbHJRKyhTJTMjCisrYWpnK0JFNUxMOCMySG49SGtgYGdGK0s/fG5nTyV9Vjw0TyVjWXBEbyRnbWFVWFFLJnU9NGVgQlFsejlGezREQnAhT0Bnc2lZakBNP0U0CisyZldAY09RTn5XUkJJM0EySHdKUGVfY21PeiRGZm1gZj9VJTJuRShFJC1UNCYlOF5NR2FCRE5Qaj8hPHV6VGooJk41QDtpV1Y+a20+OV9KCispbi1xUylWelVZRHB9STlNJHEyMjxiSkZXRnYjK2VLMmwrcHdWbFVwREM4PXBkVGpgQUQjY2wzb1dLelc7amFhLUNpQEgzTWphYnFNbTQjCitYcj18T08zZVR5SHJHQ0xpRVorJGNVbUFnMGZIQUJwS3tlKk0kIUhHPiE3MWcwPTtPSF4pM2dPPU5MQG5OYkVwa3lfcWR8MTRmPUtuaSk5CitLVFF7JGUrWC0/T0JDRjA2PGpLMV88Xy11Tjg9XzAmV1hVQVBRK34ySilqWkBuMU9eJT1tX0Z2PWQ0Vy1pdkchT2xCX1R2V29ifWM7KzZOCitOWCEoVFhAfHgkRSNEWjlHWjhnWUp2b1N2RkkjKDhZZElYRSl7OUZVMXZ+d1IhMDYzWXxVSz9hfkBuPD04OTNVNTt0KG1EclVQbz5CNjVjCitYdj8jbG0wa0xsRWcoN157OFFRc15kMiN0Qk5aWS0tbGFMJDViMEdVNCt7MlZ3cEk7JXM0PTsyU3Awbj09dUhoV20qKnM3M1JDKjQwMigwCitvckpJRjs9TEdVRmM4RzlAMiROYW02aCEzNU90I0M7KE0+WDxnMmVSbUdgUkFQWUxJYTY+P3h1JE0xPH0makxxXzNvREZsI21HaV9TaXVTCitZZ08yRU1vYyQyPXRMJEZKOzcmTChUcWo/b3B4dVByI1Q3U0xodUlVJXhFaDhObEZgNGE5Jj0rOGxYMi0tSX4/SiljdU5wRj16WTIpekpnCis5TCZjJD1OO1FDQVRPekBlfHxKfFdCTURMcUZSMkpHeD8/QDtuYDxgbjtjSStLK3o9PTs3P3skXnNwWGooZXlQWWltUEJwdmQzaU85O1hLCitxVFpqPlkhKWo9MVg+QDRkM2VuUV42KFUyMSg4QUpEK2JZYUU4TXNjVGc4WVRKcT5AXm1IK0JxakE5MHRzbFpnVFpIQSFFbFZ6PH1TSFQhCisyS3JeOCFkaUlmWmsjY0d6TG4yIzM5TFNXWCU9eVole2J4UCZtcz5ZSSgtIy1XJVN6SEtSN2tiYn5+TDlnalVvbnVtY31RU2NeSz5RKUM9Cit1eDFkUGJyM0VGd0pVSk08QVE3YDNPS3Y1am5DP2FmXmpWaXg3WXB8WXF4ZUAxQCZsUWFKbzwkbDB8RH1nZHtjXz9Ed2IqX1NedTJ7a3g+CisqYnUwJCFTYWBFS2NIZVpsanVFPnA5ZEJ4Pk54LStBdGB5aFgrQ1gpJm84MnptWWxoXjk4cSh6JER9aGledSNTQSM5X3ZXOHMzVWx9PGw/CishRyV3Si1SdUFWOz0+UDRgbFVKUCFuaGBqdVZxbGtvS3chaH5uOT17cUwjWTUjKEpsTjl7O0lTbVp6S2granA1UiZgRXFWeT1rM0o7VjhUCisoPU9EdVhDNyVKIV9XXkVjdT4qSDl+USRMMTAwWilsSH5fY3RqQlNIP3E1P1MqX05uRDJTPGU8dDZQOXIrJWsjZ35wN3F8Z1BwblBAZjNQCitzcW5yQkh2PiQtQHwjcUVEQTI/WklLWihuRDxPXipJNXFGNmdpeWUpRX1BSU4md1VVRkBDSmFYUTdYbyhzOyRjUW8zVjJ5UU48KDRkNihDCis2d0RFZylQKkNWUWhTYnNPUCZuem1LNTl+TXJ3JVhadiNsQElnJSotej4lNUtSfiQpfVBILWUkST4/YklYJE1FbChxQGsyTiQ8dXhVSSZvCitZYWw4Y2FSVUFqRHJSNXlRYmRtRG85Z2hie1IqcXdgTiRES04+TEpiSV8kSm8oYXZiWkRxfmtjSWtgJT5weXNsRX0mdkJlYm1veXk1bVEzCis+RnhQLVdwPDhfRSVIODh2WkBqOHk5ejlGNkV4RHhTYDlBX0lBRD47dGE4PklANDw3UDxkTHFwPzYjYFQ4QTlmKyRyaihaclRhKnBHJEtxCitAamdIWm4/aTJGQ19RRFU7KVBwaDhPS0kzNyl3cmdBKFZhWHJVeiNhYkg0QHA4biZJbGM8PFYyLUNGOT5EU1NpMkhFLVVCbjU7UTlZMEA9Cit5fT5BRV4hPFcxeGx3bVVXSXJTJEpaamhpe3JSbkJXPmIlSFI1a15UdGEqOyRMa1AobEgoMUNtdjleeGZ+QUVWUzBabGF4RWs/UGp0M3c8CitsakNkeXd2cHFaaHt0ZHw5UHZud008RWB7QGZnSHxJRjdmJk5OU0VKQkpSZlZuVFIpeFZ8WCYrPVF5NUBjczBsSU5RLW9XPDlVZWg8OUkmCitlcEshYmNAcG4wMWpgJXVgdVI/cWskSlpqaG9hNV5lJiolOE5oKzg/MWNRcn1yPEpjZ1Ytd3kjSitfYzhKP3h+TSVgKUx4NDZXcGFTRVd+Cismdipje3xHO29MP0lIcnUmUEgqUFolWSVYeWRBOHdOakhhfk5sRGBWeEBTbGZjNy0+R2QwMEZNaX4kRD9DO2xMOXN0Wm5LVHNnbn5ednd8CitTZX1nb0RqfSt+enJNNjlxTz94bEpqemkyPDg8WlpuX1Q9KW9xMituQmdiSUBuQyRIZERCYjhFa2FpTSQydlR6LTkhdTg4cF8+MEQ8S0laCityT1JQcWFefU00WXpiMz51OGR8dklEb1FpKnJoTWRFRiZJelBMblp8NWs1NXB0cWxyPlI+MmlwQXJEN1J7ZjVwcHhzO1ZiPSlFe0swdzJGCithQUprOC13fFZOREB8dnZZK3w4MGc0WFgpU09aSFJSQFUhT3RCVGxFNkNTeGNiNnNFUlN+P31iOXZjOHxoMUtUXl9xbWtEMkU1SzVvRjYxCitUIUxvPXdRZzNaMTY+fTROcHh6dENxPDhJTzEwdUdge188VypGVTFDNnYmSFpDd3VrQk1RYEJKKHM2bVQhZmteREohRyNqZ1J1PSFmSThiCitOYjRkRUFUVy10NUFDX0pENjdIVVN+VCtuckQ/TnhhRnkwc2hMOVNLQGRuZzA/cXp2Tm16LVJKN0ZxdC0pVCo3azFgS35Td3lXOUBgZjRECis2YjxAOyZrKGA1Yz9naUIrZlJOO1MxWD81UFBIa15vVk5ucTd7aW0jJUVXPSVjVHhpbnJwe0FKeFdQaik/YFFgJk9GdnlXeGc4K1lSPVVfCitBNCt4REJpeXFoSHpDVkp6bVNlbUskLVFIV3s9LTlvR3UrQislek5gIyF3Ymw2biozYm1CbGY4YGJqb0Mrdyl2ZWdMTyV5RFU/VFM/MT9DCitWdXgrSW9eQ0l5dStHcTUrSyRfNVkoSkRZVVFaZmQ9STVES2FFN1lWM2EmSiQ8e3QhUUQmRm5+UmQkRE1uXy1LNW92RzBraEkpMEJPfHdWCityRmNqfiE/eVhobnlUSEtWQjs2VE5mcz9sN01hUWd0aXQ0U3MjMDkyWkBCJmtUc3tyQHJzOVJDSiY1cDA0aGA9ckkmdHs9fXE2bUl6PDt4CitUIStgTWY0YDN5ZVQqP3RqSSVlTCt+MmRkKWtLNE9PZFMzUXZLUWh8aWEhSU8pMTd8NWZLMXxScTY/T0pHZGJZNG9FNWx9VXZZVEdENDB9Cit1X2M0YTVuNVR0aGc3XlR6VzBePmNGZ0Y3Z3Q/RkYxbztUWmwlLVhaUHtkdE09KHRgJDJLIXY5fiV0TVckXiRsTnZKdFckbihoM2p+MjJuCit9T0Y7UEpsZCVtLUZuflcqSyRWRFdpNVgtVT1tVVZ9e04xI3IlUzc2V08pQik8XkdAPmJJWClCXlpwKUU5bSo7RCpQOHBfIXxqT205Ris7CitGSFBjWl5CNWY7aWhaSFAjWDklTD9gQVc9ZGlmMl53Z3E/ZEt8aylJeT9vdTtoV2R+NUFvMnk9PmA4PFFiX0htZlpuJVB0bUR4cEwoS3tACitee0p5aTJoRkVaJFZ+Q2FnenUxRktJTigwdFg8e01+LXZFJkkjTndGJXNEUG1NR004fWZrfVNPP1QqNzQrNWhoJUV5bT1WenE1dmg/dTlRCit8U1peNHpuc2RPbTQxKmdKKVVgdE17LWZUT1hebTxFdl5tN3Q0eGNGeEdAME5gZit3WHZNbWxHNTZ1VVR+V3dNZmR8X1B9X1lDPCRzcSRQCitLUVRCKlZfTUJta1FfXmhzfFBYYD8ldkdDZW88Q1FMeUpNZUh3I2F3bnVoXzJoUUBjNk8wYGxYTmQhNmklIVdkaXlrVTtpNT1fPys8djFCCit9WmVLYGBQOyk/K0BWMEJZJUl1T0RnQGdnPXtLWmx1WHpLO2BodkxLXjk0SVJ8fmZHZ2N4YiR4Mj1scStZJSklYiR3YihQSGMoeiVoc0pMCisocHBWUndzXllNJCh7VzVgflN+UnJDXnwpZkVvY3UyeHReQVMtXlAkSn0lJXAwYDN5PGx6e2FEYGx0bjYwbUI4MTVwYnF9X1kzJkVmTnUhCis2TEJQV1R7dmNxM2ZMXntGYmB4LWZmSE1XbTZmakBGWDlhdm16KXU3YEU4cW5JLVAmezVTLT87TT8re1FnOzRBXnQxJDs9cjUmQHFUQE89CitUZDIpSVlVbExHIUNwdDZJSU41Q2luI3xrKUEhMjFOdTdPK1ViYXNsNUVhRXBMZDB7JGRtZ01kbXU0bSUzaVRmaXMqalJNWFRhSkdRaTBfCitGPT9GNXBATC14cU1KZlFKUT9lfitrfW5wXnZBPlZsNnE1aSZCTEwlJnghT2lrbWtgN2loalpvZXcxVyVyaFRFNUcpZ2g3ZVdkKzMtYXY2CitlUXwqP3A3VjRWMDd7JEloK0gzeGQ1aztzYm5rfUsleFc8Kip1dXNMNXc4TUwzPGpSS254XzdPZTh2SDg9R1ReJWdlQVBUNXslP2EpRDQ1CitQQDYrP2g9cktvWnktcX1uRlAwV1Q4TkVnNkQhRjhBMTAhSyZqTnF3UHM4WjhDMC0wcGgxZSNORGUmailNfE9vX0NCIX5+akJDWGVSQ2ZyCitTSyh4JFBPTVdKVUptRGspez9LTHNffFhEYVJgOGljJW02ajs8LXE/b2tPVFFsVUA7bTJMI2F9a1ReZ2dBI3ImcCZNN2U7YSEyaHw3JTUwCitFIzBvYkdoNEdYd3RsZXU4WjF8S04+SlZ2M0I3UEBDSm1sT3o+S15fd1JhPV9qVFFiVlNYeyEtIXBJbjNRODs/ektGSGJ4KWFINHR3T2l4Cit1Nj5AUiNXYiE2Xjt8N1h5PSRRX1RYflR4TGR9NCoqQHhKSWFPSlN5KVVxdXRoJlBBaTBMbyVWaHEhV0dPNldJaF9WRCopVDBMej5mKWQpCit7c3kjMnk4UWZUMz9vV1NRNiRxY3lkbjlsb25HZW9BSFB4WGIjSUEzKipKb0ImM2U8bG1LQmZuNEhiP2R4I155dm11MCltNXBxY1Q1fn5HCis0YTh1RXV5YUtJYV9YND94d0xYbGFoRUtvNm0+M3AmaFpWdE1mdGloLSVVPkc5dCg3KWl1fCFTVHpFPzd1KytvNF8zdFBqJkNATzFBJjFQCis5b1BJNHlrbElSbTQxc248cmVrOXtKWEBzZCV+QXU/MHtMe05EYnBNRlB2Ky0qQ2g1KVZUfSQhWkBsVjh1cjhmMVNqQmx0VEp+UFdQcSZwCitBJVRPZ0U7KFAqaEEkI3RgbHFEKExIcFdyYDxROGtlfiNgeiNvdmJZSXpQUl8qfWA1I1AlLSEjOC1BVTJjV25BaChkO2Z9NTFKWFJgQUg8CitUcjNgYzJDZGEpbEo8RmItM2wlMSYkak0wMHc+WmIyX2d3MU9GfENSIU52UjdWQH1LJiRie14jN1VpKD0/YDNtaXtUdHE+JC0xKT5CT0Q5Cis5QiszUyRtdCNgWCsxJU9wWXw/cktJKXg4dCM7VHg2ZCM3O0FJcl5HPmUoN0UlRj1nbHorRVJLTCE0dTNxRUFaeGg+P1ZPdXc8Y1BoKXcrCitZYTgjZSV3VyE3NmZ+QE5HY3l8dEd0MW9ZRnNWMUJrJkJGKzxOQkNWN313VHZ2IV5ofTIodWlyP2s4P20zdjs8SmB3RFpvRnQtPXg+S2JuCitEQWs2dX45M2FlVVZHYjFMM1c9TEwzdjsze2NhaUQrJGp3MT17S0RLI25EeFRrVTVAVnVacX5eMDMzQ3ImKXx9PCRKVUttdGQ0VXw/Y2lqCitBdCUlM257NzNOTENPb2Ulc0ZlazlPWigoYH4+S205QiheKCVVd3xjUTg0RXs4YihAaXg+QlZlOzNCJGc3K2dfbCNsNFA8fHljU0J3eV58Cit7UHZtZTRtaTEqRz0/RCpeTjJ8MnRXQD1DUTslWUl6U3ZLZH1rNTVzdmY8Zy18d0QlbGRNMndrPE9nJl5HdV9mI3R4cDRRYjx8YzhpT1BiCitJMEclYUctQEFIQnBIKEooT2Z2Yz0oSiY0QGhWWURgTHZ6XmtuISFmfThXO3J2eDl3Z0Q5MHNFUF9obnAoS0MoQFRhLXFGVnlqT3F1WSZ0CitkZFFpWntTfiRGKlZJUlcpMVRydHxEM313Yl4zRjslfEFKOz1EKGYle3xrT009NHR3V3gmJGExfDhEbyFxeSM3JHw2RmVLdWR4TERQeWNRCit1S21QZl9wUj51Pz9ZMmMwYXlLPkt1RHAkTUhAQ3ElJHtLKDkxeHBLeWlYVkJqcTsjMm1kRCk3YCUyeilBI0ZJfXd7a0spbUpwMGAwSFA2Cis0V19Ralc4VWlacVl1ZFJSbWpXXiRWYDw9aFBgYC1IPmVFODlaamhpLWFgU19FNll+NUN8ZWFGc1N5Wjd3ZnhCdE13JTBxe2JSMkBCYntLCitUaTllU1kkYlEodkNgPmcjVyt6ZGlIYSszJGImUUw2Yz1fVDEwRW9VaS0heDhFO1p0aVJON2BOfCh4dVUpNF47b3xEJS1vYGBlPkUtUnl3Cit3KzR0K3JFUkpmNSVQJWZ0fFlxYj93JCYpMXptdjtFPipaTGlfZCQ+cHgpTnB6eSYlQXxpKzBGKVY4TWkwRn17P2k/TUhHSjgme0RRI3xnCisje0NhdVdAWUQ/QUdHOUpaUyZebUVxTGdqU0ArKFRsLSM9ZSF3Vk5KVWg/MFR8R3lwb3wyWH0lVmA2bzJXNT8rWUAjQnBONkRCNTNubWxGCitkd0NPV3UtZ1AlbXxKTDNBU0VONiMyWUVaeWhwdTNEYjIyfk8ldj1VJFhJKX1OR3hLQjMlO245QEUxUWBnWilTZD9uZlhKUHJzantEblE+CitWWWI/T1RFYTUtcTROdUZ6KmsmJkk2R2s9T1QjaFFfbWpyUC1XT19xdFg/PkVoezhuVi1KRUxxSDloTSl1UCMqfCNFYzgpYjtvKyZaTVklCitARlR4Zzk0KjVgYzJiVCteN0dKUldpeW5GMmNCV0h5NXxrbXh8bUchb311b0JhR29AKGMxb3A+dXNDfEI8RW5lKHZzfChHP2RMTCZBckw9CitPXlp1Zk9aenpDbnxBOUtJbShwKUZtZTNFKXE+PmVufiFyQkIwaSNyPjg1RzkoaVctZTYjcm1lTkdSNUJTNW82LTc9VFcpYmR9ZGAwR3pfCis/djRMeDk1eEhZQTdTPWBuRWZETzE3aWNRIT1GfF97T1E8ZW0oTzN+TkxLeiQwUFN7TzMtJU1tVCUycT4xKXkyWGIyPENldkpzdCkmNHU3CitFb0B2RGs5Q1lIdmMkK3g8bzd0PnNyWjZXa2VTUXd+O3J1cml7TFdAYGZzSn1UcjwxfW9aclBVMEJsOW93RUF1SnlDRyNXbSFRKSV0OzZzCitqSWojcktjPjc9bGs3ei1QaEh9V3gtYW89YyVHaiEtSHgwJH5nWS1FfHVYNmw/PnJoOyMweTk3M3RadUJ2UUAjJDwlVlJHPyE8QGpYIUdDCitpNCY5M0lNKmVuZUsqaCtJZDNOYCtzNE8jPUtoaCVBNX5QeWQ4THNpfWp3QXJYcDtSdW1iWFhedHN0dyNpVy1DZ2pYKFZ4Qm4xbnVFcUVDCitiTHlgKEF3dE9hKUhAK1RQQzl5Wl84I0d1UWdqVEZiQCheRU9RK0JZP15KY3JDMXlaN04zJk1qMVZ1emg0aGcmKG5OWWwzJkpselQxV0BPCitWO0N8ZSNjSCNwclo3NVZFZzFyWGJWO3thYXZkZn1GSD5yXiQ7bzE+amhobTN2WUYpK259OGArcT1Wcng0RWpTcT0rNDZaeVN0bFBib1hwCishVyYoVjtlaU11YHImdj1tSDcxS0MkRCt4fCk/fXZHdmdmM21FRiZ9X3hvbUszVldrQFZXbmBMQ0hQIyRXakBndjBHM0EtJipzTGtER3YlCis1JkVnS0UhbygydTJDTTg+d1ZnYD8/NUMoRyU4cWs1d3s4PnlYc2hUdVBQOE5qVldPflZ5MmJpQlp2dzxIK0dwJXtoWDBqfkUkZXljN1Z+CitwSjNvQD1zTm90I09vSDVKNTN3VjUrQj01UWFmMzslKDhqP0xQLTJYS2MoWTJDZTFqeVdLUil1YmA9VVBvaWdNSz0wYDxvMFFuWmdXam1OCitWV3tDVz0+QTNOdDJUJWh2NClFdk5eQFpifWxaQDM+XzVAJHh7QDxXbzR4UjJDMGZzZk92ZmRMTyUzQ0VIflhXSXxWRT1HcU9jTy0kMko/CiskOyF4MVZUbEJ5MU0+cU93Qi1RZmtjTGojY35mRm8/dyFjK0BiZmRRPjZuemMpKWI0QV49Kj1FT2RscXRAWTkwKUdYSzFzSUA3dSN5OzRtCitxaUprcTNZPyhINz8wfjQyKTM7QnJLQUlGRTE/RW4oNztnMDZxWXVjS25WQj02PCMoP2V2WjBsSFkmfWd7JCM9X0tUYjMhP255VSNsJjRaCitla2spfDxhblhMPUAtYTVZN0NYSE4zUS1JTXFTV00rWSMxYlhUbCQ5ZnooNEhnJmRYPTdfOC0lZGc7SEc5bUNRczIjSXNHRS1vMEk0fVpnCitZa0d3RiQ9Skp+KXR5OVdle19zQHolQUEjKWJZMF5KSzB0bFV8LThDbThgUTxCYEMlKndrWGFASiYxcllSLVlHJU1DPG44S1dtIWdaaUliCit2QylaQUk3T0A8M2lkRGFZXio7cGQ9a3FlTXBCJFpfOzcxcztYXjt3fFB9eEpfcXwhQVIpV3ElbTBGaEl7XjZDUEcmKFBUO1opQy1WbkxNCismeGBtKXMpKmtaYnpRcV5wRE0ya3JQKDk3TyhPRio4UjgxYEI3d1dTTnVVKkFzd1dBSVJGYzVTeyM2KHNeMFpjaUgrJlFGdGYyMjM8VzdSCitkMVhPZjFgelFOXzZDKFJkaEJtSFNQYldVUWBqRDx4Wl8raUBpKiVqcE54QX52dTBzTj1KNX44dF9eUkI5RCQ7fGZoSCR3c2Q+SiZfZX1uCitIc0lsUH5lX0AlLSgpZFRvJWdaIUkpe25+SWwyI2FQcD8wWEBnQ3g8a0taSGZMMXkkTn19Y2NVTHFGRWA+OT19RWpNd3tpSGZMZXRoRWwjCitzKDthSCNOY0F3Q0xVcVJ7dmRPe3k9Xk9qUSQyV0lMajwxbDR0fTR5ZnVfO2ImRl5gSC1NZzYkelQhanMhJmxKfl5QU1czXnZaYHdITSEpCityUDFiTztzU2ZZSH1rbGszJWMqe3ZibG0zMD92UkxpKGljZjs4R214Kz1Ea2JgP0htPz9saXw3NzxlSUV+Zj9MQmMhN3IoREl3Q0hZP2x8CisjMH5TOyEtYVMjcDV4XzV7K1JyMm5FYnYkVVl0TVJKSUs8PW82Smp9SXx2eSVqMVo0Z2Z8bWlfcSlYfX4ocShFUT1ATDFTYld5fDs5KWswCitPMkxsdkEtWHpFeDA1VyQxeCpiVzdxQ040aT9vajFoMGQ4Mkh0V2JfMXA4X0g4MClkYWZBKC1iYXIkelE/TGU3a0NPYmI+WHR2KFBRJTRECitQJG1jPUB4RVNMWCZTX2xKUW5CZSE8Nyh5TmVeRjZ8PkBLK0xsRH0xUlEjMkAxSkFMM2kjZCF3REJlOXcmfjxRNGVsJD5DWjI1STNaRTs4CithSV9zOERvTGwxeypYcj5PdjtZO192YSFSKUJGVUEjeWFzflhaeDEhPmxmYmF8WW1TZlYxcGl2JlBENHcmanEwemo2NCR2aDwkTDdwViZDCis2S0d5d0BPdmYqNmZxKTlxdEFCP1RkODRlOzI2dFU1MGUzPDd1akxxKmVjRWd4bSs7bFFPVUJIYmlhcEFabjBGSjtiTCU7cHN2PWhxIzk7CiswK2JMaGUzMVNEOzEpMiUmJjwqUT16e0ZreWhaVSFtZyEhRDBtR293TSFMU2ZaSE89TT5wUF5XenNJMDB7czZ3bXo3K0FaSm9TYj1ePHNJCitkVjBFZXVAZnk7YD9DWFRmZDNPaD5pWlNyTEUjakY1XyhKIyYkPzxrQGdFcjVEYlFxIz9nZ0tvOWI9Qk0kclZIU2MmNWREcm9KdG10QylTCitCRWpjdzh9UGA+WW51a0k5d2llTjdpOTJyUTBmOXFUcVB+RVowdWNFISNIKDh5P2RHI1YqbWQzVlYoTD5QbyFQajF2bTZlT09QJWZac1A4CitEVS07JFA3YCZTIypHdFhhZnlndWIxO3B4bV5CR1NpbEhuJXRwSVBKUCtgOzNiND9nWVRYJW95KSZkVFJlbzkwQD9wZGBHbGt3NVZBbiMzCisrcnEqczhmJTdTOT99QFJKZmJubDNmI0IhbStPRShkYGF6NSklMktZbHRHdndQX0UpPiQ5Y3sjQ2VtbGs/fE5JJnBtZVF2SnFXUSRkZEJMCit2Sm57V099YTs+bEoxSlRObFdxV2JHZG9FTV5fVyN6TlJ0V3ooSm0qb0FvMm9FJWlndkUlRjE+UDRPO0szdEREcUJZN1RySUxhSCtjeE5yCitwYyMpOXhhI35AWlhLQEorPzU+MTVxYjYhZ0JVZVojTj4yWnFeb01AMEt3dEFwQlRaaz8tXiVWd1VNSikhXzskK2EmX2hZdVBnUmxqJkBRCit5TXUkRGE7O3xpRENqYXxAWVNmUn5HWjQzM0AyaXAkT1pvbWlhUFhOUlpeX1I2OUpXWEdQRytvX2RucFV9cUl0bGdPKGYlYGVLbmBnQzAjCitoQ0Jha2IzdjshbUomZ3p4Sm48Knl6MWd8WkkoS3BDJWdaaHpQT2dPRllEVF45YXpmUGNSZzxVSE0yOXVAeDMjek9rfnp1KFQ+SHJYZSFOCitqcVZJY0F7bjdwYm04ZGd9ViFKazVtdnZkcEFoNHd4cz56LWlab04xQFJQJDZ6bGllVj9XaDR1RGk4OHE/PDMpRWo4Jjcrd082JUklUmQ2CitEel4kM2tzZitTOHw0ZGV0QkxCRXc7OTM+P0puQnRQTEwtWkJIQ0craFlOUnZRJGVfUE1EOyVLK3xHcng4eyFxTkBOJlUyN09yVElgUldCCitjMHZ5OGdSbmVARWxoZE8pV0hLejM8N212USEyVHx6diFheXEwQ15jMDB7eDZONjhNWkRvZlAzaikoUC17cW9UVkg+MkNFVS1CWjwyQ1JDCisoKlc4YTxfSUhXRG5TWiQhUVNWM24ydHZBdl9HPlVBKHdKJU8xKjtWaVhaQzlSODxJK0pNPyZxd0FIblV4JC1RIUBGY1pSaDVgKWw3WmdNCithTmk9SjNDQEAzXzBkY3teXklWd31rdSVaRyRVNyFsNE9pYH1NfW9hZXttYjd1MjdiRiFZcXZZOEhmZEw3YzFnfD1CTkZnJXFoRCYxJEtXCitMVUBNU2Y7P1JJTVhEO1dgV09hbExiUEA9NDl2UVdTVX5GbWRyUjkmUlFXd2gmREdqVntXI2ZGZzIkIU83YTg3ZkRGZ05mWm5sKHhVJm5gCitDZ2h+ckdFSE1NR0VFYXd2VmR7Jm4oSEstQldqV040QSVyKHJacj5DMDtfM2kmV3d5eVEqMyZRZyordUJhYColTl95TUZuI2hSKno2djBfCiszckhmYkBoe0d1fD0pVzwyb1BeOzFFYVYpfmlLIXghMnMpWD5YNkVGfHJ0eHU7QyZVPmVoNzMmMiUhRTw4VnY1eFF7fHF6bUFncG5RSHFwCitRd0s2bFpaUXB7czVDVyFlcyE/aWVZQyU9KW5ZXiV1PFlzcyllNnEhP2lTNnRLfShYS3tRJH5AQnpfR1RgSDFAZDYoMHlDITBAQDZAJEM1CitQU1F4dHp3N0o+eGJsSkRvOXs4a2FaNldKWVJgIzgjWjF7UXhDeikhRF8+a2dHR3p3I31WdXZMc3FleHRPKVItNm1UenIpT0JLd3ZeMGkrCis0RDI5TDNpJHNjRSs1WDJXO2xDRiEpQ2JBUjEwVzFmV1o3aXJIJGpVQDVWaEB+azhUP1JlMCpKV31nbyRPYmBFR0JYfShGMHdXfGImNUc3CitKMnVBI0Ale3AtZyk9fmpJVEBJMDxSSCFwSkRJO15EY2lLMUxydW1zbntLaz9HU2pFYjQ9KjIzSjYqKU9rflRIZiFjd1lSVjtTVCozfjN6CitjSl9FUjdXcylxISlaIzlqRFJLcEswTnBUMCRvKUtyUVhwfjYkaUB0RTQ3a2lSUyNRWTkzYiFlbENYPD0kYmUoS1VOb0ItfDZ7I2FDaSRuCityJXRQQGIwPVBJeCkjYndYU3U7Z1VwRUR8cGhQPGJgKGF5NkttPEVSX3RUVU9zJUBKe1lsakxwbyYxV0wpWW5hRGs4bmopTC1MSzc+cmBOCispQDNaOF8tRkxRR0FeOEQ5Z0dmdGwhXjdpe3U2dWVGSUwzKEpiXklYdDtRcS1SbTBzVHAkfjViM3d+Iz99VWk8K0Y1TGtaVXolUDBhd0FiCis2RS1sTWpqS2o4IWN1S3QqYkY3MXhvJkdPTndPeSRhOU0yP18/OGFWPWI+OHlqRnd1QFY9ODc1KjFTWFVmfGk1bn51Y0Iqd1dJVm4xQnd6CitkP2pNYGshLX1aODFfISZYa3VJZjt5ekYtQWROQ29TXkplVCpGPkpnNm1uYGBRcVVaaW9qTmclPWo8ZXgjdVpIRDVKcTtxdl9oRkRCIVpWCitQIVB5S2wka2lCfDBGRXIxV3t8JnJ4QlRWbmBNSCtuPHxleUIpWn5edyliU08hXndyZUElUG9FVl81MTdoKlk5Uk94eX11Rj42LSExZ2J7CitNK1VkXiR6Nk89bDs7fmpXJWVSQ0JNX3BzcEpYbllDe1BaWi1ERTRYaDI1OXtOOzV2NzJoMCh1RUlaenMyb0F9bTZjcHNOO2t4S0YjaV98CitVJEd1cGNWU1Q0OWJBPTBwKUB2YXB7YjswIV9rRSlqUjh1K0pqNmJDSXlVM0FqaHdCNnd7aHtPMWR2M2p8eSQrelcrIWspVlYzUnBYQjE9CitZeyEyIU91RG8tKXE4dHF1fXFiYVF8R20yWUIkYmtrZ0VjVTtkM3BDO3B8cz01NmgqK1RNUyl8MzRmNC0lYkN8aFgzcExmQWU+JXtqbzAxCitleS12dGhoT3l6S1F+YiNBZ1NaZjx1YEdAZjtQNkRgMTlHJT9mK0hxLX1fVXlgczQxSlIpN0M/KjhVXkUpXzQxR190dGp7e2RmOFBTTntICitBRjlYZWZ8SHE0anh2djxIeHd4P3t1SzUwWV4zbnhNZGtGVmV6djF4M1MyISRxcF8mflRpJj5ueztDa0BDe3BDfEhZZyhhU2FHaz4jMFlBCitEO3w1XmJ6ZmQzO2VvcWVlQGBUaXk4ckYmWVp6eFlMbE8jKzI7KHk5QVNYLUx3a2AlZXdJKGZ7JDJVc3FveVdiazRoQDtiRH51fTwhSlM5Cit2Plg3MEBoVHJod0BKclY1eFc7N2tEJTE9SUB8QzE5dzRLPzE0O15idEBncHFxZTF6Xml8NypkWDhxMHFYPWpDIWkkWVNwbG1CSlNwSGwwCitZNEcmISN8cVJlQG5vMTA8SVJZVCkrfG1eOGAjNkZqPkdeMHd4TD1DMTl3NG9eRE5iQ1hLS1U1S3R8a1FhfmNoZU1RSkNWNn1pJTAjKnBQCitVY2huel45NCo3Rmo+SHYwd3hObTdjZlNeQztgSS0zPjhvI1YxUiZYMGhJemFUbyhLWlNTNFZePCkteEM3M1FAOW1KNjZDVjdoPmIwITloCitnVSUrNGkpZEVUbEIwZDVDUStueVRmbGNSaXs8cGNgR0EkeG4yYH1gdUAoVXVKPnFXa2Ffe0BXd2hJMTJvb2psaHhQPCU0fHgqOzUlanM0CitmYUNFfEJNKDNOOFVJajloUEhjeH09VnRoJSl5U0tTbl40PDBpcFpiQXNtJCFtZzBlJVZKaGsmMDNjbyt1bmIlMGpealAzdyFqK2NVcjFlCitncThxPnFCWiReTHwjMDYkWCFlaVo9aUNEPk8zezMoRkAhMntSYjtqMig2aHo4Jl95bE5qTzdkeWlremNhMlVMQShJcGdEKU5FZDxnS091Cit4fGtQUDhaSjRyWWBKR0E3K25tVE0oeVQwa0J0QlpYWFBBbiF4ZGA2cWp4dzleaF5PcWN6WXIwNnI0bmNrbzM0ZWlvbnRJP181PEBCP3MyCitQdjhPVUJMUDAhbGs+QTA7TilOXloodShhOzlLfHNqX3wkXnNNbWxlMTNVJWFTLT8qTm9aZyN8cUJhVUw2WDRkfklPYDMzMHZyfCE/SDFyCitzME9MYkJ8My1qTV9hJFUxKnlDUF9yXjJBRU1qVzZHM1AydjxjPnM/TEJJSFRIUFhnPlU4MlNtb2c4QHooJTwwU294RUg/RFY4MExHNH0tCitafTtuMms8NCZpPGZuZ3h6PCF3e1pVUlJBeCoqTVA2cExfaik0Vjh3eV8wQHdwU0heOVJJNHUoJCZjcUc3TzV1REMpZlcwSFJ5ckJTN0IwCiswQGVmRFp9JE5yMGFWezNKbHtwXnpwKCN8TDJDUCMjdGZAUkduQTA2c2JsU0hLfE0wUkF3SGh4TG1oPGlRY3BDeEU+YjtLbVc2MztfSW4xCitvdnxSO0dSKlM0fWhQMjBMUmA1ZUl3dntmQ21MJDMyQFNBaiF5LTY5bG9gQUtZdDclM3UxVkFUTF5HcDQ1eHxrTG9KdypBQXFfc1ZER01BCitAWmNDOzJGP09KMEUkV3cqakVCbj4kb2ZrPil+NG5fNi0xSSNzZEY8QmZNYGMmIWMzM0thWWNZMUA/NlNTTCU3Wj8qZT8qMEEmRXxSfERKCistJipeTGU9eCY3YTBKc3cxLTNnck1TcGIoemg0S21aYDJlNHIySzVAbDBeQmk7cmAwWmk8RUx9fk11MSZzSztEQk40WnM9anhuYTJsXyZSCisoKGZXSE0kSX1fQHhDJiZ4MVpaXn5mckdtam49NVJWQzBPekpjOX1ORH0wUzI0Nj48RTl2KWs0NH1mWmZ4JFRwRUJXWGBHKV9mQ35rVigzCitzQkM2WEMpUFVZLSQtZX1MQ1BCZnY0NHAjSzMpOWwpcThOSC00IWdYU3pBRlQoVyN7fUE5OFMpQmY5ZkdlfHM0JWp+bEZkJkVmS3t6c3BeCitNKXxUNEMjaCswUkN6ZzxxRl95ND8tT1FgKX5gQ0wtXmJ2VU1zKkw3KWteS2pfPz13TWdtPzN1OztAKGV9ZSZ6U2poUHQzR2w+MShLYXEzCitXWD5Xe1VqUDs/O2BUKVZVeFAwWHtJM1ZOVGk3PU0/M1dNaUFrcVEyQiVnPUhnS142V3BuUVY7YSkyKXZhUjJLN28re3VuKSZYMyM2IS1ACit9Mi1nO1laVjVRVGtZWXxKNnlQTytgI2wybTl9KUJjUnktbz04byh6VzxAeD8zenpadU45aWNvUkpwTEhTNClfVXhaPGEmKjNIVno4ZT04CitTaDJ5b3xmeSFgOX1jLUx5cStibj5pKjhva2hqeyozXjhxc2I1e0N5M05fWDVFRD1YdSNjWGtIN3Q5UWE0cj8/cV5AcG5VY1JfejhUJGZGCittNWQ0KWlqPkJMVEw1NzN2K31lZ0g/bCU0dWY0TSMlVDt4aHhYRShYYUQoVipxe3hVbXAxMTFhUlk8a2FtRHEwZ1FWYWB+I2l7QFRzP1hUCismbjxuQmsqY35vITtTZTBzdjtiIXxQRWR6JjN5OV4rKllEXzc+PGIwOGEoemAhU2N4NTh6aCNsK2UjczBGMztFXk5Ie2FfeVdNKj9IQHBJCis4Xns4PDJIP35rKDJmQylGa2x4VSVLPUImZS18JSUyK01ZSGUjIXhRQDg8b3UySD5WVyZ7aERCQFI3WXhlZ0gyNHhOJEYhY040Jn1lWlUqCitvbW19UUE/R2J3Sj1YZTBYMmpNJTdlZ0o7R0FEO18/Yk84ODlDR1lfRlRMOHgjMHskU0ticFQmRjQwPTFAPmozc1Ywe3MpPCEyc0pJaGRLCitoZEFIZStNeSNHYkc+OyQpODR6U0Ita29TTkcwYkJySTUjWiRqVj9LdkcwejQ2NXI7fHs9MFNeY0dKJCZtaWUqeU9UMF80VEcwRk0yRl5OCis7NWFAUWxKUCZgQSpES0wybj9EfTt4SUo7SE1XTX5Iamc1bDB2JWFELUM/aihmYEkyXmBeKjAhUjNeeiFCfmZJUE9XNzFkZS0tYXFscVYyCit5dVRlQGBHQEp1dClmcXohOXomSUtySSpOQkZoQzVuZEtKTGNofS0kR3ctNDB7YHB4fE1yaWNYP0pEb2dQQFk7dzxCekFFZyNuaU9aYWt7CitsUnBuT0U/RW9xSUlofFI1V2BnZ00wV2B3dH1CQTRkPm9fJTBLflAhYTdBLUUzVTxPei0tMTF4NktLSTZlfGIqRCkhRHdKNzVpMUsqc3BLCitKZXA0JjxgJnpMLSpeMGY/Zjw0WiY7RGExVzMkI2cpY3hUMEIwKERtQ2UtKH05Zk8kfSNtNXRfIyNoX2NjSD0wOT56JiloVlQ9aERiKXM1CishN0UjVGorKE9rViUhT24hc1g4a3E9eCFXbHwkYUE3ME9hJXJtb29fZ31AaSViYktyKExKSU01ZW9rY15CQlZ6YiRKTXU4JWQ1OHRYKXRICiteN3d5KyRAfi1iXllnRCMrKWJlQD9EbnpmUSFgTjxRPDlGTlVKWWhkZnI5Pz9ZNjM9ZyZYRmo3UkFDdE5BYHg9ZyhpYjVJdmx5bH48M0AlCisxaHc5dytgcHd6I1lQWmRII0dmT0doZHpFMTgpTWk8UiktZDNyVUN4ekFyJXIjdUlOPV5rTzhlPy19VTtuVUt0YWBPYE9Vd0lAZz9ae3FYCit6UktNKiFUdV9tZiZTR2F7N3FOenZ4TCo8PUZDZ1hlYFYjN0o+MjNGcXlHKVkmJj8xJnJTPkQwJFFzeG9lXi14T3tzdjYtPSs1fEdkVWFYCitsKXlqSUxmIyZPelhCb2k1KWw4cmRYN145X2B9SkwyYz8zakEhfUwqfWU3bTUtY3xIZSM1OWxiYjYlWCs+UnZyTiMlUTNsPlM2X2QyYTF7Cis1eiVuZ1QqdG4ydyFDRygzUCpxX3NtcXp3Pzl0eXUmQWhoTHNyKj5McXBlZypTP2d3a3Uld2whUjMmZ2RWfndgTyQlV3pIPTlrJVl2WihMCitjS2B7M0xmfl5jaXA1bko3IWRrMnttQS03QSg8eVhLRkVCR0JGR2JBP1psUGsyTXElQksraW9XcVQ3PHdNbiY8YFZeY3VKQyFsci1IOUwjCitkNTl8VyZLdj1KVGZ3cEJxU3R8RE8wQTloYVAmVU5mfEZNRkRHeGpAZG8rdSF3Kj4qfExuOFIkb0pvVz88blZIKyNje1F3NHZ7QV51VX5XCisqIShjdmtoWUMxKj4tK2crNTxVYzMxbV4pSGNGUmx0NClIRUBXN0heRSslYU5XWGJkMi0kVXNpWF5aeE1LVypCeVpFNDJISHZ1TCs1ZFl2CityTjxUYFhpJWFgI3lKdVB3U3dkZ2xfUiV6P3d8TkU5VXFiMjZtb0J8YVNTZzBfI15VYlhzb0pBRUM5ZEtsSH5Dfmc5XnpCK2JpeT0+VmQtCitAOSt0TlpwTFAlSXg3enF5I0MhPEQ8QjNpQU03el9yTWM5U01lQkdhYyZDd0pYLTdyRlB8ZCYlT3x2MUlQdHgjYSUpPzxaTVZTO1Mob3U9Citab29xREFDSStpM0ZVTCEtekNpPSM+NSsmSHJRZm1yZm5qK1EpVWk2SXtzajM5NjQ4XzJULXYmcUkpWDBxcThAdWNlSTJUMTV2TzhXMWhXCitiaHRKTSg/Nno9bUFQYjk7UmcwQXhkSVRQJXsxJEM2bTZQQnAxR0VYREdTbk1Acl5ZUSFASjtCP1NjcXFfbmhAdFgjUjB7T3hhbEJoTmhaCiszfFlOO0hDZWxNRXFVZFlTNktlT2B8aThzcW1NcGZaUF9RRWRfcz16ZTN2WiFtNkRJQERBflB4SGAle2BLUkk7aDVJSzdFQ14+UUIxVVlyCis7NiM0M191Z0d+JkpkZ2lJJCt6RXIlZ1JNZk8lMXRse3dNTz9XbEhNbT5kMilfbXNuWkJwVVdXVjl9OzFGZk1aUDxCWThvJkByS0lZNGwxCit5UXdrTTxMVX4mKGdMPkFCbyR0dD4lZF8+PFBDK0piUkp0Y2srejkpbmFodyE1eXliOzNSMT54c0hfJm4tTW1PPVF7NWRJd3FVamdCZExICitNJnk7ZD97KTd6bHFpZ3R0UVk2JWhWKTIpX2Z1QUJGSElBXmdgNnt5UFg/MUw0bUBfPEU9Q2dMO0R3dVo2T0g0fipAc2d1RHg1ITZQdGtzCitAbjtiQFIlPjVDa0dTeSlnKGdDSzFrP0tEKyNUOGtJO0lqQE99YCFDeGoxJkBPTUpeMVBCa2I+UntZWTdlTSVCNVBsN1d8MnVAPTQmamVNCitgMHQmPGdZdUNHUm9SU2hOTyhlY0Y5YDMwWEhnKSRyYWhyfExpa3dfe3ZpbmVId2VFMCFrPSZvUHVoYDAoaDJIcDRebUZUcHhXTCtqekd6Cis7QkwrZiE/PFJEeG5iMWooNWM9UzFMUlk+fD16SUdKSl5HRFBjbnlUVjFIdjAye0E+dUgyak4jaF87bkVlMHw+dHIhdGFJZjVhLUklNWRNCisxelUqYHpsQTFJNm0zSz5BKlFLMFkmUH1sXyZ6NkE8KHpMZmtubjM0O1ZENS15dGwxblFveCU/Z19lO2xRYkBMZUdNMDA9KUMhY1RfcWIwCitHWFkyd3d1PnBNbWhOTGlpNk17MDwwejFqMygmQFU+M2lsX0NaRkEkJTdJLXZoJDtoVmNDJXtHQVlmQ1dMPHchWV95THVSezIzNWRNQD9fCitAPSlreyZUajlqVUEmTXF0ITlvKmVeNkJ4TSREYTt+Y0txRzRUZTJQOFQwTGRiQyFURyQ2RTNwT0R+ajw5Zip5Yk92eVNlK0VFd3h9Pm5hCis9d2FNQWpjfGBvaD5lUk00ZG1sdXdXRyZxbGxyNUZrZFU0fGd1NVhqTWpOazwpeHw9MTxaRUY2dSZfSW04a3Zrd2g/anEzeTk5SmY4YVIrCitzMj0zV0soYHlgdDJtMH54aFNCaiFUe3tFQGZJRH55NiZgdmdMSE47SDM+K0p1KVRLaipLPD5fWDREUDdgQ0poZXlOJmJFdkkqY0YxSmNLCitiMUp2MTBUUik/LXlib2NBZmItWkJCKmJpZlhASlhZITJAflN1PEttTSNCWjB0eFBNdGRYYDFrfUZGJFEhYFVfWVNXeHJ2NylPYV5xMWpZCit9fVokMHgpa2JaX0RULTIzIW5edjVMVjteUHVAMzFobztfN0AofHk+STlNQmpOTzhTcmxAckM1PVE2Qks7V3MhTztuaiMwaGNuMn19cVVnCitQaWByZjBBeCs0NithcEcmK3dSK28zfVRAWmZNeXh9IX19JSVDYGtVOz87ejgjfFY8NWFlKT1Sa15GOCtKKG8oPms9VDkkOTg4emJSOD4tCiskTEpBUz9HUlUkZC0mKzJncm8jUm9aIS1OUTxFViFhIWwrWEgtKjsoO2Vjc24mfWtqK055NylKSj0tVzB6SXh5Z1N4a3JANEYjI3VUe349CitPYyFafmB2Yl9OdVc1KztRaipOX3JaRkVtYzhsIztVLU9qYFA0blNqKmtoKCRGNz1LYk1kWUtzQSoyTjxSLUQ1e1hhZzhVOT93Q0dNeiskCit8OCtmN1cwTyZBPndXc01NTGB1d0w/YHdtYWdMT0wzcG9SUGtjSWZNUE1ofWRYRFEpZ2EmZlc4aDJxOUpiUmgtU2BDXmRWXnMrN1pwMU5xCitvfl5MTmpNZEUwIzI8QDwmJkxCMm4/TChkVS01QFVeSlI8Jik5UF50cWVzRFk4QntkR2NoWWsxUkhnYkxid2c8PXNoMkdVQ1c4T0R5P3RYCismaWE/Kn5NaG9LRn0ka296czYjJEBEV15YVUdIaV53VXExPWJuM3h0WFo+JHkhaGdhV1prLVRPanIyZWdBYlRLeE1qOzByWW4zfUBmdnYhCiteb0A1eFNKPF57N2RkP1JGdytncnA4MUJISWRnYGJKJHNoYSo0QzE5PWd5SmVlbSYyMGdOcWswbDU1d2xrKEhNeWNATkEtfDhReiYybGFyCitDWld3ZlFQJXEycEt1NU8jST1hVzhxa0VQMyhodGRDeHxLfCNgXmJhekk5VytnbGxTUU4oMHx1Q2dAK0M/NWt+Wjg9eG9kVEwtOyEmZDw9Cit3LWh3JTQ2X3ktflVxWSE9I2dudTh4P316WT57b0clQSUzcGZRfDVaSWp6VVJBaD1ndko0MkN8RjVJfHFhZThaQFhNVnclcEsxM0xIVSpJCituSk5Ue2tGYWZqdlYqTGkmVVpAPlEkKXdncSROOT0tYlgwbCZXTD90e1Z4Z157NDF7WHokSV4lfj8wOUBAMlMrYnlVXk5hIUdNdWg0RzdMCitaYj1vSCVPYFUzNTc2eStxWX1tSWlPUiZMRWNLR20jNGVDUGhYWCl2cztfYXtrblE5ejBoS2l5MVQhSiFsVU9Qe0Jgd29OQlNLRFRzblpzCit5Tyk9elhCZ0Q0OXdBKl5nVE5KbmJPa2ZTOX5SYC1yJnJqWkwxQjJhN1IyOCNFRyMlSXRWYkE9Rjk/M1ByPntwM1crWTJneEdxS2IwUlVJCitoYHNORlRsT09idDh+ZU5TYDVgPnRwM0o7eFpyYVk/IyFvKGkoOGxSPTdxUnspZSplc2JIfVo+SHt7NmRtP35hTHpBNl47UCt0YnElU3tDCistKUN8KERUU0k5JDQhSHh+Y0RnTGtleGVCXkl4OUswIzZ9dnwpeytidEZjd3ErZ0owRzd2ZkJ1SkdlKTs3YD16R3Jte1BXTT4xTmBRfmckCit3NmxUemRCTz5DXkErLU1pUFdQJDxHaWp2UDVpJFBeJng7MUxRO2hkK35rbkFnfWJ4OXtEJWNRMWdMUl8kJnhZYHtKRCsleChQX3lPTUteCitVcHRqNDkzeFArcVB9PSN+KipCKDRXJUpLS2wkT3NPVUd9ZF8hVVVQMDx9PnB3UTJMQn1xflokb2xRRVc1PUd+ekoyP1dGPU5LeSZJWmdVCitKVGxVV0BGTnxfMytBaHJfejsobXU7NVhWdUlNKV9EPVZVKnEyVVVfWDdLajs0fXxuUzAoQ0dGWCQlYFN0VCp4cGRAPXFIOTVfSFhae0FGCitTS2V9bnRDZFQqby0reGJrX344ZHlSYUhmZzl6RHdaVkhuVTYoRWNvaGRFdmVILWRuVkI8SGtqeHZjKGteN0VVeXEmQUpzVVJ3Uk82amxBCitKO21hdEJwSXpeUDBtZmsmTiRQaTRzMEcmPTNpZ2Y9aHxHKXFLSXxXXjRXdl5ibmhDJip5YDAxeWdYaGxWWkJifD5OSVlQaHE7dFIkbjxQCitZTj1AI15Zb2BzSjVqR0JlNX5mMXZYKTJ4YWNWdWZQNzwwT2pydnBlYkZzYSl0aSgraSQ7cmBzdF5lengoZEhaeT5KQT1udiQ0MF94alA7Cis5Jilae2o+YW9LODB+UEtJQzhpUHpMJEtKZHI9LVV6UzcwPComSWNAJmBPU0tGRComPVdMSlBLZzBqZG9qYUY5S0s2dCVRR196PSpzKzgwCitrTEJha3NaJVR1eld3JUZXPTA7ZFBDeS1JQGM4bEw/OENaJmBHRkFnNGVKaHVJZTczTzt+KD03Pk9hTU54UEQjVVd5WEpDe3NaaTxxQzM+CisjQSVCTWRgdWNoYi00SEFQUUJoSTd1Xmkpdnsyd31XaDxeTz4jfXg5TWczaXE5RnM0N3wkTnY1TSpAd0xFK3FhTF5tNkluPUc4fD5WSFVQCiteVCkpVU1sPFpaKCpsJHVVYUl7R2xCa14zbmZ3NDJoZj9VVzl6cG1nIzlPNWdhTih1Pyk9JER5dFMtSTgtQns8bSkzeC12TDhjcXIpYkUxCis8b157OXJPNXpuSkVqdHwkLVkxQGV3Sz1LYUBTZjZZRmBHMGljKGt6WHRhQz0ycTk+NXFCKihtNl9YcEhVaWZqTUNeTWxuJCQ7Ry00bWZ1CisjM2B1QVZjcWVQfSp8fnI3S1FUZGlDbm4pcWpTNlh6THZ4QC1LZ0tVZFoxK1ElfHJTVjBvR0dIS3BURFFYMmF5cSg5MDRkMnEpO057NF85CisqYEhIZGYwZmQtcW0raGtidTNOWDdYT3puVUJhQHdKUiV+WkN6T1JFbG1ZVkwyM2UzN0VKdyY9T0xBYmtXMTM/Z1ZZJEtia0xAbXUqJSg2Cis7ZiZjTWVhdjg+KXAhODFRYnAqJlQ2dn5iSEI8RFpsSUhrZCNpMmF3aCR2XlpOUkJyI1Z7Nmx8NEBvU3paYXlpRnoja3wwQmc9SXNRMU00CitgSkdjNU81Rkp5QEkwKUpEIXJFfih3NUQoPmw/QmBzRFFCey08S2c0QVNocX07ejJjQENne3loS0M3T3hCbTJeazljdW1iQkR3azw4bWZuCit+azVAYGRTLT8kfEcySUJhS31mNzghRzlZcTx3cVNPRX4jRE5VJnshRE1AX2JZdFF3I05WRSVhPHdpR2ZoNX1MSD1ZcFRGUjRfPG9NJXtLCitqX2lUWXY/TnI8TFI+eGo7MnJOIzRzbEF7KDtoSS0lJmNMbiRpVDY7UntpcHEwRWV3PitebklwUnJCcXlfTUpKMGlXPFg0Sn5kPEA5SHhDCitBKWw4PU1uPzk4X1BoeEIkOHlxSzRsTVVydUE5cHQlWXRQYyVoNU5MQUpXKDZrRUFjI00kellVP19ASUlAN0B8cD8tRFgzZW5ZN2RjKyE5CisyUkcoMT5RSik4NW4qP29ZMigoRShLISl5e2Mtc29VZnxtSTIqfFZwa3s2aW0pe3JuQzJmJU87cjEzNTNTS0E+NWEwcmBoXms1PkZHbUE8CispUEJ6PC1NREVibn11bSl0blVrYkZKdnB8Tkt6e2tgeFRuNCM1cVlRRj0jeGBtMlVQJCt5bD1laiNBcEpGKXE1a2g8V0RkOClLZVlGKHs2CitrJF5mJSp7RUlhdi1fN0wpPHxnVnhGeEB7akgwTStJOD8mY282NDRVcGoja2x7cnU9UmZ5NnJPQ0EqZ0dBfCE/fEZVM0hZeHRnI2A9c2gkCituX2F6a24xekhOdWVKekdNQWUza00jYHU3dHBnREFJY3pxJkU7c1JqPnhqJFp7dzJUXiE8ZSs9c09RWik3U0dyaEl5bXQjayF5OT1VMkU0CitOZyVeTEtZfFFTXipMVkRYWUZ5YENQZnxNe2o9T0FeI0tgcmVjV1FaI1B8cE9lKS1VJEx3a2FiUWlTfHR5TkQzVzQ5Yjh5azFQdz9WUDdsCitqVyQxP2VFJFImVCttYig9WmRnMj16NlViQTRLbDA7ODlzUj9oaDh7ZWI2YnJ+NGFrYFZjQGlicFhRNTtDKzFmSnkqan51eGY1ZUNweSlpCitIMzU5PSVQamwzYzZ2TWt2NFZ8JE98OGYtVlF1Zm8wIWVfTk1FKGFqKmtNfmc/JGNOYSN9dz9LeUdfNHo0aWxVOFBGPkdCODAoMnxUO1N+Cit4ZUJFPWtvPHlYfGlKXzIqU2cyNEB7KHB3S1p8O34oMDRSe252WDcwNVU4ZyVFaXt6T2c8YS0qVFF7OH1GPGlXQi1kWFYpQEAkYXdxKTwkCitnbH15XzszLSgwQ2ZUREdzXklpa2xgNjJMcGpRRHt9fXBjST4/WndxbDs3SG08OyZDSGZlO0RqeGx0MSVqRjsyNEQ3PkRrSEJ5SmB0fGg5CitIe1liRjdzO1A8cDRfYVNUKVRGU1J6MDZXdy0qa2hwQT4pJFAhflBgOFU4Tm5HcXk9RCtVfSVsRU8qalg9RiMtWT49Xm8zcmsyYDRoRFNoCisjcjY5djFrTzY8cWImVUl0eDdffDl8NDxmS2BHO357Z3Q5I0gkUnFUdng4N3AlKz5SV3dFRXJaZ2BUXlpoRz5sZSYzP0c5R3RVaU1iKmUxCisjS2NgZFhfdDFZQUgtXj8tZTM2Tm4wJGdtNyNEMjglV1ZBMyYwdX0jdUM9QD1pPnclcTxCfDhuX3tqKmprKUpScEIxQl8kM1NuIyp4QlMqCit+NVhPMjZJeUVaeDA0bVRvSklxOTJSO3tKdjl0VU1GT0RQUlFeJGwlb3w3WGxaRSVtalFvRiRBSkZYMjtaNj9TXnM7Ry0xck5gSmNzXnc8CispbGZJOzxLfX00PE41dEFGJlFCVWM4dmU7OVMwTGxfdjxYUEJrQjZ3ZTxVWipFPGQhMU03MntzTCMhUUhgUlpUZjZSTm1VWFNAZVV3ezJ8CityaEIwLVEoOVV8PWdwaHZrbHwpPiskPk08aGklZV9pKktWb2dBNlVTR3ArcHNGYGRmRyVlTzxATiZFRWFMejl3ez1xczxoTGF8QFkmQ1I3CismdENjUWF6TVIkVHVmRjw8d0w3UV93SW1EamplUF5RUmozUTBLOG9XM3s5JTFRQH5Wd3F5I25Lbm0qK1hediNldTBCa0ZURylQLUJ8fEgmCit0eHM2Zn01RClUPkp6PEBpXygkY2IxUSZWZjk5Y0I2Tyhufk1WaTQhTiVETzBBPHZhJk16XndVcSVDIWMoaEBxXj1nPFFIWVl6NXgzUFNxCis+Yi1wYlhmYVZtWlhWNWFaWm8qVUA5SUFeLUxDemBBKmpJPnRQJVZfPCM4SHRFXkMxWjRrfjxGQW47TjB1ZmVCb3R1emZ3STA1I3tFTS1gCitza3kjcGJrQFRxamBDRzZ6VCo7Xlo0PU9uVTFofl9pazFta2F5JTJeR0dnTmEoPHdFU29VejdnTCluMjE9YV93KTJ1IzJKfi1GcypQR1NuCislOGY2ZTl7QWt0NnJTUDNoZD1xdUd0YVBqNVI2O1lXdHlMI1BwNDB4UEo4dzBNZj4qY09GXzQweWRXUH5IPUk5fExIP1N7ZiorUENuS3JoCitxaHR8eGRwQV5TSHxJQnBePzRSRlU2aVlXZ0ZfKFVNYTA5S3NjPTAmb19pZktWdFhqMi03OE1vIXpIO1NDeF4oSCVpK0E2QkhfZ248V2EkCitwJE4+LUxvMkNOcS1DLVIxSkc/eFlFQWd+fENhKnVzOSkpa3pPejtQdG5wXmspa2hxQVFyMU14M15qY04yfT1ZS0ZUKVpNamF2LXo4Y0FBCithfmNAO1BKMTRFQUIybVN5UEl1T0ZSMWU/SDN4PkAoIUs5YSM/Szd4fGF4ZH5zfW01YkZjaDV2JmkqPnBTK0AmU01XOEthKVE+fEF1dTclCitSaUsqfEY2QXM1MDB3MzxNPXxQVkxIPjFmOXp5Qj9QTXE4QUl2YTd0UjAlTWNfQW5YV3RkY2xHISY+VGFWM0V+QVIhUUYyO3RFTmdhTmMjCistc2JLdVZxJG1xaDdeSG5kRCNASD9idVkxTnYmO0RZTnJ2NHByRm1EIXxDc0hfTVlXdCY1TXskfE1BUzZvWlFgZUBBO2tJYEpMYkVkK3khCis5YHR8RUN1dWY7cm9UPSpTPmh3Rz8ySSM7NHtgKng/UUlZPGZJYmFOP0c2b2EoNXt1enFCbHBscml3clJ+d2B9MjRhbFl1MUMtMSlkP2tQCit1KDlOOXEoRiZ6NGxPKTljUHpNMFJVaT0xOyFPXnNmXikyMjtSeHcqTSYoeGdkeDl7OFNYNjM1WShZPy14VFRJMnxRZkx4KUVuTENyOzVTCitvRDdoS2dUa2Blb2VQcmM5WlZDT3E4NGRPbVVEZ2RQTEBBI1coX0x5eTdkXlFsPzBXQCpfdmM8YFg2QTZ+PEF7KWNZWDBzNG99QGxCQipkCit+TWJOWWspUHVlYks9fWAlU3NlcmooU0ZUJCVTXmR3WUFnQ3gtYlg1MCFyVWJeQVl0dVQ8aGk9I2pacTsjO3QqU2chfH1aemJ9a1dkSXVtCitrSWdrRXBOSmxYcnxBRS13bCk9d016c3lKWkNoVWx1WjIoRHFUM2RUampSKmVVelgxckp1JSM0c1E4V2MtfCZDWHxGUnlwYklmfDlnJTsrCitVSDdqemVlVG5rJmE7O2xzdCF3Kit1MGcoeTlJXzVybSZeJXIhV15LSi1Ubn4mYjZANiZgTXtwYmN6TUdHZFVNUFdYXiskSW1RfVk1eUpaCit7TjcjQXxjVDQtIStSSEMhQW9wdSohR25IJTVHdzMxO0A8VThTZz83ZigpWUw/ZChIY0VeXnpHNmZye0RQaCF0WUl0IVJXPWwjc1I8NEwxCitNZGdvUGJQV1l4fklRWXg8Y1I8M29WIUFvc2A7SlpCQjxXOzZmb15TdX1TWnV2KD9CLStALXZDeHVacEZlLVQrTz16IW1UeCFUUDMxZ2YzCiswZGJEOHZ5TUY5fSZPeXp+YFZ7KTk7UmQjckFBUkYwbnozIXtxelhBTHUmbGskVzhRX1VPXjBZVlkyP1RBc31zclpSNG1vNXllQjdAMEJuCitmI31UVmw5R30+NUFBWEstRkRJSyE/PUIkZiMhczJTKGQoQGFkQUZsZ0k7NnstTnslQz9jJCN2OG03RXxoSkkqfl5gKyVzP0RyLVVlK0BKCitpbGsrdEE5ZHBCSCUhOSQ/bUB7K3tTT09SblZ9VysqVj5vKGRLPkZTSjl9YE9yRyQ7Nz9fJiokaiVUYlhuK091Y1JZUHx+JlNnKilDXnNeCisyYDl1Sk5uP1Y1Z2Z7IXtjc0pwYVFPdSR9bFg9cylCRGR4WShUJEhiaVFvX1IzJlVGTHlmYlV3TmtKdGlAUSN4LVFqQlRjKWVBSzR2OSZpCitqKmh3PVV2KWxlZDcrajFnSEVJbDN1NkxidUVuY0oqcmBPZ258d1hNWGo2VDxMPi00PHF0QVVlekdSPDx6UUdwTCZ3aiY3NClNeDsmbm9ZCitxM2BUOHtzeXxYLTdHJlhOMX5PM0hOdlArdSpkUE19cSEhUE9EPD1ENXAodytHTUFfKGBpJGtIcGdrI0lqeEdkcWlCMFN4OHdCO3FwLWd4Cisqe05lWjFOZSZNYD10ST4+UEhGakJGNypxaVRTfCgzVm8lQkAwJV8qZjJRQj58RE8yISg/I2RBNFYhSWVffXE3U1R5bzAyfEkodz4lMWNWCisrVTVzSUQ8YnVIenpXSG1WPUQoKVkjU2IoczFKU0AoemRtTm5tflRzTHdfTWhBNUJmfWUmSlJXM3o5VnwrLT1kZV42I3FPWnpVPm42ZnE5CisxRTk7cz5LWihMcGNiX14jWTdZZmV6OVZlSDI7a3JfUGN3ZWNVY0hSR2IxTjhxNShjdk5LdiZXNjZvNHFDYGZBMEFGSD5GK3xvcUp5Tj04CitOMUklb015NG9DfHp+b0gpN0lIKlA0XkB4aFI9LWM8RFRoN0I4aFBkKVdpQXZFQVM1a0Z1YihkKmJFYlR6JiNlaFQwNUtWQEZgRXhadG4yCitmVU08SHV3JVhjYCZ4WWBYPmdFN18+cy1nKFc3d0MoZmxge0FoUyRWamxiXmNMNldeIU18ZDdBNlZJdVlrajNJZFg9alFAfVQ+Nz98biR6CiteOGluPFVzd001cmgwQjtxMFZEJmNYRUo+dHw7fSQ8cnJASUBUQ347WXhXUGc8cT49Y29IMHx7SCtzdXREbUYjcFNEKk5+aDM8VkElcylPCitidnx4VzsrRWNEYFZCfnx6JCgjUEVLZkR+bko7Qj93SmEpI2dIWlVJSzVzVjZ+NlAkNEZAQVJlVE8jaiQlaVQ1a2t1M2Z2dGpkdlM9bUtOCitWU1QwYyRhNjNPUzFNfEFmT182bU9ke1JEWjtidWIjUkp9QFRhYWwobjFlbFkjeHxHMlR6TUVvNkVENkl9WTVuMzZgJEtKU2xTKj9HK0h4CiswO1JWUytzN0lHRXxaanl4dmRiaD58dWxZRCNqPj93NTlMRXAkWkVkeylkb0dTUE5JcEwkYm1KTnktVWpBNkFEeG9Gb2sxPyFgSDM4bn4/CitqT0htXzNHNlg+KDtHWDs+S1F+ZnhIUjRwcGFoJllsPTh7QTI8e0ZQfjtKZTMyYkFkZ0Q9JDskTGh+RWx4aUJaSmEqaXx6N3pYVCNEV3RzCitWQ01mIVZ+KW5Wej4zSWVre2RWak5NME8jMSNDaU5UdSVSTUFBTH53SE56IzNTLTxaK3xNK0JFd3J1aDMtQG1fKndNZXs9ZjZsbX0xcz40Cis4OXhCemlBJFMjZSl0QGBMP0lzNmJVYD5GSmZFNzBRcl5rNmZhcURRWFRldGtQdyRgaiFRejgwKWlOT2JtM3lBSUQzQXpWZi0wMSQzZGlBCitGVDhZZHQ+LVJrN201NHpSX0lNWUBLQ3RLJnhLKypDantteiZBKV87MWhlLW9kdjQpT1dqSUV4IypnSE1CRE0oMUMpSE8yeH53QEdOSWNkCiskbFJgSGNSZnxFKmlNYGtyfl9uTEBCM3tCaF9vYWtiZXUycCNZT2VaK1NaQFowRWBUV2d7KGQzNEVJcFpYc2t5Uk5SVHFPcX5EOTZzI1d1Cit8dy1VXmUobSF7ZntpYjRgaCtQLUkmdlJtb0JJKW1vQ2JoTlJZPn1zZDIxcXAjSEhiPFQ9UmMhZWlucVMmUSpwZExrQlA9N3pjVyVAWU9jCisrUz9iQClxaDtQQzY2bV4kPllCSXhwZCNCe2c/WlhIdkpiQzdYQ2RhQ3I5VTkhS088fk9WIzYjS2QkM0RYZm5GTT10fH1YLWR5aX5RQHN7CitncyghZ35zQEBBPTxUMUdWTERseTNHV0c3O1p6PEp9fEM2MWFlUSQxVj9yTyRTVXRlRmpYd2pscSgkbXdgKHhwcHY5KGVvcT9LKmQxVmpwCistOzM7KWdETSk7OXZsUFRPJiZVOztDWWU0XlI7PjN3X1dabW1INUwqdX0xR1hmN21ZTyRqbypzOTl4I3E7VkY/UVZTdCg0b2Q/fEkre3tECit1R1lFJmopNHV0ZjY0YFQ2LWV7fFhKdW1vTHxSTTt7b0IjSz9makFzY3hSSk1uMipTPW5OZDwhYlNmYyg5dzhmM1RQOzY8IUpOY2IxZnRvCitDVl97TT9ZdUk5S35GS3VaZGxiO3wxe0QkZjRPSVZwXzNQOX03USFCPT41UGAyMzB8X1E9THlDRHI4a3hkKi0tezNlJSs0M2JMKypJPDNQCithUmxaN3l9KShRMHghX3A9dUdINWI/VmQoJihKVW16NWNndCt2Vz1kMCktfiNXfWN5OEAjNGo1IWh7S0dfVXpmM0hrMD09X3o+cUlIJTRFCit1RlJgdHlqa2tmX0hINXgofE1aRmUqfD40ejY3RU0lOS1FS08wYjV3R1YxZFMlU3I/cDNmZD9rWGlAeXd9ZzVORzwqbmI7KyROTnZyVll6CitiPipyVGVkRHk8dlh0N2BJISVvbl83LTAwLTw9ZyVMeSZBeFUyXmRxYFA+O0p5IUZoMjAlIS12JkAwfCNgajd+TSREJHpZMVo+fDZJd0tnCitSd2RPTmBnfTtIKjdeT0Z7IU8yRjV9RD5EYU1qV31vMTJgO0whKUNePUJ7NDchaGJaZiRLdns7bWl3d3M+T3NsaT9QZ0g1b1V8JUs5Mml6Cit4NylfTz5Nfk84ckFGQlRrMnJYPzdFLWJqYkc9OSl4YEkmK3tTYWUtaFN5NmR6amthY09zOXxud3B4OTFjU2trTGBTeyU/NmMyNGRGYXJnCitVVjB9UzRxdWdmUjZoVXdeWklpKz1aO1YpbHk2enEkdyh4az1oTjZRPTJfUENNZmRnS1g9bCF5QTx6MVcrQG5rNj8qezlUKmNmP0BOKH1QCit3cEpWJT1hPlQjaGNTK3lzbjdOKkZrIWdINTxJazhpZylWI0tvbWs5LWZCTCQoSFEjIXJtdylXUjJHYlg3JkJSMSpVKGswWTc2VHZxOzReCiswVUwjYXA2T3tebm1IUDNmK3tPWHszcUI3PGk3Q1cmTUBnd21vdT4hRzV5Mk1JKmdmNmdGVnNkQ2x7Xl9AK0s0MUdkKkNodHFjTyFOV1ZzCitUPEdWbjU8Tzs/NHwtSk1tJWdzaH1JWk1JbmE0VTtNPz4la0Azbjw9c3pXSVVWdXsjQkFgN2RCTyZuSipZNEo8TkB0KDtxVCQ9O2NNZFM1Citec2R9Wl8pUTQ9RXhIfG43X0dtPVczaUE5Uj9xfCs1X3JuTHphI3dAIWojO2k1ck5XKjd8NFlKfDZ5P1FxOTdiZWYjIWxlfj4qUTtBK2V6CitAeztJX2Nic1h9ZSpmQ3l4WDthQ1V4MHNON3FzMzJsVmtzWXY4OXk1XzFXcmoqTGxyUFZ5R1hOPmklei1gQTdFOV5+Zm82YE9yZlRYYFo1Cit8bmFqVnY5OF8lXlg2WEgmMldyMm9VVlpVN3U3QU4/ZkFadT4/Vz52bklPdUpCRjZJTSQ+WlhQTnZFXj8wPVheOCZXPXw2TCFjTmpaX0p9Cit4dmQhdmBkX09Fa2FrRGk4Wj9nS0J0aVduMCVufHU9MjVAJXooK3VQZkZUfSFEPzRvQDg/KXN5NUAmajhoJmxrQyh4YEZ4Wm8rMmkkJih7CitGcD9qY2NSJGckI1lmYF9ATHdjZDw3SUBWMiFpNTVKUFo1JHteTiE7X3ZLKEB3bDtaSCNsS1NIRVpOT1V7e0l7ZyQ8NFBvfVRCK0Yhbj9ZCitfKyR4eXNWLStFM0t4Zzs9YnpRNWBWZGBkU1pFTGFhQ24/PHpwKSo3RlUrdj1jX0tDd0RPKWJaQEk2Y15mNzw2YEhqdTJ3MGtDe3IpN1dUCislVSpCaGltSUF3e2NEXjx5eFlDOD4qVUk2ZXtvRyE+NUEzUHYzeWVIVXRTfTxfI1o4KERxVUd4PTNuZnVqKF9SP2BoaS14bHdhN0s8ek1NCis5Xk9vXjlFNnJEKFUkTEBzc2xPYENUVD9vPG40ZStITl8pJiNSXyN5QSZZYXhPI2tWQDIrPCkoeGxZN3ljSVhPT1BJbkpESF8/Y1pXd1A1CitQPj5HYHV+NmNzdURkfnJOLSROWGtETm9fMEc5QmQ2OTR8VzdRZ1drfmlQKVdFcHlnOXIoKyNFaDBKe1JyYGNaWWt6VjxSYiVAc1cmM1VaCitmfmU1fis9QmpfaSYhTX4rODRVZ3QlUCk7UX4wYjVGQ1VXbyhQTFdxZUN8T0dabT5PSX1Nc09Icz9obVhhMUwoaSVNO0pzbXc0P1RCX3B5CitRMUNFWXRmI2wjfnkyc3ZyfXhaSj5Fe1lHd2ZWRCZufmN3PzFnclR6MDl0KTh8PTtZUEo2ZCkrMEF5VmVjVjI2cFIrc2NQUEB6UXd5KVZlCit3bng4TSgkZjg+U1lCKHFtMlBFTnhtS1E0VT0+Kmx0ckJhUVJja2RebzJ7TUpaWlo0S1I7eld+SSZHYl5JOz44cyVqJmtTU3Z7NX5GZzdxCitRa1BgMykjc3xeXjhHK25EVVo1YVE2aiZIMjMzTFd9MHg3fGFVe1A/bD1GI2NrSXBJQFJ1cVdzVmpTWTxwckcoJkVkTUcyNThfRWs2ZyUqCitaTkxkIXo2cEB6YHIoOVRlUS1wZCF8aX1MPzN7ez5KPjB8WFFSMDAwTzheT1k3eWYyOT9hRUk5eEdLRkkoODh2cDxSYUF8TmFVdl8wfldOCismZ1dXTkNBQlktd1VJYiMhVExFXnY5fWVRa1QoSGo/MFh7UitsZkZXR1g3bEFYISF0dX0zc3FiT3RUKnBebjNHcWN5eUZqU01SPTc+I3AyCispMTdHdmNMVzYxcG9tTWw7cTZwPyVpfCFCeXUraTZiZ2t4cHtoX1FZO0o0QGB9T0wrRFh0YzY1YmNrR1NHekE/Wk5zMTYxIXMjcUlLRlFlCiticnFifV5ZJTd2XjVEQ0FVMWUhbylLdl5NUHhDeEBmNEcwfUAkP3tXQDdmQCh2Uzl6ezxKcm1LSD1vWHFQRVBTNWwtbnFsdEdhMX1TKUp1CitHdWB6R3pDNDRXLWUxP0VUQVlXKHNrTCRjRVRlYk9KVE5hbzRpTVpqYVM3bSp2Pko7PU42QGg1OGducD52TVhrUjVSbihSR1VlO0d2TVJsCitjcSk8UygtLTZ5a3B4aGhKSEw4SEhrI2t3c0B7aX5pYD1kSiFGeCk8eHFSYTRKJHBARThme2syVi14ZEZWKm1uLV8rSHVybFEwZXNZcE1VCiskcilxTHw7IUA+THJnKCh7OStzVC0/Y3dxN3BwNkl+bz4oQThESWllPGpSTTJsNnVad3JBYEpze3tuZSkkP1pwU0cke0ItI2V4Qjw9a3c3Cit2bGcmZzEoTz5FeWg4VS1YPXgwVERSbGlsKiUzK2pTMFFwWE9fK3VkNGpEWnFGeSZNMEozaCVkWC1uPlY5flpLS3hRMT1FejQjI3FwdCM8Cit3QTdkJS1uK0IyPDlFUG1XIXtZRyRFb348Qj17eTN4JXE0VzF7VHx8dDlmeT9acWx7fUtzUll3MDAoN3gxd0RkU1pDWF49ej5HPyoobmJzCitkYCppWjJoRyFmcyh7e0U8N1BWLXJiUDRfMyZ6cldHN3FoZ0BXcl9iP3RpRlJgQThsK1BDaiFuQiNnZyQ9LW9CQDJRSWNUd0IhTjwhRncwCitKMFVLQ0JmMWs/Z1YxVjxhRVFaVFFaMDgwaWhmfHx4TUVmSFRCSjN6aF89M15NWkNLVXVPa0ZWayZvWSFebWRKPz5oVXlYeVdnSURveEZ1CitoQ3ghT1FmZ2k7JjlVXmwkUjN7MD5JMjNQaGVTZ0VZNy0rRiszdSV7YDEkOW8qKUA8Kz49ZDBHX1RfTEF7MDxING5yeEVwYSRqTUdsaHpBCitsKXZDKiY7eWt1fXJKPERvLSFWOUwyKU17P1VnSVotRTMmY3JMY2FAUEVqVWw5S35gbiNYY1ZNKVZaT2Fyb2BRJDF8IUJvIXxhNGpraG1HCitGVCN6M0tjQWh2UDBWKiZ6d0Zfa15WPTdyeTxiOGcxaXlSe2dyamlkYC03OXk8QVolRHMtOG1vVFdgWFJqZ3kxLU41fTl5akhYfHxvX3o3CisyN245TDFAQ151fURLYWtfZndCUEBJNERGJTtPKEg4MmtFNkN7PCRzNkdQdWxQKHFIRWx2U3MrNjZDfjw0WiUrO3E1UmoqVUA4UVJAUSluCitzKkJnQnRlTW9kTztmRFpJYjtmWXcmMTExO3ojOXYtc0d7RT92ako4NGA7PHR3PDJtNUQwPEx7YGVJNVdAMWl8RWJxKkJQK2N7Ql51RjhwCiskM1g2enV7PTY4LT5WITEkVG1SUyFIYkQmJGgyIXkqP3J7Mk5ZKGYhR2x1MmtwJlh6RDUqI1dDMmBoKUNeMn17cEJ2NmtBNUxRdUxjMUBwCislTTApbmRKVDlEZXtRUEZfTkJ8eTNSWUc4UGAyIU14OUZCXkUrek4wSU5zdTkybjswO05MJDFfOCp1aFZVJkApNjt2XnAoSEpHISFWOGBYCitxYz16KSZtY1F9OEA+NGw9JGc/flp7aXM1cSVgPj9AK0BmVUs7VyF+NntCOFhFb2ROKEZAJUR8TnFTQlpgdHxDeSE+Vz1MSGBReUcoP1N6Cit+MlBeIyF1KiZpfCQrYkxiSSFQQ2EoY1Q3aUE3NnVQT2dqOWM8IURiK0NJaXNSX3pMPjUlOEZTVmpyNXgpWmBWeH5XWWUlLWclQE18YSNNCit2RDQ3Skl7eEBAOEQkR1hidCRyNjZwcT5NP1AxMTd4ZyZWJUpzbms5KW0hUFlXdE8rN35SYFNJKiFjITlHQXpySGRgS20lM1hRYm5BSDtsCistWGN7SUY9Nj07OXxZTVEjX2A0NnlERENEYzVKTmpTQGAqQWZXfU5DJiVYSW1ZI1dXcHFtN2hWfVFKMWQmR3pTdHFvZkheTWBrZW18ZitnCitmUUtgcG1zcn5na1FoQFZpTkI0I0dYVXxCYGswcns7fm5KSWohKEN4RiQhJl5QPFl8Wkc/NDN6RGBZaFkpNEQoNjQ2bWBGWiNVO3BOay1SCitFPUZQU0pjdzhrMjtzbEB1WFJ5SFErKWVlOzUmZCFAYkYpTmh6KHRnZEwjIzA8IyNTR0BOKWgqSkxxejFTJmQxJWlYPjJUdUVePTJSVWc4Cis5IXNye0tWUz9ZczY3WW9vOFBKT3FXSWQtUmpYPD5sYi07LXJFcFAoPWtLfXgkJDt4PGF1dXdxcSF2bUB5a31NYWtoYFFmUlVCZ25fdGprCis8VGFxI1RmdityT34xMXdvb0RIfDZeVk89UmVvbSlVVFRlUUcob2BDa2RoJVB9ZDkwJk4ta1Q5RHQ0aGBydSNaTGVMTyZyRCp6NlR9RWxVCisxSD0/YChANGdjeFhnOFAoVWQ1aFR6UnxCMEo/Umk/OCVzenI9dFZ5RlUpdUBpUlZmUkNYeHk/d2xORG5LaTN4d0hUYXFaUE0+Pl90eHVWCit4ZWk3U053TUdCNCpxcDA7dEdnJn18YUB7M3xfMDB5MTYxZE9rMWkjIzliRG1UMkc2WCQ3TEF4UHl1Y1ZQYmY5ei07NllJQX4xP1EzPENOCituczU8QThyaSZ6I21MJW84Y0B8MGUpZCNXNEc+ezwwfTlydEZIYVB7Mzk8XmJXJH1tRzgzbFJOMHxUPnskc31sdz9qYWsmRVUwZ0NUNU1yCis5SDF9OHRIME44R3BgY351LWRTWGhOeFo2OGslaXh3ZmNJUFBPTTxSQCshZVFIOVRrV0JyMFBAMENXUDhCbGc1cH5VeXQ9e1lXMz1adjwyCitERDN4dE8xaFEhcEE3QTZRT0dtMHY/JCpZQDRqeDExa2smM2khbitTfD96emkmOGZKNktoVDY2clNYeGVvTzZYWWc5MEhRQSUmemQhbGt4CitrdnI7UH5KO199JVZUTC1uQkhTazg/dmkwVEc5Tk9GYkYqZUxuMVB8V1owKn02cUQzajR7MU5zPTdAJE0qKnh6ZmEhM3txJUFGLU44d2MxCitYJjZTMEozMVpWd0pxUzJVIUxkWE45SWBtRkhRVyFHTlFVSGUwMGRQQHJhcnszK1Y/V2wqTjtZS0hwJUdBQ1V6QzY3a2p3SH5EOVpGKDwpCitSbjF6WFJVMX5kcXRvRWVAUll9YUkjO0dHJXQlblJWNDJMKT1DLUlwNX4pJD4hOVYxPmtBN2ZVMU4jQi1pPjl1S0FucCh0QDJCM0RGMVFrCitwWWA/elVaN3lJQmpgMmlJMXphXnxGdXN2cGRuNTt2ZF97USUhVmFgemxxRj9aLXt4NVlCWjJFPWp0K3hfVXJ1bkFxdWlhUiY9Jm9ZeXR+Cis1MWczOGNPdShWLVJrV29BU0x7WUIySFBPbWdZd1dzbW17OH43V2xsQ3slTW51Rl89UT1eKWU0YmpwdUVNe3I2I2ZrMFAxISlXPiR5JCgmCitgZVg+YXw8WnEpTlphaW5Pb1U5dz1EbjYpUmNNJXFIYm5jRztSPkdkVSFyJmRsMjZAOzxyRj88MUhTQFE+KDNOZyliUWdtNit0X3lRKVo7CitVK1ZyM0JDa1dARUBzZ3NwY2Q8OEF+ZV5MU2tVcUooSHNIZDFtKkxBeHo9cjE/a2NGI1YwRFRIfFB1bVFHcElVZmV5VnFVM09oVHAxakUkCiswaXFLKVZfdWBDe2R5OTdYe2tOSG8rSkAyVld5SzRGa21ucFpfIVZ7Z2s4Sm4hQF5jISRpc0N6LX5NMFdOSHg1e0FrU2RjWWYlRUY4VHYqCiszP2V5czVJRzYoYHBpfUVJb241MllERCRneWM4fUJuMUJeQTN2YHZ3djJ2Jj91TlEhQyVsb0srLXFXbiZ+UnQqVH4zeSFnTTNvbVBJdXEzCitMLVpDKVhETTBoYWBTTDZuZEJ7QWBkeyVXWipXRGt5TWJ1ViZxZylyQ3slIVE/aDlDZD8rZTtuTGtJYSRTRGthe1hEaTsxKXpCQ1AzSWBBCitNO3UkWWxhP096MlQwYGVtajFEMExBKlFAPn0oRFdISmReY3RDdGlvNHBTQXFBITFUMDVCYzlCdSY+QS18NHgkSDZYUkcrUG4+YloqdnxKCisrc0kzQmh0cFZURX1OQVVkQSloNzBnOV53dTwkMFlrY2htVE5hekl0VEdTR097Z0hgVVdHWF9fRlBuQnRecF9AWShtfG48dk4kWmMjTlVtCitzNHJXc0F2VVZvcXhhTk5lJG9oVSgoNT1ZTlVJWmhJcSRXRmdPQUFBPExeXlhaWDQqR21PQXBeYXEhPEpleUlIY0AkKTIzdm5DfkAtPUNCCitxJGQwfX0wO01TamlBQU5jOHRvelFhMCEjIShreDNQMTRZLWk/SVRCfjNUfFNxPVQzY0deSnNZM3hZNzI2UzNZbl8pKiRVTV54NlpHLX1XCitUOG5ZRzdPdEcpR2BVKFU8KSVDbTRRSGw5OGc3WCg8QzRpS2EyJGM5VlB0Vk94VFd0alZnOG9RVz1SdUFhTCNfemo1IWRRT2d7ZV59JjV4CiszWn5xRVE1RyhQTzghLVF3a1NoVGtMNE5eeEswV2RfQlc4XkY5TU9YRHI/ZjVwdWIoOCF9VTgkRjgwWT1LeTA1ez1ueSNzKTAjRHR6fUwwCis1NFM/OCExMFZ4O1RKKTAkRihiR1FxOUU4dVVUbiVldTxNPG1GY2lMNn5xOFNxaFBxJUFQOWshQj5fUXl8TlBhbFhAYC0xbnxMTCV9UzdFCit5cUIxdkR6XmY7YnwyTjNlfSNEXkZ+e0J8QVdlIWtOZ0A8dXBqbShjVkB4UH43fj9iT0FeeXxOWEwxdzM+VmlgZFo0dXNwTCN8RGRXdTJgCit7e1ZTX3lAWVJ3OTFYKV5qKUdVNC1ZZkJHWFFxTT9yQThpPTtxNms7JExVK2MmdFE0ayhGSn5PUV4zUSFLZ2V8ZW5pX042I0ZBfU83MkJ1CituXkJvYj9BcElYKyVWP31gODs8RV9fO1ZydG5sVnNZamZENlBVdHhKVGQ2dDVZO0M5b0U+PzE7Y1cyJj9ueW9wNk92eSRNbHNPeGUjKU1rCisjSCMtUFIyJGs3JDNRT1ctREZYV3pZbWk1QGU+KE4xUFprbDx9KnRicHpYRzxVIXtWaHl5ZFZOQjVNT3xNZDVoYyNgdShoa1lHS19pKzZrCitLRjd2MnlmfjR0RDg2b0s5V2ZkMylVPU0zcX1DWkJ1JFZFVzlaNSU1Vk5LTDRKbmxfQThBQzNeJEpqZStFRGdXMSleVEdfdnFuNCshaVZOCitqYzZzNSNOdGdIZ2p2P0p3QilJYXVQUigtcGRmSGBqdktWTiU+eT5nOG1DKTtOSXsqWSFwRVJjNVMqbGlrUEZ4TUk1QE9yalRFWnRZOHhACit5RjJvfD47c1Nabjc/R1NlM2ZUITYpRDVkJEYhPS1ZTld5M2RuN0BseTRYSUtDS3owSDckUSFUfD96dD9Zel5sQHp5e0tvODdGTkdldipeCitMY28qSkV1bylLNHN4RFchcHVwUUpuRT02NmcreCFgPFZWV3lAO0owNz9DaXAtYkNKamB5OChfTzBlaFRSYiM+ZGkoKVhwP0VeaWxNJDgoCis+QT1iY0hJMEh4X0AhPn5mNUIhSTRXIyhJY2NUPitAO1E2MjMoaEpFQEVqNE0hezk0fCFCMVhVJT1tdGdGZClYKEA3N0hwYGMyaDREQjBICitDU1pwQ2VLSz1tfEpmMmxBRDI5U3ZSPD5jSX0oYnY4M0I1elhHNnlsQ3hPZzFXOGN5MENVamFFPktEJkdmK3hlMTJmJF4xNVoqN00zVFlUCitWP2RSLSFeSlRSZFdmSiM4TF5MNkgmb141WDxeX2gmSVY+OWglJSFZbjBqWTkydW8tVnIkNF9aIXZKZmVHP2o5UzA3JDhjcEEpJnwoS2N3CitzenxgandGIUFyZVkrISM4ZkxXckBmaitSUzVmO3YzanVIKndZRVU3ITNhY3FkbWpPXyFPcHcqTnNLVkJSJHM3akA+dEVJfGk+Uigkd0dpCitBRFRxWiNLIVBmNVVIRmBjWkViNmFuS1Z8X0s5SyN4clZuaHpJSE9vS35PVD5zfjQ+ZjVaX09XaXxkZWtua1pSITJUcTlDeUVLP3UoPCplCitLcylzVChNa1FBPmw4VHxESGRJcXx+QXZTMFAmOEZifVlZITBaJkwpZSZfcyFZeV5AcGh+VjdFbz58U29EbmNKaV9PVitmOSZBSnZIQytRCitCOHk3cV90ZU8tUF9aMlEwJWNPcH4hLVZvYkRiRzF1SVJmO0tQcShpVFl5alRFQ0pvXntafjglPDkjPmJQPj5HMHJRaH5RYjVfe0ZKI3FDCit1d2lAVlY0TmhaV0pEdmRjfkB4QmZvMUBiWTh6ITFHOU42dUdnd3Y4eGJjc1hBO3VFYSolYys9SkJzOzhCNExuPjxIVFkjbEF7biZ6JjQrCitnVEAxQGY1Qihta099VDFRY3F5KVlKTk18R01HRXV7SjZeQn0tJElse2IqPDYkPz1eNylYYlIjTTFaV09SdGJgX150ay11bWx8fnpxSjUoCitEKVYzVF9hTDhKSXRJR2AlaTxYN3U1WkQ9NWVraWxSTmFwbDxeYlhSdFN7fmAhd2pONUkhRT5abXBWOXstKXV5KGU7cXlkUnNOYXpvYXBSCitwZDglWkR5IUdjPXBVbngqLXQhUEkjKnQxJmR4SDclcnYkZmhmQ3JXYz5Ub3BxKHAjXlBXSCt0MSkoQDxualpoRnYyN1IocHl0P2xqVT0zCisyIWYqO3FpTSlPYkY3fjxOXnV9OG1saWhYdj02R1U8YzVpQjh3aWJuO0pobzxHRmBzSlMlSUZ5UEM+Vm4yRyYmbShXNkVObDZeKUc1TitfCitfMn5oWUFRan5eTXcxamBBfWx2WSEtTGt8eXgtVGteYXBrUntzO1EkPXR8czRpZlo8RHVeWTwmM3AqUFZaaDUzcHtNX0R5aEtmRTcpJFBqCit5OWtrMC1UI3MyWmFVMmdLPTc9X3NxTmBkSWNPaHowa0BAKHE9fXBRdUcoMWg1KHZEb2xManheYEt5PSY0aHlzQVRySEVefWhsMWUxcloyCitNKm40a15fO1FyMmg0UjlxVUp1fGp2MzgwRGIwOT93dW5oZygqYGp7ZkA4U1JteXEoU09vcjFOdn0zfjJUXztUS2VNTGdYVmdXekhIM0tLCisrSHJGYmUqVyNeTl8mTG41X0NvV31JakE5ejZ5THdGdE9RZENTPmZkekBndmBtK204TFpzXmIxeSheVUdtT3V7bmJ9cmpmMzYjcFcjRDkoCitFTWYwNXdFUXkhJXRqZyhUK0toQ2JvK0h2Jj10TjVzLT80KCt1fml0N2FIWVd8MGgjSD9Vemx5STsobXtoOXNSVWd9VkBYRWlPOXJoVShZCit7OytKMiE/ZTd7cm84bkJ0d29LalhfeHY4Iz47ejxmaHI9YGx6PHIxekFTI3EqK2RfK1FtY09PX0pGSEpXTzdWPFhGYTVCcXRUTEoybFJ0CispMEcofHskSSk9NVQ8LUQ1cW5aSjA7filtODZkVEFVRnQxRD8jfFUtT0taQ08oeV5fODRAMEFZRHtlZnNiR3ZNY2UjJnJDaTNYWmNRUHJMCitJPUk/Q0dVPlIzWT5sU01WNkktNjNSclRCPSk3Nz5VM0RndWlfdmZRYzlVWi1yKCkkI2Jtd00tMj8yfE9rTW5JUXdDRGZ1aFFGVnxPNWMhCitFZmchS1BpZXhRNyNmIUxIZk44XmB6ZlIzKS1tOCQqTUA5LU96YmpFWXQ0Tz1FdXpKIXNhOW0hN3txQjdPJCMramF2KXJQazEtQjN0ZT0qCitxPHRxJkdwb1E7ejtRK0U8UyhiO004SzY5dW0tSjR+KnJKZHRfdjZAMTJFO287dzg+cHJ9NlkjTCpFN3d4NXorIUFKKSNGZ1RIaFhQWDViCitpbDtMPyNWNz5ge1Fnc05edjZFWWBUPCVUV041NldtVHY2Z3JBbzdHZHJBUDk3S001bmhCM0ZvNUVNTkAzQChlLV80dTAzbjArY0NVOV9OCitBJFFhMFJ6KXEmUV40PGIzaiU2I2x0fU5eS0A8PlQ8dXZDOCNgK1BDKCZ0aDlCSjA5KndgcnApTGlUaGJEMXM8ST1UNSZGY1UhcCNxeyZtCit5Z3ZpWDRNPXdfbSRIYEI9I1EwNW9wTFBffW1VQXxuazdfeGRoUiQpYn15amkzeDNoUV5PQyZ9dWJeXlhMUDt2ekpzTTNaQzQzM3w2PkZlCit7aEI9LTUxTSlTZWpfN0RYZEAlIVdYUGFjPjtBLT1mfU5qYTM4ZUpNN1Z2VClrTXFXOGFrPWQ7YD9NWnlwNnhRa2U9cXM5czE9bEs9eDxICitBVFY7WnlrfWooZSRWZUJaVFNoI2h+QGpFSj9UYlY1bmJhTzJkJWpJWnVte0lqYEVMTDRBPDNXJSMwfk9XK2Zee20jKUtTcSZWUkM1OCtgCitQaEQ0bnIxTCMhJmgqSGpHKDM9VHl6PHI1c0t2eXdtb0JjNUJ6eih8TmxaTlNFfURUKC1+RlZnSUBJKHV1JWZOZmkzdm1QXjJPbig0QEhGCismMEpKZXpydDwqMWhXKEZSd3ZxPWhUWmhlaGFRRmQkXjJlSTwqNF9he0twandRKjwoOTxKVkdqZE5GNWc4TkZUP0lCRzFUR19NUWo0Jn1UCitAVEFTUVkjTCFjJVN3KjhYWSFNRzBtbSE7dEVvcDJHMklLPntnYTxMLS12N0xkPSpsZ1lrLWV+ZXdCbTNXbjZuPD9gRk9ZRzRkISpGNz1DCit+K0RpbX09RzJUeE9aS0wmUFZnQlRYM2BIeCtjMzJ4USo3WCV9P25NI2IhIVM4TChjdlg/VUB9fjwlIzwpKXkxXnh2cHtYbUI7aEVSM24/Cis/LUFXUEVvYnc/Py1BJDdFK1pZNXhjSlJtZjBqKHErJFc8JjdfTnw7VV9TRzRuQ2ZwezczS1RZWkhjYW09Xm9+bmh2cFYjfX1nKWVwd3A/Cis9VkVLMzRva3pEaHtfPz5kTkdRb2QqfF41ZSVwR1dabHNTWlEpZ2E3YERsV2ItYjhyWnpXV0pLPS1+M2AlPlhiIThgcm5eYC03OGpqIXE5CitvKUBjK28wRnw5X0dkaCRieGR5JUZpVzskaXI0fHA+VElHfkhNTHR9NUImY08rPDhKSVVCdVFAcUt8Pz5oPXMkbmImUyFYN2FyQ0FRdlR2CismUk5RMypPJmpVfTc/RF9ETkJmfUk7KTItRH47bC0xfWFgZGVlI1UmcnFxb3JlM3VQYXpPX0NtYD9xUkxFeVU3SFRKbjNoMXNrRFZ2JkFiCit2M2tVSmgtS3thdmExRm9ock5qI15HbG55NigwTko/TXJeVmpePXlPSCFhYW96dFlaQiY9MTQ7e0dIaDM0dyl4OFhwaXtjSzZoYVg3bEBQCitmJH0mY3R7V01zdjchKUtrMkhNYll6TlpuUWxnOVUmJn1kYnBPanBROWZkZVZRQHFfUW5pYE4/Mmk8MmFMRG00byN6TGA4d2l7WmFUdyFLCisldEQ3eyNGIXw3ISFEU21LIzkwMSZgTy1eIzIzUFYkZzgkLVl6cDAlVkpyfnw8eCRUOWdJUDJ2ODlaYFMxJUUyNHRpQT15Nk48ZSorSkYyCiswP2VYIXFaX25OJExJQUkqeDtQUGVqQlFEWU0mTG9rYUpoTFEpPVEySXE/cXsqSktqIUZYLU95eWw4bzw7QX5sbXBvPngoYjlVcStAeytWCittbjhjaVJUYlgxKSZDQTJXcXVuOSU1c0hLWTZ3WGBpbUQpQ0ktLTNtWnMoSjFgU2EwSVUmIUk0MGpjKyFKMntReXo8PnNxd1ZhR0x7QmBDCisrRipZRDtiMkVRI1JoQzc3dWNyOUBrRzk5Um0xVEpKYVVeQjthLTQqQjdTVVU9aEIlKVhYVjliVCU2eHZ5NVd5c0grUCMxOEdfai1KSmB2CismNTBPSCkkaUhARTw1ajZieFA1S0A1R1goYE45TnhGP2AoSkwrfX5oTU9HbiQ2Qz10eFdUWSlpMjtJO29WT3V1QCNrclZPY3RfKDBKSTRlCitCQDFQNSgrVmV5dGdNVmgpV1kmbXNGKWkkM1NoWEthaHxyRG45KHp8KXdRNDxNJEBnTzQ0PEIzT0RaNS0jVEpqIUx3VER2NnxpbTtleWpPCitMTXkqfTBiK25pQTtfYjJiUWxqSmBjYHFPVXd8dnM7OURNfGxTKl9PQGVINTkxdlMkUmV2TXgjMzVaPDNFZiZjPTc8KCFFa2BCPjtRaj5tCit6YW85O0NKMGRpPiQ4OH5kPUM4dn5gVDhPVkoyME5DcnFETSh6VCZuN1pIcT5ObG5SYiExd09uMkZVVl49PD5+bUNnZldndS0/M2F9PHBwCisrcDtTcGVWKXU7elJQREs5YUc5N0BacDhXPj0pIzNDM0pEYnZfJiMrSU5AdDl5X2ZwcWwqZmdBeiR1Z0YpLVNNRGszJW1NYEo8X0k5WW0zCismNDJgYj9YXk5xdDlzVF9sRi1pa3tXP3w+em1jI0t9PVlPVHBabkJSaT9KajYtQ2c9O08+aE9oTEx5VXdzVlF0M1U4KH0xVkNUTTBkPEFUCisoKHorNmUqbVdyKENeZ19RfTY8Y3o2Y2J+PlptVTdHKk1XMldFe35ZKkpnfjc9ZGAobzBuPEloVHlSbld2bFgjbjx7XlQpZnI7UD5WRCtmCitWVGl7OXcxalU/Ryk+cDlELWc0WnFSKz4+cXs1PVYxdTRPb1RxJkNGUShlKilKbHY0RzNBazlsbDVDT0grLW5WWnooblE0ZWw9TXxRUmQjCitJUiUoWGZWUytfMzwoeXllREh4eEZSP2w0KG4jRFkzI1d2JnFYVnorK3ZpaD03I29+ZGplVGBvaS1rNSZzejNXK2BtX35KSThyQz96VzA/Cit5Nj9nYUR0YWcldTVoWmpJXiZxWmxyYTtsdGNrbGVXSkRLaXd7Y2JpZnc5Z08qTVFrNTcqTjRieiVeZUVaPWJkSGVDKDFRVForOSh9WU8xCit6fEt6d30wQip7K0h6OU1URDh8QE1tKE5BOHZ1a3pXcjF5cCN2N2IqdUhvJVZxNS1qdn5tMCZYWVk8YWBZfncyP2JVc0JvfUleVSZhKmReCitNMiUwN0E8cmMwWSlob1IoOCtwcWZ7PV5VckA5flRAcF5TNG1YQ2l6SE8/X0FlK1FKMEdTejJpZn5jd2tlSHZUKHc0QFF4MHxafURhblkxCitsRSV6TT5ULUhoZFdtN31CRGlrS1pHKyt2aHdDZntkNjYrMzNedztVJGw2VT9pWCtzcnJpKWZfbjtVMiRrR0kkO0VvX3wrcDFrJWVleV9ZCis7X29UPzFJPFlKYnRAP01RNUppaVJiZiEmdldmQUNYTGU/V3ZmY15mbmx5WTVzTTltcmAjaCtXOFdRMnAhbGEkNSVgZEpvSjUqXyk+eitkCiswfHcyI29kakZHblVhJk5LdnQ3WlhxYkpFdD1+cCshVFd2e0cxQVdnZGN6NnVoI3kmVnklWHg5fGcyKjhSSDRwS1REezVAKE82UHk2fCU9CitlSSRPXk52em5KfiZnMj8xK0goPiotKDQjUnd+b0Z3PnYwTUEzME9WMyRPNGYzJEtZK3VIISs1c0xPY1NtclJsR0ZDQEdveHV8eW4lU0k1CiskMEFUX0d2RERlJGArYWkkODU1U1pTLUhUfDZHPlohXyNsZVY2X0o9Pk88fStDMiF5P3F0Vk5GY2ZgSGs8MDA1MU1YODRhbyQ3MVhEQCtiCisqXzU/WV9wfG9VPil1N3tXJGskU3ErbFUhWjAtTjdhTz5AOFpnN2ZnWEkxZWRraSRWSytjM295Y19TWSR3aUFzMEV4ZHlAaHkpZUNgbT98Cit5OGJaRUp0LU5OKCs+PlNEbjxFKDRsQXRQTntLSjkqa2wkKipPSXRAbl8+VjZ4QVBeSClrSVV8TEhWZF9RbGs9bU9MeEI1RiF6ZjhLOF5nCitgUFZLKldocEh0Y3JqbzM5aikpXnRyISs8Iys2TUx8VnA0UElBaEJAIXVgPX1SYTQzOTlTJlFmPD02NGg5QmteSjVMX0AycEhRd3ZkS3RQCitlJCUza2lGMGEtSW1WcUYlKGR0REIxXypee3pJNU45LUcpXyU8blQzcTtFSWl0OCpveGo8JjVscmphKz97YlA7NUc5emltJHM4NkwhKmpWCitDUmlAUU0xQnElJVJDc0NtQWsyT0tMPDw3SUljezY0OHZHc0QpMCY8UkZrdjhnJFh5dE1wWipKJWU+QDs1RmxfaVV3LSpkfE1FfDlATGg0CitvTHFjWGBaUzRQVk47NEE3d1k2d0x0Zj9rfjE/UCM1Tz5SZmFNNH1uIzFjbXJuUDtNSmFzMDVgcmFNNDx2V0MxKWtrMCV+cnpeaXVxMz4zCis8NmdkWCFTI1VzOUs7X2hINzhmUzlZYVpzUEN7MDxLcDxyeV54IzktNENsamYqNzdlMiZLb1FtaGM+XnVuQWlObGJZYT00Xy13RjQrbyUoCis8IygqVSUlYnYrRD5hRVpeZGJFKFpee0F6ZFIqKzhBNjhqUSZXezxlZT00NHBec0soRylqd3E4fXZGYjBIbHRGb2ZlRWY3dGJgKUZ0OSY8CitNPXJ6TXZYI0RSNCg+KmM1WktQZmg1Xj4yNkd4JGBrbUdOc0BSZFcjZzRWTyEmPFRmfEgrcHpqa242YGcxTkVRVjBZN0VMRzN3TlhhPVUoCitraWtUS3BvNUVmKjlXWnt7fmJIU1pFUWFta015VCYrcm9MTVRQb2dRQThtWCkoeDZqbHhKYT1DNEZUUVhhemJNYkMoOT4wMzNLTC1sRHNQCisyZDNTayZvdFh9YDg/aGtTMzdTSGFRVnUzaVBqRGxFVEVwYXc2d0p5aGxGPiNATmdLNkxEbVdsKnJjUXY3eF47UWFkJngzSDE9RzQ9aS1eCitrWUJGe190eXdpN0I+RkNFK2FNRGdhQVpEPUhBKFNnWEpQWHZPMCVnenwyVURlbmg5RnE7dlVlXko2QXBXbHczSHpgbXZUP1ZKWGN9MWAhCitfang4Tmt5V3o0Jm5za0Z2d3BBcTsqQEZSR253NmQ+cjY3eFlGU3pXN0h2JHZ7R1MqREk0Zm8/bGlMbTlAV1dpVz93Uz13PipqJE80JUoqCis3Y20zbkY4cW5SVzslXipoXz1uT1hEPCFuO2d7K1goVEA7bDJXbSUlRkY4V1dYZnFGZVY5SWdNc0B8cWk3TGFeSExrTX4lO2c4ZUV3UjkzCis/RXh1T19fKTFnTnhQQWktMjZ+TWErPGhxWDBeKFZZdHRwY1YwSEZLejMxfSFAejc5Pkhidn55ciptSThCen14UU4yZmpmU087QzFsTHNOCiskaz54SjU7ZEU7cmxFJj1vd1NkU0dIY0VCVFV6a3FoTHZhVzY4eFlCS3ZSI2whNHAhPys3PztKNFNZS2o+bFM/SU85bHg/Ryt9emwoTUF2CitVKkhaQCVqYnl1RFFgMz4hVmMxNmUxanFOJE50LXJzYEdQSDRaOVpuOGhGfGZZQ3F7b0o+M1VhTTA/M0M/KmFze0lpeGZ6P0dTezxSaWk9CitpQ29vWDVSZW08PHA0MUU/e1NGcHs9bEtsR2FCZSh3YztUNSM0SG9hZ2lpeGZOejllUWtSPHJQV1p3QilqUlRaZFpZVk80Wkp7TGp2bzNKCis1KjdAJkVgT3dCQTdkKzR0N0JxPWdieTduTmtAX2FmeTB2SDA/bExKZiFpOEExT0xlMTh+aE5Odm1HWiNnQSVjYlBZWV8pUCR+QT1KVkY3Cit0OWUhbWZkUkgxO001YiY2I1lOTnRWJndeUn1GRlI2bioleUhuMmQmb3F9MmolKmJrNDR5PS1gVVhyN1pYK1NlK0tTKnpxZm9ZZjVVbypRCitZanFEKjk5cyV3P1MrY3lsV1cjdUhyS1IrUko+cnJARFkrKmFTdDxmYzJBamRRKCZoQDMmOEBCTFRsX1pBPnRuNzhZe20kOHgkUUJ2SjxqCistQSM+eHUkb0tAUHdoPkpJSWUyNkpFTmhIMn5GJFE+WVE0QnpreDlZJmRITENpZ1pzU0lqTl9zYCRMZVpPJGVWbStUbT59SEhiJChCflZaCitXYEZmcCtYNm1EWmYyI34yZSVvaEVYNSo1eXxHY29ofCRaQjE4PjJBSlM4KXJQKnMtUHp7Wjh2VWhtUC0jVGpzb19jV3VKRyN9bVE/O0ltCitiKkAjSW9sSD1kNF4xUz48VUZ2a0w2ZyhBRFklXl5aUTNrKHVLKndtRj1KY00kNnRNei0jVlV6bVojIWMpIX1GUkZGPlA/Jk09PnVYO0tUCit0am4yYERefF88KzA2VCoweTlNQD1QKjZUZG54YzRuTStrMjVYPkN7VjV2LTBSbUpHemQyYmdQMHo7MCRzeWh6ZXR6Qis/a1RUZy1FX3haCitmJFVlKComQygzbFMpaCN1cjNrT0FnWCp8PUFvVHVgcSFqfn1DejY8Z0JvLU1ibCF+NE9udlk9ZGN7fHp0OSVOeGRDSktIUVdHPzUtdXVaCitqITw5VX1ON3JrYXhtZjd4QG1GJCNFSCM+WWpgRFdsfmEkY0ozSE5DIWdOfUpyPnpyOVVAZ0tjYCRiO0prTm98JjFBUT1OeEs9Z1N1cGRoCis0NGRNbyFRTyVaenlualFDN0BXNGhHTTRqSHYlPnM+OEVXSSNweFkqYyR2UzxQKjhENm9iLThmdjFPI0tXPmlrUz5lcEtqIXpJel49WHVeCitfPSQoUWk3WmRmd24zdGYlb2tLTD45I2VRQDA8K1RUaG44LVMlTHpZUTQoQF4+QExQUlgjYnkpVnpILTdFSDtOJTVNaT5gKFpzMUtKS0lzCis0K0JuYj5vTD5hSVh5YEl2eDw/M2EmPH41cHxuWkwhODM1R1FYJVY+QGwpZWRielJsQm1DfHsrKHR8MlFUVzdXWE1DNnxBZ2poQCl7NURpCitSR21IZnNAcipRPmE3e2ozPTJ9bzRtMylWdUhfNkUyTGcrYjdPTFh6eVF8YlBxeWgpeF8tMXx9YjdUeUZSWVB1OCQ8QUNNQ08hJlZuXjhTCitjenZKRVh5VH5kVEh2JSlCZDxDc0QrYVpJRXBAMk81eUEjQkhkZTx+KUVSbkFYTDZ3YlJ3P3BhZj1qMWZ8TylsaVk+aXdRJmJPSEYla2tsCis2WDVhPl9SQ2xeZHsxYkQxTDI1Qk0+bGAwPmF2U2BuRjYoV3FhOGMhdUoxU1N0SFlQVnFTRDs0ZG9oYGArbjEoS2RCO2clX18/RChrK1pMCit2Nyo/I0BAfmpibn57akU+P0x+cTtjSWA/Y2xHU3YkWGtaVDBNWEQmbEUla3B2cnAlM353OCRtbiU/M0xFQkdzc0FlfmR0MVExdT1xTD9zCitvSzFJKUlvNHV3VX5BZnleKTAjdjllc159KnBKTHZ0UkclQT4xdHVHME51LXU1RUF2c1FRZTNSSU9GOX1oIXYkS3o/UFpjJHR8N2JgYnIrCitVbG9kPW1qSTU8eVFZZE9xWmhTSnVJX1AoP0N9RVBwP0R4fTN5RHgobWxpO056YzdVe3NBcV5lMD4qcWRqTDRsaUBkZGFZLW88RnltRXtuCislcms9bCYjWEJ0OGxtfXlfOT5RKnN3Y0JzTiRPe3l5Xm9nPDJyZW1NY1FocHc8bGQ4NlN6JEx6ISlfaWhUWGxYTCV4TXdAa1h0OX5pZDhfCitzMT5NZlN0N3s7NlNrJldEcCUrYT9FJj5gPnA+eWBvRVpTK1olU1FRbTZgYTh8biVNKjhoT0ZnNFchSj1Gc30pcjA3Q2ZCKDFsb285eUdhCitmZHEoPWZNd0hsKjZlNXljPHFoTzBiQUpVQW9GRWliekZBNUA2LTd1UCMwbGI2KWxkPjUqJVdsdTtrdylsbFpBODtGVVZrRWo2bmlSTmp3CiteUGZKKlk4SFAkPWRmRlFvPWhMeU80bE9fM3lWRE1fTTFVZ3MyaTJELU1FOz57TWMpdDBuUEgkRDA3eCVNPXdAfi1hYX53SndtKmYmKD1JCitzKytQb354fGhZSVRUakJRO0MxOD0hT3gtVld0ejwjYkA7YSFEcyRkTyRZZHpHMyMzb1lGdT1wXitwcHA4em1pSUNte2NQI2VGeG5JOT40CitfQncmUl5yemxKXjRCUnNEe15OZmhQMyVTQW8tLTQxMlMlRlQzLUF+MWVRZlJ9VXREb1N7Q0glUXZsbyRse19HSkl2O3I5cDAhSnAzI0s0CitNSEZVKiNQYD5HPGo9eTZnbk1VakZuLWVXIWxgOypmNiZPUjFXZHs0Y2JuVm17WHIoTDlwPkNTQkF1VVY/fV92U1dFK21iQCZeJTNgY31pCitKbz5CRWokPCEmbkpRQE9ENHZ8Skd6SUZtVFdMTyRVSCNlP3M7Pno1c2tZKWQqO2R2Mn4+cT84K0o3WGZseXRicDNPJWA5eTdCRFVyZGsrCitZSl89bHFfVnFLK1N1YihKZzkyfnMzNWl2ZylsdFplaiRnKklUKnImKH5wQmpnVUsxdz8pWFkxY304KFZ7e2tfRElTRTI2KXRUZXZWP2EkCitsZ0AxP1A7Iz0jTE9iWnp7ZCorKmB3V3oxVjwlM09MNG1PRFpwNHVrUXk1VXlmck4wJWtnPGVHNmtvQiUwUXtXbCNsWnpTaWhOWSk9VHJyCitWRFh0JmxlKCpHYDJuMnB7dWB2S3BjalhzZFJue09oU0Q2bitTbD5DN0dIQntZT3JsUjVwKUtmIzYqbTMlTyU1e0FLJUcwU3AzYXsqVXNHCitxbT09eyo3cWxeKj5VXnIjIUZGWFVLfUhzYHk/Pn0mSEhHeUd1QSt1Uk9XZWZpSFh6eHVLfW15VSlSMzgpIWd6Yilfdjc/aTFGMmFxSjV4Cit+WTt2X3RUO2o9PStjanlvJkdHMyR4Nlp4V21NMFJMd3Z0MkJuK0FvSj87fF9ZViYtc1RvNFdaT1V6USFqeVQrSD9aTng9bl9MJGlgSWRICitTd3Z+RVVvKm47ZWoxOVpYWVVEdjF8WW1qXnBvXkxwT0FERV8xcTA0V0FEOFJ2QTxNRjVIZ3cwKDJ9Si1XQCU8Zntjfl9CUTx6REBnRTRKCitMZUphKDwlSDRAND9eTXReeF9PQlFtZzI7K0RuaEded1NpWXc9b1kxfHEpNiNCel9oOTJASlF5TD43OTJmPlI2VkxiMFJaVkUhYDVtcD1+Cis1M1h3Kl5LWFNkSE5DLXFOOFFmaTh8cjBjSVMjNy11U21Wc0hmWD9mbDJmPn18YCFHV2FBXkwxSWVwPENSUkpzczdqJCswKz1tfTFaTmBmCisxTU9XITI2PjtjXkp6UGIkP21WIzNPbUh8VztiN1gqZDwzTGNCI0dIcDtme1Bna2dqUCpmVz9mIV49S0gjNH1neVpsR3t5ekA4Yy1MY0QqCitXTiF8JVM4bncmOExybHtDTT1Ja0t0ZnNEQT1udlgqdD0mNnlBNkU/ZDklbmY5SGJWRGVWSWxERVp7fExfK0JOVCZScjBHaTRabiomUGZOCitPM31eNWZiMko8d2RLfj9TcDY8OSkwTG9peVlgQz1GO2huQGIkOGQ4dk9zT2wwNF9Je09Xbi0waCZYPmVrIUFjUChtUnNgVG9VVzN3PkNvCitEYXxhI180OWJpR1dDaX1RPE52TUJkKCs0YDxOO184RVNlNnp1PDMwSmcwVnFUJV5IZXwpPmxCeG5tKFFJREdzP3FkNHRCKD1AKHF4TkV1CitJdTdKV099Vz5wd35wNT11dk9nUXoqbGFKQ0k5Q2RRbUxrWCpgKUpVMFp2UUt3bU95ODEqTzJ1LSQ5TFUka1pPRXpUVV9+czAxSnRwfktwCitYSDJ1Umx0IWRJeyFxIWc8ZGZlb3xiQUZuTlJMaipqYyVGO3E4cl5Ud3wwdmVPTmVmKEdLPFVAUGJiZHQxKypRTHF6ZT5ZQzM3OGhyamA3CitDZThCJUk/aVc5dTFAbD5yUDNBSHl+ancye1duc1glaV9Aazh4KTFhPylxdF56Ryo4TTU4KUhuPlRPdj0pYUNVbj8mMkxEZjNNMnJkQGVeCitkeW9FbSZAI3xqRkhrYXd3d2FUMzIlbz4oZDtWZVhgNig7X155WjNnQmhwPFFkM0glMkAmejU3eT9yYGM+MTJ4R3hBNHczY1hTRmBEUEMtCit+aiswJm50TCpZJEBlaWZfTjQ+YHNjWVBYaz9FI3VqMkNHTjtTUnU3LVp3KylhSys4ZDMzYzc7QUh+dD10dWVEWWhLanUmRnY8WS14KUBsCiszcmVCdDZkIyVrSj9edW1vPUREaVJ4bGhpdnYlQjNhR0glU01aa145a15ZVkJ4dnIpYHp6eSp1JUleZDhgSzVHN0JVNTx7fWErZFdGSVFXCitmTT9CfjdZLU12fiF2amswWEZLYVBFOHZhR059KCRCPE1sTT57Wl8tMlFSc1o/Sj9MaSEyK1B9WjBJbGFNRWVgfHB4SnlnJk5KSkA8WTdiCisyUjxTdU5QYVJiOTYtfWB8bDMrfENwUXs/MC01ck1XPjshJUplVGc9alk+fUZWNDVsd3w+RHR7TlVHJTQjMD1RKCtfWFlwdmx2TkdxP0kqCityaG9iUVYoYXxaVShTRH5tajZLflliZFMmY1hIKD1fXm1UNF5pZlpJZH0oPz5SZFZETlU0OSpHWklKfjJ4bjh2fCRNRU1Ce2B2Q1Aqdk5DCitgP1Y/SmI7SUBxKXpMZzZnNmYqZjh6N0wpXmQoYlc1Nk0+IXJkaH4yLT5zaGVHZ2tJYE1SYSUxUnUhMWFvUzkwO0s4e0RqZXJBZiElaFUyCittamJwRClUPGExUTZuYDx6JSE9TEdEb2JjRTFeVStoczxKe3FycXU2YFNYZzAtY2s/NG5qdCE3RSU5dXM8fSk0U2puNldEJXNPLXdXS3ZaCitwTmklN0hOV2FfcUZMPnZkd05IOEw+ezZzOXlTRW5oX3xAYUFXb1VlRld6Qy1kJTBHS0E4WHVqTC1YKFBeSzJGPkhMTkh7RGYlS1ckaz5OCis4YDc7YlVPO3dKe310MUhYOWdgZXhycHRZdUludHEqOz9AI1ZqcVFOMVo/X2tecFgyYnw4cyFtbC16PGA7QipOYW9rJm9iekE8YjlWKCVkCit0enV4fCNLVjEzVCtuVHQ0P3ZYUDsqdjhhPT0qRytSe0gkaERYeTQ8VG9FMm1NRE1KZUNRb1lKTDhLNGhgTEJvUSZZc0MoeDRhM0FmVyswCit1ZWZWSyFteyV+TlgtUm9eYzZOTmF1Un5ucXtlZEBtZ1A4P0lGb094bT17JDM+TCY2M2dYN3Ymc2NEVk1pX3JMKVhWT1JgYWB8ZG5mSEBtCiswRkVhI2wjcShaQ2Nrd1ZBMnRCaHh+K2ZHSHYqJS15RVR3WCFQeyF2Q204ZTBJVHVKfl4wakN7NEs4OFojaTF+VzxwXnh9JiUkek9SYTZfCitVNUtCZHBhRDlrJEB1bj5FR1gkZVpGaGYxTUV9NnRTQUlzNDxyKD1aKiUzOUxld1VJKGZAbHpwXmZFNTBpRWN1Knc3Pno+SVVsbitYTjd5Cisqb1ZtRkN+ITMqeU5TJiUwKCk7SEJteGlyPkV+SktmcW52emFpfkFWN0ZLQ29qWXc9aTt+cCFnYVk2ZD5QYE01P2RYYSEtYWp9d2dDK1VqCitLT0xTTmVFV29IPzUrUnQ9O09nSzEpJFZ6bGRjalRrX2k4aTxpNWBOX0NXY1FWQUY1ITxuVm5vSXVyZnY+NkhPOWxeQUQmU1JTN29vZ004CitUeS0kR2JIP098QDNAandNQ2w+Sl5HSjxBMnMqKmgyRmg/RmRNIXVTSE8+c3k5NlJ1I0xxaGxCYXVIZmVnTU8keGwydG1ZVDN4cyh4VGNxCitrUlkmUnpNa2w5Ry1HWnNjUG83TVUtS2d6flFycm9SaTxSMGVDOUA0VjEkX3B1P1MmQkZnNFRwaTlwND5GdS1ufjZkUENwKEZPbCFOZCgtCis3MWpYcVdeNkMtX211R0Ntb2M0aHIlOWw7fEo5YW1tKj9JWk8lcmd5VFE3SGZUJkVqU3BfMmZPWGQoXmhnT29FWT5ITWViKGsoRW4yaz5XCitpb0B0S3hHKl54OEpRKnA3M3ZyTi0+XmcmZyRETGwyWktpLTZ2cCRafnRgQ04ye3lrVVNfSTNxKl9+UjtYQlVlNWBCfTMrPFkqNlhAd2VxCit2OSt8aHItKXM2djM8SjdjMD9OTXRvckh7dW9xR0Rye1UodWxgWCtVMjVOek4rTXp6bVU0aUs8Xz5eJiU9YHtfeXdYI2JTMG4ybFBwYHJKCis5SWVPVGM7ZEJobnM9e1EoZVlgcnN6MXVQOHlsdkdUP0xqKGcqOTNfPVdKT0o8VCQ+WH5RK3tTblo5YDRTJT1VNWNSc2IoelFWKVJ8PHotCitHY3BIcGNKQ0QqX0pDKHNBaXhXZ28pd1h4dXN2ezBTODtePmRHeTkoJUcpVW1wKk5uUVA7VkxfY09HJXZTd2haKWI/SlM8QzF4aG5XbmlGCitCVTNOKmZqS1YzNygoXzx+fDNZK1ZXSF84czM/Rk19RDBudl5rezRtKnltJVBENHl5MmhqIzFRQiZMPDZ4cEJ8MDU/M1VEYV4jRnlPPDJUCishdk58RU52Q2BtYkpPTiRNS0szaVlZcXtieTR6dFcyTnJ3TmtQK2xGS0h1QkhneitJZnBuYGozJDlObT9AM0Blc2ZIdn5MUEd+PGZwfH1RCis/Um0hOHskWHYmRitHeH5lT15hNGAoNHAhQ1NhQnpkOTUpT3s/RXckJnZ9azAqO29GZlBlT1kmSnQ7VFEzXn03P2dNOWs7M1hPfDRTWXAxCisxRGBGclpiX3pFMmpRNTYjckdoQkdPTDV5JVY4WHUtWHw7Vj1aSiNhaloyPFA2JFRIcCF5fU9zMnt7I2h0TyFBNmk2diMmVy1TNTdue05qCit8WjF8IXkmUHltSnJ0cTNCQUFPcT5jZGxqUj1uU054QHxLMHNoMG1mU0w7U1pTTC1LMUJFamlBVkEzQHx7WGZxMD4wd3coVF8jKkJ7JE97CitWP1EpMTQrNzNOaypLTTJSNnkzZEJVTUxwJmJSVG5qbmBUYGdiJEROaDFyMkV4KkVid0Q+fjRicmhGR2gpWGE8ckdPc09oNXJ9Uk8+aT0pCitKb0EzJExlI1hNQ3YxO2hnIzZnI2I8MWBXdnAhMmB7OC1SNDU/ViYkfVVESSRiQDE2KmBsZFEpZjVKMHdyKEVhJWRsR31fQnd1KSZlSzFDCitjKXh2ZXlmM3IqdW8qQCtFR2w7dEchc252YVdzM2NFO2NzTVkxYjgrMWt0TjtASzRIYClyN0xsVWhgN2d7JVZnaVdQO29CJGNIamUoekJqCitRMnwmekI/KFlFMnZmV15yckArUkBQNHNHKUZTYSRXcVFLe1VYOUwwTXBNYUpKS1J8eDE0Mml7Yk9zSWJtVGVBcWpLb3FAI0hWSUJgKUJwCitiJEF9fDVZOGJBbyZNdDk0eVM8UjNQYHF7QU5Dc2AzUSV1fipeOTNNPX4qYV8yZEFiMGxRbnx8JFNFcTI7NEteeG9ZeEYoc05pKjgodSkpCisoVS1oeVUtcytXaS1gak4mMGdFSllJe3ZjPiZGYjQ3aEQ/STJvYzhjaDV5NV5zaHxlYWd9MzAxOSkmaFIoKTFAMjB6K1YrJmt9VnlUaVlzCitiYiN1OVFJbjgxazRSNHpuZFBnZnhZUztSeGl5PFklRCFRcDZteTgmJk9FU15aeXArdlJlRXZVQCZkcktaVjZgXmtvVy1OOEpSPG53RE1iCit0WjI4ZHBVdHxiUVkxTEM+O0V+JXdTMmQtSjVQMl40U3hJeUtZcShwJnstfX1NTGtCZiZZVEl8KThUb3JaVks8PjteJSgmI3dGP09rIUJwCitHT3hLLUZ6R3dybD1peE9sN3dtJGIpa18lfHhobTZwailIWldaNC1AU2VUOSQ3Zzk/ZV5BUzV0akZ1b007YD1oLVhqNF9SJWkjRGFySW9iCis3eVFvQD9BcGopMmYpemsjLSUjYnFjKmA4QDxDR3dtbDdNYEg9JVdEMkFkYUEwb0crQWs2cGp6YVlYMTQ2SDJ0fWktVT9DS3JUPGlGIUMpCitGJmpWS3M5OV5tfV4/S0d2PWRlS25VKDVLS3xmZD1KJTMre2k0T1hiT2FfUj0tdDxic1c1X1pfIUNXOXQ0IyZHfFNWSFJhUk15dTlMdnpvCitoSndUTTw/SSVVUT9feUIxMUUqZChTSjVWZWhkJGpfemE4O15aV0swZlIzdWd0Q1dIalomNTRWS2E3MWhTb0pFTGx8YFZSWnFXMVVzZismCis0ZUQocXpJOV9ebVkybTZ2ciZiNldiRVNCPzNteTIxY1prb05FPzt2dmBoMyFHe248Mkg9VXslezx5QiY5MFNaMXhNdjE5YyVVNjRGa1d3Cit1NGBDNkFAMSlzO3dxWFlkeVV1clhWVio3cD9ZcyZ7IUtOQjRYMilPNnB4R1F4OX1uS3VZS0pMOD17dGlSeDc1OHp0XmdDNVBrQ3RzYSUmCis9PWFHcXNKP3FUYHA1c20xMlY4RztPQFU2RHxURmFLSEQmTmFAPVZRM242WmQ9cWp7JU9GJnt4T045dE1OJHVXaFJOO2s/cFojM0wxU1Q/CitoNitAVClHfk8pJUFHK15oXlFvRChvcXNtcHNVWnNkPjFmUUQzT1o7fEFDPiFSR14+MTxOYnd2Sm0rRjA9WSZZLVlLQlV8ZjJ+TSZ2fntECisoSWxRJWNnaDluRX1+Mzd7UVNkan4kMyRmWVhBR0A/KnglcDtIanZKOC1lNWJPJGJlRzNMT1o4cD50Jj1vfjxLSEtaYlYjdmhBXng5KnJ6CisoN3FhVHtfKWY/PWhGNDlhK31uKlBCaCQ4MkNNUHMyMmdfc0spdThEKitXR0Q8dFhMVmE4aD17TmdhdkIodkNKclFTNlA2aE93cHhRaTJ5Cis+Ti1SN3R1R1RVKXE4a2IpJEp7N0dUUUtHV2JxYlhkeShONH5zQWN0O1pxeyhpJDhOIXF4QjRfSnN1ezBAQEl9MkNKfXhuJUNPQXA2Y31FCitjdVZUfXBRTyhifmhZdC1ve1QtfjREbmZ+RG4hNXxUNXdeP0tgKi1Tek8tMDIxYTNtd05fQlJkaCplUSU2O04ldUkyTzFpanw0IyljZlByCis5SUZSODtGeEcqekdyelRVTjxWM2Bab1kyMGZGTjYwVTQhZjM9ZFFhJlZFXmZySj9neFoldyFsJTdqdSQtLUVeYFpQYDU4JT9sbXxrRC1lCitsMyQzZW09PTw/KUY2dmw1YVB7bCN1d0RhZUw1dkhmXkYmKnQ0dEVNcCFnK05JZz8rcz1NaXApTFIoU0Q7KGdsJDcwJTdkdlhCPkdadThnCis5aGc4eUF7QS1FbzFtcl9wYEdyQjR6Oz1aaF4pdi04bTFqKHM2QmJHP0BBYSVyZmhSNEZ7QTZUOXRVbjAyVj5OWUJ8cFN3M0dhbVBqO0BWCis2aF8mbTEjMFd3NXF8Y2Y/eEMySTFeYytAYCs0QVZNTnxFUHQzVUhgX2lYNSlHS0hXU1Y7TGlkSXF5QHMoR1VfX05faH1UeTZxLVUyPio4Cit1LXgrKk1hJmhxYFNhKnEwTHMmUm8qV2J1UEBfS30ye3MjfUlNbWZoa01wVnFGbXk3eURkYkRlZTxzXypVV0FtIVY3UitxODQkPVNPSUFpCitXZmszbXJjeV92bGIyY3FpIzduUmA7RkJ+XnBvbFpIN0NYdDZELXRCRzF9YW8yRn1DO3xOfFBVZUd6K04yJGB5TWt9NVpxYCpMYjhnRjk2Cis+fDs+bldkfEN0PHNxazRXPSt5dD1uJFZKPUdPRmlQfTkyQWtnXnwlb1did0lvNXw0ZHV0KDVOdFQ1VSQjMz4rZWVpTGohSSgpRXdjYjRyCitsb0JSR1dDcFZecis1dVYxd0J7eWs/R0Vidmc2QTVLK0B5fEJ8S0xmPDd0UDVmflo3bDVFYip6PXxjJTVOWHpOWVpsWXBgPU8hcnJ5KFhQCitjdzl0V3BXWChwYEVtRyhMOXFDTDtjQzBwI2pZbnc5aHxDNWdNJH5mPmt0ZyNoMk9uNm4kcW8qQXdhbzZ8SEpFQ1FwMEZhUylTJW9zfEVnCis8SGtgTEN4XjdKe1lleV9mOHRySmheUCotUE91RW9NMnA9K3xeR2gpfHVnLUx+JFh7QjxPJlgkP2lGMlNURzliZC1CQnFedmNHKWJFJiM+Cis+T3dnR1c1TmpBeVRzWFBzKGE7dV5hXnpROVpSJmdkSCtlVFZnOVZweTctO2RsflpAfDI5K2J8SFQ7TiE3a29IJkokdlVpfTk2ZklHdjdGCitCYmUpSkB+OG1IWjgwTVUkUjhEWUJeNi1jKl41XlkhITxfSlB3RDdQPjMtbiktX29RcT9je2A+YEgqbnRHKlN5K1cwP0VPOUtRSDAwMDA4CiswUH5kPU07Ujd3QkNIdHowSDBnezAzSEFVMEJ+dD1GSkU/TFplKHdBRkp4KFJiWmx2MkZMcV5lYjdebUdFXnY5PkpacEVgd3Z5bFZELWIoCis1Qng4el5XVCREZ3ZENG5IK25ZVkQ+bDNIbHlES1RXNmF+cF9CJDZkNSo+MnRaX01JNjNCKjJHa19pPW1BeHtYY1pGJkdSNl5UTDRwdG95CitYZmZfTlRBJU9UdDNpfColRyglSjlxdm9+PmFsWk1PN29ZYCsySHQ2KlNVSEVteC1kfVFkZXZAQ3U1eGE7TmBJVm4/X0VvJXo9NilXPWtxCisxMzVJQWBDeWVSRnp0YXE4dlFJckYxQWQtTDdkYComfnVfV2s/cy1kJGlKd0NuOGM/UkRPK2xORGR7RDV1Xm1VTkUwNlJ7VDFndHZLOEFHCis9b3c9aiVDM21HLUY4YFpeSm5pWT8zNVNiR0M/NmM3QSVeSl5jSkx3PSltM0pQbGA/b09ncUdvZDhTKGdYM3A+P01IYlNYZlFvT3BjQWVNCismTUlDbXAte2MxeXdoMnZAdFMhODVSPkh5S1V6LW5ufWxiYiZVRVVwUj97Z3ZXK1VxP1BTXmVfe0YlPng1Sk9sbCgrYT0hYkNeUEV4Z0EjCitpU2x7cmFBS1lqaUxfdUBvM3BvZF54aGlWekBPPm55Uk4hPSlyZzRmTG1wcT5lbnAlQGkyUGUte24xLVorMmk0ekRuTFY5R3srZHN4UE4mCitsZVIoX1ZUN08zX1F7JVhWTihIUm1OSztITTRWYURLcEtWcUEqbl8yYDk3WFZ1KDBKbmZJZiFndXhNO18hNyl8QFpjYlEocnNLQXFZYlVvCitCamckdHdLODVecExOMmQwdFhLTSE5TStvPzI0ezR+ZFVeX05RRkNGNkVod2dwNXVFTyhmTlFJYDhyei0/O3B2VX4jIVRXaCFDayFhd3M2CitWfmUjQ2AtNkNke2FObkk2STU7ZzgldGtQfDw+U0FMPkY/IU5MZ2tNN0VnYGJ1NmFASzg1dVFLMkEkY21qbEgpdSExJk54TTBZeVJPXyV1CiskS3RLcHN6bUVPUjcrJDZLWkBkPChHYWxEcFFOO3pvfT9DZyFpPj4kdzVJJjBWdih3JmgmOEFvRX1FNig7clMrdyVtcTZadTtqWndUKk88Cis0bFlucHowK18lfTR5VkNiPCRwWk51VWF1KXd2VlBeWSloMDBIXz91UHc1dzBWb1hNVGt4R3pgKDxOSEVnLVZkdEs1fD8/TjQ0KnhsJDNmCis7THEqSl4mVHxQX3Nmfk9vZC03YD1ze3lMdVgpeE1BaDBQNTF1RX5pcnNIQmxoQXlNYDUzK1M7TlJsUytBI3cpV2g2bEcpWjEqbD5HXypJCit7dGxnVlUqfXFAcnNgOXNAV093Wmhncmk5VE98Vz1sWWwrIVBTUFk/YEQlMWAtRH5JUExQfHlnX35fPkFeRzREaDBWejhtNkY/cUZLeG8jCitOJH5VYVhCcWV1MFMjPE9GMyE5NU96VmpfclZAdGptRnZkJUpSQ0NyO2FfZ1pTU2N3Y0FWRkhWc35LRWRPeiFme3AkR2s8b05kMD9hQSQ8Cis8SjtxMzJKWWRueDFXeGsqVz5KfEpeQz10K3t1Q1MqYitkWiZBSkszY3okNHlKXjFaQmVRWHUxd005KllZS01vJmF2KGtmKDk9SEowPkZ8CitgI0JsWTV2OWFkQmM1fmBEI1REQExJS19HWVFxYkNaV2V3VE5VKGU8fitxeGBwU3UkaT4qeGY7P1pMTzJXSFlZfSNTSTNRd0soWW1oUn1KCitKeyV9d2FYP2Focj1faTQ3elc7ZSkkeyRgY0NPZiNqOVB1UiheU0F6VFdGZFFFPkgtQShOeztSJSZURDNoV0d9PUtYdWZscEd2bz5rOChsCitqYWROMCNzKVQtKlEkTkdNRntTSm19aUhwTjw1NU9RflRZdXJAMkI+fjh5Rmtqej03aT94Xis7QmRXYGM7Rm1PeWY8MDImX0h2WGpAZjhpCitLQ0JZJVRhSUFaMmYlWEh3dDB3O0h9fi01Q0QhP2IyT3lgcGlMS1M5dik/MzkmV2kqe2IzZUlTcGgwbyFEUHxzbyM/WmFMa31rQU9hdGhkCishKm5DRXdubCtNT2JtejhzcCNscyR0dWlrJWU5PHwwaSRURDBXKEsyKTxRfWd4ZlgjX1l1VVVlP1E4UWtxTG80VzJhdTVGUGs+QldoaDFOCisqZFlkQFdta01fWj94YjM/dFpkYnZHKSpHJmNyPyRoSys0JmNfdGJLbD1LfkY0SyU2aWpaPTt9YVgpQ3JnWnpqUFExe2hsZTEhTzYoJjc0CistSGomJHBmMT1RMmw0YH49RGI9dSQkZFlfeHNvWHg7X0JTU3MoU0goV0h4d3JKaC1+KmdBeVNmYTYlTjk2Uzszd3Q2MzxxMWktMGlTLUc1CitnNFEhb3Bsc05Od0IlVygmPGg3Y2F0VjxnbjRPSkQ5bGFlWSlYbzxTeShAcHwmST1abGZJKC0pSH18ZmxaYWlqNFZ5aVFzOHVNQlhYWEVUCit1YFhEZn5kPHg5SjFEJnVRSnxAMk4tM1NNRTRlWVU0YnxOUGNCSGdwUUJzZDB6fG4/dl9gMEhPQnIkeF40MkdqSVdHSWsyZHJ6b05mM0V7CitsRTV+dz9LcDhZU1djVmNNO0BGX1R7Vk1FJTVCbSRhKEhkRWwldEEyWilrbmNzayY0RmlQRUpOYUNqIT9VMndiQ0RmJGxxNXIzXlozQE08CitaZGMqUCkwT2xgIUJxTS05MlUtJWVSSj1vVTtZdHR9Y31pTGU9c2hIdzRnVj48PXpsaEopK1pBI2JSVn18WSVSPURWT29XMTw1RFRnNitNCitzemx2KDkhMVN3V0xHPCtzPXNEJkQmdzlHSXZWWEhUang2UD82YzF9VjsyV1dudHIqaHBGSEdzSTA3WSYqd0x5TiNoaUFHfHpHe1Z+anFKCiteWSpMU29NQERibklzSDBZSWZsT00yWU0hYTBsSV5pMSNCQXBYK3RJMHg9Yn1nTz96eElRQ0QjeG1PSlEpfn4lOH00OCNFXjtabjQhX3dtCiskQUJ7NnRwOE1OS0oyezBiN2spczM5c0hISnZHRUF6Sj5pNXRQRXFCQDY3NDNSQj9RMUF7QT4yKEQhUiFyJShvZzk+R1Fzbkd3PTMlbVU1Ciswe30yUmhhTFJSaGBeS2QmeU5SbSZRSCZlaihYRHtQVHlVO3txQWh+P3pIQ2paZVFFcl5nZVJ2a01lKlcreEJsfng0fl4xSTlMdVlfP19sCitpWUMmJjFpOXJ8MkY4RHNAK1hxMjd1dCRGUD1QJGVlSkR5SnY5cXI5fDRNNH5APytfZ2xvPWtDYXVvfHxLJTV+UVlQNUJ4WE95ODwqITsxCit+cDdNPjt0dDcxd0c8IStOOCtlfitgOyE0OC1XVD9Gci1wZnw9VWl5WGk7I3BGOWdJeCtQR3MteXhmUlNNIy18JWhKP040eFheLUE+UkN7CisjT3k+Vyk2bSFkV1FXXkNTakMwWUZmUlkxT0daTTdIUUV1dTQrUlBkcGxhQ1dJdCVLdzExXl87TW15Y2RQanp5PHZZSyUyI20hN0l8NTdJCis4biRGYytpYX4/cCtmNDhvUF9KQn4/dn5NSFQhOEx8d3VncFprK3l1PzI+JGtPbHREcGhYQDJEU19qUTJBdzlfMjMkfn41d0BzOy12d2xSCispJkw3aSluWEhoZlh4VT9PSTdvKWs9P0t1SWdhe2orLTlub2VLYUQkZWN1MjwkJXoxbDslT0t0SihIbmJmNVB5TEVyXiQ/cE1kd3xHSmhMCit+XjltZWt3dTQ7PmEobTZAVkcwNnhiPnAoeENXakZNNVgtUWtYamNkeU9iKG1YO0gyMFNKUDJeKURsUyQ/WEMlMjdYN2d8Zl5KeT9rWHhjCishanpGYXdZdChaczY5KnllUGJMcjlTTExecTZnSVRTWE1yP1BmQlA2YzQ2QGYzeSFTKz4qYW1IYlomPiFHazhNQWZLR0ZYSFcwRnghT2B+Cis1fUUoYHN+eFNRS2w0ZCNjTT5oaXVNNz4/ejkhPiF7bXpOKitMUnRJbUZ9NmImX0VERntEWHUyVC1IQVB+T2peWG5MN1FpbihKNzBAZ0ckCitvIWw8OXglUmgzYXNpQUAoayloTVNhXl5RISkwd2ZpPXVZP2BxSVM/biNSWDQ0dEpfaykrNVk3VDhrVmxmc204SEd3VyFNPUQ7RGxQPHx6CitHS15pcSRWS1JgVTxBLXgpMktNYm9yKGFPdUVtT1FkaEd6JXs9eDdnIVJgN0liUUdSKm0oZExBN2soWWJeS3ghfFo9a0l8fDdqQ34qMX1MCitldGpRaSFkYzhmcHQ9SDR2e0p2M2w9bnVeSVMqMVJ4eW45RSpgfV48eV5TZEZpRnN3Y0txNDdyQSZWVGNEWSZCTmVYWGBLdWZ0KVBBaWprCit9e241S2JVKi1+d2E3Mm9tfFRWd1ImKCUrJjtROGdMSkVtIzIpZU1RVHt2fSEkTFJjPTlMe3EqNE1lemcpN0p3eHZ1WT41PzB6TXB2LWJNCisoTjh5e3IzZ0FBYG1sLTBJK1gyMTRGaThIK2Zfa1UmS2F8SEp6cVI1OT8hPmxGeyQrVT5LeSQ1JWlMQEN3MjdWWmRJPk08JS1tdXxkRnFPCitnPCFpMERjI2BmX204QXtzY354Y2pQX3lkUUs2Rm4xPjU4ciRLZmpQRmZwaVJmWXcyK2chIV47eVB1VUFPS1d+dURmRU0hblQhXm4ra2dVCisyNGhPQlh3OGN8ZXxQJXNecWNBWEZUY0paMlFhcnNCbmhuPHt0RUN7TzIxKThUTkNIRTlreipLe3BpTmRyOGkyRygjTkp5UzAkSzFaZXdCCitpNStTRXpNZVM+cy1OK0ZyPSN7N1R3VjNDUGU3en1qJk5WWDJPJTB0UXt3U3M2SDVreDFEbil+RD5nYm5sSjtyWChEIW5tODtxQHBZaXhmCishU0FreCVYcTVSdT1TWGRFKGY2fEVAOVhuWilxQHx+OD40JEF2aSZidF9qX09wKyh4YGMqZ0VoZ089djdPaj5SN01oS1V1WllIZFdgUnZrCisoTUpkU2d8TyM4aXQmMG9LcEt7UH5adD1jYzVNJW1DI2JhVUVmZUx6JGBXJDxMWjlFNXx5cClYX2kqajVOMj5QJUB5Pil4cyV0OHZASn1ACithfGhjRmZjblN0IXRjOCMzP2hjKCk4XkAyUmxiYGowajZ6QT9BVFIwUU5QSXEwK2Uhei01ZFRBdyg3c096QCgmZ0UlNVFxc0c9S2FUa0hgCitZXkg9JXArNWpGeChjNlBOeEs3KFJEQjB6akx+NmQjNUpwbCN8R3hteEptN1oyWFJ0RXQwTFRIdTsoc3RJJnN2TFBMOCNmKXU+KSRHX3M7CitiXndsdmRPQi17NkF7TkEmX2hUR0pfNlZoR0QwRUpVWTtTZygpYVojIVVgcD58bUhedFIoUlRUN0xmY3BXNHsyTE9YI1diQG4pfVA3Wj1ECitQTmpXOWpnaTdFZi11ak48aVFgaHVWVlpZbWowTXpHRSFsLU1iKCk0ZlV0dEtkS00rNm4he1VCUFlAR2s1TWJ1eHlOejtfKm0+UnsxZCR2CitZMlBrdypfK2tzVWshO2oyPFJ4Y1E0az8odi0+KlRAPnNoNHVZcF4/dTdMP2NYKWpaeFFiRGtqfHs3Rm1ASGczVCg0TDFoWkErLT5XZnBZCis3MX4hJiVnUWQmRlF6TlhZYko7dzVoa1BvdDs9Q0AxUSQqWSZxWig7OypKMzN7OStLdXI3LXpLKGRLfkpnV2dxdHEmdF9WdnB3emY9YUVQCitIfHwkfj9sYlFVVl5LWiQ8S3o3U3VvZGZBMGk1bitDc0hMPUslZTw7cSpNeSNWfVZ1XlFXNiNoZ2Q/em1SWWIxPlhscU5VTUxDJnhBUzU5CitVQipZcTBNVU4oTXNtLV5vcGRKVmc3SU5+LSEyT2tvPH4zNmRxWk8rPiNRMWMmaTg2RkEoWXZpPEhsRXIzWVRAN2QkKSlkJVg5VXc8IUFrCispYjE2eF5eQEQtKiVLfTluVmpGM3xHRWotYktmWXp5RVc8a0FZaj9qUVRJeikzbm9yaUskUj5yZXVKb25gKVRsanBoV3lXb0NAJT5qe3o1CitUfk1jRlR2K0BSSyklOWRvZFFJcSVEdioyc09qPWgmbjFXRVpPISZeRlBQUGJuM19ySnB1SWAhcWI1R1AhTTlJRG51ZkQ/aXtZVCY/JkxVCitCd24/ZTxWQTN5OUVxfCpPaEVSNVYkNjEtK3oxaD8oTGlEYE1YbkNvOWM8TGFuNCh3cmU+U3ZsN3FUWipQRl5MajU2cDxmOFZEUmA7K1o0CistQSFHSDA/RTUzQG1wclg7Iy0raVJ9Nyo+TntnSVhPYyVvcEpIUWxIRU1YWFohYm4rdU5qSSE/NnZ7TFdiPTBmVVBwTWoqYURqZnMxdyYwCis+dXhDUzk3YUR1bldAY2wxUn44IXdIS000WUNrU2Z6JnItcHVHailpOEQ1JXBpcDxyQkA1UD5PTUltY1lWYyN8YHs3JCpDUXNCbzV4c3FWCit7TFYjJDI9QU5iNDVjc18tZDQhQ3glVTBHPXZWUXMpKUpLOFNOO31xKHVCSEp1UGd8dntjdGFoKn1UOW1PX04pSW1MdE0hJjY0OW5fRFM9Cis1d0R5Z2I+SyN0XyZxaHFYZmBzOEE8dEo7UGttSkElbm49fjxjNVhwS3Aod2xteG5layVJMzh4fkB+KGN5NDEhOERMbzswN2dScntVcUdWCitKWXF5TzAhKUdedSZYYT5WVG1sRCVCMVo/X3dqdGR1dTwte0d8d1BOeCgmSWVLJDQ4ezF6SVQ4JXE+Qk1tOW5mO2NgI1glcDE1NndoKXI2CitZYXN7PCMqMkY/RyRifn5LeDcqe1NUNXs7QWx2SmhnYy1eezVKemVRP2FEbD5JMXtEX3R4R3B1aCtZKGV2dXZsYDlFZjI4QVlPNExtZkBDCit7dUQ2V3UzRl5JRnUkeT9KQjl+P3BhWWh0a1dVQFJZdl9wQDM0Ti1MakNjfkkpNkBFbSk8bHh7RCFDJXZAVUNmPXZfJlQ3cTxRUl9DNC0jCishbXM3SXtqNWtUY3NrfGRsc15JTT1VRkFwbHxMTU8jd2VSO2Z4WUF+WT0kYnZLa0VpKHhzWDZkcFM4MjJLJGtKbyk/OEJlI3gpbjdTISMpCiszXk0mI1FuKig1SGE8XlBCVXg5e1pZcmBFMCZmQyh3bGU8KEVrUUJEfWpIYS1RRzNmdE53QV90SXJZZ1U/P2VkYHgyeUU4MW0pIX5USFQmCitrd3pxaGZtfkRTd20xNylmcX5CRmRDd3pAe0NCdzttckleOXojI2k3THRrNytIfjNCKFRnS3lmOE9fY00rTnZSVCViKVI3OH1TfGMyWnteCispY0ZnTUFEcHBZZk0mbjRGQyFNRndGT2RxTUk4aVJYUkxtX1QjeX5zVGNveXhpJkFPTmRDdD55NyRKU1JzalR4PEo4e31eZlR8KUtCI2BfCitTU2lTUmAwdCtEcnRePU9yWkUwRDAobn1gTzNzYUV+cmk9cnJYKF5xOTc3PDhDUXl8VipgeVYtb010TTdoKHY4el9TO3tAend1REtKaGsjCitAdUxqZjdmYlZ4fD1NdCNqem1wYF51PV9TcTswfGA+KkEmfUE2NHgkU0pQNChLKk47PCgzOUYleXFrfWZ6MGJtVm8laDxLelIzfGRPRUQ0Cit2LUh7Qz5EPXQjbTFpaTxNQGNHXyZvSmBvK3FqaEtySElrQE5Bd2lyN0p6IUdUJXx2bzVZK0d0SzkpdVhgbTJmYztCYVhiKU9FLVVGRVUoCis4Q0FHZWBZSEhDdEFVU1lFPmN0MUNaRCk1aDF5YEh8cX1lNVF7ekVnOW4rIzB5cyk+QXBzTyYxfVVVajYzPkE4SHc7PEE2Jnw2PmNwa3wxCitEfkBSWkR2QUlRPVlEcEghXzRFbjBkOyVpJnc+ZjJaSH5zPkYrfiYoOTVJPTNlPl5aSjEwdG1oUXx6WFBGWnZpKmZPaWt4O1l+S15kNDE4Cit+I1krKSo9d3RuaG1razVVO1Z8NyhKaWJtfVlsRDBCKGNiX1lNbmc3JEw0RUpnckg1SkhnOzhGNXktelppcSV3JjJZNFRjMyhIVlFNPCtLCit7WFpoSHVHK21+NHB1eEBGbEE4VDcldEltMyh7JX5UekRnMDJZMmRlLT1RMEFkWDgobjB6WSQ3bW5WV0J+ZFhXXlc4YENAQE5ZUGlVRnpzCitPfktwZ1J0fC1nQj9fYSEqMT42K3xnYypecz8+IVIkezFrbk8rJUR4dTRxX2p1TWpBWSQ2REFDMmN1YEBFVXxaMXlZPW48OSNmdnE1JT5fCituaHtDODIlbkVCdDctXkpheiN4SF83OThnP1Q5cG0wK19eeGhoQCpzKU04RiV6b2lMfDc7aHdoXmJnMyQjfjBHe2djVypMUWJ9YndhKDdZCitFU0NGQWFYa3JsR1EyZD16PFhefGhnPGtQX0VLYTNveCFsUSFlSWZDMWMmTT5qUnxXK2NhYm5yWk8mS1dJJjdYcFNMOG9DSk5KKnpnd2d7CitnaUswVTZ7eUY5Iz9hfVFmdSR6Um9wSlRkViVtXylEYTg9enMtbmRKPD1hJXx3bGpffHU9RURYODFgPWFBZ147XnI1UiVubVlDPXlHTGtnCitpWlp5SlI8LUhQQCFtcHlYO3lyXldRN1AtWDQzU0h1WDQzR0NrQ1o5XiYhY3k2WmZvTTRMYChFMWIkISFhKUVYJU1Aem8je1A9XlkrK2AhCis1RUFMRD4rP0xgeThNSGNuT1IqMlo7KU9tRGxsLTVNKW11U1JKe2JIP2xoa1NZfU9BQDV+X3VHZ0BGJk9zQTgoQS0yRl9BITxYNG1FO0VECitHcjV0R2pBRUBNWXxvJVc8UkhRSDNLIV48RktBPUM9aTQpdiFPMEcqcikjVTkhUjtQb2w7S2hATFJ6MjdTT29JMkE0JGomPWd7fT0xITUqCitBeHRFMlU0VG0rZ1h9PkEoRlh7bk5JKD5HOFUlZzRNSz5yRDZ6ZEl1UVVHQmFAKygwWE54aCglQkEqNipYN3t8JGNGVFJCMEttTUphQnNWCitZS25nJng0bylmP0RfQXt5e31CYVUjYGNveUojfSQxT3dEYnpfUzI2XysqZUdiOFlkZnlXflZpOyUmR2V0PlNAO0dRLWtma1BzZFE9M3IyCisrbGxCOTlLR2plK0QjP0xjMyg2M1d1OUctdnE/dEx4eGlQdVJjMmUmWkFUYWJldzF9KEhPeXwrJEIlVCVQV012KjNsMGRgRVIzUz5mK0MwCitEfko+KjU8cHl7OysocWg0PTtUT0hvTlExOT9VWmpeWlFpcX5JTkcrey12SCpVOUpJZXU9NXZWYG8kNEFwOSlLTHU9YmxFYHBmO1NeUVU8CitUMThWQj9hQS1PazdzRVZ2UnsqXjt+JWolSmVLdVgtRyFIe3NiU2Ftc2F5RlZIXzsrZSNXJDVgfTJvZkZReTM0UTtRdzJxKmdDVFE2JUkkCitvI3FQYnNxakt9OXVRWl9UOUNBUDZfNnJea3kqUClrMWcwTXJVdExpUFEqanl4VHFkd2JXdlhOa3NaNCYxZUhAdjstdkRhZlY7cjw8V0I/CitLTXdwRjZtSU1efXhHRDsqNTxyZGJsVTRIQmNqc1A8ISYrbEl7S24qNHh0TTBNNjBZZyklZnFsfXdzcyUqeF5mP3c9eV9kVGNQeT5aQD4qCitOXyMlcj9AIV5TVEgldT89dVl+eG1nJUopbUxIQzlBVylYMCpaaGU1N0RYIW9YX08zTS1FJmB4a2UqMFgyQFJDeTNtYHw2Sk1wPmBJZjdWCitgSUhXanM2XkxLUE10e3dRJSlkRnk3VCYwU3cqNSNQYnt1S1d9fjVOS08oJHtWXyV3RGI/Kmg9P0JMdHhLR3JXVj02eEE/Iyk/PEsjKFpICitJbHxAbnl8ckpXflJOS0UqakYyQjwraU8ock08VSNpPnM8JnZiV28xQDJ2Oy03bzZqUTYmOSthciFPanBRZnYtV1NOWFR7WkJpY0stcVV1CisreE5PSmk7SloyKz9ebis/WU42ZG1yJmF+Sn13TGZwe0MxSTEwfVQ3e0VLOyVtcmQwPGZqVk5YPlVOQWtQS0VmKVRyZ1pTOV8xIW13fCQkCithTlQoOD0rKzdKJiNwZW4hK3xoSjtoZD14NXp2JllsUihZJE96UG0kKm0/WnImNWxXfWVjT0tHNUpyPGshNSlUazZmTXohb1B3MWtXcj5pCitJT1QkRDJUR3doZyE+Jj1RajFYOChUU29fZE5GO1BMS1FFNUYwPHkmMC02REw3UXNqK0YrXiZ9dSYrdkRjZipIY0F+OSZ8YlFqdGp0UnwzCit+fi0xMzFfQ0MheExIYTctJDF1TTdfLTZCVyQzak9sMHl6MiNkVzBuaEA8Vik9YStiPkttXy1zQztXbUMlZTc3b0JhdylnMTlEY314eStJCitCXmxBPDJLWWkkR1dHTXEyS0w+SVhKRjFOfS1KXnBCZW9QVEVEVlllJFM7RntnViFUYFdEMmFXMU0jbCt4dXpIJUd8Mm85S0UwfnFUYyFDCitRSjl1MVomJT9iSmo1eyRQbWUzdGhQNXdsO1hPZzRTb1dyK3I2O3F4Zkp0WUBeMH1pXmpfJEQ9QUtmdDUhZl5TaiE/eGNjRnQpM3FibmZkCitPOFcwLTRCfm5mMUVNX0NJZCsyUWJaU1hJM18hUGVgKUchYkkoPnZkMUAqNyYzaTtUdztjb152OGNRNG8/PGcwbnMqamU4bUhUcWZlJjNiCispOXBRSz4rbGd5RXlJNEJVNzlKUy1pZEx7cXUpP0NJJVUzTyZzbm1gKjQ1RVZfUTdqT1E0YHQ5ak8+QnlKUzNoPWhnZU9pZlJ4Yl4jTHQ7CitibyMmeU1xZGNeR0MxQyNGN24+RDspYzNHYj9KOTcrTllmeU5TKzV7LTNleTNsbTFWKHFTWnY/aFclNnFgXn45YS18RGolNTBtcjVjU1YoCisldmFRNU4jdExOZ2hHSGlkLWRjajQyM0pITEhJKFpXRGNzOztUcX4hSkVFfEJSYD0+ZktCc0RWdVVyNSZpP15XTzlLUUgwMDAwODBQfmQ9CitNfTk/czF3XkkqMDAyJF8wMj1AUjBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGTHlJQ0VAZ09TPzdlP3tSSz5ZNGUpZDsjbDVCRG9OSEZ9Cis0NUcpJGg9bl9qQGYodjlyUkR6MiF5Rj5gK0V5bkZpbTQ8VHd1TEtmTG1nWnp3WWdAZG5afGtpVD5EOC1reG01KEs7eDIybUx7UzQ7I2V5CisyIVJBKVVAcVFxb0Brbj8/PkljR05rXzFecFdlRSlkPWRISnlDb1NBdU09OSF1MmRGRlgkb3wpOSN7eEUwWklMLTxgUDI7JXpvY188dnttCis9Zz57UEwjI0RVVytEPnkxbklvMGh6Qj4xfjFVdVA8OEhibD1AZ2NtQU8wZHcxU0A/fG92P3p1WjtTQjs4eHx7ZDxjbFo+Y1QlIUZfQSl4CisrKnN9eVZ4aldVKFZYIXBBTVNPcisjLTd8RFc/OyFrWjMwYl5mMzF7ajJqcz9FVTJWVSV+dEEqcUB2cVY2Y3wrfEg8Tj9HMm5rO3lub0ghCit3fEBWNzBXMj90dEpsTUVPSDROST1PMiEjT1UzbllXPmJ6U284ejg9emBxLUNtJSttVXpsaE5iXy0qRG04KXN0YXNXPG5xaUZNbEhXaE97Cis9dz16SjRPfjJER19WMWEkYW9qeG9DXkIoUmMpeWBEVFRJO0pKUU4ke3hYSiVicFU/WDZxT2sheXQ0LWV5ZjBjT0dDSzI4ZnBFZU19d3B1CitUUURkTTwwdTQtQ3lyKzZwRlUzUGBoX1N4eztiMEhrbT4lS3x7PDllQHhOMXN2VmlMYiMkdTQtRH1eZ1p9eVpHfD4teDVFNDZIPFpfTypWCitfOTRGZThzK2VaYjBfWkBMKDY7a1VRJnxOWjtfXlJKR2FeYVY9KT5nS2U5JTd+akllTEtiNjF6YWQxTyRaSCQqOUdRNWljYyRXTCgob2lMCis3VylhcFRsdU1GNW0hRzJ6Vzg4IzBOUjhUZz9KVUozdS1rc35UY1phTys3Y1B9KXZ3QTRMNkdAZUlrJEpTV1d3ZG1MVSh2V0cpTT1RSiYjCitmJCN8K0wzKmpfVDhgNld6NFJfayk4dG5SZ0M/empMJHFwIW9OdiZeT3BmY3FmPUxiVWNXVTlQQStLPTIpOztYenl2d0w7PVEjT1FKMExqCitlMSZrdERFP3pRfFdWcVR5SmJYenNUdjxBI3pENDR6OEVXIyQrNVNLUGExVlFpb0xWNHx2dy1zfCV8bDlhQUFKTEFhZHhAbCFqNVFROVk4CitGaio4bm0+dnROXmo9b01vQE92MmthaFR8U3BKayZOY2pFRUwxYnRlXjEoaUx5RUQ5eT1RQUhYSU4/QSNhenstUEJLeCl2SEVAJF9eYU0pCis5UE5JJDBad1R5YiM8PT9tS0chX0R1VS1jNmVNbEROZl9lM2JNLW5GKXw5K3lQKDt0Qj4tfj54IXFKSyY4Tlc9anVvNU9WdCtFWXg3fTZ7CitqYEhzKURJUUMxfmAmRlhUJnVxSlE0fFBoYytxRk5pViR9cWRnfX1KcERsJSlMMEx8a0xveUopcFJOZE0hLWdYYiN7cj1UTyMkOG9XOUBlCis5MCZxQUt2bVFBcy1SN05kTVEtSWl0bjVoODlXeCkxTGI/XmBTWXdfIWo8IzJSViZvSU0mZndrRmVFZygjKXo1S3VLND1UUmcyPjMhPWZUCitrNiFHLWN1VnpFKkJZaiN5SmBBfmg4NWNBTU87OF9EMy04cW1tTjQ9UjRNPXZhVT4qVl9HYkI/TD5DfGJCKGJtfFY+dlM1OzNVWktSR05WCitQZXA1QnttSiZBSGtDJnlRbncmRyhQUj9OZF9JV0BtdXNWdHRYNzBrZyhqKWcwVzlwMnpOY3kwMHF2dWRAMSokQHJJK1Uzb35qJitnXjNSCitUVXtOWj1qVClVblhpKjZxZFokV0Vta1M2fE9eaWg1MlNhdDhWdCstRX5UTXdQMzRrVH1RaHJBO20qKm5DQVNvPCsqJDAkNlpCZClFdHpZCitpS2A9T3gjK1dlO2wodDMpIUh8dWteJEtlTlJzO1dyX2MkQy0mPSFZdzRmIyMzZH44ZW0mNj9gMTRwZDdxMld7aUYyMSRQemBrZmEzU1dICis/ZStXcEZvPUZsMWY7WUEyYypHZ2VqdmF+XyU0KHswMTZsalZoZVgrX2Q9dEpiU1VVQUZYRkF+LS1VWCl6fStsWmo0antKaXM/SXRoKE5TCitNWFhuRShBal9jTk5yZ009PTNkK2JLKCNRKT5kYkh6NHt9MS0kMkNINFBtYDA9I2ZkQFFPSGJycnd9TWN6MUs1IUU5d1VSZG9zck4wNjcpCistfmpfcHRma1pabCUkdjRWM09zfChOYncoUUhgT15kMzJ7JEx+aDxJcmJBZUBvPE1rUGI7R31wXjx2akk/ejBGTUJgalNOazczfDlHbHFlCis/TGNmUTVZLWZST1lsQHp8QTg1Rng4cGJte1Z+KmZMdGFBPlM4UnA/IV89LTA3azxTZnR2NSk4JllAZXdtalp1JXd6MDVBe0g9Yl59U00jCitvPXtreX1HbTYtJXk+aDdhP2B3YVI1Yj41NSNRMkVMSzRVaE5wfFh2WD1za25pfih7SXx6fDdISXFqJDtPdUh0PjxoIThLS1MtXz5UOzVECisqaUF8M0l0YGkobChPUmwjQD0ha1N8MHVwKjVuK2hDdlVsdT5rQiVAdzRCV3E/Slp9cyNtb2grTHJ0ZXRHeDtMYj1nK1dnZ195MHJIWFEwCitkazV5IUZDNClZSGtQanJ6QmJ9OHBoSUt9cSQ2Y299Jm9QIyNfWTk2Z3F0WWZ9cnV6RXVVVkp4fUtaWS1IMDw8MGI8RmhRSUtYflltI2AzCitBc3IpO29oMWdzd3pxeHF7ZGpKVkNLKWpaN2JMTWxWSFdmMSQlNl9ZNS1hJW9eckQkRG0tNzlDI3MyS2FGM0J6QmNnYz97cHc0K3RydFVoCitLKDhgRDZHRjFVQGlHVyRHQ3s3NkFpMFFuNVY1NXwjdHp1NWgmKHFART8tPXozY2tEMlgwUGwwTCNKXyojTXpJKVF3fk0pMiNvNGlRRSRWCitKez5VTFBGPmBCcGZgRnY+ZFg4RmBxdnlVYz53N1EhdDA3MlI2fEMwcnZII0J1cGBraCVgbmYrVE40dyQ9WUs1NVQ8c1lwQU9uazR3ZEBwCit5RCp4RVgpKDA9dXF6amRTfjghR0NDV2ckMmtuN0FmVHI0YnBidCVIP3NZfjsxTW02PllJNFA7ZTdYYlQ7fllGVmBkdEt4czFFPnlXTT5sCismJXhAcFVOUi1kbHptSFA/SUdvNk0kZUJ4VFhFX1RZcmBpU2NaKTNTakR4I2lyYWx6clJyX1VRZVdOMT8lbzhaLSpGZHNPNHdiYnZ4dXRWCit8bSN5dk8tWWN6YHFeamBXSFdSMmxtK2E8c3QkQjQkfTZeUkYtRl48diNEMGNpUnJJYz1tRlZkK04yVTw5cyVwOVBVKDZNWXp3a3NKeDhDCitHYVZDZiQhdjk4NUItNz8+e19OdTZFZzgocHU3VzkxMCZEJkg5RGxLTDlVOVU9JTYxMSNgVDZnOF5iXmw3NllAQypkS3gqNyN4OHtucE84Cis9IzJpQSppKDtCWCNLKjxtc31CaCZnPVJIJGlXTGp9fWI5WTFUKkkxQHBqMUo+JjVDQkshVT1kO1c0RktIRFpAdU4xQnRYKklNJDBCUGJOCitkNyY9UnRSMGEldHVEI2xiVFpXPngjR21zMXNvPyUyO2lIcG07bl9jVW9kPHlzLUV0YzRvWEA4KzdSJTxnWUhDaFFJXzUyXjlPIUQ0YExoCit1dSlpQTg0bElGM0p4UkpjKjkjO1FpWk5eNWFAXl9+WnUmeTU9KXJuY3VNI0goQFFaI2lVOVpVPSNGLXd0M3VDYmhnR0IreU1eTmcrYDdsCismR148V3BzY01haU9VVCQrfXotKDxlY2tpO3BYTlNrfTh5PzxydnotJHtrSzsmfHkjd1d0dmdKNVF5LVNXTTRjKCNSVm44ZUZoRz5YTEQkCitWYUc0SlZaNVdBWjYwZTdudnktQXdtUzs8KWxtQHQrV3d1WURKQChjS1dHV05MNWc8elpCK2kxTE9MbEM5aXhPdzdZXzhvQ3dGRjsqJlI9Cit2SlNPZHdTUEdBRzl8MlppM2hQRitoLW5HZGpaNFlnSXBxZHdNb0FmU3dpdXBsMVoyaFhMczFUbSs0Z247bzJWZDdRTnhqVXdvZGhEKUczCitrWk44PTYke2N1OSUyX2BZPmZUfSRVK31oPXYzNCo9XnZQYVlIdnUjR0E7RGNSNGkmKEw1P2JWNz1zVyZ8SjRZeEpvTm47T2w3NmhhbGlyCitedmlUblghTldURmZaYD15c2hhPzBUc0hKaSFBZUh2UWxYRE5GY3hXNipWbndYMVZaJm5NdkN5MztoNmVCMFlgSXl2QjM8NE1rUmhnRGxHCitSNWlSMCs/a09oZzZVVnxtbzNASlApZHxpNn1UOTg1Vnh0QCpwYFRUTVAqMzN6VF5oemlySUYpWF42ZXlOcWBnNWlQMFI+bnxPdGs8QmN9CitFYnYxODFtWU5SdXVMK0U8bV50UG07WSk+MyVfQlRWVGpWRS0zREl8VyhzTkF8KzBVKEsoanxBR01ZLV5aWXMwPCF9TWI0NWUhRiM4QUVsCitEIXIlekxuZm8lc1k+RnRTcSg8OT5mSX1hZVBPJWU5KDA1PnRkNWtQMiNuQnRuYF5vdHhhUzc8WHJVY3l5WVcmSVY+TmtsVTlTO0FtKmlWCit4Rkx1MTwlJEA+eykxI1lVdz1nIzleUFUoQlkmWWUtO3hoblRSLU1acmRGfHMrJXlFeEdwPCN8M0RKWkRLSkQ7blJ1OFFYRlZ0NFYhVjhDCisyPE1UWHc0I0FVa1c3dCFPVF9XWXtBYGt+Kyh8NEU8TmVQSVA0bHVaJng5eTtASDlNND1xfHpgSCghX34hYjNQfkxnWT4oRXs/dzc0MG0+CitaTUF4dVhpUVh5RThjS01MekpVVGQ3PyNiVjlzZURjbz9YXkwkcyt2bDVnS2E+SmpzUkBqRUJ2ODNmM1Y3SzJXa2d2akM+XldxXmMwPzl5CitLJVc+QnJScG5CZHl9M0tiYlpWa04xdkxXZnJmP08mcSZLaiU4dTFaSlBCY31WIXRpeEE9MHUweCRzTzQxKSkmMmc3K3Y2fCthbnYqM1QhCitQSWVpXkFLdDdPTjBRKil6SUl4UWZ9XyYjQXo9OFg+V0JOYi1sa0tpJG4qKGZRcVZfQiEoWmNsN25pX2VvU145K2hgXittdUcwPjNMeEkzCitrSl9OQGRRYnFhTipTUkskVnA5SFdBWT9SaiRRNTxRajJ8Yis7Pm9uTEZ9el5eQUlPYUNwQWdVbFdhRlpeS1JDRnZPV0V3PDNpeyU0VU13Cis9IzdvRzUmN2dKVG5DUDZtO0EmUGx5LWRLcTI0M1Y2S1NycGZfOTdCNWk5cnVhanpwVXQ8NHtrK3ErTjxxXmQ8cTdJentSJm1tSzJOPHg7CisrUU1ZJldjVUNCeHBwbVpNPS1tN0N5eVlrV2x4aSR8NmxITVkpKnxkPUlKaEN0TFcjSStYQCpYcXdAPCZhP0hobSZpUysrXyhKcWYzP2Z5CituP0ZaKWNOamVvN3FkJE13Zz9hdHwtVCUtYT4pansqO2E+bTk7QTReTUokOHZ4MF8mJD5YSmYtKW0kM1ZWMWpFKWNCSSNme31zdj5mblBXCisxa1cyTzN8KnA3S2ohJihSQmBSUUZHSStkazgqKD9oPCFGRXVhTmVVV3V7P253S25KWjNVfSh3S1pzfV4tPEZgdFhufDJjZzJNNT1kZkxWCitVfXpwUE5xb3MtWWhvc1JreFgoNlBtWXptdVFjPXo5SkdrQCRoKjxBSGpAOXk8NnRoeXBHPUU+a30qKHV0K2hvUVBtWnt7KkU+akcla3xsCitrWTAqTzB5Rz5zfjk7NjNwNXtWXm5SJTwpRD1AZWEqI3h3Q0Zjbm1ESW59b0xLU25ieChRSGo1X3UwT0ZHZ0FHWHtCfTx9fmdWQSN+czN8Cis9OEZ7fjRgRGBIYF9tT2AhZnYpTDZHVjI7amxLKDxtNVM8Q31kVE1uc05FcHhMYWl7fDBvdTR2UWchTnFvNTRwaU5rZ0s+Pl53TCNNTituCit+R0R4JStXNzZoPnZFZ1dPXnRpMUgjbzd7JkQpKEx4cCV2V2xAKnRCNkh7d2dramFKcEM1Vyg1bHJTNVAmQVZOUiFYb2sraCVgJjxTRGEzCitoMXImXnVUPFQhdjtwM2coUn1XWDNZSDx4QmBmKXt1fWhZLWBOZCk/fHNfXmBXfnNXS1BnS05SLSNAd21WMzl7YXwpKFNsVHV9dUBfaDYhCitLKW9pOVVCMWh+KSUpbF9wdFg+I3pBYlY7RlpUPXFqNV97RmxRe05DVWQoJDZuPC1fK3N8djlUYlZCeWdvRCM8USRGOU92QmpfbUxhTiZfCis/YyEzN2Y5NWk8d0hhREpnUUZGaFMjKXhKWiZBb3cwNHY+WX1Afn15PyQtYCNwdWRNeDZxeTBYRSpgXnJePmVxWVdLWFF5LWMtd2tHRlprCit1Ukc/LUJIPkYzJCROYENeTUlkUWRlcHZvP2JiQTl4NHp9YG9hXiE7bTRobiN4X0YyYGp0KHMhX2RlQGoheGxCJnNRcEwoZWN0T35odEdUCitfeHs9V3Q0NzRTZzZKYFhRN24qWXMrcntxeExIV1glO3ZZUTd7fVoqREdCP0d8JWM1ckYoPjVGUFc7LUlpMnk9eylWaSFBNjspejV+Vmo9CiskRHBzMUxjYXpzMk5FJUkla3J1cSU9PVImSFJ0YDxJRTRwRWY0SEw8UTcwM1ZiM28+NF99ODFMaiZieWhkYFpeYSh1cF4kKV4+cGd+PElpCit4MS1GbDtoTTgoMURVQl93e3NxUng5LU9uKyhWRSlkbSlGKHJTP0xJa3h0MF9NUkAwSmMtekBrekszI1gydTc4ZlVpI3JnUjlyd1Nub01pCis0Q0c/aGpCZj4hIXZXVX5yQTBTTz5AOHlfcUtPZFkjIXZrbXM2YTtYIV47Sn1ucEN8KTBIeT5JXktibTdlQCRfemxxUlghfUJDQEN0Qlo0CitNK0J7dGFBRFEwQDxBX25zcDd7VVMxdDBwbDZneUpGOTYzbmgmPUpmQHpFcCooTVZCTENwJUI1WkAhJU1ycWYtZGZaaGs2ejlvRnFLU1FmCitmfGttKGQmOWY+dzsmTVR6R0dmWG1JajlLIXpyO29wTFhGKzhCZSgjd0RuVzMoTW1QTXx1OyM7NWg8RUV1ZF52cDVoK3h5QVNfRDhsRUkkCitAblpRI0FpaTVKUjckY3hZO1hyNHRxXjt1JFJyd1VOZD8yeTN6YC1VO1dyTjdoYzR9P1Y4UXIpP0tDV2hTXn0oSlBiMnlJZDBwO0ctZWFHCis2QkJwTWhFVXZBMWtXcmg3bTNANzRTa3Z8LVlCN0NrWXkqJktHQ0dzM1ItWG8pJlVUNz5vUkNqSj0hT21hWWdHTFg0ITRSMTtgMm5mTyFECitCOSReQWx3IVY0Xkw/KiV1Vy0ka3A4cnZDfWltTnlJdEFHTUJuRkxpY1QlRkNDcTtuVWgxZyV+PTdmWXokXitYPDllVi1iJWBqaiRFcXRoCistKHVtdllCVWo9amgzc3xtZCtsa1NOLTdINm9QIUJ4d0BSeDNHXkpsQH5SUkI+MDVQb3RubnpSdlgyJlY7ZFJ7bkhhXndTSnQlfHR6ZjJUCit9cGVOaXIrZks9eV5MWElkYmA8fkxWNkJkY1B4YVc9PWJSRz8pQWo2bG9FKDV9THxYZUpXYmg7KDc/Yk0tWSVaeWpDLWIjSShWLVlodjNKCishNnhqaiVBZDlOTlFiYj1mSj9PU0ZgMkxCNEQjTj0kMjh8dzRCVXU5eHEyNlViLXA9PChSIy1UODlTXmtqanhGdWJ5UWoyV3ZVWlJuc2IxCitnQHZ0bSp0TTtpUnVZQVZ2ViFKaXYrUjFfX0VDOWpjcjVadmUpQmpaND97QmRUZmpsPi1JPD5RN1V8SmlYZWc9eE4/cEhGbXNJTmRSMTI8CiszJEA3YXVUc3hBSmNaI0tRdlBxbUZDcFVfaCZ+M0p+dzdjQWZmPEpMNTRFVCNDVTw1VlNkMGVnO0dPMVpGV3w+ZV80dz8xIUs0O2VnZjF+CitUNShEcDd3aHd0Q3xDKjFUM2JxUV5nQXVRflIkak1zYSQzSF9lVnlqR3hndGheayV4STJ5WXFodllyaUoyX0dSK24qMV5Zazw/S0kqMW9ECitAUWIwVmVLQUJBTHN0SX0kTj89WHtpUzNINkRYVEx9RyojayYodkdxNjRjT0ZZVUYlfGhzNUhtTUJCZTs8WmZQPTRLPDZObU9FVDlgJGU8CitSbWQmWmpwTWdPbTdvIW11YTVwc2ZLPDRxell1M0ElckZYeitlcGI1K3pVMFUpOUJeVH0hVWt5TjB3XlA7QiZMZSlTcF9KMlJfcEM+MWwhCiskVE96KGIpKkFUKncyKnlXMWBqQnJKOGUmclBvSj0mPFVtXl9pO2lTK1dvPHopJXYpVSZsaShIaSFYMmoqRDlXIVhRKGVpMnA4eigmV3NUCit0N3tMbGpOQHVZSmRMZjY4ez5eMSVrI2drRFkoTjklZVJWO1E1QT9DKip5djtqQ1l3MlJkTjRDIUomNElxcT8wR2ZvcTNwUzt6clNuUV5VCislfShtTzNfQkMjVDJPYisxWUNueXpSND0hQF5VaDJEXj9HRzNXUUFKPUJYdHFsODAlaXFRK2V3WEcqPEBBYkR3fXZeKGAyUkUhMz9nVEJoCitaYWdvZXpxMTklb0IrQWVeakJhYz53eEUxPHs0cT4yIUo0VyVEKWJsQUc1eWlpPDBJTzBaaXNybzdHYzQ8TWw+YiN0RVkjYll8MCshLTNuCitNRXdMP01VVSk9SXJzWT9TY0F3N0FEcGAxOHpfej58UCZ6aCglWWFLZnpVelVpRXZ5eHdIVzE1dDdUS21HIT98Rj56XyZhbHQ0R3ZnKnZZCitvaGtBeFA4dFVsJnxqV3tmXi1vI2Q1PTBONFR1NmsmcEt9cClTI0BreVV2TkBUa21GKTE1fGZxSExweGxSIV4zMWFpa19GbnU4UF9yPiRtCitPQVl0OC1wT0lFMEsmPFNsaFEyamVVIVMhYEUkb3Y5UEB9K2QmOCglMSg5KUI0PDBRaWNteFM0Qlp4R2FfVTY8blNCfVZKaE5qT3dgVVJUCit4Rmwlai1zYTUqYEEwLXVpQCF7PWt+O0IjKmBLM19oSml7UlRJTndRYj9CenJ3fWhgbUN1dmUpaGlkO1JWdWM+VV9mcH16QXQ+c3JHI1J3CitheH09VyRqYSZVaXxRViVtKkVPMUt3NGZLdE1VN3BaWVQ0OCFHUWRYZnVyQiZwQUFWVFFJPnBXQVQzRmEjPjYoZGVhRDtxY1dBdCMtYiNmCitfe3xIRyZIWTNaOH5yWCV5XzxfbmZfVHtGIUVoNmB4JVJuU3taaCZSPEstT3tqQFlfSnJ8cGhZJnBwcEAhfiVrKlVpSDgkVCspUCk7RGxzCis2VVF4KCZzXkVgTVkjSChAfGlJa15NYmp7VlpmfCE/RCFJZXd5aEdrWTRocWBoYkJkNE1DQXpJNVRrYHpPekZ6bHBGOW4tRnZQe0VFZnFECitTTTtWSjshMWshZCliUHNgbzw0e1E4dEoxaSFDTlVebTBIYHVlfVJYdWM1YGRBR1RpSlZtQmtLYVpMdVFeem1sRj5wUHkwOEhKJX5vcFN7CitYbTZzI3VAcCQ3ZGFvQENoNXdgTGRTaTs8ZVhIQSpnaSl+XlA+Q0k0dHhtYTQqLWRKNVRjM3Q3KVElZEJofiYqPTFNb0ZPQl80Pjt1SHUkCitXN2hTfWt1bT9RPn1qMT1OPz9OZm9iJEQ9X1RnMmkoPzFUQEooMGh3Rz9QSjQ5QiVMYElkR2xrJk0/YWRyNGM7UWtlNCQrckEoPHUtQG49CitfNm58Q1BRNmZLNiNIflJaeXVaNnhybjd4fG4jOTxRVVd7ejFoO05hYmh2YXhEYldjS0dqazFGJSsoK2Y1TmIqVXZGSXVtdX1iXktYaDx3CitgUztmVXBodm5+dTZSNVQqUFYrM19AO2tuYH1lcSNCYWt7IXNjektARmtYSFk+e0w2JSY+YmVHQUN4YippKD48TnJAVCFMKFNPc1VObGctCiteO3pkfV54ZF5MYmhFKlNfPUFuVUNLdSs4Kil5aXdfTGZiN0c/dW9Fc1UjQU5vREtQPHc1X2MoWUR8V3o4PWFWSkhnPnw9am1ue3FJeGg3CisybXNxTiYtVnQkUD4pMVpue3ZZWkYjKzBGQE1vbjBPdDdGfCVyOVFvfDlYbXgkTDtpfllRNGRJb35JIUYjK0VJKGw3cXs5SWR3cWctYVp+CitaUkV5P3xxa2ZpKTBOX3BKRmJubSlLNTJifiMlVnklTTx0UlQ5JHtSayZJcCp8aU88VUI7SEtHQUBCMCleVC15U0MxdXQ7P3RMYiEpTUshCis5WCg8Xkx8YClqTVlJZ0poQCFeO2JpVEhoMXc1aShFPGJUcHB+b2hgREA4JXhOWVk9Pkt0JXQrTDBBIzsqcm5EN2JGVHxeQUZkZFA2TWYzCitrZ2pROzs3WTh8QUxNUWdfXnc1N2kzOURwJGlEKTItUGFjTHc9VG8mV1YrV19aJDhMI0FVT1FhZm1nZ0I2WGJiY1NeTHBebi1hRXUjbGU+Cit7bXJWOz1zVD9tJSU/Rn5yTioqcld7SSlhVlVjRCtON2MpVElXQlAoPHdQZWFLMExYVSQ8TlJjUE5FNjQmVGRYRUEqUlE/cHJ6PTJHJChNCisxc0MpXyQqXmM4NWdDbTdedmc4TXNKMnF7Xi0rUz89UHBSOEp1bU9JKjxLTz1CVERhMWBNb0xrVDBIbk8lRGNmcFJBUHItI2BzZ055YjFnCitCQ2lDdU12VmVTJmkhRDlHVkM0Ql8mcnFMc3dlOXxRfCYqNXdAQUF+YDFzXm1ac0x3VDcmRWdWfVVCcl9hXnBRPjdCdDd5ZVd+TlNGOSYyCitTdX1QVzsmRDcoNXZQc15WTGoweSRfUXZVSzk4a0sqcGZkJWVBITk0aHsyI15fSSE9VlY/RVU4Sk5nUyg9anYkT1ZPQE50TGRRaUlDYE1iCitIWWtXTCFZeE1rQ2d7NUhZKVBoRCY0ZldnPDFraDRVYShUPlJJRF5HWjRQJGIhKVFsNlpkdCZNJShHOEdYeEVlWWNtXk1QRURKXntfYXdMCitmOVQ/QVl1TkIwPTd4eFU8RWZObmgrU1M9fkB9NGZjckd7VlNpbXRhfEdUVXNeJUNIUTVZUWIlelFwQzBYRURqTHIxPGw5VTdEM0x8bzVjCitiVzMhM1hvcVQrUDtAJGlGaFglUVZYPEV8K0ghZXAwXiVZbkI2UXlvQVFjajd+Pig+QVVvWl9AX3NxVlBKTldUP3dYT3MwWihFJEYhN3JQCitaTHh7cm43JDJHaXVPaGZub3wxQmxhM2U1bTZPVV8qRH1MKE0qYlAyR3UpeFRoQysqUStCQVgwPGFTSH17eDhge3opMT9+eVd0N1A8cnxzCitOQj1idGEpN2NhekBhRj5LcmQtTHlKVjRlOWtJT0JEZFYzKVYhbEN6NjBXPWBRKDswTj08aXNAdFctQEZDYjwlJCkoVnBWOUp4K2xrajAtCishU2IzRCVAYXQ/M0Z1SmJVI1YxJTtXZl8qXiNoOVFpJUxkbkM8fX0tcmZEMTMpTXxBLV8zOHhaT3d4UHxtakZhUSRrQklEJjVOPEwzKCo9Cit3SlNtKHFoXkpkd3l2Nyt9ZCpkVFN1PlhRbC19VGFrIU5eRVpEfm5pMERHdmhNST5sVz44fXNhOCtsMjw1I2JDeU83bDwkckY8TSNpUzRlCis8UXFgWmJFWD1SN2ZDNlRAfno+XnM0VG92MWl7RXVld2MmfUYwb3JjdTk8eT1oQmJgfjR5Y2AkNnhwIXVLNjNQQH1LYXRBaT9CSSRpTjIkCitNK3UhUE1SX3V6JFIyPCNPbkF4c201a1hsJSg+d3lmKmliX2hDbVFSbFhzZmVJR0lzeylRUXBvcnp0bURyKC12by17QGY7fl9gWUIxKWJlCitQZ0ZDMVc9bFgmPH58KkV3YiFSOTxzdT53cVkmKDV9Mj1rXnpoTGdmS0NqbTF3NWVtVnN2aS1GLTlreSkxPzhydEtpT0BSKSNHa04lfF5nCis/UGxHekc+e0xoMHBrQWdWend8fDl+dXleX3Z3JlkrMksrQjE3bEdiMWo4cGUlJCQ0Kl9HOH5Id1E1UituJnFSJXsqSShPMDV2QHFMQlpSCisoaWZ2fFpNUCY9PyFTJTN6TGx7aGZacnBfM2AxMWlzV2ViUkhOdDkkJiNaVT9HMGJ6aHV2LU1FMzktNTx2PyRibF9edzZEcCRnUEtKXi0hCitmQV41fiZ6SkBqMll3NlgkKzJfcjdVMjxXYWkmbDttYXdnaG11MyEzbmZFe0tJejRNJDdfc2U5JmNxb2w1MUFFaWdtPlR6cnUtP0EzKyZoCitYUC1DayYzTzAqNmI/WmBEZVpAVjNpMGExcz05PWplZiglSGIwMVBBciRjXk9kRntJa1Z4cj5rSno7X19vdH17YWY+b0NOfHYyJSVYRzdxCitpNCRNbjIoZzl5RnRKVTBEa1M9S3FiQyt5QH5fKFplVDc4OU1TYCZFV24ySlVBWTF3STh1Z2V1P3lKJVdQSnEhYSQ+R3JhaFFHSnFFWWNxCis8U2JVaVBVTUVUNEtwNlQ0eWNoKSQxYV9Qa1JmKiZvRmxZRis0ZWw8QG9NailJZilMJmJsT01JP2xSMHkke3VFJF9CeEQjdFdJcVB2Tn4lCitUJGcoPTxHZUcxcGw7MHkyTlJOVD1UcUlESV4qeWI3U0JrNEVRfW88QFhffXIoRlFuKTk3JWZqaVRBbj8wRilnRlpVbllIenhzYV98WlJ9CitYcGBnQXR+ZjY3TmRfWWdwemdDWHIqKCZzdVlKY3U1Z1dWcXk5YyhHTVpUQVFSPWRiZioxQUgmN2dkZV5iXyklIVdIJmYmdk1Wd1JYSSkrCitCaCpEUlJUNWhQJkFLQEZFQXEmUyRaQTdfczhqUU8pY1AmKUlLR3UmaT40Q2wjI3ctYWBqQnQ1MTd4N2VtSXdxcHphQTl9Nn57SENSTHM3CitoeVJsMVZ7MlNVfD5qRnV5OHIzUyhsKn5GWH12eEJTVTdLMkZrcWExSklfN3QoYyoyKkB+R0NmSDdNNkt9eXltPl49WShKY2hvWl8wPWZWCitlZnhWcGJhTXlyO3J+V1lrPTBCXz81N0F0e3w2e1BzRyQzMWVVO0tSbHBvPFlLKi12eHJjWUx7TzBXREdFQmh1fk9hVVlvJShGeVc9ZHVPCis7UV9pRXRsNzRsZXU7VTsoSU5JRGhvS3tTIz1VRU8zYHhmTmFgaDxOeSV5MXN7aGJ3djktSlYzNj9XRWY3SUA2UXxURUZGZSpTVihiZz5xCit6Oz4pal5HeThWTFVeendxa2ZlM1Z+WmNGWSY/Y09WJjxWT3QxQnA4cnNZZilrOTZAS1hwX2c2NGc5U3g9MTBJd19BIylPe1lXaHAkUVR1Cis8RF5ROTVtflRrYktYUl9JNkJvVnJvUTdXJG4+VFhETjEhZGdCYG0yKmJFQXBfISQzQjFleD1icU88ZkBRbnE8b0txflMoalM+LTIwaylXCitDYURxLSlQckorPT1wMCsqfkl+PWthPndXaCskVUl3IVFQMXdjQERaa29ybyQzWTNvKUZhQzA+MFRIaGJ+cT5vNTxVbDlUOEZWS2d0cUdkCitDQH1kamJZZWJPR19NPjMyS0xpa3VKbUZibz97ODFLalZSSD5qS1ZLK3FpM04jc2I1OF4yS3Z6d2d4YVFhUG9DR1NMPnRxcjFGWE8pRlEtCitgUXlOVEQtLVFHPlVeUT5VNitVX2UxajFJJjRpcj59TzVPfXdqK19iZkxJRVozKkx0WnR3T1N7PTk1P315Mk17ZnZwRlVmalNgT1Q7P1pxCitaVCteXkdkS002UkJPaDU7YSFBfmQ4KWc5YmMpI0FVentrV1hidU5CTj9gaWtxYzJ4Z0ViRV50T1Y/MkZzQyt4VEpobnctMj88bFBsJHN5CitFVHZhMG5+I2hDYFU8WkVyWTc9WUpQQkN5Zlo7X0s1Q0Z6al9zfTw2THFLKkt3ZXktQDBEIWRhKGNrMmR+JD1lVlduaigpYS1PSUdzNistCit1bjE4aUIwc05iX0gtezdQWVRlYVgrbUt5OFYmcEU7TldwR3xoTFJFfDkxXyZaRWwqemlAZiU+amZKNGU4bDJ1aHpXbkZ2SFFwdUFhX2h2CitwYWMqMVkjaXFjQH12RTgwRmBVeTNVdGxrI0t9SlQ9fnVlM2ErRykrRmtUc0g8MCtUYUlIMG5PeEN0WkQmVFNgKVlXPmRSS2A+UDYhKGI2CitLXnFoWFd5ZGZWZnd3YH5jKXBpKl5RVEp6eS1wdmtOP1JUOU1DJTheYTFAd2d4dSQ0TlBkSmw1fTBwYUlMWm5TYHpwLUdkJjkkZUNqZHJzCitteDZ8ZmB9aUZ5Xk9OMn13UmhoamRBVVlSU2xkQWU1OXlENWArZGZFJXNGXzZid09KfCE8NnlwcUtCYzZPIWE3TX0tZGZRamQqTSFGK0dCCit2WVpiSG1SbnA5NmRAQUhuREZOcnEyRHRkPXg1Nz1NTTE7fnVpKUQzfFFnU1o1XmhwOHk2VERpY0gkPW1yallAPzxKQWIxUkBIQVBtXit0Cis4dVAjOD9HUjg3dUVVI1BkQDt7PFlpe0Q3dmhyN1YpYHNySEZ2c0hQb0lKPld2PVFhZz88QlloWXJ8VEliWSl0ZFY8e1MoNDxTflJ3S18kCitEcSleTmIjZj9qfEQ/X2cySVFjM0ZrSH0hZzxBQjZGajtCTDhpZn5tQiVSU0tOeDYjUDVjJWxDPl9taGVfdkBkMDVOZ2IyTWREUDFKfjIzCis9UzN+YlU9QHhWOG11amp1XzN5Ukw8ND5CekB5YVVlbE1iTmBKQXkzYjwoXj9CUHBRSmYmX0NkaThOTEFtQ2kxN3klU2Y2e3VrOGdDQjFOCit0fihNflU4LSk+aSpsIzU9WSkwWE55bGopPGMqVENtc2xeczFxezZicGBRKHQqOUtVezU2XjJwTXtsSGByYlFtZ0NTbU1NTzhkIXo5c0RGCisral5NbXwmb3dJWWUjUGlwTSk4QkxyZHBCV2ElbGM/TT9qVTApZHdNQmF9RUxQQExxVDJRXkE4Pk82WmZsWDRBMmlxMkV+QWZCYUA+ckFLCit5WE0rR29qWHc4b3IlWiRBYmFqTV8oRE5aaDUtOF41IThpJWpoUStKdkMrYGJGV15KQH4qPm0wYGYmP2xecj9vZHZ0TD5qM0czbmRNen1nCitJc2sxVGQ5R1poJlc8SXliQkJSWnRKZ2BIXnZWKTZCMXg2aVd0KTIqNjMxaWYpOUV+WTNNTVMyJF9sWHE/c2FDY3h2U1RpcCVSbXRPP1c4CitUWk48ZFNSU25GRmApP1V8K0dsQV9JR0U1R19AeFVOY3JxfD5BeCRSSVY4MWxMY0NaflUjO2RAbnpeQVJpMkhGaTl2Y043ISk+YnBaKSpGCitEbyh+SiRJPXBEXz1LSCVrciRqak1gbW8tbU1payV5blBkZzY0SH1KWVVveWQ2SSFGYXQ8c29YT0JFekNZfDFvd35WfEhTT1N6bGhtMm5yCiszIV9DN2h6KSRtfWApMjBaK2U1b1cpVWMyYj5qOHxYYHZHNWMrZColQEc5N3wjXnxYcnI9WiVrWEcrZjdyPE45bERKJmNBcENESl9YTXA8Cittbjg1QTVBbS1TYjdufDh7WExrXnJrZUBecS0kPFRILTlAQU4hTkMmfn1QTFVLVD4xO0BkM2Q9LWs0NXJzUEJEJjcoNmEqcW49UiF1QDYmCisoM3B+O1o3OT8+QElKYUdsZXl7S291U2h8eChvXyEqZX1kNWNAWHpLdEx6VS0lWTV8dU92NnZGKUpMejx6bFgoUSZ8Tk50S3MwSWRoM0IhCit8YlVGc1l6P2sqT2wkckliNFVYKF5UWjxvQF9uPyVDOHtlUjN3e0J0WExRKC1YPDNjWVltXzEzSnckdiYtWig1K19zcmpmUiVSTFNgOz5aCitGcSZ9YzxSblVSVFhHTzEkJjl+QHE7Y3VwI0h5JiEhaShiPj5UYXVGYyZYPEdJSGcqU3NyU0J2S15IdUo4czdDXlJYOGEwMjQhJFJwTkRMCitfZy0oZk1KaTRJU2EzWD99RGUoXzJSfXFufjdTRUdlfVBMYF9tWXtxclgqXlY4fGZZTX1Lal4yKX1nTjwrV3ZaSntqIzNLQHUraDB1OXVVCit3TU9GRWJGSyZFakNCR2xrSntpO1h0SDFYc3M2flI3LWl9Ozl4aChVLUBzdE59WW89KnAtR3BePFZXXlgjIW9MKlI8ZjFHJEhpPEwofG1qCiskaVg5MnNkMmNYTyV9IURLbXcxQkxwIVAtdkk4cWpyTlNwRSNlIWJLSzYjQHY/ek4pZm0tMmBIWShDQD9sKit0VyRqLU9yJV9mNTcmNEM1CitoWTchSXd3Y3wheCViOUdraU1kczspb0w2cSZCSSlLNGlVbk9PdmRJKlhKd3UoVGw1bTRWQGNqajFva2xDOGBebXl4YisrZVlTdXcjVz1rCitefT13JTJ4ayU4dT9LbXA5NmdJJCYjPGlhJns4OHBqRkdQT0F3VEVRV3ZgdmA1REVWejlgTHRSNHE1OCVeUDt9Q3dkMklEZUtIVH5ocjRDCis/XmJCRENScEJHaGFhK1IpNGVKdChgeWxgWXY/YyZsbkBETE98UWBwXnE2clpqKkE+dnRVITxSY3YwNzN3Z31uPCV2WDBScj1LTVNIdHQoCitFe2s+Izd+JHQqSSheQXc3eExCej1SJXhJZGFxdE51OEUjUmY3SWtmMXI2QmZVfTEoTUA7UVB0ZmcjeVZGfHZWY1BSN0AkczdQd3RIdTE1CitXLVZLTXEwXkV9R0NPTHRfOVlvTWIqOEpLUHMoNWtrSGFgPXhedzhsM2cmKnNxT0FiRzJvTmd3SURga1FmYjclKWxCdWBkamcyJmB3aGp7CitAUGh1c1dKeyRtT3EhOCp4ZmUxWl9pKX1ZfDxnfDVkJTI8QHgjPFdHWkBPK21sZklZci05OH0odmNlQygoaj1TWHJGVzhRcE5JUyp9JiVZCispZFAlcyRrbDUqKkRlQEEtNGxoTndHRV5yLV50ZD9We24rT0F5KkZja0lFXjVFKzhrP0xuWl9lciVNfStwPEBANmlRbE5Lb3p4QD1MJkY/CitIPFZ1fTZjWlRrJDkoNEtTQWsyYmp3eDRTaCFfJmRhciQpQ2M8WCRoaiU+Mjk4S2BRbDlobXhGI2pub1cjdjVQQHsyfllISyZIVFh7fWBiCitQX15AWkchYkRXY15KcGFkeD80cHA5RTFQPmB9QGU1dStBRz9DTE58TXhffWNBPW47X3duKT5BZEJ+cmZ6SVRMVjtZcWxJY0FuNFcqR1V6CitVUGR8bmEmKmBnVHxYN2lFNkxeQVY1TFFAa1EmVFJKY1FGSzVLJFpFX0JoTjJtNipleDxoTjRFM1B2UyRESnElT0Nec2p3I1hrbWZtcDNYCitGcT85QzUzVnhoe2tDYE8xdm9obmRaMW9ESG9KPGAhIzdKaXRKMjtiPmF9R1R8T0RfY1FQWjd7V0IlbGV2KF8pQD1BT2lefiYjWSFPNT41Cit3JEs+P0FMXyRnWSE0OE5kbG04JW5HeFppKUFtWW1PamoycHY9QVdvYWY5fCQybE4tTilXbDFyPXtXfio8Z01Ga3khOSRZKGw0UGU8ZSM0Cit3Mks9OHR1OHtWeU1uN1QzPXNyNUBrSnlRVk4lSigybmhGeE48eEFOQnkmTUBiQ0NiVkB7QClfc2RmcmZ7SUwpQyM3KSpyfEpgZG1OSkBaCitrU0M0cW5RNGxsclVCSSl6WnAzIV5zbDZ5VlBuRDRMIVMte2A1QEJ4bTNNYHpTNUpmSktuPn1MQz88QWZ7KSE7QFZWdz1UPFU0eVl3N203CisoZTR6Pz97am15VU9LSkUmfGlxI0YqNTFyIT0jVmlFcUFpeHlXe0IxMEhxKCFJYHQ5c1RCbG1nQjw2VX5haGteWDdAOW0pQ2hCJV9KbmIzCisoOWt4R2VYUnQyPD9Eey12IWpoKWZEP0lyXntiTythXjMqMGl4dmtpYWQjSXRLO2BoT250fU4hO0JHVU5RdiM2Knk8O2ZNQmE/I01WQ0FSCitvTGU8eD87dih+MC0ySCUlSXd1dHRVQmtoQFQrJDFNVihmfk9XP2Nwc15kXnpDdG4qMjlRRytgRHFQQ3BGPVhYfGpFQXNrZSZJdEVXYFk4CitxZVMzd3hlM2R7QmUjVjlfY2N0O2pfaTVMaC1VQGtrQj1pMTZea0lEaFM4LXJRXmtjTzZgUm9nQV5yKSN0UnZ4TGYxMG0xK3hvT3lqYVUtCitJcWVaKjxPNyREUHRiejVxSD5vdUM8ZGJFV1g/SE15PGNHeXlnPzNFc3Q/R2J3ITBYM3d7PGRtTDBPaDRqPzJSQzt4RD5uUzVCemhfTHlkCitTRHRfdVZuYHBlOF9TTiVXRS1YeGgxKiQ8T2JgSXE3JnlzeVNoJHV1cm5TZy1JNXswWmNvdDs/YSN6RTIzbipGTTFmKk8/bnZUa0d0NnMoCitDLT40YWNlTDF6ekBod2cwViErbUZTRTl6e0NwQU1JUyloSDBIM0x5eiU3SEhIKjd0eGEkUkgzdGkzMkE5Xjtfb1gleiZBfUBiQzxFYVAzCit1QXdzamg9dlp1WEBnZj10fHY/XlpxQiZ+fXomeWVmZj03KmZlJCFSUXRic1BFKVhyTlg/LTVEKVF0dTUqZ0pGQmQlcGp6MDExSXlMeUBGCitLUXxETSFCWThmITkxUzx9UllBeClnYFB2aG9mUitLVXlyVU1CfWFqUks0N2cqdHd7fkF1Pllge20mTXpEQVdhQDhYRm9KSDZrS3g+NEp4CittSXUoUzV8YStmX0I8S1QzaHpme0FJZUgzWXQqPDJjeDhrVEh9V31XREtuN29mTXtjbmgmS0pFKFlVNW16UD5VeikxeCVPayZFUDtVdWNkCitscld3Z0Nefk89Y1JLPnkjfntoTDRAT0N7WEhWI3w8cmdQTE9SXm1vT1MwXy0qYm1jU0gyPWleTXZ+UmlVd09ZeFA3TXI/bDJlekFsc3hVCitreDVfRXlMYHFLZWRlZF5NKTtKfFY0eit4MmFVTzN1VzB1QGNxMihAP2dZbj1lXkdsSztaT2QlRypRYWx1ZDEreVZldU4/fTM2UVRYYT0jCiskPW9YMWxGbmFxQGFVMFYkcVFGVGBgUip+MzY8Xyh4OD1yZEJVVWhTaXNeLVh0PzlqY2YlMnhjfl85e0Uxezsjc2BecVUlOyVNbVNiS0RUCiszcExWfmAmeCFaRng8SmlXUG5CNTB6UV92a3g8N3I2R3grJGgoK3gjQjlxRzFvakZHJFpzNW54TXwzM3pmUXxsPUJeX3dodSZRQCNed0FVCitLLT0ySHo4KW8zUjUtYy13RVoteXAjYCR5KG9DOylrY3pKJD99fGxTfUNnN1JjZjE0QlR+PFpUaWA+aWwyfmQ4I3YqTXJeQ2xQdShMeXtZCis9PXJ+KlNBdlFEPl9mSThYPH47T014UipsKGVFeGJqNDx5YE13RylRRFFsbndSU0ZaUnFRaG9zQF9AUyVqRUpDXytMeGt3UG08SnZkRm93CitwVHFZZEVXZi1yMUtmI0VtTDZYcCRudmQ0ajd6V1A7RysqQmRSS0B7Nit4P1dqWn0wfSZJJDxuT2pvcDkje1pUQmk9WTVeRkE5O1Q/MyQkCitJIzAqVjI0WnlKbl9kSDtYTTAqfV5RIX4jSjRlPSlYUlJEbigmc3JWYTZ7QD5uRGteQzFtVXEyVGtQNmNhcEJHfF5YdFcob2s4fHtQb14kCisxRmEwKE50aWIoRGBiO2FjWjFwUkZ0OE8lOTd4T3gqYnVNWWYrITVET3xVI2FDWCViYk11MmFQQ0woQ2BTQVBFRDR1ejArVzRpISpTampOCitqY2lkQU0xTytMZmZAQzRKfTxzPlVhfE1tcGVwSUJKSlQ5YTJlSldaI3ZaKVduYTx0UntkLT4/JDs3OEEzNz4hSXdPZyV1Kz9YNmwzbClvCitNfnl6dyVPWHRyKjxleSp1TytNUVA/cHw3czslLUZVST9MJTYpZGhOVFVOP3olNlUkWCtGUT9IYEo0WXFJST85OzEqb2tOREp4I0oyRHdNCit3UXRAeXFqMm4zQnklaiU2Zz5paDxSVFYhPWg0SntIeTBqdmszZ2NSV0k9fHdfc1c0Z2A+UXhtI09AJXUhSmhmdTQqJDlVKm9MQksyaEJHCiswSWBtP3JTT18wfSkpKzx9cWZNa0lORjJsZzhKNjVuJmxMbGtzdEd3YkU5JD5OMiFLdGBxYD5MXmxjT2R6V285b0QhU0Z7bXk4fVRZMj07CitDP1ByN1VNeE5FM0VNJHI8N0toP25sVE1MJkZQcztXfW8yR0dvXmp0dE8qekc2R3tHQWtITWVyemZwM0BYRFRDe1E3dSVTOTRMYCoyPWBYCitqPCV9Q2pnKjZFTX1Oa19Sb1VXI2VWdCZiYD9RPXk7OU1LPndjUX14P1YhOT5oI2c0QXckZGppdSYrIWxRPXpTcy0tdkphaXd8JUh9YEp2CispcTNnSlRUOzZ0aSRQVmVvTmslVk5yeUM2MFBUbllFNnYxRFBXfSFUdztjdkZQMFhVSlUkSl5zT2VAMCo9XjYld3BLTHp0UDNgSTJfP09oCis3PHotO3spO2MzVEM2anpmPmc7aGVlREZ9NG4xIyZrO2pQTHooMlFFPFBuVTMhJk5LQXZiWVZ4TjNLd2JUWF89dG1AZntpTVd7eyF3ajtYCitAKUY+ZSsxPXF0ZURJNHUpVHFLbng7ZkVeaXskS0d6TGYob0Z6dyZVV3A/NGFMTUUkNTB2VGckbUQ+RE4kX3dSNTR5QSV7YVZnfC1Cc2ZnCis+a2M9VmVKNVJxRS1iPmZjI0h3PVAzREsrdk5qPStJMmc8QlFOSXpHXnxze0ZVTXYjUCV7PXQobkhvbSlnVHNWN08xMHRmV3VQTVNuZUwxCit+ZFpOYTNsZT87TWZ+azw+citPcCtRfko3dVhnVUw5dmVFJE84JkQmJnZgUWhtTU9DIWh3aHZmTT9KPFlWPTB0YzRSPkZedX1xS0JQfl5QCitYQHZufGZkb2padnNXZDJBZD9fX1d+WjZNOT5XWmRMPkBhYyNJSVVgdXBrXlkpMklXUiZmYDlSYDRvZTtDcndVbTxuaF9Laz1IKU9vYGFnCit2RzR1Z1BsMl4oJnBhKWs+JSFJYmhFdEQqWkcoX3IjKEE9ITg0TEE0R1k8QUM0NUBAT2Rtd0RJVWd4MmRCWlQmKSRqREJoa1RMbzlOPXtoCitmTUdCTCpoKko8JWBCZkRrVEA1MkpSJlppMmYtcWt5ZDl1OU9FMSk2SG43Y29ibj8kWmktYWlUZnE5Ql9UZU9xLTMzPHhiSDd3c1R7N3NnCit5THtlU1Q4V2dOfTxuVXJFZSZCPGMzbmBnfng3WXd3e04tWUwlWSghWm1vZmFndi0jVmRTWmBYcyVZKURLWUZkdzdXcWRJS35eYTNZWH5ZCitQRXRCU1NMX3RtaHFrNT8+RWt8OzZBSztTQ1NFMHReYnYhcFNXTHE1JTJxaCR1YygtNlNEQHBjajQoTF4pNFRfVFB4XmkmUHpqMURYQTZvCitWUj9QSkY5ZzAldk56dCNwJXFZOFpAPCZpPWo/TTBOfF5fNGZzJDI2PShKPWZvdztLY2F+Iy01SWVpTHFWamdAfkRaXlVXR1BnVylHZz9+Cis0b1p4cDNwZEJ8ZWcxZmBAQXgtKkR4eT1FP3lrUSEyWGNDPiV3XjNhRChqJjNrTmd3SlZ1anZZRXgpNyVJdlF2UDYkQzZOdHtJQVEzVH53CitBKSglKXs8ZyY3bnl5V0M/SnxDZ21qKTJlZC1eQGN3bWZocUMwKHR6ZzxxPDMtTDhpczxGKWs8QFpzeyltXz1HKHwxUT1yTng/LTR6eiF4CitXJSR7aWY1PCN3PyhYJHkpeUFTcj92fV8oa2R7MWZHfDs9Zko0KjV7dVFIN2tnKjQ5bmxyOWlHTkEhVGtePnt6OzZRe01+amQyREdldnU4CistfHNKV1paTERjUTVUMHZ5X0grSXo1XzAmNW5FQ0t7NDZocG9LanJ5ITZ2MGBrOWM+aFolVG5CcEE+a2szJCtlPXk3b0ZPYiMhfEkzWmVGCitZUDEmT2FtWVFFbEdxRTdJcjFsWHcxfHRVI2FZIzI1eHV0PzdrbE1BalZ8aj5TXmkoV2dfZUtmTCQtfDZ1VEJFb0tyVW1rOTI5I31jT2BlCitMN054R0FjPUNlfGJuNSZye0h9b0M2ITx4MD5YdnF3Kll6YExjVCR9aV9uZ0ZLUjwhXj1hOUxLaCF2e05TV0trTUd6ajZFdGtHSVM/X3lWCityWGAoTUVjI1RESl42bFp9PERGek8/cXlpVzQjb0g/SXFEPCteeFFEVipaaTVmSk5LdzVSSzNEfHtEPnhlZiZaKiNfTTxEQSNAcDhLVHR5CitCeHxkbj90I2FqYj1tTCpwTChVfjQ5UEZuPStSQmt0K0wjZlZUYDk4WXE0SytwXnhuTmReTiowbXxxSUhtUVpUTzhZM2dMZn1sVFdrOTllCiszNHZwKCl0dWBDeTE3Oz1Ec0ozIzRKNlhTOTZ8cGg/I284TEJ+fCRpN2lkWmFLKXJjPjZkUlp3TiNsKHxNRGlQayQ0RlllR05WZG0kKlkwCismIWwzQTlUQ3hfekJycF9ISG41amhkfm1aMVl2ez4wYGpUe04/UWphNitKRUBHWSt7OU5oTDYzQ1VJdSNVSCFOayNqLTsjJG91dC0tekM/Cis1b0FFaUVUS3J1M0NpPXBhR1IjMGNDY3dJYUI3MEljd15hRSptVnd2aWpETTVldkQwSk4xT3c5Vj1tJjNMeVYxbyhlT3ghI1lxWWUlVVplCisye2VJNEJtWTZRdDMtRXo7Z2t5SEorPX5MZVUjTkIwVFV0K2Q/RWdoMT5tRkQ3PnFMJWlXXkRURnN1V3FsPXFeJCRkN05QQSlHYWt4eW44CitrSExiMWpzQWQ3bU13VDw0Py1iUzI9X0l1fl9OKEY9KzZPSEU1P1k8Mk0laGIhJkpGIXI7NUYjOHdVS0N3fTVKfm1Nck44KnAoaVlYc2c+CitHbyslSmpnYVl1QXtHPVZ6M2FpWFRZT0R7ajtGe1NDQjx0SyRBMW4+O09+TmI3RHFadlNybWNSSXV6RUshaHttdUJjZDlmeTU8VjR0aFBqCityZFF4ZUh4QEdNQXVHcHBlayYoVT9lcStyKUl5bHFfdjB9fk1nYGRyWEk4RTc8UDdFJitNZEErI3glZ2c0SG0ycmRRNHhnV2BiY3h2O3o1CitCX1goX0VRc1JmTXMxVWx9U2hiMV4rd1IzOWxTJVcySlVNQ0lQJERPN0xUQ2paazM4VFJjNTJsXitmKWN0MyElaigrfWBjZ2hDJCZzQyZyCis+VGs9Z0h1dH5nYzkpYGZFcGlpaUN5Oz1eS04kSmBZWSs4JTtsNHFDI1ZVaEsjQVVaZEI5d2hlNU4qRE1Cc0VgJChYcFc1Mm9kK05ua0lCCis3WXlJLXlAOSRQaiNrP0kpVXJaUW47dnRmVz09a3pjPCQ1LWE7KnMmPTZiTz43OzVtM3JpaWdIVGZsSFVDNT0oXmgoQzskO3tXIXw7JE0wCiskZmlZXjEkclo0SDJTOSQ7NGBDU09xcHhuJmMwZjUkMnoxb0RZSj0hbiVKeHRFRSM8UVU0RWczdH1GJHRSUyhIeEhudWAhQ0pkO3chVklmCitUY0pPS3RkXndmcXBjcityfnRhZyFAUl5FV31GMlNqJnlBKj8lPVBqOEUqTV9ZYnBQMjVWKkpHaCRiQTdrMjcyVHdsKHs7bWdlKFpKMTw/Cit6cjE+UHdnfE8rMmRNO31WVXZ6O2EqfV4ycnJabjU4V0olRDFxNkEyMUNRMkF+ZV4zRjZEdiY3WUooSFFRWTErNWUxQ3JyN3gmKzlxS0N1CismVCNKaTVYSWpSKipmKypISlEyRyplWEVsdkVXWU8je0ZkdV5YZnAobkdgQDQqRjdgKkRCKDc1UEs4Yl82YGwkNWAraT4rWVNnWHsrenFNCiswfFlMTXZ+Y0VDUiNqJilobiF5RzZSaSpPY2E9KGNVZ2RnUVN6TE9kOXY5Xm8ofXVDTGxOQ3Bma2dhdmJUJTVjU0hUPCZBc0JSXjUhMUJYCitZdSRvOHdqSTRCUTImQz40Z0F4NTdnKiRjPVM/ancydXZfam19N3xBOXFhSkBGWCE5TXhvPTxNRWN+Ul5xVCg3QFgwbkQqY29FeGNPWlRRCitzJW4wP3JqUEZYZkV+NHhIfDJCRWZ8OEdmZU84eThUK295JkN2VkAjZ1lGe2k+cj42N1B1UTE8KEsjNU0hSjtFXytecDMmI0xDOWRmT3RjCitydDUxeG5iNVkkQ19GMjYyLXopSnZiZXxzMV53TmhhODNXPD02dzN6ciNjYSVKITw+aE5lZWwxdEItI1IyJV88UjBrRURGKHk3TURgNzhPCitmQ1pSMzI+e2I9U3ZPUFJNV1RkY2M7OSpDen5kU34yZHNybyVJY2ZmcjVUZ2V5RHFQJlkqKUQxMV83V1NGRyl9a25ENSNWKGNAIys/MTQ2CitsUEZRRlVDOTh9VnxJKn1BNDl6Mn1kWWY5ZHxKWGhRTj5NZ2JJJG10KkVPeTM3Jn0xPE1EYD5MKEI+PzhgMlJ2YTMjT2Vmfk5Xe3NEUzd5CitQS0VKdUkwRmZsbj57ez1mfCNQTjg3NTBvUUcofTkoSTFyTEE8a1dDRW5zJlgrR09tO2xGbCMzPWhSczdDWSpeIVFudlAtNH55USErUy1vCit5Ni1BTCZCQypBY25WR3Z1YWBGJCYoXzJZbXNtVnwhPEZHVjg7SmNgV2w2Q2VrSEt3ejdOKEkpXm1BflAmK195fSZpR2koY0M4Uj8heURCCismMjxNRWZBdVFaX3paRyRpOUF1ZkQrLWZnaCMhRUtWdns+ITM3YXQhMHQwdT96QVh3TVV5dDJydSsrKGo+PTNRUmpQYH4xIW1EOVJvXnBDCitHSUZMRkxPbzwwWWteI2U5ZyE4eC15Q1RJISgrcXJgbGBmLWQmUVRZMD1LWX1GQ3wzUUVJKGNjSzw5Y2t1Q2xwTHtpeGBzRkt1QjduYjxBCis2byQ4TWQ9RElrbUdpJmhMe3k3MzVDQCpZSyo8a31ZeFhMWEkxWnYjWUBKcVkxUDhIO2E2UlpAVD5TWm1zeHtKd2Q9Wnt3R1k3NlZAZz5YCit3akJLVDU7JnJANTh0amhhLV51RnVXYEF7U0wlJkBLRnJFOEFtIVkrQX0rPE96biRKOWFVeTF3dGNaIz96RzVwUmB9c2A7byUhY1U+VEgyCis/bkZMOXNOYmZjOUBiJnhQSzNkWUVsNiEyVUItWEZZWHwoYyE+PGl+bzhjJElaIVBAUlU+aG5RPlF5UiMrelczQ1p3bHt8QElERmVLNnYtCitSeUMyXkRASl8tejNHWDN6NH40Q2BIcFdAe0VYaD1GWHhRak9AT3VZLTZrfE82cz99WXdoWWBjay0rSnFmN3tLdkA5KWEjaSFHXl9haFFnCitjNmhtMHtPOXZPcSZeUVUoWUxBXmBYViFlYSFMcilMZyFgaG5+bFFhNjVsO0Rfbj9fcHp0enpeUjYtKS09RjI3Vm4/bUtqSWQ3aEJ9ZFM/CitgQDx6NHltYU1JJndvJSphQE00dj1nVitEQWI/SlBIbmdNI2spT2krbD1FNzlQYTRtSjc/fjtLanF3MGx6fXs2flMqN3s3VGBzWGV9Rj8kCis8V3U2O2F2I3RMVWB4SEowSVEtY3N0OzJocW9ReEppS3skVGo2Y0phQlRFR1NfI2lKQER0KEp6SU4ydVI5T0opUURlY3Y3bW1afHhDX1FeCitXSjZnVERedEY4P2d0O0J8Q0U8KmAyKDxOTHdYfnA0OWBwOVJiUEpYVUdnSlRCNWBUU2ktRzs0MUo4e1BMYERNUCkhdyo9TjRlUGdLciNaCituRko9Km9rdFJQZGdpQ3NodGZfRiFxMUVzYjZ6fnFmK3B0Szg5ZFR6dkgxTGBfUk8xbn5tKUlHUnw0VjNyK3thN0xNe1JnKiE+diV+YVg7Cis3dV9mOyRoM3NWZWBaSE84fnRTVD4qWllTSUo+IUN7Xkd8byVNe1R9RypkQ1d6UkVvNFZXd21vK056P1oqRTExeDAjK1ZrdmEmdEZJNC19CispVXA1VzZqK1hSTCZiWm5FdUYyd2dkaGh8PUUhME5JQUIjdyNjP0t8UTZ2V0tyRWxEOWo0T3tQZS0hdjVBc3chLWlISSFmdSZWe3RMdGp2CitBSnpONz5MaGY2MEsqb2hQUnxVYWpWe21WQE1fLWtwb0JvQ0N4I2deM19BKVNoQ25VNTxMWkA8djhvcHhSMiZ4QFBhVyRlYUVHZjx7VGQ+CiticSRLTXtLe00hTF5uQDc4UkRhIzt9c0N8eHEzLXg5Y0QrcUdKU01DPyUkQzNEej4lNmp1ayhOM2d4YT5LKjlVPzVOP2deV2JVJDY+JXs1Cit1bWJJS1huWkFiNj4oO1g0YXoqcytYVmBIJGB1cj1ubnEjTGtVcmlrd0VKSkA+eHBTP0wqMFU+R007KnslT0JNJEpkVEk9Rk9URG94cDh6CisyU1JaeSNWaUEtfXZkJG5rQk1xPk4lJmk+ZmB2RndSQWhzNUBldjlnNmFuRHFQRDFkVWhrUHhnRTFvKTItSzJVSG1uUmttMV9FeGZZRDl7Cit0I242QWY+MUpwSl8zRldAMExtQG9tajxqcSR3VkBKTkotUW03UDhWcWxuZi1BWmxpe2x8fnNXZ342dGtaZ092aDlNU0JtUXVSOy07diEhCitLeEstUTgma3lYbUNxXmglTm9NeDNPRkotTDgwM2VARXpaMFBQSDZMe1ZFckVEYispM0w9RSg0KyttKFQhJUp9Rk53T247VF5lezl4Uz8qCit7X19KaXIqfHdlZmQ8KFlrPV9NJFl5PHZuMCg1VE5WRCY9WDI8bTBHcUpGKnoqYF5sYUFyP2x+cEhCOGVyZHFtbEEhO1g7MkVmcDBmQj9ICitQNHVMaV5wa25OfD9IO1RLVF4jYVNtU2p3RWJab2FfdkZhR3laWXt2NUI4LUI5K1A3ejVocEN6RXpoV1FRKT5xVjlePV4hWmRaQ3pLPERzCiszZCVoQC0xMWZTdXlKV1JIOWhpQDtFJnJSNXYtTGZRYWlYKihOTlg/YmNQU3xNMlV7UUVrUGRpeHNvZ0JCb147VDE3PlcrX2R5Vj08Z2QqCitCZSNYNkRPNEw3cS1ycl9nRDBAajd2ZXljS0JrNjAkTDFrWSlFJUkkMko4OE9idTJKYF8henBXR053cStWQVVeOVIyVTctT1B1KUtTVnx7CitWMWk2e3ZQeDFMP0M1eGZHfXZ0PURZQTlFTCR2bDIqPypJeEdnZWo3MUwxKkJaR0Z3NE0jTGhuTm8tc3AkYHZCUXt5KUxXTlRMaUprWllFCitoOVN7b207dmZNZEhCM0VifkswO0stQTslQFFeZVg/fT4wKk0tdFVuRj5mWXIxbCtPaUpuMC0rVW9YMWdyV2laaCFsckJWbFRISWxHdyZMCitmQDxAI1NpUU9jZyEyNms/VlBKNlZjYn5fKmpCeiYmN2s0QTI2fVYyPF5sN1VgJipLPjw1JW90YyFNKzNSOTttb2lFM2lqKGUtPEMhNnk+CisybmR5RllDPmJyTy0zSz1jRFh0S3tzOXEyMT9iUmx8NUpZWkdVK3NvXnl1bmw+cHJUS0Z4QEBAREVPUSQ7VytQWmBgQU9LRXl6NnY7e0VBCitiUn1LYH51XyNuV1RHUHxRN0RySGElT3t4N2RTSGZqbVgpV0JxeTMod0NOb3t5LXxXaiE0Jl5CfEcwYldNVE1PcDlIfjRXSHAzaz8xdHpICitlTlJqb2FYNn5KOSlYZSN8a0FoQn1nMV9pIVZaXzN5eXZ0azVYcVNpfHBZPWo8OFkqMT5OM0F1NHo8Qyhhd3BPWjw0K3NyYFp8SSNCKUZtCitFbFZzQHRacjl5IXZHZSlNZE80fURSZz54KGJOfWtNcnEtQl9sP3BTbT4lZ0UkTzVHKndZK0xrKjdKdFUoblp3K0Q1fSl8Q0A7ZnQ3REJmCitUR2U1UVRBKm5CYSF4JGt5SyM+dUtVeDN0XzkqeGU4O3BpJk9DbiNRO0xza2MxJTtedkRDTGEmKVQ0V1g0ezVUWHYhMVEkRHJecHdfTGRTCispK0R1e2RtdWJ+MiNBbT5pK21TP2NQZHFBSCV1U0BHNVR1dldpQ2c9JXYySGZEMUZ7Q09gcTRTQkNadT4yNkFGSy0wbDhRYS14YVVDQ0k8CitwWV40NitUX2tVTEY2MnZqNklQQFohaiNlJDJoeUprV0EkUmQ4JVoxJVNBRCNnM2FBfX5lQk5uNWp7a3R8dXtYakpUOyRxPztVRE5DdDlCCis1Mk8tU1ctQi15fWs2RDh4aihGMCYrdyUyJl9Wc0Z6eE1naGNOOUVqZDUpbj9ReDhvKH09Jlo4eGZ5XmFrYmllN2ZlajBmTmJhYFdNXzNJCis/dyVDMnAzYCZIKHd9MjRkaFB6UzJjdVFLc3xReT49PF5WbC1sYHJPSldxVyV2Jkw9NSh3bzk1R24mVzQ2c1B2MyZIMTExR25eNEd4Vkc5Cis2VyFIUnxYJERyQXkzWk55PHRWJHJ4d3lrNU4wSHVfPkppY0BifT51JWlRLVcmVilfJWlvNEglPSkwX3c4c1AhcCFIOFVqKGg5S3YpWk18CitZS3UkS21nQWFhPXxuJDxWTDNwQXt5QnBNNFo3KjJua1BrIyo9VXh1X1A5KzVXcSpHcXRFaHt4e3AhPkdfTjU5bl5GYT5YMjYpPSlmRFk3CitYbzxoQ31pendrd0g1PXMqKkBmfUlWMjt1c3FXNmRtbEsxdmBFWERxfjs9Q2hXcE93RCZPRiFvcVhZO1dhRWdGQlJUWm5aeTM8aVgqVEBGCitBP00xNVZzUV9xPXhGcHErTDtRYWR8R25pWl4paXVyeio+QndubyFuJCt5amFkOCRSQlRmantvTENtTGdFVV9qRzxtaFJAdG9nKUN1eCRoCitUNUJCbT1jLWlhUFE9Q0txMmxIMkIpSz9VPnNDQWBHNElaS012OT1QQFZNdUlpQ1AoSjU1X3N6bDFuY3hEYEZ5UVZyaG1xe2FVfT5EJj5uCitiYS1ebiFLQz9IcXhhWnhnWntkSjRoe3ExbUJjKU52UChMOD1IcDxzP1Z1cE9zZTJkZiV0QF5hJjIoSCpEKUArYnJ4TnV7K01meDI3TmByCitJfEdTSilpajx+NypyKjcpaDtaQHVES0sqPnBRT1F3VyRJa2FLJUBnPDBiITVpVFg9ITkpJiN7JXA0PEhBXyE+bzNYIXBmfF5Ma2BPNEdeCit2biRpS3x3S09yQyt2Y0t7aTZJe0JqSE9KU2NxcWZ5fjtlO1E5dy1YZENWbVEtfHAjMWxNZCUhS1l8ci1IRXsyZFN8S3leVHVjT35jQypJCitMfD5QXnhAfnlFbEM3NTxOOG5iPU1zIVVyTFJnbntFPWpKIT8kJHFFemhPZWJOYm5JPWkodHgkJWI5fjVxWTx5OH5AcUAtZ2M+RG5lTkpXCit1cSVaVDFreyZDai1QSXREeFdjTHZDQyZIUXZPYzdFVmQhV1VQYFZXcHpsNEttSjkjLXRSV1ckN1REYnxpMStpcl8xY1pyTyp2I3R5SUN7CitnQnhlXjZNMyNBfTcmcCN4TnRVZFBuM2lFMk9kTUViY2wkXm1MMDwkaFNBR0JfNGA+V19RLShUVXt0byppMXpTcD9RI3ZAVSMhZzxSSko4CitrQiFeYHRFRE5ueFAzUH5XWkA0MTApKGIoUEorfTZMfjFyYXZsOEIjSiskTVJaRnd3TiF2biRFOE9sP08wTGEzd2IhZXJEOVFhPXErdG1eCit7Z3plZThMTkp0PSEwWDNyPHM2RUImZ1ctdjVwPU5+Y3JEK3EmVFMzPnZ3RzJLNzYhKU1GT2B5bURHJkphI3BzMCpQPig0OUgjMWVJR188CispY1laIVJyNW5ob054ZWRKPWxuandncllrRWZCbz0mJnZOYWZaZGRtemBsV2xoKzBvNm1PTSZpRXRBVEU8ZCRpJnJVanE0WEE/eT8mMjA5CiteaDJiOzBvUjhAK3VpV2hGOzNhYlpxd1YjWnF3V1E1Xz4pbCYtTz03IUwja0MoRHVoe2okNVFXaEJ4UHhHaGt1NmcwfSFLPzN1VEdxYVlrCitPQ19MWCVeZ2lJKEJRUE5sI3pPOWlXQ19vPUBvdENAQD08RENyR3psciloVj17TGJEO1ctVzMmb1IwUVF7I2kzVnpneChmJTcme2J0WlRxCitNbUp2NkcxYF9nQCFfJXNXKnRQYVl3TlVXQnJNVndSOERIY34oaX0/QGBMUzJ4V3dITHQ/MmpFaTw8RUooOCRNbS07QG11KEFXIzRFZ0N3CitgdHpHQTlVcHgxN0J+bmt+bnpgcnduVEwoMHBEMzl6dVRjQkk1WGNEWjJVYzhEUGkofGFQPiFoelNxbTMrNjNkRXkySC1pX196NT5CSnMlCitQdVVKOHMrQSphIzxIN2N2ZDM0czYtNFd7PmZ1MEg7USNGWDlIcW8laHxQSlZhd1QjTGcrN2lzeks7aHA2RW17KklIQChBfG4hSHpDTVBECityfTxPXjlFbzQyemwjei1nWU9RQHl6OFc/RWYxTEhOUUdkYDhGXmRNZEc3PDVjfUBtI3RxIXBwQUBDa3AxRUt+WSkoQ0FMZTFCaFB0SEFlCit0TFIlVFdDODZ5fmR+WHVrWDV4RmYmXjg0eipwMExTRkMxR2c5NzUqdjNlTysoKGtseT9lPyYoSmlMcVhzUFF1OE5WTWQxWm0hT2UkU1BhCityXmdaY0xuUjNrQDIrPmRKUmk8dnNEQi1hUSgtaUg9SVRiJnVWNztBK2VxYSVnNU01WVR3Mk1gWXU1TU55X2dxe1NRcX4lfnlvS1lmaypJCis+KyRzRCpya2owe1R3WWF4Vng/czhQMHxDayR7RU08PSo1akwqIThCTWFXemw7REJwYVZNYTIqM3l9O1BzWTUrY18pI2ZkKG1PPU4kQnRWCitzfkI9X0tZKilYUDMtJlNAR14jPSljTEpNRkhNaE9RSiZDdiQlSClfQGhlJlZXb2FVTVBqTTJafUVfQk9kRWY2RGpZKVlfdEg8eGpOOGheCitYPnJEWCV3IXdhdjNSSUdxK2dHRCUhdCU4PmJORUQkTGNjRVIxTWtaayFtWjxFb0ZNJCphTn5Wb0R4UThHNT1CZyElTCVARzYkUVk0fURACis1eztrOChiaEV1UWlkUGpSYVBkUz10YG1OSW9mKmUoSXZjO2NnemZsOzU5UT9EIWI4dXBQMj15Mm84O3VaO3VVaThKfFhtWE5FPX1GeDlFCitNTCVRJGhaRilVRHFkV1JnczZmMHBidlRsZk83XkFPPis9UG4/RU8oSjtaekxma0MhOWZme1pxKnA+N2N9WFRlYGJoKFFkdDt2UVptazVyCithYD1BKSlPOVR1QiV2aTw4N1psKmxxKWx1S3IhZkQ1eGY7PkdUX1J2dSZib3Jabl4mdGBqXjI+QEp4US1qaSZtYX0oRC1feFZtREVaNlRfCittJkpAUFBEU1phUXxwYTE9LTdESXZZJVFFN0R1PDFKXkttdTIoe2o+Kk03eFpkVG9rSElaWCN3cTd1MUN6LW41RGFVeXcpUGwqMmhtPXFvCitAfGUhMitGcy1tVUAoblVxdGdKeXsoXnlFaiN7cik9S2hNXk56X2VWIzx0M0BQSHoxYTErT144WHRrN1k2aiFVMkVpcXYwPnN3dyVKbnhuCitZQG4qUlpmYSh6ZCpPayYzVj9hJThuITxMfUNTR04mVmZjaGA7I1JNYT4zWDN9MU9XakkoelhIKFJHY1hlbXtObGZYQT9YZ2YtO0NrQTRMCiszMXN2eGBvekptYyttdng1bCVHdUtQJnxnP0NvU00tNU57a3QxMU1OVjthTEYpWnlANjx2U2czYyVLb29RIztnIVdoc3VrSnFRRlI+akJTCit1O3RnLVBAMTIrKlheKFhFJGt3dVUwPiN8JDJtazgqPjU5Y2lBeVA3ZWRsWFVRP2k/OWAwak9BIWE3Z28hZWYkJUZiSW5ZZSV8Tkd2QlZXCituOVhUNG9qIT9ETW4rJERIUGU3Znl2XlBnZjt4cFRmUDJUWVIxMTA3QTtqQygrUHV8bUN1eEskKnswS1pPPmIoejh2PFBGNnBjPzVKUXA7Cis+NTJxbl8zdHJuXkVYP3tPVTMwSDw5QD1Qb3UqUV4+YnxqMm8odDl+PSVKdzNlcCRqT0BKTGRmI1lBN31NV1JwNXlzLXRLWkVtSW0+KHQ3CitzbDN6d1hnZyhkWk59YilYOF9RclFAQy1fcEszckYtNkxFPnEyJGlVSVRwYip2aGw9ejtXUyhQZSktR1dNbWwjXmRGSWI2b1gobWFrUSUyCis3JmR4fnpNZzxsfkM3fTcqKk5aYjA2d2lrMWVtcj9VMGsxPTNZM0NMSkJCVGY3JkMwRj9SZGhzZyMoK1kqWmpQPEEhXnJBdDdFeG09bCpuCitlVCtmMHRpb1FjQG92UTNeJTJ7RStPYHlXKE53IUY/SDg3KGN3aGpJZ0k0cyUqIUErLWF0e3JHe2pldH1BRDs7I0p6LV9LUHVQY15JMU9TCis9Q3E7UzY/c3ZSLUdaVU9QNGl1cU1pWnh5TjkpbkwzYExBaU9eQnlIZVlLck8xI2A/KVlwM0xaPktObkhUaCl9TH0xVHJPIXVVcGY9KH4qCitXXndnfFA0NjkrY0JUV2c7bmxXYFMpMm5NLUhBMTx8QyNteG1JQ3w4NmhoKHRaJmF+JChWYUZAUzNabkpZV1BOT0BtNG9pKzNlO3YhMCN5CitocmZ6WF9TSE4hX3tDPjA1dD4yLXNZI0ZXKWZSVWhobDMtRSFlUEIxeHp1K20jeDNxZCFUcEJ+KXslel9ZMzVrPlUpU0grTyRJdnE3YjxCCis+Q3V8R0J8all9UWE2fD1uYiYkdGV5elYrPkEkRHAhMHo/WkZfQHFjcjNHeSp4JHt9QklaU2BXTVhlXntES2dUS3t9JEp7YzRMeVd3Zyp2CithPDVIdHtaLWFnMWk2MHIjQ1c5RFF2ITRBQndoQERpVEtqME10WDlIUmx7ZSN0ZGZgRDJzVj43fTwkeXl6SXM8T34wUms/d1koY3VwdkZKCis/YUdkPWlUV1ZhTG8jeEJwSiNWOTxWdDw+VSF3NGZESFNpRC1UVWZkKURtbGc+TT9XYTxyTGQ0MW5KV15naWJ3SU12SyQmcioxbkgjXnZnCittZnZVS3hmZnt+VUFgTnktSnRWI3J3eS08cFVgaD1BUWBFSE9UKUZ7JEA7K3xpfmRJKUkrbn5XSGd8UU9RNjRMWEdUWHk5el9hQ3lTK3VwCitCRi1oTWNISUJnfWNzTzdSSl5PXi1qfl9qZUY4KUZJT2lZMlkyUClAVWkkbnFjVT1VdHxjWXdgejRqLU1MeThyIUFvY1MjU202X0hTcD1+Cis9WlooajkjcGlCMiFYSUZWT09tanQwdEZSO0xCXkdUP0NpeX11RDIoRk9QPFpDXzR1RSFqQT0+OU0pUHkhSz91Wm9STHBwaGticVVNdGozCit9WW0qZU09fHV4KkE3ckx5fVVJRD1zKFA/U1M9PERPOXQqO353alRoMyZvbntSMEhLaFc5QjV8PWxEcSVHKzEmU3xnZlo/RX1FekdFKGpDCisocng2PmRuR3xzRiF3VT5FeyEhQ3Q8OSE8YUpBcCF4P2VBNGhoP0tHZV5PMnNQWjI7P2JGK2BNdHRJYTNPZHsoalVsMj0zWXV6bEFUS1EpCisxJXRPdDs2YW4xRW5MJlRFTkJYYzVvUUBrOCpHLTVUUHheXj09WUk9YiVFRFhmSHNQKV80Kko7NjJlOWk0IVRhaXN0YkVPOCNQcHhuU195CitBRUt3emR2e1N3cEdZWj1XUD4qflcrWWdnSEl2fVJZTTBlNFZMT1ZWRXhmY310VW8wYStudVA2cEFmU2I/ZTJ0WiF6XiZfZkNlYj8yRUx8CiskPmIyX2BeVmQmezdgZEtrIyUqdE1EcEF5RUo0WnZHOTdEcVEtMGlFM0ZWeDEmfVpwMzw2cD1KWTVAJHo4cWE8OVZEPkNHMWFQaUE8YFdxCisyU3FBZzs8O2VacXJoJlpCalNIKCVzK2pNSEotWnhpTl9KZiV7WW4+YzAwenJUY31JVHVORENqP3R3TXckV0xUYCY0YzxYVDIpPHV5UUM9CithR19NY01nOz1MSXtWZDtwd1Z6dGlQO2QrQGJ9X1Y+b0NuWFMxYW85Z2p7ZipJbWBfYTk2YnNZdlZZcz1gVztEJnI7SGR7WEkoYExsKlBSCishPyp+bVZ7aiZoeH5vJno/IXZmTzJAP258eXFSRHY4cWhQLXNHRWgqOHk2eTdqbj4wJT48Xz9RI35ldSh0NmhjMkZCMH5SdndVZHp8SnIqCitLZkdEZjRmQmRwM3UzJVpCU3gkO2U7V0VINUd0OTZJMHhBZktxTjJHViVBaEVsRnlxbyExcGBWTkhUfHx9WF9geWZac2smYDNHU00/cT9NCitfYW4ke3FlbHA3Xl58TDFkYD1OU2VCdiViQ1dgK05VeTUxaEk4eCQ4T1NwMVlwPSs8UT5Nem1WezY9ZHVDI1BpaXFUdDtFTUJvWldXMlkoCitOc3laKDUxQit3TTdBVlo4fjtLS1FlZ3JNdWlwUyZCOz8lS0N6YHt2eERRKlNqa3VTO2cxfnVRRmp5V2NAMFdXd2JwamduaVJwRTwpPHY0Cit1WjZuNT5YQTN2ejhqUCt8c35uIS1oPjkrSmZlTl5EOFQ7TGU4SSRXY3x2LVI0JjAqbU19fntjMDwoNjw1KnBLVWFtIWdifFBiVSF1K0JqCitNNlFua21nYTY3NVlZSGR7d0VkaykjUT9CbGdsV1pBazxHTFRDY0Y5OE85XndnYlFOZylFQi0xQS1HMkdOY0o5eXItZl54Z2I8Nmt3YkwmCitZZUYoRT02bUF0XkVJbFQ5ajBxTjEoQXdKMG1PREJ6JiplQytxOVI8YnAzUnF8PE12bCpMMVMqQmslXz51SztLUyR3ZDg5cmVGXmN+Qm1VCitsKHF8ZDdONSZ8fVhoQFlxd0JQREl8ODJoSkIycWxeSyNCUyozemsxMig4YCpnOyQ9YHAhYmxjQ3cmMnEzPE09PC0zJWtKek9TP2dVNWVJCit9ayY8QEF8Jjx1WFVnUm0mUnVPbmxyKyR+VXVIQDJhYEJQfjV2QlBDSzs2VlJON0AtbUBlRStkZihwI3goY2I2Q3NYcnMlUytvPygtdkJsCitOVUsqVnI3ZilFS0c0e0JgKGhROW9AOGcqfmRHTyFSfTZ7VmF7RmxlbD5WakVGfShuYkwkUmZxVFlxNUg7dTBTZnRUWjsmRXtCJFA0WCglCitpYj9ZJT0rIW5XdEZiK1kqKyo7PHBBX0ErYlIxQG5DJWZ+UlIteUQ+YkVaez10OEtAVkNTVHdENUxkNHZKNDAmaXg1KGNrUTl8Qk0zQXh1Cit2PSpzNSQ2TFJxP1N9cWJneTE2RXlKKTNKMStQdH1UTFR9dVgmXjQyTGZufkpWQ3cqbS0yTSRWMnUtaUsrJVJpMDlISWZ5aDE4SDFVSWF8CisjS3hLRj4hTXgmJDlEfDA8PEUjOyVPU2BySUd1TUE3RHp4OXJDQi1gRzsjI3htITUyeFkwVHZjSG9fblhzTypqaHE9UVF9aEEkaEQjYz94CiszVXlaRzZUNEN1SmFodjxRK2ZlUDZmTmckNiske2gmc0VycCM3V3ZvaXJqZzJUOGhfWExtandzYDl3en4leF47fGAwWVRuUX0ybXE3Qmk+Cis0SjQpK2pRe28qNDc4NEsjamFNd3htJGJuLTZkcEBoNCZuXnV8VUJjST1ATiQ4KmZXbVc4P2FMWlI/aW0pVmBFZDdZXld7NDk5MXJgTk9GCisyTlM7cjRWJT0yPWVTRUozPkJBQlhzQnwkalVxfn1OPFlUTWEtWGRMRk8tPkFRSk9lNFJfdjUwJDVveTd3X1o/PUwyXmIwXzFQJE5MbjViCitBb04rYCtQamFjOW5eJjtgam93R3tITi1XZUA2Vjt0Y2ExUVVKMil9KjlxaWtRX08hKVUrRGRTUzZZbD0oak1YUz89NjNBbS1uWVklcU5nCit9czdGWWgmb1ZQbSsrbmJ3fVREI2ZlIzRSNHAxMyRhfHYrWCFgRz9RNnIraV5YVy0xcGpjISpufVIoVTxJXyRPWHM1UD8jZy1NQH1CT2FPCis4TmllYnlgMkZXVnw5UkJIK208P0RVQGQkJUxHRXNZZHpuckUoO2stfD1HR1Fme0s/aT1GVUlgQWFmSmp2R2xgaWJrdTNye2ZIZSVuI29TCitJQjN+YzVpN2BjRmlQb093JkQ/ckpYbnpzK1R4KWBhXkxHczxGKUtRUD5oMT5QRG1nUF8tMVBzRnMzQVYhU3Aldz95NVJ7VysrU3FDSCY7CishfXRpUjd0fkFNbGZ1Yjt3bThLQmBsWkE1PjZmT3YqVT5Ndm1pMD9le0xOfVVmQnQmeHJyMi17enN0X3l4QTt4KlRQMSN2aXtDNWFfbXVjCit1Q3c+cCgyOG9xIyhORWY5cDxsV28+ejklaUpMVnozSiYoejY9PyFgRXlYOGlXZShBQGl4VygzWih7ampiUT01X3ZjN2VsMUB3LSN9dUVwCis9T3J8Q0QlXz1RKXw+WlRhWWs4dTA3V2IyOT43JWR9KSpTelZIXzl2fmQzaV9XLWJAZXxZRWxLflFjR215RThUeX1yOz03KjRVUWVgO3ZfCitFZ1dFTk9wMEY0a0x8PXNvVmxmaHE/RiUxPVo0diNFfnUkRkVHKnslalE1OXxTTW9CeT1qVXh8aEc8dSlDQm03dXB9I2g0eUQ1VnU7dUJWCit6UTxje2BSb2RrTEg5cys/QiFzQjJAaUsock9hQ3o2XzQjTHhpZzRfemcpX3ZxQElmMihNdEZgfmd8NHlvWnUqPVVWQXJrPClEeyhpSSNpCitjTkhtS3Nnb2shJVlYMmMyKE9CPDNAV1VlWGZZTDVXbXRSKXRFUERzQU1qTDI2MXNAM3AyI21lIWBqTzJTSnwxbSpZYTA5NzV1JStVdlN0Cit9PHFKZkBqU0gpXioweVBkYEt9dTRVND90eDwlcTxpQD1PRy0zWTJeVUI7UGdnaDNjbiNwenV4Z0QoV0xGdmYybUJASUBNN3YzZUV4M0NuCitiXnFLPzhjK15lWHFRMmp0R2grYjVNIVNqV0w/R2RGY0haISRCYnVPPUxFUiZ0O15fMEtSMEJsbjxJSm52bSpaRDxReWgjOGFrP3RrJkRuCiszSiMtYT0/XzdSeEN+UWYoNn5tV1ZkWi0mJWJgUyFteHtEVClKaXA/SUhIJHBUbUcydC0mY3gwaW4tXmdmNnI+MyNPRzhxUkhIJlZKVSR2CitiJH1vJGNhWGc5QH5WKlhOVVZXNWxTVCR5PWBRNSR1ZVo+UnJEKj1KdHJNJm9eVUsmYjVVPyoxNzM9YCpNZTNhSU1WPCt1RXJpMWdgQGZLCisrNld6YnYpe3prP0JXbSNFKGkkVGlyPC1zJVRGbWZxSGhVKj0hYyNLLXVBe2BNT1NXT156SyNza3ZrWCpmZWdJWE41T0J5VlcoRFVeJG5jCitRR2BEIX40YjFQNUVzZnR7PkBNQzE2IzJTMGcqcGlTM0c8Nz0oRkEqNkY9b1dBd19ZVjFQP0lZZnI8RGpsRFRHOSUpYnh+VkYqbVFONkpsCitMS1hwYUlWd21QJiZoLTB+bnJXYGYkUVR7WEwjY0t8V0QpeGgkTHc4Z3UmP3I2JDtXX0xrPnlGTH4tUVRBIXZoTF8oTVIpV0E3SEYhe0VtCitfYlZgM2x8OU59KVJ2P0wpfjEyIyNmKFRvPDQ8OHM8UWpPM0B4QXUxQGVPbmwzYShmYHZrMzFXOFVTYWY4TjRHXy1EZU01ODlxelY1Q0ZrCitaRGdiKHJAYUpCMXUhVTFlJjY2WT5gI0EjT21fVGFVfDxxKU90Kj9DUGA4JCo3Xkd6X3M7Znw4VjF8bUlsbF5CazhifEVsOXMxQDgrTmNGCis9QEJLeFlpfXI4bypLVH1zLVdkVFdURUE4bGVJaU1EOCteRmo7dDt6ZXh8MC1gM0JTXnEyOzthNUQjKl9EMXNuSGxDemQpOEF5U2E9UX5CCitxQmJxQGRhWVMtUyZSVStkIW1VNlFZTXp0TUEpTTRhO1g9KExfKFNDTm1GakMhZEUxKkg9WmFgRSgwP2B0VXdubkM9VT4lQSNFWF9Icy1BCis7bG1vR3Z8TiorPFY2ODl3fiZySXd+UCFBX2JKcGN4WHBvT0pfPT42YWdhcUEkWUgzP2R0Vng+THhEI20rRi1MfHhzRUdDSVIoRCswT2paCitiOXRsOFFGNkFGKT1eYGlNfW5iR0AxJGc8PzYmVEFDbGhRRH1ZfjY0OTx1R3w3dFEya3l9UDJubXJqS09rY01oOHNlIUJEJE9UUVdzUkNgCit+Z0VHPCZWY1QtMHJGX1N2SyFSRSMoZ3dCUG9CMWsmd3s7RDN3RU1MclgtJVdmPiMlS2Y0UmBZRCojKV8xN2pPUC0+QGtHaiZDWFghdGFhCitOLU8hLVJQYyU+MUJJNVRreX18WXdfZiVXLWJicFdUbmV8TUxReF5DNj5CMHVWWGV2SF9uSmByeEtIWCkoUT5UfG5TSz9HKjFCMytQZzBGCitZRTE3PmxCITVheS1uSkRUd1YhQSh7a0RwNmg3aVRJJjhAeF80QGpOVEIkZD1GNFlXVGdsbnQ9KzVraGJBNGN+d2B3eWhZNCpfSXM+Yj5WCis+MjUrYSFXaUt8TlNMZmd8enZidE5sKmhEVEI/SXgrRXZ+ND5FK1BsfEh7Y1BiQChYZCUzK20/eHI+RSFHYm4tS2gzNFlBUyF1TkhOJXprCitVQk4objVVa0pXO1QtZWZmc2ZnMGxpV2spNkh0M2c+UUg1bngyfCReM057SnF6Y0hqNExgekhDbSNHaSY5a1I1KW43Ym5qWEJjblNuQXZtCitXTzQ2WmVkeHttQVdofCs9fHZuc0NyPHJTM2lwR1BQbVAqaUQ5TnEpQ3dBbjFZUnBDbWQydkhOc0pEY1BxflVRRDg+dVdefXVaR1JxUyVMCistcj1zKT1zS3BESWE2Z19Qd3lvcio4NiFBdmspOTJ4Tm90RWJ0VDlvTkw/YzlkVD94ZVFnUHxANXo+TX0tWFE3bz5gSE82diFvKk5EKkxgCitzVk10NEU0VSheVHojY058MUJHXkdAeTBGXj4pblp5dTJncz9QUCRzKm1OQEFlem8kTGM9b149YFp4bVFNdmZeSSpFQXQjSDZtUVF7UikhCitvJHJgWH4+I1F7RlhQaUJyWndoJVpaK0hnMHM/ZExrRE9HflJZK1FKWXV4MlRvZENocXQ5I05yKWVAci1FemleQXJPWHJAX2xrNmwlUk1ZCitubjRqMUFgbCNwUlYyQUE1NU5MO0tHKnJ9ZHs9T0Recn5jQUZJRFElNHdrNHB9UWN6eEM3aFlmK3dyXlFTZzxQeDBrV0tkZzZeUSZAY2FpCiszMkljKFVkaShRcHkqLTEpZEJaPDdvfD0pWUx2PnA+Kn5PLXJMQENBZihsO1diYEBTJDVVQ0FRWnBRLWVhPj5mTkwjdFF5SUFfQlRpO3kxCisyXlpeRHVpTmtgXyg/KjhHQkd+b2VBezJXVSUpcWErO3UoNFhXflJxKEZzaDVLUE50RktRKmJEeX5SYFZ0JDw+OEE5TiRsPzM8c0dQOCUkCitsYi1hKzl5eWhGeGN4a3BHUyFndEhqemZ2e3c5UT8oYyE9e3lFND5QekwhWl5oLU5pYnhhNWhhXl5ATCRBNSgrI1NOdF9VRl91YX0wa0NNCitAK0QlQH5qckA1TW43ekg9JDZ0bExPS2M7ITJMXnNtMys/T2EzUW49ZXhRRH5jVystNXlaPT81PFcyU2tNTGNUK0gkTzhaSDhtZmRWYiVzCitsUGtSI3s+X1NCVDN5WDdueFpqI0M8TigmX3R+OTJAYTFEZjYzKTckcSs5c2koRzliRzhlYncmJTZrWkV8T1lvX3gyLXFiWkpPRD1hbHBxCis+OFcwZSgpJW5ieHg5bUx4cEVMbCR9d15ZY35XWiRxcFNveGEjaF9fXjJHdWJHYCYkJk5RP0NZZCl8fl5TVj96Qz1xdSpjdXxDVyt4RWg8CitgRE9PVDdNO0EpSmsyWkxnJkBLa0tQdnBGQG5nYkkwKUVFZ0N1ZT5NaEI1dURobEBZNj14cDAqSzVPeCthSEhrfkAjbntRX3BARnJKbkxtCis/WmAmU3R2aDBHWiNqflhDezIyRkdZZ09UQ0glcF9yWjZvP3dlO1lZYGh3Yj9GbFo4OUh7Zi04ZjR6P1hGSlBTWFVoKjt9eVdmaDErRFleCitIelJ5fFRhNnMmQkA/QD57MFU0PjdjMTUyP215aW4rVz1RPFhLQDN4UGY+JTFXUmFfdDQteVgrQVRafk02P3M0a3ZwYTNRI25TT2A5dFh3CitPaXQmeSRYa2NDcSo7K0FwRD5BZmZVVlUmdlVTJD9OQ1E9a09XOUlWU0VoWS18N0YzR3N6WGlLbCk0NlNxNTJGPjA9fEk9c0J2YFAoQ2BNCithRWEhY1A8cXhSP1Roa1NEcVomeEBkXll7blY9Qk95YXcwdHptVkZfTGRKfWJxZyN0KXdgSkdFfCMrPEc1WlZMZDIhNCg2cGcjbjlgTzV+CitRMShvM2R0QkBSNTByTEh5VSVzNElCV2FHdWt1T0h4eT43eWlvezsmJU1fKjZaZFliTXw5SCgjPkR8KSNtTmckckd7YUY0T0QqRXRTfWFACiteVSY5P0lvXn4mYnhQITdIS0IrPTJ1SW18QT4qSS1UVyUzUGxWfWQ8IVMmemp1JXgrdkRvcEV9OTtteS1pS04pOEMhQEdVTDwyNHJtQSMzCit8RXBrQXBRK3RLSzh2QHdrOyZmM0ZqeCZLcncrLS1YKl9CLXhLOSlfRGlUb1VtT09eRzxRK3VyPEplMWM7YWhxe3l1eUAtWH41eDUtJTZqCitYa0wqKyFAUkk0PEg+WmkmRUdgP0l8TEQpME52WWM0KjIlSigjMF83ZE81WnBIdlBhZ3J5JE1fbmR2dm1Qc2lyVyUqOStGdmJwKyV2R1c3Cit6enx8a2tkcD1ldnIjT0Y1KT1EWHlWMXBydXB2MSVlbjVoOVRsIyYtTUdPRzBnaXR3dj1Ucn55OUJ2VVo8SyRPSUN7dXR0Pm80ITFVVnZCCitiU1hTOFNDVVp9Zz01IUZpdTNGM3g/PGU1O2JDb05aJiQxd1ZOYGdLbXNxYjxZJkc3PHBFOHJPJjZ9Szl2Jk1TJFl0RUljVlo0ZlBROHJ2CitadENBezVjZ2pKIXBzbkFNbElZNCMrZT9PQyFPciVGPzM7Xn08bjIzKFlEJEJPIUNLa0xkWnE5dHJHfj9KNlVEKCFifG1eX3QqcEtoPWJACitMd2tVbF9geDJ1YXk0RCh3e3dZak8+WEM4YnEhcT5HbCQhcF5iY2R3NjJyQ29NTXNeOzlsSVlwS1BHUmVXeG5AcFRhKUNIejF2cGZMUG9tCitvUSpWJSFVQ1AzT24/YCMjeUs7T3Z9JntWc0RgUmRsV0dgZEduISo5djw8aWhGKVZpeUVKVDJNZFpaY0NhPVUkQyE9WTBjTGImckh1TTg2CitMWSRsUjIqdmxZTjJEakdQViVhNTB7WCk3fjcwYDNRdXVYaHU4eXhSb3VkaHQ8IT58Sio3S181e0hSKD9UaHg4N1VPY3VpPyN1KzE1WC0xCit2RUQ9SiZoTkpedD88e2opNzthZl5Ga3s2ZX1JWD1Cb3s9X2RqTT94JHxDOSN2PUFkSy1FOWwtb3dWMFJjYjV2KXtHcnVAQyVNY1k+TnotCitKa299XiNNY1lSVFhyYjkjYmhVblQ3MjIwOFhrUT95TncoZGhPWXRmJEwkaHxJQEp4USRnfms/aE1XZ3ZJTzhyVzlCWjJ8Y3VWZkZTZWtGCitTaGBqeTU2MUpUdGFwe3EkSXJ8ZE45WU89R2F0STN7OVR9fTR2OVAqZmU/azV9RiZvcCNEYDhvNDlxNz4oZ1ByNzVSdEJVdG9Wciltc0Y1Cit2dzJIcVFDd0g9YU0kZHcjeG10bzJnaTg4M0AzNEg/VF9FaUcqS21iOTVhKXFRQHhkeU1ybXo5RGU0R3tJMzBlZnF7JnVNWiFTSmJLNFJtCis7dzc4X1MtK213cHxIdUA3eSpiSyQqUSg2OClAfk4wZFlMPlUxQzlwIXNwV29fLVkxJWRQQ2JlYSpeN2xzOWU0bjhVVFA7KDcldW4+QS1TCitkbGlreFBLQnhOX1VsPnJRck9kZU50biY7S00yIz97O2U9dStySmQxa05wciN0JG5YfVJvUDMwPjErUSRuQkRCX2d4VEdgUit3dTAzU255CitPaS1wPFZ6RUdIWWAmP20kKmJCMUlpa1NGUmxpZXp1cVVAUSU+fU5MJUd0TkYqbTxqZnchVz8zYzd2XncjdkBsMjZMeG5sazl3ZnxFZGs8Citrd3cwOU99aFcmbkY9R2dCTXJwNFl1bkE3Yloha2xVVUp5U3dLbCg3OSRDY2UldTUqQGElO3lYd0NTSGc8PmkwdWMzYilqZldnY1Y5KWB2Cis9MGg3fW1GaGJ0JFlYZz4/bjIma081blNteX5WX0hvJGZXSTdIT240ME4wN0dTY2xMTFgpeUUzRHtwP0wmcTJmVCp3diR+YVROOXdJeiYpCitQZGIhU2FGbj55XkZBKGc3clJPSnFAZTN1O1BxaXlOOXNhZ345P21IYTE9cV5iNHl2Ymx7d0BSdG94c15AXlpoU2dRcDYhWVohU2AjQE14Cisrd0VAJkR+PnZ+dU19MiU2bDtHekxxLXw1OGAoPlEyUmBBbSZsYzkhdTt2TT81M0NifjYtJiRaKFpaXk5iK0VBZCFyRTZAeVRLWUZ0aGo7CitCP2t9dXJTaTE8VDJHO3c4UlMmRFR1IWd8dUEqPzE/ZjEzPHo2cyh0b3dJOGhLQ2QoK3Q7cTQzSWtwU3hfIWlwPWw/V012eDlNJW9PSXR0CitkO2c+QHtmJVM5cVNWYD8zdFpXJj1+V2JfYjZSeTBucSZ6dmwtP3NZZU1qRk1kQE5pSDxDOCFOakVtdDUzRmtHWmwtQUtAfXBWK0AqaVF+CitMNTsxRER6dmNAXlAlVDNlc3lNdnFpRVVQfnpAWj09VVYqYDwxdGFBfEd5JGRGd3dORz83YGp+djxNeGE4OF89d1hwdmMxdGNRcXNNZ0ZXCit4ZUYkWXhJfll5UjRMNF5oUz9gdmRjb3JDQiozUWpPO1I3YXhvYl83UnhSZmwxcjQpVzJ4LSZofigxRz0mP2R9PV9nI0sjdTxaRiVoWVFwCitJWjxEMEZNKH5TazJJQShJPWgxe3kwdlk4ak5ack1YYClXK1RIIXUhK3dORF4mJHhZLTNyJjR8Tj04PSZrTV59VDZRX21hN1BufCRUYWEzCit1TD5vTjE4XiZLZ1VlQV83JEwrb2dHaCFNSGBTTElEMSRDd0loUz5jJG40RCl2Tj5AYypGUlhJUyl5PEN6X1lCM0VvWVVeTTt9a2FBUFU4Cisrc2AjdFF5MGNeSE51d1BGbiNMMjEyOSk+ZXYzUUlqcHFPYWdnJm52O0J1VU90cDUrX2FLZEB+JCU8fHx6fGpKaitLKCRJaD5GO05PMmhECitjdnZmOW5xRWY/e3pEWG1QeF48c248TjNYV0sjM1haUHdkVE56fmN6ZnJGOzxfOCN0U2FNOyp9YXtSKjgrS0MqfGRBQEZhQW9IUn52NndDCitobG5yJW5TRTtSPHVqNzgqVntmSS1IJlloU01tSnZaIT4qMXopJShDSSpqSVM9fCM4RDtqYURPNUVnRG02UW18I01VTEVBank4ezE5OGFaCis2KzE0MXV8LSNubX5URlpnVExhZDEzJEhRTz83PFBTfkYreVVXbDxeeEIxYlBOSiZuJj0xe2w8YCsyYmspVklFQSVBaTNgZFNWRVFrYj9ICitrUXFhQ2UzUklBUyk8TyFyWW93cShxPH07S25+dzVsaHNAIVh4S3ZFelQ9cFpYWll9Izg2Sy1NT0AjMiR+a0xKNkZDcm8wQV9JcTlzZ0tZCisyemx0MlI3M3BUYlE+SmsjZ2ZxfChLKkFuZVpIWXY9eT13UX13PExZNzdjTUhIUVUleys4WV5vNXU3fjBwenJrWDd2TmleUnVVYmVPfS1rCis5MSMrVDd0PDt6TlowT0x9b0ReeUsweSF1K1hzK2Y2Zitzb2xCaFZyb2FATTt7PERXYFZMcCNIJCMrWCZQMHs0e19eQW56M3hFKV9CP0NNCithZWZ5TipyZVFVTHUlYXpkQnZud18oNDR3QitwQEA+ekhvNkg9QCQjdjlYQV9XamNfSEFKcGlXSjk9T2Q3RnAwazlLWSZjfjZSVDlJVihUCis2MmhnXnVAT2Rgell5UGlQLTQ8Qjhqe0FoOStYJXp5MUNje2EkMjB1WGxXZmh5MTdAZV8mendeKUEpJkhZbCV6Nmh0aX4/dTxCOC1WcTlUCitOdiNfRShFLW5YdDlRXkBFaUMhIzdESWR3QGlBMF9JTDd4YHZaPntXPUM9NHk3KjZwVSUhYD5hNUhOMFIjQmtje153KiF+MFJiIThDeXlxCithPzx7fW1jRU44THpYSjQoYG54KmxmeVdkYCM5M0FlbypTNTFXQmwkRyQmMjRIYzh9Vz5kbUFMIXY9eis7JUZ7Pnpkek1BeXZiQ2AhSlNDCitoODI9VDM5Sm5wQmBzOV9rYHJQQzlnJjw4c243WWg1Z0RhRE5Ee0NkQ09gYio/N0dyR1BsWWR5O0c2PX1STTw/UW1Scyp4bWxgPzMoKllBCitKNDlKS1dZOX4oeTl9K19JfEx8KylyQV85UVR2RCVKLUF7ZU5yO095X2hRKGx5KjVUWj0kUU43JDlHezclR2JJUGgzIVhQYV5oezUzKmxBCitSNUxmVV5nekMmSj0wMmpEKD1Tfj9QX0ZheUNJeExTS0h0SVFwcCFMbHtSeSp0KWo3UWhkM1A3YEtyPl4jaWdeR0NFek5ZVG8tQlRqT3YtCista1BtKjNNalktUyZnJlp7LXY+YUNaREAweE45TmtKKVk3REl5TmxOdz8hRmEyKCpTX0ZIKnptNWI5dTZuQFk/Ty13YVZRJD88WFIzcilyCitGfGpNIz93eTR6XjdhREJUdDUrY09yWUgrZGtxKTEmMURLNkh8UDB2fkdGU0MwYUIzIUwpJCs0OW8jbSh3blNtc3sxLU0jNUs+dHtCYTlQCitlMG9VK0l6NGd7M1kjdTVUQTdHV3RCfU8xTXhtS00oPkc+RDJZQCppMnx5b28yJm5rS31RWFR6NGI9VTZsVVQhWk8jMnhlN2phTXhUdWYhCitrUjBEe1hELTltbmFpayp4bCVWQjR1ZnNzNSpoZUJYRzNwRHBhQiFOPiFxJFJYMXJvQXN4JUEremNLWi1GKWdAUkkkP3ZnUEVtP2k0WmVKCitIXyFkcWN8VnBvRkVQOztANy0qbEJfNWN9WVE4RHJ7WU4mY2ZNPUpjPWJtaEE9fU1TJkJGcVoreEVPeE9aRGphdm55YyZnaENPODRMQUtxCis3KTdFQ1ZnWD43KEtFcjhDNkt3aDd4dnRtMHZYemEqZDJ6TD8/KlZhaVd0XntmdiVOVXwoYkAhOGFhfSpOLUoyeXxLTz03Z09aOUUtQ2ZVCit4bzlVVnp0eXo/X2UpYz1ofk87ZWdNZiZfdnwxayh3Z0J6VEVuSjs3bXVpditJYzhTXjJ+NVgySVVBOz08X098WHopMTtHYWRgdzRDbS0xCitSK1U5U00zODd6cEFCI3Q+S3Q5dyZII1U/YWdYMHlfY3dmemxeMTVoTV9kQkNycT81aUJIbGlRcjl3alJYZT96OUcwbSg0NkxCSl9LQ3wwCit0bGlBMXswKGJKV0I4ayFSckomM0JEb3RpTkwqX3U/R21jNU5IVFkxaEU5ZTJxcUYoMnloazBhfEV2dFkkeTFGOzJnbWZmPGBucXhjN3BACit6d2dpQSVHMCMyQ2liSnojN2RgeypwT0ZEWXxKb3whPmB2ekNmMjUjPkRFWTImLTM1MzhWVkQmZWhmaipIdnxWNmlfRmZBb31PKz0kanUmCithJmRYeWdsalg3VEVTdSNyR3lVfnNzVnN5MzcqbFoqbkAldkV7d05xNSU3KEIkdE93SU8rNU1UOCNqJDlTLSV2SnkjanI+PWtWT2ZYe2A1CitQVCtAZEsmQVBiPEJxc1NIfiF1SDk/Pnl2OVghJVE/PWhOV2EhZ310d25KdDg5YGRweUdDR0Fxa3M3TTR6IW53ZzNxbTtRalNOfkcwLUg1CitLTCVOXyF3bnEoQTJ7bDVaa21IaH1mNSRBYCtBViNUdXY1dSFlU0pjRWYmSEJre0xUemdRczIqU3VocCkqK3luSlIqOGBuM3xMZk1kTUtGCiteKzhEWV5yY2U2WHxBKHVvSD16SmhHK0daPU9oSDlQeFl4eHVqQVd4I1hNMENlVHxKZyNoSktNRzdAKCE5UUwycSlAemNfTld7I283fGZjCitDelNMTkV8cUBBM3hCaG1yOzJqM2l1Qj5IcUl8UE91SkZzRHpZSXFWRGFEQFQ2QzxkVVFxM2dTSm5AY0BsUE8mWmNoQ2p3YXojIzdheiZWCitJcUZnMT8lTWpydSUyR3RtM1pIcmkrUTc/bjNTJWFtUmplRTlNWG5pPytDemVTa2I/MEpvU2daWVFaSntuMWRmb05AdUdCYzF1blVAVm56Cit2Xjt3ZiZycGk/UHhyTXY/aTwoKStfRUo4bEExaCp5LXR0IWVQaHZKVHglVTRRMGdHYEI5cktCWEVPZWM9ayZCeS1fPG0lUylIYXFiPGxGCit9ST5tckpoME44KWd7OzJQQG5lfSFEc3I5PHRZTCV+Vm1UWVZJeSlgPWZMWkhwNCREb1MqbSUqRVNyMFh6Vkh4N09ESHJ1JlFLSCUoQUBgCisrOFBpZSVpbH5BRVkkKEZYazhJJFMrNWY2dztrYTtkM2RMUmlzZzAlfjklTk9eUWwtbiFrWDV2UGpqO3JWR3FfJHIyXktxMiFjT3ljS19jCis3SlM/QyZaZ1lWR1I5SlUmWClicjNRaVQkU2J3Xjs8cHxneXJTU3JAUjQxOWFlUzdja0J0UH0xbFBSfXk+N3ZIdmlkMGhfWk5USXxPI2lSCitRT1lOTGUxOzEwfClSbEI9PkxHWlZFIyNxX1hoJGNDSl9qfTM/Qkp+PTRZJEB1d052QHJJZXJLcyRzbyFzUUBtU2g7aXE7Z3BGMi1DZz89CitZYzJxbmU1VGpXPm0pTHk1RkdMVU1JKVpec1BkJUIzSjYxYEs3YUxFPCMzS21rRilMT2h5IyF2PE9QMnd7NlplKEgjZXQ0ZnJncVRZdnZgCisxPChUZnUjPWlRJSUheG4kbEFjUVNEK1BVIypLWW0wRmhuZUM3JG5mSDtnYUpOWihBWkhAOzBsMVVkZmVpZ0ZsTmpMfi1mM2JGbDZpVk5qCittT0JgTGdveElTQ0lLQW5NR3RtMns0bVBFWn5lSEdoV248VCt2VVh7ez9Oc01CQV5sM1gjbEB7IzMtZCtNfXlEdlc9c2Q7UHduYmRzQ1NZCitKO2ZobUE7ZFNOSlZBdVlsPjEmT0hxeDNieEgqa30he29CNW9rTyZ2TW0jOWVQTjxjZExEMmt2e1paWlcqVWo7RnRLWTRFe1lXQmpfZzdUCitVVStvWmNvYz4oeUBYdEJeVkBganJjbGY4b1JzQiExfE5udkspLXMqPS16QDx5SEdnO2QpUkYqfm5tXlkme0h1fEd8TWMmVj0qTTRjYGc0CitBQl9QYit9V3g4dj4tem1Le2JrfXRlY1pzcnNJZ2I/PDYraXlPKz4kNDReWDR5allUPUBQS21FK0omcHAzKiRxTyRvVUd+IVE2KSYkYHdSCisrN2Z1ZGFSVl4qNyNwPitOXmV6NUN3Iz5vO3VOXnVkUThaUWlvPTw4N3M3K2pzMlR3Ul9McmVmdkstQGFlJXJobVUtQV53e1RMZTBsdDw2CitETG83e21yK2gmeiR9NC0xK1ordSROemB4Y0s4d21ud2gkPD9AeFEqUkVJbmByRDFfLSowbH07X0J3XihXdFIhbGN2cEB3YGwzKi1SaUVwCitUaTxoVTg9dG9BP3JWU2wxMDdUa2NJQFFheGw3az40P1hQSHkrX1lwWVg1KmhPXntabjQ+bE0+TGNfdk1EZFdiY24kc3BzT3JKRDRCUXE7CitJWEcoNksjWDVEYF5janppOTVzNE9eNE55YHwyMT5nP0VMPn1gdjBmJXxCdnx9KEt8OUt4PS1KSkZ8cXlRO3MqPiY3JkpJPiRrMVUpISQmCisrS0B4TmpKfDBucUdMQnBuSWEqS0ZCKzErTFBiNTM/I25kflhzN2RZOVVhPFZVVXZNK003fEoldl93MzhqekNAYzAyUElqISRIPDhqNGQtCit3NDRxZHg8VVRyaFVZNkR3dG1NdnV+OGNaTXwlPX0rWnduSVpvJTtvZUtRX21XKjBqZmRpZTg2bGZkViNYbkA1bihvZ1g4P191cnEqI0FECis2ZXhVRXtTQzMkWkg5VFRaOTs0VGc5OWNQcHBgfiV5OEgtJEMye1I1dnghYzAhTkdtJDFeUERfYVhtclZvanhIZD5BV004ZnNpNWQ9KHJPCit5Y0IjQzlGKUEzZTVISjVJUHpCVlJxfEJ3S3tfZDdjQUcyYUpgeFVuMWh6SHJTbXs4QkpTVnAjRns7bEpzfnc4IzVETWt8OXh2dUJIRXxMCitKWnFEeTFmKSopMUJfQWJpQnxSa19CfGdyaUctUEhQQGBQfXQoJGlmUFBtYzxnOFQ3RkRfK0Z7MHk9STZeNX4kY0MyJV5tNiY2KHJPcUhxCitVZlBqJVBfajw7bVBuclAwa0QyQEA8M0QhSWRfUXF3MUctOW47cTk3eDNhPz9jX3JzUiRuPCEydDNZZlpfTyFsWXlnRTlIYXFrdUs2aVQxCitXP0pQYG52UDFNdnxUYWFkeEMjaFJPJUJHVHhTbj1XaWFDUiVneldWYS05WUw7MWs4RGY9ZUAhNDZ6QTwtKEVESGc7PEpjTEkkZ24+V25ZCitnWDIjbGhVKE52IV45bVFZYDcmIWhMOS1JZHxaPU4jXm1FbjU/d3krKVV3LU1FUV9rVHVQb0xWIVMxTnN5UUokJENATURxPDFNOTdFZFhyCitPZmRKKG99Uj5wUXBzUi15NihEa0h6Q1FHNEw+QmtYSVYyYyRsM2AxKUZYUXt3Pz9keXRHOWJ9YmhIUGFBVGB4ajFYU3IwaEJ4K1BJPC0wCit9cCluMkxSSERpNzk2TkM9SiZhQXluTkUpPGc8eUBEcnphVm5edyhIdlJ+aSkqSllGIVRmSEg3PHl4e1QyM1ItKTNQITdlIyNuYj8qKWRkCitMIWIxOEpVdUtJK2UwKlgoV0JxVSZDb1ReKkYreWFXbEQ0VTVCQ3doN3xvfVFDNEVocCFlXiM3fjdrdzU2aGc7cm55MHJVcD0/NyZJfDg1CitxenJIR19uK3JkKT1rWFBVRkVtSSN1bzZpWjVtRG1waGVKNkR5U3JIVl9qV3tzYXsjPUxReVJOcXQ1R3Q4K2ZPU1VSSSRERX15UGRBVVpUCisyalZrSzxJfk4hMi1XRER0SnsmbU1TSE8wO04pVClCK05Tbz0jek0lXypzPndBfTFXM041MHVQN2d7dmlfSVFLY3t7e1JITnxTcW9zcGgzCitMNnMmbHpye2IjWV9UfGJ2cGg+R3BgTDJaJHcoaEJnOzBFaTl9IXg9Qzs2RmtiTDtvMyFGeE8qWlpXSEpxPykzIzx7fDVAbyU2YW5AbihZCitBTGFhJSpzSyNmZm5wTjNwTkAmZEd2NmR5Wl8waUxGczZ0NkdCI3UkfCUqKyhCNSFhOWBrPHFtJEB3aDgmY0B4ZCFRcGhuUUo8SHJ2N0I4CituWCUoPEVBU3QpYE1MP1IqRVZ+UkRLNUc2aTI2O25lQTRSTU10I2hhRkhuRnY8cFN5RlBIb2JNcEg4YUBjQldkQ35UUmRBTU0le2lTflZOCis9YjVqbjRpdStsTFA2KD9mcjJ4P01ZVVJpKCg3Z1pzNW90X1AyPDR8WE5HR0JVRUtpTCZmOzMlbCF5KD1aUn1EYzlUeSk9WURqQn5SN09KCitlNnVxZFlhMGRuUFp2cChDemFYWEkzZGZtamF5fSM3Kz9xIUd1aDZXO1hSQjlhKDRVTmp1V2BybjZYS3RvPCVNe24lZkJ1dTFJakh6cUwjCis4PU0lR18tYzwkdjhMen5hWmhWako9JGk/blh7Tk1NSCl0LWtIe019ajAkd2REQyRTaFM+JW4lT1Y3OzdGZWhpbz9afkxYPF92UjZvX1NRCis/cClyWlZPS0QreD1BQCM5Uz1mdVFiXmVUMVBOKkxqZTlyXihtfjFOVlUtXzc3YElweDUtKiV0cncoLVpQWnR1VVo8TCYocWItS08oSkhFCitDMz1Re2J7KXkyZlJiZ0F1c3hLOH01LUVXYCVjWShHMmszMEU/WWZMT3NiOT9ARCpFU3A8PTJATXxWZ0szNVVOX3c4OzJPVm1QV0hPXjRoCitkO0V6Wjs8QCktdnEme0Q+WktkO2NFPypZLWI5JEE4OFUkelA7MyNNRUZxci0kQT9wST03YktBJHI0P2FTP18/QSFacSRpMDJ+UGZXZU5lCitea2xzQG8mQjhfVzIpSlJvajFXOXNmbVpZV1ZvKz5XMjlrQFQhVH4mcEx2IzxKZm1tTzJmQnZIRXpGPG8yaVZ8YH4wKWQ8P3E/JigkPlghCiszKDZCTkcqKnc0eHxCSFRRSWdtY19lOFZ2N0B4KmsoenVfRWJIVD11eGIkKGtuN2djSGt6eVJBT2M8eXpNT3hPfVQ8WWtRXm5aMHZOPWRpCiskJDw5cnJqeTF6OXIhO3s9V3w/eS1jNFQlfFVVcjUjKHZxN0lPJnVmNnF3Wng5ZDNvcyp2Zzh6b1dZLXxUekN7aXxLYXokNmokSmdaVUNBCit7KkpKcChEP25DMl8wViRiODIzekFjMiYyWSZEVmc5RlpfVGl6X251KWY1Nk1uU1BjPXRRcSo+T3BHRFZKWEcjWEF0K0tIQ2JlIzlTKVFDCisoZi1gSG1QTVFfSkJoJnpUfXBRKiNBMkEjUVFtRFhCNy1EMXsjMnJ4VGV7TzFhRj1xVTIkd1N4JFR+aV9GTipRe01WVjQ7fk81cjtPQzJUCitAbyQxXmRDYyVDSDlMO2liI2tOOXpIZCtPWXo4bUtqeEtTUDxERDI0WTFmRCpNOD1kOUlAJCNlSW80QTJBXzBed3A9UWlBdjFDaV5ZSj47Cis1VyRYJEBVPG1edkdHeiY4ZUNhKDtFfXtpLUllaVVPfVFMKEFEVDUkQWU5PERlTFBLPkRKflRkUC0xSnFtND8wRFYpQ05RPEUjQFZtfiNfCit8dHFfYyNTVHZ9SyV1VGx0KD1ybU5kO343UlpnSis2c3BlYlV6aktZckJCenYkXmhmSkBNcjVUWD1BPnN1Vz9MIVUzelYpaXd8dnxPVFFZCitgYihMZ1lqOVUpRjttQFQmPzlgMFBtI0o2NFVMbWEhTl9RM0FnT3w9KHFqKHR8VUBnQHI1NUBBUVZRSDtzdilSLSlxUWUrRDAmalZrYTxaCitHOHhvZjxMYEdvfjF0ajhyKHNyb3ZXWWNsSm1rT2hxa1ZwTmYpYEIlMTFgK2hCPy1KWGtqSmtmY1JvMGxTUGA7MFpaa1k0RkZKIVYtNCh0Cit1PjQhSjRMaHkoT0ZafGJGO0k2ZkZ3KVE2dHdiQ0QlRnJ8TUA/ZlZNRDQ5N0lEMXY5c3xuXkBBIUokT0NCIUp9cjsrb0peem9Cck92YFI8CitWfjhPJGdnbm0zdnpSazZrJlZhYHcyK094PWJvNWhIc2BSWDxobCl5QiRne3VOcjMzR2lMZ2dSQ05RUSREZyZlQVZRKSRqTk0pOXVEcTAkCit2QmVQPnRPKDFFYUswJkd7UWt8eUlaI3VtYm48JkgrO0d0OHk7WkV0dl8tNXohRj1ITGF0Vm5pfU9QPnNELWJBMyorblNhfVZgIz1jNlMpCittR09HMV4xKVN8T2UyY302UzgwJVdJUWlFe1IlREJadiN1SXZpck5tS1JOZktuN2xJcmhMfDlTcEBATCskJGZiVUo0LSkqfXMzaCQqWUJiCitaYEpua0BQOHUwTzhKdDxKVWxVSD5qYnw5U3BUSmRoYFJUZCZCRG5gfWE3Z3VPVnBhdWVxZjtCWjZlYjh1YExeZntpZyorZSMqJTZgcTl7CitPKjxHIXR8MlVeX0piUnxLfjBsO1FwWk85d2ZnPCRuVE56ZHg5S2l1PFZ7Rm5ATXV8QmptZ0BXY04oUSNPP15fUUx0d3lTSGB1RzlLSnh0CitkNSZ5OENpQHI0e3pZOyt4R1dlZSslTClSRlUkQz5taCpkNmNIYm85Y1RvMktRdWc8MEViJjYmblprMnRsbEA4ZWhXITYqXz1mIWRDbSR8Cis5dClgalNveHVQMD1hMlNGeFlse3g8VlQ2MEBUckxuSzRjUG5EYDxNVm9iSyNWY3w2X0xgTXF2YDUtRlNnais8QiVmciVpNUt1QDN7UCFuCitfYFAhYWVMRyQmdkxSYlFJZU1GS20pSWZCeSFyd0VQezkzd2JQYURaU2ghQV5vd2YtTUI9M0R5IzxBWHFHaVVxfj5RcG4kK2FrVT1uKFU8CitnNDFLXiVkSnBnVnp6cG94MnBqUWh+TEgtUlNzQmRHZXEjM344dzFqaDtYNV9+fGducVZQODBZTF5xRCMwaiVBcH4mKlEzTjNiOGlNV3d6Cis2OStGU2AjIVVzUSNTTkJzZktJXztWQHpQQkszclNXRUI+S0BtWD8hNjw/dTFhU208MCZqeHFWPHQmSHtfYFRPX2JJKCpgZGk7ISpzWndZCisreUxjKW9FfEA3ViNBTFRrMTRMWSVFYlFiQU1YWXEkelJwcl5XVDhuZjVYJFR3byZxTFNYPW8maX0mQzh7OWwmPWBUMVdpM2I+eCQjbnMoCismSFQ4VUJBRGkpKnRhQGd6ZEBHcVJ1YVYzLSVUSHNBSCM1eUg1YXdENlUkKk1SRHBkcE4mYmNYPkNmVkZAaHY2ZStiMGRYNndEUjFfY0leCitDMGBedTNHciQ3NTtWSC1wUD5PbSpRb0tVZ2s2TyZFXisjM0dxQG8hSDUlOSNJYkRkdXROSk5GKjFTKklVRGVaQk0zUS0lYTtZWklEOXsyCit9RGEma3piZmd4KHRoclJ7YysoXnVNZDFyTnY1LT1rM2p0b3JBPCVfSHJ9YX0pRWVaWnNXZiQ7NGN4MENUUm4oKTdlQlR3fXJpNzM3WmIqCithdWBILWVFR35aem1KO0d6d0lKIXRmeXpiMX02YC1FPl5VUEtKSzx4Rmh8c158PDRpPyRvaDZ5VSVVRmVRXldzWWE0TD9wYUoqMjRZKGd+Cit6fTtTdEpIfiFoPG5HemdoMXJSRD1qNj9obUEpPHZoY1lTZUszIWJjVEY7dkkodzs3Q3FEUmVwSHgyb0J1NmFLXmc1SkdyLWx0RVpAYXtHCis1cj9YdGRLMHhLWVUkelQtIzM/QDx1Jk4/MzJgclR6bilOP0RkLWh+fmB9U28/Tmw3ZHtKKUsjdFI7aSMwM2gyTHBFbmQ4c3o1NDJfPzg2CitUfldUbUMwPzhgNXxXSCljI1dPN3c0NVB8NmhDdUdxP15yLV57JjYoR3BZMTBtZypGKmVMYndUcyRZMTN4VE0xVntESz1tUGg7NXZFbHA/Cis2UHV4a1BkNGVjQ2o8K1ljUSRhNnI2YyVFM0o4PU10fEA2YUxkP1IoZjhmJGI3Zl9LSkFjYTcyPkMqUlpIKnIyIUcmRVRIMnZLQF9WKTlrCisyOXtTQGxOU2lsUnE4YGxQeyQmeT1Qbig7U1VAKnZ8RG54RjRGJU5gQWhHVktqKmVYUF4hV1dfKkViSl47PiRvMjdpSjdXN1NVe3M2S0VGCitZMmZ8bDs4OElZcGdNIW5yKzFHbmAmdko9XnVRcV5BcjFXVEpwUl80eUR2I3xRayo1YGBGbjlkdEdFTSlEOHhMbCVkYDVtN3lSezcwUCRZCisrPjdtc2YtI2ozfjA/N1NoTDxwfjw9d2Mwa0BJU2F9JGJxV3JManxRR3syfFZOQUcpb29UNmlOb0B3YT93NiZLIXV8NDcwdmNfWHx5WFdfCitXeUV6JWRiJCh3OUY9Z049ZCY4ajw7PUFVKmUycXpLZi1+P18yRShKXyNYY188KUloPUY2QENHMkNmRU8/cTB5bCFqMVlRSWtJT049MG1pCiswZjliQiN2QjteWDY0VnF6a0Red0NGYSRAcyNCMykkPGh6c31hTFVvVHwqaSFaKWw9ZyomYSRheE55VGg+dDx4XjdjcmwqR1Nzez4zK0BaCitEYVl7RV5TTWpvWHpzN2h8OyFrcDEtWGtuSXZJeXshZHF2SDxCZylyU2xePnptWWE7LX0jfEtoaSolWSk0Vn11XjVvYmwxM0JOMiV4OU4kCistOE9QKUdSeDx5d3J2PVNeZ2RqR156JTlZQCVyXzNPaTF5KzdAT1VwMU5VeStmaXBLNSpsaj13KF52KkNpQkk1Pk4kfDxEVko2WWp4cFFhCitjPWpYQE5ZQmRXRDRQX0EjNWlCTXFNKH1SWHBoMFpkdXdpVihoIUplYD0rU0k7WTlCVVghVVEmSChqPUNkbmFPZjxiNEJ8eFl0fTZHdk5mCitFJkBufFN9ZjN9ZW9QS2FqbkNQJVZvdkxvMXd4aEElR2opQT5aNVdgLVdHbWRScW9XcGlNKXQ/PCtISk5xJG42dktOSXJIRG1TQD0lUWc3CiskTTNhKihyOHBLPXk/akk7aEhJMi1nV1hMJHJlJnZHe00yaFBUeT00eytXJmdSVVMhJTlqQCpyRyo/Kno/YW4mejNBJSFqPip3JTJ1cGMhCitQY3g8QmclSyh4Xi07Qmg3Rj1FK3A9V35KR3heWGQrY1k8SGRKITlZdTdIZVp7SSVsPjhHRXZCUygmflc1PHJNNkRMbHZ1ZlA3OVR7P2Y5Cis5c1B4fkdpU35TeGhPOSRYSUN5PVZCaGA5UyFIRDx5TUZ6O2tRRj94eXtMYWtWNXxgZGpwc3RmbnYmYyFxc3JjckR6SioqI1hgQTE4XzVUCis7OEdIJmAlb25pQHs5U2c4QTVxIzwpfCVwWHIxKXh6QTQ+NyNERTxoRktZYCo7PWRJWTI2bmBuamYxQmMkUXZBOy17eUNAa1RgMGJaO3kqCisoMUVmandOI2VhP0JaPlJXMkRFQEpae3wmfGVqXmRZN3s3ViU3bnA2QjxVMSs9KUw5JE42JjRtYG0pLTlraD14ZnhjP1Z3OGRTdTRobWAhCitvTGFBalojNFZmP30oI3cqYHR7RitueikpYz1aI2FDMU9GcDN7ZkBoUHAhYmMjUU47eSszOG1yP3c4RDFJNW18QlR8RmNaeUdnanw4ZzlJCitXKlk3ZU1zdz9RaGFLRURycGVJUmQrRVNNKTV+Y3s2e0pOXkF2dzAjWHNnMHBTNUhPdFBSIUsyaVpkQU43WXUjNHcyK252S1lvJko7Snp1Cis0JiNGIVhNRDwxI3V2VEVfYDc9PEtrfV9wZD08c2xRdjVpSUthUyMwcn16c2Z7JVZUPEtFP2wtO19zcE9sO0AmVDYjcVFNdVhNIWtQQVQtCitLNncpYiRDbiR3QWwpX0YqO1M4bHYqXjBBWXs1aVdhaF9oPWBJSj5AeHZ0UXJrPzhYdTloPF9pJj8/TGd5RGdJIUpLYzM9R3JUQjl4e3R9CitBKzNkTFZmQHdaZF9MbHBsTSNqa0xSPzxzVE85KlRiLSNlYjBFY2NKKipEU2pCbUE1UVY3UTJjb217fXFiQWpwQ25oaWVMTGxtTDZ4UCRqCitJSWl5KDVIdmlOIXRLdCtReyhqJFFnWGQ/Unx0Iz43TkwjWVRwUU0/QHZ9PSs/RHNYV3pia0oxSHFkI2dJNHMkQi1vfEQldE5MMW5BcFdDCitIdSQ1TUBHa25RfVdTfjUjaFpmbERpezc9Z3U3O2w+S0FrTyVic1hreGBLcEE5KGZiPyZsWWxUIVVuNmU1fl5IeHpERmZhP2hTcDNjZWo1CitSQ1ZmJF8+X0taWSlwNzteOEkoV14meCk+JmBsMXxDN0klZk08OC0hWjFSMH4tYCFVNzdkWk5NUjF1T2ZqYFdsN1g/XiRJe1g8MG5LTX4rCitUNzItIW0hOFpjX3Q/JDBTemw+VmshXm5aK0N4PUpHNH5VSjhqIWtaZDFsc3p2WD4pSiQ9RlF2M0FxVikhaS0qIzBTMVVqPSpafXs/PT1oCitrfSohYng5NHomVzFmN2dkYWBufV8kVnghfXU7YD08JT9qQVYrezIlSnBCYVRWd01+VztJdHxmO2NmWHFMVXpQflleU1I1WjY4IXcwdUlWCitrKW17Rjlebk8rWD0qKHJETUcmKXMrNU8jdk1LJD1YS0FyZTR2TSEydDRxcGlkdXhMVkpnUXE/ZD02ek5JPWtIWSVSRCteMiZlO3tIQ2VjCishVjF3QV9DbUpKaztVSUB5WVFxKEs0M3RpZ2QrOVlJO1paYSg4SnVLPXVIeVZ4bDQoez5qMDt5cWgjfmFjUnwkRmEoUDZ2RWR8MEhVMUkwCitBYSE2OUhfeTliJFRQQXgkK0FXaDhDbTA+b1pMSE5wc3s2UjQ9cV9FbGFZRSVSODlXTGtxOSEtKnV1NTMzSTM3Y0IoQVpuI3ZsQTQwVyZwCitnKXBCNVJXUEdAaFdRe1RCXnJmZXRjZE92fDI7eVVtbFErX2o2NWl5bDN5ZF96KWJeSS1odGlLQ0w1enRHR1N1O1FOfXBJMDZKZTwxJjA9CitkbUBwWmc4RlVfeT1EaE5NSzFCdWVWWEZRaSo1N2F4QkRgNFN1IyZmcUhyenFwTyFHaX5qQHlLaipVJnErdikjK2h1WmhBQ1pvRXlwM0tOCitpaV95KWN7VV9SXlN3K1BRdlRheUlPJkctakFpPTV4PEkkNmtFI01ZZTMmR1dQUHpGU0ZJRlNCdFUyYHxyT20jKUJWeV5wT31WZHx2dTBkCit5JlEpPnU5WDdiTFVRV0BaZG8pSGFLX29UWHkjQlMkNksrSWFYMG8hN2c2QiRiUnx4a3tCQ1l5P1R9WHtgPkUyKFJJJD1yU35IQG9aOHU1Cis0XmxeYHFtR1gxPC0rbVEoYW9UYT9rVmMlVVNYfkhkZ2prUldgcD0lSGlhSyRpfSkkX0U8YUVHY2NvSyY+SlNyWE14UjVTP1pXTzlVclheCisjNmhEXllrRUhsaERFPD1eZTtMSnBrSypzNl8lOzM5S2pWfnQjd3FfPiQwX2FQSGxTVSpjNERjdnQ8V21BXlhjNUhTMSs4NStEX0gzb2xtCis8NUFNVzdZdmdIRkxYS2chbj4pZzMoPVUlUDZ5Jmheb0A5aUchKVVfKnhaUk9wZW10UVlHKjFxR3otRm5eTXZ7eCQlKDZVOH4yaWlaX3htCismTWhPfWpsSEpFJkNNOWA1RG8qfU5PWWRGWlp8RSF6M0NkQUxfSVB0VEBKSlVwNXw8bUpgUXktfll8P3tEVlc2YmArLUpLV1JRckUka3pjCis8eWlGZiVOYjdhbE08fm5zc1gwcT1fSFp1TG5FZD1obUtsRGEhcnlQV2soX1p7NCslVSQwKCV4RDx9XmY3czhAKlUjQGtLUzV1NmRaMDZTCitASWgmMUleVD0yNUc9eUUkPFVBQCYmNFNXIWVnVUUyV2ZvPipBYX5zS34lU0dYWWIlcXdzYlVkMHVNUll8Qm1PY3M0Oztyd291JkRwK2c1CitTNkBYOVR4LUBDaGdqeURIZkdjckk5MVRNKWgxaUNuYVF5RmorfmpuZHw0fjVzMGJrS1FMaXw8Qm1vSERFZXJOTmdPUDlYPz44R0U1cHVYCitxcWszYXIrcDNIQnJUKUE/ST1CNExPb2pVZElvO2BiUEUtbyY5QXQ1MlhXU1ZeQmJnKDRfZUUyaWBMc19GXnpOPEBARX1oNSh1VWcoPVQlCitWQzZNfX0rWkFeVXdfZSk7ODdHPl8pbndyJTQte098Kih7Ki1fNSNUUXRoO0BeSnpFdk5aNmhkPEg0c2h8RFlabnV7Y3QhRjtfPzZhNTMlCitGNlA0X3dGNllxO2tSKm9IazZfQV9IN2R1MSNmdFVEKjxadHZCfjBZLVZPPVV7ekpzWnckQGdvI1dxQF88ZX0jcGF5Ql5iaDw5VWtNSSlzCitAODc/bGZCNH50b2JjbHhlREh6NWB+M095e1FLe309WjZtOz0wfWJrNSNiUHIjdDNqZk17JDxGYHxpODVIZmBFOGktdjVgZ0B1SSFiOD5RCitgN0EjbmhLO3ZyUWhWNE9xWlE4VTZFR2EyQEJwQElGeXpfflFpdDJgUnwxQUVPRkpJO35tUlohUFE+UCV9O2VyYm5GN1ZSUVFVeys4OVhpCitDbmBzeW96Q3pYJUQ5cm58d1B4RiV9UGx8V1lxeVVZMWdoP2BZPD4jTSZ0fEdhK0wyMjU1YHxVVVclUCtyTntgflhMS202e3lANGx0SGVuCittSzxeSiVKWUw0P0JzI1FuNFEofDhKYklSTi04MDImbFBuSjU3SzYqPzVWMChFSW9mTip2SW1BTTApLTJzMEV7fmJHYSUlZ0piTkhTM2I4CituJG9XRjdTdFpvSCVocGwpOyVaWFQmPmpNNGd+SUVYPD12anx4RURLellES3h1TmJMJkxeTElCSmY4VVF2SyZCaG5xS1ZhXzVLTVo7KlI2Cit7SFlFSHsyQmJPVUF4QXE4eHIhYipYejRManNke2AoQCNJO24+VE9mUk9YejwlJVRwMXwwc2ByYH1QUns/dEF5ezY/TnRLQCNEZXs4cWZ3CituLWNWMGFNITs/M1BuP0BpYTJ8ZTtiSW1AXmQrb3dLcyt7Kk08JFVtZCZSOyp6YFBGT0pqIzZEfHw3WTwzX35WWmtgVEZfPihITVJLd1U7CitPbEs/Q3B3JiVzeUZnUiVoYnUlcW4xYFF7cXx1IUhCfEh9SGlWZkVNNWx7LWNhblVnU0xMMyhpZlNhYyhAc3gkWGV4ZnFSTERvdCFeUkc8Cis0YUBkQj19OVV2UEBePmd3dkhlK0dZUT5tMzA2NjtSNFRmeGw4dVAhQXc0TiNBaFpfYy1UfnBBLUs8MUNAZEg2VjN5T2hPOTMremdFcTgrCis3WnN4QTNJYk5jWkMxLT4oP1I2Xjh5MHtKQ1pDRWZkKHB2VFdBMztrUiN3JkEwNk8zYyNibEgrKDc9KD8kVnIxQVQqSGg/fClMRnE0elApCishdzZSYyhHV3kobFhHMGNLbTkxQHpGVlheYWl7b0dwVFUqKEFNI0tBNWVMKlE2R2hJIVNDaj9oM2JMV2xmalNPM2dXUktEQz9ASSFwMlJiCitwNDxIKDFOJmZxTURiV3ltbkRnTElCXnVPSjdySmxmeXhYPXZrM1k0PWkjbTdpOTdOQD8wUUMlUU9NUEBlKSpGJjlARWB1QDdaNEJhalBvCis8PjlNd19LQEhPVyNMXzsqdXU8bDJHQyhxOVdGRW9WenVmUDd2c2hfQ0BwZ3txSmp7M0BeSzAwcFB4V1NLbnhRd3J2OE92WG82MyhCP0hWCitHc2lgSlZIay0qRzxaSDBTWjQ7VlpkNWxneHhEXj85RkVwVjIwRGBCPHZZSis/QDducClmZzRkR0FhSldyJDFiZm9zWTI+MyV6PmUyelpoCitne2RDTCFrdy00bXRZdno8VTFidj1GfF44cD5iRjNsbFdwOEN9bCMyJF9iMlojaj02b2NldmBSRyZlRVQlVVdRT2A8bG5HcXAoJTUpQjxiCitrbEkjeT1HMkZPJEJyRXhAPXR2e2B1U1ZSMU45Z0VmbD9OejR8ckUtMFJHaE9AelVwMGA1UUFyXyQkKndgQVZXOzhQUnx6aDEkPGlNOGp+Cit4VzVgKkYyQmtpTzJCa2l1UDRlR0VlQlooT0whZzI5dWxrVmN8Nlk7SSFUUnYwX0ZsKzgpd0tsfTUyNE59YlNTaWQySntDRiRya1dPSkdvCismXzFiX1FxTSpjZHt1IWQtTyomXlllY1p1X3s2LTB4Yl5RN31xZU1YeFVkJE9pSmc5ZkVPZzlmRU9xZlAzelN0Tjc0RjgtKXo9d0UxQDxwCis5djJLd1VjT3QwTXw2Y3NBdCteWT47Tl99aDtmYERAZE9oTis/YVlVS3N+PCE9JVYkd2I0KkFCWUMwYFchM1E9Wks/SG8yMzYjPll0VDFzCitWbVhZWD4rfnBsRTl6Rl93I34rZjshUnxyM208PVU0I2psMFN5QFFENzMmMGVYVE1zZ0NGYF5qMlpCSlIxbk5KJkpPMTk1KUUkPTRRcSpwCitFbGFaYmx9cUohKVl6MDBvdGFjN2RaaitnVn5ubUoqTjtFaTNxfTQ3MjE2SD1nI3hJcnojRiYkY1pDK1R7Yj10b3VSKihzejZ5T0Nve3R+CitYXkFDeEo0WUxoPS1BcDVZbFczQDBwUCF7Ulg7RWVicEV0UVRwUExAWjNueFZLe00wQ0p2cCZNVmBTUCUhIUZpMClReXliOWdnPj9TTGpECitQIzE7ODc0ITMwamc4fSRLckRga1E8LWckaEN7dWVZdHsmJm1gPDZEVl80flR+S3Z4bysmMyNpWWFWV212TjV9QWdEcGtZI1B7PWBKMEF1CitXb31QS18yYzs2YTtZYTJqSS0/VyRrPyhQcDN6ISNEITRjSXtnSiN2NTtOakVmWC1FfGM1VWxpej47b2dhUUZnX2psVF8/OV9EMUojQjFpCitIM0xOYGl3VHxXb3NCO21LKCt3PVk7Y1R2UH1HYGowa1FjOFhoTWE5d1FvTjVlPDBpanhvakB0LXQqTnt2LT1Se3o8TmpLK0VIZ0toRUVMCiteRyFqfG96UzdzZzFHaTBAQUtfTkkkbGFOWSRoNStlSV4+dkNNb3JLMStfXl9iSG4tYklWUyF6KFhmRE1jIz4hK0NPTWo4N1BwNnJIWXZoCitzalBaVSZ7cH47U1NMRU1sRzxFP0Z6O0V1e3hlZ2xZKHM0VWxlKmU5aXBEQkJSQDB1Nk13LXhJN1gxUEFVPVR4NnAlUVU8dyk5YFBTcVhtCis7QWN1QmZNMTBGSFBwI0N8SVZBJjYlfE5Wc0JgbXt4dlF+JGVZKDRheEZTeUBeOGZoKzFHPmNIJlR2anEqI143VGgkMHV5enI/aXtQVz1nCitYYU1KSHtCTyYtM05fVDw1diVfeV9vLT9FQ2ZXaGpRU3J6NG4/SWR0b2U3UWN9WEZQTXp3WTtkWFN+dTF4VHRPPEYodTQoYzx9UCl8RzQoCis5OyV0VERXanc4TVUzZll1QnprSVhSaUhTK2o8dFUoVTxSO30obUImem08LSlhJFJteyN2djw3ekA9JDMtQ3RZZlZLKV9BJmZeY0FIYWs5CitlQ1FQYHVsfGtaOD5eLXw+YSNNJlNSJld3ZztXPioyPiZmeHdzX0g0WE5aRC1qfitkPVg9IU8kc2l+PEkpUSphQlNoO2N+QTJASXpQZlNlCitZXlhKZCEmcHIxWGY5OUVJMVV7SkcxN0ZhOXo1eEElTEk+dEJwYUpiRTxQZCEhXjRNdk07LTk/PXtJQnUtdEVia0NGe1ZtbTRBZl98TmlSCislfjJse19Ge3xYNVNEVCRBZHA5QT9KU3prbyt7LTZ5VEhvUXI3bjNFciRLN0JmO0k+R1ZZemtoISpNJWNBJG15aWVHNHFRPTJpZC1xPjBzCiswXyZuQ0Q8emhxNkZASyVFeCNuYWFWcktFR0N7SnxFYiQ5T0oraj8/aVpsZ00qKTB2U2YpXjJTTUkpVUZIUF4xJEB9QlZaMmtQUFcrKlY5CiteeTIlN1B0VHApRDMzPDRHUHF5MXB0eysobmowKj45VFFyT1I8VWlYSzlScXtgcmtyayRsdEI2WnB3Ykh1N3MldU82bEh6VEA/VyNmdW03CitxTjFZOWl4d143azNJSS0pa2h3QWdsQS1BMilAKDJRcGdmJEspbkUrenp1Wk5yM0dzYz0hWVRxPSVaMHJ1cFdWVkItfTdZTGZMX3FkTEFQCitHKktmZTFLZkNeZSRXKFYlPG1CWGhgPiVpZj5uODlfTj1nIWRJPDMmfkBXVClEWTE1e09hekxNPHRuRGF0MEFKdip0b2RTWTAyQjJBYnAtCitYSFpoYzNlP0w3Q3V7RihqOV4qN1dsJFVuKV8lWDgrO0lmaS1+OHltfUsmWVVVQTBXPCpyLW8xUEM7bHFhdWNhI0JXUHlqUzJeSXB1d0Z1CitzUHwxNWNRY0E8KlY1VE5xT3pKaGRoTl9WeEFFdTN4fFlEYTt9TTNqVUJ5MEF2YTQmMlIlPVNhWV5vdClsKSRNbi1heiQ7NW0xPj96NnR7Cispa2hUanswT3ZzVCt6M0lZTjU/eGs3dTR2UXlTSzJxJm85P29AdnZARiUrR1h8PnZwI0tSKWc9ZER8fTNMM3k0dFElN081SHpIdXIwfUA3CitJM1ppQlNGYVpNZ1YqM1c/NyRvSzBQUFJsRipiJCNWNjJVTGZJNUlXZnBwT1o2WWUpRG9neUN9OX18YFAlQUdyTHh7bEVLR2A+XihrKzFYCitrTjh1e35eRmBvOFd5QCk3Zm5DTC1LMlVqY2t+YmooPSVjYDZDNjJQNWg7fGVfTWY/QldkKytoTC0rbyo0ZiR6TllqKShfZDZRQXRWd3ZECitEZmF3ZyV2byFvRX1JckpXUHM9cEVBSDtqTUt7IUBLaWZPcGg0bjd7PylqWEZ6bUQjajktblZGKChyTWZRcUg/JWQ3WiQlREs0XlNeckNYCitmQDkwb3I4ZUBldTR0N2lFTzxLen5tMzspQCF6bjt2KEZ5OTBrYFMjXzNTWFcwZ0JwYklqRHk3MHNrUGpHNnBMX2g4UDA1PTU/Mmtpe25CCiswUHtFJSF2VE45ZHM+VXo4cV9lRF9tViZ8MTluZntGVSlQQHcqNSNERDdmPmJiI016Z1EpS29eOTBCZ2ByM05kXmFjSlg4KVhhdXkkPDlhCit2SUwlXjRsVHhKe3kpJDZUS0dINUtpWWA4ZVFhRz9VfUJBWilUbU1YYFJBViheNmt1YjFyUUZoMVg7JkJgVCpkcj10cFE9eVgtJX1VRXVGCitMfEUwY1gwcHQ+VzVhPnxXYF9YPSZ0d1ZxME9iMitvYXBPayohVjUxNWN+PEgkMENYI0JeQjZiYjlXdFpuNTIoJDIpeT5XQUtmJkZCempNCitGbkpjZS18K3VXezkwNHI5azViOzQ1IWg8JjgzKXc+MzMwZjR+WD8qKDFVekdQLUBDUG5iemw4aSN8NlFjYXppdm0xdmdXRGk/QCVeeUxwCitkbHFJZ31hTkJJcHZKZzkwdFVvJH5sQT9hWGNRY1Y3UWQ9MkV2UzZPOFhNez1xeCthc2JFeyUteT9waSpeQDBLeilWMDFBbyo1bEU+QTVCCitrbHIhPWstciZDbWljUHBhRmQrI3hIMzlBUDRBPSgwNzh6bX4oPm5DPGtTSTd2K0Y9d0UxWGooVD5yYUxnK1AhPUQhPHZmaj95VGM1PmQzCit5Z1JvPUBLQEY/ei1RMTFTdG1LVk5uLT4lbEA8RWNjN0hTT2N5SnVhejVtNjRKaDFRS1ojay1tN2Z8UTJaUThWSSl8bFQ2cEVtNkBXOHN5CitPTncmWSliZHlhTio8Xm97PX41P3NyK2Y9IXYtSSE0S1ZMU3ZXVio8dm5gfTBnTyl1SChBZS1UYG5KPTRNR0ZAUVN7JSVMYns9JFIoSiZrCis0WFY3RDE3ViFlLUdBSGxVY15GX1F2cWYmUTB1JVFRZWBPdyVgTz9gZj4qPSF5fTxOWVhWXlJXI1orcy1pTnpLMSE8RGJvSkJpdTAqd0lxCismeXtxK2BRY0Ztd3Q1SjIpUzhrbj1CbzV4Q3FBMmhpSHkhXjE7SWJHcz4ycj5vR08oVXxpcHdZVE5lRT91Tns9PigwPlNKSyNhNXstZko0CitUQz5ITTtkUWpuczgzaWxWTDNzZE9vQVBtVjR8bj1aQWpnSmJiNmZ8RUpzSmU/UFYxdDA+UFpYTU1WfCpGOyVBbSZnMSEyYCpFY2R6OU1FCitrQn41UXJxRE0rJmp0TW8qMkorRWB9cX5sNUMzdlV5NTBfR3J5cU9sdjZOPz9kMWVASnp9Tn0lMmxTNjwqVT1aRHQ7U2R1O31yUDhqJVRGCiszTXFkYVc1QT5aXyh9c1FyWXgyO3N7WmFteTFKRTJhaXs9WkhsPShnOHh5VHBlWHopYXReSStXTXs2SnMhJFBiZGY1NHk3VG1HdiFNKU9zCiskfWtxNDIjXldLTkxkbWd8T15qfC1vS2Z6eHU5NDZLPTdzelhYPDlfNWtgR1RaM08qfHs8ZVU8JEsmaGlOVDVjR144V1BWOy1DT2U9e3E0Cit7ZUhqZE89TkA1NGEoVis7JmooRW5eK2t9MX19dXBXI3hjX258cW08eThMNlokcUdrSDtsbDgrMUk3TjlkQGE+eDc8ZyMzdiVeVUx9OUA8CisyMnZUbmwpP0lCeGlsTUdNPEhydkd2PXRCZ0ktRylebzlyPSR0PXZ1aDFWUylzYVYmdGZQVWg0Pn41dXF1KkFrZU5naHBfe1VqU1QzNyFMCitUPTEtdV4lSlk2TzYjIyNFP3dZcmV5KXVKPFopT1hjP18zenJoJjNOKjNyfDZ7QXIkKXZTaTdVVmF8OVVaXiRgSkprWW1jTyU/aER0TzsqCis/S0lhZDBoOEtTMEplUDBASnRGRGFQJCFgOGJqfX4raVd4SXpXYWExUVBqYzQxMHRjKntmRVJlTXo3QWN9VGU3fG5kTTIhZ0xMUS1HZl5NCitUdyktVE4qRlRyejxyMylOe0pSWXZtZWI+I3V0fWVLKTRqQVFNX0MmYlFjUl5RI0hCR0ZJRUFvaFNhcCtmfG4tRHJLSXNhTHllTURZO28jCitaan1LPClDIW41Pzl2QnhVSytyTmRBY0cyaDRkOUNRTzBAQnJwI3RJfnp1NWMoPnR0RyokeFo3LU1nMyNiIyZrM2QmZ1YyKk98MEZRR1U0CitjKUQ/e0cpQz9gc2t4cyljI0xXXmFHZHxVflVKVnB6USVLdUdxaWdgPTNxX2RJR0ZadWFubztTM0FgUz0kVU0/by1BTCswZ3NTSiU2QW1PCitzcTN9dHpjTjJWSjthI2JTPG05RXk5MXk4Tk4wMyhgI1ZDJTAkcDdaO1ZAZylIOTlARncxM0ZvWDB4VGRed0xZaXBjfSQ/OUMjQDZZR3ZPCitiQEJsQis5PkVVfV50VyQ2VDJtK0xsU2UwNnRHRTVmNzw9Wi1uT1JSZkBrQSMwQFlHWEppRk9hfEY4ViZTfEJ3YW4xRzAjYG9wbnc+b2p0Cit+WEpvXlJKaTh9SV81I2k5NC03YkloRE9sJmdubDU7WmA0IWJnJDY5KF9VNkBpZkQyclctNV9zamdXQmsmMFUpMEU+ckE4aUtvSUx7QipXCiszUzdgbVJkOyEtZnF6NkNOSGUpP0p+U1BFU3dnUGRAcGluQk1ePnI3Y2p9TnxYPEhiSj4xXkFBRVQtfEZBR1o+OytLZGFwakNZe0ptIyRjCisqVkk+b0hzRTMyQDRBZ0c/YDJASyojTGF2JE15SThARVRUUmBiYnxDeVJDOTFxJjk0d0ZfbkwxRD9ZS3xDUE9zOzc4cCk4NHVFPWFHI05FCistRkUhZnFlcVhTUlBWKCs1UGQhTEdTRHMySUUjLVFJYTFLdyZ7fWlkdlFoZVJXcDU9VmtBMlUjfEc9TzRrR3lJOGFSSXRTdFEqSX4jRUE3CisqOzRvIyU2djIxMjJhMWtGa3BYMjVTJjt8b0Mjb3x0R0E1OEw9Z31BbUE5aUVUfDNgREc0Jlc4PmUmTks0NkwmKyRnRWppMEx4KnlkMUB2Citwd0ZGVylGO0pZRyske3JFTHFgdkFtO14pNjh0PnJYN3xCKj9iWjJaeUZMMFJLUjhXYEp3LSZvNnEzfVApRWRKV1ZNWEZVU1MwUE88ZTBUCis9S0I/S2F2PjtKSXp2d3hgJmc9X298fnBFcXdfJUY4ZG1KV1FFJHFudkBtZ2I1UzRwUHdIZUZrcGJkTzxESS1eZ3s+LXhsITUrPmBRI196Cis0dmU9PH4/X2l4NXl1UHFXdmk+RVMhWSZ1cUtaX0E4aWhGMyFfSm03Q0w2czN4dmYzOXc9K1A3JXhNb2Zeaj8xdT1HI2w/YTA2RzhrWH4jCisxcDFAZysrNUslVjZVcE91ODhzaXVSJUIzPGZCS0F6VmF2WTdXcEZ8WUhMTE1VbXFVSTgySF9ILXtzNGVFZlpfU1hkQUtTcjA1aj9WJXtRCit1PGZIVnprUntOb2pLTlgmNnVsJkhmUSYpTWYlVF9Obj5IIT8xcGpLQDQqS3Q4NEhXR1IrQ0clP3heP1J5ZT9KbTBOfD5+TUA+ZF54WXZUCitQRTBybCZUK1A0T3U+SkEwcnIoSjQmZGtnclpaKzR4KC1GM3VjNjRYNl48eGhPS3Q3O0hXPkpLfEs8VlcldHhxU0taXigkQWR5aGQlKlBpCit4ayFgUyZaWXlpJSooZEdwT1RGSHN1VnVmUDdmYUhsWnR0NSZVd1MrUWNwJDhXdiRtTUJsOTQ/e1VxbyZMZihLSjttMldvMX1yeStMVzVDCitpJU85ZFdnOSg8bj9XdWdDdzRtX0NiWnlgMS19T0JCQFBFZTF3SGVWK15OXlhPdWRId2spfF5ubG9YMWBXWCN0RzwjfXxqflYpNDxifUdYCislISE9R2YrO15yYktwKEMrfG10U0NEQDN6M0gxb0xEJktiOy1tO282JTloNTQ8Sz8qJT04dUBhVnk9TD5pa2p3MU85KElNU31gWEY/dlFgCit2YGBZWG5GfiskfWJGZGUkTk5IZCRqPTJ9K2V3Zz1SLWw/Wn5DJm4tc1F2cStaVFgtO3MhRmNpZ1hRemxYb1MldnQod1l2fDVpbjsxfDQ+Citmb2dPb2p9bjsoeEI8MUxLJEZ4SkNaNkp1Uz5Ie00pWUJHU058cWFXZGNAKjZRP2d3UylONEZleGU/fGhrV0VDPzB6TnNRZXdacFhYPGJFCitqRzZ6OU5zclojaUV9ZTBsTjM3c1lyR2Rxa2pETHM+I3o+VzsrXm0jcWB5eyNvTjRWe1E8OzBzTnpXTDl8PVkkemxKMSh3RXxTY1hrLVJhCitRZGo9QysxTWE9XzNDdE84RzxmKEFHbXZRST4tVDQ7RE57SkJfbVpYOFRKMS1lWX5tez9CRjhgfTYlRHleOG83bD12VGl7SU05VERmQEJJCitaZXpAYUA8NG0pajBeMU8lYm4jUDtnI31OXzlQKUtecG5VUntTb0V+TkVfYGtfNUp6SUB6RzhMWj0/ZldLdng4cyZ9VTtrMzJgeWNNJkdACisyPWd3TWpAeXVAZ1dgczhaYkNaR0gyOXorM1ckPVEjM3YwfCZEc09TeDZIWiluITNtdD00ZDw9N0dNdVo0bExLKHRuajZDQG9PcmBvWXdrCis+fm1SY3ZBd0J7ailSRWN4ZThwJEQ1OypfPDxFRj5pXyZ6dzBmVn1AI2FXPTIrQ1hoJjtxbUxZSGFMfn58SlVYUlQ1QHd3U34qPWQjQDxGCitoampEUzRTYXJ9fXFQV3V8MU1yPHdDQyFfMnZQPkRnSks5c1BUJUpCR0RycyMxa21hOzxzZCZYaFkkRWxgUl9HNHNzaHQtMHh6OFMqPjE8CitlSH5nREhuNVVMVD51aF5iR1JeYkRxUH4qKmpXWE5Kb2dvbld2Z0ZSMmxkVT9VPDRtbFFsSmF2Tl5ZLSU5PFdBOSM9KyRjMSVtaiRUTjJnCiszK2RIQjxlSlFUSEpwMSR1VWZjPF5sfWhRPzsqVnVldWdEUEJ0JTMtI1NHez5lN0oxKz1sJDx7TTw7eG0+WTBiU25mZmt1Mlh6OzxwVzM4CitPUD4peHlSQnU7KnVDNykkQF8pZXA3eXJRbGxMTVgmY3MqY2F6QGRPczBseCV6MSRHR3g0SUNTMjR0eWVUWTJiJX1VaiZ7SHlkM0RJQHpNCiswdTFabCFHe1dYdGhrfkxFX2BJO2lsNCRXRE9UVG89c3ByR2tOdUxacHFea0xBIXBiSjR2dEo5OXVQUyZvfGV5OG9KaV8oM21gJVVNZ0AxCit8ZClQWU5DI29FRHJKezhYXkpwfUM9aDtiQjhCTHhpRWZBO0ZNZ219OzEzYzs0YD9WVCltPjtoNW9zcH5CIzY+fWVjZzlCSCV+WEJ1Qk00CitoUl8la2B9VHo8YSleT0E8YVgtNCMmXn1TQUBOeC1rfjF0ZjVkLUV6fVViVE9ffUM8JX5qM3NueDtZYjI2WVZUN0d3ek85VFhxKk93ZntgCitSWTZ5Uih6RkBjVDx2dTJZO0JSJnJ2MH5laUZTcWRScWZsXzRjZXtSVUR7OHpVdW47M2Y2KUdAeXs9YHRYMVhASV9QWHZtZjFPU2pzIVA7Cis4cUQjP0QoOU97OylHZ0QhcnUkRz1zeW4xUnNrN152Pm1TZn0qR0s2ND4hO3tmPikrUkooVnkwUDF3Um1jKCRLPSMtUHFzd3coKkdadmhrCispLTZBfjRZNl9PdF5GWFpXdlJVc1FmSl8+MFgrQ0g+OHZ7QmdJVlN+YmtobmQ0QmhwaTNVOFRMY2laKDt1NzFIeEJeR29jfEZPS3NVcWImCistMGhkWHVgUGV+XkVLZV9YKGZmUCNRMDFDfEU3QTVhI3NDKlZUQiZqQyNYOXwtZ2Y+PTlAUk9idUtlU1FZNF8+OEtlJjwmPigpKWxBZE8pCitYZFE9KHYpZztZWXVBZTMyR05LQnhwcD8qZFRMSU0kblg/e0dpaTg8dzJLJXJmREQ3S0M0fStVOH4pckoqWWpRSip+Wnt7WTg2Mj4hTkZfCit5TyVpT3Q5d3xkKXJJSXtoIS1QdDw4e1RsN2w7UTstJDx8NFl4Tj1lIVRMJTFoNUR3IUolVis/Kn0+Qy1PTWBhQHA5KCRgVHBvTldfKiFzCit2dSQhVFlwX1JlTWFLRTltcHtLIU0yc2NDLVZoc1pmTGt1R2YkJWElem99dDk+NmlMOFIhKW44OEJuS019VE1ZKmNNK3sjWVA4Km85az97Citkemd0NEQ3IUJ9ZUNXanR2NytRPnBZTFlqcz03LTl7MUd+fnNRNihQR3FKXyRKekdDZyF3PXVARkBnX2VjeDJATVg1M21YJSpDVHdmaXAwCitLbEY3czR2VFppV1NmaGxkWGRGRENCKDFwYjxFS1F2P1EpelJ1Zj5nVXpWKVVUPnIyWlJRITU4TkNXcnM8O0BzWSVuZ1hkbCpVYkA5NkliCitnbEpFZihIX3xFc1g3clBhOVZsdHlHI0ZMUHR9Nm4/aytBWE1gXmdVbFY+UDkyWkVlciEtcnVAMXY+eUgxITx5bzlkbkZ2c0J4KHt7OCU/CitgWS1XYz90anw8TkI8VDlUPzBsMCVuNWlTQEw9RnFmel5UaUg3aG1XWVJXWShLQFNJdzNNdlhwKXwjfis+cHN5UCkzd29lKFR+d2opVzQ9CisqdW00em9OUGp+QWc1ZUZyYC1UcTxBNSZkWDhAMHk0I3omMzJqaGA5NkgjUH5tSD42fDgheXk0N1ZJZFBqdldZaEBraEh4TUBfb3Bxa1EqCitWSSg5cURCJn5jJUtxNFByRDQ9b01kNj8heXVJcnVQRSFudVJgTiNlbTReK0VMK148e09TZjEtYWtPe31JK15TV2xnPTlzMko7fmYtOCghCit6QTdiUEBWXntWeDV0ZGJfP3xAVEIwUyFSdiFKMmshe3A4KzspNmFQWTZlOVNvc1Z5OFI0c1JJYFR8aDhzcDEjdXtFWHRUVWBQZF9lV1BxCitwPTUtPFVwJDEhO1BiaXYjNCU9V2p0Kj5YUzVxSDhZXylnajgoPkpXMW88P2tPWnBuISRiQ20rIzcxOTVfT0B2QGtgakdAU15aJSF3Ji1JCis5TENtP0YtcEJleS11d1BAVFljY2RjYjE9M2o+d310UDEhdDtCM0lmMEZPWWd6PmF9XjAlcnhqN3F9fWhOSGJYVEJERCs7MS0lc1hkZUdMCitPTCkyRk42NypZOEQ9T2hXK0pWfWsrQS1TaylJS2NIWnIye3dkUWMwbnA0elVuUkw4NHl6dzI3K0A3MUBibElTal55Xm5zTnt0PG1MbH1mCitJRG1pYDAlWFpubCFwQTEoR0h3PkdNa0F6R1FjYDN2LXZ8WHF2bCEtfGQ/aTNsVzlfVzhNcGl8KCR6P3tJdXBsIU14eDs8MzdoamQzTmtDCitWRGlSRXVLdDZaRVV9cFhrUX5adyglNkNAfHowbWwlSUJqdHc9MEg0UWgwNCt7VHhfYDlIY0EhOHdBM3tWJVMqUSZldEtrNUlMe35tdzRmCis3NV9PWTd6UGI0aHA7KUk5fTY2PiNBI34zKUEmQSpvP2JGbnVHPzBDV1ZeOWFqQEBudzMrX3pfYG1QSiQkenV8SHZiKElgPXRMKntAbVg7CitBVVBuSCtMaE0+ZWg9c3o3Izg+bF4jSlB3dyp+JGZjcTduVjZRdm9aYEx8fTFXfmIoJj03RkZ0TDgoRSp3V0dCWXcyUVJ3UWsoZyt3enN+CitZZXUmO2k2bSRzZzYxKzBfSEVRR2k0ZiUkQ00jXnY8KE5EJkRePXxjWF4jJHNDSXtJdDtgfWh5e3BYNUsmZX1WckJ8TSZjTmBoUClHe057CitnbXpeSCgkMGxOYWpIUkNpbEchdjsrSTw3c2hiPU04bWswTlI3SyZ7OGExfnY1Pl9hZmE9PkhnWHdsK3F+d3ZIcSQ0SXNPKl5XQiRrZSZsCit4VG50e0FFZj8jQVpFKT5MMThzViZ3Ukx5Uz96SUZoP2ojI0NkNShMKCk3ayNRYzxJVnthclFeT3tQZDRfaWo/LXhFWGR+VyNLQFNXaiUhCit8bVl0WC1WKHlzckZUT1F9PEkoUjluO3dzWVUpa2VUP1gtUXYzTXB7aTcpVjAtfmdwWUJ2aXwxKCpXSFFZJD8jVUBkbDRTNWtYYHlVTnUqCis+VFdeWmdWYUhxQWJuNnNrU1FvQ3M5I1dBUD1hPWRjQ1lxO19PU0xDUUcxSG8tZzg8endaRTB4RTd+ZTtIVDZkQkkhfDQ1b3d1JkYmV0dBCishNn04NlFzQmNwMUcmKClDJHRMUCRgfDA5ejNBIVA9O2tyP312QVJePEx8dWsxTV5+VUwoI19TKXFoOU03LUQySFItM3J9bS1DRXQ3eF4qCitQbUFMekRGMyUqbWdTOWRebm5BKH0rUklnOSMmWEslZClLJSlQa2tuVUdgfGhzeSlIbTBBPnMjeDZOZDhyTlUrVCV7PktFKFJsR05gZHNqCit0I2s+c2hkU3V4R0c3UjJgLVhHZmBoUURye15SYyRwRUY2SmBtVTl5VCo8WnJIckFnPDtReEVlPX42d2p5amJePmxVVDFPR2gjSnBWbFpKCitwVmxaSnBWbFpgU2JxKVApaD5ANmFXQUsybXRleTdEdj5fM2VPZF8wMDAxUjBSUzVTMDAzfWxhNCVuV1dvfjN8YXhZfFFiOThLSlZsUV8jCitHJWpVJFcjcWtrZHthZ0MwRGpYWFpUak1kTTw2Xlo1clUjc3NhcWVkcF8pcSp4UkYjKksmeWhIKXlsNEBZPG5aOUFnI0MyaEIzU0J1RFkoCitQeVgjfGpAdlhabkV2VlNFJjxEPl9RSG0mM0w3Wj93M1RQaVpkVmxCNEJ4IWxMYH5DZz97cWRvPmNWXkRLJllVQE8mWTNmRmkqOD5iN3pJCitIdiFKbj1STGFvNjZ4clA3enVMdTRIamFAVEhfKXFIUV5KQCtNJkY5YVd8STJkNiFtQHwmRlQ0OWVONkZtfUpAbH5SeGFVNGNTPlBlWkZDCitUSnZaayp8T0BabyMheURUI14lXjU0Pnl2dHY8LTlGPmspYzlZXmNASXB6MUQ/fDY7O0EwP3lsdmBMP0Reby1uZWQhQmFvKklzODBedWhNCitpeEllMkxIPzBeQzktVWBJamEwdkFteWFgd1h1ai0xfTZyQGNpejx2KlU0eyFaO3k0RE5QWFNBQEMtVCVleDRFdFE7aTxBQC1nbTJ4an5kCitga3o5RmZneTNrZWduan5FOTA1c2tGJiQ0eSRXKU1MNzBwJDNrfH5TR3ZHUFRBblojVzBNS2Q+P3U5Qz5kaig8NHt+bnREZTt0REdMZWtHCitDVSM4cipTYl50dGIrSEN2LSVZMihJR3tDYG1FQyl7YXlRZ3tCYDtJQjNqUHtUaGpZWEslUSU9Jm9yZjhyIU5jSHJAK2BReiVOQkEjKTxACit7OGtjUmFlJk12UjR5c1FNPzhCUEU8IXAtbTtidVBJMzdDYTFxbW1vMj5eMDUjV29DUD1LPVB+akImd3MlZEZeRUklQ3R2d09HcCQ5VExWCitIbll4P3w/OGFeKm84YTN+WT1IPTtxMWJKeGtDRHJiJWZBdmRmKz9FMW9tYn4pXks9NkokV15qdXZJZDdLVjlgKWJHJSZpdnZhYTEtMGFSCis/T2NITWZ+R1JDP1olRnhJXy1fUW0mVzd3KUY9d1hgXm1DeGZOYlE9M29wVW9rY0UjTk52MTdZK2krNjthU2NjWHwrYF8yKVFqeTlfUGZgCitiVWBRJEVwYTtaKjN+JGB5NnRMIS1fKT40NCRXfnw8ZEVYRC1ZVG1IOW1LcTI5RiQ2cSVqOEp6RTxiN1Vob190cipTN2pkMztsYyRjQkMxCitxUkktVHFKcUVXJGF2Nk4wWFF4ayhfXzZgbWxZZGZjbTVKaWFsU3pZMjx+VmE/YilEbGJVWEs7KXZDRyh1KzByYSZ3c2ViaHQ0dDA7eT4zCis1PUxlcXpgcnJUY24xciF9RiVKSnN6Xk1+JXNwJDlGM0FkeVlNSSFObyQxVk1aQExLcFl4eD1hOGo+flNYTHckYXl6QSMjZHg9eD5NZTdrCiteMm82a2RCMHo9RkNZJHx0P0tien0hIUl0PUBPKl9KcEI2NEBjdW5nQVU+dllDejslJF9vN3JJZU4zanZYQmY/ZFpUZGhHOVlwT2N1RkJfCitocH13alZHY3swdjxudDMxfWk0c1VlZnMzUk1ENkpRME5hbyZCfEAjQUB9QjF8UWkwU2ZnKVA1cT05NmBXVnkoeUBTM0BoUTJ8aVBfXzc2CitnZyQ9P1NePjRvPFRJJWpJUmYyeDUzMyZZVyVvZX5YaUExNFdIMFQraW5Fczx0VVFjOz45NiY3THdUKzdLSkxKNz0yI2ducHwtOUExOGJXCitJd2NRWSZsZFR1SXpBaFVqKXxpaCRhO2NQV1JNTHZGX2RzTyVRTyNJSF9BKHEjIXYyS2tJTmQoNyZQVlJaXk8xNlJlTyZnRHoweklNb3poCislcyZmSkRnWFY4e2dDU1NePVNHUnEpMmBXfnszcVk0UyRZc3xXKmokMl5IMmNYJG5lMmNaNlYtZDI0eHJNREhWWG8yMk9gaFZaS29pZytMCitKN0xifFpsbWJOWlNBXnlOblNRViZpSHdnaVRkJXU9QTlWMmZoT1pQUlZiQXhrWTU0XlJedVZsPXFLWGBkfko3ZFJfbXg+Z3cyYnAxc31ZCitgU19FTEtBYl9hJDl1VTZQdko7LVZTTj8zVzNpX0FjR2xlUWR3WGxvNFVIcTJTN2szZ0RhT2ZYQ1BRMGctdElsRFlwZXN7ODFEfVpPYUs9Cit1UG97bWF0ME9gRkdqYjB4ez1aUmB2NkxzPV8+JTcrbERNK0ErVSh+XmM3ZS1SKEkqVDQjLStLcEgxOCFTY2NoJUY4VSU7WVN7SiVwN356CitMeSFzfnEpQD5+dXMyUEMqOU95UzM9c0U9WWtwYUVWZm0jdTAxX3VncHBpdzY8bD0pQUhUIVp+LV4xY25NMVM8ZENNbjNZemUhISlTNytMCis2cnReelhMRzdNUnNmV0o4Y3s3ZSpwM1NsckF8OGExaHZ2JmpRdDAjKSUtMzBhZz4kdDlhVT0tKWVXUnxsU0Baa3cle1VnVCFwelIxc3tMCitYcDA/YjQwPndPSEslamVha2RQPmVpb2hIazZqVyFpYmU/fWg+KTUjbiEhXylTMkExViooT3NCa2B2ezZiKHBpeWZUeHp+Qz01dmNiUEhFCit5MWhqOExecDgkb2xDeFhtTSRObz87SCkqciVuNEhDdHUxJkxxfXNMdTk9TnRVUn5ONkUzd058NHNGV0ZLempyYkttKCUrRTlzWDdpKmc3Cit7dFFNTWdNOH14QnVUOUMzWigkTSpCYCN9bFM+VzRDcGFaQFRZVGdUNF9VOTxqPDtaQzErUEkwWCRfPFUoMk1YWXN8UytnQEg1VUNOak1jCitsU0tRS1EmZFZ8Z0d3NkhSJVByOUJEYmF5Kl99KlJ8SFB5c3V4KHx1ZSltfWNMQjBwMFJFQXJFbkcrQj94dUk5MklHJFJsPjxQWU1Ba0FOCithRF5NI1B2VTQxblVzWFAwR3BFTik+UiEyXz5mYEBEa0VwU2VaNSZTJThEY1FuVWFWQXo/KHUwYH5eeXFxTk5Ma3s+ZEYzdzZTRGJESW1gCitEK0BuKGclS2JjVHBEODR5dkw5fW9pak9WeT5xYy1EYmwlR3ZvRlA9RkBKRiF3Z2trY2s9TWh9KHlHJlMhYWtpc2NDbSUoTTdoYz5zOWdfCitsUyhteEB7e0E+UE89a3J8Q2U+eyleSzVnJTsoSygpP25KYSlEU1FUaD5eUiRMNnFkMD5kRWRxNVpnRWA8KWl1X0l0PnpISWdrd0tgZTlNCitldll5cXlMSHtDdUN0V3AmbExqV2ZteDFtdkliXismbHxXTShzQTZKMEY9YWZwOCgxS28pX0B9Zk1gUV8pZ1B3QzMxJUc8T29wPSo3fWBECitAciRkbkFZUllwZz4mQ0k/NFZmOD5kalI1Yz53SWQ5NChxZyFvRDkhTURuMHQxT2lzeiYreCVlKFY8R0hnVk9la1M4emI/VXpCNkpWPW5LCishV3F5WHtJc0Z9XkklVj48b2RmZWkzZkNHOThfPm10LUJGXyh1ST4jVCpeaWFlcXU7YjVVdmVoNUQ3bH55NzJzVS1laTJKUnkzZG5VNiZQCitDd1NebnNIK2FNcilsUWdMaCpsZG9ofjx9MWt0QXV3MnVNNjlMVjVuVEA/OWN6I3lFIU9CfTVvVUcyRU85SCZXaGdkQmhGVHE3NytFSHtjCit5a1gpV1c1WT4rSC1YPG0/UCtLTWd0RU1oOWowbyEpdENgNnFGNXQhTCVfTDx0cXIzZGgjI2twKUtfRjV1RTEoKXo4MzVvPUxBflchUkNzCitlK3JQNzE7KXs8NlVFfUYzIUVgST0qSk1mVm51RzlIV3RKc0ZFQWohPUtxP0JDX1JZVTw0ajB0IVVlMXQ3cWZZPUtJUCFEMmBreUFQNDFaCit9aXVwKCNoPmJHWTNIPUR6PSpDZSV6Z1Noc1BIJTtHKHg1cXwrNnE9RjZWTFZ8Mk0teU13b09vWDNqR3M4O21ZVEBxaFhWbFRJI0EtMkZxCisjJHJpVEclJDY8JkZtfUMtWiRnT0xMKWRgaF9Hdl91VjZafntOOCtLKFJiantVX3dLVkl0Q3U1TnleNjBJeGt+Ynl0KGkmSiphODI4X2pgCis3fnJOWT5Id3ZNfDhraG02NUA0bz9kbHRXPn08P0hiRWdMO0JQUntAZmk0WjszdGMkPk5KSCkpPjdLM3pTX08kfWVSQzI5c09heGJLdCs+Cit3WGZwdC0mSUBfTExudVF3SFZXeEg3UX1QfDY2diNaWn1+MURZWXt3c185eXo/Xz1+PGR4TmV2ZE8/PSR4YTFpYE9OI19vISZseU88ZkNpCit7dVlifkl2R3Y4K1E+eHZhKEtgdTA2OT9BP0dUOz5zcjFZN24zZ3EtZmZVSF8mPDM1VzE4UEEhUik/WiFXKWhadCRqS0BiVlNVWVFremxVCit0d2dXQkBeeXwqKkUwZXVFSypEXllGbkpwVUZfPFVoT0FxTn5WP3YpbVlFPXVhOGV0RiZWd0N9XllCRzwqMDM+PjxDeWFwQzs0VSReb2wjCitvbWQ+NXxIWiNIMHs2SzYqYkcrMzs5amkqandzbjBaVUxkTy11UHI5JWI2YTlvQEk4Um0mVGJLcVF5Wlh1Jigpe3hQRyhSUGZyMHZJdXlKCitSQmpIYjJZWFBSQyRrQ2BBWGhsRyU5O21pJnVgbjBBIWUmY2ZwJD5+fGR0bkVmdVFlQyNMM3UtZy01ez4ofCM4RWNGN0FgSG8tXj13RzJACitTcnRKI0l7fCtxcH5wU2IlPEt3NGVuRCFqLTdjVTFwJEpBMyEyUD5oalhPeGdsUXZAZm8hRD5Dc0JPZ3NAd0tRa1N0KmM3VUdPdmpCO3NRCis3PjRueyFEQD9eXzk2M3djTmpLOXc3M3QyejEkWCVeYkZESUVOSyVIdzsrbnROQW9jekZ9SXE0IzkkYE8xRkNgaXQ5OWdHUHpXOCReQzkoCitLJjB6ZmAwe0Q0PEpXdkVrej9PUXBve2dZbkk3NkxvVE5Qb0ZRWjlzblRidz9KTDJoJHtkPFAtYEp2TT0oOFp3WDBoWH08Kzw+N3F4cl8qCitjVTRPcEUhV0k7N0FVZDk9XkIrZjZqd2AwK2dQbmlUQlk+YEU4RkVxX0k5YCk5aWZQKT9iTj92XilWbHhDUUd3VHo1NEBGTkhaJXs4bU0jCitMQEBNTDRtY0V9VT1QMH0wOT9XQ3xeI2BJNGBfTWM9Z3tCU3NFUFVyVzVvcSl7Nn1VanIhbW4/eilNbU18NEhIbzEkU2wjSU49aVVrQkRwCitXWW4hKGJ3SEJrRkp4KU07YlBQaipxJU1eZH1GTF9sZHF4VlcmP21wI2x7elZPbTlBT3dWITV6R2RKWGJEJTs/aj5zV0QlQztNZE5OKjc/CitQRGthP0VheVYzWiZWUXNuNWAoLTZ9WFVnNG9qPn5zR3NzQ0FefHhQMWEjK0lTWUFKTkdJayUtbHxpNSpzTGlec2AkeGE0YEhfb2N3TkY+Cis5ZSR0clJoQzFHWWlAMChMZlVnWXo+ezt9ams5XzQ1LWBtcVkmN1ElOExgX05ka1E8I152YX1pdlNzck5hSlEtJHRSV1QmVHBya2R4eFJ4CituKmBiIXBCeXVtSkloRkZjX3l3Q042TjFYRExtdSZJN1RFd1JoRnYkdyFoSGJiOCZaajNxYXEoUVYkUmQkT0tqMz00b0swbXozWl5hZXBqCitodVdjRk5oIShOfGJETmNXUDYmcWQ0VGRqVHlEPSFXYVNCazI7VV9tWlBoX1lvfnNDaEktcUN0cjdgQztPPERoT2UjelVVQXd7Q3wtNiY3CitDbnEmI0AkZSpIJnpgOCk9MS01QWNjcmtDfDBPRnk3Qi1obmJ8YkBoPmokLW1BO2hDcWw7T3lhMFhve1JXcFJoYGV2V3IyIWF2QTIrQkcwCithVlA9aVA7P0tqdnh4QV8xajB7VDJ0Iy1BUCNpXitGciF4amg8YztsQSFtT0xfeT91R2BeVkArOSV0MUtfKClUOTZ3Y2EmWm42LWhuWjxVCiswWHI2O2hHZF47cDJ6VkRjP2tDP012Q0tuYXhkVypKTTwqfiZSKiZtU254RTk/dyRXdStfcSMoOTZ5JDxlWjQlQ3BReUA+U1Y2XkU2ZmV+CithS3Y7Yl9QSHozcEZWbn0mOTZHSzItV2hDZHVTc317PWJYaDtTN2JGdVZsclleSVdJZDI8aWNtd1ptcThEc1pwMHhjfDRwVGtXP31ySjdSCit9KmUmNmxPRjxeVCNJLWRnMEM1R3VFVnFWPSlhMEVzUFBqWS14blYweUEyI0FgUCpSKFZLN3c+fEkpQDs+T1dTKihFc3VfaHdjWSNia25HCituayooPHpuMGhuMk1kZ0l5aXhnTiQ/OFBBSDV5d3FFbTdxQFZHX3JtdmsmT3NVO1Iqan1xQzB5cTZZVTRlWUVsU2h1KjElKFFwY1RMMyhlCittUilXa2puVDJWKCEyYSZeTSR+NyRsPmU8dFg9ZytXaWxZcjJkIzxwbkFMQl9gaVFBY2V4UmtlJVZWKXJDXm5mQ1RENyFfeXRGYCl6RnlZCityV1M2bioydSQ/UldQUCsxbnBNQGRfeXwyfGpraHYtSkR7P3c5QGdJWDFtNDB4Tzc1WlBzfVJWMysqKDhxN0xneH5rNlYwXktDYDVMSCtECitLUGJyd0J2czk1VXFuNHp7TUBtP2crckI/fXB0MSZQaD5uQkBmVnteT19Pe0BgLXZMb0d2Yn5IP0RnPWlyOTBgZ0pjUmN3WS1lKnlHWmkpCitNTT81YCgpNj9HX34rZmtEcURKJktWJD92JXNrM0ZqTXg+IUVnNXZrOFFocnRJI3A9U20/KUl0ITM9NnApc0lldV4zTVZ5cjkxQUZWaWw7Cis8RE9LcHRyYmlabGchVSNERn5edkh7YVpRTVV6JjdpY3NFVEU/ayRKdyRQdEltV3FUPiY9Mz1HUWRfISR1NXh8VjY8ZkNOO1AxbSZuNjFUCithKHxfRTlMX3h5MHZOVCY1Sjt0TyFkeEp5ZkU3WFU9VXMpbT9qM2UtKXZpYT1CejVtZVB2e1EySGNJTWhGZXQ7fCpQO3hQIzVIQDwlMkp2CitOb3JvJlRiU01XaUg4RX47Pkkla0FLdWNPNV9VZkBeVyZ3JkgzUip8X1N+SmlOOGJecGsrT2ZnQ3IodEUrcGFmUnQ1OHwhQUdgTEdpUSVACitLYXZ3OSphQEhIS2kweXklSjJKIWBSdm1YI3E/VG9MYnBuQVgmYiFPZVhNcz0kbW49aXY/UyR7PShyWFp2QFg7WnIteVEqQTZHcD1OdkJ0CiszTFc5YEExN0JxbHBOZF5KK2RxaD1eWjFKUVo8TUM2QG1iYTZOR2dwIUdaVDRJbGxSTCZYdzl6WCstY3xlRFUoRjIpQGJ9WSlvaz04RE5jCitEUipmXj1gWU1iPClke1YtI192OTtiK1pMek1RIzBFJnAhZ05GRk9GfEV3KyUrWVBtKXYkX3ZSQ0dITnc2QUxpclFET0JidX5PZVFRRDxsCitFfC1gfkFzYCFARClWclFEe3g/U0kkQil2V3FWKng/az0/IW15YmJAcX5eYlhufEk9SzRXWEJ1P18pQztrNzJVYUlKSUNmRVI9P1RuVH5eCispKXd0Q31ZZSZXZm4lemZyb3NKd0gyaT4yfUxBeWFOUyZmQFZHQEpuYUgtZGYlST94TDBuWiFfPnd0NiVzYmZIenhIbWpEfHtXbmhuQzdgCis7MXlAI01RU35XUWElTExPNjA4NCtKQUIjZGVCZHZpYiMmN0FCJDUwN1RRZVk1WU1Zem97dXc1U0swKXRvc2Z7QzttY2ElSiRjWX5rUTttCitXbUAlQUpVOGwlOFNYIUVDdmhaN1RkfHFlemVYRn5mdXF1dDNUTGh9PVk3QFZmI0J8ME81eGleYFNqYTNyYDZoNUNPKDBrXzZSWilTb2tCCitNQkk7WUJwUyV6Zk1RN3s7ZThqbjQ1IUVTKldAZ0VzM3k1JXd1KnhkZzMpZjtDaV9WRTB2JX5hdVcjbyV5MG1idElVLVdsd3Q5MEF+M0VvCis+QVcwUjJtUUZUY35JJHc7Jk5OKTgmSC11UDl7fU8pX3s8aUI1WEpvUk9eN2ZtOylGXiV2KUZ+PUloV30yPUZVN3ljPVNoJSk9b3YpZzt0Cis0blhQR0ROcWBKcnxIUnR+MC0kK2s/MHE0fi0+WDNJSGRnPX5BQ2w0blQ9YUM/XlEjeUp4QCVHVXU3clNFYUM7aENpOCRQfjEoPmslTG9eCis7a1JaSmhoY0BASmpIV209Zl9NYDV3XyhCaVplVzd2KD9vRk1oX1o1KnhFaykjVkJBSTtUKFkmSlU/anJKeXBCI2AkYlktYStKT3FYS05gCis1Vy1MZXJhekxXUWokS0QofEspaytpO2plITMtTyZPJUgkTTVQQ3BJaXhgcjBedVp0MXEhZCVPcj9aenNFUDFLXlh+M0VLV1FoYFBecjAoCitwenpUMnw/TnVPNjV8YXIyTjUteihpMUxgen1HSF9CYG5FUHcrPFYhQDJRbTRNKk4pLUxATnwkI2ojJT9Ed3AhdEBRVjRfekZXeVd9NXNaCitNR1UxQUY9Qz82eFdpQUA7fDMxNVEhV0hOKExWcTxoO2VGejY/OztIaSozRytybWBxZlo0cj9peHJlO0RobDtZQlJ5cV97WmQ/OXtOM044CiteSChIMVVlWEE9PUFxSUZubEEoamg2UzJCUmwtc3JNSz5SVio1cjJ+dmN4TihNKDNHSldKdFReRmxnVnpeKSNiQmd5K014YkhPYTwzcSE1CitKZSZhIS10d2VyaW8hOSRBSzxIfVlwI34wVEZDelhrK085K2ZhVDNqNVNZV1RuKUxFQnt5VjdBRUVCPFpkM3JrOHpLJVlgTWo8OGxXZV81CitwYTc1OFE2eV5EQXR3Sk8tMnkoOzNhclcqZFokYU9WZyhQWVBTekhNNlRoXmYkO1EmQ0tLJkdYRU10PW1IbGJXJCRSZHBYZHpGMEpVeW9DCit+Rm9iLXBDVXQjdThJJU4xK0FtNXdeY0VeY2JjTUdzdFFeRiF+N1NQYTcydyl5KmVIODNiKVZvMyp4ZGZib1c5cVlxQHF1PGFZVzBTMihICitVdlIyTiFPMmdDOEdJPHlybyhUYVZsRTF7MShLVlJmSTtYITVNN3tqcFdZSnExaj1LUUFtYnpCVmRicVRTZSVTaFdUcWR3bkVtMCZRM2xSCitqNHN8QVVYUEZ0Yjx7dzQ3Oz9BO2IwWjlqT0dQPkZxe1FAblB3UXMlMnsjYDYqWjxEKFokZFRobFB9dDsxXnQhTnJ1JDlnTzUpIyl1VT45CitSbWhvYGU4P0c5Tz1WRVo+SHtQOC16UkN8WGw5U1VTWkZGUH5HXkAkdk58SGJ6dCFuVTE5dW44Tj1mWldWO1MjejJmVF9tcGdIUlFfUEZyCitaRHsoSzh3cC1EKkxgNnY9XyZVVmBHVitEdmd4bk8lZ3NxeU5IMHRXY2tARUxLLXNNelcqTztUWHNkYT4ka000bEBZZSslNng5ZGMjan1gCit7fGRVeHE/I1hDMH1eU1pkZlI8MzhWb1BDYyZGYT1ATSY8ZF9KbEBjUGx3K1Buan1hP09DTFpwcUN+bTdWa0E/Vz8oR0Bhe0pVXjFYe19JCitOU35ENnNhWlp2Z3s8bjlCckghTnR4I0FnWUcofSk4KkNHK2UjRihhcmRqUXN4JElIcFM1byM/djElSnU2LWAmQj1gRzUmWVNnWT1zN0JNCisyayFyNmdAUWZHbzFwZ19aJmV5N0x3TVBHcisxRElTaTZUZEdjUXZgaUFhV2didDI/QCFMQTdnM0FVWX1WaTI4az55OG9vUUhBITZhTHlFCitRIzNKVGw8Zy1HZVRSLSM1e0RMMU9vTENSI1BAP3h4ZWd4WkBkMjFmeGNifmchaXo+bHdqU19XelBwczVEM3lgKSlPKD18eFQjIXdhdXtWCisrKCZpYX0tb3FeT0RGbihzNXAlQFgtU0dlSlpLYzBibmxwYjNpZ3FRYm92WE8qY1IoP0dKUFU8OVJGQmpibWsoTElHc1FWOyUpc2g8dFcxCitBJDliU0FpSEAjOFZPbCp3KFFFJXpVU2pDYkkoQVhyQDZraEc7aGMkT2pDPjUoQypnQj5gZHVraWw5dWZjJTRqcXtLayNydG9IQEB5WjRQCituRHctI2M9Ql9fOzZZfHNeUF5oNzNCK1VJLW5hPmZvMkBpZztzeHZrNVohemU9dnUoTz1aNkNKa2F2dEg2dE1WMTBqT3ZfSmdvM0hrdEA5CisqTWtsT2xJajhmeShgLSZUeHgyI0M0ZkhKKDY/MWhvR3I5X1hheyp8YjtlKil6bDVTdjVjTWVBJEZ9WUp2TkBkVnl5NC1kKEZ1VTdyN2I7CistSHtOWlYqKUU/XzFZeHFWaFUxSHx1Z1pFa0FaNClwZjhGbXo7cVU0amg/azhEOGhhKSNMOW02dHw0NEplLTY3RndrVypNblhaO0N6Jm9tCiteZHYpOGdxWHh3UllqQDZCSkBQP3BIKExBaU4wJmdNMEw2TEVFS2R6VEhzZEJEblE1UUpwKChzMmhfVUheb3pQaiNMVUckJDFCQyFYNGFkCiszNzZrN3AqOCtSUn1gSG9JdnAjb2twQE1PSVdXXiojKWBXJTY4cWtmSWZYcE9kemFhe3dmVXYpUEtNKnZtYS1FMD0lYE1VdGdJR3loOUdaCis/WDtxU3VKVH1+bkYlPlA9KDImRXJAOztyOGJtPyQwQDEhIzJjOF44ZWR1MjJMTURiUXByX1Y4aSMyVzsmWD0tPGFAY0U/ISRuclVtNWMoCitOWnV7VUo/OClDejE0b0d1bU5+U1JRcD0wbkBfMlBAbE5uWV9IPG1nTiNtNXxjREBNOzAydSNFaGlfbFF1Y1JFMThZeUswPXQxJlZPVENsCit5TEFUSyF7VEZGTTFnYGtUSWZuWEZsPGdMKGNnV299K2pQJlI+e2NXeUMkaHomfCtpWX5LS3xQUzZwM3AmeC1iaCNHVmhMZ0Z5cXZwPE81CitlZD9nPG88YWMzYE9uKmB6IU5tKzNpb2FYWlJIJk9YPFMwMH5ZQyVMZSlxRV5AWkV3XzxUZkErVVl7fDZjVT0+SE5FMiN8NW8yM0l1WVYqCisjUCs3PXxmZk1zQlJuYUhmb3w5e1V+fmFPMCpmI2Itb3xQVHpfYTVgdSZgI3JuN09EVmUteDZaYiowUE9kZU1jPUU9PFkha2dRfGpNamp9CitNZzdKZWU+bjUmQUNTVE8kVG07ZFpFPlkzKj9PSk4qc0F0aVQ2USFuOWE0SitGR3tZPk0yV09BOyg/NXtPIUA4dzwjfXBkZ1p6Ui1KUHtNCitlMS0mcVo0UW43M1I+OHhFSVJtVi1hJGdOaFBaXk5AU3YtOWhPSGJJdl9hXnRseXFBQ3ArM0FMNHElKyRlNTY4Qnd7TldpXjclJiQhTmVVCiskO2pNbkdjZjI9JiU0Jnp5clRVVWc+NFMpPGslOSp0S2s0KU9ldnsrOGE7ejI/fTlSeyMkJEdzTS11UE5kJXw2IXpOaU5VUHMyaj1DVSZiCitPRkQzUVIzRDhpeXh6QjY3UU9jbHBSa2Ioekh3eElpdng8amtRXzRyZiRBQ29lT2loTFFvKUY2eT5kLWVoOSkxdDReKU87K2BVYjRkJkxjCitqLTVCbE9AfiZBazZgfXVLfWMyOzNEZl8wSlVBYHZZJmtGV09gS0FkfXMjJmM5fGBNdXNUfE8rK3NrKDdLcjg3eX4qVHJPMT8qJEt6YEMtCittR3Yhdz9VMmQhMUV4KTlZJUx2QmZrM2l1NkFfLWxZel4hXndeMmtjMGIkYklicUUhVzdUe3tsSz5sQGFBWU08JChRR0RhbUYhJjBKJGVjCitAR1dCUSNlTEYpQyFaJjE1UGctMSZ7PyVUemFoe05rRmN+aj44NEM4UE9IUDVIWGQ7YztxcEskKE5jV19+eylSeyZnMmdEbEtjRSNlRXRyCistSCt9XjttMX09QFU9dCp6ejRIYUFycFdZOTtAR3R1RmM0P1d1KDQxMyhtUHs4dzY2RFVUSkF8MnowO0FFP2F9Q1BlKTlmPFBJWFBUIzVQCis3T2A3YzVlSGd1cjA+UXk8JG53MW5sc153NCtNdjVZPGF3aVVxREdiPDR0RmtrTHElKUdqbFo/YEJXZVZab0dUUEFhYm82azlyRTRER2BwCitOQ2c2eCEhNnQjOFI7eG5XLTJJV3YxfipJKTd4cWdRYihxLVh3XzhDJXBNaldLTCk3IXphWWJvb3dseW0pa3xRc1J4cThzYGJiSzRrUmh9Cis7Nzx8JDZzcmV9JTFyZnVOeDRpdGtnTj5YSHotJXE9bXx0NWxPWjMwU0lySTZwJVV2T25VQkZFYFY3OzdDT3BCVDdRc1ZYMF53Mn56Ni0rCisoPT1QKzxXfDBMPXpoIUtuVitGR1lrcSFQNV5HQlp1TGpHK2dXaG0tJk9jbSg+V3Z3MF5XOVZ0WWF4O1BAPCtrfDRjWjFxfGlCclMqTmUhCismRlp7V2VVd1htYlE/WnRvS3ZQRklCRE1LSXlna047dEVlYWtBcSlGaS1CaEE8Y29IZUtgN0dSfVQ3fGEjdzM1em1WSiZ+QCFHR2JDdns2CitHeTh3TStiREV2YHA/Qz13THBmOGVfU2tiJDhkdkk8M3pybDteMXY3bmhmPXJuK2RgNlRufWs3MjVBIX1YNHNLWmtjP3Z1b1NaaXsrOUhZCismSmNgeH58XmFZIVVRJlRuUnwjK1dAM31NbjZIbEklSU19JVRsMGFrQVVGdkROMkhfSiVMUX1Ka358Rk84ViFUblFWbElZbVlKcm8xNit3Cis3SzMmamVMekB5VTM8aH1EZy0/dCoyP0g5PH5fLUx4P284P1EoeXlmK0FKYCs7YEM+fnUwfUZIN1NJU1pfM3haPFRoVUZmNl4mTjRHMXQxCis3OG5fOVZ2cChVVWY5TEJZJl5GMERzXkw8akUxOX5qMklBR3M0djVnMU1rdD0oYD1uPk80MX4+SnVmZHM2aUZpYCl3aEIkczgwUFg7KiRsCit0PCk+eF4pcXAtMkU4eX1HMnI2VmlAbnp2U0d2T1NsUllfaDh1KTJZV0lGRjsyLXdrMGArQzVKdyRXQWpvRTM8OX1IV0BWQD5pViVGemUzCisrOyFjI1o/ZGJeWWkzNHxMbSl1ZmZue0NUblAlKktLUUdQY1NrV0IjSmY3RmF6a0h2ZzQ2VEYzSD89Zk8mfWtvaWY7czVJYTEjamRuOEc8CisxWk1lUFBnYkdxbjFNZF5OcF9PPyF4YC1DdGdvVGhPdVZFezVGMkEkSzdMKkN0MnhqLShXYmw0VTdpZXMqNFBxZEgzJUY2SkgqM0JyfjFHCitmVHpubUc/ajtuY19AI0U9SlV8U0poWUk5I18tVCQ5dlp8I3EkMC1YJT1BPFRpe002SWJOWHRnUUE3Tjk1ZFVjPUJXMyNCYVcrYlhuSSlPCityMndCSDs+WiFvWSF7I1FHNjl+cGEjJEBfLTJid1hyKHN7a3tRTWBwYGtCXzJ+anBvdDhYbUBaR0pPLUpTUUJjWllUbWZBQEZqY00tS3FMCitXKEtlIVUzSXQ9fnVWQStfXyFBQ2M0dzJ0QlJ5UlRxMSsxSmVzd0RXKlpmNTMoKDx1JGFeakV3VEZOfF9CVzd1YFIrQ141I0RsZ3dAITh7Cis8ezRHTGhnc3dCSyV8OEtgRjIqMVZiK1Y/SyNlPSpFKzEycz5se3BJTD4lKlcybEI3WVEtbjlOcCU5bTh9I0hqYiElRXlZTGEqNik9WWo/CitPSE5RMEV0cjBsNDtfNWJBRUQhOV5TPGwjMHk4XzxvQEw9KyEycHRpWSRFRkUzN1gqKkU7ZFpLZUlXfTxJNnRqND9rPUhvQHg9RmU0NXorCitIX0BGUSNAPkNkXzJza0k7RmgpUXMrWXdudCtLSUljRDByYk13cylWP1lYOzxKVnlidSpkPlE9YW1jUE8lNnluK3pLQW9HJCNPKEQlSGM2CitSJSMyI3szaFV1QiVzOTEweDZOYz5OQyVBQnJ0LXg1Uz5rUmlreHRzaERnTnw1KTZANjdhNlEoTDY/VjZldUlwfnNuYDNLbUttUTQ1e1ctCiskNkIlWTFAb2JPTm4rJmU4X0luVEc/fDgyZyNgdnV8Q0c9fD1FLVMqKCRjclAmKjJ4cj5xM30/VlVuTTc5Tz9uIUNCTUtSYHI1TUxyc21XCit8RTFiKFEmU3phKFB+LSFIa3pFPFJnI3RZTVNDTTRBbFJnUCprZGpTKSQjYVMhdX5ITzB4LWh5OC14M3dyNSE8ZmFWMnRGMGBKTkVUemdBCitJNDNUXmEhbFM2VFBtRFcjM3tBQnI+MjRoKVh8LWZhPncmU3s8RGs+OTNlQ2xgXmc8SkwyUXNaYEhfQCY/fTAjb2U/Xj15SClLbCNGaCNzCisreFd4ZzU4dmNeT0RwSXNnUDIqLXNgZDtvSkEoRFNmTzBZTSlMRylaKV9SN2A0ME03U090ZGczPy10X2ohZnVFbXo0VUtyUXx7dFpRTE9zCitHZllQWHU0eGZmbykqd358VmlEJFBPbWZVcjMpWHhzcHMmPiZOVH0zTlJ1SFJkbk89Sjd3cTgpOEtPU2E4TnlxJS1UVElrT0FLSk43YE9kCitmKTlBPzBAT1RSPXc9R2Iydnk3S2NBJXRFZil7YEUzPzF1YiFZNUF8Rk9CfEhmd2FLSGFDUXlFdlZePW95a1oqPXw8U1FaZ3I0fiEpNDZSCitTT3dBRE07YFRmRDNoUzM/b2ZZRyNFQmBASjgtJG9SNj8laURWN1k/d1BjWHVJZCE8eXheXiRiUnJtWX0kNno3JHp7I2ZhSiRoNUctYVdqCit7KE1NVGxeO1ckTGNVSjw+SUlXZiY/MSQmTWJCeytJNyMyZTBeWGZrTk89KCNvWExLZDVRNThxej0jXmZRakJuekY8QzElaFJRNU9LRTx0CitHRlkhP2NJSmtwJUh1eCpPM1NgT2pvPENBeypOO2tTSlJLJisqS2ltKihBYCg2JEN9Qk40RzZ9ODRHYGdrcGRiMytARXM7MDFedX4wNmRXCis2Qmp0SCQxVzRHZGZTd3NmPX1gfSg1b0g3cT8mYkslUVZVKyMxciFuKHdpPTBwRSZ2fFJeX3FLNUYtMUhrJVJfJHw0YGVSKD4/bm45PnZACitUQnN9RHxiSzZqQ0IrWUs/M2xnbWN8dWxANVdmcThmM05VUU92N2RsdGZ6QktUSiM2VVUyaG52YUFhZ0VIdjZBNG9+PG5BTX50RXBWMT8jCis9PCkocCpgNXVhfW4pKU1lNHJnTDYqclNZKEkjdloyMjQ0MnojTT45KGk7JT1QcTMpcT5Gd0VocjsjYnVAUHwtRFZAMnROenR3IzRAIXZGCitfNnB5WFlDO21TWU94fkI3U35vTSgoYTYoJjB6RCRXYnw1KWIwcnZQREl6N1VPNjxrbUNpQTd4eXdlTUktRjIzaFFjZHVzeXxXYCteM2wzCitWMytjWnBBXll7OyZyYl5oYk89NTg7UUJAaXFqJWNXTlZYYFBHTiNXcGFjRnxMKjh9fWlqa19pbC15dzU7YDg7UV9RZSpOY3c0TE9uaVdxCit+Zkpwc2sxN0VkR3EpOGk7S2V2NUteXyZaSUAjVGhhVklOdytXJm5Xem4jK01tOT95dnAkbFJhdmJLIW5MUTZLMHc+Pk4hSTNSKHg1bz4zCitSRDthMmBnYlk+M2pXV3k1dWoqQ1dPUlNTRCo2UlN7ZUB3citiRFdWbFdBZE9CbmZRPDI3QXV0RiNUN2w7S2BRRig/WlcxQ3B4SyplYy1JCitqWCMwdEBLJWtXMC1RQ2tBbVhyanNFUXZUSU0hKyNsRmNrKFVaX0xFcjJsaiN5ejA9UDFrdGcqQUd7Pkg/TkgzWjE5fGM2IyY+RD5zbCE9CiteQGwyOU5JO314PEBCQXJaQXsxK0k5JVg0RT9JS2JoYGRmVmdQU0cjMEt6WnlpYW5fKzx+Xk54UGZhVHdgJFM5XzlianQ5TTZFYGBHRGh2CitqKnVLejNebzlZPUAzeCYkI2xEMSglQlZ4R0JBUSgmI0sxI2JhbEdqZng2YHRGdVl3Nnd+fFJPPnU9Kz94cTRUYHBvfFBYWnQwM3gjaXxnCithO3pGelhPJj1fX3EzTCF+WG9vYmw8Rk1NQzZlX2c4ZmopTUROJVhwWCpzZU1kS2lpYy1ebH4xVzJjYllaKitSMiFXdDspYDw+KTgzMnRzCiskRTlXOXcrUlR5UGs1SmhLTnZtWEdtbl9fQFVOVEV9MjRpI0YwaG5eVmVBP3FSZ28zbHxAJn44Oyo5TUZSM2J3Sj9nIThUcyk+cj44Uz1nCis9RFFUbkB9al5fI0p7SWZ1Sil2TjVBeE9NJFY/PXp4QW83S2J0LXd+Y0lKekRCa3A8UVA0PVNhcTFHZCgqQVVmdnI+PHdCZXNIUik4KkQwCis3fS09TnZ2d3VES1dTbkFqTVU8SW5POyk3VzctMzlSdkt7TDB4RSsoMTZfKlNWbHZ+KDVieDtiaWZyJT9oWHg9TmlgU1hyLVE2eEd3Y0lTCitHTXJTUHRgOztHTSRyfDR7JitiVFk+MFVyM2RRK183RypTWmltR057blBVKHZsfTReV3V0RXphYitIblgwPmV9V2xoanlmSCl0dU1IUitoCitSJXJNWiReXz0hWFNRRkpBT1c5MHVSaHdfTUFAPEtGelBBbWMtRFQmPS04PEU5UWp9eldjMD4rWUwyQGMwJXw1bGBJJHRFMzlMVlFeNmJLCitsViFLSjA4RD9uOTVLWWFgQ2RII3MqZWAoYyZXMWd2OTRkUGgwZkkjcnlTSntpbG4jKiQjSzZEZkNpPF8qRiZrZklaYDBJZkRAU3lQNTM0CitjOS1jSjB9aXk7NXUjNDFiVVZlc35zbVh+IVJ5MzchO3hJYE85YChBcnMlO1N7Mj94UEFFbEJNKXZ6RzZ+eypQZGJwOCFvUThPRElFUExWCitgREtreSEjQUo+I0dEIU1aZk5tKUZ5OGBHRztCTUZsPSVIfEJiVjI8aiVsaTY2fDttdXd4Jng8RHJ9IzwxYjEhQSNiWlRFWEo3KUN5fWtgCislSzRheHUlLWNRZCoyRDNoLV9OfndwfV9VR15lIWh8Rz5BO3UmMmZrcis5TUBveUVEMm9YeHArYkl5R3ImYmhiNUlyc1YpPWJrfHVYQFlaCitxUjI9OHJpd0FQPGckWlZSYkJ1RUBxJF9CUWJFRUJ1SzFxPnRNPU98fWpXWHVfYVBkSXF5Pzd3PT9rXjl3PDRabEUxJFhyZzxsYX5DdklBCitHcGl6KDtjN1gkYWMybW1LPl9DMXNpVkJnNiFHNF9BPktFYnxjQVRLel9JaGVFaiQkUi14bjdaIzFyNCskeWJTVjAwTzdAa2lTY09iK3JDCitTVzU7YnZ1JGxDQ3k4TFh0Zy0qakFlakBYRmIzM1NFMj9ZUVp2KlY1fCUlaUh1TGh7Z1lgPG5jUWs2JjlvOzQpYjQ0UF99Sz09PlJ5REd1Cis0KG9zMTl4R0RxWllvblBzWUdeRVlQUCshYXpJaiFqcjlYX3t5Vyp4YS0oMU1eMmImeSMqXzFtKDt5dWl5cWlqPl5GfHR0KT0rR1M/XyljCitsSkR8RGl9VDZKUFheNTVudXFPfm1DS2xlVlBHYFdXPklYPXNfdHBiOEl5VHdpPUlkYitiUVpkVEV0WmJKaz1LeHdQQzFkc3ZUQ2YmWUMqCitTdUhKN0VWJVI8MSpCIVNodGhpcT5kKiVSI2J2QSpFPCZ1YSorTUIhYFhtfCtDLUc+Nz5sOXVmVT9NNHNmUVEhWGYwdktKTjQ1WD85a3lnCitKQlohVTgoXml4entWQ1RJJHtpRnZ9d0hAeitzdXQxQj5pKTZRJHVxcjxzVVg9dSZ7ZSRMYkdjPEQ9c3BWb3coPG5kPVNOMFI1bFYmJT15CismbVBqb3lgdiRvZHw0Izs7QXJwJWpCeHY1bFRLV3QoVURnM0kkal9kKWRfPjUkWlZOKXAjQF9FYk1PUGo2OSUwbmJiKTRjKUNQNGEhUCZaCis9YXRXKSNrOypGS3A4IVNHeSFtWEBeQyRYOVNXd3ZsRVl8NH1UWElYbFdJRFdydmtJJXNeSH1hJjg7KjVoaEY+JGBzem0tUHJjJnE+NlJQCitBRFdabmp0Nnw/MyNrXj4+bj18WUBZWDZjV0d3Z1JxKU9LYGkmZWtEcjNicTY2ZztLc0xHZTcyeDxRd1dVOzR0ZzdgKSttLUpXVnNQTzcpCisra2FBQlAwMUMqNTArZ0ZUQ0AhaV9PWE0/dERlTHUrcjNiVSpPQkpVS2Z5KU51eGQhdU9MN3RLUWQzYzZpJGNsTmNpNFRpRVQ9Yk8odHI7CisxWXZ5KFp4P1Z9Wlo8R1VJSz1hU2k5MFRaZlRWcSM5RXUyJThzVXo/YV9ffHY7RTtmPiF5PXs7QnNjRGgyV3gpUWc2RF40WWVSbkhgJFV4CiskKEBSYX4xRU5VOEFXU1dLRl47QCV2fjMxNylOQUs2XyplKClJXmZofCshTkghWUo4aG5obEklJkNBbV5AMFhMUVdgTXZyZnNaSHArVH5QCitoVEoxIzh6N2BtR3glN2k8WGJAZ31ueSFhWmJpVnclUVlaTFpkaWFwPVVrdW8maXJVIzsoUXUkbl5FR0tKTkd9X2pTOzFmQnl9OEU2cmN9CittMngtcUQrfkhIdXY0LSFzJHl3em5samM/Snc5SVlhJkt8OT1raXB8PCNYKjBxK0BjeCstT1lHdlZtWnZtX0ReWnI/LUdxakVQV2MoPnVECitaaCZiY1RBSHlxQDElMnxuOTtEKXY4ODhqQnU+LTRnYjleT2ZzZll7S2VHbDJ8JkU4K0piZT0mQlpjQWNebEVmLUIyRm0pekVASzZWaEkmCitLdjFFYHBKJn1wSzIrX1k+Mnc2MUlqME88QU5EJnYmQWtBPTwpNFQ3PnlUJE1nV1R3NyhwNVQxVWM0fUZWTmU9I3o7amUwWnlyUnNJQWRNCitMQWBVTipMQ2I1QlF5MyN6SUh4Pms9VEVnOEpyN3s+fDVkTT9qYmp+ZkdMI2FARllXdyZjWDBZQlllI3hQWFVNejRnR29fUDI5JCU4WWI/CitBX2FfaGlvaCZqa3gmYXd6MVI0YytlQ14zcGFsfXF5cmFCLVMqPSUlblB+cTgoMloweGZgR2BSfEE+YkEmMVIoenBkLW4jflNNdnBLSjBPCitfbDFfXiRrQmY9QUVQeG1JaEQqKERTIUJYQ0NHVjxBbilyWk5PcSFGP0UjdiszQHQ4X1luQF4oV3V+KHZxYFc5VVAyK3stdEY4fFRhfSpGCit9UWZhPDVrUDZBQj1zTj0yOSpUWl9IZl4/WitDPTNZT050VGFIRE59UWdMSXFhOFNYQ2dKT0JXSmEpQlJjWHpeUVQ1fisqenR+N3NreVcpCitvQmNsPmcxZCVQfHIpI2N1dTFBX1ZTeXckVUV1Rj9FUiNud2RyZlZuZ0BSSiQ2Nk5eWXZod0UhNVBrdUctd1pLZChya0d+MUIwTTt+SSVaCitTSkFmME19djt9SSE5KlltX0RRUSs2Y29zK0lKSTcmR1JJY2RXSEF7aTk5ZW9gengmey1+U2YjRSZUQ3lBYn5OUH44cFphY0xjKkh8O34+CityZU5AUzBjS2R5YHFtKFI2MnpNJnd+TEkqYHN8M15zeTY/cUwtWFBHcSpPMXpPeyN+RjspRnAyaytxJGhgTyUwfEQ0cXdhfGhtNCF1LV8tCis5X3h+RGN7P0ROXnJ8fHBqa29OPC1JOT08VVlhTzJpa0A3I3lLcnJNOFF4cTQyTSopZl8mWWBkLX1efjc5Xn4rYzN3QSlYcjB4UypVfDtjCitjVihOd28+MzNNdlp3JCZXTnJQMGBnRzswTUphPiZoeWM8T30rUHBpeUs1RG4zJXlFWXh0WUJIWUpQd09OOFNFakFLSnEhRmpPZjltMEdmCis/SHpkTzt9d14kaTRVbSQodjlDbShxNmliSktBTU9WYGBFXjFwT0dzcG4wVUxPMTUxQzB9KkNiailufExQOE5UZXxYP01WSHluLTNqVEs+CitqQHIhWT99K2JQRiUhQyYoRTspbSNiaCg1bEkoQChodChwT3N+QEwqLXg0Z0lVbnlqcl9STmlsZUFVYlNkaikqTk81QmBYVDBMIXNTfSNYCitMNlJuR2YqYiktOz0wM3hQbHVyYWs3fn5NUEd3SFRIIytjbGc7IV9FMURnPFdZVWAwTTFDTk44UCVNKXhubWE2MGVQRTRuTTJyQ1Bpd2hYCitSX2p3YF80O25Udn11WWlxPEtQUk10R1lmcSV9XnQ5N0VHUSluJGRDakRDaj40cithfDlLT0RyN2xXSjU+cSV4YUIkUnNjNzNWIS0pZko0CitCcHdsPW16ISN2Z3g1VilnM01Cc1Vke2RGfXlMYExveDRTbHE7aXAqLTNqVE5+KV9TeT96QUFGRi0rVz4jJEopWnh0ZVF9WUAkLT1GWmo1CituNyR8WDVHZ0V6UzFvPUZ2X0g5OUE0SyFhMXhaZnB5JmpiXj1RdmJhODVRbXJNRXRuQD9aX1NGfk1efjRnTklAemYhXllQS0ErJTB1XjElCitxLXNKfWlNaks5Yj9vWkRyTldUSWBpZTR1amdVe1U5X1F5KChtflVpfmcrY1F7bG04IXc2WWh7Knx6bjI3QEQoTipvVz0oaGhuJkJjO21CCisyViZXPXVOUGk8TlhWKzZIQlZSV0l1M2xuR2BIVD1MdlBQT1VKfFJsVTtwRVQ3fTxic2ZZJVZrQjI9QHowdT5jUkNjJTU7O2t5OVRoeiE7Cit4UlFGQmI9en1LVk17MTg1Zj5wQVd3dHJBbWVzMWIjOHNkfFVnQT1GbDh9a0hFTig0TD9KKSstXy0rQUdhIz4+QEJBS3lmKjVsVGokQ2FVCitGR0h8KWNnIVY3PW5rPCZ8YiNtbmlYMkUkeiNeV3JSPnV7c21jS3k/KzA7MnRSMT41aktIUz5YbG5tTz0xKWorK2RXR0RCIytlcSljbTc4CitTKFJ7R35KNlhxKEluS3lnTFIoOXglYj9Na3NYcD0hVyEwSkRPZHtaNnptPG45O0hPUXhKIW8mNzNgTkZtd3lweER+WXMpY2o/VFVMWG1RCisoVExKKlZweWJHVTkxKkRQV2ooP2g8RWFaRWRQTGgtNXRfe2AxKCF+ODh1I3gwQT5UP0w8bCM4PmArTyFvTjZWUEU3RnUqb2FtaGJZalBXCitZQ3leKSVeZlcoJDFLcTd1ZVhvVFF+IyFxMDN7QkBqcj1kaGxFfTFEM21zd0tFSmJ7fEx0VElhfFU/eHQmOVBWcnFBKE1gZH5sY0AlOH42CitGdE1kfipQVW5JbF9sQWNQMyZ8VUNucDgyPnowXkJQUHZOWVhGcUJVPlE3dXNUaUd1RE9zanw4YiNub1RJPEJVR05EQSMkYiZyWl8kRWlACitFVH14cmMjNFhIKGhKS28payl0JH1lKUBKP3prZFlxJWB8PXkhV0chdWB9dE93OEFzV0hYWkIjM01wdnprXmRgSXxya09xdSVtSD03ZSNlCitQKD9iOTtQOVNAMS1jSUUyZjh3XytsWnJBNFNsR0xwX28qO0UpTyo7WF44YismdXpocDBQdmteY1QqUT04fDFaRHA5V0xRVm42dVlZMjNBCitKamlZQGdUTTRGaCpRJD4/QmIkI056MWoyU3wmTGd6YklsUUxkIWd6QkJ6WG05WFBVXnN2ekRPTmc/QyZHZlNHWno/UWAhXzNOKnRieVpGCishV2sjaCVWSVFDeithSCNJUkorKTVtRlgyRD1wcz9aNU00UEE1Mjk3O3JTTC0qeSQ3R1FCX3JJa1dnfFFFcjN3UE5TZStxWnA+QGhDciZqCitzdXJ6YGZpemNkQWdqd2cmIUNLO2hGUChsY2Y2YjYkQz0weDg8Z3spOTZEM3IqSkckcCMmd0ZEcDJUfnJhSStaRiRJUWdGZS1EfWpCRTRvCitiMEttbEIhN2lyQipucVp4RFVGX3k3U0lscjRDdnsmOWVnb09JXypMU1lgWi1ed18+diVxJDhNN1pDYEtfZSlFZ09qSD1gXz5PTlEyZ0hUCitLUFR5JXZhJDdDaldPdD0lRyliQytOPkJZY2hlfW95OCQ3YTtrUTF8YmxyN0pNRCVhYUUpRGpsTWwqIWZGczVXUE44S0Z8YXQ0NFRDYj41CitabTAjVHN4PzApVmRpZTFMST5gNXhsQDtXVWZ7MGQlYTRnQk9jM01rWVFoejRsWEd1UG17NXBJfC0tQVFnclJ0IVNCemA0eW5kS0A2Mzc/CitDPzt3eTRZP0NPZHhKWTBsSFojd3UxQlZGe29mMUsyaXo8X24hPWJXVTllNS1xZ1NVOH1vaHBmYjlyb1J8LU5iPjBDYUxHVnN6fnk4SjZ4CitXTzdeTCtxJSEzPTE3Kkd1VU9ecWxndVdxTXkkOXQ5Kmw9dyZFK09ZSH5MNW12Klg+MmkjVS1pTU9jZyVrSXRoTW85UGV2RUs9QmdsNUhkCitTQEh7RyRINztRRnl2MDB8TDt1RXlgbCFodzJEP3pUJVZEKnZ0UHlJeClnU1VGXn5qYVN2RHppeVNMVEJ2VFNxPVpGUlh5cnF+Y1EqVmpICitRSWBMTHFZI2lObHhxUTdDJHpyKk1aOSp5UX4/WGstSUtNYVYmYnlGKj8lbnVLVSE8K0I0bj1BOHdKMEs0MjhycnAkYE0pMCFodnpQfGkhCisxWCNPek13QXtZNHZJbmcxViVCVFp8dDV1JkYpI0x+emdAUnVFOWw9UmpSPnhxX3poJDIxeyNLPDlybSsxQ0JNa25XVENMTTZjaT1KT2w0CitfRkpCPkVxKU5aQ1RIREc0RyZIbzxrdk5tbj9lUERfbzk2c1REM2skcW5rdE1IUX1iZm1CIXNiQEFDYyhnUjh8ZVJtZEhgJShYZnw2MSMwCiswRWRfNSM7VXImdWBfTnNKaCFqNVQyTyFeMmFWYERwRVk4fkhaK31+MmhDXzQ/KkJtSTxOYGNRalYkfFNZLW82bihaRmk+SzBNOTlKYVhpCitjWDQrKXR5VnhQfj59XzFnMHxhRCs7MnFtUDE5Sn0+aGs9NmRMVzZSZFQ9R053Qz4/ITxJbEhHfG9ebUVxZX55PSE/VnJoKilwUWkqPGRSCiswdl5QIStYNEhTQ0NIcyZRcFNBSy1qJF5fPiZNczYxaFAzQnZFO3gyS0NgdlQ3SkNPXn0wSlomNGg8ezxPY1Ikdk9aQCMzQ0NfdGREc29YCitHeW1kNDR+WEorRnV5QHNTPSR5JEAmNXg0PD18Q0lqRFVaY3xlSHAoSz80YXU0Q1M0VGY8JDxYJHhuaDdKYVpQJVU1NXowNk41V3gyNkJNCitiP3xkUmtAaDVoMz5xVzRlSFB7MFUqXn4pdW9KdkNGdmJeTVZ+YFNoVHFoe0QrclU/STg3SGNwbzVMTVU0U09CWU9qRX1ifH5md1M4QmtGCisjQnFlaFp4cn1laFEkfH1qUTQoN0J0MUVIcjtDUFFkWmZaTk45bj5RVXNiZ3NrT2l2REFVUnhVc0teQF5WNWRnWDVwfV5YQipEJllRRWpsCiteZzdxZ2lycCRwUlZ2fU0wKk57QXY4LXJafCVWZFcjWkV+dG8ybmV9YVQtIWBmLW8oQXJNJm5gMTx3JkAhWjxzT0dPKVZYTERJbyNsNyFGCitgdnleWG9ndXpHfFRjeXQpVnYwV0xUPlUwOFJeOFkmTSYoPGpKR1EmeEskfXZ2KkMoZEs0JGB4UDdlTzhkST9yMWIkZkxrOEFaTlU7WUdrCisoRyZkWkJ7bngzS0FubT15dj41QysrKVVVcExpY2txWl56RFBlb1hOVkc8YE02PF58SGpJJEJqdDFDNTxoTSNfVWgjfiQ+Q3V+V1lATWJYCit6JkpWUEQ9UUo8b1V5PCZpLT1RMXpvWEg/PzEoX0J5PllsYzVPeVJ2QHk1TjZVeTJNQDB6aUgkM28lVCV5PDJse2QlYDxkKmc5YkNpbjRiCisjaX0+Ql5aPzQ5TG0zdTNHJk1mWm0zVFhkeDJOVUYrM29udWsrKz4tPWRlQkQ+NHd9RTRfPlQ+QHUwRl58MlElUTNPJV9BQ3dNa25HdGlpCis9TlVRe3c5a2ExM2JhR247VDtMfUAmWmQxai1ibUl8Z1lIeTYlSU5OU18lU1NfUUE9bGBaeXQrSkBgME4oRnlRbXF5Kyg3bUpRNzxpJkJ5CitSeUk9bEUke2A0Mkc/enhuQ3BNc2N8QSRKNE1IaCkhJUNxYHEzQG9PSDdZM2FKe15+Y3piaCVhfVNabkY8fnVYPkVAPTZVZ20yT2gpdUtMCitgNGl5R3lSK1YrfUZtK3ZWRWFTYXA4YTl6UVUyZTwtVUlZViZufTI1PE0pM2JEJjZJRVBqeis9Y3wjQE4/dGtBTyhOZzFecXJHbE92TTQyCitgXmZ1NktmTEF0YGxLP0lQbk8/JHd5KFNEdEhKJEo+aSRCNWd4OFI2NDR9YStDajs2RndpXztPIytPYDFKPzx6enhgYk91ckE8NTVLKmswCistSlhkRGRGVV57TjtLaShkfl40Z2c3QztWOUhZUmEqbnEkQzI0d0JRWjZ0QzY4Z1d1YG9lYjNkazRGNF84QGlaZGJkKTF0MlI2V1FMKV82CitjRmJTQ2l3QnB5aTY8ZElBN0dvPl41XktlNnRRRShnNitjUkA5fExSdTdiP3k9em8mPDlHKkUyfD1uJnolajlsfkJ7RFVBWXktek5JMT1zCit3X1pYdEdmNTlsKFpsUE1RZ2BxeGtSaEhiTG0xZSR8V0p1eiZfPHA4WWdXK0hZY0tQMzBtQjd2T347RV9rQGhYMWcwYnZOIXQ+QzFVYzAyCitjbVJ1MzlZRTM/Z3NTU3g0ZnlldjN6ZV99dnx8UHYxYlJKYyFDc3R9Y0M4QSgxMDhgTGZBTkB3UHh1Xzxsb1pYfWkwNlh8V3R5K1VjI0B0CitYTSl6ZCEhbnhtZntLQipXKzFeKlpqOEF0e2JfZl9vNVdNUTY5PCliX1Q1N2plPEpgU1pLYnRUYF92b1BMVkMjN1l+KF9JJSN+MWdmQTchCis5ZVJyKiFDeEwtdyprJFpZUHdFZSt8WH1ZeUk9I0YqNj5hU15scCRWKklgbyFVTX1TIW8hVXJ1U0VFSS1LJFFZaWN9UE0tcmR1PDVOaGN8CitxPUxyU3NxKShXQjZ0eWFzOz9IPmU4SHFvbCtVcEtmZDBtfWtoeGx5MEhkckZ0djwhKVN1QkN1SnR8Z0hqcTthKT84PitMe2pnTHN8UDlTCitCZjxmPkVoM3ZpIVB4d3J1RChedCtieiYlZG9rXjsybkRpYUhZV094ajZNVTw/bDZEPmFFSjhoYCtHMV97eWJtP1E8fEhJYU92bD1AU0QlCit2Q2tKQykoZiZGNFdFeUlSTTI9ZFl7P09PPkxoOElxdTlaZV9UKkNPUyRJKlpnMnJIPCtMKTVSYmhRKlgrK0lQbk9iU2FJb3dIKy1OTmctCittT1hzeXBNcWREbz99ZigkSGpiS0FxUFIkTUlEeXNQZjxfKGA8TXBMaTdkWjQmIXh1aDxCWSNpZUB4MWQ1TCY4cHtrdk84eW8mYDV0WWFuCis5P3I+WTFHd21VSkQ0Kn5rZjhYPmhMJHZya0dMWCVMYmctbHVJZzBzcF5TSzsoMjFfRz1QVkZBcX14Z2M2ZEpmakYyTV9CQDg4S0JSUjtMCis/ZlMlV2d3d3lsUV9HJnJYUVRiPUh1RzQkcWh2WV43WT5Gd2hZbjdPcyRjbDBOd19AJksjZWpCdlhFVkU8eUY8NHZFWFFybnojQkJaOEJ2CitBMURjVmJ0WWtlU0RzQFVxKlFxaEVGZj4oPTdXX09UdT5NcTJVNFFwRH05PE0zM1Q/Ri1jKHxXS3Z0a3pTIyF+JHxfYFoqaHVTME9FTGE+Cit+YC1SeHlZd2toZSt+THdeVFNsZDY3RjB3bW9fKjVtZnZ6WW9HZGRZY2hUQmtBJWMmX1ZNTVN9QjV0WSgxPiZRRkx4MT4yaTRYY0hWfjQoCis5LVI2YnFEaVY5OHN6Ky05OVF7bH1semZCZk84aDFGVkQ2UUIwdz85T08qdC0jamE4IVo+S2M4bDJJcShNJUlPOHB0SHhfVk0pclF+RDd0CitEWkxYMHkmbE5EdW1HaU88KVEtb2UxYkJyMDYoNjkpND5nb145JTVyZXh+TXtnZ308MytGUHVSU2RIaUdWLSVDLXNlWjZuR2E8WC1HZysqCis5OCNsN0xudCYjaylgZ1pmaV4wRVExWmlURkhhPTItNmVkPD5MU3pCc0NKUzg9RzVFTTR3I1NHa3NKeVE0OTxmVTVOeileaiFtbjhqJlBDCitKWitNOzMpYENiUFYqOUpqJjJCK2Zmaz18eSM0PCE2Uz0jX3ooMjMqezUwYXNaeiNnUzhSTEVMfXJjWDFScV5Sdz5zX0J7LTVWaWxmZTJUCitEOyFCYVBmJHh3UUg0TjFxQ1RPaSRSfGh1eDB1TERqTHcrZyM4RyFhIWdZaktTejFmUFA8SHBXdTdzTTA3aiQzZm1KSCVqeVFNTF9hPGR0CitISVdYOD9nQC1HZ1VhPXc3PjlGdHBJTzxUbnMlSXBCalJlRGRAZlViUlRPaUA2QDljU2Z8OVFWPzJgT3pJUV4qMCgpJX5aPGhwUVY1X0IxCitqSTBKPCR2VmdAaGk5M2F6MWkjTig5Mj87Q0N7TUhZMyVVMjRsZXNyR3ZQU0p3QEF9SCVrTHxXT0BvU2slZyY7Nmp8RzBebEEkdUdTSEYhCistZ0VtT2NYZTBuSUlCIXttVEkpSmVFU3x4Nj8hMlh+MFM5Qzlxc34yWHsxJUhOIyh0V1JuOGVfN3hLMzFjTEpPSlhpWmw4ejQ+TnVpPVMyCit4TjFXYylXRWI8fmU+V3wlKCRQVjRzekElUTVEfE9yQ2haJmNWKjFeSkNHVEtLUG0/O2J6ZkhwOH16PzYhNj9VcF9tJE9HMl8waFFyRmJMCitgbSQqMGJKdCYkaEBSUXlPV0NVZlJuSEd6bk1tQl9PXjNzVTgqMXhEQ0x+V0t0QlFtZitvZUk9XmJsUE0wPEdGT0JJOXhIS3smdj8+bWBrCit4SlJBRV4jZ3ZLdXpxOUVNdkUkQS1PJF5EV0JyNGZEYGVvdWZzeiZ1PV9UNUZ6Sj9saUkrM0NMJjZvMUlSfTw5SmNLUW1oPTZOYD0mLUhoCitHd3glRnsqfWEzJmxvMldYfmZPRkwoMCVJUWBEb3MoKUVQKCV6WU8+UG0oOCoyKWpHY09Jck9QVUk1TStqb2BeWTR9bWRqXk1UVD9wWHVMCit2NCFzMDQ1K0EhPzVDdlZianYxeWxGdHhmUkZwQXo/cFYtKkBBcCN4OG95aDIwRnxHUj53clM9Zyt2cDhucCFAXzlubTR+PlNsfksyeUlaCitVb2I4VkA1TE1sc3gtYGZ8Tk80U0MzU2QmdCFfT1BmUDdGRmt2KXV0cF8tPmtTeExDYlRNeTRzYVM/RnpBRzVJVClJPS02cEV0Mz8oTll1CitjJGU0R0V8KkRWezQwYkQxJk1DYjZianRaQiVPYz1BQnkhVFQzcjItSF9sIWE0T3tHIzczUSUmbylZRFAoODl4bzt+bGhlZiNRXyprc31rCiteY1ZJI3JuQH1oMWg/OF9McWZYT34la3R3VV9tKG0tUTsqa2k/b0hyUnM0T2NidnU1SkE3KD1sMjMyT0huKDcjSHpAMUdudEhMT0NBKm5LCitTZGw9I2JhcjNOc1VRNlQ/WVZVZ3tETmo+TlUxOStrY2xAbyVlPFZ4ZW49NSgoeX05UVRkRWc1MEtmRTs3TU12clFrUCl6bFdqbjsjQkNgCittblBLV35fWnpwI0NDJmN2K2s3UHIqT09zWjxeP05UV2FEJjhtdCspYDN+YGxZUjY5RTU3eVFPJWY5P2h9UytjRSNNXzxRejFiOFlVNjNGCitpeGFLSi0mbjE4QGcwZTs1bWB2IWpTQ1Qlc3Q3PT5WJGBTU24zbnh6YmpVM09yRF4rZ0tITiVURkMpQT5uPC1qISRGMF5hWFczJlNGM1p4CitmJlYzcGIyZiVJQHhwcSRwUlJUWHAoIVF5TzVSOG9sMVNCMXd1Xk4rM2R8TnU/bkpWeVlgKlFaamp6aU4lPUV5KjNneDJYNWpvTSRvJDxVCisxb3tRI2tMY0BaeFF0dDs3SDhCN1YyT1hBaiokbldHVmpfWntHbV9UWmJUJlByKEJIV0xCQzVpZ2ReIXNsJChNeDVTZ3lpTHBKKjRfRTUrCitxWXYoT3NCQ04kUGYhamxaLXJjVzk2a0hXS0NFPmhtJDk0RE03dC09RW11WlJ3dU5TWmRKI3A0U350VF8yQ3ZVQUhsK0h8az1JWkJYO3pHCit+TChwZiVJNktCVUZtNTd4XytvcXEjIzQ7djRieikzdyRzbk5lQmJte1FtbnlPKn42UitSY3N7cHs5V0QwbnRNazc7Y3RieypuSCp5JCRDCitxQ2pNeENsWUJYdVVBaDd8MEk4JFBmO3NaM0plfUw0ZTEjIXZ7WFhxY0c2aDEpMGZHWWx2PEtzIXwhNSlKcTd7dmp5YF9XWXpWZ1lmKGNyCit9djY5fnZDXm9ERU84ZW54LVVfO2wqfUIwZkdhNzhMYEJpSH1jWSExKHhNXiZ4KEg1V2slbU09PWZ1IUFDSyExTE44O3RgKndGTWhKKVJDCitNKDlYbWhsMD9WSUtWNyMlQiRUUHA1OD5OaE4qXjNNWnFuUS17Xk0oczZwd2V0SXh4VUAkQmRPU1E/Xnh2KmA/YHsqQDRxWjA7YFNkci1nCisxbns4Nkpwd1k+OEo3TzJJdFJgWFNaRkhvIXIpSDUwPjRWZCZqOX1zQj49VFdAQU1jXzJlaXh0VmF0R34jbCFZOSFhMWpmMmV4a2FkJEhECitLIzlEX1NYfW8hdkAjZStpYz42WlErdmhQPCZ0czt0TlcpcGEjZyE5VCUxKjVHUTh9REJmfUo2YkM9YmQraldfO29IQlNpNGtxUDBnWiY4CitNO2BGS09hdmUoKF5WPVJINXo7a3FqKmlWTztJe0BOQTR1T1NJP3x9R3hfTzhaekpgRjFhKzlpMWdNc2pffkgqRmtWaE53QEcySWNJbilXCitHOXI3PGxtTFliPVB4KEVhP3FtPm4pT3xMMHd7SkVlP0xTMGZzKlR9UnhrRWVKcVlCWEljZjs8WCZuPF5ZMXtQd1B+TSRWNmx9ZH0zZUJeCittaG9TRSgzSWZZPDhuJUsqfVBQKCZXSlZLLU14Qmc0MHxDcVBNPXJ4UEljIUcjbmBqXkgyN1ohRzJlcEc2fDB8a1BZOypRKXFmX1FeeHVyCitAWGpmZXpPVFhXTDQ/aWt6bUstUVI+ZSVPVlZaV3NmY3BTcT1jczIjbjd1NTErVCplcyhDRjs0VDNkJjZTczZzSFdhJSRwUHxNfmd2bWc1Cit5SD83MCQ5S0s5IVorKEYwejQ8WUI0IzQmPEsjI1NBciN0QlVSfGd6O0tsaT9tTGt7MElNa2RqPDIxWnBJSiRPfCN7Y0pOenRoP20hUW1ZCitpNm8odipHZ0N7Z00heWxTIURuMGc9OTQ/c2gwZ21DUjwpKlJLZTl2aTE7RnVmXlhCa2ohZ3JEVzZlNn0qbGBVYyM4SUBrVkp7N2UmPF9oCishckNtNWNkPk8lP3BZcmZHUDRDY0Nne0E9QmBXNVQ3YWJEVjswcyF3Kl4reGMzVHZhe3c+IV5FKCQtOH12RzspWVZZLSh7aGpWbVBVX3JBCitAcHlGXkFfelFhbi1FYGtHUUpOPEVtZFlUKl97aE5ac3tlelg/QkhXY1poWmUhR2JnTUFHdDxzPUJ+dVdOSFN4ejZwO1lGMnF8cCR5Q3NGCitIdTc2S2dBMD5sek5gRnVMSm5GZnYtX2ptMClVWlFHVDJUMlZlZGtgKjxhPiU0fGJWJkx2OVAmM0YrLXEmakI5OSYpPVAlTHQtfX0jeGhOCitxaWxqYiFwYFN5Xyo8Ymo+Rkpudk9AQ3tsMT5fKH19WGkhb3NRbXhCOVg/d0xuNUtMMDY2eyF3c3h5UTEleClQRDRyOEhMWkQ/ZFNFUCNaCit1PC01Ni1ydUVSNXZIKUhgR3t3anN0NHoqfEdBYDI3fnA1bzlsQm4lQ0xRbz5VQCZMfjUjTT9gO0MpK0NlZyFxfVpzaGhGNElOLU94Q1FnCiskQ0gyTGIlP2k5V0otWmJTYnkzdn0qVWNDbU15P3ltd0YzfnhEIShMRkhYN2ZeQE03VnpzU28/Z3hUSDIlc0RRejM/MlM7emhiZkt6YnVXCitwdDtXOXZGYEU0VmdndlNfQ3RGP3lwI2ZkQmVYaik2KjwzRkBNWkxGckk4KGZ1ZVd+NktWJntuSmZPOUk1TUJgN2g/MChqZHlWMVUwclNUCitCems7SyRYYlcwKm9uVHRnZUxRI2IkcXszeDI/UUs1R3N9Y0BoQ0Z+JUs0Z0NKI2l7OXF7K09tQXJBUW5LeCo2NzZESUAxKDI+czNXTndiCis3NXd9VkVoIT5LOU5qZDdAU1JyZ0d5U1pQQ0ohYU1BQTFwSkV7OUEwY3UrSzt3cjlQY3FrSXtxWXhOJjtgJms7cTNDJFNeaD5wI0ZSR3t7Cis4cmtAZUVZU1lkdTFjajEkYW58I0tEYylDeVJISjMjemIkU1pWP2l0em4/PGpsa1gyeSlJeH49Sk1LTDdTSkNYRHlCSzsoPEQkbmBBcGhCCiswYFY4Z2RwfGlLZlVXT3JiazdKbykjNiF0QGw9KF93eUhrVD1KOWZwVGVIdXxiKEF1RjRadiRwJTtOQjN0JVdERCZ6cFhpIUMoJCFGWnwlCitpYXxEMl55QV5YQWdXUGhvXyNtOGtkPDBpXlhTTCRJezNScnBvQitYcX4rZmdmP1pnOHFIS2h5K3R2aHw3ZmlWTktfa0lJfExzWXdJJk4qCitPO2JBPExaUFZ7bz1+WXBHbHVTaikleXU2YUp0cEZ0TkAjMWNBTmFIdEx2ZXwhUC04NDBfXmlNSkdRYkppR0ozRGZZX3tpZiM+QG8tPG0hCitfbGtiZ1QmJjVfQlhfb1RyJUg/XnQ4SSgpSlJmOW98Rn1QWTZqZjRzUWkhNW9tUThJM3FFQyE0JUdIIUNVSzVgSXNnUz9TfXR2PEVSUWVeCit6Zm13aG5zNSNYKXpGbT9ARnMqRzA7bzBKamk7WT1sNi14P1Y4NSUxYlp5bFdydnU2PX1FXkpqa249IVY4eHItenFae050S3JIZ1lDMHJoCispamZ3K0F8ckd8RzsxQ2p+IUg0JFJeVXxBLVIrVy0oV3crO1BrTXo7QmVEYDVnZSNFMioxeFREMW5WYzJlc31lRXRQejlvYjZQcDJVc0g0CitwKlV4VW9vKVNmaylMSD8xSEZ2XmVfTj14cmVQaiYrfmNPRVkmaVFteVpJP3hiVS1yV0R+V3A/TX0rQmJZI0g0TDEyRylMZH1+Zig1MXFuCislY0ZkKk8qc0dtak9RYGAhWXtmcGMwSSlvT056bmNAYVFyKHlvYzhzdSMxRyh2TzhDeyhET2dVWWc3dE5BQGR6fGN4U0xCV1dJJkhXUTVFCismO21aengqIT1icVhiQDFrZGZkRiFDWU5qd1lkcTdmckJiTCR0fVprSE9WcXc0SjIxV1NJRmlRRnAjWlluR2poejc+TUJGc0JuSSNlOGg8CitLdm9hSVowJU96V3ZTQj1DcTZDcW1oYjg9MUVaa1d1Ji1vO2oxdXVHWWljakh+RWUtWFFzKSVfMFo2MTRmamY5dHhJalcoK2IwMXhsSWZxCistOHI/Qzk8RDA4NkQwNV5tViRUdE1Eb3tFcE9yYEZzTT9saHVNTkBlNFlFVlhNKEFsJUBqUkg8YHo3UHE8VVdANFJFajBxTzRkNkRFaVUtCitwM2Bobk9nfD53X1VkNVhBO19DX1hQZlJGOHxnTlpwfW91e0hiNTlLSjkjfStgVXROMU1senpqZHtnI3RFfF5td0pDUzRPYWM5PVJffGx+CitwNzZvaSY7Q197VXxvYjQ1IVBBISN0bXxKbj1mfnBaflNLcD0oSUM+QW0yP0BVQ0p+JGE9OzRqYFMzbXxfSV5JUmtLbklxUmI3R0F6PXNTCitWI0szUEtgI3JeZVBxTjw9P0RzaFA/UGIzYDRlcHQ8Mlk4T29mRHdEfiNSVTc2Qj85YD5ROXBATig8KUBiYSg+cCh3UU5VVTQwODY3bmY/CitlYTBEciREejhmeDl7ZWVsb3dyPk5tJjVYJEhGYE1tVWhGSHd+Y1FBPGU4Tj9QaldNMkNUN1ZeVUZ2R2kjP2VRX2ZGQTFyLXdKcERxUm98CitqMWY0TkVWTXI+RVMzM1NtMmJ1a3tseSpwQ0Q3Qk1KbDhaOD5xY0pAXnRiN1h5JW5BSXJHJDZNbmdpZEZtKFphP2ZkPkBJQ2M9e0h7STlUCiskYVZqQEA4SzgzRzEoSjgrTG9fPnZtbnJXT2lHb3tzbGZSWDB9TyozOT19OTx1UXcpNnUjKnY8TyV3QWJPLTczSU5nUm92Ymc0dU8jP2Q0CitqQ19vPlpCPyQmWkVKNTZWcG1ERENPKFF2R0ZRZGBoVSZKTFYqbk8qUTVYTF8pMXgwRjY0WTNWKWs4S0h2Qkw9cmd1NkRQbExxaWJAJVBPCis3SDZ5VlhjfU1KP0RRfDlAcEx4KEpnSFRVTU1HSFZ5c1Y2ajsqMWdranpWKk11Yn5jJFBVaDJzbzN+fit7JXNAVXFmK3h0Nk9URDROK0diCit5TkdZSCM0PjZEUGswODJtO24lQiQtNmgkQl8wP31XKzZGKjlAR1BoMjlDIXdke3ZGMjdod2xHTk1LV3phQTA4R01gamxoLS0hOTtVdVhyCit4QjVqYnFAQVcoe2NLOCpsZUYoTkF7ek54ZV8pKWRPUlN2Y0g1ekM2eU0yT2hlSTloPmU8cmBmNjAwPStFOSgyI2QtbjtEU2FKRGxyVyQ5CisqUC1GUntQaX4zUD5BYHJyWTJ7Y3V6SktuTysqMmI1a0c0bj1gWigqb3JeQzlxVXB3cGZnOVRoKilFbFNed0p0S2chdD15dklkdj8pTllMCitkN1MmLT8oYjBoVG0ycFN6aEtySFotIVA2aC0tPnt0OTd3TT9NLT9qUXwmYmRoNylydUVIflF1I019KGVQLVo9YmhTRDh4Q0RgRC1aXmFNCittI1A5eT5ucXFoUk5JUXNmPlNJPldKfCRoeUNnfDUmN0szMXhSQmUmPEJ5bStsdnhzWTM9K0whbk9EQUFUSEVLekU7LWdvPXdrUTFPKCVwCitRZCpHRD9abStzfEpleDBnJmBEVDQxNFdlIVNJJGJkWmNQO3o9WEZsKW9iNyNPRVFrVUVBV3x0WDU9XmlyUE08YD12TmBfQmUlJGpjKXRYCistPik3b2JzQk5YdkBeUmBjaWo3Q01PQ2cxI1BWNGgmSVU3WTdGT2xuPF8+S2pPdVpVQ1h4TkUlSFZAZDNCYWdwNXdIJCliQGNNMypvbiZJCitla25xWX59WUZVR2BqREY+TDBsOXwtMmBuQDZ6cCZYPmJRNitWfi1xIShFNnkmeTIpWEJwVWNBI2ZXNmVJbistLXo9SUJuNUs/NVFPI3xXCitMKkJva3tDXjEqLSVPMC1PSyZoMCpwb04rMXZEPnRTSHhzKzZhc2dwcHZoPjktY0BMS2BAQDtmRFlgQk98SVFZJGphMSNwelNVTk5IeXBWCitkbTVGJVRkYzQxKzRnZVBAPSpIQTZzVTIqYXNPVypaO3YhPkozbSFWdEBHRDZHO3NYI0VnMWx2Y2khaz9qbjB1c0wodDVfV25lb3tPSkV9CitHJXVSXihtN1FjfmJfSUU0Sy1FNF84TXg4MD48SkU/ajYzQHEzKTh0dGBQOWpHPWZIeWIoJFg7a2RYIWlUd3Mob1ZCSzZYWldabXNrWWAtCitCWVdkeCtqKG1zdEgjR0MhY3dGfVpscjVUQ2VxLTR0PXZHWngyNSslRk99cWVNMnlCQHNFQ1FSZ2VFbGEwKyYjWl5fUVpiKzNQKVAjZEQ1Cis3YkpGU1R6OypEb0x7ITdyQnhZd2s9IXJqRDxoMWgmXytSOyY7Y01GVTZpISQkVDV2aUF7a1BzNkY/SnpiJDk/ajY5VHRUYX1Wbm1CO1MxCitESE4tNCV+Z0I2VCpGYSZyaW9RcT59OTUrczZFQUUpZlgmdUpJS15NY2t8dDR3V21hXmRLPWtNSGh2NDhyMTtTRjZ1RipFSz5QKUBeOCljCit4c0Nkbkg+RSVRSSlDQlp8IWNsaHB3d2BEZzZWcW9vWEdJVVBrTT9IQ2Y5R1czPW1ySnNiQkwzPSpYTE4hK1lzXn1PODFlbWxCPHQydjgjCitNVVBYdWNNMiYpREFsRkJTPnlXJG5kcTlARDFpO0kzTW9LO2VQUFVTK2NTYVZ8IWB9aXs2MndnLVBzTikob2AxcWtyQ35wb3dkbit4VSkmCituODUoaDFkRzBHP1lIJjRWXlYrK3ZLQURxdj0rbzg2Y29reit3ITQ0cyQ2bDBCJFJNQ1VNTS16UHB9R34menNQcWU4JHp2U25rKXQtbT1oCisyKDBfIWAjVEtfQUZGTilTaHkmRGdfeC1QYXQ7VFlSX1VaKlo+OTlVV2pkKXAqT1NUNSUoeVBmVTlAUComRjM7eV8kbzJMVEJ+NyN0QCpUCis+Q0srSiFSUXx2MGpRKGQ4LVdHTChafSZKZkJhWXRxQ3trdSE2UDQjKmF2TDlSZmlzKFc0ZnUpPEQ4S0xRcE0zfmtNa3omTXYxdmBXMThFCitXdTR5aEd4ZWlmRHwyLXN6RnRPXi1gMDIjMV4kckNWJiNTZWgoQTlBYU0pQXdjaCM+dyE4a2tzcTxgTHh5KG0pRSpNQEQmUzVob3cqR0IhCitZMSR9c3FLRD05X2RyXyp9MDVpbkhudShHKTFxN3J5RmRDOWFNN1M0b3E/Tk4pYnlCKWhAIUJXIyRzYnhrbHNTRTBscm0oQUJ3UkIxU3UzCitLYFFraTs4TDA3SmJPdVpJbzRqQT9rT1UoNUluZkV6IWs9VWFtPCVnbmZlSTJQfGFmJSh9WWNPVVZTeTZ9YDd3SX4wSEJ4NTY1XkVQVlIqCistOC0oVmhOekljKFQhezk3UzdpUCFwPzBGdkZYWVRIKHFPdEMlalBaYDJ7TihVPW9HZnZTVTVzeUtPbnBiKThxSDdgSGJHJVR1OCQ4K3liCitUdXxBQm8qQUc0KEdmZFB0P3xBdUdqQ3RnUFAjUDxXPEB3M2V5QV9nezcya2cxTFRRb1BzJH0tMDk+b3ZUNW0qZ3d5NDVHd3o0fWlLfT1pCitoQ3lsdF80WCs7MThjfSF6aCs0Zj5CQnZfOU19MVp+RlNqbHEkX0A7TlZqR2BGKFhYMTdHck5LYmU1flE0Zjt2bjgzcm45ckZ1bFRjWH40CitxOTAqIyg5dEZKIT41ezd+Znppc1QzREVZSVRiSHcyNyUjWT4mVmVkPWVxTzh7YyYjPWhJOygkdXhLSkYtfkN9PTF5akxnX1RraHJDbDJGCitNfjUwPk8tOHh1OElhQmNeMyN5T292UXg/TC1DdEU7JGNuT21FO2x9Yy1mN1RPUyhKcGJvPSZVdUZjIUtgMlJ3fHhIaDliVFRacFhZaGJiCitOMkgtaHN0alZOPXNrcDFDYmpAI1o8UlhYQTZXU093LUFtUCFtTTE5eVNyZ1NtVUhnUyVPKGklQWwwaTlGfFVyaEo4Jnp7T3hWVTUjUip6Cis/Ynlwaz1odFYlMGpfb0dZQzNVWSgwKXdeTzFGOTt2M2dxd3tyNzRkSFFmMGtjSztYandoQ3JVdkNTXnlpXyl4KXBVcS0jYH5GSFg2LW5HCis2SCF9RTlZLSYze0FFcyk5ZVh3S2QySUBSUU1jej1ucTdiTU1Aa0grSCZXTGBNYDFvUT9zTDRAaHJWJk9BWlpBXlVOPF83VCVtcCR1KmpRCitGcSlCXzBISXlhOyZzWGJmZ1ZsKldxZ3ZFZjUxT0R6MWs8bzF0TVB8e3JuVzBLY19GTDRXcDJee3lJeSFWfVd5NWUxMTB6KUdmXyRqZUF1CitnR3RyaXp8MmFnfCFCIS1zN1o3K0dNQC17fiY3Nz1tKm0pK0t1fTAmemMkTmIoWUE4JV9WU1k9aHszNHM9TGRtfWclbDhzd1Z0OyptTV8wCitPfnFuXns8e000KEdmYlNlK3trI185fCpFY1h5aSl1YGUyX1FpTVRCNUItQ0JXJlNSalVJQVRnbTUzfmF7dHYoSnFZZ1UpU20lVGJLNEQmCis4cmlEPXNhM141WSpkazx2PXR6QWE1eEt1Sn1DdXFZJSoqPEVJS0lYdHA7Y1VDdkpwK1l4elJjcGxTSkdhYzdwfjxNTihiemJ9UmE5bUdgCitCSiF0MSZVOFBkSjFnRF5pRkFUNjdPfGtfPWJ3YGhaTG4kVzVNRkBlcHhfflNke3lXaVdTMWhtfEx6d0RZTTFYVV4lM004Qk9ReTMpSGs9CitzMVE2cFIpYnkwQjU+JihkLTE4JkJ1QEdsbXJtPzsmcVIpQCVsTXdeTkxfb0F2LWQ/QyElbGx+OTF3V0kmeGhPIz1iS2w4U31gYTVheHN5CistelJ5NlRUJEFnMjNOQUQyIVopZHpvKlRyMHhBOFRkQ0h7fUw+WVohfklUTkI7eGBiaVZoNVlYfi1yajRASTZ3YmdnbHh1NVktcFRCfmdRCitQZ3RHPSVVVVcxdnd2akxpLSpLPm5BblNoe2FLMEBoRyV5bV9MN2VvI0A3KjVGR1FeYy1hN3hfJi1pallZdz9TZihfZnFuKjloQ2leeCV6CitlZ285cEg/UnFBLUBxRTVrUlF5fEtrb1dzNHxpd0xseFN9Qj0tMjxqU1lkOVhaKHZ7aU5BdXNuTGYyNEw9U0pWYXdpUC02dn5PVlhKeEtACitXWUY5U1NYQ0RfaVRqZmA8M0UtN3VQZlp1K082bCYqWXpYQEVWYHw7MGBSYHpqUDM5OEVQSUpDQjlDeihya0VeZjRzJVM+PkBpSntqVmVFCit2SChINWFScCRGUU53MH5LIXAkfG9jUW12MUB5UiRXQS1YcUhTI2JkNF8md0VVKzQpNE5NNHZ6QilqeFZoaC1qOEdEWnIyNUdRXzB1ZUBxCitzRDZieDJDUWpaWmYldzs3X0tKdn1BSHFifXl5I2hCdVk5XnhBd294TEBVKH1mUDhoZlFeNmdXaE5ocG9afStwfj4hNVRta3UoXjk+KWwhCit2M2IlYHwlI302MjNoM3Mtb2FOJn0jRTQ3RVVqJDd3YitIQikzK192UCF2MllJcTZ5PGw2KDJJRVROJXV4MVlyP2k/PUBUTD12fUFLNjtSCitsLTN6YXY4JSpgPipFK0I0b3JgOGUxYmBuZyt+NlJpNUB1T1RXMlVNI1RLN21MfWw/PVUmRVM4T3NwdF9tO05xM2Z+XylARWE7SExZfWs3Ciswa2d6UEZjZEZESHZQX0twKTUlTCpreWpJazNHWDAzQTxCXykpYXIpcWlTeWlOZyhsalNlLX5YNDhoO1RMKjl2WCZSWXdxQzVoRCV+MjZnCitoI0BzMD43P29nOGxINCM4d3phb3krKFFzZX1ie2JNLXZuN3RzTjFWV15HOyFrKS09alZfZEVCYTB3LWAjVipVOFBLQj5BQmo1cUJLN3QyCitxMSpxRHpgQzJtbGk7aj1lbmlEeXc4LVBuO3Q/WndtWChsTFFDNTlNY1VleWZLQGdFfWRiYUhBKEdAWGxYOF9HXnlLOTJAdWxKQ31Cdyg1Cis4aSZRT25XflE9fWd4ZFI9ZmZhOHBINGRIRnJRfWd5ZVlHeUJXNTRTfFV6bW1lbClabVYte2luIVE0MjJ9eFo3XnphakszcURkQFQ8aCNNCisyKUV1K2FRcDAlMTBGYT8rQ3lvUWFVOU0+KUVNWGFmbSNzQzUqWjZwOUQ3VipgKUd6Kip0aHh7NjNwZUUpY1hBVzE7WHFBNSVZeTxuYzB2CispVik9I1hmWX5RV1ktIUV0b2x0I05OWTx3b2R+I2c8dCVxezBrJj5NRWc4VTkhMnRHO2pNUW5iNGw7fTd1Qm8zZGUyXnM4NEojb2U0MEpHCitAckRfJTF+IVBnO15XM05KfHBKfTtRPz5ONDlsJntAeSo7T1dkRVZwMG1MK0BKRjNkU1g4Y3t8MW1qI3p1bCEwNTJkREQtI2pILX1aQ2paCitDc3UxYmkqLTRle1MpTSZFPVI0QDd+V2MmcyF5TFU8bkJZckhJJCFQTFdnOyZUejFrVHRCPG51ZVBscXhUekRfK3paIyp0PWJEUXleenBpCitYT2ZDWFd8RlN6KSpIbEJnJT5gV2R2LUF0ZjN+dTdCNzZKPVlheVk4IzJxVUdVMSR8SUImUjF5cVY+I2dtdVo7aT1jMiUlTV5ORjBmaT11CitxJWlTZiVNPWRLVH1tTnR0KkgqdURZfiMjWjQhNnZpMlpxNzBqeUNweEdfY2tCeUJxRjJxOWp6T0ohWWhaVWcwOHU7MEIjcWMtUDw5VGVPCisxc0stLXI0ZUt0VWhVdVpPLTRRMl8qUDkmJkhIPkJELWVtP0M+Y3dtaF59a0xzTHNyR0tCaTQjRjBTSWt6OTNUZHIrOGBNdWJoMWptSVE7CitlSXU+Q3heemY+ZGI9Vl95WGRHeTdfVFdqPEAqZE5NaVByQDIoYSRKeEVRIyhLdGQmNSNzVHRFUkgoQD59a1N5TVlacXZYN3x7V3xCOTQ+CitvKjx7LURyeHhiPntpMTNnWkJsWWE9TVZ4PjBOQ3tWRDdiIWleX29WO0pIXndrUyQ1ZFRybGRnPlJ9UHp1I1dMVUYkPTw/ZXpBdVUoPk5oCitfVSZaaVdqbUBoU0glRk1DfGIkVkItR1FRNGZrOXdSJHdVaG1reUImOGBDN0FjbnU0QDA3I2VXdTMrRjd1e3h+bzhHVHI0RHM7O3ZkNy1eCitLcj96WTx+P19iOSp3TiRUR3BmU1h1Q2BGWHZpQHt5THpRWjw5YiZ2JmE/O0lebDEzRFM5JnhPNipfJHkwPXt5OE9Me2NxYFlyZEtnNTRkCisqemwyZ2w9aj8rQCg8X05WSypAQz5kZmMpY2gtRn4xY3YmbEFqcFFKREV1anVKUiVwdSo+ZyEhUDAhcSRhdjxFbiF4P2UrflcqbzYmUDtACit9bnYmND9SOytDUHtseEpDIT9eaUlRR3dkK3leKDlwP0hFbz9+dUlTRiVIUl82bFB9akd1SWxZWmEwUnY3NG9MfXRQbyhqaXV3QUZGV3U7CitvV1hTKCloUC1nRitfajVXKUZobkk7Uil6aTwmRkdQbDYrX3FgNig5VmhaLWNqZHNvNWg5bm54QEZMbzNTVkIoaUVCSysyIUxKJmppT09yCitzYzZ3eSUmJTJrZ0k4a243ZGhpVjxNN0ZieCgzaTwwTEpZUGZ9K24tT2dsXm9tRy1VVX0+WTA+PHg+cWFnc20xTSNBQlEtayNnT247eiRSCiteflpHPF5lXlM9KyhLYDBzKU9kZk44fVpSJmJxIXJGQlopYiNWenNHMnNuYjsoblZ2ZTYqO3xvXjlsTip0RT4oS154ZiZLNGo7cDJ5LT9jCitmUWA1JDxCYXVQWmU4UkkoWG9DQSl7KXd8dWA9VGxLZiYrI3ZgKWd2WFglbiFyYitMU2NwMzF5MHJJVDRjcSRiIyFjQzgqZCpAUHl+QkFWCitJeVdSfXhkLU55cnd7R2ktPiVNc18+ZVlHUGxSNWdwfCQlRlUjU1Z1M0NONTtqTipBV25+TmJifWcocGc2WVI2WiViMkg0WmctbzImfFNECitkbzFSb0JlVylWPnstaH14Sz1kZk5NbCtuSzBvP2pnVWlPfkktfW1pUzVtcVgxLV5NOW59JlZpbkZecE1EbGktT01VKyZjMnNXaiY5Z1lnCitte3t4R1V+LUBiZ2YjQW1VbnluLUxUbX1RXz9ERDZfWldjZ1E5Mj90SVVwYUQ1Xjcrb1lnR35IJTAlckFQajAxaD04KD40RUkraUkxWCVZCitFZkBBZSNSIzdWN21rKEBYe2dAVG56bHF9eHI/cVg9eGRJZXQrTj4mIVUwR2FOezVUWGEqNEhTdlJ7b2t2QF8maE97P0d+bXx8NCNBeSVzCitRJTh7ZVEhQmx+PiVtPHxNU3hjMmIhKHNLfSFQVFNXJEMwPmJzT0RMa1hJVVorUlRvbnkrVU58Q2JOZSYwcChlVDh7MUpgT1Z7aXo3ST5hCiswTVZFTkU+XnZDVHgwZGVyPkBURiZ3XjhhSz9FJD5aVDw9bCFKZmd0O3QoWXgmNEM0U3MoR3dTI0RxNn1OcVVYKT1BX00tMHB4OT4mOCVECit0ISZHQGZ3VmpPckAzOHV4aSVIITJ2clFTRztsI2tSOFc3dkcrZyloI31KMXNoViQ/TUUzZWkyVyNXbSFpWV9AakpCSDwxdFVTe2lxXnFgCitQNT5uOG1xKjEpUTxffGwhU301WF5QPzZsZGBIa3NUfU4ySWlHbyZXTzJuaytNZClfeGhIayFKKzVoe3t2S159WE0rJlpiIzZqQiF4eis5CitpY3hwcHZLWTM2bmo5eEFqJmx+cm5eK3NlN0VoKzc+Xm5uZzRffnBiUSgxQ15TNnFMaXgjRUB7KmJQbDZ3LWlIcFlKRj49TH4+dUlEUXBpCitGez04cnNOWXFXMFppZFlYYGw/SHxjeT9KbTRgT35hNzVBfWtfU2N6cVJlUnlIcWIjYnVkUENfQ05ZSFZ9ZnxKKHFZRjgoKndTQEpgeyl+CitkRjZ0cFBWUHd3YFZCYEt0fnI0ekJ5eUExY1ZefXoxUEZpKkE5YjZESHluVyQ0Y0o9P1hOb3xvbExrRCt2eipsQ3o8RDgxN3w/KUZSJnlGCitISTt5RkhrXm5Nblo1SXxyZn03JWA9SGotaE5Pd3dMUG0jP1YwRFRXbCR1KGk9K1p5enFKRGc1RVArT1Nzais7PXA2OHhSVSspZ21UQ2FtCitCOSNZdDAtS2doeyU0MFJ+ZEZQYjRBe301MUMyVyZEYiFhRj1AP2V2dGVoSCNxb187MEtASGpVRTRZMnJjdXF1YSZeO0RVITlDYj0qKFdSCis7cDF1WGAqSDtKYiNhYnZUampue3koQDFePjZlRG0kI1VhfSR7JC1NYDw1ZCQ/QjErfD5NQz44UmZmXyk0anVQeHNRRiN4T2clNGBZbFolCitwe2NfR15qXisjQXVtMHZAPDRtYSgxZUdTQ0pSa0dTNmhWb1d2bmBUbGBSVWtwRyV1VWRKMGxeajclZ3VDUlJaKzE9fT5efkVJZ31ubzl+CitDWElXPUNIPCg2YUNpa1poT2peQzttOz1HWSVuTW1IXlMraXw2ISNDdVpOfGhZT0hxPGRrRSFHc1ZAbnFWR149VjlFdGtzV2M4Jk95IzZwCiteQkxFanE5KlRNQ1RXcjRTb1pJSV83ZFBxe3YmSGw8UjxycW0wRlg7KXJRZlYhPG5URlFRPCM0QWt5c0lkfURDRlM3aXltRGxvZ0VpK3BICitVOWkpcmc9bWxjQzlLcyR+Ym5kX0U8JmZSPSteZ1Z7Sj83VGUmNEF4MS1QKT47UCQmaWZwNSRed2ooWG5JKUFJcH1EO0czfld6PHl8PmlkCitydE1GaW5tPHY1SHY0XjVsTXY/XjwwXjR5PnczamVMdW9PdzFsUGA2RHNEMk9KaUllJFQ7ZnNnTCRqbkR2MD01IVE/Z1FTU2N3RXB7fHMtCit1Y1U1STtvaFlUYlcoNEhjem5+VHRxfU5nOGgmbXptdWcySGNiZkxDfUsoS0lZbTYkZU8+fGMkcVp3VG5WaVNAMFhrezZwO3I8IWhKd0trCitRVUl6dXoyMl5Wb15WN31iTElAPENjbWEqQUFFS2lmUmlTPHJgWHYhPGZqPj1zdXRKdVkmNTsyIzNNZT1fXlhycFV3anRWb0JkWkluJlo7Cit8QWlteFdkVE80WSQwbHhkRXh3dlJPbCteUWQ+R0t7Vl8/WmxweFZNMEFwR2V6QDd7VGc8JENjZmQ/I1dJdjt7VSM2Z3BUVHRBVEh8U1VhCitCM2NDV0VRO3VKNldwU09va281JD9kRjQ5O19RQ0hlRlc5eXt5RCNYMiglPU5pZENmX0ZFbkFuMSNhS1Y+R3sxVFVuaGdZTTwpam90VXMhCitNdjhyXlJicm4/KUJyKCZ3d1pOWTFiVzBoa1o2fTtxTjJyKSowPFZAUj8kZnpPbFgoOVdtfHw9dV5KY3NRRUJSSWhPSj8kPmQmWT9DbWxVCisoP1pvRnMhbSo8MGJGcjx9OGFyOVMqKH14Rio/SmRRIXBAaygmUUpfKEdzfCZNPmBBQHZkeyVCfFpGT3lDJjJaYnlgczlxck1zTXAofEduCisoTkJHOSZRKFZkSWZTPWQxO2BfNHsxOUFBYGJiKH1aaE1wKC0jKzMrT0w5OX1qPUc+KWRCIUI0LSlNaXB2bDdXS2h+TWlDYW48bm9+TlIyCis+WipKYnkhZHMkMEJXcGp8VWlmUlo8SF8lbylhbWtVdm1lWnhsOUZ0dzNJZnl6ITRCP0RSOGpTXlg3MUcyQnpWVSYjYUdVOX5rYikmMyRGCis9fHRibnI/Qig8KUhLM2ReeD5Xbl9KWGZCYmJhKEpxJWwwTkpIOWRhQ3pDamxLTURYUWJ+UTVFcH1VdVh0YGA1O3pzWTFgZ3ctM0FQP0M5CitgQm5TaTNOK0lRejN7V1FMR0tSX3xMWDY+a28kMDhePVR+TV88ZFBAUWx9Y05PakFrSmFRanNSaWFhN2s2ZmZha3k7K0J9Tn0/aV49VE1qCitERk5XJWUkYTU+WVl8NCRnPipjVSF5UjcoWmVgfXUwaXE7NyNDUmx+X09YLXJWTCN1MCltUHRCXnc0b0dkNzBsd0s0Kz41JD5DI1lCK2laCis2QnsjNnUwXiR+bXZYZSMrX2ZTcER7cU9sWU5pPCpifWkoVWttUnlpKGBpJmIyX0FvaXVVPntJKHYqNk5kRDlhUVd+Uyp6YT9zM05fcU98CitvJXhPSFhaNDttOFBhKENmQGV1X0ZidyVDNE8lTj58JmREclJ5I1Z+WEJtOCZndT4lUWtkZG1AS2VmK1hoTlFkbS1NQHlKUjZ2cWVTJko2CitPbll5Yz4xcmFpMj90OHNDaDBxPmBAYjhFfXl5I1Ntd0N6UWhneVFsWUAjdGghVipWS0ZpTCtGaXw5b1ZXSm9ubWVxcjZHfW1pSXFjJEo9CitYbWl3NUZ+VXEtcilgU3Z3bUs+Pnl2NVloSjZvO19nP28hdEEjdEMmK3AzV0JQXm9MZ2RQOGFSQlVaPSRud01KbTk/OV9gT15qenAyaSR4Cis9Vn07NHF3Nm9UVmZzPTlNJVcoJFVBYWBCI2hESiE1Xjg1K35KM2liVlR7NjBEOSZSRClnVXtJYkEpNm1SV2JZe01SSUJtZF9BN3cqd21QCis5dEYjO0Z2aD93UEZkP0c0b3M/KVg5d1RkI2RSNHkyflpsayEmSlZsXk5jLXxmekBhaGBFR2gxQVVKbik0ek5kTFVoN1FucitoREV2ayNeCitpRjloMHFQKlJOfHg0YSlFOT9IKmBCVWdEITQ4VE4qQTl7KjZmV192OFpPK2UleSo3bmR9SHY4TGx6dHVxQlhaPDMqJEx0UFBUNSgpSm8oCitFO2BNNSRnU3xYfiRgbFV3YT5OYXpBOC0jbHQjdEFZbzJqbXNlbS03aVhZSyQrXl5wZl88c21zcWZ+IzU0Yl5YZUlfYCojQWFBUiNqdn5YCitiNmVxeXs3VXEmQj99X19uTFY7JUxUbCVQV3c+fSkqZ0h8PDlpZUZ9UDk3eEchPUM3TWorLU89PDwtfT5RSVZCI284ZFojfDVwXllWO35PCis+OVJ6S2tPPlZIcFZ1ZSslP1RLO302a29peklmXk5ueig2YlM7fmRCP3h6fTQ7PEJYQTI9X15hYmNOTW9sNzMlcENwPXJnKHYwcFRhPFpgCis/ZVlIMnltajJec0szX3A2OEBFQWpkMUg8OThHeDNmdHdPQnxIeDlmPEhuJktUXndWTHxzbFpGeXBoRV5BPSpCUSM3JiFGVF5WI1gqKmF1CitFXzE0bjM/RCpKO2NkSCY3fXxHZ29Ca0ZufG9MQCNMfEpOI2pkb0AwZ0Q4SmxKUVRPcSVCVyFwXlRJZnZ8IWkxUkFAYXlzWUlCMl5IUi11Cis0ZTRJRmhYP2UofmQjZ29saUxpUzxsb1lJS0g0X15vcGFCLXNLI2Q7OTJFM3UmY2AzPnsldFdgcVYmSSs7cFVje1pFUXQtQ2R9Yns+bzRXCit6NEg3KEhFdFN9ST9VcV9JdjslJWdDPDxHMSZ4b15HPDspYHdPVTtFZTV9TyNNbHU9VzlSQTFmJCtCUn51RUl8SFczWlNTekNXaDVaJUsrCitqUmcyMiRCODhnd2NZVz1SQXJjTTdsb0FXMnkmfSV4UmtgMSsqWHRaZG9qM282YXgkMXtpMXtARlp9UzYjYFlhWGVKNTNoMiNGQ20rN30kCisoWFRkfSR3PT1ebENZZ1BMKHY4cnVZMjBmKEZxYVJ5RVJjaiVYMEA2QEs+YSQoQiR8ZChvcFJIV2toS2xeJXhPckxYdnFlKThNbyFWPEJiCit0TGVfXnp1cFd4ZVlNWHYldE5VSyM5TXZSRWpeenNaR3pUPGgta25Afl5SJlNgUmFJRkJyOVBTMClRWjtOQWE+Qzx0c3U0SG5ZSDkyYVg/CitlQ0xvT1FCZD5HTDxneT59dX5gUnRLZmNHfjk3dFl3RVJNRGR6U1REfF5rWUk9TCQmZ3JYM35hZTIyUnc0eGxVRSlhVDspJVVqNEUoVHk3CitRWkcpYW8wc1hGXkE8SDY+aEBnWmVvRm1OViVSfmBhdSZQSE9CY3MwT1Z5ZH5AMzJ3ZFc/N0pQJXAmYlhfZGFTby0pISEjclZySjFPfTx6CitOfDYoPlp6cWNaYGs4PXt0R3ByQCZzXi1QZzItP1M/VHxnO1N2ST5vYjJ7ZSFueyUoTnc5ZnYoe2chazdwK20+b2hrQmU1cDdHXkN1VXA0CitvaWFNPypOJmM3e2V4UnRXMFpnT1lFTE5Sc1YhQ09PeDR3XytQRlpabEAmdVA7PG97JTEwZ2E7SE16VFVrNDZzMFNoREV1YVpMcFM1S0k+CisoUkJJaUZ6a0RSc3Z1aygmb0AlNXpUcDFnJHRaamtZPkl2NCkqUStxNG8oQ09wX1UwNWZmRGE4eWp3bFJSMipNYGxfbUQwWUo0QTxocE14CitHcDYreCZYU3hUMiNMJkhDPURWRVIhPCpSTGwqayUjSjtBKE5zO3x2bHRRJmtuXj5sJTV7Qno+c3BEKXFSdXJSSXF6Uzk+JHwrfGUkTHcjCitYIV5PVkJ9WH4qczJfM09DczRLYiRFYks4QSZJVllPRnRfMHNxPCRGe2U8dH5KR1lNfGslbSYtNUN7Rkxee1IkTl9EOSFaP2FaeGJLQ3xNCiskOCUrVEZJNlloJElYZiYrJTx0SWArU0wkMTk8I0ZHbz9hdiM+YE1ITShEXz5wQVk/NThEYGowKnVWNUB1OXtyOX1ONUE3OHslPygyWnFgCitNT0gqQjd2KHxjNSFtVkFrIXExbXdHbkNiWXJDRmd7T155dmkyKWR0TkRQX2A4Yz0pcjc4S3JkI3Vqdz8+az41SGxWY3h6bTdJKlZGRGJ7CiszX3AzMiktUVJKZVE4Z3BmX0FVdEFOWWBUTjZQN2djTzJgXmZHaVJzZD1ZclpYUlF1SSQ0cThTQDRiQ3tWb2BRPXFESmFESGAlWWx2NCFNCitzY01Aamp6TXxqJmtDVSZWNFRgRmpKQD9SOWcqTzwqTT5RTCtSZ2BuREFDUHxGSUlob21vfEtYTTFNdlhWQHx8dXd2WktPbmlBUFJNUWtNCit0WT1+PHN4OD9ZdyhQRlNIKjg0XjZkIyZyTSEjOXVNfF9SIz8zTmB1O1p9dyVtY1d8UDJ3YD1VVjdnJH4/NF9AeytIcVpiWWxYIXFTTWh+CitucT1YN2ZwcSNtUjhwTnRTTVlNVSp8NFRDazJlUmFEJEtqQHIreEtmRi12JWE+eDlePlJhIS11LUQ0fTlYP35zSkJWfktgdz9fP3g2eTdhCistYVBoI3t0ZyowMVFAJiY2K3RhdD80SSF5YUw7Y0JsPGE4TytFbnNOI1J6cC1rMWlibVpvbyUpVkF5PnQ2NGQ2QXtfV29aYTtaamM2fV45CitnQVBidl9eczttIShTQE48PyloWnlHcVh8T3NBcjZJfEF0MjloXnJiPEpLYkdrSFNJVlZVJWx5a2ZePFUyPThMeTxGYm1ne0RGWFEodFVnCitTbT98PDV+ITNwZnM8QSo9dl5UOyhLUihzeFUpRXcpMHpRI3p9RSFse0Rqe1AzT0RQVG5ZMCpYK312bi07aWVMV19FNnJYM1chXj4hckMwCis9QyN1N2duNU5EKk5YQTdHfXBzeWxWLT99R2ZTRnJFck40fkd6K0J7Tnp4MXo4QlZoX0whcEs8RHohbHcjP2AzfVN9Y3N4ajR1ekk/V0d4CitBcSpJXmpRaWtFWWttNkU7O2pFUXJvUlY7IWw0Y3ljY2I9NXlWd2V3MEdnZF5NbUQwUWw9MXRQUFIoeWpqJX4+ISVEJE5eVVVNMDtOVko/Cisrc15rQnsrWH51ekZYTzEtRXpeZ013bnZjT2VNVmk7YVk/V3JMMlJLSmJhfX5fdCgoSHR9dz1+em45M3N2MkYjQWgwNzg7I1FuKU5YTWt9CitVWlF2czBRd1ZFJE58I1J0STBxJlhEa3owIT1ecW4lciZJU1M/JXI1Vj4rSkooNHdQU1pIb05IZWF0Yn1wMFY9YGImbDxga0lvcjh4YGNiCitaTiVuSHxLT3xFYG04aG51fXFNaz4rSkVNQHNXNW1fd3lgRXpEaHtjXiVBdyghMnA/RktPTmdiTnd4e0VNV2ZqN1YlbDNffDZMPnBVajUzCistcjU9K0ZydHYhZXNBWX41ZCR+TDFgTClpbzF7eDF4JTgxUFBmM15RPFpgb2dTdFZVayRZcjgqUz4oITF2QE1XK3gzKHBPMCMrND5mS3oyCit1QmV9ZFVVMUZ0NkQ3aFMjRTw+YkNJSnhZV0Y1UlV8NnVFNGJFJjxYZGhGbzVmRjZVPjsyOGRrTk9QNlp0bDBgMUJOUzY8IU9GcEA1a1NfCitiQU9BKXl8RT9yKW8+MXUkO2FrWEBPZTVSYDxCRjlxY1NVJUkkQiQ0QWg+MWRuVCExdEpgWmRZZHxWVjZJflQwV0NyeVZZOTA1YTBLMXpYCitlTWxgPmY+X3k8PXVkMVckRFFYbVFrK1BoflZiOERNdDI2WCkxdjslfi04TEF4OFR3OXhwbTc4ZlNzbC16RTlGblVrTGJsbjBFJDRScHpxCitzVmNfUWcrSmpWfEQxdmp1ZnZta0JLZnsrJFB1Z2d2b0lqSDtSO2VwX2xpbz9kSEwyeUo1IVlSRUpST3NLRGEzKT1KSU5oTyl7PHg1ejhjCis8SWVtX3FZc2FRM0Q7RjUzPUZnYElTVTF+XjlFUWVPYV9gWiZHVz0rZFAhQlNeQ2xiKzNhZiVybG8pNzhlKGB8TTtsdHQrTSZ9R0xOaGxyCituSi18TnMxaWpnVEshak4pdUBqdnZBIXdGNXkyYlR4PWV4PntgdmtGaldAa05ZPFZGOHowJiZGUmMkPGRFTGJ1fG4/cFAkUillY0ZUd2dOCitqI1MtdEhWTWBBd1k1UjA/WEtOe313NXt0QiFFY0RLPF8kR1g8RURtdSErOHd1RFZ4Q3BHWHRzOU9ken5QQkk/WT4jMmdYR29vSHRBKCtTCitscjBsJVZ+VmRQT0AlcjxpPT5zPTVRNzh2UXFtQXMqOyZxdFUtNzVPWGJUO15uJHlRKkx0fEpuLSN+Yjl4a0tsKjV2YlUwYjBIe0RgPWltCitMQC0jbDhhQDBlMlk+T3BwRlk8MzM3OylKYV88PUYzbFYmdUIlLSMwKHNpS29nZHZxaCpWNXlhQ25tKHVtekIpdz9AM31Uc0JuPG11UCVWCishcyNJNHRqR3d8Ul5RejJfRXF6bmU1bU9iYkdvRUIyYWNhUlc2Q0pDKCV4SHopSUhqfWxGNzRxTm9JLXtnRzEpemlPeUl8JWdNWSF0WHp1Cit+P29oST42WSZsPi1XVEpoSnYydzkkekdQND80X3ZENjdDKyhrOHw3ezgwUlBxaUYxNkorX2E5eHBwSnolc2JlP1h0a3A1KnV4SF5FYzZCCisxfFdJOSg/WEt6Sy0jZ1hySVdAYkxJcEszX3c2RzgmMXFNKGwwSS1gek1zWDc3JGsmOS0jM1YoNHpiayk0K1I0O25GPmN4PGpMP3BWLUJfCitpUHtfTHA3YWFwKj51Y29eS29MI1h8eWZYZm1jZHhnZ1RNOSlnK3thRXhBQUNpa1k8MldLVDt3eTxjKmh3NTkze0hUcVlPMG1jWmdHP2NjCitrR090dHtNciNpUm5faWNPcFoldWJUV3YlMDB6Wj9sQzZaWGprdlZvQ083ckB9elFIdEk5bkY8c0wydHZzN0g+TVlUTnYxdVJGI21XIWY8CityPmhjOWF2S2xsaShMX0ZMc1BWSzY4Y1B4dDh3Qzk0KTs/aVcxJVA+JEJPTG9TUH1YLWp+K28oUFJxcXlgakV9RHEmMUl8X1h5NG5jQ05eCis2bkNnZSppanxDWHQ3QkA2bUBBWWxsXyFpJG1ARjh8YTFAJGA+cnZZezZLN1RDI3pVbipUUXBoJFZ0TmtzQ08oKlI1NnsoM18mQ0dKaTFFCitGbj0/TEdZQCszdV5aS1JhS2FTP2NiPWgtPSZTMHdpJmd6bGIkUGRnVVk4JWlecG9GayVJJChPWWZYUHlwdGladXwqIWNaRDRnMUpyO1JlCitSJCZPaHpjUnF0fClTWSRSMGI+aylAcVgqTHEyOVpuYjVPNXVKQTk7fSEwKHluQS1De1l8Q3VEfCVtX0dHemQmMHs/SHo3VEJoKytpcnxFCitaaUBsLUgtVT85NjNqPWZlLT12YjBxUEcoKUFZYFc0MTtwX3h2X1c5KksxaClVPm1UPjZgRnkxa0FWJXs1Z0JrPyhjal5vUDd6MW1vQSlVCitqK29paV5wVmxrU3o+SGhzZXxtKjlSKFR4R0hmeDYxQCkqIz4qKm9kIWtYRmZ4eitLZSkkeVRvNmlve3FsUzhRNnNOMjJOLXFDNXhhamtNCispN2g7cXJeRHhrXitafCZJYU5keVB5MWN0OGc0Z1pWKipjY3JzanU0fFhlYnE4aEdVcHRUKHAqWm1RTjBHI0Q8VnhOITFTfTJSK0pUKWtXCitLYm93TChHYVYzcHJQVEpaeVo8SUN+SS1SdXA1aHBHMGleLSk+dTUkVzQmZDxiKFRoeWUhVk1pRWxQWWImKGthe0UhJUVTQGR5VG5PcD4mCit3MWQpWTB0Tk5BWnVwRHtpTm5SYFJCaVBeY2FTSWs/RGV5LUZAI3Z+YDAlNHI8e21mXlM8T21Ge1hNSzBXPCsqWjVjfjB3UikkUD9PJGg+Cit3eDdOQGoxdy0hYGd6d3gxdUN0MTJiYHtjXjlHajk7fk5DRFFqX3YtfEN6c3ZYQjFGUF9fZHtJdCpMKHgpeTAjVG5gTTdPV1BJYUlPI1k/CitXMVhAP2l+TWxXQj1xKjszPDk+MXVtUDdzSilLJGhhTEBxdGYhVDJvJTBobmJ6fVRoTjU/bmY4NG0rT1Vjb1FsKUoxXkliVGkoOSkkbGRsCitFdGJBOCNyRVF3XiVxfD8ydXokNnhMRVRHeU1mPXY3T1RPVFMlcThkUTRmRWNqUDlmZ1dvYCVXMD9LfFZQWXdCU1ZKV3A2bFlQbkZHOG5ICitYQlk+KHxnamx0VFAyMCRuSW9gXn4pO2FwWEUhcSVefSZlbHNRZ3l7XjBGdkBIb3YhNjcybURickU2aG4qTDRFe29eWGl0I1BLNkJNXy1BCitGSEFgXyluLUU0a1VmU0VAcW8tTz1fTHFgJHc/KiFyV0RsSX5vSWdqWjFANThFfEZrMlJWPystIUIyWHNCPVkpIVAlcSZGXkZrdzJ2bFoyCisjZ3syS35VZmQxc2lXZTUyJlYoXmJzdzdYSDh9N19zfmRNUXYkMiZiQCZIYTRGfDE7TCh+RHYrKkA0RjBNZDNATkRZTW1URCF+UUIwe0xkCityYXw0dV47QmxAVEE2KmBxQGEkdzcxVGF+VFp2UU9QKylVfFArbkFRczw/TDVfKj5uJGUmdURnNEFHPiVVI28wWD1ecig9TFNIKm9CbVohCiskSHleP1k7dXkwV1Fod2VaOCErQldHZXlnOSkkVlckeElJJWdZJmFRdF9NKXY3NTEhRERYJHBtZmRpRn04UVlGKG9MTU8pajskd3lBLTM4Cit6T3l5cjBRdnk9ayFLQmVPUyU2M0JXNXpjTi1SU1VBdk5BNyQpMSZaeWNAPV5FZ0ArdFd6SXc5KHMjSGs8V142VnlJIWUjNmZGO3xDQXhPCis7NSEzM3JaZkU/dE8qPEc0ZmIrX2J0YC0rOzwjWHJfTl4laDt0akVsZ29IZVooUT5neylAY04qI0tpeUxtT0hScUNiTyltJjhQSnFlOXN4CitubW5+WGkxYmVXMGkoQXlCeGNPNjYhYCMhTjZnc25qPEFHKFRFS29Ne3V8S1hvVDlvPjBGWkIxaCs9JGlNN0w/Jjd0UT1qQnlfU3ZOQDdQCitvYlA4aFEjS19GITxqOUQxfXltezNuTGtIc3s1KyNzRHVqZDY/MHVXKXYrcmpiKmxTMT1YfXtyUUEpTmdaPDxFfiRNYyU/NTw3bFZUSns8CisteVR4KTZkdG57antNbW49fEojcXpwYzhQQWYtd3ItcStwaFVjUE99MCFTeERPRClfTzJLUGpqV2woNHNnQk5lPH0hQ01yfVJqXnBXUlNJCityVWFKeiF2RTllbTxWT3NeZURMNnBFUTNfdEtWMlhrXjF5P0VmbDdoUHhkfCR5QDEtO3M7ZD13bUA7NVk/dVJxemY0P15XPEExdmVfVkwmCisxWHpvPmNJQTE8eHRpcy0xKmc2ZGEmbmwhOWdqWiV7QkAhTU9ecVExRHA9LSUjKjwxIzE7Iz9JcFpRIUVnbm02ZGJTTUJuNCtFbjVFenkzCitmYHNRMH01X1hhSTFvYzc1cUBhWnhwPHNwbnRIIU0/TFFjSG56OSl0aCpXKSR1UmNyN3p4OG1DRVMhT1ZiZHFfWlJ1Vi11ekNPSG8oRGIrCituaEo8dkArXjliYlVJZV93ZSpZNEUzZyEwK21aX00obFFEUThKb2lqU3NLZUAxdVRQcGdJR0d0VktgYkI5O3AtZzlhQXVrZWlXUWRXbURMCitBSGpxV0J5ZnBnfEhrPjZlaXdsUlQ/ME9jKlYlWT57N09uLSUmVF5USldtQXFCJXQmdG17Z0FJd2diIWY4MCMyYitDYX1yJGF9VDVXR0lFCitjamwmQHtVbSprOU1Dbys9PSltKWZLZ2w5TzVwZFZaWVFXejZxV3V1VURTVXkxYHk/T05DUFNnVT1NM0d8eG5aVHVWO2clYFZvRmw/ITVrCistWSROflFtV0I5JlJoenhte25QSDdhN1ohVmlud3A8RFU+Z1MzUzhxJEopdyh2PSVjLWlhQDYpdW41ZVRmQGRgVXNhIXxJPnRqaFJWfU94CishRmJmQEhiTXZjX0xUJTw8bD82NitAO3RoPHhHJWxgXz5pPFhSfX4yemVXJkR7JSoxel4qeyNXRzdkSSRzQHsqQkUxfERVUSg3U2FAUDFYCitQfHlabVc+YzY5IXI5MHwqPGY8YnExNV5kP20tZ0xUc1hQJkdxcVZ4PHE4fWpMMjA2TjNJcnwlamJmU3dQS2d2WlRoUTZHeW9iOFZKQ3xiCitFZ2x5eXJacHxpSWpnJiheI1o2UD9EXnQlUUQ1PSMtTzhVJWs8RVhwcngjdV9KY2pXOFJhP2Z6JWRufjBoTVVfdjElU1VvTFBqQy0pXzFfCiteTVA1Qm4/cUM+Kzs8Nm08V3FfQEQycTEwWXo+RFdhSCZyKTJ5OTU9dVY7T1U7R21ma2dndk9NUHJOLXRtVW4jKnRhcFU0a1ZvQmsqQjh8CitLT3tVejhacW9sRF5oRDMpRU0oT2daXj5TalpWVDYmUngwez4pQFk2ZEczbT05S3hDMmM0PHRyUmNDZStWMEsrNDliIyslZ28jdlZQfCZmCiszJThvZztadS1CMWBWK0g8bC0wZyVyflNoVXNweSheNWF0R2Aod25DJXJrVTcwZWJqdXxUQXI/ckl9JFljVUAhe1haaT1qZE15RHs3LUV7CitnX2VGcEpxNTR4Z3Eoem1fQktvT089dC0rVHMpVWooc0YkYmNQcWF1I31eQF9qR3wyRTIpbklXZThiKCFANTw5cHJUPz1qZ3FDdClHYk81Cit9LV9ZSj9pWllWNVA0LXklV1h+MlU3KTlAdkZJKTxRVUJnRGtOeHlfZzl0c0EyRTV+RGNXIzNwTT9YOHRQTiFlWDdsfDR7ZCpMQEBITENQCitNWj59ezMzd3AhWlREZj1wQTReZWlidlVnUFdWQF8lQnIwZ2xtLWRSaVVZaWFNSTwqKTRCbHpxQ2djaH5hIU80Xk5EZSMraU0qfjNwc2R5CismUXVXdUxGKl9vY01vcTJaX083bko+PXZVNnFNcHpNakY/aVl4MDNDMF5KaXlLNUFyP3E7cUVSMjNlRChTYH0kXjxnYXFMYDJwaUd7Q1F4CitlWEZPbnFOXl9CbFghTDxRejVMa1NRUiYra156bnF5Sis+eXIjS1dUKCFLMU5JJDdqWTluM3pgcCtYRDwwWmRQKlk4cmxPTWgwWEZfLSg1CitIdUd5N1Z1eztOY1pFT3FfKUZiPjkje0MmO3VgO18rNWYtYnh3SzVQezx8ZVcqWUxhMnI7IUJjOGgjI0VfLWx9V3xMWDdlPSpPPTt7b0hOCit0ZXBnSmdxUHd5RU82aEgmeVF2SEFpRC1DPW1uPHpRRXhZVVBXIyE4cUQ9SnBydnVnRmRfcFExQWZkfCg8XnpiOChLS0EkJT56O2gtPkdqCitWJWBgbWAtfE10UiplfUN5ODgoKTZxKWxJSyQtbS1QdV9TZkl8PVo+OX55TFJ1e3lLbiEyZ05OUkg+K3N1MGp2aE9IOys9UWpkO2YhenxOCis4S3drM2FlSnYjUVUoYDB+ezB1ZkJGeGVeY31BY2k7YXxge1BlUHxNRnx5bmZrTm0mUl9XTEI0O2BlUGNRRlFLS2o8YWUqT1YlNDFxeXkrCitxRG5Bc3pYU31QTXkxUz9iaEFjcWkzKCllZnN0Yj9MUSN3PlZibT5oWXVNVjVqa3g1SEJsbypNdm9kaldeN0ZBdGhEcnUlLUxEbHg4OWFCCitDcFJ6dV9KVHMyZWVTJVhgRkdxclc5QlclREp9Y294blNYPCNzQWF2fDQtLXRVKl5BUVQmJnFMeyN0OFh7QjtTNSpIMXtBSUJEe2ZzVyhpCitVZSZiRCZ8MUpDZnVpIXVTZDtIdyRMc3puVXghRTZSVnlfXigtcCMoVWlUJDE/X0VrO250REQmR1pEUE4jaUc3bnRXQlk0Tz9BVF8rN2BLCit2TWU+Wm40e1lLSVYyeEZpXnV+STBYYm9JTk1WVTAtc2o0cWU/PmNAb3BWQnRQa3h6SEd6LTArd2IjQTZuLUdQJXglOEpHNTRQb3VFOCZBCiszbGNZZXQmdVdQPHI+SjtwdHhOejZSI1YkT355VWQ7RkF5VjhrUV5Gcm5kcEQkTVRhK0V6JGo2MmgpWjxFaD4zT2hAelN2OEREV2phe0pYCis+Z1ZGWCF2WFJZSXRnUlk0flYoJG8lSEpAWCskdF40MFB8STttcENwZ196WTh9Snd9dXkxZ35OKWtkOUhWSFJQJXokI21panVwfTZia0xgCittTUc/WTRJdzVBSmwqWjdmLWFlX21ZPGZzbVkkWjU3TjZ3R0kmI2pPayVjYVNOfmg7KVY8SjY5ODBPTz5gSlhzQUokPG1XQiQycTdsKnBKCitmKGxYfUUlNVZ3OV4/N3B9KihhcGdAP2YydWsjRXlITyFuRktMUDlwKW8rSHdXeDk1dDJIe307KHFZTSZMMyh7UVdvSDQ3d28/NzV5U2JTCis9KHV1e0lyMytXP21xPjEjOTdSOF5CdzIlKHNCTXpJS1lPQCFscjsycE83aTIzRkBnPlYlUTBUR3x6Y1NLdUd1I31lKnJoRW9GSVBCRHdrCit3IXdMcHEzJEkwJU9AQEU3cn0mQ3ZEJHJlKWAqPWdwZ0pPU05UX0tlPG1XJXFXO0o+KC0xa1RVPjV0VWNuc1VGLV8lMXt0Mm10SGRDNHtkCit1flFqVWNOb3c8dTJXMWF4OVRqUE13YEdGMFYrJm9KdThYcTFoQnhWaDU0YkMoc1gxc0hoRUNqcCM0IXglUWwje3gwIWp0PztNQXl4RnJBCitZdm1FPld3QlZpQGVCKjZfNWwlJFFBeUslXno1NE9ATSVkdEd+Nl9iPTFRTkVsfG0wcVExZ3JFKE5oVEshfU5NUnJ0RXM9cXFTK1JpaV9fCittVVEkZE1jLX5jZipWNXdsLXJrZiRTeT5yMSlaeVg5TnlXPTNiWkViKnEtbih6cEU1fkchcFVvNlh6e1hRaXA0MEt0Z0l9KC1sciUoZV9uCitxNkNGJWRXeVN2e1JaaXBTMj4qPldsTz5lQC1QSzZzV2JXblBaWVBjSDhYLWY4LWo2QSF8cX50byltWVFSPDZjcHFZN18pUFkzOTB0bnc1CiskeHdlUD0yRT8zfDJycWI8KnZtIUZZcSVxWXI4dilmVzw8IUNNQilMZEJMcEdnOD9Pd0JjPj0yTzZRaWk2cmlmLTxOe3hQcHctYllvXmctCitXLVl7bGopQGBIbFNZUiVfMk5wOyVMMHhvPjRHQUo5b0EqUXlfQVFlX0A4cj1IfEBgWlJ0Y3R4OztOOUo1N2VyZUI/dl5NMTBFdSRVbWM/Citwa0BDQ0k/eypgVFpTPVQpLUkjSDVOUCE0UWBvTnctKTNqbmg7Nys2Vl9JSCVoQX1Ud2l5X2srQi1TN3NgV3M3OEsyPUI9USp4QnomNiQlCisqQ2dMaXhBb0JWUnFIXmQ1USg7IWR0VzxLJCQ8OUBiejlnTkRmO3JpX3NlKHlGSXczI3NjNiVOblBDUnJnJmRWbDcmbEk8MFdjKyNBd2spCit1KygzVj1APTZyPzhIdDxKS3NscWZ2emxPaCpQeHJKZzthN1R3VjZsNGBSVi03ZGoye0ApSmIoTjM+U3MoPFJHQFU0PFp4O0Q5e3FeTW9TCitlTFFxUCUtdVFWY0RXVzZMfmdxMSsyKit2akJEKzZzLUs4RlEpVFdvSF5RPUglUHZfeTdJO1dAUSpQQXgkTWooOyVqcjVEQkt0JChXTzt5CiswVl9FNUIyVW5YXmhyS3RSNlNFR2Q1fG1kR2c7TEpvSHVHanhGUXdvbjJDc0pFPSE2TyFRKCQmT3JaQklPN0g/b2NTfVRrM21PTElITkZvCitQSlR7Q2Eqaz84Vyl1eU5vR35kUUNuTDJtVzUlXnA8MGNEbHQoNiYrcEZXRlMqKDI2YSt2IT1tYmJyPF4odlAqOVdIPVUzPjZnRURmTHlFCitmPSlfbmJkUk0oSSF3KD95NyZwN2w7S2RBKXQoYWtgVXclKipVKUNrdnpgOGBYVk88SkJZT2t0bGYyP2d+cGh5ZSh5d2lvVCZ1UEheSCFaCitITzJsRX07RHFRRU1WfTY5TnVEdmc3QThCQ2loWCZUUnNxI1BPVGRCfFlOb2tkJll2c1hPUDRZK3o+Z2RabD8pNzZHWjNOUj52eVBFXileCitTcXNGKWpUVWRvczM8LVhramdBYzMyWXopY0kyLUd8eURkWXhMQl9OYGReYlVvJGtnTTN9I0QqN19eWHkxbCNJJHRtNU9MUCp4YE9UJCFDCitwQXhIe1RqbHo0KUE2SGtzVmxvdTAzbC1lWV9TOXBHRTdiZkElO2NxMFpsZmBSanQxJmdqcEs9fFJqbUM2RjEzZjV3Nj93VmtSJGokS3ZSCitLM35feFUtRVNkQGltZ25sTnh2JVdGWCFYRkFUJkIhPXdnJG8qbHkyey1IRUpKMVgoJUlIKSEybiFjQkhqb2liIT5VT1g7bUh6cEROJStXCistdV98eHlvX0xUPntHWmFBY3RQZSNmbnNFJF5ZTElseDxeRXN0flhmRWZeR0RzYD48ZipOJH05MSVBaVojVDspPTg0UCpWT25KXnd2eXokCithOHVXPTFMZDdrfEs5d3A2eUtePVRxaHg5aEFMdTNIIUZzV1RfUCpzQ1dCOCtKeVZASyY3cXRYajxEO3JJMnVOcD05KEt8emg4M3JARzMkCishQHh5aHpAQ1NpN01IU0RaSVNHZ2R2aUE8bFUrNDt8d2MybEQ0R2RxYWIoKzhxbjMpYkpWIV5ecX0qSj1nLUJeSnJ9Rkgrblo3ays5PUhLCitoYDtZQklgVVFpRko7Z3omaCpWbkppVVZGOEUra0MtTmtqcj9UbGQjVT1CVkk7NCN7KD9MKFhZUngpS0F4UUxlN31fcGh0Smt7RHpPMXQ/CitrbiU4NGBmWFV9ZHF3ST14KTVJJExpSWdsaVhSSiFCPWFQaHRGQjlIKjUjPy0rSUNleiN8KUpMYFRpKz47bDNtekt9ZChmY2MlOENeVXd+CitwbDRec2lKWFlNbSpiYUo2RDd0bEJ7OCQlVDIrMzspbEdtJFA3aFBLPjw0e19WNkgxNVZMelN2O2ltVDR1JS1HSkctT0BxNUFGQXJUJjdYCitLY2Q/MCpAeyN1UmlEN1QoNzhPeC0lTSNaYjEhUHNLNWNVSDA9Nng1MFpRTXttYGpyMDVMN01oUElHZDVnPih7PVN7VTVWRlNpUHYzOypJCitrTCVVNTlxOD5UcnpzRSRXI2MpaVltRiZ0IVhgN2N3V3loe31mQWsmYVYqMioqfkNqbW5ubFcrcU1HS0ZuXllvNFZlPHRhb0hiKjg4VlV3CitJTmtrOWN5M05IYXtwT0ZpRmFfRllfJkU8JStBTDMwN308WmBJPDh5YU9uMjs/RVN0cDh+PkhALUFHb0A1LSNEQHhoJnBlTWolQlRINyRWCitIUzE9M2pkZUBrI0pXWWslRFUrYHZPdmB+PGE9eE4lZzByfWtqOSZmODApY14rRkM3Kj9zXnMmOE9RPCk4cnA1ZGtKOVNSVyFtbFY2Mj85CisqWC1HP3gtO1VqZ1p9PDlEd0xhIWs+N0RQRDsrZjxUang/P0M1N0NuaChAWHBnQSUyR3BaSip5VSs+ZHBTT2xSRzdIP2hWJmhAfEQ5JEt+CithM14janlASmtUSjI5ZiRqfEs5UlMzX1IoY31Ia1kyVV5YMWNmP3tTKGxKPml5SzQ/U3g7I2xZSDlVMkl6KlRIcTk8NlJ5P095O00oYVI4CitQfGJzSUt7PXpSSkZAZlhZJFNTJGF0Pkx4X0p3dWMpKDw9NFhsS04xTFZqbjN2WUooQFZUK1ByTzF1QyoreXp1RClCODV0UitLO1RfWG1HCitGK3c2dmklanRLQkJpO3Q1WlZtK0U3QE1KO0llX3VGQWJte185b3h3fX47WVY9e2EoKj9ZVzN2VX18RWJAQ3ErPUk3Vms+WkdWYzRTMlJ0CitNezdrTF80Wilpa3ZnVnA+cVJeY1V+VFg5T0FfczVUU30qbTJXdkNiSEB4RygwODRqVVRqRnNMd1U+ZGNVMkwwc2VRV2hxdCZWd0JkTUtWCisqVUhKeDR6SmJoZSFZYGxWNGVQR2ooaGdMOT9JUEx+Rz5zU1RpZjVwQlpKNk58IVooPXVMUHtnfWx7V2JTRGdIXmkpO2lXMj9SSHpwZi1tCis3b2FIeTA4VTZifWdzfFFWP3BsUFg9bXVpeT0yKjtzYiUmMDQ4OXJIcyhKcWYzPkA3UmE+MVkwRUc5S2t5MSFrTzBSTCFwNEt5RmNyMDN1Cis0e1YxNClKcXRiNDxsRXZlKHMwQXtxPVgtczBIRiRzLWVCTVRfKVRxYXZYbk1SN0khaUQ7e1cmUkRANmJFc1p2eD4xbUx4YkJGPGhKWSEqCis1ZFBAYkkyMEA9TnooeHw2OSU+Y2h8V2VfcFEpZm5fLUtVUUAjWTZAbDlpa3llNFAzdWsqI3smNX48PkVLNGBPQVJ7OW9kc1lGfkdkSGtVCit2OTYmbDhxKC1vcS04SENwdmtDfnpUU0lVWVBNfkJVY3FGVjFtfFJebDslKiMrPjhRPjloO1kxbjN0MGdZYihnSChCemZzOzhvMDJTZVFMCitLU0VWb3x1S0B3fTY+PFJqdXszPm1vbWxTVkw5VTU7PkdxdEFAITJeVSpRZEBRR1QzdlQ2UnslSEVHNX5WaVNgXkBfUEZgQmo0NjUzdmVQCitxU3ZyLUcje2ZaKTJJMnpJM2hPe1QhKHloY0Z0VT44TClPeDJfMnhCYjRMIz47ZCgkZm5CSGUpOyFAPjBfa21uZW0zQFk5VjxuTms3IW1ZCitMUGtRSER4PDV7dTJyRTdXWSlTdGVhP056aGoyRVZ7fEkwe1YtYTJJVW5BKEBhVG0hbFBSUT9KXiR1emxGN0NGZW9vTypHNCZnOzk8PjMlCit9M2VNajgmTFRuQyFFQk5tfkp4JSNgezBoYEZNUEc/Pl99R0U4Y0wmN0tjZFBHZCpCdj15Rik2OE9TdllIcFV1S0hYQjNtWFF4YFEmQXZ1CitfQTJPYShjOGxfdUYjd0AlUllOe01uTXVXNUYqZ21ZbXpQSmhIVDAqSERfdz55ekphYGwzS1ZXPG1LSUYmbVY4a08reU5uVHBOfXFMZntqCitkbnMyaWdLJD5oQk1LO3o0WlpmSytpMmNNWTs2clJkd3ZFYEdHZFYqPHI7X25aJFZpPT1hZnk0NE1fZXZCclJIU2MoYlV0Rm4/NS18SjJ5Cis3WlBJIUojPkFMZ3oxbzFzNSEqKXI2Q1U9UC1GNWpkWnBIb098eSYqTm5wMjJSMFpMKCYmNWpJZyYjbyhLcHFgbD08eVFYQWVaOFZQZkc5CitCUyVhazVEN1hfVHw1MU1ETUYmVyZwXyZDeVZySClJcVAzZnBAa2pGZnJDX0lPVUJHKH17IzBDYEohbEJCWTgkUV89TDZsUX16WSNRbVQ8CitFMz93V1BpNDNGKVg9cnZrVVRhdXxfNE9qVCNIMXdecj9APGhrbDFgJmB1VFdgZVdsV289SCVDPWxmMnJiKXlvPnhZcl5sPGMoSTZzODkqCitaSDAoWSNYXnFmN3VxdUJVfEhLI0N9PCVRdE1yPGpsYVowbj9vcVdMOUBBS25ORkBvfVc0U1AhVnJpVCkyQn1RMkIqTkBabDFwV2xvaTVzCis8KVklI0FXNjUpcDhwaFZpbmp+dklnP2AxJlBIZHRPWXJzUmRtU3JaRHFgZmM7Kl5qZWxXPk8oaDghdTl2bHB6Wl42KWBOaT1AVCsjRE5YCitjZip0MD02I3MrJlAjM205N2ZeRWRMMnFfVU4tKVpkc2hldGIpSXJPUXwyMGokVip4TklXQ288cFYrT2F8d1cwbHtwR19eTjZsQGlFKV9kCishMG8td285YHl2T2ZgYHBAJjk9UmVRbzlASUlnTzN+XypyLUM+bWdSe2BNJkk7Y088REx3aE9Ub3dhSUczVlZ1KGc3fCVGb1p1Pzx5NCsoCis0Zil7UkJrd3otQiFKREAxZmo+RFo1RzhXMGdIZyNoSWtzQ280RWpyR0tOIUo0ZDxDVkteRGQjMkY4cSR1M2Exd28+N1g3MHljKFQmbnlfCitseip2ODJSZXRiVUgtVlRLZEpDcHVrdzNOeG89VlU5Wn4pdERFfDsyJHFTOFY/dEVgcjR3cmxXPmhPT3d7PVlsQEtOfG80KjlWSEctMGZACitCX3BOXnd7SjtNRS11WVhQQ1hjNmp3RHt8T2tiSFJSTkE+LUxkV3RYb3dDVFV9WGsoWXlDaHA8cVd4aUp7N14rfXoxJnM9SlE3fVpvS24zCisqKkc2aWVUTm0hLWV5OXlwdWFJYj11M2NqSj5Sc31hSHhLWTZ1NzJLZlVkSWlAaF9eNSh3Njxub1l2NFM9UWJERUB8dUhYeT5yem1KdUZoCis7Pn0xJnM9WkRBLTs+eUBJdTg3Mk9LOV9HO1h3b0spX3w2ZztTNHJHaUAoK15GQ04xPWxMTE91LUByUXh2bys3XlI/NSE0TCVsNzFTJXA2CitzKWdUY3FgfnN1dTgjYDNMYUROcG57Yk9aZDdvc2czQTt2cyZBWnJtVihuMnY/Pl5gcGl4MStoUishWlBidjdaZihJMmBye0ZSTHxHVjBkCitsPlV3OTlzaz8+ZjBxeyMmQnhjO3BZVUgpeCZBNil6UkVCQj5kV1cqKkZKJFFLR05VVjtgODV6Oz1sRTJgU2hSa1p+NjQjfDE5MnI8QDVpCiskM15hTkVrQmh7KmZvZ3JtISVJdkAqMy14KlckRkItSihUfm1wR28tU0daSFImcURwKkg4bmRXYXp6cjBCKlY3KzlaRVBYXkJeTT0oUVNoCit9WjN+eTMhR2xmNjspVHlVQnZDfmdFcFNyb19eY091VE9jUUI+SWBQOT5KflhvQTR7IVomPSV3TWBJciVBIzBvYWc1R1VoUWdFfi1AVXE4CitkLUhTTDN9dz5lYnJrK015REA4fmZNNSNwP00qckYkfj0mcHsyPnJoVU9oSEN8PWNkQURrVDwkdnM8VEsqUWpoeThUeUZ1QDMjPGdXQTh1Cit9RmVfK2M5PjUrKFFaOE5BRFlDVVBFdnp5KXBoZTBzal9FVjtGTE9rPkllN0chNyM3RDF6ZlUkfWxNZTd2bSNxNDs/RWVJSXxPRFVTdilvCitfJHN8OGVSUyt5ZiZyYlNJZ25zcVdzVl9PcVJnY1B3eypzdEQ5VkBNa014Rm0+ZXcjP3BZOV5mPmpfM2M3ZEN+LUEkVl4kOEZ2bEE8TWJ7CitkX2pkXmZjYkQhVjFkbnU9Xm5PZFFqZ2hmWjNLS34xK01iTjlBaFZVPTVBP29CPTMwVVF5QC1CcTNQVyZpRlBVWiQhOWpmKF5RU2IhMmA7CisxZVZ7ISleKl9YeXZ0I3hiXiFPaXFDIWdETFpxNVVNemtwdiY2SDxIWWM1KipmXyMlXlNlQXtnSWFALVR0bTB8UkpgUDN8fSthc1NubjJiCit0R2hFJVhgKlNeJUZMRDhwfGM9cj41WmB4NnxrJXI2b3dBQSZZUCQ1cyZobEIhY0JuWkc0P08oY3k7a3VTbVFOU1JJISFIPytHZCtGSDYxCitrWGlFK1JlamdKVT5pXjBXNEsheiZENDx5czhMIzRYNTZOO3N6MjcjWV5VSmY8eCVObiM/Zi1Pfll8Y2Z6bCora2xzaSMxNVVVYEAtMih0CiteLShtQUNIRXdQWW9hOUkwSnFSPEJsb1FZLTswdHM9dG1JR3FwQEcwVl5hdjs5aiM9NTtJP1FQPF8mX2trRHxFfGd8UUs9QTBeV1M+QHIlCiswMmI/ZzV7RSNvZjw3MVNwNjZgUW0kcSZKdkYrPmFUcSZMQ243QDdWa2cwPmkkQ2c2Kzg0RVRqST1iSVJObmNmKWB3fkY5c0dzek59VitmCitYKjYrYTFuc0xVU3xvTkpNQml3TkVfb0A5KXxyeDR0NUV5KnlNMHJ5YGslamg3JXNjfUBrV1MmbSZZQERpSkBsPWxWbytTNFIxZ31idj40CitYcj5OTSE2NkdHYElvZSFaKzBaeEgtIUQjPjskIWpzX244KSZYZDxfaVJTUExzSXhDaXVjTThVOTZyaT5ORHtMU2MjdFVVam97NDxVR2wtCitoNlZlQ3dUaHw+MjQhZklZWihHX35KfkdQWVNiQHB6UmpMTHhSXk5sUlNgbjZ2NGI/ODl0eGolZ0dYbE8jfX1zR3ZLNENRaG9xflhVVEx6CitXPGtmaWx4TSZXOE00bFg1TndsNFZaYX1QVWI2YCZHNlFhKkh3dzVCOUZ4VkU4U042bUo8N2I3VXxoQnxDbElXb2NMdGczMzloQEg+SVJ0CitzM2tuRClHVFI2flRPaThfX1pJOVpsekNNV29OaU8pUFZqNCtxIUgoQXl6TlQxMzBqcG9oMldZWllJfWpoZTNHOSNCfGw+Yks2c34keU92Cis8VTBeJFNjQktZVjYjUz8tbjc3Pzkjb3EqI1BRPDsrNE83SkFUPm5JRmg7IT9fdys+OzBuRHkyRzQ9NVRgM09DPTZ+dENle3ArezxXd04/CitgeX4/eHlfNjQwIXIoTUdMXyMlVHpyZ0lKUjgxXjh8fl9XamNXU21IUj0wOWhWY1lENGl8QFUjNTJoO2tKb2okXkJIYDxYJWQhO3smcE15CitBYjVgKTxXJl9nTWBFNVJHJXE0O01nWjllS04tb3l6ZEZzQ0pfQWozN1BMTkZoOXZ5NHUkYzVpcENYQlF5V1g+NiRGbnpFcVVAVCFPcldZCit4ZUxMYD50I0FxMnRLbzM7PDxzfnhNdzd1V2BkN3pyMUI7NkkpYUhXT2EzUGpKViRSbW5KKkJgZT97VHw4Mmw+OUMoNG5hXiktP2BHNlF6CitzT21sclE4d296TFNAeSpuMj9sTUVJSjc3RF4lZn11UEorZVRYbF9ZbiEwV2RZdWdJSzRhUGZBPFhNJDUtcipSOXA9TSZzUFp4eHY8M0JJCisoR2BUe2E8Qi1vYD1fSGxySGNTLWs5ZjxOc2NLOWwodWczST8oemZidEFBbyRIYkRobzF5T1lxa0hqM3RwZGhoWD9ZRGkxT1BuaCZhZWd5CiszV0o9OTQ+QWoxUFgzWGhheC03NCl1dkpIZSM0aCVQZHg1YlNyRGN1VkZPZzFeJGNrPDlmM0JpPzNnNlBZNmstdGV9aDUjSzFfVFoyY2ItCisyZ25JJXohd2p6bjxzPCM5NGZ9MH4oYlhhRXZrbyZRTkIrZENINyk7U1ZZXjtOTylRPWV0aVJHaG1HfTFHWU9WJXtaR3BUJHVxVUNeTykjCiskXyQ3enkxKjBnaDtqJDRSJVNxKXY0azEweUU1YVA8eWQ5RGwxRnxzP0o0JCRMUD5udUZ0TjglajZJQGRheSFLPm9SMWludHxORD5iOGZ9CitaZ2RrO0M0MVhzPD4/PV9xVHNGPV4yeDlMalQtUCltbyVsa18rS2p0Y2I4RSZPUG12byo/KFdONGE5YFZrYC1UP1d4Mz1KWnVtJCYlRXgwCis/SWFtUDkoRTxNczBrbjlvalBOfFI4WWkoNG9iUGV7OXh6dntFOHw7O2ZzOSpNT3Uhb2tDZjFke1h2RkZKaSprQ1coUFR7Pjg+e1VCLTtACitmSj9aciFQNEhAVzNVV3pMTERlNy08ZnhfPzFgPWAoMjFBYT9EdypScEJUcm1eaG9ZLVlGSFdrRDRlKF9iLUx5TEsmbT96IWpLd3IkJjNXCitvMEclO0RabT8jZnVsMm51LTtSeit9T05UZzshYGJHWD1fODRrPndjVGB4OUAqZ2V+YChLemhaQH5mdF88PGszYUZpY0RMKjU2LXR8IVk2Cis2cW9HdD1FM2VmZGlkflJWSGVYUEpebE5FVSZze3heQV48VnpvcDIwenB+RmVzO0BgPCUqK2VZejhLKlRBSTsxPmRPK0RQTmRGdml6V19VCis+ZX1WaypQPypJc2VRRDEqQmY9aihlMDBCYkkzdj5rNEVha3Q8PEdnfT13WUJuWm91IXQoWCplQ3RxJVNJfERfan1BSEh6NzRyIyFDYW5nCispOTNVREVaKGtIdzM4OzlFV2ZBc0tDQXxWc30oVnpWTGw2RjdISVVwYDYpQmpkQkckYFRsUTN8bUY/OXlMJnteMjF9R0p2cXh6a1BJbCZsCitlQWl1ejFQK1RobDBCUHRuRG1DRTxWTT1fIVpuRkJ+bmQ2eWM5QHtAY2BAXiVzT1UhVmBiMUFGYiFZVGtzIUFJSGZuajNtd3JYck1GMDU7CitISCF0PSRFTlNkYjExTkQ7SE9KN0xPJG49PGZEPCh5Sj9Hdll+MD0pdjBqcUB5NTNCRX5ifGtHYWJGMl4hbV9pcHRuMVJvQ2hqZHwyO1g2CitqRXJRN2lIVTZUPGpMJWdKTUwmQzxFdkohVnRAUEYtYEoqMm59bSROfE5pXnpeeSQrc0luVCVURiFsTlE4QEtxTkI8ez89bFcpJTQkcmtWCitZVlExIVRkMkJIaVFSWXQwN3dAYnxDUH16JEAlTyhiWnpqWHkkNH1xUGBUNUwraGZZdE9JKDI3ZUxnV2hzbFcmV15lRkVwTkNHJG4pe2RWCiszd0hKTDV1UHcjd2ZEJD83dzY2cjdJe0pTJH1IWm1jX0gxMW99eSptJXw+Q1R5X2RmOD1PRXNUJFA0VSRqYlFIPGJ8ekdXdVMpMkJ9Izc4CitWeDkhbyRQYT0rVUVAJHopPTJhZENvbzZETGsmSHs1VW95WWE+dyswMjxVKmBvQ0VaMShLZz9BQlh2V3BuMXRwPmM3NlhnP00lVCojaVprCis3WTAxRmBCKSlENExiYnd5K2hxI2otVmRDaVh9ezQxMGFhTmNRKlFJUUg8OFMhflBOZTc2NmQ+KTVmVVopMmY1SUo8ZmBYRzhYTEhnKyMoCishYHxkPClEZ35SeXY8cWN5UFJHM0EhaWRtPEUpVjBzYjZxKl5WZ2lFUmRGYCFUaDVqJlM7RVQ4JWh+R0h0SiNBT0tGQSg9PXBwdiNxbVF6Cis2Pig7U25vX1IpO0A1WVRBKj13KThDZmMkJC1ndHcodnU3aClgWGd0cilwRTlQLSMmS2UmPntCcitpJGJ1JEIobWotK2g7VF9+RDFfbFRTCitXaktiJF92LXVhMk0mcC1jTSRWR0teSFQmZzxaYGhZLUlqZ08kV29PUXU1d2UyRVY9KG0oTmxiaHZzOShqSEZVZ0dgUnJXU2lmc01RXjhfCitrRVhvQjJkR3BXbntiXjQwNyR7eFctKUFKXkpiKX1HP2ByMTs/IWU+QkJVcCFoZFp7TWkpMGh6R0lkNiNyMyp7fVJRb3IxJlEme3djVGtlCitKT3FuI2xNTi0rYkk0QGl2Syp0LSVhdDRRflorQHw1SitwQ0I/NiVfJi1xbUk9QT9QYF9kU1Y9Q0p1UnVVa2QpbTVuUElKTmk4SlgqNCRFCitDeFJHMUlmVV5+Q05oNU5jRS1QMSYzTnQwak11cnZaJV5AaVF2N2c9UHhJQElIMip3R1kxUHNraXFFSWAlUEliMjYjcEwtZTszNitMR2UkCishI2l6a1hrezlOZDZ1JmpieSVlOT9wSVJFa2FBUkE+JDU4d2s2I292Mnt+KlFSTyE0MSFpX2hBeUItVmxJWSE5fUlnO0JLfiZXQDdnKlJuCitYcWdLbERjTkl2NWU/XyZKK007VHhKM2dhJnlXYz5KTlp0O3kyZT5sWllwIWw7V2VpNmxBTiU3Wkh7OHVVZDR2SyQoOyF+Y2hLY0BKbkRTCitvWGh7PyhNaWIoQklqckVvVztAQz5EfW1zMHFnUW03NSQ/NTgxfHtXNmlXeTR5S0J2em9LQkZMUVNPSUNzVkdPentVJntJTHsmNjIodVdfCis7VkAjR0smOFkjZWJJS1o9KDNTRGdJSDR8MXJne2FmYDI0OTA7Y1BvaGcwfmlyPCZ3VXJxN0hRMmdsPnw4fFBNZzVwMCpAcG5ARTU4ZEs3CitldjsrbT9pM3E0Jk5SK3M3VXFOanA/IU15P0FpQlBtIz1BRGR8YUhfOTNNTSZ0alV9X0Z0bEk0S0UxRUt3d0lRSUlnWSZQRk9DZG1iOD1YCitKMWkxRUVxdzxlV2pKM3AlclF8S0tybV5FcCR5WHlscEZUWiVERjMqYDcqbzZ7KSpNVW1mIUNtYCFAfFpTSHl8MEc3X1U5IUpCTV5nOXlDCithJSg3Ul8zVzNPdXdwVkUoeWp+ZzRHK19oY0Q1Yn4hMHAoO1MlV1FzcjVndmhiKyQoYEdePm5ReU5qPWcmdDNDVEVEYHBMb1YrcUp1SHY8CitNSTswYHhFPGV5a2IzQ2l1NSsqWSFHdVRFWVAySz1HNXVuaTgqJWtHSTRwY1J+VWtMcHBUMCVIUTk9TzlGQyRmMS1GT3taNVNuQiFkbWBrCitGX01tI202VUY2MXo3Rks+cXkoaTFmIUxuJlR+cj1FVSpjSXQ4bCRAYjRjd0ZvRFZSVj9gRGsqT0VzZWZhMEc+ZUBKdjl1e2hCWnBEMmhCCitJY1dTUntGQlc/VnRfKENyT3wycF87JjV1UTI+e0peNip5NEZAcjZYIVMmP2RaVHh0RkxLbH5SdGlqdDUpaDY1JFolIW1Ha01BeXM9c0k0CitCJEptaTMoQDstP2NsZy1rI05AO3tpXjleU0BoQzFmYSRNfFNGUC1vOCReKlFMR24tdWckcyt+X3dyLWA8MXo4RDBwcUxteG1JU0g2LSpuCitCZUBRQnUpYG5HWjg4OVI8LUlXalVmdyF1RitkN05vTmJRPlM8O2JlP1dNKFQwcWhXd0xiNW9BSmlmUUxeRXtBMChHeFc9O3ZmQUVJe0VYCitGVVcmNGxGRyNJZXlOWW1CKzRGQ1N9USgxPTc2QGlFVEw4fGo7Y0hAUk9FNWdRJVgqanZnRXJFZXhkakkjX0kqfkhyfGVQVF9WWD1EPmA3CitUQD91WX5zeSU8PkdvbkB6XlJGTkwybmM8R0lEbnl2PmZ+aXJMc0U8R0lVXlE/JjhpcSlDJitjd3x3PXdYVShwYjQ2cD12VE9AbVRNKX1PCitFdyErWDQ9LVpaOUhjUD93UjZARklKQEJzSWM2diNfYG19WHV0eSR3Z2d5NHlXOS1RJXBKZU9UdU5QeTVTNl9XcWowZC1HLSE4QHE/XlFtCis+OS07QlpNajkqWi1NZzBeSWRWamQ0TmlVVzhUO2FrRlc5TTVyJnZ1KjRnMj1uWmBuXmp7dmdIJXp5QTZ3YHxZPmkqeT1OIXktZkR3PWlTCis9YiE5QSM+eU17VkNzK1goTXNIMi10OW87P0QoTEt3OF8kREBsP19kLThMM1RUVGhwcHh4dnpQZzQ+YzRCPDshfXMxTF5Kdyk+VEZrQ1A0CitTMFF7MX1RS1B3e1cyX190STF5RDkhLTYjb145ZX45OFlebUczaXJ+R0d9QF8lKWxxVW0rKylUeHUkM2h5V3NLWChmMEdrRVl8LTEqcWEqCityYClVcnlje2syZXhVYGpwVkZqJihKPTdgdD16YzZsbXhsSz13e09kaUNvXlZTQHNANC1Pan4jPTcoejVJVlQ0QDhCUWAmP1g/RFRiQ1l2CitMST9aI2hJVWc5TXF9dUohRnMpYUQ4PWREd29PMiVrUFpVfGB8MCgqdC1aYmRgeF58TXlqcGJ7KEE3YHgzeH5taC1HaEJ9SzBPRUg+RHQ7CitHPjBjRyUoVDszPnk/azRANHh7P2pxZmNrZ0Y2MnY1eHt7c3A1OWB2dFUkM3lpZ1R0VTFpU2kjMTdTPWx+dFZmdWp1TTBnbXF0VDs+LTElCitRQFV+Q2k/O1hLdmIoejJrPUVleWlyVjBVLTlLN3tYXlEkIUhzVyF1PitjKGZ6dnQ9d0wzbUZzYFVeSms3JjBiZDtYNCh7SClKRDc/V0QjCis3fTtacnZJP3lTUTJzPmM2MmZvTFVOVFkrVTJgVS1mdlpicDN4WHBuQVlwYmRMfiE7fWNJakZeJjQyKk1Jb29ocCljPntgOz9+QEE9fXBACis0aD10QFV2ZmpgUS08aW0hQTZnPEJ3bEhhTnZNTHJfK1V2OFp+T0xxQTVoQmdDcTNkIXluLXYke0hQVytyRUFLXzk2Jmd3WWtFJEF2ZlFBCiteVnMzXmtoJHsqQUFFMlImNz05d29qZHYwVXdfVDFLanJWZ3wyYEl8Xy1DSmUjJWNifDtaSFBoPlNzVDNJLVMpLT4qcHM8b09wY0t1M2R9CitBalQ7eGlXSTVySmZldVVfPT81Ky1TNn10UXRiTXxPUFgpUm4/M183c0JJQGh3Jm9NTkVTQmAmMjtgZFJpZ09OeiVucnA3PDM7WU4jZiZaCitJdHpSOTwzK3J8ayR6SUUkWGYlb2F0cn08WjNlWmBMKkpJMFM2S1E2KXs0dmk3dWV2MEJlQCQkPHJGV2o8YSVSKEJtU3hRUHVDZ2tWbW5eCismJH1uTUM3aTtEKmxgIWE4KjU1SyYlVWUkJnZRTCYzV2N2KUxTcWJwSSYrS21ZdFFyP0pmSFVjR3ReQk9iMiY9OV9QTFdvNHl7JnF0M1E8CiteVEhFelhZQ0NKXzJgYHRFI0hfTTwwRDg/NFVffFkwTSlhJD1va0x7YGd9KCQ9IUtNKHxQWFBJc1ZnNkttR2pQZCslLWdeMjt3anFyQT17Cis5TU8zbil3Zn1VISVEPmNxeGpRITNWRkYrO0lGLSlMMz5kcSs2KCtPSXlBSFBIbDs7LTMxYDwhVyR0PzItU1BlentQKm5IdngzVThDJkAlCis5WHhQMWJ4NDw5ckAhXkxiaVpifjheVXNBSElIRkVhOVR4RE5jaXNeJT5JVFhLNWFvdXRnRSgpIV5fSVhOV2t+ZyhxWn0/PylKX0A2aHdTCitJY3tRfkB7NGlFaCFffUE2ZGFxNVBJezZ8R2FeQFNZYzFeI2Nwe1dnRjdfMThJLUlqMXFSc0tla3QlSHo8WEwqZlBRMk0tPDtiPi15QWxmCituIWQmO34lPlApfEBzei17eVFvTShLPGBQZF96TTtfdlFASUtETmM1eXphbEppTSNhe2psfG9jfiVeX1lUI1NGMjlTcDh+IV9YPnsjOHFjCitrZnt8aEY/a1RDQ1dxNDBEUXI3QEQ9bytFUHktQURFbSk4e1p6YSNnWGlFa0BQITxKN1RedjNxbH07V21VSHZfb1g0RXRKbytmLSpCc19OCis7dm10bW0tN0tjTCpJWEwtZzcoV0Q/akdeIWk1V3V7dF43Q3QjYGVeVXdnSCgoQjN+JlBmIW1hRlZqQmR7TXdWOCRHJTdXMk10c1AhezZlCiszREFBRG4wcTFvV0lMfCFKZEg0PzMqMkVSemY5QXs/JG51SmFoPWBzZjMjRmllJUhhfVBmRDdhWkk1dE5JX3pzPzxqMzc2VmYzJithWEE9CitsYkFwRWNVTllYSXdVQ3pmNHR8Tih0VkkoKkNDbmYmYj97TUR4NFIhd1IzaH0ydGdLTzxTPGUmTkBqPDshPFhtU3B8cUFWYStrUFZGdilOCisjbGU8UjB9eGdReXBIQ1YkVFBeK1pFRiReWkJkQm5fakZhWCNYME5rY2YqZ3t5YVM5PWh8Nzw0PGt6Pk9PdD80NU07YmlGJF4lcjh6bnY+CituK0lfX3ohPmQzeTZueSN7SWVCNnhDN0NAQ29OfU0xekhCKiFVZzRsSUtUeUE4cloldnVEcTg+U3IzZ3BoMF56SStgbiE9SUEob3t5YWF2Cis/SkBxJGZfVlAkP1BLYF5jYCpXc280KD9GPlgpMlB0bH5Ub0gyaDF8WE9mdndUNzVudz5vZU08ekJePW45ezdmPSk3MFdOY2JUZmRwVVFiCitmV01wSmRZUl5sN0tqZnEtOWd1cy1ieUdTdFN8SUM/cXQ2YSs7P0s8KyNoPHAxPThxU1M1ajViTFM8VSY0aWlWYG1JOFB2KXRwOVNXJiE5Citvbz1Scyhiczc+dWRaQmhAU3E1RD9adyRpaHRJc0FMfT9DRnchPmZfUFJVczR7Wnp2dklOdk9zLStVODRjYFFAaDcyQTU3O2olcGIqe29qCiswMDRNS25Be0d+aHw0X0h6YyZGckR6MkBgYT45dEl3Yzh0SXVlWWg4IVRpQDhQXlpYZHdPQHdeOTgrRDNVcVM5UkFlYTM7Q3pJd2k0cVopCitII2d+alRYPj17LTduPDB7Jjx4VXQ0MTBGV25pPHwzKS1DTG9fXlRsbFR8QHo8RWp5KGN0OEsrRyR5eihJJi16KUtIJjZnSTFxR2dJMXI+CitDV1hFKGt+en45ZjdDUGRGRXF8X3lgVnZSbzZeeC05bm9tUHZ0e3VKez5wLXB7R35naGBTVjNZIWAjdlEqVj1GUjJqP1VXJHdiND1VbFI+CisoXipMVkVYVld7Zk9eU00zX1JtX0kpUUBRQl4/SX1JbEU5ekZfYll9QzhgaEo/RDViejM/SUl2IzF+ZyNJcXRPQzRedElaITQxVlp1Rj1vCitLQ3k/NnhReWw0Yn1uUH5WcyhYZkdOYztsZnd7PnU7NVNKYz40NlA8SVlPcm9ePHRpfkFxYn5LTWErNnp0b01+KW9YN2lGUW5zSVJ+cXhCCisrKks3UFMzbj89aTFJeU5TTEVlSCkkfk9RWk5VcVQjaGdCbCpTIShmbWNDcD1vYC1wVzM5PWI0K34yWlI3Wnw+e3duaEpDLWpfSCo8Jm1DCitqUkxNI3s+PVRWfmp5K2pMe1BRKVpQcEVDd3hge1p7UCg4b1BhbSMxTXQ/JDFafStnXyEjeyFYb1VSbFN2SDNNbFc1cFZHO0NUKEcqRGVZCitlRmhDckRIPE05R15fIyp3fnBnP1hBdXBWWDEqeGhCNTEmYUhmZn5XNy1RSko9SCh4NDJLcTNKQmsqcTZ1enxudSFWNFZaQkpGaUFsZ3JoCitVLSt1ZHpBQTNCTj88JT41enA7ZDlwdHxyWChlTXZkcFYxfmdYJj1LTUQ7VUdxPTh4clRhJTE+Q0lWU0VQOHR4KCptSiRzTWkzVTdQI344CitQfih8cjJfezdEdnN7RjdYbGZ8azRQeHtKVH47KXtad0UxXlQ5MSN6OW5VKik/P3VpPSRNIXxPellzTHc8TCs5YSgkdWNKMlUoU291MyFUCitjRDBBSk1ScVhqbzEobCN2YFEkdUo4PChJJVBQI3UlXkdHfmZPTWVAKl9RcW9leCoyakk3Qyopa1VtUDNnRUNFeC1NQ2ZxJWExVlpMdWdFCitaPG9ZI2F+elRgNHpZTnlrNjFwaEAjPE1sQjFRa25SdDEmcXlkaUBWXklIYEs8e0g7aX5qZDVjSW5kKldsc0k/PldMRjQjXj5oZHo2bzRXCitBNWpNdUVtfGFLYUY/JiZELSVHfXNpdCRSPUFJQXN6VF9IWHBndmNxYHJQRVg/RHoteHF3SzkjRTZSYUN8TlFlfT8xaXlSZDNpYVhKOW47CismaFJlfSR4aVowbkhmaHRNRTJ6JnpMb0BBNk9IVzdlWTFPSiN5UXVCdHtyZEllJDtydzVuUDtCaT0kOHUlMyVTaV48MTFGSTVjVD8jUGQqCitYdDQjcTt3KEVffkRIPXdQO1NQMGAkJW0/dEdKfEJKNyZNJXkhYE5xPzhVRy1UVFY/M25sXkQzJGZ6bFotRFpAZ2lrdkNiMz98QTdNczQkCitzV1kldVA+RXVjM0JTbCozYWBKO2YoWG43fTdicDNFeU1EKTw4ckppeW5pU3RJYmx7MnVzJTJKezghQ3AwPVJoWEQ7fVBhJWlzM3o1Zk9oCituYiZ2NCoxdmNIYG1XPzctUChwVitfPTF2YEcmYUI/QTU1b3F2clFITDUlQEY+d2p4aGglKjwmSElQRl9TJFBOUVhTXngkQlQtSklNb1JiCitgKnFoe0MmbWMtX1UjayQwTmpCcSUxRHpkdHZvOzxXRG9Oa2pPJFBxczFLO3FxQ1FoT3hZeV9CbzdDc1NUYntyO0BSMkpLbylJSFB0YTwzCis2aHJ+SnZAPlhAMzdaKEB2OCphRlBfditQKV93VjFJKTdWPHowejZQUisrV2IzeS1qSnMzel5jPU0lKClLVzMlYGhXaWl4MCVQfEp9PU5BCitebkAtNnF4PHshUGFuYi1hTD5wTjg1U0dAa1BjSXtlVFQzWShePmVafEgoeHBwKHozSFojY3VyMV47NSpHTGcpRCZ2KUM8ckYrKDFXRFRDCitmSXplaSg5KEp7b2xlPmsqaG8hVlAwMmxwU2JrPHt8UldlaE1EXyhlKW9ocm48Vz5LUl5Hb0pNWDtuQkppOXhaSkt5ZHIhXlZ8Mz5kKVkmCis2Xzk2MGV5ekh3eGlKamUxWDVWPThMJWpBbkY2XjI8aylBYGk/JV5lZVF3ekd5OCs8Wj5VPzRmMENzcW1uPlFHRjZ3RH5kXn0mVVYxWHpICismO2IwJGpUXl9PUG9GTl9RM2p3dmRxSU9YQDVOalU8Nz4hMEBDMVltZmlgIzkhazd4LXNWJXY7Y2trWkFIKk1OPDU5U2JtMjdreVZVZFImCitHbzhibiR1O3kmSCtlUTcyamc5M29GKUA3NXBoMlA+O0V5Oz4+MWE7Mnc3UWB8JFB3QkQkUTlhU2wlMk18S3sjUSU/TW5BQTFwWSsjaXM4CitlRF9hcSpjcUNXcmdwWl5wemZJbkNfcjF+TGZOS0gtVTI/K144dyRgcy1GWXBKaSFFPX5fSHxoYn1BR2wqfDNpLWlVOH0kSG4wQ2ZXQ3E3Cis1ZThGSCQ8Q0F0NTAjUlBJbWgtTWlQeDxlcmJ1bUV3PGwtTiEhflUtNHFUMno7bilJZ0tyRnMjdyRxRHNOOG1DUyhBODZuTHp+KGJmfnVqCispSkZYfDZoNks3NT5zb0ZOcj96QU9IQT1oekRMMXBQYmFUJjc/a1owcFklei0wbyZfLXtWVTZaXlpadzt+JXZEUjNCSHVqYHtgJlR1fFBxCit2bX5jdEVIUCkhOU1RSD9UXkljdSs4VzVXQ1dvajhzRnhAYyRPKn4tWkw8NCMyeGc+PEdEM052S1BQKGUjV0xEVz88PlVKZ309TTN5MzRTCis7WXkmc1kxc090SnhjbHpBSWtqMSRwTFR6TW9BeDNPKzhNTShjcHlLUjZYNkIhcHpEYnpwMT5POEl1OCR6S1o/NXhle0s5dns0TkN6VEQjCithQjlwRT9HQW5Mb3RKT01JPXpQNmIpZVN0czlNakp6NVVrN3B6U3B2XmRodH1kU3t+emFqQm1DWHZBOGthX0tESD8+ZkxMUm5GPUdhUUBXCitCVSNlN29+cWRsMyRAMVgraDJlRUBMUl9ENSkzYGBDWDBjWShrQXtGbk5rbTVAdkhMNytvaD8/P05Bd2hzTX5KMDBOZD1GT1k9IXcpfCE8CitYTmwzY3ROK2VIamktPT8yczk0fEE1LWU9Ujc/PHwwfXE9QE9TU1EtTiFLUVcxR3ZCM0VwKzwpYHxGXzMqa1c8QFAleGw/RjIwdj9sZUFxCitfRHs8RENITW11cyRXOT5zc0FxMz0za2VpTU8qWEtfVX0rT2E2PnQwZHZZaTx2XztyVXojYkg2MHEmSD9wSmBfPGlAKkUmazJhVU9UJHh+Citla01SJWUqcTZmIyojZ3xaZjRedlYhMntHKyRVRT55SnNeMnB7fTx2ZUBPTk1UcTt8ciF7c1M3JmNWaGc0Xzc4R157cz9fMWMjSnRHYyNtCis/PilefH0zdSVwZEtUWj92IzxgaU9JZ0p9TSVhVG9ZUWJ9dUxBRXk9cmtUTGdiPy0yIXxEamdXUGNxbCt7fmE4ZztKVSt3ZjQ8QmtYRjZSCistTD16c0xqVTl7dihfdEd0KnhtITAkR1UwXj1eO0BFbGZzdSZ3dkQ8UFR3Vig2KSRQQ0BuO0wweXlkLVNSQ351PTIwS2YzYnBHTFk7ITEzCitpPkUkUF9WbSNWLTtNaUFlVEBGKiFhNjBCbHtCJSZpREFKX3k0dGJ1Q1k7RVJ+I1JiUCpBMCt7ISs7d1Q2eUo5TlFraE1OPTIhazNKRz53CitBczU4Zmwjc0FFaUBuQ3JVOWZENWpmPmwyOXM7SyZFeXo2Vm94cGwkY0lpU0FhRlVpc04qZ3o9UVdxMkMoekpDY1JVTX1XMmJ8UE9xRTdHCitjJlJsIUUhOFZ7dXtsYjtUeVgmMn49Z2hoMXA0YjEqLVB6aFN1X0U8OGFye09jQUV4QXNkPEljVHRwYHJrcHBgQ1NVJDV9X1VrP05WLXhCCitmdVFlcEYxaFJ3MXdWKHU/IUU8TDYxS2FXe2YtOElXOXhNRXskKVBsaGp6V2h0ZWRnPzk5eF5oZU1HOTNAeD5sYkl3cDhadmsrdHJGV0olCismOUtHM04pdS1vN2pCKCFZZFZ4Kz4hSGg9Xl49TUdWWHs0MiM1KERkTFRyclBwbm9qOU1yLS1gQVg0PyZhSC1fNTFmTkVCQihMZWA2WkBVCitsS040N2N8RypjKUQ2XnFVel5QJT5OJjgrIWkqc1B1Ul5APUBgcnV5Yit1V2UxKTFnd2Ite3VFdnhzfFUxN1okKnktKXR4QktfKy18dkc1CitWa2h6a3szQ1c5VXhja0RtTCpRJUpLb2RRM3tLI01VXzlXUilVPzVPc0w2d3wlfHhGWks7KW9SQjN+JDFgOHwwcWJjdiZwaU9QQTFvN0BlCismPl51TG9AamtHIW1xellYeHxxfiVycyN2RD9fVD9teTU8M3k7Sj0zZGFuKntwXyslWSh1VHVrREtXdGdnNEI1RXAlNDtfNnRKVio9XiR+Cittc29IMHdoekNCcWRHdz4tUWZBeHp2KlhMZWAhVDF2YyF3ZGZCd1MkJGkyMVklWW4hS1hWQCRgXzVkeEV6fmVlQWNmSFpVSWE1c1Y2fjZQCiskNE1aez8qdWlhdmZePG9pe1BqZzk0UXlqI1Z5eWJAY1ZYbklgTTV+PTQ+TXw5SCVkaiZ1S2M4V2djSVQjSUM5fmN3KklSNio2ZU5nbT9mCis4MURVRCpnXkh3NHtTaT15aTVJY0okX3VefVk4ZV5NRjQzUXVIeWAhQXV1QmBqfj4jTiV8c0JAKmd+UyhDNmpAK1VQbTJIMUlaUnNeQU9NCitnaXJzcFc9NzAjPXApTXQzMHxgUVV9SjV9M0doeGdlZDNDU2hLOHpiK3FSWHZ1fiZHWVpofGFtKVlyazk1KVIlNiZPfCpGZUZTM3kraH1wCit7ckw4NlFAc3NVQSQlRTkjLVU7a0dtM31Hfm9RZVQ2e3VnJVNPMXVsS2g/KnZ+YWl4I2MjbGNzPUNNM3E/Jn5KUzlObDl5Jk9DUGc7SCtsCitTdCQjKEFDPXw2UG5rZExgWXpFNkQ0ZVp2YmY7UHNMb2woLT55Nj9JazlzY2ojMUBDRGBzX3l8fkdiNzFNWDN9fGl9NFItNitmOUJTZkVuCitCTER7ViFNZTBDQHFxOVd1ZjhBZEF0I0tVIzE4eEpjcHopVGZoOWVmPFUzb0IoSXE/Y2lrRjkzRSY9OXxoZn4jUFFDKkMoblBDcERfPUtgCitRMTIrOEBvZUpHaHMlM3VtNFA5RU1ScnQ3ZCRqTVNmaV9iJUtreHJfd0w+UEJTKCgtej1udiY7WH4hc1lUWTF3QVBlamYtX2dLdFBpJmMoCis2TC09X20jKkU+e3U1KHctTVkxRSRCckc5JFlJflVlYlZrPmNrekFMZXs9elBwb2BGVVZAQH0mVUFCZz1UQGlDNE1JUzVqJEZae009O0txCitVYjVQU28jXmhJR0V7QG1JUT9XMkxIaktydW8tNDlPdTN4cnB7ezZ+P0s1bS1PJE0mWXhraVZuPDd5VW5ePT0qJVd6dmJyVSVET0FxYlRBCittU2NKMTBGXkUtR193bXtpUiNzfUhsOT12TTMpdyQ3bnI2cGdrMXlLNEpYP1c1KV4/WiU+LXR+N1pZbGA/TUNuc2xkVVMzYFVfdERoVVJLCiswJXZgWnY1QHVlRVhHTXAqfm15TFlkd1U4dmojbmUmU0wpIUlobms/TkNhXmVON31CeT8tcV87MTAyMSpeb29tdzZ6KjkkV0AmTnlKJiFuCitsKT9XZU5SPHVQOH1RTiRKTj9PKExMKilyKz5obz9OUzc3NXF9SlVCfm12b0VHKDR1Uzlxd2N0KDlgZTl3Pn1OPjQyJnNEfTR9dDsqKk1zCitpYytEPVZHJCRvVV5oQWNPZ1U4c3ZKJGR5RD1SRGVINWQ7eWBjPG58UyZSa3ZuKClpeGNtWi0oZFpeWmpzOGB7dUpgKGMkdUlUSGkkal5zCiswYDttPkFUODY2ZSgrOUJ+QH1gIUg0cEtgOCpJPDZRYVJrTnl5VEVudWYtSkR4Kmk4NjVja2JMaT9kfnVOSXNmPFUrMmlsKj9EVk9lbntrCitHUigkWjNFe2B+cFleNXg0Vlo+c0w2QEZDN2FaPE1gWVVFLS16ciNkd3xTR2IhZD9IfjUxcktQMnV7OzB8MF5SWVEjM3YxVnxsXjhTZ2ZeCisldWVLLUdBT20lJnRzK3I+UWB4KEN8aF5peWtDP3dTUHRDPT8xdytyVX4/UmFhIVprVHYmPlA0NFVLSkFSTH1DNEp9IVRPO2xObyVtMk9ACitYMz1XdDsyXjglVVV0RWsoIWdqNnpgTF5xekBoQ2Y2Km9HU0g8QVdKJXZsYzEzQ3VBTEgrNT5uS05wZztRaTdienlHX2JmbnNOe2VUO0s1CituTUQ3RmcpRFl6Y0t6Z2o4XyR9Zy1SSHNsbiNzT1IqKj9pPSZLO09GPkRnUDNuViM4b0tmNjFBb257fVlgPikpP2JHeDE/YDRzKnpXMiowCitqSzBiYyo9K1QhVms7c1JfTSVfNGU/QVZXdkEzcnxIPyFARXFvMSV8dSEhWUZrI1d8MVl4P2I0UChRITdCTlhZUzJLOCRlfGJOWSg9ZGhvCitPaDdjTmp8e2FFeGRBb09wUGN9US1Jek1jPnskalUkMj4hNU4pZUJGTGNjNkNOdyYkO0x7RmBTQkwpU1NZV0pAYy1lR1pDTCY1QEYzKC1rCisyMDBZeHJQakcxcFgxPGM8YVghKiZqUT1HTGQmQENWe0pqY3NCYyFLLT97cXhhYDhTa0cxNHYwO2dtSkNRJDx6bWhBRXQ5VjdPYldyZEcpCis9RXdlQDh+fnRWQC11SiM8P3dXdT1Ze0E0e352R0ZMRlFmS0p2fmJCSlUpSUEqTzxGPj11bjJoSXNNQz1XQXNqPylLaXRjMT8jbTB5IUo8CitXMVIzb1k3T2RaS1lUKlFUZn0/QmRjPk48eTV0LTJMcHg8MzxReFRwNTV7bHg+ZVVrRyMpY3Q+ZnMzOGk+RT4qaVBaR05teDA1JUpKMmVLCitETmc2QnZZRlMtRUY3NTVARzlGfSYyKUcoIWlOMik5Oz1MRD1HVlg2SThJUVRTKl9WLUBAQyh2emZ5dUZjSz4xU0kkKSs0QFhyTkVabE57Cis7P0t9bW05alglMUZ0dyZFOCVNfmtETlNSYCU4T3kpQzk8ZmVzVW5iWG85PEtqfV8yI1FsdTc2b3dmQTtLSThMTyVGSU17N3NGMikwVT5nCitJKl9fO1I9WWJHe21Yd0krJGFAUlFLVEFDVmB9SCtFVjB7JSE4LXZENUhQS2dhXkNoPG4wa1ElfllyQEAjemYjZnVqd1R9eH00NlZGYypoCit4VntAWHd3fChvSEA/JWRIejMzbzE9TD1YPnp3R2MzaGpxal8yfGRgPmoyc3Y1ekBCMmU4fVAheTNEdV5OR0ZJOT9gc0IrZDhxKytIQmBjCitrS0FZTkd0UVlGeHkjeGRFejJKYzJQKVRCRzxmUE9FMl9mVG5WVW1aa0ErTGgwK3Mmb2czNGU/czUpR3xWYmcrPT5kTUZiO21Td3I3Ry0pCitXe1ordllmdzIwOCFSKlhNazlzcTZLS0VJVkN1PnReYjZFWnM7YSZFJip1RzkmODRpP2U0aDEoZ0lHQEZUTFY/PU5mPWJ9b3FFTjZkU1A+CitgPGd2WTtoZkJpKGd4UmY3MHtBUXBvUH5vWklaKzUwWFR2JTBDeSloOFZebFQzMW0rPDN4Kl9qKnM3MiFaO1BTKE9IRX1rSTFhQkF2VjNuCislZkt3USY1ViNwa1NyTn1mNElgOT05bG1saUh4UiRUMTdkR1Bzdl9uRl5tcmxfNWFiVnRyZGRMamRuIUFQO2JQT3AhKiN0KzIxO0AkQ3tjCit6PThfSntGJndOS2VkNUVKK2szaVc2bXRgYjJCdUsleShybyM7dHVvPn1icXNDaGNQOVVhbEdYZm9PekpzPDZmX0QxYG8xSlN8Z05ZX3xiCitPe19sRjlCWWxXI1NYK2VWcUxMaHRVR28tKSlWV0VeflZOY2dSem09U1dHa0s4Zml3bDtXNmVKVVNvLW9YQX5Ha016T0taQ15LcXxkWlhFCitCSFFJfj1NdSpYNUIjbXo0eXdQdEE3PXktJEY9bEF5VHI8cn5IJENQJihgem08XlVNT1gkU2dNM25QcH47UyNMSSp0IUE1ZiEwYSUpJSVzCitfRW87UTJVVWJFakVGYkI7TWJJakRAYktgMDhedGROSlB1ekY2eGFZQld5MTNJQ2FpYDdWVWZVOXkrYHk5R3Yrd1FmanIwcFNqWVR3bHVBCitaaSs+bUdmYz8kd3YqZDN1NDRedmQpYXk8VHREVGxGQDVzXzVsR2QoaSY+P1l+ZTwwfFhRUjAwME84Xk9ZN3lQK3dhdHtVaVZZZ09+c1M4Cit+XnxTYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSWNXN20wWSVYd2w/TEdaPitjdUtGPiN0enolXzl7eyV0diMqZVNZaWlJZj5LeUhuSUl8CityYD11MFdoZT08OEF+SnxObSleTF9rWHxuMDY+NVFDRTBFRl9URFhEOCVxPjAwMHg3PmR8fE5UNElkQV5hVytaUD5wZ0UjT14zaDdIQCUoCitTamB1M2RTNEREdFErZEl3elc0bTt2dX1wKiZrT0l6QiNsP3pkSGdCS0xuIXQoOEg9PE82UiptPT5QQzJ7dExpMzh6NEw1WkUjcEZYWj9aCispP2lLXyhPITNSLXpGfD9PZk1LVzRjOEdPNGdncVZ4OExSalpRY3lFdGg5VWgrX2hTbGZGaV8/a3M+ZzQkMT9DOW5EaTw3ZitkPG9AeCg7Cit9T0RROFptdGkkWCtebSgyNjVyfnJOZkxsTXl8c1lEVWElM2U/WUZwNWpAP0Y7bnslWnk5KTRmLWFrV0c/amdxXnVUSUdBbCM7bXp4c3ZJCitHTCRkPUF0YSlZWjJpdShLTU9xbm0yS0lHZlBKNUVCc0woS2IyWGtLRl9sMllyd1lwbigyPEBTKCR2ITxMWEFlQ15ZMnFoV2V0dXQjcUFBCisleVk4flVsUlZ4LTQwY2txdiVjKUJ9X3BTNFpQUGRLPE1WLT1kczlmVDRkUkFIaXlRJngoJTQ2WD52WEF7K2lAKDBPcjcobVZoX0YtMmpeCitYVHQoRj8kQ3Q/cmtTJD5WRUBRO0NmXnc5V1JYbSVDM0FSWnlVYmk8RlJnQzNUKj8wMiR6PFlPaWFxIy0hO3ZqbCteIUQpaDtONzlEZmpDCitnNTFNSmRDNCR9LW9HKGRgaTVtcGhSWntXUTt8TTUpM0t4XzJ6cnZrfFZLRX5yNEczYV5pWE48cDBxUClsZVY2X0B9KlBARShXclUqe3opCitaeEdOUE5iWSVLOyZNa2AjVH1FczB2eXYqV0NvJEZ0OyVuRWMyOzQ3flNneHliUUh7cUM/UnZaQntSVDdWVT91WlNYcWhUcWI9QWQxcD40Cit6JTZ4Xns2TE09cn5JU2M2WX1jTHgldkV4NGFSbG1rS2N2NlFLMWVRZWEkRk1GNnVtQGNldzB1a14keD1gezJFZG89dWBjYzs8bSsyTmFgCitLTGI9aCY7NmQ1TDJhbE49Q2luKCFVI2ZgSTJpMFFzY3IpUVEreVlAPndhMX0+VSNVfCVYcFVmdHtNcm9SdG5jfFdCOUgyPEtiQyF7ezlXCitXKHF0SVlsK2VmTUUtbkohNytSVzV2ZFpyeDBAQUdWWTU7cUx0aHxWPz1rWHI9MjRuKHRzOX4hV3w1NXA8XnUwJGszS0w8TWQoVz9Xcis8CitPTWdzN0c4P0hWPEUoMGwmTDc9fjQjY1gwT1YybChDUURLcipedGVfdGowPXxxejsxN002d2E3USNnel5uUWRVPj1LQUxsMWZme31ubGsjCitvWGRZWn1LbnZGNCRnTihQQ2diYkdxVWZNJW1fT3d+azh5JElHK2F3bnBBbG1ycThKfl80bHBmMGhfeihCeTJGMlc/eihmODk7XiFvN1NgCit8b2BOcmlMNUZjYG5qUDs3XzFDVFk+eE89O0RYeV5lXnVZLW84Q353STFldFRiUihyX3MyKUNQRl4yST1TUDElXiFySFVGVj14eDdAIUxRCis4JiZIMGUpdVUlKHRyeH5qWEFMSkR6UUI/LX1aV243ZTs0P1BAeGRTdVltXiFoNDFebDtFJCgmTmF4Pk97eWU8ZT9lfldHXilDSkghKDxvCitWSm5yYGJkTm5kJF81YUFsXjNgYEFtYj5zZV96PzFreyRtTVlsO0JWRE9JK1g9RWAlak1ndio9Uj98UlRVdmQ4ZX5ge1I/ZCEmZTlBaHUrCitgdUpKNygobGstQyRUPFNEQEp3R30qe2BFUylQMFF5JDlLSmpfez1VYGRzUEkzT2s5V1Noe1B7IWlBLSNHRzZRenAyaE9PdTV0KmdlKjBvCis0aDx6V24qP3RLRn52e141TUwtflVrVjJJMXJXPytnZzFmNFRWSzxRU0B0e0dHM09IVGpKbmYza2pFYG95fWtHQXU8LXRuLU92b0srVClPCitvMDFDSlJlUEJGV2Q3blZAYkxUPSsoPzEyTTc/YihIcWE9dmg/MThJMG9CY2tjfmN4YW4oMjBIZ0xTOGlsVSR0diNHSVlATXtRcjgla1FSCistJDNpbyt+NTlUe3xAcW1lNjhXZGxMPih1YyheSSFXO1hDWll5ZXBpeE5FdCNmbEYyNjNTaWNDK0QoUnc5TDJaNWZMbks8NU9aTW5qWG9JCitkKXxIVTR3bUsyIVNzdihXeCkkKGs/ez90YmN9WiRPdW8oZU49UG14T2A/PVNXSSZnaktwRCVCKD5UWFl5YlB+PDgkenJEWkszJlhhajZkCit3b0s4Z1h4RnJZRDJVYD9CYUM+T0l6NHp4eXJDWiQkNlleQk0rX3tYfWR2bj1sRD5ZRHorN1J5eVNkc3ZzYVI1aD5HYmxHZUdfeTZeWEZYCis5QmAoPDc0QU5EMmNeb3lNYj9LPlk9QVUoWUpkSDQ2ck1UPCRJZDtlPj5ZJHFHcyg8RGowaGRYbns2VHRMRG9MSTkhd1pLZzN2X14ySUwhCiszY3tvMlE3eU1nbEdMR0s0d0J+R1R3TElHWTFrPm58VkNHTU9fOVByMyNsJXVleFNFeTItTHpENXAzYCV+TzhEMSFIclJ1ZlA3OXs9VDlECitmWkVYX25OM0o2Tm13Y0hOUDRFS3M2PmQ7M3ItSkR5JSoyX3ZtYV5AXm51bytsSj1raiE4MUsoUkpvI0NvSGdLXjx4VHdqS2ZkKkFgbXxVCitZc1ZWfUlNPUo8c0NiPkBjLSstRDNwODxGPlVHWD1BY0dXMkdJUmExIzI9K2lkYW1zXjgkSEg1YkFoJn1+OHtFTmZsZkded2JPSXIyej1tCis7PjtaTmctbmB8K2dNQkV1RCE1ezIwZ3ZVRWw4ZXI/UmUjJSQ7eypvbHRFQmkrZkIxbDNAVmVFZU13XzwhbEtnUXsqYDVQIVl3NmdZYmhYCitTYyt5cXBBPCUlbGVGQl8lTnBvN3hENTFtSTU9XlpDa2V8NldoNnwxXkImQz1sc0pCJlN5MipSWHstR0JJMkIyPExHJXo2bigyKjBQem1SCit8O3dZMEI5YXc3YTQzZSRyI3EwLSl8SyZoZT9XcXBVdz9UcyVPVkw2R1M8Y0FYfntTOF48JEc0SWVoXm5Ea2pVXyE+KnghZD5jTClzbE9KCitCS3hxYllYO1NEPHglU0Itaj12Xzt+TzdJRWNIQGp2Y1lYRFdRT0kmSnc3O0poTEYyPHU0cmFoK2pHbnJLRnNFdXJqRWNyTkA8O1gpSHpgCis5ek8jMTY8RSE1NmQ1O1IoN1N7RG5CRSNMa19TenlPI2lKN2MySilBViopKnJmSVhsI1lVekt0QERleEU1bzhucXI0c2A2UlExNUxXLURPCitAVDBWbXMzVTxTdUU7PS07JFJzS3NFZSspVHs1ITtsOU8/TGlMWikkUntqQkNvTD9GfDw+PSNOUlpDX1BqcmZJcF83QlJZWWh7JVBYUUNMCitFTFI1Nzc9YG0waU9KLTVaOSZJJChmeCh0MGp4OTVTQm1CSmo+QXo8Nnp4ZlJ9WlY5WiN8LVp8ST5KIWkmN1AxVXprR2VLb0NfcX1SNVV2Cit+PXU4PHEqdnxMLWlsKHNrbH1IUDNaIyNlNHZyekd6Kz5QIXFFVjZHd150KjlSd3NrMU5TTUw8YiV1R1NueEk0SDFEKlNaZmt0MVZwM3VlCitRY3lhM1B7cjQrX0VEemckeWFoUmVZMHI+MypxRmVCSmpEKiM7NmJ5ZkchMUorfXYpSjJ2e2RnJSprI3l0Z3BLRiUwVFNHVjFzUkxrM30tCis3TzQyOXRYcCk5V1pIQWwhb0ZmOSpUckVVPC1qRlArUCtOaTJnX2l9fGZVcW9rOGM9TDEkUX0qNDJEKEBicy0tMCVFJGwoOURFbyFxJDkzCit7JFk5b3xJVlFvNT5pdnh7U19Ba01nc20lKFBjVG1fYWJMb0B0SihNUENsUFJgejNQaHdLZm1lJGh4X2c8VlJnbTxGNVF0V21jVUxXJCVCCit1TVhEWjR2fWlLSVZlYEx9bXZ4MiE9bStPN2gjTkw4JWJfMDtncU87byNIbjNCfE5nQis4I2NOQ2hrRlZoZ25INFIkT1h4Y19vX2N+WmthCitUYl83ZzMrYE04eX5HekR2dDtXTDctampGQj4layR1LWBlI0VMWjhFQGsofWMoeEV5KkghV2xrcGwyUEZeKDVkPFdZJkBgeGU1R0tUa14zCitjdTR3NVRpbUg+QSNoTTg+dGJLYjc1JmR4bD1xcjt8RUNgZzU4cFBJPkhYJU09REwjc3Z9UnY9NjtXYnFgV0ZMcC1YKT8qb3w3Zn04eUcyCiskPnNNdT5faGVkQD9QKExVPkw0VC0pRUd0Xmx7YUQocmBNOC11KG1OTVIzVTFrdWhieEBqNDVPX0d6TE0mZ0wjTlhkd1dWYFRpaT8oUGIqCitRVl9SKig8RU9aWlFVMiVhK19fJH13eEk1a3tqNilRNlhmanlBb19EPUtQZEE3XjIjYlduMVdoUzkzfGlQKUFNfHRORCs0akB1LXRHcyVhCismKytYfEh1ekFtVH59Q1p5NE0zem9WOExgJUpIUzxOTk5DN2Y7YVlyc2lLPTVQO1hUQilwKkxIfjAyPn1yYzE+Kn5JMT04KXY8QT87RVB0CitFfTJjV3RDbVdZX0V+NyRBdSg/NU4oSVMkcDI2QGwjdG85U3Q5alltO28/PEBTZFZWM1pLNCVJXztyQ2Y5NW4pc0p7aGZQeXQxJTkyYXs0CithQFR1KWd9dyNzQUpsajZQSVVgS3Z5Slh7OFdudlBaWDNSbFU5UH5HWlpTNHxYWUMobzwxXk8jcGY+dEJPeVJYYiZ9b2hgP1M7Z1JeYjF8CitBQntYMFcrTUEjPTxYeDk+OSE1diVgSUtBb0xCLSg/IW0lLVRuST89VjBmT3dzditKdz9SeSRZYjIxazNFd3trQzsrV2BaPTdHKUpVaWc2CitATnhGfXwySlFkT0MrWlE2bU8pQjZMe2prNzVqVTMyeS12PkFwPy1CVE1JWmwkY3VCSDFrWHp9WU0yMzxyMilHdzQ5aGAqSFRnTilVezRqCitFSE9UWjwwYjIjbGgld0dkY2B2UWxKQVdSa0xwSGtFUntrcEU9TTBSRmV2VjIpQyliZipQc009WnBRdFRGOGxILXpnM15aPWMxc0dzYCV6Cis4ZldfIzBoVEEwfXRxYyMxMiU3KEJYPj5uSTFBKDJUaW0hUSQlcnhzfmQ2PGUkKndwM0QraWwrcW80KD1XfDQrKXRpUUZnUj99azVSU0FNCitAeEplMVQ5TkB3TGxsMSsrYmFfKDN2Y0B9e3ozQHx3QzMlZDg9b0B5Vm9FR2Y2NWotUSkxeU1AUWw5dCNONXFXezIhZmd2SFNkLUhSSE1+CitESkE4Rj1fU3p0Tz5ZaGN9bng9QyNpLXZLO05tRVRwUSNFMjZSVyNuTUxGNlZtaz9BNygwJkJKRFckaHhQRjBwTTFxJCZmKSFvTUQhIWdsCitgVj9aTCgyWW97PWBFczVhNjtaNDlyTXZMcGZ8RWI2LShsbn0hXm9eOTI1VEI0Mj1XUyleaSRyIUhmNDdIajM+I3l6O19GaVNidTQjTGJCCitsMFRAMztjbj4ofio2OyNNeGskdXQzMEVFXzswLT1idGV1S3AzNXQ/YFN8U1E4Wkc9MUdjUEFyJGJ+Jl4pRWopS0k3SzRgSTE/RSY4U1F0CitgbG1MKFhCdXEoRzJKezsyXnhmMm0tKHskZXNzMmRiT2JmYXdINXAhakp1YS0qb2slJnJtfCN1TTBLJnRZdzZOYUtUUXxQdUFHIyNXYVE7CitBa3QxSzR2eEJWN0x2fVdnT143Z3plfFN7aEVKX157bmxOb2lwOGNMSFFadjM0bUdgRnUwQmE4bmF2YmI4I3EoUW1NfWdJLVQ9bX1VTmwkCis8d180WU0/P3cmRihyVEtxalNCRj50V2xkSUM1YFp8SyFrOX42S3dTU2ZvZUMmJEE7UHNVITVCRlJfZUslPit3I2ZmN3xpaUJuNUhyWUI3CitiNF5kPj44VzJ3RlV6JDFwemxVPVZ5M2UqNkNoNX5fNG9kb2l+QXVZVmJrTDRLVG9UX1piaGhnam4pUkxlKDcjanZLQytXZz14PTcwfEJiCit6WVlmTG9oeDBWYH58Yno0PTdFVVIkS0QjfTY0aylaWjZwNTFvVVErMjI0bzkwXlhMZXkyPGxWdm9veSkkdnMpM29vbFAycDNSZCFgYlJhCitefVJ7d2J0eTBpbDdGRmNAUGl0SEkxKnw5Sl59Q05rIWhLcmt4bCUmVEB7THpsQEwhI2I/blpofn40az85K1ZLJHdEMXZuWVQxZEE4b057CitlSFdNOGNUc0opKz1RfElqPGFRSl4pKi1Dent7IXxHSGIqc1pnKW0/Qn4mcXBkSXl3Q2g4YX4kdlRhNW9KIUVPWCV3clh0ZGk9R0dmKnNKCisrWG1oVHorPyRDemtPWj1IMjRxO3FjY1NoSndoZzxZWCMzYE9oPzJfTjFTRiEwJUI5KVR4dlVmRElJVHtSRjZKMXlGM2BfZ2NGQH0tSDVjCitpYFZUaExGbzFgV00qS0JxVDlVQjtTdHAyWEhzM3piQ0pBSWs3LU1RKSswZkZEUE8qTGdIPG5hbkFVKU95X2tZWmVBI1I/UT81VXhONDk/Cis7XlA7XjdnJFg5MyZEPCN5MjNpaVMyWFRVMV51SzM4NzNOR2dpKG5oQmclKnNzVCRkfGFqempkJFJMSEZnMkxQIVRyfF96TVdgel80Pzd6CiteQTJiWGx+bW9UQzd6XzZ9TjVJYk13Yy1SMn4+YnUlaClgZ3gqMH0wIWgqdG97e2pUSzxTYFhoOWJvN3FKKVh0STRwVVFXe2N+YWRpXnBBCitfbDs2b2YzbFV6JmlPKUlyKXN3aWxye3R5Sn59P1hJQyVUXkBDPzc0fDhRYDJOVXg8fnpLIV9xRXY9P0Y9ZUQrJG4meiYjU3k5OE08K0hvCitBQWxZOEhKQDMmWmReOTBSJSNNMmxFVkJNLXpVfHdOWXlXJFpAe3lRNW5wfE00R0p3JU0wYzJNPjB+I0QybUJVazM2ODI7VERPJVRzdWRFCis0ZWBme31zNz1fYnlLMSZAUmUtVTN9VGY8dU5ZPGJwZWwmQDNNb3hZbFNfajdLM1lOSkRBRGcoNTgqfXR6RUZGU0VCRWdtMWF3Wjt8ZkUtCisyeWgwdGspWVBlfnZLXnVwYz4+TD5rQXBqcCFOaFBabGVQfkFsUiRlWUt2dXB+PTdsMj0xJTg3fDVvWHhvcWFVNiFiM1omODMqKWpeJU9kCit3emxLazR+UUg4VCV5O3JhSEVUMz47bWlqaXg8UG04JmZVR1M8fCM2KEVYV2pFXjdSRjN9cyU4U2x3cXM+KGhmazJmfDkxRUZeV3ZMKFh0CitLN05FaHU+M3hMZ3ZDPTJNVUB8KmMpJF4hJFlXen40QTMjfmNweWNwV2RnMGlGSm4zfSQ3RWJCWWpZa3MtSHtSfCR2Q2MqZVN0ZnRuRkphCitkZktpdn5eZC10Qnh8anh+a0YxZlBNaVZ6NjY5bXklZzdHOyg5XipwZmFYTWI5VnpRUEl6STFfWWpYflRTVklWQjs5fD4kRlkkaWM7S3NVCisrWSEkeG0+RTBvM0NmTWVoZ0NAP3wraklpaWtmTDE+c2ZzQT99NEgtfFFma04mLUZpdTExbHFVYGNkZ3hOOzE3YyYqcFdPKWJiMWlecV9HCit8KmZaMyRPUkNETzJHM3xjNkh5RjxAOTw3PHlYcTR6I0lrMzQ9ZjspUFNfYSFub3xLVn1qY3U3USh7M342SkdoYmsqYSF5aUFRaTJVKVJaCitCP3A4PjAlV1gzelFeQD10S0Z2PTlOVVRAR356M3drcSZUZ1FLZGhIT2leaXVyRzdxYm5uKyR7cl4mUzNHTTlQNmZAOFlNS058SFlqND5JCitza05nP3xISDw1K0YpSWB5aFNMfE0qRERBRVJxPSQ7VFIlRU1KeWRecnlUfjxqQX4pNVp4OzxnKEMrR0R8RDJlbnpeZU15ekRxRDh7PXpICitDZmRHMFJ3NXR1UVVpRXY7bWh+X2pRa3pmU1R7ZU9gP0NgY0JQfV9zSUB2eWgqTzU1PDItTTg5QldnSEVvcF8pYDs1T1Fhbmw9MS1iM0dTCitkb2RZJGkmcmN7QXh4NyslcXtlYSFZQElqRmRpa2NTaTx8N0Ftbk98e1BkJD5nOGBTZiNwSW84SWtYMCRhZVJBKEp5MnstRVNtYkl9Wld6Cis9RS03Szl6KntJRWYjVnA7RChwZClCZzRkIUZXUzEzQnI5XnNkUjFfMVFDZj8mQ3pWKyU+dVQwfE01KD4jd0skWmNqe3sleDxqRURzc01QCishcVIwWm03KCNBKFNWSVkmSUxrPDZEYUltKj85fTdeNSolI08pYW1pJW1lXmojIz1LdHQhJDA4USR3YGZkeyklYVNpZylvZDk5JlpGVlBTCit0RkxUZThFYF9XJFg7R2lNSTxGPXJuTFdLeGBxWiR1bW9lQnVtPmZjczBiMml1UzwtJDVxeT9lYW15PTdDMmFganctZnhfdW11N2hNQ0RiCittJms4aGB4YT58bGgkbV9GJEFneTlFTUJCem17RjNvPGU0VXpIcSMybl48O0xBeDNhdDtrZHBqezFPald2cz5HNSpuSnRSM2tvJT9faT0hCitCS1ROYm1kY2xiQzFHNyoodU5DPDxLMyFETiFsMkB6NHlhR0NhK3pGfGNgK1NPZWZQUnV2ayRvVm04Vk19Yzd8OWs8LUlEeXxFWlpGeSgqCitaPz9SV3lUdiYxWis/T2d0a05XMERoRUhHdWNqdVcrJmVRJXMta3o7KDdzMCohYlJzeGUqXmctOSFxO1EwRl9MczZXeU0maEBQUmMmQlRfCit1bnV3SzlPNExyKUE1MVZtX1VBRm5vfHg/YHRsclRYOGRGdmY/ZjtwSUA9OXdKTCZvPkxZVUw8MVdsYXk4RmA9Y3RjU0leUTVIVUg2cTcqCitvZUlMb1hDWU0mcXRqVDZlU0VnMmp+cT9JO3tDb1h0ej8rfXdoVXVGKT1zUFh1YFVgfUo8PT5TK1VTe3gyNmZPeko1KiFmKn0pYF4oYVlLCit9UzJWKSktUmhieTNGTWJlNyhRfitecHRoWW5PMSkmMjAqVXxCZWgxTF9WJDY2NDchWk5ffUZtfjNqN3s5NXByQ1VrOG1zQkt1cXxvVTEzCitRWCRzS0NuMyFMNHFySGwzY0J6bHk7JSo3RGNaYE9ATFhYX2VNLUgzYFBueG51QkpTYnhyVjBjQTUwVz59RD96YE9CbkBUODR2SU98YlA4Cit9MzxgWDFMYWNAVk5ob1UtQEZAYDs3KFJ6dGx0cHpZaENLQENqSlotWk5NRWgoJSloTytvc1hzQWlBbGFaMGhVUXQrZypCO0UycT9DeGxSCittM18jRnEjaDNDXnBXeUhvMCFCcHY2UnhoZHwmJkJhN3JQRHIkITxLKD18YTEwJX1iTFByOE91ekhPaSFqMF53O1pvaiZBJCshRy1SZ2xBCisxJlk4ZztOcz9oSEs0RWRDQyliWTdAdXU5YC04WjtkVkNPYk5oeF52MkJBVW1Nek44VUZsY3tGYjEjZFVFSFluaGlZI3pTJElTO2xtLX1qCitVcHQ9Kk9Cc0NrbXI9STIjMGcmcX0kKUlMRVE9NUI8aXdYdEpZeEdrcmE+NU1zYjt5MD9ZPUZ9Xm5VJExsVWhhNksxIWNgY2AjSXRrbCsyCitxckZVZzJQM2x1YiR3cCtnVyRVUnJ1cXl6dEB0MjwpaS17VH1HS1kkI3s2fUZGaD5fYXZXST5AR1lHRGE4RXNiaDtEdWpqYDJwaG82MHhKCitwZ1U/UFMpS2VgT31FSUAySyM7ND91fW1wTzNXKEtwaHRMKDgxQkpAe3QtdXBefjVmYUFaeEkkWCNoZmVJZGhQJX5hcz0lVD9TSCR2d2tECis3VjtzRDJkRih0a1NBdU5TMUNhY1pyR1kxMyk8dTczPmNFNXpYMno2JiM7I2RmZjQoMlUjZEBpRipuYEoxeGlxaCZHQ1JnXmgpbjxrQiRWCitsdFI9bENEV143ISRGcjJoSEpwZUUqVClWUG1WUzZXZjduNzB1ZiRePmJ6bkhFWkRHUFp6aXRlQHJySGs9K1ZxREpCd1dRIzdaVjZYTDFXCitAeDxlZlojSFYzQzxeKW9kVjR6YHc/dmtLdjBRO1cqRVBVRT1HS1l1djl5VSFtSXhFaDxgQ3VCY0g2fSlwIWJUSjJAVXwqM3A9dCpLO2o/CitpXnZOKHN4eUd7UD5LMSRLV09zKG5tMSg9VTlGJTNJJl5SZER8ZnRpLXNPclUtQWRYYTN9aHctXig/QCorfTFzQEBfWktOV357S2RvRFA4Cit3MlV5N2JXezU8T0NscTJZUDVkNyRRaUA5TVRNWj84Zzl2ZGI8em4oSFpmKm44NkZie0ZQX20/b2dzLWk3NjIzWkolNjZ5KmJgeENeSlZSCit5ZkchRjY9QGRXRTZeb3VyK3xtPHoxKX0kOTMxYnBGR28pOU56MTZWTXgxYk1NX29zZSkoa1BJX0U5JE88PGErTE1SNCFQZiQ5WGAyaUJoCit7ZyhOYlBRRGg1alpWTWpWPVEqdVRQVlhDZGpIdF9UcW9hSyFAJCZvTT1UfEBgej1jSG9icEUlKk4rRERQYHpCIV9PRDgxfDl5VVA+eztZCis7S2t7ZjIqTHJmPDNTRSteRGkrem82bWhlZl5aeEIwLUtZWWx5ZERnND9lIXEyJVhXdT1Bc1Q/IXFoRmZCM3xBKyZaaE98Jkw2ODt6SklLCitFVnk5RTwmWEtWUDhheTNaU0xjIUE1IX49OSRVeHkpVzc9PVQ9dUUoJT4hPEM2SzgjNTd0N0N6cjxBSlBVKCpvNUY7eGVYIU0mMTx8diprCitfUjJSb15XNVp6NiVNMkBXM19gaCRCcyR0OFIyMypFZm1vNDdWdysjYipQezFSTUtDKVZNNnBhIT0rdE9weyQ2Jms4Nm5tVmo7b3Fwc0QqCis5IThFd3N0JV5tK1d5b3ZiI0ktezFQU1Q7NG5wNVJsNEdDO2BBRDBIJXM9blFiQmhRI2NYfVJoTzN+QyZna3Nocjd6PH1uI1Y0emt7JX41CittcURaRDRKZEd2Mnk9R1BxeXtwUSgmXnQ8NTNHaX5uLVdfX3MwfUQqbXQqSHQlOHUmcktNRUJwbHw3KnhYYXRjdz50RWc1JStvbmtvc2d4Citwcj9JdkRjamxydUExTVppKzkpY0FXRSFibGRHMXRIZyQkZjxuMVg0MD5EaEhzZmI1WHtfYFpwLW17KX1tJTckYmR6PlIya1NmTlJSbEZsCitAPCVVc1gwUTlSPiY3NCVFb3EzST9BPU5WVTRaJk0xP0tvMmopd2BOe15tbjlSOURUTkleXmAze0hfc0Z5JDB+dlBrTnxMOXg3RWQ9Jkc/Cis7PllxZUlYaWtRZHBmRiUwUGt6clVGI2pRYXNEX3I3VGFoTil7Qj0kP3N5KGdmKD1DNk8+ZlkmNnojP0VrcSRYTFYjbHgzJUgkJmxpV3NuCisxQSkkNEFIK3doQlRlSiFwTURhJnF6aDVlc2djNT1UXnpQdGZiPFcqNVdvYU50KXJicDNQT3x1RVEpMGFmZ01aaDh8VWZhN1YpT1ImJFlTCitlSzBKKD9TdnQmXzU5Z1ZaVmgmZz1tQXd3S0VUNmNXKEJ1eDROdVdZMlBtQyp2YV92a21VQVpULWY5bX5VZyU7d2VZdVZHPVNSJl4lZ20xCiswJE9jJnBgZHF+ME49Q1ZMdEJQeVliSFdIMzMtT3ZGOXU9ayM9SnclWkdeaEtFd3lteCVKUFAjKGpJRzVGMENrPVJ5NmdzaGh0Q2d3QV4jCit6ejcqbHYkWiVRQ0hjVU08fSN9d0N0VSReSyZqYT51a2NsQlZgJjhNdXA5X3VoVFN4eWFaO0JCSF5kfU14Z2I/UyNubldwUVczSChxQFk7CitHZFdSNjl1LUAhZF95WHRwKzY/UTVCdWc2IzZAU1dDaSpYfVB2TWJie3YkN0FZQ2JWYUoyRD1GVjltYHtRV2U+ZjlYaiNtNWlxOD1vMmxOCitme1drMklQJWFVSUdmZksyeEA/ZCEkbkJzRHJ1UXVzLVRCZmUrfGZ4T24teD9sM2hYJmtPUFZ3WCh1SF9HT2l+ZEZ5QEolMUIzbnRtSHFpCitQfSQldV5BWiE5djNDSXpzOT4lMylCKDt8R3p4TGMpK2VHWT5VNnVgMGUpdyU+Tih1ZERRSkVrN3E+aU5sJUhHR3tLZnN6WHFVSDB3OWorCitmNG0wUllKbWFIa0dMd1VFK3lrTzNJeG0jcW5SZmByRD5kTyNZakpNMzlvaDklVTZBTzNyaH0paC1jYT97I1V4RVp2MmBNJD5uME5VR2hmCit9SChxLVdOOFVrYWxvQ280blM5SzlKUnN6IUlkR3RFTytnQHJ4JXl9UW5CQ1hmZlpASFFAS3g0ZEgoMjl9cVZAbz5HNkRuXy1hbkVMaGF2Cis1RkxPKjhFfDs2al9nVnZufjFyenprZXZvQ3VnWEo1fUktJWF0YXB0QWg/K31GUillZjw7OGVlSE1gQyRDVFIoT0lKWmd6YUpmdWE4M0E9CitsSTZmTT5pZ0xZLTVgdjh7TjlyTHlsQGROQnVDUTQ4NkwjOCt1cEpWPEl6aFEmPE1WeHUwVz83TkFOSFlKYGxwZklScD4kKip5azxselROCitJXiZ3UksweHh6NTBDc3QyUyt2XjhyZzdRPGJqN3A5dSk0a1JpeUY1NH5YMzdhTDh8WkZ2TkslZ3YzfEFZTEdSPGN7VnxCWVFiN1Bab0BNCis5PGM2ZFk/K0ZOTCpodHV2M19MUndVT2JJU0tLZityRSNwOzRZZ1JRVDU5P2BRUnUmMUZEMWclXmFSUEBpcTlyY3MjTiZJVUhRJFByb2lqCitsdSlmaDRkbENCLVBzU1FlVjM9IXVZOEl7Pj1ROERYYSF2TDJ5MSlpY1lJe3BHMnFzKzUoTFUqT2ZeZDtDX0I2Uik7Tzclbm91NE9QYWFFCit0O2gxVnV3Z3w1KzEqRHZkP3lRRDdVVHE4US1PJFhkRC1PV2g+aipuQEpkZFdCYVowS0pHaHhIOURJNzlpVChXRGBveFFMNiZkP3UzbSh7CitpSkMzTWR1OE8+OX1XQjs1O2IqKj8/d0VnUjZgPSlAZHRKJH5IPCNGVzZOV1EwI003bVowc2dCc0NnfiQoVXx2bD5eYFQmQFgybCNjO314Cis5fkhIN2tfalU+MzhnOShPTEhkSzBIYVBuYTIpNHckVnVMbzMwaElIUWRUNl89dGluKnBrSz9LSEtSZXVtVzJqKXs3TWIwTSZXPzcrSz5zCitSayN8SlMzPEZfOER7PUU/ZXJPXzltRlleN0FycDtEKFQrc21YcFg2UnY8dW0wTXohIUw2V0Z6YUxeKEdyQFJCRHxpYGh6RnpeOSNtNjEmCitvN2hJST80ZkJKclNib31Pb3ZOcCtQVHAtdGlsTEp1JitXOU4oYXFGdXx1KTtvQmVVKU8/a2NCeTJpT096KEMyaHA+akJESW1CXnpqMCNJCitmemM7eVd0WXhRI3QlPjVtI3Mtb0VONnJ8TmZKci15V2t4JXhYcU5abSE0bmNaZzshc3RLP0tIWU10ekRecjtsOUZ7MiReZk5Za0JQVklKCis9LSVjRzMpYTg8Qmd1ZlhJQl9mYER9fDB0RlRZeTshTikyQyREYi0wfTt6cXJUOFhOcnsmd29jYHhVdSF3X3pwWWhIMFE4K1JWb049aGQ9CitXKGw2YiEmXmokRkozKERaYCU4UE1iM3tmUHBefEs1PUVhNVF7YTUhVUkmaFgjPklJT1R6aDtSTWFvR0gqdlhgJTxQOGklSFgkPSp0OE5TCis9I0NgdEx1M3tycEI0M2pPQ0J1R0hQXnhZTkl+JUEkWiVZNUdfTW0mWXU8dmJSUTVEKFQ0cUgxcUs+MlAwNHdHO2dPU1pTSUQ0WmI9Yzg3CitsZEo2bDNXJEJuQXs9Q25SQUtmKDVqSndDc1VhKnQxXmc2fUc5XyQkOX5aYSpFbjwwPnZVZWZOUX1kbVJZWWF6bXwkT0tHQitJT1I7dCNlCis1YGhLVF9NUlJZcG1hYnh0SV9vcUJfUylAYkRvc1I5eGcwQFI5RW45OSRUM0dGdUpUZT1CSzdCRWBUTj9taHZQfU4qSFh3TmVnUCpMR3dtCisxVG1OOGltWlVEc0xYQiNxJDtiWD1SQmxmI3t4aWtpQmV4QWBLJkd6Snh7N00xMDM7LXwtRzY2QVo0RitwbTMtQ3lXa2xPbjhBY2tHdGF4CitkXyhTWTQhMXA7OXElPSRFRThkOW5pX31SYj4/YWVFZWxmWGFZdnIxWEY4Iz8oR3QlX2xBZTsxXnppd1llVl5fVnk/NkteSnsodUcmbnRTCishMnBCI0w2ZER9WEVeUyFUPDVeYVVWQ3BjcWJuez9tYyNsSGc4dCZpNHxCZUF6VHhXTXlZKW5JUjA8MCYmUFdkVjtiOz05c1g8ajhqK29NCitgNUR0NCR7dHQlPEU9Nz8oKzhDUHFrUkJlQFhXTVpgI2IhVW9HM3FZTTNScE0lNndYSWl5NEVAOS16MnRTIzRZYnttUW5eITF1LThMPHU4Cit2NUU9PXhibkd8QzhlIyZ6MWNlcFB6WWJyQjV+QiRiVTY2e1F+ISYhWTQ5Wns4Z0puSDhhVnszJTJFdVlSeG04ej9AX2xRZzYyWnd1czRmCitmM1k2MmV+Z25VbUFNUDJKIz5Dd287dHxSVjZXJjhxWHkpJFQ2aF55Pz4+JHB9K2BAaTw/TjVCU3RiblZgK3JGTmFpYCZOJV81ZlVKdmh0CitycV5jVDZkeH1SWTErJU45bn4jV3JGTVptQDU4QTJ4PGc/SkR3bmszTEs2b3NrST9NT3gxWkV0c2JuM2owSHE4RjNJbDA8MWxmJCM8YnA3Cis8b0t+JkEkT1Q3KWUpQ3llMFcjKXZATzJVdyVmITV1WmNkaGNkN0dkZ2R8Mi1HcXV8NURfIXIqJTQjdElXRSQ0c1ppYjBsTjw/UFZSNEFpCitDN148OUl1QnRYUTBIKSZPSkQoIz1LT0ZTbG8pNEpuQjwtIUtoQDA7SSRPRT5RMVcwIUEzMEA4UyMjPzZEY296VVJWPWloJURlZndmZHhaCitrVjszOytTcGVMLVR1JjdJdklCJHtrel9XJWk+eEpyIUA5Pl5BTEV6JChuYW9sV2dkNG5EP3A4eE9tVF4xZjw5Xl9ocEsxcn0wVHZRJChSCit7eFJhPkxOeWgoeTd5d3hHYSZ6X2ROMiQkIzVwSiNkaHcreXlgU0JhOTlneWgoazA5KFFpQjZ5UjU4fkhGeWtzRkl5QlV6K01ZdiRSdHA1CitxP0B9SEhzbUdZJFBzRXBtPX1Ye1hLVy1qcTlZWCg0VVhRT015Rj9vel4lMnhwIzs5JkA3cD15V3VJOUJPZiV9KDZLLSVLNVRyPVFze3RNCitMdU9TKmc+Q1B0dUdaQSl1RFRpdj94YEEpJkVATzlARTVjdkFFNlI+ZU58NTZ7ZUswfktLQUhfa29CJWU9SSoxdUg3cilLO3tlMCNCNzkrCitSZGM4cjxwbFE+YXxOP2w7dD4tQW9weWdOTyhJQ31aXkZ1Rk1Teyt2JmcrQ21BK0R6b1A2OSFvSEc1VF43KD09PGQpUWdqOV5aN3E9bkRHCit0VEZiZE9ZJWVTWGh7YGFEQE4tTVFmPG01PVReJVB5bUxRdTJHSzJIaDlMJDs7c3lnVnZNV3pOVyN4cCZfQUFFYDF4SHl2ZDlmSTxJWWhqCitiR0kySHtRWkcqTXojXy1Sb09uPl5TRUMwWj5aPTFRWS1PMDA7b3tsQD49TT9gUW5PMDAwMEkwUlI5ZzAwMDFSWD5jIUpjNGNtNFoqbmhXCitYPilYSlg8eyM1VnFzJXphQnAmU0ZKRTcyWmZTSTFVb0xRWUM2Qj5RMTJHSWxAQS07UiZKWUI+QGRySTFAZHFmSWMpTnpJUV5nTHx7eWk/CitlJjVTJnc9TlJLaHVkfFYmXmVhPXZJe0o+ISE/ckZzS2BsJG9xb1ZPTEA/Zz5AdGJLc1JYaD8zRE82YnkjNnZBMDV8OGt3NG1YPWswKTV9Cis8PTZ5cS1MMjY9Z1UjKUE1bXpMczJtdTY8YkFTeFctV3pBQlkhbjNedkhSIy09Rnd8cHBnemhBO09tVyNwKj5mJTlyTzBOJUxUUT08ZnxHCitjfVF1dU58RCU8YGdFe1I4eW5ufkV1SishX3xUKD51KWlwaF9YZTgyJGlJTzlLUUgwMDAwODBQfmQ9TjNWKTZXekdRcjBMdWRhMDNgcWIwCitCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGSkVGfFZ7MzQ0YSYjfGtYPigmUGFDdj1HIUVXMHk0ODd8c2h5O2I1RWl0eTloNXxYUEs/VmRFCisoeEZMRCF5dzJxb29HYGVMISE2JT88ZCgmPiEjUnI1bCErdkp3Q30oU2lEPCt3M1JaNEo3fXExZTJOKTFXbTh6JHJnUTNXQio8NFl4YyVfCispN1dQTWtaeWc9MmZ0e2BDazhsV0lZLT1oKCU5PGo4YzhLdEd2cyFPPT53P1klIWM/JCYqek8tVV9mUHdXJDZaV0BKfm8rNT91R28tU1Z0CithZT5wKz1He1o+XmdHKU9KSE44ZS1YKjJ1ezFpLTJIRW9neENQUG0lOURXMUlgRUlmb15EJiFtdD88aDhSVz9yck5OV14pS2h0d3BLKHhiCit8cW16P2w3RGpGSWNeNz0jcjg1SUV0JmAtWDwkU3o8JTU+RmFDZnRRKExPKV5FRz5yc0s4SkkxbEJySnVFcnpjZ3wtNkNAdXs0RVFma09ZCis5PSFYTXIxYTdaZ0VKaEdqSmg7X1lwSHpvI3FOV0ROSClJOylFbFd7ZTA0RGpmMChPJlEqZXFXKklXTUVxeypHVVpnMG1qMzs0YVUhT25ZCitYUnBrPlNSNzxvVSE8PzM+QCQmNVdsTU52VihRRHx0Un4xR292IU5mJCpFeHVXaz17b2VJdW8qPkJWcFRGQlZWa3t+WDBkUyRKKjUwViQ/CitLTk88Yj07b3IkO3YoWSZvdWhAazAyPlklWE0kUlhBWm8pa2I+ZkBhVTBkcHt4O0tvbmo8YHdwT1FEQXYtc05nKkE7YSMhNlApaD5ANmFXCitBSzJtdGV5N0RxSXgoYUswMTAwMSYlMDAxV2QwMDN9bGE0JW5XV29+M3xheFl8UWI5OEtKVmxRN31WUGs3PloqcGBtYjcqeVJYPjJaVmRECitUMj9aeVUqeC19Tmd4NmJ1ZUdedSpSMzdJJDlnNHZ5REdqM2pIcmtMK0ZxZmZ8eGNZTkZ1YEdZYHgzLXYwTmlYRnEwIWxHWGB1aCg2ZFByCitAT2tVeTUzenFyez9pRGtJa3hEPWpIYTk+RHRaWHxHLX5QUEVTdEZpKXckVV5YK3dPa3syXmBfVD1mQWBFWUhgK2UzUkBtRjlpNVg+WVVJCitucGFnPHVDcTM7JGBtSE94N1BnV15eMkUzeW5tVXRwSWVpYVl4Q21HNDxGdld7ezY9Zlp7RUdmQTdSfGRXSFJ+Sz0wKUJmJSUmPz5JSzQ1CitPc3M+IzQyU0ExPFg3JWJpfEFnTipkMGB2K1pKcFA0KW1IVnZ3NihRT2RVRXA5UGReYzI5P3JEfHl3KzdZWjMmIWQ7YzBEfnM7Z0hQN3I4CitPOFB6QXIlV0BwPEJ1K0kjVF55aDJeLX5oOWVsWUY8WT5lZl9eZXJnVz5XMUY9bm80VlM7PDgrXzMqRzMqPiVMYyNkeEp8anMrTGltZHMqCisxdWdnOEd4Sz4jfH17c1JDKVU4aV9xUVkzc3dZNjlhJHBWRU5eWXpBaz9NKlIjZEBrOGpfO2RIM1B2X3ZZTXVzNV5VTktkPGIqSExxI3glCitldD1XWFhCJF5Xa25OMHJgN2tqWWg3ayoreD1+cz9UJGohMFJaY1ZzdkxtWSo4MmR8dyFRfXg0UkR8cWk+eFJYMzsyRjkhSlJgK1JMajNqCis9RWk7MSYlMHt2S0k0dylYWmA8ZEdOKDE8a0E2ZG0hUk5jYDZhOFFCXmNPLTNLZktARFJofHtFVT91cjJnN1dnU1VBZUtsPzhZdXdNaE9VCit6cWhBKndXdzg1QVorZE9GZERHZ3VIdy02dDw8Vy1gMndiRXFfdTE7a3VNcSVfOWAmWE1PWjB9fUd4e04qQ2Z9QS1aNUpUWEZyalFGbW5TCitFeUI1TjgkXmR+Uk5Qa0NMSEo2ck9PJlVqMXJGaFUzUmQza0lPWHh6SWpafHZJS1VmVUElbmhaYyZmZU0/PCt+bEQzKXk3bk5UYSVlRmlBCit9ZXU4ajJaQSUyJUwrNFokaWFQfCQ5VmYoR3psYUFxMXRnS1VWKiU/d0IjSm0yU2dKMHBiYChzWCt0aC13Qns+fj82RFIjaks1WTR4UXc3CitRbDN7ZWdPSE0mRE9zUGF3Km8mbnBJV2ArIX15SEZtWDVRZ1ROJnYxTzZPQ1JYNl8tdTx8d3NeTSZUb25PZDVRNnRQNiRQVXlyT096PFlsCitpLXZJVWRqQktyUDw3aTc4bWo5KjBEbDhiNH5JQnlVKXpsZHZePzF+Xj1mVzU+IXpLWCFqe3xpYHV5cCktI21TQ19WMW5+dmdjJjUkPWN4Cis1JDM9Yyk0RkNZXlk3aHBCJmhQPCVNWjZJWE5EUFI9KGBRYVFtZlolaCFuckIoSU57WjI/cz5sOXQ/ZjM/TFg5I0A3PTdiQCE2bmskSSZXCis8UEJXRnpEcTUpMUlIVklKJkx4aC05XmYhNmdSP1lSP2RAUz9OPjRffExvaSg2emJ0M0wlWmwoJWpJYGl2MF9VbTc1K3BhRnZEVyRgOC1ECit1Z1BIfThXVD5PbTFWIUg3T0QzVVFiRkI1VG9UR3wkWkgrT0JUTVcjZFcpKkY+ZGFEZz1zPmtiKWBNdCtLfHRBSC1LOGE8aUVeS2FYJkBjCitOUzdKbzVkMjs9UHp2YmkmJDdoR3kqfSRAN056QTB+SlVOLXNJfDBiNDhsTEEwV2cpI1ViTCFGX31sayE8YUdla1VnOHk8ZlhhTE4wKWJPCitWYmcqYjA8cX1PbDE9JXI5WG1CPlZhPXxCKihtVl4mfEhENHFRdShJcHQ7ZCNHU0Noelk7cXFNaEVxUllYQmZeQFRgVChAK1IpfnxmekUxCittVzdgR0B2WSt4NWdrZm5xaXtKb2ZrJTt2RDtgUkdpdVYxfU1Lc0IwbmZuSXdTdWp1KGFARTZTVHlvdX5KQCk9cGZudkNgZiV2czV0cFZyCitJaSV3IUZ6dlJ9ckpCSEo+KClsdSpATXJQYWAxKEpwWTlGc0pCV3xuIXwrI3ptV3cqaW1VSEIxUzBJQCo2ITRmbGojcEY1dVpgT1d0KUx6CitjUjZGcXhuLXJUb2t4dVZCWkpocm8tVmdSRXtVbFE+JUQyMFg+aTB4YlMtUSlKc19jOHRQdDB2PntWcEVuJlk3eEQoNihyLStlJW9wNFE3Cis9RD9KZ0IhNFZqOFdxZ2lEREVPUDw/JHdWZ3lVZHZwWkNwKX1kaiU1fklwb0pmaHd4bnp6P0lJRGw3ejhtJDttP2ZeKTxlRG41KUh5PCM8CisyTmMyb19FaWYycjhMKDM9QTA5YilLNTk0aWU2O3l3NXJHdkZaOVZ8d0lgODRkNj1jRnBxUUFnWlBWckAyT1BXWGZSUmsqXkVlcTg9IWpiCitUeW4jVlVZPzBTMFZLbX16UlczVE16YndJQnBzaXJYYXVWdXYmayt1Xyo7OVJYRldFaEhMREM9cHQ1Rn1EMUUjKGdeKFd1eEMobnBpbDRwCitiYTFOdEY0TVVweFVHKG0xUCV9UW5oM0xIKWk3eSUzK157b0o4eVdaSHBjZWFHSTkzdVF9UTdzPWc/VitHKGYoRnFIU19sMHRFZG1BeSlUCitRWHc+fjxTdjlSKnVgXmZgViltTldxeWRETURBemhrbV8+MD54aEtiZWhRVExKWlNGYFM+OyYjZilqaUtQMX1BTyV3cmROeC04R3EzOXM4CithMXt9QX4+QCFhT3hBe01VJEFUbitFM091cSpRTnJhN204WjchJnRWfUwhVUBlM2BCb1JlVkJWfStNeCk+KmopRnh5MjhGMzJQeHB7WDBsCitNaipKTDVJcE1AVnZZI0JBR0dVMGNGfS1rMSV9dU00b3heKGU3ekExMnZaVnBGNFlRRm5ffntkXzdFaGNtUSk1a2M/TXcpMDBXNXVOS0k4CitYdk4oWGpoXiEodzVVZU9NPGcqWStUWCZYTnd5Y1ZMVyV5eF5mXjZBKWFmSnghIUZvfHdwbjh2d2tFcH42LSt9SjMzYihrX2hQTU1wdUJzCis5UTFQby13XztEPzM1NmF1Skk0PSl3NFQ4WXlwdWh2R2JHdUhKR1JrMGU7KiNySExMYE5KPCY8TVJWbERCe3VAeUs2NzdLMDlkSlU2PjI8Cis0K2lIYWpOZ3I2aHNFZWgmb241VHt3ciRlQjEwaEo5VEA0NS1gaUtVR0lvMFZGKSRrN0w1ZGB2Wik/e1hyOVdzNSp9QnZhLWVCOD14QylNCiswKlhLYj1haGtNeiVUcU9uQVhGYUU+NWojJT95NEA+TldTJVVPNkoqOUUwVUsoUHY9NWxDPGtXN3Z2cWh4dDAydFFGWSlZKnw+Xm1NIVErCiszMk1pVGh2KWNJMXJAMmswJHNpR01zVilSNilaKW5BMmZZd0cyUS1ASEBSJUV4MkFLPkpqaGE5I1Z9K08yP0RSQzU7c1NTJW9jXj0wa3Q/Cis5OVNpOFRHWCtXIStaREQoPUo5e1VjOC1VPyZ2N0Z7RUFMM0l5XlJwVDdxQlhPQyVQNkBYMUVrPFl6Q0FCd2drNSpaQGxFVUxJN31IbCFICitaPFpGZzs5YkZvTiooJk08QDFKXygqYW1KTzBtUUpybWMwNGtmTT5kfEpzelJZdFZtRFE+SFZ7UnFzKVc0YD4mdTFNOG1iQFQpflhFKD9GCit2Nl45MiFrKGV0JHFtbXd7PVRPUWI/dWZKbl5FdmNyTnElaEQkRChqeEFTUGd4dC0remMzTk8rc1o3M2ljb3M1Qnp5QUhjQFhHMiQ3NU1iCitCIURqOER1ZyNweUxqZ3psWSsrYn1MRnBgOypYUE80PGh+VkRTfURwcn40QXZrYE9kOUhrNUFxT2xfdzBxQmk7NjBPb3QyMjBxQSZpZUdNCitVZVVCKDI8Rkp9UDlCZ044JVp1Wjl5diVEcTdWPWJRekZaYjFuYy0xI0V3PSR1Tm47PmpLLVc/T3pzZXJ1dkc+bTQwKjFFNDFvPHgybHt1CithcU0oTX1gS1Ztbm43Q3VIJm0oQX0xU3UyOW5LZ25DWEpOLTIkdjhndkhgdk07VkpkUm1WaHk0WXIkdzRmYVkpMFo8fT1vMHUyaTZCckUyCitIK1Q3ZTFDLThqTllUTVEhcDxHVVMoZS1UVXsyNUpEPGl+YWhHaiYwcWtgN3QxSFA+ZG1VPlBsWipyKG1RIz59QGxPPXREU2czZjJaZldACis1TjNmQEs5aHRgbGVDczBORUVoTD1qPkFyUlNJc3E7fDVpaGBfdWUoa2JyKnUwbmxZJiRmUmhpQHNeK34oclI8c2U3em0rd2NEYnBlO3tfCitYdXVtemFXRSRTdUBFQ0F8byk4bmcjMTBzfVg9NE1NZF8mNHp0Y1FjP25SIz9jJjFvWG1DJX5ffj0pVVR9YCZhO0xjIWlySilRSyZqOWRmCitNTF8oVEA/eTtBRnByNURsNTAjbFVXP150bEN0dENvfV93VzhoQyZ2TVpnMzZQRmN9LVBQNFk0YDFWKjxeTGk3Kk1kcEd4bnlic2ZQK2sxCitVY2l4dUYkJntEZ1EwT2VxNUZ7Vn5eTC04YlEqYnF6MjF9TnNQVHdTYE59Ullja3N0flN0VUtWQDdhbiF2YjI2eVRHdGIjMDs2ZGt7NCFoCit5bzR1MWQ2TERBXlpnKmRJSypRU0A9UV9gSyZiS0xtdlA/fVVBMkA0TDYrSFBPaURBO1RjeFkwWiZuV2FORURwTSN8QXxWeFM7ZzZpYk1rCiskTy0xQlhTRTJ5UmQ+djJGKkZaJjBJcWxKMkNIP1FwI00hQCtSUFlAbzxQUG1aNGwlSTRBX0VUeE0wO1pZayg2JlQlUjRqQ0p5NyE4PWZXCit3JGtfUHJ2PjRLWm5iIVZNcnp+X2BERzFPTFJsZExCbCtER0c8aFE+Wm5pfjwzQVZxaSs0Nyo9aUdFNTJIOFMjNmxqNkR1QnNjMj1YKFdfCitEOCFUcUY1PjEkXyh8Kng+NDBiVUM/UVRZanVVWjUkaGhmPlZsMVRkNntiNjRJd15vNzVgNDVIei1DJGw/fFlkY0Fwd3t0cEBnfHBtaFdHCitgT0diYFkjNShHVkpxemg8VzhtaW9NdGVYR0Y7P3gxQ25tUF5jTTtPdDg4dVdNJCs2OWUmYF5XK0Rga01AOUZxViF1eXNZJEt3RDRFYktgCishV25OTH1yVntMLS1AQ35GUCpjTWRoZCR5QDlYZTAtfE1UViFsdXVjMmchZmRIYG9rR3NwSDVrWmIjY2coSXVufnErYEsmP2grM2YtNHZlCitnPWs3PTY/dzZ3dHMlTTJEP3xBfjFjYzJge0l9am9zX1BEUShgYyZLPGYlOTBIYnUhaG00cTFEZEw9PFZkVGlSXjBzc01DRmI0VktuKEpGCitTMShtYXk7S1FsaWpDQEhjWjROeUQ7ZWBae2s8TlB7JDxAeFU3RlI0LSNxaEM1U09ydSRwe3I7fGZiVUN7Ql9hP0FJbEkwcXI9N1EzPG81Cit2fEdaaDJzPzBeVD0zX2ReJUh+emI+MmVjMUhkcGFMPHktJSkrNzxFI3NZS05lQVYyXkFEcTxIMktLMiZGYC14JkxQb25JaitEbE1sZ2E+CisjJHJ+Uy07NW1nV3ZnalR+Nm1tclpLQG1xOCFnSlZjcHNBd0RCPSk7M3NtO3ooIShFIURKT1dIUyo2WXBnUUBYPDElUG5wd1BMdnVJdTlZCitgVVhCI2ZzPHZXTlJGYStWSHc/KS03QENeQ1liTShPVlYhPngxWWRPfXc9ZkxFPzFBZi1WQUZiSUBxdktMc0J7bShQNUx1OFREbFl7cj8jCis8b1g4akZqUHcyKzYkJF4mUzE4ViZUREpaIzdDSV95aHcwamF8WiFlWm97cl5nSipuaWI0Z3pAbUsoLX1oQndgbHktcVdFPkNPOWp0THs5Cis4ZWRKSlFpYiZXeGhRO2FyOzstO259aE04eFNNYGtRZ3MtTntCQSh4Qjw7PFlfWHZxKHRoN1kyc1M9JlFMPShsN3dvPDRaUkFjVCt+cmIoCitMJmxnezBZfCUxJVFAT2diZChqUyYqdnVXc29gMjgkeHFsY3FkRyV2YWBoPyZFN1Z9TjUmNElwOXw3UzApPU1CZjM7fCVmKD4od1hnQW9BCitZdkRTMUxwNEJhYjJxP3VhJDhFayZmPVVSdkNhREEpY3NBJFNKQVNGRlpjaWF0OGwoaVN4bTNiPTw2XnNoY3JWeWNRYCRoWjxzOWhUIUFwCitGc0JhOzBgZCszUl9vOCh+VDgrVzJLUnY7QT1jKnc9czx3K2tlJno5fnVUVDBWfmQ7IXk2a0ZrWkBjbUh7OEEkYjN2WUB0UzZrZlNBfUpQCitGI3kxeEp6ZWtwZSE5c1FebElLR31aQl9takIrPWQhRkNkO1NFfXM2SCZ9dTdyO1J2alRjfTMmRW90cjs/bj49YzN3ZlpOSC1NMCg2PEcyCisrMUNOU2lZcGdRZU4xdVhWfWAhcCVoaVFGZ14zZmZuQitfVHFUJCkpPkg5KlEtdnwqVTxJNU1RKCtReitqSlotbzE0aUplbSRFfCFqRmpRCitlND00V0s3QzN3T3J1a0tPZ3E2clFre3REPHFpa1lELTFkSGE2KCZCXl59R1d0ZD9DfnZ+KEpWSkdpZl9QWWBecTxxU3ctNmMzbDY2MTRDCitIQnxNQWkrSWBvMFpzezs/MGhfeDBvdG9iUSpIYWg9QnMrJWhpJXo9K2ZTXjVLdnhpdXt3UWVXUyV+QWJ7SnwmWk1gLU5GSE50YSpGVDxlCitBXlJxSFdBWTwhRU8+SitUTTJ3fFVfcFFwR3ooYFVmI0ZWaWBUdzMkd1NxMlc0bzBYUmZzMFNfM1dTYHFpezJtTTl5WThPLTVeWFZta2Z7CiskbFlIIXhmJDhrTiM4JHdSMFFOJHk+RTVgYnlqSSlpQUVqPFBJQVhQQXg5O2hRXjJfVUJgWXdFYEpiQUtlNHw2X1Y9XnlNQnI5RklteFAxCitLPWBTTCRVP20yfWlGOXZ8JUMyK3tzU2hDbklWc2UtbUg2ZXJBNHReMjtSVWQ1TUQzekQ7ZXhteUYtWjlFalckQkBTZ1RxIyo/fT16ej4mCit2dTY8KShCPmVKZ0tyY29nXlNHRyZYMWdaMVlxTFdtYVdqWj9aaUtSbz5HRTRTKXB9OGVTTCZpMjExeDJOT0o2SzVlSlFJPyN3TmtFVFpKCitWUXdHZSZfflplMmhCIWBOSTNTPz92ZFVESjBOKH5vYlV1KFEzWnVVRFBjVWQ4M25QPWIxKUhiUExqWCpyKH08NDw7M3lNaU0jYChlenZFCis5dVJKP2Y7KnhmXjVHaX1gdypxcyloa21TQnxsdEdkRjNeb3dpZDlIVmhRZmg/X3I0TV56e30tZDxNKns8K3BEKnR5Wl40ezJUZHghRVpACitDSFRKbWtFZTU1NUx1Vis2KHVRYWBJX3loMmB4cm5xfm9ZQCpVeFBAYGYybU12SHF6QWU7RmRvTTVOMFA1Kyg8fGJ9PCNeTmdRPyQpfVZsCitOKVJJVHo9K3R4U29vTXR9PEdIZG9vfmM/anlpNTw+WWJBaEEwbUhgKHlzamdENF9jZ1IqeVJVUHU5fShSKTxpPitrTSolR2V3VEBeNEY+CitMU0tlYTh+dlBJT2dJTWV4YipwXntKaXUkbG1EWCNaLXwmKml1c0RrNExEYCl6I3dFbnh4MmklMV8jcEtTX280b1I3dD85Rl5JKUZuQz0pCitxTUYqKk1xWTFlYUIhRXNNPzBWdyFZKUp5JDlpOXAzNFlnfWpZQERwMlgmNiZyPUolfVVESkY3PCRMM1ZtKCkpTnwlQDZ+K2V0e0woNHlLCituRkYyc2AmZCNxSG9mTH5VaS1eMFpeelQtSFZmbzZwKTRnKiZLSnw0Sl4jO055MnBOYDY3YXBvfF80Qns+fmA+d2NhbEE7S3UjKGN6NWpjCitgbigjRURRZShZdkM7d0ZIelZgdmtqJnlNb1FpZ3g2fkBVVm5aNG1TIzxxVkZVLXEpMWY2RGw7T1RfQFVFJDt2OyZVPFUoajgmNW1kVTZRCit6cVRRd3lGdihOVjxqUkVHTk5idVFaUEskazxCaCkkQGNeNHl8VnR7ZV8jXzNseHx+NH5QVFlxPHtTJjBHS2JFdWJaeGdRT3x5YE5Oa0FzCitucn4waEhKWj5lQHhYP09VZGwzfElVM3dBbD9AX3Zed09EN3M2UCp+LWUyIXNvTXcoVEZANWQrYTFqbnwlNmpkLVF8VzNsbVp2Jm1OMzhoCitsPFV4Q2ppaHIoKk4mbE1mdkcqZzFLfjhTKFNsI354MG1RaWpgMTxZUWA8SmkmXmM/YjswMy1hOVF3PWBuNVVwdERGNWpZX1RhZGlsdGhqCitOVEY7V0IhUHcoOF5AdHo+NmI5em4waSlLX0tpKSpjbDY2eGwhMXhnc3xpPG80X042dlZBVCRWZTY0Qk1ZeTlSWXV6YDFKb0dhU0RXSUdQCitWfENHWnVCbHpIMElPLUhTaUd7PiNoN3QyZ2lke1FTZHYldi1zJXU+RkZgJkArPW5ISkdgJU5XeHI9YktLZUdvQ19DSUVJTVRNV0FZS1J4CitsfXpLMjhrMHswPnZONFVAO19mND1uUFltdnJ+cFM3fV8/ITIjcCsreU43RDI0Rlo5OWFsSVM2OEl5QGQhTDZGTE5WcyM1Mmc4RCVeVHdoCitoWi1ZeSkwNDVuczx6aCNlT140OHc5Q0pjZm99LUE/LUVBNT85fmhTUCgpZm4rKk9hRFVuRyZmREJHOytlRDdQOylWPUVCPWZEI2xURmEmCis5aT9ocF8ofEdeMEhtP1ZOZWFAJCNkXkAyMkdGJX5UZlo4T3dnQ1MzKCQhUHA/ejk2TU5HdVdFYio0WUFrTTVJc3trYWordWhBZH0qTz9jCitJdGZlSklWRCUrMXFXUlAjdmt1anN+JCglViRuTk9sJVMqQFh4b2lFcFUpQ1g1e0kyO3FOaHZrP1Y/X1UkUUxTczcoVWp5PlpPTERtQW4mCit1QGRjVENZenF+Z0tsTlBON3MwbEQxJnRfIUo1NWlxJDNGKUhEWE5wYU1NP1BVP1F1fmBrQ3huMzBVb0l4OSUtfUs8czlfYjRxYmEwRkshCisobEh+dHRtI15qfmN6MUV8eSg2Z2hfYlp3PmV6ZUJSRHErP1psaWtjWHJwUjBhY343WXVYeVJqSFZrc14tVkNVISs5QW5Ca3JIPlZaOztxCis9d09mIVVQSz95JXh9KW0jKlFNIyhVZSktM0kobktlcTRrP3NGazZDWk4pKWtTalFCelhLcU5ua0dfMilKWmYzbjs+YzNjUCFZVGpCK1RZCitpZzZwYmtGPzEyanBwbEd4Xl9rdyMlbT1DOFJ+PCtNN0tVR2Z1fXZ4NSF4U3Y1d2Q1Vjljdz1AYTR8RDBjKzJ2KTIqNlNieUtCaTBKOEBhCiteZk82PWQ2REw7MldWezctISY/KGYkTkw2Q08xXm8lUk1eO3pOd2tndD5ENWxFRlh9P2AwdlBhfjhEdldvMUpJU1ZobkRMIy1aSGtxal9PCitRPWFSSVhURVcxPmJVI2xjRVR5UD9qOXB3MWI+TnlEUj8hVGxjVClQIVp8eiV6V2M1aFVye21XZy0tQVZNbEk5aXFhIy1RPUg8MitabztPCitPYVNRZ1ZzVTAtVzZjeCQpSUIoenNqPExOTFcmN1BQVkcoOzNudndJaHJNaCFnYUA/bGVAeDZGQz1rJSUpKC1DYmkrbFJTOTh9PFFmJTNxCiszey1iQHlYTjI/ZDspdzxvRWNSdjlKIV9QOzlQQk9tKSNiVXdkPF9oQV8qKWk5QXhWbktHNjA+MGlTV2BwP3J9MF9sKWJZe0Z7VWBAdkE2CitweH1gJlI9QU97PHooKUFZKHs2NlgkXkFUKTxzajZSUFlgJUF3ZVM7dmtraEZzOClxSG5LSCY0QWI+enBGVlV8OH1FSWNeJj5CXmZEd3orCiszMW44V0JFPjhya0MxRGxgRUxxc2x+X3pPVGxBOSlNUDM0PFh8Z1YlNXs3Y1NyKl5jZ1ZOQGxAOVImQUZyantWNXtsbXhKMjhLNDswbGJtCitzeWk0RGBoI3EtNEFiX3t9I0FQI2tvPmV0eGZIS1R4e3drbm0tO3FWX3V4YSNnY0koK1ckY2U7ZnRXRX0/V09OJkZfT3VnRk47VForQ2kwCit8X0hyPWQkYENnNVkhe0JOMzY0NUMwYVdDRU9vQk9pNGNlQGI+d09LbUoxKiQlMDxNcWEyaCVlaUc2ITdXQFJVMFp6d0RCcEpQX3QjSylpCitNRFY1WDdLQX0qS2IyTmo0MEs+V1lBbDR5ZUgkSDFQNUtAWEh4Sk9RVUJPRkMwaU9nY0ppMkl2ZXNPOVdhcWskckF9ZlJ8KDB4QU1qbyE3CitCO2QmU0Y1JXJQPEc1e2l0MGVSM1I1SiRlZkYkMmlHcDZ6Q2ZyfHlxOXNna0M7OSl+ODZuI25ZcCNVP1IrITUyYiRXYyZfNHEhNCEoXzVBCitVMjdGVjdCWCRlazlxaF9rd3p2QSFHUFBPZk57TUI/TG50NDNlektiNlpPMmN7U0kxOHNNKkg/R3Q7YTQ2emQwQ09XUl9gN1ZzOHQwNE90CitZYEpeSDxgbWNyaGpKPmZ1U2ZBbmxYLTR9K2BNNVchaD1xZExZPGJNSWZzK2JKRm4+M054NE4lRHlVYnUrdVBRNztMKXg3cX5gb3wwX14+CisjR1lfZXomZ3ZXJE8hbGNsRk9KRk1PcG49ZWU8WWJsTEJIdm0tQXokYipNXjctfGhSKkVWdUghS3FBbWVOKX53bkVLYlY2eXUxQkh2PiQmCituISs3VUheTXFQejw1Y0leO0hrX1IrJVV9TDNPKnJET2NMRHRuMmJ8IXBPMGt1WkgmeStAejc1aHNDZHFeMCZfQXNiRFk2KHhZNXxVXyN0Citwd1pWeDZ6V0o2XzdCbGNHOWVSYT1jQCslNWliVSFrSVJhQj5xSG15X2VrdDswe0hEeWd6R1lJWjNIZllJJCk+U34mO3k7azhQR2ZNMzRZCitQWkJpOXc/UHBCIUYqU1dtTl8kaWJoRysraWdQekBDREkwSFlVMFp3e3tGZF94aVB+IylmYUt4Iys4JD5uJTg+ZyRIWXh4M0JMKVIhdjVQCitHX3VuV21DdEBBXlNEYnFFR3MmQ31ufWlARDQrT3thUlZaMHY1Z1R1X2dtMDJJNiQpVmwpXjJublBIeXh6WFpUVXUpSDhiMEpXIStHZWNMCit0VyhncW84U2QqOURGa2o5bzJ2YXZKezglZH17KGBLX0RMKShwP1lARC1pWnh5MERXZDtBOCZNc0tVcGRedlorV2s7Wm9INns2fWRQcHwqCis2aXBpZjlaJH1wQmV1fDNOSF45NGpSbFBVOXJqM1Z6dERmbkZLMXQ4Sjc5OVB7OUNebkVhdGl4NkNMcCh0TTlRVzVuQ2NuNF5HeDdUTl51CitSaTtUYiNnajFtb0pHP19TanFfYVFJSldtMyYmY2BaMSt7Z2kpVVhSNTtlU1p6ZE9JYSZlbipjbS1MV0dCSX1ZSzIyYVcmK0tMPW9yOVhgCiteO0pJKT9eZW02WE55eEBsNUJlPnExVmpNcWxUd3E2M0ZOKX4taUxjTX1kOyZJXz9fdWRpbzMpKjdhP3s0ezR7P0dgSnxYei0/LTwxSSN+CisjO05zbCtwX3ktS2BqdUA5KFMjUDQpP0Iqb35CNEs7amh4VlZlcDNMO21YMTVvVjk4X24wKF9xNlRiUnlEbD4rUShWJE59LUBuIzlzWlgoCit0YzNSSCphZTkjdigyeCNIbGVRU09Xfj4mRVRqVmthODd5UzV4em5nMy1NK2M/T2pZYkRORW5EPjhrSG5vUVBvcnNSOHBCQCVfTkV4PXxwCiskUXkjblclIUIkKzR2fFNTaGVGNytWRWpxeGI5VVZNQHg0RGtKbF44X093NSYkQDFieT5hd0g9Z1dCdnpzbSheb3ZZR3o7PGQ+O3lyPFZlCis0KEI/QnpyRzB1Q0pzc0M2dGJNTlltNGY3JVhQMnxGVWFNMClVY25wey1KI3c/WlIxamU/dEJ4fTZNSmQ4PU84bGdFLU15Umg1UUIkPiNCCitvVF9+VmlLY0ZhVXdYMmB9UFROPCp8bUcrNXkkMG5Rd1pRWFpvZik9M3Y0XlRAMzFRWS1PMDA7b3tsQD4+RDc2N2dHMFJSOXczSUc1cjAwCiswMVJYPmMhSmM0Y200WipuaFdYPilYSlg8eyM1VnFzJXphQnAmU0ZMUVp3VntkTHxYPWc1RFdAcWhIJVp7NXM1V0xTPGpGZjkpcX0rNExECitOK3VSSGFTQHE4bFp2SjslUEtKWT5YYEQrdFdQT0FSY1NqVzBaXks+Rig7OURpYD16NjV9Ti05aShfVXNTby1xKiVZKE44SU5SamYofkwmCis0dUtDXktoWVU5clB9QWZweVRHbS1Xa2t0dWNgOFZPUDBqXzY2d2JkT0UxYDtJbj4lbkJfKmZ2VG8hTiE+KE9Rbk0zYTB0e2JDJU5yfnYrCitgRXFVIXBSejt2SWhOUW5xUUVSbU49enl0bUZAeSFoP00zLT9QenxYfT1gVDZ9QUZJVDgoO3E4IzBwfilsM1hEY0lJVnR3V0x0aGhxVmZACis4JWx+O3psMUdRP24zS3t6bzlOTXFKSDk/ViZRUHRld1Y5Z25CTzc8blBSPnJROFZZb0ZNTDBTOHA/NnNgSjdqUGBZQT9NYCRPX2hjNTFFCis0dT0wZzExaERGUXxocEdwJXluKyYpbSt7SEcqcW03RnlmcX1hKHRtM2FHIW44ME1jVmI4UWZxJSEyPTEwQWdEfFBKQm5AYlc7WiNYfmtkCitFUT1rYm5NdXlfclEmKjs+RFRuMHBYel5wYEZSSmVsRzkzZ20rMC1UYn5NJjsoOEwrTXJLJDQpKWtnQHkqNmlwcDFRKEo2IUdWT1FgSWJ3CitAJmE/YS12KFBqZ0RLayg+eUV0KEtYUG9xS1lGNmFiYEdkPF42JTkpe2I2JWxjSiMtTCFjc3pTeFZhOGthJm0yWWk7RWt2aXc+QDA3WG1xCis7cmxCMFcqdTUmKGpyPD9ZY1NNdTs1fmZjNmBHMXBwLWVtM3VEPDJ1UiYhISF3Pzl1KWdQKWg+QDZhV0FLMm10ZXk3RG98M05GZUFRMDAyCismRDAwMWZnMDAzfWxhNCVuV1dvfjN8YXhZfFFiOThLSlZsUTd9VlBrNz5aKnBgbWI5ci1QWipGRjNYRClEZy05N3p4K2N1S0ZgPigpQyRzCis/NldibUYrYW9MamZndjdPZX1CPSlvMUc8JnZKcCh3fj1PcCNpR152Q3ZrZkJWZjAwMV9aVSt1MyZTaHQrIytCb1lgNWZjYyZRKy1JWF9CCitOazx8SUtBOXZXaWNQVSN3VG4yd0xhVStSKEUtUHhoUjt3SCgobnRVVCgwezEhdT4xI1VlfURJR1l6WVZiMG14dFcwTk41b2MpdG95TUhBCitjWllpaUFJMWtrYWEqdTNvdzI+NjUycSlHWis8eUZJdkx8Ylh0Jm51Xj4oOSgzJkR5XmYlRjYqbEZzQUhHQUQyPlBVbCZebCVTI2crRkhDCiteV3FFPDxAPGB9a1NAa1hGYGtTfkRZeDZ1PyFwbVM0NzdNMUh1Zmx2NT1SO14yQ2lyfTwkblVuLTc8Pyt3aHlYTWJKWVZDdDVubVBUa1h7Cit8K2Q2cnZrX28oZUx3UG01T2A+dzRgQ1NqNkhDVHhlRFE3YFkzN1pjZkx2WTU9e2dzMCg+ZCZBYnQ+bzlqZTczU2sqYypQTmo2QjVwP2BGCituem1NRHdackFQRWF4YV9ickcmRSVUcjBgfGR0QmNjVWdhdkxub3pNM1VHeT9+WE5AajA3X2FMeS1zLUZeSnVLKDEhQjFeQ0glUVJYU0wrCit0RkxLOEFvR2RCYTl4am4/TkNSLTF+c3ZAfkFBclh+SmQwJD8/aDJlO3c/ZFBUdVR9NGA0P1dTcCt9fmhgISZ6JklVMFV0bm94Qk5jeyRVCis3S0pJQmE+a2RkOypQPWFWU2FnaV9UcXZxZkZoPXhyen4yOD1fUXtMQ24oO0RnQFJTNDFPciRBcmpmX3w4b21SSUF0RyMqWFAwQG5XUWRACisxNSlHdGJQT3ZNeyZDQ2FjYVV0TFZfR0xSZXRkfHgmTFpHKmJyZSZQV2RjYSZael9aY28/VGFBRVpnfW53K15nMGVrUVZWdjdOQD98Y0JtCitLKTViM2t5ejRlZGR7fEhgb3FJNzx+aXE2bGtUYDBZTEB1JWF8I0JLTmV7P19LYnhZMl4wcE5HclkpfXxCNSYzYDQ1bDZfKks4SWlFajB8CitCJExJU05ZVl9yfH5vRTErbW1eb0M2Uk8wcDxTZFZgdTw8VURFZ1NmSiMlN24kRHNZKnI+KjBLaj1WRnUpaiRjYmI9eUpre15GQUBCLUZ6Cit2STgyeyZlKFZeNSZQcmNsKXBldHFETXJYbnUpe0dLMUh1N2ZBfTlpWmJXYlRScXB5QiUxPFRSTHxHY2VBMjlfQUohPDZfeiF9ZGk+JUIrCisoUCpoWGtKQX4qWFdlV1hNcHlWOGdrZnxRVVVKK201XjBsM2tjKDlrN3JxeUdMLXVrMk9rTVN3TkdRLSllKHtATjI2YTxGNEhwXiMlZjxvCit6PDlpQFNxP2A8KGc7I2U3MT9aMlc+TmpMfE9BdiZ4I2xveEYtXjhIYmJuNzQjNkgmbFFFZDJyTUJ3X0VfV1c0diYhVFc9OGZOTTJoYEM/CisjRmhQN3ZRTTxnXlU/fV55RlJWTCF3JHRuakdiUEtEYWVsSWRtTGslKnFoODRXPEJeYy12ciVfVlFJQ2xSezxQbmhqQDlUJV4rMkR+ZFAtCitCXkpLeGxzOVE4NWgjfDl3M0dGeEViM1k5cEVqMCNxUjNpSylBVGxrbXBXP0xlIU9rR20oNmxZYEBUJkB8XmtscjJ9dEpHcG9Nbn03RFYtCishN2owRmdYN21OMFM3Nnk4X2Bja3B3R3ozMHNTWDdJa1luUiRJS2w5ZlQ9PnZoX1UkIWR6NEpzS1BtajMlKFJhUT5pVTBnPU9+dnAjWFRSCitXbF9UenU9RXAhNzQ1b3dneGp2KVRILXslMmVEYjxVe2U2VmhDTmJKTFc5aiMqbFduSCE9eG1kUWhue05fT2klNno4WjA7VV53V2xIS0tZCiticiZ1JjBDQGtjaFJrTkhndnVwMHlpOFpDVik5aS1IalJ3PTFrKVE9SWQ1ajhPRnJiNHQxKkghWUx4cWxmaXxpQDt5NEpSfTByamtFczVACisqSE19PT1+eXlgSjlOUyVsPD1mRTJnUCVqd0ooSVQ2RVh7P2pmYnhna3ZGN3ZFaGA3Wn59XmB+fSNWMS0ze3hzfkx2VEFYMkBpIzExKyMlCitNMUxxQDZfSm9OMEA/ST04aUErZCEwNHpnaU4jLSFPVz0kKmZ1P0FaQzVgX1ZDbUQxMnpNQDdybCQqaj1eVDN7aW0jOXclfEVQcHx9dUNkCitNY3Bpei1+WlFsWW8zbTMrY3pxY29EYDQhcHI3dFB1aFMoUnRqI3lueE1EQ2tTTzVVZzVScGdzN05PdDReR0MxTTt+Q2pqMUdhK1BOYktOCitNdzlWUk08PUl0KTNmYllqeTk3SU4wYT57WS0rcWgpQWhPYVU8MTNKOUtjYy1oSTB6anR4UlI5MjAlKDRkXipeQnBlPFU/bGQxIUZoSG5wCitsI0JEKyR7MkAjRStUQHE8IUhHN1U9IXRlOSVCZCpHNEktfiNEMHorXkQzU21sQGxmJmBzNmdiKCYpRCFZeF9oK29VfXMtfV8rPzNhI28yCitFSGx2UGtIcHh5Nk1oZUFnczBkbFkhUis7MiVOc0RBbkFtbkFaVnhRfWdLTD9WNjU5ano2eWtRYEtHO0BJZmUwaXdzZCVePlpmOGBuazh2CitDX0phcW9raVlqQUNpc25kOT9VcElKYENrN0RNTlM8RURkNnFoWClVTypySStAO2gqfnl+UF5RJHkhIUdURmhgVzRffGYlbDJ1Znp4ci0+CitBVXRPPD1aUU1OOXdMXzh7aXtEdWZiMTQoQTAzMHUoNTRzWGlURUsyTDZER0dYXzNgPGA7a3Fqa1JXKjJ0PmA9bUB6MGhDdD81RkA3Z3hOCitTNGRqTzUwK3Z1bnB1bTR1WkZBPEtKY31ZWHdTZDB1OVQ9SGx2O2orQ0oxSCFwfmFPSk9AbUx1dGwze3F3TTBZOFBfdF41ZFUwQl4hZW4+CitGS2VScDtAYzttfHBpPXghc0hOM0BgX0pkOFBIdUFXKEh+Kn53T29wMWhAU1g3RUU2NGkoTGAhSHVXRH48NEVyUT1SOTlgcUJNREdMQnJECitVSlo9IUNTYFg9NkxPYW5qTVdIaH1zVmp2YktfKi10VTUpdjR0QE8jcUxLdnxFWDl2bjwwWkFHMzQ0Jjcwcm5QPFJCIXF9O0xARnNPeG9+CistT3ZTISp7N1B8bzJyRCt9Z2pWdUxTPGM9SCQ+RTgoI3A5THRDP2ZPXiE5Uz9uR2tAOSY9T182RGY5ZDtpLXIkd2cxek5oPG9LQSNnaWRSCit0dGc2ITZsZEdMcj18MiNrK0xpanU0LVBgQXdWfSRqQF9fKEBtQ04hMz1EWHAhZWJKJD9wNHVVeW58SD9wWUxIYiE9Slg/I2JPWkxIOHRHCis2TlBuemRBXklNZDY/Zn09c3t4dlBvS18kcj9WYj0rNSohMkclYyZNP1R3M2kmRCFYQCg2LVRhcXAzcUluaFJ0QVIwbjUkOWh7WllYb3JaCityR0ZIZ0ZXRmRSNlQ4fjY9bXZDfHZsdiVNJDIwelJKUilVbUY3Xmk0YUFqb3dvWGpmcUBiJVZxWXRPPkc0IWp1Mz1PQmhAZTB9ZTdnMXt1CitnWjM1N0o2STYkOWFAVWxkXjY+VkFfcjdVR2pRSzBWKDI1aVZ1ZXErRzF0KFFKSztnP3xLZmY+YTQ0MEA4RmZyJXA4ZFpOdDc7Rl5lK2FUCisyMXozLWZ7PUxqezEkdm4talo8KUJDd0VzN1kodV9vSG5uQj0jJUwqRGJ4IXFHbz1OQkAxSHsoVWp9JiZrRX0hTVMrMDFPTkhLdndAOztpCitwMm4mbW58NTFAQkdRUkAxSD8kZk5gUHpCfHkmeD1nc35iJmk9bzNicFBHcCtzRWoxQEh9fF5FNnN9ZjBYLXFSUmk7Q05Ze2dUOS1ncWpyCitJeSlYXmJ3SiM0NDRqTGRvKyNuVldtc0A3cUh4N342ZXliNEM/dyN5QWBXd2s2NDVXO0ZkWG0hblU/cyV2Sm1ofEFpKHF+MVJ+fnBlVUFqCitBZFk7RUNlP1NgUXAjWkBXZUcrNG4xSmEqOSFtO0dqdmY8SkttIVQ1WitJekAwWTxDdmxVVGFMT0grfVpgJHJGIzxIJGI9R0lrMyFVZTFOCisrOSU5ZGlxYXdQI05QMz9RbzZ8eypOWkJodktvPjBJVGQkaUBBK1JuMy10aXdrTE4tSTsrb0w4S0opej1RMnNrRiZRbG9nSDRpOUxWZGExCisxKmRsWG9eV0ZtQkhPaTZkJn5vPTV8YlI/QFNxaVhxXjFjKXJSSz18UTd3TVVCaUBORF87fVNCdDJ1YCUyJGB0bEFOYWd2PGt2KT8/QyYoCitOUCZLcjMxYHNmK1IrWDEtX1hBRn50VG1razhsUHljMTNjM040NU5qUl4mK1NPQmVFRT82Qy1SbyV4Yzk+dVZiUUstQl5ER3JOXyRxMWw/CitRcTdtXzc+WCZOclVUb1pVLU1MZmlwalkmbnQoYF9WdztRPWphSH58M1kzd0NGSn17VCNlOHE/P1lyRnskR0JWWF9OJVhaJEgoJSFURTNlCitGJTRpVEllJHshdnpHcDhDaXZxWT5vNU0xc1Noc1kwMH5OOGlMUEpYKDhDVExjNUlvRiorb2tvM14yM3oxX1MrYEVFdjVmbUc9IUBEcV41CitMZTZZQ3JeKipaTWplMkVTS1BJdTtuT2ZBNTUhbmpNM2AtLT8te0dqMmUxP2dmKHUrdlpuISlBdkpUX09KVzY3KHw1NWsrU2dqbDlnSGJkCitUSFIlLTJIJDheKHB5IXBJQHBZI3ReRkJ9eWRxUWZJVWg/cHA7akN+JmNNND9abkE/TzVEN15SYzAmVXkhRTxuNWdTQzJlSGY5dEwrUXROCitSRyZIVi17Ris7Q2ZCeU9PZipZNSE7QyRkdyk4aGJfcSlackhaXyY7ViVaUl4/Z3xHLVpNd0V7U2pYYGg7VXZ8P3UmVHZZelo1VU54QlBYCitUaDBIbj9lPGRjcEZoQVRCTyZseWc2ckNKcjlyN3BfdTUjfXJIWnc8VEhlM0xvZkBffDluIVhLNW9DP0BJTClnK1pUeXt2JUghd2EySE0lCitZO3RHfWVBWn5MfG1qMypjNDJocUluRFc4U3M4MUEoZCl3LXU0UWhtWU1ZczhKdGwxLU1HcTR4MyVUbSt8OWFKJEdFb2xWSzRpN0VeKXwxCitNND1nQih3V2F9JkMjZWVHbl5yYUw5bzh7UkcjVzQ2eTBPRSR+T2d3blohPSU7YTV4YWNmPylFOE16Rzdsaz01WXBkNUclMGlMPih6YXZzCit4e21HZGRhemJQcSM3KVcwNGd1IWRrSXtIYHU2PDZEbSRSd1haQE9iVmUqR25NU0d5LWFRV2lKKUF+ejtfYFRYb2I9NnJTaWdeXi0rSDljCislUjR+STFwOGJXenhYWD9yRVQlKzN1V3BCTVJqJW8+MVU9UmY9fkppbSg5cjRhT3B2VUV3c0lDKmhAKS1CcUVQUyk1TjRwP21WdD0mNSlyCitKb2MzTnR2dD88ZipsJX5FQzFVR3dIZVE9QyFfMWJkYH1lTTE1VWxjdW43akhwcmAwbkBzQnUtcChCUDJ7YnB0K0YyRWore35gQiNOdEdxCismZDR7Vk0mXm5OM0EpfUpWTjhgZyFJMz1YQ3BwR2pmU3ZhR3ZMfktheyM8VShANHgpRWxNWSRYVksrUC19LTtDR2pGRGlPMCpIVj1NOSs0CitEQmwjUWliaWM4ZD9hU0Q3Rio5QmVATVJIIVlqVmRxbihiLWVjZ01IS15uVCh8QTFMSiZII2V3N1g4cTZkSSNRIzVNSj8xfFoxQjZEKGc0CispKzQ4cGh6JEQ2RDx4Rno4OyQpdHllVyVmV08zcEIqcTwrYEUrSVhpKlNDSCpXP09ATTlNVWB0eUpOTGhHXnF7fT1pd1d4SSE7aEFLME5lCismN3cqITxRcztzT31YdkEmSnV+aj5SPH43aTs8Vi1sVUVgODskVSg7SG9RdiR+biZabnJrPn1MMWVZbGtXSWxNeWprJEgtZWQpZXFKMyZHCithIXRYd04tNnlYKGwrTiZrP0R8THhBZGIjMlk4VTxwTFMwVV9DMlh+QFg/JDRuSSNhP0VkNjZiO2xwVnkybjR1QihAP35ibz9DQEB0aEFRCitHQDlAcTMhVDZOV1lsfTBaO2hWemA/elJ8S2NlRnFKdT1ubmx7ZSREYkhrIXYpQHNleWlLQjdpbXUpM1JoI2BBK3Uya0hnQzw+bV98K1VhCitGaSVIR0MofE0weyFiNytxKFlOYUNZUlhJJnlDM2xZeDFea3dLKjV1TEV6MHFxZUlzUDRAKk4rWCRRZ3UlfGByTVo8Nyk1YHIoQ19tQiF7CitHQ0lzKkN+ZnRAeWtSVkV5ZGIxPyRzR0h4UEtnZXFMcE5XU3xEYTY/WEklZ1NWP0hkaDZSKyUmZWRgd3k+Syo8RXZXTVZ4Xkl1PERWNkxiCiteMkJ2aztfTjtQRGxpZU5FMnBYP08xQnRSPiFJNyNkcHJrSi1jZHZJKCZwOXl8fjghYnR1akk0QTVFeUtmP1VIRkk3cUooK0pIcExudF5jCispWjt4UC1gOEhOOGo5Nz9WUE11UlpRKkg0TTM8ZVpkU1dTT3dFJmVoKipzOz9VY3BkP0E1R35aNiYhWEZCeCEwSlFqSVNJbUxrZ3dLSiQmCitUUWVBbUJGbyY7Q1BDUjtXc2lXPG9gfFM0aTdVVUdpdHBqaUZDUUxENEUzaVQ9cURaIWhWVEZfd2ZUQkB2K3ImQFRZd1MyezFQdExsUjI3CitSbUNeOCg9UyVUV2RTcmApdkQrQHZgcyo+JVdLZyp3PUtjbGNUdFZ2eTlLKFBVbzx0VDdLblAwfjxKfG9GfDZETnRhQU1XWXxzKyVuSDlLCispVkV6aW10Rj9waihvJjZjfj9VM1ROM1kxTjB5WTI0KjgmMyo4dFNNKD1zMV89aGNrVzg2K3xITVhFPiF4UGJCcC0+Sk1yKXUjXih9ISRpCispVTc0ME43dkFfRHsxKTFCOzteQnM2dDU+UiYrMklfMEhwOElffn12ekF7WWI5OXBjXiNJJVltbyZhYjt+SipEPFk2aT5XZGVnIzVnNE5lCit3Pm5fZl84cV5+O0Nfd01TI340bit7Z1BjVm48XmpSdTI8YCVROUxwdkJaOEB2cykrPlh3dDQzQlJrXzwkOzEmZChJZXY8dldfc3h2TWIhCitxYXdXK3dqQX1TbCNqdGV9dUFXbmU7aTM7bTd6TEc7M05lYztUWlQ9ZTFYQ0Z9UWU9ST1xQUUxYlhIMW4rMit+d0NeTSZoVlJDQUl1djRECitxbk5UIVNNbnR5QTZmPzNUJkVaQ0U3T3FnPzNyd0pYeCs8O0heK0E8VGc7ZEU+eHRxTDxHQ19MZCg3STdqcmwpbiUtQ3YpYTBYKDxoOURvCitYOFdYdnsqa0h0SlpyVkJifEk7dT9uZmdCPlBmMGprR3MtI14/ciYxUEF2diRKVHw0R04xfTk8ZTBJWkZTUX10VmV6QkxQS3ZENEVTbDhmCitIc2dTQWE8ZTNtLVUwJU12LT5tRjhKOy1jKF5YeHV5NkdRbTNCdU9YajtueSUmQ0RDKGdIO1VrNDRHej5QVD8yQVRsajVsYlZUKlc7dFpqCiswWEU/ZVQ7TjxLZF5Nb15mWip4ZHFDbTt3PX1KNSpYYHJIIURObksrRE96eSRRazdVNzNhV1d0cnQoQXJDSGhGPmx2S0lYSmY4fjlqbE5SCityI0tsUFc1NnA+fjFAcXMtPFRpcT49RzNlO3VXJTxxdmRSanJfNG5rVkF5MD8qTyheJWxTS1llRnZ+M0FAMUYoSDtjUktAWkpYTWB1VzEpCitxN2lPeEBrTXBpZiNTcHBPLSlqa0gqM2stc0FeZ0MwSTJjO3tTRlgyZXhvWkx4WXctcFllUSs3cn5ocTBmczgmckAoSFk+Mz4tclBQZWtaCitPamNiTk93RXJ4JTgzcjdyMzhIP1U0I3JxVVhPd042SzcrenxEdTBnQ2grPmlqdW5LWjw1ZE5vfTJkSXVKRjk+Q088MUgjezB1ZmElXmF7Cis1YWpxPXc+RTtBYm0yezx6PT54NngrUyY0MSlRWEdHQUY/OUhmTko+KUx1fUdLP25rbW1NNnlrJVI3NnZ8KCYzdUY7S0RvUW04QGY4dnI9CitPWURIODB3aV9aQ3QkbG1mVGR3UCFmX05scThiTzdZNiF2dUwpUktkT305YS1tdWs+KEwxaChkN29Saj9ibjsjTVl6ZSl5MXded2wpe35YCis3NGRIWGVeT1ByQSFBalZyXncmWCs7X1FFPjdUUUsoe185e2ZjeDVCSTQ4TFQjMFJ2K2lIc0dLLU9vfUlWK05FTVBnendtRTdoITt6cyFZCis+UXo/THZDJlIpSTxIaXJ4aF9+OzczakljVX1jNC12RHtQUWVwbXVkOE07OCNgeVZUcH5aMkJNQktMeH1YU1JIYTlFKnJDMHtlUmhoKmNVCit7fj4wY1dCaTZjJShJTDBPR3g3NlljUVI5P3BjTzZyLUFtMSZITjBMSDhvVkg2cmNEYnBUYjliPUZSKnI7YmgqYE4hWlRBaHFWVX0/RldmCis9TGZVJXk8c04mV3Q+JVRAd2JZZUdqQSsjKnZfMXhrODQhO1lyZClSKTM1VkVVPyQ9QTlkKXdxYng8Kkdkbmc8O1BIdWpUZkBITHNSRURhCis7I0BwR3pqPU54YTZBVjhHWkthbV9TZStKJmk9O0VpO0hLRWZZSEpmPEMyeT1obzchfGBmajJQN1MjV2cpQihjQzxDJTBGYTZhSVRNK01mCis+Tm88TFBULTJWTFJaRzwjeTlvTmooZG9ncUJ4X2spN291enxhJlI7dip4PjBNK2crYHdKUTB9aTZPIX5kUDZeKmZ0e2A2cXgoTCp9VldRCitHNWJYK3R7RlUjLX00fm9WQCp8SWFycGdBQ3N7fEdGUHR9I2ZASHJpK2w/Vmp4WUJ4Jmd9TVA0SyV0UmdKfktuRnFuK2NIfmNAMn0lSHYmCitUUW5idFZrPz97bjtmTU4kQiR2cjlMbEltcWJ7MUNTbXRPPWkkQVIld1M9KXJBVjY8fmh1JD41NW56aWJgM35hbzAtRllheVBwQCYzPH1aCitkRS1kYy1PKkpHMXh+ZSVyTVV+MWgmUWtiTHUoO2VANX4/MD5LbHI2MUpPNSRaZVUydjRiR2BQVVhkPSk8d1YobnEpSE9CdmwkTmZUKjtSCiszP0t6cj92Z0xsU1oxYl9TKTRPdFh9N2wzSSNlJlFjLU0pKSlhNTE0UHYmb19CZCgtYyNNPHIjcGBzIy00b0lZaEAzT0tBMWIpSTMwKl9lCit9V2U/YUNQYlp4V01zaWVuRkJRcWwoJWYyQzBPa0FWPEwza0RDaX1PJEszdWVtQTJHWVN6alJsREdSPDslUGxnWCZAMlRfckxzQ3R5Oy00CituazZ1N1VFWn18Q1JHTDlERXRMMj44dDdSZGV5Y0AmRGl+bzV0YyU7bjMmalVoQ1VhZSRRMlZjdEBFelc4eiY4bD59dCFeS25PUCRYQTdKCitYQVdvT3Y9O1clTHIhb2YpdSN0KiRWK2d6OEhBJD5jWXNxZngqbHlwSGZuaTk8UCZJJmlNRDxHfWE/dCQ4dCtLayFzZ2ByeituNEE0PU8wCis9MmM4KXN5WVkyeWBfIVFYUl5yYXdXdm4hRnd0NFdgSVJKa0pWWClqeklvdEVwTzRZak1JYnkkWT5WPHElc3pacz5ldituVG1ORkhLSDNhCitzVWN+RXghVkBDb3JWNUwwSz92YDt6LTYlV1I2bEkzMShKeC14akp1P1Q9fS1Yano+O1VhKFZ3SnMzLW8/QTR5NUg7YGZAT3o+PlI8d0FNCitrVk57czYrVWM9akRqZXhqWGwtfmp7Kzk4fWZHR08jTGA3WCY8SHJJXkxSVnA0IzhIYHFJWmxReUlsfXlqa05wNTFKal9lIWZ7bE1YQnRWCitOV3BXKVNnMUYyP2trYXV4Zi1xSHdId3pKekZMdm9gWU4wWGg1OGN9fHJCMzdDSXNRNHpxRi1Hdz51ZWE8Y1ZYfDY7JT5TV2NLYXMmZXVeCis0UnhUTygxWG8yN21jPWtlfDZvOFhvQ2R1d3lGNj5SOD9qNztIUmhPeD52cl5zaig2NSMpaj1xNH1iWio1TSYlRnVtYXU1PVhgP0NNcD5aCitlTVJydyFwN0dPYmVkaW14SzNQbzJOc0BpKWRoaWliRSUpTHMqKSlUJClXXloyKTlJaSVQOG84IT02d05RNlQ+UiQ8aGBzNmZHNnlkOHkjCit2QGlmQ09DK2xSX0U3VHs+QF5oKyVnJXlzajtmJH50eF57PTsreilOaUUpdn1iMzFhMlJBTiRKdCZ+KiRYTlVDfEVgeDhKZl5PVmNMS2sxCitAJVJqMHtiOE5UNk1sWVNgcFVvKiRANHZWSl9YZlFvaSkrQWBXXjNHbzU8a2FOTyR2a1VGVihlZUNOaT1jRUQ0Y2A9UzBlQCRqRWJjanBoCitFfCgte2U7PygzUnNiQz4+N01NbHdETUB2VW5GPWtqek9vR1JaOXJXMyFQb0s8Iz9AanNmMU4oNF9xKChIM0ZuNXM9aFh3JGgxe0xpNio2CitTOzVhKHVpO09ifFNiSXZDaF9PTyZJVSF4RDIpP0FLWURsZjF3QEY3P1FTT3JTM15RNEY9YUpKaDBSU29zRUtoKSQyQyF8SHwqJEZYVURCCitMYnRzVEhkO2NTMkVAeGlVRj9iP1BDeD0wLXQ3P1ZSMVFvR3V+ZjY4aVJaIXh1MXVySzxgS3UjeG95enA/OGQrYWZ2WDVGQlluak0kVW15Citxe089LXU9PWR6eD93fXQ2SD8jbVdAdDJkbFpWPzh4UkV6NyRjMnRaWT0zaD52MityI0ooRFZTMyVyUiYoQWhFKWB8Q3NpMDdlMSNiUm9lCitpJm9KPS1sTzJyPTBQKEJXVE1aJjsoVjhTQkhhXn14a3AlTllsVkRpeXNUaiEkVTAtaiFMT0BxenZ9WGdfQVFRJUg7PCtYaE9vNHQ2RXh6CitlKDh5d2VYPDF6KHVfeSY4QXJDTVBkN0VATG0pPkNTeSpXZyhLa01Ic0IwZntlMGNrNktuQWsxRz9ebT98amVQTzJMPTx1OUFCP0BGI3JNCislXzlCaF91Ql9aVzZvYHBSezZndFpjemF3U21wU3lOQHdEPSl6PW5zV0ptWXFSJjQ9Q1Y2aFUxOHVAXjtkR04oOHxWR2ZQeDBCaWRWYVZaCitiX2lnLUtCaj9NWkZRfmxgJiM2JCQ4X0h5PzFzIzNvZjE7LWwrNkt2OGdLVHZ2NSU0dlRUWkV5fWpERz84ZGx0dVNWYjRXPlV+KSZRQGcoCitMWWZRQXBMd3dKcTBGfEJLfTtETmlob3o7NzNSd2ZDez1CUCQ1emx7Zyo5b3tsJU9IcmRjVjdPSDJ5VCVLUkFBT153OytYQTVKSHl5QyoqCiska1E1aVpGYVEtPEFUNFhtKWhQUXIhJVJzJGpnej56MTJVdis0ciVOcTxgRzBsTiNaRVBEMnRzTXUzfEVSVTFxOGROJG1wKE5HeEdUVXNZCit4O1p9ZUdoKnxgaG5UNmplQk9JMlJtQDt+YW00V255MWJFcTIycGhPcEomJn50YzErbyZZLVEqXmA2UE9EfXYkb0tPa1ImeXpeRlRXNXNwCitkYXlmVCZNJiZwN0NrQmB3aWhveitxPCR7Y28kIWI5a3pOVk9mPCZOdSkhaD4paCk4MFNhc0JBdE1wQEs5RVQ7WGJkWj0hb3R3bX1MPV82Cis3ZzlCNVhATFBnKVVPYHV7eDNiUFNzeiFERCRqfDU0UVB7VmB2RXxHRUJvdW88RXx9Y2FBeXtQbHRIeFY7WG99LVNEISQyam47QWBFP0ErCitNIW94fT0xODtob0xPNlMtb2xrUl8qSThETCRzMGM8UWoxPG5gWEJ8YCFLVW5kZ3pNbEBrTXdJPTFTZlV6X2hCNXp3KldnSjdTaTUtKEImCiskP35mX1hRMlppent4S0h1R35zRjt6Rld1Rj1pLV9CUDZxbn16QCEpY3kmcFhMVmVzOSRgaGApTEskYn41aj1scXBmKjtiNmM/ek49NlduCituVV4+TldWaV5SUmFsYlBUO25yRWcpPjYpRzxmV0JQYiZiX081JUhuJihOXjtiOGxqV29ec1MmZ0t4JSVBOHFxWFhTbXpsV2p3WChhdVohCitFJWRUIWFERCFlR1FWQFNHX21uTE1DJGp5bz02I2JvdXROQHFPKk0hSzdNUnF+UEJMUH59TkQyfCNzQWdOPHtYN2FoKyU3dVkpMXZ2VTFZCis7JU83c0RZOGQ7eUByWHN2WG9hY1UwVzErN1oofXg7dl9+WFApbHhVQEJoRmome310R19gMkdrOTA4ZXsqYHRkaHNIZnBRQlpWM2ZrNWw1CitrQilzdTlubndTKkQ2VElpJWpYb1ZCaT1Jb2xLQ1N2SEBCcEZGUlJJT18tWFJjVVM4Vm5LJWpzeWN6X31kYi1NYTY/TFZjQTZtdlBrVFJPCitgMiZqMUxPWShUUWkwYXBYMmMleTszPn1+WHc2QkN+ZGg/RyZgfEhRNGlRWHwqKklmWWVjdyY4JiNfIVQweT93Z3BfNmx6eylgUDBzUGdVCiskaz5eI2xNK0B+TUlDVnxwP0R8QiU/YWwjI1NFU01qWW0rOzg7JG1uTEFvMFQkQDQ7R0N5KWw4ZVRoVipKPGdlRU03JisrNkpVWWs+Mm17CitYTkZIUjdmWUstZ2h4KCopKlhKYDhnIyEmYHdUN0QwWSpKYlUoUDxIMm9IYCtMdH5RVG1BajNkZWh0JGljNlpEekBNdmpYcGIkS0BvPTFhCitIcUE+Q0cqRn1kbVcqPXgtPFRyN1AmdHhZRl5YI045SFB0YFlYdU8/eURCYkAtYUw3UlU9JHI8Uit9WVItIVckSSRfZil4N0xeVGZxXykwCisraHlZZGl5dm9VNWdMREUwcV5ZeCt0SUh0TyYjRSNAZX5aQDlCKDV+IVcrQmtELXVqcWpHaHNLSygyVVV1TEYoa2RyIXFTcXZRUkFmTUtECitqX3ZnaF5LfHUpN3FoPHlzKSFCUUBvKX00KXtUUz5qKDZlWVhuTXNIMHN3I09nYnl9Wk5RZXojZklObytPb1NwVT1TZEhibVczfVJxRXspCit4PUlfe31fa2E+aCNvbXJgJkkxa2E3VkFPNFYjdHdTTl4zVTJCPVVYMT9RUWEyaXgkbiV5S00kaCtEZys2KDM5YT5IcUoqMVRgTCtLOFApCitoPkA2YVdBSzJtdGV5N0R1NSZJOXA+YDAwN2Z6MFJTaWYwMDN9bGE0JW5XV29+M3xheFl8UWI5OEtKVmxRN31WUGs3PloqcGBtYllYSTRYCis+NFVLYUN6T21lUzZ6QnZOLXlgS0x1QWxJaEdQeFlkSjRYZWUyJWlCdT90NWotQUpMSHREOWhEa2FlfUghYFYxUWdQaGZ7cUE/KDBPRjA1CitvVjRmT15WNG8paTNBMSVVQCh7JjN9IWFCenh9aFo4Qzd2e25hLTJKOyZ4OzZrQWU2K1UpJmJ5PzVje28md0o3QyZkelJoOTJhSHVZRlNvCitzR0VVfnY0fERrYVVvLVc0RmluMWhkSSQ0KU1EQHozTlhuJTZvSjxFQm9BQmFJUWUzQkhuZFZzKHJEWVVkQn1GcDZqYj1yaFJtcnA7TVZDCitkQUx7V1lqT3xJZiVtY1d4TGtEQHJjalRUOCE8ezd9cSQ1b3RXWCpQQEVENEdDPFNVanEoMEE4NzJSeVQyeFYyeD1NbXR7VWxWKm5nWV5VCiszbCQkKlE8WTI/bVo2R35jYlJwbHMoe3MmI3RPVU5sWU9JYmZJfVRxdHBfO1lLJVViKEpxR2ZCYCtMaWdiYnlgJmYxfFVyckcjUlYxM0gqCitEMUZzVX1RK0pnPUx4YTBTMlBxa0ZONytkV25BJT5oZllhb35Qd2lLYm9mNCFneUsxIXhBNChrX19yJD1sK0AoUUpLdT0zP3MkUEBGKkRBCitfSVZodnhkbzFVNzBEbyQrez5HKnsyRlRqakprdDNFMEBiNjB8YTIpc041OShEfDNKYklRJTEtUlEhfmh5M0ZWRXswNGVXY3gyTlFkdDJfCismVHdnJGVjJHxNdXNGekdlUUk9UUczJnNtKWo0QC0xa2F5KSg0Q0U3eTVpY0g5S20/YCZwR3NlYF5VRT5OVHZud3BRSCM4d2M1dygwRSE3CisqUXhyPzY7cXd+fDM3dy08djR4Xio8PSpgKmItO1ExIXpLQSpwPU1nO1VeckxyMjdlQWY4eUA7VTUqfT0paEZWWDRDPS19aitERWomNjxPCitSO3Q7cmxtZGh2KDxmPX47QzJgcHhtdDtmc0VCYm5eVzg/VGUkNlM1Zm9+PllraWxNOGArM2sxaGM2I2M0IyUzY1JEa2JBU09icXR9T0wmCit3cWpeMmhXYTxrMWw/SkZAMVMtYWV8UUg4dnVfRXFVZz1SKn5RV0d4NW8kWUdrV3YoPzlKKTxBLXAodzBXZU5aUG1XR3JvPFhDQnVNYlp5CisyN3YhYjFXJSpyQE5lKXRJeyllNV8/WCp7NCZGa2kmSHlzTmVTWjRwbSRSYytLVjFOZnBIN2NvOU9DbjVoayk/R3YqU1o8bj56Z2JffjdWCit1S1lEVFNgcnk/ZSpGNlBqZkM/NjZxeWZnZXBBUHZjRz1CZ1g5Nll9YEl6NkUtSzBpSVZJRF9BUDc9XlFvOHA2QXleRiEkRyFQKEl7cGJzCishIW99RUhWSVA2ZGoybGZRKG8qWGhMb0R6SExwYX1rY2R5WmRtSlBDc3JoWD08MT87Tlh9I2N9UjAzbjF7KD15Rip0aSkxdjQocmN1WVhpCis9bkQxeTNfdHlCaXl3UFVrRiVyeDZ1TCVEZ0drRG5UTCNqdFY0UlQqcC11N243Xj5iNWFobF97UFIpXmNqe0NSMHB2OFFSaEYtbEZ1cHJ7CisxMTMxWnpCQV95UGQpSmdQamk0aD9sP0AzYUVmakg2UShUeHdEZnpMU0VZU2N4ZXgtT0BWYDlDOTN1eEZXfWM2dTtTcnhkdU1saF9pOzQqCitadHYwVi1wKCszdW1jUF8+YkArfWVnd343Q1N4a3JpfmErbE9nQCtDbCl4YUFxdkBXcFR8YGZ4SzdSVmQwe1dQTnt5bjtlaiZILUR6LXBRCismKlcrYXw2TD5gZXRHKHB6KHwrKGRrNTFDJEk9TX1YSzdOfSF7cCZ8KERSVDhgYmRsY3hBSXFpIzdfM2NtemQ1MV9EJFIjN1hYUzBGelVLCitOSEcrTD9lTmx8M0VgY2I5Vk5uTk58UElOSjNNZTJLelk7MDc7P2NONUN0dnM2KjN0KyVFKH5hY0lCdzE4fihQMl5LMSgkO1kmfEBlOHxECitOTy1mUGZ2VDlGKGAkXkVDU3UhTCt8aXZ1Uz0pQkFFZjcweEVoaypvbGZiRXJEXko8UHxgS2ZsUDN9QmR7QSViO0s8cTtwfDc8Z0d4OSptCitGYjVuX0c7dWVSaXBHRz5KQT9jQU42MSMwKipPT3hOVHNlJXA1MWNOMFMxV0ktbW1fSEBlRV9RYCFYPigwVEhfTlB4ITlaP0RIVz5eUjRPCisrTTZRJTQzc2lVdXV1R3JPOGJ+VTBNdCFYYGFMeX1DLUhTKzRDNFllWEI7fE9iMyV6fjQoe1Z4bmFfIXxLNkViUDt3OEtVRXskSzB2ZGJMCis1cnNZVSMkcVJ6cmBNOXdHLTJgRzhzTzZiTGclM0wpcWFVSiYpPGxtKzw3R09wUWU0MXM4T2VgdzFJUlk5M2hGbC1xa05JejxmdGJEYGJ+CitvZGAmMUhiO3FOV25LP1A/anU8O0dUN3o9Znt2KGpFeWVoYTlSeDV0UWs9aHZOMTYjOHJ1YiExRTJXbnE9WmxQVzFUbyprYil8TX5wcj99Cit0JEpAbythI1hgVz1XPkkhJD5NVWhWdSp2VVp6OHFmMnxyKmgtJEBjSFQ0MyNuZCV4KH1TanQ2ZTBNeXFLMDd1VEl7TVZEQ0E0UFJKcihECitXYl4wY0BzRiZFUypITlkpTkItNSl6MFh1dF5AaGNQc3ctV2R9WVR2KVVwcig9VFNsanBNX1VSfko4eFA3WW9wbWN5TUx1WiEzNW0tS3BoCitaNkYoeTBHUjx2dExtQF57ZHxZJnhOT1lvQVlIc1hkWEU0ZUtWRGZLPVY/KFNtKFk8KlY2KVE9ODBjM1F6cX5vNW9gPEZ2aDFKPHxqPUxHCispeT5WY2M1NzJ7Q3tQXlQmVTN3VVZQT1BzQk9DcF5uWUJsI1omVlBCVz4rSl5YbUJNNVF6e2N+UiZVRT5RIVNiM2dxakhmPFExcUxeekJACiteUFBIUGsmMSo7TkN5NDdBQiloI3tfUi0yfGtte25mZlpvRTh0ZDghTFBAZTg5O2FoYmE8cGZzZHdlSFc/KWlAUW9eJVkwZSNYeVhkTjhsCismVVdsVUc4TzxJWnUlcn4pTzNneShyU0JQdWVoMnFsZz9LUX5wTyFCJG55TEVKcCZIcUpYMVZ5YTVIMEk/KHk8bGdgRUxVLXAmYUt2YU80Cit1O3p4ajB+Z1hPOWxIcFkoN15ZVTsjZ1F8TFJ5KnBSS013bzlBTn5PUjBRKmRXX1FKJGkoNCYkRTx2dzFKTUhpYihgSUlkd3l8bkhVY1U0CitefXoreWF+Ry02PyhxQWtQb3BsZWtEa2JXI0ZLUjBWRit0QVIjTV4zIVRZKmAmbyRqe2J7RnYlLVBudTZtamBjO0ZZNVlyPikqYlcmXkcmCityWSRxVlVCZHFGbjBkaG9qMXJvOVhVb0lDVSNxRGpKemtUeHRiYiFNYkJiPXt1bHh1fFpeckhqKVAxczkrIXlsKGVTT19SMnlpKXMtVDg2Cis+bVlQSXp2O1UpYkBJNzZfd3lWQ2xSeU8zSXxAelV2UzFqYSYlVUtQbndYbz4pKVohKjtaQEAmLWMrSj9xJnl6Ynh7TlQ1Q3NZcXdIK2hFCisxZGNCNVUzSG95UWBHMFBJR2s9dXkhMDdnPkxkUDdXZWpmZzN+fGk2OXJuTzNFR1prfnVtJmVuSHJEN0lBZmpreyQ5WV59UzRnQ3UjMiojCitydXZzSS1PLVkja1Z2NXZxWio3enY7XndffkNISG16VGlxVlp6M0AoYmNyVHtpYU1SI3R1aU5NaUN4JiEpVXJLbkB5dGBCaUx9WnlkSHpaCisrOXhZVjR6cEc4LVZTUyYtVyFDKGY9ZWsjeT95PWNAVF5BYnBFTjMrbjEqT0N4fTR7NiNVc18zMWZFPzdwNVp2fDBqQkVyJT10fnpLbzIoCitse2YhKnk4RUJBYjNNMmF0bElWM2xPfU9Mej15TjxAQ055T0VxPkFUKlopeGckYm9CQz1fUWpvaXhRa0xAJjVDVXkxV1VzRDxCfmdlTmxQCitsaWcxfXM7O0xhMWZBUFhCSjAkQFI0VXRJOCFVOWM3fXVvTiZZRjZDZllpIy1OTjtEY092WGN0QilXTWt2dntPIT87RDU0VU5jMSk+czZHCis9RDF4MWdealV5e2pedFJOVFh1WEtnb0shc08rZ30rX0Fta0w5dGYtP0Y3OSZnVk00XztfSUJEKypmM29YQ05WMnszZGB8ai1NOyFxKUFtCisxS2pBUVN8V3I7ZDktelJnQDcteyNxdHp1YCVrcnN1NiklMnFIMm9eNXBfYilgO3h2SFh4I2spYC1BN3RVeUhTb0VuSmlKUE1CcEc1eyFQCitBaE5SP01ubn1nNVpNezdLIW9kait0Tis1Nm03NVI/X3lIX2RSVTthPWo4eC1DOWRedUMjI1RvUEpuWj05KTVXOHtGS2JCYEBveTMlazhICitmTHJGSllxU2lsNERsK1pnbUtCO3hDT0tOPHlTO0RoPnY7fmkwaF92OSZMZD91ezNoWFBXMTN0N0FKNGtMQEw4fHhNKykwTW56SGh1bC1fCitxYm8jJU41VFBOJWohdXJ2czZxQmFEVTdfX25pK1JWWSZAeFVJYGhsdi1XKlF1djBsYG5ZVU5jbXJOVUNMI01kZ1AqTSgxUG5Bbko8N3hzCis1MXglVSV4QF9tajhCajY2dD5pMk9ROHc7e0AxO2NuU1RGOV8rJkdARXV3TWBiKkxSdTw3O19NYDNMcDVGZWNkbXJgfEFGWkFZcmIkRDgxCitePXwkZkd1dnN5YXpGTWlgKGk3UGJjVndqVSpqJXB4QSZyXmk3VnxnKSR3MzZzQjQmUVBeXnpfSk4tJllnLUM1Jjt2bm5wNUZ7cTJUTD9wCitLXzRlcU1WREEldWtOZTFfXkEpdHFoS2ZRJTZ4UjxhKzBQYkVZYUNpci14QEhvZ0h9Y3c1S2JJTiR6akIhNVRJPl4meHY8YmQ8cGNvS0FsCit0TDRgX25KMUlYQz18JCRHVVdeSyU5c0xWP3BXP0RFOyV0XzVuVUh7QGhDUjAlS200I0NKJDBUdipheiZWLVNSXlU8VCg2amshcl5DaHkkCis0Nk4hYmlVaVQkVTI1cE1Ud0VoO3E4KjBpYzZSbkwrOyhXSjFVZWRuUTQ1e3UtJm0jfUA4Tl9JbVNXMGBzLV4yPnRGRjlpeG9HSj5yZnAwCitUaGclTExhKHBISWVPZHw0X2ZYdEBDSjA7SyEme3sxZSkqZEYkSityeG50P1dJeClBX2NhcUZxQEl8TmFBS0RLdUdjZ1lSZUtkK1FyNH5BCitVYzRCOUA3eWZANCQhKiUtdUFkIzEtaWpmRURUIT0+KC05Zm01JDlsOzhBdVY1SVBxPHhhd05HKWB5UnBxUXJgaXl+UXx0Uk0lbzE2V1NzCitvPTRyPyQ0fWZ8c3xCK1kwcXA8PE1OZ3lxX2FpQ2U1THJvRCNsNDtUY18rR09tZ3pAWHVjdyUhRVQwfmI4KikwSXh9aH5XNUJpSSNuQnlZCitMcTh+eG1mQmQ4d2hrOSsqRTNleEB3RnQhVDgoYndPMGl3IWNHPmlTKXYwLWdTQDg3P1YtaHRHZFVXNTI1R19YfHk2PCk9ayh8bFJiUThZCit+UDQySmh9dHo8WSpYa3NWJTUqUXclY1BjMG1oNjloXkBRS1Bgbkp3YlVyKjd2TW4yUzgoMmxFYU1EekxFKVl5NlFDOy1aTGV5UypqYChLCit2NDlBazlGZ3RoemVASk5pJGMoMStpQipLPCgmQGtmKH5te3BqTVN7bnJPazRaZUFqMyFyfiVIPygwOVdPNXBQNjJPIyZoYTErUGZmMHAyCiteSkU1ZXgyWSohY2RESTJQK3N9VUwpWkh5I2ZJJUVWU3JlRHoxd0Y3JFU9P2pwcFZtMTw/JHEhTy0qNE85ZHBZcU1Na15nTDhPQWI2VWJzCitDbmM9ZTM3WEFDQ0BfYCQ1fmQkWT0oI1JZaE48dy12M3RKRT0kUHspZDRKS1A1I1c5Yk1ocmlsV3paSSl1UiQ9OSVDcz59TDAyd2Q+Ql87Cis5WT1malNEfEhTQTZ2X31wMXEyXm9yOEFJMnA7eEZ8Z0xEPCRCbkJGfGsqZVdfRXAzP3pFYFlNYDNfWTx+dj8/ZEY4UyFGI2ZiLUlJRDBjCitZaD1gKX5GITB5OHllRSoyKy02YF8kQGVAXktgMXJ9KjxLZ2JkOUBFY1ZTe2JpeVdnS29yc01QNkgtKT56PElBN2VOJjxoZSh3PTU+RzhKCiszazJFQkVuOyglayhQeDlUOClgNytyO3E7Pj9nayZNKCZmVElgeChXUj1GbVVRbWZYVik4P1BOMEZiQWhUaXhVK3F+KmItbiQ0bFllcGxvCitGVzNjRShIX14hcWkydk9sKW9kMUJRSTRtPCYqMz5KRmRXQU1XZnZ2ZV5PaCVwOHlKRjczS2hBRjYkX28/PjR+cnk/ZmNxRGpBPnk/clQxCitTd21wKjV3PUxyYExMQEdXdl5xe0VySChtVlIzeEUmWmtgXitlPWwzaXdzfn52cGxZRHVzZiU3Ul41OE0ydjY3KDxhSlBqSkMhWDR3cF9GCitVbDY0a2YhczQyQ1lJc2k5KXR1RGJgSE1BazR0bHkrNk4wK0hBQlVuakdndCR5TXghYzUhNWVtWWRmbn1jJCowY3tVe21TfEJrUEtaTjQ/CitwJC0jazBrYjtrQ2E3ZXtDNiZENEpMezNyY3BWIXRfaGQ4KnpsSXo0ekwqcyl6aVVQVD57clRiRDMtO3YoMD5mUEF5UHxeUHZuUmlnaXVVCituSHgzZ1dyKGhVKTBIekYycz9ZUWZgRzNtJmZvazVAaCh1YlN8OSlxPS1xM20mSH1jJF45emY0Z2BPY3ZMMUheaGlPeEZ5NVNjY3g7R1RzCitIbXhufEFlIyNFQ0FhKyooblgoUmhpZ1BJODs9LVVFRi0ofDckTSN3cSQ4dmAzS0M/dkp6b1A+JUV7VHF1O3x2JWAyRiZmblY2OVVOMHdOCitDQEp1Sys8UiYzd2NxMGgpK0ZLbHBTMTQrRk5ReHBVJk9gLUBuUWsxdjVVWlpVSjA5WCtRUDk1MGF1b31uUlBtWWY4PVNfI1dGRDdsWCtaCit7c3wyJXZMKit6TDVCc3dpU2NHO2k4UiNLRy14MDJUX0B6U2VpWGtYYUhHbyUxbUszMEgpZWI1K1J0Wi1VZ0ZweEB4YFE+ckpoV2dmR3Z0CitDZUw4Tnt1QyRSdmA9bE0xMklfUStMRjZqN2tvWCU8WEN2fDB6SndiN3UySFFBQ0AkcV9IQE4hVEdCJD5tTSNOdEFrQXhRKDI/Um9rc1FJCityfk4lYF5AOHQ9V0BET15VR0dKbm8wcml8Vzx7WWtZNiZNfWw8KGJQeTxyNDtnQigoPm5zTFJKfUlmaG8+Kl5pbSRRTHdFenk3VSlCSV84CispKDhidksqSm1lPWs4JnlDWkNKKD96ZkFZXnZMRjQlKGR0VFRQXjdMazdodGdaMFQyJEc8TkB2MXpaIXtUTG5SSF48NTZXUkNSTldwaVNVCitJPXRNVDw2OW5SRl5mWHlgRH5naj9XIXs8UyFud3NlMnl4Vk1DRGtqdGs1UDtQQ01yRGtGc0NseiVjZ2NPZTZyfTNFRVVATDcyWWFfQShsCit3Kj9jdFdtZFg0UTZ4c01YQUBBP1I1ZFZseHRBamxDZmVtcEZ0Pm1ZcHZscGkpJEdfTXJKWnk+Yl9UM3IyanNDXklwMk1EY3A/K01QeSorCit0ZSpaY1BlWjBNc1l2fFlzfDk+e2ljRyRmdm1vKmtWV29jKz5xNm1kZkRVOzdNYGlfe3U3XmxFVTRvez4yXyQ5M3gtcTdNRyMkJiszXjc/CitYS2tDTnZVODZIdXshNHpQXiFCeVJHKztTcHJkUlZKe21FKDJBaVNQZyhCTlAlRnRTLTt8bmRWM2wlT1pEak1JbFV6IzhYYXwmV2JYc0xkCitLeGQjKGwkPTJuPFU4O3wxXzE/KmtaN1hHUmEtdWUqeWU+ZXllSWBOaXJvZjw1bTFRQSVjWTdsNypNP0A1JGM0T1NCWF5PbXhlbllUU1VfCitKcz9wOHNlMU4leDxDTTlfYDdSdUdpZEErYkdCWD8yTyRqRWF4X2s0WjtqRFNiJnBQQyRfbXo0WkdxcT9gNFNgKjd6MDJocD5Je1pOYVNFCitNTn4qfn44O3hZXzVma0pMI0FuI1hOXjI4R016ZklsP09tMnpwTCZYfTVgQ3Jaa3swZ0o2LSQxc3ZqZF9FQU09Ynd3UGBKWjV3SnoyTURMCitVT1lBIVNOIz95QjNRJitTM281M248eU9gaEolTlYzRyVYWCtiaSpuIUF7Vm1zdWMka3JsMFlYdVJ6RnVoM0Ykck9zUkxQez82fFdNZnkyCityZDVgb3A5NXJwVWtDY0lDMCVtbHtufjRiU3RgKTI/OTtyQyFzQ0ElNkMwWDZjfkFuRndONVRtLStgRk9CQlpTQkh9Yz9sbkk0ZG0pJkpUCishUUpWX2RiJT0kMVl+RHdBOHlEMlE2Zk9RK25nZnE8OHFeT2xAY09kJmlnUXk7ezA5YCMxa1NQc2lULUNodkZtISY8eTIrSUEycTQqMyFfCis3eHB2UCFmZU9hRHlaWEJYRnJTJms0IU88X3hTYlVaV2woP2hvditmOUZRVX45dlUxbzJqcm9uKzMjSCtrZ3diWHN1U2JvYG1Jd2x7KGJpCis9PF8ycDA7WnAtSj89VWxLa0xIeF5MTUVZbVdoVTJuc3RYN1ZwOGI5SU1XVUR0VjBHdXd3P0k3KTBwZkE7NzdUWFNXdHg2Rj1LMj9iQioxCityTnNYOG5rS1EjRX1NbD88NHZKVjtpaXk/Rkk0JUswWm9nVkdyOGRaTH0qTUxDUjVPRXgkYmxRV0I+UFdlNUBPQ1l0RldkWXs3QkR6fSVNCitRb0d1YjFzV1B2IVVALVM3THhpeC1ENGp9STttVWohV344JGE3TWZZJTRfTkFJMjtVN1goeWZgITU4XzJLSyRAIXtWTmtNOU8jcj1EfjRsCitQankzeUtOcUp7ZVpfYGNtal9sMktaMDYqWCFBJUg1IVRXdmgoWkMhfCM2RzlYfFlaWFNqcF5iKXA5Yj1tK0dFenE5LTYhfCVUOVNvVCFDCis7U0UzeERzaV5Eb2RLfFdfbW9XVWl+SUhXNH0wNFdZZEw+MkkoendpYDJGTUVzRWx0KkpiQWZabUs5MT0oYjQob19TMmAyenV6OX1MI21oCitMZk5tVSFkd251NzwxXkg+JW1vYmtBciM0QzktfWk0cFEpfVBqc3ZtMUJrdnxMdChFRiVpdl43XlJqTSYrLXcleSMjR3FaO09Va319PiZ6CitaKillclc/Mzh1Tmh6ZChhaz9ERUpgSDNjaDF1TSFpRUooJVdGOSkwQmlBITsjUj9nYjg/Qnt3WWZuQEZYc3tAI2koam0+fmAtTGwkfHdaCitqT01gWUU1dygxXihVVWk3MFM2YX5nenV+VU8/PXhvZmFfQSRVXjwta0Zld181cVFMWSpXezRXODVSSVB5RDQtP2laQER6OE0xRiVnKThlCisyeH5lNmdKNkE1Tn5oZFZwXl5zenlQbHtQbSM+QmRTfGBxNVdgPUtwdih6VGdtcFB6bVJIXjBua3slb1ZsQzZ0STNNbXR6dXA0RzU4bipXCisqZD45NEszdEowc243YmJfdT1qfjhtZHZMbkJqZldAdjtnNCFkWlI4ZW1waz9UQWQ0Jm9hWDV5dHcxLU4jQVQpS0NYbEl+S3xjPXchZlA9CitEeWdBPjs+NWYoTjxOUW1fR3BeJj9zNTgmPVB1aWl2XkZiJWlPajtZWDlGWS1ZTyM9RGtrcEB7cSFzfT1SWCVIR0ZLPkJsQGYrfUJwcVRfCitvWXpsQCNBM2NrND97bDxJSVp6OW89YDsoKUFGfDNydnotcDd3IW42R1JPSCVzbmhscy00YDFJaVhYU0RPPlFhLSV+MGU+eEUkWlp2e20rCis8TDFaWklwd3gxaWAyUkl4O0ViQSVfUTVVaUEpdjxjQWBvQiooRGVTUF85bndTeilOYz9lajNgNSpEdylRSWlsdz9kRGh8fU58ezZwcF5fCitVUyt4aXN6TkdeP1RmNk00aipNX0teM34haXV3b1MrU14oTklJbExARjM4SVR6YGBreihXbGZCJWNzYVV0Mkx4RGZ+a2EoP3t4Wjk/djNpCis3X3syLV9GOClXI0hLNSV7aCFlejg+PXNLeTZfdS0zRE9NdGRiUEh2K29VJUx0UVRuV3NvaUZpJmpTSGRNNTd4RURRdlZ4Q2BKWXtWR3oyCispZFgjO1hTS344JF44WWkwYl57QXNsV00odXQ3Slk4dGxCZCs0JWhQMDdHSmFrSzFlMWo7ZkdEP2omY19oLWMmYk5DZG5yZSZmeGp9akB7Cit+Y1FuZlQkaypoRkJBaiZmamZmKXd+KVBNM0Y5O2VmM2xXZDAwJl5iRUdYfnl+RXpVdzJ7OyskZ0Y/T1dvVEombGYmcDY5ViolfWl+QTU1CitsVTsxVXlINHJKd25OZDlLLSF2NUxtOWJDNXUkP0hLRyVZdyh9TyQjYyNVT2dBWj9ZJTx0dHNGP0U0JXI4eXZzZ1A8Q2s7ZkYoNSMqck5HCit7WD1fZiluayQ+PE5FcWZHe0RqPWotOT0lVnZwRjh1MEROUnFhRWRLNWdzUmtnLVFBQ1F6RGdec09Scm9fYGhMcSNPZjB4c3NiI3tzQzFSCitMSEwrajdgaHI7ej8leX03QEwwY3V+SlAxR3xucmdlNUUkKCVrbjA5aj9DV1pRbUNuRkhFVXtoaE5wODl7U2YqM21OYGhQPUpSZlRhelRyCit3KEh2P2N3Sl90KXc2YjJGSGRybl87WDw3Pjh7Klk4dUhzSUJ0NHV7TCF1ZDV7UEorWj5BVSRQMDYhcClibHZOaUpyQmg9WUJCLXlURDR7CiswZzh2MGFSeWwzJH5KQ2MjNVl8dUB5SU9DaDVlQkUjQCVDcmRUWXZAVkl3dHB5OW5NJj1RWFJtNFVUKVJReilOTXhBUys4XlMlTGk4T2BTCisxQlBHVmxleWxpSCtiQ1VsZm1IbDN4WioxYVJPPS1mRihpXnV+bCtBOThhZjIrNnBYajdmMT9iJDw2cFQwRjZVPElkRGhpWH50XmorYGhBCit5fm4hKmpnezw1dWF9I1NMRnY3a2ZDREJyKUBAY1pKXjU4WjElZylrM0Ilb3soa2xTdW43WDUqfF8pPDdoaHA/M1RtSz0kUEEqPWchYigzCit5SSkwUj16VCsrIXRoOEBTY3V3MDFsQjNgdXJGaSo+Zkc+bUIoRzh+Kz5vbjR3WnYwJlJYdlZ3XjVSb208ViZjLWNPSHl6aDlDO28kNERVCitETEkrVUlSRnhUM3pBbiZSWDU9aGo+N3pZN19XJVpBVnArRnJgcSN3OGl+PWAwT01wZEM8ZXtjRl9LTVp2eCFTQz1NI0xTKktSeTtTSkNMCit0RnohflU8SXVaa2I8VnczOVZyQ3hNJn5LT1V7b185XipxOF4jb3whTGZFJlAzI0pHbERmJV8zZFdhQ1grUjBReiFUdXgwQ0BaVmxHKld5CitObXdDQWVEXkBsREhhcjY/ITNVcVJLaVpWUHx9cVcyYytxYmMrTmtjTDVub2Vabm1IVV9vNztUdUVyYHtvXykmWjRsYihie3wlO3J5VU0yCitCdW9iK0ltSyNabVhGcV56fXhDJXsmWENmIWJeQUN5ISUqNy1Yak9KbE8+VUNRNiNmYzN2TWF2Xk5yP3c2QmN5LVZnPkYqUEBCcUIzZ1ZaCitGLSQzWUhqYGpzWXpmVSgxVW1CTXFiJXIxZDRTZ2dZeEJENzJyKSoyTkp+MDlIclh8OVBwVl9FWkdCRnM9b3pQQChCUiFaVDA4NzRoaiZZCislJFduR05SbmZofXpMS3J5bXpPMl9sSG1nQV5XSzFBfDZId3A5ZF4mNChCPzs5PzNjM1BfP3x3PmdoYjVRcXojUXJTV0I7OGdTTCtNNnAxCitsP0cpPW11MUtNQEdVYHNCS0E8Vjw/TnMtSEQ9JHl8JiolNFktelc1JFMyKiREdzAxO0h+KSZnc0gmZC1jLShRaT5BRmhgdnYwQFdHTT1SCit5WWNON1liKzxwfVVuN0pARmhLSmBfRmRXdmFFMThje3VpemJlYGhCVz5fczYrYll6KS16PztMTlQpSXU8QiVucEtlPllCfnc5JGhROUpkCitiKjFpVFNqPj16PE1adHJ7T19qMnEzREtFOE95PlZmJUNkRE1AeHtRO2RfNUEmelckeFJfa3A2Y3p9fUo2VThXJVl0K3l2NXd4czVTdyFCCitVVVFKQHkoPX5Ea3FEZX5DP040MSlNQXhPc3ZNM2gpVEZ6JXtidHYoQmdTbThzUComYTIzdCpmaXUtNnp3Q3hPckRpeyNQeGF4SjliKHpLCisqZnBgTGxEZG4teU1iJjxFNGI1JVZNZUlKXzVyPHM+fEt0bjNEKTtydV8rV0Zian4pO2w4LSMkRHtxMmVRZm5lVW42MWw+O3RtZDctNH5ECiteVmRmJV92dFJicXgofH4hcnAkKEprO3ohKz1IS3o7dT1nKlhiNTAzSCpQY35YNW51flNxVmNoMk40Vj5QWj9nb31iJjhSdlN6VG5zajJuCis8NGRVd1lfTT09T2ZfbTQpUjR1WihIUUAjTDl9NFNpRCNmMVorUDtSIWtUJUpPTnEmVVo2KXVTPjR8KkIzPWZZMjNjbUMtPSo2cWBFIShJCis8JSM/d3lDVFZPcCg2ZXA0dSRObjhLUzE+OC1ZYk1pTWtXKHR6eW5CVS1DPnNZZXVncndTQkwpRGdUem5edDhncztOfiNebDtFez9kU1J8CitwUGkreGNRVmk+cmo5M29DQWU4eyNRMTYpdWA3TmIrS2JJeSgkWk80M0xEPHRaUUswMW85JnVnUUN2bVdkMDdSSUc+Q1NiZ0RaMXBCfn1aCitiPFo9aUF3bkVTNnl1bUhBRHhLcWJtM1d4cENHTXxxbWh2S2A5UjJtd2FNWGhUJWJiZ3xMQ2MwXiohP2N1MytTelRaNEooLUFMZ3dWcF9wCislKjhLREskKSRHSC0lP2hVSCtzZDlhXjZwaUtZezV6KkdBTUlgPnNhRyg+MntMP09RSUxSRXNzdiRpRiZ5I0RiTnRiMEdKTi1nKGp2VmRJCituPWJjNGRxMT1WX0xodzcpJEpQKEokZE52SH1lLSRNMzY9ak0+R0tYJGdRVCkqbWJUOyt2SGlrVnRuclhFYkFMKSRvOE1BNz9lb1VzMGp3Cit1cElCRi1ISEJZc0ZDUW41dU5Cd1R4VktoaTNhISptRXR8TDw0Uz8tMCl6Y1MtXkg4VGwyaG1aNDtmUUdGY1JYdm0oSilQTSt2cTgrTTRhCispMjZmUF4rJj5LQnxJdjM4Nmg3SCk3V3tMMW4lRns7RV8hMEVxXkMwVUpiT0NCV25YMyFTUHVVNiEyfH5KX2tZXy1ad09eengyJkBUUStOCittYzstLTZ2YSZGeDZuVHVgVnh4KnBkU2JicEpNSXJucSh+RjlVbUdpbGp8Ml9GXyt+R2xPPms+VXQ7YlNjdWVyI2RxIXNAOyt+Rj58SG5PCishT248Vj5ySVhGSyZ7Q1JZS2M9N0czX24qQCpmWGN8PyFacSo+Nzs2bTQ1WkJMantIMDVzLVJUK0h2JD0tYFZMeUwrPTFDb0ZDPD9GKnVVCislLTxTekQzZHUhZikhPk9+T1JgbkA/a2Q5aC1vMEF0K19GKHQxSjM7UU8yRktjZWEwWXNleWMzaHomRDFpQkRaXitFQy1ue2BjZjxUYTFaCitBSFghRGp1YShRdXVlakNefF8rUVVFI1JxQ3hkQFFzQFNeJH5HcVYyUWY1JVUtbFQ+RXlidDkobmBCRkhSPDRTMVJYPygmbzE0UVBsQ2E2Cis+aXtxcTMqT1ZvQGdZVzlneFFNYyl7ISExRU1oNWZucEFOKkZFUCNCNjMwP3VadExzTzQ4Q1VeV2ZQO2NzRi1+eVg2V0huQT9YPG40cDxwCitkP3FeQkdQYGthcFFQK01+Y0tIVU1AantlUGM+Jk4+PHotMCtANmtqZXwyNXVkQUMxYStFKlpERj5WVWF9ZE5EPHZ4MSEmLWhzc0ImOTY9Cis3dHB5ITIoVlh2UyVHMy1NQ3JwZjIpXyNiKEpyU047MjtyQnA2SFl7SzwhXkQ2Ozd4OTtvIzA/PnckdTFCQ1ZXZkgqYWpfOH1pY3JON0M4Cis0Uz9VIT4qXjRjR3RvSX5gfTA4XjxkKTJATHBGZENIV1FGTjY+KyVTMDNAP0BoLXQ8Zyo3Y2FPZ3x4NSN7el9gZlJqej9CcWAjSjxfRkY5CitNSmdeT1M9alhLOyZkTCoraE0raHw7TkRhdXpCeyFPNlglVm5NTVpuX25zYHUhQSR3bnE3RjRRKEl5SFM9PUJmRXReJEdNXlc0ez5kNSszCitGKEI8NGEke2QqRnRXemN6cndGKm4hSE9EZTlCaGprTk1JbVNQITZJYmB+bmpMK0JTKUU1KyNNclY0biRGVzlmeHVaMyRXU2NfZ3JFeFZkCitGdGVZYz42bCFvamM3ZFlndEQodnhhY3xoRUU2YXtWRlU7Qnd3USF+JlBLPkE4bVdNSiRZMGNGZ3toPytDME58aGhybipMXjQ2fndgNH57CithVTA1NE4haXxwdjZgSSpGNnJSYiFYe0JBMXNJZVNONG4wXmp3XzV0aCFBR0kwZV5raD9vKHh8fXYjeD5nLVQhM0MrYVhlVG1QPHBMeXlRCis8QjsyND9hemMmWUdnTHJOelhHWkN7WV9IX2E+N2VRbWVTWVQ5ajdnX2JaWiM3fnVWVHwkWSVSa0RXP3VVRDJiZ3d8ZSQtVGBsS1Q+ZEpMCitTIV9lRXFecUVaLX5XYylZbGB9UHVXc25ve3xEQ2w8VGl1dmwxMiRxXndpVmFPOXE3JTkoc0k1TyFFMDtadTRpRUVDYiFvO3wtI1kkbj5FCitqVXAwO1p6dWxfSzJCTHF5OzdIai0lZzJ7USkxP29rbn05TmdtMGhNU3pqV1BiMzB7M0tHPSZhUFZFI1QoWk9ob0JJPypoXmVXdTUzQyEoCit6Sig0dnVjS2h5Pm5GWSNkc2J0VVF5QDZzUnU8WTUpUitzdj5yOEg2IU4kJX1PUkVTakdJMkVPVi14R1F0alRgIVpicjBYb2ElZD1sNX13CitrSFdlajZNNChnNWFjTHt+SXVYOFokdDZVZj0peG16SlQqOCtiaD9Qaz5pNUUkeSFPQ0s2NFIrTGUlSzFvUDs5VmIrenwhRDNRT25TfFVkCitLVnhWZCVfRVl8WGJKU1FzOHI4YUNNJHgoR0lxYWwlJHc+eFN5Kz4/QG1AV3lgTkBxKXptPHZYT2QmYX5pcHVJO2AkUEZiPH07OHlZaHZvCitRNiZ7Ri1oZm1pPUBCX0lEO0NLTSp8LV5sdyVXQE5NeipXdjxMeEJnSXJjS2hMMEZLeih9TEhZNlNFYWdgIzwkKTdAPnkkV3lvQ3dTV09GCitMV2AwVVlJWipNP00xMz8oTk53eyZeX2okUH5hO1llQXNkfWt7UGpQLUs3NXpwfUVzKChCP04hQ2RQKDByIXdMfGtkcjFHb0hNNjdIUzNCCithdz4hX1ZkRTdLSWBpKFBkai1DbEhrZXt3O0d7MSVAKTwtRlg0a3lyU0w4bXJ8cWM+UzJ2RDc/bDlhMXFrT28mdnpjRD5WYHF6WGptakx1Cithbz9Oe2dUenxlZW5tRWIxNj9jQDB3biFfZDRvZjlLZTZQKmMlQDI0KnBsSHVCdl9WM1BiUjJmXlBhSjdzOSM7LVRHc208c2pESiEtNFR9CityTSUoNmJ+RjMxN1lWR0QpYmZsQlEwbDx0PTFAM34tb3crWmRsVGl3QDQ4QTA2b2xzZTZYNGFEPX1yey1YbG9YQTtpYntNNUR8JHY5e2JhCitqemVCRWtsbHhuOXh7JEo+U1VFdCErTiklZm5wKUgqOykzXyM5fS1IN1pgSTN8X188YHZ5aTF7JGMyS2NvQnAkcktpPWNlPno2VmFrRkomCit3KzI4OGllQUdaaHQjRHZhQEh3JWtabi1HVFo9P09pMWJHJXtmbSkzJCpMckc3dkUrbm1PaTk5NGM4Y3JHNUEwT2dFVSQ8eE1ufDFyYllGCitUV2llXm95LUFuTyYwSTY8Jl5nfXppRjdGZzhrSHlLRFVLKEUkJWk8RDMxeVdHUU1zZ2ZMR3RkMzw/PD1obig8dzFtX3cjUXYxSDs7U0UjCis7PntzN1g4NGsqLSQlRXNmOVZtKnxlJDZvVWMhZUJLfHlqYkVYZUd3SzZCcnc3T1BzXjBAXi1odjVsPE09UzJIWG94MCNKQVk5Yj1geTRRCit7KFAjJmtaWCY3Xl5NVE00N2cmOSFtbCY4eGA5Sn5oTTA/Q0NgOVM0UT1JQj5BMSFsYUs+KFB9YmFCWkFxK05gI05HN0w7TnFZTCREdThYCit2Z0lvKWU3YHY0am5MaHYofjFJQlc8TytVUTBaYVpiRk9lazFWSSg/byVTZ3I8U2VVNkw1bkBFSWlHe0JBQmxYKkJwdk5sMjs2S3F2YEJGCitlQS1KUXdLLWRLXnVhYXBOPVVlMGxHPmlGV0ZQaXEraj9fJGAxMHNJPCQ9PkJgNG1qYkJXKFdxVlM3amteZ3ozSSsjd1dYRFlwaiZZcUJ3CitIYjAzaUhhLXA4Iz0rSXRZbWFgT3NnKiVyMypzWCU1dWlwZjg4KXdTNzM3I0F3KGhfZkdQOD0hP2wwNkduWWliYSZCTVBka0VUK0FUZypXCitwODR+PDRHIUtwU20oJT84RFBiQGgleHZ3Jik+Nz9XaExfcyNee3BmPT1jJGgreVRzdm47UmZ8TygqZjQrPzE2e1BtcDQ2JT4yV2RPSytCCitnXktlMWZldGM+X2JvZmM0N0g/cFIobkxhWj57VTh7IUxFTCpGTF8xT2lLKyV6KHI7ZVBMRiRQOEd7M2d6XzAwY2cqTERUU14qQlh0aSp2CitoU082ZVFScT12I0UhPkRfZ1FfJitiXjs5Jk9fIWJwMSlLazQjJUQqPzVZUExYR0ktJDhEeW5rRkpfLU1PP2MjRXojSm51bG8wSzUwKDVaCit4WW1xbzBRISo1T191anpUVVghdk5jc05rMkk9MUZfUU5OU0Q0bEhRLXAtVCEqQnh3P1ZUOTV5NjRaeH16aVNEeShhITRAQGghK2wpMntxCismaXZALUhmKXVsST4reipKYmQ1SHJmfWA+MWN0RXZmRyV1ITJDJV41ZiE4REhqJGNWVjAkO0N7Ozx6MlQ/Y3Q2O1c+VG5HcEdTKSRyQndNCitkRGljK3Nkdn12Ky1rWXZOK0l8dDVSYXwzYmhCRGdjVXJra0ttSyZjRGlwKjQydiM/OzE9Iz92KWF8TVRDRDhBMDNuSSlsRnN7YHowWChDCitjSTFVYXF4NCs1aGN4V2AwTEpgbEVQbyh4IWhHR3VveUlsJUJsKGZjeG9NLXZnckdVNXR6WF9FJXFsdkUpY3pNQklfcHY9V2R6VHx3QlRuCitnKGhpZW1AdilAOXlrOHR3I2VXIUlxQ2heZz88bHMkc0FJTzY1QldWI2NUQl82Rjh5cEVYeSZESj59UU1kR1RtQEtGKjliQjZ8NTFhdV9hCitFOXF1eUV5Oyk/dHI1Xj9GSj14PDZqQ1d5PUo/aENNP3BLdz14U1Ahe0czJCNvTEdmMk1UMk53PFAjaj9aamJadWZPO0pea2QwSDQkSzFPCit4U2ppYSNUVVE+V1JSU0V7KEo2eVE2Uk5LSEhmYSVtZlZvNT8/Z2RoKHgzPDQ/a3ptVHgoemlQXjZ4VGBwJjV8U1cpdVhIWTByPmVpbldiCis0fjxaJENidT8reUtQNHFlTT48O35AYFpZNVkoNjFiRHNSQTk3Wn12RVFaaFdFc2EtWVJLUndRSkxWU1RlbXBgUzRhb3BiVW9XNnlzaEpoCit3dHxYaXQpNEkhe1VwR2hMIzZtcVk0YSlvSVJvLTJnZEd1OGhzcWhzOSZEWiZPanRwOFdHbG8xbFZ6dTBmY1ZleWN1blZiM3pVJE9pRXpSCittMnw7c2tkQTN6WCNGUUtLPVZed3E9MiFUZm08RXJ8cVQjKXxnOTZYcExDfT9wSVFKPVk0PkRtcGlQOE0lR0JBRDd7RX4rT3xSUlJWVHVqCiteTlE1KSE5RzZWUUdDR25DQ3JXSzljOX09TUtDVT1vWXxhciR2NSNBUDghd2BRdmd+Mz5HV1dsVGxQVUNoWllmSG1Ne1R2TXMtQmBgV255Cis3NFNVamhgKmUtTCpLWDdAViRGTVhARUI5dSRQOFFKMH4hNXErXlBkc3NJQG4xLUk/Yjc4bX5OfEtMS3NkQE1WPHsqWCRrMXgySXg1NENZCit2dEVuZD1RVDNHK3k0Qko3eDFiYGhneWBMUmZTT2ZkWmVsMChUZkNkdSljSEghU0hnSnAtSHAhUCspeTFSKmg7TTVYUDh6X0RwWEFTRU1wCit+aURzKzlEbztpSVF9IV5jbFBTfH5ePF9BaEJsUkJvZFlORStBfiQ1WEFfbkBJNU9WVzAlVktPQ0xxbTAoQDVpbnBAfGl1PWJsSnJnVTV6CitwQyFmNHB3e20oSnNVdXMmeUlZXllEcE5XQGVXZUtHX0BZSzYxKjRRPnJlc2ApRl9ZJjtfS3RRRlc8QFBkRSM9UmpPOFB1UGokbmQ/JWkhCitWQGJ8RWVFaSk8PiVITUJydj9raz9DbkNpUmx+Sig+Z18meHl0bilQPlV1TWAtdUtfX0o+MzAlV2ooX0tSZ0RLIStrNSEleU5gWkJhWFFyCituQTNfX0M5dmNOfjFGZkl8dWxGN3xQPkkxY1BlSkpWK2pyemBCbkNrKGhPazh1STJneil3YD4lYlk+VEZ0dFJ0RG43K143LVF9UFI3YjYzCitfO0xfSyU9KFNoPDRNIXtRQWNia1duRzRiTiRXZ1ZSMXtzcH4yTSspKDRtN2U2MiQjUmhiMmMjaER2ZWhsS3JJQ0cpZVBKaHd5OEk7ZlJ3Cit4JU0qJWxydG45T3NSZz9hbTlHZGpubGY4QHp+bTBWTWBjfSglRUt8TSR+SDc3dTNaR2khKT1tVVgpUTV5TDlufWY0K2hvJGtZIUd9K3VJCitGPX1LeFIxUUohY0tKUE19ZWNNI3luVHJUVWsqWC1ZbGQqSmtmQ1hxYzE3cDJNO2MzdiQxTVg0WEo4ejREfUlwcV8odSpNYzkoZz4rbjQpCit4UkFtbkFrO31YQXhSUmlLRVMxd1FWWG1sJip5fnlxbzswWFFDeFRVK0BxJXRfYTElISpld1c/PmZETElgeXVrUlojM0F+SyZANEltUiNxCitiUTZyY3h2dVRgRnlyTldDMEpTSm5sTk49UihofWFmTntxM0U9PUR+aEtDcXpHWDE2PnM8T312Wkw1cWBaXnVmYyRgaC1XKnV4eUtIT2hICiswRVpeU3w+S2Z2UTRfKmNEZzF2SEVWKS1FezdCQGBCKDxWU25WQFF9ISk1YHg7JUlgTn18Y1o0bThXS2ViRGR3OWBXanFkWl9LMlE9TDM0Cis1d34mODc4fHpeMCtzcnJSb0FWQ19aUXdNWX5nJW1GaFp4aHRpSE9JLUlgdmlzaWchfDtlUFUqO0o5b3QhfDVMfWtmbFJpayRPaHVPcHhPCit6SisqNmoybEFfWjNpYmxaUWFVJklIPkxNZVdCXkZSTSNFeHM1aTdHZGsxeTN9WjthYGpJUlp1eVEkO3hVRzI8UGVCal5EaERFOUs9KlpnCitnS2BpWmNuX28zcGNARHIleGM0KVFJKitLZDBWSU4tamdUOEw0Kzl5eWh8Tm8hUFp3Y1pfcE9TU0x5SUlEPSV5az0/ZkBjZkBITTlGPD53Citfc0VtY01oMFNQfW5eZVJpKVlJR2B0cT5sfHR4fkJgSHxjeXt3QFl7Xl96d3JzUz95ZWpDUDVZY25qSz1EK2dyN2Iod3NDYXhRP1VpVDs9CitNKkMkUHpAJUdfNkZMUUxBUkVzc0oqJGYxelZxT0A1RHMmNnImYC18XjI9LVM0XiFITEJ5Nn12WGVtZEd7aEhLdk1edWQ7RHpzKHNoQDBnCitEaV4zTkNnLXlLSEM9Z1kobmxnUmBVYWstUztpMyQkK3JUSmp2Q3leNzt5STxHS21mVz4wIW5PRTt5cnY0NGpHO0JnclNlUWI9RFhCaFhgCitIZWlIQzJ0fngxZEdlUmxHfmY2PSg7TWhvUEZDVyV3PW5pWXowZytzKFE0UW1lNCtAZ3t+KF93IylPa1p7RDFxVF56bSRaSkhvcmVvN1pNCitoY1dxclpPPkMtI0ZUUm5tOG94ajg+dGcqai1XJHA4amA+cFo4PnpkTyFmLX0hRk1WTDA3ZlBNVndqdHY1VHYjRkVnZXFLbD5+KXxlSlpoCitYUGpvam9nelhaVVQ3enA0OEh4VlBYTmlzQ1pEI1MhUj5GQHQmTjw2T2JaND5jbDQqOzg1U3x9UDZubU1kMl9Vd3RFYHlMdTRXbiZ4Ryo2Cit0VE4tQ2E8QXU5T2BudVR6fktvSyV5b0ctX0d6KkFZNDQ3Jkc8JShzWnBzOFEtdDBUVzlMUDNnRWxXPj1CV2pMUF8wJXxAOFF1PHtfWkQ4Citzem9WN2BqZ2AkT3AxVWhYMldIUz5ENGp8N19ZRWZgPDM5dVNuZjklU29TaXt+MjN2YG9mZ3pORnl4Zz5wWT9KY3hVVDNDJWN9PHBmdzNPCitmUFQ+UW8laHs4cmgkY2g3RztBUlotSE9pPylLTEReSFZveFBYRDtiSCoheDVEfXQjO19JP25LM2t9ZjN3Yn1Uc318dExqcXs1aU19eXhUCit7LTNEQSpLdnNIKX1DT3s1QyF6bFJyZXE3bjd5O0ZQSjB3fGNUdklIYTZKJFlSXylwNTwkdHZwKjRZT2E2MCZDMXFSKDIrX0NiVzJDZ3IzCiteJDg+NEo5OGMzYnBvdHw9dGhmM2N4OGJEeG58OHxzXlc9dylTV0R5YjNpUU5pbE5NSyFxTjN2TEZTVSRDaFJ2PVQ1dDdfY2lMZVdwTWB+CitSakcyNlVuYWV0QStVOGY9UUxRRnMkWTd4OXcpKHphSihRWG96P1JhbEVYfUc4SWw5Mj17eHtRe2tHaTNVX0lhZV84PTZRVndvJGN6bHpJCitvP25wQTV8T1RWTiY/QlpVJmRFNDl9SzhWS0hBeXhleyZTNHlVc2E1ZSZJVzBLZXxEVjFmQilAbkl4LXZtYW8oOXZQSkkoQCVKcVEqPUI7CiteLWptQmBgRWoyUHRwUlQldSo8ZzM9fCV4VCZYX2tKJkt7Oy1FfTAob0pfPGJiZyZhRnI1OypBTzQ/VHZ5VHNZemgpZ2U9KDclJTc9WXhaCiteQ0whQF9YcypRT2dheXhzc2pwaShILV9FPXwkK1k5UnkwclllYzZvPEFlbD5uKjxYb1p7YnhrOTRDcHtiQnAtfVVgOSFtQ3I5IVF5SHM+CitjPDJQQn12LXhlTFJzTitNQlNTd1ZVSytlcmdGbjYlS0xudEt4Qnhhe1FjPyNLb2diWT0hPHtGT288dU9NSjNQPTdDeT9SYSZfT3lxdCs2CittQGI+SCZsQW0yPTVxXiF8NFl3aGQ0KitaYEJkZiRgM1Q5JXx5aSlYK1Zle253djJoYyFrbE4/dUxNJk1GekA0I3M4blp0QiU4cj5gUkAwCitBIXFAbT9nc3A4Smt4T0srZXJ0RmRsbFo1NWtwclJxU0ooa2BzNWBJMyspUUpXI0tVcnQoKWZkXipKU3NXNWNhaUZ+eWFHXjZMQVZHfmA+CitZUFJGeHA5R0pPY0EkWD9JMT58cXJsP24hc19Xb3V4OXBRJD9PfWA9TCQ8cmp2bj1yMW4+ajsjbkxuZFRyXjl7Qj5eaFo2bkBLaz8yTmotCisyMV9UbG1rdTRDVz5xamF3e24oMkRUTHZtZTZ2ZSZGOEJCV2c/R1ZKeSQ9Kyk/Wn58NSExSkx3RHo1NFlyQjQzYGBUKEo/Mm9vYytKZDA7Citqb0U3bURiRCppQkRBUHMyMDtZNHhgSGolV05ybEg7SUJiflRTUylucXJ2V2s8MlQ8fVFNbWklYThYWXdMdXBiUXZ5QVAyIyNmK29hR09qCitZKkIrQn03c3s+M2k8RF9RQSFwMFQ8P2s7Z3JSan0+QWhRJHtsaF5hWSVKWn57c2xmOGpjQEV4TDZWRW91WkYpJHBpbnZkMDU4SUM2SHRaCiswZClBWlJ5PDFNUU0+aks7NzlpPlZ1ZjhFdXZKajk2b0M8NVFDeSVTNm9XJCh9K2h3V35SU2JfQz9WTDdCUXFiSHpgcHkpPTtwVl45VERrCitWaHwlNHYkfSlgXiFYOGFSWFpQK0J9USlibE08LXRCYERXS1dvUWpvZEY4OS0/JVokYUQ3eWNaPVF9PCRIYHgxPUswQGQqQVg0VUZkR0MjCitlNHdjZ2xvOERlXkRUNSp1WlY2RU02SChDJE5RaDVJTGMlQGdRMn1mWSYqUEkwZHxJNjk2OT9VVkJINkApdEk9RVB1ZEBXK3xEfTQ/ZkElCit2akEmISVOalRQTTsoWnRMaXxQekhnalE+RHk2TThqLU9UVDZiIzFzLSpNYEJhKiNgcWM4ViQhNj9XWSMyNEFyIVV4aUBDPEB7VnRNYjhYCitYaXZgS3NMZnxme14kOTdmfDhoNypQR1QwYUtOdiEyT21lX29Ed3UkPzhtYXJCQzU/PyVARU97ZUVGYGlNaVBYWXJWdFlDRyVGTDc7bXN7CisyM2t2Zz05RHNmPStqTGNpQk83OyYwPkFaPzB+ZldDKnJtOUlTZFhmZEgkRF5AUCFoU3pQMlRAXihqY1dINm1ld2J+VHdpSEl6QCVXKHwyCismX1AyWGxufFZqdUM4PzVeQWhedUQ/Jnh3Tl53T0tNaWd8OFFNXjZ3TipeUihxPFM5ellaUy1wY054a1hnIW9APlhxcFpGUHdDTFBad2U/CitFRz5Jc15YdnxyWDd9NENjR3ooR3M0KUozejVCd35PMT9PSjtlKSQtZWpMIzRATlRFeT4zdileMXBNVH4tcm54VnpPP3NZaGAtdX5WJVMzCitIWWFBbDFHYlkwKFZpIVhZJEYyO0Zselg+dlU3SV9AP2JrT1ZXZmFOTHo4PytVbEFecnY0PiNXX1RfV0swSW5mV1EhdUBGMTN5OHNLNH1gCithY2xXPW9AcXFgZyhhS3c7eHg+NjZGeHMxNUp5THwzcytXc2JMYkdCUzJISCprclUxX0I0UG1RfTF2JmMzM3ZWWilkTklzfGUoejt9MzE9CitldVEtd285SGJ2S0YoeSRWR3lsTlZBYk1VTl48QmIjdkBWMkJNcGp4eTg/bjxHJUpmLVNlJmt1VnRrYFZDO1YjeWBGaChMOUAhJlZZe2tfCitWdSZGdiZJVmVYKkBOPGs1VX55U1gjVTUyMVpgdnpUUlAmKl5uUSMjdTtPcD89VCR1bnc5QyU+Nld5b3pfQXYoMzReUnRne0lSNFREX2lYCismRzA+Q0FGVW99XmNhTzYxeT1QN2Z7UmZ2cTNtM1JKNXRMUm1NVTg7IXxUJFVVbEhoZGwqQng0VVR8fFNPNF5xczhKQ2QkOTAwcFVNfiZnCitENTQ4RmJVMkppOTg+UkpLRjM8LUd1ayVuNUdeNXYtJVRkV3dGLWp7LT0xJkgqZm9rRkQhJCtYIXtZY3NFP3RDZXBUM3ZZPy1aPXRpVW03CitiQHFZND9vdWtJVTtzKExfSjhFQT4zdGR6c0UhJmglWERQK0NDczd7OEVtaW5TPzcmWHZhZFIycFVhOU57YmQzKEsxI3EoY1lJfkN7SXIqCiskZUdwWng0cG9Mc0dpPmhxc21STEFxUlQ2fWl3d3NAS1B2NzE5UlVtbT9ZYiUmPlJIZmdBPT5fcWpFbXBMdVQ9WEwweUUxbTV0PG9nPHpJCisjMEopMXZjdjM3UXYrMjdpPlR2TXt2ckpWSTw0V0kwTThiTipkQHI4eTZ+X01kX3UpOXh3Nm0kQk5gSHBVdm5zcnh+TUBSYip5NlE4JndACis+dkM1MTVibmRNaXtAZWF0LXV3QENIek44VS0kflMwUy0rOWx2a1BEbX4laWVxdWNkKF8kcnhwI00hclQ4PilkLTt2Q3MwcWJlVCgwaHxGCitObEZxV2NOSmJjanFqV0piNUdnO1VpISRRLWYjfD5AZnBLTmdvNXg0WmheVk0tclF6KT5TUCU9SEMhWjYlSGF2N0kwdjA+U1omQj1IWDNOCitLdURESzlINEEwSVFDfHFNU3dIYVgwI1Q+M1FyOVotKV85KlY9a0p0KnNVanIxTGYtTnhMJTJmR1hsaFpyN1JQYVdGcl98Q3Y2fnM4UTw0CitGckJjQnJRazAxOGlhRmRZendzaiFveHNeT3srQlVLen4xRzdXKjc2c1gtK2hhVShRQmVgPFFAVlFHbF9LVktAejZaMztKWmAyYj5kV3RrCit8JSY5O3xmTDw1TD14ST16YE02VCpqQ3lPdWc1eGBwe29CTzAwKlZpRXJQXmVCJU1KVUlyakZXaENLRG5zfFk3emt8XyRxKHlseUZ+OH1ECitNRkcrfkRRMnUpZDE1WGlkODdre2BfUCZLaEZraVBaVlBCc2Z6KnA2a1o8JTlHKFJNaT92bkJ4NzcwPmomKlcmKVojVj43Z1hsTnh7fXdXCis2YzluXj9pWSp2RTZHekg1JTM+TE00fXQyKFMzTCsmS2laMTc9I21BZ25+fVFnVT0lZkJhWWlSLTwlVEx2UkxIfER4c2k4M058P1M/TkxACitGVjxNQV5pWXIrIzZwY3gwdUVuXzlEO0BAT1dzZV9iXnNFPnpeRFNFZ2hRIUNqcGR7eW1ZQTArcyQyflh+dU9wXipUIURRJkpTZFg0QDNrCis3NjEtRUsrcld1YXheZ3U1Yz11aXxXT2RVSGJPM1ZQbXByNWt9YGtoQF8tO1lwXzJzQGZeeTglTGs7PEswbU82P2c/a2tMUXdTcntsUCEkCit2dEVJVzR7PjVufTJwTnJobGd4PDYmRCZVbXd1LTh+bERWPyk+YCRtaHs4KyQjOGkzdihmQjZMZXckO15LeVhkKHR2MkE+Xmd4RylrbnQpCiskYmZYUHF7ezBAey17RSYtc0VeNDJLMi00TjRtaCtFPlMwbDk/ej82bHJKUE1RUXhUTjc7Tlp5QH07VikrSHF3MzE1aDEkbHszJU0qaiZYCitXc2VkWDV3SXM8MWpFJVMrRF5yaV9gQSpJPTl4d3tpN1hXNkJoNX44UE5rYnA0a1RXYG9OM15kZUkzQWFqSUU2endzeEZoQFYlckxueHRXCisoK3pMYGd0TTtTKVcpUUx4fHZyNUApOEA7al55NHRoKGkmPGFvY0leUF9KeUVgeUFXUStVOWdIbjE4b3h8JW1LZkkjJnlvMWRwQyZ7dFczCispcHZMPW4lNmlWRythTG5KRys0YnZpRkcoKTZxJXxVYldoano8RyVXP2Ate0hMOVdneXE5a2xmIUMoRXI4PGkpZWBOQjBXP001YGlEbyN4CitJPX5ScyZtP2xtYztDbUM2RGF0OGw7TlhyQyFGUmJJOXI+SlI0IXVsZXpeNGF5Z0dAKmpMaFIxa2U+O29GNkFpIytqb25Bb2pVd2dWbmp8Cit2I0IkK3hgfERkZH1CcExXbTM9YlhgKWtIMl5iQG8+TGl8QURZck4mb0JLKFFlTjYwPmhvIXoyMHFSO1p0IUtfTlNiMUFxNXd4big7MXMzCitnSCp9OWxURk5tOzEmLVY4ZEZScFktV3U5SVUqcUw7KFBrdjdpWlFeVXF2dnNRc2UpZHlHWm18ZFBWeTQ8WF5ZKXRiamVMNSU1KVBaa3lmCitLYCY0RXBaWTxic15GYF5OR3hxI0heaWE9Pks2eCQoY25pMmVwNCZ4XyQ+QjRCPVhxQCFYVygtKEZMX2RDKDVIWENFPCQ7ZU1pK29Wal5kCit3RSluVk0xNXNhWnB5VEFkPU9rOTkwX0hFKWY5eitIJTkmPCtvdkhSZFMpQ3dCZzl1V2FwITtOe3hwO3I4WFV5ei09PCMpWnleYUF3P3FrCitaN202SERBLXp7YUtnJXBDJEFCaEt3OSErTmlAY3NLbF9iMVhRMD4yMzR8Uk9NRDYzP2hXaElyZER0VzNTYWdvNW17ZnBTOXczbD1SQilACismQyNvY2J2QSp0U2RRb0UxVTAkO09PIWZGTHw4NXROenZJaEZrcUtXT2pnVUxHOGpzVjBHfG1VQWR+LUlCR3lvTVl9WjUkRntUKlU+NGFfCis7RH01VGJvTW94QGkpJnk5YnlOVi1sfjNPc297VX19VWk+ODI9dkRYZWtfRUl0RTBkaCZPWVVWfWhiJk0tcWBYPlQocDV2eUpvPiQ9b3ImCitHRXNtQ1ZUPXc9U2t0ZSF4I01LVkpAaDtsQHJAKVA2ZiVqWTxxPEc9e0tGPlBFVj5nZ0IpKG1QITJNejUkc0ZsR25Ncjtiez8hcDtJcTIrCitzPWwma21vVHAxdDZKJG9LRG14YH5UZjhNMTB2UnQhVWQ/YCFvUHIpKGtkMCN4ViViRklYcnt1VE02Tk85Nl9nMHo/djslcUhkRz4pS3RUCis8cVE3cUhiQ3kxYT9KMy0oP15lNml5NmN2N3pqMz1ecXt4VT9YIyZ0azNBell9IyllMigjYX1uampEIXYpfEsyM2oqV2NjZW1RQWtEPloqCitWfF82YiNNbHBBVWtgZX13cFF2YS1lJiNeMylHRVI5NHRfM0QlQT5UIXM4fTEzfSlyX1ZZbXFtZ0hfIWgyNzRVO2J6amU5Jmc1QlFLIVIoCitNbVNUME9eYlZCcUZOWlFING5qPT9WZXJRNkluYlFwaVM2LWRmYWt6KSN3ZDBNV2dRP2xZaig+UmYyYVBzOWNoTkpifmkjR0klYipeKzBeCit4d3c/LT5nQWpMJF5tIyU9YkF7SXtlSlM5P2ZpQkVRYiVlViVZJkZFIXt2TiZHUXBxPS09WUBXRWk4QjdpUGZOI3QtWHA3KWowe2dCYCopCitWMzI9SSp8SGF0WUd+YT5xPHU0MlpqMVJYIStTZiRQS1JyTThNUz5jOHFrRigqY1J8N1YzKCplTEdIREkoJTVyWjtvckc0PmEpd3VzREtFCitkJSRYPWstI2hDJXFPU2BZcyklUU1JSWYpJF8zVXNxLTlKSiN7NFo0bCFINDdReyo4aHp5WHBtbEleYW0mXko1dyZWSDQ/fiF3fHg4RChoCitfX1NaczNMQWx5T1g4bUlmMlFpbDFrelVed29ZTiZOZXpKZEQ7NUo1KCVFb2B7K3VOPyUzQzQ/a0NSSl5lPl8xaTVuZmJJSE0wMWR5dytYCis8ODB6elhVPEhKKXVrZyZkI0QpMVpfX354U1hjQzZeM1FGSzBaUC1vdDFZYntGZmE7eWV8SlQ8fXs9ZmJRQ1NSNzZlWWc/UUk5SCE8KUpHCitlKFgyb29PS05fOVdIKlcrTGhRP1RtKU4xIVYkZDQrSDJqPkNoUi0xVEhOU0NafTRKd0Z3M35aY1E0O0hBNyNMamM1cUZLRSsweFFGRzhSCityfFQ+Q0s7YEJ9azByMWhtRSFsYH1xTFhpK1V4Z0dOcV9DZEh5ZmlMZ1d1UT1qMHc+JW1qT3xMQFA/PlR6RmR5bzJMNmArZVF2UXpPSkAlCistXj87cno/eHljfVVATnB0SnxJYklPaEt1TzBXaDR8eys7Xyh0MzcxKitmSlZlMl9RN2AlZGlVWWQ0aUJ+MlZyRXMtWTwpRy11RzZDb2A5CitVNGNkejVNSXZwMzZhKl50PS0mUT5qNj11eG8zNFh0MWt3clZJKXNIKFh9VztsYTBkKUI/eyk2NDhqPyhxdGskP1JIU2FCaGJWaW1DMnFDCitaKW9oVjFUO0ZHX3A0PiQ8IVYzWXhkNSkoNEJZbTspYlhrQT4hKH1OfDMmI01wPkNhI3BwN1FtLW5yOTV3Vkh6LSE5LS1IYVZMZChvRnhGCit1TT4qeWdoVlRfKnJlZkxkfmY0UXdzYCl3eCRVeEdFOTlEZCYmS3opWi14V3Ipblk4JEk+VjtvKUs5RE9gPTNHdnNKdEgpb3tPc1VTSVpXCitwV1VXd2pYeyU7I0VmUUhGRTByVyohWHlwemRmdE12JnlzO21oYUNGNEUlTHh6SnMwZEB0TXk3PXNPRDI7en5ZMURgT2VZJm16Nk53R1RkCitoYytKJkAhYmV8TmIpcjNYNWdtSzRWYUpUSUkwMlhRV31MKj5xZnFGfHpEajEodWJ7Z1hrekRQTGdhaE5tVnlGT2xfOHlXUj5Da2JLPUhZCitTUjl7P28zKCRaX1E1b29HbmIhblRvYU8+e1ZVUFVAXjt7aT5nNFRsYmw9UUJjUiQrZzE8czQ9KDwtTnxxYk9mdUZ4Qk5rcFlgZiZlQX5WCis7NTJJakYqcVdUWVRCR2dwP2hZfCltNFVfdi1nND17S29LKXJEKkx+O0tldUcjWWFnRSlyaj8rdD1iN0BfJip4Z3Q8XnR6KHdYfmc3UmBfCitFLXI+ez1HPTchM3x5QF5scW04VH1VR3R5VWJMfWNUUmlSTDk7QihkRWZgcTl0SEV1Wn0yYDQyTDxETTUtQWJXRVI2bCQ2QGMxVi1WWUB+CitxQzhwYUVpblkhRE1UQGp7X31tT3lZPVVpMCE4QyQyTzRiJmRnUTdUWjw2SndAeEpiezk1QXFHcWwzSXNLPn1MP15xUzwkQzRzWl9MaEJ8CitKZ0R8ZzJnPSFYK3pfTUNLVmczO0AjcTw8PERncVVeR1ZqZEYyTFR5R3c5KlYmIVAjYy1QUD1zRUlxM3lPUCpFQ0VgcX1FPipOMSlyMzdZCitFJUE7PWwhbTY7M3pJemAoKG1FKE8/LTJjTF5xZ0AwQnpKYDM+UX5wP2tAfGY0Y25UMEhja0hAM1FAJEtBbWo8Oyp5bG9AJjhTNGAjJXxxCitRPD99JTIlb2Alb2p4fFhYUz9KclIyd3RSfDFydyZ7aC1TbEhBRUFrJSU4VmR+TE5rYl83b0gjSyZJamV6cGhhSXordE9EUClKTG53UXFwCismQWhtSU0pT2orSThDWTJYPGZDLTZMeElWYGQ3TD9iSSV3ZHM9d1RwOT8mJmN5fmFFWnhkRiYreyE1Q1gtcUNLblk1WEBsc09lMklMYDx7CitIIVZeNDd9aEFfIzdraEJLI2ZKR3VvM2N0c3x5XytafUp5e0EpaEBacX4xO3Qya21qTCVrN0V8TilsbmVydGQ8LX1rcUFgVjAyQmg1UTVLCitpdGBeZkk5RWM7b0ZlWTF1cUhxQXFoeVdiZH1ueDk1M1FKSWE9M3xgOXFHczJLO0JzYmdvMGdRQ1MmeCooe29SM15uNWtpc1Z6QiEtTnQpCisoOFo5N2NMZitsdncjXjhAP2MhJV5KVD9SQ0FxM0JBcXJ3TD1lZU1sUihFQ28hdDd0WTxWPn50KXdLQkJIe0t+JVY9YHpAM3V2YitGS2NGCis1bXpIaz5uVn5NIUV8V3ordlRvITAjcG1ISEVHUEwqcEN6d2B1ckB8bl5NYm9qPnFIVHpiR1I0d2JGLXQ9NX5+cmZIenthaF83Kmx5Pj5JCis3djA+OTRqZCo5Q0MwYkBgaFJ6XmpNamFKQFg8RV5xWER6OVJXKGh1NTBLTDJjTD1CdzszaDdXb1VKNHVIeT09QWh+dExxTE92WCNlR0teCit+dX4xQzlpTnBZWSp+UlcocEU7NlpIR0FZUH1HWF82ZVgtMUk7KiFoZjZSJTRLeTtHMmEqenZeJW9nPXk3MS0pIT0rfGJiZmFEcypBPGx1CittYyQleT50eTJAVF9tYm9GPD14a3I2JXJhJm8rYD50eiVQQU1HYWkhcTFGWXgzOUo9QHVKMXpZRWtAVS0rYzlmeyhLQXVMWmF3Xm9jeGorCis8fnYyPVRwT3EkT29ePiV8Rj41XzR4N3ZpeDh9IX41ZyklYjIhezFtPjMrJCt6d0UrPntgaiF0KEd8JjFqI3JHPWRYcmBrY2cyUy1wNU1mCitgV3doZyRsYGNxUEhTYVl4Z3piT1cyQEVLSHtFcFE7JUFqbk0ldzhPd2d+LWd3KC15OWFjWFY0U1RpMSNHK0F2V3FtQ1h5Kz5TSWhIRUl9CitqX2VCdiEhdnl0YU53Uk8rRFc5YD57Y0hELWJkQ2kqWkhzbih3cXJBYUVVJCpRQUN8ZnR8Ml5iMyRtSXB8Sy1iT0k2Y08mbiRvWXJEcnltCit5PjkocUlEY3okLUwhMyhicnxzSE1wVGF2QHgyeWFiMn1gZD5xXyFyQSljPVR6TUJgejNpT08/SFpwe0MkdzgldH4zUy1XZiF0ek01VEkrCismST5xQERaPllPX2RuIVd7VHFjO3MhPnVZWWNTe21hZmZmKnM3Xj9TUlhScElYM1pgNl5sRklxbW8pZUV5UVA1JW5XPkhVeVlBOV9ufHhkCitlIUx1T3dedn5mJjNrUzlmJiZeaGNnbzFQMzJjREFuITkxKVpHVWNNJC07QDFAb1JKQ0NRQVZZTjBKeVJOaW9qTFdGTzUhWlU4TXpaSENeCitnYzwhQkZzKzt8cz4tIWQpbzk0QGsle35II1pqNiRweGxlbkd0QmBVflR9eHpWWD9sVDtpUkZpUG5HMjM2a1ZVYEUlVj5NUHdUJWAlT09zCitueGl6TzlaNiF+O0hYKnlKfj9GOyZHSyFmIXJUelZDdHFKamYpdjh6UGFXSz0hOE9nLUotaW5hb1lBZ0VnQlVpc0kxQ0JAQ1EqSWtWZnVDCis/WSF1cFV2Ji0wSFlBVEpXZTFRdjs2WShLOVBecT5jYXFuX1U/MGExVDI3cnV9PTxQSl5gTmV2QkB3Um5ZZkh5VnIoI1NoJXE8QmIlQVllCitiPDxoPkdyKnlVSCZKK2ZBO2kwJjMoSF5BP3llOWQ7JUlkZUN0fF96NHV9NyR3I0IqNFptNHl8OWNSanskPFklQ0RHKmpxQDdOJDMwTkRZCitUSHI4UE8jOGZVfEpkbiFUZyRxWGdkdF94IUhiLXtlajhsUjJ2ITdndDZAZlJFbDVSendxZypuX25DYz1yfjFeZUZJN25xRmZTY1VyPUk9CitESVltKkF1UV94fG9aYWZ8a2drY1R0RnNramxiRmFJIyhrWFFjQGcjJnUmTzQ1dSR7KlF2ekUhSC1PZEFfN2o9P1dQQy1GKHphQSRMfEhyCitvfk11ODtRa1NHSDI9UkJvczdadypVbFp0JUxmNzJqbnNFRnNvQWp5RSFKYG1SKWthUjwpeWg1aT42UFdCekk5RmBTaXppbilfX2BTQzF0CitNJD56dyFKenU8YjEtTXdmKkpueWhfZVZPLTNYbHFhKX1SPmVscSRyYWB7dk17ciZfRXxeTGx9YEI5UGUyNEZUWT9FbHA8a3lLYCZ3KDw5CituREZHNz1GayZrYlIybiNVQGF9dS1QT2gmSCo9WmZ6STBZTnQ9MiZ6JVNqLXZRKEVWYWk7MUtQcVZURGIqQ1leYDNwPy1Kc355VzltRElwCisyWUB4NlAwPHUyJG9oRUotUjt2TUd9NihZPmlibGpRK0BMYWUldXBKJCMjZyFSRFBYfF5DPktMVDB5QWRpIUkpcSU3TEczTjZuTFVOand9CitqVjFLYF41OylmTGAtSTNYVERzKFJydkB7VzZGd153UG1edDM1cDFqUiZhbSFWNEF+fiEpPytYV3l9RmxnR1lwYGF2dnN6MUZKOWVVT2ZHCit+QThmNitxLTJQJjk/Ui1lRGpaMntKRz94dERzJEpGNW1NUSY4R0crSDcmWlpMPVdeUDZeckxWX3Z0WC1ReihLJFhTZnpUaXJIemphPnVnCispejU5XylDSXgzeFp3d3loTTdqMSE7OzJYZiVkVHtmVkEyTzhkc3E+TWV+MENnUX5xSmVGZyYyYG9LezcwVXVaZU4xYldqei05clo9ckp1CitmfFZ7QXpBfEFLaH1eMDwyYHNvVjJWTmRLRFpYOStEXzF2aH5xNXMtPXdOOT8+TW9FT3lvcHJ2RnNaaGV3JHJ9UjR9SEx3XnxsQ25ySU98CithPFpta0VqZWU7YSo1U29HPEkmMyg9MitJVz5kVlRzX2d4c2hTI3tXKnJCWUpePnFgblNHaUdPd3UmKndpYkNOaE57YkBwezlUZmdOPXNiCitXPVI1RDxINWI3UC0rYiVhbz84NnE3fTlMfCR1VExWNW5aSGoyUXBEVm8jNmtnWmpDcUg2Z1BPd2shMUdYRG02M1Z0YUUpOG48KHt8WCMzCitlN2MzMkE0ZXRhZ1RIY2hTVnJETG1sNEgycnAjWT9DNU90UEpIVG5NM2ZxaysrR2lhbn19SGlkQXwlYnlhVVBPNWw1KlAqSmJ0TnFSWjZmCiszRDRVOyYzKiQlPXBDTn5KbkRwYWRfdSQle3xVTnd3QilCPEBXVzx1QDZ8ey0pRkxiUnJxKlFuYEEjeikpbzVBWCstOShXajxyYXRSQyhQCitoVSVyXlJZQTVrdjl+KnElKXRZWnJ6Z21iMlRGSDZAIyNHPz5PdWtgR0NjOXpFQ2NIdWB5P29RR09JQXRnckJwRmdycnc7TFROYFUxMzVKCitLXl5TSUtIemtXUSZQO2NQcWw4TV8oOXA5JEhsfnZFJWl8dVVuVUxsI2Y7SmA8QX02IXdUOG1WcWAjQVl3X2BgMS1pJSk0YUBiZG0oNVBDCitQJG4/PlYxLSpZeihWRkl4OyVacnQyTUJCZG5aTjlXRmxxc1goP00kUmA8eSg/OGMyJXxvK2FvRTF9cTx5QWFoX3NeRlAyK25FWXlnOSQkCit+QWFUTT1HQHhUYDYlO0UoRHd7djVqQ3dUcTN6KjJmYD5HZjNLUzxBeE1JSjlHd3ZGUVV8Ozd9TVkxfDs5YEBSKmpWSExqNGNpe1RYQFRhCitVQkE0K1F+LSFie1Umd3lOO3QlMyQqaWc7Z2pVcDY8My1HRDx9PUxSdE03NElBJDFkaU5AKnR3dGtjZ0QlNzctbylxTiFvR1FkRD5tTFMkCis8c0g/WWQpQD1VZTt2ZEhTZT9wUn5FMHg9Vj5fP20hMFRIeGo+bW1jeGtFNyNgcWoxLWZMWUpsLXx5UzJRTDttRiNQZDYoWDY8KG83THRXCitpZCo5N1dGYVJqLVVue095TVNRTlRnRChGX2lNeFBzPntwQTFWPH1MdGBDc0JpcmNfNG5gNXEhLX1KRTgyTmBRZmQ0KiU5TmxVYk0jTXZiCisycyk7UXQqVSNWQXFzNTFtfEZuNT4pSyQ1eG9kUFhjczR6SGVaSDxkckJKUjVKci1WK05ka3Z+IXo8e2U+ajxEaUxmVkh2PVd6bFdCTCFyCitIeWsoZnIoYWxPNypAdU18UE0oWHZXemo7P040enRmYGshTlYyWUdNfmJSdUs+I2VLcndoNW9wRjU9b1FkdEImZGd8aUlXV1FubDBUUGA2CitITjxTUkp9Ryp1SF5oJm1YeVZDYzc/IVUzYiooJTJXLV9TUWdWQWA2djA9NjhscXAkPkMhYnpneGw1UD8xKSgkI1B2SkdZWnMlKSV0Y3FQCis8KnRfUn5KfTZyPGgxQWl2fVJeYVk5XklHaHgqYmJkVip9NDJeWGB3Y3sxLSFOIW9aanlFKzgmXlNrWDF7cEw+KVhaYGhxOWduTGheTn5lCisycCFifDcxWjhKY1d5Q2l6RlZfTDZ9IUVEQm5+cilgTXR5KzZxfHhpOys7NGd7fGl8NURxRWNDTylrbzVxVThxUGRTRHNYKjNNJExZMkxVCislc3Z4SWBHTGxkYURrT0Q5MXsmVmBvJSR3RzVCeyhZJGQrV0VQNnRqZz9IUk85M0tCQ1JzMnY/ZDx1JjwjRTxweUVWVlloTG1Fd1ojc2krCitnU05uQT5aSCNgaVdsT0doTzFKRGRMRz4qRH1Xey1BWSV9dXNWJVgqQSFZI1R7ZSQyUE59Zytkbmpud24lIXJMdUMzZ2NCQlBSNGhhY3JzCitpMDRvNGZgT1k1LWVTZUl5OCE4a3ZMRz8qZSFsUk4lN2QhM1o8K25HJUxwQWx1ZklXdW5TKndvPTdxbk5MIXBRa3syRyp0fmZ6Skdud25uCitaNSZXSnBZN0dgR0JAPkk+NHpERVMhJEd4dT40WDk3WG5iPFEmSWwlUlAzcihxXiRnVjh2RDMxcjMrYztfOXxjQy1MMGZTMipGcilNemcoCisrTTIwPTFKXkNeRi1OVmpUK1BfQ2RXYFAqUjBMUmltMWU5cnNCPWVrYWxtQnNvMzdoRWMwJD40WWUoYERyUD4le0hDaVc4KGg7X29zJFBXCis+UCZKa25LWTF1amF3b0pDSlJHQ1RoWUtfXmdqODtOMSNlMTJHS1Fibj1XZ0FZYi1BZ28oaHhMVzd4M2IxMn5NVShodTlOfXtSandTTEFwCisxR0VONldOcW1vaz8yMEVMViR2TiMpZjticjFIMClnS0BvOEk8MUhwNnEkSDtNb1ZuWHFoaUJge2M2Ukted1NiTGpneUROMHBLRnRjdi1rCitSckVHSW49QE1WWEc4RkB1K1Bmd3JEIVNCLTQpYEEqPlBGeSZoRlRwI30wdldzcCZncTJsbzFnV1FlPTFuVG5FSUkoaXY0RGx6N2J2I1R2CitCNTdaV2N6QUBzbW5XdEhMbnxnY0lANVNOSkU+Qk5ieiltXnBAe2pAaXoyMWppdFczS2xWNyFoX2FBVDxVcDxAUHtjdD1jc0pjQlI8THgwCitURyZPPlllfk51PHp5ZEw5eipkd3QhfENYSjhHZGU/I3VRKnsyR2RyRi1uPUIqNCRTO0JNOUdPR1ZKaHJlPkRVWns3Rn5vdUkxdGU9N19lCitUVkRAYWZgUXtDeiYoQSp6Tjc1MXBTPlY2WUcodEpZTEdienVXZGd8WiFRdFdpcXd8WDxNYyozbShDUEp4NXg8S05RfDhOSnFWTE1NTDFwCisrWSQyMyV7KDh4OUdpVmM9R2dnSlBhU3RXR2NKQ0liKWFqP0tVWVo2dn5qP2RHfnNUKmAzTUBebE9aaT17V3AwSUshKXU/aGlaRzVuO1p1CituVCUjSGg3SVJsdzIlRCghbDJFYXduSzg7WCZDMSRsXlNickhJbmt8fWw4ekROT3x4TFFxNj4mcGo/eyFIOUI7VkJNSEBWPzJyeE1Qe3hFCislbi1UWnt8cGcmZUdDWHQ9QXRyT21WaX0oKCoxc2U4U3I5ZyRINmJOQDdgSzdpSy15RyVSOH5naUFSSylRKGB8VGZCTnVDRCRGTig8KVFyCitgaEJqRyU7bG45MUYrQk9XTmpXSitxZzNyU3c4S01ST0cqN0d+Sk8zXl89dGBWRVQrdXhvUXliQlBYaW4wYyUrSjRUeWtMX2gwK14+ZSRPCis/JDNNNXNsfj9AdlBpSGtFSDFpcURFU2doTkVFfUtEbTVOYklvfmAhKz4/dFJLQEB7azlSaTQ7QUp7PDk5U312Zjc0RiNrT2Mxa2p4Z1MlCitRaW91fTkwQUpuNXI2MHBVaTtCaFNrMWBKaXtWZnhQTSlPOG9QMz01cDtHREtfdj0+aEwkRzk4RWxDPV5uPW9BY2N5KDU+bU52bG0pK3IyCit2V3dGPCtGeyheTEVGSCVYI1JoTlNaKHNieENmS21fPFc4Z1NfN3Nsa0pme1FMfG8lX3s5T15Rek81ZmJGS21UKCFvQGw9PWtPQjE+Tn48Cit8Q2IjdiZIZUZWZGspWT15WDN8b3coRHZUOCtHTylAUXlBa0V3eEBUZkskWEdgayE4SWFBWH0pdkdRUmhTPk5yUXdjcEp4JlUoPlNufXlxCisraCl3MmoxfFo9ZEReKmh5JUhPLUdIe3ZVcnU5JWE/Tz08V3NlZ3FMQVNLSW1Eel9WZlg1Pk1hb1lpKytNKVdSRyhRYDtHJVg1bSVHdEVLCitIOTt9fHNuUiZreHNHK3shTnRFP3JfbGBGX1g5al9wX2swQD5TZWg0Sk8kMyUtaHJyVDZWN1UkZ3sofDxXV0tOX0p4Pmt4RzxiVEB1cGZ9Cit4UkticVp6PDU2NDtVPVY3MTFIRz0zbSVHWEptcTBMVXF2Pl44VVNGfXFQaVFnS0E+JHxGLWpCM3p1TzFiJVpPenB+cVBYUnRgMUszUG9VCitKWHdXWG5CMTQ5el9hLT9id3huTF55M0s4JDhXWWFCJjNBbCtkVWVaUzlkNylEb1ctWGU2fHApQmxfSW9gO15zQUBaeTkjIzgjclpMS05UCitrfnNkQW5UNT1Kdl5PMSRyNlc/Tjc/alJMeUtWdjlhPTlDVWhLbFRgRyZTUXYocCFLYGRATFJIXlNobVdKWXBrQ2RZR1oya3wySz5BMH0jCit4TEMhdXArKEYoYnZENjlRX0ZSMjFrJENnMHZAUDkweiowMXlTRHY4PDdxdmpQNnxRR20lS1NzVVp2ZHZ0UnxaaDU0T2NoeExlbDFWQilfCitPeypxP3UpbTA4Z2MpNGxrJWYwdT9PVUk2K25ZODcpdE5yOV9feE1vWlY3M3R6d0skX19IdmViIWpydW9ON18wMjBvOzs+TE97byRDISp6CisoK0JVJj4rZXMheEkmYW1rT0NwT3g/NVptQSNDaEwjdmBaP1lNYDBwaCFgUEo+TzFEMTFMMX1yWnReNklZMitTenBLKl5zfDc2IzMoaUtsCit3Uk1zfHB5XlJXaXE7YXBrYU9jc18pfSVqJTYrWnNsal9VcCZWSWQqcDl4WihOajEzaCUjTERRd1hLIzwkP24rJmoqejNaMkB9fDZ5UyU5Cis3b3BaJWU2SWpXbT1ZT1Nmd3pUNj1xS2FgRDZocWFARkomYWhSM01MT2ctT0RUSH0wPmlZS1c0bDYjVXhzZT5CNzBHbHxESEg1Mi0kY1FYCisje3NFbjlsRU5VbXYwflQ2cVZyeHJaMVl2Kz5HfSFBMnV7NjkzaHNmPz1hZ3BTTCNAZGE9bD9IOSYpWlBMdnczMnstZFViYEV9cmlMUmk3CitFcCY2Q0VTUT1icC0+ZWJmMXRKamAtaDQjeTZsXnZtZlJWNko8amRLVyNJVVo/IWNHUUZPNVolc0tXVH18XiRiKGY3b15aZXB+MDM5QjtUCiteclhNPm8rRjNFTmQtJHZkO1c1NjwtSU47X0llIX5ncWliYiR0TCEyeHR5dyF0M1duWUQ5dFReey1MQmpKXj4wUV5QVFFjUCQmISUrWkU1CitNfVNTNDJLMTF9X28lRi17TDFKeVN2ND0oKlA7SSQkMSs7MlY8MFhrLWJkPlhfQ340c1J4TUBIMUlDT14/d2N0VUF0JTNhaGk5d2d6V3RaCitOQX5sY0NocmhzJDNlIV5VWWN2aD9WZ1hQY1U/M0xvMndkQ0JtPFdHMmQjWiNIPDUhQ3MrOEx6YnRJKWtzVXMtKl5HJTxWRSk+SGU7ZHQ9CiszPU8laUJZMjBMNDl7IXEpTV89LWhfZWchSUdNeXRJP1VKUmNJVkRDMFF2YEJLOCkrNTA2U28kOVVpaT09V0YlSitWPTVkcig4Ri1XeV9wCitUbj0tKkxjVitUS3ZgQWNRVCZxS3hZc31xez1EeXspaUtDOXYzYl5ubnoqT0lgND49QVptTz1NRyZucSp1XmlAM1prY3grWnh+ND9kZFQxCislfVlkfmRJKXl5U3skXnglS05rbnZBJmc+cSUhJn1Cc2MpWG09Q311NmtHXishd0J9TEphRGg2Kj57SUlYJHE1PT5iSnIxNChqZEVhc3tUCitpbDs8cHxiWFhuXmd3WC09Mng+IzczZE9JaXR0ZSNEdlJLNFZndktJVzkyQjskRFUkcEVkeD9scCEzYWRRfWk3VW4/fj1AU3dhPndoe3hZCitjeVQrQkArd15ZNjQzd1FVXitrX3Y2ckhCWnFmJUBmKDl0WlJlTlVkY2pNXjRaT0koJCl+LTt2X0NKMmBldE0kLVFMKkhLWil2PzskP0ohCitNMl4lX2N5NmJRY0o3ND13Qy1ScXU9I1NpZ2FKPz9aRkUqeVMmRXJDJjFfdzhIZzxLX0xgK0ZeelRVRFhtQ1p1cEpqKnh4SEEkO0ZnNjBhCitRYTh8RzVsPzxWUW17Q00oZ1JQQXwoOCNzaUsmKFglN08rR2N2ZER5QHNmU2V1K3ljbmBUTUk7Pm5+WXFBIWcxNDF6dEUoZnpsPTdBIT0wCitUK3lXZ1hpM0MxQGwkazhxPkNkK0hTNkgmXmN3bygweFI4N2ByT3gyYHp3fk1DQmc3MWNrQVl6NkA9YWVeZTV1NWl1SFFVSSVLb0pBKGxVCismQ3pVZGpCeyhwJlVHayt9fURXOGJQcFd5OHt8O1o1MUY8ZWF3RChzSWtIK1o2ZllOY0ZqZTErOGgwcWxUM1ZSdWdwYVJPdHhjdzROfUFrCit1JW5iNkA0T1AyTyFlaipMMlA8X3xjbk5wd30kZzllbWw/MndEbiY0PCVwMzE0WCR+bUpMTzU5aWA8KyombUpBSk19N31zQmNRJEJGJnJRCitZdGVPPUk/NUpNPVomNXlpZU0qNHMjbX5gQGQ2ITFOMGZkVkgrSSFwdV9sU0d1Qnc8dVgwOXhrNiZzUTFIakw+MzhoMGtnWTxPY3N5OXI3Cis9OH1lTmlePzt1SnpmZW05MVFZLU8wMDtve2xAPj4pbilAdEAwUlJCWDBzc0lZMDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJVXRlCitpJVg+P3ktRV52OGVsMjI+Z0ZjOEo+YFZAbXMzQW07YD80XilIMztBPHNBJX0lTWxwLVgxPj5WT1lXK2NiaWVFTj1UP2B9aFVrdWBjVkAyCis2Kkx0PH1eMV9iKFZOQ2tqMXlhJX1rbyZMKFVqMkZPUSohXyR4YjtTcUZFP3pCb0hIcT1wTEdzUkhEVUtGSnI4N00pRWlUV1ZESWY2ckk7Cit4TE5OZDQhcXI1JTcmdDdOZ2EqaSZKUVVSK3BLNDMlMlpzKGNeJDJDeiNSdUZELVVkQ0woaVdVfkorbTNTdkltdGk7aDw/JE10PFNxLXM4Cis0aDg1WCQ1QlEoYTIjamhPdG4oP1o/QFJMbHgmYVJsQGltKThJRjFJSXwpSGBhMGhZM2FIRUhsWD01YExwdD5DRVRhXzc2JmQ9Z3t4JkJSCitldEYreylJKnRQdihAbDl8R3pQWk8pfWBwRGpBcT9lKDkkYTxpTGlueFAkUlUpUSUxSHZaOEh8VC04dEtKTzNDZWNzWj92fit3I0QrRk5qCistYkEje0BARHpgbmlfTCVvbHs8KVVfNlZCR1plQVhTNz5Md0ZFdll5X3JBZVZ8IyMjcnk9cUlkOHxVLUAoZWRPXkZxb0VifnVCYUUmVFRwCisjXmBwcnxpcWBtZWFqPVAkVn1qYH5+dSl5WXIhNF5UQDMxUVktTzAwO297bEA+PmptVTU4SE5kTiNAUXZtPVcwMDAxUlg+YyFKYzRjbTRaCisqbmhhYlp1LWtZLXdVSVZ7ZE1BYllYNkViMXJhcyZBbkB6OCNqX0pfKzd0KHF1RShXWEgrKXRNVml4blIrZFZhWmUyWE94TlVjUHl+KWZaCituWFYrMG02QHo2WTBtdWoxTE90bzh2djNsYkB4OEl7cSRvTUJMWUFHMm1+U20wcHUjcnchUG5lVE9HPG45ez1gUkZXSygxeXpCK2JCMTtjCit0ezlGQ3xhVzZgKWxPb0E+azkmdCo1QHUyU1RiaCh7OTtDJitkcmdfNSUjKz52LW8xLT0md0dGOXowRyM5YGRqXz1VLXg/SWZBQEVYRyg4CitKOUtefXl2O1FqOV5Yb1kjSkZnPTZtQnxHKjF7aF9LYjR6YGJiZEF2YDlGcGhkUk54QThMYHVGRzBwRmpLTnteUHBaV09wNTtOcHotcCtHCitva0c8ZUZkQSRldXkhJUlqKldmLXVZVEk0c2w4WExVUGdzXyNqM0Q3ZEIlSEtfT1MrZWJZcihRN3pVKXQxNTl0QEE5KiZ2eC1tbihYNFVjCit2bUxuWFVTZWUpX2VOQypPMnZVR1B+RVdwUUd8TGpuX2VYYzlaTyk/NH4jeTNAMVpSPHJmdkNjUFFFX25zVTl9VlleaHJ7RSpBNSk+ZCZJCitANTE8elgodFNKaXZNaFA5cH5rbERpcjVRPXhPSXxqY05FK0x3IWkyLUdqMlhqQylPQyNYeTxTMW04I0RoblNnOXxOZF9lSE8tVWEpdmtRCitocFdReGtkVGZaI1IjfD5gbWVmZSphaU0rYHk8bGdDIUJxQWdHdnNoI24yXm4jPV5AUHk8eWpHTClwfCY/LTRPPCZxI0JXVSpVWkYmI1JGCis0cWU3amN5cG9HcTxmMnJ6VFhYUk8odCZZXihtajAmcUJDOHc3Uj1yaHsjITRjS0c3aDNzP2NBYTZvP0BsOVFfSCF4JF9faSF4Q14kYng7CitxVnJydUAzV3B0P0oybEFZSGFudT54X0RJPipxVCUwOTRSWm4hTG1ad31Ea3pUUHtNOVY7cGx+UVlfemJNPytfbj9UPSltZk5raDA8X210CisyOWBqV3YxRShjZFZBez07PUQjWm1YaEkqVWp3YiQkQz9zRSFEIWdqRD0+cVhsdkUyPV8yKFlKb3d7LT93Tk9MemRGUTRzZyhOSkhwbm1VCitRdjNmej9ZKU9ES2ZaYjBpP1g9VChAOUlISVA5emFWNHI3VVR2V1opaDRNcUYrYlhfISlYQ1QjU1NZZT5UeUF1b2FhdEhEY1dQez5PNG9lCisldjF9KHR0OCE7SmQjfjJKT3ome0wybWtUeUEzWlliWXR2ZjJ7KzIjTE1yWn0hdHBUbTh6TiFWTjtScFpyRmJjfXhRU3JjOSpvdFlyWUo5CitXZVhTTGU/SFppOGtWY2plI0RTKzFTYlBQb0EhZGFQQkdwP2w5akxYTEUjPWZsQ3dKekZHSjZeeEJIYHRod1JrdC1xaGtjcmFmdlV2ZHh1CiskMSV3JTtvQDRIO0ZGTm5edGR2ZXJqeDFlfDY1d1dJdXBVWTU1Z1okbFVXKSFvQkNWPit2UD8ldlNwckVGSy1yNXp1e1J8alJwPlM7YWZ0CitgMz19KWQmN0F7WHglZFRMJGc1XitOR1c7cllyfGdkfXlnPThAQjJSc0h1YU85NT9FZ31UOyl3P31wfVJiUmZrOWMlalNXbjUyd2xwVTY3Citke3p5PypEbVUraFRnLSEtRzZrZDZ8RlM/IUIhcmVZLUU/ITRIU1BAMyUoZ3FQRkZKKmpxfW9JQEg7QVJ5LUFxMF5UI3tQXz89cEBDO1p6CitaWkpDeSRweDd3ME8mUiE2N003cClleWlaWSsxVWZGclhEPGRfdz9oPktVX1RjTXRQajJ3VUg3MyVScF9NSFMzS1c+MkBeeFZZYzFJKHJ1CisoSns3Ynw3Kl9yME9yRkg4c19SM2ZMZG01Kzs5JjNick53Kj8ra1BYdDd5eUp+cVZzTn5VWUpidDRgbGB4JDU2PlFYIztZMmZ6aGslX3NBCis7YlV0Q0UwZnpWRTt+d2VodndwRTt8VSREXk0ycTczZTtFJCVTSm04fHspUmEocFRecWA3T3J0UGBxPzhUMGRKQiN5ZUNaeEZ1NUgpY2pUCitCK2BtdWp7Jl8+cUN0SDV2LUY9WCZVTTxNWkp4RXQ+eGx4cU1rfV87QkZJbWh1WGZYQkRkNF4lcWc4Sk16eTI8MyNwczVtUjBedlo5eTVJCishNlImcXtkcCZqWkI5S2hkJVBZWXZyZlAzdX1nTmxJTnl9cGw8V0JFcj1OTmlxVml3V3pVazlXTjFKWTJ0M0FTKTdLdzdEYiNySFZtSTt5Cis3ekBBPTBnXnErUjxIfW9GQzMmSFBvUHFMe3k9SGJSTlQtR0w7K1QtcTcrPnpQOH4+RSZkQTV0UUwod2ZsSGFCXyN5NmhKezVWaTFfWCkyCitCfCo0YWlpSTdiVyZHa0NwK3xNcE8/bz0zJV96byM4ZmZYRVdyeVNHdFMpbzk2TnRLMnUkcGUremJZajU8WW1YVWB8MSY/flZoRitZO2FgCitUWSF2TzdjfFBISHchWFdRMXdvOXR8KGU1Y3xwJGg4ZnReaGpMbFVZNDYrY2MkZCQ8U2dtWmRjRFRDTm0xJWVWU35zQD82dXB6ZXJBcVRYCisyamBDaGJvbmgqblh9JF5jQipqVytoT0BSPFA1blNvTmd0ej88eSlNMmxZfHotPkwtcT43JlQjXjZuakl5UEhZPkVjTjchZEtvcVpuWmNUCitDI0ZVOHNgfk1eODlmUlVIZFMjSylTcXdmIWk3Ry1zYSl0VHtVYUYyKVNqMkBnMCF1PV9wdlZDM3lQbFZjNj9KS09wfXA1RShuN3JGbk98Cit0Y0kzWTRKPERfP15xfDklPC1aJnMjIyU8ZHFIYkhOT3tIME52SntDbUFFPnB0ayFOaUZNV2N3I3NONnApVTJTUTVlJWh3WEVJVyZYSmhoCitJWDlNeDlEdjJwPmt0WEMwfS1sO2ZsVGtOakIpXnVPakdvTm18YkFObnViJSVjMF5BJHdkejYhTW0+diRKX0p7eD45SThvenVsQkclcjNuCitkUW16QmhReDZTUDtHPk4qZWhvOEYpYih5NSlJWko8ey0mPG9QRjY4dihySjtLODlwVGZmTUE3TnFpUGhueTdfcD5ubVg4Y3R3ajV9QnUtCis8PF9fZHBvVnNOT1pxZXBZMVpBeThnSUhpcUBYcy1mbVBheVViYUwjQiohWXc3Z2QjQW12P21hTmR5bj4+UDchcGkxfWxzJTM5enRFO2BVCitXZnB6QDJPSEhAYmhsaTRCRiZhcHd8U2pxUUk+cyQqe2o8bGZ2S0MtJEFqXiR3ai0rSmBNVDJISGpCSiRZPzNJN3dLdWFybHFXfkslQUJZCitVUjwodU90SU83TEgpYDN9JXFxKmJyPmZVOWNkRT1hOFNYSENVVzRsJkEzcX5GY2p2P31IfiUwWFZWdElTbEhSNnJNZVpMR3d4WWc1bnN4CitJWU9gIWRIWVNHaG1ZVlQmRkxrKVIrYngzbElRXylpJUw5ZWttazUwaUlkakF6YF9MI0JYc1ckVEw8eyM3PXMpcGBpeykrYlEtcCowNE1yCityWXxRVmpLOVU1bCRpbDBZPzBIU25xKEE+cjZuOGpAcHNMYVVwT3ZlMmU9OXBUYEZFOy1kbFErMWhMRHojP0AqNHFeS19PdUludmhuV09sCismdjBWc3VxfUxTTjhTJGx6eSh8cnJwLU5eZU9SVmJiMDZLT1AtdjtfJlNiR2o/cm07cyFoMyR0e2hQIVUwWlF3cDtoNlA8SHswYWYzbTRnCitwP2dIfl4pK3FGNVlpbnE8diokMkh0QFIyUlcoSXQoQV4hLXdtPlc0UGxANiMoVXtZMWUkXlA7Pj5PRWVFaCkzJDQ7eXo2ZHQxKThGSDJUCis+NF44ME44e3dlRWJ6KGZlViY9Yk1HLXpwXlgjZCNxQXw3Z35gdzk7MVdwYCg+eFAkUDIxc2llJi1mPUdlLSgqMkErJmp4OSlfTm12cykoCitDKHJfVl5idmRIY3AlMEhVMCMhZFZea3gmfVB6bypIc2pVOWhRYjhVdVBfckIra3U5TXJ+byZsZTxGNUxRPlU5K1JZSXwhfkBySUZEdEYyCitnKzhtLXlASl9ecGFgQH5ha3UrQXotMlU+RHNYSEhNazRPU1RwQmYhdVlMTTg8czRqYDNOVTJUN18hPEROWUtqfTVOWjtGU0VBeSZ6NHE4Cit5JXpFOEFHTk84bFN0YVBYT0Juc2FHdjs5QnJ+ezZScWpRcEkmPlUqdChpV0d7ckwzRXVHeSNMNkclVDd3WUxrVztUQk0+OEc+OUV7YSNsCitQRko3am5XWT5XUklmdHk5K288a1IyOyVmb25ObyFjJSFjWD08fF9QYXZNaWxeWmZVe2QlRDMman0qOFBRblJaNkUlKURqYHxadW0le01vCityWj9iJi0/TztCaWV8dVp1K3ZBTCYrI0kydmVmdmZjUlI0TU54LUM7JnVsKXN2e2VKJmpqY297VClzJFp6PER8bTMjOWVJc155WVFWaXM+CitzQSolZTF2c3FvKzQqVyotIyo8UShDQk49K0lSKGJYJS1sLU0mQFVLO0U0PjZRfnQldlp9JDctd0g/XkN0WEEzWilvNjkhZGVAO0ZpVCQ1CitEIUhrWTYzKl8mOEN2ezlQLXZxY3BZdEpXZGp3ejtDP3hNcGBPdmxhbXpMTmVjZyVGLTM4YnFGVE51aD1RSGMwNmBVPnpVYE8+RXctQXBRCis3aUFkJEdONDk7dnpnc1AkcCRQNTVHUlRjVGIxLWcwbFIoV2JwVzBFbDs0Nl4kR0ZLcTcleypaOyNfd057SnEpQEMlRFVAM0xpbm9XZF4kCitLeVFfTEtTNUlGJD5vV1REdz1GfVZ6fGxeVHxMfT9SODRySGM4NFRMemthcihEMzZPMXtrQEE/M2k5fWI8UzVmSDJ+Vmt0cGghOzEkNUw2Cit7cnp1V0wkI1B4aj82P3l8WCU9NEFkQm4lKncxYTx+OylLajhnU1J9VCo2KmJJTG5RJDVpTj9iMGcjMFJrYilGc2VyPk01dTtNNVJDcnxACit5OSUoVzlENyRxbHE2ZVpVdTJ1fTFrSXczQ2Nie1VgTyR0c0R7czVyRyFSPn1JMXBBZV4ybVl0a0t0PmFIblhmTk9uQnF2JGsze0sjT0MtCis5PmFgMCl3KzxPRl90MDxaSWZQRXdwMkBYYWF3TnV3KGZHeEQhRytkWno2ayY8biZqKGZAa1ohJmthcWpEJXNUdmNnejltQnQwUz9OaTJTCit1ZlolbTkqWkJOb3Z2XyFlTCtDRncka3FBaVI5NlQlbGY0bnd4JndJRWVHZF9tQTxhSVhjbXU/VE92MUl4OUZxUVk2WTF4amp5bHA0aWJWCislbC1zS204PHFvdSErQEpBNUt3fUMkXz59YTYoel92T0Ixb1R+QEUmUSZmJE17fHtVR3J9bTUhbn10clpJSDlvaVheYHdYTz5CXnpRbEVGCit9YVM/fjdfdEdZc2JIYUBLZTl7NUJnTzdDRGY7ajAkc2V3Q2ZoTHc3NmBNZGx2IWteVHEjdjNfOGF6ZFJSUEtldmhEVTBmTT56Qnc1PWN9CitAI2I+VVleMWxNYHghMk9gIzdQelpYP1lNeWQtKnx2a0tXYmgrRHY5X2ZeeWRGKC1nbmkoQW9+NEtsK1d3WWR0eHM4QlE4fmlkJWc/OEA9CispRXU9ezstJE0wJDFfO051PVFSSEpgPV5qTVY3ISNxcHZAKHU2fjx1YGV9bDclYkM5WkleKi1uR3FRcW12YzVXQ2dpSCR5JE8kKEhlQUB2CitlaihfUUIqXlltKXhlYFJxazk+UFI5dXdfcyVNJT1ieWBAIUVWaUVzXjJIZClVaUEmUjBFRWVzc2Vyd14pb24rK3V1JEIxKFFYLVlhQHtsCitPJVhGRnpPcClFYy1WQ2RiZC1jQGcrNj9eRDwxY2hJfnRecTlgfit2TVVRbUl5I0RpWEAxZmNpU0lLUWRxRlNuczx0dygxfEY1SXJaO34/CitKNzdyaVEoRk1nWjlTRk9zPE5uYEZSUXFvYF5WZ3hAPz59dlNeJGErX1VvR0trU0EzLV4kOyZyYzZkekdjJT84Pyh1ZVp3Zk40MUBgS1F7CitEXk1BPFlHNmsoRlEmVGlzNylXXjQ2ZHdyfHpufkxKTXY/WH58N3h9Y2BwREo9X050ejxCdEUme25rdjN8QU5CNSMrb3M/ZH04dVJHaENjCitiXnZOdS1jMTlXZ3RzZEleY2leNXxpeGdyKWxUbzJxe2dBM2J7MUVmWlJ0IXNkQTtQY1FYb3slaH4wOHNxeHlqJUwyfW92N3dZbHhpdT88CitMS1V8cmxCYylTV2stYkIlQTNgSzRiZ1ckb3dAbmVAKUNeKUJFPlN5WlF2Xm4xc303cXlEPU1PRWY+QD5uYWZeSkxDeEZeSTFTO3VlWXRgCis/TyNqdG12KGQ3c3clNnpgQjU5UiY1ejNQR1ZQbGFrSjx4amVuPUtkZVNmYk8oTk4jVl5ZYHZTckdPdGk/bWNNRHk5Y15OZXh5aU17ZSNMCitaZWVrJlhRNW5TVEZKJjBEZjdUdnBgPlN5fkBVd08+QFZsdn1WdFNkV3tWNEc2eS1OMkhLbGhWN1NIZn1+PmBHfEwrRz5fYGBxKUdidWM2CitUY1pgRCs2Z0ZPZz5Mekg5fE5wTDdMPHd0ekpVJldfKHJQPyh+TDA+MFB7QjxTVDE1IX5XKGwyZFFyYTx2fDdsT0VyV2wzdClzfnlwKGlDCitnRE1XRCN1LVhfQFMrejRtXlQ2azZmWVBfIVp+JWhaWCVxSi18bENKcnlfS05YKldzdSVTcmBJYzN2SW8kK040MnNJWGJxQTw4RVZsXyZXCitNVztgenpgb3dSLTxmfWVuejE+c3MxaVNqUEojUnBvLVQpJCoqYSVpS30pTyhZOyRgO2VxRDdVYlN+KXZyVkl3Um1vfHYjSjBeNXhLc1YyCitQOXIyM2xTNnEmVVVpWkcpKFg2T2NgSiNGenRuSFhSWnF3MTh3MGZwfEU8eUN6ZzZlSj1EekREeFE/cnIqTDFZem84R0haUml0bkcpSk0tCitAKDdZQkdmUkF0UGA1SjA+ZzR0Kn5lJSNhWHROIWgqLSY2a2BfTWJmTV4pNWNXZjdrbyk+YyFpTllDNCZXTXZvaCswWEN7blo9WVF9ZkEjCitqX1N6WHN+RmYoLXg+JChPe2RhOWJZRko1MnRVY2RYeCp9VjZrcFdjMFpeNn1OWHg0a3p7LXY3Qk9IfGBJMHZBV3p5bStLR2Fze0N0M19xCitPLXAmNkMlIWQjXjcoZSFPXyFkKjF1WXRCKV54Rlc8ZlViSk9ILVhxcF4xTzx3ZVImKSQ5ZHsjY1c8O2l6eFFQM20mUFgtYCVCez8jdzwtCitoTz1ZeF85eVZee1hFfnkhejAjZ0pHSUJebEdAQ0okZG9zOyhiZHBGKGxePSQtdUJlbDs/diFgYTclb0pBQTR0ZWU+P3d0TEx2JkZQcUxqCitlZjlxN3IjSGBFVTtOYTJeN1FHJittQjU8VzNXRTIrWmljVmVvIVVleW4zeWdHU2ZEaSg3LTthMlhAK1QybG5aY0E3MUg+SG0hWkFoeFh9Cit7X3dVfWU0YjRxTS0hfjEtRmBYQ0JLYzQ7WT8kdWpXKk5maGgzZyNLPChQIyE5cDRMMX1oN0ojfVVPZjV1PkhTNlQtR3dWfiYkPEx8RyNqCitBcWlATlVmWEMzfGYjcU9WSTw5U3liT2Z+Tng1JmRhOVJgV3E0aGlZb3xBaGlTTDZ+bj1+RGJ9dFNITkB7PHk/QS1OK3xiQ3RlQUpZQytCCitEWSlvV0l6PjZsKyhAdiRuYVQ8PFByIXdKM0pLfEQ/cE5tQzZDQ1pXaFF1YWR6PW1OJmJoSUVzYV5NXkphdyU2ZE08Qkt5eUJWJGorTyFACitsNXJzKSZkYDJ5PyN+OyRaUn1BVUcqdiRYcUc7e2ZBWnwyOysmVmsyejlwMFZCcG0rbzwlVWhOVmtnc0k7fFNISkZTOF9TWkcobCRZU0JoCis4a2lxaDEya2FtOG8yT3cmUkdHWV5KJmtOZWNxSXZiKiFKQz4oYjkmSi1LKilxNGxEJkooY1R4KFFHYzN4dHh7QFo3aT9yZX1lNzR7JiR9CitoKWdTc09jVHJpO0cwSGJxPnl3SyNzZEEwfWJ7a0d4RTQ+MFA5TyM9TEgwYn1OLXdPIXshczs9JnNAT242N1k9eHREPDdvPkFOcXM3QHI8Cis1P05nZylUNjFaQG9wVzZ6P2dUOF5UQCo0VXtkRSRkOyhsLXYpbFhiM2tecm5gK2dmMUwjeTU5dENeYGtpJC12KGgwekNwaT44dDU+WDgxCitMPiR3JDY1LTF9b1dxQ0Fie1QzfklrbUtSLVkwcyEpQWZXcSUzPXc0MiYrSX15TnoxMSYtXjdVT3ZjUkZTTXJefWA3YEUwWio4MldjZHMzCitrUTZ0YklLSEslJj4oR3s5Z0hlTUgmPHYpOGIkWFR6K2thRTxQdmxPPkQrPSlDV0NKeUJVYDY8TFdZLXNlZCM5Q2Z7WDtHKTs7WUlUKGdPCittTmQmb3c3JDI2Mig+dmdII2FDMj4weEFNXm17VzZ2Z3lOaUE3MkBVJEhxJjNgalVEJEd6MFNWLTQ4JDQ7fkxCdndzMyY3PGgwYUhmIUxlCitvcTlIKyhHRHgyI3RMaURgR0VzalVjRT1OdERldl8mamlDdCZKUG1gS3I5MT44aio/YkQmTHdvPWczVEombUNPTG9jRkNeOSNGezFkR3xFCithOEZya1IyeTg1KTQpIVFYMXMqKiZXd1BrTFhYbkt8VnkwdUErV0NXbTlUJkEoOU1LTHM9T1dkMWVjUE4wSk82KDZRQlBTQzFHMTxuMU1XCitaPzs9TyF1UXJeOzgpNHRhQ0hreiFEV001QFJSZEhWVFRePil+UT5PPngrTWgxfmZYSGxSeGBaOzhAYTR6N2NLeVc/PVZ6PHJARzBoZFUpCis+QW8mIXhiVUNKc00mO209Jmp7Mk9FVX49VUg/SlE3UUktcmBiV3pfMzI/Vm4oUyR3Nj12aUVWJFZeYjtPanVFWCslKDdXQDl0cCZ3UHZPCituRyZRdCpjZGY4aGVDVnlDKDs3d19PbE5STW4lNmMqcyVYQlNnJkl2K3sjQStCOFNXZTFUSHFEakxwPE92ekItYTFTdztYI345PU9JWUMrCiszZzQkTkxEM1BlbVIrJWhla1VrK1pWbWJCQFVgWjw3Sk5GWGtfMyhzczwxbVVtZ2ZFT2lAYygkUUFGJmhhM1BLeztXLXRQVkF1O0xJdFZTCitfQmJHRFF2UF80RUtXJnxWayg8Y3RIQDxQN35pKFMxQmw8c0B5VDNibXZmMiVkLVg3P258dm00VjVOUGJRNkkkbzYpTWM8YCh1Yio/WCRpCitePCYkMmomMFZ+dG5aIyViKClIUzwlczRXNiQ4bSgpaSNtdDtRSGhhTTgqZVB8RWtyQGQ5ZHp7WXo5ZExuNmxqUHB0IW03Um8lQnBTUT9lCitCfEokPXpRUiFaN3hAJGM0NiZ8Tk4qe2U4U3grRXUqfWQxM3VIfkRNIy1qJFo1bH4xU1ZuI1Y/IypQJUgwXnhZRXYrMFB0RXE2JUtfU3tZCitYQ2c3fVYrJGs0R1l8IVh1NFUheUt3dypeUShxZGJqUSNLOD9GJDFQOCFeQjVfX0FLclNkant9YUE1NG0lX1ZmPGZhUyg4S3g1PmBOI01lCitUbERUVXBfa3lpRWNuY1R5Vz9gMXIxLW98XmJtNCZPVjxoWlN6ejdGI0ZhJiZHZSpVMS07NkVyT28xMG1sdGRAZEF0eEdSaTA1YWhlNCQhCitpKjQ7YTtjdWBkIT5WYH1wPk9IcFkyOzlTQ2F1VHIraWtkUjU1RWM0e0Jney00N19FJXRUVWxocH00SEB+bzs2Mj8pXmFWVl9DQnFnRFAoCitQXiRvNDFkOFp9LVp+dFR4UkhZP2BLbD1QV2Q0b2p0ZHUhd0JrZ3tyIX40SkFhfDE+Nn0wI3UrTj18aWgjPFdxLTZaYGZqSCFlUXJTNmQqCiteJHZNJiY3eHZAQyN1QW52cj8mUU4jWC1wOX1kcipsdVlgTWdrcmcxbmg8dkc4UXYxM2l0KGlZNj53TjA+UXI4MDUhMlNoPXpHMzU2eV9ZCit1OzxFKj9+NjRJWWNxaV9vSXdZbClzcjgmRz04UU5BTnE5K0drK0tARXQyUGxHX2A2dXdAOHxRJXQ4bzs3SitFdCslRW5oNFIpb3FYNj01CisrUmcwRE8hcmxwfVpTdUtIcihRbUomKnU1aWpQSmBKakxvKCZnYlYmTXNIXiRFNE01QkBtZjFea25CbmZmT3d5JjJARERuMzI1N0ome0owCiszPEpvJXpPSkNuWG47OHNxc2EkZlN7cHo3cjJIIzlyTSVmcSVacFkqQGJlS0RpdTlGTlYwYGlpJXJmZjFscmU9LTQ0KWU/TnxTTVBYem5xCit+V25IXyU4ejdZPjtBJHlmanZFfGkhdnlUJlZDVUNgRkFYb19IKnoyWkdHbCtjOSgtdWh8fithcUwzIVMoQklgUjcrcSo1SSp6IU9DTVd6Cit2N0BrTktuZnxTdSFlYjV9RHleUUdOUCpaPFZoREVqYTg/TS1HOUF3ZStXYExGfj41TCVnIX0mbHFFIUBnOFYyKSstaVY3LXozYV84PHBDCitqTUN3ZjwhSzdJKi1LWHBUaUMhcWlSQyZQMTVTY3QqIXo+TWV+bkUzJD8yK0B7eSNaN1hhWkU2R3lrU3ZmMEYkJloyZWlwSVpadSg3UTNGCisyaTlaTVhKJm0jdnlnJG9MWUJVOWNkSlNeQipKZ3RNP0RYMm0jR2pwQm5eczs2WnE0QW51Si04dnp8ViNKRWttQDNBLUBpYCVaUiRVMVkmCisxKSNkRzljeSQtNmM/WGcoX2xsMyhSY0BWZ0lFcDJ1ZkZSIWhrTUJfWV5mTkprc2V8NjtoYGROMGNIeG5lJTRlZEtQYTs2NkdAKHRTS2FOCit8QDtRJDNCVnJ3Pn19czR0cVl5PTh+UnNpZGpnR3N7MGpecz1Sfi1OVFdlS3pONjlyZ0AlYkNfalM1KC05TXlqfnhQd045PTE+eWtyPVJFCitSNXhSanhEdDk5MUdxKT0xSEp1K1NJLXJgcTEyUXMzb1M1Sk1VNjNRQWEmJkpfZUcrR2ZqTy1WVFRKPUtEM3gzQXVvM0UmXyM7RVZqek4hCiskZHxAZHBEK2tJVnFWJjZ0ajVOJkZOYWFVQnB3NUclNlBsPHh4bGglOFV6RElgUnZrJjJgci0meXwobyFoOHMtY0ViTWphanVMdmZPQHVMCituc3tGQ09pSC1NI0A2TVVYTT0pZ3FoZHFpWXdzPzBVRFZDXi1kPDBNZiZOaFJFcz8oSntEc3dJZmUwbDtyM1khRDdncD0zNzU+aEVtWHpjCitRQCQoPUFnZHhLKypJU3dBKUBZWjB+JHtWJGo5SmF5fT1wKT9yQ1FnO1k3T3Q9dmdFeTh1IUVVT34peF99YFQrQkRscHFpRVNNKT1rIWFsCitqXlAqblRURWJKTyM7YTx8NVd5X0d2RHE3IWZCUEtwRGN3PiheQ2Z4VjVfTDc3fn56Rn52TSheN3JoQjtuOzloPDJ4RmJmbmByVH5XcjctCit8OzBzdm5JMEAzYHglMF95KWU2eGhuRDJvQHBhflo/b0BKVzAhXl9YIXk2O3UwcEJwb3x3SzNoPTgwLWN5TW9WVT1xWTNLfE49ZExxXk5mCit5bEYoWkJWcVV7a3ZXbVpJVX1WbUA3cExsZlR6VjNzVW4pbjNaSVAkPWdpcDNNTT8oRjJRR3kjQ2dRTnNESTtCIUdEPFJjM0F9LWx1Ryp+Cis0aUtvM0k4c09DQTNreF96VVEtQ2h4SjRuWXBgKD9fbVc3MU1INUZTSll5U0VjK09ZPl83Sjs+NUp4cTRrMjN8XlE5I3xOVT41P0ZEMT4zCitKd2wtMSU7eypjRT8rZnZAZHRuYX19e3NWVjlUMCp6QyE8Wnw0QTdBU0xndE0lOSZndWd2TV5LaHNCckdYVy0oZ01BVENBfX5zc3EqXjQkCitBX2ImVCFeLW1GY1lOaDkwdUw/bDB4THhDfX40dEk4MSpURCVSbGRYSSg8Z3spI0crQiRAeCZkPipUO0s5bzJVVjJ6PTJ6fUctdEkhZnsmCishRjFsRyNoejM9TnE5SnQzT05RNHtWZ0Jxc0JKZ1JvNyZkRyZFS2wrYE0tP0xuQlRjMVo2MzI1WGFlWElkNzFfV1BCTGBlc3tyOVJgXngjCitENGRGOChSVW45QnswSU5hSVc0X0lGK0dmaVckQjdFP1RBbWZAbkNnZXJLQzJWMzJ+VWtwKjJpVT1jcVpoa3pAaSUhfkBnXzEhaUpiM1hZCitxb0FeNyY8fjMlPXlNNFV0JkgpUEBHSzt7N14qZzkmV1FlfFZnZGhNYXQtZSVRYiRLU0Mza1M+K0dtKzRSMlRiQUcwTkg1b09tSC1zR0hsCitAaG1EKG4kPyZKOFYhc0tLRWswSiswdjctXjk3OD82UXBpX0dgYWVAMyZJJFFmZUtMSksqS1NOfTR7bE1+UFg3dllLJSMzTE4hMTspI1RSCisjeGMkZzF7fEM9S3k7WDt6K280PyNJQ0Bte0d0SS1+KT0haFNZVl95WXVDeGRoUEtjK1VlSFckKEgrLWxLaWJMen5EX3kpcDFnQ05RNUVDCitAVXxwUHQ5aWdFRWgpeWtSJXw5OH5BOEhJQVZ7MUN9PExsZUN3K1Q3NCR3czc4Yn4hWlg7WCZEUTNjcT8wLTZKbkRLaTVKO2koSGFHYyo/Cit5bEM4e21fUTIkQ2NSdU5gMWQwOHlhYnEyMj5UMiFRP093cV59VGVLNXB7Ym5vI2hGWXB6e0dWMEooKUs+JDF3MEhpMGttITZ5MiZfbUl1Cit1S0UzQyZITCRTQkFPJldAKXpLUG5semM4fVdKRzdeQjFOMmg7Xk4pTjVwb2JLRGtvNGJJcH5PI3BJYnp9UTI4V3NpMG9NVHUhQk1iUSlSCitFTFghJWtnTVhZO2hxcFY9fSlXK05WVFhqMyg/dldRUz9SR0RUNzRWaUZeaFVnSzlOb30oKmJPWmJKN150eUBuV2NAWHhPdldfaDNiRklVCitxcXRLSUQ2JCMyX1U0Ni13KCtjbjtfRnkpUlViODRAOCowI2s/KyVrUGxKJipDKXJqSEBLYG1GZkQybS00UX45MCYjKlA0KGczXk4pLSQpCis5fUk0b2ttQE1YaVo3QWFlYFdFTFdGJWpTZWheZmY9X2xRUjE8TXlJe21Aa1JFK3E0KnIqLXVTWi0pVmFPfjhzQX4+cUJEaGZNeTZjP3lJCitCeF8xZiFZTmdpYSNkZjAhMHdCWWNaXipPQGx7VEQwMD1DencrMGc3JV9FPzNAVm5BSnZ8UW95ZmxjR00md2Nge254VWxudj1lK25mKm9ACitKR0U8VGRoWjlyOXcxR2xyU3Z8RThtY3ZTd1M8ZCtSKG5pXnl4UStMamZSUm1QZCo2aUxlQjE9UzRnVWtTP2piX1VBTmJNK0x2NyNQTXArCit8cFBJeGhKcnB9S3EtQFNqXkkzY2tCRSp6LTdOTmJofigoRkQ4SEg1Qng2d0JVQiM+YiRVKiVBO3ErQm9xMlhzSTdVMj0jK1Z4S01oNCtHCitAck8lRSRKVjFlbj1sIWcwM0Qzfj1YRVczdGwhI1d7QFV0aW90KURJdig1XiN4NXYwX2xtRU9heUB5RSY8MW1QUW5jM2BwRjckTyM/ViokCisqekRCMlhaKnV7bHFibEt0ZE5UbkExTDE0OT9VKDB6PDxMLWx3ST0rPSZVIW5XMGxOcy1HeSN2Sn05RDNua2V4Qm1ZVDtTK010aXZXM2JGCitfYV9kcyVxNFc7ZkpLLUVNXlhBQzVYTy1DTytzWXxWQzVpMTN9N1BBLVhLNSg1fE9NbjVeITslSW02SjRHJkcjSWV7ekhsbGhWMjhIVytjCis9VmB3Mj1ze2p7P2VmTHIzZyFRXmg9Km5LJD5KdElDNDBTP1VfOClhN2E8NUJKeHhNIWNlSlRpaTJGeTdxJGUpamY0Q1drczt1V3tBd1htCitWJV9EYVhAX2VteEpQOWYhcFhOMyR+KnVXcDNAcFduaEJZcz9CbUlIWH1LWFNDbV55JFkpUjVCTkU/QXBrZGBqS1c1d198PmNiODU5ZUFhCitkQWQ3VEFlMGs4Rz90R3lZI1Q9MG1JPkF8cj84OU1PYzkjP3NuLSF1dC1yamZWS3FSek1nT1hYJSswey1aT343QEtRMyMtXmRhMiU4PjxXCitxKm1JSDRVPDF7NFh8UnNMNWY+aH5RcncjPzBMUldZPWU4PHRLPGd2SWMqMDhaakYzQyNNbEptcH02KDRZKzZjR3Zfa256VVIra3ZvS0JuCislKTRKQ3AkaThyaGpqYCNSYypUWnZwb29BZWZAMHI3ZUBnPEpOLTQyX3BAMjV4Xld8dnpweD5QYj99Ukg4KnZXKWkheystNWM0JSgqanZBCitGKzd3TGlVKmJJYk9BP2l2dF58KT9nZWVCTF8mei1QemBpYHJnbm5AYiF8MjY7PF8oOHgwblp6T3RydE96MnBLYSRzZlpaQjN4WmFNYVp+CitgZWFGSWg2eit9TkdYRncoa0xrLSlRKn0hYE5JaVVHS0BfaTdTWEh9cCZFOHhPYG5sWXN9Sl8xYFIoUWgoPmE0YTNMNWslbExVS083YT0pCit7e0MzYldzTTtyIXxlbHZwNU5KejtvaTspd3diX0V4YEdocXF5WkNpd3lZeCsjcShFKStFMmNUXl5YQWFGP0ZCRiotPUIjZG85cD5VQk1ACitmWnFhNC1yeVVQKmNZb2oqXlQ0M2k1NDF7MH00fDJ2RkN8TE0/JXNUY3tBSXooT0gqZz8rdzM1I09QT1NeKlZWczVNWnJoMXZrTUF7NTcxCitCPldvamdrQH1EITEkYjVDP0lAOF8+JnNaVU9XJEo+ZXBZJHAmOCtQRDNGaXFwb0Y4aihGRWxIVlFUaDltanJNYGZfKl5GUWg/fXh1cVUkCit1R3FxMTM1cFY+blNDfTtUMFUtTjR5WTtmNjUmUit5RCN4MlkyPmJ7MTxffCN+YnFyUDBqUEN5YztQY2l5QVI1ayRWRDlNNTdLdDRKcFY8Cis9Rm42ayp+NGA5aj9AV3lgUTEkRXBJSlV8PzBES2gjRGVAb0Axc2sqU247VD5zSVk/PClMe25nbUxKV3JmM2pfJHE9TjBFaTBwJFo5P1V6Cis0JUNXUTJJd1hkKTVOTTJ1U0lDTE5NfFBZb153M0xXWWkySHZuUm9ZQj1HR2hONGF2I2VmS0xlRDE+O2ReZHI4Uzdpbk0pJUkpXkRKWF90CitaM30zMmJ5NDdmTEF0OFY3TXdVP09qdyZjQHhMKnZrfFJXK1N7cEYlZ2JhUGwxeylPbH01bWg5OE98VWdvMjNoPGBwN35OR2ZySVFEZ1N4Cis8X0ZrN0hBPCM3XnFHZ15pck5ackJ9fTZ6eWdNYUhOIURkXl5yWVFuKCpjcXtQQHdMfmxLWEx4Kz5ReCM/UjVZWjstPHJHU3paUkBYM3VmCitVT2IzODJRfml0YFpONnw9RHxGRnkxLXJ0USktbH0jY0EzRC1mcnp+e0k8ZW8ta1Fee2didTVMN1c8PDB6WW1rQ20layorRUgxelchIV5lCitPUjJ0RmI+KXN1eSR7dDI/LW1XX1k+MmZiKnExdHs+PEEtVHB2N30kNzc9P0d+OE9Kfn56MU43ViMhWDY0Klc/TGBmcmM2aXt6O0pmXj82Cit2NiM5P3NENF9rZlFYbyZyOCljbiYhNmRIV0xKSzcmbUwmU2M4ZnkhLV9Db1olN1IlK0FYTDtMUUZmPlE9O1g+UT15VD5RPX5iPks2MCFCCitmdFgmcXF8ZUM9MH50STw8YT5PPmBaeGhlJXRgUVdIe0t3WEBHX2tuPTY3WlZjRTw+PTBCcUduSn1FamhafjV7RmlZcmRnb2dYdlZlc0UpCitAKG9RcEhAbCV9WFgoVUNUJDc9dzlAOVF6YW9FYlktZ3FlWDstUjtnRmhidUMxTHBUWSFeSEQmcGtaUXU0PlV7eWokcy13enQ8UWg5Xz8hCitxQmJMJUA1K2ZHN1loczZjYzh6SG1AJGctUCY3b2syKmFVczI5b0YlXzt4Zk5wPmhIajdxWXt9T0hGVipDOXMzeHx4UU1yalgmMiRHV3J5CispczVTd2lINjxPMld6Y0MxJkFBQjFQLXhONUlKdHRMcHold0YhXygmUnpWK2V1cHpJTEYmQE5OUERDcFRzIzs4enwqWGd3LTw0Z31nbzApCis+TElDeXpYM2c7P2ZuKVFxX2RSVGpYQihnLWZXWkxgSU5BZ0A5YyNNUiNwdEdHfGRvUTRvNykqfExjJnRpbUpUTDVQJHY+d0dIMW0zLWomCituMHg+ZzJsVSs3IUIyQllCZHpfMHgkN2tuK3dIem0+NH1VMUN4YiRWVz8laDR9c0JOZlVsTzRmR3ZFJElGQ0g5WT0pSzxqKEFHQUEqWTA5CitTQVJ7d0VEYT5XUmA2fCpgKkg5dlhhP2NQUG10fVdwa2BeelZhTX0pUH5MPEYpNUA0fDx6WDZFPVRVNCM0d2l3M0xZUjwpPHgtTmd5Q0cjCit8SGkhPyN5bzhFcVBfMHtFP0s1X1Q/OEZTYDdEdGdkbkx2YV9WUGsoc1MzQlgzX1gpS3t7M0MkM3EhMHo0SW01Q0opNUZycF9ZX3UyMXdTCitPRTRgcDU/e1o0PzAqfDlgaWNgQHpGQWRkeThadD8jajchKF5FSFZ0MEUkOzdVITVxOT9KS3E3REgyXjgkVihvdnI8bjNXc3U5JExXP29SCitmcigxeTd5VXVjZDxSSnxSOWdHQjs8fiFVcnJVQGVYMjxiR2B3QjZDcHBUZFFTQXQ0dmFDUnkpZUs3MHZlMU1GSFY5TDlKPk5pbU5ifmlHCiswLUtBPWE2TGQ1VUN5QFdmfDljWTdDP293biV1MF9qRX09Q1V9N2I3Zn5DajdeU0kxO0FTPUszeXcxMm9nRD5MYHpMUmMjSTQqdnI7T25KCitsUGx2UG5RX31WVG4kSmw1NF43aSoxbWQ+bDVqMiZORFk4KDgweTw2QHpwKyRMK0BaIyp5MGZTaGc0eGpJNkBZKjB1byM8azlVb0RrMG9eCitCMGJsIWNgX3Zfe1I2RiYpaSVBTHRHSmo0cTZjVChSOzgrTnMpMzl1fVAoXlIlRj92RTFmP0hEMk9VZVgrVi0jN2gxXjBuU01hKnBtMWc5CitGSWUlZT8xZ0ZiXjFtTyQhZldYRmhCeikrU0R6MUFDOXJXWG91Yys8PXg0dio7Qi1OXjNsZkgyZjhKWDlIfSNacThUM0dsakc2Z1N+e0xeCit+Qnw7bGxVQFdKSWVYK3dLQUB0RTdOYiY1YCpTKzEzPF9ZeXYxVmRaUnxlZWZqdU42MlFIfGplKTUxSj52IT1IfFomMzNvcVE8KWAkMmNZCit3PWhpT3xicSp3clA3cyVyPktSaS0kY0ZFTktyVlktazVAd3YkZUgkb09uYD5xR29icUo+eVJsIWpTdUkyfEUkdGBLPTxsPG8tTEw2b0l3Cit2OzYpSyEwZXFIaV8taDl3U3V5NygtJn5vPT9FN29zMD4lb0dSe2c3dTBZSHtPVDM3fDRnOyFDLXhxT0RFaW1PeW8pKVBIZyk/fVZNWVB4Cit5UWMzSlMlWFVLYmg5ZUohKVYoQ3p4dXNmMjhSY0B+UilpMX1YRXYrSUY8ajxeQkhfVD9uTldiZmM3U29RLXRFUFIzSllhTEBaMUNAQ1YwCis/RGdJOW48XmJXa3pAa355MSpzJEo1SnZTblpLMVp9OWBvakd9ZmlLQ0xfeGtnZExCLUR+Pnk8UjVfKyRjdkdVZ1BLeHI4b1VhS1d6ekFrCitpK2lVTGpycjBwRFlZXztGMFJBYnxpYlQmVmFBMF9IWW1wQXtlODZ0NVBlX3Fla0x8MkFIVUYmUDRHc2Rpd0hZWE0mXz05R3xgZ2YzaCNWCitoVHczUUJaYUBrZCUjZ2B+JG9+NnpqKSg7dkFXLTJ4aTB4U2BGWm8kMDs+QkEqZzUrbUI8JkVRSHxhdCYzTkkrdEFjWTl6SjxFPkI4dlRCCitXY0dkPmFhRCpoNVRYUllWMlV6NzV3VkpRT3BOKUhGRiN7TTlyY2Y/Kjs5QHIocCl2VGZOc0h8ZG59SWJAU3V4MGR0RlcjJXFRWCFiOFg7CitJQkpxYG9ERztZdW9sRTc0QmRCOypRTmlgKWs5Qz4qV1VAeDR7UTN0OGs1MVVINXF9XzlPdEJFQ0VCaVExITB9eTwwUXF8SCl3TU9pWGdMCis/Rjc2Wj07YVpVcC16V3hLQTNiOU1+MHJ3OVQrbF5RJFdwbWtuKWhFIXhmZ3VyTiQqX2VCJSNqNnZlNF9YXnRaRHhSa2MzOD5SPlNRKzQkCitGV3FSbmVRWUZgbzRIPkJDaV5wOU5iPkJiKVQlaVohbFR1cSZsNVB+OCtVO01GUkBnQSVKSG18VSN7b0M+NEBmaEtIKWpIK1o0WDN8JWB4CitBNHtQMjleZTdGR20yMkQkdmBzKyFAS0F6I359Z3ZVYm4hKTIrTGVxZTN2UVNzci1iQnYlTCVMbWxFXzM9S3heOUJqX2pVTyMzKUBqdXdLCit0Ml90PyEmO257N0lmaFM4e0lwPTV+Pmo2aENHemVnJT48UUVmYXk1MHg9aGU4NHljRzQyaHchS3V7WX5NdlBpY1YrbWImIUJvcStLb0NRCitzWih9TWtXNWs1fDc2PTRZQj9rTVA1WD0/eVRjNmZiUFQzTTgqZDhtI2BaZVJYTWxMUTYjbiVfRzljSEZ5WWs3PT5aQUNoUSRWT1JQdWh2CitJRUFma2x9aUVIYUVkIXVqSDsrTz9qaz1HbkJLJiNAKGRiOVFAb2BrNSRubSVAZllmbyFaVk44Mjw8cn1NSnYlXmpsMTZCQjtoPX5PVih5CitxbX02NXU3UThqJTRydkBrU1RWP3VHKVdWQkJzaThvd0hVRUE2Yzd7c31lV3cyaVJVaSk3d19aKzRxOV9kJk1GQzZubG1xJFUxNEBVJTBsCis8UEZXeitxejItdklAfkpDYmJod3F3eD83fGZ9aTApPT1xKHMkTiRLNEYyY3l2PyN7MEdvVTVYbnNgWGUjdlNyVWVnRE1Uc0o7QnU7dyVGCiswSnFhTG9MbUQ0TVJpRXtOQm1xXnpnY1J9Mn4zJWBjdHZJeyt+SjdtKDt2dUBnO2xzTmckV29TUzZKRFlfVXVkPCRFTXFpNU0yITlAbTE+CitvbHRoSVNOTEdKa3A4Q0hKcCllZyZhMkBCUkJAKSgzeWNTfEFrc0E+S0hqPSN3bEFLK1gwRWwkdT9BVilObzF9PVo7QjB2bDxRI0R3USNCCitrSTl5M142TDdnIyU/ZzY0e3g+IWJXLWlgYitnXl8/d3RaV250S1V4Uzh2THV8YyE3diFPUU40LXRrVVNkMWRwNVI/THRVM2VFRncrPGJ0Cis2JHxDPShHSWJUaXdRMnk2fVVCS3MhR0Y1UmI7dUBQdno9TUBia1A7TU5wTDFwRF9LNkpuXzBXZU1DPiNqVWUpQE00NXo7OFpfNmM9MnwtCitoQUZ+a2o2e0wyTU5jREFfLWtNVjU0YTA7fH5lTmVQUkp6eEtPZVNqRmN1RV59JVVpcUNLUiMyODJmdzwyREtDM1lWeWA5MX5sZmpBU0duCistM2NYaDtlYnQpa1VxWVZzUTxDaVBTb05VOEFGJXNSdFViJkJQeElvVF98N0gydSQrM18meTRUVFlmOEtOcE0oRjYjbXJrbHMqRE9BSTtECit4P1NBLTZuWHs9cmVMWDRKOGI/VmotRSlCVj1HZClJJEpLUClmRFpgTmtFS0RaaUpGRkpoXlQpQnJ7dmM7NEF4fHF1fmtXb0ArPlJ+OHVICis2UTBVX2N3aDJROGRVS04rP0VSX2NOI2B0PnlmfENseCRwSGI1WE9vUHJFaWYhVWsrSzVaKSt1UDdLYW0xR25zaFo+P2M+Y2h3MzUoOzE5CitzRkJybGFzcnN7JilvI018cnxFK1gmfiMkZW1WM3FsbmZ2OEMwQjUhYiReayRIeFUrUWotSzM+WHJoUEojY0tBZm1Iayp1bjw+RTxYdH4wCitpNSloWTNfR2g0SCs1dm9makVCbilrYWk8d2smaWNjdWtnJHhwPz1WRXRZOCo5YE5lYDFsSz94YEk9YigmJnB6PnIqREBLdjJnfmtLSipACisoZDliRnJJSjEhZVA0PkNIOFpmNiFhKj90ZWQmeDdRMSY/Qz9uTF44JT51bWVrcVY9WiRqY3g+JW80e1NzZHlPPj98WTxWSCU8WT5EWj5tCiteaD9EXiV4dkJMYjg/WUdJWFdDPCspYjU0JjtEOU88QUhQOT5BciZ0VyZLT0tMMzxuSEhOS2gwWSQ4N0BXKWdmIzQ+N0BXSlRxdjhoZUZtCitHdkNIalU8MXorS2JHbFV+Rmg3bDFYcHJ5JjgofTs4cmd5M21VKi1ONFhgNG5eYjZzZFRsYVMrZjl6KTt7OHErQyU4Y3M0YyZBX21pdy1JCis0VDIoeG5pXzVPQks1YzgoV00oeHJLcjwtWXsxQ2pLa0lGMHQ+RDxTS1pQTFFlM0NTQipJVWdDMUMpTld6TS1eaCF0dzM9d15UQz1IdkdICit0XjBHMndYLVh0X3xaLVRQaVErZyN1MUNJdjktZE5TeU1YNlhzQWJZRHxzdTw5UWYpM1VAKUs5an1BZEw1cEt+VmV3TTw9RVI9d1dZSCZtCitpMkBtR15ic0Q3SD8yX0d6JlI2bTlIMDV2UGU0Xm45ZzJuI3FGRmpMI25tQk1UVFloZk99U0FVaD9RK1opbGwjWXh8M3N2IzVsKFFoKzh7CiskTlgtfDFDYFZ5dDFuMVp4UWpKbk9ifnZ5d2h+NDFiRz08YD5TdD52d0lkO2dVM09pMFNWV2YhMU9jQGhqKEsoX1JPcFJrQz9gaklrI20rCiteUUF8TH1Id288WW5vMiFubWQhQEVAMFJfN0RITkI+fENCfENFVDZgLTshNEpOYnFUeHs1eFl2X3ptTVBzUGduUzloMXVXOHNLVHdDKjJ4Cis7fEkqLSomUXBuUnhRYllQQUVhR0cqPDMlO2IzJUNBQTtVQHpUZjJMJDs+T0E4VCVvN2ppc0FRXjtTI0IlMmhtUXFNNDNXJU4pXnJ7MVY8CisheDVQYXh3THB1eWpJI2I5QE1zcFlmaV9ePnt5SkhMPngmRklBbTAoS2dyQFNvLUl5a2RlTzkjNnFAcjZLQmImWHo/PDRFMSh1QV48aHFHCit6JWl3MUk3SWZ0a1B6MVVAc1JyTGhBJlZJc1B7S1pgPD1LbmAoZ3dZblFHUEBXe0pUZzk1YGxBK20xYkMybS04Z1FpdmpAbilheU5VVDlGCispSWNAVTFXI3dgS1ZzTWF9LTYhODVyKTQ+V0AwSno7bjxRanpJKGBndm0tcTh5WEBgRTVYQVRqPSR1bDhfdTlsVzFTT313T0NnNVo9VlY8CitsSHBARWt3MkpzKkd4ditsb1BDNndwcEohbCUlOHU9O3ZKcmdkZm5fJlBPe3s/RHcwR0RpQVhIWl80byM+Q3NiNkdRWUFgKXRGPWpaRDR2Cit9aF45YFo8PG1qUig8PHt7ZDQ0Png5KHNVUXdGRWFhQXg0VG8/KGI9PExuLXJAfSMjM0JXZFElOG1iI3NsYWBnVioyfms2czgyZDFoMEJsCitKYXlBIVVWPT9TZEVsZ2IxYWMkOHNpOTQtLXZAa25CV1Q4SHNvKDEyZTNaMj8xPm4/eU9yN2RYZ1VzeExtbyVndDRMOyVaKjQwRikzTCFJCitBZiF9JSpyYzhpTH00cjchaUNhbk9DeTNoUHVlSUx1UlIyVzZoYlkmcnM4dTZVQVNQKmxTWTd8ZzUkWCgtMW57IV55PTc1QWBUZFEzYCFjCisoPCl0T1N4WitNSFFRT18jfEstRE43RXlaVGtpXktAQ0xzYGVVcXoxa016QFF5ZWE1S2o5VilgfSFaMTl5MmQlY35SeHN7Jlo0Wjk8P2dpCislbns3cm1YWCh6c0l8Mk9lVEM1NXtkTkt3JUpBUyo2dT8+Zkg3aXQ5TiRAJT5WfVlXX2ZgI25XciUkQC0kJiZodUo2WnZPMTdIJDRkPC07CitlfjghNGx+Vkx0TSg8U3pvTGkxMGZ6anZzbVpudkV+SGpfcHopRlM/XnZzU1IqJXozJDlXPWY8PjRUWng+OWJ2NEc9WCFeT1ohJDlkJiRTCis/bjgpLSlHcHUxcz9sNDtMZzQqWj11RGR5QWdyS3c/VDxzZWo5V09ndCFUTUY1dlBpc0xjVzI/ISREbGRXWW1vXiR2YjEqbkAkSU1XaClsCisjZTl9RCN8ZX4xUD1yKHpAVn5hWmkpQTlMKWlvPTM3b0Nnc0lYZ0lANTtCOTx1MXt2Smp3UW5QQ0MjMF51TmhzdjZOenRETHpGOXFXWilnCitBZy1QKCR2OHRUKEZvJld6ZilzVyhSPnp1QCpvdlVKND1uT1hOSzEtRDRebTdVYV4zPm0tYGNeWUtvLWRecGAqMnNwd0tKYDMrelo3czB0CitDaDBJQGhKQUB3ZyNLQ0pQUUw0Sy0+Y1YtTUQ4QUV0SWFPVms9MV9KNUomV01UUCUzckk5MG9zaGFwK0pZQ0lFd1VyWD49JDNHXn5yWF5pCitzM2k3ellCNWt3UiE9Q3lZRFA/d0J1LSNuejVQdGlaZnpDMUhIe0l+UTwxe2s0V2NxdmF2Nmh1fUtzcytwZHtMQDFAaztNTjRmQm5yYzhBCit7MjBMI2xsYzR2QlhkLWtheGFDMDteSmtnRVhaQ1IqNklVWFJ3Tz9DTFImbmFXO2xwNTdycCV2c0Fua2ZxQThDXkdIdXMoQ3xSZyEzYThHCit2VWdyX1ooUChDKF8wO0d4bTspazIkbCU4OzRPXmBqXnxsTkJmQzEweUVlRGltRzN4JD5LNXhvIWY4WT5tR3ImPEJKbTA7MjlPYUxLPkl0CitXSklDZ1NJWilgJl87anF6M1VeRikjMT1lWUZ4Z1JLMGwpR2h4KXx0Pz1pLVc9aWxFUWdSdjBxa1YoS1Y7NU45QEtGd0VaMikmWmlLblNkCitZcnotQCE0Jk5eakQhfjI+SXtqO3lYbFhHPXNwNk0rS0x7Y0BGYGU8KF9WISNqcCpZSVFDeG96Oz1ONHU9KHF1cCVEJD1vUE9GVkVzKT8yCitjY2FXaVRKQ1B9UUV0OShqKnFKbj5KUG1HPnp+VWJjZE8+JWFtZ3I8czhEZzg1ZWgjSkckI3o/PDwzIUhLKXJWeT5uMGhebnQmaVVXNnVfCislLWBga3V7NmZYQTNYeypXd24wVTgrc193JjdNekFAOzBtSHFxdk5EazZAYj9mVGtLdFA3VzZPQjxoeSk8JVNvMSlZd0dOOG15V2RuNFE9CislKy14X2xTWWk3b2trUyFmM3s/SXZsSVN+bmZKezFHKm17WnZkQnJ4STh+T3gtV1IwIVRTNEA2UkU4V3txYF9zQkwoNVFkSytUTTI5antKCitoKXxaekRLKX5iPXBlWHBVLTYzdSNYWnE0VGp5VnZRJTN8Py1YPkA8WjhSPENhJFpXcTRIQnRIX1cmVVRCc3RiPU48NVhQKzxHMlMwQl5qCityPyZrK0Y0SG0mZ1N4MWxydEdmPGcpWTZ2cnppakVTIWMmY2ZSeXNNMH1hcHtaNjhKJCVqVFA+NUh3I0xNWVBnfjs8QmVPbmpPKyEhSHt2CisyPVpXWSUrPUsta1UjQXtnUWo1ZlI+T0FKZH50TkohMSh2ej9kI0dCK1RCXjFVTXI4OztvbTk4TX1JIXQoPjFLdnI8MURvZjAmQG9FQndFCitqKysmNE88Rz4hVVpPNCZXZ3FlPTlJLVRBK1lzKjFxQChMcEkxUTdgRjBVP2d1VjtEbm5+IXcxPi1XPjVLaj9nWXllQ29ibTBOPiE1Tn1XCitINm95c1ZEIzFHKVVFXzw7USs1YGsmWH5xNkVeOURwZ31WWVEtJj5rS3h0Mk45a2wlZlB+RW5WTXNSa3s0NDQoTlMjNEA1Z3BESGtILWFUCitpWDcpRCgrYWomMms5KnlgbWdwSTExdWtQZWpOTTFaYGAlV3FWNFVBP29EdmpDeklYJi16Y0o3RFJxfT5tKzBkaGFRPURuPHNkOHxpbDtOCitpMUQpZ1MpMXZfYzUhXkBPKCpgLUYlSEpGJCZ4S3U1UUgyVVY+ODZyTUMwa2M3KT09ZHBTeEZ8N1hPa35WUmRmMkJ6KDdEdXY1bUBsJnFOCitaKjBZI01IKCpVKkl6JW8wMUNHTiF5aUc4cWgre25vOFU/e0ZmSDA1JTwhUG8pbUtzOE53NDBiRHB4TzhwN3xnajJMNlFWUjI5QmF3aiVCCisha0pnMXdsaF5pKmFacjlCflZBKnR+QDJaJTJrWTctNDVJVlZ8cTg/MXNWQ3M4QXczWH5ybEs0MUAmQUg9Qm43UEc+WDMhMHk3Xkk0NUs9Cit6bnZgNnZ6RH4xKVElZFlxXjVeNHF1OHopNFRnKj00KjNjd24qTk1WTyhPPUVuSFNNRFA9fW0hSmhFWi1QQW1xNExRbDhBI0BgPXlBJHgpCitiYWI7XikpQSpKREJHe0YpbWR1RDskJSkxT2Y5MEBpbWlXfm5EQzFteittZkM7alRrR0lHP2k7SlNOXjh9QG5hdz5WNDVpS2VURk9+RDN8Cit2cW1WaCZPMihaal5Idl5RKmB4QXpWVHdJRFV4fEtnOUl2bXlFenlUcX1yQHwqZE03WHBfQUZ8RyFuLW45VUk5cVZlVjdlREVXSGBPQEhECitOZzRtIU9LdyU/TWJ4SW8qdDRDX0EpNjI0Z3xiJm5Kd2FELSNrPEh6U1peVitVYXcmUX5kN00ofGFOZkR3Rl5CNGgrenI1RnBZIzhyd2hXCitCNGtDVjJndm9mSi00R3VGMz9PMWFAZiEtLSMxJGwjekVTKDFeVEMwajYtNTs9Y3V+Q2pPT1JlM3YzKnhWVEZaT0FQSyg7OEgqPzU1a2RJCitvTGdWSktQTHA9ckp3PiRzMjA1UTlXMW1jP295IUlEM3c8dVBfZXZhNWVhemlNUX16VmhCcm92IWhxQz0wKmg7e09VQjQrdClkVzNJaHV8CitgZTFqJCthUHRCdzRpUihuMHg3fCk8YUx5e2xHbmtheV8tUCRpSHZqdkY+O1pTNG5zUylHU2JtaWxPTHdgSD54SjFufCVPI1BFJj8xUXI8Cit1cjI/RjAwbHlLbDlwK3IwQ2hiSGh7TEshPDA/aFRTcSgwREpSJW1zPChmKGE9VFAyc3k/TGUxY1RJPVU1Kz4tKHdCUShHNyZuY3Q2JnI2CitSVyZ0KSFHZjM8MHFjXiM+OW02WkxgSWlLcFp0eC12SURBfkAmOTZUUWZkaFo+TjE8eF8lTlI/dnUwQkNuajx1PTJ7V1czLUp0Vmg5RU9hCiszZCstK296P0ZYUE4jRCQqX3tKRnxVcVVoSkxmayFmM2JJKTR2amdtRWx+I2IwNU09VXhyanpMSjJPI2QhfTsrYXxvV3tedj55dztoYihUCitNXyE2akcmMUVGZ15XOGlmVD5WZU13IXVtI1puQjA9PlorV0JFYEIwJCl5PHMke3gqKHpgUU5PZVUmRzwoOXJUQW0hTSkzVD4tJjJ6Yjh9Cis7SjY9LSlHbj4+PT4zR2U3dSUmaGNsPDw5c0NFQmdnVXlrRiQ+Q3NAc0lzIXFDZmp9eUdBeWReYiZRX30wZ2JgJTJpVUxDMDUrLWFqUHRGCis7KGFEbU4tZ2NnQTR3X21eb2hCM0JZV2diaSF3ZSFNbmsofn1adjlMQzMjT0kyeEh7RW87ek0xcVh2Yn5DcHszT2VxNUNxMStJSnA4TmZqCitTYn1FSD5AdUNuNXFaOTlYaVo9aSFqMVB7Q0l+MzxjdWFpe051U2Z7Rn53ZkRufGpGazxrUEE1TCVkI3RmIzxGIWMjZSZ1QiNxcmFPUXVmCis+VzklR0RqNiRaY3Q7dyRqN1pQNGpwJmRpPjtjZlZeWDtkaVZaWGN7SUZ0Y0tTflFPSSVIIzshMGo5e29ObDI5MWZgSCMkWThvYDk/QmFjCitNWWJ3Z1dLcGErV2NaYzxeb2chOWdFYHVkeHAyJHtsLVVPbmMkKHJjc3ohKU1zMkp4dkp9OXBFMTYjTmxSPkEzblZgVE40S084IVF0eD5fCitMKndgKjZ2U0MmTjQjfnI8KUN3VzhLfl5AMylgPWBmezBSbXE+amFqNGgyVnkpR0ZDJVc0eGpGJE9+bUBIczZAY2xBbkNoMGMpPVpVa0hXCitGVHBlI0d9ZGdwcjMtK0lOVjlVXlY9OD9YWXIwdnhoYj0wVE5+VnQpcU5xMk9iZmhfUzZKTHdCZnojMCZ8Xz1+RHp8SiZPYnduTlQlbEZjCislPXJlXn4wOUNjcTJgTG5hUHgoYGgpaDVmRUh4Jm4wKEZZUkBAZ1dTKkJxYVByZ0NNcVQ7R01kQTJeUmY0fTdjamZPQ0FHRTtTKjlpS1dRCitZNHo8PzxVY1JoRitgbzVJVG53R2UkYXg2QUAhWVN7ZnNxIS0rcygjb0AkTXBnSWd2aDNjPzc0fWNDeE95RXZWWH5SRzQyZXBWVj1MfW5UCitmYkVPTkx4d0Zweik9R21GPkspaFYpX30lTnFQaHBEPUI3I24wY0JrUFV0Jmx1dmxZYiFmZmE/e3lkeHUzXiY1SCQtQWl9TlBEP3JkNHpiCit5aDcyYzt4aEFuPExsUGAySCZHJlplVnlCPUVCYDNsPnZITWZ1S2NXdmI7Kis7MjV1fTZ2QFhHZSVyMyhtU2xNTSRNJG8xdDNKQX1KRmd4CitMJVVeUlM2bFAwaTtGSzw9QWckLTRrJktnNU0hb0Y0cCRhc1dvJD93KCFZYE1ofkFjVWlmO0ViXkVqN2FmUz5wbzY/JH5kSlgqYiZaP09XCitTKWdkWk9JS2QyR0gyRiteNU5nOy1fdVo1KUIpMmsmTUFVVktKMlMyUGYpWWNDPVJGWU96MUdsQkl4SDN9dVpMb287OWwyYnBhdUZqZ1d5CitnQjx2ZlVOPjk5NEozIUheayRTUlY9OEhuUjVZTGMla0lgX2ElWlo3U1N3ZTZnPyRLV3hTN0VtUlhFNTA7RmA2YmpwaWMqOXVDWEtwKDs5CitSdFJ6M2N0OGx0SkQ0enZ2UH1YNld5YER9by1rWTE7WDJzTGc5eFZ6YU8+TH5XTWkpKWwtOG0rX0R4P0RAK0M7cW4qYmc4KFhASVMwKldiCit6SGNxNVlRfW5NWmI2UE1AdDlsWjEpdj49dDtsJjFzbFBaK2hLfU82Kkw1XlRWQFJBPjx6fCZvMnpLXzJvdXJXcnNjMkdLUXo/QEt8dzspCitqPiNEWUwlRFc5bW92dEgjKmZeZzZmaGJyWXd3dXl0dGF9Tz1ITlBJV1olPD8maXl+b0orTDdhUlcwWGNCcWFVaGAhN3RGZzlzJFBuPkEhCitDQmApQmJxQjxVa3E4Tzk1UUNQI1NZXkV4LTNTMGJGRHg8RyR1V28rRS1xPnZXOX0qNnZ+PzxpSlY4YXx2QklWRFZgYEVaYyopZyRZeWVBCitmSX18cSpAPVgzbmhZfG0wXl9sRUUqYkA/PjhBJGRKeVRyYzw7JWlTcTRPRTkhZHNHSlRpK1Q/MVE2TyZEdUhhRWxKME8/TEZWMyEjd1lPCitBRFd9I1pTbUc4Sn43VEJZantSKiZmSitXKmdVMj5Maks5WV4yQG5JKD5GUk0jN0ozUnZXcH53WE9tSDRIby1DPDchRDg7SzhRMEw1PWxxCitIVlNVVDUqK0tmYFlxdk90S1pzK1kzNGBoUSQ4MHRTcCtJT25rak5We1l+Y1h5QDdAYHVkTSZoYDtwRjt6dk9TUTRyb3FVRGhEVTFNJE57Cit9LUhtOCVvNVF3fXhIbHZYODhDO0MwTGhVa2I/Y3ZyX3BVZTVmSVR9SW1EWnsoYytPQ0RwPUJvRypBOW0yUyZSaUN1YHlyenxRNGJsQVdGCitpaUtjJko9UXQoJUJGSGl0XnU/aCpJSmR4Mn5AXmlhcVBWKHtePUlSelU5PHoqfHQ+MEF7P3MpQ1hjSlZYK2ZMYV54LTBMfnZjN34pTCpJCit5TylKfDFXfS03UjI3WSY+TH52bis4Sk9zPGR1RlVkI0s0KjhSYjJONU54UmM0VDIqJWVUdEZvfS0qRlJDYmltNSg3SX09JThpOSFoPz54CitDR2t0THt0fXFBST4rVXo4KnlsaFlgTDJfVnomcFV5eihSME5UI21mQm5vcE42M1cmZTtCbUFZZHk8V3d5PlRXNGd9Z09FRz85fmFsZ0ReCitMVHAqa3xHVjFWX2szT0l7WnV0WCo2VEVlUCVTUnE/VDVqZG5RO3BFdis4czhkZWFud3NvV28kZldpeUsmTzF6fm5FMUlRc25+RitpZlF3Cis0ZENfUmx0Pz0wU20kMSNsZi10ejZZMEhTczQlKztKdz9ENjFaYis/JnRZO2F4VkhXeXQkUDRlNVhYNStZWnJWQGlLNHh8RXtSb29zVlM3CitSVz12fCYyTSpWTkdvPnZRakJMX1ZgaTU9clI3MTExTi1OWS1iJEVZQVRhWUJNKlYmRFo1ODFYPyZTVG1IPExlQ0NnakFUOUU8R3EqLUVLCitSWTlEPG5YaWJjP2ZLYnEhcSYhSHQ+cn5qbHJkYkZFVWFHWE5TS1RqT0AhVntGcDI1Rk1Oc1A1e0ZkLVk7cz5qMExfZmU3a2t2dTA2V2VZCitPelRzezFBTEk8aSEre1AzY29ueGlTZjhHVWtkOVo7cjdlVGo9O0tpfDkkVkNHVWs7Mzc7b2NVYEJiVG5BazwmWT9mcyRtVXNhakBaTkgqCitfe2B+b35yV3lyYD5KSWUjZlgoXyV5LSVKM0hmWlJ+QkxFJCtWTi1WUzFoNyN2MytBe3whTng3ITF6P2l+VytLWjlIZj4+anp8TEQzd0w3CitjWjcoUyk0Xk0tQ2pXdUxUTzBLdlgqPkU/aHZaUmpTJV5SdT9VRyolYV9nYzBte09aVktzPUtUZ1hONHhWdUl8ZWhyJT1tJHFgS1gwcUtJCitVZnAoQyp4ZkE5JFgoPDdjdl42cyNSVGIzMDRIK1ZPaXZaT3EkNkxpTCZQIWBSUXdfK2lmSFg4ZnEjY0txaFZ2bCYwZyFUZm0obzdIazFACis0X3JuJklWLXBmbS1NZnpVd14qX3hne3o7RGd6dVUmSGh0MX56UEFMJT0zMll5I01NM3F5VT13IVNJcW4re3NvMEk7QD1EY1lFaFRHJEElCit3JXNZKG9sYVpXNnRIOzxvNDJyRlMwdU5pQG5BbGtYPFNmKk4jZnZVUXh9JjklT3VwYHF7d0VvJF42VlRRYDAjR2lmd2tAcEx0NnhsWGNhCitEPlIqQ3dFe217ZTUlckctOCE4XyRFQEYqYUZFMCZyLSoyYXtrTGU1ZDFHVnlOYVA9NDlsZCVUeCVsYzBQQTVHNjR7Kl49dyRCayRWaVBrCis0RDtlT0lAcmRhPUJweSVoIU1DbV5hYlQrN188d24yT2JXQHhTaExFVVE8WlJpaWgwZDB+VElfODNzfEMtTnoqX1dkOExXbFJtY207NlkmCitvbjIoM1Y4flc4Nlo9NDBSPjY3RU4xNVl2SHR8R35DWmVRKWpaKnhyWjwqKyNWRXVrcWlyOztEdHFlMnJyd2U9aXxBNj89UGQodyl7UVYyCitkKCVpO0JVWTBMOXx9I2krREQjI1lUQzIraEFBOHw3TCZJezRuVGJ4JUc7IU1zIUg4TXRNYjJCZlJwYjVuZFVvNWdzd0E1SSN3JTVndVd3Cis1Z3k1PzVneV5GNWd6JWQ1Z3JrIzVnc1dpbHhFU3BsJHd1UCZGQ0x1Yl9+SCNRdjViX1hsZkI/TnpeWVVuOVM7VnA3b3VYUkBoWUUzPjxWCitXWUQzYThRRTVYRGUjSDJaaXl0JDc/QlhYRDNtJWR3UzI1X2oxVjxELWh7RGYjbEJTWXU7KiNsNFArYzwzeGw2TiZtdzl9e002XnNVdnQoCis5SGl+aSRgcmJPKXhsV0JqVHd5SlpfIXJnflQ7VnklO3RUfmtXUzdEV0l0c2VXO1V1ezFHc2pGfWAmMih0LUMtdEV3UVB4RGY1N3gxRlBmCishR1l5PE4yWGs3cHw/aWNQWEFmM0tCVl80alozaGUwMjlpRWVaLUlGemZaUDR6RjA+ZHxSd2tVXjBJSjVTczNHS2BXaSslSUVDbGVETlhhCis1Uj1kWjh9U0JWbj03U3M5b0F3O2kyZTYtSU9qVyt5O1plKmVrWCpac3dLNElMKnJXdW1nN3BZc0RmfXpKSXJmWl85V1cjZ1VxeitnZEViCislUSN3UGA4RnVrZjRnXihePlEjJWp6ejZqPk9UI312JEolbEFeb1FYPjBFbWkjXjI+NWl9QzEmdylwflBIKHkkNCQwcGFnI1ZMZig2NkBJCithR315RTVJeU9URV9FfT9rWFghU19zJV9HPiQxMVM5dXNlMyFqPWk+SHJ8c0JoRTNqKm9iIUAmSlRXYG40K3ArQy1ZYFExNSt8d0tHaVMxCitURnJzSFhuVWt+UTxmaCE5WXckPT9jTGQkRkNDZndydHt7N0ZPUmpiM31CPC1HYXRRRTE1NEBOZHg9JjhaaktgU09eJDRNcHZKK2FZcG0hCitDVDVWWlQyKE81KFJ2VDRYeH1UP0JxUnJiVmpLdnR0QilFMmwtO3JFTE4rR1dOaHM/OXcpWTcmdj1Tcmdwej0wKWFmWWsjPWRES3JsQTVrCit2OFd4ZnZ2PnNhaGE8TWo/c2oxWWM2QEVGM0FWQVJfemRialVSTiRnaHROMHJkJVFBczxmSU5QUCt6OEJSbDZxQXhFNzlyalgtdG1tRnkxCis/OHIhSXtNPDFCWVEja0ZCYjB+MiZnVnpRY1IxYGB3TWptaVNeSWtoYj5sUTA3UEowIUZ5STVnZDBaUVZxQSFoZy0zOWtyLU4zbkhsWGp9CisqKUtiVyUpMlV3cnJHQ3x0YGdLT3k9QDZ3SWVvKSQ+Y2FNOGBITVhsSy1KYWhPcnwqY3JjaWghRz1IKnFtVj9DN2VYJUB3e2FLa2ElO3hnCitGJW9fUEl+ZWQle154KmVhflomd35NSWdkSUBXbTJkO3VDWk90TylKTn1DeSFOZT0haGgjYWBoZ29FNUtBJjtNI3d4NW9oV0w8NUk/QGpHCitNSXgpNF50UCkhYTU2c3MzYDExQWBwNiRlfT9GVUY2NmhNPW8rfmtZZzcpRzAySUZvRXFmUk1WPWV2eHI+fGBxJiowKF99IWt9b3s0RFFmCis4Vj1UV3wjNXE8TDc7aGAyUEs4U3koRV97cUs3SHk1eFBGWGVyPkowZSg+YVN9WldiN0U9YSFgN3pMVTJ9VFgqVmkobmJhU1BEejlNenluCisrZSlfOCQ3YyNNWjZINGNjQGJhYWQ4V1ZjYipfJmklMyVHR1N6aEooZ00zOT9LS3ZgWEA+ZyoxPipGNTc4I2FFZT4ra3JWREEyT2A+I3ZYCitRLU1oRVg8NWhCN3dYRUR+KSMkX1AkR3l1KEo+ezxVRSs2LTxkJiNjMTMkfTVnJEVOcnVEZFRQTkBSMklvN1gwaHxPPENeMGB9VyhMbzExCitUTE0mRCVsYGRlK2ZlKX1kVUhgUmFNeXVTYWRze1gkSTI+WDUyV1M5bTsoUiZ0QCFSeEZqe3UxUTdXVmUzIXNmaEZEPz8+Tk5vIUtpZ0w7CitrK0hvKlE0PmhWZnAlREQ9PyQjbmteQlApaD5ANmFXQUsybXRleTdEb2tjOUlYRkQwMDNqazBSU1RhMDAzfWxhNCVuV1dvfjN8YXhaOWZaCitFUTdjWDx7I0ViWnUta2FBOShEV3BYWlhkRl8yYGNpVDkhO1A/Q3JqJmYhci0/NVpPX3E/KzAtZ1JDKklYQUQ5Y3BrZ0hJYXlrU1dSNTlQCitPO1QzV2VmcXl8UlJKTEpCdGNucm9XOEEtNkg2cGUwMUFhZFJpVWFkRk48YUw+Qz0yJnVTQHBuUTxOQE9NT2pEalN5ZzF+bnRrSEc1MkdaCisjT3NsbFc1MkpPUyZXZVA2JUY+I1phYVBAI0JaeVZIbnRyLXVjflg/cUQqWV9zWXx7R3QofntOa0VRX25eJks+YyUtbVZ6QHFNQjEjSHFCCitTLXh+ZllTRk80XkthbCFLUkNzdndPcGZFZElyJis+RShUfVA2WCFffGF1OXooUkl4YTc0NWJIWFhWYCFldWlvQn1oeXEzP0stP0JpcGlmCis4UVVkMGZVYkt0Z3BHI25taUx8R3J3V14za2hlMUZkKX52Uk44dSZvajFVOXFgWHRvVFR9cHVoPVkhPnNTXiNqN3NnZHVNIzJpMVNqQXlkCitlMnNJUytWRHpYS1lvfD9CPzszKGRoaHJ0QyFpIXlrPzZzI3d6Y01HX1R0fUVhVW9vblZxb0R3WGNqMVprK3NrVURZcCZsQko5TXhVUzNlCiszPCQ2UyljUmglaiNvWmwmK3B2MWxkeVMyIXk2flg+YDxrWnFZPVlqcXItXmhLK0F5WHFjPXMpNCh+K0dyQF9QRFBGfXh+VHxZVzAqWC1hCitpNiZzQzQ/K3x6dE0/a1h4QX1ZI2dvQFEqNHI1N3dKJmk+NzJOWWl4ekM4KUwwaCRffSsoVUNeRCgqPihmO1AoXiRkI3Q9V3BjKlR2ZlpkCis/PjtRaVU1citkeik5N2Y0dGYjPWFgcyRpclV5IT4qWVYobXA0RkF4QVAzbUM1QkcpTFM0RDtOeiRYRTBpQzE5cDVQWkB6Vik0dFUqcGskCitnKG50Tl98QyU5aTwhPWooaWl0M2l5RTkhQWYyTDYoZT5DeUgxMkwxM1JnPCF0bG0oLT5oS0AoTVZKIXdBYDBDN3dKPlhTR3JmS1hWfChTCitUMih7UkhPTGBCLXolUjB1TnRTVzF+OEwocz1+QG8+dFkyamhvdHNvT01yTWhfUmdMb21NfD5pJHs/aGRKNzJmV21hZjxiKmxDS0JoK3NtCitYcUNqUVZVTVFhczhUMXEhOUw2JHBBVXRTXyE0ZkhKSEZ5ZXFudClSRnJiNSZfIUUmVUdKKjlCSF8/YiM1Xik5QyQpYUsmamFObGdyRHhmCis7PkhSWCFWMitrN0lpTG9TSFFaP0BKPFpiXmhFbE8/JmVzYFZQVkZ7JClPPyNfXiVNRWF2RXE8NyZGWjVVdXUoSkwhb2NNUkozSzZfMXV2CisrfnNOYEJMdFl7TElhZip5RGtDQHl6cVJseldWYkZ4MGg/T04hVXxQe0tTO0liMUI4RFh4TGYxcyNPKU89eDhnUFlgTVYyOHV0PE09dkVuCis8K1cpYU5rQDZqPklYd1JGSElrfG9tITgzWnoxamVBNWg9O2F5b2JwfF9II1MjRWc3VkVgJVF5K0o7S1c2Rkt3MiRXeXI3TUd3SUghXkQtCitjdHV4V3BTQSVMPkRhdVAtIVNvQEtMbypPJmZxRz1ZWCRleXY1I0BZP1orekNBNSYpYlRMST5GO0UzSHhIKFR9PVpMQ0hSPkY9fjYteGphCitGQSNqJko9bFA/SWMkRjFqbyNhezJtaTJSXlIlcExGPztJTkgzUj9ASVRjaUpCKj53S29RaXBaYVVpfHdUIUckbmI5UytkOU8lc3s2fmBTCitNeWUlJiQ8YGJXa0JTbWBEM2Vxc357cHJVJGBrVTFgQChnJkIhMSVfZVc2bnJzU3RYV2EpMzFYQW54Vz1CUEBqXygkYDFfcTlsOypjVm1wCit4Ul92My1He1Bfa2dTfFNRTTFofkwkYUx7cmdvNz1KM3RpQlFSVyUoTGRxZ2Q8ZmlsbzxzKSNBWl97S3YmNkUqQk43ZD50MX0lZGJKXjJiCis0NndePHF0YnBoKXhHR2NpYXlqK3ErRSFDSEgoT09XWEx3NC1nbDRGI2Jmc1F0UUFLZ3VJTWw/e2U8dGR5KWBeO2xzbnUofnJBO2pFWW9YCitsdzdZMVkheHVlcE04IUBxelhKM14wMTNKPl9mTzY4dEAmd2NhNmhAKDFgJSomfnx1KDNJRVM1TGZ3NyQ3T3ZJRkpTVkNnI0J3I2R5eTNqCitkV3c5aiRnP2RAT2hRXkUtPjslMmtmcC1nTW5BNjhAfWUzPV9vR3BrRUA2RW9rQDZAbjxTJnphbSNlcklCKDljSG5WWT5IYmdiI2BDNnphCis7MG1jR347bil5LUVWdnx9c2R9N2VZRlpIaFdIYmA4akteRlh7RDNjWTNkbyNvbWl1V20tciZ7fio2UHR3YlBxTjwoMj0wWnk8TUFaQWg7CitUPm08eyVCIzM5OFF0ZDMtaGB4T3FJS1hzSzM+Vl9OSF8qdFJsIXh8VERHNz0ybWFaWDJQNEU3V0RIO19xMkEzYXE3ZjUyMn5FRiZoJVNvCitpSjFlTXUhQGJ0QTFSckVJaVZxXnF5ZD9vT2spbiNSfjtXOWBOai18bkNTWmJRYXZLR3llN3A4P2BKaXBAKmhealpEKEtqQSZITWdJUE9nCitQZ1UzKFFPO24xal5iUChlWWdEOFlZKGxEZCtAYjlOZXIpQiFsbFdYfkFqc29LfUQkVktjNWMhdlZuIUhNKWRSSDhORG15fTc5WWcxfT0/Cis4Nk4qWDlLYD00WCRXQmViPiY0Myl1RVhzQFBRPVN2VSsrKT9VdUA5dXErQDA2JkBpMistcXA7b31wPDhDNURoQEpoTnlQYCNReihPN3hzCitRX31IQGJ3OEQ4ZUVqRlM5akZYd3RJUGBOWW89eXAkdSMhaHs0dD1NfWxnfmlFQVlkbGVRY3g/QUFjcit1bGhmJmxufnoyeC02STdOUVNeCitSPEVLNVIqNj1SWDNRTUtXPT14R2I8Qld6eEFVUytVJiRLRWE4d0QyQUhndVU/eW5iQ2J6RUpsWmJtZW5kdFhNfnNncFloPXo1SVlCNXQ1CitKXkQhcSVhTks8cSlNSEJPITEqTUx+aTZkaVVzPzxeMUxNdTZGYD19YVQ5N3o/enVyOzxWfEMzaUFhb3tya0wzVHluSitoSll4ajNSMWZBCisoQSsyaUZab3o9WHY1TyUtPCtRcEI3NlR2dlV+eWx+Vlh3RisoLWlSYW1ASTNYXkgjSVo4e2VeNmd1ZDhLYTZxckVzRSVHMn0oTGo1RlgyCisyfD0rOEt4aiYtUnJ1T2xFfV56JTFjJFNBS0sjdHFXZU1ZYiEkcXJCUVV2Q21PVlQpPEpwOS1RTGVeVmFBVWN6QzBEc2VSNiFvI2ZYYGxoCitNR3I+P0QwUjZCbVV9VjhLWU8hQFg1O04rdXhiZWJBPH1BRElZa1V1R057KkUjUCE8X3xKWnhKPFJlTWEyRlFFZGtySnNLfXUoYnRxPllkCituZSVUIV9qPEJhOEZfY1J7aHojaE9aPkUqRVEqO0kpSnhKU0lzPmheNjFHflNJKSMtfXVSO04zWW11KDZ5UG9vUkdkNT1OcmE1dDdYNEJQCit8a0dmJUNIWDNEejc7MnlBellZYFokZ1ozNVRoQjQ1VmsxI0VyP1Q+fSN8MSgzIUQ9UjApciEtSDtjVjt8YUcrajk0U3QlVmFQNj9wSzQpCit2TD9Kc0pyYE9ud3wxWF95amo3KSNtcm0rPl5XKmNDUUhoKmRudD5LPUNhckh4UUQkI2ZqS2NQJS0oUTsjLSVKZFgwfHo4JnVmPFMzNXg3CitNaVhpYXA9Q0kzUENePUF2dXFxXytvNSM+JSY7en5HckxSTXFXKypwNmBeNT1DVkF+YTRYVUVZRjROMWE0e0F+c1YwTEl5UjlCbGNFaEsqCitLRF9JNkVqSGcqcWt2USt7MH5TVU9ZKiNwKlVGNXxrVzY2UmdtZ2EjVWJFaDVVenxBZztHP0ByRmMhQ0QwMmBDWE1vP0p8LUIxQEJYV217CisjZiYoRUNLSj1RdGpGOSlpKnstMWNWZkApXzVHSUtOc1pNIS1MTygoN0lSbmhhZUZCRVpJQVhNdGZAPG42TFIqWSswaEhJK21XOUFqNnB0CistTy04TWl6fnJ2PGU9I1hLUU5fdzVWQUV8SmNDP2F9bTlYc2J9STN9VTxGb29UZlBPTGpIMTJ3VTIxKUxeflVaT1hGNWtjU0U2U2YjPyZpCis5b2w9ND5QZHFXKGVzd0soLWNYd3Zlc0A4PHU0Z2VtRj5uOSpRfUhBMUMyPzZaI3BiWlUhKUI7ZTtUfWpxKDdFbmdGPEdqQ1dCdmhDXmRXCitMQmApV1lsZWZSZkNrWWR2UnFkKzlpMihnKz88Z29zTGl0MHFKXz1LPmVERUNJcDxDO15PUGxyeWlObUw5TnYqbDx4bkJxMXo7KmVOLUV+CitDUFBmc014MzYoWHNGMFV2YyokYkV0SFctO299SHNkTlEjR3pjLUVfXihPaUZaOGRoa1E8O2paZ09lT0gjIUY5VWVKfSk+PmhOeEkmUD84CiswQ3tGI3tldX1OdS1gKy1oem1JcD8hdnhWTVVHMEpldG9Rcjw9RDY9V2gob31tNEd8PiFnVnNaZSl5XjtZTT5SSitMWWpvNU1kaVd1WTVFCisqdkYqTy13MEB4ZVg3emBmc0EjeDw9QiZjWl9kVWI8KyFBIVU9c2A5Pi0lUHh1ezt0NEVgTXtwKCtvYnE9TV9QJiVPKEs8SDkkSnAhJEBDCitEKiRWbCV9fiM2QmVUdDAlbWc9VSQ3UCt7TEI7ZCFyNHlzMHJUQEZ4eDxhISozdVA3MmpzTUpwIUJpcmppTndIK1hYKW5IO2ozNytUTHBQCis8TDlSaHUjZUkyVFgycG9qJkRjODR9Pi0pWk02fiZ8NHxhdnRmQHk3KFJ2JXVXKzt9MzxfZUlgclFFQDc1LTRIMGpiTyU2cS10ZjUkSz18Cis+KTVuaHw0P2lrbWpDOW9AVl5UOXY/JF5nUF53ekQ8R2hwRXEhRUhpRUFVWUE1Jjx3NTEzfWgoZiFRYkQlOHZVWSkxUSY8VkJeYDRxUH42CiteNmZSemghQlQpeHIzb1FEMEZGIzZDU0BZPF5tT35TaypAWDtqZUU3IT9nSGZTMUctXzx6TGJlPWY/b0BfVStQKStqUClqMmZuNUVJMVlGCitARyoqUmNNI1NRO09eWGRYQzkxNnhPKUVYJSRWS2FHO0pJR2Y+N0UqOFZAY3clTGgkPG95ZFhrYHNeVHYwKUlARDNqUW9nU0VfeGwmeHMlCis1K3VCdjVBS3Q9JUgoVHZSMXYjbXt8Iyp4I31lOGQ9N2tEYGspZGVAPCZoUUJjbGVZOGdqSnctOEVZRjhDWk9kWE92YTNFPHRFVUImUXspCitEMzlCaEA4ISQpQH0mVTxhMUE4XjJHLSZ+cHBMcyNnSUU2M2lCKzshbTI4ZzE9PSojNFprOCRJQm41PWdwJGZfaVI5SE1iWCYhb05ITkI3Cit6b2MqfGY7aj9UUjFGMyQtIXU8RFp7QFltPTtidHNmKWFQd14xcFNJWHYrOFZEWGhOIVo7cTUjQSEhQXs9Szs+aHkqYXp7O0U/MXxecnFsCitfMkhfR3Q3YVVPdT5gMHIhPitib05vNFkydEYkKzArSkBZTitCMEAxTiFkVDcqSWxLPVpUT0JkKFYwe3tJdHtAWW8kbkc2MllJVFFUVkNRCitVZUVgT2ttU1BwZjJnQT1aKXR4VmpNTEQtWlBRTE0hWW5tOUxrQDQ3TzJAVmZnaHt7NCZaUl9oQE1WZjRPSEwtcilLJkoxWlZ7XjtaPHBOCitNQWhqUW9lWF5Ic2dqKmJRc3F9XiEmJGh7ViFqc3R5PTI7Xyk3aHhtaW9VfERSZDwkRklrKntDUWM+QWdKWEsmRH4mPSlPfHEkMGhhU0pECiskNXVfRS0lSGx3S3xYT30wKzxqWDBzZE8haGk2O3kmS2ZvQm9oK2Amd34tZ1lwSEp6aHZ0K1VeK2o3c35oZ0ZKbVVTIUVSTSN4bVdJRGgpCitRZWQ/KDwyZTUwd3B5amd7QHxqVHd2OXxgMVUpXmZ0R3Y4aCMtP1BzdlU8YFZsPWtsM1YyUiZvQkQ/MlpiemhDcDtXPzIqeGl9QFQ+SDdiCitmZi19MFlVJHN9UXlETV9jaVghNU4yWkl3O3kqP0EzO0xkQT5YJmxDRC1tUnklfUpmcn1yZiFMdDx7ZWdhKVd3I1liZD5PRkpiLWR1RT5CCislZWsjMyowS1hCb1NVdm8tR3B7cm1fMlhfWUtOLVRCTio7YTdfJGBRdlJ7IWxGIWM4KSYlYHsmSTd0JWFtPS0zVGd8I0p9SW1uNDxHWUpXCitUNnhPJVA5QUdiez5RTm9xPzFJJWQjTHN8Tk45Y2B5aWhnYisoUT0rbnpjPDYkTlR5dEM7MjtlO3d6XkpOVlRVKH1uZS1PY3lETEgqfF53CitxSWl+OGhKckUwdCNAcG15TVg5IVIjaW8xaGhfSjJBJnoqfWE7R1d+VFotMnVjbWN3ZXxHUjxNcyhAYkomPGQ+QnIhZFcrQlhGdHs7VnhXCitYNSFHfHZpTDBWcDBkczlBRlMmQ3BZMlI7MXJ9a2pHSnMycHQoYntzQSltYHVtUX14fFFjU3lxazBPR018JXZjc3hvb3lwezJuIzkmWlo/CitnXkZWV143WEh+KHkobyNBWFB7MnRgMEl9MypZbzk8KkpqPHlzWEIrSTRMeEpRPTg8JVJEXkNmTXVzKVdDTiVDZ0xRY2khPT88blBgVzh8CismM3NrITw8ZjZYZGZgQFRVYkR3eFBaPF5QO0dHJUZOPUcrPVFUPzspa1VQV3the3x1U0I2RFRRQm47PXooaktQI1FHZnd8I2JYcjUmfkZ0CisjcDNtQzBAdjFXKCgrUWhXYSk0OT53LU5qNVNCMlNlcEMlYUw4KDd4Qnw2YUZ1OFBwKEY/SDZyPExseXNsRnRLIz5EWEEoMypWVUZzLU8oCitMM1hAPnswTzRmaj1DSlo/dHBTUGRWMD1nN2xhdVFzZ2hMSyZDb0ppb2ZxcFk7WGRjKldHNThNJUBGfj9WYT8yPWVLQn4rOT47UUI5ViowCitpRENweColJWJEOyhUeHFlcko3QGVwTDElU1BydksocD5lb3VmcXMrYll2eVI5OWdYQjNjNkY1P1JEVDZvPDVZdEFYdFFXWHlhSnZ5PEd7Citpamw1NUVhLWVCSlhMSWNnUFJDNVJBX3VRe3QtM1BkWjk4RFR9NENIN3VxVHMtRTdEMyhQbGpIbUVrTjxoe3s5aCt6MVYmP2pvR3BOKipYCitQVG9qc2h1fmgtenIoN2QySmImMzhjO1lFX34jUTNwd2kwfiNGfExuYj1sWnNnTDErJnArazJSOCpVeTVkTjw0JHR4MyFVODtRPXp7X3FeCitudUMhe0dJSns8RFBWbFlfTnl1THFsPUFXfmtRVmhBT2dSVlRTVUdzZC1mXzdPZHBfcXJ9TTRxIVBoO3lnaE9GNE89ZFk7VVNHa29sIUo2CitleGhZN2pwfTFrSmBOKzB6PDgoYGRed0VoVlJ4KXE2QShYYjRmQGpEdHhQa0hYSHoxM085V35FMmdXRkFAbjktZ0FQWUhrakpTb2FlKT0+CitlbTlJaDxpMUExYWFZWEpgNXFiaj5sPDUyRGZ5YWM3UVlzV2RjWGFFJEU5OGx+azxTWXswdVV6SjdJQ0xzemBLVn0/dFQzRGkmZFMrS2VACitydVFIfU1jSVZCTjVETHwpMXVXJntvNEV1WkFJPC1rKWAxX3YyVkBzN09mejxSZkQpSFB7QkYkOFUyZEcoK0U1TSpBSmViY05wPE0tbE1PCis1S2M1eFdqd1ImbjZlMWZJTDgrdF9NY0VfZWUwaVEtfld3UjtLaGxoO2lxMEZkNj55YTB6JF5Zcyg5cVFfWmlNVig7KzlUXjc8eiNXYGQzCis4bStLPUUxWVgwPl5xMW0kNWIhOypOKk42ZzRrTVV+NW0xPCM4fmB4ejFVKDBfR0A9PEB0JkVhQEZ7RiN8QFZSUlktNlZINkJNaHhPOVpjCitiNlYhJUAmfUd4Z30rRE5HeTNBI2NHQF4meSY9ViskPFdeamFkZj08cmw/PWEhTFdxUmQ3Vkl7ZCExWEkjTHdMYnZ+XlBjcX44Xz1XKjFwCitqWSoyUGNGLVgzSS1LQ3pRWElSTyZCTiNiTCswcFNGVnNYakpHRUVZZVB1PTRkIWhyMFo1TzRnPmBVbFJ6Tms9fmE7NTRxSV98dlUoXzhBCitTc0VTViVDPGlYdjk7YC1Vc2laVSRwe25vOFZaczRZSz17Mis8VH1iXylSV0ZLNDYjcENTcjVQKHZIN0NLM21kdTY/SEJ+XkY9eDlZSzRDCis7TDdRTSF0MnJRKGd2NzB1MnElWEV7KER3N2diQCZraF4oUjw/IVYrcDJEQVReQXJ4aD89NDxJIV82QXBzMnZReWQ3MWZpMlMtMUFFaVQwCis3KWhrOWBHPW9xUTh3Pzh8ZHdJM0QxMzlKPHUxMSUlOVNWVDgyZmVEe1RyXmwrS0dAckI/fD0+eGt+P3NZIVdLUF42JDxkUkxrfHtAVGdvCit4VzkyMmJ1dWEoSyUwQ0ljKiZ6Z2BIbipXOF84fTR1UkBCZS1IcG96YjNXO3Z4aHUheChVSk82KGcoM1YlaEs3KXElOTwkbT1WQnFRbFM9Cis8UG1GP01kdVlwdjJXRUh4YGMrZitla1dIcFlNZjFmbCZDSVd7Nio2eHdKZFV1PF5fVXwmeCY+WklBZT09d3c+QG1kellFUnpjLStGY0pBCis2MyMzPEEqeU14ZGFCJiVZQ2l4VDlOZE9Ybl5OSHtWRkReeXlOVXpPbGVEfjhsREJTcWNKcCE4JkpjeUtkUVI9ZGl+c3JzMDYrUXk/bCtgCituST8qKWxIRT9FZHx2UEFHfkxpOHtKYFAoRk1aSl5icm18TlArTGdOT0k7YCtWMyhsbCVBTTxUOT5gY156ZVNxSmE1a2BYR3Z7NE5Fe0NgCis5c3RtaX1uRGt0XyZoJl47YGsrMiFMZWxsNFZpUElLMV45NFghNzA8THVoM1IoO3BqaGdLVXt7dmpKdztoVFhDZF4zSDdGJUVHeXdBUWZsCitnRyUlSDcmZVl3Tk1NKEY9WEhqU008Y1VnIUAyXjJVeEIhX3M9SkpKTlJ7cmdwYXolZVN9LWZ8Qk8+PmZvUUZCflFTTElHbD9BZCo0Z3luCitgbHNUKGAlZE43YTFRaXVtYSZYcyFxM3I8LTlken5aOzlmeEE+fihiQz59UGJ9MWRhfFdSa0xgLVYyNTVWcj9ea0FybEV4NnVQZG0jQTRHCitBbFdUND0wTnlZLTx4MHQwRVohbTxOX2sqQ19IVWFKRztUfmE/RVE+I2Z6e0ZZbGFVQkN2O0w5ZDFuU2ZUKlhuKjF8JUFja1c5ek87VjwqCit5SV5eeCl5KyRFfHBQJHxKUz1aRD16Tj0tJiRIZStLI0khSCY+WitYZD04I2BZfCsoTnA8SHFndkN1YTduMEk9TWc3KjYydlF3UWo3WkVACituc3g5WlhyO0RYP09GQE94PUdgI1FmdnIhOGVtZi13dnQ9KG1fKGpeQiVyb1J8KmcqdFYjb21TSHBWLWxvWkokey1PMHF0NEtxMzlLOX1ECisrUjdBbFN8Qk55ZytEI2BeVFI8eSljfUI9QGE+fT5JaVJWJmA2aEBeM2F4YSUxaTR7bkhKaEV3Si1QU15te0pfYjVCK3RhcDVzX1MofnkxCituZV9XI3czeHgqNV4zRn5ueldoX29PaXpgekQpJTZgcUhnRlN3dWllPz18aHVENUJ6eDtSQk03V15OMUtyUSU8IXMkbUR2JE9qKWxVTHZKCis+bFg/bktBPGJMPGpaaWhYKWZCRXA/ZVJ4UWptPnkybC1jOHxrcEo3N0o2S0pMcSMxSHVeakNhSTBeJEl1MXE0O2hxVEtJTzw5enFhVEEmCitEeSFoMERNK1hvaWR3a1BnJDJkSXM3ITFTcnFVcTxvcWdGd1ZGMklweWlFRWEkJU5qPTR6Wj5pcnBmTzUoNyRuSXwhbXZ2b2FMNiFpcD8kCis1a1VvdTBhaDhXe3Y8ZT85Yj9Hej1fRDxqdUpedj5VaU8mT1pEVDshTFprWF9MfGxRNC07Z2BUUV5BZThSX3QkNzR6Syl0PDRYfjQ7YEt+CitPVH5UZWE5MThuXkYjRFg4PGRAQig+Rkg3ZSpDXkQ+TTxUe3I+eDJSRzlKbGZmSzVkMGZuI3sjT0NMUTNtOEV8LUQoWjlQT2duSCFgVnhzCisrSTVsQTMqZkdtS2opYTApVmp4em8jTTBXcD50VG5oPTFIRkFgP3tZSV56dGdKfEtobEYrJkh0NlRlRWEoI295KHlHb09ZdjJyZjZfbHQxCitDe0xPMzNOZzFEYUI/SSNHNlpmdDYtMmtfeFBAKGxOM2NfKTBke04pfDhqcDA4NDFWZmh7Tz9lPkt2JE8oJVdDbzA1ZH1AdVZWT2NzTGN5Cis/Zjh6bk9OdUZnKC1JXzBocmZqNk8+RFdYYj5KPiRrKzw/Q1JQZl5xPktEKTlSckw5JGtDM1ZaK2gtVi1BTURHPT50JHRXflQhXzdeYn0tCit+UTZhJTVSano/cXcocj9pSnwhcVdVbHgrcEJhT3deRmAheTR2NnshdUxTSzxKdyZta3c3OG0lNTRjUU4zNU5NaCVgM14yejU5X28/bUpUCitqckkwcnlBZ3k1bXNsJmR0YXVMN0h4Yj85SzJUU2Epc0B9bFcmWW59WFE/cjNnSVczbkFHKFU4JmwlNzdmZkp0Pisodj1sRFdnWmoqQ243CitnMXkyUj9yckB6dmw7Z3dNanxRcSVwVnhOeDFoYnZjYzdpRVdpa3kwTXd5MjdBcDcwUSRDQzA/ISpEVEYxTWgrbClUaik+dzNROWlaNmBqCis0cmc5NVhVPSZPNlhIdGxIbFUwZHQ0MEUxbjImcEBlZD4mViptalVBfkRJc1RMS0koR0tFPGljMzhJRXpTYTlsR1RZUUZqZm47aFhWSj5pCisjWD5YJndCeS1WX3JnbmAjbisxXzchSEM9LX1yVl5Xe1RgSn43I1hKZ05iK3hJNH5ac3lhS2IkP0decUVoV1Q0NzJPRj14PSp9QHVPVmJVCis8N2xVM2EyYHxSO283YlZ2QzFkcFJUel8jd0J3byljfGlxX0Rvak9PJWclZ3hFK24+MylXbWFxRnlsfSt4VGVmanJeY01DWUxnTChVR2owCitQQiRpKURDOUR7bEctUHd7enZXRE0wOTFzLTdNWFJ4RXNsRlZ6QHpFTVNua2VHNUhJMy1BP2gmeVlxTjxmIUU7QC1eO2VxaFJJTWA+bCZPCitFQ2kyUG40QTJRWUVCWlVYVXMmVztKZnZlRCV3bTl7Rmp+QzM0bnQoKyE2WE8je3ppVk9VMGZlVkZtUn1oZWRmSzVGXzsxYT1gKj9rI0BqCisxTzRvUWcpU3Q2VnFWMSZtWHAxeW9Kc24jb29ReVhvSEB9aW5MTEN+IzJOOXcpQ1E7RUdOVGc+NjBrJX47Pko+QE5xTjklZSVgSFRBbU44CitULUZLKH14KCN4QSU0VT5tYjA5ITZYWD5uPUtrYFUkTHVwT1YtJWdue2ReeDU4QFpoLXlfRWFmKT1FMFhHemN6O0YwVGYkbGN2NEVKJC0oCitnWXxHZz5uJVA2RmV0cmgyQkRtOXJHUEoxUUFRPzgzUH18OXtJT0JacVUjVm1BQk9YR3Z8I35ZN0tZMXQrTGJhcUBUKC1Uby0xN2JoNGRmCitucFQrWGFfM2pCRl9CbWMqY3dIc2JgekcqP1klLWhlSilJJGJtQDFyREMrMzwpaFBQQ0MqNDlRNT1yQFY+R2BKUWR5VUI0UmVgcTZ6aiRMCit3Wj5zZCo2SW9AZC05YGYkQkYlJThVZTBrQllrNUh8bko8UDNAJVprQkhQQl5wa34/aGhtS0A/TzAtRE5DcGRiJnQ8P2xvWlJsQXAqJSt+CitVR3NiZXxDe3woRmwhYlluciNQR35ueFhHR2dSRkxeb2NHQX5MTnltIz94UWVZQzdsZCladjNtLWAwfkYkeGo5eFlXTU9pRjtEKHl8Rj57CitqaGlnPyY3QlRobHwjVVk/SXpVQjZNPWApYFc0KEh2RkA8bT1rP2poPFUyaFlLPkA9NTNNdiNvMllxMU5KWG1iQCE+cy1RP3tUVS1ubnFFCisqc2FFTndLYWMjZUF+ZFBCX29GbEh1OG45WmwjX0ZBRmhgRm5WeU45NypgN1BfNGdQOXhNRWE2aD8qIUhZRU9iVEMhenYkO0pyQXR0JU5SCitoVzIyLWEhcWZySmFsN25eTTdZfighbmIleGwoUzZTTT5tTD1DPC1PVCs8KXdDRHIhJkxiWk9nb0FiRWRFSWAzcSt7ZEpYNipAeyFWMnhNCit6I2hxI3N3MHFwWXlXJU9XQ1V+ZGtCK1lTQDQqUGV1byM9bHFTLUZqN1cmRzF0enJnIT9XIUFnVmU9QGNMYE1xUndlbWc/U2JDWGNzIzVqCit4MlFGY0huekw9dzZVKDFeI15YUikoJC1afnMrPEFRZHJwVnV3P0YyZkBkYFczfkBZeiUmX0JzWEo9RGNtRnNRWnAlaEhFPXRPNi1yNXF7CitOST5jdld2JXIhemkreEpuYV9weyRyKXtKMVZeYFpkRytFX0FBdDA2dClIKyRkPlk7IU9hJklOakpZTj1QSzA8SVBqTnF3c3dwdnIrUDI+CisoYjAxRFMlPkxPV3JuYVRqRT1qTUd6TXRwUW42SD5QYnV1N1N5MWJ2cl42K281X1omSE96UVA5QlE1USZtMD1+KipoMFB2MlZtTGBHKUR4CitScSlhbj1TLXxoI3dvNXNQMS11RWcoZFpoempEdCRXbVkkNDktZ198JTJKdlJCSnJmUStRTm9qKjM0T1gpTGJ9a0h1cH14YTh8UHBXeyo4Cis8bGdLVnpAUCl7IWtTJlFpIzdkPlViSCNIUlhCbDY1V3FSUXU5QyVtYzFnQHMpWWlxY09yP35jX0haU05UKWlebW5FOFI8V1VEcmZZYGw2CisrJG8peCVTV3FkSUozSTRjZEctOTQ3JUlmSmNtM19fMnlgP2hGVVZMN3olcjUrRXhwSTNMQFQ5R1ZoWEZxSGJRa3Q4cTFlKlFvSDMlSmJWCisoP19WQX08d0NBSU5yekZJcn5EQUpAR2AjXjdhQGYxeG0tU3Q1ZTNBQE9KeStXfHkyUCkob0RJRkQ8QllsWXYtTnB1TSgqTmUzQF5uZUwoCisrIy16JnxNclBoSjx+I0QhQGhua0tKPHdpJVFeS3BDPDkjLTQxT0NSeGA5Nl8/JDxZPX5UQC1qWmNZKmFBRFNXSkItTD11VWRAe153aXlZCitOc1BSN0dfIWl8c1p1bU0yWWxtdWZtISpqJnAhcTRedERSa1R9PHhjYlE3O1Jub0FHS0RxR3ImWiRXQ3RUUkFUeXVXQmw/S182MTQ9fGg+CisrYEgrJUpBSWR6Pz91dzs3Q1hrI2srNHlidE0lNSU4NCNxM3pzRz9yMGVlRlRJWDtebjc9a3k5VWFhSnNEUXB9T1VMOWZLKTFLJU9AWHZqCit5el52VzUkdFdVfXF0QEx0RWQxPjRWQXY4UnJBNjxmb1Rod1h+SEBxN1AtQGR9YzQ2KmxYOylYfWFBT1dPSCstVDkmd2NVaz8wfn1KUUZ3CitqYWJWc2chR1k9NzJkeF5JNGw3SzMofVlWXjx7UylkO0JLYVg1bGBRWXRUcnNia1N7Rmc5I0o9RHtCdypAQDh5b0Vge0hvV3FAK0FKUylzCitJNGMkMG03OXA5O3EofEwzaFBldzZHb2BCOCMkU2lQZTZhclB5RW5relZ+I1A8NUhxNTBIPDQ5LSYoUVFAVD18RnZKX3RoUXxYJldjWWlDCitYZCpjN1Z4OCE1bypLd2xHfk5EYEJ0QW1BcVVsOyokPWN+JnVHTHJ5JTliVmM4Pko8UlpQUlEjTG9ZMEE3PTMxMUpXNzJ7d340dGlaMEN5CitTITstI1lUfXZeaW4+Xiprc0JaWT9hSFdaeCtrVWt3OyhRLWhqYWxtO2B0QihEIyQ0dl5sMUVVfDZOJUpgTk5KVGVBQFdxTTE3VjMjSGtaCithYSV5fmVXYWkpPUpfYVBlalRlMEw1WVlBc3c3Qyo1WiZ0YT8ka2xRTl41aXNRVkxWUF5KQjhpNjU0UntiZG8+dCpuNGsxTGBvUWFAKkNxCishbyQ/VG91IUBfMEZLRDZSYjE+KnNGdHApT1hEdTwzPmIzT3lAfSlmPXxLT0FrOTt0VWVTPU1tSGN2VzFoXmxtfilmclZmMzk0PkF2VGxlCismMHp8QEI0Xl5RJjwpb0dvU0ckJmdtQkQxWF9vc00zTjVQLSN+WFNZR3M4N3A1TCp3ISRSOV96dlZWd2I2dTBhb3Q2Oyl6dyhoZ3lNZHFVCithPytyMU8yWl59N2AyK1BkczZ4QkE5V1k+XlNCYXpnNFg/NjNkLT0kPkJHbUM4IWtUWTshITJQMmVuKyE+U0dVIWFkO1Y7YHhZZnM9RHYkCitBRGh4VlJaLVozak1hNChhPSljd3Y7TnYqKzw5OUpORV55TG1IT0BCaXd4VyF+UU5HU0hiU2gxT2dCMlMpYDN2OUdKXlhlIVVZc35GbDEhCitUO3o8WjtfPD5ZNV5MUjw8WTNSR0YqZH1kUnQ9aUpDZXU1ckV7cFE1KkhsaUp1ZyZvQz57aGk9eHZOQGZQLWsxbz5kQGYhJT5NP3M+fF4tCitQNzxKTGRfPHRfflhBTjhgP1IyUkxYOUljbnljcntOSFFncGBTRSU1OWNJUXE0bXJiPlA5OW5AdmRgaTF9YEwqaVFHZ05NYjFObzAmU3x5CitUZzFgQFV3ZUhhRGskTHRsJHModnd9QjBAMlBFTTI2eGcoczMqKVdia1pFZj9MYUZ4TTtFUnZfemZ2SWF5eSM9M350SmpgaUhhbyY8dVBYCitsPThpKUNCKiF2PVZfTEJGbkRTVHtQQHtHMT1jSFh7TFlfKCFyd1dFdWRgbWJSfUYyN0A1UElYcEckVE4xI1JicXhjeEghRm9RdkhkKTtNCitSclhYRyhObkB5UW4tVjVIK3RGaj9eeX48QGEhY1BnPFhQdWVINVQ4YmhCeUs0QjdgZ0lobGpfKCZLYDxFbCMrelErREA1REplJn5DI1glCitXSV9BI0ExT3pGVUIpciVgUTNwNkNEdm09ZSR5U3RMPVdrR3FSWVlrdD1FNG0jbE9KTjMxQHoyTEBnJiZPJVNkIVp5bEJCPFVWd0NeSS00CitqSEwoa3RWWjQ2ajlAV1MxQ1I9SHY0MmRxLU5VMCpWOzIpY3tpaGN+Ui05ZjRya04+OFdXSDE2aW85RkpSNFd1SCNvODJwQXtwUm1PWUl7Citqbk5EcWQlfVF2VytSKXBfZSQyTGFPaHdCMz0oKTlnMU1iViU1LWtePShCdXNRZkIrbUMkSW0jJFUme0dTYytUeT4rey1VeUBYPE04K31UCit7YFJnZUZLflVAZFBLcnFOY0ZnNUQmamRpZShwSEZYbEJLJCl7amlQOEVSJU53NSNEeHE8WDFfV29FP0ImbSNpek0jdjB3Sl98dEYtIytZCit7QyNwNzQjViZyVmtKXykyPyYyRCswM096YD8/akBuNk1kJjUtVlI7YUJJRz1yPm1xN3BxT1E/VUhNbT5vJVhkdjM+ZzFaX1RkLVNOITJLCiteZT5GQSlXSjlefD5kaXM4RHR2Zno4eVJMSFlVQ3BYbSsle2c5c2trfj14JEFNU1JgJVR9Z1MmMCt4Kz9+WE0+alJZdCRVTCkkS3Y2UnZuCispczBsTk01YShQNTY8O3tuUDVpJVh4U3l+RmtQaFJwM2oqPWhPP3c3RHo2QVJDMWY0Z1hyTVprTHBKV2xScS0ocCl2TzFeSEQ2O0xsRSl7Cis8fTc3YFplMjVkZTsxbjhwVDQ0cUomZVFNTzFlJXpmQjh2UHdBdXZweDIyWUBfK0JaaXc0S3RmWlljVl84c2AzQnY2IWIkdlJXPW5teDJxCityQFojWnU0XldGdXEpakY/VnxqPEpjJHQ5eyhaIVlNTT1TYHs5WWFMXmdmWWl1JEBSKD5iUntEWk1lZDFQZ1NPdzNjNihGdWZUZThzfT4mCit5aUY3QXREbnRiN2JuM1hnSlhEMGxSOHt5U2JfZVdQcFB4ckV3VUx3KVdzSil4WFBmcmYhVzB+fSF3UHYpWl9Tfkk2PjRJRWNnVDs/cDdrCitEUz58aDVfJH1BdCo2Rj5UUjtNdlBYenxJY20jfGN9KENQT25+b3xua3JBcDc3ckBUQTchZ0BmZmtBO1FvZXxNTT48OzhEeSYweFNrPjE4CisqVW4lMzI+eXxGWlZZNHdOQ0gzLSgxQ1pHV0JOPTYkYFAyKFhAel4qJElgZTh4S096VGdgMXQ2fjtzPX0mWnBXQE41KW9GciZ5eHZFMVppCitJPXBlTUxeSn0jalREdEFWJWE8TVZTcE43TUhMYXAzeEJua214amVQVWx8eWQzMz9IbzEjb0Fwa1hoVDZofGVpJClFVz9GM2hlY0BFdkhaCit0cEY9Szt2OyExZFN8UTxlPG4/a3FFfW5uRX5Bb3RtKX1Ya0dBKTBrbGUmIT04VW9LYkVvdVJJTUBHdldjNDRfOV9Ia2I7dE5uVUM5TT9CCitPcEh7K2AqKV58blUqcDhKZUF8U0soZm80aDQ5aSo0azs/RmplaDBxSjEmY3VCKTNWMkdOPTkmTXIrclZCQHdZeDJpOHh2ZVMpJUNKTlFUCitEWjZDTX5sI19oUkRmeVopNmV8Rz4/dWZjLXd3bGd0aXo+eWoxTEx6UTxfXz9oYGBVMjg1Kjw9UERudGg8PzsjO0VSaG1vdmRAWnB2WUpqCitMJnticC1OVUg7a3R1NWNQXnNpZnB+aWYxdHFCdDNqZU1AdkpecWc3ZCFFVHk7ej0lVjc1alNRY0ptNmVxISNqWnNSNCgoajJJMF40V2whCitZS0omSFM9PFA9NSFgKVliO3BLTzR2WU5hdDZUSmZ5KXZmej02PHxOaTdiRl5TU3omSXRLUyZDdnk7ZWp1VEFSamc3czJiPS0oYWVTQ3R+CitmYChZUyRoKWc0anRMWm5LKkN9MzNyR2MxOF8/flQxMkNvKlpGNTJ8N3w7RG9vczFZeEx7ejRXXlAycCVAQ35NYiMrPWI1QmAwP3JffXE9CitvRFF8Y2l4UW1XVD84aTBVM3NGI3wmJnc+WVRJdGZIVGJHRX5NWExjR3g+dkcqZVltXzxMJFhFP0FPNypmbSFUb2Rja3ZxbVRATHtAODlCCitOSSYhfSsjcShnRU1sNjN8c0xsXmp4PHJxZHRTNnw5ZFVRek5xekdQOVhmbEpjKW9SIT9eMVNiIzg0NDhXRWU/fTdYK2JHNk0zPkc8JWs4CitYRGxPPXFHY0Fha1dRYWI7XlU8Nk1KTW9ycC0qQ019Skx4ODNjZVYpUntKVX5adjJCczFnbiRlbWgkcX05QXI0QUEydnVWU1AoIVZjWDJuCis/QSlsYUI+X09EKjxrfEx6dTVDWlYlbClqfDdrQ2dDYE5ZTjxYViVxUiZxRlA7PlElYXkxPyopNENMUV4pJj4oZ0UpSWFeTHB2aTd4eHEtCitIUjh1JUFhOWM8XnZvTUk/bGc8e01aLVVPP0FVUmQwVUl2ZC1QcitKPH5pSypyZzM0T1olYnl+KzZ8aFVkKyFFbkZYOytlY3BgNnNLYXZuCituKk1RWDR3RXVCNEh3aCN+MzAlNCtkODNoMTYjMnlxJnFJUXBvb30tajZnaVdOeVVBVjw9ZGBgfEFtSFopTmFOS2RDSXcpS00tN2NSSUVECitQIUFxdF9vRGMhYz1OO31APj1qdUc9ezNqO1hTaDFNUGlzJV5GQVJkUTtVP1JXXnVNSDlxLTg4fVhZTFp7VkhRaTQzcD5RYTcwXj5lTUh5Cis2TGRFRG9LNmVARTlkTVE4RXNmPStpWiVMcXh4TigkYTRHcTA4fFNkM05eUU9MZkJjQHVtcmEhPCh+STZ+ZTI9TiM4c3gyKXFBMHBROXVoCitjTTJxXihFWE5RP0FGbEM/K2Z9dnUkWDZLLVUyR3ZAIVAjRFlQWEEkQFdBSVQyUGhxWHBpS28kSEBVWFN1YHYmOV5wSGw/NWpmdnBjRihxCitkRFpVVkxwd1pAYW88KW1uZHhqYFN7IyNoVGtVNFpjR2BecWVZcE9zMHZ1RXA1ZEctblo1WSpQXis5TVgoR2dEO0dZWGljd3Ura2BKTHBnCitBUkk0dER6Z01LcEZiMTxEPCswRFJZQE0qOTQmRSNmYUNONUlGPm8mZHg7VT00YUIhczd0Pj9KPztkZHd3VlVDVFVoX0B+WTIhVjhZe3xACis2QF9fNCp0K3B7TyVJMVVOXkt2S2dHQ3BXQ0VYQGI0b3lsVDZTYCZ6N154PXRle3JqMSZ6WFhsZVNPYXxUKW5zNWEoaWgrbmArYkdUIU1WCitaIztPVmNwZCtfekMoPUlWVkw4K09Kbys5PmUweFNDQi1rR21fdTkmQE5BeUckIT08PEVjbCkxTThuPXVZKjdaYTl1d3hgfnpgKTxUITYyCishTkx1VUpYb2xZVGwzV3A9SyoxVFRpaERLKEM1b158VitFYFE/R0wrOVR+RHBISGp1Y2hPJVMtPzFoX0s9e1ViVmIlV3dDS0t9MnxKRGltCittOVc2aW4rYWBsVSFITjNkbHJNZkM3LTJzVmxTVGc1Y2dGeUlQKlhnMlJMcWdjRFl3aVBfakU/XkBjSTctPUlEUnBjPTU0d3lvKCZnPUA/CitLV2wwZSVRYm9kZ2haSW5tWngxNyhFSD1zWVdDO2Z0KHheOVMjU1diZz1HYT8yWnk8MkU1PmZBQEJgRkAjSTxQT2lvdHQqdGZ1WHQxKSFECit5SWtDOVE+WkZ7VH5XNG9sK1dhWkJ+Jj95XlBFZjdDREBZIU1SO2BOZlh5Z3haRnE2JkNQI1BnSEZWXytqXk1NKHIpO3E8YlZAM3Z3anApCitgalFhZV5kQHZ6MEpCQVY4TkxLe0YkdTYrWnRTQWl+WnRmLWlOczEoTUIqanIocTYjYV9VVHxESCVRezBOSnFnVmYlKHczc1NyQVJOUjMzCit3VjFvbyQzZWAkcEo9ZTdHZWQ9RjZka2NybXxVPzArLVV0NisyKWsyQ259WmFvTD9PUlk1Mjd2UkVuJCYlSmM0JCtENDB3cE49QUo1eiVWCitRKyh1QkcydUpWPGwqJHVrZyl5K2JXbjcpSEluTmYwblEjZk5nJlJ1cUteaFJCe2ZzKGZJPkA8UFhzUHpsV2NTJTtwKEprdy1EWkpiWmRBCitaUVM4RTJ1MHxRKFBRTSpXODlAX1N4QSh6MmMzbkF9NGo5Y1FUPExSMyUmbHRYV2gkNnZIdzQ1ZCp8WWhMV2VybytDZXNCMWtwKWZVeFY2CismcHsyQDtfaUM2bDlCKig5LW10cXwtU19nfmB5c0xxOSMzLTdXWmEpRkkpTEh5RXh5QTNna31kVjU0aC1UTC12bGNhZTdxIW97anBwQVQ5Cis+IzZZTSQzdSUzZ0pgU3s3Ql45M1EhNyl4RHhRUGtfMF4/OCY3QEcwcyZQJWdIY0ZAPXl8M29jR0l0XjBHTExValo3fVBCQypWa28lSHMpCis8fD9Qdj82RXJCKiR8YDVpQD4waDF9YWljJmJEdVM9VWBBOTRiX2wlNVohWEJZVnx4Syp0bzg8NGUteXIjaUUqS0szZz1qKzlJc2AkU31hCithdVMmI01DcjhGdXlHZHN7Z0BLdUl2fnVgNjNUPDNofXBRUUVSdGxePyl6cyZVQmchKVQ+R2ZaLWdPIVBEaiRtMEVBLXVRT0ElPn5Naz1JCitGQUd5K2FTfFA8WDlHbVpJNT1eVmYxWFpzMTV9OUwyVCglOV8odldYeTZFQlMwWmFSXkQrfVUhI1RGeilLQTN0ZWNxMWtXfGlSfnNCNXctCit1PmRWek57N1dye0wxSD17YFNAIy1kR2x8VEw5MkVGfUBueW4zRH5iekxJSnFwZ1NgYClkWFR2KXhAVSQqWHBwfHNLbTdaJURycGYodG9iCitveFlCdVl6JV9KdSFBQHhZVXV3NGZmIyNSKVg8QChwWGloKVEmXz5meXcra2pAeSlIe1ZPVm4pd3REeHx2d1RkfFZFWXZsdn4lRT9Mdmp6CitmTnVSSCtWUztwI1UjR19zeiMmdHJ1dCNjKkN1IyFubXB9RHxfOHh2ZkVDMzRLRWUyNTRtcVM3TTQxKm5lU1k4UzIjUUwyVlgqSF5oZTtRCitWNkIwTUNSWWp2OGZXITFNa01jUnEwPkJsTnxpc2w7ZmZQRk9IQ1Y9d0YqQlckMz8hbnZqUEBmelA1UWJNO3xBbD43UDE+YTVSV1J5MzttCitsJkRvMVlHfW5AQEw5YHZzP1hiS0VXemlxSkw/eWNVN3c3OSloNms+RVpCNk0xX1NuUG8/PyYkI0lqKFh7a31eUGJjSEFOQ2l7UWZScylJCisqdyttTD19KUlPOXpnV0Q1fSV3TTNINX1WdWMqWUNNeCk2ZnF8RV9tJCVQbFIxYnlKc0thYio5X0trNU4jfHVyMSVZTnJDOHZyeHBxKy1WCitGS1MxTHUyIyVYe3wrTkE8aFczczlpQXVeKU02MH0ycGYybiF6NTd1fHBnTE02S1J6I252QkJNfiFCeE04YChlS3s4bj9RPzMoWjl2MjNyCis1WEU7PjhPTEIoNzZlbDdaLVNhIzcmWSspdVR7ZV9eU0Jzd0xhSWFeUFNJUCVlITxhe0slajE5WkY/YTNzekl+KTliWCNwJSpOey1vN2lVCis2amZ7d1hBJEY2Vkt4S1JvM2lXc1ozaE4yK35uI2RISmhKR1dAI0l2Ukw8IUlfe2Umcj9GdWw8OTFUeH1kO2dmQWJeeD53akM2cU5mY3MjCis1WXJXYTQ1ajJSUTwxQ05tN0kreC1iQGA3U3QrLV4xTEVTV1hLWHEtdV85OGBKYnZ8ZzV3dWpaOHhlaU0pKkw2YXo5fn1MUG9iMnw3ZmdNCisjfVAxXyNnOE0wJTBaUSlyNCRteGd+YW5SRn4tazZqaXBRSnNjNTh9QittRTF2UmpjTHhBTFRKeWlHUFhCd2Y2aippP21LPHFLWU98QD88Cittfm1ZN2FoT3FXUyYhZmkpZjVzfXIzM2JsdmQ2WFJYX1g1PGt9TUh1QkBVWFMzdExxQm89ZW1xMWNHN0o1QWMzODshTkltdFY4O3ZkdWgzCitmJkBnZkJLWj5ZNW5Qd0FaXnwpQWFUSTRMRSUoOytFdzBPVjgmKFI5cnVNX2BLb2ZPXzchZF83ZVI7R2ptalZCKn0/d3FRNjYmOXBVTCFrCitaKWZZaXQ8PHxzT1pyMTleSXhfWnhJcVpRP2NweG90c3h9aWVuO0dqK0A2U1J3VktZV2lIQyVHaXU8PUgoKzZ4WkN1UGRATXVCd1VxSiZPCitHemJCTE1gPWAmMlBtYkA0dFM9UGJGXllhS1JgZmtZIWFaazk0Sld4Rlp1JmhxNkNLeUtufl5LUmM2YTEqKHxYQSY7aUhBdUhQVnRKJXs8CitFaElxVWhIbzVHN2MrZVlXNCEycTctMkFyZ3J0d3twSWdKdT9PaXQ/aGBXb04hN2ljJmJOTkNvMCV2VypZcVgwdVUhQWFUMj4mPVlkUFRfCitPMyYqI3c3cXw4QU8zTlFKK1p0bEdnYURHdStAMDBoc1JjaCRGez0zMDQ/diZMUGVqWVplJWkwOGdhamBGVWVXM1FkJHp5Uj5SKiE8dllhCis0WjhQJiF1X0FzRWs2fF81QHBVX0UjRWh2XnFwdD8kKVkkJVopckAxKUklJSExclI/YTx3UCgjcCEqLWh0QT82Wj0rVGtyRkVUX3VEcC0kCitidEJoTSVIZWIlUk1KM3FFKEFnQXlfYWApVURBRF5iP0dIfVNAcSpfeFNWbTk0bGBMUGN5T2loNlZmKDY7MzVBPkwwRitYbFNRZ0REfS1ACitHI1RBRG8zVERJdWVye1opZ0J6JT1aek4kQ0dkOTsrSEZpckwqeX1wRTRVbkZORCVqfEBsQUFpRj44PktFNDN0IXdYJGpkfD9uZUtWe3UhCitFJjFaO31tO2FJPHEoKXUxYj1RS0JZbDNTS0tsfHNDcjVLK2Y7YzhoJDAoZUl3P0Z9KHN+Rj5rUk82MV4wQmI/TlluK0IteDVaUmQ4eUh4CitINW5qST9HYmkjcnFIc3d3dSY5ezI/KXlSSylydUgreT9iYyRhRVFoTTtBWGlJKVhrWmFZM1E2M3xpREY+YjEjNFkwPnJ+PkNoY3tXRSpsCit+MHRJP1VgKWUwUWlqT0VhSHJEODg2Yj0/PmhDbDdpRjt8eSFCLXJaXyYme0AlP3hSWkxUQTRyO3kwe1dOWXN9dmlFeVRoTm91aUNlPGNRCitxRyRZSypXV3Q9X0JqTUtOMjdOYmVJdXwmWSp8eFAzQ0wkdF8yKUAyI3BtME1RNipRVUZRZE57PDNyS2Y0Qko5JEJTaHx3KTR1eT0wdEJXCitqVVBOVkZMZSZVeSR7a2V2bmUhJXIwaHdycG9NOWJZbk9CQFFCODR3XmVpdUYhd1ckTkUwKjslNkZ4SSFfJX1yWUJ1RWRwbmNlTER3T0g9Cit8VmlDM1BHWVV6Xjw4JkZ7QDdlNzRXNk5KWnRxQl4tLTUtT3ktT1hNQlZefH5GZll1MCt3WGFwYigyak40TT8/d299cFljR254fWtVOGF5Cis8eSZKNlR0RTsjWSplJHpAUl9NRzw7eEAmJnsrbE5FJEU8YEJ7cFlzUmlBZmhEN0Vhc2RoPXl2WmNOeXZlSmtKKSFmOHAtRTVMJXZtRiFkCis3JGZLWDU8PWZKcVI8NzFZdjJvdVImO0dmJlVWLWUhaTQ+TVBKKHZxOzd0QypSKkd0MSVlRiVXezAhe2ZSMl5IamNSKndqdEleYkleYU1lCislcSF6N1Z7YnhrK251Pi09UDYoRTtNejF6U2l4c3BPXzVxUiQpfWlNP2JPZzI9R25TQkhfUzBjX2ZSfjtxKC1DWnpoTUkmcEpKTWlNem1BCismbllmeT9sZGlAMm1jd1dxYEhlSmlEb0FYXzx2R1FaQEVyfWd1P1BTQighRkJNRC1OdX5ZP0d0RmExZDwyb0lAYjZzQURTb0NyUjIraVh7CituNEp1QkNvKG0qfTRfZE1GNmtfNFJNVXNyR0opQTFwOyNXdCYjcGtxYGx7JWlkSks4e18/ayo/Sj5iSjlIMlZmWUw7MzhPaWspJUJMPTJICitofjNkT0smQUFPZT54b31KcmlDail4TFZUK0lJREIkanxsbX5BZyYyZCkjPEArVksxWXhWJj87KlE1PkFTdi0jY3ZiM19IKmBlJnBCcFNRCitnKC0rPXsmI0dZKjA+Kj4pVWw2WWA3azlOTGBLeEowMmhobypNNm5fM0opMHJqcndieyMtP25ZWSE2WndMNzE4aSotfWUrfVVaKEN4QWxMCitEOyRZKzh1amBQVD5RcGFYQHdjQTYxWi1Xe0Z7Zz1QUyY2clYxa0F5RD9xWjNXUV83VyNsJjBkVEJNcEdII0FISzs8KXJkb251SzV1NmUoCityKW1CY3craXQ1aXhRbl5BUHVtKFdyPTVtY1ctVyNPP0RrRyV4fEhQTzZZZVRFNkZ2Ynl1Rj5WS058JE1kSntOXio/TG9QSEJ5WFIoS30oCitJQyMofW4pdExIdjlLQVBkQ1ZKKX1UYlE2SEs+b2VYMk1VXjtmaDk4diQtR0tKeD5fOXNuan4pRGFJT1QxKGhZakcreGA5ZDg1ODh3OUo/CitqVnJTUmRIME1Ndj1ZJGxoaVYtZiNzTGAqTlRvYTh2cTU8WXZgPnE9Vj0/YzkwfEtsUSU/QzQhan1PPExmdHc2RllDKGFjdXktOTh9X31eCitWWCpUe31qamw5WU9xNG5VcEtxeklHZXdsfTVRSVN2dFR8WG4/b1BVUWRPO0xhWntJMzNNT1F5MnRheWdla1I5LSgzVSlQWlB0JE47ZnVsCis1TWxEZENBIWVRdSQjIzg2O1kjaHE9d1NlSEgwWlcmYHxobWlCcUU2JCNnU2sqJVNCVXcyUmBFKF5vVWxubFZaQz00SDFeQnolaG54JkR8CitkTVN0ckd5U207V3BRT19gZHNgIVVhR2lIVl45K3MzRih6dHx0O0l4e3Z9Yj5iMiVxNzBwNVB0czhmOSpVMjVKI29kdTZrXkpifn1Fbn0/CitzTWNCPTc0ZDs1LU04UGF5QjwtWFUycipxWmFmVEtEdk1XMmckdityRVotWktMVCZEeHJULV9zZjdwSmVROzRzWSt5MVRLTSZAcUxtVUtVCis2dEJpSGBGdldfKnBTc0t9JTlWdU0hcT5PN1ZnaG15eSF2YnA+KGJNPXE/PVU8WTRueHxpYEQ/Qj0mMitrUC1yM2FHT1olcyUoJElrKFQtCitxZGt5LXRPRjU9Q3Q+NChaMV9CKWZjek42dXA8akR3QnV5cEh9SlU/XmkkdlQhaCEtRTQmTklUJVJKQFBaWihDP19LeUlldWh9ZzFIOElfCitWPmVvei1gSV5UYVY7bDRkbGRxOXUodTUxaXlkYn5LcE9rQ2V3NC1MKkolMjxYXlRkbWF7V35xSFdhJiY7N1UlYihMbDRzb3tTfHMrZHNUCitVcjwqbz5MfUxgIypFd0Z5JmBSZHlNPE9CfV56c01WMD00IVFLLUx9JkMxc2FvO3xne1NXSGRYNzhoZl5QWHFaJigmX1krPCNXIz5wPTY0CitKSCZFIz5EQ1haMDdMRHdwfWlKUyt9TU9TaT5MQ0dhe0h5UUxEeyt5VkhYV0N4aXZ+dzZAQ08xbDs1aDUxQjJeZ2ZuR1ghT3VjLXkjaCRfCit2NEM1ITEzd2R+clheOWFQdU84U3dhNkJJWk10M05Paig8Z3xaJVJIVCtyQT4yMDJwOyFPQmZmZXdjJCNqfSgoayR8MzdMTHVPeXZzRygjCitGYXdoJCpvO1dVKW19JldDcEJ9czRvVD9RRXBCLTRWSUVfcD5CJHMrTVhSMzBwaFB5Skg2cStycldNQElARVFBKUEqSjMwamkrJG5BQCRXCisyM3xkKjFIX2F7KlFxQGtOPz1qN2FfKnB2ODdfLXhIP3dWSVlNYlhLQ2VOamE9UHJ9JUszaE0+KX5gZCtgV2l5QWRTKDE+MztVaTc8RjVKCitpMyRUKUN6ZTx6em1rSE1qKFA7TkNXXzUqTVglS2dmI25PTmJpXm5vZ19YajA8bGI7PUs/bShZdmNUZSMlRz9CZjV2WjQyPCRqe0p3S1pkCitKPypCcFN3VHxvTGZBMStKfWpQM2J5UUFIIyYtMCskOTl5eEdURUxvaXs+Q1dJelVPWXNweHx2OTs0fWlfdE89YWYhZl9sY05hTmJrISl9CitKaV5EbWJxeGNxXlZlRF4tTH12a0ZKRFRmfi0kYCRyZFMzKT43eSlhKX08V1UrbmNmSCRBTmUjdVNLRjI2Nn1fOXtFWnRPJnZucE9kQ1M9CisjMjBSVm1fYCVNY0dOYz1lLTt0dHpUO2pjITlHaz1ZWmM/UVBAdylwJkBySD0/dE9NJE1CISs8KzctVlpLTG4qYjI5IU9gfjYrPnl8UWl5CittPTJ2bjlDcU9nSVMmP0tkZF9XcGNuRlBqeTd2QnVIXmlDNDRXbyo0bFBlfWNCXmNoZFhZbnJFMVIoM31uMzZjNGs0K3c2WEJSdC05U3N3CisxcSUjU2wpOGYlVFI8clV6KEpoPk4+MDlhej05MW9UaFRVZkpfSFM3YSRmYV5LPnwhNUlwK201d1ZNX01qaT07bFRkWTVrfVJQMX4xO1ckCitmYyprd3Ajc2hhKHohQHx7elR5SyhiQUI7eVhIcnJgMj5BZ2JkV2dXIz9SVyFxRDJtUGdafEp+QHg4dSNoPzlCPGA4RCFOQHsjUnVwbnRsCittOW5afHIjJj5raFhYd1QyeShPaHBUQitzclBGczU5fV5CezwkXm4mRXgmYy0+NlVje2shTXctI3N6amUrTXtLfFlpRTwka3dVKlM8Q2NzCitQMy1VcGk9TDhhPllzWlgzbm42d3VZUXVVMldCS1VrU21gVTZQJj5QQ0ZvIVB2dUkxO2BjUnNvdFk+T0p1dW9RZE15P143YGZOdzF+aDE8Cit4QFQoLSlATighYFImZ3lpanQqXm9WQHBQan4kdiRjOGF4QiN4ZCpueWV4aVZ1KW8qaSk2cDMrc0l6b0lmM2prQkAjREl2aU1kSk1iezN3CitNYTVRNmhad21MRE5DLStvOTU2e1E9P31TN0I7aGpMaH5ZKTZAYyRYKHE0RSN1fDN+IXlIe29FO3pvaTt+cjJxZCF8STZUZT5UT0VARXlFCitCME1qMkpmKGg1KG9AR0JzOSZIdlVoez5fVWFofnYmQzxZbHJkMzMyODZqTD1gdmY2RitfIWxBKVZNaktVQ21qJit+ZGBtQyo2fWpzKHskCit+e3F1aWZ4eWxjUkMyc21ITCtFTmtIUCRUMHt4UFg0e0Y+SlJfOzBUdSkldG5BKSRSI2BsMlgjVkY+b1lqa0x5RTtkTzBLV2V+LUA4JUopCitQY3M7WVJfMlQpJGRKQnlrOWBBYFZ4UWwpeT5tb1QoZW5gNighWj56bnt8WXUpNTJGOHY+ZEt1WndgfXB0M01zajc3SGB3KlhGPlhGVmB4CitTLUp2QWl0dm96LV5DdHhHb3tYKTBmRlRTUisrT1dedEhESnAkQj9hcmt7QnwhcTAyfEFmV2JnUnBkWSVlNXxhTEZ2UX4lYDhXKHgxQG8qCit4cHF+TFheVUVUO1djbmNadihSeFE+M3FKMVJnZjt1aTR6ZiFYWit6U2A3aSlWKXZUNmZ5cG1BYmhwKiM0Y0VPPzR1PDI0PzhXOHd8ST9gCitXJW8pdnxsZmZ3fCh6czVTQiNpOW0kSnIxakoqNEI2dVIlNmxEXyN2IUQrMTdhOVV0PHhrc3xvfmB2dXJJWXt2ZShfITYmYC1WVENSUHtrCiteMkd5KX5Bc2xyPih7KlJVRkJUVHA3ZnA8VFlXVz5LIXJWUjBfRHFINm9Rd3s5Xz9nUF85ZXoyKUN+PiNYcWxIaVppNUk9NFU/I0l3ZUE3CitNSj5oYFhIVyR1YyZIT3M5cEV+S0xkTEpJO2xZTU4hb2lBN25XYV9YS1BAWUdnKyhzLUIqezNrSHkpKSQoWW5VYypgSTMpVFpzTjxRcFM+CitmOFcwPVdAKm1pYSM2LWYzUVByU0ArVXZZQ3E0RENTZSZXI2BJRkg0PW99I1RDajNyJig9V1FFcGdsaDIkXj1HM3NLU0o7TzZiTHB3OT0+CitBT1Y0I1hgIztxK2lla3daRkozJjt2IXMpZz9PNEA5PHxSczF0Ylk1Uzl4RkhBc2Y1P1FiWH09TEA2RD9AejIyTzUla215OXdkZ3l+Um81CishTWNEK3xkOTVUUEBHTWlkQUp8Z0JVR05IUGIhc1lPV0hMQnVOJk93UnVvR3FaSHJYaDJCIU00QC07MmA9UjUhZDNsczBpfS1KZjNrV0ttCis3XjREKkxlUlFRWG4tcTAhcXhPQlp9JEdVSk5vOSNWYW4xLVgmQz8tKygoSFU3SUpVLU5Cc1ZIPG5YUlByNiNNM0hAR1ppTj08bW9RWGRHCis8NEdyP2pJZH1JfldFWE03IzZYdWg2TXRORT9vcylRMjJrPCMqZEhAWig4VUpYYVRvRzZnYGUmNSFESTFPbnsmRzdFOVE8cipCdnolal8pCis+RGp0dyZZUmtLdVI/b0pUYG9HQ3c+M3ZrbGtOXmYjczEjZilyNVZmenBBbzRYaGcpYm9kZlNVcCRvZGB3JXRhczs/b1JObUFvNXVMJWZoCit9KDhzZmp5eDMkY1MrSW1nPHhNSTV5emliWmxzI1lPM0h1Q0NHSD0zfmdKPT54d0NXOUY/QWxwZGp9dndIKjswXktGTWhoKiNNUiNRLUNyCitIeHs+Pyl8RFMxUiU8QGFoQ2BINTArYmNSPndBb0Y2JkQje3RvUUN4MUZhSE01Y2NoJjk7e3pkLVI8Jnx6Iz9ZVXlEdiMhZit5eU5hUWVJCit+a0EwYTZHfmg8X2FGc2l5X1JTdTFDb1BjKE9+K2N4Rkw/WGNmMms7eElQMF9TYEdRZk8tMW1zX2lKQ3dKa0Y/YmVNQjZkJSVqWjRieUZYCitRMU4zcDI2UEJSe2h3TERMRXYzKXYkZyUybTEwU2hgIX0jd1NMY1R0P1U7KFVlJnVPWUdEVSY+ZGY8UV5yMD9SR3oranJYfEdtNTA2WDReCitkTihAWmpGZGNGU3JWUEdTLWJ9M0wtKlJFTXs1QyhCQSRKTnlUQnJee1NKfXdlSSYkZjEwdm1KMjRnMk41LU9scUd+TFVJUzdkU2RBbHBXCitgaWw7V302c2JWPXA4OT8wVipuM0tRfm5TSUhERCkxJjJTUnE+ZitoY2MxP1RZTkYzM0JmUWw0JDFMMWJwOyhEbXlZfG0rRF9tQSYoSiZWCit5KF9DVThvbUZXZ19CXlIrNE5mUUZkIT9ncHtvS1FxaTFJXn4oekxzSCt6RFFyZ3EmRndnIWhFeWV5YmFQUV4hMERPdUhZSXVJPHRicnJOCis1SDFoTz5CSEBLKCRrWl5aTGtCTkdKUmhsNlVjKTckZ3drUX1aeGE7Tz5ibXh+PD0tTmcwWUl5WFEkUU09IXg8T2xudT9xLXQ5PTQrS0IpCitNP3YkNUpTTChVK3IjKVVKdjV7VColPzhzTXRrWjJuQFglVGp0K3AxVmg2SlJRfVNnSnJ8WjwmWjc7eFMycFE1K2N1WXx8RCFyVlh+VD5GCitKSk1YQk0oaENEd2tRPnFYZExJO0JfX1c/S3RTLUQ2aj1HUmRydGE8REBqN3ZFP2V6K0F0LWkoWW1rSHBIUSlSP2dgbHJsSz1Ee0h6S0NHCis1bFN5TyRZSkh6amFNY2E7T1VEMmpxdWwhKitHQ15gdUJxTV9OOExZVzZzRyF7TVJwSyM+dGAyTkZtbmMqN0wjSk8jeThpUlRpVEdRX25jCitiVnRGU2ZINTFRTkF4fUdlR24lTGxQQ2UyVzZIOVluOThuK0NKPXs9d3hIMnkqOSM9ZXxzQDdVVCZlcX02cG17OXVTVDd9WnpgMVRqJStxCitaJGtOJkA9fCNOJXNhPlIkYHt5YCMqPyZrZHZ6dmI4a01wdSRXM2pyZCpMKWFaPCVPWGM2bCVvUk9wZXQzJUVxJkNJaWhnblJfSkdTT3smCiszJH1DcCpNdntifHdxSURSQCNBNkRFb0MwXz9IO1pafUxjajw2Y3hUelFRaSo2PFFOZWU5WSVBTmI9KTRVNHg2b055Mj8raDJDVXJ5Pz5OCitpOzNAIUxQZlMtPTBFVD43ZyhfVT9QPENobnRvcm5SdUhwSkszMTtOKHdvR35JVWNKQyY5JkRiTD1GYyVrRCNOLU85ZlpqNlQ1O1E1SzEqCisxRnswKSlpOz9PfG1KVX57YiZ0KW5KYDxLdyh2fSpgIXBDT28tWXomNCtRJlpHIzNYJkhFQkBDYDZvMHZNPU1HKXFWP19TcUAmKj5PVTlxCitEUD1RPHo9I0VsY0A1anRoTGAzQUJlO3JNdCZQVjluM3JFe2V8K0YyMXElZXxDJE43MnV9WGsyQjR7Z0FCWjFpbnxOX35hdm9tfnk3WHlVCitTZ31BMWtvKkVeN1hza0pYK2M4bzAzY3VIfkF+S2hHRlhDQ0l4dThqYWAkK0xNWDdDWHRqQTsxdn1pKzJzRU5QKWg+QDZhV0FLMm10ZXk3CitEcWJJREdVVl4wMDZ+NjAwMUJXMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNGWGttMF5jeGBNaGFDei1wWkZBZjxsSyFxPSE1d2VQCitHcUVJLSEmbTZteDY5WTZ0eEI/Y2Q4dGpFcjA3NXJ3OGw0QChHNGtFY1MtKkgwWiRYYXloKFBGeVdLQ1ZEKSNgNT9uZHs2MkdBVWl5VXFICit9eHcre2NoS0clfnhwNVlFX3ZfOHpAVlp8dzl8bXpse1pwcjF5a0dRLV8zRzRsU1NefSREe2h2SEwyVVQ0S1JGcTdIYlM+UEBYY3ptZE1rCislSVcmWFRidWxqK25oRitVNV9gdHRkX3g7flVAWl9aQ3l+dUMqIyhDcFJDWDx1UDdtdXpSY3hVUChPc30xdjlCP0F5I0ZtcjA7MXJTSjZiCitVJCQ7Kmd6YzxXeVM1YkRgej1wNWdjYmFaMUNYKn1XanFjRHhgM0MkPSZQKn54dnckcVI1USpLakpiVCFxRj8xdl8mdSktdi1EY0lJaGZJCis5VWN4NGk5Q15Qb2ghWFBZe2x1cS1IMXx3ZnY7U1AtXjF4UXkta1gpVSoycT1KRStLdntLIzNiKXleYHJLfDBmYjcpbip3aUNGKEN2YkI7CitTS3dteUFUVCV3QTwyWVJDTTIxfUdqPHNLM0clP208U31zKSVnS21pP05BZyFuSGY3SlNxOUR8TCtjKD9PbWpqWHspQ345SnErMlg5I1UkCitCaUFraThyVSotdVkrKiY1WU9Yb2E5OW9mfFlCd1RFbjx5fF5RQjBpN0VPKFRwIzQoOCFRNXJ7Zm5JZjchRCpWeWFzMGcpaThEZ2szdH0rCispSz1DZV9sYE5lMzVnI2R2P0NNOCV4IWJ4czk2KiRaIUVuYFI8bVlVPmVEU1QjYHRFYjUzU34hYm4kbCVQMTlHcyNzPklGP3ZTfm16eFJ2CitBdThRS1c4YUluWVd5U0tDUUZJRmA7JFpsclRLbWlvcnwpU25aX3c7WnpVbj0+S3g2WEY9Myh+eUJmeHIkYiloaGoxcTJTJU1ST3B7Q3RDCit4c1IhRmpIcFpBfX5gNlc9ZGVEbmV7b05ES2hKR01wSTtaUDFDRng4KXtkPVBEWTRqYmBOSFJTbXFoYTg2bFFnIzQ8dUdeOWB5UUEobU9oCitHQ3Z9WW87fncqZkxWeWUlfGYlZFN4QSVHOUxvcndFSi1afitjVUV7bU5BLT9uUyhLN2o1enZhJVVFdU5NfEU/eVdPVEErc2FjZFBPXjlQCitCTy1VOz1YRmBfNiM0K29oNk5XaTNKUnVJV2EqSldeIVBWU2ltPWxKJU1KJVRyJVloaSNpSUN5QmcoVzlnYT1aMCVmK2VARzxPRUFAdm44CitpJiQhJWBybHBERnBqbDlzZ253SzxiWCU1KGUweFdFajZja2AjMTF1PU8hVWtBU2ZRMWRHcGx9S3NQRHhpbElXST55Tj8rZD5DMXE2VW9CCitOXitwazQtTUV5eyR7bGV0ejsweTdsVFAtMkdVQzNTKl4mY2wtN1ZsQTBEUzQreUQoazRsbihpRXZhTWF3aUM/V0QxaE5sN05OU19OQFRUCiskemNCX0d5Vz1mU3Rfdkx1WXR0RlMzZTR1N2NRZDs5KFZNUjZUamRvdkR2cCF7V0lHYWpObD5AP15DIzR0Y0pjVTRDZChXaXVwQlk9b0grCismUyolbHlLSSk9Y3lsZjY9WkhjISU4P1ZleHs+Uks5dHc+Y1ZFe1d9c097KSRSSkpNJU1WPW10ZUJCNmpCaTBTJFlFK09gWTJ1MTAoJTlFCitfVnkoYCFLV1U7SG5ZTlFzZk41cHlWODY/Y01CQit5RXU3XlQkXypOMkhhMDJeTFojeT5RODlXWShARWwkdn5aPVZFfkZNWG0xbVorQClGCit8Y3F0ZEo5Qm9rUGZmTWtOZ2E2KnleXl9vQCtVVFMydFVSNzhhVkV8c21SeWBzMEVIRTVnKERFYksyRDRLOGxMT319eDU3Q0luX0ExT0M/CitUdUR3O1lsd0c4MCF4R05zazMkWn07WlNFTjtxWnBeKjtTa3VhdStKb3tWR2VoSG5IbTRkfWUoMGpocntAQ1NXJX1nei1JTz8kS0tYc3g3Citycjt3ey1pbHByLTxjSXBkSyh6N09oeW4tU0dSe01NS1hWUVlmSGhXPnE/N3dsQU1HXnNJQjVXNm5zd1M+TSRRXzNXYWFUNmlOTGd8OzRECitlMHNwfT9QMkhCPkZMfGtHZX5mTzF6UXktcVolfGRYTG1AS1R4aFNXa1JBLWV0azVORlJfVVJmKU9BQTNSJCFgOVhob3FPaWVpMURNT2FKCit1VlhsWCREMlN0WGt0e1ctNyVrMXc3TF9xXjYzZH5ZdyR6Q3p0NVcjR1R6eXREVXRqMFUjfF57K1UyTCZIQUVTKCg4Q1lvTVYkcXlSU2FYCisqIXg7YT4pazlDJml4PjQkZWhLMTMmJXlMc0dGbllqWF81cCpAMHx2YEFzO3RvMDFFVkomUl9lSkBjVFZBP3t5MXFtb31STHlDciM8LVBYCitxSSlrT25idlkheWgwbEE0X19EQEBYZ1pTNj5yclk2ITxNTX4tIUZpZyRPQSk3UXNaaWB4cUU2dlJtODcpZD83OX0lX2xGXzFNZnZwMGA9CitQYTxiQmwoO0tUZzR3JGlsTXBXdlY7bnwjTSZXT3YpckpPPClvRHhHX3N0a1FuTGheUyVSRT0mZlRxSWleYF9KdFo1IVojSVlxQkorOXsjCistYU1xVERLdEFTQ3MqXnRxKmhMQD1KcG9QJDxeRnVPSFF1bDdTKzVVJVl9S3NDfHMoanRqYDdjVHYmSnVeMH19Kzd2eXQ2QFR5aUE+KGFfCitJcjRgalp6QTFBe1RCYjZ2XkBedmZ1OGY1MzBhRFRkUWY2a3Ftdzdea2l3VEdCRSYwSmxIITdjUVUpaEx0Z1h1PTg4Iz8oYmRnODRUdnBRCis4MDV5I1k2NitRTT5ZJj5hWUQ+ZyReQiY4PERzKkRVfnVAPXQ4KHFUXjNsS2p3QGlkJVotIzdebk50fCR0NVczY2c1WERRQ2BjSlgjR1k9Cis3aEEpMy1fWHNXNzVySkJsb2FvPzlkUHRwYmJhYDhQNz5CYGIram5uRS1zbktaSC1sMVomaE1sellUbGhHLWdTKCUoPGElKDNpSkdxcjlOCitUI3JNTzhTMU8zfmQoQio5JkR+STg+UilrTVZ2SmtBcW1YPTJsYSVXYUhZOzNzKk5oWFojOWs5RSEmSlE2XihGSHU2WWNyNnwzekdDdGo8Cit6Q09DLWlXR0ZHbXhmZDJiZj1mKCZyJUhJOVYtUFU9a0x+dykkfiQtWWsyQnhVRlgtY2xhbStELXhrQnxgZUFUfVRYQ31EY1ZiVkklJkQoCis2V2VTezFfQyU2MU1RJFdIeXhkUHVvV25uamsoXk9ZUTd0ejhAV2VkUXRuekU0enZTR0FiMi1XVlZreEdaJCYxSjc8eUhHcmRSQVRrN0BQCisoXyZuQn1gQEB1fCZFQjN7JkUpTnZXNG1lbFcodWhvUChLKEdZXnYkcjU7ZTVPUFYkbHklI3BxYGoyJnZKdF5tM1paI1VTcF5kbnRRQW9qCitLaWw8MHl1K1NWNjJtQDkmcTNWVCQtPipIR1dRUzhDTVdtblg5cTJEeHRpdXhoe0xMdnQmMkQhJU4rKjNkQEFfKk9qTEU5TDJDVC03WlFXCisqMGp2YTV0SkVyRV8kcllWejVSKnJGUkg3cm5EdTU2KU5YbUFFKXElRlgrOGV0JDJRYShhMHk5PX4xeGN7UHgmb3NlTVl7T3hBX2FOa2Q3CisqUnVtTmE8WmpaTyppaV4mJUVvSV5YODQ/OW5NQWJER0I5MEg5bUxkMlhaQExlWTwlTzJOTHkwQGMlU2lJa15oWnNfam5BYChBN1lfKHpjCitgP0BvM153b3E3YVNgdmVBR3JROE9fMiFOKjdxc2g7T1BseE91b3hhVEQ9OVQ1LUp4Vk5IbnRLXmIqMHNReSV8Sm4xJihIdThuSDJyQGhFCit7eWlRdkQhcHs5RzdsPyZOKShmVipKX21BeFYwV2o+anF5RkFHM1kwQFV3Q0xxeFl0XjsyUzVqQHlxUWg2TVcwalExd1JGdy1nSTttdkB+CitpI3F1dFJTU2wpZFg2KFJhP1BaQkd9ZmApKz8zPFFYV09jRDtKMy1wdWdqXjFxJF87VH5eYThoeHR1NHpKaG1nKnFnaT85MEQ4N3RAbkZ7CismK0xLO2dOblU8Vzg3V0A9cVIkVVpmOXt5RzdzMih9ZWMtSzlEPXVjUXo2a3xMXjJWVHBZcG8obW1hbFE9KF4lY2ZGTWRyelJEfD5mdWdvCitfI29gNlQmVjRLKVVIa3NpU185JnJyekV4K24kY0FBaWRvSjxFWl84NzBrMXhiYldrcCRaYXV2eVojelNtcHF1Q0wtNkBzQWlXO2JVaFVeCitHK1dvQjMtaXA1QV9rdzFYUSpOZkM+VEc2e1RGNjhCbStROzg8PXlHTEkocGJpcWVtNHpHd30kfDxucHVyZGc2UjA+a1lhKil6THpMbk53CitMZFpzaGYoZmc7Nik5b1d2Jm9vUmRBZjFfVDFGUGE1az01YHlyYWkmeFB7R2lEMTc1UTl8U0JtXm1rc2xUTGQyK040cHVmcWI2MWk2N0NxCis8QDslJjR4Z3NqTD1KRSNgcF83SXlNZ29yYEZrWl5acVFIPGErdytTUWVXOGdeelUrYzEheytWYF5WeHRGQzYtbzJgPWpaSj5DVENjdnBUCitZZT1BNn1pPDNtZmd6WTw+aSZFXjNHMFFVITQ4dj5nd3xCPmd0Rjh4VnJsQj9DUDxPPGlBOFV4fnM9RnpJeUU5c3xWTmY9ViRvdkt8NkU7Cis3bkNVKWNaeE92MkFXM0UmT0Boek4qN1RfM0Q0eS1oeCFQViZZVXhKWU9aTDVZMzI8XlRJekpGO3xET3todi1CWUBza2o9MjVsQVBiNDgpCis8dz1zbFQxYDQ0VExNP2BjcilVUnsxSj95ciEkRjk0aDt9anVnezJALWRPO0pTKD9wPCpJdmxqNjQjWSUqaih7MThKXisrSyQ1a2l2KWloCit4VShfeHJeKG55MzZubHhuU0FnJk0/Z3wkJCQwbClEPDtabGYrTHM2cTYoQ0t7RGlSTVo7QC1ZKG1ZOXREMjFiOVhmQ1hPTz5ZT0dGRkdmCis9USNJY2Z0JTFeN1poMih2Xks1ZCg8S1JaYDMrbWFreEUwZlpUVldub0FpZyQwV01LYTEydHZlLW9AZm1pfUZObFBwaEdHajw2I3VPSGVECis+cW99ZmclPUchJTlzdipPPDloQEg0YFBWYVhVUjhOLXNYaENGTEEoazllX1d7VzhXYDZwbnhMKUxORTFORXNCZlkjSmVJXjJWcysqNUF5Cit4cEleSFExS3pfJERyXyUxMFVgeUZMXil+Zzl3eVNobDlkUGp3SW5vT2RldGphc2JDOyNLIT5+MlhIKVRLO2FNbzt7YzJVRmtWQjNrbTVqCishMH5gKWlJSEFJXlBxPzZQMDBIbD9MXlcyck0obmxRNT0lezBRfHZXanVNdkJWKmxRbV4pX3dAZXNpUCpZMH4kZnRISEJSeD8zJSleTCtGCitHRmIpWFlzR0NCb25Ve0YpPylDcHotMjZhKnNPOTU2aDNAfmlPbmtBc0gjVzJpQzlzOHsyQSQ0TDx2Y2UlJiElRzZMTXNuMittYVQ1IU1UCiszd0R6WnpMcFEmIWFpOW0xfnhlaHUoemFPZ0NpYTwyaG00ZjNRUmtRKEdoNk5JMWBDUm15ZlFnblZhKnYxVjMoZzJXIzBCSGI3MTMoJWUoCitFeTFDPkNoayU4ajdidUpQaVZBNUoqRlRHfSFuSm91PmBYJjw0NUQyJH5TTihOSnRId252TkRURXh+T3dpZENxNmpoNjtUM1klUiFMPG1rCityUXE1eTAhXnIrPTR2VXA3UXdYP29CKW51dUVxdE9aVVUjOXp8fHQ/SlFkZyVCSm57KFZudl9+bG9ZWEpNMXVKUmdEfSFXYUgjVkQ2blkkCitmMnx5P35eZilITzBXRTU+ZnVtQ1pQU00xbUc9UzRvdn5hSFRWJGlYcE0hR3E1a09yTH1maE01aWZDOEB6ekBuNDhpPE9UWj8henZAJkN9Cit0dz5LTjEhTlhJZEtTM3xaMjNvR3gqcWZPQiFMWj9CZWlfdVkrdWppPlhsezVmTktzaml1c0hiKi1xJXxtNUtHWHNhMHw1cEMzPE1ZbVgoCiswNExCa0k1fG1QfiNLTVdaPD1yaX4mezJ0XzBtSEp9fGpGPGd1eDg8UnpiODV4Yk0lYDdSUzQhcXxMYnMkIXw9K3V9LS1GPWU2P31ubGlQCishWGdlNUpnOChibnBweHB3fEt+ITV9Njh0RHE1cWs8Tm9fU2FuR1NidWJkcE5Qdi1tTXUxaWFXVig9cEhsUFpnRSsoTkVMaEFDOXY7e0BUCitVRV9nYjBKVnd5Zk5VRn0oXypBO3NEbHdmVmpWTylqQ1lEUE1ePzw7bU84PShSWGNMLSV8cDxiSXQ7WC1QN0IoaHF1aTkwcEYtMWpSVnFtCit1ZmhKKDc4cFVeZ3E3aGdESXhJdi08Kj1rUmJzRXFQOVMqVXMxX2NZTD5kWDBNQyV+R3Bqd19xSVItSEVIM1Z9fWtVQjhyLXdKbiROejI1CitVUl5NMVlqazFMYVB7VHBCWHpnTksreylnMVJwSUZvYTxTM3ZIUFEjRFl1YFBVeDFRb1RJWV9FMjBLKiFwWiUyZmRJbmBfZ1ozWEBEQ0dFCistc3h3eGFTI29mdHpfKk5NTmxMV0YzMlNRWTtFNjBpWHMzJSRlST8oYjVfZU9lKjVRKH1FbUojfDxxZVhLMG51NUA7Yjh4Sih0RV4oczJjCitYMHpCWVZyWG92MHYjPmIlTUhNdDIrNS1kR1hLazskITgtdVBZKUIlTGtPc2R4ZTg4NH1Me3FAV1QwS2FkKkVJOCl2eDFle3p0TyFlMVppCitNVD5WO017MCEwPHF1Ym4odj9USWtwRUpDX0NNKl96cUBEYj5nPyp9Ym9UMT57UG8zfkttTjxfSzdhQTItYHsqanVrRCY4P3xiTFp0OFUkCitrcDt7fmx2Ni0meGNjTC1oNXp9e3FjVmFhaG57cVN4PygoWHwrcmFRTntDUDVkUT5lWmN5fTRQZTdRQFpXdj1fX25SMngjaF9peG5ldV9OCitEYnd3dnw2dGM2em43d2QrakJ6bDlfY2g4QlkhPzV8UGVeVHkjQmk+OGppfWdkajZiMHtaXll4dHk9SG5WdEhYVE9rYUA5VTVLTCVFPEgrCitQaX50XkswKWplNDgqXmFTNj9IQz44LWRzcSh3dDRiM3sqek5iVDYxZWsyT3ltazJHTWBXKWJoYjUhdnAzMDtDYHJ2SCRCdnVXZ0tmKmUtCitwSE57UHJgX1ZkdCZUKDgyaVh0QU5FSSVgO2hiSVIteWRrJm8tTnp3YihSNWZ3IW4xMX5EZUpkSyp1KXpuNjswPilGbjBsYyZ+RHl9NDYqCis9bCNHcEw7cW5oKylnS3RPNkZwK19YPUE3QyNRNE9tYDtvanowPmZPZEtYKVp3fkxqZE9nT01HSW88eiVQckw3cyRNNWwjdnMqN0BxX2ZrCitiJHM9OWVPSlduU2RLKXlrOWZ0ZGgqUk1aKF87Q0tnS1ZOVSZ6TWl8VGB4PnNpe3VSTmZ3LSlNY2Y7Mz1mYGdKaUt5a3J7UlY1bCZNXzR3CitFfFJnPXYybSUzY3koRUdIN3tzbmYmNEtVaG1XbFRwQj1FKiZgMlBSJChQdE1MSjNOdk52QE9KPXZmU1pqeSFyaVBfMURERlllSkE1dTRiCituPH5EP1hZK2gpRHtsbFNPYCpTNFlZaF4mLW1BdWNFZmxRR3kzKG42M09nQVd4bkV5OCtgWnJvdipRVUt2bH1UQzt2b0ZQRyh3bWBgVDJqCit7QHxxY3BVYkBgUjxpVz09QGB0OUt7M0VOPF5HM0pZRzB8a0A+eEc8Yjhnb2xIOSV+e31qa0BhMi1jV2Jeayl8PGo5WW0tQFdLSmZgP19xCitkQUNAI2U3VChOKipscykoZypke1AmeG5vbXRRI2QlR0FlcXI+UD47PnFmUHJaLXAhPDRBKDVebC1AVik8R0s/U2JAcENZWmNRPEpZQ2ohCitaNEMpbCN2WiFFflBGX3hDPlVTUlF2cEE2Y1VZXylAQEJFalY7OFV7WXh1flFZcl9VcCQ5Nmg/cCRkYigpZG1gRHhZLV5SYmVeUkV9YG99CitHTD59ejMleWJDKmFodWBUT3xNRmA1cF9EUGJ2bXwlRkVXP3pNa0QrTk1HTFN3Qy00VllJRk47SCloSTRXTigyazVeWSVQb31lQnN3SEpACitTVSFZKGNIUndZMXh0Y2lZPGtKJmVDO3BGUm8ycnw7Sj5pVDlDendQKHR2X0VYK2JxUWwzWCVmJFJEViF6em11TS1ZJSpjUWdgYWp1XzlvCitnQDE2RC1xQDQ5KDRMZ0o2NlNwcishKVM/QjNufSpeYkpyWkNDOXgrZkgpci0rfCtnUiNBLVZCfm04Ryk4fUVlPHZEKDxjWFlYfCZzKlkwCitTNzheTSQjPFcqO3JIcy1JTz9+NnlVMDkmeUx9KTRTZjdJOVA3dX5CXzB5QHREaHxJS1RHOChhbTRySTxAT3opeCReUWFTTzlLUUgwMDAwCis4MFB+ZD1OMWJZajNEWF9gMElfPWowMyFlWjBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFFjS2FDTE5aYmFHezNaN3kobT9MQkxBK3NLCitqTV4oJGJnd25XQXhteStLcSVQSCVYeFh4PzR7Sjcqdyl+UF5wTk1RdjZTT0M7eGxsfH00LVNhQHQwfkdEdSlMcXF1bTNZTyRPaXhjd3pvCishU0JTSCZ7QXhSfGUrUlY2TWlxSTZqblJUQ3dYeTJ3X0l4UkJvbShKWn1BPiRKIVIoSkRgOyNZfGplWChPczZ0R0RJfHFEOyV0I2tJKDFNCitLITleVE1lZlh4Nk1VIVNCaFktKFh6TX13ZUVZX0gwOHhLT0dWeW5aSypiI1g8Ri1WbURyTVNNJDttJW48UV97O0ZJXktnUXpaKHNXYGUhCitzJD5lZClxXk9ociltMERIMDt9I3ZKfS1jc1lNcWdrOzl+RXpKTEtBTVZWQiFJSnVwUXZWcH5gQS1kPFBObiFjMkYpZWlLcj4yNkBae0JaCitoSFB6a3pSczxpWCRLaFFnWVVtJmNadUV2KVBwWWJAV093eUVJQGtvKFlDYWQwbjd3Jl9oLT5Oc0luOSF+Yn5eV3AkPEpjaV5rb25IbCtiCitCd1lkZDtaPFVfVTEoS1YwYG1SPzgySlpmbipGUkV4Jml6djtiPTJBcHVDNUErKllSbE9KU19gWk0oRWU1QXdQPD4weiZGYmdRQ2FrMitMCitPM1gwUHo3cmJVPlc8eEE7RE80QDVwKmdFTmZxLTJlPikwNypGNHVrJUdGNGd2MmcoSUNobUc1KlBDbiM4Wi1Le1NiOSNzQ0ReS0VGPH5iCithdFZJRUg1dFY2PlFAb1gjfktGJiVVbjQ8TUhtMHtffnZ2SiowbjZzQT1+VXw5eTUhVXRZa00pOHBndTVkVSs2VXJ0WD89LTw8P1VsMG0/CisqTUdeako9MztsKzgmdjxOMmN3dVg/dHdpb3x2e0xydFBVfGR1ck9BbllMJTk/WVVgdFpyV2Ekd2lsLUR3UHx+OCs3MzxJcD1tb1paQVlmCis8KnQ4dit3aURCS1Yla25rK29eOGI5cVRzdz4tMFFedChyPihGc2ZIMk4/VSFBNn1mMSl0Q24pTDllbntnZmhRNUQhWVlhQ013QlFeWCtCCitGVTVJPk51RDlMQmh2PVg/LT9lT1IoWjd2bEVXUVdVWTFjQ2AjcnZ7WShRa1R7aWpHSlBXJjdoXkppckghXjBBYGVDbk9HemxnTWs5QV5mCitzVXJtMDhqTlMxOz0qMmYlNl8yKSRsU0ZDJCF6OHJ4enVxODY3O0RgZF99ZkhHWntYKG9EVys0IU4rSHxzdEVBb088UHVVfVdrJiZSO1NACitMd1EmeXdtUyppTDRnO3paKHdfeDRnKE5DZD18ZGNmJnFxaz4qbCVROVFAREJxZjdMeyY5K2I/Q0YrMC05aSNGKmtEPCpEfiktcXAqKz90CitQam1+MyZ0fkFCPk0+Nj5seE1vLW5RblEkSWQ7JFdtPV93IzMqR1dzeDRobVF5RikkWlAod009RWwwWkxjeXNLSV5fVVk0PHdVb2Y+WHleCitadjZEaFEoMGBxeDB3JXFGUUxnZjd2cjE1fEplRT1fXz1ReCMkTjJCd243LV9oQF9xRTB6QzBlfHpmVFY3JVR4T0RPbiFOR2F2dH41JHtyCis8Q0ZyOD5zcmVHb0pGRjl6RlVWcDNvQD0re0taZWpMK3swNWY2dyYzNnhoLTdKN0BIbWQ7VzBZVjdUVGBiUmJWYnJjdngwPkRHUHhHZiNCCis+OGkxb2tfdnFUKGpzQX1GNlBfNDZudHBDfVZjQFd7anJZK2pVcl9OV19qMXVqP2xSZ0Zwbj9MVk5sVDlTKUlsTSRld0w2QzVZV3M9X15ECisoRiZ5UFJwYHIwJXxUUlpYIUAqcHMzT1lDd2t3QHxNYUs1ekZ2c0xXaFVtfW4qeH5UOy1YaUpZKDd3SFZtPUV0azdPJGZFJlg5WFJJNTNOCismZCUpeldsXlZ1R2R2cFowd2JLR3VBYE1qYEQhXjQpY30/ezJTdzFMKH0qbDFSSmh3enB1UU5KP3taNUszT1h8XzNUT00pdn1mYjxeTD5qCitgNXp4YmZDPSs+KSNgbXxKQy0oVD1jMEg4PHwyQFpVRXZtSDtTQmglVCZoVWxaNjV1KV8lJEV4MCNZOGF7eGhURE1WITNgOzkpaX01c2tQCitqak9PT2pmbnkpb0k/Pyo0eWFDPztzPG5TT2cjX0V+a25zPlc1RSFGI1QtbVYoPGYyTE1GIUxfaDtnVCpGMCpVbzRvcmlkc0JmXmR8U05qCitScGYkTio1IS1PQXt8VFRkU2l5UTdOUzlTalR1VU9leWp6WXtmVzg5TjdfTGlgfXJnZFdfQW4jfXxibXVwQz9XJHozek1weE1KK3VKcHFiCitGZDhHQFcjeE5DVyNLWEQzNTN4b3oqZTtxWGN+S2VBZEh9e1Y7PnpvXi1QaGspOX1UZ0hXcilNclE/I2FOJCl7VndzVDIoKlhyX1hkaHFPCitEbzhIbU8rRkwxa3ReOV94NyZMeWhNZ0tmTitBZE9HUlRpRW5oIXZmWkkpNSQhUmh5a05xbWMhbT5zamRRfmItMlA9Y3ZIPkQmZVRRZj5sCis9KXtsblBzYG5pY2lYPnFfN2F3NikkVClMfFVUMDVoRiFUbUNjXmA3Zj1OMlNpdlYyN0RUZ1ckfT03QnIrPVYjayhAajhDMFliXy1sJTklCit5bEhPdWNpZGNAa2M7UXtadjcycGlSdkUlbHN4QmRHYTJ6ej9ZOUBnKH54ZEo8aDt9TG9zejNMantYcTRLJmUqV3EwbzRpfiNUSzUjSVlBCitPYU0hRV44cTB2eGM3bjc4O3pHfDlvfFk2YWlYfEMpKTB6QTVQanlpOyZpRiF3UFAxYGYrdGpzRSlpXk17WTNFKD9oMm5NJkE+eyNJMDFRCitCb0J2a2h+OWYlX1ojZldWTUw0X2J+azNtKTJfQmtFVTVzaTwqMz9YXzRuTHJXLUxoSU5BUD5LZj42MFIxJXl+UTd3SzwhU05DVnQwZ2l4CitrMjJDYmgpeHE9K2J6a3p1IXpmflBNVzRORH5OSVdtfEk5VCk/NHZOQXY8V1pkaV5iNUhyQiRoIzxzTG9CUD4mYHcrWCNOR34yamE0ITxOCitSZ3d+JHs3Rz03NkBsbGR2UGpPcGo9YD9NIUl9R0E1NTttfGZyVW94byRITE1yamVUfVAtY2Q7VEVFSE5iOCtWeElOcC1pNV5CQl9eZShNCitfX3poaUZLKlopdXoqWGN+dV9IeGgtQ2loKERvVDg+NnduQ18laXp8Xyp6az5QSHpDT0BhUFRDfF8wQlZ7KnhXazlIbHZBYnk9RVNnfWcxCiteZnduWmckcGgpO19PUXhUKlZoUEMpKjF0U3FUN3pSdk9NNVJWfFQ0YnhHJXowI0tFfXtuMFdkS0x2V1NzdkNrbHwjTkhBbTxQZSomejVwCitMV040a0hfN3lmIXYqVFF2bFcqPSNXQml1Y2dhVDNacilDeVZTKipDSUw5SyEma3REKWVfK1MzSVVOS0gpVWpIWnp9fUF7T0lIa0J6S3VUCiskPGhnJU5fR1puPU5Kbks7N09vIzYzeE1hNTlLejRfQWpQTU1vb0ZMNmlEJHp1YDJfRiFDRkNhN3hYbi0xPFZDUWFRQnVnaH1Le1ZKeWVFCisqbV5QWHcrKlRyR156Y3k+eUBCQU42d2BFYGlyR01wVkc8LUdJOVQwbXp9U0JRVCUzdVReMjhZTjlscmt3azxKcHRWPHYjaERoakI8Ykg/CitPU1FkMWY9MHo0RHV6RVo1byNMPnRKbjl7ZEphWWNrcHFMKD1BbUZ8eCF2eXRZM1heazgrVFF1YnNYOSZ3MHB8O3AwaUtqbz8oSS1UeyY2CiteUTVENWcjX1JGOEtjSSUwWVMlc35NLWJhdXdLWCl1OTB0NDZLYEdAQEw8NyFjSzJBeWF6PGhCbGp6QyVYdWUyYmh8eUdVK35hSHthPWVvCishZExKbEYlUTswdS1kJXBYPnZBOUM0ZkZqUWJkIT9DeClsMHpJN0MmMG1mX0pebUs3U2d1OW8wTURFeDs1bFVoVGcrWTA/MFpuJGAlVi0rCittclVXQHZ5ZVVucTxlcFVLeTYyQ0FebV4ke2B+VFIqUn02PXEkTStkO0h9RVQrPEB2M3omJHNsT2hOamwoXlh9TUpuLS0+SnAlYEclcDd0Cis8aTQhZHwyVD9DeEhTXil+NzxfeyUxT1hzYXVAaGNsV2MxMFRUZDxgN20oOCh7X0stP29GMTYyTmJabF9xT045PW1PJTZhJTFNU0tQajAyCitDRHdgbn5UZGZVJj1JclVfQTJrRjx0am0kdDxfN3dwXkUwdllGUEsjQm9sM1kjejJAbF9gbVlTbURBWEk3TllKRUhnN1BnVmJQVWhSMzhHCis7aVc2PEtZMiYpZDxsMDV3bDglK2JmXz9KM3olYzNARDArWEdCLUVwKzs2Zl5LSjByTlVXKjNHQHdiWWp0M0BoO000QWFzNDNBOGZzO2BCCis1QXcwTEVPeWZNYy11ZlYjWFpYKFFCbzVFbDZDKXlINCo4X1RPPnhEe1RWTncmTVppcUk+R0lTKWJ7M3JiT2w8VFc+ezJkV3hibGI7U19UCislLV4hTGQ2YThAcWhgPVB0R3d5JGU5ZDxUKGJ6IVoqK1FCSzJicjchPWk3JTBwYyNRMmlZKl9DYzlMb2lqemFlJlhmT0R2Z0pgKHhyODViCitRQmtBIVNgMjc3KT1VMlB3P0UlczAhPkdybmU7RG4wTnRfPDEhQHo7VylSREM+SGl2JkNOSHhxd0FWOUFCVDgyVC1SX0pffl8rMUlSTj8+CitzPUhHPyRgWSp5ZVold0dpUTRPcEk+eX5QP2VjTDN2dmtgWntgKmdFa2ZrUyVUflNLeXpvMW55eVNvdXBZWiQ7MnA8aT95aEteOE9TfU9pCitxNypUTFF6dUdudEojZ3B1WT4kUSgmI0haIU5fUz9sQEheQWV5cFlLVzZLS1k5QjYpcSRoX1pRa0dzVTZnN0g2PyVPP1Bvcm9GaWBjVEkmCitDYVdfQ2V8JmZ0bWtLfW12ZitDZ1hHXn18MitNR2tuT3krIzl3TCR2dCZ3QipqZW4+OHA0K05hV09aUmxISkA7JH0hTWZIdzsybnNGUF9DCittfX5DOzAyPzA2NDdaKyMldFY5YHhZdEhiRHZXYG5XTGchcVhXJXNwYHU1USNGdmx1ak9DUVNnRiZ9WXsrMTFfMTNyQ2hsMEItMjxIejZZCitwaCEmT3dJRE9hJHYoUkQpfDk0Tm03QHhAYGtmcGJFK0I8c1h5NyNENEY7UUpxR1B6RU41dzZnd1BPd3dBPDczbiY8NkhEIURWYS07VWc5CitIa1dxbmNYcmk3bCg4PX1aZiYtYnh8d18hbk5mNzc1cW9kN3Uwe3dUZUZVMUdwOERvKTNEMXE1P245KipJSTt5NDVUWWF8MElnVjUtI09ECis3TD9MPmRzM1A5UG93UXE1PUprdm5LSXMlUVl2eCUhJTteWnUzbD9IeFQkenAoZ1BKblJXQGR2ZkJjSE8hbVpSPn16bW00Yyh1P0g8dVY1Cit8WFMrQGBkUXAzNm9kZEYrIUlsJHVjPiRkcX5EU2V3fDI7Nl54LU4/VEd2OWtsUEMqMlhUTH42bGhlLWwlamp3KlBFKDxtYE1lS0RoPE8lCit7OHpEeEZzc3xyQEczMj5vVUM1PEdISXM3RWdjS1NmfU5nJms+LUFZPkJ8YEFMKCtVQFg5RWxjbHl1WHFxZVdHJCUzanxWYWUxSUVKSmR+Cis1SE5DI1deZERmZW4+JHBqMCUteU4pfFhVKGdzd2Vjb2E4eT9mKyMmKk43JXV8VCY3KnBgamdocEFDZ3FBQChpWm1ydnZZMz8+dTE0VFRQCitnLWJWPj1zQU5aN2o5bGlqZiFnNiQ7aGZWam5JTVBIMyU8S1Y2PVBmK2d0P3VkfUE3fWgqJUFWZGgkdX1mZHlqYDl7eDcrJmFLPGk8dUNvCit9Qyo4SzBoPjI5QmY2WlpuQW4qTHBXVl9VfVBJZH08YUhnbTBiMzVASjw2cWRsaiMwSnRkMFglUG9CbmRkMT49aVgjVD9abW4zSExwcmMmCitgclJOMXE8RHBwblJJR1JFR1NIYFB7JURKMXd2c3czNlV7al9nTDJwRWJZfG95cjZObHk9bz1OeTF8JSYzNzxpZFJmZTlpPloqMExKeH1oCispMjF+fD9JZ0NWJmghKE9DQmw0RWdqQXNhaTYpMVIzc0MzS2dxOFNabTRjTkg4OSE1eSUlX3lXcWdCNmopKGg8aUpJaG9oJWx7JG5TaVEyCitMRSsrWUJWek9GWFQ9PE1jZypIZyhjOGFqKiRzX0Zecz1YPGVyUj9yS2NhSncwYlBUVWc1enBlVVV2R2FIQDc+MUg1ME0lY245WDtNKDBTCis4fjQ4PFg4biphV3hNIyVMMl9mWE5UUDVZcmZlYG8tNitrRVpoeit8fXE+Si08X0prYDZPZnE0X2FwSldIPFQlaSo0KUpBdXlRNXtoKTc4Cit3alkmKSVjZUc5MTIwR35OJmBGSiVRO2dGKXYmRkAxRUMpY0ZwfCV7MEw/bUslWFNMc1lFViFaZzFDYTJ1Q3xJaG1waT4yKXMoZDlYaDYpCitTbjR4aE59JSE5O2grMnMzVE5vekp9TVVtMlNtbGtxSCQobzBUaXlOYFJjLTVtNXAjcTwqNkdWdUR2TXNPbTRCQSpsI1hYeClne2hEJnUkCis9VmRKSChycTd9MlBgTGswKWRfZytNXkl2aTkjKVBXSTRjMENSLV5QVzBBYGxOKjVLSDI+ZUVNaWtWMFQmJjYleVdNRFU2WGp0XmBQZW85CitZMWhKJVNNMG4rYCpmTiFiZyQ8QCV2STkjV3RVeSo5VyZrYmNeP2piKklWbUJLSmZLSCRCVHQ/MUpURzRxT0BwQl5oIU5JaDR2fVZQcGN0CitTRGxfJTd6QzY8Rk9VPDtzU2o8RzEoeldKKTZvYkQ2fTRMfUpjSjhoOXYtS1k1PkRMbjlzbGhscVBYYXQzRzBXTSZzOHFALW4kbk5Nd0VwCisyd3R0fWhCT2xfYFd8QEBPcHBpNlpHNkVZY3ReN09OM3A3bjVzQllFTSNtIyk2TWtGZ0xJMFh1SFlvMD5CaER2YCtIRGoxbklPZFZlWWcoCithLTFyZkw9dipCbHU8OytOfWJRcHhfekQoOE5meTR3cF5HYkE7OHlQOyVNdFBDPWVtUH1KZWd4dGxoMCRLZ2o2bTkzRXxEdXQ5ZUY7KW9TCis3Z0wxR0JtViE/TVJYUUVkezFTUWc4YzYpaUdOb35iUkRwTE9sfjR8OzUoRSVybGQ7bEtgcllRWHU8TnY5Ty1eTU1WN2YmITN7YEFiRmMkCit3eWtieS1NM2h3dTZ0U35VUmRUY1d4cFA9YWo5al5+O1FFTyRgKUhpKnFQXyMzPjFwIXl0eiZZd09mJjJhcWlfNThvakU5YEIxJDN7STxuCit9WVgwVSh5MCpCbXF2d2BNOW4xbUFDTH44fjRZRHg4eSMyTj9EbGlqQHlrJnQpSEt2IVRQQklnKFJLcS0+JldKbUhMUmNubnlHKkpfZyN9CitwTUwpb2NZPy1zZ0NCWk9APWlHMSM4T0h6MXxPTytEUCpkJEplWCN7aF5zcXRUcUUpMWBxPzRDKnpuPT9aTklVVWUyKl5AYlJCWENUKHhkCisrQipoZmZlUXxmKGQwSjlzV15FSyh1c2dGSVdjSEY1KEQxRFpvV2tXUS1obip1MUwzc0BhZk5zej1+SnBgV1UlKzErKlpkJHckQmEtLV49CismeUdxeEBBVTdKUW5yd1A3YkkrNmtmNSVPYF53TnUpdTx6Q2N8bDEyUDR9OTNSVFg3cnhATkwocTFDU1g+P25ZNm18dCQ9aEU1OVJCYFUwCis8WTBWcWhQV0plLXV8bmlsUUlKPCstMz9sOEdfeWVZNTs9PUcmPnw/RSgzIT5QVV5WQzlwSjdDRiZ9d0AmdT8kUXJBdE1gX04qRDdQV1ZzCityYjdra2F6M3twc3NKQjg0d1lzam5gdmV7YntVWGRtX19JSl9gX1ZPVWBYa2grcCE1OD9LNio/QDB3QSE0M0RqZGpDRUY4RU9TMmIkPythCis/WmpaZjdIWU5YKkdhcE5TRThEZnNHd0IkRmgtKDxTLUZnZklIUnYzbFNxWWRUKHsmXmFHV0BxNlp6aG9RQjdKeEc1SHhDMCtqQWVBS1pkCitVUy1XSSpuJCozfGwqfklmY345ZXFgPkB4a2YjbCotXjBfRUIyUndeJWJlJEFlQXIpLU5VbWBeaW58JSkkQlZpO2tnVmM8eys0ekp4d3BWCitqMWl6TTZFNCNpR3p6I1JYRkt9WWo9ekhyYVleZnJvcFh7NklJaVIjMEk0MUg0JHZNJV5DWm5gYTtpfC1ETDJYMkZhaTFlNHc+ey1qT0NTCithfEstemFRYTVSe1lVREwlSldUK2xmdiY4MSR4NGZXWmh9RjA9USZSNlYpKj58bE5aQz9jOzlqS2UlbEpJWEB1ITRrTz5UIzdfZCRTJEAtCitrUkZ3USs9KjUySntzYm4yTzxxUDRNd3Bgcms3WFM5Rz97KTItVj1DNCtGJHwxJC16Vzs8OzVqe2JlO3xiez5EXyZiJE5sb0o7WTZANm5UCitRP1YhPTZ4ODFiNUM1VngtRWhCJEgoPTlPXit9e3AwaWRvIz4jbThaMWBzRGhwcExobjhifkZEYDZGS0BeQSpiVnRkM2t4KHgtYTN0cjxxCislcnd7IVozTEApVWl+KT53VlheTGY2R0YzNEdsJlZwJW8+VGxUe3dGRkdub3FZZ09ueihBJGFsfHUqJHJlI0BuZ0cjeH0yJlk9Nnh5RD8zCitTeFE8Y3ktcHI4MHJmcERpdS1QbUhmalZpNXFHMn4jcXYwdlZpQEBrTUBMY2swJmB0X2BGIzMoS2lWUHcrIT9JdHdmcHFxP1RQQTE5S1NSCiswZG1PU0o2UntURnFyRGQxcXJESjM9eUF3OzA2WVdrSD9BVDdRcG9pQ0JGJUdrMCE+a2FJaX47dGUoWVElUiFPUmApcWRQfTYlRF9HTTxiCiswez1IN0Y0JEhJTlJuS0lnIT0+ZEtrJlcjRkZzQXxoYmJQXz9tJmh7VWpfb0g/aXB2Pj8maSVrVjRyWE58VnJEJTxWZG91WT4tO3QzI2pLCitDaTQ9QFNWMncpP2I4KlpaaXNYZ3pYb2ZEbXI+JjZUeklaOXQ0WUIqdTBLUld7fEdXa0Uld1BVMTB+KFVyei1UIVc3R087WEY4JClKQGoxCitfJUBMWGBfP2cwZkZ5R3duO1Q8V3hFTWFFYyl7IUtJM3c5I0MjTmhnc1FDTiVpPnNtUlY3MVYhelh3MmZRTH1RJGFgflY3T198LUNMUHxaCitlOEN3XnBqWSNPOGEjalU5eWBOJExfJE9zRmBoI3w9LVBhcjlUJmI0QDdeJFY9QXNkaXVZbG1NSH4/RDlELVhqZ3kpdm00ZDcmMHhoKmxSCis8T3hpTHdNUHw4OUQhUysqVXckUXZTRU1SYTJmQShmZGAtdk8oU2x4dE1mRVFeUSNlP2t3MUJ6ajcjfElpd3h1d1Q7RXw9QlheeFBtQncjCitFfXZLS3MwRTJIND1KTjU5a1UwKlFBKT0+Yllie1lHZiQyMEVDYn5TWmA3Ym1RLXV6RUUlQGNJcEMtTGg3QSt4VlNKdVYma0NjKnN1YUZnCitKcXJXQlA+PT8lUE1taVRUdE48cmBnY1djemt5XndLQDNidU1SeileUyR1bXh1Oz9ka1plZCNiNyk3YUpOVHdtUHIhPUdjcmAqY1JKSiF0CitOU1ZRemQ7MFZaJVg/QWtaczkmSSlPVT5WQmFSdiEwZWo+JlAzbjBJdi1uMkkpbCVgIVJLRnFNRyVmbFpfWDlvMjZ3KDRyQGl7ZDdnLWYwCitEMlRmclRpYnZXekhjcjZORkw2ay1kclFQXjMrPztWIXNjSFpTa31QPTN2NjZWZT99fUJgZn1AND8tYFZ2fkJKdUVXI3Y1ZzFeKkQ1OCNICis/aD5TdGh7PlRDd2pVK3wtV1hYfV5oeCM2fmZoSDRGQzNgIUshdmorX1VDWl9TRFZDOXQ2UT02JDB0SjZReUx3JnA0SUp4MThGKmIjNz52CitnQGRKbygoKUg8WWpKaWghUk5iLU08OThgPGR6RFVZe1RAdFZ1SkZDYH01JCQ9VDg9SVBnN3d0TE5RNHY7WGtwSWk/QTs+YXwqKV5KWCt1CitLbCVGdjV0RXglNCskZV81OGtOQUtNcm04eXRraUg1KWViUEhzWElVI0tLajxkQGpZRVM4OUtTVXcrUW56YjtZbERiVHFwIyhANkFORmRhCit+O1RZdmBYY0chRklRLXheNmVAPWhkP09UeF9zZXJnWUJWR2dCJj5NMnF3cT5uJjltSkRzMyFKZ0E2ZT9HRGwxWTEkP2d1RnpPY1g3ST45CisqanxwS1d6WHByTVN5YUE8U1h5YD5VUSteenlFei05eFRFQ1J0dX54IX05TXBtO345dV48JkxRbz0kOyNaanc3JEkoPHZeNUY9TVlVR2VkCis2JUxhdlA/QzxPYS1gWEJ1MF9QJHM7dCR6Nj5sIzc4QV9ncTU4eWwjJiQ5KkJxUHZHP0dBUE09VCVfanVQcllOMFk5Z0QzaWFCP29jS3Z4Cit3TTN9d2F9I1I7ZlNnP2N+O047YkVGV0Z1ZHY2dVREXmxAIV9gUHZESm1FUk0ydTkxcSthd0pqcl47fWlAcnZPNFVQTWRzY2xlKShXSGo4Cit6UV5nZ1VjSzkySDl7Pj19NG5reCtKRGllZGVaS2lhKjNIUl5QZGlJYVR4SWF2aHlLZH0zZyFWN2YhXkpkK2BsWWNfeGgxMGlXI1NKMnYpCiteODI7Pz5rLXpRNmkmQnhfZyZqNVc8eEpmbUhWKTBGWF5gVSUwZHNsMTYzYjNCVXlFYm4oLTkoJiFeN0NsNEdOPX0tNFRtT0F7Z1dOeT1HCishKl4pOT1Uc1JpMXw7eE9KRXNQamBQNj1YJEt1PlRZS1BvUmBBUTFlJDhzJD5ZfXl1T2dlTEtEXz07Y2hYXz53JnlyQUxTWiZwclgkUDskCis7Sml4ZTdTSVM3I1h6YVhEXzBiY288c2RMdlN4Z25YTldXLU54T01tOzcwWWp7JCh5OGhPJjRiRmEhU25BQkI/LUNrVSFMYmRJTTkje0Z9Cis/OXsha14wVyNhOFI5KUFLUkN5dGlWa0dwU3JWQTdYZ19hVVFocmYlSUw/Xk9wRDkyfXE+OVotbWBfNHVBd0FXdUN6dVk4MXZobzVsT3U+Cit6LUZ5Z0deVHtkaHc8VjJzMUUhfDZ2T2NoeUtOaS1nNHVAdHQmV2FIeT09UUtQQiYhbDhJKU8qe1glcm87aSNJbktKcD9MTVQkZ0dDNjYwCit6fWg2MSNfbSR4SjZNVCpxPUB7dFchcjFMZyg/bTlRJDNncGBte21NZFN1fFAoKGZicHAmfnRAO2tEekBeZnRlS3ZBbjdVVXJEUykoaihaCitrVUghe0l1OEtZaD1BWHtQaW9xNCplZi17Tld9VntgMSFXbyl0fE15JXMqaVQ7ZUxFQURiYTlEak8oPGwkPmxoMTR0QUVlT3VKeDhGVSpCCisjUWw2dldufXxEUnFWbCt8aVMjVVpCWSsmZ2J+ZzhnOHIrVXtuTmFXN1M2b0EpMCY9bisoeWZ6PmwmRy1+bW8oKTQlTm9tY2tyI0F0SmF5CitsdEZoYEM7T018Y09wezF6IXplKGBxOEVBX0tQazYzRXImLUIjVDIhajAqbnp8eFJvNHRqbiluPDslUXQhQnomJmlvMHElOWpTTFZVZ01ECitUNVAkcDU3bkQ9M3t4dEBTYz9zalFGSVduNFVgYSFDMyQ1cF57UXkofXlWaWtxOCk5PmhfU0VzNj89elZ0d3FSZT4reShXa3ZIWTJVMH5VCitGN2heT34zYUNZY0dBcjF3Un01Mit+IzJaYkcqeis1bFllV2ZYayMqMnVOKGlDVFdCSEN5TilsYnxHMmAhSnckQTledT9vaX1NK0ViRW1+CisxSWA2X3E/QClVeHxMVFMoSjlFPTVKPj0yPl8kRGhYRGAhYFZUU0ImXjd9K1QjQHlKY1E/c2NsQFdrNklfPElITlU2QyNwZHAyanxGe2I+CisqcWQ/SS1QYWBeRCs3YmJ6OW9qZCRTUTE8UmxjO1NxdEk+fWMjY15acWImWHBvSmN3bHFRTygqRkViJGd7SyZHMzg5dF9FK2Z0T2NVZCp2CismbmIjd1B7PE00OzJVYiZ+al87RnZGdD1IR2I1cGY1fHpeYFY3TUgzPEV2ZG4zRkpReyp9UGNZIVUobGwpQXktRDVJbEBOdVdTZEI8ckdRCitHQ2RSZWhoP2VFVUgxZjw1eShkJEEjYilvZzdeT2dCYV5Jei1zKHhIfUhYK3p2OXNQVjhQWSpvTipTYD9sc1V0RCsmVU1IZVpjb18lcEtmCitjQW5jOTlXWXo+WEZ5MTw8Rm9KY0pJfnojP1NnYVh4bTZ9Ymx+PmJZeUwpZ3o+a15hOS0lT15KXypkKTw+VUltb25JPFpuKFMyXilWQjk9Cis9cj01UGxWekB4YDtnNTA+dDQ1QkVkZWI8Y2RfZ216Tz1Ocj9XY1hLQjM7WDQtPVNESFZXS30/diUxdlEje3F0JVlARzwpcFRfcXFhUCV3Citme0dXWWM/PVdMVTl1IU1FWmtVJn0tSHdqJTVTcFV2T1hYZnRaN1JLSG8zYlROZjQ0WipkS18+T2I8UVBGR2MxaCtKRihnQT1vN0g8e0dBCitlQlk8M1ZiTmZMZU1NaU14UTVPSyt6ckZGWCQyO3UpK04qOTBwPyR2Q3d0STRkTWNwe25gQUBjVTxrZCFgcnQqJmE5OGV2TTFmZGtXcUJECitXTHJiX244NjBGZTkzOTdIKE95SnhaWkRZQlYhXmt8Tz9TdkhTPDQwO2A+NU4+RjQjJUE2Mz1reWJLLU54aEZsKS1sTkJgMEtPdlpVP3psCitjViMxI3BXYXlJSi00MXwwMFRRZD9kNTItWGk5YG9DYUFyT3I/NzxeeGxvTjFgbihEZmAwWlVhODJERChLMX0ra0kxT1JBRWByblF3OUVuCitqbFFNTCNaKlAwTntKRllicCQmcjFpZy1fOVpxQV9WVFpYYHFoblk1d3srVERIRXpYJCN+T2l+SjBybEl8M3Q0I0grOHI4bjBmYFNSa2BmCitYRHNKMTMoPENuZFBMaXB4R3hRVVlAPWN2X2B2IzdfSHFMSD4hQ1pXeiFmKj89M1d7ayZAVyo4YyY7SjJYTzlLUUgwMDAwODBQfmQ9TjY5CitKK2AkaU4xMFFeSiUwM2lTWDBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFEpSFpmU0lCZFMhQWhhQ3hPJWR3MUo1bWpCPE1mfT1EbURWCitDSV4pMTVpJSNLfW9oUHA0Oy1DTVJ+PW5VeCRaTF8hajN6Q3dfKSliVzF6eSRecntDNlFFaWVPZUo5ZnFRfEFgfXBBISVyWitOWiQ0aVpkCis2Q0thKyo0N1NXVnQ2Nkl0aHpoJmJkREYwPH0/RUNHcDVCViZ4fStvUUVveG5GI2dTbmR5X3N2bjVqN00mVSRARSZnQlJEJTYmeSlWQGUxCis2NXRaSSlAblA2bDhyMno2PEhYbiNYSj82bVkmZDlyfTchTXBYQUElak1YMTl2bU8zXl5ad245eT1mWnhOdnZ9Yj1PdENAYitieilqUTAkCitsPH0lTGJJbj9MYllVXkZYO0dze0hzISRISGUhcVhfd2Z9d1lZVmdRPUZMSG5GM0N9UnxrZVQ7VnEtbSZwayVLNS1KJDtHeVVVaVdneSNECit5bzlyM0hfU2Q5TzhHeWJuPDxOdWk0bzxGVHVoYk5DTC1nKjk3V1d0QWFedDZPVWp7e0d9dSgmRS1icjAkU3soRkgwcHo5QCtvbmdRekBGCitEIWE1TCo3X3lXI000PWRlOFFWWlRvK2dBKyhUXjRANCZNQUZPRzUqQXFKcDMrXyphPyNhc0c8bmsxPGVSUHJwaFRtTkhsVENBVVZaeGghCit9Wms9bGA8NHNsUUxoNlNtbWg5QDZ9ZXRnSmtpJF56LTJiUVMwQDNwNjJKSUx8KEc9eygrcyZWTzdefngmSE0+VDFkRkI7IXdyWClBPXEwCitPVW08MUV4QEdwMVpiUVFHMiMwJSZCWT49YX5hQT1xUDwqdCk0dTRCeXVNZzBHUD9SJTY3TTFeMV82anNRISRnR2VTKio9U0FIbXx3Tj9RCithaWE7ZTtTa1JBSihJcmckeUR2cU9ReG9QMkJoOGJ6Z00lO1BqaUJMeEtTNjB3NXZDIURoT2R8K3grfWhoPUNhQz9CSkNvY0w9Z3hRZCFXCit2JkdGNnNDckVAQ3Q5VTFaXjd2U3h2eGE9QnZwaFRGXjxPN3hRV2tWTXhNYnN0OVR5OWBLVzFTUzRQbUA/RzgzdGV4OVNvTGc8O1ZuVDtOCitHY31CdHwrKmE0Q0d2aHx5WSNmUztfTmNNeEJIT1U/ZEZ6dShkQ3p0aXR1PSREOG5gaVc/Y0RvJUA+MyVZfiFvIXFTP2pybmR0KGhiRmU8CityXytQel8qQXQ0TFRBalUxVkpGbF91QjlBdTItOU9JQyRna2tuKGomM1NlQ2MyZVlLeik2fUxVN0BuLVI3cS0/dmFIaUFTeV9BZWY8SUshCitCQkRrYmpNXi1aMko3Pj9SI1puS3F8dCNjdXBCQy0oNWRpdz9WIVhZIVBAVm5ESkFpJGkrRGk+c2Q9WDQ1fiMzOWYqbG96VkdlUikhLXVrCitweEN2QGgybGFlU0VtNmEkS3FKamJ6X2VAeSYxKW0qe3N2cXsoIVhVNzZAZ1FXIW4ke2dMQDc5WSU8RzxJM0g2U2E1WVZXZ25nYFg3TkN+Cit1YHNXaGlXaUlgbCV6WjtmaWwhQypQMFQ8VlJDWCVSKUNhayhrRihiSzk7aHdJdk5MPjFvQGdzODBUKjN1dHJWV3FIK0M9dFJFPmdzYzZYCitFSmBma3pLbyhxO14lZnRfcmUjTGBNI1omdD93TGFhZEUoa1pAOExZQkl6emZXMiQjNVRJZ002OWpUQGs1bjxHPmhufiUhRz9URjQ+UVFLCisqPExKQjIyWXhCODtBRnlmbmZzRTh8IzFkdnxuMzxqNXpqIWQqJmkqTE5+Jjk1Vihga15QdjdLdUxDJmMheU9seUVBRzZqdnUxfVlufDRCCitwMm1qeWFpWEFDSm1kMTNndTR9TUchYHVqPFNJZyFkRGlTRWBWPHE7KyFKOyQ4PTl1UlJ7LXtgQHZgQ08jPDtEb0QwSTI8NGtELWsxRkp2CitAMmUzc3w4WEpVVz9gUkQheWJKcERELSh1YngtdGMoUVJFM0NAbFlDN2daZVZAM3F+RFYpZSU1fF9Db2t+PShPMk1FPGA5fFIqbDhWdytnCisjaGZwYm5KQVFWWjI3ZklHP0VTNUFpdEVnMWYwTXVkYzdFRWxOXkY2PmE8VjtrVEJTemMtK0ZyS2hEdFpvRVdtOCMwRVJnWF5ubzRHYCQjCitVN3ZVYD8mS2dJUEkkRSZWJW9idFAmLUpqdy1XODFUSGkkUmBZZkBNO3RjKkhpZStoJk03YVBeSklFVFVwciY8ayE4Iyo0KiZBM2A8Oz1pCitqfnY9b05lOU1JfjFpMlNLd01pNXExUERrM2dORSRYRFZzanBKb2puT0xwdD0hMEVzKnVkNWF3YFdgb0l5cURoJWZLPUFoIURTY3EkXnpGCitZLWI/VTNoPU4mWE4xJGJXd2UlN3xKRCN1T0F+QGh6eU5DdiYqX0BVck0tZiE1V0JTclJ2a1A1TS1lRm9QWHpOSzFHYmVtKmJMbCg2Xm4hCitBbVUqZXY5WCN4aUVhKG1hJkRnKllDaFk5Kz5WdzdTd3NPaD5VXkArWCMmbyhqN3FnbT8qcVJGKG51UXRRa2Q0YjxDKjIkKCNqcGF3TSN9CisxOWdIb0pXdkIheUNpQEBCeCZ4RkM2dklBKikzYG5DUUdMYTt3RmF8fkFEYmhzWSM9KTNGbnJOZHg9QCkqUyR1SlMhYXt4YVh2QUBTU2wkCisyLX5VfF44TTtmfjg4VXM1VVp2NX1tdXNxVHFEKTZpSCRDY2hMYVY+YDx2cTROeSYqbH5lP3I/a0QyZ1h5QVBnelYoQ3BSZ1Y+LWV4OHNkCit+PyVDc3psSk4yUyE2V2N6fCNAPlJMZGozKW5xb0oxKFpGLTNFWnVRLUhkKlQrVVdxYCMxIzg1YHYrQFR+K0soUVlTYE9gem02ZG5lfE4mCisqdlNZeEkyNWNubj0ld2JzZ1BYQWxxSSVGIWgmXm9RekY/LTdLTlNVP15WRiZXMGlYd2clQFBpYiYkVWdJMHoheHNnK34lYVR4TE9ZViR5CitqY1NFNDF0RXdBaj9Ud2cmTXcmT0ZJVktPYEF1UigyNi0hTTNnJStXcVNKdGYjRko7e0JXKG1FUHc2Sm50YHQ+cVlSSVZPcGwmX1Y0N2FOCis1T0l+X1N+cVV4OWxAMDFgMUUySWJQVEBSe1RIaz52RnU8YlgtbUIxITJHc2Fza01vWmJPUHohUFAwPExjYGk8WHNJJURie3FackR3K2pkCitYMH5wO2FtfWsrVGU3ND1uKmspQjBCR1l6dGMkPD11dCM9VW1mazNAOSExeHRVZE9GYlVRVURxUFMqY1E8eG04PF4hOVNMK1RwM0o1Y0hkCitqXzUlUn51dEV1eXRKa3tfemAhKH0jJkpsc35vKkx9PWdhSCVoaVk4JS07Myt8YTxBMngxRU5CWTt1R1lQKG5APG5iMUEjU3c4cWxKdm5ZCistckwtcU5YekxvUUZSY2hPMj5CZFI0T1ZKIytrJWpaRTQxWUhtU0k2QTxUd0xLUXZISWRMWVUkeTxQaCpoP35ocCE0I1c0QVV6IT9zR2otCitHd2pOX1Z2Yz9TaShueFUtckUwNCFuSV4xQFJUdE1lajIrWFl5NllgayhpaTxEJjNqMkJTdnt2O083aFcwdyVrZ3Uld0ZgRFNhRnRQNFF7CisqKiNKTU9tJDwhWlg1cDJmV3N0UH5RcFlJcUQ4QXQjYkIzJnlBemp3YH4wYSQpU2o2KHh+JTVfQCRiRXc/XztBYW5MQEZRPjckOEVeYXd1Cit3fldeZThiUipaKkc1aTBlaWM/SWVHKno1P0FSMVo2TnM1Z1B3VjdxJHk0WFZ7PiVyRmk+fU5gVkI4ajxQSk53Mj5MZ1ZocEhId1IqYSRYCispUzdpM3IofmZLaig2bHRhdypLO25ZYUppN3B9QG5RaTE3b3IxSWRnenFaSURLb0JIez07MVYkeVk+Klp5Q1FnNSMmWmM2b3Z3JCNIJWZzCitIQD1xQz8lbHNaIXk9UkJVT1J3O2g+O3R3bks1aS0lb2JYeDI9SHJkM21ZeVo+OX5DPiV4Iz1TOyVzY2JoNnVZX0pGQncpIzk0JTkocGdkCiteY0pKZ2s1Q0NEYk96aWdWU3Nmfkc7eGhYIWFMe2V7ZCFrfmVZbFFFNUxqQFAtVzt3cU9kUyNye0l+M3dPdSpYN2g+Y1Q9YCZRNlUqPzYyCis5RT1TZWYhKylXXnMoM2Y8ekFmSDhmJUBnJiVZRmplXl5PRDtzailDalMtcEtWaE1QSmg1UHpnZzVFd0NfY1IocXI1e3I0T1RAcGJ3X2crCitAV0BwbntQPUd3clB0YEx7SWo/WTk7NTBOYDkwbHtQbXJLVEU9dnhOOzFAYUYwNWlETiYydmhQV1c2a3ZPMXohfitLMVR2JmdNPHIxUEQjCitYbkdPKFhKZyRkYEE9aUJUMXErYXF0bjRwR3stfVA/XklUJSQxJU9uSWhDPUN1bndkSHFsayhCSGgkTndQQ0pmPDEoKypteytlZExSQmBRCisrTFQrV2RvczV8K1FXUF8xclp7bElXKG5kOUhPNmJUNDYxfSRoNjVRd0x6MD14WHtjRCR3X0cramVMNz9AcWA9OyNYbyZsSWdRJTxhOVo7CispZmstJUMrc1RQQXxJdWRWOCglb0lHVG5hfShlVUQtNXxqS1hHVmFLVnFNaVFYSXtfI0FhK3RHNiZ0X0xFcnshKVpaPUNrPXFgYV43eXZrCitnJiNRc29HIVE/QVY/RmRqVktoOVc+SVl+WDwlV1kjbDZlKE04Yj9mVSRXNDc7ckZsQldQP21EcnhPZ3h7IXNPbk5LWW9Nfn4xKi0kIVZlCitfe1U8JExpazVoWWVXaUJtSVp8MCswczB3LXJ2Rkh5YjUmTmkwPFJAREdPK3xweilRJkJYJkRYVE19bVNlSEJjfG9jIUJ2PVMlNERFe31ECitwY1Z3UX50VVlxUFJRJntSdVhJRVIzciYyMyhKZTIreHBKSF97QGU9KypoNnlgbkVeYUpodjxIcWwwUyFlJGJ2N0R6d0klQjgxVW4yUzRjCis7VmxlVXM2ZCZoUDlWTnd2UHFPTDlvP2BBdmxFRWx1T1N3ViVWQH1HO0pFZH0qNSk0SGsrQUktSWwqZjJySiVnQEFfTmI+Z35TJCQ2TlVpCitoJDhTLTwzI2BxUi1nZWAwb2FCRTBUI2UlczVOWE8mO3k/ZnRJcGV4NHtJJXZoYHBVcjhSVk1rSiNHbS1Nby1yQVBNe1BLZ2YodG87Tm9kCit+a0shaSVuMj59QD5QTGIwSz9oJjImKmx8NkpTb05IPWRxYFE2UENtNXpGPWtVX0NiZSZ+KjQ4UkRQfiNNezNlOExRVHJ4KmBOODhEVGZOCittLT42RyUjXk4tREI4PXcmQXtqMj0tSTQ2JUVtZilQUCRUSCtMJit1d215MERvX3phYiF6ekdXfkxWaGNrbSY7WEM0eENuYlkjTno8MShhCithYHhzbHt8ckoxOGRBTjUpazt3a1lkU3MqO1NJN0x9ZVReeTxDUGROOUtGRXB2YCtiJjI1eFlLV0opYkZDe0M4TncqNntZTUpSPk9lJnM+Cit1NkpSNXR5Iz13cyMmaC1EJEhwS2Q/fFh3WCpmcW1Tei0kRCZlTjFiMzBIbmtyQmhwfVdtU1JjcmQ0ZWJyUGd+c2deO1JCITJRVjYjZXk8CispeiRGcXBGT1crLWVWOVgtJH5eRVBwNGtVIUplbWwxd2UtcVV4OyRvN1dFcj84UG1VYz5KVT0pVGJZNDVLUWxuTU5uO3QqaGFETD9kIX0oCitzKXdNTyMqZ0VpdV9nS20hVlpnQV9oRShhI3VYeF9ETXU2LU9jb0JGVyEpVDJwcj4/KyZDc2RUOUplNFIoKGBHfThwMTIjZGJVYiF4RGw2Cit4eGwtbkBKRjtrVDxGPTIhMm8tZTNLRWIzTVpJc2E5dHwhWVREa2lreH5zYSEjdTVRK1JXOF5YYUdXZjRSQjNvX049WXZrVm9kMlk1QDVqCisqQUR4I3VJZSM3Y2RKMUEzV3FkTForJG8pbCRLWSNtLVEkOU51MUUmcCY/cEBiVCk/JX0tYT9NOFNSWnBJODY8P1pjLVphMDxaM2h8bnxICitvNXxzNWFPXlBWYExBIUAmNDBSe3xNS1o0PklsK2BWPj8yOGlSJDRLP1hOKl94KkRGTD1MaTZYY0p0eHdoai1VNWY1WD9iX1UhUnNJbWc4CityXms0R3BrNV51aCV3cXhZYmd1SmF4Zn4zPW1ydT4zezs9JXFVQjJARUV6RG11Y0VYM1lVbjVLNTtmQyhBX3EqNSNaaEhhbCFHflNyVkVDCitmPD5NY2F8SX1hU0peWjsjby0jbVp6P0IhRmpLYTd7NnNVYkIzfDVFWCM8Tlg2SSF7dnlOYFZUTThOPy1hMmx7JCV7MVBfOUV5dmZyWkx7CitOWTIwcHtmbnF+JV9xbVA/NU5IezZ4b295Vjc0bmY5Pk95RGdpanJQflM/Mz1iO3xzJjVWXlZCVUgjRy10Uyoyfio9fmJeckZQblQxMXMrCitQbFZgYGkpcmlaYnZTcS1jPW0lLUlsO29ZYWdaZ2ooWTVrKXZ9LVZGaHx8SCNTeCZtQztNTGU7KCR7b2F8bjYkKjFUVHlKOTZlI0toaUhsCitFISlaQXNobT9PJUNJaU4lYkx1NFokVXZ8e0pxO2MjfW9wWkx0PWtHVy12dFB0Vz9ZVG0+akxGanFKaSorYTU7bTkhaXkzKVZaS1hMRWp2CitKOHlpZHF4Qj8/QEJmPXFCTU9sVTNVQ1RVV0tEWDEwaX1DWkBtZXcjTnE8Z1Q7bTI8blRGQlhtakE2N2w7OE13b1IxUXlpNklDK31uVkpyCitOQEsmMFlBOXl+PHlfSCZ8dXp2Mk5ER1UhZUpkLW0rdnYrP1pOY2g2P2V8TjdWUT57fUA0K3cmZWttczJuKHw1P2ZkOHJsP3BaLT5KUDNJCitoRHQwaExGPDk/dVNZPH5SJGdRfXU8N19VT3hgWVA4anAmU30tXjZHTUtgbn1KN08xfjh7eT97R0FuXnQyeU9PPkFMTXFqbEh+N1VrJC1SCituSTBJcnxoIVR3NDtPPSN8aHdIQVZiZlE9THc5IVAjTjFjNk9DWjFgeVh7cEJLKnYwZlBec3AqOEheKXN5ZlVpWTlAY2B4REI7dkxaX3EjCitlUm9MeDtaY2R6RnhKPE5weHlpJEdSVnpsKmx2T2o8STJ1NSp2b2A3e2JWK1BwWHVqRVV9RHFIIWB0KU12KkdEaDJLeVRDWWchKy0lS2N6Cis5STNCSHo9QUE3WnQmUGRhJnpHVmh5b1BnXkFfTFh4ZT1lc3pkR2ErPWFRPTdfRjFPbyNuMUZ4UCtTaSl5JilTP25ZZ3RQfWd4bGQjdlJFCit2UmcwMEEpLWxRKHNTYGZqXzxnfD1GdytGJDlRNG89dnM5WipmZlR8JU01MWpgUXtpTnZHOU0meFdJKWMyTVk0bHpgZVhMKmd5dktFcmF8CitBb3NQUjlkdXpkeWs9JDYoc2A5XyEyQVc4SCYtSEBHdTlCPUVqTmpAZlckUXdEb1d2cVJSc215Zmo+V25IXlIlLUBBTmAjOXdvdChOKVAqCistbG42QU18aHUtaThUJip3OHgkVkk4YEFBT2tRND80XjU4VS1iQHd0T2UwdTJiYXJVRm8oQmcxbnFUQ3ozZiY0ZUg4YEFwUTVvSG0mPFhUCit0eXZIMkQ7Ylk3e3pzKV5WQFIkZEs3WDU4YH4wfT5RKWltfERiJERYKDt0JUdNVGNvdnhWeE57Q304NnZiNjM8RGJBVUw8IWR8Y1VjYCZeCitneT9GRl5HU2xWUHcxMnZObkI5K09fWWVLKU93YUNiJi0pS09RfGRqOzJHZHpFTGh2Kmo0eGZBakJvMWZpaHtwTUpgaFl2UyVmV1B2YmZJCispSHtlMURfX1F+SntscG5xIStGZ3soK3hUV0VNKXktSzRPJGlFTCYqNlExWUNqaFFwRXY/ZWI2Jn1RSFUyYjN9UVpQVX09VTxsbiNDOVE4CispQCtraUE4UmhrP0c5ODlHN35yISl+TTkkZzxgTG9sNUYxO29hNEdhO3pIPTxqY2tFTFdYfERqKVI2e28oWjR0dmlQNHtedX59TGw/QEN1CitUSU96Pyl+LWMkPlpDQFMmKG56UjJGaWxrKDxGQ2lFMmh9d25HZ2NITjVxfTJzfj5ZQH1BQk85ISl7VCNkdnZweypiS31Vez1CVDxKWTVFCitAQzFIZShgN2Ile1Ypc3VePSRPKnxJOCtATz07anE0LSk+e0tCKUwxaVhLd2BBPFpBcz9aZX1UKFpkV3NLU3pCdjw3JHsye3cqPm8/aGMrCitGLWBlOGV8NCRFXnc2QzVte0ooNDh6OSQ0diMxVzRPRzw/UUJzUW44S3FhKXdBOH5MRiNvekUzS25hQGl7M2k2OWE8LWJkQ2BFd0VqekBXCitYJWR6cCpObzI8WnBRJGtEaDwkPXVrIy1WNlFHUVFDQWlXMyFocVZAN2AwQGgodkokbk9qKU98b35HVThjdD01TylicXg3KGdNfmEzU08hCitIfXgjKCVXcFVVRldLemEqfDBjJGdyPWV8cTZ3Pj5QU0dZbyRIPDdkUDtle3ZlUyQ/JnErQUdWKVgpTUwzeUUlR05idVBDQ1RwTlhpdmJyCitfbXBpKSk2X0M2NWBBNyV3MHdadDdjcXw/OWYzX18oVDt3bjk5KkVfe1V4TChXO2E0SW9KUmtOdSVLMzRuTG5hMHNNYWZQKWg+QDZhV0FLCisybXRleTdEck1pYkw8TnAwMDRuMzBSU05ZMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRWik7XzRYP2tVSEVedkE2VTMrdWVIbiNzCitpcDh9PDRZSDRlIVBJdEdEdmAjMDk/UCtHNEd+MmokdilBP2Ioais5WXJidnxfP1drP09gI2xGQk5SUnxZUWxlZmxJaHt0OWZDSno+ZSZeCityLTFWKHtCQ0QrJVpEMnhKbmVOQ0x7JW53M2gtWjA7ZExWN0whSnxlYnI9UDx8amohNUo9bVQlSyoqOW1FMHk2bi1URnFsN2lNQnVSfDBYCitnOVg7S0tuS3gjbGhYYFUmeTstXzF3I3krdm1zZDJMU1ZTckdWdnM0KzdjNUV4LTZFWj1waDYrIzxLX1FJeVdNPlBJPFh1JUptPjRuTCFZCistVT5ZI2wjRnUzd3B4SmljdjNnTFdoP0FaWmdZcGV4eEROSTErI1RHTW14aGl5IUBhOGtFKHRvdnstX2AzWmYwOGg8P2Q+QWI5VD0tKlFCCitWbV9sI0VIdVgjJCk5QnYweT1ZSGJXYFpPR1F6bUQ8SVNSd2cjazZFdml1Smh1WVA9cVUlJXlGJWFVUT5QKzg7eEswa1VTeHEqTHl0bmk8Citue0kzNyMoSWQrUmlFd2hmbGc9TUI9PW5GbGZuZlNWVnVvUm1pOzJVQ0M+ZXI/O2o8WX47KloyUW9qKTlKJXQ7SSVAaFgyS2pKbCh0NiRKCitxXyNwJnx6M0hpWnlaSjtyc3E5JU1ZTHhRd0xRRmwmbUM9IzBtekN7X01jOXRVV0VUa0R5Q1U5Ozxwe3w3X0lwcngwQyUlbjstMmdBVko3Cit+eHI0dXxDM3lMVU5hb082UU84e2FgYEsmMmRLaUQxVDFAPE5jWD0/SUwtQHRwQWJ4YCkoYGgjKz9hPkljPldWPm8mM2QtTW50SzRBMH00CitiNzhfQWNEVW0jI1B2K3E0KitoVXdLP3FMKDYzSiU7b3hrNzhGLWJldEgmJGYkfXxYQjtZTkEpRG5gKUZoVFVXZiVXbm9Se0UtVHYhNWo9CituZ1ZqLUwpekVAY3woSmRBQW4mKTJmQDAlSjVYVj8/KGVle2JtSWVoeTAxJHIlRihOfTxhY1VeLXFKOWRhaCpVKElpQFQxNiRZVEhRY1J5CitSJWJkfTMqQmtAa2IzblIkYHo4eXx7VXxgakZlcXwpbUZGfiZnenh6dXdpJWpsJWkyaWpFMWtXN1pwTE8xODszOWozIzFmTUo0OzQyRWcqCispMVBZWGw8WDEkQz5BTXNsS1ZXUDdBajJaKmgjQStQZGU4JXFLenh4VDhtQHFETD57dylDMCRfUzxuRCtsYWwtTkUyPTc4b3pyVkVBfm49CitsUmBvQ0pPfW9eUyUzTm5wMzBqWns1eVBsNEpVMXcjJU1vRkhoNDBmO1opQ0ZUeHdaM1E7JkMqV35GMTNeb2YrRTRfKj1KSWtMZUlNcDEhCitaLXItRkR5aEBRSEdnaUV3QStOaCg7KFM/dlEkeVNBQThoTEtEejZaRk5aZ2c5OEM/QWV1MCgzQUkmP3hPWkd2NGtvS3MyY1ZlSDluKGZFCitNTntUeyFUITZ4S05BJX1JOCg8MUklJUlfXyUybWk9cVh8PXtFa0xHcjA5WCFsTEZXWCN7T3g5O0cydm1pcmN6MC1rXlBSJnV2XkM1ZC14CitaTikoOT5YYTF+ci0yWUo0Z09zMFQmRjZ8Q0w2P3B+Ull9b2JNcE9EYW4lPmFoNEJnaX1oRnlwS0s7TEs4bVRUPU9AXzF8IUdvQklaMEFCCis8MCVWKzIzPWNtTEVJR1ppJFlzbjJAMiM1aClRWXMmdFRGdys7MTRASjZIfDN3O3RPTHJ4eyFEQ1BOTTFydjtXOGckMWhEUF55cHIqKUw3CitXa1pPUW5LKUlmQj9JbDswTnkmYUtNc1JmXis3QTJtKDd3dX53I2V9RH1GR31AQGNKWH1lQjJ1I35+NF9gayVQQXl8MypxOVlpTitGNFBHCitRVEg7ekQhJDFldTh+aXcqbnAmTVNtZUFoKll6alhDZXJ8ZldpVDNuY2tTaj5ON1FPKFduXiZzc0k4Q0UhKzFGTG8jdW83UHFeVTEodDswCitTVmdnd1VPIzZ6N0IoYkRoWCFYTUo1ZXd8RTZhbXFKV0A3UktsezdCejNqTmI0fjdFIVhvIVpjM19hRnM5PDlKdzk5M0RjKmZhSkxeeUNECis4PW8hWkZIOzdWdE51VDtoTEkmQ1BwZk1CMXIhK0ZBTnFoO1EzdVp1a0d6RiYwS1d6KyFwYkpLZWpEZGI+T0l7fCN0fT1DJlJyZHNhaW17CitVQkYjdDVfKm1NVXRYXztZSUgtTTtRLX5wUWgjflNlMWNXITluRSomandfWVMlT3o1Q05oaDZSNW1wRmV5XkhHO2FwJHpKZEh7cHJgbyRLCis8O2NneyR4ZmQ9MWRrMlFiT0MtQWp1LWc7SX0/JiNfIXolVyZoQDI9VTghWHBDaCE/KlZSajt6I0hfVykhclZoan09VW17N25UPTE9THd6CitiOEY5MW4pZmM/YFVGdlhsRiN1ek91Rikla0tGMl9fMFFJQGIlWGsqQDUpPFopZSZuazlGZFh0OSo1P3RAMkgybUdqZTZvbD4yanA2UlAoCitPZDYoI2U/WWBXIWA+ekRAQUQoOWRWWVF1fDlnKUFLSVVLNDUrRlhKMDxaYW5CPXY+LT1JPjJ1e2F4MWxob3RvbmBPUUNAKCl5PllgSzZACit3clRwZnJybko3MkhOVGQkekx3djcpMEVhWHZnUntNPnpWeEtjfmVAP1d6ODNvKShpUX5YO1dJS3ZnVm5qYnRiPCNaJVhTdChXWVpiT2QjCis0LTlANmt4OG9GeHRzMHFhSkAtNHojKHRkclkhemFuRnNTbkgkZ1pieGlSP1AjQCF7Q0xIVXRZVyZkX21zSyF3Sk4kSDw5RG8+YC1MbnorCitkPHRPdkxXfTtGZjh+Vkk8KTJjJFlrWF49N0VXNH14JExxeik/RSYkdSlIVzRlKT08NVFuSXE1e0B7RCs0QD44akljTVUhLT9Pbzw0Oyp3CitjalY3JHpOV2BVcF5JKChhIWB3cnk+QzdXQk9LJnp7eVYtQCFVSE1sTyspI1ZoOTAwY25UNWtsaSZHdDQ/QEFyJW5aWThrPj1vbyFAP3J6CitrQDU7N0MtVFYmMkstTzk7Z1lqaklZNSM2UTgtfDk+UjcoKGRxeiZQKUwxb3dOSVMlVUhrfSVYSVYjR2NGIWpuenk1aXMmTCV1bDhoM1E5CiszIThrV2pOS2cxSVNGIWQzQD1fI1ZLbWFtTDJlaSR8Z0A4QjtRNmdZdEF8Y0BVQjctfX1wblBoRUlHYXVnI2Y1PzRwQmcyemokJH18ckhVCismSnBEJk5FJkA8KzskfmYxezd3TiZnMDBpQCRhZkkjbTMhO0g0SiV1SDVIaTRZc145JUwybGFtYmpKU0opY3E/UyZ7JXd4Pz1NfWV8JlZDCisySzNwRTB8VFdKSj5XRT1ZazwlQk96ZUE7VCNpNGtNbzdXQHo5fmBGdlEwPnIlT2tvRyUxZVhAPmBvMSM2QT4ka2xnLSN5NXpERilnQm5pCitee2Zob1hFRCNNRUgwa0xjQF8wdXNGd0doellTOWUzcUUrZG9uSFZsVjcjd2loNjtIUCliMmUlezQ8bUFrUllMUVdIOWJPMm9eN2lBMGAjCisxa3RVdU4jNkRRaTRTdkhrN3F7bz96S2RucGJye1ZtSWZ4JGpHRDl5Mz99Q1YzYzxNOyFEfk1ycFhtN1pUdDZ9QmB4eW5UeEFSezdMeS1YCitzSUwwJHd7UktQJlp+I3dMb1RzWitUYiMlfDMmcUBwI35MS3wkWj5qK09yN3kwNmQ2Kl8jNipHVWBILUIrUmp3PkNPcng7UzUxP2RCWTMlCit3cHJiezNLYW0qWGc2aHA1NTcrSUhwa2ZTNk1IY0JGYT4jI3FhVkl1Oz8xKVE2Tk1LezFSJSt9emQoMWhrXyNlanxAVjZ0RH0zcW1EZm5eCitGSj0wRz98TTckd2wzVyYwXnxJSzctTENIV2hURip6ZFpybWxueUNubWVUckVfK1RGN3EwfmdwdT1KbFZRPE4hey1MbjxGKngwJF9oVkNoCitSM3wlc1dGQkxYQ15XP0lKSCRvbEIzM3BQdENkRDlBPWFSPVgxcCVrVkxWS29GdiV7Pn1IYDlsU3RGXl9JVTxjNUpRMlI1RD8rZ1V5ZEhnCit7OFFrdCE9MVJwPWhoYUBOPStObWl1VTRfb1Ehemw5K2U4X0AoSDM+KEcmJjZBRWBHNlVZITdmZGNDdn1aU2VYcEl4aCliR3JpKzBFUDI8CitVbHUlczBSc3F3WlR3aXF8cWtKfEtJP0JpM3V1P21LakVCP0hqKXd6OENLQWxWKWFzKiVRazVDXmlzfU5yRjBzTCUxQCZYRSkzaGVXUGJXCitzMSR1SHAtQFR2OTxgNUpuNm54UTM0PHVhQVIpZnpoZSotNWQjOEo8MTRzdUt4cFBNO00mdVBGOEF5KndDNSN0SmtjelBmO1dEYUx0KW1VCitJY20xYmkyYkVlSVEraU1UXz5ETks9SjM1JjcmWj9tUDE4WTBacEZSUik+JmRFbipXbDs/MGdSPHhzJDNQPFBlQ1p8WkVLV2ktPndvYnNrCithJlREI1p3PiVpX2t9ajcpWWhiYX5PUVItZE0wVW9TaDQrdnRaP09lbG07YDctZHZ8dGw8a3Fga0hsamJwUV9UYVQhdyYhJlYzbUpsbG85CisyKi1lUUxKPWNTKyspUGpieDF+KXJNaEklOVgrXlVIcTNlflRzIUNTIVhZbTJeTTdQZ1hAdjhgY3MoQVBXS2RqTE0oNkY4dClQZVRoSj4+CitIS1JvMklaTXBsJFNGJGYrellicCFSd24lRFllSGNwVCNZIXVYTGVOZTN4LWo7JWNNbEhGUyFveyhrSSEhaGhib1AlKjYldns0VE09IzVVCitXPGxhbWFwb3E2XyFJWDE0ZWt3S19KSys2JDl2cShWQm1RMU8tWX5Ya1JxVkBuN1VKP2t6eX5pSERhRENoa3VfSkBQPF80RE4ocVFEODxBCitKWG9PRyZyKkhAUStKYCtJbnkxTS19TCVKS09aPk5ITmJ7RHxjQDk1SjRhI2Y9NzB5d1ohMWtrSEN3MHNnUmZNY1d6MGd9N2hSPTh9fDczCispbmo/WSkjX0hxPWUzUW0yYGxJS0xNSy01JjFSM0phMWNCKFIkZlhEU09BZUdoTjN7R3gqdnhYdzd+bz95aE0rVmprcEloJmhoeyo5KkgxCitVfWglTmgzX2tZRndmNC1lWUttMjZxKiZHMDRCJS0yJDAtKTREeUsmayFVfm5CZj8tMzBQe1ZiQUNEMjVrMD9pcTMxPXkwdXJUY3VHdVY3CitLbTJkMGRgJXo4Jm02TXkzO3VKRldEaj1CfClENVhTQTEqRGllMU93MWxIeyFYdFlDRVA3dEJAa2FzeGMjYE5AN3h6aipTQ007cE12WGxBCis0N1dPb25aaFBvcEg7QUUpQE5LVHdqeF52YDJSPXxiTSptTGZWaUN9PGVBeG9OWHQ7MmFjdVhHYisrXi07S2RVTnZLQ3haY0lDPGxZNUZqCitueHYmPXNhQVJYel4xOyQ0cD1lQ1l4RiRRKmdCX3grWlBaVy16RW8rKG1eRXIlelEoQC1vNmhrNWtYZ25hY3Ahb28lYVloIVNxPGNXVGtkCishJTFfS1UqMUZaaUBWKF9kaH5kZWdWUGdUVzdxOzNBN0d5b253KVhnPk00VkpDQER+YldXZ2kwPTFuJElZX1NQNC19eFVAQ2ZGOE5aKkdvCit4UCUoYEUhd0lIOzJxZGpmTmgmanVDY0F7bTY8VXNhQXNqP3RrdCVqcl9GViRVY1ZvbXMrVD1ZUkRJQH1BaWBEPHleRWtYc09mcEYrXkEtCitpc0Q3Z0tSWjZGKDxXPlhNUGIkSDZZNmlFXz8zN3dBaFV1VihSbXM1NXRFWn4yJio7VkN2fD9eKXhNRWNlREM7SyV4U044Zjw3PXBsU1A2CitLLStmU0ZPRV5BZCliSyp+Z0t7bC1SJSkwZ2JkemFje1lEKkZ5RGl7ZlJmSiteVnIxNyt7TiR9bWZjalA3Q21nNUk9KyNHQWsmMmhOajFoCispeH47U2M4Nl9+c182OHNFd0BCK3NLVE42R2VhNkFQI3F6NTxGe01aUndiV3R3ZV5QMWI+LXQ5JmhaYTEoYHR1XiRjcyspcCpRMGI5TUw/CitPeylmRThqZ1cqPmJ4dVFJd1U+X1lZVjt7UVg9JmxtVEspXzNtWUN3Mkl2fnt5MVZVezMpJmk9R2s3e2pmYlpNPjtneURwX31kU3YqeFV9CitmYXVHNnJGTVd7dUVISz1RTjBFdnI/OVVAXikqMjlybk9Fa2wlbj80aHN4VGhyZCNhVmcmfFVadjxeR19kXnY3dSFBTE9CR1Z3U0ZhKCNGCitgOTQ/O3xUXkFlQ1k/cGZSR3YqbG5sWWEtUVpMQld+bmlJPWgzNyFeYSslP14jQlJgPFk3Tk1va3B8RnByP2tlLTlHe3pze19LfTdEdFdqCis4MEomOTFUU3d7SyRvJDwtOzV7ITIjZVdyTn15a3pvUFIkc0d7KD52dmREJlZmTGJvdj51UCRiKk07PXF6PSleNkA3TTViKVE1N19jLUBsCit3JnFXYnZ5O3hIc0N5Qk0jO3dTUkkrM0hMc1lfbU1rQHtIbzRVKlFBbHhkJF8oYnVxdFM+VFplKGItSGZvYWxCQmFwR1N6Rkh+dj0rWUFVCit6WDRmYWgqWTJVSk49I1RgVVA1a2doYCNXZSRFNXE5fUQoRnAkOFgxJioza1FOdjwxJVRpUGpgejNwUUchbVVLPG5PSnhOQVhmKitUQiRICitgdWNlcy1PeDVMMThDXilLUXxzNmhaPyU+cndAV2QzcW18UzdaPVhLUj50Mkp2OXd2UjFiOGJtPGhlZD43PX13MCZ2enN3NXh2e1htXypxCitEUUEtNTdBQzsqNitfJGh+SWNhbygkekN7PkUtPmk9bFR8cz8xdHl5Yk9sa3gxZzYmU2I1dUJ0UUVSUm5ySHpCTyg5elV0aEtgUHprMlFfCituKC09OD10eDU9KXEmZ15fTm1HQTFGMXluMUVyMzxVfSFYPFdMUlRveVIlQXFjLStES1RuRUY5K3xnNEZgNkxIaHlEVjlFSUEpTVMlZC1nCitGQ2BQV3R2U2FORVl3Pj9wVkdrQmlIVG9Kb19uTWBEdVFPQzxJQyhleCNmZFR3cEdTNElaPV54akNoQjdaYnkqX3F+IW5QeUVVRkpOcC1fCitQbn1NO3k8Zzd0aUUwRGlFVkRveWpJITRUciFYdnVUcXFTSmV9JDFgX1kreEUyaDh1PjI9WjE+TVZQV3tKQEdTWkhSbHkxWENQaHFiJV5MCitBS2tjZyZyfGQoWHlGelVfRCVFa1lLUWtXWk5JWHB4K01OeUJ3KUtGZXdWfndsfHgrO2Y1Uz1xV3ghYjxLJjwzUF5NYF93em0hWSZkSEBlCitjWGFSbGdnK0Zadnp3IXt8NWBWejBRN31XMyM7T341PHY2WmF3eHh1KHVeX2M+Y3Z7bl93eTRBKEw7NX41b34xSHs+eHVCSUpLTjxUPi1TCitAKzwkO2E4dHx8bmFlcm80VT8kKGoyMntQPFNyYyUkezEhTCtFOz12JDlCVVUjflNhI3NqRVBjOXcrZjh3NFBxNjdEMEc0aWpDaThUbCpNCitaKFBLeU1AS009TSNpSzYkPjxudn18Y0dxMGVsWk9eNks1dFp5e21sVWV2Y1o9enVUQTIxPWwwcj10eG9wS14/TUdZSHlCfWRHUVIqJkFsCit0Ujc0S1M2TkRSVFdSb14maHA+YFZtJDljSnhDKWgocUo+MihLcFBIIUd9dzZmNX1oQnViSnBNU3E/IXdmdW11NE5HdEwxSWRMOWt3SVg0CitPeGNCbDdxZTxvZEdfTFJxMlNzVE8kKWZpXjM5PnZyUkUpPTBwOXVmSHRxez1CcEVQKGs2YURTcDZhZUB7eiliQjxlV28jO2MwOEklPHIhCit+UDdhdE9wWiF8cWB9NiluWjdsQ0JOX2UjQmZjdWdJdTE5JEVGfHZ+JVlzWVdnTncyIShtbFJwUGNTbk96VCZRQ2IrcCtUSkMmdzNMZ1I4Cit9Mz81cWozQEhSKCYrcz1mRml8cjhyO0NIK1lHS2Y2SjgkfURzUUlkITFOam53SUBzc2pRO3lOdGJ2WkA3SF57OVJFbFNiWH57LSp7VDk5CituZDRgLXwzIW1LVG07I0hXRi08fikzUiZiPGpRSFhpYHdhQUlsaHdkdmNNWC19Tm1zNEBRYnl4Q0cqUSstOWdQI3o8bld3RFNTKiV8bzJLCispXlM9LVZPSy1xWiFqN3h4bE81Q1kta3shTXorY2g1KjElNENPcFdYKGlYWWBRIzQwNTk3eGd2azxRLSE9dm9ZNXllYUM7eWNaOV5ibkFmCis0anZLczJaMHJqdiZURS07TWFpUzEjPXZNWERDPyN5OE9DbVhHKmgmQ0tvUD0jPEE7Zmhefn4hM0YmRS1yPmYkaitvaUxMZ3R2WDhmKmxGCitBYWlBfEh7c2dFT008RUJpYTNDa1Y2K0l3cUNUTnQ4Vk1qQzl2NEEoSmpwOzYrI14obHRpQ2N9a0tYPX05Jlkzczw5VzVOfD9+R0VIU3xhCitvWHZwIyg9c1EwRzNKTmEldVpkfiFPPlJuMyliUD48bT1jbnQ2Zkw0dWV4SDBjb2hHUTJkXkZWdzYhQjNxXzYhdkslVWtZLSZqbyFaK2w/CitZe0sjdzBTenxCbjF7O2dWc0V5UVE7cWZBTXJRXlRYOFR6X2FaaEhmO0FUMEJAYn5aMk53ZDZpOWRvKldpd28rUFVaYl5lc0kyZHxXPThVCitRWTNINCgyNGVsPSVPKTxZNElVNXpOUE0mS1A7V15BNmAjVml9R1Y9N0I0N1lYPnxgblc/UGImOXUraSNZdG01QkNvYX5wcEhrIyV1XzFrCitkOTVwJDEtP1pZNlNyVyReYiVANGh+cGooSzwkUiU8YTFITlk7M01xMH1lS3V3Vk1XY3t+cWU9NWZRaD43bXNQRlZMcFdiVV5WbHA1cjNACitIZFo3S3pkUjgxLUU3cnJmVEo1fmA5SWo/TzhLPD93X24kUjFxTmstc3Z7RylXQ3ZwXj09aTg0Y0JRTCNAUGhGRSlUWVRCVShlfmlUXjkyCis7S089RDNSXmJ8Jjs/clF2MD59ciVyeUBKODBhN0YmZ1ZASVBiYHZ3eT0lZnJfJD9KMyl5WUFiKlJUX199MiVSI0R6M3lOM1VLaSlQPHVXCit7Jj1ueUtGYVU3fHAlI25NYH0mIVVkZnV5S3smKl48PVJ7N3Q3I3tMdT45JndPeFc1c1ItJGVNcmlgaiolfj9gLUt+V15HYmd9VVlXTyluCis4YyZeIzFhTUxKcUBfK1l3WC1uOylLTHhAIz8oa3g/JnF4OyFZRyY1eC1SeGU7enBqMyZ+VUIyZEtCQ3IoQytxY2E8QHxjI1NgcVFScSsyCisoNk5CQmElYnVSWj1QPndiSFpWamptQ2FFNkMxfXhAdDxLcFhEO31fcDdoS3xOcjA0PUZIeEl9U29IaHMxPWxwMj8zS30rblBIWjEjQzhKCitFOV40VyM7QDhOK2s2Yz1iNnooVUVIUV9yOzlRWkxIcmF9JStvNTl0ODR8ekR1anpOIUliITx0aUxRXnhpamJeOVJhLXJ2Ozw5bnFDYjc3Ciswe2dMTWxuVG8kYD5yUSZFKDdLMVlGVGFITnlEVHlNKiFXJHNmUjE7UnpJZitMalM7UDNDcjxZLV5sfmBRPEBIUVEqPCMhekp2cVJ0JEdhCitLVH0hXyZqdU9ibTwkT3YlPnk2fF5sMFBNayNWJl9eMFM5cmxsYW9gcylaaHxlS0B6SlNrKkw5Y2Y+JEFiU0FtMWcrKWpyZElRXlZ3bms5CitpT0Vuc0Zmbl8pUGdhe0AjeFZ4V2t6O0NvJSQ1Rihse2VvYVJudGdeKTNFd09+MEMpKjx7cWJRPVM7Sj0qRCVkbW9gKi0/UnlsQFlNUWY8CitQU2JCezYwLWFORiRaZCklRzZQMFRNVndENCk9PDdjKiMlNGRaY05PWilYYi09VE9vKG9XJilGcGcobHpnRj5DVDZzP1JrRXN2Y1ZAfChWCitLVm5qWVVESGFGZEdiMTtBRWVrRGdkdz9TN1p1cXY2WFpYTDE8a098MCp+YHxCKFpIQ3RWbFlgMDxRQGgoMFp5WUBnUV5eSGl9NzIhOUF9Ciskc0xmT0MlMkM9M2FzQG56Kz85IUM4Umo8RkxxTVB8TVJaTjtfRSszYUlfUTNeenZXNWMlTiohMyROaEpIM0VVVTxwWkU7KEw8SGF+VmheCiswe1RvJkNhNFMyfigrPnNpN3I0OEM/SXZGME1Xd1VtTGNeVkFTc19jWlVVZTxiRVQ9PEtfKj9gNz45M0BBUzBka3QyO04jbE55eyhKa2NQCit3bCNYJDRnKWgqNWdhQTgoTzY1c2BfPkF0WmpGO2tQa2JMe0N1fVBQUVo1N01BcWo1UnpINUhLPipXZztJUXZEKVElQ1lkV207Qz5yT1lPCitIOyRLXzt0aTIjUEYycFExVD4kVS1vbSVMUnlsPlJvI0ZEcUg2Q3VRYFAoa1NxY1g7QUJJSDVnP2I3V211cjRjU0YhP3AyY3cjbUNpUjQ8CitOVWNrdnVZVTFYe0o/I0tLZTF4R0dfYT9taUl+PFVLMkRXWD8+S2ZQUF91MGtFaHI5a31ZfE55M2hnQGFGQ3MhUz53Mk1zfSpSQXo0Jjc7Cis2RHRfKEBFbEJfTGgyQz52ZXBpO0cyQEIoblkmaWEmblctX0t4PFh3MUlSamJJPUZSSmN9TzdGNz03MXozditWOF5KOVctdiE/SXotPztjCitaSnJ3YURYYz5KWFdkVlVfOzI9PEsyaks1KUZSO25IakZBYTEqXzlWbkh0eGMoZFpKQn5ec3UyKFVzOVVSKEEjaktCVmBHaXBVK2QyQ2JNCitZVT8ockNReHNtK0hqNG4+TGtnJlVySihkQ1lLPz9NP29AT01EaldJPmV7QT4oX3tvKS1NS2IpSFFES15LPGRwI21fJClSbDkhaT1AfHxkCitla20kaWAxeXNRK3dGQF93ZUlWTlUyQkpMbUkzOVA3ViMtPVQjVEQ1LU1vbTtWc0hNMlpeSGMtbyF8UmA8eyUqWD09UXxvbFJMQThBc15xCitpQmpoPktgbWQwV3E+RzxKdkQ+dHNrU1B7RTZCVmNVYFBELWRAPns7SXh7OzdHMXJFcnchdXY1JCtPKj50eGNFdCsyUlRIKDlGbHUrS3htCitINnI4KVRIKzJEVHgpMG1JNz03JiZ3WXo4O3htPi1kdXpBaDV1N2teJntQYUd8ZnZLP2xiZmxjamlpU01+e1VLUlpeM3pmR35yWkB3fWI0CittfU45PiNDJjxqNWQ+JXhvfGBqdVotVl5iVF87bmVHejIlbFZuZSNQfnNXbWFqczhPISpFUHQ0YU9PJSRxKX4xWCN1VyFLZG94YH0mYmQ1Cit2ako4KXFFNGJ4ZDRvQ01oKj4xTGtzMWcjR04+QnBlaXN9RW8pYnNFeFIoMCp1UFo5SXQ1Z25WJTY1KSUweGtiVnBkamskQEBoLUgmPTgxCituOyZBYHZscTJ6NVVyczxKQVFWZWY7YUpAcXgpY0w5V1hXRileNUMqLWE1QWAwdUA8eVFSY1QySlRgTW9VXypEamtMZ1ZYT0x6OCNydyQ3CityQz5BYkspI198KVVCfHpYR1pRLX4+N2I7OGw4dGF7NE55e1Aha2YqWWchaHpzbmVJSUU/Nj5pbTUzKm1aZztgRDh0R3xjRjtrTTFiZEJ+CitkX3JxTmAmblV9XiYpOEJge3BnUXlNNCokQW88eDxuaU12KGJuN1ZKdl9kRHJsN09LPTFJPkVOYj1vOTF3e2MqJUhjdDhFMXY9dkxicnY4Cis5Vlh3ekp4e1NVfWFRWlFBLWZ5Vn59VS1SJXlmaDFUTHN5MWRYMWFIfFZjTj8mY1BMWFY5dXg3R0U+YDxOcUZ6X2lQZWNVWlZ2U2h6QDRZCitjSUR8ZGozcj13ez1qYEt9biVqMlBMfT5DNnktcFV7Ylc1M1Z1QTF7WW5jTWBRck9gb1JDaEhgUG90QT9BNlBRPCNJK0YoeChoND1uczcyCitXUiM9cU9YUEV6VVVESzFrNEd9dSM7fDFCKzVZayNuPTIhQyRiWCRtUHhGPVYkTGJmZzs9MlIxdDBETGwtP0ooKjVGZytuNFo/JkxiZi1gCit4UnV6NV4tezZaVTslMTFlc31nJlpNZEszKWMmI1VjRlJyd09ePjJnZWRuJD1iaEdMaE1RfnpVODhwaU45Mi1SfGBjfGNDNz41X1hWb0RlCitUXlR7NThvQzR0RnI9bXtzTEN0dURJd0BEPVJ1PFEjel4xXnNETGtzXiVFK29wQmFhIzUlSW5IKDtVO2xIa2lORk5BPV9Nc0t1ajtLZ3c4CitmYD5jcEl+bjU0X0dAT3RHUllrTlQ8bVp5S3hQS1Q3WkcwRSZ0ant8YGAwMHxYUVIwMDBPOF5PWTd5OXY8QndWKzg7SiF3ZGliOVJMNlRhCitBfE5hVXZfMH5XTiZnV1htbzlDSEVkfk9GTGlXalk7IUpmZDV1PEtaYChFeXtxQTNKUCpHSU02Z1NDPVZHRVc0VFV1aSsoNSptST5fWnZ8Cit2fjslRiRmUTcwaVFTX0FlZVdwUW1ZdD1tUUI7eGM/KHo4VS1qT3FCbXNBdzlIbmZoNWc3bVZuRXw4amZUZXBGVz9tZWVVLSlYT3skKkRFCitFdj10WSU0KHdGek4yOGZ3Z211R3k2YUxtI1pPdkVzKUxSP2ZqRWclcW0zM3BVUn54Xjt0NUFnSzdUbyVMTUVMY2wpdl9MUWFMbldLUm4xCitFXztSLUxMSlhKaFhaNUBoZTlyM0U8Q2VaNWBefnlReDkpYkJMJTRrIytzOyl1NjF6amg1d2pgKElFcio0elVUV1d7UCVoWlhIfF5pSVNaCis9Tll6ZiY1WTs8RWlPQGs4NXt5IyE7OCloMDtmR097eUtXdzM3REtPVGZQbEQ7byRZcTsyZ2BRISR2S0IwSEQzTiExTG97U0NESjhMczFhCitpXlUtcjYxZHVLY0FjJjwxdntgR1YlLUMpKWg/fEFmOztPaSRLI2dnJDNoTlpTUFNLQUk5fEIoNDM3XzdiZmxMejdIYTAqM3xUQzFFS1lACis9NysxdkAjIzsoc1NjamxwZ1pLVm9vIWwkZH5vPlViN1dSNztFMiNTWWNPaVliUzMhc0gpVypiYz5ATHt1NG1EcEpYZDUqT2oxMDZEPUAmCis9P0s0TWFtM1RPbzctTVA0PHc2PGwoVV9LSXRySHV1RklCXnZAYjFsemNkYntmUD0zQnNiXjB2JSpmRXpwJWVyPSZNWEkzejxBWDlLcl5QCitEWV4+MjIqRSNETFJoc2lLa0okRWBSczc7ZFg0dzMmTmd5I0pEXkp6UXg8NCt3QyozRi01P15gfVFgU0YpNikqend3RmVDWFhAN2FBTHQ2CittKmxhKnk+Q21ZNmB0a1BgbTtVKUwrd2lkQFBYWXR4fUYobl49MT1PUmd4bXc0KzRJM3dTMXNuSmw0dmtofEE/OVdIaD97N29lPSU3YEk8CitLPnB1OT9VN3NBUVpGS0sxa20lST9GbD1aQnJ1KXY2Ui1fMFlfLUk1b1phLVlNNDYmWiVMSVVgYERxPHdqdkJyRkl8TWUxP0F8anJMNUMpCitaQiFqR1dWeiM3LXtTTjE2Qy0pWW4yV3xvJiF5fjk7N3x8WUFUQztna19SayZOdDJuaUJLNF9xTnBfQ009ajNiRk1fZm5hNFA5Sk5HO35QCis2WnpmVSlQeGxLQXQoM30kP3khSFA7NEIwaVFgeHd4MEEpPXZyXmclMEoyMlFXKVA+ZmZOSlU5YHg5TipDK3cwVTFrKUFAVF9SMFdDQ09BCis1WVJWNz9pK0pTPzVFcDRYZk1xREFMaldFXkp3cWJ4Mz9zWFhfPnJCWkVjfj4pKE9PP2VROU00KSpvfUo3TVkxMjRvMWFIZHRna25PZ3NLCitSXnpobmpgUnd1cE1YUV5ZVj0lPDd4MTF3ZHJmbEpsTkcpSG0rPWRebEp8JEQpaT5KVHZpMHJSSTZwU3ZsZGJgcGdEJiREWWdmVj5oYl50CitiX3syTHl5Qk8kRXM7P0BUSUFRXn5xKH5VZjUxfXt8aHFNO1EmTkQjfEglO2hWTU1aSHJ9KykxXm9xQzN8blQtTERKbFVLdVpHPkl5SDJ3CishRUApNkA4TT9nakN5YUU3fSFETXAwTElRSGxecz5POXhkTDE5MitjdnYhcSVOVEYha1Z1RjlUZTFBckZVWTspaShadHpFKF5sNk4/aXJICitlIUtzXjhEeVRsZ0tEKUdMKHxzMCZveXAwdE4zQ15MRysmP0dXYzFxd292ZFc0I3NnJX1ebExRekZffUQkYUpvZ2ZKVlpGJUJGTVFyPlhMCit1I1FaVT5GcX5IcUY3c1d8V1I7TVRVKEdRZ0ZyRlBzV296VzVnZExiU1V4K21SQjwreDk+QDBwJmUmMDEyZj8jZjJ9YiE3V1lqbV43Kk9uCitkVnomPk1COWEoWWQtI0A9VExgJXtpd25GXyUrbyFedjJ3SDVURk9DfEZlX2JSZk8pcDJzK19FMTkzOVV1Ujc1bFV5PnYhfG5UeG0xe3xWCitDMmkhVTk7ezVyKmNpYHd2Zn0yYSZwLT9JPWExPXpYbERnWFQhNXtjVDB0S0x8OD9VY2hlekJ2SUZnbDgzYG9DUSh5RU1DaUlrYyVXZmdJCitWR21XXmdHfDIlV3Rla30hQHdEa3VAQnRXYjZ+JWduNDUzcDAkKH0wd2lJKnxhbGctfXBKY3wpekp1YUpYelc5I0x7V159MjJJR1JVX0oyCitLUFptcXorYXZvTGpyUU1ucjYydFpQKWg+QDZhV0FLMm10ZXk3RG9VODAwMDYyMDAwMDAwMDFaZTAwM31sYTQlbldXb34zfGF4WjlmWkVRCis3Y1g8eyNDWD40PzVhJnM/VlV1a1k+YllFWENhQ3JqJlApaD5ANmFXQUsybXRleTdEcG4wYF4xJDEwMDE1VjAwMVFiMDAzfWxhNCVuV1dvCit+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz9WVnF0Uy1FXnY4ZWp6SjI7RmJvOW1ldWEoK2dnJjZxWXJpMkpNLUQyRVJWPXlodVJ9flJiCitaXj8janVlWD1mRWNVUUxXc2J9VFooflNSWj15PVloR2FFND1ZUHZwa0B4VDVoZ1kmS0I7cHFCKERsalBSKkhRZU5uTGE/eDFPLSp5eDx1Cis1R1NQKzdmYDdzUHxyYERfVSZAdihQS0JaOEAwRUdSLXlLQmhCS1Q3IWFPIzJHSCtJWHI/V3JrQUpNbClOPyZ6ZlApaD5ANmFXQUsybXRlCit5N0RzOyRrV0xeMDAwM3xUMDAxQHMwMDN9bGE0JW5XV29+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz9YWTtiNXtWcjZ0YFZffEd6YmFaCitsUVZzJig3YjFyYXNiJnBNSiEhUWhuQEJTNGNydnlVU3h6Tzc+KmxDQ0VSKVNHdFd0Y2l+a2RATj5gYEpsNStPXmZtQU1ZYlE+ZSU8N2J2CitNYnhxJjMpbl5lbGkpQE5OPik+JTliSFBjflJUbHJSbXBeQGc7d0xYMGpiKXVrVFE3MWEjfVFjOEg8RDJUUUV3JSQydkJ7bTR4KyFxXlNHCitWaXQoTWR5fUFmelJiPCRMI3JyXj1yXz87NEBhSyk/bzxuVk88bzttK3txbERiX0JBeTB+Sn0pakFMNHkzNn1BITgzP0koZzFkVlRlZjtkCitxX1cpIzlXdDNtJUlYQj8qPE8oNDgtS0RBdlJ5eVFvWC1FcVI0QnAkd3pwZzQjWH5CWTRjSm8mQ3YrMn41aDNuUUNjbGd9RDQ1ayV3Q3FECisobG4pSkYqT0JJfSFAZTtIPU05Xz5afWsoKUtoczA5c0g1LVZAc1BXLWlLJklUT1U7Jj9TIyM8YVApaD5ANmFXQUsybXRleTdEcDkjY3s7CitjUDAwNm9RMDAxKXAwMDN9bGE0JW5XV29+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz9mWmZhIz9iWUU+e2JZV2ooWGtsYDVXcHBsWmQ4CitKbE9aPTVnP3o0SSQ5cyVTd1h3Q0FtSU9wZClZd2BnVEtGYSNeY0NibWhzaXRedjxGPHV0M0VGc0M5Xz9VVX5AdHl9TnRyfGpVKSE5eDFyCitHeilGKHc0QSRxZU4kY19WKmJuYDc8fE0kJjdUODdwZXAqeENQQ0dpSn1USUA8Uy1TWDlsN3VEZy1seis7SExDNjh8dm9aXztmPG9Sdl95CisjOVZTcVg8fFRCODhORVUxIU0lSSVmUkpCQEkpSH08ZztQdjtFUFo1MHx2UG87RyVJfWhaNnVzUyZVXkNUdHdXdVZiczlOY3pEJS1Xd2NWCitBRVp6SExudH5oaE42QXFJRXkkNGpaV2okdEUyVzg1azAxJGBDa0BUa2dKJDxGbWdFRVBWIVZyWTY5LS1lQTZOSFolZTF7XjVBaFZeO01RCitZRSk7TnFAczI5Z2Y+Zj9OYHIha1k2YTJaQjJhUlZ7VmY4RGZwfEFxV0ctODE9cjVEbCRoMSgyZDwrSkdmNSt9NEJAd3F4U1I/T2JUaDQ2CitVdGdETGklam5IRVl+a2R9c3QtWj01WFkjYjdtVjNucTJzN0pnXkd4RSR0MmdxSU1xaHprPVVHQXVCT3A/eDVBMzdodlAlQmJkdWIxLT9YCitqbTxtLUYkXjtlKTAlQnA1IUpCWHxvSkk+RVEwOSpQUj5CTUI8QkpsY1JCfjdmTUZFKlQ1Yj5acHRAPDxYdzk1SGlTOE4mJW1fWnAzX1VACitebjskNClvYHxNYTRLMmtiX299WVBMUykyI05rRHBvPUU2WlQpanNfdH5NNl8qYEt2LSNQN28/eHc8ZUxhYDd6fFB1JTtuelB2PHklYyRACitwLW5uemxyMipZTHhAKVRsO1B4TzBHYUlxekFXSEp1QDQpUzcqfH5BfWE8LXZ7WV5sK0hrbFgyNC0mUTNZdyVhSjctKDBIX3o3RXYmNDhgCitlb08zJk5NRHI3bT1ebkNFVHZwTVhWclBiYzJ7bU9eTVlhKUNUU0JuODdOckt3fDNOVkswZWQ9KjQoVjJTcSFhajl5cmwpPnYhN3AhQm9CCitUPj05V2xpVXkmZl5ZRCtzamppc0dmXzArd2dgc1VmVj4kP15ZNDg5Vm5rO0FSPG9NbjRSdjxzQXhRRW5YI0ZLSXVFeyYyOFBqOXElNmYyCitUKTRgMVFZLU8wMDtve2xAPj0zbmFhU1Iwe3tTVTVDOHhxMDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJV0AmNzZXcFo7YlktdyhFCitFXnY5PlNNNiVzRmNrZ29yP35TZElGUks1MCVNZGVnRiNveStLc3t9TXohVHV0ME5nbj5CcSsyZWZMVlQ2RE0rLWJRPkc8cEcxfiliazY8CitLYiowckReMU5FdWgzMHQ8ViV7aWlmbjZDQEZEJWRmY25xYnU2R2tYR2hKX1NgRHRUVEQlUWRTX2wybjgtWH05S0ElPCVBVFFZZExHbGgoCitBZU1hZTlpKXFLd0o8cnd0Wl8pZHdrOVZMU3hyZU9zP3g/ITNYJGlYQ1FWfFdjfEl7QilFJStfV2BOczwmYkdYez1AdkBALWgmU25uPFohCitBaDFPJXVTVSFSYzw8SjVsNGwleFJrVkwwREd1M2hoUVYkbih0YngoZV48UTROPGw0PkZMPW0mPE1ud09ELW4wV0RhK3RKeVZpSncxQVJjCit6JjM2WWJ2RnxzI2A4V05MVzMzR0lTdDRfT2FvSjx+RHZ3WF9Re303S3FCUExDYEVjdnJPQV9jQWJ0UG95e0JqTmRNT20+NSope2Y9WihgCispUFRJOT4lfiZvQ01yRmUzQnk8WCZgfD1aRVJwb1BUViQ5TUcqcE5eZ0BlcXA+eWImfTBLVFhBSD1SMTdLU25XWDQkY1N7TGp9KWg7VFZrCis3NXclZlhqdU0kYzc+QzdadnlkR1B5Km13Pi1TSmZDNnRMbSFHeiNmbWopdn5NMn4zdU90bjRNemo7RFVjRWY2OVhHXmNGaUJgXmI+YjZoCiswczt7amY7R1ZOayokdXprODhFajlLZTA0WCh4SUprTDw2Y3o5eXwhdU1JSmFLUFBnc00pKHVMWTREeTZwJSFhRyhrb1RtYTJzKWd4Z3tECitBIWZJY2w7KWk/TXIhbTM9VXo5cUFDJCZONzNaVTc8QWAqaWpaZnhMSj0mQipmI29vejtGcGMoRDRXYXlRWFJjTFVWIWVnYHItPFhQX3lpCismS2h+e2s1diFKfXpIY1gjR3M9azU3VkFPZ0ErezFNdnF0NVkqQWo+aUY+ZSRAJVEhSldZfWY8WWspNkdNKzJELVk1VFcoZiQrRipfKFUrCisrSDl6KDwtc1RZNjR0MERpfUdMRGdMbktzI189U3hnQThscSRjJiY9KyZnRV5ZO20pXlZzTTIhMWxNPkN4SVNwV1pwQlVFYUxGU2dZK0lZCitQQzJXdD5vWVk2K19WPV9uMHNxTWsyUDA+SXJFQWBuNEsxfkFYWjs+RyoyUGZ+UyFTS1RXX0hMclREVnUlSj9uTyVRLS1zVFdfTFV0O35xCitea0dORjBDN3hvNlklU2ZsI3J2dnJIUSlrUGtGOG5wSyN6X1JyKCQ5b2NIaytSdXYyQSRKdSZ9NSY+VUE3NjZmSmchSWFIfHlfRTh1V1lqCitqcz8wc1pPZjlTeFE/LTt4UyVScEQqKkgkTXBpaUppVShUeDZNRGBqJnM+ZFUqKks3Wisyd3poTUBRaVBnfFlZJWZYUyZES0oyJUN6QiprCit9Q3ZVM3MjRzc7WX56fnxGLVB8bm4/WkwoRUNaPU5fOEleUlkkLW5iP0Z2TXRSQ1d7O0MxUEBDTy1qQ085S1FIMDAwMDgwUH5kPU43MGpTCisyKzBOajAwYiFqMDR4OWkwQn50PUZKRT9MWmUod0FGS0JkYVkmQzNZVmxRVENZOzxMRWIxIWRqYlpLdkhWUWgzXlhMQnhhZEZAJENrSn5tCis3elZFTUtvckJoWjs5QHRBTHkjMEdnNT1tc2F0TSRIMX0pTlNBK3FSX15sdHBgSjJSOWxpbFNgRWs4S1ZXQVgkJiRhMzA/Ymh2VEpJWWNgCispUnd8MS1MZTlyUnFNcnE2ViFsK192PD1qMXxPeXJOYiR5SiVNWkpCM0UkYSNAbHNkLV47WmtFVm5SdTcjb3hSRXpFSCg5fXJWVzA4PiRaCitxTjclc291cy1ZX19YVHJ5TVMwPV5ucUVVVU04WV94cEwpejtqeF94dDtNeGNeSSlhITw1V25weVFqbU1rd0JHTUV7KSl0UE1BO0VednFaCituPEhsdmMjck1nfnUrSmc9blRybntsYXxyIX5TQ1lmbClaS3FjRGE1NndnPj8jKGx3cW1BZUQmX0prckoqYml7V3VeUlM4KFRRVFBUUDlnCistQTJ+cGU0RjZZPGE9bD9OQXNSZEszbEhzN3lkQm0rNnVeU0Q8KjxsS0thZys/aHdAbm53KF9IJjBLOVBWMkJyVWdVbzlsQzB+T2VzaXpYCiteR00jb09acF96cGk3YjVTS2JFM2JfTllYJTZybnNNI2FKT3NGU1o9QC1ubV9LcGlKT1N7KHU1PiUrYXV8KygtYFJySiRTSW8jMlVmb1M7CishME0rOFQqdmc7eWdPWmJCUVN1JVZOKCN5M2haREpTK2dhZ0B7QDdPe3p3YSVAVGc0bkdqVGp0dXBfZj1qIzFpYlJuMFE4OCs9VUUzSVhKCisqNFEkKzh2S0pPZ3kyej9AfWpqYTBLMUdjNiUwbH09cTgzLWFHaUp+K3hyM0o2NmBBOEpOc0dUbzFNU2c2em5JM3oye01PU1R4dVA/NSgjCit9bD5ZVyZKYkAyN1VlZF4ofWpuNDNlbSNzYzN2N0xeVyYzUF84JDI3WSRvNyZeflUjTExaUzc/O3xqLXRvdWM4PHRjR2c0Ul9kYzVrbXR8CisrRFg0NzdFMF9Raj08TktjNylHITgycitKbmYjZl9qZzNydFhkMEx6KUFffip5a0goPGNaSi1PViZ2bFo1KkFaZkpKKFg9K3skOHlhaTc1CitoJXU9JXQjcXVYPnEycDwjNDl0TD4hRkRUZHo7PmBnUkBSJktnWFUwRl80QHUzMFFWNGY0eSsmel89T19KNmlXU0krKGtmUjBRcmJzVkd0CitmYlM7Q1ZoVF9XczRQcWFWO0xnbn5vc2Z0MjkwZ00qQXlfO2Y3KjktaldKOEwhd3sma0tAOU9vb3UzMntsTDFKO09HSUNpMlpRXmtXOytmCis1e2I+UTklQnFMOG1jOWxXaHlxPWUqKFclVnYoPVlwPlRhdyNmYnp9RlN7d2xmI3VJWWo/PmJQcjk1cWZyVFZ2S1c2Z0l3S3RTY3xHRXdUCis5djAybWEkfTcmcWZodUVkY2l6Wk5AJUokJTR7bTc9U1RvZiEkO3tULXp6MmdJQyo9PyhIQDV6M3BhVnN9Rz9SWGFhN0JRUi0kJGtwJmtpCitXXn10JEZkYDI2USohYXF0aHEtTSQ+NyF5VWp+ITNLP1AoV3hSdyFDek1rI0cqZlFpbUlDJmNfbEIkMEFtWWB3QFZKbVVQTF8hM0FfaWgtCitQcEA8X0dOOyVhKjJ+c0wpUEIqQXsobz4tS0U+WWdjNWNgU00kKkl0OXleUGxReFdOYzJ7TDl0I3gyfntIdDRjU20zYSNuIU8yMzluSm4oCiskdDw0SFlPVSFTfHNDcCMyNVk3YlUtM3VRYFA/Yj9BQWBDdWI3cX1gMHN0QTNUOHl8SkxiVzJqezteUlR0anhKczBrQ013O2MxRj43JGNvCit7PDh0UTglc09nKjUjcmFZIW5JQXZIaHhBaTx4R2NSPT9SakRCej87bjRLeFVfPT9YNyEkSVJIMXIhTEpJZTZ2X01lfVdaSjJ0OCNJRTdSCitVdS01Qko1eUNHXkZEbDtmPHc0QXcpa21nY3ZUOEk3MXs2aC05d15gN15LKmNyZGFkXkN+aEN3bjB0LSZgfkhKREdPdSFtKkUqfmJCYWU5Cis3ZVkmOHBicGVGJms5KDVJYVpGTENsYGd2ZSpDamw3NmBEbmBKaSl3LUVVcn4ybUlDNDNXck9QTFJCZ1lWUHBwbFNlSG0zVHE/YXorM0Y2Cis/ZHBLWGhgM2xiMGFLMUB0PEJuNy1JNjwzaiRmZXtramU9PTUpQ3o/Q2hSaUg9OzROUkV7TlNBfWR+VDwmZlhPOHdjfWlFUTMoKDVgaHw8CithZmJjO1NuKGhpJXhCV2U2WWMmfEp9X3ZFODd5dWgxbzszTkd8YEJlTHE/I1lqMUlISmQ/MiltPX1KelpiWV4lWSVUKUFofDVvKD9COGo7CitARm1gfmBlYXJCalN5TWc8WHxpRnkrYlBnRWl5cVZRJjBqQT5TIXcmR3cwYTgrQHY1JChRPURRQUhFdFlYSFNFfXF2ckpNJUVOeXUmfWx7Cis7MkRzY2ZacVBUJkEkZkkyQFI5OSt6RD9EcCZZTF5WSzBoNktlYEd5QH5FcF56Zj1mcEh5fD1GcHlQbXUyPXMjTVRSZUlgbX5rcGBpaChqCit2QnVOU2t6MishTmV7Y0U5PytqKSNfb1h3UENZeH5VISp4dHw0ZE82NiNzR3R0YVVaVGhHXjdFRWxZS35OWXdIaCl8VUx1Y2pfZnQ+OF8hCispPzw0aUpOfiN7KTs5YU9zLVIrZWVZcXkybiNLP3t+WHFwfW8kRVFBRG9YZU0mcT4/fHlhZ2AycVRMLUFyelhBdW0jJW9mP09ZO3wlPm9XCisoZlNUQUlINk1aR15wbnkzcUZNc29Ucz88dlQ5IVZFUm4peDM0WFdLbkdWSSQlQ0tiWmFfRmc1NlNtY3I0eHc3clZ2Pj02bjNsLTNaQUxQCis9THdFZ0w9bDFKPDJpUTtsPHIjPlVINjA5N2x+ezBtU14wfFhRUjAwME84Xk9ZN3lJSXJaUHU+YiU3VTt6TENERjZUZmFBfE5hVXZfMH5XCitOJmdXWG1vOUNIRWR+T0ZKQF9NYlkqZ0xGTFBtVFg+QDZOV3BYWlhkMzg9cDNjQGZELVJCZ3VZQHpmM2Y/SUs2U0dwaDRXJihxMEJLZTRWCitkWWgmZDM7R3JWXkx7Ky0tM1cqfSNwRFNRYylVM3VMSDVDITZiWn1VZlp7c2BjRDh8SmQyb3UqYTNuOEg1SkttVWM4eXskMTEoJHxxfip2CitqQH5lOGhiZkAhNWNLbCF+Z2N5dHIwUztgWSMlaipEPCFPSFM+eiNsSml1QU5RWiRQWDk4TktpcytJZmlYTiozNntjVkdLMmt4PiRSJGtKCit5eCZUS1dgZFNob0A2NUVvREN6RFl7Nm1MKlYwfFhRUjAwME84Xk9ZN3lXM15mcCY7YkFkYl80KGJEZ1hjZ2FBfE5hVXZfMH5XTiZnV1htCitvOUNIRWR+T0ZKQF9NYlkqZ0xGTCE4WmJZKmpKVlBqPTNhQ3d6Zk8+NWpSNVdWWUgzPEBETz56ZWpqJFJQeGAqVS0oT3V3OGBLOXckbTwkCit3K2UyXncpUmZrN1ZVZDN6PnNwelRTSD9tZlNrcWZlYEh3MjhUamA+VSEkfSRiK3xmMnEtNE1mSlF3anVkRkZ4RnNpbDwzYXRWPHNYYiRKCitrMytgVjJ2O3NCO3ZoWkZ2OWgrdDJXZiZ8dmFXN3FrZD8qYERPIU48V3NUU08oI2V7VEp6TSMzMzduUz9SKygmLSRyOzw7VHdQYU5AdVRgCispe2lIJk5NQSE5N1c1IyNxZSF0O3h6USg2NlIlX2AhZHtkZU4qe0hVaG9jdD9lS3NOVD1JUH5iQWFGSSNgR305azY5eihYe3krZDlBNUJOCitKc2htIUFNMTZ1aXpyMzI+cTFsZUZxM3k7ZWFCSi0kUTspMj13blRaJWF6WG5fREFsT0dWcGJRKn5FZEs9KUV4aHkqV15DTj89PCQ3MHB4CitVe0hfUFFuSTthMSpwXz82VHdDUVNwYHRHR3FhanZMdCNZfTZHTWw8I2g5cjdJYjhhfHZIcWwxNj4zdDFgYH5EKUtLKXxBRzdUS0FmQFB0Cit0TFhmJjdFRn1pRDtmSmVtbE5EV2psamdeWn4zJTMrYyZOZik5NDJRemtndTNeaChTJGl3cUpJPzlnY2IzQ1ooMVVkeUllWlc2NyZlMF5OCit5NFQ+ZiltcnUqI2lUR3hAX0VZcHFFT0ZecDtyQGNASlRuX3tgcEhncTxAS2w8MG8xQTtnRFV4TUZDP1Ngd0xKQDB8WFFSMDAwTzheT1k3Cit5MHhgcW41Q0glSD5Iej0lRCp5bGhhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PRkxQeWJYPD0rPmRTIUFpVXRlaSVYPj95LUVedjhlUTkqCis4bEZjN0BeNilTcHkyPU0/VSlLakclK0ZsYTErJDt4e3UhXnpLK0hUYW96NkxqPlFHS3otSjNCTUc5QHRKRzxxJiplbG9EdX5FcWhRJFhMCitheD42RTJ+clBqWH5VM0JnY2pkejZ8eXZlSGg3VmJRM25ZcC1YLWlfJk4wdHYzMmVKN2lMdHpMQnJRPWZtc0VldFEpe15mPHNxJWdNfGtJCit4bGlmaFJjPGVGaiRfSFo/WikoTE5xWjhuTiN5LTRWRDcjJlRlPH1seT4mNnM4X31Wdn42MyVlelphTmE2I3gpSHpOM3YrflowfT43bl5NCitOXzllaWkxMV5EYEJFdVhHN1owPnBsS2xHczwkOTZpcmtOeHw0KzVERilyeFYkQkc9bnlWMyFsbUBWZy18QyRrfDs1LX09UityU3I3PU8tCit5c35BbG08eHx8V3l5Q1c/TGlfK3dPOUtRSDAwMDA4MFB+ZD1OQjhsS09MaCRhMDU+dUswNUpkbjBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDCiszWVZsUSlMYSVve35YP2tVSEZLQmRhWTskRkRYPD0rPmRTIUFoYUN5eGVZamZLK14xRlRvTj41XntrPnhhWntjeUpCbk92OylHTTYtJiRlCitCeVckKj5SIVMqWkNjMG1AUEBfdXA/OTA3Wn1sREpTakJvaWFAJWFOb1B3MmYoaDFFRm5SI0RySCUpQVJzKSt2cUJRTzZqQHdLN1U8cy02Cis3ZFplSldENX1PbkkwXkVRcTtlMSZ6Z01nKFB5R1BsRjlocXBYKzt6T0NwO3d2fmIwPCFtJlAjcU1sRztHXkpJV2c1eVhpJHcpbHUmNH4jCitoOzJpYk9ZJX1KJldqPXxHKlY4NTctPzQxWF8lISMocDJ0fEh5TXhTRi1zViVPfj99SEdNWVlAdmZ4V2wwK3ZLaEwtdH0jM21Tc2RxTCl3CisrTXBWKzg2I1VJNE0rKH57b3xfKlBjNzs/KlVZUC0pcmg7enFLZWJ3Y0ZjREhUTFE0KVpCYzM8P0hSR3dAZE5PVnMzfmU0LSoxRnthLX54Citzd1FxcU5oVGQtQlpAKSMpVDJjcC1XbF4wcDZ8NTRCPWpzVDtEKGleY0B1bWhsTG5aKExLSkh5bClEVEU0OEpxaSs8MU10ODlxYUpZKWwlCitlPTVFQzhuT2VTSDcpPjMyX21mUjhzT3ZsO25MPnpmdGlaYkNNTXJ6OGU3e21LaGQyKVJWfjxGT1ZES1N4QnxAdGg9T0Vjcj1UblEhbTZKCitzZSpWLT48bVNHKmJMR1Z7JUVwODxWV3EhJk0oWSVfTVFjS2VPNTYyWkJpUXZ9ODd+NGZ6SFBedz9gYyFVSURGYmJXVCNWWSZna3NJWnhlCis2MENlbkMze1BHYWg8JllkKiU9JjVeeCg+d1VecC12TGIyJkU0aD9qc2whS1ReZUdve2NGemliKyRETk1hdEpUNT9jLVJVbFdjP0VVUnxGCituO3xRTWNtPV5JKWBSKn1JXjc5RktkQEpFXkNjfGxtUilfbnw8YGMrI3J7Z0RMRTdGTkE2TCZyWXY/VXk8MVpoY2E7KmpDOTNHdl9TYyUzCitVQWJHPCp6K0kyeHc1cmJMUGFAJnl3IT8zPmopYmckfHoybGgqeSYzcmR2TElfYktyOFNHM0FMcm0xUU1sRzshVSZWdVBsQHxfIVdkTTxRCithYTB3RTQrbGFabkM5YlJQYHp0XzUjfTwoX09CdWBRci1AYFVXPWE1Mn1SJGk+MUFNcTNMLT1gNFpsYnp7Xys4MHReUnZybDd9UDdSWUQ0CispK2MtaX5OdlR0X3ozYT8jPEdjMnNjakhDMEB0RGw7JTA4PmhEKl45cDhzSmRjSD5LYSVJNCZ2a1J1VE8he0hvV2UoMmhrc007U2tfWGFfCisrYT93YWIzKmBxJW5KLSVEREpzamBgKT9OPEduVzVhfGhSY09FPV5fK0NDRUo5KGhGa0hRUz0lSF95JktqbU5EYDM3dHR3e0hqZ0BmJEBaCit4YUh+UFA5MVVWJFdtSmhvPWJMNlJeX30lQCh3bVhTUm5tJUVnaHIhTDcoPzRheyZEXkspcSlrQSN7NzU0dHZhNTt4KGVAeig1Zz0lem0qCit3bSo7fHQzNT9VPT95bHs7TDJvcjIqVCZmZ1JaK2lVezZAPXd1P15xWFghR2F8ZEdINShpVGYockVecD1RU0QoU1l0REAoV3heYTcwbzAyCisyMEFmXylCWXsmJTNRYD5TOXRjbW9XJSVZeVA0R3pwLUs8V2JwX1MjPiVmQVohI1RxJUVsR283eUpQJX5UTX1mTkxSfF52ekA0JH5CJXE+Cit9MnVBPl5SUWElbn5qXzdSTk1ZODM8eD9xO2JCY09EMV47YzQ/P3g2WHorcUhBdEFHJUgpRGMrYnF+dTwtej9MU3tQLTNyYiVjRDB7dmJ1CitZSWtTfVZBMXpGVmM8PU9TTmopI0lvJDN8K01DZXBgV1NIc2VDd2QkYXhxZEZec0l3VSpPNXIyO1hobnh5VWp0ViQzY2tnQFFaXiQrZFdECitoO312Z1FfYXk7ezNJK14oIVEkMH5lRWFSKUp1UG05bGBCMlpkeD5+engzfjhHYmhIUWlDKT9kYXNvNlcoMmtJMk1TYVFvQGozTyZ1MiQoCitGPW1fWSYmSVNjdVV2dUYlYTdSRmA3JlQydnF7Ym0/LXBXQ2ckenQmOHlwPTt5VjAxQWR2OXppVX5vb2RgNkdEOCk0JF9UKWJ4fHptRSZRCitgYytRSCEjJE02OX5HPnhBZ0E3e0U8b1Nvek4rSUp1QDA9JT5keD1sb1hrVnhKaTtHQzdieTw5LWpMVkllUkA2ZVNwfEVlPmlpRDxMeX1GCisxPSZWIWhiS0FGfTBTV1J1PkMrQ25yekltR0tWOzBXKnNiWXo3ZHZUKmt+JEdFUXIkclRRQG5oNmsoTDtDM2lOJmoxa151MVFGTkNATkohCiswVHgmUlNWaWJOJCFKdDcrVEJHblclSkxpQ2RlfHBNajtvLXYyRmVpVlo5TF9OOzltN1RqakA7ZnowckQkcVluOXUpelN2WDt2Z093dXFUCitINmN2RVU7UU03IWZAdnVIRHxhIWcjY1pkQ2dKRVk3Tko8bHNyYUxyaCFMZHQkIVU9TFQxN0JvaTBxSSo3ajdgWmtZP0tlTFUqVHded0B5CitAM1FGOVV3TDMkdH1rSXxGKEJoU1JTTU5vTSpySz1UZVc1OGVUZkZUNEs+XmM+QWQmcVcqSV9ReXRCYH5HfHBAZ08/R3MxazlLeXBgYzFyCitiYDRuaUJzU2N2QHRfRUNIUV96e3JiWjNsc157RG1MfHNJYiQkaDFHSCh+bWtrc2F4MVNkNHRkST0waTlzTSV4ZHFtXld5IUI0PFZNVTx0Cis9UDVxNjdGS1ExO2N9dzdkKntOTkdWKVUqbXUjKXRHOz1jNVNPNFQmfkN3OClePk1RSkdicCQ+ZzBAREpkODhKUEU/LS1Kc15hdzc4clV+CitsUyt2aXlIcUN6M3dWSSMrNmd7T2E9RWoxI3V+XmZEdUBWQzAlfFVLNnRRJFhDRyNueXNmJUBTWTYoQUJsSERHN2lfSTxTcHVOaXoqZC1pCitoR2woOGROMCRkczVWTmpVNUF6NiQpWDBuWTcqLThhVndsISk1KWhRVSgtfmVrJjF+c21ZTyZrITMpfnRpUHxILSU2fm5gZkdRQ1QpZHpgCitgYFZIUlp3KT44KipTdC1ITV9MOzxqRzRjenhfdXQyU2lFPFNDPlBFM1J7fVN3aHlXTng5aEhuNSlkLSY4aXRJOF4xejYhc1Zwe0lSdUVCCitsVD8tQHVDMiMoP35hUE91ME8xIWxEeig8dW9DKUk1VWBOOUpkenIjU1haWj9nPGBfIUt0Qlg/fEtebyE7fDFlaFFfdHhVdzxyLXA0K2dJCitqKEUpRi1vVTxyUkpFMWVibSVGdXs0Y1ptMVFLUGtXQTspQ01PWmR2fWdFclYlVnpUU30pdm9mWDNGO3NmaDFTSWp0aWZeKzJER0hYQyhwCis0RTN+Vk5GcT5yWWMrKjEyMTNLLVRXM2BvV0t5NHlUTjI+R2p9aWlEMCtlJkcpZFojJS0jekBxZVA7V0JYO345KFlxZH4xfEcoJX45WmBSCitVSS09XnRqVkBUaz9gZUY7aVYzTTAlem55Sld+dFpVVVkqKzV5KG5+RC1CSHNTTlZYQzc2eEkxRExPTDR4cmMmbkdWWn4hP3VVem9lXn1yCis3YnE9OChraWdLI3d6RHhidXN6PWFFUjg/T2k1VjZrNklLb19gVDJXSUQtazV4TE8+Ykxfa0pQU0I9JDBwQ0xmQzQ+TGs+djtEdjJ0QlBgCitfZj5lYntxMUB2MHpjdz4qUlB1ekhsUUhBNlF7dEdZQUR4ZEpOd004QDRwR2JsbUBzVmRETW0qUiojdz0wUU5ZNyo/ZEFPTjgzJUwjVmxuCitRQXdVOTJTOTRnJGopIzh5a2IycyErbG5MS1Vjdjx+X3g1UDw8UTZWKXlsaVhwfGs5LU5CclFsZldMTERHbGEwcHJoYiFKcEFQflp3ZiMrCis0S3BKaWx1aVpGSnNeJHI2VERseV9+ej0oaXxlMT8mZERRekMhfmZuangzJilOTm9CVkI4U25FaGM2QFZsbHVVKztfK2xnaj4rNWllfURECit6MUBWQiNhbX1QQTtXKmY+SWYpJCVxUkUzZWQxVWVQOyhHcXQ4eFpedUlUc31PS2FHNXQ/I0pZRU14T1FgU29iNCkkS0R9aXtPRHYqbEBFCisxJjxhLU42aXxgMCVLRC0qKyYtaEUmNzFmWjBHMmJ7S3M3S19VMUFGezVJLSV5I01nOGVOWFlZYHg0dXsqSGhMO2Aqe0coM2ZZdmY3U2JRCis2cEF4RXFaJiZDOU9qSkk+PEJzO2dDaFZiRUZ4Yjt1eihqQEpQNzYqKFQhRXQ8Rkh0figyUj4kU21nUE4+UnZaYEFHVUozNypzTExFKDM1CitwOzJTRm9jfXBeRkMkVVRvMyZocj5OYkZ0TE45eGR0I3p2R2B9SXJtKXlhME4kSGNCN1I2eWRFTzVBaWlqUThIPEIqRXE5cD1aM1Jpe1JpCit6WWE9ZEJFcX1TKFRIZnlUUU5tX2VeZ1l4eDFsX1I3aDBPNGVUPiFQPCtfRkl4akQ0cnB5eGpKZlFRMzEyTmtRTVIlbX55YzZZVnBhNjZWCitCSEwoUCFyc3swO3c0IzJHJjNBcGVoe2RUOW4md3ByeDNFWCNgcHdtd0d4OGomXlBWO2xXdjxGNClOfVdoQCpVVmAmKSo1THNVVmI4NH5zCit0ST50a340TkZfclVjWX5MaTNWIUkkM2F0Q0ZjZjxPMyl0ZUhYd341cHNpNTdzd1NtclZGJE5nRGNNZEFUY28+dm5aeE80NUBCZVFgalF1CitTMmJUU1UrdnJQPlVheSZBNz9ZZ0NgJVFxLVpQVS0kQjNuayp3cXdpQntEQlU9PjgtPVU+ODxJV1kkIUI2fCRzd1lyPEs2PU05RnQzYCtgCittS2FmeVAyQTZVQSN3IW9Ua29mQTdJKDs+SER4MVREJmU0dVVIO25Sb21fJUhafj5TQDt0NSNCMzl9K1BHV3tSOGY1NURsOzJkcUwkNlZWCit7REpzIyVIN3doKmRMWFZrPFhxZk83STdtX08pMStqeUFrUElMeE55P1BLTmJxcmQhWiRsWTRLTCVYUjw5anQtVyloKXZUQF9vNik/JmBoCis+enh9RyZwVUxwQkVnbUZ9KWgqYnNpYE01YXReP0BhcmNqc3JwfkxtQiRtSGEtJDhXPFg9JXdjKCpSPlYyPSlKOFQjYCEjcnUoJGlsKX4+CitmbkpKXloyVXYyeH12fHt9WT5nZ2tLUyt9U0lXXyp6KWlud0YhKlpNYTRIPHVtcGk1V1JnUDZrSH5ydjsxdl5ebDUwekNoRCZQRUg8KWxhCitvdjlJSEg8ODJCUWFHbmZsdTN4bm56a1FKXyVIJno8SzcyKHkyeVJvfWdTZm1PNzhGIT9HUDFxLXY9NnJNKGRWfjMqRGQ3RFZ9ZGJLZHQ4Cit7PDYoQi0teTR7dGUpfFBGKHU3ekNyZ01vMHNVRU8/bUlFNGFnbjh4ajRDdT1KR3hzdU5OJGhTbiZtQz4oKThBXlpiNVV6NGZQRjE4PDdyCitLRHsxNDs4eCZhTTkxVD88S2pSWUt4P1I4aXx7XnRfKDEwRy1vMUg4VWU2YmM9UmVOTFB4SlpKe0t7KipySClZZXZIKmA1KXZ1NntneClkCitqIX5gT1QlQjxLfl9ucjBLTEdgfCpjOX5eNT5wclRiQypee1hNTUxKJVhvUU0xN3lZQHF5NjBKSGchTWQ2Sjx5a0kxfmdLPnRuVCpJfEIzCitObVApaD5ANmFXQUsybXRleTdEb1U4MDAwNjIwMDAwMDAwMW9qMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFKjxXTU9jMFdwCitaO2JVdGVpJVg+P3ktRV52N1IwOG1RPDFRWS1PMDA7b3tsQD4/alR3ZjN4MHNzSmcxXkBzazAwMDFSWD5jIUpjNGNtNFoqbmhhYlp1LWtZCistd1VJYmFHezdWUHMpJmJZKmdMRkxQbWRFXnY5WlI4NFEmRmJ1dXhSfWViY2ZhZjFqcG9iIUJmZ0toVSRPYTUzMHo8THNSRTtiZGxIOF5rCitfVE5ZT0U0R3RoSiM7JFFtUGtINktHN18jc1VYWUIjeTF3VDN9alVzPnB8P0NRSHtyfStiMi1TU0x2a0Qye2M7ZnJvYz18azUod2hTUSMqCittbH1lcEJydTRRYjNiWF4lbyVkR20yK09URS0+Tz5teyVNKlU/WXorNWpZKjRfI2B5PGhRU1M5QUVUcF8qVnl3MVUlNDFmRXh8VnRteEE2CitOOUR+Kk5qSk9PMkxxMUt8cDFUO05lRXBofkB1ak5XI2c9KX02QGVLbzd2aDBDQ0k/JT8kK0d5LWRWYT0wMmI9eGhHNypqRkUzTXwyIWpJCitAY35nZ1QmMjs5Mk5HcTN4NCEmUjBTeSp4ZGQ0cVR+VUFnej4yVDswOFA0dW1HZE1UZmAwbngpKzdFNVdRemdkUnFWMDxWezhLUVFYPzVZCitSbns8dnJwK2R0RmlEaSg4dCNLZCo+VVM7bCpzczw7PytnITAjeFlAY2VzP3EpbHNvOyRnP1BxbWgqRT82PChGZll5Mm40SilXM2IlV3l9CitzdihHeU1TSyV6e3QkYmYwS2N6bHt+b15NSWZrSCVjRW4tWGxUbEJxNU1KPFlHSzt5b3U2QVdTaT1XQU91UHxLQWRKXyNQTStxcX1Pd1JaCis9e3QlQkAkY0d8WTUjfTdIPld8dnBvUGlDY3Ble2JZa1ZQcitnP24hND5FZksrZTxiISNRZj4zQ29gbkBUNE1aMihaeGdhampeZkt+XlUtCis3OGY3ZVExbkpTZEZzSiN9Pk8jJlApVEhaT04rND98fW5yMHlYc1NuemA+SGFUbWU+Myh1Vn1pODVHJGRsU2FHSCMjemZlbTkxUVktTzAwCis7b3tsQD4+IU9vISMtMU9OYXs0RkNXdzAwMDFSWD5jIUpjNGNtNFoqbmhhYlp1LWtZLXdVSWJhR3s3VnMmWTNXTXkpNUZKRTcyWmZTSTFVCitvTFFZb21OZTY8MkRlel5IJlZLU2t6dVAwe1U/Pjs2c2BYKzY5XnYqbWRfKDZiM0RnWjhudFhhd3QxIyhmezVWUWolcGthZjlSJStac01UCit6Vn5MUihQKHJIeHc5N1lVfGE9bTRXJW47aXYoLXVWTzFNam19JiFzUytDSiE3MnZeQzF4YTEtaF9McHFSNmo1N2V1Mld9YjskKmtEWWJCCityZCg7NnokRmN+NkswPDEhQEJyYXloYl9ueW8/T2twVmdiUTFqeHkhV3FGQDJ4OT0pfkB3b0hPJU5feyhsWXlMSUorVDNjUWhVaXs8PDckCitleWtzVCVrbiEoNDAqaT01cl5RcFJWVyV9aGRSYntaKUF8YUdEMXZ1Xj13Z3sjUT0rYDxJd3JhVzNnanclSWwtO2BtVlhTU354X1l4XkRJCisrcGV7ND5FOz8/ci02SlZqPHg9fT4hJnEjNTZNVVEkdTtic242Yl4zZjFaQEtMXkg0ZElEZTtBNXkrNU1DNXlwSGVAOHcmWS1pTjgmN2BDCitlVzRSNFNieyRiKHc7YlordlZgaVk1MlMhZnUoNDNHbno9WjlJeU4tLSswTHxKPj9OJkl5Y2omNERSayFIPDR5OTw4MikpMUZ9JVdXcTwmCitMNzlzOEgtVGJHUExHdzg+O1pAY01pZTlYcTI8OEcyKkkwRzlnd3xtMTlsXn0hJlApQU1uRjxpUXp0MmBUbk1hfXFoeTFtTDNpO35PKXhICiteIzZVT01Ba316IWFZYSlAIWN3JXBTbHJaKmBWXjlSYSV4eE1AIVRiSG97RXs7VX0pcFpWNHNuclEmOXg8Jkste3pjWDhxKXdfSlBERDdhCitHSlB2RnghY0ckdHRSJXJPVGlZd35NYTFtMFYpUFhWbWt4JCNhTn1oZ1U1NEFPYXYmbzRUUS12LSpaOFEjQmxXIyVpSXF1a1NvdjcpbVBgCispOXBmbTFHe001MyFyQl9IcGJCOU1eZVRTbnE4O1R+dTxFQ2tQYTg5PDc4M3VsKEUpSXBUd01hTl5yUT5mOHNxKlRuPmE9RVVoJjZaMXZ4CitBVDBpNio8ZDZUQmgkKVpweXRPJmd4VkVhd2Y5MENkamElMXwhU3JVQFd4JjErSH4lIXhFRk07VFlXO29pbUwme1BWOTtpcHpqcT5tXz9FCitySGp+cXI+IT0+WFYwaGI7bHNtMGB3ZE5JM2l5dT9AZXxLQ2ViUVlpTGVDRG0qdXdgQ3dzQmE4RF5gVy1vbHNVMHVpZD1+VzJNVjNHSTQyCit+IzlpPlh3RnchNnVwJCU4OXchLW1OcE0oMXl4IWtsK25QeWVrMjV1VkhZIXs+O3l0ZmZqZnhHO3A/P1d7e1BrYGkyNH1FUVNiYERVNVU+Cis1eUBMMVo2IUx5UHgjUSNBaU5pamduJmdld2pVTUJSK0JxWUdjb2c8OzZ0QyMzTkowYEBmRHtDSGxIXndWWjFvMT5eJmdWVGVGZyY7UitFCit+NF5zZysmPEZqJnZpeyMqKm48dz1SUzx8K3g7U0hwSUlRPVV5I1ZXazZLK1Q1RGJ3MkU9Q1diSFJ9PTB7dlV4TjVGb2R7Y1k1NyVrc295CitQWSl7PWNIdF9IQjY+TSUySm5COyFJd0BLcXRNdDk1OyY2cEZ8ekEmNnkrQFduP3tgSHo8cXFNaXpFR0h0Iy1XKSpaT19DK1hibFYrbVVsCitDKVokcCVzTml9O2B1eHNlcztuKmppK3VmQGYlcUc9e3ctSjFzO3BMRyE9TzZZUTk+VUQ4aEs+YWgpfGNHN0NlMi1DYSNpNVNZUWhEWlpJCit5U2syQ2FpI1NiM3d1RzktSmdYZ0cmWXZ4TzJsdXlNWiRDcEdoYnE1NmEwS1BFN3xBUk94aDkqekZJIVQqTnx2OTFxJnI2bnZVcjEqY2Q9CislQyVBaHhUYCk/djA2NTYyXnYyIWtZNWtzPCt2WGkycip9dTFfZjNPUDJITHFsbUleJXo3eXclYihuQChAT0g8fWR9VSQhZkM3I25zZ0k9CitzO2A4bDE+JCEqNSsqPCkqc3otdVc+JT9RZk9HKy0paSZiRmNwckdrUS1XeHEjdClyK0RnJmhUK2doQXYtPSt7cyZNPzB8WFFSMDAwTzheCitPWTd5eTl9d2FMazw3e2syTEBRRGdYY2dhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PRkxaS2NXbnkoe1ktRDl9YjF6P0ZWUkwwSmFDek11Cit7Y2p0JF4+X2FqdGIoOHRDU1QkZmAtbX1aWHgoSHB1bW5NRVl6MTc7cGlZIzs9NSRuIXllTXYkfDkkVTBlaklzNiQjVDtsaDYkKTYtSTRFCiskQDArajdNczMqTC1MZkBwQmt0fikrLXl+MjdAdW9ad01OfDgtJjN9YkFFY0o1cDBjKTxyQ054KU4qZEFkTn1udGQjOHomTHlBUHNYc0hWCit7SnFsYVV9TXt7VEh4OGxTdUR+ZUxwK1ZJK0Z6ZUphNkU5PSRFTl5Bcj9vLSlKZG1BSV82WHZ9THMpVi0rck0oOGFzZys0aVghbWloWF82CitvTSkleyRSKCN2OCNUP0dwPk9UWkB7KEtHNlZocnNoQTEobEZzKyFHNzVGejdAaEZXVG1Kb19gJk9pZjU1aX1JQ2pxdmMmaD1oUUVifT9WCitBWmd0WUJ0OyRLbWhRRnpmbVJsSk5Qe1VMU1B7UTBzd3ZWMWtuPnZvVitGbSpvP2hWSEF0JEcrSVgmQ15EUjk4PCVHY3AtPTRFRUFvXkpWCituYFliLS1ESnZNIUdWYSRsJE1YP3R1ZCt8OW9vWUYhfD5fTnhSZFM4WGwqdnQ9eW48YU9sfktBJmA5RUUwOU10PUt8MjFFaHR5VSVAPHtGCit9ZVMwWE9GTmJLIVo/Z3loYX1Ua0dCUURLUm5BTyYtOHI1ek9PSmVVe1glQSt+dUE1ZCZQQ2xLU29SayZVOG5rMn4jI1o0Yj1MQzVubVNFCit6dG1nZXFtMz19U3tEWT5ecV9oXkxNU1IrOFNISmwmWDQ2aGxPX3kjblk4TCYwZTJ2TExgMiFOZkU1Z05YLUtMTldjQmA1MlhXPSo/bDAyCis/LUshSEI/WT5eQXA5RW9vaVpIdU13TXYkMU1PKzBucjA/THc5OSM9bzhmY3ByR3hkTWZQcUVIdTh8UiNJclJUPVlsdVJIRiQ3SyY5R3spCitga2FRKXJ8IThoanBpbmdaQmdMVThgej1helMzRjQmUm5iYTZDdzZ3OElnUnV3SmZad1JsNV81Z14oUnVBfDN9cGJZSD11cUhMendBdXRuCit2TSNGQCp5Mj9jOTB+KSh1bVMhUHBlVUwqdmJ0dnFwZnkkbT16JS10P3ZAb19Bc3ljWUl5Tz9IfEtxaCNFJH5DeyY2Km88ZjtGMjl2fUxDCisxQXpQcTA7WDcocEw1ZVVWOEtwMVdhWFRORXl0MU9xeUBgWWhQVmlJdUc3eztHLVExPXg5Z3AtUEc2SFFIWDlKUDtjVVowcmRmXmNwNitiCitDaWs4ZWcjXzNUSVpeVyRqNW8/MlVVQ3FGc0RkIWJzeSR8Q0N7SHVkLX0mOzwxdUVXSn5KV2xIZ1IwPHtxayQhaitIXkhhXjk+YzBAKDtiCitmLWkmSkx5a0FHUX14NTZDMUlEMCs7Y00zMzRHVyhvUGkxKWllIU5AKDRRU0YmazxSYm1iez5rS0FpRHB7M214WVBwbCUzTi0/KT5PcGVXCit6KHBwcXJ4VCgqV2VjJTVlc2hrKUlJKUl6IXsxZURyU34wVCNJeShUWEI5ZUNUaHlJTj14K0I7MWxOcjRBKnEzWUlzQlRNLTBYfDhHMWZOCiswNnxFeE9abjJHRD9YMjVpelNsIzZiXjBxPH0oZ3A+S1N4IW9JQz1zakxSJDdfZWlnMXwzdiNCSSNJZz0wOEt1diF4Pj1wYVgoVDdqbzdGCitVOztgbUBQaXJqV2wtZHphK3lZcENPOWNjQUJHLTd+VjAoKGg/a3pufSQkRWBNcTNlSCQ5TXFsd3FmLWAmQ24jN1U3TkM8X1N2UVp0LUZmCitfbHM9dEorKz5veEtVVVRnTjZiVTNnKG5SZVE7RCN1PDxNJnhmSlloZmxAQl9wZ3k7ZHo4cmxHaGQldnp5Z0tyUmR2WnhIMjUpTDImaEhFCitjdkxZODMhNV4mRWZkdk8wRVMqRnZqMVBuUWlIO1Z7WXlPcURYSW88fTIlQWc5S0cxdm1oOzFEM2I8UzwlWV5BfigwK0xuZnIta1pBS0lFCitHeFBRaGNUUjEqRDU0T08+OGN8Uj5SZ0BVbnFFOW9CZHB3MV9NOypXcEdvWlVrI28wbHIxc1l3VkF+WkBJSUN6bSFmYEM4dT54STNlfVNACis4cGh9JnFOTFJ4VzhPcj9gPDdRMXMtPkxiY15uKnh7NFp3QVIjbUJycGZiNm4kKmFATmBUNlBEWk13YHNAKylVflZFIXwycHk8byh3XjB2Cit8P2o9JD9jSkt6ZyNHaTwtLV82KXJtYUteTjhUJmQ5aGozZCo9a2V4cW1Ydnh0Zm5xNTRQTUlRaHk3eT1IcFJYZEc9cGR7O29LZlZ6WmIyCitLNlV8UUtkJUJDR3VSR3M5MyNZdiV1KTsmODBvT19DdVFfI3Q0QFBPYThwem9xZHQweiRIWkBJU2gmKWhEKylgYi0qJEpsT1Y8NFRrWmZfCis3QDEwKH1RWi0wSDVEbkpYeCZIeWZwJHZqN0xlISlebFFqX1YrI3poQSVwMmxJQUF5SWMpKGE5MnwyMDhYcTY0c0xMM3czbWRIO1M9X3FGCitVVip8TWdZRS1WVjdUTGkyPXA0Zz1RQiY2VkBMQ0JqR0YmI2JjbCg+P1pPX3B9Y0ROcz5sQSlKc0t8R1ErYHVYa0g7OT1IPnZVRG1aWnV9CitDSnhZZlRiVmIwSW8yPDBXNDduZHA2enpLVil1MlNuJEAkajdjWDhzYCQrd1IxM0NYYmZXeUtKeTk4IURpTCk0TDA7Uz1GbU1aV2lwKGB7CitqKWNCclEwODk2VmlBaVY1S0NPVCNnJmBHYFNYMWg9N0pUdjJ5SWJ0anhnUk5WVD1mPHpKPTFtSGxKfmY9X2RaPTxsaiZFR0E2YD8+YU1wCitKPFI7MW9xWDZiTHpsfnteU3tWKGUpWS1+RFpmZmB7WTM+Sn0lPGhBa0RORjsqR0NFSDt5TFRqSU9LeTJHI1IlT2FIV3B4RnJSSlI3b1V+CitGMTs1YlIxYC16UH42V1A/Y3xGRndMKVFFRVFKYH5hUXEqaSR6TzR0KjNJUHUkQUhxVXIrezZFb0s5YU5hbzlabzc/Q0ozQ0lXK3VDU2gxCis1JTwteSUtOFNqO1U+OHlBVSVjSSFkJUtlc3VJaEdRdSgrIWtGJDBkb3VBbGp3QTdOUTZWTGMra1p6aSolJH5jI1I4YkBodWwqcEk2UTwlCitQd358TEM0NCR2cWxqUF5yfUt1P2RXJXtjbjx3PyVvMz1FMnQqVTNkMDNOaH12VWBCWHRDZWN0eDI9T3pnSGFHN21ve1JuMGZSMGZ7RTlgCit0PTZrflFSK01ybk9BM159cUk9JjtCU0tQNDFAc1c7MDh+ajB1fWtCNSk8IX1kdmBgJSZzM3pMZ3hgPDhWM1NoQ2JiRjYyIXc2SjRAWlVgCitgdyNnWkR4VDRNd04qUmZEVjspc0ZaZ1B0bXZhU1RaS2lqKWFDZ008dyYoVSQoOUlzaWApP2d0OFhySTx1dm90e09jcHh3Q2dhNCMocmFECitgcFkydjNATz97eE5VeHNrVXF5S2F4cWNybz8yazlfcU4rdXU+Rnt+PGlzS3xMV0h4UjlWKkUyQyM5Plc5JClrckR9Zkp+VyNydyFZbj1WCiskNmpOTl9lRXQ7VEtlRiEoPHdTYjJga2loWTd1OHJ+UEV5YXJnVWtJMkdkPDBHIXlpN1FDcT5yaXIjUnJrcHg7NVhULSZQanUqTSZUfn0hCit1fTNZSDQhTVBZYGdMQH5vMlcqSE98LWVfRCZgM3lkQ2deQS1Ke0lPZm5yVWIpWDgwPG8rYS1eJnlSe1lZfSNQISRRdTdMIXQ4OHgmUEc+CitnTzRvY2ZkZCFzKSNWZ29OXnhOaj5WfFA8fWx6Xlpva0FqMDghfm1pYiZaa0xNSlpJMDdydzwoKTkrRkZZdmUzQEBiYD0lOGhoYitjV0B8CitRNEY5cSEyKmwyVDxDS2crQDlaen5UYVg1P1lvWGVoJHorKF4oXlIkRVA8KndOLSl9bmt6RSZNdTJUWUxsdXB9fjJXb3Y8TSg/KWg0cDs+Cis1X3w+VFpBTiZle2hOZG1DUDBRWWYqVGh4Z0Flb3Nme0hWYjxSLWdzSDAmc3lsfXpUPmMlX2dpUUQzM0EwPXg1YTs4VXZIe1pPcVUyYX1wCiskOWkjVmp9OFpKM19KWHhhUWQ0PzdfM2BHSClHNFV1fXVmMTVLS3RLY0BeMHd9biZAfEp8RjE7bVc/eXFUSC0mdEFEU1F6ZWgwWW92MzNDCitQbntYbm9QTX1yWSF+a0BvUDB9Vyg4KT5haUtPb3RtaTk+ZSZYJT0lc0M0JnReIVVkNSRqPHczK2olOSslU0VAcUtaekZVZCZxSiZAZ28wCitaNnZaPUZUdF5qQXNJfWNTbitINyY1UmMqNzBVQl85Vk9zKCoqSGhQSj9PKlNKWDFNbU4pT098flFIeVlxSVhFUXJpWU11XnFKUE8lI0ohCisySjZBJVN+K2V0KXBzdlleR0xUXklMVnFienlXWlN7RmU0fVlXUyt+UDlIKlY0JUptKSY5e2JAeDMhRihMV3lsSzh3RnhqVzxhYStlN1pACitxVUBkaDQ1cnNCZVF3YmZaMkM1UEYlYDxhX1FXP0phU3lldmJnQEpScERsbjtnUnhyMTdRQTxDa3ErUW1OeC1oMUBZak45MXBsSSZxXnt0Cit0Zk1KU0FIOSpZb1QkRiFqMjswRHxHVTY0c01tTkFqY1k5eSFUbEYoR2pKd1RHTjl9JU9ePiF2ZX1sRVBJcGsqJmU2a1EtVm1vJiUwcWckCis0T21sUz8jRyFeb2FSbnNWQzR5I1UqcTlpZylPekREWWE1S1o0R201bFBNY3s0eGlkOykoeW5ySiRLU0FgUU52cXRPdl5uay1ifj9NeTdvCit4SUBHSmpfJjJuSSZhPkdlSjIjdlpvNVcqK3QtcSlsMiFiQGwpdWVsZDYwXjRyYH1EcSNjeFhtKE9LMHdIKEFpfmVFbzJpLTFQTllpWSROCitQPVpFVndgMlokT2s7OGl3IUNDZVpXa1ZEaChkS0d2N0BNRUpASWAtZyYyVTwoYFV3Znk3KSF0aC0qRHl7bW0xSF8ha2RMNHAhbyN8am1yCis9QWs4RCQ4VVl3Xj5gJmBiUlckfiV9QSR0TSFzX3lrPik8SSpCbCgkN21ZVmxkOy1yMFJRQk5Xc1YxN3hEUHBnUDtCT2FYZ0h9aFNZQ0BDCitNUWh0TSlDYiQrZkpWNHpDSCg0SlBka3goZj5EV2c8KiFHRyt0Km8/RnY+eT9NVnFLd3szenRBOFNXPzB2SkQtSWtDLUN5VTFTUV47NEdxCitTZFA3ViVPWGVocnZALSZJWilGPkNJdnx7NG4lfjNEVGRkajV2V0YjdW4lVihLXz4lQlo+YC1yZHBCZzwlbktZflJiZTkmN09yQC01Ykl7CisyZ2R+P2htZld9NShaJHx6X3g5bkshNndfeCV2SD9QZGcqRldLZmdSTXU5IzVSQElhdnBQe1c0NHR5c3pJZzJnITVsdktGZWtzIUs4Mj55Cit3ZXJsbG89K01LM0VMP2lrZjE+QTEtYkk0OWx5IXtRc2M1TiMxdT5PZE0oTCombm04PkhoMWBKcyojSyY+S08jU3hUMTc3SnR5dzMra099CityKHd7QEQwJk8zRFp2djV7aSZ2UisqQ21HMyU8azJFM040QFdOWEo7SWs7XilPSStvMyg4JkhUM15LJkBgVWMxM04qTU1qXnhpSV5XSHtrCis0SzlJPGhpNFQhTX5McGI7SWxOMnQwaEpLYUtyc013OCpKM1NIdE1mLWgjQyElM3pITmxxKjY3an4/TERMNiUpZClXd0pYbEohdl56TilRCit6dD0/PFRZQXYmbDIwNEMhWlp+VVFXe3xeRCtRJDc3ZW5JcTlHaG4rYXFmUF5WJkthQyMxXl8hU3dvbmo8VHFSMmhPdj91dXBlR3s3X2dzCitkaGBxUzBrWCVqeT9CSU10PWxKfCFnd3dOUkRxPyh+aX51XyoyOXVDfV9hSEN4RkZMLVUlclJHQGZ2N0VpN1J9ek4mYWxLRGJVUjFjTUZZCis0bExTbU5fYUpfRnFHYSNGfCN+Uk5OaiYyQiNjQVJ6dGI1eiNiQENFVkhVaGlwIzQqIXAhcWJCNzMzczZlfjFRWS1PMDA7b3tsQD49fkRsCityX0YyTEojU0FwaWc8MDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFHezdWcyZZM1dNeSk1Rkp5MFJFXnY5Qjhma0NhSHVTckgxCisqOzs2eWVkTjFrSEp6UFAxM0V7a2AlMndZKUF1dnZGTWJvNG97P1c0RXluV3EpM1hTTlpFO2lDSzM1QXpKdT5qUzZ5NDlxRjhQQ3JYeGp4CitYdVdQYmpfP2dAc3xfYmJ8REtfZS1jZCV8Q1BTTnNGNThrNjczSE1FNmBSZHdEPyNMO3VKUklvRCspRGpENzxGcTApU15+QHQpdXg5YSQtCitpVCpEU09tPVUjUjdNRT9xSUJxITg4KWlYNkdgSj5namhEb0xZJmZtVmNITmVuaW9DfjUtZ2J9YjdZSkxENn1sei13NXtLNVhqUElmZytECisqaz54JEgqO2g0aUE9WjctezUzSGpqR31AaVgmMUhvZEwmdXpWZV5BRUxfVTFjVGEpbEAhIUtOcmMzQWB2JE15Z2VZTktlRTk1fDd4KylmCitUVypmNmFWQ3BsbjZSIXx3PX51MGZUTSFsc3BEa2Q1QWU1bV5xe0hCMEM3K3peYGszPmVgOCRfT2l6bzFyXmdaT0RZY0lpTVlES0I8bDQpCisyflB+RWs5fH1vekNEPD93OHxxdVRsWVZfNCshS3BqU1UlJihXJnc8T2B5V2dRQjBFPGhYWF9fKDJ9MCNGISowYXM3aTgjY2pZT1ZkQFV5CitUaSt4aiFWcE91KH1xbl5ybDQ5eld5Q0dEVyUmbDt6PU0tZ1Y5RSN0SXlacXIlQ29MKEl8cV9majBBODRDLXtiMEBDMUYjaTM+JUN1RG0mCitOdkdTYkk4P2ZeKmVCUXZgZyVyVFgrWk05c1Z1SDxlKlJEeSZBSllvZ0h6aygxaFhfdDY/QypGKWg3eURMPDxvfmA5YHNHfjtIR3I3VytOCitsO0BRYiRiT14/QFcodiZDUEt6WjhvdUlpLXBMTFkwfl5Aa0grQCRrMF5OPDZKLUZHdzIoSSNgZWd1R3A1Qzw0aTVUQk1eX3xOUSYhOSFUCit+e3ZVXnVxLTRlM3RYPHdtfE9KQXllOGdvUERUTDNUY0pWfmZrIXt+WTJyWGV6azdHN2hKK0RUTXR4c3dQMTtzMjtfM3V1QkhQdkFQJT1DCitAISpYMClyaXZJJCZpLXJqRkZAOW9nYjRwazE0I3E5PlQ1QmlDK1E2bDhPMmM5ZEItajR5TSlEZTFyO1Q1eGp6UUxjTl4tdmJ5Sy04PlJtCis5MDlLNnZEOGJrPi0qJTJjQzJUKmB6YS0lYWZsbVBnVDUwJGtfP3RjVylTVmwlUz83WW1gWUttbWElMl9KZTdAVFdvU3JiV0E3T0QjO08hCitxKnMyJkgzaT5QPSRoQmkrTVN0Zk1XI0lAd3MwUlFTOUV3WGZpbz1XTnBBRHwpaWpxPWYwI0k8T0RaRTAtVkZFd3BJfXtkQ0QmWj8paWlhCitXQCNmY1ZTN29VNmEtYXhfUTVZNDkzTiNzJCorfHYmZ3VNI0thYTdzd01JQ3pBZVAjd1J7VC1XczZjM0ZYdVdybTJtemc8PjEhVmsjcnExCitfPlZvaEdnZnNIWHNPZzgwLVdHbTJKV3QlZE84NUo5QD9pNDhSZFdmMzEleW9XYUZEKjQ5aUQhSS1FNT5LcXEzQHd8NFF9OzswSnV7Z0RJCitkJEJrQlZIWTZ0JDV7SnNTXkgpenpuSEhOPmwyRlAxTH1ybSo7TlptZDtoVnBzUjtlczRZWG8mdzBwbnMlT3BOS281XlM+cm5PdnFXcDJLCisoPkhIX2tqQWc4YHBBfUJTRitTZy0xdUheWllzTGBQITIkUCNSRnVJM0AlMCtQX0hEYC03bj45WXZfaW5OdihKWUApJkBpUCg3VjMjMk5iCitfKXh1PilvPExeT2hJNylHOWNxZjxke25sez8peW0zNXlveio1WiFgTVhKKWB+amloMzRARV9nYjhqbFZZcGVrRTlhVylqKktvQFQrPkReCitsKnY1XiYjNWwhanp0ZH5pM0k1dkRaNUdTZHFkdFV7bypZPTRnYUx2aHomYnVrdytTaWpUcyZ+NkcyZFBlYUkoPGQlQG1Pe0VifjJjXmxoCiteaXN1U2t1JD1iYnRvTHYrVkIxYC1TWk9nYWkjXjxPMVp0aEgxfUBHIXo7PHVwb05ObjI5TCRnY3N7PXBjP2V4P2J9VVVPd3QjQ21PZkQlCitubjcyKmNYPXZ7UEg3Nzc0OSMzNDw1VnNTamI4NHlGfD1PXnhOXnQ/fXJGaVJlUnNKbFp+dkJHM3pVTkFjUl5sPl5FWGtqRCMzYnFBUnkmCittIXItN0xKfXppTWo8WEV3alZFNVdoPUhnYClnNUxUJU1sRSh2dUVXJX0xb1Jsdlk2OyhFS29IM1BRd2QpSHNkYGtKTFRFbXtLc0R5dWZ1CiteYnRAMzRsYSsjVlJ9SEVYPkNwY0xWc2pqbyEkX3lBQzZKWip5MVBLJSM1NlUxUG4qVj9IbD1YPypXK3dxJnk1eGBqfj99Z0tmT0hwYSg7CitIUEM+RFF6SmRecXgrdDxkMkJTdDtSYmxiWEtmSlZ3eCtBMDt0eX5uQ0RMV0doZT9qYnxqO2pgTzwrMStVJE58Tk5pSkAoNUIoMSp8aitHCis4bCRWflBDbjdCPG58NHNBLWhrTV98fCRfJHlLdnx3NUNvY19mVSolU0NKMnN0R31mTCl3Ymo3QDthK2BzWDVeMCU8N1MhYGVHaSFYVD17CityOGBhZXw7ak8xNj0/LWlRfiFUYEVHb3E5dUUkTFlhSlgrOFZrdCZETGMpbCRZQ3pQWjk7cmEjSl58cDR8eG03bDxFYHxuOzQ3UWJZY2gqCittPWp3PWtWeHVNdz1FbjdpOW0oWm09QUgjNk9rMnRmV3xVSmArQz1qIX1QRXt0YFNRKnBUc3UqMnVFPXdkTSQ2VHpmMShAZ1dfPzw2PDZVCitJantGMkEzVjtxYnc8SHhgenM0VmlWdUxUdSM1JVkpRylya2IoSlBlK2pKVXFeKH5zczl3MHchdldybktkMShURHdpNlkwNmJsVVlBY0hQCitlKV5RdjlxRChwYnwqKj1KU2w2RVl1RUFNaT9mcUVVN2VnY0N9KV4/bmZYPl5vb0taN2dwZ0RkWmBCYXU3ejJYOVYkY1NmKCFvNE5aUCpYCit5d3IqYiNjO3RQQW5fRipnV2loRzFyMzZgSklHZ15+bztXenhWalVRb1RaR15KWFc8WkZ9VS0mQCtHLUpST2lwSGhYSDw9a3hjNS1wJXwkCis0a0QhNnstbWE3diF6emk0YXp3fDZrMWRafmY9OzRHYklsVWplRH17e2lOK3t7Y2AtMHxYUVIwMDBPOF5PWTd5VjkkRmUxUFRCRU8pJnJmCitEZ1hjZ2FBfE5hVXZfMH5XTiZnV1htbzlDSEVkfk9GTFpLY1dueSh7WS1EOX1iMSE5ZGElRSpNYUN6KzsraXUmKV48N152JWZKWWdyUCp2CitBZ08hMWVGTkp9d1ZgTHA1aDJqIXBYKFkzeU5QISRWY0RNUVdwMUZ+OElpeDZXKHc4b2cqYjtmfXc+ZmkkVWUob3hXWjchUmNRd20wbDVlCisoRSU/WjcwcyQkMWtyb0phK25McCVCVVg9O2ltSEREdHZhSEJDdDcqfHBSKVdNZi09XjZFRTA8TkJIdTxCVyFgVU94X3x1azZDaStlZEEwCis8WD1WNnI+ZkZuekRSbmNxe3UtNHk9KU1POE1PbWJAXyErOFlMPHEjTT8zPjRMUSZKRHdOcTw0dntQNzNfajhjdlV+P1V5fSlePiNTeUxfCitQOFo4NUR9PHV3dDJ6Zz09WFUza0ZVM3tyZUVYcSlpano7Q1gqI3drdX5HekgjS0FMYzZxVTZiJG5qMTRKKjAwYi1DSDlGTypBanQjKEJyCis/JDBqM1ImNHJxTGcyRkNmblA3UzR8YGZ8PFZVY2xpPGFzcWFZVVBDRykrT0JpOX11JHZ9cGB2RUc/YTBmJW1pPTt1ODh+U3poS20laUBMCis9dDM7WUc9P3BvJHMhQUl9VG1tcjcxUERrWGUpVCsrMVQ9e0pqS0REXm9+TSEjVEVRNUwtX1VnfCNkR0w5P2BtYjVQOTE5YnMoVkU4aDZ3CitmRjJLPU80MGA2dTlLQ0BNOT1GdlVoNnd6JkI4TiRKNTVERnRHZFM+aDtDdlJfUXQmQXdkTVhiRUloZ2NROVp2Ylh+aSRKVWp5NERaZj0mCisrNUNNdS08Mjt8JDAra2p4LWR1P1dIfldUUW1DQTJuWihudXJ7YypmTnAkPShAOUpQfXxCNSpIZi14ezBlWF4jaHd4QkkpcWF0U3tTayZqCitsfW9yRyZGV0FrMCopTiNFT0ZVdUAtTXpTNmYhfHJgVjg1U19PU1Jgbkh0OFFYY2M/dihvdCsrTTwoanBGeHlOaiNaNHZmb1hLV0lFRnczCitfPVdSMnpre2B+KigtdDNvSnkzPy1YNXVoKERzSCRfNjBjdVZ3QDU3bV5WQngqQV4mUTwjb2U3QEsydlVrej5OfFM8VDNYSzlNXntERSMyCitDTXcyaF9vbVhVOCFTbFJIKTZ+SVRSVzxuK2RtPyNCM2c4dUVzLXl0VyNNNWIqa3hOI2YlRmhBZzdVUHFVMlVfZnlWQXJYWExOQm9hMXxmCitZWUNEMz1zQl8yWFI7JlZ8UTVtNGlCdVFtWUF7MCk/MUAleUxTWDtAUnhOQEVjTk03JmhERHVaailxTkhAUWcyP2lrN2xCPFlCd2xQRkY/CitpYjY/ITdWQ21IOUNLSlRnWEhtcztTX2BDRHdVNytPdyp0SWVWZ2V3SkslbU9GNFFtXyFOfFlaT2E9aGx5anBQTDskeyVgQExVWkJEQ19uCitAKy0wSGoxSlQlNmh5T0xBZXFzTGB0OXw1RVh3fFJ0WUYxVDNHPGNFUHEjM2dfayExVDN7OGRiZX5LO2BSSH5GVTkmUVB1RUs3QWhNN0U3CitTZ2B+aEQ4VXczQ3g4UGxBR05LNno7P3dgeyZ+bTFyT2M4cTBvN01tcGBkeFdXUkV+N3RSJk1eSzhyUDhrMnRSUWlnXyMlNzJqdVNRTHwwCis7eih5SV9AS3p8fU8oKGw5I0I/X2gyJTZgVGErKXw2I1g0KXpKWEpoSzB0YzsqMFBDOzJ6ITVLS05RZ3FNalBfSkYzSFJlbml0cUpreGY+Cit3O3oxfENRRGRBKiNOckk0RkAteGl+UW1NM3F5JFYrO1hSNjAyaDNDZ1YtS0spaDImRyV0NXNHKVB4Ym9QdDUkYnVURUYtPSpUZWlxb0lhCit8dW0zMkB0RGdRaWJ0M1l9Xk9QM00+R2swST1wQ1U4UHQ8OTAoJHQjRlJYcHY2Tj1kVDYtdV9vSEVjPT1WalI1KDVibWgla15PSitNWWJyCit4WXYtJE89KlJ1cjtYTHspJDB+Zns1Rl9WQTU/MWIlJCE+aWp+JnRKajd9JSFOO14jWm8/KkU9WXJITjJxS0IwbjwkLV5VVWdNZkBLaV5sCitEWTVMIXdZLWxNSVApbSYqMGZNUzNgIT1Zd1olfFQ1JkJfN3VJa3c2eFFxeXA5JC04fGZCX085UCRMQ2Z5aU59QipzdGY5KEN1Ykc+MFpDCit0R2JBJSUocW96NzBnfWpvVWBPK0AoUGVONFpKWikxaGo7Wig0Ql5CTTFeUEhiaV42bnpJa2JJTURSNFlXVXV4MFYpYVdXUEcqVTc7TmImCit5SDZPPVB4SShpMndUXnNjOEVlWDdITjhQVmR4ZyFONns5Z0pAXzljZGE8TXAjQHVgP3NiYWpzWEBYdUc+Ql4yT3k2c0BHRWsxP1kwPSQqCitPNms5KE1IZTRgPVVCWn5sSUxlaTk5SmhGWkN2TnRrOVhed2J8aUFTMExQN3hsLWBYVik1aXdCRzxIanR0V1heb2Z3TWkkZks2QzZvP2IoCisxKXI7eENeeTtgK0hIX0VWbGN2VFZMNzJBLW1BdXc0RHlLaE91cytINXt0bipjdWpaLXhgK3g5Y3ZoSTU9U15SRGFJdGskZ3FjP3xNPV9xCispbEsle3tyajU7PCN0aWlfNG5kPkAhXi1oaVZ1ZGZBUEReY3xCY2wtRSVKWX15NHs/Mmw8Tm5pKGxyTGRqUEVzR0JIUFc5JnRCdSg5b1RKCispS0JOUFdJOSo1Qm9+SkFBUishWmwmPExqWiZMbmM/NmNAQXx6X1dOdHheYWRWKG1oaXNFN0p4QF9WdHVxVkQ+Tl9LJn5JbW88RThAYjsoCitnZkF+Nm1WS1RoQllJcUdlSClmTC0/N0FAejg0QUx5QVk/KTV2ZTlxeklrKEUxNC0tflhwZ2Q4bnlGUDF1YUI2SjZJU1lLdyp7bSlWSklUCitIVisxfjE3PUBgfVZOenshdX4lYHxhSEJlcnRYZip5ODFiREJmQEIkbmF4eH59UnRHRyMjeHN9ezVyYDFrWmRaSy1qNiF6NUZeS1pGITVtCit2VUMrWlZHemhgdjc2TyV8KjF8d2ZJcnpwb2hUfEttVHhpRUYlMilfezRJRF4yVlNlQFBMSnlEPm1AZilZKzBVPX14cjQkKThje01DWHNOCisoZFYkdSpHSl9FUyVXIV9udU8/KXdBfC1lUlBBX3lae2JGJCotKlo/N2R5b0VvSH5gYTk0WnNjPUxXWlRHJFI/UE53LURwZmIxQHQjMVBRCitUKHNmPCF3b00jckJDYylDUj1KIzluNHxrdC00WXduPTV8T3gkVD8jfWdAVD47aU9ZKStRKX1HTmtmXnhUYFpFUSRmaXZmeTwyb1JGYj89CittPWNkT28reDtHR1RKNkl9TmZpUFRaSSViRlkpbStjPHVlcFJGR1QwSnw2UiFpQFpMYTx4I1RmK3EyT21fPVA7QE5DN1BqZHFrQHlpOEhrCitoZXVDPDx9IW5WKUBpQCVzfHVfbyRoUG1IVERpVnE+MkA/T29gO0A4VnxRWDU+dlVzOFhaZEY2Xi11LXM+SkVpcz5CKGBhNWhDSVp+eCNTCisweH4yc25wLWp6UDIyJUgkVHptR0Rgbmg8ei13eSpvfTBoQV9pJXBwJXJVZVkqPlFaLWQzIX1Jb0liO2EjM3g+ZTFzQjMkdiVjTVUzaEVnCit5YnghO3YtUzxEXnMtITR1JDgleDU4fjsjZW0oNWMhdiEoSC1xI1ZJNUE1M2lZfUA8V19VbilEeyZzbyNmN0hHSWZ3dFQhT01rWjl2Z0huCitsalZyfEIhaSV2LUAqQjFCcUs3fGZPYjAoNFJRUzJ1JXtAMzJ7ejNaPWMzRnlZY18oWFhSV0l8Qik9JkcrNmtSdiRQWCZfIXNeRiZMVURICitwU0xjWTQ/d0R0JChucVYjKEFFRm5NSXBxQXpURHAxQEFDVz9+TzZ9bVE3amJNP2lvN30jbmsxfFhWJFVROXtxZUBjUDREaj0qdUhMbSE4CitHJWB6WE4mX3J7Uz4xbDZ+dU8qbHFafGg4aD56dU8rTHE5X3gtaEd0fjl0UkFTQkFGezJHMl9ObzRKazsqTk03UzZ6JmRsfE0rKj40YH1WCiskaWlKZFpPdkdGcTYmfUZuOFhIOSgtZmtYPlBtYHJrWi08NFVSVHkmKFBCKUR+P1JlMnBFflJMSipqanpMNWExPUgkaSY/YStFZXApK1RTCitBUDN6US1IVkdPbWFgJHc9P2MyeHtefXklcjwzbkFMazZKeTR7OWooT1FLJCY0KDs5ISFUWE9PZn1sP1d5dzJiZzMkZHNjdj1FIXkkOzc7CitfYG02azcwU0d3a3VMZmY4dUs9YyN7e20xOzB8WFFSMDAwTzheT1k3eWxiPEV+QkBGLW8mbyUlNkY4fX1sYUF8TmFVdl8wfldOJmdXWG1vCis5Q0hFZH5PRkxaS2NXbnkoe1ktRDl9YjEhOWRhJUUqLVk8TypLRV52OWg4KjZYZE0pSkZVI2c+NX5Ed1NDJFVrPk8rMFRTRH03KWE2fWFqCisjZG5LNEx8I0VYRVk2PEMxb0N6NU1yXiokMjcxVHZEPTtJfDZOSmFeNT5MSjJQQWJMR1pwem8xQnFWU3JPaUJ3YEVtbCNTTip+ak8xVDhkCitCcDA5IUVMc3pYdGomVEJ8T2hrTSMtOTBhS31rcWw3PSV2SW9VTUhkUXo/Z1lDLUdsdTBfTVErbWlFYW5YQF4kJisydkEpUFJQSlJ1I1I7CitmZDg1JXc7VHt8OEElI21tbTkpendxWnAqRGQ+ZylwRWEkP3ZTUmQ+RUxuWmVTVjFhKXBxejBqUmEpS2A5N0gyUjFkdUZLTmNUWEk3RFpWCitEIW5SQEBZMF5BekJfZ09IfDEwNUptU24zZWZwPEhoI0ghNW1AKmFoeHB6Q2JgM3tjJktxUWN2JTFsJGUoY2B+X1ZVdXkjOU9VZXhqJXUhCit2VzQ0OWxLZ0gkRSgqQllJYiQhLWZlcChSTEI2NFk9cWBFM240KFBGMWlmQ3Mxe05GKyY5JX4yMXckIWJFJDhMakMla3A0R1g2I3l7X2Y/Cit6VVBSYmFDP1VOdj03dXtiOCMyR14zJUJgQD0pWDBpTnhQU1dmeTw1XmtFTm1GRD1uWCkqfllGNSNsUGJMY0lVZWV8ST9+M1U9elQ9OGhxCisjNDlaU09mSmVPM0glUTZtNmoxeH1xdkx7a255QmgpUzttSkJwaWwqPF5YakQoPDNadSlZa3V3M1hhJlMmY2phZnR4KFAjQWdkflN2NzFACispMD88ckh8Kjtjbz5VQl4tZlkxSyF7RT5HPll2fVBwVSVGOChiSEtsbkByU18jeDwtTHp6VHhWc2VCailsJjhUZzAmMmhgJHRtWHFSPF4tCisrbWpFQUAlUCVhY1hGcEV9VHEjP0A+U1JTJCQ4cEc2ek02fD1wT2I5Xm98MFVvYjJNKHZIVyNWRnp6WUUqZ2FoV25PUk5fZjY8K0ZGOCRlCitTODBEYXBOYiZyXj9GdEt1Q1d6UD5+O1JxRWNZZ251Zzs4K35xVXRMZEh4XiVsYE1TNjtfbD80PjdGJkB6azcjKUhxb0pCTkUza2JEUHk9Cit9b305ZzcmQ1BoMC0zMHVfVlVEMCpUX2JXM2NBP2slaDhVMSQ+b1A3YEVQR2hUbVlSWXZwZC0+ZUY0SEw1JFFIe1AkWmc2MU1XN15jZEtSCittb1pYQ2QobzI7RHo/JD0pIXl2OGZ0T1A+cylmdTlPcG5RZz98PyhoTCtpaVY2dDBOUFYyaHJLbSV+cHo8XlYqZUs9KXQ3WiRINDxQRjQ8CiskZTU0XklxTHliY2FkRD9GbkUkRzR9KEIqIUdOemBNU3d6c0x8RmshZ1NFfnMmLSMxfnkrUmpKeF8rRmNrYn1MNWBmP0Z2TldASypkbzxOCitvVEJrOXVhaFpZX0tiLXc/ZGluZHViOF5JQTJJUXptNVVtemxWUVJEST4+eGdZI2ZieipKUGBrVDMyJVVGXyNoPSluZFQyZFltTkZhR3tkCitBYEppfFR5YkhxX0cmfVR9ZjxTN1pJRTBaNnxeVndYUlc3YTJ3RExfWClyZXF+U248amIpX2lMOyNPZiY/Qk81aVJsOHk/UUVQKGE3UmAxCitHJWohKlpDXjBsZkVmPmprQHN0fE1OVT1gcTVKM35GUHQ5Nn0zZjA8amUqdGpoJHIwOWVAZy1Zc3tLMWljd1RxYE00QzhCeURiZzJ4NGR7CitmRlc5SjtEPF9EWX1DI0ExYWt0eFltWSNmeWF2bGN8TWtPel5uY1VASVMrfHF7WGAzIz97XnptWFBSX0BRM0hRVzM4X3o7YkQxZ3lGc0RsCitgRUZoeSk9QDd0QnpyV0xTLXt3Z1lAQHlTO3JKTW4mR0dUZVZhcjlaT31YYXQ/alNZSUA/WndWWS0tNHA8JFg7YndzTH5WJXY5SzJ4KUh+Citjd09mM3lZWCVkbzsyVDtlWWhCXkJePTh5bmlqalpfNGZGUXdwczk+VGMhQX1HZnticGV2ZXx+dWB0QmxEJmpJdHFKN2tfIV9MVkhVSXkjCitiJTd7NG1gXiZXRy1mYn57OG5QWUVCV0lYbFRtc1FoNVNmPkFEbFlmQTFDcXpwZjZtbVZgSmR6ek0oWGNxPzA/dCY0KW5mVTQ4VU1fZHpHCis2dGVmIT5PRDEpcTZ8bT1gdHY5bkJrTmduVDRYQldTIWZ1eCQrTkk7flVveWIhN1N2O1UhUCpmRWlQaTBmXj4mOCk/ZEBXVkQ5Nzd3cTdJCis8M0NZVz5eem9MJXpVKmheWUVPY2BGJWFKNj9MKGdkZHw7PUx5PHtMeFpTVmY3amRhXjApfHhLOTszbk17PllEeF5TNl9RZmglRTsmaUI8CitHTUlTMC1wdWIwUFNRNGB2OF9WRXhtITNJTDNDZkVuX19RNjZleE5wezZCNj1USGorXi0pP0lmPyQlQ309fFI0KEd4V3lrOXZQbWBJfDZ6Cis9UmQqWndRM1RQS0dBcUxCdUkqUCM+NHtGSzNqSVhlI2UhWTVGMlkxdiZERWs1cTk/OVBEQ2lePTk1K2NCTTtoSXx6M2J5VSkoM1R0OShlCitlLVVrPlQzPiUjYG5kUlc4QjxAQHhHb2gjXzMkTzBMJVpgVG5TQCY0ISU1JG5TdnVCJF5jJG1jZUYqQX56WnM5YE1CVz42LWw9dCljQVplCiteOCUqSHBXOUY2eWpYKFR6O2loQitGbVpOKl5kSCRTTklLO3BQYUw8UDxqZ3hrVzFJV3V8Z3VSc3BvX09KV0lZO31sRkJPel9TMnRQRTFUCitsc25OLVNWKFElR0JlaGZwc3klfEI+MCtxWlgjJiQhSHBXT2ImaVBgbjhnOzlKUyZjXlI7WCNMTlA5bmozO3tWcyshMUNmdzVARXYtJX1RCityfkI/d3J6NTRBZSYwP1NSY1FCfj5xZ2JmRVpifSlJYSkqV3QkUU00I0BlNF5eRFJ4LStzcFV3bCZQVnApSEM8Ujh3eFJKQnlyVlNeP05QCitJU0xjVyFLUytoKnR3QmZNYmVgfGRRTj4qTTtOZmNMJnVZWnBRJG8kJGQoUykxbUNPNjhFIUR5X09LTkFzQHxkamthKi1ld2V9NDBuYy1BCisxaStsX2l+JFQ0IzA0YGVFZz9fMEpyWWZXTFh1X25aeDM8PlBJMHNrMThuNXk8NWAxNlE9UXghVmtUfEt7XkpHRklFdk1PUCVeI3Moall0CitQNkp1a2pNeittZCtiYClPT1k/cnZuWnpDem05S3dNYUQ7I3BoWmgmRjdeLWBVdD5DQUQ1N0lLQzMqQSMzcGM/TFRiJCRKX2w7SGthfEheCitTUjAja3NqJm5qWFN3M3c9d09wLS10ZiM5TTBQWEk8bU1DPjJPfGpHN0syVG5rXlUhTXRzcm9JM1krWWRlbn5IVWB+MG9qYG90dDV0ViRWCitRfS1wa0BxZUFASU0wb0hXcjRtbkgtPEpJSj05aF4rXktnZzlPX0RVPit7fFJBKGdoXmZIPnxGMzx+OGdwTVJ8IWEmdDE7PyhjVUFpLTY3CisyTGJEWF9YdmBnPEpWdD4wMUJoN2dEMjZHbT4wQ1gyJjB1ZH4zIz4xRURHd2tBOVBWXllFMUpPSHV5cTJ8ezx1MG80M0ZeckZWQ2BRP2FTCispJjheVXlSbDBGbGxAenZrXmJDT1d8VkshNSYjdG8qUisoYWFpeWdyRlhIVTM5SkloakxfMkB1cERZXkB+dyFweC1Ua2RtVFd7KGRIME1YCitQRjlLQGY5bD15UnZ1NS0/Nlo/YnkxN2VJbFhWRHFEbD1ZV3QxKmQ5MnFQX19tUT1JY2w1fXp8JjImWXE+c0UxSSpTPmhMS1hJdEVpMks3CithJElGUlc2ISU3YEYkWXRafSNpUTV7VGdJXj4rQjcmO2NCUig7XnlNTW4tLVMpWGZoJXoqdSNZOVg4Xigob3dWZztfXlhNeTRCa2FnRmNOCityalVCK1RfTHMwKmNSLSUwS29gY3kzbVYlYiNtU0VHZ1RjUDJXU0BsZmp8IW1vKzREOUB2ZWNNY3slbUVeRmRDY018VnV2ZWsqUnhCPm5ECis4SSojJjt5MVpxRFZLMjN4aV5vPzF7dU9qKUdtYnxvMFI2LU9HTEE/b0FwSW5gd25oezxBM3o0U2p7Mnh2Z2cwUzs9ZyllbDRHRyg5PnohCitgbWdTbVNzJllrRD0hKTRlM1clZi0hTklVZDk7SnQrJVhsQnkqVmN9OG9VYDMwdklLfiR2c0BocSlSbnlkMzxqY15JJTZtdnwleEhSND4tCitkdEwhPmpeZ09EbE5lUnhzWXwpPXAhKU97Qi0tSjxXOyg9ITVZP2AzNDhFUnU7akBtd3pBS2xWYDR1cEkhUyN5UG0hRHBmI29HN3VheXs5CitFOHM5T1NVVkV3MEVxUGs5anQ0VT5ePlJPLVN8dUdrYlJsTz1JPEpgdzh7KT1ZYiN5UEFmKWhDWnVYQEQyfW5JdU44UGJBK01Qe3pOP1BxCistcVJmKFFVPUFKbGwhdXxnLVNUOTBpVz89VDchZ2Fxc0c8VVZkMnVDTSNZY2AxRnFXMFhfK3t7dFlpPypOTEw3Z1BzRXxRSEFWWmUwKEltCitwalNPTyFjJSZLJlNVbC1sRmdZbzJ4Rm08UUx3JWVueWhAeHltSXt7Kk58MmVHQClJSXdYT2oyKkkhbzUtNmZ+QDZKNU49b3RxWVhCIXYoCitvTnQ3Qi1VbzA8WFVKI3R8Sk03ezRBaXQzTmZtaz1DSWozWiklU1AqU2VIJTdLWTJtZFVASHFqZjF6OGJmY0dATyE7enJLRVZhVmsmWFAwCis3KlZfekE5WEYhejNKbVJVTldMfEs4SS1ReTcrbGVmfGo5MlZOfkVPb01JaSF3Q1Y2RytpMiF9PDAhbjMwellhdzZ2SyMqMWslbGBuPXpaCislemA/aXp+VjdiZHI8Pj9EfGtCMGM2ZXVtJFltIXA4bk84UH1TfCo2dXJze0YoRmFxa2VeVjZJaHA9P2EmcSRnRlZuJVo1azgkcSZTYld9CitGeDROfDElWEVsRDIpSl45YFJgfk5OVkozcUNzTEI0MjlScno+U3w/ZlotLUBSWk5mRThGWSNoS1Z6VUklfm1UV19BPGMpR0wqWVJqSUZZCituQXVpdXVlMnpjQXtwSHRwWFlxJmd6bl8xS1V3ITt8e18wYUs8TUd8XktOKHNJMktzMHw0dVJDQ1pie0g2SUcmSktWJmZLS3NaRzd6KVFsCiszbWB6MSMjdGtlejRva0dCQTF3YWx3cVRaZWN3U08jTmstUTNVcVlKS1FtVXpZdkNYX051MGc8QHomQUQ7PjkhIzckOWNxaT9sb1BWMW4pCishajxMO1hTKFJaeVQzcChXPHVAUnZSQSgjaStmJkFQVUtyIVpRZXg5ek5rSyZEflBKYFU4ZDVKfntyPFlHTU0zezl+dlo7MyErPzttIU9BCitEUHM3SSNhVEtwcVpmTl50fFFaOXgpUGpsSkc2QTwhQD1mTzQ0em00PXU9ZihvZmphJClOP2ZaPEY5fWMofXpVY0E3d1FUb0ptMVo3LSh6CitIM14+JmA5aytZMndteCNSMiZ5RmRyPzJRVlVKSFpjaENrPGk+aGluOWRnajQ3WVNCVTQ7QFRrI1hiMmlQKWg+QDZhV0FLMm10ZXk3RHR+CitwZUttIyMwMDQjLTAwMWxpMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFK0FWUWd6PGEmcz9WVXVrWT5iWUVYQ2FDeXlHVFd7CitNbzZuQHZRSThfbDs+VEZAeVY9eHllKHJubm4rRzYjKDR5aj08NV5ifWdNVUFBQWRQVj5IJkxNU3w+XmpAYTFTRlFwYkxWJDFiUXAjJkF5CityY0gpQyFlQCtRNDNBclFgLVNOYHRVbUdiezJmKnF2NzhiX2JjKllgRXNSZyolYUYxe25nWUlpSkNuPU1BbTg8R0JIbUEoPT4tIzBCSjZoCitDYHVJYyotLWxKPlV4V2w7VXIkMUZ0bStmfkE1fmI3bmEoQWokQis8UT48fTkwb2FtMERDQW44UzM+T1JFZXU3NXx2fnM1Y0AqJUo9eGMxCitTR1MrZ01UcFFHaU5zNlhgb3ImX0RYR2Z1JHlTeGVYY25gcjZvWD0oOExrREJYeSFCNmI5NGxDdXsoMEtRbyMldUNHa15sT1JxWjUwP2xvCit5YjRRZ3xhWVBTQlFBJmFeNDEteyEpZ0lSQ09eSGw9eSNfUXVYJXV2ZWY9a1FTe2AoQldlPWlLJElmRjc2c21sMFRJQCFfJCFGcjlwQUAyCitmaSFZI00waXtUOHlxUj05QF5wPmVUZVErfEpVZUZ9NzY5JklCdztAMDhXd2pZVmAtRFgpQ0dvQztwdDg7IU9sNWhKKUR+a1hqYiN8UGRaCitWO0xudENfbTgmKm9ZY0pjIzw5Qjwra09BIXRXYDBfT2YwO0diVDB9JkF9QHpgaDNvRDhHbVREKD57RTxTJkxfa2g3U0B1am1FQmw8SFowCitDWXx7bUNTZmQtIW07I1gmajc5alUjdnZiX2NobWthakx8Rmw5bVoyMk5iOTlPZSRRSW9vXnE1cV5vKTtaZ0l5Tn0mOzFoJW0hWmhRWTgzCitFQUR4bXoma0lGWFdmOShiSSlYbk1sajdVZ1c7WShETzk+ZE1SK0MmZW9naXc3eClSVS11eVpVI2hBVDV1emBxYjg4fF42e0pEPnJKcHojCitSck5edkR5TlQlaD8mfitlS05yZSl6Pm5tJDVCRUdJVkpeaVRpcGRlYzg8dWoyP3NEfnpRekFib2VkbXRrZ3JJOUxYejhqeitXQUs1MlpaCis5cElUMHNnP2BXNXRkc0E0ayRIZE9NJmI2IyNNeFFMaSVIVWBCVVBzVztfQ3RiSChOKEZiVEZMe2txTDJhKStaOTlKTTdWe0olSDt2VV4wCitLUEhNX2d9SV9eUkIrQVd5YWxHe3pfMGtTS2piVHNMcnVEQEM7MEt6YEFAQ1E/ME1DZFNeK08tcXQxaSlSUmZUKXU0ZGIhbXw8c3Rac0omCistayl1bm9GKypnY2x+Y0ZkPHcodnxpS05kT2Q2OCM2NkM2UlVPeXNoelI/ZTcpejlmbGA1KEYrNn5kSGROYyNtWikhQ3c8VjNFZEVoN3laCittdEQ2T2l2fTVlWE03RTt0NiNVJG9eMyN2PXshcHV4S0cqOVJRUil2WGdKUVp6KGYwIzMxanNyVn57PDwwRzBSNDVwb0F+aSRQb0lsMEpuCitHQTNqe2Q+K0FRfHpkYERuJW5yd3duUn0tVUxNMGgwYVJ8bXVDanJhPD9MLWR4al95ZWs+YCZKZWkoZWdHKUhrV3FrJWpAUWdiYWRCOy1WCitKYXo2RHx7Tz5xdiZAJFlLS0cpdThnRjVTPSZgUHJlJG9QeV5XeTMpYFhuZ0JlKVU5QmNzPWJ2TTAhKWREb3J7JFpGeko7cV4pOzFhMmlsCispU1VTNzVSM0VEYUtQV0tNI1c1NyhrZlFOfUNfUzgpZUVXXmwlK2RuOUN4ZmBpflBnRD45ak9CZmpHd0JUeChke1FFaE0pS21YQllgTDQqCit3XlZDc3E1ZWdPYUhUbDl0VkRPaStxUF9OMVYzXkMzXnQzKj1AXzcmUUw4VU4+JHBUdzU9O1J3TnV8OyExclQ+b0lxU3Bge1U1XyZONk02CitZKWVqRz8rYmdOX1dAfDA7eislOXdTUzAmTiYjJmQwJCNYc3tlNUVqJCljUztsVi0hKmdnYzdgYVd6cCNDWitwMFJBTEl2SHt2cyZmRkNfCitNTDFhdlBHblRwPEBzREJPbFI2ZUxxSFF9UlJHbCg2dm8yI2QlWnt0OCNQcy1qTD5AdFA3TmZjIUZVJCs0Rk42QERTQlJROUwyK01XMS05Cis9TkBXYkdeOEJUIVc3T3lyMkJJOU9iMlNvfWRIYWxXY0k+V0l1LX1XVUVVbmY0a25EaVNCaWl3KUklfEklPV5FdW1RZSVfYE5fOWBQTUV4Cit7WXEtYjhVY2lJN0lwXmtIPT05cz9hMGA2S1hZMWRoKn5wNXdAQWdmPGVVMFg3TW9IY3BTaHN1JEpwaikrRiF4aUV7NWAwKzczZn1yWTwyCiswKGZXaFJlLTdtRnxXeXN1QV96KFVnfm9xeDRYbTZCR3hkT1QoUktXOE8zUHVHRjRkfEEyOXZIYyNlcjNePmZeUWB5dCtqYDE7RnVUPCpXCiskJSM2N3k0RHJ0dHJZMW0qJVp9Oy1KIUdtKXRqczNwS3FfcHtFI3ExfDZZVzJoOV89bF8wI3dDNDJIZmxrS3QmWWRraHl8NTNtRmZTMF8lCitMTVohT30rO31ROHJXcFFaVkU/fmlaQyNzOyFMak52a3BpdjE2Rz9FNk1jPyEqS0J3dU91eCFHdjxMVEhMPkFzUXVNfm1LPmk5ZWpXYHw2CitsNjlJc1ZCRzR2TTR0bUFfbW40S3pkRCY0VnI0cUxwc1ltdzJmU3hpY0JEeW5Oaip0S0lBTENwanYjQ3hqSypJRndiZ30+K1paI09oYlRLCis3fCg/PTlCZlhkSWlyYC1DNiFZVWNHcGlpM1h1UCloPkA2YVdBSzJtdGV5N0R2cylHX0x7JTAwM3FpMDAxY2YwMDN9bGE0JW5XV29+M3xhCit4WjlmWkVRN2NYPHsjUWElRStBVlFnejxhJnM/VlZxdFMtRV52QTZTVzlta0h4Uno+dU9LIztSalVmXlJqN05oNihERk0yYVZEK0ZvRmZXCitPV0JOOVQhQmtEYVJVR00maFdNNXpUX3g1PFdPRjtCeGdRO0dhUWJGK3skYEtAX2MoeDJnJmxCQFpHK2FpcVB3KHRgM1VqcmF2Ym96dm02CitGI2hlQGpGWTEhejY8MThzcyE2czh2RkgwbWUkUFolJVNGUktJVUwxNHNhIXFtKl88Pj1hJmU8T09fSm19dHR3ZFdqOWpHYG0qO09AdUdYCis3JFBWanM0PyRydUVIPi1kMyhDVisxbj8xakw9fDE3LSNwV0c7eTs9WGN6ST9rKj1MdTxCeHsteyVyUFVwaUQ2XzdgLT5mKnVoVHBTYj02Cit6ej1mNyhAeDVgSGJ+SFExTFZqdXZwbGZyYWJtPiZ1SChWdXwpOWFuTUwwZT5hV2FYNEcyYUNUIVF0U0BZYlM/T0h1O3VVRkdPR2heK0NzCityMl99dyk1PGQpUzkrZjZ0IXArNns+T08tUGdRYVJjeXkjNEVBTUQzd0N9PkJgc2g+bzIxaTYqbVV1czx8NkNOJSN0SzIqX05tfSQ4Rjk0Cis+JDstaUY2WX1eKVBrTEQ8YmxuV2RSTmprZUprbUgmbV5JO0s4VFYpa1N1KDMwMHNlP19lP3VxPXN3JSspcXs7MVB9ZVlnT1RkYW8lUGpxCitOISlVYmRHN0pQRjhIQmJWNzZCV3BucWU3KU9eZ0khTGNEOW82JTAtRFR4WUdTUmNuJHlzLTV5JG5SZ2QmdzdjP0pZTzxOSmFNVnZCaXtKCisjIU5HK1d3b09jYEBFI0BZVFRuOGdRam1XSTFYdyM3UFhrXypFMlVhTGMzd2hAYDdoTDZlKjA1Pnx7czdVeTYqIyFTRl5DdVpOa1RuezdPCitOTEprTWYyQU1mR0MwSF5Jb3RtNld3P1JUKn5lZGJ7U1BAQSlxJjhqdm5ZYGtGfmpFQj17ajJ0NHY3UlRPNEc/PWU4Y3B4ViRJM283VzI+Cis4TGlKYjMmRHB1LVVoP0lsdHZxRFZhRVg0bW1FZzYjUnI/PlF6U145WTlDRTJHM3pRX359Xn14UHZqUy1xVkRQbnF7WipuaGAzPj11bylSCitIT2MxKlRLQlglYmsmQWJ3bT54Tj48SE1hKWQ/NDdaeCM/dHlDJDI+NSliamZTeWN3MXUoRXJNTDRYKUE9MkRhfiEwaE99JU9Va15jUW5qCitDXzJxNFpYPG08RUhWVlFnJk5HSXBKfVZ9Kyh8O2ZyTCthNCtrOXdyQWlzYEo0VDV6T1AkRDtRQzVkQ3BPdzRiaSpqOzZoK1lHYztfYihtCitGIzEtfkwqZVpaRXlQKzZBc1JRJDxeJn1JV2phZFhudml3MCFTZjJWcGYlOzJJTkpxYlZKNXdQbXhwfEh7aE8kRVlKbEdvfGNAWn5ZXnR8Cit7Y1NaKmpXcyg3PGpLN2A5dWh3a0JnMiVLfVR2JSh9QFBGVXR6NjF7X3tnMilGTjdub2hjNlRWLVhobUs3NVFqUW0zSStkJDNVaHA4QTloCitIYExsNnl2cG0oZ0FmSnlIPVAqTShFMlVeZC1OIV81MV9NJVpSZlhvTXRecCplRkpTTVM4X2s5aVd3aT1xVHpQeyFlfVAwT181SGJGKXhECityT2sjfkh5fkJrZyg8TG9Nd3BaUjtreDMqaX1EUFFKV3pPT0FkJmNQUUEtSzZaRm9QNDQyYko8bzAtUHspNEI/N2FpYD9fI31waytyfEEwCis9cDFMc0JLUVZtX3IyJDdUNU4kMiFpI3QrKmMrMHlsWmhhansrbVNlQEUzT2BiOWg/bFNWPHBFX3M+T0F9eC1rQmE0SmFNTm92MSR3I3xpCitHLW84aH0oUHxMa0JJJEJ5MmYrZmsldCtLeW40WmxXWT9QcVo5eD91YCR7MTs0N1VOciVxdWUoWUMleVNPdU4hTyp7ZzBjcGV6Mio9ZjteCit0ZG1VUXd1VndQaCF4ajlvMGp1P2B6anQtcU4xYEgkY043RCsqRUFacGNsUldRcUZ1UkVCfFVJWSt2d1BQTjxUNG5vbl8zTHstZGk3aDdeCitSV2VZMkdHI3xAPH04QiR5YDVgb1NoTi1fTyRGQng4USFeKCZBNWMhQzghXlVwTzJkekUxVlF1dFpiITlxezJjJmhgMkFmUElhWWc0VVpACisoTFFfaUFxTVhAe1E5NitkQFhPaStKa14pUCEoQitGSX5mUWAkcWFGZis7RlREJmslWG4yLTNhPiRAVztLMVJBU3tsfjJzVUVBbXtsb0t7CitpMSZuPX1vRDR1JEVWUkt0Zz1paSRDanNyaCNNQUtIZHUkJnVifFRnUVU2PiZVMjBZd2Yhemh1ZDdYV05xcE5OQ1I1QGhHbXlmUkVKZzQwCitpIVR7ZU5sWHNXeyZYVTxtWjJfKEtFc2soTXphJl8mTEJwZGtUWGVNJilKN2xDX1MpR35DRkhnISZ1MF5NeTk1fWVjRjJkKD58MUp5cjUlCitfZGB5KkxRYGxsVn0obVc8dkYmV2c1NTI9X09yOWdnbFZJeDlkcThjdSFnZiUqdzFqMz82bU8zdUticylfOVQ0XlRAMzFRWS1PMDA7b3tsCitAPj54dUw8TSUwUlJBdjFwb2ppMDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFHezdjVlRSNldwWjtiV04mUlFhQ3d6ZitpdSUxCis0MU09az0rT29RZjUzbnwxZGNsZFRrUnJzKzZ9YFhDXnA+K2xgb0x3cGgyO0pwUUk+cTlKbEdGMlZjbTsheX1TWEV4SEJ+UVYoaG5LblArCitALXdCMjJQSWkxeUsjdTx5UmN5fkI+c3BNNG1YJSF2Z2ZqKCNhdjIxKjtkcEkkVDxOelgkVFkteDsqKlcrc01OLXc8V3gjajIhS2IqVXFGCitQYDVvY1l5ZnBRUiU/T305QVVqbjM4MXZQcENXb1RFUkRDMDdlei14P0paRSthMFNaeXRfY0AmMnAmfCtiPSNIJjJuLWxrYldpbDI4VyQ/Cit7Yj8yQUwmNVNELXk9RysrYjZqKkIrbktLbyhFUy1HeTx1UktUdiZBSkxhNzRWcT8pfXFpI0RBRkg9JjVWemRsR1U8VWxLVjYlKV9HPGYoCitHXlc1OGpzV3Vsbi16PD9gaH1oX3RiOER6R3RlR2taNko0eyFHa3VDIz1nVD1TLV41QClgQDw+Nnd1NjNtandeVTVHc3FZQ2VuQy1DQ1lQCitqRT5NYXFnalpTWjUrMTl2WnAwJUh8c2dFU05raVJxNEFNYGNPflZTd254OVUxWiYjYzhlUUBMbXZBK005ej8qU3MldzAlTHZEZ3lyTyhECitAKWFaTC1CO3Q/TEpMRUghJHVyfVhzaHB8eEtYcDNFWiRJZXRXUmV7MHpsTztWdXxHIz1nWTBjTG84PyNVZTFEaWpmNUwxQ3A2dStoRiUjCitMXz58MiZVV19ZU0JJS0xpbG4yXmZXP2Z1KXFAbVllfVY8IXxEeXNDU3FQa0g8RklZJkUhQ25SQE5LeDszbiZwQ1JKNGdMYTlPOUtRSDAwCiswMDgwUH5kPU0rNU5tRENQdEowUFliMDA0Vj9mMEJ+dD1GSkU/TFplKHdBRktCZGFZJkMzWVZsUS1aV28zNl5ZLT9xNWIxITlkYSVFKk1hCitDek5XUUUlSGU1UHNMTVZBVTY/US0hQThRJnRiPzV+bkR6QnRfPDc4O3MwZ3FfYShnNzZwPVdWK3tUOHlDV3I4d3h6QD1Ga3FXckVSJVFOCitlZlJOPnEmP1NhI2ImZDRXaClKezg1NjVnWTBMUFhRTD9meV5XUEplaT91TDk2JHpeZmsqT1NKUWRyUGpuam8teGF+ZCN3PF4rfjBESXYzCitIWVp8bWBvcjh3X1R4MiRZaFlVKX5LRG44KCk9R1FkN05pQUktWVpBMUp8TUNpMDs4djYlU01iKWZ9bj1jNUNrcW5EYXYlVmg5WHh3SFI3CitRT1c4dU5oPzUxcVkocT58SSN8X2tEWD1SME1RKFVSTWw1b0tAdE1zUCtLeE8hMXJlT2dPQn5zOWtXQD1SbTJ+cWYwSDJ3NEk/V18xfWwpCitqMz9JMCU5cT00PTZXSmtiQ0BSWUReOVhlP21gZ3syYCgoU1BCaloweXRRJXA/QXdefWcreVREZXpEYU12eFpYUUdnc0pkOUpNQTJ7YnNhCiskXntve0tuLXlHSUsodFNFeyZ5dGtPb1RWTEtVYipCfWhUazJxSF95OThFcFpBRGZ8dTZLeFFDXmVYZFlsNWMyc29GXihYI3VUYmU2Mip6CitEa0Yqb2BudUBrclU1RyRPRC0oMUk4RGc3VllXZ0whQGRaK2JPaCNEbmQlR3J3USFqI0VDeDlaK0w0byNQMCRvIUhCSzxfRVZsRCt7ayRsCiswY3dsUG9hQkN4XkFkJjdHaF40VEc2NWpFQm0kRERjU2YxVUpDb2VLRVNTRjNUKiYyUk5oSTdkbUVUbUVsNmEzXnRoUyhBZUhUTUF1RU5PCiswJGlZTCk5cnR9I3EkWGhnJDROPV84NC04TlooOVhxO0F8em9xeCRHcypxTGFBMG4oY2RDdTIrYjg0Z19FIzE5RzBZRDRoelIyTn5rdFFECitFa25henFBK1V6Xy1wdjZ0KTxjOF4jckV4UTlwS2BVak8zZmFNTjlXUVkreGAkMHR0N3tUMylXYClzRnZya3RTYDtrVylwQ3p4Xll9OUlqCitoO0AlemZUZk1sVXU3SjduOyFHOSMjaFdAIVdFWmg8MzJBTnVnfUM8aT1ycFFJT2RwakMre1hERDtzYzlhMVFZZGpONlRIcmJ3RXBaJDZ7Cit6TTlOI3VDRkpRYn58dSFeV2hgQ15sNEQlVXBJSztsSSNUbyokcD11dkdEeTF3NE1DJWRIaUV8MVNsQ01IMl5NMyhrb3EpSUF0NyNXcHlWCistXzZmSjhxJSYkWiM9P3E1cEpMZCp7fCQyV1JMYHoyVUhWKDlgJShKVjlyc0cwUXZ+cyZoQyltbitIKW5Abj4+SmNpTXRHS2dOREdXNzM5Cis/TipkTSYwVl5JYGJaYCE/Uy0qPzRydyF+YEw5ekxsWGRMJGZiPHhCPUBuNkpRO0pSe24hKXRxZyooNWZtO15zSGBaa1B3NzZ2UikoR3d6CitFNWM0JUVlZEY9KV5eLStNVUJhYktmbzMwcmVuKFQyXldGeEcyODVhS1N5MyhOfW41OXxjUEc5djZAS3piZ1J1X1pyXklzKVBibnspK0AtCitwMjdRaElPPWlhZmFwWEw/Q3EmckAkajx5TH56U2QwWkYhJlV6MHdyd2YlWjM1QW4ycm45N05sdWtkXlhUXm9rIy0xKGxZViVEO01OZ1R6CitgYWt3Sz0kR3dqa2M0P0hyPz52P1ZCMDxaZlR7STlzUWk5djJ3ayZ0ZjxBZyk0VyF7Ml4oMmtodn4wRThLbksoP0RLQVVCQkRjbXpAUitfCitxdkVGb3VeZnZvJkEkTnMzeE49fWh6WCZgR2lwOVVFaihRb19PZ3olNFVYOSpgezt3Pj8oO25UYnJGJGhXYXhjSihRUWE4ZFI+PFZwVSZ2CitfNS1hNz9yXlhjbzgrbkJ2KEN5eiR6Nyo3ZX1KOWN2RyFxVkc2UUBXb1dDZiU5O0tiNEVPKmUzRVozO1RRfTJhLUlwOUtBaU4oZXpLTCVBCitWYE9HWkx3UClqY344QDBhKiVOVmlmYF9oWWdpaXVZM3RJdUtIMlQrKXB6WCNPZDxiYm1ZMG04fEZnaGlMRXJnZ0UjY1ApaD5ANmFXQUsyCittdGV5N0RwYEB1LUN4PzAwOEMpMDAxeG0wMDN9bGE0JW5XV29+M3xheFo5ZlpFUTdjWDx7I1FhJUUrQVZRZ3o8YSZzP2RXb35uNVg+KVhQCitXbnBiRGFDd3pnTz5mJlU0ODctOWFOU3xmVTxCSz5Lbl9gdyErPDYyUnMtdSQ2b3pXa3NiRTwkRVpKUSM/N3ZVK04zN0tMbihBVXBBfEt6CitRTkdUfikyNFI/I3JZdFpGZm9IaVk0NnB+U0x9QFQ9PTAzIXs7K2lZekxuKFFyVmhqYTBTVExieXZ4RzFYRERAKj5NNUAzSjxvbGp3SUp0CitXaHRiUFBPWjEpPTxaZz0wcHtjNStweG44WmVLNVZZbSFMTXVrNktycFR7e3d7a247TjczSFlAQVJEcCltKD9lRnpoQUokajktRjY/ZVkhCitAOSFfYG8hRml4eXNMIT0leU9jQk9jezZffXgyXkZkbFlJJWc0RChYJlZ9dHN5ODdlPT9DYDtuaCUhZXFudyYxM098Jlk9UzlTVmQhWlROCit4TSR0SiR4eVgxUGReYTJ2fGBSJjxkVXFBfEBmSDA5QDlhaTRzQ1JhZGBrR0Ajdm95U2FEVHFTaTtfMlBnSyNza3Zxaik3KXpePE9NQHI5CitKSiVxVXNXREVDSXh3U0Jsc3k+RHdBWj0mT3wxRlFtQnVxaTVqT3hRYHdzV29lZGM2a3F2UXVlZmUmYUpgQ0t5NSp1Nlgyb3UlTG1fVCk0Cit8LVgockskPH4+R1RHX1ROQFY2Xkk8dWJNbiF3bUJ3U0dfKW1Ia3JWMyolYSgpV1d4P1ZGaz1lLUsmfUxIdlFJVD0qUjl6P3NFNyVnNC1ECishZVpMTjs7NkR3UWs2JjQyTHUjZmZVPzt2eGo0OzNZQEg1dysjaW1+QFgtOEIoPCoxVEB8aUJjRUB6NE93WnBBVHMtWD98fUJSUmFfaGRaCithPXB1PDJZYVhiYmhTXz88ajBvekF8eWNyPS1+eENkc0JzN3woKD9fTEF2R3plejdjQEVnWWJIdmZGS2N3bDhzK2t5NjsjNiY1Qmh2VG8oCis+PVVmKHBDMnNsK084Yz9RQ28wamgjRHcyI3N8dS0mUjltJlhZZ3kmanAzazhDS0hlU2x2QFVvS2c2LSo/OHIqTV89ZGkpdVZNcHBeUWYpCitQNFJEXm5eUXl3RW05ZVVeb1p5YjJFQmYtVVN7P244O348RHV0OXxPcGBCekl0SD9hKD16V318WD9iezR1bEx9QW8rIzRrWFp3WEhkSnRVCitfRlUhempVZG1MZUMrUUslYFJwSDFPOUtRSDAwMDA4MFB+ZD1NPjhKUzlWckY/MEI5RWcwNClGajBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDCiszWVZsUS1aV28zNl5ZLT9xNWIxIVVvWkVSKDlhJUUqTWFDemxlLUVaNEE1UCRieUxBZEJEVlR3QGlZM1A9ezxPMytNcmJYd1dERlE+RkNFCitEZ25lU29DVzFqR0xLLUk0a3JDRURxaHIodTNiV1ptOEdqYHZPUFdMPVVoK3FKcnRFWHhRbG5fNmxAeDJoSmNXfHtxLWtiPldII3BAfnxaCitOPkF0VjQye1dOaDtLMGhZJF5LKChJbTlNSi1kc0E5QF9rOSgxTjM4QDh9KTstTTVoamNMaTRlVndOR3lsdUhDbXtoNXUzPW5qbU53I01YCitPXjE+OGx4I34/NTFiQmZgR0pEZ1FZO3BXZzYjO2E2ck4wSjhMOVpxZzIwRkdoJDM4KG80Ujg1NFNwbTg3Z1hrQGRCKzZzIUk+K2lYX2QxCitgQ0Y1ITBuVjlOaSlFclR6MXcpVFQlVTE4c2VxMUpHM0QpcGpGSnJKVjdnUTxvdjk1SmdafnRKcT95JUFKRWFNZnxTciNjS2JfcURsKFRsCitIQUNSb1dUWlFPTVpiZjIwWnpATCY7SylUeHVCc2RrKlg7SjZBK1NNdHFBY18/Z20rUStCZHhudEdyaChXLW12eFRFeEF1N0tDcUdVTTlNCit1eGVvSz5gQkB3MV90Yn1NK0VAIzZWVj5RUU17V35+JSk5Rkwme1RhQWEpSnRRWHZZb3R7V1RjRnxGI3FqYmdjI2F0b047SHopXlNWYDBqCitDb2Y5bVk7aEwldj5hWmNeb0FlSFdaMFpEWFNve0w2TSg2bkMtd2I2dlJsTlQ9V0RkUntAOGs+LXUjNCFYNSo0O0BXb3lFU25MY0h3MWErCitsMmRocFJoX0NpP2BrTmxLNFlKJUV0YHpzailZKUpDUyp2ZGdtZnRaKik9SkBMOHVHQWRHPVdsMz5eKnNlOFBZYSlaeTdAOFQxMG5AY2dWCitHbyVYUFFyWkd5WiZFVT4hTiV6PXNPdXhjRSQzNURNUG8zcz1yNV41KyM3dmQwV0s0Rm93Mnk+VzFLSzhke0N8NjUlUjR6K1pfSENFditNCitYWGJYaGB4e1p4SzwrJiZ2ZjB0NVZZZC1RPVNzPG18cWF3T3l4OWA7b25zUTFuYj94XmRlM340TlZlP0ZafHE5WjFOa0hhUWQ9TGJ5eSgkCitnaiE/SX4hJjtCenhCVz99NU85NzdHP2xVYmxSKUxwZSNlRm57UWV7QElqZkx4c2JqTG17UVNVQV5YJG5gVVUmSl57V0YqemVFfEdhJipiCitzVHBuXmdVVF5QUHBodTM7Z3p1M3I/OWQrYnJBR3dLJj5Ba3ZSQyVfaGR1Q0cyaHl5KWV5WFpXbHFScVNFeWV4fEZQaHluUDgkYTNVeClsCitoU2xqNDY8P3M8JXtyT0YwWTArNG01U2Y5ayRBaWQ7T154cGJJSnhPdTxMYVQhKld0Si1PZ3Fqc2xqbDw/PVBNZk17dVJYNU1FRkFwLXZxCitzNElSWDlPZ2s9TUl8TFF8UE15QW02LWhDRFozdk57N2RIXkhPTk5FNGBmQTAhIX1FPUVFSVZ2PCtYJnp4PE9Od3s3eEVAM2VrPmQwWm52CismQE0ySH1SbF4+fXZCY2RmWEdUZzd4aC1DfjkxRXdPN3dQdH1RRmprTmI0WkxvdmcxbDVxQCk5OUo2PXhsfHpQZW99WmcxLXcmUnxeWkVLCitrJDtTdGUmI1BJUHBNY2xyTH1famd3fT4qUHRPWmw/Kk80UGZpZkFGZ1omUW9HVFpNYHhgdS12ZkleU218VXMjKU58SmEwbCh2LUxpcX1fCit0UjdsX3xvWGNpUld1SXVLfElhcFdFd1VkUXEzQ14jdEk+YCorNHxaaFMwYDhHVFBGeFQ+SXNLQXlrXz82PlJCTjhzO1BaX1pYNSV3RHxHCitIUlFYV1QhcXMlNG1wMHs9SVJORittQF4jeCtZciZ1N3NwNGN0enpTPjheQzFUdUY2KWZjemg/IWxgKWAmMXxDayprQVBGJSFidUIxVjVNCisqcy1aYStBdihuSnJGJlZvamVGfHxBSF9xTT9oZ0lPOylhYSRzfkZNO1hZaWtZZDlRSyp2emRFT01hIV9sdT9ib2JsO1BWSCN+JkNRaG1ECisma0gjQDxVJnRpTHc9R0MwQFhjV1QwJDJ+dXNgN1V5Tjk8ODhaeCEtPz87fC1gWSozMi0lNXBqPylBbCk3bU0pQUFQKXZzNSFpayE0P1c8CitaS1J2ZlAmOTJCO0FSRm5ySDh4KVU+TVA0NmVha2t7QzZyfWZ4UGpCNzVIelE5IzBKVFNXVWokUCkrO1A2fWdmIV5jJmMoXlBxN2dNT3dHCitTQDBWIVFxOWklb2xmSklXVUtOYztFZVMwRyhRUEpBUCFwZCtwelNaJFMxcHlBPU5TPU9AQHxiZT94VW5kajtZYShqRkdoSjBsdHJ4a3t7CitSblE1XihybGhLTXN+eSlQb1kqIT1fU2MpQFBLU3ttXkA2KjMqIVllKVNNeiNGSW4+YUtAKX0qMDl5PlUrLW5NUEc0OWt9JSFBRmhKSSM8CitlO2l7WCZieEo7N3VHNjAjSnFiSnhgZyRobXMwO21tR3RFajkmTX1NZXU3JnRQYDdScWptQE9hNjt7VEEwanoxPzgrczB1PmgxaztrM3VlCishPHMlMSZWa35GZjtuRjEmNVhQekheI2p8JiVjPTB6LU85S1FIMDAwMDgwUH5kPU18Qyt6UGBtO0YwUjlMNzA0bzNoMEJ+dD1GSkU/TFplCisod0FGS0JkYVkmQzNZVmxRLVpXbzM2XlktP3E1YjEhZ3BZOzB0Mlo3eShtd04+QTErYnxHKl9nXjlNV1A+czZ3YXx3d0hFVzx2TjFBTzlUCitgXzhXP25Hb01OT0lhUl9QPFhqK3AoT2UlUX4xSTVfRzVnP3peOV5sJm5jblJFPXBBNmFgYFJSd19nMmxhezxPUF8qfXlseClXfGxPaVJKCitVfjVASSFJPVI/eHNJWD1GPHh0KW05b3laNGQ/ZDEyZkFOUG0jWlNiJCMzKDtEa2JeaVlQZnVsaCZ7OHIreDl5RHc3NlNOS2k9ZlV4OWo7CitUenlDYSk8dGRxNlBuWGwjRHFyNHJqPE8hUWMlbUE1VllaZSs4IUMrTSlqUD9gb0k/Iyg3RGRzVFE/MUVMMGVxdTsxMWZnciomcytSOUd3Cit5Pm4tN2V3Q31JdH4+ZzBJWHZ5ZTdSaldDUnBPUnxzeDQhVyZeOWd+ZWRtUkN7eypqVztVMzQoWjt1YFVOcGhnJUtpT2NOb0UheXJfWVU2CitQSlpKZmRRNCs8V1YpJDllZWhoK19YKWEmWkZYSVN2P3t6Q1ZgKUtXSE8yQWNtbXZyc0xqUStVNnVjM0QyR1pGSSN7eGd7b0NQT3c0YEBsCitTZ3VTTmhXIXtIVHhCUG9gZisyKVY8SjBDU0VCVyVjMUBpYEc+clpgVFJ2ezVIcGFPUCojOGtJUTlLQWhFU0FnQVlVbk9BWGlHTmNyeGVRCit2WjxqWVM5aUJ2bFdOPFl3N3ppRFc2fENDa1FaaXQkajEyN0o0dkYkeE80JHZGa018IUJILTFwRjRvQms/Y045XzZ9NEV5KFh0cWA3cW11CitHTTlBPUdWZWNtb15wPnVOU0gwbE5hejEpVmpacytKcFRBQkRnRFJ7R1hXR09MMXRzanNaYkZASFY2V3BPUCM5O2BkM14+bT9NKVV8NVRoCit+KW4mPTBvOTElXk9DZ1hCVklmal9uLWZsJVpFWnAoZGE5T2NAe2F0cztAM2lIaG8wYShCSkFIRiMwdGM8JFcjR2JucDl8Wj0qaDRzNV99Cit8VHk2V2dARGI4IUlJQFlYPU5neEY3cUdVSjRfUU1TfihXXmJYcWhWPSZHenFNOyRXKEBzb3NsQVh1bCExV1dpbHFBcmp9Ymt6d1hEJSllCisyQjtga3wzSFQ4SzMpPkN1ZihVdEAqTERLZChmTyQjSnAwSTJ5NExAPHFoUkc+THUjUCloPkA2YVdBSzJtdGV5N0R1VTctS2Q1RDAwN2hnCiswMDFRYjAwM31sYTQlbldXb34zfGF4WjlmWkVRN2NYPHsjUWElcDhSVXRlaSVYPj95LUVedjhXaldHX3dGYnFaYW9XY2pGSH48bUA1KTVuCislPmBgYk8keF8teHd1OHYrT09uRVhDcUkyWnxHO1NoWWVVaChYZjRvXjZEem88cSp4VH47MFpqdk5HUG9ubCRHWT4oTUQyYTdzWiYrZWpJCitaQiRgMis0Q3ZkTkFHcDYoRGhzeVA2OzR7UFhQRncheFVlNWcoLSFvPX5UTXdfeWlIRGs8aGB9ZzBhQnRZOTROeXgxMVFZLU8wMDtve2xACis+P3pWdWgxXjBSUkE+MHt7UmIwMDAxUlg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUliYUg4QkZKRUZ8YjdkfVlkNC1aT1BzMTx9Zz9JbW9RCismfCFiRHdUbnVRVT9aRDVRdzIkUmF0SSZYKUdLJkA7VDd7ZCthISZOdCs2OXchZTR4LXIwcFU2PndmT3VDZDVEJGZgRWhmIUw4empZQSZ5Cis4U0xlXkJ4IVU4amg0Q0RCVWpSKTZeYS11TFhGJWdnfUwoeF4rbiFBVH15cG5qTzl1WSFQLWhweTJFdEl6Xn5iQ19QaXIhTWVibEgycUJWCisldkVWI1N7K19rcTl0LSV3NkQ1U0kkZV59WiRtOG42WHpWSjU2IyFUUEg4dDhLb3d0MC17O3Atdz18QjwkPX4pPztNTHo9I2dmMG9uZiQkCitES1BwJmk/OV9MUj4mP1ljR2FPSkMmc0taIUBPO3AoJithU0szakBHPF48RDh0WmooKCZvbGp0Vmhyc3NeTUFSYnNBMDNMeCs9MFYoMCtfCitSeTRBaUJLY1BfaUF7TUFJPWdhSzUkO3ZkY0tIey1OPmdRVzw/ZmF7dUBuJXNWPXFvT2VYbkQzdUhmRH0waz1rJTI8cHlNfXZNVHFsZnxvCis4XlB0UFBlKmgqUnEzQExpKWU9aE5sOzZqcVJKPSVGRiVGdVdwNF9VRjIxS2xaIzM5bGBsKnNvaG9aWm57TWEtI1Y9NHgwfFhRUjAwME84CiteT1k3eUJ2cVpNclUzdXxuZ2pwPEJMRHlaYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZMWktnV2lNbzViYUg4QkVedjlCUXA9OXBGYnVyCis9RH5PekEhMC1ud3Uhcjw8PXcobFBEKylvZT18cnQ4ODZ1c3t7ezR6cDU8QnJDTWF2VDwmV3R6fHlCSz1WeCpLX25zNVJKcjIkOHw7RDdjCitZUD1XXytFSnpCRUNTMUB8cGdjaH40akx8cU1pY1UwSSFfbmV9fDA9bTVfX21jU0JMK0x2YGlRO191X2stRUtwOVcwYEYrNSVQXzFge1J6Citsa15Vbml4YVhxK0xNPyQhQ1NkQDNNQ2koUFZKeT1BUXhxM2JHWCVBQmhiJkF+KjFYQ1AhJVVUP2IpO1NhdXBeJUs1TUlqSUZwIWdrO1RMCittR2k2SG9pZlhQfVNWfjliNihCbnsyJE07YGJPc1JHWTFIQCh3e2k2MmxJRyghfjZwSHN1WGgrTDE9M3A5RWhFUGNDWkh3bzA8SHhCfHA7Cit0O0l2fm0/eTZgb0JEVUtldTdmREdGYCNaeERsYDMpMVVTJF5Sdz5ITUVSQShDc01KUGRKe2FHR0BJKz42TDZzdEZ8QylzT25LSEBOO3ZkCitxX0xgViNZRyMjN25yemBHeWxNQ15mcShSYSF5WXxqbzQ/X1B5aGokdGtHc0NKS2w3KFckOzJVSVhIVTtCIVEmJT15anZOKFh5amw+T0dVCitwfktJbU0mNXFfeG9EU1AjWDN4MUVwfEV6dztgLWByOE5CX1UjblM2UVMxNWlyPzFRWS1PMDA7b3tsQD49IVBqMWN+MHNzSy0xXkBzYjAwCiswMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFIOEJGS35HLWFDeUJ8JVdtNSs1V01SdjdDdXBeQWhnIzJJOzJIPT84Jnp2QVpUZTdGCitHYGFGTmhRd1RjZDNVKCR4aXd9UUp5VCQ/cj4lfmdqOzclQVo2USEtbDNGMHJfUTxuPmZvKkoxSXFFY2ZRRnZRbFFqa09oSEJmTylEK011Cis/WHh5Z2JrdnBkOEJKcWQ+RkdUNDFVdl5CVU9VWGp2SUJYbiE7RnEhUWV6dD95cCN2IWFtTSRLNVJgfWUmdEt4dEVYISlHeWRVPCh3MyoqCishel5sUVFaSUdjTHJTUGEqbWFLeEIoNzMxdFc3KFAzZn1JIzJsJk1qaWkkIUEmdCMhY0smQ3B4Xnoqakh3Z2QjNGRTVHlYcHtIdEA7aVFUCis9ezVHJiEtZCR4cSZnQ3EwZ2NYQFZjakRrdVROdWU2SkhefFVtZm9JZCRpMWhHSFZYZipUQCZSMUQrdWchQ09EMDR2QHYjN25XKzJOYURkCitVaThZbDdrZFRuNUVRQl88dG02aW5RVmdJSldPNmloc0lVcEt9Pm0jKT54Rik/clVNZXdjMENremFxLWREV3pKfX5+Y15iZXlQOCN7K0JvCit2WktHOzVyJjMwT1RRSnomVig5c3lPTlI5bUJLUykrUTlRZipfV1g8byspUWxwSCUzezBvSm5TbHtSLVg0KTJUcT9uMkEtTEE/OEk8QVY5CiskIWtoZiUkfCNoYSFDfHdrOVU4YG1VeEA5JWlpPFVASStRNmZmJU44YjgtPGBDfHsxR0YmWHYpSipJPTNCJj47SVU4JE56dGxJS2I0WigqCitCSzVkXzZAfUBAU191dGhacXlTMXJhQWhLPD94XzVyTFBwSlVXTH5CNGJeeX5ILXlHSDZfNHByPl49fWdPTUBlRVledCp4aSN7V0VjYnB5CitZT08hZ0J7TzlLUUgwMDAwODBQfmQ9TkEtV0NeO2lsMzBMbWkoMDNaTVcwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lNWX1YPk10QlV0CitjYjhkQ2drdWtKfm05fEV8QSthSWp9UD1UKnw4Mk9Kak5weXtPbjdIRVQ5bnhHJWpLJWdhaCV+JXAwbDNLNi1gXzJwPnFXb0l0dklrVE1jCiszMEFIVVl5NXxxbGB3UXRYQWJ9QSMwSlp4OXBPPXQrYHomLUNXQUg1XkRpSlRGWkVLQ3ltbHVoSTktVW1ee25naTclYmghbXpobnlIcVh2CitLS35jJStGQlVId3lJLSV5e0A8TEBRMXZUaSQoUzt0ZGl8NWxaSThRNiR9PHx3aWYhKkYxNnFsbnt4eE5XTlIkbXNmQjtMKX5aQn5eY3NZCitJRiNKfHJXIVp9dEZHdnd+JjUta0pQOzQ/YnN1OEgtY3VNY0ItZDwmU28tQDNWSU9pcClKZWtzQ2FiSnFIV2lNK35WMmYtLSlofTNVMzh3CitjdlhLVn0jKTxuZylUYSVBZE14K1BfK1M2UTAtdjBVTCpzezZzK3lhLXtoYG9payRgYUskM3hBUG0/ayg5UVAydCNwUnF1NXRxSEEoM1lRCitZVSFkelFQN0BPO2ZkRkN5NFR5UUtGfiVaSm9CJD9gMHZwMEZFPkZ7NCZ8JWRCJHJifFh1ezdGc3BURShKNVo1ektgVj15Z1FaMHxEUiN5CitrRHlCY0Y5YEJPNFlTaVhxMn50NFZeS2dEM29FeFY4MC0/UUZ6blVSPDBvcnRaYWt7WSkpSkgzazhUJnQlMS0qV3EjM0dYLUdFK1lyKUV6CitMeGUtdEYkTHltQTVLVjN3ME5PXmo7IUh6Tz4hfjA0eT9wJDVhR2IjVyRPZ18pQmAzViYzcyg1cksmNEsmWlVxYG5lfFopb2JaTSUrI009Cit8eVhVT3tNbjwpOT0/QylPMl4qWXlBR1gzVkJJeWAwWXtMIWdvZWpBKFNuQHtNLV5sRWcqZXs9Vm1lJFI7V018b0Zqa1Y3QzxlN0khSGk4CitQN1FLU3tjcU8rWUFNWnNqVlJ2T0NVK15EKjxxSHk8Rj1BV0NiaUdRTGo4fTN3bT94Y1hSQGN7JT1fYEIwfUUkODhHISp2VVVhcHxJS09SCitIM0V2Z2BAX0wrTzxaX1A0Kmh7V3MlbjF2YSZwYmFOLVBLX19Be2pxK0hkc3QkXk1DS3FKPWt7ZlFWbzx4RWY4K2xoMD8lOE8xTUx2eGJgCitTM2t0QDd9QlReeCZ3QitgUmA7eDU1QEpyMD4yRU4wSkFFZnQzRTs4K2Vzdk1GOVo+YCpPYGJqdyE7aCUqSz1uSH1BcDRzPFVgSU5RbSgpCitqaFMmRC0kPEUrRSM1KnZnKytBWnFIQzlmWSooUzZBPkQ3UU82djUlQEJqVChURzJuKmxtOWNNMk5KcWE5ZT5JKW1uKT5sQnZ1cGVHPmxSCitGe3F5TiFsRHBDcUowc3E+Ozs2WlZtQmMoZ14qdEBoTzZrYGlWaiE2d2NwYW5QQy1uMlFqKUxqfCpWMTVZUWwzR21oLVBnS1Iob0hyVjxDCitGVGdlWkhANDFELWlDaXJOWE0zJWlGP0AoNjdIY1FkRWVwRXM8cF52QiU4cD1uQkBUTjA+VUBCOzVFc3o3NmsmMktGPUs0OTdjb2xZU2k1CitpYDQmbWkwblNAZTVmd3Vra1BkQn1zaWdQVEE9QGQ0RWIoIU8yIUp8N1FoP2l2dTVfUTU2YFllKG19LTNqfTQjZ28hO2J9RT9UeCF9PjwqCit9MEkyfEYmJDFIRSl1ekplJj1ANEp1PmNHYHRlMXhkJUAwdkoxV1lvSCZZZGNoeWhTXyE9V3p0XlFVY1QoRHRhO1ZBfCZkcWZAJm4mVUtoCis0MEElMGh6OUhnKD5mZ0UldnpMa0F4bUdWa05ga3lVPHRKZWFFKXhHRXNCV3xePG9CNj5+aUwtZlQqcSElRm4xYEtfJDk9MTIlaTdySjRvCisxNkVLaFo0OFooKGJjdGt3JmVNYWtQfTNZMDF0JDF3X3lWflh2YGcyM3hRSCRYc0R7NU1fKyFmYyR3b3hBISpRdk1eO3BCPEhiZlpWO2JnCitpYVVSSTdqKDdAbHhZcV5MPF5zZDZvOSllMDlNSjRPOyFjJlJFPUpVXkB3MEpQP2tKJiNFJkokZU01KC08VEpqbDhlT3lZNVVoWT48QTB8Cis1bjQ1ZWtaaUJUZlpjYTYzZkd2PWEwS1lhQ1ZzYTdORVlHc0pKcGlKY0JMQnFzIVNqVj4/bE45PS00OUdpY3o9bDJWTF57ZD9aX0JmQXpICit2bGdBaGhoS3hsZ1Yme3ImKE9gMVFKdyE9PigmTm43NlFSXiVnS1gjTyhtIWBfNDlfMTM9Um1vQTd7OyEmNnt1SXJ0a0ZRSUs2O3gqb0VECitHPT4xKDA0fUxNXkhRfG8oMjtPSndHNlVZKVV2Y31mPD1PMjVnWiRpOXk4eW9wdnZRZU9MYEFteF5FMT1uVU54e2k2T1RLN15UKzBQQWZQCitDWV96bllmcmtVMHhSKytRa21SJXxCNEkob0xlLXVAeXtIQVBuayM/NGo+LT5JOXlwezBhUEgxblA8QD1zTGJKb1k+RENhYHVETX1hNDcxCitFSkVxMD5ldnkkel5ocnxGcHBTKHNGPUVDSW9nRjx6WF41PThleCV2P1BIV3BBcXskfmMxcFJwIVJyI3FGKDdqRzsrOSNGPkdBSTJmQl5xCisqMVhVbWdiSmNzKnF8aUA8Xj1IalJXWFQwc2hFTWpVNXdsJDkzU2xlan5tc2thb0FWV3pWYmlUdyNhKnlIX3pKKWh5fkxrOSRFZXB1YjBaCis/e3twQTJQQVI+VVhuOXhKUFBfJDtKSmUyQVB+bnFmYn5jMFchbzdTMXxhZ2pWRHxaaDw7NGZBRm9sQDFGKUZNclYqOW9SelBZeyEtIUg3CisyX2FjYE07cXltTH53RF90WlVJZ1EzOVlnbEhtcCRodzB8al8oIyl6PWZpOWVjbUJ2O3pkSDsjQHd5cGtvUXoqKXlWJmhmbUZfMk5DKTlvCit+Vjl4LV54cV8pbHhtNE56Z0VNOHBvNUNOSFBKN2dMeEBDeHwrQEBvaVA9aH53JlUhPUA9TVlJTigoJHh7NEt4ZUB4d1BNbWVLMkN0KXU8Cit+XilGV1d4UGd4TmVLZFFEeGZ0MT5WKGomX0wybH0rUXIlZE8hdS1CJHI8QUNoMkIyKT9jPjJLN30/RmhhZE5XVmBJQGwmYGhBNURqM0RCCitzSnxWdHYzXnVpV1V6M3Y8T1RHfiRwOHtpMUpQTUx+YCQzaXR+PFAqS2VHeTU/QztyU0JiQ01oWSRKVmt2NTxqKzMkbXF8XykjPzVBQWMhCityeER5dH5Rbk5UODd6VmooPCE+SC0xOGlON29ERU1+JiQ+byQjIyphODxiaWhvTFJWe0Q2fEx6JEshajZhNjFmM0soWiRTcTxIenpXKDByCitBPnczN1F3cS1KbDdeJEp0JUcqYmp2PjJSc0lOMygtWWhZdHBnYiZiM2hlTCpfejd4KkZ4R2Z4OTlqdTwzfWJheVYoKzMxckdZQ0I3QiYpCitrM0UmbVJqWFRXRjJ+MFA1TlR9I3pmd1h+OVgqJm1kXyh+WWM4QXZOfkFsMExkTFBVPDU7Syo2UUtqWTk0WjNRdiQhJjk2RmZaYzU9Q2I8Cis2Tl5IMW1wb3JLOH5XUTNaZENGQ2M1cikyMTQ4WHktZWpNVF5rcGFBanU/Jj96elJnMEdSUHVjWX5gXzIhTkV5S087Q0U/eDJROD9VO0peCis+JjQpUlAxJiNMSHdEREs0YU5DV155T0kpV2J4Qn1rT2w7NUdXbjcjdDJ6e1NIblBaazk4THlAeFFYNU00SkF0YTJgRVh9NypCeT5oM1omCitTMVE7UiYwUSghdWBIKyhLaWMyYCpiKVBLT3FyfDVTKTFwQnIjSU15Z1deMlQ5eVpuRFM3SU9CI1RtI0prPGJCU3FIX0FqXip0ay1fbV5mCitae2dnKnIyQnw+OD5JT1BfWVVaZl87KX4pNTQxPTxKUnRpajdyVGw1LUA/YmtqfFkkQldiKn03NWY2QklOUiRzMU4mUCR8ezM9SSNlQ01aCis3YHYoJEd7fXE2RyZCNCl0QD9eUFdxVUNjdWJtTE10e2krLVZgcllxQGNrKVlwK2FjfTxIU0xsUF8qZD9qazFMfUk7ZTl+ejZHZE1eY3M7CisjaDlgdzd1TFhhWEhxeXQzdXw0U2lTYGphPG57T3BlRlhTIT5qSEN5Yj88S0QqUyQjP31GO1JxJnFvPT1CRTZDNGk/YmBxKHs7dDUpdFEyCishSl43M0xldypUJWlpUVlyV3h3PkhAZD5IPFROZXFJO0RmNERwVF9qR1RgMGxiQSpvUXxmS2syY2hCUG5pTCtwQ3t+ZEFjO00/K0Z8U3NPCisoVUNwbWY9VXJAUFNlcGpBQUltO2RBOGlMWFF9cnNCM3FzakxDUlMmanVBZj4mSVJ2PktkX1k0elBufiErTXJ3Vkg9WUZIaiFuMjBaPlo9CisxUVktTzAwO297bEA+PXI1RShaZzB7e1M3M0lHNWswMDAxUlg+YyFKYzRjbTRaKm5oZVopMG1fWD40VUxZLXcoNVk7UiswV0AmNj9FXnY5CiszUj9CWU5GYzdAIUQ7NnEoTlR7bk9JUj56YzdIRUl+Y15uI2BNfWY5aEhXNW02TlVEeml6RHJWKXQoVHFmVnV8SnNYSj08Zzx3X1Fpcmc+CisjNWc9cUBCKmgqITlFd3ZQdCFQTEo4S3xPREhmejdrakw2Rjw8cT18fGk8bSZZbyg+TWVCYmpQXkJZejl4Iyp3Xn47YWNeSnppV2g+RG02CistKzU5WTJMYW1oRjkxOTBWKUR3MXgqPnpCKmlqWk1UWVZVMnF0TmJfVXBMZ3x5VTJWMzUtfnM1Q0Z2ej5GO1QzYnNtYVFKRm8rOTBafDdICisqcGZVX3tDeFkhVUR7QCtneGZ7cGFyXiZLZSVvTldARmk3SG9zJG4yc1pydU1qN1RyQH56P3VCYUlAVElaYTd+YEk5VzBaMHM7PGY3e1c4CitzRnlBenNZP0Q8Vk9wfCtsbiFeeEZpdXVOWUstREcwTis9KkhFe3BAVFBkbCFLI0ZtVk0tX15+LTJHYkJSeiUkKFQ8OCFrcHVicmg5TjJsCislQnQhR1dISSZrVCU+cjFOd2V3UFdvY2pJMXUqXzBCUzN8aH1qfXFZZFM+eSM9YnJXa0x6cVlndmpDVUpyaFpqfDBIfFB0Xj9IejhOSkEoCit+Vm5lJkhMZ3F4KFplb3otejg9V3ttNGE/KFp0WWNFXmo9ME8kN3dQJVdOUmQxPj5vTCFaJU15SDw1YGFneFVuMT1BQCpoR2J0RUlxaSF1Cis4NkowWSsoZ1glZCt6WVF4TmNWb2NNaVRRIUtLOFpfWl54RWI9Ujw9WT8/blhoQHRnamExVkRyIU1ITyU9UFpiPEc/SWteaFVBM01hN0VRCithVCYxV2lxLSNBKVFtQDs0aD47bzEqdGpNQVhoWS1aRkIlK1pTeytAezlwJXptZj9YKk5xZGZnUVR5QFFHZGpmRi1PfUVkX0dYNlpScSt5CitqbCVpP2M4blcpME5NbDVwRX1gNXNObzJgVzt5ay1JfjZffD9sUnNvdnpibkh4X1pzPDMzaElVRDc/X05GdzlTYV95NmJsb25gMlh0cCh5CitYSSYmYT56ck0xay1Cb2hrWXhCfGtgcHZCP3kxRm9Qe3EwKWhXSFohXyZ8V0REMT00Tms0MGQjaCpiWE05RT04X1dGSCNoYi0zUlMwLTYoCis0VlRVRXpZTFEldCR6d0pLPnpIQEUjKEJ1PV9gN2VRSEo1aGZrRUo8SnN5NCp2NzZGWXlUcD9ZaE1qXkl8YmdDYWZJeXQ8PSNqcEMlTmE3CitmZj82SHJtVjFsQmxYKlRfakJyLUlITD9DI199Oz0zZnp5KmVmJWVtUnxWP35gTyY8TnJgZzB8WFFSMDAwTzheT1k3eS1udWpyYTAzN1U4CitWbXBjQj4oXmJhQXxOYVV2XzB+V04mZ1dZO1IrMFdAJjY/Rkt1Z05YPngzRFZ7Mnc8WS1LS1JkOEpuMFl1aGpvZSRRV1ZJRTMwUGM8cE47Citmby0lZlNocXBARmNgeHF2QWslcHJCc3NGPUQqKmFXR2l1T3ItYlB4bDVfWG4/QHViVXN2eWdYK1Naejk4SGo0OXY8MD5AcztuKX57Q04oCishXyQhUTFheCFUb3RmK1hxU0VrKldlYntvWHJKNzYlR0xXe29AZldxO2VxQEh2ZnArJnlsc3VvcVM3cXRnWSM7Vj9ARGZqR00lOHZjZiRzCitXSFlSPlkjKkdlWG5iOypvQGhpeHZqMTRpNm5FNGcqclE1NFleRERYZDY/T319d1I+PEdMRmduZkdSX1QzO0xRWGo2MSpTenZWWTRoWXllCisjSWhWfEZ0S3lDSzZvVXAobT1xcDtxOyNhQVU7SkJfV2RVb013V2xIdFhQZV4qOVRvVj5ZOEUpaFFSO2h2UWsta3tZc2AxRVdQQSVGd082CitiQE11bVh0dTRQTDJTK211JEB1Z2hNVUdiSXJaOVdFSEFOdEIkYVFPflorPlFtPkZYU3F4SHtsc3JvUkM/VERQRE1nPFZVYSNpa0UxSD5mCitXQGFYVzhGLVk5R0x+I3kwTWMwdzxvXitOQjJUYjg9fWFCUCozVUpqdV8/dCE/PSt0PUlxZVNmRk8+ejcxMTl0RVVGcFY4ZSt+Iy08ezVvCishQWwoMSlwfjlrZzZMfF5PeDFHMkg8aCRWM1dDVzFGeTI+dzFQJm43PSZBfi0lKyhEcz15fmZ1ZUh9RD5BdTlKaE1ta2wpPGpiMnlUPml1CitvNlBTeyUmJkNwMy1DRWRWWSpMLUs7K3ZBPHFPN31zSyM/VUx8d0c8X0Jsbk5DbUtXfjJaPFMrKilubVgybCNscThIZFV5QlpeVyMkPW1ECithUStGKm9vJFBZMHpDeDFBQ0dEdlVNcD1APSEkQEl4a3VfT0tzRDx1JTdeSyN1dXd1NCRTYyFeVVlsVyEkU0hzOXZBLUpZdkd8PENgRmtuCit2SDgxcUhuOSh4ciMwdil5UHdBZnBnQHo8M2U+bTthSGh1UkklVVlyKXZ0Mk5iSG5LbDckVTNqI3RVQ0BqQjcrbmQjaHZHNGh9ej5yVC14Cis1QTRtKlQqWGJ2YDdXal5ebzdSYnAyODxwbSR8Jk17c1FKOVR2ckZXPHZgJmxqbV5sNjhnOWx6U05JbzE5Mk1ARGRaOXR9bSUtVnxBTXtiCit9eGFeSkM5SE4oMWwlKHJZblBWbW17YGsyR0pnPDMpJlU+Q2U4YyVGfDhYU2klT3k8aUlwVWtoMUV4ZEBAbnYhQ3U9VExvayp9enskN3J+CityPWIreldvPH5nPilLX2dIezkzeiZ8VUBjMV93fCFnM0dQKVkjOypoZ0xMUWI7Z2xSRnNKQVdwX0FobEpjUDB1YFREZk17JiFgWiR9JUJiCit6Sml4dmZKUkRFV0VFeVZhbChYcjU3fFNFOXkxKGd2QChyVWQ2NlJNN1orcUImZmNlXjUmVTFRWS1PMDA7b3tsQD4+JiVeKHMrMm1rPDA3Cit5dGt4MDAwMVJYPmMhSmM0Y200WipuaGVaKTBtX1g+NFVMYUF7PDBaKTBtX1g+NFVLYUN4T3o/ezRGYDUmdiVWQXFXU0gqZ1okZHJxfCt7CitIYkp2IyhndyZTaV5UMCsoSDFmLVE4QlRTPXAoNShGOFgyTHA8bWt2PXhnKipfRE1RM0I9eUlabFU9TTNBVHFAbiZpdiotX3Q/U0Q0X0ttCis3U3c1YnklNFBATzttVG1KJENmaDlScWBRfHhybW5RITUlREtzTzRKQSRBeEE4YCE3Ml9Je05PQCRBN2BVVSRifGpXTEw1KiNoVSRnRjNOCis5fllyOWI4QDhDNn4pa3ZsaHVnLXxjYlJpOWN6ZjIza2pMUGhhWWpNS1hzJHZDU2dEbEpTZ2NUckIyTEV9UDl4QmFKWHs/cz4kX2kkWWU1CitMZFVVeyNmPSg2OW9sTEtsWHFqREViUSk3Z1hQJjhgJHw8V3xEa2paOCNvI0RxTndaRSllM0RHaSkqNGpkUmFZKzIyN1glLUA3Xll0c3RCCitBfmxmM3wyS1M/VjU/X3I1NDVqRE0mMWZXaUNZO3U/SGNENTh9dmZ0fWlaY0ExPFQhNF82MXJFSk13Tjx1VyhYVUAjbUcqXkxMQiZCY08wCitObVYmVXE3YkQ4ekU2Xn5LYjcqQ3l9JGxGRiQ2alc1MEROOW5OfGdoPEUqbGs3SUJQKE4/WFJ+TSYkcnA/MHlkaGVxRVhIWDRkdHEoN0lJCitOaG4wbyFZQEAoIWdjODJ2aH5SbXkxeTkkd0FrcW5tZWcmJUZgPm5FSjhENzdxSnJrMCZfMkErWmohPX55NCtjTFFCc24oKkg2dT5JczZLCiswYTYwfmRwWVFxOSUrclMwak0yYWNranl+K2JtJDxEfHk1UEI2RDAkSj9uY0x1RHZuOThTbk0zeFI9PVYqezhUXypaaTxRWEJLK3dRU0U9Cit4aEtDIVh5amUxfWlPMDlofSFPMjlEfnVvd1pLYXEhY3laV2tRdmw+QWdsNGYwcW93QWJQNj85QXpLK1FEWXVzNndEWGB7T1UhTXhLSCVzCittUT10S3UjT1NCT34lYCFjZ3JBOUZKeGQ+RkV7RShhaEdGPT00XlYhNFVYUmVxYlIlNz8hR1hBNiUoZ0lAaj9gbXw2LT0hN19uUlhGT2w9Cit3TCFtNk0yaSFoZ2pTP1Q0eTBUXk0panVQM1FAMWpUfld0MVJWcD53NyUpKkwhbVd7Q0E/Z1VGazVULUZWaCgzKWtRZk1MPmo/MW9fXiRfCitWfDZjRT48KkpsRlJVLUN1XzA5JXApRj1rTGgpV0FaXnlvaGI+KyVkYjd7OzF5SjhqZzc4bmorYCo4PHxhdFhhb01pIVZza2xDfXstbm1ECitKUj8yfT9EakFiJXc0dUBiI0R5PD5GQC08dENKb1dBdm9AcnwlZWgkUVNvTTNYSlR1cjtnR2h9ZUghSnxpPTBKX2BYdVNkKWEoZ1peNmI1CiskVjtlVn1gX0xpRHZ7eCtmVjdvNlYtVzYwPSQwdk8kNHlUeVVFIzFiSip0VVJLMiVpaW9pYSEmc0liSmZndTFUOWNaTWVhMlkhNVE7fSgoCitRQyUrKVZvI2ZORyZ7aztfdn5uQlV9LWZiR0xDYiFRZ1dOaklDMj1oWHA1QylISWd7Y0pVR20xczF1aT0xYC1aczB5JHltNHpCc0MkK0JqCis0VXJRVGYrb0RkWC1KQ0Y2OXsxKTRrR35rQDB4PXMoLV94MDM7STU0IVdqK3QzZzxJK2JrZ3o0biZtZ09TZEdOMTF0TnApKEl2OGEtQ2R4Cit+VDAtNSQ7SXloUUcmYHEwQ3RfKlktTlBqejMme3t4d3BvSGd1cFV2Sk16NWZrPTxAUSU+eGIjflpoWkVkUCkqUnYqent5bnJ6NklgPVdECitRJSQlUi0jSikyNyNfNDBUSE12cG9gOEw7YVlXck5pZ0B8ekYyVGYwdmY0Z0N1PVVEODdRR3BtQSs0UFJ1bntTMUFRMStkP2tBJCMrTTxVCis3cFJlZ3FWeSZyel9gTlI1VlhzNXxDdmstMyFjPD9fOE1Bc0xQPUtZQXJaNCZOU097MmZKYXc+ajxCdWAhPE8zUChmZGIhYWtqTUIjQVhDCisxKmNwbW9WRnZINVg4X2B8N35HYF96fjJAVk9VLWRmSDVSQWUtSkc+bjZVZ2gmfkRTN0t1fnwyakBjTlRUTlh7JlVVV0M/VkdpcmktQU02Cis/eXJObEFZdHQoZVRhNkx3K3JZbHs7cHtje0J6JlVMeDFkMmA8Zk1FJDVFUHFqajRqZTJgfX59Yjh2KFlCdWskSy17RHVQSGxFaksrWSF7Cisyd3ZIaiFPbkBPX2s2eGpJWHEqbGdQLSsxT3l4NT87dTIjRig+byNRbWVAcSpqYXBvUjIqT0ZfSUQ0ak5+Z0J3cGFNakVGd1ArQEBqX0pLCitCNmgwcnFUR1F5U2BoTFI0JG5vR0A/VTJuOCoyYF8jOU1yOX1mZnxKOD1nSEEzUl5sJkY8UGR0fC0+bSYjQG5fKFdBJjAyQj9JQnt8fnI4CitNSjRxO35EfUt3PHlBNmxEanUzRVM2eGpQY2QtYGlgbilpeUI1cXgxcDBnX01yRGNOUE5YV098Smc8ej5jRnxmQ0RFfjY1KzJOc3U4Y2xDCiskMH41UmtvUzVVUj91QmtgQCo4bipmWGYkSm1fZ1dEMDE+T2hRe0klTVNWWiFeUVJXZmhaRyZoRHQ+dVZKd3xNSW0mYWphI0pZYHQ3MWpOCitXd1BMIUNzeWNhbW8pRlNkZXBxfHZtfjBXckgpeHBQbGxCcXJvazJOJFp+TXhjYGlDa0t5Q1U2OG89b1pMaWAmaEJOMHY5bElKNUlWVGN4CitCMUZMejU5LTFSKUI5fWFZU3F6ZFchVGtAUkE9Vn4lNEZTckUwMSVNTUpqfT59LW02T3YkSjExelZQSUNySE04QU0qUTVsfFk0OUJDayNUCis3PmpffWZHKj1oJjN4LXtwQnZhfTxsWGZ9SFBgWkxjZnZFZ0RKSCoweHBsO3B+WSgzdHhtZk51a3I3SjdUWjlhLVRBKypAbj1TfmRzK1dYCitKJlIrbEVnY3t8eXdNS0tgZV5iSiE/VEg1V2BMQnFKdEhBMHpIYWEmbyQyWDx1fm9nZiN8aW9hT3d7MEh6fXRVKyZfSWBeKW53YHpOQ3htCitwQCtJZyFkb3I/ezA3WUdIJlAhaHl4JXlRb3M4NCtkJkp+STd7NnUtamZjUjExQWxXYWh1d2FXQCgyd2dPcyt2K1ZfX0Y+ZkVxNV97eDs8Cis3M3FMb0RQOGpyJm0xcXNDWVk9ZnQ8YSEmcTNPQHspOUxYcUMkOz5DdkAxZDx0d1dlMSt9fmwqVH08bVpiSGVPT2ZtSEhJKEE4e14kVUIzCitKcnE8aiNYb2N0UzRIe3NheztrQm0wVkZWXmo7U0tAekUmSj0jZyM5d3tiaEooZnlNMVQwcHdlUnQkUFV+S3dzZGt0YEwoVndoVmExKW9DCitpJnZhKkklQXYta31Qcn1lJHAwVXY5KCQme1dndUxuTnM3cjY1dStsbDlXbylHKElITT1oSShaRTZjQSNgSVh4R1ZJUXt8M25eN2lpWGNLCitTbGIraXVPTlo1O2RgUCloPkA2YVdBSzJtdGV5N0R3ayZkRy0kbDAwNSpGMDAxVGMwMDN9bGE0JW5XV29+M3xheFpMZVZ7Mnc8WS1LTlZhCitjcFVIV28mT19ZaTRPfFdpRGBlP05+YH4rJV49eD5zSnNtM2A/ITUrUlpLSyp5eHMxOy1YRH1wZVBEfkJmYXF1cm87KEpjfDhCVmtCZkhBCis9Sj9QPDJeaTZrWn5nZWJNPX5vWk58SSUoVEd0WT9qSWVTZXEkWUghMWd8d0A/c3F+OF9RVnR1UlM8WHklfVF2I2ckZT5LY1cob05xcG55CitrM0pCbWlobTl1cHcxblRKNm1xYWk3RFE8bzFTe2h7Wk0/bzBgUXkpMkt8PTBASGIwPVNwQzVNU01gRzdNcDxodkJMX2N1fXdBZVlaQWptCittWWloVFV6Sj0wKzMtWjJoUVY9IzhrIShYOGs2KntJR2pPY2V1VHFfN2lET05xQ1ZQS14rQ3x4V3UhaDJESG48YCsxQWhDKytFUT1LSVJZCitFcFl1TT91ekNJfjFOcEphXztZWnUoWVhuTFI0WnkyYFV4M3s7fUE9KTFXZCE8QVBFQnZ+TyZ5d3klQHM0cyNjR2huTE1TM3VnSGlnY0o1CitsYy1CbmVtMiFfJGBjdjNuSyotYGNnd3k7cUglQmRQe044WU8mUVEhX0BCc1ErNlhkR19BQlJMTVMpSmBDdSh1bktZVkJZKCYhWFFKTD4zCis5dGFEUz0zRlI8UDswVk1TRGFPa2srVV5pRXIyKFVXPHI/SFdafFJnQ0dGQnNVcFJgdDg2dWRBcylBZjI9TH1oI0xeQiE5SV9NJjdLWFJpCit4dzNnPHpSNl9QfVhzTyQzclNKP24obXg3d3RQM1FJcmMyeT12KUwqZmg7fTI0X085U3hTM3BseD00JmRXSCRUTTVBJnFfb14+cF5DIzleCiswXz8+IUFfemkkOTNrR1dJY1llbWkyVkJfZENrd0MtYzM0RWR+bkk0cjwoPjY2Y0dkKTt3UT5sYXBoVj5fLXd5Y3UqRHY3Jn1MLVF7K2xpCistUUVyPz5jTlEoWFFGMn4hRGVOa2VFPXdEVXJgVD5TNFk8KkxaY29IdD9EZCs4eERrNkZHWSpGKCUmbGkjKnMxJHp1bXh4SjsjcTtzOSNeCittZTdFXnk2YWV1RipLS2koYUkkQGpiYkA/am14R0k3RjNKYmh8YitZYFhvWkErMFBsKSZOcih4MklBUnpueFU7ZypuaU9UVGNtRSs3VF5XCitrSDwyWmhgUl9uS0MoJnk3ODxMKChxMX5ZMUd5Qm4+YFZIeitSTFRCP2kxeFRvYVdeJkEkTV9AOTF8VEs5TGVPc2h+dFRneShGQiRfbT8jCit3bjIzKThGI0VFX1Z3S3AhKTw4dFhjTWp7ZDswNEl6YyV4JTxOeG1XV3JnQWRrK2NsdWU7VVJjO0RsfFF7V0NqWjx3aEdQcE5MUWUtSEY2CiskSjF1PUlIUmI9RjI8bWs8YDcjKDJ1VmdwITtBTXJ3QW1+Rl5JOTxXSFlOZGchQyM5UHg3Zj4lb216IWJETztQOE0xSlVHc1A/ZHphMzwwCitTYVpJSHsrYkY+Tkh4eEZDUGs4d0JTd1R3JUJjMCo4ZXg1SH5DPllAKUx8NjdaSD80TGp3bWdhMz1UOWZLbFhFY1JFaStYd0BZWkxhYn4rCit0R317PE9UVWFjU3xzUHB3Xj0xZyojMHNTdSllZnRCM0koOTYyKW0zNSUzJCZkRiZgSnJrNER3VHRVc2tXeWdRQ0xaJkduTk8yNEJ5e2lYCis2b3ZreShLQmBDRkI+UFpsJGkzYzZ9WkE8XkhQUTZAPGNVVDhzXkR5OUBQZXxYLSFxVCVAJE03NFpNVGxCQFpmezk+UVZwWT5kSzdXd3dhCitBTnE7UDNJe2lSTHdlVDRAUGwkTT1KSTgqYCRwZ2RvYyg1WXV3a3I7Pmk0NWt3T1Apay07PEw8PnJndlI5PXwxNXlZVHdGREhkVEFVNy1jCitlUkpmbWdpVSUtM3F5OWFuPHBaa35qNS1aNXFTPyZuLWg2dys7UlBuSnxuMDV5ak40OHl5JXg3dnQ9ezFleF9wX25vT0hRSGxgYHk3bGNsCitnMyR8MzZgckBUZFNAcDBuQHZ7WEVYZXp5SClmbnRnWVI+KmVuSD5ZJXFIZDg3RjY+d2t0WFIwQmctK14tRzVOeXB1NXJoVio0XlNCdHdtCitfSC1tbUJXQ0N8ME82NmghZmo+Jm1fIWc3eWw3ZlEmM3lybWV7JTxFcG8zMStZOCNwKlZvVjltaG1yOE85S1FIMDAwMDgwUH5kPU1ee3J0CitZJi0pMTA1dTgjMDREJGQwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lOQWlaRVJfN1lpd18wWWk0T3xXaURgZW9tTnxLKD1aZiUmI3lSCitTK0xua0NIWGJKeDFRSDBPalVqQ2s0fWM7a0p6MUB+YWM0VnBgUzx3UHhpbT87WUZMJShJT3A9Nj9fOFdoJHUqPkRRSkczJW5nVTtNcSV5CishVkVrJEs4XzBLYGpvRXlIemJ9d31oNnJgVENURzYlNFNEJT4xOFBNKHY7e3EybV8lMDFTSHJ0ejs5PXljOEg3NkBHM3QrZkQzV2FQQGQjCit5TUthPjJCUXlMdjVueHBKbmg8PDQ3dDxAQ2NhcSFWQ3lqI2s9OFV7RnsmczVDRGhLenJAelU3VDNTel5OPi11KSpfXm4+Mzl5aWVkJkVXCit8bEtCTzlGdDRgTXMpYUd7KW5jZjB0JEpqbiliMVlKKH5vMGdEckZHZkkqcT91MSprJCtIZVNVLTdQJmpvPTNDRkp0LVlScmlBUWxkOXk4Cis2e2FPeUJnfTExNjAoOyNqYzY8b3xHTkNzMmhRQHhpWXNoajkxUVdSKythfSZRQTFVaE5ZcFlfTG1eZW1Yd25OQ1JxdnxXV3RHYmJqdjBqCis4RVIyJn1OUjgxPnIxK0hNIz15N1ImcV8lKEdObDtUeEttaEJTaCM9NmJaKiUqMiZYIVAoK014VmdDPEJ6UkotRkVOQDsraTIzOVYqYXwoCit+bEd8IXl7RUVnJUFINzRCcW9kfGV3KWJlfHt4RWo9WlhZekZpRTllQmFPUjhZMSFsQlpNSiolREZDVWkjVyRmViNvUCpSOCNaanlue0FVCitvfXs3MU1VY0cpP1lBU2pKT29xPDlHMT1qISV1bCZjPSRIUXtqWnhHY2RaRCo/RCtiJXdDVF5TPWxTUyFEdj4yLW9OekNOP2FjNGd5Y3ZJCit3Y3w3JFdjNz8pJSl9MUtzQF9FZkM1UzJobXR2Mz98VV5CK1RtQURVWkshPCRrbllgcVN7aEQrNkByME51WVoqa0pMdn5QUFJ0Y3FTeX4kCitXTksxVWxMKSlrWChueklIWEdQN1pmSEV4eGJ5PWRlQWQpLWcrNnxvMihKSExzT31PPkxufVYwY3NMWDdAJk9MNmpWTF9UTF5BVi07QWB5CitWXz5MbFVpUEhqYzZFejhXZHdGcHYoLWFDXkIkdU9KKzhmfXdnTElXczV4WFkoaVJUTDhLfXVLZTR7fTs9Tzt2Wn1VWkZzSHtrU2dRWCg1CitZfiExKkBRc2JeezJXMWltYjkmZjI3I2c1aX1HQCUlbmYyTkImNUJ+RkBeJnB6PmhSbzdQY0NzNFFjKSojUldMNFBAdllvTmphbkpgaVYhCitATnVVN3VWWnY5bFk9fENuK2V8R1Ffdk4+aTJZNmBqdX5IKEhNKnZ1WX5gV2x2KEMkOGJkemhFSDRANFFGVFcpKT1KWkZyV1ZiUCloPkA2CithV0FLMm10ZXk3RHRGfG8hVW5OMDAxIXIwMDFIWTAwM31sYTQlbldXb34zfGF4WlhVVnsyaCZYPk1tUFV0ZUtqWipfRUVVb0xRWWVOQHxTCisoP0FlP19nOVF1UlJZTzRaN0RBeEJ0bHcqTVV8akJySyU5Skh1bChBdkVFKHc2NCFzdnRTXnVWM0JTYSViTFB4QnYqVm4+TzZsSjRYN0F3CitZO19AMTlsd19pVS0xKWs4KE9HbGBjZjNTdHU+dm5FR35vNktPVSs5OW5LQjd7THUwdjthRnQlYml2V25IUlEmUUNHNCNxcSVYKk4/Znd4CitFJCsoT0wtMHpRfGg5ZEhTeVlQSH1AbUl4aHBgPVFONWtgbCQhTTRAKCQ1dDxRUlEmYj0wZlFeRnAmZ3Iqe01ifnZIOC0lOUhHeiYzOz9CCitYdDQtTENXN1MwcnxUS1MrVnJnMjcqJjg/dzNVZm9hbEd2Sz1XRHRPSTMkSDNsaT9STTZUUD96bjZjdSZRPClHZXw1SXg2YmdMY1BFM0ltCis2NnxMMEY4PUNoP2hCSmM/PSh5ZDZwLXtAdEFFdFp5dlZyeFYqbiN1RDk4MzR4NCplWlBxdjBIcnVRemBVSzFNNk1WX21Id2hxKGlRMz9eCitIYkZtJDxZOXpaZz9aKE9DangzVTNiR25ZVWh8VEMkO1B0PXAtfjRrbEkoeSsoe2RYdyh2ck4yU09qbW1We1NQNCQ1YX5DTXp2NUJ3UmhmCitOUUgxYD1JQUEtZzFvPHErSTNlbz85JXZLTGhEJTJVdko5a0FSMXsxSXMoY1VNQmNMWlAzZGZ4d3ZOI0VXXj0tPmNLWm9BJWBTbWNhKyNFCis5Ul9SNTU0PUUwVjZGe2hgP3BUbHpBYEp2IVAmQHJfb0J7QSpIUHU5Png7XjtfMCRnR3E+QFF3PypmMyg5O3p4TEV2IWRRYmdsbmcyWkpTCis/SzZPPkYzPHs0Uyp4VSs3LTUjWmlPayRWbik8ZTNRTiZQRz57bUBaXzVlOVZUeGZSfUh4amNGM2glNGFJLSMyRT4wcCoxJlolaV96bEEtCitAJjwhO1QtPFRpR0JsNk85S1FIMDAwMDgwUH5kPU1fQVM4dylfREEwRXo8dTAzaVNYMEJ+dD1GSkU/TFplKHdBRkt9VUZZaGg8O1pmN3JGCitVdWtZPmJZRVhDYUN2MnRPPmRoKDVRZ3ZraVY/bWY2MilvTVE9PVlTK2ZgOGBFQ3JgZ1I4P3EhMGduV2BiVSNlfD8+biZBYnlQMHdKM0lUCisjSkZ+bGh3ZHpscm51Q1M9eU57bj5xb2ltbiRnSGJ0OCFVbmFKV2AzJFU8RlFBc0tGaShSPXBfc0h9NkY3NlNXfkY7WGJ+RG49djdyeDVDCis+OENZK1JtUE1rbjAzKGc9VCRVc2RrMD18e2xUT2JMZz5pVSsxRUQ7OD5ocEVnQWk1Yy1hQlVFN3BYQTkyblM9SEJoQWlVdiZ3ZipQaWF1Cit8a0tPaCNqK25gUF5oJTw/Zj1aX3tsMWZ6M3xvJiQyfmhLO3Ngcm4lZ1crQWJSI3ZpaD49c1ZnUks8RyNZdSZzP3FEOSQmemQkRnNpbkwoCis4IWRFak1ZPilgKSpLWVhXWnt+MCpee2Eydi0+LVNxTldPUyZ+Sn1jdURyKGNoN3J4U3ZAX2kodFdiY1ZEfCo7VUFqczMkdTRFfTRPWnpaCit7N0JNRzFqdTlKR1dnYygoTGJBe2FmRGNuXlU0dDQ4S3sqdldPXipBcmpxLVRqU34kKnFtSE8wdyp4KXVqPzgkR2hWNH5NWHtqU0M+PWdPCiswc1dfOyQ+TEFaK1hQdzQ4QUx9Yl5LQD4peystTDR9I0h9QWAjNzU5LWw5bXQxYSlidCs1YStvbGwoWVdgSHYjYStWUF85WT1YdTJJXjg4CitNeyM3PERfbS1FZWZWTy1ZPGVlJU1SWk84YkdiRERobz0tK0ZlMmUoMU1XbStifDd4Kj5oZ19tPC1HPlF3KyVMKEZfN21TeEB3XyRZViVxCitJUXojaW9+NntxVFhgIUN6MkkwfFhRUjAwME84Xk9ZN3lYR2d1OHVtUyk4PHBjbCNBT0hYV2FBfE5hVXZfMH5XTiZnV2FBOUw+VlB8UD5YCitEP3I0Wio2ZDRiU2BqdGJ5Vk1Qbj1sWjU9ZFU7PTReMWFWeF54ZHlyYW9rOHI9ZUJKUk1KKHxHJDk4TFYkSW1wSGxiK1J8R3UtS1FMLU8/Ciswc0I2R191YnRHVl8yJVgpNGJlU218ZVZpMylmMEFrd2FwZXFPaWRAN3tle2tQI1Zta2t2VkZ4SkFfNWVHSXxWPTVXYj18VHVHUWs3Y2c7Cit2KEdWSil6YkElSEhCaGsqcV9XVCRCbm9iei1+c2BrR3BzRmUzN00qRCFJe2h1VDVma2YlfEg/biNwNkpzd3c0aV41eCVCZmFmfTFqMypLCisyPCYhXk0yWjZvR3xNb08xYyhTeXdOSGVUTVdsQUc1ZyoyQ3xtS3gwN1RRXlBmdHgkU199cSRPaXBRWWNzcE4mX28zUXBfcit3Yms1bVMlCit6UiNWT3lxPVNhTlF4PUcoQGVIMG5oZSlxNHp9Unh0XnFNRk1kJGYpOSUlUEQweyVoJlB8c19aeFV2K30kbCFvQUBTeV4mS3FOdEx1MFp1CitVRUFEMiNlSnRlMiFQd0F0MUdoKCVeSGdvcWlJQFQ/O1hIe1lucnwxUWU8bFdOT1RLITg1OCRtSktUck8wYEVWc1RgPExTS1BRazhqX2IyCitpe0tUdiU9KGtSaWkoMGxzfHdQelhsJGJ+TzxqSmFFd0hVb2c2ZDVCZU1xSjZ4dVhyQyk/OFk7QVR2aUExajd4fW5JSChoSmtIP0N5K2B9CityUGJycyRgZ1pYaHVDOEU0O21pTXJGOVZXVzI9KVd0JkI8cF5qSk9NK0VBcyRveHpAYHZ3T3goSWt5c3JEQz1DOEh4QEJZJmUteDZjOTFICitLcnZfaWA9IUhrKT53LTg9PSs8OHdpOGpidk9zZ1lUN3E5KnxsQEJQZithNmRZXkZAfXglOTB2T3RjYT5ZYFkjSjtMJCM7TTVgJWFXSklHCishVk9laitQWVI0KEUzcm1ESnU+eVg0eFR1Q3g4P29sfHR7K0xUK25ZNyZWNS1xY29uaTZHe25wPWFTdVhkbndYPDIzKUNqT00pdnpfKjI9CishSUxaWWlUTzZQMTh2eE9iQyl5XnJMV0plKEwqMXR+aTNicklCblRKPntmRkFBckc4KylYS1pwKzRqZjttbzJsNlZxTWxQdEhQXm9RTHI5CisqTG08OFApaD5ANmFXQUsybXRleTdEdWo8SWtpOyswMDBwTzAwMU5hMDAzfWxhNCVuV1dvfjN8YXhaWFVWezJoJlg+TW1QVXZxU0Ziel5qCitPYSVGUWFhQ3pOUk8+ZGgoNVdWdiZNKXQqKTJ1YEQoNjdAaUJNQDVhV1dTbUFocCM9dW0zaCRFTCNsLSk8dilGRkBwJWtUdTk/QXVsbmZMCitiMStxWGxRJTZoQUtRNXZ8cHtgNDdVUW1gdDYkVFdGd29TYCM+MmNEd1BtX1p7bFJBNVIzemgpYERfN3hYP3B3ZTZseGJkIUdXRSUkaShxCitNYz8zfHJhMm5yJVR5MUMyKGE7MkxzWEE+ZUNAd0UtPzVtRnYzVk9yIWBjSClYZllwMlE9SD1SSmk/NDVNeUZ7V1khZjwzMzxKIUtFP3Y/CitQU3VudDthZntvPmF4OCtCTkNQTG9sNigoZm8/VWNJfVUlTGFqbUpPVCFoN25RVmQ4cSRPbnVEWGRydlFVTk96UXE0JUt3Tj4xM1FNak9HCitaZCNfMFNUZTRTO3o/c3BqNTtXemQ1O14mRGtmbXlNLVc1PGAwN1ZOPFB5aEl1PT0pbVQpfnNTVD45WkVtYEFXISFnTFlOZj5wMnhYPnx7CitOX3pkNUphT01KJU98JVdaKjI/TjlrPSRCe25lezZ8SlEwd35vZ2lJZiU1JEY1VCV1QExmbCRafERuYTh3amNVIWNKeEVSUkdHZUx0bmoyCis9aUtObXhKUE9qdHs7eTc8aXFjRCFgeyEkcldpSXhAMzhTbUNFamxTV1EpYGVQZVZGKH5uT1hAZ0lTfjFjZGhAMTs8d2otSlIjTUYjJDlTCis3KmlGZWlHMndUazFCI3d3PSo+PnFgK0RTM0UrNHZyeHUpOClHbVRPMyleVTQ0OEV0anIkZmcwJHtscVZITHlAZFNiJmhUdXlkZ3pPVTkqCit4TkFiSXcpJD8/IXxIRVJ+KDsrN1FHN1cjcnFJdChkKXhYSDc3Rl95Jn0jTDAqaU9nRDh6emR4NTJ+ZEk/bXc+elB6UG57NXdHQntlS2FwCit0QUN4T2IzZ2luYmRMQlJhJiZQeWBoIz08YEJSZUs1X0Z5c080M0RhIz9DS0xPOUtRSDAwMDA4MFB+ZD1NfnM0K3dHfGx2MEl6S1QwMyFlCitaMEJ+dD1GSkU/TFplKHdBRkt9VUZZaGg8O1pmN3JaYUFqakBXQCUrfGIxcmFzP0xCTEErZVZWI14oJGEldDR1MDFCS3p7P2JmejR8YXJSCitWfmxUKCZBdH1SKjc0IzUkTDJtfX1hNnZiSDFaQCslYjA2aGJNcTctTHluKz5heWh+U3s3cj45QGotUDczKFVTXkFSOSMzYXdATkVDLTdzCisxekFzKipgP1N9cmR5JWJuZXctUWUzZShyS1k1ITdgb2JKU2I7Nkk5akwoeyRxWF8ySCkkdmhfZl8hN1ZaYXE5TUNnQV4jPWIxNVoyaTtuCis1JVY9V0BXR31HPVBZVTs0KTVocGw+MypEMSRmK3FITWxNVndGWlpTakZYeHJaR1Q1MFAlTU5BeyY8cU1rXlM8Zk56Jl9UJVpgP1N5P1UpCitLTDMyUlQ3YC1iNFlQZHVkQlRIPSYlWnI+YFJlNUspZX1JTGhXezsxYldzR2t7JUlOS3UqfnJ+UHolNSVRZShne1FMNy0hMTJ4U3h7OG5hCismPm5lfVNJR3FsSUJEKllDRCVTdkk1KktBMmtDJnhHRDJvfWFSfUtKRHNXaip2b2QoQ0p6Mkt7KCk4b0Ayejw3ODNfUDx+TT9RUVZ4PSpeCitwPmxlZnBPUEpgRVBmfHN2UHpDTTA/e1EzbUdlRz9wPXs1fC1lPENDdzRmZCg/Y0gyUCtkQm1SSjdqM20/KHF9UXB8NGchfU1CVUNKTzZrCitvOz50U2ctXilsPik1Pnt7bjNFR0ptI2Q+JDlMa3AtWVAwVnFqNGs0c2gzbGc2VUxveSRDJTJOeEhZJVd8M1Bpd200VCVnYUVHaSE2YjRVCitod3hKRWQ0cjB1KXw9SCQ3dTtLcSE5dyQqe1ItJD80Ul5vbUwtTEs1U0tjNDlzcyN7PUl7Y1VNd05ENnE7RVJDREF4O0o0Mmc+Xz1ESmktCitxS2QtMmFjdm1ZeWtZb3U3PHtYekRxMkB4N2ItN2NtS31PRUk4THVzNT5ITjxiVU4+VXVhYyNIbUZIUExJTUBsYCk5ZHg8emVmTz4yVXxoCit8JHlOJU9KcD1MJGtAQG8/Q30hQ2JMQGR7ck5ZRV8hPyR2an03aG1qJDYofkZMU0V8dFV0blB5UEsocH1adEMjLV40fjhIWEtrQkYpMDZHCitOWk9aKllHcTBDaU8hWWl8RUxlRDRxNjd+eG9VdElKSG9tPzk5PHI0N29NI0Z9fW1KYEYySWJlemByYy03R21POXwqM05fJTlEe1hLSGdTCitZVG8xPEleLXRRe2NOK0tPJXNCUTZvNiZfUVU2I21yUE8raW89fnpfR3pLWmt+fmMmUENpODM7bVA5MGsjNkFAPWpGN3p8azZYS3QmWjR6Cit8fkJYTkNSJUREdj5fckQpVWdSZkhBNTdFQylVTSheNGgoI3ladSVGVjtBR0U2ZipwMkZqXmlTR2RGVXhkdjF+cEtyN0U5KlhleDZaPzlnCithQUIoJUVSMWtjTnNfSkQzWH4yYit2VCszRCRvZkZVNHE4eSNCfDZFKm4jaz1FYE5KJEh9RksxckQkSSpzLVMhNEwlRD59TnRTbHV7PFNYCitBZlRWekIlKSZoZEt+RCg/OGJBWFp1dGlNPFd8WlhicF9xZEUwTXBmWT00aD9BI2BVZWJMU20tWG8yWld2UUw9bW5JNFF0Njc8dT9GU2VZCit6TSlASUNWN0R1eFI3O2VOSmkqcShCIyVhQ2Y4alhLKG9UOU91ZksxZWktIVRKTCNiMk9BczRAZEFONU99V0ozXzRFRyVoUV9NaWZUOS1iCitUdklSVDwzeTNAUEE/VHU9MjR1KDhVY1Nzen4/UjBDbU9rdDFuKntXXllmNkAhPTJ1I34tSC15OXdVazNafnhlQjI4YDB8T2tNVjZhbmpGCis1IVNyMGluSiMyVGRESl5LN34zX3c0ZH1nQW5jaHFDWGdSND5vNE1aTEY5WXllMHNzbituWV82VUwmY2gmKSQ4UmN7STY3ZyZpTEMkPFV8CitZMTRZYTtLdCY7OXNJRVdERjBYITVvWilYNTFkekYqUDFCN25zOU4qM0M+YGh6Jjs4fDUla0dQbitDbi11en4jI1BYVTFzJnByK2dEPVp2CisxSm1VcWlefkRBSm04djxJOCtWZ25IK2IjdFc1QmJxS150NWJpeDs1djtifjJqeV8lSUE4MHtXfDBmSW1GSjZfeWk8YmxOQztpZzUyMmJlCit6bkkmfVFlZmgjVSR6SUdxcmhoRDQxKDJ8YSF4alNsKE99QEFfTDdHKmFXYVRsTzRmR3NMd3dfZEBiWWNYJDEkUEdyNUJxa2dKfUlSbms5Citjd1hSbmx+VzMtVHZUSGA0U2A3ZnErU3RjLSZ0P1ZgISlGaWUlRDluc15uNmRkQ35pZD8tP1RiaT9NYVh5ZUQ1b0oxJF5vM0VjKjF6Rno/CitvTjZYeHdhPip6SVhDNmUrKWU4Km1LKjZrN29BJGZ4anM4eW1IR3R4NnZVPmxPIzJEJi1UeHxWOTNSODFvNTtKIzBLeHgwbjshVnpzfUtZCit2cjlCYTNaKFNfRTNyaDZydnQmdFRjan5IbD4yJi15UzQ5I3lkcDZ+elheYFc8Sng7LXN+ayReXjZWTnljaUcyWHZ1YGI+MlhLT25wVHN8CitGYzNXWDtSWWtYOFd7K0ZSSDZYK2FJTlJnc25Zentqb0ktYVlGUWE4aUMoZUtUcXhVU19AMVh9TWU1QXdDdiEzdj1hOSpwaEpPTEFRWmxUCisqc2l7b34mVHdzV1U7eVJLJXpHb19jRj1kQWEpRmRPSkhFPGp0OzB+dWFCIWQ2WWBocUNWcWgod1FVYGFOT0JSJllnYlhEOTFrMXZ2bTljCis+UyozKiRtP0NeX1RpM31qenZSaCE/YXF8bE51TV5PbnJHJnQ7JmpFKjkjLVFvZ3BmTClxTXZKcnhmTHlDWVVKXkk9WV4hZDx7Kz1kUGc/CitZQlhuI2VwN0hZVjIxV1l1MiQmQ0xrOWhMaj9QckxRYkJ2cFBrbjx4PzE3RXAoaDZQNHFSNGcyJHBwaSotM254RlpELTw9QWUofVVfdm9TCitpa08jaHM9Q0lyUG08NmNrZ2hRLXNPeXMjP2xIYHpRakYmY2FDRz0wSC01O0FxJGk8UlV8I2M4ZVVrR2VBSS0oJnFQOEVjYV4+IVdVYGJjCitheHhqfE8tcm0ofSZ+eS1YZ0pVbz8lZTsmMGhxUHBucE9yUjI1SyFmJFlFWUIzZkRfdypJIUJ9TUpxRHJ7Ylg8djl3PEpMQzkwKERpK3lHCitFdSo9WStiK0Ile3QzM0JAaFR1e0pVdkA0JkQ3d3BIJVpDYFFfQWxXI213MitWWSk/P21LRWZ6WVJHITF7ZnZSNTFyWEtgamBiKlQ+WCpECis0WWZIUndzNXdtezt1b3YlNzZme2RJeSozJWRSPTFxRGJhb1pQRU9EVCM/X1lse0VWUlROaTYtT1hvKlJRcGV0cUJYNGhKVVNUdnhseCk8CitIMlRMWF83JEJTUTNYO15uZlp2NGs4KHxDVmpgRGteO25VbFZHYFVySWMqSkRoN3N9MHVSciRuaD15cVc7KyE9JlN3Y2pWSGJiYlUwUWtxCitmNSskK2xBMGgzOH1acnp3Kl82UUZiaFJQVkIyeVhxNzhgP1U3dkd2OEIrUzhgcztuTVNOK3w4QCFmTilgVmFlfihlMHpyP2VvIz9BXmlMCitIYTRfaDYkS1pWRUVhfmlyX3I+YGg1ZEVERmVxMHRONWFZMGJJbUlCVVJ4e3Z+VnhjMTdgNTV6UlBKfmM9YzNEQzc1fjUyX015Km9iS3VkCitLI2VVYVRDR1lha1MpSHF1ckQ9fTh9cDB9Xn1GRVNLWEFOK3loLUBraEUpJDd3JiE3WTl7e19EeD5IP0xrRW94YjhSZ1NKM2U0UWV6M2QpCitBfXl2SDtxOU0yfl48RSpke1FyPUt0eGMhM15IYkhFYERuQzJRKVpPNTRCNGgtalF8N0cqeiQ0YDJvYXktPHxRPE84Ums2ez0pJD50LUtMCis2VDMzdzA0NmRvTjx0Q0Z0eCltJEw1aGk0OGVkdnQwREdkRV9TTUZ6YUJRLXFrQiYwQHhhMy1lU1hoTG58JEBLY0BIMUQqYXQ1MjtqNFYkCitgWmk5dUwkakc9eld2ZTgtb0xhV0Bud31+NHArSGE2IT1TcEVJd0syJHJrN30xPEBKWkV7NHZUI2R+PCFPX1V1bSV3U2xWd0JOJit7Vzd9CitzPj19Rj8yP2YkPSRORGVZb2FWUTlENDFZVXYwTWtXUVlXWEYzPnNKK1R8e2J1LVUtQDBfS0NwblhhTlN0SnsqM2RCM2w8PWpIU3N0VFVDCitncURYWH1jYWIqWVdWVWpmNng/UmQ/dnh8ZTw0WXJUSFYkOGRsPzdlbEl6JjdITCRgeHlLRlR0JVVeanlKOHFoUEtUNjw/NWQ4SnFOWndSCit9QEo2MldPZ09AJGoqMH47QH5kP3Jlaz10THAkeiNDZHFuJFY/SWI1O0VwJnF1Z24yPDB7QXd3T1MrUWx6bUo0RkhsZz84bXEkZ3hXcDVsCisrTUVoIWVTMyojYVUwdiNLQndTcTlZTDhWYzJNa3ZiJEZJdFo9Jn1DLXpnMlRoaFdePjxIe0lmJGglT2NUS1dMd0sxWSR3OEJLT3RaeX5KCit3NChMMURJIyUrZW1mQXBwITloUXEjQjFwMU4ocyVNSmk7bD4yIT1uWTNTTnlra1d3KiUtZThVWGkqKjhgMExKQUpBVkQ1V3p2SlF7VWByCis8e0BKNiEzcHVHP1dGbD45S1JndVBjXn5xaGdGUERFYjtnOHx7LWVPMGt+YG1fZDdmT241Nl8jfTU9P2JGekt3NDQ9dkYwKjhHTztEeCY/CitzdiZ2bVI8JkdZNzY1TlJuKlk3SlZjKXhNc3JDXnMkJFVWTElHYzhlcnVaMklgI0V1ZWp5NTZtT1JyTVUoYHJpSVYyKVhyIXpFWT8jVnFiCit1T21ZZGxMNiQ1LXhRNkhieztJZ2JqUVBJKnw0PXVtWl4wKyR8diZERTlXJEpxakZpJlRzRFpJZTsrK15pMX1hI3ZiJi03YUIhMk5tQ2NjCitCWT5FWX10QE9SWmoqOFpuczBlQHBJZXlebkxoI2tDYjNWeWtlYn0+SU14XmNxZDt4T2xOVTlUdWtLKilfQHBLMnhQa3FrTyhDZT1TPD5oCitULXMxdjNwNSpsRSVYI0tRU0V4PTdnd25TOWZxVUB0S1V0dGVDRGghPSliZChqXkh5Z3t9e1Z+NE5eZ2l3RVRQTTlzbCFCKG5CcFU/LXVTCisyKHRVcGNJcylnOHYmRlRjQn1hb1R6Nnkldm07JHhIQTFtfWMrYTsmVlo8dTdFXzBsNnNPdSp9Rm5gRyQ8ezVtU089fFpGK1ZWdkt2U2VqCitfdFdxaXtEamxffkZfTi0xU1NfUyhOeVkqN00kKGJXYnExZ2VjaC0wRUc7fk9IdUpgJSE8QXFRdiRaWkl5NEVKM2wlJHNEWT0xfjx2bCRKCitXRHl6MD17SlBScE9sPEleZFJlYGRoKTdtNjt7KT42Z318N0MpaTIzdnh5QF5NX3xEcXAqUyZNJio3R3RGUjhPXmh2S0Z9dU9iK1M5MFY3CitBQkVfTjFGSXJDRSgxVUxvJHhqcytScTVNNlQjKWdsQkloYkolZ2dGQHw0OCYlJFQ7TyNsSXZiJT45TEJsITI4SWt3QUUwMTN4ZF5xQXhuCitjd0lXNTdkOTViUjtQLSg3czM7MTFBLWJuRS19RmZHYFpHQU5XTEdSaUNNa3RBVF5nJnomZGJKOCYxZn1OVXA3STshdEx0LVdsQ29wVzcrCitjZmJTKmZNc21oSG1DPStUaml7Qm4jRDFEJHU5RE9OUWRAeyNRS2R0VERKWVN4dFNQZ2wmdyhsPXhiaVdPWjxTVUA7aWpqYFcpTVdJN3h1Cit5KnZwOTlANk8qe2BEaS1sbVR7YTB6dXQlJHo2Q3JiNlNNJXtpMXZkdzFAWE8jUEVKfkdeMXMtbnRKelFuNFVIZ2lVSiM0JTAwJTNYc3VPCis4QlZEdUYyJDs5WVJVdnBMZThjeU07YDxtdElrWG84QUlsWm8mYzVFJk1WbDR+WShPM3BCNXZOP3EyKUFsblk/cTA3XnJQZ21MZjxTI1U9Cit5eWFsZVhfS0BLV2U8c1NsRUtKZCNJSWRnWDwmJkJ1ZHVuO2k/dkBeR1BSM01MRndQUmN+VkgwSzVfYzNDK0Ymb3hDdmNGOEc3NmpuJWNSCiswQ1Ekel5hKUZvbmchXmtyVzcyQExyeGRUUkxVMjxxUFg8bk8pfFBsMlkkZHhZckdgcTlwbFhUVH1vQiEwbmIhbHgzQyo5KTNiQW03ezFaCistPzMoWUdmc1QoOClETGozP09kVVo7TT9IcTc3TzteeHl5Z1JmPDFWeCVYYm8wNEp3cW08aWYkQXYxQlpXKHJNP1MqQD5yM1M5OCMlSS1PCishYnFeUzc3TT1gVT5mNkJYaHJBdTA1WWkqZWNhd01BOzReLTxPY3g2bVkwKkcmQzJZQGM/b3BYUVAtPVY9O2wzayhATGxJQU8hT0A8ZEhHCityclZMZFRVYypkN2l1UjsyTFlGPTNqRklyUjV1cChhaWUkUWUtVW11NzdTSXQoZWkkdjZ8IW5eWnhaJUVHQGsrNCNQaD1CbUxTYCNVcXFHCisjOHxwVTwwNCk0RChlYkpxQCRUJkBoRmVzeWo3cGQjSThrWW9COHFifmlhSihwVTZTXkt8U3wrXiRfYjRId0hYaC1DQSFmUz5mT058bz1TCit0ezsmNjwpU0xpNT14IWxWdD8rNyY4TnhAd3tYeHN1PXM/QDskTWZ6ZVhfP2IwX1BPaSs5Y3wqTzd+IXVue145VVMkOytPI1BJfDlNeDNvCitxdEE1JW5yaHYjeU1eXn43KDBZPy1mbGo1eztaKlk0KDlsKFNDcSRWaXJ4WkRfdHUmVFE1djlYcWBXSj87PFp8aXw8Um44eXE7SjV1MkZuCit6azVXSElrQnhxRG5kQzdTQWJHczdSd15pfDwzRnFLcSQ7bUw5ZEklR24jWER3KEY2dWcxUX5JJX0ze2Q0PVJPYlJ+IUVDJiV4OylqZSVPCitZY0QxSVR0Uz08dClKZTFwISNzanRJbjcoRC12QFRzWnE2WSMxVllYU1RtZmA3Znc9TSs7MlhuKSRMcDlUJWBsM3J8OUJ9P1Yhe0NlT2sqCitFViVJaEpqWUwyQjtWJXFxQEkjVU87SlY9Jj4jT25gUnw+QVFeMlopKTc7aCpfPnVPKmM+Z2cwTV9MQ1lWYVBjZjNOMHRjZ3hNMCktbVkyCit2VFY8U1lnQTVDVmRTc1RnTVV+SldFVDBhcUokM3JBMUVPPmZwNGpXMWRPKH4/eFRoVEN7ez5ed0wpXiMoMCsoaHdkPGowe00hYWExVjMtCittTURAP1ZwREtFbG5veno9YUZhPUsoaShuNlBETmc0YjZyOVlgMzUheD1ybz9aSWkoYHlXWE1TY3J9Qmt2R31KMytHe243ektaeHBYUlR1Citacy1VMWUjUVNZYXs5c09MemZWWCF+e1MkVkdfckNIeihWOHZ7PDZITE8xRnFRRl5Ifio1KEtqWlg7TUJWN3ZUNzNJVClKP29vXzdOe19NCit7V3dKPz85eSs+Mj0mdVUpcSkkY35HREpsRDViYzc9SS15aWo4VWI5TDAxIT5WcHtVYF9RPnEjS0xheHRVZmFBKngjZF4+Rnt5MzBlVWBECis1KXxsT3pWWVAmX2h2aFQ7R2U3XnJfMy0oJT1qdWRfJjRoM0BMcHZxP0V7eigrVEpQKEgmI249ME0zNzBnYXQ4MD5JUUZDTjw9e1dxZCRoCitgQyRmWStqRVgqanJBcVBzVENtWi18JnpLIV88ZmAoYXhJUk9+RjM9KVlMRzRROGNYP042OEVBTSVCIyojYndqT0hadHhOX1YzQ1hlJEdrCitBRStVTyh4dEQ0O2BMbHZtWWwjO1JnPVlLQkYwMVpiYUZEQzVvSGcoTCZeUEpDZSplWFImNSNidnYlbURKNUA5IzI9Yz8+bjd0NXNOM3Y+Cis3IzZAa3JuKnhseSRkWkZCRCtlcEpmKDYtWHglYlNBZ1pFWkFZO3QpSjh5ekNAO1NRUCFpcmNqbzcmcz50S1hFTTlPS2lpZWRmTFdxMSFOCitzRWZaKVAzJWdvJEZGXkF7cTx1KTBDRzh+anlzVkFsYDFYM3BLVyFoPm0xcjFWUSR3eHYkMit5RWFeb2w8YD1CblNnVDApZj4tIVNSQV5ACitLIUZTKm0/ITw8UDV7MV4tcUk/XktLMDdhUGI/Qkh5OWtKZyp9JFF7IURCI0xDaFB8aCZtbmh2YCtuO180YSRgITUobmJPQEFNVzx4RiQ3CitlP0FERjFUTD1sYUE1UCZLRjtAPiRefmo+XjUhMm5EUjclN3MtU3hON3RLX2hfVil5M01WX21EdFIhbmFuT2AxJXM+fTl2SXZ0JkoqdEZpCismS2daQGRLKH58SUlSKiNwRCRvaSYpTn5TMDsla2deaV5FR3dTN2MySmxrV3AjIUBVfEZ3VyU9PiVzcTV0cGEyNzhqP1hJdFJ+SnliWEhWCitsNWZZPXRjPmtaZFJxWUBLMlUhJXV7eSNhWUZjST4leUppZzs8X2k5Q2F6ZC11cWl0cWtYTDNXJU1ieDk4JUl2cW1FeUplU1BvRzd1Wl8kCithTFd5TGxwPSVQNjJIMFROdDJyV0Zhb2lqezVBOWZXfn5BYURLcDIxTnk3OzNnLXhaVikxJWBkMUFsWTxVVnNYPCpUKFJYVmkqTTM+N3ZgCismcDt0bH5SSUtVN05idT5ndW85e21SJEU/ZExhPFk3RCVrO1N0UiZFR0BVbDxON1JndEkpVEZlZEhVKS10fkNfNDZFfVNVNkMzSXJheWRsCitCdUNqMENMZjs0SGM1NVVCZ0E/OF9DYFpmIyF6NT5hbCZBdk5ZfWdXXmt9KFB6b1d1PTZGQlhZYj8zMi1jcFUwQFpGbn5IJlhLUih1WDllCitWOWxYZzAlXl9gNEJjPHQ5dyVqU2k9NjVqPmJ4U35qSFNjWTg2Y3AmVlYkdVpTbDVRZyhaJFJUN0NeWE5mY1ZJQVRMO0RqPCo2QEktMGJTCitqaHdPT3spZCYhcD94Y29+eSV3UTdMYyUmZ1phYT5le3tDaURzYz5PLWRCek5mayp3aEppZktVazZDK3NHK3dRTXpeYzNjO3s2Rk89aXA1CitacVotJHF9aCFze21IU2QzNURQVkM9fHNFQGpkM2hzUVR7aCllfjQpY0xOZGdxST1aRkEka2RIK2JCeStudC1KV1IqWV9MeUVVJm5DdU90Cis7MmFUbCU8Tm9SO2Eqe2R1antIMXB8SEpjOzJ5VHcxZyQ+Umx8K2lfcEFFRSRQc0FwQlhBTVBNO2kpWVVXbEAwZm1HTUdDbUdVSm55c3FOCitOMWA4IThgcGMlPkI4QkJNNz9fKis/UDUqPyReailEXiR+X2VHTW5SeGJjckA3JU85JWpURFYraDJ5K0QkMURRXzc2QkB3MldWRE8+VyNvCitQSzxGM0pKIzJUV3tAQE1SV1dvbEkxR1hQbGNsV2FAU0s4blVwe2FRMEV0fndBJlN4QnF5c09wTzxEOG0hTS0tWnRRdG9zeWR1JHBrblVNCitrPGliZDR+OUh1UGVYcWwrb0d+ZnlfcTJ6QDlAZUc5NWV5fCtjJWFLU3VPZU5TP2d9S2A3XnBVTjU1NEg0RWA+cCFmeT0kbyZXVUA+dHdgCis7cGp4ZEswNDJUN0opQGM8Yz9YaDx5bVVqZFJlKlE4QD5XVjFIem9sRl8mNmlIcG5yfnQ/OVdrbU5pS2VvK2ZhWmRJeXUzOGtxeCtIMiZvCit9MmpDUm9+YzBzbmlGWWFUWW5YcihGNSpHKzAkPitPaDJDakN2ciQ9Rj18IUBQflRGQUMzJFJISTlOPXdqdmUqQnYhVDtBQXFvOSN4UTFoCit4Tm9YV2U5M1YtQTdhcUkoR2hSRXRvbDF0YEMkMGgqZ1JtdCVAUSh5enU0fG05P1pMYzx5fiZ1SEZ7Wk85MkBQZk8tam5gKEJfYlEkPn5LCitIKmRPcSRWaVY5fSZsbHl8VWErZjhLIWZEZWcrVjFOd0p1eW1aeVNGfT5rcjt9SlZvfThWeilaT0R1Mk1uSiZVK0gpenpBdkZAIWRZO2x+CitJYio0Xig8eShqNnN6MXxhIXEzPXxBKXdhfTIjbzlkWE5hJFVRLW5HUXg3V0NYTzBZam1IcEo2KkAlRTs2TChKY1gkMVY8LWQyV3A8QlF6Cit2Nmd1aHdWWXJoblB1UVEwdTMkNzlYZFczPmlPamZSSGYrSWJFQ2NNaF5jcEJMfkhvO3RxVTs8JD0+O3w/TyppJTc8S1d4dHd7bDk1Qkk8Cit7JTsoUWsodV5qIy1rV0spRSptMk1Lcn5Sbm0+R04wWGdzaDNxPnIhQm5UUE5ZUSt0OERRWW9ERmw2WD9ycU5JUE1kWkVaM2VOdVF6Y3tYCis3MCNnTDNCVjNoSEl+SmZhfmhRcGxhWGpMIW1zbmk/NUVLYFErajlxO09fUV40S042eHRAKj9ePylEU09zIytmdDlWWiFjbWVJQykqXnxsCitaK3F0UG5uKkU+fGgqTyMydTk0KVpjQHNhXmVXe3lyOG4mZWhwQjhXYCQrZW9TblVDOzxoYTQ/MFhxZEopdCEqaldtY0ZURj1pTSFKMXQyCittWmhWUj00O2l0MSU9WTZAdlBVWEp1Mz5CcVBPcytJRGo7SDc7PFNHcWUlJStYSTY7LSMmcjc2MFFAQWBRSE5zamkwbUcmMFhXOzJFIyt3CithU1Z1K3lmMz9XODtaMlQpNGAxUVktTzAwO297bEA+P24xe0VHZzRnZGhIRSZ1PV4wMDAxUlg+YyFKYzRjbTRaKm5oaVZQazd5WEs4THtGCitMcV5lYjdebUdFXnY5fVQ1V1VOSFdMMT5VeENzJDZTMHZRSkkmcC16QnM5eXhJTkVoOUZPZyQoe1gkJUxfcmQyaWVOIz92UXppSi0/TW4zCisydlR5S0hzNE5AaTZ2dDNWQmZJVlUydSFOUXBLJjcoXjx1eT8oOUJldVR7Pm9GKn5ha2xTJFJ2PlRSKCVHOEs2IyMleiZ+Zz1XPUV1IURsCis5X35TK2Y/NDhpMVI1XlFePzY1dSZMfmJhR3t7QDZ3d1AxNjglV19xKk1KV0l3T0UhXzJWQiNoZk1hNSohUVorOSEkQDVnT3JMMU9WODMmCitSODslNWg7TWltRCYyWXJFR2xPYFNHbWY9fWQ2PzsjZkVTSmxLOCU3aFFyJXk2VlI2Y29nXnk9e1Y+fkleKjh1QjBXT3EzPGw7PHRzPTVPCitafFBjbVpCZ0pfM2dzVW94Y2BwSzVgek4pZk0xRWkwSyUyZHE/K1lSUjwjJTI8fF9tWkw9I0Q5VXBOZDdBYEs3MCszOGFLP18jQktGPEUrCiswb2VtNyhYNEl8TkhIYT1qXkEwKTY7fEZeUHxIdl9WJCMkZFZCbyg9PXx2SUZAQWx8NHZ2M2p8MmFCLUp6eFRBIVpQQmYoOE5FT2wlenMyCitDVmlhPTVpbEBPbVo3b2BzaHIzWmFePSRucDkoZnIqRnh0SWhaUkU0V2w0ckMhUUwxc25WaWR0U0xSN2FzSDhYMVlSLW5rJClafGxGJnh0CitSTj5ffUpOfGl5KnE1VkM4PSt9fjkyZHZPQ3VQYEFgM0FFUjlHZzZnaCFhT1NkQlV1U3VEVjVhXnBrPSNZR0szLSpEWG0laEM2RHJuJXc9Citgaz4tQzAxb0BIUVdwSSE3QUsyZ0NuOUM1JVI9Y1YtWmpoT1FFdyg7Tzd6dmhgN0g9ZXZaSlV4VGJoYklUOz1aQn1xUVNYdyN5e0dSdGN9Cit7WFo3dnBNQ1dUSjFeOU0oWVFfZUNUTW1DZ3VPaSVmOUsmc2JkM0FER1lsUURzR2NHbk1pengqWVVrdFR6QERYODctNFRmbGhGRSlZZkw/CisrSnw9cWZGKHMkZUUqSjxaN0BldE8maDlRQFFzUiZpMnhibSp3NnNqPkJLRHJHQUFSMjJNMnowdiZsV0hXcjEqI3tgYUw8WWRqLXZOVHduCis4STdgJiF4USVHKi1reGQqMm9PRGYwaEk/UnI9Tm5OZ3YwKDxEJUFyOEYjQFdHK2skRUFqUyV5KkUzP2FYN31JbVkjfFB7Uj1UQz4wfDtoCitHWWV8K0lRQX1aOTNARURVbDllO0gkVmxUOCs5fUc1ejdvJGJJe1hlVTtGcStEI2QzeT5FSXU2MGNzVXltYD0hVnhhWXJIPUcoKllvTzVECitjSGQwRkxWNFZXVChjUEhDPDZtMWM9YGk1d0xVQCN3eklWJi0xa0NwNT5RejVHT0VVNWJ9U249RUVmWmNEeVBDcEJgRkZMVEZNWVMobHNRCitHN01fS095P3AxSmAlVX5eSDspVlEkI2J9eWFDMitlc30oYUchNG85QH01WiFtU05zdntnV1ZsSHg9WFQzSmhjQnokKkl2JXtneD9LP04lCisre2d9OVpfVmp3UkdLSyVkVD09MldHXitGaXh6OXVzakhjSHU/PEhkNFVLMFYxOGc2QVpeQCkhS34mYUVzRCp2cVVXS3x6d2k3SnpsYWk/CismVTBTJVg9PE8/SDxNJD4lZVJHQUlHUzt8YDkrR3cyPGdlZzhTNWc5cGxlVV9TOCZXPndFXkgqPHpteDNTcV5kUnh3Q00/e09AXkktVjE7CitPXkZhdGJaKlY3ISomYmpIblRRdGYyUTNuTUJLXyZEcXlHRXhWfEs/YmAxWGZPYHRtLXhXN3shS1hPSlE8YDBubDVwKmYlMXolWEZPUT9vCiswRWI2eD1aY2I5fFVqTmZCWD5keU9YRFZGdWBaVGcxdmc9Z0MpS31oUW5OKVloPFRWeFNgeE1Xfnh2Vm5SKntIbkArPXxyYV9rRGdHRGRZCit7Wm1pOUU1WXJfc2t1K3dhVjMzNnhBbCloRSh7bkdwQmR2QmJjNUUpYmNjQm5zbjRzJmJeeDNsWXBEPldqVklPWDU0KSo/cyFldiVtbDJwCitJPzh8bnp7d0x2NV8lZiUhTmh7WXJ+dUA7aCM7eVRQYmh+NktMYFFSWXVuVGRLQ3UqSllzSlJiQFhNIzktQkZxdm5fQGM3YTFuPDg7Kj1OCitEYHghM05MMmh1aWt3UTBkNCp+TnFheSkra1hAN1lkUUNMKkI9U1pKMTVPeWlrb0Y1ND4zVz4xdjdvWlJxPjVEOVowfEF6T184dkpQNyh6Cisha2JoO2puMFNwemM4LUhYcjJfVVNScCV6I0xTNGYlTj1KNFFjMjFTbzU7fGRHR05KN0NTXiVWMlI1cjExIy1AUlRUaDFpZEw0czJuOHB5CisqX2ZZRklEMkc+fFlQRHhuYyRrbVpSUmFBKnhTZVA4JVY8Qk8zOFV1WT5zTTYrMVJ7VldQPz00fU5FPlh3TE8oOWtCRGBjQ2Q2ZXpCeWFNCis0bU5iU2xhdSpjeSUxc3BfRWVNPiN4TUp3a3lxUnorcDxRSmNlfVBgdSgoJTQ7KEAocD13S1pwO1J3VEg+PDEhYDV2QHBWNE0mRFJlJiRQCitnfj1YUCNnJVUjX2h4RDs8a0AjRi1KajBRSzQyOVRaS3ZwS01mezBSSFNVKT1SIWRHej1EfUBsMkFvcHpGbGwlenRJbDsodUpQeHlqdVJHCitQKHtENyoja34xJjFGVjxgeWpMYHR6ODdGWld1c0lJMVRqY19wMVI1UTBgfUskOT5sRHd3NXBaNVhDenhsKWVwNk8maSgqJkhRcWNkfkhOCis3SCpvQnM/MHFmWjE0M2dMV3d2Ujc8WT1hfXReWjlHTypTK1BWPHFvRncmb2ZUJV5XVFlIdjwlbUNiMVhFWkAkdTJ6RlRIP0k+QHhadyg3CitNQ08qKVcjKFEqQ0t7T1B9M0RGRU81RkhmRXVtUzBAI1k9M2s0SVF9QWp4ejJYQXJCPjB3QkFoJlQ/JkpWfmA5NSkyVSZpWVl5ISh9Nk84CitZeSZmX0p7U1haYTJtPShpblNWQWhONjtycnpCVyQ/YDU1Mz83MmVtQTtIP3tzPStnN0Y7JTwyd3g5eCNLakI5fUpkenl7KDJEVWt3I2ZpCistKmV1a3dETVokcHA9QWQlJDc3PmxZNHJ5PXpiRGM+NmtPbiFHfGteeWR6JHhZT35jUHRUdXJSWUlTNWxZKT8kZTNII1V6ZzluKyVtak1LCitnI1JDQVJVK1NQKSExKk1fbTdGIzxnNzAheEFWPyNWZTJRQDFORGE1dk1IYFZxazdGTXs9VWl1JEk/e1h0VnU1RXFvZT02RkhPU0gtdXNVCisraE1+Vz96TDZvV1ElKXFKXztLe1pAIVFrR1J8a31XVEluOE1EczhjTSlXTSthZyg4K2VEcVpCSUp8JiVPaClqaFBJOHAwKUN7RTBvWS08Cis3fFQyY3pHKF48RkRhKyNvKyh5QVN+IzFnSEJpfEBSN1g3PD00NmgpOGZuI2tpZiF1JUZIdENTWSoqdyltVlI+KXYxJnBzTV5nWldBQUQkCisjZjdgVD5oM1F0bT9xZVp6azspb019blVIMn1JTnd7P2JDYXEqVWdIVC1TQEI4LUhBeHMmWWdGc1VENVd4N1JWQyp0O3F8ST8wcTlKaFl5CitObnxmNzRvfmZlQ3VyTTBOTzspczBGcmBEc05NQElZNlpOYjFhdyRePkgzLWpEJDkhcWN0Tj5LZiloXnpASzh6I0Z+JENYRnwrSkk1NDUyCis9N0UwSEVDZzcjI29NJVM7TjNybiskMH4he0hTNEo2TDZFWGp8MyYrd2dAVmZyYn4kUjlTJkQlMWwkRVhBaDl7bUpwfDR0PzwwWk4rJmNgCitqLThULUUtWnlOdClLU3Jjbms9OHZVYiZ+JChANmRzPH5hPHFETVctZGlsdlUrUDhqYHk8VExfalUofTRQMFNNI1c+NHgreCM3dl4oUzAhCiteSjsqQVk4SHh6MnQrQklDQFdLQi1pa3FxWGhgaXI3Rl4+KiRQPz9JZFp1Zit1JTxeZ09fdmhfZWQzXjg9UUxEZSpSdjNuVkVAbWlvTFJzCit8YCNsZTJWfnB+VTgpeW51RXlEO1ZyPkB9YC0zYmQyQk8jYnpvRzxFOWhycVFfMCU5X1VNRSNhMT5PY2U9c2U4PTk1WnIjM2JIdUpzNHg8Cis3bUtrPEJPZmtLaHhwLWY3I2NjcjJuPDhUO0pTcV9sZiV9TG9eaXlZWTt5bkAhRVRYa2ZkZUktSHBiNE5WfEJYUk15PjdsdUxBQCZSXjsoCit1VVV2RCNiSmxHbTRldXgxOFJrZz5SVFNEJk9VRXU9c3lXK2w5dGxsd3JrVFY3QDV3WHghK0hicXdnXkQ0big3cGMyfV9gTE5+eG5eVFBJCitENUVAWGxzOG4pbCZ6V35EV1IoUEl5V3ghak5IPSk2Rj9mRzM8VFdRKCYqVFNVQFlhYl94O31+MiU9RSFuJUl6eCVeTG5sJjFmS29rYCg/CitjaWlZVjF3dSUqKUQoclk4YnRlbGRodkplXmRwR0BYJnU5K01teX40MFVnVGt0cjB2cDZqJChEZlEyPUc4I04jSV9QYUJ2dD4zciRMJTIoCiszakUlbzdGYl5DSW9EJGgwVjBVOGBFK2gpNEIrJGlqKSMpen48MXcwPDVXeVFwcyNuaW1ZMG59QnFCNTBiV1RDRnNyNSY2XjZIREMwZXgzCitMV1I9LXBSPWUtRT1CNz9QJHlBO2hUJU9hcFI/SnQ9cEZoeFQ3QWg1bFRFYU0wa0dLO3hAMmcjTjU3TmdueF5ZIVdQLUotYUV9KzRKJlcrCitpcj11bE5UdnpmTz9JfC08RjFRLWcxfmVvKVhlKmJyNj8kdVNHbyopMFhuKlBwQTVHenFqdU5gc3M/KyRoQSQkVl5ERm8tX3BmK2xAKE1+CitCck85cW1FayNEUjBaPWg5U2t+MmlLTFA+OFNsSERQcTAkVU1ySGxYVHZqLTx8O3tfTjBGJiVCVWNiailXaTdkeCppckRULVc3NSY4QT9yCitXa2Vib2xOeGtKTExxRkRgQ3dZZl5pd1F6bVdMYzRaZ09nKjV3YUtNX0hndWp1R0VRUHkzcUMoMyVnajt7bTM9cDBRPk5IYEs/aztTWCFOCitJaiE7ST1WN1BTfXxPJXAqfEtPSy1GV3ExIU4lTnk4Y3JBT2xCX2E8ejFMVX1lMDVUalo2QDlKbDUkcGtOM0cyU0pYc2tjYkEoPiM2TmJQCisrRjlnISFrI05UXkliMWN6UmBoZzIrO1p4UiVtfC1QbW5TKlNIMz0jQE9jQnFPOWVseUQlfnUjWUk8dFFpKkRQJCpYWGA/ST4+amFpND9eCit7aWxBKkQ8TV53K2trRnI+Unh1WiorYmZjQWkyfTYpYXc7fDY0V1p3Uzhmd0dkdUh8a2JNTiY8KmlZJElXRGZ4KzhfJVhuIXtsPSFwaiRHCis4MitBc1V7TWAoR2JON0FeZnN3N3AlMD9mMGpjfk16S1U2JXFHX1FfakwlUEJuKV8mJEBJPCZAdD92OFBTRm1GJHA1YXolVmM0UmBQeGRfCitDcndWdFcwbzhgNlB7NlNyZHJXY3VUU0FqRUZJZGdBaW52PmYzTWRsMWtjVEFRSzNKYlBkPXhWVX4hTnhrTUZqd3JgXiRVOElBeT1UNlc8Cit5YylFPSo/bj8kc2BDNU1kdWEhajZqbDNzJDloJVcmZjN7KzFLaVkpJmxoP2gmKCk/PjAtVFJ8WXE7KVg7T1Z3ekt9YVdvZ2xkYXZIMUIpCisyMWRpdVJDczNwekRANXFIa0s9U3Q0QVY5PTFocCN7N19hRW1NfkU2U1pOc3ViSjVQZiQkPX13UEkmRXlHYmVoXyRSTE1PRTJYNVRqd3dkCitYbjh1MG4zS2JrYGZXVCp3I15QR1E+IW0xOWU1ZVkpZ0ZCQ3s3bEApUjgySzZXLV9HPEA/aHJpK0JwdVhMd3o+R0QyKHAhJF4jQkZsfjA+Cit2T1BkMGpwZml5LXFSRnl2PThHRm5KR143MUhIVW0oQjUjUHlgUUNVfU9xJEhjbyR2a0h4T216PDxXMHhodGs3PWZnKlVNR0FLJChJMFo+CitaPTFRWS1PMDA7b3tsQD4+c1JIZXNnWn55P31wOClfUjAwMDFSWD5jIUpjNGNtNFoqbmhpWWlEMF9XcGkoSmEke3c0RkpFNzJaZlNJMVVvCitMUVk8LUtpdDheQDYtYGtsWEc0NlpLIzJeX3NTbj1CTDl0NE9yTmpWMTkmdllpfT8yTihpRmF6YkRSbyZpWH5pTytBcF8xNHxoSnZ8YGhJCitEN1liRV9QIVBuNGFxSD5nd3V4P19SSUJjYXFKbnYmJWZHXlFQTD12cGppemE9ZHBDYFJ3Z0ljYTRmQiQmeThOUzxKRlVhIzFZdVdMQX55Cit0U0l3JmEkQnNnaVZ+aSQ4MXlLcVlTKChOKl9fWGRJLWprcGRZaTFUQDthfEIoajw5Km03NXA1dV9YRCY2Kk8rI2s3YyZabzRzfEZUeEI7CitvTE1Vb0BiQTFLPnNpOXF5IUB0PkQyOWl2dGtFWVg2QH1SOE41MGN2fWN5Tj1+XyFiTlpoZUwxNUoyMXxvZnc4PS01QD89bW5tbm5SbHYtCis0KTkyeWk9KihBe09HQW9QS1cmeXpMdT1aJEokJDRJc21vU3AxZmRMZEh3OGdHcTlfaWoqPU0oeyheU21pODVxdDIpWkI8fE07TEVDQjNXCitBJCR2KEFfMXtic2I2PTlpY0pXUnpzKEpsVH1eMz9SNCVGcVB3VkdSdDV3N0xDQkFtMDErYWYtc2JBc2lWRjByKCh0TDVHPzled3JTU1lHCitDNFVxTnVFN14zaDJ0X2NANUpDOTQ1X1h3V3toaE8+UjI5JS01NTd3JDI4Xz4yejxJdWRrfGt5NE01WitQa08kIWVueD5TI1JvbUdEKFVoCit5X1RJZiluYz5HQztXWUhQa3g2PG5tO1QxUzVjWTIqMk9ZNmY3a1l9Xj4mcnAjeE1fQGhXYVg5JFBjJCFVQlV8NF9SVHU4Jm5gQTRQLVY1CitTNF9EV2hue34wVTlhWXpQPjR2Jkl1azBmeGtFKnRCMCZRSHQ7K2dOV1lPdyQrTSo0QTBpZXxraSZkdjlIbkgzOGx3enxuSjcrNyZ7SV92CishN2BuSndpajhfPytLYE8yU3t8TnkwKjdmI3FGTSpGZCNZY1BqJDYzQndDJiU+RFFDKEx4eDdrbGx3eTxodEArXkd7Vl9nRXQ3dzUmSVNaCitfNTVfJFNGNGhPfkZgKkpzSFg3YzdQUylXRjBoTVJgI3JVbllaUnFhaSRmM1F1dHBLfDVJOTM7ZFYrcU0+aTwxeCVmMVlydztBXm5IWVhBCit2TUZfXjZGRm4pJSg2Q0p2UXFhbVY4MlZmQDVDU3FySDY1PGVnOEd7M2NycmBrUyh0UnI5PCoxYU4+O199PnkrMz5NayllNFp1NlZOI15ACis8NnQ7VXhXZmVEQ1A5Tio4dHZgdiEpOUZKUj18d3w0UG1wTlo7QEZmNFEjdmY+TFpNVipTMmN4e0R8dTlhdDJTQSpUNzZpdXA1eTUwMUM9CitRUUM/SFNBS282bkticE16PyZSZG4reElaK193Xj48Sz4jSzIyT094YCtNe0d1U0xmT0pWaGNjRjwwcyFkS1o/VHI4aEFeLTdtZ1k+TTJXCis7d0g1Ml5QSlo1SFU9JjdOeEg/Un1kaEAwbShSUklqSi1hZTlIJk5xYWpSa2hCYGJwZWJKaHFTO3xBTzx6aDd1Z29zdGVfJkZUPilRaW1RCis5TXctekxwNShxezUoTkd1Sz8hOzFoN1U9d0ZnNXJ4VGtvYitaWis2fSRLZmNvSmRxfXBYUmc5OSN5PDExXzImbENIekJDZzAmSy11ZjYlCistY0l1d3RtK1ZBKD5jNHhoaHVhPFImbFlSaHt5WTBGK348eVNxXlgkN3lqPEsrYD9AQmFBODljbl9DbHAzZkU7a1plLXtkTSsxMDZibV44CitaaX5lTlBDUklGS19APlJoO1gpNkBLT1VQWjcjTmEoODQoZy1LQmVWe15KSVlldUR1I2s4dFpYYFB3Mzc1QmhAYjBFZjtPVXApU1NuZjJpCis5cm8+R2tVeCRuakpZVnFOQDk/Qyh5I2pKMFZTK0BINjhfciZAZXJBMGlRb24wNUljS2ZQUlF5T1RTTmV6ZihRPGVKTG8jS2VWOEZsLXNTCis3ZmlxNDFjOFEhWWBfVW9XSnt+S18yNyE8dCRzRFNoQ0RyPkdMbFI9WCZFQFpVJHNSMk07O3MocD5LP2dZNDQpe2BQVkdLM2cjYWZfKE9vCitnKm16PTdoNnJZUFkmRGApd0Rve2tkZVZVZXB3WTgzUXtOMHxKOXExazRSZXQrNH1YXyExZlp9aj1VWDd1QTxkLSE+RGAxejBqbEhyZWs/CitjdmluK3J6KjcqSUB0NFV3aW5NYXFNNklZZUBnZ1V3aWElKGw3cnQkcDdydU10PDNXe0N0ZnZqR2U9RXpIUmUwSEx6MT9hSGF2RTZ4MyNqCiskYk56QW0rSmB+M1UhfDFGQ2d5QD5pKiF2ezkqRXM8VE58QD0/d3Epa3AzZSU4MV8tck54d2dPYF5QdSRqKXJPa0FhS3RSI14xZmtfZzhoCiteS1RQX3d7OzJpKU9fQVM1cEI+PEBhRysoMmdZWiMzaUBxXz5afTlqM1JLTmU2MD96akFTSGMxdkBEbjRHa2hWSCNmPCo/VWYlSTZeKD0+CitXZ2w5RjFAQGs3blcxX3VOREktKHprdClAVjBjPGoqfHJYJTEje2p9YyglTEBidFp3WWNeMVE1UF9kaWRsRk43e2U8PG10MDdlKUkzWXtvCitRfGJLLSExKWJEQ1liUyVPNDdWPlAyTDhqeDNGRkttbF5Ge2UoX3BGam0jNDFVKzFQTWd+T3hCQ3pKNC12d2kqSmVNLSVaNm9la1lUZEw+CitNREQ1cDBCZTxwZVdDYUlWJHhpP3dzY14rQl9qYipvKG9ZQ3crZzd0SHM9Mz1HS2Ffa3okO2pvXmBIIW9LVnQ1YnFpWn43QCtgSmpUQ3FZCitHKH1ObjA4QGBOPG11UD52YnhFVSg5SSs+a2dQIz1USTNsakNEfj40TWQ8fmsxdkI/fTJsJTxZTFlvbEo2e1QoWj4rfUdxMTxDRCE/NV4oCitqRXZDe3t3SG1abi1rWnB9MkYpM1R4UyNTR0chUmxYYXVCekh0Sk1XNGI9OEY+SSlXTDZ3dEt7bjwrRWVSeU4xaXB2SzQ0VF5GZSFTZEpMCis0PjRqb3pUQ24pejRmc2pHITBfWVpHVHJ5U15ZViNQJk12OHc3Sm92cjhSdldnS0FzOzUmU1lAbldiPjNfaVlYc1ojLSZ0Sz5QSz1lUk5qCis7S0dsbE0zVEhVajNDKj0hNGgxbj4oT0JqNkQqNTAzKEhNRzRITERIPkdlU1Q0dWolbHlfIz1QWUp9dTI1ST0mNVg9dnUhODJpM2dQYE9lCitWaXU4V3dOWHFHO3VYKDI3P3w5Rmk7eWFNa3RQRFE8Z2MqcVJIeFFudFRuVDQxaFVhZ29xRnIwSSlHT0U7JWd8YjUxdTIrYnxhWkAzQDchCit0d0RFSShwZ0ZpaGh0MXcxNDNGd3M1Q3l7KXg3Vj5qR0JlOCZOcjcxVD8hcWIzWnZlRWhRbkUxb0hJel5YSnd3eCkxSDRvYFRDUnA0Q1hWCit0VWdTNlZWKkpFQ1FTXyVkUS1yOyhZZCtOalpzWFh1UmlJazNONEdmQVFmWDZwS0dlRSEzK31mPmkrNGZhJCNqeFAteVQ/aDFqekchZ3hwCis5MnRLSCpBSGgzRVlIX1FrYD1XbG0/VDs2MWhWbEteaDBROUYwVkU2VldYeG9IPSFTR05wYGs2O041cHx4UTQmVyhUekRDSnwyaUxiVWJrCitYcSMhKnNMNDw4U35ePXopVDA5P2dye0l6XjVQNT89IWlNfk9majR5OFg3OXtEe2BXe3RAVzRfTykkXiNfMDJLS0JnR1Q+fmdPNE9PUk5OCitPTzNnWFEkVV4yO3NDcFkwdzdSZXxVMj94UCVgV21KeHVscjVSRz1oRDg2R2lTSFo7d1FMVzhgZmFGUkhCeypTWXlmWktJTjwleHEwb3BDCitpTGVxMmZoeGA1MmF0elgra3dGKF4rSWd7KmBQP0FqfWtybD5PN3FSQyNoeFZAS3g0YDh8ZTwmVyliaHdVb2hSWnl3JWx0MWclSmYqazFgCiteRVp+O0ckUUxuXktGSTNKPUZuSnd1cnF1P2pGMzY3OD9tR3RsPXBoUXd7bCRLOER0KiFuYERgTkVTOCg0d088MV9IUVB2MzVqY0kmVT1HCis5IXwzdnteS15JQGtWdkItd2c7REBBKyt8U2BPay1LMnNhXzxudlJVJXhVR2YoKGdIOz5nYj8xaD12bEhoNUBjYWpgdkVqVTwhdnE7TkE4CitZNV5VXkdlYyRJWTYyUV57PSg9UXRqYVh3UkJtPHVmI3BgNClMUiZqOXspUz41NmczNj9jKndUOHlCPzFMSWtLIUVmQjljXiRqRTxsIXFMCitrUyZHKXJJdmIoSlI3X0stLXVWWXIrUUc+QHF5NztWNnJBSE50THxuYFheIUNVMGMzTzxtKU91VTxwRXpJaThXYXhDSHU5TnFJYE8pWH5kCitQRDQ4e0U0UXJRK0dQJGNkYXh9RTUkSjNhSHQ1Nlk/YTRfPWI3aHVeN0cofUFrPERnUkolYDN7akMoZGtnb1Y1U0RDQiVvRUhvOTteQ2RpCis3WDB5dWhAcHNmXnkzRSRJc3t5djxXKnsqeWFrKV9FTElTc2pYRkZFM0hxVyNBd2xLISMqM3FHYykyQSohOSg+LXd8TSEjNmxMMDdoPkVFCitnWCZOX1pYcl9mK3tkaWVCZ0k3KmkzV25GRG5nSihsMFpwdW1YZVlWKS0lRDhNa2AhclV3dXp9KnpHQDRpN3BrUk1iZlM0dXxSQX19WHojCitwPikxYTBmejFSUjZsTUtlYz0yVF41JSVrYzxecVRWSmU4MmxPXiV1cGNaam5ObTkxNnt1bGJVUSkkWDBec3x2fTViKXJrTGs3ZUNIb0RSCis4aGVEPSZQSmk0LUBMYXl2I28+dno3az94KENkd1dUe1pFSHMqbnUoUyslWE15R3p0diEoWUZOXnxIP1h1WGJaS00pP2gjYCNEMXZHSU4pCis9TG96a1NVb0NsaW49UHZTK085IXlzbFUrP1ZBSWc5TUdfcjMzMUF7aiRnQytlM0hSRnhGSnNtalVnYClpM3xldHZBS3N4OFZmUk8qZWk4CitMOCkkO0E4fmhtJG5SMnNvJTdLQUd0QzMlMXBpZkxAcG52NlZfJFBJLTFtUWRKSnVXUXI9UylfOEhBVT5eMmNFJEBwMUBuXz57VjYqdEZpCistcz1gQjdzQmhvUTJqJkwxTW07eComWCRPIWVtT3ZvbjFwJVBfZlVuN31lbz5WZHp5PUFEPyZ4KjN7PF8rZmIyRXRWTkBSS0U1dSVFRXdLCit4LXFydDJTIV5PO2ByZD5qZkBBVXo8e0g7anctNGlnPFoxS3x1UDQ5WnlhdGxndygtOF9NbTdCYWhGQH5+ZypMJGBBRkIqaTdSTjJ2WG9BCitkXiVOKUtsaDZBWlV7VTV9T0loRmZpJk1IXl45NVlBZTlAVnUyUitWMH0lU3hSMVdwNEdJbkJDeFp3VF4kPCooP0tjd31NdUs0WV8lNDNSCitnLSM2PXk+T3ReIVc7UUsyTXctPW4rVFA7d0lSUTZ6TH5ye2Upa0BNe3Fnd3FeUzZKc1UqRW0/PyhLXnNgfU1gMmokWnV2JjNFdFo0PTwwCit0S2w9OH5pRmBMYl9mQ1hXXiU4UGBVQkszYVFfMEB+NjEtOThtcEQlUD5Ddkw5dH5WPTs0M1ZLN3pzbERjMjNWWHA9R1ErcVRTRVclSFE+Cit4Tkh0VFQkXztBMCRMQHpKQnVnbGVYdDZ9OCRnV3xJYzxASUs8KDUoUTl7YCEqbHo1ZU5jN3BzIzEydX45akVIYSMyYyVifWIrMUtPPkZ0CitQfXFhYFh2Iz1eZk1oMndjZCRYMmNsNytmNktscUo8cFNBTUdFSCZZfCZiUj9oPzNzd3gtZTVRMzl1bkg5OHVwNUo3fUI3QCFWKHIxeC1YCitHUkFObjg/NX44N0grcUtXflVGQjxHfjtnTHBIfihIO2NFeFRXS2ctJW9NYCY9XlVDXiVXM0ZCaiQ2WFBRYjRxZUE3VEM2RXh4ak4reSRzCitfITdPNnFLR31UYGZ8WUMyRW9fXl92JipEOSlpPHR6QzlyMCQ2XjczbFFyMjBqSy1OTGtRd0Y4K0JGaEVAMH1JREslXz16SzVXJndkKEZaCisySFoxTjk0PVRZQFR3ZUtVQHM5fmMlcSY+RD9FUmY0a0hefjJEMjJIJDBDPlU9MFdMaT1sRG1OVVBvVngpVVE3NTN0XnE+WGc/fml4PkVwCitBbSo4JT5XWiREOFU2Vl5kP0YxVlIjaXJoSXs0PDA8QWZIbis5YWN+Zzc2TzxOIUFCKnFDT20lWHVlSz07aEBwRjhrOD9nWGU5dVFqP25LCis1S3FxRFIyMlo9Z3hnIWc7fntabjh4e2Elcj8lYVphZU48RE0rJiU+SXN1IT1OMzUjTj1UelB5an41NU88d3A4YShpS05xNThHZCQ/YzF7CitVdlVPODhRU2tuMVdWUGxWdUVjPjYoMGZZfWdha05KTU9ScVZ4TXN3ZH53MUpHTWZJZkF7UVIoZyVncT9GTklucFpoeVYqKStQN3FAU0t5CitlOHZRKlpyMVokQGV3VlRmX0JYNilDSW1EbyRIezdhaDgzenp4ejhOMWxDcmpObnw+VEMkI1dXSHpAR2ArI0NLZ3lMfjZHOzlsO3tGP1BWCisxU09lezB4WTdKNk1mWH1Dc1YhVGZGQFF2cWVtRTk5OWEjaFFwJCZoMVJ5TShAPl49bWdFNFBXWVdacTN8LWliND5AfX0mc2pyfjY5a3RDCithMzxRY344Xl41YEl2YmYxaDNQbmFEdzk/VzlnZ2xUKWlgPHg4UHlSWjJfNThveXkhQiV4UFk8Nys/SFBkKzl6RU1yNSt7NnJ4fkRgPWAyCitKK2lsUjRwKyQ5cjFuZ2RZeGB1PU9rXkYlOHQ7NnhYTjZ5NDhqP2VtOXdoWktmUmNlNFgzMyorTWZfa2YqIz4tY013I0xRZTtMTDYwKnAzCisqYSFiYW1DWj12WUt4ZUlSQFZGbzBJOTNNTGdWeWspZT5eJD1ZPzBKJnNKb2IoVEN9WGIlIyRSKnNhKGYmIzspKTBXXm9vemgmMCYmcFVsCittTDZIJVEjREM2SzhKJkptUTM/eHo+d2U2QWlUNnBuSn0pX3NBTm5XPz4/Ny1Bcjk1eVVgRlcya2ZAJFVUMl5aQjhmN0kmUTYlPlVzcm4pCit9a0E1fnB7KUs9JVRhfUVGTnU5cW1yfFB2Y0Ypb3FgPmQqTiRGaEVVMldRUj96YH0jIWl5ZlNSUCVocTw+el5FTDcwb3lgKm9NKTlNb24hCispUChRMXY2R1ZMYFYzRng2ZkdgNFlWZFNrb0NgMURNMEV2JU0qYn44MXkpN1YtcUZ7bChsM0BtMngxND1OUV5RZnkzSE40N1pDelc8ITdaCisob0hJTytGOHZteHdldj5RSHBNezR3PVo7U0lmdEdBQ3tSQ1dGP3VXdCVhTmFkTUcycjBlT19yTzNXNjFiYlBvb1lhaDsmQkw5U3dsIVMoCitlMCRlVyVDbVArWXltS1pDT2UhKk10KihIPz9te2tJfWNHKUJYd0IqNEh3TEtBTUYrcHhzYDN5JU9xJCgtN3BEYkJPWHs4Z0lWUWF5VU14CitwWjE0N1JaKEwpP0tRRHZfM1VhT0E7Rz4yPUl7THpqUHAyb2ZlfVRrKWVLS3FgZWcjRWp8bkJzbTNjeGpNaDQwI0cyazVVMzJvUFJjfkhkCisyTD5eIUheKntuPFhQeXclRmdFYDNtJWspMCp1Y05vR0JufSQ0VGUmS3BmI1FEYmg9PD40a317PnlCKk1YLUVmQG83MF41JUcyYSZEPHw3Cis+aSN3X2h+WE85RWZNMjRzN1o7Xmp9SWV3TnR3TkVLQjFlZ2JedDtNQ3pvM1F5QipzTG84K2spYHQ2b3M/TGdsKmpqZmRmSX0oXz8tQm5rCitxJFUhOXk+a042aTB2OD97Xm9qLUd2JmZZKFNVMXNjSnwtcilISFowQyEhKVAjYHJsSE1ya08/dUhObTdlaUolK3ReMzJjSWBSYlZMQVFuCit3PGMmSnslP2JoYlFudVlYZTRpIVlCQUM1UTlKez12Nl5rbyY4KHJyMjx0STM1QnRsdW1NcWdLQF9pITk1c05vek4pTHU8eTlpdFQ0S1d2CitFT2tDPmpYRmN4RX08WiooY2xoKTg7MmlLYHNaTWZKe1NWM2RCOGowPHxmfFQwZyEjI2xZd3otUFpNQyZ0dEZuPG5BdndBMmpTZFY0amRuCitPaylhSn1vP0JWUE5OZSt7XlQpeTNCcVhRN1YqfG9IeyVUSzVJeEx+Qj5ySVlwbi17Knt1UnZhY1hFdzQ3PkNCRmllNEdGfFRjbk9MeShWCitWam9BPTEwOG5QNyQoSjcwTVRWT0FGPEZnbHhkWHFXZkFqcG05MVM5Vl4oezRPQVBjPnU4dnR+O3tLJW8jdWk4KjRTd0JCMXt5WGZpM2pECitHfVI7P29fRE40cXt8O1FXZGsxUDxeSDcta00kMDIob01sRGhHMnY5bz5ePlhRT0orXkZWUUZobSl5M0M5PFMyTzd6OEVtNFU5OTJOV1lJCitRe29EY0BCRnljclV4NHsxWkNXJGd6a1VKXitLRVNTSXB9Y2NiSzlYM21EOUAlNTdWJFQqNFkmbGIrfiVSKUgoZXA+KlVKNUcoZihsciZRCis/VVB8IStAYk5oX2o7YzxzcWtOM1k1VkZaQHFUejNmZCN7eEU3fGU0dj16SiN6SndtMEpXaWtXa2hWV2BOPkNjZz8+ZUQ7KFRtR3FkSnAmCit1Zzt9ZnhzcDdJc0ZiV0FhPGZWdW1QTGhufnBrJG5Ed3s9cDxHVyVRUSFXZCt7YlI0Mkc9VFdzI3ZfJmglK1h0QUE8SG1wU1NeTEZqQCEwCis7PkBJez1tK3k7MDlrRG8oKDVXQjwpNFRsMHc8anVnNG1QWlQ4bS1LcmBCS0h8bGdrPlNHNFZrSFA4djJhUDFZdWxPM0ZkMDt3TDQtUGhWCit9WG5QfUdfcmo4VmVCa2F4cUtLO0tzQSYrI3BNUX5UMUNvb2dHNDU9b3tDIWNAUStIZVdXUFM3UCtqMT0/bXxhbnA7NWdvQU0jJGA2RjVyCisrd3BPPjdVOGxVZyh3STAkK2hZd1BEdnkzKVFfOyV+dVVeMWFLJjRIMTRhfkdhZjNHNS1iMkd7QS1qQGV7SExTam40N1YkQSVMUXp8ck9kCitOfW5VWDdkSlp+a2RjPjh0NE0wanM7S3Rka2VpeEUpKElfY3klMW9ZZEJ1WiskNTlLR0h1R3N5TkxJaitARSpwP3VEams1NiYlUW8mKXBqCitZJHNRVUkyK0ZRIUEhWW81KkNDOFVrJikxcjh6bnZeJWM0d35JKDJ3VmImKld6Nn1EM21jfjQwUXBgan4xI1Zte3JCdSlsdFlnQnFYaih9Cit7aWoyYHV2Pj9VblJHV1NMZEZZIT0kKmo4ZUAqdWJJOTRXWV5YTShZb1MwSmE4KzBYK0E+RWVecWpnbEl5U2ZqKHNIKHxDPXpgS2hDJXZHCiteRGpZam4kdnVYMEFPdlN6WkIjeylIWm5aVX5gPWFXRHJvX14hK1MqZ0NFP1Mlc0RFOSlkTkRCSUReYF99NiFrUEdFTXhCc0ljSVchfiFfCiteJVdXejVfSXdzeFZPbClWSzNSUiRrTHohMD9GazVMa04oZVZiPTxRdWZkfVk7ciR0dVpsR1gwXnAmRTw2Tnp2R25XanFBUmBJQiFfV2tuCis2YmFkJVBIYEFTcSh1IzVhUlpyTVckM3F1Vi0xQ2dZRlZ0OzctRncrVkNQUiFUYW8hNkg8Nl9RZUEqQ311YWFjMkQ2WC1aaEIzQT10bEBNCit6alExc2hXUmMjITY9ZDN1eEhnSDxocFdEI2ROamFWLUYyUSNDaG8lVGBzaWFtK3BLZG5UWWslUWopQT80QkE+aFc2TzNwRThxVnNpUFBjCitCXiF3MFNIcXVobnwpRkxDazkxNHZJS0V4VVZMRVYrNk1aPk1neX1ePVclfGBhNk5nTEpuQz8mPCFFN1NzWE1YYmVwZCtLRFZzbGNDZD9DCitnMFN4Rjtta2pYNishczJxM3JYIysqMEQjbyhWVT1ONF9HJFpgaWp1eH18S1dWZ0xrYChAQzVAKkNwT1AtYChkQm4odzRhQzhZNXIhTiYhCitoKzQpSmA0NkVKYT17QkYlOEVvZStrbkZxZmQ4cllxKkRCYU91O3loaXFhTyF8QlEtbUBUVm47KmRpU3FmPm9CekNwN1FuTXJYazRNLWtzCitpZTw2TFlDMTNjRE5aSUJTWSVVX0BofnAoTSQwU0deOSRHa3pAZnpWTVdHalROfCs7dmRYdnxhZmZ4aEZXKmtFdXZPLT5HKTZ+bzl2YEBBCitaJSMzbCNGODFMJEomOFAraU9XWUlZSVYrWkJ9T00tVntfdiRXQSY0YFNuaCZsbCFwRz45OTF3RSFFaXdUSDMxSF5tfFdNJXBfP3M7JU0yCithSGdXMDAtayE9NHlzajs+ZTl8K3U3Vj9HYFViYz5VaUV3dElYVyQyZDVRbTZwQXg+NkdwMylAVTRwKCMwUCZkMUxfKWdCe0YzSiM3LShFCitUVX5mUnFUTDJ+MCFLNWppbkVgTEB3JnlHPTA4eSUkTTwwNmNjaj5iNWE0NmF6aCV3cTR2MD0hdlRDZldUQiUzNmJUNjI/eCthe29jJUcqCitVR25ITFdnOHtWI1BMMjR1OGFWVklRfTRVIzJsZFIpWjgyRkRnbVlTYn5tfCVZSChIJjF0MzhXXkR9a2pmcV47ZF89dTx6RD54elYoUCEoCitgOU0pX2lQejlsPExRfFdDO0poOVpVPGx3RUNNYHI2JnVzeUhyMyg9NTApUFJTMVJJdHBpRmNXODtYUWl1ckFyT1hheDRERDdATyNISj1sCit5RXtsYyYkUEdVKlVOMys4OSFEQHd7Zj5tO1krMFF+c3p7QCghd285SkpZPDA9cFEmMUgkKFZyeFMhK1AlaHR0Q3wjK0NIZE1WbTs5dTFtCistQ2dRJiptaCF5N1BuN1c1dVBwMVlwSXVwP0MmKVVTY2Vma3V0Y0VFSm5QTHRyTmo+c1NlaGFjcXtIPUY+NWpSVTh0ZmkkYVhBY1IlTDlnCitFaz05eXtCUzM0N2ZWISs9U0d6NSlIeUwrcng+JGAtZDc5NF9wTj01R0RUPHJ0LWVoN31JWWw8bHlCLWZpcUdlZy1DPWAjaGd6WGQkMFkmCisycXFgV3xeO0dre0sxRl9KTnNJVHR+cWZXMjx0TytYO0IxRmAtaSlZJHFXWSthUy0kRis2blpjPC1kY0M+SUQkKyFRI0FAQnk8KGRqSU5eCisrcW0rRFoxb04/K3doSytqfn1JQ2smdVJEO1BtM3oxZ0RMYVMoS0dkWDdecylWUGYrVWI4dGpmcVMyeX1RfVYoIVdeey1nT0MxekFmVWw9CittJHB0TzxZX2w/QnFnV3N0RjY8QktZb3pQVUAwfFB+Tlh3ZHNxcTkkbTxDTio9M1VxYk4hSColQSp8N2dNbXs1YU1qaSFTTmNRMVdnPUQ4CiskcDh2QX5EczleMGNufVNLWjhiYD9+bT9PbVdlYUMzPj88clcrbyMtU3ZhSXNNd2pQLWc+XistbFEmJXBgS3luX3NTXkU4VUh2aWVrPDg0CitIJF5BUjlyUT9uNl9HNyo8MHswb1goK1NgXzctNSMlPH5rOCliVE9RRD5GdF56IXpoLTt2byVva2g4bmkpbzBeQiRebzlHR1dqSDYrezArCitZfGEjbWJpIzZ6Oy1GbSpoK2Vlb1NNZSRZVXo2Iz0kTm9UVnozcEZlOGlPeGtrPjlXVCsqTWM2Xyo0YTwobC0qOWJ2T2RNM1NtZXd9PkUyCitROShhWFZAR0Fkb0w2WWVsMT9haWxFO1JwMm5gRlVWPDE5Pkd4eWhNTntRMmhXYFQmI0VgQF93Tnpfb1Erb05GfmtCK0dKViFGIyROPH5UCitPbD0wSC1eQG9kMDxTVHp2MylAZUpzLXNAeiRFVm8qRU49N0NJVEtDSDJfLW0tSWlrZCUhdFhqPylHanwxZSh2TG9xSVJBQkQyQyRzcjErCis7VXpaOENTMWg8SkxYenVuOzhLaVg7YExlc3JDdnF3VVJoMCt4NE0mJC1qdkF3WHg4WUQjPEZ6QllIN0JCY0RXJmBqQn1yaFJoUTY9Ty17Cit2WjtmYUVHOGVjaD4oSGhFdDkkfnZGOEFYM1dhaHpyTGdkX2cxT2loLTJVQ2RfPnJOPik+TExZN2VZQVhsPyZITVB+YmU4bV9gUl47MUFYCitRdyFqdnVNflJ6Rjxkfk41VH5oM2FHTiVfe29tI3MxQT55Mz49Qz9QUzZwLVh2fHlfI0d0JWhrNVMka25ObnRCN01XViZ5YSs+NURjaUQwCisme1Y1Z3AoPWx+eXpEYjtEPz14bigjaXVQbHBVPG5DPT55TENUMVpad1gqRVctOCQtYzFNS0J2QT9obXlveHF+NCQ7K1UrQHUpMEU1QlleCitBSTdNSVVlJmZyXzB+WHdHR20zJTtnIWZecEchcld3KCY1bFcqaTRJa3NqWGxvNytkdiQpPUFQSU9tQ2I5O2o9WlAxfFpUbTxwTTQyUT9xCisyYWZLeUxecCZuXlNCaHM7KWRDUjBLPXNaOVdeZiV7SihJYGkyVnhudmhfJVJoe1hPI1pibk1jT2Q8V24pN1FUJCsxTnhxOFUrOS19S1RpCitkcVYoelozbm8qQCQzTGhPQmE+TFhlbSE0Xis8enZPbDF5PSlXYnhDbypWIzhTLSNjdGZePUNAKUpDI2pYbGk5dVcod24wYWVZaypWOT1yCitqcyo0TUpPSm9pbVNBbDluRFdQRlJPfiYxPiRLTiM/eCpmb0x4aztIITFVNVo4OS1OYVd1d3dYRk01a2tSV2F4WFFFYGduIWc5d0EoVCV7Cis5eFFDTTd9RncpSXRxbVQ1czJaPXlpd3R9I2lBITUrJUdeS0JnSjg9JERfUigtdFckfTBoMHY8MEYtWkhSWnx0U2ZaVTZQU35lb3dPaCsyCitjI3Y/YVU2O2pBaXFPNFA+b2slYlItWU1ZbkZEWn1BMHRtUWhkJlplYnFfJnF0bHVpQGxUX3FBeyRaWWlhNDcwRntHOTd0eVhmY1lTeXM1Cis0WWdDUmUjKShGWDRJTGtfJCN5T2QwKEl9e184U1RfKEotRlpGajBJfnBGTHBaQkBnYXpPU0R3e3FXUXVveD1RQmBgbCElIypTVFJFSGR6CitlfDhuPUVze2ZnNXNRdHRSUThsTn1gcm1xYTMoeTE3QXZFbThvSExgb1JCdnJyQE1ZdCpvOT9aNCFXKE0xVU5OR29uUiRvWCEzeW9EX2g/CitnJm9TMUlWS353LXpQU2VOWkp4RkJOaCVzYkhkQDE7VSFMSU8ySj9TQEEpSUNHTkU0KjVQSk03WEU/JFpGcVdrYzx8JmIwOTg+bUFiT0xACis3Wi01YHhXfUg5eEtGYXghSXdVVkprTHFkUl8pZjZEYlNKIWVqa2hxVWFnUyRzfCVsY0Q+RjJJbS16fDkjcnBSTylUWVRWSFZjdmZJOW4zCitvUWhFSUI5OEtwb3FkeUgxTSFEYyllVW44aG8xSUZNIUFSOGskPDtKOXAyREw/KEIrQ0NwblFJZ3lLUX1TS3BffGJyflEkbDtUPUZLd2ZWCitURVZQWnF9PG5VXzVCPHkyOF9HYTR8T3FIWCM9ZGVHcEBSbEE8eDReQWA2cV5hSVh4dnlMMTJZRGJ4YXp4fmtYO1NRbTF4N2Bma2dYcitECit7X1lmcml9emFiTSQyJEN3WmdnVFIwendNa2w+c1k0JlhIRjhoJURhbGtmLTYqJj51Sml7WGp5Kj87N1ZQMn5XQXQ4VT4wdEJPJEQwTTVPCitESzA7QEQofEhBbUlrWXFZa2dHeEMwekE9OEh7RDBrVjw4ODRBNjMwTWZNYWlPQTduVzkmbUtzSiEtRj9HQDNWM1cxPiUycHkqUStyJWEkCitpfnl2UHAqbUNlP3ppR0x6dWZUeFdKYHc1YnlqRWViK1J4PEQtcUQhRHQkZUNSazNGK1pebjBkbWp4NipgXmxTWClvfDVeOV4kSChHKnhuCit1d1ArJCFePG1uM1ReP2F7JjV1NFphNlFnaUZXaEJaT30kRFg5e0F5MiRodFI7dEtSRCFyPEoreiUwRmBQMThwYjQoTXRsbUYqRmdNcUZuCitwZDM5TUcwSVhAVGg4LXlUUjFHVnw9KFpQIU5lTk4oMSVZK2dEJE1wPlJZY0gtfGhNQEhzZDR6RDFxSVhYdUk4P3VIUGMyJFJiN193e3pECiszRzNwKD4pVzVlRXVvQlU0bmA1dzdwd25YREZAT1cyc0F7X3dYNj9CRWZGPX16dmEwaCM+ZGFvYDhEanZeNU1xPEBuOFRiQXlyPnNWPHlNCis7fGp4elQrQnxobGY2dkpReVA+bjFudiNBZS1JSnUoZUtfQn0pSkVxSGdDSDQrRGIyTHMpPTVUb21VYClSQiFKdzFEZzN6PjZiKSsjelVxCisyKj5QSlcpbn5hMjVJK1NrZSkkTkRPRVBfbn40djc8RVh+eHtXTG4hZzJXa1Zmc3JYR0IzTmVSeVV7K2RldnxhTFJ+SEBEKGB0fFQ2KXBOCithTkpDK1BgbkdleDdNdkw+NSFjTSpBMElnNyhpP1RraENrYipJSVd6S3o7LVVWcSUoPlMxSmQyQkQ+JXBTKG43JDVTb3pSRzw8M1hJcVVWCitAb1laVT11Wkx1bXhWdjs2Qlh1Vnd0eE1pTWs9P1prdypJTn08cl9PWkdRKkpjYzJLQ2leWmhiUnVxUkwzJURgWGYoMntIPyZra3wqLTR1CitgSCZpZGlfeytXSkc+eHZgSHBKRGdjUGQzQm14RUhZRmQ9NDhRZHV4dUBmSEBDVTBxfC17KlNtY0ZkQj57YFkjOWNqRURHRE5GI0N9KytJCitOUGtmOz04b3xSJCYpVl5IbEV2bjZSdmFFJkd1P0opbTBhaHNqey07Y1NZd1RISG55d20lKT5ZSDElcSZ7fDV+My17JTROWitZfVlJZXhnCiszXjF3NFRqI1dha3kxeE0haiszWUdTek43YnshdkJOQEtMQlQrPTAoVDZaQitrREN8fCsobFg9Z0lafXhiNW9pekMzWSkmZ1EhUnBiX05ICistSmlQa3o0c3B+czUxazc3KSk+T19VOSV6TGNnZmdmeCQtUzBNa0VVQENsUUNhRi1nVTMwSX4kdXR0N2c+VE4lZktfaTB5SWk/fEpWck9RCitGaV5FR0xTYjlLKjcwNlQ0QD92T1dxeklNKmpAX25Sb2k2SFh+aH42LSVGMD1GZmJzY1FgYUk4KnNIPylASyEqRmZpNUF8RClPPHJhNT5RCis/UypeR2duVFNefG9QWjB4S3l3Rl83KzYjKDBvKSZxfTlfbCE/VXpFTDIhZ0Z1TipUO1JpN2cyVDJLJXlfUWRiV1N5cHYpfm97dXIkcTxaCiszK2FwXjRubHwpXjZVNC0qaitqVnskYUVvMTY7JkJOTVp5OE1PZE90WT1XUzNpPFUteWpRJC01NFp2RXk7Z2pNMSM0LU89ODBuRk98JjVyCitxO1VGZm01aFRnbk9sRWNgJUdQfFd7QzA1X2RCbGBxTWAyOCgpWHpmN2gzciRRX0lBSnpGZzx8RCFIdDc+QyRMeHh7ZV5kdiYmOXV3VG00Cit8diZONXFOPUdrRiY+Kl4mYzA8VzVCTWJ6PmxZbVM/Y24ya2hlNDtyXnBRSVdhUUZ5YFpMJXV8Rj9UfWFmPjRjbjUxP1BrXkk/PGVWemVzCitIPChteCh9bncrMGdxXkBpNzJrUFEtZTZJK0ZPXlZodHptTTtQdnJOYj5JI15YclE9RWY5U3lEWEooMFckMVE1PGlyOSFXJm0pfSpCYiZXCis+e0sqMkhMcmVBOUpeRWVAdCtObG0kTitBIUBFRlREUUJ1eF9WSXY4UzhHMTw5TDEwUSZFVkcyPXh+SCg0MVhHcG5fa2V6dz88JWhwN1lRCithQ0NKRlVCP09kTXNyNy01RXE3Qk9qWXM2WHU1VEFaa1lwITlpZnlJc0BBZ2RmQkUqaylTTElJJHR2cnBePUckSlJJXl9CLTVEX2R5IUlGCistbUwqK2piZzh7UCFeRkM1WWFJM1BGdTtfSUFeVShKUW0wQVBHR084dXxuQSlNeygyKytBezQhWFEqPE1NdVNsaT5Ve15eKkB3UGJCd29qCitIJnxYZHhxOyteVVlXY19jZXcyfUNecEBZK2ZiM2BpbHpyK35uRG1EUylJWWhOb0tKS3pnQUV6THt6blAtSVpBWldqPVohTm4qfHczJjN4CitKfFlfXmJebyFgbyk0U0JRZUFRSlN+PXQtTnJFRzxLWmlDT1AqRVhoUWdLdlFOYihCbVI1cml5YSZzM299KmNWJUw2R2IrbjIxfD9HLVYlCismQXJpQCRoJDh9cnpkKCkyZ3lKMlM+RVBqZmdfI311Qm9CTDF6TGJnQmtEYnk0XihqPnFFOUYqXlNwV3l1SSFeR2NfdTcmU0lmIzd6PUBZCitnV3s/b15NYiNtNUFrdnc2a25zUFBFe0ZCSDM5RTdPJihQZW1IZUBjaWxJOFd+eGhlUDxpI0UwYDNafUdHIS1oQGs1Km1Fd2FxUjhLSHZ0Cit6eSQxSm4+WGEmUkk7WWplakRXSldlVFk0S1REdFdyXy1WSGY5QEVJVSMlUUpjeG0xZUVwcU5NOU1wYWsmSWZTQktmKU1LOFRebkZGeGJiCitCb1BKd3ZFViRkRXgjQjlTdEs8UH0kX0pzMGdmQC04QSRrRTspNTVUKVU3Sz1ld21jUkxMTUN0THE0dFErOVZtfGhONn02X1I3SnZDPGlRCitRTmxkPGVje35fd28xR05iaFlsU0JoS200emk+Z3N0c0M4Q1kxV149WjNDNiU0ai11dWNvZWZsWDBoKUkkVUohPEU+OVgoWDNCUz83JVQoCitXQE5FJCgrc1d1KFBZTmFaNTlldkt1eHlDVXQpYWlfN1c5ST5RO3VEMGYkNCllJWtpfHVDUHU+djs/PkpzNl5xWHBnPWg8cUxTZ3kyTz47Citib2hoRUJLYzA7Kl5FNik+NEpDUEN8NW5XVHx1IyRQR2VSdkJNLWQ0QTY/Pl5XbTE2Nm56UnZQKF4hRD8+LXYtaG4pbCVneGEjd3FhUDhMCitqI0pDRCZTRSNnQll5KVJqdGV2P1YqITcySVJqdE48TVBqPFJFKU5KSGBUYitOO2x8QU8/Rnxfd3IhQkB5RV8qUC07Y3kzI0klOTxoMVEtCis9RT8kWCVqbk4wfD5IdXZWJkR3WHVkMiNKaTROaUhyelFac3NFUUUjZVdPeSRlclN0ZiQpeEYzUighOE9DJXZoT29fREFiXjMyRUNIZ0l4Cis8Y14hYUwzUTRlK00zRWU3OGNhdzdZbFkqa2gpaURfNjJicz05NEFwfS1SfV9hXyZmRCFhX2U9eGc8VUc0VHlOKEpLMFNAR01pdytyY3g9Cis7cUROeSktVzRzQG0oZWYxbjhfPSVYaVhfPHMpMjFZJSpVfE9zVFZlYUAwTkRaSWNoK2pMK0ZtJV8+UW9rQlIzPXBKOXR3OCpfSk02JFVBCishN2A1R3spLXl2VU9GYlNkMUFFanlkeyRuOE1YO3gkMEFTSyU1SlFZYig1fipiTiZMSkpOcEQmPjAtQF88RS0+I1dIelQ4Y3VAfDkqaWZ3CitmPEQjZnhqNH1wYWteMVRCMVIpdlhPenQrKWV0eCtqJmRlNSNZS3lAX2dOPnphJDtSLTVAQXY1cWtzdj0oUFFvaGloVHJHKkZYPVY3bVlXCis7XzJWMEJ0USp5ZDhzMWRXQXNxKTxlRTNTI3BtPT9QRDBPWkZfbV5efE1NNyhwWDZ2TEl1N3oqMkRaX1lUXmwoWXVCcHEwR2gqM15+N0AqCitebV5NWDV+TU1zPEB6U2VoQVRYMEFUTSh8aFRxPktyVUJXMFZxR3A5UTsyfTRsdGw+KnRTalBHUzJNKUR0e0JeYlB6JihKUG8xRSpSRUwjCis5PFVmRzdyOWpQTy01dVdyZWFfZWM7QzwtfkQ+SVc4ZDJUVmU2TEh+JCtCPWszWjIqMCRIRnNBeEF1Vz1FYHlidn5wQGghRndoalVHPTczCitSMHZgKV55IWc4MmRuR2tkYz9RIUA4STM4TVgyNG9WOEpzRHdtdHc3b1ZPQCUjOFRgeV42b0RPfVQwekt8Jn5TaFNjfDRsT2chM3M7PFROCitpYFRXe01tZzhfQ0VeRnFhJmZHKT1hfFg/UkF2ZGVCNmglI3Y5dkR2YkAxdUE0JTBHO1BpajZ7ZVlxam93dyspalZGWSg9ZmpJZztBI0QoCitjdj8mWGFuKjt4PnUtVDVWazEmbEBDJlNuP250VShBKjhaZDIrMXtEPjtUJCkzPUZJQD5QIzk1Pzc5dW50QTRxRD4rKzE+ZDVpU2dzPEF+Cit9P2VxQnJnLSZ4RU9LVVY3SGt2UlVvaChifnVXN3JuRD9JQmszI050VzJoRzlfPzw3QUNzJmx7ZEUkaDdAI3QtX295R0NKdSV7YDxUfVYlCis3TTxCRkg/VVZPMEZvJVhQPFVRTkB0Ykl9WEY3NnA0bjJ1Tk1YeU1xSzJ8Pj91fUlIZiNESnQ2WX1sIypwZUxoSVE9VkFxQ3JwR2xlSTZkCisre1JocmZPe2JFPC09QXp9Ym9ZbkBrNjlIfDRybT1IWD5zYSVyS0JeaG5JRHZCWkImOVdoPTRHfUsmRiRrRktPbiNZaUhudV49WVdJITthCis+UmcmTzA3WlFGUXNUYHMxS0dNfEA9KT8yc0kpPT1nQEk2eD9aa2BXTHBYR0J4VlM3JW5HbiRLVDNpTkUpeH44fFd7VXxTIVVHZURuVVM8CiszaW4/LTskWi1lckgpITN7bXJKVUdiciRkWkp2Snp8YSFHTT9Men1APnpPZHdjPkFLcSglNTFOO2dsSSo4cWRDPF4pTncwYlo4XkNlTWxACis+ZmVOeHBFUGxVS25OeGgpcjlsYHg3Vm08UTswTE1FVnJhS0R5YnIkOU8jWiV9Zyo7aEo7cGV4P0BPRDdiSkg4XnpEKENtfWdMfldKSlVwCisme2xPSjYkMCMoPz55YkItNzJZI249fVBlNmR3Jml2PTZ6cV9GM3pYJTYxYGhPTSFTZGE2YyNYeCg4VlhmZF9XNDFXYmVgPmEtTSYmUF9FCitAa25DKWtoPHstTml1dnZtNHdEYE9+KHo7YDRNR01JYEhRM2NsUXNrOEtkOUcwZmhgZHFCI3xNanpvdypNcjdZK3ImP2BtOz05YGlBNUx3Cis7PTAkdlE8YjtqJlErVik5dm5mP1ZlOFdQQWRDX3ZsUnlnTGkpWj80R2UkRSZrX2omX3ghPTcjVSh5STk2aSFlQ3R5d0N0TUxeLXdpYzx9CitzPyNVSHlGdCpQZDJKUms4bkdQb2BweitGSGpLdykoX1NLV1R6UkZlJkl0T2Q/YTgoLSYjVzU4cERKN1Q2OTspaWFCKD48V3VqcmVjVyMhCispTkRsMER+ZypPPCZJZCF9P1IrRSN6elc+dmsqQXUqU14yUEhQZT4oRX45eWVLQzVEVVhmJHk1ZjNDMHJncyFPRTJZUFdKJStCeUtZYWpNCitPPzA2K05tb09wUFFLV0MhOVNrNFBldDdgRX1IRTQ7UmZ5TFAqYVIwVmtJUn5+bFlXWT9wMjBaM24kdXBTU0ZhbFU+fFFJe0MyJV9TRjVCCit4Zjl4aUM9P0sjZy1iK2hLYWU+YT4wVFBANHJ3Y0Y3bn54KU5OZjAkdnhvOEE0bjhWdHglP0hrfHhrPT92S0tHbiR8e3NIRHsmMVU2e35YCismSzREeWkzSVc7dSZufl5vKVRGZk1obSQxS05Ud2tgazR5U2FCKXZxZnYlU1YkWC1IOFQ5UHA/czJTPG9sKVBqUUMyVHFlOERXTTd2QkZFCit4bEhMWHtqcW1ZekUtKDl5bVV6dUZiKSo3RlV6RjVoPnhYZGVtI31TanY4ZkhSKUJaRWJSd3ElZSloUWJgMntgNEJrJHIrOTxfYkoySlY1CitnTE5KYGU+bXVyPzlGWV4rdV9ORipHXlcjZVBBSiVkekg+KDhpJCp0cTJPTSgxTElJYVApJlQyWk03PWtHKE8mOSFYPT5BVDYqZ3NlPVNOCismMSlmWDJPfVh6JTJGaSNNbER4SVhVMD91dm94SD5gQ1ZGPmJVQElDVyZPLVZLVXhJb1hzPWM3YlklaFhRWFI7ZnE/JElhUHg/cWYyLSN5CitPR3A3X2d1PjVWKD9mbzMrdl9YOFZuNjBVTWx4azB6bDw5SXpAS0kqOz9KZV50cEJtKHgxc2lDUVRDeWluIzZXMih7VjNNaERWKzFXUUsyCitJbl5waCRLaV5AaGNGYXRRPHs2WkBDYUNBRGtvfnVtNzJlKUctRjFFYEFDSXtSM1djT3dnRHY2I1pPcH1GeCNTU0hjZnVXPFByfGhlNFViCit2ZXcyam5YfTA1NU90JSZEXmUkSF55bV8rIT82PCQ2dX5IMjVKY25KblhnYTtzSysjK15aSmhNV2I+SDIhaC05d3JUQ0F9QUVTLTwxe2FlCitnJHN7M2J3YiE7Q0NLPll5RUQkSDxSPHUlcGFsfFdrQSViNHJ9MzxrIV40ajxxKnZZWWBaRXx7N3hTMnxhWWxZVUB5Qz1Tcl5kflB5PzVQCis/e1l0X3REczJJSTBGZk5pe19FTWs/bEtQfmF7S0hCST14PWY4SmBUKmZ+alc9cmR8Nm0lfkkoO2Ble144QzBLUDd+N3xMMVNzcDc9O3dICitrV2lJYHt6XyRSP21hIzEzc2VKTlR+RT9maFpGeGd2bDspSiRzTUJhVSNFeUhIR0xlc3d9My0zc0BWdlNVRj1fNW1Ka1F2ZWJ1RkVmXi1jCitiSG1NUlpuY1IoKmQ9V3hNJW8mdENgYjdgND9uVlNPXlNhRTBFSHVyOUhAV2JwT3ZIIWhyP1BAaERFP1o1QE8tVCUtZCUhQWJVeV8pSFZ8Cis4cntHRHNrKk5VfnhATD1wR3YoKzt6XmswRFQmYGBvWmhOckx0MXx6NmNxdGhFK0lLclpaZCV7MnVXWkModyYyckswTD80NHxLR0xgWS11CisqKkM8JUF5empeKWJVKiVGaiQpM09AQ3NsRHNuPD4jdVRBVFZWK3l3e2daI2tDaV5fJXpIMU08dyR3byVSKWxjIzUtRzshfWIlWlFITHcxCitfbiYzezQ+NzBIMEtOUHhIYHx6en5jJFB8ZXpVbTBoakc9Qm48JUFYenVYUkRyRSUzRk5nPUh6a1Z1RD4mU21qLTxNUGhYVGJFQU53ST1lCisxI1hxdWRoN1FCd2g+U2Q1R35OPn1OMUE0OUgtYEdORURla0t9Um5vOFNDcTJ6PSZvXjtgSU81YTdreDYqTD87JUJSOzxAS300fVN7cCFrCitfUCYjZnkoQnViVWB8QUM3dSNhaW9xT3d3IzlCQCpQJUNeKTtoI1hlI0tJa0k4aDR8MzsmM09yO2xWTkA/Jng/T2A0Sy1qbmxPMFBPQ088CistdldSZHVNS31INjJiQXpOejJGPmVOdlA+RzxYRj5ibHhLflk5cGN3JnFsekUzYyF8anohPU5AaXZlXmpGYkh9aXlZUFBYZz4pUHwlIVpZCitYaXUpWGkpd3BXRkpebzs2Yik4Oz1SJTZPV2FtNSFMOF8mRHd2R3NzR19Jbj9EYT04aHBrb3swbnwwU2g3SDBwPDMrKntARV48NkVzTW8mCitqbHFfeTx3SWJTaVNaSilqempUMmpLKkpZVkU7ZnMhdj1INWBlR0VSYDlQdHFYbSokPzZPZzRhVHpMRiYmLVIldig4WUlwfnJyN1crTGFhCit2cj57KjcrZSVON09gUmQ8Y2I4dH13flN3Zi1Odz4lfCY/clErNHJxSH08UHdDcElYan4lPF5kJTAjaHMtYV9zOVRublRncUlXWVY9aE5gCis+MiRrdGdqaytyPmNPLX12UUFELW13RVVTTGEyMUs5V3pkKXB5MjcmOUdRT3NsSCl+RT9jWG4lbWkoMnFPaiFtP0Y8Vy1gakQpSDFwfTVkCitkQ2g4I2EtcjhEKW0rREJFRGl2NihLJUtmbVctOUU0MWN7NEgkcTRpPFV7b20tMiFzeUI4Q0U/N0B8JWVZUUBPZig3TUsmYjEwRGE/TD17CitDOHNMWDkleEJ1KntLPnU4OXVxWSQjX1hLNjRNUSY9ZXZfbSNAK14lMGNmPUJaRWZFTl5Ob214UU5NSlpScWI/cX08Mm0tWUpqfEUxcVNiCitUQU1mbFZ1ckRgJCtFZkMzRDVPXihFNkA7MUF9cnxXdV56eD9HZD5Sd1UqYmd8eVptcTJNNGIpMCl6RF9oS0xqbnFCNj9tOVRfNkhYdTYhCit4Q3ooPkpVfis2KVM4TTUxXnBPTSVzZzslZ2QmeDR+bmd9aTFuVll4QyU4UV9HUHh0ZGRsOE9tM31GcW95MXJjPCl8TWxlRFolRU54YzAqCitqJFFiZGhrRkpQSWpwczY4QlNadWNUM3s7cFl2XlNUQGhWN1B2NHZ6X1NxT1UqO3FIRSlCPWdZVVBYT3ooRCVwTTdlMih7MCY1ZmFjK1NoCitVJG45REY4OHlwUnN8ajV1Mng0RHx1RCkkP1JXMTF7RUpaI1Axaj9CXytVUkZgJHU4V3tGY3xjb3BQYW1Xe3tERz9HP2EyKUJtTU5kY1NtCituZS1vRSt6X31lM0RWTWdWKmBxUF9OTT0jJFZlLUNadz9+fns2fEoye3ZucCo0ejcjcT1rQCpscj5eZEctX155KX5ye145dWIlajM1KGE4CitnNCswK0xYSkN5Sno2NjkjKlNkYmRpQV9rUTMwc0RoYz1NUmxjPWNjSUJGN0VmJjhkS056VWQ4QTFjcW85Snk2NDM7QyZMezZ+THNmb29zCistSGRAZSRPOTdLOy1AbGVZTk5Oe0dMQWBLSVV+V2krfEFmUEpvTHh4eVhCK3o3dmwlSWVzYSgofmBONSt8PlNFdkBiWGtwS05ST2Q5ZnpSCitRUFNKXm9INGF9eXBTWEVfN00hc097cTdXPVpfV2lzWXBvKShzVyhTOTtOUU9RV2xpT1J5UXxBPD5WQ1dBTXx9ekJeYSZxNiExT2hwWj1mCitjMm1kPWVgMDRTJWYyM3kqYHkraDgtRGhqKFhDbVV8VXBHdG9feEA4Z3Ewe2Babn1fYmhqNnJsPzZoSEFYKEB4PUhtLU8wclNKNDF3UXNUCitaMzIwUFR1dyV6PT0xaWgtNSVVZjs/X1AlP1lZYlE3IV5iX0RXWH09WUt3aX5IdEkyeH5YRDZeJmRtcnpjaC10NkMjWHpvaWdsUmgmc2JHCitlZypYO1hZVjEpa2JtbEtDZ24pJiM0VyhQVjgzMl9zYCZ4b0Q0JFpEZDBmRF8zYGZfe3E4PWNhKFltQWE3PmJpaU10fkxrY1dHSURoQjReCispVWclakx3VjlpPFNtcE51aTs7XzQhcCtVKzQ3Xj5nYVN9YFUlJjMhM2pvR1MpJUR6NGVeY3NWWTB9VT1reDUpOVFFJHA+NE93dlF9fFJ2CitPMFAxaGU2QlUwYFYlVmdCUkdQV1oyR017bU04N14rJCpNXmojbWY2KTVCK0g4aTJIbV4mMDhVdnxlVHlHQGszJEA+Nj9vMXJgZGxyaTkzCit9ezAwbyo9TjxQTzdSe3ZLdHE8ZUN3ZDBFb3VgcChibilOKzQjPV8wbWhKIztEaiF1IzxwOG1UaCNXSit0OD93PiR3NnU7WW8hZ3tSY2xTCis/Uks1dSMxQFohZ3U9YEEtP3B3VFBDQy1KO0BUUl9UM1RVOTY/ej5VeD4pMUJCNjVBcWg5O31scCVZfTZBTDFAcDElcz5wQjFkWFJhZWwmCitkMG5RYn0kJSloSVhAezRoKWphOGM3Y05GLWxYWVMpPiVJbzRmbj9nPndUTjFraGtFNHw5QHVlUTw0aT5Id351OWhrTFZ7KmdsUGBqYDtpCitOX2M0KThDWEooQzRKYkFIRGZuIWRTMz8zaC0jNHtrfGNkaExHMHgzbn16RDhzUkUkKm4oZVQ3RmRGZ3tkflVqPCkxYT5xIXZrSUtQZWZYCitBPG9Kd19KbXpRSTRqQmtsJUdjQ1MmTiE1ek4zNFMwIX1BdSY/fFV2bWVvOThfP2QkSCQqYj8peShnPFpzMnVoQlV7PSgjNGVII0FYc0FxCis8by1eSGJoPXotNng8Mzlodz1ZcldeWWp9MDtOQ3pGZjR6YzE1Nm1ifGkkRytpNmp3XjxMOTVaPSR0VkU/K1VCNG9KYXo1UUxPaFZkVXNWCitnZEphb1JueFA2PTMyUkluPCRhZFktYH5QPHxSclAoYTFXbEtuU2krMWpKTTFUQ3I7bEN0U1EtZ2tBP3hab0ZWaztOcDEqQT1LSzlNMF9ACistPDh3JCsmQ0wmfUxfZFZ9N1BUdUxqT0gqYjFUWkt3bXlQWmdTWjZaWENaMWFCemhGVkVIK0BpTjsmRVBRY1ZjeTJXK242V2lQK1E4ayZiCit2ZXpRQzxaKXZ0RFN0QWQ9Y3t7X2ctOU9sJnRQeE5AeF5IaigzbEokTWBMfDAlWDE1dXh2VzJ2MEJrSjIrTmlKd2N0czU+LStsb3REX2IlCis9dDwoelZEbzN1SkdyUE1qOG14QXtkTk80bHMrZDlfZ2hXNk9XRGJiWV94UFF3an5Maz53O01KcSpASyZobjV1NEhkRW47Unx9LSNucUVwCitDQ2NWVUwkek9aSDRFXkgobUZ6UTZUTmIhU3tMITxzO1YjTkdeRzIkTFh9Q0Y3dE09KktZP3RUTkIxTUxLTlpzTElxZ1dHamR+cX1MRSM0CitGdWxRZV9CcUR8YVo7RClNJWZQZWxBcjVISXJgOFowcGhzajVpZSFkTnckQ15mKGptT1o7dmZLUX07UEdlUDxGSjV1e30xcmdKemZNej16CityLXd6Nj5BIyEyYFlzZnEmXmV6Ulk3SDRRI2NtdGllcEEwcGstQ1FhQ2VrTEhhPz00PW5ucjs5T2RxJF5PODxMd2R5NCkjX3txYiVqIzhSCitXdzgkai09Vnp6ZVNfV2NQYmxiNz1JeWclMV9mVDl5KEZlcloxZXNwX3g8NjcpIXp1RkQmbUg5bHU+SE1TJSk7Q3EpZUxgelVDIz1ud3tHCitgZjNeYUJpST94ciplUkdBTn18bmF5VjBMc15wcDR3XlM3ZXI5Uy1eUFpnemlFZE1+PkxeIyo1KjFfREN4Szg+UkVVbSFEc2FYWDVKSEJhCit3P0ZoQXVwMTNANHc3ODREbTk4cilKM1YtVWFxK3ZAajFhKTBJRzxQK2IoaHc4S0xYZkxEMzFtSXwwd34pVzxlVT1zI3Y4SChEdnJ8RCpDCitMfTNMe0Vad1pBeiFYcCZkP0l3UXgjbGt7bWFLdlg+WTt5MShDcF5fPzQ/P0szSDdNWGIzalRNKCVgeGZCU15mM2JqK15RUkx4bjhteHB0CislUVdxUGlVVERWPGBKJE5OIVlJbWRXYzFlYTY2K0FHJFNsKEtFQ1JvVkdlK002cF5ARnBiaGlsNWQmRjAxSGArN1lnQjk5PER4JmkyPXQ3Cit8M0p4ZiEzaiVyJilkM2ZEOUN8Zk1XbUZiIUdSczk2V05mP1o4dF56REEhTG03OWIkITY8K09KbER2ZkomNiFQWDF0O1MxNXByI2h1QURyCit3V0t+SF83Ryl2PFN2XyQjYnVYIyViTDA7OypRNXA0e2NMbCF7fWJnUCRJSzBYe18mKiVwd1pMM254cCVRWks0WWJYPW8lOFV4fUd0O1hvCitrWXB0dnIhWSY1cWJHMlUmS2k2MXRNbTx1Um5Za1cwQClvK3U7S2xLe09IaHYlX09fXkpxcGpRO3R5fUVHZGs1fm5EPj9SPWhXbU1xQSkpCitNTUAhcXFAOShHT1EtVFN4NHVmR1lSPHZacHR1VHV+WSV4Nk1BMmFec01EV3VnTmMydXFDUThoQVBVV01gR0c8UypsKFA9aVBQck02Jnt1Cit7S2BjO3ZwdSVNMyg9eVh3X3FvNzJONVhFPkgjfDNrMG0kckplRFNpb3x3Z1UkUEo5YD1YI1lURTFmYEBNRzR7KVoyaW0oS0o8bjRXTFQyCiswVnJpaUxfPCMtZk9lTik9TlBYPEwhOThTdTlOS29ifWJiPWkpUyRSalomY2wrPjJ5eXJybHk+KUUxe3tQOXp8RUNVelBnclZrX215XileCitoYC01ZzMtJmpEWitEdmVORGhmRy1RQihtVCRWSGdCYUhTWjZNaTs5cE9zJmBmIV5lWFZGciEoclV3eWxYaVgoeHtyKnNldDtSRStXeX5CCit2KlBYNUUpbV4pZyVafUJeIVokbSpeLWBxbytpNmp5Zjgyc1Bib18/OWpWMURTen1oaG1tI0Yre2xTZm5ZejBzaWhfb0BhJlFqTlIlZ1pGCistTWVgWCZAZT49TGQ8aiFlN0BzM1IrZmkkJHo3ZGk+V2BObU5HRmlyLX5NeWZCZjA9cXtmO0RgKEI0bSlkQl4/RmZtLT8zMXdAelh+NFkrCitDOyMjfGk0ZDQ5P3NeWj9uRVFfKzJqYFlCU1VjZFA8c3xPSEgrZ1JKK3VoWURodVI1KkdLT1NAKilIUW12aGc/KEBePUhyOUVaYSg4NiYtCispb3hzbTB2dGp6dSV4YzZKUSlDdXpMKDlPN2lNbWIxZzhUVnBDND1AYEJhY2wqWGttST02V1JUQkpWTnJ+dyomYExFX3R8RGskR1BzOHBOCitwRCQ3NFZOOUl9RX55I3hVUlMwK1BDO1NHUiZfVEYjeClgNXh1bVc3bzBffElkaHYoKUx4fjNfe0k/VHxgPTtPUGRQfSk5eUgtUi07aShzCitkO1p0e3JwU2hrNU0yJUchbGdXajB7RlklRUZBbVprUS1XcnpaSGZgKjE3Q1djYVcpTlYkeUNMRjBGMSVgalc5WVdwTV9RaF8tVEx1NnpPCitPeGE7anlec1ghSlM8V2R+I0VBfF5NIXIlPUxlPm58Q2dCV1dvNkFMJEVHSnVWZSQwS2hebzdKTE40YD9ZezZaRHxAdnlfJTBxOCM4aHdtCitPbGVWMEdjbCQoLWhOWlkzU0A/czs5VWtEWHlON0xtd2wyUDtZNkJVMm9rd04zaVdyWm5OPnUtUWE+VTJqKUBUJXNNMVUqX240IWlkODFFCitkTFk2YllZNU1WaUhtSkROfGhka0RfZWYzc3ElITU0XlZ3TytWX2xgOThLKzwxI1d4M3MyZ1c7bld6fEBmNWdeZiFaUFNSJWE0N1BFRkgrCitwUDJmcUVyRjxXNmRaIyQmZkJwS2hKOX10JXR7JUIzKWV9ND1TSDVNPjA8NFVFLSVmRzFGd1p1TWE/ZlJ7Vmh2d2loOH10N0FqRzUqTDVaCis+Zzs5NXUjdkEpOEF7TGUxdFJ8fkV6YkhOcUd7SmNmZzBlbVBTbkhZIWc2OWU0ZSh+anNvNyhCbTYyOHkoUiQoJGQzPCt9fVY2TkJzVDQhCitgckFrdHZ7NXhpcDtheyshJihFNkJTaFBPT1g5ZFdKNk59Vz1DRk98e3s3TWQ8TXEyOTYydEhuSHcyUXB6eD4jTlZrQFZGKGEoQHYyeyZACis/YVNWa2cxVklIWHtVUmI+YDFka3hvXilhR2BNd2ZDQT40IWtZTzAlOEI/bntOKHxVd3sza3p2SzB+c0A1aUhEe1NQKSNYRUdnOGdxWT9jCis8TSZORUl8cllGcDBscFV4T3VjTWU7MndaJlYyKERLQDF7RlJrPXNwWCQ0aHRUNGZaZ3FoJk5rRFZ1czR9ZT5TQDkjYmpFQ2thbWM+U0xACitXM2JlOVVzVkFwcjlTVHVANTdAaEQzRzhGaVEkWHJVZzJUSmA3PUUtR0dDbEModGtLVEJfdEJHMCR6dzxoN0p2aHJSNiRSZSlabGM9KlhNCit0SkRVQzFLcz97ZEE9Qj5FYUFnYyV4LVZibUpZbVYtZzBXRmkwQ1YzT21QckhWPTRecFhYNlVYI2Nra0UpRD4lZC1zKjcyMFAyejFOeX5ZCitxLXl3TkVlcTxzVjV7WXEkWi1XSndyLXJEa1NTbEctJWo2Pk19RT5eRnl2YmV5aChuWE8kVWQyenYzaDlee0I8R3VBVlhtZ05jIX5POHMzCitraktjOWZtQEJld0R7M3ZQO0t2Qit3WmJxP0sma1orVVo/QXMqZEh6VlQtUVJmREUhWkc3JWpjTTtOI2JlflVlNGd0PjxMfmUpaWRiPDlNCiswa18wRzdjZjRrXiVXQEM+SH1zeDt7RXJFaE1fS1A4WXhCeXw+en53a2x5VD92fCNPRlI7K3hOMGJkPHhKY15FV15sOXFnbHNjN3c8UHdsCit0PEo9fkM0U24jcWR3KGI7Z20rdj1GfXJmWEg7bTl4bFhITGA7Oz5Fc0YyKz0yPmVGKGQreGdILWQzNVB0cF9ARzY0P1M/SzhIbCZRWEtNCitTZ19WOWh5NDdDLWBaZXVNRWlwXlhqaHxtKGUjU309cV5+VSZ4biEhNlFHdFVpYG5ua15fO3piN0Z+M1c1V2dMQkhAZHhgaUdCZ1NAN2NkCisjdTJqVWM2MzdXOFhHUHFXZl5pN1BqQmlKR0UzU2k4LXN7JjxQKFhnWGNkR0xXKGktU3Z+UnJYRSs5M3hkUHI9bkZVTDs3c1lBY0Z1c0dqCitJe3ptXi12M0I/cno1Yz8jYkheSlQ8K3dDfioxITshWEBhTX5NOEM/YntiMHBZeUV5Q1Q/eUJuYE5kS05vPm12RWhNWCtBMEdWP3J5WkY+CitBKEFJbDZmfWpHTFpgTzlvNTR6NThLTjNjcyEwY2lEeUttLTE2WjFQJWIhdDUlISota04wYz41YVB1VEZsWWspZDRUMSpGUGpkYyNPZylzCitkTmFkfUNvXn1MU3FwPWRlekpsP1c+cHMkdmstJSYpV2lWYTxkTmJUY0JxUU0zeGphPEUlYWdaKXUxJkAzZGJDIzNLOEQld19DaW1DNGtKCitEO35LLWoqcXVtdSp3JEh5R3wqYE1WKig4KW1mQGdsR3NlQSFfdCpjXzVidmVfVmdJMXduY1hDNndgZiVsYDN6OUs8N28+VmYxPjw8N2ZyCit5dV9GYnhfcl9CPU1BN0kpU2F8KjA1aj1LdXVSV009REBaVjswP2tPYnU9N0p0YF5JK2BFU0pnMDQzKn5CZk52SXYtQ0VgdDNVUU9kNlBHCis8Ymg+QjAhJXd5X0hRQ3lUYE1yaCQxfHlSJmJNO0lkO0JeSkNfU3FSOGhCNilAI0tNJjdGRTNaYHhpc1Ejb05wQmk/ZktSfkhxbnlTUGUpCitIejVzU1dra1VBVyRsPnB+S1F2T30/MnwyTiNYNkFAV2NTJDtlbkFueFdoUyoreCRsYG5uJnwlfWN8RlBZJXlTOEl8fHtNWE8rWTQ0Ml9RCitrKXVIdVRlflEtRkxyUzQpWmdsPEpeaDB7X2lLNkdMbXkrcjdJOzQrOGV5JEhqM0pqY2FTPD1MXnteK3RJfjIoeEVIdlc/T1doajNzQWt0CitlPjVtYTZgMnNAfigrXmM1QnR5MV5VfSgqSE5iTEM1NzItSzh0Izk3NTRBe0MpQy1qcjkqclBFQmYtb0NreElPUFl5WFNAITx3R0M/Q3hqCitBblc2JHghNUtafHs+KXA1T0QkaStqR080JjU/ayslZnhJMlQzI098My1GI054UDZOc2pYWk1GUD44STl3X0pmWWs+WU9JIWF5UFJKd259CitAZ2FZJiVNfV54d0lQTXlFYlJxX2w5e2p9TWM8V0FkKllKa2oqPjxVZkEqNzxUQ2UpPDdfIz9PZmFOQE1RbytzV1NMP3kxZDRKMXtRSilaCitUNXszTy11M0Q3QWtgc3IrQldXNi0kJSRWam9jSEB7ZUozdCk+bUgqe0p+I3h2Qjt2NWkxKEUjfjBQbT5+SzlwcVVtRTQzRzJnO3xJNUJiCittUkpBRkZTUWlvLUM/OD1qJGFBbTBxKHYxPW82dGlWVVcyeDFQJTg+SHV1Qlo8TSY2Q2NpKXx5eW18WFIjXiNSU0ZsKzFnRG9vMTVRQmdjCit4ZzVOamdxQTBJPncjMkRwWVZBQkdfdnUjPmhIZ3tlZ1A3KzRHdWd1TUVMb2QwQzxgOXY1ciVtaW1KbCRaZlhEaHFmRDBTZkZwKVh9MTNRCitrV0BEUXd7WlMyRlhIZnZOanNLeX5oQ3RzdCpifldnd3wwWXpAIV48LTNhWXpSaS1xMFU2dzQtWEIxQk0qKzA2RGZCelJEVTZ6VW57UDVECitWYThqKkB8Kkl7Ums7JXEpenFXb3E3Y1dBfjh9am1+OFh5WXBRIU9rcyhlYyE7akAoLSNlMDJqRD0odip+e01udyF0UUUzOV4mJnlaRF9ZCitNXns5N2pvYjlSWCk0TWR3UzJTbj49bk1Wclc8KmpnWUFnNXA5RzgxUSY7OD51U3lPMXZ4S2x7V2shaEVQd2gjU0IqKjBpZzhlJUQqUH1mCitQKU9ifTtJMCteI1olOzRLQW9fI2kjVSlxbExuTWdgUT9MKXkyIzVwMnhQNnFlb05INTNZRXdBeVpCQmw5ZmB0TVNpZUpybnpVKiFTdmAyCitLRTJTbjJTPXN4VTRQRHZtKUxTfSlTNmJxcUp+YSNeSVcmVHVXcnI1bU5CbGUwUUVwTElHNTQ8U2dvSy1CT0BzUHVPb0sqfm5FWG02cz9XCit4RFRLREw2cExaU21DQWB+VD10ZkZVS0RMaj5ja29tRG1VOU5GQ0FKPStpJElSU0NhUkIlRmJLJCpYakhTWXxETnhuWVJUZShIZjFCKVNjCis7RWNATkZnaFEkTjgjaShQfCROdCo5dVFKZ3BGYHJ7aHl2X2FxV2JBKEJuRj9nWTlrJEA/R0pTcDhqRj5lUD5OPGR7RyolTmBPblRgY2FSCitQPmllWVF2SHw4UT9DR2d5cjNhVURJMTM/fEUpKyNFV0UqYUlWWVdle1B9SzZNfChJd3ZvZlBYcDlyKFNgTXsmXlJhYkJWJUpkJUVNeX5OCitAbVV6M0lrWjI7KVF2YnhDV0FHLVM1VWZQX25gbX1QcjIhdHglWmxaY2YhVWArdTNlRC1LcD9GWiVEP302RDhGUiYpTmlIUn1Qdk1LXn0mCiteXks+M3txX155TEV2NEVzX0RTPkRfS3EhaCFiWkB6TSUzWSVaO2RFNHBSYDdeMyRwTEM/fUFPZkNsNXNHZn5zUihmKj84NiFNTUpQe3N8CitHbEVtTnU9PVpTYD05V2xUeWleczNpXlg+clRzNlhCc1Zeak1Wcy00UGk/dV9ZWlkmUXc1MUpCez8/Q0NiKV4kTzFPaDRAVWtacVdqN0VJCisjPSYyZj1XeDJ4SF9zcztIemlFKnBoM19XU0hUIWxeeDRTQzAlQjZCMThwO01OXnA9aX5fe0tSPzBvUWlGYD0tPl55WT5JZ2lSZ2woR21UCitKQks3ajgoYUhrP1pFMHk0U0hnKypxaChxbHNNSlBQWWBQZHhacDlvc05OaytHJWxSYk5sayR5Pm1UOGReWXAhJDFAMiFXNntJY2VGb0A2Cis0P0VJUHp5MjtOYz85ZCo1PEp3SE8qMXphRzZ0QkdORDIoTXBreSZFZVBKbTxsYnJpNlBuP2hxYXNtXiMjMlV1MXc2fTwqUzJDYnBVaDNNCit9OVhuJGBkNzBuamkpdXhWT0xSfUVoYnNPfD9HejV5IXQ4NzBPYjZKJk4jeihNSHNMVXBQfT9gcWhPdXF3JkN+IUhDR0JeeEBNc3VJTkFkCisjNVJEKUo8b3FkMCh2djIyfHYjVzB6cmFxfWxEY01NVWpCUmZ0SkpfLUxXMm13Q1U1UDwjYDgtNT5mS0F6UlFFVlJFZmExMj07KHpuP2o0CittcD42SF45ZVZBciFoc35FeEl1SVo7M0REU05LNHMyeEJMVWxXTmphcz5ZPi1acmBvXn1fO0plb2dzMig2dkRLMll4MTI/JiNxaGg0KXFYCitPKndLejk1RTs1Zl5SSFQ8PWRFYktZJHZmamB4PjM3eDU0YkRQPn1UNUZiUkEjZTxDa2Rle0d0dyN9SV9vRVFwdH1LY09ARFFGcWs1Jn0lCitXUyt3ayk7U3NZXkZiZURjUjxhVz1yWTFVZSZ3OT9vNEB9b2deSTArIU8hZThDTEcpbGQwbChyckRYankocm44OT1GK2NaT282OVZyPENNCitXajRrMj9vcThTSGR2V2ohaW5kSWlSTSp+UTJLU0IpUTZ2S29CRWJgM1crPDJETDxkTkIwQU13S3o2JTMlezFGQX5xND9sNzR1WjUqWl9PCit5fWI+MVVCWjw9SH0pIVRoS1JyaS0pUjIjWT1Qfi1+fVFHfGZ5ZXc2OFNiJHpMblZJMUteWmlLK0h8OWwlO3t4TCgoVlFQI3QoWnhPVzVRCishPkhxP0h1ZHJFYXxDcCU5PTZqJS1CIU0oPV9OPT1aTlUqPGVOMEopdCo2bVB7PihzVHJ1bjhsX1pFJXZhWUw/K3FSczhufGctenp0VHxECittcVFZUFV2MFojUCtGfWQ4TH1xUCkhYHFWJkc2RCYzQz5LQjdwdz14e3lje2ltTk1EJT0+PEM/cllxLUBPcHtIJEZfY1NuYFNxJSEqIzZ0Cis/YlNrQ0wtejNeM3QkQCZrQkowbjtBSS1Ud0MpfGNNVEBUNjslaGFtcS05dkdOWEZFSHRBVD1HalApQ0V5biRSclUpM3E4anx6ViYzWVJoCitJbntBdmhzLXtOVVhWKzF3N05wfj5Mfn1ETmx8fm9PbnFrV3Q1RVdJP1hfM2FXSWo1YW9JNFFQJDdjPUpQYDFVYj0+eTkpOTZaYTZ3R0xWCitAR29PVmV9NSsjYlZPfGVsbWEzRFBtTjJicStuUVV3S3UrbEpQPDgmeU9WZWZoeU50cElNd34ob3ZGPkd+aGw2eTJ6LUgqQXg+KXU9UzRxCitpcHNLbGIyZy1QPih9QlJfSnJpfjBIPiZBQldJd2xXJkgwcEFZV3F9O1d+VjRMKnE8anRSYmluN258bkY2eilZP05mfEotVHlpTVR+Xil6CisyPUYtOXAqcWlyNUp0aCVCMU5FTH5jdC1gJD5iUFhSWEFFaF94Q0xaanlGSEkofHIzRTchSFQ4QUU0e0BEZkQ9MDEpPzdVPD0tfVckRDlLCitTa1YoNzF4ck5aMGFjcHYtR2F3UmpgQlFpbEVpcXVKRDNGeHM/KjVvKTFkKmspQms5M3NPflZNKG1pLXdRJSQmKlZqcTZHXmR+aUpKQ3Q4Cit3cjB1ZFY/U3xSNDBnUEVFUFJ7clZ1e31+fUNKNWNMZTIoezJrNiN7cmZBc0J9bGdaMkRja2lSSCtUJFljRDAjeSRvUW89ck1AWG9QSSpACiskR2BfcT0oYzJpM25MSGRMdChBX0piUEt7cVNyMzNXemNGb0ojcXdiZ244VFJuY05qbkZfOHh5cjVFMEVkN15hZEhQKmZgWFU1fn1AOTZ7CitSZVk5c1VFSkpHTSUzSnl1fV5RdXNrM3QwKmA1UFU3M0t7aSZ4fnk2WDBhPj4hb2hlc2lrQ0V1enBKTTFkYkI0NkFzPktKMXphNH00STBVCitfNlR5XnRmWVIodllNNm10P01hM1ZAJXFoSyVFRGRmZSkhT01BQkl7MWVlOW49eHc2Y1E9PVdPS3UpJCtBV309KCVvdGhRQExBPk5hMj0mCitJUz9sR15TPypVanR0Nkl2S0l3aTRxRyhaTGB0X3FiUnRGTUppfl5gTmIpKzl5SSVjWmVFaXJMeD1nKT9zS0wteU4oI0hlNmdNOSZ1UHdVCitGSStMYkZ7N2h+Vmx6MGxPJUNmamhnPVFyfWt8MVQ1SDNpekRtUzBjX0h2dVZePH1DNz90VypZb2t1ZmRVYDtNX3dFaEBYUFgmSGkpdUFMCitDXlBBMlp8TD0mbEx2XmNwI0YjbUI9KysrKDFDfUt6e3NJWjwlTEQ3cEswRTVEcUwkeiVhaStvWnhjNz48RFZqSX5yWkllVys0UX48b0hYCisjO2UmOStMPWNOXmh8WiMqUENiQiE2Mzw2TS1wI2ZIK0tiLWNMfj1MaHpfLWt+KW8tcVMjI2w9Z05zZ2UrSVAwLWU/S2lSdGpfPkdAZ01eCisyVkt6ZyNnQit6Mz47bFJ3RCt+NmdtIXAjKDxuRTBKdSFKVHV1Nmw5PT1FNFcyKnhQRFlmK0kjZSQlcmE+RE5RVXxDSGBGRjhMPVBMZFNJCis+bDwpZFZxazkpaj5OaT89bmcwYmRlfEUhRSU/VCUqKWw0JSR1dS02SWp5fmVDR3IwQ0N7XmVEdXpBNDVVaXMlMGVndEBjS0pUIyFlPXkzCit0ZUpIXzJfKWpOQTttNT4+T3c1NmZVIW9Oa3hQQGRCMjRqbCYxTnthck92QnFSSFZjZHNqQSlPV3F0b0t3OEBTIXlGWGJRO2IxODRfekd+CitYJWxjamFnc3FGQ08zWTJiT2UkWDNjSiYzXlBNZHJ9dEVsaXd4PFBlVnFeNll1Kkc7JCNePThQUXFNSzNWOUE/QD1EKiMzT0w3NmRkakxaCis5O2xOYGFXUEthOWxLI0VePT5oVjdONks0aDhpb0dhbGAqeF9VbjFzVjs8SERONnRZdkYqTjdNPGhnOV5wQGZgZ2BudTktJVM/ek9TKjBeCitzUztKRns3SGZIKn4ybS00dEJyeDkoYD5YNHhFMDNWcjclb3otIyQmU3ImeWtTK2A7ZzN1SGdwcCp5fntFYmV9aEhrP3xIdG41STlLJCkpCit2SEFEZD9FOHJ2b09+bUZFKHEmNDtrNGBnViE8fn1OdT59SG4/P2FKbVBvZGtiR3E9MkVfV2EwZCZjSUV3PE5uISh6Wm84MzA+NShaTiYpCitxYWtHa2BYNWpIK29RPUxYQXJLV25jZll+QT5sZlB0KikjS3F0WlpabUgoRCMqKz1yPn5Jdjhtcnh9MURrNkUlUGkqSlVra0JoZj5rZSNzCitwKz9RUFNFSWVFakxWWiU+ZTU+RkpvfE1fVXcyNVhPUihFU1UwdVFAUENHWl41RDxYdyMjMzM4KXdvdDhgWlpYPGdLSkdJPUBUNnlQRG8zCitEMldZYkNrIXcxaD16Z1Eydz5rNm1afWcxSW44LXkqaTNQPD9IY0FZXm1geHs2eE18OUU0ZEo5KXhHYyF3VV5wXjx4d0pscUFLKHxyKHRfCis7a0kjT0YhSkQ7KWs2USY2YW8jPH1hc05Fc084TWd6O3RzLVB1dUNzdndfNlB6NGZiYG5BMiRrVDx8MTRFZHBgOTkhNmdPWktsZV57USQoCitAPEkoelNEQzt8Uyo9fFNReDV6LVdpeilhKWZKODhVKGxGdyprKlVxQmV5eFZ3SD12O3lLM1R4dD85WmJ4dSY4RUlibzBIVUl8a0B0d1laCiteNm5+RDFlfnZLJC12MW8qcSN9VGc5M1I5JiQwUmpxcGl9K1ZhLX5wOTBBbG1iczhqN1M2eWsta3Q/TVRBWXZEYjxSOCF+P3tzamE8QG52CitsQUJtPDd6NE5Oc2JlJXpxQlRLaz9HNlBgZjhONzktVWJYfG1rSmZqSSRebHVublZtdUFiRVJePClgNz9DZFRvPGU0ZTM2eWNKaUpGVCpyCitzKVdrdThNVytnXnFJe2d+QzUmNWxpa1FfYDYycHhmRD9edkZZUj9BOE1WZS1DfXt6IWd8Unp5WnFlX3I1KVRlS2F8R3tnT3lHSFQ2WDYtCitpUE1GVV9YNUB7T2FGJiE8NiR4X1N2Sz9tUzZIYz83ZXZOYHUqfGk/fldwYGZBfG9FcCZjMkMkPjgyWS1eMUhDdXxXKHotMlVWQUFVenZDCis5NGFVYHBmQEhJXzRXUEgranF4clVkTFlqIX16T3pkPHAqPmtLc1JganNOan4kM3E0MiFRYGB0MGFRZHYxfHNxTDdIP2hSekA4VXhVY0d1CitBZmorWUR6NF96WT1QJit6XmdmMXpRYF9wcmojZyozKXZHcnp6eCVlMCZEKTJBND1NYjJfYHNuTz97ZGQkS201a2JLRnVaPmUwQX4lK15KCit1bHstMS1oaGVLN3k9PlEpQTdUWnRnPjF2RDVEYTxoNSFvdDhqKS1UaENmZGxsYnoySHl6Mkw/NzA0eGhyeHtxZkRhcXZSaj48QGxTfFp7Cis4bGdjPmVCYXZ9YX4kMU56WVZjPil9Mj9jWTJOen1+T3s2RUVxQG80aDE5QTZfbSMkNjZLejIwYClCTk9vSShjfl44X3NtQDlYPXRMSVNqCiswWiF4Jnk0Pj5rM3g4fW5WNWloMXFUWDd3QSVGZFNhMyVhSylJJmZTaEZiMipjKE1xZW5uV2ttcSlGR0A4cjRxPH5PNCRwPUZHVVB0bXVhCisyYzlaNGQ3RzEjSyRtNkZyOV57NEA4anZgJV40UUh6Xm1kcGtkJkdhaGVMVk0yUFQxfTlJTjNGNHtWQGF1P1lMYlk4enV5VGY8SXgpUzlCCis3SERAT2xeN015ciFYNVVMaHdod25aUUNHdDB4PWl+UFA/ekN0ekt2c1NrT35OXjZhZTYpTnx4NURFXz0yUWwpWEpmZzcqPlJyQVY+RjtECitXbzZfe2ktb3ItOTREQlQhRkQwITF1UVo0WHk+MjxzZ217N1puQkI1KGZFKnQhcE0tVzhuWExYNXA+N0A4YXEqQk85Uj5Pa1FfNFFRVTFGCitNJC0pSCFiSjg1JD9qQnpifF9lcm09PVNAPjswc1RxKXoqfj1IKHdBYW92ZWtwK0E0RWxrRylAfW9iX3cwSXNWZWpMb3shQD0/cXtCIWt0CitVUzU5ejcjajZkRmY7JV5IVkBKeyg+PyNzTUdAYWgqcjNVOUNUYkBoOXxRVyMxO3tKZEAtI1ZVNzUray04TGVpNzxNd29hYEVeUm1XIyg1CitqdUF6VmNWNjhWenUjRHtre1BNWitiJWQyd1dASnUlcSZ7N2ZoTkc1Nj9ZS2MmaDg8VjdsayliVWZ2S0pBOTB9VDArZ0V3VGh9Ym4zVWBMCitII2x8MlBWamJadDFGMHUlSXYoMXgoVX0rNCluaGJoPmlFJjc7YktFV1BmZVdmbkEobEVSZWc7QEZpN3V+czFPdVFSP1NuSDtXMytTblhMCit4OylvZWFEUzU2RHxLI2hTN1QxTGJUOGZfbTBuWkVqSk1VVjkxU0hzfWhJTVNCYXttYXUydzwkOylWU19eeStAS1dfaURAKFpEZ3VWbF41Cit1dXE2dlFmT0BvKEhAKlZTJiFjQnp6SVFfdGVaSjYzcWJXfmhfXmtgfEUtQyg2bmNVYChBc15HRyQ1eVQ+bW9qN3dzI0hQISQqNDliNFUwCitwMyh0bFpObmVOUHB3KGxUKGBGNk9sKXJwNk4/VCY3Y1NYV3VHfmJMTSk8MEwkSjAkYj0zY0tkUHFCT0lgIWA0bm9oWiY8X3NSTitEWHBqCis2OylKUyNNd3h+bSYqeUl1b08xe1lfeVctZ0JybmRKRE5MJGxIfl5MIWprMiZQYm9IbjF7UGgrKEU1YkVZfjczT0tfeUBUY3ZASiF3e1dYCiswKTYyVHJ0ZillJFc7aTFJKDdrZCo4ZUJjNiEyKGdJZWczPHpvRUp1KHFSMDU5ZjJPb0BEWHdweGtlLSpjUXtKSUJoTDYpbHpEaSRzK1cxCit4MkJscGZFeTdNfCNae1M0UXtQelVRKFlEMV9eKVNsM3kjZkNpbD8/a0lRT2VUMjFtfFJtS1pjSHxhSXFvPWt7XnYmZEIrWigmfm94Kj19CishKGJZVk8rNXJNSCNvJjR7UVlmO35PSHdANlF8allROXt4Xm9mKkZFMUhoaGl6JXlwOGd5M25YbHxfTCohITxMbHdGaTNfZjNfcmljTHJ0CisrWFZhX1Y4YlZXYEg7OGRRN2ZvdV9fUCk5fiFfdWxfeklvbTl1MjZ5flcpdGh7cTdFQTRlKFAhSEEoWG51JUpnKjk2T18zYEdYK0VXODlyCisweThPT3AzWGhaNT9XIU0od2NUVG9SP2hFY2leSj1AZEtsYXRnanxhM1FtSn1URTEqMW5gb15IWDw/JUVJXng8byF9SG99dDxJOyRAP0RlCisoKmxpe1ZfMUJ1bUh8QnElN0JlQEFrYFZEfVJKVXV9N31URTk/YExgITJtQCZFe1Q1Un0wQWl5QT9RQmB5ME9gJHRHcjZkPE9TPTJtMWxKCiswWTc9KzhPRWdlcCh1aFNzVkAzTl5Fdk1taTkxQlJRUnlULUUpTGcoWHRUUT53YTcjTlJgPFZBRndXNUsoQWU+QypzNkhISW1ZVTFVc2hJCitXJTVZUz1ueEQ0OXtFUnJLeyRtYHpeNTdhSmhRYHw5P1FpNWZQJD5nM1BnT2VoNWh3QmtyK2NWSlU3MH4wfnBoVUR7Q0ZPUWFmQClsWXlgCis3QDJUNlo2QiNVbmo0Z3xKUiRoQlU/eDxeMG8/Y01yIz13OEMmVj9zKDsramN3SClJP0MxeDhwU31xN2VlWUQwO2x5S09ZJHM7YXJVVXNwCitrYmVXP2k8PjNkQCRId09rPDEjSyRlKEAjZ0xZX09OaDZyS0tAUCZPVTtJWTgqMXJ2M04yeyVPNXhAPyU/dVYpcVlkN0VjdTg8JlluaWRnCitOV3F0UjZUOGZjRHh1eW4zMVFAcjRBa0gzcVZQQUs+QFdwRGFkfm5taVRVb3JMT0h3QXR8RSthM3RiSDFXQilGc3FqSmB1b0k9Z1p4bi0+Cis9c0lsNH1RMm09ejRGJWVDU3hza0VSYyZLRzBOYWQ0b0xxSiZTamkoSzteZn5JbyVrVz5hfEtoJkBwPFVGX0EwakwqOFcySj5vaG0kQGgzCitwTXdVSnI7UDRWfGY9STdEPjFWPjRCTV5FK2t7IV5ZVkIhSWx+T1lHPHxIdEV7PTJFbXN7QHlnX0B7R3NtN3AyTiYkWCRpd1M9PjtEPShyCitAWEJgalA+RHwye04mTXRjanRJcG4rRkY5QjFFWSFvLUlJUXtmN2M8aHtDWlhGLUt0e2YtSlZAQG4hMlplX2xFa24mSDFIMH1tPGBEdWd0CithdEVZTzhgUElPMjleS1YyfSZkb0NDTzM/UXtRdCF5bXZCYiNnUU18eEMmMW9wbEM2VWRYaSpaUTBKNmR1U1Z8fGxaI0RoeWtrbmBvIUJ3CitmR3oqNGItJCEjc0x1RzdtOX5LfWpRfnZMfEJLYjc/WTBGY3spPiFnY0I/d3lzYT04XmltSjRxe3oqIylubG5jQzNpWHUpfXsjazQjbV53Cit8OEw2UFJeaC1AIUArTkEtT1pFNDZUMz9LJGdMPDRMZHYoYiEhNH5LeVVBdE5Kb3ZLSDl1cEhfTWVVUXFVbUpIcm1gT1RlTXx6YilBKG5qCitSPjlWczlOSV9qejJUX01WUTRXLXtuYXtGaSM2N3YyPUNSYyR6K3B+PTBEUVkkYDFzV1NrZmghVUw7eilMUSgqfHV4cy0rcGhTRU1Oc3FQCit3QlZ4KClXUXRSeHw8KTxLJElMTFN6JnBmWlZjJSs0cHpIPTxYKiFUeWYhMjdRZUxjeHoxLS1XaWNhQyZKcjFvZDlMa3hgPnYyWlRQUUZeCis9OEc+TEpKRXNuI1I0YEwpLX1EKDducGRXLW5VejNoRmdSVXBZUnR9KitQcT54aTZgfWNfbUF7RGFrOyYlR1A9dVlsNkBTMnJMQ2MtVH0wCis5O3J3dnQoNS1LKj4pWHA5ZzRzfXpCZXBIcENkIWo7QnVMJj47QCU8LShPKWMqT0g/aCU+TFVJcTFxYWN7bkpFZ1p6KFYtO3U1My1RcmRTCitUTFFWdWEpRT8te1R5QFlGIWh8dXYwTGVWV35WQ2Z1PnxNZnRkRUFaMyp5V1d+VkN4Z0VXXnErP21GQEIhb3BoVms1ci1aRHlmNEctMDMwCitkOCFRazVvdXR2MUJac0tRQSNwOTVmRXAjXjJ0JXdialFIQjE+cF51NT1RT0VMJS12a2wmO2dAdHtrRHB8d0Q5QUg0aVU7Kj1HQDtINSohCitYZX5LdmtmNEkxNW9CJSZ3cDg1KjBlYTRyQUtxXilncTZMejQzPHgycGskU2d0eyE1dTJAZGBpYjQyfU5MLUdUT35gYD40e2lYVCVtOz1lCis5MHJVK29QKFc9eU11ZXxYNU9KYmNNa0B4NFRHK0p0eWV4UkhDbFBSe3dVPkpucSspIWNgJFVfbURJWFpmI3JOckhnekJOTV5BPlFXWV5lCit7KVZVS0FncEZ0bHdRUVc7dEQtXmdPVmE8fDNfSDJYRGQ3a3hfN1B5fF5NKkpAK2NuJVdIeGJDczZBeVJCMmlMTE9sWDw9KDZYaHFad3xWCitQUjdKUjw2MXZTbTxYaTZtZUxVTVo2dUFnY3d5blcqKEckbUBgWkFAWE51YVQlfjZNOzJpZTxSWURaX3x2Qjh3WHMqJCVRck5JKlVKKjc4CitzOSNuYVI1d0dPQjI3JWRFY1VRVT5eNFFDI3ZRUEcrakpmPSUlZ2hCNHJPPyNPUCYmd2xja3p4Oyg1IyteK09iPnBDUmFCQyhlTT1aeT93Cit5XlRfcnctX0BVSTtnNGh0ZH1nJSVLXyVVTEtHQiUkR1ZYZ1lre0k5YTRPbCNqZV5wZG04ZDQ1MkokT2VBI2xlbj0qJHNjKj9pcmV+WW19Cispckl5Wkg2bnw8OzFuKTtnS0lmdUZqTFo2SGdOanNsVCs9UGFMMiotcHU5OHdWJihgYXoqR2pkRjtieWMoQE02N0NEeT08OVplaFpBKW9yCitJRiR7OF5Jengqc1g0P1M7KFBoTS1ETk4lbkBmeHw9bEBQOzRvfjwhJDxuITdGUV8paUZEcXYjUEdHQiQydyhsKDBYfCUkZk1YcDxDU3l5CitUNnU1ZWF0O3pvd1c+MkVOQi1JVyFMYyNJQHtNa3tuRWhVbm5IbDhiJiNsWXdsOHVgekBYMTl5X2loSFA3VlJteGJxVys2eiVhR0ZmMkdBCitMYzNBZXQ4Z2pDSDJJYy1FZzVtUkh4ODlSZm8/bEZpZHl5V0dIVyFRT0ZaNi1uVGB6RXF8bGIxNndBcURoTVctKlNuMXYqJUB7YGkrJEd0Cis+Pjt2Qk9RMj5aR044WDZ8enEkbDwpeGxmMz1scExWeCNHe3syezxKYDVzWT4kJVo0Pz0tVSs9Unt+cTZNVEFCd3tXUnQ+PTwhKWZjfHVeCitha3hvTV5TZ3IkT31BfHFtSTgtTldiaz0yUkxyNy0jTSlBdHlYUUYhVEk+aypZJXh6S1ZfdXJmMH4mJTZRVHY+WSs2b1BHR0Y9eHVAOT1YCishc308ez1aa1daSUFKMkxydGBSdnBDXmMkfDl7UUYrbnVheGk7VE5DbVUqQFF8dHZRbyVRPShSTVN5SnhTWUlEOVFYN21jbGghaHhedyN0CitoSm9DJXdJKHRaMDVPdXA+UzZGbiZleE9EKk5NUjB4fm5aO2NtQUc+a0w8S3VGMDBgRmhvPXk3Zz1UX3VqWGI5eyFiYzkqVH50RGFlKGYoCitJXlV7aWxQYShQQj9HJiZyYk5SRWFPc0RWclJ+KXE9fHdheCpNZkY8VVJULTd5TD0/P0o+RUJgUSM4SzNuQjg9NnZJRUhAUVotKmpkX0QwCitzVH57O3AoO25oZDVUcUJBKTYyYU1kRDtOfDQ8blVqMEJjYU8qKDlaMXtCUTElIVpiSWkqKnBibys0X0JkUyt7TFRhbz8hWHV5eThnPHV0CismR0w+SWpkbW9lajxOdTBqMSZRP3M3azJ4SXZCTlk+JnNWc15KN3A/b0pWTiVRTmQ2fF8pIVNibV9lTnEjUk5nbUQzTlEoPjlTUkIydS19CitwYlY4UEdIQik5MXBSVlVkMGladUxoPjUzSnd1RndEV1RPYTJXRSFTUj9gM1psWkxtJDtnS3lVVyQzVGgjdU5EP1hpbmZVQGxEKzVpZXNyCit1TkEqRG8qVEJ3SWk8K05WWURHcW8jKXZLaDk0P2RaMkJuezFoWTF4anskKS0rPkNRclNicDhpT1dzZFclJUFnVEh3ajlzQTd3Oyk5aCNLCitDNTVRVnFUR2xvbFIkZzghQTl6dGRLe2YoeVVkWkMpKUlSe01afS1gISVKI3x6SndVWmF1fWlSNSYhQjNvI3JjcVhhVUBMIVUmJkZvYilGCis4d35UYFBGJjNTPnxadTlGJm4jaExpen5XamU8K2lNRCoqejhIb0szZyN1NjZCJXY4Jjw+Nip6fGZhQSgwIVlFb3QxSjg+dCNWbkExV1h1CitzaiNSbkVAIStscjNgPCEzUyZNckppM21gOTF3VnwpNVhGTSE4SVEpMFpHSSpTUD9uNCttdTEwR1RPPlZVO0JXJio5N2lBY3dQM1VISi1MCisjWEp0eTVIN2crVlRnLWUlcj4yekx1NFEtZlJVV0BqKERCSHowTGsxJCUoO3srelZgXlRnNj82ZkQzUkExNEJ8eUxoJnxaLTUxJk5NNmtVCis+YjheZHVkO3xLNUhxYUlKbylmcUR5ezN9QTZTSmBLNmlsRmdeR0tKJH45am51ITQzUkdzNmZOZ2AzUVZOMUtgelV4PF4tRmYleD8tZDdBCitTOE8weTsxcUhBIStmKnR5dGN2IVl6TSpfdVJMNyh2djsrTnElSD5QZlM5bnQ2eDFoUCgoPWNWaUB1Yi0xb3A2SDRXWTgzRilkMU18TD0tCitCSCRuI0RALTNqUDhCRVJtN2VWdXw3b09TaCptVzBXfDEpclFPaXh0PTFGMjBoNWViSGxuYUVKcEVJcHdAWiZldmklOUVIPEwrQUEoZz5oCitranBoMGdlM3E8Jit+JE9BcWozPl5haiRwMG98X2F5JUUoa258dlpadVNuVio3ZXp5IyQqcnBaWG9gfXwqKWpXaCE/X31TMXYrfmtzaG0oCitHYHduJGYhIyt1ezZ7TFglU2NheUFGczA2SlZZRENLKlJRNntHV1J0TF8oPHR9U0R0VCoxemw9RytvWUV+cTt6OE8xamE8Y1hoYU5oVCpaCitnKikrdl55MHYocz8jakxoJXleeU0lSHx0YChBPWZ2UktITElCJWdSZXczdCR3dFJYd0xIT0QqaXRGMlg9dUZKOUdISGs0VilNdE5DKiVeCittVDVrNU4jVFFOZWROTng2aXVRb3tBRWJ7Y1JKcEtyOWAtKU1VezlRdj5JNGZFO1NUWi0tN1VqY0ljQWcyTUx3OTgyK0RLR0l6d2JPYWROCispUF5QSWljfmU2PEZCfiZMU05gZUdIUGo3ZlArYXtGNEZJQk9OdWB0aGI5aTdHbk1DPT43QVQmKSt9aVJYWH0jTkI9OVY0PV8wV0ZjX1V0CithZjEpQF5hMTdENE5nWk5oRylaR3c9K2B8Yj55Ql9KJkVWWCVvN3JObFEwbEd4K25iQDkwQzMqSS14MyktU1E2dnVJQEg3dXN4ISlhRzRiCitnKSp0Slg9N1A+fGBpXkV3fE5lI0QhfCVmM2YxNStOPHFQSD9XP1h0fCFkX24zJVNFZHViaThYdDI2ZihZXjclUkQ0TXB7YUpnbWVMM3JZCitYJHN5ZmY9V2JrRDhge1g/UHNnR3lDITJDS01LZngwaWV8TGo9aGEzZzdRSCMxTnNvKUV7S3UzNzRwZ2hKRzB3RXk3eXdFfmFUb2hFJilgCitffWhqK1lUK1JPcD45YjAoUlhtQ2RXWERMUyY5TyVXWSRjRStkdGQtNXM2OEYxUn5gJldWOEBURWgxaVJhXzlSQE10biFhamV9ZXkoN148CiteXjhRdzJiPjFGeH5zYFdJWD14XnV4Mj4kaE01V1l5TmEkRSgxaHlVJlh4KWBHPTdBNGF9P1RQdUhnRUM+Z35wcDMqU3RxdFAjP288aiFaCitoKmh6fGZSQSFzKXYzNj83c2FePDg7UzVUajIpNmNySHc8dVRAZXYjeDwzWmEtdT5qKmhLYlJrVDl4eGNZX1Y4NHFfT2R4RytlWTM9MENkCitRQXorbG1rZ347TSY9KnI/YkFWPzgtPDVFQjc2ZnY1SUpaLVhaYVZsb1Izanl5c0toamRoJTRTd082PExxRipxVFMqMm42QTJ8Jk10U1dfCiszKCF1IWZ9RC1RaTswPVYlKTMpLSQtITVwQFpJdWtMUygrK0hhd3VLc3d7UEV2OHVlTl9rfE5JPTBhUGgrcVU7eUVVaEgrJSUlPmdSPURGCis7UUZAVGYtYDJxRSgmWE5WWGRKcCV8VFBfcH57WlZIZ2c8KGRPPiZCc1pnRD1zNCpDPFZpI3I8bUFBbmZhYWI7dVJQczJUNXhSRGpzOTZtCis2Q3ptaEZiQ140VHBZVXhPPjdrZThlQlM4JGJARFFXQ2ZPU3lKcUxrKD12YkQ2eUUtUDhpaF9gaTgwQ21rVCZQN0VQPSE8dnZGJUB7T2w7Cit2KnRQLXU9KihYYT5lb3tjPnFmNDEzPTNoSEFNOSlSVUZqWHE5bitWYlp2RVA2YjZYMFJSc2soUkdYPUAwUyRZWVVRQUBQKnp1Km1eZ09lCitOV0A8WSQ2VEdzR3pXNVB9c3RBZHxOfWhQdFVmZUM5JUNBRFE0bSUhUFV4TXIlOSRBeWpuMFIkXnNBTEpSVn10fDZzPTleI0ZnOVV4d1Y1CiswUU5wcVkjIXxAY3NOWC1RUCtoKEdnOGdPTHAmWFIkLXA2cX5jIzJUVXJ3M2ZUP0A7YXxCezdVWm8kO3tsJTIrZGIzWUR1ckd0RDAtKD1ECitOV0JoWFk7VGpGLWUqej01dn5TfCNuJklmXiY/Jl4yM3c8TSY2ZU0jPWw1eDM3KzBLWXgjRGlrelVtNjhuRntoR0ExNSUyfXFRaXBReGtCCitzMS15Kn5QKD1lRDUkMzlyJnhNJGt4JUt3VnluNCNqcVNYWjgreVYrNilpZyRFX3pxLTAjLWE+WGA3YGlaVT1DRGZqVDwxMX5afnFyPEBpCitAP3M/YyshXzVgeF9XelVWKmBISiZsVj9xPXRNQ0A+US17P2FCVkRoTGlBQn1pZz5EPnNaI05BI1dqVnxRZVlQbXtfWClLY2czQXtqP29aCitDRlQ/ekx7UUdvdWNvdk1Ec0tPbDFJKjBFODZIfEVuK2V8LWYtKz18SFl1QVp9NGlyY29NODFBe3hvcUYwNm4zcWoqJEJ1eCR2QjRYey17CityaHJ7KDtoeDtSK3llTHVmR3goI3xGVl5yc2UjUjNyZXZNOENDVkVqZXRkP1JyemJ8SnsjRUg3TF8tNzJhQj03Ti1lR2c+YTZORiMwNlQ0CitAaHI3bXtwPHdITEYxOTl0MFBJdFgmN0hETjBNTEQhNkpvZlhhTiUhRXUkI1d3T2s0WHlhR0lKR0BHS0haYHAjXmZrNTxyKT5eOXl9UWhmCitwU0RwPD8wMDlgLStWME9IfWcyPnJ4NjxqdUtPUCk5KWdBOGtrMFZTX3hLbDchMmdvSz9RSCNXRDltaCRgXzkwaDg5aT5WJlBlPmBYR3FqCit6fiUtXlFNcDEoNWRMTShJe142c1BqOGFmWns4O19vYDNzb144UWM5P34/Q2N6a0t1SnlIYGlBLXlnazlVTEMjdikwPnlTQ3JQWHdDTmxnCis/RTByWGlZKVlIM0tNS2gpNypqTntLZ18mdU4zKEZjb2N+fkYtVzxKVT9HO2BZblhfVn5ANjRhP0BfLTA/cWFJNk5yIzx0PiQ1RkM5PEpICitBSy1Pez5WQm1FUUE7bEtWUHk5djFaQk4/eChWcXpDOWZRTn5sRkVHPEhtZ241Y1JRNkhlS1hjbFE4cUlMakg0I29jUFIyb3NAcnhrRUk0CithS0NuZUh5d1hmaFU+aH1LNExvNFN1ZFpBJjk5ZjhPQiNeKmNoTU91WiVfQypJKDlXY0B+eSVpQjQ/WU9mNXZ7SjhjND5RcjYkTEUmQUU9CitvY3NMXjZQU1NRe3lnOF93VDNscXVzYnpkQm0hJm84d2lZeERgSmVUYmhmKyU0XyNiT01xZWxlcmVyQj5OdE4rKkY+KUJUPCEtelUpWEs3CityRjBsZGZUSjhXSSt7cD5sPX5ONHg/RlhrcHBrOGlnQ2JLKm1nQVZKSERCTD0wUnw+JEljYiZ8VUJpVWRPUmZvTCglJSN+Tn08ZVZ2eUdJCitxNDQxO0V0a2ZXMUBUdys3cjkkdFkpVVdubVhMenhWamNzJTVjb0ViOCNMTVEyUyt4Rk08QmZyQWN5d1VLdzljV29mN2B8OyV5YFI3UEV8CitufmViUHhTKnlReEZBQWItamw0UWhDeD1qc3BVRGJIN2JmYzJ3U30odEBiWmZhdm9uTWo/TUM5VkFEfnkoUCVKZXQrOGErenp5V0FuK1UyCitzPi1fK00ySUp0ej1CcHx8KnMhWWQhP1NhKlktbnpCSTd7R2MjSF8zdjw0bGdhNm1MJml9MWs8N3JtbXhgfHhLKVpaKHVDTSokY3YmcFpPCit6bzEzaktZYUh4VUQqJHZaWil4VWJqKGdXUjs8eTBmUSp4WV49YDdBMXt1PEtGPTNeOVMoaGR2dTJ3bCE7UUxUJSlgXzVuWEYxcUlVXkdyCiteKXlnJVRmdlBpP2grYW9CdD87QG9LY2QwIzJZQmhZJFZfOzVgeU9QTGQ7I0gtWmkrPU93QTBRRlNGfCQ5eUlvO3B7ZXNORjYhaXRTLWI8CitAYjYkTnM7TU9TaitvPD5tMjhJRSh7cVBvKT5CK25BUEVPdnVScTxzS3xONGdNenUmYFFVSVVhfmFQNTE9UnBHMn0rVDM5dlF5Si0wNCkpCitKQDcmMz8/X05tZ3RXaDJCPClgPUkzS2h1KGlKZ3tTVlQ+YlZwemNKVmlsT3o+RiQtQVgqRShpQCZLI0olaWxiMSZueDxNIVJEdVo9b0s2CishKkB2Z3VVWE95dmVqRzhuR19hY1lleVk+YjxrUk08aTlSREwtVmVGMmVAR2YzJnBmTHVyZG8oMFh1dUtjNiVtIzh9cnRZeyZaMk9KUEhxCisoXkN6OUFFR1JgTkZBayVYdykwcVFyek1xYi1rKnB6KX13PykwYCNIQS08cWFgbX1QK0d8d2N6TEt6NC1ffmMpcGJ8YzB3JDJeWVJic0w2CitgR3M3Qll2WFR2cih1fjIpNXpXcismY0BLTkhhNG15N0dqRXYmKj49bDB+YmpuPGJlcW8qVylUb1E+d3duIW93UGdZJnV6UyF4bWt2U2BACis/K1ZHQG44d04/dXNsfFNSI1NmQ3JpVmJ+RFBQTDVvY0huP0grVlVGalBnPURkMm8pP04tbit+ITc1fTIyMUhTPmpUaCY9ejBNUmxOMElpCitVP3BTSlcxMDBLMyFwYT9rPHBBQkg+NjZWTm9uOGQ9WHJ9b1lEc0NkeTAtS2NzRkkkXjl3bmEzVnAqenBjSStLZX1pU0IoRyRwR1hZTiRrCit4Q0M2cjxXKUgmT30qNCM/eVJkamZURjRiVztCTGJaZ018QmRiSHZrYUFOc3NNejRfX3cxYktjRUskJE9pWm5GQ1NuMHg+QDdeJURqOWxqCitxPEVzcHNLclJffF9JYzRzYmw8JDNQZnNJSE90LSNaKFV6M3ZjQTxvXl5Xbz8rJHQjZWhKaXVMOVVtO3JwRiNDTWx3N2orNSRXaEFedyl0Cisqe24pISNxczF4YGl5QV5PUWNNKXJrTGwwaT58V3k3eDl3cUNnJT5pYEEtRmg7aTVVRHBrVGtqPD1ERWYlJmBEa0s5VzJDbyl8PWZOPk9ICispJGd0PTZxQnpmNHp+P2coP19AcWB2S3plTW0wKn4qVj1EVE51Zk83N1dZPUd3Xzl4UCZlQDUwWWByOSUrNkUyQm9ubWxWKT5MSDg5Jml0Cit7PFEqK2FpNXkxcVFOc3JsJDkyZz9xSEtqXzg1OFQ7RnxES1Iqb2F2cmhvMHtlcmNGUj8qditHPW5TS0c0Yyg8IzBFe055O3ZabkE9SVlFCitHSG95aGo7Plhue0J3KXNEeHdYXmNYLXhGRlkqSTM4cXkyPlotZ0YyYiNHT2IqNVpgSH5iYnApJURzKWludDtjKWJwQEc3Y0cqaUw8QVJqCitfYmxXOWM2VURWTkZDSFkqdGRIKWc2OUt2TUhVd2dwOzN9dnlKNz4wPF9PdDVNUFZ0K0NMMnlpZWFeVztCUD5QPT4hOEY9ZHV6KUo+Z35HCit0UWRlaXQpUHQ2LUA/aHdaM3wpOWRIUipiRytiPytsTX1SVUo/RSotTDdDdmhaajlybVlQMk8wemtWMHZDMSo4azkzSVEyb1ojMmhJdmtGCitEQWcyIzwtJjsmM0haXjduNVpTZ0MkUCV4ZTl3KThXbz1jYFZDMk0tNiFFRVNrUmpSOH5OJDdHKWY8VEc5SlFxU0QkRm1+ISFtfUw9XjdKCit3VjUpbkFLJEVlITgtVTM2ZSNlPlk+PGklNHhwNCl0fU5PeGcmdSpqQ0BiSDAoX2twNyQ2I0NwLVNIQS0+OGlyaU1DKmNhbW4qLUdlX3R+CismK0g0ZF56dFVZTTYqbT8+WElOX0JJSWYkc2drUCloPkA2YVdBSzJtdGV5N0R4SjhhZzM0IzAwN1NtMDAxQlcwMDN9bGE0JW5XV29+M3xhCit4WlhsWiliOTRiOHwwV1V1a1k+YllFWENhQ3htKFRYVWpGNm5eKHRvU0hte1M+bCpIWmYmTjlDQE5KNVMtPyFxNkdmbWt5I2JvLVpqSnU/CitKPjRMcGlQQGQxXiYhSCFlQ0luP2F8TDVvP0t4ZSlOSEVkPys+TEpVVWA4MlZHWFlObzcwRHxWQFctfSh7SnQme25oI1N9ZUN1OEh1SGNkCitJZihrKWQzNmpBXjVFRHx3R29mR15VRXowOVd7Xj1LSWVwJHAwYGRqSDFZNjBzZ2NEZFhqc3w8Z3NXIVl+ZzF7UzxGTXZ8QCV7Q0hOZ2FDCitUSDVLZi09dTt4aUFOb0dSRCpfTEpgTCVjLWQ5fEZsVStZJHN5K2lYZkVYLVlIITlrbmBBSipjWFJCcGhmN051RGNETzJrbTc3MHFvM3tiCit9XlczVCR2ZmNudGd9WEpTdl9peHVNZzdxR21FSG5OdHsreigqbGdrI3JvNzltKSEzK05TQ1VnWCN6TGo3PX1JUnk2MTNlZHd4Q3hrbWZkCit0LU13YWxEIUthfjYtVGdGJWt8Ozc8YF5WRiUrbTNha2dtYil1Zy1ffCVDIUl9Qz5pMGlGLWBsa0coaSZKfDNEKk1ra05WP0RTd08jSnxuCitFYmt8VGtNYEtIVG9Yd0xfQmIqVDtxWmhXVzhWd3lLYk1HeEhaWlhrKT1iZHx2fV5PS3ZZSn5fPXdzOVhhfEBTbHE7aS1Ce3NMUy1SSjM2CitrKzhEeCRFYWk7I0wmQmtuZW0ycXo2bD0+PGd2T0VNZCYoWElNfWVoU2M9cFY3WDB8dUJtOC1BcUJSQGRIVyFOfkZVPEZSN1YqMU9kRXxSCitaNzV5aTc+T2tIP1kzdUt9PipafiR7VlFKanlYKE5XYy1pb3NWOyZgPUA4JjJYRlhpK2dQYWR4KjwlfWlzRXZPRmlMTTFnMjYkbG5gTVlxCitMWldOZWdtTnNwcEwzR081KT9nMlVhWVFiT311RCl1ZHVrUXcyOzdONnR2ZGM4UXRFbVVOWC1hWWhoaGopRkhyZzxVK0lPVTMjUjEkK2R8CitBaG54enhNej9FMURCRFpFJSVENmlOST4lWiRDRHtDM3BTIWk9bWliPiR6Jmg5TFJNZ3pKUV8xJTYkPnpOeDFNUGF+anloek1rZDIlfVQ2CitrT2BOdTZzUz8wamxycTkpfF48TDhEdFUtYlZaRksrMnkzWHVkUTN3TT9gZnpVSjBJPFpJWWBVdTg5dEAyOEEjPmR+MHgtTlhlVnI0cWsoCis5X0d8MU15MCEmQ3FZZW1ORE04SXpzTi1ieDxOakY/UEg9UWVAS3tORFhSYEpDX3t5dnlARXkrP1VNSVA0PV9LMj13KFVle2tpQDFpNHk3Cis4dlNIS2M9LWpRWm9OMFE/YDliSmsqQH12P1p5QVh3eih4QDg8SD5kciZOVngldzx0NUJeOEJtfEhHODEpYzheMkMzSGtJMD1iQ2UzRntBCitpPTtkflR4bExBLW8hUTw5eCpub3syMXA3eShoWiFrTFRhSCtURVlfY18kOGUyb0RaYHcmJC02X3dldXhgeXp7cVU1VGZnU3JtdVhoQllkCitMTTZHPWpGRSF6N3t1Pz4obWxRYFk/ND1jSmZvcHZyfTZgPCFPcTBPN2FZTD98SkRgbyRZZnw7ejRfYjl5d2NjQjd8YGBNQGA2SUoxYHJaCitFYUwhVz5RSUFXPndmTmROKHJ3OTdPQS1meE9QUyNDNENjNS1SU2JAPlkyUT4ya0tKU0R+NE1NKkw0XzlAYypFYW1nflcxc0szNHBHUCNJCit7WnooQz80Z0tMUkRFRiRWOE00SERGOUlFIV5mNkxGT1hKcTsmZV8rdHY9Xzs+XnwlQ0A/Mk5XUUh5djtqTXVVR0A+a0ZnM1d8QUY3VE9vCitDfndAZilzTEN3QSE/RyNnd3c2Z3NWM25UZ2R7M29USUhnJHQoWFAzej9DNiRDfFVsRSZnIyFuck83ZjV+bj1TQlBuUCloPkA2YVdBSzJtCit0ZXk3RG9kbj88N1Y5MDA1SDswMDB7UjAwM31sYTQlbldXb34zfGF4WlhsWiliOTRiOHwwWlZSOX5UZDlfdkJacmVyPmViLWtFVmk9WUxOCitfRV9xQjR+b0hETX0oaGt0I3txMm0oVygjaWdfQE1ZMm9Nd3QjJHEoPHxCbjNIc1c4Sz5zT1UoJUReLXkzfXF7NmNKeiNjWHJPMUdzQihiCis1JWp0fVNmbjlLbWR+SXBxVFhsMShgcEBvb0BOYCltYTc4Vml3Pk5mSzBTakdPWmhVKjtlejV1QEhOWmZeQmVXfSNkMDA2eFc3byhGSXE8Citrbz5JUE1kQ3QtVmlXSko2WU0zUDNYdDJncTUheFVMQSFLPk0qPnpiXkN7ez84ciVgYm1hMCplJUY8XnJ7UztAMEJyKk8tUDZgKXR4dkA5CitUXjZjRGtab0wrQlckJUNZenAjflhHWiYqa308Tz5TP008S1hRWnp2S2lucmYxP1U8KWIqJGdKNWBZUTI/Wkd+bUR6Mjt4e0U4T3s1JEVQCityZig9TTRRejt1PklqRm07Xl5iNl5iTTNHczBLMWMqSjVMMWdCUzlUeF9zcig0OUZjdDkpKjVha2x2SHdfUHxFPV8rN3R9IUFtQXsrIUUtCitJbShjdD1ZaHxNLXBkRnJrMDZHd3M+JWNOSEg7N2VUKXVyWmQjYFFRWUlnb3pITkEzQTFUMGd6Xz43TUFIMT1rKzBrYHdmTXQ/JSVZZFFkCitBYGBKK2Y7VG1FbFVOI3hiYDlPdmtmREE7Z3puZyRAI1BISkZhYCE+TFBrUHtFMX1nPVI1ZDJQPVVgU0JZeDhFN0ZLUVVOJklCeVM2Uzg2CitFOEpMM2pNMVprPkRBPn53WFBgVitzM3hgJHIyRDMwaStEYHp5RntxNGpnZSlKM3xsdEApUkZQTjw2X3s8c3trNGgqWXJlQVhYZExXSWclCis3dlkoc0klIyoxRXs1fjt5KHU/WjYqZDU4TmlxVGd5b0pZQjxsOStnR08+M2p9c291I35oR0dSRDFiUk0mVUAqdkp6UmI7O29uRFRWVlhgCitXWl42Xi0kcjxATjMqTV9pbXQqZDBwe3hgPX4zaHgzNTljUT4/I3IxUHU9X2A3OHhqPV4qSV5oXz8teER6WlhJITtjY0JRSytmLUhHKmFuCis8WEs9Png3Pml4N1B0JDY+dUghZEIkbEsxaDJRPUUlWUBnRkl7S0ZXKiN2ZDBUSFg1XzN9dDlTMiUzKk1hZ3A8JkZBM3JsRDRFanEhRS1eCis3ITxVZig+U1crKjkwYDIkMjN7V1FkbTtSa2lNI3wzdiFYd2J2SFBycmgpQjFkaSRLTTJDezlCaklOaSphQGo7LUBwWGhPdTZzYllDIW1oCitwPX1tVn1TYComJVFeckBUZ1ZacmcpWFZGQ205bkokcyMyJmElPVRTckxacWhoPn0pRGh0KVY7b3Nyez5NNF5gOUQwYyhyb28jeUUydEFICis9QDh6N0QjeyM3cSpfZE1iMFVDXlpIZ3ZaQVpvfjRKNSh0e2BJe3J6d0lYWCpYaGA7JGg8NVNeJlFgPS1QWEtgIUwlTlVMTldAVikqMGtuCitmTWJAIyV+Jjt0JTl8X3Zab015RWpgdEdnKXhEI3pxQTNleV80c2trY0lGK2dQP0hSUSNtT2tJTVhAJT1nTkNyXzhzP3lpdy08cjFOaiVsCitRZTFZeXM1IWFvfUVkIyVrYk5GSUFiLWkzbS1DVkFBZD9+Z3BgRyRocEt6Zi1XU29XWXchR3ozMERsU2RRWXomb3BaZCtJS0pLa2dmdiZjCitxRHRAIUkwWUt4THZ7MjFeOV9NRmFRanItP0Btdj8hNzV2KV5EIUB1RG9LNVZKYnF5dSske2c7Mkp1IXd4RGd8PEtPdjchJElyX0FxUmcrCitgM0hTPzhPOUtRSDAwMDA4MFB+ZD1NPW5VVlkkWEUjMFFtJn4wM1FHVjBCfnQ9RkpFP0xaZSh3QUZLfXtpWEw0bjhiMSEzV2IjOFFKYXhRCitScnR5SW05K2NwcnM+blI0PWdZN19UQnNtMl5Rant5eEhVVXwzTVMyJU9RNWFmX3ZXZHV8S3ZLS2VXN3tNeCZfaHc2WlFkX1coeEdJcHZ1CitNI241Rkk9Y1hURn5xbFJTZy0kTEZ4b2d7cnFOcG1wVz5iSDVTPFhBdFM7Jlp6Q3EhRWlIelhIVDkhZ1BHRTF0MVZuZ095cUJyZ19rJHw+CiskbHJ8dUIhMXlANHBHbzVXSkxUdWRHJE4yQilGNUdETU4pRWAmV3dsXkZCN2ZJP1lrKU9HNzV4RSsjTlVBbyljTkdQP3pmOzs0Q1RHTUROCis7YTBnRjtIcjxoYng9d1BofWNPWnVrVD1NXjRpSEZndlJJX1JtY01RYSkmPD5AQHN0fmshVytAT3w2flUkaig1ZytNS0smUSV4Z3QxRkQ5Cisrc3l0RmpKTVAqTmF8JTQyaVl0OylVPnVmTmRkVmhxMCo/c0M/Pyp0QU5tb1F4VnhERiZWTFhablRXfXo4NDJhNHxBe2dhSmI7Wk9TR0NDCitzfUIyb2spLUhBR2g7Pzt5RHZrdTE9JWIyMGEyQG1OTURIYiR+PUQwdkVTakAhaFBKR0hsTE9DQkoxdGNsWk9QVURhYjVIWWB1TH13PkJOCitzNytYX19HdU5uUWhBKHVrMmJNQUkzS00ySE4+SCQrNWYhcyZNX1dXeVNta09pNH04KDlaRWVFUDJETURQPzxHd2hBOFYmUXczWDZYWHJsCit6WkUtO3VJeF9BUmRoS0wmSDJvOTdUSlhjVEV5K0M9eDc5ZF80K19qQ2RDYm95QlpNbFpian4rU1E5UiFAP0NtMDc0KWM8NmJqZWlHRTBGCitNflc7Nz9LISlfYCZwb3EmSThTRzJuKjhqUDlPZGU7fiolRi1vdHVid3lyZ0R5I30+IXZ+a2VaM1F2dChTSVM5flNOMmRpS0lVMG5zdjJgCis0RVJFaDhZMy1xNENvOX0+X0U+aml1eE8jKXN5WWFRT19mYFYyZH5CNVk9KTspY3V6TmE1ZGMxVzxqYzFiVWNxM3tFJG5kRHVRI28rY3QmCisxPEZzJSVfXitKfT1IYnc1Xyg4e1ZqITJSUHQkRzJXJGheTWcyaiNYWEF4MS1UUkN4eVBQQTl5KTdiUmhkVyhuakoxUXNYVzNuTEt5LT1GCitSXn1IQG48UWk+a3VgM189KXVgdW9RfHtNM2heYHx6JDBAQjhxZjU1TSVgKlRMdXV5UXVIZ0RfUXFWXmVkekw1ezFkVnMpeHRZYjlmciF3CitjLXhkaGkyZ01rIXYqaSZsI1BsemdJdDsjPE5zJSpwMkFsKUE7bzl4MzBhOWZBLTt6S0sjeygtPzhVXjA4bVE8MVFZLU8wMDtve2xAPj1GCituV0lNdDFPTmF8M2poRWcwMDAxUlg+YyFKYzRjbTRaKm5oaWEmS3BIV3BpXmNYa34xMFdwWjthYUN5Qn0oUWV7NjZuKVFFVCh1OENIJHQ2CitDYCFaVCkqOThPN2hOS2dSUi0rdldoMlZmXkxWfDNrdzEyPFhDT3xxdnlIdlp7SlYwWEtiSSFmaksyOSM3VXY4ZUlTZ3RnKigrPUVSZjRHCis1PkRDTSRMYUw7aWZgN1JYdl9QRCRLVzRUVTUtYzhIKEMrRV8rZ2dZK1JMTWMlZXBpOEl9Y09nWVM3dU14TVdjWiZIM3M/eEhyST1UbWdJCisqei1EbEAlSkIhe2UmODFSZmRuQFZtPCNiR1AtM1VKaT9tejlRJGIzbnczT0ZuO3dyQSFMVjdjT2pNYDZ3MkFmcWFSXjl9ZGE5ZUI/LSE5Cis7enV5RW1DZTF1JlNHNXN7NShVaDk/cTQwWkU9NHF+Tk0rJVprU29TVThMeU5KUFA3YTJKTDUtaGQ5XmYtcm8oMDFeeXI1U2hsfkZvSj17CitgYWJhezQyYlVvcTlQSys5JVZATjtLZ0h6PSFpcyEyb1ojSU45diZPUFh9SHd2TiYmWT1YKXF9IzZ2aGxpVjJQU1Y7bXMycDZ8dDl0b1lFCisyMUlrenpESWZAZS1xUm9rSGEwWWt5bHlHQDk9WWA/NDhzVlNOYm0qTjlxb0k+Y1FOVVJfRzE/cl9JSFRyaFhKRlhyXnRwZUZkITIkR0hGCitCPlQwZmVxI3cyRFRzeno4Rm9CRlktVkhreElASXorT2hBRT5jTDFKUlMqZ3M1fHhybjJmVVN6VCtma34oemR0cVNXUTg8bz4kcyhYNS15Cis2fU9QWXBEKkBvXllvO0ZRJD43ZjlxV3Fadi0pVTZWcGZpWXgpJGFvV2I0VVNLOVIyTzQxJENkQmQlVW9KJH5hV1l4MVZLJlB1VH1lS2hmCittbS0hc2QxLT9MZ1EkV1lUUC1tTU9CNEolTFNrMUxVV25xJTVqYEE/dzQ3QThabmdhTEY/PCZoeHVRPi1+NWBsOTV4T2dQUnkpWWgpVk5CCitEUl97YEdaOWFzWHFXU0VKa18wIzQmYiVJSndIbjtzbjgpazdAYG4mPzhKZytuM1g3bXAzVH5kPU5USDFFMHJ2SEZETUglPDwtQDlibGcoCithTUNNV3pJLS00KWE9YCNRLTI9fTdiQShfKGNlV0peRy0oZzY1OTE9KyVOXit0QCUwUD4+Tn1eMnZtdSR0Y35fYEo+KnNkb0NCOzZaUVRvCitkT2JKO358SCMrVkRGQlpMNCVMUE4tSkJXMGdwSkJ9OyYlKyZhJmhrcEYrTVZNZlkpdzFzNj0qajVqN3NOckd0NjZYKSRIPyZrUTc1eUh+CismX3RJXytKfHNqQkFpMyM5S1Q9ZGh+bDxmK04rTGU3aH0+WVV3eTQwaktYKnVDQCpfMW0tZz9iWTJDKHtSa3xDQX4wRFVpXj50c20wRFAoCiswXilfdilneDtGJUZHTGI5XmMwI2FTek9PMEQlKCs5VTFIKSlge2tVSHxIKT1jM142bGVGe3VqOEZOJVEydUxJemhoNkk+ZDBIRj8+T0ppCitiYik8RURYfWIpZUUpamRKLU5XVmtyJXt1I0l4RUBeQ3pKWF9GLWJfNzVhcEdFLW8lMnpRaipDRSledHVnJXhoWG9YZyNaU2M+MEtzX3F1Cit4Y2gqaTFmdj8pXiVKfTBBZT5KbEMqPEw/ams1SFJoZCNDUSE9TmteMUgraHxKVnt3MCYqJnA3PlFMVkFSR0ZkbkdXWmkxSkFDOEtxZ1lECit+JV5FWGdTMHxYUVIwMDBPOF5PWTd5aVprMEB7c0k2MUpwfSomOXs+T1ZhQXxOYVV2XzB+V04mZ1dhQl4+RmElRlJLRkxROGRaZjwzQUVeCit2OGBRX1lVc0hXMHErREYjXi1VS2QpbyY4WX5RcGo/QEAzQ05Obyh6XihmenxkTmhPO2k+SVFyZ1Z8ZVRKWS00dGJGejEpQWgjQCsyOGp3CitzJilqNGpnZjJ6TXJBUTZGQj8lNEEjMChfMnY8RFpGJTspJUxLcypNN3BeKFlPYChPYlVsUUp6eTlfUnJiP1RRd3MwWV9rcEhERHtCaG1DCit7PCshWnN2NTJKP24hV2g7RHQwaFd2JFhSdj5HfXFMbGtMbEwpZjhJaTd+R1dEM29vRHk2UmQ5P0gwK2JGNTg+ak5HUD96aEZqIW1JQDQkCis/O1lQSnZ6XnNlOVlvVX05NVY0ZztVZnNnUjxhSH5INUVgU2VSVXIlSCVVZkl8PFg4R3lCR0xMZE98NHRDbWZuQ0BaU0pmZE49K2trMUZECis5K3N2Sl5ESk12P1I4M21xQiMzamluRmI8MD55PGxUSGg2alk+e3NFOT0/Mz42XiUrZF9UajdLcUhhfUZlcTBafCFBMWZ2fE9FfTU3P015CitEaTBNMmFBIXlRNUJgY3NYWHQpWl5IRTVpPUNJISRVZWppYUVgcTg3OWElaTx4LWwjVjFUOGw9QmYlSyN+SHpwb3N1SmIyUnNTb2x9U3pJCitnY3EhKGhRa01AKGxRYk12VE5FbiRCbj5MUyM2K0F0Rmk+UE08RTM0U1Fmcj00OSRAV0ZFVFR4flhQRkBEeD11b1EqR0k7YnhkKj1eV3llCitKS00xMjZlV2x0NHZnb0FoSXhvTWl1TisrbmszRnBCdl9pYmVpUmxOYVZgPSVqb0ZrWTVwfmVpX2xxPmMjd0ZoYUxMZUZBUEJVR0t7KlkyCituaVl5ODNJc0wpQXZwXkBfMUlfUmQ9RVU8KHpXKSVUQVNqTEEhRD59QFpELV9hMSF+dTUoP1ZBKHlmdCFGc2FCZjJ2aXJ1LXEwWmAzKW1ZCitvN3gzYT9qJXBSKGoyMXw0R080VUlTdGdHQnc7RWskbFgtQEEtO2dNd2NDOyl0UiglTzZAO1Z9I2JLR0FHKkQ9cUYlMldOdjIxfXxRP14+Cis0VFFHOHA9bkVuYkoheC0lOXAmdG5qI2xZITN7dlZeV0ZAPlpUJlMoU1NRX2JCWGhzZ2JHK2AzaW81TzRoei0pWE5Rem9qIVR2e05BcldTCisxKlVoc1ROOGUySFZISSgkVl8hIVBqXkhJbWNoJGVlQT1CS0QtfmlKa3JkeXU3N34lLXlacDw1QzhQeD9MRDRZKWojMHBfNVU5RWBjb2YxCitfdTxRVHlIQ2phNE55eDExUVktTzAwO297bEA+PXZqcz9pMzB7e1I7MkxKI2QwMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJVdGVpCislWD4/eS1FXnY4dVJOSFJqSFZ9UjFSfTdRfk9SWT5faVh3JjMxbFJee0hgcHtBI098fH1tY30tX2xCa2tZOUprbmhgd2w1ZWJ7NEg2bkIpCit2Kz1BNjBrM1p+eXBwLWBvNF84RHxgSH5xOzs3YHA8MUphQH0xJmxCNEY1Qm1RY0B8anltSiVnQmJAZjZ+anxFQXo+bFF2SmhrTU5yQDdECitXLSRfKmFMPDhoRjNpSlY3UDVUSWR0fF9ySEZPSnI5P3EwbnhsTU4jVXJhd2IrMWM7T1MlIXMhM3N8RyN0OGB1NU9YJjchSlAoQk1iTyN3CitQQnFSZCgwUmtEN1V3X0FuUjZYM2o+QCV0bD8mcUBqY3BqYTxIfkYqPSUrXjkobjhJYUhhUT9XVkdQTTNmcX5TUWl4OHRvWC1je3F6QzVWCitMI3gkWmlAR0xZUD5FKlc1dVMtZHVYJip3VnElQHlNdDhePD1OeVIzKTVyRFo0N25Bak57TnlYbWE/JCVYRk0lI0NOSEF1YTR8YE5qPn5YCitkVVpBXz0oPCYxUDVnKWZ+cjYpNlUzVVd+akR7ZXhSKEw8fGNWYEklTnpGSUgqaHh2TEUjQ3tWfCo2UyE2PFJveFZORCVkNHFWIVUrNyFgCit9Q213IXAkSVErdWM9NzZCPTBkLSZUOFl6aC1yQkVaN3U2MT84NX5nNGY7blBTP3dESj4mVSVSUztRV2FmSWA0bT5GaFBtV2hfJkx6LU9FCis/fFBpMmZ+U0VHdHhkKHNGO1c4TkB8R01PXiN7K1lAfWlybElpZ2pNRHppU3lzc2M4LXAzVlllaGpZbXdjWGpBUEBJPHRIPEBxd192UlpYCiteQj9JJUo5REpTKU47SUU2ajUkJFloODxBQEtgcExvaj5BbDMoKz1sV3NkJW0wbVZ+b2lGRnQpS2hzYkk+TjV8bntSK1FpLTRAeHAzeW5nCiskZ05sMjRhYzc0SD1ieF8tX2N5dnRwJSQ5OD9taHJJJGhEK3tWKn1HZSFMJXdrYj5MK3dUX1c9Zzt7O2RkPzl5USl4WmhCWEtIWjZnUUBSCit2RXd7dHF3SXxnUVVRPkNTQHgqMkdDbClyUm8+T0AralQ0NWkxcm5mcFpAYmMzPXt7Qn5qQTUqZ0lDJDxYcjlIQE1uI3N4eG4oJjtZdkB4Cit4c1dUbyg9djhCRSRnRFJMJkZNYWJzcShGfkIzSWBOcj5Od05CNn1DOWcoJFN1eHBlMSp6YnVCa1VIKXZkRyROMXIjIW4pcksqVXM8OWMtCiswPyp6OSlhX0RFOHo3PUdDQjFWSXlsKTQkbUxZNF5BdElTd0NHSHJHNkw5PV4wQ3M3MXBHRncwdEkweEtxPnRnPiZIckVPQVkrTW9ZQUlxCitOXi1hWVFKflMpPEhDN01Qb15nQXpxWCRBJG5BIWFIcVBhak5tQUE8S0pFdXp5QFJBQU9LaDR2OExYPHt7R3hBTHhmPVNOTXJvSV94ciFLCitGRGZlajw7XiVhO28rUVEhXjdpPDBNXnBSMkNIMzRNSjwjckZaQWJMOGhsVz5BODFRbl5TbHU/JX5pcmhTcWBCdCF6S3kpM1EkVn0xUVktCitPMDA7b3tsQD49KT59XmJVNWRaK0hLPno/QzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlclZQcykmYlkqZ0xFXnY5fVRXeGRPI3U1CitJYFV2WlRfNWNFKXBsWUhyTE93WSkmKHJCdGt0fFheM2J2KTNLSUVzaXMwTDY9RkNYQGQ1PyhWKGQ0bWkrTW54QG0xR2pUKjxaKk9tSl90Cit9Pl85PCE0ZEN2Mkk9TiVrO2ZPfSNxI0JSKDA4aipnQi1yVEJYenM9NWshJSFedS0pI3hBSCZ1RGJGUEFheV48MGNpckMjIWpxUmpnaE1SCisrbGBoaW9DM3U5dUFMciYyQUp8KT5IeD48dCFHZkJvaVpeI2NUdGtrcHB0ZCNJakVFdE9gayVRTC1Va1JsYS1fXj1QeXpeOT43T1VYZk56Cit5fUo9R1VzZWhBdmYjQHt7dmZLYkRicUFyZD5zfmZvXkUmcyZxX1Z5OVgkRkBLQU4oayVzPWZTOTJ+KXJBdWdxd01ZSCghPyhXXl5XXlU+Cit2KSUxN0NNJnUxPnJQNj1pQEBCYnJEOWwteHlMT3JJTVVnTV9PI3dQcFoodk5wJVN1ZXlmYGZBRjVfVk0pQXsoUXE7TytUMHJ8JlFDcU87CitUSiZISm1qbSo+JkQpNE9rez5fT0MjJGZQKylNWFV2blZlNihOPUpeeipDYDEtVilwOUwxQjElP0tDUFhZXiQlckBnK0d1bCUhb2cwTGB+CitqYSZsdnA1UnYjY0E/c2d+XndCKTxTdlc+ciFyUHZVS3x0Y08lMUp9cEgtSGV2PSN2ciYzSUZVITA8ZEB5YiM0WipGNiUodWZDZTgpZjAtCithSz5JSjJibT87YFp5YVNrKEQ0UG9GdkwxfiZLQz5GVzBPdlh4a1dkQ3RWclUraUphSmJ6NERJfW8xJEskZGwrOSFHVF57bTM8S3BKUS1sCis1UUNVYkpHTDtqN2R0aWJgfFgtTz9MSklkeVJGKUEoVE1majVxTWombD1jbj1Kc041RWRVdCgmYFI0TmE/OVhoQHpUcWswZ1o8fEE7JjEyCitoOz4oeGo+Q080dyZCZ2dHSmJYRENqZ34yfEQpdDhhO1p5PT5rU342TzYte08mR0AjLWd6JTBJSmNMcit9RE0yUHVmeT1RZE8wdU1tcU0jCitEI057ei0oKWZCK2ducWJPXkF+WFhnRWZlc194WFltQTJ+MipLKkI2XjIxcThAeTV6OCQjITxLMVlpRCEmY3Q0OG5CdEZ7RG1tJWVDe3ZfCis2NG9meioyQ1l6MD1TRWw8aDtKTmNCdlV8SmstREhBMTZQbk1gUGgmN15JQHVpP0tDTjJTVFIlQldibjwlMCFCe25kS1B7YT92K35PUCtUCitNI1BDSDJgSyg7T2xLaEo1azZlVCpAX1dsUWJvTVAxVyE7LUxWQmsme0ErdjJKJUgjR29xWmAtJTYzI0VBX3xnZCZRJjQwRypNUDclbFRCCit6LXFQWDhINTc5VkhvcnhFMWI/NHN4RTZiM21CTk13NXFJI09HRCk5SVJKYXU8Rj9fU3NebGpqSWwtND8oYCtuYCk/fjx9OyFtaCpTYFE5CispXzw/NFNMeGNlaXluS2tJZGQmbX5XYnRuO2Q3VT9EJXk/YWtPO0x3dlNgWStsKUhOQFA2bz0qK1hjKXY8QGd4Tld6ckRJO0RMX2s4Ujh5CitUKVhtMGliRmV8WkNRJWVBV0ZgME5tJkY0JktObz4wb3JDPjN5SWF+OX1hTjlydFdsND5zc0RldEFGZmUzcWNJWTN4TmVQLTFpI1B7S3YlCitGPzk7N2VKM2EpczwtI2Rka2FGeU9LV3UoJjRXQzdFbFByITBTeFIpRylWTTZRSFAjcWlwJDZIdyg9c0Z9RTQjPztDcyZAUlJteVQyIyt5CitWb3t7RGs8TyghOzh7N05jKEMpKnVKJGFRcWI7PHtkRnhzQVMwRCtZa0s+TGw2PXVnfEFeIUozUFE/a0hkMiRtZSpJYnRzYFlRWnNRXkp1CitAflRgMHUmZ0VFSGkxcjBMbVBBfnFuditqNTNMflNZX2Q4U3VqeyYpZWV1UDMlSkBYMTY4JTRsenopa1FpZVFvdFZ+WWB4aiR2aTE8Tl5QCitSeH1Nb1NSMVAtd0w/PVotc3YzVkIhMSFzOz4qdzlUPDYmKTItS1YkUmJsd1NBTChFOVpjYHE3VGtzdyp3ZUEjQD9JOz58N1lnfUNENDNNCitFWWNzWWdyPG5mJU0/OEo8TDt5QGg2QSo0aFY7Szwoam1KdG47ZGp9KGF7PjZQRTNrT3xWKEVDbzF3TT1VJCRRb2B2IXZLIW1ONF5uaT5vCittM2M+WjZwN0huJXBaQkxZY2dsfWtaKXs7NHleUkohaUc8dXxiezZOLVZWaE9wTXBLdFJ0O25Yd3A+ezIpTkRwfj9hT1A8QVl6VUZEZ1dPCitiOGs5MGJxP2NaSWRoMS1zZ3g9eGd4K0c7NVNRPlY8PGViYVNoMHcjWmJ2WXtOKnVMTDJUQDc/d0JIKUdZXkZBQzVLd3BWeF51YTxGS2t1CitEdFMzZWBEUEp3d3JWb2M9MlczXlFsU0p6dlYyU2hVISpHWD96NkglXkU3WD8mWmd7JXJ3cypTVDYmbTNzSH1vWCpFeztrcipUfnk/SFAjCitRYTtGfnErPj4oQ04xOVVDVENMc20mT0skJHY+bjZqTEN9PUZjdE9rYHg0ZTkpRUh3YSVVJSYoalBobVc2bVFJa1lSemNXbUwkKkk0d0JACitsNVY7SHxObTRsb1BWbCROc3U8c2J1Vmh7K1VYQ2wqKTdOJE5Ha1JgYDVicF5ZRE9haXY0U3h+JUhYezkwN0lpVXE5P0E2fDJfV0lydVNjCitUPylKdE1UM3tUMnpLI1pGfW1ad1JHRzdhOFBqcjRWanIyRlZ0R2YoKiVaNis4OGluPiVDWVNXQmA7dkRAWSlXUXBaTmdaVm1qcGtrQ0xGCismaj1vO1o4SE4pc3xzY0U+NFI4ViVSTm1rY3V7c2Q+NU44ajxmZ3h7YWBGVjBMRmE/WmxsaUp3JXF7c2dAI3ZpcFUyRChed04mSSghWXFSCitCfCFRN3U1M2l0ISY/NyFhNFo2fj42YF9oKD1hME5kRkc5YjdzZSUjUF8ydmZrR3VEZkpifWQha04qS2JyRkJUaHFDYUtETDBhSTBkZ3l6CitEclAwczNnQTYyMXNsMCl2P1lZQkROJilRYip9ZEtaTmduRTIlOHZvNDd0UCEjQnd3a3tCVXJDUnVPMF5VWlBKTmRVOUtQSytlYmB2b1gmCiszMHZ1JGE1ez5PVUd4JH5gMC0xXmwoRWJOV1lFX1g8Yl5oZD0kVUJgUGBkczBSLXMzb2dxQmcjNjAweTBfY3RrNm1nVCp3Q0tgSUx4VS1+Cis2ODVmS31lIVVlZkRpbGBKdlNjIXV2O3JFYlJ1fDVHdGl4fUdOXyUzZDZVWTRULTRKKTNQKHVWcn0paXxASDB1I21pejclPEBkJjFIe0Y+CitiRVZJcCtlV3FqYiR5e00zVGhKcX1BTSQ5XlQwckl+IyY3RV93S2FUUzYmN25DNHJFN0x5UnQjaj50JmFrQSNFI3VNNVlDRiNnOUw5IWpOCitPej01TytURUFPPkApP2dXUD5NRkEoa0t6cn4kXz83e2dKb3ApJiRSUUw5YTRVaiFxfHRZYEdydGRlfXg8JF9+MSkheTtgbGFYaWdsbHskCitlLUp9a1YmV3pFbzU+T29uISViPztUV0R8MlBNeiZwRysyVSFOMFd8ZiFTK0kkNkQkWn1hZVFgdWdMVSM+LWUyNkR6YTR2c2Q0JStvWllXCit2elJLXjRSdWRjN29fdyNsKUkqfFl9Xkp5JXB1dUhfVnIzakc1S0JrJkBjRXQjXk4+WlR+QCF7bzFLT3V4T2h3ZSs0dUR7O0ZET3gxTjI2CitHKGcxM3Z8WnBkSXxERHFRJGBnUzEjTFh6YkJ2OTJXNUNOM1pXU2Q9VD1QS3lIRHhCdmpiPis9TkFnckJlbXxUUl5qaW5Mc1o9TXt8MnUzCitWMCk4KSNHSFpJdUFlPklgNUZwYEM2dE9NZ3sjRHM9YEhPYjBSQzE+UEl6MEcmaVNEY0lWfDc0YHxXX2hsQ209TDZiKEtNRjx2U2dkVkR6CituPHxwSk10eUdBQVMoNypPVGpBfXhReWkxNVNVZHJIdF9ZN2pwZlUrWUhyd3FlOChSSik3Y0xtUkdjTDNkOGxXYUhjfDROb2QldDA2KjB7CitGXkRoJTsrRk1hR2VmSH5fTVpjME9AdCtiMFU3MDMqSnwqOCReUis1Rz8/e3ZDd1dkfjI5Zll4ZjFQbV51JXcofnZNYiZ7MyF2YHAyJU5QCitGJlZ9V31Uak9vNl5jd2Y4RiYlanBPWCQrMWp3b0QmaWwzUUFoZXllISE5Y1o+SFFfcFJIdkZHX3lBYDREcXl7eVZOXjIhQnBfSDNCKVRxCiskK2B3VXhAcTQ3LTtxWVNJPURhcFQpQDNKKiM3bV91Uz9uMmd5fHZlfUlrWWk3NCohK2dqQ2N4X1U2RiEyNEpTKXhob0t6dm1fO3F1XjVaCit5ODNYVHRRQlcwWiU5RilTVWpEUlBfI201SD5eY1VBZT5GaTVlbT81KVl0SUp4V0dEKENIQyNeQjNzQz5KYGN8JSlBWEBRdi1jKkIoTUBjCiskbyVNOSRIZWhHUyYjUDFIRGMoJDRIQnJycDBkYUJxKDljYFk0KnojWTdsdEpKeWYlKT49ZG5LKU5RY2B8THliZVZ8STsoQlpXMzZRRyReCitjMiEzNkdRQjUmU1leJShiT2hTYnVNRDN5d1VmSHtpbnFsI351OEQtN0liI1F0YyQtd3s0SGVvRSZ2eDx7OGpNYkxmTHBGLU88OVZwUEl2CiswZV52NEVwZ1NifHZBIWNxIyR6SFgzaV8jQ0FQPG9CQ3p2TlReMndMNENXIXRvTmxXQHRDTm9CRl9CQ2kqOFZYVCg8MDZMKVlgd2Y1OFhZCishREMhQDc7JTd6UCY8PERvZE1ATyUrcldGY0AyIzhCfHliKHVGMFlrKTJ+eyNSeTk/M3kkc2Vfd05LWCZRRTVIfFZHI3lUOzY2bzhWUWZ3Cit0XiNzTGd9ZFUkKVFAcjE1N0Y9cjVJRVl4LUZ8O29CQy00R345aiVCdmI+UW8mVThlQTRiZzY0bFlXNnJHQiErQUpFLV4mM3o2S21GcnRCCit0P2RNVFBvZHltXyM2YUUrOE0/RjR8QXNLPWF+bUNvWkU0WjBER3tAQnFjPFE3OE48IU5vbUBwdCQqPTJIdEFaJnpoMW9YXjt8SypMRztqCitSclVaMztMIzZmamtldzNKSmJlfHVsclZ5fjg0TT98OzVCYVohbipnY1hzeytec2FWeHl1WHRedE9remNiMkNuWG1ZUCZWdT84YEJ+KHJFCit2MCt6VlU7SHI/IT5Db2o+QlZQeEVJMyE5NzwpZyNZOHZwQVJ4STItUGdGKmRocFlxan1AYXp4azNhbmU/N1NfUz9PajhQfUkycFgxQVh1CitPdSlmNFJsNW4jVzJ1PVgzX1Q7U2IzWVN3Vz5GK3VSKHtVaE1FdCRxSHI9Nl8rKDgyTlZ0RHtUJnFycGlZJnlTJEt2bVpPLVpqOUQmUzclCithKkwjMERGQ1BiJClpJiN1dGhifEhaYXdhOVAjaWRiY0Yld1FFIXZ6QXRDKCp4dDN1aTBSeTJ7bkBpY3pzPEQ7dSFaV1Z2eTUqKldvVk1iCitYNVBQK3RUUmllYEtkO2xpJXZNJDF6dDdkaGNUVWZvU1h2N3lpOShnNCgxcFM5NkREKjEwemtaMUApfHRtWnFOKER2M1B6SDckUyNOZChgCis+T0VPYl5teUsjUi1QbCkwY2kwOX4meGIzIVRiUTlAVD53JSY3XlojdHJyVnRQOWtLP3dQTiZRPSpVeGhHUnlDTzxkI2EqNmpGZ0hUUFQlCitIUkM9U3I4YTw9NzNaSGlifkBOMGx7SGt2TDRFKEIwZ3R4TWlmTyE0d0dYUjk+bHVzMyo1ZzlaMWRkZWs/U0BtaUNeT1RBJlEoNUFsTkBlCit7VHw7JjVHVyhxbngrQCU0USkwWW9hQ2dZa00taDt+SVpFelV9MC1HJUY4MilfblpQcmhAbVB6QFlHKnVgIXAhfT5gZnVqSXpRdnh4PSVjCitCSGAqbDdrOXBlS2QtUm9mU1NYUCF4cnteSiM2aGl5JShucUFSamFtJjN9JSs3aEk1K0hOMTIkLV4+ZGx5aGotQXsxcUJHfk88SGRnWUVnCittN1R2U1FjSWZVeTImMT9LRSpJJVdNQVlsOWlkUVA2WlUrM0NKcH1OUWUrU0hkVzwxVikwKT1aSypQO2dDSypucjtaflBCZjByR1VEUXlgCis8UXloQTkrT3BAKTRgVHV+ZUQxS0I8M0RheUVxQGZpelFea3I9RW4pMXJ2SUBGTkVeT1cyUXszQEdZSXRMNFheMVV3P0dEQVohQTBwQHEoCitqXj8xYHNJWSgpT348dTQoN040SH5IOzBRV2xNPzt1QHEoX3FgNiREX3dQSzl6JCFqZ0lxaGVlS09qPl94SjY9TXV1YlN2ZDNsdU9jXkhrCit0R3xOZm9xODN0KS0rWUwzcnJsN24wTm5gS0txMUpRP1IocmBVelglSWl1ZUhuRDd5YnhMY3sybzhAZk8pUlhTYnBgI1RpYFFDJE1uOExVCit6eXZFPDBzUiUweT1LdkN4KmI0VUBvYWJ1YV5kbDJUPXEhRkl3bC1VZlFBKlU+fFgkOz9fUD0rM1AtcFFlVz12VVhrQHY+K0U2M25MRFNLCitjKWtHWGxveUhkPDNGRFI8NT1eRyZNemRhc0BzXkBLXmw5RzREcTkmb0Q4Tz05YCRJYGQ+aCVjaztlVT92JFJRbnRRWTJOcmVWPzRZTXNGCiskN1V9eThUQno/K0p0anJPbXh6R29ZPSk5S2tNI0ojcSh6I25idStZTSVsPG99TCg3JGUwKkMzcTxZcEx7Z3BPcjw8VjxZWSY/NjVKaHw9CitHK18hT2pvN3MrSnU7ajd0NGQ0fD1WYH1EIWsmdEBfSHE1TDVtQTQ7RDVDVmFjM0ZPZ1EhYGBzNHwqJGVfKEY1NlIxRlMqMjNgYDRAVDRtCit8ZCNwaTFfR0VSN3R0Tzd0e30pNTljZlc7TkgrPyV7VmgmZiYrMGJ6YjdXTkBWaWpIPl9pOTZLQDR1TCRaJn0yU0FsWTNaQjk2YlFyUl9SCitQWVMpYEVFYUtmRVZQZWxwbzUjVGpqRip1KkhmJCk3UV9EbGYzVzQldWdOdHtMR0hhTHg2JDMjO04qQ19DbEB7QC0kNWBVKStpYG8kMzteCiteVUVGRzR7PmhyKzg+RmtmRDk1PHdXT0IkcypFamdlIWktSWp1bGMwSGxaWjA/QSNFUHk2Z1BwNkVoYytjK2ROfXY2e3tLbTk4ZzZiaEJOCiszREJiLSVzciloTShBNks4SFcyJjcrQmN7M0pLNGU2K1UwekhyVUFfenBmfkc+JHNWbXF6QVpeMEpve3taRExsMSlVcEBLITkhJVRjNyFOCis4ejZMe0JSbFomKit6NTZAcEooQE96Mmg4SmhGWEBXaT9oVTB9byFkc0g0d1AyYHtzflleMHxYUVIwMDBPOF5PWTd5JUFWJXZJfFRwJENsCit2cXk4dnA8UmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GSlcrTEVedkE2UzVhQDxNaHQkfXVPUWs3K2txb0BjXlpWcWZSbEpqd2pjPj0yCitZWG5EPk1ZVXImNX07TEpIXz5lP1lFQ1NvZ0IrYW5zdy1hd1d1RSkqKjw8QiQmV2BlRlg4YXU1RTdOalZpN0BRPVpEfCZIJG17PyNmdzFXCitaeHRHQUxRJUAjdWJvI0FPcWJGP3VGQCgpa2E/TTVqKWdUfm1rNGpYNl53MiEhWFN0ZVJjXkZnRU51a2NxejZaQHpCeil+MjdiaCVLKWE7CitsKCo3Tz5RNj57QzNgUV8yTVk2PUJKe1V4fXlmX19TT354PStuJj5uX2lkTStYZ3RkcGtUJm87SGMwcC1ON1JFP2JtPj52Sm9QK25qbi1oCis7cGAldmt1NCtqVVV3YV5SR2l2cGsqcGA0UDEpbTFfK2l5fGVFQkJkdllsMXZ5QSNYY1QqP0hgNlFrK1clMzNOM1B8KElmeFlkQ0YtaGFKCis+JV5nUFEke2k0QXduJCpCbCMtJn1zUXA/ZiEhUjg/OUVUNFgmcWxaa3VPOHo4WFIjdikwZ1YxXnUmMXo5KShmfXtmIUdISmVMLURobDNyCitOVzlRaTI1fjZwOSR3TyFeMkZqKDdWZ3JvWHYpS3JjIWNqe3lnOFdNaW5oU3s9I3xqdU9YS3hRcSloVVlZeWtyPT8kRk0kRj8rVU5oU0kkCitjJXN4dzt6TXZ3JUJsUDkyY2g/cV4zUnwtcnl1ZTxqeXJ8T3VAbHtBfEY5LTlhWkZ+S1BXO2d2PjJ+OyNgX09taT4xNk5FSVBUVD10SURoCistUnRzM3Y5UmFFYFF6QzZTQnIzYVhgN14zRzRteWIoOGxsaFY9fG1XcjQ5P18mMHZlb0YjP20hKTNGZ3grSlMlZmxtMkUrdXQySmJiX3o3Cis/PXF9XjdqTDRBak1uP2tNI2hzQ2NNJmJkSj48WCFEfjl8VHxISVluU3ljPyMmcGlLNEU8QkdqeVg+SmNKc0s1ZTAxUzQxPXI+NzZKTk92Cis5emt2elB2aThPSEI9Yit8cVp5RDlOTDNQO0NtP25vPGZTKkYoU0deU0ZzSTwwX0RsKiYqUEF4ekt9JFcmTDxTTGJrWkooJih9Wmx7QkBACisjVDByaFFedV8hZXxeUV48anNNPjg/S3kkWSNYUT5LPENYZjI/R0VXI3l0UThKJig8bThndUpWZ2F+T2BSbTNBbzBnTyRqaHRePGtkaUJ1CitxbHgzYnZ6a21VQXdqQ0t3YWhaXk93TEc+X2JgSWYoWXVxfHRGeX43SDgoMSVMPStUPWFTZT52P3FySlhUQklJXkI3YUV1OWEoSnxISlh3CistSmtsKktFVnNkaVM+YCRBTV85fUBrZzlkVHJNXmVOcDY8Zz5UO3VINUVeO05CNDNiUFR2SX5zdzY/RFRBXklpeFNiQ199PV55JSpMdVhPCitKXkU4S0s/V0c9UG0ocjdEOTRlITFZYyNtSDxQczMmY2NtdmlyZzYoezZqQDVKTilgJGcwUVEqc1lJMjw8ZnVgJF5CZ30jRjBkISVNJGNECiteNF4rMUk3RFdpJU1AcFA0S3xyNUEkKitEXnxTWSNvSDNrNnlqe1chUXw9biVqP0shZnl0MUlIQDFISE5hTXk/VE41R3Z5WFIxX2k9bENKCitBanZQdkheVHcoKClpSiQoVXJ5YU17K3EhWGZyeVAxb1UwJHJSe3t4IXp6QHZPPTJucz5BfTtPUE1TXjcjQUY9eUkzSDEzeU11dUk+RGNXCitGNUZFayRURnVvNXszc0o/K09fO2NXQEk9KEVPKGJXeTImWjRAVS15SmtjaUhPLUlPMTt4Kz47e1djTVBhaUo3PFU5fE8jS2ZZMjBLRE4wCitge0hqNz9IND9VV2xoMHdmY3pme0gyTnVEI1g5TjBKSDdoMGMoPlY2dyhNKz5xaDMxcHJvTDFyMT90fSZ7c1VjYEFifn0zd21GQDwyd0xLCitDMi1RZ1NKd0BvaSN7YiNwJllvWTd4bihoO3VYYH1EOyZHaDI+WVZ3SVN7Xyt5PCk3alp5Xj9rTl4yWWZFbz1pfH1ZKkYzdkN5RDlwM3FCCispYUtXd30od2NRMFBnZURDNH57QEZJaCtzLUc+e1RKfGAlbTEpXl9SRTFLWl8yQG0mVG4zSGV0Vj15cylzZjVmeEBgYC0wUnxWNVYza3AhCit3MTMlbj1DJkB5M3pGWHtIdThYeHAqdX5CajFQZ09FRSk+JnJRTVl6bmZxOTlOYlQxb3Q9bDE/UWMqXjB8WFFSMDAwTzheT1k3eURQe0xQCitlaDJebmlXJmRfOH5efFNhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkpYMGJYZkFNaCV+KS0zOCNmYUV1M3RlWUZtXllRSG5FVyFmcEpGCitSK1V+X0A7ez4ofjxkNm1uTj1yJHNTRyF4MVlzcHZpZSo0Vn4kJGdhXl9ydXw7NTZQTXc0KElpbThOT2lDbXMyKGBRa2dHTFNZO058Y2VwCitZZGptUDdXNjJEaE04eSlrP3RWYUs3fDM7JmBtREZycXEqVyYxZH5VZVJIOFUmMGtYWW5LJmJnNkEmUT81NkdvZHRGNnBHej1qPkxaPypKCitZcyRFNDJTbyFoYWRMdURANFl1UUU5c2pUV2p7dmwtWG9fJF9tTHYqV2lTMmw8OERqcHhPPjxpPkFURGw1NnRWIzJnaEhBUWhSaDR2KDNZCitaUlpHIzRSVkxOUGdwPHdsWHJTRFR6fihOKzRiZG8oZVQjSyU5ZX40PFo1blVfKkNJOCpWQ3twamBFN2BlUVVZfDlFfE9kM340TXtwLV9aCiteNWUmdzU2TGUjS1ZNIy1mNHNRN1Y1Y25MV3Rsbkt6MX5oWW82UXNxeDFORmBSP2pyKHZpUmBKJnYjZUpyP1o8b0ppVj9tQlNCOHtub2d6CitNQEwpNj1yRERNbkZyMXR4PXBHYXt0aDcpJFV4UjUldUp4dStYPj5BVEBCYFB9MnZhSFdDdWN3NEEkQTZibkFJPlEmbWtSaGY7R0k+UVUmCitiUXojdCkhOzs7NXA3elBMVzxVan1QZmJFaFppWEJ+JDBqSztoZkU4cGBoN21Efj9EZExkXmlxSjVeOShxVXMzNDlBaWBqMnRaV142JWt5CisjcUVmKFlTUk11Kldxbk9ILX1sRj5CLSRBYkl9Sno0OFkyMkFFfkNQX2pxdmMtZmMkQ19sfTV9MDJYPUYwT0Q+N2BQSTNJajZUM1N0WWdyCitQMl92QU94YEN2ck5RNlJFeiFvPyhQIz01JFF2KEw/aXV+Rj9feGZtYXlmT1I7SFBQQF4xO2s9UlZWendFe1Y8KEw/NmEpT3pmVjFOPFJMCis+P3kkMHs8Qk5xNCs0U3plNGcyMm5AOVEhblc8M24tPXM/TDYqJT9kd0lqLTtkdlZtVHZ7OWl0aFcoXzk/SVJoc1c5RUk8Q0dzOEM8PEdKCiswYkNqaEVydkZvd0ZYUiRMZHshYDcoIVh+IWJxR0w3bGpLRHtNOzx9WS1LMkZ1LVlQZStgPSt9JlUtMWw5fE07X2FXMShVN3kyeUt5PGtkCitRUGB7c34qaVdHLVVSTD80enJCRG1kYmdtalczIzxqV0hKeERUMG83WXg7QEtLXylOKl9ZWGVzendsWCNVe0IoJjViYE1vSUgxbzJYc0ZvCis0Q04yP3c0bkEqIyUzSnRWQlJUSTVCXiFNOChOeUI8VzEyNkVCajRhRmJyKSVYXkZOJkR7TCFeTC12WiR6ZV9CQ2Z5VnN3fX5qamVJWHkjCitARGx5TG93MzJnMFFoUmNkWkFrRCZaPXVORXlJNzJDVkByVyNVMChaUTB4UklxNFgqQipXJEQ/ZDkhbCY9blM0ekR+Yk9waEoyV1psbXN8Cit5RmhBYWZlWihTZzxJLTNjOTd3MzM7SiZCOGI+YD4lTzZkPVAqJUklQ3gqLTZVVnhDVClqI1o+S3Ije3pjelpjcHdqWmowYH5HWilpaDlOCitXZT01U3xodEppfjMpKTJJUHVNLSNQK0B3KSh2eVpoOTg8cUIjKG8zMHFIYSgoZTBLKTVsYWtQKDZfdVlxZX07ckxQNEB1ZF9iNXpiXnhTCit8SmVPTV9JWTliTmFkfXxzYVAmQUJCMFE5Z2EoYWcycShFM1Nxaj9DZWgxVDZtWG9FO3E+OTwkOSMmWT4kPzY7K20hRDl+RG5iIWlAKCttCitPPn5lUThYOEwoR3B+a0p8PlFfdSlTRSp3dm5ueW49eEY5PXAzUFduKyVCTHJpJEd2VHk4cXdUck5CWndXZylzP1hENWtEKypiJVVTUX5wCisybnxkaGYhPHFzSm5PNl58QXhrKHwhcipzeWlxbHVNcVdYcEFKQjVONkJmKF5aNWhNMndRYExIfUFIblMpYWJDSHlHNXU8aEtaLXk7LURECitIbGxvKjFTaEZAantrPD1Vez5oM1FaVEwrPitvSTZjeW5LdSFjTH5AUE5zZjJJWHdPdndHSTl9VkN9b0s4JF9APnV7dXRpN2BAIVpkYmxUCitSYiFxZU9yd2h4YjFwPHlFZ2lJOCpvYV58WndBZ31DZDJuQmxjZCEqfW45Wk96UEokbHA1eVAyOF9tOH4tQyhWNVc8Wn1ZSjBQKHNfKy0pCitTOzs3cyVse2sjbSg2WDl4TSVafXRVezdod1Q7JX4jPHU8ZkclYCpgVEUydW09fHBjMHhiOHl9am0kPEQ3KG9yfnxBc1N1fCFGdHxzR1E/CitURkkhRy0mI3RLMnRXcTVCSGh1WUQ1KlhjVTs+RWIkWDQ8Z0FWOEdWend8I0k5fEF5MCMtcDVlWC01eVN+TiN4d0I4JiVjNz5KeHpzQ2RNCit6KUlWPHpsVHt2I2B7P3tNZFVLX0Q7dGIxWmQ7PT40RWxmKnFFO3VwaSNTPnI3I0tIQFpqPGx4a3BXdFl5Jk0oQjkjaX0yMHMpeyp2cHNxCis4P0toUmx9N2FIcG9MLUdya2ctZUM8WVVXWFFTKSshenJtXnNxMEkyO3EoNEItYm8wJS14QlZRLXdXTHVpRn5YdjtKfVErMlBOeGBEVmxVCitiQn1XS3xfdlhSR2lDZDJ4MDk7dE1odjQtQjJDanxGWjYrLXc8U0xMJDhwfmk2Q3AxOCZWbk4lcEI3TVlSWkw8PGVedGI+WlpKPT82VTY1Cis4ZGV5KitQV3FzX0lremNIWnhEVU9ZTz1rMkIzNDtQUiN0JU0wWEJ6Xm5SaD1+cndRIWBLZzYpKW4/Xn5AMExqazlQLXBtbkx2bDBlZEhnCitRJkxhN0d+MGNWK3FxSjhJMmJkbV5BeSlBNUg3aDlIYHQkM3JsOHNOQUtQQ1gwK09eKGt5I3txeT9jJkVAJm8/UFdCKSFBK0tmQyZDYlQkCitHVnpAMGtFPi1QaSM9MTk9MjxsYj1XeVg2d1d5S3BiOTEtMShuRElDTjI2NzBBZVh+eENzYnkyekgydzl0Vjc7JGlQMFZzMXlYPyM9Rn1GCitMRk0+cG9XQ0xMYGEkNkM/U31eNiM3PkY/RllmaV9yNGw4MSlgIXIlQz85KD95Qn1GWUpSMUFPTnlCMWRaeW53ZjwzQkwrYDc+UChKJHVzCitMNkU5NVV4THQkJXAhTzF7eCslcCFJISF6TjU9QXk+OTF+OzRrJGYjaz1eY3F6UWJSNjMjdkc8enBqSEN7QDRpI0l3eVU0Ujs2KEtiXiRfCitvUkMpQmZFPVUlWEAxPXxSfiRPa3w8aD94aEdgcUhXSVdsNTApX1lBT1lVdnZIQmJLaFFQc01fJFZZang5flJhJFIzJUhvKDJTPU5kfnY3CitMKzN1cnQ2Y0lqZkFJQyl6JnJVZ2YwTjlDSHBadyk+YXtlVD5ZUEhqYDJke1RfcGhNTCFqPjROfkdrN0Y5alc1Z3YyR15sMnZWZz9tdyhBCitpIWY2akU4emB5Nz0hPHp2Zkc3dlAqeXNkPFFYc1c+YFpfKFBNSHdOY01kWFVsPypyaClTVW5lNjxlaXJZZG1MVFQ/UWx6a0o5Uz1eYy1rCit7ez5KPjB8WFFSMDAwTzheT1k3eShAPEp8T25Dd1QoekZCczl7Pk9WYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZKb2IyV3BaPmJhQWpACitteTsrbF5PMTM4WSZhVmpUZW1RT0dEbHJjLUl9Z2w0NT1iRUNtdXQqbyh1X2QtYHMrPiVKMkVxSlhZUSZ4cj5wSldaSVE3ZjlCPj5EXm5MCis0Rll4KG0zYEM9Yysrc3BwY1U2YnJaSmYrIS1hPU54SnB6WVNoUmhIYWU/eCZhZ0EkeiVKKllAXnUlQk5yUyheeGk1XnM/KlhyYzk5a2BMCitaZEs/MEMhbV9zaXEmRlprY2x6clNldE9aMVlRJmQtbGFjQUorenkxZzd2X217TjEtTEdaYi1MdiRpRllnQyVMVXt3ZDxZZmM4MnV8SGc1CisqPVNvQGpXV1J8QmwmOWJibVNBQDhgdlEtb0Q9WEAyNmBxMlZLcz0mRXxoY3pfckAjKUA5ZWxpKWozKFlSZk87R3RSRXx3WSVNNClhRGROCismNUx5Y2NpejRwSllDUEhZamlKOSRDc2Axe3JVUy0pNEBaeHxOV3ZKbGZRJCRfcGVqJlUoQCp9aW5DXyVAO2Bwd0AmQUJCJGdYN3NQOXQjCispe0g5Q1BpJjdxbz8wVVlJTT0tRD9TYGdfWEJeRVRoJGd1QFZFVTA5V3E2LTNGPGsyRSM3a0lwJnhKQVk7c0EhU0t1KWAmZmVjSzFlRUxkCisjOGEwPzF1cjBmRHE3OTcxYCZfJDlnMm9rb1MrIzw+MDJfKDU3dW11NSpXe2FGJEZ5dzIwSTdOVGtWP0BGOGFCNnxFM3BRUWcqYUFaclEzCitVJVg7e31RQDVAciFJaS1jYUo1Z2FOUUhwVlBhY0VPUjBqOVRSSmcyNUpmNHU3RU8xPGZve1lMVUAhbHFmaSNNKmFyPjZKJTkwVVBSZmxICitBTkc3VGJeMUdVREhJYjU9QjFJTVpRb1Fva3Z4MWVeS3taT2h+M0kyKXg3Vk9KQCpBZWtCeCFFQVdCTUg/Rk4pTVh3WnJndChAO21WMGpMCislMSZZOCslcitSWFcoMXM3JD05LSRUelBTLVJ4elpJQFZzMEdIPXgranJCfUAxSnhBY2Z5N0d9alhiVlBvXyg/UnNBXk5tbGBoSUVrMnh8Cit3PSNobjRpWTZPVyg3STF8eHh4fntFRyZGQDFnJnpAbG9qWkpGI0Z7cEZ9OE5tWnpYeHVDSH1kIWBROEk8YGc+Y1lWXmRvdFY3aHRoTUtoCis0ViRXXiZ0eHJqNSRmaTQ4bzltUnZiZCVOUSFJU1AtWVJpQEdEYD1ucEpVYkstMT5oKkRuclZSYStnQ3N8SE9odih0QGN+UUs8YEV6RG48CitoNzFARldMcTxQV2NOcHhmJEtiMERXVEIqc15WU1FQZCMmWWAtZD1ITEduYys9cnxRWjt4PDZpUmF+NnNHNyh3MX41Y245JDRYNS1Ee2VSCitlR3whdCF6XnIoSmduamBTTlRwZzxFTWhZKU9Xfm5hPG11YiFJWkxVSyZOdHRiTTE/YSViTSR5X0xPM3R8V0ZaKXJfWSl7TWpWalElXjM8CithPUU1YGVzY2B2JjJiamhIPl40dFJ9Qip7cjczSylEQjFPQDtgVWZAS3okTkhOJCpuUWIkanB5dCZySGdsQkNwS1Yzb355RkkhV1NjI3t7Cit0ZGJ6LTMzQXs+TjV3JDtfe2Q7NUtjdjEkRGREK1BhZn17b1plNWMwSyFJVGEqIUNaUT45fEdPZU4hYj14NmwySXRadDRkVlY7VC0yYns2CitqWGNwUEE2SzxDbmgjaHdFbSt7TllmJFR0cDYmK2RNaUA3ei1tJiRiTmpgOTlZNTdgO150LUtAXyZ4PGlfOV9qcG92YTZIVVhVdnV2UmVkCisrOWhFJDwyTFVnT0pnK19oSmNJTH1ge1BfaU5ZXztMQ2NWZUxjSS0hbGtHa0w+eSlAJk5rWW5uVkM/VTJfTDBAUkI0RHxIU05pRllfe2ExCit3P29TcG8tZ3pSNmZjWlghI0NafERfJGpCa1Q4X2UjWDxVKFVoOFNrNmM5ZkIxO3oodjB3b0RDNXdjRzAwdz5xMnQ8Pk1CISY9K3JDKntjCitQQ3k2KUtuQWBqWXszQ0kheHRwQkFYeH09RiR1OEBecFdDPWg9NS0/MXRGRz03aXt0cUd6SGd5PnJudVRwbGNpZ1ZIUGFfQFJKTSNOSEFKCitGVSRGVGlBe1F2T1U/WWdrMVE+OS0wRk9mXmtPdnxiTE58YlNsM3JqTGReNzsqQnNpS2JHVldKczNjdj1TPkc0X2N5KGFKbF8tRkhtUH1HCistMFU4LUQ8ZzNxJDR6fFpqQCRzMylvQyk1IVJ5NkR5TmZHOVJeem9KRTlPRz9AI2d3LVQxMzZORmtMdEViSztJbEdhRnpCblBaNyg9NmsjCitAUjtfRzxxUSRBamZXc3pSamQxaiRgT3hIa1l4VUhCQkxWM2Jkfl89YV9ab30wTSkxanBMUUdZJH5Da2htMFYwQlNnQlhwKk5PTX1CeHRhCitEWnUqOU9ePnk0JEcjaTl1NnJPOWwtRD1JZmhNQTNYKkJkRXV4RiY9TVZYY3cqbyhiY0xEZ2xmdD88JChPZz1teikjVXxQZ09DRnpRSzBACitwcWR7TGZac2oqSHtveyQ/cDVpLUR9RmxecHNGdD8/KEA3TXxII0NCbztUemxuWWhwTWhXc05GX2olcnMtPGBOM1dQOGFCUl9qeCE5VWg2CituTHNUXysyYEtgVTJUWmMhUFhKenhaU0FPeEhwanYlYj5xQHxjaGFNIXlGNlg0QjdRUVBgTU4/YVkjQU01ciR8P09ieTt2Ml4yfTsyJFE/CitEZGctKT8qayM7d0hhSzlVRSRkcGtyJFhsSjVKdnlUbmVNeTtMbUZxZVY5e1okVkZmb3g9bWdwbSFTIVR1d2U9XlRVLTxFZS1LWChxWHlVCisrY14yKl5hTGFrdUxgPEI0VippKklqaEVHKUc+Yl4/ITNmV0g7NVIpez9FbWQ+K3E7IT9Tbmc/Vm8oSXU4ISFLUm1NeHBTY0tSVVlNV3QkCitRX3ZgOEJ+TmhkNks9Q2B8NVRMRkRrY0V5RXQrKHFlI0BKOTlaZj55JmJlJihANDI5YjlhJXR4JVlzb21TP1FJPEM8TzU4RGJqVVhfUXVJCis9ZHM0blpBWGlMZ2s/TDYpP3BXX1YhQCE5IUxMezZYbEhtQl8ybER7ejA/PHlJNkxYRnc4YkdyRjZvODM5aTVufkgmMkdtcFgjbiVKPVZLCis8Uz9YT1BDOyQwWm5QaGooK09saV4+bG8hPGR4UChvPCVpQ0gkdUtDcjtQTTV7TDJEWUxwPkBsbCY+K1Nqez0rWjhKUEVOdG5GWENNaTBECitnKHE0NVFpTCVTTX42QW4lVWRfcFdaNHBJdH0hYjZ9LTBRVSpFJGdAUVo3PX5DNzhLZU8mYGtCMlJMKjReK0pAXjlwMFR8eUQzR0g8cDgyCismaT8wJU45OSRVKzxqaGZUIXJJfVQzM3BfTEQ0MkxyLW1HU2xmNDRqJE88NWlzJFMxcU81anshNH5nTDU0WXR6aHMhUGBvRTF+NCFYZDsxCis3K3xCUHp1a2AhX0tMUDc3cGtQZnEpMz9iM3h4MXtpXnMzMWh0P1hubSVkV2QqcitLanNKJFF3U2N+andoTTZYal8zbUVPTG1SeFFxay03CitFOEZQRzNBQWI4Y1dzM0s0NzxqKj94YDtsQDttVyE3NypRWGRpaisjR2BTIUE1RSR+e2t2Y0d7TCF2cl5UPUN9WDEmSio+UShOSng5MDQ5CitOKXJGZ2l5aCNuYDt+OWI2aD5yI3FGTSlEdWxPbitOVkotM1BoazhPTXs2QnxuUSRja0Y2YXpVO01oWTUyVW9SfVIhNlY8OFdTM18xYEdACiszQy1VJmw2LXslRH41QXVuNnJhI3dybHBROV5SVEZ5KzdWb2hVezxYa0FLN0FZUXJpSHJBN0tQKlp7aEtFJUppaXF4bGtiYjU3OWt7flJlCisocFFodT0ze2hNeUU2SUkkI0MqRH5VIXZCP2E1Kypzan44NGo5WnBaQT0yelgmSW0rMDQhIU56Yz9PQno9eWUhUT91a295fDk1cSNjfkpqCis4UWM9ayo+aF4hb2VEYClvIy1+UHlBNkN3JGYmIzY/ZW4zd2JrSlZXZ1FufnpJaFZXRUlRR0w7fSo5WEJZMH1IQCg2U2I+NlpIWlFlKn12Cit1TTckbSkxe1AlZEB1OFNxfSNlNl9ZKFhRVGQyKk8lUT9fMEpyN3l2KDwzN3ZwRW1IIWd+XypqdkdAOT5xRz0mU3JTO3xGVzlGUV89Y2BOCis9R1FUQj47Skc0PEJtR29aNllYK0dMa3tgNDtfWWZ+JElNZnlSfSNoQ0JrUz1IaEomMjUmWlM/PUB2M0puRl5APDNmO0FsJHImY0t9dEZ6Cit7VzV4TFRsR3ZEdDR0ayYwUktKO2tRdzVMJmROQFIxVl9GK2U5JiYxNjhMJk14MUY+OXFMc0FsbkZiMW85Y0VkS0wxKj1QSG9AfSg+RFhuCis+Z2l7XkxHTngrfnk+NCtfWCRgMGpvPFVDYUNQR3FlMDc3cihRe19vc2hEN2FVNWtEMlpXVChnd3t5KFpLPGU5KShiZ2xoRHAqMFdRYWo3Cis+QitTVkFaRD5XUldhY3F+dz5oMHE2bWBURFYxJkVgVWYkaTNMVyZBOD41SmtjJGtjaGdiNFE3bDJeRU9gdXpkaFNXbSpqNWJnZkc2VnlaCisybnhrVzhia0kxNnZDcD0hOSFyTWgwZnApMz1QIzImQDZ6bWZEcD5DTUdVQVoxemtnM2dIR05qS3Ayb1l4Q05kLVJ+RXpta35UQzYoOGo1CitLcnchUmk4RmMqTjFNQzNtNVZsfFdOSzc0UV4qNypKVEUyb3NVVTxrUGBMMnQlY2VKbFIrQz4ySm9gRUdUV0MjZV85fjF4QGQ9fiZSX2wkCitndGRjJEg4VkRWRzBXWmFOc09tYHNgJWlwdmlwc31+VlY+SCoqMlUmdDJLOFNXRlRSYDAqXl9uKkRpKHpCKSpMVjBfJD9reD45ZX1WfHJUCit6K0g/cV5IfHpiaEMoeEpTfTlYIVpyVEF6el9lQDhXfX1DUikoWk1PJmh8c04kQlFtVnRPK1dfViNlV1lRfE5XTX0wJW9nK2Rma15xe3cjCismI15ydm09TT1hZm1QQDd2a0x9QipuUXx0aGUoIUR1fiY1OzAwP3AtI3ZRQ3pAKUNaVH1mLWtCZ3Z8RVR9dDtAYkxMMGFUI1E2TDhEJVdnCisqTXFnSnkycU19eTh2fldBI0hOVSppO1ZCKCZhWHJEPzZlWG18OD8kKFFQWE5zX2N0R1JgbGg+X1VXPj4mYnBmUFZJKSoxUmp2SXxOV1hzCit2OzQ2VXFHdyVSPTEmfVlfMFRiPVRTMn5zQy1qYlpVQTlVZ0xZV2VkZnorelI5TSMjLVlrOENDRnNvTWRuK3NAIXN7MDlEd21uSkkld2daCituOV52aFMhdF59ZHpsQHNzbXg4WjVGZjkhOCgtP3pBO0xOcjB4PX5RVlJJa1I3eSk1JSp3MnhMWEIrR3RsXyhkKmo5Jl4qd2Q7TVVfZHM4CitANEc9bGVHdVZrKmVIMnZJKzVrQn0ya0FVPTVUN3tnNipFNHxaSVV7bitffEFXaVJiYS1VKWNgNE8pb24yWHVxcGA3QVF3cmxMWG5kXjVtCis5TVhDODM+RExBMEtDVS1FSzJ5PHkmbiN1alExZzRqdnNLJSV6JXB4NXs/b1JoemhaKXtEI1FaaHR2eVhlfGdAQ30jN3ElVzJKWHVJQDQ5CiszPzNoRXQrJnhtPjQ8bUFHQ2QmSjw4JXFqdGRSMXtGflA9NXZRcigrYjdnO2lXdG5HbHg8dTxgbVQ/cT0mVGF5Y2tpU2I2RWBhQktTc1kqCis4X0xFOXpxVEI2LWMjREFtNE4kaHhfNClGeGM9IW8tezBuK31DbGxEITRSclBMKkx3SXlwXnpMKTUqKkh2MWpTLTMmRVlId0kweitaaW9zCit9PiFXYX1NWTJxdEYhcTcjWUt5bT1HQU99KV9oN3RvMTIrJGZwNUNDd2VyaHF8YExobjd6ZGBVPXZicFhAQGNIa3piNzY1LWhMVigoYGM9CitBbmdQPXcmfEw+NGpoV3F+YDt1VXYpeWdwZWBAI3o4MD0jd3tgK0tAdkRORT9Pa25mK09HJGJQUl9fMGw1UzIwWnhlRlgoU0doZjxfOTMxCitQMWdKeEc8KDU8SSpUcFNZVExXMXtCZ1M7fEBEV05SY0RUT09kN28pV3I4U2RhdFQ9KjY7TjBgaCY8OWZ5blJ1QHMkQ1AmbEk0SHkhJWM4CitRVW1QVHd5YDVHP0tZeVlpZCpudXczRlU9Y2l1bEtET1F5Y051Sy0mcXkta1YhI1F8RD4kdGZHeykrbUo3TkFBXzY9QzZzRjNENHo7Z2ZuCitHVWxxazQ+ZndGM1V5VDt8RTVyUzJ3OChEX19mTnRKJFJGX3BZMl88eiN2WnlnWnx6YXBVfWUqSVI0JmIzRUp4Zk9fPG49aHlBWmRRSkVtCis5IyVjb0RRRjkjVkJxVSgoeEk1TVlieTktYkpyOEdGfkA+RVcocCR2cH05Q3d5SjlOaHR9anQ/OCVebDhlallkelgoPk1XNHY8cWdwPXUzCit5X3h7UzR5Y0VqJCVaWX0qe05nbkp6RVhrSj4xJkpEUGRwfVcmanNjb1ImM2gkdHRgIy1gNyRUIWJieXV9a1hjVT4rWXlOd3Z8X0YmcFg2CitmPC1GV0Y1M3xUbm9kb0U7O3NvXkohdShvc2NIKCgrY2x6N2lGbUBUdl8rWnVEOTwmK2I7dmJDRHB4T0UoYkpUJk1BJlJjc2gxZ1dgP3w2CiteYFJ4VEU4bG5+Mit3bX5XdilYZVRBUCtMKjQtZjF5UFNYV0p1ezR0Pmh5Rn5vb2QlUGIpTkhpb0lhMHdqYz9tN3cqaVFVSlhaZ0FWZThBCiteVVF+U2tBSWJsRSE4bmU2YEw0VWEhSEQpdF5tXzdgcjd6dHJkcFJBTz1sdVB8bSlENF5rPV5eI3dmQCY0Xn1sPjx8ME0yRDxNe15zWCRFCitJMHBnQ3w3Q29xbUNTKDNzcWlYPDc5TU9uWkJFUWBAN3tUMjhfRTEhVmNnRz9ZQzFEbD0hZFYqWmckcFJwN2Y8WUV3UTs0NWIwc3s8UmZqCis8bElvUG58Q2g9JWJKMEtHdHM1R2pPZWUyU0MrSz5fNFVub1N5RWllVHM5SzBxVm5LTExOMWZFTj9WMD5oeSEwWW1eYTYyLXd6ZiNkKnUjCis5fm0+ZkRfT2hgbXMyYEZ+bFVDQX49KkpTeF5+TkZRNV80Q2h9cm47RGx1JSY5VSg+KWQmeFImZ342PUtNfkgwZTBMRk9MUzhuPDhKKD5SCitKQF84ezYkdClDQjJUXjs8bDlKZShrdGVoMmZ3R2gmfGpTJHlnQTBATT85STtyUEk1MEktMi0hS29VWVBiTzU4Tng0SzIxVU8zQ3VJcmZ4Citpd2loSk8wU2U2NWJBWjJ3ZSF0TkxkO1lHOyRySTctUUBgY2tGbld8diFMdSVPeVFhM0hAWiQoZGN2MUxCTzV1P0QpK3JgZFhDIU9nVDNmCituZnhFQ0lBSjVhakN6Rk1QR2ZJMGxzaVF2NCZtJCN2QjUjWnUwcSMpIX5HJiNkb2BnMDA7cFMxN2k0RWR7Kl9XaGg4ZXw2SG5wRUttSVBUCitLYyNoV3c+VGArXjlPOXxQLT4/JSFxMGNaVn4mZSVQSU4pPzE0VVRTP3ExQyNTR2xZYE5xMWlsKjZ6SU5wKVNkNWh8LW1GJXxqX0JoLTdlCit4SjxiVjdfN2xjMi0qUmpwfml0WjdCMHtxXm9AQW5UaDQrT0kmNUpXPyE/O3dtPWIjRER1blpkXmFpOHR4KHRaa0JsOzdGU1czSlQkKFg7CitiYWxxPzR3eVdhTkw9YihOOFhaYjJRKD1pRShyazxCM31tOSV7TC1jNmwwOTM8Vmg5YlFTaEY7LUhAOWEtR3prRXdARn1uPVk1U2hEQ1dmCitiP2pnQXRVKmZpbiY2dno+MHJBblh5dElVYWFvMkNGYVhoV2ZtWGJYUzlYSVpIOTB1KFk0K2xQRE48XlVwb2tWJFUrY1FUUndaYEBOSXotCit7LWt5eTYwamZVWSYkKlh1fjRaP0x4ZHY0TlpyaTlPVXl3cGVqZ3NzbTNhJDRiTzZmVXtuNHVgeUV7WT0wPXI0JnRaaWNnS2wkS1AlZFdUCitDZ0Mtek8qaV5+Km9ma0FBckhvM3RhQTBGc0hvOE5kITRnRUJQRHAodXI7PFg1fV40MEs/KVF9X2EtQVlAYW9tT1RiamVTa349N3xaMzA3CisrYkltI0FvKkY7MDhEelBZRm5EM0BJZmkteUJsLTZ2WU42SlY1ZE1eJHIta1JZYnhfSCp8JmxFUFMzIzlSYX5ZcVJeNURTXnxze1VeXzdUCis2VG1BfFAoUGlCQWI7JkhmX3hGdmxhIWMtMCFifXtxejAlaCVefVQhNGdtd2dPc1FYbyZyPSlsTFc5NDFzV3QqWHtVPDJTSj9iZypPSX5vCitsN1hAYlI0NjRvaEAxajdLKTd6OXxxWnNFOTd8OEs0eEZAKiQkIy08SzE/KUFLczQhN15QKTl5fGNjSUptdy0tQXRfVy1+bW5LcXYoSnhUCishcHJocGIwXm9zOStDPWVwaF89SiZjeSgqP2cqcnFHVnc8dWglNnh7O0c9MTEmVlNqSCs+Qjdyd2RWbjk8VmVCJkRqLVFzKHhjIVJoO29sCis9Q1I7RD5lVlJyQWVmR09WVkg7a0MkZ3Y5ZngrSnFtUjVsd1Mofk9efHZYOSQpaChGeGpSUU5uSTJvUllGJUpJJFAoRCQ1NGBiNlYxLXJhCit4UHpQbzdSPWhKOyRtJGkpXzwmOUw5N1U/JUh9cjgpWk5QWXBVaEw9eTY3ZEMlUypxeDVRclolYWVfK2JzY3BwWEhGOTdVVXZYNkduZlF5CitXUUxlO24+fkEwSThyNUMheHAhR1pII1FhSlJfS1F0IX01OWNCYDY8YCt6T2dDU0tRc2E+biojdFIzfXNVYkR+Nj1nUXBLP15ZfGF4eU1QCitXKHpjfjh0cVN+dis+WHhuJj1wfk1ja2kqYGxGSGREPjctYjF3fnl5YUZtPyZId2BKMHlSaUA5M2prZ2hrQ3pYPWpmRGRkQE40Rks/O0l1CitnJlokIUZqZFcoYHYkSjR6bXFLOWlPeDF3SHpZZmUhd2I+KVRQKWh8WVN6N2VsTkVIdSktJFB8aCpTY0VIOzZFbkwkb2lqSkREUVdpfSlpCit4e2VPMT04ZlF0MzZRRXlHdGBzUUJJRiQrOU5qNT5RcSlGVHVFakV9KlhgN3A1bCZSKn5VQldTT31DSlQ+TnFLO19aaXBYVCRDK3lDZ1RiCitmQzlWMVJvTH1KTU5DVCU7QmhwJnphNG9ke25sd21leUZsOCpXRmp6ZHA9MWF+U1VHVXJ5RzM2RjFefEowaX50Skpfa0FpbV5XSFh7aWJUCitPfGFNTjw3eXVkQ1IzQkFTQDA7IWZNSUNDYlJTMW1lNHlsKm40M2dWb3JXcjhna1gpbEYmeWA0UztBNGIoJHE2dURkJHskYCY2cXJZY1M2Cit6NmAoUEdkNXJsKEojdzRGTigpIWxxUkdYVWRBMikqazdmNjZfVVJkRHI7Uz9Jbkx2LXtWSGtwclN3QzBWT35MU1d8MlFsVUVxTkp+VX0jCitkfFNPKDVAPH4+e0FpQmQjYlVxb3V2U2NFU1VJMkxlMFc/ZXtrXnRjRGY1JXAzUlhzVTlxb2JBbGJFMWwlcntnSGAyPkYtVWVpaT1wNmspCitgaEJYSDlyMGR1Y0AhUGZhYCFVZkI1TVQmYEJAZVJ3QU0td21VRE9GUTR0NE5RT2lrJip1UFYmT21NdD41cTk9Z2Mqb0BsKlB1Uyk2NGxuCitxbzFXYGlqMGQ1XjR9MkZfO1dlMVcqSGMzS09kYzZveDhES3VqcGlnOVU1PTZLdjcxZU9sQmFMIW47QEBDT0V7Z19fakpCeT47YERqMStjCisoc1l0Rj84SFY0Xm15VW1SQHFQSjNucUh1QEVVVVJlWmxLZG5BaSpXRCZ9RDcwRlcjJlYjMntSdk4oc3FkJSYweDJGREJwNnJ7QlQ9QXpMCisjYmE5Yzh2TExJMU9UYllzYHozdktQfVdANUtoVCMlMX0jO2ZVKCVOPyRwOVY1eDJXKS1gfHMoa1o+SD1BPTQmRWFJRiZaUSUkUnAtNkY7CisjTjBfZj99TEgoUDk7TWtPQnJBcS18Ql5qR14hYmg1d0poZFNvamdfRzVkJWo9M0d0WkVJRndBIVpRKjhGYTkkWDl+clhQWHJeKjR8M2NKCitNOCp8Sl5ZI1V3aUZpVVhhZ09PbntucEphaUo4Q2xVTkNAYXVURDtfMkNAV2x5Yytpb15PZyk3KlY1YT5vM3lseFg/NythTTF6JjQ9U21NCitII0w0amhNVVUzUFdzdEdGU3p4YFhGSmJ2ZGQ8fmVVXn5yJXtkKkl7VXUpU3FjRlJ5R3U9Qz1FUnZseipULW8qLXtffmVHQmJhRnR9bnVLCitoQXhsVXlld3VJZjkmSnRTfUMxPHg7PjB3LSh+a08mby11VDNVan0xRjM4PCh2UW5+ZGs3YzJZdDVTfkZtOWJ+YE1RI3Exb3J+bHF4Z0ROCismX3ZSN0E7VXU+NURMPmtjZUI3K213V1YjdzZjSVQ7OUN5ZGRzeXwmNVlOO05yPylLQ2xDdnEqSjglb15SZERrMDwyZD9AVDEoNEA2dShxCisxTm5pcTl7d2lAeXJBPihDcyNxI1ZUTSg1JkBqLWsoUyZ4Xjt+ZSEmWSo9U3VIcmB5JXhFZmpgbVd2KUc5KCQtVmA/eDU1IWZBKjhpbTRXCitwJldQSVVBaFQ9X3t2SmJnV3ZsJEZBQytMXlhRVHMlcFpIe2x9T3NxbnIhLTNoSl80PCo/ZiNuZUdBaC0/b2RibH59bTYmVzxxKG4xc0leCit3ezlXR1p2e01eN2dpa2xWaH17bnBFVlRATj07N3dkYlk8Q3JQaEs0JEhrUnN9az1PO0EyNy1zVUhxfil+aEVLQSh8RiNPQ2wkUFJeMyF6CitnZ017MXU/LWFhRmJ0PUxqNFdtPXRVS0E8VHVBa1h0a0FqRiQzPGNpPHRWTUxFTTR8Jit7JkAtK3xGRmNEJDlLPWJsWDxxKXM9RjspTFBCCis3WEMxdS0/UUtJSSRpbylGSWN6WTV0S2JARWJ2S2pqXzJxdGQjU09NP0gtQElwPXloPVBpRSFEVyp0NlZTbC1TSnVvYm9KYmxPNWV7Xnc9CitZKGAtfl8jaTckall1QGU0WFo3WHNVUypUa2Q2KE0kYU49a0xzdlktejFWYjt3Sk4/b1o4cl9Sem83ait7VFFpUlZSUVhDJjJtV29rVXJPCitkPCFlSipheElZWncmT31FVWFKNEB+Rz0yIWdLQEpTMHlqUHZOc0ZPOVJZeHxLTys1TD45d3h3e0Znd2pGM2UtVnZ1Tm08YHk5cXB3KyR1Cit0bGI/M2kqQyhPbGBRI216MjFiZzw1YE9TJl55cz1DQE19MEpYaVhUan40JD9+a1l7bGs5cmBkdmE+JCg2PFBGaGk8dyplMmVjYlolI2V6CitXcEBJWEpZUWdZYFg+Pmt8S2pfNl8jRDUjJT44d3k4eDUybzN6LWx8d0ozJHpWTCYkbEhVY1VScmlNezQyQGJ8dGErb1paZVo0WHpxb0NkCitidFZia31QPVZyME5hJU91U20+b282V0JlUUs7SXhlMn0yPEFmVyFvfSVLblReMHJMUzcyVitZVjZuZXl6UDd6SmZBR2p0WmhiZU95MTRqCit0dDl5IzMlb0RYZ1QhJFQyVmVnZnpwdTNAMkpTe3hCaT4zYi1vUldMWXx7QUdsUWZ8K2cmND9tfTBJfFNwfnUjKSlsSj1hUmIhYjdZIWxRCisjO3tsPEFsSEp0fF9pRX1HKXBHYTYtSTdvN0puX1NPWWQ2Z2U9OFZ0JWFKRmw+SEEtaig0LWBKLTFyIT8oYVVNaCRTYnFqSTslR3BPJXheCitkNWRlcnVmVFZlaG89YUlfKz51bXNZPG0qKyl2RyNPNjMlU2l6MkFQRjF7VDJUa0kkWn1OKm9RfSQlOT5CNSVkUSNqTnE3MSozSSsxX0dOCitLejteSyFgN2E5cks4KSk0PTdKPCRmdzNYb3ZmZUQ3NG9+Ml58UUdgZXN7OGRIZG5+K1BTKCVuM2krNjwtJiRCQjF6eGJDJWVlSHFPWWlfCitBM3l7cXZiKFZiQ2FvZFpyLX1GTng8VU5iaD9Dbn0kXiljJHZ3YiRAeiF0O1l4cyVBeWIyZjFvbGE+PlFxU3VOdWtWc31SP3JfaEB6VX0yCis9dj9NeH5BcWpsTSM8OXJ+NVN9bWV0T0c/LURzVGhpQSM7cnQxKHlTSStzYXR1MSRwKG0+MURTcVRNJVVqUD4yWH53THAxRlRiZXtaZFZhCis8cENQZE0kSUJaX1E8VVR1dC04IVRzREhzbXYjUTE3OCRyNzU/MGMmPmxpJkMwRT9LT05YMi1gfUhqS1ItVypkJCk/eUE/NH1nI3pRcHJiCit9SDxSIzRxY0JRRUk8VGolc3dFaEcmaXc+RHA7NUAyS3E4d34lemFefiRAMk95QEUzITx9PDxXSGB5TE1+P29VeFklQFkmUyZgRSlOUT1uCis9IX56NVl3RWIkVVVPe1laP3lqd3chcl9KKnkzMEJgM1lPI3pyeiswMlVGMzJkVigyazVkPiU7WWhIODUwTTRje152JUtPSmBJbnVVKns5CitSSmhLUW8zVn1ka2Erbz9tNVI7MGRwZDNtRjd7bXdBNFZWWkoxYHVCOXZ9N2BlQSppM1ExdDJpRSgxKEV2ais/eEc+NkcqVV95N3A5Nz16CitCaWg9eSlOS20mbEBoLXZXPDVQJlNSVTx0VFAyaXl0cDJhUTcyTVM7dWREYjt8MmFWaCRqQSpGdzd3JFQzRiphRz9gP0hWKF9WVChUK3xCCit0Zjh1UDV1QGhBcDwrPDhuPCE1NnVmI0U9RTVCQjteXjN4Z1QtWU55RUBkd3UwKj9HKiNkYFd3OEJKQDVpeWFKc2ZxIz58SWdaVFVXODYkCitLMWc3OClzfVdCamdhVFkwcUo1dD5oPEsrdHkmbGo0dkVxbGJJaXZISHI9NUVSYyVZSTwzOTIjPjJUamNsfCF6RjsqVGZiKENieEp5Z0s7Cislc0IxbVYqO2VBQSQycDNpQShDdF59az5YPXteUyZ8M0lBOEtIUGc2eGZRdDBaMCYyaU9DfWIxYTI7bHFHSWorbVluelNBaSg1TyFQdV9CCitOJFY/SUlYMDM1V20hVU07OWlqenRjIz5BRF8wRT43Q1UlYF8kMm8+T1lyUzVnXmhUZlNfdUI9SiMoaztrUlA1K19NVmh6VWE2Nl5Yc0ZpCit5V0AjZWQyN3QmMnFRMHgyMXZlWTN3JXtJKEVtN2xEfngjYmV3clQ7QiNMSHN3ZCNqbyEzJktCMDVlezxoYCVBVXI0TyZJdigoSU95X1hCCittdmAwRm9kaDdfPFJBa3c8WHBkQ0U7O3BCT0dkYEVucioyYzJYPEspQChkMClzJW5sK1VMSF5ZfG5LeEc4NUR6JWBIO0tvNFhJVG9nbVYxCis/b1JycyttOTwlVkJoRFN9QzdFQTAzeztDe3I5bXN2I21NQlk7USYrSmVUUTAzdFpaYzBmUlkhRHJaWEc9bTtJS3V3XkJqRHc4RzVLdnhsCisoZmAkaXE1bkcpTXh+ODlfQn47fEh2UyhhajkqWEl6WVNxanQpaEMlWlJPc35OUWp6VDB2Jmt2Z2BIKlIkMmNtQCNAamV9WmFEa1hybXplCitGWlAjMXpoXjFxR3l3bXJUN3tmdFh3TDN5ekA3WExaPlRgWldhSmZuenRTb0FKUEBsbXA+ZEcwOVY8bGxaQjBDPDA7U15MJGtHY3pTYV9LCit2YmJlUmh9dTMycz1DPEIoNW1qR0Y8aXRgejUhZ0VUSGNobzNAZH1vdCkhUUs2ZUZxRFlsbl5IIT96UEomP0prSFIxPFdsMiElPWY1eDVYCitXY1kre3A5bGxLOTF1SiZLWmYqSm1UJElOV1gtKVEzbiVPPyRKYUExbWFEZGZpVURvTnI1Y15waT8peCFMMClkMUZxdE9GQW8+YGcpaWp7Cis3WipqYF4+PEtPVVNtP19gQz9haiE/SmhvSlYkdEhjXndfd3U2OyQ1NXxtP3VtWEl6Y2F+M0dQc2RxUjM0WnQ2Z3o9RzhfU2NpZmglYn1qCit6RGBxbiZ2KVp+Skt5YSkhdWZYfD1mNUJVa044WSRJNy10ak5wbSNMYTNxNWg3PlpMUSZNKyo0Vmwyd2hHLXhCU0ZDJGVqdCRJcFBoIzJVCiskMC03VnE3TyRadkVRTns5Szt5ZzszPHA+SWRgVyhBOEJxI1R3cWVRITBhKzV6QTstWCE/SEdxRUllfW1UKz8zJnZ7fV83R0ZqR1FiQC13Cit4UiNXMlF8PFdPX1BReFlILUtfJihsPEM3YyVqV2BPRzlGUj4oeW9mMEhFMDlOa0JiaUF+MGxtZGhGYWJOQiVGdXZ6QWx3K3AtezVoNk1TCitpamhCUUwhcyVCQzNTTVl1WVJSTjE5fFNJZFdDb3BKdEdBOWBJfHVIbXV9PGh5a3QtKGs0PmpOQj5VXm51fmF3LV5EJGFIUjxXWVFFKD5ZCitzen5XNnNrIz09XzZAeCE/eG5kX21sUGdwPDNfeFZHQyNvVkVhZHxIMWVKLTRQIzxmJVJNI3FCakpuPUorbEN2SGshKEhAdjxIKVRhZXlFCitWIU85YVVoXmJBKTl1bk5BcHlZVXJqZHNvbDREKGJ2QitRZSRseXp0SEg+e05fMzxxYSNGbCRxbDMkYllVZWlFRUsjK3VQMlR5JTtEOHBgCit8X1gmamFoeHtgV197U3NzZ0Epa241Qlg7JWFRWjkhR1pQNXM0fCQheVopMVJlOFVvWmlgbHhLIU9ra3NCJWZeVTdZYEt9PFRwS35fP0t6CitLSWJLazdaRTJna3o2Q3w9eyRePXVrcyE5MWwoT2FeYjB+Q3JjRih5MGVjMj9xZFdaZiNeU3hzOG9rV0xSfTYoPUd1ZHhrPGtCa1RPb2JVCiskMzlPMzkzLXJfKUJZXlJLTURUOFJ8eXVraHA8Y1dRXiFnT2VuaXpPZVVmSyVDYmF0dihmWmtSI2U+cz98WXBQUE9OYCFFVVc8I31pP2M2Cit8PXdhSkEkSl5IPD5BV3ArIVYtPUdNJllWbSlVaz56d3k7eDAmX0Q+RlEpNVBGKyo9S0dUZno/Um8wYUEje1VkT0RqZ1ErK0k+dilqV35UCitTQlQkX0oja3klPDdHfW5qfTJgYFFLPTkxaXReN0ROPlFjM2N9Zl9QVGRMOVBSSmRuTFloYDxFYS0mRk53SD4/O0RjaDJBc2tnPGlLZGRKCitJQlVVQ2BkI3toV3l8XyF9OEA3R1VKMWFXa2M4MV9qV3BfQiZYYlM4bkJJVnI7PilyRmckcWpycD8oWCl7WEd4I3Vackg0UiNNaFF6YDImCis/I0lMKE03YXEkaiVoRGZVTHhGO2Z9SispNWdBRGZHQlohRzRQX0cjOGNaMnYmKDRZeUQ2VzBgUHZjUiVyN1M8Wnw1b2FfI0k+UyZSTyVtCitjRW9ve2Y0Rk5YfCU0V04tK0F7ZUBgbmpkQ0x7VHVKdiFiNk1LNj84TlRYIXxLJVM/cm0kQ2peI2MoaWwpd3BMZHNYSyUyJDRRTVRjJkVACitSZmFoWmNLaWhPR0JTemZpOWRGO31GTHVvVm07K3tNcH5INTU3KzlAK0orcFFOMUpmRmRsNWBgSD1jJiRgT1R1P0BZYCtOem9sZ3tmYWBmCishbXwoYW8yenNlP0FuPVUrT0UwSFZNfWRURmtgYSQ3aCt9SyhMVlhfTUVpZVlwOFEqbF5DI3hYVW1EfFFeTXRAaWlvaUdxWEUyT0lJVDlsCitubDBYPj5TU0JkSjVlJUAhRGVDTGglMFApSEVhWjhkZmtHTShkbG8/bmpaYVFxeE1EMXU3SE1WQkw3VjFabmtTJXhZJH1Nc0dTRyt0d2g2CitFcGZSUGYjbFUyZV5eKUlxMXRUQEgkRmNPKiRLcXp6UiYmKDVJIUFAPnZWRHE1KXZ8NCM4a0NFYlZeI0wkRks8XnwyZVlpayhsaTVfO0I4CitOOHY3Nzc/YGdoRmN0bzBmdXNkamteJnJLYV8wKz8wJl4lYzY5aiVvRkskVDQkVTE9d0EzX0Y2Vm14WGNYckVXOUV0WnxDPVpPb08keHNDCistNUlMUHU5ZmRZJEBsVlh8SFRCIXd9V3Z5eiV6TG1RU2ZabU8tPGgzMWIqRUEjb1FhWVVrfGthZCY2XkB1Y05yUDRpPXklVEI1SyhmJSVNCisyfkR9SmtYZnNDbSkjbUo/aTFKZEkxOChJLX1XMnkwemBZaDhxUmwodChTTEVic29YPENAYUNUVHl2eDJtV19HblAmR353aHUtTHtBU0xjCit7eUFqcmtzKmdzWnBkeGp3MzdjZ294MHNiZjhCa0hheF9IYHxYRytuM3FSbSQwaSsrPnNIWjVXZD18LTE+QzhZYFheUyQmb1UyJlRVPmJUCit7eF9JIVJeb19pejROdjMzbj9OKTgtYD0hfFElekQySkAxd0FyYHZLREJfTn08WmAoNWF5UjNodlNgWX1BQT0xRkw7ejc+c3Fna0srYUdiCitpT2glZUpiSGhLPU94JmMtO2FCcV9XUWJFSk9hS0dXO0pHKjdEZXNma2M3cnE8U1dnP1UlKTtEJFQ+Zis2REZUSTJMMUotTTdjTTFzRmZICitlMmkyJjk9OUxfaDJ7U1lUKVVjPjlHQVc4TV5VbTM7ekF5OXtScjBxKWtvZjdvP3pYaVcyfmM1fG0+IS0pZSFBPH4rND95YEN1OGJicnQqCitQcXxnc19APUZ8WG1WUlc8ZUJjVj91TTZjYFREZU9rLVVsJlZvOT1MRkpoRSotOz9WS0ppSmQwRXp3XnNiYkUtaWI5PllzdWp6Sz96VCZhCisweFo5REhqbk9xXjUrKkAjIShxKD4+aTU8dndkX2pUP3NuezlQZkohXktDITJlKkh5SG1oPGV2NWJWJTxjXlNwVXI0dWY5Q3J0UG1kSEFtCit2alc0fG9LVWRzczVed3dnUm1ke354U0RsP2MzO2A9I21pQ3FOaXpEOVVMfEVefTw0Sz1ecjshWCN3OHA9WiR8RTF8a2U+ZzMlPGt7Q0pLCitpZmt7ZSg9bi0mX05UOT1nIThLYnEjXlp2UnBxbGhnSjVfbX13amE/U0Y7engrbzd0ayhQT3I3NUhNQEJpeCRCajlzYTgrYn5WZXJLMmJUCitNcUR9PmREVXNfaVhfYm9TYFh7VjdAamZhJWZNbUN9ajkjc3Q9T1U2WjthLXREYUxaTS1+X2J1eitLLSRnOzJOKztUOGolZjt8Z0VQX1N8CitULXo3SkR1e1J0bXluPCt5Z0Z1S3EmQTtjclVNSERrVVBRcyNINjZ7c2txfmBORjEwZHopRkNBe1BhQiZILSZ6REdNYEYkUDB7UlZzJkpjCis1aDZSO1IpcGE+Jmx0ZGcxN2VAJitkR09iU3MxejZfemNlWHUwTXl7ezl8Y2cqPikhbWIwRSNIfC0hMHJtcmpeP2d6eUhYKU1jcG9hRWwxCituTXQmOGdSdD4zO2NNSF5Re04rZXpBUVJ3UzNHXiNeRi0rWSp1VX42Z3Z7bCg4akIjUXVXUHx+e1hyc1BrNm85PlpzamhaQH4xNWZNTHclCitxOFZ7PU5oK0xEczUlKSs4QWFkMGtrYWRJbFhBX1Vwdz5EOU4tZzc0TkNHZ1oxNEF7d1JMKHNydWxidUhBY0k8WU15fXFGMnJVT2F7dCRICis2STRwX31acFZaTlBreHpOaX1GPXo9emwybSQ4OT1EVlF9K21XWH10YnQ9bnEpKTFla0ZRcTRUakhuV0QwJmZqUkR9Unk/bCt9U1dfd3JACitFQ0FOUTtURk4jVWB4Rks2TDwocEB+clFqVWhDaVVtaXNASlg2XitBYEw8XzRwRHRHMmBxU0QoTmdmc0R5WW9La20+fHd1TWFKSiljYnxTCiswNHVIaSFIdC1FUV5pdz4qU1pnfSEzZitxQlhBZ3N0aGRJcC1mIT8wempiPXQkSmZ8b2ZYVSVpbnAqYmM5JHNFenApRU0/alNuTERjVTF+CistdDY1KjBNP1ReZkpPd3VpeytUMWNjY0Rre3pfTUxnblNIPm01OGk2WU9iQSptTGYlTnE/U2NoNjA4cTJ5PmR6I20tbjZiSnl2bl40e3lFCispZyVPK2MpcnRmLW82NXpDKEhzZyUya1ROOGU2PSZnd0dZMD8rUGEhVHFKSnlHNUJzeWRWNTV+NjdfM29rJjYkKlNLZiVrMDY9KD1zQyt5CitkVCp+VGdDfFo3TSEpRTNtVyErX1FMJF5lTDtUcmg1NmIwZzhjM2FeUnhFX2BQfj1oWFlVTDAhd2Q2TzVnZUV1UDRtczZHYEB9T3dRaCVlCitNeFBDOD59YD5vQ2c/M1lgdWUoQGg/aWtkdUhmMHAjTVVMfVkxbEhaT0VycTwlSF4lQlBUZD19aFV1Xlp0OE1uYlEmb28qKGhgdnxocjcrCiskSExwR3hOODlgQzNAY0lMXmxlcTA5cSRKUiFgO1FaeG1YQy04NzlpamUwTEEtZTF2PjF0TWdHKyROYXZrUFR6eVNuKFM2KTJoSVZ5ZmQ2Cis1JmZidzRkdm9gdmtmMUstN1Vtd01iJVc0Nk5Eczt0SUp1X2VWUGVibW40N0RtVGg4KVNrO3Robk8pLXlLUXhtZjY0Z3c1P1htSHszbiNWCit+WXZ4MEBNJDhkJFdQYWpIRjNDYHkmZ01ONkxEYWY5ISs4aDdOOTZ1fWR0RnYlZzElQyl6XypWUlV0KE8xKWRUKmVpN3BhbXh4VEZtRXQlCitCaVVQIyZJQFdmM2F5YG5hXlZGQTJYP2JXfjJORWoqeyZFYFlsdUN8QUQ5ZTdhM0lsQ2QyIzZvTy1XNkkoN2Yyd2lRWEVHPjRQdVNHSEFfCitMQyp7XkV4YVhnWCFDSDxSQXJpbFkxJW1oN3hLbT12e3ZCU3FPYUZJUUUpe1IlISk9aTc9cSVNWTRJKXZUYFU5I2AkJUcjbSUrVzNDezFDCitFMlR4Jl8xb2t1QUR1cjxeYTdQQjg7I3Z0RFVXYEorM1ljOUszKjkpdGJPTDVuaENgYlRTV2pUcz45b2lTU2NTazsjND1kQjgkKTNuRFBpCitJSVZfPG48bFJ0YEtlcmEyK3B9U2BJU29iN3YpbT03fHpQN0ZJKHpnaFlkPUslYSNMd09rLVo2LXVBLXN8NjZfMEwzMGJwcWh0TSY3cHJtCitpUyR4b1gwYUVZYHF8aW9GSStvJnRiO3JRRFNEdShKODtxb2soemh2eHkmPFpyRHhPQDYmTl52cHBZYFFoRVd1JiUjOT8ta1hOcFAyIWdTCitVaCNmQi1iQnlsPkYyeWIxKzUrVjZPN0lSQG1rVldOTCk5QDlZKEBxZn1KNCV3OF91RD5VNHs8cmhpZWI/TDFUK2hEPk9BYHIrNC0lKjA7CitWQzsxRi0/Mkg3dVorJiR2XmhzemRSek1pakx5c1ZDO3JPSXZYLT5va2N1O1drcCU2QnI4QEdQekdyIU9UckFkOyoxdE5+PTM9ZVlUWCg1Cis2SzU+PVN5ZFoxelZMa2YkKzc2Z3x2NWNDS05sOC18TSlQKCFeflQqXmI2RDBicXJlRWE4fSpFX0BfNT1WdjVye1k9RkxobEd2cFNpPWdQCis7KVFOM15ZeGh6Vj9eTGxwcG5xUDhndnNQMTRZeyF5K1U8Vj5nLUdyIW5nN0txdmU/M0B4d1EpTmkoSHI1aE9HLUt7IyVqTDckJGdeV3JCCitqRlZMXzlyJHdoRXRmXn5lbF4+V1NuZ3Q4ZFJ4ej01Jm1rUWFgYFRHdks9ZC1SVComMkRZKHMxMHFJeDRXZntoNFhaU0R8YyV4VUYhQ01LCis9XlVhJV92Y0VpLVhPZFhafkZ+dEYyMG8mS3l+dSFaYlVjKygqWHApeGp4VUE+bkg9dkw4SVBpZE8xO0NnPTdzYmo5QUozPDc3e2s8fG11CitUZVQpM2QwNF9QNSVNam17RGYrfkRnRV96Vjk1SklGYygtfHNITzZjZCU1YiZ2ZU5WUnU7T2Q0XlpCcFJ0KSQ2O0NVcjRWVk50QWFRQGl5CitDSSpVQEg7Z1MlJVd7aHh7dVhTUWoxOUlrdHJBP2N7P1hZNjZaRjFaXz9Ld0hMSVJSZVE7ZTxHQiMyMUhjRnVPKX55Z0BsT3AqcnMxU2RGCitJWE9mXz9fZ0w7Kj88VXQlKnNsdC1tXjQybyM7VmRgVkV3SmV6TUBBcD5XcE5lQGQ9bml1WmlmcGZPe1AoWGRJUk1qPnFPRTAzWURNczdJCisjPUNXeDI7Q1pXYCs8LUwwZWFhSCR5Uz00ezJfTWZlPW5fNnFCemptTHRRbmEwKTJuMGIlZng/R0NtYDlWPWRWb3xNYV99eVhNVW90X0FTCitHJT0pWEokd29tPldeTSYjTFV8eDhoUHxYOT02X3gkSX50eClLbHZNJTBMTGIoVGFiUGx9YWotMCY9cChMeigpYz13cGdTMHE+SEREOWZDCispP0t6MzlWPkxALSMwamZzSldOejM2QD5gVzNRZEotRnlCeDJGcEJzOVJBS0dfe1Z5OXJ8cTkhe1l9aDtwZVR+WW1AZzlecnpLRHYzRFlMCitIMVpGMSFSIWtYSyQldUxfMVVyPkNMWl4pTT4/YjgpTngxU0RNYDJid21CRFFLSmJ9cHthTTRvKXFhWjhgN1h+dmRqRT4rZT5eTzx3ZGE5CityOV5uLSFoUDNhflAyVyN5eUdeQSpfPW5KMGBNa3RzdDNEWkYkYztrRjM7fUhgSjN8bjl2T29rYFBpTUpgM2J3Yjg0LXg4KyE2WXh3cmZ+CismJVFTektkRWMkfEgoRysqJDFfbXg4eGl1ckdLKiRTfmZSUjsmT3kpcyhgN1g3e2g3O2toLUA4eCZ6TX1QaWloWn12YjBac1RDUHluQ0tNCitodl9HMXY9XzYpZGhYcUwrN25wJis4NjJRYCNZblFhRXJgR0hGUGBSTlYtWHBoJWUtcn05Unk1cn55PDlXe0lCYk5USSlFanB7aVI4YHlLCitvPTlsX3VAVnszK3huWmtPTDdVbz9jSD99ZXR4fDd7ZkNoRTRUej4xQWt0cm4zK1F0OVR3anFeIWhCaWBwWTdHOUYhNU5EUz9MeFZ3SXtKCit8eU1ERyZYdl98TmhKJUBSQEEkTG0jJiVyPjQ7bHBtYThIbGI3MTJWMUh9Xk5lSWQpcGc9fUU8QWJRaEZaUjIrfVZ0Z3lePVpqSmk2dG9CCis0eF48Qz4yPnl4QUZDO0gpQ1MzJE4kK0g7VXh5b311U3Fzel5rejVKWXVEKENqZVBUY2p2Vy1aKmhoKWo8Rlh3TC1wc0JUQFpvR2Z7eiQ9CitydFRGWiZNaFRXTk5gMWo+QTRydmdAc217SkY9eTJILWl1QmlFZV5KN2lUOSRTVSg5dTd9YSorSFc2YFFZRTljbSNHdF8oYWwjQmI9SFRwCitDTnppWUAmSlk0U1A0UmJ0QGB+Sy1LMyo2NDE7eD9HRHhYKzdNUXlHdVRPJG1WS3NTXyskUmVrZzdwMWhmOFZ6d1JjcGpgZmNlbDA3aEI9CitSKG8hfSlVIXA9IVljaWBKODc7SXNvOGtKNUo0dlRIdypOQVlZOSF+MTR3YjtQb30+WFQoUXZJRTQ9e3tFTSlid0dZOSEyM2xlJWdMYDcyCitZRXYwZitCeH1tYXojMDNRR3pXZ21hayRORyh4Zk04KF5PYFVYdVdVbyU7cz19SkpoenU2c0d1U2cwbz5Ba197PmMtZjNTUmEjeT8oJTBtCispWnRnSDFeZlVCbEZ6bTAyU3ckJWVkY0lKMSZEK1oqaCROakJXUTA3V3VldnhZR2s/WkZ9bT5oSjBJPmQhQ19oKy12UVkocSYjcnk4Q0heCit5NFZxSSQ+PDxAX1hHUUE5bztpNHpMVWthNVZrNVlPJk9uZEtzKm9tYTNQbSRpdj10ZEc1MDZmanMjOWNJTSVrZTxnVSY4U1ROYmhOe1cpCitWRURaNHcyRFRuc18wfWZYSGY3Jlp3Q1liPj8qPmAofUFIXiR8YVk8e1g9QWJRYXZXcjZ1LSlBSyVpdXoxYnJjcjsoZXhHJU0ybjg2NXpTCitTRUQ9TVgyS0dYPXR8eVBnMFZnU3pDYH1FVEtMPChhR0I4RSU0MnJCMGZxTkI+e0JgTng2ezdaeCRkOXA9cUkoeXp2JCRiRGZ7ZlNpM0JyCitvNmgzN3dheDZAZHJ6WVRNcm8/P2ZYd1lwUUZPdVp6YFdvMyhMT2c9OTRvRV9GRCVZQU1RO3QwYiF2YTd5a18/b3FCbnI3Sjw9fm9LNEROCitSSHZvJjVoRUl8JD1XZm5vWG4tUCFAVlpIKGRFMkQkJmZafkFLJSVfcWI7MUQmSCZtZjdaT2tvNnYwdUg1Y0AkY0s8VlFFfSYmZy1KIVUrCitQUztoTT0wYXp1NWNZMmxqJHEjUlBlKURHa31ueztFanpUampmdFYlR2UzI2pLSXs2Rj5IIVEoWkJJeURxZnUyeX5gbz8kUDBNKCE2Zi09Cis7ekhQa25iOVFVQHNWRFNXMH5LUU1sQGxnNjVPITkoZ1RYe3UqQHVxciRtOVJYRzIjITEtSkM0XmUxTHo7S2FBSEI7cTc2OXYhc283Kj5aCitVRTxnTHM9MypneU9XUDE7LXIzbD00N0pjbWRDPDMxZzkwX1Y8aHtsVnxnRSM8IU47YHBaQW07RUJvfW89aiRrSSZWYTs+Z3dESGxHVGFrCit7Vno9YGA5Z1J6RmR1dnVBVz9fMj89PUVVcis3OD1WKjdsJld2MzhESiZGWFA+c25rMDZ3MzY9UkM2YnwyPW9+cHdAJTNRcWhvd1lqeUhACitEWl5LZCpRelNpVU5JfkJDTFlDP2wjNj0pJV9Ken4tPDtDNkVtJCRgVDgqeyh3MEoyQFlodkgrNldqTDwjdC0weS1KVUNuUDtkUE8zJnxDCitWU3JeeSMjO297b0IjP2AmUCt5WTRoKzNfcnBUeDM0ejZkI3dPMk5oUjs5bXRsNiFAJDFuSE99NTc+Q1h5XmA2YHhnbUhKQWcjK1FpMjNOCitrLTQrciY9fk5YMXx8VkhJSVowRHFMQmpOYiheWGFhJCU9UUdsKXVvLUVXZ15HdWVrPUxsdE8taTZsMW9TVWVFbkt9NlFhRnlfOUN0QS0zCishZHxxJSZASnF8KUR0ISE1ezQkSTh4ZilQYnEpK1NLNn42QSs3YFJXZnpXdSh4XmUkZUFwWWtPX0A5SGAmc1RyRFEwbUt+ZUR0KW9EYSZDCitkN0NGVD02QjxARTA9N0xtUldoUWNDQE5ANDtzeD5ib182VzkjUkUyTlF3UWAwajkzeWRNNDRzSyEzVH40O1E9JVJLSjZablFgNiR3WCk4CitNTlhXbClTQn5IVVlDclFKYWRsM2ZybnQ8Z1NRVjdgcWJ5OyNrO3x6WD5iekN2JSVPaTFePHFpfUUrJDVCUHA7YSlmY3VNMn5tamopRnl7CitadTZtI0FBbj9fU25AcHN3KFBYS3pBWGA9M0dHWCM9ITMpSj94Yy1PdkhYSHtOdDElOz1FflZQbmcwSklCPyVRRTd1Tm5WJmF+YClFVm5ECitqSXpgeXgkb2VAQEs+UXYoZGU4JnhaVjw0P2JfdHJqcmpmPyleS0ZYRW9qQVVWLX1kWGh6YmlMYlpEblYhQ3hndGNRcGlpS3A7U054aDw4CitxcSZNPVc7ZjNSZ2M4cUlYMypOeSsqT2xIWEB9ZWptKTU2YnQpPT5ZRF9PVjc2Z3RHYU5USiEwa3J3KXRReEMzcGI5UCZxUSlld2ZaWXRrCitmYHMwOytoPHpHSitRcik1OTtmUURaUnhCM0pkcmBNP2gqTztte29Lank7cmdlRTF+eyowUHgjdGNDZVRvQD48UkE2P3dKWjQwSXZsNzVQCitsK2piYENrP0hMVnxfbSt2OT5VbypWJiU8fD5ANzcycnRAZCh5NTB4cysydiZCQ1REVnhtcHI1fDcwajM+ITFrOXQkbT4tcmM/Uz91cz1JCit6PG1kODIqb153MnhERD9pcX5JUUx2I1BzZ3ltc1ZSO2dRb3E+Y0wjZUdaZDU7fCRIcnI0QEIrYT9obmp4TSpFZjFKRV5WVFlNJng7RX5FCitSUFI7aHVAcT1DR1N9ZyYwSEAjcE57UXZQPWtZZ2VDOSpQND1idldpZ2Q1NzRQLTlsdi1MVCstbzE1dXU1ZDE9Ul5qTkxGMnorTnZjSGw4CislJXx6QVF7PXRJakw1JXhTM1ZCJDBgI3dae0Ekfn51Wm5tN0Q+ezN9LWpCblpRfngoTllQIyU/ZWNgX00taDY1RlYlZkM2MDV3JT1CY0BjCis9N3pRTU8qX2xqYjNJS1loRytjNSshVWR2Vj1mWH5mWnFOK29wcHclSFF4dDwyIUVOTkdOKDhUXlJnKUNEVTl4IUVMeEdzS0FwS2JgRVN0CitjdjNkJjd8NEkoJWFuREVMPjVLNnoqUGVgWT13UXlBdEpKbmo5MEdYUzFfV19ee1poJWNCMCZiN0xFKWJnYkNDY0ROS0VLWHxnK18xeFhCCispbXZFfVB+JWU2dVpFYzk3NEo3U3BycGNOZDF+WHY1T3g8QnptV1MqZ1NLWSkhPi1vVlZKXiRXJVB9K29oOTJzOU50WG9BPlByaE4oaWBZCitoQWR2TFVSQ3VaNV9hYCY1djcyQTNrc3lHPTgqSVVsMDQ2X3xRS3g/OVpie2VzfGJFdENmb1VTUyhmYW4hOTx9ZHJ9JEE0dWE1Kyp8MyFvCitgTUVRQytoNU1PYTRXLXxGQ1VLVDthITc+KG1oXlYwWm96Rik4SiN9IUZ2cilKakxnO0hte3drNioxdSpANE1OP2pSaHJQcz9gfkZId1RGCitrUEhabjJeYnh0TVRYZkUtJCtkYnVRWVEzPCp0PyMoPURlLVl0eG5YPjlVK1NLeGpEb0UrS1U9RD9DNE4paGE8VTRoZlVaIzh6anxjIVN6Cis7QUpzKkA1SiZYa0hiVGUjfCskXmB6YnwpLXNqflZlQ2h4cHB9X19NRiZge1FjWj95MSZxe0I0eVNrZXpRSEd+N1lnJSRAWTJvayNpcyluCisyU3Nic0Vxc1BTQD5hN3EmcHNgPlU+MF4jUmshe2Z3VGk0NHFLNz5PJkhkblZ6SmwzbzEzd2tzUDFDJTNYX0VrQ247flNNeS1iSCYwalptCitKSWk/MTg0emdxRGFeZU9CPE8/P1VncyZjY09FQDU9O0NwVGpFfXdeJTF3NFRMUG89eDN8S296YmRNI3NrYF4kYVljey12OXNzQHRtQml7CisqNU4yTCRnZmAyVSVqY3d1VV4kKHl7WDlTdEdmVCRuKVROcGlhNlh1O2cqamtrI14+aVpkeDdIPiUrMipYZGh2Nj81U01CKFphNE0lQEpvCitWalR0TkgmIXVDZjQ+WHs1Uz1CdmMlc0N2JEd+Vmp8M2Ymel9IQElGcj9yR1FjaD4qbUpVNjxTRkF1O297YylnJElZQCN0fCQ/Y24/P2M3CitWREIqOzFiT2FwLWxtaHpwdSt3dWNYMT1pMjJFRiQjKUBPYktQWDJtR3JkQV9gKipZKC1PdVA0cXclX1k+aT8kMXROP01RaVVYVSVwcWs4CitnPXYjbjFWNWpaPVFhVkVhe3JvWDdiTF5gZzdUNEEoWUBBM0s1PVJjVyklKnRvamptZkdZKzg+Tmp+NVZ1PVg8YTJMNyRSez4jPTspWjd5CitlKkctcklLazBYUytMKmo+JSh1U3pwfGRke2p4JlhYO2FzTU9+b3B3WnNpdTZDKjl1VE4peX1DSyllRD53a2N2PD44KVBrNVRnKndFQSlDCitaOzxzci18WXt5e2MreSFrIyEySUl7PkNiTm0jbS1WV0hMX3JYN09kUnw9QzRARkBvc2pYP1hDV0RSJmVmMnxnUUwjOyMtdXNAb0c7U2tVCit0VCg4MnhvYDZjcU5hKl40YCYzWCtUaFoqI0c5ZyQ8JEktTiVJS2plb0RXREBEb3BLYldITitTc1ZtNiZCOz1Lfl9SQm8yZXBpdlBnbFY2CitMM1ckeUFBV3xfWHFEP3NzZElefi1GYSg3blFtQCo7Z1V5PTNXRk8mN0U7X0h2KDE/TG0lJHU2MHk/bFckYzh9Y0tyeWFyJDFWbFNVQE1hCitoPE0+c0pjO2hhX3xWOGhiJUwxeiV1UDl8cT5mP2ZjJVMtP3NKZmNTKjdpPkl9JVlOd1N9WnNmaFlNPXZWSk1LbiZRSXFkfnhNOTlROCM3Cit1NUpSRiFPMCVFZE1aVnljJjRAUkVya0lXc3R1Vm5BemxuVEoyaTQ7Tl57ZEViUWlTTjAhV1JsVU4qXm0wTnRnKTNJIUN7aj1FVWRBUTlWCismVntYS3NIQXE9LThnZ2FqJmsqeVhYfCg7dkVUZEdjeXNuU3F8K35SVj1WNT1pbmghTT4pbCk0K3ZFSkNwREZadERAfUtNUlE7WUtrS3ZpCiskQCRAWi0mWTdha3ZJREpMOUFvczZ3eCVDS3lsczxrcENxd2kySztwP1F6JDhyZnEyPXJyKVZEcF80PTtnV1ZYN0Q9aVJ9bV42QC1CTUJhCis/UygyYjhvczlnXjwoWiFDRUMoVV5mckVKVlJ1bDZGKkczRSlzPT9TcXVaWCM0VkpuPjxGdkp4dkBBOTNQdCM0PlhrNE1kKU5VWFJyNWBECitXSXRST0ZvbFpCVTh4eFpTeCZIez1yWmpHKy1CbWlPajxIXmd9R3A1NX1uRnRhOWdJMHBxN258IyFpQl92VjY/UWhHKFVTbUFTc3koYFQ8CituJG5oNCUyVHJRbldYJmFHTFRVNWczNV5CbHo7USRGMnpMSCRBeCpZRmlZbDZhVWRNQD8rMUpMcWMxRnVDbXxsaCstKDtyUTF3ekNpMz1iCiszZyMjSUY5UH1odnAzTEhFYzVlMUNxJTNHOyR0Vj9wTH1IaHVzP3EhYj50Z1gtLXQxKElaYn5MRHpjYikhZy15VlZWVTU4TUhPa0NkNHN2CitzIzt+YXZETSo+X1dfclVDMntnbUg/U09maDx0JGVRX0NXSTlJcCg2ZG1oWkE8eVZBbUlZNGdlWVA8YnFTcj53elBkdnxWXyomV3ItdCk0Cis+WXo4NCtLeWpORyRCbFRyJjlzVDJLUDI0em5qVUdheW0oYDN1bmdPO3lSUTgmPD5XO0hNV2JNd1B1SDlrU0tTYWQxbEQzcFpUdEhBJU1rCitnIUQ1bikhd3VEdERWPyRrJFM7YVpzTlZARW5JSExxfHJTIWRmVVdnbU14eFAtRWdCeEVzbjU0VHx9bHhTa2txQUBBOSN9bkQ5R2dXVzMtCitEV3YxMlRMQVJWUUgrPW1mc0VZbDJiX0d5NktLVVdsI34pOV95WFBwRUBrMHM/fnZWPiQ0cGNoeEdyWT8kNFNQI29EZT5fPyV5SHBCdTYxCit5RXxlWigyRUtKQV8hO25pWGIzOHprVn54cm18VT9TeWtgeiNRU3tfbF5MckxybnBrKHhWa1kka2d4KFg1JHlTJW5nMFVTS05DZyZOQW03Cit9eHo8bmt7ZHR7I21VOUVlSnEqeEcqR3hHZ0w2WnBaTEw9WlJNWTE1ejJDamxFPXRMM2cteWcjYDcqd0RAanxYXjFaQjNfaW5Aazh8cHdDCisyYSUySTNVeUMoQi0zZEhAXmJRPTMpN1ZAaGA2U0I9fUw7KXpmdUowUmVfMUU+QGYmaXIyKGJvRzRWXkhRP1NCJSowalRzUCtGYS1FNEskCitMPzlAM2FPSVl2TFh5MFB1cWwkUFE4PGtOK2MjJWZOP1ohMlNmfCY7UU13YD5YIT8zZj1MeVZFTlU5PT9tdD87eD05ZyVBWThoU0E7YXRvCitPSnQ+N3M7MXtVeWY7dGBOI2JhYHNVcmh7PHFuZGY4UEpELStyVllfcTxQPE50P1QmWDNPOD18NmxIZlUhI3JSNGc1aHJQVyh8O0hSaS13CittRGlqTjZYITZXeCpkbUtYc21xTVImeWlyUkBFZSp4OVNVOUl1aD9kUk0pMUxCSjV3WS1tfktDUkU1UkJ5bEM+fk1XeUV4KGU4WHw+dU9KCiteKGU9NlRsNGhgTjhOSj9uJlg0dm97SktHa0ZwakI3UXV8VShyc3UlSEh9bnkreTBtfCFuMU9Vc09HZ0F8S1R9VjR0bWpKO0pDM2dqU2k5CitPaVpRPE9AZmExa2N0fHlVQCgkbnN8ZjhxU3srRmt3UU8rWmBxd3A8aTB6fD47Ym01VzFMRmd2a0tXZTVFJD4yUUAoQ28wKVBYeUs7Q25qCitGbyV7T3RTNEtpWjdkO3Qlc0tAUnhPYTl9LTs8KzBJZClgdWJoYmNIR1Z0Y1MmK2xuR1dHNyh2bCR4YkZhWndwaG4kQWBjdXZGeWkhcSVCCitwMD1IYl9NMTlWKStkSUdWbipOaUwkeXNlX01FNmJNNmFvPGYtPzNiN0BTblFGclc/cmNXX2w7ZkNEQE0xZGJDMUVFaSZmaCNtO3BQT3J7CitxT0FHMW5FaF95TXlfaGI4K31uYUt8ZTtBellRPWdXS19PVklqcndze0t1ZWpeSVo1R1JObFYqTmBHWXZlQDE1TGtOR3hkO1BVbE45UH0hCis4P3R2WTUyekVTYHkrWT9BPDZiQzg8P2xwc2RBXip7V200Z2RecDVPY1JWM2dVPEkybVBYa08xPXUrSD9HUnhgeXE2O0hUMD9MNEVoYmF5Citye0UofF5QJkh6cyRiMTdgfDI4JEhFXylCV0ZtPSReVkZmXlRCcUslaDQ3bHU9RGNeMmt8KCN7RWRPcW87Mjt4SmMxaWo8R2pkb2hSUSFXCitIZXwqdCp6eEI2JTVxdSY9anRsYDh4bElzV05qVldGb34lYnhiOWJKPXMzb15+MnJ3ZUp2ZFFUNi1DS2pDVSh5fVQmdW8peC1eRTJMODU4CiteTj9BajxYSTBPekRtJlUkanhOY0coTnQzO0dTUyVqIztEKEN1KypwRGhsWGJ1Rm5iOGNtNnxla3loXl8zOFBCO3VMbWxDVCsoM2NzUUtUCit4dXpYeXQkVDliemQmWlE0fmo/bk5hRnQpYVFecXB7ZTtpb0VjS1VzPEtLajc7SD4qZXw4UF5DaVpeTSpWNExTPjE1azRRRz1kUnE+V0phCitUM2h+NnxXbHdLbjV1WkZBKlkhZWpxaklMOGMrSTIkX1ZFeWBnZUQqeVNUQUExfDM8JkdrPShgPipSdjRAQ19LY1E+STdnJGtSVDJxMm9NCit0aDw9X30oKmJ4VHFKbFRNbE9nQUJgMEFNc0lgTEI2PjAqREZlcld5PHFac2Zue3BKZ0tVbkBtTFRDenlXeVpeRT1UcyRZJGA+VGhBJWlkCitgVFE9K3s4NzszS0dwS0VwRWQwYVBRT3BnUV8zUjZ9MkttNDV9KjN3TVhVcllGeURLY2tGIz9nWTRNZylqVWJ1QXlIST0jeEFaen08TG90CitLfDdZbEFZeDJoUCFCb1VPdGhARFhxMkJ0cmh2UGZoSW5MaVNzbTMjMmJ9ZHkwYl5qTGhoPH14O352WEdrTDBhVj11V2p0bHAxNz9+JjFJCislI0Z4eDdKcm18I3o3VGBwP1JXQ3l8ZWp4PWprK1BoI314ZDE4Sno1VEg0YzdZNmN2ZT0qIWQjT30wYnhOZVRFTjV9Y2g7N1JQakM5dVJpCitrYnBvI2hOQj96aW98YXRSNH5iRXUtRX4tQW01NWQrbV9KNFAoTE50Qk0hd3U4dzU4cnYlVDRIR21sNmhaaDFfKE9vQH17S3JSZ2Z8YFZfCitlISl7ZjdwYjRMX2RuJWQ/V2QtQ15fYmx4ZX09eSlpQCttVWEzaHBfM05KUUpaMTV+LXJMXytmblVKOUNnTzBpcThWVClGT1lHb34lUXBECitQfE4xLTkrb25AOVp4KlZoJVVFZGJaaFV5VnxlRVdHYVZLJGlvbTNZNSQzWnBMJn5PPWtBJDw9MWN4ZUx1LUJASzV0QVRwdzFyUjxocU1PCit2IUprUi1VOChLfCQjNiFacXstdVlVcDh4aDh6STVETEQ3PnpmMFZKNCt+Vm8jKmVlPkYqJCRGVysoVUNMV2tgRlJVe2FuRHprTytzZHhBCitxX0h0R0deUU1EMWYrRjVNKCE0fEcwUTMqMTs7dUMyYHJ3Qmp2bnVEQ3tCdmZTRHdrVCprWWBBYUllUVVGbUFPQlhIekBuNjhnTmVEbCUyCiskamlOY3I4bTc0REBwbWhrPChwdU9pNiFHVmI+RnFSP2lebW9meDFDKT1HcTIlK2pFSXVKTjZ4eDZ2ZHd0SiswZW5tekJFT15zMEloc2ZLCit3VVd2PmE0bmtgd0tvVH4xRXhAam9qa1U8RigmeFc8bEV7UyFNTSh4RmZyfGQtej08IWFzTjZ5SW49dXxrfFhib3MyeGcjIyk2I0ZeXkY/CistMERpMW5heyRxVX1YbElOSjBUSl9NSSl+bXUzayQ9YzxZeVZSMHtjTWkkYEk8QzMhNW8kdCZNMGI0KjVPZSo/Y29kZ3MtVVUpMlJ3dCVeCit0Pk0+amVudU9AUnQoUWh4IVpjWFU8XnRVUXNwdk9kTCQhJHR5fVd4KiYhaSlQS0hQPlNHP2B8SFpyY2Z3dVZESk5ZaFJLcS1RdjVDOzJACit2S1VpPDFgJXlUTk15WFZ6IVFNXll2enh+cEN6TnY2ZmhDLV5qQm52NWRUYUQ0QyYxcDZiR3NGbnJrRTIpe35EbSFYV1h2UnU5fip4M3J6CitheytzP3Y0dWFrc0xnfiN5bm47MWFUMTBgR2Q9UF5tZlpTVTZea3lkdGdzflZQSG8/U1RtVDVoUlFzNyNeeH08PX02ZEhnYzEtNmtNPUA+CisqM01EKWtkO1IhTil7T2MmR1dWeE5ge0RRTEJpWFh7QTxsT2JrJkwmPkp2aFRpJUFefjNDU0VCbTxkbTFEMzlhSGBHN2g4UyhhfFo8VHVUCis7ajtuZj4pTy08SHpQaTVVUVBfcD0tWEQ5VUBeUTFpeCpoZ2lTOXs/JHdsMnA5aUd6MkgrOTBNbCR+KSZXSTQqQVQ3UHgmVTh+TEF0I2k5CitKNyU3eit1YE9XJHNIbzBzVmA8XypvWVZhTHl0OU9ReUUpS2p+JEJCYlR2IXI3eH5gPUs7b3tAUUtrNmA3Uks5YUBINUctJUMoRUhmfD5mCityPzc5Um8kWmc0dihWPyEqKUohMl4+K1FlQip0SXVnYFdxemUoRW0tUFdSTT5VRiZ6cGwydmlpKCN9cEspMiZXUVNHamBwOSZoMmc7JlZ6CitPaj5kdlpsMyQqbE5UUiVAei1+aXA0V1FJa2QlPkY1RSojdEE4USQoeClrXjVfOzJ3YEQwVEhLeWl8a2FNaz8zNV5idXxoeyRHaEpgaSshCitQcEZ1PlYhSUp8OC12R3Z9fVdEWFgqTSZpIW5EQ0NIQHF5cX5iaSF4Qmo+K0t9RCRzUXhjIzZgNSpBPlVuJnNqTVAjYlF7b35vRzY0WD89CitzPkFxRHZpKmRBUUd5cDEzPlE2Y3VgaDZxOGZhckZpenUpeCkzQ0JLZWQ9Pk15byRUa1AhJlZzVlk0bm8zP2Y2VGN5R3JrOHc9S0ZqZ0ctCis7dVRQZkxLQyZgZX0+a0JUOzkyVVZrcVM8eTRjZkwrdWlvcVRoUzF0eUVgKz9lK1hzVyMoZlM4diYtWlUpdXsleUZRfXRlYFo8dG9qZH1SCithbUBCKmBUcU88U3NvJHhDZTJvSEVlRWw9SWxLOWYmVTAxO0o8cnl3S0tnZDFDNXFxSjZOX30+ajx+U2w0XyVNb3V6cG5QUWVGdmhlPW1iCis0bGcxfCM/aj5rJjVpc2NSejRRVWtqcERza29qaDZ9bTxsPU5vWEJNdF5DUnMkPXJhfD9Nbnojbk09ZCpjQkkpZk9tZElWUiMkbypWKXk7CitOeW5KYHZ4Y2M+TDhtcilhcFdGQXp2ZGZuSSNJLXwkcypiT2dLeT1XZm44VDBKJVBsczw9bllqfFJqKlI+eyhadCMkWGUqbm5XbUtPUkotCitSMEMlKWJ3bS12PHo8YTVqd2R5VzFxfDdwcUBuPVJuVm45U2tKcXlzPHZPNHNee1ZtWTY1MVdyKz5eclpMZmM+Nlp1OShEblE+QWw1WV87CitmWShydjF3b1Ara3xseiMkSV5TQ2RoYio2Ylp9aWk7Rikqcj1LSWUpa0A7TiQ5JmAmS2J2MEw/RkpaMWRQPUBEdjYmZ2Q+bjFoVlFeQ2xrCitKemRPMSlIfXM2eGEqbUVzWWFBejlMPUImKChVXm0lWDsmP3pZVXAlbUpsKzt3QDNfQDBiV3loVHFeRVBZcn1VRWNIYnVSX2t4PTl7fGhWCit7dyY3ekNFdiZlezhIczs7WXx8ZmJATmF7VWV7fEtpVUomMkVKYmI0fmlRKlZiNkQmcmQ2aSQhP2plQF4kZ2sqNyYhY1k8OzVSNF9MansqCitrM0kqR3d9RndtZXpMR30oQCtrazhNN0NBJjlvTEhqPkJuMHIhZTVAYVpaSnkmUzAreHg9anJQSFVXRkpUcSg0ZGJHPUhRNDs5Q0d0JSNTCit5QDNWU3pUKUY5TD1qMSpNMkp1JUl3NzA9LTU4KncpYD8oOUlsejErZmhvMFJlNnswYzg8dEJoRH5lVkZOUys2NDF+YEpgSDQoVFlDY215Cit2Y0N1T1orKXQ1SXdOKktmZVlIclUzU0xsakZHODJzfmJvbzczd0BQTG09Pkt8aCMlVSNfNFdAUUo5Z2s+Q01yfDRfYUI/d24xfUB3NEU4CitgJnJXd093cjkrdUM3fmBNcnlnZmxAUnAmYCh2NnxaQz5jbVM1QXExdS1BPEteV2dHfFhPfDY8enByQHdiUGhLfG8wNVIrRSZxaDMtd35gCis2I1lZYW1idjJYKD44UXh1WSQlNXB5S1lLNmk8YiZ+UE8kakVKNClaWkBPaF8xSUJoaUBBTWtgbjYqdSluJUVhVDYofSVncEFlaH01eGl9CitteWV2ajQlYF4rV1B1NSkhZG9rTGNNYVpVe30zQXZ6IykjXyhsJit4T3xSJlM8eypDZyV6b3xPVWBGV1JGJld1YmROPztYT2g3KHNrZDV8CitmKjZqO245amZsNypkTHwoazs1LT16Q292e2MkR05JUjtNVEhrSHVSRndQdkx6elpXeWVgVF5GbjhZZShhQyRFfCltMVgoYHpkb2pTNEo1CitpMVQzTExiVT5YQ3UkZGR6ODQjVSNZX3RnTig+S0pqb2BQRHZvcGZyKkZ9P1M+RzExQUtIfEt1ZzJ+O2xVLWAhQzlpcFM8JUhjaDN1aHU4CiszY0soJHozIW5FYUJrYHYza2FYaDg3ZlIwKk89PzRkRnlTPz9FfE5BaTJuKHslPjlUO1Z8eyRyUnpSUSE7fCg4I2FZMFQ+b1F2UFg3dGlQCit4cSNaOH1iIzs2RlZwSCZKd2krdTtGS18mSHR9UWRXYF4pY3BAeWdoXzdlVmAxPT95VU1OT3pnTVdefUs0QzQ9QUtIVGQlIUhGK0Y0JEpFCitiNWNrTj84TV44I3FKaDZ4USNJTShCY2FuNHhoV3dEc3EmYzEqTXs2TW5EQE92JEFzb1JiQDlqQj5gUFUkWT5hWn1rSEk2SCVueT5MYkt+Cis1fj9xJW42ZjdHd3ZkMm07R1dqIUtUYGpPb1IhJWBEYmo1JSR6RWNlck1OOEBab2luTDN0dFZ3b3NHY25IWHohaSMlJlhvOV9TaFRmTWVVCithMFBGMj0tVSU5Y2g8a2p3eFF7Nzx0ITxpUEE9anpPWG47ejgxQUdVIzZUMTR8c15BWEhqSE1ZZWpkNkBgQDhTQ2FNcGMmaWxzZ1A2I0hTCituSW4kRGxvdHIrMTkzQUFlNlojRjhzO21eYV5qZ01TMDcpdUBvX01HSHBVQFo7QUFmKnsoPTI/UWhsbUllYFheSjlCPmk7YWAxejZfLXxlCitDKW41RmtsZlEhXmYqfE0qYkpLSmluaHJ1QnNzcWV+SFpmcl5OeGg5JXJ6eGxePENfZ1AxSDk9ekNmcDxkM0QlQEJBVH44WGFgTz5OMHFyCitLKkh1QExeS05JWmNSTFgrQkdadWhtR1dzajFTeXkyO0EwdXA9KklxTkBDPGIpQDd6ZH5WeEh0cXI1NVVgfUxHNX00eGItNmg4KmhLamolCitnTV5DMWBUVFV+Vm5PSyNASFRmdih8dDJseVlJaTlgcGE1YyZLQ1lENngjK3olQ3hDSDFHJjM7SDRWK1dSajFyS3Q4UF9wKH1gdmh9JVFlCitmYWtFJkV5O1VKV2NnXmlkek5aVV9YIytlbUl1JSFuWHg+PXJnJi0pcCt3dWZuQiNTWFpUWEdgPCRiTzh2cCF+cWg3diE5cntZSmx5dkB8Cit6eng9cHAwfGlCI1BVKEQ2I21YLTg3MzYtWEI1VzdHcmxsWWVBamx6eVZ6dyRaQ3w5bHB5cSlxdTt1d3V2aSQ5RmRmOW8haGo5YT9GWGMoCitMUiN2fm9BdjwzVk17YnVLOztfciRiNjN+PGVXP3xLQjNgZXIwUTBPYD9RUH5nLTRUUEFZdio9eSF+dUYtRmZKKlFqX0p1WFV7eCo7cFZ1Cis5NEkocSEjdFZYQSFfRilaNztUIyM8RUVYeXtsKHZSNWwmSVlITjRwUU41UEl1dEJ8O3MlJjBDfShpMGpVWVkrfiUtZzNJK2BEI15BIypLCiswUHhvZjMhM09HX0IoLUMzWm16M0IkKmJLVF5eaz1nRzlycmxSO2MxfSl8VVRGMz93dnhrUjIjcH1TNCkqRC1hOVZaRXRjZVdUI1lpTmdBCiswekNwOUhTKHVUdTN2bGJRRmR2YSk7O2NPVnRfRyNfTy0oPH56b1klfFNfaHVYNjgySD4yfHVkNmBgaXYqQCtBWDgjMDFIdXVyRihDM3FYCitzcmFpV1N7P00pO3BTWTxNQFA4NiRZJnMqRkdlRU5rSyhBbEFmS2VvV20rK0xfdXx7ZUh0PyR5dFZrU1FjSH1XY29sODRrPyl2ekNgK0tpCitCSihkTndKTT8qaXNWTDYoaE1pdVomVTc4YFU2eSREV2M2MXwjS2AwSks2K1VgUXtgK2ZMUiVMeXI9QDRma3NmTDw2eDc+dUU/bmBYM2V0CisjO05RUjZ5SWJPM1JsKjJVfV5vTEA0JWgleGUkXiYxKCVJMGVIcnpmb0x2SHRSUWlQemJUeUpqZWg8Qmd3KWJCRHAjN2p6IzlEYiNOOzlgCitHXmsjZ31ld1NCTjZXeH52ZkBlb0dgaD17aXI8SHdqczhxPFQwSl93c2cyWnF0TmY2N19OKkdMPkF4bDI5flEhb3l4M1BseDtabTREdGtlCitWPD0xVEBvamBnWG9qNyMhUEUkOEV7b0psLWw/WSRWZVhtMUBfT2U8KWNlfWpWfU1le0A1YF53IUp2bXRoQ3BDOFFIfTIqS2AyVCZvfCN8Cit6YEJlOUFnbV9AQU4mM1VufGVPWWZjXz4qZkZkVyEwM2IqKTA4QWk1YFpPOUdmYG49UGQrUzwpdGNVJjtuSkMmbzF4enZfZlFBV0RFZ0ZDCitvdnlEKUphX0JhempGVmZZNjlKfl5uc2NwS2gtMlZ5V1hzNF9Ybyp1JHQ9JH1weiNYaVIkJVpSdntTakp4JkBwfWZhWHdsNGZHb04wMioyCitPWnpxVElONGdMRDw+dEZWQlh6UzBja24jeXlSYF4lfDhVRmVndjtiTGBaOyQyUS1edCZGbVM1aDxjaENhdjxYND1acEQ5MSRVYFF3ajhKCiszdXkoS1dQbyhfTnUoaiMwVFA8MzA3S21RXmJHbHFzUmpVUXhKc1FzfEIwJDtyak56ZGwmeEt+LVNnSn41RG95fjZmVnp2K2tVRjxEK0dTCit+dHdfPXc0U3VtPCkhRVNaWHF3UjdsO0JYSyY9P3pgcX07bl49Z2Rua2FyaExINjdVPVd5TXB1MHEhR3FKNVVgJUh0PyR7WmNLKl42MmVHCitBKHFlcjR3cjZqZGE0d09rbVRLYzxLdjhgbGZlbGglY3BCaWQqT2dTI2dfODNAZ1p+MCZ9MCppUH0wdDU5VlNgT2hLZTdhaDt2RVF2YkZiCitLQk1JYFB6Y15DJFkzTT9YVDJ2ajZ5RDhOPFd1JkJLOWA5Oz1sMyFLYktIK2Q1bjxvYklARkM3SWh3aFRZejk5Xj9Dd0h8UERBZ3JfdT5ICitrbz9qM3ZePzQ1Tns/X1c0Uy1vb0YxTnplYT1hU3pGUmlPPmdDJj5WZSMjMzsoWTJEUVhIcDJ9U2hLZTA/ZEkyWmJRQCZgSDZ7V3AtcSEzCitsYiN4KV9wLWlFaUpBPGI3eipYYHZJWU8keGswcTd7WDsqX0ZPPVJoTFd4dTNsZl57PX55ZlcqPEd8SXc7UnRUWGI2KkFYdnwwT1VKWTl3Cit1Pm9teGNka0JBdUxaZEtUZ1FZZEhHM0VUIzg4ezx5U1hZQCE3Pn1uZE5mTmMhXiFWez1SakhMd3VRe0w/bEotKHY7bn5NSkt9T2Jna2NFCitiMj18cDVuSjcpVDFZRSUlfjtlZmYlZm0mUHVzZUchcCtteTVod2A1OFF3XyYhWXgpQC1BPDIoJU44aW5oTGhfYmBVRT9zJSFBZ1IhaTBMCis8YSRPQDFZQClCRDg0eWk9WHpyPkVzbSRxMih5aGQ7MzhfViRvfEV0I1QqU0ZPb1BCU2N5Tmg1amQpPVpeLUwzYlJCSmRFV2tAdiljc18pCislPHNmLTA4OSV9dTVWV04zX1AkQm5rRno1UHU0OVVDd00rd2F6dUs1WGR6Q0hoc3UpfVVERTk2SDE0PX5XMSFuWH5aI3pFREtpfnpxUkFpCis/TWg3O1ItZmdxPylpPlRXb0kwUmpqNCNFTGQtdT0mbjBUZDZEdGZVJntgT0BJO0BOYGZ8Q3ZnUkRXPmIzemc/QipCRnJodDFJVmohO3A+CitNU0g2O0g8eiVMPnI4M2V5cigrTkdTPmBhczstRzFhMTdEYll0XmBUZE5RYTBrSmpPPSgqQDBYKSRzREc4KiljOTlIPz96KXFzXjxDbzNlCitgU3h8a0MySnRRM2BOLUlUO2Z3LVlsUm5XKVdOTEhVKmFzfTU2NEUheztUSCllR3pCKnpVTFBnQV5LJlM7ajxBKyZQODhGWVVGUVRoZzh8Cis9Z1BVSk9GWn5uWTF7NHo/emFwdXFwUEVQK1hkPG5AdEUxO1lQOVdxeyYhemJSeG5LMl5BMEEhVTEoJjNYaWBoTFBvUHh9LTdkQH4wdDFDCisyJjdpWVMrOylvRVA4QDQrYjQrZUAlQ0UqOCR4bEpATDdQbihZKjFtUW17Q1ZOa0IwKE5IZmdfaT9wOGNIYWliJX1sT3cxJm5kMjEkcERgCitlWS0lPjEwYEpkIytxRnQoWT4ofDVCaC16cn0pN0gxLXRrIWhhMmJTeTdxaihTRyRiT1VpNTspfj5eXkJ1MWZgM31pK1FjYEpfbHlTRiZnCitMJGtUYSFZcWp2K2pLNTh9X015STBnTWZSZG98SyV0MW5UPC0xUUdaTHhAek1KbV87TWYzc04yZXtlMz9rfVk9JC1PTHtkXjhZWWB5UHVDCis5VyRyKVVFSlgkU3E+TjIhc3lObj8oSVdQPk5zJE1Kdj42Q1BlKyFTP01QTlZoXy12aEpecCtwKF8zZDJsQiRAbEpaZ2UxWWtIdjVQVitrCitHUFllXiotOExHYzltMWVmM18xSXs3V35rfnJhaG5FK15XK1VhQEdpRDVHO2wpUGUmcHwqX3VYZ3pCeFNNMmUxKSZueiliISkqSXBYdjJjCitVQk1EZmxIaHhfWTRQak16ck0wJX4+Uz8zUDhhI0g3bCYjTz9ycGEmWTtFQUtyfklkJEhQWldudTt2c1l8cz8/V2tqPVk5UDZJTz1TY1FECityamsyaitfRnZ6eGtoYSpye3dyRSRfKGQ7el44UmExd1pUVktoXkk2QXhlN04lQUxAZWZ2aHAhcnB1Zih5eX17Wll8PE89bkhjcFluJipxCit9WV5QdmxvWXReQ2M7dHNxNDEmeGx6aFBibCtLXy10Q34qejMtLXBVR1UzZkRESTYtTnU4NGZgb2YkTT1KZztkcWtOVmM8SXVtdGJtJiowCitGNiN8X1lNTjB6Sj04LVhCUjImUjVrflpLe094ez0+Q2d1MXpkUUw0bT0xamg+WTJvOHg0ZkxfVGlQRWlab2NpTU0hZER3OVQpRFl3bmxmCitzRDhUYyUlfWN8US1NNm49NWZsVjN2Jj1KUSpJIWRUYVVfRF4kd0dOTmQqK2deY3tILXZ5eilUSmNNO3FNY0c+eE4xM300X25Xaz1QMX1lCitRbD5YX2U0bkhKc2JqeHw5ciNQYmdLUE4teStAMWNPJXJIR1U+YnVlaHlSJlpMNUVhfmNvbmpyLWJAeHxOQXtETF9Cd3VnXmhta0VjbEhrCithJlhubCgySnJ8UGhgUWF1I1lMVWRsdlZgdGo9eVQ0ci1JV0VLYitLNnI+MjNIdGFwbm1iWmxESGFqalE2S3QhaytaWT1SNmM+SW4lOERQCis/KSRxUEgjLUFXfVV9Nzl9a0ohXj0/ZmphVWB3QnlVYCl6NitaZj9kTklXPXI3X1lNJkNva2UkckVgXj87ZDVZJUpYMzsmKmp4M1FJdE8/CitgOGJSSE1UY0x3UylQPys5emRwd1RASDhJX0hLR2koZkRoVWtYcHl+QDM7OHV7RiFqazttVCElZHRkaEtgbj0pSzQoVXBJKU1aYThGO1BDCitjKDZoM1Z4O2RrQE5XOElWQGYwTCFuNVB9c0BLZEE9P205MjxsQ2lXb0koRlhldlpJYipDc2xybThlaVR8K0psODgzcl5ve2FoeWBePChHCitsLVJ2czQyelJLJH44Vl9gO2VYfVpPbzxLJHZ3R3VYfFV0RG40SktUQnI3WTBrcjRpYVZKNU9SLU9kZXFxVFY4OHw/VTJBNUMtalg1MnJiCitVWG9vIVc8fSU9XzJ5SnhvZ1FvUUtRVklLTU9hbEotTGhnQD8oPSs/dylfR2lgTFkqTmw3cDZzJXUhWEVzRzxQITBIOVlRM1Q+KnpRU0l3Cis3MHR5PloydFdfJVomVTIxfGNDTkJgcWh6WVVvRk15OEgkTj1xUkY9Ni1Qc1I3JStkcX15dlc1XmJoMj5rKCM0KjsoU2g1JmREdmdtMm0kCis9cUI8KHByQ3hhI3llfSswPWt0SDJ3XkM4MyNjTD4/RyZWN2pHRmt3UHlTOEZnbChmcV9+eV9AVnFnU21qb2N7RV5XNk9RUCV4fnQjIWw0CitjT1NBcH1VZnMwVHFmT1d5LTlGVSVQSUw8N09ufXhwdiZvcit8MyZfJikrJmN2JGFNS3IkaDd9QUE9N3V7aHU/LXd6cz1WM3BSKUQrTkIoCitodCVHTik7OHxkNUhgU3h6c2tteSQjeVlNTXZTMyQtTzcofk0yJFJ+Y2I9XjJhWD5BRjc5JDBWNlg8WFZ3JllTR2I2ekVEYU5ANE1SQHNZCisrUFMoT1ZQdU81N28kI0dzSjdzMyRIbExKRl5PSiF1LVoyaCVVfHR1Tz8kIVkjTHUlI29ZTyRiUihsO2RLI2BZe0R2cTF6TVkzI2F8VWptCitVbkJrZzM+djl6dzckZzIqJEc/TjJPR3NXQEt9VEtvLUxwayFwdDVIOXdsdXY4bkl5c2JTOSk1dkA2TSsoNVQ1dFgjeVVhUDU1T1VEbk1qCisjeW05NlZWdm9rPXx2QWgrOWA3PnBqMEYwQmQ2Uz9lYVVqLWNuTDQ5KCsxTkNZN0BmaXVhdH1INjl6QitaYjJEd0cpOV5fayV8SnRmdkZ1CitYRUtLTDtBI1VSM1c/fmlvelROTVE3RFkqKWswRXJfe2tOazlqbXN2RjZXe3ZGUTVEI19eOU1WQS1gYEdgejI2P3k3VmRDLVZ5PVBnbCtACitAJUEqaTJBUFNgOHpLeCE3NiNjbit9QCpQNXotYllvVmM3c0skaj5IWHhOLVFsfUNQOXY1UFdWN24/Tz5zRGN2YXA4aEdmQ2JyZzNQN3tlCitzMW9zWW87N3lkMnl0RkRSRXJoS0pSfFJjS2MqelNERF41Z0NfMXlLNHFQUTVxfT55O3hAUWc4NWJsLTh0XiVIX0k0RitgKzdtb2xSPUdYCitCTzUkZV9UK3J6azE8dS19WDNNPH5SODYqaGwobWlFcUFUPGcheVFTcng1N204SCppe1ZzNGZtfSNeMWkrNT83WCFlVkc5TmFVezUrT3pOCis/M0Q4Ukwhe1paTlh0d3xpMEpidm9KdTVfM0Z5P0p7PHx5aEk/WjE3Y3ZgZ1FQVUhGWXFxb0oxdi1mRDA5ZG1YY1k7JnFHIVRoPGczO24qCistWmVhfDF5WUN0aytyZEo1UXd8ZXRGTm4yZD01aEh7WEB8YTxSe0d0XkthV3MoLWNPVG1wRjZ3amotLVZBXmVgNEk7cmcoRXRBKFAqUiZlCit3cW9ZQyV+O3xealIldjlATSgla35aeDkzdF8qZT5FRDxlOEdNdzFWNG09T2tIRUlRdG9uUCs4aGIxSiVrbyhkdjwoIX1ANGFCYkdORSZuCispYGhneDJWJnBMaT80YF4rYjdUM0w9fVAwcDBtV1pzelV7Y0FLb0psRD1NanpiPl5hJHI/fCpCZkBEcD1waGFSYCFQRWo3O0BAJm03O15ACit1MCEkV2ZTZjQ/X0Mremc3ajdfYzBXfV9uXio2N1kzM1clX2pBUkgpLUJReEV+ZX0rNiU9SWZ6QjVkRkkkSSVhekF5RDUpe1o/Z2cjN1ZmCitxfHolbykod1pNX1pLMm1KfVMtKFRCU0o0PFpMJClie318PGpiNXFpJktRe0NsMX0qSXhrc2l9PngzWHFuMDAjZDc+TStpOWFDRnxRUXZRCitNPUl5TGxCYzM8UlJ2TjRlN2YyREVjX0VfcjNEZmVzajdobzMtWVBYYE4/KW9EVyRCfnA/cTsyK0drU2VZd1VFX308c3dBbENWMldWPlhJCitvVGJiSz1CYClHLWMtfEJHRVMhJmNDd2JZQiU8QU55YyhWPClQY3VCSXlGMXkhNntMfjl2IX15P2BYIVRfdDRpMG57OXtTYSNWX0F2cWE0CiskIVAlRjwofSFQMWc8bj05N3MkVGxmcE9+Pk5uJkRwMWNWSTZVVHJ3NCV4K01WYV9BdTJkVVo9Q1I/JTN6JiklJThlem94TCFoNzU3KmF5CitvP2hreT12MVhvQSpKckFNZkVzPlgpbTNXdjtMRCo/RXBQJGtlI1FAcTlUMiYlMkg3N1RzfWYoPV9DRF5fYUF9bGdiLVQ0ZW9PWl9FYjNVCitnPXpRQlIyTH5pXk11Qj53Uj5GdEtCS0gkZ08oYHgmLXFuNlVkaXZyIWh0YTU1OWZhblF2SmBZXz8xYG9QZ2VXMG9DXlVlSl94Z3N3cXNCCitncTZqY1h3TUk2e3JqWWBnK31vQDQ4dVdaVF5vNnNhWldXPVJBTyh6b1Y9JS1XMSklQmBnJl4jU2hePmVlZ1ZXLVRHS1BlcHBIMm44bmlBCitpfSYxb0Y7KzlUP31jKDdSdiNAa3Y1eFJeKmJQMG1mYEtpJmw1KXtxZWxxZXIwMHplWmk0dEhOI35ZfSpWMDgqVSRNbE9zPDREMTlsYEFQCitCNEdLTHVnPUFFaHIlN1hgKyZ4cCgxPnUkPTFmRlg+QmNqamdfZktpIytJTDA/WSVUWFZANT96OHdYNzx8NllYT1k5OHpZMUkkdUchTGJ3Cit0PzQqd2lVUiU8eGs/bmF0RSNOeFcxY3wqJTtYWjBwVHgmRTxOWHZGTkxudFJxbFF8P358bGoyS353WE1ZRGdlKSZoTzZxbnsxYihXPSpYCistakJPeVF5UHE0eUBYJllnZ0k/KVgmQG5DJUkmWk15UilZdEkyRjYlM0VrVD1yenRAaEZ1cig2LVN3ZHopTTw/WGhzbi1lPVQ8MThoMEdeCitZSzBCalpDcjVgKnhYWmdKUGdTbTBFPGRrKENoeXxkMGx3alQ8KDx8SVRvU30wJkw/KDEoPVVEcjJRUG9nYytedHwlZ3BnP1E0RClJWElXCituUUlVUVc+KWBpWkVDYTA3Yi1CfncrX3M2PjBxWGM9MUNkVlIrcDApMCtBWk43MiZDdj4jMmE2YDJRc3BJNW54OzkyOHdEM2FZYnQzNldUCitSWmlXRFZVJEJ7M2RTbkcqTj5JJiluJTN2QjYraVNAUV4kfXBJU1JhJlZ2ajFFKTFfZHsjVVg5Yjx7X3JCT2szN0tCZlE0eypaUUI8cT1YCitgcnZSJSp5OSUxWWd1el5qdXJOemB2a3plP0pZejlkVztjZVVkRm5xYDVKUjtZbHxYU3F6T09lJHJCZ2VzfVdFZGkjcDxWfXVYPXJNSiZCCitrNHtQekYlZ0s8VzJ8PGxUU1dKVj1kVytuOykzX14/fkJFYENeSTl6WkpVelVianxUOEx3P1U5NDJHc19yYSFSTkt2VT4oPUthU2JvWnFyCitATFc7ckpefEtsXyk/P3ZZOHQxOE5GKURtOzZab15IcDRXZWNRKG9gcWlHSHIlTlhMYU94bmZwSzxLJU5nPEQ4MC14azIjOSR4SileZD5BCitIMWVsVXFYcW5XTTdOXzUmKWsyaDRBZG9fZik+emg2TGk9KV9Ta013NlBWVjk/RzhuO3VQVC0+LU12YlE5TmFVRXYhaUA+dkUlLW14JjVVCitfYkNLJDtmcmJ1VTxVek1vb010NjM/JlRzM2B8VDN2bCNnT2EkIWQqUDBwT0Y5JXtvWHdlQFhPJWIyNUlUSURzSk1rJXF3TT45VmRJbCZRCitGNWtkcl5Sa21qdyV4clRfbTZXVSVeSn5lO2dac3oyZCpZI3k9TSpWaFY3bEBNdHI1KihRc1Q2Y2lDcTFoaSs2T3thZWE3Szh4WmAwIShtCis2byVYazs/aXdvRUNoODRkSypQVVEmMyU/S0N6YFlUaXEzXyg5UFFnLUtiZzJ1azIpMjd7I3xQMz5qPkwyZ0VpTE8jeHRCPz0xel56NXIqCitqJkJfZiYhRSk9KkR9WGE3ITFNSj9oNSo5fCRUa09eOytzPygxcT1jaDxpQkQzI3skS01qbH08LVZCYEZJWSFzaktjfHwtOyU+STd+OH1yCit7Y2lKPFNnTUIxN2hTJEooKzV0RlV2JCY2bXZ0IT8jPVg3Pj9takxzRjByKSppJUY7NU8hbDw0JFBmR352Tzg4JiZQYCF4QEImKUZAfV9NCisoKXhoc1lGRiEtbURZeX0pRno2SCh8V3dBSEVvZEJTayE/akx1YEFWJn1BKiFsYStpS1ZSWT9aTll8b0g7TmxldEVoTEpAdDE1RXp4X0JvCitsSEY4bz1Za28pfjh+VFlFTV5MSWQ7UUohbDEpK0h8UnJLam9rJTdAbGk5ZkByXlQ7Z2ZoWElEKD5nemNxdFRxWUF5ZWZvM1lkKFpRU003CitZa0o+R0poT0shIzg+TDtXYnF5IUlzX2orMlcqXykmallgYzx0TmRUPTJLY1RxTCpjLTJ5eEpASDRRbUM+TVpXZ1F2MGUhcmwxcSh3bEZjCitDb00oais/I0c4Rmg3Vz81eSpSMzA0bXkkWGVkczYhKkRWI0prIUM8QDJrWTxiKSMjQ29QbCkyZ0BReyhiZ1p7Ti10YGdtUEMoajxMdWxVCisjO09IJUE8OWZ6ai1YWSlLQjAqUk0kSndTJSNZI20pSFJTKW57IzAhZHNabTt4MzlpODR8UlE9fWUmMElnVT9uNjR5azRMXmQtZ09iaD5PCislVSUtZEJyUjN6YWRGRyhIJjFOazU9U0ZFeDxRYUk4elkwbVpQaShtWX5XeCltWk4xYiQybSN9akBJTnZxNnx0ajVsRGtzbyg5d3g7QmM2CitPe3U3cFklb1hwJFplfHtTaUNwO15FT3QrTVIhP1RJRWNnKSF3TE0jRWZ8TGlYdnhOZkEhSDBNQDYqZnFUPGxJT3FVVzJfZGVzJD9uSklKCitMdTNeUEFga2lHKnNJa2BsJnYre0V8KmFpdmBSP2RkK1V8KzFjXnNsXj05YGRNKHBwZUZISXVvP0BvVG01LU57d00pZGYoNGd4NzcqWldaCiskRFRpYnxOcSpLQnxNPXdYKyNpfW0mfkdPe0dLdXJDUl9QczlLRns/QHFtNUYqSV5UWXJ2XzRGcGhwMm8obGZocSR0YX4hRj9BYSkzIUtkCitSYm5kNCZZWiUxLU93OE8xPzVPOS1yWUp5d1dWOHwlPGMyVmJJTkcxMTNie0tUcFNFIzNxUig0M1cjeT8haCQ0fnxkUl97Y3dKTTl6THlYCitLWlJfTjByUklfMVFSPUhwbmx4MWA2Km0lS3ojMU9aM0tKdWxNQWkzbFBjPWJ6N2hjWFhRQVNsa19YTCM+XkIlTVEwfGV4SncpS1EoY0NvCitSPVZPWnlFRSNAb1opd0w3JU54bGJoJnQjVXR2OV9RdGZFdGBeNikjKE82bXh0by1weG44cWdoei1Nakg3fFNnY3tTO2BHeUItTipBaHQwCis3b3BDPlNWP3YtbV9JRnRtaUlOIShPIUNQO0ZQVGBMVFNVSyl2ZG8zVFI1Y2k4WD0kVDdfVmtHSk51bytMMU0wNVR6WW0kYClEPk5Ma1pQCiskN3dAUmtgaC1rUEZ4VyhAVkI9fXV0UGtvN0E7dFE1STk/TyVQOFZ9Xl5rKzxseEk4bVNQUVJtaVJwQFBgeCZuNXVRRHhBJGBvSVEkZUlLCitMRmw2KStHdFUtUTArPzM7cWQ1TXwxWGRhRWN1USV2aSF0REZ1dmgzflBgeklNVz1KITtRbUsyYVAtOHtTd15VaTtyYkg5SHA0dylUSlk5CitOUGJCcFckSil9ZHBCNWEqeEs4Jjd6K1lYJFE/dEJne1VxIWZ2QWxRVmlUTz97JD97cEtrSV4mWGEoWVBmbDQ9MSVIcz59cHdTVHdPcl4mCitANVBWcT5kcEtUKlFZXnJXZzIoUkZqZ0hhUT1gTVMqczA0aFVzUEtqcHpvbXd8a2sxTk49dEdGeFA8I00jJUQqQCk7YkBhUHRvWVluP3xNCit7M2o4cmF0KW9MPGNyamVxaDJeYk0lIUxoVXo8UUloQFhQdWlfWUFDeFZFakwkOUQ5R25DXmRRJHVCfE8yZ2BqTXg/djxzVmttPnFHPSh1CitGZ0hzNT5BUS17MD50ODV8a1IoT1k/MSMxPVlwakgjVExXc0Zea25oUHBaQypmPVFhXlRDcU9FbSsjR1FjPnw/VmZXUSo1QUZ4QU9LO0ElCitpZSpkbnR9dTdoaUUyUFFVQ0Z3Y28mZk9uUTRwYU1ldWlpSDM9UnNtPXd0KjRTQ3BocUE5a2lLSkxWNjdCfUFpZzZiUF8+Q2tVQEYyZ1ZECislVVFMPEdSN0sqMFBGaUVmVT5GKnQzRkA3REtESG9wPDxrMjU9QjE7VVQyYEFUP2Ayb0pSXzFtPWVtempMb0w+VHs5ekE+b2FHfDB0Q1dmCis8RkRUS3NTaV9CPEVTIXJZI01jQFJpaEZJJVRuVmZSNlVFM0o4ZTdaYjE8ayl8NyRJRXtOQH1uUihOZjVZeXw9eSFDSXdHUj5BeXptQz5PCislZklSYTZtSFI/VVZKWX51TDU2P0hMNnNudiM0UVQ9P3U5Rk9xdGZ1T2A2QERlfWxWK3shZWF5bGR9Q2t4cVdjPSg2X2gkX1hreWwhQ15eCit2VXM4N25EfXx7TCh2IUAjZHhIPlVufFZaQ0NuNnlOOCljbHxHM0tEJiNIS3lsIyhzfUFyJGRnc18wJjtZZjZzR0lMVn03fnJkIWIlVGd5Cis2Mj9oWkFOT2xTcXBrO1c8UFo1Kj5ibiEoYzMma1BtMjZNTmluN0dse0MtSlNfNXJ4O0BnQHx6V3tGMF99KTx5PzsjWnVSNWNnQmk0O3VFCitIfEU1IStaRk81Y2pfNT5fIyNVfD1Jcjd6Y0tSdil2VSgtVktEWT8waTwyckZpMyRPZlEhez9fez9QVVRveyM5LXxWJmR8NGVVJkYjZm5nCitgZFEoSTx8X0U2Z0VSfUhvcnFVWGpxdHxBeiFvZVdvJFg2SyNGVV9zSGJDe0J2PGRARDszVTlJISQqd2VlN2E1Rk49cUspSHIybm1Ib3NJCitYPmZ3I1RTOXBVT2Q/XlRgeDM5MWBUN3NgaSpWKH5hdDU/WCpuWmNzRmBjdWo4T0EpcWsqRm9oSFFlI1VtPVNzXmMwWllOVH58IXxKYlplCitDV2o/KTRrI0tzeDNFak98YVEoVSt1bDZgPF9qMnlFJDJCekVEfUkwKmh3RG0xJDhTPHF4UkNgZCFsZ3dKdEJuR0pTQ3YrKkQjcSpQQ3pVCis0R0g2NzNpTGxYd3NHdz5XJG0lfEJ0S0ZQRnl6LWchKT9fQ3JjSUNTRHVHWnZoaGd+XypaeGF7bX0kTEE5TGgqJlh5M1d2cEhAUCojaCVrCitwJU8/YUBFTCRpJSpHaWFQRFJfJGp3Qkw9VSplP3I3Rkt4Pkl1WkMmVVdQbHZrTmhEUV80PnJmMHQlUHZlelF1QVdxMEkxRXd2LVpLTVFlCitqY15SaCg+Nik2R09rekk0O0Q/bGlwWjJpZFA7OCtQcC1CI1o1PG5VamJaazYrPzFqZDd4QUhGNXBUM1ArIUhKcFEhb05Leyg0U0ZBZEokCiswZCs9SXkwcTd6SygwXk8mRzdjKEtqQXhvSXpuSDVuak84cTkhdF95fEdDdXYmd3JOeFJSMiUpVl9EO21Dd35GQSZuSkdXUkQzc1BPMENHCituZTVlVCpmdzJmTShNZklOMWBKPnhnZWFJZVNkKThwUSRoaH5nYUpWTTE7WVdAISgqVVlQOVJ8SjZXdjdFU0tQby1LJD42XmExYlpKTihjCitwcEs+P1ZjVExzfSkzaFhPfXVFM1RpSyNnVStzfUtXZkcwYXdHVTxwdC1gUSRCNiQ2IXRhLSF4LWI3NjgpPFByJWxlMSNtYEAwRE08YTFOCitPUUV6LTIoY3AjRjt5ZX1wWUBeOWEyQk1WPlIpaHhRfSNvSmptWXA1cnk+OCo8IUhuaHM3XzdMPFJwaElJPWNQWTwzXzZ7WmlAOVJEd21TCis8TSElbityU3xVVSg1UT9hJG9vZTNPI15Cc29sNWljajNePEA7bSpUWCptZV52XllGOFpXZU08Qk5XWDIrdyVKNXxrQERFX2ZOTGl8JmIlCitKd15TPE17T1c3djEjO0tEeVp+QnpmajI8KUR1e0hHR0I1JEpsfChlSUZOXzxeZ095MWxvPEVMI1FVY2dpa189Ml9mWVk3RkpzTXIzTWFxCitvWmJpZkE+NkcoVCVhe3l5b2NpMV5mflEwdnhFS1VFcHtVVUg2bkRpX0p1cXpJV0Z5TDdYdWIqSG9EcCZJQHhvR3h6V0F2bWMhblVzVj1ZCitKM1F0YiUoZGMocT1DfmlVQkwrNmx3SzQ7anNEMU41a3JnU096Y3dPTCEqYW9oMW13Uj9zbCs3amRRcXIrJHZ5bVVDK0JnUHxram9TWHRKCitlKFRqJiZ0YVFnQW53WHA7T3Fzfih2OC11R30qRUFFWHBedm1MT1ReK01YdyNmMVlxdTYzdFQxLVdvSHBGVT1oVzVARVZfRlMoNCp5RHI8CitkLX1Iczh7aGJ5XkY0VzMtXyZieHI4VF5HQDdGbkhXO0RhKGhJc3pnIXw2Uk9tRSo0THVQZkRWYVpGZlEqUGRLJnpTKmFwSWYjbTxLWXpCCitJJFUwLU5WfHIwclhLcn1yJForZiVJOW42RSRTKVFZMURYfS0pQ0Jea2c+M0dVSiQzOyZZPFpzV1hqdm1XRmM7flNFM0U0ISgze3h6S0E8Cis9N0EhJjV7VHFEdE58U29WcSRpazVyZUJYRGpUQHslKmFfTXxMZitVQyswd0cwKiZhRTxoIT8kKiNMPSM2cVc8PXJTanFiZHk9aTh4OH1wCishJFB1OGozPVB9PWwman1He2EpUW9xcyNAP0dDezRGbmF3dV9NUHQzS1VTKzEpdGphPEFHeT1OakYzdFJXcVdnMnhickYkZGh4OHU/RTlNCit2fmxoKkckd0IlR3NaPTxtbkZadXpee00qbjI1PVEhP0x2Q2hBPXdhQD9XbnVrPHoxJE9xK3FrTUVwezl7NDtwSSFQRDJSXis5dUtzJChgCit8bGAoMChvdjApUyFYb1VrQ15SQzxfZTNmeHwxWlpOXihGdXgyUnF4fWhRO1E+b0YtNShAe3AlZXchcjJ+RThEQUkyPTszc0EmMWtOMyRzCitjMXc0dFpFSD5keCV5WFZLbSFWMWZOYnBVNyRpfns0VHttZ3t1S3AxUyVUUnAteTI1ezA4azluSyMpJkxCTFNkPTZXaUR2d2hpSGReYWFACityWFcwIyN7KWgoQlJ6c2JkS05ZRnpBTSV5R25NKXpgZ2BtN1gkcmxTaDZoTTZ7ZGhvakVsNmp5dzNsUTx3RWJkZHBYUFJwKUFLUldnbF83CitxM1lGMEh1JTRaKDckamY0Z3BAWGs1bi1adzQ2a1B6TXRWSFNseG85UEU8TElxNyF2bDQkRlhDSmZjKm5vZTJXUjw8ITV7KG9rTVNEQDFFCitKYUswey1hczZGb2NDbUBHZllDdEhYKkRHVFIrZntqZCpwN0hGdkdVRElWJXkjQTghfHB8ZHVPQmcmJStLWDkzRjYwYmY1cWgxRldHcyQtCis5WTJCUHJzODR4Yj9BSmheXlFKTSlSYnA0JjRJclUye19IUGgmP2J6RyNwRjI4SiUqN3dDTjtFXjwzeWZ4Q1hSPCkzdGJQYkJ3QnQpNTZ+Cis+XkBEcGIta1IyWFEqYWw1UmFHbFBUX1pGa34+aWgpeH1xfWF5N0ZMQWlmampIRD1aPzd4ZH5lR1p2UDJNTD47YU0ja3JPbnI2RnlQald5CitiJllgKnB0eG1QTW8pS01oYThtOHo4YiQpKThhIWt+QFc+Q0FAeHQ9Q0puK2gwTmNac0AmS0wzOEsyVCFzRTNQbX5rRmghSU56WjM3UlRpCitwZTZxakFuNXM7VlpFfjhkfnc1ejZTcU92a1kyekt5WlQ1JXRFKm0/SXhkcCVNK3lsRUhMTClqKFFFNGQ2WnFTNHgwQktqOGVLOT5vKiYhCit7fE40RDduQDhyPUxvazw2S2s+RVQ1ZDJqK3I8MDt7ZiY1N2M2QSNXQ0tLUGQ/diFefU5mTnNEelMqSXYlMnchK3BIZS1PTi1FbjFTaV5XCitoNT88PStNPVBkNDNodDhieUkwZW8oSDBEcWNGTzMqfENxKzdiO0ApNU5oelMjR1JQPH1WRD56dDRgS0ZYPlY4Mj88a3ZaO255VTV0U0haCit5NlZsci1hO2E9OGN2dSNoWFI+QGRTMk12eU1Vak8wUmopbF9ibjZXdVBAT3w9MjFEMGRjekA9Y3ZManlqPkxQOEk/WElONClvKFgyeipzCitQMy03R35wIzEkZSgpc0hsSkMqQWxkPntxKkg0aFd5a2xfWClxPlNCaipaSzdIeWx+NEpJISZwXnghUFFJQDl9elpHYiElI2t9bUw7JWgoCitMOVA7LTQybjl8UG5JciRhfWBuX1hmKzJSS25YUVgkJng2d0U5YTUqYH0xZjBMVjdrMWJTMTlLcmBITlp8Y151NmUoMStxRzFuMG1lJDg0CitjbSlpN2glYjcmR2M2KUd3YSpgbk0+KyVUMFY2cCVePVl4MkFVcC1AMGQqPjYpJHhHYUd9fTU1b3wwPHhEbTBHZnRzdWY/Uk9lKG96P0JwCiskfV9qbX5pK3o7MmNHVHNYalpNPnZec3ZVVGV8d1JYc0hBMTFkMCljKi1QIzkqQEQ1I149VWVnUUpvYlA7OCM2YWhEOWN0fEhOSmVoO1ZvCit4TVk7ekRRSDA0Wm8+b2JqSCR0KXdscDVCdEZ+RVpISmxgeWo5clFeQD5jNzA7RHk7Z3p+O3t1enlBYFJ8TX1IRkFvUy0ye3V4TmVvMk9KCis1MH5nKmthYS1ZO3FKYX02NzxGZD1zY3VjaTUpPSVIMmpIfWlXeE99UF4pKlJLMj5fUSN5MipHbTtKLUVoQlF+M0xwajFNREchNGhXOzhzCitLZiQqbE5TMkUqYWo2T05MdHBQWWkjUyNVTldGUnIlLStTVTt1RVV1QTZ5MWdJWjRyMVZMUXgrNShTTnVrfCFTKiF9aCZTKSNITFk3d3BGCit6TmEzRyt2Z0hVST83JCk3LWFfa1J0ZnBQSGI0MHFPOEJnWXsyOTRTa2w7e01TR1lyOWIkPHw1S29id2hSOVNQeV9ZREZHYHIyZzZmNWJKCitHMXtVeiM5NUV5V31VMEkzQUlgXz5QRH5GIWdJcFlRc1QlOT9lfSRBYnBAdlFmZTBXKVg8PSkjT0gqSi18ZClBQHFEcHZ2dW0mfmxPPEpBCisqb21YZ3RZSlNqcjBUVms9V3F3QjRXYmE/Z1NaYFFyeHJFKjBffCZ5S0tXK2N5bCVJYSV1bnlyXnQ+VmhsVCZsNndfV3JPaG5QNStIKEhrCis/PE9DMShgazlgWkpIQ3hKRytDQnsxUjJBNzxHPzklYCs2MVBgQnU4WkwhQS0/QSspNWcpTXd+biY3JWBgeVNHcCt1TDdHcjtfYkNaYGQ7CitNSUcoSTdHKUNzSClvQURZMiFxX1E3ajBtdCFwWUFBcCgtZ2dgMHlAJGZnJkdEQFlPbmBaVGFnMll4S21SfUt1WUVVUVFxU1dwSFloPF5+CityNyFvPHVJXlgyd3NBTEdZSnJ6UVA7NjVBPz9jJlhLUVJKdUwhMWViKHVNek0hP0NLa1NFZzs8RF9lYXNFP3omU0wjfmFSKDNpeGpnd1RTCitWS1FLWTxaak5jRHhAZ081MTFTbmN+UHdPY2RTeThER0h7NER2OChgPThVN0ZWcHB9WGNqeXBSey1HYSY7Q3Y4Sl5hdldWd3ZkX2h1K3RhCitDKkU1bGJiY0BjY3dxKE1BI35ZaUlEYi11e3FvZlBERlQzZ3NZOWtsZTBiNX52fWtXPkI7VTFtWE9Rc3VTamFfNTlFaHJzWH1nMD4xUnxTCis/WjBwRkt5dStZMWNBY00tMFp3M25JdSltO0YlWXRBYnBOdWFgJH5LdDl1SFg9MnJ9Mm5rbW9MbFcwWDFNbE8oXihpcCM8fFlOSWAyKWlqCitna2Q0SSN8dHJ9bmJra1lCUGxOayFPWjtGYGdabiFrUnI5Xih1JWlhbyZQS0MxTDVXVTJOUCVZfnUtWHhZKndJJUgyVWJ9fkZzWVVKc0VsCitkNV8lRmN9MEVMR1Z2dEo9Z24+ZHlATnpWZ3VsM1BjSiQ2bHZlfTApfmdySUA9ZClQOG5rQEpmM29Oa3kjPFYxfmdwVSZRYCZfe0ErakNhCitRfFczaW5+e0BjZD52VE9BXz9LaWA8OEJRfkhOe0YpO2lSJGYrMWspNCktIUZyajxQIWcrZVh3RDlGMGJRdzItKiFLPD97eyolRiNwT1QxCitfTG1qQDhFJnQ1eFdYTnRaYXg7OXQ1dll8LXcreTlJPylzKXZxMHd5MlU/V2EjfXVeeypIXzQyRiVuNkRIfj5Senl9PDspQiliaUpmazg0CisxM3xVOXlmNVFPMDc1WnRTPntudGs+LWB8V0w8QHtpdUsqcXNWNHk1ckZXI0p+KlFIbkojPCNCRWBYOUVEPXUhJndGdXxLSzBJUHdhPHxhCis9NyhyXn1odl43YXpHeFI4MlF8diREd3o9VlV8MG1wcnxGN1k4cCRYYS0rPlNvNiZObHQlNGQwLVQwcSNAJVJ1X1F7aHg3QHojWlVHZVhICitsQjkxXmxeXng/S2QydypTRk9ARUhyPSlOZlVoS2tURUAwc0dYZk82V1otXn4lNUwwTExkdTxqJFcoSVV8aW5ieDxXOHFTQm17b2J4YDxuCitRN0FYJU88JGxhQTwqeCk8N095eUllPjBpP3l9TFBvRChibCs2SSl5WTJTN2ttUjVFY2lefUA9KjhXMzJOaVNWZ3EheEpzLTYpcW92V0Q0CistQytONCt0PUIzcTRhZ1FSSjxjIz1xdlgzUmUrckNHO1RrZ0wzWSZYajhOUlVueHliT00+akxAPkQ8dG14emQ3TlBPdmRORUxzUUlPMnlGCitYQVU/Wjs5blRpPjteSUNzVz4hRXV0U3tnaFcrVks5KUxDTXI8RjJqOD9wKnVwSGhqSmF5THpQNjZPYFdMUzxkRWk0Uz5TNDF8UGg0MVhxCitXMWFZeSFaaHgxJl9LNmRoYyRzM0tRXjFqR31QQk98aXlzJkNaJCgtZHY9b3VweGcrX05md1JLTUBZLTg9NCNraSp7Knlsc2ZBVyFANDVYCis5YlcyVHRPO0lQNGJjQD5iZipWfFlGSmtmV2pKd1RSbGp2I0heY1QxNDBuPGMlQS1BVnJFVWsqb29rTWlWezgyal9PU0o4Snl1LSpNMj96Cis0Qyo5aGI8QFFnUWVyRDI7dmklQWdTOHIjM2dlYXZmezU1dUEhZXglTDFRJE98LWBgJHZMSkhvOXdLNSpoaCZyXmxoZzdeK0EjVGd4JXxjCitNLUlFXlJze2pAe3VPcnJvZHV6NyNTaSo0cE43NmdeK2B6ZEJmSmN+WUY9eT16YzZ8P19DPXp8d3JUYms3S1pqflNvVXkqYD1kU0pxUmIhCis1UTg7MWhmU0FlMiUhdkI5PVNgKE8+SkApbUFNSW1vbW1eKFk4cn09cz09YHA2NDV9e15LUDttWD5AMHMjNVI+dSFWYjgrcks2WlMqa24zCisqTmI0cXt1KHBCNkUxdTNPUno0YXQtWSlIaXdva19od0lVbTc9ODE4UE4kbnBFZz9oVnNIWkg4RDVDZ3NHIW4pJGpFQyZTdE9VaDt7K1JPCis2bnU3ZkMmYDBjbHBjdzFjS2JvQGpCR3NwP2Rvc31qak8raVJ+I1ZlTj9GcCo+Sy1ibVp8d1QlKHd6VjJgQkpFMjArN14lQjhjSHxObXtpCitoMT5BWWR1ISVVajkzfmNXeiNBeGFzVTt3K19fc29HVGk4V0BxeCZrQHhZfD0yQ0x2QUFjTFcmQXhKaV98ZzghQT4tP0xwRnd5TnY7TkhgCitLVmJhLTtAZjxRMSU3eW9AN2s+X0xuMFZPdkZ0Qnd4WihzZkIzSU8zUThUMUxUTkE7ej1IX054a3M8KEpzUiRJfXY1Jm5wenljfWd3fVFFCit6UDQ7QHQqNGE8eWxuNE9tSH57cjxXSys2RVBfUTxgMCVeR0Rtc0U4RVh2NClAe3ZMK2w5QHEjNzFnI01WeGUxWjNJZVViRkE2QzRORGUjCitzK25yUEVpckJZQnowUVhGUF9TPEIpenl4QDlaSzl8MkE2WmZ8dkw9MX0+RzlQfDxOV3JgJDRBWXJwSk0/NXZUZSFOX35eQE1qZHtIfWdICit5XitWMmtrKWxuYXY8ZUxNNkd7bzFLUD5OVmwzRypJI0YhaGRzdHVSN2Fueld4TGdMeU5ZMiglSnJXRVpVQWk7TlpgKHooTX4oXzFsVkYqCis3YVBnal5eKjc5OCRsXmVvdFE9SSh9PT1hVXNVajdobXQkdjdtMk97KEI0ajVEUCVSbFR7cnMxdWRMMjwtaU5ZbCtvI1lmMldlaUthMD98CisxYFZZYSpzRyE5S3xDRmFkIUNJYnhXfCpYP24ySzRhPWFtam8lbT1DOzlWWWFONXxUfkk0TTQjY3ZOaU9EMjM0Y2wqIyNraU9+QzhtemI0Cis+ZiUtPEJzcXk7WioyT3U+VUA+KEteNm4ldmRuYyNTO3cmfX1CQkdBfHF8P05TcnNKTFZULVB+M3R7YH02KTFfJCoqWFI+KEd5R0NkKnk3CitRVDsme0pRaWZqfkR2TkhtSTFxNSUyRSt7THU8OWVFVHoydFAlWE9PJjtDcUUpJEtpfWhWQ2koTG81IzNZWlRyOH1WOSRfX1E2R29pJWFeCitCVCh7Um4kOWB1fmBGdm5eTVZXTHh4fHVnSiVIaHdrMkBaKSVNNUtxbmRyQm9LfEBqYjJDfmtVJkU0Xn5hclBSenplKFgwOTUkP20wRFRXCityUFNpTX4+U3h2dVY/d2BOUGpIezY1KD5VRiN5eGN0dXc+X0VnVkpUTmRDIW9EVmBQUjlRVTU9MExCOWVufTxVdC1nUWtqPFU2Z3RvdTZfCismX3dxbmlVQHh1aG4qRUA+bWgpKVBYJGszMX5ZQUBuVGZFWTN5Z3RKeWxeYTZ2JHZjfigyTjVZb1ojO1huQkdWXyZ1e1kpKjVMJWQ+K3I+CistfEIhd0w9LXFCITd9Tlk3ezROZyZAUlpIQHlONnloeWJFNGdfJmhIRnNLUzdNdTIyKj1wQDNkPkJKdzl1Y3N7U2ZiRVF8WVFiQmxJQSh7CitlU0JHcW1Ic0o4IVJSI3RQRDgpYkZSX1FEVz1IeGN8aUFfLXcpdkZ9YWI0PGBVeWhnNSs5RlNtJkNwYTVAWEhKe3VraXtLeSh1dW9eOz5tCis5aCoxb3NQLSlyYkltNHx7VT07SHUhM3RSbGNVQFB9JUN5fWBDZVNQRUV6eVBjLXxgNWo0QXtSb2hWe2dNWHxVcnNQemIreTdgRUlmdj1BCis8ZHNhdyh4Kj1sN1k4VUQqX0Y5fE4wOHFVKUFyQ2xEVyRie0YrfEFCPjx2b15mUzMjPm87Km1JTEpDYURAcnl7K3ZxWT5xPHRNMSVpUGVFCitgPHJUUjVkfWpMWlRZdFl6VjQ1fTFEWmdRVFRLIUVvc3xqcz13PHZuRC0tZ3pIMnY8JVIxX0I3UzBjPEB7I25JSV96UHZtdmJXcW1YVkFKCitgVXpCdXoyQSt1KW9WY3BWU0s2OEkpNXJGM2xkbCFZa3lTWjMyUWZHKllOSVU3Ul5nZkwwIV4oKFd8cGpJPCZTdT88QFB5P0ZlMnclRkRBCitvSjcjaU9MfDhsPXFue0wxSyVHNnJwWXg7NVNsSEpObkVFXyNQOG0rSn4wPDNRb3l7Yj1uP3FXOFFzSzxscTd9P1RWaFpsWV8jbHFWP25mCit0YT81QT9wcXBNXiYxLW1PbFFUM1E/dV5ebzwwb3RjdDxORThCIyY9SUxFZ0QkKExze2B2KDk2Q3A8Nnh5IUc8REZ0P0wzISU+V3hxbyZ5CitXMXAqQzNTQkB0O3h4MT4yODxWJXtYNXpBOT0ye2ZHKlctbSNnKHJRPioqNlJAT1VSQCspK0lpR35jMVBMKV8rRkY3ciQ+dHMyV0Y1eG85CitwYDxRMSVQaEJSV1BoPm5oNG1YKm5Ya31sRjRwQEIpJjNnc3tkbWt6QGE7PHBBSV5TQC1KcG8+dFBobD9QPlV5eVcpVUE4a2BRMVgyOFViCitGPFg7cEM1Zn1iXzNzciFTaHpOMlNre3AoI2xlMXRFOE49ZWU3PjdYQDlFRiZQTVBXYiVUbip6TyprWTFAPDsraGxSNEtAZ05hd1FwbCRsCit4RXZ6K2dYX0MyXnlTblc+RTRiRW5hbmFxRDg9azYhQCUrRnckblVZNjlsbjd2SE04U3dxTGU4UDN6aXB3cT5ZKXsmN0hgOzE2cytAaXRzCitGay1BO0tKbWJ3LX5FPkA0IUR2Qjx8MkA+aD1HUzBjbDM8bSRzZEZUSXN0VEI5MUwqUmFiO2VpfG5XeiQlUys0WkJQO1ckdEMkNDhJSzdlCitQN1J6LS0yNDdtRzk/JGtTfVl+WiVHWENtS1koNShRWWFwPHU/JjR0JUtWamsqYW4oNTg9Xjl3Rn0qfndzeDJ7cXx6SGwrT2x0cCkzRlI5CiteKzdGRXBgWmA/NlRwdEtwO0hZJk9CRmtNZzFUWCVNP3YtTEdKa2x0XypvS1MoZT15aHlrTGYjKG1rYj9GbXo/TEpmX1JZaUl4LXZmS05OCitzI3YoWFprN1JrVHh8Xnl0KndCWlU8K1pPfXQ/JDxnZWBDMGA3fSg1dFhlZlRwJkU+LUVZPzw5QkRHPnxFP1VzbTl2IWJ1QUZPa0tlekkoCitBeU4hZjAldTE/eTBIfl9AdG1GR3UoViM3JGhgdlp3X1NAY3dIKHltXzdzTThffi1rI1h8V3BVNjtnRjk+PTVvMGY9KUswKm5ZLX1AU3RVCit8WjluKjR5cFRnemg3UEZ8YFJrO24ydkoxXjEwMFlsRSsqMmFSWGhVIXZCQ2A0OCFkWDxGSE16Vkk/V3k4Zyo+JHR9a3c/JWRzZHp4TW50CitMX21gZC1xMSFPUXZwQENFX0xuP0c4X2tEcmp6dVpDdDF9d1FPJSFOZSFtYW1ZMj00RC0+KGZyMFhRX3lVR3RBMDtaP1clVjFIKktyMUk/CisqREs5KHleR1hYdmIoK001fnoqRzg3QU97R0hTUWJRQjQrOClBNSomJjY1JWRqTEh1MnhSc1Z2QVJSPH1UT2lBNmR6NkBfVGlKKGUjcTlSCitZJjBuejE9JlElO1BXOHVnO0FHVkNWb2N5anw1QlA8YWtZJmlUT1pONXkmTmM0TVZjfE9uUFhzTyV5WUZya0UzOSYhUGo9K3E/TmpMbH0wCitvMitReTQ8N3A/JURvMzB5ODtfZkZ1O2tKRmUkaTJJVWoyXj5HaWtnJkBOdWExVG5wUlpgeTVAdHlYRjhmUStmaDkmd3E1R0shJWslWXNHCit8UWRgeTstZiNAJjBHPXJmNXVJeDFeK0ZBdE0kSVdFJm5JS3MxNVghblg2T35OfT8yYDhae3pTO1NHVXdXbXRheHlQNCRrIUYtY05aQXM+CitrOUx9eiUpTkRaNyo2ejYxaVRUQGY7RFZkdm0rMigjX3lMIWJSWk4hQT5eOFdFO2Y1a1lZfl9SfE1Jczh7TkxUa3xMJkZje3A8RXtweTw8CitmNiZiN2YpdlpyVD1FJS1TRGQtMnYrPWtpTFZOY2xUdXJVPmppWENlS2YyMiFFKTF6KVEtUUhxaEAjJF8tZjJnY0R3d3hPekZKPU4rbTB8Cis9Rj5wPGJOVzI0bkU+fFErZERQLWpebT4hbC1ibzxaUSVWfGBYOENKITgzZkUyLVBESm9RZnRLYmNrNUg2YCZnN2I5OythcXJpKHk2eTdnCis2WEpBZ34qZkRPOX13T0YpWE84YUI3VWcqLV5xcVdlRCtgZEI5Mm9jYWw+elleVjZ4c151RmhqTE4hREJqTStyXlA1V0Jjd01uX15QOTtGCitPX3ZKNlFVM1hlPXA0P3VoQjtZdDU3KCQ0eXRwb0ozTWFLKylELStaa0okI3ltTz4jOEJVUDlpS25RaVY8Q1pAIS1IK0pYNT9kUDJXMSpICitiPHxxYn5mVTtUMWYxVW5EMGZXTVJlNCZ5bklOdnYpIW04NSMzUH4tMmA9VER4JXtza0BPQ3xxbS19fERFWD9VO29fa0E1Pm0lSkRONClzCitASGtfXyFxSjE4SV49WH1SZTQ1X2BsQ0t3SFF8fHReQEZJNj5AKn1+VCNKVmxVSlEjJXUtfjh8KGl+LTFAIypuKz8zPi1XQWU1I2c0cT0jCitHalFwWUZubnQjQWNyWjZsRXlkey14KXYpITUhXns+RlV5YiVacnE1RihiaUZ1YWpqUjR6QlEjU0hzSml+V3xPVVJSVUhqcXgyZE84T1JiCitZUEhTMzhScDcoXi1xOFBOaGJOeW1GTUZeWDFwQTVJS1BuZE5UJEFoM0JGUzJ7JlM3R1hsXjdiWWczM350Y1ZIeHBuel9LNVhgNE5fVj9uCitnJjUtJlFkWXZzeG9EQlFUREhvUFFgI0pyaGd2NmstfjM3SHAoKk5jfkt7N2d4WT9uN3g3JE1ocW1SRzk+SUlodDBpaUJVckhxcWhFMGImCitxdXVWVXRsUTZoR25UQVU+VX5GTUFybXJIdi1eQSY1JHZnJnpRdzxCUGB4eTs3NXY/ZCltKSs0TzlkcFopNkpWOVQpPVFIYWVjOGYqMz8qCitrWDx8WG9GTStUUGxJeENMe1pURVUkODYqeyFoVE49P2c1SXBfdXNAbU5gNmJPNz8jb21LbmJSJU9uSHdQfGYlQnNqa2hQPDdDVyZOd1ZDCitVcyZ5RmVucElQdl88KTd5Z1I/dXwzZldxdDsoayhZNC1Lfj92blpydkJPdjZsV3Q/TjBsRmdPYVFSaXNOYHMwPD10TTw0Y2RJbCM+JVpXCis9Z2NHRD0/ZnsqbFlCR2coTUR9MmVVe0xGUTRoKVBra3c9R1g9JDdAPUN3VWNQO1paNnBQdkRvaDlePk1zbiN7LTQhbUM/OU5LRyRAM2c+CitVMjJjLXIraHJubnpjZ3NsSndhTGgrfWlucGo+WmtHKFZtTCVJfkpMQ0I5Yy1oUEQmcFNtaHdvUlFeRGRxOU9BZn5zJnJnMW5paWlaZENACitRPjF9aXVDbTxKKVUjQ3pNVUM8ZUEtbmRySkhqUktMa19LRjRgIztpTXchUFdOektyKSVIXjJPaDU4bnheYSo/OUI4S1FxbG5wPkpwZ3RXCitWK3x9cl9nTE1PRVJzNFVyWVl7U0pZfGVBdkBLUGhia30kPSVUPSE1NzB0PHk4NH53LXhLaFpfITBYR0YtME5yN2MwN0F+YlBxPjx1e3I0Cit0QE1RMG1FKjJFJkdNMmFadElCVndvVl9eZ2RZenNVI0cmTV4ldUhEb0llQUlkaTx7bX08I3ZHOzVldS1mP3VAJXdXIWw4OzQzRXVMODt2CishbmR5MCM0ZHB9PihRdEE8KG1rKS0lWW5BM3ZCPXwwaitPQGxQWTRxa15TSUBPazhvTlBme0d2P2dOUnc5WChLaW1xWk9kTVg8YVJ1N3I0CitVS3p6QUhBVE0jVDN7cW1QRD9GREE1QHk3TjkjJWlGZGo1OGBnYS0+UypTOGFJMUh5VE16UTZGe0hYXlJ9IXc5d0V6KCleRl55ISRveE43CitLXktMSFpiT3tCdU8+aEM2PkFEeSQkfjBfK09icE97aWNJUGJtTUsrI19HWU11bmlNcGBvY2hffiFgNDhPRypoS0JmWW0yayVTYjRuPTR2CiskYjBBek4tPTFQcUJNJFJgNHB3OC1XMlpWaCFgNHU3dVpxJl4wfmxINWVGTHN1ajxiK3h6IUotWXk1TW4tSFAjTjh4WkdXR2smQW12SiVGCis/SCZLfDEqSCRKOT87YGZTSkNjZ3p1PXlBbkVvNUt3ZStzUmM3dWQteEBMen5ZOHs4YV9XYTJsaz5DXllyPjhJRW1SMn5GUyUkZ1g2RFk9CitXJDJIMyY4bE93cFNwfWNWSFFmO3M9aFRgKm93UjdYdlhNNmZuRH0jVFc9PWp0WT9jK1lrVGhoWVheQWxMPlI/b2pzdDhpJCUqdkp6LT9ECitQa1JodShFR1A9dldCRSM4QE5lLWtBPGxgSEBfODVTMldUTVI0UUYpUW4zcGxSanBAfVB5MDNXc3hhUWw0a0V4IXxOX207MDxuUW1pMntYCiszLXJWKDtkbmQyd2lOYWMoO3I5KT8taCFUe35we2M7Q3R3OHJSQXZlcEB3STkzSF9FQFlydChiQ1YqQWpnQWs/ZnQyYVNBa0tRYiMraGxpCit6NEpRdnp9bUJBVWE7Mmx0JW9PaHk3bU9HM3RLTXVYViMzYTxuRjdIMGpxTXBkfWAjOy1zO09TdFV7YWBJSj1efnkoREEwOEBsKXxVWD1TCitgdSskKDVvJUwtPmoqM0hWWitPakpuP3NiRU5LY1hDP1BCbncqX2A7cmlLMzRjOFdmXkNqI318KF9aTDYqI3BwKGQrMlB1PD1qUUFfUWdqCispJlRrMlkqZGAmK1FERz1sI1ZqT0tzXkU+SVdZZjhKKkRxV1N9Rl9TVFNpQU9CR1VoZTkkeFRYOCR4YUljb0lsYyZEZUE7ekpOSE5IblJuCitNYjtqJl9NfmI0dEJ1dTZeSm52MUtMbGpYdHljQmdXazled0BEPkEpPlN0Y3ROQW9jM24xVlpXfXQ/QShNS3o3ZlhLI1BNMk4wJTFnJncrCit1fWZCWXZDUn1tU3wpeClwZmU7bT1tcyQoWjJBbCFwOykwTndsPXdrdWlFZ3sxSFBmZUc+LUh2emMmTWAlclpDdUAlcll2JF5GbEJgQ34rCit3PiRyK2IkI3gxYSZ6djw7Tkg4fV5gXjdTWDluem9VS1ExOUk4OWh7c1c1VF8rJmptN2wxJHtwd2ApaXBSYWo9eDBQb350RXdiVCEjKX1uCitVdmxjVHNkIXg8fFlsUGY7TX15SHJXdWYxKERMd1FCLXBZT1I1NXRWeHxGeElKdD98TztgdE04RCFfQEQ0Rkp2ZVhhbGdFIWU8Mm5YZEYqCitxJDwkdmUhSDxiR3FKQVRPfGY4WCZFZ1VNWTBhcD8lK0xqV1VWM05vJjgzYkw9RClNaGpuUkhkXmZTb0ZRbENPeC1panY/c0hJbXFEUkc4CitqQjBsYlE2REsrK2VRTCV+ZEhGNWlPRTxPdks9e3VxVks9NjsoblE9Q0dzNyZyYF9IT3wzMyMzVCU3cU8lSFRNOGVje0xPPipwJkN5TU9jCisla1lpNGsweSkhQWRQfDdOWn58bXxPPFBufSYoKXpiKUdKPWVBXylVcmUlWiR9ZjBIdSladitZZ2R3Q0taeExNUVFmKHlDcGpvdXloQERVCis8SnY9d2VLUDNRVE9OYkAqIW1hfSQ5ZzM3c1NnJGlubEQ/am9WTn5gIzt8cGEhSH0jR3tHKG5aQlIrM0t7TH1aaF9EfUImYFJVZXZ5MGZvCitwNVhmSzFLfV85fVRCMTFxV1MkfUcoWEo2NnFWKSM3RlQtN0xGd0pkWCRCSVJgZTBnOHJySXdEe0kyNn1XVTk7VmAzfHJVb0wlcDlvUmNXCis4a3cmbTI4Tk9OVVVQRCo7JnBCT1RVYEIxME5Jd0d3aj99NlM4WTFld1NeYXlCaWVjVGY9bk1MRV9ULVFeMVY2TVFTUUVGbERBMzZQSy1rCishYVZNVllyP18rYkB1aHx3KzFjKSpBbm16bWV5RjNgYiZsKipJYkNaS3lBV3ZWZmg4ZF9vWlVOdChSRiZ1fGd6QDYhWnN2UTBCeC09MlhCCitlVmBodWJ2eS1SSWJVJEd0YzJII0ApajtmMDZRMyghPXY1OWwlMXAtdz9RKHR3TVhoaVVpSz5zP0FrWWI+dytkYDtweXhmaHE2VWJ3NGMzCis8O0ZRTTlybjIxQEVCV3F5TENrJGZOQEpoVG87ZWluO09KITs8K3o4dTY+Yzlicl9sQiVFdTM8ZE1xOXV3Y3JlOVExe1pHZnlpNVc3V3Q+Cis7IUkzUHMqVWpWWFU+TWE2S0RKYGFMUzglKzxYak8ybndyPDs8RyFlSWVFQSVfLVVyckUtSDhPPSphMlZmPSlEaj45Tk9KKj1ydiRaaSVnCisrMEhOdG1XUU88OU9kKmFCO25sbz5ZbGpwRkRzMV9UYGE7cDgpQipKPU45X0s7MWNPfG9xV2JKSSM8SXFqYlYjK1NqLW10dUphaUlgbFNuCitPVDdVSzVVVElJeCUycSNNVGZ7WC0+Zl5wMFd8K2djQnZacnVrM149ekg+YjtDd19kTno2YVg8bH1iP2pwSl5aQ0t8djtgdUchZGxBejw9CishQGtYQnZMeWIkS2EkQVEoJFRCRntFJDhkVnZMZ2c0M09vQ3VRUjxkaUJ1c2hgckElISZxZigtI0Z2d2lFaWtEWTRxJjA8Y1Y1JCV2bnlgCismMXY5KGpTQyhWOXBBP1RVIz5PO19vIztyfDJ4JmVge3Q2fXFDZG5jPk5AO0k8S2JufipJSnskKnpldH1lQXdwP3s1eH1rZjFBfmNoYEkzCis+MXM4bGdvNFhYfVAmYkhWO2QpR0Z2JSshJEtoanxQX2dPODFmcUBlbW0+KEpqSEpBaHo1PHdDJjF9a25rMEB8ZFFmcUQlWDNoaENUJiZACitjWmNjJH43d0pBQUJGYjJEIzFQc2UwNyZKLVB0a19KPUFyTnBHZmBXI0hmcC1OMUVqY14/RFZuKWQ2ZjlnfkZxaV8xQlh9JEBCUU1JJnVvCitSajNUWUk5LSU4MmliQnRpWF9uYW9wUDdId3RrJFU2aXN0Z294Szt6SUprS3xnKjdXSnZOO2FBS1VRbDNGZS17Q1B8V1dCa3h3PzF7aTs4CitSbSY2ak1FdT9FJjYkVyojXyojbXp0bVJgNjxuQnsyVkBNOUg5Y3ZTTTgwIzJlJCNaMWxIUmZmaCVedyFKTGZwd1ZsfDl2Sy1fdU1JVXRqCit1c2B8Zl9+Nlp8T1hiQmVBZU01O0pxYDxnPEcyanpGQiZBST5tfm51bmtSKUZaTyMqLXdkRHdnajdqPWN3d0JMQyVAPXlOQz1RQiYrbFM+Cit7Q2x9WUhRKD4kISMhaDs7XmEjfkJDdlZ+Uj4lPjh+PD59SE0/eT9FWXp8eTFlTWBaTU15MHg2clhtYX5fVm0qdHxUTVlOOVJPfXYkSjFhCis5Q0xPOFlPR3w9NW5iO34lZF8qaSVTSSFKZjxNQTZRJHpCQ0clPzBCSkVTU0xATndBLVYhKUkjKT0tZ1lOa0p8VTBvamsjRUI0fi0pI2FvCitTZHQqaj5MfWlCSXhgP1duUzhuSTw5Qylzdy1GaHIkIStnVkxqUkw0I1J3bDF8cy05YnFyUTc/K3RlVHlfJjdvU0koV1R+cFYtMj99MiVVCitaITYxP1Z7MjcoPUtTdldaRTJZKV9CdT1tPl9vP2A5YnUtZWstZ00zcnBLeSNqQ0c1JmZ6cnREY14kcCUhZGBDc21aQztNZXt0Z09ZIWg9CitZMDYrPWJuYC1STDY0c0g0e2o8ZVdWJnwjSj9iOTBibEJXWGUlSCZ4WksrOSpoI2MrMTZ5aDlycE9vazIlNTV9ej45M3lsaEhiISNvPDB+Cis7cVY+ZlJBdFlII1ZsaDNYMGN1WmM+c2g7Smp1ekhBWiU/UEdkYVRJaip2SHNyUkJ2UVA/eGVMJEN0fXVLYzhxPXpnb2xLeiVvfENlPWtxCit6YCk5Qkcydzs2WSUjdVgrTWNfODFjcW94WEM1fiRIbVp9Nyk4ajN2TUE+Zl4lQm1LVGFhKkVIZ3M+MStiLVQ0aGU1OVg+TmcyOGZBZiZfCitsOSslS2Z6NygjOEVeK21VZWEzQzJ1TTxnTE1hQEw8b2BEWX1GY2opWFRpeGJmSDg2OWQlWHcwS0RFckU8RCVNWTxXfHs9cXQ8cFgxSSh0CisqVW1vblZqKkBtO1hNQmBhamFfX0peNSl8NW5pQCZFNmRXeFc8Mz9fcGhlbS0jb3s9KzQhc0RLWlZ+Pl8mQEFocE0qd1hINDBldjBoJilUCitDX1JpT3UkbS1eVkhzeU8oK2JkOGZJczU/bTMlSzkwVHk+YFpXfTwlZ2leNTNDbz50OWk9bCU5dF5pSTZ7UklqLTV4fTEwPGc3O3JtaXdSCitkam5sY2o3NUVqOSRkRXZDMTt4UlNjbSRtdT0hYXg4WWglX3JQQlctXk05eU4kPFhtNkYmQ1E+djk5az0yOSNhKDd0aXB6eEgyaFFhX3VCCit0PT0jeU9FZUctfTFPVFlZSEA2UCpUTjRBSX57cHcyej8xPCtRX0F4a0VNTDNzJlAhOz9jJnh8JGladFIwV2VgOWsjRigqfTRNPGYtNl5JCitZIylkKkcrdTF3TTYjdzcyJmwoN1Z1KEpRX3t7PzE/cysoa3dMZUcjejxGM0AzbV8xfmFCKFdVU21UNmZudiNZO3NXZng2ciZkVS1qY2ZrCitxPWpXPkw+cEVtTXVeezZBazxvc3dzMjkmTmxSKy1yZSZVKkxEP2B6ZTR1TmNMZ1V1YVpHRC1qayklVUV+M0QjKW04dUtyVkFvSkFIRl9OCitiY1oqQXgoU2JkPztYVz5uVnA1NThaTVpXPCEmb1VTWkFpXkU7ZUdPUzt+VlRPdGNMMGdaTGE2NEI+aFljVHMkSSs2K05AJTJ0PWB3QjlICitBLWt9T2RqSUBRO2x1NkZUcXBiTUF6aERFKiZRQTtEej56SXBHTUtTTmopJHoyN1Y9OyhOUz5OWiZRXzkwI01HdncjbXY9QGprKGhET15wCitne0V2KHArZGI+S1NXKnpzbTYqN3UpU2h6XlBrfH5+OGpLbm49WXNPWWpeI2F7cm5kLSk8TmhrRWpoaEJ9dWVYc1hLUXk8YzErSSMpfSFaCitUUVRDOFdEVkc+QX4mTH5QJHxWKVpVUnlrSXF3VlJnUGc8dXhPMkA5QT84ZnFBPmQmcj5NQHpYWlE2d0I/bmg8UCNjPntaK1I0QmVKKk52Cis7RFRBRE8tYWRVV0ZOY0NIa0c9SEpVNkpnTUFXWXB8Q3g1Jit+PmY0OUs/bDlDcUQmV2klPiU4eHRYejFJSEB6cDxfRWQ1ezJzYC0pekghCitAaiNNISUze043O1A/OXEpS0FvY2VVb1EqSGxTQChDTStJZF50Z2FNNipuOE1UWU1LOGM9ZHtlVjZTPXkzbDk+N0t+cU9yTVRPSnJpIS12CitrSj9eWDZkSS1oUHZlJENvRHpkcDtfbGRhYlpGJWc/cD1eKWl1RihENihET0hxJUVQS0lWKHh5PnlfS2QrSEloWlNqU0VBJkdfKnA7UkU8Cis0NlEmVU9YcWIoMjVMZlRgP29zKTBrIVNJcXNadUUoRWo3TUFmczdOV1VPLShkJUN0QV9DbS1vQ1J3OHdnSUFLWkN8ZGs9UVZFNHM+N1Q7Cis5ZlA1PSl8RW9PMFc3XnI7fW1pKCtaMF5wTXR4S08jKVglUj8tOz1mb1hpUiV3JmQmUkFCY3pad1RTJUZATk1eQ2koLXUhTn01bl5JYENzCitxekNRdiZ4YWV3fFFxSHJKbSNZMkhWXzQtVlg9Z0J1QF9eSVc2NEUkPDskI1hTbHZTdUVeejVRVVkoLStwS1hKQi1PYmVlYzJ0KXxKVzxxCit7eDMlb1VzWVhTMCZBWj56WiN+YChZU3dqI0dBP2M/JDRoS0lCMWVYRzR8VlJHbHhPVDFIMk1vaCM9UHZnTUo1MXswcEQrJiVsYUEzR18kCitrU3Q2aFB6UmU5akN4K3UkVWt8dTFiT04pI3oqRTZ1bkJ0OElENF8+QHZXU0pASmJLcFMxMnpjd1hZNWFIWmgme2p2Q3pJaz9xQ0EjUi1RCit4RXJqJnJPS3d2R0Myem98UElnZi19cHNIJlFlS3Vnc2ZNRWxjNDtaJFRnK2hSXkR7fkdoZ31eYnlTWkw5K3pqY0A3SDYjSCh4NCNORnkwCitMUDs1NVktYU9yNERFQylxT3U8SVU2PW9AYDR7M207WkomT3Q2NDloNyQodkYrTmowcDxONk07bGckZWFMSjRzPChoVzElZE1jYUl9LVkpCitteXg1b0FgTn5Bc2IoXyZHeUV5LTlkaUtIVkBDUVM5JF8zRm4rT09vd0hpbXZOaXFebzJ8ZWR5cW03eXYwVHMxa3crZjc+SUtpYHBebjZqCitCPWNGaU53dGRgOFRAVGk9JlIrUip4UVJxbnp1dWVaNU0keE92aT48SlJhSztNXkRlcnlkejx8KEEjdWJTZTA7RDlKeCs/SUZedGAlZHJvCispbHlXUiRJbDhKVj5fbDNiQkdvUzZqJnorUTVxbDRtV192KisxYnRsV29CWV5KN3ltKTE1NHQkKVQtWiN8M1FsZ2kqLT9qNkxHUj5rZ1NPCityXyNaZ0RuQG08QyVna1NQR0tQNERLbVElYlJ5RHI7UUk/ZylRbE51OUJZWUs1TWAoN097aDNweFZPS0VvPHRARUtYbXg8YyFwVEtJJVlaCisyRW4jWThmdEBAKGFUamN0JmFudFJYPmRDOFVSckIrV3wxfFdPV2htcG1xT05PQD89RDImSCpmQ21DbjtXeGNCS0RMPmg+YT9FI2ghY2RFCitTR29ZUU1WcndxV2JMTiU3WTklKyZ+TDhLOFEmUklJfVBJZ0k5czR7dHx2dTJSayFYIXtBP3Fwamt5e1BaSVdEcnxlSE43V3Q9Ql9TY080CitCP31DRWF+WktQLTJoWWRIaFh3QkZHR1FpZkBlbyNFK0A3SWZYcnwoc2g9aXg2e0phbj08VEtKSTYhZDVCb2x+I2BYKXtKckl9OHdTaSpDCitPdWl8TFpAUnFWZiZEREQ2PjBlajtmUEJobkQkZz95ME02MEp5VjFPNkU/PSgxam12dTFxeEJzT1A9OXMkM3BvSj0yMzZuKD5EWCFCJC1OCitzPWdLa2JkYy1uakdGWnxMaVZ6SEE9KnI9cnA7aipWNDhzI2M7Rj5aNFd2dHozMTkpZWhJYGhENyRrPW9WREM4MD5QRShWV0V3PENJd3dnCisrVHpUeitYRXFIUTQ0bTdgY2hvNDNibjhLd2lVWDspRVJKfmpXUShCdnNHblJCPTlIb2ReRHc8Rkh0SlE/fXkwPk9GUCtxSTEwckU3WTU+CitzNyVfKjA+JDRQNFI7SCFWYm5ZY2kjQ3ZzZHZWeSlrYERfcSFCWUdhI2lNIXA9TFJSeVBCSV8hSksxJWlucGt8dU5sO3xNe35JWTlfeCkyCitBS2FhZGQ7MXtNPFczZW40bFRLfXk8bH59YjAjdHw4V2NJWENOR2x7UzZpbD1DQmRDO3E5Yj5AeG5ld180PCRCcy1wVFVOXk9gOVNySW5HCisrQko0PWhsekh5SlRxPVFKaztwUjN5TUE1PzR0QzNnSFA8T3peXllBPipEP1MydVJrUS07bDx8R3s7Xmo/WGwwTXRBTVBGO1h1RXB7YyNICitrZSt8SlA0OXtheGkqSyM9dyErK25xP0FGZyZ2ODFXTGMmaChuQ3c7VHlAUHdhRV9uakByMiFfTnRrfEpASUMyNXZwREdIKyppZVlHfD9UCiskZ1FjbDZ1MUNAe2tqSE90Qn11blBgN3JAK1Z2R1Frb0tudDAlKExJSyl6dTZtQHVIU2BuPE1IOUlrQ2QwNWYjbDxwRWVVT15WQlUyODNCCitxPG5KMSYkfEZzIWdCK29DMkh0bFRYWGVJX2BLcjNvTkRacjE7RGxnUH5kcV9OcFVqREREblUyT00oWGErQ0F2U2c2SlReX3tYZ3opUTFtCitoWm5WOE5JSUp2PXxSfT5fZXg2Iz0rbU9ueVFhSW5BJm5CX2NgZGVWYlppXnBUS0NibnV+SmIkJmZqIyFgUT1wPjRxdGgkVkpFfXRXdk54Cis9ZnI1JCt6QGsybjUkP2k8SCo7MHlDJiQ+RT1fOChGZCVFalpwNXV3WXFkZUZ8T3oxWlFFY29qQ0dKTzExV1MjPVlWe2BFKU5GU017NTlUCitzPF5iNHVZYkRmZyFIUTUkQ2NfbzFwNHY0bGdScUtWK01uVTQqT0k/OVc3XmxfaklscGclS1BNcHE0d0xpSWRMWFoyQGJBdy02eVM1UG9+Cit3IVhVZXoyTnNXT2tUWThBaSV4amB8ZHhpMEZ9K2VUajlaOHVXZiF0PjBQVGlKVz8ofWg4U1I4MWRBLUY/dGM+Pk5lOz59P19HVko3S307CiszcW00K0I9XnFCYzVrKEg0IWFyZEY1S0pgQTlCJjtpOVNaaEd+JDAwJjBpXzcwN0d0N0ZQJVBiWXQmIWFrLUZ1dkQ9aEFqbVZUMEtrXjdLCitHXiFGcGdJOTBrZ0RlKFgjWHxTP1YoZjB3al4xMShsQmdOUko4UnlocSFNUF9XbTxlKnJEWU4jNjF3eVVZRDZFYzYkWjw3RW5CeW5pPFpnCiticHwjcyorJGRNVVh1QXVsdGcyPkVyT19RRXshb2N4PnhCPlZRTFBiRC1ZYm9hWkx4RUQtQENVPiRZdTREX28+czdMNl5Jd05sa0hhO2t+CitYcThSYVMhUVBMTz0hKUMqQ0o5NkJPPVBPYmo5c3pxenctUlF2amZMfndhRiZMZ085K3BTY0RNMlZraDY3a3JKbXopQG0kfUlJV1lNZk1oCisqdF9wbCF4YDxzKSVeY28wT24yOyVHNU14XlgpI14kRCt5XjB8b0dfeUF6KH1CY3tveFNGJVdaUUNzQXtqLT4/I3RVTnJhXiFeZWdtX3NkCis0JihEXmpoTmZKaVlZJXtoT0EqNHIyN21HIWFXK2Z8VE1BYy13UW8mVEpiWHlOVHlzUFFjMnI2X3B7YTN1RGRTa0w5IVpEQUlzQF44IThLCis8a2A1dFVLbHVXVWdaJDRGTkEocSkrWVc0JVJySVdJIzYoWCFUUG1VUjVYVzE7KWpuSSVAVGU+M2tZfSs3Yykld3ZndypmNTx0PGtjRGRhCitVU2FAPStPPCM8KyNTUXFreF9STk8jYVRebVo5dDJxdV8oUVotVkF3PEN7eHhpKW99cTxqKSp1bFltWUJ7SjZWVGFrZWVzdlI3QlJVZWFkCit2dW8ka2khV141YU4zfCMmMFRvMWZIaXNLMTZhalp5ZmgzRUY2cGM9Nip1NyNRdFJJeW1DI0tQRHwwOUk2eUElQHVFJj07eWtPcTBqZ3YxCitNS0FlKDZjQnJ5Xl49PiE/Y3tVaVRHZV5uYEFuTSglYnhKbXJ1fj8tYWszJip9RW1yd2ErIUMpTHlIdHVPQHA5MzR7cUNSMk91ZiM4TntHCitVMThfYzVzKG14REBadnhKMTFoI2JJcWxwSHwqXipoI3g2JnN2JF8rRHMlKD4+MUA4elFZQWBYRGtWJSZNJTYkYmFjPEQkYUBKO2RsWUh3CityS1NCMlRLRiQkISZsfDQ+O0ZyUVpzYCErdml9KnhASVFDcmtFcjRPcTxfNGhebHp+UGdPVnRZPDF+WDM5RkFpY09IdUBlYW09PzskX1pxCiteMENiUjFQP1JaLUE9ZjVqQXlSPHApPiYlKnJCZzJPXm9qMzxeLSZVKjxpV09xMVoyVmhAQnZJYUktNj5NOHR8RUU2RE4+JDEzWSNWZzxkCitebXNCYH5IZjZBJVNiOFIwdj1WNWA8ND13PVFlYnx7TWdePnI2ZyVOVV5mUkYqKVdXPk8qSWl3SzlQIXgpcl5UVXcjJk92I0pKYl5oX0VgCit+NyE3SzhZUmAxPkcxM1VpM3FfJFRiM1p2YnxmZzZweiYqVU8pPEwtbF8+YzJIbTJuP21mY255fn1zeHYwMGQ+dU85MHQ0SD9BWTdFdSVuCitBR21mNEI5JjkhSkslP2EwPSsjaldhWG8hP3Z4WGpzOGcjLWlENit5SkxTRklgWiQxe2NZJlR6ZFFEfnAoQWtZenRNXjIkKn41eFdBO3RYCit2USR5NkUobWIoYk0oT2w+Pnx0OGlAX3x0ZVJ5fXVhUGBPdz9ORGpNdHZ7eTErRTw8REhSKVllUnVYIWZwKk5ZdVlNT0YmI0d2aTJWJHxrCismcE0+O0tDdzRgZlM1Q010PE1ZK0M2VSpCZUEqPGhUSGVSTHVIU0hHKjtrbS1eV3g0QmtWbzY0YmFZJjUxU2theGNJanNqLS03MVhLZGdTCitSTGAqRFV6IXN2KVFlQnNgKi1pI05NJCpXaCV0QSZnJCR5X1FeR2VzSlc5PFNGTWV5VkZ0PW5pemJTMF89JitEJm51PmhXeWEjUjluVVhTCis3bylgO25pTyR1SWx4SmhIcCVeWjJsPzhYfFM0ZTN3eklBZGpoN1FNWXAlLT03UCNJWXFzQkImIUtrPXJieWllKSk4Yz5EaUtVZUFgaDVyCitlNiR5JiNrKT1ZMjBKeyN5dStIXkg5WFdtKXg9WEM7akQqJkdlQT4wS3N9Uzk+eVNFPnFue2JQfVN1OFJuPWt9dkA9KFJZYHNjOVRBVSR1CishIzNpSE0pRE57S2NkSi0/Wi1hPihtbSZTR1RHMVFfOGhqITEjRVlaO0p2WWw7R2tDIVBhcHRMSmxfRHRgb3VSTWJSezYzXz8yKU4rK1dICitVZ1EyfGJocmtfJHpoRnEmJi0wR0JJNyVJNmtMNE98NGl8cSprSnlEZFFfUHg2M31tXkN2a34pNEB4QyVWI2RpWWJwM0Nqbjl+el5odkZtCistPFQwT0BMQ3BBOXRAb3V4KiRHdiZSUyowelN2TzhCTEJGZkJpR3p6ekMzamRITDB3dF9IJTV+OT4/QXU0T0sjdXszeGdvYEVQWCliX2l+CithTCl6aWdqWlF3bnJtU1FJaU0+Zio2WHkzalMzWW40fTYpdzA2dURkNSVneFN3QHR7cDg3ZlJafCE8P1NTcCNWenJHPXEtcW5YZFM1cCsqCisoMWF1X1AzNUd2Zz49fEtENnRUPUpkbWJRS1BMZDdSbTlkRlZCfSF5bXxnZ153Y0hLc0g9PzBaSG8lWmRvK2dvSitpKFVyTDxlPGBVVDZpCit1filJRG5fbTVFPTM0MDA0UVhNS1RGbHxYQEFEQD1VSWQhQzxqNEJUfDR5JSpWXnFpNHReMT9OfE09UG1qdS16QkJke2VlWip9eT9wOHJHCitDUik2cDsmWDVHb0dHRXw4QF9NNE94Y3FsPkU1M0h3YE9qVkVUfFY7SElleHNfLTsjZjA2bmdzRUViTiRhRmx+VHliS2Yyaz5Ofk83Kyp5CitIeGtPN2IwOH49WG8qcHREbWBELTRYZHJQWSlrZnowd2JDWTVlWDdDdyY3R2xPPUQ/MXY0bm8jamleM1VLREkwZj95NyFEQnpKK3BVVFdTCisoO3oxfEk7SmNuTkp9YjVyMzZoOGlGP2YoVTZBb0o8bSFiTypsXkY9VERNJFk5Y1FVKlk2JDZZY1Q/IyYmN3tANXNNanJLNW9IbFBgIU54CiteRmZ5dnM/b2glZW11ajlVYiZPKmI1RzlKK09DISFnN2t5b1VGKz42QDstajJKTXYpakw2VG5gR2dIPnZrODJ4MVNncHlLZlEwRHA3STF0CitwMil4WCpyQTBWa0ZsP1ZXelElT1NPaFoqRWNAT0ZpKD07QnU9SllCZkxMSWY4X1B8bV5pbnV5ZSVmWSNDbkVfRSFZfEo5VDdGVzNINDBLCitOY2VEY3dZSzxNVzY7eUlJYi1OUzwxZ2EmTmt9KzxqPG9WKkF5fllse1dOTCU9K2N3KH1DK2AzJlQjVVVvQWxmX29wcHFoRylkI2dWekRuCitpSEctVThCUFR+Rn5LUWhNPXEjdERAKFUmKl57fU07JnJfaUchRkk2T3x6PztmRj1hY3J0SHNsN0FMV1dzazNHUyk2LU4ock5hIyRfYmlsCisqPEgyYWAwfnsjM2NvKXIjKVp3eENaMVRnMDBVOCRaSkgtZE9KVylzUk4jKSV1RiZOeHN1UDJ+ODI5WnUjQktGcGUzT0Q4eGsheDs8JCZCCit6Q1o1TG1PPD5qSU1EWSg/eGg5SGhPVlF0aElfQiFnODVKX2xqNEZFNVphT0V6ejNXciZpZ0s7O2BlTms/V3MoVW5xQT5TWjhkK2x2Tmh2CitIaHVDWGVsaHJ+USN7fVNhY1M/aUNtOTVTd3BKM0lQeF9kekVCeHZqK0E9dnc/SiM7Q159Sn0tJF88LS1uVDZaKyQmUUd3PHhNOz5KYU9mCit2VChic1ctVH1FYVFjXzlibnY8QlYzOHU1ViptdXNVU3V5N1FwMG9wNWF5KyNxJitGWUsyTWFUSlBpWE1LVUR6Nk0xJnE3KWxLKihNX25OCiteNihCNllAVkV7dlVSZjNkVUkzdTVweEZ8TTNhUW10UmlNKVVKY3kpPE8+WEZwUjxITXZHO3JJVTw0KjFqXmZ9fFgqYkJQd2dYfVJeV1l+Cit2Z1BDQjNVKVFFWXhsX3NmZHRpXmByP2whWGtqO3ZEX3A1biQzVUZWUEVHMkQyPEg/QzB0SXU4NWZjJndvM08jcEc0UHBzKVprcTZKbT9eCislfkN2MVgoekpHclltKVUjU2woZDJsOEhoUjM+PkQhTT5YSCQ/KkApQylyektBO2R5U2U9OXF1QHF0WXhNbT5saXc0OTtzYDFTT0pmZzhiCit7MilhamdPPj9GcWwocHtXNTxgZHpHVGlqQlNOazFsWD5uYSYxMjxAZERHaGZ5fktLP28/fVdsXlEtWl5OVjQycDskOyUxTlE/Nk5FXyYqCis9ZHFfNDdJeiReeXpkcygqaDg8fjxXMHh0PkU0a0NgYiZkODwpMzZmajwtUVYmR2AxI3coLWI5d3JLZz4wP15JU2s5azlXX09sKyFOUDkxCis5K0NHVCpTZHRWTnd5VVhjckBlfmpBQzVAOTRua0YxRzlKSVEjPE9EZzA2UEtON2x1ejgxJDZQTUViK2Z7UVEhQWpNRnhAJCFoXlQtZHg0Cis/KEw5biRDVyFiQFdzbGcheUQmWiU9S1AkWktxdyRpKHJhaz1PN1NrYUY/VSshMTgjaHlUPWV2dC1gRSpQRFFsfD80ck02M0k+eUhqUEopCis7IUkoN19pZktxKndlJTMjSD1QaUBgJUd2MUElSTN2PkFBJl8kYDVJSTctX0p3T0VpMHBSaTx5VH5gTjwlZXRpRW9lejdYeFcoPEdWUmNyCitaJFJjViNVWF8lTChKVGJmfUtUP0FXOGZDWGJBRDVhMlo0M0whcSRhMV41VXMzXlMpYlNPJnJzY0UmXiozZXpKQTBwK3d8Wj5nVSZGSmFxCitAMVR4R3FXKTVkJEBiPjUmKSpnWT0oUV9wZnokRDJtYGpsbys7U3lrKkpjRTVQSUJicmdVQCpmMTswPT8pT2JWMDt6IyQlRTBtdz1KN1BMCitIUCgxUU9SWHlOe2tmKT1uNmw1ZTJwVkJebjYwTmNeWldgbGcoYEUhVGQqVX1+QGMkJCgtJk93YlNgTW04VWE5PG56JmcxJT5WSWtqKj52Cit4OFFkXmZKfGg2VUV0S1EofWFAZHspUFNYZ3R3TFZGRVpsKnhLeVVDe08yZjk1SyM2MSRiUVY7IzBXX1JzQzM/NllpRlNuRzRzN3ZBSEZCCisxWEI7b009XnV5RkRTZ2JnfCFhSUBhJjxPUEVGJTNhbz9NVmQ8d2VGKTdpZVVUS1lKWlN2PVMwVCRLa0EhVXt3VihEbT1UPF9SIVNfY2F6CitCYk1xfnJXe3tnY243Kzl2ZkZxaDheVyYoK3x7aC1xcl99dVZfQyM5ZXIpJlVQSDg8UDw2R2pJcDAwfHNDTkBoZCojUmZCM3MycDYjcHVYCitBb1RgSEp4Tz8yRVN6RlBQP3dgPn16bCMxa3dCbWNqYTE8aE4oekI8UntZSiszY1VFaTtiYjg0eFhJeHB3O2loa1ZASDs/VXowbnVsWDdSCitrflBZc28+MlAkREpAZ2BzV0JRbHshdElkfUNRRH5nU087fm47bVpXJklKODs5TTNZSEl4VX4xYnNTSFM4XmtqVVl9RDU1KElhYENDO3NUCitoRkcxOzdQLUJORCVTJVVeNkk5eWc/WVZPO3MpU1c/WHdrP0h5Q01tfGpyVX5AbE5gTzc+OVVnV0FqWEhjWXo2eT0+eDR2M1MpK1hJYlMqCitNJSMhYEwkakJwdFN1SF9YTkRvRkRqYXtXdHxMQjVtZnkxTyNDYlN1YFhXWEY/JkctPz9FOHZwVjE5OUxrM0l2P21aQ1ZtazBfa0JRd2lvCisjVmdfbkw1ZHw1TDI/KHRFZ0decz8xczwkTyZHdj1rS2RAcT49aHRpQGY1Nj9Qa3dscTA1PGt0YChxJj1WPXBfWUFJfHclX1FjRjRHb29NCitDJDdTRlZtRjBVbzt+QHReWGtTJjYlb0RSKVdSb1ZFOGBuVk13WCk5RjJsVFhEeTcoR0JWMCU8WDlXRSVnWXJ6bDcjanJKJV5YTSRqOD88CitndGR7NjYxP009Uig+T3NJQTQ8JkxOdDxXbnB2QVo/OSklSz44YnUxaSNEXilWfHs/VSRTIUFTTDsmTlM9OFJtWWF9Vn5MLXoqM1BVKTFmCitKI0VSfWdRZ0VfVk8kU0RtaH4qfWlwbXt0Z1dfNTU/SFV2az4lY08kQS1BK1dMVDJxcUc1JlN2N008b0F2LWBJVk89SFN6LTtCI2VJOFVgCis0fm5YbGMoUkRjayN2JUVZcDQjYEN9NjdGX299Oyh2aVZoZCMpUWJ1ZiU9N3ZnTkduQHBPc3NMOV9EUD9WP0g0PHpreWBMKXVwTmhjSGI7CitLSH5QI2p7VGszaTwkTUNDT1FBSFpsK1VLajhqd29AJkNNKG0rfUFhQTVMXytjVisqR0Y1fGgzKGdxLW94QmI8cVlObmA8JWMqWkpUfnc1CitSdG4+Y0FYSlkxO2dVKDtqJT5PQEVlMWtTYE4xSUlfLU5wfUJgaWczQj5SV35nT1Y1UjY+NzBZJT05MjZMTiliXkJqR3V0KlgjeFc/RiN7CituX3soVm82MngwfXUjUk0zTEF8TlhTcnklQSlYTSFmfDNvPSpZNWl0eWZLdnwrM01uKUxPXzU3KUZaV2ZrST05NGxSeWYqK3omPHlINnJnCitNY0hHZEQ7RWNaRFoyZ0xROEEwcWclKk5FIXVxUFF7U1ozUVA5NW5KTi1Oa31CbDkoRXA8VUhwPkoyMCNPd0ZVJjJHWVdxa0VpV0dGbVRMCit8PW16TS1UYlh1UzFpRVI3LXY4NSomMk91d09naSZlQEhsbkVMaUhmanZIPyYhN1F1WTdjYzN1PFZTMjdXbUljUjxGPll1SU48Wj9nX3JTCitNMDtUcVVhVUs4MFBAPVoxQXZCPTh+NzlrbU05Ym9BbTF+O1p2KT9jTTNXNHhoeEc9NGBWU31IIzYpYHl7Z2xkVHVHUGUmNmYzSks4M2g0CitaP31oaVhlTFVHcWFvP0ZUQnlCWEk1flg5SUNJKU4hV1ZqN3hkKipFaiohYjxrYEtRa1lgUlU+TyhgU1NIXmw8Kl52cTY0KEk2cHB7LSU9CitBLV9sQ3N1MX03IWkpJCZEcjh5e207eEBIXmlqeWd3S2liQEhZRHFAZkl6VkotIzRUYXNeTTJ6RHRnPFR6R0xuT0kqIyVoX19XJlBBbGN7CituWXUjYCpMeHhnayUmJWxeUjBaaXhgTm9zYilAWEJuejg3TThjWUUjcTFqeXNoRSVaUk1Sck1qKFpxYkJhNThkM3JxVU9qenRNJX0ha1FeCis+OXNVN1YhJmRkNXl7LS05N00pTTAjNWIkQXkqT05OckpBeDl3QXB1dGk7U3NtbmtlJTtgcSVPdUQxWFheRjtvS3lMek0rYTgoekk8QSVzCitVcGEoKnFNbkFAVEd5U0I9WHxKZWkrMFRUcyVQOXk2QmJWI19gdyZHU3VIWXFoZyR8TmNPX3pxX3Q8I29ubzJFPlZxPz19eDkrUDYtKHJiCitNY357ZS1sTCVlM1d5IVJNZFI9U3s7KTl5X1dyQXdyWlRDJl5nOyF2Iz09KUhTXiRGdTNwOXI+XkNJPFdgMEF2YmFuYD1pUmY1dyEobn0pCitYZ1RzZUVXdW4jUykxVldLZGxWdlgpWE9mYyk7NXl6RmRwdHhwcjY5enJlVDA9ekY8fSVnKExRMSZKO0g0JW1+O3IzKEBOKysoR2NuWURQCis5WXAkWCEjTzc0UnJmUDRUKkBVWDgpUTFTVlg3Q21GekpAYnx0LWghJUBnQEdmWXdUdG9fI0piUEJ+UFFyc3hnZi1WP0tFTzJ4OCYqN2hjCitVUUIzYzxBPnYwdVBLOFpjMT9QdmhucGN5Vnd0U0I1PjhDcmlOOWhvYlRgPXA7QkY8MH58XlBXczx0VXVmVXhkMXcyNj08TE5PMzt7bmcoCisyeVY2aEg2KnRQNG92fCpLaS1BfWg2eGNFOVVqYVVlbnd1I1hjViNVVH5mdUhoWE5tNVJ0biQqP0o9b1cpOVcpaUNiO34lQUgwS1MxQlVvCitPRyh8Mnh6VGE/Pl8oOyYjbDtiMD1wSjM1eGtLaylOWUJTfGJuQktmRldOdzxPJW54WG10PVFsO2ZaIz9FOzhoUTYoIWtleTBibFA4SmhXCishK1JqO2gqazMjX3YtUT9rY0BxN24hUTx4JElGRjFIZVA9PnZRNT5IQEF5NWs4dXgzVUdOdlgwdG43TGprRTl6MnsjRmFaNWFqe1UyMG1HCitWYCYzVCN0TkVVNFFtQWdsc083NTMlODU4dChnMkBiZWI5Tnh2TmlhZVlUem0pYUMqd2d1TD9HQX0/XlkrPzJfNiZYcFNMRFZRe2Qle0x7CitaJClfXlQ3YTd8N29hcT16U3VlNypQQj5Vc31gVW43Q0tyVzY+MjJqfHk3fjchLWc9WiFZbGoyeVF0ZzRxNlhfd01Dd0YlNGw/OUJwZlEtCisqPzFrRjYzUjt0PlMrfWVRZHo4fVVjMHMlTDNnYD02cWZXdEVOVE17UHJJPmlUcTljVDVjRzZtcktqOWs+QEt9aEpKb1kySDVaREFIPldBCislUEdnU2dvd2w8ITJmVyZJVFpaaClzLVBGOVp0UF9meVNXeChXeDYyeFE+bkRBemI2dXJ5TllwTFctN2dNK2F5XjckSnJ5NXlYPUokVk0lCis+aXIwd0dWTyErKEEyUnJabkpSPj1GamFNckdyM3VuO2pyNnZAaHN8IW9CQE4kejZAe1lkWXxSZ2dPVXBnNVA3V0UxKzgzOEtXe3VXeUZRCishP3pNcCZgMFEtNW5UazUxay0jPHJmfkxEXmNoV140XnNFWXpEYjlLeG89bVR+bVkyfmNsOSh3KFpUZX19QlhlOzZlSD1kU2hAQVBab1JPCis5bjNUPnNudFNHS055JFlJQWFzUjIwMkgkIU5+XlZLOVY4YjVMYzFuO1lFX2JGTDkhPEBrRk5IT29OTU9UTShycXZxcFMkWFNOMVZGe1FkCitPbGc/IyU7eEBnTD1Ib0FVPFVeS1NDcyRNX0hNcDk2R0w+MSRNNkBKYDx5QSQ7NG9fTGR6O0s5IUU4RVRmUTVOWEpjRSlKO002ZU1uOE4xCityVXxoKjhxZVJVflNudnh9dEhBJE9HSlFZNmJ+cFI/KEJHZDQpN0RJU3M9cjcpPntzcCtrKTBRUUNuTzRzdldAfD5GdTxPMFVsTStoJVZXCitTYk4wWDFocmZAVl4peW5BNXFGXkRTZkVgSSZPJE0pbU5QZyVTKkV6Qlc0QTh9IWZGU35fOGJ3OFQxPyYhWUdhUEwmVVVQaGlKWFhLWHpWCitjfFdOfjYpOVooZ009M2FkTzk5eCV1JEZoSHBxZilpR14kWH1oflNLYyhUYkA8VVp4aUEodTckXk9XSTFSUyhAN29NYjNCUUMwSFA0WjROCitLMUprTE9sKTV4X0lae0FPTEdeSkB0dk4tWlY/cV45Tz9yRUUmTH4wMW12Xi11UGwza3F8JD5TbkFWPEtEU1Q5e2BSKTw/Z3tRfWM7aCMlCitVOCtMZiZoOCFCNG1edkdDfENSJDx0cTdHOTE7MFVke1J2S2VWNWkrQ0BrP3c3Zno/R2BQMHlfV01DeytgP205eENCeGpxSXVwengkO3N5CiskRFo8bWVISng+TiVxWj0ka2k/NTspVTQzcmliWFhHZUJVZ3dfQEcrUkFtezZDVUUlZlpSQHk/Jklfc1VjeXA7IX1UclZgOUptPjlCbFhxCitSQWlpPz0pTWxleTFtVG4pTmItNDM0I2x8Ykk9SkFHSTZsVzd9bSFmOX1qMX1MbT5MV29jTW1hey1YVXFzODw2QzZ6WWhYX0o1Kjk8fHhFCitUTClUPHFeNEJrfjwpezJqPU1lMXtvLTJRbmh4VmFESHFqTDNKR0BwbTkyQCpRVVU5bXQ0JGhaJW5kRzl1cSQjQH5VQSRhazNXY09XRDM5CitjS0k7JGNUSzA4R2k+ZEJIdi1nLStfJENjYk1eYUFTM2J9WDhiY2BSME4pUDsjKUh1WnAmaE9tUjglekFAeEIpWHs2Zn5sT3Z9Rk4lKSRxCisxOUxBRy1aPUB7c3ZDfUEyZXYmcEo2dX49K3IrRiRSM0dsKys5Qy1lSFZeVCEqJkhJfExKMFRzdmwrSEZJXlpMNyR+U0FmPnQka3tVbiVVCitFQ057Yn1zbXwkaztYSX5faXNvfGsqNUV0MClgTkl4dyhDNyZtaV80bCZ8TmVjdCpiPjZZcHM0Q2d2cm5MMjV4P08xMXNXeDc+NH5QdWxFCismKnk8WTNYclQmYj0kWnJZaElhRDNiWEJyb1N7d3UrdWF1IVdNVk1sODJAMC1yI0VoM28oVEU2RnYwa0ZtNEZvMX5YNWQwKUxCeVBPYEdUCiszdTRnU2xOTWhta35yZmlSRHo9MkFCWEspMFdHVj0pWCpYNlk9ckxjK3U8eikjQDM2YX0tbUZlXjtMfEMxPSgyTkskNUFyPn5DVE5LWCVACis3UFEtQlR+cUwkQjVVJGJ1aEYlMlQxVTVhaE5sR1lDOS1JZUBlbD07O2B4ZTl2byYzTSk4aXJgVlZMSyRWQW5GNEtuRXVTVmExKFhlOUM7CitqJngreWtjeXxfeUB3LTVMd2VzZjZrKyNHSDFiV0s+VGcxX2UtKDhee3oqdm9PVmtuRW1HJX5PeW5UJUt0fTt+XiE4YjV2PHAoU317KTl6CitFO1dCKyslcUU7KmNzZStYTUlpSV5Wak47Y1MhPCpKMnQ/X0doZkRUNkptTiF1NF4wZiMtRUZoa0UpUnp5bFFpakFVNm0/U2R2fCRGdD0mCit9OUNLMzhYQlJ4RH4rNzZUQzlfc2shYDMwVHdsRHVadV9vRlEkeFRuP2ZleHN0TFdFOXRaYmpAazlJN0RmNSVsR0VSVTM1WDliMlppSFhQCitVX0Y8Mj94K1QjeVYrY1EmX2xKQF5RaTBjVDQkKHdzKEw8LUBpQmhwfEladG1ENTUpeEN4R2trN0hiP309M2MxYX4kNj4ySCM/N3hfeHxrCispcUh8YCZfQk0zKzlFMzAoOWZpdnl1TXY8aitPMDdlMzZgZEQ8NWl6JEZObjd7SmJRbGVSTUg3PUs9MV4jWClTM0JjKWc/UjlTJEI9VTYjCiteMTJXSjlib3oxdT9UcFh4Jm9mJEgzUzc8Zmt+Jn1Cb01SIVhhVn5LYlAoTFVoPihZbVNnbnIwZ3JaUFYzRW1hKl58b2Y5OyhOQ2NUcGRDCitzQE0yWnJofFJCVk91IVFYWHRmdmMoNj9LNzVkZm5BNm80U2pmNDBkPkdfaWV3TiNGIUUyWmpXUHYkX1g8U0Etdmleb0NvJjVaPVpGJnxsCis0c1M/eGhBYFQ9aVlSWT0mP0pkezBiZE4rZihZWEhNYHF0R0dZalEjKmJlQXlBK0teR30yRyM8WjIhTHhHM3Q4aGdGN05aVjs3fnZZZyZXCitRVyhWXzFMMkJRRyF0VkE1a3FvQ19xdnkpZ3BnZj4oVGppb2I/cERXM3R8Mk19fExkPD1aOFdCfnZAVzt2TWRTfXhea1ZDak5JdGBUXnBRCit+eU9UOT9ENipIaXZ7UTd+a35jO1I4UT8pcnA1MiFHWmNVXmkzMlRebXNrKyF3ZlZuN3UrZFdVfFI2M057RWFSSTNaP1FxaVZkPFVjVyVBCisya2RuWCp7dytfbG1MVFA4eWBESEszRm9LN3p3MkZlSTR1T1Bme1MoeXdEVURaYH1eZGdDd25hdWBkPCZQek9qSzUkK1RsXylgekghSkV2Cit3S2QoMEpWJlFIZHNEMT5DVmB8cntXdGsyOG9NU1dNb1QydzMtdVNuPU57OUIyN2Y4RUI/XzVyPmtETX5pcCllbFh0elYyQVk7WDY9e2RoCisrYEwqYUExK04hQiZGdW1BTztmN0FWY29EOTc9ZnNwR3ZUQ3VUO0FpfTNOPG5LU3FOeH0xJHVWVD9jZTJMXkpGNDR2JmUpR2xtfHUyIypUCitlPW09MjBlRF9sSV4jQVMjMDd3QzRAJSghSzhTT198Xy1fRFhMVT9ESkxsWjslJipwKTd+OEVLMU42TXhoK2Q7VCglJUlFZlBrTHNCUzRhCitANG93ZilOSmc/cUNaKjArdEEzYkhvV25WZjd1QyFuKFYzbWc1SEszKmZGNGB4YyRXdnNeMW4mck0/RHhxbVl+bS19SWAmPF9BMzApPiZTCitvUForVilaQlNHcWFnVkVGX0R+UEZwSGVkVENUOW9HelZgMzs2I0E7VVpoPTlhNmNTODV4eyMle0kzaiQoSiokRktmKTZAaWV2XzI9LWxpCitPI14hSyVQazkxVSVoQklQJHolZihlVipePSV5TTxSVn0jUWMzIWYkeT04clUzNnR8enMxJmg8NCVMVWFGcFMtTDA5T2grPjFQZn5xKyRaCiszI2QyeyNCKk1qJm5WdTshc2dhTkNSZXZBKSU7b3t5WUo/T3hrb3JAMng9Yl5JOCQ9SVhBYGMyPDt2OylNMlhCR3dad1VJPCYhMl5gNGooCitxYjdlbTtQZTY0SGErMEFDZkpAUmRBZ0pxLXJ7OHoqQHByb15LIT5eWE9zSCVqaGdQQkh+YzB7X1lJa2lRej1LTiVrS1NMNkY5ISRVcmY/Cis+RE9jMCRyZkZSbEtKV2czWEx9cFckMStaJkBiWFVkNz9BKjtyem0/RDIzUVB3OUB6QHwoVHg+OE12fXJUfUtRdGclTjMlLWApMGgmeUIqCis7KT1yNmk0LTNEXnZFfjwpfi02MFRpMHJ4bFpOcms4filZQDY5N00qZWU5KTgoKiRfMWMwMiZEZGZhQyRNMCRkbU5Ucz1odU9mRXFRME00Cit6UUpwKFc4JXMxQVE4ZUdgVDQwWWA3R0tHZXZNQmJ+K1U7Wl9xVWJaNFR7SUg4JUJyIWBFaiFPMVRIQjFvdjNzbkk9QElVbllfbE1tI2olCitfJjM3NCFyYGd5TE9tbTl+a3ZaITQ8eytXY34mVztkJHpjeCpBOUojdGs8KGhFSEJrQUpaZSVJYyQoPXFqRURhTmtrXzUkOUdqSW9hVzx5CitzemtKMX53KkwpQ05CRTBOdmZIYV89K3ZyTyZrejNNTG5fJUl4eCtMaXVaZGpHVVUwUGl6XzdiSVNtLXp4JTw3aV81ZldsNytCTVc3TXhuCitpSHg3cUBgYUJzLSphUmhuJjAtcXZJZXBxfk5WMjVWb1dxKS0+TlhWeTVXKzJTITt2KyVweDxOTVUrWXZxIVIqSHE7TWFQNjZubzs3JFBPCitlIU8qOGN3eVBlLV9xaWQ3dXttbitnZ1U4OzVvQkRQTHg7K2FnKC1ZZz5OVypXbjNeKUtSWWRkQUpCOFdyZiRoe2VJJiFfQEtrZiZNam1tCitoa3h2UGlRZyhAVUhHWng5Xk0yRWFJMHd3PChUbGVmPmdSNUxGYylwXjlEPT1oPnZEYCUxVklqcFdfPFJASDYoQG4jSXtvKkk+ZUlEJnpHCislVWB1bUk7QTdAcFVKTT96aDxfWXlNIWl6KVFuNyFJY2dKfDItTEVQUyliUTIrKCY2KUx+UFJXRzVUJUthQVlLN1RwP2ImaF5RbVJLd1UrCis/M0NzX2dFIWV4VkFGSUJOS3Y3RWRpc019KVE4azRRPF56I207aU8zIW1xYyk0SDJAPGNsMCNCTWJFVnNOYXJqWitGV3h1ITRaS0JgVWp2Cis8Rk1BV3N6M1FpR2dKeStYVyojSkV6bCRyI01ffXdyQ29DajRlcnp8MHltMHJGMzZ1eyphPEg5c2Z7biZBdDhxcGFxXm9Bbik3WE05aENNCis9M210UnslNmtrWDZPSFckbHYkbWZNUHN6YH4jPXs2fiVMYntBfShwMkEwPnNAXyEyY0tHKTx5NCVONCFmREVqJmhmUmZQbjhtX29kayQ8CitXbHBtc0RmajtjPSVmT0VlSWBodXd6SChYaXVrMHRTcGt5eFNnQUxeSHhyJT5RVmg4d3dDWlQ4JGZCfSNkTW5sPE5FY0BUd3l+JmNKWHF6Cis+LT1QR2o5WkwlJmc0ezZwNU1sbmtRI0dvQkIyb09rTzVXMUdPdTNQQlpfd043eGApWGQ/Sjw9bzY8QlFDJXNAbUUqRXo/dGgxQTBYdSZOCitIMG45TUpDflIqX3pPbUJTNj1sfE41YDt0UnE2Yi0tbjNkVWNAI3JnUn5BKkl4bm5zdUAwJXpoYnl3ZXJXUm1kN0pfPUlRaiNpZl59M35PCitoIWV0aXUyQVFtZStISHhzJVE+TmxhcjVoOWdlOyRHR31qJFY+Vm0wdDJ7ZWItYEZHQT8qQjE8TUI3fmIkRUczJjNpfTBBbkBXJWVCSm9BCitAcU9EQWU0JDQwaHYtaTA+P0VzJm1Sd185JUtKKj54TTdmKHBIP3s0Zmd2N0dlPjkkMjMjRF53Q3NwU0tkcH5MeTVLdzBTbGZqaUpBeHArCitIdHxsTD1yWEJtXjZZb1FgLUd0cyQrdyhXb185WT1rSGw0b3tvNUlfU3o3TGw+QD1oaCZqV2VFfnVPJH5QVW9OKUd7Y0IyNT1VeWQhb2BuCit1PjVDbF4ocU44clcwPCZmN1c5ZjIyQE16YEpCJWNAPytzWC1UWSpPdEp2ZWM1UiZDRUBzV1R9KVhhZD9zd0ckbjxrcU1NdEVUKER3fWUzCitad35vMFZjUnJsOEp9eCprdzNzUVNrKHM/bD1XVVVIcnh3blBCQ2NzbEMpLVkrNVhyWns/MT8oWWF+QTN8Milqd1J9QVpvT3dNc2o8alF1Cis7Ync4WH0yVkBOKSRYIVMlbEV4QHM5SCsmcylDUE1nV0U1NktCY1YleTI+Mi0xPX48Tm87NGRYSzV0b2RDI1FyZ2JmTFdoUm40SU1xUU44Citxflp6Km50UjRzT3M5NE8xIWEqOWxfO04oJVIlJlVKVFpLSE9TeFU4WXtYPUxeTEhkRHJ8ZDZ6eWFYezN7NT18KXgoR2M/JXxnVjxpWCpkCitfVXVkIUkoS2hVemk/UVUtQTExZVhhOVorNWpSZ24leElncjlLPGxOfCs0PWVsXlV1QzcmfG1xJntJbDsxXndrJDt4dkFLJUw7IXp8ems7CitnTWwmJjIqbkhDPm0hUXR+aEE9d3ZLU2FIU1MwVysxJjtuPCF4TENUNkEoR2hDazh3VlAkSmFkTmpkJi1jUHoocWJFK2ZJPHRea0pRbFpCCishZD5GMF94PUtJbiYmPD9vUlpfRWxCKS04fFFOMSpeTURSSDlCeTlVI1lPVSY8enJPWU40RnVyeEBJRGtwKl9lS30ob0FDZ1VEMmV+OTI+CitsO2VFaVpxT3JHcHQzNXZjRFpKeWxgbGJrbGY1M2d+I1RUV3J+dS1oSX01fWpZOFVtdFB0Y1otMH1AN3l3MXRNPiN3XzBoR0BKMUpHP3lgCisrdyVPeDhffExpQHhGRFJIKDlgM01TbjA+WHIoekBzNzFZbSR3eXJ8SSh0Z0liRFlyS3lwLT1mSHxTZFBnX3IhKFE0RTN+R1JSNTteRSNMCitEQmRUcypvJVpJbThEKVBQamM1OT04KDtPfEp1QX5YYE9RaD07QFp9MlVaIyZmNWM3fVV8MUEqeXVSUUgxWTVFX0pgODU8e3RMN2NQTzJACit+bUdCMyVqOHVJQiVwQUdAeTBwWXkwV3FeTCY9P0R8Um9KUWlgUTV1Tm9FX2ooezBCP1peSnE4ZVEwYlhFQWYmcFQ4aWg9eGhMQzEqcnhqCityd1R5YnhkajkkM0wqVjgoMzgqQ2BUZzJ9I2hEMl5rPTxMI0xxa3ZFPHQreldRJmk/eStHQUZuTEx7Vnw0dlE2bGo2fjNFPkQoeWQhYys7Cisock9uMDt0fU8+OTMlO3tvPV98RlJBYzFyUENQNSgxUXszdi1oa04kKktkaTckV3BKcDMlQ0Y9V29+c15oIVVsdCVKVGg9LXFXaDV0UDUwCis1PkpxTVFIVWljZWt+QTt6Tk4mIzMrMjxjJWh5WilTVUwyc0Y4JCplPTxoRTUkQzxKM3trNldJOE4tYW5Xa2RTQWhFdSM9O0dfenAzNnI5Cis4VlctNX5IWE55ZzdHQEFfPjxoR2FmfmY0Qj5oUCNLZmZRKyNZVz5adFIkJkx4dnx5VnVSSVpKSmF6fjh1YGUtSGdZQGA9N2kxKXlfYUktCit3eDtefG5RaGFTcnwkQHk4YCZaPWRkJFReWn1qNk5ke0goa2loV1I+XnJKJC1ha2w0aUh1bVJyVWwlSjJrM0tHTz9UcHI4dzYofnFibUApCiszPnE3eUxMMjxIJDhgbFhqMnVQUWJSWUU3QXJ9V2E5PEZWb0ZXODx8UWFkNyh5QztZTn0kc3ZpQyFFbjl6fXo4LTVUMWhVe0xCOFNVdlh6Cis5VE9jWXF5P2xOO3Z6OVlDYGtSUzU8Q1BfLWZyKjI9UT5vdzlPUEZgc3xReUpxQystQDxMSzYzJitQTXhwVT9QTkJWOW94Mm84KHlaaFZCCittQEZCSiU+VUBHd2VfallkaThLdGo4XjFedU5aaj55bGB0Mjs+Qn1Teztycy0/NmRgQDxAfGtyPSp0NjA+Q3hAbERIUSUzNnNpdDtgTm0zCis7T241PDNiLThLVyRDPjkmT00yVHo0ZkJaNTFQSStmMDZgKntAbFJ9e2hvYj9yZ2c9ZkVwdVpaPXt0VFg+cE4pO1B0ZHxfe0dKKWVOYmk+CitediVubU92eGtZUmNoWXBmPHR6VzVIS1ZwemhEZTIyZCgmZm81NnkobVE7MGlmaDxLNTlNJGBMMW1mJGdxYCZIVGJfc2dkZFd3N0tmVztxCisrdXRXajdgU0RNMENjRDQqTENFYUI4eUpQR2lZcEtneGpaYVkqPl53TWAmX0wxKWpxfV5DNCZnaUpWV2IwP18xYmdLKDY9cSRucTM0V3tVCiszakJVX19AZDJ3M14yfUtPWHkqSn4mak82UTF2UDFkfi1za3M1cytRQW02U1YjI3BVPGdCKmJlO3dyN1lRWFlgOH4jKVUmRnk5ME0yKH1ACispIWdrO0RgQ2c9Plp6IXNudD5ockU7Mzwxbnk+UVVUK1B1VGtYUkR+JFU3Y1g8ISZGWXJraVNnVEtEfT9pP1J8c2E/LTlUNyghXll0dzNaCitDb1RvRjFJUXxWd3VtJHZiekhSPFZBXlkxZGRZfUI7SHx4cHRIPSllU3s8eykqYGtQKG0qOUQwRlkjUV81XkNxOTZgPTduUmNaS3Q+VT5yCitxUDd4WmkkNDNCfFU/VUk1bjBKeHchdkFvNnNOS3o1dDB4V3dYVWxUe002aV9tPUh9UU43cXxpJShvbmg7SUhWSD0wNkI9bWo2QTRpSE1PCitQKlNQSiFHT3t1eXlKcmhzSkxnNElCMjQrVUVLRnR6SVpsUiMxakxzcVAyKjFWaHNlMXIlRTwjPmgkaztDJD8zeCkkMiZwPXZfQVljVDNpCisyXlZaUk1jVlNfY1ooIWpMUzJhdCVgUGshMSROdD8/MjZxdEJ4UmdPR2JWQ2ZOXnVod1d9cFdENGFYOFJWfSE4SH44dVVfc2FLREBSQ0oqCitHJkx1bnAhWFRgUFdjSXBiVDsqSGV1Pj8/ZDxKT0I9YnVtaGA1NVR1N3s1QnJWMWBxez1FWm8yXyNkYD9GKkNrP3VEfG9LcHN6bUgtfXpZCiszU0QpKV57UXVmJjl7UiMtby01NlZJX3twa09mSXc5OX10NU89RDUrbCRxQU96U218cjFGfWdDZUhhfU5UWFV1eloleUZWVE9pX2JBNDw8Cis2Vl8kaDdeVzVIK1I0JHFyJEpLVXpEVFZNT2ZhaER4JFhgPVhFZFlWfWl5SnlmSSpyYUN9eW8xanxYS0dUQj10NypDTk59LTlVRm8pUnlCCisjUlVJZmAtV3k8Q01FRShaQGdWSlpMV0hKak0ta1htbFotVXtPUTskcmpWbkdsYkFwfCszRXlxO3E9PjB5Y1lIJm8+MUNBJj5ocXdWRD5eCiska3wrPExpflFgb012LVRTO2BjTDlpe1hyaVgxcHUpRjxeeSZWRj9AQ3J9c2dyWHV9eTQhUlFeYDVYPHJFTWhpYUpQRSZhMjlkakVGdCtkCitpc094USt8cXJWaiN1bjw4P19PT25DTHZkdUYwQEhjcCl1RjtxNldvTzZfenlNa2N8QHRuZWhQQmVGNktoI2ZhKWEjSzdVcE5sbGxpP09nCit2VUstNkE+MTI/TVd8STNgb05tcW9HYmZGfWJxYXpLSnBTNklpYkdLTjV0KlAzeTEoNmFRfFJoZXRvcnhtPDJTbD0zbl5YM2VMcl9pWi0/Cis5UlE2OXZDSEo9eEN5RXwtWT01Uk5vUEh4U3IqKzlGaD10XjRpOUlMZS1QMzJGPStZdVElTGFFQl9hUDdOfEVYYlF7aT1rJDIhcUBZYC1FCitOTmtXXmNoZ0hja3pYTEZkOyErMV9xM1pRNlE8RGRsU2M/MyMtM0pBVFZXP1EtNWNGVDRLayM7NDF5X0M8QXpDczdsb3tZenx3SVcwRkZnCitwJWc0b3I5Xn5kTzgtPWV0KDBSMlQ5K2JRRyY3flVuQXVaN1JCKXZrSX1genA5ejBASTJiaDszMWB+JnF6S1JsQEF0SE5AOFhtMnJpOX5zCithO3AyQGlYZzxsRH4+PnRpMGpuelJ2bzNHbWU1OHZqMX5eWCF8QG5XdiQ2WTc1M358UGRRN147LWRldWdzZWVkUFVCS2kldFk2bXYzMHtyCitiLXpOQjk9Y3s9TVktSF52dGRzbHZrWlUxKEVsVCVDM0ZFKFR1JWRBT0BtPUkrZEZfSXRuaFU8Y2xKUXlXMlFpbj0len4xZl44blNBQDIlCishUCZDR3ZaSFQzRDdLbTNoYGN4Tj8rYVFhPmBzSTMyM0koWWMtIzRGaUpeWVR5eWlpdk1oT1d+V3ZMPVErUWZSVTxTeCQxbzNJaGcmdDhmCitENjNWXld7TiQwUDBkTnEoI0BCQSN0T0p4RHU2ZThPaVFwSHxTWlpkP3NOeVR9OWRXfXJ9Qjdme2dEa0Z+ZVJiTXg3Z0pfczcxZC1HUFo8CitVOForQ0NpQzlCbEhrSm9tc2NYYkdzNWFwcF8mbXk8SEhubDMjX2tpb31pNHVEJD96SHowMzdBTUF+OTxjJjg/c151aWRBJTZRUHBuZGN2CitPbmBrSE9pYnQ5OH5HZ2lsNkB9WktkX3lTX3ZMUV5fPypwJjJyZkZlaXlJZkwrPF9lYVNFYnNZQ2B+Uj15NDF7UGh9aXsoZEdMPmdPRUNRCitLM1BsbEw1Kkk0IyU5Q1VoO3lrNH1NTFNxeHYzMTEzamkkd1khYHs8cEdzYm5wUnkxQGUjc1lJZlMlVXtFRyE1Yz5MMzh6eSZISjtNb1dnCistbUcwSl9fX1heS1ZLaSlNeWYyZFBXM3A1TyRjMT9CaUFuQjU4ZXgwR2dCTyUkYFokXiRwPSNHTUtifFkrYjwlRlluVGZtTWBhcmJudVJyCitGbW4mOW10NUZ9dippZ1poSGYkLSQqZmQ0RldhO1AwIzxldTw9YkZYX2lxdUNpZFc8VTF7TzM5aGhuSGs8U3syfkBIVjxANWJAYl9KdzBJCitSdl5jJl8oWld7RUBpZTtkeGZtKmIqKylkQilLckQmRHIzWVQ8WiE9Q0pIeC1veUo8bXw7dTUlakwxJFdVfGY/SXdZUFAjZ3ZybT4pMGglCisrfj47V2xjeHZHNih3V0YwJHd+e3tkNGMtP0ZKUXh2OTtVMSFKb3g4dG1QKUQ/I0V6JmJoNGdgMUB7RE9SP25IWUtPKUVkalh+Pk5YaW1YCitgPWt4aXpKYyRnT3VeMSgjOzVjZ3I/ME9icDx1Vk1MISpxa0BAeTRIUyFnejsheDd2KGNwUnJ8MFBPd3UzQzh6Q1ZVM1JzODwxIStYOz0qCitwWkRTQlBpQHhaP0RoQntkVDVBODhpWlBDc3oyJllEXzdwWFpkSVczSWskJjN9fWIzS1I0KTZ0cilqVzlgYGRVI354TD1aUE9BQk9tLXZPCitlaVRMaiR3aWdgQ04lSj9AanNRUUxaM083XnoocSlXV0BQJSFDKTtqSylXeEZyT29wYl5NZktkMUxpV1FiS1krWFpDcUFKVWQrJVhgLXxoCitwa2tmajw/M3gtQ201NiQycDc5YWVIcmIxcG10dyQ2WSg3X2lLfTBLZ19vTk48SHpmQU4wLUREPWVxKmByRlI+ekRTNnBGcDl3eE92QlhqCitnRjxuSFU+RjhMYUZgJVMwO09QKnFeWWtmaTQraVh6O1JIcDE2NCgwV2dFa3dUREskLTM7e1VLSyYkfT1manNgVCheck9yNmxJQ15xaXBwCitDVGtEVnY0dGkrSW5XJEMlNT9gQiM8b1lYbW9nJX5HLT1tKyZSI0JfaUhfRUtjPT92cjwjTTtfaCl8UDtSPHxeR3V1RCFeMEtyS3ZIKlVRCit4eWQzbzFsWjdBWXo/d3FTJikkJFlBZlVKe3coSiE/JnI1SiFjYXtJPjBrKGN8Jj4qSTBDJnRleV9OfD40e15RRmxweVp0ZUtLZTtiKUdXCithKXpETCRYQjdSc1EmQV88VFJLaU8maF5GRzlUPDhCNXNZTmpLOzRCK347M00me3Raa3dSUGtCdkppZWl7Tmh5d18rOTY7OCZhMFcmSHs5CitiTngwWVdqRyNMcUZ9cW1DOF4wYUxTdWBhdF9Sc2ZvRmwqKjJEZn52eyRjOXg3cHI5OGZ7ND5jNEEoZkREXmNIYUQ8aXpsT3t0eWJIb18hCit4Q2JaOGJuNDxhYkUxNjxRcW5gSDNYR3l7aGZLZmlQUSpPTDZ8PnYhcmsjOHV1S1I5IyhpSCFVWk9JMEVVaVQqbGp4YlRJdSs2UEYrYihqCiswQD8reEI/VmFGeTBnSEtjYz8yY2c7QXI/RzxEVX5UWlF9I3RWOFFOJj9vNkVOM24ja205JHxafDtAYUxsZHVAajFWJW4jSD9EZmtObVNACitHbXNwdmdvP1ojV1V0KCpIY2Vrbjw+NHZ5LVFJI3JLWDE5dXFidlU/Zz8qRT5BaEtPa3dfVXVRJD5BMkdgSVk4RUY7Z2UwWik0SSFOKDZ8Cis7VE9gOz9JI05GJjFHVFh+XmthWjJuczlkI0F5JiRrZVRFfXBnTlpTSG47MkNpPXptZmE8SzhIRCgyPVdpdFUmfmIrQmBBPFlkcmdsX2BaCitrTDZrblN7dXhERSEhViN3UyFpQEl5bGlqfjQ1YXV8TTZDbFV9Q2BTQCQ1NyhCPztfTz9jMF50IWJaMD49MEEqN0xnaWVNOyk8WmhfKF9CCit4d342SHZ1SXkkWVRGO0taZ3x6eGFFem1YYktvd3UoYiE5R141JE1UdkJWel8jQn5XbWEyPH1mQHAmRXlUaF5jQCNPeWg7NmYrKGhQUFlGCitIMnRNN1dsMyh0fHVgSkYwayVyOEgjSF88UCgyRD53ISNTbjskJWBtYHV4YGd6aFF0TX5vc3ZKJjJpbFllbURAOFd5Qnx7MVByOE8rd1RWCitOdHotUCg1TEE+fmBeQ3tQPTJTKl9YZCloRlFRPCN3N1piYUZPJSV7aER5YCtYKihDbG1mN0VFVzZ1ST5GU2oyNil3SDllaSQ7KTZGN2Y9CitjX2w0aUB4UU5wKzBaZXJzcVJVK3QtIy1DdGckKFApUHxleyVPUClfQXVmYE5NYHBzQ0ctLWJtSnlnZ2JhclRKZkl+QlgyRWtvU313WjQ3CitBPCZLJFh4RFR3Y0tEP2tUdyhKcSFmcDNaUmFTPSU7X1pQbDtQWW89O1dQI0I3P2Erb2tYNnMkRmBZY0F+ajZwUCVNdVpAOEFzJis8MnYkCitNSjhOKWhNYnxjYHs8aFVTRjV9PTdjSkV8cWlPTW5HRTs2P0RBbVlWRXNXb2ZzNSltb007cTlzKnRvOT9lTSF9V3BVKVh8ZHlWIU1eWmMxCit+RjZaZzhDMVRkPVBkUyZSU0Fya3VpMTR+QCNQWl4xWGpnQDdifm8ob2t0fVg3I1Vhc31QPW42bV41cmNgeG5rfD9TWmtPPWp+ZmU/UCYzCitfYlN2ZiMwTX5qfFNERVg7VUp2aSFPdDZ8ezY+QjtybSEhZVJYTkllfDVaUERGRntLOENPNmptc2c9Qkx8UFFKPjFXWGJASmVQWGQpY2JhCis8ZHxFKW9VdSN3YlhDZDkpZH52Q2s9fUlJLUB3QWtuazRtMjlUbF5uUXpJcClzVWdrdD8/WW9ZfjE8UGo3R3t5Z0dxQXpKdz1oamh3K0QhCispWHN3OHczKD5kU1RmSV9RZSlNNVQpdTNLVWBGZllXIW4lbTFsUElMTmtSUnJ6eEAlSj1fdHhSIT0tSElNR0lxc2BHTlVLdiFXPzhWXi1fCisyNFl9WG9PZiVUUTlzX2QxSUorU2VOJWZIUn15QlRTSDVTSzBVdS15cmtgTFV5PkcrMCN5dVl6bEZzR3NSWW1wTFpxRV9SISR6VSVSMHszCit+SnU2SCVZaSF6ZC1MY3U1a0t1c25vdnJ4I0Zqdm15aVF7ZmBlTDtgTWFjWFJIP2BOdmdUOGU+aitMMXFWcnxNfFgqMlpeZCYoQ3xmWERCCitnU3ZiKUZUZXh7RGU2Mk94YlYlPWpRZz4qdkAhalQjPWNEUWI7Qz0xTFg/Jnx1TyprJV9LYCsxWDFKUGM8fDlPRmxKel5AbUArMXx5SURJCismOUEzflVXYExHWns5TkJie1Zpa0JkMGlHaCtaYDdLSFJoPnYwckE0eCMzdiU5eGhgZEkhNXM8bEEtbFNEfWpoZWBUfVYoQD9GSlJpWj1wCitMWURwSz5WdjkzKXJLcnJYb3dzMUxRYW5WMHI9dXpFJmE/dXA8cFkkQ0Z0SCl7XlkmYn1hKn1TTHN6RmZUMk5vX1JZPSZCTEpOJFMhdX5RCitgQSRFTSowWWk7aGwhNFZSXzhAbCU1bnNWKGw3KHxVZTErYlYxTz43Szxfd1FyT2NPKmtPK1RBdX5xJCgyRnUzUjtrRCU+RVE8Z3xVSlNJCitHbkZJdXFSMDBBJjRFcjQ+ZSVZPmRMQSY7fmA5KzxWPWRNMnAxWCEtfGdwPj1MZSs7SldQUjZLKzJvZiMkNkQ/dGxBfUZ4UWI5P353eFZgCis1WEhSQUpsO248SmFfV2VtaG1VTWd4dFVSa1kxMmI+P3lTKD1EN1cld05oe3YpenAyM2pIdlRaRy0hdTN1T01IRGhGIU9Jal9iVDVkRiE1Cis9PnRLfj5mWXtOK1VLNjMpJCRDcnhwfkcrOzAlTFd2QEphfSR9TXgxekFQTH1tKFhUJEV7dig1NSRjNnl5N0NtO2U3PmdUS3l+N09xUT5KCis0VypZLXEqeyV3cUplQzVkKnxgSVFRSk42S3V+Mz00NVJ7Nm9sSSE9JFAzYSVic3ZBaClqNkhKPyh1I3EoWjBQbDc8PU9PbXp9PUJXb3VDCitiUlVVRjJlK2QlVkB9TVI5OWR6YG9wWEgxP29xVTJxI1pQWVdsOEB+b0soNUNpfERvNHUrZzRCKV9CVnVJUDMpI1BqKnRQZjxkO2c/c31HCis8VFgrfVZQQ1F9flE+VGJAYntoNzFXfF9VSyN+TD0mSHohWFljZHBKYm5KQU0oSTc4ZiNDeVAqRVdUek5yPFZGP3VgRSpfYWBGeCUtZ35zCitxJW03WHMoKWhRQWBWMDxPKVhxRiVgVkZ7RClKLVVsXnMwPHQwT3I1ZDYqbC1zYHE4QHIxKnd+KmBAZSpNfjxnbUtpP0FwSEpqQCN0JCtVCitmX2dPUGxKQl91X3I1b2o4Smk8ViRPQmpiWkNlWSV8RWRSaCE8JXF+NFRqZVF1Nz5Hbm9BIXB7UzdfWj1gJEh7JXAmfTFEMyVPNTN4WEdsCitZZ150NldMPkJARVdAc3lUMEg0KDZAV042JVJsbCF2SHpjPHB7KHdtaERfPHU9dTxHK2UqcV9KPmE7QEFNKXhEJntzRjZBd1QhPjRTaTUpCismPjVtOFheMTQjYyZOdWVsQFZ2ZjxoNTwjRTk0I28xZC1FTiNjSlFCViVIc0JHQWZsQWQoPmZMZ0V9WHJPZnhaamp0K2ZfdyE0PUZtLTxECitHY2dVdk93OChVVzF7ZlojamdJZStrJE1HX3VLQUshPW85YGRIUWpqMCkzUVBfJVc5TW1NfU9MZjB3ckNJMTRDXmNiaW1GUyorNH1yJmRSCitoOz0wbFFBciFNYyNUSzVSO0pUT2VXcHAyNTk/e3w7OV9GVllEMVdHUHAhYkpuKjN9MipULW8zSUtJJX5VKWJEVylxb3FlV0ZgcDBXfm9wCitIWFFme1d9VVQqKGdRSXBMeHNhWCU4WW8kMGVFY3NMIyRaPzw3cTFKXi1FWit+NUdLN0JHZ2R3IUJaaWA+WWtWO292Rjx9aVBvciViU09qCitaSn05Rml5aCN2NXl9T1c4QX03Pn4zd1U2M31oZlU1I3pUKnVAcV9KQCMpamdzMVpIaH0tNF5RaCE1MGNsS2xCe2A5fHAqXnp4OFp1K3RCCitgPTMxNXhBeUx6JmhzNzZxYlA+YzZobHhMT3Y1ekImQF9kU0IjeSFgaWM9YFhGZj5Xdz12VSFETWd2SnJEaDVSZ25nKSRnRmlBd05MT20oCit5fDFPfFB0WmUzcHt5cUN6RHhBbmJHZDdGQ3VvTiZwI2xkKHc0WVZzay08Wk56P1ZsN05iY2d+emJIKUd+NzhVK1p7TEo0M01MPDtya2lKCittUnR8ajQ+KHclfUQzWHVKUUs/XnhWMEU7QE0pe2dRalh9JkJxaW9wIW01KW5pTUBNPkEhbTc+OFEpZTxaJEA0ZHQhM0EzRSVtbyptQClFCitEUylaUXJCTTR3QkR+U01NWmVFPEo1QzAmVUdOWWM1PiVXNms5ZjNVNEFoPz4kckhnZTVAa1Z6dSU1Z1JTeSM8bzZhU15tVUspK3d7ezlvCit+YjRWPH4yY0E8NlM7R2htTnFBOH1IV2FybkJUZSEwK3E9ZHtWajluKkR2LXtJU2owOWxza2xodUZxIUtkREA1OyM0PlpURUFqKzljS0RRCiteV3ZYSVk8PFkre2FDYkZQfjJISXB2eTw3PEpiMz1yPVBDREFKKkxWQCo3M3Jle09sMnVleX17cyFOJVJFVVkpdmplVlZtN2hQPCkoS1UhCitZRD5iSilpNCtFRVBfRE5nckQxcnFLVyVTZUJ0YHdmQEdPQDttXmIzQVIoeU41cFg0UVN2eEsoJFFqPVpEenVpND0rdjtqazdMWVZuQHNwCis+VCtVfjl8bGtLOSpFU1ctNCpwYkx5blNoTDQjKkFWajheVVc8YHBvUyMtbkN8eyRHNUNXbnAzPW1vVStiKEVpYD85ITZRbykqZSFLTW5jCis9ZDFFPzRyKnJtUklINTFDJT5lcnxrVDI/fGFMR1FGaVlLfXlETWhlP3E1OG0yQ31fQ18ob2V2fDYxYEZzQHstO3VDcWJDVDVyO2tzWi10CitfTWA5Xz1yckBVTnxTUD1BXyZfcWUmRkVQP2QhS1NZRDhacWkpX0RFcTRkKyRJTlowP0MyZ0VHT0BSTz8raWIqPShOPmVsdSNZN0pMODAxCit1aGJ3JWE+eHlrOTg2KklhJH44JEAyNGpYbXlHbi05QEh5YC1JMDVXZENoR285O2ROKjJ9IW9+eDI2LTR4SioyU2pvayhBJCZ7Y2BqbSgmCisoPXM3aTtwKDQjYUY2KXdLUU4hNzNlYUV5NVVtUDVxRVYpOW09SmNTcTl7JUthTWBQKzBuc0s1UUxLdD9SQDx2fDhSaSFuaiZZTntpaUFsCitrfklXTWRsb2xzJFJpOH45dGhqJEB1T196aDBBVHY4fDttRm9yN2FyMkZRKyk4THV1SkpRUH43Z2creSRINlZJeC10UUdfOEh6fmI/TjhSCis9KnEkb1VGOyk8KE1gMzRiWmBSO2U0K2dRQU5RcCt9N3tXZEZqTWB0P0Y8bFh6bWF5WGlqSlgySHtsTn1pPHw3JDtUR2VUUjU8V0stdGJaCitoUE1kTH1tSnJzXjNUSlYmOU9iIXRNOXA2YSU7ZGoxfDdWNUgxZ2JrRklVT2FsciZoMCpHWGl5enIwUVg9MXQwdVlXRSM1UHglX2hkeWxSCisrNChlTCYxUU1sYitLK3ZfdHRCV0doLVhAXzZISUBZdCVZSmo3dn5MYHVyPH5HKmFxJUZGUmUjMU0/R2FTV3I/ekx9UHEoYE95QFBUWFFtCitwYHxZNDlfNExaMVlHJXcjPFVHVF8tI2VEY1U7aDB5SzgpKW5II1ZJSytaMllVMl4tTGRtcHNlelU+V3VmcmNMZnFHZnIxaU4oSCRFO1l9Cit9KERjUkcoZCRRcXFGVSRFd0FkRE5EcDdfQF9XJk5XT05ueFhPaHxfVSNTUjhNLXF7P3xDRzspOUFwaHh5dDBeJDRmJTRxSXpwXmlIeWFPCitINW5EU0FIPVhpaCFya0t4NENJJFN6OVg1cTVpdnZ7a3psT2wlKCFvVnFuYjxGZTBBSUFKPyNfZkRgOWxLQF55U3NReE8wMjh3VEY5TEk+Citje0MoV31CXmZLYndPXjVjKzk1cyhuNCk5fk0rVXckWmM5aUc2PEFUUylKQzVBVkZLKEdFKSkxMk13LWUkPC1fOHsyWTIzJFZBeitwVz0hCittTSkoKFpPWlZuZ0JteyNBMkRDPVo2ZU5nKkhZSm9ufkJ+aytgU2khRTdiWEJReEVlXkFARW5VXl5tbEZIZmAzTmtyMHpfQlBHakZMPDtjCitiPH4mU0VpWXxPMCNGflU1TjZ+Z0M3RDRBakR6dDZlV2F2fWVHNVlxRV9rb0IldUtXSmxobG9tNWp8e3FOVFNfPXs7a25AXktmSWYlZDkwCit7TSFMe28wYVBPWUM+b15tdDtrfjNsLUhiUVYpaSVSKEdWZDRHVnxCbDI5I0Eyaml9NVBAVGhRMHNRbzkyN3lYezVHY1JCMklzXiFNdiR0CiskVjVSITAyJSt8Q0Q3dlhLaGFsR2xTZFooZVcheX4/fDhTfDBDYiV0QCpIPVY9X1VJVjE5Qjs8KXBIemlHcGE5Oz9IP15nP2J7aEhVUjExCit2TjF8R2F5QSsrTERtTC1JMW53ITlzbD9fVnNBVmVgbXhWTH45XllgO0E/Oy1QN2JaTWZldHg/Zj59Z3J2ZGs1KiVtTGB6TD11X1BvTH1+CitJUSVDa2BZdVlPNUNXJFZpb3RMTWckYklYTmZhUnxpb3FFS2hiYVV7MzdHen1XPCpufkxpI0cpaD16Y0FrMjkrU0UmP2NnNmF3aH0qY3ltCisyKnpYa2p3WXgzPk1neVhDS21ibGF7VjFWOC0xYXMjNUpuKUZUY1hTKlIwTl5oOG5pXyNCQHhHZENNdVolUDlvVGtTaz5GcHdJVzNXaDBBCis0YU9DKj92cGJ+XzkjRUYyeEFBJGxFd3BOajcySkRqfDs0TWk4KmF0N1dWRns9b1ZOMSojfDArbG5gYy19SlRnflZ3PzZhSih2Y01ZMjFLCit8bnVacCUqbHVsYSlZazNrfEomJHxacWpyTVA+UVBwV0JSSj1gdFRoJTBlR2w9Q2QyKl9sdDNkWV9XPmpESVRoSkJvcntLRldvN2VnPVUpCis8Qlp5STNUYlZIKlRlZndGbS01MnQ8bFlwIW1URGUxWmBya29KQm57ays4UXdfVWpVXlF4aExXIWF4czRnRCsyeyNaM0EpPEEhOHkxZj8pCitlQH0+ZSo0S0EzTyhwcnA3d3M7alZvMj81PHUqRWQjJTJqa0RzdGdhdmRhVjJ0c1MqRT0teUxQWV8wNilqTCZDNSFmdUMzbj43TmY5YmVkCitxKzg3KzVNb2BlP0BrJWpnWnJnI21aRHg1c0hGOT5IMXorQjFQYyp9V3YjSG5+dkwhcSZNQEJJLVRQR3F5WTxxZUxgMzlQLVFNZD8pR3NACitHIXcjKkw/RzhLQD1mKmw0fG5DSE9UKT1nWXU9TntTYU5fJkZ1K29fKz9qPnV0IUpldSh0aHVrMn0ranZfPyRHYyt0KTNYdUdoY1l4V0VVCiswMDdaPUpsNWBATk1Xam5tQy04aitvT2IpfWJ0KypfQVhadWt+clB2TVIhM3U0eWdrZFJ7a0RkVndsPWkleWhfOHReRSpCa1dLWkYlZSY9CitHKXFlaiQzbClreURaRjxtM1F+SDR2IVExVFVgbXN4REdvLVpaO0RpWklgclFsRmUlbWhpLXFOS3pYYVJvQzsyKnE/Jm8rUmVMIU1sblRyCit6MEcpbmstZVMzZGlmWG9MWjVkMnNrPn5PbFFnIWBkd09ycUBkRFZqelF5N3UzWEgpNTB7K0BpWXtuVCR1Qm0oOVhEPFVrWD9rVldDPk0qCis+R2F5V1okPkNiXilFRWheVFdmN1A/fEUoUlZxYVlJensjTCZzXzEkajslWWhOcWwzT1E8JTs9UnkyUUl3bHM5IXY7YVFIKygkJFg0Z3JwCitRejh5KmVpbXomST8/PSUlUmttKF49ZEVCQTRKN256OWkqN0h0cDVodEpYI0UtQyhRZWFORXMyWUx6Mz0mY2RvJCE3RGR+dGZvfmgoOVdgCitgI3ZxWXVOKFY9c0ZwXnYmKTJiUUVvPztSUiVsI2p6VXFITUpvMytfaHF8VlRveWFvJHNfR1NrXiNlYlFWMD42eHlfS3E8WUJYTFY4JG0rCismJHImKFg8eCN5b09qZ1pMZFAoP2w1aE5sfitrTUN0YlU0QD1ucjhlV0xTITF3aHxyVUg8ZG5gTENTbFByJio4TnhtMUVWZWticzhHQGwxCiswKT1ySHFpfXttWGJmZFlZPUtVa3olaVdzM04kR080MyZpcDd6dGtoazRpdzFnZHFYISNjU1VwTU9QazY0M0clQG4jfUBtQFFwQTNSXlY5Cit3anEjUHtQNjdHfW5TZHQ5K2tfcE9mbz17SDFKKClsR21STzFiJUc1Uz59Q01kV19mcERaNCFacmNWYm4wcmRNfHJkaWB5KkdXTTZIRjNWCittM0o0KFFBJHZSdzVXbmRvKzJjRVhlSWIjWXlGcDJ5VUgxOHtEZXcmTHNeMV8oQTltaVl1VTZGV3EpalB8d3tkSHhmYDBvTnVjOU9yTFB4CisyWGt6Rzx5fGxxakklTV55eihsUk5BP0lJZE5kKjgtTmBaOExWX19hYzZePnArSGUwdW10YVJoOCVHY0xSZ00mei1+aS0hdXYzd1p2VjRlCitjbDxVN1lKMDFmWChKTl5MS2N5OG0qLWxNTkEkTXMpQUM/MmF8e1VUVFVQTldoX0tyUGo4eXp2YEJoZVFqWV9Wck49cWNZTzJ1cGJeWUtWCistV0NrQHl1VWdaOXlASWw7a20wPW0leiU0dHRaOEZXPzRtNFVrXk9Xc2NyVWhgbG1KTS11ViRyND1sSiFFa2ktcWZeQFQjI0I5d18mXntjCit+ZD9MOFUtUCQjcmphLUpgQ35EQm0xa1NKeVpgPyktY2Z8NzhRU31qflNkZlQ5SUwyPzJDbEF7N1hwdy1ZNmMtcWA4cmhrPykhcXBpRk93CitVaXd5JXY/RFM8TWNlQ2tMUmBsaCY1b3NsX1VHI096WU5sb1ZWRTQ4bHVSMXl1Z20kPShMZTJra3tXU3FgaUNWTyp9OHUjcj9qZHpFS18wCit4Pz9JSFBZM1dXVTlzSm5eV0Rue1J0LVk7QyhOVzN6cDdDV2J3VlhtOzNjJnlrbmp6OTREdVohVlJ3QUpxQDE1N2R+Sko3RXVmbUdsZUtYCitCcD5qbDx4MCpUVW14VW5yPnU0akB+ITRifGBueFFDS28kMjZqKjE2OD4tYntgPH5mP2ZkaG9HLUhUTzV8RUc7WlBPIy1SYj1lUCFPOEJxCitnUVJ8P0VWKnk2Nig0dEswc01ZUWUwZSlNb1F6IWJWVFo9KSl3d3FPMCpzTT1pOGExPm9vMXl1P35UZUElRypUOFc0R19OPSlvbn1CIV4mCitmenJESC1sfUB9cGp2VX1pYjA4MDc3V0tPKjMhMkQtSiVZUHIlN1NHYldfTyFxRlhpc1Y5SUleTFVRPCpGSSRZfmhSZmZTNUArbWhWOClACitAUTFZREhmX3hiK2lrcT9VbDZyZ0t9cEgzVT9VWkUkTkNRb2RIPkJCe0k7cmFtdXdpcUJzeUhBRGJ2MlZHMXc7NHZzYXluR0dhKVZQbUBKCitAUF5CVTI1MlQpUXVVLU9jc3xQaEs0Y0N2K2JqRCtuMGxROVIxPDZlRW9ZUHUjTUB5PHRXQjkrJTNxJVY4Z2Z3U3k2TCRrfXRGPGdaZFZLCitqV0tSPUVZbEw3aGREXkhfYG5zenw4O1RJc1hLb0tSd0BQQipoMjwhKGtZdk5GMEhlTTNnfW8zZEpjNXJaNjAlWGtfXm57aVJyMl40M0YwCishNWtWOTE5TU9TZjdxKEh3em1GYjB3QyZ3azRza2lGJWJVZTc2czU+VFAwKEZicFotRW5oVFBKM0RBcEtQPkArPVYzTzY5MDExS1JTRy0hCitOcXJ9Zj5xNC1NU0IhMTc8eHBZOGFOQ0R7cWpMQV58R25hSUVJWkx7VnolM1h9dWxAPDMyTGdqY0dsOVZsQS1TczhQXiZtXzNmX0p9YUFYCisxR1VyT2w7dERFV1ZvMTV2OHkqKj5LWTR4S3pFUlhFI2U2TkIhYDY/YjN4V3w3TmtVbDJ1XyNzJVBldWckPmRFRnxhXm9sV2UxflQ3M3N6CitxfGtQY1pleURNZVFoZWF8QEd3UDJuPFk/fnJNKVMofmVla0YlPktJVlB9QGlRallMK30jTTF7WiZ7RVJPRk1JcU9idSF5I2BYWlFuLU0qCityIW9gY01aVm5aYHRVWkdBM2xYITVfVmdSVCQ9SGdqRGcza2F9JDJiWVlDaEFwQW9FWjVXIyhZYDhhV1FBUHlmYzg9bE5qP1BjKmFkMnpGCit5MCVNVl9tRyZidE43PHJQdjtCNjJjMUBQb155OUYpJHlRJSp+NUZ5KHExQjU9VlBMRXUzXylAKU40c01wT3NIc2ByRlg+XnU4KCUjVVpHCis3bn5tVz0me3R7V1EmalYrWGgyV0M7TXtEfnl8IXwqdEs2Q3FXNSMqS2pGJVFhTmordipnWlpIMiR+eGIhX1pgZWlRWS1kVT55VWAzSDQ5Citgd049NEtga2E5PHRaJkcod3Y3KipvPH0/c0I5R35YcnJaTTE8RTVhKDI1NjkoI0lLQyE1Vldnd29xKSpSIzVyY3tzPVcrWCEpJF98XmJDCitpZ0VQP2xeVihKSCM2OWVSUyhrNTs9MDwoK1JGZW5paG45WE1RVHBWOSg+IXhRXytBQFQ5IzF7QnYlUEtuI308R3MzV1VZNitWM29FVFpPCitSN08lWU8za3RXPG8xcnFjYnZfKm53S0szT2d7REdkfkxOeC1XP2A5UnFfNFM/SGhje0JeTj5TcXZOUl4zY2MzRz17RlBTdmx1ezs/OG9VCitvSEFUJSglYm1WPWNIbmZGMV4hZT8weXpLWipPTHxiU3J3dXdYWTUxR35pV1EyKWFWUHB3eXJ1OTVJUEZpRThEMTxqfnJhbzZAUzd3cmdHCit7OEpqZlBuITQwQV5GZ15AXkhSZSYwWV9aZkBXZUJQVHFMTmxuWjBvY2JIZlRRXkZBeGpSYDhsQkleMjtndm9YNH5lQ19tckVtaSRFP1ItCitoWW9gKl9uT3dzaVQrOChiSDNJKHJ7dXszSy1AV0d2YipuVzcjeTMxWj9NSmRIK0lqfTMmcFk3Yz44Mk9nPkNQcVlmX0s5dzdHVW1Ab3djCit9SDA2ZHlpc1p7WWIhMiUlQlFEbE9hb0EtZ0cyLUhQMnJVLWVEOFJrKmw4NDw7cTFIYFB3QXQmcUp+TVAqenc/ViEhUjhiczI+TlJIOXxHCitSbDYpb0UrfEQwfnskPTFPJC1RKXgoZGl7OW88KyZBPEQ3KHtGITE7UU1PcUAoK3h7Rz5qOT4wKnA5fTtze1JDNmJhKz5sM3IyLUwlP2g4CiteVXZqMjhaX3pZSCZ4Tkt2NW0hR0xMI0Y7SDVKQXs7V0pFdXE4TkBZRER4I0NRZzhEUkkyZVlZUD1LWE4yRmFqK1dWYS0pMyRpVlZBSz0tCisrQVJ6P21eKCQ9PGJsODhZRXVWb30/Nk1MJTFhbEhWYVV9I2pjIUM3fUpxUWxVI3Q4dntIYkg9fUpROUtZYUBrPjdDKHZVRiFMSkEhUkNBCitObldfLWN2PHk2P31ReXhkWjFqR3U9Tm5GM3BObSM3bkc0fVFscG83XmxvI1FWTCFySjJoV1FfXnAtVSZNViRaNHlVPU8yM1d0OzRefkxgCis7JEZ6NnxSej9MS2hzc2ptNz4mPypvaWFkWVMpTVNRS2tSYVc7LUhKTDlLR25eUS07QD9TaT5vKE41RVhqbShCREBSeHIlQ0pHPkdDfm1VCitgMH15ZG43KiswSUR+UTZiT2k8b01nMyZKWlQyOVFoeTdRJTt5b1JkKUQzdnpSay04KzFLaXtefHIle3M7bjc3RmckJkFTI0YhaTwybEIjCis9P0J7TTt3JElEQjZPVmR3bmM9YzEtWFVCR2FMNUtuOE9nKnEkKD1OSjxATTRfS3Z5YyEmU2ByUHx7TTFvaTJ0aTQhUllIPXRoU3szKlFGCis1ZFlwQnJpckp7fmhxSWZiQmhfb1BnPUNsWFI4eXU+VH4pPE5BSW1Ce2s9aSZ0Nk9QcmN6cTEhPCQ1SkMpQUJNPX02RytUTz1hUzU5RnNBCitQOVdHblZuKzZSKUNxTyk7TS05USF1PUU1V01neGBzY2wrN210RFkoN3RoPExFa3V7bkd8R1VlJWVEaUooeW17amZEU0lRe0hMemZzdGlPCittZD1ya2wtKXdqUGBMUTU5M3sxPz1yc0dJZnROVFgkMn1DbTUxPE5qRHVOOSo1SiVtZTFwSmVmcmskeSNVN3s9VVlNYUdiMnFpKnZDNz97Cit8aVBMTmM/Y2o9clFgUypWdEV6TWYrO0xIdSZXfXd1Vnl1JW1QeH04QUFMYXt8VXheek1BUD5PWSpAVkhgbmtzQVBid2UhIXdzdmB7YnAoCitqcGhDbiVZWU5vTXpPZjdqeHA5MlZvazt+UHpfLWFrKm9IamFBMDxkd1haNWEtQ2lYZiZVPlB6KiNwc0VuYzt8Ozg2NVBYOSF1RGpJOWtmCitoRGA7cldCJVZmfStvI3tydmIkNDtVUmtvJkIqOTk9YShjciNAMi1fVDkyfG1wczcpQjxeP0JVeWBlWnZeVWk7SkN1cGxXRzQteVJ2MTJOCitUN2JTc25nTl5fJGF6XmJWVypPfjgwQTc8KzloQzE9aEhDUkFEeTJmJlFeM2J4MWlxY0BBSVUzWmdBPSMze01AY15scytQfnV2PTZPJG5uCitvWkg0PWE0a2prbHYmbEhBZHBJTVZqRVRTUElZZHgyPmwyVVRpc1YqY2AoREJianA7I095NiY5cz40YD8pZStBM0xQRjkoSzw4c0xaJVJiCitoelo0O3NDTHQ/dmFHM1huR1Y+UT05VH53QCFhT1czLSliWGBHTH1YTDVqQTJFOzxiOSFRQmVfdTtZcHpXdWkhNlRgb0U9KHFndXlUZCslCis4LXQoPkxvRkV9TVBMfWlFSSUrfSRAZnJfV0pyUkJGPjE7OGglZiE/Zk88OXRmTmphVzdEUVBmamVyNEVBZ2dFPlB+bDdndTg8a3ZnMiUqCit7KnBgSUFKbyF5b2xVUGZiKigmK0w7R2pRQXRZdU9QMUdQK3lVZ2JIJVJwJkdROXI7PFM1bmVIREliY35FNUZNZXcrfjR2I1ZFfGhfTHFPCitxbE5ndFV7IXJOZkRGOUV3UFo8JUZsaUZWWn5BPWkjJTZvY3lSa3xASHxsRjxHVitpWllzN3d1Y0pYSzktJEheWWxjLUJkJHBjS1RTYjtnCitgdUNtO3dCd3l7M0olKk1NYEJCQ1U0eU1JeVdObDgmOT90TlF9RU9mPSg5PkJZSnEybT1Yfjwrel9waWkodUstdClDM0Mjem4tT3hiWGg9CitZRGxGU3pmUShmTnpOU0d+S3J1ITArXzBLVCpiPFdpPjxLVFQ1RFglM1dEU1YkazQyPkF8cSNOamlRUXVTfHFeTFhNeFBWcTlSbnt5TSViCitrRUcyPW98N1o1bjB7fE8lWDFiVV5XaH5nQCNmdHl4YDtCYkxLWXxOV2FYIUZCZVZ1flI8KiZ7RHlQUHxpfSlWOHpYKVlVe2I2ZXdnQEYzCitEKT5yY2RmN0p8QFBVM1l5Plg9dHN2TFVKRTM3WTI5JlM+eyMqMHZ8WmZVUn5mLWtgbCs2Wn1QSFBDQ2stbE1RekFfUUpmXmxweVcmQWRuCit4WVcrMilAKXB1bz8rMWZyOCV2UVp6YTk9TnxMQH04TmRYX2lzSGpfLU9WR3twcj5xQHJmcntDWGhGVUs+Sz56NDN4Q3E8Nj5ZPSMzUi1RCit1ZGluWHxxKHA4YU0hcFFIKCp4YnV3SShQSjsyaCRBRD1UZFJuVmhuLUl7VWZBR3BHVzJhZCM4SDZKcVJVPXhjZUo2TmhtdH5rd3V9I0VDCitfckkpSlR9a2opfGEpOVolI31AWSR2dzxBVCppMHU+alhrWU0zakAzSHErIWM/XkQjdjlfO3woNHVyJUNlZStnU0Yqby1hJkJHKCkkdmFyCitleElQe3ZNYzlFbno7QzhRRz5QJXU+RX1fSllTNEhPLSl8Z1QhSig4KilvLWw7RSlWZFJ6c2R9K3I2bDBhbCpBcCo1eDQ8S09DRGZhJSpvCit9V2M7R0QoMnY1dy13LTJ+SjNXZkEhVlFWVld+MnhJNHpaKGJ2RituTDZHemdvRjUtP09mfUttSlk8LWBFIXxuK3hVfHRhRihhPX4tNU5WCityeC01NndkX0dxZj9wNjNeMihVMUV9WjYqYEc5Qnx+VUdja1AtV013WXNYdE1PKWk1bzs8PzZjQzs+YXxEOGA/ZzhZKnVPK1ZzQ3A3LTVSCitmWURyMXFCYy1pNEYjMVVZaWwjUGVzQ0J+an1WczFJKmNFfis/MGM2USRCOHdaeypvKEdmdXtCKkpDX0tib1MrREVpfHdxNlF6T30jTGBuCithTU9SKlozaGBAK3tKI0slK1g4SD1XYipaeV51TWl9czJHPFVmSEF6O31NJV9YYEMyN2YkZ1JpVCpoSiQyMUU7YUV3N0hsJWh4IXFiWVJ4CishN055V2t1WEV5QnQ/XjdBYCFhZ0slaE5gZilSME1lYmdeRyQmemxSNXkpcWpYWnc7SDBSPjRnNzUqZz47Y045VFNAODtxZnl5KyNDUzZPCispbGRlNyFPUyVPdEEwbSkrRW9sKmZmbjxrUzVIST1wSDJNTm0lKnRTKSk9X3FKWjZHZHI2aUlge0VDK3tjQGUqRHFxc1NPMlcwTWkhUEBACitFUnIqIXFaU1BtcHQoYW5laUJ+JkI+YDZMZWlhIWByflM7aERWR2dAJVRHdjl8dms2ailwM2t2eXhpKylYZGlNfWQzPF9uTn47RFl9UFQ9Cis7QU9fSGUtUjdGNlBudTxMdlZpd34/Z289b1g5emhRLVdkMjhFMkUyLXJJTSVQOGNiYylwbyklOzxiQXdCLW94QkYta0xUQDBOe0JzY2ZPCishJDVwaVkxdlJNVTtlZlEwZzxYejYweX01I0U2bntqcCM3VzRqTGUrXi11UDRBRzZ8Z3ZwKih5VTJ4OUVHJWg0IWFHWmApdVo7SStZJjspCitoWSNNKTkmTXhQeX42LWl5X089RW1tLXxHPzV5bWJII1JwTl5GcU1Xc1hnNn5vRW0kcyVzd31WZil8cmAlazlxNjwrVWw+RGt6Qn5xRVMkCis7T0t1ckZvfH5TPmt+X2cyOTZzIUxySXhUbUQtWEpKPVdtU24kX3ZFcWJPZG8ze01FVCpsSnchRWByK20qTG03S2ZeN31wUUBSKF5tNmdRCistWmVAcShaJmxyTXQ/WD1AZHtNO1hPX0l3YDZ3dipmPiVDOHg3KXQpaW1SZEApNmd7V3V1Z2QmS0djYWhLSTxjIWZ0SDgoYFVAOHdzRGtJCit7WDFNVkZMU0lMeVhuWU9ITzBSYXNybDNNNDg7I2V1PyRPSnxQWD19bDxHLU43fT1OSzZpeyheNipBakRiM1ReeV9lMEYlKCgpWTFRITBCCit9UkdvUTZVdE1ZbFY9TFdiUGk/JE92MmBsbDR9JURybVclLT5ULWpIditIMVQ5Rn1EbFJFfDRuIyp9N2tpdjFTIT5OV0NlPWtqUj5FSFktCit6aj0zRnR2VF5jXyQtQG13UVQhTV55ciY4bFcmYWlqKExRaE4kQnU7Qy16WTI1IUtueGhmdWNxTmNjWTY8YjdyNTZvbnZjZUQ3dEx4QUctCitYc2pfS3ZEKnFPNkw0V0VUWUtQI2BoY2ltITY3a1pQNTQlSko4eTYqeztDQHdgQmd5N2RXSFFWbHJSdEc3Um5TcWZSNkcmZWB8QHF4KlR6CismSFdGJGNlWWFTUWEzK2MqIzQqNTNJOSkpcXdaVykoeEpsUldreH5RSyNjU3NMZ3NLRFZGUT1RdHZ5RUg1Z1lPUzZhYyVUJGheXmR0fV9lCitOZl91SkZvN1M5SzZYcjV7YlQmOU02K3lnSiRAS2k7NkxfemJ6NS16Z2Qqb3BZdzY2TGQ/YSMkMGFpYDRwVlpfJWFRc1lUfHIoJDVCKGM5Cis7YDw3ayZZQGFxYW0xYDE+R085JmRrR1BQWDEkKjt0UEpjKmJSRGx4ckxAVXV1MmJ0RWNWRyomQWJTY3JgJDRBaWhMNVB8MikkJFZQcSk4CitPdHxpLSZvLTYmcng5bSZkRWw8Y1k+JX5DVylnbjtHTWhXdWwjanBPSWR1TlZ8NnlzNGJ5XkAldGtiSCR4N1ZAKWNuSWM7c18tfHRkXkt0CitSbjtyaCstfEtNeCRBODVDXz5hZHd7JHFqTXwwVnVrZT93dUlgMGRqZnhVJGE2LX5SRGAwcHMpa2BSYEAoK245b0ZaP0FYJTxOcUdoWWhDCit7MS1ePSYyKShoKFgje1MjP3s2QnhwRiNrV1pzQmh2bXI7b0ZKSEZAPmg7b2dwQWxIVDkpVGpaQmgpa19NdldSWEFfbExvbWIhMU4zPjFWCitOcDEpeE00PksocnhOeVUrMEp2fj52cXolVnVUSjR9UEA1bD5iXyZOWj0mUVA0OSkydjd8TGJsVksleilKKj5VfD9LM2BJJlNManNxKHlwCitxSVYrZWorT29EUEhUZUd6XlNJbShVPUshRTJOVEF3eGBxSlIxUnRIUnpRdElXbzBzPWA4cy1MNChoTnQjajU5MFZ1VExGTXxiUDE1JmhNCit8STRaQnt2fmI9MGUpK31PJXYpR2B4clZee3Bxd28/KmZvZ3Z+JXl2bFhIeGtgbzE5VWhkaithdXNKMzR5Qj01I3BITng2cVIlM1k/UG95CitTUGJna35lMnpFLVJ6MDBBO3NJbjZZbl53UmNFPU47QTY9QyorK2NGd3RUNDREYjhVbVUke3tmRFgpYyZQNWxgRGpFWmNQZmo7bWQ/T0ZHCis0e3JgM2klX09qNH1eSkVFQWp6RV59e20mTT9yPWdeQWhpRz9RbVF7ZmtBe2x3VyozTytubzgkQ3ttK0ZecUdnYD58cSV+JFokeS0kN3VyCitEeCpgZmExMz8zVngyKThSZU41cnAjKEQrOWlYSnNkYTg1UEZZeUwjY0l5dFM9Tz89K1h1TyZWeD02K2dZQGVoXkg9SG1qN04pe1gzcUwhCitQYl4tOTlMVWBIUXRkMF9SS2p8JnombXE+MFk/Z2hqZm8pN1o9VERmcXBsbE5SRHVvUk5hLTl1bnQ2RCVlNFRXQDZjMXtSPUBWPW5kdV42CistKU03dT1zaUZGRUtrJUVKJHVBKjtwe0JAX1NiMUckRWNrbWlVYWdLPEhONmxxUiVuV1RxX2RON3lgO1lHYn5YbCRqPWxiKmh4fE4+Un1ECitiJkZ0aGMlR0dIQkhUN0FEeDVKWDAtT2x6ajVJY1h+KXBUS2FhT0ZLOEI0N2ZDWGF5QiU+MUtDPlR7MWtMdm8xKWkhZX5pU0k+OE5HTShtCitYaCtQTVJVTzRXbFRKI2B4eTUwQ0x2eTBsQSU8MWoqbmZAcl5eTTZ4LTBxJlR2TjJqZXtBbmNNUXo/Snwmc3MkREdTS3VgRGxCd1B0ekBOCit2Oz9kU2NkWkhyPH1NcDVVUzN1QVMpX0loN297QkxeYCZUIyYyMDlycWgtPTFFUlU/OGxDZl9UMzVmIVlFVH1oRXV6OFBIWCQxa308e1QyCismNHs5THMkaH1xRXI/Y1B1em88YFNJeEUxM3BRWUxeM1dLWUNrcztvfXVvO0tBdy1kaXFCSkBYd1Ijc2NfI3ZhQX47RT41OXw1b2xJTEgoCitQQDRJOXYodHFiKldhMiUkYT9tIStHP1dmQEIpZlIrbU18ZGBiRHJJITs0eG87Ti0pKmtKUHJ2O25SZWt0NVpVdzBpVW9JMXl2V20jcXRnCituSFhBcChWQHRGYmdoRHYwd2xvXn5FOD5+Y2RDOXowdVEmYVRMT0ZyVUo7ZlZzVWtTX0VBNEk4dUdWIyM3O15wPVc5QFBkcCk8X1l5Yl5nCiszXj07bjEydnkwM2hUZzwpJS1BPi0xbzdPZ3xpUThTNCh8ZzIkQWZ5QE1VfFcqd2l7Xj8+IWpMbUQ8NWR5JiEock4wVHxNNn1fYWVYNCZuCitLc35KKl88P3k0c2hXVyhaRVRWMmg/Q0VFTVlnbWVNakNlJnhae0c/fiFGcnN3VUhzQCFtfnckRn0zRklQZ24hUEllNjZuTTxQK1JVfl5zCit1Jk1qbyVTXnd2VVcjN1A0QjZQbEcmVzhgQDR6QnxOVmklZStCZ1oyN3BgKG1sSE5DcDhyP0gybWVpTGA8S0U1XnB7fSo3P0w0WXJWa0VeCisoQ0JLbyY4I0JUM2x0TThfRUk0amtQZ3dgVmZic2AkeUZPPUlsJlNtMDVPKllSMkltVWNvYjVBMCttTDwpez88TntoM0BMZUEhTHwxSW5MCis/dWkmZGlgQzJUZVFxY0I9UURGQj9RTEQyZzE2c3BOKUIodUlBdmhmd2dMKG5FNX1sfkU7a0BqVjVudX5LZmtyZk5AeUl+K29zNT5+PChECis7dTFFfCFfX0FrU1BAJCZ5aG07aHcqe3VDeTcjMnZXKThaSkN9QDliU2N2UjM/c3sqfTwrYjdUTzA4NSklQThpZCM9MEJFVUsxUnpScmRZCit7JWcwaXJQbSRqMFhEZ2g2amo8cjkkYU1uNShKckl4UVEqakx2SmBhMml3dExweypvZVRFV15AOUcrMV5lb0hLfGl9LWVedTI1VnZsQGhVCitNWm5FbmExPk4wXllkRHA0PWEjY0NLR2wjbVNobHpzbzE1OCppITMzbns4RCFBQ0UzYUc2b0pZbm5rU3FTV31LUGYpV0lQRiV2MmNhSnx6CitfST80UiRxdGpNZjh2OGJeWUtZYDVCSlJ1SWEmX2ZzRzlRSmAxTSYjM2RxOCklcH1Scj4zcUZuMjY1WXY4LSNVKSplWUlRSW18QV95dGVsCit6ODxQWVVKaGJqc1NoPX5OJXgydX5CQTlKZD1zMlNKQG9wIWpFNGYtc04zbE1PdTcre3FhfXpLO2ZkKSNTOUVlKiM9a3ZCaCZkfikrYXBYCispOF9GMzhEaG4pfHBhYCRNU0BnWWhYciV9Wl8hRVFGNVUmKk9IXzt0MWZYbyhkUikyK2tsOFRHZyhRX0oxK0RLK00hbDh7TTVJX1Q5K0VQCitxaFk/VGViKUJPVHMzaHZeI2pAUypCKmR+d3w4KiZtS2AmTChCPHhlUG5NMi09M0U4O08/b19PM2NOV2VHZUYtfD9pNmhRTGgkYCFpUWVQCis/JihlcSVfTkZVZihrbkd4Tj9iX21XUihGV3J4Kih2MUQ+d2VQTHlmKT9KS0RkVGo1THwlV34/JHlOSGBUKTY5Tjg/O3x0ZDZTWk5+UkslCit2P2VScHVhc05OMVdiO2oqVmRYKngqcVBeKzFBIUY1ckA8bzhAc1MySEAtdj5lSFh9eTJ+Vzk5OS0yRHZObFh1UXtHQG1OVzc0Q3oxJXZ5Cit+ZCNSZGpYbH1VY0omfDVlS0I0dWxLbkFmPkheb2syQj9fZmd0TUtWUT9JTlU2TSMwQVAqMlM7cUQzJVE0UVB4Xml3QD4/Z0wzZEt5JWdgCitXKz5TZjxDdWJgTThERW9TM3RZKz0kMTlQbWZsMFdZQy02UC1NYlcrU3opO3ZHT2FBIzA9ITVqbD5kSkozTGhHeSl7V1dnbm48Nk0kR2xDCitISjd4eVpAJHh4SERObENpRXNNViMpQGxAcGJ9c2pDOSZgTT5SMlVAXnUxX1Bfbk1McUdJVCk/Y3VAdWs9Jj8hWkZ8SnIySnxCP3tGRXo4Cis1REclTnJaKztoQ3h2Sk9FRnAkMmtAM0tFOUBibElLTCMoUy0xK3V1OGdRR2AjcXlVcm9TWWA0RUEqK25nKkZQTWd0eGJhQlk2O1dKbTctCiswSlR6JWFSUCheKnhEanNSXy14TWZrQiREcCZFP01DVilBZEc2MTAkKDFrO2d2dHVkWDYpKT5hU0JeQUhmWWt6JSRxPXhuKC01PSpmUno9CisheEB6SHxoWDd0OXoqSGslaDEoViZYTVUtWkNKbXF3T0AzPWN0RX1GJHZVb3VKWUJQTm17dXw9eVRXJCVoI3FgUWxld2N4SVF4LXUkOVVhCitlKXJ9IXpxJnBmUS1FJHtqIXoje15STj19WkApZmI5V195cmhWJHsqdmFmYFMtQXt4U3B1ZEFHQ3BlJXBuVWVyIU1wdyh2ZGdgQ1hQfFo5CitlPXolKVFyPXF1U2FuYytYUjtkITJLSEgjPyMpQEoxTm4xJFRHfTBZVk5DUHYxPGtHQXBaQSl+Wl9uP3ZDej0lMVJ9fCUhJHcoPDgkTHZNCitNKks3WitXMz5zI29rbXBOSHo4JS1TSHhjRy10MlgwTGJjbDdFc2VmIT8pQ1pYNTRlVWhaZSVzNkRSJWA7Zzh5Yj8mdzdidnghcVAyPEphCittNXpnZ3cqfSYkOEhqeSlgUFQ9IXI2RyNjP1VBRS1PfXUhYGd8NVgtYk9+OSRjSVpzKmFsNzc4UG9fQ053bjZzTiN+Pj8oUiUtK1hXYGF2CitVcWdQQEJyUmtNWjZvUmpMN0QwV31KbnBYfGlsfSNiI0poWmErPWZYVXZoR3lzazdgMzREPWErcXVUOT5jJmV8P2A5WEE8N3JVdCNFaG5hCitQKFpGdHt1NTQqMzE5N1dwREB0IStBeXJiS2IpKWhgfGFWTEA4bF90QTZCZTZSQklrfkNSc3xYYj5PREIoS3ghY1NJUipCcDZqNVdUUj5XCit8Jl87ZlI5dFlPVihRUDtjZH5laCR+UDtqYjV+JnVQaU88LXpwUWE+IV99aGh8fHFEQlkhbjdnSTtDLSVZX3orcWhvVzlnMVoqT3JZJDdECitSQnBmSiRiTURFQTxvUkFfbTJRPEx+KGNHSzlrM0o+NWJRJXRBVVlYQVBkbllqKEJzQW1gZDtiTDFGTHpJUjYoOVk9JTVNIWdvNSE/V259CitUQ0s0UWpKX2JfSzFVTEJHYW9lM2NEY3RLaDdIcnFjJUsqZnJibzV0X1ZWSDBTQ29BXm4hYSVuKnBYSmw8MGk8azw3cHQ3N2JNQU50MW87CisoPXVWYilJYFRBfD5DdVVgPEdHUEgqUndGUUhlUiZwcHNFJjlpK3ghNEJEKzxJdGFefkAjbl8qcUw/KVFKcGxLe1R6PXZkVnNGJXkkdTZACit7YFRqRi1XbEV+WGNgVFQwbVhfVkRgbiM3NSFySX5VSEVRQCVaQ2orV2YxfWppTFE2M3dWSzM5Y3M+I2FhV0JpeGN0QD5Sb3BWPUczNGVzCitgdkpgUVlOKWQ+MjE1Kj4wZllgXz1uR3lUdHlwR055MjBHZjtETjh2ajd6Uj1IO2pJVzk9eSozbE9Kdz15UU1eSD0qcVV9dlpMKStqPXQkCitHeWk9VC1CYE5ENHtLYCY4aFg4eT5uRnNkUFhkS0FtZHBsYHNpMnk+NnE0SkdCWU8hWEw7dCYmK1A1e0taRWM4VE84JTw/d1lJR0V4KHZICitJTntLQUxiMkdmWT5CKU1uN3wjWXR4TEBURSowPm0lKT9+WlRnUnsqcmRKX1UwX3J8YV4yaWUjdEV1S313amUpUklIZSN4YWxoWmxKa3k3CisxI0tmdzIhKk5SX1BDS1JVdSFeZDdhZzxnQ3FnU15Sdz4oRk5JLVRjSlhlMD4lUyV8UzZVIz1INGtOKjZlcjded1p0aEsqT1dRJGApUFAzCis2IThzfiFhUGIjYzw4cCNKcVNNb2wzXiQ7RHNeRXtNfVM0ekJ9NiEoPW04d1k8KGdhSjVGc2tJTG1iOyV2PWMoUzl5IThJK21MciU4eGxZCitIdnNMKFFqaF5XM30hTlokS2J6aHNHe1JzXll4cntpbDdiRDFOd2wtKzV9d21kdmtWdXBpLWQ8XkNOSDVPQUE9ZFo+bUZXU18lbXUmKTMpCitOYjVzOHp0cWBUWU8tSCNoNkdtZ0JjOWh2PXd+WCpSUT5oaSZDdmY7WUJqeDRLN0xjeWNKVkppbWRaKG5aaHdZMzlyfWs/ZDRIaSVMRCYlCit0N1AodXg7XmghVzBXQjcoWSE5NykwMFAlQVRTMjJlTFN2QFVHaFI8UTlZaD0zfVZwaFZzVlZSV2wpRGFVfDs5RVVoWmMwPGVKT1U/XlZxCitxQCVsciZsXmYrP0owKDBldShkeiQ/ejsoKD1TYnsoTllCWnBGZiRvI3VaMjRrbX5+PTN3TmUmQmVrdmxBeU99PCRGQU1LK3BZYX45KERmCitZJkFLQ0k8YmNXOEFvfF9TaDRVeX1mLVI+ZV5CakxWe3FQO3F9PXxWckJCNXBiPHtFfkAxZ0coVylVK2R2eTRZdlVxKmJVMkRHbHk9RGp8CitYSURHPFBwcnsxdjlsMCtyNnopcSZ+cmA1ZTtpMnVtZm1zUjxIfk9ZTUleKlc2UHg2dHttJSpuVzReLXpuUlZNfD51MjFPPnd3amxsJGxBCitRWnRjMW8+clJkO3g+e0V8QzdmZk9fayExVFRPdFRAREp3Mm9tKTExUXBtY3NBZmpLPTQ/IzVZUndYV2o0ZWtMMTwoITJRYyZhISlKaDcjCispKSkrZ2NNPU11Qjtxak9oRFopbClXN0N6JVEwakkhYTIjPk8+TG9WQWI3KW8lblEpZ1V+TnZpa1RId2A+SDBYaVIrR1ZpIWh2LTlhOytkCitRZmt5XmoxNCVePTJDPmtgZztPczRFJm59ZDgkaWtpOE5QRWkpdGQlaU1fZnZXP19WYXZKRChLJEEmP0FqIV98LUZSbm03KDJISjJycFNtCitIbGxNI0pwUTRtT3dOUl96QlBNP180TjNqP0NyYlJjYXUtVUF8VU8jVWVBP0skQzB7P2IyJjx+e1V0SV88MXc/VXNaPWNjYF5sI0djUldyCitufVhUNDtUWHAwKSpUWmdNTTJkJVkldVNxWXxSeVRnVG0jQm1jZzIxdUlXQD97VmcoVTk9bEBodDJuZnoqeyZWNGYhOyhWS3YtOUk+QX1WCisjflVeR1JQOy1FczV5eEJwO2piQnZSPU9pYWczck97THZ6YCt7OyV4Vnk0UU5YcVZPJVBwJU9EZTt4UkFzJU5QS1dge1peUmV3PiRRIWtQCitmKnFSbFBLNStAREh9OWBvPHVnSGNwPUIlZFFCbCFHeDRSbUtWNj4wQXlHMGNaZyRFWGNUYyFKUzUkPE5hN0VybXJtTHErZmtAV2RRUnJuCitsRzlMUkZUMGM4SHg+IUc8WFRScVEpUEVaQyNiOUZMKiVhdyhqYFRhNE5JUG51eXhkSjc5Z0Z3QDZgQ1JIe2ZrZSVxQE0pb3RsKXtqeml6CitOO194TEx+P0NxM09OUktidWxzSTE1TTB+bk9ALVd4Mk9yRygoWUhwIzdSczsqS3UybkBKVGRGcCQhYStFNFB2Smgzbl9kZmcqMUt3flFpCisqOFIhTDhIWWZ7c1d9Y3RsOUNkPX5qcGdOekdULUhBUUJ5RzBSQ0FlLTluVVpVNzxIK2RsSVF8biQ5RHlMbXZSNHZTe2FHTW00blAkSX4jCisrYXdvUDNrQys7JkZHIXk3VlI8eGB+fDcpbSgzaWBUVD90Vk58d3tCR1F3LUExPDk7JUJpZ0FGRDd6ZV91aDFxPFVVPjVFMX13eW9fN3ZBCitheVlGamVWYilQVzF6Yk89MWdqdG8wOExBKHN7aDl3YXE/ZTZuP2VAWDJgVzZTN2F1fEghJnE0OzxVd1FPd09EWkJfPUwzRSMpalllbXpWCitRY0hre2l2RTFFYStRYSkkKyskaE5zUVEzaWt0Ni1WK2FOJlB7dXx4fk51KiRvZ35MN1NLREZxRilUTUFYX0JEQklzPXg4SnVsOXhCY200Cis8N0NqMWpgZ1dra3t8TDQzN1Z3SnNJNj5KQmU7NjFNU0Jpe0YxaUxtenIha25Ve202UEB5MzV1ZzM0SndqbiQoM2EkeCY+VVEkflNwJWszCitBRz5OX0tXYzxtejRXZng5LTVNbnd3N05hd0pOJWk5Q2I/eEhOYlpkUSM0MztURmd2O0QqXncrV0FlVyp1KkwyQWNSPWo3LWRuOFZLaiZZCitUVyVHXjNpblZAQUI/O1hmanR9d21OblFtJUU0JVhMVT8qTm9jV0oqfGZASUpkbUxjcCpzdmBafTktNUxUKWVRWlN2NUUpbT07WiplbUQ1CitkNDY4PiV4S1ItKThlSk88KS1iXj82TkNBNGFpRjtfU1lDdj99aGt1cDV8Z3ZZJF45cCYxZ3Q1cChzKWVULT0rVVE9OTl0TCpQM3A0TypJCis8NE05MHdCTz95JFFBen4pTF8+K3dFS2VZX1h+dTluNzNaQGJQKEk+NkpTc29lVkkydV52Z2NTNTtmJWQwJVhuenQmPTVnVjx0I04xSmFeCitFO1Znd0BiKXhHV3VoN3lrVyo+MyUyRXt1djkwdWptaVRSPE8oVVZkRkVpLU1ieykraFVlYzA5fDhMUkU5PDwrY09tP0Jsd3Y/IXRDdzFfCis5bn0tMjN3eFBNUCVEP0BWPTtKait4Y054azhwNXYoUmRVZjJpY0labzFzQmdhMHsjNFRoUXtYdHw9I15BUn5VJlAkU3lncz84Tkc/MDROCityODdqWk9OeDs1dTt9OWpRIU9sO3tHUHRrYDxHO0J4PDQhYll6YiRlN0RndSR1e0V0clEpV2A1O282VjJoLXhOQ1ljUClEU0h+NHd8UztRCitDRHdHanAtT1lrUWNnWi1zczRmPHZmO3kzYmRCK3N6K317d1ZAXnFPcjB4V0pyRlE0fSMpbTkxLX1AOEY2VkVeOVpFfHNXT09eZW9KTiN3CitLKl5nYTgpQSpsPSs8JFNKY1ZfcGVyfSNsNzBIcWlqTU07N3s3OXohdjc+NDIpZzMmT0VWPGJaKCViVXladWdLclJra0ZNcHk9bFMwSDFNCit8cFFubHUrPG5UOH14TklyTnxEPDB4SG8oP1dOKDJGa3c4K31ZSGxeMnc/PGswazY+OStgMHN8KE5sWW8qaj5sR0ZqJG94dWdYTCZtKCk/CistTkUzcTtWaEk1UHpWbCpDc19Jc195RSgtfG5RVHQ+YlN6R2IoUDIwRDhNMUlEcFhRSmAzbTAmMGpiVV9nMVhEKVliI3ReOTJZUDY9WGI/CitNSDBRbVVrfkM4SWI7UV52TVcpNGRgJGFGSkleRE1xbE9Zez9Qcl5MNClERlg1KDhrX3NRVHRzTWlKaHl1O18oI05SYVRgO2dkeWo1Xzs0CitXNT12UCplaU0mdnJte19sTmVJPF9ncX5rOGxgVyFKZGlqZE4qcHJwI1Z0VCU9THVCcF56bUomO1EwQXtkbHx0YUkldmR1NkQ7VWdFZk4xCitUQj9TVUdEWntNX2l0V31mNntOZEc9REREY3kjSztWPTM9WD10Yl98V3lMT2BPKyVeb2xqZjJoSGlzS1ZvN3x5dDNBVH5eUSlHOyh1UVhECislU0pzeEF5dysxc2p2RnRRNl4pdS1zOXhZJkAtYW5BRUQ2ZGIrND4+MUU3PmdfSlFPIWNKOGYyMT5zdU5YXnhOXylrdyRGNH5wfTdgTT9UCitrdm1KPkg4WSFYMmUlUk97ZXlRZzJnWlVqPjkzcikoNXFoJDxMNEU0VWtidCZwc0o5JEdaNVVlaVB6bUA0NUdFT2tiYD9MeSZYXzhFdUtJCitDNmUkSFpoJClhXnlfYTFRdFNQRjd5WGNnKylVb0htVFV7SjFSVk4ya0N5QGdmT1dXP1olQ1U0bSo7T3tDS29tOFgyaHM3dS0+QmRXX2ZACitEJTRzYHdDUHtzVkBgKGd2QU0mOFpGM3pybmVRbm51c1locEZTTz1aezk3T1RVa0xVQ1Z4eWJPKC0zRkRZMEt9O1IhWklCYVlOJXlHWUl0CitgOyEwOUttYWpRfiUrOCpQVigwMjY4PCNwPT40UnV1dlo3cTkzI0BjS0NYNi0kayRrYUZIR1g/YHFPKCZJSk1XSSlxPSZFak1+cWdgOz40CitjKSQpbC14USgwWFJCVk98OGw0IW8rbTA1YWlBdlh9N1Foc29kQmgkTlgmWVNEPT1JPnItZDBUQ0gkdXZWX0tLV2hQIXFqZUJPY0NBfEYhCitXdnlaTWNoYkRoYnF2KyhEUCEwNiYjZV5zMX00JjYtISYpdXYwbjIwN3RvQHIyUmlTdGhHa051PWc3Sis+e0pNWGMqOyVffkZ0KnIlbCRACit8UT1mciNzaU93UT0rMEMlY1hNWXlXVTRrTXFAfFE9LVd8OX1DeH5fY2dOSG1lKkh6bCMkIVgqKFE7Pm49VUBZZEwmRFd5UTtEQ0JGISt2CitCXnt8dz9rPWhDaXxgcCVyQiZfS0JhKUU4YE9vN0BrN0ZgRWlWdSthRUBrdWYje1hKajJeNWF9MnRPWjU5S3ZaaGZoSWNKWkBIJUFVcTJsCis5enlGZGh4NCk3JXUkcWhmdWpqcV4+KFZ1XnA4KWchIShxR3c/JDw7MzQ2aF9acGJXQ1dEMSpXbl8jc0ZWMT00bUhNTjxAbEdDMGhAVSY4CitCeFArNzg4V3YoNkl2alBPNChnS0pGMEhGWntNNlFyRU5oR0hpbkVUcWRmfjw5cnQ1KmRwZkNuUjZePFpmbnBkM3p2dW99YXh5JXNhenQwCis2UHM7czlPZWUtI2ctYjEocTMxcDYmMHBDTX1wQVErVT5BVVZLUmowQTJNVz52fmRRRSowUGpoUWlQU0ReKCkkcktFSnhvVX44YVdXaTQ+CitnYVQ+IX0rWldrRWpCODladyhkWUtsfTR5bzcpJUNYTH5AbWRWXzI9YFllKnB6QllmMUFtalRRSmhQMyRsPSU+LXtKTFFAWD5vK05lTys/Cis2YUJtNXspLWNuTCk/UiZDfX1PP2hWWElWdSM9NCo8VlFmdSMlalVjVn4jbkV7dFhAMXoqQF9eUlFVc3dOemkjWEtiVmF3R3RZJkBlPztoCitASEFMNkY1QXpkemV2KWVhQnJ1RXBDQD5xMWtVNUs9YlAjfVhgdFItdV56JSpteEF6NDRgS0o4YWRqa0RAUX51PGhlOWxVTmVqe0lkenc4CitDN2t+K1VMaXR8ak0kTTlmaXFVYWxmSjNXKVZiY2FJdGN5V1U+d3FAX0xvTX43fGtHM0JCdXd0YiomdSUtIyt+S2J7TClseFFBLXEjXmNmCitvS3AqUk81dWx4YGpnZ2dMVWcpQjViRnYzNjBST2ZFLTVRbEJkUDUlYFhFJnBDb3RwNiZLWW1XYWlfSSVJIVk3LWNERWl2Z0NFbS1ZO2lKCiswOzNPLUBHNmFNY3Jtc1pDVWRmSmFkZT8oU0M1KFpeWT9FeD5WMHUkSjNGKVohYV5xTXQ/ZGg0e1UhI1A5KUA+eDRWU1JLelluPWRpYkZDCiswLVlWeVl8Nk5mb09SfEVZZ3VEbnJCUW9zZUdJPHdyRTdHdFNUPDx5ejhHQUMlJlVXOyUyVi0wRlc5JHVwT2ttUGIpJGskTGJpYX0yZjMtCitiVzdjaD02ND87bD4hOVJleypqZVpiMWR9QnRkaFN+Xz14aDRESiV7WiFpUE97cWJhPUA7T1R0cXVhQ2kkTmhEVyY7biN8XmdgPT04V2pUCisqdzk/N3V1QXQ1QkJwKmRYNmpCY14+X0pOK2xRMyo8MnNlQU15JlVhcilGUmBLO3tqUXN5PkpURUEjZllFdiMkSGE4R3dscFQ4Z2BTSmdPCitpPmVAdFE7JkI/VHd0UH5ab1pQfkYyVHZ5alpXP1UzMlRAdTg0amJ8Uks+Qm4kMTklXjNCPjktd0tUZz1GU00rMGR5T0hrWjxnNHozPT5CCismUHpzNnAhVERTMHolSVgzU281a3Y8LXVnSElAR0t8WGJhUW9BaCpaTGJxczZ5YVR6WHtNZVlNMUMxV2xRTkY3Pk5SRjErQGNwQktafFotCitqNG93byVXV1NUYW9KVz44TnRJJHcxc3BmXiYoPTV2MXJyY0hkKk9zMT1JVUxuVz5wRXd0SkxFckFedDN4NV9WaFo1RSNXI057VD1XUl5SCitleGpqY2diJndkenp0TUNMN0hDfDw0e3YlcyprQWkreTRkWiV3UmB7ZlVveD92YH1eVkZAJWBoM1peb30jSmpUb0l7MmtWUklec3xII3M4CituamBBJElvbj0kXzIxO0FqOEI1QG9jRFQxVjdmQFVaZkElUEFyekhGZEsxVihWOyVlMCo9MXYjazJEJFdQYDQ7OD48Mk8xNTwrQn1lMjxyCitweCkwTHEyMFdNNWI5dTJyIT5nb3A8RHZgaCp6WShhVyMzQ2R1UTA7bVFPQnBeUm40JkdnXmdYMTh2eEE+SjxBZGBVTzdxZyEjUjwrIWZCCishVHtsRnlKNVArQiV3OUg0WWJNUklJfGc8UW81PjhRe0BhYzNaZXR4JDVqRVl5Sis8bzReNihURjZUTmR6dTErTExCUCgtM3dzZW9iRDdlCityMmcyY0wyYl9SbyUmakpjY0NlLWBVXjxAc0E2M3B4cnYodjxKUzFmSjc5aUZvWTVoMWliR0omQGh3OTBaZmpmZCFORjJZeUJYZVB3QWdSCit6ZzByfSRhanZ5REN2SDZzZE9QcU4yfDl0T08qfntMP3dCOCglV3tJZzAwUXchRmZWOTNyMHFsKXpDWVVVMkwzI1MoNUlgZmEhdUtib21HCitpTHFJVCt8KldhIUZwTilSIy1SZ2hLSWBUaHA4VyNWVilCSD9uITJTRVhUO2FkQ2YjQ2lAfElIMmptT1MtOHprIzFWaDV5K04xb3NkNmQ7Cit8WnkqJjt0XiVPa3J4VG85O2hTPnlXNWJxbDdsUVhnckBjflFIS3UtVng8NXNhcmdSe2NRUjk7UkRYT3tWfXBrXkpAQXBMY1Y7SnJPfSNPCit3YT48JmY1I0s7Z0lyOSFUVTZCKWdhMjROPVVwMjh8ckZBUmRwWk85dG41NUZtTlU5PkVHKDxTKDRsRWMrUylyYWBVNFFFdEpEJGM2KENjCis5NTB1KDxTOzFOS0FBQzJnSGh+fXlHWklhSCMqMmtkMVE4S0x0cDlhKy00Q2ArQV9waDh+YSg8RU1kYXIhfEFyez9GUjJIc3ljMSUqbDlCCitfdEs5cnoyOX4pbzJ5KnN9U2FCeHloMXFBPmx8OXQpSHFlZGwtM2l8WW9ZPFl+JntSJnMpS3tRYEYkTGVzXkh5cFMtMEVgQXYxelckSGlwCitrRFJJP3xUYDYoRT84RypOdXNUU2VzTnE4amgyT3JIQVErMkVvYFhBTGgtb3IpRWQlUCZNQlh1YE1Ba1ItPj9OTis4dURrP2o3MHo2Mk5aCitBLVRrcHw/QFYkPmdFdn1wfX51PzEjVWZ3Oz1RMzY7VWltRj9HP2dDfTItZG1SekNrPjBTJCElPH5ecUdUNXpIN0JZKytDOEd2YXVXSXBUCitFI0M5KHdjI3spPSVxTEpmfHwjcjd4bU8hazt1bmwmdSNoQzY1Jl5pV1hSbmg3RHA8P0ZKd05GI20mYG04WGY5QHFwQGtsKUZheWo5b0c5Cit7MV5AOys4QHAqJWJHPX5DcGxjYUF9OFMtakluWCg4Wj4mZVlfbUJtUHMrPzY4QGlJT0psOEFPJj1JQWtDQUBzRGcjNWZvTCExXnVEdVJlCitBYWN1NUhZPmI1aEdZe19pPFVgZnklJFcxPkRyPGV9eClYUXktQWkjUTYtPkJjQUo2az9ZREQtZmt6Q205cGlwRzBTNForbWI/MmBxfDZyCit3dXdBPlY4PnxUU0A0VkFIbTxmTSE3NVJKTG1DTVNOXiFXVShQXn5wTVBAK3BjVHl0SktrOypxQURKRz01PEN7NTttZkx8VXhEWiQ3dl5hCituKDttN1ZuJWlSSUh1RFBzPVFFSXM4S0s4U0habzZ4YUtHRG8/Z08pI1NlUGdNPWxAZ0spKG5ASUReSzNecUVhKWtxPFQ9ZjAhRjZQT0YzCitlREBFWFAqPz1eSHpMUW9kUkJ6QTJ3V1d7cEdmamhAYUM+e2B8MHl7RjVJSmBLZShKISUhNXkmPF9NOVA+UH54OFk1QVBTalkmRGt8YSV7CitGIXA2diNYSktOUHohUD02bVVHQ0VBejxLRz4/VWdGZ2ZydnAhdjZzaCZsMmwzISZHZG8kTXs3dkRXLXh0R3JhY3gtJUZReWRXNkJhSHQmCitjazk/S21GVSRXUnpqQnI9MVJfSiRaYUhnJE9SfWJ2RUpPc3hmSG9zWWxfN3lKNzBAKzcwa3ozN0t5NmF1K3hTN3MzSnd5Q2t5WThhJXNfCit5bXEoQjZPJHAxck96bH12YWZ3U2J3ZjdjRyNeVldmXyFhaE94YXgyYGw9QGBSYjhCN0FGeyNIQjBNfXM7KVh3NyNHRGR2P2VzUGhlbGVpCitHaGolcUdIdVJ+KT9RQ2o2djgzP1E1VVFYJHI9SyYlcG14MipsRUs4VX5+Sys/KDt7PzNXTXRNWHF3M0hqUnYxfU4qZUEjMnx2OXpROVRjCit5WU0peCVtKmBgYnhiS2BsV3AxP3M9fD9GcXEyJkR5YkNqKEtqRk9QQz0rbTlCIWtyJkQjZW43SDI0YXdpYFVNaE55WElhNTxoc1JHeDg4CitiWmxxTCh9Qm1JK3EmcCtuZTVOQyspWEdtVCohVndMJWd4elVWZ1kxMVhvN1Jaa1VHPFc/OF53QC00Zm1Pbz59SkctX1BkNFM1OHVwVHxfCistI2pXRUVtNERkbD5ZPFkzdl8jY2VPKWsoRih2I2d6PyFLKmNkTzl5T3xFYjdRIWZKUVYjdGQlMjdfdTZCRn0lcE88SDliajN+OUclX2VGCitmMiZ8WjtpaCFQUyVRRl5TYGx9PFFxeFo9NCh2UChLIytOVnlsK1owQzUraEAwPDlwMjR3JSRnYUpJcTB6M2MxWigyRTYjPUpeSS1iZXIwCit7YmgzMm9CelN7OW04JDtDcyM7dX5aUGpLYWZ0ezJ+UmReMVIoWWF3al5FPWh+WH1LeDt+bmxfMFdfaWI8QHhlRXp0fGlVdzxZdG97dXN8Cis1NEgoYFo9az51NkwrM1QqUGZqPFN1cC13cTxWRTlGb3sxSih9ISNmfEJGbWFXfUw1V3dEaFpFJjI/TTx9MmxpYFAlfm96ZGItfU9ZNlokCis5S20qcEklfiZlNjNjQEcoMytLYiRlZXVjNGFWN0RjT3c+cmhYPnp8cTBxWm9eRjtjcSp+cSh1XjFUTkprdWkzSzJgMG5FcGVhVWQ3akNyCitDKkxPYld4S0I0TE94dz1makJxdnJaeWRNalhxUEIhaG48ZUpFUDFFJlcoIzQ1ZW1MWXQjX1R1aGZAbDJJNHlLbzArX2gpKmU1bGlQaXooCitTdFNJUmI+WGY/MkpnbWdNUmsqdlM8V1BoMj9FaEdAPEMkOV5gSHRoRFRiSjZPOz5ibHBVbllCWXt4YH0oNWY5VG4kUmNgVXd1ajRZMyVlCitYVXFEUUFaK2UoaGF8LUBqQmNBQHk9MmoqTzZSd3BzSy1QaVd5UlI2ZXpFMSQoSVEqM2BINUtHcXBJbWJ1MWw9fn5ASXVWX3EmIUdTUktwCisqKXs1ZnJQcSF4ZTlQUjJLWCpDbDYzVUtqUyg5Yzt5Umc+WVpDNUpTN1E3PS1qMHtTZl9iVkl8MyVUdmljYXFoWVdfNzZ7XjVaP1YmVjZMCitlJGFISkstKEo8YmQxOWdtX1BedU09PXl4T21jY0wjen1edjNGYkB2e3NwczI5OHxSY3c4MjNGO3t1UDFkNWUoMXg/YlFCS3VyUUZNblBUCis3Kk50JG4xVjl8TT0zcCsrMT1OVVBQPXBHd2lVZXFjenFNfm1mcyUyQzE1Pj9SdDc/IzZXbn1fc1dPeXkwIU5Hb3VOeHRDUTApdUdecVd1CitlYHFWUnYxVmlvMHJLXyZxeGFSb1pXWVkqWktCJCl5ckJ8LTNobmM0IWFLI3BVQDskKWZLPzxGMEY2JTQtejxgLU0pKUxYVEd4LT0laz9OCit4ZVRVO0QyRV5TbDJaNDhPT1RTeGA7LWhFP3dPaEJyVUA/TG99XzM+JnFJdVFxT2QyNyE1PyVZUX5kMypvVGxjSz4hbig5YzhxbE0oJEp1CitsWm9RUkNKVDRBaEZ8I2FMbWlIREN8KlZKVVpLWWlpREV9byRQJS02bilffGhLNU5xNTxZOXBhVzZiTU9HbzUmbztgejdPNz89NClyS19zCitgbCFVa1B9NjFoQD1oVm0rIUpVa0RVWlpSP2V5eDxua2hmK2B6aUVnPEI5SkhXWlIjKjFBS2xxZytVbW9ZYmpUIUpleWojKlkkWE5tV2QkCitBR15wLVdOeDJOVXFsVWN3O0l4ckxEJXVuZXhefW9SKjhfTEg/eHBkWHNTJTQqOUxJLTZqRUFPYF5wRH12STl7aGhOXyF5QSt3ZSpVZGUjCitFe3E5e3JQIUpqd0ZnKmkzfjZoVVN3QCk5TXF3czZeLXdlZ0chRE1LY3lqWW5tQjZtKnduenVXQ2syTSgqUnpKP3NTIU91NHw1JEhGS0tVCitTJk9IPTIkZ15+SyZpIUgwY1VXNC1XVUd7KjE8UnErTVhhKHpJSElvYlNqPCRffjVmZmREKGUqP2glem13bkpGKFBNWlR6TmhURDJ4O0FiCitHeyN5VFJZI3x2bXd+O2xFeDIlem1MIV5WWT4/LSR9ME15WCQlMUduU0ZjVy1XMGRxI0l8KEFSRigoblAwa24kKlMqVU50RnBQTyZWdURQCithUEc2ZUhWbkMxdTh3UyhJRTZuVjdeKztLekBtYkRDbGFYWE5XVXk9TlNjITskLUh5RmMtY3VMSCYlMlo9fXAzKTArPSU/PiEkN09LPEhICitASm9uPF5PZEt9ZCFHYVhIdyZLQzJaOVp7WmN9JUkzQk1WJEhgYDFJLSRGZWllckkmODlqdSgxTWM0KUZraitzTz0jMnoyY0ohNzx4TzJECittdjlRJj05WnwpRD9KUTNEKj1RQmNiYUxeYllfOGRPOT5gKStoPkllYDJ7KmJnU2YkQDwha2c8fXBYI3x+Mms9JUtfSTZxWFBsR1hIVDxPCitlc011MGJHbWw3SFFwYzZtaylWUHM8R1E4TXArN3RUX1dPLWhpY0JTVExhUk1OVzhhP3tOX0NNPTJkYzxoSEttYihyTVVrK2x5UUo+bjVwCitpe0AqbUQqbU53bkA0aE9VRmBqNisxZDFvclFsYyo+NCReVkVzY2orV1FYZFU7MyMlSiZPRWk5c21FeTJ8bVJBfE1CMS04Xl9Ab3ZBYHJvCis7eHZqZzNzZkByVm91VG9PZlViQDc+PClUTDQ4QHFLeDd+bXpKTyU4bUlQMyVEbkNJMjQ+N3JfSiFCY3NWXn1PZzh2WU9Vd1VgdTEwdVQ2Cit0c1NBZGNZZDshaF49ZEN4VVFVMyVHak8pKkQ2Yl9BMyY/Pn53O2JzOVFAXztyJnckaXFQNkRfdC0jWFRtSyZeXmwwSGhiSVdzNHhkcEFCCitycTZ5JmZgc3tefVNkLUVWUGtoTkhqcUI4KjVGYWdYP1dEVF9nbS1nPmZBezFafGpVUXpVd3MjU2l5UlM3a2R0V0ZPajxEeW4rNWFsa1VqCiszfV41MzhTNF5wfChmYDZ+e0FQQFk8T0EhelYmWSU8Smd2UmJzP15NXiFrRzg3K2A/czNiIVZuSXZ7dTZvQmUkQSVmeGdQcnxhbmtyNng4CithOGtvK0xKYzMlfTFuTUloJVhXWEdISnkkMD18eEx3SVkhM1ZsbX5kcypKSGFUZFIpel5POSM2WiRINEV2NSRkSGVIQEdUbkV6e1hoQip+CitfaDVxbEpCaHFsMzNCaTw5UUd+MVkxQGk4PTNXI3xaSGo0VSE/fXp5YD5xKSsyX0I1PkF4RVNFM3xGNHFKZUhORVM/KW4rQGN3KGNVLTlXCis0e0llSlItXmUrXkJDbnE/eSpAaHcyS2t3bzJDTiZ3V1Y7PVVXT3drTSU3JUtYYkF7RlZPdn14e3BMUEtzLXlWMUI1KUAtRE56K14pe01rCitwaT9SNWM2UktDaE4+ezROdjlESXB7NXE9c1NXMUU7bnokZX1+UEtyR0gxQUZ1bUMzQEJrdCFRTWVZMXBmcGxJVkpqWH4tdC1LfVohKFEmCitUcEd0aFRiNEI+VDw0WkEjZT1IcVUhZXAqbzdHVzc0SnBFKyV6bVA4WVBLTU9TU3c+fmBwKDRWcGpmcU5TfUFleGFldCkyViNmaGQ5PCo+CitWUUEybFhlOzhyeFhZJE9SVj9UZ1IyUzYpZ2tYSnZYa2VsZClQcE54OU9EaDx9TFJeQDZHR292WTVjPFo3S0U+JmxLckxvblNKO2khcHFtCitjM2RiOzlBK3YrYmN3fHFFUDVHWExFU0Q7Wn5ERHVKflM/NllrNyREQUF7UHE5JEtNM295V2k9OXJvKCt5X3luPSs0TGR3dnEkKSEza1cjCit2RWgmIXtMNzNlVCRPX3U7U25ebU9GWWdrVDBGS3dSe2c2NFFzQ29QKlZZeG5haj4hRCZ5OD9ZcSM5VmZNclQtOVMtfWs0WS05ezt5WFQkCis/TEooWXRSTDJobS1nbEh7WFo+d0YwQGJWfl9weVZZdEYxdFZ8cSZwKiEjdT45NXoweVVtJUJQZyhfbShXR1NCfldQSjNCeHMmdX1MfiR5CitfbXs9YDFhdFUzQGQ+aXEja05fYmphSXZXP3A4PjNOaldpPjV+SCkyd2pJcV59N0J5UihzUEEhb3tzJVV6WTVzdGVJQXpUSnk0aGF2U1RzCitBJEB2I3EyeUVWb1RjSHNlNjZiWXRDd2Y1WXsrR0ZYUyR2RDswLWtFcFgzVVpzRlEocnBsI0E0WHF4YTNWaU5qV3s8bU9rZF94Qm5GRzQ/Cis8S1AtNjgtbVNsI1FzSiZ2bVg8QXpOfD4oaFIzWnwhWSN0IWNHY3Q9MGhnWjU0Vl84KGIwNGBFajVmS1ZvPSlPcnM1IX1TRDVjUGVERHFCCitzWXE4cCkqIX53YF9IV19renVaZ24xZ0xyY0t+ZD41e3tEU1d7cn45eWh5T1cye3JgfkB6VF41SXA2bXlKTjY1d0tXc3Q9Wk1qNmwqY0tOCitxcEsxQzJETXcydng7eHg1dl98aVNSIy1KQXZVUUZOJjI5ZjltSElhUHZ1cCs9USUjZmc3YUlyPWdLPmJCKVNQQk9TeVducXowb1gzNlJyCitHMWlHc2phUD0/cnF5R212M1U7O1o7RzM9SFIwbUdUej1qfVFRPTdnRGc7I21qallHWnNpdXR1Tj9SMnBndD01SDxwQGQ0OCs8KD9TYGp3CitWZj9QMFVJQSlGUDVUVVdDWExTVWdUZ1gwUGxhRnMhamxIaTk3aUxAQnd8RlEoRFdVWFJKdWF2T1d2YTFeP1BUZUVQfkZ7LV4/NkBIejZACiswTH5ZYUdrSX1kaWNaTHk4ckIoPSN9a0hySGw3Z0JQMTRgbnpgcFgyKnMzWm1ZbXBNSD5yVkMpWlpHeUpfWn51cGFeP0twV1VrcmlocF9OCitzR09yZiVNXzhDVXtYQW1tLXd5ZmI1a3ZvVyRZOHwoIWxWfD9nRj9FN2pMRTJxLSp7PnZQKjFqTjkjcFhARkReV2ZHbjckPXM4aUVhVFZlCitTKVkxT2BBXjExNF5SVyt0PEJpWnNQKFhjIT85LUote0VCZTctSFIwZnR3eUNLViszb2pgI2dEUjlIRG9yRnElWXxCKnpkaDBRUzEzRVBxCitYQyglQTdpPGBpOXI/e3Y9NkZQdVpBUHFRbTlNP2kmeGlIQmMqP3l+fkNoZVcyJlp2cHN9aWhzUlU8SmZte3hhMGY1RHZELW9KOEE/MkU+CismJmBjSk1yZUQ0ZD40O2FAUld2OztOZj83WX5SWEFrVUtAUDwhdiopKGlJfWFAe0ZZKWp7QDskVDtuaSVJTERLSkArTW8za3s3XkVheGczCisjXlRVNUJBKWtHajwlOWdhZk5aYlBQZ0Zic2BNQG02WF9uWipTJCs2R3IhbTJoYC0hS0x3eVJ+Y2F1NTtDYmoqZUhPITBTdDZVZldPaClMCitYeGI3WiZyezUmak5PSSQ9cDZkfHp0RVRJY2BwdEI5YlZFRms0dX13bm1UWlNWVEZ5YGt7S3pQQyZvSn07NFUwZCU1Qns8fVVyOE0/fENuCituVHtQMTEpVUNTV3Fie0BKMVFyPTRQQF5+eTk8cnY7TFYmfl9DbUMrRGNJJnBqYGtZWnQpd2Q8cH1heXtzRSU/Mm5odn1fYERSRCV7UlZkCitNSCQpJVRNJGJFbVA1MTRucHtgQlNhOCY9Rnk/WTVgN00qcyVsMj5KRDhDTXpNK0dkQj1LRmJ9YTB2S2JTO2U/cntGJHJkUXUmd3pCTnNVCishXyojJHl0SDYtODNvYWViKGVsIUloYmB1PkdzSnp9Y1p5XnhMV1MlS0h3RWQkQiN0PDVRRWlkZE9+WEpMQCV3YVhNcWxWfVFuOHEwKV9zCistQkdUJVVHV1FBYH1jSHFCPjBzY3ZGRFV9dWx5ITtGVUREQFErMmJuIXBaRStMJihjOXdpc0o2cDxiU3ZXRzg4UEdZUE4hTTRONFg/XyhFCisxajJFI2A3OT08KzEjMFlYOH5TO1UjTWMta2U2YCVNKkI/VzJTVHhRM282R2xHcVNqbD1fJUNwRC1UeUJzeG1CMEhKfEFvT0tmSnt5LVQ1Cit6KntSeXVCVSUlS3BsPmUmPntaX0dZMG1UTFg1QEpuRk0qJWkzTXMxbl9kelVKS0pEOC1fUnUxU3xUU2s1Ziljfjd1NUx7KlF3SXlyQHUkCitmJUAmci0jXlpYKm5geGotTDNlMndSVm1KPElkZWcpT2IwbSRrWTBCIXp+bD9BS15FTClhUUUmbCkpQ194S3w8d2RAPnNsYCM/VUkhT21GCituO1llVGFhc2xkO3dHKW1rU2QjczU4ciFZeVVRcUVCKylZQEpxJFU7fV9aNyg1RT01dkRteSN4LTlMZzckMzdYQTVgaD4/e3t+eDtmJG1GCitoSDwqVW5USSU+PyRDbTFhJip3VF51X1V1Rj8mLSpmLX03NkVtajdVayRHZ0BGKylEdyRhV3JUX2FycGQ0bmh6SnU+S1AkelFLNjV6X21FCis5anIoUkZldUhycFk9YT95Pis4bik+cEF7emlxUC1vX2A0fVd6bmtPbHJVP0NjMCsjU2hEVkhnVi1KYSo9IWVTanhEPmdTTW9GP3lsb2dVCitvLTwwcWJ3OHJERWdpKlglbl9HUFZ+eThOPjZVJFBkX1M1cGhVYlRLZDJMdylJfGdncTtTUnJgPXwtcn5zVlZmMCl8UF9QeCVsdlZmLT01CitoQWd5YD59QTJ7dm56RCFpQDA4NDQ/VmtLPXdocDshKkQhIVp9S0pFVUJsVmxVVVlPVlFAaiFKcD55KUR5Y0I3dzlMU0E0V3VYXj5Ebj1JCishJD9Xc3MlQC1ERyFffnpBOGlgaD5LWjZHZ2F5bGVzfU8yUWpwdWtxfmhTVSk3YHQrPmIrYTwraUtvRHhrREhYa3NGfHxLNUtGT0RkO0N8CisyUD5eNUJfLXM+azkkNWBjWlZ8TGliJGZ6JFlpO2FuNn56fm9rZ1BKWks4MXxjMz9BQitUJmFONGw2QD0pOzN8V2IoP1cmcGJ5fSRMPlBFCitJajk9QlQzRm1qT0g7fiZOXiglWTdAQyMreiR2PTYkPHd2aH5aJTxzQE4tdk56Xl9DYDsmellqdChZSjgkZHNhTDJXODtiK0pPRkx1b05jCityPzlVRFR+VnE2ekxZPG1ORCN4N1lOYH1eQW9ZS1QraXREKHdXXi1sKn1XJHJ8fS0wNiFvMHM1MEslcytpIXBnO00te0x9WFpgdSFLQ1VBCiszZnM2KUp+VntUJHFWKkk4KHR4YFBvNi09MzE8bTZgS2xONDIpRkU5RUhtaldsUjJeZnJ1VUxpa3Z0Kz5pUyNFQFklSWElZFkxK0ZsODswCitQQzVKTnhfSkR6P3ZlNCg8NG1aeGBqPVNzPSZGXjxpN2szdz1zKSQyJG0xR1JwdDZyJlNieGcwQ3hgd1ZjXkM2R0NKSi0+PER8Q0ZxTGQ0CispYlIzWEEqUzJaU0xKbmpCcng3dj13cThEaUwlYHN2TW9qMz1kZ3AkSU04QWhTPmlmNSgldFRpVz09RWErTUpRWCtQNSZHUm1UYDlhdUxDCit6RCV1b3g1aU54QGx9NHdWZ1hTblEmPyNpez5yVDFWX0FNREZjdXNmdz4lelF+X1EyQC0kYUhvYFleVVJxYXBgYmRjTCFoVWVWcnBPUGY2CiszWCRFejcyUkVEUnJKa1NAMVJnTkAxZyEjQSQmNDFEUDsrdTBgPG9XK1RKbi0qTkA+N1c1QTVRUkBibD9hPChJfTE0Qm44dFgzRUVROHB6CitzfDwpfShpZSFEeUtJR1NlTU1JSWIjYDZiXl81d3N3eXEzWG8kNGRQMXooPmtCdFAzSj9XQWU8NjBYOSpxfShFRyh1eW8mKXAwU1VXRmJZCitpQjZ9VWQhSn01THVeLSlpdHF0OURiUSZoTzhPKDNzYSZKO0VGKFNQKktORlltMkhKUjFKYiF5PmlWfFRNT3NZd0s1TX1GOUQ0ejdBQkxACitVPnhZbWxhUkd6KWlTMXE0fXJzfS0hVCpaMWVpJitgRVZqQWE0fXE0bUNZcDFfZ0p9VFE3aGluPzJmQ2Rne3s9cTl0OGQ3d15hJUhaejJTCis1WUR4Y3QybSMzSWBEbkdNZXZjNEhIZiZVMVJJYDEtUkkxU2M/UyRXPTFuLUlIJVNLUGNLUFJJOXl6K2lFTWQpe1B7TXs2eC1fN3hOUS1wCitxPVZfdmcxUzdxTm1FfG1sNiE8QjhiWUd0MC0xLVRzVEtJQj07T1ZOU0szKWd8OWhrSnxxNCVzKVYmZk4pKVJXPTlRek1TX1EleUFhWnohCit6OSsjPHxLMWtLQUN6WmE0VHNCO0xgfTZ4R3JkKX1YOShiX3s+Q0FBMz8mV1BGP1FedVB5QSs2UTt0QWlDMnlxWUgqIz9pOGhhK19QUWwkCiszOX54I0JtT2lDRTA9QEUjMVl+KSVNR0IhN1ZpPkk8TlF4YDVvdn1eN1c2OD5TJGhBZm9zQFdXVTB8aWl8WSQzKiM3bXY+dkJzNHZjI1R1CitvMiRANXJDck81PDt1dnI8Mjw8T0VARUgjK18mWTdqQztlOUg8Ri1TKl8hbmsmN2o+Um5+Uj40OW09ZHIkNGIzaEswdlppdT5PfEhSZnxSCisxSSg0UXxDV3l6SihfMT4lZy1hTVB0IXc0Y3BSZGxVJXheJiEoJSNzKnZTNjtBe0NMK0BlX0RWNFZZbH1jY0hRT2tCOHVWITA7NHBBUWBECitFfnhOcnQrcUM1eFRQTFBVfTAxPnV+MklWeUFuJmA4YlZhYU5iNSFydCo+ZyN8aTN9VDxsR1BXJDM+MXF5dzNaMW94ZDBEK08xbyVqKSlsCistX1VEc0dFPzJnSDZzdE0qXiUhWjlIQjNiZ3Nqd0laNFA0X2JmKWtYK15Ea2B5ZVBLcSh7IzgtZWdoMjdJcn1AfTkyaGNFbnAhWlVMJTtLCitxfitnU2YtIT1kaEd7QHB9I2ZhU20xQWNlbCQjJUVKdTw9JkhocG91OFJDMGJUJU9OOURnKjRTQEBNSWo8S0F6VjlEXk9fdWUySm58V05vCitFaE1nKUtMcnxoOytXZno9UTVySEpDPFNOcXdycTRHNnRmSm40YXMybWNmcWlma253KHpFKE9jUFVfNGEtXzEtMipxT1g3aExZVEwzdD9rCiszRyhWPiZWb1k3NE9SKWdlK3hUNSo/Z2hIajh1UCt+PmhzRyQpfH1vRWN6aStjenFnSWU8IV5LUi00dm5VJkdDMHJnbmw+Mi0lU3goPWxDCit5enNyVGQ3Zm57QVg9N0h0Wk0xfTZtakd5KTtnVGVjPHhTKXZ9JSYyJDA4SChOPiR5Y0cjPWRgIXJlbks0Nyh6OSlRT0NHZ3Y8VVd0JD9rCitpP2RYbklydytSTjkoMnd2TWB3ITB0bU9fQlBxbE9wVWdnQWQmY2JxK0UoKjlkbnpjan1kclcrSG5EbzF4NX1yPzl9R0MhRWpYUCYjSUtDCitoNikqK3krTHImJmc+WldsMHt8RXdOe2BWX0RSaDhvZCs9RXUoJFctOyU/Mlc8Kz4lS3ZHRGUoK3NLYk9HNHs4VUhXc1BBPVh5U1k0Zk91Cis3aEpnNUJOOVpoY2E0UXlBLWklMT5zcktSVz90VXBpX14wYzZ4QGslKkMjSlNLVm40SnY0ZVoyd3l9ZUdJJFhgWip4KT4rJGtnIWM3dDByCitKKDErTXdjUCg1fXVOO3dXT1V8TUYhbkdnb0xMXnU9PUg5UF9OYmNYOXdRcjdFcismKndoWkw2OyE0cVkkN24kZDtUdjE1YCRvMmx3OSY+CitCWHJLM21eXz4rQ2hjUTB3YiNSPTt3RUtATFJ3cF8zMThsbygpVmY3Qz9uX3R4VkxHUXMqRSsxUVQtKCE7UlQoJiZaVEFmIU4zY0tIcWtzCit7Kkc/bipPezMmJUxrezswaCQ4PHE0aSExQVhDPT91RVJOQz9lMWBtR355eWNiTDNQTmViQmtJaSo3SF4jVUxEalE+QEMkQTI1SWk/YjM4Cit9YT9NTCpQUmtUTS1vTCkzY2BKJWJ1ZlJXcERNYFN0bnUrO3xXNFg4SURNPCQ3Wm9gd3dLRzBTQ0BUYShyU21LJmpsVEFJZTEwKTNnVH5sCit2ZWhwNHleYVlGeTIlVVBtLWF+SHg4c35fPTNkP1FkNElUSD9Ca0dJTz1ZV0lAZndFKSVQZ0dPazBxS2NIXz1UeiQ9T0p3c1d4XjZpbUhkCitCZWNUKjtPemlUM3k0fWVhb0xZRT1qYHtzJjVfRW5YK1hGUjxxaSE3QGh5JWU0amFHQDY3Q2JaRXdeSG5oUU1CN1ZDQWo2bnU9Pitqc3I3CislazskbE81dElCbT5fZWFzKnxLaEZ4XlNeWFlTUE9Tbz1PIT5qXylGVjl5TGJDUzN8Mj1jJm14fjhfNVlkRXtnNUYxUHkycGA8KiMtMVMwCiteZStLdGV6aiVtU0k5N0koRDskVGlDZSRBQWJIWGV+cWpDOyFAUERHT2pGV0g+MFkwY2xiVSpjYTU7N1FpOGp0d2sqaTRENV9EMmhDX2VpCitaSFJ0LXY2cXRabkJPRkJ0KSRSelJYKEhMYXFpNnd4VFZDMDtDNkxQdTd5KHdGbjAmQFZefWV1WjEmZnl0WjdYSyZgc150S012eDAhSHkkCituSiE/cXc0V1RSVSZsR0NwTXIpdlVsMUZ9OzZEYFhHYW44RjR+OVFsc3J5KDE1YDcqWjQoUHFgYHxeTmBkTSNjSnpJdkM7STZ+aCVEfVpmCistUk4rVEAyJWV1VDRrPFhqSEdqN2tlRUo1ZG0/MT0/eHB2SjNyNz5eZnR2X3I4a1EpNnxDZ1YyanE8TClwVU04YlJybkRManNgUlorTWx1CitPdGFpb1hFRm81WiZFPjZDfjxJYGZZVUVVbDJzPT1FSlhEdWZjTER0QShqaSNTK2pockJRXk1RaEBvLWdXWHpBQkBFKXsrTigrRVAtSFlMCis+OStecXchMFJ5Xz9AN1ReMkkmZmowXz5IP2I9SU5Nd2MjNSZhNTIwTEstIz1Sel5EPypOT1pTblNHWkcqcyRzPzltR0RUfHd7aGtYZ2BvCitBKE0rZDxaVFR3YTNuX3ckSjBVVWV9RyV6S3tVRjc4RzFyKDB1NTc+NV98JlNVN1YlYG49ZmdBeW0zUzZ8YTFQa0VkWlhtY3BoTHZqVXJoCityO0Ukbi1VI1lBaHZRNChoaihKUjJPTjQ1WUBNZHwmUnhUSFFLNmxjT3AtYjNTWXItOCRFanVVTEUhR3drbEJ2cT9He1JiJSlrMDFLSktuCisoTDR1NlFYPndLfCZOKEAtYTRwJUFta0dGUUMlaG4/YCF2Jl5LSk8kcV9KRFlKVEora0NBYXxHQzQoKGtGNEBRSlEhQ0FXKyh3NHQmKTY/CitHRCVyOGdZOH4lTGc7UFZlJTsocktsM2MtJT8oUDdVTkpZPy0mdz1ERHpkR3lNSWM7OXslLX40NUdsWjlwSTd0ek1jYW5zIzVCRyg8VkpzCiswMHwpK0l7JUk5WWFoX2xBcW5tblcqfDkkT2BaOS0paCFaV2I9bjN2N142ZGxENmsrfE9ycEJHdnYwY1JxTEw3dD5pVE4/YmYqe0p+Y0MmCitTKiNuSXF2KTNFbj9fT0FnQUwjYzFDeUIpYWVsSV54fiNEN1VEYypuSH1pMUhlQl81TThmVHs+RkROZ3U2RXxGK2RWS21rUzQodVFiXlFwCis+MlFiJTRsQ2xfNG93Yl4+KlRAcS1IZ2JseHRDMH08KVckVSFkN2AqPlhNWkFSVGlGfjU9QmhkLU41MXZXU0B4THYyMn1GY29MV1UqUjtmCitTZ1VfV0Q+Pmk7dEVsKkAoOHlpdGkrZUUwY2MwKE5zRzR2Mik3dztSMyhIUlIwYk9jWTtgWl5HIXJ5MUlxQi0mUD5FQmE+RitGZCljbSlFCitVM3NyeUkxKndUTSZ8NUB0N2RIKUpreDdaYzBfWSN2ZUdBRlpkXihwVn4wZ2JGbnxHSiYzPEt3VVEyQyY8PTxFNns5JWZFcTZtdFN1OHpkCis3KiEtQE1LezRGMlhDcEZ4bCZEVEptZWlsel8qIXdgYWo4NXBLdmYqPT9LcDszJiRYJDwpP09LM3E5ZlFaUTJiKEkzZW1ZXlYkMWNGJXZ6CitJS1gzZnIqSkN6fUB6WDRtMVA8I0pVbSRTY3NyPj1CLSVfdT9rUHBweHh8KFppYFg4KnNJSUc2YjN+JCVQQz0/SXt2Rz1uTj9qS1U2WG8xCitfQXRLNmZ7e1JvMD8xO2xpTlExaXFLT0x9MEBaU0F3UFZTKGJZXlZ8MlY5bykrOGheS0tAP2w8UnE4K2FmfHxjb0daJCNFcGctQ1YyY1BYCitCdVc5U3Q2a0hPQFFnTF5aU0dLPkJ2TitYJCpBZj9uSC04TWtCTSE7NjFxfTgwYVFAXk95TDtsPDk1U1ZPS31uY2phLVJMSnU7N1UmZ0o8Cis4TkgxXj1lM3EmNz9NSW1ZSGQ/NHVaZGRORG5mbndwaVQtOVJzbUcxYHgla1M4S0d7dldxbXYzUFMjZGJrRz0oaTVgQ1BAR0ZMX3AoYlEqCitobz9HM1NxTWd5fjVqQ0hVdXA5TUowS2RuV1YzNnFKdUVkWV5LSUMmT0lgeipzQ35BViFheyU3NT9oeC00NnglRCVPUFUwfUp7eU1nSURFCisrO1JSPXJma3p2elduYT05UXRyKj5Jfi1kKFRncm5EX2s7KERJXmooTz8xWntHT3VQRzNEUnIjcXV8fFJedEF+cUpANUZfWD0rb29CaHQxCis0fiY1UT05KX5McmZsWUROOXBvTCpsfDFHM09zRT17K0FkeUlhUjs3JCReNjRgODtuYloyTmxMJGxTWFFyKDFyTiMyYlI5TEtJOURkI3tuCitYKDxwMSUtKW51ZnlgJCZrKmx9JDduRU9ZR0xMLUJqIV9MKG9hZFVqS142QTFqQ2NeczZJbD1HO2R6fDdPR3QkbTxEfkQ5YjNIWTMwISZ5CistMEJrSEJjSG84a3RZWXp7ezZTZGJ9V3psV154QGdJQGlBdVleN2llQGElKUN0dWpDO1pueGhxUztAUWw1RClSLWFPek5YLSQkclhmKXZ+Cit1VDw7bGljVDI2bkFlaiNVeSRiLVUrZ1pgcWdXc09waTtJaHgrfTlJLTFtSU8tVz0mYGo9WUpvZDxnZnA4OVVeb3lMMSU8O2xkWGVnN0BjCit5fVY3WENCcWwxK29zYEVMdWJ5ejRgQkB0PGF6N2gySXlgP15ZLURVRmpUNXYpaml9LWwoYjhBQTVVKks5ezhhUUFNaXdKWntJUWxIVF5qCis9dngheT92MmFIIU94ZjdhR1R5e203Uk9PIXAqKig7ZX1FbSE7cnF0JSVIWjBha2dKYVJOWXs5dFNtUz9xfTwmdiZuUSRyMkUtRm8oKU85Cit1cHw9PFFnYHlNSj1EODZsUX5rSUs8bWpYRzN9P2l2PVc/M0c2YklpNzYldDhqVVl3M0pIMCZTZG8jITRsXns1UGA/K2ojPytGWmVQdVdfCiteTyk0MjlvYjVRaHs9ZzZCXiZ2b1U9Qn09QiV4WDFnR2JWIzcxOFEzaDlve2xAS0hMbi1Qcys2TkY0eHVCVD02JV9DeCQ0ZU5GVWR7Q1c3CitSU3x5ZkFHMUBqTVopKTFIbXY2Q345KmklK2t7eW9rfXxKaH1PdWJ1Szg/RV9iTzhaI2U0SHt3OXckYV5nMFRQbGVlTi1JTkV6azA9dSFACitWTTVYdHhsREUxXj5BdCpFblVqJWV+MHtEKm1AU3BRYFRpTiRjfENKXmhpZCNedUw4e0xjd058SFd6RVZmZEcpX2B4fCRwJExpKzM9UyQqCitYJjVETjNgQSVWaEN0e0FoO2FmIzd1XjU0dDI/e2A2YlhWPip7YjU0NkNtTS1VYTw/Ylo5X3JVNE4oQkJFNTB0bzBaNiZfZ2tRaiRMT3wmCitiUS1ISUFEdyt+bG1SSlZSOXE0SlUpaXVqbUxFd3d8NUJ3YHo2PGRSQSVraGlSM2x5TiV5MysmKEZ8e0lITVdiKktkUENQdmE0R1ZpV2JJCitfUDdfKkQ1bnlkbDExJjJZPDRGVDNKcGFkQyFXbiFJTHtAYnFaJTVeY0J4Yyk9TiFDe1JUUEVkQHNiOGdKI0Z9MXhqLWk3SlFYISFfYktPCit3THlgSUdwflVqfUBzeXI+fXluMmhtYTQxTn1KN0R2UWZPd3QjV1Z2Rl9uOyo0Q2pwTjM8UFYpZ0Q9ZUtkTXRsMFpaJGVGNER5aj82NFQ9CitDRy09bVlKYkFHXipHfHlyT05vdzUzMD9XIUAzaV5qUD5VaGdaZUYwcWtWWC0/dT92cW9KcmpgSEdLJDtmUVpSb1ZBd2IkbWdNUiVzYCF1CitAU3whcl5nYXxZNT5JZyFPSGxMO1BKS3NVe3F5TDYkLVE3PF4mVU53ZVdac1hPZENMWHFibUNrQUx8I1dDV2M/Qk9NYUV4MUFSKkZkQXdMCis1czFBY152NzlvU1BqUGdtVVJQWE87Rlp8TiVnNnB+aWF4b3laQiN6cEQ8PjBDKElAbkB3d3s+M0lPMHhJJjFEWUw9XipEQWRESiZ0ZEE+Cit5KmYrZE9LOCNNWG8/KW5CTlh0ZUtLe0s/TlI5Z2w7PDJHV2lEUTJJeDVlPmYxPUU4OUlXa1c7Y2VJdnZxMkNaJjB+PUhAY09aRlBNfiheCitLNF4jVWdJbGUjJn58YGJ0dDM4dE4oWjZ3QjROKChPP21uNjFEe2sqM1FlNXBVUjc7Z2VKPmwqN1l3KG1KITl0Iy1uY0Z5T3JVZ2dFJH5xCitGXlloQTFSYVU/P3xre2N4Ujgpc0hBeEEtckQkbk98fmJkS2ZZdVkpPUVuM2l1U1ZYdDFMS1MxbHMtQFp0ODE0S19vaHBqQmA2RDE0NU5TCit6KjVOWk5qJG4+O045QztZX1JYU0p2SWo3RXltMXNwRV9FQWo8WmZgTmF1MEtlaXU/UVNYb3hxb0V+bGxyNz45eCUzPUlSX1UmV1YrYXNjCisqT3Iyck4kRWUkJTU4VFA+X2U1U1MkRmtAMEFrRSglcjA0USs0RFVgNlAlQEpYPj5tMmtqOSRvOUhoeWMpdkFqK3xtPyhedmhlfHFlKSVaCis+TkxjWWxDK0I2cURaSVRWI05qIWctMG5fR3xid041I0FKc2tpR00yd2hWZmktdSRZb2Ztb0xZU25sQiFoamAxO0U3YmMqYWszMyEmeFM/Cis8V25JSj5GMW5ZQ2M+SF9CUWZuXnFoRmZnTVBqZCRFZW0jeHszbldmPVM+Uz9rUFpxdExUKl80ZkRNZWx6Jn13cUx9aUJpQkshRVYzfng5CitORmEtO3g+MC1XdHVIMndnVEgjY0RYQ2MxPzsjU2tiKEVfOzZlK3RnNHc7WHo3UEYhaGg+UF8kbzFmZ3s8d0BfSWJsPlM3bWBQfHU7MmEkCitRKExFeXR2bVFeUnhKbENiSW47V2c4UjNqal5JaVNfPz5fZ0NAUHFIJms3Zj97UWBrMkVAdjlTMjdQMSlSPnwwVzxTPkBVbWxMb0xGdHVWCittYVJ2Pz8hMWpkWTVTRkxHJFAkUV4zXnVJVCFCNz9UeTtgZnYqcyk2Qzw+eSplWHxlcGN6a0ktO3ViIXx9T31NKDkmZTM1IzswfjdjemRaCistQVkzKUJSWF99e3dwVnEmfHNOWllAdXpnd0Q/akdWWktmTiM1P3pEJSVTdzVkK1UwNj8odkc+ME5pWV4rPTB5eHt+JEdta25LRXdtYFVSCis+dE0mOVk9YVBEd317dituJTB7O01qN1p9Ji1EQENQNU89KmRCJSsmdHIhVlNvSkFoMzk8YzdVUmhuKW8qZT8wQHRybF82XkJDUHp4Rjw7Cit9YVR2MCohR3JLandWNVc+cXxUVmZgYmgwOER9MkxCJk81Y21XbVhUZF9VSiotLTUrU1V3NF4kdVJyeCRmZTVuWi1GUjd0UCo+eTVfeCRmCitpcG85c1ZIQTAoO1hnJXE1SFZYNTJKYk9ybXFUKlMxQDg1ZWsqUHZ+X3ZAPWxIUzIjITkpOXw/UkI/aTE5LWt6RWIpazJRbkAyeEU4P1h0CisjUylYc2xXYkA/PlR3dmRZLVZEamJjMDd2Z3RrPk5EPEdubmZDcm5ObmcmKzN8KzQjWGluTWg4e28lbmIoP357dnJFPH00ZGQkdCUwK2hACitQRkxgPWkkPGhUeDlZSWpnclcyOyhwa1NjSXA8IyNBUG1EY0ZwdEU9OyhvVz5jYz00TT0hQHx1V3RNe2Q7fkl9fC1xNG1HbU4jN1BUcmVqCit8eT97WntPbW8kT1g9QW5NVUluKDMkNU0ldX5id1ZhU0dVTDJMSE5FcXp2KG50NCNkSSlDfU0jdWApeTFCQ01OKVhgc2wmMnxrM2JxTUVsCitOSHwwelJWbD1zWXhqbERQTm5BQSY3KlQkWkh0MSElYnwkWDhSfX4qND0zbGdBc1BoZ0oocnRwNzZVO0k/Jk9OXzVRZlNeNVZGQTFAUnByCitjREpxIUd8U1pYez5CVz5vUllSJEQhWmsrVktoMyRfbDFoXyFSaTB6P29FfipSa04oWUladHV0YFpHbn0jRWMjITBpczcoT3oxPXBsOH1WCitwUyQ/YXVkVm4ma3ZAKXd2JkxaLT9palUqUm57JHVmQ0wqKGJ0R2FnR1AwcGQhMHJ1S151ZjEwNUk7VnU5d34lKCFHPH5NcnVgSm55NjFoCis4cExgYDlHSGQkTXAtQ1BmTUYzbDYrSUZ5fDU4anJhUzZEZmF4Zyh+bTwzQkRobypYM1FiQm4oMVB3b2B2RWhtVU4mJnNYYCUpJSlffUFJCisxUF5GdFFKJDQyN2RHZ09NbipqQGJWeUlmJkxsX2xOfHU/dHJuNjBAWEJOJl9hT3I2UjNaWXAhWTxxeGNtSU0td2NAYyVZYkEoaTItPzluCitnbjItVHdTMW5TVXZwMzdtI0BLb1d7V0AhbT18NEZ6U0FpOUFwXkNTQWVRcTQwZkhhbkZVVVJvTH5YfE9XdSZJU3FyRypRSmBpQXJWZXBICispNUJORWRtTFVWQnhsZnFMc3B+ZDwreyFVa2Zue2xXYTk2Wj1Sazc2ZW9HRV4/MiRfRlE5TXA9d2Ypb31TfTtFdk0yRUkhc1godTQxXnhvCit0RUtmJnMmd0tgczBgMHFHTERUczZMMzVOU0t3az5fKHdHNz5AYCZiV3F3Y0wta0JgZW57WDx7TVlTZm9sdV9wQStMRlFlbms5PnJQRzMlCisxZC1gOzhMeFYqO1NxUX4tbnwyNUt2ZXVHQUBNbmAzYitAbzFuKyVfKyQ7ZU1kNWZnIWUoQmBLIyZGMygodUxuZzEocnlVVlpeMDlhd1dXCitScFdyYFdHNitgZzkjZ096JUB1e2YkeD1hQ3crXyVzbCtieDdFSjBwWEooenEkI14mRSNuOCpic2d4bzhzbjd1IW0+TENEd0MhSGpHKHo/CiskM1A9P157cG8oNTQrO3dASjE5dk5BNWpxPFpjdjktKX4jNDw1MzteIWZGfnImSlhYdU99dX1SYmRYRWV+cmtGZTV2QEBQUiFQdnVtKj5wCisjUzBKSVR8RFBfUzs0M1lBczlUIzJrbWY+dWlMN2tVR1lAc0xZS0lBMlglUyVqT3tHUzgoTm03V2NzQDJ5fm49N1BwNFBYOUFgcFF4ZnEzCitaTCpDcVNaK3x6Xj5Ub25Qc25JdlZhakBqUDs7ZVJtUiZVajc/MiF3MD5gOS1FJik7TkIjfDVzYGYyPWVtS2RfREl3QzBfKyFlXzJiPyVrCis3XnJZQTU/OUhFZj9WcjNgNnFtUSR7djllcWtkbFVXc0h2WXpzYFVoXn5KZz9kOWVYYlR7ejFgV3pwVUthUUdWay1VeSg5fTg1IV9zQlhOCisrQ1l0Xk5aKT5pYXFQIXFsPzVRJjk3fEVxWVlXJG5COTh3KStPcnVPNHhhSGoheyomTWtnKylZfXNfPT5tIzl2VEBzXkF3SHw7eyhnQ3FHCittdUk8REFQUF8pYjwmalkre1FqRHVYI2ZxMTNNaFA+KUFzeGdHUEZxZ3RzO3BtUCF0MF5leDhXMFdNQ2ttMVIzbiNiWHUqNHxpQT9oU2peCis2O2R+a0JXRU04M3ltbV5WMiZyfG51c1FVOFhnWndAZUEla1VJSjF3dHtrSnYlLXZsTyNLVTRTY1ppaWVhdGkoQnRSSUFzb2U+T2libkZxCitJa2kxcUted145eElZTXtYWSkzdzNaLV9mfil6ajA8S0lEIzhxQ0JfOSF7Tk16a0VtakRpWU05eldvdkE0am0tWFZoUH07IUd4bDNeZyMxCithTiNjO3Rzd2VyamVHKVR7enBoPFkmPWVPNGY5MCFrJDZDVkNCd1BPaUxFZFByWXtxNnNsLT8tdCktflJWRHg8JFgofEh9Uj1VfjJTOW5XCithKHMzbT4pRkVveSNBdnVfO29yMk8wZSklX3hyZDNqJWNALU0mTSFIM1pJLStRRkAyKVo4U3VQK3xePngmaU1rTS1yPiRrej5pJn5+UjhtCis8SH1NNm8kfCEzNmwoZ1F2XiFtNz07MEs5MVEtSEheTnxtd34xd2RVamJNaDcrX2UhRFg2S1RGYzQofXtCPiV6a0JPSjR7QXN2Tjs/KjJACiteO2U1d3omOXNXQ1B+Ykk9IT5BQk10NUZpUkY/cG5GKU0pYDFgRHlEKn1Gdz11NUtBUDZFR3dndHhRZX5YeUskTmtaNGF9QEhmIVRpTkxPCit4LUJCeHpXV2ZxQl83fER9I01CR3tvdygmfUc3NFBPQCZVKHllO3g2PUd4R31zPCN8czBJeH5PZEZ2Nn59WEQoJVdLK0NOKlpBUl9XdSZXCitGJj0qS2liS1djNj1USVFHY2x8VlEjcyRXOWlEIzlmbklyJkpGdzk9cjtPUlc2QzhfbX0qQmMocjc1eGw/fTcmTlg5VW9HQl9MaG1DKih1Cislbnw1IXtsS1JMazQkSig1T3s+NEo8JDVwRl5NJkk3TVRRVVglcWcoXyhlKTVnRChwPENqMyNsbWB9NV5vSDVjNyR8K294bnVpQGBLNSpJCitPPTI5JWI2dWI2Vz02aV88WT5CQ3tzb0xsOVR2QTZpPlBYUyN7OFZUSGUrX2pRPjxvViQ1O0xpQSFFX04jKjZiZEhCO2FncUJuTSFyNlIjCituYWl+I3NNNCsmTnJaZz1xRTU2PzBQRE14JXtobCFlMD1YWDQxSCFme0pyRHc2QEJiXzxmeiVhcmYlcnQoRzVAUDtnK2plMykzfjEkPFFfCitIP3VTQnlFJFV6PGBuKV5weWdvZ01nRzReZjw9Vk8+N2R+OX4yYnVfaSp3aWolZDFBfmk3bnhsJW9DPEN9S3haTXQmZWBtb0YpYllBPng4CitRMXtAe0E+Xl9hfk1PPm9meEYzWjV1e2xYPVpSez1YemFCSEo4cn1RTn1VSk1nRDUkRXxyQ2lhbG1Ce3ZfI0kpUk9qcVlZSSVLT1ZFOFNNCis8VTVfdnZ9LXlCT1lBSmdSUXcpVDQrKWxxdVNGaGVQX2JJWHBSMyo1fiVzOTFvfGJjdW4kRzVwbUNYTXMlQzNJQ3ItQDMmZyNMI2RERl44CitoUV9HQHBWTH1RJTJJMDJAJnt7aD9MaFRrbEdhJWRLe2F4MEJAZElFLU95MW1zU3ElQjhSbmk1aHYwJmlScDd1KE41eVE1V01+PnUkdmZLCitxSHMmQWFlUmZscGd8Rn0rfTZTPD9ZajFMenthUWdYbDBLXyg8czgxezlaR3NkJTxgQyt3fik8cDR0c2dTNVZwNTNVUSFtPmhUbSh3PlQ/CitSXlVWRi1sMmxAJWdxWSFkJmgkPm10bSR8PEFsYXBnYWJxeUYhK2QxT1h0TlAzPXlWcDstN3VpalVZVkVRYmxzRXQwYHJVK2QtOVExWT1rCis8Zm1xKF5QeVRzazszKHErK1hnYSlEJTJ2Pnd1JH1KXnlBN3pGWnlgZEZndTtudHI4WHQ5VEEmWUp0KVFWbXckfit7UVRhWDVqN1o8Nm4mCis+fVg4PG5lQjkoayYqQjApRUNYYkc9M15VSV5vdT5vY1hhIyExWVB+QjRnZ35rR0d2XkRae15EMSRLQ1ZHa2QxJk5iK1k+emd4ZV9xYyE9Cis8O0gtNFopYnZTXkZ4Uk9IQDNFJnAmdE9gPH5xY2VkZiN1bzFJQ2ZYQ24oTmNqTlRxdShqQG9DMng/P2U5V1ZAekBNdEQmOSRKeC0jRSomCitvUyNIY3lhWE5wKHFWNU9UIWhiR20yPEhhT0RDZHdkK2hifjM1Q0ZYQiNfUHg2fE9xV1Q9Y2BuNj0lcnhPSXMySEBKXl5ld0l+ZDxKZTF1CiskTTM9fGdDdCEmM3JGbmZ4dF9vWGp7KFk/fWw8N1B7LThAbWVDWH5JJHZKTSF8ZTVBXipOSl8zKlVPMjtZMkF0QE0rVCRuTTJAOTZ2bElHCit5IVJ3KElKRTF1YVlLZjJpNVVabk9pOzE/MmwjbG5fWCMtWWM9TTc4djs0XyhfN2Q/Q2pmN0BoVG03OHtpQkJeekApeDJARWZBfEJtQDF4CisrP1EwYGJCbig0JWB3RXdpQnZgPjFZLSVIVjZiV1poZ2pfY3M9P0lsZDh7PU0mNHkob2E8eFcoNippY2ErQUlfelg4YDgqUVE4RXUrKk1ACishWloka1JDNE5XWGokY2RLUzRLaFJzMmlSaW9aY3ZscWp+YExjaEtnN2B7VnN4UWpXZHdLPmNUJWNeOEBHMTRTZGFnRnR3JkZGKiQyMiooCitvbk1IVyNtZHBoYzZgcG80aWpxQ1ItQSYjPiM8bEZPSHtuK2FGMyU8S0RTb1EyYFpoYCRocTMhRnN7Z3xZKTFEKztNS14mRmBhIUhzT19YCitqLW1qMCFiMkIhUEY3aUd0b2FgfnVWV2BeYTgjNSlhYXg9K2pzdmVJTVgzWmtNVHl2LUBCfG1xKDl3dVpYQ2UmREdBP05HVlFRaWsrQzJZCitsdWt1ZSk2O1BXWEZgfmtnSFlVOzt5M3kqfF88OGUmZmIrJDF9Wk5uNmczd3xqSyM7fSleYTB4VGwyX3cjMSVXdTFTQ3FPPExNckVKdCVxCit0Pn1ofTcpU0BMRG49P3BfWnxPamdNNHUyMGUoeGdnenZjVGgpV3tLfk4+WTxtJXN0ZWlKbiRUfD4oYihPYFZuUmt2Vjx8JHNRV1NnPTxKCitGMmNuISt0O2NrJWsyZi10bWdBUDMpZXJDcX5jeHNWNk9yeEl2bT02c05NOytQQUphV1FuVmV4RklqXi18UmVrLXR0UD1eNHt4Jnh3RkQrCit3O004dGwkJkJGN04+KzRXc214K2hQWUVsWFVxMz07NnZnMVhUK2kkeypBQjlGUUZ+RmVRXl4pTDJwPTk3eGVuISQ4c0FocGheN0d0dig+CisqfE42YlpxdjdBJF5BQjNlSTA5ZlczVUR3XlVeR2NtRz5SO3I3Y3xWRUlSMj9EV1Jkfmk2byFHZUYyUjckcG81ISU4S1oyU1hhWmhgRiErCitGR0tPNlg1a1M3Nnk9NT58PT5oJjM0ZCZDSyNOfFVRT0JPciNZR28tfC1iYitIXzJ8X0gjYEJ9azwxUEJfNEooN1Q3T3xSZUByVTFyV3BlCis/PTFBdFU1cEQwcjE8SzckYEVtXmZPNkMkZT95YjZJJCVmRHxOd2YlVTFrbU54Ym0yS2heanxMenBpNnx8Pl97V302UzRzRmt9Q2QoXktZCitPRDVXMTtYJVlDcCFKOyU0M1B7T0EqLVV5K2tie21oZXRYVVhiNGQkUig7YGRPeXxxKk4hWCVPNFlMVypeMnNiM2lNZU8pVX0yQ2pyNlFKCitpdTclTD1xRFRHdyk8NjAzZTBnJW5xJHN9Vjlzd2M2eiYlX0RIVmFmJFZzNmVrbmkkVWlIWE1iPytwVVM2U1hnLWE3emY2S219JHpFZmdzCitzVGxrVH1fU3VSaWBZSUFrJWU4WHRPZj5JfGJNfmJyKEM9PHdiMzZNdFh4UHZ2Yl9RJWdKUGNhWD40R2A7SjV7eFljfWA5QUBZcmEmZ2cmCithR20kdWdhY0RVQVBiJXlSKjwociNNT3VjNWlITjxveU5UZDNDczlsKjYqJWxfQHB9bWxuYEslQVA7MTFHbUtGMThmN0E9b3RgQFlgaSZfCitubU9rdkV5elo2NjU5V3NpeGM0Y3F1VGNlNGNoMShVdDwpTXhQZEQ0czN0Rj5Ab2deQmJtV3dRWFE8e0RReHJwaShwU1Q5PW1sN3tkfUQ9CitOOzIqJit7UlZ4KSZ9eW87QEMwV3ApIy1wZlE3cHh+UEZ8SkV3Yj9fWnRgQUc8JTU3KCVyeTA3Ml9XY05VJiFWczxTJiUoNjdneW9BZ0A4CittPlg+bz1zWmN6Kj4tTylIUj85OU5JaCliMz9DYllmZTIldFBSSWp8cFdBQm9aZTZPWCh4WWJeTHduWHl4VEZHNjl+RFJVOWhXVCtrcUxeCitFPEdVYTteeWhzS28kODhNVEUxNmV1UW84S2M1ZXE3LTtwOVJzQEl3NEREI1ZUZnZQbXg1O1RgVD1VIUVrPHhmfnQtakRzXiZZQj9iSyVCCitsajR+TiFqLW1ERTZSNFc8eWdmUGA9SmNaQ3hmYSptNkhAbypIVn40JnE4S0wqSzxlVEtQUmVpWXw5fTdUeG5sUjJSY1BlTll6THsoK3htCitueCtNTzFndnpDMyZvWGRHJjkzcG50M2M/dCgtTXFHMVJtVkoxeyFPeWAxV2I/MTE9Tzdia0pWN2hrUT8kVm5IUmkpdnRqbUAmYEx6NF5SCitvVXtiYF5jMmI9YF9kcj1jPDtLZW08V2NjJHs8bW9OdDN6JXF9O1pFTnd7RUpCKnQ8PFohXntHYFJIYyVUMzdvYmBQRm9INTVoO2tLTEFlCitvKm9lX3l8TSU9PDFfbTN7ZkRIKWdgcis8T0dhRVo1MVZqVz8+cnU0e0VtJkQ9N2ZEMD8pQihFIWB9V3hvdGJSQjdlUVJ5cFRqWm52Q2dKCitXYW5zbDZDZz8wMGlYTzBVYUxtP01yQVU0WlFefShmSnZVZ3NYUj49TUFeVVd3b0t2LVRgUlkpbDJTP29SIXVXMUQ5P093XjllR2ZaYF5uCitYNlBsT3spMHhPZ3UpMzcqaSZLWEolNHt5NEtBdzFsYV9eTzg7KG9wcXJYVXN9a2loVVJuMG0pYDZsKTR3YypIeXs1SSZCczEpeCFlY0BJCis7WU0+NzlFZVM8SC1oPGhsV1dAfUVoX0NxWDQkRnw7JUxJWHVfVGU7VEo/e303VkV7dmJ+SXJ9cUF2STBnR1BQQypFbUJ2NmIlNUZEVz4xCitTbmZsNnBFclNmeCQyZVFfUURVKEY2KG43b3VwQGgrWmQ/bSo5UlQwbGZeIUkqXzEzTjNLIz4lYk43KEB8TWV7ZkM7eCtNPVRnO2ZlKmttCis1bnRWJlM5MyVmVXAqYitSaGMzSno9NGNGKTlkXio0QExrKjtCfldnVnZJQHRsQzJ0Kz1xZ3ZxI0dvdyg2UlVhITRKdj08WHZJYn1uQ1okCis4YUNpZypTRnUxQm08SFhtd0pyJGc+JnI8alNNZ19vaWRgb3dQJDQyTk1KayRnV0JQdzdQfF5NQFB8PHp7UkE5fDx2SCEoRFcleyF+VyVACiteZSVFOEdXaClmd3Z5eTclWiVkRHt+RCR6V195MEBGUnZYeH1ARiZsUyspbn1APF5DOUpxJE5IRnpZUk5vbEdrI3IzJSVBcjZxTXNQeWI+CitPR05jQH48c3BfV1gkbzs4K08oc0JOemIoLSMxNTQ3MnMmO29GRE1NUHA+Pn4yQ1g5bThXazlNJEg4XjdJNDBhWG8zUFJDPy1zaUBQKipACitkJFBXK3tlK31LZk9CTFBZd3pweSh4ciFVYjlNKCk5M1FHJkclRVo5bT5yZHc5O0xeRklsYHo5RDV7c3haJVVZViZqRUo4fEp1YEVLXjA8Cis8X2JNKEtiNGR3S1N2Qig9SUp+VGg3ViZWVHNifHFQbDwjJjI5SENmQFR4di1YcVZabCRSWUdNeUJaQ3JEPnMlMVdXfF5UM2tyOGQ/REk3Cit9MiZhfTY9eSlMUCVXaSkodVNBI2xgTDteX09NIX5wS2QxOVJBNVNjITJUO0lmSE8kLUhjdk0rTGAwb1FNXk01bD9uZnx7M1JQPEo7bFZjCisqUTt4U1pUN29MOFcpb15RY3NKdUR6Yyk1NjVGcENEN01SJVJpaDVxVztNWWlBJFkrcSl8KEowNzRJbT9ONXZrZ0NwTzdyQTRJPnxjbChXCis0PmY5JGNIcD92Vl5Ld1NOKnJ7NEF8ampPb2RgMm1hPSElR0l6UEI+OGs/JihUNHVJa2RsdnEjP29FREQ1JU5DWlFhVGhlP2MoJjMrUyUhCittdn0rdCZ2PCNqRTAyY2F+Q2hhUmdZMTNTRHx+fDY2MzUkJHlLeDFFbGluPmRPPGZpMlFrRHd0TW9gT1lDUFFCI15nRDsjcFJTYDhJUG1yCisqdH5qN2cqV29OeWltSS1YcmN5WSg5YERid0F8QWY/PEg0M19OS28pcWJuYTQ2cVFIVVBBNmVVSFg/aCg2OzdpYnMmWjkye0FNJG5LTl94CitzSlUydz49WjE8KGpGSiQ0I15tfSN6PDBheW5jYXByVzJpcmxDQkVQNngzUzg5JT5qTV9TQU58Ml9qclliNWc1ZzM5RUVXZHAmMXc+UD0rCis4OGhNO2lAIXpxO2Y0NmZoPWkweyFsUG5RcnQybkpoQThUZWBkYnpZczhpSXFWRXNRO2ZeTWd0ZTtSbjttPSE4Rl5sZFlyQkRUPEkjZHhlCitDaTl0R05gRDA7ZmomM3s8eDs8fVlYTFhMWGVyWG0yTWxYZEtlM2VwWllDaDdNNEVLPipLKUE7N28qaTIpVzV5N25yVXtWb3RDUyh9a1cyCis2fk1FVXEjXm0xP09aYUk0eUZ1I207X3pBe18mUGFRSGZyWllZdHUhV0hVfT1EQVlwX3gkdUpUKi1iVnIxZEFAJTEmVSpaKmIrYTYoI1F4CisxITBxUEkld08wN35nOFZgNXhvYl9ZZTwjQUxCaXJ4QiViUzFlSnoyV3ZjSFclZDlTdCNZSkBDLVE0Tzh2T29ae2UxUjspS0xTfnheXzQ0Cisjd1o/eUNfUSMqQ2AwP3lDYCF3I3AlLUlSejMldGBtMV9JOEQrWGZBVC1UY0tGRUJfMyh7RHhobWd7ZWQrLVV0RUtxUXFxUU5hPkNtaisjCit0ezRHYyNMXjhNQT43UFEtaXhSU1NkT0kkcz56OUZZPjxnZU93KmRWPV9SJFVmczY9STthR204YCtlNyQxJFhxTkR+YmtSfihTcnYxakdhCitzZilaYmxIKDNwYio/Ty04WnxaMH1PSWozLT1mJikyT0hhVzclODd2cmlBPy1AcUBUbk0qJD95ZWd6JXBPbz5zWWdqVG1hWlpRXzk9MG1sCis5Q31yWnU8fEsleEE7cUl7IzMycWE3KnRHMEhiY09ORSNaN2gjdDxQeWRSfCY9XnVLMCgte1BvTTFIYEh4aER4cnNHUnhVRnxhSEBWMDVHCit3dXlSZTxhdT1LO09MSCt0M1lGbkpSUVJhQSlDLVNvNy1rSXZ6aWBESkkjWFBjNT9YWUM4JGBzcTRsfClaUyFwNE15dn4wS3t3dn1VVjVjCisxY1p4RUNVbjhJcWFycjNxdFhwMyM8Z21CMVhEXjgpKjNzcVFkeldsNSg/SSpGX2NIVj12OVF3em0qZF5PUFZLNGdaWHs8SmNWZXNGcSRVCitiKHFUPGNKRiUhQEJAUG42O0VYSzFmQTdLM01XKVFDSDwrUD5re203WkdxdyEkbjJATWQ0Tn1eITUjVCZYZ3g1MzVOajspblQtZXI0T1YqCitNK1lAfiFKNF5PbTJVVjtvWSpidSp4OWFvNGsoOT14MzZfMCZPaEI7TGBZdWV4TVREUGc+S1dkYUIwbWU7JE1wND59JCRkS0R8QWtNQGxeCitnNyhgciZ6QEQhcmpTej9gd0tCS3ZObmpObW0/MUAjSXp3WlFNNHFhdiVwMnEyZ0VrbkItd05eZ182c3ZIYnhTPUlpIWtZaTFkflI4dUJLCitfSGNCZE4wb3tgQ3l7Sj5SY1JyQ1h8Qjg2XnlPak5oTD1qVlU4OEhJZWEhbSVhcEkzLWwpU2RFeGhMQEI7U2dvYCVpbHQlYjRuaGk4QFV4Cis2UU17QHQyNEQ5VEhqK1lqJW9DMkhKb3BeYmZ5cCEzPT97bHhBJCMxMXF7eDE4dkw+dGhfVWl+NzNKOXdvZjVeJmYkb3Y9WlojenJBTlY+CitjUSNTaHs1empWaiVWZmcxZXtnTDFFc2FvYWc0dU1CJlJzU3U2VVpXfnRyJjIoNWBWMGVzSGVeKz9nejMqfjB0QkdQZj15d056OVh5b0Z8CitvJE9XbHV8QlR6MGRCIzNjcXxGbz9XIzB3JmB5Pk0heTZYQSoyQSpiNVNZcmJyM3tWTX5UdTZ8YDR4VytuIUVqOD0wPEc2SURIWU1yMnE4Cis0eURrWT4tZlpBcXpBcztkUjFxOWshPWRtdF9qQGhKSDg1Y0p1Tzk/ejZBNUZTfTAlKlNYaGMwU05qJjAkSCskcT41ZmV2WVVJZEgtIUhFCis4UVVDWiZFb2s+RSg4TFFAOX5IbWBtWThrekkrcDFjQEhlIyh7bzswXnBsPDE/LVlBVDcxVEE1OGNzZHhHZlMqOFl0OXp8JUoqZmYwT2hpCisqYHRAWiU5fFAmMXleS300PUFYRj9Ydkc3OWBud31ALSNKVShjdjNAZmIrfHxlKFM/ZUxyYldYZjtATH4+RTB2UDF0VCUyNCRFYVAmRSFTCitUNTRYZ0d9aTBwJFYraTZDYCVKK3doQipzOEZrQTE7SXJvS0opKVJwKUJ0MVhqYigleVNAS2VecTt1UGJZLTxtQmBzK3BYKWNjVyRGQUd2Cis4R3M+cWshbiYxWGNiI3Y2MiNnYXtkcVN4enxuRD81YytqO3BwNSM/a1dgO2EraUstUjdMc0F9eUlHdTQ+VHheO1NBfTRiNGRNKygjdjFMCislS2VZNnRXPFZeY0teekxRdEsyU341ZGRhIXFYJC1hUlY5JmhuRCVfanQ2I0YyZG5YYm0tX288fH1Pc3d8eFNjKlFiTzs9VlFjZmU4UH41CitjRkNLa29rU3lHSHUpbCUjWVJyfk18NXUoSEdOZVZXfUBiWm9nSkBnMjlFSzIxLWljP0dfRWgoY092Z2NMQ3F5PnkrKjgjQUl+TCRlVnl8CislPTxnQ2I/dVk0LVlWKV4ySGp4KXQ4M2ElXjdwMCRRJDkkVHAwPDZSfnZLOEsoclk1SERDVEB2biMwU1R0YjgmYSU7RlJXYTk2ZUx5c2NtCit5PTxMQk0kZm9Ley01aE5TbWg2e0F4RXhEPzVjZ2VYOUVEVnBUezdFYWI2bCRoRCZCYns+WGxiYzhMODshJG9mcTNEZHc7MW5fZncrWjNvCisoLX01djB6U3B4SnQpQ1Q8PWJkZVE5WlZmNV49SXpJUmRxVkZqOVg3cVRjKHpsUz49MkJPO3VuI2xVVzFPOGpZPXVKdWspPjRCaFdTIVlJCis2Unpfcnx3PVFRTk1MJWxAIW1Xc3FvYG9EaDBfd0ItMVNkaiRuOVBQTngoKHlmJTNHPl45SVZ6TWJAa0VsQF88KyRwQj1wU3BhKldtamhgCit1Rl84eFFjeT82JnRwcUFPOD5UR3Q2cDBXMFZ9bTVVVUB8OExWU3lvaE9oTy08dUo+dGJKe1M8a0BMZFo4fjtTQSVKOzJaPUdgeEU3N3BwCisjSz1feDFBRSFIaGQpMlF+OT19QGNoeHVARk5lbEBCIyVLYSRpeGlGezIhKzg2am8+KUwwT3YqOyRMVVdDLUFqaEoxVH1RXjBqNXtZVmpLCitnSjA/dCtqPU5oRmwzVmRFdHglQmgtQEd9RX4lKDRZQVNCeVh4OW1ROFUoS0ZCe1U4M1VoZS13a0Vqd01lOG9wdVY7eUA5LVFecGx7ciM0CiteeWlVbmV+OSkleXZzMCZvekxYYzkhSUJ8UVheJnA7IztqSWFQWFIwNm19RVB1elYjV0I0YUg3LVgqKSZjVjZvUiR6OShPX0BzQDlLJlFSCit9aj1MIyZgNEtOcEZxcXtFJU4jI2JNO2A9JVVWfXsoTF9DRDExe1JWYypuOT9rP0pOYW1oSmZFWTltU09acmkzUTsxUS1TJT5JOCNGKDhVCitkPlFLJipqY08wQnxkNEdSPXJ5KEYzWChMM3lnZzBQOGV5el89M0xhekckb05PWUdeRjVYSkwlYFQ2aUk/ZmZjOzQ3NjBmcDVAMHt6M3E7CitGQkQ1QGRtdFVNQUJ7YVF9RyohPldzJE5QLVlTWH5gK2stZXU9fXM9QiUkWnQ2NUd5fT1XSmczSGc1OUIoJU02VHRUbkMpIzNuKjgjZmAyCitlWEUwMVVYeEc3dShuX0JMPF5KSUUrdjh6RWYmNyYwJCR9dipkTz9mPmpFLXUmR0NzR1FKVFI7eSFeeFZYQVM2PnklPmFPRjM1czBKQVQ+Cit7IzRYM0RiTHtvUT4lNUJaaT4hcE9HfGVzdUF2QjRSaWNSenFub1ZVRztib2BrOz4rUjBOYmZtc3FKXnpoPHBaRiQrV1JZYWI0PUdEM1BHCit2JWYxV3l2SSMwRVc3SGlnfkNLS2QjaDNII2RtTTRWTXB1T2UhUkR6YlZpUHVGWTEtaCFaaiRHJEtXcXtHa29rZHlJOHZ6SF96fXtaZmJtCitFb0Q3VzFtIWZ8QSMmcUpIPHA9Xig9SWdDPzx8KDBXQ1NDUSFyTyQwXlBOJGxfJilsMmJYVz9+Z2ZgZDdDQUY+ZXVOQn5NeCU7OShUXiR2CitZXnt5blVjcEAkX3pxJjZ4enVwSXAtYXhDKGZOdSVyMmdgK1RiIXU3dTtgZiFScWp9UH1oP08reUttfE8/JW1mWHchb1hIXnZKcTxrdFRmCitwMHB7VUstOClVcGNsZyppQkRPVE1vJERFTTU3cU1obXpvSGdAdEgoO2lfRTh0UWRCcH58c3w/Z0V4aHVsPzM/RHR8PFdXNT4+fXVYNWckCitxVU0wK2swdXV1ZSk5bWZCWUFMdFZ+SFgpc1JNKmtjaF9SeXpUMlluTj0wQmdPazBAfiZ3fUt4Qkw8JEZCaXhrOVF0UTJicTdJc0I4bFYjCitPWll9amslVm1FK3d6UnhTUD10Sih+MzFhXzwrWnhKWU01NlQpKzJDbjM5fTxTJEopYFVqfDx4ND8+Nlk3ZSpWc2tgVjMtZmVDLSlNYTw9CitSKlpyS1Mye19gPytufEREY0pgRVRYO3RUeCRkMDhkZzYwPmZRb2EjOWMzbG9ualNZP2NIOGxWPUoxfWRMeiVuRCtOdGdJM0pERHBtRH5OCitmJTwwVipNR1Y7czRSdDNDLUU3V35RQ1dkMlQlTmd5JWRlLXFJZzZ5UnItX0N1aTQtbWBQQVhBT1R4TURJci1JeFJYU2UmQldfXzw3V188CitVOXxNODMzQl85TGNBSyZiMkBjVlI9QTFueEhqRyRsKXJEJlhCTkUpUm4zYTQ/NXtNPmI1b29jfD5ucTs9bFYxVnhEK0RIVz92Oy1fWDwzCitRVHYzfW1UNDdiUURga2VDcjV3IzRVXko0UzxLNEtUJEw1VmV3TSVAbWBSa2NOVkdhZ3U9SVlWeHgmM30jaShQUn02Ymt7QjQ+MDN2Q3R7Cit3NWZgVV9pcm8kdTVfNW1oMkl6b0oxZ1RUY1l6NFZuS0pBMCRDZnI+WjZAd0ZrNkIlQXBCdHJrWGVhLUthY0F7YEt8dmROX0pTQEd+aG9ACishMlJwTiV8OHV3I3c7JDZ7T1BNOCpVYGs5NV4jfiVTfDJ+PXdvZz09Xn5EKXx0cCRjYz1JXzhuIUl5bUpPK0V7SCpVJFBRJjU0M0VZemItCitqPk9kJjE2T2dZRCVmMjNjd0pyRShqdCZtSzRxZzhsOXFOcz95aTZfMjQyJEVJKV4hNCtfflVlYy1JU15pVVNlbW9hQDNuQkYpZTNnTWQ/CitnZlhEPiFFLWRMVlo8bT98ciV0XmZeeWlpRWdwTUFLV1pEPmN3PCN2d0Z0P2NJX092KEchaioqYkg9YShybiFtfnA3YXpuQmRldVc5T2t4CitgPnJCNndoKzxzcnNBcWVVbDNJbyRKNjM9aXp0K3ViQHNGN0YmJU1XVihJKU1JTzgkQV40eFheYXVzMUptdi1eTStZSyN4bkRkJWFhcFA8CitxXjZzRlgpUj8tTFUhYEJPWGpfKXZ9fFI8ZURDcC1vTDY7aHckWDNlQFN8PkdzN0BRUFdhKTgjU0c/enVYNkpCOEl0Ym9NUyRDamVkT29zCitFZ2ZEPHEldkdDeSR3em8qcjd2ZmMlcUkpYWIzMjU8V159SzxKbkwrT3c3YUFXb0EhTVY3dU1Me0ElamtYc1RUUDgzOWVgZ1dmZENEfSRhCis1KTFab3o+e1l2TENodzJKTW4tUkR4OV9waTVQPFc5b29tK3h5JWk8I0wkXzJiaVNkaWUmaSQ+K1h1aTEteSl7ZyQ2I1ArRTtoTlBpNWMqCitYLUplPF5RTTk2dFI9OGhXclQwPFNMQ0BDRVJGOEdXZjU1M2hrSWlESykxdl48cjZQfFkpd1RyQW9hcj0+Tjc+OyhYUjh8I1VhVHpRQWomCitsQ35rUjVtUE5zMmEjUnpkIUNOJWhXME15Jjx8SGUoVDtMb0ZGP2dOV0laKDFRN0o0TUtIZTs3O0E9N1ptNHJKR3dse0RPSjlaaUJIQFk2CitjYFFCO29KaFEoMUlUbV92b0l0RUx1a2JkbHZ+KlljQU1rbiZKWDI0N2clQ1NoPlI5MjQqKCViRiU9ZTBxdm9fTz5YWXAkSEZzOUlJQHd+CitMRj4zVjw2PFgrPktPVUJXUHxmYUtldzlrcVBhdEx2YmM+Q1ZCJGBfckh8dWROeWt+M095IWEqSG5AbVU1PUhhMWU/dkEmO0g3Knt3dFJlCitmIyNKUV5tb1gxPlgkUmpNYylIWHRLUnFRVDdyPlBkYDNKPDt0ZXFoeWQ0VjRedE0tSFZ6Sz5LeEJmTEs8ViRCemlFLSVKdEVmeXd5YHdRCitSeT47TCRzPVhLbnhBOHEtNUBXfWE1IXVwQHoqP1R6ci1GMUlSNFFZbFRWVllpb0I4M3FNJjUkNVpncUppQ0NZQSojTVohMm1lUUYhSFBUCit3IWxYYkVLfjNHemM9JEQ0eG9BZlEqRFM0dVUjM1ZKVE4tUkU1R0J+QzQyWWYwQTUyciNJaUd3P1NOZ1ZEaHk9MF5DKy1kXjIpZiV6V19jCitFNXo8QzFqckFwTSooM3llN2VCWCN4VWRnc3hObkRjR0xDMG9pSXYxPDVyPXFVI3t6NjZgPyVsPmgtQVRiMEFrMVBKWktzejg+bExJPXdfCitwIUlrTGBSKHQ3Tm9mRjBENUN0VC02PHN7NlNgP35xc29BbHNHN1UpPkYhZjJLYCM1NCp0eT5QdDwxO2dWYFFRUTYxUW9lcVQtaF9BMjJUCitFZ219VVNBVGFga0trNyhwc18mVUxUel9ocF9vaWhqQSpzQkM/NiFlM2hzfmgzRypYO15AYUckP0RTZWFRe0lFPXVARTt7czhZPSgtRnAmCitCX1QqK084TmJ3I2FUM3shZVRUN1lYd0Z1TyM1OVJuUzNpZUg7ZG1NfDw7fGBHaHRAYD5sRzUoJEVfNGw2Vy13em1tQUImO1MxYEtpQUp5CitKYXVteDdMakc8c0pzbX4+aCtnKHVwalE1fkt9djUyYmt3VUFmXnZacFpTVTQya1A7eVVUQiExJnl5cVVUWTRtfWc+fVVlIXYqNHFQemROCisxVG83PEYtSHBgRUsyfjM7ZXBQOWF9KFVyQSFURz98NGdYbF53TjV0JG89emI0Mj50bWZ2JFYmVj45TzR4WWB7TDc2bHw/ODQ9SjF3SHhWCitKJTRJZzAxMDk1WHZvbnpvZntIS1EreSEkbkhoT2BFKWN5RCVJRFIxO2NtZTExQ0FHNVRmc3lKaEtxKTNZeis8YWxacnFOKkEzeDB5dUQxCitucHo2ZHlaZCRQO09xMExZd0x4N3M3Tl5VYXVuQ1RPNihII0NWYSEjdlhZND9AKSR0T31jRj1pRnVBM21tWFQtVnRhRnE1cVl0LShNTHo/Cis/cEkkWTB9OTxEOHozIWoqWjRePXFtK2Y0fDJ1O0g4NlRYYTZOKDIhZUYpfGwrPU1tV3FaPTxzdCtfcEBTTyZ2QGFzaiZ5MHlWYD9VSCFgCitZbWRvSH5NKWp9azNpbFFpNGQrbExHSjNiR0wkPDdHYjZHVWg2TzktSUV5RiN9Vk8kSX0mVVBSeXtveXkoKWIjVmpWO3txY1MjanhhfU5HCisyZ0peIUc8fnFSOzk9X1NzUl9URjZ0Vy1vd0xpMDskOXBzYHJEJFNHZzZxYERDS1hCdk1hYllySGYpeWRSKkpAMmxTI3FYJmEhJXVzTlFKCitCK1NPWHBSSnBuendxS1VQMjE7X0RXWEgjJDwhVHBQTThzSGZfZ2xXbjJOP183amxUY0Q9Jn48S0syWE5BLVpoViVBMTFrUEVGJDlQUzEqCitDP3dNX2EoS01rRGYtPnhwTis+LVl2RCU1fllWMCFZUSU/fGk9dTR5WnM+JTZ9P05BUWE3JUpAT2hpdmNpTWo5b1RIfl9FYWBkV1Q1VHVICiteemwlUk0xbXw+cDhhT3hHN0hENE19anxYJHItYEBlQkRJd1EqSWRAciZPPVFrYjdMMm8/ZGRgdnQ/VnZ6PjZWZzwzJEF3KSQka0xJITYhCitTXl5PdF5vMj10UCF9NFolZmY/cylOYmtGKDR7azd0OWJ5biphYzRvMmlfczd1N2FPMkBGPD8lVG1PNi0ofX51ZDhvbCtAWklhPHxNemdZCit0WGZFSH09PCVKVD1nOTNAPWBINnZ9cU5Cdlo/SW0/PSt9YE1OaTlKZSpFOUlgeHF3Pk5eYERPc2dLJU9gY2NlP0RwS3pFT1FzP0JlVjxkCit5e2xNVyRHKmF8KkU0MmxIZn48ISktLXlXKXBeZWBePEtCWnpLM1R4enp5bHFESURyZ29FVig7e0VncDJgUT9tfTYtSTZ6PE5hIXZ1N1NpCitVKz0hM2N6JXhBT1libTBfJXtfezV4fFVZMGMrYFZPZTU7eFprTTQ0bFhIbHBreDBMP0NANFZRamtIYVBvakA5KklKQFNOJVBhQiFhd2I0CiszOWBAU25TU1U4NCFMZDk0V1JzUXFEWTtMbU5rYFZEfF9HSDhGMXlwdkZoa0JQWWIhLUlSNG9uaXxOSUp8X015Vnl+YUh6NGckUFBCJnNDCiskWEgoZWlEeyFYN1JNXns5cmE/bmB7Xz9wQUF3TW5hNW9nX3dgYVJBaVJXRHFhYT0meXkhTWhOIylvbCNJaykocS1pIVAtU2VfeCgjaEJsCitSVUBPV3VMeSNZbSQhfSZVKXFBRGJ3byRSJTxDKUZqT3hxXjEoYmNCN3FTbnBEZ2pwSSRrZDVFTGE8S2hVNSFVLWc8UCY1OXwhe1lJN3Y5Cis2dEEmTE85Tz42cyViY3F3bzt0LUBeY1I5WlFrOTdjQjkxQjVibjR3Vj5sd0BHWU5MOVJSZkY2RDg/cSQoX0JBKE5NeXVReE4pUVBpIWtqCitCdG44ZkQ1STl+YExtWnAoeC08UFBga0t2KzAyUjhxUVBsdm1FQk13TztWWWp2SUB2M0A3Pjw4fVdjSWlKJF5ISFJibENrYnVERUIjVS1wCiswZHppV1Z7MEwtZVJVekJvZ3YtPlowXiFJO2pxVXJEZHA4V21haHJqPihGYVBxM3trUStQe3B+OzZVb2dORVRSencybD5OZSRQMXoxdl5VCitEK1RvOW5KYGBsX3NkVlE8bFl7QGVaVXw5KSR1VS1wbU5xa1N3cF87JW4wNFo2KChQe1lJfnRNOWtJVGVleUR1KW1kO2A/YHhDXzhAa3t5Cit9YllKS1pke2skRmlJQ3RoZjdVKzJffUA5O084eFlUMiNNPUpGJXU/Zj9JbWA7fnpBKkg/bzVefkVIQWVjfFh8VXApVFQ3WUJjTDwhXiE/Cis5UW88PnpwYyttJWVTIVhYODlOK2V8P2VJYHsme1AxTmRzYj8xO2E7ZV58Yno5fGpVV01jWXtsKzhxbHZyQn16d2dhOVFZQ2l4NDZmb1gjCisqMTNMT3kzX1JOK0FqfGJCK0ZsU2x6RSpybFdMNTU+MDVUX1d6Kmtzc0BgQmFMNnNUI3pENXpiYktubntERStYayluNGNBO2ZjZ2dvJTJwCitUKnd1fWhTVjFYSVhGR3wtNjcpR3JYc2tMIUx0flQ3alRidXpMaEJPOTRuIz1ofEZoS043MjVNIVgyKTFeMHp5KElYaT8kYHVodU1DJCFzCitOdXlPfWNzMzl6TWNWOGA3K05sLX5MKWlvaH5UPTxtcVRXKjNOaDJPUXVnbWd8PV9iSkR3RCowRkpmcj9SXzZMRFEoPj9nR1ZmYjVCcmpQCis/Zk16Qzk4PjA7dSpgI0hTJmlBc191JGMkaVQwSUd7d0d7K242XmtrcVFBSzg9aHQpPTN0TUlDclNzKyV9NDlxPlFgWEFTbipjTW8zI011CisyKHpYYkJgKHAjcGBwems3TU1QIUdCZD5KPCs0RWMyfDZZSUlvMGV9KGpvPVdyQjUqSGw0PUg+Jjw0RjgkQExEVj53YyUrRj0lcHFGWEYlCitqJjdLSyo8MzhWdTFZMVM/Xig4Xkxnfjg+YngmM0lyYHdFTWFJfSRKY2I+TGpuOW9+MUUrcThpfiVjKGk8U3cqeUBDQVFwPHZGYHp3bzhxCistJmhFdmRxZ01TbzxWRUZeU1Q8TiVjaTNpfishP2B4VVhCO3omZXtFYXw+QU4yQnZQfUhDNEFqPjReOUxWdE5xc0BVNEQ1QHZ2TD9XM2JMCit1Vil4T04rNXMqfj54a0BLVElpVSs9Kl9JfUJISCNnZzZmRmQ4NiF7ci1LK20kP1ZpYCV6dmMpMnQjWCUociVvYU9YKV9hJSl2cWA/aldVCisqMkkhWTJMcFJYISVsSnchcTJuLXwhTGZoQlIyJm5eTF4mYTRyOXwmMjdDOyNRVCFJYUJ6JmlvPjV6YF9YK2c8amJpITR5IT0rK2skVE18Cit3Rj1GNm1WNChjPWV0flI5M3ZaKj95M0Z1PHdJfVp6QkZmUlA2dVJjP29ITyNGVDNLQGNod2Z0YkEoUGpoPVhLdF9WaV9eJU8jQ2VjIVFRCistKkwke2dUZHFAJGczQ1AmJTtoRmcjMTRIR1N6XkNWXm0zeXVmNTRhUEU7bT4qNzw2cDJHeCpJd2YzeiVHdyNaQG87I0ZmZnFVVmQjbE88CitPdGQlU0AxNyQ+dU5qJWY/QSZxem5vKEB0dzUtaDdJTUF4Mk4/UFdnSilZa2tGc0dBZmR1c2lzOW9gJm9SRjYlVT5Fa1U/MjNJbFMxZFZPCistPEc7bFFURF5rZmRWQkgwdno3WVAxYjFqKFU1VVJgSE5mXmU2U0I5MW1STFNNemc4M0ZAM0AweFJiWG1SelRuLT8wPDY4WEFgYSZJZFY8Cis0dCtvSFdyUEc3a0BMPDZHODhaT19vYFBNSDwmXnN0VGxQX2FvR1YrTGNKUm0qQTI8UkVhcWslMClEK2hFKXoxWkAoU0pwO3ctVGFaSVJQCitqdko7U0AlelNRTkIyVCY/WGxlUzJkSFM+UCl2XigtYWNtMFA3QH5RbCZKbSFrTDM4KEk+SEh8ailIUDd4eD0rJl44RFV6YEA7ZHgqZUQtCisjSGFBclBURmF1YUktMF9kMHdkMjtzWjZJV2RTVXkrXzNAT3A3cVJOMWBAWEV5QTl7QXMqV3I+Y2xQSkYkTUVSTG9EMkxGU3g7O1g9KFBGCishYz5iSlFFNlkkZkZvbnshOW0pTHlFVXIpX0JLbHZOMzZYRlNEOVd+dDVIKDVxbTdVXzFrWEt7aUI+SkUqUWFnTGx4SG49SUhuNyskJlM9CisyRmt6cX4kKDg2emFfZSE4UX11Vl9nYXs5QUh4Q2d4ejhYUlghaVl1eHl3MjJxY3xHTi1nMVBaZ0hrdl4rTWglaFUyeVIzbCVtJUhwYE5ECit+fXVOdyVJUmZQbStuUlYoWnpzWGI7N3lJQj4+dENtd2QwQW9mbUkzYTMtZS0paUdoK3ZSMnVPd3JDPHpkenRmNy0+fm1CKnsyKjBidk42CitZMXxvYnZ7NDAxQlJaKHBII184dFlVeCNUTSMzdWc9cmZFcFFRPUVmRGZ+Jj1pUDdhKlo0UX1nXlhKbWt4LS1oQDg/Q3QtRnpRXn4waCs/CitlTD82P3x0ZnU9dFNOfUxYPCg3QFdvYTErQDQ5RWgoLVdSaj56YzRoMGtRanppQUNUVWsrd3ZWV2VZVnZQU21zbUg5fnpZMzdBU0NyZms0Cis8MkBfYD51eD42N20oNnBrfjJ9RWtPdi1fRkkhPlg/VTN9amJZO3lENGMzc2VqeUJAcTxobn5ZdzBqd3UrXk9ma0A2VE5iOV5YZ2A1NkBICisoIXJBZ1ZNNDtBakMjM2wwSlh2QHFhfVAtX1F9VG44Wm0yaiZiS2E1JW5wPj0/an1NOS1peU52KHVRMU9fTHg5UWR1Kk1yNDElPS09KEh4CitkNiZrazhrI1BwQkQpYUE4TGUjR205eXRhbD9DamJJcn5wNS1ePiRnZkRsM20pbGMmPjZKRVhScXwzQ0hoeng+bERJPiVmTGxpY3AmIUt6Cisqdz9vezh3KkB6TjNDKjRWXnRhektRMF5YYDIhPXdzcDs+SSljPGZLKTY/I1RsTEpvNXRqI0s+U0AwOzJVcSU1MCZmP1JjOFEwOzw0ezh5Cis9PVcrLUFLPnQ/PG51Q0tBYktrWnZgYnQqclFMPUQhXmFsfH5pTV49b1gkTjdNcihVMSg3ZikkUHpge15wSWdVUDJDKE9CRTJVQHU4dm0kCit8U3stdChvTVF5c3h0VXRScCtXMkVzRFc7QSMoJl9iPmxxcTI4WFI5NiQwbntNJHRHOChrekVPfG93WV5gKERPM0dXRnZ5YW8kRj8kYkZXCitoTWdaKC00XmxxVE13aFRBMX5me00rS2JMdyVCYV5AY296OClIQm0rTCF8TExWIytod3l3WDA9UytKNjAyWDR5Py0pe0U8ZFc/PyN3PVhKCitEVVFoRjdUJW1xOHZvKlA9aG8heVNjRDVrQXN1aytVZCFAKz0jM2pvUXRqWGtXIUNJUHw2K2xxdGFFcDxBblckb1o4VmxhTCp2ZEFZYj5VCitiSFJ3fFpEMzBhX0ImNVJDPlowdDJYbipLa3JKe1dVRzY/SWBrfktjTlJLIWdgS0txSFZVTUlJWD96ZzZkI3g8RCVhSCR5RiNeM3NwSEZxCis2MEhmY05KS1FPNlVDKXZGVks/dDViRWl5ZEQlQ3x5Uk1HdSNnemBsN2tsP1pyXzslMT1jeWQta3lHZ0llY2B9TjlrVCNSRVBwPkBUVXJgCitSN2l3TGQpMXxNfWxiV2kjPXhWSVpmKmNUPmNBQyVqMnVjcHVFb2hrPz1KalUxI0x5fHFxTkg2YkkyRz1PNkxtNntsJHBoT1hjXjhKWTVoCitHbzYqZ3FnSHgkNlclcEZLU0cpWk4lYFB9KHQkMFY7K0VeYyomc0dTMi1LSHRUKGBWfjxXfi18Kkx8UipvRGNpJGZNRTE1e0ElN09rO1JICitRNW9uMiQ2OHRCNzB3TjNVaEV2ZTRAPmV4SDJPI2p6V01MKEpsP3w5T1p8Yi1nQG4kLURLM3o7ZT5aTnEyXyY+Yzt+SjdrUFFtOTc1YUpKCislN3VMSjMhYnBeUV5gJnBob09rRSoqYT5gfEFScFdgLWcrZj9gYD5ja2ltV3hXSXB2blUoISEoJjVqOE1jKHI4fCRheyZedysrVnNmK3RACitURmNaKzRTXn4lQy02O2ZjMlo0TUt2Sngre3dIZFRCNlBlVztlVGdjfEQ/VkxeKDkpSE94YTxyQ0NPQUpNPDVNOFhUezNyczA7eDRuKF9ZCisjNDM8RjNVJVp8PSg7emUoKHQhelgoMXtyLXUwMWMhaT4/fnBLaXk5fW9kYkhDWiFaNTRlMFEkUjFMY2IwJnBPZitieU14VTFMeSRvPFZGCitASVQybXxUckh8dWlvPEZmenVBZng+UUwxdTNvMjxDKSktXnFnNE0jKj18KXYzQnhQQ304IzEmPTJnaHI8V15uU353QT9xQjZPJSVPNnk7Cit6MnhFQlFOKlVNdmZgZXZoTFVPUTk2NVlGNlV5cz1UN30yZ2ZFVG1jeTNXMGlKZ3p4bVFnKVJhPStjcWtnaV57eWBJMXdJWDtubWA/fk5PCisjPVklIWclMTxAbkc/MDBGN0oqOE4rM3QtRGErNG1xYDRiZjRKNnplQGEwdHJaTH5WXnJnPU9EcjJGSzNyIWROaC1DWlFrLTM5czRHVWp7Cit4RndVeyt6RX59RUU9cTw5Sm8zQytReGQtNzE4UENWSlh1QkUtc298WSQ5I3dlI1diey0ocDIjanN9YDljUms3S3J0ZiFzIXtAYH1ic1k+CitJTDlydmZvKjw5ZGExR1RYQG1JUkE2KjM+SmNKNSo9T29BaFZ1bj5ZUnpsc1RnZ2U/R188b1lQSzZ7JkhjRHV2Nmg+azMxKmohUVZ+QXtMCis/eygzclJ6cFk/bCNISihiJCsmXiExcCpvb2YweW9FVjA5VSg1QXNMUUZuaUwtWD9zdUhWWW5vcnVKbDMrPjNuLU9WRDEkN2I2eU9UZXRKCitUSzU/PyhZPzlCNDVLe0dvI2MxaUw/RitDKnJjWCk9TVRGdnRyWmVKWXc+N1omVD4mQFhScjglKFRNVStfJj1VeGxLeCpSenxUK3dJPEVzCis/RSFeYXlFemtOJiZ+VUJ6SDtPS0tgMF9pYT9nOV41WEllPyk1Ym5BOyp9Y15CWHdNMUFjRGxQQXx9MlQrdFVHX2NxclRBKk95ZE0mVVZWCitTcnJ5WTlaO1lneU9CZF53TU51aTxZKVpiR1JufjBCVFd7OUhRTSt5TXpWNF4mNnNHK01yOW4pfnEwKno5TXxfPDNUWFVCdnlXMzVwMzB0Cit6ZXpOX2h0WTJJenplPz1gcC0mdk1IaCg4PTtMezkjYDtRUEJaWEpnJDBsJGloWC1eJXR8ZVlzaEoxU2w4M1pNT2M0e24hOGUtIyNpeXxHCisjaiFfaSo8Nmh4KCh7PG5NelpMNylVaEFgQW1lUzc4KChzTCFwKjZDZnFNPFRwJFRWanJAeTVNZFotKzV1YGoxc3FoUDQzdj4hMWVraCVJCistezFYbVQ/aU5ILWxzOzI3LTZYfDJQZm0mPT9Gal92RVY2Y1Yyfk4wUSljamRuTT9mKn1XMCNrSnNJJEVCfUFfQyVMS3NwM21TJlY5MHh8CitZPWV8QjI2TiRPZTRTUUR6dk5xVjFgQEw2a1Z+TE1uSj8kR1R3MWhqez0wTzNpMnp9ZHsjciY+b2pvJn4jYmwpSHVSXzdmWXNecFYzeXtMCitUJXlEYmwwcnElbmBjVW9yZ0MjV3gpWUxSNThURUpTMVchbjJvdmcqbEREbHNjNUMyZT9UbjtpdF9GNTVNY002NHBISDUrTHFLZXw8NzI9CitQTkchblBeRzlPVH1JNT8wZHM0cT11LXBaYFlHRHZnR1d1ZGslKUtyPChvUDU7MypxUkRGdiEyYXxkaGAhUFUrNmNoekspMTMoZmwxY0pTCis9eW9mYnd9UGNUJEhvY1RoUXB6TG1+alAxNHFERSV0cTxVI14hczQxUld+ZXBMWTteSVI+VnBHK1V7Wl9AYFZtX0FxbnhBNXB5dEFLXmVICis3d1coNi00fEBXKnU9eDNrV3x5ZnxNIz0lX0RjM0l1YVp6byZzIz0kQXo5Pk94ZVBsciE7JVhJWW83QUpKQWVFKSFYWn1NaEw3a25VdC1lCitkI1BOPiQjQSEyeVdRWmVDQ0dOZngmM1dzPUxoWWVhbylESWIxYjhIbGF5JHxsTDJ2e1dqQChvX1pNK2Y7c2JPKS1zTHZXZyZmPThPMmZKCispTClVfkJeVnNLYGJsQnQrIU0rflp7U3NgYF5EUjV3R25JezxHYHxuKiNqbCEmYkFaeER2R3pOKGtlQEhIdVE0c19xRiEqJnRwdzkkREdBCitLJjc3dys9P1J7ZTduYkI9OFBgbXhNPVJAYkolVG5+anAjPEp0JDJMUjx2dX52b2I/VjApVXA+WkVvNHU3dHV0VjA+NWE7QFVycFR+MDJBCiskbiorV2ZWVD44TiFDK0hFMDZrZiMmVDZ2LXBHaFAlI3c3ITg3VilBRHVxKFJJKiRedTxSPFJrIWNtIUByWjBsOURBc3g1PVJxanJsZWNHCitxa0J5YmclPTd1ZiRlSSF0UWFeNChCdyskXl9+OUkzYmxiSlRoMCNsWHk9JTIlM0pXVyRrSTJ1YytXQXtzSjQmcF5LUXtzYXhnZyhIe3xTCitlbGkzM0RvdkBtPzleLWgoRChWVkBkKGptPGkzfURMUD5FZWFSZDctWEktbmJuaHpQN1c9V1pUbDUzbHA9O2d0PlhDaWx9TUBHbT5iSmBKCitiITNgTW9Ze2kjQ2NQRGMlViRhY0YxaUJ2PT0jcEsxPS1lWX1WRyh0fSt9LXs8ZHMpNkNCNClwKjwjUUFVc3hCISlPYFp0Nm5zQE03SSMwCisrd2hWe09WSCsoYWNSRUkoaEJpRCFQYjtHfHAtcFpPVzBEUlhTN1dTdyVvfUF5OG5URWIyIVR0YnwyJTNfZT9kWFJAT3hqbVg4Qk0jSiZ8Cis4TXEkdlZnWEtFQEEkSXNWXlRgU1U5OV42dU97UEhsczNBYlFISGJPOzlxK3FVTThWKWdzdjJeTTtuNSpJfnZtIVAoNHJaKGk5LT5tY2prCitJezVkYnFyMnc8KStvPk1PR3A1cT5vcypLLUJtO1czTW5lLWw9PiNLQW8qVVVOKVIzX2oyQ09KS2V0WkRwd1EyS0JYX1pvbyE0MVVTRlMlCitVX2oxYyYpcUEqQFpEfFhUZ1d4TFRHRjdaWkdIKy09SW9tNnA/VkJzdypiM0A9U2FLYGpAPGRpX1QjS3gqan57QFhnb2k1eUpIazcodTV0CiteT1ErfHFzPlF8PVd1PD1xO1A0N192V0Z6c2x8MUloPXMqcE94IVZSJEtIcCFSbX5UJno4a0xtdkclak1wITFxJmpxQXpaWCZDYXVJNDZCCitzanNNJX1WR2s/R2x5ZCpGRTxYOzhFKjUmPH48cHxldmNPQ1NxNXhKclUqSyopfVEkJldpbXhERzk5OEM+MD59RX1PWVQ3UzEhekRVbU5uCiskUmlEPlQ+NTE4cl9Ye0BociYyPz1AbGtfJTRUY0hVPERBX0J1Yj8yKFA9XjxMPXQqMztAcStDb0syeFkqQlVlYn08cDY4VUBfXk9KSU5vCitTd050YCpiNTZieHBfaj5QWn00LVR9X0Ezby1FOVQwdStrYnd7cj9YV0BGaUxzY2BzcFg/MDUxIWNBYFE+YmlpMnkleXRHUSg4emcyLUIqCis2QksoeUBZPVl2TnFPNFpPOW5XfEhnIUtDc1NAMCYrQmBBayZjNH1LJW5CPlVDcFZ8UGY8c2hSYEwjJCN1ZmZtdnNuTXhYaDR8SFNPVGNaCitaaEw/VGdzZD59d3FpfWQpYTMyYjFlIXBwK0V5RzVJZkBMbFJuYTJqJTZUezdGWk1tezJ4WWBhJSRfUTZHUWpeTTQtQWpJVHt3VXUhUylpCitKJiR+eGRBZUVuPTBoVnd4eT15JXRBaGtfcX1ebj1DI2ZpNUA+ckJIbDwmR0BHVCt8fUphZms4OFUwWTZ5dU1mTlgtMFojeDwwRkRBPlktCitGeyh7flhKbUJMTW1VWSRITHZkO3h8KShJKkQyfDlJOHFJZz88MTE7emt9SGxxUU0hJmU8M0NqSj5FQU9nQXEwR1EhR1V2Ui0tV0RIPX4wCit2MG5JYURvdkFAQys4bjJMQHFNOzJjYit0MnlzRkxWOH1jZTZxRWt2Z2ByaU5DcCg8TmYtejwkTU5yJEkxR0BYbXRXbnZXUipRaFFwZlYyCitKOTc7bUVSQ0FvQGpIKih5KkwpRGNEQFRZaWNeVzkjd0c2cWBzT01mQ2gwcDEjJmZyM2p2bWhtJnt2MXUzYj1IY0ZNVT1RV2M2bFl1UUArCisxYCo/SjRhT2peb3k2TnlkXmpxYk5BQkZ2cmA0TGQrJmI9RDw8dDRvNTkjQFlMZEkrYDtQSSRPRV5gPiVmWUZMPV5DSEsoNkVrdS0jOGs2CitWRitqQzN3KklOVEM2P194KyVKI1hMb0A5MWJsLXJwI0EkUExQNXstOVB3WT1Tc1lzREp2PTI2RUZBSmVHPW0rYHFybCF2e0BocTF4RD8xCis0UUc0JGFQYkFZQHAlOEhnMEooaTEqQUp+fEFGKntSYjBgbWlVfjhgQkVlZ3MrMnFOQWJLTTMwQlF9VmI9RCNLd05uSyowfXhoeylySz9ICitYKHpoSFdtRGVUUjZVJlhNZn1zTX1YQ1F6SVN0dz5mNUJ5QnwrJDFxUElQRVooUShjI0RfIUdyaj5lc05YN1ZzY0QtdWk1NH55RlVLfUx+CiszJW47VDhWQj55VEBEKXQkNUB0KXtIZHpvJVdGUFhkIV5rZ0pKO1JAKm1heC1uRXVNI3tJcT1XdTZwdzsoVk9JKD1uYl5lSlBscjNGbj9wCittJEpiZW57aHs2fkpqMzAzeXttdHRkYTszdlgkS3Z1ZlppeFVOXzAkOTk8OW1JPkgoUXwyRjxgPj00TVApLVEjKj5PeHJlez13LV51Z1drCitjVVQ7TVAtUEZacS13OWNlJDg5I1JMKGA4PGlReyFSbj9iMGV+MWtYI2hxYEs0aXtfKyU1TE59endMd2tpSTtzaD1mbnRtU1FGQCRoRGV7CitHflglOW1lYUx4JThjIVBgRmwzalFERi1Yek9XWlFCO0MofjQ5NGU8KXN2SmhAfjEweSMpUjV7Vz1pQlMjPlZrYyhiSzZRVGk4aWR0MFBoCis8P1QxbjQyOT4lI1pzeUBCSjZ3aHI2NFpna1ZjMT9ZWlYhYklueVk4KkZYMHFMXzMrTH5OWmZpemhQKV59fXdad0dIWn1TXmNEVHcyb3tOCit0a31HYXhOfkdwa1V+Xl9ofT5QWENKPkt5Z1chfUI4VE1AMHR8cHFfJS1nKz1yY3g5ZlFvRDsrTHRPMWc8ZyZnPWcpfTxQOCpTSEU7I0JMCiskSTZtWnFrPTBSdjVzenpHcS1TUDdKTk1pVEk2NiVWO2lCJi1Idzt7Zm0jJXcrPio+Kn1zRXdzcXt1JGokenUpfTAtfE9Qcnd0amZ+O3JsCitrbiZrcCEjWCNCWUluXz89Q3ZuVGBEe2ltfVVhY25XVSQ2LTtGPGx4PjNPPTE/c1NHNHBPMHkwZjZfMHEqeD01dURoPzlebG9aREZ2YkdhCituIVRoZUlHcUxSZVUzN2lTbk9UQmJDVDMlTigoNzNpUDImIWpqTWQyc35uS1pMeUBFTnQtKVh7WjlyYTk5UkxtdV5Ubm1YVGFzV3woRHM2CisjKTt4O3t9X2QjbGU8YW5tOGlaeTgrO1c8NndwJHtJJGlLM2xxOH17KkRIKz9ISyYkbH53LXhOdnskRF9UMGw0SVdfRUZSN3tqUSplN0Y+CitYV257bXBCRjE9NFJlTF9rZDYqIWVsY0IoVkd7Kzh6OzlwQGBefE9qP1olSlckeygtentSTlRWeCNDfi0tWHFeTi0jaHkoVWRLZSooTW1UCitmPzlQZi1tXi1NPGxpcGZYVGhHI2N3SnZVcSUtSCVGdEZMMiQ9bXA8U3tfY1NIaGNHSSRxSWtgNTVCT0dwRkktfWNLazxwMz12PHFLeGVgCitYfSRrfmNzT3YqWEt5VVhscUEmbiRFbUJeQmVyO2tBfW9kfHNoMHFmWn1uSjFmOXFvfCR9TDlOT3NOdyQpfVNPbk5xR0plRWFCVDZuYzZQCit8K3U7O3lTRypsciFTTnJ1e0VBfkNtUElYJjxpK20lOz0tIyR+TiUxZXpaI2pKWmdEeFNORWooV1RsZGtgeFU9U0Q8Uz9TYGxJMzdhWFk4CitKdlQyIXd5WTY0fFA0OGBFRFlIci1oYTNRez9mezcqQDYpN1R0RT0pQWowOUtEN1lOX3NHRTVJV0M0UDlwbU9iIVBlQTZtKyE+LXNCY3EoCitvdHkyOHk2eFYzQDhlbVJ6TW94KWReTmw8VFh1Y2hrZkNmWDdweUI9c0AtPFQyKlRaWlZqR0wyJHFiTH4jSz5QVUo+Ki1lKk02YVRaIUI7Cis5OW1AK2NlUU5CNjs1ZntfPThlWDtAJlJHISRVUksqJi1GV1VpIXRxN0hPKlJ6b19LYjN5ND98TFF2IT0wY014REJocl5hcWhnQ3x8PGNxCitOQW8tUkZ0M2w1Z2tKdyE0IyZifWhPUDxPMCplQG9DY1FRZFVzI3VMQEtwPnBvSkEyZylUckNZeWExKCNJX0BJZl5XWVpjWV8lZVojY3tHCitRKztjJUZEJjxIUigtQ145fD0ke0crTjJYKmgjaV8hQW9nMWsyVGBsPFdJYGRJSklfdyZ4ZHh9OUdyK0hgVlIhUkNaRUFrRU9+Z0tJQ2lZCisxU1F6TUA/UyRQeFlXYW8lPEA9QXlJJE09IUBjQmZ7RHd7RTF4c1A0YnZZMHpgd2pNYzImQkheMX02U205MT43KSVMUzUmM3JEaUZaSCZ3CitQRFAyfThePmh5KThULVVSKj4wWnglSWlgTFNDLT9PK08jKlowQDRvSGIwenw+dUgwTjQ/eFlSeH1OMFVsPHlxPSQwbUcpeDNvP0ZRMTMoCis5LTBKayFLPzE9KTlAajVEZUJia28tK2FXIUIqVSs3fEtzMk9ffmhaPWJqXlMyMiphZEhfeE9ecDRjfDFzPFlIdmIhOSs2M3tFSCFCITR4CituNnV0Z2BJRTBOKllseUk+VyVhLXlmMjF9a2BZWHsrZXdwZmxzSDRYIS1vOXZzJTgzNzNjcGY/UXA2UUJXdmc8TmNDbTtfcCMwezgkWTEoCistLUp4Q0whU0RUclJ3QX0kN0s1LXVIb2ZiWE9rdGk7QUspRzFSTEVaYDtfWSN4TkpIeU1PQ0c9WHNXJWwzRX1USGluVntzaU41YEh1QTZtCitjS25vLWBTa213S0RvMWIlakg7RVMhVERuMEA1QWVJazd8NFNoMjk9MjtqY157cUQhaUV2OCNwZEtASEN8X0ZQMG5IRztoLXRzUSY1KGBuCitYU3FJMSF4fjVSLUVVXnZafmUxU003Mjh5d3hDNXNhRSl1S2dOfmt0PCZWbW5IaDNxR209SjNNNnd5S2g8PzlldGQqU2MyJHY8IStQaD9zCit7TzhUU3tfMnEoLVZQTkN0S0Y7ezk1Y0cjPHVOa3s7XkV8SyQtRUVTaF5xO0hnQHI7R1dSIV54KE5IPmVqdUIkRFFRRmV1KXZBJVlOKEN3Cit7ekJOcD5yOHk/d291fXp1blprZzl4YXh3NG9GYiV8ISpeOV5NRUpqcyl1OCl7WFFIYjh1JktOaVEoVCUhYCtNTXJGUlJ+SmwtVXBBaFB+Cit+X28mQzR9OVdtXndSP1AwJTw4JWw2NXFQOUw8T15iXzFMXik3I3NkJSpLPEp3dzByV01EXzwmaFlvaCVuUSh6OD5udyVWMn04V1MtOTMzCispcFlOJSpPX0MjWXRlVnlBJk5fZFVCY0VOfnVAOWlwOEVpVV5oPVpPPzt2V1J5V2A2Wj9GM3txRjhDYGkwNz88dm1NS3d3a09JbXZnKzFkCitAKX10YEh6aWVwQ3xmJUMqNyhzVHBCbE92ZWNTbk5veEhaS2tBIUFpV2dpZm88MTw3ezZSRm1lbV5oenM2Vm81UEgqUjdIaWF3c1UqMT9kCisrWn19XkQ0fUM0Ri0lOSt0elM4SVZ3dzxwdkwpNiNaYHIxRm5aYEo3aUxBPl98PkFFXmRQdytqYHJVeipfOUs7VVhAQnNmPjZ1aERTaDhoCispRjs3cXpjRWlFN3BRcSRoP00zdlV7UEkjNn5ffjU3YyM8WH4rWlpmVERjS001fG8helkhOWRCSCh2RyQmQzVEPzsmP207YWRqam9IVnM2CiszNip6RyloKzF6ZihDQD55UH5EWnpJY1VJZ2EkK3ojPFpLR3hBNC1Scm9VODE0IzV4N1lkJW4ybWw7TTBxPmFvMDNTWWFOdnxvNyNNSEw8CitZUEgyZ0Qran50RDlXTiMlcW5QKF4hcXktbWJyY1Vud0goPD5veGFEe2BqU3F1OCMqVXwzelkhSyZObj1lMmtePHFfNkRTa0Q7eSowUGQ7CitHfj9QIXokPCR1RG16QCtCX2QjVmc/U35MYEs0eDtZVFUkWF99SHteQmNJM18lXjRQfVhJbTthUmRgJT0hbnclITNCUXcrKmxySHwoY0M2CitHcWA5fkVqQClma0tDMyZkTHVzMjJHRGVSc3VLRHxGUjVpVzcqPSEhME9DMl9ecFlAe3lCdk42Zyg4dXhtRW5kM2J8NkJhdXxHLWd7e29+Cit0dntfUEx0LXV3fjFKJHoxK0tZOVJSX3VLWEw5bW8zcjxORUpWYD9zJEJaOV9oYkxYT0E0Rj07R0NsTFNVXkVRenVkaiZkQUJ1YEVTPks5CitlTShWMV5EaDxJcXIpaWxMQkdRN28qPkdBUFdzO1ZDM3oyPzsmYyg5ZjtmUHkjbU1xeyh0ZjFaN2hwM1daY093flF8MUFmdHF7aDtmTEwxCitQK3NxPGxFcmk8WSRzNjU/YkhEODYpXiZCYlIoSiErOSgzZj03WkZCOD8kelYtJUZpaDlMfGN6JkdIejBHITVYKiFMZU5ATyRWeWhyeHMpCis5WWFrbkFkU2hkQn5OUU9sY1cjLVl7KEMle3dtYjNed2JJNUI/YTQyZSQ7KzJfaXRnX2tidTxFY2paUmNuM1IkfnkmSFc/cntvJTg/YHw+CitJLWhZd1AhUXFLN3lQSmE7Vm9gMnchMU4/USRLKVJsaFRSPSVNQ2lIeShiQGloP3JSdUNlKm8kJmwwdzApXnheKjlTLTNtQSo9dzhtTiF2CitXJk05PFh6ZDFwVmV3RHZEdVA0V0NpYTdCVT5qIVFUSGhrSzRlNzt4TnpxdEFQJSFsMEAqNUF0UHFOQiZHdHkzU1k3elhpfioxcz9iMitiCitzJjRzNWJoPTVxMTAkOHFFQ05lXm9nR3VYR1RGOX1iM25CdiNHNmJvSWw4ZkRTd30yZH5kblNHaGpZRHA7T0lrJDJ8MWB9KTtaZ2pXZFhGCis1ank2cH5kd18zfn57SzxaUnN8VilJQmV1bWJRWllzVVE3KHluaUVxeDw9Q3R+YjhzPzlUYEFuam91dypjSWdLaFJJREwrezxVNmxUKkR0CitrKEVJRWZVbEk+d1YpMk57a251Mnp2WlYqRVVOQWVjUjsqdCpuRUFlaylqUSttclNCRCgkMz44Y1Red29UQnNjTm0zQSojQlB6byM4Qk52CitkRXVZOVNyQy03QG1NLWNtQCE3KTBBTmRXVCM9P2p0OGh1JGlWZShTeD4+T3UpKCVQXlM5SXtqQ2VKITV5VTAzK3s2ZSRGZ25Id3tHailiCitWJiNkdFpjSiFEZil0PFJmUj1qeUpxYmhXPDlXIWc8ZDY2PmdQMXt8aGQ/P2szPUVDOGRPVSo/SU1NKyVRN21NK31iYm1EaTJSQiF2Xz5hCitFWDJ4O2o+c2FHRyZ7V0E1PmRhITxOX3pvQm9wWXU2YWVrJEQoZlN5PkN1PX49ZCMkPnBhYzB9JlRlei1zVSp7ITN9c1Bqak9ue3lASElmCitqMkRiYipCcF9IeGd8PkhUYk1WU0JZRjM4cnl4SjRIM3NMKiRAeThiKDN7R3hfNXl8WnhgLUhsV209NTFLekRwPWx1RzN0ZGMmfFVtUz8rCit3NUxnKjwpK3hPcDVxKTZfUFhDWTB5M1h5ZiNxM3c2NzZ9dmlQWHBRSmAjOVEjOVQmfGNXPVh0UkM9fEc/ZT54JFd1NUZaSnB2JnY2R35jCitnbGAzPE9SMEZ9YWxhSD9vZDlWNTdLX0lXc3RzND5YOzNQXmc1cW1FPEtTN3Z8PnheSTs9ZChOb1ZHTCteWGxpb1dzMW18XjF5YFFiO3dxCitIRiMrX09BTks1PVpWSWA5fD8oIW5HRH1JME1VeEpfZDcweCFmYlYwU1lxJnp8PUZ3O00yaGBuaElrP2w0fGZAciVudWA5aUZxZHRlT3BYCitpYlk4Pkk0amlmMmhscG47NDtoRWNNPURsNSs3K3c9MW9pbnhsamtMcDZrYXgrbWckenJRfVVoRXB4bERwcHkzJVZqNHlZdkdYLXlPQ0E1CitKS25md3xvRCQ/PWhKOTxDe0J2SHc1XmZlWFYhNnxCTEg8NGVrc0UwR3o7NG4hI0N8QX44NSZqSFdSZiN+ezhfKDU5NntLYl96S05IdiMwCit3Sn42JSZeP3VlYEF7NShzNyQwdyt3N1p7NFl2U2dfSWNDSEdDZUdjN3NFTE0rT05pb1dxRjlmVWY/TUQ3cnthV1J6fHwpRkV8byo+NyswCitWak52fjRfbUc2YHheTlo7M055elQzdjtfNT5SXzxOM31gVzRXb2RYOV97JVFCRWpTN19mPX57dzBzRFY1Q314S0dFKjlueTtMdWtMI3ZkCis+a18rQCVteXVlTDZ8NDhxZWApc1Z3YCZ4RmBpcmJYZnh1JSkzVExMMVA9SyRReCFfaFApZWluczdgYzYlfTBLM0NHQUhjM3pjbUpIQWYmCitGRl53PH4zVW4qS1pjOT01OVNTaUhkdkRiNHxTNiR4UW9jWWchZTsyNGsoVXtpX3JzfGdeS3pqcHE0TCtRJW04TWVyaDd5SyRlPT19dTYoCitHYV9sRlpfTiFORlgrRkB8UTg2c0oqakB4YTk5TDRlbmB7VHwrUzU2QWNEakhTK2JjemZ5aGU8UUtidUhebEQhTzh+S25MTH07YHtYVDklCitlaXBjWnhhRElrMnZ9UzZ7dStJYSt0OEg9ZndufkVUWVR+fHo/TFpVejZTQW1FPlhEYURfY15RY35PYEFvUnt5Tjd3NU8keT05Nz4+ZT1kCisyZ2xqfWRxd0dGemoqXitGeXJQMmJhQVdXNlpEcDE+ZDN8MyRVJE1IdldNWHxJbys7VFZaMmlQPE1TaChOUFBeNnBvPDwod3FoQiU0SVd+CittYld2Z1NAXzdKdWktaTx2d3QpM1QoVUFPeDUoNSUmfmNFMj1OZXh0IWJlbTNqPEdZd0FOPC1FYTV3fiR5Vj5WZSpNRXhrcGdWe1ZaVl87Cit1eUp7Xmh5TEZnZ29PZWhoTWI7YGFuZUR2OVJOU3VNNSlqYFBMc2J3Mkc/dlNNOTVBZHMhYGdpan4hUWxEJighWnBeWEhHZyUpVlpIWTY0CitpbjVISUVpN3lGOz8tMytyX3RZP3JHQyQqMEhAIVYpcUYtMmdKNSVQLWxCR19aeklnUX1gdjhocn5hPXMyNmB0JWFXRSl5Wm1wc2ZCdCshCitCdEZAQXphPlh0dztWMlUrV3NNM2hEIUA+UyRgMCp8Nn55T3VVWDVsTEU+OGoyJUdfTkIyQDVGR3xnZi0kRlYzeUwyI2dQMjU+KXM4empTCitnTiYmJm5pYlpmPDFsVjhNQEx3RFduRyo/Sk1QWEJBd2lyOCo1ekxncmhNM1EtT0VWMWEpTmd+VCFPMzcrbXc/e2Yme2wyZmJPR219LWExCiskKSRPeipRcmRSMCpvYzw+JDBZeFpfV2goVkhIYW1mUTZmNmR1SiZSJFA0LVY0Q21Pam58aWJQO2RGQH4wRjtRdSFfSGdJfE5PPiNeQFYxCitodSN6PUlSO2JtQ3UqclFBWGFJREwkekc8e3dAY1c4S3s4eWxePVY3RlZSPUlVbkB1PSFxYmBmSEBQOHshOTJXWExEJTFkMztJQGJmaSgzCiszN04yOXgpRFh7eyYobiFobFVhfEhseVh1MkI5eGg/KENZMkF+T1FFWkZ2ekVrK2d4SUc5MylFXnZRQiU9YmQkUGF5YGI4dUBAMkowQ2FpCis1SG9RPHZlcmQyNFMjbExVQTcpY2VWdno0ZF9UaGB6JDxAPk88ek0zQD12aG9EYD1YTHptd0UlOH1fejQ0aVQ7bE52Z0hjP1V2TD85PUVHCitPZC1Xe3MtfEVzWExySXdxKCo4bW5fZnY0SXI+RXpZNH1Xaz1vYlFoNCZVbmBDWVpRO1dvdmJDKWUkNjYmRmtmT3V6ZyNVdlFrQXZiNzJHCistRT99e2h4Xm5FcWIrNGdNQldIPzs1aU9kJiFHKEg8IV5JQ34zcCpAQUBFPCstME1UZ3x9YSZ3MjktSm1JZC1iRlV5K3oka3wmTWEyJCM0CitzWHZSQGxmZj1TSm5aNiQ1K0ElYWZAX0s1cDlfIWQpN2w1dFlxKEd2SH18VUF2Q0V4JmpRWERDNzJgd2hhQjhfO0lycVNHc2dPWEk0bFU2CitrMHN9Um02QUJ0SEV0I0UtRSRkZWQ4PEBrNzt6Z0w3ZmxZSXdIYyY5QihYRnppaFJ+R3JSYj1nRVY3fmVEXkotNFhBS2AyeVZOdkkjdE53CistVFU8dTlSM3tgTSY1Q19AbXxsWEQjbEZldFhDenVPfmtJYCpEM0QoSUhHcDxyXiYmQ05BUWglWlRROzAjNkhDZCgpRFJsXiRFakJWel5nCitUR342c2olY2pDZCNoIWJEQDFOVC0tU1J7dShLRVo8RFl9UTsjWkt5TiZwWjwxISs1ISExI3NaLSU4dCswYyRtZUk5bmhJS1ctQnVOJVF9CisyQCpYQzZZP1FvVyFiI3pGdnM3RUBzK3kkKCp4ZTBlNDFafFJTOXcob3QlPXJ7NEVSaiRnPEdaOShNaWNtKS0xJXt4eWFFKXJQY35qXnA7Cit8Qzh2T1RHbVVRVWsoKH40e3AjR0NRMztyUXJUdWRHK3o5fHwkbjk9dmRLai01NHold3V7eUFBVTJ+NERHI2VoUmg3NFdgXn00NExtPEZ3CitoentkOWFVaDJiNmxzKis3fmRyXkBuOGl4ciFROEhYZCljSUp3bHIrQDlLaXg2K0ZnZlJBJXhAb0tIM2A7eGBAa1p5Z058RFRncSN7VkwlCislbHNGbG1IKUdAfDQtNyYtIU0tV2d8X0UzO0dQNypWa2t7OUVSS09GMCVhS3JWPnB0PUlHaUx0aXp4cz5xP1hRQ1h5Y2tkVl48PTlyQnVLCitnMHIkKDYjQlBkMEVmNTFJZ00yUDVOP15SZWxDWDZhdXRFP29wbF9BaGNuSmtrKms9b2E0aC01dGEyKFdzVnZEMHheZlJBVnhURllMdjtxCitvQ0VRWVpteGA+MEFGWVhXVSE2e1RpRiZ4d29XczNtPncjPlooY1gxSV4lM19OZkl+LWp9RlZuOXUkYWxmTEgycThGKn0jfmh7Rm9oU2ZfCispbWJgOCFWek90WDxkOTQ7fFpJUkQ1ej5yYXtJLSQqSUxqNTZ7aXJBKypqbHJxZEhCbWE/PEdSIUM9PXtzZTZPRFBrRUJhZCZAPCZUc3loCistUEdmYTZoSiR6WFQ9IUpmI2VnOXw1JVZBRSVUKiFsSGtnUWlrQ1lWISU8fjA8UXxNciluRHsyZklvSXlCN3FXendvJXUzeFlTJU1ec1d5CiskN14ld3dMTlVOPGhJaU95NVRIMC1YWm9LVl9kMUZxYnV3M3R6YlN7X1BRZzh0LVVMP2xXTjQ8aT56bXhKQzVfaTNiaUF9bGpMekxwNjljCitSbTtFbGhCSGQ9IU1kQi0/SVpWMlFJJX1nQk85Ti16YlpnSFNYLUB3fG4pUyFRaXteS083WD4lbHlOVHN5P1hgV1BRa2FiYjtNNlBHSi1ZCiteZlJ9b1FzZCt5LUQ1fDc4Y3BfLXpoK01YOWljUUspTntxUDdjZE8yIzg9Mip9MldtbHU8dWU8ZzxtKGl8TDlwcV47XihgNEVaTVYlSVF5CishPE9ydE5jbUpZMih9ekY5M2ReYiNvQDlaXntvSCk5anMoOCVsQi1WKkE9TWQoM2IyQjd0eFRSWmNgRy1qM2VgMFd1czElOT50WjlIK283CitQJDtoYGc3PitVJTYrNDlzVF9nZjBEK0piRytAJmA/TVNIUDR5Pk57TyVGSTNwTXxYRSR0bkp7XnFqMiE2OGAycSE+Nz43LWRPeyNXO1hNCitHe0kwZk9fQ15xRip3YkI/bCVyMEN0M1VqRi1RUShXYnQoJXAqI3F0RD17ZWghTl9HSzc0PFdMRTNxZ34wYj9hN3M1SnMkIVFpbEM2YFR6CitHQTV0KGkzMnA+e2ZAWktWJHdXfHMzaUYjaylnMktLdUs8MnZPQS1+MVNZRjB1QmBJODN4X0FLNU9OdW5mcHI4biM2ZkIxPiZKQlIhR0s9CitkRktyaXJATHQoMiR2fWtHcGZJK0xxVXZ0fFkzUzRSUjFCWG5aa3BvYyRXS0VXJld+ayglUU00YmxOTUU/XjtDI1l1WFdzcTVxQU9KV1QkCitpYSs5fkFELWZmK2tRbyZwYmNvXy1sJF59WkokZzBuP3t0K0Z3a2AqP1ZsM2VFREB2fjc3RF43ZzxsJT1yUSNCXmN0MVBgdk44RFYmOStFCitnR2FEc3dlOH0mUSRydWRCfDUrfDdLJEYtKlA8dnA3OCNKP3tjNTstN3toY3IrMzE4YUJLRyF6NzVsUXI9eWVoI2kjJit4QU41c2BhYVZVCisoUGlxSVhiRChTSX5fYCV7NktwOXRKPDtoPDhSXn0/Mnh9Z3laMUtiMT87ZXx1bTB6aD41dTZ1enV+JDVERjtTQUJmJTNjNlghLTJfV1NPCitGTzx1SWRpbSgpbzYwNX5TbTg1Ml4/YGk2cTJNMnZ0NVV6S3RBX0FsOzhAZUk3aDRUc0pKMHRJNmBtQlgjKXojKlRaN1dsfDlyREFmIW5UCit2QldtYGBAOGtiRnh4MU5TKklCakdLPio8T2pxaTVtaHU5e0xpOUV+KWtlNEo7KjdXSkdfb05zanpIfGZYfFgoaTk7TDd2SU1GeEFeaUx2Cit9amA9ZHdnM2R2OUlmK3MlMHRiXzlEKUQ5eDNQTn5YMSYodVotb09IUkl5IypNd0QmZ1EpQ0RPMnNMUWMzcDZTfT81Q2NlP1l7IVNAP2g9CitRRzNIbkV1KUJubl5vOT5YMGgoO09QVm1yfXoxd2ptJnNeVDFNckR5KUglTihMdElHPWtpOHxpfFheI3lYelJCLWMrYSg8LUtDN0pCfVhQCitiWTZKcHVqUVpmUGhRfCVJbFFaKmtSUmt4S1RQQTJSWU9IcFFFWE1ITS0pY2M1V3BNeE9lQEo8WC1DOSFndE1XWEpraCYkekwjOGdjPThCCitKekF5eEs2aD5kIWotPHBGY1VqVGJTOUUlK2pnQjhlX0lTK0k9NDE8Ymk9PFE0OHspfitAZDhhV3A1REQrJVgle0dacCVBd1VmI1luOTlxCitFUEYrTDNlJmhgTyp0PjNrMiRvcDg5V2NfJjlhKztse29qZGstJkE5bSo4cE45Vio7ZSp0PzNYPjFCK35ON2RaIzd+d1hxMUZvcUZlWjwpCitvYTVVJUx3SCFUWjhyLT5YJnFsMWUjRTQpfTRkaGJ3TThKZ1lzWVlfb1o7a1R4fFpKcjBHZDgtIUEkaVAlbzl5Pk9tPHdrSTZ7M28wNHhzCispQiNsdXhCcUhkKkxNSU1yNiM+RitPN2M+TSRlWk9XU091K2hjOUh3S2JUTG9DeTF2LWdETWFhWkZmYmUmPFpiYih0cWgrXjhFfD1uVjZZCitLa1cxNEVII2FRdU1sQzxNbDJaOyVBWkhmKl5jPXRJRnQ5KWRVJmVPVk1kY0tGLWZ7aCRGdVl9aFVNeHdzc1NMLSU+eGZqa0pCe154bXhCCitTaSphfHF6dTZAciU9eCpHdmorRzVxKS1hI1ZvcXRWOGl0UHpZaVRgVm99UXpfQU95TV5YSXJ3fjkwLUlsYU05MFhsQiFuY1Q2fjExYDhQCis4RUFIbCk5VSg+T1Z1OXhfQzclVFk/MHZQNSQ5OSNWX3hYdkV9dCQobl91Y0khU3ooQGo0SlJAMCpBfUV4bVheT3h3ai1AQ1IxNXBARnFBCisyeUxTdEFqYFE3R3grcHEwSWB8OFNYI21Ndk5UM2BSZkxMWikmMlUqelclMSNuTlkze245aDVTdX5nRGd1SzY4PUp0K0F9KWIzUj1nO31ACitkU0U0I0B4UyU0MnJ5bnBVd1pJeHkzNEU4T1IzMXJVKWh3OyQ+SmlNIUA8OWhfMFpQakRgZ1VhQlhyP3YoYncrM0JrY00xe30+ekV7YnZyCitXKitjbWg3REsqb1EoWnp3Ulp2USZnMWhWPmVgWGdOKy12SW9eeUlJPkcjU3sreDhSb3xONEctPUhIRkRWOERnXmxaWHFqPCZRYFdgQ0FkCishPWBAPC1teHliZ3o3RT8yRE94UFJfISZAViUmKGAxfE41JUJARTVAWjA7N29+ZXdqYTdycj1tQD5ANVFPR0cyU21ONWhmSHhBRUYxJH04CitWcUs9fUcwfEIpQik+ITxMS1VPQFF6QV4odlZAWEslRXBUQl9jXitWb1l6QCszJkEmPFlqKHt1cSZefmc8PSpZb3tfPWsxJCZkJDZiT1FQCittXmFvJWNvQlk7PG0mWWMtO3Q/d3JFIWNkTUdlPkhBdWBjc0pUTCFjYkt4Y1V3RURGb2IpJT5eb1ZTdUUjKEchUVUtNlJDUjh5c1BHXyQ2Cit2PWo1U1FSZ0xKPyF5MiREbiVNSVRqWXdse3lWXyRgYyN2R09wX35rTXVEUSpgR1JqZVg5NDBPa2R4UUs1VDgoY3lwOX1ONjc5am9fbihwCis3KW1fNG1jTjFLLTk+PChoOSF5KzxxPF5OK01pUVIldX41S0pMKX1iT1BeeytjRXlMQ3JLe3FeczVVdW5FV2JvVCV8Y2A4S0ozMVBCTUEpCitRJnIxbVpIcGgoIT0xQXBrKFRsbzstZ251Tm8jNyE+TSlaJUdzWENrNWx3P0FKcHNTQEs2QCUlS1o/aHZnWj5UNUhRMmp5QF40ZUdLV1FxCitrTUxUKXA1ZjQ4ajQ9RyZ5Z3ErQEkqZz9LY1plWmNPYD1yRFVWU01mdj8kJVV3eV53V2ZqZlgmRis2OEw/KWQ1OT8xQ0l9elFmVnVUY2JNCis+fTlZeTBWUyVoY0RTTkQwaiVoOWdnekN+WklRLUdqVFIrWWFxenslPTQhZlU/fl5VUGQrQ1VWcj96SCF4RH4qV3x6ZHE1UXg5TTtHNHl7CityX3FJe3J+RVFmQiEja0ZiREJ8XyVgYm5WMDZBWXB0Xip+enlJR0FJTClWcF9XJUFKTyNmRzNgeUcxISZVTD57dntOTEIhfHxkUmplUlFSCitpWWJebzJiaDstRmw3I2JZX1U2bCU1NUJLcn5wZz9VP082ZT9fay1fYj1vdmtYOTFMPzdPY2RVUT07VU8xbjEhM0ctJGY4UlBHWkw8ezd9CislSTBqQjs7Q15PSjNFJm53QiF7czFIZTgwSFdobGdIM1dldU5RSyV8VUBDOHkrPXpAJUtQK2tCdipjZERieiF+MngpUnhtVVRvWkBHSFpUCitDUEJuXn1OKyVOcilXZCRaT2g3VCMxWU08bm07KDdCa0YoK1U+eDM5VDRVX0trJmIhNiljNl9TTjwpWGtlKWBEZnU4Nlh3P2lkJSk9ZC1JCitrfXAkSl5ZLTE5VnIpMW9CfX1ISUJXakQqZWJqPTg/d0dxJipiVD9iP0slUWpOXk0oWiVBXnFCWmhmd2Nhaz9tMlZ8KmVqSG47YzJQJj0lCitDfSh4Tn10O057b00hQyFucm1PdEs0Y20zclQqc1lWYCNmXlhZOTQhZjhCNmB0O1VJM356KCgld0tLOyRjUXw/ODspUXJyfEc/azZ3WEV2Cis8cWEwNyR7M3ZZczl+SyhkM144RW5JUU5YTlE4c3VDd0RkQXo7T0JrX1RIa2l5SU11bTlfV31vYmNxJjhjYU5lJXs4fExZVkdkdkw+QWRDCisyazxTJGw3Mz9+ai13aT1gVSVtUXBfNXBhQmBTeXpvQyEpKkE1VUopdm1te1MqfDlJNzMpIT5uREAoLWV3I3RnTktFSndPJFBJO3ctOXhWCitrJEU5WEFvdGAjWGYhTnorWlUteDZGOChQVXBqZX1lakhxNForOClvNUhoIzd2SHhYb2FNZiV1U0soJU1+e3EpR1VneD1XdyN4WWkjMj85Cisma3dANnx9UiMmZ29sMnB7bX1TfC1RbW5KRzUtQHkyKjJkKjc4QzEzI3ttaHFQe1lDNU89PHA0ZUVEJFY5RmVoTjtgfWx8fjN1IT9oSVJeCis0Syo9RCVUODVwfjBBenlBI3V6IztXeTIzXjhuTyk9eGhaUmxCP3BmIWtPbHZzTC1OYyVBUmhDITA7UnI2VCQrOE1BcCM/UzFjXm4zemdkCitXPU9XTlM3X25jZCN4RE5AfDJaWURfbF9Eb3wlcTU9byl8SU0+Wm1UJmViTHk1aklgM0l0ZDljSW9qQFYjY3J2bV5ZbWxDOypZakBpK0J8CitfbVRmUClJfD40dW5ZWHtMIUhXX1BWbCNtNWRAanFzcWxjVDFrNlgxQ0BxUkJ9TX1lNzdZdXJGaSspQmJJfEwyQUhaTVNCTShSJjZYZG9zCittKjZsN2ZwKH0xZDM7aTZhdDUpQ1MpWm4xNVgoU2opK1BQPXU3V2c+Z0dhbE9pWWVhQ3MpcV5VSU5KN3RxK2tJVVdaTGNjcWxnNGlqajhXCispazMkWD9AfVVUaitCYitUNSomTiNAR3VANmg4SWRhP05gYmN7cCYwM3xjMCEqPkAmeG13T0x6aE1AQWhXR0NpJTB8KD4kJGs7JkhZXytxCit+a3pmPnY+UjxvRk8oPVAzRGlgVEFaU0x1X09BYCEqYWBlViFPcCFQNWJQeVZQey1IYGR0fGZqWW47PlRldF4lbyprR3tBdj9ETEhLdipICitjQUc+KUFHTCMzTCladnUlaEJPIXgzNzJNJW0+OzItczh4KlJMU2tvclFBKStFSE8te2dUSnBMdnJodCNLWTVSeHU/PEs2c1hBO2hfO1lLCitPaU5nZ0peU2o7MzBHYUpCNDcpIyl2O2tCWHtDXkVeTnFZTlVWKlRrcy0kREY7PXRTPiR7cCp1X3FwP0hiQU04YD5YbFBiUiEyJj9XTFpLCitVK1MoR2Y2TWQ7I0VOeTQ2RHo8QH57O3cxWmQhNWN0ZXhjRUNXNU9TZS1Fb1B2OzhCWGhGcHBRa29tP3tDKjNJUV5MKDQ4emk4MmowJUMwCitNU0E3YyZoS3RfUj5TNXk5I084OXspQkV6Y3dqODMxQks3ZmdDLXpEQWNKT0RYSnFqKStDZnctfDgleTM4elEocUxyfjRHUmBAX0RoZTw3CitjNikpQTBqJUwtKDAtJWhlPzMydXBvcnIrZWFnZ0ImVVdqekkjQnJDJkRXSHZ6WjV+YC0xNmpfIVVzMDkoP1QkeUIpWFl5WlBrQzBsLSo1CittMmVmRF4mRyR7X199RiprRSNOWHs5ZE5AYG1AOHljPG1SfCUlP3FlS08rKXNaLU9eRVAoRSE7YTZxe0Nvd1UhWCN6YHlyX2BfMSMtSmB5Cit6cHRAPVNmV0g4YT12amJWUEROQigqUWtebUwjKkNge188QigyQDM2eVpeaGl1cjBRcVFOY3ZrZFFWeUd1ej45NlQwZm1GTz9POVUwK3MtCis0SzRZe0xeeDhVe2NsOUQtNXZjNVl2bjNmK19HSDxLUjUkfFF5b1lkZjFtezw5VVVUOXdFT3hBdU57byN+ZFBUZyhyNnJFV1VIbVFtXzY7CistfTNtUXdRU3lILWt7ZHljOStgPVBva1l1OUh2az9sYDdNTV4/OTk4WDk8XiZWfDc9UDc/VXNNPjk9IT1WJk1tI35sVmx7JDs5QSg7NmwtCitMRGgzeCFUOSNrZEI1WDlHe31eQ3B7fC1HVihBb2xSS05NMlZrK3thVHsldDlwM099ZVl+RCV8OGx2ZWo2T0Umb0VTVG0jPiRmODQmMjYmCisocU1CQGJaQTZ7UCohdiFIaUFveD4tKWpMZ1opYzZwMG0+PiFXJV57Zj9VRFF1ZlBsSSQxSzdJV201QmZ4IUIjcSZBQ1cjO1RrfVREdFIpCitRKm88ZG5rPl8kX2FxPChSRFlEdnBsLWtaJGlhalR5KkRZJVUmWj0zPjxQYkBfZWR3WnRfVFg5WDV3JClDVGs7YXQoZGNLN2IpUl93ZHU7CitHaXVXTkBuJGo4KUJoSlhgUz1hcTEwNjZWc3pScUxIRV9Pb0xmVXA+QU0lQjNsaVpSaVhXKSNGbn5SUyprPVZzMj4lcnw4e3JXaWp7SGFWCitpYXViVEFoMCZgSH4lV09+QCQ8dEpCcXsoI1U9dXlJYF49Yn4+NFI/c2g5R24taUd2PCt0Szh7MT9iSTZsUmZZSkkkPmIldUUkOUUoKTJQCitRejN0JWhLZzdsSjJTUGVEJjVeYXQ9Qnk4ZHhuX2kkc2t6NDhjNlQrT2koV0pyXyh8aX12Z09Scn53ckRQUD87eG5DWUNXKl5kc0txdmhhCit2IUA0bV9FcVdsZDNJKHM3a3sxdzJFVV55KDtzOCUtNEc9WTt4UH0qWj5UQD1ydl5jSTNtPEc9d3I2MnUkZ3dJWXIkcCFaQGlfQ0drbXJxCislIV5aQWQ8U2w9Q0MrbzxMTlFtU2BqVVd5azdSSWkrazNnalFOYVYle3BGaypuMSkoU1JmPm97RVNzMCpHTFRZMk1pe2tKXzJseUFGaG1DCitTSz95Oy0rd0BhNik/ZiNPWnJQO0NteT0+bTsyPVpOWDg5MGV9SCYyaC1fT1RXNnRJKDU0PUNeYWp1JXFzWnUzI31Rb1pEITxVWCVtWD9PCityd18xfGh8QFZ4IX17bik7KlZUczFyT2BGVFpRYHB7MVQyI35VQE5fZyR5KHhVTnZVST8jSzNgZTlAcFVyY0NlYmdsdHl7Vzd2b0MhYDZ5CispfSNjRipUT0FSKCRpJHBVIzZobWY2fk5tfHpTfjV0Q1JhYnpSdnVzKiZeSyV5SkIoMlglSDBTbjUjdWFkZj14UXxle1RfVEAzclNHVDk5CislVTt6bjhFc0Y4dDAobi0ycSFHNTkzTmpAV0F4bDx2cWtiLTNDS0AlJk0kczx3KXJkI25IOHEtcDdRVntUc2whfVk/Q0NgPXVPdCVvemN1CitsSmxEMjZXXkFgdkJ8aUtldlo0dSp5bSlmazUhRzt9ZkBtfDA/N3FDYzFgdjQ4I3ApNjwjJWl3NHpRZXVuYER4K21ObC0xa0o4aUFBYyQ7Cis+fXUkaVgjXi14WSR0O3s7WlMjKk00RSR9N2B4cjQkZWs0KzJ4ZnMkeEM7V3NLRTZAX3hQP1JBeWcpQDhweFI1Y1JHZEhTcGB3dmVofmo2CitFWlFQYTt2cEkxb01UXzJrQVhxV0IhRWI5UCtDZTAkWlphbWJiYVQhcDNOJSh2QE1BJHpRQT8yY18rXjEqdiRORTJybE04U3l8Z1due2ZrCitpfnNfKnAzQDk0KStnfXMhcGF3VHlPXyRvdit2K2g/T0VESnxoNHxjSXJ+ezg0dSg2OE12cEpuPTVtJl5RVjVrTjAtKkRSdTFkRkhne0opCit4fn42LXgrdkoyIUArKjBUT3ZTUzxLdFM7S3xSS3thM15CZzZVWkhOS2tSTjZXMXBVbXA/UnlaUmBIViZveXBqMjt5Iy09cW4ydSNVVHlpCittUWByRz1seXFxP0lmJXlJekp+dk1gQE5DKyZ5TS05SHY0a19GUS1IaThNRiVIWHFjfjBAaD8qYHZMJCVRUW04Z1dtbE8lVUM9YiltWkQjCitPck5sR2prZXBueiNwfSsjcXBlaGhWWEJvY2F8N2xwMHBjZF4yeUApV0ZAU345Tkxsbm0wQEQlVzk0alFlMiRTWW4zZkpFNTgybStRYlZpCitMdzsoOT5veUVAdXtCYigoP2FCfXIoczM2PjNxWktsdV40YXlObzc+SSMyZnJyUHhqS1g5SWJ9PGo+dWNrejh6bCo+ZWR6S3ZwYGNmXmkmCitTWSVPK1hpeT04SDZhZkA1cyprZVBVczNFZnJSMzxKYEJZY359MEtSWUNhNCZ8d0prPCR5MnczNGIoWjljbUAhZ0pabVRvaktwI1I9JXdXCitgRj1AJWNTWHFlT1p0OUFlYFNVU3owaTw5JkNvPWZEPldoV09SZmZ5MStFUlJfPFd2PklHUGhMcUVCfEE3TXEwSkAxfU9Xbi10SF9ZZ0tNCishV0l3RzZ5UnRjd2tZKDs8cDI+Mn0rRGI4O0h4dztLNHtRSUAlYityZlIrXzUmUCZeZnIxb1R9aS0wZHc5OT05YDZtKCVHb1NKSDdARHt+Cit0KUlpWlZCZnQlUERLXytHeWBQRj0xd0cyaCFfcEdhMUVOX31pSWZacytmPXtzUU9VT0J2eC1lcEN6fXw5TlhNK0I4eCkpPkZjRTtUdT96CiteTnIqfUdrY3RDQ3Q9QkgjN2M9WG1ueE1uIXxWLURgITEqejV7I29SeDl1VndwPCFxO3ZHdD1pblZ6Q0R6OEYoWUAtZDNBTF5fPSpxfTFmCitFPXMkIVcyJXFCbkRCPVpYYndKb2NXRXVOdyFsNjRuRT11Rk9DRnlseDA9JDAoYEgwVjFMR3Jje2N2dTBGTkAtWXtDdXA1PUQ8MSNTQS1iCitfTVI7Vik1YHgqJD8hSjc8RT5kSGt4Zz9qTHxsO1plR3c0P2h8bT1AQX50O1JfTVlmdHlqUFhfTHkhTz5ocXk9bnl0NXNBVHBva0JEYGJNCitnaiVTRE8/cVoqQmVnRjFSOShXNWxzLS1tV3FHbHZ+YWl0STVMVUJGOVh8ZFYrMzRIPUtTaWtiXmxmTV8yO0dTc0tjKH0wZUJLX0FGTVpnCitVTUphYDl8ZWEwPT0xOWFRZmAmVDZLO2RATDNlZ0VLRlU5eCpZZCNEYlQtK0F4e0NjUUBGcihTTGZpVVFKUEgxcHVFRFgjTSpLUiVraEFYCiskMjI2KFlZKlZ8SyN7SDFnV2tjeT0+S2dFblpleVA+MFlyT2R+XlRRbC1RKFlLQjZrQXQkVil8PDszXld0ZDhgSC1scT5jSlMpRHQ0d1BCCitGaEBqYiUoSU1PPEAoeGU0YEF5PDF6JjQ5QGkkM3ZBMyRiTWYrXmRJVztGV19EVjFwVSE/QUBnRjI0KTw4aDZNMD5DOzwqcnFkRzl4dmo5Cis1SUhhQm82ZEJfQHMmOU1kV19vUWA5bm1KPkw2fnQ2WnJLYDNjdDFMelNfTX4wZyo0VWJEcVFeWD0ha2g+XmFXWWZ+UCRIJj9vSWhKbjN1CitnZFlBbCFeTT96MVVKbldtTVBze2haRFBZbyVhdUtIUjFZaEN3SzhWK1ZmSmNxVEE5emxtfUgmfDd9Ml89QklqMFdESm4pVy11Nl9PfDJ8CitsNWBvOCUkZGtiKW94OEh8K2JaclZDdWZEV1orRSN1MDlkIVFRQmlAMVolaDZ4c0Q5M1JhaXhEWE04Sj5wVzsod09GN1YoVC0rUGcjOGtRCitYdHE0diNObE5QMDA0QzgmUTxwUyMxNUQ2SDAjNWorUlJLeEJnIUUofVp9YUxYaj1JRCUqbGw+cD4yKEpfR35obHU/YiVsKnRCRz19d3RsCishTzArdiV+WlYwZEBQWnA8dDFEYT99Rlk3XzUlNE9HPGBhYHYyR157e2hFM2xKTkwhTDModC1TJlZ8SDNMVVkzUzsmX3VOV0B3Q0JkYypCCitzb25hQXRqMjw9JHJvI0BrSXgqIW8wWHZDUzRjdjVAUjlCVkBBUkRebWE3PUhLSS1yQ19VUzV8ejhhbEBCLTtLOCVmWFFjXzY2TFhMJkJYCis2aSt8aGhWN1lpcXcjbklqP2NEd0RPSi12LXE8alhyaVc7UmNCRjZoak1rJEJzal4jI2g4YCF+US13XnotVlE+VFooPFdCQ2hwRndHVUZ9Cit9SzJWfSleMEN0TX1KTG0/Y1liLTtlN2FqY0JuZ2g+O2BncEtXYnl4NVlpKVl6SHpUfGl6NU5yMCQjb2BNRmtwMV9xUnVFb1NyaFE0eTB2CitEQnJqeWw7YmVwJjVzUkhJRjlvV2dUNCp1TTMyI05jIzNxTnU9PCohfVZwMWt6dyVkWWM+cyMyJGkrTFVmczktaDAkbz9lckNPPFNVdz9NCitgay0lTU0+Kj9UJjhrZEl6K3o0eHtSKSFEX3tXWWBwZzwpVWQ7JEVKZTxjJUQtUUREPHh9NF54RmZFdGk3d1NaY1JXOCtgUX56TCtEeVBiCityLS1Wcy1RREVYaCs1b21fRXklUUF2PmByUjdHMm4rSkhhaCVNZU4zYWtwQk49cVhNJipLOW1sPXpKYTRnWGEqVGxnUkdnJGV6YjMme0lsCit8Yko7aXwkMCUyaG9qUEEqIWhodiEoWnNXO3FtSD9MKlpXfmA/XzIjcWpaWEpTVXNDOGlyakNyN2VNdm1wbWFpQHQrM3BhMG5xQlZfTHtjCituMEROaXpRWVo0PTdfS1ZmWkxGQl5gZ2h1TjlYR1VyO0ViYHQjMllrT0AzTXNINlhQIzg/MF9CM0hGYzw2c0piQzdpZEJUNHNCaCpGa1ZiCitVYit1SkpyTFhKODZmVWdZX0IxWWIzc1BoakptPmhxeH5HYHVTRnpBMiNheyU5MD5fJStGOzNnT2p9NHxBZDVIM0wyWGReUCNSNmVAVEN4CitWWGNNQ19LUm9lP0krcVZpYlc3VCZAaTYwNV4ySlRFUHs3RTF1cklZVmEkYyF4Y3BFMHhIVnk7RUNteWh0e21mYSRwWFkxfEFzWEBYUmUtCis+YXZtJHRfMGk8NHM3ODRRNFc/NHo5d0h6MVhzNDRBUkw3bWpfTG1EI1N4VWt7UmpnPDZoWjg2Wj1YUGJ7QTJ1TCRMKDhxbHAlcz5qKFctCitHY1kpM3wtNERNREtJWlU2VD8zbllFXyh0RkxJc2lpQ1VKbyVKbTc+P1QyZ3ZGczRjclN4M1BjMyo4X2RWU0JDS1J5VnBrKD48dUNSKnxFCitzUyFKbXxGc0x6SDRlJGlnMHRuNlF2IXZ6cm1Re0wyUmNzZStlVjYpQnNlNmJ3dWIoYndiejIkNHI3JHM0N1pmckZ6MTByIztWWDxRdWtOCitDRXFsNkFremt0KGs3M2dfNWRhb1RBdE0jKlFHeWRSJndSeV83KVdLRj5mSyVtUk5IcjYjK1pfY3tzR3hPYyR5Sy1OdTRNIW9gRnZWSjhCCistUGFLQm40TjdwYzspTC0mRjRJayFAOWFqb1d0SiYjUWUoOCN8Z3xidjxmckBSM1Itb3B7X2U4QFl2Q0M+UFBUYl9YYFgoWmR3LVkwPWdlCitzPVdPQyU5V0QtMiVwQD1lWUVyTCh1TTBsP2htaX5eVkpAeiFnJGI2PE8kWmEyaVQlSntyenkmVSZrekhfTjE/UmgzNkFULVU8ZDEpcHhQCitQJCtEUl93VlZkUSVWJEU1QDc8O2soRXhGeExBQ1pSeygzIypeNiQ3VlghbCFRZnEjRC0/YGApe3tEM255enEja1R6fmxFSF4mV2l1PFBxCitPalNVIXpJU1FyXlY5VS1ATExjSDAhQzlwMCo7X3c+fkt1e3Jjdzd+JSp7PUIqWl4lNWE4Njk/PntVMUUjYGhwPG0zJj5KVU9MSXgwdWZSCitGKzM+PEN9Tjk5WExQYDJAMFQ9e2FOKU5XKCFDMVBESTVuNGlaZUVjbkRVUkEhKn5xRURuQHIzTyY9bCE0YHg0OCRaRDQ1YXwmcngpaU1zCitCTDZubmojYCQ2Snp7NDZVWmIzTFNwZUBBMW1eIXtMeyV9KjdycXp4dCktMitYc3N3cypAKGRzaGgzezE1YGlnNX0mXkowNFY0V192Z3IwCitSaDBMa29GSytIIU5OVWVJTDVTSjh2NkEyK3Q5dEV6aEZiKGApWkp7bS1BMG5nTTdXNVomdmYwVUgxc3dncWtCdWNLeDtIdDZPPCpvVDU1CitqYEk1TCVXUD8lYmU5Skt4K3QleklqXjlCYmxRSE14Y3NtaCtpdCYleExgdF9RKzwwI21QNHhoenRpKGZVM1FnazxFfS1aYSV6TW47PkZXCis5eSZ0bVZ5I082bTJ6dzheYnl6aTkwaXt1K31vVWV8VUtBVyZGKDYtJU4mcE4lJWo2R1F4YyZaRkR3eVc1RG5fc2VJZU4/cDg0b3xoOCs2CitxKDNlMGJDIVdxfH1mOEorRVllUEF3RTxFclYhXkkxRnRZTW5lQkBsbjRCR24zcEc/fl96IzhzdU93aio2TTNWTWBsVWJfJTg5a2xXMmd5CitEa15jPDxtQENMRVBWVlpDRFg4ITxzeFg4TlEzTGIhd0VKYylKcUFJdnFNOXF5WCFZNiR+fSRkUi10LT5TVWQ5bClZb3FLRjVZdkpKczc8CitaK0ZHSm1GJndPSGAwJDR8MVNsOTNIYn4qcm9WczxzZnlnPW1ibnolSE8+ODJMfjI+cU9abW0oLU96OFFVWm43YyFVKkJjQS0kWXNIc2p6Cit2eX1vXylRQSgqN29WamY7d0FXNzZPZno9Ji0wMXx1SlRDVnU8TSYtMS0+X300U3o5ajxaLT1SUVM7dTwpM1ozO1BSR2ZOPmxlanNoTVc8Cit+Xzk9OTl4P3IjX0B6NiF8d1ZoRCo7eFItSDc/ZHRUUl5DcDJtI3ZNQXYxKnh5anNiZFg9b1F2UXk4JlJidC16YTZ8YlJqTHxxcXQyckVnCit+MEE8QDxPbVpeWDF2TTI2aTJnQjdme0VjPEFrXzEhdVlDKWE5XmR5VSpqeU9WNCl1NWRGZ2dWViRRYmFfNHdOTUAraGlxNT53ail5RFZeCitgdDt0UC18PjgpVlp2OHZ+Pj89MkRAQ0htPCtRTVM0aCY4QE8qTUpYfSpCSWhVa0x1XiQ+Vn0yUjdfOT93ZlFHbiF+K1o8VDMyc1Q+T3ZFCittMnooeV9WNFRYfE5KeGBSczBgTUB5a3B4b0xhZmElfkJsZCZjTD9JcUE8SWY7Z0M8SkIqWVNFN3FiaiYjeWAmIzExPWVwfEtjKko2YkJxCitMQmNMKWJlNENZI0xjUkUjNzlkKD9RX3ZLdz03VVdoIX5QVyFLbDQ0IXBvQWJ6bS0pO29STHVodiFhfHNoaEc0QGo/ZHl3eTRnfGMjeDskCitCVylLTTApWUh8UypHSntBN05JUWM9UlVLQDUjR3hmQl9HPzZtVkR4X1ZldzhXcUtRU2I0a29VcWlwbjtiK0x2ciU3bWd1aWtVTFdRK0YqCitHd3J6RURDM0BXKFBhWj8wZHwpPVFVfWlOZD00N3BvWnVjSFpVVlVPTTQ+RFNANExGTClkQl5eSnktfDZueHpsfWNiTXpjejFYPChFSkV7CitnQlRyVyZSWHxlPmp+PkdDO0p6K2hjTDxlcmIkQHJaXlRIPHN8PCR7Sl8wemVOTFliPmpmQ2F1eVohO2o5anEkJHFKb1lCfTVqMVd3dmdLCittOWkkWFg3NldAbEBuI2h0UjxMUyFYSzh1Y0NsQmNrTCZaTyshRGRfJFdkcEpnNnNSJnMyO3spVXIlPmU7ck58O1h4dk50VCtfR1JzLWlsCitaSCNYJWdNV0l2RHctWVchdWxEJWJ6QW1wcWFTa3FHQiFIfX1jZkozcFJleFRzaU5KV35iYjxHbGsjI0l9Rno/PGBAOGV6X3d5cWZJTl9WCittajJgJVNDY3paZWRnRntZUjB1eE0zYW5OOHwreGhDV1plPzV+JlZodygpcGNfYEYjSkBQWlYjeHFpakpiaUsxQEEweXswfHleWGRJfEwwCitCVn15Y2omWXsmRiojVl9uT2xJPnFRc3o3SXlxKHVDfHg3YSNFUjxFNylIaHN9IX5qPCt+Uk1Ec35NOVJWTnw+fWhyUio3VzZAdGcqSylfCis3MWJYN00pMz5nSHFOe2FWMktLeCNQJHNqZWA4cDBRV2IlI05RR1dUZF9DQExBYHE+cDd2NT5WWW53dVI5eit+dVdefD1HVFokK08oPDBsCitSVl5WfFAyNDxSNTVwVXpkRnpZQlIzcUNjajU2RGA/YkQlZ002IXUpa0ZsQmoxMzdObTZ9cWR7NEYrZm0ycDZPd3A7ajhZJWlET2JPc3l3CiszT3NOK3BhOzhyNHUpLVU/YWp6fXUoWUpnPkhtT1VpPGlrN15JNDRDRDwwfH5GS1d6cyQ8byFJdnU2NFJ2UUpkRiMoIUI7VHFzPU1lI19PCitEN0J6WSV8KCE2ZDZaX2p2aj9lUTEmS0RlOEpLQkwlK0UkcjhBQzlKel5nUld6WHZDckEra1d0OXZfO183TyVhT3ZmWCV2TihUJnEqV3VOCit5e0xAdWxXVUllU3AqQldLKCQ9JF9KMnNYfVMmbnkwKDFhRU1Cdy1Yb0ArWXxJMGJRa1Q3YU5NNDJCZyozbWBlOz1aRlFJPlNeVjchcnkhCit+Z2o1KThYXyNqJDhkWjlReEk8QUxCNS1LSkZXdlA4OD16al5HJExldmlSMGp7RnBPeitUTTAkKnBrY0JMZGd9TUo+SzFEZnxaUD8yeW5iCitIQjIxO1MmMUA1QXolU15maUZ4WXFvTVlVVz9AUGREJE5MSm5nVEVoVzhvd3tZRWZhYzNzfHJ9PnF2KGQtaXYkPG9SPHNYRFg/czVqOVFkCit2OTBfPzl3fXtMYDQoMz9fRDF5c0Z5T2E8PDNxV3FUWHo4Qz9uKGRoc0NWUjxjPkBxWnUzeDZwVD5tY3dAQTN8PjNfWCh7aVRPclIrcEhyCitIejIzc0tmSVBUNVVVYXtuPjxlPXlxN20jRUZIZEIxalhHPHIhK1pnOFppVHhzQTQmSU5Ta25pJVomUjNTIygqY2ZPRCRTUjFVRmdobW49Cit5YWZ3eVhxc1UmPXBTM0clKl9BNkJDNDshbSs4VSQ4YGNxY1MtRjZLZDsla1hLQ192d2JPcnt1KiVKNiNAVHZJcU9SR0IzV35wNXBOPE5BCitVailKKWIyY21obi1lPXlCbVhgVDtBT25edEVUJFJgS3Z2bXpmMXg5NHk+U0pLajhkRVExbUFsQG9LYnB+QyhrQCFQIUZUfkNmcllGbGZYCis4MDBKaj1kfGMwcEV2MWFlVUBmWk9OcG9CTnhTRVA9cWl+aDU+SjJoTX1MaiZtQW9mWEF+amFGaG9LJUckUVNCfXM3K2JaeG90TmtZVzEhCituOXtxR1FkflpuSVhUMHV7IX0rbH1uKEoze2M7WisyNjRaVUY4eUhte0Z5KFQrcDc8QCZwPmBxQFctfnN8amIzPVp5dWEpdyk2TylYJVBHCiteM1lJYTRYQTx1em1lUWxPcHZub2FAb3lHbEomLX0zUkJqbjYqd19ZfmAlc0xNIytuZjdSeHhBdUxlNDteQ3VnTmdubkNMTU80XjArVG50Cis1SEBfbmJVMylOU3E5OSV0YiFWcmI2cGFBNGVNSkRrPT5sa1l8JERqZU5RJUhzcHk5KWc+QjstM1hyMiZyJXBmal41SEAwN0ZTT3h3LSQ5CitMeTd2clNZcDVSeEZrJmhyd2dkZTBlKWQ0Xzc/MkZATmw8K01sJGkkU0s/UGJWPUdTVlJteTlUIS1QVkorezQhb3BsN2FHbnxtfnMxK1RkCitOY1k0b2N2a0U8VEFFNGRvIzZESHpkNEgkbnxtNU49JEU0KDh5eXVIKkIkJDtwMERGZUwkK0tUb3tzc0E3Q0RLV3BCJTB2KD5rVz4oey1TCitUNlZYdndGa0RpY3NpK0NwJiohbksjc35MVyNrfGR8UEk4emMwWTlHRkZeUSZsR2U8e1JKSWtqXmstUj0lRF5KSjIoeVFqXkA0UlQtLSFwCis4QjhTbSs0O2FRNXBXOUU7QHJ9a3skPU9NU0BPeGtUQE42fFReKSN2cWk1LTRKU2IrKGlGRFdOUkJsYU4xfVczaGQ4bzMyYWRkLXl6WXJnCituPlEqSnU9ZUxAYSh1a0xIMnxnM1h6eWd4ckVqWnIrZ09hV3tVfFYzeH5ZY2RadjdUJnpIM0owT3Rfd1ZjOzchbShSaWI2Nn09O0NwbGtSCitJZEVWNUpvcz97SUtJWWB7ZTAwbDl9VHpDKVd6c0pAWmlPakA2WlVKflpQY3lMLTg8b1pUJVFrTGhWVSVpQm5rMCVGJDxfeDBnNktMQGdLCispT2pZNWU3R3huPVVEOCs7eWZOUXR+e35wWVRnYEUpdDhibkAjKX5LWEMtNSVyZjlINVhCa3dfVUpuKFc7KmBCfXdrZXwxbWErbnpTWjJoCitYeTM+LW1KMCVadnZ2d25mQHQ5Ny1qJDx7T2M3TSVKRjd9KWMjX19sblMmdD8heVpyRylGOS0hPGkkcVk/JlhGVEU9TndZR2o/ejxaYHshCis1e3QpUWZmT0x4RD04UVo0M1hrSWE9NWJ4IVR0RyN4ekt2Wn1eRXt9ayp0TWh8VlpwdSppNjRoKD5XX0tGM2ZtOCVpcURiND1wTDc8KTVOCit2eTE8eEtZXmooS3p7M2loc1ZGVUFjSjYyNiZOX3twUFJ1ZTk0fitwVzQ0c2N2c3lybWs/PE88WWJsdmIpNnMoPTtJWDN3aUo4Ulo0ZU1hCitHJVNASGJDeXd6TFhYSGQ3RGhuSk03e3xXKjVyNkp5ZD0jeWRHViE+V1pjXmxkSjE7d25ucWBpVVB6VmJmY1MhOShLRWtNJntAMW5ue34mCitmSiFqe2oqPmBYUzt3UHN0JDYlbi1HS21HI3t6c2E5JGFkZVIhYEhFTzxpailGUlVBU0ZPMnR5cyNQRkJIVTBEVHhaTnZTWFBIZjF3eUMlCitXcTVEQlNKUGRJPiVpISZGISNxdkNSXzImPHg2c2xJcj1WOCQ8SmxuJUQmQ1dEQCshP0hAMC1eKF59dlZPWVZePU5LbDxTPXdadlNKO0NECitQZmg8akswYHsraVU0fFJHUCtjdnZ0JHJjR3Y+UVBoJj1XeShDOTk+Q09WJnolWXVDe1pveGp+VVdlIUN+fHYtYkREKlB7T0k5SkJ2fnZ3CitodCUtflJvVWBSYGl6UD08b1JBSXtQXiR4OytYNWh6WEs5N20hd2hZPWA7bGJeUXNyNVZnIVhOd3B0VHs2UlF2VUkwb0ZuZ1MpJj9ecmtWCitGZXVvZykjWkxPRklUcjFOMVVBbFlgUUhTWmFyKGxVVyM1cUhuPzJHRCRnUjs5MD9zKGJBYmZ8Nzt8NE5XeVMzVEFZZiY+RWRNYDhvSnopCitDOXNrWHFGQ3RjTT1XKnJXI0FmIUd7S2VQNy1rP3MwKCMxV019WiUrQ0RfZUUqaH5QO21JeWRWPTJ1Pk1OMHs2V1BheFdVU3dgR3U5Tj5ECis9PDRLfmp5X09zRCkyUShMZVFObyk4b2l3dTFhMHB3dkRESUNqcmBPMD5iSjxUZj9qenQldD9HQFozamNnZF5Ffkd0P2tiOSZ6K1F6enE4CishV1IqVUBCYSY8TlBUPX1OJTUkTmBHRn1GZilOfUlEJXIpPCUwZENOeFNKdTkzMHA+JTJQWGBSR2whSCt4Q0lSPzA7OWhyUk5ZcCpsMGVICitKbnpnaVhzJjlHT3dIKCs3OXtkRChOPV5RR0t0eipHdFNIWGtpeHkxNWZ0LVViS1ZqWS0wOEQ8ZUdVPmRLZWFtbG59Nlpybk95XzQxPXo4Cit7RzMzY0ROUjQlbmRnQFR3ZzUzOzNpeTIoY31INVJFflA7YkZXWXlVKChMLVgoMiEydFNhej1ASCN5IU1HPmwoQ35NPjd3Y0EtRWtHZ2YrCitRKSg4VT1fO2J5PHtuYzMjUENoZ2dWKCNMVndZYFlteWFxdERJOztaLW1HRzA7dHdtP1JASjVQPllJMHRPM3FvSXl1Y1VtYHhjJDReRTJLCitjeE9OJmJaZ2NlfD8xb2lebnxSZl8lM05KVWxaUmZ7OzxhSG1GWF5KJXd8ZzU7UzNOdllPe1JLbFgrNGVle2JLJCQqRUtHMmI4cGw1a00hCitUezhFaj91anx2LShxOCEqUktNdlMrJEBmWHZ6eTA5JWpxfFNgXylRajtMQF97JWFmWUVXaiQmQW5XSWxCYyV+K19rJjZhSDxpbEhWNVV1CitIZilVcnJZR0RLcERoQ3dsU1doKDdsWTBXM09NUkk8PHtiUXdBZk0/OzElI1M3REAxaGYtbnBnJFh8MnklLUY5SiZ+anZndUVETG40T1NUCisoSVNWR2VYQz01REp2PWNvN24xT0pPZ0J5NTJCQGR3MHIwaXAoJUBnPHp3XlFSb1U2RkZ4YzFZfVEmQHA5eHJJMWJhNWo4dm5Ze1MlaXxLCis7aUhqaSF5QjhHSWEmdjZXYG16SkpCI20wVEk1VFhfT0Z8cnwxN3s2KGd9T2AjQVgyVGFILTFeaVVjQSNaUlk9dng7STtQNnpRNW8/fEYqCis0JEdYS2xkfWUqWUVEI191MzVoI3EjM2FORlBrJXI9PWdPP2lgdWFiMT8zN3QlP0wtaVMqaSFpTjY+R1VPPD4hOWZXQVYpaWxHOGhBKHw4CitDemV5YWBzUiYyOXtXTEllZGVrZHQyZD41fCpoJU1FZFBWOT9ZdTs5PD1ZanpqVz9FOT9RK08pK25AOVp3SGprSVZoXlgxXlRAOSQ2RTlgCitIfV4/QCEoeUBLNWpXUHU/QzcrNWZeej5SZTtfTENAUmhCX1hGSUhPQkQqNmNKRz08SEt1UWVRTGQ3U2FPfDdUKk03dCFyNDVOblNkalhRCitKKHpxPTg2JXdKb3laPGB8Tj97K3QySHY0fW1iS2VleXkrbGpvc09YSm1PRC02TnZMOEUlaTQlNHNBPioxUk8tRzlnPjhmenZ7VzdNSGZJCis0VmhncyhHQTwhc214ZkYkUjc8aSMtMUNleH1MbncmSkptOVVgSGFYMm58ZllOcHprbmI3R3BnaFU8UjVJQDk/VVBtejRVWVpCMTBYRUJTCitsPUNFdkB6Z35eaGEpUl4+QEViWUlqemtvWShRNUViMWg+KEc8WmB1eGhtdEpJU2kjM1JZV3NpIz0zKl5iPExIc3NncWtjSktVYFdfazxWCis5KHl1S1hjWGhkfC0yKEtlOUp2UylJMkUwPWVDYCN8RTBhZlc/OGVqbHlvaUJfdDx5cjhUbmNiaHNwelI7IXVXcCNPJTJQcE42Y19DaDR6CitSX1lHcFQtNnI/IUs5e3p1RV51amN8a0lYVT5DeW4tT3xqRnA7ZjZJOS00WUBmWEYoLSV2dkdXYl9iTUVtUiUkaVFRQHppQXloZnktZns0CistQG4oSnh5NURnVExNPyUpdDRuUU9TYFNzMF5zbylxekR3cTZlSEtkQTU2PVVkPUt9PDZ8Uns5SUMlQSEqZWk+U2tqaGU3UlRNZEB5U2ctCitvVkErN3FBciNTQWN9PypELUVYJHA1ZShpP3NScXtvfClsYnN7ayhvZjlPRipqTEwqUGl1RDRqaGt+QE9rREZ7eU5zVDJQTiNhMWkyPEV5Cit5PjEpbF5mK0VNI1lPJSlgNT14eVdUK1JAOGtNMSEkPmRFPDtFVEBBZ1d9cmoyYHRmK2hFWlFmPzVJYDshQjVsTnBUT25qfClKNXdmO3ZOCitTVXZaOXllUjRXeXwyQ2lWPWc3cTtiWGxfM1YkZDkoIVBQUndvR3V7SjdPXjN9RjJENSZFKzt9Sj4lVjFqV0A8WThmJkl7JUYjOFMkJT1HCis7SFYtfXJ3PyF4LTBwb3UwKkNMS3pvKmA+WT91PWFTc1F8TGdjenRHTkhtXjMmMl45XnU5fV9BSyspR3VjTyhLS148U1FhLWt5bkUhNDQyCistRSo+LVF6UXczOyV4bj9ARWJibjhIWWtDSjd2O0RIP18jb1E2cGhmfW84S3AjK00obmIxJUJjQX1qez8xVWxNd0AhVjMtejZwQU1rSVNpCis4RzBLLUM7SmE/QUNhSGVfcTt1dmNlTjNFTkF1bU5JZXo7XmstTXJGaDMoOGBKNG5WbWxNM0xTI2NiNShUX3BVZ0klOHR6R3RnVXVvV09VCisxNiE9fCExY2gmRmxXP35oZnh8dD95Xy1gSmQpOW9uZnFxazx5QHUlQmNEP2BiN0I3Izh7ZUpYMldnZyp3cGwtdFZKTG9yRz5XbUZqc3F+CitBK0BDdTI5UVJDdTdLWG09aWNXN2JZMlh1NnRaIUpiTEVpdjc+Xmlndk81V01qaG1oO2BZX1AxfGdibzB0ITt9SUwrNnsldDJ3d2VvKyN5Cis+dzc/NT5eI2YxTERTKWQxPHo5fHJuYnNPJSNgWURweSN4S35JUF5+XikmRU95SSQ/fXFySTBMfX1PJkl7WUhHSVZ+XkI7bV8zO00yaD1gCitjWkxLbDs7IUFSRyhTaDV4UkRzK2UyWVI1NUMpX01wYnRFPjtWKEtCQSR6UDh3Tk1CQVBtbGUlQD57X0szNVdIaHxfPFpnUVhUaXgzY2o0CitLKXt6dVgxQzh8QSMzNmFFK2RZJD97M3VIWnteLUd5ODhjcz4laVpEVURHVUNBKk5mKG1icnNWMUlDN2dIQXk5WFRmP3JMaEIjOGFKSWA3CitxNHFvKWcwV3tCIVZlPj5kXlBNQmdFR09hZFBKeiUlZE5zM2t4YFlBO0NwV01VRXFya35LYHV9MVFHMWxsZ1NxbG9WayZKd0o+LTBUQWxBCitiTGlKcFU9Qm12b1RBZSQwTS1EeDB0JnkmdXc/aSNiKWhnOzZ+Pm5UNjIhV2lScnZYTUYkSnB5PXR1azxOamtPWGRUciVQI3heTC1SZkFPCitwWUhBKTg+SDtjZVF8IU8mKThDQ0B7fTZwdzBoQ2dobmJNez9vLThxKHdXS3VrSyFkR1EzPT4pYFJLcmh8TVVoWCYlTTNuSSlXN1V3b1coCitBUjMjTXM/a3VOPmtBMTAoeDJ0NDIwbTN5OX5MISpoYX5UPnFgMjt1fmZrUkEhc0VHM2kkbShibXdkRnkrYENYX3puRFM4fjZKQC1vcyQzCitYOXJHUnJvRThmKXE0dVN3ZVJ7X0FJZXxrWm55RS0hO0xJJDd0IWQqUiVAXmBBKnQmbjYhTXkqczl1MHFhcDMmKGN0fXNCTiR+SV4hVX4kCitKOWhgRlVOV2BNaVhTUDY5VERAQ3pAVmx+Qjg8UlVOLUdyfitwfHlNNTB1SXdVKGFOY3pzQFo8d3FoJTZJNT8kaDs4aWk1eFh1eyl9SkcpCitMVjkhWDlJMjJ9MUlUc0hQdmo7dFBWOCg5WXFBVlJXanw2KkhfdSN1YVRqITwwNzFJKSpgSmRoOWlsfENTbCg1VkdLPSo3X3N2Jk9AJlEmCitXTjApVU9sZDJBb196N0pUMTB2UERSeWt9S3kxcSY3I3FyO0hsOWpuI008NypsK0BjcyE7c15UZnVwV24lUUx5PWhYMSZpeEJXNnRhdz42CitIO1BIdSp6WDt0U15CKGYkYz5mKFRqQVN2ekNoLXdDK0xmNSp2Zm9yPXhKZWxoXklmSndEMjM7RnM/QHAhMFlDYUs4UTVTOUsyKXtuNGMzCit6WnV8KiVmYD5vXyFifkIzZEtuWE1LPDx9KDxEd34yKGtNIXpqZVpZcnVZQFRtQSRkSV8mOXtXUlZ3ajRBLUZOKGVjJHloeU1ATChFRndRCit3e0VGVF5IWGxPY2R5eHtmPEpDcT94M012TmhxNGdmQXIydy1UajlaZkRFIVReSCpvdXZHeEcrfWQjVVdsLVk+WilFME1RMzd2Yi1xeVVsCitQVHl4VHpBYVFuOUt5Tz8hQDtmLXU+RiM0Znl2VUBvRHt+X1BCb0o4SW9LbEZaWm4tZCFSNzg3cktuQEk3Y21zTXElX2tYTj4mMX4tVXdeCitldm98Q3d4bHFpWmJva3J3MTs/UGVuTGMoMjZuK1g1cTUoQWl4WihhRSlXQDFYayhFP2cwSDBpdEFxc1BDQUZlZTxJQi1IWTM2cEwkITFOCittflU+diVnV0wlcy05K1VrPkslaDZLIVh7TmlnQjlSckRlK30tKGBmfSRfbEFDfnMxPy1sc2MtMV9aWCRpRnRlWlYzSXVZdX0/MkBRPGBwCitvNjR3UmFrZnEkOyZAfEgoaWZKO0JSJntjTDxyc2ZhYTFZNU9jajE2UHA4XjI2R2lJPTNsITZ8MnJ9b0BYe2klVWZlc2Y/SmlfV3B5UURkCishb2UxSXZsWG9ZfVNiU0pKOCVVM18jK15rNHMreHk3KD1waDFQWlRUYSh0YWR0QUEoRVJSanZXQVh2QG9sYnc4KWBPKE5remc7RnpKaW1DCishbTdxMi1WMChJZFlDaGo0cGAheih7cXY0PU9KM1NCaHFBby1UKGl9TSs5R1c/QSVSY3p2UDZUY0BgT14pdEgzQUYrT1YxcSNITj4mJDNlCitacTxCXyp6akl2QUdhT0w9K2J5Zmd8PE5wdHtCQGVCXktQKmJoTFRyRk1URyp8RnxUbD1fPzFkUjVHPDtOfFpPeSpeKjVTOFRKSE44ck9gCishWChtRmpSYmppcFg0NVZ3ISNMVTx+fH1VajdMPiQlbn44ITYlPj1QU0Y7eTBhaj1LTDZaO0U5SD9KZTc7b3NMOHY0ak1yeHNrOGIpPDM2CiswWmdZTiVhbDxKZjd3Mm16STA7M2IqYVdHUVkoVnRrZkM4KG5AKX4xa0cmMmQ1fWleaTVASXdAVExrWmRObyM7UypLampEcEstT2sxKmV1CiswbnhKIzJkeWpLd0grV19hKCVWTl9pcm1aZGpJRkRhTztxX2piZmlDKD1odiFtQ3hBJVUkYjJxV153ISlAPn5sT3VxfFdkV259ZV9yTTNICis/YEI5S0J0O2g1Y1NrSCZgfThyS3hVKUZmMTJxdFVubFJWWEtNTzZJRVo9KCVqXzQocmxoNGVWMGZ3dVAwX1omcEJOPkkwX2teMmklayFJCitwOUtPc2A1P0dTYWgoIXclNDlpYTBNZkQ9WVooZDBDYGJEPkhTcjIoc181MFN5WGQ+TF8qcUomfmgmaDdpVEBPdExNU25BZjZlP1pmNT54CitJQ1R3Y3tTM3xLaWZ5LU19SX19KkJ6eUItJSUxRFpSSSFaR2xfUyVOV2M3eGxmfU9uMEAqa2RMe0w5Z0QqYSFLXlFEVUV6YThUe2ZvS1JMCis1ZlZkYTY0Xn5BUUh1SmgyTTNBMWVUSzFKQk93bT1vaD17VHgzWVg8LXllJEtDQWNCPUUrQiQ3TUVtKnYpPzFIaXFnaU9PcFN1eWc7Qjc9Cis0PE5JZFF6TjE5JHM2elhEQClkJksoRFpJR09ANV5ZNFBwQysqdj1CRWVKbldIZTt9fE92IzRZclghe3xlXzl+fjEjRyFBaXJgPlViK1I9CisxRjtjWHUxZHA4UyhfTWk2LVFmJHxPLWZjOVl8SFF1KVdzdDt1LTkwUXtEeE1zMEJGUy1CRWIqc2hnX0g5UTI/Qk4mV0x+d3wkWFZ1ZCo3CitFR15oN1I9TnlKcUk/JTIoZ0pHMzZnZDdHNHVwYTBZfSZXJVIxKytiM34lekEmSXQrODdkfDxAWihSOFJYMT1OeWZ0T09lZTJ4Zk9kVkdUCis8bHcwOCNmY2E5TW5ZTj99YlpfSlE+VTxLYHlAQmVVTnNtaVE/fD1ZRkFHQm94fGxGY349SFl7IVF1Y0grR3x2VWlvJm4rKDJ4QFd5TzUzCit0ZShxPXdpPVYzciZGNUI1OHhNeTRjeEJTdSR7MEFIdGFQT3I/TUsoI0YmJG1GVD5jOCl7dWVjb2ojKDBLSTNKa0J2eFotMXNpIVNPRXlPCisqck5JUVZZMjBmKF83PTxHYShCVWRJJXZ8ZnI1K3A7bSgtaDkzbTlTOzhXOCMmP2NBXm5PVmNAZlU3SGElJEh9VT1Od3N8XjtNdDJoXmc3CitncCVQNlhQaVdNKk56LVB5VmV1K0hQI2ZiIXt3QXtPUW5CV1MrXnsrRGIlS2JaZVNxVnxyRzxgbE9NSUllc096ODJBLWVFaWo5alhNblJECitsVHtPbEYxZzJjUj9iI083RWtpUzN6Mjx2Pyo0SjdPKlNpSm9Xdl4qUmNpPyVmdGZsJEBtWkghdX50Q09ZVyV3cmdaYykoI25QQmRCekl1Cit9RmRqQ0NSPnx5UkNzWkl6U2hLeCNYYEM/cEdrNUUjN0ZqaWA8a3Y/Tl4jZ2R6dmZGKXVrSmQwSH48U3BiYkdvPVlyLX00M252MSUlfDA0CitNbDg1Uy1XaWYxcylmTFVJdVBUaipUbmkoJGpgOTlYQE0wazNiejI+IU1LWiFNalY5WDQmNUhFV2BlfE5udjxKWF4+P2lGNl49eV57WG9BCitVcUxOPik9ci1Lek0tNHd1ey11N2p4ZW98SWNUPkc4NSpBYVVzb01pbHo7aTt5bXE+I0JacGFxZVVrOFFkZFViPU4hLUR1YEVncnswT0BgCis/aCg4cSVmb01kV3R1Y04mZnI+WW0jUV92KSZLez5LZ2ZoU3JXPjNWcypffjxIOXZxbGBGb1FZK2NfMH1tYUMyTlNNUTNNRlJVPnwocG16CitZLT1rd2EkRkpiPnZ6OGxCVmAqSFZXU29iOHtXZHZ3b2tMMDh1O3lxYkxsTCltO185P21yYiZlcjg5S35ecnRQNiNVVUc8PEhJIUglT1FBCiszS2Vlemx7dUpaUjJgZFdVeUN8fERzO2BsUXFVaXFTYEZpY3haSktWPWdzJGpXajBna05UMCVubkdQVXcpciRieTRAdCFXR1VHRytgbSpqCiskPGpzUnNQOCpkQU51IzVzZz42TmA+T0s4cVZsMUh5fD01YloxfGxoU0khIzgwJUlLSnFqVDNZKmImJVViVW8meTJsKEEteVNNUEI/OHIjCitpLWNVTyo2MihPNiQ4bnV1JmArO3RkKnwrYlYje3xnQFZoeCE1fH57SVl6dUUwamJVYm40fVZkb3kpQz9LTF9hU1Rnb2R+NipHUnlzcVBpCitMTDhsJmMob3d9NjFUMSRWK2BMV2FANnI2Yz0jXkpzd15aTyM1bXJ8PmY4d09kKCMwc3hlRW9pezZhSF51dXtYeDY5UHRZcSl4N0ViI0cpCiteRG1LfCRPUm9iVDZ9IXtfWW0haVU0RkZpRSkzKzdWSWkpPGMwKjc/NCQtNksyTlR6Q1BFWEkyb3MyNWlzdnc1dndRKkJsSlNMTFJ3S0hlCittVWJjVFhIPE1FJGl+WTE+KWpnWT5hfHwlaV54Klh3RlghK3NmaVdhNUNqd0Y0TD0za1EtWCQlTSVITHNYeV9oP15PK3Nse3tGZThaTVN4CisrNDlLTXVtSUZRQE9Gd05Oe1EqSGRlJXdaV2thMmB3bDlaQkFAaUFiV0BVQGslPnlsfmluQ2p+Tld4czQjKzAheSY9RF5IRTRDTXVQYGwxCitxbk56bTBjfnZaKm9rZFl6NCF2c1RjcWM2ayQkSmVmbjE/MklXLX5HKC1gek98ZGJDK0hoeVdVbTUlRSV4XnIrTGNId20tZz5OcmAxNTFmCiszIz0qPGs8VjtuaGxaUGUpRml1NSQ5Uk1oM0pKJjdsMD1peVpZeWlsQ2RBakotWEhoMUhsKk0pZCNGV3JPZngpP1IxPDU4cm1BPTNQM3wxCis+K19xR1lOciMlRlJFSlBRRnVDPFV6RU9tR3JAIz5qMEVQMH44UWlrXnRGUnlpIzxTMV56NXdZWEUzU1o+ZWR0VmBVfXhFJEJaJD52WW9TCit2eCQhNikrJCE3MXk7VEA/aT5KZW0qI2pkZG9iU1IhYEktRlZeZktOcWR4JGsrJkZLOGt6XkxHNlMzUjxrN1FmJVYyP0EpZ0ZZPFFgZ1hzCit6P2JGPmgke3ZhZWkzVHliV3hEJkFCVVhzOHJNenl6ciR6cypaS2Qqb31nY1p6cFZld3tKNXwxNTJ0KyY3ezh3S2VhNEB9Ml4xbzVqRH1FCisoTWxjd3NhVTNOR2lsQXYyZ1NOUXZyJHo4dj1vZGhIY0F2dWM1Rz9aZFpUaGBYOW91Nj1sLX1iaEItIUlFZzhVRXBeTj9fUm91dX15Yk9oCitnOXhuT0dGV3lreklRQD9pISF8eSFCVFFgZGlfaVA3QD97IVF1e2woXyhAM3c2Qzk/Z1p9dTZhVmdMJTsxQjJ6ZSokLSRoVmNoemg/SXk1CitRZ35pfmkyVUFuelpieEFHWUY/JX0yMUp5X15sWS05XipCa1pHfHs8bFQmKVNnTUV0MXRPfU0mKGQ8YGBwfmZMJCh9VDZgdCFWYEtjYCVnCitaLUhBN29BbWJLSDxpJG9+bH5jTXpsKi1sdHBjJHghPEtSR19FS0t6O3A0KnYpKjs4VSk/b3dWY29hZiYlQkkleE5DZW13bzhZc0dWSkNJCitfRzZqQnpyT1M1OHcyfkRfdDVTU0JSZDVgK1k+KCVVNHNRcnZBVnYxRXxkZSlSXn5GUUt8dmd+N0wzYy1rUz5xI2EteiFYT3J0UnY7cjFICis3akx5Xl9hblc/bmBFeyVuZyprRGhlK0szI3Q7K00hdig3Pyk+N1M+dE5BaytOYEtmPDgoI0wqSz5SNTQ0czdwLUNWJShaRnNMJnY7R25PCit6T3ZRUUk4SyZ8ZlA5aG5fKVU4MW4jRDBNdD1KcV92NnBiX3ZQaEoyTkgoRDlpS0kjQ0s+TTheYkZ4ezl0TTw9VmAoO3RkJTVeUXFEPC1GCitkYWUoaC19YXpIdHxoN3c8dTFuZ28qOyR+aH45YWtjQWhaTXNATVdIXi0oYUlrR2M+KTA3UXV5OXZ1eTc5c0pVP31SPHNJQWo5VnhpU3R4Cis/Qy1hKipARTBQVTsjOSMqQVZMdTxtSm0jJFI3WXhtfGpSeFBYQXRJIy1IRnNFbi19QCs4VXE3N3U2Z1dxbXs8I0oqfmNxWFEwbyNHPUNtCitDeX5zUl8hK3E+YCglJlIwdHk2VjBJbGoyd0VaeGprKjZZfkxfJDQmPj1USmY2VkxORUFhS0ErN3NMTHY1YW5vfG94bGhXU0B1ZCFrbn5ECitNVmJLOUwqWnRAN1J1O1VRLXBrM2dNP1FhIVBoTShgRSk0WCR4Jlo9NWNSbWt9djIwUk9Hfk19NXRIJng/blpjbntBYmFFPilZZFBJZXc3CitteEhOd0NMOCVUSCQ1R0YlQzxscTUwTj9oOHBvVCl7aURMPUFTSV4oVXdRIU5vaUc3QXt1T09GRmtVN18qdiReeTJHdD1eV09wb2t4eCZRCis7NUZhMmZWd0BXflQ3QVR7e2xAI3c8cW5odyY1aVFnMHVJQkZTc2ZDcnhePEFIVThsSlpsUjZ5aWVzOHJkT1JXVmRlZCklMUR1S2xMfGU8CitHVT02bG1wO1pHXyN4VjF+cHMwJkNoJmBFb19kPmJNZEdOJmdVLXxfYHtjTFBac2kpYkttJllGOGl9Oz0qSCtLXntRKzxLKmBuOFlkJEVWCisoM148M00kKXkzQUZRKlI9OyMoSlo1JTZnKV5zKmptSVhlKHFKPyVZTTh1UFhVODhzLVdBSStyNHNDLWljTlpeJWclJFMhPztFcjhUcGB0CitMVzE5Z3BaM0U3TCM8OHlkTEhqYippTHd3aU9hSiEjckxYTGRifXFvKmVQeUIwR2woYmt4UlNrY3l4XilkPDFLdVJxKUdmKT9oRSlSdDdvCit3JG9te0otd0Zsb2ElUzRvN2pVPERVQzZZfChfaWUjaiY5Wkd6PENTaGl4fihAZkMkKTFkeTglJThNbEN4TFhWdFRPOTxPNGVZRmJ7M1NnCitTWlQrNjhuSHE8JGVSWklORCVxJDlJeWRib0dWPnJvNzE4dSZOP18qMzxvQU5BbDFXdiQ2ZjUkQSQ/elY7d3hQNk8mck59SV5AYlhVJHBGCit5ZG9OeSl5ZzI3JD1RemxpOVBAPT9OKE0wRXN0dTtPYEdZdHVNQFllSD9LfFQ/bSpRanlkekYhVlpOKEJNVVp+RmppMjdYS1BfUnhZIzdRCitFYGBlcFEyQ3FOdTZMLXtBUUkkSFBaSEZ6TT42UTl3ZmVRMWZkKUhnXykwdkEkRTtFdk4+dTgtSVVGdWFPY2FVdzsld2wkakIjZE1hTmtiCitVeTNTcn5WMmolQXBeKFF7b3k4SSF1V0xNSklHJC1sNTtDfHE8PDN4VyZsIW5MRilwTTZQX3VLT0drNnQ0UnFIODxWUmt4Ui14VDljXyF+Cis+YFgtaCl5PWVzQDt7QjI/Kj17MjQmIU5SRG88YnJUV3J2IWtMeUY8bWxgWFA2MW5GdGUwaGhWZExFUHw5NWplWD59P2ZXUioxIUs5Z0BaCitzRn1WdXpWOU5SRSEyX1Y8SzMwN2s4ZXJFdDBDYEZ2KlZyYE1SWVdZPnZ0aShPV0pOWE5yPUFrIWFxOCtsSXlkTXBVb3VnVzwjNldBKkhDCitqJGJ0dVRsMDwtSWk3Pmd8IUomRER1aVMjS1kzLXJsdHJrPGJBdSEkRTE4NWIya1Z6cSFDYyswKCkrSV83PHReMEFzbmN4fnIkeGQlPlVVCisra0dmbj98TH41PSMjJnprJH1OaHRtcDhJekVvPik7UVp9RkBveXduR3J0UHJ3KV5YdXtLWS0xRHNJRjBWLU08b2VZb3xXe30wM2MjcmZMCit7JCk0USVTcVMqd2pgMm1KXio3Z2xSfCpRaGpwWSVIIVlGOHE3KWtpJmg0RmpZMkRBclApTFQ5dWl1YyRLM2lpQD09dnxKIWNUUTVmO3RJCitNdXU+VWtsKyhKYStvcVk3KXM7eiRURE5uYj5neG0yZyt9b25nRXVoPE87IX1IViRTeEQ+QDFuMTBfXlpTcnZFT2JCRz9UWkZ7MSlzKiQkCit1aHI0O1N8ZWBGQTM3M3VgZkNrMk51M3BLVjAjYkB7dVRLKWghWXYzVERXK29JTCY7QzlQaGZnc3V3cVQ0QDE9eXlAIyhPeC1Ad2QxZClwCityXn5XTiliaXBsbTVeNHIjRlpoe3VaTk1aSVJjNkZGTEEoP1RXPm9vfEN6M147ez50cXRfKkB1MHpESm5KMVp4Y2lYfX1OclY5VF8qUnc1Cis/PUQ9MSlraWsqbFI0Kj82SG01YT9IMT9uIUEoc3U+XilqRVJ4TTlhS3JfMlpgckx5KkUzQzF3e0lgUkJqdUtCY1EtOXVPbExoXmBvJTdnCit6ZEk0Rll0TD94VHlmNHpyJnMkfmNDKWVBciY2e3MweEpBbmdfXll9Nk0kZilFeFp5NEtXOXNzJUlvZjE9JTx3M3pqZWQ4ezRLYT1Ndjx2CitUOVl6eztsYGZXaWd2XnxpKkoxWFVGJWRATmFlPFZabkVPNClqU0N2Y1AzWkhUeVUoUmJaUT1TMGZCUVl1cFFee19qSExDTzRhXkF2aVg9CitTfDZgO0l+KF40cl98Y0NnZjBhOH1LUVdgb3g3XktNXmlBbFlgKEhoUWg0MGRuOHxQNTFqbmNmfFJtaW9eOHMrb3c0RjU/dXFvNTNqa0EoCitmVWJXMkY1TChMfndqS2lMVzF8PzExUXpPOUtlaT5FPS1lbUcpI2ZaSWhwdT4+ZCNBOGhCUGsoUXZfd0gtc0xOTVNoJV4rYU55WF9URkgzCit2N18yVW5iXnQ7eFNwNnJ5NEsoazgqZGt2bFFQUjN2RiE7JkUwJmhJbGxpMTNCUjZMN0Ywb0xRN25nNTI8TUN8czQxKit5TD0xbypQVHRjCitUQikpKDdULSZNbEQ8ZTZoNmVub1ZFemBqYHJzJD16OFR6UTFxOThzeHhXN0RNQGI7UHc7VFh9TDNFLSlJKmtHQDstMyVWJGltRDZEM2xuCitGdEBWVVJVZyRoemo2aCtISD41eGwtcmcoaFFXNXBtKHd7d3BRWGAldzJBUmZjISsmYkUmPCEpWX4+b1ZTPmNhdCs8IzA7JmImRVohfFVUCitNeilvaF97RVpwVVJ6aDclJmB3TlhMMTRfRmJ7YzxIRUp3QX0kRjR2K0VXb1I/PmlqcXNGNSMhfjlMMHxwQSZWJTAxYWNnST9rMUk5N1UlCitkc25BJH1Sej9HJFh9R1BVM15aK1Nwe3RgWTlpcGEhZCl8V0xtYjwlaiprQVFNZXB9UXlUZDwlQ21TUE15QWZ+RVotekwwRUNmZF9WVDZ8CitgK01BQ15zX0xDSjZ0PjVhKkhKaHE7VyV2KkdPKClrR2VAbEdtZ19AS3ZTNkBAJWZ+T0dZK0B+PG12YmNvaShYJTQ8QGNDdVoxeSZ4ckc7CisoIWs3aHdDJVU+dz0+PS16QGRZfCtVdFgmJDh0d3w1MldwbEJpJSttT0hpYT5UQmdjSGM9KnRPRGhWZkZAVmI8Z2ptTHxRNzxOfCNIJms3Cit4SkBPVUZyTT5ES1BweWdHemdfK3g2TGpZMmtIZk08TiNwUElMZ01FWD1PKCFBIUhyITBOYUM9WHAkfUltJDZheDYlNSgtKlkkQ0Q9KkprCit8X1lhazUwJm9eNzBCYVcxQWIpO3smMFN9ZH0xRUZ2PnMmSWtUfUw2eE99Uml1SU5NKyokXzt8bFh7N1p+OGo3M1NZQUZ1OyMxJSllYj1mCitSN2RDIUVwd2NCWlVHc3N4JTxeJnBqRzEjXj82aGA9cztDdkx+Qj9jZWFeKFBBQkkze0BTRFRyTjgjV3F5YTZxX2JtMXM3RjYmM3FFOUp7CitVbm09STdeeUg7eVU2aEwocn02K1Y8TmFVQG98Pk5vVGcxcmlIWWJuT1VkS3s3WF5lfCNFPDxVO2ZFX0M2VS1Je0Y0X2ZzSUstYCtGSEk9CitIc3lgSl9uSTYlWGRoemRPcyk0RCZvOTlOUklUNjZgSU4zQjk5Y0tFWDlvJHpFZGlpbjZwK2hQajZwZDxDKE5OR3FaVWF4MSZKTmBnYDMlCitOSTtGeFlCejBOJWhxQGBjSzIkdTMkWktXRyVxOW0kNVRTazZyYylIKlVtfSlNR2UhNUJZQXM9JndlcHZNfkshPlhYJF9QQEd7dCp6TEdOCitCUUBGUSstMHcoVXpESGRAfFZ1PDJ7IW5YV14leEg0ejM0SEdhVzNIc1A2ZUZgQGBGUD5sWHQhe00kWGVeY2xQNWl7VkdUU15kX14ha2o/CitfIXtCTT9DTXoqQTA+JT5zOWllVDtYM3RAVEJFPnBsUHc5TGgrcF5HIzs0OFV+WUE0cTRiS0MxfWh2QnBBaiMtc2o4Sm9Nfn1QPEFFZ3tTCitwfEV8KWA0JngxZW0mfTw5emRZXjUtPnZvYGRzRV9AaWZUMjhnPnRubGxxM0N4TFA1WnIqPUU1Iz9afCZ3MSVnWmx+MGVsK0NFSkIhRk5WCitUPVVCUjE/SDc8MmVMPnFLLTdSYDg4anZ0dG4wXykhXlAoITltfmY+YCQ5IzBRT1NQLUZGS3h1bHVUaVI3LWYtN1BTOzJlXkItIUtNSX1TCis8TDYrflBAS2MwTFpxJlhGNyRLei18VDI3KjxSTyo/X1R6RXN9cDczcHJ6diZ0UmdFWnFqJW9JM0ZwYGdYZmd+QyhgWk9iZFFjNWB1VSFgCis/YCo/ZEBLMkROTCUqPGlWZnIoI1lNN3o+WHRRaHEzJilGbXU5dEttX0d+LXVVJVZjbE91azBRXmgrKmBMUyR8Sj99UipTLURmPmhEez9hCisxNiNfbT9Ua25gPHRSTGBscHB8XmdIZlAtdVliIS1wajMjYyZ9N0xpTU9hJHtFbjVPeXxObkdSa3did0lfPlowI19gKW82NXAlTFA8IyppCitEU0dkRTRkM2N0S0Q7TjBAbkJFa0NkNksjP1FibU9TOCtkIz9wMTJyREE+RXBjMjhCNGQkcnMpUmhaWlhUe2FHWVY3cmJCaVJgcm1UYSp2CitJampHOUR6WnZwJm9UaWR9VDYtLTd3T19UKEZOaztrNSZsKnA8IUlTXislSjk4MCNAcX5TWUgkQ2F7ZmkhLX5JbkU/KkZDeyVSWVdDdWo1CishQUBURHpBc2taNVRUZVFiUEFCfFhfJU42JGNlPWpHYHdPUXhjY2Ulb0w0QXNgWG9jejxsWnkoSVJjYG1AdTk/WlhhRjJLKG8lKWZhcXp8CitTN2NLUj1pNkV5STkrXzYqfmJZa3cpdU9ePXY/Vkl6a0YraD4pa0wmQ2toRG8wfERCajl2QG9PTzRTdjxINT9rR2pJRDg7YkomOUVKPCtyCitzV0RwbTF0Zi1eU2EhVVRrZkFqVD98NzxpOyQ9dFpATmtYNSh5RH5JUF8weTdNY2tlV1lha2V3PGFqKytyNDNCPnxzYD85XiktNlNIXjN6CituRDg/LUk4dWleTVM8PkAzaihaamNEYnVeNHJ3OHxSLSMobjQ7LSh2T3hOVGc/YFAqSFMpQUk2T0l6bl4tTn5qSi04PTtZJXp3IWVjYFFUCis+aEB1TzdOWkQmQU0tSVdvaEhrPXxNaipGPzUpUEdZOWFPRSNNX1JnWFUmOCk9JFdONz0tOV4wYVAyK3FeQDxqclUmeGJhU0NvX31qUXJBCis8KUp8ZiQlRzRmQmg9U2t2Pj5BQSptezNfVlEzUzdgMiZUZXZ+clMlTS0/Q3k0a0JtfEhuKVMzQTBfa35sNTByU2QwJlJ5S1pjZHxwWTw2CisjSUxwSE0+O3MlIU1mX3syO1hRdCpVZmh+TllNSXo3PVZ1cWE0MHh1XmxEdzI3WkQqdERpZCt3Ym0keytKMVJSTiU3YXIlOE9Day1PYWMtCitES1pfQyY4MmxeYU12NDhVc09HYmx6ak9HTXlFUjRoISt2UyZ6fGxiWUxyZ0ohUGBXIXg3YnkpSH5NfDhYJl8jdmMjamspUWJfcypAYlFhCitMaEFnQjx+fSt8Ql9DNCgtbG9pJjVta1ZoPnBXNnNmbk9lMzNafGdZNDl7YjRBaHQhJV5iPm0wJnZQVHROKE19eEx8V1VybHx6emRMMktaCitmPmNMVTBQP21LczFZem8jc1BpRjBRN2g3VWNaKX52KVJWciU0dHk9XmhWUHkhdXlWYXhFWEMhRVolOFY+YzQ8OD98RTFRYl9IQTdSel9KCiskM2d8RzB+azlOUX1aOUJqWWJzY09yY1pPVGV2RGluTG56UW9KKTh3T0B7JX02PC0zMmQrP09xbiFac2VmbHp3Y0t1dWcqS0F7PmZDPUp7CitOR2RNZTdhVmFtK0pCdUI5eUxhOUFzNFAjZnZTMS02eXZ4YHFwelpIdnZAYztxTVg/em89XmU0SlIhIXJSUCFBS2tHek41SGZeZ3RTJTBeCitpPkVuX0tQZnxXaksye3w4KzNuWm4zc24yIW0jWWxWV0BwSF5le0hCMlZBTXtfZ19rOX0pQD00JlYlNFMpKXE+LT1LV2A3eERoKmEzQTxACis8Tlk2KHc2RjJMJSpoR0wkSGdQfVNrSUlXSUQyfn4haWRnSy05SSFHcFVzTUxFTlZwWFUlXnMoejsxKmkzfmg4dCtgeGcmNXAlaTZpPll3CisoKzxTPzNocEF8fjZOeTtrSzFpNGBxbzc/UUBSV1N4PikxNEombFJ9QXBzUHZgYiNtZk1yRjhVa1VSNjRCeCNEVFNQPUZ6NChPYX1AZV5tCitZRnQmd3otbjRXQlZKOUxxXmdATldfMjlvKFM1M3lNIU5hRCYlM2tgZjNScCZIb0sjOUlNdkw3a1UpRk41dWhfSkZBNGtUWnFsYDE1KylOCitWWFJ5ez4/ZFhlcGhHQkY3aEpgcEFPRGtAWVYkK1p3TUR4PilKUlI0XlBpaio+ZkJLNm0mMGlsNkxUZXEtfmJJTUtAejByelowK1M/ajZ4CitlKWo1QHQ4Y0YzVmZOYmVta1ArJEZXJUIjZTJ7K248UkEpNGZtNDJGXksoYUNKJEwwVVcpK2hSciphPUBGYSpySUZTdkgqMVRvc3B9NWZlCitAT3IoREVePkptcHdobHszayZQNGx8VHJgI2Z7QXB1T3NaeFhNbmtvcDVJV0VXPjhOaTczdTJ5c0pvTD0pT0Mkbjd5MEBNKko9XiRjQjVrCisrUnJtOEhVKzN6U2ghUUl3QFYwdmI4bCpPKyhOSUJobDQ5IzFyZGRnSV9tYipMNk0zQS1jdUZvQj04fU9IYEY3aD5EWTxOODt0JDFMcE0hCit2PEYpJmhgUnF7ckZFaXc5LUB6RUYkSERTa3IhJFNSWUVJNnwzPz1JaVdxbTx7YlA4eUZ+bm1xZHtfaVRfUVVXQih4czc+cHY+R3BoNkdJCitnbWY0I2hOMU0tam5PVjs0cDhHZWpmXlc1eVN8c1I7NlYtSWsrTjdnVkQ7dXp3IXpLbVgkV0N8Vyk+blMycVppTkRJeWUwSU47cDZAZ0ZxCitLJShRQEJVdjdeQFJaWjtWfEQpZnVFfHBaOz4/V0AxaFJ+dldOUkl1XjBTT1opdzVadyZoKmp1QF9+JD9SQkFfT0Z2LWI5I1Erai1jKjhvCiskVENwLSZjUE9NQDZ7cjJ5UzY+Xnt3filEa3pFNUtpU31EanpZQGFQT0dtSk0raE0hKUhoTFdGRyROJGx7PHpyUVFXTCNSWlAyJipPaFVkCitaaExRSV5LKWgyRit9fitLe01IKVkkaVBNdHtCVW5raDNVUF9CPkhYSyYoQ3tSJFA0K1okQF4zUFQjaWtEcTl5fGZ7S3R+S1UxX3RCeGNJCitrYjNAWUs5OGpSNTlOPDl4eTZBQlNDM25YV2phXzBVeU5keVFeR0A5PTtSUG05Xnt2dCMzbU99ZGdqM3FrOzNvR285NmtBYH5ZMkx+K3okCitmWE1RV29+fDxaUnkhaFRgdnlja3lAMiV5KGlyOG1qSG1AIUtFWnZzekFpKlNeb0Jsfj87NC15MnomQjZiXmAyb09CZU9sPVpBVyFMfj1ZCitWMis1OD47QlYtSk1JI2RgezlBY09DSDxLO3xCKjt+ISFCN2ZzQE11WTNJTFZEfmY7RCpmfnZ6RyUmVlEoWDt0N1E1RnRLTGI+MHFWMWU3CitoUHteang3NV9uZHY4PkZ6TmgmTm1JWHg1cWF2THlYZXlMPCFhREpRS20/KkpYelVyWVhaKDNwPkxxIzZQYjA4ajlFNzBVZU9fZ0BHYVFoCitHJGJyNXo3Wm9saGQwUjIwdEpoKnI8X0h8TlNTYDlVeE57cHomfn1rWEFlI0l4K3FpbF55b0Bzc3pFMHBIeVNAP3tReiFFN2lPbFVwYm11CiszbDdeR1FHMyYxQkQ8Mnw7cCtidyhqSWhtNTAqaitaS0opYVpJYjNIPmVFVWAzcHgodDFrWGMrflBPelJNcWIrMVpPRnxIWFA2JjlPd09KCittXm85Mz5fcV5gN1RiPSFDRGhqRT0xeipFd0BLaHZmV19kRDRQV08mYj5SVVRDR3hENlRSfENlWlchYmpzPFdpeXpeRzUkVCQ/YVJrPTt5CitNaTNsYjk4QF5Tej9hc2QxZ0VRIXFseTBpPXByTUQ8KnZPLVQrQChMO3RZOztLJVg8SzsmUDNXYHVeZkpQYDhXKTJ0Jjd2TC1vNWRXZTdCCitkJjdBTTRDOFE4LTJtNE9gRmtSUT1qbEYyN0x2Jl9lKH4teEw9JTJFPlVwRW1lQmNoYEM2ZWQwPVE5cFR1TyFHUUBOaHhPRXtYPyQ/dnElCitjZFJzVVdDJHBEc1U+Z3BuUyF4VEZzbmJqU3RsX3JOYWo/YTh5Nlo2S1JAPG5qMnNCPlVIfV5LI0VzKUNSd28ydWBIK2N3QV8jPUROOFMqCitCViZyXzk8M2VvIVAkLTdlaU1hWjhAcXIkPyR4TDxXajNVTDBFbFhtX0Q1WG9ORUJqeXwhXjtKe29ma28wQXZZZD1GMk5RV0RJK1I9SXhBCitrKDBiQ34zWSVQRH49OUZNb1ImfE1MVXpubFR9IWlARl9NWX1qVCtlOXVAUH4pKU9eXmlvNCUhNmB4c0lsQWpvP15OOyteKjBSVU88cnM4CitLQ05KbVBgR1QwYz1vJnYwUENpVGo3NldKS3JYYz9XNlZ3U29pZkBJfVdxQFN3N1JwdWYqJkI9WjV7cGxLIyh6ezRKYkRaeVF0IS1rbkh4Cit0XjBUMGpHJVdfcVUzRXNOKVdzQzIhIXR7X3c+KHxoQnNpXzYlTDVLVXZxQ2Y0Yy1vX0FJa1JsNHpvektxaDBjclRINVh3Vll8ZiVseCZkCit1dDBLI3s/fGN9JVdmUl5XRVcwR3JUazRMY19nMHo+ejdjcEF6dVY+PHFQeEN2NnVre2xnRlV5bCY0IUBmTj1vcDFxeH4mK3crbEgxQDFDCitGRT5kTnV4NHlUPl9UUjZAQ3J7R2t2bmZ3YyE5emA5eD9AWSRNYntAdyVvfnU4RGl0WWo9WVBfNCkkd0UyWTdpYHs+SD1tT3xyfFp7aUhwCis9KXR6VyFUeTElQVpXdWtjRiE1eGZGRjtfS2h3KXA5MHpgVjZuTDlaQk44U3ljdi1relM+MTQpX3YyWnYzKnwtcF5OWWVTNzFSJTsje1R7CitPK1AzO1RISEUtdUAxNWZlKll6YF5tVWFeeiVVTjkrV09sJVpMWiMqejFIY2kwRGNpP2RrakViZ2BZYDthdCRDVEx0THo9XnNvajEhfm4pCitxRSY5TEJaOENpOHAmZ2Bwaj8hZEFjP3E3eTk9QGtlXl9nbmlRX2Y4XnpEc3VtQndWUGh2UXZvSEdfZlUqKm9CKEhDVHUyOGtRal5DRncxCiteKjZzMDs5LXxHYUVmdyRqaSZiPE56MGxGaG4kRUx5c31FVWwpd1RRVXBhYUxMJnhpRkRmcmxBcWxxYCFocyE5dHNyJH1ZLXZxRz1KKjVUCitgJHJYTDNONXNLYjZmeTBmfDZWSytjaEt6SXxEeFl5d1YkZ0pjeFl3cFNicURzKVhiNnErQHwtQmczbm8kfkM9RDtgeHwpP3xvNmtZZC1LCitqK1N0TXxhMTlzLVZEOzMmTnp2dG4majQwZ3RRbEE2Rk5ESzVoSU4oe2UlVGl8emlEO182SiVmSzQzKn41SDxwSEpsVWUxPTVKIWQ/QmhCCis4SVBjJWIwSFJFYlUxak9RaiZJNENGR3FjQjBnRVppRGJGNWNxTDNZVkxXOzlpVGZwNy1nSFVJPH1JPl5Ja2RleUBTR2dBMmQjQ0g4TS04CitrQ1RVWEdnZ0h8dH5rOCUhMT55RiZVOHdeeWdIeCZtUFpHPGVLT0FwQyFNaXhoamtQbnZeNER3Rj0jMH5OP31Ud147MmhWc09YLWY5KUNLCitNaChDKiY8eH0+T3F5U1lQb0xBWiZqMHszYSZuYFcmdTtnUWlMOH1hJldmM214MypwUCl5aWl5JiQxNzFFJHhHNTZYTGRvaHNPTkEzOHVlCitoNSlBY2wtcFo2MVVHUkNXa2FoNW5rdmA4UEwhdEc5RmM4UW8xIT5RRGFqdzxKeEJEZU5Ubm5aTk10MXdWJCV7e043N3VtMzBofWdKWm8zCitZe19WSn4ldFdHJHtRdDBmKElJQT9BUntURmNpKnxnPlZFIV9RfDh+XlZCe0hKNjg3S3ZlVS0jNk5lKDJ7Kk9oPUFZOXxHXnRKPkRgYiNlCisoU3RxWitTdT1gNiZgX0Q3I1RmRHRRflBoUCZxKGd6WWtlODtJa3tGMERaTGA8Ql9SJXN7O3ZDJCU/NT8zUVdDRk9WMX5fT1o1clYyYzMhCitjTUMyPj8hNDgxT0NAYzF5a1JnNj9JQSojPzAqT0Z1M29mdlNVfiZEVX5+XkdIWTcmcTlxPjBxTkJvXmdAM25Ydml+bF9tbGU/NWRBTzlBCitLRUJebVdCPnZGPHstaFVGZXZpYzhTbFJyMFIwalR1Xj9wSFJGYTBHZDFPTFEme3spcVJaKDtmOHNON0JHJnNwSkJgNXUqIz5qRmdFYGBqCitNWnpoPWFMcmJlTVYrUE8xY3BoR19CMFB7KjFKVV8ocWR8VkllaWNfaDhLbi15MihvMTVtc0VeKlVKNiQwNig8OFcqNk8qZCk9LXYpVWJ8CiteeyUzdUBvJnQqWVUoRnV2U1gxM218YksoP1heMGpSbGcrc0EtSnRsaDRNdUVPUlFhckV3a3BaRTd0RXwxcmREeFpveklvUVJ8ailwVEthCittLTM3Zm5xcjBYN0NCSEpETS0tdkEqX3FDZShWMXRiNGw2K2pgYFd4UzBncFU4OEsqa2xSJC0/TyNEMFpQK3B9KVFoU31SV2w/cGtlUWoxCitOWiRGbUh2S0VPNExVfjx5bTdgZm5tIVZ3KnloJkZ0MDtubm9VNWNZLWp2WjgjfV80XjF6czFEZUV8QGEkaEtQVFR5XmxNUW9BWiFwdykyCitjX3t4REFBSjFfWG9pSzlQUkt5KGFZRkJEOUlYfGRUe0ZqVmFST1c9eSE1Nj9wO2RFTGJeMFVvKXQ2M01wbGxYczlxdElXejVGdkdSb355CispTEcjTG1jSlg7YihLKmhzZGU7IyMmP09Efk1RIzFeSGV9a21wOER0T2NhQG57bnprKUs8TzsmVlY+ZyN5Tzt6aHIpeiEoISZ1cXFKTU5TCitzT3tvS2U1fVF5WnA8Z0hVbmxTV3xYO2pZOyQ+RXhlMUEhe3c7aiVXT3pfN09+NmExK1R6czhpTDR9ZG96Zzc8IVJaQ1pjPDM1dUk1RE1nCituV3RlMTNEVXBoXn0xUitASD0kPClLV1gkNGZLP0B4bTRuQERUVio7QHFSZE9kaGUySmpuRFlmbHY1cXpYfWVBTGV0RGk9biVsPCRAMG1VCitEP2FxKWZ2OHJDMihuaSFIPzlWdDdsTkt7RUtjT0JlXyEwPjs2NzA4SlduOSVvX1lqTUp5TVByd1FpNzhIWnNxPzx7aFpJcURObzh0Z0thCitYST8hMVU7P0xENmxEKFM0WmlsWV9UKEc/WCprMGBNXkBTZ1dDO3NlYEZCJWcrSl5lZSliT05HSzlIJlc9Q05PeHtrTjlhRklRMyFDPUleCitCJUBtcGIrQF5AdE8tJTdncCtaJkMtSzl6NjtLZCVHZFBUOUNAQGI9YHlARXRQZ0BhLThNP21sWH13bERPYkRCTWY3aUZuNz9rbGROKT9sCituc08rQWAtO0xIUyFySVEqQ2Zeb0RiNnpqeTw2PSk+dEpld1RUX3VeKWV7UWxQfCsmO0E/eD4zNUVNKkVXWFVOPVY1Kjg9dzN3ZUFAZGBuCitPazIzQnFCN0Z3JUVWdlpxclh5a1dCc3UwZzFRVl8kT249VF41JnYjT2hyS2NyfTtrcmJDK2ZOcWM2T2E5fTt3YD4wNTghdXEtYmApVkhgCitAVitnVmA+eG8xcHFlbSE9JDtGWncoc0A1RXB2OWstV31BdzlEQzBNXz96KGd6bmxzMWNgQVJLJC1pO2BxX2g2d089MF5xWiFyNSUpI0ReCitCN147aEdWSmZRSER+ZjVtWWo7THAlWTIhT2poVHVHQS10bDFBNUl0R0kxYGZPJEZKVChAWXtyKHJXWXZjd187SSlGMStXLShwfiUwQzJhCitOWmRUNU42YTBvNHJLfShUNkVodH5xeSMpZHY1filqajx0V2d7NlZfPHRqeC00O2NoUUNiZEY/UXFMOVliMGJjKmlKTStpQ35TJkMkPUd2CithKTdxNkBQPCM4X15YPkpge3hKaFU3RzQja3lWbFFVZioja0g7QnZuKlcle2RPblZObWNYJWROZWB1TiF7KklJTnozJXV3WTwwSGFPeShICitxSnxqaFlxVzNMYSRRVzlaamB5akBkTTZsXmZ5dFYmNiprOVBkNGg1fillIWgobWNpREJQPEJ1OU5tU0Z8WlFkSz1oPEhAUTlIKSVIWCo2Cis1QjYpZGNhYT5ka0N6djkwT31kTDs5aGtkSVU2WnU+UilBTl9tNFU3IXtffCV6czg3PGolSk1XOFohRH1ZSDMofnkwQGpHVzh+cXZMVCZYCitkZ3hXVyUtcXZkZ3hIJVVvZHRoS2wlMm5ja19BM2E0UX1iJE5GTGIoeSY+JiheI0omR3B3YGNLMS1XemRzNT9ESHVYM0JQK28mI2dCVilyCit9ZVp9azBhKWNvVWhnQ3lrISl6MVZVTm1ZdiNlWnozckBmcDVAZHclcF83QDdgdSFHMHVMcCFGRGd6QHgxNTsrJlY4KUxrRk9pTW8mVG5RCitFUSYpaFopMnkmbGZfZn1GdjBGZn0jc0A8KmU9bz1tdz1wa2Fgbl5LPVU2SUJHOHk0RFNBKkhMNCh3Y31UKCR3c2Mxbm5kVXdvKXNyN1dNCitiPGd4KFI1O25NNHBma21VYDlBVVFnZFNwZX4hVTdyMEtGam1hcnNUcT5aTEl0PlhDdjB6cXBAKHJVLXI5SXF8R3hhYSoqUy1NJko/Xkp4CitUV2t5SEE0QU1QVD1GeEJgRmk/eTVKVGY2TitBP05CNzIpVU4jWn0lREVjczYzO2k3dXduZHdNTzleNGBqWEVtYU1QaGRtelViWX15JUQrCitPPU1DeGZ6T0V6aFIzO1ZkMSVHPlg3NVB0cz88OCVQeDcpWkd5a3BkTWQ/UXZMZHl1PGpec2c4aTxuUVUqOWlzZGwwWE96Vno5c2p6JWVMCiskSDc5QDFYNG17ZXNuNn19eitpVzFXJVBIWUlRdy1sYFkkJmBGeWxwfkl5IVJxKW1uM2lkSVFhS3NkcHwtPEIyZEVGVCVGMi1lJngjY0tNCitPSHU/YEVQS2ZvT2RmdW0yNyk+R0VNUntWbH0ya053WD4lPWFfLUh4U2R5d3gtU0Q7TnhjSkJjaztANUJaOCNqKHY4V1JIQGFnWVlOXy11CitEeHh3I140RkhsS1dVO21ULUthM3ZnR1UkP2deKml7KTtlaVRJSEZ0JWlvTXNpJHo2SiF5VCYyKUBzK0NMekIzYHsqNmlqJWUlQmhaRVprCitnVFYoMVBIKEY9bUxvYVRqd09pSzUwclNwVDhwWVphJXVFITllcnJXbXoqRFVeVk0xPnFCNFhiYUJ1NFBGc3JMJnMoPkxfdnFVR15edD5ACis+I3ZDcCZmXkZnUkVXPypATUJIMEkqU0srJV5kdnk4dXR0RFM1dnlnSXE/P3xwXz5eZT9WeDErNWh0cU1UNFhCP2c8MHsxPnpkaDJFSzMkCisxNCRVdndFPnY3MUxIaDtPa0I4NUUqTXpFaykjfHVfUih1UHFlTE10YSRBSklVK2gpWGhSbiVFK2NfendgbiZJYiN9U0FWTEEyVmtoeTZxCitrKFE5QnBBeXE1bXQwYEN7P08kbU9sZUptUklQR344RH53YzE+KjhqQzAoYil6NDtAZkN4aGEwdj1LSVJpWn01MDI+Z3hgUUpJRHhAVD9xCitqcStrKU12c15DZnVYaTA0dWJ5MXFgQyl0Yz9LRzdrT3FvKFlyUX1xRkQjUHhJOzRuaDdlSH04RWw5SWo5OGUqKlpMQThCazZSIWImQXU8CitrUWh7UWJOeip2dTlJRVRWd0FsXnlkQzRLMmRMQHU1YV91eyRCeG9WXkczem1SQ0pKSTxSWWw2Y3N9Wik3SVdnRTNWTUxrOFclJHpxPV83CitoPEB+JXBkdSN4bjx2X1B7anUjQFloaG1LPiRWUn1aSUF6eXtoTzlYWCpuO3JkRH1DXzlGPk5KflEhYXJoQj1hKipqOzRvRXo+TFBEY1k0CitfOSFEfmBYTnZVR3ZFTjlxZkxgeXVmY2NlKD81UGJSbE5PJTdvIzlaM0FkSk5TYzxJQXRre341U15JYD0halBsYHMjOWFBNkAjWlZtQ1EyCituUGV1R3FkbEx2UXp6NTdsc2wrS1daQF42Kz1EJWJvI3o3bFpGWTx2JUFjNSV1T2U9dVMqeFhxVVUmU1Y5MnJaS2ZPUCopNW9vVTFEfERVCis/cH1PTCo2dUp5QVNkIUA8UDcqUHRqeT1nKzxCIzVXJnRxQWFkX28tUjhOMjMlKGMyWjE7ZSVVSDVLN3oxXkVTZWl5dlFaO3ZOPmhuQH1GCis1UFYwYUopOE9OY3QhVz5vWm17Rm4wcTI8YDY2dkQybHZTX1RkQ3JQemQxVztKRip4KnNeOSY3Sl4kKn4lKE1GNmtpYGhBWXd6RSN7b2hjCis8WDRWaGxWdGhyRms3SGtFMHNKfHR7Q3BPYENzZ0A1aSRDPUYrLSpLKlIheEF7XiNCP1g4cXBxaiFWWjNpKil2d1A+eno4JSNGTil2czBeCitocGYlTzN4K2xjSz1ld0FQSFFwJlN5VSRaQzEwMkdPaVBPezNEYUJ7Yn0hdE10TkVGM2grak08aXlYUk1yKk9NYylVbks3eX5TMDEzM2NfCiskeTl6V0E/YWpKRjtEPTZQKDI7VDJDRitNPF4tbU9gI0ZMLThWP01KMCVkUzl4VnVNdGZLYlYmKXM5SiQkO0YhVE45bDMjISN5MytTano8Cit8flQ9OS1xdiRDIXdvJT9MZXxBUTFfJncpNG5HNWtDcFROaVgyfHxyPl55a01gJjh3ajM2WjBVV0B9ciY2clIwSDVvPEM2N2p7bUVAYyVWCitMWiV0dnBnMl98VURTYkVgWi1yITslcjFwYlhaNVZJVGBGNz5ReXUlMFRNYk5eYklBRU9Tdn03eDxGendvQ0tgOFZXOG5OI1ctQkBrUjZKCitsJTVrJXlnfiFhaT5hJm5fLUp3MXR7dlpLWUBKenRaRDtBTHJQWlpnSz9qTjl4Sz1EV21ORlpoKjYlJlBZSEdKQipTa1Z3PHhlOEdvdDstCitndSVIUj5TZlk7SEpZQyRQNEZDKDZla2F2ckZLUGJ1Qyk5IU0kal5vaEo4bHhubnM1ckdvOS1hbWlObF5PbSNFSyFTbnpSNlhmR31kMSprCitlQSsqUF9eZDBUYXE3Z3ZAdkJpbigrfSs/MW9uVitMKz97TmdubkJkdWIyI0lzcCRsTFY3fWZQLXRud0gzNEA9aFZPNkBrM3hwQHZeIWVBCis5JG1hX1pkcnJqZGktNStLaSorNkFGdUdCTm5oOzhXQT50Pj5GXk5NNXJ2KGxzVV9UNTRJdiVwU3BvT2ZXKyhkMW9haV4+Z3Y+Mi18T0ZnCitVc2pgXytpJikrJCRlNExqQHZkezsyfl5Ma209OSlwVitmfUJrJXJ3Iyp0P31KOE4/NTZAclg9ZmY0dj1lR1RqfllMQVFETDhiM19HWGs3CitzNz1NK0tCK0B0NzhHWTB8cj9SUDFfZV9gN1I2fDghZ3FXKnclYClnMV9MZGMySDJjMD5gbClgPFNvemQ4ez8rM1lqfS1SZmJjT1hNbTc2CitYfFQ4KyRJLUE2QXlLflBgXjhUI1hxQ1JnbVQ5SWoyV2RlN2RCU3E4aGMzQztyNCo8SGYxNXo8YGUyb0FvfXUmPj43a1Q2Ozw8aSMwT0UyCitwfU5gb3tTY0VPfjlRayVqMDNpPTNhR0g2Mnt1MEpQSWFBc09AVzNoaUV4YUgwZ0VeSTBTOzcxeVc2dWZsK2NYa211SUluQ3RtaXFgfXokCitWeXlTaXJaVCFQWU1BakZJUEBYOz56JEw3bCNhWElDOU1DZmdPYj4kN1MxTT1wMFdWSG9AYEA7bSgmK2I1I1VTX3Mmaz5LOFpPezRQZH0zCitzUUAzclZvKmViek9aTSlWJj5SVmBmP35BUGtUaVZuMUp9PV5UfDtLbVI0N2BjZHlHSjZ5P3hVYmZieUQwS3pMX3A9TTspSCstPUpNOEZkCitSMTduQ2FARGFYRm1RdWNEQmd4YCpYWWwpVUw+UCg4eThRNElRK2FOViEyUmkjRF9jT1IxZzxVSD1Ka09rdHJMMT5xTyRIXjx4K3NwLWZQCitgdUkyLWd1Um1XfDBlLVRyQmMmK2FDJEBlS2hJe0VOUkIlbDxUVGlAYUJucUtEI0RjZDB5ZG9IbyhTSUh0PS1PekNzWElJYlREcUIhY21vCithbjBuVWNYajE3PEhwcVRVYHcmPUFZI0RrIVFHdGd+X0szTGJtbklHZVNUMDctK3BhNCR4YEFPfnt0Yk0lXnZuR0ojWWZyeD1xJXBuNilKCit8JU95OH47V0Y8WSQ0Nno7WFhOODJaXll7fTIlRT1ZTDFIRiRoS3dqRHw+eGZWY2w0Izd+MnctOFN1UTdLIThnPUhlRCs/MmFoKFBGKih3Cis0eEBXb2ImR2hteiR4Qm5jPVlxcUJ4Kk0kLXkpWWNnV2p7U2RrcG48VmM4aGBFKiUle3ZpQ2w9MlJPVT9UQ25lcj9pRUc5c2BUQUVeV01ICitOZG5WYzY+MnszbSg8OSF6b3A9aXZNe204ay1UTTtTTG9TbHUjcVNnOUVqYnRPdzBjKUtfVj91U2h2XkpPP2NvIT04PnMmLUN9SXpMUDtfCitee1defFJYZTAxUjxFeyV5eEBBNGlMdHZSJTxwVzA7cDtFNGtLSFdjfSlIb3RgOyhSVHNTOSpGPi1MbElmSF4yWWtecjwqbU5uWUZ4X159CitYRkFIfWAlelhiK1YzZSE5PWNHe0pkcVEzQnVaUTVxa09faXV5cXtgPFJxbEg+bm1uMF8te0AxcSZ6ZFF7KkxIQiNyT2whMDVxZnlJZ2pxCispcE1neUN2S0xxeF5nXldSXnt4SFp9ZXE9SDY/fFFFYzVCeXlxJEVvPDNXNnYmWi1eQEYxS0pSPVVGKkF0WWYwOypJKF9gbyleMSRmKE45CitpcmlJb1BYRkNLTXZsa2Ald21EaWBzVX42YlUzWkZZTDBVKFF6akRtakVFNFQlY1BhMClNM0E7VVhgRCZwfE4odElwdFRwNEd4YjY5Y0d0CiskSShgSiN3aHw5ZDxJLUd2ejdsaE5idTdrYXA8ekc8QD4wfndiWiNhUW5HQyM8Sm9iciopYlp4WSE3Qz5IJSZSSilqVCtOaFVxfDlUdykqCitTWjAzUE9fKVdPYGlmMz8paU9RX3xaazB2TElAc3M0eG08fHNqY2xjN3tual5qcUBTU2NvLSo3ciNtZiFBdXZ2YWY2YVV5QD04Wkh0RlRkCitpZTI/d1JjWV57ZzgwZiZxJGVOeDI5YUxXLTQjJmNSTXV5PUpONV47S1JOaV5MPDZ0YHclZ0R4I0ElUUBsU3skaWVxQm1fcHt1RDt5e2RECislekNvV0xBaUd6R0BgVlQ7MzA0N3tiJX1hNmdmIUF0eHshOSM1KjMlKHxJN3xBZUx9QDVnUCRjJntJTV84RzRPSXZNdT1eMUZKPyRKLUI7Cis4U2g1cHgyKjVTaUdNPkJfPCFxRmV5Mk02KWZLKjkyci0oYWk3JmdHeDBObmBtdF8oTmh8ezZXeDArMFgwYDQ4TnRzXjhAYWdZTFpCaHoyCismZFRnSEI8X0ImKi11NHJGdno+M0paciZXcWZ+OWJDMHlwMDsjejBqRjkpcGVYTUA9VTZafXdNWm5TZyhqMGRydEpHSE43bl5OOUROTWljCitLa1FWaTU7Q2h2ZUhpVTN5QHRjaDwkT0Nrb1ZCIWgjP1dOIXZmQVclWXNMZTAobC1FTmJ+fDEjNyNmbnR6e3traXN1eXlTNlRiflVSJUBvCitCV1kzN01gb1lyanxZdz9UNGtzZElGRVpobUhhIW0yNjNtZ2dDM0w3QiRTLUVNfW9rUmstPzdQMWcyemI3VCV7cypNdy1gNmxLbn5QUns3CitLMTRNeVZlNyZRczRZSkNBZXIzKj1CMD9Pc0BtYj8pWE5lUyNBcmRfNXdBSSlAdEo0MVZQP1MlQWVieXU7Sm1LbnZ4dylseGtEcEtEK25NCitLfWc+N1lrKHhMS2I1UEwmXlA5ZSZKQDBwMTF7VVE2V29wcG1oYGBuMFJ+TTkrR3FMWSh1JHdZPDZ9aVd3Jig4eHBnPF8pc3trblVSUmswCitTSyNBU1ItZiozb3BXPEhEM04pVCZuK1FwY3J8O3QpTVJ6UFpqMDQpTWtSUVBQVURVNnFRO3NEaXRSTX15SWk1YHYyWUlFNFo1Q2dUPFdrCitEI1VZci1Wc1RpZDZUPSYpN0c/fTQhJH1rfT5Jd1RCNTl1X25TIWJjdn5NWlozPCNAQzRSZEN4SFdKXmRQelA4VV4/ZjhuckRRPCtnXnMoCisqZ0VrMzMlakFMOTlFPGdDeyphMnVKWjl5RHU7bSVnZD9DYk1BR25JVkRQWn0tJTt5KCZASSZSRmNpQSVjZ25xb29sXmRLMD8lZCl5UEV7CitZOSp2KmlKTklnMi1GKzA7M15zbGNqJjd7ZyN4RmlFXiNzMn1nISFyIy1CKUM2WWN2I00hT19hcF9eZURgfUticT9seSE3KipGVSZJcnxmCitITStsIyRVRXY4ZnAmSXxhWXdwODIwI3hWWSZKaHpsXj58VTlXNUpoZ1dvWTFjOER4R25WaEdzT0JRbFEqPjM/Kj0mSzBtbWpPXmN6Vil0CitRYX5eaVI/YnNUVD5hMGV8N2N7N3FNNmgkKCZtRjVGNGZTKztYJHBMNEpQSitZN1AmeXw4Xm9xX1FPcm11ODB3KUhWa2RaQVEoTj5Bd0o7CishITEqVUtiNE9xVTU0dHs/ME9qUVFyblNYQDA5cUhxVS1vciRISyg4KDtTNmJnWFdmeF9mX0dGM2Zial9+fXZ9Y2NNbGlhTGh3Y3pYR1VSCisyfEhGO2gzeVJZJFpBJSZORj9PRjFZcXUyaSZpJCEkLUAmM1ZNRHs8LUh2PTVkMDhvMypDNHQwPCRrSUxZbiN0UHdCbCZRRVd1Pzl3NTI7CitjVjc3VVdkPFpkMzErQ1RueSktKkh8ZFM5MnBwazF8aiZWPm95bVVlPFhXYT9BIS1DNzF3Zzt4Vz5OXno3VVlSPyQqaG5yZm1NeHhPIStZCis1YWV+ZDVLTiVyLWZSQTZNeiF2NCpMd0t2emtkNXJeJSghSnxNUnpGb1lxfnduWXsxelojRTc9NWJRU3MkNjF6UGspUEdDeylhPC1aeXRYCisrJW54KVJVeTZra0FVSH1oQW5rX1dLJnlGIT9rTmptcjY4fXgwKkJ5M0FyZ0BQI2F9MWxhc2FycXg3ckJ5Uj1xMFRDdjZyRFhXb2d1Y1pjCitCUzVNVUhZPjF8X1lJSXYlejt2O3t1anpEVTwwMkEyWUpoMDZhWCFPSjBKJkVNSWh5JGU4LW1IWWNYK1ZNZnFrKnZuSFdDNWNnbiUmdzk2Ciskbl5MRjY0bjE8dUZAMHlla2hGS2EjSTRrWTNUX201Sl51VD53THBEYyp0Wn0xaVJsIWdNYlFRcipRVylhYlF4PU5BQnw4NmJwY083RVFBCis/OWs1d3BXcy1YZkZHUHlMX0B2bkNnZWN5S2k9OV5BdD1fKGY2dEFmeUAtPml2dWJuV2N2cEwte3Z7MmZTYkIwS3tleUhRVHUpNHd7NyQzCityI18yZ3RObzxFV3dwP0VTNiQ/bDNxRSFacDRmbyQkO31UQyZESGlVZ3phJnc+N001T3J9N0FvekhKJF9QM3lWMjZlfVJjMEc5NzwmYHRaCitVJCRPd2FHTSY5Mmk4NmxYJCQpKyElR2hJYU08Z0NXP2JQOHFQOWBrbUJjZFV9ODdJcXhZJXN5WCNDenRpPWhqcjc2MWZufjM2ZkZIPzU9Cis3Jk9Kc21nU3Y7d0NKMG50eU9xdzNQbGJpamFyUygtSTN3YzBnXkhsNGNNX3k5OS17YU9wdFZzKUVVY15ucyNVZ043bkArUE9uY0o1ITtlCittTkM5NDRyNkJvcjkwcklZSzshO1k5Tj4kfGdhQDdQRGBXP0NoTkluKkQ+YHtQVmZRUkJDOD97PTtpO08hJkRMUmh1JW1vO05EWVRsaCVXCithODdzPUl0OVR6XyhqaXNQYElFZkc3dkZ2dE5uV2Q1RGYmZ3EtQmo9SX1iKGp6cHJEJERUWnMqa2gkYVRgYUZQaSY+MitWJSg4QC1hV34rCitSVjxpMGIlTi1+b2slZ1I5WHR2Y01AV2R0aSZqWSFVQSZebTIleyZSbjYmLURCTmVxc2F+VjY2PjI0Z2lUUmBzQFozK1lrVl89Pm00PTJfCisoOVlRclFQODl+bWxxcXBAYmtfQkZLUEk2XkA/R0xyci10OXxxVmIhe0s3YGxZVX5BU1hENSFOa3EzdzteP1I1fCQ9ZktTRHApSmY3KXp8CitgSWxRayE7b21DcH11fnhCOHE4KU9vVShfPmBgfUpWQXh7WFJ1KlAtcVdnRn5aZ1ZmQTFvJU0jbFkjPExsQVJzJjdycT52eFhMQWx4ZHZyCitxMSZoZlZ+KzdENkZUSko+dl9KY1FKNFY0eE5pJEhwdVlYU3IhPkt9WTVxbThwYCVrP1M2NWlvRzlPWmUyMGVvaEdsI3tYQik/aj9YYTZYCislUUE4T0l8Qm1xR1Q2RXo9IV9TITYqRnFJXmA3SjtIVDgkJnZHZF5NSGRzNk8yQiE7YGJ+fG9yPl4rcSQkLUxAS21Td04+K2NZUjF2U1JHCishWShkPjlGT2N3bFdjVHA9NUBGfjI5YitDV1VvMDEpTXVPQXRPKWdrJnIzUG5SeFIhPVNNcWZ9Yl5CNVk0dChPeXUkbld9VlNHT048ck4jCis4V1V5dzRWKlhgZVd0NEFEN3Q/I1AxOVdAaEpFQlo5YEBDRGlOMChgQjg5Y1AhOH1pZGpJQjg7SHI4fmhhaCQqPm9OeiNRb1MkanFDYWQjCitJTGYxPU1PV1VJezA2cil9RHZiPUdGTDkpc0wlMWdrQmghaWM9MXIxOzYjMz1SJDQ2QjdeYks2aHdOcVNKdW9rUHc5eyh2WnlsPj4yemRoCitLfnh1S3N9QDF2M2d5PGw1KlIjdFlHYDU9Z2cpZVAkT2NEI0lpeGg1N2pAeVFRWU4tWHBQdEZ2fS1lZz5DWUQrNmc3MGsmT1FvNXh2eHhCCitlIzMwQzc9Mm9hZE02bC1HXjAkXjRrakMpWSlNI3pfbVZnanxSSG9DVF5YMFJfZTwmTHBXa1MrO2hgMVVnTmBGKDEjd2hncCY5WmRpTT8rCitEM0szSUFQLV5eOUUlfW9vX2htKkxmeFdAMys0JnB0RSNLO29HYWIqOGV3PnsoI3pTVFlHVGgwWW1sJXZBX315bG9YfjQjWCVtdn4/WjxMCit3UG9lXm0oJE8oY1BrTE1xdmd5Z0U9USl3TE0+a3glYVBmKTtaK0NEZ0tsUkFWODtuXzAoKFcrYlJ0Vl9AdEtSViNLQT9MaFduRithbDtCCis7aCVCdzMxTnh+d0t1RGZUSDtkOE9RUFc4PkA7QGpaSWBvWEM8bjMlOXM7aSRlbG0qWThzdmNXTHlaQl5rOExMKk1mbXxSMzBxWFl6ejt6CitgYzd4QkcmaWFIYmhkUmJhaTYxYmJ0REsjczVUdGs3dCZ0PVo3I0dMY0BDP29yeDFAUzl1N0JxYk0mbXFATm94PXRpVEdmUVY+M2hEQkMqCitnZVk7bFVvOX07TitDO15aTSFzPGxufD1wT1Q8VC1zT0dWKT8rO1c3UX03ZHJGR29KZk1NWW1KTipCMyZeMENDZWdiUiVQbUs0OCojN2ZhCitLaj9rMTFjNmZvYERLfGRoK2Q/aSNFOHM2TTMqRTAkbDdvWmBvV0p0Zmh3amYwZ3ghJkBZQn5fRjdieF9hTGBsJipjQ0VCd01MPFV5cDVxCitpSDVUPyg3ekleUEIjMmchRylQM1Y9e3JiRntRfG15QH4hKyQoZmskPDJQJnZJPSNwWElfPjlnJGAlMyYpOHNESDgmezsqXlFyO3YwZDEoCis0M1k1TkhGUVhvMExMQ2Z2Kj9IMz88aWkwbEt6a3FIXjRkfE1xLXZiK3hqWU10eXIlc25RZTdwVjNOKFQ5PlJENF4wMGVsT09TVEpwUHJiCis/NiswZmVCelJVWGJFM0Y9O19sUDRXTyNOLT5DUSNPWmQ0O3w0bnt9Wj4qQThNeWspK1gyQmJxYmV6MkJeJkJeRVBsV1pGczBrdHs8QHI9CitxPCoqYXV+PlhuVF8pO2M9NnUwbjRiVCF0QC1vUktXN2c4Y2M9YjJiTGhWX18wMiMxVH0xQD9pUllPQTs1bjg2Jm9NQUBpdkFjUSR4RU53Cit0PUJvKyR6QnNPLXBZd0YoTEp9bjxTLU9vdVU4d19GZDEySUk5PH5Rbz5ZIT5NJFY0el8rXmRrc00/JSFRTFRmTVZ8I35aWSNmVi15Xms4CitEPzR3JDVBaCU1QntmPntPcVBjc2A5djIjeEtPWVlMSVZaN1E+cHFHalF1ZmI3bCRufHk/Ui1zX0hFb3JIM0BMWFRvS3NxOHFMZygkZHNiCitqYHVncGA5JTJqe2lUfngwS3l2TlJwQk8rMlYlNkMxWihYTkNBazNefFh2fndRVzlvPTVHVWw3TSsoKjhNO1dJNy14blJEe3huWiNfU0syCitWbTQmSEwyKGt8XjBeZX5yZGBBMi00U19CYU44cjM2amVyb1VWdXdXWVkqR1pjJCo0UFVuPFhuTU1RVU17TGduSE1MenBWWDgwMnpmKT4qCiszNk02NHwmVSMlT0F7S0NqQWNiWjc8RjFKMFk7YD17cnxiYUF2TGlnOUZPczZoKiVOJkg/cDI7bnIrKWQ9SkdnKj0xTDBkeF58bmF7NiowCitnVkghM1JLMStMTEhZcXVUNyFaOzBuK0FlTyRTJXVsd0lJfWV6V2MxJUc/ZjZaJEhZRFpRSFkzekhKWFRBajQlMmp7eDtDQ0B1THJyI0x7Cis0P0RELV9uS04oeXN+VlNhVkU+N1c5bGlsN1dUJCFpZHdhMXJuXkpQSiN6N31YOTY5eUlZMX1xfDspRE4oNTRrZDQxJUReeSQzV1chdyhTCis9JVY4eThwKmRLITlwYWZoSTIlPj9KdysrYyM1UktxT2h0b019LWNIPUVCc29BKXRwUiN5K2QhfUhYOUImYXFKUlV5bHNHT2UjZm5xUlomCitOcUgzRzA4bEhSI0tHUXtOQmllWnQyeE48U19EWml4ZmBwVFBiSlRtVEk0c3AmUj9kcHZfMytkVUBwY1FhR0ktSFE0aXU+Qj95X2RYN0tBCitNb0FCQD1yZSU9Kk92PmVAd085NHA5Qnl1YXRnTW58dUhMb2hsdTQxfHgxR2U+YFAjOChDYnpFb35uWTRoQX5DQTk0dzxqRFRDJTdYSyRGCitGa0Npb2BfK18jakZPKUBXIU8mU0NoKU1iWnkpM057cXp+fGFPWjdpVkFjTUM4JStzNno4QkU7I2RzNkxyT0ozV3R7SFo2JHVAbmxPfWRACisqVistfHdCOGNkIVlJIzBTRUZ1WF9kYnEkWkRDYSFKKytlXjVUc09EeDZFY15sMmx1TkohMTFeNmImMDwlXzBVJnF7WGJkaXB8OTVaZjNuCittPUE4V2xMQFp1PHdWZnBKZ3JFc2pnWE5iTmVQMClLUSYwPF9tKCFQVVE1cExzc3NMZ0BMTnlAZEJZVVhyITE8cGZWYlpSKjV2RXFtPjdjCit1VHBBdj9yPUlBT0BMNEIwQU44ZHlffTVsV2MjUiRAfGt5bD0wWktlRW1KP2g1Vj5PUDJMPWlffTlTKyshS0gjVXB8b3RtaHprZXRSUztaCisrfSkpOHMpdGJWKXFub1heZyhfdV8hdG1OJjlrfW1HbWB3bHlJdGhYSzchM29uazFROHgydXc/T3x+Qjw1X3k1ekQwLV85TFoyTnJRVyM8Cis7Qnp0WDljaW9lOXcoMSYjKDFJZHlzRDxCUUJIWHxzVDhzO3Nnc0h5ZC1uV1B1UU4qPlJyWE9fdz45dz1wR3tuanNqN18qWFZyUzdMWCh1CitLY09TWURSX2RsM3RULSpOcyYxKUwke2Jma1d9V1BLU358TTg2e2goUT5KJEYhb2lGPlomWTl4JnpZclcwOEdMTm9WQ1YzIS0tPl96PUdKCitNSV9mPWt4IXwpbyR7Rj90KFV3X05uezQpMGNgYn5fLXluRSpUQzluRzVseHZ+X0RFc3JNS05tUnN6amV7eUQ8cG99XiNnWHNHNCN1WEFpCispQUM4UnNDSFNQPF9AMm9mfjVXZWtBSjd5LWE8IVRfOExNMl4zdkpJO1Z+MnBGY29LKXckJjk/K2xAOD9ZMz04dzY8YjgtPn0xViolWjlACit4RCZ7SX1aUEloM0dyM25ZPz14TmNQX2Vge3FmKkxGLStEZmRGVExmJj9HK3JjUCFWa2tFfFphbzYtKytwKnp2cHJiO0FoLXBsTnYoV2UoCis/Rj92JWAwTCgtNihqYHYtQEMmX0V9WntGdmg8RFMqIWxeNEA9emVrbmtrKD1Sa0MpRGArSzIteTVXYU9RJTtqNlRsVylJd2R1OEw8TEoxCitpY25lWl48SnNsIVB+ITZLdyN4TEdzIWZgN3RoT0Nmd3lpPWo3VG5VQlNDZXFCbmE5ZzRmMyNFXkJHMj4yd0BNMm1CIyUlUSU3WCEtayQpCitUe3soUjh5JDklKn5RSUlJS1JfKm0yUG1BPSEjPHliMDNIZUQtSz13XylvUjZRPzc5I3Q7Mm40UEk3U0hyV2w7QGYjZVhNT19XeEU5PnhNCishLWg9Ryo+cmhfOyYyaistVWVSX0dCKXg4c2k2QkQ8fkQ3KVhsdD1kZ05oZ04mejN4aFVSOGMhJWMoUTw5fGRUZS0lVnZAJmBNPU1sdDx8CisyVzFwcDxmKkkxM0xkdDsyaCF7VkxXVWBnV0s3VCZHNVdIeFpJbDBqfmp7aDZHaldwJkJPaHBTS2FoLV5rZUpEajZ9blRNYD1mVHttU19iCispY09MKzw4YHwpUFdzYWk3MFNBQEd3MGZzZjI/UjY/cHtVREA2KHJURENVazJgUEZyel4wZVcyTnFWTzZROWVVIUMtMHA3cSg1cX01RD1yCityKDNvKll5JXFOcD95UGlIdmdURmRqMDA2NEItZmB+MWltNypLQThQZ2NUcHUmQXVRfThSdHBQS0gweW1Gd0oqYDhXK3ZsdGQ4ZnB+JSF5Cithel4pTz05RCl+QWloZ0BBZjwwMzladHZXSj1jUE1uaDxAUjtRKXAjayNMJEtIKzh4ZTw5VyplZHlnaiMhUWEwZ0V+ejkkYWVLO2YlMm5DCis1dXUhKzVpRU9GVDZMZ3luZFVQQUBvXlJodGpPMHcza0Y9Q0BicTgjPWNkNCo2OSRQO3glQmZvLTA8TiEhPS0oU30pJkFMUm9gKDB4Jj1ACitAS0Q+dnA+M0VnNiF4Y0w5MGNFP04jdyhjWTV0RXJBWipTXjtqUkMkJSgkXm56PztQbEtKV0x5VjFeXm9vOT4oUEckLVAoKFBIPEtHdXNeCitRZi12TD0xfCNUbnl2bT81fChmK1V5MEgzPUpERE9QRFhwQCMpfU5gJG1wNEhHYXsqWj58bHVUYl9rOEkzYTJKTF9rMz1TI0dZJTFUKGtTCitTa2ZMcmFtR0pnRj96fik2TzVkT0hROW96PE5JYWcwXzZFRGU1dDVaPTNIR0pkMyRaSiopVnx3bl5uaFBfPFlBR2h7VzV3al5JfmFsYGhrCitxNyl6QkghMGFhZnU7Xm8rcmcldWFOcDQ4ajM9fldwT3Y1YHJiRD1wfFQ4KjNiPzlRWkQhRCN5c0tSdl9sJFBCSG0jeE1FS3VwITI8ZDhZCitwVWUjfnsmfjdHTDBXPD9eODc+Y1BfZFEoSTFNeSNBOUNvRENPbktlTChxUTBCNShOUlFKKCZpWEc8RnludVFuU1FkWHxBUyNaRSMrU2hACit0MnVHen0zJXlIbit8RzZmRWVpMV9XUmoydDkyRTJoQmxhSEs2fXwzanhzVm11NTM5LXR1QkpwaXxqUUNAMnczLShlbUtCPVRZJDFnXkg5CitiUFU/S0xBTippRjBLSiNxK2l0IzdRaytBdiZ2Q1dDV0Y0NDJSRmxyemNtZmUxaz8mOWBNKmdERnYxYD9DPE94WXZNNEJiKy0mU05SbHQwCitmZ0k7djwmR0pHZlYxQSZHYVR8KkdPUzcyK3Z3NX11RHBPZWVXSFM5PW0wYWtQeW5pIzlgI19UUzBWM09tWn1II3BmRWdsfXtmXkJ8X3BSCis2UlZjWjFTaFhQfis/QkRkYnstVCFWdm96K2RFbytNRDMqXyppNTBQMiFUV3lTdytNWjhfJkRZY1lZUFFmbm5lSkQhZz89Xk5lYDIpZXFTCitKe3hYWnolJSRPVyVIeHxQZ1RSS3xwJTxMOSkwbHE/KjZ2SnAzLU5uTj1TVm54fmttSmcxVCVNISQ7SS07ODk7IzZtfl4yfEV4SDllVms/CitMT2NTKWhVTGJXSTBKbm5tO1FedUZCOV48anlKNyhpdD45OWJyfDRiVVpTT0p2QHo+bDQpeiErfVRDQSl0SmxrcWNjWW5hajJnQXBtWXJiCispc3NHTUxuPjh3K3lBRig2fGwwJUJqe01uPVVeVEIxbTY2RmVKayVPZTFaM1FRfVlPfSVDN15WcDR3fEc1O3hofjlycndAdkQjfUg/NEl2Cis7M3szQTxzRTt1QlJQR1ohR3RuRHEjfTBOWnFyey1oQ3F3ZihZZEswIUY3VjswP2E9LU9gLWdmaEV4UFFQVD93RE0/Yzt+PWFCPEpZKWhICis5OUNYVU9BcWFSMHd4VHYyLT5zQGc5d0dIfF5XaVpFd0VmM2N3cW0xeW1LamZffEQjeFl+I1BCK09HaCkhc1J0eS1pZ0I5UzF0U3s+MXBeCis5QVAkMklSPGRUTXEmak5EJmNRSyl3fSN9cCE2JE9YdWhgdSUwY0sxa31zNit8bXMkSjNEdjR6fElwRlJZQkQtTCFXV0B1M3Z5OFckQ313CitARDR2VGw9K31oTXYjYjBnQ2QocDtfeTN6N3Y3MjFyKCllVCtkVVQ1Vm9OK1N+dmUjIUA+VHNKNHk9V0NQWD0xK20hQXJkYC16Z3I3I2d7Cit0Qk10Uy0/dlpScVQ4NDhNdn1ESi1DeUMmVWh7REc5MXA3X0pjNSZsQm42RDJXTFc1dSo2TmVVdGFLcWhKMThGUj5NNkEtKnNgfm0yUFFQCitsdEV8PXU3ZXZmJDs9YmI2UDcoYUlwc2p2fiU5ZTBUeVZ0Mmc+VC1RV09Lfnx2ciNjX2J0YFE7WXMqb3FAPHVsOEU/ZE4mZDRZbzsmR0BXCitWdzw7YlowLSE2NXh8Q2NLWHcpcyhnYEo0TjgqQG9XKWAoT1d1O2ZlMSRQQiV9ZHcrI1pFQlVBVGpTYihoJklQN34lX1chX0d6bXRhaiN7Cis+VjhBZEVgaTE+X21YTH5LVFp7QlhIMlB8fSVFej1EOEFKUGRTc1haZ1IwdVUkYTAwS0lvaTNUKXRKV0kmQjN7d2A1eEt2e2JGcmFEMzJ5Cit3ZlFUa31ST1RqfENuWVA1aTFSNm4qbjxyfCs4Zl9sVmckUUllQ080NCElR3RaIWFqUilCO35gc1Y0UjVNY2czWSV4eEtzfkUqbGthaShyCithQ2hgdSQ4KW9RMUApSjxFQ2FUemg1diNlakwme0Q0IVNRJkVvMkpqWEZ3fDVrZi1QJnBYSDJCPjM/KGUoaWJtIUZKa2NJcXg1c19COztjCitPNU1xMENTR15fQXFHMDtZSUp+V2pnR2tAOFoyQit6P1p0NWBEMFlFRlB5MmJ9OVF7PGJAMyEwenZ9Q0dtJHF2Rj1uKjhhKCRyY0dKRnE2CituRTlmWCstWTRNTjNfY0EkeXI/eXJMMVpxR2o9UW18Y0dgWTQ3XmpZaXFyc28wJUBOV2BpZXowJEcwYn5kSTtgY1ZTMVhwMl5RTVlnSTtgCit6aUklVDVvVSlffUVhZF84TmdUbDVxZ3A7fmRBT2ooenJ1XyZMYihOfXRDTzxGaishIVlhLW41QT57VCR+blpHclg0LWpZPX5qPnZOfSpACislVFdFRDBhQEFHaU9RWSsmYmE4YXxyMWttezduKXhIVFErNStEMz9tWllNREFNdVZiQUx+PCs2TV9tSj1RelI3Y21MNStRYCs/THtocytGCitId3hEUW1DSzYqUlRscXZIOCtKNUduR2B5JFhqODkhZzhZNGQtPlR+IU00T25NUkp8MTwzLTVASXlvSkNzd3g4ZzYwNG0maEJrQy14fXI2Cit6UyQmbmVkYmU9VilmTnckYEIzZ3t6cH5eeFprfGxDQiQydjliOyV5PnZOfTx7a2VkRVo4QnkxcnA/SjJPKittJDZMP3VmfDw3eyk+ZSRACis7b2F9VzZ1V2k1Wk03KU1oSGt4VTIzSzFleih1RF4xK2UkaDx1MlVMTjZxVGUjQGhiOHEhRC1VVno2Kz53VjdvI31heDBHKCVLYDxXczI8Cit2dEM5X0lPdFFKM3M0TCtOZTVoKXdVVjNmenNsKUooaDZyREtMQGNZOXNlIUVpQz1XJGpkejthKGt8JGpHe3hmOSZpe2AoJnhHezFCems/CitOU3pzMmlxNjt4eGlJMXR2PW9HezYwWFo9ejxwbSV0dmRqMkRFYWdVeStCRTZxe2NyO2JMUHdueCZefSNYI2NAWXdEWEBfS0ZWY15Ic0dECit7RFZ1VEw9UjNJWVQpcW9XZXRvXko7dl4rTll+ZXFab0dpckthTTJnIVdVNn5MOHlOYip3U2NPZSVCWSlINE5mek17N05LXl4yVnErPU5ICit6OEZmM1VzZTMmPlY7OUx3akotYUNOU2lyVEpFbDl4Wk1xfXhVeU02XyFwa193OHZWOUxIfGJYQjhNfXVFdUQ+RHAtKiZ7Knlsd04lTyNICitAZT8/Wm13ZXU9eTZ3X2ByIWFpM1BkWTI3Zl47ezxIVEBYZCgpaDlNfXJuWEc/dUNVQzkoXn4rOSl8Rjdvb1gqMih1KlopZ255NGZ+QnQrCitLZ0czOXhnVTE0WG1JJm5qWnpZNjBmVzArNCpBMj8mOXZVcHQwSDQmdDVeMzdwOTdZfighKiVLKnRaM0kjVDh2eUU1fGU2bFBDcjNlVE1PCitkTiomLW1MYSMkMW52M2xxbWo8bEU0bCEkKHR5ZjEmJl8pUipSMGBtODAzKURzTHYwRG5QYTlIVktTPU9JVzxNRUg/aVclSyRiWWlPbV4mCitjY1I2QmQ3RFE2JTl1KGZzQm0xYXxHfTkwWj8/XyRDa3U1JXdGTnFneXpwdEZZQH0pdldvZHpoKEltTSFnLTZoPilvNi01MGUwJGh2e0BzCistI1JXKHRJfTYjWTUoPlNJV0BtbzVTOzl9PDJSPTYrJTFAVGJPZ28xUU5FaDh0dVdkeUghbG9nNWhxZ2JlPE87fjNnWV9LQnVNPGBScEB6CisrandAQ0lqYkw5SHIlTjw0TXRwcUpDLSYqX01PJXs7Vk5VSjRZUTFnUzc/N2grU2UmMDVpWGFBP1RZVVl+MEdkdGhucyp0cGZVcnowQiV9CitqYjF1e3pUYWdySl94bklpRzJ2eD5WKUZvNFdmOUIkOFAwfitUSXBAODJ7QSRpJHVaNXNkIXNgUDV6MDUkMWAye3ZUMUo7YWNtS0d7YiVHCit5K3VMbWlJXmZnXyghR3dEV3JGYWtlPyNwUm87SiNnbFJOVk9XP1Nma2EhPT1+JVVMYiFiLTFBZj58IVd2OHA8PWJtVj54P1cydHNySVJoCitgeGZFZTl4Z2QlOHRUOW95S1deYkRPTDdiVzxpUCZlaiU4OVFJVUoldSFvQWcjZHtjdWF9dFQqI0xqRylKS1dubGN7dkdCaT13V2BzP3d1CistK0lRWCgpMkolekVGNERwQEtRQDdQTmk7dWw1KjlxTz5WSX0yfEcheyl6SWBEUUpZbkMqeWIpdkdmYGFue2kzT3V7YV9WRUtNbkZgVWxNCit2XlVpe0glQTBrQVBIV2VTRTwjZmwydDlLUHtOcm83PXJAdUhPWlJ8dSU3O2tMdUptU21wWUlTd0xVVko7Z3YkOXA0VD1FZ1EyU31EZzZ9CitQQ3QzNkkwYlVsWjxYamVFc0M5MVgzZDF+U1hJcjdfIT1SbCVQdW4+SnMyMCQ9Xm9IUlhuSFg4bWBRe3NXaUl7Vm9mO3FnQT1Kb2VSMmloCitzZG4tYztQVFB1MEowP3hOTEhNSk41QTM3P1RTSD9uUVFLIV52ZjdQVXB5PGBSJER7dUU4YnFJSGZGfDJ9PHlOdztqbTtleFVQdHAhQ09xCitqeCY4Nl92ZjRvXm8/bnxweihKNWoqWmlTKjNHS1Axb3VMdSk8Ums1ZWx6JUtkeXE8fG5tSWVGPlJebUF2KTFFa3hSbj9uMXd4ZVZ3V2J6CitrNnxjPjRfbjdJO3dfR2NEXjN2Nzg7T0VOJnVTWStaeFc/Wn15OXVTK3tvMW8rYWp2UFZXRllVc2R0SVZZb2p0WVBVSkF6eENKQHsjeUx2CittWT19TnB2YlV6K0E7YTtGSzJWPVN4aG0lQntfdyNENCZrZ0I3bktuZDZfaVZ+e01jaUY4Y0o8TmJ5ejV0UChaaFUkVzx5d3ZPI3tPbiFVCiskfCk/djAmZ1J4STspa3BhVnt1S317VSRMYGl5NmllKipAJSpTe0xxQ2AjVzY+YG9KJElBel4hPG8kNWEhamx4VFdvTVlHOEp6TT5uLT9iCitGTGR7UCltb3xfMTs+OHhEc3dEQnhlZ05aMngpT3ZwTW5pXlEhMz54QXBLZ3V6NUZyP3w2Um5KYm9WRntfRmxQP3E1NCghe2BpJkF1TDd6CitvR2txeGpyNG00XmdvWEJ6M3J3ajhmNkhBclpFRUJlais1b2VDWm1xcGlLaEZmYXlmdUY8Q1NMOSZHVXVNMTlqPkMrfC0wZzhGeS13VGVhCitZYzZjezs3IVh7KT5rdSpLLUpCaTJvbmAjcCFJOzBoQ2xsYnNnMHk4MDYwWSZEIzklaU1veUNCKyVlKl9qU3Fkfi1RZzdRMF8oTU49PGhECitWUDFoamxtQDRaQz1yayVYbU1kU0QjVHopciFZQC0yUnkjUzNPZkwhfThVMVJ5KEU9bTAhPUdCN3ZjNUQkdEJBQm5xS2paWiR7djA9T0hiCitsPnYtPyp8KC1iZTRyWDJESUBvVjlPcXEjfVJrUGRNUHRaZFZ7Zm5oR1J1KVhXVC10QkttMVhLUldWJXYlNU9vNEkrO0hfTF45VDgrJnB6CisybTFxJE5Yb3Y4RzEpIUtkck5QZDZfX05zbzR6akN1OFczK2tUay15VzlQTEdKUDw2PXpsVk9GbmoycUYhdFA7TTdxMXppKCY2dCNTQ1goCit4MU55aU9AK3wqYH10QjUhbDAhJHpTPj1xUEBRfmtoYWJfS0lAY24pYDYwQ341KUIkM2xKaUJsK18/fTk3JWtEZDJxTk1hcW5ZfGJYeDZkCis1MC0+Yk02QEtsd3FlP2E2PFF+X2NuZWY5P1JXRV54eUUhUnZOXiE1SGpQPDNfS3ZvdmdiLWIofU5JbEJ1d3otfUNoT3xVSUJna1Z7SD5PCit9eVlyKFM7VDV3VU9pIW9BfWkjYD5sZHs2OGktYGApXzRsMEZvNFFDM2slTyZJMlJDezVvbl90clVDYFImWCZRbWlZND80LSViQlB3R0smCitwZXx2cEcoTz04JHBkPkUwKCR6aiNfbXNiK25BWmw3d3gtMWI5SiMrajxsVVZtRyFFYE52NTIpKjtEMytyQHoyZS1GMEtQVkEpVGd2VUpvCitnOWVWNVhWRWpWfHhrYXdLUXRQKiZyX0RRUHFxbWpCPk9XOChwQGo1Mj42aUZIcE58ISh1S3w9ODRoQSV3ZlcwRDlNPnREKWRPWD4/Ozt8CitNM2dveTU/NF4/bGsoYTt7e3k/T0pMVHxIbkJaWkF4aEN9TDxSVEtgZHVTYE88JnMwWDQ5fUZ2JH0wbXV1aEA+UkVESTBzIUwjNEhRYTRlCit8RUlraEh7WGlUQXdLbn5yQCtIRS1ZIWZZe2A4LTtMM19VNFI+NmpXX2JFaU87UjF1PmBramNJa15aa1lxI2A/VFJNYDluQUd3RzxvalFDCitgYSRTXz9PPE9tellrYVNTN0t9Pz9zSVpOaGw7ZW01flJmPGZienZoYX51IWNUZlUoOyhoTm58NWFsPCpSS3lxbT03dXhvLUZoRC1Ue2hNCitJJUUlbUozJnh6V193PnF8TD1Yb3ZoQnEtYWI8YFl9aSQ4PmQ/QXdHT1lZXnI+NStlNjhsenlhLSZBSUtONkl0TWZOQ1JsYzAlOHxWOUR0Cis9VTZlPFZyRl5ieiN4QUQpPXUpNlJlVEB4KCglUEtKZzk2YXQ0Jit4O2lWdSklOU9tWHJIcUJrb3NxLXpHOEJ6aXg8WVRHNnEjTVp7ITxRCitEP1Jkb1coY2hgIyZpKnBCVH59eylDXlcqKVlmJVNheVgkQVBGbWFZQHo5WHsqK1R1MT5iZS1RRTI0R05hQ15yNUJgYkd6dGNNfVlpZzFoCistO3RHWWd2YFNDQl5AMkkjeTIzTyhha0gxZzNXRThMYSVfKDZ0Uz5zZzdoP1RZSzdCSUFzKEtmYkhJRSN5X31MTng8ZUpEKVBDOEJ4VUk/CitXJV9AUmxYNWk/bHpZVUhVfUk7dkQ5U3BUfSUjPVdCaEFDQjZoS3NrJV5IMDZSXiphb2BLdHNvcGRoU05LdFJJUChDQEVtck9ZMWg2fSsjCitxXz90S3wxPmgwSDB4VlE5PjIzeHE2XjtYJitUZnExPGxDXyo7JGVEPGhhe2MxNHY2aSpXTnZMIWZ5RF54cUZtbi1vK3UjWmZMRE9FVlFRCis2R3tDcUtvNCZHNmM0eFZFWTBVPX5IYlpeQGNxeFc9UmJxK2lRfFMjS1Q/S2R5V3dneVVUKkR5VTh+UDQoOyZNRX0yM25jP2o0MkxualBfCitLMC1QWHYzSVB8cmMmeU1hNiMwaFRIQ3lzTWtafDtqeUV9RDUwQishc0R9Z1I/fT5LR0lTcF5sKldIQDhOSFk0K1N5PWFiSXhzRkIrM3J8CisjQiRDI0NzXz9+ZTZ+fkc0dEd6K1pabjZ0UklZMFVRXn5nR0U3Y1gmMShVSDJfP3xzTzQ0YWZiPCQ4JXtwIz1XPyVhK1Mja2BRaEA+WlozCiswZEkzYjZvVTdUWll2ZD52TGRHITdxTkdXV28rcUh0JmdOKkwqSU0pQGk5dWZhWjI/eWd2NXlwKnYkeSNxeE54O0NeRC0tcG9ZUmtXJEBeCit+akdIYyh+TSpCVmV4KiM3VUU8YihVJDdmSmVtYUwoQDtgOUpVZDk8SmRPTGdFeUc7NTNQfEVQQGpfTFR1MkRXZit6d05lWlY/Z25TcEx7CitSelMwWihqNUtvcyp7JEFRNkhSQWt8S2hBak5eY0hPVmpwQFlHV0R1Z0hHejFrfF9UJSk1dlVmOCMlWl9KQSVKTHhHU0E9Oyotem94TVhSCisxcW5od0s9PSZWKEJVci0reT1Ybkg/PCtselMpTElGYjl5Z2VePXVuWiRMPUNEUztebFdkQT44TypaSFZSOGRrOylgbm5VSX1yNHctdGFQCitpdEZ5ZSVxTy1xRFpreiN2eVpvTnFhRmhpZSQ2NiUhbVdqbz9MUzteYEdXPEd1RkdEfE5KWEVLVlA5fWYpT240bD1AaXFWeVc1eXdSMmg8CitlYmFTPEFqdnspWW5hUjNgaFhVRzNUen5tYis8QTRxY0FvX1drcDdWeyRVSGMmYSorQU97MFotX2dYIXF4RTV1ej1NeGNRZGZxRDNQNVFTCitTISZnKn5NbTxMS0MpTUphXyR7YFEkYEB4R2dgOz4mLT9pOCNMcVdQbXNaXnJ0fEU4OHxzZiZ7aWZFaT8mK0x7Vzt6azQhYWdkZnFKQkhzCitoTmxTQlJmfmopajllVzN+fX5EJD0jZHleYnFgZFlPZjw0PmNLN2NJO0FwViZOVk5qREk2Tm53Ym9tR0kkaEdyQyl0SiNwWk9ZTE1Pfj4tCis/V3c4UXdIS0FfKz5xfCEwdXkkOXtfR0I3ZDVgTnxkdlY1SzJRU2FpXjJiKzNuJihiQWgqbTBMV3BQIWpyaCVVQk1SKik7REdeTCRObWFhCitTJXlEfGN5Vks7NCF9S2YpYkMqMk9VTjtOYilTamorP1EjSypFSylTKyRYIStyTFhKTGpMRjVhUCRGUjFmSEsoPD9pY017PVBAUE14O3woCit7aUohVi0zNXhLRyQjPlJ5KnNZWDktP3I/UStTe3x9e3VPZkJeI2g0ZlVjMlRvT1ppKSswMktLVzAlSDR9UD8wQTswJFJgeD13bUpNanA5CitfNypwSWR3dWxZYEh7PFhzQnhxJjdjfGs+bVBSUmdNY3E/PVJ3UXNMdHlqMFMqWDZJSHU9KSorKjkrSyVgYlhvczJZfVVUMk9udkByZDNTCisrYDFfYn5eLXhIYU02bjV9WGdoIzVBfHItQFJUWGNGQj8laEl1MXFXVTQhQTttKEE7dlFVI1dUclVoJFRmcXhFO0M+ZykqQVFBYDVxQDRjCitHdmZDRnl0am97LVFBPEBnQVJ5K3UlNE4kVDt8KClDaSUlbUxyLSVyaiMoM2Y/KVAhVE4lMyRYQWU3ZiR1dFNTT0hvcSMjODRfa3hNRUhKCituOVFNRWpiJGMlbk9UXlV0ZWtRWGI0NjZmUWJQcVlPWC1aVi1eZWpPST5ZK0RTSTU2ckdYZ0I2US1qcyQyUVFQMXI/aEw8MVpPQHBlc35UCispM097ODYlJDZEbUItfjMmI0x7bjhWR1NyOzswKjklQkhGbEYpT2VhIT45aTJFNTU9UmJoYUNwa1cqZDh6VXRmemIwP3pDKHpQSG9MbyhKCitDbVo/bm9BTiZkMlNnd3hZSGx3ZT0rWntmYVc2bU5nMnVVLUJrPik3XlI+VnZOfXpTQHJ4a3VgY1R8WmhzS2dhX2gzJlJfUU9+elclcGQ8CithXkRwfDgjLXg0SXgyKE4lUSs9ejZHNiUxanlHSD17d20/ZiNkOyhnRi1jdWUjPSlQPztRTnNWVHU/Qk1iKD5tIXsxeUoxUDAybCgqcEVECitXKz49bC0wVGFeZzYlOD1YcUJqc29JS0ROYEd0fG9RSVAmOy14NEdVM3hYJWJodzlpbjBsfEpTK3NCfG82TnJWPEFaczdMSjBGNDJINDdwCitZR3pzUnZTeXZoWjBnQ2s5OzBkeDcrZzwhKyhtfTAyXkpEbCYySCpJVEwzP05MKmBNcyQtVj4jOHZrPWF3TDlfaExrNTlYIW18I2Zoc21GCitgYU5XQ2RzSn1wVDdFbV99YygoISlZejg8Rz1FfTxWUSgwb3Q8LTZodntJPEx+KjZ3PVNZZC0/c34tPTcyaHhAXyQ8K24kNyotVVpwKnFtCitRUEBeQG5YKCp6b01uY0tVcl58S3pyeXVrUCFnKyFwbEplU0tadHJoUXI3MjEzMlVNfTM8SD5mMUpSRUFxODk/NFFiXzZsel94KFMofCRfCispNCF2SUQ0bVVtfTk8OUV6VnBfe1peaFkoQXw5NSowVXRZYFk8T35ZJmxyeT5xaHdMRWk+NnNHPClPKUtYPW4oYzduRFcyUytLS04xa2E+CituRU5seiF1dFpVb3hseD80WURJPUBvd29HQVVETGN1K1VURVpZSldzUSpYUDhfQj07UV5LY0NgYzRgaEd6OUQjRjlkKCE3M0RDYVlRUkRICitIcmNIcHFuazZITHpTYGYwKnlfJEhteUwpbExAPUYlV3pGcmYrYE50SW9KU0BuamNNMFckTU5KcmBsQlpBazRiY29jKnsoP2pOfXdzO1UwCiskKllLQiMpLV5KPWV0d3dPWTVCb21qaWktfSoqcjdqOyp4QFZAa3lTKExgam5tei1WNXFyQFNQNVNKZjhYIVB1UyVBVClTLUE5bTFGcTxACituSyltRFlOOTFFO2MrWihXRWlaV0hRYW5oXkpkJmxGcUBVY0BKeCtuTTY9SnpJNSNIfWx6flNseSFSTjFEVXVpRzV7UGstdXZ3TWhlOGIlCitRY1VyMj93MWE3XyVQX1dzVT5tbkNfIX55WngmbktWc1RZaTZ8LXFEXnYocWI8fDAhSUJSTTRKTFJ4cipoNm42Y2xCbW50fXZ1cnMoYTFvCitwP0FFdyF9U3UpJmNpe1VjVCY2NXlRdiVSdXF2dT5jZiZFT3cyPHo2MFF9Uz1ZIykma2Y2aTl7aHQ2eEM/SC1TbXYwUzZUd1IjPW1xTk5qCit9Q215QXdIKW5XaGwoNyN8empeSik+aGVmdU5mJjIobTlGOXx1VkVnLUN+TWxpUElKMnA0Z0F6Yjt7I3lfaXNfZG0hPz5yPXFWKko0bUdlCitsU05uO1hBQ2lzSmcpMDNJO21nfi0lMikoKG93JTF2RGJHZ2pfU09eXllKcGR2UjJFOUJrankkejhjMiFPRGhRIWpyYWJvJnFAKm5YSlpGCitWK0Q5Jl9JeDM7cFJ9UDI8Q2xTVnpma3p4eDMyYHBFV1dsbE9jJWZSPEU9SjFNQk8mNVlhakw3WjM0TSlfa2BwIVA/JT5fPTFKJEQqPlAqCitnVHl1Yn5KR1FuSjhfT3lXfFg9bUQ2bC1LTXRUUGU9entvUE1aaHVPMlhnKiNVWVVQQldFeUJuS0Z0WDM8fmZ8XypvTjdPJT04a0RBWWMqCis2X0libk5Oc3d4P3FLRTh4OXQkdjBxVXVBbXAzIVRuYXVZU21nNGUhe0BxdjZxLThye2UrTTBleHd+RUc4ZFBWMk44KVh7MThMQ2FWK3JGCitQbylVQ208WnJHO14pMWkqJj1tSG5zbUkmZDw9Pzc+OEpMTzdmMDYteEM9YE8rPjVtR0h5cHYkdG1HTWg/aXEySVdGNGdJfXY+SXFUe08lCitiK2ZBeTVYdnluRjNkZVk3c2NTO0NuIT5iPSpFS1c3V1FofGd9UCtVJD9VYGdBJjlIKkQtX1dObG4reEBvTkwtZjMjRyE7Syo0RT5RcXs9CislVFhCaFY3cCs7JHpsS2EjfmtrcWVVREMpaVZ1aXBrdVNvKCM+UWFWJmdZZjY2eEFhQE4lcDtmMChab2lGZ2dLNFApRmF4N3xnWXt4I3FtCit7I312RDtGUDhjKHczQHk3UWtkPGkkd2puM2VLdSMrX2ZSOyNtMyVaZXBAX0Eod0h0VSF0Q2ltO1R8XmM8czhraHshb3UrfH1AQzlFIWBgCis3KUEpT1FfSnA0Y3p2RDtfQ2N6OV5VK3ZkVmxQYXJVYWZ3QjtwPU95XlExT1M9fmtTS0ZzekBpWTtaJmIkSWduQ0xpZ2tUZEZnZXBIRkhnCisjRFIxbl54K2VNRTFFR3FZWksxTm5KantfeiM5VHlrKHpHNndkWj1LZjwpIUYkO1BuPlQtcWFhTUdMT01IZjRUKm0mbjdifTkjcnkraSpqCit0SDlrKSUxYyFga3xHcTNQaXM+ZzAlO2MmKkRFdmV7JTM+fWJHM3xKJUVUbUVwe1ZhTFlKUThGS1Z7KGQqfW1xT2JRV0NuUiglIz9kV1d6CitVZ305ZnlkazE5O003cXx6Yk9WZVloZj00SnViSmYtQWl5Zz5HUmR3M1JvSFBsPz92UGdeeEUmSiUzSmgwfn5JUHJ0fV55aW11SSVIeThBCistIV56bmVmTUVVb1RhQUtoKGl4b1lEZVUlfn4lUUE+O2wyPlJqMFJoOVVQbTU2Y2hzKl9MVE4+SjRmfSE2WlRaUEwtO0ZUKCttKkQlZzVECitXb0Fzc1ViNk8meVY/NlMrZ1pGMlYxJGUhd24kemJeaXNzaGU0fGN2PjdOUFgzXkFGJmgzQlZYV18yUEczLTB5N3QkeXdZd3N2ZUlUOz9TCitAOVAhRj8oKE9HJEBJaGNGbj9TakNpYiljISNPP3xldWRybjw4JHtGezkmNyVBeXdxUU0xOzRCUXtfWXQzUUBgVE41Jm97ekBSS3F5JCRuCitYXiNER31VaFJXRi1XQyQ3VDh5ajgxZkM/dCtvdCpAa0xreXNKaXVnSj5oNjJCIyRiZHR6QSQxQ1dZZnQ1JUR0R2ZxSGZNdFU7TChtajVSCisxaEJPe2RAPURCa14qSlAxJWZqNnJ+b2RWNE1Hbzd4cVdLVyFlJjJRTXVQcUl2WTI+MkM4SUhwaz4rKkxHejNyaTxOdDEjbjNxR1g9YmdeCitkMHZyLW5DMllVckdiWkNsRE0lcnItU3JkO1FYSEBjdWh+IShhLXhQbUo3cjFec3szMCNZN1Y/RjBTOyhPeiNtVD9EY3ItMH1oY3pZKTROCitBaTIyaC0wPVVHKUI4S0tnWnxVPns/cUl9UTlTZlRtJiM4bFVjaFNhb2JZczdUMEpJQUBQO0VlSklFaTVlTTYlP3ZfSDR7bEpUSykke28qCitAJVJCRj9IaU5UNkxtfXRjZGVGSWFhMmVyUE1aOFElZFhDcVoySVZCeyNgRU40NEk9YWA/N1A5TDNjPkErP3NvSHF6R202PlRyKzkjOFhLCisqfTVAVVVha3UxOClncX1CZExLYF5lPW40dEttSFhga05aazIoQGhiNHZrbmxyTnNGJExzeHFNfD90KmNncl9OPyl3RTc1Z0FTNjRVfUVhCitVVk9oQzk+TShwbHFsQWF7XzFUJEd3diM3UnpHU2oyMkFXJTBOcGItK2FkTzRVPkFra0xhdnh0WDlMKlE1PVQyZk1tPHJZJmtIKjFmcmUoCis5IWkhUmQjIyZtU2s8QyVkb1RAc0N8SHFXdDNVOSlqYmJQS255cFVkP2JTbiZzV0ppWUUyUHlgZl9XeVkwQEU4eWttTWRoSHx5TV54bDNECisrZ2lAOzhSLWh8cEs1aEhnO1glcVh2eGc8LUx+NW1DKGZ0LUZmcjxMR2lwKH5TV3F8UDZ8TyZNQXx6czMrZzBPYnZHUW8yJCpYVXVTLX5JCitLTjRVMnxDdyl8TGdxPXBvbnhBQFFQeH5qS3Q5KWxkaCk1V25TPy1Oem8zITBzP2QrQ2Y9RF5BSiFQKygzVCp6RkFydWJreFd4amJfbzZYCitkYC03S1VtTys5PmJ3PmhBRzZITjtJZ2U0TC0kPWEwX2ptcEJxQT5afFIqLVpDbz9kcnVxMjlCZE9uVkxOc0xFMmBsKk5YdCh2QVNnO0hECisoZEoqU2d1MUA8U0lrXjVnbzw+d1ZUT1gxcjIpTnhgLXZqMGN2eSN7djJ9WGNtaTBnP197T2VIbHg9VDAtN2JGWk0xOWxidGw5XlBkQFN6CitvSnE5ekRnU1VzOzBfaUxjfiN+UThueVZSZjZmKiNRU1JZT3xrekk7aklEdlBFbl4/KGMhZlF0KyQ2UWJfeUBrYUU/MENCTjI2d2xDdyhGCitRQkZ0NGJTVl91JXwjfTtVJWQ0VT5rdXt8bHJXWjVTWUNGfj5OJj1JYUwqTUlLaEgxNlZvSXxxSCVDdGo2biU9fWUwKUBvXzt7REBgZG9PCis0ZjdGVHlAKGJ5SFYkYk0kT2ZHeGtsRUozLWF1MFpOJjRmZFE5KzZkRkhhamlYbV4xNFpRNTxoZXJadUEkc1lNZCl2YXlBejlkPCh4UVJxCis+fUIrREJheGU3MEFac0dsRHFeRE1ReU4xM2tRQz1OdlVRZTtIVDhTaWVjRHRRYzVLWkpCYiVAUVpRTiVRZjR7YHkhWmEoUU5BbCg8fkUyCitwUHZoeyNOM2xDcCEjKlJpS2k2Rj1oKlBSYG12PDxXJGlfTmxtcyliaDYxdzdMPzlaY1B3TzJzcDAxdi0qSilUVkgtcm1mRHhldmBwO3ZMCitlUEB2ckpZdUpHXkgmZVN7KkstcCtXUWc1d0ZKfXYtS2B+SzEqKnJHajNlJG96cjhiPCtWV1F6Q3pDIT1mSCZKemBsIVM9WV5BTDFLdmUjCittYkJGZ2lkSz1+Ym4wbWBsST5reilTWmZ9VmxAKW03TThTMWIpOGcpXy1jWmJ3eDYyfHFMdlg2PzxoMHdQTldgX0V1PH1hQVA4RjhHR3hMCit9Z2h9KzxjTks5eGJ9V2diPDV6VTxqKm1zaElPLUBFSDcqST5PKn5eKT17bXtoaT8lSWtSVGdCS3AmckdXLX4wLUA5VGZYWU44PCpsZ1RVCiswaT17a0I+OyNOR2I9SCpwWihwfkZrUEg1IVphQ1RmWHdMTFc0bjI4Xm88MFVOPT4zS0FGOXY5N3c4ciQtLWRGMWB8bWZUNGlLYiokYWlpCit7JDBoJUQzb0hsRV9BKkY3R0YtLUgoWSNKO1FpYHJPMDB8SFUjbU81ciY2Yk1ARmlLS1Q8eHtvPSRReGIoa2QmN2pfTl5WcSpYTzBfb3h3CitaU0FaMkV8cVlWPDdMIVozWkJhP0hCQ3BEc1NTPURAPkRzO3khISMwZElkMl50LWw8MFNLeX5LJmNrPjxfZ30+NnEwfjBFTWdtKntSTURoCitWXkUyPDlmNlNgKDdWQWJHNjYrbFdjRntDMDEpVXl1c1ZISCtrd0p6MjMjK3AwT3VVJl9ldyRqNTtYaDFUZnQla0cpb29sbiheJWgzRmE/Cis+UXdSYkdpMUo2M19uI2AxLW9WTkozN09kNURyRm1SOGFeOXBlV3dlXlJGUEx1MmojeUkoaVk5ZFlSdUphKHEmdE5eR31pbzhRRyhHIzgpCitZOWZgSUd0ez43fCsmTCZDI0Z1a21YQmgwbSZQNHJWPT9UMmtNPFRYRUw2VEood3MyLVBtaWtpc01BNkloJWJGe3MzSE5EZW50e00mbVBOCis0NDtQSn1GSz1UbF5YO19LbzR6b2A5flNeUj9VX2o5ZDN7Sns1WDY+OVY+YyVEN3RGayk4aCE5KE5SbzZKJjhacDVofDwlPX48OENzJTc0CiteaD1wJCRtfCVQTjZxQ0hSSm1AcVh3KEkrK3Ntaj9LQ0twb3JgKDFEQk4mMmlRMDh1ODJUeWU2Sz5BdTt0KVV2VlBuTn49LTR5V3BBTWJKCitvR359a2BpcmBjaG1hOE9XOG98bldnVH5CMkghJjFfVkwxUjg5NlhYNE9ScGVnLXsoKys7aj9oKUtMPHZSM3JqVGNDZDYrZnt4bzg0P2N+CitxJlFhIVhgfjkoKTRELW1pRXF7dEZ7YEUzM0cqdVZLWSZwbTRjMVUkVTQzJVp1UGlmamtvTlYoZXAzMig4N2FyYXQtM15BSG1tYT9+bD16CitmLUJ5ZlZsVFB2MSEmWDlBPj5abUtxVE5ANEkqeHFIPHIrVU8yLTY3MExfMHw9M2ZUQzF5P0RMfEM9Uk9lOyU8fj5+eGtrZ3B2PTwoVmBfCishN1ltI254QWd0OWhRcTBQXlNvVHc9TWZRbyNRKSRvaW9feFlpNlRwJHpadHpgRmV4MEtwP2x5N0xkRXRMTCVPVUsoVDlnRCokenxFWEdKCisweCVISmlLWjBROWNhdUBsX1h0ZG0jQzc/aEN6IWl6aEIka0p0Rmo/KX0pUEFeQkshe049dHcheCFvJD0xTTRQQTBfbnQkfXVsPUw1K2h6CisjJDJFdWd+Qk1QOC1DKDFlRGtRKCVXZzM3dH4kRVZWZHZIQlZQOVI/JkdFO2NrXmk3fXV8OUdSI1lhfFA1c1o4d1BRSXB8JV9LXzUoWD1fCitWPUB0RUgtS0lMN1p4K1A1SyV3dCRRSnA1Yio7OT1jdl8zSGZpPVdsT2dsUk5NaiszYzBgTzcrODJRfG9aK0VLTkFVMWcwPGM7UndAZShhCitWME1PRGBLV25KYyMlVjU1fit6ai0xVXNxXilYNkRSTiNFbkE4emVvNy1OQVNyPG5GP1opJDg1SjZZMyVobTtsd0A3NUc2ZSl1bDcjZ0A5CitKQHZSfHp4akxKVkh+PFVtYz1TPjAhbkF1bntsOTAmPjxBUHomTylUTiRfWkkzcV5Ge0w8MWNGNXpFRkJ7VU12ZEJwY3U3NWcxbjRNS2dZCitnUjNnP3h1TSFzfFR3KjdKUCo0Y0E4c0BsbjZ4OVppNzBnUztCZ0I1Kn1JMzdudUl+Pkh8OCVOblMtTWFpTD89S0Y5TmNqQ20oeSVacUs/CitBaDtPbkc7NyZtTVVeTSpOPEdQP0JDI1FsJEw+ajJCLU5MRHl7XihlZHMwSzdUYHE+aT84YVgyeXhaJGBJVHRqZnIpTjQ2RiFGYFAqaHAyCiswKUdHNG13RDc1YD1Hfil4b1F6V0Bie0JKKF9LJl5CemgqTXNGPHNzfUZISytJMzQ9dDw2JTM4PG96cVI1P1d2N2ZfJCY+Ump0MTJCTlkhCisjKm1ZOGNzbCs4PSU/aUdxZ3Y4U0dGJm8pbzBlSWZuO3NmP0BuNnA0JURIT198NkhoOFI9IyVNNGZIMX5Me0kxKzZ5OFNBTFRyTk9sdUhRCispRV9XNCUkWTtWTDR4bSpHR2ZKbyNhRnp2QitQYkw0ITgoYm1DWWAlSHYxKyZENzFmMCtTKCpSeTxrKVp2c0Z1RUB1VmViU1JXSmBrMnBMCisqJlJaTnYjTlRTZHcxaW88aWtadWhQU2JoUnZVdi02Y047JFRmWXp5KHtNWEUwPEV9YEZNWEU5Ozl5Vz9tTT1FQFBpekM7ciFCJiFfQDF8CitMfDw7TTs0TjkyPlRxODRMV1B4P3V0VT4wb2ZUdyVYTV9GYUAkeFJRNjA/U1dJanFuTE1kUSVjcDJVSio5JERmRHFtVnpAb0VIanB6cjBTCis/PTUyKCpnWnVsenJ5cFNwe3l6YXJmOCpxQCE0bSRyIVAxNjBAQn5OPXV7cjRIe3k8N08wfis4TT0zUytwempiSjcoOGlzb1VzSF81cG82CitaVSFCMnwlUmBgeGtBb2hiMnBmeD50N3RVYDMwNGd2TkIjJmVFZVdfblhuZXEkX3c/UWojQzxhPT91Xjd+TjVnR1ZOQyFsK3NjJmlPPCpsCitXOUZqc2FwYlBfOyNYTkVSUmpYMkc4el56PGY1VmV6Km4oaT0oPGVfNFh7e30tX0lyXyF0TXohREhpa2JlUzhBS1UpN2dDK0M3MzZ9SUk3CitWZHVOK2poWFRSRipaOFZzPyomSXI3LVYzR288Yyp5PGtEVmI3ZVB2KztgQVhDTEhRP1ZLKWlaTGtEISRkZEE1VXNBJncyYFJ0WXVgQzdZCitQXj4wVlR5OFJBTF5kRHN1aU1PfnhDQnt2ZGg/RjtrP2VQWXwzbnVmOyRWX1ZxPFQ4Y0lgPjRmZHRLRTs3N1dlSitaaWRtVXZwY1Y/Mz8lCitNcENAQnJwPmg0Y25SfUNFTjNtXk51K0xYU0d0KkA2aTklR3pFRjA4RnFPTVZvOGJtMX0lNU89X2B3TXlkKj9aXnhTQXc+MDR8Zm11NkF8Cit+bXlxNHpYPyVKP2Axc2tuN1c7STVgdktjU2QmZkFlPTReQCltWCZzTF9GSjd3TnM7e3FAWnklRX4mdDdBRCRLdjl7QlIqYmY8VGQ4NzxeCitkcGtjfGFBXnZ6b0FtX29mSXxaY3VmcTtnIT5BUW01T2teLWImb0VxdHomY0FzPzB5cHF8U2VkVGwobFVGblhqdEZIQD5NKWEqZnw9eWFJCitaJj0qIXUzUmthO3NGNkpAZm8oeHhHWUt4KExxXjNYeE5yeiQ0VGc8emNjMzU0aCYreTJ7VE1KM2BPTGYoNlkyR2h0QGdifHpTbzFxKCtKCitDeSljbGh7NWZOPDdHQ0YzRTVyfj1OUDFRVk9sPTBvK21JPSZ2JUl8T2AjQV89ZjtsPSVBPG41eSEzTT5NZH0zdUd1I2lqMD8lPzg8QGtGCitDR3AjdTFRc15xOTM4O3sqODxYd2E7TEFiU2R8S205VC1adXF5ZUZhZlAyMW9ud3VRK2BxTl41aDNyfWIwM2p6dG0jbEElM0xMKTRJb012Cis5O0xqaT0lPVdXeXx1aUk4fiFXdClKZWltem9ybnF1aFNFTUx6aGZMLU1lei0wNk1YYV5kOVhpOSFHfmkwSUdufXY2SShmZ0U/Jlk7OF54CitjMCE4NERHVUowPWl4O004cVRnekB2ci02VVJDOWZee3E9WEI/S3JrNFdiP31IXlNJaiFsajNKPl9IQUVwdG9HOTB+eGpIKEdFYCoqPC0jCitaWSVad2B7SklGTyotaTxMVTBtKDBiQGtjVCpwKHsxfWd8JVJoez52YURTeE9OKnZ1Kk09LTtHPD0we1ZmVU55YiU0bSE3cVpWSjt5RkpLCis3cSMhUmw9MEFHeFhRKSNAa0FmdGZ4bUZfRygjcl9BQmVsKFdAemFnOXQ5YSlKSzY5fDs0RDEqQlhnIyZAPEFCUlJQdS0+cXFFazllPTFeCis9dTRjeEYrKE9ifiMwbU0qJH5UNllVcWw1ViZBR0tYUWlsUVlCMkIzN0JnaSRaJWdaKTxYbnFQe0FuNCNGKWlPQEJBdFN6ZDJ2UmdeVVJPCitwU0UpfmwmRFU8NjVzMVctQVAqRD5SVThaXjYqNT5MfnA0JHlwUXAlR3NYYGJLYlJRR3JpSGBUYThDfnJ8Z21LNmRQZDchejBEfjQ5b2M/CiszV04yfjdVQGR8ZW5xM2QpR1ZyVShpeT9YSnVMam12eXI0IUMqZTZ0bmRzPn5NeSFXKGRLcko0WkI1ejlRSEYjSTxyd08xZGdmPX1CeEVJCitVaWdCWTY8bm8lZX04PXU1VWFGdHlKKlVzeG43LUxQVDVFbHZ9WG9efUokbyRwS3x9SFdacFdVQHd7IzQxejZETjxLbXk9XlBDQDk3TCY9CitAYU4pY04qSng+ZmVqd1BXbWAhYypvIXpfZDFXVUVLdllpbCFYZE03bVh6azxsUVIkWnZoPmNEREJlYzd6UyZoUU5EIS15bWVZfGU9JlZeCisjTmZkRClUTEcpMmtwJXt2dFA8cmFCcUAxTz1MZ0diWT83JCFuSjZKeWN3eCpuejA+YU5gTjlYa0BySGFlTj8+Rk1kSFZwWko5dklRZllVCitMPDJYYTsqKmpucm11T0UrQmZMWT18S2ooRnZtNGZNeDsmNi1wMkpQSGB2eXYoP2xqdHwwWVF2IVZmR3VBempKb2FxPGxmPCQqQmMlNSQmCitQMm5CMS16Tnc1enw1YHJ6d2ZsNn4teCV5aj5zVWc+TTh7SiolJHBZcW00ITg/YCU/dmJpZnZnZ1czX3wxPFI/e096MColY2g0KTRUMHwhCispV1F4eHFpQGgoSyk9c3BlV3E0Z0J1byQ7PUx7Jk0pcWhIeztvNDU8MWVqPDVjSDtRaDVpdmt6ZiFvMF9acyYyb3FMNGQyPVNFZVM7WS1yCitaT0FjNl9lJVRpMD1xME93JihyOGNsbHNVP207cyYqfntlZFdHfl8wRjErRW02bldSdFo9ZWpgVFBuanBGTmRHcmBqNWxFO0h+VDVeYVItCit0cHZVMHM4TXYtZ19sYkpXbUh6c00tLWl6eXFseX1PMnxRJmxzbnxhNnI0LUtrJCFhUkRSMUFGNW4pMlR0e0sqOzE/cD1VNEBCOXJfazFVCitKNHsmSUhTUjdhX0hkSUIqTiRpakUkUGNaaWhxclRDQSsqfFhoTVlVfUJCVntPbTUhaWpGNDBvY3RwV29rS3hqbz10LVFRb2lKPlh5Ni1ACittJU9QaHp+RTxzNSZ8VDQyY2RyY0hpdjg4MjVuT1BaaWhMKiNaKit8JXAwRGdlUHI4SE47UnJeM1J6KHFsX3N1SDtNOEJGISpnYWJlTV9CCitJRkhFbzVlVT9pYGsqYitqJS1yc0ghNTEkNCpEVWtRUGdHZ3tSZW4kfmFRbDE8RilJQnNpZj5EaFR5JHJESnQtVGtfKHg0KzJEOzQ+SHk8Cis9RE9JViRNVCRjMGBpOWs3ZlgtQTR8I1F6Mjg7NDFhP2I2anhiVip1NHl5QCVQKDVTcW5MNTdFeip+eUFxQnRMQlZkflprS2NLKVpwP1hLCitvR1o2TVk/STZreXRFe0RkIz0zXlk8OWw2KlhhSzhNM3xjTTxEQmR2aXI4LSQta31qQ0FQcF44KDBNfTQqJG0hVyo3SlpVI1Y2ZEFfPCZhCit7cHt5ZU1UKTg7U3JZbzRFdz1OdkhfJms1RXp5NGozPFdwZjRvNkBkQTNidGUtN3NBQ01QdSlxWlFeJiMtdWxVZjlPSm1UdXxEKiZeenlXCitXdjteWmlNPFE1VjNLdSVXIWR7c20xQlI0N2IjIys8QX41Nl8rK3JhZTEmYkB7amlXQ1owJTA1OzhxSyU/JC00biFtflp0UmkyMGd6endDCitSJmRkVH44Sn09cWVJcGB1c0lEPW42aihaYnJQR0A2NlIycUUwMEg9Unl3MllwfUU5TkMoS3xBfFFaZV5Ad1hLZ2lkYks8PUVBUk03S1BOCithKHZPP0ElNF5zLTJvRylKTG9MTm4yVEA3MC1rSDJDPmokNUw4KWZ9QiV+aVFZbDlOKkJqXnU9dHxqMyFCKnBXJk9yPSNPWCEkMUgxWFY3CitedFcxUEU4dVd3bFdPKU5pWkFCZjxicDw0M1FmUms4U2hhSmxGd21weTs2UWokKTJWX35UQjZmcHAkez5eayhEblFNJVV0K1NlIXlrKUxHCitYbzY4aDh1UjtSSFl1aU5oNTVyT0JwQThKdXsla0BtWT9jcTBmPEZ0PT5efnErWD5ZXmBgejh2fT0/QzV7KU9yTGkwUHROazRzZjF0ekpgCitwZzE7VFF+cEZiTlNqTThlbiFmZTM7KWs9cX1YejwjUGJiVkEtKj4lYDhUZ1UzNH4tUlcoTyhzd2FGb2F7eUAzSE5zVloyPE9qZ0JwPiRJCitTJGAjWU1YSC0hMk9oYTRoVlN7JTswO2oyfWJ3UjFhQSNfe0heXk1aNUhyWCE0MmRze35pVyEoVj0oczR1UVZhZ3okSTU+Q00rcGUja1lHCitkblBEKSk3ZnItVkFvKHEtP2phMzE1QmQoV3chSGQ1TWdnfTMtPUhCcEUzayspTlc5UnVMZjBqJk1leEIrRG5eZ2QxKUt9Z293NUlHc2IzCis/aEpMSkQ9TUMhe0NFeyRsPjVpUClwWTxyN3ZFRSF+Kj1zaT1fKkhGeEFzfH0wUiVaT3F3KSlpQXl3UlQmdSlIbCNSTkxRIzhhXjc/ekJNCitLbiVKNDZ7KHVGUTZQcE5oKW5LfUZIZGozKl9CWSp3aCVgOzhEUXxzUU8yRk87bCRnN1BpUnUjek5rSzheRXxFKj47T0lOaEwoQUg8RVdoCitgemNlZnkhP0JfbzUpbTxFV20lNFJsUXpENygpLVl8YndvMmdXck1QNjx1WjMxNnxJen4zfSp8KHZTbElGOCYzZ0MqMDtDe0hkX0R8Vm1mCituTnZ+b3pGN2NwSllkUk8hMjhvNiVIU0ppUGNFKFVKSDJkTns9JkhKWF9hWmZNZ2d7OXozYCgpIX03dXhyY0hoVE1VWWhTaml1U0R5bj5fCitJQlpyOGp9Iyt+ODRJbn5yXzdEe0Q4ZmcoOCZ4MXxVS01kSz1JTUd+YVFNMGVEeEtRfDJVcUVfdWNRYCFjMm1AP1hBU2loYUlRKTQ9PURCCishb2pxTGxHanNiNTBXTHExWWpDZ0liZV9nRFc9Nz1UYjt5KUk/Kzh1V2clfm1rKig/czJJcXBPdjk7XmpNOElVJihCfmE/QUE3ZW0lc1lICis9cXRYaSV3aG5iMms0X0RIaGJYaysxXjM+MD1gM01nPSFRQnJYUW1gSShKYWxVN3paNENZTHFrP0wwQWRfP2Nfcz1wcXR7eilEVzI+YCorCitGRU9hfW5TaWJ8PFY7QnE+IWQyRTZvRHUqbHplX00+LSFJUGlCVyNKQCVkWGxaZnBfYH1KVUJlM2QwUG8hTTZZPD9PPG4+VSR6KEBuJmljCit7fEFMXmkyaHwlelVGbSM4T3w+VXgwVT1fOVRCaGtvJEhaXktDdSVSUXtvNTQqMCFpWmlHPnBRWFk5RnpDZyVwa0p4TCNgTndBTTY4Sz07CitYQ0tSTEtDcjUxY0d8eEcjcUJ2O3lkWEhoTlY0TCFeSEJgfStrVTMwdi17K3BJQm14QkorRUg1Pm1eI09SSHdMdVh1Rmx8MllQK1QpdyRDCitlJVI5eW9UPnY7Iyp3JWxMR0ZafDlQaUkxU0lwTjZQPGEyPXZgbCY1LTIzZmdoaERZP0h0ZSQxP0pqSnc3dz8zPWl3MFQ3YlVAJDkld2QpCitKI01+aSM3TndqPH5KQHAxZ3MxZnNCVz5xUFUhI0t+T1J5UkdfXz0hSHtIN2YzeDkhZkdZSkcoJFpgT0BvZ2xnYFpETSgoaW12P0FVe3RWCis3ckBnZyhjIUgjWW9BS1JRM2JrdkxufFhmJjIqTEB3MGI3WSpWIzApb1JfZTBsOUk3aDlZOUp8PTFzRjZDNT9CZipfLTtOUzN1fEh1RG5UCitySTtrdD4zdH0mUGR4NzwpPCslZ1d0cXJ0JmBWcFg3SkJ7dEFnZDl7fnJERy19YF81YHxpRXxlanJeYFNAR0xIfEwtYiE3NjA/IWl1JClQCisqfCZYczdYSFdvR2JUK3t7UFcrNkZESSl1RUJoUHUtflo/VF8xfU57LT1oRWhIfGlOd3xOUXN6eDZSUTBuNDAraS1RPlJkLTFnX2B6aVp8CitEXnhkXipJfkg7QntKPDlidjQ4NF9aO3Q4YXQtfDJXQlNjXyg+MV9iK0lnKklANUwoJTVKeihOSlg3ZykqdTI7QWpYI0NDOTdoPTJqOCVNCitpTS0jfGx2PzVFandaNyUpaFBIKTRBSHlgfHRRcGxhLTJsPHVNRz5QdlZ6V1g1VE8tfVNkSnM8Nz5CbldtaTBEfUE4NEx4a2dXXj9mSUh8CitoUTZuKHJrZSpqdHpJSiRTPUY+Nj8jZV92VyFMR1MhPSNfaC0wNCtrXmQhYHpIa1EzX1kmZ1FEKHRVM2xCVDg4VWMzc3ZoQipUOUFAKU8tCit8e0ohYWRZTEtBQzlUZi1MfXVaTnVMOStkKSsqSiF3QDNaejttOE49SWomWjNgRTtNS1hTZD5fdXRoND4xaCZsN2smRVBDNn1HazxiN0lqCistbXhjaUhVU2VkT3ZoMnxHcS1uLSNOQW1vcik/JSs1Vj5qS2Y/MiRRNFpXYFYmen11S0NGMHJ7TFpSN2FRZjdjRFl+SDhxZlo7QmNWJCF0CitLeU5PZyN0LXE5K3pLZEdQPHtUX0whNjFjdj42QXpJUEk8LVJQVFBfKjEwTz15KzxUKlp8SmItd3w3SWFFWWIhOzVgcXhUanU/PkhiOVJBCit8aWtlKFV0VG1eYCtZYDZqS2ZeWDFCMENVO3J0aE5XNCZsaHJZejhrSzBITG14enpkeTkjMH1nK2wqPn1iQzdqbVNNOXxEK1BlMlkoSGUpCitAdnFXQHJERWVlKVkqMChXaSNsalZTM241JFQ1X3koP0NYWXAyakpqXmRZYjE2Rysrcm9QOHd3WktpRjdKe1crUSFkU1JCekE3I0NmMThQCitUNXRFeDFITm4tRjJJNHpjVWp+JUtGeWBoPUM3ZyFVNTU7aHJDPUpwSEc0LXpDQCg/d0F4Rm9ES2NAKzVWeyEobVE/KGFqWDVPSXtHZmNpCitWcnY7Si1VcUgkS1dnd0ozSzBkcUJxIzhFVyhWdzxQQlptWHVCWDZXNSsmPHghfGJjSmR0QyVDQk1ZUjxfMz4pZzF1QHdJYUtNZjJjKXFYCitlVV5EWGFXZns4VmUme0peITt9IUBkJlY0MXE9WCRjOz9oM1g4I00oRF96MlJMNlomJjhDSVRTN21mKUooMHtQRztRZXtQNkZeclRyZkdgCitZPzJJX2s/NjNfNThvKlBxXyR4YzchN0gzLWNiRmtYJFh8T08ySUluVENVYXlaaGpyPyRHdG1oLVB1ZEljaTUoQFc0STIpViNsSmBYX3JSCitDS200ODB2dkdCSDlpJCRFYiFQI000eCNISGJiUFh2Y35AfTZGMXh1LXstZkc3RTE1RCtzQlV0YXNfSWcySVdobGwmfGw7PnNRdEgqQWt8CisxSlNCQEZRe0g3djRhOUd0ZWg+bXxBZkF2U3ZAdGx6MU1+TyZoaUAkNmxLY1Q7bj5uY2c8WFlEcEBTZFRPP1A+clNiaSViQSNPTGIqPzNhCisha2tWOT5CVzY5NX5EMj9hZEQkWlQrP2dpWGEjQ2A8ZkRRUVhDVUM5RF8hX1ZMN21sQ0FHJVQzcn4jNCZ7I19gWXs0alZZMiFTZ0VGMD43CitnLSFMZGtzYnheckdrOTZvO0s4NmtKc1VVMHhAcWZDUmxOJUlvYCZuZDNjTnN1R2YqNzFuZ20lX2R1bGJiZEFMQCo7XjN+MipHTmhFcThtCit5ZDBHPzVsYDE4Y01YeVpmPD5EKmtTZlAhbUNeUj0pRDdYKEVYIyZCRGIkQiV2RSs0QSREalA2U3dZYz5RNCZBdEpUblU5eGljKXdRcEwoCitkdl55cSlYWXtqN0w7PyE/K2J0YCtMcXdaO1JxRClLTGI1Y2E9KTd9TV9wPFU3T2VaYWN9JXAwbDRxWD59PDZmRCEpZ3Y3YVhWVW15MjlICit6MHo2S1A4amQ+RjN8b2xeRlJDQkhvSzlnU1B9UUxHRlNvbzBxKjhENy1+ZmthJTtoZTt6JDJfUyVPYSs7eiYzSCt1fjdaajJ9MU17Z2NCCis2ejtLV25CMFRtWH1WdHJPP1NKU3s7SlJaXmJRO1pyKn4pa1g3MGZ+Yzh8Z0RpcWZ+bU1vKGBkZUR1dWBpMCMhOSQtNGBtTyFoO1B3PVF2Cit2P0dfIyhfOFVhcmpLd0l2NmFQbmxmIXVkclNMZChKS0ZqI3BgWks7UG5mcDtaJS17anB1cVNUJVZuP1omYDs7akFqM0VDYEg4MEVKJlN+Cis8K1YxNEBSSz0+fHdwd19vc0JZUz9ZXnJ9VEFgfj5iVEB0YmRNUGJ3PXppakBjM3cmbGxkenxXQGpjVi0zclkrNjVgKSEkKnBSbioxb056Cis2RXFQYHpsRlN7ei1RYjEjYlo2YXNRUXohVGoqUkVwKHs/TnptQEJETChVdHlwKXBOeH1COUQwM2RpI1A7c31eXlVBMm0rTTtnT3BWSHdFCistPUQhOUheQWVnQHc7KT1HaUEwYyR3bldUUHVwQCR1UkFnYCY8bTJQVUFQRndPbXRFUDRSOUJYVTN2Q1VRb15hSW9kNFFjfThfS0IyQT14CisoZn00eVlvaUFTaj1YPEtYR3N6elZaN2RgPio5RGFPUkF0U0slKE13U050fXdHJFpQZENuJDVjTyliVChwTV9vcUQqb1lBTn5oUE9jPGp0CitxRWVGO2B5fFNyajk4UWRodWlZVlU/OG80VTJVXmZ4TUw3eyZGazFxSmFZZkxlTWg2YDhDV2J8WSRmQWRmd0RfeEUmLX41VEwzOVg3WEojCitNfDM2MnVKdF5VemhXP1k2YytDOEA2P2pkWDdQbX1IJTY3YUhfJUV+RjxZJCY2cSVoTyshJVNqV3MtOEtQI0cpQGMrZXNwPUtealZiVHZ2CitgKXowQGFGR21ZIzF8Qz5WTGZ3eGF8YVR+c0BGQVFzM2FHMHtAO3pSMnt8WGNhUmdZdSV5ITRTWWsoaSo9cXBVTlU9O3phJkVUWlNyQy0rCitwRGI1PztuYnRVLUc7JlNAelpuZVNMbFJlRmg4X0NOcn58WlNXZlc2JmM/KlAqRE5mR35me2E1K1UwI1IpcHgyaj9yfD45dDYkKHpFUyhlCitLO1RDWDJPVHl6Sl5JTHsyUDlhMyNVRiU5WHx6dzFDLTNqPzB6fENkYzRCWTZyMD8mN2lRYzM3azk0OG1MPDxmY3lzfkVtR28jZXh1fW94CitEcDF5UGlaOHw9dShAI24yV2JQMiFAfS03Rk9wenNMbDlRJFlmKyRAaHJPJFhqKVkrNmRKU2lUXlclU1UxQGJMdnhjJXh9b0Z9V214UXJ3CiskY1RJbTk3RHVzOWVDRyo2UzlTRjNAKE1FOF9yeWxiZHo8cXgpamlxKEg7bz58aV5lIzJUPittJHc9VU5LbzlpRlRrM2VFbWVAYXppNTxzCispO3QweE0lYjZ4fS1jN3RWPC1oKDBjSURueG1Zb2h9eEE0TkhyO0QwaEZzKjZPdzVmPz9ZTlZsPSNtMmF5YTxyLWNCdHZzKHZLVGVBc2MpCitkRGw1eTxiK1JGODVHRHk+O2hIekpeTUhfQWhPYDg0JUNmdTMzPVRRSWZDWCVnU3JTMlFGPHNMNUdMMlN7UzxZajI+MWAhRTF+UGc0UlFPCitJUkV1JSFMTi1iPWxyS15eKUM8cWI5NFJXJl83dTBwVVJ0VkhaOCpUQ14jSkxMM0tFT0MjcH1vez48allxOTJfMig5V2lJK1RHfSVUNUo7CitBRGRhWUB5ci1TZkp0QDhVKG1NJngrZCs9c3FCQT4zNFl+VzxufEhsYXtxSG44e34mKGxYN0JCPj1zJE1wKWk8eUk9NWxaTG1jVnVzeSZiCit2RDRKM0M1SjkqYV9mXldeWD9KXnIrTlJqPSN5Vn1pWmtLKnFIYmY/fGc/O1dfdjRqNHxtN1Y0aWBZPDspYiVYYnpWe0hldn1zbFJXcnVYCituMmJ3MmYhYEZJYTVEQHFifnA/TVkjOEtVaSZoMGBgcVJvNyFLVThTdHlBe2QjOEtUVztXQVlTJnp2SWNKUyZDPVE1eFd6XkF8eERgaT5ACit6Umk0bXpxaHxIOSZSR0VAViF0bTNkaWZlPXtzNSgkTUwyaTxUPkw/PW9zK0MtUW1hYHZaQUhGWlM+djxoZ3t+Pn5JWTtqZnJJdEtyOVhOCitVdCshKk9eNF5YWDdSO3YlNWooRmQmaGxjKmRYaXZqbUdhWGV1V0F6UiQxd0l0QXlVRlY4VSNWKmFxeCVPWGlhfjMpdHwqaHl5fX4yTWMlCitvSVhrVUZXU09Gc3I7cTFwRnomfGU+Y09je3BjNnZtJFBGfD5NUz8yPj15MF58KzdgUCQ1bTkpR0lqPURYSEhYbV44cz1jY3p+MSg9Y0kqCis9c1ZhRjI5JC1BaCFNRExCYyRHb20pTkMwQXtBSCp4YHYmNzVIOzB1QWJGUlF2U29yNmdhVS0kZmpqY31KXkgjYCQkYjl6TjJ6YG44RXJhCit0WHtkaUl5ZjxyTEt9JURMY3tfOXBlcTdffVgjeXBqTUFtQVUhM1RnbExmez8mM2pvOD5rKSVQcUVOZiFxR2xjfC1PJGZ1OGBpQWpYP2VFCitqTCNJTCojLT1eezRzTWhwPWApMn48Pz1fWk97Xz87cXYxeUNMMzdhRGZQc3QzN008LVQtcEA9akNtczlzbTdWVytfelMyLTA5YUhIM0d3Cit8OStpJmVZNU88VlVoUTU2RzdZT0R6M0A8aHghdVEyaXlCRWIzdFpZWChsaH1IV3JPKHBMTSsxQE9gJHhjaGlOSEMxbDkyMEtgTXluaWlACis1dGA9NU84UU08bDVRXyZwdSghVlAjUV5NZnt9PVNReVNva0ktWWR8cXJkX0IrejxJVlA7bzNwZCtRY0ApWE1YZk0wMiRhQmxLcWxOOGhWCitCN0BXcnlYSEdkeEhOfnJsamY4cUU9OFcqYSkqYygqMi13O0wzTzlaO2tUb2tXSzUyOFRSVXRmMlQlWmFMY0sxcVZHRHRHSyNxdkZwczhXCithNlA0c29yODVpSkFAVFB8LVNpVUBMaDRMSEd5TD9UbW9mSDRPbF9TViNjRTAwb00xQU0oTD1rbGRQcVUkQGExMHJaN3QzJTk/bG08P1NsCis+dmI9Kl53I0A5QCZlOUh2dXFyaTIkQUA3VWVGbDxDODZKKykyRipGe0xtOCNHRChDNXRPXmkjRV5LYDledkMySCl5NUI5ODRFSkVnYHB1CisyVjkrTDk5eTBxe1BsPTZQKTJ2UzA8RE44SiFFSVItc3tXWWoxIyQ+czZ+NzxiMnYtOTNIXjFOe144WD1pI1VqWGk8OTMyKndMRkJLUGM5CisxWXhOdH56azt+XiV9SlZNWkw2U1pja1lRfEZHTEd8UXtIMlA+V196VyluQEFWRDE4KlhZNDMoRSopM2VzIzdQcXMhRzZGO2tpMk83ZXxoCit1fHooRiReP2IkfSM9Pk56eF9IY1pYI08/RkRrP31TSyV+MURlXiRwSld7WXV7IzFwRXc0Qi1rIzl6THt6Vy1WXiNrdkshI3xUe2NJY0pGCisxQTF3P3gyT2pQNGhXM149JVI/ciU7I2UlZ0Ape01JZjlnU1NUPkAwfC1jeClicWxyemdgcm9XRG0yO3ZKfmBRWWE2SmNFWjJ5VStBPmNACit1bHpYaGBudFNmMHh9d0pOayo8WSM3XllMR1l+LWZXTEpFa2hkYEdUTllxdi1IVWRDcTN6bG1STjZ4c0BFKjwmfDFAVFEkP3B0OSFgUm9ECitKQFpxI2pMa2s4ciYrc0cjMjBLfURmWEw2aCtHMksqIWgqcCt4SSFgYCNZITJVLUgwZnZ6eUBiWEt0c0E8OyFyUC1KNlM2TmxvXkVAMW8tCittRj8tanJJUWA0QSZlNXxoPlU7UnZScXwtJVpaaUdCUU9ENC1aVjEpN3VZWC1FNVpOfHArRFYqM21WOyZYRF4xNEJoQ2ZReWUzTXFVbGtBCitJWDkpMkBoO0pmS155T2c7Q1ptIVE7dTF+aCpOJmxGYyNJMm5iZHZxMW1aJGhoS3lRUlUwc35rOEIjeTc9dClmZz9tY29zak4rX2IwajxYCis/ZEFhe0t1JC0mVy05cD48UypJSUk3emQkNU5hT2NxamV0QTIwdEk0fG1VdElHRUlpYEBIcGBiWl81U0gmdSFjaCheMD1GNlFienh7UEdJCitfTDdSR0tQKEBVQzA9OWs+MFpnYH1Ec1VrXkwkPHY0ZkBrekN+YGp2NE9CbEg0IXQlZXgkRnI3c2FBTVhtZmt7P0t5QldASD1TaXQrUFdmCitBIyRzM3R9I1olQUQlQFNCNjRRKTdmbEJwKUF7bi0wey1mKz5zSnItJkFhbEc3cy07aFNOe3RtJUdLci0pKXBgMGA9UFNtX29lKVIzNGQoCitqYnJKSGErQV91cTU2OCgoOWQyXyhObEZ1JUNmeUd6cjZtRUpjOTwhMzwhOVlgZyNVT1EmeTBoJDNmRVJJJSF5RX4hI3JucldAKmMkbCtECitZQmQpUUZ5R2prQi0pKm1rMGBhbTtZbnc8JGZrMERZKjFgMlRePmMoaU51JilvNWVheiF6JkMme1UpPShWQnJlazJhPzc+NEgyKnApO0ElCitwLUZpTT5HJGk1Zl4qcy0xKExvPS0wY2lQb31nYktfQlQleXBmfm9NWWdkP0tVa3FSKWZ6VnAyelNeN2VJWVEwKyZkbGtKcWxyNlI5NnhKCitmVWZpNXB3YVA0VD81dG9sa3ZvTm9URUFJaDdDfGB0QD09JGEyYEY4Rzw2PUljN21YJWtuTiU/bCNKWHJ3azdrcjlETFcrOUdAZEFLU1h8CitST3EjVSpUWH1EPUROaEQ+JHcoU0BXST5gLW42YCtmQmBVc1Z4fmZvPlV3QG49Y191KEVxbEcyTHYkNEZtJWZsPW9ySTEkPTckRno7QjA9CistZFFvb3NuM0Z5NHAmZWB5MDNTbnN4b3hrX1V9bH5iYEtyck5HNlY/XyNkMHNYQzVZZzkqRzNzVCFzUjVEWSlwMkM9K2Y3JmYrMzk+VCNvCis9Jkg9JCEqOWVhNyR1bFZyZD8qJCNaO2VCNEZ1dGItfntpPERJY09yTmdqdTNJU1A3S3hQWWx3MEtNfGN1YzEwIzBuJlREYjFVRk9EQ0glCitzbTIxQWtzN3g8MVolNlg/JClKUlVuJXhURUI7SytwRl5qaHdoV0l0OGoqUVFoRmNiJGg9SF47bWEyVWJsMW5hSmZ7OVl7RihCezdodzgtCitTJVZtZ29tcFRyNHJBRiY/JGFFYUpuMyReJlQ5T1dDWCY4ai0wWm5gQzV7YSQ9K1RrJjg/TEFaTXViRkRQZDJ5UEBDSCR2KFgwLSZvKlEoCitHWkAxbjNLVj89bUAyN2BONTRTZlRkO1NDSWF5dzljbTFHRG1ablk5X0Z1KlY/b2ZBZ19vITdWITBpT3pEPDskSVQlSTBYYj0wJD1ncUZtCisydTRtNjtBajg/ZVdEZk8oXnc0QXxKS0ZnUlNzPGckKlJZKTlkMDxUe3hSWV4zbzg8eGFDbVM5Pk94UFRWcG5UVW9vekp2Kj1pYXEyVSV1Cit3aHRgRTElUkNPRTFGVzsqKF9mNEdheXtQUTZyaEojfHRDS3JyaFBVZ3M3fmA0V1E8RHhCPyRBRTBpU0lxcz5jKVF+NCEqNjZGfXI3eXg3CitCRXNqZEoyWUpsOFdmKTcqflFmdF9NK3Z2dTFiZGIzYmBGSSNXKyNKNzlQRXMoVmp5MTd0KD1Gb2glOCk0MSYtXzkySmNEajNsY1UhS1BKCistX1MyK15ueE97a2g8KCklS2coR3RQVVZ4cj1WTWdsXzkybWpTbW8hUnhseFo3MTNtJT1LNSM7PlZNSlJDMGYjV0JvUTdIR2h4eGhnUTwtCis9M0tuSm1ZYXotQSQlVTw/T29zZT1SZWQ0MU1lYlg/JkRxSEhpSXA1Q2NgJEhlZll1UHc2cmJJRStjcmBWJXQpYSV2N3xjRlord015O1UtCitNJjRrSjR7cXJyTXZnX3RHUFAkIUlmQEhUWmRFRUBpWU9sJkZ6bSUxUktWRU53M3M/SEpgJVM9NDlqRTNldWVNM3tLNWAhNFIqOTx3KF5oCitETUJWS0BBQCl4JiZFUio5X2x7SHdxb0hAZmU0e3lKVFFMfVNFckZqbSQ5bUBSeitlNipaTmAteDExby1ZTTdLTUNNZVlISSFlZHB8KkY0CitPTi1TVFpGRDB7a150SjhtQURHV35TUSoyZztfbmlRdyomN0dfLShEbldoPC1IeUMlPzdyWWVGMHg2SGFCcEF7Kn51WU11UGxaV0VjM04xCitvYzU9I0pxMFVhPWleRl5JPyZnS0VESlpHUyRTS1JLcXxSZTdhbVJUeEQkKE1nO0h4SDVuM3swRis4cWpPXylCaWFvdytvYXVUNGhlZEdpCislQyUxMmt6IzhsIXc+YW5JUn1aS1c8Py0tX142Y0J0JDArLU9hcUFGM1FPSTBSdnVEanhfVE03QXJNSTU8WlVHeFBRRXc4e2E2JnRZdHshCitYVm8jNEBlJDk4aEU/VylwSC1+eHorPm9mUT0pTG4lZEd1K1ZkeUZ8a2BtYkkoS25MbVJYZ1ktcUJPZkN1UztHKX1hNHVfYEw1VnYmOzBiCitDN0FxUGFLaVNufkpTYkFFUlFqblBGV3teVEwjfXhEK08/REVmKmx8R1ZPNn42aF9UK3FKb3tKSlFHZFk+KEBGTGJnQylPNz9IeWZVKGM8CitaV0QmUHclRD07WU9GSSo2P35zPHh6fEcxZDJgTmd5RTA7dlJXN3BHYT1hbW9vM1g3M2tJVXs1dFR+YyN+PmtUSEdOU1RlT3AyLUhFJkspCitKUm1gUUBmS3NYc3kxOUBWS0Zmbz94YHBTbX54YnBGJDNKRnV+PSk2MVZ5ITtDNWhLXkc3ZG5gZUE8N2lXUXBvMlZ5QyVOLXhYUFhEdFoxCitsNkFlQHs2al8hQVA+YEY5MElqYlRxaXM7SndEVyZZJGg+UCgockh3anBJMGdiRjd8QShtZ2AjRGgpb2B3VVFlfSYqVmtBU1V9eGhiK25RCit8K2V3P31SPlRNV1FGZUQhRTBecnl5T1ZneSprZV9aWlQ+N3lZdWBEaT5vOUJIIUd+NV5iPz1DdSRQKHU+TS1sS3hJeHBpNWlEKklNIzRqCitxTlkqUXZxYW9MU1Y1TmdOcUQ0MHltS15sbzFeM2Z6dGJUe3wjd2ZAVl9IakBga0BZe0tCK0c+KjVaJVhvLStHbnxLTlpWKXFkbSghQSt5CittTClSRmkkayV4Pj1QVXB+UFBLSiRPK2crSlpyfEorNXRiR2MhTkt5VlZyQHQ/V2d5Q3tBOSk8eXlVTEU/TTJLTmpwQyhsPCtGNVBzcFkjCitGQmpzZyNNZ3g+RnJTT2IhX2oxYD53Vko/V19ZWndtWkp0dGA4eDt5PjFUTkd3MTFCKW4mVVpsPkVaPWhOOEY1OT0wZGI8OFd7TS0oMmE8Cis4SGVGXzlzbTBwbzltNmhaPyhYNWtORUVse2xTfThBS0NaZjtxTGtHa15TX3w5Rl5gI2BPUm5GK3R+MHc/T1AtRklSNUpeISMhdFMyPGxmCitRYkh4dzZVNFJhcjx+X0xtKzF6IXRtM0JoX2A3WkdLQ1MyWjM+am97VlNkN1EwP3NyKylkSUxxVFBoSXomO3I9flAtWX1QO2YybURwKGFxCitXMGB+cXs9LSEoUjhjVFp1YD5kaUJkP2NuRXJAPkArVnEwOEB7XlZnI0ZZSUYyPnJ9KTA4e3BOazQwYnQqV2Z4VGJ0d0F0JVBTJEE8aENqCitocE0+eUkxZHZ2Qj52azdLUG54NUxaTjR1VmRISCFxeyEwRkw9P3QtSXtgJWdveURILV5iMlNobEl4eDl5Jng/Pll0YzdCeXB+YE9uO2pSCit3Xnk8Y09LYTFeVi19X19qYD15WlRKNiRoKylVMHpmfF9xLV56YVVUaUgrTnMyVnw2MERwcGJhX3ZlVDZkX3dWKmhHT1hjbCk2bG0xVWp7Cis+OHg1OGg4fTdieHspVEhJMVJQRj84I3FsK2o4MVgpYlIrZ2Fte2h6XiNuJCo1VFM4MlZFT1dOOD9qaEB3UyZueEI7amohSkwlbWxqUXdDCitOYUhVQjMxJileYzFYWWtUMUZObV95JmJ1dklhYD8rWVQhaGRxc2BubCRJKnVnR2xnO2ApcVBidT0mKUU7SntaIWkmZGpPZj04TlpeYnBwCit1Z2NKTUE3ODBKLSkmVCUpcC1XVipSMDY3I2shVTlWQiRRWjZWKjRLcFg8QWtmQ0x3Nmx2PGh0ZkgtUD04fHhkeDNgeTNKaVRZSkNpfT4pCit+KWQzJC1TPGxPMiltR3c9Qk94cUJgaElqViZ9SmlSRWdDI1JvK3s0bEBKKCpSXlQkS2NWeV49ZDdBc1EmNW9OJWFXSih9dnVDNVNLQkNzCitPLV8xVV88fW1YZkBYUWZPNUdPT1JGLWpfMUFiSWYyNChjRTc3RmxNTipAYmc1aGdycH5GTDlPfCRKRVkqemlUdHAwMUJvTyFZe0M/bWp+Citna1BPPm1oc25RaGQkQUVtO0FDISVrfjdkKkJRUCtZMjthRkglMzhFPDZwWHB4WXRRYG40e3Eydkw/cl4wSENtcWkhSzRmTD4zPVhuNDxmCit+VTJ9YythZS12TUw4IV9PQVVtLU5reFU8UzNFbDZ2SyprVHp5MW4hbWMzTnA1aUU8QHdrYzR+K05SfXwhQT5kQyY5dEJRIXBSN0NsNmpoCit7Rzw0SDhOXzxxY1NWUnslKlExd2U4ZCFsQERkKkRgSCNIcV40SXVSPnZhM0paN3ZRUHlRMzV+VXRmOWBCV0gyQ0xwb0koX1hMKDUtalI1CitrYDQ9YEc8b24kSShedyZjKHsoMit1SDVXVF98ISFlVGFhY2FBO0tQRj1IakJ4cU5ydG8xJldBfntBMnlQejJ2KVBFTTZnVj93RXhAIU9CCisrb3FiSXhOTllAXnxRPHI9c3RwdypLMHFfVTNOPiteRXxCJDR7a1R6U05LWk5EVGQtSmw5dT49cyVxMkowJSRxQk1BX0Z0S1g2IUxZXyNOCitBUEArSkFyTUFqQEMzcGJPI1U+ZGopdUdKRWteRCE8WHwmJSRqJmFmbl9YZnJ7VSkkSVNEbjBCcXBAQXFfVUI9NmU2T0N7RWI+a2h7VD5kCitjZGp4dmhoQEV5KmBPJkA+NjhpdVctRUFmaj8xQ31MdVM5WHZIfGdTREg2UUlROz9UUm9FcUhIPy0jUE5fViV1M1pHYXNYU2I2dDRhcj89CitEaXljclJSX2FXZkJAR2cyKzx3TShqTEhtSDY2ekVUTD5POCNYaD41UiFLRHlZUVQ4ejZkWG1Wc3p1MSh4TFooY3Y9XyRoeUVkQWtRSlhNCitEK1E/b3JMTmpsXkFxREVBTnN6aUVeMUUlQSNvMy1FSmttSmlRO0dvIVB4UW4kfipKNjk9NDszP31hOVBwdTl1VyFjdUwlI2pQJlJQXkstCit9U3ZqP2omMUFASFZzV1pUNG5uS2VvdyZ7I3xxZnBsWVIralZ9VVNkeFQ9anRyKUo+WHBhP2QqT1ZGZ1EmfWM1Z3NPU1IrUF9nNDBOeGhnCitkez5ecytidllsJTdycHJlbndAP1o9UypMOWVYQ1ZkfWBxV2U/PChwdk0qfFdmZWlFfFVvaTAhb1olKStMYExPRD9nYHV7a1g8YFhtTk0jCitgVkV1YTZ0V0g7YiYkPHJEeih1eSlMPF9QeFdKc1AlOXVsTW53IzFKZGM3ZXJ9emEwKXcwRFA5OTJscDVPPitzck5yKiY0XnJOMnVVP2lICitHTyU4XjZjTG5AMCNteiNXcUpITTc5NTJhcnc+WVlUMmhFZjA/e0tNdkxBJVVOdnQ8N2ZfbXpPSDVZVztrZm5hUkNPWXsyamdjWU1CdnsyCiswIW9DQHtqU1FmKUlWcEdOTyEwTDJXKUhYSjRHej4zYTFkemY8VDRsLUJUOWVqM1RndmwyYUpkPjF0RyZ8OUs0dDB+bEhtVjVNJk4mRXM4CiszTTNpJEQ/VzlpQTtzJEIpO09QJSNLdW8+YmptbVhNfW5faX56Z343PnxYJXY5NGxsRk1mekRQKyg+az5iU2ltei11VUhBPEo2U1dtJUNoCiteP09iaUtCcEA8XipBXzJLMSl7Kj80T2g0azNAOUJQY2ZYTVVjYihWKWohOCZxRFRPPyUlJm5TKlEwUyF0MCgpNiM2ek57YWppZHY9YVpMCiskeFRMKmdkNjFaSlYqNn5NYT0oYUtJYn52OzNGO35aZmtBNjZQYmUoNFBSZmQ7IWE3VUB4cU19P2pFXjhTQUZDVFY9SE5qclN+TytFPD40CitPWlYwO0toMTM5R2lxJEQ3U21aYGNIT0A1UnR2dGxDO3hsVmp6Q2t3OW9lKXBLVndTTHNRcE1RcXlAWnZrQ0wlMTk/ZiVXU0pjYWtheE49Cit6b25rb085WnhjOFRfcylUayNQSFMyQFQ8MmRvPjYjZGs7fXBuNFRXKXlhQz5EalNBaD45YG5zd3xFKUIlVU9Aezg2fihgblN1aVRFc2dwCishMSFpO2IkIz97P2BgM29UbUs9O01xTT04KXZ6dilBbyl2eldGVEU9V2swVSZOQWlpQyl5eG9edEVnUF9ARWdBPm9hcWBuNTU9KClGVGZgCit5eD59cUMjLTRzcXRlWHhWfWI3bXw1YG5GVlY+N2dBWVNDeVVjNGYjOV9ldWRrbWt0JShsRVBlT15yT1JgSiV1PEM9NzdWdC1VKEooJHB4CisyQipBI2dxKTxCUCtwTD9UQFlVUlZ7VVdhVjFKb3lJOWYyY0UtJTxrUitmekBQXmkpeXp4ayohZCFBeFI4Si1BQmxjYiRPISQxVFNjYEpgCitTJFdGOClUMmk0RX13bF9abTJBOHkhKjIkKmNVOG5xdkpVQnw4aDxndDVreTVRIVhJPnZeTUpuRWI4V1lyJEh1TnpiVXZZbHg4IWZpWFpVCisqe2ljT2ohYmY+SC12Rjc8a3Bje3heOWE1UEpWKlkjRj5wfWYoc3tTKXNfWX0tRThqN0FaZVA2YXBXMTheTEhLKiVLaHAhU257elRqOUctCismYFNrbygjdmxAVE1zSFJjU3U7JHZvZUVyeWRQTTs2PEcpbUdlPlNrQXhRJGxtJCNKXkVqTEh0bT9SYWhnS1JTMUArdXExZEUyPFhHelh8CishdHZNSj9NNnlONT9oR0lUOU0rdmB1Wi1ZLUkqakNmV0ZWZjxfTGlMen1HTCU9YTQ+ZFlsQFVpdWBUN3NINXpQMTA9MFkkaiNJNF9sIUhxCis9IUVBYkhAT28/KylDRkZjUXJRV0pLVzZpMkBmP2ZzaGJ3Jj5ob1ooSjk0RmdEZS1EXzAhWW5jNkB0MTlWOWhrOVBxVERlOT0oZzx1aTFiCitrRmwqYGwzZFpwKG8rNitpKkAlZUZqYyV1PF84SGt+a2V9aytIdjYkejBpS2FZIW0zTkhPOFlMXkY4M3NzWilpJnBkMW8xb3BaPUFgZyZDCitjOWJvaztJaG59PFd9XlVfN0RjJSFvfVNDaDlJPUVnc0EqK2JQLU56Xms2T2xFSTNrMDIyVXVWIUU2NEN7WWA3VTZwb3duc3QhN2xPbjgoCitDTDFUNTVKdTFKSm5xbkNVRkVOUTNTXiFtXyYlfSF3Q2I0NExZOWlaN2FHI000MD8zRWRuMHl1bnN4eDVzZiYwR2gyc3l3SWxLdHdNQyU0CitNKj00SDs3WEFFcyNJY2NZSm0xcWdwWGNgOWsjKUhsajg9YHomQ0l0O2VHb0M/Ukd1Zl8kfGJuPjxrUThfelIyfWxZMX00Yl4hOExOS0JJCitiYmxZVzRKQyh1PzJYUy17LShjflp7czd5ZDxTcnRUPyRfSEg4bHJjQDxOTGxzWHBodXZeQUYpMk9AaUFVe1c8NjNZMHAqPiNWMUJJQ3s0Cittez5JTCprUlhHfSlIJU9FNFFlfVVyaXIkPlAzQW5BXzJYSzVpbzRHSVU8fVA7MkBWfj5sRlFvdz1icURqejEjYTh7ZGsqUWw/MlR1OU43CiteR0JyJUMrQ0ZSfFMwe0VwdHRrSSk0MEMyK0JxTXQrZVo7VT93Mj4rK1cxWDJWViZ5aDg3N2tqIVF1K3dPR3BpRWVAYUQ3XmhkeDReSTl0CiskMyVSUGs3NWFlfXVQdEE/Sj44MHJ+IU9IcCFuUj9QVXVRUDEzYHZ4Ri09aF9IbFghPzV4VFJDUjx5aVE8P0dVV0EhNTBoOTVXcVlGfk93CitIdVJYYlcqU1ltTHpENyFSNUAmPTxpSl5+UUpLc0szcVZWaCVLR1dmS2NpfXk3alc+WSNtZ1VZY0AkZXNwIXlDJXowRH4leXl3KEEqPkhsCitAZ09valdWdnhffWdWc2MjV2pJKHNJYDMqMGpyMWh2JVoqKSl2KG5qRHQyYE82TGImT2RfTmNMPWRJWk8wNExLQ2k4YXVuI2J4SjhxWCNuCitDbG5wfXxaZkBxKjljaT8mVFdoI2czWXtZayZ3VXkmRCpVVnQpan55V3U0KmBOKlApKjBEOFRVJmRzNTV5NCZ7UyR+TWRuXiZUQl9FZkwxCitwM3NTfFE4ZWMlWHVZZS1IN3ckKlFMfCVHKF9kO3lsYnJxWHB0RTBNfjF6azNiUkU9dDdpaWxmTD9qN2QoejAxWkhrUz9kVVVVR3VwR21tCispOHBkZiFNLWt7QHNjdDxKTHN0KTM9bnNoKCFyZFZAZTFyQkA9QHFlMUt+cmN1bisqQmp9eTFOdGZVLT99UF58SUNNMSVLQ1ZJXkZ3STBmCittYX5MPChKTSo9MjJneHFJRVZ2ezQkczM9KH1ObEBCSjUwKldDaDFZdWxIYm5kWTtffWR4MnhlZHwzQnx5P1ZFZlVmQEJxWncjNk9DeWFsCitQSEVXfSpyITJrRS1zNTspNnVGY1VicT0tYWFXZTByTkJBVHJwJD5ZRkxmb2AmPnxBUmVFYy02YygxN2hhQmhpdEVBaFF+VUczS0dVTmlLCitjNWpmUnNNTEF6bWdpZiM8SG5BYzI8dmFYdD4wS2I/YHo7fkZtbmRsdEE2SzhmI0R4YEAqZElBcn1He0ApJDZ1alNnQj5YQSE8KTgyXzMyCispd3xjZlpQNipMUDglaU9ZUF5LUlkxaFkrJi0rJi1ZKHV7TWpGcV4hKDx3KGN2OUZUUnQ+e1drYHBtb2UrZGNIR2hudHl+aEgtODJuNEIlCis4S24peCs2XzxyNldrZ1gyNEBTNmdyX0o+Qm5WcjBQWHVUPEwqVCstTFZlOC0paihkP3I/JX01YzNlP1Z2TyUtR0xXaC0qKGFvWmcoUDdDCituKUUhUlJwMnY2I2NsfFF2KzVJWnZRRXg4YEVgPzZRej9iXilTVl9OS2FNbDw8Wkw7OEJ4SSpBTkx3IXgwfE1AMmZYZXdtNn40fEBLQ0dsCit1Wkg9VmFLMitsIyMjTTwqUz82Wk8oTitiSGcmZj9Rdk8ra3pXTm47bXZkNmEqJjx4WDBFaCQ5WFdeOCFXQHFMailxKjhAMmF3JCo1VHspCisxbGhuSm9jPnh5NW1yPSE+bHNzcGA+VDEzZjMwKXokd1ZZI3UySm5tRG87PlB5ekFpV2JOKSFBSSkpZFRMSDhHSTsqWnV8QyMpYj9VI2NlCitLJj97TCZUSDN3aE41ZSZHfHU7Zl5wT1lmcyhxbkhjMSNaOF8waTNYRVhCRjE4ZWokIzhqN3hPR00pQGw+TVJYPSpOM2V+SSh5V0NHMlQmCis9JWQraz4rdmx0IyMyYl9pO2gkbStYUCpGYGFIZjxpJiRVNV5FSEkpMTZBdjhaI2s7JTtWfnpWV15gM0JoMyRJWkB3dkxxdG5rN3JFNzVFCitBS29ucD9tNUNQbHZ2WFNxUXYmdXpee0gyWWxsfiVeLUdWalVjTX1EUDZLV2tVI0V4bTZrZ0h3dX0rSDxXbW9SRHJtKyVFbzZ7MzdRbXd0CitMa2JmU3RWdnlVSUFPbCM/NTJeMXU1M0k0eUt6Y3MxNzZlc1VlIVFgTTZVM2ZgPDQwYismRlo9KytedH11eTYhNDhvJCpwKU5nTi09I1BTCitFWEF+WilzclZ1ekU7SWZ9VkghMm5CdG4jPENtKWZUcDlOWTE0UCpyWEtqNGs+aWAjQHZ7dzcxOCtlLThlOHxEJH18cE47KlJxNUVPbmNSCis5QmNoe0VzKiNrUTNlMlFnXi18RUNlWkBaRjA3TDM9KW80QmttTWFfNk44LT8lQSlfSnxwVj9gXlBBXmJhYHJEVmloUlRvbX19QTFTZEBNCitab1Z1KUNBcWJkZzx2TzdfXyZ8Pjx1c0I5c0ArTjlVeUt7WmJOKCNfTiN+PXhwUUJAJGJOaTs+XlAyJGNKZDU3KmxEY3h6TTZQdjhjKk15Cit4Z2ZSK1ZoNytHekw3Z2A8eFVQQj88cWsxLUhObH14Vl5ROCpoX3AqOzZJfHxQdGpia05CcDMjNXgpeTElV09UTWRNVFhSQTNmZl58Nkp6CitKVXFmY1ZNQDVoIyQlZWVFYiQrUGA+YkJSNjJSSFE2Py1IUWo/N01GSl9OdCludyRRb00kT0dfQSQ8VChAX0R+cjhJcEJqT2FsNmA9ViRWCitmcHFna35tUkF6bGhzb3NwPDMtSDZuJF5JY2hYb0xPQ3QoNVZGJGlaVUQlZCk0a0I2IVpAbnd4PiZjVyZVYis7PiNYUz5UM2ZJbjlEYWQwCisqcD1KN25hKD9FZUREd3V8bGs4JFh3UXspdH1QVj95by1hdytafClGdHM7RVFvSEQwMUlubWpyeH5OQHdQP0pEO2clUyl1RmdXcnpKK25HCit8aTY2JHBZQ3RDOWUlUWN2bFk5OGElb28tV292Rl8xRlVIODR2NCZMa3peQ1YySER4T2lNdUAoTXZGS0E4TlpOdWw4cEBkLX0tc1dVTlRPCityIyFnPE0wdyN9Png7YzI2cC1xTkRrLUkjK3B4RDBPRmhiMTtUanYlN3gpbThFMHM4UlZaY3g0WXNRSSlLLTl4eUo9WUwzS1hESXdxVXQzCis5JlJOR1ZDdzticF4jR0grSUUrPFJ0QFY3MSgmVF9QQn54NXkkd24lWnhwan1qXis2bSpxQWJiPDMrMDFsNURtfnF1c1JxaWV6RVhOSTRUCitJN2ZoSmlZOzt7TlU8WEEzb1U8KDdoKkdPJiF6SD1RZlBZYTZkO3tfdG0wcz9EUztKQXBidEFgbip4RSNNTlg4UUkjPTc3MT4hZlQhRHlMCit5VztHTXpsNlBqSn01X15nVU44UzcraD9DUFBPdTZOKVdtRl9GVFczUWBEWTJLcGdRPTtnPXFPeW0zSCY5SCpzcyRjfUcoP0x8MFcmTFZGCitfYjZxTVFaNCFmbkdLWEFrPHh3XjY9XyQpUVNseUQtQjYpc0k2ZmI2TGQ0ZCNCak9vSjlRcXE4QFBJfGNoYnt4U1d4e2FWek1sbzFfJDYjCitvSUQpe25AYl5sWUxzYDIqcHVneVZOMTIzcnM1dmY3SE9eM3FnN1p+ZzxzMH1ePn5zaGEtVSMhZ3dtMSQ3NndpO2pCRWx1WGteRThSYDUwCitNLTkkNH5eeG9gO1huZWg2c35DIV95IWwxIShtNUttOTV+WGR2bG1RREc0TDNyK1BifGlYa0BvLV8/WDsyJFhAemkqTlgjd2xeRVJmZmAkCitHNylyJWFVazghOWAmT2Y5IXExYDxsSnBIbCFuRXpVNCNhPDx7Z1JWPD52UWRCT1JrXzhPU1AkMVdTZG5EM2hvVSVlNTBzWkUxQU5rbzBuCitBUzMtJTZOKVV0VXhhUkM1WVpxSmdkblNBe1RpVFJLdjdxcipLaUBBRzJlZTByZCMheEooamd2SFJAc3sjcnpROygxfUg/KEd3bWdhPjZQCittT3Fid007eUttbGE7PWZuSGRWNHpXc3gkWDNwTHVySzBwYmpjdCNVWWd+I2ZjVXMqejdtUG9iWGkpPWpLa2JEb3hHQm5DKT1nVWBEV1B7CiswaGJWeHRsfCo0PCVmPCM8UzB7Rm1xKjVPP1B3c1cpa24lY1N+NkhsRm9weyReZEg5eUxFbmU3LWJkQ0ktUUdnU3Z+U3VHWF9XP0JQbC1UCiszWFU7N2sjYEVjIzBWdFYlVEFxM1c0TyFITjJRMXMkQDEqTnFyPEAxVG83dnhlKTZwMVZvYTBWaDZhd3tZTnBjfWRmPSlhfC08QS0tIXZ8CitjPENvVismT2lrYzJISml8c0YkUGd8PTVCelQ+XncjRE5jWC1ZY2BzZ01HSXYhQD5DbStDYiN0JXxHcitFfi0pUj4hYS0kPUEmUUlCU2A8CitoNjBUR3J+SkxtcFNCbjFhVk9oK1lvN2BYcHRZdWl+P0dTTi1uNkJRbEw4en5pO2grPjUhUVg4KjN6JmcxXk5ocXVTWW0tNiEzTnJHfVQ0CittemtKKFAwbFo5ejIjem10PH44O2d4N2hgcnZeOGRCamF5IShDQ18lMlE1fUUzVmpxY0V0dH5INUxJbi1sYndENmVHa2pEJU9+Q1RBenpgCitzOFZEdXVmJkdgMDNEbT1QU1A2ZUlRZFd9YmowJHxsbmo1cUIhUEg9Pm18U3NJWUJsY289RFRfMEZ9KWg5SU5XMFd4T2k9TjErbkBIPXhvCitWI3tMMi1lSFJPWktvb30mNnheXmpMTHZ4NHooNE8xZzBWZG9sIW91Nzs1VHo4Z3p1UT9nemh2UDI9UWhKTWZOZEJfend7SURPM3Y0OVM8CitlcDk7cGk2OyY5MW5QZ0N3OEc7JSt8RXsyUWwxUmJaaDxqTE81alBKWiRfXiR9STZMe3w7SXRBTW1fdmpZPkNMY0A0SCNTMXxTaz8qTjVnCitBVklucyh0XlVOPXR2NXIldjBEfH08STRMTT0mZXhjeDxpNiFIYGdFQFZabTJHJE54MXJNSWRNY0QqRHRpOUBeVHktPFZ5THdJMFYtTWNgCitxMzhpRW1acDBfK0pmYCZWTElrNiltQXRPZFJsQDNCN25OV0Z8eVMwNDJLMmopJjApPj9QUExPUSYzUUxMVj5HVyFLPHtPaUBEPzlAUylyCiswT1VCIzdSV0peZG41SjduX0BuX0tvSjRXSEFCb1RnMU1oVTRTeVded2c7JkteQnRvaD8hd3tXayk2RGpBYlNvcEFIMThFKH1qe25PJSM4CitoUT12IUJ6emk/LUduVkhMVXQyV2NZdj84NjZtSFBCc01NZD9pVDg8czNoSHQ/Iz9ueCNnbU5KXyYpbjAlbGojS145VlVRb1dneW0kMWVqCit6VEZLe3AyIX09TUMpZGt9MTFCOTZaLUUoZXo3bmFEdlViQzlqUWU8NTUpWk8zPShkNE5DRVFAIUAlVHA7O3pNT0R5TEspWmtpYmVGek1GCit+SEx4bS1DdUNTaWEmXldrS0tWc1pNc2l1JGteOWMkP0tyd1pyLTx+LUEqUCtnJitJKzwkZjkrSU1eNndgJilRIXwpaXVkUCQ2SipDVlVWCitQbikzI09EXnQydjltezc3fkkxaykmPyVrbzl6XlpIVXFHdEpqPzhEOTU5bWV3R09fODElZT91R3BldiRhQTxDN159S3JHWXJiQDE+YVVPCit4Qno8VWI3azloUn5MRyFgUCMlRCRWNTg2UEhJOWZhfXpmJXZyUDNaZHAkVzBAMCZWKioxQGYwVDY3ailuWjA0SDsmXk1ePFdBR01LeUVnCitHcURyI1QjWEs/fl9GTnpRSDFvI054YU1KZ2RscEZiYm1uNzs4Tnk5TSpeOGEzTWhgVFN0WkdKNV5tcEJhOGY8eFJINGJgaHQ0bW5IPWZACitPZnFtPVZCeXJqQkgkSWVRc1dkaH5jWVpfOUBwamk7YGRebjdRT2ZjdXF4WXo0ITxJa0pofEd4Ky15Pjg5dmk4RDV0JFFoSjlVVGNaRTlmCitKPH4wUjkwZ2VOJk97M3RxIUVIJW1LYkhHWFU4Mm9zUjU/bFRjaSpqTUtqJEh4KUcoV3xXYipQNTRzN28oZlNoRiFPJTRyd0lzaWF3WCphCit6YlN4RCFTMm9RcWJ6RnEzPGw9PDFWeHswdntVWHA1cFY2PXZtYkdqfSNFdiZneHpUNHFKfVg4elRTRSl6IUhWWG52Nmt1ZmJfRHpuSTBMCis/UWkmY1B8Nmg9PGZHQXB3VypTRiQ5ODIxUkFaYkU/OHNnNStiTlh2ZHc2Nj81V2dnYGFreTFNKFVZJWRLM2hDfkFiRnVEdWZ6PkUzUCktCiskQiY8IyliYDV8LVFraGN3JURCZiFrU15gd0dhVkkjOV9YKXlienhteWFGPjl9QmJ+RElhNXQzSzBVNGpOIWJWbmI8ZUBPQTBFPlVrT09uCittd2tlJXFWJGJ+X0FmVW9VSztiZyhfTTUkVGgpaTB0SExrYl57PndUXzhrJFdNOCVFd2R7Z2tTK1E9Sj14MW5feXQ7WXRtUi1KeEQjPy1OCitLU3FSSSYwZzN9P3NjSWtATHB6PSU+NlYhP0Q0Q1dudzJnb2Y3ezBrU28+Uk15OGdZfXA7JFVJbiREISNFT3dWNEZfUCtnSlNtdD9hcyU5CitZdlB5SkhNajFmcC0mZTl0d3t6MHduQWstVXRhS2ZpUGN4TEEhZlQmKWxBSyZWQVYrUjkzcnltMDZpPEhBRUdAQns7LUlWfkpRMXFzbmBDCitfWVgtWTkjQlNqTE5aeGVzV2MoND9yQlZfOCZjYlFeOTUmZFhYbyg0KXlAbkM+aEByfSt2bnRSUGU2MFcqYDV5Kz1ZWWNzZXRKUXhhY1VgCitfKFZCaX1yPFJ3N18qQTtIWmdebzxGQCF2ZFZwUDNkeUJaQ1olPyRRJTZhcT5DPkZLczJeKWZPdXEhWV9hZUIkcDc5NVJ9cDdxN34rcVdVCis3Yl5TeEs8dDRBTkE7aVdKYDFta1BNNFhFPzUrSCtPKHlfeD5eUHptdDc9S3dYQFR9MW8mQ3EtSVFfdFU9dHJHSD1ZQ3J0Vi1eJW57ajI0CitoSE0hJGt5NUZjZUVNMj1ZNjRscCNCayohQUQ/SjtadiQ3NmBrQ2s3NE0oKkdGZGApZW1nbkBuZigqa2wpanV2aU0kPXslcmY5PGNIcy0qCithTnE+azY1dzBreXZ6aDwmYStscy1KQjs2NXJpRD1zKGU9Wn1eUExjUEFFI3tnSTt8WTJPZFROJTk/QXEza1hTdz9WQjlfdzRSMldSTFltCitLYiRXYyZmNVNHYFdmfjxYN29lcWxKOHo2ZyFsPl5gdmQpdEBKSztjcDY4TnBKe0MyMm8kJnJAIXU8KlNGN1JgKjh9WW43OTYkSTIwQEhNCit+VH5xTWRCWHs8P2BJajZzVD56UFZNcTE4Qk95OTdQaVRgRnRhZWlFVFAwKzdnPiticDswKX5HMFJ4U29edGwzdXhuNlNhNFJzNm5ZaTBVCitqaHo9blFDTUR3bUIqcWc7fXlLUVh6bDdyMXBsajRmUSpDLXAmR3tDb2RvdyMzdnl1YSY/YylQTzRlfm93Jj1uOz1fPXN0cXlhdE5abk0qCis+IWUrQmE/eXFqUkhZcmZebl5jUW1XRzRNWl8pN1E3Vjl6M0U4cmFvMGI7YnM/ay13U19xYEJaPyYhU1h9Y1d4ajVpJDlIbElPbmM4X1FMCitAdz5sUTtgajNZMlhaayFOLUk3ej1UZGVKRTdrfUdGRXExLVhNOz11d0FPX2ZUaiRxR0MqYXIrU3cycXdTMEVlQ0JNdCFHVj9hbGN5fnM7CitXWT9oTD5VSkBFMEpWenNUdVU7cno9PUVjaH1MPFQ1WFc8bjFVRVpCYFJFfEwhPyhEWW5rTF5uRHlQN2VYcCE/e3ErPiEqcFZicG0wVylkCitSKigobWh4Uig5eG89SElXaVRYKCpAbnBMWmEpU1pXISRlTFN5IXteUmhsMzIpaURAMjghVT8xZkx4YHEmdFk7aWtYTjRXLUIkOVFNQTVPCitmZ2ZGfm44PDFVP0lme3stbWNuR3BUWnJIPFFyfDA3JjlQXzY/bGVxJDJzWTAmMVpmIUF1aXZrcmBIPT51YXhEckBkKWo2JDVzSzw0Xz5RCis2aD9vN1N+MUFvUGFqYEokUHt6LUV9QkF3bTtkNHltNkAqZHAqJFRjcit6Xzc8JTRJUDA7Rld3bHw8RkdRRnIxSUFBSm4zQVJocWJEIUM7CitWWHEmI3RGTE56Qy1IJFMrQ2p5UVVzPTctST1qV3VtaEBmWFl3bElNTURuaVYwUT52KjlFVH10JXFSMFdhVGlwZ0xkdj9DPUwyK0padnYlCisqKVg+VStLfjtCOztMUjMzOWVSflpxOXl4bEVXO2lHVys/K3tScGM/Y0JVcX5NYXc/VWQjaTs7X1o4VVNGYn5mPWllS1RCJmArPF55amRUCitycXVDZjBzUnJtJWB3NjAtaC1Ye1ElYnYjWk5+Z2pPUnBeXmItNEAwNCFvM2FnN24xZkJ7RCNDdVlDPTM1cXJpQWF4QXB9XnpJMDllY0dNCitBUjM5K2lyWnRTWjZPN3ltOylpM05QJDF3RUdDVHFrITdaS1NieThnYGVUTEQqOT02NnBDWDA5b309YjQoQWUpSEQ5WnY5PSg2QDYqJkhOCis5V2EwRTR7byFJNzg1WGdDNlh8NUhIeC17WiRqTyZMeUJWSmBVdkBgfWkoSTtBeVZpPWl8SmMyOWFwem5KdCZaYWFfblUzQD4+R2t0NVdiCitvSzxzUGh4fkdlMFo4PD11ZmhHbUVYVVJJRW5gajBKaERjSyhScUdhU00+SUFsaGFMV0UtZX15OF93V2tIVVYwKHZtfHkxeGxfNXZIP1BTCitMej4lWFg1dlBgMUteZmgjUztTWjV8biFiay1aPE10PXg3TE1GODI7KXsrISVFck0+cDVLVVlRV0NEY0sta3x0dmtNNGQ5X2w5SyNCIUdKCitaSVJ5fUhaI2BeMTwpMFJmdCVxJk0rdDZkMXlYXzt7RHBkUShWcH59RWhQUV5LZUZWYHkoeWlQIWd8OUUtJihLQW5nUmgzcEhZYjBrVTtfCitqUUF1c0AjZmdsM1kxe2VAc3B4Tkx2I2VFN2trY18/TV9EMnVoLWZ7LUcyPyFtfkMtNFNKM2JLakEwWjt0K2pTUF5MVExZZ1Rhb3d8dnpMCitRbkF8M0crKzYka2x7OSZTckZUbUQ+N0l5U2N2KX48PkMjbXh8NG84aTZ7OXRgUEF1dDFyZCh7P1hSPUxlXkRWa3xySVUrRC14T1N2WjdaCitFNEApSnM7VjMxfU9INHc7ZGR0U1o9V2RIQD03KWUjRFNPQF4pVypGPWMjNFZSLUJ7M1YhNn17KTRSJWRAV15CKz0obm9kO1Ywazw/bFEyCitwVlNZdypaTUo/S0BaPHkqU3cjJXc7c3ZnNnh5QS1YeTdkfj4mLUM5dj0rZm9qMSlAbE9xfU5YLURkaSVoWGZpQzlya3Y+WHQmNHVjbDNQCitSQX5aNz88N2xEVnlnQ0BmcmVqPytzck1Mem8kSHpeQGRJQ2t7MjU3VHJnV2o+IXVPR1FmJVBGbUFHZ15JeDVhcE5PKmRxcF57ViRiKHErCitaR2VNZk84SzVmJjM1NE5+amsqaTkod05uVSg4dzNuaylCPEJPMHdgSSZQI0ltX0dAMTEkSXdhVVR7eyV1LXZlOVRUTFZ8bSh3QVJFVU1kCitpcmBZe1NNKS1WNHklSX48a3gmYj5BbVBGeFlkNTZ8TmZlY3dmck9HKFJKeVZlYDw2RjZTWmh4eXBQP3dKamF2d1h4Z3lESU1PP0Y5e1lZCitQaDVKcT9RKF4rQCZsMHo3bCpOaFBiVnxQdXxrR1lSWT5CR2xoKH0raiVgO201O3g4RTdQZHZnNE1uUChSdC1MQkJwTXo7N31jVjslVEtQCis/fE1DPGpuU2Y9VzgxZj42ZjVMYENLU1dtZDlHS3VAP0hBcWpVK0B6Q280IyQqMWtXVjRLZF9ofERuflJkcH1Sdj5odVI+N1NCc0EkSF89Cit8S3tjSjhtSm5YOTV9bnREN1ViVTltRmQ/Q3BiREo8X0Y2bSg0TjVjM2lBdHhDQVZzTmlrYH1ydlpvIU89TG0wQCUwbHJQcXZzY1FhYSRnCis/MXorYlcrVyhtc2hMd0Y+K0J7KUJ1Pk9ATzdJZWZQQCp6VGY2SUl7VjREQ25xMmFyO2cleCtHUTNlTDNqVVNgUFNGVFdFKFZQO1lzQEo7CisjeDVvditeME1uK2wwbS1IQngrKnIxaCF1VFFIaSQmckgkbCNlYF9eNjRIe19rWmFkPjtKSkJtNzBDPT5rK0FuRSRoJXlaYCFlYFJ8ZXN8CitEVEhBYXQhfnMocUgyaXNveDR3N3dxbztyMUwlZkdOPDxWSnZgbE02dS0yZV9mMkFZY2QhPTR6NjtJJTB+dXR4eUcwM1JIel44Z2NoN0VyCitHa211O19KfjV9bGtFOVB8RD0jVGdgXi1xKzZjdVQ2IXtPdjJnJlhgKF9nKDhec2M9YGVnIXl3WHJDQipIKXs2MFA7IXJlcXstY1FCMHJnCis+MWkyZWIlIW00TS07WW1ydVFCclI0cFgwNk5kNTwhezcydkhNX19ybXtXTHkhS19gQTJmYXZ+Pj5FRHltOFFTc3h3YDA/REhVbEslRTtZCitKS0RnNm9tWEc4ZiNWa3RHYT9xXmNSX050ZSUtNT5peTtCV2R4aXxMMFUoKEhMQj1eaiVeN18wZktBdV5qNm14TWtOT09wNkVzdHNwKlVhCis2RCNsUHpPdi1PVlRvWT9sfnBNRXIkQD15aWNPXnZsbj5mMXdCPHtgU1M5UE8hJWVJQHRVVWNXTXBreVdDJWw2WC11IUNsaTt3UmY8QH1yCiswWGkwQWtEaVhZNl5Pc1hkbVA2JDNsV29XSWozV1VBSUxJNiZ2UnpyJD9rMHFAdUY1Zlpwa35Ua0N2Um0oeEkzQih9VzBfXnE5eSpKYWN1CitRTW5IMTYrKGJzeEtgdm52R0JBVUkzP3Rucl9vJGR4OVBlUHU0dzVNaE5HPGUmZitgazgke3cyOCR2al5TaCFiYzF6JGwxSCRBI3plVWxQCis9Z3E8dEtvSFdOS1V9X21jYC1ycCMmRWd5cmRlZT0wSnwwcHB6JW5LJHhZZTc4LSozLS0xek9iI1JpNDkoZG1vWmBCPzROT0E4RH00TzA0Cis3T3tPUyN0KSRlPS02Xm0zI1d9Rm9oZFJyZF91Ty1gS3pmTXchcHRTRGxjZzU2OFFaMjNST3xSek9haWItZVE4QXNUT2t7QEpqNSZfQWJNCitPbT9rJSU2UCl1JWsjcjFOI2FwaGJKdFNZVEx2O2whWjMhV1dYTCVhTil4JCNfX3ZhZ1FESilpbWxXMF5rOzZCNmZNMF4wMmIoWXIkU2cjCitNZSs4PiErMXtAWl4qdGErTEhWRkYmK154fTl8RHFgNiVjLUxKKXFJaWI4PzxtZ340JmY5b2tWXzJKKnBxRUsjS149aG08PjxrMClPV2J4CitYPDFHSDV8JWhfOzdMR05KNlQxKFclTjNVU1U8ZDgjKFNtSS10cG5ZeWo0Q2tlTTQtVnVvZmVDSzJoZU9aflhhd1pII1F2aSEqKUgpcHZQCis9Yl5hPFApQTR5OTU2cFhjRmgwWkM0SSlpeG1AayhrNmBAQ1haajhyYXE7SWRGcm5NUXF0PF9hcylXPFBYKkg+ak91cHpKTEhwaTxyRDswCitfQjFYWXJ+ZGc5KWJxej52MEF9KjNzVD1aMTxuZzY7TmxZMDVSPGRwQ1EkcDBjdzE7TWB+ZkJPLT03cCFNNDh4T3ZjMT9gWXNgSC07dkRXCis9TClsSjZgc0Rgcn5pNVcxOVg5VnBTR0YqJk5UbFo0LX1tcHQ9d0tvem1+RCgmRz1CZzBjSGoreCNoTGJ0OCt2Rz1keSYzPkh3JExrTDFSCitkMUhiS3x+ZGhLaSVSMHlOfUVgMitOb3s2Mz5lb2M1Q3wtU0l1e0dJa2Y2SE9mIUxebHFTI3ptelhKRWYpd2cpbldxV1hFVyUqQ1QpdzxvCitrRFhUKyg+I3tEX2lyPn5ZQENvenNfKU9rQzxifXROISpKcFImJG5YLXxRZXEjVilNdU9yM3liOFZIMF96IVR5OVJsQGx0cTNwVUVqfDl1Cis3blJRcko7KStLYy1zJmFjNzNhSHNWbHQ5R0s9LT1NU3c/YX40JGlUMVQ9Yy1sWktTQENhNzUwWGxhKjNpdyRARENSRUR7dCUzdlJYZkA0CitsfEc9QGBaYHhTKGVjM2Nia3Rsc1ZWYFM1UVRja0N9Ui0rKztMKHglZn4lT1FXKUVFWkVJP0QkK1B6P0tAYm5kWihEQTtaITRBIT5DUmFhCismN21BckpIY1BEYG0kRFIoNU9vQnlKVTFxP31gST5xZlpNUX05Y2VPO0B4JGhlfipLSlomalR6dSZNKHgyc0E3eEQ5ejlBJlZrI2BAYWVfCis4T1FpUz4lViFSSGx6QVZfZk9WS2ZmLVJiNkh+Zj9NTGc4dm1VKWhIcWFFS1l5fUtQUkJCbnFANkJ2azN3THpPWE1OJmwtSnBRMSFESkkmCisyYHtKU25YPEZZRD1nQmhHKUFQPysrVSRzUiYxd15kKH1Ka2RqMTtjIStAYGtrUSFgYnoySiNNcU8lSjtUK2drYFFQNSNhPzEoQD1uX1lYCisjcFlZP2hZPShHWmJIPX13Kjd7I2lPOUtRSDAwMDA4MFB+ZD1OM0FoMGolRVA+MEEmSUkwMzg0VDBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCCitzT2IxITNNYSYmVnBhQ3ZRektYMlNINDg/YlQzaWZXZXlXcX5aNzZDRjhNVFAqS2c2eDlNcUhNTXs8eCl9LUZadHx8e3s8KmVabGRfZS0rCitUTFMqQnRlRlc0ViZOO3hNSyoyPC04NGNmbVMxbWdYTEZAfFcqWjJWbDNgS34wKXNISGA0RjdRam8oNSZQaEJOMnJ2dE8ycEk+NG9hUj4kCispT2B9YkM+WXY1MWpQdXh3ZVYkbWM/fmMwWCVzZUxxQEFiV2F+ZStEVk9uP3skYDNQb3tfNGlJLT9KWTdKc3FpY1hTKytAK35KMGZeKXlPCitWakZUJGU2Ui1UTnohPjxUM2Ytb3diSVpHUlp2KVgoUnFBcE4kR2dQNmp0KUdEYmlySTtCX01gRnZVT3QtKGFUQHhGM1FoMz8mR2dUN2FiCitFSnp5IVhxMkRheEl5SyhfZGFyM25fJSF6KFJmOF55IW4wODxqajc2dz1MUDVBOVJDeUVndE4pXl8pNmwhR2BhakRPSnFsMVFHUUxYVz4qCis4JUA0I34wOSokTFBQZSlAc2NWeGB6akVDQXpyPmxZYiF3RztyOFoqcnBnQVdnUUZzOFJHI3ZCJDBnUi1SS1lVJWBeUCloPkA2YVdBSzJtCit0ZXk3RHJVeCNvUkNnMDA2eE8wMDE1VTAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85YloqNmQ0YlNganRvbTliJitBdDhrYHp1Q3BTCitoZm1MMSh5bTVfMGFhUGhpV1VLb35rTWBqdVhycCtpUTxvXjdveE0zNHZYeHkzTkhpPDJOc3BjQEwmQWU+VnFWT0ooWDZNNkJpPys2clRuCiskJU1IRWNoKDRkYTIhKkNSbykmVGNVKE8yU19WKURYRlk9MGFiSFNndGp8TGU3QE5ZcGRubyNyaHs5UW8hY0FrNEEwZm49YDx4Wk9xPSQ5Citlbm98XiVISDkqakNFJSlXaGVkdzskVyRtP3Ztb1RHP2ZDS2pDIz1gN3hJZjEmUHFeZ14rPiZ0VW4tdjNraEdGVHthdiFMWDJXVT93azN1Cis/eCorVzhuQCF0QlpBMiVpVTlsYFh4eDNzaG1Wfkg9aSNDc1pNayUyPE1vd3ZVT0BOPUc/V2goYGJMNHZJeS1zTzNJMmo3aCVOaER+NihzCitMZDFeTVRXZDwwe2pGSCU8eXdER0BIfU9qWGVCc35iM303cm9ZTUpDSHBgaSF5Xn5gWEMqSig9bldpTCp9KEs/Tmt9bTV9bWg0QzhedjdPCit8ZmtwNTg+aF5qKGhzMXt4dzZNWHJkWTh5O1VYISFPX1Iyc0Zhb0defi1ANTE2QXJSYzhJUmZEJllCTWd0YnBmNV9vTD5sdTg1T3RFRkImCistZnF5Nz87anFBYHluM0BDJEh6LTd8WEY+JEA1OzhNWDNaMTFkbTxxR25INSgqKyEqTm5JZDN2SCtHdEQ4emlAa2QzUEgtKWpJP2FHTmZ0CitmVm9jSlZpM2pQR0Q2bnlmV3VePm1QRnF1RlAtKUFOVHV4aSl3T191e0tMMmxOMV9RandIUGBqYnk/bD1KUlgxZSk3bjhOJU9YPklBdz9FCis9NUs0YElkUn1aKGBwekxpUTImPVVlTlBrUD1qYXB3PEtBbz9Ybz43IV9tLW0wc3g+eHhSUCloPkA2YVdBSzJtdGV5N0R2b1U1ek9CYjAwCisxWEwwMDE4VjAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85YloqT2E5V3BnZllkRUh5PGtLNCRSfDJ9XzNWfmhiTXBONTt7elRefVA/CitzaGtpYitYPUZJT0FJXjk3RSFldChvPnZCLTJlPSkmPT9CUTsmWDxseENkVTBFWkpga0hxZS0/eTljR3VkMTZiI1AhUS1RTVEkOD8kPWBJCitjaHxxaENsP28mbXpOaGB4QklUPil0I3pVZjVjOHdec1RzKXFQVk4rPnRMa1ZtVG1pfVdVY1A8dWokKCMzJXdOdylqdFI9fDJqejFvQlpPCishZTtzO044PT59SHQ5djdNeTR7TmhzcFUhLXFGZmVRP3VNR2orZz4+Pj03TjkwR1A8TXQtbUFSfiYrQSYyeT1vaENMMWdvaW1NP3N9VUZKCisjKnk2eV5YQnorcWlgfjd0YmY5aXtpVUxWJk4welBoJTJRM1NmND9UUCM/ekxXdD96cFJxTWBfbTN0Ymg7b05nOHBmV2hIbTJRTWR9eD8hCis/ZjVnZXNBRjY0QG1ZMl8pc0dRZyojfk1OfER3PnNCWG9TSHBnUC0xelJJRnd4a0hpP1N8XmZyWGNrWiY8I0lfVTsxK1ZhWV41WShNSXZHCitvbGIlelg3KUE3V1okal9OdjVJa09ONU9TSDJOOzM8PXltTlp4a1VvWS1naXNlfTBwT0Y9Y2cpVnJkans7alUwIyExUm5ZdkB4U2lSOFgkCitpaEY1eUx2KEdlTityIW9zOWZlTlFBd2IlU0IoXmgyaWIjU3p+WEd6dlM/NjJqTzx0OVVWVzRlJXFmWHYpJFIrYDchKWA+YSN8O2ZybFF8CitHS0h7aj0+UnZUUD9SJkQmMWFOPyZ5PjZUT21eMUlTbDh0Uko5Y1kkOSNveDhzWW4jO3lvVHJmb1B+YCUrSHNZZktxMjl9VzB9blUkO2JPCitVXkhJYkEkRXBhZG8rPjReP2JsWWlGXmIlK09zVTMoWUppRyUtSkJtWEFpeSg1JGk+MF9sZDRhbHRoVFh9IUo+K2lGbk4/XkxuKzxCP1gwCityZ3otbU0oTlJ6Mns4Ji0wQklIP0QyZTYwSU5se08jeyliQVJrNEphK2M5dSsoeVJ1Kl4qZnl2ZVdAVHQ1ej1VZU9YajVgJTY2IUYwcSEzCit0Qnh0VnQoMzJfSHxwUE0wbSRIen5WVzJNOD9tI09pNiVLc3k4c2ZjPGMtREoqYk4jIVRMdzRBflBmMnpXRyl0KT1GPiRUMDloMGxsNz4+CiteejU1OWxKXlUlSnBLVTtZfSglS1A7UGV0N3I0bDlXRVFQciVtb1cwcVd5fGlhVEp4UlhuTko3SHVQR19rNl44QUVNVFJ1P3BfWmlGT097CistdzJLWVFRJHo4PHU4JFY+anUtWGJjY1o8alBOXyQ8d2x8fUJRRUs0bTRzSGRvekx+QUpldFlwUTVkdSRZYiNGeVdVQWMhNDM/OEIleTRWCit+NDZMZW82Uzk3Rnh5MTN0aTd3flFHQmg2NHxHYytIaVJ5JjA7QHF9WEM+TEpxVmhyKEVzdlIycz9kcFJBMVB0bEsjIzA9aFIpRClUTSRhCitLYiZraVJIfnkxKTZaWkR5dk5RI0JxcG5KSD9zRz8kVEJpbUZPeWYwVzBTXyptNEBvWnpRP0xfd0s9dldyXllMK3NweEEwJWpqaitPJDs5CislNGFUe1JaaXh2ZmRUdEJidnZ0OVUkXzg8Xm5mNGBhUkUycDx3dVRaNFlzXm1iaVBlcVRzcj88azttTXdSdmNWeCp8K2RSaUxlZUo4PTAhCisxSG9Lckc2MldSQF5aeEVUJkd5diEwe2pfLVptMkJKTTh4IVk9bkJJK1pUdDlHWSlJSXxObioyTUMkKE4kdnMweWlQbCkxbSF9QVJyYjhXCitmS1N9cDx5bU53bip5V3l2S00jSDFBJDBsWF9WJE9AKGlwJVhhfGtHaFR+KkRsZzxsUT48I35SMURFant0VWxtNGBNT31qP2dJe1Z2IU8mCitTKkZOYnUhUVc1O2JNKTNJe08mPHxGUjUlcEoydjA+UXMpWnAkY21IJVN4M2lAdF4lXzdhdW9EWX4lcVg0Plc8aWB8YE5Qa2V5ckhBRzFfCitDcWtMZUIlPnQjMHF6ITV+b0FNfmgoR3o8NDFlb2V2bWQ7O0s7SVhCQitUeHk2UHRAdTExREpuQnZUS3kjM1l7TTc1QmJkYnR5YGdaZjcmCis8cHRJYW5qMX5UK3BjQkB2c1A0TSpIbyRCZ1NoJWlYSkZpU3o5Xjc5QlZOSHJeTnlUZWpgZzF4SztvdzNTa2tzQHR1fTJDQS1rSTBGNCN4CitwJUcpNFo/U0RVaDhNWE90bj5kKW85d2tFOHNONmtCOVI0bj43d3VUIWNrYT5ZfiNUNiM+MVdeZns3Nl87aWkxcmQkUSo/JHdGeVBkeE4pCiteO0h7Tm1EKzEmMCExaUtZOWtJYT85ZlNnazdwRi1NMjsxMkAwQ3lsbGleP0xFcipJSHlJTl92akt1Q2ZDNytkeTBjNVNDSWVqNGtLJlR5CitYWiV7fFcjPlg0N0w1ZUplUUkmR2JSfDNwIVBkajZvPllKZGFgbEJGb0M1Sn1WJWZWSWVTVFRaQVR4Z2I3V2p0RkBMbkVIMmRQfVMkO2h3CitIfl5uNkEkJXM8bVhEUHFIQ0t2Yj9nKUB1fXMke1V7eCZ5Vzw4O2NFTFoxVn5hVG1rcklxUzItaVF2aHoxdEA3NmphemtVWldVP0xoY3FACitycjJDSEdAQypgNktOdSZAJEZxSWR9dmNFXjclNlYhMTs3YCttX1peVGJHfjZ7OTk5ITg/WSpvR0g9QEt3Q1QpTEZkNztZPGZ6Vj8mZ007CituY3tsciF6O3Zqa3hrcWtgdmVCcUAlJGhpWC02WVpAbVRzRE0maSV1eFJqK0ZFdj1+KmkpNk17T2t4I3Q7PXRnfUZPfDF4PCp7cF45cD80Cit8dlo5YGozfUsoUTw/RldEKXZEeW0kPlBuPlVgMj8yMVlOa3JgalJOJVV3PiU1JitafG4xRnAyMFNnOTJ4PCZkLSsyKmlNWFdhWjQ7WlhZCitnKzIpK2cxZnxeVShre2tPKUhEeF9pKHJ0Xj1CJClOeUIqbDxCYlFySntKNU5hIz02SVU7YG8mQztTakNtRHtQb2JJNU1SVW9mSnEwWU4yCitOTz97fk9lU1ZsTTgwUyU2RHBQPWo0NldkbmRPPT1rYWhSKGFVX2hOeUt3YEFLdiRrIyp0RHlJQDR9ME1aN1JPcD4+QzglbDtyNT1UTCVZCisoUzc4b09iVk9GTSQwNEU3PzVJeUgyLT5GMz8hb3t5RX5QcTJtZX5ARkVhcDdBIURrIzdQPn5BUG9oIyFRd2dVOX5aTFZUWjU8JSNNZVZnCit8NndyMTlOVDslV3BiazYkWjNHOTlieCRfN2hsJE9rT28hTVl+cGNmXiZecU89d2wwNWNrUVE/NzYxV288c1ZmPVlIOWljZ2hiYDg/S1lJCisrei0hQz1vfFNhRntyMU5ucTkpcGE/ZV9Qb21lRXJ5aT8+YSEyc0NQV0toJl9Ga3pQPnQjbVdnXkkjb1ZgVlM+SlNZeiRDVkgme0RmbGpLCiswZWcrNH58Vzs7WFVZZylaMFI9IXtTYSFJPWl3bEg8MEhyU29hVEElUiFtZWcteUUhVl5yKHB1VjgpVyspdGhfOXA3KX45VU5saz5JPD5lCit0cEVCYHlsWEN6XyNSbF9tZjw3PGBJOEh1d3cqR00+Xk5tezU/QXhgLTFZQEk7YmNkQGo8Z05KVVhfTnQpe2ApJFd0UFgzVUg/T31uV0VLCit1MEIqciYrfG9sVnVtYEZ0IXI/Q3dZdkAmP0NaakJMV2dQcW4pQk9ifHFmRWRfMTVTUGk+MCV6cX4yMmdrTnwrNX03a0VkfC0mLVRuQE5DCit1bzg5T1Y2XzJsdiozNzM1PWpDK0ojcTFQRWFvfSVsYjhaNEtafTxVNmhGJEEpKT9YQGUyXmBkR2gyQlB1THVOWXl+QElGQWZKVmQzWENOCitIbj57c1B2YyF3ejBnKUVmTW92ZEBjeUw0SlJWQl5kakt7bCtHQmpCPWpIPGdCd2picWpRWHhzeSYzQ2RvJDdDPmtQKmMlRXRiIWZHYiYqCitAT2QrTGUjezA+b29fX0poKyF+b0pIMEQkbkptd1V2dXU+eiRDNVBPWVJpa35CO0g0JU9hM19pKStFTW8kVXByN04oXld1cWxwMnF4NGMoCitLdykocDxfN2EkVGw3Vm81ITxDd3w2cnlUWUJHemIjZkNLbDclSD5UfU92QEMwKnlYQ3sxfCpfeEU2PVdVRmVmMyE2YHs7OGRAdnBpYG8qCitYKyFDMnItfCNGPlpaN2hxPGd5WX0yIXRvbmJVRnBNPU5mWkliNT1mblIkdEhoTnNVQlhsZXlkSUgtbUJCI1opJnxgNU1CXnlBcFFGVUYyCis/JHwjN0ZrbzBxPyFuZk05bDVTaCtCfmZ1bWhuaEN1emgyTDtFY0BQX0tiNDU3TFF6emtUOEtKKy0jRipuPkx8VDt4KUt0cEJnYFp3P21GCis+Sz49YlJfK3Y+PFEmJChyWk8pbnVwMlFOe2NfYW9aMUFNKl5YeEokY2FPM3w8MDBmMEJgJFRUYUpRcHhoKT5FS284SztoY1ozbHpTWHV1CituNTkoYkgoazJQJiNKO3FTNjJze05oe1B6SSlxLWImVUteZ2ZrUXhuQ0I5aWNGXnFmelNfMSZXWER7JU9UeEhvMjZrM0dkOygwKW5EcDJfCitUXksoMSU8QjFIUnx2SWskS1IxckpOSC1seSplMC14fnhHPiljb1VnemV6SXpIRUohS3dhYHh8aGlSa3phfCFSWj5CVHhjfT4qR0BaR25VCitNTlpybFp5bjstcmRFdDNZS29eJjVkUTNvJHc7QWQoR0NqJlYyJVBTMXV6Zm4oO1FDdVhqO0khWlc9akNYS1dzakVjezlLbSpWKGB5LXl3Cit4a2VKWDtAKFJ1I1lyX0hETUgqblhveTlsZ3BhYiEjRm51PDEkKjFYU3JaWSUpI1R6OyEjaUlWTXVyMShTM2FUOUApS3M5czwrOXZiKFdaCis4cXttTDVtR3E3IWNzOXZoIyFAdmlRa3xhN2opZHo2e1k7fDgrRk9tc1pwVG9Tcmd7JkUoJHojZ1dVP3wyaDAlZzh0SWYqVCUqaStybWBrCitZUSM0OGF7Q0ZgZnVQUyYhUVE5KyQ9VT0+eTt4S2g1SXkmfF5GZj9UJVNgM3g3SiZJcXhiJng0bXExO1FuWSt8RUJCdkJhISR3aUtjMDRoCitFZk0jVXtFRTg2PzVGSEBMbGdpanxtZjkkRlhLPHk7MnszWlokRjF4Tml4dHw4WUZ7NG5JKyo8YiMwblpZV3VOaH5ufjd7P1NMXjFYfkBrCit9UkwjSl91fitEbGlpKEVRLVAtaChxbzZNanV2N1NsaTxxckQka2VSMDc1X3pjWmVBQmglc25qZERBYlh2cylnWC11R0RRXnp+MDZTVW5pCiskTiNKbG1nbE14UGV7fVhpTnpDezNjOCFRZGQlNCU/VGdLV2FkUCRNPkk9TDhCQHlVYnR+cjRLemhkTE5DcjVRS0ApeExtcl4wO2ghQiZ4Cit+bnN+SmYpa0Uqe09NOG1LMXZKe3w3NHIoc2NkRk5YNytwVEpiVT1VeWdQOEduTjs2KkFVQypKYml4NWtLTjlAczZyWkZlQHgjPmR3aVMrCitPfWhpYk9wdm13UiYwb2x5cSs2LXV6QUIhSlgmemRCISlKVF9AVHM/TT9Bcm0pTytVcCNDQzVeayVuWWE+aiNvZSokancwcGZEKUx0P28pCitUe2ZkMkJkaF9fR0NnMW04PX1neiFmNiY9QTV8XlJZPUk8Qy1ob2lia1Y2YUJPVitmbE5eT3ImVEA0dFdLKnUkN1YwY3BkS3ptKnRKN00zCitANGo4VHMpRVJxK3F6e09OTDFhSE1ldnlwfFBETiklPXpAZmJmdFkqOGd1eGtBaWZwTW1nRlZiRVc0OTg4ZVFxRm93QCktTzI0KWZYfThoCitjVndMMW99U0t3LWojPzxZKmJFPEtoWHsqQGc1akVBY2g5cDA1ZlIlZnBvIU44Q0luM2I8NmtyOCtTKFN5PHQrVGNYUTAxJiR6fmFsQENGCit+aGdqWkEzbCZHbSE1dCo+UVF4ITk1dEV4QE5aRFUzcmNgKmQ7Zk5rejdpTXRDbSNValVPMSR+REVnJDNTT1AqJWx3Y1I0fkhAI307SC1vCitYVD1PfUg2ZDBsYWpwUEEpXlJSXyZ6b19Oem9Zai03fVdiX0UlUCpYZSMxblhaTiR3Xmw2Nj9jO0lzZ2UpNSliN2FuaWtpOG5rbm5fO2U5Cis4fG4tU2olY2E/fmwwITAyUXt4UW8zUHc3fl9xZ3V2ZEB2cjdmfUFXV1Njczk3QFBPST01WWB7Xm9DaEJSWkt7ekNqSEd3PWtKRU5YLXhkCis+T2QwWFlRMSpPP1ZubE40SG1rJUZkR25zTW1uZ0RrQjgjSz1Pcj80KVN5KDA7djdxdUt3OVpjTzhrSXI3PEc4ViZ1OSVqZyV2flEoY00jCit8RDI7Y2Y5dTVGS0Q4XzExSzAqe2QtKz42Yk9qTSNAXk9kWFUtPkh8RF9jVFViaEB5YHNWdW1sYExec3BgNHUzMEhRYmxkdlckckZKcmd7CitDWlAzJXxxa3FMYChjN3lsYygoKkUyXnFwRnUlYmQtUVptNGN6OHFhZyg5KzstbUsjY003RzlgODh4TlVwZWkxNGw8WFRCU3AlPD9FaE5UCit0Mk5+YFRuaEVkaD9DZDtCOz0jO1pCcTk7YXtnTyljYFJ0ISgmciV1NWQje2B1cjN0aW57MXY1TT8rZFk9JE10JHY1ZTc5eFAwKEFTRXpoCismUl9lVFZQM1dOV2dlemVnUSo8KiRERWl+cTF8dmZrdmJzMGd7O1AtVmh1aGA2Ui1FWH0yfU0leSokcz9AMFNTKm1rT2FnWDxOOHZpPVZxCitkWHAzVUhPOGlTJkopXmpiaCZJdkV6JGkzblk1UXJ5cTdnN3Q/cS0mSSFmbShBQEdhIV9DQHc/YWk+TmNofFB7QjV1IyNyKDx8RyZ5Qkp0CitfVmVURF59KFh2UkJjWnEkQWdrR000cFktM3U8JEF5Pzd6dXk9T25sSzAtUmFjPV4pcDZUNSlQbmcyZSU5WUJ9T0BUR3lDP3d3PGNmMXhoCitFMSZ3Zn4yTSprd2FmRlZLVXdrQms1QWBhbSZvS3M4WlV5aE1lZXZuS3hSPUBjXzFGTH54YDk+YV8jYkdAemZGZlFgOHVMemhzTS0hX3khCitXMnU0WDhiVEA/V1NzX1V6fT4jTHV7KWk+Kl8qWHlmNGkkQT0rJX0lWGd8NDNee3FBQGo/VVUkP3FuU1loZXlGXyNHLTI5SnxnV0ltZUkzCit+dkpofSsqbGVBZCFRRDwqeEhReGBKd0hgWjBUa3huVjY0JDF4PGA5fmc/PExmfUZ0OClaZExDPD4yc2F0WWBAZ2dgTHZTamExSTtwV2NQCisyfEFPNTszcH54NjItUmF1KT5MYVFocHE0dVhANzQ5PHI5KXolRzBNTHk9U1hhPktwTEk8MEk7fmt7fjx+SFFTZ1JPLXVIKCY9WSVBc0hVCitmKWtFI3h7JHRqNVk0ejJ6WVJ5b1UpYWtDVjZLMmUoM0h0XjFIUExRcD80Uy1GMTF+WEZULTtyZ0t1aVp1U29RNUxjPz5IKDBIfXVRP25JCiteZFBLUmxIYWZaYztjRHJqWUhyZ3RjfGd4JShrUU4/NFZWSk8mQF8pKFF4WTQjQXNRdkZpSGFORVY1U3pJMiVXa05vfVAzMT4oUzlwanFgCitqakprJkZTV0cqMns3Y2deSjwhNFJjOzAobHo9STN8Um1VQlRQentJYE9fdEwrOzs5REpgMnFTKTNSZ3FSaSFjVUpUaUN9Zj00VnAqP3FhCityaiVvdXs/V0s0dWVlUzYxfmJDSEc/Qk00dzNGcHxtfldfKjhrRChhQz9LejFmYG5yKkAjMSt2I3xpKmRBRzU3RjJMRHFnaiEkRlh5IysmCitnJiNQO2ZWekk2TEF1SjVTaXNOZ3dWTmxvYWNMVFMyZGBqI2F+V1NxRUpGTlFvbj9SUDJDTj5vVmt9OFl6bEFfOEopTUNuUkVTbD9UPzNfCitRdTJRUVApaD5ANmFXQUsybXRleTdEdiheOTYpM1AwMDdrcTAwMUhZMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlkY3c9UjdiWkt2CitIYjFyYXNsfnpyMitBdDhrYCZhQ3doZF9xLShvMlYjOUA7ZFdXK3JKZmchVCU7VDROUGthYGgySDVCY3B+JChGJURxMis9UnlZSWRJbDs2CitQaClpcT5fMyVNTUZ2LSROcWYwODVAN1otYGZVazs1bURaWFNfVGNNOyRVSnBNPkdBKUZHTl53XnJWTSl0YEcrK3deZ0JEWntsTlJVX3duCislQmlrIXd7IVRDOzQkbVN8Rl4lVGdAZj9sNkw9WU5haUZuTkE7WHdOQElLZnNmMiFjYVM3V1J4KUVFJjI5N0ArPGdsTSEqSyVpQS1aWFM4CitldlRjT2FpTUdWKEZBS1RVOHtRaz5WX0tTfGYqYkF0PDdQTm5UUVpWNTZLNE5OcitMQTMhK1puOFIhKXFfREh1eitqbj07RUwmYHB8N2plCisrQ1F9I1N7PmM8OWt+Y3Jpcjt2azlAZkdaRm1KaSRxP3IzKHJsekZlOU1zfGBXPmxNX3UrYT9PTHFuZ3xzdmNhJTxJNTN6UlQ3N3R5X2NOCitzSUt7XyhnQ09NcUdAS3FfaVd+K1ZCPXZfPkhkdXJ9e0VyP2M5ZEA0YVEhdkE8KWc4KFJJPG56VEs5QV9AI1Nfb0IhTUdhclVfYWxaOzVBCitJVUlfXzduPiQ5JSY0bHVUel9DVz9TenxnWD5xbmVJc1ZRIVJeUjY9cSkzJHxsPjNoX35ebXJWbjwyZm05e2QjaDcwUGZ6I2ZLJV9UMWcpCit0UXNEclpqd01ZOStPMmBwSzJBcDVrTHJ5RkxvIWpHS3dvMjgqeWk/VzJ3e3thaFNpKG9nViRzTnlNazFWUlIpIXlvdWNNVyNKV3JCPSVfCitKT249dU9uNTlAJElFKDZhem1LWFMtVWctaD9RWFV6O0FzS2ljMz5EZUwjQWVuI0NVQzJyQVhObF9LSyVMcntKTVUwbDRWTDVzZmpSYnh1CitlPCNNbFFLPTBqYTFuPTtyal5NSmFBcHxAOFB1X3xSTXJ3VnRDVypyI3J3IzU0ZSkoKD8qJDhMakZYLUhPeHVycFlyaTlPPilge2Eqb3Y2Cis/eUVabkxRVipuUWZ9RChMMzcrYVE8Jmo5Z2o+Ykt0MlZvM1Y7MytHeFZuPGZPNF59IW55aE1VdDZQI2R4PWB3fUYrOFU/P3tAVjxGRUw4CisqRHFxfnpLLTJiOWBMaUcwd2IwdWw3SDtAeGNsZTkqRkltU1R4e3QrSHhJTWgoamc4TiZLdTFCTFBFWXo5YDlebGdjMm96NFBrbClKWXoyCitWJlUrVStWTjFZaDUqZmRGaFZWQnRjcWBITFd1SGIobV4ofns5QUpqRmNmemFESWJkfWNJcnB8YGpQITBrMWVITXFTY1hmPzhtMiN1cWV7CitUdEpDUXkqKU83QkFFKSV4QXxHLWFTZiE8e05KbiEyOXpfVnx5OzZIX2xqa1pTb143Jl9KbntCNzswYz1kdTAoUCloPkA2YVdBSzJtdGV5Cis3RHBGJHtrKTMtMDAxLXQwMDEyVDAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85Z1oqT2FKRV52OG1reF5eSEZjOFB6XkM9RX1YY2dgCitBNVBUVDtGYz9oT2Q9c2ckeXwlJWNiVj0ldnYzPlNrbDIrfXVLJTRlMXxLSSlaR0tUcWQ0dz1lQEVFbXcpVipjUEZqRXpQa3J0IVQrVkAqCis7aWJ1e2RJdW8mQV4hb1clOFpIPkBxYnJ2fXF1b1hoYTgtNVZBdXp+YEcobXdkdyFOOX03VCNVdDIhcjBAUGk8JSNaO1MmcVNfSXIoe1FQCitTWGt6aEZSWEw7NX1qQn0meFhWaCk4P0MqVkNmMzhvbylUQ2JucVU8dW8oKkYteEM9VTR6ZXlzZDVPT1UwOHc0fkNaVGBRPzl8VkxZUj5BCitTOEhKSUNlZHtfMVRAUHU9NSM+dyQoQnU4NV9mOXk7PzdCaEREZilsSiRqTipqb3slO1duJGhtLXZYNlNwYkFCJkFIXz5tYDt4JFQkaVNFCitPOHU9bThCTGJebExYNEZQP0JwJHIoaHxfOXk5X29zITRTU2w9IzhpX1pvS1UpVCFmMU5Rd2Y7aGlrakxpYjMxR0RrOyVBem4hUVBSQGB1CitGYj0+dDNyRD98TkkhJlg9NFJlcCRgajZkPjtsfVIhYENIenReZzVOIU5Cck5JMWA9fDByPW5ZcyVFQWxYej53VSM+ZnR2SGArZDcxYFU2CitsKTB8WFFSMDAwTzheT1k3eV4oeVc3PHskdDdfO0NPTDlzbUZVYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLdXNSV28mYVVhQ3l4PXtkCiszemttY1JTMnp9ZUZ5bUNCNmNiaHxtViU1SXZFdCN7aWJsUWBGeiVWaXs1Z2x5SW5zVT03YC1jSWp0enhNJXYwNyVOdCZkdUZ2Q2I1TiYyCitqSm8xZUZIdWMjfUFJaHM+PF42YXdnaGxlZiRKVjRoe3x2NC1hYmpfZzFQI0M3VVhmZyp4fnp8OHNDfmV3OFokbTJEdmJNJWtvIXNZRyluCisja1M1alg/LWlJaShsb2MhTHFhdyt2LU52OysrOVhMbWNGclpCO2tXeUN8UyNVWHt1ZVdvYVh1ZD9PREkpXilXSmNfbm5rNTRWan1YSyR3CitCTCNmJj03UmxfKlJATnpZPWY9clpSYjRDN0EoUUwwRXQmLXQ+SVNOKitmfiFuKHpiZUBEdFQ1YVMqcENyY2spSFBZVl49YStCUjNGKl5sCitTdlorfVF0eklxMFF4XyQrS145flkhe1dZeEBTaVEmcShvfGZeWDJCSlVFMTcxcG8obE5CeSl9aTxUdG5OWXRMeVlxcy0mJXBCRU5XP3RhCitEanA3UD5+QEQ9WnhFUU9JcWo4cS1JWHUqR3QqMFc5Uih2fkN2YnNAPyNDKD1oO1RsTlk4bGJXbX51SERpdEM9YXQ7ai1rQzEoZnE+NW9pCitLRCkoPmsxYjg0aTxlNStnWWBaRV9xdjVPJDhnVHp5NElNWGIwY29hOHgkWTFDR0pSdDxhcismWG9jWmUhc2VzbnsrRDklM1dJSSpAdCZPCitPfnYhOHchRF92JWFXO19KNWN9VUsoZXhJWHF2VkxPR19xMlVHVG9DV3g5YzQpb3VXZUoyT082RnNWen05SlJtPURBU0dQZU1rQ1hTXiQoCit5MSlpJl9MNnFoXjVrKF5gR1Ehc2FYbVNnS0w0QkVIIUJqTlc7IyVHPVVgPmw2UzNwZD5CfV8rOVI5LTZ2bHNFOFE3NVBmNHNoLUtOc3d4CisrN3UlYGtKMyR+VWUwVzRGYkAmeWJIT1BeUm0tZll2eFVsN3dMWjFoeVg/QXd5WXJyKmBKJFEkfk4+MSZEJG5UaVdNcE0qQW00Q2o8KnJXCitWYFYpMlVjcHJGQUJ1N3RSYVh3bUZid3ghe2cpMHshYEBDVCZgXks7WHtsZi1lVUxNPkJCX29KUHE7UkJJdnkhTDdMZ3Z6KXd5IXZ9bXNxCitAe3BPczVZP1pSYXo5YypuTH05ZkczcSswUWFoOG1lO1dCJC0lcHFGVjViKmUxNSlvZkJ4K0pPdzI3NzA0T2xSb3k/fWZgeTdlS0N5JCZxCis+IzhrPitNR0lWRHF4Y0pLJTIpLW4/flkjZnJ+RTg8ZmhjLWs0X3VkJmBud2I0Rl8kVzk4MztneW5PWlMhJXljNnlQJSlXZW0qO2cxd0I0CitGYz5kPH5gT0RZbWl8MFJuYz5UQTxgP0xSZTNGVkpZIX5eKjZecVlnVF5PeGBaeDw1UVJKdmJteiVHJTlWSz8jMEk9KnoqdSFLejQ9R012Citlcnc0ZHxPY15SX15uOU9MX2UrSGJ4b1NSJHYyN0RQUDhJQUB9UF5ASUopfilhWiFyPSM/amZ9KyFHIWslX2ZvP15zV0l+ZHx3MW16dW9zCitYWm9rfVo1VTxWa1JtUSUjKEQxVUREazFiP3htYEM2MSFMelVlJG9hV0tQJFF2fEN3XzkwZUY7K1hrMFI8clY1SVgobGZ+TnU+d2dWXm5RCisjMlc/cW5eJG53Rko+c2lZUThjdHBMWn1eOFNveEFZV317YjUmJikkcVVXQDtwbkN0NihpJktRQjdOaGMhcWlqSk9tQ0s5Mmx8OTx4MWw1CishWDhPQ3s0YVM/MDZTVVhAbWFUVW9WMCooMG8rezQ2MjI9WEdtJEMpaEdJfXVIVDtHPTQ0XyhZcl5palpFcjZXRzh7aUUhQENzWllDPTx7CislPWZTYmVjQztPVWVLYURpRlkqU0BpSG1BeUI1NXM9XiNMKXNHZkNYI0FHbHB9NUZ+KWJhd1EyLVF4U0p1WjhHdDxQd3hYc1FkMCkzYXhKCitiPmx7UVZTQXc8QzV2KkA0ZnlJMnJjVS1iSmM1YSYkI1phSWl7YVhsM34rUVVGe2dqK3duPzQ5eT5GPlZeMzNeT21SOS1Xbz4/MnQhJSteCitKOCFUQWJldz1lQVNCVTEyZ2krOzFIN2J5ZHBZUnZpaz1Bc0tDa3BaR2RxOGpUfjthLSZKRz14ZFQqNlc5VkowZV5kZWlRT0gqYn1xMnBXCitIUGt6UiYyKCtqSCQ+ZkNJM0RAdVVrMkJDXz4zYHkxQj1oTUA+WTxeIzRAIVBrelRfRlJKWDhIWVhLVVBrZX1hO3hRZFNaNEJJcDMoI1F5Cit7fjNWQzBpM1FlNSsxRH5KYUs2Yit4aFFsKFh4SVRBSEpmTVpkI2J0MXpKN1RGMyk2Xjk4VVpiLUQ0QHY+QUd1KDdyMXlEMGpDOXtxPUl8CittRDdKNFlaeC01MkBFQyRFOCk1e3c4TmRCTGFUPz1sYGZhJmZIfHw8UDBmN2Z6bE5OWk9jYCQhTCFNUjlfe2ozRytfd3A3VDNLPmdVXnRtCisyJG05IVktWn0ocytOOCZ8UU14YkcpTloycVBtfHd8XnBRZnYzSUtiUTYkRG41bVk7IyM1byExcD8jdXo4VjVxLXdNZkBHWWo/Tz1VNF98CitDeiNge31tJlBSMThneU0qbkVGPHp6amtmKzVRaTtLb3Q7MXt6JGs3JHQ5P2p9cXlLditIfGopYj05c2oyKTdyKkBVfGFZVEV7LSpjM0h4CitTZjlLKWxnfH5mLSFOQkRZMkFMdG1fVWlCPHpCaSYmQkVSY0NFcEpTKTtiTz5zOGFhPypLZ0IyVmx4ODgzR2JBfDk7MFFGV0IhcSs7THEoCitMKkc4ZD43bDtSWl9DVHRnRl9yWGJgM3VLaz1BdjNKQX0/UEZgUE5UejBYOCM7ey1MUUk1LUxROHRQbShOUV9JRlUkY0NoUXx+KGp4Rng3CitMVnYtR01IRDZ4Xmw2c3dOKHJkP1c2MGd7MHV4TV8jKDYjWktfZktaTWNCWU8zYn1DIzV1IzhkOU94IXsxRUI8e0BwJUx+WWBubT16RmpOCitne2M/bT1oOTJPbTdXRlNxMit5TnhPMWVFdishZHRTfkspOVA7QWJfd3s2Nih6YWYlI28yJG0kfTArYTI7UGEtNFY/Z3hibmc0bDQoeWJkCishVldyMilmY2lObWtkVkk7bTFGX3BRRCNpdmFpZEZuYjlsanAjJShiNWt7dnp6QmYwe099ODkzZiZARks2SlJRbVBNOWVyXmFQdjl2Mmg0CitfMWQkOSt8SVJCa21pfT0kR3U9MytaZ3h3d0FsUllMJkIqZk48SksrdmduLW1sQ0xmO19PZj5xP3lYayphN3pBUmYtJikjb0NBaylyMk4pCitBME0/dUtUM2ROaHFgaDY0KXheeGI0WEBUOD5XZWNYQ1VzSzEmdHQ+QEgyRUkpVzw4fUZHelZhPk5zMks5XiFsYiVoUlJ5VlFZMnExOFRFCitQaDNNUihVWVhqU1pAREQxNVEyaUlPQ2FafmUwN0MtaChkfTZGYiNSST5ZYzFMezJBJTNmXzM+QnlTNGE+QHFNXz56PVc2P3pYKldMeWhfCitjfld+QSlgT180dS1aSGZvR3Vzallye0FPNj9qT3JPM3ppVlg/cGpnJT1LJWlFczQtcS1wdFRRajVJVUohQmtmMFpEdE97fHEpX1M9Zjc/Cis1UHQ+OFQocUx+NkdaRmE9UCg4c04pZlRjaiU9Qmp9WnkoZkBTVj9pXlVlaih2Zj0lUUJ5ZDJiVm8zQSEtb3lqLWkycjVjZT5ISyluWUF7CitsR0pVZmRnUEJXbWRxK00xMlM7YVowQXJNMzdlRWI8KThGZjl6VTNye2NlK0hCUTY/QWNBRio5aWAxU21va1ZpMld2czRfYWE/Z2IxbVQ8CitJMkVqYDFkWTJAPjd9JHMwRGhtJSUhejtjXnJgWDhuc3x7QDE0U1VAWSNfLVQlOyt5SyZtLVdXUzUzMj5KJCM1aUY3aCZ8PmRTfGh2YXg8CitKNEkkQnxFakghaColQldDLWx3TXI9NVRqTEBGRmtzWDBjI2FYJkRFZnM1dlQkVF9HSCVwdjAmSmVrbD10UCkyJShVJklzPjZlMGx4TVNBCitQUHA+WSN9R05mdU1uIz8rTzNwTlchd31qa21uX0pwY01WbStGSHFScFFDUTI1ZllnWiNvKjN+XntscmFhbkZATih+USZFVTU9PHdVYCp1CitpfUZ5NkQwSE9TWF54PlVINVZBMlp6YDlPdl9mcGVVYmgtLSNkUzxWNkJ3JE1XXmU1O0EoSk5kaDglMH1ZMm55ZjJHTXc0bi0kLXshOUVNCit2WE5PcDl7eEpWPUxLJWpSN2ApKGlXajEpfk1RU2tHfjY0ckZZcmVPe3lUcSRpOTJPIXRPKFdaS3xhMz1iVlZ3dVB8KDlabTlVY0llQm5JCitZa2wkQF5jbTBmX3g5KzFyOU0zK296NmomcXg2YHctO1dQcU0yQDFrPldqb00zeCt4XilkcXV4ZkRtQkNkUns8RVAyIyRQJjxZQTVJQXBXCis2b1hIfigmMGRgS198Xno9OG5mfCFqb349JXtgKVBNYCpafjAqQWdHSEI7ZU4oYD48NXQqSik8dWtiKy1OZTlPeztVdVBKWU9BKjFVaD8jCitXPHY4JGJnYmd7S01UIXs2ZDtMQH5qP1F8TCpNaERwfnhvSH47QF9oa351JElGVSl0TD5iZFoxOTNwSHBEMFdiPDs2a0BTJVpJais/R01WCis2U0kwR2NDM0hEISpgS1pqO1ZsfT9vTm8zdn4oVik9aDBlWXlYYU5ucX0oK0BhcX5JJT1eQ1RQMkVZV0RFMTE0dCRHYHJ6YTxfSTNKZWg0CittVVdgc3hzakchZjNZUFIrelJ2S2xVNiYyOF5ScGQmKil7MXo/elNoY0pBX2lYaUg8OUNZdEV5YnBwUitlQHFBRW04NU9ee319QGJLK1ZKCit4VEM/UUJEKVQoSXxwMzRNazckfjtsZ0lDQ3twQGxBZE1Dc1J9VTl2QEwqS3hKSkMhSD8/VFhoRyoySUdCaHF8T1c9dVY4dWhhNTs/UVQlCiszR29NYm9eUnpsZ29BYjR9TEc4X2FUckpMJmsoLTY0JTt7NldOYjxUUEpNd35IYERNUE5uMk5ERGQ+OyZSWkB0Tzk9LTd6VSE4UkNuci1UCiskPClrcklpciYjfFNYezhZbT56XmE3a1JFZ2hMYFMzJDlWM2txeSlucmZLPl9aTG8/bG1WMnIjRzJYPX4jIXoqVUo2Z1ZsO2BBTHxnS29MCisoZHA8X0l8JjZNQ0clVWBteUVMeldxSXlzN0dJYnA1QVZmYXA9T2ZnbCozUlg5akxlfFVjYEYwMF9BO204VHVkd1RxOyNgS2k3JFY4ZkQrCitMMVBiYilzcWRmQVIlZFJnVyMtcDxRN0hTX3RlZW95WVB7MmMlUVlKa2hYNnI9c0lfRjdyIWgzS1QpYGMlbD1uVlpHakNCM3FZRGc/VihiCiskSCZ+TVlrcCpUbFJHPWpSNX1oYnBxbSk5MSpncEFHa2NDVEE3OTYoPEVmZl4/RjU0elR8WE1pQF97KHRsNkplNV4jR0ghJHYxUyRFSEFqCislRCR1ey1FJio4a3ZsWTRQeXV7Q3xiU0hKdFFYdV9HKVJhPjhiR20oaGtyOG1jbVFPN2whOzJ5PlZaU0lHcipxKlIwdklAeXJBYCVmSTtWCis7cTl3WjYjYSNnZSQzKDc4alhWU3NZKnQ+fEZZI1puZnIrc0AxaCRfWTc8ZysmYFJGNCM+TnRlS2QrWTN5UWR3NEMmNjBsbD5DaWpuck0jCitwKSQxenojK156YHUpY2g/KmJGUUlvUmBlKkd3SCZYV2ArTHJ7TnlEKEJIfEF6O3xCcylHWDcoKD5abz1rVyUxMiRGT3ZoI3tJbWlna0VWCit6SzJocl93USMxWEs3TEc/N2kzN2ZyUkNJLXIpdyNne0BoRTZYc2A4WitPN2xkVmJXP2g8Q1Bwcms/TDBkPkh6OCUmOUp1Ynp2P3xNdWl0CisqYXVXfjlSeDxSMnlKcClGeHFLSV9LMndobFpvUkFXKGR9ZUxKMWpASzBEfSo/O0ZfbztiWk9NPWUta3ApVkt2fiFSa3YyS1BafDM9NmdBCitHK3hLQDk+UjNCS1JlPHN9MHFUQGBQQnt3PDxYQGQkWnFRPHdjTH16IUMrRD4xeVBwP312PnFtZlArWC07ZHlPQitCJnshJUEwWihKQ3J4CitqdHgwZ2QzQThLR2tDJT5LaU9hMSF7X3ppYllaOVlYSjRuMFVpcFRvRFp6RGw9QisqVTJ7d0dgSEBFc3goJGUqZT45ZzVLUzwqYEt+K3VeCitsOT9AfWJoX1d6dF9RcVc9eXxjPzxvanJkNDckeVQoSGhwVyNWKjE3cz8wUWExUWZYbT1+bFVjNyMwbHdzYGVne3ltMUxMPCFTaFloQ1pTCisoISRZRmtCemYhdmBrSnA7JDxgdjxSMVVnKCl2M29GUUlpa3pVOW1pTS1XMzJqPFMyUDdQeWd1TD47JCpjX2VoTEtDNncxUWslR3krVVpHCitNdjtlbXNgalUreUw+JHQoVndGYihBU0kkN1h9YGhRMyR7bHo5dEBydC1RdGpmTj5jPHdVcW1WRVlFSlJOPHM+YFUlc2JodUtUaUUlKm5eCit4aGtqNi1ZZiZvR0ZKVEpCOT1OPmhGfVFYb18/SXQkJWx2MjxzPnpYc0E3MjFiXlJ7Ny1DTnF8UGVnUk8hRGFZVkNvWWVmPGdXZXNZYTwjCitDfFBTejlzPGstKl8hcE9HbSk3JC1sbHdObksoTzJxVXpmej1zWXQoZUd7M1E9M0xLcncqdVEyYn54bDBndD5HfDxUTHlMeFhjKDIoITRKCis2UX5Obm42PTs8QmVLOGVAPFpNcT83Kk9JYkFmZXdhNjQ7KkA9ey01Q3I2Y1hRJm5Da3Yze1BBRDYjbEByIXk9bjRpRVB9cDVoIUZjdWVDCit8TEtIejxANElfQVRTNFhYVn55XmdFfmBHbGc9bEohQW8rekxLa0o2T0JQbjNFblJ1PU9TS0khRiZZIyV+NC01dF9vYWtEKGJkYFE5d2h4Cit5bitHe3hQYGdAOzJFPUVTdlBxWnAqanJHeCZ0KWkkTyRyOHl0K2JgbXlKIXRhPGBqODVUb2A+MDVkfC1zdHh5dCpmYTg0PnNmWDg1QEwyCitJYm1PVDctPnBHR1JUU3xAVWp+bVFUS2lzYEFjYXBTZz9Dd3VvSV5HaEktdn1tVE1sVmBhO0RTTTB4WCpCLTVrISk0clA5UDQqMWE1aylGCitZbl5OWTRJLS1tOSZPLTY/ND9TQDZyWXpWUGtqPE01YUFaWlVqdGI3M2RvTldMTiRYRTFUc1d7PmJSNUMtYnh6P2dOZFdFOFQoPkNQYiM8CitkbyRmPllwV0N3ZiU5Z3VPWU8/d1MxPD5EeWgkS1QqJTw2UmdMJVo0QClXYCFIYzI+XlZrYCowTWV9a3FDa3V0QHhIJXcxPWV9aUp2aTU7CisrUyRKYVEhLUFMTThWXmFva1YpbnVKb1VwWURCKzZgRUt1WmozcGY8N3UrNDZKX1hUJHpaMkR2WT02ZXl2TG1oX3BeYHYrYFoleEM/M1E0CitlMCswcmI0PHg2SGQjTjVlOXtiQHBiVSZAaT8lREU8UmtHYyVnbXQxRyQ+LUcwYjQ/JHFHfVJlJD8yJUckd1RWIXJpQHpfTT1ycH4mJXhgCis3WG05NGQofUlrS0RCNGRoXmczdypBT343YzFPXy1AVk12Jm14czFuYkhqe0x1cWBaek13Mz91JWt3cD1iMGFoajBCfGUjbyhAQjNyPyNsCishUzVSTVFCY1Fte2FQSiU+MFRLXn5+RG0tQDFHIVgzSUshKkM0QHZkTSh1NTtKeXpLIXp6YDEwOGN1I0s1Z0prUlQ7WX5wYUppOD1kJlMmCitlKDw3bzl8WFZqdmVqbFluKlAmIWd5bVNgYjs1THN9NSZHQE0yU2xOfnJScGt7dz1ZN0VuMj5OcS1+YlQkQG4pPjx7NTRWWT4ke2YkSndsCit9PiU9VUUrMUY2fW53P2JLNFcpbSQkTGBLNTt6UjtULWxFbVcoXm5GTClvM3ZLWmlTYXszWUh2OEJjRjNWMTlzK0ktYV53Ynh1ditxPkV4CitLY0U0Nj81aWxNOH01TClmMCVgckh3diV5bVV0IUhfZVdePTAwJFVDTkZUTyUhPURIWExEaDFOJCo7NmkxYnpAQzNtdipyemdRJEtmcng4CitjKGlgTlIjNEY5OUVENGB2QDZFJDQheUN9e1AwV2k0Kz1MdE1NY2Rwc3lqTXd+QjsoIVkjOW1nN3czM2UrbFVWQSZATiNLX3psT3BzOTNJCitGN05MdXZqYj1TQlBAdURVN3gtRSRtRUtCOD1jcnBDU2dwQDVYYTtXUk9ONDMxUHhlUDN+KGdObDVFdkU+cERmI3l9UV5Id0ZYRUxORWQzCitYXlAkRFpOcU80P2phVX1ralIpTHFPTVhLZl9uUyRQWEFfKEVZdCRAaDc+U09LaGp4ZVRAdGE3b0xnTkNvZn5VPiQmWEE9aGlWUXIodUlQCitWcFdkR1YoakdyYGBpZndXUkNldXJecVpNOSs1NSleKk9iJCZfKDYjcz5Ve2M8LVgwWS1RPzR0ayslLT8/czkoUXRLRlcmaHIkUz52PzU8CitVfk1ZK1RzIU9ZQT8lTSpJbD1AeFh7RSNJS2ozfCFwczRtZVAteWg3IV5UO0JVV2BpVDM/ZUR3b2pyUiZrc14pU2V7MGdhd01iMShublVoCit9amRmczZvS3JlRFR+YzVSOU8pa0BxMU5zZW0yYzJMKyR3czhmWVVWNVZzdD5jblQoWG1lJXlzN088PENMIWE7R2JfdShCVzkkQnlUZXU7CitgMmVMNWszO3Z+KjwyOUFHY0w/PV5xPX1KMEgkMHFEXzJ+I0A3LTk4NHhgRz1ldjY1JGNpVUQwYzxTKXJHcVkhQSQwZmw4b1NFSERBcHR8Cis+Qz9JcUZSRyRheTVmRSFPbnE3SihmMFRJODU2YkwkcUZCeStiNjcjdztZb0R6S2l5cEJiPjF3ISlzKFpZMW1yQE9QNU5OYkRAUXVYbWxaCiswaihtKVpoWHojTWQ3Tll3OyZOVHc8R2JiVDw9YyhCQEtOSGhEJmptcDJHaERCaGQqZ2ohSWlsRkxNVmJNZyg2LXw1TG9rZE5iUksrbmVqCitXMSNRc0lQYVdpOylSI35XNjl+cUZoPmdkek1ATmo+NHJRaiVjYlFSI15BQzBefnRiczlqdGRIMio2PCVWNmBVc1kxTFAyIWI0fEVubW9wCis2cnEmKSRwcVZvbS1eVWE8KW1lT2clKTNKfjM+TVJjPnVpVDJBPihBSGlIQ3A+aWwpNj4qNjl0K142emI0bzZOKUlsQVNrblhCPXVUXm17CiswIWNlbGRmR3cwPz8wS2chWmQ0QE13a3g2cTVpdnBpYCEkK3JJNl9uPUhKPXhecDFaRmd9LUxHPVkrZF5nQTFkWkhYOSM1Y2lWVkk0PChLCisjSChObDxqQkpmJDF3bHVRNyYrdmc/I1k0Mz4pejxwK0trbCV4dWFzMWx0UFRDUE80WHZkWitfMjdKOSR+VGp0SjR1PW5ZbSF2RWhYcUJsCis7JWVoIVllXzExPHFQNFJnclBaQSR7OW14RFlfJnA3cipYRE9BdFBlK21VKCRwSTloR1EoYF91MHd3SzhpP1QpMkojUV91cGhxcCtoTXJ2CiszfStDIy1sZGYxPTJEOHk0JilTQiU9SFVrPyQ9YmpZdj1taXBMN0ZycUBCYiEhaH5rT1p+fmVlRE5EKnNHenEmSlVvTTFIQ3c4V0ZvI1R5CitpeV93eXlxLU8jVWF3ZHg9Xl5ZVlNCSitAcXhpQ2JwM1plRl5UQkN1YCNQRlV7OEJReXREWThsX0hLZHlmRTRsMHtFcHY1K3RISWNnUyhQCisjMyNoSklWb1dgejYxO3RidihxSXVXd31KJmhoWlZoNkJTbHlSQTdxLT8tdFpiPUd1UUk9cm04X0xzeE1vTHdnbUBKQDVTNmM7ZyhvVCN3CitZISl7OSo7NEdFUFgoQEhNZy1LTjMrN3ZsQGRebXZDN2NnUHd+Yk9iK0F+MztwYURZRllKZGdTK3NaISs7UG0yN2pzWCVhY3s/PU5Ien1ZCitsPFFIMyMxMVZiV2dLaFR6WGlENTIkeSNOJC12QDlVWlRFajhtaSskO2lRYHtXNFRXOXZ8UEFMNlFrN3R0LSowV1ZWQD9uVyVnJFBVJCU9CisqTnJwfmtmU0NoOTJjKDVvdSQqeTMtKWpHKWlxZz5ucXl+YGVvcTNfMz1+aVkhe0RNR1Z4eV8+QTZeTU0wSVchKD41REc4bjJkSG01N1dfCitASmE4OVBSckpBdVFmI2l+SHVgR3I0Q2dqbUkmaFhxe0whMWdNVl9eelhGYEtrKlh+ZWRSc0tXUCkmSjZIOTliSX1pdV81TzhwSWJ8b2RZCithJT04NmV4anR4Yj9eQGhmZVBNP14hdXpIVjs9e3dXVDQyRXdqUSFFUV87eEJsfmFXNWNlcEJ+KEU4I3lTWFRnQFhBJWF3aD1aMig4emVlCitBcTUoVXtsVyRmQlNLZyVSZGYxdEE1SWJCKnlkU2FgJkRibSRpaVUtd2whNXJkZVJwPE8jJD5LaHh0SGRSJlpxQEFCeUk/YH1wTjgtcStlCitOaDtNQVpnYUs3QCgyPT1IQlNgVkZwZ2AhTWw2bzMoYjJpJU5Qbn5admpfVmwmVk4tNWt2ZVJUMiQ7ajhROUljcGE5PFIra0tQS200a01VCituTX0+WEQ3UW5hTXR3JU42UTxxTmBvdktLQVF7OURGb05FQmZvfj1hRUxPS2o7R2U7LTVpKm1Ib3JVWmV3Qjc7Sy1jWEUoRT4hKnhJZSM/CitPST1wJCVhISUqTnBaIV4qOWh+R2lAZX53dGtfenopPmkmK3MhfXNXb3djeyo7I1FjPFpLaXlTJXJieG99PHUmXnIhUGNvamFvZUVzM0A2CitDfkRuUHlJVyZ3JjhESiEldGYkUCQkbU1HaUpnKFFXUz99WChieVJZIXZJYTVrQWNiRyhiZGJOTTdsPUtXYG9mb2BBSUBBcFNDRW55bD1ACitASmdKRkdKT1pZakM0LTIzcGhfMVFZV0pQd0p0dnE1QmdhZnNWeCtGNDlfKTJffig/JFZzenFwKn1rKGM3JUVIQTlgdEJgbDs3PDJWbEdlCisyKVg7PVNhTmdfPVRZTzEofkojdkRzZVJLPit4e1VjNm9BJGJ0fTBuMWJTdEp9cUA+bDwpJj07fVBScWUzT0wlX3U2UmI7SnNgK2tnYVB6CitvSEhAPkt5NTdoVlJRfUxjfiRwciY7dXtyP2cxVVgoUiZ+Rz9wd0piWGJzbFNTUSpeeTJEbTcyOW07JWdlSkIweDJFYHchNWNnPCFWIVkkCis/Wm99eVhwPkRmSigtWkowUW5UQGB6V2BZTU9+O1EqNm4lWVMkUVJlQzFBNj9DbU1DN185ODxSeTJHKi0kQENtdHJNfmZYVDxfTWtBWkdyCitKTyF5NDVGdVVYSXZsIyFGaHc2TEhoVVBONXpNc3hTTTtjI0x1IWFKUnMtI05EWkpEJVZLQXh4enwqZkBnQlpIRXJCaGdQMmYySDlxMnRvCis7dSNHeGdZYk1fKm9jZ0lafT08WWdCYj58fGxedlRqY0BhPk17azwkUXgrMjY2YFA1Ul9CV2I4dkpOYU99Zy0hWlg7MDBVPiYpQGElU0p6CitZeSZTJmtrdXhmK3RQUnY+KE80JntUdFJpZFhZTmdyQDYybkFrNXs/YmBgR1A8Pyp5PV9TckMzXjBHUTBzZEZfcjQzQ19YN3MoOFhvZC15CisjJE9NeTF8bStxKFJ+bV5LPEUmfGp0UmVJWUA2UkZzY1FmTDZYaWcxOVd8eEkwe3JkY0B1TkBsamhFcS1Rezd4YyNWLVM/PDkyX2pTRil8CitQQHFII2R3eSpkaG5uSSRjPVEreHU+Xk5xQFNtfllySk5Kd0c+MUphSnhVMWF1VVpHKDNuZVJmSjshSF4pPjstfVM7RWpwK2d9SCgjaShNCit1aEJ0aV5vSik9eD1wQTNLM21kR1NuTTJ3MlE9LWc0QUliNUdSQHdeKX0pcGFVPmIqVChJVX08TFBnXmNGbldPI3lNbX1AWXtaIz0mKj5gCit2UGVQeCNJM0s3OzUjaWF3I2RNQlU5XyVzb3xgITQoX34qN2xTRyk5T2ZNYlpAVmV7MEtsVDN5RTU+Q0p3RURlTWM2NXEjY1dWdWExbTl0Cit2R3dLQTZmUGRLNG8jMHcpbkNlIVF4flQpNjh8U20/QDUoNHZmTmw7bkMweCk7Q3Nja2pOU3RJeCVaMXtNV3owVjQtJmBqbHA3cEVTSzdQCitUYHMtNjhwbSE0ZWZgY3NNMm9sSCg2aHNBLUtlVU5WM2shSXM8IWFWJVBlcFooMHpxYUBkRCVOd354THgwaD5aTDBFXng9TCpKRykoSjBvCit9cT9naXR8Sll1O3llX0w3KnRTYilsZERwVTlwSWdFU30pNG0jI3pqaWZDdUkjJUpiIzJ3biR0cShKdWdkUl9DQk5RMVQ1JDJWNkl7NlZWCit1dng8XjJpeDh4ZkBfIU9wY3ZyYz1PTDJ6MX5zR0p3Mj4pJWd3K3pvQHlIQjVrdntRR09LJW5LNWpSP3MlcEZ9cDVNSW49YD5KcTg/LW1fCitKckgtSlMhK2V9UmttbjZhQDVIPUtVYkFISyk4SkE1aGFaQkRFYi1FRmYoX00reGRFeT4zMy13S1I+cztjWER0TTNIWj5qSU5kdFVNRD1MCisme28wQSZ7QnA5PWxfZnZiPzBmVz97MkJUcnkqTC1DeCljXz8qJkswPCp6R1ItPVdIZ0JwbSVOY3EwX0lfZ2MhUFQ2R1ViUTI0PVlBPllzCis2Pj5IfUdoWkohdWFmOEM4X2okMS1vdGlKPVhWKCp2T3I5bSpYc1UqMmlHQHJfamNIKTRwXyM8JDJ5PDlpQCZXTSpZe01YanlnPENLaT5ECitCNUJeaWJwTlRoZyZwSXReQitsanEmfGx9RSVMUT15NSZkZjlTaTdncjtAUEJfZGFnaDVHPD9NdnVNMmdYMThnQT9lfGBWdkhTeGw0ekNICithVDZtY2Z3Vi1FQnYrITx6OG42KFIpMGt7dzZ1YTJLZyNXQW9ecG84UGJyd049YkpqdDI+YiVxdyRoMko0I0M4MCgybHc/b2AoNSEhS28jCitxOEhZY3l+VG5eQEE/UDtmMnIwWS1BOFkwcyE7eSNjaDg5QWVDZEMmP0pJQGMtdEhrSEFwdGNGQjYmbG8pa3lYLWUjTis4ZlE+QX51NmU5CitKKEJIfExCez1qKVE0PDxSa0c1eklsJEBNWldCbkYjUHNBKmM7QVJ5XnlQdkdEJVArIVBVeztqKTIyZ3s4aEM5bk1mflZKdnFMfWBTMUwhCis5OUpvRDF0aEZwVUtRa3RBQWFIYSRqMF97JTBaVEFzNjFVVFhxMyhwcE9lNzlQbXQ8QyF+QGBWNEBTVkQ2SnEjdmNUNjEmYDlpb0dOTUo3CitKTS0oWGY2SGZhQWFyOCVVWURHXndRRW55bTd8XlZrWWp7Vzg9NXpMd3t9R0JXTi0tVVd0fHtybkNSMDw7bFp5aXZILXBPJElYaEpQZjFwCithZ0EyYj1YPiNudDM3dj9ZRz1VVSNmRFM2RnYySzZeMHl9VD5KeXVMbkY3YXlWUEMqOE5sIUpXJmt5PlE+YU1xbT9WcDRUIU4zcE5WNEIrCitPSFVYfC16V1NfWX1WX307O1Nxez9FV2tXV1BaLVNUZnZQUT5AfnpHP0ttX2Bed0g4fSZoYnJOcnxoTS1qcWpSX0doWUErKUtSenZFdHMjCit3I1IkN0BmaGxfbk5fYks1aFRwNDNMO1NwaEYlX2l8cDhNSkdKQ0xjbD5pP3Y9QH5jZE59ZU84JkUyK3BzWn01KF5nZVFCSG9+KClIckBCCitsZXk4VXlQVTwyVHxpTzdodGlSd257KyokdWoyanJqK0tlTFVaIzJKJG9Ce01zP3wpcVhaYzhoQS1ibXYlK3kkWlVEa1llPV9Qc0tFXld8CishVj1wK1o4Nyg8e2gzfiVzUCloPkA2YVdBSzJtdGV5N0RzKFN7d1J0WDAwNnBQMDAxQlcwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPCis5cldwaV9CWipGcmdhQ3otSz9RK3tWbEs9Ry0qaCFAJTx6KDhLbmNCXiU7I18kZyYlfUhBSUB7VTF5PStSTk5YWCl0QX5naFFNPkNhc21WCisxX2F2ZzsyMzFWQm8wYzRxNlVaZFg1U2kzQSF6ZXxNdlMyamJ3LWZrP19VRTNUKWFzaDA7JkBYMjhDKW1MOClEKjAwKlJqbmM9bUNETHVACitMJDFhRnR9UH1PMDNKWSQpKHMtPCF6UXFDMVA+TzlZbmVLUTZ7eWhPUjxpTl8qI20lTlgxNTBEcFIja3ZhVnJSWHJFTjJRZyUyb08zTHlrCitsV0hSM3Jkfn1EQEpJTUxqKEEkeGRRKD1sREFpekRtMX4lTXAySHc4b0QleGd0OVl7ayRveEt5WWd1UCZYPG5NJjFBWk9oODBPdDw1dndlCitqO2lIK1ZFOFFYfipQRk9EWkZxOGR3d1E9RlJWcGkpS0ZeWVJCQVAxeXZDSW5rdldZN3RaRXNxUD17XzA9YDAmRlk8NyRTRFcrXzNDQUx9CitZaz5ZNDVfdElIWCpuMX5DRm17V1RHTXxgeEYpd01KWSQ5ZzI3Z1VzemZ5NE9VIXR0OEF4cnVNPH12K3F5ZHl9WClUb0lPOWtJNkorWHkqCit6KClleC1xfDBIJWVKJTRPVy1eXjZgKU00Qmw7TTYjbWF4X3doOz9VKnAqOEBaamAjYCFHSWEzfjh2IygqalMwV0ZIUyZUYnsqKlV+N0c5Cit9fklwWHZsY0ZEJDdAS3ZBdkxLUnNvUiN6PEJ9Q3YtQzFxJCNweXRyPm15OGs/QzIlSmJZR0ZDN3xjREVOV1RRJiF6TCFVfStPNEheN1EyCisweStUfHpsbWwmOUNSVFE9JH4pakRWWlgkSTRoKUsyYmclMSlKQGdXXmZYclR5aWxARzg3PlheIUUjcGBaKSNZJVk1TDtvPmdAP1g4fXduCisybXlNIU8pXmdUViorZzgrZE0xbjh0U1hDezc2cEQtJGh1LT9vZH5ybW4+P0tAd3dxV2YrbCt1PVF7cmYxSENYanZKZ2BmTj5xWT9yKHNuCitXUVY9I0NpbVNxS09tVCFAV3U+NGY0Zll+UTdIfkRjPkQqWVE8aTNPbmFGME45K2w5RGE1SmdjfDtUeG9kal42S1IzZEAhKVRQZnQhP29YCitzeEp8TU5eN2leb1N0TX14cnQyRypSZWI7VV5RMj1nMSgmNj1pdGZUQT1AYT1ebHxCYzlfYXAjcyRoeyhtazN8NyV6akQ0emA9WWcxKlE2CitedXJySE8xbEBOTGglPU5LR0J6O0pkNTxaNUFnPColWkw8REBwSkdCWUJvJlI7TE5qZWYwYC1oVjZ9dDRfZXk+UylxVEBeZG9WOzZmdUZhCis0TiNCYlYmSFhMWjcwfSNFQUZ5OTdZb1QpMGY7M0s3c3d6UWc/O0FqO14lZ35eZCh6e244RT5HbXhXfStGdys1MytYYjY7d3R3KF5YYThVCit2PypCbDFOMVRhKGluOHtXQ1BwJjRqPk42M3ZnTE1jaFFuNFAzITVJbzhpOFNwTTI8UkMqQlhDfWM7M35pISNrIUVicnwwZDVzWXw/Z2t5CispX011R01WWEVgNENLIX08UjhsK0MmVX51VEdAcHZLRTwqZ0xaU1RUISVZRGNDKUJhOEhpczJ5X2Y9dz4yciRILXtgdXFkbkxUOCozKTFICitOeSYxalBAP1paUEJiSHlgJChWeCZqKUNsSVZ6azhnKVhUSTB9cWtzQU1nQ3I9JWFKK2U1YCoyJHBUOG1vSUtnMH4/MXF+aSMjNXtuWD8wCitxY21NJn15aUhwaGk0RkBfS09JVT9yNDc3R0I2Q1pqPTt2dDUjKzNNOHhzMl8rPCNqVmd1JHk0eVdTJWhmZm8kSUF+YjBzQUxRK0ZXc1I4CisqZE1UWWA4TSg8PjxGXjkpSiEhMmAxVzJ6cGN6Syh4TVE1aGB3dSZyb2NlVFJ5KSVVTzsre2l6KTlPO1ZxdVcxNlBULU9PZUs4MCMtb2ROCit2Vl4pbVY9aFNwWW1WcFZESVhFMVphVXd1NF5DY1FHd1pYcVghQnttPVYxNHwzb0dZKyE9cEJ8I2VUPDhxYyslajFTWXNWdVJTazRYV1RrCityO2VedmlfXmhvO3ZHcWpQeyRgTHl0RG1vZnFYSGVOK1hoY1R2NGJnK290fGo7I2FTZk8rbSRyZTV0WD9PMmYjQENDVW5fTDJrcSkzTVpsCit2NEBeZUp6IUpIOUVhWlFKb35tNFZ4aVhveGFwKGN7YmlNbXZ1KU8mdElZLUB2S2VZKTlqUHVXRll0bTFwODsrQ2tYXkBzNn5kbkYweHhLCitSSFhCc004eGVNV0N1PmsmYlkoPDQlaTAtcCV5N05xT1M7Wll4QC1uWmRFYDxTKE1HdyV6JHQmeEN6U1RuJWBIcykyfD9tQnxmZ1VSNFMoCit7WWhNKVdkQE96OzEycCRofX5OO3kxJXl5VU96WSh6PS1VLT93Q14qLSRsVD09X3RqJTchVkw3WDU/UC05MUNSclhkUW9TPClIXzdvUGpiCis2byR0fWA0QXZvMmE2QkY9aGhqdFZ1bUBAfEpYJFdvNEVhNFUoU2x1V2F2c15NIVdXeWUlellNTTxtY2RWaDcxUjtFVV9iIW1FKCl8IUBOCit2bDFVdmxUSEM9PDdSSG1BRmBBMGF0N3I+TXg0bV5MSCtGYj8+OHozK1M4JlpKWWtXK0Ute2klNVQ8bWRAI0E4eiZTSUsocWQzfDtIMFJ0CitSQTxKVWtyc1A+X058NUctRFhpNWlLO0YqZk5rRmdGfU5STVVxRmFYeFkmTF85fXxLMEJEZExRaip8ejtPYUhZRl4lZjxDcCtOcVI3V01nCitMVVdCbkdSMmQ4PUBKMi15d0EjaTB8VkIwfDY5I2tQMz9XTGB4dUhXNU82VFU1P1glZDJJPjVmQjU+RiQ1OC17eX5OPW0xUUBIc3g7I1grCistYypTazNpUioqN09JaXFzOylRRiFeNTsoTCZ6NEBkRD9BMTRnakEqKDJ7MntoJkVDUyROJVBecFp0Q3o/ail1dkZiKUo7ak4oTk1pbnRFCit4anNBPHExO2t7cSFZOzhia3VnVkxYKl9Xd0o7SmctSVM4RU9FPzhtRCFDdClgYWk9aSs/b3QtOzVkKjgzd0V7eUd4a1Nna1pZM1VsJjgjCitNbzReZCZQMzFEcz03bDFwZjVKPjV4X35BQGBjaWNPfT9wa1JPMTdlb28pWlN8I0E0RVRwa1BTNlUpU3l7WmwqeEotbURUbShzJFM9WilpCitPYT1kIVNnOTR9S3FnOCt7dXRpSypwOyVJTjElbHBLTFZuM1dXT2c+aUBaWHZHOFQ5bGtnX2RFVGM3dFpvfHFhQ1M4ZVhhQnFlSX5gTX4zCis0VVVFciFiazJtWTc7bW4rJF9paDtDOHt6RXZwM0FiP3Aja3RfT0kteUQ2ZFNrMXlIcy1KR1hZZ3xJNG4tY05Ed1M0SlBLdyp8ZUk+RiYkCitAJUdLLTY/JkhKS0JnNFJ2SC0+fipUO0krejt6c088RStFd2tzSDNxZXZUXiRmZmpOVi0pMTE7Mm8mUy1tfnN7bmU0SCFRTmImZCZOOGYoCitJc3hpcCZSdDt+NElPaXsxYiUjTjE8OTtpSSUmTEd9dUteUnkwI2xFTkh4Z2BSeXtjcVp8OW9nLWxmdypHcjRBbi1KP1N1UFhIfUA1MDErCitjejhVJGFQdlZ5M15pc25Rd3grfUNqPjxSLTZ3YTBTc1FXbj9zM04+KGRwPDJDbjBwSkoyJTNWRilodX1YOUl4c3FZN2lFZjA5bEczcFlZCitudGRTTGohdF95MklWJmczeFo4dSVDNSFUVlJhQzRhNVkqZWV5JWBpJTN2ei0zIXV2Y3c5X1AwN2gyNklsdUU4YC0zQjA3dkpOekBhdHFTCit0UHpRMGpWNTwpbT1BZWd+MzlDYyEyQWshQj5OZzBHM1R5SFFHfXYhQ1MhS2s4JXhRNTwkdmpGfDVVd1FWdEYxPDFgOVQoVS0qQGIrQTlQCitTJCt6Xmo2WFp4RkZ2TjEkKHhYVXV6QiNrVUcpUDRWZlQhQkpsOTImMFVsX3BmVk1DbyFyS0RnRi0xej1PeUVGcTA0Uj0pYEooUDdFODd7CitrLVFuPHtjenRvYG97aygzMT1EPjRmb1lYI2YyRkxsPiNUQCMlTmxgbXtabyUqNDF6WGxXMHM7WTI8d1NPZShKYF9JO1E0LS1QYjBfKjhqCitUPWJhYylDeTAwblQjeXtPeENqUiFhO08+WEsle0VmZWFldD4tN2BifjUwPDc9Z2RZMyZYOVh6e1M/PDtaZlBzaWYxX2hfNVJKZi0jbkMkCityJSYyUFpaOWhkP2RqPU47XyNmNShpfkxTaEViQU95NG4yPkxxU2lhWWQqTEhuU3l4RlBuKHRRMCUmZzN8allrJWI/VkIwemg2VFZ8PCVjCisjbUBDMnwmaDxmYVp2O3d6aCZgK2h2fC0qUjxDSHtuNl5TWGw5MklCTDV0UERIIzJaYnt7c1NRclJNeD9VP09ZNWFCNHQoUXowMzF4NyhmCitJKHorMEc+SW9MSiY/N1piI01iWnh6XytieilVfTI3aCl6Qy17aig7MCQtSSN2cFhCOEczR0d7MXVObDBgaygmfVBAKUkpQ0VVcFd0USp4CitDJldNfnZqUlZvd2pgeG1gdTtWSFJxZVp4IUI4SXMwY2dHPHhgPnd+d0BDPmV4UztyWjhBUl5pVjZZSzFIUmcrfkI+a196dl5mWUZtOC09Cit6TXQpOVZjaXlYfVZQe1pTM0dtVnpVaUI9SGF4QHJ7ZHpmbXk4NHUtUjAzJmx4ZUA2VnVGSjQ5b2R7dGhsVklvZyRTVj9LNVh4LWxhQ2FfCispKjxCQGc2bm9IdC1WNj16K0BvYEhBMSUmd2I/eG9KVFU2eGIwQTZnQCVMeU9DQDNSY18tZGkkTVphcSZYWStCU094OGNrdlF7LUNgMFI7Cis5NUFaLV58YCN5IW5xbUdzNj83QDBkKl8tZTh6QG10bFZQanlGOGstfiF7dUsjT1NYTWpJbllgeCtPRjFDS3ghNlA8VmhtNDw0QSNAY1ljCitBeDJiVTxlKGYxWHp3PX5eeF9ablNQNnxGI3otXiote1JOQDk7YSNzVzx9KzJvISZDfFRQaH5nTUNXYDBzbnd8PlBZX3k8TVNzJjdVU3g2CitlJmYjI0RnPG4yLURsaVppKVpXOz5jVzBVPTs+JF59I2pWOU1jLW91a0soWmYpe2JfVDhTSzhINilUZ1U8OTg3P3hRfHNifGt4OHV1QmZSCitKNUFJODJSPXdYSDM9RDxeUWVMV3BAKjlsRilNWHlrU1BBSXkjRTJ+cl4mRC1yQ0lqZEA/WV9ZeUNhT29YQGNReVAjM3YtXmpFJklwMXhlCitzcHRMSUhHOGVsek5oLSUqbjsmQkFANVFRIVZoeTgoRCYzdjI4KUpWU3FMM1lwayhHWCtic05OfUlXWDA4dH5TNHx0cXhNV3tsRmAofm9JCitwVXApdWpPPVZYOCFFaUdnQXk8Zl9ka1Mod1JNfnlFNXcteUE2MlBPKChWUi15JG4wcVhvfXhadTlHLUJlUDUlY1ElWGJ4PkI8bD9oUlFTCis0bUMtSjZFVzBZRHQ8KSo7RDMhKns3U29VXmVuRjhIR05+eGVBeFFVTHYrV3ZwSXBqMUFzRDZyMkVUSkdmWndjfGFKemZrMmx+Wl8pKCp+CitRUyZgTVY4NXpMdyliUnRSOylGRShMRG0tR3hDSThkYEsxKnJuNF5XWFFNUWJlbD8hR3t7NDw/diN0PXtTbXVHWUNxRnZyaF4+czRhd0A+Cit3I1hZKkZhbFd1STRkciVoVHJwXksyYkFCc01lRHwoeUhhVHM9d3BEZE5RJjw2ZnlXYiokYERwTFE3aUFwMyNvVUBwQnY0YDJXbTR1UTZACitoall1LWFOeyVGZXEkZWp5ZWVQUWBGcG1lQ0B2cnIkak5gcE5McVNkKllaZkFXaCs1WGA9ezZSc1RzMnhxc0xKNmhwKDRvK1FmLTIwVF5vCitxNH4kRXVAMFNLUU09QyVRPHRiQWRFZmlmNXs/ZkdzZlhmXnV1NWs3O1dMRU9vcitSKyFxJWJuMFJwMmtyUUM+SE94MW9QQU59SGtWSWxaCitRQEJiTiloPmNBTmV0V2NsRylrUiphKURvJjtrXlNsNl5wekZVNmx3M202dmRocm8mZ0FtQzFVMkxMSiFoOUd6SiN9PDhqYFlRZ0l0KCZ6CitkbilPMGYtWSZBKVAkSCs0YjdAUW9OanNSVEJnQT5PJmFoMCZrfWxsKm9De2x7Tk5IPV9BeChwY2RJfTY/eXJhPDQhdktlUTtMPyZ4cWA1Citsb159cU43d0JBKEBHRWFtcDVHOWh2cGV9KTcwMjNsPHMpfVE1aCRMeWxmV21Ue2JKUXRFQTBAVW4/WXBmWjRDVWpNdTJrI2lefG5lP0poCitnXypCPCh0RnAzTnM+KGJPKEhFZVYodTwqaytaKz9MISV3JlEkbWl3I2pKbDEyPktNbGJLVXVpQUY+JU9fWGR0PEg1ZXJqNndhd1dnYClKCithKzRVTjheQU11cylFQEdeWD54PH5mejBxdygoNnleV29UekExbztTaT5OeE80OHF5ISQ8fXRuYWNxKUBKSV5XQjNqRWU3SmhnYGBnPn15CituQkoxdFFCUXM1KmZxKH1NT0xqJUhiZENicE0yQEh7JTgmT0xfNytyVlZHI3tNbjg1ayhYIT94VGYwTlF7OCQmdUdOPzlKSWRVOVNLWn5jCitxMTJGQmJ4fjszWVAhdzRyMlQlZnZZakx1Z1JyZTBLYkZxcSpFb3J5bGJlKlAybUY7c2RPcjRARzYkTGJDM3V9UHxqPmc9SFBOJF5uNE8lCispdj18RT5MIUt3M1puPHc+NTI3KjNwU0pOTT13Jkc8JVB4QXleNndsJl9ANSZPaVA4RHhqNGJ7VGJge3ohZnJwPWYzJGJBcXI/dzlkeUtMCiszR3VNSFAzbmJXX0A9bip+SWh3WG5UdmRxNGZ7enZ9Mz4oUmt1MXFwP3tPUms1fFJ4fEZyNl81dH02M1daNWVqVm5gYmpHOTA/WUVMX0toCis5M0N5OXMjPUQpdTNxSUlFRnIrYHg5a2UtbXVOWEsqSztmOVBQTDxgTDdVPG17fmRZY1MpbVd2cTEmdXJ7LWFfVmBwVWw8dWMycXZhaml2CistdkZJQWB5UE16dVlYaSFWUEU0OXxGdzQ1azkjV0BCVXtucHk4Qil3WVJeZjVWMEctWT9IR1Z4UEYoamM9I0YjPUlfbT1oaE9qe2cmNXAtCitEKCs4X1lfeFFNe15mdDEhbiNRU2lwdG0mRioxKzRqYUo0eThuYClRWj9pdncoNWhoWDNlYEhBRktRK3RwcEU3cyYmakA0d3F5N1RXYU15CitfSEtFM1E/Y1I8RlJ8NGVVO2A0OURPU0ZpfE1RKShYKGVeUmFWPVNeU04kaz88bykkPyQ5YkNIczl2KFFaT1gkd1YlMn5XKjhGam1JbDNKCitubGJhJXZLI29RTEpEPjVmU1hvaStedSVZWjFwe0EpVGgoQGUjdkJ1X29nJDZnIylpTiUoMy1mYjJAWj1PPnE8PWE2SF9SSzg4OEZZcTUqCisxWFRhaDtjSjJSVkBUb288TSRYRmt9TzdGbnNXdkt7dSgmVThgQT1lPTEoSUlUYWRLYHg5UntuM21NZVYySEZmbVN9U3h6aFdwN3wyP2FrCismeGhDcVE7eCRhd0xad1I4K3BLa3ROR2tGSDg0U24jc1JvNDVrIVYqSGhDR1JvdzNRTHg8Z31qcl9KZGtwan4zVWtxSHhrWntBcHhOaiFYCis+VUJrSyNQci10TktTP3d8RDRuc2l7Xz0pPFFRbkVYI0VxTyUre0dhTWhPdzJiSz1+TlZjNUVkRyRgWFQoPitGX1MkTXU/RzM5RSNGbk5DCitXTDx+blJMQmNwPkpgPl55SUBmNEd+aGpEc351M2oycDhRdWZeUENjOD8jKjdrWU4lZUxrK1pFQlVJNFUqa0FsWDtaOXMofTtqMHxkUi0xCitoMEQ4aERAJWdoZzVBOVdCR1VlaXRZMFBuITh5RiR1SHw0Y1NVfkwpQCtTdW9xVGV1R2NXZHhSIVc0dWU+WGU8LUQ0cXp7WFI4Q28pa2tpCitSXnElMzd2VVlPeFBCQUx1VikpaGBSWmw0ekprRWpYallAb3dCZVA9dFB7SiUpV2N+YHVXUTxmcllxS0J+Uk9EM3d2Tz1EPVA+JTlSOEJqCitAcjBvdXYjTU1xZDQ/KlM9N0d7R00kdHlEJE5tKH5tKk5VfVdnPHA0TDQ2fikhIWR4JERuR1Z5TEk3USoqRDA5Z0gocDNfM1k0bjMrVTZvCitHdmYlPDc7fEJNKnl0V2M+cj9ib1pjZkVjbnlmUio5KjkoVDFKTiNlRmVCd1V9KVZsc0p5elk5d0hrcWl1XnpfdzEwe05TSnFxSUt2NXw9Cit7R1dSTCVkUEsmOFAzaUFRKi07RilPZWF0V3p3VEk1bEs/cmhjb3pUbTslfFY9cCEqYSM4SiVYeiVvM3l5XzJfUj9rVVVYTmFaV2h3YkM+Cis1ISRGMlgjbUh7PygmSnVwU1JNTi0yK1MzJGVyTiEkS1ktLXZBdTlrMUFSKm5eVFVUc3xJVWEoWntTO3s0KHkrSjdiWXAzd0hfUVF6XldPCitMOU17eTBAKWUrfnRBcGJ+fUhTJi1qLXxmNjtUQmlaQCMyMj45NmBKTHA0fV5TUGVnZTJ4YyFyUGByNEctOTMyO3xgVDNXUCY9dWt4dDRuCitRJlM7dmhgMUtEdFFnaCgoZmo3QCklbHkobTtYU3FnSk8tN0ohblNOZFZkXmFOJk1kcmc3cGNyeSU/ckwwPXY8PkRWMylvK1N0QzBhekJUCiszSXp7aypoNGVpVS0tUDJtQHtlc0M1ZTZ+Y0Z6dlN3ezV9dXl3YDg0T0hsUn16RXshU2MjeHkyQnFuQTBGVUEqeGJoSXNlKSNTZWRiPmI+CitoRFVMVkVxV3wrVEBXK3p2dEZhQU5iLTtgPklRYlZgVDVINkx1KUYmektXJDIhdHkqI0AqYCtzNVRkVTQwPStoZSVNQmxoK29fbzIrKkJvCitwazNNREF1OT8qT0dYSlUxdSlJNWZoYjhFKjs3ZSVBUlIpbHxCaUhPfXdpdClranoyTjw2Z3NfNThkVE9OWGF2NmlHdm4/Jmw9MTZSSXcxCitDdCZueipjV0xXZys4ejlaWjNrVExyU1dnQVVKYShafUEjWkU+MWc0Jj1wTT1lVXY5OXVZdktIZ3RaSDMmIUlsJD8mV0ljc0U7Pzw9OH4oCis5cC14PWVyV0s5cXhkPztlTSR6Vkhac0F8NnxzITc5NyNmX3Njb09gJlpjRlRmRVIqWU8rSjRBQ29KLXpzPzU+dyZ0KmVnUCE/dlkwUiRCCitkb3V3eCRuY1Q8fSVSZjJOYiQ4Jip3R1p2TjtMTTdFVE40b012XnBUOEk4RlZ7S2VyYFRXT0NZfjJQam85PyhDYHk+aCt4NUEtbCE4YlpMCityQEh0KHBqMXtDaEhIay1DJjlvbz1zMjF+bHhCKUJEbndueG0zWExQNjJsRXUqaTQ3XzMoUT91ISYrPFpQTHYyfDZ0NlAweXA4RWFkYSs9CisjY349QzBgbiQocTh3JDRaeHxwdTlJdUQkcVJFZ3JRMWRVMUpqTHNydU9xeXZjeDQ1TW81NWU5WUZBY15uJmlYTzR9dk9OKiZ1JVVyYj1ICitGWip5Y2NaO1lreWFeVjR2RlcqJCVuM3piPlVvPEFpelRBQGRoZ2pYYDI0RCFkYlRpTVckRUpSSyk9PSF5VT9RZ3t8V3YrY2RlWl5ZQHNkCitxS2xCNmQtOXdjYXdhOyhDOGB+M2Q4QEJSM0BafXdQX01iViMzXzhgUFApUVBuK25jRm5ybHc1ZEh7PmRfI2hWKm02JjgpVTZ2am9FZCgzCis3RnNkQykxZlAyeWJtTD1mZGsocVg2TiYqNF5oUWVQTzlmYkxROVNLY0lqc1ZRTjM5a0xGOUU5aHRhbV9kP0JZfmQ7bFh1WFNKKD11eS0/Cis7b1ZiNFYpalFfIVFhdWZ4Zm9fT3pfV1YmMjYlT3gycHo3biZkUX0tRT53dnU0Ul5mO2IlPV9Me3sxbl5xTFQ0OU1kMEpPKWwjI1NiQGY1Cis5eTdifm9jPjFZfnBzU1BDelFGZShUOUhDd3xEQjlaIT00ayFvKTclSWZ6V1NNZ2xQdj5HSFo4LUg3TllHRGpXXn1XVXQlSjVGc3ExKlRkCitsUnxBX0J2WGt1cl5jUTR1SXVFblo3JGptMX0jJnA5Jm5qQTdhfFBOdlBiezdLREsoTjJFcCRjM152Q19VbT4rWUlqU0Elbj1yXkF2QyRpCisoSGZtRGNSVHR3eGpBNkUqVHxWcSZsd3M1NU5mV01Bbjk2UV5nIz80ejVhMURNRHt7RE1WfHBJIWhacm1NZHkrU1U0RVA/LXVyeyQrOSUhCitQZGliI2clY0R8N2RQOzFjRlY2biQtUHpeVTw7LXF0NEgwSkAyPDwwP2EwKmomZC1vS2xWWnw9O2hJUn5rSGFHa05wTyVxNU43IV87ail2CitkTWFEQV5nWiF6SGFGJXJgMihDYWQ3elh6U3JjMEt3flk9MUZmIXFtIzJiP3Y5RWoyaDJxRHN+K3g9amRUZClBOzBWTHMmMXozVihQOTh3CithcVY4LTwoTkt7MnE2U1VJRmFjNXxoaVdDYyZaV0ZJR3slaDxadHd4SE13UFJPY3d4ZShwVUcjYX1YTkhONlRPVFkrK3ZBSXlUPClxZ29TCityU21vO0QtUnVPYi1yUSV1eyZiVThGbnU+VUcmeWBePzhCYDNlfFotMC0wcWVrQzN7d0BlfDl4bzleaTBZPGZuJiM0eF8xJkRIdG05a0I7CithJkpIbHYzVDNYOGxSTDFfMDRVIVdTRmF8P0otJTg3eTtxMEBtdj9xcyVQPGhiZD49KElnQXMjNTxFeStSeUUlO2xTLTlIKjVmNlhnPTNBCit1NEZ1PnAtQ15TMip5cFk1SiYqOUFeP0tXPVM4bUJRcThtVEshQys7MSg/SmNnNHZhSXA4SD1hJU1LZ0AhVk5nZWpjVUV7JWVPJnRVZl81CitLX2AoJWxMbUs8SnFIUSpwKGMteEhabVZ3aF9kb3c3V0slPCtCQHIkTXBLY2oqK3pCQ2pjKmFnfkNZaHhlZWA9SzlJKCY8NE9xJGxMOz9vCit1RUtjTEI7QHo9VF9QPD9LUFJKVD40ckZQTzxoO0s+M1A/WXU8ZFVSb0crP1h7aCUyUX0xaDlQck1zRGMqT2QpP05VRkg2PXhgJlJ2dTJ5CitPRTIzZXhRbThlTzBTNnJ4KSNzJWwyTiZ1I314PEwhUkJvYGhmMz5DcFhCN2pWNGB0Qkp6SSRQKWg+QDZhV0FLMm10ZXk3RHA8WSQ9PkF6CiswMDRqdDAwMU5hMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlyYllYT0xiNjthYFdNeStNYUN2b0MmMkEkJTQ4SHAqMW5qfGZrel5ECis5V1JuMVVZSWBXcVFgPSh6TDd0JilBdjRtZnEpRmx5ZVRwNz4+Q15RfE58NzIjUFNSWDVxQ1N4bmU/SE5sI05+SUZxT3ErdWhYKmwre3BECitTaCV3fklNZHZXRTE4PUVqWEBJdj40YndUYFc/YkE1P3BxbnQ4TmohJTtVJlNBQG5aVW5LO3dRN1d1MihAQHFxLXsrLWR0Wmxoe2UzSUNUCitLSWx7OTx7TDxUcHw3VXZ5fVdYazhBQDJIVilxU0NDYk47Nj8tOUJjfEZ9bGhQd0pQbE1HYWwke2x3OEooOEZUR2Bvbk8zV1I2OF5IJjhDCitRbkNKPzRmOyVLPk1VbEB4U1VpJHJBbzUodTF7YXtDPDQycFgyfDN8TXt6RXFCfUpYUkRkQDd3Qm1jSHJoKHlIUFBaYEROSHZDfGJ2al9eCitvPFY5MVZec2F8UDZ9YF94P3dGYyN1JXp0dGdnM2wyZVN2RVl6aHtYPEZeIUs8JF9qUzROSVp8ezFTb3YqYWE7O2BaTX43cVY+P2hUTUAxCitHSkFeTGs/a0ZmNzJDRj91MmVHe0I7SD0wbS1PSkdAYVZvTjNwdyRrVjd5fllgSDc3OUpYXnZLNyNiaX0kUEReaX1wX0t6Knswdl5QcWx9CitVO3JTbyMwNF5ZRFBifko2Smd8ZylWcXp5LUtSNHckODBWeHFkX1NqSCs0ZlNENDF6c2lBYFJsM0x4R2luKVpqVH0hQWh3PXpGLVV5I1h1CiszJUE2fCQmIUxAfn0rdGB5S2R8SFhQM2AmZTZ6P0o8NDxRandyQWBocD88P1Q5NUtSdzd1ajFMMSY3M1Q/I3Q+VXY3Y19uayUpO3ojR0s8CitHZ0cqRkZWIUIpUEdTaUUrX3Zzb1M0ejFCTEJVTCpke2Y8SWAhPU53LUhAJHhpQ3BxdzUmTj5abH5LOE9yO194QiZBWiFGSDRwO29SYzJWCitifUooYSt1T2RkamU0MiF4MDU8PFd3cTt8R1dJMnIpJDU2eDdDcURyYj9Va0U4RjBRVEBNNzxkK24xPjs9cE85SXhsZi1OYyVMWUMtfDQzCitHfEteNmBmM1QpPF5NKnArZmpOWEA8eWhXTWxuYmI+KSNVd04+MkM3OWhfbXNWYj9zJW1NbVJDWUR0RCsyWikjajc7eGB+fTZYVkIkYDlTCit0cXZQeT4yS3Zucn1oa0NkYHZZeStANy1GMz0yY1I1I2pJck5xJllnRypBPD43fXRlTWdidUxISmBJKlUoNiskR3tkcEZqO1p3ZD9leXJLCisrfjNMK1JOdj45TENAUSFNJH5tQXNzeCRhbDdScz9EemAmZ18oSVZFfV9ZKFU2KkltQy01UyowcTN6ZmMpUWUlJmx4VSRxU3dXSX1RaEBTCit+eDUwQnJDfGZjYT9QQjJPcmVaaVY4V18xcnBZMlZod3MhQ1NrXnxzZ1JIT2RWckhpd3E1SiVpVzJqOHZnemJ6ZE43Z1cyNVVUfHgzKXN1CitiTkt8TVM3aGNSUzR0PyV5NGY8ZGFxIzZYIWMxI2x5dT89JV5Panl4Tjg9MVZyRWkyOyYlfVZ3bUB2dlpAfGYpNGZNOSRYSi1RYmFvQ35KCitJX3VUaEh5dDMpNmhsKiotZ1pWNENYSyp6JFo8KDJLWn59KnVuKUhOXzVFMFNiK3gySnJfe2cpKS07P256YjlaYkw5YmIqZSRXPDlgblo2CitfVUE4OzZZUUt4RHZKKjRnI3BKYGQkb2xDQVBeOHJkJihvPXtxWiZNOClMbGA3Xz9QSH07X2ZBWF4pei1VM0ZCUzglYSQxPjRfdWZoYTJhCis4aXJzSyRwYUdyTENXKzMkNWohUyg/aytLUlpnT3U7KjQrODVtLXZ2I2BJJGNDPkNLKzdLRnk9PFE4SWwybjNBdlB3NUA2WHc2OG0hQi15CispZGVXdVg3JTxjPGBQdGFaSTtQRWFLYHlBWGp3WW0rQDhadj0wamdVMV4qT3s5P0kkQWUjfFN6ekV8TDR8eD44c1pmUkJOU3t2JUZYRTJfCitTWjBqZzN2YChHQGFGLUpoO2VpfEVedk9ERk4+PUdRK0lfcTBrPkZBWVgxWEpPOUtRSDAwMDA4MFB+ZD1Ne0pWYHFpcUJMMEhGJjIwM3JZCitZMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIXByYSY9PkxiI2k1TUVedjkzUkAtamxIVn1RK1J9Y3Zua15AXnMtLUA2cTVNO09MMD10CitXJU5ZUklFVkEwYXA9N3RzKGw4UzNBK0hkZDdQIzRPTXgyKyVJU1VodChiN3JWWnZBOX1AKHAwTTZUI01HUDdlQ09HQilQYl9OR3Y/SjtKCituTTd3ezdXTDNvaU5sXnBobFNySSVzXjNCUSRJRy1lTjB7TVAjakUpJXREalApMiVZYmQ9a3dNJnd1KVkzVXxDbXA9NjluPztGXiNYNUk+Cis5WXV6ZXs4KjZZNHw5YzJENj1BQ2p2akBsKWk2OGlSS0c2K0taeTcmX3opIXcwWih6UiR0SCZyYXxjVXlHRndmWVZVOzlUSXw0WU9AO3MwCitsYHN1aCRwTTh+R3FAPHVYSGdWRkk8V19JZzVNTWBiIV5aYWlYcz1jKzhPcklTbzVNUHBmZ1JwRVJ+MHlMckJReTdWViRsZkVpZDJATW5YCis7cGMzQVE2JWVsJiRtUWFHM25SKEdWKmF9b1NZakw0MkAheGYoe0YpPGRoKiEmMDYqdklpVUlATTN+QlBSRUA0Jl9eUjdrO3BWOUF0Kn5MCitIWGNzTSM0SzxyP3p1IVBkb1VhQzVAVnImRmk9aShRdmB2dlM9cGRqbzRPSlpOMGlETUBvbHxsIX5nPF8mXlVTOXtNeEtMR3puXil5QmkhCitsJUJaQ09JJig/Pis3KmV8VjA/KEJEOG9UPHwoUk5tZGFgfUxsbnVWSUNfNiEqNDshQTJ7RzsjQWQpQEtLOzEkSDFTQiNiISM8OFdGaCNTCit6KjUoUW1Qclh3fTNoZlVpeWVLVmdmQi1afGs5PkZIKlBNUWk8bTJVMSM+TEgkeTkmd2d5IVJBfj5KcGdOP002MXtXQWIrcFhFTkJtelJ6CithdEM2TVZsYEg2UkVfZEtwc0l8OHMtS09aQVdTbGQlfihvNFo8fFZiQVBHPWEmI2x6VDl9dS1gcSpjZ0syc2FLN0RTM2xec2VgYjJDMlM/CitDZm87aG40KzA2dSY0LUZ0ZkVhfWxQeSVnVCFDS1dyVipSTSZRP1hwQ1RLVk5OYkQtQ0FmdkwleFBvX3FtdWRiZjwociNTMEFMdjd2ZTkxCisrazV+YF9DKVM5ZytBVVBQVkkyNGBTaF84UTVlRlpLdUkqa0cqUUZiX1JHI144UCRpWTBjR3NeMnl7RW5VRGFWMDg5QClaeTU4VlMoR0poCitjcnt2dWJeNDVGO2Z7enRvV24hYkAjJUwqUmE0MiMzakV0TnNET0o/JTZVUyhIfHN7cEt8TERENig5PWxuaT17fX10S0shM3Yqb31QNlNkCishZEVYeGo0LXZXOUU5fGBYNigjISNSZDM0M1V+N29ieUI2VVghdmwpTXNQaFNyJDJuPzRvXnNZPlNIaEt6QzJIRTwtPX0lNVZBUjg1JHAhCitXSDBmIXhRUVMkSHNJPjs0XzFMfSZuNV8+LX49Xj05QzZXUUhiNXF2ITFLXktnV3xHTGJ2UVo3XioyZXpyKmtwNkRrbkV9fDYkO257VClJCitLYU0xMihBVWplJTg5IVglUCh7O2wkTk9rPGJMaGh7ck12LXtmdypAdy1zUlBoIz9mSVFnKDVUdVN7QyRqcS0rPFF4U343JWpDZnV2XjxVCitMIXAqYiZrVCtQezdNeFchWGYwZz5jJVkpKyhZSjY5c043eCVfNThaPDQtOzRPPVl6I2l4dTVATWFjMEp5eWUzI3R0YEZQT2M5Z3ZMKSVvCisjZSUyY1E0RiRuP2k5JElzfi1fY3tHMzY+bWZ+MXBYZno+cihzeUc7VmtrdUpMUSh4N01fcUVuYk5oWnd6T2AzVXVVNHclWEg2NlAyNXN1CisrQllPNX5hJiFqeG9hbVdvcEszPXl8bURKRXpBNGUlb2JkRyl3KmdQKWg+QDZhV0FLMm10ZXk3RHdaPnhEe08rMDAzNH4wMDEyVDAwM31sCithNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzl0YlpLbUpFXnY5KEpwRmd1SGo9O1Z1ZldRaUM2ITlGRXZMQ3VpUENpKXIqJGB0dngoakFvJEY7CitONXxVX0JxP1JDVXQ5fFg/ZSk5cDRwaFArRHdzLUhYVXNGalNGYz1LeDNvYEBtaHs1QjUyKHVfb1hDcU0tKTQ/LXI+MiRpP1pZUClqRHkxCitydlJ+QilpST0/cGxJLVJxNXRpJlJWJTAhQX5wNTRUZVIwNnhrI1kjLWVHJVZzUVJpYzsmZyRReWZOK2x6NDh5RTk5NzRKM1pQVzNjTVJFCitBeHFXZ0Awb0Y2M1B5XkU1flJ4bTE7bEI/OXZwdVRII0pXX2NtUFN6TFkxQXtuYXNTQ1VBYy1aYUlUYEljMn0lT29nWnMpaE5UT1k9PndzCishbDJrdVZxcEZEKUtVe2UlJUluM1dRVWcmTlI7ISFWfGpQX2l0cGJWMHp6UWRsSmVWN1JfeTh3cGhhQTRLaEtscSgzaTtySnV3S1hyaEdBCitaVFFvbCVPSHxAPnF6JXNXbWQ/KEREIzh7XnU9VVZOWXpKVmB7RmMqYVdaLXBoWHImPWI+Q1J8JWhqO281cDkyeUdFUnkoXj1iU303Tz1UCitARiNeT2REfVM8RDIxP088V3kmKmRmZkZkJDt+WGZ8c31ScXcwZ31Qb2FLUkJaZTtkR2Irflg/OWVIYElPZlZMalhxJVpTJl96fVFBTnRICit9aFQqTm8+Um96JEtnPnVSNHJ+OTZ5SCRmNmQ9a01RaUl7diY9YjZFZDAzOWJSIVNoJDtyXmc1bGwkN2s9NHtNUlJNanozQEAkNGgwQWhmCitaSE9LN1dIZ3VafnxJcDEoUXNqfUhCPiZmbVV6YkxfdTZKb15UXig/KXhAYkQrSG97V183SDNTNWp8V1dLYEwob25pbFokeSo+cmhZR0JYCitARzghaWE2RHJafkQ8ZFNXSit3TTdmTkRMVjY/eUk1ZUokZDd5JSMkbFZBcWl3bjY+anN9Wj01I1NQZSlRb3N3USUrTmZOTW9oU3JPZj9BCityZiNPa1N1aXRQRWs1KnA4PiRBdWdFa1BzTEdZKyRLO31Wdll5VzhzUGNuTiprKmBKI3pUeiZocDNMS351cHNre0h5b3RnSXxwc0MjNFZUCis2REooMk4hWnFPX190cGF3QzdYezhzPisrSEF9Q3kqc3xXbiZ0TjE2YGlhaUprdXZhTjx7QzktKFd9ZiY4VyUxK2BJUXMqTSFwVyY7ek88Cis2bEdxQnZBO1R2ZFNqYE1ARW43YmYlbnx4RXVXaEc5Y0QzX3A8dWB7WENLK0hmcVFXUkswQDxHNkE5JUBqIT9xRWNSZSlQcCN7Q0oxcmV3CitebzctbDt8fllNX3dqdXMzaEJSTXdBaF85LXk1dXc8ITg/VHVaPXphJEhCbzBXJF5MNzEwODhpOHJaVUZYLWBwWjkpb0prOzhfSE45U0F0CittY0JoJHJZaXYzMyNVa3MwY3lrcmFfenRrayhaRWBKMj00anpLP3l0XzBmMERjQ0lOKmE4VV48ODJ2N0cqKUB5Z09tYypfaEAlX1FxRXdTCitSV1MjWG1GMlZEU2dCR0RfeDdKWTVyMWljZ3JnSjtufUthQ0MjYzxidVZvNWtvIyEkeGUlZHY1bkJsMTF7YnhefVpoJkRQPk5NSmNPWThOCis1NjtVb3d3em8tXiN0dVQ0alNpRHMyRzw+bndHU3VBODhYT3w3MHl6aW8mJXojNCVwWEpkUjAkJlcmc0RQQjdkfldUTWF5cTBTUk52aH1yCitGbFFGZk1zYExiTTB6fDItMFlhPjMtej1WemdtZDZofndGSX1zYncqQ19WKCtyRVVDRlNaIUJGfmlZdmcrIyU5QmlzSTFHdmBTMXdNYFRQCitIVVVaKH0/YlJQdWotIzUwaElVRDhDaVMtIzAjKVdKdFd4Tys4Tno/fTR6KnpheEdlJk9uIzhvKmBXMz57dT5DYCkldXFXanxIbClrS1MkCitje0tNSkE0YVhOa0ZhJkNAPitodm1nWm5uc3ghKSRyY3k2NmM3cn5zVSpkT0R6dmBfXkh3QFpCQ2JsPEN2Xj41JTUrQj5aen01ITQ+Pz5lCitrNWdDfCRYTzZ4IT4zWnJYPVh0dXFfRmcyNG5hQWBsZF9RT1loc1lCU3dXblhQWn5hME5IPzJZKXRkRHpNXkJ+NXhLcChiPj9rcktoKnFtCitHM1k8KytyI09eNGo4USRYZDYtOypmeHQlYTlGWTVhIyg9b2c2Tzs+M0VLYjRKcGk2KmxlY04tUTQlbXZqfEVJQlZVTns+SGk1P0kzYFQ1CitIPnlRe1NUIWxqa3N8QlFKZE45JFV5ZEB3dVlZYFNFQkVKfWN6Z3BMVT5sbj9AJlJ2PktAQ19QdzhUI3khPjtJPVFwTGp5NUV5JFFAaEZsCit6dEI2WCQ3eTxrVGI1dFl7Z2YlNWRIe3hDYmYwWCF4O2NTXkxadXFmc3IqRkpIY0ZTPFF2KHo7RT4xcHZtYzNmPyZiQ3ImbHt2aHhmOytgCisrYmo4VzVXYTczQGNlPUFUbl5rTnlXWShrfE0+PldlJUBEMHNMcGVXeUhBckA+PnUjVG5MLU9RKlAqN1AxZjJfPE5ublFOVGQzfkNGZnJzCitCcW12d153QlR2KntsYEJwbzsyNnlBRXQ5P2tCamNhMm5JeFZ4OWwrKj5GSTxpRV42MHNKJCpgS0Z5b3BFJnNvOT04NHQyPH5+OEVGJSk9CiswezlmSyQkOTZrVXR2fFVKJXI8V0xPK2ZERipXYSpwLWhVI1d3YSNzWTNCMiF1PHIzOXhKdWZlNyUlODAlRDJwUzNVM2JLNWJWTD8kcH5gCit1RG8kY1Bye1E0KFomVipZPEp9ZilnXk43SldqYC1ePVBXRzltUXBtUUVSM1ZyKGZIenIqX3BndHthUFIzZUBJN2Y2Vigya35Dbio5M1NFCitXcXdQKShELWF1PHRXcGR8YlhQelY/JTlafGBlJHdWJGRKUU9mSDl9RElAdVVHYCY8ZlVPITA8fGZBNURsMV8hMFEhPCVfZitvT3hRWXdTCit5fWAhaVYpM0FlYlghKmFEUVI8MlpNZzJWSmtjP3p8O2d7NWwyeFhWZFVUVzVwSGlUN3VnTlVhOUx6PDJtcDYxMFZnej0hbEJ1Q0NXWjxICis4ZEJXPntIJHZRPmo4eF4hcjt7Q0JhPmM5TC1+KkZqU3dIdmJ+NmdGYztGM2liO1k3Z2lXcEI7TVo3PntLLSt8MVA9JCM9VkI4RERmWWVNCis1Q343cCQ9RilJWEJgU2VIUipacj81fkRCeWhoKzItTiZRaFA2Y3BmMSZUeHRoJklOdFopZjZPWFRga2NVezFtbDt7bipqWT9wWT42YUxFCitjI214OTV1LTtBNXd6KDUydSp0OS18OztMPVgxZEdiV3ZaOXA8QGFhWDRrZ0ZDdj1aS2FeeUd1OzNidHNReV4pWF9DakdBKmRHeihBPj1uCitWcFIhSE55ZmxESTklQURmWX1oUyhVMWh1Iys+YUVyIWN7eXh8cihHUkVWRytrVlJKMnY0bDRidGFoSUV+eU5mcVRgbmJRfEw0QXohMnNfCisyfTcoZmdrQClvan1vfFB3TkQqT3JZb2NuemZjZW9JZ1pRUjR5YjQ+NWFeaD54cl5wSUtpMnhsUGxScWl5dHdQdzI3SEImOVpUcUlDPmhaCitjXjdAeGVCMT5MWmVAfWY8fEtvKFQ0S1p0eHUycVgjRmNwfHN9NzJTSGZ8TkkodFBiWTAxPz8qISpxSUpIRT4jTnQwcVNDJDNrRDlNblQoCitYdlR6Z3g9ITYjakhpbS0tSTBQVGpHO0s7O1Z8OGRrYWcoeUxATzZaVHk4cW5yV0pJPl5teHMkNiZoJnBIWndVRSpkODRgODw/WktSeyFNCit2diN0cz1ANz1RIVVrTkY3eDB2fXdPSUZiRHZ0d28lY2J0OWpJajF8VWw8YDYlSW93dHNfI3N4OD0mT2Yld3hgRWcjPl4henIrQWsySE9YCitDcHlmI1NYJDVzSzVCTCtBSykwQjMocUBmPiNUSms8dVg7eEtrcTFqZSY1MFRDcHE5VyptLSZoZkc1WTVSbUNuTXA7UHJ9K0BpP308aFk4Cis0Q3s1OzN8TStvYUVXOSFtdFleWk5qMk4+cT5BKzNKTV9HPXN+VGxpbSt7VGBBa0lFWlNnRzgmaG96T0hUSExOZHZeZU90WFQ0a21SMG09Cis4UG9XVjB+NjNzV28rK188U2BWfm16ZGo8VDNLaygwS1VlXjkmYU5APjdqP2JUUEFTTyVOd1dpOW42KFhmKGJZdEQjTCZRPkxpUEh0amJgCitrUEw2ZjlEX0VkczVpMUo+Yyg1NDxRSUg0cHl4cFZHa0QmYTExZn1RfGNTUlJyODVVe3hVNzROakFSMHlObXszNi0pUyVONyY8czQyb2MyCis3TiFeVlhMQkFqSHxIOTFjZmx0NyVuSnJXcEs9O09HUS02dCYqMiNCJUpOPlkxd3U7Zz40PDNiaUpJR2lPeERDP0JSTD8rcC0kV20oLWpKCitVSS1JLVROYWtJclAyZk5MLVM3KUJqPmluNE03Ryp6SlM9RWs8KysqTy1pYWNZZVJhbDcrbFM7dkhXQnBNamxMPU9fd1JHITErMzdpKXg7Cis9QStZXkptUilDbn5eTllCNDtmd2JQS31HZTUkZykwJVElQHp0Ym94bm15KEk2Yj95aTtjI3orQyVMJDZVN3YmV1NTZFp3V09OUkFueCllCitTczVsV1EtUD5iVk5FRnh1U1dHRmJNNk1wJURWITJNVkpnOUxhRjZoeUJoZTI+Pz5RRCVGT1QrbHJJMlpRTzQ/aiFRVlpqZzdyX21ZS3NvCittNylefkppaFBySnYrMj5kYD9lOU1VWnRpOzhAMjh1NHAwUzdvSERQOGY7e0xvMkdsNXcxViVyIUpJQ2BWM2swI1J3SUB4PVVKV2F2RypZCitMb3krKztEO31qeTBWQXg9eEBYQVV6KGIqYkxjIXJUYytvY0dPSn56byNePUQjblV7dj9relI0UD9ffVBlJHtfTVAxWX1BQztHej0hfD8lCitAfkx0QHk8YEt+dDwjVTxja198REtncFBNfChiZGczK2twO049NipqPTEqcTZ6akk0JCtgaT0mO0IzRl5XfUtre0wlVyNXQy1sO3FkOEdQCitxPTdORW0jSSlxMl9laCZDO1lnUSlaeS15ZEw8cFJyZ21JcndWRChBOSRST0ktb2tuKGB0XklKKHBBazA5d1kpb2ZseEswYEt2Y3kydHBVCitgPWZMRCohNGQ5dldIKF5VVl9HJENjI1hOVmJ9QHBgWjVuQGl7TChCT2VxY1FjP0pBX3V5PjIzMT9FM3J7UC1uMjBqT3A+VDV4T3pTS05CCitKLVpYfXphKnxaK0NxOFNhJnVTXjM+ZDQ0I155Oy1SSzY0OEBEJDNRTDU5SXJBJmQlUDZaYGo4e3A+QUAlaEJkTnZaVlR0UFlmd1ZpJEQ8CitVR1NWT3skdkZxcSgxQUp5aHowZSVsIXxzWEMrMSk1KzZmQ2VmQkFtc1pFPjI8My18a21XPG1tbCFQPnU4OGprJm5fcVV3NXlNSUdfZD9LCisoZXB5QjRTZGgoVTFmI29SZ2hhNXtNUT9ESD1NYDtNdClEOFMoWiloOTdCMndTYXw4S19VY09rLUBvZ0w7bjF5U35XbHReN2JeMWRsPCpaCisrYk9+RU9Ne2ZuMmt1TWVOci1tbitBUnJPT1NpKXYkaENeJnZXT2IhP0JKRGNRajdue0R8P21Ba21OQThpJEBzeGk+WC12fHBnVDBXemxaCitHUURtYENCTU9INVFnVVFyJVQtJWhwR0lnNGYqYDB2a2s8PUt9OFUhS3tDYnplVTsjezBhWllGcVl5Vj1DMj1UfiVpNnkkPXFKe2klISt4Cit2SnR3cFpAVDFeRiEoQXhtVk5TZU4rSElMM3YrbDhsbjgjUj8xfSFoQnM2d2FHKjBKSHszK09rKHpNbk5Qc0g1cmhZfXxOZ0RHYmU5dFM9CisxNXhwe2txaEJpLWQ2Znx+ZDVgP3JfOGNiN0Y8UmtIM0wkcThpbkFMUXp6XzdCPUZfbDxHSTt5ZW44TFBxaSR5TzU3VmQjbHpmUislXkt6CitHPFU7QERWQ1FrP0BqenJ6cj42NiF6RTRpYHdeK09PYVVCfFheejs7JWtJQGspKTFAM0ErelhEbSpvZksxMUczWiU0TjFoeGhNZGc2WEhhCiszbFlKJkt1SEZEem1taTZYJmNVPkQ5aEF0VFhDdEFhcC02ZWJLSktHLV91K3R1PyQldGlgfmhhMGBhayVoYmYlI3JnWGFgX1NzKklzVntfCitYSFI+Yl5TQUdoS09EZFJ7YGkmdTtySStfNTlJenkwc3xKencleDw4aiRSJFZ7YCNBZlp+eWtAeVNKekJ7e0heTSs0PVdCe051bT5DenltCitGPiQ3PSRiKTc4SVoyN05UNzNJekMtUmRXbmczbTtFWi0wMzM8bnlRaF8zVnAqPWx8TEB7KTdxYSlFSyZEOUBtPVRKUkx8QzIxYDc4dVBgCituWUJCJHNrYX11VX1OSSotZ0RgX2kkbTFEP0RfQmZhVzVee3M0ajYpYUh1YGZXLTxTYTxJbyordkhoYVpra1BUMmp7c2tFcitYSlpDUVE3Cit1a3ZCNSNpQEl9OztmZDYzU2V5V2J9QE85U2xHLUpDPGxnfVI2QEZaU1I3WT9+UHpHNEVqdmhvYUc5PyFfdWQoc0pTVSoxNTV6TDx+IUchCitnPW4oeHlZVU8jczFVd1FaT3NXeGRET2BpKjtlQit0dUg8Wk4qNDlrQ2Y5RGtIcC1uTnolJitrc003bitubXg2MUNhO0RzYzE3Q1R7Zn1iCitzN2hRTDRMZjB0P2AkNzt7fXwmKklvPyRrbis/PzVpeUVBYEg7PGNhYChBUGkmbmtmZD95UW5zejwoeElPe0YkY0g5Tnd1SlMlNHllSzhXCitVJWthV2doez80fj5xJTh8YDI9UjsxVk49bFVyTlNQI1J8MG1HO3BANyQre3wtTntZXz1kTWpjMS05UFI4YE8jay14QSp3N3tfZzFjX3srCithdVQ+aVMmOWZTR0o1JHl2U0VWKDBlQiRmP0koYlAkbkB2SH0mVll0ajFWYFM0LVVRdEhRSk5LJUAqYldiLXdRIUArZUJ8YGp3SXZPOXg5CitGaWh0JFZ5ZHRBLX03I2x2M2s1MGRrPzcjN3BlbzE1SW4kWjcmRXpDdjE9Zkd9KCVnPHpaVUlAbzFRdlFER3s3MiNTOzkrLUZ3QyF+QFphCitETnQ5XlB6Ynx1RTJnWWdSWmNNaVlZan1EXzI2KEc3Sz1mJX5nfm5FMHB+OXdvb21QKkN9TU5OM1JZcTx5Yj0mciZ3cipBd29BXl9PWTYrCis3TUs+bjBNKHFgRHpWQitUdjlsZj1tayNFZ0VASWV1fV5kP0N9NjNmIWlwI0dsfFVWSHV5fn5MUmdefWZneSN+dGNLP2ZeeEJ2OCt4OXt6Cis8dTlyb2xiI0hoMHFeVmpBNyltZmE2d2NtVzRYRnkqRk9lTTNpKS1+Z3U2MSZxQGYpWUZGSCgzaCExM1cma14tSDJSRSZ1dXAlSTR5Y2ZACiszSztKMnxreVBCPGBYJVZSRmhlRDZDMHl4MGVxc1VHbT58VT1pRFV0U3A1SCpmOFVpYCkyKH0tRFUwI3B5bHl0IXRjeTRnZihuPmY7PUNmCis2S3NkUjdUcUkoZH00Y1h4dV9WUHVmSXlGMVZOKlc/ZV9OKlZ7OEgrKWh2cFZ7eD49YndBIy0oRil7eSRnR0hRfmY5WURjcFZXOylPVUVpCitoPHl6NGFCfl5jJDsybmtwLT9NRHdGaShpTmwqKU1PJEpKbiZyKENVclVmYXEoTkorI2hjdk5qSm1oMnQjbWlwPk4qbTgrWmE+IXhrODVZCitvRkIkZlpoLTUzdEdERVAzQSMraGwmTjh2KXJGdXElNHx4RVJnRkdmbEBUe1Y5dFY+fFN+O3lJWjE4NXdsJGpoXlcmYS1VVU5iKjNAKjBkCis8UCVpZDIlWTMpRktuPCRjanV9biNMaFBlYXEzPHRZKkI+JT0xTGJZSSlgSXhuQ2dTYXoqfTk9a3p2bHRfJV9sJjhtQzRyXm9TSFcpPStoCitrRCFCOXtKP15jP19CTSVqTkRBRWNuT3ckWCZeQndjU1NSfXo+NShWT1ZndGZSYnlAflRJck5BOHM1KkFVZkhGX2wreHBLTSFme0BeLTZ+CituUFpHbzMtRVZsJkwmQD84Wn0jVGN1Oz9yaFNWMDxTKFh0WG0wSTZSfjVQT3Z4PjZZJTdxTT5nVXh8UDIrayZ1NDd0ajw7PDVoOGlvNzFfCit9JlVlQH1NPFchZFVqXj5UYzAzRDhqaVE4KlRUfnJKYmZqKTArVXRGKjBKdyhfPnY+RzFzTExYO2RYN3U/TjxSKllAOTlzYCorYy1VTyFJCitvU3RGWXpHSXlNJFk4ZUtHX2Q0cVVFeClsJml2dTJpbSV1S0pXR3ZpbyZANGBqYig8bFQ8Kn5Rdz5UPUY3YFFHeXJmdV99ZnltUlhpJSVpCiswJHBxVl5hM31hNDE8Nmtme25vbSpCZ3RfOTtCVCZDVjZNVG1KNjwpTiokOXphM1ZhaH5sK1g+KlZoY2NZeV9RU3UlfnZ2PmFAcmhiQD48Cis2PV5iNzt5YXdOUF5pVURIZ0YyJDBFOSZVdVVOdSZge2hGeGhHc2c7YXpgKiQ/biUkTyRQcSFCZHRHSFd4QjM0UlBCTT1fUW1Pdj40OGctCitiYTdBcFVfZzttYlN2cU4+dStLeWNvMV8xRG1RTzRLNHhtMnR5RE5+OD40Yz1FKDQ5JFo0QUhMWStkISswOHA4ank3WjZWJU5PI3BfYjY2CitUcVkyJGJ5SCFeZSVDYyNCSCFyUkUzPyg4eU9AVDktTlFqQjM+WXx1KEJlTjN0Zm9aRmdsdDk7fDRgc1d+XyN6OzhxYyklRiZ3enYwUz87CitRaH5EITlkSXg9WmBobDkrbmVVR1BBIXB3Wj9gdEBPfVRsYnYldERIVyZqS1dkYlMoITI/SilLcTNnTD9aRGY3Qng0eHcrciRMeiVLSGlQCis8Z0JobE1zcjt6UldxfF98KzNtSTx1TUBkZHNsQi1YcSt0cldaJH5oendmTip0UUtFeW1jM2ZTeyk7SCtaST1GUjZiWXRqUEk3aUlCUilOCitKQEZMTzEhV2dgN1ZVbmBaI21NUHc/LW1NLTQtKzgxd2BwKiVNZ2JPTUZDUihubHlXdHFzXzc9ZXZAWmVWNnlYfGlhdXNIb0FmcldZMk5ECitRXzIlT3dUbTZPaCh+M1MxfT92e3ZEQTUwUH4yPjAoUWx7c1g0SHtLU3JaYHY+cEBEeHNxY2hrKitFOG4xLWlLaiNTdT87cFg3VGojWjxgCis1eTl+cmBLdEFuPnNDNWVWNHZBT1Y7JDxWJUBBPmBrSztxRld1eGVMcShAK3J3ant6alliPlhINipvZT5XWiNyNEdeU1ZFayNAdllRMTJnCit3fXMhV0Y+QlE2WnpJPE9LJCNgPVl5OXpBUGc4VDZFUkx6dzxtSSV5dC0kQGNuJFM1MSlpXmpyKSMhfWNiZytlLWF+TEFRMmdmPkBmPihwCitVSClVZUUmZ2BkbmlONjV8PzNaK1VuP3JITDxLNCVPXzI0Sz1RPzNyamh1MmFyMmpFYGJOWnNjYnZxLXhYeno1NUh0PTZtNEgldTd+IVRUCitvWndXKFJDT3F5MmE5KGVkfjtRMl9yOzUqY3c9an4yR2diTUYhRFE3UkEwfk0xb0g5VihFQF5LZk9mdGxSSnJgXjZETTU4YnRXZT52TiZvCitfcURuTjBkWjMkWmVKK1V4ZnpteHJOWGZoN3VjI1RxUGAoalFYMHRLR2hNe0d6TU5tRzY2cjBhJDNPd2dTMnYwTUVPUHFVS0s9LVojTUQqCitgeio/NVVKfUxKSldSMGc+bF9XS0JrJTRpeCk0MlJlb1U+JE8tN0dsJXZNLUE7fXIqTGMqODxuRE9LOFolKSYhLTk0fD8wK1orXkcmWllPCittMXdzPFo0I3RQWlFfc2glVSRyOGw4a1JsJXlNRiQ+XmFeakZzSU81Pkg+ZG9hNDxpUTl5UiNGIyEyUkAjYTlae09JYmBpZXVffUF7UFMqCithJio0SDJJOCs4SWpBTXRDZTNjbDYhSk0xSmViQzxjMFJ6QT9LWmYqSjQ3dXNSWUMzM0tZY19NY1FCVllXK2poamFBNVB6YlElX3p0UnI+CiswPlZtSzEmWTNuMmU5Uk1PUUprXjBCRmI0KERkQEMkSHJ1ZGF7XkFIV2I3aUkxYCM1dWxDZlVQMkRaYzJVVCs5QU9DMDxVeFB2N01MaWlOCittQ3Q2X20oVnJ7REZfYE9xRkVKTj01UXJOO3U3Yn1AUSNTLUhpIWoyaTM1eFJlSVFgeyFxYDR+RzdtPEchZEhxMmE2Sk89c0RgY09WQE05CitsPHo0TXwxVHBZUisqbkktbW1kPH19YVIwWGBlM2M7PjdGPzJHUnt6I2dtc1ZIZTk3dk44dyM2IXEzODhlWDw2WCNlVGpmXl81N01lUlNgCit4K3ZUPys4R1JtKTEqMnNOc0x3RFZ8NSNneSk3JHNUNjxnWkx1K0JVdmF4MzA7ZlFlQ1NBMzI0QWRtUG1DcD5ENHtwbHFRQ2VtcXZ5dVNmCitATSt7U1hsWlNZTVZXMDs8UEF0ZWY7I0N8YDNRNjxqUDtqT2dYYnliXmlTZEF2O3ArKiVieEl0eFFzU1YtX0YlTFh0QXBYel4qKGdgeXtpCitoV1JVSGk1UzdxeCt0e3I1ejBNc2xmUWVUQzBhSUV9ej5aNntkT2s7eFN1dmA1XkdwRk0/VXNKOXlwb2o7PktRSVlNQT9GcTBMe34hTE5KCisrIWBXJiRoQyRXS0B5eWZXOFVzYEAzUEZteU1xPG1SWlR0Smp0Qk1RfWhPcE94cWhkVm0ofDdkQCM3QW8zKiNIaWRsdz1pZUwqKyFWYEJJCithNiMkSnNZYnZWSWI0TlQpOVomQEVUS3xmaHpqTWxAelhgWW8jRjFeZD5iRXhVRjhTNUA9WEQpQGxAQEk4K0wtSDxAeHIwYSNTWFNUSHZUCitnQSNPYXNxYGQzMVRhejd5SGEram9uT3V9dCs4WXJCSX5VbVdjVm1QUnxqKG8tQmRIMk8pb1AyTkgja050UW5fJWIocmheQ1IjVVliQDYyCisoVHNIO3FuJkF8flQ9PmMoNCpiP0haJFZweHJPQ2h1WEBNOHxiPiojbjEoTSZPcSVUNkY3ZiRDNl5TJjAoRHY/M1l3KUs1QTRiTzwpI1dXCitUczc0UHl1JnBfQH51VnluKCV2OE4qKnNBJGJsWVUoJikhVXJRO2VkNjZAYnJGXz5lVUtxZkZ9ezNxYyY5P1c+dW5YeXB2ezEjRUAzVWRiCitsblQtPEwyOEBgJkU7ZnpmeFdBdlRHfHBwRlBKYDYpZ2h1cF4tMW07P2wmV0V2U3Y8cnlLYlFxM3R7YnRLK3xHWWQ+ZkghJTx4VyFWRH4yCismTFZibDN6R2RXTFdXczQxRjdgd1gwXkI0SCQySVEtUHQyXjskZk8rQn14fnc0QlUyUW9tZlNDRDgwcSN1O29XKVoyKSVIXiVBbStxSlNoCiteVTlhZis8KmE9Z2J4cykmOXtkJkhXWCFyJVB7JDZIJTdnZ2R0cXhMZ3ZDTSlJS018fVIqRGpISk5rUDU3S2AlbmNQWEdNUUtodzZ1RzA7CitGcjh9aDspa1YyflM1YmskXiphOXhQKWg+QDZhV0FLMm10ZXk3RHRhTT5nNio0MDAyRyEwMDFjZjAwM31sYTQlbldXb34zfGF4WmRhYWRsCis7TGJhTzlvVlBrN3lYSnZDUVV0ZWklWD4/eS1FXnY4RUU2VUdSaD51U3pFaCNOWmpnTUV6JXFfPy1EcDUjR0QkZFUtRWxHYHNAVlU2c0s8CitlfmgoeHBXP0loamV1VG1Wb0AwfFhRUjAwME84Xk9ZN3lhY29OYmpSRjd3NCtRYEtGI3JHbmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GCitLfVVGWWhoPCliMSEzUFZSQj87YlQ0MERYPk10QlV0Y2I4ZDZpU2Faa3M/NXo0SH5MX3opdmVZQTVRWVpZcDYxQyNhNVg4TX4yQikmZko+CitjRC14dUVfVjYqNGo3VkROdStqOEZmO0cqPUZRT1N5JlcoUEAxaS0ocURlVDlMbTFCJWxXKmAmWl9udyR5NUklYFBjK2pOJnx8STwhS21ECit4bjhwIVFzKVVxRCgzbyohSEJVOzV6JTRNRGVOPnc4ZHpKQ0xzI0IlUlA9aFRIRWI2QGhse1lWVV45e188N14+WiZNOWw7JiVTNzskeiUhCituckd6aVNWcTBYNUNHZjFpaUg/NClsdHFfPGhxR3kmWElSZk5WdWZLZ25aNzJnKns7Pk82JWprajkmfVgqUnVSJEdacGk4MUY1UkJBeU5aCispek9nNkJ5eTtJZzREKVBjcS1oPiErN2FVbWM8Qz1LU05AUTh0VztXMWpARkUob2s9Mzk2U1I7eXNYLWoxbCg3SypCUCM0ezckOXxSfDJuCitvMldpRC11b3c1OC1OWlBsI1h+JjckP1RSekhvX15EdkhLeD4hS34lVjQjUkNZeEVYZzVfcWxUKlJSZDVGPlVMKkppJERAe2AzbVFTS0V2CituVzFHfG5EZ2pjVENYOTJCNz1lKms9QzNkS2F4QktzWEEydXdMX3VnazdpemlKUjNSIW9gWTFAZ09sY1RKNjY1a0YwbmxDKk1tcj16NllPCislKVdxYTNLYFYjfUtJSik0UGxaejJnUndIVVpoWiZ7SkdkR1MyT295bGdDVzJzcnAkVyo7ciNYPXxCUm1GPn5gJnk+fj9TaTdnenFaS2UlCit2bXRAZENsUSFpMyErZztMKiVVbjUqbFZNJnZqSCZJamFoYmNIOWlTaSFgdSYla0BDRXdVOXRgVDZxJDR3MjhwfnZnNGFsUWtpS2krPCpRCitHO2YyKWcqMjxtPTUjN0JjeFlRJkwkcHVHe0xVTG8tZz5gcCFnJnExSDxHRlQ+dmwoJVVTKFgkT2AzcT1lVG52UUE4IXk+eSsxc2AwX15UCislZXY+ODU4SChUaCU0YF9Od0E8eTNCMng+QVVBe1UheV8kXnArIUxYQXwyKkR3TSZ0dGtJVFFvLXc3YyZMMj1xMHxYUVIwMDBPOF5PWTd5CithaCQmfmNhWj05cUN4PXhGI3JHbmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNDlRWEVrUFdXcE9UCitXZDZkMGZ1VnVIOVZFS04zI1F9YEx4UFl7TF85aHQteUtBWmUqPTFKPzxGWEF8TXgqQVhrZTFUck05WjEjUkhfWDN1YilfcEpFc097SCEkCitPZV53cXRHK312YV5LMmAqSWUpT1ppe2xDWjBlKF9JVntRQnskRk1qQHVVO3BrR2tEdllPSCRWU0JBT0ROYnteO2RMa0ZXbXA9SkFea1p+Cit5Sj55VnVgN2UqWFRPSDs9ZDlLbVBnc3w5SmNEeDNCeFp8TlE0NC1vNT8kXn5kKWc5JCRhXl9SWUpHa0ZXYlBwU15yKWBvKzdxQUshTSVlCit8Kz1yWkB6djEtSjFgT19rVm5SezJQN3Q9WVJkPzxNJl5ge19mNUh0Sn1CbC0ra1p6YFFmfHdBTi1IKmAwP0JLQU5LRlJ7X3k3WSQyWj9SCit7X3QwT3tHVDg3YFU4RF5fdCQ+WnBGVGMqe1BWd2k5TUBJZCNvenErWE9HWG57cjIlQ3BaKSZ2PCh1IXtlRTliXy18UlF9YFRLVnRLZkx8CitKNUItYHl7e0hYJlF+JjFpX34rTGp7QGRmWFpAPk13NHshaGNfe3BQM2AwP0Bhe299V1B7cklRJUA5eXtTc3J2VHFBM25WUEBLPEstazAwCitLPWQzXnU9azAxWmkxTi1+T1UqR0BtYDE8dmAkQT5ySHkjMFE2LXhLbGlAJXI2MktZam45K3lEOWZIKmYjPVNBTy13eUtuays4MT1fREFPCis4SVByI2J3bVU7cUJgdDJme0dORlY/Nz1HfmhRe1dpYi07U2Itd3tranxmPmgwSFctaEtiKEAlc0Q2Y2xfQEFLbUVye3tnUSRGP2pGZUZtCisrIWxLWFpQPFBae0dJYmRHXjEqYFM1LUo9NWM7QGUwdGo1PEV1eG5eXmFlRldjPENGLV9oe3pkZUREO2VBfXo+O1p3YGN7XmtfPyRENGxoCitjPkIoN3xJfkJlS1hpeHZxSkw/emRpPiRkPEE/OXh7UEJseFV2JkB0Kn5mcVY7O2FBaW84TiErYDI1JVpeN3laeGZCRUktenk5aTl7PVByCitrR3U/bWZfMWl0WXtxdUolZzVOeSl0djxZZF93bGJpQGIyS0JmQVF0ZHw0WDt7e0FYWU0+V2k9YmgwKmA9aT80cURpe0poM0B5cCtRYFN8Cis/dCt0MHVKPldpUU17I1QhV2BTfFZjeng/ZlFlKW8mZDkqXkk+ZEdsJENuYXNhNiReWHczfEZPSUxeWlRDM1p7Qj0te3IyMU1fcEFSKUZZCitvc356O0N+S3tPUj8tenYqVEVgcHcmeHNLQEt4QkgjVj58Sk5GUmB+S2EoYE0leGNLUEwzPUE4LUhvYz0hSX10SCluSHlsdlRPPkhEOG53Cit8bmBJXj9sVnN8TWgzRDlfIzIyeT8qIUt6VT9MV1R7cipiK2RwPkt6eD8rN2B3eT1rS1lSY0VNP1UoYHBMZzVtY151RTU5T0hSQjk+NCF4Cit8S0AtN3pzRTBye2czfTJtQ0JEXnk1cGF7e2tPJTJgMHFjd2RHfmNvPD9CQ3UlVUR9THprMj1sRlIkUElAMnpCZEJmUzM1TDtVVEJfa1Z1CitSXzxKQXpAYjJyay19VlJwazNXNjxffXpjez19LVVpbSVuYFc9OT9jcmB9bWp0Ukw0Kk0rKVkwR15nbGNRJDYxZlpQayE+QkFKNU9gZEIpCitNZEkjKyE5KXlpN0BZOH5nTlUqKzd0SS1jamVlXnVBME55RiE/YCZVPTQ4YjA4UVp7RENqSzFucD1gO3V2WHtLS2N0ZSl7OSVDLTt3a194CitPa05Hai0zR0o7d0tje3V9TXliO0JPY1BrKzRUXll9XnNebXFVOHtPb3dIeV47UjxVRipaWWBNQjRBVT5CVjBlP3o0OXB4KGRoWlRrSTNICitxKVBmYDEoKGVLZWJYKmZ3YTIkQCpscl5kSExCRnxGcih+dEFGfEo3ZUR7fVNPNUJ0VTtPVD9GVGVRTkA0eCF1SF4yVlpGRilgOStwbjtDCitwPz8wUypCPW45N09NYUxuLTZMc211aCRMYE9raiFpK315eTd5czhVODJaVFFqKGM1Y15WUiRSWHo+cV5BSFRIMUpZRjYzPzA/b1hVaUVPCistdDdER2lSamNIQilxbFBFcEV+JnxVYWpZfGV8S2N8PWJxPVE1IUtDbEBtYCZFKCZCaSZkWjI9amNvfXVmWlp5V0xhYzJNMjMqRztqe2U7CitKeXVVZE5mPihNUSorNWE0c3VhMU1pIz0yZ09FQld2bHVmfC0qdDI1VHZ7Zl9oSFV8OVd1ZSk/Rj9TQ2VyKFc8VTVta00tJj9ffEo5cUk3CitVRDR4UHIkI2l0K04ocyNvM1BsTlkpQXVqQWJQJmd5eEgoWkJYQE0/WlpXSikmQHcrNU1ocGZBcnxGXiNqTU5iTW5fJmV6LUBuZGVYLThJCit7NGdWR1ZYcTN6VnNZOWQ0dHp8R1Y7K2FfeG9NMSZoKjh7PlA4VmdxUysmX3s+WT1aSFojfFlhaCF3VW9JTEJFaGtDeUJZeEstSzdxOXpkCitKQHw9ZF57MEIhJDJffD9YNT1gVHtpaWRYdGpKYCVKKypzQW40c1YlYG59PyVvQStRQUBeSk0hX2RsI1NMVUhrYUYmRj56VSptfjk5SWpECis2ZEpIO0c3R3dXYHxFdyghe1IlSFZ6NU81T0M/MzJKd2hOKT83ckk2LSNxJkJAPU4/RCkqcEF1cig3JjU+LVhFRDBEVTY9NHRMTGxOX3ReCitjT3k+M1ZMdWIpP29qPGIzJntBVystUVBjTih2Z31WPEAqQDVBSipze31iI0lVQ3xMaE9ANG91cG9AeV99M3hVUilaQ1U0KUpfYiUhX198CitORSRgdSZQVT41LTNxbkAySztnU2xCZmB7emhyP28heThvMGMyPGpwc3tHRSVNTTNkUyp9RkY/dlFHNXNGNi18NioqPHQ5eDYjY3JSUUYrCit2TDN2cXR5YT8oNSM+REBWQWB4Iyg2bjxtbXszQnlYPW03e2dFR2JiYztyaDIhVmFfQV9xYj1gVSNJdyRqRCtAVDNVSnZgZzQ9THkzVHZOCisqWkk7aT0rdlNXVDdGdWIqKFRrMmNmPUMyP31MNztyVGFMcW9+N35aTDYwcUckJWgmSz5GQWRJcDNoI2xXTmd6QkZAKSUwXj0kRlp5XlAxCit2XlY9KHZHfnklRTRhVXE+X2Zmc1J5PWhTI3oxJUl+dkhMeWVPVFJlJW87fEMxX0IpXmJgMig1bVdvT1h6N1ZmQ3QkTmtyWDBrLVYqazNECitEPllWZXdNeGFxZj9vJTh3OUA2d3tuUFZMVlI9QipkJT1yIXNBRChadDM9WFg3fEp5ZjxaO3w7YzclUSglRHk/KWtGWGpifU5AelRtLSZ+CitGYmJGR00lYCFFQ2tPYkc/Pn1lWXx8fWxnRz9+cnMkdUZwJm8xPD1kZkROQyRlWTErNTJzPkFydEwldjhHMkxtJVRqd0VRSSp0e2FSMjRsCitpZDNVSXElPX5DbHZjKUAlbHdwX3VGZkpfZ25TU0FIWWh1a0krQ0B4Jjc0MS1CR1ZRZl55SWpDQmJlU1ledytzNnBhIXt5dTBRK19kSlllCit1VXFzMGB3ZHVGLWZ0ZXhHQHB1LUN0Uzx9bFJTOXdyK3B5MFBjJWg4NiUmbXBASFRuKGRwPXZBb290dCR5YzdFfVNnbjRjOStyeVBFXjh0Citxe2dAVloqUnB6LV58R2A4YGQtQ3lxdWhfWi1eUGZTOStza3VTd0s2QGUhcEg9NFRTcmlva3dxJnd0anZ3KC0+NnM8ZkVUfFU2X3drYkdQCitAflNaOXhTQE17Y2tANnVLU3JfLVlIUUZsNnhzS2JTRnBMQ2dpcTw+bnxlVzhWRTtkJFFzeFpqdWdiO1d4RER0cFJTS2NQalQyWXN+OFh3Cit8eklJc0dFMDJsalJLakk9XytYIVEjQWUtOGZmUyREdGZnRTduZklFR2NIJF9JdFZnSis9JjA/VWpNUHQtKmcmdGs4JUNeSTckVz9YZ0UxCitJeWF8JmdabEJ5ODQ8QyY3UmVzNSZleG98TTV7d2U2ZGl4UVZTNWBlPiF1SDY1JkF1Xl8yRnpvP0VYXntGM05sXiRZM1hwbGd4ak9oNH5HCit5PjM/enwwcWBRYlpMPmVlcCZ2QzdTJk47RSVWeUBWenl0PlRgfl8/QF47R0VzZmI2aVdYWH5SUXBrYzFSU3RIKDRNeDk2emhSSTNLdEpnCispVk5LOHxeb3c2SWRSN05Fcis0TG5TPHQjYShWWW1KNCRITDVlKk9yeEJpMDh+ak9kPjNwVCFFUURkQE5UbDlwd1I3aSRgWTdDfFM1WUplCis1VF9UbT5JVUZkYj5haVNra0lWVXNNNEA4MFg9bFo5NjlAO055MGNDODYmU0pGflIhX2wmIyR4dn1nbCZwVCl1Nz0pRTEoblNLeCllXzdrCit9OU1jKHp+QyN1bX1SbVN3VFFQfTsta1gyfS1MMGxMMlozYENwX3YoTyQlPVNRRypkbDBSVkgxPUUwN0prV3oyZSF+JTJQPlhvPWx5RVljCitCcGtObnk/cUlkJjY0eUxKY00zPlVDPjM1VFRmdUhqVmUje0BINTNXSDV3QCMlUVpJKmEqMUZKP1AxZj8jRXprXiZmQit2IWBrQC10RztqCitzfEVJODR0byZwe0NtNjtKP1U8a2p1S0FeaGpUSz8yKm41LWkobXl1S2xNUGMrb3xrOSZ1fH1PdVhGJk91S3dMYGB5fmVzWEshSkFYaU5uCitmez1vNj5CfVBSUjx+LWF3U1A1KmVXfWlYI2wzfHt3e3RHWXMrOyglfW0qNkApRjRZRFd0UkloU2hDNn1qZWxDbmdGYD5BOEppMT41fDJ2CislI1V6NEctVk90aD16d01XdF9RbmdmNWI7N28peGd7TFEyUG1pOHVHPXZDQU9eSjVPZGQ0KW93Tk5AYnFgPW4lbDFxe0V+aHhUemZ7alR3CitQb09LQ2swbjFTS2FULWI9JWFxYVJMWjQpdkNyYWgkWiVgUCVaXktFVFVseEEjSTM1MipuUlVObXg7bWRTV2UpYUdhKj5IKj55S05VN345Cis3WWFqcz1aO31hUDRgQl9EZm47bUBRbX5UcUBUXkJVSi0jRX1QP0VSaikocWNkPzA+K1RrRkc3eTRQZjU3OHJRQDhlJEJ3bk5MWWBCOXx7Cit7ZmwzNkZoQy1uZ1N8QnJRKH4mdDVycmt0WWR9VT4rSnBDKzxEUTUxT0hRQGU8PnlOVSY2YTFQRSp2YkIlRUtrWWkjX3F1UHFoQmphX3g2CitHb0g+bTBaOHV2eHd0aGVnNT5HI0lXYUQpRXNSP211aFlsfiFCSWNZOCgqd2wlQCUjKDUkIzVRY0VzeWgjV0FsbDl5STI2YCpRalp3NkxsCitlTUo7M1FzUmcwbFkyfllhdmpFWWdFQy1jRDBHZF87RntmQko3PGJqU2t2M09eP1hCOVN7amA7V1hUZl96ISR9cj8rOHJjXz5EaiF9QnN9Cis9fWxKbnckLU9WfFZiY19uYG1qcXo1LVBYYFZ4NCY+bUtoPyNwcShKfFU0K0BJQ1dkYnRQaGZUa0stOSNYI35fJSlHTjh3QF9MOWIlV14yCit0NWNXaWw7XzxSNlZJSTJJaXhsczg9aWozTGhVR2k/c0ohPilLd29VY2BaMEprWCZGfDk5d1V0KjUkK3hiUzRMODdsVlRCPHh4aylDWm5yCitZdTF3YCF5YlF7aHhTWDN5PldVN0pyOE9wSHNyPHpKaSRtZ1NnbExKb35VbV5yZ0FyNjsrZ28/SFQ8O1l0bmY+Z015Nz4kOFhuQmNKOzNgCitOc3VDMlA7cGRZbFhncDZIR0o9ZjY3Ykh5MGlIa0F6SzVtMjNAb2BKUnB8XzxVbThtJGZQXzh7blA+WStGOyRpSEEyR3E9OExrUTFXQUB4CitZJl9XTnFFWmE0eW5adlZ0dkJfU19MKmwzI3x4dCVOe0JjZk1BdjVVOUtyQU9EI2h4eFE0Z0xfY2hmMmo2THgpSilKbUhVWVdaTE5wTi0wCiskbypRNyh6OzJEPXd3emF9QnBRXjZ2e1FZKjI3P0hLS1QrYl9ZJHA+VDJOUFpiYGowcnhXWS10cnhpd1RCRWJFZj49PUNQSztIOUBGaXxUCitnVHFWKXFjc2kkOXU2Xy1CRyFaZEFlRTtFWXFMc1MkKm1uUERqcSN0RUB9PHF4STd2ejJ+OSpsNmV+N3ZEKnU7WSkhZnhJQ2M3QCt4OFojCityUVlHNDZRNEwoPGNWTzFQZCVCWDlVdTRSZHVjKE1fKzUmRUhiPH5AQSoldWhFSGhMR3lMfitFTGtvKDVCRDZTaTd7PWgmcExASSl5YVpvCit0aCQ8ZDktYzB1PzBLeDw4Y1Z3c292X3Vydm8kd0E9T0pTRzZLbFhKUUA1YV4tN3JaMzRLRVltflY8eVlFNGR1ZTBEYHZsdExqMHslOVd5Cit7Uzt0PTFVSThJYlp0RVROZ1Q9KnBqPzctfXZPa092fkM3NT19XjY7aTc2TXJwS2dVLT5WZzwrSUt4cSt+aFIoO0ReaHA/PCRmOyooMHM4CittQ0ZBT01ETThjRkVeUE5Le2Zafmx0UUgoZDtNMDErM202bkVUbSFBb1pGKFNlTmA+QHFiYm4qIyFSOzJkPDkka2ZGfm45UFdES3UxfmBCCitgbT8zd1RHY1RWK1hjQisyYkFmWmlqanV8Rj4xbk1QIVhwN1VTVFVNbWxfQzY+QnwqZFJAdz1QJTxPZWJOQWJSTmVfbFNkIWQqdnd2WnQjCitqaEBRTHFuRGtDOzhZQ191P1hVVXdze2Nndl81c3M0UTx4JHhCWmZDZ2U0dSFEal54NiNpM3Q8al9IMzZgVzF6dFoyJHY5YmNjdT9QZVg7Cit8QyFEJEM5YDdRND5ycit2aVJwJVo7SkQwRmpefld2NCRDXndsaWU/YGl3O008NEtXOFgmay03ZCV9Wkx1UFIwdSZ5P25ZNEY4O3l3I3FlCit5YDdnKWZmOX1JOF5vQ2AmY1RsWVprXmtrcjw9QyU4NnpvZG4oN1p4JnAwQXQhRUFwVTE+anAwbGEya15RPGNyeTcyekN5Un5BTzZ6X1JjCitOeEA3ZXdxWUp5aE93cyZeelpOVjFjUjAtTzNybSR1Q0wwLTkpclN4ZDBObmNKTyMjbT5FTXR4I1NMJTtPMGE/N2ZJVkwpV3N+Mk0/U1lvCitgdmQjazFrOzEwcTdpckI/dFFWIzdgWTUxS2Y3TEtoKlpeS2BnOFNEQGt3Jj1MamJHPTxfTShAKElpaHReP3U4ZiVuI0tvY0lSOUdUOG9XCis/fjR4WCtzPmMoaUowIWh2JjxiKHUjZEdxIzlvKkRmblhBKStHflZnZzJFLTM5QHFBckYkfXJvPn1iRGFGNlpJIUJee1I5KVRufGphUyNRCit5PW5sZmEyTztVbmU9ZFReOSooakg0bXFfb19kSyo7KHZBMntaP0p7Xlp0Y3pQQSUqZ01pVVYpfTJ2ajxGVmd9TDltQHlJc0MqPCpBbmckCis8WC0yTSpYTEVCQmxXU3FWO2o9KzlYOzJpRCp2QlpOXiVZYyRFalM8a2defk11TGdSbTJnLXFUWE1VO0w2b1pscGJBanVNQkh4YT90R0I4CisoYH09NHBzMFpYY1E7cDFfNyNFSGErXiFAIXctMmwpVl4qOWhUXzs3fk5raHpLbkxobWN3N2pAWjVJXjU7e2JXTENGWmdeMSVLKlVrc3Y/CitaRj09azVmQ2JaajtyKlEjKDw7JlZJdGkzSGN2cj1rdzUrbl5JP1ZyJXcxR21jUXE+e2dVbmpudFB+Z2NeODdNIUh5Y1BjJmFSNlVwUHJ7CislcExAQGlZdGokOGItUEJnITNIdHtJKnxtT24rXzIhaDtobWYrOFFwYDBGc2RDYklXOyVaMCtrQDQjdyoxUD5jX2FHWkMpP1UkVWErWFVnCitRVntiYWZwO15NRUUtfjQ1MT0hJGRBVXgodD5eeyZCaHRhRTl5dlYoN3F5M1VZITthSipfXmB7TThXcSpMT1BxJHFNLTdTSz5xJXlkem1pCitkIUFqRVlqYCtHUUJ8TXR7JDlFJDtqdVRMMWBmYH42cl58fHdxMmhrRilkVih2RnRecyNGUENkV19qU1p8TkdqSlh8RlZmdyFabUw9M1NMCitYNjA0IzFnI216OylgcXx5JHYxJjRiWm9KUEZjMGI5X2V6SzZnJGNmV3lzbzRmJXwrUGJ0UTM7Xz4/bTA4U2M1MCYmQ0RwREolancyWDNLCiteaUJhezFWe2FKZTNwPHtpM1EqLTd2eUdxIXZBU1RuPjc8NSVBT210JTR0dl8yRCpBKGN3cSFfXys0STgyQlpTKnEjVHhHSkdjQiVgckJVCitDM0hLNXdHNGxgXktpWEd1cU1lbmNxKz9jSSZTa0ZzQmh+QEpSc2ZlJEU1fjlCbmhoViNtO245JV8kUTwwYHc8elZDKEAtfEVmTmRMfmxECitaPHN+cDgqa3lPKnItKlk5YGdxYnVJdkdZTElMNjdHcXdQISQ7Yil3Qjd5N2Z7Nlo+dHk8aXQ7MDlqUEZhTGBfM34mZHpiTFB+QHo1enBoCisoWXZweyVIQE5AKzhpXjE3TztNTlpsVVVLayQhKEB0cXFuZy1ecSQhM3xObiV3c19FXmk8eUFrU3ZoITM2aU9CfU5JTUwrbXVGIXV8Tz01CitWez5wQUFncmZuJlBkPD53QTI+MmooZjV5aWwrQi0odFpsWD01KyZqWSs8eHJOTzBoRWlZKlhlaCk2VGZRIWRXcylmKkhyZ1JgP1ZWTlFiCitBa3B1VFJhKjE/Y1hwRFlMVVFueUhGRXswUiM9PEk2QG51ZGg8bilaaUJyTGM7TDk5WHY+Vn4rO1g8YTt+Y0tJZkM1QGloVDtIKG9ufXhVCitoZENJT2dtUjlqV1FManU9RVF+IUhfPWx3ZGkkdnpuenB8flhve3ZFUGJVPW41Xzt+JExuKT5zdzdedktVKHNoTmAmU2ZmPiV1Y1p4ODc8CiswcjJUNVdJNl5tNllWVF5eOS0xNTRibzM7az5Id2IlaTJxPDs0ITdgQStYKGc1Q31UK014QlplfmhQSyFqUGpqaitSNjZHYilrZERGe05nCitFQGxWZlRQa0VXNz0qJXR8ZHNPYDdkWndxVGw+fDw+TnNue085Vkl7K05odXw+K0VfPGp0VHw5NilYIWV4KXNWcFNme2w9NFpEPD09Z3R2CisofTI0WENSUUgmREt7NyglPjVYaV4tKiRibCNVcEhhMTBacTk0Wlo7OzJDTjxrU3wwWlU4WWg3flhVVyF9IztKaTVyN1hZbTlhaS1YTUohCitGYnpkWHpBe0wrYkB9dmZYdF88T35DLV9FIXA+PmdyYzN2JERXNlA5RSR8bkFMP1hXJCRrLVhIM1c+JDxMKHo7QXtpJkN3RkZeQXpgZ0FGCis7ck01IWp1QykkTklPd3dDO2x3O0V5cn5sZnswV0VrJGI8akIoP3Via2VYWTUoVVpVIShvbzk7K0pLRmlFblVSZTR8OFlCT35lejE+UD1JCitIYEtZXko+cX00d3E8NG45X3RHbXZtR1N3OT1vT0hDbiYxJSExYVV1JVlIU1dhRylBfkh2SGdjPXp2TGpiKzNefUNZYlZRYUw8LUFNdlBICitySWY9T0otSGpIPmB1IUcoTmQ7fF9wRmZ2UkUtfVdOUzt+LWVoMTdYS3hNM2E2V1ghOFN2SEA1TGdYMn0pd0czP3BYRUR2LTdXailUQDl3CismWVl4dysjc2hgVVVRQVRYd1VfNWM/eGxZZHkrJVJka1p5MzIpUGc7MURGampoa3BKZFQ4bnJ9TDYwOHVLS0BGeFVmPWNiQGwlQFh1MEFoCitSPCh0aGt7fiMzSG1Iey1sXmFJYE89JWo+SUNkSjA8ZmV0Y3lZc1k9TTxfc3A9YiZuM3clO2FZIS0lY29xQjRReVdzOU87Z2czUyhCSHRECitnX3hkMz5gISpjTU8/Xj5nUVhgR0lzLW1CdHpBZX5nbCphe2hlZipYZSVtaXV5entiZDw8Z3dYV0tsR0RCWkhYdktxbyhfR0NHakdOdGlmCitQbj5aSGgrJig1T1kxZkpNI19sKl5GZilmYlV0LUQmMzlNJDFYanhTZnJvVGdxcHhZPy1KYjdgdlVSPCphUDVqKC1BcE5Pe3krQnJCYUJJCitJUUBhUiVeNXE2PmFPMDt2UzlyNEEmcSZ2UFZVaEtweE94SmhVZndhT1JrRno2SDNOKFpaciYqKzgmYGsxbD9SXypjb2xJNiY5WH00NUxLCit5fG12Yz13U2c8bkYhISU2K2FHJWQpQXVUekJwZyg0dnw4UXtaTm8jSD9FdVM2YXg9LS1qaSokYUJsRlpDc2FAfjdzOFhEKUlrQz1OISU3CitNNDRiMkN+UzZ7Sz8kVkpwQmtINyZqWnpLa3hpU0UzRWI+Ji1CLVdSbHBjZz9QUjlCI0stdCY4MXtqdFNQMCsqR2R+N0o1TFRUOURAZ2pnCit8Sm1jYyRtMHhhPV4leDlJYlFwPDVCa01qMCl3Nm1gb1JXMlZ3YyFwZi11U3hSeztJSEtJdzw2e2dNOz0od2pwWWI7MDkoMF5aKH5ATTJfCitlMH0tKTc7JlpAajdUZT9gJndDbzluTTtWPHpGcUpWOztpeDFeVm1nZTJUdz02cHVpTjVYfm0lZ3BCJnkoZ28pRS0lQCNVI3YxSWRrYHd0CitocTFhbSZyb045X2dYQjgkM3g/MGZlIShgYjdIRGVpMUBvTWU/O3Y9TWpqY2ZSNjk7aCF0YmI4TWkycXckSkxMb18wV3tEM3BPbHA7dShhCit4TyoyKjZYO2YkVDRMPENmb3hgalVpaVROaVpiPWApemVVTTxJcXY4QmlhP2VRUSQ3XmJ5e1grQTllWCZvdW5qTX1DTE1aQGl2JSU9OyQ8CitJb0MySnIjMSYlVkR3aGdzVjZyaGRIQHZvdFZ6QGZ6aVRMS3E5NmpuMTAoWW5KOXx8QjMtOW1QSEE/TDhjTCVgS3BiUittU30mT19jQitrCitLMjVaWkltfShWYVFBRTc+dUdmP04rUl5ZN15OMUpOVlVwTSU3JnAhOVFtT3h4LTRfc3FSWWZuWjhtcFlOYnoqWDd2ZzNSenR6MHJQNWl6Cis9RSNFX0VAc1F4NCs7aEsoc2RuY0U+eDE4a2g+eiF8ZDRRSnlJbDItNEp3Y1JgV0QpX1ZXMEVhNm0oQzJ2PihLVGlnPUNiYnJFLWEqcGFVCis+QTJkQXs4YHhTOzVGdE9GaC1IJk5uQE0kRnZZQ2dAfXhxbUZ7Xm5vYkxyYHIhXzhENFZFZG1pdmhUPDVTcGlaSUQ2QXYlMUxGcXYlZDl0CitUNGAmfClhTVVCOEp0T2dLNW5FKTBfZz1STHBGeWBJUFJtdDd3OGpgYXVodE5aQGs7dHhNTl49UX1eUSRjWldxZUBaVyE8QD5sWW9rXz9kCitlMzU1eExuTGI1Z302WmNjM2glbUNLQkcyJmtiTT1TfjwwbWNUTVFNfWt3aUhtNXpRZG1TWlZrZ2JgP0FVfnRPPzlNWX5OaG8kNE4qNitHCis9fCNjcShNNX5Fe1hERWRzSm1iNFVVNiQ0JCpXbCV6KXFjMTxJS34leURNbFI1QH45b3hvPTsoMmh0YnAzV1d9QjdPJmxKYHowZ1FIYyQ3Citib3VrN3dFanokTzZPLXR8TnQmKU5Kb2tMK1d8SX1kMTYrcDJoPmB0TFVxYT0xZjFWe0hTOD9pb1Q9SUJ4Rmw7fHxCVFJUSzw5VTw+NCRkCis7PnVzckE3V2BEMDZiKzdYQEx1KC0kUDZYOEtXWUM4QG02K3E4NV5ORVFefmpZTHohcyVBNXt7dlF2RlFHbUd3Tk9ee0BLQntCQWkxSXA7CitseD1RbHwmRW9aUmJ5UVg3RGJXckJyaFdsfGAoUFYzMz1uazNCaE9XaUFGOTVkdnZMczNUdzs7eDB8emB9Y2NRWHV5UHBSQ2dlKyhhcEdhCitOQHBPeyh0al9sZSQ7M2FBKzFiNlcqKygyYmIkYHdNNVd0RTBXRnA2XjRSYXFkfjxFdDwjbCRZN0A0Y1FUSUFkcWhnfGtJTXJCODNxZ0BOCis0Vjs8QkUpa1lPdkhpcnMqdGh2cVpITUV2ViZQc2xjKnp1X1VvdT9FOUNUJn58MEthV3A7aSVLUCFBT0l6XiQxVypAYzYzbil0LVIlLUg3Cit4JnshYDYkN0t1P1VmVVowX15KbE5XajdCPU1We0pqU2NycyopXiV8d0BtSzNXPURQYm12MlIwLSNrLShObWlqdHZqXnBPR2hFNTw0UWBZCitmUkpFeHl4ZXNeMk1iOH1pTT9SdmpxVXJaUU5CWWhCbk9vfWNpbTZTezgwNEhne3dSYHlOZiNvfSE0YmhuKk5wRX5Id21xaXF3TEsqbHooCisjaC1gPVJqOHtYMWZtcjRhaVZVUikpTktgWUk7Kzc4KV5eWHw5KGxCRl5wV2I7c0VsZUVKRjYqWnw0SV4xQVc1YGRhRGotOWZaIS0jKyFHCis1S3AlKn0zeVdyKipIeVBiWFMkUVZZNyFWZ3Z1fDZlTEB+bTFjWkIpQndnZVFFUE5aTENYTkM0MSlpNFpYUUxkbmVqcWg1IWxDfVdMUE16Citva2E7TXh8QShBNylsPmJZNip1WTY7Nis2RVI/a2h2fnVeYGUjdD95PSYleXRGeFRjYDVXP2tJUiM+PTMtfmZ+YHltNENGeHAjQykrTzA+CisyU25ULVhyMCV1RE5+PlYtd2lOWUNzLW9ZPThlTmBKVktXaUJpTXtIdSlgR0dIMDBOJWtXNFlodkpyQ2BkT3p7RUQ1QlY5Z2EkMU9xQTlHCis/eEFBc1M1YEM2d2o5cEwtdm1hdXgmTEdUZT1OYyhOU1dLeF4pbT1AVWM7PmswTXRrOSo3UUJOe2RrfWp2d1hqIUxiIz18LV82NDNiVD1rCit0fmE+UnVuaSteYjBoWSFwUXZnSm1DUiQxIyotN1hATn4zT1RgSz1PR2g1dF5NKEBJMGQmfkdSQDspaGt6YFRtZDhHPXZUS0YjaUxxck1fCisoQEEjODRNM3c9a2d6WUZqYl9gYW5DUHh1amxYeDNXQ1VEX285R2tqcFhvRSpiUXMhdk9gYXJtez13dCpRKTdwPzBQUWkzR1JOV2QtZCE5CitkfiVKZ0I4YGUhZzxAK0N8NnVCWl5HPkItQXxiPmQ3O2EoNkJrUE5zV1dWd2Zyb2FqKW9zT3I7WCg5cV5ATjNWVDNzc0J+VColbFFHJE9OCit4bk08UG1ZeDZTQDZMTG1mcnNhJUNsSW4jYHg2STV3TVUkNmhQeXtjI2I3RXw+OHotKElJamdgMlQwOCVDUXVsZz5iJEhmaDtIZiM2bCZlCiswZDV1OD5qbnxRUVo5QVRlaWtgSnFsY0JSUUZaXlY3UzwkPTFfZ01qJE5NTGRCKjR9RHtaZjRoaT8hYyhMe0EoQ2dkaEx4WG8/dCVnYi1ECis+SVJfQj5HY2RLbHdVT25PcVBHMTRJdlVjQ3MwZz9jSUBYP1ljJjhfdChvMGBKWHxaOHo1M2ArfmFIKUEmdTRgUH02K0VJYSFSWik7SjlKCitVdFB6YlU2WCloa2Y3O25lM0gpNXp+IzRfanZKM2hISEJHcnA2Nn18M3QmOFRwMUN5TE1QVTU5Rl9uczlZVyRhTHJ2bDk8QDRgOzdrclhzCit3QFNAcWllanEkaE1TTUhNbzxHR2IwPlJhSnEqI3hMQS1Ge1ZYcTxBeFl2IWsqUj16YyVUWGQ/THtnLVYjfUptUEtvTmk1Zm1BRWBHfCRQCit3SEtxWj1VfEBRMFRtTXFgZFgkQl5oc3B8NzAoJnhxZTQwYlY2Zj9GcEpTUVBuIU5HIWhFR2wqZk1VO2JCYnZ8JFpmeDZlcE1tUG5pYzs1CisleFdEc09mb2ttTm4tP1Zla3ZvKT8lM1JxUzZBU3BxTFkmP0N9JkNrZllfZGNlOCVTdT5eZXVmSkF4dTE/LU88WlA0Sld9d1d5NX5Ic0BGCis0WmF4ekd0Xz8hV2A4dzdLVkwtNzdUdEwybClkbVQtRVVrfXhyO3lwKjZ7PUpsMkAhWDlNOUFhVFJ2T3Q9VDlOOXk5MVUrUHx1VmZPRnhBCitTUGJxPkdfdCR5ZkxlJVpefjBXazJ4S198TSlFTTJ7Syk3fDZUOU5MYlYtfGFjPSNHMUY1P29SIUd8MTBzMT5eRlNYSWkpS21TaXYpbzRJCitndiZRNHB6ZGBkPHFKcGF3NEJoRXhLSn1aa0BFQnkwdXFYYEE3Kik9c0Rve2FFZ3hHdmh1VUVLZWJsfDRQeENYJXVSNDdBNkcxMD9nK1pTCit+OVcoMz1mSXhuVHhPPFRuVUZQWV4zZURSO0VCejlEZks5aCNPM1B9MGpKO19SZkQmMXJRPSYoSnVxPlFIOz9BV0dWNmBtemV8e1AtY151CitVRGYteWVLLXh8UEE1OXB4X2hITm9Wak55VjMpaHp1SVRJXiY4WWZqaVZaaDReWV4kfWFTWUl5TE8yKE1YeWlRaEhWdShlQXZsQGEhdjl5CitYaGYzMDw8NUd9em54PzQ8NT5qVjsjNWdQN3JEa3wkNEtTOSo0ciF5cnBGT1pEb0I0UzhyXkp2RG1DPlduV28yTTQjYm95VDhDKEpXTmlWCit2Vk5tRmZ+P2xjO3QpcGk+bE91R2lxR2RQSVFVMW0oemBpQDRXdj4tUmw1NzlDQUYqVkdxfU41JHxFT0ZVdSEld2FuNHQ3PD5HUG56V09XCisqVDswS0pwOGNGUUJpYz5fTCUpP0UmaXBMZGh8bTFBPSlOJThgYz87KX1FZD0zKSRZT3oqXnVCTGlFdH4/Tj9qKE58cFVGRXgwdjdYbyYjCisrNGtyKjZ4TXo5QD8mKiN+ZCQ2PT8kayExZ2kmd19CSEczYVpfcXY4I2xWQXNOOGhGQnc8LXk3PVZ6YG4tYSVxZ0BXQGVZflF1Sn4mRD9JCitHYmJAeGtzaUR5eCpCKih9Y3FRT0hETT1oLTkyMGVucDtmZSMmYkhaZCNAfERNN0p0UHNJUlVofkhtWG9eSUxvUD5WWDs5c0dvVD57ZWs0CitYTlFTMGY9Ymp5LTU0ZzkhPyFUWlJ0cVZLfj9HOWBFSjQ7UikoJHIxZmVOOEU2cVBEYF5LbkNNOT9sNntyKWZnO2xMcyRicGV7Mn5zKE9DCiskPklJSFVmeSZPczcxXkxZMGx8NWwqKGA1K0IxQjdYaWhBUzJvSCthUW5qdSNtKk5GPnN+RnY7RiN1c2xecXpGZ0RVTGZSKmJCaFhaNjhJCitSYDVNU0JZO3kkNm9oIzhzKDNFLXglPFUwIURtQHU7VSlIZTs0XzdnZWI7X2xLWipNaGpAOzBrJGtVWn1Qb1h2flRmNGRFdTxvQGlKeTBZCitLYlYrcn40bT0pN3BucnpEO2dDfVppdUBlVShtZmFeOUZoMjQmbyF1ZkomQSVRYHIjcU81LUFWPjlVU2krc1d2QW9XTXZ9b15GZ2lUZiZQCis2TUUwKT1xKG0+Vmo3ciVza3ZHQ1p8S0JhK0VDKmRffGgteEBKM31gTk0rZnc1NXVgfD5SZT47YCp2TjxBRHlYQjBTUldyaD1mYSFTIzRFCis5bWhQIzlpJlFxQENuP0RFdXNvRX1oTlpPVlZaeUlZP1A+UiRVejVvPFF4IX17QDRAeUJQezR8S0lgJDxfZmdkLXglb0ZCOEI5KnclUEdACitBMU0qMnl7PFM+Ylo7JlR4QEMjczMjYzlwaFZyTlVqJFloOXR5JXgqQThLY08kLXEzYikpWH0rP2ZZYFA0bVo4bFFHRl89bThRRD8yekFjCit0VjZoUUZ+N0pOPFM/SFc8ZCpaYipVaD9EVWcqUjs0SmgmMFJYKnwoV20qUlNGYVV7TjxkbDFVayNsWTdjOURVMj1BSEleM1dLYFdNU1Q0Cis1NDJLbzdKMkpyJG40Jlh2MjFlMkhjUURTV0B9VU5RSzBTX1Nqa3g2KWBAVmBuLVJvZXM5I3FKamhhcXxpYlVZRD1BdnZZYD9DbEZIWX5oCitsSjM8KFI/X0t3LV9tbyNQVDJrS3I9WTM/QGNoOENDTTNIVUQrUTxoei1GWX0/SlZeYCFjJHI0NCplfFdDTHY9YVN0UFNeQHRQYk5hViZjCituKlVhJUBnQShaXntjVmtEMXlQd1RULSkkJjlhZyY5elJ2R2NLbXk0TTUxd3lYKVdKV21qMzZuKlkoJX1pQFVAYlRiUUNvYVpSNm1aQjYmCitzeEpWKldDSG9MRVk8I2F5dS0mSDhjJVI2QHJoRUA8bG8yVmc7dSkjNikrSytMdj16b2pyfjdecCk3RmI8WiM3YWlBWkFEeX1zPkJJWGYoCitOe3RNTmBUUFRqSGdUaitIb15lakZKXj43NStZdi02NTh2YC03bntIJXQ0Mno7akp6NShDSVlWI2thQm1RVjZpXkNhRV89U2pecWlzeHZECitpJD4xS19ac0tecW9RRypIKjNEZnV5K0ZvbTF2RWlCUXRzV20mKCRGdzlBakJqXmJnVj1HcXoraHpufVZUenZMQTUmJUBGWmJ+SmdFc2ZzCistTyR1MlFROT1UMVFQZTRBRVQ2WT13U1h7WDA9R0RXeFM1RSp1X2t9d1MjKyl1dTY5TUQpM1h6e19zbFZzR3NBPT4tcWNGKFlVMk5ESz1pCitNKm9hanQhQTdBPUFjUShLWXBnd3hKX1EldWxkLXFpQTEqZSVkeEE1STBjT2h0VTNDeGIpN3FjQmcwJVZReFY1ZGBAcChtRChKLVlzMU1KCit5Qz4+RDImWCtrPEtCbUE8WH17JnEqKip5KVRTJERRPFkwKyVwdzA2PyRpfE1WSHVUO05jRkllRz5idVg9WSUwRjNLQioyJGM0RGt3TSstCitGbzs+RUtlU2RsIU5Wbz97WEJ7MEpXelNSOTNaSShUdXVue255UGVre29Mb2ZoanAqUig9d0w3RTg5P1k0KUw2WDdLaUdhKCU8MD9OfFhvCis+dWU+UiNRZCF+VmJwYGxKX2RIbmxZU0NxeDNQbnV6aWNrTCZ7fmo5eHZwazReJiE/dGhBMVRvK3ZJSUo/NjZTck0wezAyTGo4bko5aT1kCit7V1BTfHNLY0BvQ0pMSkZaT2BgRFVtJi0pWH5BMntLfHYlYDJwWW1SJDwmRXBXUVNqYzlIdUtKZ25sZUxxYShxdlRBK1R9Nk1zKHpuUjtJCishQlFXPFQhdkUldXVpQl5obSNUanVQKklOVj8pYjEwUDw8eHh9akcxfTN9UGdLYV8xbiEhflo+cDt1Y1ZpPTQ/XnZBZnNpQChaOGo1d3BRCitfeyo1Umh+djRscWd0blprUTxIX05FdzRwUFhyQXxHZkw5ejZBSGBhcEBRbVorY2o0bmp0MVUrRXBUVyFXPHgqN1UmNjghfSE4dFZjYlBVCitoSj5wOTQlZn1Xel8qYHZXSzR4T2ZPVmZiYEVDVCRlOGlTWkVfV0oqdT97JUY5diF7KntWOz5OKkdicXNKbDt5MyFxUj1GaXVVMmVVbUohCit7WlUreWU2IUNIQ0wjdjt4WlNwNz83QWJGa294MGFHT3wqTH48MW1AeGt4YmxZbGopY0REZDZaP3V7QXlUamFmcEVTayZiV1JtLVNtJEgkCitaJWJ7eS1gTFVzPjtWeCY5T2RMUWVsUVYpZXhwPDJ9SUxfJis/SjN0K3RSPUJ+Iz90YTdqT0V7blBSSnQlU3hsc18zZUVLWC0/eDdAPjdTCit8MCU/JD9Bb3JLeUExZFVgVClaR01MQmVMMVdfVSowaHctWlpqNFRzUC18b2sjSCUmfCtAPmZuVzBRcWA8Q3tfNkBOeGAjayF2P2lCKCNACitFPDU2Z3UwP1l0U2EkQnV3N1lUUlZ3QzJXZXRTM0dLUHBgNT5RUX1naXJSdXk0UjJpUF51T1JFR0xudG8mPUg5K3wlZ3FvUEI+e3JvQXxaCitYdnU0enJtX19HSmRucjFMMDszaypWOUFHbz5TbD8rRyVNak9OTUUpQiswOGk5I2tvTk9yTk95QWlKPmtXVzwmOz5SeSs0b0ZsQEVlLTRUCiteaj5Ebz4odnJkKHVFMDNiRUNre0djQyk9OyNTO1lwMVlPeTYkOFhmVktEPjYkVFlAZyg5RUYlPCFWVSZGTFc+YTJwd2ZhcSF7TyQqKWA8CitzdEVkUzlRLTJHRGJ4O1U4ZEZ0akwoMClZPyY4TkVpanh2biFKbWJVYiM7NCM/ayEjTEl3YjFuWVhsaG5OfiVZdzB5aGJOeTEzNVMmc1ItCitwe25nWG9UQTxUT3A7d1A3Q1lvRThTZGdwQyNSKjF5IWZvPlFlX04lNjJIWDRsR3MpN15fbE1UVT1Ee0tSTS1VU1ZLeXJxZ0UlQU42KHxICit6KE0ydWIlJSFiOGd+S2RgdWowcmFtVDQ9K2xlRjN9JU9VZH4wRWckRlNUJE18a3lvP3orckQtUnBePVRIWkJBRzxkPko1QVZfMVIwcUMtCitIIWBXOUsyK2JiPjFoUEQtX155P1RlIzxlYFZ6fHFybDsoOzlkZilaZCNTWWJqX0xQc21mVkI+QztMcXczXypTRjFqdj5MPlJ1bUthZ2BrCityU3g8dm01cU42OTI/bzZLWDIpNCoxXnJ9Zm5WMFEzSC1+eX0qQmNHJVVpV1BTb0BueXM2TCR9NHM0UjktZWttd3EkPTM5NllBSzU3M35pCismNU5ue2tgOSZoXzQ2RG9OY29RYVJVV1FZfCVEOClYZmo+eG9AJitHO3k3JiRqZlNvYEs4ZH00WF5yKylFRUt5ND4hdEQqWCZIdHpIPTl2Cis7bSs0M3pkZTtBTFUya2IqUHpNSigpaCZtTmlteSF8TlpVV2FFMUE8fjI1eSlgV1p6Km4kSjcmclNJbUojQTF4UzdvXjU5fEJ6QU1oRU0jCitrY0VAdiM1SzBsIWQwSjZEOTVAJmBxbTQwOG9hWEtvaGJ6UTtkJWtqS2QyeCVwOF9vUVlKTEVVcnBXWE5sSks+SlpOOXloY35qa3RfOUkwCituTH5gZnV0VT9reFhmRFk1LX5GMClESkQ5KzxEeU5yU0EyeWptKGwpWWRMZmxTdUxWQVlNMil4LWxTRyY0b2srREA4dn5KUjNleyNyMSlwCis9MytpNmFebjhtS0pePCR8WmtZUyZLOUUyZ0MmRDd0V287KUdpSkxSI2tUOD9aU2U3SC1la3lnWikwNWV4NyR7cmQxS3Y3QGIwWGBONDxiCitMOFNBbT1pMyFqTilKU19GTWYoRERmdFZYM0A+UiQxbyYobzlQUXlFMDFwSDh4aDF8dyUzbFZCRTRYO15qZnY8aytOMXBoY3lfcXZoQzhFCitWZSRrck43YEYzNWFPRGxjYkJgTWcxdHV3Wig+KFE/cDtRRUg1a09ua1FjK3piYjNkJVU8Y3l2cz4jKEk2RmlUPkV8JnVnKXtpc3ttbGBfCitLTz9PbE1iWlg7SU9qNkdYdEFAUWxzN1JraDNjSSgyU0FhV2FxOHIhQzkzUkk/PndgbUdjbFRoYWQ1a1ApTFdsdS15R3BVJjRiMiRDblQ1Cit5ZSkhUWA8NjcwVjRIbU0xe2ohNnNtMCZ+K19KU2U2KzFsQk03aCt3PitxJl51VFMmWE0hT09ZKVF8XlNAR3xDTXU7bz1ZOURPNTNJeXJhCit0NVlxdn0qVjF0YE9abUwjbXBzbiQjNWU0ZWcxKGNheiMteH5VN2t9TiZiMHpodWZnVGZKSUNadUEleH0zNXg0QXBGfEIpNSErTDl6TV4rCitmakRaMjdMdjE9YSNAUE1pSG99NWxyaEBybGthU3FnK0khdCNSMitrI1RRXzBoPlcocVZuNTtETiRQUTRLaztDVVJMQjQram5RIyt9Z1RsCit5WnVVfmt2TU96S2BvST17Pz13R2tFYGRvOz4yb2xAX1IqMUBWUkh1SkVjQzlIUGMpOH08O18kOWFlVEs3c3NILX40anc3c1hOKEA1YFE9CitlPX09NjE5Vj50VH1ZJSUhYm9abkRScDYwbjstI0tiekZPb3xKUjFyR2xReTYjTFQmXitzMkE0YjFYNV9HQTM4bEJ4MXhSbFQ7eUpwUSY5CitsZSpXJTxxRkd0S0ZGcG0zI2QjKTxLO31yeXV9SmEzbXk0bXxLbWQ4Z0JqeCFpMDAwbFBWYWtObz1LeFhmfW12WFc1KCZUK0FIJVNwTjl6Cit7XnJgdjM8d2M4bFI3PENUJmJRSDZfeHhJNDshemwqMSRLfTMmWjU1MHdFaD1BaW8lKm5NJitGUXE5ejw2ZHtTIyt0PiZPbUB8LShBJnlBCitRSlhMKDckPkRhdTFtVz1EPUBVYSglP314Jk53dnUwNi1vVCowWlkyZ0Y9TG9ZUCRLQ0pBSi11NG9yR28+b14yKWtZM0pgMm1ePCNKRzZhCitZd0UybEx7ZDdeWUl6d0RhMmFzb1dYeGFeUlBjRGRNQX5xPSF9Wm50ZUpfRnstO0xiQEZiXmVSfGE7cHF9Xkttdj47T2NpaGVTJD0yKDhaCisxQSg4bHcpfDxaKUJTdSl9bWZvV0A/S3BILVI4NkZ2bzwoRXlCLWIkcm5paGA9ITNiK0FZaFF0WkFfPEJUYkdSey1ASzM3TSlAfUxJN2UzCit0ODE9KDJ7REgzUF56fF5RVEtZentWQWVCY1psTWo+VHFWemNfOFR3NExxa2QobzNOVEIzWD5aWTFHOSopUzAqNXZGO1ZrXjF4YXhQSSpwCitnNGE5YTVPZGdrMHN8SkU3OyEhUDZMTkQoTkA9OVpHVjhEaTVgPHh9JW9qNk4hcDxxcT1IRFEzamYmO0xucnt6X0chXjwkalRhfkVXVU9RCitmM0I7RiNpXkRWI3w/aUUoK1ZyKHRQSnVVYm18MytaOW0zRGRBOW9vWmx6cnRtTFVRZysqRSRsZSokMnx8XmFYZmU2dD5BfkUhK30pS3JkCitTWFFARUZAQHM0UHRsSWFFKUpkLUlqWVBnOSt8P0ZEdE9DKXcrMThVRU9GUHRiVzs+fWNsMkNCdm1BaHwrIWIwS0NONSY+fXBWa294LURaCitjX0tVcShHRGxvZGxUWVh8UkxGQD1obUgqaSRESTRYfCZJa3FhX0YpQ0glNGN7Ry01KkpWIVlVT15mJkV4SSgrRyY3cHN5elJ4MXsqfWpZCitZezZUJCRkd1NJXj1vUX1fRW8tSThGSzNmPlJ1UHFlKEZ8R1dwbyhlP2ZYRXlRVWRRLTlgRjZRO053WllhKFNza2RpeTNgdzsqIXVkJXFACitpdWppKGMpX0ZxKnJWMzExI2ZpWD5PY1I9RWNuXmRLR2U0Pmp3WmVXM3h0KDNOR08ycSNETU5iMXpMbXVmVjI3a0hAS15DRk19YmNHLVAtCiszNFBOJGAlbVMmR0lIQUlwI2M3QWhHX2otXlZvKSpeZGA5KlIxTnV+OSZiVWVLbTVTdjM8YTlRN3RMcV5Sa3p2REMld2d6WUYlO1IxKyZJCit1cDdhPy08VFpJNStDVWNiJEAtanw5dzc9WHY3b2RfMSMwSVJrPCZHJDVhdmQ+Pms+UnQhK2I7QW9keFRvZDtTelEpNlRXPzdnY0hYfnB5CitscSFQKk07a3JFanNkckw5USFxZDckb2ZrWHhEWCQ8cklNdkRKJlQhJF9+OUwlTj1wbU8kNmlMOyoxPCMmQWc8ejMydl94bmtkRSEhQE8/CisqWnRBfnZIKm1PPWpxTClRYzJZMl9ORjxOYTQjTiM+cmZPSzFXcU44QDxFaDQkTDtTPl9sbmNRKnZQeDVYWHMzKGJIazNNem4xV3VWYmlfCit5KS0mUik1Rmx7TWJuTkhydVd2YjlwMnhXcTF5N2xKODloP3Q4QmgtOGZKaiY5XyQkKlNkJjRXYCpAJD1BbSNNVzVgcU1uWE9PVmlJemgzCispNihxKWptOU53aVFuRm9mUzdOd2tLeGl4THg4SDB+MmJOQS1WeU47aFQjNG40T1lLYWc1aFlRTCNPJHMyWiVmZlFzLWN1cU4lRzJYO0BaCis2YW08fSRJdGFFX2ZYPGxOck5eIW87S3J2UTszRlMwQno3ejd8LUFvT3M8dlNoYzgkYFVwMm93KT5ecj89T3hvJHV6WEx5d251JG1tZmFACis/TlU3ZXshKlRLZl5nSkNeQ0lNLTZwdChxN3UqNzVYKD8rd2ZsdmFuQnY3VG9JdXIrcX5SZGZjWTA7THJeKlRIUG9idmpqU3lnWlBtbGh1Cis3cnlQSSZ2V1pfPlJ1bmgydThIPClSclhgb1VXT2tza2g4K1grZ2IpS3RNdk81fSNzbDJnfnNHcTA1NVVlViZZTGBeJj9eOHIycWVLcGktCit8JVVXJjs4Slh8WERqYmd9QTleaWk7aGs0IztVVnFzK0NaN3l7LWt4VW1tQSQ8YWdZPGlDfjlgOztDUClMK0dCZComKmYjSGB5aV59blJiCitQO1VCYlRte3hpXykla1d9R1BjI3ZwJT05aWZ7RX0mby0rTVQ1UEZ4O0ojKXNlR1FKeGdJOTIwcEZaOzlMZGZpUWA2YjE+Y3lnRD5XPiEwCitAWFg5M1U9PEFqS08kajlKK2kkOV54RChPTkx2bk9tUHhfaisoclg/ZjtAa1kjI2hoaGVhZHsyR1hUJSRQU3RWOzt2PXtYVVNEUnMkfGlBCitLdjVUekV8JmxLOClZMjQ1IyltV1Jgd1MhMDh8OFhkanV4eD85dSRjX2g4SUN9fHM+blZxLTRMKjQ1TSRyezVOQ3IrNyRpcEleY3BNY2gxCitucnY2eG59Zl9BYEk+bFljODwzNVJ2UCooPyEhfFo1ZnRxIT53JEE1aVJMdTZXJUMxQjlASjVkJUx+NC1MemwoM3oqamMtQD4+WENCSkBrCiskPittUn5IPU1EKHJ9dStUJjVoc0dhQ21WbjItRVpCOUJVRilkKU5FNlohUW9DZ31jc1hRdW4lV3g1d085IX04JE5VKyQre0t5VnBlaSFqCitxfGY9KFJYX2V5QDEqakFeQEBgQyZSb2tgdjZ2RiRBR2lxfV9xM0dlV1JLSnQqYkkpZ0huZDNkOXNNZmJ2PmFPOHlINjdGSD0rZ19CczFuCisyVG5AMkpRdnMrQW9PYXYkRHZ4LVZiRTh4Y1U2QXZhdz17cWhwWCljIWgtWlFyYldqczVvUTBUVipiUiQ1OCFsfjVqeGJJRitWXnNucW9MCitaSnxsNk9rYXY8TlVPNCteYT88IVYwfk5YJSEkS0wtWHRkJWRhSEJIUz5FdCRsM2V0SWlXKCpjVTZIaUB0T0JMQGNsVHtGcyNfMHJ8TjU4Cis5KlV8eVJWOGZqO1ZCaEYoUjFUfFVxXmFTUXUhckRiMnJ9aGcxWG1wN2ZrQUY2M0xPSUFEOHghZF9iQk1AUm1jYkw+V0YxNE1jTDxNN1pZCitAeWthJT5lUnp8KSpDRSNQdTwoP3BVYkBlfHZ0TVlVak5zcm5VeDBkUjdyY15pWk1OeHNGV3k2Y19Ye3QxPmItYkx0O2hYYjl1b2koVFFmCitSWiZ8UTtAfDYtOH4mWG1EYDtEPT1NSWN+ajktUm9mOTktMXVnNXBiaTZPKWRXa0p0X31fT3lffiVVd0wjM2B+ND1RSjstTFJ4Yip7ZHVZCis9Xms7V3JPaDk1ZypyTXtiZj5Wd2piKDBAbEppRkk4WXhTRT8pdHFjRjE1OzRxKX1jKTM/aVBvRj94Y3tBUFZlSmxHcmI1UWYpSzRQbTJtCit5dVAkQzh9eGRpP0dWSnstYl9hKjFoSkk/VGNSezBBeHJ3QVVDflZacn0wXklaPXI0TDYlcDtsKCFzME1aSzIodSE3fU56d2k8WVhpeDhZCisqazI5PChHd3xxR2s8Nmd5fmZrbXI5NXpaWmBkST4zPjBqbCpIPj02JmJMey1vSnlDKDJTO31LRWslQSskS3s8b3ZUQChXM2tITk0hdm5jCismJEAyTzU2cWgkSit+YjlwcX1UYWhldF8tamZweno+QyVlS0NgN0N3X2BGNHAjTl9JVlQlNDhoZFpyPFoxa0FvXlpmTWU0JEMhWVZjZ3ZlCitxSD5LQmp1RH12UGpTWEMyUCk3filETFREQSZ4WDBVbSRyMylVSiNUPGY0PTlILWh+JkgyKT0rb19sSnxISzVfKW1WKUNYY1dkVkF2Ny0+CitiblR4R3g4RztOa1VqN1ZCQ3BWNm03LU5JaFVHeCVTJkp5Yl9TdWE+M009RDluNVFGMjZxTXk4R29gSElEIXElI3ZKTnh3RkMwNTVzb1BHCitJQWdRNm17WWM5QntUfUtgS3QjdlM0VT1zbzFBfXl9IWcrSEQ+aSpHdFgqelYySiNpPk91Z09gXihSR156Y3B8e05LeTNVbShjdz92Wl91CitfdUJXcHg9RlB8N0hFSkptaSFmZjtDWVNtcTkjY3RZNT9ASCglRHl4RztKUVYqblNqTyo3Yk41UE81eTtkLWw9KD4wKjJDMFFGKiE/MllCCisjYHRJPz4lYWAtaWttcmRfb290QFVPPVJ1JlZHTipGNlMrSk18QWV+K1JeRT9qblZIbE1uSHJvUVUza3BYK3B7RlF5QXBaeEtDV3J2OUgzCit3TDw5PFZrI1N2Y1BBPXx0QjJYUWgwNT0qO2BtTEUtQGlVITFGVXQ2RFhDci16ayVjbkRDKD1TfE9pSFVhOCNkZEZWNCpTP289c31tb3ExCitIc0c3MG1Ue3hfOypheENuKUZZTnxzJXdOczFVX1RAPWdFNms4cEE1QT1fd0tnLSQkKUlLTU1BU0NJbkBSR1gyaFFVLXpxUCtRMyZeOF8qCis4aEZfTyZeWSY3Ym5nbHV2KTM9d0dJVEV1biVLSCpLKiZ4JGp0KDZIPGBScmNOcExpM2V+Ukd3bTB1IyErNGd4QHprJm4rKl84bXlyYDd3CitwMWJ+bTFNNHJkezAtZyEpT1MrZUhUe3dWan0lazhING9pa24zaTZTNHZyVlRtKnBkeEMxUzxnb1Ima3d5Xm96biNaK1VJUE0lKiVyNClFCishM2FoJW1GQXFicWxzRztOaWpweHtwUEhNKWFFUzVjYXJxcnM5KU9XNmN1JUN0LUFrYzhlZHZxKDRLZFIlKV5ie2FWI0NTcz02YXY3JDImCitZSE9hX3RqPihrM1BtQnp+eGNgQ0s/MzRZT31vJT1SU0pwTXlAZGtuRi15NStoMzJhWmQlZWQ5TWUqTDEkTkRqfjQpOFZ3dypyNE5NNWNZCisxaW9GQj1SNlRNZyl6NnE0QHFuO2ZFZkladjtedn5yRUcobFJWN2swM0kwP3Bib2hPJCV6V29uT2M2UDxiVkZAQD9ObiNeZHAkWihvMV4oCitYUyU8KEolaH0mNDw1IXtMfFphfE12TDlue1ZJJGcpaW9QJm97fEYtb0U/ej1FSXgqOUE5YnMmNnwmSnpWPkBZengoMENja2pQeyE8WFM4CiskWElhYFl2fmJnVntRdmEkaDVPZEMtIUZmV3VGb1I/PH1SbFhxSXNTcDJlTmE8UU1eOFJfT0ZuI0RMb01AUXJlZmorIylfV3RwJXlCX1liCitvVm5YQ0B4bT5LJl43VSZ3e1M8SiZFRlFPWmJEVEhnQGtKb0hpMjRAcCk+Mn07M1oxTFNtUzQkJUp6cmQ7d1lWWmBhb1Q+PkU7Z2U9eGNrCitNZFAqPUlFVH52dml2bV95fmpFY0FwYUIrPnpxVCp0NGdXMk0wbzVqcnglajtXRVJqWTJ9T1khWERyMGVxREUpSDJPPzxEYW80clIyOUlACis/OGc8RlpoZWZ8eH1feWJNfVpaR00qIUc1NHo1bjBhWmVoNGRibCo4LXZ1N0MzQXt1QCsyV3ZGOF5SdGpuKmc7MUpafTIqVG5fKCgqKExBCis/PlEydGVgbG9gJFl2SF5eMWNtJVhebk4+YWpSfHUpTTNzOHpRTFFVS1Y3N3lxMEF7NnhBJHQoU3B7bEpOWmcmUXVvVVMhTXJYcz9vITxkCitKJjVXVEAlU1M4VVBLQkRGTFlzQm1SQjM3M2ZVY3RvYXdyNXJfQFZoJCR+QT9VZHY+Y01+d1pkND9LfTJJZk5jOUZNOVN+WkdnJExWalVFCisqNEVLcloqTGBTcGQxKStSXmRqNns5d3hNYCEkOHU9aWNuKF83YzlNQ1UwbDR8cjkrOD54WF53SiZ1dn0lNUdkKkg/aVgxPl9icnUtX1pXCitNdHFGYWNuKzY0KCk2bylKPm8+YFJNRllnfXFZRiFKJHR5SD04bSRIJEI/UzdGSlpaY2I1emgodWtzVzY9QWc7aVchPWRlN30jd3A2aGRCCis0VHNnKyY/ZHFKKD17dlVjcXYhRGFDKmBLNSlreUw4PyN4bDV1V0hQSjhrZFRGZ2FIZlg3WkRlUFVpakVmNDlDMzNzIVVOQDNLZFdJUyN6CitIRE1+NTVWI302dWl5YnVMJHJ+ZD1DNkNQR2NgaGQ7YCFGVDxafU8manhpTkAhV0BjJFlIeiRtbntTKkBxPGd1ZntWcTFPTDJtRnd9OCRDCis1RnQxKTdvPkU4bncwPVYyWiVURGopSEpJbypUamU+JH41Um1NMU13VEFzOCNYP2ZEfXF+JUc9bGFfO0w0TyRGWjN8YjZZM3xqMFdEPiFmCitXSjdfcypJY1BhKUljWWcqSWNZZypJY1loMCl9K094I2lZZmUjaUdVU0pXQE94b1FWKFd6SnNFeTtMTGIlNUlaPVM2ZFhKViR9OXNTOEkoCis4I2E1MzxOZzV2WF9HKDR6TWpwdjM+NVUlYndYcW1LM1N8JS0lbVB5TmBXenNUZm5MSTBMUU00I3A2ZktHdGIrMjJvWmJpJFlXem4pfFMrCit1LXBkQ35Iczx3ZVZqWEktP29YbVFjdnE2SVE/Sm53YUQ9TyhDazMlRiRmZ28ydX5wZEt0Sm5GQCteZiliWFhyWG9QaEw4S0QrKkA2RVkpCitFNU5CMENEVk8xPGBOIWk+IzFpNEtrJHh1bm1COWtrdHkzUntfSGRBViVRMjJWUTdeeCZzcyhBZWpLNyNDXz5KQGxeTVZ0YmxGPGYqQkNPCiswTih9RkV4PkY2SFZkIz56XjROSTU9ODRra1JKczNMQ19qRXEkZnp8ZXZ1Vnx5Q0MhbXFNYVo8M0IzSGticX5ETno9STVZelFELX5KZ21UCitEMl5AZ0hURX1yYXlBO21gWFgxbWJaJjJKQm9jI0BzV0NYPXRMNWV1WWdha29va08mTnQpal5TTVBedWJ+c3M7b3E/a2Bjc0FNSmpUNi1yCisyZ2JicjhjZj1ENm96NStCQVY1b287MT5oISM7RFpvNjJ1RmprRj5wNUd4YkFoa1NUfCZhM3ZoI0xuMVh3MmdJclFAe3hVZGM5T056bkchCis+TXsyWDE4R3o2QXg1TDc3dWY+PTVedHk1aDZFMVFCNnlmbklQKkg4P3ZOVG9Ne3dtbDQjejJQST5IdU84ZjY2UEFoc1otWitiMCNxNTRgCitOejRGTyF6Rl9GOUppXkw2R2hibElCNE1ETTshRCpHfmpASXN9e3tJSUl+USgrO3E2YTE9UEc5MVJaRyNKTWohISlOSiE1ZzROQ3BhZTk/Cis7MEtBfUFpKV5tJlkpJkhEMkAqNUZNflM1QWQ0Rm1uKzRUaEwwTUx1YCUpWnltaEttVUFxNX1nYCt8ZntrUWZPdjc2R15xVX41MXZmPjx3CiszcnZPM1dxSzRwcmNXQGEmb09oNXlAb1o0Z0FDJEhSTVdhRDZYaXk5cVJOZSl0Pzt2cCtQXypGcXt3JnU0WGB5TzQwM2JuZWYxSkRjNVRCCisqe01RU0s+Z3N0LXZlSVBuaUpPcD9Aej9jQ0sydDRgVktBenlIVlpldDEpRHk2cDgyaXUoS0ZkcFJaJFdWSUR5Uz9FRHNGP2kqYFB2Z2BXCisyc2V0VT1+SCRZPSlIb1BiQ01tP2sqUjlLPkMtX0dKKEZFWnJ9WE01O1ZFUTVjLVkzcl56JnJgditWRlRwdk1wZDNEY15nIyg8NU5aVHlLCis3aTghSDt1Nm1QMnNiMnpYJWNPKWdaJCUlT0BhN3F6RDNKOGohZEU2YS1PZjVTO35+TFF3RCZscXY9RiktbVFpLXU2cF55bW5CYjdGMWRWCitidjsze0JCO0whPXdwQnNnTG8+YVRuJm96ZzNeP3JiUigjazQ5V14pIzY3PzVtanZ+Qkt8eC1TeWI1WntmJiFAXmZnNisqMT81ME57WkNOCis5Nkk5aiZXaERYQTQoZHBQTntTZiFHRExpcT9pV2QtKUZMUV4yK0FJVWw3WE4rQVZ9Pjg+RD9le0FFZjFqb09fVGU1MGM8UCFhR1FGJEptCishcDtqP3RWJFBYI3ZBUHBPMlYxcztXa2p4QkhqWHwwKU5jSUtFekpSPzNgSnluZCF3SXE9YX0jc3g5ZWtGVEFUMU41VFl9X0R6KX1QSjlZCitFKVI5fHQlJFY2Knt5NFFPZFZMPDcoXmlEM2hMOFN9aXlpKGRqcDN8THpMJUw0UWpwcyM/TTFWQWM0UDYwZyVQKFRwSzIwPzQ9RSomcUBHCitQbUJyWFgkPkM4amckd18yamBCdkVWI2RhTkh7PnhDe3lfZzNgcEd6JU1NdUR1PDhBYTExQ28xe0MqfntObDU4emxhWGB6Sk8mMCl2N0BTCitVe0huPHFfbCRzUUlKdnpAKzNobkFiYGswOTIqPnMzQ01mUW93VUpjPjMkSSUmYkBAa1N9d21IJkdEeEgmPDhAfmc7KEEqdnRKeEI7dCl3Cit0Ml9MfGJJcEA3QF8kOGJSMkBaRyEzRj81YjF5I3tPVTJzcz44SSpxbmxAfiRjRygzRyF0e0A1dCN1ZDxsU2xpI2hYTCQqWjJMdWBVcHJBCitofSY8X2dxZ0Y1YDZ1MENMJUxGSWY8Pm1KbXoyTm1sPFpGZitxOW5faHsrV3JuY09aU1VSTEd9WlI2KT5pTnFYWW1VLX4+VSFFfnhHZTNMCitTJmB3Vihoa3M0ZmVOdjRZSGJ0bktnTXZ2anxSNkRqeTBPQzJQfGYqZShsPE8jQWdMN0Y4PG1JTWVyQWVSQSQ0NDZeQ1JEJEdMdG5LZ012Cit2anxSNlNPfklaOSQ9R2ZUNGx7KFYjI3lPakg0JSFZe316LXZLcDUqPUE2dThQc1hVe1VzMGhFWnJ8TU1VYGV5Un5lTDQxfF5rMjY9a2VWCitrNyRseVFUIU53bH1iNGBORWFuZEt8TXNReXlxOWNnZEJFfEpfJiQka1RESyYwUmFGR3ptdVN4VEV8PWQxbSpWMT1sITJfZkduOzNXZW9UCislLTdoamw8eX14RjduSGdNZz42Qk5PT1VQJVhuIztHNzhIZEFyQz5uO1NpbkpwQkNudVFDU3V6Kys/QUswX0EwMlYzZCpSMEdPRDFBRHlYCiswZUUydG5YMGFeO0dxPUZLdDMzdiZycE1zPVprV2g7Xz8oeVE2UCUwR0UxX2hOc0xBZ2tQbiF7NWd4U2tSQVllel5JXipsaXBQZiVWSDxtCistZCNuVFQhUWE5MnBTQCVpQnBYb1E/V3ZWd1krcGx+SDlUblZhREJDR3xwYyFCQXJSd1NxcDJgV1V3Z0ZmXyZVbFI2PExmQj1LMiErUy0lCitWOG1WVU1wVj81Q05ue0F0KiUlXjZFaCpKVislK3RhfjJ0T1VQYVpJbCE8S3A/byFERlBzNyZnWH0/MjEwb3ViJWd+P248X21yRFExPFRxCitYN01aX0E7X0V1bmUhbEQ5Ji1QMyU4KXtHPEtmcWs9K2VWJjEyUCs9eHJlP3A+NyQ0cHp1fUdhYyMlUHArZCo8V05KMGwwK2FNUGo8ZHVVCitJYWdnV0BhPEBUM0hifW1QPVRHNW01cTc/bHVYck9iTDFzMGB0T29oaUFifWRCT01fZiFrT21EaHBneyZTJGFlK18mTEU+MXEkel84V3NyCitXMUpCZiFRKCl9V1hXRXEzQlZ2cXcyR0ppb2pGR3hvTyQralJ6N1VhbCtke35lVjNsZCpKeCtfUisjYSZFfEJodmpNZWs4QkxPR3ZQTkw4CisyPGlRM2M3RUFnZEgpbTRjKkVrVGVTTk1VajNPSVd2YmQ9UkxwcEMxaFUkKUUjNzRmKCVRTHE2bV5KTDJATlh0Xl8laEFSUTg8THhUS0FrCitra2xMODleIXxhdno0cDUkUyQwbCV6Qyo5N2QzeDJ5emxaUDluJWoxV0FZPj8rXyN2Zn19IV9SMHZXREtgSjNnQXc9JVd0PylzKlV4YkteCitMNjlOeyk0PkxacXpHYSZlJjNsNXJVQz1wMmpEKG5fNXJSQkFic1JAa0MoJjcjK0czQzBKI1VxSndXYU9CbzgyWTBMY1Q4OWlabWBTX2Y9Cis4ZlkxU2k0JHlQZEp+Vn48QGU8SklmSWJLR0lpU3hgeTZQKyoycyVLfDBlWVZMRlVBKUg0TzM0Qm1wKmpxWit7KW5xeChnc15qPFhHOFgxCitqJitGVFc+UEU7JFlHdD9DQmNRJFVnRlducnFpe1NBJCZ9ViFlblN3fE1MXj5lUzBnKD1mYlU+czdBe2BMdkM8aV49Pk5HPV4lM2tJQFVpCis9Y1ViYnpHO0VGRUMhRDhLQS18M25gTTdIbTNUKCpjX2YqbVNfODExMjNYPjhRO0tAR1pKdTFQZUFEdTwzd0oyVyZjRSgqY19mKm1TX0ExCisyIUc3PjN+aGd6S09+T01YRzlGPTgxMzd7VVRpZT5oTzlUe1lmWndLJmI7dDlaPjNrUVV7YmVwd3QxUzRrJmQlc1JLRzRjWEF1d3FXZVhyCitwd3QxUzRrJmQlc1JLJEtRMGpuRTJiNE5ZQGQtUlkpZDh2d1A8NFErPDlnb1gjVi1MPjJkRndnKWQ4dndQPDRRKzE1X1FMPkh0Ki1zNShICiteMGpkc0FiJTNlXlIyfG5ZYT5iQTZldnU/bF47OTA8KWQ4OyNjeSsrNTE3MDJRPlZRYFZ5Z0lJKHtIM2tVQz1hViRsel92fntVVEVrPzB7CitUUFUzS3R2ZlVnNjU5cExNQHRlQmpCbjJ6QDZfKWkyMVROPkJxbFE8MEJGWDlCdDRwP0A7dklCLTRGemtSfjJNang0KmE1PjE3PFJ6MDFCCitNK2k/MHtqJXdmUTcmTGlkWUlUYG1QTzE8TVc/Y0VHUiRoOC1+TWZNRXY9SjdDeFchd3dqQnpfMF5gOXJ4dUZfeXlmQmtfNXtSU2EhZyYxCitCTStpPzB7aGgzX0Q9aDBtQn5RXkFSSUpiXng7REdCTGYyP2xBd3xaXzg5ZHdHKm5IUTA7OzVueE8zalo2YD1PTER+dEBQTE90anY9Z01BCitBbmdRYz1sIUtpODJ5KDdaNnwwdUxFOCExUFNBRk93aUMzU0FuZ1FjQ3JDUiUrNm1INWthbUshNlFySGJeQiE7ZUI/O1B8PSRNM1dDd3gyCitNK1g+JUpfOyRqIzZSdz99cShjYGFhNjZ3aV5GSnJlP3pvV1IqI3ZTWWtVTjNnM0ZKOzdjUnJuck1heENZTWEjdGw3Y0NZbzdBK1BuN0E8CitaK2lzSVA+YXdte0dmIXFuP1A5UyN6eGY5NXBLPCklYEN2WkVUb0AqLXBubHd3QUNDJT0qa21Be2RiU0k9Y0E+OWUtUERwb3BKZlZFUXFJCit2bGYmNU5oblpfJXUxUnk0YyliJjYqYitAMFg9MWF+TDZKSGchdj9vTSFiZzFaeWtvIzVeU2NQRSVUIVEyVnZQQjNAZ1V5NndsZUBTcTZnCisxWnlrbyM1XlNjUEY/eiFRQmImUEg9YUV5QSN9PFZEMUVTUGVTdkFiPzA1MmpPcCV2NWg5cCghbl9tYW9pT2kmY18rKn1WY3JTelBNQ01YCit5YzZifnU8bkYpQyMqWn4hez1ELT9pY3hpY18rKn1WY3JTelBNQ0xrdjx1VWdmYlJyK0MqVjUpLXdGNm1mT2o0YWRMT0Y5UihIUzE1OHlpCitpLXdGNm16O148XjZZIW1ZPyp4MSY7NXp9fDNIVk47a0hvYElvYTtQeChJe3JSYCRjfG1QNyp0aWZiUnIrQypWNSktd0Y2bXo7XjxeNlkhCittWT8qeDEmeiZpb25kRilGSUcweHBEUVVteC16O148Xl5SUTQkQypMTyZlSVBkPUBDMVA7MnN9YUgyPzk/TGNwZio4cUlmb087fWVeakFuCisqaSVDa1EtMjswWGR4NU97Klg2OWs/aEBDMVA7MnN9YUgyP0VjJTd6JEpUa3w2S3xmaFB6JkxFczRqUFlgJjV6IUw8WEFuKmklQy1nZ14tCit3RkxyPXl5V0JeU3QjQSNqXj9oUFV2Pyt6WjNlTShDPnRQQy1nZ14td0ZMcj15eVdENlopT2Q/fVVDUSlIfX56dzJ1TXFldnVtSmNTNjR0Citga20xNGdubFJWSkU3a1J7WjhuMkxjYklHb3pVLXVla2FzQiYpY3UyY3M4Tm0zSD9zIWNTNjR0YGttMTRnbmxSVkpFN2tSe1o4T2ZMY2JJCitHb3pVLXVkZ3BvailmQ1NyXmdFJjczSD9zIWNTNjR0YGttMTRnbmxSQkl8MUpiXylmcmcwPV5VQW9kRUFWX219Qm1YUy1peTE/SFc4a3c3CitfN0M+cD9iMD1eVVFvcStFSWQ/KDtMMHBBSnVQSm5qO3ltUmRRSmErYWEwcEFKdVBRWjc5eUEjfTw7TyshPj1nQH48eyp+clAzeiQyPit6CitJQVJGbjhYVTdHaF8rVSEoQHlvIzVeU2NQRj96IVFCYiZQSD1hRXlBI308O08rIS1DencwSSt6SHsleTlnZWArV2pJbWtuVihaQyF7K2UtCiszalNWSmYoem1DIXsrZS0zajUmO3FafWBlVGZDajI8RW9tX0RqLWhnM0NVVEFERE4teWM2Yn5Gejx3VUMoSnV4LVU7KGduMExhdTZWeyF1Cis/aV9LQ3hCWmZZY18rKn1WY3QxPkYhQlRRUE1DTVh5YzZifkZ6PHdVQyhKdXgtM2pZWFNhKihIV1E5NUhldnUhVGNZMUZAYFFpdT47NXp9Cit8M0hWT0hjTEtmPkBTVDl+MWJpcEpJfDFHfkg9bzNrejlpcn4wcEFKdVBRWjcxSl9ifmcoQz50UEMtZ2deLXdGTHJ6O148XjZYMlp5QDRPCitGKFVfYHJMdjw9YHAwcEFKdVBRWjVwejd6MUJmYlJyK0MqVjZfLVU7KGdTYS1zQDZWe3pgJE1ZRGA/aWN4aWNfKyp9VmNyU3pQTUNNWHljCis2Yn5GeipFWUNTaCQ3X2Fefi01LVRQVlYkT1ktOH5mUylCMHU9Y3NiTis4VmN6TVhfV0xLd0EpbyUwSzlDIzBjTEtmPjtHRj5QeWYzJUhlCitzO2dlNTh5aWktd0Y2bXo7XjxeNlkhbVk/KngxJjs1KC1pa0s2I2hDdmpteXk+bzZwaU9LQUtqbHJBO0Juan1IZmJScitDJThNby0zamhhCithQ2J0dTZUK1BrP3Uya0JnZ2ZWVGp+QmxMKHcmZypnbWZwUUowYVooPFczLVcwPVd+Jm94dHFgWlYmZSRnZ1lWSjNFfEhCJWNuNHpGQTM+CitSTk93Wkk2VmpjSz91MndGcSZwJHEzRiVIcWNTNSltIWtyTkFnbTVRPm4/byUyT1l2LWl5QSN9PDtPKyE+QyU4TW8tM2poYWFDZF5jNldwCitFUD9nVm91bV47RFQzRmdrVkZaSVZ6Y0UzbXh4STRrITNHUG1DY1k/YlUrQDBYPTFiNjUxP1U1aWEzLWtfcnFXQT1PPWkyQGJoTyt4YmteCit0V2NfKWZyZzA9XlVHbyM1XlNjUEY/eiFRQmImUEIzP1p4ZjlIdFZENE9Uan5CbEwrQDBjWGVTVUN2ZzFaeWtvc2pOP2JTST1jQT45ZSNQCis2JjVHeEQmI2k1YmoqTlhjUi0pe1VTc18/Z1ZsdGtVSyUhM0VFRTNjN243TXFANXRgMVpnS29KMy1uQihvVD9lLWR+YzZxM25KVUJHN2glCit3aUMzU3B6UT4wQ3Vsb0MrNm1INWthbUshNlFyRlc/RjRCakcmXkctWm8qSyRCdmQ+N0hhZl5qTGJjUDJMKDM7MU5nKFk2WCh2Y0tMRH50CitAUExPcyZ2bEUofnZGajFCaz0tdnMxbDNOY2MwI28kU1NDVCszRUVDKmJeQHsha2V6XysxWXs+NUl8MTFWJGo7YnQ3VXJAME1VdWVTM0MyCiskRmIlTClHZTRYSnRfISM1e1VZK3BqZ2pYbExJXm9wYHVnO3JTVjs7TC08T2cxekBhaENyQyNYNj4pZHtMalA8NFc7Nkk3amA+TiRNXmEtCis7cVNPeV87K0YtRWNiTVNjTCgzN2J5WGJpJD8rRVMrSEsxV1BBR0l3OF50aUIzcCNMWlRCQW9zajVebyVoRW1jRTg5RUxePmhUMzZWflNiCitWOClsPDNRP2doOyV9djZCMzx9PXU4akVGZkhLZHlmMmw7OT07QDRJPkZLam1RSnZBZn42Qklvbll3JU9YdlBWLX1FT3NMWDJTMjM2b0JrCitibXIhV244Tk5DQSVhYU9ZJnYxbjM3YnlYYmkkPytIbDQ4UGdpUi1HSUA2bSU5NGN4RUZyQiZjQkFDTU43YUBYOEN1fS1sKCtRaFMqbVQwCitDNkU+WiY+NFoldVkmeVp3MzY0JjFiYl9OWl9hIUtwIWsxeEsyYilmPiY7JXdYZkk4RWA9bmRgdnEkNllzTn1XKlpebENncUNReDxlJmM5CismKmQlT3IxczUoS18zOTMjfGIlTHJCUkdweWUxWFg3YHpzT1lEOD9wcWRQRWQ4YHpOOEtWKiE/MD9weX51d0N6THYmKUNyKFkwQ2ZWVzZGCit7OCs+STZfSGZJMCF4MzZvQmtibW4hPkZNYkpaSSRfZlpuQC1xdCFsbn44b29NYjxRXjJNWkhsNDhQMzM1I1VicG9hbkZyRHxNUEZURWAxCitXK2V7SSRfZlpuQC1xdGZ+NkJJb2U9NFNOR0MpKEE8K3FtUERwZUBxN3hGR3dLKmFkP2AxLUc2RCp4ej0+JHRCU1VTUGQzNkBUPGJiX1Q1CitFUytISzFTdSF2RmA8VkU7Pnl9fXVOYj0/Rk9ubntGPkUpISY+aHlaRVlzPmY4Z2JIPXNaVWpUM1hqc1ZyKUF5YSNWLUx5Q29ucEooRnUmCitzQD1IfkgwYGRjcVBLYjB1cSFTWElrbSFVJkNuUCF7KE9HJHE3cno3fG9lPTRTTkdDKShBPF93dlBLYX5AcVoxZ05LPEVUUUNsRVR9JmsyCis3e187YzMydFF4RDx7VVNlYj0hOFFqOTZIT305cWIkLTAhQWs9SSlUdlg3bkpkdWJIQz4wS1hrRDNXTFVNQTFXVFYteW82MEJZJnYxbjM3CitieF5iYl9UNUVTPXN1ckJleDtQTUNEVXEhVDhjX2EhSjt3ZUkpTzNINUokOT5EQG9DeEFLdSlDcilAT0hZWDxmS24ldkktJTRGckIzS3tVCitjMF5vVGh7JWFldzV9MjdKeGJkKUNyKFkwQ2ZWVzZGe0E/PjRaJXVJNkFANjM2NCVrYlk4Yzhxd1h+IShnfjRIaDsjeUA2QndQcT1tYlY1CitGZ2soSjM0fjZ5cXB9QnRQOVN0JXpRfUZnc0MhTGRiT05JajdAZmZBMVYkJD9JKVR2JWo4MCY1MC0rTktvan5YV0xNSVM5ZnpXdz5uS1R4Cit4YCRlMzkoRnUlQlV+fmViNkJzPWVYTll0e3EhU3tZcURlP31MWlRCQW9zajZmWnU+XnZZZUorR0JBcFFGZ2goZWFJeG9lXnc/VUZGTVchCitYR2ZZMWVtRStCTmxwOX10NiYmPzZCVFEzRU5FO3d8LXAkaVVPYU9pP1Y3YVkzYSY7QEBrXztiT1p4cDw3OVhtLSUtcHhOZSNuNV4jaXIxCis/cDZ1Sm1LJDdEVCFyKGdsJCZoOyVgdTNuRT5SPW1KNik1VzBaUzElJDVxJVIjWUwtUzY7cUhRNGtxPXdyfndwYnQpPHFaJGU8VTB+P35PCitCWG8wenxqU2NFXnVAYD8+SzxFKjgpb3lTaH5RezEocShiYmIrTXtFTH4zQHhNO2F9O0cjdikhan10TF9+QE17ISFtV2hMQ2NfSiZAeU5sCit2YGt0aUV0OGY+JWo4KX0zK0ZkIWsrZXUhKUlHbCE+c0dXWlN7NXlmbVBOfj1Xem4pfFMrdS0oKTx1aHA3OGZscFQzb2MpXnxUbko/KVJlCitRTU4zY2dnXypHYTlheUArKGdsXy11eWxjPzNvS3BXPW1KTDxJSiZebWI/blE1RmlJfjRtTSpZI2Z1IyM5VTB+P35PQll6V3p8c1lnRXtPCitEbXJ4ck42enxqU2NFXnVAbXd8JTRUd1pQSF5tTSpZI2Z1IyM5VTB+P35PQllkWTtsQzdFeTE+IX1qeEtPP2Z1am8/VUJeRDtnJGUzQDVnCitvOH1MOFF5YCk/UUQ4cjc3NVMhS01vflU5am5iTyY0c3NWQTJKWEV8XyMzd3wlNFR3UDRjKW49YVVOIUtNb35VOWpuYk8mNHNzVkFGTVk/Cis/P0kobmp0fWU9PmttR2FvYWNRVUpIQyY7TnlaLTcyWn4xZzM2dGBTSWBOeXg4aXspcjBHWnlCUGV4MnJ8WT02NXB9TnhyN2tGU0w4JUtpCitVOWpuYk8mNHNzVkFCUGdGNCVPenJWQlAqRnpKRng3dTJLOWVRNXlwPCl2V0wxKURDfGJpdCt6SGVJbWtmPXc0fXg/c308bj1hVU4hS01vCispVGA9aV9OZiU3b2UlbWk4Km1TfEIzcFFQXz40SHJjWWBTMzYxKURDfGJpdCt6SGVJbWtmPUwlbHg/c3xFZjJrbSpyVGF5R1ZBQlBnRjQlCitPenJWQlAqdTwzJEw3aV92PCgqPklAKm1TfDkzbnBESz17azNROUBFbk9Bfm1xLWY9dzR9eD9zfTxvMzdLRlF8eUM8MCNGeCN4JllKI3BzCitzVzRMakRsPGMtdD4yRDBNLXAzcmJ5Mz5WaUBpbCk5a1ExKk5XQzslSngxNFhDPDYpZGl7XiVoN0ZLalh+KnQ1aDhlWCFLKHtpVUdWQ0hSCit+Tmp4O01FMU1FX2lqcHN8I0t8ci1RIXloaTNhYzgzdntNTVRtZ2IxKypAcGItfTkoVVMwNiZmPiMmM3k1UTlYdVAlNlghSyh7aVVHVkJ6CithZ1ZxQ2teKXtBKDdKJXUxKypAMkgtb0FhPGhtZiYxLVVOQmJwZnBsWGs5Py0wJExaKXkyZzJyeEJaZD1VS2h+MWZZIy1nSm1QdjU8aG1mCismMS1VTkJid1JFUmEkUyg/Zj9PQm14KipweiN5I0hsT0EzTnI1YlQwbjd2I0RpKjlFeVEkYU8pazN2eWpodnd+YX48aG1mJkhHRDUqWTN3Citme3o7MU5FJFEwMUo7TUUxTUVfaWpwc3wjTFRAYWxxQm10WE9RND9YQXA5Y19eJSRhUmZSXlZAeiY0Y3s0PUA7WGE9P2dDI0lfYDFOPzEtCis+cnViJUMhN2R8bHd7MCQmJlN5MT5ecEhhRWdiYmlhcmI3YHdwTzEtPnJ1YiVDITdhJFMoP2Y/T0JteCoqcER4aH18Y0w5UHBPVTFNYDIzCitgRjtmQnRmdFhhJFMoP2Y/T0JteCoqcER2QFcxXjBqJiNZVHxuemUze2pCbGY/VWBBPHZrZFBteDVweTFpSypEMS1VTkJid1JFUmEkUyg/CiteNlBHWngmXioyQE82USYzdyZNUj56ZTAxVWk9YTtjN2RAQWo5dVhDMCQtbmFqME05azc8UiQxM3gtYFY/MUV0ejQ3Kl8xMTtlaHBaWDFpCit4e1VTK2Y3RmMke3ZJflk/RnprWTE3WXdAfio5RnhuMDcoJktsJUFLQ0wlbFAlVXlVKjdldnVAbFgxXnIxNDAydE4+dztWdDxobWYmMS1VCitOQmJ4byVoayUzJG48aHRoZXQxJC1NRlFObXF1SVZNQVdoMHZWNlk+TUpFfShTKnRxVypmKF4qMXBmWXRASHVLVGlUajZ3SHtgfmE7QlhrCis5Py0wJExaKXhgNVVOdkBXMV4waiYjWVR8biFDUn5Oang7TUh+V1lLKn40IUsoe2lVR1ZDSFJ+Tmp4O01FMU1FX2lqcHN8I0xUQGFscUI3CityZVVRKWRqRHZiP1k3S1VKRiFScHl+b3U3cFNeRylkaXw5UDw0VC0zc2hhOD5IPHw0c0pjTWExKiRHa2IqKV8mZ2JDPD01ZzFUKWZ2TzhzCitVNytkJFJUcnFiSy1DNFJFPkx4V3MhSWMqRGd7Z3pWN2tgTWxjRCYjVWp6bX5UPiRDPVAjMXVAME1yR2JFJnoxX3NCM3UtTGkoUkhMdDNFCitKMSlaKzdeSk03IT9pWjs2UH1sUEZUK35RcFVyXzNUUVd1b0Vwd3REV0UrfTxEc1M4UzdRMGp0QypWPVZLWCFgQ0tzZXdgI2wpOWtRMSpJCistMWJ3UX5NTj9sT3VmPklaaHh9ZWtycjdtTGpmPSpaTEpRKyY8ckomUldyN2tGU0w4JUskSiE9MUZASzVxakBlaj1yOEJsZUJzJXhMPVBZCis+WVY8SGF1bFVLaH4xZll0QENFX2lpO3N0WihJcHoxKl5UPTQzR1J+Tmp4O01FMU1FX2lqX3ljKDY+e1VTOzU+Vmo3bnl0K1d1MSokR2tiCislQ2wyUjkmRno2WXNkLSlkakNFY3krPDY+Km0jSF5YP2FNZj4jJjN5NVE5WHVQJTZYIUsoe2lVR1ZDSFJ+Tmp4O01LTTdFZW40fnZ3ZEMhCitaUWxLSWcjfCFvMCgxJnxVRXUyaVVzdT0mSDU4NkF7ME15QFNtNWdkVWwtKU1WeE5+cmskMW55NmE+MjwqQTtlLU9oSyotYSRTKD8zY1lFCitjZk05e0kzdyZNUj5qR2J3LV5vUzRfJDZUTTAlSTIjeVRJMjR6QW9AfWZ2KmRFVUV1MmlVbC0pTUFsQylDRjM1RjN1SXMqcDNpYlVgITBRCis1OTd0cCRaKSY7YUtwIUtRODIpUW9FYndSRVJhJFB7ezAkTFopeGA1Vm9VeV9nZD90VCNgcG1oUFEzdXMrSD5qR0xBKDdKJXUxKypAcGJwCitmcGxYazk/LWY+KVFmMDNHeyQ3TWk+Sk1WeEB2MSsqQHBicGZwbFhrOT8tMCRMWil4YDVVTnZAVzFeMGomI1lUfG4hfj9OXzZAeUkmKjtVCitTMDYmMCN6NU54PEooaHI3a0ZTTDglSyRUfk8qdUNrVDtBZUlRbyl6Nj1KPC1UZmp6UTBqdEc3bkhpNylDSHczRDBNLXAzcmJ5Mz5WaUBpCitsKUJSMWtRP1o5LUl1PGh4d35JPDV8cH4yKUNIdzNEME0tcDNyYiE0Pkp5dUxeQCk4VEpuLXVCKGombFM8Km94a2I5Y1c7NjQxSlUpJjthCitLcG1oUFEzdXMrQy1OXkdIKlFHKjIjfXdxY2ZZdEBIdUcpMVZYenJIK1VLaH4xZll0QEhFfShTKnRxVyo5QWE0Yl5GMzVGM3RfeU5xa240CitoNjd2I0Y/eXZLYFEwPkxmX2JeKXltWGs5Py0wJExaKXhgNVVOdkBXMV4waiYjWVR8bnlzU3tLbHw/eiY5JGJAeilUMGomI1lUfG55c1N7CitLbHxmWXRASG8mZXRoU3tLbHxmWXRASEV9KFMqdCpkVlBNJWAteHVNMyk2PD9BOSZQYCgxbW1EbWVmUllFQ2ZOfnRITTJtfnIrKDE1UjlICis/S3hGY2ZVeElyY2tTZjt4RSkmc29zPUpNTHtXVys0bC1NZD9XfjdKJmR3eiRNZE09P2lYPGFTe0tsfGZZdEBIRX0oVjZzfCNMVEBhbHFCCis3cmVUbClDSHczRDBNLW4+JUlnS3dmc141Pkg8Jn5mVnUkRzEpd2VmYnBmYWdIZUlta2Y9dzR9eD9zfTxsUCsqe2Z1cmwlQGpRQ0NgJGNOCitOKGdsXy11eWpHQjNuRT0hVWFuXmVtTSpZI2Z1IyFeVUV0XmZNO0FEez9rQCNHXn1iQiEyc1R9Pz40SHJjWWBTMzYxKURDfGJpdCt6SGVJCitta2Y9IT9EMmYlYXpydDh9MGhmdXZlVWVwblF4JllKI3BlX0opMGpMVz1UPiRDPVA/dHY4WjMzViEwQ2ZTVDNvdT5SJlhie2F5STxyN0t3CitYeTxze0QhTzJvYVJKcHd0RFdFK308RHNTOFM3UTBqdEc3aihMPUpEI1dSd1Y+MW1yN2tGU0w4JUtzVTYmSyZWXkJrZTh2eUQ4UCMxdUAwCitNckdUdTRebHdFb2FvZDdMPlo2KUNIdzNEMEttLTNxVn19PkkqPTkwak10a14jITI1ME1yK05gVHxUfWZhJlhiPm1CTXxGOTd1Z3B1UGFxCis3bDhUI1ArdEoqM3FYQVZzNHYqYDEpSUtMKC0mO3xmPU4kYyo5RGxxcDEwbmk/KThGQVUkRSY1SGhzYVNGV0JAMm80I1B2N2l7ezFPPCVDCistM3BSYmhyWjFURTEmT3tPKGJ4MFZKSmh7aTVhfG1UZUYzOHtWRHRyeXpKU3BlRiF9O1VVJT09SzJ6PiNlRkNnPjxndVp+IzdaQ2ItWmpPCitqYj9TMjw2N2NDYnA3Y0dPOUxDY199N09lUE8mXiZseF9ANldqbmkxcEk/VXp2WmRWIUBjdT1FOSV6UUVFS1NvIzc+VXRzQUFFUGE4Y0ZSCis9NmxtY0dFeipWQ3lqU2A7bUFkNyRwfmRPRDd4V3puKyFAMCN1JSped3BNJjlMOTJ4RG5UcSN8MzBQcHhNWmY5NFZ5R3syZ3VsdEt7JlU/CisldkdlMTNPdjckN0pASj17M2A5cnFAaWJuTy13SlIoZyV9OHRGOX1uVT5JKlp7RiRXVWVodTxFdSsmaUl4VkJxR0NEMXooPXN8T3F0aH12CitFdXFzQUl4VjVvNTtgclIoLUohSyV7JT92WWckSTlXcHI5YnIjKkRxTCNJNy0rQyEmM2JsTnxze2Qzd3NyflB4PEtkMWUzK0NTJn12ZyVICit4ZjgjYmE/Vi1+aUlfO3M7OXk7eHooO2hsfWdLajU7dzFpR2U9KEwxUk9YIyRFUE9JbTktdmBvKF5sI2lvcnhrUXNMN3pfVVglQyhEJn1rCisyeV9Sd2tub2M3TmRqP21uK2VAXkA3dzEzV1FrSnZmJVpgPyt3SiM8PEByeGtRc0w4bGRUVDB5N1BiNlAjOClwSkBzWEUrbW9gSF4wJmsoCit1WWF5e0ZHeHF0a2NzPkZIcWp0IXhGSVI/dWskb21TNmpeXz0wfUZqXnppPk4lflIpOU58am1yWnUmezJSQj9YJDc1RCZ9anZvUj91ayRvCittU0I0aSgqPG1wVDYqPXtkM3dzcn5QeDxLZDFlM3ZfOVdTXkl6SVNyIypEcUwjSTctYFp8I0kmfWsyeV9Sd2tub2M3T1l8RDUqRShSTSFsCitrJW1ZNVp0dmZETm1AcHlXcHI5YnIpNnxuTXlGK1RUMUthM2JYckVJQzNJUnNyekxiK0xaPkJrVDAlJGJeUE1tTSNfZzJUR0NEMXooPXN7CismRn5VRmU+SjNwRj45bW5mbzlNS09QTWhlb2lCNm03WHk9X3lrJD5ZaEtrTzlNYkFffiNQODtkOGt4dClWOUtORXA9TVFOJm96fks2OWk3CisoRTVzeVAtcStSRkpEZWBhSiM7TFYqVDElKDNibE9PdCE7ZHlvdCk8Z2lJJkd4V0NPVTFSKDxWQT9xU0djaStSeGl9aXVAYjVhU35xOytpCis8cClQSFhBM21RSEt3aCFwVSFhRj8xWGFyMnZ7SHFtSmw5cCReZFBvS0FEcypRQm9OVC1jLStETkMzYmxPTyNqZGE+YnJ6TGIrTFo+QmtUCiswKkJLYmxOfTFgfXdtQGpRYFJlSV87czs5eTt4eig7aG5RcTA9NVpZenA1fnYkVFh4T1gjJE9QRHwqdGVAXkA3Y3QzQzdpU2NqVCM7SEFZCisrQyEmM2JsTzl3SiNeWWJyIypEcUtkMWUzK0NRaUxiSns8cntkM3dzJE5QRXZQSzx4IUhjOVFGUGFEMG9qODRud3cyViY2PShMUFolam1SCisoUER8KnRnaWNIN3cxaUdlPXk8O211TV58bnhTZnQjTXlGK1RUMHk1M2JYcX5ENj9EdTJvMTBlOFkzclB9JlM0WVVwMD50KHRNQzBpNHU5Cit0KlglQyhEJn1rMnlfUndKcXUlNitqV3ByOWJyKTZ8bkxaPkJrVDAqQktiWHIyRUMzTzZMPE16Q3lXcHI5YnIpNnxuTXlGK1Qlb0R8cDtSCit2ME9UMCpCS2JYcjJFQzNJUnNyekxkRz98WGNFVWIzNDdKcDU/Q3hjSzdkLShLX14jTXhNPWs4Y2E9dzN8LTU+OW1fcEpMJEJPUENNekdlCitTUGFwXyYwOFkpb3djTnJnUWtYTXtpcFQ+YT8zcXlYbXg+UFBeJX1uQCtwd3V2dWJIUj99aVMtey00NDNJMmBTYmhWJlB5WG14PlBQXiZUCitoQnF5ISh9RnJKc01DVHZFdlZDaUl4VlF2Vm1kOVJiTjBOdF5XV2ROb3ZkMD1ydi1KYDFEZGNNOXVYZGJNeXhHJCtFUy0yYj1wIz1FcC1tCitKeDBCVE9gUlkhNmY4I2J7P1VkNTtDVmVqdnJmVExMR1RyPVNwOTFhIVl3JnBuSkVPRiFQT0l2Q3BSZXYqX2N3MDhubSM8bWphYU1kdzVtCis/ND5hP20odExuNj5QT0l2KXMhcHJ3dW9XYERNRDQ1ZF8wXnJgez5FKkArRT1IMmI9cF5fZVJiTWJyK3N3fVBoKVJqYHw3bD5QVyRTI3VUCitKfnd3NkQoQlM5Z1p7bS1mfFpVIUNeVlg8d2M4KW9FWHlfU0k9JG8lWXBmVSFDXlZYPHdjOClvRVhTIW0pT2Y+ZHRVfjwyRnQkdDwleXZFCit2P2hpYGg7ODVPdHJhQW85bmM+UE1obnJ4bFd0d3c3RXszPnMtNUB0ZHJae3hKXjxVPzZrUX5vOW5jPlBNaG5yeGxXdHd3N0V7Mz4kSkh9CitvOW5jPlBNaG5yeHo0eGdUXz9Be2FUfXNHKmxCWn1Ickh1JG9pXjhMYkRjS1ZYPiotNipKKlF8SHJIdXNvdEQ7VlhgU25QZWUzNjUpQUJrCitrdDwleXZFdj9oaUlfO358ekI9dXopNG4/R3RKQShaP1dAemlJXzt+fHpCKnJELUM2OVBVIUtYQWkoYjk/WD0kQzcpQGY7LW1leSUkb3RECis7VlhgUG5WWD0kQzcpQGY7LVlkP1MxM0c4MjVVWjxzWFQzVm1KdihMUjNyeCNaKj9wfX57e19nRj8tJTtDS3JfRldSVDw2PCNzbmdjcXhMCit0MV91MEM5SmozJWsyYnlgfWRyRkJ8YnIrc3pXU0VxZS0rRT1IMmI9cF93PiNJOVl7ZipvRnc2OU00PmhTc01hMDQ1bm1leSUkb3REO1ZYCitgUG5WWDx3Yzgpb0VYeV9TTzBOPmRzRjhQVjAtYnZgJE93dzZzbzM+JEoyXk9ZNXw+UER8Xnd2YCRPd3c2c28zPiRKMl5gfDVtc2J0azYzCisrdUoweXJBfU13dzUzajQ+YT9YIVRrNW8+UEZ3MTxyQX1Nd3c1M2o0PmhNKHtvSDYmcmhILW1kKHBRQUVzIXBydysmY35SPkpKd2txblY8Cit3NCRvR0RidSY9c3FXMEJrVSFBWTc/c1c3d1pacC1zSV87fVpjIzBkV21leSUkP0xCSkspI2ZeRnRgIzElTXkmTzlUM19jYDd3SnMmRlJpCitpRDhhdTdBKUF+QkN1VE1Mb3c4S3QyPzZrdjlKTTZUKyZjbllwVTlHUnZgYTBrRGZwak1OOEBJdH5qaCl1bVg/Pm02KkoqdjcqNEpyJG96Cit+WkJlVnh8Vlg/Pm02KkoqdjcqNE8jSTUyVytZLT8qS2FUNFNmcGI9cThhKk4qO1F1aWp2X3pFMTF3dzd4IyExfnkmb3UrdDdaP1hkSEY9CitUWklLWXVhVX1VM1NgS3IoSmcxVlRWYHpjR3ppJG9wI3UxaG47clZYQD8jNWtxUXElUX11bUdlJj9VUmFodDlkK0coTWtjRytvJW9wI3UxCitobjtyVlhAe001KmxDQkljR3ppJG9wI3UxaG4/cXBlZTM2NSg9SSNodmVQYSo/WHVHakpNRk1mJWU9SjZQSylmYyRXRHZ3dzgmMTI/Nmt2Cis5Pis1e3EyaHU2JFpge1UtWnw0dXNWQl4mS0k8MnFNYFp9JHopQX5CQ3VoYVRFWkxaVmlJJkg0UXRvVkgmTmF2VjtYQGl8TSpsQlp9SHJICit1JG9pXjhMYkRjS1ZYPio7SClAZjstbWV5JSRvdEQ7VlhgT2RId3NYd2l4RDhRRD4kSjJeT1k1fD5QRHxed3ZgJE93dzZzbzM+JEoyXk9ZCis1fD5QRHxed3c5ZlpFNFZfdjMjJStGRFRCb0lUVDNWOzJieWB9ZHJGQnxicj1AaztTRXFlLStFPUgyYj1wXl9lUmFPUngtLWspeFEkTng+CithPyM7YHw3bD5QVyRTI3VUSn53dzY5TTQ+YT8jO2B8N2w+UFckUTs5LUhzSHh9U1NaJWo+a1hQRHxed3ZgJE93dzZzbzM+JEoyXk9ZNXw+CitQRHxed3ZgJE93dzIpMH0mM3J2I0N5PjghbzA+TE1xMCpwSTtCN25hV0JWVFQ5MWhyKkhye21kJldOLUJwMz1LMTJ4cXE2PWNfd3l7MHBhCitNb1VVKnAhc3tDXlc0dCE7JUU4cG4re3J4MmwqZz5aPz5vUU47bmklTnRrY0hkeFhsbUk/UEdNPlQmRipme2xBN05UU045KG9yWVJ1ciR1CisoIVZXJUItK0Y+Vyg+c3ZxZm5zKFZ+bXp7Um1YX3VZVypKKnY3KjRKciRven5aQmVWeHxWWD8+bTYqSip2Nyo0TjI/NF5paWR6ajIhK3pVCisqVWZUalNMRkk8MnFNYFp9JHopQX5CQ3VoYVRFWSllSzwoKylmQnUjQGxndClGYGhaeDdtS3IoSmcxV3YzbD4rRl4kZHlOXlRLVlclQi0hCitvRFhES2hvPHFQJVgwYWVTZFlRaFFEJDdmZDtGRWMzTm5zaDR3bDdjZkk5SlNLSThnJX0oM3d3OVFVPCUoPkFgUmxlN15lKHA3R3diTkVSCitaTUQtQEo4aVlvQjBEWHooO189OXZlUDB2RXdhLWhkd3ktUWRwVFQrJVk5QW1YSjdsTCF7MSQ4dmoySmFkSEEqMj9qPldlMFhXO3V7bn4yCit4KHArLWc7a3ZfaGh3QmQ0LThEcz5EUzh8K00pTVZSekhaTmIqeThOPmB6eyR4ajMhMUNxbHdZaikyP05BRlMjWWBsPV5MfSgwUVhyRj1NCithXi1Pc3o1SjdidEolb3Y5OzRyM2d+STJgfFEtTlNWYypGOVhmYHdATyQqeG5oV2hkQiYlRzA/Pzg3WHdga2JUSlNjT1NUS3xCP0RkRGg+CitQcHFUPShYPj82MT5HeXFEaWB4X2pXU3k/OEdmPDdTTVRGPmMwcTd+XjQjaGNWZGx4U2U8fXgkZVZ0KiZ3JlFjclVyYDAmbk0pOV9NOUBtCitvWisoY29+Q0AoQXRtcGt8Z2g2RndvMEQ+YFVMS3lxNjNSMV8lUlc9Z1dTc3d0ciV2RndwKWwwfTwzQXM2JFlQcHRkXmlDMGlYNSY+XjV+CitkO2MyKEl0MjlsSUNyTys/bTUlI3ExZyFiSD44ISNYP2A+Tkh3Ozh0aHFNbDlaSip2Zi0/JE90TWk1aT5oVyFvTXs2NXs/MzgjbDRxZURpCitBalBBYVJMcT47OyZoRi1HI3ZxJCk3V211VV9sOWZeKiZNUmpsSEVOWTs0cHRETnZCUW8zQk1GV1dhc1AjITM7QGM9al57U0J6MEZPb3duCisyY0dsUEBZQStQTE5gSjM7SldqflBIS2s/WklldzZUanlQXmBfQS1yPyN6Y0xXdldlPmdWZ0Z1M1oxa1l8d05wam9FfEhwcWEzSDJ4PmN1Cis0UyY7MzJfN2c0eDlNSHpmRmJAfUF3QWxfUVlnQTtDan1UaFJCQz4rPG5UQ0wjNzVWaGo+SXlPa2Rhe3ZNSU5ufWx9PT8tMVVXX1NReCZkCismdk17MEZ0fWtZUW9JWiF3fXZmeWx3RSRkM0lPcTtaal8oMSRuPSs+cGM1JjduZTdlNTBgci17KmAmUU8rSDZDb2RWYzg+Y182MkthcFVPCitWM0E7dlYzQTt2VjNBO3ZWM0E7dlYzQS1FQj1NeH1jWWliR15mKTl+QiQoYTRlPEh5bSE2TCEhX3p5Y1R7elF5TGpPRzBzMXxZXl9pV1BhCispYEpTOFpjbFo7elcjX3R8JGdSayZtfSo1QCo/MElTKGtqdl9XPishMGloem9NaWh6b01pa0VtTW5JNENydmNMT0olKDViKkJCUSV+cz5yCitDQVR9M3VVSGJwaT9IYnBpP0huO088OyQmdnwqUyFuLWZiNVNtQiN7LTc2X000M1Z4TjU/RDxVZjxUZk10U0o9WjB3QkMyfSN4I3tQRWB6CitPWEF2TGRufnZTUGohWCUlU3xYJSVUTDREXiFnbDJTOXBudCs7c25zV2dybDdJY3Y7cU5YayombWRRbnY5eF5udjl4cjBoM0xXT19OUU5PCitfTlFOT19OUD9GMkt5dTxCKEM0UUlrPVZRSWs9VlFJazs8SFp9bkxuYTl+PShgM19SKGAzX1IpOENXeEd5XjgxLWk9UGxzTDgwd3NMODB3CitYY2dnUCQwVlI4cGVDUnVwZUNSdXAhPT1rT2NefjRLe1lgJkt7WWAmS2Bra0dVb2dGMjA/Y1NjKjRPP3VIOzBBREBCU31DLVRRbWZqfk1xCispM2B1VTtrbkNyMllqU0lIWWpTSUhZalNJSFl2eG9GJj5GK1pLNW5HYyZuOFdyNFZ0dT93M0BWPHczQFY8dzNAVjx3MGlGaTZSWT01P3ArCit8SUNaJEQoNkt+TU8kKUpnPmlFSSgjI1FWUnlDb1E5cVRhKCpFWlYkT1Y8bn1QSjlgYnN+Pm1qZV9fdVUpTDFgb01DPG8xeDtMdkdvUl9WCitCYkchcG9sQXplOU0+P0I3M0pHNXswbkErK3AyYDgpY2E4X290UjUrfVJ5RiRxNH18N1JjKSV4PE4+THhLd3ZDIzNRYXh4PkBKN0lEQUIxCis5NWdSQDJqVWM3ZCN+UmtsO2d0KiVJdGBOYnVwVHBofEpGS1MrV1AzSTZVWHJ2fnItR0B+JWpvQDsrKyUkZVhKIylsWG1WJDI/bnpyJWNjCittflJpXkolc2xWLW9yZTUkbjlhQ0o+Pk99KkYjPjxjUD9OfjFyTkRCPG8xeDtMdjliYko+PlJ+K2UyPm0jQjxMWTQtQE9ZK1YwRWhBKiRiCitmYF8yVy14IUB0UGhzWWl4ZHgtMkl2V0xoWEI3MkRKQSttPndeXm5wLU4pSHEzQSl0cVZwNnUoNUlUPF96XiYrU2pMQT9tLU1ObHQtZGVJCismNzFZVkB8VnNeY0xgIUB7MG9eZD8tN2c0P0R5RWtfO2FGTiFGdnxnbEBVQzlxfig9fmdeWGhpbFJ2S050TV5SP2ZfSmJSSlNpPERsWl4hCittO1AlPDE0b1N9KVJpRzJkUFVeJitTakxBP20tWnVpYUJeU19KU1UzPm9zPXRWIzswKHVjcHd1MWFtZXh2YExeWF58VWFxckpGOGZtQHVKCitgdlE1cGtCPGc3WGtlcUFfOTY1KDJJYXgxaGdvXlE4KnBFMjxrO3BGTUBneilRZ35BMW9hfVE3ZVQkNFNqIX5sK3AwSDA3ZzQ+ND5QMXdxCitYVjIzUFhNPEd9QDkpKGBaWkMzc2s9dSpoVWdZK0FfR2NKfisrTzdOK0RCcyNNcVYlU2RjRkk1YjJ1SG0kbjhhTEZMSGE0K2wkO0A8bnwpCitCN3JETDI/TH1AY2EoZ2tjVWdZJkF1UXokVWYxOSshPkVLT25aKnQzSy1NXmQyLWJENSR2aUVQZG5QJntyZFVIWj5saFRgJS1sWChxUFEzCit7ejh5byo4enEzNktMQT9wO087QiV3ZEsxKX1weHktYUNhQmV3diVrKGFEWk97RWRzMkZuKClFP0l2KWJXb0BGdWMxay1kclJPPU5FKGRsCitUODQyO01+WUNiQm4/eSpWTWNuTkR2NGRLMXVfZlpre0NPK1NGJEtRUlZEeSRSfH5QfSEjYmNONWZgcHQ0PmRkbDtydUhXTDRwVWkzWFRNCitELUBCX2pmTEVhWE5TdCpfKzYrU0x1JXBOQjh+cyZCU18+KXw8NGxZNVZWSFYhZkdJWnZ1Sn4oM15uWDFvWnlTMXVvNzhaLVJPZ1JKSkozCitKfDNqP2Upczx3WHJCKCFkTmFHO3IxVTFHX3VlZDBkWHYmUy1AVn52a25PbUNIKSp7fD5yR251cnVMbihaejZtMXVzbFNUe2pZeHlRfHY9CitqdDF+Qk98Q2Ype2VEe1NAIUg0aVpnIWR1NTU4LV9YRk1DcXxOO2NnIW9kMEU8KzVmK3xXQj9OVUZ2VUozX3RFQzs7I0JZPCFFQ1BsZHIwCitzQGc0eWBeX21KUis2TX4wIzRybCtHZmteTn1mKjxERGh0TktSX1RoVTVfe0htQzI9N0M5QUh3PygtaVBvJHIwVV94ZGlEWD9KR0RuNnliCitzfWhuNjRmfGB3LWdhK0J4bSFaMTVxeDU4LV9YPz9aVW17cjJ+ZStsU21mJSZyZlNlZHE9REZpZiF6ZDQwKDFMdGRablQ7UyR4dStucWQ/Cit3OyVveTchVkgzR1lMQUFIdkhYdiVpUCVLN15NfFdxJUt8PnFCVENMaT5EZylveEEoQTlETVUrbFNuO1k0YDZUVnRaUXRrbFRtY0tJSFp4Cit4OXJkUWR6Zjd4XjdAY2hIbEZASGBSKXk4Z0FjUFRkbH47OEJLczBxSFo9WGNNRGBgSkZTRn4qP0RgVD13JUdsI0FAMSlicGYzU14zRiFOCitzMyo0TCF6R1U8enFjMGhLJD4+VylVbyFmVihVO2x2QzdVblZXYUlFMzg7fTI5dmlYd0RtdSY4NHJUanx1SUs9Wk1vLWdyeXo1OVZQMkp3Cis4RVEodDJGNjNkclp6UXBuK21NXmg8aVJEV3lja0B6eWhrNnwxYEk0S0xjKXEwSkM3dih3ZTM/XlVWKSt1d21zcX5VQCtGb3B2MyFaO09ECit1T1lRK3tvRjlBP3lhX2NTTSZGVWZwSz1GNXghJU91SzEjPW47d3pVMSZGaGM3dk4kPkI+NVV2anZjb0FQVlo8Qi1SaSglRG5hbXIlYUU8CitpQ1hSQzUkZyZkPGtRSD4xNk5tVVdyNyRCPVJNWlpAem9POFIxSlpVeX1LZk8hZ0szeShJSHhDVmZmZE9DbnpxODQ/KjE4ND8qMTg0PyoxCituY3NKQkkzKjBwNDlOYDE0OU5gMTQ2cGtra3MqO0drcyo7R2tzKjwjcm40dkNBKHFrM0k0PjM5KCFpPWZpMDQrSFRRaEY7Nmtoa1licVRUCitEY2tiYkp8SnVKYDBKNkRuJTx7ZExkTzBRQndANztgek5lbGNxeCp1cXVYRm9hdmFiZ19RU1kxPHZiaSU9cFEqRU5CRUFFRV5YSlBzVkYrCitwblk2eGx3WTZ4bHdZT2NMQHc/Slg4JC1TNHs1PmdzYzhkNGZrbnM1R21JVlRLaDRRVU4mNFFVTiY0UVVOJjRRVU4mV2s+VTBOTkpjZ0xxCitKMTdMcVBNcm13R3VUM18lUys0WU92KlghaHljaGs9WXs/K011cSokbWtYKiRta1gqJG1tdF9nP0Rkb0RqR2c7QSgpWTBqfUQrYShUR0N4CithX199X3h8OSs8O3hgbDQxWWZpRmJwdko/eFVZfUAxR2NHN15wIVZeb2wqfWQmd0FMM145Zm5MKS17KVUyJEQ7VTIkRDtVMlErcVBydUojCitSKWJtZi1FVDl4fEkwdlRBVHk4fCRQOG8jR0JASGR6fk5lbDgqI1lxSC1HbFNAY2syRzlMQ3RVYGc+JnRJe2cyfEs+Wkx0KFZYOVIkIUhoCisxPFlKVklRNyYlRCpRQHJVQGg5SnBHVEpgd0gjaDVNcHFxY2E4UiV4OW59S2N5eTE2QWMqTH1GfCEhNjsqcEd7Z25EQm5MWig2aiUtS28wCit7dzREPk0yISQyPHN6MSliRzh9Vn04bStRVjxfdk59VCpMfVp4XkFMZjNoezcwUWo0KHpSQmE5S28yeEVqWCF0cUhkWUJpfFVwakx4Z14lCiszOVdedF5EO3Qzal5AeSZDanQoNXdFM09VNTltZllrdDJRP1Q7OEtUYitmdDNqPTF3cFZUTGRsPUcrVUpaSVI9KyZUQ0dvJSVAOHF7aH50Ciszajs+d0hubEZQXiY/JFg2Uk08bV80IVlWTXJeNEg0eFQ3U09hMHJrWEVjfXUmVGtUMkNFdlpZT3QhUVJyUWtWNjQyUSRzKV9HJF8mcGdpCitJc159IzhnT2RCc1I1QDNvRW1VeXpeUGZCKzgtZ0M7TTlPcUd4djlRZFNXPHA/QHV1aDgzbV5Yb0VtVXl6Xk1WSjJBbXBqWVFVKWhydnt1CitGYUI3RDRPSXQlVStkVHshOVdzaGc0TUhedCloelN2LTV7dGkpbGRpekZBTWB5JUA5ejhZN25aS2VEfiVoMHxhI2xEbmN+filse2c9VGU/CitCMDJCOHsrWVEmcmhQRUIjQD82REI0TDh4WHxvRGw0UGphWUF5aCU3PWkyLVA0fGdIUjFaSDMtIXBSRCkwckxOeTUwQVhJfTs0TUh7Mi1rCitXfWN6a2d5Myh1ejxHTE55NTBBWEl9OzRNSF95SXQ4WiZvRW1VeXpeTVZKMkFtcjRqYXRPRyQwNFpUKVBQZTFQN09GVTtNOU9xMTVPUCVICitRSmVVfEFHTlhETUI+fSlyZ0pMTnBUTkRURSl8PnkmaD5yczBOYExnbFo2fkw4dTB5OGlaO1BzekltKnAmRXAwd0RWXkorfld7Yk5OT09kCitmdXNoSzhmXiopRGtMP0spSWRATE5ldmA1a2ttakBCVnd0WUtiemVpaGo+QyNxbTJ5bGdybytOOGMxcCZzZXo7aGt7VT5BQWdPXyoyOWc/CisrTmJtZ0YqIzdJRUY4PVEzXjVPRjNrfShKKUJzR3hLS3ZHa1pHWDJIaVFpRHFrRTtWZC15Qn1YQ3N5enp2MWc4ZF44Z09kQnNSNUAzb0VtCitVeXpeTVZKMkFtcGpZUVUpaHJ2e3Z3LVRzIVNfQmd+N21sfEFaYUgrd2kyQTNMS1lEX0Y0c2V6O2hre1U+QVNsWTVAS2UqSTxGNGQmPUZrCit9PiQ4ZUQye3NsbGJqI004YD5Ydzt4bGdHUDthUkFPbWoyfHhgMUhVOCQkdHxzVzg3PXc1TVEzRkhgNUgmIzUwOHMtKDRHPVhabUtmQlM/CitNfDdvX2xOfTQmdiRRTEIweH5sczZuRiFqVCRzKyg1T005Mjh8anRZUzVAYnFYdnh7Nkhvd1owSTJhZGV+UG4wM35Gam5YVEJlMEFrcXAlCis0Rz1YeilCc1RmTD02eCVLLTMmazNQMjQySERAKyE9QV5JP2J2VjdCR2tlS0UlJTRFaTA4cy0oNEc9WHopQnNUZk05bT9maGsjO0ZiSDRmCiswb0ReYkVnRnlgakg1ayshZihremt7NTBePnopdTR8JV57JCQpNCl5eEl9UGtLPWJKeWZHTkZIQjQxJFYwNGV+VXwpOEc/QklYPEElOUleCis+RTRjSWhiKHx9Q19IVnhQYD1YKCh+Q3gpUVlmS0NIQzRkXnN5QTR4SV9JdH1QRmhpcm1QMTIjPnU+MTJQOWZMNUgmP2hgO0JkbGI/TktNCituamUyUjdZLWk3VzsrN31RYDtnRnlgakhPUiZRMlNac3M2cSQzaiVXbnZLNz1wXiUkSnZ2MDN+RGZfSWs0JjgzKF5XaTRHPVh6KUJzVSkyCitxKndHME11Tit5KkchbUxMaDJAcn4jdHBCQiZWRFV7SGZXNEYpd0EoPCVIazd1a2ZKMjZoX1FYKWR5UCV8MTdXKD9hQkZrZiVZTzI2LUNmCitYXl5LdW8oNmR1PFlfTGxpOCMmMDt3XyNeKmxBIz0qLWQ7MlVKcFoxO2lyTTAyN1ZnJlkyY0BVcDlYIyFfLVd2JHhkYFkqSyo2UX5uKzl4Cit9LVBEKWheKjk2LWJRO2lVSyZKdG4yNlAoR1grV3BCbV8pJiowaDxQRjhuOWB1eTt0UCF5NyQkZml5fV9YPGokVlIhQX1EfSV8JkVFcnZhCitTP2JlZkNsXmRnYCopOElebEdZIXIoSU1aQ3VjVypjPyNHM3xoOG9YKW5yb28jQVp5TE81RSskYyZYPmd7Jm5GZVE/SUA0K1dhUUktPFQtCispVjBTVW4wc3o0cVJHfElUT3g2P3F6VFcwMHBvcDVgVz9ofF5TQHlsPT4wci03YTNVZXxBfntgRjVVZjUkLW1fQiRHbyFKcjAlOFZxVk1zCitLS0JIZ0JsRUtabGExazRmWnRIKTc8Kio0SlU7ZClMPkE5S0BBMnFIPDUqKDI3VmcmWTJjXjFuTkFVPkw3V0QwOHBMVDNyQDZoKSZCYStFCitALSljUEFXd3JsNGV+VXwoOyFjU0pQcTxSSGA2S05HPkZxNlBKPWlOO3h6WlFOeEx7Sk00c2oqdClTQ0BQSUhyMXlsTD5KeGspUnxHJnN9CitYT21tYVhkbW5BRzJ7Rno2Pn0lVl9Tc35Pa1B9NHc3USkpV2RELWN3P1g+TmtMWiVYeiY/SXhmUSg/Q29FRiU4NXRfcShyY0h6JFFxKD9DCityRkg0VzQ+X29qelFeeVZkO0J8emBTZz4yJFhnRVAlZEhYKXtnbX1WQ05rKGh0fCk5YG9WKHAoLWNGRGBFYEExK0BtOEd9Z19TZWwxS1ZvCitITjQ0Vz1+RD81bn1lU3N9Skd3SSVOcTEyRH0pSmJ8U0ZtSWhjRlV9PUQqMGhSXz5udWwwb083cmtabFkzOTJaY1lqVHJVOTQrVT5ibUY5Cit4QDZuNFhgeDgoZn5gdFZqKF5oRzNlNXVPTUA7QXgtYDNEaGA5N0gxUWxmKGx4YXw9TDdDPHVzQkczaVEjc0d4VmRoa2JYJnxQN208RDFSCitoLXIySzVrY3U7TkdyLVREQVMtIWdFR3hTU3w4R2lER2pESCZtTlBNVm9ITjQ0Vz19aCgoSG1GR1NjR15SQlVPbXJGalN7clprdytVYG01CisyNFc9fWgocUt4MURHakRINTNBSm5AWldqSSElNStAazEmJWN6JSY1VUpPczZ7Ymg1WFh3NHpJY0UpQlhnPStkQXxnRHdyYUdgcmwwYVF5CiszXjl7JXAta307Uz5jQFV0Y2Q1Sjg8RyFXQjNPYW4wdSM1NTRvS3VpTk0mOHpSO2E4M3Z7NGIoSkgoP0NyRkg0VzQ+RktMQ0MyNFdoQlgmCit8UDduNU0rIVA3RFVhWDc/czAzT3p+fWFNTm9LQC0pY1BBV3dybDRlflV8KDshZHQ1P1JEKTVUYCskMjV9bjFZMkw0a2ROP0lTbyg2ZHU8CitZfHpuTDdvUEE4c3VxXnIkTF9QV2xsdyQyNX1uMVglTUdEb2FWajE9WjE0YTxZfHpuTDdvUEE4c3VxXnIrTjJAK1dTbWVVIzMmVVg8a3dhCitIVnhQYFZBSChZPEBiNS1hWSQ+Pz5GbjklT0pxVCgwaTZiUDhxakg4PTJXbjB6QH5aa1RCSDxnOG45e0p7ZnpYbXhAMTc3MGk2YlA4cWpHCisjcnZhUz9iUTtpVSFnTEJZNGNJaGIofH1DX0hWeFBgeUtAOWpAeFQ2d0Z7V3FmSlItPWBBV3dybE8kYUxKRyt7YWduKzl3ZXV4WUBpMGg8CitQRm5xQkNgR3UqPXZSTTJUYXJ7U1pOZ0V0TXtHPGVoU2BNJHhLMjRAPGFYPmd7Jm5GZVBYb04wRjk2VkdzdUxvKUhFIUo3dGU4b1VYKDhOCis2d2g2MUwzV1pocUBAb04yY0kjRj1LaCNvY0Z1PWVDQy1wOEtBQVByTFZ4KFoxMnlfYTAjcS00bT5SMSY1ZXNDKz9sYWMyZTU7Vn1CS1EtCit3QkBFOSVwWWNAcjBUTlk4dDMlcHIjM3ZEOHdgbig/Q29FRi0/aS1ZXyo5cTRiQytBYFd1Iyk0QmorKy1gOTY2RzczNWs9cnF8T3ZqNTZKCismOEVPNmZsVUlOMVUzbjUoKFgjWmxscmZKeTd7fEAlYT0+Vzd7KGFKN3soYUo3ez0pUURWI3wtbFctPkNPdjBKO2B7cXk5bWs0aFgtWHkkCis5YyQ0clo7WjRHdSNNJnN+T3YwSk8rOSpMeGZ8dnZgMzFaVUVgI2FoTkNqQXAqbUB5N3g5TDZ8fGFUd3o7IyRrLVo3PkRCQHU2d3hkI2RSCis7UGR2Vj1zZUA5dGxCN2pLJWxLPl9HT2shRC1GZVBEMWBjVlp2e1BvUjFII2cjRGZTVW5zMkRsbDNGRWlqdD58dCZPZEtsPjgjeXBKaUZ2CitpMGU0YFYheEBpNHw3P2N1c0YqTH1JfSVYTUZfJWE8R1FCPSRIalc0dyY8R1JEZ29GSnB1OyFXZHpVRmgpM2p4TmYqXnhOZipFVlZwaHg2Cit3Nkc2RWVUcl53akA/VzJ+IWZMQnVxKHxrfXhHPE8yVStjREc1XiZyWCZfWVk0LWU2RUhufFVCdj9yLWg3ejE0STd4N2xoRUY7X2A7UURuCitBfjdYbE5+JFJ4Xyg4eXUjXjFmXmlKPEB7MFphbXojSWgpMU8yVStjREc1XiZyWCk7Qm4zNkNoVk1AWjNnZWhzeGNXLSlUQ35RZ0NsQ1VNCitRYGJuNlFGZVBEMXN3b3wyQV59U1JtSU4jYlNRNDxMIXFQZVVHU0tydlJoZkZwWGtAZyY8YVp4LWZ7SEUpVEB0I2E7bWhrdTBLfXgoMjh5CisyfXM+OFA/QFdrflhMPjZ5U3l+KiFCcFgzJkYoKEZeUmNZQHNGT3YwSWpHWU14QkUxPzgyWHx+SDNpJWJNSDMyR0FqQmw9SDRPYEBVRD81CisqQ0x5M2FBV2dfdEJKUUZLWUBsRiVoLXlMXz84TEAxTTMwd3NWKzBGemgoQzE2UndsN0otdk9NSV9vRlMjejBENmt9OE54K2h7cFQhZjRPCitlQl8/QD9mQSRMWWFnemlGSHN5bXhMfH1UQHR6XmJWPXh2Jj9UV3VMWUpnSHxMayt8QDk/ckVzN1graHBlOHwwZnx8clNDX3prdW07XkQyCis/PnlyYlBkSmxzQ2dEdWxvajc8QmRLNy0xMWhYUGFjJDRyWjtaNEd1I0VLfjRPdjBJakdZTXpuSkM9TE5iOyt4P2l8VFhHISFTZV9Ldk9MCitXY0BwdkA8Vm5icmtTOEhlVnJgVFZDbX5La29QOzxEYWd3JSs1e3BjUEpQQ1B7XzZnY1lhVVk3a3VYfEhTWXZ0K1dgKEpKWlFIN2xaSXwrCis4dT9sUjU4LW9wQENfKHxtX294UDJGJiZWd1hCQDlYIWxyU2heUCt+Y2h1cVI8cCFrKUM3UFYtcCo+el4yZCsrdDl8cG9CcSpXbEA1azFWCiswSVc2M2UxZ2FXZHl6Zn1JM0EzM2slJUxDcGkpITtvOX1OJGB7NEMmNXBHcDlEViVldjxqNTNCVHRVbHVVVEJDdCoqKm9AOVVicmwqOSRwCitvQnBRZ0F4V00zYCFXM0ZlcVZBVnApe25DeipLYGJgdEMpKmgjUkhjOGg4cilnRmhtIWNUJnExVjU/I1dYP1pASz8jRXIxfHt6IV81Q1hZCis1SyF6JSpwcWgwWTk3eFg8fWF3dXt3UWUkcTY5PDxoIVBNYkFXOX4hQFJMe3NDRD0pQGxWQiZvUFYjcHl6JHoyTFBsQksxZWFzMGV7M1E1CitFQFJRJnQhQjJ2cFdDOTkxaUtTME1vUDs+KGVDR25KRzc8NzU8Vm5icmtTOEhlTFl7Oz9zcSVDPFJUbGd0KTwyMiRQZVBvOEkwPHBtP3IrCitVdyp1eE4xPFZuYnJrUzhIZUxZezs/MzMoRm9Cdnc1TWFUNE1yIzdUJmc1R1U+VHZHTVRySUx4aWNsYU1ETlBlUHVBSmdNP3orSUdRRGZ9CitnfnlDJjVtRm9kaTF4Y0dDSUkxckJGfkBSUSZ0IUIydnAxVjBJVzY4eG1JJDAze1dsVVZCeypoI1JIVT87JiZJe1VlTnZDdV5EbGdkd3J3Cis8cDQmZ2gyXnw1KFhzfUpQQ2RoMyFkMVdiLW9ELWFTe3VqMVVCakhYVzdMezZNOz93b3BrdHwzSGRedmdnZ20oNjduU0VOcWh1Vmg/Q0M3CitmXkNuOCtTdmlOaXhMWT5NQjY5MjBVPU0/UTxnblgqX1ZnXmY5Pjg5PFZoQGo2NT1HcE5yO21XQ21+THtlJjQ7fWdiO1pXQCs5TyokZGl5CitLQXh9YntnZ2dtKDVeSjQ9STA8blE7dn5kTGg/QX53eyQhenZrUzhIZUxZezs/MzMoRTBvZGh9d2JQe1d3MVUzbjU2NClmTE5ubiR9Q1NCCitlY2hvdlMwb2RofXdiUTAoISZgRj9eS3FyQXRWdWgyeUNWQEA1Xyo0bkExPnoqP1V8cncqJHgwSTtQZVB1QUpQQ09jQCs5TyokZGl5S0F4Cit+bk5sVy0+Q092MElqR1lNelh3T3poZ1lhK1ohYyQ0clo7WjRHdWdmfElxUW9ZSWh7dHwydypkKHc/VjNVZVgmS34haEtVciFiPFZuYnJrCitTOEhlTFl7Oz8+RG90eFNtSTI9blM/VjVYQTtpRCl9KnRtWG1vJGBDdT5jRkh3a1lOLVh2QnkzMkdBNUJ2dj5IVmlMcThSeVlZPTYxcFVHCitOJDhUJENFZWU5RFZDY0VXZklDSGx1ME8pUCRzZCROJDhUJEM4MHx+bXhMfH1UQHR6XmJWPXh2P3pLPnstYjUmcVAkcj5GTFlhZ3ppRkhqCit2bXhMfH1UQHR6XmJWPXh2Jj9ReHUmaSohK24wZ3IybitSJFcpRmh9JFA/TWwwS319K0RsT1FIUk9vRXNNRiRyUTQjM1lERzVSPmtFZUA5Cit0d0JCKTdGbGJ8TCtPQGYqUEhIcDxzZnx2dmAzMVNrZm5TP0cwVEB0el5iVj5KcW1QOU4jNXl+VyNOaHAoMENaU0FYQShQTjBwLVYhU2dmCiswblA2MXBVR05pMUx6dSV2ckdPQ3B3PjJ3KVB4cXlwMiljWkNrYkxNRVkwTFlJVXQzMClHcEJ5PnNXbEYlaWdPTTNSUkJ4MSNoUCRyPkZMCitZYWd6MzF0IzFteEx+Zmx9aUdhMVN8PHk2MGpzLU54K2hUQl44ITk0KEVtZGxLPl9HT2smWkpGZVBEMSFqeXo1Mn4hZkxCdXEofGt9eEgpCitTVj9lX3A4YnZwdkVvRnFsMypwVlhpMEZBOzNVQ0dmfENSJUB4YDtmPG9KWFVOZk1HSUJ1UGs7cDhZSmRTYUJqbU5pMTN0a3xaUWFOUnA1Cit3QXhUMSNnZF88YDV8U2gmTmwyMkFCcTIkOW99SnhUYVV3KVh0V3B3XnEpTzZoSk5kbj4kQ1FMQTJ+IWZMQnVxKHxrfXhIe0tIJShZP1glCit3ekEob3A2VT1xTTI3QT1XSU9Udl9kREc1XiZyWCk7QkVMSVluQnNmV01sSGVyNE5xWUE/QkUqNmQhQWdSYSNHKW1eTnJJQ0VDa2R5fndqCitmKHBBVzFAIWdkXzxgNXxTaCZOJC1BXlN1OGphcTloaEEyfXUlP0JxVHtsa302NTM0VFJ+WmcoKFNCNX5kX2ZOdGx1X0NCNkdhMVkqNjNTCitpVTVkRk54KCMwKzlxRjJ9Qlp6Qm9JajtsMFlQWk5DSkByQV8rdGloQHwmPnxJVUlGdjN5QSZsMFlQWk5DSkByQV8rdGloJElrNkFkKX5OCis2X0wqTkVKJWAmQikjQUpjTlV6bSZzOHJPWGRlPk5pWDtoMTV8U2gmTmwyMkFCcTIjY2w3dTcpTmZNSHpjaH1PMTYoPlRKI1BUSH1Obi1oCit1S3FQQGtEazdhZEE0SE9iQm5lM3BrfFpRYU5ScDV3ejJFJUZmKWdRMVYpPkdnQnEyI2NsN3U3KU5mTUdJQnVQaztrUiV+VkxYdzBlMn14Cis0K0o5ZmxeNk5ReloreUtAdjJ+SEFnbjFtej1OZk1HSUJ1UGs7a1IlflZMWHcwZTJ9eDRFYEk3fUZMWF5idkJfVDtkbDd1NylOZk1HSUJ1CitQaztrUiV+VkxYdzBlMn11JT9xPHIleTNyPlY2aUlxIXkkIVJZY2dMb29JVnZVKFZCIU5mKmtwdjxNTD11UTM1TlJqMz8qcnsoIUhFemhACiskcUxOTmtXb0BCeHpmWGVKOChmITF1JiZlXlplcEF4VDEjZ2R7MEBvVWl7M0N4P2lWVV9CdjhMVSopNHV4PDRBeDcrcUBDQVlvVzdIOFhRCitaRypJeCRpNmVxeVQ3OT5JPz13Mys3c2A2cH5qRSYxJXBgPUtUYGVaPzM8aC0oJUUtOU5ScDh4QlN9Vip7UUt0NUU7JXs4OXJFd0h5dHVyCislZTdKbk1XVDBXN1ZXNDU0WDQ3eno7VXZSSmhMaWw7YkBnSiFpRDR6Zk5Abj96O1V2UkpoTGEyQDhCUXtzV0hgeT9CPWJodW4zNkZpVkBsCityZCt2Qkc4RmxIYiNrUXZBZldDayowOUw2fHxhVHchcEJNI1IrVD0jSUAhKnZoVy1UQmlqSVdlfG1Ze31TP1MrcnpLJChXS2NDMVhtKWwjCitENEVRIT93NjM/fl4qR013YiFld051UklXZXFjU2pudGNHTXI+TSQjOWI0QipSSURsTUUqclBCTlRpSUxVQzU7VXhkcVMmbSFUPEdoVVZHCitSRGdvRkpydW5AaU5CQzcleVhsRn5hZX5iO0VWVGI7RVZUYj1UamBxNyViUGhMeX14Q0JzUkVsTUUqclBCTlRpSUxVQzU7VXZSSmhMYTJACis4QlglZG14Rz1mOGRmcl9XTDdCfFBJNVdQe0lhe0lib2ViWXV3LUQjej4tO35XSzdBSmt9KU9FZWxKT0hWfUV6ezl+ZSNDRWFIaE44QjtRCisqPFh5QkJQTCZ2amZUQnhBbXk5bUN4XihoQVZ5cmtaKU1UajFQP01vMUxyc1I3JTw/NWVPb29eWUYmU2JxI0FKeGM1UitOOTxsU3FYbzYrCitOdFIrUHlvbGREVnpsczBSYWo0bH5uR1AtMXpGQnc9ZXV3LUQjdnlVKVEtTDJRVDBYKzxuZ19YP21DQnNTUHl3bH5Sdi0xfDVXSGB4aWxICitueDdOcnNhUUNtQnhpPyE/WmFkbCsmSEUxOHVgaExhMkA4QlF7c1dIYHhpbDRzTEVaczg9KS1oRk5ub2FFaF5vdW1GNkhqU0o4bU9pcyskCisjOWEoTiFSYlkhbyVndUI/QSMmT3YjdiVGKHFTNCMrMG1tfDhDWnM3K1cmN1dOZ1ZTU344MjQzP35eKkdNcj5NJCM5YShOdkY1eys3fCZ9CiskLXQ3ZTdIWmE7NyteQk1XUHImNGxVY3JHT3YjdiVGKHFTNHR8XiZVUDZKQkBtSkJTcHU7aEZSVjZ9LV4kWWctWTBGd2JHdnlqUHtrfSlNCis/TzIoOW9ESCY1VHJlc1hYbjM2Rmk+OzhfQGIzJFdGIytIbU5uS2V2aTRVPl4xQlQyMyNgUnN4QmVsV1lqTnJzYVFDbUJ3JV9PbTJyd1RhCis3MCpTQGV+T0orNWJGKHFTNCMqfmFIOEI7USpXSzdBSmwzQzRVSUxVQzVtRzlvWEIhSX1tTkBne2E7VXZSSlc7SyhNQnFLPmlsOGh1N05wCitkQzB5emVvYldIYHpHZWZPclBnb2MkMkUxNHh0aExhMkA4QlF7c1diYTVzN0VVc3BXSGB4aWwzQm9IQisxXi1sOT1UdE13SEEjQ0w+OGtsCis4aHU3TnBkQ1dUemdZVUUxWUNGJCpnOEZsNEs7d05ScXdsPmRrVCFCVDhtOWxhVkFOTnY8U2F6a0wpKUUxWUNGJCM5YjRCKlJIO28tKnQqCisoelF8eWFERGZ0WE1+MjgzQGUke09vbyNUQ21Cdk1vTWN1cjhBJnBkV0YqTipsOTQxTU5rKT5xYF5SJlFmN2hPKyFBZlJIbFVkU2FCKntwCitVa3Q4RVlNdnt5cThBJnBkV0YqTipsOTQzdWNKbG1lPyt6SmRBKE4zTEJTfVYqajNnT0pHTG1FQCR3LW9zQnFLPmlsOGh1N04lQyRsJihICitRYVdSeHtiTXZ7eXE4QSZwZFdGKk4qbDk0MntoUkduM0tfcjduMjlYUlJgTEluQ0tsYHRMVmhyTDVBe2ooN2gtNDdTQWQqMk9nR2RJRTM/CitkbXNHS2dkbCRzbSU/SC1FQz0jNEtOTzUkUmxlQlooKUg8Vnc9Zi1iLWR1SUxSenpHTG1FQCR3LW9zQnFLPmE9ZXN3WTUrWHxiWkdybm1ZCit4Xng8LXdFPGdWQFEmYkJxSz5pbDhodTdOcGRDVytFYWN3JC02Zl98Sj1pblFDUHtXVy1ePilSeD1xJUdMbUVAJHctb3NCditFb3dhKmFRCitncCYqPmA4P21mO2UtJVlHT1QzUUZkMHJWb01oSDg4QSZwZFdGKk4qbDk0MU1Oayk+NEIkPjVLez88fk9eKEpOd2xSK2VkTkN1RyVBe2ooCis3aC00N1MpWHR7WkdOcGxlZWBWZlVkRVloZGBRTDYwI05Za3Y8LV5+LVRydmgzMSg2SVE4QUxMT1dEdjw5bDBoVmNOQ3VHJUF7aipUWmYoCishc14qQ2V7TF42bkU1WG01dEtfcjduMjlYUlI4QUxMT1dEdjw5bDBoVmNOWnpnUGBNVnk2V1AoVHJrcWpha0xeNm5FNVhtNXRLX3I3bjI5CitYUlJuSDVXSHpjc3NAekBIelBIN0NaOGoye180R0phKEkkb1BAKkJqWlFMa0JsRH5LUWV3fntLKXVgQGdza0pXWShNKktRZXd+e0spdWBACitndzYkIypmVlI7dSQoSmJZJHFyKDItZkVXWSNHZUUlTnVoY3hLSXNRNnI7OU12YVViODh0RiRXWW95MGt4P1V+TW47V3s4V31ZKnRDTmZ0CitgVEpmeHYqXlVBa3g/VX5NbjtXezhXfVkqWUdsO05zRjZgNHFlZSFKajJmOVdOayl0T2VKYEZfYno7PVdzRjZgNHFlZSFKajJhbT1HSFBWCitoJGYlSn5CY256fWptKC1QcWVaQFZFd1dqNFYke2Z9a3g/VX5NbjtXezhXfVptKSMlIT8weTs4dVdhITgmT2ZuMFRqMjhMKy1vTFojI0hmCisrME0lT2tTKDI9MWRMcX4+PTM+X0lkR0lWNjwkazM2WUJTU31LYiZ+Sjx5RW1MMUxQdiY8Mz5fSWRHSVY2PCRrMzZZQmxjWSFjQiZoOzJwCitZY2VhcnBBTSo+NmtPMT5+JGg7NWVLZUxQdiY8Mz5fSWRHSVY2PCRrMzZZQlNTfXFqdG1fY0l4PSkqPSpYLXxeMWFfQlg0YWg7SXg9Z01qCisyYW09R0hQVmgkZiVKfkJjbnp9amZAJUBIOE5ecykrOEElXjBWSjFXKV98cEg4Tl5zKVgxb2pRNnI7OU12YVViODh0RiRXWW95MGt4P1ZGCis5TFo+cnBaKXkyUyRTZ0EkZiVKfkJjbnp9amZAJUBIOE5ecylYMW9qUTZyOzlNdmNyT0IlPylzelNuRylvKXxTVVlHbDtOc0Y2YDRxZWUhCitKajJhbT1HSFBWaCRmJUp+QmVWWDxYcHo3NU1gclBmUTZyOzlNdmFVYjg4dEYkV1lveTBreD9Vfk1uO1dIdjEtKUZSaXAybiYtMTxLVmV5CitIZkJTU31LNXQwRVQxNGFnbjM+WDxPR0dKdUQkU2d1S2k7Iz5GODZ6QEE8WnUwdlMkdHh3JFhKb0ZCNGI2eWlpe04qRD43RE90akppQXVfCitDa2QkUVRqWnpZVGxiJSh0YU18SnhXfk1ZfHd4Kll4WnNYN19gdy0rTHlrJFhKb0ZCNGI2eWlwOzdiVj9AUz9qMWw/VyZ3UUJHQyZyNDU2CitgNTU+TXU/ME04NmglNFdRNTJGa3kmK1FXWFE7bmtzJXtQTXV6PEVYRmttODZDKkBNaD5RPiFBdT5XX2d2YmJ5NWg1YypXfEAoWkF0T1VaCitoS3ZqdThTP3ZlTWwzJXVMUyUlPDIkMnlZQlNkRElrLTtIQEx1USRnS19QPWUyODlkPzg1QS1vPGFmV3opK3wzVUlBbjBoO0U9JX5nRl47Cit+Mz1TQ19HUnVxJTNLPGtLQ31kRWBwcFpjIT98JEM+RkY3RU94Ujd4bjwzaCVUajAraFRHQW9SWDJOQDRDOSVNWW9jIyFjUjwzWX1MP3E+Cithb2FVdFZFIylYVXY4NWM0eFdMKElzRmZ1RVEzPFZocUc4QU1lJFdWfT5BWk58ZUVJPV9OV0p0KTZrUmMmTUxXWUZRO3Z6I3FoSnArUTg0Cis1QktXR0tpYGtmOSlGS1hZdFdwY29QfEJ4RmQpa2RQckVMcWNZOGspYT8lTDU2fTExc011NTZsNXNLUD57ZHh1UU14OTM8KCgkRzkrWTMkCitkSGcoU0h4IUUhO1kpNy1eOWlqZENWXjMtX04lMD1RO09kbkVVWWB5cTRvfGxER3gmYzNOblYoVilMZXtURmBmQHhPb25gNSp0fGZCbT1yCitgUVA5RmBYQiVNfE5QKG9fVjUxelApaD5ANmFXQUsybXRleTdEeFZvODNZPngwMDVLKjAwMSlwMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7CitMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1ZyZ2VKYUJePkFXcFhaWGQ2aVU2WmAoSyF6NTc9VD5XYyVvK1BJNFgrWU5lPDYrMVE3dkpKCiteYmsmezc3QmJ6OGk4WUdvS3txPXFIU0YoKSo/Q045PT1STUFRR29FaHVgYldkaiEoPkwmTml2JHtCTnxUVSR2Xlo/Wm54OD08Jko0Pzx5CitMQjtDXjAzSWJkO0soUVluRlJUe2xgNSFXJkQ0bEJfKXkkY1p7PD10TjV8ZnhQREBSJVh3Wk9oeF8qQy1QX1BUX05gVGlkR3UhYUl8fTQ0CisranZfIXF7V0h1cS1eNnZ9cTVGWj1WdTJhUDM8PndlIT9WWmZObDMlVV9fbG5qVFRDNmxFZFRRTzF0IzZQSElOaVA3SDVPI18pZGNrPyRRCitNNShZcFhkJV9zJTk9aEJEKWkoSEVuMkBiYGxLSUxEWT4hMncheVdeR0x0aXZlQDA8PClTOEEwcH4tUzctSHskZmNvTXEmISZ1O0pRXzg5CitocCs9WEc2UlAlWFlqXmhXVllaP3ZKNSkqIXRsMmAlcVMrYH0wNmRpaVlzVnhVP0wqQSVVWXJfLUxoQDR+RyZaMD14Tyt6fGFVYjQoVihTCitwMFB0b0F+K0tJN0c9eWd4e1AoUWw0NTVPQX4tSTc4Iz49X3dkd2N0ZipObTN0WmNrbXVSS25TN0Y3JVNRXkhJQSFCXn0mRSNgYVc1SG8zCitFQT4mbVFTfW9NcktCYEZNdzFJRWBFTUA1bShVSnd+dTNzSW8lKTdLTVcjOWM5VGtBbVpVPEkkMXUzPmNeQWlZP1M5VG9AVyUoQkY+aFJXCitIcFU1VENCM2dKUmUwd0lyR2AjVkNGVEdGQlZzenRQUHdqKiRiKU1RVGlqPT5ya0w3WCh5Zi1aN3hgMXFEYkhgdlR5JWE1MCVsfGdJKypoCis0ODA+K2t2Nl9oJnNKaH5Gbnc+ajN6bkR1X0EmSEQpVGhxX0Jua2FQcCM/ZU1WX0FXRXRjPGFKOFhEKEFZOG5IM2ApTSRee1ckcFpjMGpiCitzNXFhO1UoZF87fEV8cVNsUSgwM31SQnd1JXUjV3hTbmhvQCRmOGtHKkhwPElrPnA4KH4mVkYmWUp6PW4ycX4xREBRTDlDPGxiWC00PFp6CitSUm9BaHtkaEpmWldjVlZWYWZUNyVlekpDPnV2NWlgWE8/MFd3eCV6Yy1vfkdEVXM/K0hkTjtyM2o5Z0ZLLXVOaipIaXZuWCYoUndZaFpgCitTTGNWXnk4djtreW91eyspaXc0eVJ+Y3BRTlZyXkB7ND10NVYrfS17fTFiLUBtP1ZNZWpFUGk+PkdweXZXK0pVIVIofCl9clIkPHlyUVApCiskfTFlQFMqYnlQKWg+QDZhV0FLMm10ZXk3RHN1cVM2TVJ6MDA3N2QwMDEpcDAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5CitYSnZDUVZgeVA9V015PE9WYHlQPVdNeTxeVnt8VFhkNmliJWpAdmQ2ZWIta145UiMjblRZQ1pXQjB2dkN3YGw/ZEw2Qn05ZzNVcnBPQ3lfCitEaTQ7aTZqPE1LKD8raHZWKCFIU2RnRHI3fWhjam5wNCpsa3J2KTxYV3JQNjFwSF8rfDsrVVI2NW5Jd09nUiZeZT5ZZ01rbiVYQFRTRz1qCiswdjhqRGI/MkJETEY/TGdgWkVPeTN2Yl4qVWVXdVpja3JOPTVrVTdBWWlsfW5POGY2QklORncycXo9PF5vSndZMVJAb018eSZAYEU3XiVXCit1Sk5HLWE/PXgtd2gweFZVX0dOaVRqNHJPfnlqPW5SRE9eeGZXbDUwSFUkckJZOXZGVmdjUWBCO05DVi1sMjhYVSZHfSlmfClgUWRYM2MoCitwflNOd3gkSz1EVX56ezFTTWdtREMqdyM3SztLQCVOJjRRSUA5elhpfSplI1NmeEY9PkMhOHM9Z0AwS2x3aT4pazUpRUIlKCZDOEkleXFfCis/ezRTZkE8QiY0cmI5aVBKZGloOWllaUotKEUmd3FWbyZLZncjWChqTyQ4aXdkPmFpe2dDUitoM1RyQnozJDxxflElQFZFKGFrfjI3SVA1CitANVZJXlclYEVXbVMwbn5CTlRQPlFUQDMoQmV4eTF1dHhMSjIodkdiRnJZN2Y1WjkwP0A4cyQ4JU1nVyhfMkZadkcqK0t7KWdLTDVja0toCitmZ0N+P0w8Zj11SGN6dzI8XkB7dE1WbEw+bWNeWFFJWUlpVTxiKD5JJWtYc0FiOzIxQjhFSFEqZksjeXUzfU4mWT9MUHN5Q2xmfl9WQE14CitpYm1xNio3bFRVc01sZiMyeGNyKTZVdDRtJk5uelZRVXpyfH5oWXMoTFdvaCV0OUBkJSgxQDZ5bzloRkB1TVQkMHY+ZGFRUEB3M2FYV1UlCitHdTFIZnQmQil7P30mJkktRGtNVj1DQTxkPzd7fXpfey11c0BjJHJ0eUZxU1cza0NVbGxUbTZDeGkmVUE0cXJfWUtQTGFFbylHcW5Wa0M7Cit3VTRxeVo5P3NgPUFOUmVObFN1cytGT2pCIUtiMTlfTTdKPDglKHc5dXZFM2VZN247WnRPY0t5S0JiOGlnIyg/Iy01bXtZJUlHJjIrM25wCitPQzxuYkc5SHBIe1NzZ2NQak54Ym1QT15MaGVeSVlMcEpRK2NsM31TJk0pXnA4QU05VShXeDVhWlh0NDlpXj8jTjBRJDI/dCZvez9qPHxsCit7bGkzT3pARVhxYlltcD0qYzNUc0tGY09TNm4takJ8UXtvRns2RHQpbUltQTFLe1J4ITs2I3EyMmFSOTAwblFaZn1tdDtOZU55ciMycUB0CiskK3R1NCZwMTYwKVRnKD5GfT1KK2pEZiZiSC1Cems8Z2xKWT5lVypSKFBmYn00NDhucygpS0AjYHg5UlV7JDU7ZkBMVmRpelJ4aV5VLUdmCitfZ09RUjQoPV9GUDxAWTxsXm09KU9hOz5LKlA3NnhUQzlNN0xWcXJzaVRHbiFWa3liIVlzfmB5fFVGVFlpdmpaP1N+bnMqe01fSXNHeiYpCitFSVd4U1QhKylpY2hpU1UqWTtYN2AkenU7JFdGUlYkISlPTnJTT0hTP3FDQUhKKEokI2tMJDBXN0ZYYzZpb3tMRU9DZH5weWt3UyopYzB7Cit9c0d2QCp2fX1VVTN2ZnR7UGFBaXB4QUVSamQ4WCtWd28/MWhKYVoyRElOVFNZNzdPPE5wKHBiJlNAfT8ydzA1PzRrNmlyZyFtVmpUOGRRCisqRmtlRG5BZXhyWEZjQENsfFNRTHZ3THtAYEImWFJ1c1ApaD5ANmFXQUsybXRleTdEeER5IVQ9NWwwMDBVazAwMjF2MDAzfWxhNCVuV1dvCit+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1ZgeVA9V05DQUJhJXAwOWJaS3ZIRV52QTZTWiF8X05mUTNmdWMoVzRJCis9SUNjOU9wSzYpe3l7WGhzNEdmRk4lRHQybntuMGJUVWtubytnQy1fNGB5MEZFaDs4bX1JNShOcng9TV5pKT8+UzNVTEMyTTVfN3N4X3tmCitFeEs7ajg/OD0qWVMqeyo1QSo9LUxHRk9NVj9ub0NqJTQ4WVI5QnVMOFBialZMO0FqaD1nRExpTllebitsan08bjc7LV5WJUJ7OUcxOEYzCis3VVdqa1BTNXUpJDRhc0VpMWJzYEcmfj5JRiMjWDh6I0d7QG5aNkNteD92IyQhVGBlM1ZKUV4lNCRGd0wlR3EzM2FxUS17dV4jV0IrUGhXCisjWUNWN2RmekU1cVk0WEdfY3B9ej8pSSFScHhNJDVxciRJT1I/R3ByRVpJUWszU05xP2x9Z2JvUUI4WndJUjdHfHUxPEBzU01VazxkUjdpCitfaG03SkA9R0c7PThTaDhBaUB0YG0/Sm8odj1RRm9Zb3xAUSMkbXspekpCYUtUSG56ezdEXllhe2R8VC1vcmQpdVU/PkxRfWREZnpVWTMtCitFODFYN25gcjhEfXFwdjZWakJ8IXR1c1ptI2ohPHNSJiZ2dSgjSElMcWcmYCVsOztHaCFyfDZSYVZsTDlFJHtCPU4tZlAhPCRweVNiKStDCiteNUc0PStGOG1wIVJEa00kLXVINSF9ajxBaEIpWFB1JWR5V1N0eTF4elglU1hySHs/LXlXM3V1czt6dGFTWiVrZnQ/dkNCKDhBSnEzOyN1CismPFlXcDZkVzJKSENvbF5yNGhBPWtjS3NjOFJCTyVhWDdgQDh6aWY2fWpaVEx5WmApTCp5SzF9SnRvTj5+Wk15NVY/YH1KZDU+WkVwbTVKCitHeVN3PiEpY25GcGcxeHRGdUlNTlRKcXU7fjVBciRtSThhdit2LTBUVm9NM0k5S25KKUo3cHw2NkdKdWtMdzRFbCFUa09GMGpHfWpXPzBzCisyemoxKCVJfml2WWJfRCQ9VjhoQDlZeTQ7T1Q+e1piQ1dgcUVjUTdwYk5+IT15Sj0+QDZReEQmQG48JVd7Uk4qVEtwfEE4TkVOb3xzZSlhCis9RD5hNkRvPEJZdnVAd3VrMU12cE0wWk4/fCFWMDlvPHpwI24pUjYqY1p2Sl9UaittTSEoYmlaPTt4XzJSPSo2YEAzZW5kZm1UaGNEbjZtCit0PURiZHcpKldWejZ1LTNVLVkpKjVBN187QUtGaXElIz1HTmp8UnN0RTVgfVpTMmJRciQmUXd2QnojU35RfldAVlVMfU9ydSNnZzZZaEp5CisyaXJ8UURyX2okYk92cnJTPzQoM3U/RmtZcylsUFk/bm9LI0pNQj9WIW5mOF9UYT1Bdzl3cy1aZWVeS3BMYGB2ZiNNKDVxX14jej8lckY/Cit2bj4tNUA8eyhZbF49V14tdkc8dDVgK1EpSndjaGhWJlorYldCJWBiRGdvYTtMdyRgc0NZdkM0MFZ3a29SSUI5ITVvSiZZJVkpYkMzYW9xCitqKGIzViZFUVRPU2ZoJTkmMGpWJSNfYi12O3RYN19KdnpYQ2lRc0U3KFk2UHY9NilAO00oN3NZIzV7bGB6KCNgOWZqNiVGO154JChHSGJkCitySmprbzJ0dGlibVNqbWBKUzJETjh+R0twcGVMe2p4bXVvJEsjTGxTYFpwIVVpIyt2R2VQc1FialNGdXIzZlNDZUoyPnJvUkt9QD5VU341CiszVGZaZzE9c1EyOE9qTnAxV2JxMGdCZTdXbVNmfiZXMlI/RU5BdmwtRz5KTnJsRzNCMnNhQnRiWXItUUw4Ml9qak5HP2ZeJip1Kz94ZXh7Cit+eGs4UTIjRSlefkcoTWJaRWBaQlNVUD44ZkYtMkc2JEd6TzwlJGpMU2pUWFk+MyVSeFhxbEdRc3pqKlAmdUFfbzdUc1JoN1UlPHkpUURJCitGWktvUWZqSWdEeisoMDR7YGI+MGVWY0omT0UqO30yPik+YCUrbmhDYWA+KDZYQ0EzSUA7KkZkMGhQOD1APGYoemJ5UE0zfSFyVTliTih2Cit9PD43NjgwcmYkNnlEMDc4UFpQOz5COGNuTz5jM1RCZiopQzAhST1WUWZIYlBNZlY9VEh+OUgzKDMjajxAdy1BZ3xUZjc8bmohWEtoPzByCisjOXBOT21yPVJxfEtSKDV4ZGVOczsqeEdINGgqKjdAMlkwPzVNTFZIZ3RZWSQ3aE5CYlU8XjJOOG00alRYWEA0NV9CY1VobDdPeT9sJSZFCitZd25vNTc8aVVXbXRsZ1JUODVgUkN9TztDN3hIfFpPOzhLQzx9N3BEVkl7NzJ3RTdre04+Wm8yYDNvfVAqMTZXNkt0TXxgQHA4QGp3XlpnCitoT0ojMm0hLU1xcGZtSE9uPEA3MU5GVm8jdCYkWWtWS0FSTWc4Q188a2dJRjQmZnh+R0EpKShMNTMoaGZVa0RPJGZMMVFAOGxWMCNJdnVmCitSSk5UJlNCTmVfJnBgR245YEJ+I2lgZD59PzN1c3AmIUlfI0tiKHdfS0AwfUkoR2IjJVBRRTx7UHdFb0NsQ1NuaEZRfDJSKnsrMlJJRjx4Cit7RjBROWhxJGM5YE4tTklVaTR5VjdaKXVuamVhKntWWFBWWHsyMCZjKkI9Q19NcGFRTWg4QiYkQ1l6eUw4VEYzVjlRPU14fFctQ3h0VURICitkNW1UZ3YxIXlsPEE4PSV8XyFzVjx1aDVufSkqJE8qdVU3QjdPMVAxMkptXlZaN211eXlqX1Y5P1ErODc/KD5Qcj14UFUkPn1IekxaZDdwCitZZkwhM2F1JjZgQnhoWEtYPFByYWY4SjdONk87XzZEQld5d1h5U2skKkBFX2YkamNzQGx+XktRMk5zVlpZQmtfPEhTanBmKnZyOHY5dm5RCit9ITIrbnlDYVAqJXZ9YDc0U3V+MS0hWXNIb0BMMzQhNyZuPmlMaHckX0x6PktkQmQ1QDkjbS1MNVBOTXc/JERGSVYmYURlaWpHT0lvTzU2Cis1Q1c/ZU9WY0dBZXxfVk4kNGZyWl9EOzZxelckcWw8M3lSMTN0dXx7dXUhckcobiopPytRMFdFSThGcXN7OEtkdjJEPFNmak5sRDNAKU9gCitAWTk4Y0gxK0F9K08yPk9HX0tjbFUlMjVBaSh8M0VFSHFZVGcjRFFefXdXUjg7VnlscGRmfTBPQTtaQzUrNEgkan4jblYrclY+b3I+Qmx6CitRMCZBdXVBbzlxa2defktXekVfejVKO1YmJkR4SXVGJjc+Q3oqLS1eYU1GR0Ewc31ydjwzUVFpKyR4JiFNPnwqM1ZGSXUkT1E5O19IemJ2CitZQmIqZz1FVHN4QURBRFY7KHF8bEFLRV8kPTBXKj83MGs4cik0Xk9UfDdCb34/bjBnfG5sbz5FOSlvbDA5JXY2ZEA0T2U8NlZNVUFydmlFCitwSnBUPUZFLXI7V2kweHQ7azgheD8ofDlrfmFYVE85WXV7OFdnPyZSSSZmXkR5ZlVvdFFaM3R4Q0lYKUh1VGVwI1d6PDxhNjxldVE/eVZJCitZYDw8MV9CJDttUUtlaWMtRl9PWS1YM2V+TVgjdHhwVHBtPWJRdEd4TyhCUVVCYipAMXpAfEdaNEZOPUx7S0dDd0tyNj9MOFcmQ2F1cHk3CithQzRWP21kXmtLWkhhOT4xZEJHdnZiMHY2PTlQTGhraTRaY2N8YmpLbShAKUZ1THB3QzFGcVgjfVJLKGQpe3g4cFU0bHowJnY3JWRLTHh4Cis7TCE2ZXdgNSo7MWkzMUVKPTs+MUNrcDFOb3RmNGZpRWtNVTIkJGdaa3VLRntiJlNsQ24wdzI8PDJZQXJBWWZHSn18dyVgK3ViV2defHZxCisoKSt1Z0VVJG1fc1B2UX1ET1VkOzg7QGU7P2N1QDVkMEoyU0NzMGNSMVFZLU8wMDtve2xAPj1paUtVLSgxT05jZjRnZGY8MDAwMVJYPmMhCitKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZKb3c3YSZ1KkxYTDRfS2FCeTtPVnI2bkphQ3l5RS0qNEpUNVBzCisqYzd6c3JJbUg0MmlsUCpwMzAyRVNHQVA5KTZzQ1BuKEpyMWp5VTJBdXAkb0pSWnRaZ3UweU1jUTtLakdQI1pAPkJHaHBFQGdBTHREcE1wCitHRCVgaCkzVzBLTV5Ke35Ke0opQHlaR1pWKDw3ZjhsfSEoM2MocCpEI1UpQEV+Q0h6VEhOR3lVYSloWm9wOShhTExEXnokfHRveFp4RH4xCit6JDBjQXU1blFtPWFMKHBRNnomMy1KSiNPUUdwaWc7RklpN0lgTEJZSWhZZmdDNEJvMWhJRyhReCs/WD44ZyFeTSF5TjIrdUpgMHFTVzFpCitaVjxyU2BmOFk/TSlpdGJtUCVnPXF4ZD9hTD5zI0tpN1dzVXJoZFlWMlFQfG07UmNBSjBWODErbn5mQjtSNkcoWjtBX1FIWTwyUyRCNTNLCitHSCkzYE52NWRmRjB1KnsmcnxfaE4wVmNmUHFAd3QoXnRjfmVRelNnZiRJPj5hd3Q2U3ghfUpOcHNFSH4ocGc9fEclJVhMYFQ/IXNeN2xsCitTKDhiV0srbl9RfSlDOT1xZnopJXU9QkpVal9yKm5KdkQ9Sk1FX34+K1l3YEdWZXBsVWFtdkhZbz1wJCUqaj1APGVraHVUSCVvOFZaM0pYCitIXzROTl9pI0tLJnA+JUpodm8zKVRwY01uNEsjZ2gwT1ZlWUVgZ19fVCFYXmNsVyk9a3hBI2BGdXlkQnNIQjwxeWR4eDRYRnp+cHRLWWRDCitNTTx0RmQ1QUlVbiEjNzg7d1dIWEc/IUxUMjJSeDFxPmhPKDFscmR6OHYrUiNAI3YwcDYwWDEjbFFockFucjdfWUw9PEkqVnJlPnR0MlR1CitHPml2MiVsKC1PdGNoWFohR15zZTcxfjhrTyRDZ2BCI2JZclZqI3Mha30hcWppcnhZREt9Z2VySF5yJVlzUShKfUM2djZ2RSRWeU1Yfjc+CitJYSRAM1ZLczh1VV8+bFZxSnEpQiZFJEImWXRtfnZwdkYocVlQV3pfd2QlRllodj47Mj4xQjI8OEdaI3l9UmBacUlmQDNSWT1mPFVaSGRICitaUCVNM2MhblR4dyZOfX55dFQkNGNBYWk1Rn1HXyVCNXRKVTBxWH16O1BDPmUkNlFSQiN3MkFBZlJpc1p2OyNjQlJtdEFAdEYmK1BVJkBeCitfQkNfRD1UQVMjNyhucD13VH1FITshPF5leyF4Ym9BcnopM1k5R15BSihSUXohRDdOYGJYS0lZckNJe0Y+UTslWHplSGl8I1pPQ25XUHI+CitfWil1SXYkKHQ2Q1BnUHRVNnsxMGxJeXVBfWx4K1NibiZOJlpQPnlwamw7JnVAWT5IcigmZzNRR3NAeFNLXmM0TiNTITNnXk1TdFQ+eGV1CitnKGd4V0Mwd3Rfekw/KX1NU2lzTnJwZlRpQmJ8YTAmMEhsUChNeXpSMHFhR0ZgZHJpdkh1PFdLQWtocExDdUtnMCQ9Y3p9UDtFJHlFSEkmCis7NUhCcjxJaUhQMXowYTQ3Z1VMYzFsXnw1c0MqQFJDPzBwbF8xP0lHV0Zlc3hpbTFhXyslSU9SWlMpazd0cU1PNFpJP1Zqa0BpUSVqOztqCitkbTMhNEVIc2d9bVBtd3dneEBnVjFlY1FWRkZIJmxZM1VEJTk4K3F1Mm4rc2BoX0tEZUM9eXIlWWB6bDZUc3V1ZnQxUzFobGMqWipQbSRTCitjbyE8PjVNZHNjNEU9SktFNW5QdnM+NEZkQVh5Kzk/WSFKUmpnWDtnPUhvT0kjUEBPNEQtdmRAc0RXdGwhVjlrayQyLWg4Jld2eTMpaUF1CitISHxvVDk2aXpaV2hTeFRqdyghN252UCZtaDFvTD9SM0V4RHt0QDlxMXtvKktWbkYkPStwNXg/U2spRnoydz9vZWJmI3N7NFk+VDB8WFFSCiswMDBPOF5PWTd5XyE7UGZUTFM8OVpVK0RXSFVJenNhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxITNQVlJCPztiVDRDCitRVlJDYjJiWn5OU1ZyNm5KYUN4MG4/ezZBODVkRj95RjtZR1JiZyYwR1JWT3YtMk95QjVCWTs+P20wbkxQQDlyI0VIOCElbk53PElmSkBYCis/fTJ9cnFIMj8+djktbkBDXm5YOVl3QU4yPEpxWH5eaXtsTyQyUDtXZiN8M3cja3VXRERjU1Rqd25UdUNoeV4tYXpzOVgqKHpRWWtAOEV1CitZdnIrKz1IRTllY3t6YkxOZXU0NmFlX2glbk85T1NzK2Y2RHpaMk9Rcy15MXsoZW9fQVYxIWhIMH1Zd2FrUTxNbXJxcyo0Vyh2eiUoOzxaCitfZ3xYJnBEO2w0KUpYJlZGVDgtTGFNYz1kY1EkOD9SRXpjWFdiKn1Ebjt8KT51QW83P0d4d3dPOFEyN0U3S0Q3KW1gSHdFSlAyJmV5NXBLCitEPVJuREF+NXZpNGIzWFFIaFNqfnVQZ2s3R1U0OTUpVm92WUFQXil+R1BTfjFMRVhZS2xRVl5YMko+NjBPaTd2MFdJMn5ecEMzd2o1PDM2CitnU2oyQmtFe2lJZE59WiRMUD9sJUFhWXZFd0NyY1ckTG4oQzZua359TCUyZGU9IURFQFJjMSooMkhyVSt5QjtfeT1pNFIwKlhhSypIfENVCisoZEtJOUpWaGxPc1UmTjE1b3Y1OHUjRV9+cFJjNWcjcTFFZWNiWHFQPWtNclMyQlJocEMzSko+YXZnRmdVN3EwZX1KbHJvaSRpJjhhIzBBCitLbnRUNn5AXjd1MjBSKHdGWGgta21IU1p7ZHFwOzEmKHVCZ3hISE5kVGlORTN+Z2I4fl9pNGRIKnZheTFtaE93MEkyY2hvaS0wNVhVcn0mCitaJGVZP3RDJW9GVVE/RSY2ZX1vRyMqNH5GN3J8MUFtJXhkVW5ETDd4aUxAQExuNVNkYF9kb0xVSSY2SXI/cSV1dl5pcjtSWmFwZ1dMeTJHCis5eDlfKHlMdTZGNjctZzJMRTg4eEp6SSZsZ1hqNkN5RmZZaHd+NDk5cTklUmx6KTkldTNONDVjSzltS1poc3FlK3FASG07eElUMGQrckheCiteK081dFg/R0RqMGhVTDtuZ1VRYEhtKE53TFIjKiY4NmREJUJEI05zVUd8YmZ3MkdGazZHOT9fQTFOS2tNZXI4UnxfRzFsVzJiQnYtNXtkCithdmxEY0Q2SDFfdUpaNHB5QEB2QGs1fEpvJVNxaHUzJXlqSj5qTio/anVacFRUekl3N3BzQ3g7YzdYdENrZlYzdkpwSEJGND5RJjdSMj87CitNKlhkZ1d6JDBvKC18N2ZecD9gaWhkI2gwSXhKbXFPYzdgeGliXlZLOT81UiRyMXJIS1NFXm8/a2RaNlUmaCsofFVTY3xOR21JY0R3Y00kCitEaE4wOG95bVBEWlFyYUwpN2IoIVQyV1VWTVlfeXRGVkYrI1U1dCYtdDY3aFNKQz9VfDVMdiZGVkB1YlpoOTg8VXI8V30xUVktTzAwO297CitsQD4/OSokXzB+MHt7UkgyPjx7KTAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RkpvX0hYPk1uCis4YllYTzVaRENfKlg+TWdNYUN3emcrbTBHSjVQano+TzUkTilMKWFuRk59Q3p3MFNIVmB4UVVBKjZwZkpTdF9DWV44YCktOV9VcmUheVNaCitlQk53UipUPnZEWVJSRnheMHVPRGk0OShxSVNfdThHfHZfcX1fc1FyYXJpN2w3UEd9fHpadFh4WWk2dHp2dkJwcyNaVSNYTys4QHJ8bXd0CitERnArU0FmWU0xSkJZUiVYa1ZPaFd6JjJJN2I4VF9tOylRPTBDeWpEKGopSkFCJSR2RHBXSlg+NHE2azFQdyVGfDdfNjs+KVhxNE9yVSl1CitHKUMydzUhemtAWm9QalRuKD5OUXpARStTVnQzZllAYXlKRGBefDt0ejdOQXVAelVuZ04wfXk+fnxWVndZRDspdyotY3N5cko+SVo7VVNMCitoY3JzQXRnd2ZtUWV2Nk9uWilsdz80QXkwTjBIRUVJaEhQbWhZKzVHantoX2tgS2dJemF0TmxLaiF7bHY/YilYOHNOdXRLUEpNUEBOKU4yCitycU1HcTtyRFROVXpLbUVxQ2dFcnNZO0pRX3N2QyQqM25KN3RmWH4jdUN6a01zeVB3IVBTbTw1N2FsRVpTdGRYJSk1a0J4b0hANnxOM2VwCitFcz0hUUxKKX5geCV0fjRnOEd1UkVaI301RmEmXl5ZOFIhbHBgJHhoWFBmTFF3NG58JlY1WFZlQG49eGNLX1glMShMZCZFTCVjK3ROY052CisyeVIwZ1M0dyhFYjQ4MDJwKjg/YSM8KXd0RF5FWSFUUlpkJFZDQEk7SE10TFFOVnNDJG5DQS1mdkU1SmZEbjUoQHZkZSU2eWJLaDxRIXFsCitmKCVpUXYpU3FfQ2hMYG0lYyFJOVNFd0pIc1hvVj03PVJHaVVkfDxkLXp7SFI3UzZ9ZFhhSiNecXlvdytWfnBudDtGbkxgZClNd0RDaHB4CitGIVdLcU10P09CQj1tUU03RUY9ZWw/a0FgJHsxVXRtVF45VzR3fWZsZWI7RSp6SFBqfVo0a3w7dSlLRHRHeUw/TWs0VSp4Tn59cSM5JHw/CisrOHMkUmchdXMmazMrcXFiYlFee3Vja1FqJUV7JTsjckJiQVgzeShyOV4lQEREMk9gPT8mMzdlaUMzPXcxYXcpT2clVm91fU5eMGNOWVZICitkc25DaT1QZkxCTStOQkV3NStCPDdtYF97cXAqZkBtVHo3bztpMjswWiN5QDtAUUpBOT5ESWBQUjMhU3w5IzBoU2Q0czZ2OE1zXikrRShnCitrTnhPbXFRSiZQSTw+Sn5rV2FkIXt2cUo7S2A8TTdqdlhxK3E/bUJQNlohUyRIa1AzKn02ZmxtUkgjWXJuWmo4IXo1fXhnKmlxQl9VVmpRCitDTUxYRFJlYXlXb0NfQyN1I0F+aTt4cFNfLUwhMzstJjgyWlpkaV51fkt+VmAwZCErTj5xSjNXckZaa2debSlQUnJ0TiR7ajdoX3hhSWFFCit5UHx+ME9WemBHMkshQVJiYT1CVj5yJDNneVgte2hWRDM5MUw/RG5pNl87MThtSEVkdHl9QmE4QUpFTz80PmdfN28xQHkqVShERSMmfVo1Cit4X1JRP0A3a2x5TUJRO0pUbWleQV5ZdUJBODhHMDxFK19NWjRXN2VMcCM4c0gwUDB4VWA/YSFHbSh8ckdiaiNnQndNVCRDMHt7Y2AtMHxYCitRUjAwME84Xk9ZN3lBcDZ9cFEzM3p9ZyMtV3FGOH19bGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUCis0Q1haRSNfOUVedjkzUSUhSCRLb0d0QVMzSFJlTkRoVFd5X0VKfnM3YjY2Syg8bERETyVnKGRSNFApP0poK0FfWns7UURrWjdmejFUWjVACis5bXFmVWhuO2JYP1B6a3Y1MDJqRzZed1Z0WSR5KEwyUz9LVld5UWNHVFM/Q2BnWlZ6RWtHbWArZjU7Q3U1cDcjOHdhUGNaZTY5NypQK3IlCitUR1RRIyFuRU11KGgkTXcoIUJebjZTUjdkb0prQjcod151RShtfC09bFF4WHM9fFl4bVhXRlpSM3x2S1VXT2YkMUpZTWRYOCFYNkxfVDdeCityQldrU29TdUp4MEZKdzsyNWA7ejUqPSQ3eHZpNjlaY1M0ZjA1WD8yeDNuI1VqZkYlMzd3LTAxMlRXfnVaVXRUKmlgcF5iXztYM15XeTZKCishZTdUdXkydG5Qdnd6RlVIOHJVaiVyKHBJfFJ2Pz9hI0x8PGZHQk9+bEJtSFhPZjI5Q3YzbHM+RkJEVDN0fFBlQnw5JVhCOzhTZ3RnQz18CitDcVl4b2N8NCNHSTg4JUMjKDwyX0QwRV9QfmY+OFpEeDkrb18qTj1gdV9iJXZVaTJ0YjtnPld9OEoyVzQoI2p0MFd1KDNES3AqVGB9SilACitAdDdwcnJjPytXSTt+SStNWkoxYShnV2N0UDUxKUstfWg+PGJtWjA8aHA3OXRCMTgjS2FjcWA8WFhAUFdDXjk2an42MyhjNmo+VWJlQ0RLCit7cSsmNGVDWHJ6bjFoNytSZFdqeGhSPGNtKWJtPHY8NzI5PT5wfnZgIypTe3M8SSZDZFpacmxxMzBwb28yJCRkZ2FpNG1nJERRaWQja1NWCit0T1dGTWwmdld4RVJqS2g2e1d+OGNVTnpue1dXdiVqNC1VU2UmbVcpbkxGVCVrZmsoQmF3PXI0ayRvaztoZmNYbjV4aj4/TT00SWBSR3YoCitoTj9LWTV5UlZ3UiolQmU1PlNOMWN5SkJIbGVENGEtLSl+bEY1e0tFU1VQKWg+QDZhV0FLMm10ZXk3RHhQNXp8WGI8MDAxYHkwMDElbzAwCiszfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9We2RNQWJZWDZFYjFyYXNsfmxvUTt4R2BzXkEjZztYCisoaEA2c34mZEk5I1JfR1hkJDJec056KGFXQnt3aU16KDJ7e3JZX2wmPmwqcS1BSXcqQHRaZEBAN1phJEZGJGtfS09gd2xsMk0lSUcyS21PCitxdT14ZXcldXd8djFPV0J4c2g1WjhrdmVvSSt+aDRRWWs/VEVubkY+PzM3eiE5ZWIrU2JMb3d4NjN9a3olI2RqNUMxQ2diJUY2ODdsM0EwCisjS247QSMtaiFtezI8PihVRWxjNjAoR0UreUg/fj1UbkM4WUY8RTNUY3h1Ujl3Rm4lczJZfmI0MEQ3RSE7SE0qdWp1aCQyfk1SPURZcjY+Cit6bk07U1l8dVVzN2A4NSEtWlRwY2pxbUFuM2wyKz5zNzduKTE4djJzVEBnYnFEPEwtWDJpamN5UzZ3I0YtejNIIz1LLWJTSTVLIyl8KWxACisrIVE+YUh5X0lrV2F9PXpLYEVJWiFEeVMrMWx6KWB3RF9ncyMzQml+T0NiPGhsLV9nUlVAZDd8WE5XeHdGVSo+NEdOZ0ZiWH1lV3tkTGshCislRTIjJHJEKyFjMSooMktFJk1pTCZ8WXpCdEpEbVYqfm18e3ZvbCVleUFQbk19ITk1ezwrJFR2NGRJWk84QyR9P0Iwak9ZY3lTeGY/ZjhVCis4TFlnWiFOO2YtTiF7Pm47U041KWgpTGdZeyVGTj9hSilYSzRqNiE/cj0pbkNFZWVYI0J8U3gxN054fjwyclJ0N0UqdzVHJD16Tl81TXdNCitXdzZEPVEyJlFwMWRQR0thbXJSbWs4UUxFd01IPVRoamJ8QX1HPkBfKDg3KEdKTSlPNUJwWEc1RT9sUFk+NHIqUmZgQ2EyUkQwYz1AOys2Cis9aCstZGVENDBoO0hSa1JoYTQ1TGZOeXtic3lqT14/R2EjMHoqWCRENWhob1ZFMFl0cUpkPSo+ITs5dnNrNXsofE1oO1NUT2ErM25ENkEwCitWTSQ2ZzxlMEs5Kn14a0NpZERMd0NtYzBHJnEyP0c1XzwtY0EyfHVUUWtkNSY3eiZJS0JWSi0lcT5NZGFpaE4qdzhRUHdPVn1OezlMM3l1CitETk05QG1UYSpvRWtyNmQ9N3hpeXxEZz5pTEhnYDRJPVVHakwwOG5TdXQ3XiYmNlhGVj09aTg9PGJpKCk/WkxkMHxYUVIwMDBPOF5PWTd5CitzfEZePE9hbE1fXzY3Z3xHeW5ocWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNENZSVcjJE5hJktaCit+YXhRUnJsfm1ocStjKiQ/X2c0KCs3WUFfRXhWc0IlOHVVUns/OV87RmtaY3JyR0g3WEo2UXhMbHEhT3JLemVrb1lZMnBBfEsxcCpxSmFjCis5Xj9lXnRFe2xVWCVPNTsmOW0/aWAyazd2OyVlR3VEandQfj9zbnB3RyNTfTJONCN2fm1UPTlnNFQxamNTQ2cpTHx1THF9U0FpTzczP1dACitVRDQkPmlpT1U/Nl9WLWxieTRGY24zcVdoJVRoK1RxdmtqTlNoTG5DOFlkX1NDWlFvWUFgNEJmaF4lKmN4a0I7aXwydFBJTmBSK3VNSHVhCitXT29nUCRgUCpTVnU4Q3ckR2UzbHwpOCtFN3pxcncmU2s4IWFfNj1fOXhBeStFYGk4SEchY2daKWpmbXQ8aWAyQSZydTJEe05KKGx2YCRVCitDaWdFT2MxTSpkREhXUDVYVk53QjVXPHR0Kj1KKnNVemtraFJjJEpEaEhgNHdvXjljZDhhXzt5Ry1kfjtedVVAZXMrcEgtQn52N2lXeTt6Cit5Mn1pcnk9QylfMGhCY0FvSyFrPHtAT3lSZGgkWn4+LU9wP3RFYzdNbDlkQTF6Y0Y5PWsydyhGQEgrT2E3Ni1aYTQmPCVVYzNAJUQ9dH40CitYNV9wbj1Oan1ISyUmPS1zbXQoaSo0ZDh4V1VLckg8akV4eWx8M2tzKUNeZHBTcGFKcVE5TG9BZXI3eVdDSFdVKjVjel5LWCE/SkUhbXorCitAMGQtO29qYU44ezFyc2IpVk1FdkFEY3EyVm0xa21nfiQ3KThyKjd9STxpJnU3VVhBV0UyejY0enAwNjhSKT80Iz5obCQmOV5fJH5DMXdwCit9aF9TUllxSSEleEg3VTUpKHhOUGg/bTlRNGZ7VG58LX1WSVNZRDZHQUNfKG10TCZJPnxweGRiciZlLXsmcTMrWTAjeUFkSSVFd3IkUCU3CitxemAyZD0lRiZrY0J5Wml1Unx2eGEmTngkZE48ZC16aXhVJiVMSkI+NGheUkZ8OHQ0N1RkbXhoZmBWZTVaaVJMMWNoOzs/S2wpY2NxRGlUCit8PntwJjZjb1gqWHo0d3JWP0lRS1lkNWxeaSh5aTJkT3BFck9yMW5mMiZvS29zckA1PFZgajlZS012dzlSREBUWlJSNWA0bzZGdWpPNmE0CispNEA3cldEIU0wTVpSeDRHKXh5SVA9PnMrUmRXcjFDUiQ7Zkg3bDJ8I2JSbVpXKTVCQjw4UDdIbnpLU2tHbiFLeWVeSkUzbkUzaCVyb2RyCitybE1vaD00bThga3d9NnkhPVFLNklkLU0oQTw8NzxhTHVfRzkjJFdRUmRzXkRENkNWRXohQT1XSlF+OzRSSH1eOFB9ZnprTXV5PVNgcyZZCit1TGtoNV49K1JiKG9yITc2cmMqKTNQdEVyY2U3Q0tlaGU/UCloPkA2YVdBSzJtdGV5N0R1S24obThQaTAwNDZnMDAxJW8wMDN9bGE0JW5XCitXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FWYHlQPVdNeTxPV3BpVjJhJktafmF4UVJybH4hR0U+TnBVNj1VMHI+N20jUWNkYlFHCitSeU0zUyhUREF9bnB9T2o+Uj4mazF1eD9eVXdyTVo+PnZ4PGwyIXc4JUNvKD5CSmFndEZUd0smWWE2Zm4peGlCOH0yZCsxT2B8LTVAM30+CisoeGpTRTw4NVQ9VCt4bkwzV1dxYG1uI1BWTXJNYSs/RTRMO2VOTWdiaU9aYTUoeUBDX3JHcGFMMCFzb0B+SmkkP25fS3tDYmhSJmJ2Z0VgCitfRjdsfU1HbzVIWlo4JUl2O0VXLXglJkVAZUV1aVlkI0w/QzdlRWZvOHUyLVJ0WWBMe1NUT3BjaDNqd14kOHgpVHJKdCRUSTBtVkg5NiZqCitae3REeCotZHxnc0dufTxJITYyNyVxViNHKy1wbWM0aXwqbzxCKHdAcyhtflhIXk9uQjRgPCFjTTl3bGM1KHxvNlFENVFJLUA1YzNAe1A9CitDS2RVfEdUYENQbnprYUtiWnBjSFJqZG1RQUtlIWlxb3pwVjVkfHZCWDB9fkwrJFpOVF9mY3BCclhqSTV6MWJAQHcxSWVlQVRYM2ZwUT9LCitjJG0haFB7ZjBgRDErSldLYWErI1YyQzFPUWpFJGVGbk9NZ2IxLSpsYXMtWCVgciZmWX1yVTd0fihyIXE1YGF5KTA9c1VGJHRQcip1ISk/Cis/aTJFeExSKGMpP1B2VmZsWjNPez1EZEN5KEUtViZDU3JjPGg0Iz5DPyE7elVlWURKSU8wMHc7cFdWQlVXc2tLWC1nSlgqWms9IWNfKUpNCitjVWhQVXB+clMjUTE9XjxUIWxJbX0rPnYjQj81MDZmRyhWaz41eSRmZCp+UU8xJiM0QTN3aD1gOGhFRHpCeWhxWDBKUzRYTW1OYV9UNXhHCiskUDZGT0VydzdTZn19dCVVO2wxOzJ7V1UrVkhNOF4kdkM0TnAqPjNVKjklMHozO1QpX2IhMiRfISZfTkphUWxNa2Y/YHxsJlRIKVFYMzFNCitedkpoISkkTWpKeVdjdXBmRVNNfT1OPWZpNTEoOGo3bVlAIVdESmZpbjRLRCpoU15aVGJaJHJPPiRvXjxLSzxvUUNiVDBXaXIkLUViKmBACitaP3k9PzFTeiYyRiY2QV5ePVEqbUNVKnZDPyhyNk1UUzBzT2FWVntnMW5wdFdyZkhhOT5PK2d4cm5aTXh6T0xUaFQqXl4walFvNio2P2RjCis1bXUyYH5eRHJodHNlI0VxZmYlWXBHSDdqcWxWcjwrMmhPa182VDIjd3JRKTNrN2NLY05EUDhDJng/Mz1UVV5CXmExMlkqKXRJKm9vV2NkCitQdz4oQnBEXitNX0pqciMlaXpTQWhTaVd+cGRsbmBXeX4zWVFyXlJQNnYjQko0MnhnPGRvdE0tdHZ0MD95e0kjTlY4QkFHTm1PVnZDS2NGCitAcm5JSD8kRmBEaHFXRVFseGNNKE8mQUFSeTBEPEpQUHN6eyh1STMrUFZGIzttT09EKVR5T2JZYyRKejc/eSY/Y3IyU2p2c0t+QCtZeVp2CitBckRhYUNuT3xSSndhOHJ7SH42M2VPPWx5KHMlfmQ+Rm48aDVyZyNCSG45OGM7b1dJZlo4QCNJJTB6IUNVY1d1eHEkbDxoI3BvK1olaFl+CitEYzVWN3hUUipaMkB9XmEzJWJnKUFCd3k7OVQjUyE5QyttV20/eTIkNDh8ak5BeyhqbzFBeGJXUnpzeGRTYjxKWEhIVF9uckVgfCFqLUZ9CitaZEk4YUtlYk1ZS158Qno5NllxN2BPZXQ4R29USHdDN082KHRaKDVhOCRmTygmTjhNLVVZcSZeel45OFE5NV9lYGkkYnVqdStwT01qJUd4CithKGpTXjZPI25VQjBxMmZkVSM4JjNPQDEtO0NfV1grYkgwWVUlNWxKQitEPVRmZlM0dV5wTTA4bVE8MVFZLU8wMDtve2xAPj9WTmQzJm8xCitwb2tfOXNtRj8wMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZKKklNYjhSa2dkRl9+T1p7a0p9CiskS1VmUU13Yl90TlNJPXEkQlgpY2FGQ0VBMU9kQDBfb2lDeGIrRkZaYlp2NT9SbGo+QGB+YTg/MWxudFJzc2YxfGNJRyFieVglPk0lLUk/CitMZn4oR1RadmcjWHlFN1BmO0hyUCR7c2VuYCZrQVFTbk10QDs/dnZ7YTU4OG4oITN8Kl57TntSfEM8Vz5YRUYzRXBHU3tCKE1sTzFPbCtWCislJjdFKGRySypZcEF8QUNBYE9EclN+JkY0JHN3TTY2d2V1eTh7QjJlKU0zPUczU0NGN1FvQjliO3RTOD5GYlF3Yz99N0F1QDs3UXVQQDBgCit6OUhmZ3hEOzYwfCVJTSZ1ajlOUVAyOU9GTE9mSk1iZ3JQTTEtaiZjbGxqSTBBNGQpSz9nfi1qajBZcGFFdFdLQGBBbjcwbSlhVHxhSig9CitUNFBTRTd+UFROZU4tI01CZ3k2T0lRVTx1IUlqditIUlBIJEJsP1VgMVZoTUxWaDBEdUN0PHtyRWxZTURDPGI3ZDZAMHRfMjI+ZUdRPj5iCitUS1pEcVlLRl9IPVVORSZUfSUzKjFRRWk1Iz1fWlZyQEVCTEk4NmspMGZ2dXZfWSRPd2NBRVFIc3RgeE9EQ3lhM1h+Wkd+M2VIN0RgUXZGCitXMil3fGdTSyM0a3NFalBKVGQtTkY0WHopRG8jRWMmOX5jbDlgVkRVKm1gWWZOKHBoPiVqRFd1SXhpYDdGZjAjZ1BAQ2N0PHFmdSl4ZEF2CitrbCstYkRwYDZaRnVgTkRIQ0ZzQDFvS1UhaHA3fnJsbVlUcUV5eTZXfE5sU2ooRituV3FKPDF1dmFONj47e1ljJVAjQU5zOGszP0R8cmAqCitFaVBGcVNnZ1Yla2hAbGg8NDlWOTByWko4OD5FeEwla257U2w4aCF+e0pYWDV2fW1GPGE4Ykl8PkFyJFlPUVU4RzM+TDZ0NVNOJjR5bHI+Cit3cTZiTWZqIyV5bSM+S2R2VXJMV3Bsbm95eT5rezV2bj5tM0lENXlNPShhYj5wQj5ePmppLS0hY2BEUDxhKmFhd3J1RW5TPH10MzQpOEY+CitrJG9AZDNfYyMmTTl2QllNK0l7elN5O3BvOSNsdnROOTd+T2t4LWJBPj9sUjQkWCpvUSR3Sn1nJVAqRH0hcTBHQygyTTJWOHZ2Nm1XQnJ4Cit1ZykoUHJrai1JakkmcGYmPjNKSipJP294ejhUQDwoYVIkJHMjRjsjMjVAKyZVZ300Z09SZnd6YlQkUSpnJnNCLTVAPzRGJDhxZHs7dE1PCitjJnhPJkRfQFY4bnRHOD1KcTJoVDc2Q1I+QkpNeEQxMipXa0coYVpSM1U2NCZIOEw3ZDxATDdkPlpEUkVQdG4tVndXSWcyPXA9UGNxWnAwCitrT3dkQ24lejx+ZDI2PFQqKjQ8VC1+cGh2eXZQOUgoIypTN1I4KCNoQko+Ujw4NmlpYGlpUWxETVE3RHA/SCtIYjEmXmlFRSN+UCs0bk8pCitIfXZKcFBONjx0K0pWKW5wKFhPazUrVH0qSyhoI3h5dkArKDZCaz1ON0dPRk9Xd0JUamswRmMqTDwya3lLJnJ3K0tndFRodFp4MSl0Q042CitPZyV9Ymc3dWRCaUppdUdjbGQ5WGh4WHMhVGI+QlIqIX0kbk5McCgjTmhOekZFP3JeYXwyeWJZK2NqZz9qXnRLXkZuU1NTRTItRkxKSWheCitYVShDdHItT1UmNmBic2xRLUZXdiRxMGslTzgpZF8yNTd4Y2tfQFIyZ2A0OUV9JUt4REVAN1U3Ylp4citJP2NVR1koJSNTNnZmal95KCUjCitTNnZmal95KCUjUzZ2ZmpfeSglI1M2dmZqX3koJSNTNnZmal95KCUjUzZ2ZmpfeSglI1M2dmZqX3lIb2JwU2x6OW9yZE96MkRfcTRFNzB5Cit1cCo7PEE+MnFlV3ZeTEp8cSFlWWhFVTJ7QD0tMmxMO09mYTtGKzlKVCZMMHs7NV5XPzNefGt6aDdqYzdBMzxHeFBWdllmN3smTm8jMVlHCitVZlhKaiU0c1UpIWdIaWxkSjdKY3dmfUtjKExvLWdKeDJPajdFXnc5JkJtWj9lSnRSJVdDakBYPDQxb0dMd248Y2VTalJEcGBab3ZMLSRtCit5bEw1K21pLTc/aERHX0V3ZF88JCtvTlNDSlBzWXd2ZXlNfU42Uyk0SXpqfEB2fWB8NytucVN+PjlDZil6OGk8Tj4/a2Rhd2RgYU9UJVVpCitYdFlLZjx6TmUxWCFraXI1NHF1YlFMXyZefEwlbj4wOT4hSTBrezsmUWMmcn1ZNCE4OTEpOTYyY3dsbFlFbmBnVnFpPHNaJSp7KyhpeSo9CitCIz5FVnkzaGdnKVM+KjJydV8xLX19TzcteC17RCh5RHNBcyN3VShkeVF4VkApR2RgcXxYZU42K0J3dDE4Vz8wJDgzTkNNKTZLUz1gZSVRCit7djlLODs4TUBZZUloU0swVWdlKDxYKHswVUc/MHxYUVIwMDBPOF5PWTd5dGJEdmgzazNpR1VKZHtOR3luaHFhQXxOYVV2XzB+V04mZ1dhCislRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNElmVmBefTRhJktafmF4UVJyckItY2srREgpbyZhVzZYQThLXmUyZHlleTZYaGdBCitOSjkkKkB1RGl+TVFFfGR1dmRFKj9YSHUhenk0PFohaSNPJV50enY1VVk/bkdXX0gkUlhZfmlKYFgye2w3IUc+PEB2SU01IUBKJlJJQU1GCislSURgMkg7WkVeMjdjN0xIXmJ4cCpOUGcjRyRYdXpgO0V+TDI2czd+ZzRKWFRNZThmPDBRR3BEPSlMQFlQNz4pTVc3RCpJRXZFVXZ2VG5iCitIcCltRXpYNCp8bk9zIVotRldDbmQkQmBJUHg2aksmIW5eMzVZMGpKbDUmVzhfdzVrIyVJMyo5aDtza1BOR01VQ25he2o4Rm42aGBxP1lACit+OEBeUEQ2QUJje0g9Z29rVXpCWHxScHAjZFhkbDktSllkSHFDOSRYQU1+I0loNzlNOT94WVBuNmdOQnIqbiUyfmc7Qm94dXxrMkFKXndsCisjMlcjPkdMNDVxRkRHO2o/TFBqaWdkeEAkTUZKJnMzfXdVaHlvUT1HbF5Gcl9zRHQzSnJvKiZZMW1xcy10M3ZXdjVDeWBNQnFqZWU5Rzx4CitBU2I8entmSjdGMW0zIXhCM2gydjA7I31aI156N20rKi0jYkM3blA+LUI1KzZUVDgqZFFYalpUVks+QSp7VUFVcF5vaG1AUnRUfWlBUCFyCitFSyhfRUBGdSVROSUlTUJKaGNEZ2Z2XiQ+UFV5djteTzxMKy1oUXk8NyRPKUxMUWNSZUg1K3tJQmY3LWh4a003bEFJR0VxdD5+OUExYWVwCis/MG80WUE9VmJZej4yZmY5eEpCNygmST1QJG1VNFIqNEw5ciNYal5ySzEwWU9IUm5EbyZ3OV9wPDBkdXAkeTFWYk0tPj1DS1c5Jih4fVYwCisxO2MkdUlSVmx3eklNT0Q9bXRGTXRPaXEtbnZFO3hzIW5lVTxKSyVEJXJYOGhYIWQhVFN5d0c0VTs9N1I8PX5oNmU8RjZIMkxDYTMhXnxyCitsVChUdyU+TC0/S2hvdz9HQ19WTXZfd3BgczM+dEV8SWZGZ0Ywb2VpJXhWU1AlOzcrYSowUngrRURLYmQ5P0MyT2xkUypDMDlnSVpaP1dUCishPjx5OUo8YHQ1T2oyI2BMa296REhOaEIrbjc4MnEzJTZkWG5PViYhKC1iWlF2bH5yMl9QSWxVKGZjJkhLMlVVTlY8bm13PkhXTClnbjIlCispd3lPZjRQMDVoeiZea0lZb1ErMWJgTkJxeztlfH09T3Fkbm8pWW5JZ2h4UUlsU3Bkcj1yfWVkNUl2VD91bSlsZUM9cExLenRuRUt7OFJmCitLJDtJZjd4PVA9b2RZbFdOZClUR1BQeWc0PCZfazB+Vm11TXtlRE8lNWxnZ1pocSFPUGU8dT5EQ2spaWBUMyVYfW80Zjw7JmtzbkVucXokCisrQF4mOE53JHk8PnBycl5ZUXtTTWl8PjhgQSF8Z2I7PDNZSVh7e1NHWmwxYlhWOHR2fEZqXmZ1fXc2OV5Td0VlNGN7WjRhO2NCKD1NPHBGCitsb19pbFBiUlFoZzMme0UkRl99JmRCWUtwdUJ6YURXQjRDeFBvfERybmt6O0EpODB1dzJPYGFGODd6JiNsQktmOVZmbz9EVTZtcnVIdHBvCitDflolb1UyVyhRUkJwUUtRWVBJPkduJSF8bUdjTEBoSjJ4SD0rUXgmOU1BKWxHV1ZMKUdgSjNiSW9MbnFiPTVmTXVifWdRaklsSCR0a3wjCitVWXYkWEw2dkgyS0l4dT5LUmt9e2NPJkB9UmBUZld3UT5HZih3aiFKNV42YUZJaWpfaTxITyRVPmxgKUZSWktVPno4T1Q2fk9kRVRqempoCit1ZFFhWHo1aGFXa1ZAQVUyXzkpUHVxPG07Uk1nS2hWI2EyVj5FcnV7NzQ/OGViJlg2S3lLI0MwQmlIe21NYSVjaX0yYzNHNCs+OD8lZlU3CitPTkhNLWQ8UCM/PG9OUDBuXnB2b3ZlaFh3V2s+TSg1Pmk8RDRMREV6Sl56ak10a2JlZkJXTmV3X057PkpBbyY2YW57OWNzQk9tMmNjKVRjCitoaC1xRjw7SmFyK3hZfXlseXVDJnZoJW00ZHNHTWtJTyF0KCRoajNeSzUjLTtyJUxBVU1ncWpudCQ2SWBxcXhkTnF7YHtoJj8rKzhtJkVRCit2KypCTE85S1FIMDAwMDgwUH5kPU09SW5saypgdyMwR2hKXjA1U2pvMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpCitNWGtsXz5XcHBvUGJ6XklDV14hZTVFXnY5Mi1FRlVJTnAmRlRAQXBAdiMxfnNDKGBRR2xtJm1idEIjZCEpc1dHNGUpYmVOfnQwKnEhcypBCitlSnQtQH5SKlV4QGRmPDJQbShoUVEqYnh2bCktYUJIJitZQG99ZSghdCNAJjZ1d15QflVyYEE7NHt7YGBrT2BwTTZLXiFTP318TVo5ZD9lCitWfCg/RHlWJUA5flNAekpMN20ofSNjaEBYZVFCS1lzWX0qWTYpNnpKMmB0JE4mNG8qSSQybXxOT2goe28kSnJVdyElQSQ0YCYxelcodDNvCis5YFo5LUpralh5RlZ4V3tGQEtvZVlqS3A/ZlpYenxNa2I7enlJfDNfP3lSZnwzUk1qPVlSNzR5S2xleF43cnJtVSlnXjZffDNRWGtEcUAzCitAemVacFhaLWx0JDR7QHtmQSM3OG0qMmhyXzJYQjZvRS1vQ3JNfjxtdWl5WGl6U004T2Q7Ry1AfE1HRD9wWGJpdkttN1JqQTN5bHw+JkYqCis5YHxhYjRfdXN6JV52fn5xe2QkcmdlKkVVVVBhbDV1aHg7LUE7QGlMYy18cFckOSlKSmtyfm1ReipAdihIPkM9YmJKXnQhKC17RShVPz47CitfJF9RJnNqYHwrRFVKXngpKVV3YD0zciFQUEtRS3xqcilCRT8yWiRKTCN5TU1XRj81YGh4e1A+NSpTNl9iZmAxSm5RQUhJRU1lOzM0ZWsxCit4T1pePyY7Sz19IU48a0g3eCNuP0wmMUFITW5ae1ckTFd5WjRgZF93QXB7QFcxQHpteWFMNnxNdEdxJEE1WU0mSEdSSClCTmxZenh3KmFTCis5anRjZkI1U0NIe1pVMGVFSUY7X2tRPjdafnZ7Tns/M2ozezcqT1hfYDhwSF9FV2xse2RvVzNlJjRuS2BUZUpGQDgzTXVfcGQpKz9OMiM9CitfUEZjJUZUVldGe29sM3Vka08jWXpVZTxjelBAWVkpMU9uU3NzRXIxe19Sbkp7cks/QjxvbnlaQGJDWSliRylEUVUrJWJpe09iTVY1OHVCCiszJV4keDA/OVNvLT9CbDxHeylfK20oX2pBTEBxP2ZJIXtmakk7RU9NUUBSTUtzIShaUUB5XkgjT19wWlFLUDlKe3ZgI1QxSXtrUnxOKTBmCit8VF9zOUZyPytwSV9NXz5II3p1cVorQEhlMFRgMTQ9PGdXTGJSJnd1ZmdBTn5DMmtIN29yN21wdTJlKWZZZWUpMEphZkJFQWRlRFYwJUZUCitlUU5QaztXUz8+YDx0ZkIqaV5Xdm4jK3FmLTlZR1hCay08P2xZO01mdk9aLStsU3Y+dT4rYD9FaTNBQFZFQ0plKk5wbVpAPktLX2pnNXFfCis1UTtoUTsjcTJNKUxiVnt7TzFRdVJuaENQeEhXY2w3QjFGemtZbzkmRXVQby0rbEpAbXJvej09KCokWC1fYEcoJWZIcHxYTHMwdF81SUh0CitkRUZvU0B8KndoXjw0KSl6bXh5bmh1Xz47fEp+T2dLWXNlYEBpIW04e213YEt7cyh2M3d7PX1fZXw3RCo+KyQmSSYrcCYtdW0xUD0oTkYmCitOfDZ7bEV5PzF4VUttU3J+LUIwektQYWw4eGAwYGgzYT1yY2k5cFY0O3lUfFdAKCVtfTB5QFRZZHVtNW9PNU1TVFZjbFFCKnhKJnROQWE/Cis9Jj8pUUhYWnJ7RUM+Ykt1fntRQmNSe1pYZFpJKi1SK3tuaHtlYz44YG9AMUl4SnBNUVI/YHslc1l6eTVxbWcwfmZhez5BZWRBPGJLeWZCCitWKCpJY0BwI1UlJnRJQHdhfnRVTT1HYjFeVzJVdWJncn17P3A/eHVEfC16NH1XPzh6VzRXKz83cH5mX2tPXkNwWjEma0wrPEJKeE9UcSUpCismMVhwSXIqKUF7PC0hMUAlTUt4YDFPQnU7bTVtb0tsPGVsfEp4VjtfPXx0fCsyPXB9IUhAcyhaJEpPfUZUVkt2WitgaVUmd3UpcGZCZlBICitfeTQ7eXRNOS00PipzIyhIJFZRLUttUHBsfEttc1pAOXpzUDxATGtnZSkmbiUrITZEQ3txKW14R0dHNGM+LVVlKDk8Tm0xfEhhM0RkLXAjCiste15JZH16SSF+YntuYEQwWn0tYzNgfFI0IWBzQCtzYHQwaUtkQjVEaGQrYz5TZChfK1d2Jlh1WS0oODxRYG1PS0p6MXtEdz1YYEVgX0lSCitCQj9BQEoxYCZxN1VhZmohdyYjdnBiZjRBUFlIeyQtVXgpYXcpfDgtfWJaXnMreXJNeWZBJElZQ3thNHo4R3pSbW1QeldmI1VPU3pGUCR5Cis/cVQ/dmw7RVopRWIxYjclY25sVlpFbFdEdVhkZHB6VTVsellFXyZpZ1pRZkJPMDZ6SXVNPTlgXm1hPyl4RURPcz5iJS1YKlhWUzA5RCt4Cit9KWN2O2RSfFZLa3VpMW9jcnhOWWQzZjk0P2Z5NkR1JkI3SkxEZTxIeHkqfWhfdUhvKVJmOXlrbmlyJmI8cWVmbFRROXN1SXhjNCFAMGI0CitjaCVmRXRmfDJ9ISlvX0djTzU+R1orOTdYeCtTJkh4bT85KFFobFYwcT5KUjhmNHpQO3BPWnQlcTE8KTM+JD1tUGAqWkllZHYzMEx5NV8mCisrOzBfPD5zaV5NRCNkUjBqZDJ7UDs9XjE1TXZZdnslPipLRDhRYShBND57MlM9eTFkPCZ2VWt4fFJQOVBWYnVfPWJHdDg7Y21qNlVaJWVwCis3Kyg8MnxESk4wLSF7MmR8XzRrRnBobiYmPTNzaSpxeVkqaGRLVkUyOFVyeFkjTUJlMVZtaElpQGkqRHBnUGM7cXtYPytsK1Y1XkRiYmJXCitXaU9rPWsrPF9VbGM3dEd2RzYrPEglal9sLVAtO0pNfipxPGc7a3Y9MXVIKUN9NilebUJQKmVwRDd1RFZ9Y09EZUk+VVZfTWpBS0ooUHt3CismI0FqdWVySlYpN00+bF9rU3JnSCtTd1F4ISYlUXh7a0tJbURHOGdtcGN5YypYPSpVaWAjcz9RKG9IM1FDbTt7Xl8yQkktZCF9JmIyJVRtCityaVR5K1BjN3dXXnlqKj4oYzMmKzx4WTN9UEgxXz9YK2wjVkB1cyVpfEc2ZmFvQEJYJllxSGlrb1ZtUEtlJiF3aCgwPXt5dUMwOVBmaSQ2CitXX2Q1XlMrfE5DSShSXmd5UHxROGVSeFE2Ul9uLT99Kld+S3Z3NiZ4MklvbjBIazhKc0NHdD43P2ZuM3RRKXFMKjBUdXI0TTc1cjRYYDY/CitoNil5S3B7Zi1XSTBKISghXz13O2B3cEt9Wk04JjRzd0NMV3J7VUNZOzhVSj5ZKTkkV01ZaHROMGVETlZvSW4kVUJlQHhJNi1Rcys+dkI8CitAbC1zKylkeS0tOTRuZjw9UWtUSU5IezlsaCtuRTlEVWUyKGZ2MEhwYFZmbyhBYChlU3s3cEpYcVh5YlUoNyo/ZGFWP0wpfVhBWk90N2pmCitqZXArdVg/O017TG5pO0NVU0tjX3dWTTAjYUsqVl9jazRAWEIwTEBwdTUzJmM+VCQwLVRnJEcmaEYmZ3JjUHpiOzx5aThVcnRDVTtrVjxGCitrMlo5MlVQTzFnUDVyTSh6SzBHeXY1d3xVciYja2o3dHg3NHtWbypsKXtlWSFLa3xnQnM9dkl2WDsoKnxkQ0VPWjRtSDBeQXU/fXhNKlpRCitAQTFkfGg9Pk57MF59RDtMKCh5YmVJSG1LVGA4RSVyZkNUS2k9OFhfdXZndnVsRWlHTUlQby0lNllyQDg4eCNtKnkmY3Uxb2tGR3F1cjNRCitWKHp9LV57NXhHdG9wMUdYLT1mUkYxYCZ2Xyg5XzErVVgreHN1RDg3ZGx1PU8hSXBHVT5LQUBHITNyUkZIayNwZUJuJmYpUlVDQXsqUTV6CithamJwazspNnpEO2xHNHlUWHcjeCRYPVV6aT9TfDhkVmNXTyYhX1RgNXx7NDJsb0lhQEYpWjZZTCZFOUcyKk4+ZXA2Skh1R31kfDgtNWpKCitVPD42bk9mR1ptUnpTbktMdnw5I3JAb3h0VTgpJWpWMEArZjsyJG5UPVVpM2gyYHRIP14/ZColMV9uJClCQGcmJVFGPSpXTGAkNFl3RmcrCitVdnMmfnAwKyQ/c0N9UWd4JS1peW1zKTttQiV4MiFfMTwtNk5FWWwqeX5iMUR4X1d2UnhvWEF9KCsydnhraiNlc2MlN0xwWG5IZW1kYUMtCitUeWU9SyFUZ0A8TWo5MEMxWiEtYXoza3k4bW9XaXxCKSYwTSY8VG1kcmJCRnBTJkU7dGJzTi0kMXNxZW8zT017KnBVaEAqfSVqYUN2KVppCit7eEV5SX1tK147YzNZbj83bW80R1U+LVFHUGhHQWM8b3Yma14tS2N9ZUgjRitsJG5vaChXOEwraiNgO3FsaCg9U3xpeU0zSjNqbSZNVDElCit0cztFJEhPJHw1RDVIZGhWR1cmQVVvUG59Mz5jVWRIJiNjellScT8jXl9BRzR4eS0jQjwpQTkzPDh0by11dSRgeG1PdVAlM0FkJEM8WFFTCitzUmQrcClYWCpRJmx7NTx1a3ZYc25zKTd3UkQlQkZ8WVpzViU4cD55M0ZVeTUxJDc5cn5kSiZRKyh6R3RnND5zRitZclhzSlRlYSV3Ylh9CitkUXRRPT83WnBXLWJ5WDZIRSpqZlB4a2dVMUIqNUB5e3UqeWRXaCN0N29RVlBWcEZie0tKdXZgYiVKK1ZRO3tgWSgxZUglX05nc0RZa3QoCitlYnVgLXFaTEpDQ25Zay0jUHg0Z08oPSptbylaQyVAXnF1UTtHPHFxWWlSVjxTQG9DU2UtUGM0fk9zNmkyeWNfeURQamJJbDhKTiE5RWt8CitjMGhvdT4kdXpaRDlQYzZHSTQ/ME8hT3JAQkEmaCZqfG91MmxaKnFqY3dndXxPTF4zcUZQbEJ7WChsZj5MMFlrQ2NydDYzSiE0YlJQflRmCitAbi1yJDJYeG1yMkIkNzJjaiV4XiE8ZFFCQFZzYExyVVAkRDRNZm0jdjg+LVEkY1kmbmQmMVY/V0l0cEVgPiooZF99Xl48USMkTylsPiVVCis3cXtRPFhhMlFZWmB6bTZJOW88dCRFfSM/UXRHcGBpX1l7I1YkXisqQiRFVnBKc35Ccl9NQnsmP003PlhRPyN2a0xQb20tZzh6OFF6O1cpCitoOSpeVV9zc2Vee2tlTFpoZ3glYFM4VGVsYXAwamQqbX1tTHI5NnlxNF8pWn0kb2hRcWsrcjZtXn05M3VzQlVQWSE8RStiQCVQQkZVTEI8CismO0xQTkVTJmdQe1cxR29ZVXxlcWs9c0dqPk8tMFMhT3lIVClQZ1VSOXRaN2wmX3J1YDFHP00kfTlgKXxtQFNpaG9uaz4hNGV4fkwzcnwmCittUkRQSTRqQGhaY2Y0cnhzYGlwSTwqTTRRIzs5Znh9Q3kzNkslVGJSeFZGWlhhdyUqamhKSlozQm5wUyNESWAkZ1l2Qnd4IU5VREc5LStnCit3SioqTmB2Kz5ZZn58PEpJRn0jTDhLZmQ4bGpOb21eZGJ4JHhiKUVIbXxHK0ltMG9UO1QzMCpWX3p6bGlge2Q+RT8hcUk1ZndaRzM1LS1JCitiKHg2eXU7QEhoK09hTHhISEB5Vjl5WlhNcnZ9Zm40Z0gqR1o4a2dwRlorQW90NylAJDtPNEolM199TG03I1A/dUhnWl52LUVoRWhQc35mCitKRlJEOE0tYlBIaj8+NnsyOH5IT291SUg4cDFHYDheXn1qUEU+VX5PbFZZRDBzPWd2TChRQ3xQKSl3T2chbWA+ayZEN3I9SzR2QkxIblNICitJZGQqYjlGblQ+X3dMODd8XmZyQERTeD0hJl5+ZCE3Xkl6VzhRdG5zOW5KUChse0JaZl9Yd3g7bkdiYE5sVXdUdzgqSzBqNjF1fCk4UUV1Cis2Q2dpVEJ2NSpSVC1taClsP1IqTFdTRzdCYVZLUnZzcCUraF5iYkVUUlc+eTFuMjVGdT04VUl2MXVCbEJlWHJkaUp9QSE1Uk9jT28tPWE1CisqdU1YRCgrN0phS293ZHE0ODRHRl8jO3tjMT93P3h8YmwpI18wUUswST1jUW9UeGojKjJ4ayQ+MjROUExrbXRCaGFqQmRmcnlwdHB1aFg9CitXWXoxPTEkQTFZKzMwbjN6MjJYQEhucVpJV2p5RlBsS01tPEpJTU9XODk7clhPIVhHJFlkeDZFe28+Wip0VnUpREgtWnVYQmlVezFwMVRkCitxT2FIVFF6dCloS0poIzJuV0p1PlpzRitgbz5PS2YoUDIhOWAjI3EtPnQjTGhyUX4hYW15IUtgTHlfaEBzQWA+Y2tjaG5XNzF2bkhCJTRgCit6dUhpbHtNWVJJU2BeQygzdUlJakhmKnxfdEh9cFd5YExGZ2VteUAtPT96JnN6eH40NV84dXlGNUV9eT04dTY1MHZhcWB6eWpmJCs5cGxOCisjYTxpNXgoaDkoJUwoMi1kTi14PSEzdFclY04keiN5OVhIODtFblh4WFdLYihkMVR0dio3RGxDS054fjZFUjdgOCNgcD8pbTMqUj1mb0NoCitIa3pqJiMjY3REYW1sRTFZLXJiclk2N3FtWlUydCk8dnFoQmZ5di1OdC0rb0BjSCVFeVduVD1XX0duWm5rJTQrVnB5NHtvJDtTUDErYTBVCis4WERkaXd3Mj1odDYqSUVSSDsqTEhBTlUlZEowNVhybV9DXnpsJD5TVjlAenBCWnNoQjc+cjBkUz83Rmk8T3l6KXg/dmZlJEl2NlcoPEBXCit7UCM9K1RARWBoR3Y7ZCZ2KEchUmxBQ3B4bVUwY0Y+Zz14Uis8STBYbzx6VXFLXzQtfUY7bk4tbGNBWk4+RW5LemNOQ1JBPzMja3FlTz5jCistdU4kNzwkeCMxdiZERzA9cl5+cT9AeV5oWXFsO1V7ZnB0eDlWO1ducC0rOUtsckl0Zz5we0VTenpaQjlLKiRsVTRVLXZIISQ/bVd4bVMqCit5KnAteWpMUU1qJnxrPzs5WSlAUGl7ZU4xR1RnNilhVEdrNXIhdDsqfCtRVzt7dik9VVFXUkRlMDFlKUJGQHhmKyp8JjMmN21SdTZQTiRICit7ZUhHWnZMeigyRCMxKEhRSkR3Ym47V1d6R34jRlFvK1RreC1YNWkhfCQ/cDgxRnc+ejsqPTtyP3owUXo+ZUJycjxxU28mfHY2UTNybGFGCisrMy1UUmxvI1omQ1Q2VXg2SGBRXldOUkJUOGYkaHpZbFpOV2R+cmIqTmpYYkdvIVlkeVl7aXpATTJoTm1WLTVtQz9tQUZ4Q351RDdxckdyCisyWEJsc0FzYms8cHg3Y18za2ZZeXYjazhEYyljcll5XjtteG91UTckYGZPUUZFJVZ8dkdjPT85bmh7NFFlPHZvK2R3IUh5TmEpZyplcW17CitvT1FYOXArIUR8MVhiTk1KbjJObExXJWY+bCtaSyNWemM4engqfm5xQTR8S21efE5TekxZeXklQEFrTkhJVTAjPTlDfF8kajA9Kk8qeW9YCitVQVJgV1dhMkwtI0U8TWN8Q1oxJHZQKWFZck02VnF6cG4lUllVX1lffFUpdyQqQHFRK1phWk96KGYqNWVpaCtRPmFmXzF1VV5kenBpSVlmCitTWis8OztXWEtla2I2PXswb2ElV1B0O3huVjhWQ2RCPXM9YERsOSE8NStnX2p0dmBPaDlIcVgkWTkhYV48WF9YNUJiST15Q0xpO3xjYiY/Cit2S25jSSElM0FgTk1veXgzcmIoPjxfJDZNTk19K2IpPClUJShQREBWIVV8aHJ5czlTcztMejdyWElrWmhvM09qPkZ5eUxnV3hpWUl1amk7CitmcmAwRSVnfT5QcWZxfCtURzAhUFlxbWRQZFZ9RiFOcVFfdDVgej9eeWNjTyYmeDtifiFRP2dWK3BOPGhAIWk5V1U+VUYwM2tQK2tZWmcmCisqNyg8RHY+VmZNQytFK0hOc2RJNHVZZFZMRlkwSVdqOzk7JH5uPUB+I3NBK25gJDx4Qmpyens/cTwtd1hOZCNxVnQydyNnUF5NaVdeSkJgCitOTlIqbHxXP0ZpbSU0WEVJXlN4IzlwJmc0fnh1fkNAcl9nZHJwQ011P1FrNT5tZl5RTn5+Z1AxRSVMOD8qUipKRV5HPTlTWktDaj9jJDBxCis4TmljU0cyNztXTl5IclhQS0pTfE9yXnQ/MyMwPFB5JkpHRWViTSswUDJeaz1+ZD1QJXF4fDwxODczJjVVKWZhPSl+ZjwzOyE3eCRqJGE1Cis4bHdqWklpNCRZc3JVfXNGKXdLTT5+dE9yVGR5NCp6JXd7I2s+N2tee2UyQUY9ZSpxUXNMU0t5YzVmLSRNWHlvIz9ufn1ZYjQ3Uy1ue18jCitjPkIhZC1LRyRLcHJuQ344UXpPTmpFPkxOYyNMejEzKEtPbFUlTH0zO2xCRVBoZE5rWSQ8ajNMN2EhRVk4WDUxO0M9azh1bzxZaFM8Jm0/CitHdExDfVorcis+JF40YW0zPygockchfSt3Ym5QRUM2ZX4rU3FDIVJfbHV3VUVZST1wbHhsa1k5IWpxVlUqSn5NWWI0T05lWDFFIUlhIzVGCitzb2R3dntaOUw8YHxMcjd3X3tnYGdMakMlSms9Tj1TPnsoVkFsPihLWXk7YmY+RXdJI0E+JUY8fnFaR08hKHpfelFTNkN6JUpJNklMej90CithbWJXPT1GUHIpUWF3WTk/e313V31wKVhVYzV9WFJka1FtdX1tQHdiTlF9Vy1vaFlWPjYjTkY3R0tEXlJVQDlvMCV3P3pRZkJLSE90ODltCis4Szd5SWZfb0NFcXdNb049LUFLd2xFTjZGcW1BRys+RFdYV0BOTHA5RCRySmZyLWJnTEJgMm5tMTAxZSgrQmFveW16alYjUUFZditeYXBECitjK1AqI140M0tSQ3BQQG5vfFdkelYyIXNBKm0oITFDKHw/VFhgVXVIeUp2N1M2YDYyOzRzK2hPZ3FOPGpYX0xDZys0MGA5eHVCKTJTNCl9CitGUjJaYFp7dENmcTVOQzM1T0IzZ0Y+Jm95c1dnJktRZFhoNzNuUnsmZztoeWQ3ZDZjT2NKJjtJUGQmPVVxNGpOfms2eilzXjxQXnRwK1RoCitNckVsJnF4N2s9NE1UKCtMcEVWO1BFIS0wcnBeTHFfXytXKShZV0A8aD48MFNLPTAhaGFibVFDUmArZX5ZZz4oPms/cmtPUlBzeUQ4QTxuCitrZztXX0VmX14kKk88S0Ewc2FPdUc9I0g3OHotM3p5RjVCMVlIWHlkRylVNCEmfXBXTnUwMiY1bzt5PXtAd3d8MmJ6eCN0JiEzSng1e1l4CituREV1bklLcXFTck8rZTh5OX0lKW4xTzU7YntmKFQ2M0NYK2JDU04yaU1Dd1hNYWV7UDR7VHRlYStsfEhvMy1FT1Emd3JZMXNmO21SLXZoCisjYmVGIyk8KHMkTjNteDc4Xzl6SU9DUG9mPU5oQDEqfVVISjtUK0lvNzd3ISpIPH4+Q3ZZPnI7dzxkKl9HeVBSUEdzRGN1K0spT1BedFIwCis4N1JfMnkzJTB3fmFMaD18YTQ1OTZtJHdSU2BZPW1+eU9pYmBlT2tFMVlYXkR3UWplPEopXjMrOy1tTyNxTGRsNW0oN21oV1MjUXE3WGV3CitZaj56VW9WYSElSGghfkUjVXJhLTJ3NFVEN0VxcHwlcTVId0Y9KDZZOCVHcTxyZ1VEbFM1IUg3VFlWOWNfQEdIaitgSENHPSRHQ1E2MlZFCitmfVN2aytebllpUTQ4Vl9EaTxJcHRqUXFiYyE+biolTn1pNj5+P2hyemp+Uihvb0J3Jkxacj1nXnFEbmc0Ukk9bzwyJFUzZGZJbTI9aT9WCiskNTlHKU9eakhJJHF+X2ROTmMkeH1jZmMlelU5SHJ1OGZhOz5VQWhkZzllb1pIREJTOE5qU2Rydl9naWM0bztUblBuaW0oQnc3WldpKHJfCitubTU/dyt8bUB5T3dlP3pRPjFVeGZAaysmaXBKKWBWfEs3K1ReRjtPbzRqNzk4KW94WjRvMHN6N0JtTTxOLXNOOE5QWENZNG17PSpRcVFKCis7JmRtO3puTTNDRVR2SUByS343P2tZJDVsVWphNHhJYylsPVYlMz9rfG0wKVEkV1NYLX4oZzhrKWcpSWV+TFImTlFEUCFySkVTTmI7amAzCitjelgpYEIrPF5hYDF5Z1BoNj1aPEhpYH1wKUVuSDxWWGR6bSs4TDhmUCUmRkApeip9YT4hd2tgRlF2JWZzI0ZgZUQ/UXF3X2NlLTgpNW1XCitGZERrQFluJVpiYkp1JGRJI00+ZERvR1hMJjJNKjJLaEE9OUd3Z2MtVWNESXE0P0ROdXNOPSE/KklhcVczc15nNUJxNEZUZ1JYZGplfDBgCitJXj9zZFFWJUVqZGt4UngwODtgblRmQGQ/aWFjMGkqbXwoVjFFdWxeXytgKm83TCFTUj9obEgoPSlwcGN6RGNZWChUKm1uUUVsWCQhcGY3CitXM0h8bENZKkReWHtNQXBPRntGSWRZeUloQEcpUjlwTFNtY0s/QiN0V1VrbDQma0EqUlNaQlJGVXwoLVRqYE95fURLRGB6bzhOfGokREImCiszKnx7Tm92bFchKVNsM3Z2KX5fU0pkbUcmPChxNHtDRWhuTXdtKGpWfHc0MUQ1TiN7ME9uVUMyTW9eN2t5byprKjJOMVdCRGpuOT0rVURfCitrc1RUYSFqZUNoVDRQS0h7ckJQVk40WEUtaStPO3J+aWFQSTR8VW0xJGZKPStJIWlmZXtpUTwwcHpIYiZacVN0TjBkJmU7TEQ8YHxVKXt1Cis8V2lONlV6Q1hFLXlWbkh0VmskSUs1Nl5tX3R0PyhqX0E+T1YkKVYkUGpSSGxrdG5NJkQqe0lfRyRkO2JvMzdLNHhqLU12UmZUYFQ/bVFYCitSdSg3aUw5QVNQUD83WXNjSiphYlN3dHJ5SGFLfkgmZTF2JD1QbWs8O2shezJQUm1hdnB+e3E/PlhwLVFGSDIrYE9NTHBsJVh4LVclMEZVCitRc05aWG5qPzVJMlV2NUt0JDxaRHRVMFNTV2lnNjNDeCQxUFVZen5rVyUhKTg9TldhVGJJUWk3JF9jPFZ7aGBeKVdqayVuTXlJb1IlYk1nCithcW5SPHkyRypRYW1aOCZZan5QYkd7TG1zeyp+bldxR3VBfUJtREVFSnViSXwzX3EtZzF4dHAhJFIjN0llJWh1ZVRwLXV9KHR+bXcpI01VCismdUtiO1NwR2ZSU005OXhgZEVeQ2hCPTR7dSt7T0MkXiVKZ2xucnc/PHlkRFpscHYhSHAta20tWXA+TiQ2fkNkTVlrezVXZjJjY2ZlJGJpCitNQ1QzJHxtcVlIbm9CYT5VZkNyamZoaERZViVZbT4lMXI7TE1vYFpFRnEobCs4JnlsPXRqdzQoVUU4IStGflM9PU4kciRGTllkK3hnbCQ4Cis9YUZsQ3VgNTdRPkBwMmlOTnB1WCV7YH4tUz5YPCYrazl8QHc/eXBWfWY3M3xONyY8XyhQTUF7eElWNDtoWFE/ZXxyRHpjaz9HMnprZEpTCitgPipCKntxTyhxPkd2UE1lU2JmdlBRPVZgSWpedjQlMmtLdFZiQFQtbyZIciozM0BiI290S2tudEVNcFpPIzAhYVpANHBARndyNDdITXR4Cis+VDg7dVBMYzN+O016YGJLX05zWW9KJnhqODRpQiFIbmxPQkc8VTJ6PmlSMFBKKGFHZzMlOT5yK2sjQnBQJWxkTFRJPSpKfDsqOSo3e1JZCitSUio2aEw4MW1EdzQtM2hiaElNbExAelpeX2tXTXN8eSkkITljSGdERSglPmQrPi0hamMjX0xtbGpUTlZfe25EbE8kWWM2clZvYk8rYnApCitVdXNtczg4ajBuOWE2SV9wVkNlVjV+YGkrd0NLeFU4bUB0PzZZRz4me1JOSjBRQ3BIQ15gRipQUWU+anhFI3RIQz0hTVQ1QzJQJG9mTFYlCithQzskO0ZjcXpZdEhWazVsKU5ickVePE9FLVg5NyVTdnw1dFklUFRoTG9QZnFRUzl7VyFHZXhnfEFyJSZkSz1ZYVFKZmVifiFZKGBXMjs7Cis8aCkySENYQ1h7Rn1YRm4mR3YtV1l5ZT1pSDRfS0pAfH5lTV58YjBhPl4/Xj1FVDdnKVhkS35QQ1ZPa3pzZE1laXAyUWtkSDlXMSthSDYmCis1QXA3ZDZHdHB0KndWVj1KbX1eO2pGOSolOThRMnshVShXV2ZJWX5aU215WVolWEVjfGlONlViQVhEQ2piIWQ7SGF1OSs1NztibmhqYWxxCit4SV9pe1JXSWU1SGdXNzgoKWF7N0JZPzdUP2ZhJE5TXmFAMjQra0Y/QnJ1aDlVPHhSK3p4JWM8Ky1CO31mMytZejdUdSklVXtkcFMzXzlRCit8OSkqe3dNZnYrTjJpNlh4WTg+dkQydiY5TV8zZXJ0cXpJKG5WI2F0dj1kdzYmYjdTIyRXcT8lKjxpVEYjZj04NDMpP2Z8bGJxWXhXblpeCitPYFpyTiNvQF9AcDJBcCoocVE0cGNkaj9tfCFeJHhFU0peemtqJiReK0QrYmhHVHpnantvSyk3OURmKUh6eWsqcUM7S05wKmtZRVk/LWZfCitMcCU5PC09VjttLTVpc3VyUWNqbXMkQUUmeiZ5N1FhZzEjX2tnJk07bmcjSCpZNnRSYEJWX0Ike0tIQXo8KXJSJXE7QCRheHR0emNiNiZfCit5VkwzRnI5R1lGdSVQei1kbXhHKGpgTWhRNnk9SkM5WFpNI1F1Z2loZUhSb34kZ3E+QWcmWjtoRlJoUDQ+JVVSWHN0bTw7dWF5Y1RpOUQtCitSNmYyPilBVFd7WVBpVjNUajx0KSYwd3FuNz9NS2hMWipmSnx2aE9GZzg9Vz84MiojJSFDZG93dlQ4QDxUcW91Ui1PWHF0KHkhRThCdXh0Cit6VVImUiNDKEVTR2JaJWFPaWlVdVc0RlNhVz1HQ2J8JThJWVc3OENee1VuVDYzKClOckUqM1drSX4yXkomcHhiWUMrZkl+JXppaShDI3JFCitAeUw9cVpgWm1gXzUzMFZlNDw5PXhnP2EyO0ZpVGFYQ0BBOTFtUGA7SyhfYVd1SmM4MzAkK1FHKmN8Nl40NDx7KHV1c35AWT1Fc3hAO3lhCitab1EhMTB3PkYmWl9WUHoleHlWU3gxNmI0JmVTYnU+WHJpPSVRPUhQTHk+Xm03VFFASFZwKSRiWFc1b3hZfSt4bT9mbHR4PlRFanx3NEYtCitXY0tXeWRuVC0hT3pJZUF5WHR2e0craXxoJnUrZTJMdV5uZEZQSWhkJiFQfGJeZXclcXcmaElRQHhCTT58RUUoWFc/Y0NSUD9yU150d0heCitEfmoodSQ+elAxeHorWm07OG13TWF6LUVXaTRtU1JoPnJQeHkzQSNyRThDRTFkTUJxMiNpNXxWQEBBeFRJUUUpcjZONmdoMyl5RDZDeUMpCitASnIlMytXNj4zTj5sWFhObnVvZzdqUTwoZWdOeG57WCRObHtZVmFkQnJqQmdySkdkNkJOQVl3MjNMbWFlNjE+MUxyYmBNMWxwV2JNYTBMCitoY05ZYlZzXmJeLVg7b2lJMnBgWjY0ezRiVnNfVSVSTUR+TzdAaUVERnZfSjR2Y0pEYGBneV93IWdTLUVwQl5EK3c2VSMkVzVSJll9IV5mCisrZSV8IVczRCtMayZGdiQ+ITl0dCY3UEJKN0tSJmhaRCgkX0dkRnd3c187KnJKNjxGZkNyO0lEaGliTSVIUVMrJUo0MTJlJGpvK1JYNGBrCishaj84UkZYMH4lTytyb0p9OWthPkJ3bH0jUWFNXmEyd3szLU9TOUlJOXpjVW1rSGY2VnNnVXlnUDxLNmdlVE1LVz87QjVgSHQoVWV7KHRiCitVdDAoVnFvQmNOQHw7TGNFQip0T25IZ3pSZWBTenlAZS02KEl7PD10UisrWHZZV2dLUlZJP0hJX21UZVIpcVpidSpQNDg/QGdBS04tOyYqCitfZ25rMCZOPFQ1dFErK3kzSVZMOSlzQnd6U19DWVRHKGBiRnd8I2poa0BvN2FQb2RpM3VrKnUwNz0/RmY4Rz1WO1VSaFprbit6el8hQl44CistUSViMGB7RGkqcHtIJUw1YTspSGNRKn56UEl4YitqKXA+SWxGRTNaOThKeVMlKGMoSCtTRFFzSkc0TT9VPSl6cC04fUUrY0FkP3B0b0lfCis/VT0pTSV3Z0wrK0t4R0YjfmlsOTRjcGVAd25ANGpackM8JV84ZX41WWdSLXhLVDlWWkVhU0okPSNCV2Q/WVY4fFkxX2Nxc0NId3o0VXNtCiskKjtyKjtEYz4waTJhRGZySWsqaTBkKWxBVjBOWENadyRIWmh7JWBvYz9OeDRAXzFvXj9VVU1efCEzTikqcD5WTF96VXtTZCt3OXZtYD9pCituMVpKfT58dn43fWErdjZLS1lgYWw9dyEoQXI1KUhQKD8ra141WlNaWGFkfj1+fk18I0A7LX1HezBmXkVscCt3dENaeWY7emFfTy1WUz5UCitQUiF1anczWU1zS14lK3dTd1d2JUt2clojJkR8dyNCeEF5bG9xQTheK3MpQHdWLUA/WWVHelpgJlQhcmY9YEl0KHRBNFchcGQ1YzFeYjNpCitFV2MkMU1TVklILUZ5MWQ5JnV0TF5uaihfOzNAbU89SXAxMSVZfCVIcStYczZNRmBxWClZN3BjMjJpRihgez5YK3c5IS1iKyptVVpPM0tYCis/QSRneD8rbiR5am1+WU9iS0JfTEhhZlNCJlRYU30rdjQwZEZ9Rj8zamIlNCYteW1qIypLSiNKK21YQzhSUjRUeF5RdnVzYVduU29iemUwCit2KHVvMEVneGxgbUNmTTc/O0k9V2laMyU4MGZwPjwyen4wWmNzan1fJFpGX3kmMkgoYSMrWG1tWnQrI0ZLWjk5Nn5qXjRKVGNmSEMmNDlzCitUVXd3YnFpX3FMaDA/Yzs2eGMtdWJTd3ZWXiU8OEFXMj9jUXk+Y2labVdDZ2pfZS1MX0A3WlB+cnMkWSRIQStqd2wtaXJjcDBIVVp4RCM8CitzbiZaRXgoRk8wb0kxWkZGc1dULXpTa29fJTRwYiFSOVhmWUUrWWJXUEtpTH0xdzIrQlVUfGFvbzBmd3ltc2ZEe0lAdCtWaDd0KEB5UFYtCis1SDd3eTh6Y2pnOGkmKktXb1JfalMjVVZiPlljdlV1eHNmWkNgNUptKWlFRkhiJmNzPzlOYn0qcHUyZXFQRmQpWlRvNTRZVDk8MGNEeTc+CitsR2xyQDFxJk03WjBpRHttd3glcWFNbVB0P3tNaDBaP3g/aj9iKSVRcXVhakdqd3l6QE8jdXs+cVVYYnMmRjZZRDZoP0ZVRHFzSTR1fjQjCitlditkYnpkcDZzaSY5LU49P2JLfWhHdSFebXdtLUEmJUl3KmR4dSpIcG1EJT1VdyFONWJGSnt8dCp0MSN4SGRROGA/N003UkVFflJXK2FpCiswbUo0bylmK2FiZ0kpQWxeSntmJXZGVzgybCgkYkgrYSpmdU0rJjVDV2FWJXgwUHdqKn1WLWglMnVRcm05Q3lHXjBEb3JzO1ktKCojJG0yCitjWS0rYXw9R29oPyRsWEotbytaK2o1aTk+bGY+dkYkLUArWWZoIVl1PVZ2ZD9FTV5yOGlDOSV5YDQhNFF3fT8tUWFjZSFwI0NWXjRwa2gmCitxMVl+Ykh7VF8wKllVMzFoTUpFclVUbzhiejdXbk9WVndudnU3R1V2K2JGfG56MyMoKTttTTdHfUZoS2MrRkAoZ1cheDY4cVNgRUdsNERLCit3aXckSlYtcipwSX07Jmw9RlUpQHliNVRfTXgzRFpqbmVtdigmdS1BV2xtd2YtVzQkPGVGTzZpJXktVUlnblZ6VHlAfmNfKUVobC1edGBGCitfPUVAcitaO3JlPEBAQkBINm1Ma3BkR0tiUz89fW0qPTVCIVMyRXJRJVp3JE9LQFcjTktgKT0mSnZHMnlkb0FfPzl5VFJfcHhwIyZ9QWQ8CitVRD9rMmUjLUVMflRmJGF2aW83SFlzeUhWfD5FSDx5KnkhTSZgc3ApTTk/V1ZDQ3lsKEtpIVJyUkVvNEliWnkzeSlKdERBeyNDYzJzRVd9Cis9Jms/d1k5eDZ4fnBDTCh2VUlIeCU3YWJWSmN5dngrKE1oSUhacmpCWVR4IVJROH44O3NyPTNKZnkzJD49N2RuflpLVXkyPEQhcW5uSXdHCitQPXA9MkJSQntaWk52Uj0mcVRIKUQqQFAhUTZ2ekFmdWElWlpmKmI9cTk2XmpCWVp6IVJROH44O291K3hAKUUpV09TMyFPLTQ1di04fVN+CiskdHg3eVA7XjdsLVNlZCZTX0smMFYwNDRnSj5TblUrZFM3eSgtYFN5cT8/ZyRNIUZnNFd+N151P2x+VmVrcWs7VkRCWWxSZ1ZOMU9IeiQzCishTEZvcGk4PGNLRngqNiRhcT8/ZyRNIUZnNFd+M1hCWmFsaV89JSVCYWpfI2dPNTA3cDx5N0IxN3FaXk5JSmk2eCNNKXZFIXEhUyZDYlRpCitWO05ILSRnaDskPjtKNDRaZE5CMylNfElCfCRDcHNBRVd+N151WmJySHA+MUwjeGs/dDNmc3lzd2BYRENHUT0qRldQazhWNz1AI3d+Kjg7CitAPjB5N0IwcUBBO1ZONihpazxiUipKQE5iZH5BTmwjKFYmQ1I5NjJfRF5lYmQlOWRNdDR1bWl4VilxPVN3eUFZXkZ+TjgmUjgpVWVvMSgoCitoVypDREJZbFJnVkdJM0h6P2hwYmtFbWglKFJifFpkJHImPXt+YyhvJHRWeT9oQmMyVERvY0pybHAmZlpkJHImPjg3UWRtaFNtMD4qP14yCis+N0dBTCo3WF9uZHtFZkgoK3k4SUpsKmhnIV96KEFVQD82cExFWkI7N1NtZnwpUXdSJE0lQF9vekMjaGpROCEyMzlDYyZWalpyczctRGkkCitYI2s/ej4wNk8hP2IySWFYMEFpX2toOVVeMlprVzFaPlZ+TnNxaSYzUE99RVdiSCVyfFpienteYFAmWXh7MWErVEw1cm4hQz5ZZ3U4bkM+CisyPFpqOER5PlluZE9tPzQwclppMmNBPkwjZTBwbCpWPyYhYEFPLTNXQ2YpSjskfkxFWkRFMVQlPFcpUXdVMW5hWjIwNUpoTG9ieEx5e0xUCitfYDtrYU9ucGxYenctSGUrVDQhbThJUzE8Pmo+PmpBI0g9TC1SNVdkSzw+V1psbzE1PndWcVN2T19mbHl5X3FPPDZaKC1JUjR4KT1nUEFXCitaalQ7TClIeWhIKVAkPCE4RlJjRGVIZERwVDIwcHNDQT4oamFvTnEtS2NlPSkodSYmUz49PH5ZbGN6V3k2MTEqSCplaiViQFNIRVRRX2dyCit5bWotfCYwRl8pPmtQbFZiQFNHWlRRX2RxXllgaG1hVCZWcT1ha1lFJj1pWChnMDM2N1pzQHc5PndlRHQzbjF2YXEzZFJAbzRNfWl0ZTFKCit+UmEyJTBEZEBWUD54UWx5eF5DI1lxM2VkTzhAZ2BqeH1vY3l6azs0TTgrZzRsNmhZKjVsaDtqTkgra0xVYig3YWtVTj9FJjxhTHdSTzx3CitvPnNvWDY2QGF2fHBjWlNkVFN2cytVVXBJYztfJS1scjtNYyZmZm5OaV4yN1Yzdjh1Jkh2WXRZd3Nmbk5pXjI3VjNsOHNzJnxZbW5DPHVLCitgX3l3KzMkd15YfFp7RzJhZWphVD82XiZUITN0TzFHcTIoazx6PmJYJlNELUZCdHpOP1ZGOCNnPH1Bdjg4fSVTSXhiTGJSa194N3QrUE5BCit6ZXJwKHVIKkNOLTBIM2t5NH0tey03ZElZb09MWnQkfHUmek03fHxmSihaT3VCNVhQdFNQaXx4dGZwNmtKOHFaVlleO1MqVjQ2Zz9ScVQ8CitUZjwoI1RaNlk9SDVKZTxlNTVfbjklOz1TZzB9ezU0YzsyX08kKC0oMGJLKlMyNlBTUjhxaFZNWXJNQHhve35LIWQlQiRTejUhaFd4KDBMCismPW8tKjlwbGQrYWZVV151VzYrZj4xI31KUThaMCVLWWNTViQhQ1FtMzI1JH1DOG1LaTtZb09MWnQkfHR0d1p7RFk5UVhefDhuYHYpJi0+CitAZ0w7fGA3YlBlYmwmXjRmSUstWWstMGJLKlMjeDtqIWF7ZnkpITlyZEd5YXNyXkdaWkl0ZGJqNEAxcSolK3syS1QqQE4zfUx6XntRezFICitUNC00ZzRDe1QqU2dCQE1+T0NFRzNDSiFMTlp8MUhUNC00ZzREVEhTbFpUKlRBb1ZVang0ZWVaNGFqQktTNCVZbW5DPHVSJmdleWFzczxACisqM25kJFpMPy1BZ0A3UTFIMS0heSl6VU83V1pNdzhoWVpHejxVK0RuQmM5IVRaNlgtWnc9bFd4SFdLVjtNU09MVUpLcUR5ZnRgaEBZZGsxCishQ1FtMzI1JH1DOG9WYGxZdypePHR1ZnpJUXU4XlJ7c0NQQngoMEwmPW8tKjlwbGkoRW1lSCpzdVVBZGhMSVNAQWVodkhAXyUtUDNvdVFaCitAdVImZ2V5YXNzPEAqM25kJFpNPF9RfDJ+ZlVMK0ZAXyUtbHIoQVBVZDtlY05RelhwQnt0UEAtJSU9bHg/OWcybyZCPXxNKFl2OSt3dVlxCis1S3pUTyFNMm1CaU5IU2xZISpFdCF9ent5NW5mWTw9QjBiJkVoMjhhejE4d0B0YVYxdk8xZ0FFMjczXm97U0Z4WChRRi1Ocyg+Typ2WipaCit7RXNWZ3RrbWh6JF5YWERCKkFZPUdEUnU+b1FPIzBIMkI1RX4jaUt4fX42MEk+bUwxSD1aMWpybjdNQWg3e3IxSD1aMTRHPGUzSGI4OEUqCitae0VzVmd0a21oeiRATUFUfmczZlk+YGpCTUZFTjVFfiNpS3h9fjYwST5tTHViVFhZMWM0MGo3a249bVQ7UVpZS3pEez4wQFFAe087fDMzCitpRzclc2hZNTMteW9NPVFuMDx2Z1J+WHNEa1FfN01PJUpyRWJDYE8+djlWXyluUChJZU5IJm1jQWxhQmQtS2NxWmFlLXQ1JHAoQFFCcFhRCitmJlFMZm8qPGlBUFdDT190a197dnFOSCZtY0FsWDImZm4pPjgyOWdhVjglWHhmUCRifmtwc18oP2dUQEFwNEhfRlhIZlVfbipyMmdOVn1yCismOWpTVShiSDE9S0sqdWIkdFZ9ciY5alNVKGJHJlgyIyhBYzF7TDFQMk4jezkocjFxbTcoSDFeSkxlaWpaT0hiODlQKlRBb1ZVI31Ufjc7CitHQHVWNmVlcFc0YGdJQ2F0Jl9nQUUyNzNed3A8O01jJmZmbk5pXjI2K3dnOHN6bnd6azhndiV3VTdUMjdgPzsqa0d7MVYxdk8xZ0FFMjczCiteb3tTRnhiR2EqRip6QDRGKCR3SGUhQ0shQCNYfmhONlNGMjVPQyU9JE1CVzlsU01vWW9PTFp0JHx2RHY8N0puJFFxQ309MS00O3ZJYj1oCiske0xoNEN+SHZHcHNZYnpnUiV4PzRaYSRESFRkZGZpV0hERj0yVWwzKSZRJmxTT2MmSVU9Nj87ZkhsfV5QfVFLU0t+O21RMjJ+Qko4ZE5vCis/PmJ0PElmbUgqbTIzOEhDOGJtZEtZNT4mJHMpMTJze3k+MHsxeHBRIzhVKiExV19PMTNqeVUweyFCR1JGMjFYNXg4Vz1TJllHQm1Cc0RWCispZnFzRS1tKUAqfk4tV2R1Sm0+TXVPVX4waEJWNXU/M3RqK2lYczBMNkNwYys2bWZOQjhNMElDNjA/K2lyO1E0T0xSTF5YKE41WSsmeDBhCitQUkI5ei04ZDRXSnI4SEdwYVcpdElqYjRXYiVFSEhjfnUpdk07PTFxTjBQc3YwQEJZNXJNTER1TSVeMkZ3aGM3IWRLIVA7XmtNbjZ0Pz4jCitWMTVpT3dmKSU5RHlZUUc2WSUoVmkyNGxFWUQtVXU4ZGpVODQzfjA7O18mU0U4RFFMNFU1OUN4Qz84enUtSjszO21fb0lDZllNT3A2UlpzCitWYSNkVG1gVExVMnhiJkZ4THNzNHJxN0BMY0RtSytSSGhAQ2J+SXJsUEdaVnVpbEpzcWFpOChaTDNDaSV6Xlh4MTFFPmEyNFdKcjhIR3BhCitXKWN+cGlSMEY2KyY0aVB2MjJsOzc4Ym1kU1k3b0Bgc0BJR05SNWhxLVB9UUtTS347bVEyMzN1a0ZAPmxHUTRPTFJNRD8yQ3ErVCE1aTRMCitrN1I1aHEtUH1RS1NLfjttUTIzNVQ/NmN8YEZ1eGVue3peWnsmMUZIc0E0WFBTY14/RFZKeEluOWNScypkQCVAO2JxM1FiQEQpJlEoZ145Cis/V2FQQDtwZiMoWGQwSEk9OVRBZ3dgS2dSfS18anJqdyFwc1liemdSJXg/NFpzP0pIMmBZPil9WDNFUmIjJlRiN3IrQEhQQzlIKWorRnZoCitOMShqMjM4SE04ZHg+M1lHQm8lc3pGdFFzcz5kSnN2MS1ec0FeRXZwc0lJPHE2NGMyUnQ+Q3JQMXd3elhWJlhvaU55KEQ0WmEkREhUWWBxCispdEUxRTdHcm1ZZig1ViFVPTY/O15ZelIjbzIwQmtTJWIwJFdzTnpBSSNVWUw4bCpLS1llM2RKTGxIdytnUih8WEh1R3UwTFJve2QyNEljCisoPiVFQ3skUXFDfUFadExAPXZrKncpfVg5R1MlYjMxREM7eTAke0xoNEN+SHZHZlVFJm8xRntCVzRhZ2RoXzBHXmhHZmZKJDI1SnF8OG1LCitpO1lvT0t1dGtGfXE7c21WKlNgRC1zWGZAN0VNYzhWdilmaWl5aFJSbGh0O1QhPkB3OGpPOGhrYS1ZTXw5WHRBU1BudHAtfVhHbl5xdT9FCislJlJ0Tn5icXRwLX5TcGMrNm1mTkI4TTBJQzYwMUU+WnxqV2JoYEdoZE9ZPFh+I1IpUFNqUj0zZUxLPTVtNkNyM09uNG1LclFJRmx1MWJ6CiteSGVJOylKNkhNLTdlfDcmUzB6VkFRfjxmbCZqYTIxWDVuOFUhXjZZN28+UXNDUn48MUVCXiY0VDJnM0gzKHxKKH0xU3xQWG5GP0h3fHRZCisrJShRU291MV4oSXQ4MnRId3x0WV5GXmBLWFRzQiV1WH49fWxie0FYNFJ7KnhHfmo4Iyh9MVRqLWBOYFVIMFd0Pyk4TUFUT0BvI09DPUVzCiskajVQM1E7TCpVTkt9VW0qMXw1eSgqY1RwK2BKT2dDY3JlbW5yMTZ8JTB9MkZgMX1GX3M4bFdebFhASnJJck5LJCNJYTNpKDhqTGc7WCl3Cit9WXFgXnBvaztXTTUzPkF6dEBNeiVDcHJiKVlnTl9DcnkpelVPY3JAXjZKbSlxaXY2dnZFS31MZyYxe248fDhjWn5wWGZWLVdxUU9NKDQ4Cis7VCM0SmFCPUdAeGllKFNWYD5NRldiKWI0b3grO0x5T0tma09qXzFgZlM1NmNhbyZjeGRwQG5BczV6NElVYU9HKVFSN21xTn1FaTktWDIxCitgZHQrSzFqcG5vdU05TXsqWSkhUCU7ezFHe3xVPihJQkclTUZXWms2QWRPQk9mO0JpRnd0UDU/LUdoODZpcTBhUCZBPXYmYkxuKXA+d2BDCisjNHckQkgxVE5TKFdJa0VNe15GUnZiI0lPT0FlUEQ/JndISG52NjZWWClAQWVxeyZFPWt0UVFlSmVxVmc+MWZpP3FAKFhIaV42MjIkdy1yCit0Q0w+S29udjY2VlgpQEFlcXsmRWd7X3hiaUIwKl4pKHd4NztOaypFQ0d+Wj9xdWNWODRrJDRfLSh4cjRNVUFrT0ttWGNZKClhJWBuVk0+Cis/TXJGNys7bENHcEg9fU5rSmxEUystUUJzcj9FayNTd2JCOFRTT1ZYMEdCPUVmRVpkJHNRP25ybjE/enF5Qz5fflBiSkNkMS1CcEZSSW5xCispTXxYcCskK3FlKGBTajN5YVBHTVojRyFEeGNmMWZ2Tj82TzZ0fkdNWiNHJCFMPCVCJT12TWJCXkFkemE8JD4+KFZzQU5pZHBWR3tJPHMoCitZJnIjRXpmXlNFSVJPTDs/Y3lUaUFSJStDSypqS25vS24zVXZuQD9PZlpeWUd7Tlk3aGtKZjBvIy1IPU5rJFdqQ0tPRjVub3U7TVhmbn1jCitxS1FLamhiOWg5OUN+Tj9ueGpnYl5MUmQoR3dZUHNKbmhgYj5rVD1pOTBVZylPKikhJUgwa0pfcTNGUClpQU5LVUNMWWFlJTNgaUdTJkklCitsbnNfd3ZYd3VRN3FlKH1UakB9djA9SS1tJCh1b2Q2bnY2NlZYKUBBZXF7JkU9a3RRUWVNdypCOzVvc2RRSjQ0YUlOUnlFIWxTe003b0c8CitqTWN9NWB1Til3ZGtlMmJTXmRlWUxRckFiUUBtZnA0OF5CSXVvUU1oU3gpOHdXKC1fdTJQNX14TEswfDRKaWZ8PisxMzJHQTVCJmhFYXAoCitaXnxjJClBdTtjM0Z0Z3JeQmw2UF9rRk89T3pMRz84ZnsoP3E1QFdTWW57ayFkMitNNWMqTTZQWUc1Tz1PekxHLSt3bCh4anpIT0UwVUZNCis1Wn1wbiNlU2Y+MUQtbzBubWh9Mn5RS0FDT3BtZ2p1Pz1ZWWpPfVYxVTBFa1FrUl9YbGdke1BBX2shKkt9fnwxMVRfaDI2NFlFJSk+Rig9CitxKklXU3psaDxjeHUoWWtyXiF1fG48aDhTYEozak4lWm5Jem4oI0U/WD4heCNycFpse248aDYrWmhCYFpWel9CPyk4d1lmT19RNEBIQCZSCitjNX1xYkpPP2FCe0d+c0UmKH1icjlQdjBkeU8/c059R35zRSYofWJyOVBaT1JkSldZNi1ASEY5UiZldFplITZjfFRmOEwpNkg0JG5lKUZoCit9JFA/TWwwS31+fDExVHxtWndlMD5lWTcqMldzN1grQlBEbXl+T0B4e1ZIM0AzJlFUM1cxcjR1SUBIOEU7cClXb1FYUTReeWtNb28tKlhECitCY0BZSTQtJXNFSlYlb2FMVjRvMisjcm1PRSlpbU5RdCtoJkNQU2JYV1NQSjN9IXM/UWZkaUdfekAzNkxZVHU1KTwkPTtjM0Z0Z3JeQmw2CitQX2tLTz9ZfXxDPi1jJSFxYkdPMn5RS0FDT2wxZW4oI0U/WH5OVGxyd0xFNWlEODE4MW9kNGEpSV9MPlA/TWwwS31+fDExVF9oMjY0V0g5CitObDxoQ1NyM2M7I0hmaTs2UWtaNGotJUg2UWV1SURRNF55a01vbztHNyZTMyFWJD53NE5sPXJaQ1A3VnRkU0BzbT14TV4hZ3JeQmw2UF9rCitLJkgyaHtAUT8mRzMyR0E1QiZmK3ZsYmE/dHkpelVKKyUmbXFhP3w5ZCR4Vn0rQ08xdVBuJXAjelgoSDFecmlufXduZFhwYiMrMVc2XjR4Cis9UHBydUptbGE/a2VPPEowP0ctK3dsKHhqekhPT3V2biUkTzRNNFNqUVlGQGExSW5JPHcjV1NZbntWXiVENElkUT5GbGJhP3RPPU94d3JpCitufXduSTx3I1dTWW57ayFkMitNNWMqTTZQWUc1Tz1PekxHPzhmeyg7UEJRV1NZbntrIWQyK001YypNNlBZRzVPPU96TEc/OGkyKHhqekhPCitPdW1rUFVpcWg2TzwrPk87RFBrRyhsO0MoZ2RYbU4pd2JPQ3swa0JqNUhCeEJHTj5wY1pQejFrdFFRZU13KW11QG8zYEYjR3tFdnVXNXZnCitHI1AwIShuTz8qTkU0Q1g4SHhsKG52NjZWWClAQWVxeyZFPWt0UVFlTXcqTj84RUc9b001S3ZHR3Z8eGFXP2x3TGxhVkdQTy03b0dHI1AyCis7Kz9VUClrMHVeWEplcVZnPjFmaT8lO19BK1hwKyQrcWUoYFNqM3lhUEdJfnUlZ0dVcE9DTFQ+Tm5xVn0rWG9BdEs9XlYmdGxGPWxpTmspCiteNUNLKmpLbnEpTXxYcCskK3FYfFk2akFxVE13ZFktVE5KZio0Q0sqaktucSlNfFhwKyQrcWUoYFNqM3lhUEZxJlhBPjBkSXdCd1RsZiFoCit1PzQmQjY5Rj8/QCptczdxcCYxU2VeIXBCRElPYWg7YURZM1l9aWQxLUJUWERCOVMtU3kocGA5ZkJlSzEre1QzZHxnUHJvU15Db2Ylb1pKCit8ZUJTbV9naWRgfGhIa0lSbnlrbSh3IyZTMmdZU1B3ekBNP0RoSUQoYCYmKE9PdXUrRWxwVEAtPVBxcHJBYlNabVMoKj1qUU8xX1BjZXVTCitXU1g9elg9JjJacUBfdHFsYXQ7VmlXNStwcGZuazJHU1h6RWlBTktVQ0xZYjJOb1ktcWAtUER2QjI3ZV5KP2opa25tdFJ8cDB+P09kcFRhCitEbzVoTUpxb29OLTZPPzk4I0dMc3R5e0hzZ256U0AmWTB9YzlyQWJTWm1MQElEYEQ2VmxEckIxVFp9VGElWXN3NnNDT298fTZoWlZmO2MzCitGdGdyXkJsXld+O0p8Sy05MGg/XiFpTz5VYXBHYFZTVik0UF5jMXZnREBuJXAkR1g+IXY8cmFBd3grbD1TakdgVlNWKD9xNjtPY1I7cmtaCitCXipNNWMqTTZQWUc1Tz1PekxHPzhmeyh8bk8+JndvaWFyOU9vX1dnJT1YQShCMWlGaS1hUz5aPHZqYmd5P003Q1lRRGR1bX5CU25QMXFZCitycDwkRG4kZyoofWJ0Vk9fUTRASCUpR3UrJSZtcWE/fDlkKj5nPj9iN29IM15JeklCSjxhKD8rJD5oRlMqJjh6I0hmaTtsYnxMK09AZjs2CitHfnNFJih9YnI5UHhETX5iMCFDfDE1Y0JpQ08xdVBuJXAkR1g+IXgjcnBabHtuPGg2K1prcFVRJi02Q25HYFZSYSg/cTY7T2NSK1ZHRUhRCitmJFRYMkBCR1d7c2lBKW9qQ05qKy0oP3E2O09jUitWR0VIUWYkVFgyQG9eZyplP0BBe2B4TV8wSjxmaDNAXlVPTDBvYVglN1VETiNHWH5OCitULUZUSjFNZlNAS3BPQGYqUEgzQDFHKUZofSRQP01uRThIeF5zbik1R2pPOz5XcCV0WFNPaSVoUHNIfER8O3pnfUVlbXwpYkxlPlc+UllJCis0LSVzTDQ/aXFiNWQ4akc3b1ZGPX1HZSNIZmk7NlFkP1pPXmxqeiR9fkFAJmM4Yn45VUR3ZG4zXm0jUyEhYWAjSGZpO2xifEwrT0BmKlBICiszQDFHKUhfNGJmbHcybkNQN1Z0bmdsZm9ZNyoyV3M3WCtocGU4JmBjJClBdT1idXJVSipoO2ZpQko9dkNQN1Z0bmdsZm9ZNyoyV3M3WCtoCitwZTh8MGZ8PisxMzJHQTVKNDBXPHRNazY1QDFCMUpYLXQ1cUNRd2JGbm17I3lZNjheK3N5U2IrSEAhVm9PeyNpbHM4aGtKaUIlSjtDUlI8CitYbnBpY2RZRXNwdHMhM0lvc3dQIVVzK3Y/YT1pa34ldGVRbWl2VG4pdygjfjFDdSs/TyVgRnk9R3ptciZxSm0rIWQ9MHBmayV7Z1Y3TF5YCisrTzY0Zk5DSW8lZ2dFdWRPSndTWn4/KWRII29SRXduK01sRm41YklQPGhZSGAlIXM2fGtWcGNYK2JmPzVRJTJ4PH0zQkIoYEJpPVkta0VyCitNREVfMERpZkdYRUIxJHplJTFRdWRUJk9UNmQ1QjtGRWxpTUoxTFh9OE81JEBiaH5ORGA4U0JxMiNpNXxWQEBBeFRJUT9sN2ZERE4+NCpCCitCalc9ITt+Wj9ObDgrWWxCNlVsTmxLRUVXRkRmVkNARCZjbEFAKD5CQjtQPWFuc19hI1o4Tnc3Qj8rcVRGQTdKWCg3YD5yaUR5dns/UzJtCitqcEMtb1A0NWhrYlZzQCktQlk/THpXTHgmeH5ENVdDMyg4aVE7TWUpMClkK3JIIVdgWnVFMSQ9KThlTVpPXmNmckghV15qK19hRXNBPTUmCitwV29sa1ZwKXZ7O0dPWiFncU5QUGtpPFRCR0VtflQldn1rRzMoeFJuQk9OKjhrRDZSU0Q9KitCJm1LSDMlR1pYfjB3NjIrVUptKko9TUZLCitKe1dMb291P0l2VHpPXmNmckghV15qK19icHFvdVAyeHJpRHo0bUtHPjJQK0NAJVd1e281dl9OVHIoZ0xMZ04oKz0wQ29OOFRYREEjJVhACitTeExyM0ZlMGxvbHYwUCtGazBLeHUpfTA7TDU/M3pRWm9Fa3RAfUM+JDdSRzE2a0IjWXBSI157aT9JcjNGZTBsb2x2MFArRmswS3h0aTVrCitkNiExSE5gVU5nYWJBentiNGNFVngrfUwzeSY1YUVqKEl5dzdfVUYoUEU7LU1CZnpARWdvN3R2YH1jRiZfYmJ3TEpOaH4+b0JRbjs/VG1PCitnK21MNjc3bmQ3b2RYWG85JEd4S2N4ZHNeOy1TU3VpLSM1dUVnVmBudn5YelEoODhnR0xrb3hBODQzYShUMEZGUFh6fGVFcEBsKlZnJSR9CitkNT9jSlQ9M2o5I2hjNV9QNVZSb1pvdU5ub3Bhbm4rZkVFQlAwOXlSPmRYPVZWbT52Iy03NmRIX1NgZjQjWHc0VmxLZmRRKlFOOG1PNik/CisxNVh1OzVlcCM/KD1oODdEZzdGc057U1pKfSgha35wZzN4Z0kweSl6VUw5SkR4U2FuUnpSI1gkPiQ3NnZVMFQ1SVpObz54M3omPzJDPCRJCitSYDw2JGRSMmRpQ3E9XmlwMmgla2QoeWopSHwyM29SQn1FVk5pP3ZDeGAtYyhZKD0hTygpQzF3KUkyNzYmYTFTe1NyMlhrcE84cG9LdlRnCitCQXVZM3xmMm8ybjFSUHY9Qz9eJl9iWCFVKTl8NkpWRkQ1NzZ2VTBUSno2ZCFAfE8jZytYZ2lBSGhNM2dCQXhaNHE2PHZJQX4kZSFrfnBnCiszeGdJMEVldSoxdkBtRjQoQXZ7U2FNMHFRI1gqYU03NiZhM1N7U3IyWGtwTzhwb0t2VGdCQXVZMCNrSU5fVmZgfUBANGcxN0szSG9SMkNtCispSzJmRjteP0VZVmZJJG1gNzZ2VTBTe1NyMlh3NyVEN1k4ajRTeyQ/eFhkJSFkcGhaQjdmRUVFUTAkSyNMMnh0K3xCQWBWO2ktNWk+MVh9CitkLT5QYWpUNU5IdzVmfWFJSDN3ez4tRWNqWFQkTlc4NFRKc3s9XmJyV081TklMTExaRjJ9aSt+bVpFZHA4dXY8UFNzJj8yQlUwQGAheUl0CitsYE1YREEjSFhkJSEtcG9LdC1mRUVFUTAkSyNMMnh0K3xCQWBWO2krfm1adChaT25mZmZRUzFYPjhSNU5IdzVCQWBWO2krfm1aRWRwOHV2Cis8UFNzJj8yQmtLPF5BaTBzPGByU19yZmRYYzVxWXA5TWIpZWlyO0pfKnc5PztBZTVxOy0xQWw/K2lyKF8kPV5RK19TaTZhbkl0TyNYWENBCis3V1hYZlM9X1VAWEt+TSh1TkJ0NHkoe2B6XnQwJF4oYShhUDF3UlhaN1deI3VTQDUmcVhUaV5jcDlNYillJTVeQlpfJkA5cEc3fjVlaXI7CitKXyp3OT87QWc/bGZ9YUlIM3d7Pi1FY2pYUXYqNzJRcCYrMjJNTCZ5djdXXiN1U0A1JnFYVGleY3A5TWIpZWlyO0o/cGZUaz00fExTYT98CitzKUFfMExHMHhiZXMxaGZjZjV6ciFfTUw+Jnk3NkJ+K1NfSEhSPXpXSkcwZjgwKkVkKkshd0JUcEsmd2AlP0tNUV5xezREcmNAVSE0JiFPCit4bnJwKyFIN2Vpcj5LYGRSUl47QWc/bGZ9YUlIM3d7Pi1FYmR2e3YkJHQqJipHa1VoOVV1YzdXZ2RnUz1fVUBYS35Oc3AyYTxqZGx2VUI/CitwZlRreE15K0M7LTJwY2Q9flI4PFhPbkdrWV4jIUxZez5AM3dhanVFYVh8cHZ5ZipZJnFBSnNKbnN3ejByTT42UzsoYEhYVksyMG9tS05FCitORkUrfTdWPDNRUzsoYEhYQ2NxMzV2IWkzNUR3dDh4TXkrQzsre28yaSpePzZFWlNNTHZ1SjEwJlozPH5KQnhQU2NQSSF6WE14VXxlfX14CitNbHRjcFVFWlNMJnYrIW5OIzZwQmMwdD8mfnVCLVY1KHJlfno3X1I3QUB2V2oqI2YlRHg2eXp3WFFEQ0ImTURkNDAwY0dgRkgzZjMhNHUhCisrNCMlQTN5R3gzPmsmJE4yeG9pbXI0YEh7SW4mNGdnYSpYaVNAK24hIV96VVJLQ2t4VzYoZ09iZjZuKn11c1k4S1Fpczk4TC1jeEtfdSFrCitMOUwzdW81K3lLdSFiaSlSK2t0bnRobCs8MGQzJSVZZUBGJC1jQSM0THplNVZJZz1MQ2tgZj89Rk1sXnx+KVQxajtPd1N0enFtV30oZE1iCis9UlZVWEJOcFVsNmxSNWlaY3NtLWdoV0VjeExnO0xZYWohM3VQOXtFUjxPJl5PfUt9WEJOJlpvTE0tdGFBeCgpOUMmOCYlO0s1RkdtQj55CiskfUUmd0Q2PiN6cTBFQXExdStYXjdRWlpoU0BSOH4pJHtLVU8/OFA1aWRodTFDfXZVMjArX2B3aShnaHgyQDgmJXI9N2JOOTZoVEdmTFE+Cit1MEE+TnEwKzxDYmkoTUFGRU9jNEd2VmRnKSVMMH1LRU5oTkBfUkppeFducygwbVczP35UTmJ0fllGWDU+c0FXO2hxTHhLMWkmX0A3RU5XCitTMlcpOWYwdXdgTSghal4/QzN0SllvRU5XVFF2WiFUSSVXSX1jPSg1bWRxMDU/WUFUNCVUPzZUTnB2Q0NxWSNWKDZvN1A+NVNTP0lGUld1CitlUExteFY0MVVEa1g5WDxeSTRtVzM/flROYnR+WSsyTkBzQVUxbTArdDBWaSZZa0BFTEtecHZkK3ZMVX1lRnxmfFVnO2kmWWtARUxLXlZ2CitJdTFuJHw5NlNDPHsmJm9HZHQ1XlJKV19vaCYkNmFJKVpKb2hjd2ExZWAyNVMjWXg4V1dtWFRsTGFTaHt0a1pISmZWRDdoX1ZvNjV5flF6CisxdCR3bSo4SjElKD5WfnpkUVE2NmtDRilsTFJvfmVvPGszYXZKaG52JHw5NlNEMnFAUXApNWpLZ3Q3PV81eX5Rek1KUzY8N05NOzk+LVIjCitHMXQkd203TXZfTlMjWXg4V1dtWFRsTGFSV1A4T1VqSTlZSkE7QUc3fCV3Qll8O0FBMW1xTEQ9LWkkKWZXRUUtdWZ2Uz8oeyRPNGZDQjh4CisqN2hwZ3chekNkSnckTzRmQ0FgMyhvaCU2OVVeRGxvLTJUTFExTWl6fU04ZCleNVV9UWFLPF5VcCNLXkI4NzIzWldVNy1ZPnEtYVRzdTVMCitxQ3lLeEJjKTArSUVjY1NRcS15ZllMSUFoSk1ZZ1VDeHktISFzbVdZZnJ8a3hlNjtNbUNMWDhyZHxtVlB3T3xjVEZSa01tQ00/eDU/fDA8CitkV28pPGRTNGJ2UnFfSXY3fWcxRUdkPjB7X2RzY3BRLU4yVk0oezgrdE98NndzYyMlRSMzQ0g/TW1CfndpRj5uTlp9fUZnVUFNdjRJJiN2CitIaSZFeComd24oV1Bge0NrcXNnbkxeZzxRNCVyO0NJcG0jVE4+WS1QQnFkMm5RaihNO0J9cXdBRT5jcG82ZkgkZChOZFQ+Rz5Ce3YqJnduCisoV1Bge0NrcXNnbkxeZzxRNVpNZn04RHR+S012I3BsOCRzUn5KfCVmZEB8NUgkJHkxVzJCdWAxNmw4NkJZKiRsRTdXRnlFJWtjfVc0TEI0CitBUyokbEU3V0haUVNraileUUt7a1ZJMkg2YTw4RHVsYU12I3BsOCRtWEx5ZmFrKTQ2KyR5R3N0RjslXjtnV0hpSyppKzQhO1hXN0VmYGs0CisreU5KVGBjfEdnUzVEdkJfZ1kkQSpwIzlVRDN9YlpxRkAlKDBuY0dzazkqJV5hSUtIZ21pKVJRMXJZcDxfZUdoSz55IzgjKj8wWjBPamB2Cis2Kjh0JDdZVnI5R2Z9ens2bGpNOVVEM31iWnFGQCg2T09vTCZ0YFc0SVBefkhnanl8KnZ6cStWPjhGYmpkekJzbztObWNZfkkrc3YzWDxqCisjXiNOVTh5aHpeWmZ4QXh4VW02UW8zXigzJEdoZkAlXlJDSEhnRHxMTENvajtjKVVvYmBrNy1oJERUOG9DVyNGbTgkMzM2eWZifExRYVY4CitaOVVEM31iWnFGQCg2T09vR3NrOSolXmFJS0hnanl8KnYjP0hQIUtASmhLPnkjOCMqPzBaME9qfnY3dXUjJDdZVnI5R2Z7ZGI4UDA9Xk0jCis9ZTlVRDN9YlpxRkAoNk09QV5UeV9salQ7KmBIZzBVKCp0b0hBVzg9bzJGQVF6ZSp3KjVXOFhHaz5ZSFpabHNJZGBhQmdSSUlqVGpwLUhlCit6aFYqb2QoYTxESD0oVjJzVGVuPXYrSFl7dUEodUBQZTwjenVeZDcjbEcqVnI8ME5ZaWpVMGxfQ2ZqVj44QlBqTGpJRUYqYVJueTRZWmAhCitENTVPMjgjX0E4IVI/aD9EPHpIZCV4PTYrdio9TEhlUEpKKiElVHtiZ0d7JkhlR0RHKm1TWSFWJDtRKkZBUXpHKm0kdz1WJmxjZWk7V2tYCitFO2Uwa3k0WkJGPjA7QngyOCNfQTghWXlHVlE3PVpoS2RhcDghOSRhWV5LO3V2Nio1cyNiJTFsNnFfa0ZRKjVUI090SSQrTG1NaEtSQldpCismUF9kYX1Hc1J8IyVAbXN7SGRBYi0qaTVtUlZsJX5OaXA+PTc0QW5uV1leY34hdjYqNXMjYiUxbDZxX2tGUSo1VCNPdEd6QCtwPz1JcFZ8CitgVyZRU2ZFRn1EZHFQWVkmPiVAbXN7SGRBYi0qaTVtUlZsJX5OaXA+PDhESz1BbCpIRSNjVm5mQS1pcD48OERLPGBRb1kqK0FhYm59ZCMpCisqdis4eihrU1k/NjNxc09uSy1sZikqOE8lal9WSGM0IWYqZCh6QFZ3MSFzaUFAcmxCc05LR2g8SW5IPkxGcjcjRDw2czVnUV5sTH5NeEk1CitWMFgqTCZTIU40R3xrNkhiaVdRY3hSflVBITArc2hLTE9qOHpNR0RZPjN6cHVfMG5aI0Q8NnM1Z1FebE1DfCF+JiEmaEM1Z1FebEx+TXhJCis1VjBYKkwmUyFONEd8azZIYmlXUSpidVFIVm5mNmBMc2J0RTh6TUdEWT4zenB1XzBuWiNEPDZzNWdRXmxMfk14STVWMFgqTCZTSEA1MVN1CiswS1d1KjN7SUwwOV5UWHpjJUAzTyZIYX4yQiohLX5oVmVgV3RLV3UqM3tJTDA5XlRYemMlQDNPJkhhfjJCKiEtfmhWZWBaMGhzX1YwQU5LCitmUl5UWHpjJUAzTyZIYX4yQiohLX5oVmVgWjBoc19WMEEydlUxZSVTbzUjfUF0dEhaXlEmKnduRDhWTj03VmhEe0JkOGE2ZC1ZU2A0VXNiCitOI1loSzQ8VlRpKD5Mc2JOI1lyaU0pb247SkdYWS0tcmx1Jkg1RiE9e0UhNFZ4TV5IMD0yciNITk4jNFZ4TV5IRWUzdylVY154UV5UZilPCislMG5HSFpeUSYqd25EMFZNRGByTyUwbkdIWl5RJip3bkQ4Vk49N1ZoRHtCZDhhNmQtWVNgNFVzYk5GSW9gYUgyNFZ4TV5IRWUzdylVY154CitRXlRmKU8lMG5HSFpeUSYqd25EOFZNRHs3Z09XYFJuO0pHWFktLXJsdSZINEshdj07ODM+ejNXRmw9RGh6XzN3YXFyeWdvY1pSQi02KmVuCit1UkBraHRTeil1bldgKWZQbi13LUlZKnlIKXV1KTs3IWsofD1ZKXNnZ3VyWG17IXA0TSsyXiRrT0NUdlhEbjZOUW4xSHVNYDRHMD8kX0l3Cis+QDZUJjhoTyRlSjFIWCY/NipvM2VOVkgzaDhnYmZIQTVIPXVlSy1ocT09aiU5fDVIPXhmTGZDfGAzMUpoJENXSzgwbi1EZjNZKFV0NnVtCitORiV4SkdSfjVZKTd3QXdYTmVfTipJY3I4YmtsbkU/Pk9DV0s4MDh4U0BpWShVdDZ1LVJidTREQGlZO2I2blRoSnlfVTh4QSVjWSZoNih1CishJiQzITZ0JUQxZSp2cDUkdjlVbyg0N3pZI1BgZ3V0OHZSen4rRj4waDxGaDJXJEA1OUkhY0hiSEdNYC04MFpMei1FQlcwR2swZTAmRTE+CisyKFNAZ0JmdigwalF8P35IVWV3fSphKXpEMjZfaEE0NnFxc0dyJmZHUDUrd3lIVGBTKSpZdk9IVSg+JillQCp8SXsmbWtsa04rQ35IVTRZCisqKll2T0hVKD4mKWVAKnxJe3gkdDtgcSVXWT4waV5vSn5QbmN6czckSnt1PXg+Xy1wWGo7SUZ9N2dURHJVNGdNUFpIVFl9cipXajx1NER7CityJCR6T3hOMjdlOXk4dkhmKll3KnxMdWZibn56WHBFfHsranRVXlhvR01KQGprbCpVWWIoVW8qZEVlJEQpdmA4RCV2PUdWLXhuT2AlJVdgCis1MjVgcGlITntoSWtUXkswaFUlJihiV0dyd2tqJkhTNEFIUz1yYypVWWIoVW8qY3hHdGZpN1dgNTI1bil4O0pZdiRMP3ViRSNuemgte1R7CitGP2JTXkswaFUlJipUM153NilGVW8qZEVlJEQpdmA4RCV2PUdWLXhuT2AlJVdgNTI1bil4O0o+KjJufWVVMUFYX2NpV28rfUY2VGFiSl9aCitDVmZyJW4pRWc0WXRxLUd1U3M3JlhQX3MyUDVQU2pIUileOCpRQnBXVXo1SGplTkZuQl5mbD5nKCR9UH5ObmJ4X3BlS0R6YGtNNEw+MSkjCiswcV8wVXxsZkVXPlA1UFNqSFIpXjgqUUJwV1UoWWViQ1ZmciVuKUVnNFl0cS1HdVNzOCV6OXhONWBrTTRMPjEpIzBxXzBVfEtXQ3NQZU5GCituQl5mbD5nKCR9UH5ObmI8MGhJfGVBOHVCJmRZc2xBLXVOaHhJWFB9M0M0ZnpgS0hSTmxeKkw8KH1VaH09P2QoSFFuPz18MFJ6U25yS0BtCit8a2daWGRwUChCNDZOMmtqbFNjaEtISmRrNV91dzBGP25MMzs9NzlrT0BHLVhWTDM/QTtrJmwzYkVwbDNiRTNOdFByX2t8b0tLV1Z5KGFWCitvOTsyU1c7eyQ0RF5UVTlqYlN6LWwyTWo+SyY/Z3NOU0peaHcyQHdjY3xXaGRJI3pxc0NTXj1mcUhqX0F4VEoqbEI2VWxObEtFRXEkRFh4Cit4PTJjcVFqYD1XTU0rX3hLVUQ4ZnkraWQ1KWpMJTBQYHlMLTQlSXRVP0AreCVeJHlmS1ExM3YhMU45RW55RThuSjk3JkVPTjBLQVNrPnA1CituQnNyMkM3a050WWw7U0RIUTtNZSkmIzlFQkJ1YDE2bEg2NSlzTlNKXmh3MkB3Y2N8Vz5kV1kmQXNDU149ZnFEbig5ak4jMlBgeUwtNCVJCit0VT9AK3glXiR5aUxSUFJ1fEwtaHtUSjVjWEh5I3dfUSlIX2hgJlFSNDt5K2lkNSlqTCUwUGB5TC00JUl0VT9AK3glXiR5ZktRMTN2ITFOCis5RW55RTlidlJQUnV8TC1oe1RKNT12YnkraWQ1KWpMJTBQYHZ+NzQlOW5QPz9BbCtfM2pLK0o9SHJAP0AreCVeJHlpTFJQUnV8TC1oe1RKCis1PXZMeSN3X1EpSF9oYEspcExkUlpzTn0pakwlMFBgeUwtNCVJdFU/QCt4JV4keWlMUTEzdiExTjlFbkpNKnRpOUlBSnktbDJNaj5LJj9nCitzTlNKXmh3MkB3Y2N8Vz5kSSN6cXNDU149ZnFEbih5Km9oZjBLRWhCNCR3UDU/KlA1U0AoIzs4RWJwTWFnWXBpX0oxRm08eW8yJSUlRFhkCitFXihebk95dTxQaSVSNE9adSlNP2E0JENfekAxVlNjQCgjKjdERFItV2dZeGJTUlh4aSlFYnArcSF9MVF4SjFwPDh5dTxQaSR+ITNVcHVCCitfZjQkMzx5QDFWUnBMc2lmNjQkQ18lQDM2ZVhAKCM7OEVicCtxZ1lwaV9KMUZtPHlvMiUlJH4hM1UmUVI1fXl1PFBpJVI0T1p1KU0/YTQkCitDXyVAMVZTY0AoIyo3RERSLVdnWXdRQzdkJE5RdSlNP2E0JENfJUAzNmVYQCgjOzhFYnBNYWdZcGlfSjFGbTx5bzIlJSU2b1RNLWVHeCU8CitzRnVIU2woZklodmdsWGNVYXkqZDU3WDFpZ3pnOXA/SFZsOWcyNW5zT21BXiFGVUpiOWdLR3stb2JiVzt+azIzREJodVhodkZUSWNQUVNXCitjISVRTThMRTFXY1FEPztjbjlNaGpDVX5KIUZZJF85ZzI0LS1sMkdoO3ZJXjJEQmh1WGNaUkFTO35rODVGeTZzPDJqZC0jY1FEP2VjISVPCiswaWd6ZzlwP0hWbDlnMjQtLWtxVlUkOU08aDlnS0d7LW9iYlc7fms4NURCaHVYaHZGVEljUFFTV2MhJU8waWcjekk+TWBFSWNuOU1oakNVCit+SiFGVUpiOWcyNC0tbDJHaDt2SV4yREJodVhYVXs7N0BlYW0yODFHPWJnWWdjPUl+ZWFeeWhISTAjWEEpNVBgcEYmNCNoaFpANjZ2dEFCCis9WX0tb2JiVzt+azg1Rnk2czwyamQtemNQUVNXYyElTzBpZ3pnOXA/R0toTEZ8TF40I3FuZT9fail4QGVhbTI4MUc9YkwtN3Y5SX40Q3d5CitoSEkwI1hBKTUjMD5OcD9fail4QGVhbTI4MUc9YmdZZ2M9SX40Q3d5aEhJMCNYQSk1UGBwRiZQUnV9JEBlYW0yODFHPWJnWWdjPUl+ZWFeCit5aEhJMCNYQSk1UGBwRiY0I2hoWkA1QnVCODFHPWJnWWdjPUl+ZWFeeW8yISQjeWJANlBgcEYmNCNoaFo/QCt1JEBsTVBAa01SITFJfmVhCiteeW8yISQjeWM0QVY3eD18NCNoaFo/QCt1JEBlYWoxNnp9OD1eY2U0OHlvMiEkI3ljNEFWNyFDejQjcW5hP0ArdSRAZWFqMTZ6QD5ITC05CitffEsjJWJiI3ljNEFWNyFDejQjcW5lP19qKGBAZWFqMTZ6QD5ITC03djlJfjRFYTREPVo5VjchQ3o0I3FuZT9fail4QGVhbTI2ekA+SEwtCis3djlJfjRDd3loSEkkJk9uZHg0I3FuZT9fail4QGVhbTI4MUc9YkwtN3Y5SX40Q3d5aEhJMCNYQSk1PFA3dX0/X2opeEBlYW0yODFHPWJnCitZZ2M9SX40Q3d5aEhJMCNYQSk1UGBwRiYmaXJjPTJqZC0jY1FEPztjbjlNaGpDVX5KIUZZJF85ZzI0LS1sMkdoO3ZJXjJEQmhfVj1yUHtHCitjbjlNaGpDVX5KIUZVSmI5Z0tHPC1sMkdoO3ZJXjJEQmh1WGh2Sj8yIXE5ezk0I3FuZT9fail4QGVhbTI4MUc9YkwtN3Y5SX40Q3d5aEhJCiswI1hBKTUpQ318KD9fail4QGVhbTI4MUc9YmdZZ2M9SX40Q3d5aEhJMCNYQSk1UGBwRiZQUiY0JUBlYW0yODFHPWJnWWdjPUl+ZWFeeWhICitJMCNYQSk1UGBwRiY0I2hoWkA2LShSODFHPWJnWWdjPUl+ZWFeeW8yISQjeWJANlBgcEYmNCNoaFo/QCt1JEB5YDV9LU5BU1Y8TlpHIStwCishNzVLbVl7NntIcVdzYV9DNWR4PX47ITc4MzQxdkc8Y31WUFc5SmN3IyY7byl9TXpDJnJXRk4lNXEzUWFtWjE2aTxxMC1rOE9CVm12WFA3CisqQzhSI3VNWC1AdVlaQ0pTbTxPUGxfa1NsajdOQz13bSFGbyl9TXpDJm0td2lTZmpFUWFtWjE2aTxwTCNncFBtQG9ZMm5GYGdKdGozPnF1Cis8TmZGUDctTD1EPWthO2ptK1NyPjt8RVluMHxYUVIwMDBPOF5PWTd5MSsmS0Y4M088U2l2fER5R3luaHFhQXxOYVV2XzB+V04mZ1dhJUZMCitLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNElmVnszQTdhJktafmF4UVJybH5oZXsrZDJAdWAmVFVMaXZ1YG4rPW1DV0ZYJXk1PzlfCis8QUFsV0UjR0g3WEs2UXhMbHEhSzg8ekMoWWRaNS1mTEN1ekFtb1M5djF5TTZoZ3tAe0t6clNUe2tPdFMmPyRGdDt0LXBPc1orTypnKiY4CisqeD1FZmdpRFYzTGsxXkNGY0prK0I9ZjVzTy08KVJDNTZCSistKVNlWUdMRzl+Izc3fDVUcGNlJlV4TFJEMzNuRn13Q2NLRWJBV0FgNWJyCituI3wpY3kzdkVFQDw4QzUjTEBWWXsxJHp4TjdVRWxVen5uJWFfbDl4UkBTTXRRNGdvKkhPeGo/R3FPVkM1aDRBJTYwOUg/WU9KfDVGd2ZmCitgLUEzRVpMRjs1biF3UExII0Jlaio2NT50U2ZrfEgzZmx5aU8zT15ubD5RbVNabUJVZjx3QkY/TGI/TXlqUE45TUB6R2UrU0VpNjw2R0Y4Cit2QVNiWilZJTYjMkBQNHxhRipgNyZkKTkyQlc/cndBJXV6ZytJY3Z1eDlQTDhQWkN7LWwxfHIjITJuYE0zX3dMPmpPUHEoaHBWJkc/PXVeCit9Py1GOEltbENqaGdLSlo2M2NjSmhLcSNJSmBoQ05rQTdjRj5JVDlETHgqZSQlcjNqaVZYOERtNmlyckwyP3QxYnxiT1cjTH1aP29sczteCitgeE9rSkJgc0UqQGBAMyNXMDR7dkQ4SHdObnpuUC1UVm80VHU5XkdEd3Flc0VHVGNAbzRjRipiaGdHPV4pRSFJNz15fWQ3TGdyJCNOWDBHCisrKENrU3ZINz5HVWspVCFPVGwwcERpdXtTczZINHVvcUlmZ1ktd1YqTVhvYVhlKnU9Wk8mT0BxRGJIdSopQE9GTHVLQDR1Tk5oK2hUZjdhCitOZ0xtI1hEY3h+bjclak4xPEdyR3lCUFhCPmU5YkdCbmthUHAjPlNyaHE0NnBQI0kmcClIbHdEKUpjcm1uQF8jbyYye2dlbjt5fEpMKiVgCitPMkdoSSR4a1RFblIldU58UU1KeXUhYURYbFl1MzxAeylMfXRRWSRhfWpwcWNYOFQ8TUVeakwlS0JLNXwzajlNa350PC0hZk9aRiNPSUdHCiskeVA5PWFqJnN+YDVXNUhtVkpmd0hPOUs9e2hqbChLQih7cngrRWp5YmB1JnE/OSl5a0R7P2hyaWk+cytSZFdyMUNSJHRZPkhsMnwjYlJtCitaVV5rTVp6YUV7dUxwS1dCJXBYakw4NlBVITBlO2hrVH16QTFlcGAzMnM4ZWN6N0c5fCN0IShJYT5rd3FkX0ljNTxhZiNlV0w0Pn0jdigxCis4JXJ9TkkkZkcwI0hpPjFRWS1PMDA7b3tsQD49T1Bvb3N5S21ZKFpoeVZhRzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+CitWUHxEP0ZKb3c3YSU1JDZGSipPT2JhIVRRV3BPVFdkNmtgU3VPLUVpPUhLNT5RSWZTPFRXYUlWS1VFb0p1U2RjZCYhRHcyMDw0a3VqbiUtCisjdzVJODFaWn01a3J7RFBmcUkkZzJjJSlyazlRdk1mRGwwMjlHVUFDUnAzTCk7cFp3JGh3JT5nQyZtVm9me3I7bTVLSyVIejU0WWReeypOCitGMCYrV2hYP29TP212VkghfDxNemo9N2tfPjY+aU5zPGdWJGRAWlpGPCFlfFlgQlUlWSh6SnBjYW8rd1doIWAxMU1OKkg3RCpGSkM7cWRiCitAcEAtK0F4aC1LOEpCZGh6eH1VaXNVe3pkZ1F1e29VaSFfV0pBWD9MVE5VenlJOyQrYyNmNnxMKmJzWVdCdEpTOHd2cXJ8KGByYEEwVXFlCitlKExMLXY5RkhAJWhgd3VlTDlLdzhqNT90TElPJl8xJXdvdDhkPEpLbUZpbVRmNDV2Q2pRfnEtYG4xUWBFdlZ8QDRuZVNlU0d1eV50Wj5hCis+UGJGJHtwIykwaSFaKjwkTmNHPXBaemw1Knx0QUNmQkx1V2xOVEBsYHQ7KTQ/ZE16ZUBhXntZXzRkaCtaQCtvez5WRXpscytUWG1jelhXCit5QmN0fjkpOHBnej1KblRhZjU/dmdZV3dsXl91SDR4VXV7cDFVJWh4ISZGNFY4LUpaWXQ+S0N0e143P09JZkEhKylBOT9IaFM2fTdoKENmCitGNFB2NT9JSC1gV0dAdD9OZUtmY01IWnZYdUY+aFVSYD05Qk5nYz1fVlh5IWlKb3pJPVQzPTVjJWVYOFZyIS1oQWAta0BfN1NgUndrPF9QCitme0Z5cmNXOD9lUnJeJmJ8TmtgMUJePCs0XzYhLVFEZ01wS1VxVUtZamp8e154OWQkQXYlM1BYRDtRJS1NSyljamJIa2EwdmVYcStlfD5VCitmSnc3SXJqT0ZZJW19NmhjdjcwaV51S3pIOy1SYHxNRlMza2wpP0BeYHA9SzwmU14qZTAlQG5LWDNvfnstPlk1fE1CTzR7I0FaQU0+Oz52CitgS3kqKmVFVklSOzgkQmQpemtBPVotMn49WDlJdXVAWTRfZUM5aW5ASHl7MX1xdEV8TD98PTh2PU8ySWcqPU83RHtgbCRre2BTZkhwTUwoCispMlk+cWdgPTQlfntPUXdBe2BsRjQ/YF8qPmtCeyQkbjhFeDxnWnYqdXtCPF9AP2R1JUx1TzhuJWZBUjg3Sl5HKD5kZiNMUlV3KlpIXlphCitqKkluN0BfekRTR09wNjMkej8jS1ZISWVodjApbjkkeXl5V2kjYG02MjUqVzBWdFo9WT5ISmlTUVVOJGRNaHZ6eDhfZVNWKiUoU1B+Z3YrCitaZDRyUlQ1eT9QWDVFWEw8U1dVVk5RUnxMKjFNKkg2IzMtQEpiRm1hcVFke2soU1h0P2ZUPVZ7aEJgcl9iYDh8TFZXKCE7Z1JhfEw5YkhACit7a1JHX0BAcyh8NXNNVHprbVB1PmRRM0M9VT0+aHRkKjdxZ240fVpeIW5URml4Kz1Bd2pXK1V7VHI2PjxNI1JVN2U3M0lfMjFKMDxzeTBoCitsLT5VJXp4QTREJVBZVHNfMnI5fmBOalk3JkQqISV7cWlTMntQNHFqazYoVE4tckZDMzhTTkx9PGBxeEJfJFRoJmRUaVV6ZkJzTH57QCgyCitVWjI0OXsmVWJHZUQtUFp8VDdVUH1uKU8hT2BARytaWXNCUWplYThMUHdUPjgwe1lQSXRLSHEtKCZlWkFMcjtQdmg+dndKYTstfkhCX2RrCitFT3trcCVXUX5FU31uMi1GUXVYfmpqV15hRCsoX2AtSz1sUVJue2QjfHw/TUpQIUFIUGRTYFNLcyM/KWV1aWtBRDAmWT5ocz4rK00lUl81CiswPjZ0TClxRnp4LXpWQ2NUfVdDSD5IK3p5MCojIUZsPTE9WVJnPnFZdkt5e2E9M2ooUHk4M2BxNkx4XiFaMUJ7UC1gUXpNdWNBWEUrJGY1Cis1OVQrZ3czVkJ7cmV4RWJXbHY8X1V2NkZAQmlsYUFPN1hEa04oJChjflJ1cC1LfSVvPWRiXk0pdnZkb0tCUFp3JnN5eUp2diV5fnYrVlRvCit0aipEJHJOQHFFYFJTRH0oZlFaO1k+bD8oMlcjY2BfV28+fkV4KCpJX15pakNVdjdNd0dxWXhZNzs3QVAoSFBIMHBWP1pAY0sqNVk0JT9qCisxKHpyK2R0TDJxZi1tQUJtJnN5V3ReU0dYa0lKdEV7cE4rWmFtKE13Pi02SXx2LU80Wkl3Pz8peF9jUU1+XlRze2ZlNzI0MylePVJeVVV1CiskVHlIME1pMV51MSp1T3B0I2UpJUFMJTQ1PipubUc+bilxSzEya3s2QShwMCVAYShhSHp1Sj08O0J4NGRFWWNqb3Vuakdac2ZYWEQ3PjgjCit8cnVlS0h0VndSYE9rKiR0an5eS3RXQXYydnY2VmxldmtqOWNlfT1UUC1ISXo3ck9XOTY0fjx1aHttVWg4KHBqdmNsZWB9dlRNdjdZdCkkCitjQiFjYE4rJCtHeUdRR3V5TiVAX2duVFRwV2N5WDhpKU9EJistQjMpMHY7MWoxQkdmezsrdVBLQ2tUN21HaEE9aXdEbm56OEtZVzk9em4+CitveDgmciV1JjhLIyR1QFE0em9WY1pwdDJGIzZ1Mm17P1NLcDxCNzNkNyk1cjBYS3dxfG5kamBzTl5AIys/en1mP0pmQ0p4VEZXYGx4eDFMCisobnp1TXwtckNCeV9iYT5Mc0oweFZ6VU09eE4lPyNgKTFLeVdFbGY4KiRYP3xnR19qUmA9OWRweyEoK2JkQDdmPT5FMVMlUl55I3c7TT9QCitPcS1AX25CSzN+VmdAKiM3Y140NXpeR2BmR31uRD88NV5HanBQK2wtXl5BPnc/PHA9RGo8U29XMlR3fi1eVm90aTIzZChwVDMlR000Pkl3Cit2a0NWPSRxdCE2UnB8dDtZRUZNKSRrelViKHtDJGwxIWwkfWVjIUdxMjIld3Y4TVM+P2EpOzRRYnRaaGl3RWwhcTglOElSdWdTSWBlXiNVCitqNG1WSmZzWntoOEN8ZDdmWEl8Y1VEN1YjXzdqTnlYan1yN2hzaEE7KWRCcSs4T3FVe2tDckpZOF91QT1XUkskX1VPUXtTaj9Tblo4P3B0CityRDVnRmNvOWFOZ09Ma05vNjFLRGU5TWR6S2F3K0B5ez5rVHtVSU5tYzAwNCViOX5jQ14xKWQrX18kbnhfIXc4ektLUWlKS14jKGt4c04wCis3SEYoVSRuRDxfR2NBZSkjSzE7ZVhKWTBVQyl4ZVR5aGFRTVFqPV94UTxtRWNhdTQtJS1PT29aNkhxSz4/UWpUMVU5M3xWMHs/SGs+WT90CitYfCs8ZT9DNExzS3olWT0xJiZgYFApZUNOUFo8aD1yJFlBaFljRncpTkYqdm8hXytXRjE9ez5vYGptJjNYXnZDQ3tJPz90ejtMT2Y7eTRFCispSCZKbWg9JTwmTjEwbGMlUlJuRGUwQntPV3VkZForRj4lRkE9WTg8I0p4JXNiQGRWPD9SKVBhRyh3ZkVBdTY2TipQVXYzT1RhP3t+Vys9CitrM2Y2PGBaT0J3WldOSj04KW1wKHgmcWMhOG13cDkoPWJBSlBNSSgmb0QhdiN1UnYod1d7NURyYSRYMFNKdmxaMkQxektLPjZwJWdWPHpECitZJFJgIW1jVlN+MCZncEFCbntCI2E9TikhPiglYnJBRl5BVEUoP0pySDFxaiNWZ3F8UGNAVTtkLXgofHp5IXA7Qlp1LWdYVkJ9YUY4R2BaCistWFNLVGBgI1hGYWhjSXZoSVh4M3dQM0pTfHpSeVFQWEBHZmF7PFIhQW9YPlAhMz9mViMmdEJfenEkNmN+byQtYjElUS1yQEZ9QCY4KzdOCitydGI1fUkkRSZEYyVFN3h3JlRLdVV8VC0/aHojQT9YNmlCSG1aVT1JeVB2b1lNKzRfOHpec2d0c3B2SzhENUAwZ357aCMxQnY/a1lSQnFVCis8NF5NZiFGQVhoZXliRD1KNE16a2pBdk9hSkZyMzZ4OX1rQ2RhV2BRc1N6PTctQlBtKyZCRDx8T1VhRjFZMEVqeVIzOFRuUUM5UFotOzlxCitWal9hQk15ODxjV1NZP15wPD18czFoaC1mWFczc3RLR3lVKig4PXZCKnpXcDw2JDBvbzN0c0hIRndCJChlY3l5dWcreFRnUmRJVWdAMG1MCitATjVKSStYYXs0b3dDIWUlMF5mKXgmd0wmam5KKVdrRnZGSz5LJD9FZ3lKamotfXtsSGU9SSRHKitXWlFsQ35VdGY2ekR2Z0hKcWhPaWVICismTE1pTFF1WTs2YFRteSZPb0JvVmQoe2wqJlV1RDFmbG4tZn50X0dyMkZ1djFlZ15SKiUwVCNFKnNTUkMyUDlFczNvZG44Qit9Xl9ge2goCitGNWlBJEtoRyMmZzJ2ejBAWmtIKWc8RVRRY0g5Q1lJTUlXVGRNPC12TWVgU2goMzdNYiR+OFhOT28jfm9hZihMT0ROV2QoRmRnYz54U2I5Cit2Jn41QEtMWjQ3fFl9PDV8T1hhUkNEejJOKFNYa3tRKSo7KiRLOUdYcHFEQ3lAJncyTGx2MiNuM0EhRGxjY3NoQH5zPThJNTMrandYUXt3CituVjRUQ0c0cDZtVE1eMnY4eTMqLSEhSUFmKX5EaShFVU5VPkVQYzEzfmEqN0UzSVlGKWUkKkIpN2F6X2o8ZjhjQ29YOUsmUm9LKlVQNDc1CitPdip1d0IlbnAkKHYycUolZk0lVml3SzUkNVQzakUxIXJBeEN9JF5lM0Q5QT9ibllPSiotMUNCUlhsdGA1JiVQUkM2SkY+PVl3UnMhV3JnCisjeGBZUWBObjVPVDZQSSlzXitpN2hpPCNBKXUzXlckOU5ZbSslNHsqbj1fQFpfSHNMT1puKkBjTkN3TmM1UlAjMiNDSCh+STFpZF9QMnpZCitwMlRHdDZUNkI/RkRJP0hAO2pKLVFAYGpIY18wNyZjRiZFME98bEY1cTdpUDlscDhBMW1gMEg5K3xAZGxfWWpWTDxeRnkxd2BpKDhZUDlZCitne1FgPChZVUJyWnZpIUVeIzAqM2BNQ2Z2QFIyPWo0ZiRHRFhZUXV6VmErWEFSNkRqeXYjNWhnV0VPY2VfQ3phTSgrezZDZlk3bSh+VTdwCitAWVo3Ml9HJn1KUytweEZnQVM1MDBidzMrUUd5YHEpfm8tVCtHfFd2UHVgM15RUU1fN3k7dX4tWX07Sjh6RU9ASFJTUjtjJTtTQ1Y5QSZgCitmSXQ1dkQ2ZVdhciNTcnMyeUI3JDdZLU1rST44JkhxYWJHaUZDR2d3RmVke35oUykkXm19aD48X3FjVmhKVH4xYkBlU2w1cSYrNDlQK1czCit+ISVZT1c3TXZeTjhea3hAVUJtMDx6X1Y4SXV+PU5AUDMzb1R2TEFCY0Z3ZmIrZHxBdlghKENYbnZIWGFvcTUjSW0pRUhRYGk1MEhoaGcrCittPk92WkokM29jb2VxSEZvIXNLTnpBdSRvNVA9RVgjVEpJQFh2SkJkaUFhWn01PGNtfnx5OVhGQEE8UnBhekdZdy03U2ZPRkhlMn1BTDtACitXNXVlflNHcyFiZ3pnN3p1RnJpN3EtMz43S1dYZEJYfkBfdERJIVBrSUBxd007UkMwc2RAYVZwNWhxJURTOVQlI00tbmB1ZUBiQSs3TnRuCitfdzIwdmVgNSY3diNkP1QhWU5hR0F9Zn5WdH1VSFgrZVhQbCVMe3E0IT9KfDNvYmMkM198ZX5oUndAMGZPfjFXNTxIZVpaZjhaWTJEfFkhCisrdnNHeiVqOXJQQWpZVjtuSUojJjw4O355QVJVWVkmI2p4cXh9MTk7JCkyTj4pKF9WKVhibkdrbTdVeztyVmZiLXk+WmBoRm1MJFo8NnckCitLOXM8YSZhfGdyWWlUQklRJG5XNylQaDlDQ3FRZ2J3Q3MjLT4tMkZ7bChuemAyNU1jMXghbHE5MXlgPXtUPn5iJnw4U3sxfml0eU9VNUdOCiteTktCaUVCMW95aHpPPGE8OyUzMV5+OU5uKnk0LXhFNz9pRUhxO3llK2QxTFZfMjc8a3RZWlgxLTxxKGhGZz9EdEd1R1JvSndRdVd1NDI7CitwUHJVSykwZ1FQUn5rWTx0Y1ZpYmswOGhQVUdAK3E/Y0lEb2VqXldXb2ptUkNlU2BNaGFJQ2k+WUhDOWZ9S2tvVllgbmgrRzVOYjU9Kz9BCitNanlkUCpIWjQ4UFk/cFIyKUJtMil2VmghNSFqYm9aWTJpIVJqPEVnVD1XSTVzR2RJPz50T24hMVltYT0hN3JuT2klMDVCNG45VXooNUdYCitPYi1UR0Q2cEh+RVhSUz1XO3lUPG5reVBHY05ZRlY7WSZ7YSRwRDl3WXpka0xXTyYlVCRteVhDPzBvNXQ9Xih+NDJ2eFpOJXh4S144fjJeCit5NSomWnAzWiZHO0tVXlQ2O2xHJHIlJnMlPW1uY2cobmxKcV9XRGYxLSFnVGYxSDRmPH5tXlhrRVMpMlVJV2pxRng/Z3ZYNFAkPmMmQC1ACithQiUpe0thJFRrdzE8SFVDdFo8RyFyPVdVan52bm9rWFBQblMtQ0U7ZFdIcHd0dnBqZVo9YGpkRWtGLWpOSE5EX0Q2ZWtXbU07Pm9GRjFvCitBUUwyTj9sMmw5e3ooJT17RWBMdiVidWRwO2JRb1ptQ2tmYmx3YCN5NndvTC0pb3JNPU1fJUZMb2FlMUp0bD5lbFFwK3JwJS1XIytDPlFCCitZOzEoVUN7aXlhWSRVVTNfSjxXdiRhZGh6JFo0PTErMCRBbWMtJDlpQm5IfXJ3Z0k7ZmxSYnQwbk9pZU9GRSY8LSpBMG9PLT1TQXhja25pCitmPElmNiVRKzNMbjE2LVZpLXJnU3hMKUZNSXpOIWFKOXxpNnZIJmpXb05+eiU4NWNJVlcmdksoPCYodmFwSXB0bilPZSk+bUdCQGVWaXwtCis/XyR9S19PcWxvPTJMayRUa1RGfTYjdnlvO09pcD1FcmhQbGpBTmZqalp8IUJLYkhvY3RsY1ZNPjV8P3o/Kj1fKDF2RSN0TktefW5vWkMxCiskYUVGRVpPTDRpP3Q3blBCYT1WYiNGLUp9Z0BIKnJaYlc1MEAjQ1BNXmV1LWZ6S2FaeFBOQmJSSDM3KyEjJDJGSUMkbm9tZVg/MH04QDZUCiswYiteOHFmfCRjMn5EXnteZndJVlgzXiVaQEx+Zyojej1IQHh7cWg7TntgJXJ8KXYqQUhVQ2pWQ2pzJVEjPT84KzFBWiE2cD49YnU1YGQmCitaaHhvKElnYkBrVUolZm5QbDwjVHhKOXBlIUE9LTV8PlBxXn4pdDtoPW1TYlA8VHg3NT5yNDI9UTA4Rj1UaHN5KEtTVStQMV9yfFdBZUErCitmNzVtQzQ+Wm1mRmlGTjkocWNqZldQaD1kLTJyMEY1O1ZaeW5VRysxVmNhSUY/ZWQ3QW1LIzRAO3U2ZSt6JmZEPTUtYSRtdzJOUUk5Y0dGCit9XjRsPmkpYH1+SChuVU0leHpyP2Eycjl2TCE2aS1KJGFufHxPTTJidStoJCRqMz5QPjxWMlh6K1pWKWZ3Y3dOIX1PYWFpMEBNWElQXj8tCit0Jmt+ZDVsX0goa0w1MTNVNWp+b1poP3hiKTJpP0tXekcmdT52a35OS31kTyYpemBPcGI9Y3s+P2klP1VITDJFc2dGJWhmPEsrb2VIPyVzCitiZjxGck81OTR6cyVeRW5vaWtOP2Vqe2ZjdSloUnlHM3o3aktZfmgyXmFjcDluJUFPVU88KihzcTlsRz1MYjtwdVBNPEleN2ZoVX44bC10CitjeWhtZkBzV1BhWi1aMGdkISUjQ1RVbjshSG5RQUdKdXsqcmNONVpYNFNMT2g0K1d2WUNpbWVWQFlTcTliPSlDMk0meT1sfSp2TnZUNEdNCitQPUxoNHdEdjUxR1EmV3d3PCRoQCsrRiVyYyk0Wkt1dH0jJGQ9dGRHPXBSM1Z1fkJsR3FwcTs0NDlpJjZac0wtM1J5Pi0oPjBwNWt6NnpMCitYMkg+VmsqUiF6SGYpVkwofEcqenwraHReP2RlcXl5YWFoYi11QzNgNTwzMm1sYjx9OVZyRlJATns3JG80JnxLU358NT00RFFzWURIcCtWCitqSzRkVURNbz9zeil2RzdsWitsTUBpZDhQJXBmeHsmc3QzeEtxeH4jZGhmWTxhN2xTKnlBVzBWa3YhNjlSe0p1SnVCWlozcXZIY35hUFlvCit6elJ4bEF6MTYmNkZlcVQrRmV2Y3g1JFpwVUsyTUVeIXlZNk1jTG1Pb0NPVU9NMSM5Pm1adDtsXkZAZ0AtdzFqYy1Fal5wZ2p9Q3t1fDBoCitSdFhVYWB3YVRnRiVTTEJ3JXc/Kmo8Mmp5V18xe2QxKXk1e0NCKDVha2B9fUBaNi1mKFJMdmg+bDVUWTF5ZH5iM0AtZkh1YF8pUE9ne30zCitsKk1PVXgxQlh7M0VgaUApUEBiaCl6TFZ0JllgVjN6SVh+TUExd00mT0JobSYyO1BBeWkpcVo0U3tJRXY0cDZTJjNfOHh6e05MKEFjUj1sCit5RShkT0xfKClMVHEtVFlSMGcwNDwkVE8+NWFtZ3ReWDtKQ3FnfCNKSWdRO1pQR0FJSHhTdHxpSTROe3c8WDMhJGg7KEtfZCVlYX0mZjA3CitUR2RsPFktfEghaWx3aW0/WmdkfkoyKnw2RzgtIS1rUkZXbStDMHt0Qj4oXmQxPDZQSnczeHwkI3EwX2RSMCF4Yz9OT0Rfaj9pOXljVjw8Cit9MXdILVlKRHg9Ml9MX143IT93TSFqbVRJRCE+bipoUDhFUHx2LUlPODc8TV4jI2NERlkjMEF6c0hkODlfdEpePT56RE5xU3UtVGh6KFdpCitjQDk4QDdCbTU+UW1CQnB0bCUpTms/UCpebjVjUnBCM05JK2NSJUctKEBXWlJGN0RvbFg3Pjg3QEhtdz00NzBlUChhe3psREtaIW5SenB9CitaUlU/PHphNzI9ZHZBYl9OcFdQJlRBRGF2T01xMGRFfCY9LSh1dE5BZXZiKVY1TEhiITVXcUJWeSN8YyohPXdaYEVJJUtEUlduTEJTP1Z+CittOElnKTBWSH48UXE9ZUxvdVl1V3hXcXRvVnNAPXBUe2dqdDtxRyUySC1tdTBUT0R2emRsT15jQFp5ZzN8bFN0T3Y3MXJAeHJzQWAqLX4zCiswOEZLRCZ8MVI8PChGent6a299e1pBWXJBM284KUBaYzVydnsqZ0syN3tyMHVCanNfYEF2YXBXNCpWTy0+UGZZcDlGVGlQbl94UVNIJipPCityZDJQI3U5RSFSckYjMmp6aXctVHJLVk9OaWd1S34pRVlGKEJWa0tYWndwb3R9I31eeWQwNStBdyZZdlYyNGlhJnxOJXdvNHNubUhsR3hxCiskZD8hTyoqSD1KKDUlbFFrS29FOHhWckpzc3w/WSlEdkk4O29Gfk9gdGA2OyolP3FVVTFweF9kfUQ9ZG1xUUV0dlJtaDZRZlEtRj5OekUkCishTENxNy1LMk5GPE1IaEpOdUgwQFpyKl5fVWBpJHFHWGs9ZTw2eWwzdGA4RlpYPFJ1YTNrRzlPbnJMPThZYUF4SFdTITBqWGo9Y3I3KHVXCisjTjs4OWl5NVR8PVJqZnxrdzFXYU41MXx0U3d7ayZ7WVpVJE5GU3crZXprejVAVmoxPGYqfkEtbS19SEpvZj0oVTtXMHc9YTZoaUJVVFZ4CisjMCtuP29IJXlwckwweTF3MEJ6MXhSJHQqMTkyKH03cm8oQC1yalFuUHI7X1pDa1NFI2BkdWxqazkxQU5KS0ZhJmJtRT1Ufn11K2xsQFF6Cit3XnU4fiF9U0hvaUFfVldiSCZTNXVRd3hhMHRyczA0cyk4b2ZBalhNeDB1RDEwMHkjMTFeSj58ek5NSzMxQ1UjRlkqSTF2JDlQVX0hZ1MkCistLWt+ciFtZWBWPjYyO3FueEN4SlA0NGVWUzV2WFZKSXp1cWdzYiQ9ZEs3MVBoOSsyVmtGbV9OKmNJeVg5MkhebGBvWT9wdmFzPjJtfjFlCit2Uy10LTMrQFJySzdraHZ1PjltOFhfcT5WbThpcGRHcTx9Z25MbnNraUAyXk0leWR+cnRITDkrY3okSkJDTHdxPzNnT2Q9MU1PUEphVUhYCitTY0VSbD5DTUNwb21sfW15RHZkKnFpYX1lZHhRMD5AdkpZNmg/cmBeZTlIYEAxeWZqe3JuR0RqekMzZUohN1FUTCgkc01ZIzZ5cCgoMHF5Cit4Xm9yRVVOOzwpYTEoVShMd2piSnImbzdDUnZJVWNAdSROYjt9Kmg+eERLbXI9RmdhaSs/c15VO318SE8yT0NrLWVQXjtkSH51dUpsMzJECishYEY7P0lVMDszNCt9ZldfajZmO1ImQ1kmQ0xhemJBRFo/WSZqbUtJMVZueExEeypGYj1UNXBFODBMT2hgQChKOzU2bDwzJmB4eXJSfXxUCitJZlVYckN3czV3SG05dGJkVkJuVFVJcn1OMD0kaDcleDFiayVSU3YmUyZZMSZVPGBNXyEzclMtV1hZMlNGfm1hY3tDcCE8SjhTfThHTSE+CitEd3Y1cU9mdl9famZEZHJTTHBeNU52NUNOPHV3U0Q5UlN5cVQ3dCt5dFA1fTZFUzZuVktKZDtORGdjUUp5JG9fZz5xaEsmYC1jO0szSFdGCitgdEZWZ2A5TDd6MFMhRkAlU3lwbGhrMnB9QkpGZDRRMjxTcVdyZ0U9V2U7NHxhV3FRaktHPmREK3BKNnA1ajRJK3pmRj1wV2hSfFJQcFdaCitUYHI2Rn5zTHo0ZSlIKnZgVFMje2lEPnRiJFRnMzZUaHZUdW1pUFZXR1NuQVo5YjM1Yn1SdV8/RzBQT1dxeFF7QyY7dXI4dTdZb182YkdXCitQbD5QNkMjWDNqRV5vaFY2fTNreHRQREYyQD1zUDt3UTJIY1IpflJtVmJaT2puZUJ5STRvfjlZJlNmISQzUFFDQDE4b0dMNkQ8cGUlJipwCitqdGZVJXxEPWYmNU52PUZwUkpuKHdteTgzISZTNjhKc0N0I1ZEcEs5UFRlPnlQUiYhYEttYUM/c2NKRCVaczNQdGxDT0BRRTVFbmt8K1FaCitMQSVNMDF3Ulc1PFVge3NiKSYqeTg/U2pvX3FyJXBqNHBPO1lBXj42cjBtQUoyJXZxYV4+ekpGUCZGKmtPVVVJa1RAMGBqM0ZoNXk7KndUCiteMmxZX15KdX1ycT9xSW0/b293fSFFLShmSXNSbUBsWHlxcUsmLWlrP15HJFRHOWQrMTFFSC0lWGc9Z3RffExnKihyZnpfQnl5V1YzakteCityUVQtIWpSLUFvNUA9QUNEdWR1PHJfOUwxZklNVzN1Wk9wTWZqNUBhWUc8bTFBWEFxVmJOOSFUZGlQMmlecF5lfWtlPEIrJXt6ZlReWiNMCispeSgjUkFZd1NyUG5lQjF4SzU5bWU4TmRJNnVoc0V7eEMtd3g9UjVjSVotP2xxS1RQS2hPcTIkUXRmcGllJDU/MXRXaGt9YyhkIW4lfGNqCit9bD92cT42XkVjRzB+S1NoRTMmPnZHO2xpQzRURnBKKnNuKTV1RHRsRl5oZj9TY1lxOX5aST9NSG59Sks9PDA9Y1AyJVEjcWd7e1NCOFRRCisoRXJxdSR3ODUkNFVEcHAkI3VlRmUmRV4kKlBIWW5jZjBUPHQoRkA2bk4+SEhOO0Q0WiY/ck9ZR2gtLVpKYUVWek5ecTE9OTJRfmRKNVJJCit5dk5McUFsVlZEdjItbT1VMU1PXj1qOSNUTDVodWImQXhDSiZVWHRsYmZWekpZSl49RFNTPSZZVGlVeUw1Zk56Mjk7RDZ5dThpLX5iaXJjCitzPSFxTTQ7a30hfEFAQjxrRmU4TTQlZTNYQWNfcXVIV3J3eks5QjFWM0poKVg+KjQjaDY4XzJBbWpyZytsT147UjxDWko8KW8jS3BNVnl7CitNYUJQT09+PEcmNyhsO1NMRkJwRE5VcTIlOHBNdTRCMExMJS12X21fYmR2YUxJeDA2JjhYbGtLQl5IeEFGakxhK0dIfithZGFDbmI8QHs2CisoWEh6ZFEzJkttZ2JqPl5LS1d1MW93QHlpJERjbWF0SX44MnhzTTwyejNoQi1WakA8cShyfCVBIWZtXzN8M3lCcjMqVUh5JChjLVY+dEZJCiswUUE/eW1ya0p6OShxOUQzPk5zTF98P0ZqM25rb3dJJE1XTzlvcGpQY2V8KFNPOz82NVEyQiN7UnlvMExpWH5JWCs4eitOZ1pmKk9WcEhUCitOdUJTTk9mTGh9IXtyWjlLd1ZeOzdtKUw/eihJcmwwSz58TzkwKDxEeTk0Yz9hKH1lU2VUQU9ebj4rTFk4eU1CRDJkdEtAXmhKRj4xb2ZTCis0RG5Od1U2I2Zgdlo/YUN5elRGWlE8c2FBWCkyYXJWTi1He29AQ1hIP15HMXYjJDsyfD9hQGR2X2VObTg9Pm1hTlhIXmJObnFyViteUEt+CitBfS1rbDFifnpGb1JRNzY7IV8kSnhtIVckelNgJU94MkMwWD07Z3NfLSVXUWpPMVFiYnpXWmEtZSV7aCt8cWUqenp4b0dqU0FoaF5jUFJJCitVPGE/PWZvdXBZaj5EM1MtPFk7KFNzWUYpaD19JDVIVSp7QDh+Xj0ycUVyYyt8O3pJbF8hNmJBcShqcXJjOVV1UU1JfUpUZ0JyOC1SbCU+CitiKDZTVjRuZylxUmYoOUMhUWZ0ZVdnVEtSY2Y9cjBhO1A+dCFCXkl9PVoqYjE2YSNWYm42NDN0NilqN3dUblJzRVNyRjI9JWwkKlE0NkxoCisoZE17OCpTMmJWeSRwaFVoKWhDZHZJeyp4eGtVYVFuM0w5ZyUyTVF8VFB+dDxsSjFvV09Qbz9fc2BzZVBnJVJoQU1JRVV7KkUqeT5uWG0oCitvQzFLVHZ8UlhAYzVTalF+YWcrZ2hhNjR9SiM1Uk1uRktHM34oXlReZm8wNGA+Rkw7PktHNDJMUlZVcj9qKlo3SGdDeX0+OWRrYy1sRCQmCitaI2pzQ3paKyFVLShkZGJVVjMqcVgpP3AyWCt7SkJ3UDQzSStManZrbEZ8dkVqPjhPO1AhcyghRyl6T0dSQihZS0Zgc0JWYnJJcylSJUMwCitQMTwxUWpedlRtayFDTlZHKzQyPzZ9N19hbWlFLU03Z0ZCWEJWb0QxXj5EZnZ8SilVY3RsdjVoOTRQfTF0KGpnYSY1QWhKMXolcUBoRT1zCitLPTt+RHgwfFRWMEk0LVl5b2BaUSs5bF9SZW9+VkolMWdwZENLd1p8XjYqc09RdEtHcVloSDY9ez9LSG5jQEJfZDJAIWRad1BNX35qSChqCitobEchQ1BRQCRqPHEpK3kpPj0pZkBWPUd5UTNHSGxmOGY7MUcofFEwKTI7b1ZfVEh5WF5MWkxhR0ckeyFKZFEpYVJiclFBUyg3a3BOJDdZCit6YFd3UGt0Q0hoQmU7a0Y7a3Z1MiphQD9JUHE1UUR1WU8jKTB8QEZATXtmJG52WEUzTER7ejJhcG91RXxfTG5UdHpje0R0MWx2Y29WbCFXCit+PDdiXiNhQD9zYjlnd1pVb1NxITFNMDw0YThqR2dVaUI2ZXc0d0w2a0JUVjt3SUkwRTs2Y0VqNnxgWi0xYkJVOGhYYHc5fVh2LWpQeTNLCis4UiFQP2czWEckT3AhQiE7aVFOaHVtdnBONkd7TmomfER2eTRNenh1diNQRHY2KWBHMyNOPElUKGdXY0d9MmBiSU5kZnVDckNlcyZ+VnBBCiske3hfWSZRe2VNcSRQYSt3OVhwfWk5MShQZFY/ODRKdnl2VkduU2pHIWhCQERxVmUjK194UGZGWkNLWj17YUszdE8/R0dxZUFid1hic0Q4CitFTmZUVjgzWGUrUVUyMDEwUz9aPHRKay02Q2dLZWt2ODhOPl9NalF5fXpyKlNgMGA7SThHTTFmeUZvVVFjTlcwbm8kVFQ4cXhhfTkrWWE4Cit5SVU8ajElVjQqMWQ4OD1weHpTZ0lhWFJHJl5TfFFQNCtHUjE2P3YhNVJLPShSOGBoKVVFN3gocSo3V2tneDl1OHAmcFY1MFppWWBPdC1VCitWMT9HaXpAYSFpXjQ8emE4amEybUozK0I8MSRDeClNKGVrR0o3K1REUXwwOCZNZWl1dWUwJWkmM1IrdENyQGZgcHwqeXdZenhgI21obz12CitlMURuUz0zNzYqY0hxQVRvaz5SV2peR0lMKiolJShOZ3tGQ1g4fDAheXpzSyUtcitnMWAqWTcxYmQxTkN+K0cpdD0+JnNMNF8wPiNedFVTCitsMCRjbU8xSk9EKDtuenZDd280WStmXisqOSV8TDYyQHE+R3ZeYlY5QGxCek81ZmxMb09mTn0+Sk4ocF4tczhaMm9VQCMoZmR9Njsre0l3CitgYVU2Z2RAe3pgbHBGeGx0N2xrPWZiNWl+I3VmMT9AU005NGkoN2k1MntnP0JtOz05e0ArWFp3Pz1fJHE+S0VWPj8+RnpqUyRFOCVkT0U/CitvYEVBS3dneT5ARStxWl5PR2JFTH0/Yyg7bHR0PDgmfEpAdVk/YjdZI1EzUzFXX0V7RlFYd3lLX1dwbkR6V3hWdjc9NTt+LSZOel96QnRsCitwaHxPYmZPNmYzKiZ2cTBTb0krO1NXS3RONjE2LVJsJDx0SEhUNlF9QGtpWjBhemVyQiNRS2AlS3dPPChIVDQ0SXV+MXE9aD9oc302YW5kCit2elZUanhRXmM+SUFDT2N0UmtRM1g7byZTZEFkU1UlVWcpTWZkbTwzfDlMSzR8SzJWd0M9PkRTUHJgZDlye2BfQmpOPUwtPVdrPVh8LWc8CitWTCZAdkNLeHQyVzdhPFIxS3NPI1B3PTYyPjkzYiRCNnpZWD5PIVVpUkcrMyhPTHZVSiNiN1AzP2ZQa2Z7Mmt9ZnkqN3xAQyYzI2dxXiE1CispLW9UfmJRUlF6aiRCS2cjKEREUDRTLTBrNXpxS2l7Pk5wM3cqRXVjeDhBZVczQ0NzPXJFXjx+PTlOakZiYFBQZnFBZzVDcGJ9MkRPeF5wCis7UXdKeX1YMDtDdUg3KXpudldvTEt+cyF2a0JxVXRndEZxY0w1SyQ9anJ5b2BRc2hOKnEtaHFfbndfTEx0K1o0THNheno7VWRPST9QfXo1CisyREBoLXdofURzIVR8cXEhRz15TGl0Ny1Sb2MlPz5kRmc/IUlRV0Z0S2ViP0tnQ2Y2NntJRiNiOGtFPSkjfCFsKztiOVQ/RCVCQGtSR2FPCitgKFVibSQoVHdVZy03KSl2LW08eHU1RHdSUT49VS1STUJFVitlJVVsR0YpUj4oKG5EJWwkYSkzMlVsNHM1Zl9xKjZtTFV5NmFEI2YhTUh7CitHOTQ8O3NpJVFqKDBHakAzd04oS2IrN0lwSWB1b0RSMVVwUyRXTmttdiNAfX13Vi0obHl9QEc1SldITy17aUQrY1lRM1Iqb3NzfnsobTRFCislYDtRNT5qY3hzZCV3IyVjRHkydmNKSG0qcnJaSnFCdXcjQ3U+O2NeP0I2akVpYnhnVnZmRDwtbFMpMHd7Ykx2MjBGNUhqSzJIdCtVZWxBCit4JmI7I1lfdShnaVN5JCVYRG92N1VAcm5IKnVveWMpYDUldkpmTmJ6VVpUO2R9NnYoXjMmRE5ockdiK14wNy0lYyFGcGFyJFEzcCV0dFF6Cis0TjFZMS1hWTJYan0rSGE8WUlKKmI4Wj0rKmZqPEFDbVVEbisjVGUqKStnZTdWWXU8ZUQ3P0gxe0RjcHw5RzwoKyZjV1MkPTQtIyYhRWliCitnIz9jYWpMO19BcHFCKW5VVmtINEtYSyFCNFd+cFZ6Iz8/ZiVefVh3SnA/JHRHQlFIa08jV2dwLVBRTitTTmpwLShsZ25XN3lyRHN5MHpCCitQdm1IdXVEN1gkMXB3ZTBoOHM/PG59MHl9K0NnQlE/VEhoVytMQXU4emVSTUN5d0trPG1GUDAmWlUhVjAldHtya05TZ0ZrZWczJUlDKFBWCitLaDc5fmVafU5fO0tfcVErbnA9YEVzJVRQcXpsOzZfRVBAbGF5Jkp8P2BFXykhNFktez5AJiZINz8hZXNGdks5ISpQTyQlMzA3Pkg3VD5oCisrZ19nYUcjKlNoXld5NE1afCpMSkIybkxrTV5jbWo0UUZMcmU9X2I/LW5UZyZDQSNFfjBQQmswcTt3TjdMND5uRk9gIUpySSshMiZycTN2CitOfTUhY2EpU0hifUgtPHszZ2I1RkhZeyMmQjxuZk5AQ2sqNzJYe1VneHliVig/cmRKTUd0TzdpYDc5PGlYKjBucEk9Qjh4bktJP3ZXdVhCCitjMElsPipzREFOQjJUJWpLcHpLfDchNSZ5PmRtaDMjXk9mZmlOYH5qSE8kNDxpNHk/RVdmZzwtTllwd0Q3V01jUGZIPj1UKV8hRSV6fE45CitxfG4yeXVKUmZ+SXQ/R0V0UTMqZCY8UzdWZUB9STxDWnV+RXhJPmQ5SHMoSF9gaGZDJmJPbDMpKl9DKzlkcl5QfHpaaDxqMWtGfURnPnpTCis1UXJsKU4qcz4+clZWVFloTmZGOXJeZXVSMnFOQDdYQ1khPFhUaVBDVGomTllzeysxS25ZZXhqb0omOHVxOGV3I3gmUnF5fDdmT2kxakA9Cis+MFMhVS1FQlVhZnBkb25KMCNDeEJfaVNEKExaNFlXa0lYeSV4bDJwaSRzaTBiIUJzSlBtZl9hJVZQSGZRT3A2PjdpI01+UD1ZOD1xTGo7CiteK3licGlWQ0MxZVl5bkJqSWBAcFI5c28wSUd5cGJ+elBiNyQ1djgrQXw3ZXohezwje3xCJW8zTn08KGt4Q1I9XlFFMWhXcU42WUB7dWx3CitScmNDSyRUMWRsa059T2hJTnNzYzI5SjhwMyZqQDFSRj04YlFaMV5Sfilsdm5rO3AhRS1PZ1ZTPy13bTlXRyUyY2tLJjMoWSs0SmpUP0BzCitkNVZuY0g8WF9aaEdQSVZuaDZfZmdBVWMkbUdnK0xxI3QjM3QlbHw5RkxqKm0+TEhuMlcoNHtqKDk0cE1hWWY8SjQhNihnTjM1KDNtcF9ZCit7VC1BLSNRVFg+bl91NElFbnk2c3FCTlIzZz9rK2J5ZEVBQVA/V1E/N0tzTF5sUDVOYTFybkBSMEAkQkxmdSRWaW1sc08hZzVoeUVTMzg1CitBfD4lYmp5cSpJdiNqK3NHTFNpYEY2T09IfXwjMXF8WEZBT1UlNmRQKn49NEd5bnNvVE8wdXNzTGMrYi1kblheRH53X3JSTDttT2t9Rl9jCit9Wlo8Z3l4bGBEbXljPHlSO0pFc0ZAbGY1OSkmSDtPTEpaT2lUPFFGdiZ+eUtldTA/c1kwaTFAfD0tQjx8cmotNj5fRGNHdlVlNWExWGtsCitzdTBGRXktbSRuLWF0RHE+bm1oPFY1JG5taTdHME8mQXRhSmRsZkklUkd4VUFkK3pOP2Uze1loPitjelVDOHBYJmZxTjdfQGE5cSo1OztCCis1R3hRSiFpYVJKc0JYIX1KPyM9XjkhYGFpPX4wb3hWaldhOT1UQWlPMW4yUGw1PlopIU1IZDJxN2dXPzAoZkE7V1pIJX5aaFZYWjd4ZiUlCitHeVNiRXxFPE5Jaj96UEZaREQ4N2drZiN6Km99R3dyaGgqKWtgMERiUkp4WWd0MVMtb2UzIWhGTjV2SjtJQyVWXihlMFI3dlpraDZXYG8oCitnaGE1K1FUcEojd2s0QXN4NXhMe1UwOz4/TmE3WVFPeVNvMWMtQ0RAUGpFZHxaQmdicjN2JHBOKk5paDA9VHNkYlpSbXdjYGM3bX5GMGdTCisqe31eYEA3V2R9SVF5K05WR2Z1Mk8lZSUhaDxRQCg/ej9uQUVTUTdlR3hle20kKGwoN2k3ODU9YHR1M0RGTXMxKF4lOHorbVFedmdHQWlDCis2WkRlTCEmWkxscUUyQyk4SE43KDdrUytOdXZfc2E9KzZ3I2xtQXYjfEE2VmhyMyZuc3Y5TiRXcCgqPCZ3XnlRaykhZyQ2VyF+QU1WJkl6Cis+VyRvUUBBJT9STXlTMFojRkclT0NIeWN6MnwzTU1tZ3hAcGVBUHxRUy02RFpROWJYbVJgUTxNV2Z2eGQyWmlgQVcoeCtYUE5eWEpQelBQCitCSHEmREpTSyV7c3VnI1U+bUlAUG9sd2VjI3h2UzhES2AlQ0xfWElGfFgtLUE4aXpsby15S2RAekhAPT08VipjLUBJb1Z3UFl9RjV2VWw5Cit1N1M9Wm9SYSk4QiMzY1gjKjEma04mTlVVPV5QSVJ2VyVEaFhleTdMfCYoJXNRdGlYeG49dmJiMzxNb2AlU2dpQik0PCthOXxubTJUPlJICit5TTZAP3d4VHF6dEk/KksrUEQ4YlVzZlZpXystaTR2V311JWtwIzRjNHloI25ZYlhVYm13VDA+cnZwQXYqVloyMTdpUXI7Mm04YVUweiZtCitVOzlVMGN+MmtSX2F1R3hmOSolTXRwMFlgNms7fiREZHJATDQ9QGpWaEArblJHKm9vT3AwUTtpSFZGdipUMyVaXjt8WFZTMSQmUm5PIUolCisyX28yI2I/R0doZkx6IVRoY1puIXo5X0dDbnsoSEtEanVWSTw/dVNEJDgqMHg4N2lYSGUjNU1XYnltOVhJU3I9NC1BISMpITBQbGo3cmw3Ciswe0Rabno7fn4yUkhgMHpfNl5vcCVGWU4pX1ErREc0Nn1aVDRtQiVFaSQlMEw5SUMtaEBNZmJZR1pKbngzdD1We3o5Xis8MkFWbld4bkhjCitFM09aKCVDSUxLJFhyTFBXKTM+JlpiaFZIZWdWVVVXcW1APG1mKHdzQ1JvRTNRcztDY3g7QTxeMHs0WH1Iam5CQyNpK3M7bilDQWJfVGplCistKUA3bUQ7MSFwcCt8cldQbmA2M2I+Szl2JVNWUUU+KHI3RHY+MU9lZWI2NzFDO19sMjxiVlVfI2pnYD15O0lGcTwyaChRYSlCdDtXI1hiCisjRyYpIT9mSVpVRU0zN203UHpfdTAlMyhAOThiMTV6QjNgPmNOTEJISzRacCVyMFIoe09Rd3BTPWt4NypIeDE7SnFKVFFmIT5yb1VaZ21aCitVQ1JSejR5OGxiYmhyeTBkYDUpdjkwVFROI1UxQy15LXFBP19CekRMNkI3dW1wcl5+Q0dsVDVqLU9DRVJgVWBuWFhnQXB4WkdgR29rSyRvCitZYmd6eFByNkNVTGhyNGpWMTxScj1XSyl4JUczK3syYU1Sc3E9R0d6fjFwNklJZEVEbyVvYWtQPUBCXi00KSNmMCZ1ZiFaUj8rVnFjSXg5CisjTWl8T29VOXdnfmdZKD9GY3RwPGR9QCg8YDx5SWFySEk3SjxUPTBTQGY+XmRxOUFtMUcteDIxU0FCM2BVSVpNIzRMYntgKTUtN2ZrUDMjCiskfnA4dig3ayVPND0hVmNJKW4qSHBJUCokcyFyOXYwbyVzelEyWDkwVmZ3ZEU7TW51YllCSjxyWSR9WlpDaT1aSzZ9T1A+Wl9oSmdWbjdCCisqai0lWGFjMm9XbU9EWG9oTnBwZCktKT8zeU9jaUp9PUxYMFgxfjwtckFXWEkoNCZ6TjxTRVJ3fCRie19vMDYwUlA5anE1WX0tM0Y1VGxmCitjZnF5cDB1Y2ZwcGVaIzladyZgR2RecjdTQEM+WThDR0lMVz9tUU9WPnRKU0BPQ0h7Xz9RVEBATTl4Y1JOdDFkKWlpWE49JTB8ajc+OD5hCit2eFVzWCZjezxnLVFydyF8WjVie3w3M1pFbWNHJUVDeDIhMlVNLTBae2FWR01fekRNdzB1QWpUekNDfG1FUDlGJVBYUzYpYFlrSHo5NlhqCitra3NQZCZLNXVOWXxpMyFNOGImRSM3ZEdpbkdVT0NnNiYkdE0oKV92b2JYTjJzSUlsam9GQEw+NjdJWkY8ZF5CZ1ViN3dXLTdzbU18MVY0CitSLSFkaVglOWVrdFVzITVqdTdVRWQrYFc1b0J8NHhZPWlSb3ZreCFgKzEjZW8qNlpzVn50YURQXkcoOF9IOUxgLStGaENWMHB2WHBpcSUhCit9RE5CSVlZQTc7bjZVcUBhVDhEQEZqPUJpeUEwOzxWSEZmMjJXbiQhR1h2X1QyWD5BSlpUeGchclhMfUlaZShxPlVfQnEtUnBLNFk8PCQ9CitgN01fMXc4bUpQYD1BWVJwUmp2Ti1ITC09ZFVUNjk/Z05NVklGN3FyX1R5TigtOEp5cXBLNVd+aHxlPmVlcWNrR2c2QzFnXnBtNDM0fCg+CitxKEN7M3UocSozTFVaK2QjYTNpcnReO28oPGxqfUp8QE9eYGVyYU49a1JXb1lRayh5aCQ0LUloblkyZ1FTdWdsdG9Xalh4THc2ZTctZkAxCisyYmx2U1drJnQxZVFqbEhuNWwjVTUhdGJER2hKWnF0UT9RWDBMSF4ySmV6OWA8cV4xR2pnZVNgWkZNN1olITdGQ042VSt9KmJIPCE5czhRCit3JDNQdlF2WFVYWExNY0p5bGkxUzUpXj5ANE9femJzMipYXjRxRzlJc0xCZGFmRUZ2b3pZJnI3TWdITm9ySjAhI3lDNTtBdWZxOXVjcXtCCis3Q1JUNj5fI31fdjlReSZxOzlpSEJpRy11ez1Pd1hrNyt6X2VjKT1ZWEY4S2ZLQm50NEBja1glSSRYK3k0UXw5RyloVSRudTZ6TWE2VlV1CitoP34yVE92Y3ZAT1AtcXRfcTA0QFBCfWZ5KngwU1M3cih5SHo0cGBOV3o0UW56SSZYQWdzLVBiVU19SWB1YDI4b0FZTzZFJEVZKSs2PVMyCitMK1NPSlN1M3FSfm0kaDJBSkJQNz5aJFlFYUkjOHB8MlNDVkhOQmw4cDF1PEE1PyVieDdSQCthRHdfb2FCTHFzRHpNMmdPZ1pfMUNQOSlMCitAV2F9VEIpcj5HV21sfUE8X0lLejBrK2czT2V3WkNQZGR0R2trdytQMkJ1Nyo4S1B2WSRZJjBVWnJJRlhVVGt9MHlII3ZFI1RFKiV7UGM8Citweik7MWIwLWFJITx6ZnopYHBAdyNlbCF8YFB5TFdAKVdabGBJQyFQOHluVlV4UGV5SXVBUF9kMz9rUSg2M2lobENTMVlaXzZyP0g7KT5gCis0cGVuSDRwREV4NStjR2BSbXMyRU9mNjhxMkJDdW9MPUtJXyNOQjg3a0xzbzY2Z1YmejJGLStOKjVoYUlkKnIjdT4tK0Y1XmYjSExpYWo3CishPyM0c1EqOTVrYiRSP1lWYSlTfG1iWmNPcjBDdkVsbn0rUnlLO0dgPEV8MGNjYEZPdT4rdEFtMEBkKFQwNFVGT3hyMm8qSFk3V2ZuKSRrCislYHt1dGA8ckl2cVdMen5ZN3lyODMxKCYjUTxgQX53KHV2aX1RMFJfK0t4SWM7SXZMLS0+UiRMS3ZQTT0tXlBuNGQzfTI7VlRJZ1A8WFdWCisqcGlCJXpGZUJCTCZQK3wrdFhSQDdWMCklPlpEPSMqcFcoZnZxOUBRTlglQj1OPD9zZXwmOH13KmV2anZhNWx9JTYpP1F3fTdFXigtKUBCCitrZWIyTX5AeV9OWVUlZ2p1fWo+aDh5Pl5ZYzhiKVdoZ2A9MUxoQGh7SXQ3QEZIdktqKntFfEB1QyMmeVZSTSMtbXE2M1RJeWJ4dEgpamJoCitleGo/UmA2YGhgaFlZTWAkYkItTEhzbUFAZFcwI1Q0Z21YZSkoPmZlWnA1PSZTVmQ3JXchfFhyRG43KVBlaihsKyMwcWRObDdTJXYhJUNqCit0QlVLVikqSElsRFFvODgpYXRhbFg8NypLPHFvVihkUT1oQXMwUWwrb25fcX5hamxhOFIrWC1UR2tta1o7OTVeUGFnKDktMUd4WHJLRVFkCit1QEYzKmtZfikqfCtGVn1ZMlFEbFM7SmJFRD1nbzs/RmJAMGMzMWBlMzZCPGZEUk0qc0BaSTt6X0lpTzhLd3g9PzdTOSMmb3JTOD9FIzYxCitAVSMmbkAwVEpBPUlrKHE4U1JOR0leRl59Pml0e1BeOU5WaHkrYmF6KW0rMyZFOXF3TFcwcnBSdGNNVmlPeGxjRz0wYj1XPUxLcTNSSTtfCispRU1CUSswP3NuWGE8YUJEdmZYUVNvMUFTYCg5MGNsVEhKMVp2KSYkWnlXeCltVnM/PDk5MDtaZUdeOHg+e3Z1RH1ZK1J7UWxoTmgkTEhICitAcW5edWV2bT9vI0Z4OzUqVH18MEgobTdWbTQqWVZQeWNrYjlyY2V5VzBocUgyRFkwYGB6UGtQVGQ+JVViJFghM0FsOG5QVzk2YWhYYzwlCitvSGkrKEBJMHV5VUN1OGQ+MXYzYSpDa0djaWEtM0JmSTdqNXU8UCt7PyR4Q0o9RTBFN3V0PmhFI09KQzg/c25sejtDQntQQCNlYE9Gb3BkCit4M1FPUDteOTs2WG99c2d2WEpzU0ZBNF9MeF8rcykjKXVsUGVBPiRAeztONDA5ZmpNZlk2enIwNjhhSDJ8YX5XPilmRllhNFo3dGJESkx8Cit5Sy1OdmgzYmd2eTAqPXdNZHZ3K0tTYEFJUFBKMTN4KSFAVWI/VSk7MjNTeVVNPWc/UF8heUdtRVZDaFBQTT8hKSVTRXZPdFNtdHhvM0x7CitoT2xWIyNnaTl4fkBDI1U2ZnVxYDlGdUA5ZUgkNmlDO3RlXyg1RGBVbFVsNUVIdU9nI15zRmZeYCM3N0A2KS17MlU4M3tnbmZ3ckwzS1RTCitkWHQ1clBwQkZWYUVBNzVyYCRNX3tvenRKKXV0eT8kcGtSTHY+eXA8JjM1Jl9AMlc7N313MyRla1hSQUomZkktQyY2dkcxTThCX157X35QCityR3coSWlZO1QjO1haN1p0MCVnK281T3tMRHpAJEk5dFUpPFJGcyNzU011cFRUfl98byUlUGI9X1llWlooQ1FxKTZDZElNVCQhNnJBPyF2CitrZUtxP185JEVvYE9aKEJlOCtQJXYjelRSJEtXXmJzaiYpYT9xfXRfdmJQPClQd0RMbWFAKCUmMjhTdDNfN2RhXk8zPWFtdz8razsrZUZtCisoKj1ZenpZREIrM3Q8YkBzWklvdyphPUd8WlBDQ2w8fTlUTSl6cT1QJUthMVpiMHZaQVlpRz47ZHpRc2hRRHEhJUhsQ2ZCezZjZXt5OGYpCitzWUJlSVplcVpiLUd0ZTM7fEE4PGVFNCZKMGckMzlfcCg+TCpEMjlfaWZXJmsyLSZLPTt+QiZPQ0MhUS1ab0chMkRMIWRCTGltRW49S1hqCitjYClMUWI7dEFJaXBKUD5HSSlmeWBnKlU/aCYrQjM8akM8JUdoKndrMnQkMVYpcXlnMSstOFBRPXYqQFN7a2olNHhmeGpAclk9KmF2ViZoCiszMX1YRTtCVDV0UGlqJU4+bjUhPHE1I2FxP3p4dWJBOGMxMjJNe3ZUc3J8Z0RjNCpmd2NxTjBVbjE1T1FnVjNxJmQhLXx5MjkhfnZVOylfCitgKHg0TylXQUFyPTJsRk9sMnsoZStKUEhQYUI5UiRTTTJYP2lsZFpsMj0qaWclQVcxV080TjF5NkNHPjlCST9uRjdkPzJ2SEhYTHM2S3ojCitFSXRmQCM5ZXFDQXlFPiEoSSlLWWl+NnJPblk7Xm5CcVdgOHsrZ0hTTyU0JHtWbEZPMnpWS0Z3YEImUXgqKnpjWmFFVllVWj5keiNSbFo9CishcGg+ZFpZPiNTJHdsUTE9SntIJU9ueCY0YT03Z2M1dXdnfUs8PnVfbzIwbFg5Y3Y/SStRXzRvXjN8VG9RclJORFlSakxzX3R7XmUyTU1jCitjc2RtWCpgTnJBKElANT44Y009Wih0bWxkb3k7QXN6aG01T3JlaFA8WCtTNDFEalMoRV8xR0ReKXlYYGkjMzhlaFpCO1NgbGZxUyliK1lXCishU2h5ZDY0TkdTZVo4eFglTTFxZ0lRPEg/UkEqKG0tU0tYQkdIK0E2TTNKMWFCekN2dUhSfXd9ZFhoMlcyWDBpOUcrYFMzKXIta1VkdHtTCitEJURaK3d6ZUp5T197YGBuSjxPR1IhQjxiRCFtO2J3JFIlKkBBcHU2fFo3Uyp0SDlHRClERTtLfXlqUGd4QFFofX55fHY+SiMrMmczUjRYCis1ek1KYGkkQCRfMSlpe28mUmVRXmAjLTdlPjxMRil5e1o8eV9kcmZaVUZTYUt9T2hAa2BZeD5ZSFhvd1hMYDUwQ2dgSV5gZUd6MFIlQEsrCit0fTxuVGNze3gqVlVCNWpAQE8kbnZ9VlZLeFNYLVN9PkNfZ3MwIVNNVTU4eTROTyRRUm5QQzckeXEheUN0P3UrPTIkKDlhPyRmZEluTTxSCit8c0dnd1JuJShlQHgxZnhZfGpuWm40NFdXWlhgIXZ8RWMkaTZMWjBeUWFkJD9VX2szWGlJWXpNYz9nJE85WUZPWllIeCtySWZ7WSYtSGJCCitHXnskODNmRk1pSTVWZ2g+OzdeUkhOP2B7ZkNUeFNFMHEwO1pOJH0hJHUxN1hiQTliRXYrRGM/Jil8Q1orO0k7cj5pJmtFQUtjXjFLNEVhCit6Z3Q/ZXlwQDJIO0VwV0h0PkVXSzh6VnptcmJNT292U2tuQTVLRXdEe2M/K1I5e249dEBmZThmbWN9UGJQRlZycG8hUlBMdzlFfUd6YHErCitrZ2FMUnw1KTJMekJkTHg0NUkpKnJlK1kzfWFMMX0maFJ2VmxsTjMybz5VPnEocEJjQlVMUXc/UjQ2alY3fGduellhbSoyLUIrdldza1IyCit9ZE5aWENfPDc/dVpRdTMtX3ZHYy1OWCNiZVhhdlche2hnUFdId3pIO31NZVpwdD84MWxXdCEoPV9FNlMjeU1COTlDWXQ/WUhCRkUtQSFnCitnP2tMY0BNbChgfncjSHUhWl49Z0ZXRzwpITd2T3E/PHAxTHwyPDklTlBSZnIzWnJoZmlIcz5BcE58QDBiR0o/WXdMd0s+QEBKRmQ1a14mCis/REI+YkNzZCsmXjB4U2U4UjFPN3M2aGsyd0JvYDJXekxeYF9feFFXQUshbFM7Py1aYkZDSmdNeygmRnNlYSl9U1paQlRGZVNDVSteVlhsCithe3AjYFU8Q3AlIz15JV5nZWZScCFWYGklQTs0Qmtfe3IyWm5vRF9ma2h9KDVOMDBUO1hPNjdhKjU9QSk2SUBYKHxleERkZCYtakh4Y3dwCistWGdBd2VFaG9fX2c/e0h3QFFJJndvVXtocVVESkchTmdUdHdVLUspWDJwSj5JKjJafnU8YyEkZGVlSCZha3hEd1Fma1N3Uz4xJm5geVMlCitMfj91LTc3eD5qIUckZlR4STdKNT5ZNEVIQypFWm1UKG8yVW1oPEFmU1FAUzVVPUA8flNWTz4qTllUYVhrWkF5Sjs7fGAzTXhWeXptWkpZCitMWWxYZUtXMnZAREQqeTR2NWkheWJwQiRmcHs7RnkjISE5c0d2cng2WlpxZkVIQXZubUJFIVJJZVo3al9kcjcmaD03QVVHQU5ObjRMbUVBCis1RjFVS1Z3SmJyQXM7QWFkRXVTQjUrem9edHAlRSlLd1Q1aUh+fnJ6IzMxM2Eha21LJDhpY34yU3tzekRxRjFCfDZ0bGVXNHAoQVIkTl8/CitpZU5iYF8lSFY8VDNXfXtrYnV9bXUyM2NFQi0zViN+MGJ2JXNQVk5hNXYlS1V4KmF7cGB6X3xvdU5XY2pNa1NqbiVLYGFTa04jT1ZjNG07CitwfmdBXn03PkN0UUZNeGRER2c/RzNUVFk+KSFuOVlGMjQ3a2dIWjRCN01mYlI/RncxN3pxYyhIKCMzTWl4S1JSSWJWdiVLJlFTN0l5VnwzCitSYElXYTI/NDk7RFluKzhpVzFMOSFLT0ZoU2xCcXlQYVRrNnhLbnBxUy1fY2VvTjs1c3JkSDEyYEJVITROS2ljTE1ZaHBxQnR4MWVoV340CitGTGQlZSU8cVNGPmx6NHtzI3FMcHN4IWdRaGBiJUNAVGpnJUsjdDtTVF9LeDBsNSVSM1BEO01xKnlVM0xra3FNVlhCMiE1ND1ycTAkMT82CitIXklyc0w4Jj58YlEqPm1nYUpXT0FRMHZUKCFNfkc1WGNlWS1VJUVpV19qVHF1RWJXQGhaaXs0ZlEkJFZ1KSVSXyFOIzZJV0Y0RzU2JTxFCis7Z0ttTm81UTVGUkY+Y1J8VndNLSk7WXdAO2t3c0E1NGVHSyUhOG9XVDJJUElmPTd5T091XzBoJmYoO2o4YzZJK2tSLWw7V2c/RzNUVGNICitqWSlUc2ckWjZKOUswOFhGKzRBZzdeSVR6QGQwPVpKYVFVQGluN15SMns2dGxlVzRwKDk7UkY7Q09NWm5BbFdOXlVzMXwocz8/RkZQO3pfCitKQnxRb3pGbT5gUlFlPWp+JE51b2QkOUZpJDV0NF52KlUoamFSS1F6c0llQVJgRC01a1drUm4qXz4waCM5ayNZa157eDd2NVJDMVRTMlBqCitnU29uPmY+UGhMX3A2NlhVcWkwenl1MU47NT84KEZCY3FsNXdqRmZmbnReeS1yLTdZI2VAUmtYcHB1QzspMCshOWFJZzFhJEhjKzI+QFpoCitwIyYqYnVxYHw4bGpafShFSEF2bm1EbWNxZXVNcUQhVCNHfEE4V0FURWx8az9KMlpubWhyekRHS3VaJFRpfmBqfnNGa0UkbT07cDlwdWlpCitiaFhSI05QfHBjIVhhUnY0V019fnU2IUpUODctMHJYSlB1VUhmeEk8bERVdClsRUhDKkV3dHxpX3BjRGMqVzF1fEA2bSlfN0N5P1pYWCQoCitjQDBBVTl1O2hAZU0pRXdoSm5LQDkqXjE/ZUBpTElDKGtsMkt6Mz1rJU8wd0s5VS1XI01XVmUkYWIzeEg0e0xXfD1AajN7UCM7aG4rRDxtCitLU3k8WW47XnlsXkVwMD5jbk9ZNX1qSDRxeX1GbSFsWjtLcnpiOz97Rm95TFBhfCRJdE53YmZNXlZndHdEYDZzRH1teCFrYDJnNiNOM1JLCitQYT1zYXBNdmN2JUsmUVM3SXdMe3NDRFR1O2xAbjdqUl8oNWYpQHowcV9xPDtERzIxeFg2SHBqTmBeN0N9dyVkY2QhKSpxWDBnS1RuPW5hCit6XlZrU08yQlhnWSh+SHNnY0pjO2UyfXBSKj5mQj5FPHJLTjMtNTN4d25DfkdxPFRSJTdHel4jKTxwNldxJTEpeTUrKXZgOCRyNGU8T1hyCit2eENGJiloJDZ2K2ZtU0NGLTJ8ZUFwcFhgRHE5TFV+dXtXczkyR3l5Y28pbmFaZl50U3NEMlVfNkJgOVdqO2hucV4pO3syJmdYQW9yVUlRCitqSEFvdjJCRVRxSUJjPi0hRE5FbX5wRkhBRGQ4PChKJTwlTV4rNT9oZlBnd19qbzl0Qz5PcGZuendhdU9VXjY2fSEtR14+RilHc3hKM15lCitec1RPYlptVnl5UUZCM0kmNWUheURBWmczNUQxUHl8M2FQP0g1Umk9aDQlQFE2WGBBTUFHdVdjX2o4eENGJjRGVEJIKipiMWVZVjkjR3J1CitANGd2UEYpRGpRd1ZrXzEmMUY1bDhTJX41QjNAZEo3d2QlYVM0aTlVVS1LcXVAIV8yZmlAemowU0VQQHB2RHVWWmI1UHVCdkM8P0Z4YUZUCitoXmhrR0FrR18/cHFTLV9jZW9OO0t+by1SNygmXyFla0l0eTZZUT1EX1M2S01YOTkqZHEpcGl8NW9+M01kan4rRW5CfDNjeERzMlQwdXhZCit2ZmxNYipXQ1JMPnBkPWxYRkBxWGN6fTUjOFVMWCsqTzE4MFhUIUxiam13WDNYS3wydTAxX0d1ekFSS31rYldwN2YzWTleOUZ7cz1IbUFqCitDK2ZMey0mXjtrRDlLezNrPD97Rm95MHdvclpTT0ViUHE/SkxjN2lMUSsyNyglUkstbVBmd3g5K1JAYXlAfmVyQ0lnT0NFbCplZnskSnpkCitnbjtHdWl3MT1NVm59UCloPkA2YVdBSzJtdGV5N0RwfGpJOCskfTAwNHt6MDAxLXEwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WCitQazd5WEp2Q1FWYHlQPVdNeTxPV3AhaDhjV2BvVlZyNm5KYUN3emZVMm9iLTVQaiFZakxIajxoI09qNnNjcUI7PDNOZm9VJjVkJFBpVjJuCit1PENsKCtGY1U0enJKVXxraFVSRz5uRDQ1PUlsOVYjP3grSmV5QmdWQTVDZElOKFIkKEs+aEo3YEpkaiVaTVdMQSslZTZwKyk2REpCXz9OCisqaiFOQEdEa1VPZ3gwRTNrd045eGNFeGtuTTlZMykkNjxhYXxgM280eHBSI3dFczJIS0wrLXNRJEZPN0VpdzNWQGs0Kj04TCprZTRpRUlqCitBNXNTayordU0jJDNSVyt7S2RGbXVyKWNnR1Q2Q2ZfOE0tKGVYaTsoTVIhSCg/ez1TTC1wKGNhMzwtVyVJLVM2Pmh6bmg1KXk9MkM1fkVhCit7clMoMzNZYnVsPiZHTW45fWthJHwrOWdHK15GQ1Q5eCYzfVV4Ym4+fVNobGpVNXhCUnFgb0J5fDRYU2sjdiRtcWleeWQhMGowVkN+dEs/CismUlY5YlZYeCFVYHFGXyorUntIemZtJG5AbU9aODlnfWNXZ196c0RJNWlBSih1TjJQNGQ0JiUtViNma2hyNkhISXo7RzApSH5oUUFhPT1FCis+SWZoQnFubE1JeWFNVCg2dU16Z203IUE/SmIwMHNsaGc7PzluOGxJNVRXIUxiM199YXoyam85eDxFaUtKJmN5JFd+KEt8KD9AIVU3bUlrCitoZTdyPzJ0aX54Q2N0bnpBcjZobk0lTD9zbEZiQlk3dXQ+aDRCSlBqSXF2ZDB1S084Tm1nRVhiI1koWCoyPEhkNTZ0ajYoej1CdmVnbUpUCitBS2w9PFh3YVB5TU9YTzlhJm1JaFlsPzFmYVcoZilgQUoxfHJeP1pnd0soSFRxMzZiYnchUnNCejBSN1AoUGY+SDl+PXE8XkR3RERiZndpCis0NVdgRnF1MHB1QlhyaT9QcTVGOCRYLWxGOzgzZFhTPWdDPHtPamxgKnpVZWRCeWNveTRmVWBPeGQjVD16Y1Neb1VqfEI1eXIzbkJNKjY4CitmbXYkZyo3RWI8dEV6Kz4pMlA7WUBpPHY0OFBIMnVlfEtubyllcz0/QnxFbXJVdl4oPmFGdF93bytzfXNyZ2l2OThTYDNHQzdge04mc15uCit5ZkQ+RyFDO2p2QU1Tb1JoX1I0cmhoPW84PVVuKylifj40MFUjVjZyUV5MN3A+YDFTM25LaVpybUlXckdwIUhmfT1kOU5xJEVzLUo7a2pICitHe2hvZiM0cXdyX1l7WDlKPmptQU5VJTk/MmVXbXladHBFRDk4PVhIOEVPdyh1QEdOWjBlJSY7M3R3cVV5M2JnRl5SP3xEJmFKX3RaKlpLCispaU85S1FIMDAwMDgwUH5kPU0+Jm8zNGVMU3gwSVE0dTA1YnBwMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrCitsXz5XcHBvUlZscCFeR0c9bVJhVn5JcW03UUlXOW1rUVRANldGJkt2PSpBK0h6JVBMe2AtcHZ3JFNhOSU1dWtwa3hmWkh3SHp2dGoxN21PCitfUT5yYFNseW1saGteRkBjX0hKcHZYU3cpWDkoZGM7ayZYdnBATFlBT0UqfntPUndYZVpHRDY/Mn1KRnxMVzgyPElsZU08WF5Zez1EaT0+CitLRz9xZz90YzU/PkVTT0FaKGg5S0s2IWp+emRnTCZ7X3l5cDUzZ1Vwc0RGUnx7Zn09UlVjUHd1X19WIXp7YyEqMC1TKUVIXldwOTFrM01fCit6QGF+fkxgUD0peS1vSmtRO3I/bFJ7QzBjeTUxdmA/fE5RPmwrbXxuWHhjfFElYHwkWVlaVDw3PGhzUClYUTRpan1lMCo5emZCQUkoO0AkCituTD9WRiFgOyh6X0I3ZihGdmhvOT1KekkoVSo7KighKT9ZaG8tIzZOdWRodWNUNVV2Sk5PQDd3TTl7b0RKZXp1diFFR3hfQjQmQVg/RVorCitAKDR7XklRfnxFWWVtWkdVKzJeellsMzUzbTM3XnppLW10RjE9KFpoUUIqZWZpVjc/O2hYMHBNTmRZPnhYWmlVT2ZIOHModCUoZjR7d2J7CitQeH03WUdBK0ZldFBfSWQtPndjX0hfVTE7cTd7U0V5VE8rI2hYe1pldGZGV2ZCKlJFO29HMTEoVHtJbClwUXYzeVpmaV8tflBPWXp5Sko/CisraF9OMFlveSFuQDg4QCUpb2l9fUB0ZkJWRllDamZKLW9ic15ZKHN3QHBrKXhwU31JPT88QDU/MkorU1dmbyM4ZnRqRHskenVFMnw+VUY7CitSdWxHLUg+bkJfUHU+SmdQQDFKPEwpbjVQTiNYSDdkeVpIa2p7QUNVTHJ8b3NeIz8jTkF7T30oeCFRV140WUl9SSZXNTI3bHVmTm0tWW9kCitRRXYpYUQ3LStwfDF8THU+akA5R0tsLXRGST5lZj0rQXtQRkFVcXRFfWV7bzY7K3BNVWlFKk1Jcz15fC00blVha0ZHUGtRK05oY2R4ZVRnCit+ZH0jaFo2Tyl4aGZrZkI1d0lDO3c4UF9+XyRqcEZSOGZQbUtPfCYlWFpyKTMzaFRlKXEtbT9XNjY+a0RoPTE/Mnx1IV9SO2gwJVJmSDxACit7NnhOe2N6ajl5MSlOPGlDTjVsdzg7TndpTkNFIWUqYWkyYFJlfU5pLSpeNSpWTy0xK3h4WiNgMTtsTS1IWDU4KkVZWXJlPCtMRVVYK1hjCitAWURhLTk9PzhqXkIzbl5BTmwpJnskX2psYzY7O3E/ciFfcig/aSkjUz5KIXotRm5MM194Ry1oe15mXnZUZWY9QmkjUHhOeTAra31gdU9pCisyek82Xzk/KUJzMik3fCMqPEopKDxeJCNEX1haUE9QeztNfGp3cnpqPnMoJGp7e2tNSmtgRVVPcGdVU2NEZGhxVyo/eFhjdXd6dSFfaX5zCituc0xkV1okKiFOZjQla04lMXk/QlcmeT9nUF4+LSooX14pbl98bGx6WV5vP2lYQCtJQ2w7ZSpBdj4/bXk9LTJNXkFBPmhgTiZ7bSpVeEBWCitOTSFmMmtNUi1zQWxYU0FZTFA4fSZscDxOVyFCXlpnNl50UVlFJD54SzU9eldAOX1jUjBecC00aS1+d3FgdSNJWk0zI3Z0UVJue2B3Y35TCitNVUcmJWxoZTlnTHEhZlVCbXNhQUFEMnFWZCVmIWVsZD5CM01sb2pVOzRPfiRNVTcwZXlFVzY1NU0pckgja0RpfEFBR2x1fDIqaVBrczlpCitmQk9FJW0pfnZRUmFgVE1sJXFaVz9lcDdoP1pCVkV7P25Kd0tLYmFnS21ZZEdTNkBHV19WRkxUZSloJVplfTRXXnttKERJe3tGXn5LS3xeCit9S1kjVj9lfF5leWo9QkgqM1MwQl88S0gqdHBTTkchK0MxOWJjRW9rcEJGMEBHR3cjT0s+eUw5az5Zcm9ocFk1KDRkO0toQ3k9N2tZJnVzCitwWVd1ciZHOD9Bb1VgPHsyVmRPfCgwKkFzZj9kQUckO2szUTwlK2ZeU1BaVDkrRT8wMiF4e2pPZDBrJCVsdGY1ZFMmXjQjbkJ7T3ppemo1CitCJll1KHRoZkpMaCM1eUBzQDEyayR3fnlQVno2KWkrJV5ZeTk8MVE2X0BoKUw4UmthT1ppfllTPyVFPkB9MHZ1ZTttVWdFI1daUUxuVn5zCis3ZFloclJfTF5rSlFaMEh0eDA+JlJ3aGJAVD9sXlVRY2FWPEJGNS0+YH45M0hKRG4lRj43WTZXX0YlNitrVmEoWDRWdDMjPz9vIWA4ZUJOCitqfk9qJEVoZil6WFYjRjhgcjxLYlZyU04/NEQoaiZSbSYzbldIRVhAVlhxTSRxdDx6XjVCSGlsRlB0XjVURGZzQ2lCV1VmTSRLdkxTQUE/Cit9azRBbEcmN240Qll1V0dHSm5PNCspRWtkY0dzfj5NWk9NU14oZiNXNm93Y3lfSWhLWStzPTMhPVgwMj1PKE92XmlIb2Q7e1IrRyhvVj84Cit4RzI4NnsjeUBAZC15RkJrQWM+WlkyeU95ZG15PXwtWTh1aXpqUFFQayFnVCp+R247UTEkezFOcngjYG8xfFlLZVFSPC07YioxX0Z6eihkCis9aF5VRkB8TU17UXAxM3tOYyFOIzxEI0lxcSZfdWZka2xIQD0/MUc0Pk9pentGY3pITjdsNUVYU3hQdkAqT2coLXB2Z3UrcF4mJkNQNEloCitGT288MjN1WD5yYW82NlgkTEU/KjkyPDZZa0QyfnQqXlJeK0RKQi1lWENfQzZYPCspdXQ/PXJ3ZjMwSiR6d0YjZFVWQHNYTSFRc19EbD9+Cit6THs8OT87VyQ9KyUmdzdWWTQpfk83Kz9MclpWaT5sLWRQJFpgOVd9KUB4b1kjKEBYbXQrU1M4VD1sbXhkcylNJTdze2gqNSt9PVcpJCl+CitYKjRNUjtRP3o8dVhNYnZ5RnlmMTtPYjFzSmheeTlPIS0jYCNhKVNeNFJ7UEtVbEU+N3U1YFdtc2ZWU3hmRzA2JUVISEwlNUp9Pl5NZjgpCisyNE8qelVzJHw1bChKaVc3bmQjfEQ2dFE3JWoxJEc+dHBPeDhRdEdJMEN6eHRONW9VcXx4MH1yVjJQb2Zrcj8wZ1FOV1R7JVJheSNGQ29jCitNZndkKEApVXJrd1MxODM5NFhVOG5geE1yfWFVV0FBZHUjOTYqVWFIek9oPEM+RXBWQ012Kyt6QipVZXBEOFI5a3pAOEN8ZkZ7ViZ6Vn1zCitScC1nI0tAaGNucT9EaEZZaGQwIVk2QXE2O3JTXzBfPXVHVWlpI2opPmdpWmdWJT1PXmFtclhLTFcyI09sdUhLK3VfZEZHN0xqeiEtey05CitmJFN2T3UpO2tKVShyfXljSiEqcm14WSVIa0pGZjZlX1VsPldlJmBkMHBzYjdOTUE5R0MhQjZkI2dDbkIpUiF5MjRLeyRPM0BvaTRTUlJICiskRnd2dEh2SkEkQEctNzElYiRDQ3xLUU0kTmVLZi0/dzw8ZCVFRn18N3s0dlk0K0V1JHltZXhwOF58TlMzNGRXSGRUdVc3cFI4TVZlYGVZCiskNWF+NWAzPyFnIT9FUkRmMj9Aa2dOZURsemE4K3EoeHRyPjlCalUleTArITJwMENtZHtKSiNZfjclV01ufDdrPGxCYnxUay1DLVRqKSo5Cit6cCZvYT9EPFBoZmNFaUcoPzNheHdYSDVGQmJ1V2l9Y0M2Vk9OSlgjZ3p5K1MheUN4WTxxc1hLNXpjWXBec1lgKkc5YCMqVVpHNkpLdVomCispalE4TXJ+JEFzWF5ZdkNhflllMyYkV1Bta1NNb2BxMVdqPCg+KmZqYTR0KDJ8bH1MN2B8I010fVlSJlkyODxTe1lIK2pfdzBCOChUMjJoCispa242NT9WTzEqdko2YjhRZD1odTFPY3xiRlV+VHBLYGBwMXtDPz1TMVdNbnkqT3J3eiltbCUmK35BdylodUZ5XkBBRXp+VyY/X2hnQWg4CitDNFBlajZGNkc3S2VJZ1BvVHo8dXIqLVlIT0xLPX5UYj1gcUY3dlAwKFJaIzw5MjZrLTMkTCVRM1kzQEcmcypfR2UkMDFKbG8zUHNXNjh4CitfLXI/fD5XOGAtNnEwO1deJDxgMH1DNyNDcisweXckKmE9cSR9JmE0eCROcklJbmw5KjN+QlhlQTMqaUZ5X2pId1lPPSZPLXhFODheb3lMCitOI21GZUo5SENROW5TN2BKVzVeQEo/cypHMiVaJntSZjVrU2RlQWx7SzBUNDNaPVZKYWBhMkMpO3pLcUJlR2NOZkVgJV5HOyVaZUdAeGh7Cit6MXFndTkxdnltSEc/YDxZMnRAQkNrIW84V1RTYWlZTXJaZ35UQ2g8cF85JCVyYUFhMV9VcSgjUCNafUF+OUo1TCs5bUFvRE5gOSE4RllCCitCSV4rJCU0dXElV2VyV3Nzdk5fcilYJkhiNigpPyEtSzxDSUFSMiZXSjBAUXkwYU9TIzZUQEVuKmYyfHNAZjZ6LWJuQT1UZz1LWThRTjw+CitGblA1a3h0b0xBQS1GUV9+eGxGJGBrVlh0RXJ4ViZAVVBnJUttSTM/OTxqVGFAdztLTyNXM34rc3RDJThFRl85Ni03KWByZUwrciUzVzwxCis9KlotNm1CN0RrT3BWeXArMjhTVFUtYntTa1kycjM3ZWNhcEY+ayEyaEJXWEhOJG04az5aNCo8dX1mdXBDIWgrIThoV2FCRW4yUFIlQSV+CistTE0jbVM1V3M5dyppZkolZiYtYHNoXkFocUpRamtQfChKTjBWV0EtMHJkM0FHJnUxcVR5Z3FOS2l8KC1ac3BGZ2p6VVJleGFUZTVgJn0zCisoNFBWUFBMMWU0T19VZVJGeDRKcCY3IWU7fUVoazswdkhWblM3YUJlVV56JVo0NmpSYHBgdXxvd3VRdjZGV0JNLUl7MlglPj4jdTdOb3tjCisybyopKXZleXBtISNGNWBTYGIrM0ohT2ExRE0/XlU7JmRrdHQ/amBiY2YzZ2lGbCgxTDlAeHppUSMxXnUyLW1lWEotVHFBN1d+JXV2K19RCis2ZjExKWpGSUcqQWJ6KXg/MVBCQ1Y0YjB7K0teVHhRVXQpSStpPktudG9lPGg3MnNZa1dTYyRhVmJXY0w5bFZUVU4/biRDSW90JUA8TDwrCittOClPT01iVz5SPz4hdm4mVUJPTXJhWlNYbFRYSHZQNXt0fXhWN0xTYVRCJGRnJExBdkplLUN9NHIrRUFTaTdGTSp+Km5xM1RTTEh0djx4CitZZ0N0dGhaWmREeThhKG96N2d0NH55MzIyck09Z05TWG9vTURZZkpfanN8K0FjT35jTFZxWGJGUTdDMDxLVFFXUjRBUmYzbD5jezZVUFlACitZVCQ5KVNFPCsyOTZuKWVpd3hhekQ1QzRQRlZqbXNPU35LajIkflg0aj04O0gzfWI9b3A5ZiYweS1icjR4I1JqSVJpJm1JPkFiSllqanEpCis1JmB1U0NjIVliRFZWR2cyMXVAPU1oQ31HcEIpNW42MXx3S3t0OU48S156UWpjZEd+SzVZUWtsbz88YHBheVJRO2wmdW0yOHUzQzJ4RVYzCitJcGR2VmlsdVR1LW9tPXlDWTdrUGBBUmlUQ1cjPDcpZ0dEUDMjc21wZkYtQD55Z1R9Z3dPYmtPKnRzTjZkY1YwQlhgamglRCkmZ2BfQHNOCitzcGtoI1ZSZHI0dH17aHBZWFU8MjFhQGlrQy0yUVpoSkx0VV5jKmlLY1M5cG03RSlSeDt0YUcxNVhXZiM7JVI5Q1BBSEJsXj81UGd1TGZrCitUYjs9flIlN2dxblBEWDlzSkZqWkxZdzhPRzZKREdOZ0RJUFY3UjAyZnlfI0hlX19JUCQ9VlB1QEhaQjBCLV48am4haXZVUXl2Snw7eStpCit4bU1XbytjYUM1VVUrN15DZERGJl91Knw5MiRzSl5RNHZ4WUNTZTdOYmUmZzl6ckBwNHUkQVU8Zjt2NFRsciFOelU/eVFKMjRnKSVjN1ZJCit2VVh3WThxITckVEUoP15sbWNIWVhwdXVvK2QtSEkkT3E2PCMpdjAmVHRSayZkVkVzZVExNGY4ZkklU2spclJzT21MKUJrPnZJRCUqKVpgCis8PmdCQSMxLVltWkw3VUpzdW93IUBhekZDJldQaEB8a2tvTDc3eEdnQjtzZzF7WmFOe3wxfEB2V2h0Zz5XdHhXMjErJWQ1M2xraGJnKl9mCiswLXZUbSRFKioheDdFWEM7dCEkU34hdl8yQWM9Vk1KPSlJZ21GRzM+emdEbV93bTE1KTUpRGlVfDxCQm81WEtTZm9JRnJtY3t0JH56MFM9CitgRylnekA3QWZVNFZlbmJOdnpOSCVXNVgzUHsrcklxZXgxU21qd3p+TTRlcEc2fWxMVVYxV2xfc3VOIUFPUlhWZSUyP1RAUkp0QmFqWDJhCitZez85VlRkfTNZZX5NaUUtUG9NVnJ0eXVCI25ZcjJRMVBpNChvKU0hXnF7elFSQEx1PDBPPHsxMj19MlYkbXZKNVBiOXU7ZSZ9RExAO3BVCisoTTlnTj9obTwxSTM4TGdgNkZkO2gqeGQ1bmtHWEJPcmx8RSFIbntoeEZwV0JLSlp+TStldDFHJFh9M01KMnJnfnIpUzBLR04xfDJoRjYoCisjT2R1ME5TfGxtcFlQelEmMm9JM2hCSEREVG5wR3E0UG9LY2o7TitWWWF9SDVDYWUpdjNmZH1CK0RlMTZ3dD0yX2JgJU9IQTZ0KDJWVUFtCitPLTNPT3dPIU1nVXZAblMmYWx6c0BlbjkyWXs5RUwpZXhJckVPUDFlcCFWaTBaa3JaWXZTd1hQVExFK29SPUhZJCVZWXw2WXJkNUNMbCpuCitNQmI5UEhuSU49Q1Q/MlNKTnVmTEcrZXgwdC1mKmFZN01oWW1ALWt3MztFaExveFRWaH01O15iVE80OEhXV0s3NjRXcnFyTUpjSD83bmxZCis+JDh5SWRGQXxyd3Z9QksxYT1kMzQkbnIhfTEoQkNrcXgjYmE4OWVkSUxraVVQSVRUcVF7bms2MSE3QFpMc2tUc017JlBiOTQpOW18Z3ckCis1KWhva0wlcz54MTJqTTZ5RDM0LW1rSEtRRDF6UFoxbmJpUVFfVXMwPXp2JXpOZD1zQjEzeT1JS1ohZHNTN3ZEUTBLdEswYnpLcWF5TWY9CitAViRWZHdQXlIhKTF1aVU4YFI3VW87MU4mYFdKRWJXLXJxekhhdThGVFo+M0l8Z3MofXBRY2hMMUQ0ckBxMEo1fmN6PWduenswJjlBJUcoCiszcE15OU1tLVdXVU50bD9ZQjxfPXRuUCRnK2hjKVg8R1E9Kkl7aSpIZkspazJEKnJlO0l0Q0h8JiQzWn4yUlROaG4pc1crWlZmTXJ0I1BfCis0RWFPRSFpdmdyaTxmMGNWR1Utdn1pZzZ4dDxJN3RJMXhwZ21FRShyU14wIXt4VlFNVDd2LVZRbVV1TGZvTnZ4WWJefUFMWCp9YDVqQkhVCiswfHVHNmY3Qm1feWNJd0xfVmFaNWs/SSU4VWNKR2tweloodDYoSjkkSDw3LWJKMGQxVytSSzgwYGAkelplK3EzP2woakxhY3lJeitFfD1NCitNZUkoKjh9UW9vRWtIMVdvZlBuODNiQCRzTCV4VGxzLS1FNUFXI3o3Rkd6TV5lbXc9PjRYRkUjYnEzNktJS2ErfFM5VUxOVF8oNSNyR1o9CitmdS1lcj9mbV5jQnc1PzlMRT5tNCMqdFUzTmslJjdyZERBcUpwNSF4bUJjfEc2S25rR1FWI0R5dig1SCtDZT9YaX0+bEFSemZYYDFuQzRoCit6bGo7MmlzRCZsQX1RTF44aWduRSR0anwpR04jSVd3UV9mfkBlYUxSTDBPc3A3I2V+X2YwZGlwNiM0RHViYTdNJnVIQ0VZfEowMW8pMVc8CitQN09iMjNmVFZsX1FuNTYmR1hhbD5yM1heNXNnTlJyS0E4TjN7aG45ezdoaThjfiFQKm9mSlZkVmlfJHs8WCFHUEU9ejNtSjU0dk59X09uCisxN05XRXxAV2gqYk9ZWipAQHQxUm8pV3dGSHRVT2x2WWd6SjJRfFowTzY2S2AjJGFyTipPc0lhP2ZyLTJCeVFJWCgqTzIrWiZ+ekZgSiErCis5MEMqQCl1KURHdGRPMXxVdEJzZyp5YU11KHpHZXExZlVyclNoLWIzaD8lejJedmhUO3tRRCRNMlZqZ3VJbHkhUVU+QClzTC01KSQ+YHxsCis2V15rWXk/UFEyOURLb2tfb1dQMGFDbDVSelBBS05idTIwSDk4UmwlJiZgIWV2SXVZWDVGYGY9OFgldF9UKkp6ZVpOb3I8YERKOSVGKXBiCitRbj5OcEBJd1E5dlNOZkgzPHVxMzVITCN9OHZBUyFpMHl8TXF0KUpHd0x7MkFfST99dHAlK0c9MnVabzlPRWpnVlM2KG44aEM2NXxJQjJSCit2bzVUYkd9bCowVF8/aXxxeHg7dC1UQXNWUitCOzFkQHhgO1prJCRpWXEqT2A/V1FhMz92SkYtcEBqZDRkbklYeV96Rm5ALVBRK1gjdyk7Cit8aiF0T3JsTk9FaGNjWVg9YkYyI1ZaWTd2bUJhS2ojbjczJXM3enY1bjNya0A/cGMwNVZPez4rMzk1S2dKcyNNdihzTCRiWUk4bT9PTHp5CisrQ2x1VmlEcGBtS0xsZW5ubWNWeColMzxSOD1ZWikwY1RVVGNnMVBeZ1ZaLWM5OEh3NFRhZWswbUN1OThDb2QyMjtWTSEyaCVfRHFZc0VSCiszQE9vPEMzc3Z3QEwwKXp+MzxVVkhxOyF7WXdEK1NnISs/OztkS1kySldPVW8kKmZpNmxKfWE5QnFYS18lKGFIK1E3dkxnU0JqbUt4ITJACis+O1J0JFZDTihoYFU0YHMyXkhEX3w5XyowND5xLSMkWWw0c3luMTE2P3llXm1qPUt1RkcpSWJKaWg2dF9vNkNNMDNndHEyaFpKaiQ/JS1BCit5KCQ0JD1uR3BpV2BzRGx5aHE7UnxLdjFhTChkXnM/dzRIS08yUEg3aGckRSstOFdfOUk5VGZTdn5MSkhWZn1FKlJMSVBaUTxSaGFxVXVKCitucjJQRHQlbmU4K2k0PVhkQUI0RDRobGpeTTtQMTlGc0shbnNockt5RnZ8S0NJLX4qMntWeUI7M1BvTGZXcno8IVhOOzQwQnIkR2Fzd2xCCiskXmppelhAWiV0UkthM1UkOUxQP1c1YCQwQnRKfHNOJkBoTGdaTSNFSlNuel9FfUtNOV5KUko8TyNuaHxTKXJXPjFVc09QTFpsVUI5SF99CisyaXhhb313RGAzfkFUSTA2VzRIWmJpOSFmSDdAQD07M0QzQEVTcFNuOXBgQnh+dWBwMlJJfnFXdU0hP19wbD4jdkFMLTQxeDBJeGdjODFZCisrYEZ9KFkqbGRWUTM+PDhmbXJhcjEmKk5uOz48VXIjUDFpS3BQKH4/THFMbyNxNTMwMClsNGR+WC1RKiMhYHZ3WUdsdnwlV1EzTXxSY0BBCitqRz8+e2wkdVpgcFpEdFR0PjFHYyFfMCRlekchaFV7Zyk2fEVsYU9uR2U4NFd2djFyJXArd0x0VHtnS2BaekdNSlZRWDMwenN8c2NZamlKCitrWnZBQzBJN2FIbkxSIWh+SGhOP2klYzlgTHtmOUUkJChNQmIhT0w1VkM3dmhZYlFVM15CQk5zWih+XjBNSklSb2EhOTc1Wk9sUyokRmFQCis9RklqSmg/Xn12YVliSitBMEMzdlZgSCRiREwjVFozMC0jZVF8IVh5Jj88cnN4aGI1bVRQPEtWUj58MWl1fWspTVdlRnI3a28hYGBGdGhXCitOcy1rd0s9RGAhMmdheW80bHs9PEdxQ1lMTFVFLTI5JC1iZ1pDfSUpQnBuZ0gtTnxBd1djWmdVanNTVVFZTHRKO1QoYEc/UWA/MmFjM1NGCitDWUMtTHhyeTBVZkoyI1ZYTzcwSFU9RFAxdUl0UjkjWT9aNV9RKD1RbnU1VChQVWQ8eFJqRXJ0ISpqZUtxaDEqMH0pQkc0MjteXlZ5JHlKCitpcWdVNjR6NDZ+S29BNkZXdGU4Sz11MTBgI2JIcjw2UCFONDZ9OHJ7ViF0MlY9SytmJkYkfTUwWT1sWlFHRFI1ej9ta0Z4NHZIKEEzTjJuCitTNCQ8O31pX0FNfFB+NSM7OVYweHxBeTg7QWIkZTY7UmJhZldEOSRHP3FBYyVwZSNJYyVobn0kUVMoOXQmT2JjTmlqb31uYCUzMjVSKCN4Cit4LXU8UFIqZjJXOTFGPDw1X2hSRnFYclo/eWMwcnpoV2FpTVJDVH57LXxjNmFsckR2MVk0fW50Zz5QM2JPfW5lS05IKkc9cXVEQTJ3V1dtCisje0ReXilPMGVMR3ZuI1dLLVd6MjUhaVNwM3ZSWEZOQnQ/YVhiJDVWI3FaUWsxX3pAZ0JFNmB9MmI/QyVJPy11czI+MG5mbnkyS3UrSE5ZCitiPj9kTEFYUGpIWjh3aDRAM3NQQ1gyN35QSkgjaGsmS29DNDx1T1Umbj5fRDxAanczJm9aWlRjbTYtRCMqRG1VKHUwWlN9S241XikzcjVQCittekM3fCk4Pk4oI3o5ckNRWXtoe0w7LWhrPjhIQ0ZnZGZOUVEwOHl1LUBJdl9sJiVxKlhDcDYlVWtqZWFoI20tdmYqLXJqSEU+KERxNWRQCishdko4VnE9JXY8I04kbj1xZXdGZyMmWT4+aEUtNFFjcU5EKWErVkEqI05Re3V7RE40c0ByK1FrOUhlYVRAZSZYT0dvNysjdUdBMEtiSHRtCis7NmlNSTNiVV9nJm5SUyRpOGQ0fjgjR1F3cTxJVVFpNnI4QktDR0J9NT1hd31aYGM5X2ZOVDstUD9IOytVJmYteDxUY2ZZUyhtUHxmYFBhCitUN00qcXVFWWlfTERVTGpDJjBXXm5tP2VOdmNUdVckKiNrS1FKK3diKUYqR1hIMDdIKEA5TCFYZ0F8SThzX1A2WHc1bmU3O2phbjhGZCtpCiskYG5iS183Pks4VntNcj4xY2spandaS3wpV2dKZTd1bEpyTXBoeUxVRDs8ZWVAeFE3NWk8K1dXSmtmMmIxPmFablZ7WjQwWStuMUkwV1FXCis9V3ZRJkF5fG5xKGthd3FfYl9mWSZsfitxSUhQdXFoPHNWWDFsQTx5V3RYRX5NVFpfOWZOLThsUjlqRypeV2pmOzxORnFKWWpeWUtsPmxHCitjYHNzNmBAPVdvVFR2dlolUHhROWpvS1JUSSt4RUhXKkpKeykjVGByS293KCYhI095biZebSFKSnI9ams3OSNWWGx9fGJ5fkhGR2FiMCRBCitDMkRrb0JfPl82QVJxPVBNPEVFUUg0WmchRGtMe1dQP1IjZUVWcGMmPjxOYXc1VCtkc3Zkd0NYRTtoKjIhM3p8ZjVDZmFsSkgzO3hpMzEzCittSypGWD8hb2hZKzgrPlN4eHghezhlO2U+R29VO0tgTHE8QEs1MURYRDd8MyRUNG9JWU5OanFPXk1RQ1ZVSG9BQXw0YmU4KW4wY1JTNTx8Cis4Mmd+TmdVc0VGZFN3fG1zalJNMiFRYkRSRjZMZCFSQlMqcW5BU0V0Y0hQaHFSPUVnNVp1ODgmREQyXzVwUjRHYTchd3dYNTdNNDxwR05eCis/cSREbGphJCV5NFc5eEg2PGVVMTVZUTdFUmAxWVRBUERxfHI7T2t7dUB3PHc5KkBINXhDNkVoOzdNSzxPcHRHSWBwVFg1fldKdCpQNmx6CitaeiVPYUE9WH1QUkpqZmMpTG1VZ3ZCcS0xP3VzUnskKSZDblhGM01nUzE8M2dYVVR4bHZibDJNISNWNT5vSGdvXz1lN0NTbGckNExqcW4wCitZcHtjM0RDV2doOzJDZTUzTXZaK2QqUjUmOF9rJSQraVVSQXZXQ29MJHFPZ35zYlYmVyhvSjheWClfd285IXNpJW5GYGFJRzhGcH1xelIwCis7OTE4O19BeU1Vck1HWi1DbGQmQEAwVzB5RHMjQ095P2kmRiF0fn4pbSg2Ykk3MEZrS3JIclp0UXk8MW1pIy09dyhCfWc5ZVZVdGxFaWgoCit3fCktckAkKiNtaDtzSDBsblVJelhfN09HYEhHfU5VZjJxTSQ4SWFLTzhOMXpHanl6ZiQ2XjVpJiMrOTIwTCh9bjhwSFhSe1RZfURoNG9kCisoU1l7PTlYfEQrTFN0RGdYP3lTblZtZGdVZEVzYjg/bkEwMUl3KWMrfTZiaVNYR35pZyhUaERCek9xQGM0byliKXsmXktqPm1ReyN7emFNCit1TGNwdk8tOzF3fk5LKnB7blgyejx6bkswazFZflY+PXkhYi1OVnlOJWZANFIoYzRBRlYjZyRMQ1JhRzcpaDtfcSlaKTNGdi19TEA9eiV1CitUWGloOUc3R0FWalhxM2claTVgO2tjbGVGd2I8SH54Pj5PVHI4bj9acmBzS3tQaEZNVVlGMzYhMnw2UmdpIzZlNFdscTw2dys2QWRPOThICitsc0Z7I1pmUCN1Y3ZGR1oqazx0I2k3Q1d2TTwlVEJGOXIrM0doZiYhOyZBMDliK3MoVnxWbmhHbnZZamIreFh1N3ZZfWN3P2gtLVozI1czCitsdiNuSj5mUnNCc1JoS0MmcF9yJXQyUEZiMikoO058N299NWV3KWZPbihuXz47aHdFLSRAcnpzTmR0NUdWYSM0SXN3Z1E7I2RaNE51eipyCitBWEBLMzU3YmtXKF8tayV9KmsmfUBRN2F2SkpAMCZHK1R5OV51VmZRY1VwJFdPXn5NeCEoJFpTfHslKGE+MEhpM2JfUzZTRTFLamtMRTJkCitEPC07UlAoQUFRfSFucjJufllYVzshSD5qKVpWcT9HPExuKmB8Nys5cVJQX2c9N0l9ZC1kTF9oITIrQ21JWmtMZXk1KiQwVT0/N0hzQEdOCitzNzBhcHkkJDkwRDdBO0czIS1pI3ZvfSlITW14M0h2NGs5b1h9ZUNIOUk7akVtaD5efnRGQkVrcUMmK0NPbnlUSHVyYjB4dnZSRVNKUF5jCit8VlFRVCkpcG0leE5mMEVuWml7TVI+QFhDcig9dTQ3VDlMIUhEfWklMklzPWhCV1RWQ0tvcWclSXRQe3pPO002QWlMWnF+Kk9eRjJgU1ZOCitEcjVhS1lBY0NMbVFIYj1mTnwwJExlZTAkenYqP3s7XmgzfTxucGxaZUIrdDRkJD9CRzJeV3d0YTNBTVQqUypwPHRCPXQ0YUsjV2dOZTw/CitUYCRjcz5iNFZ+ZGpEVjhLTFZzIX5JNnl2R3pxYSNrZCE2ND4pWEE+JlckQCg/Vk1VSTVoXz9UPzxUe2Bjc0dhd3c5VTtQMjM5Yk9fYXV3CitqPkdze0U7NTxZN34jTFdGczs8a15wP15JdzJ3ZWtAJUMmMmI1U1MoNTQyWGJoLXxPTXtvKiFTQTAwY05rSE5hN2AwdlUlKWBUUmwwSiR+CitKPFk8RzkxX1V7NXRTWjhlVS0kSXUkNmUmN3J3SWMjRkFJQG0/NSEtWVR5dmNZO2V9eWdNKF40UX1EOHk5c28+NSV1OWJMRm9HRGVEVVg+CitwTTdvOEczR3lET1FXazVpTTBiWndKQ3gpcz9tITRrYC03cSFRV3FRbVp5Rnw4TFd1XyViakwwYUpSfXNiRyFocEMpclJoSjwxcG1kKXNWCiteNnN1LXRiKWg8PDxAPSEhZChuTUczPEthNiMqT2owJW92bGxJJFlVPWxFMjxQdzZrSWJwU1BWKSotNnxuZXlJYlV0US1+RXh7T0hYTHNQCiszK1J5TWA3OD0kS01tT3FFZSl2em9NVXUhSVR2eFB1KG95N0I3Tj47LT9NUU4+SjN7NzZqQFl8UjEmb28lUDlhY2ZRY0hNM0tXWT5ITEVKCis3REZHUGBmTUxeVkNhVVFVY2J7MF9uMW1OfUZMOVItIyFOaT5yVng+dSFvSVQjR2EpYT0lMTA+RT9OQVV8UTx8PkZyYHNhMSlnX1h2ZG5lCitBfGZLVDZkSEU4VmIwQ2crPipGc01HOXBjQSF4WHJOPUEzaipqYjJyenkoPFgqNExxa0hpKzN4VD89cm8/K1I8Um95Jj1PMCEleD5pa2oqCishVjlhc18oVFhSej5gPiNRKChPfHdwR35ufWp3JmhBVi1GSWBhKkNlWitkWVR+WFFgVDZsXnp8Uk1obUlRRT9XI3dRS3Q9dTZ8QnVFR0V5Citwekt4QnR7WTR+KE5HPXgrP0pWdUNpdH1SOFcwLU0jM1hFODgtTmRUdHx0eytJc2Z9KHRyVVRPPFQ4XkRjIWE0VjgmdjNvPzM2TlN0fE1VCitjcVhfTkhhenghUFVVZGYzeV8yYGQ5NW9EZDk3JmxaTk5gPXpRPCMyfFpacUlYZ2ZEYXpWTnpqQ200I3FDNn51QVZ9fGQ8VSNaMUJjeEB3CitmTHFNKDk8ODZ5Z1lhfUpxWlAlXiV5a1N2NGVjSlR1T0cyNl9XU1dhOGhCaiFaa3Vlb1Yycj1LNUteNj8hcHBlK0M4fGtsJCplZUx3VTl5CitNTz9GQzM4OGNCeUdhVW9kYTlQOWpffVpfQzBDYn11P0dxR3YtT19SI3teSU5JdHBxIW4lZUZwRXt7VFo5N0E9ME1nYTlqMWNJZCtFS3R3CitZTGtEPS1sSnN6a3R2fFNyWmRjTHNkOGF9JGs0WVpOUWl1P09HYSlOUE57VGF2ZXglRz15YVBSbzxEVWpITHExUnRvTEFeO2ZlMXdfeWZSCitkNzAkSSVAKD9lWGdXc0laYllTPEdRRV41NjkrYyVlKTVIJC1RLWxQdU1xKXZCdTQ0LThtKkpFPFpsJk01dWopejRLRXk/enRna2l3O1E+Cis1Kz5TP1RWWGNeUGlQd3M9OVV7VVA/P2w8NlU0ayUwQyVucSljWGktejJ9a2Q+TXhnJj5EZ1Y5SF8pX0VMfTV0V1hLZWNGcmw5a3NIVVpRCitxMHA9c3R2R1ExdFZ4eElrTEApOUUhTzs8MFdySEs4THMyKk81QzVVRDZAQEhhK203RTsya1gwdD5kPFgtejAxJDRDZUB2M1QtKHdaVG5JCis1KHdCaWhpNyhgQnkwZGdQKE1BaXc/TWxtMVZ+YnhtZkRDNXl7V0ZYYnVGNz4kKjduSFB7TENPQ2VlPnxiWG1oREc8byg8ZyNndVB2KFhMCis0PnVtSn5saSE7dmdfSWZmV0RNVl8hITtRLWdeNyZOPEhuJG53RX12SVJ9UCQ+dXdLXzNrY1JBPlBsKzAhWjdMX0M5RiFXNzNCTm9RPFBqCis2SHVpZilgRDRie3puUSN5VUNfNGJhPGx2dGpCQzhwOT0taDNtJExifjYwQXQocSNFQzJkUjtwcWcoTXNkTWBsaHN6WDZVZSVebXNPPXlMCitsP301PHFRdTBTVjhHN31Pb3VFPFk2ZSQkYkhPaGgqd2ghNzxoUzhHbVdQcGsjbT5aZ1pYZ1d4cVhZelorJHQ9b1lXI1NxSCtHIVhpI1pHCis+RCtLbnl1YiZ1PXBNX3A9V1B4PylqSnxWY31mP2xGS05pKF5FJkRMZ0d0NzdrelFWZlV5Tlk0ejtVSHVYJkorUDxSPnVrIy1GMEFiS0YrCitOWGFlND1qRj9XPSohYnl3JkpBYCliIUQjdz16NkRUcWZfUlAqZnB7JWItcGlSNHpwPiErQlpEdXdFZWZPfDxSbFc4MFJWNG43XiteWjx2CiskZ3d3WkhtMEtlTDtlUT5PUE5le3dMXyg5TEchVXdMJT8wXy1fOG08JEpFRjB+Yy1CdjwrJVEhLVkza3xWbCoqVUlTRFNTXy0qVmFOMFAoCitNVzJSUCNwKDMtR1M/dHk0bl47MEBAdy07KnJoVD9JbytTdkgrPV9UNXs5Iz04NHRtYFZ8cmEpMDFqSXFldiYwe0pPPTx2e0xualFeSCYoCit1PFV3YmhoUnJEOzF5Nl52YjIyIXVvRnVQNDdqd1l3ZSo+UXU2PXJnQUVlUU89M2Y3PHp4QkcxK1dNK2tGWW9kSmR0S2ZFRW03alAhKX5JCitfemJgMG15QUhBUWE2NVFxKUN5T3haI1hzbTw2R2xfKHxYTWopelchWVpYeFlvMCtoOX15XkZmSH5HZ3lkc3smJTM8blRKPDRPVjFUPHslCitYYUhZUzgoaSk1TTJLdGNicj5GQkBZYXE/PU9SQkhEb1UrcWFjRkJqJVI+KlVWVVpNJWdUJUYmZUpNTzYqVT9ZTCYjfFY+bjdvPX07ZlpuCitMbTZNdzRgPmxnWHh9b35xMH5WZmZtMFc0YE1GP0w+TnYtKEFOfTUqTSk7djVzbTEoZzg9ciVtSEpad1VWOEhMdztGX0FhYyE3PVRYKGh8Cis1PmFFXyEtP18/dG1aQTc9dDJJbDJ5MUckemlLc1daMGpYZz13P0tlYDAwKGA5JkBNO2RjQFIoKnJqRFY7NlpwI0p4SFRWX2xyU05LI2NNCitNQnZgfmhxVSQxc3tJSiNVO0tKOHhaKSFPSEI0aCooM355bXROJV4tcSRnUDE0R2ZMbW43c2FNRUxeZzZRMk5pZEtzIyRjM0pnNkRwTH4yCit+fCQmNTthdUgxMmExKnhtYD45S3MoI0pXI0kxTUdeaGU+WHJZO35DIzdue0owMXZXUkYmZz4zP3FPJDNGNl5XSlBkJmx2czx9PXZTTUJHCitWMl9Pbk5QOUthWUhrbkdNemxgalNaN3IhNnhCY0I8aHd1ezdoUkloJWcqRDlDdzdwJUxxcjltTyRqZnJWTG9QRkBGOUc2PWVUc1k4UU5WCisjJnYkZCROPTx1SEl3VDNjeTBePzBWTlE1eiVUdC1CSCtoYG01bD9fd0RxLVREe2p3Y3N3Xz16QVI2dXlgMVh+WHN1JkhMKkQ3Rl8qUEJVCitpUm1FJWNEVipJWTRMK1ctWiVzZCpqNHgtOHgodkd9anNhUihAajsyNmJmfTBjOERoMDlnelYyLUQ1KVhGU1RVeF5ONHxMNT1tOXo+VzNBCitHXzV6bUUzUD1UUXI5bUg9VGMlfkhLQHFLPXk2eD05O201fF5oPGpfcmYoXl4zUmZYdTtuO2AxRyYkUGR+bDs/JX5afXdyfW9WS21MdDc8Cit7cjVlWkZfazA/KjhlWCtyPUtBeFJ+dyFyVDFuMUBaLX1EazhrZzlOaHFKN14wNUZFbndaT2BuTUk4ISZ4VnJNZ0RYfX02ZD8lSCVITzg3CitEWFRvflZXViM0ZnJqTElIfH47OVN7WH07aEhpVjI3UDIhTz1QQ0QycjBgUCk0Ti0xQHNTXn5GP0JefDZpJURwano/a3MjNGUyQVA/R2gkCis1Q35CdEVEaDR4MV9LQituZHtJS1RDUzFZbjkhPWteeT57alUycFFgPSR5a0ZiP0J3fVE+Zm1SLTs5S2FeU0pJeTdPT3hVLU5QbzlyPVl2CitFdGBgUmMhJSlYV1BPcDUkS254NEQmQnJ0RDtmLUBCQVBPZWdAITJ+SEtYd3V4MCoyNSVjMSZKe0BKZHlPP2w0UEckdll9cDw4WWp7NEM1Cis2WGV0VT1RK1hiS0VBQzF+PkFRdHFEPW9FKzFiYDF+WFpyckpWaWtBU0k0QE5Ce29XLU9nM14xeT5CbXhaTEstb2M9XnBuVz19UHtfanh1CithekZEZy1aKU1KWWkxKSQ7NXloMip7PkBLbj05UkduOFNgK0okYnIxI21oei14amJCMzltSVZoYXAzTl5XLWBRI31mYj9wYCNPTl5Sej5aCis2JWxFdHgwM2BkcSlCJmhmK0d8Qm5XI31HTTtlMFE3Tyh+eD5lVl4yMCZvYVcoX3tATjVqbU9zKDFDKmpWM0s8I1U0YVJ9Mz9UTC1ZUSVJCit0d0pISD1reEJxS3QybjhkQ3opY3ZKcTc/ZCkwNTx8Mm0hTkBtdTc+fmlrQEFQMFZkM1BRMSh1Ky09dVVJSG91UyFDdllUSDEqeitVbERTCitQblo2ZEVyMVl4MGk0MitUI15hQm5uVXxJdzJKWnpZZGNvVzQ7Sy1NSnNybH1JaTB4dndQMH48SCNkIXxSYnlfMVhmUSohbj55OGV4MCs1Cit2Pz5uKDFtQEVaP2NYUXttOSUyIXEqb0VRVyhoKyY9PGM5S15NNz0rS2pxaj0/cWIzNDgpM0ZWajtZVTFKMFhRKWlfVzd5TU1mQTVCPW9OCituYXtHMjIwZVFLKDBMMzZNfFBVRlV8dVkod28kUEw0Jjk0YTRLfjVKKjw3UiU7eCs2dykwK2E8ZDxNcy1tZnRIeTV5ZllBJDk+c2swcnVwCishfnRzP3R8MWxucGEyXlhgKUxvRDVfalNfJHFvKkNyaWchJTB6MlJla31nYnducjtjXiYwVGNJbCtsZF9sWnc+TW0+eT9fbDFAazl0eDBoCitleHkmOTxObkhVPk4jUTFPWGhKVX5oJjl1JXd+Z0NmX0Z5YWdJJFdFJG1odklaRGVMYCY5NUA5SjB8WH4jbEcxZ1crYkRoflg8P2NYU2xwCishV09tdik2aldKfHFUPFopUGdKSEtvMGl6NTNqbWNEYjtlfXkzSiR5XlRhN3xTJm8rRGZGb1NueHBnVzdybVRQSmhNdXBiVXcyI1N1dC16CitSU3pERFEmfmB5X3YtZS1OYi0jMnA7dlBTY0pUMF4waGFKM0JkdG0/I3UwSUItNFE7Z0xBej9ISzVfQ0l3aW94WF8kISN8fXdtcDdPa21ZCitjMj9qPGRTbXQkSkE8dHojTmxIJUVxTTRsYjFseno3K3EyIzA/TiQocktKZikpU21QTDhGT09CdntoaEIja0U0SikwQGhzeypHUGZoPG1nCis/XzZ0dEA/akRsSG4lJTVeYS13JUxDVTZiMHpIIyVZUWoldG1eYWhqNX01PnZGbTUpP1NebXJgOT9ZQTNObHdvYUhhN3VKbmReYUk0fGJICitwODl8QWQzUlk+UiZ5e0JgNkJqOVMjWDl6X1l2TilfLVJmfTQxaz5TfmRpb3olKkt6MUFhWnE9bikqWTkzZDZ9QlojLXtZLT4xNzVhUk92CitpQUkjcVFlUD43V2B1fUVDJXZOejNzcWtXITZSRXEwNzF5ekVWYTtyJl9vdUs1VD55dDwoM2ZyOGhgZ3ltQjU/VXFNYERvdG12MVpHVnc0CitMVWMqdkYlOGxoNDZCPX5vWHN0WkJ2O1JZQTRRVCMqdFYjbHhuN3xINGppYXVKemVpRHI3bG4kelN9ISFOdDYpaSNBNmdqKHZMMl9LZkVpCitOS04qdFVveylpTz8hcGlAQ2hCeCM8e2tIejw7JTVjcDFuVzVKRmw5cUJ3QSYyRW5xaWBSUD8xOUclVTtYRylOQj92UXpETXNIIyRVZSohCitSMTFUeVZ0QlpaWUBBJGdsUEkycDVfJTR1T0s9SjEzTGBlcHFUZkN0KEcjaytNKDdzfHA4I3gxcnZrfUohcDQzUkk2NXhwJGxCeE5MMVFTCis8QEoob2Y+RSlhQjJyNCpXNlZ6VWJGbEhrND9xV14hakZWekZmZiVWZnMkNCVeQnJkfipLfSEmOHlsKSN+SHRJOSFYTktfbDUtTm1LIU4yCispdGhfVkQ+T3N+SzJZS1dDPTJuaWV4UEg1fjJtdldtejs+KmlMXyZ5aHNqJFlFKzN0RiQhRSp1cVVHKjR9PzBZbTRkRzd5QGRZdT19ODJ1Cit3Ull2Q24pP3BEXzQ/JXQkIzcmenFffTVUXiNZRX09cHVPX2JTdTYkYitpKWZ5KDcpTEFjRCNOSnpSdCM+bnZaZiF2YjRJRk47ZF9nR2VlCitrWm0reWYyM1YyY0J9OF4rS3opM3hHe2BlPlBkVU14eXVLMmFoNCNKNWpKLWRMMzZYVFE5cTlyVHtsUWVJcF5yVFROcyUqLV53M2dHVUVFCitSPkZ6cDtlbFFVN3lSPWcmdyNfSUpJblBoPEFqaXMleCstVGxEUD07NU9DNitLPVUwKz0zIXBLcmlQV1BnZEhjPUNZclIwSFk2bklsMCtiCitzb1A8ZDN4UzFrMyZ9eShpM0hfTzlUb1lPKWs+KHt0JHdiUFpiZnQ2TWw5T2hlUEdCQV5SYnFrdzk1MEBfNDJuRXx4N1pAKytONHFJWEtOCitIVEUoa3U7eUZYJEBOK3R5PzU4Tnp3IX1pa1o9ejZ9SjxpYDVZeS1OXlpPcnk8Wlhrej14JVcyS2k0YVh+M3lXaEd4OX0lOFZKcS0we2FFCit+RX4jP0ZtKCZ7YXZ9SHpjcClGaW5We1ZEMkh4Zn0/WGBRTHVYUW5FaGRfNWEkX2g2Pnx+PVh7I3FxbGJBbHhiX2JDcWZzYFNBaTJnSXZZCitMcVpVekQ9WWs2RndtVHJiJk40cnBWIVBGSWkyX0tjdX14PFNAQ0w9KXFpXmU7QTBwNV42UHd3K1RvTFh0Ym0+T1FRZGpnVzBfYFFMKlVvCit7Kj1TJDIxWWZ2NHI0aSkkYGlAbk9ebHNENzZocHhIRjMxe1ZRbylDRGJaPktke00yVD14Y2FBbm9XMiYtOHRmNkpQVEJ0MWROPTVOJkZWCitURjshckI/IShpWFh0PTV4Ql5xJHtjQEZDdj9NdTtLdSFVWVROWUZhVyE5OyYzbml3N3B2TzdPKXtqZ0ROTilrZSsjJjVJUkU2cTVya2tZCitoLXk8bCh3OVN8cz0hYjhPcEJCbiFoSzhiYE9KdUk1Z3Y7cGFzaEBXVEV6NzkzbmpGbEN6SztFVGBObkJRfmNLSHlQQkBFcU1nQHxCQGdmCitXQypea2MqSCZLd2lTb3JpenhVVTNXdFg2K0hGUFktbn5JKW97bllTR0Ukd18oNFJQV2QyN0MyVVpGJkN7azY3bzwpfm5iZlAlVkB7N01sCitQcSZzeip0eGojbkRwS0U9eVAoYzxaREJsbEEwaCk0KXVLQ1VQWXBjWEVaQF5vfSVtPnMrQExZQ0NJSkRJUzQqPjlPUzE/aGh5R2o8TzNZCitRKDtRZSFJNkwodU8xJHNxKVl8aEI4UWw7K1A2ZjM4SGYwYXQ+PCkxUW9UPGtpZlFkbGB6K3xHT3F2TTs+U1o/VDBaO1heXmkmSDBAbGE7CitOS3Z0M3AzbVJ7WDt2ZmNqaFc8dCg7enw8fF8xfDNONkcwdWVJK1RjWi0/RllRQH5yajZoZlU/dzVxJGs1PHM9MUpuJHA8aSt9I2gkKU80CitiVmVKKFF4Jjt2VzE8aDlIdD1xOD9jbWpaNVp0ciFNPXZ6e2ZhdH0yR3kme3BgTzVNayk5clUlUnRZMzhKNUcrQ3Z2THFnI208aDVqJVc3Cis7SU9uNHFCfllMK2wwci1Xa0JiantGQVBrY0wxNTF2QmF5d3tKSTNgakBeX3xwSWQ+ODh8VE5XWlAqc1pvaUB5ZyFQSHAyejAzeXZiN29LCitycnVrdTxydUZNa1gwXyR1Z3dfcjA3VTxBQDBfOD9DT2RmLWNKUXtTa0o8TT82SVcoMVU2QTlPdWF7ZGpeb0VOTWh1anFvWVNEbW5Ucll6CisoaG9vWT1+cm87NUtIO0QhK1BJa19jNEFRIUlVa2QxM0lTSF5LZHc3Tm12ZH5OfjBeZlIxKlAzPjw4aUJpM0RxVThxd3AyN0xWZll6T0xgCisyUFlBayQ+bUxlNChyfEFhPk1NREF5MyklZjx6cGJwaD5ZZVVmTVktZzIye2xhUzBwR2Z5LUNgZWQ4Wmp2KUhDR1JFcngqfEdgMHNWPXQyCitBbGFLP211JiRKWnhzc21zRWBsRT48an0oZXsoV2FhLVhLNXlFWTxOIXMxOzdhN2lFMzEhciZvPU5meDh+ZFRmRXJAMnBrWnFXcnhOZ0RICit+ZyFtaTY0RSUzK291cSRSY0ZeYXdTb3pvYmh0Y1IzVCRfTXpVfCtqSm4pRjNVRz5wJS1ScVgtaih8T2FtdFM3RUVMfTQ2U0hHPzUzaUZHCispfCZrJjx1Z1pAT1RuWSpOYT88NU1KXnU7X3JnTCg4KztLZlkpT2tALT5CZDF7N3pLUmklPWVve3tnQ05sTTgqIyZvRXcySzJabyNLVExACitsQTJBaW4jNEg4WipySStPcCRhJklsamYyRyV4P1IoODMmS3VZb216d3E/VGRPYlpqfXBQKX5lXnV+Z043dD44fFlxX1pDVlI+UjJqO0VLCitsODJDeFFXRlI9MnhtKHRJTDZ3bHpYWCZoI21NbnR8RHJmZDhOI1E5ZS1sWVFEQn5tPD4tJFp+fEVxLU1NTSlmfFNQfHtFK1o3d3NXQVJWCit9Vjt9P1NQck5qPSNCe35BcDN7PCRgckghWC0oQllrTyN1elpseH4yX2lLcE1yfTZCPyU7RDZ9R3xPZ1MwP2VfRGk0ej54UTZzem1fQWFrCithdXNkMCN4eVQkaUVfa0shcXFMd149ajBZUmY4NH5idFExVnd1QylJaFY2aH5wLU8hZ1JKQ2F+NitHdWk0b31xU0d9Ymt4N2pLaylXJUNrCitlMWQjI0wtd0whbHRWfjs8QlNiQVBXUW4keClafGw5dG5oLXZxJDRufkh7WkxoSXpeb2hQPk8hYGNFdjtLTWVrI2Y8VytRIyEtaTkpPGAjCitYKz48JCN9ZlVBYEh3RHZtcCp3YHV9UGR3elhgQkpOUHJGdmBhSUpzTHs0RmJXajRDPWtlbz1iJG1yVE1lRy1mWD00eUgoWlo1PjNGPUIhCitVeD8kcWRFMU00S0Y9TlY8VytCe0BGZVltczNPPj1aMjk/Zzc5PEUqWjZSNit+KlNpRzxqV3IyKztMaWV5PTRDK3Fia0Y/dDNNU007bCkkCis/IWNoWW5KOXZRUipAX01XO1h3IVROTkYrZ3V4ZEthUmJmeSVMXj00OVZZa0F0OXV2KFBtd3RoTkhYODFDVTdibXgtIUleU3U7d319anNxCis1SH1OaGZ+TkRObVNeTnkoVnBpeEopMU5kMyh0TGBGSjtsaGw7Wl4zIXZ7R0pCbDB0WC1CYUwpNVlPJHwpQE9SM1UqekgpYWo3Xk5GNW5hCisqakc8eSNOQ1IydTAhP0RjI3AobVlVKHJKRnxUXk9GWm80OzFISj4qeHpgPV4xMVU8KllJan1hfGpYQ0hrfFJALUlMZ1lxbHdgWWd6RHNxCisheTlZN3c1bHRgXno1QHk1YnlFMEF2Tl4tVWxLc2x2SjFGLTVlaDQ/RkdeRiYpUDswJENGY1NBIX12ak5TZ1MmUiZUays3cTZQbGxMX09YCit9Yj1jcV9HTT5oSzk1dXZkelIlcXZ5ZmxBSDNKeSkzTmQ2OWhaPl4hVSlKZT1ZbHUoMTdDSzFZIURLaUhCOFp0UGlaNCNBTCgwJCU+Pn18CisjOz19QCFqc2BRcXR2eFZ9THJ9eno2ZkdeN2cmXlZnQWt5a3NFYzl2QUtWdiFSQ2VORWRmJFdXM0JGVEFPTVMwK2gpM09KMXJzSUpxaWsjCit7bz1iTDlBM3MrWGooSG03SGQmLUh0UFI0OTlTMF9jU2grUCZiQTt0dGhBPyQmaUFCbnZsZVV9fEZ8aF9uWHJEemArNzVYOUVXKmBAKXk0Cit8dXZjPDtndzU9UGomb1l3STM5NyZSS3ROZlJuQHkjekVRXn11YiZEKUBVYD0kdDM0TFY2N3s7PTZJSWA7cUp4NSh2REZscFBIRGIlMilgCityQWU4QXpMRnpAIShVXjgmckZWT1B4QGtjZDc3KWE2JmZEYyMjKWJWaWBSfUA9KDdFRDhzUndnbXRvIXZlPCtpdm9pTDxKXmc+Vn14bE9yCis5aU1oaitOJTBfb1A4a2U3UHBEI0NQeDZsUEd4Yk5hSVFUUGNxLSNaWjlYbXRjR2swNXRuMXNDczBrZ3BlJEUtOWVWUWtuMnBHPTg8O21WCis8JT5sKnhWKzZlfTBRVig9WEFsVlpKPWdEWnw0cGpnZis8bC1mMTw9RTRoZEt3cl93RnxselB1QX1GflVCOVRGPzRlWX1TYzMtUTs3e0ZJCitCUkZzcmdVdHorYWJTc0IpTWRYKHdsNEhtNFNlaVBIKDVeZUp3R3dIWVdLMTNvbHtNck81VFlWQlNIPEdwTnpKJjdpMzdjcl41R1c7OWpICis1bjB4amo+M2Y4THp5UykxQ2BhIzVNLUM+KTRJRl8jYSpVNyFubFNkaT15UUY1WFBteVZseV4/fF9YPG5BIVhpUip0WXU0YEJgfHkzPUE/CitjY2lQdUdKRXkpWU8kZGFPY09ze3BeKHt+I3R1UVg0TFBzR0FqKjJaNEhWO35JKklUV0p5VlEqMVVNYGh3VGQ+d1otR2VaVm1kNXh4QFdrCisqQVAmY1lCVEV8SGFvVmdoJnw0Kmd2RiVBKjNNYmY8WDxtVDU4YGhockBEWFpaSDwwbmJEYlV1QmgoST11V1Vqe1k5dExDayF5QUs3U0lKCisqaVZwal9lKTBMQXg/JmNKbDFRWkgkJUcrP2AoUj1adWl6TjQ5T0k8LWtYbH53ZSRSNlB6RnY0azklVEB8YWp7Izdia1h2KTg8KUV5Vzx7CitYUFozT2hkUlVNUUdqZFo5dTIraWo+OCF4ZCg1cj8wWC1fSjhyMiEpM1N9RTg3VFk0fVRYS1hGe2prNnVlTnZXUT1CIWp2Ym9iU0sqQCNQCismeHMxQ1JGajFTeTthayRjcH4oYGN8eGN1P20hby1tRk9GSmdMZjNiYSZZbzM0Y0Ezdi1PfHtqfWM3cj9VI2ZrbXZEdmhUKlU0UGtfK1VfCisyQFYqJHtTLXdLbkFnSVFZYDw3fStCbXFwI0xyS181KVlHYCRgIzVBeW4wWnklQHQzP2cxYWYlQClKKyp6UktvLUJUdEU1UnN7JUxvM2dHCisjISVvWik2anJwUHZ5MUw1JUJkKilJJmEmYzB0PEpHKDwrSW1YQVZpfTNuO1FeTFA4YShYLT5+VGZlMntpI1QyVmFhaj1IdXdJc2NkcmdCCis7SFRFOGREeUZAOCghKH5ZZUE+M3pwUGw9X25oSz1aayFlXiFPR35gZSsrR0FtSFgrfT51OX0tRlZhezNGWW9SbzsxbnErT1QxR1dYRCt9CityN1MoWEEmeWM8TCRSO2IoeVhBIXcpZUhYNypWYTk/UlgwUSlyVUNOVGE4ayo+ZEBOJDY9MFdhJlVpRUtDUStxZWVMT1J6X3AxS1RJT1g/CithVzA0c0JXIT95YH0pbE1yWjBOUEZjJlBPK3FDIz9WKlJmSlBaZzxJQzBPZylVK0pvX1VyX2tyKXgxPzl8PER9OVpvc1NGZnd1fFcjVjtWCityUzc7bSR7JCtITFglPUF4N3ZvQmpweUJIIysrN3AhJT43dzBuJWBuQyhtKyQ3PXcyVHRrRWIlVzVEMXlOVHUyUjVAfEBQNDFaNldPPCZeCiteLU5AVkFaU2tyMztuOWU3QHsrVyZFdmgtbytGdTUxYC1ZQkgxTSp7OTdJPXBQNzE+dFgwcVYtZTR0IzYzVG1aLX5paT9tSV9KbWQ2Y0BZCitnXlJFMjx5Vz8hJkxKM01wPFFsWkp5K2k5QTA1cXl9T2dERDAkWFByZUpuN2Q3MiZzUFhTTDlDSihiRkt8PXNtTH5xSSNobEd0RHdBNkRsCis4bGwhTktTK1gwJkNvej55XmhsMXRtP3ItP0BSRD5xRE5yKz0xYzszZl55ZkZoWHdfUitMaz15QCUjbCpoYlFQcy1tdFg4Jnw1e3Z4eDdTCitCTmtNcjB+aHpHODBCe2JneGwhLSFMVis7K1dGI05FWl53ZlImPCFneDVoVkE3JX4zd3RBZ1c5OUhDMUd9ZTU5UGBrYnUwaWRFR0AoZD90CitycE9eUUh3eGRwZ3QwXl5EMzMmLWtZMSRnOWlDZGV7VTk/ZiRHaiR1JmRLSDBsUGhrNmYqOVYkYVNeJGdzNig8eTwxcEx8Y19CTWQhZWw1CitkdDNMYjBiRklIPzJHZTZqUGtOdGZHZiZnfEJ8MmkkZDRhQHxjdUc8USV2flBCZ2FANHtBbjF6WSlUfkkxUGokbVdlOUhXM2BPSDQ1OSRqCitMWj8mWSsyRnk7bFA1dnVLVU9lQT1yIz9ISGdiTkd2QnRnKjw0VUEtZ3pIfnNacTYyJCk2VFY4T31fMCFPYGBLLWktbms2aS0oa09gNVIpCitefmgqT15edDJ5fi1EbmgtUztlTzJQaXNpPVZKV0R1aEJHT0hkSU5UZ0JKa20tQz5nV0N2R2UyTGc+MHgzaEBBREE0Y3U0bXo5eVZpY309Cit+JEo7JH1ETVFQTjJJQiM3dz9+TSNjMHVmcnh5eEgxVmhUMzg3a29uOEYmSnpFTSkoR2VYQFRCKEcqJDVUcSQ3T3RsZXhJOGcmSnBoT2pxCis8MDlscCN4SHJ5WD5lZFUwVUtmNGVlc1VvbUtMcmR4ZWl+cjZ4KCs5Z0dWYkxHVFc8UipYTk43PUR2RDA3I1phMDV7X2N4e045WlQlOSZvCis/cSU0UkwmYWklIUI0QzRldWdzRzVUeCp6S0l6eDtocD9jSE1APlpqUEhgKihaXj4/VTlPWDJRYTM2cU90TkczVVokfFZmRmhjcjZZVlBoCis0WVBFTEMrY0M1NCRRWGc/QTVlWkszYWU/PXB7dVozZStYRiRjR2R2UEVCYHdfcmVUWl8kPTlxMG9jeC1Sd0J3RWh5PHVQKG96IShMfnUhCitOSiM1LUs/MFlteWlvWkh3VjtEQndPOFpBeTZ7VEE1R35ReWIkPEw/fV5ZUmktQWY2cE9pWnV6cnsmUilPMzdRajk/NmN6MDQjekpAJnp2CitoZl5pQmdPPFErcHcwRG9lUFY1VGJWM0RZRWFmTE9TQ2NfbXQ7SH05SUFlbXRXbXVJQnNoP2VNQzBrNTNue1d6dCR+fjxpTWs8S3UoVWdECis+dUV5NUUwbTZlQzt8Vm9aa05LOEc1MSRBTz5AUVcmMUdzUSFgV2k2QiU1PEI5fEk9SlViWD4tP0ZmSGk4K082PXBaO2I7eUFgMkJnZnpECitvSjdPbzJfJmlrfGBlRTV9eGRIQjU/YmN6X05mQmpBbzRiUDtfN2FvWVdANlpmRWw+fjc4Kj0xZXVfeHB0Nk9xVDxyRzxCd1JDSUBwdkZhCitXJG58Myp0d3A3cWEzXlFsWmU0QkBqM1NlZGA9b2J8bHRPK2x0NXMxTWNqVUskRT5TY3hjNysoMFk3VXt2OC03al5PUjExNWQ0MHhuREo/Cis3KlEwNyl5K2lxdClyRDJSZnlvOTVEezNVJmYyVHVOaHRvMFAwNDdsYX54JD5sOD5OTn10Rnp5cmY+eThnYlI2dTU1PGdwX0lkb0dNKiRVCitTPSFaWFk8fVJVJGM9ejlraEVzMT5pRHxDRX4rNDYofF9weWIlWkc0VmglcE13fH1yUk9IYE8+RVNMU0lYa0JjYyQlS1YqI1R1UT5aTEQ+CiswYDxSfE5FYkJOK3I+JHdfTCMoRlR3WlQre2g+P2BZdTlPZWptYEEqTT5yYnghdklENz89ZVVaTl9ZeCQqY0M3akM/eX5gQTJMaHAldW85CitKMj5oMFZSfT5jYzAtP2szTVpJQ3ViWUgoezBYS0ZwP1pEWHM8X0tIQDhxeSk1aSVsfjJSMjlMWTtATTVJeyg4JHgkS2hte2AkajwtQ0l+CitycVgqLW58OXpqMz9HKXtsUm0wM2VfTGhZUVQ0YTN8JEBzUCNeZT17eV5wWUNWPGNIUUloZnFzaSFlczxhOVZEJEZfVVNjMXNJVFJXWVRlCitIaWhAPDh1OGxYKkxnOGd7XyNaK2hZRDZzdzhRNmhZYjYtKDZCaEx4ZHBXZ351TUlgTkhFPl9LM3RxRyNCRGhMJDVpMjlFcU91RiNTJFYlCitLPWpZblBVOGZDNzE5PXF2OT4qM21IITIofE0+YVErSTNKQSMyYlpvbHhKP2hRTSR+b3VmeWMrPDc5WGJxZVZgM0NaKE5pRS0jPUU4NTZJCisoSF51VSNwQElrKzl8UmpGZzxDKmZ+WXQzekA7I1RwODQhdlU2Y3c7NH1iWiR3KmA1MGktR1hRYjtKMk9jdUwtY098anxre25UbCEwMGtRCisxeFBHblQ7cVpxbm1BPFNGY0hJYHNyVT1Gdm9JPCFNbVgoaDRNeTw8Vj8/aik8Vj1ibXA4fVBgQTJaMXgyWVc+cXlCQXJhOSVtUmY2a25ICisyKV9AV2g0RnZXdWNNdT94dkRieEcpTkRre3xhdUh6c3VvfnQwJjwlNGpQXnF6ZCg4dWMhNiM0K1VqZ2dZTnIrOSReVHopO30+YilCV044CitNRmokaFZxdE5GcX5JSUlSaVVKYS1VPl9MaUleUGZ2c2FpNHJRI1JxZigla2BkXjZNMT9eNURVc0ZKKitRVm1ua31VYUtBR3lpME4kUDU4CisqcCtkTWJ2SGVwWi1vdzNxfHYqUGJJdl9nZSRVfHVCSmFAeHMoYG48JXhXRiR4MUM4Rjh7I3IpT34+fnNFRFJsTk1LNHFiMSVJcjR6NEJECitwdVJVN3QlQHtmVkNMeE9SNCM5OyN1XlN2Yns+bjdCSE5vcntqSExFRVRIN0Ree15Ce0c7LUgzT0lMV3tROGZLcUJ5X2wlZ2Z2cFZJdnNlCitNREdwTjs8ITh5RDtqYn42eVFQN3JzeXNNaGF5VDRfbWg5aj48d1U/UlE7OHcpVkVlP0UhZG0mNDZmQ1gjXns3OHMqeGxkc0o5Sn19bF5QCit6Q0t6eFlAJnJtSUBhJT8+czxZd2pKOEp8bnxYblRHfEgjbFgpV3VZRiV0OCEwZT4zK2xgV1B+QTd6LX1xU280dF9fRUwlYHk4Ryl+YGQtCis2aHVtPHopOyNyVWZSU3c2MihUTklyKUJ6aXBCODxpRXxFOHl7ZGtrYn1CZT5DTT9JRWcyUjRrYWhuRS1HbmQ1fm9LOTJ9bXJkb0BrcXxICitzUDFJK1h2Z1h1VjRLOHtyT01abzUlbG5hckBzO085S1FIMDAwMDgwUH5kPU08MkRAXzhKMkswRmVkJjA1dCNyMEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2lNWGtsXz5XcHBvUlZscCFeR0hgTmxWcjZuSmFDd3pmTz5mJmM1V1Z8WDRDOyNteFl7X3kwXjFGCitHa1FGO00pP2JpcDZnZTVSR19yfE9xKE0+JSlMKn1rdyhNKmdjZEBJSkdATjtTQDZCa3MtUmxueE1+ezteTygpNHtve2VaWVRfa19lRkxKCit3YEYwSi1WM29DYjAzcV5AM241M2kxe0Uka0Mkay1qX2goKD1xPk9ATn5rQD4qU3RqdktlblVlZSE0Q0skKnlJZFI/cHtsQzIlIVFYbUpBCitCJU12QndWcCk2Jj5lSmh2PTc3cW80VGkwYGl3SGVla1pUKCRTcU9LeGNKYFNUeHV4U0FlT3RRNGdvKkhPeGo/SzJsQUM1aDRBJTVDazk/CitZV3lqNWgwb2hgPDwzaj9YMFptQll+a09aKW47MHowc3xIU2ZrfEQzZmx5aU8zT15ubD5QPDg/eGBefjx3QkY/TGI/Kz9qUE45TUB0ZCl6Cit1U19BIUNXTEJUS3UlIW8qO2VsQztwMlF3USs4bFZrRjQyMyY5ZEdxbldLMHJiSm1WWUk2OCF3K3JLKEI0bihxKzIjcFFra003PFJPUHEoCitocFY+TUA9cT8oWlopKnx6V0d3WkI1QiQ7MUxueW9mPjRwQCNWYjdKSlEmJjhBbTBGUDBOOENOayN8c2RsXmFYUTdUYytBXlMqdHp9a1cxCitldHRGTWRvaXNKYmJlVCZtSHAwQSRua3FmSkZpVXl2TFdPWXl5ej5zQnlfNj9XPVVeWXNWdWMoTkpsaiZzajZ6R3A5dE5BRilYdUw9JXJlCismUDJDZHFtbHI/Z3pCJVNBU2RoJSlCMCRIQzJPRT8rekAwYStQWFMrRXlVeG1Ob1Y4dGxNTzZ8QCk2ajdIfXlGO2dWKWxOXzQ9KWtTNlc/CitrRUB+dWE0ZjZFSisqUnJ4ejxSSigkMER7UlBUdmh4LWAmSm5HWiQxMClJa1U3LWdWJUV6KDxeakh+VmAhcURwaHR5ZSYrU3xMcTtQJkktCispOXJ3MG9nd244aGVxPjx8Rn1sRm9sYT5ATU56ZlFfcmZ+JTJXeiZfanxQVXtYalVzUGhtR2UxcnkyWEBAd0JiTWV2eHxUSmNnfGpgQ2UqCisxbW5GeE9FUyRfdkMrOEJ0VG1+O3BiekFUX3khJGtgZC0lc21qRSZTZFlALVc1PWM+MnEqPSZaNXI4PUVsM0ZxNDJpREI8TGFWIWslM2sqCitqfG5+bFdVKj0lfV9Sb1RZRmJHPE5ubnx7ZC1VKHUjJl8wSChhNzNzWTxZflIoczZhNTRCZkI2P2pkT3R4fUVKJTt3TWNSKTJydFJpTmk7Cis5MWlYeFowUih9JlgpQTNBPm5QKWg+QDZhV0FLMm10ZXk3RHdaZnR0TSp7MDAxdkUwMDE9cjAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiCithTzlvVlBrN3lYSnZDUVZgeVA9V015PE9Ya310QFdwezlMWig/T35FXnY5aFRXeGRPI3U1SW1VdlpUYGhANnRGPGtXNUkpWGgrYFdPRXxRCis4Y0Q5bDw5YWtsOzdGcHYzeGZraHYla0wyPyVufGhsNSpeSHJrWTcyMGU1QCp6UiZJPCZ6fGw3UUsjb2BDUmdmbWEmfkBvZCMrOXwtPHwhCitVbz49P3I7Ri1FeDh1aE1CN0Q9dkNieW1iaUMwMCN+fDBIUnUpJSFlb0deTkZ4WHNKdFVEaXhjYEx7KDkkMnVudT9wMjgkZ3NzemhrbkA1Cit1dERec2RzdUJ0dHh2QSs0YVUyZ0Q/UEt5anJ1Wnl4dWlybEtHR2BjZGVuciljQ0VAZlJCUCtNKDRkMERDNlN6a1JySzdJaWJkelgqWUk4CitEX0p0K25kTFNXYFpsU1F0TW1AflRXYEhOQCVKeyEzPFVzPj1zO291ckYwJDwkRC16P0deQmItayZVTWVmOWZnM0BHRz5UKk42bndRMlhUCitnPEM5ODJkP1dpZHNjRlNFWSMpRTk0PH1yRjAodXNWSzJPRTg9OW5wK3xLZExtYzl8R0clN0glSENZUFNDX191UX14RT1yaTMpdF4oOyp5CitZYCNuKWxVdCotUlYjWENtI3dCUWg+PV56aGBLMDFVWHgwSFFZT0tCSS04NyVDK2hqPSNHbUZVNGlzJEsoLXJYIzxFPzA4QTUzcGwzVHU+CitwPVYtNEFUMWpKLTxWPCE2LVF5UCFnckk5VWxiUlYtVFFqZkkwVnJVdGBZXmVCYHxrYW44ZWVAPkFJM0t+PEV5KW1LVmRDMmprbUMkUClmCisyQG50KDgqRHNeNk16JkhwQCZ1YEEmViNvTSZheWh5Q05aZW1jP3lrO25aYEgtUzgjUHdmPEQwdzUrNTV9IWprPG4rYk4lbDJkPDJnKCM7CitjZj14bGhUQmlzdkFpNzBASkhVTUh5KShMY2h4NzdWN2JUSXhwd0dlLXQ3NS1Xe31TWiUoYGhHfiY2U1lCKnQ3NWJBKDx8OzMkZm0pWGRkCis8V2pRVl9pXmI/S148ZU4yN3N5YWVfclVlQEoxMVRXcjViPHsqOE03RFlLd3ItaUwoPjIhPn0kSW5rcmopeH5kOUdAdWx7dVdRM2BjZGFzCit1Zkgqc0pVY2o7bXFuJlZFPm88XlZnfjc5SnFuPlNKaUltNEg5enpWNSR6USRZVypUfVJhOEBXcUl1MHBDZG43ZyU0fGlSQitKJk5VZm1hCitFZUJlRk45VGdZRz0wfUxNc0glMEVacGIjcEIyV0dVUmx8JChNWGVXeDk3WCRWMjl2NXVNSU5seCh4akFKOTQjX0ZYJm9OeFA1UmMlTzAlCitaJEhLfCk+NEBoOzVnX0dFNXlTM2NzT34odF9PTDV7QTZULXpiJTtpPkRXeGdQa0QyOE1ePClwKk8/WXJUUktmZF9lQFcoQEJxPDx6Qih6CisqQmFkWSRCUHY5YG1MPVB6RStnM0RyJk00YzVhZiNHRVRpWjg9Vk41ZHVtTylHeD5kMjExI0Z3M1V9VCM1KUR3bWclTCRvbW5ldXA5SWFKCis+KFR7Q2RyYD5zdWY3MzMyWTZvTWs8MXljM0RTOyt+JE41Uyt5PlpWQ0hrfCR9M1ZsbmFTNHBIPW9ZZzAxNXthITcoRWgobmJpK2xpYXx9CithbSolZzFyNDQ4RG40WiliYH0mXyQ2dE90OXYqLUIrWFpEPVRWeklNaUgocU5iODstVVYxX0RUPkdqJG12LXhHQnMtYXooRDRCRHAkQkIqCisqIzdTZ1h5NVJWdWp8dSo7JU9peVNMUlUyZWg0eXlYMFclUlg2YVImTEhCP1JgbFRFVEQpbiFNdlJ1UDxPSW1oVCRpJlRhNVlKfnVrcSY3Cit3c0JNUVcmTFJLcCZQQExmX15UaVIhaSU9Y300RldoYVdwM2dEYSNATylzajA+XmVuR30tVTRjb0loTHBuPHdQVVFRKEspITBnNWhHMW5RCitTNWZDIztyd1d+JWxxbDdUZzRISSlDVCg7Q19VV3FTWW91WVJBP0R5YTM2SldBYEImWTNlTGFqKkk8akVSZDNae1RLTFJncHA2c0A2dG81CismNCp4NClXdGtnMHojQWwmbmJjTndweX05WkhOSVpvTl8mcV9pVFY2I1h4cGR5dlgtUjd+bm1Cek5Gb2RRPUt0TE0+MzVZZFMobnRKQkhyCitpQ2FPVT15WHhRQitHMlg1O1IrX0Z9NkpoLWJlME8+YjBlVSV4Tl8+Ykc4S0lEQV9HNlJvMHwpaXFwS3xFaGlWe3F6Wi0rekM+LU5xWCkxCitSISt2QTk4N1lpNz4/QTApa2xjdWtzNiE3XzxRQG51YWJvK0ZZOXpaZyZZKnFzcXtMcStVVTxKa1NQYClDQ3d4fCkqMl5MX140Y0BpeWFxCis3fXVZS0V1Pk5sTU1EeGFWfFQxUDlleHg9NEQyRkZgQEg1IWVTc2lHcndOTjMwRlI2N1lgcHo9RFNHUXIlUD1MXkRYcUdQRTJRU3tgemZiCis4N3BTZntwN2htWCNTWCE5T312Q3wmOUgydEtuP1lofXZhfUcjSDVndjJvNiVJaTJHViYyOz0jaV9DOytKLVhxTWdoVktCTCgzKWB9OEBVCis4UT5DWHp8Z154P3B1SUFRe01DKm96ekFyMnxrI1ZwQFV5aCZ0eXRBb00rSWIqWW5uY1JgS2NJSFB0X0MmaUxadiUoNmR1I2hOYXBvUDJ1CitUaiNFbXMzXklDK2whSnJscjtxfDFoMjV4SldeJUBwQSNmOTApdz0zS3gjd1dXITU4Sz4qZCVvNTIhKDZYRkpEZmZ1ZmVGZGQyejZzYURVCis1TSp5TSNQWjAxUmR1MFpoQ3tKdnI5JihnOVQ4VHVEU3tZPHUzYkpsQTQhNi1uPE5jeilxNTRxSjl+QDF7KyQxNj1hJXRQeikkMylfaUFFCitCfmA0I2o8P2NwQld2I0x1ZCtxZlEoZ3o2SGdiM3U1TmZQMGYxSDdQPjZtdldGV049IWAjdHttIzY0bmFzc2kwJmFuc2VLI0M0MGo8QFVYCisrPG0yU0VoLVV9LSZSM3E+KHp3RHJzKG9EU0xgP1JoWW84fWFJeVE9dGIzbDFzVGQmSiU3KHgzTGVNS3pYMkQjREY2Pmh+bWgqZVluQF83CitjUGpEUlokVjtXMSlqeDVMMSp9Um8jVSFiekJIZCQyR3dsWSVPd3QxTTJidV5uYDlgJjR0TFNVcn5XdSh4Vm9nISleZGtOQ0QxfDImPEo4Cis1Rmt9cy1pO347VkF6NHpaMkN+SmskUFA+NEgwPXFBWmFKU0QtTEBLYjBgb15tNjJ4WiQlN0tJUnBVJENrUml0QmI4MHVwbmdFK35AKTMmCitvV2c7RnkkZShKYV5mYzwzTkE+aXFBcSNDJXJpZmI8MFdeRGkrRyZSekhneF9lJiF8VXNjPnRqbkVtOzx2NGA3Qmc8Mz1RaTROeWlDc0Y4CitXe1UrYVdYMVVhN31CPD0/VEFjWWZlLTtfblk2NiZ0bD9fPFN6K2ghTjBCb3U2PGJuJTlWTGB0UF9KIXFsfkNYPHthaFh+UyY7ZTktS2tUCitrXzJmbSlJQ3ZgTENoclUzfXVDP2l3X0p3dFBXdGspcDdwJiZQOTtZRk5JVG9ZfkY2UTRmIU49UE45RWFFeiV1MF9+R3NhISlWanJxM0pDCis4Zn1uekVtYXlIMUo+cT9UVihHYTxRXlZEfGdkTkR1UX19YV4qYEA4I0dNYDh2cXVxaHZWQ2AkKXBwVDtabk9vTEcmMFdDckNAVXBYKUxWCitVVVA9ZEhefG9yS1hPcFFEcz5iZCRFYTlRb1RXeXtqaHYob3cjXzk7OEk1aDtjY2x1RkQlNjU+NWpnZFYrNyp8MUt4bTFgNzh5TCp5XjhPCiszVElXNnoyZSk/fnomOU5fRlFlTV5BO35HdFAzZG4+U3JGVjdaTmQoTVB+LV43PUxEb2dISDkwMFpFdkZfSnp6eERPYld2TUl6VG1zRWhHCitUQjFQUz55Y2R4VExOZ1pyPCZ+VGVQcHs2MmImMVUqUkx8eTVtOTJScnUhNX5BaDd8TTAoP2tYWEsqcWxxVFlERzNwVX1wMEx6ZCVPeGU+CitLaE0qaDQoMz48bFg7IXhIJlVuTSU4TEY+YDhtaXRkQ1VSZDtrREsyPmtGXz4+dGQhazgzRmklQlI3NlVyRTJ6JjViUyl7Nnp6M2RmaHZGCisqMnkhPF96SGBWdTlSU1VrRFFXWil6VG0hXlctZ29xcjhIVnkpOV5ZYmZLVVB8dFYqWEMkPnMxRFlCT1JkKzwhPX57MG57czlldXNFPGQtCiskSytOcF8qYFRHOWpHUFpBI1Y7JFFublNfd3hjRz5WJHhWNGFDMkokU3FxMlUwdDxNU1Qpbk9NbTlgRVVANXNwaD9JJX08Un1AOUU/fnVhCitmIV9yTXEtLU99bzI5fnJEVTxAXyEoS0hONGw2K1g5V2FVKjtpKWVzdGZmb0UrRVReLWFRb1YhJG5vJCNaPDwzTjZEaGE8M3EtaUFWaCUoCitwX2oqZkUzbCtLYEh4TC13S2Jha3JAWD9uLSgxNHBBTk54dC1peS0tVlI9JStIU3ZkfkNeNVM2UjZHIUspUmVxYT9ARHljekFpJlBOdXBtCitzdHxmV29VVlAtbHpaMUJES0pXTmJsS1NSKH1WcVhWdm1MNSUtTndYWnY0QXNvaGpoYWZ6LW18VHI3P3wmSXpzOHtPdmlfciZIP3syMnlsCitiS3NHSilnPmgqZV98RzdgTm89e2dwaEpgejhMI3tNYXFJSzl8M0xAR0phLUtmNDhZd19gTWl7T0U7VzZGbUQxTmpVYF4kan5wantecWdpCityYUg0N0YtMClWO2ZiJjRKUShyN0l4fllwJXQ/TkxFSm56XnEqMTBWUXU+YzszM29+SmpFfDwrTTB6Xjh4KSV3fi1pfmtYVXIlb0QjI2QoCit+Kz41V1hFYmpCYUAoUjRoa1RETnBYK00rR2NkeVNjTDtqR31QN1YoS0lrfGxnPUhIJjUta2c4OXpaeV5KUnA/Jl9tKyMoOCZVVGt7b2J1Citxe0FXRCg1SSNKaV9STDFfeDFBXk1JblhDSklYcjtRcD9APy1XJipgVkxlJC12bkVhRyV9cEUpKFVlREYkTEEqKmslNXY2fSsyX25IJXo1CitZU05uTE9CSCVUYz1eTTw1cDYoWUlfbT08JiZnYXtsaFI3QkJJekRlU0FMVTJ3VCNSaWJoaHdSTCFINU55d2BAczR2KmM1MEFRalFtWnJTCitHZnVXc15STHZ4UV9AKnFmQWQ2YXROcXQ+ODBVMU50VGU4eUN6Xn1mTnZScXlOcEYkJEZ7SjFAKyk8dWo8KCtmb09SIWBffH4pcWppI0xJCit5dUgqNnEzNVZJNG9xezs5KTluM3ZZYGVaSXJ2b243KzhKUmlyYXFFKzU4KDA2akU7NE82KSE3MioqdG5vR0l6UXh4REh7ZVhfLTtDaWYwCitobFZrbV8kZWpNeT4re3k7UHk3VkFeSyp4enl2VSNBTzU5S0l2YndXNlBDVkFyWUVjdzExPExSdU9uYjMoO0FAQH0oS0kpcGIoRVREU3laCitNdlFhdXsrcWxON0k1cmlOfHIyI3NzdlJGfVJvTEJ6KG4rX0k7OH5TM3FSNHlDYj5fTTZ0QDY4dUw7aW1pYHg1bHAxeF55JURtUjYpJjVaCitzRXk9UTYkMyU0bHxXdTteeU1FKTttbSlEb2cmN09vcGBuaTcwc2pTdHBOR2RTOCh3VEJiZWhHWF5ASj9Iclooemx6dDs5VUdFVXFHMHBNCislZVJJb2VyOEF4KUtlOGIrM3M9Wml2VURfTV9gIWJ1Pl4lPSVzWUZJXnNpKnJ1N1ZJPHs9RDIwKFImcVh2NzlHMyt8cHM1JEBgIUo+IzBNCitQe0I4RmE8TH03RH5QSGtIOFopSEN6Wjwtd3ZgIVpiKD5jSmstQXpORz8zUCVsPytgKUt1bjt1Jj1IQGI2IUJ8S0h7K3paKFFnRzxpKTk5Cis/MXVmMCo5QWdhKjI/QSRzT3paK2lwVnNxRSV5YUBtPE0pa0MxUkp7KUdJVldOZ0c3VlBtIyNOem8xdGRaKHRKJGQrVlpENXFKVWJ7OH5NCismPyVpcmNqbiN6MlJUdlc2ZEVsdT1iOyF2V0t6OFpfYSg/PHkkbVdZSENDKnkhekFATHQ4PW5mOUBvb05fdF98YTZtViY3NWg0M2tvdyNBCitOITtaQTRAMUV+eVVjRHZkUHU5SSkxeEMkS2tDZT5AM0lBa1pnTiRNZiUhYVd8P2FkNnpHakhUP2lneWZZKyVBUWBCcyQ+M21oSzUmdTROCitwe2VzPFVTfiY3O2o+KG8ybEFuZiRrdDJMKzQqMiF5b0V3PjdNJSs+Tng3dWNlZ24kcW4/RT42ZXVuZDMqdDw+KktiUyt0OTI9VGxMPjwlCitnKUBRYyoxSXc/NV5XIy1ARWdfdVVNO0k5ZVUzVHI5PyYjdXR1b3VSekpwO1R5WmA/cjQ7Km5UTFM2VUBgbHN+VmFiVVR0aWxTUGU4bWl5CisycXpjNWhKKUtETF9xQEQ9d1Nfb3dwfDExLUJeZGFVQ3d3dmhoWkRScG1CWk9JSkFma3U8Z048WSV0S2Q1KjEwbkdyN2xiMklPV2ImeXFeCitaJUcqYVA2P28+Xj5pe0tqUiZfeVJiYTVqYGd3PStpR3VBJXxlNTcxMHE2YDhLd2VhZjclMEdvejdwfSE3aU5lNUUqTitZKzZJNFlDdGpoCiszMj5TXklRanpAc3Y5JV44MVdSY19wOGtIam1VS1VudH1PMWNAVFB0KTxXRDt3LUxhey1KQzA5M2VlMStBKUF1aVUzaVpOYC0mYEQ+YzMqCitAMzF4KE5UamV2SnFLPUtBMGctRUVyOENjXiZ1QHtrWW1Fcj9rdmE7UjA0PWhEMH5fR15AUmJUSkRRSC1Tb0ohd2Q9X2FRTyZNRlpAVFA0CitHSjV4bDBldHNXVi05TEVgMnk3Z3c0c01sfEU/YDNIeHV2ZF5lWEdMMzRlSXY3JiQ3M1BZa1BLKnpgO15sWGI5RjR1JSFPdUVlfEQ2WkN4CitBVlA1eUhAbDE5UXpONm1YJiEmKU91a1dHMGVpfVoxTmp4eHJwRmEmeFVXT3N7YDRnMTtRcjxtRD9XXjdBQTc4MUh5KnRzJXdhajskZm9+CitWIWA5MS0qWXZrdW9VIWtMWmhrIysleWQkNFV0PVo+P1NIdlNaQkIlUHM3eCgjSHVlWVpgV3pYeUxDb0BtKyo/WmEtYyUkbDNzRTd+dXBVCit8JD8+PF47WnVlbjk1Xn1VcTdPS2JaJkBfXyQrWXV6ZXZhdURScDMrJCg5Y2tEbWJMPzF4a2A4cXNDOE41Y1dOfDhpJnZZaDByZlM2PTEpCitkTDJJUTskPkhMNjZVRz9UNFdhUE56aWMyQiFCa00lfHYrSlgyRlk5cmtHYXJNcTw4c1dtP2J5V0hlJD89KD9uWDtTVW4yVio5dXN5dldNCis5OEh5am4jREExSiE+XytLWjF1fXZ0KEZkOGlOMExySmZpJXpUOChJX0tmZkxsS3VOREhUKWpCeU14MmZRNnwyZT9JXjI0VyMhd3FjRWxRCit0RWVVMXRNTTxra2VrKz5uP0hsNTcqPT9fOGRpfWxlR1RiLVErMWM2O1JucnsmNTRBZiR7WE0jRjI+eEFFe1M2ZXF1SHs8fXpQI1g+ejx7CitCdGA9VGtCLThqITNzNyFCV2JZcGRkSihqKj4/XyRZVlokfHEpZ0dSLV9nUyVlcXZnKXx+MWk4PXUqTVpFaT17cUwqIylgZnBFQlh9T3g9CishaU9QV1NBLW5mZUJHY1hFVil2N097X1dCNE9leD5KNFJ8RSs+USVKPXVpXkw9LTI0OUlERE1AM0tqO3w+Z3o2N2pFNGlAbTJqYShEQXk/CitLfFlSe2p8LU97ez5KPjB8WFFSMDAwTzheT1k3eW0jPi0qekUlSkwpM15XdEZhUTdtYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGCitZaGg8KWIxITNQVlJCPztiVDRYWWI3cGQ3YVZ+SXFtQXpmQkNBWEVQZDRHT0kwS3h6XkR5YG85VDhyI0xIejJGellTczcpbDhsRD9yalZBCis3JTg1IzRzeG5pcSo4S1k2XkRzMFhweGkqV0U8JDxzLWVmU3lteTJ0Pz5tfW8oa04pPDUqRHBXJiRJcEx6e3JkQXlLbHw7TXBJeUtGXzN1Cis5WXpwd3dyWiRFbmE9PSRvPCYpNHRYejUxNnxaKGhFPks3SVNtXlkhWmVeXyNjPCYjVHczVSsleFpgfGdKfnVmQmZ5O3FBTlk+KHtUSS0rCitae2Ytb04/eT44R05mempeaUgpaF91RCZ3cUote3IzQ2tjaH1vKnVNZEJ0JmkodH1LN1Ytc15+Pip7fDl7b0tkaSY9NntgMX1VWntQWEh1CitLND0+K2pyO2x1aXJodHtQNnRFXmB7QExAanU/YDx2WiY3ez5PYypLWXpHPl9VWF5CdmV3Kkh7TFA8I2UwfW96XzROaDZlU2R4TntRbWpmCitVIUsxP1B4OSY4SHlfQDtgcUt+bEZATl57PWxeK3NhJFVjOWBSLXFALUBraE9GWWpKYGNtM2twRSZPbk9jemdaKyN9OXZnYHtzV0ItQnF0Cisme3BzRHljUiRpPS1AYmMoelRVdDZfUVN2TGhXLThaPEoldnV1VjIyby1hVVd3Pml3eUhjZl5QNTwocUgqKTd5OHV7Qzk3XmRHK20mZUR1CitTY1p9I0tSPkpRS0Z6SSo+dUFPN1FTfDhWe0tgVGNJYF5eZWJRcDVOYEtgVFktbmRqMENfVUhJM3B6SjdsNXtgcT9Pe2AjS0otdjlacEpACitxUlpeNXh4LT5zTjFnXzRlLUhVKGNgaF91VHQwJitwI3ZQcDxsTGBSUShWalc0Yn0pPDFqc2YlZm13e0dOaDgtO010OWRjODtFLUFeU3l7CisrbkkhKkMra3ZkaUJPP3xHZkt0fDZeQ1VBTjFjaHRnYiZqVXE4SG17YFFDMEZMbis0eDdVQ0Z7SHk9PXlGWXcmZWUmQnNVak99KkZUVktYCit3X3BBN0BBcSRhUHcjS3tfPz88d2VmUnhfOzVYTlBzJl9CbmVFNHhVZHteK0ImJVhIZHp3SHZBe1BPYyhmQnd9VVk1bEswfExWNyZlZmowCit9dEtXVGJlUkJRJmxQfHZke0w/QERgamFvTi1+WnVALX5hQiomcHk3Y0ZRMT0oPlM4K2NaKn10aipUdnVORCErVFhkLTl2LTQ9LVE2ZXQjCitiUWs5JkNFPypfajk9S0F4P3pkWXxAe2AmZFZNJTQ5a1BtJTlgezY4QVEqS2duYWlfZzFAe0l4Xj57KEFOOF8yJXR8N3VVYlBkJHFCJShmCisxIWxjaH5hUUBxTXZEfE1rWiZ1MkpAblVjVUwpKkx3KVEre0ooTz5mMnJRdVVAfT5gfGljeyVlVWA4QFlDT1h2ZGNiZERVVjsyXzkpbCZoCitjRVhofEV2RzUmd2wkNHxDPmhUcW8tWiptb0ZLdHtaIXcrZDs4dD5APXB3OGVmKHpRYCt0Nzh6NV9ebVpvYzBiYFRGJF8rZGpQQiYkbGhXCis1NCk1MV53PUh2LVM8Qkx3aHp4PXxNfF9eKktoeWpOQmpKclVWaWBiJWAtI3Q/KWwkLWN6Kk5zI3swYFp6MjJDOGBUZkRoP3hSMXctNEZaCithRmFHS0NGUmttZEtZYVImZkJPOX5TM2hicC10VmI9QGNIKUxvXzhQOS1jc2p2e28pdEBeP0gxcWBCOzVfUjdkPnUoSHZQR2A9ZTNuUGFtCit4c1pCWCEwYCVmUmA/bm53Z2B1eXBtKW15UllwTVVkPUc1VHFLRiEjUC0oNjBhVFEpU25HeF8oeEVhc1RvMntkdVYkNTNKYzJgIVJNV3s+CitRUiFfSyNATkU/OEhMemwte0p2O0V6U1UrZlFtWnBDR3R5TU9pTF91Smg1dF4yPiYmLXM0PSozYlhwaT5JZ0VZNSlBeUFBa1Mocj1SQCNwCithMD9XRlRlV1leSSFocXRJdlA7K2tnSnpsbHtNNFcmOEwrY1lYVGptKyRFN2ptM1phLTgrcEo8OFp3PUhHSn5SVXdgKGBVdy1+U0tIRFhGCitpKXFEX2BSZVVvT1o9RFhYSFZERkExfTdDRW5NUW9SYzc2biFEYTMqPktaUjxzayMzKCRCVjFZQH1sdXNaOyQ/Pkp6fkQtQHJXMCMjQ1h3CiswKihJPnRDNyQqbDw7QVk3ek5vb04/cUI3TFFkV0NXWW1GRDxrcTx0YmAhLW8jKVYxUDhzZVJ2Ty08SG83S2lPQFhWfUI3KlBROSVAbF5UCitgcmJfMWlWe25PcEh3dWhMeipXSUBFKm1xcylNYWMpdlp+SiQoJlJ6TkhUcVkwRngkS3JhYGR4M0lQeTNKaHFDRURVX0dLNV5wSykxU0krCit5K1F5KWBib3FRfnlFVnNUbzI8eEhNb0tWY3BBJXtjVyZmMiFxU0FNRjshekh5ME4/ezBxTSh6eSZTX0RGSj5GWk84cHVlRlFxNGpxcEA0CitzRyQ2WWQ/dGYmZDFhSypyNW9Yb2ArbkktTDw9P09RJUROYj9tWE1WOzhUcD9sMFA3S1hha3cqPi1kS2V4dz59KlY2S0M/fjE0NUN2YHV8CitldklJZnZ8flNNLT1OcSgtUXhqOT5ZaSNlYiVLSiQ/fDgxc2I0e0xXQD8wfmx4MEZoSVpJUW9YYlFoMWRAM2spcz0lVkRKPGY3IUZNOzBYCisoQ0g4PUJhNlB5YkY3P3p+PWhPYjlAayFAMHhDRUV2R1B6S2FaWStoODh6YkYlT1FCZXlTZk47PFNqa2d3QDRNYllAan4lUkBrO1J4PVk2Cis0TXJEVVpmYTBaM0BMV3hSPU11fHA9TWhTMzN5fEtyd0cpZ3V+SGNCPjFIY0I+MWMxbV9pYzFte2MpaFc+XyhKOWQ+MGdNWHBxfjQ1T0AxCitXJE08UX1MIVdFM0ExOX4yKUg5fjIpSDl+MitsRmVueGpWYDd6e01EJGJkK1QrSHwtV04mK0M0LVZkJClzZGJHQVJrQjN6I2tgM2lsV2Q9CiszNmtNPWtDTVpqfFhTPEZgc3I5ZngrRiVHSXdKTklOUX0pNSUqIz9sO21GNjAmTE5+YUljTk1MZjtoZHhXezc4RGVpQip3TGZqKDRgI01kCisjfCYmPj9lNSl4VUF1d1QrQ3hfUmdERChMU0V1bXFmO3xqTztZUTBCcFk0SSlMd0BrRTMrI0c+ZE5ENzNMdX4oUT9LIWFUJl8hcWdgMzIrCitga2lVUDtnPWc0Xi18Slo2Y1djfHBVRkNrNSk0JSgzPzlPNXlJZldLaHRZUHIxam8kfnhiQHlQeWNJeyE/I2lefWZpJD5YI3NEYVR2Yl57CitBXj5fZzRedzEyTXcqfGpCZzFvazAhdi1XNFNsOV5aUj9xeC1OX1pNZE4rSGhgayN4QDVQbFk8NFUkRkEyb3BCbmFJbzVPN3RuMl5ec3hECisray1wNiVEfSFDZUttKD93JkMhflVeTCVIWHJrenAkcyZPTWctQ1VRMz5eIXV3K0BGYThUN3l6elVyV3hXbGZPPUIpRGpULXtmcGx3JkIqCitxJVJvZz5XR3xJQldJc2dxNUk1Snw2eXk3RzJjbD5lRmNJPHF+TD5gKExCNzR1VEEoUV5DQWxVfmZPc1Uyb2ZWYUBmPjg+PSQhPDw5KUNnCis/VUpwclpyTnt6WFNSNlFScmFOdyFNJTJtNndMaDklRTUwTl8zNlQ1P1NJO1hHX19Ka3Y2SzEyKnw0bSl1cFRvVD0rKWc2aVpNO0Zva2JnCitXPEFMPm18RktJfVktcSlYKUA/KWdyRSUkODF7WnFUUElkYFE+ZklBOyZrfWxzUiRgPHM/cUkhaGs2VUcjKSlITHxDK3F4JD5BTnkkV3clCitPdG56MFB9WWsjdmxofDAwJWB2R2FXSnUobEBgaCMmfVJjajB9cmd2TDY+ZXpqYDtwMEhEa14/cGo8SG91Ukg5Zkw+eDs/PCZtMl9IZyEqCis8c0J7VFRRPWo2Rmt2QyRZeiRBNWVTJUYoJCQ7TTVGaC0qaVc/b3I1UHYoa014N1JNNTlMPkpuUkt7X2stPmRtWiVrPE4pWSs8ZGA5eXh5CitOWCVFUW5CbCR6bkIqK1BgZiNQaSNfWGlLV3g4Yi0tIzl0MGQ4JFJ7cV9jTXApUmFWI2xtamU3MjdfWSopVCF2ezxBVVpBSCN1OUUoWl5OCitgejhBaUs0eFhDdGM7Y1FxT3ZIYHRiRzl3TVJWYzVEOSh5bFNySUVNVnI1MEZ0Y2JPcV57d05WUjk0MnklQlo3UFNzQyViX0p4dWx3NlplCitkbihZZldXSlAyd19hKDRee3o8V1J3fER5YGB3eG48Sll1eD5oMmt1YWJ1Vyg8aGg/TD0mfGJXanthbnF9cTs3YUxUKj5ffUQjdXZzWG5zCitWZSl+RWdaI0JKMXBxelFYcj9jbE9BakdlQSs2Qm13MitLYU9XdEI+MiE4TGVGPDRQKjdLPEtTJUltKDs7ZVMlNTFHRnBsOD42I0slWHU+CitlO2BoNlJ8aEE5fVZHKF9lIVVFV0RNNHg1bkxHezFTfW96RUZ8e3hjWD07ej9COEt2SClZSl9KeHV4cW1eWn1WbVFGKXpFRU9QVnhEbXVfCiskOWMtMHwjPG5EOVBlZ2FvNGNBMU5VLVlDfjI+PFh5OCYwZmBOZT5JdjlkYz9jYTYkbDdVfitGZ1hwQSk5NV4kJl9WRHBAUkEyVT0zd21+CitJKj1AWmdUV2owey1EcUlnJVdfR2x7NFE0ZW80YilZdjhoaCVMWG5SeE1UXn43ZlJ4KEhTcE5MVipgJjNKVH55eXorKGZDP1kwaik5QCtKCitSJUxYblJ4TlA5RTtpKXdzKzM/Z0ZQOzVaNDBtVExzOCZHVWBZN0l9VjtpPEo3WFItWn57UmJzR0NCYUk9USleKFBmc3FEQThXP0Z7cT1BCit0Sk1qOUJ3c088fFN6KHxXVFpuNkU2ZnI7RH5OYGpTIWxoKGpVMTB4TkxHJShWQE5DUDdjak50UFJ5IXBYbXpifS0/R2oxXiRIP1RzeWNYCitfKyRNc2o8VyZIZEI7RkU4NSVWakxRaXhpVDF5QE10ZUVuNmxsYlpCQjZfK09jUFdVJFU1THROQWdGbkw0WDliKSZJfEJNMX41UDs1WjQwCittVExzOCZKZms/Ril+eiZicW15a2xrSiYqPz9wTmw2VmRLTFA7Um1uNH0jamNBKGdTVmg0KSZnOE1TSzFlZkc7PmByZEtXZEFgKUFsWlE9Cis5X3prUDU9ZUd6MkZ2NVZQIWNHMW9+SDk0OVZtOTcqbndpTiRLVDJBbStVXyUyXyFwXj5fRDt1JHFwb21YYXxBYSg5eHE7X2t8S2J1Pi17CitwNmd5RHRfai19ckZXRy1rNT1lRisqP31hWC1vOCtoO0dxTT40aXIwMz5fOEUzZFM1NjM2Z3lEdDxFLTwhe2dWOSRDNHBvSWt7dzhQQWxaCitSciQ4Mj89Km53Z1BpWEE5K3B4QSs4Mlp7dXpxdT41fDsrSiRGKj99WjMpVkAjPk5PbUNFRjxUdWRjRmIxQ1k7fUM/NG57Zns+MHFSVGt2Cit7S25ufldQKz4wa3dpZXFTZ0ZNbWlZalY1RWJRNG57ZnshS0VKcWowYFhgenttaDI8TSE5Kl9EbDkzZ0hNNz5hK3pFeDJ9V1EmMjI4fWprCitzcSNRdH02cUszQHxkbCROKGViX04oWGlPWkZkPjFTPG9xNDl3TzVCZTxqY0xQOzwoenttaDIxQj90WGc2cHlgbG1IezZvcEdEbkZXRy1rCis2MDhpY0dCOF5NajBgWGB6e21oMjFCP3RYZmBoZCRsbUhfR2owYFhgI3U+TXt7Z1Y5JENCZSE3RCs5QU56e21oMjFCP3RYTGJTM2srelg1CitoRm9OVD5GTyZjeUJoSSlAe0VgN3kyM1EkalduaWBqNyNVej5mUk89NDF7ZkomV1BsTjlqKHdwNzcjVXo+LTB7VzRGQnhFRWZFOXdNZVc0CiteNjhESW8mZXFTZ0ZNZ3x4ZVV9UylpMFktRWtUPHFnPGp+amtUZlJ6OSUwYWdOZzU/fTtnWX5UKExjJi01akckZUZqUS08KzU7bl5AQSk2CisycWpxMjJ7d2Y/cU9sS1plIygheCYmQnoofDBSMDMkP3hgQCs0ek5Qdis1QkxQTU5qNl4lKncodl49dE9Rc0l1b0JwbDAzIWlMMCpuTTAyCit7M315LXhvQE5rcExxQk1nb2skV216d05OcjA2QUQqO3ZsZGxGekl6ekE7Y3pFQmQzMVEtYzA1P307Xlooaz9ATSZqbGw3SmY7OWw+alJOCitSc3dxeFU/amp1ZlJPK3IwWShDaDFRLWMwNUAwMDJOUHY7SjxCTnF+NUAwMzMzUEgoJG9aQTtsZilQMTUqc1ZjbUs4VChOaz8rdXszQHtSCis0Qil+fUFAekJDQTM5dTRpQ0JPPGE8aH5SeGx9cUUmeGVQQUJDQW15NGxtSF9NTSlKZ2tKN1U9NTJIJjxYbG1zaEBKeE1UPFU/am12ZntfCitGeDJ9VGwoQnA2OUJsMypta05GRSokOyhYVCZSdVpmdlNWYDxqZntfRngyfVRsKEJwNjlCMCgtYjhCUEdCe2Z7X0Z4KzU0IyV6YStzKmZ8CitVZC1pOUxaWSopeTF1VT9qbXZme19GeDJ9VGwoQnA2OUJsMyptYGFxN2h7TndBViZDQmFIIVBZNSohR3s/U0I1e3g3bU5pZFJOQio5MzZrCitwdj9OTWwkMm55WndePTJQTUh1ZnxiT2NCcDY5QmwzKm1rMnlGSSVORXZ1VDE0bjQhMnlIN3cyezRsRDl5azBGMiZqRmJCdj91OE5ySTZDCitCTUMrKDdAMSZYZntfVkU7RTQ4UmEweEVTPCYwYXdGUFVJdmZ8VXRZQ2lZfjRrcUpnNzdAMSZYZntfVkVDSyFROytaUmZKa3FKaVRAa0A0CitxenNDKSNjd1o8OVJ3bmlZSGUqezxOYGpGSU1rV31VVX1TPWsyfVVMdW5QNm1zayRMPSpRdChTQVNlYW1EZnxaRnFuUDd3JWR0V0ZDTWtXCit9VVV9Uz1rMn1VTHVuUDZtc2skTD0qUXQoU0FTYjsqXjdmTkRKQ0sjRHVXUCpfaU0mUiVFZz9vWEsyfVVMdW5QNm1zayRMPSpRdChTQVNiCis/UCZGcEIjXk5pYyV7eUR5WGtCTkwyRkZmemYmMVMxb1NPZldMUiRlajFNO2c/TFhHUXI5T0QtKE0lIU4+JDc2TzJxU0dRcjNNQmN3Qy1CCitLNj0+eEt1OFUlTmUoZFUkVmY7MHhKdXdFYlBld0JNWGN5RnRXaE4wd1c4SUVISlhiJE8wbl5qS0YqRFckPXQhI1Y9VzRXcjM5aVJ1PVhJCis3SWp9SjJ9YTBFNDRBQCFyJDZ4VTJPaj49IShVKG9XXzdJTm16MFdNdmNTcCREK3tiRj84eVFuZ2JlI2FOaWVkJiRPMG5eajRVdit6e21uCis0M3lpR2VtejBXTXZjU3AkRCt7YkY/OHlRbjN5ZHI8MF56JGFsbXNJU2o0VXYrenttbjQzeWlHZW16MFdNdmNTcCREK3tiRj48Tl9lekVCCitkM0VISlhiJE8wbl5qNFV2K3p7bW40M3lpRkpqfmpsOzB4SnV3RVU+YiRDa3U9JEZ0V2hOMHdXOElFSEpYYjJ6alNMJTR4dio0aFhSQW1mCitZakV7Z1ZBaDtnaWF4YXBfekptKkEzSUNLcE8+ajA5Mkp6RUdsMnFFTW54O2BrK0hodlUyNkxkaW5PTGRpPFdPMzZ5ZU8zNnllTzNCSy1ECitrVWw8RGtUfnY4WVBaalFnJTRMPnVyPjVseCZvMmx4Jm8ybHgmcGpsPGJ1MyteYldmUT0oSSVRPShKaV8kNmhCPEdiRVkkd0EzTSR3QTNNCiskd0EzTSR3QTNNJC0ldF9DNHYkYGlKKE1LO2BrLW9vSVE1RUxDSyhHUCU8YlBsdVN3e0M2a2cjJD5kJjFpS0lrUUF9TnVTSURTZGw7ck9uCisxUWdUdnFRZ1R2cVFnVHZxUWdUdnFRZ1UmeE1UdGQ7TVR0ZDtNVHZFZitoV2BuQl5NPlozTiZRRWF8TjdNS3hZTVhSKiojdElMO3U4N0clCispXlBDNmhkZ0RoSDwrYmBMMUA+N3NWM2xlRlNwe1ZwKiQ0fFhaSmB7P1U1VSYoLTUzdHt1bWo+WXdxfjN6bStYZU1kJUR1a3JJUWdrVmAmCis2OThpVnhEVEIwPV9+dkc4NUV0cXUwQEF+cT1DdGxeYjRnNT03U1khRldzS0J8fEtjUGN3aGUhNXNqRCNvVzB2dEd+IW1BSWkyeitjMmojCitKZXc7b2NxPXJIPGpAN0dIK156I0FxOUx0cWBoTUBBZ1lCe00xUz9TI1d2XlR2O0tLWXRCa2lZSn52ZFZ4PW9HUERFeWZVYitaakZDeGpwCitHZ01kdj4pbjF5IVFAbX0pUWczdUspcWZOWT13RHJWVTtkPz9UU1lRKTNqVDs+dW9TQCllUU1YWTk4KmJHRUo7XmB5flpHczwzMT5AfHkrCitBLUVlNmVrP01zWFVUfiVeN1R9OHx6VHhYJEZwbjJzUkQ2VUE2O3wkaWNOeWV5U2lCMCEkUDRHSTVZcSQrdGMjZXI0Qko3MTVKT1c1Z0QtCityc04tU0tscTdgRFR2TV9XPUtrTUNvTnlDNnQ9MEpnQUUtVmxnclpVS1hIS3RtSkFGTlFzMXVuRTtQbiMoezs/aiQ+PFY3VFJWUkVndnNaCisjKDd5TipmKFVmXjtYY0lxTnZ5bDYqWktgVTZ5ZzdxallaR30pRiUwVilASkVgKStnWVZuYi00ODZ6ITwtLVchWUVjfnt8ZHdreHp8R1VUCitycStUS2tnI3RzRj1hKCF0U2FUPTI4Izt5WVYpazhVIz5LV3JZVlglPCtPZFRFUyVAby1lRz83WWszcEEqYF9QN3BgbjJjcXpDcDdhPjRkCitIX289dE1QQVAqcHdYVDBoVnl1a3Rwc2U3OVBKPUNoPjhIN3FPZCQpNEN1OD9keXJwK157NjxHKUVuZSsyKVYxLVJYRHJDVnBMY3QzISFPCit7UUxwZXU8emU9U1RqUTJAQkhDJmF1SzY/cFpmPzc/RzQpaSo1TGN7ZWZpQXA9TE1qUjQwPXJlbk1pK2F2bnM5clZnS19xbnIoPj0lbEwkCitJJUtZNm08Qkp3IW9LRk8xbnVHUnEtXkleN1d4MSRib00mfnd4Q1cyMUpKYGxgYWM+bVhzKFg2SkVrQTJ1cjFAOCZgMy1+NFYxISs9RTJACiteMERtZUImZVMld0slMjlGQDg1WDJSRVNNbnpwXmtYZ2V5eDRLX3doeCMmbjl3JHlXbGslTk8yeGNYWEgpQCZwbXZhNTdBP25JVkxrWFVKCitvdj98dkVKPk1UcntEZzNBcGdGO0YxNmxDV20zOUZXYlk2SXUoKE1YaWpHMF5OUVc4bkNNY3FaMCpkcUt3a3BHZGY4TkJfWTJwb0xJK2ZPCiteKWw0fkt+bCtKSGhsI0k3Wi1WJVlHTUpgdFBuVFZjRTxyYlBSNmI/V1RiMGdNK15SWEE+VUheNXhAV315Y1YqaDBSUmZ8Q1Zodz96e3hECiteQ0pncih3Pj9Sb3MrbkF+e1V7TnhJTi0hUyZ+bE9wd1l2SzRyVDhNeCg4eTx6VzgwbHA9JXQ1P0FxMDZwX315e3hRLSNtTzZKfm1vMTc9CisjMClWa25LM3I8OFc2N05peTZ6cSRIUkM4R1pWdGY4bjIhVkBhaHhLbTFxeW9mKEgoTG1VRkskeTJBcnpMbyR+YWQtclVyPnNAZnNTd1NjCitSKFlhY0YhREV3KzMxeUMxZStRbFk7KDxXWEBnQSpvZHU+O2t6X0EtTmxtVFp1IU9NdlpaK2N4NEBUcTdiZVpSK3RYXldXQyFqRFdSPnlZCisoWjVOKnlvRlE8UlVfPTxSSkBiLSU1YVIhOVclPXpKLXslc08lenlFJV5GWnlaekxPejY3Vkxzel9fRGJQdHhTe3EhQlRyYjBWNHZLeGc9CitPQFc+LUQwQk1wY1E5YShxPWpAYGFwcUFrYFZ5MmtiPVZqK1ZifSpeO2ZmaCgtU3kmMzR1RDFPbW9VOEhhYV5lIUxxKjhSMC10ZjQ9dTN0CitJZmB6JT9eUX1UYm0qWl89ekZEWCo1O3VqXlk5O1ltO2xWcGVteTQ4MFZkWkcjMUtRKjA2IXotUXhZNFVERWY9fU9PRmF4ck1JQkJpdFFkCitzSDFAJi0yWDx0KT1NQ0ojPXh1UWNVV2NAQmtEZUp7QUEoU288TzlmcH0zQjk3RCpPPkcjd3RoSHFhcXFnenhxPUk9LVMjdEZ1TVBfSHRRCitSe0AtZ2NlTmhKQCUlZCFsNUlMQD4pVV91ZEYpPzlvdEUjfEBea0spRHRkNTspZF53X0NeMl93RGlNPW14UDVNNClnPW0zKFowRHloZDtjCit7cCh5JjxDIS05YEBFOyE0Y2NJQz0pelk9PDVxNiYzZDxBUVYxfEIqfW9SWSpSKXBgdiV4OGB6cmVSQ2FYZEJWUHdIJiFkcmM+JkJCfHpfCit5NlooPnFKe3hKcyhfPm1PMEhsbUZMRGFTWF5vfTBiUnlKaExOR1FSN08zWSFwakhAK0NednEkTkFYbSE+Jj9EZyQ0alMwaCteUXBGUzBeCit+KUpjSlZFPTk7TiVnSXlgXytTZ01vcF8yKy1gMmJSbEVRbDI7SzIqUnV1ZHdya2BLTERNbFo1bTRXTSpiPVQ9VVllNTs9dDdESX1OcHlrCisjdj9UK2NwVzN1aGNXM29hR1RYMnlzM1BnNFZoVTA+eHVQez8oWUN3NHE5Tz8yPHpvWSF+cDw9QFItNk9mekh+T2QmZkx3NSo3NTEqMksqCitpNng8QXcqdSRfTm94TlZSbWIlYXdUZFlUOVc9V0ZEUXVfRF9mZFA8YXs7cDtHSkU9SzY0TCgpc2Y4el9SaFUwPGkxUENlRWpeTDVlLXhqCitgY1k4cUkpSCYpOUAmb1FBSmFQaDcqQ1gyVDJrd1ZvfXN0MTw5bThEKUckKVdwdUluKWlDVGtgRUZGd1B0YGY9K013RD0oVlBwZ1VNRjAwCitBdk5Edkg7YytIeitPbSF3dDlSVDhyP09qP2JNNnpsfn1aNHZANjZ3O2h1JEBRNj0pTUZnPk5LLVImJEkyPk05WlNNcXdIcTYhRTBmfDlFCisoPyo4Mz1OeGdyTXAlRyN7R2ErT2xYMT9KMDMkIzw/NGkkJjIhRyZKQnZkQWViNnZmNFFScU55Sy18ZCZRWGBuKHgyXm40dGM1cEIlZFgxCit0eFlEQCp5U1ZAPV5lN3dSOHkpXkY3ZS0jMypmPDVYKl91OE9mM1NATHE0b2VRWXokTyVaMSo4dVp6UEp+QzF1UzdkNzZreGtvdU0+WG82CisweW1FbiZwPWNmYzkzZWp7O1NtPWVffTZaK3lKMHhzaylEJDJFcitAISNiVC1IbWhTfT4mLThpUSt8XmBmR0NaT3E9d2h8Vj5WZHNjTFlyCis3NSpeX0pZLStgUjxyOTI5RV5nd1k7IXlyfFBNQipCalckUk8tbipvfnw/eHh7O3xfQFloZH1mclNOS2FVdnNKRENYPmk8TiFyVnA9X3lWCit5e1BEM0ZTeT1mbTtfJV5APGNac0NrZ1l5MXNPbVFRKUp5TDNYY29RNityPyU3OzdWfGlLO05fLUZgYEolQnklPjt8dFV1d0hvbypqUmFACit5RmFabkh2aWJsZ1JgLUljdSN5VkNiUUpSTiUybk1mRFd9Un1SOGo1SkEhJmtORmImLXZkVWs7a0JwNHQoTDUwKTlge05XS1RQVFh2YmZ1Cit8eGB6NDVOZkQ7e1I9am1Ke0NyM3plbUdkPEMjMURmM1dNZG1HdHZKRTNuMjVoZko8e2d+enZ5MXVAanMwdHVfOXJ9ZzZAZmJVOU5CYVNZCis2Zi1qZ0s3PDNTZ29PWnAhNmFpdEA7TXdfbm1Ca3FScW1LYEIqMUAmJWh2U0B0VyZ5flpKOXVyYiZ0PDR5OE4qS3A0Tzl6SlFAJUhtP1orCitiXmtGRUsmeXJpOSZWViFqRkxrIV5+PjcrfE5NWSRSJGsmOEtvYkQ4NzhgdFVhUiVebE1EZDw4QUh9eEZLOVVpUGk1ZGJ1N2U8azNXSVElCiskSUJ7czsqY2dvNTBwPzB0RG0+c0xIQWwmTTJtN2AydG1YYSV2b2o+US1ZTHFBLWJ3S1NlKiR8KFJULTkqXzYzV2NgSGw8KitsRWJGVlA5CithWkVHWmQzZiktNEZqJXFmIWxjc35JOEpSQz1xc2RDQEZwR2QoMEExYkl5Z2kzZEk2YHBxYCMhKG55aV5TOHtCX2s3Xzd5QDVoMDh+djJhCisxbGNQI3Y2RmR7dDF5PjFAZUReRWB7dmNjZH40TU5yRnpfTEF6YSsjIz8+c0sxRzs2en5oPiUjeUhkS1owYXNie3xrPmpwWXFFRF9OYUs2CitFOVEqLSp3QEM+RX5KTEMxXjRTcXhifG1sUlpRZyR9S19JQGRoRHsrWSs8VU11c1dZRG44cjt6QlZvVGB7UjhvJWJ8RzdBeV8jKFJTa1J3Cis4UHZHVUFjdztYWC1gd1QzcismMFNlaXM9RT97TVJ9Mn1AMXI7KG4xIWMrPWtgPkR9Z3lEdUJMb2lleDtfPilWJGFrTUEzY2tZblImYlgoCit2fjZkQyl2bDxQRHBgOVFPS1UqOVJId0NeRVEjbjIwNHBsODMpa096d19ubD57fEtkOWJyRU5Oa2Beb15abEgqSDhyZEl6QX15bXBubUJLCislLWdnQzt5dD49RntnUSRmPkIxeyg1MSh9RFJDWD17WngyTzNmX1pscWtvOVkxSDhDI3FLNW1NIVV6WipgXjl8aT1NVFRfbyh9TD87TnVrCiskdC1XekE3eSQ9YlhePGJzTHVkZVZ3bTUjNUZ3U3xvRFdmUTRhelFtfHZ4ZnI9KjtZelh8QmEkal5RJkpkQXBuVnppTFR7RmJeTX4zKkdDCitIUDxSSi0qcSk7Qy1Ze3JqUz5TUitWPTFveUk1Vl9QbXdzeiRtKzJTK2tVKGh2Rm5KU15DMD8+S3gzRjUqTDF1MlRvJGx2NUtEMyp4O1R2CitRKlhzY2wyPGFMYm5QSm9HRGkzJEI2P2Z5NE88R3VoWElFWS0tVTxjODN4SDcoOHVOM1hidFhJPkx+XzwjK2ojTVF6P2ptKzFJQT13MiZZCiteJFZTRFFEIzZeOXdpNlFOMCZgbUd1PCEpVnlRa2xzS0N4dlZ8K1Z9Uy1iOWZnRSt0YChRJDR1Yy1AVSpNWEZmT29rYXRlNTdBbXR0PS1TCitRR3dhb1gjUnFkV2A+RE8jRkRaQndqcWQ1Rk8kJkB5QV5tYnFaSDdUQVJ2I3krNDJ2SiRoJCtidkxOcl9gN09zQnNyV01fNW5YWWV8SzZUCishMUlJQ0RhZ3olWDg9RlRwKlMoTjJ3d1o9e21PJjtFeyFTc15wSWVGZlM/KTdSMD4tYz5yNWxGN0hjPUEpMDE7VTsoUmY4XyQ8QUxKX1AmCitDXj4lO2chbVklTW4pKDdoSmFmKDc9dWJtTFE3aThFdEZLO3JSWTtrbE0lT2ZfKVRJIWotKGMpTCRjMUEySHdtY2wxUUYpJCl7PFRPaXF3CitZd0dPZ3h0aWp4RE1FellDWnN+UkdFM0RJcTd4TTk/cTUxenZ4fkk5bzU/amBydjx3XihCQ2loJkF8PDs+NU1SSTk8Z1YkfUdFeGYoa2I0CitWd0d4ISl6cktGa18ofHFvaFJ3eVA2ITxycTdAI2twQThxLWYrZlVZaGFaeDJmUEhEcm9mM2xoOzApYnNUfCV0TVFuO1pIQTl8VykhTSZ0CitlQ2B2MXJsSURATCk1e0BDeWI8P087LXVZdkhNLVpVTzI/akY8eW14PmlYSX5eIWFodjV3aCZubGQwR3M8OHpATUdST0lYemFkKVk9b2thCitJcUFwc2lYY19XcDc4NU8lTFk4a1VPSkNxMXd4SVlVcWY3OTx8b25QK1dhI1dlTXdfbEMhd1lscHx0MSNTQCF6ZmhnN0kjS0VweWFzOTtuCisjNlZjR29zJE8tWCVSVml+TW1LQG5vVCtiXmxaZlhQNCpxZGtxV0J7aVktaVU3Yyk+THl8V2RRJihYNmdefShLbnIpY2BNI1JeQ0dhcWs1CitINkdpJHJubnxpelQqVDtWKCRkK1J4QXVvT1pudG1JS3h5WTFsa0Y/Q3g+ZmVvMyVCQFdTPUhQV31MZzZKRFZxTVFsaEJpfEhsQUluQ0FRCitWJG9QOEAoMn5eKWs1QEJgXmd0cGJneEIqMGdLJHlHXlZfcT1LQkYxQSElWXtmJm4kZihlP1ktYGJQNHJPYnliMjxoZ2tiYmd4eXExNFVkCituej1SfCQlRmZZWTZtJTtVNHk4UHRqbmNlUVktYSVtRDd2P2hRdGlnV2JmMio2I1Z9UkpxcnZERUMpZmNTUGFfTE9WfkRmaC1CPjhgcDNkCitxNiMwQk5xKkhPe0VVZnJGYF5ofFQ2dlA7akQpMER2cHJ5cSs5TCVgSDJNbitaQk85P2tkSkYmPUlUNXF1Yj9abCReQzN5ZGBoWXR0SlhnCitmNUsoeCV1clJfbDk4eExWMj4kWiEpcS18LXV8KkF8OTIkTjNAemZKPlFmIyNWM05DNEJMZUZpMjtoajU3N0xYKTVCbjB7MiFQSCpiWFF3CitXPDVaa2R8dGN4dWplNGZ2YEw3cGAqYDlrIyZ+Xjd8YE51bWBWO0goaHVpeiRGYjtNTmsoRik5MnRJa1hlWUw3ZmpDYDBHNGUzeGFGWkMzCitQTVQ3NUB4fnA7NXhlVHlrNnpLZTdQQ21eR1RGYVZGc3t7KjF5Pm8paWlIT3ttTVhRZFdUVVRYQ2BKJXhfVTFTbjxKZXp4dVNHOGR4MXY7CitZUVYqTWVDcWRXQjg/bVl1d282cWEwdjsxOGlzdkczO25yMkRAfnZ+TT13M184U2BgeilxJmpydjM8UGw/Tz5IODlGMz0ocy1GOD13VFd5CitaeyUzOyl+P3xqQSQtUm9zbU1pYkBPdnFseTMtRGpGTz5AMEZmY2BxWWlPaH55Q3tySmhTbW9Ra0BJUWdOOT8pNUBmUiRQenlTNENrS2w4CitHbXVySjBBNlYpSjBaNlJ1JUVlRGNAV1VzZmRkTC1ySExIZ3ZCdyt8RkpNaDRmP2kwYVZhNTVyWF4oMkVVP2FXNSptNSEycHZtaEQ/Zz1QCitvOGF3azVleXYzMz0xdjJJYn5uUlBjajN0UC11MUlROE57Q0p4cSN3cHAhIzdgdGJpREZjIVhSaldrM0BGbTJJI1VWYWhkRl9YeDkwNX5wCitIcEZCZzY5TEQrO2Y2Snd2QCllYj9DRGBGYis/eTE0bm48YW9FKEc/TUFzQH5kNjx4cmlDfnEwe1J0RUQofGo3dnIqUmUhPzZZUk0+JX1pCisyaDBAP3twbHcrdzg1el8yP0N1SEdIRm1lIzdARzxmdnpsTzk7dkh3aHR3VXFwXn0/NGR2I3w3S0pyV3o+akFNdzd8OGZxKGl9aUJTamM2CitpRiRZV1dUJHVETyNycGVnJEJMWF8oME08NyVAVkd7MSlhNTdmS2B2QStSWHI3ZzdMPEUlYilNYXo0dW1QcCVyakd1SypXMDRDdFVSfjNECitfYE88IW1+fEcmQjxoKnNrVyZ4S0x8S1gpMWlsPHUtRWpQQXB7Mk9+fStzOXRXZGNraSEtaEctNCN5RXgzbF5RVn00RERJQShOUVhHMC0lCis5SSNZZ2l7Nm5wKnRuMTdyckZWaTQtakghKSFsdmleR0U8KlZiIXRUJWIteXkre3NuM0IzI2E3ZGg7c008Z3JyKUZuRHk2d1NZeEwzTj8oCitXe3Ukb3RCZyQzTUoxeW4rNGZOQiFaVn45WVFvUVR3LT4mSWd6WklJdShKS0t0NjlRX1o8O3M2N3pLT01Kbm4pT3p1X3dzRHtxb3dNJGMyCisoIXMlYWh1U0ZsNGxNUkFQZytyKUNNalhgS1NzfkokKXhnUzBXVzUrYSk8SlopdCh0bDFjZklDdUxNeyspTEkkJFFiZ1NCZF9uZi0+RU8kCitIdSswdHN4TXQqNVpueEI0UHR2UFdheVd9PD13M0VpXiN9Qyl3Pklze3htVG9iYjwzQDI3SzlCSlRYOSNQKkJSSipzUFhENU50Pkx0U2RYCitTVj92emQrenZBQmdLMDtfbkdTQkFOTXhQMEpqXmRsZ3ZJMXpWeUBrYGh2YzxCb3Y/V15ROzMoczhHWGkkcDJmP0tNKW88MUlTZGhVV0ZoCis+SUV1UjI9RGM+ZkxAeG43P0hlWS1zNSZNeTNqOWpXJXArVl4zT1Q4TGR1aGU2ZG9jVjdoKElCMT0hIzw1elBVM1VSbUdncStmJWtSel9HCispZjJAQ0E3KWM9OC1sezRrI1heKzxJaVVWSnxfKyF4WmlSMkd7Pih+PkZmZE8pI2FRRyM0PThqX3J0YGFBfmRgd21tcUxQWEIweSo2KnR0CisyekojM3t3VkI9QEx8MH5WQGwhZFlxdkg1PypJc2xUeS01T044ZXNiQzVgZ05Sb2JOfFordDlyPnZYeGNkUTlxSDh0WU1DV2RZZWNaZEktCitkcDx9Y3Q4aXk9U0JoSEklVyFHeDMoMlErbEE3WWxvfTxadnN4aUQtYlJZMlhldTZoTC02Z09Dc2xQckI7ckNrSTNkaVBMTXdJVHdYUFdvCitXTlZ2dW1GbWpoLTUmbnRwKWlAOCFAI3UoK1l4JVQ8XlhGMVBCKmhTdVFqMmx4XmE7K04/JiFvUkNxc0Y7NHkxLUIjI2ZVMnxWViN4VTdfCitofTIpJHlzQGIkPzszank8V18+Zj9sfHc4Unsldl4+TF9wR2ImNzZHZTg2eCY3anZAbHhgSyNFMislX1UpfTJRcVorIWBMZGsqJCl7SjttCit2M2pWMUl5bX0pZVYrU0NuTzRNKW13WHRgYnNOWHtrbikhajlQYHdSPyR0REw+SThRUUFwVjdZRiFDRUZ4WnlSTHlnaW07eH1Ed3duMjQwCis2MnFnWFRfRGomY3dzfH1YMEIrPkRCJmN6RTckWldiRzdQN3gjM0Ekcj4rOGV1SDZNVSFLLXlqTnAyejUzRll8Qmd5RGR3biRBfSVRZzdACitZVExgV0dmUkE7NVRDRXZVWj55PDVHUzMpVks5ZDVnaD96TmdjTTNfKCYlYktOUV91WnZSKm5aPElncmM7Tm9kVjVWKVdoZiV0MDIpfXAwCit9U2t0RXFjRUVOV3NUUjhAelEpWUNvV2AqaWRhREtWfE5JQT1XeVdHVkQmKCR9ezReYUh4ci1lZkZPOFRBNlhTWTNIZl4yYWRxNn5laWFnCiskUCpjJmNrKXd7RDZGfCohQVgkSUx+PVp6fnJlR1BvcWpsOUxJJXZMbmxkMDlzQn1MT2dnRjZ3dj5FOVk8Y3oqVHdWMVBzPF91VGJnJChzCis+YDgxMWc5OURXKENuOHkmS0k3ckN0YXshREFiMUwydGBDQC1RKjtZcm5iazQzbWR4RUxheUxhcypHOz5RY0BmYDlUVj1yIzlWakxhRnRMCitLVmE5aiYoditTRz1QQ2lwP1dkeDlFcFRPNVlTJUdmTikodStFdTlUbSpzbEMlM1N0NnNsPW9gVldPMXQhVTE0fFFMRVdwd3gzMFozcWBWCitEa3cmc3g/dmNCd21zPjZlTSF2NWxzantNMnNVdUtvMD5ePE1teSV4NUcpTTxjZV9Rb3Q+WG1HTGhNX3trPTUrN2M5ZiM+ODVsWTJfOG07CitsdzNfKzJrfm9hSURNYHZ+WXIwNXl+VWoycUJfSlplfmxXXmY5cClzezNqK2M3LUlqVTlueS0xOFhTWWdzRHpHJXFeNTF+eDh0NytoQkM0Cit4UUY7RkUyUlIhYTcqYklMUThKeUgkVGI/KjgzPU50PyZAYitua1hFXlYkYWxlM0FjcXk/NVJSbileSzFOUVg5c2ppKiZOR2R0dWdFTXVuCitSU0hpWmp9dWtFZHNSTStiZiY5YFEwXnp8O3FEQj0rVE50dG9hKnVmM0l5LTw3flNoTm9YMHAkSV9RVzY+TnR2TTdqXzhgTyVycGFTc1EjCitgbUJQZ0luO1coSj8pWEM4PnlwTzdZezRFQGdEQXZBV0Q5X1RkM09uRkIkO2YmNVl5ektKMilAT2MxYEg2bFllWEtVYnwtaTRzOEwqa1dpCittUzcwZD5GQWpPPkpyMTBJNEsjKiswVERnRj9GP343RGBpQWJjentJd3Q5el90VD47bWZlKWVTMU0pNl5AfnpFbX4lIzZCVXwyb1U2T3NCCisjPj1RQTc4N09+cXdNOGEmVTdBaTJXUFNOTlJANHw2UmVCVzFBcWY8clVKcEhrV35RfHl+NU0tUzdgeSV5NWQ/SERFbGM8NCVuRG1kc305CitaMSlkK0psbGpDc3BWUEtUWj1EUHg3RUF1aC1ETVVlaHNeJTAjKjBpRGwkYytoSSVyX1NGNSolfmkoNykqJmQmMHZfOU50e304K017bV5CCit5fj5US0FrbTkra0JvPWxBZmRsSj8jTVdqVTFhVHtLK3BhPHZ3PytWKiEhK21yQGQyc2lRKUFfcmNtbV40S1M9Nl5hdnxoSFFMc25DM0xICisoYU4wWn45O1RuPjc/MUFXcmBEJFhha09IcjE5e0ZfdmliTnNEbmRlSU53JEV7b2J6ZXdFeipKK3QyKipaRkY/eVotX1g1WSVEISgmNVZZCit5PipQWGNmbX5JViMkZTVuMDFlZkhyWlo7Wm9nKUhQRHp0aXUyTmNFR2xGOTJZPXpTdytSMllaXlFmIS18MjxSMXEmeEJ9QmVsVk9hcTE7CitecGM8MClTPG1EMXx5KGJRI0hUZCl5KFZJU35WdEU/UlhkX0NITXJCIWZCNX4lNWtBNi1SNV9nV3ZTWCEqeygoQEJNeikxMy1wRitSZ1ZhCitnQkQ1ZnUxa2BGeUZGX1RSWntzJTtUa0JxSEN7KU8lMSVLeSU3NWw0QWg2PzdKOGU4SG5OdkVaWSY+PTglK2hTPVV0N0hjVmRlS0pQZVZ6CitwK0FZZ3U0R1UtTypQaj8pYUU3I15YU2NeOyFLbDMjLUsmO3BlQlZHbDVOemhVdmljd0NePiRtWSZIKUd0aGZ5Sk5BbiNIOElBPmo5aX1JCitreShvRH4kfk41ZzRCYWN5RVJVdnNNPC1hQmd+RDg7Wk1SNnNkI1hhakFSUVclQVFfYkApMzFmODtCfmhielhaT296fDEkLUEpYG1SSndxCiswXkJJKlMrKlAkWVJyPW5GNGx0Y14pRU1gfG9EMUMoVmtiUDdiTEc/eXpGdkZuVTZjd3piPXt1QUs3bz0zZElWdFhTKF4rMDdWeWR9Um5hCitYelIjVj9fYllRfEctMWRjI0VFR201eXNeclhrdTwkNXt6KjAwSylFQFJabyZAcGNIUCY3NF9EaWFwJGVZJCZySDU7fVFoVjF0UUp8Kn1iCitIV0N2U3x5aS1vcipqb0diKkBzSGVLQi1TWiRzeWN2Izx1RCtmbn01dDVPUUVrfG1rSCpaNDlZMF56MnhMciM8SWBCQ0RQRGw0ej8wWTFuCis0ZWVpZCVhXzZuNjhGX0RaRHZyRipIJHlMKShjNW1PIWc4VnFlZzEmQEJ8JipZZUFBemheYXojbkF2TWM8SUJBX1JxamhKe35ffTZUQmZlCitBRz4yTCZBKlAkWFBRNDNXU3ZIfVhsfkpGbmlxPFdRYGNjXldyUnZORnY0TT1MeiYzN0RFemJQOF5KR1otdyo2SUBBYSYqajVsUHNpWUchCisjZms+P3VYbWNCNUolOUBeJXotaj8tVTB7Kk4oWiRvMz5+Qz9XNnBPTmNEcit5U1MoV1pxbzRrJXxyc3dXYWdXfTlRSStGPFk1S15KdGBeCitrRFNrOF9lZ1NiKnhuPyh2bV42T3lvZEx6VkAjPWRqc2ItayMqYFAhKFhrMXorJlEtVG1sWjhFMj4zSmFaUHFBRXJrITYwVj9mP3IhLXFICitWRDtJIzIyQjs2UUZ3Vj1zRXdhN3hnOHxyZDtRVjJIVVpKP29QbEt1ek5+ZmBuNFBfalQtKjlRTGEpMzhkaFd+YGB1cG41Pk5PJmZgZkVuCitsX0pHRVJUfm56amRDKihmdlFKZ1hLX1F6UCQrWDQxNllAJWY5VTk1bmB0WX4+blgwbnJYfTR1Mk4mODZNY3w+VU8lKUdud0IyNXpVKypsCitfTVhxdHp5Wnc/WFg7RD0jODRKci08RnUyRlpiTVUrK0FiTWhMWlBCYzQmJVB1aTBYO2NqUVBwR2IjJC1RVjRWYkxTS3BfPGdXfDltViE4CitpOHJTcyEoejMhez8jQjFGaiRESURzJVVYQjZfJEJQfnNmMyNLWT5ZQEg0RlVsQ0ZoKGl1I3AtdWJDb0dnQ0JVXkV3azt6RStRNXtgO19xCis8bXV7WTMhWm1HYFRpTWJUOCkoXkZZfVk4c0wlJVkoY3AoY2VfeT5pcypEJUF4YSktU05DdkJxUG5PUThMb2dGaChsPSNPV2orUDB3bihMCitQWmx0Z1VldFU2djtVPz1qeTIhLURePk1YcFJ6LVE7c3txKTlaNG5ScmdkK3JLeHkhTUZrXjdUJE80aFN9NmRrLVJJZWA9VlpxJUVQJHF+Cis+eHJNI0xQLWJVKih2YT40a0hOYHZwbSZLQmx0aTFkNU0xcXtAfjI+VWVST34ka002O21jWF4/NGR8a3BvQE1ffiFIYk98VF5RYUZYWEU1CisxNGRNKlE/fHdqRSFrWElQYXlaX1JXeD9nZj1tekRIPiF1c0p4aXRjXnFIbzJQKVRabndsK1ZlZ3g0WWgkKlkobHNtK3dEIyNOfGh5e3BJCis9SGswMVdiJUstbEx7UUIqYF5QWSZleXg4RCtfMiRGI3lYWEJvLW12aF5eTX5pSkoodkZiQUtyY2NfV2tveVJtY3ZuKjN5bEdXRX1fYGltCitGU2BVTVNpWmp2IzwyMndiKG1pLT0rPHdUTX5OMUZ3Nks2c2QzbzBpSG5NdklSSHwxUkg/YDMtYVppSDdFIzNme2I1fmF0TH1PQVRmZTlLCitBMSZPWnpGP3ZIYnwla1FDQmVkZmomRlAmO144MG1ATE5XND5BVHBBUkZ4SjRNZH1YM15BazsqajU8I3JvV0RPSGR2PkYpTSZ1NTJhWm53CitfK1pFYkYtTmRjSDRxKk0/MURnYHV7JUZsTTFsLXFLIzdNKEIyKHtuWlVUYjQ8Q3o4X1N9MW9TY049Nj07KyNlNXkqUnw4cy15XytpYVZfCit0OW09fVpeNSRKe0N5Qj9OfDc4eSU3QUhPa29iSz5eZFJWYH1WK2RkcVJUWWcoc0JDSDIyIUJWMEBFbCYjNXpxRitWfjRmRHhIZytsO0VoCit7JGJ+U0pzMkN+JEsmYTU+ek8jeE8ya1UkZ2ApZTZwRzhYZlUkYXw2VVc2c3luZC1GYXFDKntJVChGNiFXezh0RzN2IT1IRi1vRGZsVWt+CitTVWpZI1VPYzxXUjcjS31NIUNPUUxHOztrYyVWTG9IeGhiR1U3WkJtbzslSXtOVWFuKFFPTz9CfiRmPkY/PTVwTUZ7Zz9NUzxZYTZ0LWBRCit2ISVCcUl6NkUkQlJefXY7dkVyTyk/JHZZPWFOJj8kMCpLaj9vVmZJZUB9eEx5UyE4QEhYZm5XVj9oSTNoNSV3RmthPTUkUXwpKXB2ZWdxCitsaCVZMl5Bajtya2lxWHcwNHxMVEpxWCQwQCE8JW44dVVjcU5lQkMlcUNNXzxnQ0xOOEwtRz43NH0hJl47bXQmSTNYYDtmVEx9X3RLXkNtCitsQmFgK3NPZ0NBbztrTWorVUxjK2dpMVVzaEM3QFVYOXgkNFVzNjhjdUM/b0tzSk13XipDdkh6WjgoZVQ4cnI2XilNO3pBPyZxaX4xTC0lCis3VUh+MFdrUC0/QnFAWD1NZWZOYkxtU3hWMjRJcFQ5aCNHUEJ+MWcqVHBWJUxsOWZHIUV3N1d9fj1FYmdBRGZvflJnYTIqfDFDbSRFaFVjCisjNi1CRnpQc2BMXnowNGVATD1DanVrMDFlUHMjQmpCXylJPlFIVnspPCl1MXZ0ZGNaME9RX2hBPytoMFU3X1U3bStLYFojMWghVTYybD1FCitoaitfOVR4N31oM3gzKlRSd2J7Wm9TLWZTb3opRiFNSTgxcnIlWSohfUU0cUhQRHNSQkU4VmIoek4zRUxJcGdtaHopUXNjRnw0KmJvVmRMCis0SEApYTZvYjBwRDw+UDs3PSYjbk9DdlhfR004c2kyPD9McHA1YDJqMDI1ZDVkVTA7QjFAKG1aciZucFRGU2Z1OD5DOGlRU0lqX3owX2B3Cis/ZnJIOzVzWERycz0xQ1Vxa1IkWmw/Z3ZmfSFmJE4mI2V3Ryhjb1UpZCN5V1FzQlYrKSY5c15jNEdfUSlJdjdMZTA/MEY5OT0hJDEpUiQlCitvUzdCKTBzJkJzbXViZkwhaE9qflhzJWZDIVJJTlkkfGtpeENxXzYrZkNTQnAxbzAhRERVckFkQyVRKmEoMD5fZTF7IT1ZMCFSankqZGJwCitMVnUwe3IkbzxhOT9vK3dzfDM3ZyZOS29nNiNeI3tJNWI1N31eQWhAKDEhPk5mZG11RW4+YHcwOEZjQXs3OzE5S2dfOzFlVH5fakM+O2s+CitxfD4jMUxRYkBmPTttNTY/N1MtM15fcTtSI3xzQEBrXlF5I1FTUFU5RVBEdUlgMSpzUD1DPWhZTDJSSCk5U0xjNjk0dG9HK18xYiEtK2ZNCisqKjFNJiF0aTVDWVg2cGgoJngpbilqekc9WitHUHdxITdkb28qbWlHcD5HfVdZKitXPD1Abj9eMHdIQ24yUSZSZ1pZYTgxVlNHZGQ8b05xCitSdFEmKyZmd3ZzcHAhSHNkNVlLazlsMG1vYFh5Wkd2ZTwlWllTMS1ZRWMrYGVkNGJePVo0OCEjV0pZNWpHTUwmSWg8XnwlfUsmfXk4ZjE0CitSWDI7OWlwMS1xVUM/TG5hRGlFZmdCP3VLfm0+OT1sPyRJeXxGaXs5PmomQFlpOG9fPEg4bmFwVEkxSl5tYWZiQUJkYSZPMiZpRlVKdndHCitxfVZBRzY9fUIycXlDLTRITl9gVj9rdzJMKzlkdGJzSjh0RDd9MyhONFhyRnZIMyo3ZTEwZHpSM35Bdi1Ra004WiQmS1AwOyFCTUlmZEdGCit9TkNYVDxfP0xMdXxoSzJAcGkyLTV6KG5oLVloJmEjIT8+N0RZJUZlS0Q5PmxeQDhrSjNMWmI9VSk1XjVUYHdAeVM2O0k8TT5nQ1hGRG5UCistVnttIVFebW9FaCNNP2NMKHZpNCZnMUFiMn5GdGwpLV87X3dUN2piKnJ0YEE+U2FeVTUoTzk8dz4wVGxWekkqNksqd1hCeE0wSlp3UnMwCitkbUNET0d6NkRVO0JvWDQtVT44a3YxejdyY0VPSUQ2YFQtanJIcCU8JkFPUyt+QVEldEEjP2E5O2MhNEpHKzMpX3tlbzElRW8mI2xVIW44CiteeFEtbWpNUE9obEVkJElXIzNIUCVqdVpmZDkhdlJSNGNuOENYWFFLO1VtM25wKkYlP1JSZlA5WkdKUkVXRnpjanM4PFklLTUhdlNSd3tUCisja081WUw5WXRlMG1tYmZLXng1O2B1fSt9VE83MXZfOEBfT3JYdTlEWFFScWVJPlIweTtSRUVLRjVWRk1iS0N6KDZfP05YRyk9Rig2YHNOCitIQEBBMX5VNiMqSGV0TTRxQEVzRyVgJkFaeVYlXmRtaSM+QWZEfitOfTxPKUhuSUREOWk/TVVTdT0pMV9LX2BhSis8cmw4RjBDdD9Ce2xNCitHaVc5NWRodHVmRE08cjQ8dE9EUChle3hsQDh0ND4kaEBIazNuWkZkVXl2a3RrYXo3UXg1SGc3PEF+c1Mxc1I5cEBWRlFudmBwY1NTayopCitqRkBZUT5OY3NpMnhgMD4/TmExaj1zajMrRVlsVkB+SUNoNnVXYk83Y2w2c05ETEZ1OzBMZXlhd1V9TU9wY2xUOXdvaXRuPlJ8KFNSRj9gCitAN1BVYU9eZG1pZns7OUNyRD9CaWs7QXBjdn5VWihLeUVoQE5jdGB7REhHU3R8Wns9fGdiPmt4MHArVT49YEB6NH1EUnJZQFQyZ3ZrY2hfCisoMzRpZjlwJlY+cWA1czY5OHReUlhaOWFZSD1ZKEdIUn0tb05zdE1+O1cxPC1lSEd1NmMqYiFpJEFsND9NYX43UHEzNGhjOUpEJEVqRHAjCitQJCt3S0B8cF5UKEZtYEdSckZEUGRvajR6VTVGVTBneWZqVkBVPyRwYDdFOF50PjJyX2sqNGFZc3Y1cDJUT0Q4PytJUihQRGZBJiYhRDJ2CitVMHYrcVFVayhqLU4rakRlaCVCPXJCYylqLU1FfmBSSyklQFc2K19tbEdhQjU1KUhadSQ8LWFUU2ZISGh1SmNNdykpNHttRHhoNjJ5RWFHCisrcXV0PkxGc3w7fU5kTDREeStwVz9qKz07SWBxfmFNaDshIU97ZVhEM2JAdikrdl42O2REKDVVYnstdSZhP31BaVpKQkpZQj99U0taQFhpCitUP3UmPyojeXJGbSZCaXspNChmO0RhO2NkQi00SHBWN3NwRjt1bzNxPFZHKnRnJkBkUkQmSWdsfWskNmM/N3Z0ZVcwTTloQWclOHJMWDYlCit0QmIrOyFpeitAfmJsamA2PUNuO1g8YTY/Pl9USkJKK2I0d3Q5cUcqbzxqMHVAalRjXk9iUGZvYGdpI0VZO3E3PFNnSGUodnc8RyEjZkpOCitBUyFHI0lzJE9PSEJiWllCUHU8aDFpZHo5JXElQFRTYzReRnoqM3Q5WjwweVBweS0qND1CKn5fXkRuRmpTY04yX3RiV1QqM25IaGlweyNVCis7bVNfNHIqeDNVbEVjRzEwXzxVYTNHJTJNZjBCMiYmPHtLeHsqTEZET31taygyYDg9TkN4JmhxdDZ4e3MrbSlHbTctSUZ1Uio0VUcqM0lGCitldjd2TG8+PWtVJVp5cVdsZjlzKGBhRW5jRGsqKjRsUURDIUJnZWYpKkUhJSkxNCp4SXwmK0BCNHRJJSlgbmdTKCRQWVJWVW9RUU9nRUh9CisqVF56fWZick9yN0I1NUh3ZWlNIXRJbSRaSXZFWkY9MzE0fTErU30mPXNBZ20yVmJpKkl4NiVyfFRNOE9kYmlAa2FMOXAyJFdsR0w5SDckCis/R0BOfWRWfT5qQSlWVHZVJWE7UmAmazVYOEQpa1hMQUk7eSEkVGN4V3RYXmRMSk1XV2dkRngzRG8+bHZvZjlnbVVlfSg5eX1NMGQqfTs/CitvWHI3PURndmR1XzY0QFMhcSo2bWxiaENBS2JeYVM7V3t7VH1aIT4kJjs3RTA9OWIzVzVseWZzI3JFSV5wQjx9QEgycDdjdXo9fT1PPXopCit5LVp3T29qNGNRbiZhO3ZvKD1RTDJtWT5hTEsyNHpMTUo0MlV9LWB8PGA2SHFlNlROfXMwYUdHOHBoPH4/Z3p4UFAjUGllOz5Ib3I5K05WCitjYjFAVm00aFd9T3kzeG1ANzB5cmk3RG8pYHF+X3NFYyk3fGBLejlVME1qUUBmaWVMWXZVWUg5NHRBTmREZEk2OVNhTUUxLS1RPmFAJkwoCitrUXVDbldlQ2NgVFdCS3opRWVHYUQjYkZtNzMhcXU3fW5GdVdpaCRENW5OWFROSjtgR0J3K1ZGQX0+Wk1CRER8NFojJmA9MnApVjQ3bGt4Cis4NmIhZjNAWW53SD07PU89V19OckRXO3ZqJjJZU1JwT0s+ZUBafStBeEEocG5DezVFQHp8OzhJQk5aWiNTbypPUU1eZE0rREV5UmQjekZ3Cis9PSF7N28tJWtfdzxlYlZqa24yMkh0N3RlNDUlZmE9YEVGOT0pQzhabSlqSF43O0khTWc/IXl7PjRlYzh3d251WmRqYG1nVnp3T19gJmtyCitGaXFpX2RuY0wzSVclX3FLPnBzUShsLTFrIXl8bnJId3dANUV4JlcxbjVMPGxiUSZnaj9zMSMwWiNYViskVlMjMGVvdWVWIWVYJkhzcExvCis8OTJAfUxPRT9pZXFsNjxrOW1fSz41WUdsUHdRYDZ+RmtPU2ArNmozKCtVbzlVPCE2RjF0JlFoRlZmT0BjdW9yK1cwN35USGNYK3dWdUdjCitRJFM9QHFwZFlVUWhHa0VzLVh9Km9kbCtufkM8JXpKUDhQbk5fYHo0O2RUeEkqISlJcFdxcXRwM21AUHFEVG98PERPcVF8TEFveHVwVD5oCitUNEBeOTBqYXJUWmxoeWo8bGVAU0g7KlI9KG1tTTVeZnRrMDMzWW5HRWdfWlctPnI7bnM1Iyh6M01WLTFeYEZAb1k/MChjdXBXQ2N6SUlWCittZlVMNm1AfGJxZCM7cDA2UGk0O01rTi1RflNlaiZ1OTB6IUl3LW82TlZwQ0NHTnlTPWIteTE/Z1UteU13RkBSMEFOWCkkMnB2SCswKj53CitqPFhRWTJITD9PaHVufTd3dWhwLTtqYSk1NjhAPUxnT0x1QGR3dUdwNWdeY2cle1E9aUFMUV8heWorRVA/TTVFRl8pfkFBaD1HO2FrIWsqCittMjc8R3g3dk8yOSVuKjNtdTkyRVkxa2NNPWNEPE1sU2NndGVjUXNGWHIpRTBjJTshbkB1R15BPmE3MndUczxEUzQ0aygxKD9mKVg0P1RrCitedEokMn0kS0hXeVolITZAaTFZaU9DNkh7PiR2bUNsNys7U3IkdVViSmB6Vz54LUA7TFpNeWBQZG5EPXAtYHUqNTlYOTE8Nn0+WSlZJWMhCitXLXs0KCM7UzF8RGFWN2NXPUFrRD9CbzI8JjcoQVBQVUBgMj1BNEd+Q2VIYTZZMy07czZqQS12OGNvJkM2QUd8Nip1QlVhdWtfWXMxayFGCitAMXFIO2NfKzM4aCVTUitURGFQUTt5Nk0qcXo1NkEwd1hhYFZWWXFaSDZiKSszdXtJNHh7emJLPG9+UT10ZlE+UCRmMXE4M2VlaytQfUJ8CitpK0h3JVVGJHBaYTI7VF5vNWoteHZZX0UlY05vM1VjVis0WCFDYDB5UTQwclJsM3dxKTViPG5HJT9sT19pQjR5TjEkITFfaTgkY0FHKi07CitGPCQpM0QzPzJNd3w0I25aeCFtb0FGTDVXYW5eRDhwNkVtJDRpQnVyamh+Mn1UXz1mR2lOJnA+cUFlVntkVTltZkUxNnQqLWNsI3lYX2R6CitVQTRqN0lnZGhYI3M1JnNYcjwqdmh1PXgoenl4V2ZQPzVINUNTe3s1MVk7aTBpQ05gYVVvbHZBWHk0UGYxSj1nMEVFT201P3JDWEVSPmtkCis4Jl5EcVo4R3JzJDx9bT5lJXgrNEhSI2gwdDVKeWxTKT9xczQ9RmVAeyokeWd3Yzk0WT5fOFgheFEta2xGaD1sI0d8RkpYT3kqKTBieC1SCitgX3kqPCF6ZEJDO0ctNVM5MklLLXheQz9icXJXbjxGSiQqLTI1NWgrM3ApI1ZOdHU1NE83Kz9LYGM4K2FXZDlKU3R3R35GNThNY0VqWTB4CitJUV4/QD0rQDBnQSlmNz8zUCptdE9VeG98aXNmLTY0IVpgbGBeQHdid29DbipzOWwwYmJMQWIqPH4mfW1MY0lkT3dAVDZrQ2V5TjhtPXtaCitBVUBrbCpKVmxwZGp+UX1yUiNnQHkjUDllR0BvY35WSGFCdzA3QV5hWUI/eGpPbVVhc0kqcjs0QzMzWUVuU0txUDhFeG5DND4tZzI3Y295Cis/UUNXREkkcHB+bWxiLUJVTip1VWFlUCN7YzUyTl5AQjFaRFpHQ20hUEVEIWFZdTRgPzd9bVh2JGZrZHRLJlFvPSFZRUoqdT9JWnslVU98CitRQGxxblM4Mztub2tvIV4+NmhgelZoMDU1d0h4UWV2SVlzMWhkJD9tdUFiMH1lM1k/X3hQX18ldWN1a1NsIzJ5VXhwMWM2KFhHcjZvOV9KCismQjYqVlZ0d2FEMlk2aXB0Qj5rTnk1SzAjRk1iJjZwPHV5WHN+djlafUpLY2pmRH5Fek0ldT1FJUQ5TTRXQUFWYWM+TGZGPFhpN0hrK2ltCitieyRQbW1tdEVmX3h0NUN5aiozRW9CNy1HRzclIXg8cnJ9WDZWWkR0XlB6N1FqLVlmOG91KHlMdjlMUWlAZWxKKz90YSpRTnFYPzA+MEIyCitAX3txZV9PRlNfNHJTTENyISRrQzteN0FKKnRiRDY7bD1SNSlxajxUPndoc1dIK2RZKlZTOS04Z3VWZ3s8R3RpeE9HTShsdD05fllyNyhJCis4Nm1zK1BAXmQmNTRvdF52bkZhfHRxRTxZdmdhe0gpNkR7RWZUZ1BsITFkMHQ5XjNXcF8jXlBWWiZQcmRMWk5NWDghcGprcSk3UU9sZ2hsCitsc0ZIam1zX1YmaVQ2M0JaIX5XR3JQc1hXYUZ8bXcwRnY8WEJBKWY1cnRyYW4yQ1ZPaG5+KHIlRD1WQDFJN34ofWFEKW9jMkI2NVlJTU1KCitDSEh5O2I7JXRLb1FwJjZuKHIjd3stZmwpN19uQz12M1kqMjlZd24hP0N9cC0hPmpaKHg4c1BtPTF+JGljNlUlUlN4UXE4d3Bwc01MKmF8Cit6bzV6P1RGJHMzbz13ajUmNCtNZWM7ZnNFbz1IZjsqeV5EPyZWaTE4T004UFZnWjJqWDJLU0c8LXRDdjxMJTwzQCFJbWBEYnUoPEJ7WXkjCitQV2BFZ0JubjR3YSEtV0EmPTR+R2smbkQtMkJxdXBeSD84Nj5DMGorKVU2bEJFYEVXKnd2cXxPV0NzZ2tGYDFiemZjU2smblVUeFJRZ2srCiszYmFmX3pZNn0hcmlhVmAtcHFDPWJTa20yRW89Y348R2Z8IXdweXVXcFdEOFpoM2NOPVRheih0RHxFbjJpXyhWfDZUd3pXJUtvbipPNW1XCitwYVpsTXAmVld9PVNvXn41Y3Fjb3lrRkl0U1JHbCpRMT1xJSlKMHZvKHswUENLaCMzKms+VjJqWkd6JlBpWCUkcnBMUWJQMXU9dyhDQzJxCitgMHZNPEhwJXMkQHleVSR6KkJsbFlXKzV6IVduWS0jTEEwanYwP3oyWjkhQWAjVElWVExecGdaMzBHbGhBflZTUzNselA/eUNufT91YzFDCitRcGhaRkxxPy1oYXAqWXBheVZQe3Vycm9qWjhQUkxrKERNb2coUGQ4Q2lrI1UzMjl3bjQzY2RrOVk/eWVzd0kwVmBhRmt+QVRaa1glQWtXCis5SFl5fTRAPmNCdjlYK1ErX2ZQSkh4OTk5Rnd6djYoZV5TQldINHhvQUJ7NVohc1pSMnlOenhfQkFNfFA9ZCZDeDV4bURAfCpeKkFuRiRCCitkeD9lTnR8T1NiPU9zT1B3ZWpBM3M8KElVV0VYRCN6dnlrMkg2KHZ0by13ZlFJYSFicF59JHBEU1dabShEZ0xHT2N1c3BafU0wKHA3VXR+CispdkdVJSVrRmd4I1YhMVRUKnhmPUJxVj52YkVJVzRpbilZd3hsakBQcipwQ0pjJClFVU0kTkhZOE1BX1h7VjclbF4zUS1GYGB1aGZIJmMjCitSR0cyPDsrWENHQyRsYzJDeWBzP3l1RX43TklMZlF6RHhJSiNpdHozK2tvd2JpPGchP2h+U3VuO1dTLTQxaEpBNkpHZTFYQkxWYy01JDttCitBa09sMiRBIW9kY0Q+e35AUlUtQ2RiamZnMEpJYWNGXmw3N2NsJGQjYmxHJEtQUl99KlVUKnVfJkV2PnZWUDE7NEtedUs4X0IwZGh7T1JpCitGKFY1bn1UZS1BRlNTOUYldG1uezgpQnppM3p7SmM0QkQ1c0RQbDk/PnY2TClhRHhXZDh1eUtVVE4lJmg0UVRCQzhjJD9GfD13NmVed3RGCis0fTkmUXJDQ041dm9VMUtxN1dKfis5dyZMKXgkWUZIfUMtY05JelY3RTlIKzhTVHVQVDJlVDRAQlM9eyRDel8kJiFRKCRpZWdJd1gjQ0NuCitSa2lqfDFKRz8mc18kJnIzZjJzU344dUBNU2QycWgpKE5wTXhweVZHRzJwaTNecVpGTnhRSm1XQilMKzcjXkdeXjY8MypUaXcqXyhGYmZWCis7QlhOOD8xan5XKWxPTjd7KlEqKyktazVxISswUFZHYnNmc0spS0Rxa0IhXnd8c0Q4SDV+OFpLeWB+Izw9SWRgYWshXig9OHZ1YkUkUk0qCityQDhHZnk0U3dXQDRaK2hke0ZwUDMoPFZNbWIwck5aNylBJmBaPiNWVFR6Zl96Ml5uRypIK0tHMDhZaTAlV0dpOEspeF5mVzhySCt0UGBKCitTNmA4fUBDe2V1d3M1Jm9DQlBzZFI2an45RWNlRSRucjRXQFRUWFUkNU1ob29sSFo7bzw7eXYhMXNyRTI5I0tYUkk8fE9gaHw2KT1SQ00xCitkTEJvVW5DWn5JV0dpaDEje18zN2hrdyh6VXIxcDFKIyFUM25JKX1zcHw1QkpvTyFuNyZ8Z3w2eUNyezx+QkxhaEM/Y1pqYSlYR28ycFMrCit0X01EZkp2cUxCNEV7VGNzVkNTdEs/SSlEdVh5dTtxQTlSYzE7a2ZVXlN0d3xtalEhXnZGaj40UlQldWw/WD5ZUXlvfDE8ZHNLLWpIQCsjCitaWnpyNWBLdy1KVy1IJCteWCZ9YX1FKXtAcXE1TkZGfXVuZl49PmxMUT5YPmclVTQ0dEMlaVU+OV9QZ2xObWAraFk4NmhkMzg0TGw3SEltCisxdCFTUDZadl5Jd3wzRTZPX3ZLeUwhWUZ3YjJ5WWxhaEBwNzZQPGFzR3JzKEo0ITtYXnVqcSZwYiRPeUxQbFY7Jl5KVU8/cSFNISFNYX0kCiskKCoqMC1rYT9zQlZBNi0jSk9TJEhVUDx7cFdwZyQoem9RVTlMfUglSjJsMXslWk5CQ1pTfCp6aSF2ZGt6T3RqPlFtYl5ic3srUHRndGB8CitlMmt7dDNUNXN7fW1FTVJjNSsyPENBN0ZZYjBaWXcwOWYjMGRia0EqfjYtaUlsWlRpTnZ6YFQ2M3liNT1XUm5JO218Wkt8PEY2X3VWcDx2Cit0WE1xSE55UCtIajdiakl0Znhoe1ZhUm10aS0xWm5VZWdlNFdwJWppPHJ4R19+QlViblVGeE03ZUlDVnJfekImN2FsX2Jnd0NVaF9PbSZ5CisqeCpEMFZtQFRlSC1Ge21Ve1g9NE03byRWSVRJUGg2REJXSUVTRStWdEE/I3lXTWF+VCM5bHRIUERJKGMyZCl7WShCO1ctRkJrZVBTeDdKCitgRHdWbS11QDF7KkpkSkc0aCZzVGBpMjNmVDg5bm1uQXpAcldQTG5ULUY+LVVveVVabDFXP0UhdllrIUxrbk91NChzeHhAMllzTFp6PCZgCitXcE5oISs2NT0pOHtiPlZuYUJSTFdXXnxDeHo1X1VOPlpPbUkxOUlmcFN8cmROQX0qVyNmYmxeem9Ue1hrKjJkWkVsdSNBQntOMXJUPlJ6CisjYnNibUBvRlZVd2EzZTs+YDdJcGtPOW9gVjxYZ0lBZ0E8QzNnbmhZb1N6MFJZMT9hK0Z1V1lFMyNRYWZzP21rKV8wX1BgYURWMkcoWVkoCitecmYlT2p0SUpSK1dOPmx7dTJ1bHYtSFNFY2UmR0xuaHJ0LXtNQzNiI2JjbUVCYmVuanQ7Km1uP3c3WEcyWGlmOVhwUT9uNCZnUmpDKU1mCitgISNoO14rYT42QkwmJVZ4YGVQQk4zZ1heY3Z+VE15eXlwYllCMEFsdm16KTlPeklFMUlLLWEyZjtRY05zTlRfT0tGKk41PXJ7Rm96RUNECitTQmBFPXtFVmZUI2lpR35BTWlgO2MyQHFScW10KiNRJUNoUHIpJTtyeWdnckYxdTJHJUYlZTVOUHBtI0N5eGhESXk0T1ZFa2N6enhZfHRiCittQjd+LV4oflV0ampOTll5UFl9KGUtPWdrMEo8VkpfSlQwOHp3KElVXjAwN2xReUFSYS03d343e15QUT1fRGF6Q19FPWpsaC0yNm9uSW14CitwM28yUHw/MUhVfFR2KV5udjdjNm1pMWhJciZPWCEmPlZ4LUdHUU93VHBLe3tQXmMlJF50U1pLZ2hGcGdsZEUhazFsPDdHKXFxe24hcjVACitDRmJlaVRCcShrTGtYaTlhNXZVaWd4M0hxWUhFXyNwaX1xe1hlPVo/VGh2TjVpdl9eakxrRDh4OUw5JGQyY2dfdShIOU1Zfj08VlVsKjA8Citqakdwcih9em1qb3EkZGBZR2RmYXxpVHdjN2J3VT8jT1oqY21IbWBCO2o5RTdTKGg1IWRRYUU3QX59Jj93MGJ6TUJ9dEtlVStuPEJSfCNrCitjYnUhfDVUOGB7VDVTeEV5VXJ3flMkRzNiYSNoaiRGdm0wO0V4KUIrZDFhcUxBNTJnOSV3dCVSLUNwbHhqRyNUNFBCNFU0QE1vYj1vRSl1CitoLSVhPFZMSGE0bDlQV0hObUJValV5QUM3cVJIcWhlU3x5UjY/PmMxM0A7JTM+PkFGWChzUkViWmhhPjg0Z0FiRkRFSmoxQD1pT2ZUNjJ1CitUKXVoKUVsO1Nwdmx5TkNTX2tHd05sdk4ma3JeY2Z8Z01WWTFwWiFtck1zUHhkLUJ+fTNeRzxKN0NmamE7WVQtMGZJVzl6I0QpM2gmWDFQCitnPlFGcklyRj5mWjRpQUB9WkltVmRTRj4tLWQ2MGMpZC1nZnZDczwrTn5rMz1wc2Q5KkpTRj1UWiFOKzFFS2xtfCVKMWYlVlk5M1BhT25ICityMnFCPz99VFZxUVAkRkx3NnRFdnJmfWg3KGNAITc0bXJ3S19PRHpifDxXdCZJPkNTM1FqTnpzWUYxOCVUSlBeQXFAdHFPbysjMz5wTnF5CitONGV7VEZUdTQ+ZUVBJmJ5WDFuNnQzSWdAM0NfQ3BadHh0SjhmdTRKUDJ5YXFVaTdHVXozP1NOQ3ZAM20rKEJFNS0qdyhuQ082SytDMUlSCis7bWlVTE1GTmh5QyU+M1gmPCprYistZys3andHTUxuanVESEktcGU+UEpTWWowbkleP2ZXMVN6Rz14SkBmPihPR3pQTkk5d3AobHl+VmNrCitzRU87KWdFMXhyXmopfF40fERMb1hPJXh0blk8Z2pscit0fUU9ND1XKWsrNFp1ZkdyZn5wbk18LWBfNiYxWk9vU0EkejsyTXJOKV9AKmhmCistKz9YfnNOYmUqQVI7aWUwWlN7ZzQ+TnI5RWo5MTNgQDFQfmolX1BMS0Y2P3NaPENNa14wXlNpSkF+aFZDXjxTPl9QTCMtZG5WYXpReTkjCis8VUJsJGpiSyhocER1MmUmPXdMUktzMW41QURXcC19VVpoNEg5bTdmJnApJWQyPip2enZyMjhgT04wMnlvVn1Ed2RkfW85Q3B5ekg7JmBJCitAISh2PFIwSUQrY0Frak04JHpwbzh0bnwoWGMtVVpnO0FydTxkbm5eX3pMMVc/fCNeUiR1SntfdXNxUn00e34hMkp+SSlQNTMrTnFyaEpgCiskYDJfK1A3Q0N4fS1Oc3khRk9HZGNfbkxecTY5SVQ0MDhiVSlPISt9X3VpSzVHbUpzYFleeFltLTs+bDhPMl87QTtaUCYtcWs+VWh5enQxCitYfUAmPWZgcz5hdEpwKjAmTTRLcippUSQ1YX5taGdyPUNhUHtYMEBSWmkhNDJFKCNYbUVuZzNmIUdiNDJXJk5XMnFPY2NTR14jb0tPRGtZCitxeDwtSDdvc29YcDspLVN4dGtLcEgzZlNzS3JxdUU5ZXste1B2YmhkP2dUVlckJThWVU8lTkpDdWs0bz8rfTQ/ZH1KM3VrdWxkdGxNOzteCit5PHdkX3pYO0lXel9uUFpjQE9tWFBtPUZjc005e1BpUHh3cEN1bGBaWkZDem9vbjRebHhyQyRlcSM8KUtMY15vSSt6R1A1KFdYeU51bzZBCit6RXJUQD5wWiZHQilLJi17UF8yJnw2bjItT2I9Z1lKaVFeN2c1MmEjRm4/QnBXI3UlViNXUmkkZ3lufEFmaDxsZHVeaz9BPW5HYEE4TkE8Cit6Jik5cmhlT0htfjw8PVN3Jio4R0dhUU5mSVNzNERPVy1iV1V3TCNvPFB5UykpOSpAJXhuM3dkMUhyMkxxVlpJO253aj4lMyRnU0pQSHQrCitTI3tNKTNDPUhTc0k+NGg4T0lPJUFIR3M8YkF3TmJjXzhefnlOJnNjYUllSlpBeCEqPStvUV5KKVRHVGg3WndBXllQUjU/TCs2VGQ5Mk4tCitFXjdtWWcpVnAyejtHZCFAQFY5TzgqaFkhO2B6S0FKbEBIMztWP0hpOGxrOFU3Mj1jQjF+eWA9emNKIVI/PUVRa0A5UDM7UiRebzhqMyN0CitPJkQoQ19FOGA1MG1jVUVMWHA/Nz5zNXUkNDtWcTlwckJsKXAoKkJQcWdBfWpOPH5xTkgzanQ2QEA+K1NpME1RNHN1ZnRZLT19Zm56dWEqCit7U3E8ezI7WVkxT2lEU3o5VkZgVj9zKlhwVGZfPlFXK3w4VnJ7IXA1Z3RJITx2RmBTd2QjeHQ9TyRkMz0wWj4zKSp0Ti1zZ042dz1xJm8+Cit1RzAxPzhoZFVyMWVuQVApbiZvY3FfRGhCZEZVMEFJRTxJN0JDdTtQNSVza1QtVTMjS04mKCExJXw3QS13TzttdkslWC0lZlV4RS1sSjwoCit7TGxHO0N1PEtyPlRYLVBhOVEhVF4+aUkwfm84aX4kKUpoVFJmans+IzNVaEUmcl5GKEshPkVTT1A/ODlfTFhQJDZ5RGY1PEV1flUpWEdBCit0T0FhTG9KTlVpXn51Z2tUMzc3ZUBDaz9IantIM3t2e3dfJUZ5ezZOTj4oenROWC0kUD1LZSVVZnM4REN+TjFXPjYyTUpNM2k4NXE9RVBICis2NG1KNW9qY2VqQihAJGMjLVpiQmFmYmxGZiNSOD96a3tMem9oIUgjci17WnpeSVVvJko9TkMxYWwkWG8tIzdhZXxjK1cyIyk7WXlyaHJyCisrM2lnU2lwR1EkUUxpViFJOUc1Sit9eSFwcDlDfmJ1ZmJfOGJLPCVDKHNYKDlFajsrUGxSQDdIMEMwITExMkZ2Kylhem81JlFFQmRGS2NuCityM1gzTihiRWVabyt9IXA3LUR+Umc+SyohNDg+VX5ee1libCgtRFl2M0hzbmVWclVkYUxVTy1NRVBFJVBNYkRzU28rfmxjO0A1JDBDNWEyCithfjdvSnAwajQ1a08jQUslQylMe3V7amM8bH5ARU0hPHQwbTRuTSkjVmlyNHlsYXFKdkkhKDIxJSFROGxOVThuYSNJTVRsc1ZQJC1FJGxCCitGdGZmMDdqYD1YcHNyfEtJaDNodzFIejgmSTFqcVImS15uVyEtbkhEKTVqT3ZJTG4+QGtyekNKTSR4IUktRU9iRG4rVXtEMFRXV0l8NHUkCitvPiooVSF2dHAjQ3dUa0ZIenx3RCFvTEptKnkqXz94NVkwS3RHTDM/fHRMXmY3aT9VanM3YzllST1yPEx8SylKcyElRT1gbExqM2x4U3A5CitjPz9wUlJNbW5RQn5mJGF0dkJOVHlJdyNxM25hT3EmKDlpP05HY0tgTUl4Rj0pRGZ2VkxNNFBVRUwwNHMrQ1h7MXkhfm8pdVNxXlhydm5RCitSUDEyTTlPN2xxKT5aWUhpKEl2PWI3N1EoPDhnLUwyNV9nYEx8MzlWRmx9VEspd29vZXhTJiM8UnJjOC1QUXBhRUNUN09jdiZRdX1tY0N0CitxMnQ8JlpJeUkhemomUUlJcktfcTZ2RyN2TjhDPU83X1Nmd0ghdlB+KFlYQGJlUFd1NSMqcUkqcUtLSVU3PHNIN1BjR2JIOWskYjYmOzNvCit7ZlpBbUlLSllDcS1qO3E0UjNLR3opPXFJPjFTQ3pKIypAYkwrdXA3UCp1LVlKbXtiRGZnYiY/aE0hNEhLUjYmdk1Qe19JSj58clZLMDJVCitxVSUxajdhS2BLXiYlfXBFTWx8VUJicXQjMk9AOE59QEBNJCNicFMtJEQxdmctPDk2VT82VyZuR29EZURxdyg/TiREMFQ2KiZ8RmlqP3wqCitASkpiaGJASlU0LTdBK0RsYzBWUXdvayhBTm9ZS1lnKHJkUUI7SzR2blVuWiY2N2Z3VXhrLSNSaU9lU1AqbkZJSWV4aUhqIVk3bjBscXs2CisybCZxQWpsJnFBamwmc3ZWUWxlNiNRbGU2I1FSNDZxNld1RXBLQX5peldUUnhHV1RSeEdXVFJ4S1dhbk87NX1ndkE1fWd2QTV7Rmx3PXc3CisrLTJfKis1MlBGcTMyUEZxMzJQRnEzMmxwRDM3P2NQfjFTTnRKaGJOZm1VYipsSUM0LVZkJClJRlZHQVdzcU9pQ3ZBTj1oVXBrYGhVWXEoCit0ODFIV3t9YCR3fHBjJHd8cGMkd3xwYyR3fHBjJDtySklCXkQoWEJeRChYQ0R1SnxpKlp8JlQkRWd0KypwfXQ8MGpnO2k4Z01jaD99VDtDCitjMmYwVj48Q1dDa2RXT0NTI0htbkMwd2VuQ009KUBDaFpzM2hWNC1qaHR4TUNLfFNoYSYwMH1uK1ZQKER6YkArWUAjQllzS19QKXZSVGVLCitQWlFsTTdlMWpSU1YweyYoUyVKalZHfXZuTD1IQlFnSDdhTTZGSnlLMX4hcF9PPU1zYjhROHFmRFZ5a0N4JHBAayEzclg8aVQtUCV8QztFCisoQ1BKQD8yNUJOY24mP21fWH0oRnVXNVZvQyp3JVRVbFFZcjFhQG43TjYqI2E3cjdgaFVDVzVTcTN+TTV9bm48b0RZTzlJUlk5aDNuWHNhCitnTHMpPXhGLWlPJndiZ3h8YWdweXpkclBNP3VIUEojJXZgYFoqKUl7JHprdmRJT1A3e15XTUJwP0xJODZqal5GQjllcUk+MVNDekojJE5TCitHIVByaXBOQUIzR0l5bF9wQjFpQmY0SVBNWVlGQ2MzMUY1TlY9OG4pVD94QyVSV0lkX3FhRWc0QWZER01jMGdDU3N6QU9sVHEjbiNoREVECit3djRgV3VwRj1XYVRIeCtnVDZxSW5sang7UyktTjcxKTdFYlR4XmpDUTY9KGw0cWppbko5VENOfWg+eVhDbUYxTk92WWBvbW1nQkcxMHdwCisqYEkoRjZkNG1TI3piNSgoTFlRaTRITDEjTH1NX342SEpvbmxUN3ZgM3BgMm9QSTleUCo0YSNTdVV6PHFsMzwwTCVfSilgTnhEb0BEM2dACitQQitvSFBTV05OfWxZR0YwP3dgO242SXkmPCVGbkhMYHoyMndVRWpXYmBMRUNPS1ZOVSZ7QGNyXnt9KWg4MHxYUVIwMDBPOF5PWTd5OC0/CitWXk9BYFA5bHVHfnJGOH19bGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNFhmVntVWUtFXnY5KFR5CisxbVBJRmtPWlV4QXheSUQzIXI1YDRMeG0oNWw9ai03YmN2MGIpUGJFI0N5TU41I3lqWU1pbURqd2dqS1krbDRaamZ7fisxYWhTaURGcC1ACishSXxMKH5UektYVjBlcGlJPk4oUHRWMks+Q3k0fF58NSQpYzUoRHFAa0hIY3Z1RU9Gck5sKjMtamBMZTdEeDMkaUx3PU0+O0VtKz5xMzl1CitZPDUqU0ZTQCFCXkw0NEpQUnc8a2dCaEJoUiVLVn1tYW8pandYVjBTNSVwNFo2TWdGWD1jO1N4I2E2THklZXJkeSpKZktje1RKUF94VTNzCituSzV0YWZzZkQ8RT8wWHkhUld6b3I/Vn0hUSlycX5NZUliQU47ZHxaMVdjMzRheEwlN1pRQDBnWXMjVlFyd1hpRVdzO2pPaz97PDJiZCtxCisqQHg8clYjTWV8OHFtaDFiYis9JUJ3JiMpNitFaU5Dc1JiOUZEWWYtSnN5UVhMIWpudE5uUWxoUHctR2lSa1B2V3VPaUZyfHBNbEgoTGNDCitRN3xpSzFIa3YySnd4T30hfFdrRVVvPkUlYjhDdFVKfGdURkNKQWA4I29AVDBLK29UMi1waXRHVjNXdDtATT9keylqPyloYmM2VnIkQ1U2CistbnlFT3l0XjRNNFomUmAoQzt+MzAzT3JYNig8Wlg/Mk42NGtTaSVKd2AoN2Rhdmxye0l4Yz5yczJNeF5yS2o3WjhUX2tGZXc2Qj18WXJNCistfGI0dlVWcVJYPlYtYU5TY3k5JmNDQXxPKXsqVygqQT41PC1uX1laY093cVotLX0ta3VkV1d5WntHaTs+dU8yc3Q2RzF5cipnQl41TF5oCitvcy1+I0FNP0c9ZiFRMTFqcWNeKDY7bWd5cikwXzhaXzl2JHw9Zn5JQTteZzg9OUUhYHN0RERvS2NWfnhKO199X3E8O0NeIWZlX2I5TEJ2CitMd1EkcUc0VWd8RDR3VSo+VWJ3Izt1P2I2P0NefHBGfj54RWJxcE9zZWdUJExKOHFSPUw/ZWYlYUp1SXVXKVUkMVVMMHt1eXBPSHRLYkJwCisjWWxWQElRSnErUSgkPXtNNCNwQzNkYm0lMzY+ZU9oWjNUPGhqMTx4K1FqdmFhaFU1LTtudkdnYVJuPmI3d3JXJkIqR3VAdklud0p2JDtwCitFeTIkXl84VVpZJktncV4rcGBiPiZAMXZlYmR7e0xzTSpUPnQtPlZveGdpfmR2UzdtYmEtPzhgcl8pbmNwPzZLX1Vodk49SnYxVzdyKkZsCismKmtqK3tObWx+SEA4PkVYU1grUnU4eXpZVCU1aHFTN2FRfC1YOHdYUkpwIXpkVmN5PWNtMyt7PH1rUkwmNDUoPmVeb1pjZU5oITZjfEtuCitpamNDPjFjZEQ5ZT1AeGZ1NFNwbHhZUFklNWBxSSk8I2U1fl5OYHRtaCtlVUxuck1hVypkUnk8P0ohJXYwKVAzRE4maT1NZGomelRQT1ZxCitFTzkoUWxIN2Ywcm1NRGY0bUM0WGJQPkdwQ3puKFpZfnJhempXKWM/LTxtJHtQbS0lfGJBZXpMI1F7K2V7eFd0OGB5QFJScEZyRzA3QWYwCitGJXM+ZmRFd2xDaEdeM0NweXlGRlB5U0dCWHFYRXBxcythe1NzP1ZrY19tcDFVOHJqPVl6c2x9K0FENER5MjFBVW84e3kpNXU4Ykg4T1RmCisyKmgxJD1KTnhVWCM4KU4hMGUzX2RtQU95bkJpTXpra19ANTtwTlVjVHlXbWolMXAtU0kjN3pKNllzQ2VzaExHPjlMc2tsSDg0dU44Q244CitYQk1OOVdBd01he0BvYWozOE4mPCpoP3RzayhCZ25sM3YxZ3owJTE3RD52YFoxSWdWWVA0PylzP31fXnlfeDBAdjcrLXBjTEtnfHg7YWB1CitAZjBKd3BxaHh1fmJFdEhgIUtaME4kZCF5IVo0MjRJR1JMeTlZaH5ALT5Qen0lS28zZFpONjYhWmRSdC1eLSh5dHppcXdEYDRIUWJvZ2xrCit2OzJ0Vjx9TExfN1JPV2RNajUxWWc8JUVINGNJJVdvbSs0UFhJNjZHOF52Xj1iclRSVFpLYkp1ZXhlQHJtLSpXa244JnImeT9iVGs1SW9YCitsYT1kTHt7c3JWUC1hPH02VGU3V319YU80cTN6a1hQPHFzX2k5bD99P0t4b042OG8wWSNMVGRDKCtlT2k0c21DbW5gdGtPQikkeWk3MUdZCismM0M5bXdHdXRyNUdrT0dhbWU4dTVTd3M4VXZ6V1EzQkNaTktxTUVCfXRVak52YjhLcncmYEcheHZuc2JvQ1MwZjk2WlJyMjNxeC1WPVZwCitDVFVsbEkwaHB0cjYxfG5ObTVSdWx3Q2BtNXh+d3Z4dXl+NkUlanJeZWtBVWhRYTdLfWhJdUgwcUIqSGNyJjx7cDdeYWJYRVNuK29oX2VDCiteN2toWFI/RV5UcEx7OWghWDhARnBPTyN8M2R3djgpQWs4RXFZTFR2cyNOIU9wMSMzdihwSlcqMkUmPCVqckFpUFo1OVRve0JNU0FiMVR0CiteJF9NT3tqPUZtbjYheFNZOEBNTSQqd2hOX2FaVVNVPHArcitBUTxVbSZQaG05bS1Oc0lCS280dl9qWiMpR2lRdCh0UGVobT9TdnR2KnMwCit4Z2NfPEc8TEIyMTRfRT1gZ3MkRTBLeWs1QntCMEQlTD1WQVlVRURQKlE/JDxYU3Q2fHApWUt6TkNnP0NedWdpSk11JUtGN1ckUHl9Z1p7Cit1fG5KaXc7OCNfPEc1JSQleTxDVHF5SlAoaiRVJThMKmpvUyY8YWMzYkd1QSpXQnZLUUdePms7dDEjPDQ/Y218dkxUTz5VR2trS3goOGskCitNTiZFOVE5R2I/clA1NmhJXmdtSj9TU0BhTjVQezIjR0AmOXExQExlLWdeMWFLb3kwfU5yYkhpe212WjF0ek9gaGg9ISFjY2olY1lkUDF9CitpYF9oeng1fUsmPTE5T2k8RVJhVXpaXio3UWhqRUpXJCEmbkFyTl9VZWVKblBsQytSXldVQT98JCRmR25fM2QrSnNMMEtTVXFJaW9yTkdjCisxWTEqTTA/QTRlMj1sUUdlVGslIXleOSp4O1ZMK2Q4WWtAWjM/eEs2JTFiM0I+JiFLWEpFaUhBZElBMkpHPVNIaFVFcUM3JVMkOGppb20wCitEUW10UF9mZmZZb3Fnb0goNDVYUUl0cj5PWkh4SHVwQDR4QjhlJUc+bmFpJURIKC1aQCpaMyFjPlgpRDIhTzQwbHdpJmczcHxgczMrblAwCis1MSh3SS1FeXkmIWZicjNGODhJRGRHcUNFVmBhTVo9ZD5pRVFOPig3RVc0NGlWUmpHaUFSVGxHbCh+RmxhdX44JUVBcHE7PSpUeUZCcFhRCis2Y0pYOzxWUEY1QXc2TjRLekJPQ0N9MGM7MFg/K2FneSk5PUF4dDZ1PGh2PmdfanBRMk1zT1R4b2liWCgkUGs/IWVHcmRRNmg4RlJpN3lRCis/TTtJaUAjVTVLU2RKM0lYRUFnVj9FcjtgdyNHXnhvaT05VWItOWZtc2tgNH0tdmZYd000VVJKQD9HMj1wP2V1R09nJVNgdjJ7MjRSQGEhCis3akBeUiZvQTtHVjM0PXowd0BqTW5uOSZTdjBPTzY/M0woZkYoQSZGN3xFMkE7ZFV7QSV2R3koe0BPKWUqYjZ0T0FTMGw4STFnVUZQfjBZCit6QihBY0dsQ05TQU0maUY2PGhQRi0tc0J1QCV5QCg3VlpuNURebXpnQT52bjk+PFdGZyg4RHNkN3YhNGtpan0kKFJrKE0zS3kpMVAxe3BvCitHNUp8JD00NEVwWGMhTkt6akxMcU00VTZDbjhFNzxQUGI/dU48TVlicU5fVzMzYFJgX0QmIXF7NSo9aVZ0NzteSkpPRk1RWFk/fSFvWm5RCitoSXkxbGd4QGcyQ3dHfWZ3QkwqKWF3bk9gdWpBMmhiMm9PT15waHx0TGwpUjM2WlBrQWZsMCkzXysmYW5gezt7TDZ4emhuOVNhZGdgQSNzCityeSt6WVhuQ2hqTTlpKyFHM2QleDBmV2pPUUpkZzB2QlItUkJAU2N0NlgmaHhrMnxUUHRxI3NBZlA9VWhYeUQlVlBEY1h5SHdtMUx+ZnJqCitaTT5SfUspKE1ESyRXS2NNUEBRd21GYS0xMWs0b3tYNzU7SCM+ZkBIfWlmUUA7YHFpRH48IUJGK054NGhoWTRjaUZPKUcjZCRHIWZlOUsyCit6I0pLJW9mX15KRnh8cWRCWEFGZlNrU0N7WUIqQ3EqP0pnV3k+bkZUcykwQkthYzdsfWYpWHY8P1gkZHRWcStHOEs8WFhCcz5pJHk0TlgtCit5PSpLYSNWNT9xUC1KO3J+RkQxajE7cGFiN0V0Nj8hcFppSmFqVEI4d1B8eEVMa2V3bkVaM2swSGp7QzQ1Y3Q4dk9KSy1Gd3l9eyhjTEB7CitKPHFHfmg+MGtQP2BuQ3AzQl9gKiNrS2B6bX5ka1hIJj8/JUY3WTFUZDBMWTgtdmtQdFAycEN+Zjl5b0xrQ1NYPHZVfUoyUUAwbz9HOTh4Cis+enRiPUBpS2ojMkZSNDZjNSp9UlJKaiM9ZHEzU3NWQ34rJFQ4Tng3I0BMX142PnA2c2haNXQqeEROLVkyM0o5TkBQTTlDMWo1N2lAJHxpCitCRW15el9xO0RPeXh6TS0jNWZAU2NEYT11X3pBSTkoRlRAPTJ7UUpMKihvY3tpezdhdXp2XilmSWYlSEA7VUJuJWomWDJLYDNPeUxiNGVnCitoSUZOcjlxZFo4K3JNPiNZfD0pfHlGRnZXaXh6SGQyekYoZVE5Vjx7UShrMSZZTHhzdnV2Vk01TzRrPzZRYjY0Tm9VIVVMMUMkRyptclQ8CisjMT5IdzU5JnpUSHAyPlhBazBHbWBBQ1ZqTDhKanE/bjJuaUhMfS0qOUlncEQ8eW05M3EofGZKOT1jJFdRdEB0MTdqa3JWcFd1SUFTOShoCitaSW9qJk5QfVkkR3t2I0o7cEwhMXVWfkxFWHdOM2ZERlRvbUI2bj0zTHowSG5yKWNUeDtlbyFgKVdiYSEjZjlOTDNWdElEZHohPjZuJX5DCitaNDsxaVNLbGtaek04KzU5QFVmR30/UjBEIUMkZjEmUGwoO2FgPF5gMXBrMHEtT0Jyc1ckJnBDKio7KVgkaDZKZEB4OHpJQWg3JT40PVdJCit4dWozaCFyN0Qob3YzRyRIYUdue0R7aWpaOCVFSjBQRkYxKUs5LShuMWg3PjBZNEhJMUZCUS0zWHFYal9zO2wlSmtUanBNUCpAcl9KTWJrCitHaGY8eGxCXmRuTylpa2s4PnlKPSRUWW9TeDt1O35UZ1E0ITAwS0J8O21Mc2pVZGFmcW5ocHhoTCslY3JxKldISn10SVpoVik2KGhqdXFCCityWnNxcjA5N2xGYis/PDZSezJVT3hUWFY5S3hKRU5mdjhRezZaaSorUl8wa2FLT2ExQnY7eCo2NztaUE0zZ1dKb1FGQm1yejUzbEpgSWBrCitEZXdMKnVLP0wkMClsUnM1Sm82IWx1WUhZVmd6S15aLXo/KTlWSllQYUVzKS0oa1ByLT5VRn1MTzZaeUwoR2FMazJudHRBNTVXK147dDJXCitxRllROGtJNVUpWkdPRUVNZTBWMHsxY1hDQG8wWUgoPGQwazJjPzRlJVI4diVJYD1pXzdxelJaOUY9cCk5QjghTWA8dUgqO01pbk0leENACisxZzxLJk9XR0JISFhlJj9QdXJWfjRTTzFRSVUrZ2VUOEBfZHtyMHBTeXVAKVJVXjZ4a0RnUzBzdChoOWkjdmg9dmRfTGZaNjxHd3VfVFh1Cit1U1haXnNnfjlWN2I9SV5zXz9hdyhJPGtoO3hURElXWGhkdzwtVWcxaDk4eDJGLSQmQmpzZT5wOCtGI05qODhjPlZ+U05rSXFMbWdoekEkCitReHloYkQhNUVVciVAUlc0OWRzPE8qT0hXfUleI2whU01mR3J3QSV5QzVVdWk2N2VkNXJ0ZGgkcyZGUDFPNlJ4SmwpVTx5Jn0pUUNRaCF1CisjeyZhPXlEWFZYckVgd3FKPj1aMm9kT2lUI1VfKVopSHhnfVpCWEl9UGVEUjwyLUB1a2x6QD1gYDBANzgmKE5KO2lZQFZNMWIzdmcxXmphCisyaztsTnFxbllvUWpYZ2NsPjgjMXJ3S04hckhvQX09NENwQl9xeXRnSnRRWT1EIz9jY3UzM2BybWUyYkJ1Jmo7bmwwVytpI1g5KmIqe3w9Cit2SjleTU5MZERKZUhAbzJiYjtgOXtXWj16fEMzJjduQ1AhcVRpWSlzNCVDZVZnfkdqMXtSbkFaWiNzRDZKb28zRCR1NithaS1xRWZBTD1pCitDbWZWKlN7Yj9UPDV8fDFIIX4rfUBUfCsxPWptd1E5Wkd4OD4lYWBGZGNeJn48eWRHdHs7UFEmbiNfSCs1STZ1aGQkKzVVfik/TH0kTCFpCis5TVhTXnYkMDYhKzJzfEBBVU1WSG5LPGZPN3JEakhNWUVeS0ZYPjsmZ1QjRDRROE1SemItYzB3YkUxZzVQdVlaNVFEPnVaMHZGPXcxN0hzCitfdF5GUSZVWn4/NG91KGVtUD5QKnVyKzVuYH0yaVZ0ek1lcnFOfTFRPTZacT0+K0x+X05+d2k4XiFjZihBSCspa1l8SlRLKTI9bmU/V2J+CitVIztNRntMcCNXRGBzY2Nib0JDUTtHJCN8IWNOLShnVldsJVk4Kn0taEZeNz1OQGs9d2xJb3dfTUMzPXFBTXR2XnBVRTVFVVA0YVlVNTNECitaTiNsMmFlUjs4S1FPfHcmeElXNFFePTImV2ZGdTFPaUlyKiM9UHxlcjd7X09GcFhqeHgoTj56Rz0zcEplSUU3U0NhSTRSYnhCSFMkWCh0Cis2bExxSWtKOD9gTnVGNVlwT1U/V3hAU1lnRCZ1c3U+Jkh0ayZzQzM7dGZ+TnpkNzhzND1KQilndE89Jnk9Ty1gWTJqJDNxfVkxQCEpUXl6Cit2I2pFcVdWN0QxOTdWSFBfJkJGWngmVElxSTstNFVAUjsrU34jKzYxSCg/c15gUz87KT1ofHM5eGZJenNCNGQxYHgmI3wldnlUPD09dGJiCitTeGxgfHFZaX1sTWZKemw9Y35HSWAkTlpXdn5FQFZzKTZQbiU9eT99SXoxUUlNVXRIQS1wK2M3KGp2XlVAM3U1bzNjZzYrczZReGY+fTZBCitZUWV2fnlIb1BjfVdRXjVEPUFlNlBqKU9uO3RKcyMrSj9vezE8ZSkyOCtaPF9NKloxWVRwUlg9IT5kIzdTUmtOJWNFeT1rJEFPTEMxSiFNCis5fCghOzlNKykjPT9fd1dsKik+fXsxUGVmbHNafStPWj9YVDxeKm5US35FWDk5YDxsfXpPUkZ9TyMhfD1qVlU7RTMlVjlae29qSl8xbGAkCitrVy04Rk41VFEpJHkxa0ViV0lYRFEtOE9wRTxxcmhBaDsrNnY8PypjM2UzPiFyKWRpZSVFaD9xOV57SVFhQStZI18lY2hOUGFYZGVeQXApCiswYnhKOW05dzQqIVBGMjwkd0lwaXxPT1g+OXN3ZmdUNChCbytoUFJSbkAhdSkkTzlfaWxOSzJvSGlrI3NpWDkpUn1EdV4kOyl6SzN+U2dhCis5aD84IyZULWEqVzw1aE8jZF5Mb2UtSmBZWXQzPzxjJk05Q3QpK3ppPzxSMUluJCtMcXNyQE93X1IjWEpwTzNXPmY3fTs7OTFpMDw4e15uCitAP2Y/OGhDPmQrMDxZbVY0ZWw4PWVRNVBDcnw5cEJxMiNmWmYyJCVOMUdGfnp5cHVPc0NSY3M3c3pxQHtPZFVBOEMkTjZyY0xzc3VnKEJTCitwSGRhZEApUTFxcGYoejhNISZANCskMW07aDdBT3RkX3stPC1PWWdPSE1EXz90QUhtI2skVUxPOE5neXFKVnY3K0ljejQrSmZyVEZzOy1iCitSMG1mQm9UUHp5RzVwQHZxMTYpYiozMntRPnQ3REpNZ0ktUXpQZHQtdD5oZE90YVFxVzM0YmMmTk9pJU9CRkB5RHktVHJYX2lGOz4ydE1SCittLT09NFJyamtTI1VYTjByJkZUKlZaTSZ7IykoSXRIcmRtPDxKTD5NM0thYTw5SCktdnZ9VTBtQmtkdmQ7QyU1PWVeZHZiRFR8P21BX188Cis+LWdRIyZ6SWtCVUIzQCNrMSUlKCVwRmM1e15hOzgwSWstIz5ydX1xUGM9K2B4NF9nPSR+LWN5entiYy16YUUpfkArKjx+JTxPelZzcWNUCisoQW9fYlRgIyhAaTB8WFFSMDAwTzheT1k3eU5LeSVtMz0wNE5ARyRAWUl7Kkx4YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoCis8KWIxITNQVlJCPztiVDRkU1pmOWIzWS1lRnxYPD0/e1opOWFgRV52QTZUM2Jgd05FVXdBdWpyYzgpK0FMNXFpKSY4Q2M2KVdmZWZfLUM/CitHWUpyIThTT3BvKStAbEFNSXUrVylAYWs9KkxqeCk+QUsrTHlzNFlgNHprSkt3bzxMK1JENHt2WXhGQFdiKGBJNXxFekppUjs9P0AhSlN7Cit3VzR6VXdOO0ApdHdlK2QzK25FUTZkaHFnJSl1a0s0eVEkTmZQMXZ7cnhKOT1UVnZFVnhHaTBFeVd4JUpEeVFKUFVBOSQ9Q0FzelBPXyFXCitNUnBefjktRUxxKW56ZXttWVNLM3YkVmsxZTN8OWQ3Wj9galN6ZlF0YX4raj5BKzhAUGkoT1l5UFBVZDBhQ0tMVCo5VUtlb1h3XiUoSlFfCitxX0xEP2hrWmQ2P2JmTlJGZFFuR21rZm1pRlUjfTQ2PipDRUdSKXFLJTx6S3trb1pSTnx5Pzg1dHVvUHRgJkw3SVZFTTNQQnMqP0NSa01hCitqJT9JemIrNnhtSnI0Wnotc2hpb1AwUTdVcjFoPk99aGgkdXlyRWBHXiE9LSszSF9+d0NAUl9PeGE1YjlGcl9sNG9gIXw1aytxNjs3dUE5CitTajdNMDM4blBVMU9+UHZXXnczb1c4VEVOUUt7dnJIV2tranBnP2FnQFApI3FLK3lXODVkLVV2KnchTVdgS1Z5c2EoejA9YSUybTRxTUpUCiskMTcmZlBONE92WEw5am9uOHVUcXplKEptRHhMUmp9SWAySyk8MV4jSStXeUxmQDxzOX5LfWhlbX1uWT9kO1EpKmd5UiZlJjReaSpndzdjCit7MF8yVThoNFN1K0VSU0tMPHVlZ3FST01SZDtvQTVfO2A0NkBFYkp0LXlmZUdVd3RPQE41QHlFaG5KVik9PEd1NWl9VUA5dEspLURDO0ohCitUe0x7dHgrMiFHbTVTTG1UaWl5bFZre2dPfFZEZGYjbE03dSZhWj1Rd2VAMSE+MDhBRipGOFpwRz1EQ2hoUTZmVCVFRlllZiF6ND5AdDlZCitTZTM0Skh4ODxBJEVGVFVrNVk2c1FWJHU2d2V7UTQ7UmBIbkJmNTwqZT5CfCE9PHA/KHpLITFQZylXd3xmalhHS1koQU5RZGZDQEYpdEc3CitPeztwRHdYN15kaztXZjhCRFp5eipkSmptTFgrVFY7dXUtJGkqZU5BVlBPQSpfbTNscTMmZ2s/RGQwNiM2XnJoNjt3dHRrbURqJUVBYTFrCittQCtQKXhUV21hK1JtbWE9MGdvaHg9PlRlWjU/el5LdW97QzBkem9Pa1Y0WFJCLWshJU5MY1IrN2tnZmN9RG1TMz8lZ1ZhdjRNTkQhTlllCitVTnQ8QmZ8OTtiTU9SSHFSZCpkQlF8T3ApYVZwaFZ6RiNHYDV3TjlYPV8pKFIoWk1qflYqdFFMbUxqfSNiJDw7OWYxaXhWUF9hUzxlVHxaCitNO2R2KjNvUjByQlVfPDt2eSFKcSN6dWgoSntWVzhzOCQ3e0d8M3pqYm5GOztwVHgzUig4UmMoeDRWd3ZURy03d3g3cWJBQCUkRVYpY05PCiswMF5EWnVsQEF5MUwwOEAkWTNnMEo/OXBTc0clIX5wTHI0TndfWmNsTkdSN1NwKEdsKVFKaElJK21EYV5fN0FlIStTJT48cSVQfjhRUjJ8CitQX2BaMzxPRmgwaW0qIUBDVH5HQCpoRk9wOUd2blZBcThjJnUqV252bns1NHpXaC1fJmtGLTFnakEyNVNtPz5BdWxrfnN8SD5heEtLYyhmCitKNmxkRVNUV2gjV2xxPnRJU0xoNnU3fWB6eSkhalAhaShBMTVoZG5hUzNzN3I0LX44PFBfdS08UF92b1R7cEE5QmxlWW9paF8hUWloQGNBCisrUjFaPmRtKz85c0QpNHFYJGAhTD1wRkxtdkAjUkgzYDdNKTF3X09NdkVzSEVmbDh7LTVxJD5qVn1PUyNGQGd6RnR4UzwjUD9APFZHWjBhCis5aSZTeElnd0c/YTVxKURhTEYrSSNBIUp5ZTAwbyh6KDdqMXpXKTNwfnMqPUV3SW95KHpNM19NUUxRP0VOaWw3QyFMLVhLKlN3WlN9bXZ5CitFVldDb3JEblNsekdvdVVoJDZ7Kjd7STFgRmdzN3xtPmpYP3A4JFpVOzkhXzApMT0+bS12QyFsI21IQUxeQWVuZGdnWEhZKzsrTDJZWW4/Cis1NW1ILVkhWV5FT1ltem95YihRfFg3TlFoVW1AJEJVI2Z2U0d4U3NZR3FEM3RsRWY4TDcjdCZaWFJ+TUBubDd3TVMxZ204UjdjO3VBPHgqCitHKHg/Nks1SlZsYzxfWHZ3OXdecl93SXNuPDg3MTVSOXRrPGVnWWBBLWMyZiRaalYjUXxiQWBaVGBnSk0penNCcHtuX0NUZkVHMCg/Mi1lCisycV96R147RShNQUFkbjY/MGxBJEk3QW92a0NqZzZ5NFZBWDtCUSNKaUV8dHgkNVFjb3YmcWdab0dFKUJUe21JXjtaODctUUBXak4rfnVuCitENllRdjJ0KTEjeTlOS1dzPU11cUE1R1hpck0mP1BCLXF2dHdTX1hkaiRWK1dwQGc3cSp1YkAjQD4pKjJhNEZodChQZ31MU2lvKjYwTGlaCispQk9aTUY5Tl5USz8+Y3ZNMCRifWQ1YyM+LWpmIX13eGdGdmxgOEc2WTwxVk4zVXBNJUdJbzBuJi00YGNZPkJOJTMwdCF1Oy1rZ0RpYU9gCistPThzNGRyZT5jRHVlVzB4SSUpRWE+cjt5XndaZiRYNGh6dDxBQWNsOSg1YGc3OUwzdk8+cHBFSUt4XlU4bFJmLU8xVntqVjRmR2UjdUshCituJTw5VnBBKz8rNCRQSjQjSVcqK2cpMEpHWUk0KzQjRk92VFg0ez4wc0dHSll9RV5XQG9yclEyOH4+RUZNVHIrNmJyM2BLc3VnJnVvQ1QtCitRQWNWfWdsaU9QOWxkbWg/bzBOOWpXbGRMT0xrV15zQkE5YD5gYyQ8IyYkTG9zfG1Ma1VhayY7SFJ0YTFHeGJNYENNJkF4bDFIK3okIUdpCitKKj0rWn1mOzlyKDhSe18oYGE1cGBmbnZVUntFeyZmR35IM3gzSj5wUD5SezZlS3tveTkmVmBMcmN7fjJzQSspQ3VwVENtJXd9JnFHe2g1Cit7Nkt+VjN5WDc0cFNRSGBNTXtSS0UrLURzbSQ/NjtXJGJgc2NXXmteP1VwJC1nISg2e3hjOGVjcHNKdFNfUUBxc014XkFHUUg8SVBOanApCitqNl9weTl4dGhhYCliX3ZGdzx7fVIxbXZmWn4yRCtoXyRuZk0weXs0QktWQVpZZXY8PWJQWUpCNF9sRk1CPlB5TiozMjEte3Z0WjZ6OTlICitCK0FRJXxZSCRXZUBkTSQkaHRFSWBoRXhve2ReRTwySU5kbTxKbkFZNC0xZmE5I098YEQ8cl48NUZnOHYlfHo1Qmx1eWErc0B7ajdxWkgtCitSajdQUlpzNTBQbDQ3bnI+ejkrfDNmVz1DfEw5dGlYIXxobTFMbzBeWFhpN2dTZ3FaN2loMUtyWTtiVCEreyNkZjFBN1dKQ298UlkjYUU8CituYkhsUXJuOXNnRXZgMT1fMSgkPTY2eytEc0YtJmVAdHZUVFNjPE9sM19XZUpoc1JLS2MmRlJQOHJBJXNGbE1SQXlDQSM5fj88ZEk9SX48CitzNChBT0A/NXg0TGk0JSh3ckgzSHBDJFFCfiFseDcoU20+OTJ2Jl9UeFBLeTUoNGVZP2hjNVYlQ1NeSSlKMy0xO3tOMF5oQl9fREY1amYkCiswVHorSHQ2MTJaN2xeU1JMQEdZYDEhejEmKk0xQkg0TGxPb3ElYGQjdSMmOXpSQVlDZyNvdnA0OFNAdyttKUpSdmwmalU5bU5XS3NsO0dPCitVVDkwZ01jVEg0XiFeZHslXn1RQClEO3MhI3dYWD5xOW5TeG17XiQqNW1RSFJvfU5leU9wcDt6XmxHWlhhOHtSc1JOZlRIK31xRFBacWpXCit6VEx+MUBpPCpQPWRTM01TP0UpK2w9ZE5MUDMxWjxjRCVRVj52cDU4Q3o1UnUrbSUqJEk0fW82Sjd0bzIqfDstdCRic3tfJkEwcE4/OU8pCitBbW8xO3xOXkU2OGJgVyZ5ZWZXP2s/U0hibUZFe0UoNVFIdD4rWj8hTzdTMDZnTW1Kak55VEpAMWEzQGZFX1BLTXxFJWBNRS01VEs4PXVYCis1UTQoZ2o+PnZrWEh6UDBFNyl5QmBuRjU/X19lPGNRVzlvVno0T0k1ZS1IYEQ9ZFUlc3QhUlE7QFlmaj9YYS1QSHtvc0ZwKGk9UnBNQloxCispWWUwUiRHVlRSZClWK301QFJUYjA8eSF4bldROWJmR3pBTFhEPVZmJCtRO2htezVASH08YWpsPSYyP0dMOE9nMWk2TlRrVFJCR1V4SCgqCisqe3UmazFFR09sPzdnYlpKJktmLUFMazdRc3xyeWM9Plc2elUyO2VpOHN2dG1UNyNSSTsoQD43dkUmTTh7aE4pb0E8XiVZMSV4V1Y0aDkqCit3PHBCVWJMYVc0cFpDUCgkNU1VTFM8Kys5M3dyK0hWXnJxeGNXOEFWZXlBa3h1TzYyMUpXOV45QkJsbz9GNmMyYGh6QzJmMnxiY2czNFBJCitlZDY/ZVA8TGY4N0VPaWNucWJNbn5adlltJEpkTiUoKV8qI19KYk9FeGolUlBqS1k5UTB5eCZgb3Q4ST8kaztpdWItPzBKU0JLdWFuQzUlCis7Y151UzZJZWJMaUJrIUY4SC1oVG01TzlLUUgwMDAwODBQfmQ9TjFVRndXQm0mTjA2aiRqMDZHOHcwQn50PUZKRT9MWmUod0FGTEdzWmIhCitCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwcG9XVlF5eipkMihyTlktd1h7Wik5YWBFXnZBNlRXd0Y9SXVgeihVdHdMZVlBZEN6P1R+cUN3CitJMylLZFFvfVBLdm5oQUQkRTNrSXdXKEcmfFlANnw5emo2I0ljPXQyQnlxYXN8cTRSO3Y2NUptKitmb2hSTjJKYC1pPlRlfTh6d2p0PStzCitQdE56KnlROTsrNHtWOS1tYmIrJlplbih0QylZX0QmRG1aeWkmO3t6PExwMWxkPi1OWV9WekFLcmNzJllZJnVXa3Z9OUFyWTxwX3hWVmFaCispTSpiZHVqcHh9UyZSS1RGTnszRiFwVHVQYGpUVyg/SHAkV2dtLSE7Z3N8elMqWElXbk5QeENrYDt+QmZXdVFjfGppZ01EbXhXYG1DQzQwCitIfGlpej1mMVFreTRaTUhqfnZrQSEtWSFWbDd7eHpQfXA2cTM1bkoxVGJhUHd2SD5KNTRySkM1PSU+QDFtST1nQlI1JjB0fjQlOFpAZW1wCis1NzNfPldNe2xnbThIPzxzMG1jXnRETXlER29JdSgjfCF5Sk9RUldxQ1lIaWRzRGFRTC1xVntXSHJre3grSz5TTkdJKW0oSmkwU3pYNVlaCitKfWNMe15UUCZpVklsRS1wNlUyITwpMGElWHU9ejtHPCszciR4LTdmLVJgOHhZM2IxQVZiYUBMKWJ3RV47TEE9dk4qd2duKV8+PDd3QlBmCitUZDNJQGpYcCFKVXEmVV9rOENiejs0MnQ/JipzUVJ1MTBQPEwhZHBLdV9VZTMtWFFpa2ZrSFU/NFh8UkRGfW98YHRHbEBtNFVsREA0bG4qCitWe2RtRTRQZD45eHlPWVc4JDtJY2xrVlR8JTd4fTktQ0FTTWVhS18rTzk7TXx5NDJPY197bUlAUjdfc35BQGFYWDNHZypJZGN5WTNTZSRFCithfkN2MkNVP01eTlpfZFh1JlBUMU1VJD1UYG97eClPaGFqWmcyIUVePD00ZT1GSi1lIXA4RUgweURVZXZDQ010VGJ2SUc/ZWI9eGRCTFB2Citab0xWaThKWWFsY2okPVVJQVBgSExZc3BsP31uI25QPHcqfCQ2YWM3VlFLY0EtVioqOVlqUStkY35nZ3JmQXo5NFI9KkBQcChFc3RAS19tCitpejJvUitKPXF5bzw0MTNjKzhDZkQ2VnhvfSp7azU4RlRhe2dJQHk8dzVhPik1RnAwMl9UYlItJG1Da1ZMaEh4clFKayVHJGtBek1+ZylRCit3PWJnMGRIbHdzMGg1Mno/VGhSKk0+Kmc9YHhrclokdVJVRSpMSXhlaktOTDVoOGxNeEhHPFJ4eyE8I01rKSVmWWs4OGAtMWhxOXtOMjFaCisrOWtkV19mSHApTXBeYmVKYXh7U15lS3YjKTRJZUBkRihOZlArIUc7UFZweGJfQSU9dypIbyZqfWg3Rio4MFFDYjU5ZlY3KjMyU1RFNUpRCitIVFgjak9ZVHd7cDl0WlljdjJxVVNmJldHcnUyS0I9Y2BwMT07MHIlSmRSdCN9VC1CMk0kdXcqMX40eSM1R0E1a0NGakZ3dzdnaX5XIUdLCitUbVY7JHcpOVZhWFVYa0QtMUhDJnkhN2EqaWdANU5lTCQ5SnR8NyVMa1IzNXVEO2ZUI25FbkUrOCUtRSs4JS1FKzglLUUoVTBqNk9hPi1sCithUH47bGRAN1hoOGhXUjMye2o9ZlNBTShpNk41Q0Yoa2x7MDdDKyg0aj55cUhofTU/YT4xfXQ2RzJTP0BjYG1HNVp7M35rfXJ7YmlSNFFwCitVbjJQdSQoS21KTURpdClGT2h0T0J+bypWNUtHZENPQmwmdTBUWGwhI3pIbUxRMXBAaSRRckM+YUZ7V1lBIW4hJU01U2c1SFNuRFk1fmJ2CitrTn1MTkNoSzUpJSNEcE94S3Mqe2AxTnV3cXB7angzM35CJjNNbjF2YDJLWF5KI14zLVdnVyhYUF40bFJ5VkwwTiFjMVJ4ZzVpYl9oWUdTCitBZk5Re1FpT2J8em03PWEkaFcmdUdGO3NkKEktO2t6NTFGYHtLVjJmOTN1REpLZ15TJmppSy04WXU9JFZhdjdCK2VeNF9PU2ZGOGRKZWNuCit8U1RNUWJhIyQ3XmRtWHpJR0heRmR2ZHQ3O3Q5Yz5UJV9ZSH1kYnBlaGNWaWwlQyZOfmVtYURrcDszQXF5MWVScGQwKnlobnNaQig7azMxCitYPDgheH1ZSVRCMmkqQlZtVj9zZi1eQjZGPGB9ZCEtXkAxVTlnUSMoKHN2RnAyXzh6VHZ+RUA9N3lTSllaQ3BRJjBTY0wlV1g4PnlVKzJJCitvbEt0QD05eXRPI1Z8ajxKYndYPmBgIW1QOylJR0lla2VzTGhCPHQ5SlBNejtGVkUhaXd7MmV0QDlVSmVOQTxsPGN+PmlMKnVXZndReF9JCitkOTJGUFE5TXdiRWRAZSMlTUAyPy1OQSpJNlF9SSM3SGF5eyhNNEA9MUR5I35SSX42fjZkODRZLTBrOFBPVFNnI05ET1YoLWlOd1Z0VVJDCitlSnlqMWhWekV0PGJ6XnF8bV4xbmtpKWg4d3RsTzVXRChNS281NTUmfk81eWFOUzZVNWxXNj02ZChNRU9LT3Y9bVM8MmNsdnVrMGA0bTRXCitlJmlCVSVAVFB7TXtwWGh0RnpxV1M2KnAjSnVTJFluNWlDWU5WJmBFXzxLUGhQY3VmdndMXkBvY29ral9KUXA+T1czZnRqeC0yJldpWll5CitFdlczI1QjVVp7eyNKM05uVnJ5aGN4ZXZodWViejd5Nz43YT5vPnErZChpSSlCUVpnWlN6KzMhP3krRUxIRT02SXgzVHx1YFI7NElwLUtaCit4aHNrIU57XiFTeTAofC1rTmQjYDJRWHJzKk1EV3hmV243e24rTENrc2V8Sz9OYFo2XmtqKmZjbTktNjZXVnZyMSgmdVgpdHB6UnttUmxnCiszaC19Nko5bm9jPlRiMyEqdWlGQiNlaGlrKXUkQmVsRE9vVkopKV43TGk5RDRqLXJsZTBVbyM3PyptIS1QJV45V1BaNEY7eGZPJX5zeTYhCislKm40fWQwWlBUTUk1UmJEIUF6YiFpcHRHUlBNMElTZzhvU1omPVM0LWB5eEpybV5sTHltZFRKYktSNSlVPXgoP1VDZm8hOyNIXztZTmtFCisjWEhTaEo9RDU1Xz1ZT3dGUkJWYiszWnVHVHswbnB0cEZxc3FIRjMqMVFqdH1KTmVjYUomPkI8NGNxcmRGbXQzKU5MR2R+UmYrYzJBU08jCis+Rk9aej8oVnlleVpIX0hjbEVCJUMxZFZBWF5KJGdNTmliLXAqckpxaUMpKyNZbXpQMUc2SDdIVWBwKTVPMVU3dHZqUWBmPDZ4UGBkMF41CitiQW95T193WWVDNjVRNztxNEZYY0UxVlhySnw0TDs+RlFTKjRfWTQ1ZHtFPVR1OzRNP0oxd3lON002Q2tLVD1jWkl5NGspQVBjZngxKGc1Cis3VV9GZ1EoYmsyelBIYndZWURQZUBlcWNtanVMfk5Ebj9qPF5pS14wVClUIVQhMlNxI2tRVllJd1d3SF5kcU08VHdWXyMrQXlKRTBwcj5ZCit+fSNldTNsLXAwaztyI2hjbHAyUD5EXjtUb0VSO3FWfVk3JXwqYldUKjUzKSZSdypzRDVOc2JCKlo9PT5AcSpmcWdALW9gKjA9az1McSMkCis4ekVifkVENmtXbVlMTEE2ciRSZHA7LVJIWnNLYiZLOF5IK35EaDx3VDd3KipTIURhNkA2OEZIZHd0eDxrNEh4b19IS0otdXNONmRFLW1fCiswSDYrJSNIPHAmK1VOTzVpbncpST9ZfE93QzNiM0hrNTVAeEhLKWBoOSN5JnZMfDY/IVY/RG0+Un1vWVlId2BnSz0+dmVKZSNvMF8/alZlCis7am9RP3tYfTVTWHNoVFd2Q1Y/Q1dfMDFyUiQ/dSNMRUJ7XyFUentPV2tFJHJ3dSpYTGE2eHpaUmgwJChUKyojfFVIeVMwM1JWbzwjblIyCitZaipoOXU+I3hsdyZibERDIUBTdWk3TCFoLUYrJn1MWnRgQDw4eXVLYi1iTG16Pzs5aXYxQnR2dmdQakZhTEUhNlg3K0o4ZlcpNmBaMXpvCisxXzZ4LU5yc0g+a19ifTlVNjdkPHh6WVR4YmNMPzBjVlVIdlh0YW8taTwpYEQpbXlDN3Btcn5CNnZFaH1xcHdYWF5wZUtLallVQHVnNTdQCit7OEIpRUpDcENzOVIzP0ByQ1JeXl50QGI7KzJTdjJvRGwyNXombWloKUE8QHtlY0AzJVdrTHVpUj5RWkdwUG9VIUJkY0RqOHcpOGFTe1MmCit6KkNaNlYyTGF1YUQtX2Z6RjNuU188VVYrUEooSHh+bnl9dUcoN1l1MUJXOXZacHxFay1HMmNTLVA4aGxhc207Rj5zKlFNNE41WTQ5Z1NQCit4TTJFYkNhZkZuejhheCRwalNrdCU3KFUkZX1ASHElKClUU0FLYikxS1okbFooUjlHdkooLUVfP0d3JVVaVHs9X19IZHhrdUItb3tFVk9ICis1KlVQbzRRT35xfDdGWUJ3MXk0RHc3O3hXUzgmQDBPR0xubXgtUjNeWjArYTlUS0dQbihifnYmaXRVMF5aRXd3PCtYbWdHJDJSNk81N0lhCitDWUU1NEdJckVqbCk1N1RNfjJkZ2J1byh0aH5eVEQmYno7JWh0TUw1MHhfUEoyODhjSlVPaURhRl9jeUBOOXojUzJAJDZKNE0rcTF5akp9CitEYnFiPHEhS1d4QENSWiY8KjRSJmItUTh2e0dSVVZycy1oaX09QCErfF5RWnUyVnp1UlFOVm1XKj1zamZEU3RqSj1welUoPFQ9aFBodGlyCis3d1RIU2tUK2lHeTFCLWFhODhYVXkkdjcmN3FSSnl8YFpfKGBiSHs2JHlQcVZuWGpWTHpyKW1oeEZ9Pk82V0AqRlpSPUdkZ3VLcEYzVUtGCit6KEYpR1ZxWTBtI058bko4PjljWGBiRmc1eSNJT0xyfjApJV81SndPdURJVTt7SzN3XnM5RS17Y3VrZzdFKih8eDU8U2klPVgqeSMqckNKCitvKTdQVT5JRFE+Zz9pfW00N2dxYlN7NTZMaz8yekZCSmJMU1NobktnYiFDPHZGJlRsPmI9KigwJFJhcWV5IXRofWlkZnk4RjMwdyRrVX5SCitGaGRHc1k3eTx1dGdYWE8xS1ApaD5ANmFXQUsybXRleTdEb3t3TG1nIWEwMDJ9bTAwMWB0MDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhCitPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1krLUleWEw0bV9ZaSkwMldvI35SZEZAKGxaYChLJHs7cHAhKmtHe0Bwa190TmpfbmxwQTxaVjtWCitBQ1hVUVdYN2tQOzVGOHN6X2MqWnQ2U1NmNF8mNERVeTB8b2tvaiRLX2Y3ZCQ+QjNJJmtUcE9wfW9FS0tZRHhtPyk7SzImUURHK1olKm0kCisjbnM2bClGSGQpPzl1SW1wc09eejU5MSlCbFZtT14lOzxnY2sxJmI/ZTEzZGYjbztXLWxheXZyREJfJUVrVTRQRilibHZaTChLZTVkPVhLCit5NmUlU08lM0NsWWU8fHs4N0ElRFU4enltdmtMZlo9aXdeKiU+bSk3dlhRPkVzRntpdEFmIUlfUHEhTWVuaE5fMzBVWSthe25AcS1sWGNhCislODwwenUzbCs5PT1HTGUxfV5Vey0oQitrP0RaVXJ9QVcmMjB5QSRsTEFwWG9ZYD8kaHYqVUsxP0xETnBFbm9qKVk7Iyh6KjFnP0RMP3R8CitlPVdSMHp0Rk1nOWNDLXExUSgoSlk4NTc0dEFGO1h5PUJLfEtGOE5pcUwxblRMekQ+e2BXaHhGZkMzTWYjWDI0JlBtVnBiTD9+UWhGejFrCis7MHFuKW07P01GIT5eIWk4dkQhV1ZEb2gqQEleNE9kNHt0RkAoKyV6ISZWa0FyV0YrPmkjMHEzX1pqVG45e2FFYlAySjM3MzkpPkx+fCk4Cis/ISlMY01Ua2JLVyopUnNwZ287YTcjRlkpOzJzWUVncmlTTEU0bVozJUVWJDd4aj12e2VMVFBZe3AhT2w5YmJOO2tIXiNMQCNYRU9IO0BJCis+NylBVV9yMHtXeDZyMjtoTmBwOUchKkJxK0tiQFpaanYyPnEmbzluektTfUcpJlRsVklaKkopOVlEJmorZUxUSEFLbHlOUkpmLVVvKTliCis2NygqdlIjQXIhQHUlcj1yTWlXaCk8T3Uqel48VXRyXnJSJCMlLVY2cHRiOXhCQTIhd2VpTFN6JkxTUiV7eXZ0ayR9QHFPVmhyZjVSblBgCitJRXQkejZJJUwqeCMhdU11Nks9PWkhd2BxX2E/TGs2S0J7djA2JEg8KjRGRSZ6UU5CfXdZaSthJH1TPT0pPkxeKkNlUll2eX41PSkoPHF5Cis4aF8mXjB5c30lQU55WUp7JXNFJVBOVXpfN0o0TzQ5U3l+aUxsQzZLQF9jTm9gXzYzTmE4RTxNa2I2KnZzYEA1M3hvaj41Yjd8djdyI3pMCit6RG5idytkcmFne2RmbzVTSWJwQSVVM359cTZLc1hjXyNgfCFQISVpJldubHNoJi0oMWlMfiFUblNeenxUIXhVbTRlbGF3PFhpd1A5e3BYCis4LXpIWm4pK0dlIVp9aUg2T1lVeE0oRTNhU3pQKUZfdl5OUkVCI2lJQXEpOFlxVllzX24+eFNgNVlpUF99PTZQclhtbk8xfUB5dU10NHNwCitqQSF9RUJBYHZfd2tAKSYxd1VnXn1wYjcoWHttejsqS0ZAX0dNX3lCRSFEZD9NRSsoWDBFRV5DR3hZZXZ2OEAmRj9uMH5HRilMb30lb2FFCitET0NXZ25+PXBeWShpaTJlPTVodGU4cEFVKzwtaFQtOERxUzZgSkJuKyhjcT1vSkxOU0lNUzBVITRSR3VoO2c1OTIxQD96dTc9U1dYMms9Cit7RmRtZnVCUUE/U3JjVSs2ZDMxJjlxPyYhOH1RTzMzS047czZHJjl2U2VXangoOU4pJXBMZ3xWQE4jJEchNCl2VlNLMDwkUzkldGxMQlVqCitOY3IkQEFhZz4oTDBtZEdLO0tZQ08odVl4Sn1Mc3ZJR3wrO0JGfjVlb3xXOXBWR1Z+RVZWREQxPTd0bXtzYTE7TSZaUV9DbE1zTkcpKVZmCismeWJsVCgwYyVKYTI2UUk3cG8hI2tHJWh0dCVqN2YwNCQoI3VQTzFZOEE1fDFESlpJbD1wMkM9Kz1TTWFBUUh9bzNzfWFnWi1fPU5ve0hSCis3ZlJVQDNXQG0oJWJDbmJFJU5eJUAkR3g2dDIjNTBpeyEyPDdSXmVANWAkR0lXbj1HYkk+entmK1QkRlR8cmg1JFBsZDBzSmAzWEdhbDwpCiszJXBgTk40RWo+U0ZCWGdHMTM1KlRLS0B6MmdYOUY5TDwxbzNAb3M7cmNyYD85TWEwMztxUnpqbT9CLUskMnVQMjxKP3ZkOGZeTlpkZj5KCitMI0AwJl5vPjlLZChLTllQMWMwck5udVR3bD49d3VoN3hQZm9EQU5UOTNBP3ZmdT9BYTB8MH1OZU5jZHReT04lJl9maXduJS11Z0lpXkBDCitJQUErbHpfd1hYcU4pTDxpRkhfMTBrbFFvSWFlYlM+ITB+MU0/NVB8eXQxTj8pI3pLdVc9QChNRyY2PFVkQy1kbWU4WWxAZn5uSlVSckViCis4VEshbnkpJTBqQmRkemNtSj5jfnkpYnMxUkQtdzQtJWt5VG47O3krOGB7VGV3d3lUaDtSO0ZnZjBAdGd0ZW0jPXxKTjlPdGBfPnFAZGliCitYR1FJVEZ1O2A2bihMfTZQXiljbHhQJHk1fmw3U3RESXFQYlZ3VzZVK3tHMmJrSnpSbX5ybiU5O0dURUZfLWN8S180PHZYSSNvezhGbUVvCis8U0s3TD5LT2VuSyM3bEY1TmBtS1VAN1MmZXAwRzsyPj1aa2tvdWNsKWwmQ1Z7NVVee0R1K1p2d3A3Zl9nPT10Pk1QbCl7MTJBNGQxO1ElCit9QVM+WEo7UyglUSZkLSNtWDkxWTNJaU4le1B3cm4rSW0pX2JkSD5lSURxT19xTnJASF4pKEthTHs+MWBwJihQUzRebk4/XnxITFlhV1ZPCithckojbFczSVVfP0RMOV9MZ191ejA2a2RIUnU5eUFeRENYYTspRU5fXnZRdThKWDQ/RUhDMUNLej42KT1tdjh2Mj53OyNheWpXRkBIa3FoCitEc3VhPFFURUJhU09sNSlrRV5jJGNFWTlfMC0/aT1PRC1SVVl5eWxRP2ZnUGRwJHgpPUo0KmV+VHhuNSZ4e1R0QFMxdHFOYkh6VGh6bHZmCit9TWhMO3g5cXRJbUU8aUVVSVFQQkliOWRgfCZvTWFWUDJMfm5fQ0pidj4oMjxHWDhPOWRfYUR4RiZxVkwpalE4YHI0NXl4Y1RFTEt7bTNECitkQl5KcGI4eVUpd15tITVsNXpwMHNVUjh6a3lleF58PkYpZWZqcG0yR082V3d6I30lTUJ9eCY3V0I2Nkl5P1Nzam1mWlZ9fWB5WldiS0hKCitnP09uR21OSjF0QH1iLUo/TGg/QkBlaWppQXJhNEE4TUE5elNlP3lHSGhvNXcmfD9TMGp1YUB1OStLVjJwYiZlLXZqSUBzQylhV1I4TmhICisjQX0rR0Y0KVBgTFpiYlo+c3RwZHJ8eGZFdWdYY0BuJmBEZUB+Y0gtdVIobmAmb0JNYG1kMnxMWW5Kc1U4PzRzWFFXST9gb2VBOWQrIUJSCis0TWZHIWxYQHwqQiVrSW9KYVFkV1RnRSNWRW9BKnQjd3tYenJWUnQ9SEJhU0F8XnR+SVRVTnN1NHZBSnk2RSp5MDRLSjl5aSNlcz5yanElCitSNCZ8TDN6WkI0NmM3UExwZnUwdmd5ITloTDM+Vk5sXlRlRzBQV3o8Vi1KQylZJjJmUDhZSnFzIzttdDM4QF5TOClyMFBIclFuUVg+ZGAxCitVZj0lMkBUfSlIU3BQYjd1fj1OMSl3TnIjLSZyPmZvSnxjTy1HVThfJiFHeSp7anBeZXJ2aE1yLXc7VVZYbE9eX1ItcUdfJV4xPjIkK191Cisya3lVSXNQbFleOEMqTz5ecXk2TntlP0IpTyFqNGJjbFlMUz9faUlhenczZnBTbl9YRGM+KWklaHcmPTJZREtQZ3xQanVMbX5CZXlJekt+CitBaTdTblBgKUVFbUc4enYpSHw0cjw9WXA5Jn1TaSpyfTRkZlhaJTlzeGt3PiE3RFNuRmx9KHcqRk1+JmN7LTRmb3UzbkdGIV4hSz5QdEx5CitfPVZTUnMrNzdPP3pxfEd5XiN2eClsYygmcHc1I3hEan19cXpTJldZO1BXfXY+ZSo7aVUwfFhRUjAwME84Xk9ZN3lBRUo4LW8oVFd8SFlACistREh+O191YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSQj87YlQ0ZFNaZjlzXlZzZDQ3WkVze3tZJVh3bCltCittRm08NE97S19wY30mYlRsQSZJUFB7NTU9Tl5QISt7eUorIVIyZ2QwTHNJMGModCVWPmBvU1NOcUBoRD8zaU5aQEgwdVNYdiQxLVBLaUpVCitBdjlFeDdZa2ZwVT1LclQrYCpuPkRsJCY4R1hMSUlzRkg8KEMlNCNicE45MENpYjhHJjxwNF44WX1WPnh7Q2hnMloyV3FxNW82RzMxJnR3CitVWXd8dSN3dH4jRz5Ufmkobkc3QGExcntjNTMpYmlQWmROSDY7dCM/WCM7RH1GYUdaUSpDPlJuRiFpM05uN0VETilRYGYxTXpRaXpIS3haCit8Iy1xO01peG43N1c/PXIzKCpFZklOeXE3ZU1JLXFrb2RmfDVuS3ElSk4+dXopamRTZCQ1RlkhRlEpc2xHOTJ7cnB1RHRqTS1USnxFPzd6Cit9U25nQTgwNSM3JHhtbmg2QT9wfGktVUomdG93OXFpSyQoJGZjVWM0fiRVZyRpRUE1fkpQcXk0YGglKl9YYjJtV0wxI1dTfTNRPit2dihOCitwPmNFa0RzTG4kcE0lRE9PYFkkKzV6WURTNkBlazB7M2EqSiRpTiYzSUBVaiRzPSVMOHtge3E7U0VQPmolMTIzRGwtOURwV0JiKylmX0BlCit9dSlDe3ohJDFBfV5ye2swbWVLP0JAKlJaVm0pYGZXNjI1YDkjWGNKaj4/Ynp6RTRoUUFuRn13NHBFVWRud35iRmlkI2kwWUp8dmZOU0dvCis8emJAPHc1RFY3ITtJfDw5RWxxK2dyYVc8UElePXtQMU1zZ3UpelZlXnpHdlE+Jj9TR29tX3ZYWnpzZHkkQFRzQlBvUmF7RnBGVHdJcio9CitYenoxViE2PzxWaTE4Xnw3SXZidlQjZnA+OTduY3xKLXg+WSsjcl5mIS01czZaNEMjYiFQbG9wd3J3XkFXTCVNdyEtcm40dTltM0JfNigoCitrNUhXXyhnO3dQfHRqYktUbmttbTxVdUtJVmxIdnp6NE9mVEx+MXZpZnJhJkFsPnFHVTRMJGNJNGBLNDwhM2k4a21iQH1EUy1RayZqbEFGCisrY191NlkrK3cwfmA2KENFO250XmtvMntzYGNMSjFqcjxwVFBQJmhAI2wwJnJ5O3g+RDM5PUkjTE1kcWlgS1RebCpvZndtJisleyZVVUp2Cit9YntfPn5AZHk5RjZpNDxjJHpLTmdmRShXYTxVTWpLJmYyM2tzNkBnfUM4PjtWP19wdVFjUCgwU0NDK19ueUBzTHpQYkJGZEtHe0RWZT1LCitnNzV4aDhqak1ibXhwTV5kY3BFaFdrIVh+LWxCTSVFdEpSUEFleyR7QDAlWnZxcXBSdjA4aipXXyZrTGEmUFd3LWFWWT8hcSlhQTBffXFKCitzZmpZTHt7RSUxdGxMX3ZsbjsyO2UzaT0hRVROdCsyPnomNFhCRGxsWmZLNzh9SGlGcj5fSW88Qms8M1FnPi1CYXZaak9kfTFEZ2lJclh5CitWWTQoPXRjSmEmWVI9VSgzeUxaSV9GYFZyTylwaW48b3NeZUk2MVFIMXJ7VGAtcT9IJD58az8zSTI/X2VwcTxLbyhGTWJuKzU9fGJYQjJQCit7fUpTYW56O3YqbC11Z0dNLXpKWVpVa19penR5UUQ9fmA9PmJpejJUMmE2OC1fdkZWUnBGb1N4SHVeazgybGZgbUpiPTk3eztWMEY7bWJFCisqLXZ5cXo8I2lHTipAcmd3RlFeVFM2USU3OUkyZ15pYkg2ZntueTVwK1gwOEpGRXVvVUd4RE0zZFlJQVklT0wyVyYmM1VYMFdEM0V9SVVMCitCdXQ0KDtxVXwmTkZLKWA1RE9xZjxZU0NHMW9ULSFXXiFhKDB4JChIJks1eXlqengoeypURiktYi1EOUE3YHRwSyg2fSZVN3BnJXg1VXs9CismPSYqQm41PTFUfXhSOFghMVpMIWRETFZDXzdLQktiZyN0Q2BFYX56aF5iUWsyRzdLb2VPdjBAYXo3Yz5hO1VDSEt1I2ZFVUdubH1nNX17Cit4YnYwdVJlNURCJipWaDZEI0kyQmVWczdKJnxmUGY4N0pkUzRxRSE0SiUheG59alNlbj5DZnwpQERqI242dzIlViNhSTV0ST1IRyp3NT13Cis7RGg5ZEtFPztzUjZAOHl0JEY2I0dTQHsrZzxBcT5eSldhREs9NWxPTG1BYzctKE8yS35kMTw4PF5xUWxuRV5lQXBmSTE8JUl7KTg8dDY9CitOdmx5QmMyWWBHaW9hS3Y9UmxUOW50O1dgbD1wZF4+Jkd4bldOPzY9aCR2VGxaflZLSUo4R2NlNHhZcnVGV2orMmEhJGxIN0FpLTZaMGspCitTNyQhUWx2Y0IoKWxKVHVDRllQY1hKXnNHMDtvQXNlJWN5PVRTbmshK0w7SyU4Vkg+MjVhZXYtVChESkdTQypfPnc/UTM9KnYxQzM8Tj8/Cis4TExwaCQlUVc3PzN2JSUqN3IkRGh0bEJgPnZQRVZjJkRMP0NnRkhqdjd6MXNSYns+Z3IzJiV1WWRPO2RlPlg5aGRNYks2Y0A7UERuO35qCitDKDhpe2ZaNnY4ZnlVJGNRMzNHTGFhKFhRelFTJjJxbjs0RWlSXkYtenhFbTV3QmkzSXwmdl5rfDtyfVVjQGwmV3AzSEV+dGpEaV9RKSZqCitucVBIZmJ5NEtwNTQpXmhVQW1ofntpdTc2KWJQdFV3XjxVYXYrJHA+OWh5UnVSLT91MCt0QjZMTnRrTjlXckFKMT4reVpkemEwVl9nLU8qCisyRmIpVlZWQkl1dDktST8rR09AaCFxSGBOentseVJeKmsobmxlRntVUmJwZ3U3Uk1NMTVGaHZwVlEkdHd9RDJtJD9oIU01U1VvcGgxQ21PCis9MCtnUEhGMjR8QChEX30jeURfRmFvYCMjXmlpTnprP0pSZHclQSh7Mmh8KVhfQ2VSY3BieCE8N2VzPj4qMUB4S1VudVZvYncjWGQtQ0tUCitFdH5hWXswYT56bkBobGVGJVE+MS05R0RmVURJUWpNS2AjPig3Unk9WEJDWHt6UnlWOEkoKEMpTWBQX2MhLXdsR1k3MXxFOUVldGs4KEQ9CitxdXVlOTNaPTQpVTFeeztyfSV3OVpvU2VRfilUTyo0RDlkWE49aU83NWI2P0dlSStOQDt+PiNoNyFXX1YkRjJDUDhmdyNzV3FtKj1BfTw2Cit2dDklQHdJbyVnbHltNWdVMS1pR300RDZ7cVpoPkpGZnohTmc9V0BCQUN0cCEhZGF2VyZMTVQoVXVaUGNsdHI4bnRjX3Q0WV9VYyt+JFlECitTTn4reG91P3dWWWZ4VEROfD5sSzlKPVdkNEQ4MmxgfXthaWdHbjdEJD1lSD1wJHlgbUNLaGRfUXJSZyl8YmdeSX5BMFNfYFlVVT53YX5vCit1Rjd1QWd8Y1pKeVA3IUZQMWlBPTc2KG85KWwxc3U7bT9lTGRQP29XMkNJcGRNTVVrQ1d9Y1hJOVZvKXV7RDAkb1l1aH0wKjY+MUUrT29zCit1dGBKbWhBbmtINjMwdm4lNE1EWElKSTF8OVQ9enQ3KnJqaTZZcEd6cVl9Tk9gZFUwUnJoNUZKSjI8cDRmN0NUZDJkVWE+MnJuIUV5YmNKCis2aGAhfSRgK0ZzYXhRKUB2YDRKb3MlPW5PUyUme1hAey13cmxGQVdLVSUwJG1TRTJ6RzNQYXlGV3E/MjxVeF9QRTs7aVJHUUx6U1VASj9jCitONDsxald7KFpCdlphOyRVWjlEOTFycmRWPzE8I0hPXj5ZQDNtYFdhSWlPP1M1eCEtV1BQO3VJMGtjNSZWQkprWXhzOUY8M3FZSjlhZzckCit8TGlHPURTcz4qVGxgVFc2Zk5zRGBsSnlIaiZxPUxMR3ItWWFXSWhEdzI2cEhNNnA5WihlSjZld1BYeEdpVnlEb3x1fT9pVE5GV0puPTM2CitHJU5vKXE0K1o0LXhrcV9RUiFvPzU2OUh9NiZIVTVAP3BaQ0BzMFZMaGJ1M1F7YT5LMmVEOUV2ejI0Nnp7PlRlJXFyflNnQzVIU0I4ZmN4Cit2TDd6WHUkY1RPQEg4fjVQYFA8QShtOEwyTiFNUFZDJH1VaFBEIXVrejZ+PSNpR2RAV0ImSDR8MjREdTlzS1VEdmkhc3N2MGBZJXZSMHxYCitRUjAwME84Xk9ZN3lQYDg/WCN8aSlkXyVId2ZJeypMeGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUCis0ZFNaZjl0OVpmOVh+WDw9P3taKTlhYEVedkE2VEpMWSRJMT5HP3poYmIjVnEzdD9sOVhmMURlZ20+UDIxcW9CdUcqJGBzdHc5T2Q/Y355CitwcjcxY2V3eGs5eFlLTUNFOVZlSn1lSG44bWplVUlER1R3JjUjYlh4OTkmeT9AbTZQcDN+WHNAeVlyMTNCNWJKSVF+MVd2RTIqeT07bEd2CitNVW1WbVMpOV53SzlpSmBeZU8qbWxCT31QQTBIUTRHTDVVZXBsTz1PdGZERHdfNShmaUcpdC1rQlklX01XU1ktcUxIUWszOS1wdjNtc0w1Cis5PWhBWVU8WE1UIVZ4QVlQM3BsM0J5cn1PXzNtSTIoTXpfbkEkTnA0dHA/dUFrbkNoWFRTSTRpM1BiTHZ1YytMMGVDezVgfipfTCFBT0lkCit1QXZwU09GSmdiVzJjN1pUb205R3pSaHYtdldlNUsxSXkpVGtTZFA2ezFRSSpyPnZVPHB+Q1ZvKHJDYnZhZ0VFUXthZ19LbjBjaHdWc3lgCiteUW9wbE9eQEEha1doeTlXXiEjbzZyRnl1a1IhZTNzbFQpdlpNfkxwVGFgQzV5KldiTkohPkdvOHMyTmE9JmpXUHhaZDdxQDlMI28pN0tECit6ajJqVCsmP0tEPDJGfj8taHtpMV8tXis7ZU4mTFRhcFEkdEdVMClxUW81JWAmYGV+Y3BNT057Vkp7JGVxP2o1MkVHUjlDOGZ3bHAtMWp9CitES0xARkQ5S2lDQUhZM007MUdkNkt+ezd0WDtJMyVNTEt7Nyp3WEsoSHk8eFAtX1goZDd5QTlePmd3cUg9RjN+eWZAd1RPeyVUTGo7fld5Cis0NXV6Jk10WGN2JTlERip0SXt0X2VOQUZKMFBIKDtfXnpUbl4mUUdxZD5IV25POW5zfnspeT9WZz1kK19MeThMYH5kMnhOUlBqb0clcmRXCit+YkJlfHZjNGxXO2FGZ2NTfG9UT3pQYFdLfFAxaSpBZzVBaXBORyo0diRNTnkwcm5KLV9JISEqekNTTWckcUFAblVKY2EtSlRmUyFzMytKCitYOWQqQFlMQS12TEJGLTU8fmFoZiRuO09fNzNZNDFiXjghUyh3eiZ4LS1RJWdhaWNlbWNUZkNPQnRyYypyPT49V0U8cV9tNTdfZjdgT0Q+Cis7LVR2NGh8ME12ZFVBTUtFeT5sZz9QJFoyI2F6TnJ8RlZyeGh6JEhCKT55OU4tIz1obUhifDxKUGhGaHNaUWQxYFJrUmU3RGN3WTlVZkEtCitlN3VGPFNNeDxTdHJsQEQoVXQ0ZzwqaShpM2VLTUxWendHNjR2Qz9YQ2tvJU9oSi1xdyZsNmJRI0o4ekQ0OT8mITZhVjxRJG5JbElvaGllCitje0d2ZEMhams/KnVMOHQyKnpPcDUmeHRAaGR4MERPcTE8cmdDTEh8OHExKmBOTWh2eikqMUhMN0ckZih7NEg8TWUjNWFKMzBfVjZNUEg+CitLQUEtPEplSUtuLVNaYGcmZjg7JUQ3NFJMZGZuP3Eld2p4bWdKM144eTcheDZxIV5sUHh4Mm5hS0I3eiNNITcpKT58QFhje3cwMHt3c3omCitXWEIlMGBXV2JCY2dLOzl7aFZtNyhIVWcjLXMyZ0dSVT5EZCVic19hb3AzbEt+JHc5MnwkaDUja3UpSUtWTiZGfiQrJGZaWjUmMiR6cHhICistX0RLMm5TO3JqJHReNDtUVlF2NylDSVJVPkx6TGY/KSlRNSRxel5NWC14dDdyfTFBOzl2czcyQEVHTm9XTzdiIXdDIzAydW5HaXo8NHFsCisyKnorQTM8ZmU4OzRgUns5ZXsoZWROeyV7I3U0R2JIVFYhSld7QGFBbkJYd3gmPzJ9SEFYJEtMMGdlTys0dW00PzAwJHJvI1djYllBWFckCityNSpWYTFHZ1Jqb0RBWTRXRV5JP2c1Xl58elhhdz52bHNGRHhwYWNUKTI7PlJ+TT9lPXNpM3ZwME5EV3JEY24wQUtoJF41K3Izcig8czJDCit+KUZwU2hncSFWbGwldWF3JGstNyNpa3kwVVNLczxyaUt0UT96WTd+JHF4KDZQPlAmclp8SyNjLSY3RTBFazNLZkhkeTU/PF8xaDBlT0RhCitrbCZ7QCtkaChyek9EckBQNlk+PnwyfTFsPXk4Tj5PelpSVyY+NENaakY3aUUwQTc9X1g7X087akVLKlNkKm42I1peOFlgViFvKEBoaV8oCitSN3AwPkwjakRWMEk4JGNONWlGIz1kU2NkfnI5eVcqMHhFUW9VOGRAMGA1Q2V6S0gqRU16djc8c240SWUjWlR+cWAtZGFmRDhOQ1dWaztMCitOMEU4WG5IWDlJMm00fHFMaU08aWN4biQtfEpaJk1PQGBgbUNoeElIIWp7KnpWRWNAKiQ8SU9DPmR4WnF6Snt5MTkyPGxpS20ze0pmJHlnCis5KyEyakN6Qjtjej5PMyRIZVNeN21aQ3QydHdtTzNaKng9ODkxZGJIfno2SnF6NVFHKjJ1XlItdU0mUmUoJSp+enFub2AhRl4mJHdMaVFFCisxLTIhISs5JnJPeyMoUXJeLWRsN1ZKPkJoYTUxRF9zdkdvIUZucCphWkdhai0zZDl0VTBGX0t9JTApKnVWQ1UpJUdoRU5xMSFZKmJkeSR1CiswaSVJZDM+dnFyfm5rJm1lRmt3JDt5X0k/PFZVUTd2cjN2WmZaZy1HTyhXPjEpPjElWnNhVnFaMGpeQFlUbU4pd29IQ1ZpTio7SG9GQExDCitqKCg0eVU8cVJfNlZMKXE3T3F+QzNRODVBTVhiaTB1eUM3LSp3ITRWMHd8UmckKVFjPkNlKj5gR0VKTD9BTDsrTWBxT21gPn1PbDNqe2pmCityVSV0d0BIV3QwQW1+QDNYdFBwUm90PVRPUz1NKSUxei1IYVNwJHFOP09KZlVeNSQ3S3AkcDkxQ1RfYmNZYkEwRW1xeEpMVEJ1ZFd0QCtLCitsdSUzKE5uPkE7PFNRcEdaVz4jamNPdUdNdSoxV1o9d09NJWElRzlwfihLNXFaNzRvSk5hU092UGNXRmlraFV2TiVPI2EyZFJpZTd1UlRmCis7dWhsOCNyP0VSVkQ2TCtENWBpOUFaelM3LT93Uk9tdktIelNNY0dEQW1JfjFkTmI3ZT1ybGlobG8xLSVrPVhWPjRSOHxhKjlNeiV1MEohCitjaklWUClIXzVUK1dySEUrRXk7Y1p1NSVmU25rWHlQJXw3UGRLT1JfdENLbjR6THwhYGcrekcjYyYzVX16UnM/T0UzV1luODghWkVVPWM7CitEPmMhWVFjMG5eU2VtVDdka1ZHb2d5JXUtXyVeI3UwT2d6WW1JMEdYNmV9IzArVUZzMUgqeDZFbkd+TjQkUipKVCQjRTlgQD5nS3clTkI4CismKVQ4UDhmNHNQd31FZ1Z5MGRaWFM9ZjFeOVJAfiF0V3xgYiluS2MrdSg0UE9gWkZAP2Y5P2RjMXArKEF5bVJITXYwMihnWFpDZ01uKyRhCitqPS10MW15fDloZSY1dkNOcmVBdEZhRmYrJSNPNVJyWkpiOHVfSDNxbzJuJkhYMyRfbTJac2d+cUxCT3E1UTIhUCVJeHE7X2E5QkhDVjF1CisrN3chP0JvKVhSZUxDbWlxSFlJSip8ZXJrMVAhJFdfcmVxcmhKZklIbiE/fF9YZTRGe24hKVg3ND5Ud05VKWVwdSZ1UXd2PUxIdChDVjtICitkP2RnTUtANkYqSTR3IXFHY0hkcS18fFY9aT9EJWEzPHU7WThpI3orfVA5WmZjXipMY2JAUElRPDtoKGg3YFVRdzg9KSUkJVZuc2NpXjBgCis9JHpuR29SYTFkS2BvZjJPNG1Ia2g/cUMoM080NWhyIWQrZnhZfGEpPFdwYmcxZnYwejhZQkhxM3l1aFN9OyglamcwbD8+fnBpbD5nO35wCisxaGFsbT4/K2FEUHEpYytzKiQmO3Zlam1eO0FYKyVLbiZifHpeIVg7VmQkPW43S3ooYEpabUhHQXJLQSVTRUpvc0xRX25BbWZmPVB0QkBICis3YGtgOWBFez9VO1hjajN1UEdKcG5gKnRfMmZ2Xm1fRChpQ0s+Y0MyNFNNJSNTKCNDM0pvPl8mMUs9KHBuVTNxbENJeyRhdW5yQ2cpKGQpCittRl9eWnc+QXRVVS1XeDJsfWJQPjN5b0dpRnBjaGtqdFB1dTswdU5KbzNBOVJZei1HfHV4X3JjcHx5WkZgQ0MoWHNzJnhETzhAYStNK2loCitISU97OERrWD4yQ1dSMWltJCl5UCowSnY+fGo7PE5uPilvdipLenoheGlYJmliLW1pQD1gMl9oKFZ4eWBUJTxNcXM7TWk9WkQ+VXlCPXM8CitnUFMrNG1LaUtfZnZ2N1hMZEgrYEA4eEpoT2QxdkA3MmFFYmFofWo+QmAlM0BIJU1UPn09bXAoQztTdkQ8SngxPmIjZnIlT1AhazRSb04hCislKyh2ZUd4aCQlcj9ASlQ/LTxwOGBDKD1HYyhhQCooPlQ0JSVTNjM2YWkhaV5nKm5AdzRBbTxjRTJGUGMmUUcjP14oT2IzdFNWVys7SEZyCit9ZnlQKEw+TzZqd3hjJEBWXn5JWWdJKyhsPktMITV8ZzVOdURuUWFial5FK3ZPYiFiMzAlYiZfTzNnUmxiSi1TUWR1UUVFTUVkTGA4e3NUCit9OzB8WFFSMDAwTzheT1k3eU9GZSZHPHE3fSozb0hOdEhVSXpzYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSCitCPztiVDRkU1pmQTY4VlFGbnxXTXluRmFDeWFBWkV2R1U2OF9Hd0REQ0w5aU50IzgjPEFtIT9uNVM8JXRuX3RCXzZIakJlQn5GOFVrTHhHCit2aHRvZjRgQEpybUhiZG9YbHgmNUM7MEM+Wnp4eXRCVlpwLXUzXlo1MnFpYHVqdTBaPG4tJDlscztUc3BadHJxakQ2PzVxdkBsZj5wWHNsCisoPHFebllfMkZTPXJhMiZQTGNARVBmeDJmbzwoSnIoPTNUcVRHOSstMkEtTEVwMmxVMm5aSyM4RCM/fkFyKSl1R2s0JWllUWVgb1ZtV3FqCit1diRWaXR6UmRGSzBmT2whJWpAPTh1QSktUz4zJl5GKypCM2lUR256NlJnV2RAbyRRbUNPYiNLVWNsZHlnbFowO2QqbikwVnE0S1k0VVIhCitkS3JEWSE5dVZDaDB2NDRhWHFSU30lTE57XnBrakdFLTNqdHdDV2t4c2FALWEmcmAkMUlfLXsoPWopfnFkWnJLcmRqPHU/RihQd1ErJnZuCitadXAmRXVqTDQ8YnM2KClxN2hqYD5nN0pZS0FJKDwrX0E5RjRrRWBCUHl5e0NNPz1FPnI9ZV5paWNNaGMhMj1geWAlV0A8bHZUWGB2YDhYCitzTyRaTjZYWmkyNkVRYHB8Y0YpRHxYK0xpcVdyaWVecSZiN0xvJkR2XjVmYWcwSl9ZUXNhaj1td010cEsoOHIqSCp6eWAmYFdgfWJXVSt2CitpRzJrM3hQZD96YFZDPTRfbGoxOVRDNVR1NS1edGpJR19IMHtiQD9hU0QpI1I8SjtUZ3RMZitXN3o/SiszOyklVTstQDctYTg5cilrSjU0Cit0OzFGPG1kVkJJYVcqbVB3emNgPE0qNjdkOXImcChVY1hXMXJPVUhDYGRePGZxYEUrcjdPRTtmeFo/NWw3MlNqJkQ4SHpRVGVJJk9PRkNnCisrTTFDdylBTXNaVHFyaGtUZTNqaj4hXmNhMHJhUHYmWGgkeEQlTTMoRFVgN3BgU2hzc198djRwOy1jdEw0YWB0JlcyNWolKiE0ZXZzVl57Cis8YmhwQUNGRTVFdkF0VWxPP0I0JTUlIzF3QH1FUyhmfHNBdUNFZl56cztVMTFVdUNpd0Zaal55djtRK3kycSUpbyhpe20zSk5sJVklY1hkCitSYikmJV5zc1huanZfS0l1S1VIRG9UPHklYDtWSzE0KF5IK358UE9WT0ZafFdoRyQ8MzI9MkJKKlohQVJrX08zc3lSSE9WKlBYdnhxSGkxCitJeEFPRTlpby0hUl4re15OQ2p1I3ZWMn1tbHQmYWBCflFGMmNQKzljJC1jIUhtOClXdmwkRTApQn1SbEhgPUQzTmJSYU1DPjxMfj87LV4/CitZNzdebDUoVm4+NkE4MWkwI3lYXm88eC0yQU0pISQyQH19b15CTl4hS1g/QzRzZ2A9UFROcVpqMUBwbjZpejR0YCRUPHs3cHtpaFpxdzN5CitLVWt5REcyVDgjOH1KR1lBb1ljJTNlYFhVKE45T0RlfHRsTmUtNUFaQn1uJl5BPEFMey0/b0QmfiRqOGp4JWhKaHl6KFJfJkpOI0dOJUd7CitJQj51Pnp0ZDB3P1kjYGhLXy0lfFZUWk1uaioqNSt7WldlR2x6SWlfLXx2ZWtnbmlSNj5sUTF9Rmx8ODZUb3VSJEBraE4wU2tUOzFRWj4zCiteZHg5SyVlbCFMe0d6VEFkPG0kWnBKX1pKMDxNSXFRIX5mRm9zfkwxUyR6YzV7TSpGTlRKJj5SJSVYZ0ZFTCg5LTspeVpCdXRvUzRBNmIzCitwRHxIbHFRcGUwMlYtSWdCX1NxLVAhZUtIMm5GRSoxY1cxaSFOaDYrZkpAeTBATTlmTHhJeiVZJCVGfD1MKG1SSUx5Uzg+LUAofVRYb3Y9CitGayZlRzF1N0Y2QEFXWUVZNGwkNj51RX5eSTUmQX0yQWVoNHZmQj54dGpZMTxxI3xSelRjMENaQiZgX1Z+NkI+PUNUYVNhXzV3ND5VMHpkCitAOTkqeVlLPTE4cCM9TVpoK2ZJX1dKYXwyRyRDV3Fod0xNNzEzcCs9eWkzYEVnVFUhaGVLcSl7Q31mYVpqPk1xRWNZJDZCQ3Z0eyRUV1k3CitSITQzezh9XzRISE5EaXBnVWd0TklHVDJ5Rj4yQj4wakxFSjNET0o+SUBmSkN+QGQ1fGU2QkA/PDVwbU99bHhRdDM8O009Jnc/MmlnfkxqCis/e1Z9Qj00S1ohNi1aJio/ej9Ga1BSM1FMTk9sZVplKyVpXypESCozPDUtbT9vUVBNdk0rVyZKfFkrZCF3fHghTlRuQjFgY05hKWk0V29FCitoc19iLXNJVF55QTNAdEBgQEVwLXN6dWUkdlN9NX5VSHY0UkdwSSlCS0NBI2Y8c300Ukdxbn5idDItfWZyYDh5WlIjRC1SbH0xc3UyaERICis1TWhsST1MZiQ7MmJDezhtXj82flZGPSFpJi1KO1BSd3p7Xz5rUEx4dig3M3chUldeNT9vZ35eSnE5UkUmcT5BPWxibzIrN2dWNjZIa3YlCiskUFcxP3VxUnN0bGBDfGJAcl5NZEtAOXY7YHtTe1N6T3dFRFNVWTdDd1E2fUJqaF9pY283LTZuMlk2UmZeJkJ1WWxFWHZEfXl5bEx9e158CitGIUxefEAlTFpYVXZMdSErRkx5S3BRSGMxNklNPWxwTj1me2lSQUliXj4hQjcqa2JCSiZMQTBZaE1MNyRvNXE3QilDPXowSEBGQGtjaXZMCitLQkgwKGBqNjA1JWxZP2FlSFJUQGNkKDFffWJ0PjYqM2BTQUc8YjNnez56MC0wXn5CeTdePWB5PjRiQGJNTHV3TypCfWJme0VTQ05QKjE8CistSzsxWWEkVWNoKW9HJSVVNSRMelpTdVk/RD5zcDdxYEJMTihQOXg4Vns4SkZ3SExVeWV5e2hoTVlhfTlHNntYTnAjLWhIVk1EM0dXdThVCitUPktVI0xaSVhGS15tXlhLPCVMWD47aChRWG97aFA4JXkjNi1jRGhUfXdrKl8qU3RsUngld1VyJjdqQ2NaekYtMnhATCpTPS03VnhaN0BTCitEN0RXMnlqOHdvKU5PQklQQjFMYkRyJX47JUkjbn5JQlp9KDx2bVR8MXg3SUc3V1o8OUlTbTdsWUdnOUZSRkNEU3E7d3Y8fCQmRWM4QmNJCismb189NEpnMmlMJXdgUnRFMGdYZ3Alb2ItWjh+TiFKVEkjZXZPNGhFTmxRSEtufXRhNz9oZHJqUGZSZEdMN0U4VGh1YHdLMiVpYiQ0Z2tVCisjVzVxbz9ueH5BUEFXVWMmKkdVQ2JNdFljK18qOGVTejBUIVo5cV5mfklqfSp4S3l3IT1oO3l0PSU/OUkzIXZsNDQmUUFLX2tGVFhtJX1GCitrdjdENXdJKW0pNztTREghdXtifEFHU31PeV4me01xYzhDSnk1dz1gdGoyQ2RAVXM2STJnWlRDSzZRdEwma0YzVlArb0kqVF9AVSMpVThsCisjaUVVRiZ2cGFKSC1DRCZ4YHIxNEB1fElmKFomISpAN0lwPH0tK18xRno8dWNvVE1mSnRGJWVOQzszYTVWWHF2OHxyUnI0KGAwSXsrQyohCitkeFRKaU5MODtoUDw4bilUPiVrfihsPVhsbSRve3tZUGs9LXZneDRkZCFhSjhBYFdCMDRSSDx5aCNhSEV+cSVBNlBKXmN5Mn5Ubm5PfHVxCis2KDdvb0dfNGVHUnE0eU5mPXNiPmpCN3E4SD05WHQ5fmU/dCpUQEhgO2xVXlpLPWxjSCZNNSV0fG82d09aXjhwaVROYk13Jk8qS0pBdjE9CitYdm1+VD5FWnBiQE1YWjhwUldAX3E+TGt5fSkwOVpMdyNJVWJoSjZ1Y3dfaTdPVkI7c0EjcX10Sk4qR2puNV5VWHJ0MU9VYGgzRDJNWikjCiszR0dnMlBiOXQpZiFTSlJrQTA+aDtpWm9CYFN2ZFFeVERQY3chSlUzZjVES3h0MnlZZlp7eDgwYUA8NnNZPDJSdF5sbkQlPC1xZFpnKUdACitxe21WVm5MMH14b1dwYHR2S1VVZnwqSUgre0R6ajFWYSR3cC17cFFOMHpjd2E0KEd6PXt4d21WJWVQKWE0Wk1Ca1R8QmgjK0BAJjlHS1UzCitsYSZIJk1naE9RYUIjan59S1h0bldMIVA7JF40X05PRGQqa3koV2ApNGlBUW9XUDdrJlA1MVUlUWhnQksqQHByNXFvdz5RVE55WHszQzBZCis2ZT9aWGtHKjBPTVBgQmt+eUJSYGZ8T3o7eTZSXjtJVHByY31OWF99QCE1JWI8fGclNnwpcW49Iz1DY3c7MjshYlktUihlWDspXkg2SzZ2Cit+NEBpWlUjN2krMX07WV53XklfO0BgZCZ5MG0pUlM5PjN8SnNJaFRJZEsxYldEfjU1WHYtX2x7fExidzEteTJHRWpJcE4yKWdAdFBlS3UkCishUzNDdzViUj1KdiRAKittbE8zUzRxaSpAM3RyZ2F3ZU5OTWRJYW95JXx9YEsoKipOYiFvTk1EcEomY2pUMGI5QS1eV3xOOT1YJlhgcHh5CitYNHdxNHgkS1VsPnstSHhQPXhNck0jPE04NyQlPEhpQTkxVXtRTnplIUZwPkpwaSl6cHBySXg0WmdaXzUmTFkxWTtHMmtwcDNnc0lfZyh8CitQMkN4IU4oZmFlemdgcE5yYHtgZ34mTHxAZTU1dkFGbWtAc0l2TzlLUUgwMDAwODBQfmQ9TjlDSFRuUl5CUjBCe3JsMDV0I3IwQn50PUZKCitFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwcG9XVlJVSjNGPnJFa1ZyNm5KYUN3empUWFdodjVQdFdzKmczcUFtCitRb0IhTlNvNkthQiN+VTB2cnRPV0hLR2J1fD8zdFNYMzZ0YURNJlNtOUphX3AyNHdLYHxZPGtEVXdVMntUSC01LUBBUzJiKilhez18SDxUCit1Pk9HcXgrUzlvPDJpJFk8aip7RzFGKGU4ZkpibUl7XkxSNSFYKUljT2ghMjMmMFFIVzF3Sz5FUSRtNz1zI1BQayY8KGxic0NMSSpTczwyCis3ZnwhQllWO2M0UU9odWwlV0dHckpSdzRJWCNZR3Q1dDZVMUhVKGhmTmdeY0IlV1VnWDlKZ3YzR1RgRV9TdD5xZjI8X2dOejE9TVJiNkhWCisrQHVSPCNiVV9gblJqOUEzdkVBISg+RUQ8V25wSD4pT0lsQjBZNWBjU0d6UUIrTiZ5cHxUNlFHOSpsemB6eyV8KW0rb2NTN21aWGpxfVdiCit4X0BCPy1jbTJLLTY3YSF1S3ROeVo9Jkd4ZGdeLUA7bX56O2k+OCU7ITxla0N7XjdoVz0rRTV4KT5WcFJHeD4zVm4+MSFjdDV3cUJQMGhgCit4RUd+MnQkR0lFTXlZdGhwVlQ2ZGtGNHZrQSlFZkgtYVV9cUlzVDVuO2RaeE41Qj9uVVo/KlM3e190cXJ0K2YlPlF5c2tPRHQ5fVJ3JW9RCit7S3MtSDMzITF7dU9ZeTQkck1ATG59UiUyQTkkJEUmYXBXN2ZDZSRwSCo3ejZWejckWFkheV97MF93dUE/KWItR0dLTjxGMGUtYmNxZ0g/CitYYUVyUUYzTE0xKCRDbWhGOEVgYT1RQXN5Y1lqaGs5Kzs+TFM0QDkpdS1DbFM2SztHTmthbGhqQFU9SyNuZj87Yms/cGwqeFlYcmx8WGdGCit7PlJWKiVKWF5KVkNgO3dmY2Mhbmt5MHlCd3wjTnxPMGh5SC0mam5LaXNocT9SOHUqQEZBUz49T145a05gWFJsYDdwJnBLWCY8TyNoNks3CismeEczY057PHlAVHohUShkJUAqU0NWUiFtQyFgJTB3a01kPG4xdzQjSTZkTChfSTNnc2ViWU0yYn1KVFpwYUlPfCRtTll9OERFaUd6fHU3CitqKmh9Q29Wb0UhPGIyJkd9VUJuU3hXSlEoUFE7IWojKCZsbT5PemZzKSk7aCFpcSt6NjYqX2YmJDd8UWxEYTF6ZFh3JlFEeF9+MV9OZXBrCispTXx+VnttRElpZ0c8QWgrfVplMDExUllrSFJCPWtqbHVXXzNRWkNVLVRXPWJMUDREYlpzYyl9bFhTQHkpK0p5ez4yVXxnOH5KIyZhRCNsCisqYGJsSlopV2g8cjRFYCRLU2IqYUw5S1lII3AwWDRFeC1jR19QdFhwYm4+KFgxKjZOe2VOd196cHFYWmZEMHZHISRHSz9OfUwxPDFYI2JhCitUUzZjeChgdTRSQihzR00+bXRGOzt+Yyh2eUZ4RXNSUlhYOHhiR3RjS1VpTylRcnVURmdSXlpEdztTM2pTeEw0MXcjYDVNSTZERFl3RHpJCitQK3NDR2xPeGQ/IUcxOVB3UytYWENEaj9ga2pLKGZGPjI/YGs3SD1lLS1AdThIcUQ8JEQqQjxCMEZ0SnsjOTB6VUUlT3F3ekl+dVVVdT4qCitRWkp2PkVKTiNoV0t1X2B2bik0OyorK09LV1FCQy1OYngzKSUkKCtoNHtZZ0BNU0xRcjxqa1BHXnhmQi08Unt9THlQIVk9ZyleMEB3THc5CitZWkc3bGU3LWpFd1VkNmFlcFpnJWlnfmUhJnVYNThPSyUhU2R7KVhnJGpseXFXUGFXZS1gJUA+Z0thPFdpMD58KTUyU1BXSGJgIVM+a3diCiszY0BpJFlYJm11JlFvY2NFXzVkVnsmbjc8bVVCMUQjcEVtSz93c0IkNVA2eGdNWmEmJHc4e25JWFpAN19OPDMxdGFGRHpLMnRkNm8hJGMwCit2RHF6Y0ohe0k2QzJQcmIrZWV+fHJTRXohJiVVdW5Va01TOz55SVZRS3I3cCt5UjlSRiE2blAlaDJ1UzhyWVlOQUpiSE89SCMpTn5HTikoCitkfTI2eTIlcCk/aD1eKytzSGk+XzNsYzdYMkpoSVNzdyNmdyhCflI8Z1hZdkJYMGo4TkB2eE9zNT09aXFtTzFWITxxdCkzdT5yLVBGcEk9CismZFU4RnNhSCZvMF5PVFRsVGMtYmtURG9NVyltM1M2WiF0M1UxKjRTaCM3WSk2X1MzdG8/PSRQfjZOT2FJd0lleVlrR2BHfSZpUUx3Q1dwCit5Xj42PVdDKHd+QHo1NzwoST5OaFJzU284Jmx2TUhxeWxieFJScSMyZFolNVVAY0AwRChnOWA0IWU9XmNQVUcheFJNeE56TU1vdSVQSlNmCitMam5VOzVsQ3J4fGVONlpEVyQpdG0xYGJjdmU9PGx1MFV5aEk2YUUzUlA0ZE50bk0ycGQrXzZud0piVDV8YyV0fmFWPTV0YzZyUEZFeVgzCismS3RAUnxDYChvX0Q2PFhrdFNib0R0SmZyTj4tMHI4JFRWdVAlOGJKTEpreUdYRUNLMklgYHotVyFTX0F7I2hFbVhSTlNsIS1PdG9zdyU8CisxRHAyKTQ+PFFRaSZqcVIxMWd7O2RzY2J3fW5ObyMzanFZPikqSkpFQl9OTDsyWUZqU0slQ3hrKXB2akBGTzAjXj4wfTRaalBOK1c4WkdGCitGfUIoeTc8RlJLfXBRJFF3bng3TD9acSZxS3xqK0h3SFpSdHQxd3FVP2wlRz1aMnUlN1kwa29oMiZ+b0hUTD5ZYz0+PTFINT1RbGt9RFloCisxNWlyPzFRWS1PMDA7b3tsQD4+KG9OO3JWMU9OY1UzOytOKTAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93Cis3YSU1JDZGS3VGRFhrbGA1V3ByP0laKD9PfkVedjlKUiRGaTRNaWhTTVJ+I3UxM3RFPUtSKChtN05gI09FNiRzKkBSZ158KHUjYUlCR2xPCitRdk54aT9tLTxVZiNZMSYkZjZyYn4qK2psUGI7LWRKV29BIU9EUHUpKGQtNTw1LXJ1KjNYZ1UoPHROKjZSPEZnK1NNbXJCSWMoamsreSlZCitDc0A5MUVII2BOcWFWNkQpK1c+P21aJWZ6eVRwS3g/SX5obU1qPzAoUSU5OVAxU3UoaDwxPSpURERMKis4cnFxVUFEQ0c3d0hgVyR8aU8rCitHSDxxT2FwRCFeMSFmZzlNVVkhSm15MFE8OSk0Q2dqelQldzxgMyNVVD9yZkEtcVAtSUhzWTtTe2t4dF5UeSUybDlwRF4kWFNCPSVDPlJ8CisyfmtnJlJ+cEU4WnNkfV81aSllLUchMFU+Jj8tWlc3QWdLanRpNHxFPmRoRiswMFgwU3c5LTwhRCQpdEl0YnlsUCZXdGRyciN2I3VXT2R9Cis7UU8qXm1JLXgpKUc4e15+UDczcm41LVIqZjhgdiooRDVLUGk1KjMwM1UjbnhZdnxIeHlgeEVOMk1TWFA3aVZib2FCKHFvc0Z6KDhMbTFQCitvXlIkZ1dvZHclYkhCQk08cmJmQDd5PiZYP2RneDwmWUdYVipHdVFqJk9IWGZAV2ZYYyU4ezRvUDdaJipSbkRhR2lhKjsqRDt1Jio+RXNXCitQXzxiUFdIJUFxc3VST3d4PWd1XmM2RjYmYEA0QUQhe1Q8Nzc8RHt1QkxaNHV7U0RffntCKl5hb21XZWVGcHVTRndhK1JBcSM2REg0WitVCitWR1NqZkpPN0IpOXM5KGVELSZwYWxidHAoY1I7YW5seHcqJERQKXMrWkB0aEc4e2FQK0JJflhjfXVZO3Z4d3YhI1N2VUNISkhUYTJwUVhUCis9fSV+e01TXmlpMy1RS2liSEdAJmtPYW5ObUh3KzkjIytzQGRTUzlCXm9uRmVOQEx7U2psfUY9V14+KHptd2tXTnZzdEN6OFVQOVA4bHdkCit4bkJVMD11SjI7NE9fZ3I2YnNwTWwhblhkcyhXcmxHezkxMWlPLTdLTWQjSyZOe3AzWnVEMyNERHpocE1Hck8wNVpZUDY5QXhDUmNyK3NaCitkTFg9VV5iMVpfWXEydUpKJm5YcHRVMStsTz1YaTRua1AzcmhhVHxSb2whZWQje3ItLUlnaUwpYENtTXpFOE0oJj5AZUMtJnUxTnBid2JhCit9Zy1XXm1pWU1NIUBsJCFxRnMjaXZsKk15Y2tiLVdoZFFTbXpAe3thbWs3e2lVPV4pWmwpKGtGenwwPjx9MUBsaEF3WGcxazA5aXRMTjNFCitjOF9iJT0hSzJnNkhnfW80IXcjU25fR0BEfENDMGorbnk/UTYrSmM5TzZWNWNqMjAxUl4/MnlRfX0oQXtgX0RFPTNHWDI1M0w7NjZzKERICit4TV5eNSU5aTU0K3wrdHk9S0VRYFJGMTV7LWpSZHJ7YmJqO1pIenUpYUEmZ3hPKyVnfl5FQGJ7RnRzKTdAUVl3LSsyVXZBKkspS34zWE9CCittU05jTW17YVdBeHZybXEyamJ+VVRzSjtAS1Q5JSk4X05WJWkyWEZZPihzQDhlVSVNWFhASDJjNnlkRnQ4eypjcC12cHZxIWJ2fHgoNis3Cis8I01+Mkx9ZH1RQj5eI0dwRVBTJld6NypefHNgMm8he2hNM1l2cy1LeUc8MjhEMnlkWTlHaWRkeCYzPGBJMnc/aFhXdEpAMGxzY34henNRCit5JXRefEloMnMmT2VYRVJDMXk9alE3NCsyd1pidTdITHVBPXc+MyNGdFg7eGNPR0J4NDNmQikhWGJONyFBOFQtUnRzNE1iNVJHdmVMPFhGCit+dmA9REVra2l1Jn41fnJQVjV1QSo7WT1AJXVwJXFsZEBneEhURDEjfUM2Y1ViP3JIJTZ9UjBvcnooVzc/bXNpPG4tPi1JWFMkQz1JODFeCitzaSpXZVApaD5ANmFXQUsybXRleTdEdnZFazJfZmQwMDZIQzAwMX11MDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDCitRVmB5UD1XTXk8T1pETTB7WEw0X0thQnk7T1ZyNm5KYUN3emdWUTw8PDVkRkB0Nz5PQExxOCFreClMd0tTajA9Pk9mTXB2KyhkbVIxZGt4Cit6eFVUYiVxJG9LMi10JGAyJm1GX0c+aWY3KXVvcTJEKHdBOzVJOGpZdjMxPGh5dmNvQl9oRysrOFo9b2k+X3Q0O0JhKF44QUEkZUFReHJKCitSSkoybGJEVGxGPSNgRkkqZEJreyMyQVRTfmQqaUIqfnNLenBxZCF6PnE4MFFReD9hSCRIZU5vOGJqUHlAZjwpK0RVcDI8YFZ9RSlyJmkkCitfLXcxcD4rS01WaFdUIyMxcVkjPHRjNWRuKF9LNXJYNSNOO2kjUlpqKDxuUGV0IVVwb0E0ZmFRY34hIWhDKigqZSZPazE1P3wkM2klcDY3CitJX0I7Vk0ySEBrZXheWGt0cm1Pd0s8TG50UlROWnFyfTcjUj9KRTIrc2EjJlkmMDh4fTB8S3A3UnckOSVGNHs+PnN6R05kSGsjP21OdUZ1CitXJCo5Yn1Wd2ApYlI3blpUTiVLXmdMc084PzYzZiV5bHQlcXRyNlF8YnNMV0d7O0FYWDRANkFkMT4wKDg1WlpJRUJkQ29PQDNkKVRYMzV3Cis/Oztrbl8mMz43WUJjNHZKanU5NHsyMnUmMnxZZnRXcDMqX0N8WllMMC1WUSs5Yz9hMGBMME11ZEReXllBV1Q7VXk+dTFMWnxlWDZgSSFGCitrZUBMfClWRzsyOGJeQXFJV0xQU1M9YFg/UngzRSpPQk4kNjVTc3hyKWhLSmtnXlVoVGJCNngoNjJpQVBkKElPayFWMTBiKSQwUyNCI2Q0Cit1WGVxPXpsfG5IPTUwN0Bzc08qR0smfUVENUErU0IjIzB3akEjQzg/dThWciFlQU1WZHZLaWRsZitLVVRPeitub1BseiRwZGBLPUNac3V4Cit7c2VtczhrOHlSKmI5ZnYzQ0V8RjYyc2FRKSZLSFBzKGYzfGk7fWFUX2FyalA2O3wkNTMreFZkX1Izd2JvYyVyUVd8dXc8MEFsJkdnYXJ9CitHQ241diZMQEs0YkcqWlNvPSExdmF7JXxucGU7OW8xNH5TTH5CRU5jUXkhaVNiWj1gbXNtMSVyUXoyayttKXY3RUN0dX5NVjdQX3lgTTwoCitLUz5NfXV7SWhLPypgYG09Qzs+cVUqI1FZU2QzNW1ZWHE2VVBRJDxLPXUkMURHUCY7Vl5XITtnYnU2RXoqVipkXkRxelQpfjNIYjY9NzxACitZWmFCTClhSEtwVjBCKVduUHN4amY5aVVMNiljOXptXkVCQUxQNktKdWU/K0k2bncjTGI2VzNrI2RrZE0kOCZ1R2J5SVdwPDNhPWVuclpnCit1V3ImVFdgSFRmREhYZmY0IXlMYjlTaDYqS0s2WiMkMENKKj5SYkFAND0wLWxrJTZUY1kwckAmTkFRTkpCaXlsJi0tX0NhKlpEdGl9YiV4CitPOUtRSDAwMDA4MFB+ZD1OQWN4bm5vSkE7MEVTRWUwNTFSbDBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfCis+V3Bwb1hWcTxmMlo3eShtP09mNHYrREkwQz1QU0MzaGFePnFsPm1YNVIzMjsoJk4jdTIzdml8S0ckbGwxWWUkeTZsQ1o7Vz9aNUFCd0ZJCit9TitkPyooJkYmPD9xPldDVz01fFh1aHVoc3V5Rz1qWD5FISp6NmBOazFPfElxPmJ+Xm9aX0t8N293cChxc3hafl9vP0JEdks4P2R1eiNoCitJVjVgezx2MzVWK2thekdXVTk+JFp4ajdvbmZ9UTFlJiokYjt5QyQxR2EybHhQRiRVLTJ+WSt5QFNhPyhhOURANDJaVGckY1prQUVHI1cwCit9WnE1RDMtXiluN2Ipb3ZFPz52dkhEU05FWlRiNSFiamJ1P0RnM2pXe3QtVkcobEdIdlhkWlNHZl84VEdvSkFIayp7UD0mWjAxbHtwQlcmCis7QDhRV1UqSEkxbXV+ekF5WV8/SSp1UTU2Zzl1WldNKGxjPC1iRz5GZTtBcztVJmR+ezZ7RUN7SWNHXzxQTTt2S3dgPzEybkNGSHA8fHt2Cit1JkJIKlglbmV0NmkoPXM0TT1PODU2XkF6QTNjNGVyUEktS3Y2bDNgUT5WezJ1MCtGKSFKbWZMLT02YlVYZD1KUHwte1dEem5WWVomYVYpCit2cGtKUHljV1MkNFkmTGUwKDh7TX56YCskcWplJmxmaU1fOHxHNmB6KjMqa011M1VjMEc/QUl8MjNBaWphMXc9OTZPNWZ7dVpJUnlLanU5Cit6UVkmRUNQLSF5bktmYm8yPT5CZXZ2aGxrb0s+PXMqaWxtd21vaXtQeVcpIUFgRWV1K0p5Nip+ISk3JVVoQG1CTW01PUtpUUloe31BfWxGCishVTtSISptT1FMaiN3UysxWVF2STYxd1RVTSMrZD0rNz99U0NqZGlvcXc5SzZMeCh2VFU/eW9PaXlPKWBldF9oWCtHJlBIc2B6O1Zsa04xCitBbiU1RjROY3hoRnA/e3R4XyokenU3ODJrbj9RaVVpcnUtNzk4Ujt4ZVltMlMzJUFJX19GM21KaHtEXmZ6ZCtkIT12KEhtU3MwfXFfN3dZCitZP1pETW5JbEl1eHtgX3t9cVc4S1RXP045bjRnVXo+NndIQnM/eXNUZ15Ce2BpNG0qdktSOCtrQDBqfUF6RVlxPDFycDRJSjlGRks3WTt5CitIJExsSjRXVEkpRXZYSSYzJjt1S0MpQkY+eitlZlRfZVZ+QkBPOyNoPmpGVmZfYXc7K3p3aX0hWWBDSTA+MDNsakVAeT43dVIkZ0dhfldECitHKCE7Y2hmWDAmY3JPNUlyJlREOyRJU0FtRnoheHtxJEs7VDUoQyZ5NEt8X0ZDSnpDMGUmZTJzYyQrQEdVKlJDLX1YUTl2QSRjcDVHVnp6CitNa0l+e0ohTShJX2d2NDFIbTdSXnRqKjtebjY/Slo5VSU+ZHxTXlMzalI+Zjl9NTBaJm1SZj9ofm1yc2p8NmB0YEdiITc2dTJZISZQYjA3Cit6TjY9bDElSXNQanxHMlJAY1lWQjtJODFpbEhhRnIhRlNoTWRAMS0jSiUxX3FPRmlFY2R7NTghMW1EeTFTQXhJTl5IK2t1KCh9M0NiM0xDCis2S0cqWnRnMUBIdFcoRXVUZGZqQEhpJCMqfHY/M1JrVHdAQlVrP2o7MVJrVGdoRmhAIWdkNkI3OGVOaTt3N2BkajlRNS1KWExXTV9KeEJPCitmQz85UHArSlkyWlRmUSRadGJYbk84P2ghTXVHcnpvcUZJRUEtfDlhJkdaanhsUlU7Vi1nNSQkQzBwb2dxPj90MVZvMmtQMD8zWlR8MFNLCiszS1pxOFN2T3M4PFRPTihrTTFRU3BfaWBSZDw3PyQ1NXJnSz97czZgQTFjNmB2R3d2cXI+OClpIUhYVFFCMyFBVn1SVjJxb1IxZ2hVR1VVCitXamI7V1VeMntLYEx8YzJ7dUpRMlg7fnsyXkYwQjFnWDd9VjBNUGVsTVR4VWM0OHxENmBVZVNidTk9Wjw7bkpjSUB4bkNyOzskejZZPkspCit7ajN0ayFlNHFJQlcxJnBmfmhlaSVBdXF9SzckfTd1QFMqVThrbVdreWhDIThZcn4hTEU7fjgkIzxGRDVsU04rXjE2a096N3xMUUszcjd9CitYQGdXWn1mQXBoRyFtXnY1eSg4MzFIcnZxKT5wJktFUUFLYGFOQXgrWE1UelBRMyg7b3dtdSQwdkcjQFRSb0FNaGQ1dk1CQldNcV9fM25ACis2PFQ7b0NyI1dCODhaTyg0b1QlKm5vY1VMS0dURWVsQWQmIyVHZn09SURvaWtNMnEtPGxCTm1ObWN0aGs0JHJjXjdkXm47KWpXfHF+SlpaCiteMyZHZF42bVQyT3d0UmBNNTBgMUFhd2YpfSFsR1pjIUNHbjlnPDszenwoXyY3ciRhZz9EQElMPVQ9OUF6a2E8SjBxVGhDPDt1TG1fZExwCistPyFeUClIblFDPWB3fTZjUkBuM1Q0WVVMJjJEcGUqP3hEM2RQNDYzVz1pKCNVfF9zWERGMGk7Uzdic2FmVStUQ198eGVvU340b1EpOUBiCis0MjhyfGhHS1RxWEV7UzVhZz9EQElMPVUxKUdsUXhRViZweUF8SExsSm9gSGp0KzUpRXF0eUZwam9ZQ2xyUjw7VEMpZFJ4KC1iTz44ZGwhCitWVF5vKiglTSgrUCMrS1Jjbk1RQjQ4eylGX15hYHUjWFNRUCZefFdyWTZZaGc8R2R5SEEjV19FMEhrSHQ4JXRrdVEtZmNlNHZNem1gOVl+CislXmNKbylDNVRrSHhIemJiaWhRaEpra1R8aiUzZGVSczs+ZDAmOU5QX3ZCZkZ2RzNmbTJkQmZGdCtZJlJzMT84YTx0SH1yKHFwS211cntgCitVPi1NeFh1WmBQZ25LOU5VZUdpWSYwfkg9cWRHRFkwNnkpbFB7V3A4Y1pxbiZvYSZNNVJ2LWlXK3N8RU9xWG5JMWRfI2IyZFBZIzkwbWNmCitIOzRnP1p0V1ZJcVRCbXZ5dXU+PU40PFRhJUtyX3J1Yk4hMyNOaTJaS244R25ASnBMR2xnU3FDaDtHM3Y3JmRCSFZeKzRaU0dmNjZ8QndiCitiZjh0eVgzQmY4SGpfQmdXXnReYXtyN19gUiNkYloxY0FfSU59YEVrYUNvXyphYkFGekQ7bHFIczkqMz1CRzY+PWh8VlJ7Sml4OWAxRXsxCitSJmpXQjImenZTPj9WZS13X0dnSWpESEZ8SWlKWVJTVDR6e05gd3Rxe3NEV1crUzR8X3NRbHFhaXRnaTsmY3QtanBFJGpWaHVXJDhRRW08Cit+UWUqZUc3QyNaV0Nkc2FWRkJ6LT5kVnxmLWVlV2hGVGskaUdaMnppISUyfXNZIW88LXI8dnEmNnk3S0xOYUI1fndkNnBsVE0jRjF4RklRCitBP09OMWpGRCp0MTkrY0B+OVomcjtFZlhYVDE7WHBObS04aiR6Yl9ja3BoVU9hbXg5c2BZQ0cmM3o/aiFTMUA+U2g2Q1N9JDg4TFo7UGJpCislOUlKYjNKYnBnSz4xUzlieTN3Wl9fKW0xMTw5I0hxNz1STE4mU2xrTStiUnhxO1lnZEFpQkE8QHQlJlhVMFBBQGd4eWpgTy0qaTw/fnx5CistVmVweztGNzBMSmx9P3dLMUQzP0xyPzVJbGlXP2hTSl5KUGI8Rj48O2kwIT5acy1RdjFoNk8hd2pIdE9rdjtLaiF7KHpLXyR4b1cxdllvCitSeUtGeHhpezA9eCttSUokSX50I081T21vKiVHKiFlYistRjA7YVJrKT1yWWlJT3d7a0AqUXN7WCNPfkdHVURJMGMta1ZfNktielFoKn0hCisrVjVaIz5XO25qWVN0aXJ9K2IhcD1CSkFhLTJ7XjRUWVlSJSFfem0kdHBffEkpfUl2MjBiM2h1eEUyKXRpJGFxMyRWYzV3PkZFPjdhZSNvCitPanJGbTFTdntYcCl9Xmgxe1g5b35hYkxfIUhWKihUczV5NjVie3oyeW04TUxkeUlGQTdzdilaYyhvRVZuN3x2ZDxpSjNpS3ZaMGw2PWkzCis7aCVWYm44Rnp1JlcpbEE4Rn5VZEFfQCE0fHJMPW82UkA4IVFVTm41JkJhJT1lPWF6dE1UK0AqPjg4ZF5GK1VEY2p3NiZPO0p0akZALT1NCisrTXJpbVlmYC0+QUxEfT9edldeb0h8WHRMTTRIT1kqfVB8KlBGZ01UJExUfmQ2PjdRKG5+SXFrZnwqVDdRbD4panY4bCtUZUhCTmhMaC1TCit3bT51OzNFdD85KCRFSEghJFckbUNuK2t+fFE9eEVkRGtQM2Znfkc5XmtUXjBHM2RnMkc7e1FgaU87c0dySkJjSENyKkpJcUIjentyIW0rCislUUlGZmU/JE1SMCUtKVUjVks8c1EjUV5RO2xLO2NXOTgqSGlTcW9UbSsoUWUxWGV7KnZ+YzQkWiFgcHBlPnRiJENuVSlrSkgqTT9AU1A9CitjdDhzWTZGa3d4NEgrMmppJCshdDB3eGYzIWNfK0hEcjV7OXsqOT53SjQzQXJoT3pKMXQ4N3g0UTwoIyM5ZmlfSkFUNEs2dFlASD5+MDUxCitsaXk7eDU0Ujg4fmthNUtXKkAqNGVvNGtJO24yKVEpUENmeSEoREdYcU82bGRhfj8tOFchPFI/fUYrR0k3Kj51VSswM0E9JjVQZ3lye1RmCitxclRMKzs4Z0V8SjtlcDVeKTVMNXJZPDtyaDZfJWc+NE1ZMzE+djBvZU9zSjYmM35kPmBobCtkIX5IfjshaGZWNGlOKS1jR1BqOFFrPWo4CisyRXF8ZypaSUNiVGRhMjtaQTFOSUJCWi0mJUBxNFp5N1FkeCkmfk5Jbktra3c3OSFMSVkhTDROeHVkK3tDeV5ocntVVzFOaGlAUjk+cyRCCit+NCg5YTZpeEV7K3RNMjNYRFFhcnt2WllqcDFudlJYI3dAPnxLX3FoZSQxTX1pMF9SRVBjezFGPm9QSkQzX0pEYVI/UT8pMntNN3Jjclc2CiteaHZlJDUkYTYyLXRZMjFpQ1FhRXlVPUVKayF1WVFpPVJgXllHNCRGTDd5b3daUjZPPUVhdTZocEB0WVI2KHM3b3tkZnJaR0EpaWppWkM4CitzRGpPNnBtPilNQEhjfGhOQndgRE5OTygpV3B+eyN6I2dtYzh1fH0jLWJYOVlafnM2UU1pdWJIWGFNUWlLU15Ra0JubUo3KXg/Mjh2bSVaCis/VXt5bVIxfmMzSWZsMTBIK3BIdkxAKVdQQj5CcXomajJqQEZ9YHJBVmN2KjdhbWNAV0E2aHVGNHlfI0pLNzRUSHNONXl9JTJBZGJLJSgjCis7UCloPkA2YVdBSzJtdGV5N0R4SVQ2fVdsXjAwNmxYMDAxfXUwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5CitQPVdNeTxPYjdFcz9WUkNiMmJafk5TVnI2bkphQ3lCfntjcWJpNjgmOSYjUTtISmQrV00oY0MkZFluKnozQEIqeXZjQj5OVipvKl4oWTlUCitTeUJtODZzVXtgITVDPFMpdDJ3WlFFZjJvUkFvazI3eShvflZuOSg/OUNDY2ZCRj9kdEc8dnlWVThBeThvYXZ3aW5JP09fclFTTjw0e31NCitid3BaUEQwWl97I1FnMXFpSE9qeHpnQVBtclFBSFh3RDR9alpfckV3QmMrS2RhKkQ5VztndHFNPjY0eDxidW96WHhJPEEoSUhEWG1SNzVFCitFSjl8NGo1UXVyQjMxZVRVPlp4NnQlciY7IXtfdzROZkZDT0Y9ZXJtNFVTcUdzJjtGMSo9KTd8YW5pZyY/STxHOCtHX0grPUlXV3h2ck1gCismSGNDOU1relpCVWUhfmpVZlQ9R3U3U1dSdUR8JHpXKDIkV2QtazdDflF3eDgmITVAcEgtSXUkM1EtKlNhS3hyZiU2O202Xz9tfUArU314CisyQkJMN0dteHUlZkNyMSlJdT8waGd+aHtmfndRbyg7RT1WR3ozT1kzLSFkfkk1V3RDaWw4ZF5lbUBwS0dLLWNSYzBfJEIpO0trcUZgMzdhCitALXxDI0VUfVlrSWstXjQxMzg9WWkwejFiajtXTjgkcWVfSDB7enRrN2tud0xMOUl0UnEqZEdHcFVNeGZBUEhMKG0oRlAlZ0ZnWUBEUUVwCitYcj1Mb1dkP3E5USpAN0I+SUIocWVvNl8lQF55YTRnfWNKQUhCKV9YZ1o8eEBQWW5sZHRRNHVkSDR1aGxtZmRiYUUyc1NOaEFQX3RRM3BRCisyN3Y9JDtDa0pBYyhnbWNlc0EoJXFyZEc8aE9ZMF4/Wn40eGpvYVImKlBaczs5Knc4b2M7dmVjNnFvWlkjZ0AhZEI9MEMqMENGWTRCISt+CitFTk4xQChwdThGWk1zciVTWE8xJDU5OCl6WGg3TChLS1VCaj0jIXFSIWFNPV8zaztIO3hZM2xUJTFiUFNVUyprOGpfVnVrfUQjQXZjdTM5CitpK0BzfGlDQFpvK2Q3SiRCdXEqUWg0Tk51ZD9wYmcqVld2a1ZFKlpSNUhCQVdWR0lyayVYYz1NZyZiS3k5c2wkfEhOKGF1NillajFkb2djCit5OC0rSEtjIWBBTCp+MVZPbmA3bUdlTzw4Kk9yQ3w4TVhxMEhoJXVfVGFjP2xedlhGeiZtNy19fD5xKll4V3pqXjdFfjtiP2t5QTkhdipuCitCMDQ9ZT9SS3FWNilZe3tLWX19ZHowUzM7QmkwbENmKGBlJGZWaSRhT0RpJHlZXzEpJWAzLSQ3PDVNY3B4ZDRWQmsjdWJ1enE+ZmJjV01HCiskTXU1SVpRIzVBdzdYYjhJNUp4KDhAKGZsK1YwZk1zXzhnUjcle0VNN3g3Y1hJfiY3fmMmUSNlTERabUZYd1VAKGZxKm15S34/aTtRTVYkCispcWRMME4mTWx1YC0/R1RnYys2SGpiRzt0UW5DSmZYY1pBekdMYVhoSj57QkNINEo8Z0tPJUteXkxLZUtLWW4lNmxRX0x8RT0tZk8ySkkjCis9YWdiQjQzaH00PFRvTHw7U0BjPUltOClzfVlJNT1qTWlXNFNedC1weSNTUGpaTSQmUmN8NXNaWXclMmczfnhYVH5WZG9xc0E2eTc0SFQ2CisxPlhXKHo0NT1Ma0Q2SWYmSHVJaDFMaHkrQmJ7bFA8Qik2d2VHK2VlOH0+UWA9UW4jY2lLfD9QQjhMc0EySEFJaXNKLUp5bXA/Tlcmc3s+CithP3teWlEzbDNIWlMlTz5QKXtFNEMwTlYrNHE4R1IqYSFxKDN2TSpNMSh8ci0ydnt7ZCpVWEAyUl5XcjdsfWx9bCZaN2V3TGl0cFRFJTZuCitNaFNYUEsxYVg1aExaTzE9U3VFdkYpT291JW5QKHtLMXI7ekU8XzckRX0ocWpKYUk5dmNwZGstMGQ8d3hAITF2eHRmWEVHNXkyd0otKlctCithe0RMVFQpWWJJN29pcHA+RXFGfjRqfCZAbDlDclZGbndCMzN1UT8+ZiZQWnRNWTRNSS1XIWA+ZWlZNzhgJT5oZCl2KEgtQHU3PFZRa3cwCitSfUFiekshUjMwQzZ2SjJscnRJeHZpXzVMaTx1S1ArcklhcTFYe3MoUmAlNTshVWYqJXk1cGtTdl9RK3A2eUVycztjVk1zTjRuPXg8fVdSCispeE5hbTVtUURWZyYpPE83QyMqKkRabyV1WnNZUSh9akh0SjdBUWNZPFhmXjB3VG5jMHNSQ0NNOGQyUXExKSlPUkI3eHBIcytMeHAqaEVICit6VH5IUDZ3a3oqVnA/U09AclUwLSV0PzYtLV9LXllNeEpZPUFLZStsVz9hT3NtUkhBQT0yYXpDaSZuYlNidzVkRTsqOyQmXnFxJjI8SDU4Cit7ZEIleGFqUj0rMTghNiF5X1olaVojMz1XTGJQdm0tTTskTVljWj53MXVGZTJGQ3hZamA5RT1tLWg5N1ReJVd0bmdPRk84czVGaGRJY3pFCitFc0UrQXt4QFNzV0pqd3xFb25FO2p7JXIoNTs8TlYhKlErTzd7aCNAZHUjQiUzV2tQJmVuSSYjMyVjYUM4JXAzaUdYMSlJWFBfTlBYIV5JCittKUd2TkVGSkAqbmt6TGV+VHMmRk15Kl5SJGRRaTA9UFpXaTlXUntXfjFNaWJoMUxXMiVKMnhje1VVcVVSV3tKeC1wdEh+eDJBJmJVUjN0CitOOEFlKmFad3dOZTtyQUh3ZG5fYGRZWUUkV3FgUFl9cFB2KXJRQEFzOz56MzBCVVpQKWg+QDZhV0FLMm10ZXk3RHVHcTwtYTVaMDA3JHowCiswMX11MDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9iN0V0MlhMNF9LYUJ5O09WcjZuSmFDeE94CitaRXhaQDVkT311N156PUNWc25IUXoxM0NzMGEmMURmZyVFYHM/YGRhIzM1RlZqY2xqZyteQGZKNT12NlM2PyZHQyRqbSY/eWdSd01zWG92CitmaksodlZqUWZMYEgtTyZjcTVsS1UqeHVBYFU+USsoUDtBUXQ7bjBAPjEqVHl0fDYhYUhTUEF3Kmx9MyNwNXY4ZXRmRXd4PnNsWjI1cio+CitjJTN1WUxhZVd4IyElUk47ZkxvZ044WGd7TXlgKCNnMXdBO21rYE5TfE9HKE1gbVJPdGZ9ISg2SU4/a2g/UjRQY1hgakhqLU12UndORlR9CisxfSF7UlhzS0VmKjsmJV5tMSs0aHc2bVZMPiVqRkVxJDk9fVRjMCtyKmUoVHtyJGgzQlopN1hQN2ctUmNyQGUwMyRTREIrTF5OTnMoSDNRCitHITNoclBhJX5lQTVjJDE7VWJZd295YlN3entGQjZ0b1BAREBKfD9pSHlNfjB1JjlIJmlyR2czPWszZ0FyPDB4R0dKazFNWD9BbFV6P1ZwCitZTnJvSDk/ZSFUcCZDPHg1ZnhPU2ArMjxLJXQhRXFgQloyTU04bj83YmFYN2AmPDVoPWZ4dThBZU9tcklwYllpYXd7MVU0cHpYS15aI2lRCitWYkE+dUZIaHlnUC1VMXNLYk9JZFByNEM0XnZJTklXMTdJU2hqaiVjUjJNSUNKUn4kZHNQPjN9Ulc4T3B0dzF2bTxeOFI3OWd6b0dLOT1uCitUMGNlWkBHTHRBVkdZTyVvPzZXaUBNTHRATkk1biZQeDkwe2dfTWdKWlYtUUlYSVVPdzZBaHZWZ0o7Q1YyN1NVP3glLU5rYTtVcm85VG42CitEUHwyWEVrRGIxNk5QKmNQKkAkWnNWTWsjWi1vbERIJjxhaDt8OWd6ZVFCQVAqb1NGQklHQ1F7MVdtMnV7ZDh4dkdhO2lmeClOTFhISyEwCit+VWdpclV8YyM7cTJnZW9eJSZrantSLW9SYF5hNkl4WlIhQHl4TFc5PlJ3I01DdWB6UVo9Q2B3WHZxdEVARTQ0KktLYHF6cVZYfW00fWpaCisyTGBrNjdoWE8kd09YaWZYYEs5Uyoodz9EX2V5VEMxbFU1bVhub1hwKVFxZlZvQCNRNC1zR1VOeX5vNnMoX1VnfGp4MiNWNW5DVGAzNjUzCis4b3VkMnp0M05XfndtV1Y9UzVCPzYyfHB6SnJuM0p2X34xO2l1JWgjaFVgcVY1PFVeWUFYN315KEhpejRYUEE3ZTY2akluP1UhUDB5cl9UCitRelMkUGk0NjhkQCs3NFZ5d1o7NF89b057en0yVklIQkVzRzBXUTdxMUp3ZUp0UTU/OEElRV55KVF2bDdqNj9BXjlvT0JBMkRyNWk8R09VCis0O3s9UlZhRz9LOWkqb01jd3thTVdyKEN0OEVvPndBU3N0RGc9Wno3bE1jMHZmYDQmRzV5dFVlYDZ7VkpeNGw2eSVnbS16QEV1dikqTSE4Cit2Y2YjclJne2AlOVckcVhrRys4Jmh2JFVpbE0jYGBGYD4qZ2NaakIzZENWWXUxS258RUVtRX5IdE1QeG1LVyRNbStxJnFSViNSdit0I1BCCis/XmQ+ZWB0fGxORGw4dzRlUV83LSRNeFdIaShpS1B6SEkjOEYmRFQwPEdaJXszPDxhMkhwTCoxTEFAez98RFR2KHNiYyFjJGZfZU1OKiNQCiszdUczMyNvbjNkalVReHduTUhjNjdDNVFldFIwUT4oUUhofDZeYG9SdG8mSVhuJTVEe1lqMmokKmUqc1dTMHxYUVIwMDBPOF5PWTd5bXRwCitXJHtSOTkydjw/Nk9HWE1ZcGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNHlpWD4pTExaKD9PfkVeCit2OUpSJjgoRU5EJShjdU5XeUdZRTxmalJ3ckU+PHM/RSMhV3xIVmlLP2c8cH5XNzxVaEd9OHlINFclYGtTPjRJSlFhQy1oUDY0ZDFtSUIqCis7JHtRRyNAeDBVWDcrTzl1MDw1WndUayhvNUEwMyNQKzBoMCplajhqcEEhQVNPZnpaQWFEKF97TFo2QHhsKm1jQ3o7I1luVGBaRW9HZFQhCis1aEotcDF1X0tGZkk7P0NHfT5vZEJ2QmtFZzhSJkhESyEwNlRkQUA/MVBuOCZhPUVYTjg0T15SV3tDQXJPailkTE59KUNlb0l4OVVwRmpVCitXNVJLKzheckh5byk+Z3dESEw2RHBAPTY5JDd7eW5Lazs+OFNGQytuJkYhY2E0OTwzRlI7UjheSDI4QEpSWUJvfDdeJUZHX1VuITxpJVRsCitOaUxDZXJRUURVYyUkXj84U0t3LWRqNG9eZkZVP1RXVUQpTnRJentBdnY1KW57Mkhmd19fKTtrV2JybmZMZ09fezxLM1JHMGhFTGxhfEMrCis5S3VRRF85RlZRWGMyYjcxUHlDZ0slfHpAO1Nrak5NWn1QST8+cjV0U3doZH58IWVYYSE7aXF5bVEtbj9INFBZYVFFXmJQNXI1TCt3MT5NCitoWHM8MkVhdUl5Q0xyQjJMViF7UGMlbGJMUCNgKk56QD8odlcyZ3MjcjRoWTB7WVdDX31aVihgX3NrVURjS1UhcV4xN2xOSWMjfm9QZW4rCisjZV8qSWFSUWhPPVl3blY9JTBfcXFzNSlneyZLWEs0bX1TcFp8MmE0UyUxRDU0UXxLJUltflk3dm0wO2QwKGdpIWlZPUs8Qj0wRT4ye00rCislV1BwYjhOYXY7QlFGfUVkN3pNQ2xrNFNDeWs8JnkwcWJzc2FmMnhPKDZ6aTtCYXlieHMzT29jTU8kVk03cmBlKER0OTYlOTQqbClXKEVECit4JmUoI1lINkF1eCF6JDVvZDl1bzlyQiZGKVd4enhzKlBXdDVBe24rYnVLbERDemRqUGl7TnNiKkRQQX1mTEx7M15RPlhmfU1JQFBVRSRyCisjKnQ8IV9rTVh0cWtPaD5GNXNsMD00fHJ2P1k0XzBZXlJaUSg8VWhLc2N9Rzw3bGFIKGNQKFpJRWRedEN7NFFvZVJQMk42P09VO28kdT5ACistOW05Sn1zdEheSWRsVFpoY3slJWZAeWc7SXBhTlE1OU9wV2prKiZxNGdGT2BrbHQ3P1BYe31iKnQ2I0JjXnBgbi19TGEqR3gtP2JgREtnCisyK0pqPil3TnRZOGwkan4rdGNqbXpCSiFrK2tmc2RFfnVLb1NwI2NNc2Yzem1qaiErMngzaTtFSXRgJUA5M0ZmdCV2UmtMP1BXdjRKc1l7Cis7WkImJE9lfj9UKSZLa3xLbjktJFJGOyt0PUc+SDwmO0EtOV88UGI1KSZeb30qbFFKZTcoYEd3XjIhKWVyXzZvYWt4THUlaGlgVkZNSkRGCisrOCg7b2xPUFhlaiorWkJ9RkdQXnQoX0JWZHRlJkoyNDxwc2RtVlFPNipEa2FzK1huVVdYKEs1aFF2YVRDdHFeSGB8aFRiJmdXfihiSnpsCitvJEs9aH1HPkAxV1FsOCt0Pn5DSXxHTXRZYHA4XiZWJiU5c1lLKGY1Zn1HYWx6az8mSnIwQFgobXsrVSh2X08hd1ZAIXVXfnZ2ZFYrUGpqCis+cGFSYHBFcU0kUnR5eTlAKH1jQUhlR0RXUXxJY0xYa0pqNHJyWSppcGchSD92V1lETEJ+dVJkclFDZD9rUTM+aXJ4Rnk5STk3cWV8XmVlCitBTCl5JSRwNmNJPVdVJkBtKTwtd3VrNjNaV0lEJjtGd3pZenw1MzV8ZVdnazVtOCFKPUttQnh9KzFaMkt6bW4+a0RsYW5vMEtGYHEtWS15Cit9b3FaUDdITjlfZWNSd3hKbEI5X0QyVjxKTntYKXJDVClRJno3aWlFb0d8Z1lDT1Yyc0IhS0dRRWtqWitwcT5tfSkqaVlWfFQzdTw2TmZHCitoQGc+UGczU3FrbDQtXj4/LStyQEhtSnM7QWFAa1A3K0U0Uk0hO1ZCaGRkQVNiaFJOZ0pwbX1mSHglaCRaJj9KQVlDY1ArbDglRCM9R2FUCitLNlBKIWEzJkV7KUNzd2NZdjtQKWg+QDZhV0FLMm10ZXk3RHVnfEhhYkBhMDA2aWUwMDI0dzAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiCithTzlvVlBrN3lYSnZDUVZgeVA9V015PE9iIzdeUFdwWjwyWS1EQTBXbiotMmF4UVJyd09EO2A7eTRya3BIREhqKXJ6MThhdFpXU3RGRjJkCitQfH44SzZhbSNldEZ9VFJGfiE7dE40QiRGPyhNVlJJM1lrMUwlWiNyKWs8S2B7NTxiNz1IeGBicHdxa1Q0YEk7bl9KKSVsYk90eHdVKlExCitsTiN6OGxPOUQ1WEtHTSgpcHYheSRSS1BYK29kJHNtdzt9eVR4V0Ulez4yZzZOXyhUIzxHN2NWK253MVFwQTV1dz8/MUZxRjBnREkrd2c5CitQdE0qMU88IWdDe25UZFAkWlFxUHI/ZyN5M3dpMUZrTDA+ZzskYmw+QnxtQmZlbkl6Y1I3PCNMNDt0P3thKjFmeUducmUpYShwKFF0PTlSCit4NXx2O3hMTjVkTXckc1V9PyhOPjFsNz5TdWBCOFNWZ0Z5WmtHUlh6PEFDM0wxYkNOe3xkallxP30kTE5Rc2NAIXQpWUklaXZiNkFOdCZnCitlREU+b1YkRmp0aD9aWmZNNSZ4Z3B6LVBISCpQPkwqVEB4QkUyNmlDQlk1LXBCWUV+NzR6dzB0K3dMT019M3VBbEpKJHRqQz90fmcjaSgkCiszUzUkcWFKK3NMJmphY3FeTUhDSjZhLXVXaz1oZj5vaGNuOSRZZGkzSTFKJHZeTTMrREBtJEBsKz5ibFpIMHx1UjRQcVUyMTtkcH1lc3ApCitGNzs3bD44VWwwfCZwMXUzMzNpKExLKkkhZmlPI19mMiNBVjRWZmV3RUtyRn4yNChmPTJ3RDRQaGRVYk88aDQlMFp7TUhfaStyI09YUGVfCitaZHoqQlReaWJQallLb0o8VjslK0Z7Q14hT0tfcn4yVDxZOyZMZ1p9aTNsSFRjMGhyUClKb1NRTVVWYm1UXmBgejA/ZGtteDdAI3RwS0d0CitzJChXRn1VfClFUmtlO3Nydms3K01tTyNIRTJxUnNWd1M2KTBmZiFfeGdtKDlJc2Z0biRJZDIjTUF8PGltaTRrQlBwPnZOUHg+cGJIM0B0CitpdXpoNyZ7b0FDR1I1MiZjQWljM2VUKj1GRSRkbjtueDZORmhPPlFFKWQhWTd+XiY1RmQtR2Bic0tyRHJmcGpkeUpndGB3LWVrc3c0Z1Y8Citjd3pCNXNaPHNtbGczbUlRKSVVNHdvNyFGc0JBWEdkaXpsJmxQNUx8NyteSENCaEtiJXRxczgtKiZDJk1hRHI5fWVmQV84Y0pyNiFoSFcrCitYIzNOXk1sO156ZWJTSVo7ZCZqKHIxNCRlNkg1eVlES0cjekxqcFoqQks8SlNzV2g2bnYkQUJEeEJFcmpxXm59KyUhVT5UKGw+WCRWKFheCitZKkl1UGxabk44NUVtRnhibmV8PnZCbl9pODNsZEdHLTEpUElySG13UjcjaGtRLU4yJUpXNVFOUlgqJWZreTx1OCV4OUdhQyUjUzJeXmNHCitkbzNRez5Nb1NsJSQyN2NpU3F0ZlJBO0F4TjtPclRjMkJ1alh1dFhkTm11SFUjQ3dedz10KjBXcyMpeVppNFN0O1lSIyQ5YnNNM2FxSTlBCit2V1hRWVBKNlNgO1NfUVg7cmUoSVNnNHlpZXh6JmZrYng/Y0BtRTBVbUNUX1I/bD1wcnpEPFdQJDAlMVJUNSR9cUY8fEwkKnB5JFYmcEVVCitrTlg3b0VZdGNjJis4KTxheW83eE4tfEVRJU42WEQkRUNBTkNORXMrOSVBaT5RN24tXmFwVFY0TVk0ZV9xX1BBTyY4eVl6RGJ8YncqNCR9CisrI049RHNXcHR8Z1dzd319SiYqXkVAO0YtYEVDfSV2N3UzUCsjUVRvT0x7fDM5VntzeTU5Iyp6ez9mYHFpSVJxcCQ1eyFLYXRkejw1YWZBCisoRi1WPUVpJSooV1BgXnJmfElafnc2eHBRLWsjaEFkP2tVZ24oaFBDPjM+ZzFSYVVyQmElKV9RPlJeRyRzLWsjVUJVQU0rUWJtLVFVemJmCitEdmEhZkpmbi1jJXd6NjBoJFAqMmJpTmBLfW5ZX0l9dV5NU2B1MnJ5M2JzJkRvJSpsaGJqKT40OWFiemVMbSkpfiRkX2lGSl5LS0UrWXpICitCel5sZ1drVShiVm48NkRsVz9ISTZJLXxeem0mSGNVfmokeW8jbD1yXkBDMWNnc0AkUmpydjVTdS08dEN5bW9PJldFdnhhZEtlVFdoNzJHCitZRmIzZSFEeVlAJkR3SmNsK00tNFk0IWh4Pk97OG47cSpmenh3NF52LV9gWTtNWkhUQEZFQilFZlljYUhQaXUmYz55b0hAKSh9bm13RHE0CitETElNQiNoRy1VSl8qbHYlYWNoNmJrYDNNdnk3cUAzT3R6QXNgWlV7MUZlTkFeKnhSSCRsd2dORFh8QiZeNEpFemZaZztfaGRWUFZCSktWCitlRjBZMGxYVSg8QlRPfFE+Z3FuNCg+WHhqTEdBM3JQaDMrPUZGM2dVOGFYJXQjekxJMz15a1dHSk9YQngmY0xhNyY/dVp7QjNKZU5zVTk3CitGej53KUt8Xm4rPmlkcFlGe3lOZW5qWnZ4Z1ZoSF5WRUxjZHkrYXBOUkhrJjx2dSpFdSpJUVZ8aylWMkF7Kz5YKWJNRUxuY1hIWmhkKGAzCitWbmhjeTV5MF8rMitUYlM/STJhUVBVVCN5X0xfZXFyaDgycXhQM3hUM3ZvNXB7TXMmN09LYSpiIV5Eb15IdXBaUDxaKkZEVCtfSDdnJVN2CitfTWYwZT9JRmtiIV8pQ2ImRkhuRXV+bDNqOT9gMyNMOUtqNUxAeTExdHhTaUNXVllzPHhMPGNLMHh3e0s2a2xifUpfaHkocFBTXjdXTXxXCit2UHYtSFhDWENqPzZjUSYxWllJQzg3fWIhYXFrczAzJlFKR1l3UlRMRGxKYyleMlM7MzZicnBIXyszdWFud3ZZNHphckY2Xk1uSEZhVUdZCis3eCoyP2BwRHdBMS1YPXFFT2dMcktjRGZkU1EzYnxUbkMoSys7RU5iKlI1YlRGQGNhUXRDJklvI3Ved3VnTzkldFAkNmt+bHlreFYoZHlGCitOcWRtISg0dVRPV202KDZASi0wQFRxR15Hcn01JnZJPnNOMUp9SiNDUUNQaElBRkxAWD9SaCVPd2xeUXBVZF5NKD9aI2JNPkZaWWd2SyEwCis9KWVRZE17OTdjPmpFbkh7UjRDNHJFRUtSYH59fE85S1FIMDAwMDgwUH5kPU1fPkNPWWFScHUwOSo8SDA1YnBwMEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2lNWGtsXz5XcHBvZmJZP2hrYSZLWn5heFFScnJCPlQrPDJEZHwqSDtXU0ZMdnZ3YnsxUENuYFF5CitxdUBqQGRMNldoXmxPUmhZbitRYzNCJGQ/dGBWSi1lQ09lQzZ0MCF4OCZkaXhKTG5jPk9tbWxhMm88PnNga05TaERLWS1xTio4ZFlleitPCiszNTVVZGVxaW1qTjRJUF8oTHolKnA/Wl5uNyNPMHxOUlZ5PzQ7anMhRHxrZE9GPVR5OVctT3U8fnBMSEg+ZTlZLTZhUD9xSV8jZ1NvQlhuCitJdX1zZnJnJDQwRVo8YyZzb29uODAjZFdJUWh3RFZ1QXZyQlo3SGplWms0Y1h6ang7dihGSUY2WkRgdE9nRz9zeTlyXlBXbjw5I2dANXxzCistY0AtREZRSHcpR04jeFVuIVFzSElQQ0JNIzZrKyk+MmdjbFFvPHpSaXc3b3JCb3E7bVpeQ3NWZlYwPUltRDN3ZyRkSlRkTlJVNUIkRDV4CitCN1A8bG1UcWsqN1lWZ3ZSVTFeOS1nKT5tVUJEUE1EVE9CI3NIbUhIelRfKz5AfGVYYUcoeDBkVmBGLUthQjY2VV8+fllDTj1qZTJka0BJCit5eVJIMyhOPmM9Ryt8STZBbTlZZzxLX2ZDJktUVUlFaUFAcnsxeTBqWUpFbldsZjx2YlhGajFza2xsU3o0NT5saEB2X2BOKiRUZy1wWiYzCishcSF1TF98SlgtfE5veFpeTHVJRns5IU9KfmkkIVlwWl5EOHM0WXtNQlBybWo+WiUkOV54ZzJ9K15LTkYrZDg7d1c3aSZafXkxPUU0PSEqCitKJDc3dl4wcjgxKXo5dF9TbWxIPXA/ZjdyO2x7UyF+VWBXYilxUGx1fkFyb0pgT31qTygpWDdhRmY3ZmpvaEFeb0JJJTcjVkY4TTA3K3ArCituPF50bXRzfSlPTyU3NV9yT3ZSKHpNYFJHMT92NHpPKDY0bWN4OG93RGhzdGYtZkJjTWRGcHkyejtVc1N4VHZnVHVSa35wNDclZEN0YyNVCitaI3RkIWI/MC10MUYtTlpeM2VsPj5FcGs9TTZNaHNSV2J3RDQkUGpLbT0zZHtmJDF0OXVPcD89WT9ORypEOzIwdUtfQVYkMj0wSiVLKldsCis7MkQyeiRHbDY/X0B4YH1hQ2dxb2trfVlHY3ZtSTteM34mOShnbC1gMklKNDs+cSlxWHt4aXs7PDFHTD5Ral5vNVUoeipiYXI1aChnPXF7CitrRWZDaXNKNyY1dzEhbXkhe3ImWmlPQ3dUVzF3RmxXWkhfUiY4NlJMalJMRX1obWpqOENpR0w1RlE3Z0dqKXNOQExwayZKIWIrVl5SbSZDCisqSEY9Q2VLPiVDNjlhKSR+RlVXbXMzQihCdytNcmApOTF4MVNFWTZmcjVWRXJAI2dGfmdwJSpqXlBqZWhBd3FKfiVgdz5lMj1OV3hgQEw4CitnY1c0TX5DS3dgZnlsNDdZOW03YnowfUJAbTtZYSFjPnxHcDVkNERyfEk9MWl1e0xsTUBDUVpYWCtOR2RTdzI4V3JgX3RVWVImYE9OOzV8CitOfSh2SCV1ekkmQGErTF4mZ248dWtHSkw1MmsxQ1h5QHBMKGo7ZEpgX2xPMiNMKj44TE40T152SSVOcnAqc3tNSmteU2VIN3hXaUY3KDlDCitlZEtvfGQ3a30lIVROaGtneykzcD4+Z1ImOVMxaGlUeVNwPDdQRj94fmVtfDlKUFhWKjFmTnQjLUhybE5WdG1iKWxgPG01e1UqUDE5SkhjCisxJmI9KUBuR2dJUkMtO3dMdVpkVHxEX1lZN0AwfFhRUjAwME84Xk9ZN3ljKCljV2YmJX5tMk03UUZGI3JHbmFBfE5hVXZfMH5XTiZnV2ElCitGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSOVhYPk10QlV0Y2I4ZDQqSk1rSn5tM3tfYkJ2PFp3dWc8JUQkYEZ5TWQjKV4qK1BmCitWSyNGRGZVck5ZJnNFNm1SdzByPml6bXJrYD4hU3laUz5BaXNaeEJocFd9OT0mZSVuQEg1PU97JHg/cWNUT30ybUMraDJGTzchSTckeC0pCitncyNFalVHR1I+I2ZuQEQmUERHfSMmUWwxdXpzeTtpdiNTP1RYVGt1aCQ4RXZfP3RWNGY2UnF4XnlRbFRsJm54WU9wZm9MX1RsWX0pPXxMCitwX0tMbXdrXlFuUmlsVldtMXZWdVZAJlZhKSMoTE5rSztQcWp6azc0bD8/fUpCekNWOVdGQGY9YiZaITRRbkltT3Z7OEN7VFl9fX01cXs3CitaUGU+S3BSc2didzZeMEVgd15UeWI9N0c4fEBBPDxUN2FZVVA0TEpJSEcoLXdCdGQ+TzclN287aGoxWXl5MmxtS1NgUHw/VG5aOFloPFJBCitsJEwkMEBUYHlkWGMoRnNZKytHWGw7Z05BJnplI212PVN3cktoKiUwN3c5SU5sQ2Z8MWsoT3Bje0JiND5kTXxJc3dXWWs2flItRz1Ee3ZkCitqc05aV0RUbmk9SzkhfVVlX3pRMiY+N352MHtXQW9lS2lLMmVeVVZLPGxPOUMtJjxQYWQwdH05QVdoTiZAMShyYUVtbEVjIzR8MCkqNUBDCisyQ2pzMmJJWipMIWJaN0ZjSHlIITA5KXhkNHBwPEltOUxEZ1hackFVMVhtT3BnTD9Vbnt0X3paVEN9dilCQD1hPkwoUmpNdn1QZHlzayFxCitzQUludjhSZGAxQWtSa3RnYH0/UUEjLU0+fWFoKnxodjNDfGVfcCo5WEx4NzNZZ2xBOU9aNkJ3ZWB4OFAhWDdJXmopMnJaRXF5aTZwaWMmCis8Rz1HYV45cUR2bC1YbmdvaEBZMXRJQX4kcEBxPU9ifEk1bFgqK0olcUBUMm9DWnF+Y3NePXthWko1SCFARmhAUlUrMWhtdndLY1ozUDhlCit7fGM2Y0dUdSlXJXtCN2ZGRGNqKmxTI09PM0J5aCVZSWhSM0JaN3t+MUl5JXZEWDZpKypodVI/TU9RbGI5XkxwWTYlP3ZjQkMyUnxUJD00CitzTyVqTGEtPmM9cDV4JnheLUYzYS02VGo3LXBmU2tuYUxjTFIrWmZ2Xk1NNGJ4cXc2a2UyM2FFS0J6SGFPPjdeMyhFJUJJTzEjX0Q5YWR3CitId3VNQHpHSmtLWVFkdS02RVpWMmxEejd6XnV5b2pZMylGJGl4P2FuNFZiMlohO28oUEUzVStMZ3JrcnlYWTU+WlNaYDt5bUhoe0gzIT58CisyX3ohI0FWQFlBMz0rdXp+P3YoSzF6KXM8N3F0X25KZi1jZWx7UkxAPiN5alk/OzAjPDRVSnlINC18cj9pPlgoXilCbDMxfTM4cnQ2Y08tCitjJm9qNTR1SXEwU205KkBRajUzP3hZcT5zcW89WCprb2x2bkQ/bSs2ZW8tTT4rKUpaZDVxUmhwQTJpKz0lN085S1FIMDAwMDgwUH5kPU07CitTc2Foc19LQzBNO2t+MDV0I3IwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2llYSVebUFWbHl2YVZ7ZEcxV24qK3taCisqRnJnYUN4MHRaRXhIKjY4YFJBS3t5RGNQMWkhNWVoNlMtZ1VoQU9IRTVkKSgpMl4mOGYmaF53T01OPVJuJlRTZCR8OTgma1JZNGRoeSE2Cit7U3NMazQoRStDJmtWRCElWio2T0pYZEw+JWZia35zbWkoJHpzUmM2I20hdiZ2VGZ1bFNNS2tWcmFvTXAyPmpOeHUoXz8zJTwkZVhgfEAqCit7LWtxcEBzO1drTzxhYTtSYnk7NXNAamBzZ1d3UzJwJjYlbEdzQEZRYjVUOG9OIXc3alZieHZDYGAhdHV2U2F4PGxgZWtZQG1QPUpNcyRNCitRKnF3QDh2YCQpZUVpJXkyKmQpK3dkeHF4S0w9MT9qN2JUOUtROS1DVUdZOS1VVk5wN3ElaSteWnQlUjs8UC1oOShwVjhWMyZ0fXw3dT8wCitjT3lRPG10fkNLZExTSF85WlhVOSF4dVd7UzsjK35+Y2goeSt5eUkrIV4+dXxqek17UUd3aGU3VGYpekZkbGh4UXhFMjZuNHVHelpzUmlGCitOO1IlTGU8ZStMX2RFMGB1UnNWSy1JS1ViVmNodlpTeCRmJUdJQXhFdVBfKGJIQH51eEV+P1RoTnF7ZXtPeyt3eXd7bjZkITNgdGo5ZT4wCitpa3t7QVBRaWVWa0ojUG5eajIpfTJmWisyVFp5SipDZkM7K3hpfFc2YiR1O0pTdDg5OUYpVmkhZH56b2JfKUNkZ056PEl3UFJ6M3s8Z15QCitgPlFFTmhrWGQ0NTwpVl9jK3o5dSZpLUJMe1VUP009UUVXRlckWEJqfjx0JFhMSHUlPi1LRDs3bmA8eWF1cz93PENkUndGJnlDM2RWNEtlCitqYjMwYVc0SGJOVnI/cUxkdT5DUkpOa2FAZkVgYTB3b3Z6S1NFMSh2Njl2QzB4NS1zNkV7KnFMI3M7bGRsJElEKnpFe0x1UkRlUXgwQUZ3CisjIUNnUUpWITs1ZyRmJmNCYGEpTFZRaTNsKkZqcUU0Mk04b2I/OHw5aSopR351NW8xNVJDZEViTjw1YzckZStJIUNxdTljSyorK2ZFbClmCisoK2lPZ1A7aDZldTJuN0wmenh7Q35eVWpMUztsUVd3d1VnT3NgZHVRNHNKV2NAMmtOPFBhcms4U1FqKStsa1c4Q2hZTFZQXzNqWXRDKnplCisoR0d8JUwyIWsmI0cqJXM7TT4rVm1PXmRLU2xoWDxRUGF1ZjA/I0h2Rnl+WU1CdSRWQ09KbnBaS1VnTiNCNzFFYnZYfHV0SjRNKHc+TWF+CitASWtXfTU2dGs9PiVhY3NQdFdFfnZlTyF3ajwoUkM5OFlkITdUd2xVRGshPHdNWjZqe3d5JkBtQyRfJl9YUnVNansyK2tfKCZHeVckKVF2Cis2KjtfYyQyKTJTWj1ZY01PfmZpNSVnd3RzSD09QkQ0MCZHTU4yNUtBT2lqQVkjYEtGSGp0UyFXdlRKd0FMQUE+SFNTb0tscEhefXhtMDFICitEQWxUaUg4cm5hWW94d2AwTHxMXnBkKmp3PHcrI0E4WH1rMT5gd0NaSWNXUS0xN2EmcTxJe09LbFdUUFhrMD9pLV5oPzdSMXA8RVJkWDJOCispIXIyNW9MRVN5TGl8WlI0ZnNFMi1CN0ZtPGczTWlHcDJJTH44dlVVMCRGUlIwbU8mbmxLZ0RHbjVQQVZGViglITFfdllPbTc/bjlDP2RzCitOUkcxPWNNeFBgbnhsc352NFRJI3cqWm5aUiY/UlM3JDJMKjFBeCVNfEtva0habzlzKEVJPEBOOUd7N34kZlpwWnEtSUJPR2JGZWY1VihgCituNXd1Nms1eDh3bE44I1ZKQi1qK1glNUMwd3FWNyEjPylwRzVDYjl2UmJMaSVsaTJgZkM7fGYkMDImRFlDKSsqMT10WnlvKlltPWFmS213CisoLTt6U2MwPzV1R0RFVV9yJE13IW4zNm4xSTMhRkleQnNXaTRZN2UrVnc5KjNZMHcoZlNhejZxdHRHRUspdz0zX31IeiQtcGQxdzloM2YtCiskeUxDWXVmcHpIeyNadW0lV35WJEwqV09eS2UmQzlKKVNUbGteVk1MPXtXZyN3Z2drN3pAKChDMXZzQjJeckclPGFwRV91fGQjQDRpaCRtCitsLU9McnMrSmNwLV5LUHcoS2FMNXhURyskKk4+KGNAMX1FWWRFUVlHbztTLWJyNzQtKyNJMHZvPlM0VCMjPntKTmp1Qk50MFVCM1RiV1BwCitWRDtqQGhBaXotZVFWa1hDYVFFSUswd1RYdippX1hNYEtmJTI2aCVIYSRXPU1FREUmKXBNSmJUV1VAMUFHZD85VSVkVzRQN3EqbGxGVSFoCitsM3V3QGZKKlFFLS07XmZ3ay1gVDR2cnkyOTNCbEBaM05KJVorU1Vpcys8XmlCM3ltK0Z6ajUzVUxwQjtyeGx0Q091UG0jKUc+c0dSP2MyCitCaGd5RkNiNCZgaH1MWWxfV3VjfHFGVXpUQFRRQWY4ZiVmKDk4KEY0VHJAPiR2dnVqSnAwenFiNFJuRUVvSnooPDhUTCNleElaWDwkUShWCitKKllfdjtUfEo7eThsPlA0N35taT42dWQmbTd9JEs5QFV7TSVNI3E3YHUqeGJ2OGNTRmRhVzI9Y2N9Z1RiUCVgaz02UT5wRy1FWXo5YnVqCitjKmluYlJjNiNKfEZtRV9DVTJrX05AKn1MV1h7Mnp3e31mdklteGBKcShoS21xRElra3tobVpIaDQtQzVUWCVWJXpDQSZxZWtgSHB9bjhZCitNY2w0Xk1wRmZIPk1GdTJIfDlNWCUwZS1qezBUZmxtSFA3aDtfNFomdlpzekNvIVQ7QipwPHIxSWVPWWhTZ09CVFcrbD08OWs3RVZEZEt8CitRVnY0eit3I18mQDVYcjRIdlQxN25vbXdkcSVfZ0E7PE5VfEJwc0FOVjNqO1IlOWlIazQ/Mj9nZCRPdihLY1J1SUh5U3pLVW5zSnI2SkV0Cit0bUU1JX5yJHpENzRGWWpKXnk0UEcxRWJxV3pnP2k5blpmRFpTOXhpTCRrVmxJXmAodm9ZekdvNXxnTihsOEM0YU96ZDtIekxYT2ZlXnUlCitDYmI/am8yNGM2TjdJYUxtWW0+NSlEcGJAJENgdz9zPmIpcGMoZz1TQGN+UUU7eyRwai1HZ2ZnUGhMYHJkWD5tLTd0bklEMEdaPWRrVnVeCis8QjdXdFIwbmMxVWo/Wk16KmRNQE48IzFvcGFkSWVxO3BnUXxZPXlvcjU2c3g4Kl5kQD48LVdqMjZ6ako4RlBfUVV+c09uMj1oY0VEMj18CisxflYzJmtSKkxlMn0xTFhpODc3T29jaSokKVZVR2FSezQyTlJxSzI1dHU7cTc7dEYpNDN0MW0qIUdMK2h1R3w4X3NYZ0B6YmBuSD01a1d+Cis/Pjk/PiYkbWlEKmVQOSFqd3p7fmQoSTcxWGVwUHUjKXtlfm1GS2xzbmo/djl6PzZ9eVFYSD1GdmlpZz9VZDliPlQza3E5eERxVlFrLSk9Citkb042NEhMcTZJOTFuRzF5PmBtMHBkKjw9RDg9fDBXO3NOVVVCcExRYipeSSQ7KFl5a1lIVlJLOXsrei03Tj9qa05yV29SUFFmP0Q+TFlhCistVik9I3g0MSlyVVlYXm0haU0pOSl4Y0JoKFhoJFpKNHYoYnRFdmJnKmxoPlhOV2kpTEFDLUZlKGFfWUBjQytCXk16YDZCTU5PSkRAVTZYCitOPipLXzZXbEZDIzVRUCR+UE12QzQjO30tVGA1a2NFRDkzLVlLZGo7NktnNEBOWj5EZV9kPWpfUU91SWJDTU5zLXBiTWdIbSFnemgweWJHCitNJHl2anEkUlNXVDdeXzJ4ZktGRHIlI2dQMT4pV3MwWmV4VShoOypjX3dXLWFqPm1eQzVEPTx9NiYhIUVoN21XdHk/NHFeNGtkRk1AdTV1Cis7QnJBZXY2czFvPGZpSjh2JWBLOyk2fHJ1JTcya0FGez92JnxwY3pzZilVeXNVQl4qO3ZGIzRveXZqV2deQDVrRFhTSVAybk5uVVNqdUt0CitXNzRZS0tZQEhtWVB5LXpQbTtMQzVYSUlfJjt4cVMjaG4qKnFKPHRzdnxsYjlWcntWIzxjVGNgZUp0NDs3RXM0TlopUC13bmpQbH4tZ3ZQCitINFd3ZUs9bihRT0tKSGF0cE9QdUtOY2JMdUFsP0JqX2M1WUJEZWdPK1FiYylMTVBwaDZoZ0ckM1JwI2FuU2NLeUV3KnswZT5TP0M7YldYCisoayRaTjVnfGdZfHMma2IyQEUpbX5sR3RQNTMqLVIkRl4xNzYwZUl3JktvQzZTezdkUDI5PjcwQig9Xz1zaTMqNVA1O2tETSY/LU9oV0MoCiswUHw+aiNRNHU4cGNWeCgrRmA1NTR8UCtOR3V1MkwpVH5KZmBadGgrdD1uQjYrc1VDO2wmOFVsMTVBRU9wemlkTSVAVXB1S0MwZEhwMkhMCitvOHF2LUBwUUtQWUB8PFI0UGgmRmFpaWRnOD0/MDRDUVJyMGQkOWVkfGZXZiNGTnZEVSMlV2MmKUVEUVpmKWpHMlNuTUFhIXheJCNBUmRjCitYUnc3cD49RUJrYFpXallEWi14VElEJnVLQEdBYCp2I0YwWU9fWXBVWEswLWd2NCYoRyExS0lvYio2Jih+YSlGb1N3eWIlQUNETEU0bWg9CisqdjZVVEwoITJlJEtWKF5SPSRgSWV9SUcwdXRwMTYraWhrPjI3Y1AxOSlHUTJBRnVEXzUmKD5lOW8/ZGl2N0RGVXs7IXljQldRWSRCRENeCitPd3VIP0hvRFlDXjJrUWVXUT5RZCk7KzZUJHllZGswMTdfayVUK1ZxYnR+dnxCZThMP0BObHBWcHd2PytoIzs9aDJUPiZmJn52JFRiS1M/CitHbXNVQU1veDFBMS0mK1kqOGk5Y3RUJEAjblgyMlIlZyUkWGFNMHtYVEdee0FJQDJ+JV8mU3thRkdgVy1Ua2FTJDcodTVAaVo4dTA4dSpHCitmYytQcTRUZ19ic3hyLW5eNGBWTUtjc0wpem1BPEFmK0A3b3x3NF4wdDlUNVYyeTZSXnNgJjM8OUhDVCZkKTNRbXxoMVhaQE5wcEdNdF5FCitnSTJXX0IybllHTClYcUdPNCNBKGpUOHpYTyEmOERVeW9jYU5tZUUjNXphQG9AUFJPRmQ+NyNBQXNne1lZTmJAR1B1Sk9oOCVuRz9gMkU0Citic2A9YTJUSFZeNUhnZThJemd3ezVebnQ9QnIkZTFEJmF1WE1IQSFwbUJuKzVkbzYlYmt0aT9xMSleN2pVd28rS2NsJnttLSQrLW99SSpKCitNcmtJJH1qOVBYOzN2cEZGYV4oaVZ3R0dHUC1BQEFFN2sqRkRKLUxiej15bSMmTmBQQEpBQzNNfDw9T0QqZDh1R1NBTWhNdWZwUFB6TDIqCitkO3trN0E0UC0qLW4ld1V0KmR4JnIlT0s/az9MWF9qTGp5K3VvQHImbm1EP0U/QnsoPlpOcUd2ciRDZyU/O09DSEhoR3pEYXtmUDFPOUtRCitIMDAwMDgwUH5kPU1eZTs4Xz5+SSkwNWM7MTA1YnBwMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpZWElXm1BVmx5Cit2ZVoqRmQ3Vnt+YjZaWjI/biNhZXJGK2NweWFVIU1ZKE9oOzZ6KDJrdXB0KWB3RSpIKEkteTAqXyZuKDU+XkcoPHVZWWw+aDIoNlgtNj98CishPkBrTl8jaSR2eCZZblZKTkYtTm8qMkE2UFZCUzZuRVBRTj5pZ1dgbz9rJWRLbzRkM3dqeFU/S1MwSmA/KXw3d31wVUQjP3hoRmYjKmc8CislV3RmRlBHQStqVnFlbyhJdH5eeHkmQzExMH1XLUxZfFlXdHk9TXQ5MWFObF4hJH1sUmgkKyVEO3RKP282VzlIY3YtU2s8dURvZUNnSVJuCitQbmtaWHRpc207KEAqM35GUHtwKiNVeH08PG53PTxfK1hHMFI3IUdNdWgtamxURXlxUyFQQ2ZhZGlHQVRqM2BicnJlS3Mldlk+ZVpMK3lmCistIWxAKkZycUAoSmI8bkVqZ3MmXlRXUnQ1RXh3JCQydERjM3orO3s+WGJwX0cwb1VVYnxVJSNpNDBSXm9KU09MU2FkdihmK0paKzgxdX5ICisoUipOVy0paytEQGwpcTshbE9JZmlyVSp6ZThUeVBYRCk7eGVIa2lPdDA4fFpoVkM3Kk1JRk80RnRyZ3JTeWZ4PTk5NG00NExDNGI0UUcxCis7KThWMSNCRksjWnRXRT5YKkIjWWpvbE9hajsjej9JflJxX2lZK1c7TVl3QlY/OzRyO0U7clFeeTVSR3N5OElJKyVEbj5ud351dk43V2IlCit1USVxQUBYSWlVU3RmUUtpcTdrVnJ2fEtaKFBhX3YkUGh1K0JTb3VqO0Y8N2lleWJ5eD1MMUREcFpXKTc+K3YwWUx5cHlRN0QqVGt7OTxaCitOdHNaSVY4Nj84RnBMWkNuVUxyczRndHdWJj8rKFUhVkgyMmFRT2x4V3VnKiFzWmR+X3Z0eWRKNUZYJF9HVCRhTFRgYGRVaTJSfDY0YmdkCityNll8YWV4UDZ4fUBjUS1QYzx8PzdhNkxWbFVkKW95PEpsQXp4JHFYX0x2Km5KPmgra3NmYDZtTmk5PVY5ZGFmVGpefE5QPEgpUkN5VV8oCitqVmk2UClPcSFSby0mbWlnbjNmWTRhNnReZHBzOGE8WExuP0V5N0tGLTd6RCZXPnNta1loMGFoZ2ktNyoybFJVNWBpIWl4O3ZYcWwwY1pRCisjaXVRTzNye2o9PkYoQmB3R3UraXRrWDBDRUI+dEgzVVZmfV8rbjRndlE/ek8yIThvTkcoTTd1c2BMI1R6RiVQNyRhcXBwfTx0UUQ8eTJ1CistSll7WmZ7e2JkOCUlMkNqZCNORFA9c1oqQVRnPikmdTtUWGY7bzZZZipycjQmIzxwI2QqPEQrIVlNbmB0KjQlUWtIPFAxTFVPUHFjazckCitoMWYzeXFMU0gyRWQ9SGJlP3lIZyN4YUJ0I1U+TG4hPkVEKG1MKFVrTzxlOWdKcE1XK1g5fmFhdmUqKEBmcjBJbWdaUGEkIzl7bXBYaEROCitMO2x7T3tsckJhUkpDNGRnNSRoN3tTIV4rUW5UNWJeZnI3YWVFRjBzKnZYTUp1M3RBVi1uNnV6Q0x2aGV+WmZgXk4jZGM9V201NkxzZEFmCisyWWxxQWF+b2ZqWk4he2RUMzNwTkI2I2dhcDRTKj1NVjhMKnQ0VHFQSG1yXz1NfVVsMnNFTWooSEk4Vl9ORT5ZQjR2NCQ3ZzN7RC1abF9xCitVKXJfQ1ZLRiFOdyRDa1ModHZyTzZjJVdGLWl+a1BaMmZ2NUZpUWA4fnZ7UXBhfnEqIz51fmdtRlVfJCpsOWBPNmVkd25ZMFhEbVY4big8CitWKjQpU2NTakhuJnN5NUpoezAlYEVmY01sViZMU2FYUCZeSzBvXztpY3dAN0VkSTVYOzhHYXo9b1g0MHokNFpIVElWZC00NEg0V0BDWEpCCis2WUMxeUtiSGBIUy1nekxWQnJ0SC1ya1BsQ2kpQ0tLcU5ZNzkrNUNxZWxRYEAzaUV0SVBBJWlVaUdqTiU2fSFwNihDej4xPmd4SihjQTA9Cit9OFU9VzghMk5ANGZqfU1ZOStBJT8pPTJ6KiNYdzhLQnpGJkZrWmFJQzRFUWpHIUVQYCRwX0BUYEg9RD8xViZgUWJ6Knx+SylAWTMrTm5ZCitrRU5kVmwlVm9ZOTh2NlMlViNvZmxzKiNKPX1RUkF5JDQqTTBWYGB2QmdpZFdJbE04TSUjbXAhOHYwSSpFM21sRVNaNVdeN0tEUCN8KlYjCit0YUQpVHhXYG1ROWkwRiYlXiZRWWRRTnA+bCkqRVNVbFVmKTdKYTFsLTB9I3hfQzIjdXVEP04xfXI8Y3syKVhuKXZIcll0T3MmRkdqOSpGCisxVCh7SzwrQjtBZHdnb3h5JUZGOUFvYjVraSp6IWErajR3I15nUUk8KFg3UzN7bik8WWEwbDlCb3ojRDJsXypZaWlaT2JyQ3pRT04yb0B5CisxRm44UzdtJWwzRz5WbipwQTBgeCpgYyZVcTQ5M3hoUHYkPTg4Wm9VaGEtbzJvQUAoeUZDRmxxe0lNfjxuRkVwQnJ7YjFpYWpVaUExcXJ2CitOMlopWlZ3TDwkSkt4alJFd30lRlJ5e1JpRU9pPV8qIS08YW55VEYld2FDcX0mRF5+fExAa2dBXl5HSEJPZzB8Sk9KVEhXM04yWEY/b2BPCitfQ290OFpxVUBBcnJEfHlEQ1gyTkdnaj9UMlhAKUZRUUZqYjJaUEFoRUZyeFdgdW5gZDNKQzNoUkZKcFQtUXM7YGtyZkY4SDxMbC1+NDs9CisheEdkYSM0S1o9fWJtMlpye2pge09OakpYezUmUHpBOGEofVo/RG1iND8kal9pbSRGISkrelZmR28+WFdKTStCUmVAZ2h9blp4JkB1PW01Cis7TzwhPz5HK2k8dUk2Zj0weiNVdjBxNXRufUV7MWhPI1FNYCo4aD1xYzd5PjhUc1ByRSFwYGFQai1WS3R0JF9ebTAoYUl2bGhRJko7T3RCCitWLWMlcCYpPzk7NklGd1ZnKzduOWJ2ZWB3NSheLVZVblF5OSF0e190X2NgQHdWNSo8Jj9YOHh2bkg2KWYrKUteI28/IVFUYC1gdk0lbiRlCitKdEZJMGdCTWd9NG4/IVFhez55X0FST311LTRBblklZl5oNUQyUFB5TmwrVyZSPW5MKXc8RD9VM1hQMmohNllANUhBWkReWG1TPiNGYXRNCitEfSNZJW1PWUx4ezM/KCVxYExDWT4wYnkpbUYjYSp2VjBPakY2MWdteDcpMkJ2aiNsYiVxcUpPX05yek8hMU1BbDc9OThJKHVnKGVRNnBnCit8QkVGfTtSTzZveUk1PUBWKT8+NTk0P201ZjB6dH54P25qND55fWstSzJfSDhuP1lfdWxnWFZoUn5NK2N9SWEpUkdfMEZUWCFOUGZuK0FrCitLZGlvbEcpaSQpNX58V3JmX1BnZUxNbFFHTDlXUF5Kai1Sb3Uzb1Azb3Q9dyhLY3tmIyQ7JDghd0hRTiY+N3ZjcDh+Smg/eyRzYExQKkd2Cis0NTFqdVc4ViopTCotMTR0Nz0qPF5PQktRQHdmNTVKeVVWNFI1dXY1UVZOK3tkZXBTdDBmeFdWT2UpPV9UNUA5aHJ1WXBhNmRzJDtxXnVjCit2ZSkhZWJlTjF1MVE7dUNWM3hOTH1TYzNeUlV9MlpnWXY8Xmg8NTFWKmolSGlifDc/ciFVRmc1KiFUK1AzNn5FaHd0cmU2PitCU2VyPUdZCispTG93MXY5Pz9saWZjU3BWSFc0UykxOTtDWHo2XndiRUVxfVAqJF9nNXVYY3M2I0cmemc7JnZuQl9MYnQjUV90PDxaaz9aSCNSZWQ+K1k9CityKT1jdWFxYSlvSnRHbmJLPDVKJSRySHlNVEZ9ayk2eytHeFBfYWJlOEFYS0ohbklfSm5EbV5RMkZDI2V3ZEpXe0l6aFVoZ3l0KWl2cmI0CiteZytIJVc2bj8xRCs2YEB8dD8pS1RQMDNiclJHaFViRjE1dmp9Nl88VERHQ3V5eWxqJjE0dnkoNHcjaGxMV21Eck5nOFdqcjU3SSoqd1gyCis5e2hxJCV+YD1XfEJyZzNDM3kqXjZtYS0hbml9VDEyajlSWl9PYDwmNWorPVhSOGlnajMmcmw1LWB9UXAhaks4MygxYjQqLVJeai1jdCpGCis7aDxyITk5PWVZcFoqaG5lY2kkSnxMKTVSO2h2cHRiWEwwTmxaczQkbjU9MyhiYElWN0JfV3ZCa3JZV25OM3l9QmJwdmYmNl9ETDB0PlVLCis2cGRmIV9LISpoWmhqJCp1X3FBS3o+RzNwMS0tcHh1ZEJSQ2hvaGl1fiNPfDRzWDBwR0AyZiYmT2xvWGRrY1Uofj1XT1lyLXk7TVhTRzxUCitJMSkoeyZVNitMWTNkUT1kcXxDN35kaWY3KTZJJUFsP2BMQWklZFQtfURjcWdgUWcpSVU3O15GUnBKe2BhVWMxR2R5RSMpTUFiXlNxPTI2CitjMkRabnUoaDJLdjhlNkpOZFVrZ2NUcz1qJUBLNFEpYF99dVY9fXs8OzlmenFzUGlMSjlneUMrKGFNVT08SjtEbkxiTUYtZHp+a2EmclRMCitVdTt7ayo3c2g9Z35FR0tORCRHZWxPRksqbDtoKVhjO2U7UG01IUM8SFk5JkxDSlBBYT12c0l1cmY7aU8zPzh1aHJzT3V8Pm9xVStPZyZVCitXJS0jX2pHJmRiWjdLfCNxPkMoM25OTEh7bHpjKCRwSFQ/fXAlbXY+X2VNSlUoZ19FZFlENCg4aXtxfT8kZURtcz9NX0s1cVVEeEF+O2c7CitiM14qamE8X3ZES0hsVytGeVAxanpJYi1tbnN7cH1rcWJPIWwxRkp3RiNKXzRsOXQhezVsWHRENGZIJHV5ZWNMTX0/eVhXcVNEZVJSO3lYCitxSlpuYipfNXpkTzYwb19eRX5mWkptPW5ua0tAcTdLa3VXI08qKWYxLURjOzJtalk0cWVLbUpDbyR6bUdgPyg2Q2liR005PVRmZGdMQFJWCisyIyYye2w4V0czczZlfjFRWS1PMDA7b3tsQD49d3loYj9sQU9IWXdiXnJpMzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+CitWUHxEP0ZMaVFrWS13VU1GSm9fUlplP1MxWD5WP0RaKk9jYWFDemxEYEgkUHluWk02cExDbkNBPGpOYyQtSn0/LVFuPEYwN2AwPjlNfXRLCitZTkY0RD0hITw9fWBLVEdJaWB+Q3t6dzYhOVNkKzl4ZmdKPm5NODVOVC0rZXEpbntDX21uZC1XeEoqb0loLUxCVkZ2bz5HI1VZbjBNTWMyCitSXmVSOHR1K0QpZTA8dE5vPWxednQpdk87ST8+RzJFdkk/ZWlPcXVPMlhvYDJ2NmM2NTRwYT8qR0VpITN8Sy10UE9XdyNsQkhXYmo5YHtNCitTekhsJHFwSndRQiFANTJvM1ImOT5pOXZ1fTVHZVdFQHUpd2EpR1FYYHVBIVZVMTNCTD18Nih0P31BZGdydkJ5NjlKSnd8U3RxWUZWd1M8Cit3Zj5tKXMqY0cwRCs7OV5XO19BWGZ3b14jKFAkYFQ5dDN4d3F7dCshPyNgQXg2OXhXdHNgcG9lWElMdFM0RmN7clQ2cXp5RFZeYHpaVWdRCitkQ3ktTHBXaThmVV52ZmJ8TkE+dGxtZEcxPkhHSnV5bD82SW15SzQtVThta0RJMGZEUiRtYyZqbmFJfCsjcXZ8SlJ5eDxab15PaE5je1JVCisrbHtkeDQwe29ma2RXMmlpXk5PUk1ya1NvaiViUjd9Ry1gPzQ0OGUmWD1hPjdyVVM2cTw7YEtlPlo4ck83d3U4WCMhLXUhdEd5NEFDZkFDCitrOyFIUUhGenAlWXVtPW0zNWU9NC1IUHw5M20taXZgbCRNNyk9N0kzeypmWGsofVpTKXAhIX56QjxkTUQyZUQoKDhKOXNvZTQ9a0RSVz9BCitxO0NtNDI1RlB2NlpCVTtNWCoySWFrPksoRUVGdElnWkI+Z2Z5dHkrM3p8Zll9VFdDKlFRIWFMKVliPE9GeUdKUXElcEwhVmRoUUZZX185CitNNjZ9cFBaYmBwUX19fHQ5eGtJVWo4U25lR0NzeiZWWng8KSNaXnNTPU5RdDkkZkx8bXxzcXFoRUdwVj5IbH5WODg9QGNxcDlvNmdWWXhLCis+MW4yUyVQWEs9PlRwNGdGQlctLTVJRG1rRTFFS0ZASUdwaCtzV3d6VjskX31ocWg3bGchc2c+VEVqRVRSSmQpYVJAcj1CSEJ+PktrRn1+CistKCtuWHhCQH58RjBKMWdXSTsqVHtkdXJldzskSyUodTtHO0MkRVFFRSlJMVpHcXt7cXNhJEBfUVdta1FfdCpndGRZP1c/Q3p8Z0J0Zk9XCit2V3VUKyFXentoNDs/QEU8amJfRnREcGgzWDI/ZSRrI1FJPiRFVDRfNU51MEUmOVc7QUU2YD54dUtNP2R7Q251THVBZDFrYWw5fTNXM2ZaCisqKkomfj9gfSszMjFnPERqIzlveHRXXkh5TEkzdlQ/dVBEKDtqVWpHNnwoeCVKTzNkZ18pb0BmVzM8VUw5VCpKYEd4Yl82YCE1e1R4QHZwCitSUzhxOSRrOWwoNDxTYHteTjt2RWJuO3VaO0trdndRcGclMllrand2eG57WHUmUyE0R2Jje3NnOzd0cEdNVH42WWJYVyhOY2EkdUFaNGkxCitxWkxpYVVzayVmdFlJTm5pa2pxdSEpJD4ta1pROUpSfjZ1aSZpZGpMQVE3PCtNNi0rWV5RKDJmQzgzP1MtVEhqVnBVK29TdDxKd0xpcCUyCitiJEIpJEleNU9aYj5oaGVXSit3Y29BT0c5cWxsZiYwNH1nUXJOZFpBcCh5QVotTUJubGtQcnJObUBgcV9BLStwfWFAendKYHk/WFFQJiVZCitvZVZOUV5lX0JpfUhqaEohN1I2Ym1GQVEmSSRWeD9ra0xSPCFEbUdQZHplejdnT1ZpT1Q3JUlhKGZxTW15NjJxO3taJEpEYTElR1leejNjCitEPzg/MGg8ejVAP31NKSUyfCQlNVdzMTtEfmNBIWNgenp5SCZoSmB1b0J2a29EanAwekBpNlR8aFgqISNfTjx0OHJXalImfUA0QVkpajE+Cit2PmtkVmw7NT1AX2s/UUpOPkZeMjx0QnViRzh5V0EwblRvKlRBSVV7anh4UTF4O1d+ZT50Rnk2JmI5IURycjtha01mNVo/REEzbSRuWEFKCitWMlhjdmo7dlQrMWJwflNRfTQ1encpO2VFUXE8R09JVEhrSlQ+JiNlczg7S3k/UHp3WiNmQmdmSXFaZ0tqbzlrUTc0amF5IWpkSk5Ebk9RCitqdTMyNEk8Kng5aG95LW88dk9AdlBpZm1RNE1VUXwxMDROYTBRKCpaTzQ1RT9BQmRwQyNqM1NDTE0zZmlEVXtTaClMfSZvQyV+RUNVJUVBCishejFPVlheUnZKVylTalombjNLV0VGLXxuJnZmV1ojN2ZgZlVtaDloczczSDJSSHw3IXI1UUpRMj9JP3RaMjVSfHd1WGIxP2tUbFRQKXQzCityRioxbiRHZ0Y9WnImfEJDdmkqZHZBPFNSYm5zO2FPfm8mJHt9WGElYl93WmdVQmYhKUFSPjI/KG87WXZoc3VTYiNVN3VSPTEqdik4YXFlCis5PmYmYTI0PXl3V35ifSR+S189UjZUSlIqdEBSITlmQCstPSp2fk1TUD03REVVPlJ1TTJSYjhAWTRgfXslVVMyO09EU3tCQEVmYWtlNl9qCiswSWZhMEtzNXFoOyhBTTlUdWI4WmBfWil1cCt9MWtVX2xGVWtidVI+ZE9tYiRDcDlndGhffHt9MjteWWxMcld0TFJQPkg9PjNIKyhON094CitGcSpiUj5EMnJnXjs8fjc2bHR4b05kPXkoZUFnO2Bnd0YzY0ohLXlXRTJIZkNYYipmZWM5Z0M0dmdgNVpnOSZ7YkdUMHN7P2R7NEg0V3dQCitBV01SKUx8UC1UTWtBPV5Ze2lhPmwqRnghT0QhOz5RVDJ5fXVpWlVMYEloa3s8KVBGKkE0MXlYSEcpU1d9WWYoeiloQ3RMVWRfQjJ9QzRKCis/IWR5VS03NHl9UENjd0ptRF9jJTIhODBFO3h+YyFjXjQzfipXWF4qKT54dCVwaV52eXVnWVRVYkA9VH1QbFdKSEZoYj9tPkR6RXlPR1dACit0eD9BYnFSbT9gNCgrYVBmYCoyWDduYHNgMGY+R1g7PHk4RSk0PGAzWUFweztIJHd0TT9NNXdMUzBUSk94K04/MTJAZjIqNi1gMDBTbUtSCitvRFFzSm88UkMzT2kyUzItSlo5YDN6VVlwRlZkcld4N2dwWCRlLWB1JEh3emRIe0pydnZaRDNYUFZEZTAoXn13c21AT2NRPjhvMk5rMHMjCityMiZsIzsoIXo9ZGVhS0s2cH0teG5DJmN6K2Ruc0pOdX0wSFdiY2BBNCEyfFl5MiRHcEZ7YH5vaVo9WmdBXjxuPHU8PzkhM0s3Tj1ROysjCitGMkdHe3FCa3tyNUJFQSt3TigjREtZKGwkaHxMdFg2Z2RmSSFheDg/XzdHNGFVTSpLQ3M+eWFkbE9CKWYhUmg/K0tpYUJzeUJ0K1lBV3ZBCit9YWBKTy0xe0tzQ3o1JSlIT2hFU1FyTFYpeztrQGRjMmBvZT9tUnkoPSRnJXpuKTJNYXlAUyVCUyRQOCQ+PXUtQVM+WkBuPlZlanxEOXZnCitPKUdeK09pQ2FoOVRCNGxoWW59WEFyPSl1QDY5QGBTMVZudEBVcUYoNHA5NE45UyZ2PjZaMTR2SVBOdzR3PjtKTHVYTCQyfVJeaUFYalFQCitJcUd6Q1dXKCZFdkFZVlBZQHZ7RWNSZCpkZiRRTUlsfHIrekwoISZ6diQzV0tOUU5zUnZyJTJ7JG14QDljaWszak9yM3xAWis0cnhGWl5jCitOIT9ifnc4cCZJczN3Ui0pMHQ5alo0dEk1eXk9Y2dxe2g/VWJZSkA3YHk2dTM4WilnTTkxOGB4QU90UUZjIUhVP0Q9TDErfXZFRzA8Q0p+CitvTUw7Z3RpMi0zdS1yb0EhZDNOVHd6Tnpxdz9CMHorcF9gK01aK14yWWtIQDFKTHdzcGIhU1Rzam5wPjNIUWtuQkFOSnhuR1RrOWRaOyVyCitLZn1LbUZvNkg1enE4YUYzbER6Qk1sJWgkMGRaaUE2Tmpja3BuM0hfSU5gN0luTU10N2dAWFByPjVyMnhETVRZLTR5VCt4VDhOeHliSjYpCis5aFojN3teMT9PcjF3KDskYlZjRnRpKjw3PE1Yb1VMWD03KSlqUCZDJmBFc3BYVjVISTUmTHBoO2MrPmQ3TzYmJS09c18kOTJUWmdVYEtsCitNU3JZNFJ+dGA+eUA+dXZlRnUxMDFsSG5ANnsoQUlfPSFVWlFDbUMlUnVsS2s7K0g1RzQoc2dmTj0wXmJ2MCRjMkNlMzAmIWdhQUFvZ1VfCitPakVhIVlwSSohMnRZTHpHaG0yPFlkb059KChET31FcCtkSDVTPX5qZjB+VSZGTE5eMSh2SFhzKWhVMSlWY15IT1M3PHdtKGZqJCNfanBLCismbjRlVDRPcm97bSY1fWRWOFdXdSNCOyR9VyM2UlNvTXp6VTAjT2IhKU5RN2hyRnIjKWFDKm9mPm1ydHEyKmYrQitsVCtVSjROKVllI3RACitJK2RXOVZ8MGAzUXBIUnQoUk1PdzRlPzViYHxWYW8lMkRSRU00dHotVytvKW4+UUokTiluT0ZxWjQtayl0SXpVZjFtbkA2flVJVU0yK1FuCis9OWIpYnY9Y0RNO01KQF59OFVoPWI8O0V6Ynw4N3VBSnVyWjlAJCowOEsqSVd0emMkSypqXn4wSit5N0xDUStZWXVgITd6NiNwdlYyRWdwCitrMEolWWFwYHY7PlUoMC0oJWY1dEZsZGtRQ0sjR3t4TWZMenRPWHoqJXt8UlYjamJCYlhzSEd5KX11KV8xQnN2RiFJQHtadiM+NWgyIWJ8CitiUDVzVFRYWWE+O1U+eEorb0EqMkRVVzRYQCY9RU9vb2lgdzdEcysmYk5gK1M0eihCQUVCemJhSz8mLXZkOD0mcW5OdCpqKUo7Y3ZaPm15CitKKUc0MEU0UHtuKjZBRHg9ZEtpPSpfLWt4MCtoJHJaK2ImbVgpZzx8cyU9QUtpU29uekpgeFpISWVBfHZATDVPZnNSRElBQjYhRn5hVD1vCitONTR5UiF2dSk7PX1qWVlfPypwUipQPGBkdldQKyN4TkFfc14zSiV5M041VnAoKmhNKzI4P2lIPkdld3ZZPntsS0I5IzBDS2ElQnlDNFBGCiskNzl6NlBXS0xzZi1JcDRFez9CbjA0JTNJPUJnNXF7ekJ4NTd1b3J1I3NVZ2slKXYpWkQtUSpPeE9AMzFAVFpUekU8NUhtPGBaNHRnKGNkCitfZnMkezhrSylSUnp6eFFBfnkxYkE7dHFAVDE3a3o1eE1jQnNCMlFCZiQ9bjxtX1F6WkdCamFabDcyRXkkblZze1hSfUppQ1Y/e29BWXBGCitGRmRubj4qdEl0e3VObkM8b1djTzxQNUZwe3Q+aUoyUDk/bk1wTjxidWdhZGZuazw4IzMkUzEoM3UzQkdONnt4VW9iJTRQSk93TVVtU2cqCitRQyp3TXk9ZHxTfVp1NClWQjN5PT1tdkJScjYxRWdSeTE4OV5qYWcje3pfdzItSWR9SS0jIS1QdDF4YjV0RlJjfm57QVBtSWkmek8hPDxNCitzJUp6ZE98SE91JDhGQ1FCamxNVkxzaSlCYkN+YCpHO2RJTm4oekJnVFc3Kjl3UkByazBPclgtWShFciNVM2twT2JzVmRBU2tOaD1AUU5wCitic3pHJUAlQ2clY2AjV3tXS2NTaEElTGNxcyhlUmZOcDR3VS1haENzZ2RkeW90eF5xWCRCYD9QWV5NQjd1aEs8UyZ+WSsqc3xYTjdWamxhCiswQTJubCkoU18pe2skY1ZEK210allEXkQtNzcqbF8jbTdMeSM+cjUhZHxMU196TkUjSjhBMmYmY2pmXnEreFBTWV5gZFpwS0QmNllJSHExCispMCtqSlUoNyVBK1U7YFl7NGchU1BPQllsYEEkQz1HQHRRTT1LU3w7bGZvWHwzUjthZTE1YjNZRl85bHF5NW0wXkRmWUw8RDd5KUtQa0BPCitMKE1EUkpNQDNAPmU1ZFk1eCtCNGVMdyQte3FpXy02YGQ3Qk1vNVdhdUtUalVUTHMmdXxmMXlOa0h6dCUjZzFAMmZpTVYrSE5yJX4pRUZJCisoMllqcT1kMGR7IW9UNFZTeU1fQT90UXQjfDZ0IV5kQWdfNW5QeW47dWQ4bVNIX1hUcGc3YWhZT0dAWVh6bk9MMWh2Jl5waFNSPVVASFA7Cis3JkJXREx5SVZpfU0pIUd+MTklSWklJjhWVT5xJHYtfGYmYDhHcF97X1F9R1JVSVooZGVXKnomamZ8NUdHXmh2MHdwQENtd1ZGZ3lnMSZHCitOXmhWeV5DJTVQd18mZyhtRiE0QSNIfDUqIzZRYGVpYFl9N0p7YVVzKVNsRXZpb35NbSMqfDdrNDteRj4lZnZyViFwbS1pT1c0Tzlne0c0Cis1eztlTDhLIykhY1dCb3lsS2h8P3h5bmx+eXchIXx9b3M4QiZPZGR3MzdZaWw+TEtwezBwZ3ZlUkhQOWl+PSM/fjl2THx+PDhCNXt7KUZ0Cit4eDEpZyRYRU8xenF5cm4rKG8jZHgqdT1Le35IRXlmSllKSF5rayFscmQpOGp5Pmc9d2kxV1F+ZFRAT0o7MDhIaT9ITT0zTzZIdFhCezZWCitzJDM4JjMhNUptOG0ocSZfZ1BuSWJNUk9RcnRJaHdDSXxZKDZsbHNiTkdETiZ3Sy1sKXJEQE9ieTJ1e3NjSmVqYlJZaFFydF5hNkxsLTJBCisrTil2Ry1RIz5ZWU0xMSVFJmB4RmU/ZXo7Mj9ZUkgkbmNDITg5QTNhVTR6UXhlMURMSzgkfDtEfVNiXitpbXV1U3l6JmxmSF9tQkheMmVvCisqeXk/bGx6Xy0xZ0tiOUJFYjxgcCRXOXgxbEckV0U9MHZQfGh6ZGpnUmFPQCVzZjwhZmZ4eDVURnBZcWw3TnMrbD1vcSN3dmIpYVp2aDMtCis9S3tLdkVWRz4zWTRKWGxjZ1MxN0lVMXB1UnM4dy1HT3l8TE0kOX57NSk8STFOU3xxVCYtRzxeXnUtZ004dmw5V2c2QXZlUiZBOUY7TUxHCitNTT5STzhwVnhhKmRsQStgWWh1RFB7cVFzIWI/MHt9Q0Q0T3JBRiE9Syl7PUh5dnoqcjdNK3RWY3pYKDNZTzxhWlJxZnN0JSYxNn02REIlCitHS0dCc01mclhtXnxzNyYhP0omSnUxWXB4TEZXdTljaklCPFBjRkskTlB3WXRLZVgqbXFSNEA7THVgJTFKVzIpazx9RSU3QX44VzU7OWJXCitXQTI1JG18XlhNMk1KMlY+e2pxe1VRLXlTVWBOKFojXzReUXohfHUrcSNUUXk8PXktbE9VUzxyOVZTYj5GelMqRmVXQjQxZW9HNVByT0RLCitKSkxBdEt1Mm8wYD8rfkZpK1NYblUrVkBGKm53RyZEREN1KlVlWUB7cSRuNlpLSz1SaHAzZG1NcEhLUCFOSk9GWkBUYT4mRHRtSEJJcEAzCituclhnejh0b3k0OzVfeWFwIztOQUZNMyg8Zj5FPnRJYjdAeUJtemRKI0lvRTY+en4odTcrbWUoSGVqS3t0NlJIS3QwdXZ4NTRmN34wU2RsCis1YiRsSExRNzVAZ15kO1Z5bG4tQmpFTjZTb0w9e2IyPUUlWWxyTkE7aHxhLTgqZD1wOzwhMjtzJkMpZEgxeVBCYmsqYnV4TGIpfnNNKEtrCitKRXNCSUZyRiF7LUlsenxnRSZZZlBGT2tJcU5Lby1ndn5gdWcqbT1XaX1Cc1pEWXczYjF1e1RaJVRJPn53TWdTOWlJbWt9P3ZsbHIoOV5rCit6ejB9SiZJfFdWVERsZz1sck9aT0BnJFU4K0otXm9eX1Eqe2hoTl9JVksoXlFROW1OaWk8UkM7ZkphQ2JkO19mI3VjcCpJYEshfV4oVUVFCis7amxjd1o2Z2QkSTJlSyZyKG1LOzlBe2dZbXRRRUcwYnBWblBZXkkqWmtLSW9eNTU9fklvQnlwcHF6MUBGP3U+LXVOS3dpQHQ1NVhoQFZECitDKm9pM31tQEYhSmJwTzhMWWxyPDNhcTVJcTEmR1ZneGZzXyk2SiphamtGNCpKIXRnUUJSO3tqOCYxdWJ1WHJjakg9TGNtQWYlMSQmV01lCitrNipLZHozKXAwVVpRaT5abWpsUVVBSnleTm0xQlZqUyhGNTV3bHR8bFNWJD5FaDdQPC19KXNvVW44d0x+eXk/YmQqRGA8NkhtN3pIZ0QhCitNSjEzdiYrX3coYHpJeyR5Kno8clYmKjM7KERWWS0tP29MMHg5fnQmd0NZQEN+I1ZeeFEoJTdXNCEzR0p3cyVFUENPRzFXbTNzOGheKWhNCitGPDxkSz1XN1Z2KFBRNSVmJWw0UHIqRmN2NnBzO1p+LWxhUFZ8NXlLNk9xcGtWNjlZdkJ7am0qZypCVzdhemMwZkFiI3kjWXxTIUZZYCQ8CitFWWV7KD08fWo0MiVTX0BhKkRSS0k7ZUZ2bUx6IyVmTXwtdm1KJnx0cko3QDJiNlJ1LXlhTWNEdFJqdF9RWDlyV2koaXV6NylkSE5FIS10Cit6cVlieXllUVI1cTRMUEw0UHwxVSpZY3cyI1FDX1lkQW5gd1ZqVyFAZDRJUmhLNVF3RHhZPFZ2MGZjRk9aIUArdldqV2l2TVF4YERScjF4Cis8aFV0OE4rYW5tXjZiQ1BuOGY2cFowcDAlWEw3Tm5TQFI/Sj8rajEqJUBOYGgxNVBCYkw/elhMZj1MODE3PEduaH1wR2U8cFN1fFAwXitDCitaZz5YdnVUXjEkekJERmBFaSYqeVA7bDNybGd1JH5tb0w7aW4lQVJTRV5la3IlUDcmPSNXN0g4NlIhMmNKQ00xSU50SnNjT0ohSHsmc1I0CitrPlY4YWY2NDV2THNUbXZEQnQlck5xTHtZPVJMcTg1e2VwTTJVSHFDbE5YKFg+c09rQnt1PGVVKE9JPHpvUExeVjJUYDcmNHQkWjF7ZjJ2CitAX0xfVlBpeClVWTYkfDFMNjdpJDBDWW5jJCpVNiN4MzhRell8PEJvYWBYQHE3TVlKWT88cDZ0SXd5MkxMPnMoPGl4X3NJQ2hVTH0wSDVOCiszKmNISTRjQnxJRkdQeGpkKl9Icy1DbDRQQDtoKUZoS0EkeyVmPXxFM2ZCckRadmxtIXRYRShsVjBueD1fJTQtKl4xYzdQTiVLaE84SypxCitvXiEoZyY7bntGO3ZhKnxEJntKfCo/aTtAZjJUcWgtSGN0V0pFd19mXip0SEJBXmcrKzlkVFpabHY5KmBZSkAlPDd+cGUyV2NCPD5kJTt2CitZJj5KMHAzX1NZbU4xSlVqVlZ0e2B1ISkoeCQ1ZmJ8VXFRbjJSQ1JJXldzKDdVUXNJdU9YQVJ+MEJDTm5pOWx6bmZ6MypGPXQ4WGxDK1QwCit3QyNqZUMwRlVsWDVXX2xiOW00YiE9Nk5pcHhudW42YmZmQTVTVnxLYT8xUUo2fG1QOEcke1VoPzdacWpxQHFGdXA+cWNGVGN1VkB9aDFkCitOJj0zTHheQzREPG1DRClUZTRAdEEpNSMjYzdzPmQkMF9rTk0zZ0VPP201WT87aV5VX2JVMVVFTD1vc3AkZjZtPVckYUwwNnYwKlNYPClICitFWWJIbl4rUiYzNyo9UURNMj9uRGlzdzB1PiNPZVF7UHl5NllySDQ3bEs7JXhiYV4rN3MocT1Vd1U7aHRTSGlKen1nSmxzUiQ3MGR0eypqCitDKWZFSH5OWlVgRCNTeCVXS2NMQlZvSEJ9c2tXenl0OFdKRXdQbFFYbylVPiF2OzglPkZxUFprNjhebUFhUmgxaGt0MVd3WHFgVmh+PjdJCitCZHcoTitBYlMyKWNAVHdqWXJVSmolNjRPVDk+U3wydXtgUmk/IVJVJD5FVDxWbE1Pb0JvdlN8QSpVPnR6alJDdjFkQyZpcEU8eGNKSXAkCitle2A+dWY7NG9fN3NDZTQpUStIe1cwRnV2Q3ktQTZJeU5ILVU9T0N3NW1hWTwhMz5wK2ExaXVKPERGSlptbkQldVR7XnYkbHFqelI0bXlqCitWfXdqbHFgN3Z4azgofVNzYmtyd0VCREZwRGhXKX5wfHhfJjc4IzVnSTxrfkokSjcmXzdvNVEhUjwjKHBDfG1kRmRxU2EyVHclS3BAKERlCishNFNJMzcoREQjVW5teXR1UUw/c3F3Y0JGIWQ3TV9TMXhOY0RZX1JOO1FyanFXYl93YmRAdWRQNWhHZnx6VSs1fjVEMHF6bHN2ZzAkVU9YCitOZFBAd0U8TnNqdjEmYDVhVTRHUyhXTjQ0dmMoQGZtRFhRbSRWZkNxPWw+cH5taCZnbGRtWm5AVVBhKmd9Ujd0V0tEcX5sJWw0Q3VyKTx5CitQfl8xaHBaQSMxKXNOUShWbEApaCFYPGFPaFAhZGd7dk50JWhsIW9UVSZRei12QGllSFZpV0EjKSo3bEZ9MCUkM1FAZXJ3O096KGhRfEwjCis2cUh6cEx2SnlZbGIxbUM7c0NjcERGMXVZKFJrQ0N7emQ1dD5ub0x0M1hLcWleVTNhKjZSSSp1QGpAZ2Q+RVQobXIpTz5TZG1GODkyd1hnCitUQ1g9NEh3JVh8bThGeX1meVN9N0k+fE5VNSpMWjZtRio2UWArK294MV9SU01HUjNWUjUjO3NzenF1YDdhYjw1RiU9aygmIUhiZGg2aEc4CitYJl5MI2ZmajFweWsjfllxZ0h1YjxgSm03ciQ5VlRFRmFnUGFjODlfeHxJZU0hRVAmTG43JUtFfSRLVmBGR1JENlQhe3JMWUlxcz1PJSE0Cis/c0ZWI2dVXk5uKVYkSk5IJUtAa157Mz1DNzAqIWAlYColez5fUCpNWj5zUngrLTthYWx7WiZhaGI5Vn5KakR0OC00Y0xQUWo5Uyl+dWFpCitCQ05Pa2ZVMFdSKiN3NShUMyQ8cWs8VkNiYiojUUZzJXhMeUMpTjh1aHVpT29CNmJwZGtvY15qSD10NkRTJlhaWTlHZD1fJGlmOyRUZ2ZjCiteVEl8eDxmSFE5SUYoez0zUjIhPSZaSkh0P0dkIz5uUVI0dnlwcE9ENFFjQHErUEw4aH4pcTlPe1ZBKlQoPXFESX5pUH0+WVZLZEczKCVwCitEV3J9eUZ0TURHPFRVTVBIPDlaXj16bX0mYXNyYUN5VWZhNlhWUkRtKTBgXkFgRnJgVmhoM19veENIKz0jez93RHAtVFk+KS1hfkszVXhlCitzIylXXztLYjg7IS1zWWVrI2QkUyNHVj9lJWw7RlQ3bFk/YCs+dDExYzJZISZ5OWFpQSolbSlsVzxKcVBIRyVPP3RsUytzQFhMUmV4LVF+Cit8NUhuI2prMVRmUWtqYlZhMDZeMmZKZGkrYUxQKTV0cEhLX21OTTZVZHFpfl90Jih6c0UkeFdsRENxRH4+elRPblNzWDczJWpRRzgrP0lQCis3eGJITX52SzloT35rPEQ5YXdvdXN+U1VALU4wVGo1UF48aW9QcFpZYzQ5Yy1oJSYpak52ZGk8dCg3T0E2a0ZifVklSHY/NDBFc1NBeT9aCitFK34xdXQydUImeCY8WGcoQkxvbzt4TTQwP3QzYWhaSUVCVmN5fm43ZllYQmJ9ZVMkZ00xeWA+cWUkViohZCspe20qMnU5K0NFQnZJdnM9CitmdkxNYCQmQnwhUkNleDwqdShKVXpMNW5tNFlMVVJGVVBGSSVRbz04IzkwVHZKXmcoY3glbElXODt6Z0xZcXxUQzc9WipRKndIUTs2NT56CitOK0dET25IX19fPiRfZ15lKDQrOT07Z2dpYyM1RnozTSZHXm9GYmE3PFZ2T0BYaiR+dEkxeT1wXzhRTmdCVi1WMHZYTGVUJjwoekVUSHVLCitAQWwzaTx9NVhsWUBhbD9FI15YQ2BSXlV6M0JfakxCKTgkJWVmeVhYWSZLcGpjbm17eHsyQlV2fU1fek1VN0I/Jm1rUVBwcHlxK2RsbkhxCitHdEU3SFlHWUB2Z05MeWJqNGhGajNEeklzdzw3USFmaX1yaHojSTRgJmYhOVE0eHV7amZXaHYlfjIyRWlJaDRZamBrYXgqZHlFMTNkVHRECitJTyZSP3AtUyFUP2pyLXZ0RlhSZ3hfT3xCNCQ5e2FfeygqNSgjS3szNEt1OVJvdFQkcjxHSy0oSXlhP0ZFKHY/dkN6NitXYmtQeG10P1loCit3XkpScyh0YVRVc25UZElfbUBSO0EyWHNjd2B9UHdKOzRBa2QqSU9KPT1SIypGSFRNT3w0TkQ3VmooeUhgclRTfVRoTT57aDFAKTctPGg4CitkU24mMWlpdj5QRl9ramRRK3BncGM0enZFYXhjdWQ2YTRfZzlMQ0hxP1J3N3ZPUVVzVDRpKysmQjsqOzlYdXxmcjFaO1FvfTdhZT5CcWd1Cis8P1Z2YktWdVVLfTJ6bDkpfi11UnNFNCtYUHlDd0NydT1OU1pGRGRfYD8+SEdfZnFYLXRvcUglbjVkQ2ZVVG1WJGJfP1lhWD5qPHM4XylRCitGcm9NTUV7VGUkbXJgaXlRVWZuO1g0REtLa20kbHdnQ3E5UGVePFY+Kjw3bSpZU0Q+UENZZSgjaGg3e35aekpQPUE5bT0xTlA0RVFma1QyCityVjVgZE9HSF5OJjl2bmh3dERLbnV8Qj5HMT1vZCZmMWp3c3VLTlBBUmFeaHhJeHtuWTt6S0o9Nm5FSSZCdzVUSnUkM3pGYG95VDszMWtPCitfJkk3SyRBflREVzd4bnVTZDMlMVooKzBPYUdgMVJXVSNxKz5hS19QYU56Y2k8RXw4VyVkTHJ6MERFKVhkX21VeUczPn5XTVlqeHE/c1FwCitLbm5mQWskJUlWTWhPWVFGWUpWeGR5NXsqYFNkYnFPSGohP3xIREc5NTE2OzxJVmd2bFI0YSohK2haeXQ0SzFCRS0zZjxickBQWXVQWnRECiteQWYqfjlfcVFCMkk0JmM/bWc8bGEkTV80fDFAenZkfms/fUZ7Z35KQGk4YjR2UD1yRXooVWYqRUNTfChDdDJjZ1RvQFJ4MW12USRkRyFjCis+OV87WVFYMklNVWg2dy0/Q200cGs8KEJFUjMrcnZuQXV6MSUhenNfRVI1KmExOW5KPlM1dU8meiEhQkFzYU4mRShTJWB1NjBBJGlKOFVgCit6I3dqb0BRVDd2KUBtYE9wTmVxPn5QbSM8LWIyck9YJWh1NTB7WUdlSkFtIUZMYSNfRUd4P0xGcm85ezk7TSVLN3BuZyY1dXcmUUd7fHFkCis2IXJiIXQqOXlTLW4tTVNzRDNkfnNKKXB4PSkkTUtnUUgqMzhjTSZoNXRgRnleYjtNUDFEJl8+QCFjeStrSTNwIyZBaiM2I1p4d0JPIX5yCiticT5abCFuIyZJbSs1TmB2clN7MzxPQFJKYG5HKF4+QW43ejU3Nj5MZ0ckRk5nems3cyNld0ljNlpvWm48bkBeTnZaYF47aT51Rj1ROSVoCis1WT8mKkp9ZCg4OT5uRXJVY21TQHRMNEJ4IXJ2MyZCaFNYP0ttPEJCa0xSRkdqdGgobyRESj5HVClMcy00TUF1IU55Zj8+OHJ3eERZRU1SCisxeCFvWD93I1VSUWQ0RSF0OTR8MD0pWU5EK1o/ZFMkQHFWYERsQmFlR0hXZDI0aGFje1dQQlZ1bUsod2RjaTxWfWwjO3RabWtLPHlVIUtRCitCPng9UVdyeW1rc1ckKmUodiUmaXhSK0d3bzZTbkdPNllxRkVQe29Jc0hsQFIkNSo0bnxkQCFRR2ZWezREb2xRc0p6KnArbmY/WlY4WEg3CitgQyZeMTRQdCNxQ0FFZGtKUn44fklDbl9vQENrbEtydmlKeWAheStkPWMmRXwhZTJebXlCeGhfM0RKKztXRzAmQEVhV3RHcUJOUj4tbW5OCit1WHZveGE5a3NzakgjPVl5QDBUWW9iejZnO0xRRWRuMWpUKV5TTyF4OSZGXy05PD5tWmlST3FwaCgleHxKcEFvRzc/fTJFIyYwe2RSUzI5CituUS10UGcpTSFpWiNKSmd8Rj0yIyhTJUd7KjFsNlFmR0t0R1ZAYmhfQmFiJXJhfWtNVH1rZEBpdjMlZGNocD05X059LXlnIUtrejZhYlpyCitlM1R4bjtYS19paHV3JllqV1pPcnskSlQ3WCVZaDZWK1hEMCZ1VjVHOUZmRkgyTlZjZ1dNfSR0QmpwaHp6Sl9zS1IrOzk1PS1PMFo+Wj0xCitRWS1PMDA7b3tsQD49SEhZfXUrMXBvalI1ZFopKTAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNCitGSipYUldwSCQ5WipGcmdhQ3lCflUyaF5jNm4qRGNTVllraGlLUCR3aEJvXzlPMWhFS0d5PUFMQnhkRlVSJVl5fUthIXhUe3E0UWlfTHZ6CitNNjdvYHtXeTlGTSQzRk1tPDIke0ozLSZXTnpeMVBtUjh9WnlkY0NhUiM8MV47I2x1dTxyM1kjM1lUUlNePkg4SD5LVntCOSZRPzJTeDVCCitWZTwqdEJILV9OV3RQJjN9MlR1VUswZ1pPX2QtYjtBKVpuUWV5Z0hsRDxVKXQlM3tqSFR8Szt3cEcrPXFWPTcrb15YRGh2eyU9ZGZuV3JJCis1bGRtamVVRWRndz1vdE9SNUQyNFptZihDQ047KnxuZE8yR1VNTzJhKT1oWDNRPjRwSXgjK0pMKi1oZnZ6RVU4Tl5pJHp6Y1NSWFEpSz5SCisxaWcjKTBId3tNcm5jdT4kRDZUVFB7NjglakoqXz92O2NncXdsTGsremtHNVV+SiRudkdAamVYXnozOWFMY3kqODVsLVZuY3g9THs0dSpUCis/fiY7QVgobitEaU54PnBJM1hWTCp5aXFrcHN3RUZBJksrKC0zanJ7eGJQQyZmfX5rMjE4djF4V0puY1RiNVImWiU5Q0N6YkN4TTdBdFMyCitXQjk5dV4+VURQcGpAPzJkNjA/ZT1PPXw7VVNMazBMUSNxVXduPih2WVpiZ1BmO31SbHEjYzMzUUNRNGU2X1ZaI18hRCVRd2c7bStmWUhmCitsVVJSV2JKK0pKPUQzZVNUaFRWN1FsKEZ7Y1hTcUpne3FgXzJaUnRNSF9GLUNQdVVnOUY7cG9QbTsmTjV5SXpqYWRlaWYyI2dJWFJrd0RsCiswdFROKSpFR00haVdRR0F6N3EyT15qWWJfYWFqVlZifTMqQk13SGJKbmMxYG4zSXsjRmhNMmwmKW1ibGBHSXB0eDF3djAxQ3pVTmB4SHBRCitQQkZoOyttSmY0OTBCSCZVJGo5djg4bGBJYiotQ0AjRFghO1g8c3dqUD90Pl9mYTxYMmQyN3ZZeXVoRjJxaTtEeEpXLTBlSnN+RkYqJH1BCitDMDF9WUglZis7UFVmSkM5WXVwY1cyQj5aaEgtPkkqUy1WfiVwKGs4bEVOUm9HI1g2O05CV3FSI0Ehe2F6WFFVLUUpNSRAY3p5MyY+TUwqCis0REcrQGN5U1VtekgxcGYtUjR2O30xQFQ9T0pLMXUlZiY4PmtTflZ6Zi1AO2gkVjA3PG56IzZSYW09M1JKUFR3RmxsNUh7az11QlFjRGM0CiteYnRUdVJDO0duTjBSbmFDfDA0QEhBdSU+XjFsJGU4emhEPUA4K2VeR0hMPCEyLXhrV0VNVko3YFBZWjZEa0slXm1vTE94XnA9T300JVZzCitEVykjUGNkVmE7KnE8OXU3ejYlQVVaY2tZM3xWV3RyMF4qNnhKYyV2K285WXtHO1dRNTR2ZS1+ZH1HPGEzUGo5NiEjMD1TX0l5Kk1Ce0h7CitPdTlYbUIlJSloK0U2cCpOJiYoOSFJSjRqdCtlWUY9K2w2dlVoY1FOSkFoMTJTcXtWayU0JDcyNkFwdU88SSstMGB4UUp3dkQ0PkFWcUMxCitiQV82YXMlfTUxPnROaGtvXjI3R2MjdjR2aDd2Mn03UFBQZDAzODxOKFQlbjUmZjtNXiRaNEpUPDBxYG1tNkVLdyZsYUdrV28zOCE0KSYtCitFWWVWe3kqQUF+aGtHTzhRejZuUUgqZVBwZGg1aStWZGNnfiQxOWVoaD55d2BpVGV9UDFAU3NoLTU1QzQ8e15JZ0t4N0BINTtRWSk3P31FCitLa3NCcWx0QUd+bX1adWZyPCo/WE4wbyhhWFU/K2prRnFIblN2Jk5rdjFYT1J8IXRla3hkeygpLX47ZzVJSmdeZWI9XmozJUpHb2xtKSpSCitnfWM8Vz5+VCk2Zkp6PCsoKSE/RHA5azM+dThxTjM5KlRVaUFMIU1ZfHpSUEZlPipqMSs1TT43anUtO2Nxe1AxeGBzdnR5d040PUdAO2hHCitMfmIhY2E1djZmXkdAX0lATX1fVmxJQjItY00oQGxqVT9hYCtiSHhgRDdLVW1DSWNVNmdGWiRgUlZoQT5FIW1OYk49NkMtT2VuamFzQjZiCitiIXlFNEQtdGBvYGVuMjY7I3JATGV4QHF8XmplaTlFRTUrcHwxUk9MalprQTlxUG1yU0hiaDZQdUAxMWlASmp2Xlp6THp0OVByZnVONWFjCitNRVZ3UWEmdikyJG1FPXd6ZkhIb093PD0jayZjdSF5bTl+T1ZOTj0zJnEyTHlDVVZaP1BVVXBDeztsKVNFd2IoY3ZCcSlNO15KbW1MVSFoCitraj9gI3BHPiZVZjI/LWUjblBDaHxDWGZAKFApPXxFMyZIZ2dMYjdvO1JObVN7YSV1QTdjQHFzMFlge0NBJCVZUlR5MHxYUVIwMDBPOF5PCitZN3leRzBSKTFxVDJDJHJiPHJGOH19bGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUlVvV28lP35FCitedjlSU1ojMEhIVzI+cVVxTl5YQnlXem9DakMmajVVYCsydypZSGJeeVJ+bDFVNDtFNGpWflNNSmtPcVlgPVlYQnFmb09vT0gkWEJAeEFZCis/KE5+LShZJlpjdHEzYjkmIWF+MVQrWDt6RHROKXZ6RzhBViVXNkBPc0dgWCYtNyFoKjJGZFNkdnN1YkF2VEstPj5xTH1fbTE+UGJWYTlWCistKHQ8NHNZQGtpOTsoJTZGJkooSipENCZRI0Y/QjNlJjFleFVSeDwrNmRfTEVJZT9jXiZaV3gpckc/MiQxMENHLTVNa3FueFhyPyE9RHE3CitRbXc1a2pXSnw5NH5UX3M4d2B3ayNCbDl4Tk9Ebno+NGJTYGZxU0FxNFEkR154KERUWWBIRXk8UHtUYGNZVk0qU1E2emxDaWI8PUtTb0hCCisoSnBfUilfX2FKYEB8RWBQaXhxSGF+cDlKek1NQnFrR2VMRGwrKChVakZ8P00tTzFhITIhcTRGZGx3JVBVcnN0U0oqcjU/WEVtMnJYMGN4CitlPHklMHgoYFZCTDxVYk9yfV9FYk1sdGZpWUhBQD53RktmV20lSVckWXtHSFV2N0FFMUFndnE2aFoxeFVUVEM9bCplYzlVdFV9bzh8OU1aCit7TU9gP3B6U2goe0JqQVhjYG0rNF42dTQzYSZtSXxiVjtieDBKN051T0JHQVdjNWw5KEs3VVQkR3Ztfj09JFRLU0Y/QlI7ZkVxfWMmZnExCit3dTQqSTt5UlFIWUBGNzV1YWJ2Nn5eUyNGIVpNX2V5bW5NKl9USE5zejBJMzhtUDAxNkhHT0tNd25ObmFyXzh8bjFtbGhIdVl+RitVKXp3Cit2ZlJrbng5UCh2YVNWLWcoNmN6emAzMFhaVGI1NHg/WS11SDY3WXtXYDVER2FEZ0kxbD4kPl5APFlBfEgqKD1YJSQ5VTVuYUJzaT41X09mCitLMF9pUlB9KzxAeU9GQ1ZLbkY+NTdvPSRsSlpUZiY4OEhxUT57d3tPd0ZeUkNmSF9uJU00ZSVBNEp7dUNvTUw2WTRFWEdBUmJ9YGFWOUEpCis4VnA0PmxIWHxOZShgZWNrREF6Uj13Z1pQZVpaJjFVd2xXdk5NdVdNTygoPmFmOTV8TXZRRGx4XzhkVipBb0BhTHlNODJab2h0a0xTR1A5CitvKXxBdHJNRylybEZtdlpEbSoraUA1YCFYQG5ObXojTEg9emxxYyN+cEtCOCZndEcjOHMoOHMyckAxTDFJem1kOV5pRD9gTylQVGpIRXYoCis4TCZAQE5Obz5+djUweztfQGYlVVhxU2NfXm9iIVFsKE9QPklZd15MQyZnWnhUXm1waXQjIypRVXA+LSlIZkJvSGs7bl9HZzZBfkRyKDdyCitBVjVxe0RuMTgmQGl2fndTdV5JQTFrJlNhUzZhJXNYZXVKVWYhMz12bHZabmdRUnNxPnN+UGFgY1VCYlVTKmxGPndvZGF2fm1rKkNuTF9mCitVJHAjeFltJWRFWm54QVY/JVI2dE07aEZTZ2pQKCp7flBwYmoxQmFtKTZXdlpnUmZhYHh0RHleMlpFPTB4Q0JfZD8pSV55elIxNT4xV1E3CitxOEM9Y0daUC08O3hBTG5kVnZkMl9hZ19Namd+RXBkLTdkMXFpS0hHY1NjZkNQYzZ6IUlzdithYDEpVEdQRDZjaHF6NzhHM3M2Z1A8IW07CitCKypVI0RPZTJUVk4lTEZkQkF0JU1hOWFuLT5gX18tIXhuZDV6d1I1ZiVzRUhZPGJ5MSp0SEc7T3lkUU5kYH5gQVkmV3Q5OGEyZXowKHc2Cis1VWtuKWA3SmMrXiE4Q0ZgUjx3RE1xLWR9THZiTyg0bGRPZnEhKGpyRWlrMW0kaT8+ZVQhYXEmMDVyRUIoMSZMI0Y+Vkw7KSRPKDZYWlRwCitIUkc7VXBFbWBPbz0ySXZuQSV9IyRFRFJoYnZtYSo5YjhiO3FlXlBLVE9BMyFyNiFlPU5WcDtKUSFtMl87UUNtJDhTXkt9N3pvV3J7Y1U2CitXJD5XI0psTityTlZ8PiZ0dTFOO3x6T3VmI3U4Kzx3MWZiPEk8eylzeVBNdkckUSs3TjUhSGlfaVpzRExWTHJYfFl4Qz9HeGlMQX53ajYtCiszWEBSRV5YakBGKG5Ufnt1P2U0UFA5TXZId0pHRC1yZiliRHMmPj9gVXk4SWpFZG5JKV9UUFh4RVAjQXlRcl5ITDM9Xl9uTSlBaVhpcT9GCisrWmtvcF8wM1BqOE1KMWdDS01kaDhRd3l5N1Q2ITQ8S2l1aGNDOEl0X1F1YFFgdEhGJiR+TCE4PE40andgM3JKOzB7QClBS1QjQklyWmNCCis0Zl4mSSEtQiY+JWYjIURYblNHIzJ4PzdmZHR7QiRKWH1DeTdIRlFvWT1FWSRQVU5+Q1dRVDNmKmJtdlYoRGArQHJYeXo7VGZWKjVBbXgkCittNjM4R0plbSFZOXgmc0t8SipgazNENWNIa2lYP19sOSR6PitZPV49VjNwVHBFeyk2b3htRnomMmo2dyZMR3Z8SUxVI0dlYj9fdXF2MVE2Cisjd2I7QG8wbGtVUldRbC07MiorQSprKmNJJVM3cVI+MVI7fHlwQSs2PSVJWEdRRTRyeCRmbUZXY3FvI2VmTnhEPCk8M3JRP05YbT9oSDRkCitJdiRAX1lTLTIzbW85cWdXZXNxKV4qRjVIVyVwOzNIN3B9cTJCTSVhTTFscylvan5kK1ZqQylOV0FXLW1uTUI4ZVFWRHhTJSFCUW0hWXIwCisyc3khTDJycEQ1Tjs+PDdiYShFRUFaelghTTNgMHppMVBfeiZ6SG1CIUp5M2RSdC01bWNXLSZfe3FjZDs+anI3dUFebEBEeXE1TzIrWD11CitubUpmaC1YTEF+T0dXXzEqbkpmbV5JQXg3VmZ6MmVxaEg7RURTTVoremV+NnZwYzxCJTdmaiFXRU07fGRRMzxFcUktRUtZUUUlQ051TjUxCitZJEh2PXZfa3BBc0BAcmR5e1MjQjZHeHNTOzdiPCZZKmIyJDRLUCloPkA2YVdBSzJtdGV5N0RzRm01ZzxBUDAwOEwtMDAxIW4wMDN9bGE0CislbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FiI2lRTVg8ez1rV0AmNj9hQnAqVEVedjkzUlooeCNGYzV5dnVRJn0mTztCcnVoCis3YzsrJWZ5aVNGZVUrU2ZFcCpjdTRheE1ZLWR8dmAwYm4+Q3ZEbnBZPn1wPXpWR2g3eVpkfCpiKSRgZ1FkZH5vQnZ+MDxMKShmOUx9JjJ0CitANDkyNWBAQFRrTCVYPCthTXRraG1meFc1JX5tfEBTcntHbCkqeytnMCViTSRlOG9SNFRLQ3g+Q2RzYEs0aEBfflVRQjl6K2N4UT5iKnRICitqTiVySUhTQ1MrWnVBcDNOWkU7IVhSI25fPShybGdwSnRycTg7czE0TzBQQkpxWm1tIV5heD00KFBhK3M+QnJtWj48elNAXilTXmJHd1h8CiskNkF7KWdzPXZ0JD9ybGM4TDwzckAoPWBLUz5PSWBmTiglSDFEWjsjTXxhTkhzMkoxVmIzdXEwVCV3VCo5dDF1M2lweUBLPzEzVT9XfW1pCitTdVdzKTk7VCstWjNBQVdOdj1JeGkqRkhfIWpKTW9Ma2YjbiFVanA1YCU0UGVjJUJZS2U3UmxeRDVCTHgjdldmTV4wVklwKFhRempgUHRBCitXJkt5Vj9BencxZEghJkh+XnRRPzRTP1JQZSZUcVZkMC1taCFKcVpgOGZYO3dIdDxjdHU0REFybXVzNGJ9K0k+WDJscCgqY2RFblZBWHNNCitaYHUzZ0tTVFYhTSZNTj9vWTJiOEBMN3xBbiV+bGQtQzleIXdXez5hQSh9MyVtZ3RiZGY7eHFxVEdVI0V4ZCtZakwmQGIreEw9RU05YzV+Cit0RkFqKGlVWl9SKGEhSkotbCpXaSZBTzZrRDxFWVoyai1HSEVeY0pSeSVDQyVOLUFYNEtacnFaZmI7VFZZMj16RG57RUpxJkh9Y0VpNExxCis9PkYlWm1gcFhaJShwMz93bWtJPHxUaDdAbW5pa1omPVNCdEFsUHA7LUp3c0tBZ1VQcUdLSGhkYnprRUBXMStCT19GKTkxfUQ4KXhkdit2CitaeFZLeHh7XzRWSG9la2N4PURxOVAzcVFnMSFyVVB1V0EhVlJoKkBUI2tKMm8jMCk9JnNEaWRNST9ZcGB7USU3SFFVdFdYTU4pX2NQY3M5CitXM1hFaX5aTz5gT25ock53RHhhTnNEd2NvMU5POT1CSnYjRFdyWXV0UVZQb3gtVT1hLUxtS3hWbHNvT3FJN0d6aEc9WT5Xckl0WXtDUCk8CitgNSh6Nll0R3hJTUJNRXl3LX5AVzZDZkdERTRaTDk9UkcmMWljOzROY2NLdGR4WHNne3tTOSpYO0ZmT0Y7OWltPWdAdDVLdGthI3xiPG0/Cistb3JIISk8NiptSnYmUzE9WVVTdCk5TyVYZE9wYVd1a0p+JFlZSkg/MyZ9Y2I/KyZBZCV4TklAYXJsYXU1S1R0fnAxUVktTzAwO297bEA+Cis9XnMmcEdSM2poR1ZCbWUrMzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkt9O2ZZOzlwflZQCit8RD5FXnY5UjhmJE9jSVAkeEgxKEJrVlRxeD16I3FHaj8zLW9nN3d6eEplbEkkSDAqK1FtZStVNz08YlJ3MCtTTH1iXjg5cWMobEdBT2t7Cit0IXpmWEVeVmQhKl9Nbk5LI2FyNEtGdjdpRVE+V0xMUU0lZCUzTWpheHgrQ1N2Uz49dmB0YSlXbT9sbEZ2MnckdG8+ZmBhPkRMJlIhajB1Cit0KTRZYSl5eDlHUUp7KDFPfCFmejNZSlM9bUJKcG1VXnkjZ3ZIdy1EKW9FMnElMWhSbV5MYlU0YGdtUGNnQHQlfmJAbDFBK3hZfUxpQ1ZpCisxN2F6b2RmM29GMTZad3x5bV5yRmheTkQrMzxyRWtHTVQ/ZHhXKXQjKC1kYHx+b3E5RXA0Zn03KWdtZ1RxKkFFTj95QXRNMUR8d05FS3NwCitqb1AjRy12YHdlMXRYeTljc25QZUYpaVl5fkBhdmRST0E4MUs4dGNlbTVlUUspdno0dTxAZHhpKVJiTXpVWWs/a3htczFRc3ptSTJ1cHJNCitHQStXZ1g0TnIwVnZDSWRJdU9AeUJFV181e2RgUml6c3ktQF93bzt3JnJhaiVDPyZHUCU1YnBaKVhmS21ZIUNAc0NTNTglSCtgaH54IUJsCis1KztDMndwJiVMY1Ahby17RHpOOyhzQ2BpdExzKDB3e14jaEtYWDNjKyFiT0J9fSFJOXZ2TzJAN0cwOS0zaFg7OGJYXlRta2tCNjghWlpRCit3Kl8odEVTM1ZhcXxCNHRGamZQRHhTSFJQWU9UPEtFU0x9bz4mJVJ4eiV9WjkpdXQxNWEwWW5qaitFXiNRYEB0U3F3e3ZSV0RPdTNxTDNCCitJRFFKcjw4REx7JSNZSWs9bTcpU3gzcjI8UEBIRURjTkRHZG41UUpCNjhDYCtBK3tKSjgwXlkqUXlsN1g5KztPPWpVfjhRdTY0STZoYTdaCitlK3UoM0VtV1E9VjFFaHtAQD83bDh8JmYpJj4qNTk1eWFjbjhwdnp0M2QhfFQ8Rzt8P3V8ST90cDx1ZWQrfkc+bDNIKFM/YV4yUjJqTW8tCitLNW9JX2RkJThYRDtXKmJ8YkxwZWFNISoqKUZXMSlJJCM5bVpGJFVYaChQOTU3SmRqNT9MZ1VyZEFKYytofVl8QnNfeiZhVGpNKFB3NSlwCitLaHZaUSFwVEpfY1ohe2ZPbkpeLTtROFV3XmNRRWRCTXVxIVliQz5fS1FqOUNoOUBPNlMoVFVEdyRxY3V7RnN1VVVIZGJ2MCVrSWFhS0tsCit7dyVSWkdEbmJ2ak9sO3MzP092VXcxP1FCYV4mSDFJeiRLcjRpYGZwP05SZ2JibU5wZmo1SDU/eiNyPWhWKShpKF5MYXNjJU1+VHtqTVFtCitmejtabURgVnhhJVN6fGMhMU9OZlFaQXdMQmFRZmE4MUxVUGw/cld4PlpmUmtibUw0ODA4MytrWT84Tm01UXdYQWVMa21kQzs3JCFZWllZCitPbVRKOWw4TlQ3Oz9eU1I4fENybStsbCRHcEdOeT9DPmxMPV81NTs5UikpdVlKPFRsfTFBS2MpfmU/PmhoT0pMOzA2KkYqZXM9eiEzYnhnCit+WShkYlE8KD8zQj9FYyhURVE9Q1h6R3dZTzBOcXZSbH1aVUgwUyh6QDhXKz47cSVuPUwjdXZQcEVJTkJ9cGdYXkJ7TiMjWUhZaUZiMypECis8YlRXMFViKzVEbzlRWlUjKGNGR0N8JTdTPyYxJFI1Zyl+TzMzN0NHfTdedWVYWU1mY012eXN3QXRZSzE4JmhCPFpFS0h7QGY8fnp8ZztqCiszNnw9O1hJU19fdyFybXhOJk5JYTgjc3swNEd2aHhIK1BBT0ItMlVYJXE7VjwoPiVydzRlUi1sdyh5PTBgQkZVRilwOEhZWjNxWSlAKEFRCitydCMoeDZpYkl4XlhjandfPH1rbVl0TSlESGo+QmVJZiRePV4yKkF0WmItXzFWPX4peHgjJH5IOz9jTW4kXkI2bDtXPVlySl9zVjw8YzNBCitsP01zLWY/YzwkTEdpcFUxWVBGZzExWUJrVGJqdF98RjdZMi1kLTNRVG1kfkorNjs9NDZqRU8zN1RYO3pleClPQTVaeFlTWXNTQVktPlliCispSSRBbEFofjt7bGpmVUBLeT1FZT5WJHV2fWooTEx2SGdqI0B5ZkxwIyhsWiY9TzhOOVVDflBESVVlelVGTHw5KG1UOyl5bjFwT2tSdUReCitJQ3tlYk52T29BKSMwZSQyTFUle0E/UWZJdXlaSjQzQzZSTX1WcnhKbVY7O3szY31XNSRYVj84c2FndWtYNk4kVDZSP0NUWnI+cU5VUl5MCisrQUgyUG4hdlBpLXZzTj5LKyp0OHdOIUpUSzsrblI3c2Q7JkojaVF5eWJ2KHkoZSMxZFY5cnEwVXlsJjxZLURASTFiOClzZUBLdUFZNGcoCis3aF9ybnUkSTcqMzxGa3AjcWUxSmlufVI3REZOTFFBdTZXNkp5cjJ5UnE4VX5aMlRSKH55dE1SRW5BTE5RWjRmNFJJJEIhOE1JZn5BRXU+CisqdiRmbkk5dlUpTSNhMWsjLWVXbWt6ZHQyKCYqTllCS2ZQNzM/RSRZRUclYHBtZnRjbl9sTmA9Y2ReK0lLdj5XRjU3V3QteztGWFJHcF5aCis9dGpvJC18KDZTenVla0A7MkFHTSVGaURIbFhSc0lhQlEwVH5iYj8kcTRBMiV+XjVBKXZJV2dnOTApJWFWZjRIX3Vnb3UxY3RXMVFhQWZOCishKVk+JDhFIWRoPXB+R0BnRWcpRmB7fVkmfiRmcCYjOUh7ZkMhQX5iU2JLJG02JmxfaCUwaFN1fkgrbmhLOFlUSTIyI3NaRFc4MkYzNXBICitRIyowXyZHdndJajhycTxXZUBuZHh4MD9BOGlVfDJhSHhVNjV5a353OXtiMHZRYng4UjAhRjUjaUJ6SjMrUjUqUkVlZDwpdnRffDcxY149Cit1RCVHQXIjZSYkZDAjSFVeOE5oMXEyLURTM0ZCPnhHVFN+ITkraHB4NjQod2JSdyhJWUtrOGVhYCtmdlhEeDlCe0YpbCRqfGxhbTJXWFVACitvak1VTSQzOD1VcV5RSXFvck5CWSNOMEFhQkBMTFFPSndwTis0VkZkdSpHVjwlaWRwKjlmSUJ+QV5BbXdKdjgzekhQSjIzVGN5TGZYLWV0CitMMjhKUno1K0VCUmFjR0pXWkApM0dpam05MFE2bzsqN1ZgN3lsQFJQKSZMMmJybmkzQGRwaytBJFlMVytmVShqMC15I2lPcmNyUGFMTk0oCitIV0YjSCZzcHFVNXx0NkxaV0B9SUwwQ0swZChkbTx0NE9oSkxwOD9VWkItdG5BP1loczEhYSZiTXFgeSYhZEI+WTxReSpzbEgwcGZmKztzCitPWCl+OGY9QitFP1B6emA7e0VJeEl2ZnR7aSRlakM4fjkmV0B6STRkSHU2fUk8NSUkYWgmKDJUakF9Z2pefVRRYSpMazl5bjBmPWAqdnJlCitrZEZrS1RtZm5LYWUjaUo8QEVlIVJ7YW1oRkJBdEh4RihUeExyZk41T2ZUeFNMSDd7e1lpTUo9WjNzNClVQUo1T3ZQT3EkZXFaZ3tWdnZTCitJQ3c1VWhqel84T0hXLWQ1clE9NSpDeCp4fTBZeiUlZDdKVXN9cUg7XyMpZGRlaDtfVD5DV2pmcDAwSEBORlIycDRNLWokSFNKT2N0IWtPCitBRSVWb2tKVWgpek1PdzlZOHhQYX4rck9yQ2llUkIxe0FQcHhQV3krZnhFc2pPZHRDI08mKHg1ZGdidG1MTiU+dX1LKUt1Z0pVR2w+V1dxCitRUjhWanthPWs0bEtwYTd9Mlo+KW8tMFZmQVJCUiVLMDJxdj1ZcD5QZUA7VTRIbXpheWlCV1JHZEFKV3UpWD1fXllEKDcyayNJTVUoJnElCitEenBSQEwpbW1fMnM9dlJOcEEhQEdIfnJvfEgwWW9hRmlMQ3tLRXJVS1U7WDIhbj03YHhiX2w5Y05XdnNWLXlHY2RDVmdXWVRhSUg4IzE/Cit8RHptPmxoam5tYUdpU30kUmZ5Zm1LYE9MKlhuT2c7WXdta1p5QG5XVD9TczQzRE0mVlRLflo+RVoxeCZfVH4haHZBRyZ8Nj4kWEpLWntsCitkMGtsJXRVcUh+fkk9K2Vhb1FhaCExRUt0VGlOXmhkISVFb3l3R2BLQm1CS0FvNDQmbWc+OX1kfmphO35GSExBY3NBeXlHeExIbUdgb1dzCitpZmwjI0g0K3FlUHZieD9jfGhOeDlqK2ImbXJefDY/YV4hT1ljWWFrTTVxJStEd3AxSU9AWmJjNHBfMmkpT3dWUnxOUyFRQVE9MkF5OyFwCituZVpEPjRxWDx5Z0psSEdwSFl8e2dzVTI/MCZnZGJfdW9DJW50NXlvY2t2IzZUaSs/TVRsTCorc2daZSlGNFU4TjhLZCpjeSRvQzxwdypWCitmZHFQQjVNaU0zMmwrM056QWMpTz0qaVAzaz4/eUdsYUwoO0ohLTFnZ0FrLXZMZ1RQXlR0e3podVcwfiUkVSpodWdRamkwZjxgPFp7RUI5CitiIWsrc1BWLUd2KXpAIWpnUFI5b3ROakZnRmp9ZylieUx6QUZ1bDJUJSRReDdoYThSWUw5bz9fbDJtcjs1Uno1MSh7ZVctZE9vK19QIUVOCittbylfUU1EYnFaeDBpPVpNQFJWfG1TKiFRclkqJi19bE9TQz0tUlgtaCZUTHhGRkFNKD5OOWVSRDc0VWI3TTUoeDlvPTxyfn4xQVg4N21TCis4YkRDPlY1cXVFanVgM2paU3xjQyFWb0gqO3JEVHl9fGk/b0FeODFXLSFAMVFZLU8wMDtve2xAPj9sLU5KdT4yTEokZjc2MVMrMDAwMVJYCis+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkxpUWtZLXdVTUZMR3NaYiFCc09FXnY5aFNZTDEzSFZ9WEpyI05IfXZRdCVrCisqcVpAazItMGlgJkBANWdWaD5HVihHbmZBa3dsSDY7PCFjaio+XmAkbHd7ZCRpV1U9c05UJGc5ZjR7cXZSQD48YUBMRE9FTCM/dCpFVGZYCitDaWk1fllzV2gkZUI5U1F7QHUhNUI4Wk9OR25ObV4+anQmb3YlLWQpc0dHNTlgSHlpQlJNUDZyR0FVbk5TTnRMSGV2KGFkQFNnPFR4RU1OCit3b2YpRChrbnBnVWc+JE9hKTswfDlXOExLTWp6WmxFcVhQKVNaNzNrPmIkbE9uNUB5SDgteWcyMElOZmR4d3o/fG41WX1TJmIkI344UzRHCitnOV4od2ZGN3gtNUFTTHZCY2lQfVJ4V2tZZzIwJkVhWU11VH1UPUQzTHtoakQ7KnBEWU5LJktFRlFvT1ZfdioxMW5OPGR+bFhkPGc4JSNUCit0JjM/KG11ITAkbjN2WEA9PkhIPSNzRDVxZD5fP2BrWHo4O3ZOIzI9ZHU5M0VwZFpmMFdrKDtaUT4tYUptLWByaFJ8aiRsQz9RUU4xRUwkCishTCFzbGdlWXFYYjtYP3dIemdpamkzQTw4NGVnUk1Rezt7Pm9GYEdLNyhgYGN0YXhFYXhoPS1qNypLezBOfk8zVldEbGwqWnFhS0ZBM3daCis8RzE7Mnp7TVhxJGchOGtMdzt7WWVkdmBXSm4/JkVfekxlP3E9aHo8O2lEUi0we2MzRGVTNDdCMURJb1JEWDdpZVlefGc8MlloKjd3aUV3Cis+Jmc5PT1LcTw8JiMpQUl4M2R5JD0yUytOQ3ROSVVLY0wxQF5CRVEzdFMyZEdQdSZ4VGBKRHBATVFHO2g1fWt9Kng1Q29oNjVjJXU/cSUwCit+YCpCWWsrRnI7KUVFKT19RHRkUWt7MVNTRyUzMSprajJRKFJTM3IteGFBSER7Pz0xYjNhPTF0S2txQiYkPTd2VEhPOCVIT3luZ3UySyRyCittI2Umcy1aIUNmcVF9Wj5XVDVFRzgyaT0qKjVaTlo1fSE/d2BpMV5xMSpOTlEoKGctMnFDfjJxOG1qSy1MSjBhN2d6NlpnMWdEY0NCK0lCCiszeFFmTDdVUE8ldEZSR2VfOCFlUFhfY2F2UTZ1S2UzeWcwMmByT2lUeFp5fU87RE1fbFAtcSNWZUhOa1Q7NUZWcyNvMWlkYyZKNm1yTDJwCitUc3FLT0QkSHh6dyRyUnU+STlYTyZ1fCllVmlWMkt8X2ZsVXBraks7VShXJTJpey1qO2ZebD1xZ1RnLU1TY3tFX3p5Tj1NS0xWP15BNVBLCitrUGtUZzIjU2wkSzBLNU4tTC1EZlk8Jms8ZGFvP2V5KUA5RGI0aCg8OClDLTUkYG8wdjM3dWBoP0AlMlNKREQtOX5LV0VHLT92fWg1PlIlCitCZXFHKXJCfCZeMkZVTzUtMHhpMClKJHZtMXxNWmp4dzFxMHh5QCN1LVk8YWBkYUZPdlFSb3YjZD5sNigrUWY7NmcqZjNha1clOWJyflojCitrM04tVz5qZX5zU3c7VjR3V1hUcG41QDI/dlIybVM8KmdBJW9IXy1semM9MEFUak1LaHc+ZzdIZnZyMDdCUzNIM15yUT01IXlVNFhVe3opCitBVXlFUzBDWEYkbV4mUGVWQCk3ODxmI2w3dlJ6TF9kd3VNekljb3h8RT0jVilsaHo0aCkkQm5fbmVeUVE4UGlAWUUzUndoSFZeZTA/fjcxCistOClvNCp0fHB3X3tmRXg+ZzE/UUJ0bH1AJGd1TCpwUlFWfWdjOWh3TGd8NmtsaFktSVU2Rk5FSF82Vkw5P1o3alVQanBQa1JoXmtDelQxCitDZzB7SVNGbkdtPjZfNkloYHQ+eFlLRERzMD5HWUl8Jjs4b2pOa0x9aHI2dU9SWXMhYDh3RkVoRmNre2BuNVoraVlgWXVkcjZgRzAmKClfCitBJEljbCRvKVlmdGZTMEBnVSpZWkhgVmpQNzgjSTA9YiZ2NVU5TztMcj9IKFpNTXljRVlCRkBvcDA5WUVgbXJDUndfXzVNdHJkUlAxUmBoCit+U0Y0djwpXjdgPXlDfEpoblU9c3tUWlA8Z3R9QXJSdlNvPnBkLVcoQzZBKD85JXQlekNOM3RxJCExX1JGTkBFX2x0KFhRYl5zZSZfUlZoCitWd0VofEdUWE16OTl3Wlc8NHxYZl59KThHVEk1dWNySHRTbDMoX04zcnR7OSg3TTRpbnE0OVQxTlpjMzUoLSVqcF8wPnRPKkIkWTF1cl5ACitAciYtTEVWM3V7RyZVZTtTezIlIUMlX0daZEQmcT1pUzgoJEZ0dFVscU5rTHM+SHh8Sk9fI2R8NDd9TV9wc2Y5b3g1Vz9sZjwoVjwoMW5mCis0bm1GbVpWLSRFb0JgNkJwfT5obHckd3JASGVeLXxKSlE4Vn5EJGticFpXaVcrYyR5Nn1SPDZ3b0VOaDBFd0Y+UiZpTkl6KzYmWWtua0RDCis9R1lsUlklaDZQYyVoZF4kNz8rX2Y3ZlNvPkh5cDZzSlMzYTFAMVVrc1YwQ19FWHI9QmEkSXhDSjd8KGYhVG1sSGMhQHlPODc8JEZpcXdgCiteSzdmJDh5ZyoqbnhoO3lmdzM7QHFZLVZgQXBFUjVJR289YjV9eFBxVnl1SG8wS0xkQ1NBd0Z2Wm5Ud3pBZk4xVjhMVClGaXp3bWQxeWFHCitBZj1efW4raHZIQylSUGU7SV9yWkl1XiZTTHx+QjlYamp6KTBYI0x4MkVuTnshUnRBP0I1PjhqakpjaX5DTzhoUFlOTGU0byVsMGhFQHhBCitZS0VmRHV5P0RBc205Y3FNbkQjUDxya3VET143UVAtan05IU5uazlWflhpJEQ8Xzl4S2l5Rn1hVUheaUgheXEjMk8zaGtEY1ZWVWJEe2xQCitBdm5LNG1acyozJH5wZENmS2xXRlMqOU9lfG0zUTAqQ3hWSVF+VSFSfFE5ckNfVDFENkFgTUxAdlYqNHBWSHFVfF9JLVpMS3BEZS1KTXlxCis2amJoUz83ck9HSDw9NEpAelF6KERoQFZSNEplTSZeP1JTPE9yIVRsIXVSMShWVVBPdUtiJUM9WEUjbjtObihoJkRVP2s8cW5JcTQoPS09CislLTFLJEZSKmwkYVQ9NWcpZ2FwZVZyUUBlek0tVUwkZFU2VXtCLVlKTEI8UVlFNjY2SnI5R1ZhfmtJO0chN3JUZ34/IVZ2dGlJaG51eiMqCitfdTBeeWpRI15xTzlLUUgwMDAwODBQfmQ9TT8oU2BgVlNIUzA4Mm1zMDVKZG4wQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjEhZ1ZWezJoCismV3BnaWVhJV5tQVZseXZ0V3BpK0VaZ1hXV2FDeXg7e2Q0MkNtQjBKMXotZ3g9RFVsaGtlVjZ2c15ROVpGeEE5RHEtTFpYX2NHOFJsaylWCitXe0I2VDJXTWc4bVZ5JDY1PE5Kd15peGxaX2xFc0B+RWBAO0t7UilfZitnRys5QW1DfGdaXik1KlpETjQ8Rk88eFBTSXVrI29WeUQ/MUV4CitKe3pRaUhjfW5mPn5BQDNYQVZhI2R8dlU4UFMjeUJEPEZpbUlWNDlfWWNOeHA4SXxDeVRUeTNYeTdBbTk9fjRvNSNtYi13Mil3XjxKamhFCis7Tll3JU8tQF9Dc3BZUmZEbz1UX0Zra19DaFY3YzBBbHhSQDY8YTBBLT0yaCY4OGB6TTBQZns4fC0tYyNNaCF1WVdiN2ZxU2l7NT54RGstCitNMiNlQGNyRERtOEMlSmNzez1pb3V9Xj13dlM4QXhFRGIkQUlreWhgOFQlU3dKVXNrfjVWRyR5U3s4fTJzSllpPHl+dVpxdzVWITheNlZACit2Y3dHWnxkQkw/WFJIe2p9YFd4JnVvdTNnYUdMZl56TFk3aTU3TCFeT2BQOWVgRlpgTTthO2EqKShDV2FoKmBzUGk/e1VVOGhiSkNvbFdBCitgVz48QkFSP253cW5ZPEdabTRMNHotaHI/UUV1Qz1tZyV2aX57IWIzKDAtS2RoO1JnKUk3VUQhZUR3eT1OQExsMlA1U3leZWkrdWloYnp6CisxamopamR7M1V1O3FHc0dRS3xYRUMwQWVyPmpMa055RiRabHloZCM5YDUkenZGV0p6PjhXJCkqT304SW88cEEtSmNpVmV8YDcoRmImPXZWCitCV3tSQ2xiU2U1Sm5GQVF4cCs2ZnRHeiZtNz4rX0ttSnxyeyF5aHFPNmMxISsyXmNKPzV8WnpVI31APVhNe2ZCd2E2Xlh3KCE/KDIlRihJCitjNzRzcFl2QWc1SyM8UkNPTkQqWHZvNnpDSlpRcTQ+NzIrYXglLUcjJTxlY0VqcCNvdlk3SHl7SkUqeFZnLVhtOFV4UnR3YkN1UVNORGtMCis+UlMyZGw9VFhNdENUcztoTHZJOVl0PlNYSXM8T2ohMzNpZC02JXt5JGpQV3ZLaDZAPzElSldRWUB5Pm9ETl91XntNNHJLMEo1fXczKGclCisyKkBpWVopaVkjSTVhYnYrNUlgTHNxU0lrM2tGWkc1JWVMQ24zODEtN2kyMCNZYHEhcE0rS3p0NGlwRCQmI0J1TWIzRFpuS2w5d3sjd3BwCitwVlRLJiVxTCt6a0IpMmZCRjE1eCZ1T0NKbnlHSFN2PlhSU3NYZENWO3NEYj16MCEkI1V9Y0MjXlchYWxFYUNzIyN0c2ZXUDYtdlQ3OG04CittYkZBYzdTVTZvQX0oZE17NzxuYTR8QS1MM0B8RikwZXhQb1d2ezsxa2o2dTBLT0NqUWYxITt5MFFpeEJhIzN2dkxQM2sxUkVKU28hQUc/CituYl9gaGplMjFndnc5fnxuYWg7Zng2WGxeUlI7VHZqVzxUQTFCKT9PczlTKU9MT3V6cnt2P05TVztBO3xaU2soMzxaZnBiTmJ4LSMhdURaCis8S0RSeC1LbzR2WChvIWs4TWwtaWlFbD1KMD9+VUB3bzx7RSNoWWMwIypqbTgzQVlDQjsmKk1eUjBVOHlWRnt5IVE7S1E+aERRcDhTJHVjCitiKFU9dkVucCt4JFNpQis+XnlHSEZHZXk5XzYyayYrT1ZZJTglSyZtTmApVEJNZl54QHs/Y2FPSzxKdWNxZy1oNnoyZDtiOHxeI3tZdVM7Cit4c0FZM2NwI2BAOCR3bzUjaCY8R2FXSWRicCp2Un5LKCo/Q1JuWXw2SmpwLXtQTyZ7ZG1ObiZxJCVKI3trXzVAKX5gXjQzQztfPmckVWNkCit4bzIhUFdUWkhQN1ItRSNsWFEoej9OIVUqVkYyMnFoWDs2bnd2dT8xTDBiUGMyIWxfazZvQllIPU1WITdGZ0QoRyNuMjgjRjh9WU1ZWXEyCitUZW5Ncmc/KXQ8Z3xBP2Q3ZWU0fShfWmpxX3pBMWNodyEwZ0YrOD1PIXBEWn5AWUg8aDE0Z2JCVkVobjEzfFM2fiFXKUJsJH5ZZXZBY1BPCitlQDxnQkh5WkhUcUN9RyopLVQ+Qk9iPG08LXBwbDA0N2xDWEUyZWNaVmtuIUcoT14mMW8pMG5Vd0UlPmpgMUpwQmtnI1VVXnl6SnVJKTQ+Cis0MjRYLUkrRi1WUChoO2JBSDsjcyk9OH0/M3RzWF9+Z3d3enAmJCY9MSZlTCF+d2ohRSZkJk90PVo2bl87V1g8cnpHcnJwQ3VBIyZaOTdYCispR2U1UzdTTj9GNkVuJD1MMUs4R29RX0pXWXlmUGhtPWp7cmpwTXF1V2N0NWhDKEMwZGZZZjRgYD84ZXZ2Mit1RGpNR0xYRDw2bFhWSVg5CitVc1h+Y2ltUWFVTUJFYGx6Y2F0bDY2SHkoUEk8Sk5lIWwzUGUheFJibjQ0dFdFbkJTcjdnSUtBVWNMb1BVZXlHSitMMzU3S28jWTFJdmlFCitKdld4JCtCZkdIeU81e0xCV293U0IkQCliWklLWkBZZjFPSVRuVG1MZ2JGKFlreGhFJEhUPiNEJW93e1dreDIjV3lDfHhacVowUntkbHkmCitZXnt9YSRCMTZTPXVRNDB2RFUyZSY+WDxlK3Yxfm1AWDZudE1kJV44dnZ3R3dPeipfXkF5aiM+V2pkKVFVZzFiSFFMU2ArUDFjRk9jVTxeCitzfkpeOyhXMEZNNzZvZWNBNDhBRV9KT2BAIVRTQTEoT1pMVG96I0sjbFI7QX1hcCMkSU0/N258ZVQzSnB7UVkoSSV9QWdkcz9DaTdKKD9ACituaV9WcHpxQEFOKn19eDBNZn5VeT14SHFSQUBwO1U4U2Mte29sIztgSUBLISMtZzJqTEF2V0JffTU4N2hEdyo+fENQP2h8UjlwTWU/c0NTCis5P0RoaCRNMVFmXjtzbHdlNEhePylXPSZ0V3V0QyFsMT1GT0lqNGdzaVg2OGg0ekM/TCltT3NLbzF5MEBeMjZ4NzZuR287UEw3Qzkjb0opCitgamN+JnV4fmstOUdSbmAkMClWNCkzQV9sdEVRd1ojVGc4UEdYUHMxQVJpS1hHaFooS1YzcjZtM1F2MnQ7NWNrYSM/Z2ZHRWdCUCV0WV4lCituejlPNShQZVpgcHo7UyFnQ0l5PT1TM1lIQmdnJFJ9Z2hMeUxwZXZQLWpTQTluZnRlIyRhYWBWal9Hdkw2cSQrNFE4ZXB1a1ZVUyo9YUUjCis2JmNvMWJSd1MzME41X1k9KGFLbkNrZDNFOHpkJDQrYW0wWSVXRSVaZVRKPzFlNyo7M3FMd2txaFQxKXFUQCRSd30qamh3MEo9TGEjQCgxCittZTlwYHM3ZHVnOTEqVUowY2l1RnFJckgxKTstSjBlNj15Jnhle1BQZ056SzhRUnl4KFhwbHRXT3plV30kJT83d2UhVENpNU8qMVVhQzRTCitvXlk3dVZCQFNSbHYjSk1fYWg9PlZaPSVBb1F8PFVzNU9WUVhHPip1YS1VOyZAO00rdmpEb0FicFp6JSZIZ1RQXzhVbGt1JChnKiFwT05xCisxSnRHYVFZUnohbipsdkRDWj5WbTM+M2pEMD0tcnV0MHE0c2pHekpAdmN9Ylc1eUl5XjIheiNTPXQjUlZ3REZeMCh2Nm4kdCt4NE9GTEpVCis7Vz89V3A5VXJxP2F3YGsya2R4Tj4jd3JUTjJwZWdieTRKcDhKail+KzhRJGRAVTJTUU82fD97fnU7SXd0PHVYOFN4bEZ0ZSUjPXVneFJCCit9SlJDfjU8KHY3S1ppUG09aih1aTFzZyY8cSs1dCpUJCV1ZWwhSEs3UGEke1AlR0hBS2R1I0BLa3ZwVE51dClKMT92MnFHPGIrfXE5SUBaCitqRCN4VzFtI3dMQldvYWphfkdTNmpORyU4eypLZEhSZjdRSXk9KXNeQ3JsVlIkVFVfQ0dgPDtQQCMjWVdeJjJFP35WZlg+RTxYJEZkP2x0Cisza3ZfYnlIfHBRd2BNP1Vqd0V7RXU2cUc8WlFuKkJfTFRHUChyekUzejxuKlFncyl8NTk5PDQkQWYjUThrQHBVYnZFZ2pYSGpsSXBlKF4qCitWJEJvNDJmJW1eWVJSekgzSCFxUGJlTl85ZnJSU2dHNUg4I2pnbmFnY0BiPjlUIUtEITx6c2klTE1QTWNrdXBhKzJwc34pKil1clNiQjFDCitXKUlLNT1rIVV+fDJpRmdtTG8wYWcya2R3YTk5T2l0MUdAcmU7djJmXzRORCY9WH1iSF45eVk0NklzK0RjRHt5KUYmZE1zZnZgPE9Vb09JCitXKTNnKWloV0pHJm5DdmdIUTslSGdre0wzfUZYajVXcDt+K351NjxwXykrTWNAX15fK2QodGsoeHVLJiRiam42NXoqZz5FPXxnQkBPSDRfCit6V2QqP2RfVWJVYCVrTD5gQjhWaDIydDIxb3tuKjQ3WDlYYX1zNV9gKTlzU2VRNjxhUk1NT2tabzl6TlhWKVNwbS1MTHkpKEBjbj0pZTEzCishSThlI0RJaVlMcmArXl9UT2dnXjVYMyFuOz1zMkZUUGtjPnBDJjtsMWk8PWthZ1hOd19qZlZgfHFaSnp6TEExNXJURkZWIWJyUldzQ3tJCitUdyp3MHF2NjcwTGVEPCpMNHhUflRZUngpQ0lTYTIpY1V8cGo/MjFMSSRDJCtCO1haMjRaJiZ+OXxqezghPW5Nbz9jSlpoeWA4aFdPaTt3CitUN3ZzenYrK09iaFFlNC05PkpMcHx2PUQpO0V3fFZ+WHlpKUBrX05yeVdXcGlkMVpSa0BuSG42XzQ2JmBQQSR2QCkrMjN+MylkRlZCZ2hPCitMb0xsWSg3TmdKS2BCQDIlIXsod2EhUnRfMGNUUzdSZnM3QlhmREtNRVlyM3hDbWNYfWAyTF5gbmJTMX5oNnJCO1J0WFg7RVhyZW80WU50CitMR3dnbTZhVGI0PnI5azZLKGh3ZE8zTXghcXYqc0hEKkNaJXN8bVA7WEpCZmNfUnYxPVRpN0NiRCg+cHVNM05Xfj5te044LTx3Z2I7WlRkCitRdDgxUmlLU2dmPkZtY244YkFVfDFQfj9USVEodWo3YypKVChpM3BCWF4pbisqNn0yaiQ8JD5HI1RHP2MzYEVkQ3M5SkNxUTtQWGglbnAwCitFN2xpKTlIMDxvZTwlZDZOVUFxXk8rRmghMGZqbWRATzQ8KEI1WE03TFI4MFFWNHx9YlpRd0VObVVNYTQ7OGBNVEdvM1Y8OT5GY0I3PCNGCitHamppeWxtamhqWF9TeEducWU7K19lQ002KHB+NFkmamE0a25vMWhvTjQyRWU/MXhkdl9HUzlaUFRZJGxZJFdfWk9fOy1QIURUIT9gYlk5CitfRUNtfnomNj9oSFVoOUNyP3l6ZjxOO3xRYH1BfChRKzxkY2QtU2gtQE1EcytEWSRrYVRybCV1VTNHV3AoP0FLYVMtcV97fk42O09oZEhqCitxNlFocD03XmVnYl80aDlhZ04pSyVrWG8yMnZvaCYhZX0yVWxFMk9hb3tvRjJ2JU8zdVMmcWlCP1IqKz9sWGxrYE5uSUhTcVlORXMzRzk3CitJckN5bExLQXV3TCpwbTx7KDlwNXp3dihHPkNXaThfYU9YblJ3SEk2Szk/eFYwfk5VViVfVWtBVUhKaUdMSzkhaDFocWQ8X3xQYVZ+JHtaCis/Q34leVl7KXJySEhuKnxvLXhwJSZwdlpAVyUwQj5hX2F2Rz9oP3kqWSk7X2dNVUV3TlpDTjxsWVBwO193ZGRZcFJjMTQpbHtzTHglLTtACitUX01xQ2x2U1pBPiptNmhAMGZJTStnWExebmFSbFc9dHFnYGgrVGo/aT5HN2lTdlJmKzFFU0pPQzFCSnp2NygyVDV6ZT18QytFLW5wQjBxCitCbzBwOSFjbSNhQ1pIWVIrKDhwISZraUd1e0omYklFPyV0KDx0dSRRan1uKj1KO1BCbk5IQF9AVFdNQVE+PTZ4Z21RblJVK0dxKFdRTkAzCitNVjIhcjtkSkt0NXgwYjM5YGc5WCUpKFNtdm9PSFFLTExXUjdHJjtJJExQc2tMX09NY0VHRCQrZDFVTSFFVG9sZEo5UWpJekBsRkpNOEZICiswSXlRbEBYMFN4anNEVXthUHRMR1hqMVNuSGlMWTFSckRVaVd6KTZJeXEoZyUkRFEqd29qeFZkTnpFYDh3XkUqbmUoTz9nZUF2MXRIRGNDCitOMEtje0w4TCpVTUxTRWA/cm4wejZZVylGXlcqYXpaRHdoVkBTcD9nYEhLK3hZd0F2NlFBUU5yc0VLPFcmV3pjaktYQjQoKF4oPjMxbSteCitsdkJ7YURfTTtFRmklTCY4UWxGeUVLWT8+Q3REbnl1JH1WaURXLTx5YTYzflJuRiU+M1ZVVHBVdjFzRnxWOz0jelE5PSpVJml+QzhNTHAmCitkQyFTdE4hMGRAPl5JSk9BaU9ATig2OGFVbEc7O0wjT1NNVWkyRWwtdSlmdisyUiFNfHllb010akFkKXRTTT1tbyllTnltYjJqQkM4JCU8CitYVW5mTVFgfFJaT0FtZTtUUTlKUUVCSTQpKXJpVUtXXzRxO0NSM1pObEFUc1ZnXypfKUJoeChRZ3BkVko1bD8kQip6OXVBQWEwXyhoYWU3CitibW8zXn4xYntARlZQbkE3VWB0TVA0VmoqK0M+STdILXo3VDxkfHItPj90KDgtXkx5RkNkYEw8K18yJDM0YllNKT8tNCUmSFBlM3NwWStGCistb2hWMSppNU9kSEpQNnU0UURnRiE4MT82cVY7dzZsX0dxdlImMnx+Yy11UUBiYH0xIWxWR2R5PzsmUCpKTkBDfSQ0K0FYKCkofjQ0d1BrCityUH5nPXMyYzYqbSN1MCtzO3FPNy11KUVVQ0NBbzJ+b2hAXjs5VzRrblNDIzQmLWExempaVCZqMDhkZz5hSnp2bHA1S1VuUC1LRnliPU99CitEJClGMWdmKXB+Rip3QV4zUkpRc18kZEZ0X1E4V0V6bUNIO0BQT0FxR2RsK0k7VW9CclU8e2h2TkMrYkkqRWU9YXtxU1RSbD45Y3ZgQmojCitVMGZlYFFGb25HdVE4SkxwZGdfdzMmfSQzMEs7Zz8xZGBjfDhGM2U/fDE0I09ZVE5pSFFoeUZvNGtpPjtwVXY+MVFrQUthPSkwYz1uTUZlCitOa0pVYypXPyF0RVVXM1A4VUY7ZXJtV05IZTJ2M0ZBQU9QM0FhcyFkJEN2OEhQQGIjTTt9SngyQCllZl5KXm8rQi1lTl9iJTYkPmZUQ0s8CiteeUpXUEVWM0ted3NrVnshI0lURDI3K1Y1STQxMzghKWZjZWR1QHpoWV54eXxPKFVKX3BJMU8kKmN4cXZfMWcmckQmdWMlLUBQQ0FlVmlICitWVWVXSlhZKyR3U3EpVlghekRJR0NzQyV4aW1DRnFfczMwdEBqQVpJK0Q+bGBoIzZVayRya3ttVEp4OXJCWjJNUiokU2peO01VTUI3c0hqCit1ekhTU0Z2NHxPK3wkSGxeQDVNQ3N4ODN1V0h0JDxtZj8rZVhZO0pecGcrZj87fUpfZkNQcD9HKlFgXlBKMmQtKElMTXFIJTVaN0NlPXFDCitGfnFSZXZxI1pkQE5uI2Fgcys+bW9TSVE5S3tgQi1VP3cwOXwzViMwfikjKHMzITtZZUgqYGMjVmYkcnk9aCNEa3FHdCp+K3xpT2t5NTR6CitCZTVXaFZec0VlP2RRZz97JXsmSnNkP3dreCU/VTRYQFd+Wj4qMj16ZmVtOTFRWS1PMDA7b3tsQD48OzAwMDAyMDAwMDAwMDAwdjAwMDFSCitYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GSm9fUmJhSDg4RkpFNzJaZlNJMVVvTFFZMHt+RDwwfFhRCitSMDAwTzheT1k3eTImMD9ObWp3VS1uLUtzMklSRjN2YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSCitMclpnZ15LVmxRclZZO0FDRlopYDRiZENnWipaYChFeWUpcTU3UVVzRFpSazdGZyNlZ3NiblVAQWopMXE8RjJQWTZAPjE/eCtNVUFBUVgyCitic2I/bnVkIUVUO2p8VlZHVmxrO2pqQi1gI3pya0IqSztTTSRxdkVIM3AxYT9PKWleTCkoO0F1XnZPQkctfkhPQVJTb0p9ezh7RWBiIUooCitsWDlScVlJQDxVQHM8UHBEQlBUK2h8PShQZmlrJUxhLUtNb2s1VUA/TVpQYCR9SG97KkMoNzdzRk1fUSUoR3YzOGN4UWVCbEtYVDwtPkh1CitATDVUKkg4Pz8lYXJCNHJaNlR5KVp8Q3o1KkptUW5BPDxtcUJsd3k/cTFsQypvaz1PPS1nP35jdjktbn42WURodlRIQ0JhVSpaVHpKRGNsCitsK2YzMj4kUFUrV0pPY2F5SVU5e2VofEl6aygyYiV6LWEtXzRJRzFGeFFqN0BpRkxNdC1je1U+QWhraH5DNDdOeSNWc1h2fUlUSmElJEhkCitVRFNkbTVKWXFBNDFOIT8rWjduTilmNld3KSlHdihPUDZqbSZYYytQYmN4ZUJ0QyZxQFctWEdQX2tPJWRCP0ZKcmtAYDFBNnZxUE49SnVGCitMZSk9OFU3OzQ2N3paOGI1dSFXYXRoJGs5OHhfWkc0UzJuR3tsSmJrPiN8I1Rlez4kT0FIPVJpOFFIUkkyZXhpZTxkYTl2SFduenJLSFdkCitVMTdnTCRnRlpUTTQ8MWJxaUhnNE4hc1VzRHc8KCMwPTF5Ozl3eENFSEloRilLVHFjRD0qail3JERxOGZPYkt7Tjd5amFwTyRmRDB1N0JQCit6Mkt1Rm1ZOTR5NkRYezM/SyhGJWo/WDUwZG16VSNhdUlmeEV5bE0mU3heTGZ3dz5LLSVnSnJ1MEAoX1l2UUJCX1AoQFQkclp6ZnhmNUFTCiswQihnMkpyYmFpSWE8eiU/en4pIyVRY0FHJVpEal4qUFBISkNKSjIxcFpLKlV7MD11SkQ3WHs/MytWQmpSZ2c7UDVzMVlRbCZ+NkU3KDA0CittOHdeNiU7Vm4ycCN2YWBTKjROX1FeWXVDQmY3JlIkQGFvNi09d2BYekB1O2JLZm4/aTlyUj4jVT0kMis5PGFTdl40dDBVTTVyVHR6M2M7CiswQS12NE5PRzY+MHdLQEJQN3IpMFVmYU9QJV5WSz1KQXs8TS1nfmpGRk1aRStDNmorKEpuSHI7JnhPa3QjWT9SYUwjfUM8cipNTGxnai0/CisxXz5+UUd9ZyVOQ2ZSU3k+JFk1IUxBYHNTcV5LVnhmUTFeQz41X141TUp2ITE/VHA3YnhjWU8tJHNSbEw7XlkqKFF0RyVKQVhnRklHeFg7CitjZUNzMylBTzB6WjZNRChsPFNZU2FHSzRoSEZveyFfMkxpZURzIUZsKzElK1QmdTNSNjJZPE1iTjt8YTZAYzx5Z3U/RTJIOEVqSWJLam4jCitiQHImJGc4MjIlIUVlY2FRKX0/V31fUz53dHFkcDt7JWRyeXE2RUooaFRhVWlJQiNtYCFfRlYpKWE5Z2pVLUJOY2w5KCVwYWV9dHtMMmgtCitwWlJ2O2x5QEptPj1IeXdeI2lkeWtDT0plRlYpODxKZ2x1YFo7bnVWI3w1WCYhRWlPajhsUldhVFQ1Y0xrNXAjeURIcVFgY3lEdiloVFNICitDPlh2NzxKayUraCo7bHZQfUJAUlVrNmFoNV44aEMkSSVgcy0/cT8mR1g5KnxyMk9JXkF7S3NJJCk7QEExV3JVeVQ4c0w1ZEVzO1dwRD1VCisrQClFaXxIRnxuNlR+PFhGM3ExTCkpcHZuYHhgPTJzMVJvZ09ReC08SD92S3tXRWp0QXxZQC08P3l3ejJRXmxPPzNZJHVTcUNKdGVjVFJSCit7dmlzenBgN2VwY2xNS0diOSZZITR8fXdoQU5WYmMqT2FON289WmtpQFdAbE9wcSN4dXl9WD1Wb3d0SEFVfXJDeFRTWWckZmlqKGJuIWxaCiswJWBlV247PFdHR0hgKTItdnBjckc3c0ZsP3o4M31XZ3dJRmxyXnRLYWJtKlEzTyM9UihHWExNbl91K0hvKj5kaEpybHt6KlVSTllxSGB4Cit5JWApTkVMczhQb1BDRiRxIVdHRmBpMzheSm0hV1hMfWJzbmF5a14qbUkmWFl5dT9DJHJkbzZTWU9xcWhmbHtjT05odiRyTHImQj5GUmJ2CitSIy05NUBHWihCN3NQMjg7aCV4WXxKMVlZRG9QeHY4ITgjKk1XfDJWNERMWT5TeHxzbjFNPkU9QnFmX1I2JldMTGtYT2d8Q1AwREl3KCZ5CiskSSpCTGAkUiZxPmRFKk9FcChLOHR6PXtGflE5Wl8yQjk3WihMdFomYDxydllHQGJgQE41T0R6MSo/JllAbWtIWDlNZ2YhNWpTcFApaD5ACis2YVdBSzJtdGV5N0RxeCtGQDwjdTAwMz96MDAyNHcwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRYiNpUU1YPHs9CitrVntkTUJhJW9+T2FDdldWV29+bkdZJVh3bHdPTVUqK3FlPF8mUj5DIT1TR3hJWDV5c25PeDVheCZ5Z3FVKnBnfkYkejBQNk9fN2o8R2V6CisoSyg2KU1Xe3E1WmFLb1dlQmxpcGw0X0RDY2J5TmxndC1AdzZPdXYlU3tDI0g1fUhKXm9OdmREOFQ2eG5iPW1JdC10OEY+P3NFMXN0T2lLCityY3dsKDAtSFFOKVZ6T2NKJnMyVlJnVFVaamJhdklqfk9DeSFMSCY0RDIybTxxKTxFUkdaZjs+X1ZXPVpjUHlCfXdRZURwRXlLd2ljMEtLCiskdmp2R34/PE5leitWK3lyYzAwJWVIXmpMTmlKZTZiRDM2a315OyNOPGtJenBwfVNIbWNTeWZwI3JRRWxCUyEkXlhfJmBZOTNOK3ZDKEAzCis8fEwyZWhpSSR5bGAyWThudjZafmw7bnArUEJZdzs1MWJVcClARk1ob1dDOHk8MUU+cD9VYyU4b0hDbEpIcXFQUSV9X0ltV09tLSs1ZDMtCitRY3xYRlE7d1VTe3FFPnJEKGJPO0lgK2J6NVFVcEZaJWN+WG5mckUtdHJYNmpKVC1ZPyYzUzlUN3Q9VkpRNW9uTzYtZ3J9RkAlYThmZy1GCiszR1otYmE7TzBhY00yPyR2QjZPQzJLR1F+cW5ieCReZUAzbzBiS2dUP3cta0ppTXNDTDwhWlVGQFEydHw/aWNYdng3PSs2YiVMSXk8cDFOCitYbE1OYm40U01qfj41RlBXbG9BcjtAVmY3QVBXWl9rcT0xP1RgbUJTb1VAS3NlWSg1WEpWQylVeDFkb35PN3d6PWFWa05nK30ye2U3d057CittNm5BV1JJO3Vse2sjYDVCI3ZiNHVfKzVzMGpaak9aaHsranl9Z1VTN2ZHVE9vaWEwN013Pj9kZnB0Tz9xRmUySzx0ZlNeVyNjOzU9aiNYCitUPHBQWDJOUS1QdXRgRmcwX1hyRiU3QkxHX01VYiQoXnh7SUdYZU5Cd3Y7M2l2Xz9DYCMpWktNOFZnTmg9fTQ0SFBJaSRBbjRFKVcqZHJ5Cis5QzZ2KDMyNmpwS2g5cGN6PmxCd2x0aH5DclVVPmw2VHU+Pnw1bCMqdXpORDFnVSo2N2Nycj01aVZScyk2TEhmKWxsP1o/Zmtxam8/dXglCitrfERfY2t7JlRiR2s2U0V2fkFQV0dEOUY9elNCdnBFMDxARnZQeV87VExlN0w+fkxGNGRwd3RQUm00WDxhYnlaZGBjQlo5JHBENSFOfmpQCitUTGtrPXxNQjw5VEJzQ3I2bCMwcFlZcVpFS35iYFhEWHtOR0xObENPVkdDdVVecUNjdyFHTXJ3Tk0hRjFEfW0+ZVklMCRoWUE8K1M3MkJCCiteS357YnUyST5qQWcmWk10ZE95a0htI3c+SlpaQkptcE01U3tlKW5vPnY4aDRzcG1YZnM8VlZGa3pUZSZfWllhR1VqYVR0VW1ua193V01qCitGfjB4X3N9SVpOO2BaKFpVZDgmU0ZpS1VKIUh5fihhMS1FbGt0KkNMO3tKejcoJms7eWhTVGJoc3B3Z1U2QjFJUnd9PT9Uan12TT5nfXF0CishSG45aXI/YGZxPngocU9WI1gkbUl2NG44UkBlPXNMUzc8TEFZdCRqSClHamppSTcwa0YjZiVeVTcoJlY4MmYoREkyeyRhSVR5SkVnYX5MCittRnNUVUBnQCtWRCEhWlJHZXglTXtqJlp3QCU/SShwfHNwb31ZJH18a2dnblM8S0IlO0JINENwZmAybHNKKGJeblghb25YISZKY0dQKURrCiskY2NRKGF0aihTTT5rQyZCJGgyYlhMKjJtdFB1LU4xVyl1P21zaDxPbSE8K0QoKWpMfDdkI15we281I1QpeyNnMUNkIUNfc2p5O3RYbmhmCishc3FJJEF+fHZgO3JPeU1ZfG4/ZHdJTEtUVTspI0YoNG5geWRBc2w0JFFzcVdfdEkyQG92O3oxQ2paNy1kdihAUlYjalZmfV44SFB+X055CitfYGhgWT11eEI4O0A0cGI8cUwmKnMhLUdeNHlHYDtsQ2FsdV9qQF9MMT93KjYpMjRgeik3I25Ba05VeD1OeE45eSVAKl5FPnQ2Y2hiYjh5CitPem4lVyQhfFpuWT9rSWcjI2FmXjVgeGFiWCUmeD1QNikyfEhoQTJYdF4rK0N0eSZ8QEMoeTA9K2RBeztJanw7WDlrc3ohd3J8SXBiQSprCithZkxfU1g8JTBuQk02RE8jRyk8ZlZBXkBzRzlibU59RTRiTDl2O1M5aFU/PHkka0YwS09lKiV9aEUkXjIhKjlTbHRLYWE9VSQpbUJGTDluCitSSyhxfS0mQHZvRXdPTUwlVEZJUFY+OHYxRzNnI1ApdUQ0YzwzdGA0IyoyWTJFUHw9em5yQHFHeUQkWCQ7e25BfkkjJG9xfms0RjFCWUlfCis2Izwoayl9JjNXfWRSOXhaUTh5I1ZKSGh0QlV5RDU+bEZHRnR9TEZnTDYhIURjdTdIUV95ZklZOT1+YSleU31WYXFTNktkRi1aT3clfTBoCitfZX1STko4MHpnKnNIRUM9Rk9vZllWX2d6PWx+N1lCT09fMDFYdDJXWTtUPSRnPS1vcEJ6dE5fS3d0Sm0yaVdnWD8xYGJGVFFofno2Y31wCis8TXl1RnFeMSNHMV53WD1II3V5K19zRGMlPzsjb2A9bzFsOTFKXjVEXiV5a19MSzRSaXMwbnVmMyZwI2lMXlZlX3dJUStlUmhkfHleNipkCit8SlUkK30qSXFOZzFSeH1iWiZQc3c4K1p8I2JHOSlIcHtYRUh9PV9zSFFlJGpXSmlvdU44VXl0Zk9UdUBicnRYZ2lJeXJtZnhRTDY3P3QhCitWK3Zib1lvQmhXKU9IdmFPP1ZmU2FrYmdHZWRCYyo5e1c1fXBDaUJsSkVTeGBnR1A7SFJkT0l7PjR4UCkpfStIUiZIRldZRU8kVkJBUjgqCitjYEwwdXNiIVR0Oz9gNmhwZXFqcHVSPThPQXw0R0FMeGhALTJBP3dDeStVNjt2ej51KD89emkkbXkmQ15YKiM+cWhwMW9gQHZvZTVqPCk1CitZRk9fSS1ENnRKJSQ0NlhoUSRiemROX2pFQE52bkFecm5xb0U0bnZQQnRUam1ZRSt+Jig9M08qSmZNQHlhQylDO1AwQDBmPC1II2NPRmUlCis5QX5lZmtYRjJGemFsb1lwbmk+R2ZlQVZPbTdqPyVeODNYfUwpLSszZWg8dnt4cVM2bFZZKSMjWEFEZkZtMzFwSjJiV1FNMHxMZGdSPD9PCis4Tl8qZT9fMnprPTwhYWJPPm0+ZnVRU3loYGUlez8lKE8kck00KEY0VU1JfX4mU2I3N2JXb2BXSDlOYF9sN1JedFZ2WSlxfk95MUojXkxKCitwMCMpRTJ4SCtpIVJSeGhnOzhob0lFZE5XdlR5TGFrJmYjMkc1eGpHUClkdkt7fE83WWlKT0xsSkdhZkglckZhJmpqTTdlVkBUcyRTZV5OCisxOC0rVXItbTtgZUJiS0I8O0R+VC1ZPWhFT31qVDVwUVEpWipiVTJrJmFHKkJePWdFT1JtO0JkeCpDWWwhNlVibiN0TEQrVzsqc3pNcWl1Cit3bWZIVz5TR0VYTlYlbE95dE4qSiMqZGMjRyFrM0QhfENiNjZhSTJrWGRENlFtNitydlpRbGYlUyh9Wk1fSCt+OVghOCY5NSs8cWthTyNCCitZYXB4Z2tBQG8yNW5Ne2EoMks1JHRJR0VFeDhHITl7YVcme2tCR3k9SUsmcEcycmpxcyQ8QjxINHt7TihjLSlmRnUrayNeeVE8bjtyQFRVCit3eTRVfjZULWNCIzR2eWFudjtwK1d8eUxYRkVeWilsQUsxRz9qZ31KcUw7SEs5bUJrfjBRVjl0cjF4QzhVJGNqU0NfQGN2fjRPQDtZKXFYCiswSDsyWVNlZGVSVn03TkF4Y2Iwe3A/OUtDWGkpOHdOZ00rRTlFMypNJUFrenJgTC1iYmJZfG8lTG4lMkszaHZCPG8kN0lJPnFTWDlRPGVOCiskO2RpM0ZSYiZKX3NmTkpvPmVhUUxlLUZYJEp2TUZySiVRY0F+WWRmOytCWS1PX3hVcnQ2MnZDJjMhQ3hCQ2VKRHRNUiYxKkhRUDRUY1VyCit6UCkpTjxRczg+QUIhY2VPbipVZExhTks1KzQzMTVYOT90fm07OFg4T1k0RXJUbFhzX2lNUVJfSE1+dSVgMUtpPWo9JDdPPT18TC1IZjRUCitrNl5PcileSXF0N3s5b212N2h2QmY7MCFCSnI1Ym55YCpVcDF0JlA/IWleTChzeklTcEowWlR7Yz1SZHZ2T0hjS3t5alhTbGJeIUY5NCVJCitwcVNOSEE+QTJnXlA5ZU5qKEBRJWVIUzNGM0hlY3E3VzBZKz1WKSREcURfdjNPSkxhJT9gZyl7Mm9zQmVZLSh4NUE2a0hNSTkjcmdnSy0pCistP3NIPlZAYkZlcGJxakhfWEFJVWtPT1AwXzgoJlU4YVFjTGZkSiV+djJtcEM1TVAwWHNuYjI+Yk56PXhPJXBGOEVTaXtwdXQmKF82T2lkCiskaFokKlhqUUJIXlNhdk9iNTx5TCUxSGQ/V3Rtaj8qajN4JTgjPlc7fHsyZUxXQ0pOLXc3bm0tTjxANiMyTHp9WTwrS052RXNrQm9MaCVNCitLN05oSjEzalB+bFF8QGJrdjxQO1U0bilgT0xOXm52UDJybG1JU3ReLS0rekZST3FvNjdDTUt1biMkQFF0N3A8fFEoKGtVRm9wVl5CaV8lCis+I2d9MXV2UVh9IUhvTSY7dXF9VDklMVNhRXZUeVc+O2hPSEVNfjFJMlZiWmBjI0p0PnRwK25DK18tQHl7Q3FMQlpHVV89MXFgOUgyZHQ8Cista1VUSXx8azJfMHFwPGZCWmJGPFBDSG55WEVmYTdFSGpKZCVKcz1VUkgtI1ZmR1QoTiorKnYzfmEkTktTd1J2ZzhvSlc1SSlETDFkMXErCitjIWA1JCh5QmRjYjRkdEVyVEBMNyswUGkzViRFekFDLVFjVmEta0JlZl9pcnh7fFVEZVN3LVFkSm1kY2UyZHpDKistZVEzQFJteldqNHVrCit0JEMxWXw5aiQyZjhtdWlPLX5qcTsmR08lcy0xSW98PDFTWmtEJngpb1FrdzxHQSt4PH40amdSfVk+VzN3N3UjVH5fcT84YGJpU3F8NERmCiszMn0qazxlYzh9aFNicHdDMGhjMFV9dlZ8Vk0oakdFM29GWCgoITlqWlkhWGgpVjhGQ1FrZXBaJi0hfUJFfGg+bCFvd1gqUiZvY3EoMD5zCisjVXpyPWktYk43aj0xdkUyYE1abi1oWDJ0fnBtVCl0SkgkWGByYV5eentIJFIqZDEjI1ZHPj4rND1gYiQtRkhsUFoxUVktTzAwO297bEA+Cis/OClEMGolMDAwMD0wMDAwdzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkt9VUZZaGg8KWIxCit6P0NYPk10QlV0Y2I4Y31wd0cmc0IoelBiKTFjRWxRMSNTSUVwUSRTKjJVTks3aXUmblljUWpmZTJMeFk5dUNea0NBKCNYMGYwaTZ6TXlACitmckVXQzMlVXRzYSN3RFApaD5ANmFXQUsybXRleTdEcTxHcmYyWDkwMDhHQTAwMkchMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvCitWUGs3eVhKdkNRYiNpUU1YPHs9a2FBOUw+VlB8RD9GSz0+V1dwWlU/VXUwPXhiU2BqdHdPVmEmK2MqO2JvP2smVUN+UGtqQytYZGAqeDxhCitsLUVFMnNjREVfb1VVM0hfRmxkUmtkNnE7aURjU1djX1BeaUVrZCZ5bXZ7flR0QSg2PThhTmhYTDQzJV5DQmFpb20oamArSGNDUW5tTWU8Cit0NDwjZmo0bHBEaiE5V1ItI2E+Rz40LWtyKUZ7Q1AzfFlYclooI2F9UCsqREo+SmdjWWFhRyhTNk0/X2l4VWp1PDg8eih0c25uTSMmfEN9CitrY2k0WkNzfVhGTj98N3J8MGFSOF43UzEyWHphNig9cFh5T089UXk4NGQyPWNpMTs+VkpyYGw9KVdaaC1yfXVaYlpWVzk3SEVKenV0WGh6CitzT2tSTWooJH1TciN7IW0kNkYzb1g0ZCt6I2hQVjk7QHQ5aSZ6JUlUej5vTjw7KEI+YShQemopNkUlIXBOJj0tRnc9c0F0UW5iU0U2U0JqCitMfCFzKCpzNlh6NlE1JklsPGJiRVpuYWlBVjNBWj1jM09RTXF0NU90eksjYEcjO3k4VW9YalVGanVIRkIoQE1ES3lIYUhJSTRWV356Qm9ICitPdiVVPWRvNH5KYHJKM00+UjV7bHQ9V2RhU1klUjBfTTtXMVVqd3hJX0FeTE9uTGs9QExwfjBVQ0xyeUg/ZzwqUlRsOWhAYk5XezQje3M+CitPI1AjMFBxS3hAeis0RktjV1k4QW10RHN1WX10R3dpfUlsZmBRMDlEOGkxY1hfTDBoUzJ9dklLJWkzb0dJVUtmPCNveyF3bCg/bEY5Y3hSCitlPn14bHgqOEU/a08lVnxYVWVDcGZSZ3dvMTdzWH57QVlePVQ8bzNaMyhtOElmLTBzfTw8cTVURHhTTk0qaTlRIT5zSFJqdHojamVzcHVYCis8Qk48UXBhfU45dk9xRSl1a2IwaCNhSW8lNW56YDRUTyUmTWF0a0hXYmhvYT4mfiVVOU4+X0VFZSVVeDRCYXM7Y2hXRWVRSV5VTENgcCMhCis9fmpXYWNHPTljeVhFblkjOT5IWER1Xk85Nn1QZWhiYiNsIUFQfFBTeE02Smg/KX5ramhgcWkyKlQ7emNlRWFWUVhTX3NnemBOa09hPCFWCitHPV8yK0cqSU5VQnpTJG9XPDA2dXhheCVGQ0k+fVN7VXFsVi1VS2NedSV5WSYqJFpnS2MzUzF+bipOWmkpQSNYLShVNnRzZkJrK1k3Kmo4Cit2Rjh4NlVfR1hNd3lMeTFVZ0s1RyY0JTIyZE8tOH55OTBNfjAtWUx4Nk8pVDRmdVdUK2A+SlkoT3A+cWM3PWxTXlIhQGwqJnB6fClFTlQhCis8TEcxWk9mK1ZDZF5jKDE+azglSUM/MUojVG88WUpONENfI1lSaVRCKSlnY2NBZUBTIXhOXjVDTHVzRU1wN2l7d3lFWig5ZH1qYVhHK2tUCitRXnZfeW1gUklfIXUkIWA+bzJ3IV9iQyFvKSt4KUtoOFNpSGFrcSlLQC1ON0BwJDZHM3BeWklLI0l1IW8/d0E1Xk1GMUtKKFl3clF5SDwtCitqUXdxfl9AMWRgRElYVDYjLS09JWdIMTxwNzs8ckJ4UC0rM18+fGdjaHxiTSVDKmNUZjZeQG5ec1NzT3Vhd3pyREtAV0sxdjlpY2xfUiFOCitvNDF9OUNNcTtyNTMyYEAyXz4lTW0/M2EyVCN2VipqWXklWGJhYys3WjArU0VMM0kwRj1AZSMxUmRneDZwdU9GSihoN0d1SjNBPld0azw5Cit4WSQ3JnYtVFk2cT1JVHVpPz9fNjUkWDFySHghayQrZjdUJT5XZl5JIU1naWR7cF8oKSNPO2gyQ29AUkB2RFZRbXZjREZGT05JITZWYm1MCit9aV5iMiVuMGJwVVV6UHU2amlrPSFDbTVCTzM1IWlpV0lnR21hd25rc2cwYyU7bXtaOFdEJFZ+cXY/a24wTSM5VX1YZmlfZ35YRSQ3UyZSCitaTkgxUyYhQ2grWE9nYjliTUQ2MDNNUX5iNWhSJVpxNkFXLT0tPj1ITVZ+dzQmekV8QTckNH57RDhxelZKRzJHNU9AUGNKR3hJJnF6VGIxCitVJG1wd0Z7TFNCOGZjKzBUfCNqPXJiI2dHd0RCVzxOfjVkKWhlbFV7TWxzYU5kUG8mSkY9SDNzNkNndWNlTlZBVVdmQklNdXs5fT5IZF4mCitFJSpGKyZoWmglTj13VndCUEd7YH1SeFg8P0FVOFkoanM4U0JAbWZBNWAlKDI9aTtCPF4qc3c3eTlIUVZEQkYtJjdZSmpkKkYkMmMpYlkkCit1Mjl1UkpaRWV3PHxJVVJRR3RqP3daeyZpc2Q5bFk1cCNWIT1zT3xmNkAtclZ+I1dNaT0hPm1kKlZNJWtPej8xcmI8OGpUZXc3O09YRGZvCitjPXpMUkBMbVBEQ09yJUZ8QF9INCpRYFlqWT51OTchJTdVbVZ0cSZObXNUQTFOS0FzdmBnbEYpcW1VeigkQ0JVWGJnNCNFeE5SWXJVMUdDCis4JmpFO3VAU35KUjYtblRGPT1HenB6MXhBVT09K1R4Mnp8PFF0ZmEzKDdTYz1yN2VWPzRsQXk/b1VLUCNZeWd9NTh2dVFKakdPTlV0QmM3CitrNnEzWHNMKGg/eTYrTEZBQSg/MiQpcWJJbDV8ZyUxQzBVSjkhXjUkYzVIPEc1fURYUzFXXmpqP0xhRGtNKl9OYD9kKEtyeDg0Q0EtUHV5CitzYF9DUjFLI3k2b28rQn0hRDhUXl5qVGxvMGNrJUl2Y2AzX3clcDJoSCRiUWJHV0JVelRvWVdoeEZtMS1OcnMkfnNuQzxRNHMyRDkqU2trCitBOGdpITNuM0pmJlpZSUdzcDUjMXVlbj1wZ15sT3trOGNNfUJYXnBiPk1MdVM3dnhQS0ZYQFpBT212NGdaMUIreSV5SmRkJHdmc1d4T2toCitvVW5fNkRvZ0p6fmklK094JUpONm9vRWdaNmxMY3tROUktM1leYiR7SlFXPUskMH14Zjlje0M1R1VOaiZ1IyktYSMhNXRxTTNVPF8yYDV5Cis5YTM7NUsoRC0ofT9DY3o0N05TPG9HcSteQH1mYipVb2hfUmBSez0lQmFWRjBxTlhHTl5VOGV2ey1iMUNlNXxNXm0pUnpAKndnVkhzc1M8Citqd3RCS3A7KSkrNj0kOS05QTAjV0h2bnZVPCMla2h6JGdYLTtSYSElSlpIWkc4QHpWZ1lVbjBsUmVFQWEwYnxmKjcqaiN8MjdPX2h3Vz48Cis/T3JlalMpdk1faHhDWFVUJWhaY1MqVmNYbyRyMHA5U1NGMis/SX1eJnslekpUQl5eYypRTk0wJTBEV09lK1ViIUA0VHBlM2FwKDckVjNiCitlM3UjLU91UHY1WHhOO3U5QW4hWnZNbzJKS0VBT19YdnA7emQoeHpNen5GQGFJe2ZWVD8qRlhQdkFER2I0ZFBedSpxP3Y0Vmw2RUZfZThYCiteU0MxQWstWlMhUGBDJC1pcC1BQSNRclRCVUhTSHkwYVRyUkJufTg3aGdWYCg+MG81T3k5U1VqdiYkI0NSY0BrYXVpeE9zTmJaS1VOeVR4CitLTWU1KHZpMEY1ZFgtYndyfD5+RG81blFfb2lVcCpwbX1rbW1JXj1tSSgxUUNnVVk/a2lJKnxTUXlhT1JsZTsydT85KjxXfUk/JWVZbGt+CitBWUhycVFWPFJLWG12aFIxdipCSnI7STR3KnBTMDhpKi1fUXUlUGk2akJmPURMPHpKcSZ7IXpzWWtfKH1oVGkpZHIhWFR3WmJPb3taPktRCitBeSo2SmA1fVdpdypZYCNDJjN6Nzd7UWsjNE9KQ0Apb2k5Mzw2RVNxZURfZ0QwI01VY09ARFpudGtUbyZyKzFoemY7bUxkK2Jre0JWclJSCitqSVV5cGEtcXVwRCQmMnhZYiUyNighMm5BTHZjKj1QdVI7eT8+Qz48PCZ0ey0xJEJoO1omISh9NU9sY3BVfUBoRlZ3KiFFc2gjYlYkQj1ECittdiZ7RlZweTEqRlY0LU5ocWo3QmIjTEdxbnVAal9TZSVUUH5ZWUAxYjI3MjNaT2MpUVpZNWdpYEo1KHNgX2tRe2Rvd0ZfRS1Cb3B6d1A9Cis0YTgpVVFASXByS1Q4K2pFPSEwSG5vS3Bna0hVe2Npelg9MWxLe1ImKExpVT19R2xBR2RxckA4UFFfSkhfJShPSHd3RnF6dGZtNEtJPmh2Cis4bTFmQHIlKmNqWVNOeys5XyZtZV9waiZta2BHSXV2JCpxQzkweHVLKl8mYGBnc0FITlA7PGZ6O3U7cTVUTHFPSmV4X3RvZHNwalZnRmU9CitnMVM4TyY7SF9GfXg8TyExeEwyaFU9ZmohWjw1ZHt6OzxwOzdDQHVBSnI2WHhSTUp5S2gzRzY0ODY8a1kkP1lhVSpaU2kmZzhncXZJQngqCisjQzc0NHpmLSg0YGFTSnZPakdGfXZQLXxaUlRyIUwyMEpTK0FxeVdtakYxfHU3NU5ENyQ2MHcxbH5fVEQ+eTUtYyFuYXBuZWtYMChfN0pwCisrYzsmQmRzNzlUeUxzXj4keXBFfUBVa0loNHxzdkRhfCp8M3whUFU2Q0I1STFWLVQmK3NuOCYtb0s0JThPSiZ2MkpUQ19vPmB8VXFWe0VtCis0UT1lemItJVA+ZnJ4UHBtJiE3VzVkbjltbSQxVSFIPXo5KnhpISVfSFhfPFZNdjAoRjVlM2YrX0Y1dTNiZCp4TSpWKmdQS3k1bFApaD5ACis2YVdBSzJtdGV5N0R2LXE5PGZ7dzAwMyspMDAxPXIwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRYiNpUU1YPHs9CitrYUE5TD5WUHxEP0ZMUDtsRV52OVI4ZiRPa3hiZUd4MSpAUV9lNVo5YyQ+OW5kSGJ0R3AqfD9ZM3NxTVlwP1I2cDBHSHI3c2k+XnE9QGZICisyPW9mJVMzJVRCdGo1a3deQ0pzZ2dQcSYoMDJVfVArZjZxP09kJUM7JUFsTGQ+Xk9mYStMaE5ZV0NHbktIMW9tcy07alBZY34mT09nLXdOCis5P29kWTgoQChsOUAydiRNQ1Nae05WYlErNnFtdVk0dGVORW5mN2w+cUw4TkxOeTgyfFQxYE9PY0F7anhBRTI3JT5hakpRYWVlSWc2RyZVCis1SjFnMSMpKDVQMUg8SDRWTVkoI1grPDY0bHI5TVcoajw+bnd1PzgxIT17I1IqfmV1a2orJUlTJjc3T2c5N0k9MksjKW82d0RodDNhP0Y0CitXYGY1fENkZnsoNDkyeitqTk8zb0xZcWBaJFJxJSlEQmpGYWl3cXBnbTJASklvTHIlU1l3S2pBITNiMH1VQEo5fmI5QFQyWWB2TXJRWkVCCitHbGdOOXpGKSpsY0ZjSnc7ZmhCKjBuYjBEUmtwcz8qSE1oYEBrV2wrSUlATEhncD03cFFzdWlvKTAkIVNMKGdiNypxTTBmMVRGXlFIbk97CitYQGEwdjB8RHZzNkcmVjRlSVhxNWc1PTR9RW5LMj1ZRyUoMWhiQzxFR0JDMiR0aiNvUmlPVVVFPT5EeEF8bUdESEltd041Z1ZRWiFse24xCisyWn51dlJIYSMyNkBSLSQ0eS1kdSUrc25TQVZ5ZGFPVFk1Mk44UHtwO1F9XlNXY2BkamIye3BXRl5WT2MtRXt4YFdBUUhvUmZvIURzZSFlCit7ZGJKLWx2Q0FaIy10aFFSfTNDfDhVcHUhQy0lSWJAJD1BS1h9aEJmcDlSS3UpRj8hZSojPTVMeHZJXnVZUFpnLTBwaiR0NlMpSEZaKn0+CiskPilJR15kfCNnK0ImJXpqIyFzSGJWcmxeKXJZKDhoJl9CNUpxKlZeUH5hTik0KkcrZTVzMnlDX1hkKj1oPW5vTWB2cDJ8ZUF+VWRCVSMtCitLcCNSOGZjcnw/WkpuRnh7b3ZfPkMtRXxLfUZNRlV7X3d1Z0NORVg8MmI9VTNSMmtnM2ctK2huempvMSpfajBueD9fd2x4ZUx0eWEkTkxjCityMyhqTn1jbEI/bGhHSjxYWmhLP3BWP1peSk83cUlUQUtTclAyakUyQTtUPyFPeyhqVEI9Z0YoLS1MNFVLI3Y7WXFGS2E2e1lIckt1RzlXCitXY0MoUGQ8cVFATyRrWDlAeWA4PGwyI3owK0NLP0FBaUpUNEJnSHUtNEtyV0VhZmElUFp7TilEOFYqUDVHJiMoIzQtV0FiU0VoMWVCI2E/CitWTlNxZFdAYTBrJDkzNnIkM3hWZkJJb0E9NFRMX0VlSjk7TmpESSFiR0MpSmhFKVM7an1sSWlgT1o3N2h0S0UwNHolb0s+fTRgbnpyT3YjCitFLXUoUG1eRWpCQD43ZSE0O09jYDIrMG00R0hGMkw1KSQ0KnEmV2NrNzcpZGR6dyUqeCtIb1ZFNEdtaV5HJllxOVBqfWhxYlo1fDQyKU9UCitsOHUkTytiNlQkV3Z6RVYhbVdaYHopTjBETHV0VXd0YEtUUj5Sa0NPfD07KUpAY0IocDgyJTEyJXl7R2ppa0AhQW8mPlpjdGc2RXwwSV8zCitzbUwjcXhYaFNYQHh2JWRHMEtYST5aXn5jYHtgPlVOMTkmaDxoR3N2fT9vdTJffnFkUGZQO1ImJDhfZk9mb2NrS01NJkVCdzZ0Nnx8MyVkCit+SSkwR1VpZDhrQCFmdipNQ04obko1THhsYi0menFgbyM1NCV1ZkdjQGYmQnpjRUBAKWFmNGxFKE8oaTglfHlTVV5ibmtsV2BxRiNifHVBCitXPGA/WTdSRSh1OElweHs3LShub2V6clZOVVJNVExSOEtuaVRCYn1yQiN2PmFMXmxZUC1YQiU3d3g7cl43YD9JU01tRHN5dkVEPUEhZVVvCisjZ1JZd1khPD8rK01qUWREOFFHdF45cXl+LUM2eERqeF87OE96ZF5BMHpwKDk9IUQzSCk7Y15oPH5FYXJAYyFNeiFjWHswNnh7blolVUQ/Cis4SmRmKWdVcHt0fUBpYDxKOGkwODx6fWUoTiE7RT1vYEw7XmFNKz1XUT13QWB8MUB5Nno1I0k2TmNHcDVqWCVRbD1BfnZBSEYpbGEpUiNGCisjI0lNfjU0RmNCWVJ4YGltbmZHO2VfYiVfIzZtYCFZT3RzI3BMeCs7RFdlIUlqUHtBKTwxcHBYK2QhZ2d0ZU96PlJ+ZTtrKEArYm0rSllNCitfMiQoQlYlPyZVQnROc1ZkK0xEQjZuRTBUV01oJSheNnxVREFgaFhRayNZeU5BTUtjNWkyfWFOaTRsMTJARF9Remx9MkY7R2R4alQ/QzVfCiskOClSbTNBbFJRZE8jKSZgVj4kOFUyOUZfZzY2ai02V05WJHorSE5nbyo4dTx5QXJpR2ZJWUxRJi1DIyZUK01IJiR6VSF1SXc2RGJOLWohCitNN0hFbityU1o9TyFCV0MmJTRkOyZJTno3JDVIWjh1WlBhTiQzMmYmUDI1cmMhfFZZbXYtdlBtclV6ailEQUdMTjRWME92ZUtSdUY0KUBoCit6KU1XTGAySVV4c3lqc2B5I2I5LSpfMk97Mld8JUlsN2NNKWtPM1JoUlZxai1ebF9JUWYjN2dfTjdfcDArcyp5YjlXNHVFdCEpWFR4K2wmCis8d0ZgSX1yP1Bwc2RqZ2N1N3Q2MWR4WVVgQCU7XzsjfVJaYWFOPl5gYTtzcWxZMyhoZUh3Vk1odXQ3czd8OVE3WUVoblFtWlFDZSlTJWolCit5dkBDNm8yV0FYKnFZYFleMEJPWmhnO0BvZUomdy1zTD5TSVomYjt7YzBQcHF0JilIWWYmRFBkWDlXVko1UnApST8xYzBCTHJCdk9GOExuCitLP2w1b2JxSlJCJiUkQWZuKnk4Yz5OfHtAU2o3IzJlMnIzeFZLeWR4dldsRVVXTi0+XnxAVEVkOCUhb1R2N2tRX0x+Vns0PSl4SndhXlQpCistR3NMXlcqdFVLSnhjTUZyeHFQTXY3Qk5EIUpQdjkwdGFuWCEpQT9HQTBTPURBKFZZfEVNK05IRzQqJGxUaz9Aa2omaEptO2hFZFh7b087Cit9Qmw3aU9IKEJMbDJAKjFtRTAkWUc2WGhsQnNCUn5kaHB8WVh0Z1FWSjstUEp+aU8xRlpld0FRdjszVz1ZU1ltTmFZU1krRGU0KzsjSj0hCislfllPWmFvaVF1MGJ1XzJ0bFFLSmJaNzM8VkY2UHR9VlQxQWgtPXQ2aHVqfUkkcTkmemhSeEQoZXJmKT5zc2p9QChnPiU4Uyk5UzF1YGpeCit+TDVpeVA/ZXZuazttVitIaz5pVUFZJSVWZXFSUGgzQV5TSFV+VmtmeW9OJlFBTmplaWdpOTQyXnN5eDd0VFdqLSR0QEFUIWI3cDAtbWA+CisxSTVOIUp+N1AlcSRQciRtYzFVeWBWdj8ockJyYVRsNDFlM1AtTjhrLWNpQ3Eqc2FaeFFOdlg0QChRKlVlUVNBP1BEVEpsdDtiKVNQZUd3CitfJjxmKVRxUTI3WnR8OTZwYmxpVGpDM1dtPF9qQFpFKU1RKHw1OD1ycUood2F0YV9aOSQ3LVk9X1Q3dC15R2RoNkZren51JGBvJmFUR3R8CitWJUEteFp3bFo8PSVnezllPnFgc29OXkk+NkpGan14PSNKVzQ8eXh2djFFTypKWWdAJFBhZm1JUWsmRGdfPyVlcjc3JFI7TXZoU0pLQXE0CitMVzdTRS1FKlIjV0ljanwjQkRtZGNmenZeaVVQaGg3bVIoT3UwPCtFaiVwSis1e2l6clQ4ViZgT30wKCh8V147bCZANUchViRzI1N4YSU0Cit0QDFDUXktRFl6Vz1DUiRnN3o0en42ViM/WUJvU19tbVZnNTlNJWZ5b2RZIT1KXmo7ZnlUaFFqM319LSVHJC1uYGxYVjFOUXNXVzR+dSliCis8anFDbD1ySyFNOWViOGBWPGVITHV4X2NSKVhRfiNsbzxLRmJnRDF4XnA4U3dzSnkoZiFwfmVIcm0zb1VjbXMlJX0yMiNJNmwyJV89KDNHCiszTXxqSU4rNnNrZj42VU5vZkI3MGt0PUY4U3BwenpIWDQkNTRwfndlWGZoPmhIPTB4UTR3I2ZXdnMkZUBRdXlxTkN5XmpqeW1fRiNec3tOCitYeiE8PjFtTGtKMHM0OWdvJkhtd3dHI3pCKXdfRXJDcmdmQFhxIyRFRnclYTZBd01rfVNjQjwqU2ZxZS1NVjEzanR3NzJgJFYmZmgwSU9iCitFeFRtYWJUIWpxa2tAZFpjX0pEOXY0YVI7Myo3ckZ6Y0EleCp4biltPkdtOHZqb21tPWh3UDNYOTJ2TzMheGR9ZEpYVHJgdEl6SEstKGNaCiteQlQ+e0pQSHZtPHNWIW5wKnpse0gpVyQjYXRsckZSY3h0QHB5JTNzTUpWYz1NfHVGdFc+blUxbkwxMCN1a0FrVCkoQ1JqfGV4YkMrSXBpCitVQkJLeD9lMX1jQTNnOHZjbllDTn5GakhXUSh0bkNTUTs+biRucylPcVVeTFotSCFXYG09S1djVldpejFxTng7OS1gQmxDY24rPmpYRjx2CitgQ0IxaE08NmFjQHxndWlHSEJ5PE09c1dgYHF2Nn04UkpfLVRoZ2o8Ti1EM0Y/U3R9eCl1N0dSVCZDWnEyZyRUKj9CJFdFdWxMdVFoUnJjCitmd0N9K1NSd2kjd3k+P0VwWChYVGxjTVZzJC04fXVtLWQoV01wREhVN0R6UClYY0p5V1FsQjZxMS08THRWYExacClOfEBxbUkodWV3dUkrCis2THg4Rzd3amFTX0wqZT8rMTdXVkE+OztgNmhRSTE9P2JhMGBBQTNkVyZRVXdhUVEjXj1+MytEKVQlYDZyNXZTVDg9ekVZajZOMSNoMiZtCitnVy1PTX1mYmFOT1ZTUFNuPn1pclJLNGJpfiZwUT9SZnRUQmM+NEU5I1hyRkVxXnQzcnE1Ukh3YGRrNXRZUmh0fSFMNjlLSW5xP21qRTxZCitTPWtOdlhkJVR0QkQ5TjtJaCFvZldRd3kjM1M9YUR5WV8/c359biUwVztKMzxwQnNKODAyKTVAPD5kMV5heVYjMiUxRGVNeEhobVo8WVlCCitqU0N2ek9pUVFBMSk5QG00SVZORjZlbjF8YV5rfF5TXiR2a0tGKHBsN098UlljUHxwRk5ZfjgqY2xIMXMzUVlUdjZAQ3soQzlodEMhZyk0Cit1OXcyVmIybFZzUVVJKmZXI1hDVWlgP2NGdk9NaFhKSk0kM3hKa31LKTVRQjt5ejZLeUAhMmBOPTdVJiFUN25PRT1sJnhiKT5Yb1c8NSY3CitUJWVDRXl9NnpmVkNpRnZkaz95SkpkJlV5dmhEbHRQSUhWcGpsYyk5Pi0tK2xNRSNhNENSQEtkTm5Zfk5fSmdLQn4oX1YxJTxZU3Yoejw8CitNRUhINjhja3NUZlhgSFp3P2hsP3lMR1oqLURQNl92YjsteyVRYCN0cENLVUEpRERXZyllc0duTDM5MSpJPU04YV9CYzYjRXMxV20lMXtiCisqQ2dQMldAJFI2X2EjeiN0bm8qRzMjMj9FciRePm9hVWx6Rzl0UV95bCokYU9MaFFpa2ZxQjg4KjJMQ1hGTEBnM2RFWGdoJFVGdl5iSDF1CiszZj4mS3tVMigmK0d2OXh2IVNaXjxyO1YyKFJpaUxCJDhScGF6ViNjZHpLXk9EPWkxcXxGYEFEQHxCak9ybXdJWmdqbG5pNV57OzFPa25aCitKOFA8VlltQ2hLRCg4bkcwKiY7MF96Zz1hRXh8Zlp0PHYmeT5UfkdxdWxmTGd2eiZZbTMqRWxyJE87Zj1pJVplVVc2NEZJMWxoUXt9elcwCit5QnQxZEsze0FDUjA5c0ImSVYyUHw2SVJTQDsja0w9QWNEV0smTHh9RjwrYVB4ZTZ4anxZTEkmQWZoeS1SOE4tXkBkLXBeOTlBJkBEfWZICitHQ1Qqa1J5T048SzZNWUMhN0ZPQlI+QDE2enlSeFB2T3Zac31jVyZOZU1uOGJGRTJZMldFJSVqVT83JTEydjNhUnJrTT9gVGQ/d0BwUUE3Cit8SDREd0wxY1FaeT5nSz1MM3UxTjd8cXJ1eiZyIy1URHR1TzlLUUgwMDAwODBQfmQ9TS1aQFI8PXBAUDBMJWRaMDhJYkAwQn50PUZKRT9MCitaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZyVlBrN3lYSnZDUWI4fkU4WkREantYa1RiPWI5OFFEWkRsV0NVdWtZCis+YllFWENhQ3djNiFBaXQxNVFndTRpWFprKyNuT1lgMVRWQFN5cl4jd3ZkUHAybFQxaF95WX10dnJZY2tySHBqYCNfa0VKKmB2JUx+O2NiCis/WUJrdWEhbj5yYVgyVFlUUDN5SEpmaUwkdUM4NztLV25SQURyI2YpbT9OdW16YSg1SW0hYyZfVnBXa3QpNldBIXwwXkhHNjNLdHtxKXE3CitrPjR0NTc0JiRzdz5Vb18/P0QqV3ZxYz5YJDBEbTB1aXJydWBTWF9QdiZqQlNwKVpFRFdjNFRoWGdVPHRiMVVVOSZHV0gjQHdyQVFELSE5CitTJWljKl8xUUwjZG4tV0VqU1RVPUEqT0pIJWUqbW1CSXRBK1EwQyZMJVlTZCpVY0FETzlLUUgwMDAwODBQfmQ9TjNHUEg4dzNVYjBLeUljCiswOHtffjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZyVlBrN3lYSnZDUWI4fkU4WkREantYa1RiCis9Yjk4UURaRGxXQ1g+RCs5V28+MHtiWVhPOVoqREdkZDk3RmRaeGNybHtvUX1YJFdpMXc8Nkg9N0RZY1lKUUdnYlNDSl9kVDNlO05QP1pzCitRcHlRa2ZDalFpTDMmRi1Dampzc0x9Z0c4TURuMiRHYS1qNGhJe19EQTxoNEFAJkl5Y1UxdjUta2g8eD1OZjhCTGAlMyVYd1dJWDw2ZV8lCit8WnlvWVk+NGlkSil9WTNZPXtwfj5XQio2O1V3eSN1OzVVWEpQWVRzYk9MQj8tVG14eyNKVUpZNyRvUT5BakxvaDBHSFFmPjxWWnl7YXUjCislcCEoMnhIQ3ttNn5ObEgyMXo5QTBIUGNjVWohZGpKLUtOSiNOZnBiSEF2MUorLUtmXjwtdFFIPVcpfT55WDhDTkBwfVUmQSFWWFd7KEVGCitVUzB8Mz10NWVyTnxnJlFwSUt7Y0A+VyNLXyVSKiM7RWAkXj4tQm50RU5OUDMkSms1KlI3cyZuKVdTNmFlNG5RKVJUYTZnZyohV0daVWNeCitBYDdweUheNCE+aEtZMnMxbz9wPThsU2tpPSRqT05FVn15M3YzJThteXkpbClgbD1ObERsNTt6QFd6Tj9RbnA7UWxSXnpHKCpnS145eyR1Cit6e204NlpRTGRTVWMkNGJBbm54MmN3JD57SFp1N1FePEJLOHMzKDw4VW1VVkkpbUNue09gMStwRXsoOGA1U3BfKnFmb1ZtSkVLQ3kjcmtUCit3Qz41V3ppTHRyNl5vUXx9K2ZEN3pOcCM+eDAmakJTR3t3JVk0aVprRjA3Z0pFTTlOcDZxKnZ8RWE4LVVzeDt4dXY5b2xPS00zQF5EUHopCit+SkZDc1g9MiRyYkgjfEVxRnc7SDNCTGxyeHlrKytGSX4pcH4rfnVAa2NkK0YwSHMocGRVY2RiODxfMkU3eHBLSXhsOUdhJnVYOU93PE5zCitVNldYdCpmSXBSUis2c151QmFuN0ghSVhhZEZJSXNFei1HY3JFb15XRCFPSEU1TngoQnQ1RTJ0SndrOHgxNGxxOXpAeWg0eXAqUFZkeEBUCisyUEtYJmpyYW5EQHp1SlE2WTEkSVMpZV5CU1lpP0YjSylIYV4pdj8oYz85JVJARG0zZl5JVnotU3ApK1Nebj5LM0tUNW4oSTY4eVFHREs4Citndmt+SnE7IVNZSDBNVmtDX18yJVZNeTFhVCMhc0FkS2ZEQW9MZkAmKlN4KXxWc0M5RzVeQVRVX1hSWCo+dlJxaGx4cDk/RTtrNWZwd3dnCitCMHxPZUpRckI3PjdRbDdqQ3JLYVQ+eCEqPHB9djg2cEVYZ0tJbkA7OD1HdGclOWg0VXczRiR+IyQ9QmohUGZKLUYzcWRDcTd9aDRCP3N4CitNT089IXAjfj5LXz0+Mj5MTUF1fDBEYk9wbEtMY2IpdzJaUT8lU2xgRlMkPHRkRVdjREgqJTEkXkxkWGZwMz1SSDB6eEhQaTUtWiFLLThDCittK0F5NDx6Z21fMD1HR0FSMkt6MEtXYnskd2V6TjNFY3U5bkwjc21AaWMwOzM+eEUlcTNKcX5UdFg1e3k8KVc1SjN1b0Z3PnxfX0dFMmhjCit7Pj19aH1aJVYyK3JObGREQXZ0KGx2enZAb3RKVXpJZGQkJEttQj1OT19RUC1oMlY4NTI8RUQ+OVEzU0F9JmEkcXhXTnskYWpmVGs0ancqCit6RXJIUnRVP1hna2xAaSY2djMkMF9FZk5Fb3BJfHBMYCQ5RnpwU3M4ckQySEJyUj40ZEdNYXBgeDJqPjlqMHpQeCglP0JhYSNFYlZtXjB8CismR0NAVjNsTW58SnhuPGljdlVlVk1scEBtcHpDeCNuKjVHfmAxPU58MEcwZEg1KGVUTnZWakJzIz4+WSNyYEdxJGVpLUJ6PC14SkBuNz08CitzP2x2TVB6Nyl0LX5RKzBkOSYlUGZuZnkpTUM+aUZffnE+UlJgWHNzYVdsYjV6VXNLVVItbUxFWURTT284PVB8Z1JGZ3d0P01BN2RzcGgyCitfdSZ5Smg9KD96c3dMMipEfihvIUEle3xQcHpUPUshUGM9aW8+OCkkTnVtKlAmYkZpOTtoRVd2Tmw4RUk1JlViQGVNJFBVZGQ8dyM4QSUqCitFP0pTJlJKZCoqMDshakEmZEYzeTA1RkFMRjdVSFp3JEBQZUMqJkRNRVNHU1FNSm5STmQjaVB8eCluQGF+eEU3NDtAdUs/XiFQckBEcWk9CithMGpIRiQzKzdzaEREJVdKaU1LUVdzTCFLbGtSSyQ3TjJsLU5ySX5BN2AmWVJHVGNISj87PkZ5eDIqPClPPSl4TysyQ2BSfnBiR3J3fTwhCituRncxQTYhRi1Uc3V5SmRWcj5QWiRQKG9HVk5oYVJBdGZZLT8oPCM5MGg0T1ZCYWYrd1lWdiZKbSZWYHl1Xz9OYDlySD9hJFhNVFM9WD9DCitzS0AqQ3dDaVFaX2V0cztuMU9fe19mT084MHF3JmRCO2hyRmc0KUdJZHI9UjQ9TEd4cDxvQDQ2MWZteyFoX2dvNkxneFVJfWRwYFNiK0x9CitNdGYrIzVAWUtYYk5zIX0tan0/Q19KR3xRajhpO3daYUtnKmF3bllLQ2N4SzhTeiY1aiRzblFsUVZFXjs4JkZGRjFRWS1PMDA7b3tsQD4/Cis1c3F9O2MwUlJCejBSUjl0MDAwMVJYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GTGlXalklZ0Q1WD5NCit0QlV0Y2I4Y355fT9QUSkrX01mWTxHT0tjY3ZHPFFIcTJxZVVVIWE3UCpjTig+Z2dZOTtoK21xMD0oQ3FCQHtyIz1uITRvbW0qN2FBKmplCit3JnVUSl5PYnl4dlhfblAlVDBfJVJaemZPYn00NV5PKlRZSj82TSZ4ZSsyZ3RNYSUoNWFfVDxseDJwSEJHfTVCUXswTl8lKSZFRGpqVylyCitiRjh4JWNoVj5MR1loajg7dSlDSFdRSi10b1olXz1+ZFAxQkwmNThKXmp8dDUwJENqVVk1ZCZBZ2dKOHhGQVJOcEBgQlo4ZkcqdSgtY2hoCis/WXcxOXh6WjV9JGMtIThYb09zayQ+ZG5fczJgQ2ctQThnMEdYXnlvRjdxRllFWUVHWEQmTit6X2dvWShAdndLaHBxaEBQQiMpS19PJWohCiswRkAwT1FrNX5TZyQ/QDw1UCloPkA2YVdBSzJtdGV5N0R4SlpJI2RoPTAwNysjMDAxfXUwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPCis5b1ZQazd5WEp2Q1FiI2lRTVg8ez1rYiMhVExGSm9fUlplP1MxWD5WPldhQ3diWlFFJUhlNVB0V3NJM3kyfDN8OSFjaFhEZmU7QzBSeEVLCitQI08xcUs5I01ONT47ZyhkfShPNnp+JEpDYyR0JDFZfGRrdTRzLXlaaTMkQmdMLUsjKH54NER8WnVUX1cxPHhReWFZbCVPeCl6aCt4dWFECitRRUVYY3o9S1FGeVRLKy1aOzRQT0FCTVAkcEoyKkFmb34qJjhAbX16PCZ0cUtyNDhCe3VofDRLKVdxQiZgOVFMWkZiaFhxQWhSKHdAZ35ACitVLVV0bzJfKmRUN1Uja1VDTU49IUhfYndBZ3lMRTZBJWJAaU9lUGh0TEQqSFBtQkl5fil2N1lPWD9UXjt0SkhnVmlZYWBzNEtHRDROKUxCCismYXA5anx4TkQ4RnVyd19QUTNHWlQwfn5Ad01EKFFDdCFgeG5ZcVhLdEArekJua2kyMXI/Zmt4aGo9WXIyK1B2NjAqR1JGPnskNEpoS0p+Cit+Mj09RmQySDZsRHskOCkmVjJhSk9odVk2IShoTXszSi12eVJ7JD90NCQhVDh2ckNfRWlTMFp3fWAkKF8lbWdNdXhfRT1QRzhVaFlkTilDCitObilsKlJiRGEmaXg3NHowfmI2ajgkPT1OcztyYkgrMH1nRFpNX0g0QndVeSZiYVdPKSpPVV9COHdYa1d4PW9PbDBWKjFFPmVCMEBBPTg9Cis1SUt3X09TPyUqdFhtUHYje1BuV0lONHshS3VLTDRxV0xsQnR5MDAlZ3x4fUtrfDNjX2JhMihJNH16eWt7OFBGK1lEYWYtKnRBS3pGZEZuCitjZkBmQyE9NzxKRlE/IyF2QFQmdTRmNGl+amgoeVomZnlIPmtEO21EbUxZMX1gMCo0aig5fmRnaUg7LWB2ZElrSjsxcUlga3BFNmUhWGtBCitAUVkkP0p7KzVEMz85NllhMVYoaEM0Y3klTDQ2PDVDdTVeLSlRQERoTUBHNFU9JDkld1RVMntWZlU5JjJrMGxHUm5rSikpUENYdEd8UnNGCis2fkh2KWwhTWc+eHZKJXZ2V3A3dzV3VypAV1AhOCk4M1ctNyRNSFpzaVkhRXNCSjNDQTstUn40Yy1qbnJBTlZ4dClQPD5XdnM5R0BhVXVYCitJQ3haSU85fUR6Ukd+S1R4VEpSaDhrXjshS01qKlI4dldBKzckcGZCYSo5enhzMT1KTzZzV1RyS1pERkNNPXhYUU56KWtKWVV5YDZ7Ql8oCis1VEV7OUQ7dXRkQj1me0xxcikmPEY9Xyt3biFrYzVkZztlZyF8c081P3F6TXIhQG1PMzcwVlZfYCRVZURvIy0oVFcjR2VvKnVAZk1VbnA2CitBSFdtSnJkSzloM3QyR2YwajgweURSe2wqKVpBVlZaNHx0P1A5MSokRUVFO0IzYDR1LSp1V2Y2JEBtVmokJkt6QjQxTTJgMz4tTVohcVR1Cit2Pj5VIXxmVSVLISVfTHhIU3UwKWQ2e0dOZ0F2SjZobCV0JTskX3YhYVhkUjc8cGhPbk03RipmLW9zTyMrZHtnKWlifWU9dzl5JHlIdC02CitONVl2OG4+JVkmcGJ0Rj1JJFE1OU0yNk50emkyUnJ1SyhMQShmN159R2chWTQ7cFMyVHVSRjBPR0RxX2xwPTwxQEx5PT40eWwrO0RGQUZHCitHbF5GVlQ2cDNtQWlNczVBU31hZ0MtaSZIPGVAWGZJVCk0LSFSez9Ba2tmZSpFOyQ+VXNIUEc1PnNeRHkkOSRacnxWfUcpNm5yc2dmeTc1CitCbWt6ODJVdzUhO0s9R1pHOSp3bHsqP20mKjcxcmFGdEd1PFBFRWUzdlomTD94OS03O3o8NitXJGYqfjk5PDM2Q09kLWhWa1FGYlVTXk9SCis7ZjFYPTU+QElxRGtidVYxI3lTRUheeTBFMElSViRNMHA+LUpqI09aTTZ0bVUrTWtpWClUO2NRUnswYWE0fktfSTt4aiNWR3clTzBJTW1lCisxKmZNPXJ0U29Zd1NlQmtUQ2RnKlVeMkFYflczdzdaNVBFaj9LSW17d0EhN1ZoPCNnRW9yam4jNTdyWHhKRSteI2FCJSl5Zz1NOSZgNVlaCitMdVh6ZWhFPGw8bjhWJio2WTNQfHwmYylENDRrO1hncGBRR1Q3QkpaTj55MCpLVDlvQDRne1kwWjdPPzAlK008WWs9S3U9c3VydVorTmB+CisqLS0wfFhRUjAwME84Xk9ZN3l0KlJydiN7dktWREZeQG5IMj9xcmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZCis7MCpfR2NSPj9YPjJjWVdwUTw3Yjk2M25kOEppZFB1bm1RZWIyQUI+UHZ7MDFnMFQwTUZNR2JYaE5GVUJ6VzdWKUpibE1NYENCVDB+RXg2CiskOTd1aGdCR1QoRkJJUTwmT1BfRE9UbFolaHtVNXFwbW9FQWc2IXhKUzxWYWV5cnI/bWFZT1BPYSpaO1VeeGs9Uy1sekhlP0U2KUVifXwzCis8YFRYSnc5RHslVEslMjBAV2tuU0ZwNkJWV1A/SC0+T0MkdmZ4cCN4dXFAPCNeY3puU2JoQ3VRaDg8cENLbHdHZjFUWnRtb0EoYHFQSmVZCitwOFd9MnNAUnBsRGUyITZqeFVweUM3bEJ+aXNDd2JZJDM9KyNXbzZZUnMlVGxNNHdAU2oyMyh6NF41VCV1WHomfFpZMSM5V0NYV2YmQTJ2CitTM3pOOCtAZEZKWkJgNS1semtJPEtPVDtPQ3ElJW9YSjx2NT8zQHs1OXY4YSNEJCZjVE5+JjJtfl9ERDxtdzBpYkByTm1NZkxldUNhNjcjCiswTW5ebGNvejI2cmMyXmNtSncrO0VxPDYmUmZCNlA4ay1FdHN2KWhPP3RPVzg+TXM5TFVlTnFBa3RMKW1LSW95KTk3MjVPYkctdzA7UlQ/CitlXmhDaUx9WXpvI2FwLXxPczZIPXl3dm0jSlpufn08U2M0TVJuaEZqe3l9Xis4JTZBVUtCeVY1RyhAOERQK0cydSM3Sz1BQklPK3kja3pGCisxPkF0fm9LXzV1aEROQ3M1S0szMS1Aen5uNj5EY3xOMWpgZnNobWdecnpkbkA0QmhzVSgxZ3tjY0poQ3M3c1hWKFVieUghSWMjaUFqPFllCitiSW4tSFZEb3QrWEA2U25fOEs5fmlMOyZIR05lZ2dockRNSWwzY2Amd356PD03VVZSfUd9a1lUKmU5JlBNfmMoZV5xcWllOGMpd2tAaUd0CitsTWsjbmQoYERVKnRAOUgmQTspN35IJVRgdHBrX2toKEtjKGRnYmZ7QmtneHVHQU0jaHQ9fkteJSMxdX1uXzZeSW4oWiRCUWNkKHgzXkF4CisyZX4qMypkK2JFakFwenVZKyRwdHF3a3o5cz9pRmswYVEmakN+QCo0ZUt+Zz9Vd29RNHR8Y3g8YkRZRXZifi0mMjt1X210S1hfK153QUdvCis7Tjc+dGgyT0h+ZT1sT258QjkzeSpQeVRDQENJfVcrI1RwaDFnY2lCNFo/Y3tQKWg+QDZhV0FLMm10ZXk3RHMzUTtXUUJlMDAxQHUwMDFACitzMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUWIjaVFNWDx7PWtiIyFUTEZMR3NiYUJwc05XaURgZW02NT99ISFRCitzO0BCV0kjeX5LeTsxOUJeKyZ7SFlGP0tRMEJtOTBqUmd0U2hZenByRWt5TzJfLUUqOGkkXkpjZHYxdih5LUtTPCp1XiY4aUhIb0ZTYXNxCisxP0ZLOCstZzVpVFJ+TkM2TkFlSV5TXjhgPkl1QnVFbUhvTlM8WWgtJWpESk8oYEYqVyNCP0pKUCs3OW10I15tZX4yaTtrcFZSM0k/MXRMCitjIyMybCRJTEo+YkFZUFVHT1J2U3M8USolfFc4RCVgZnlOJHVtNE0yaTs5ZiZtcCs1V19nVjk0K08wVyFPfEsqST9KZVNudlFhNUxlfFpiCit4LVU4K3xGOWN+VjxJJCEyQElTflRxOTFBYi1IZHkzPDYlLV9IOXFtSX4lRl93VXpSajtNSDBCVSRjTlo1YDNWVSUwSFg+LUN9MWJGUVhACis+YTd1TlNvdEtvYGNJJjQ0MjJlYF8xUVktTzAwO297bEA+P1ApWX5MYjM7K1BjQ0lBMzQwMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4CitlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkxpV2pZJWcrVWJhSHR2YUN4O19kdkR2dzUmeiR4VnYhJmE+QkB7OF9zfnsySEZYbEBWbDteWk1+Cis1cUx4S2ItfUNHa1JXUlghckNoV3B0Jkd5QzghTiNgenlKMFZhZ2EoOHktSH05ZGQtQ21ZOHRGeFVyJDwlYyZIPUNeM29TZHZueG5vZnpaCitXRlB1R2cod2p1THc+VWR8dHw7NUp8bSZ0K0pgLVdodSlzSiRUMSZaJHc9bG9tKEdEUzw2SmAmYUU1NClCZkhZUVNJUipwPkt0VGk5SnN+CitAcnwlN1JOM3Z4JHFCSF5XYF5OdEJrSCRzRGFzJkAzJShPXjlLeEM7PVQqZ3NwK0smRjI5Q29pOXJmdFpCWHlmNHZSRyVFcnNPRFBiVjUoCisoSmxWMzY5YG17dXlNNF9MUylRfGA2dWNJVXZxQnY3YzEwQikqSVUtP1ErUy1SJnBkQkxIRDtBMFlWfXNZRn16P2EhNzlFTWA0TVAwbH1QCituek5HSnA4XnBhR3B2alY4XzNKIXVGeXZie31tTD5lIU9QTm9uWThRUz15PnE1VE9xNW47LTtDaUFQaU4yWXwxPk08VVRDKiU+dnw3K0peCis7ME15eDw2JHJabSg0aHQzZzdDJEp2M01XeSU7JFd7bFZAOCpscW4ycXF9Xnl5UF4lWGotK00yWHh6OWZnWCs+eXF0N2Q4VCk7O0lQZEFSCit7Mj8hV3RJWmhmUXUmfHt6ZUh5VSZPQ0plezZ1NkRPaz1ZVktAd1JSYEZGMVNnKCQzNTAoT2sjRm9wfkpnPnhaYFRLRH0xVF9hXyttJGpXCis7TlZkNXtUPip8M058SFVvaTZ7Xmx6RT01RSojJkJKZy1gXnJwUUhBb3d6MnolVH1CKmwyZDNXOUdGSTY2VykrYG1aKVcrPFhMTnIoPipXCit3NCkjTT5rVHVWejdKPiEtV0pSLUVpSVR+K0otQypQPWVheVlZezVVbD8+JChYTkpXdGRRWjx1c2RJP19FNm09RH5oPCs0ITAtKmd+NzYzCitNMG10cUd5ZlpNRD51ZEhnfDRFVyRoJUdNbHRnKXFRP2FpVkFtWTBCKVg5LStmKnF5I2ltIUk1SHhoYWZxO21PRjRpUUI+SX5LYn4hfiV+Cit0cy1KaFFaVExlJDZfbj9sXn4hRXIhMkJIYWk9dkxhXnFYUEtlS3opZHJWMX1hWUVRdGspa248KE1kSmo7PUopV3RlMCE1P1ZmJjw8XlhfCisoTi15ailtWHtrej1fZWVae2hmdCF3S0llSEgzPiY/QG5iSmdeLXZqXit2MjByK1E1UUE7U3hCdD1rVUQ7KHcpVExGZklNeThpM3N7Izd+Cit0ZHhacktMQHgwV3xCcVMtcEx3fkZUb25kbVlfMXYxSkpDaDF+anZVYTkycCFSYzA4KWZpIU1ieU83a3JsbkwwcGQoempWamRyVy07a1h4CitseEctaThWMUBiNyEtVz1WQWJKPlNkPU0mKTVudEQkXmRMSExBMHJKOCplTCNWcUs7YT08NDM+O1QlIVdSSmA/TFRYem4tSStBbTc0JXhNCis0dF5OM0pAbTx+R01NZUo/MSVVYntIZDQ8fHlpRkY8MShrPy1aO3ExKn5AdTd7Z2x1dFJVWUY7LU80Tn0xX0NnKUBMZFdLJllgMUtiaStjCiswbzNgUm5oNCRSRld+cG51eEM2WktaNkcxemBCQH5tPjgjdUlePTI5aU9Fa3RTN21zMHxFXlZ9KypBWXhKMEVFMU50V14zb1NhbFRnUkZQCishPzJiWHJvb01EKCFoX3BCUUFwcVI4MUt4VSF7XzYpNi13O0k/MkUhNEFrfWtreVBpUiFUVyF3QF8jP2wyTCQmNiUmQXNkMSM1ekIyPVVaCitCYWw8RERiIVR1YlYmJjxkTnFIMmBUZzVQe0JGS0BiTndwKjtteUB6e2BUdFE7dm9vP01ae28lTmU5QTkzaWtqYUE/SHw1ND57VGwqN1hZCitybDRaYUBUUDJXYUNTJj5odCNiKVNWMXw8R2ItZDxERWxaYSp7ZS1DfTxTJT0pcF9RbClMS0xSVmdnbUNSemU+K2xGMm8tQmImQz1GLTEhCis5VyooblIydjQ2QVJ1RmNTdHopaGFNWEpfbyhsdEg4eDBxUmROYWpyPzFLSk9eXkJzeGJCZlY9NnNEVSNfakI2Z016WW5CPmolcFlMYFJLCisxaHY4R1pqNXpOMEFtJDt6bFghQm5rQzZhc0BnbHB3aCpIY208aGJycnNxeXUxOFl7Tm5RRUtkKWNFVU91MkwxQmsxenBpKylKMzRMdj9wCit2cSlEPWJmQDJ3Z1BKbHNHayVqWm5hfH5Vez19ViNxQWNWc3V+TH0lbm5Fb3RqaDB6bjk/QEwtam9IfG9FUEV4NigrXkhPb2doOCtnbChECisqaEhwalFEUXZnRypGJkclaypDO2F6cXtjWGxhayQlcjlTSW5YMFNSNTh1OyZ1algmKGkjYzloZV5ee3l6eUZBcmk8YEByXlUrVipQIyNaCitGb05VK1pFV1ZmeDYrMm9YRig/TlBLN1RlKmRxNSpCanhoX3dGKEBFa2tDaTNQJkw/QTJjZylhLWJkekUoYnApbEtvfl9mVDgjLXFYVktECitCNmg9KWt9N0MhXi1gdGZ7R0hvI21nU0NwZERTWWBMd0IlSGRRbCY+U0BZJT9YUXw0N1JXNUF+SipuMkwhUlZiUmplKT9Sdn53NHpLMmsxCis9PHFvPXxxZmo3fElwVTluJlY/TFg7cVZqdVU/SCFiS1EzayFSPGZKd0J6KEJJaXJBTUVWakA7N3dDKFg2QWI0JndzP19VYCN4eCs7WW95Cis8M21qO2AtSX5sdEhofkIxaV5zP2gjeFFKZjVlfFRWcFQ4TEVISzE+OENeM0R1c2QjUWNrbV40bV8xOGs3ekImSCY1ZHd1SzgkaHVfb2lWCitqSGYpR1FxT0ckd2MrcFNgT2wjNHtYSEZEOGNeWiolTypKK1I7MGhIPVpBeDtaMTtwNlJZWW4rNk0mWjc4NDU7YnROPS1pVlFfaz9SX2hxCit9NTktU21XTEQ9bW5Tdk5zMlQ1TXBNJkQ3MWlXQHBQUTI9dTYwKjZtODBHdENhKTlOZ2R5RklWN1JoRFA8KEdFaFN1SkV3TSMmVm4yNXIlCisoNUI1TkNQMm5JO004dzw+MiRWXnlaaHJMdi03VmNzSzB9QlhZM05iR1BXZmZYR2hoOUZnQjJzUChkIzUzV2RXfTBhdkY/WnxIISMwTHMtCitwM0h5QSslI1prWXkjZjxDQnJ5VkYhYHFFeEohUDRNV1lFVEVkZU0lSXZfX0l9RXFsPGUmOUBjb0VBVkolVlR5cyYycyZjb0t0SD0+Uz5OCituO1hKKjVZZ1JIRTYySUljWDh+K1NFOTZxNGBUd21STD99M04xI3s1PjBRYURvQkBAdEJCIXteKHwhR0t9QWVqQGBodEk+ekVBJlNFP09QCitQZ3lYMGo0QipFTjk/amZFcUFKYnY0MnxGVm5AWnw1TVVwdno7IURgSjk0ZDxucGk8Q0N+bCFQMGB4TVRuPEV+cSorc1kzIyE4bSNqcH0qCitiUUJuUD1MfV91fT9aQ2h3S0lGJH1QIVdjKE16TG9RcHtwe3A3P2Q7X1FjXyMoVm5MKzwodDh9Pjs7ZjM+UyZoPCZQQnc3ZTBuXk1EdjFDCis3cDVwO09hX208RlFSMU04JmM8bH5WUWZTdlA0QikmanFxJHBlQDwwO189PCMqbXIwM1VtNmYlc0dIVmBMdjBIQD1qSHdHTyFGe31NTDJ9Cit1OzBmS0xxIVM4JFRGTFRpSDRPRGZKbTI7Mk8ldnB6TDw+WX1tfDghJExNWjk/PFE+YVArcj0pS3pULSt6UlQoM3d1QkRGdklPbVJlYjtFCitufjRDPSU4Pl94d2liJjlnK3xzWTxgfXo7MDRWUVowRyt9Xn07c2tKNDYxVlh3JDNNKDFwfl5oe2hCX05haDJyJUhhQ0p6fF5UYV8xKXB4Cis2Mz1ybXVtXlApZFUpRUZZJChgVmYqMFVlcV5YPyZfVmNiKiVWVnImJUhaZExRPXVgeDhnbUxVdWxAPWpxSl9LJD5uc08qNE5UOXxFKHBFCitncTVRSWFgVzBZZVZEPD5KWjwqN1hXa3BobzltRz00K0hAMXZsKH11a1I2REFGbDJfe003fmojRFlmd2g9c1Y7ZFVoS2lnVSlBYkkmRlNFCitQfEd0REJGZypSMnpFeFRjOE5gcGgpRD1UOHVWPUkxaS18azFhQT8oXmx5IUd4V0NTdkVILVV9SksxdCgxQVcjektWPkQ8MHlBPUgzamVaCitAcWY8cFgpc3JabEMyNFlwMk9nQ0RCVHZfJFJMMEhUfFkqeCgqYmY/O2FpPGhsRE1WWEF+Z3MxVyQyOGxvKGg4bjVBYVg4aGpvRnYkeSo5CiszRjN2Kig+S3w2WkFMdVVYPTJ9blZOJGopM2gpMDtpcmRIYl8tekFid0d0VHRxaXJEZDFtRUl0VzFtRHZndEIhYDhLN2smIy0hWTF7RzZGCithRyhicXRicHU+d3YlXmJmI1pTSCQ9az48UjBuJnBxOXgyNWRidjFpaWNmXys2ZUYoO1NKcCVFa2t9aWwyXjR9fENGIUtBeXo5QzU1YT0zCitsaFF8ck5RQztxS2h8a19CIT5WelNCP1krO2RPR0AociRSYm0wM1dCODcpQSF1XmFIU3Y4dmpeSyVuPVUqTE13Z344YTdsUUFVMCVTdjEtCitnTiZTZ1M+P2hwKlhxQW0zeVh4Zj83bXc0QiFkaSt+RXVjaHB+U3trYHhiYTgqb3UxdjFMc0pSa341TSomfmcxc189Sm98KCoqbCM4aTJ1CittRmpnQjFwK05WUzEqWVUoN0VQMHdIWnYjRSFiRmVJazsyUUFUZV5ZYDxjdEMjV289SH5qUWtMLX12NnczcWRHSStxcDVBJkItdWd3WE84CitYRSs/Jkc+TiZ0NkFxWEMqcW51Xy1GemJqPUJjc1NZSEBuYE9+WTs7T2JYU2RBY2AzRkZJTiNCZGBBSmp3cn0kejFlJn5sPyt1cStISjlyCitARXtFY1ghb149R2pYX2IkYEA3S1ZBfiZINWpBPkpqbCF1Skk/d0BAT195M3stZiVvfE45ZCo0bXdKVG0yJjE8SXFkVDExbV9LJjk1MG9iCitFK1Q/aU9QVFRMP2JPclpFSikwUGpkaFRyTXhfN2o2PWpFKlhhMT8mZ3cxQk55SjU1djdGJTliUTUzKE5QaD1oNyQ4aCRaPF8hVTRVbHpyCit5OGVsQDtfWVUxO0deZiE+K2RzJTR6LXN2SmRgOUR4ZzB8WFFSMDAwTzheT1k3eS1SQnYkZigteHdINzVXN0c1YFBvYUF8TmFVdl8wfldOCismZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxIXZyWTswKl9HY1I+P1g+MmNaYjhLSE9hQ3l5SVpFeGVvNSZvYFV2OVc8aiVFfFFFWUxacnNRCis4PTxMWFctNnVFZ3VkK1FBakl0V289RTdEd25pUU98UVNiJitINGlxJHVBN3taYilfJD5yP3E/Q2lgbEZNRz1AVTkqS3V4Qyo2WWE9bDVqCitvVU8jQ1NUMSkxUndWWVp2bjA5fFNGMmJxOU45WWhlISRkPHBYdlhmZkIhP3JrT2hKRzZwQnFRKD9tSmk+R2EocyVoR0pYdGBqQX5BYF5FCitwJnpFVm97PlphTENYYnk/MlE9ZH0kO0dGZlU5ZylwNXVMWX0pN2tYcThuMTc3dFZBY3cxa2M0UjU9Jm1oYDdFcWNja0VncyVhWVcrWXo9CiskVz5FempOI01tKT01R3JSX25QZyYxRm9aQ3chfD0wSGwjMkRNLVY5I2NfJWBGNG5NJVZha3FfOC1he247OXh4SllUKnhtaUAhfG5MPy0zCiskeiQmeGZzWi1BPUluVGRvKSR8SSNzOVYlTTVOWWlGZUFabiVRRFRIYVAod3w3fEJFSD8wN2hWRXMyYH5MMkpHTSElRS1XKil4NUQpMGBeCit7MkRmYFp2Sml4cTA7RmMtJUZ5cnMjQnoqKEVhdiVrMSQ0N0BNWD03N0NAK3kteDg+Q1VvWVVZPWh5eWhqJnZKJUZSay1ZU2NOI2djRypQCiteTmt2dm9eSXVuNEEkd3RXRX1HIyVecHZ1IzlpaClKWT4lem5Ad2RUVz8pZEN3Y1EzI1JtPk1FMi1FZkhDUUpWeiFkI3MkYU94K1VqRUF7Cit8SyZMV14jSFYxRHVqQVZFKWgtY0YhQ0lYMTQwSklGUzNIWFpTPHVOMmRwWCZQI2ZqNEVzfXJucVZ1ZTR8IWF1QThkbFpTdElMLT5EbmRECis1O3pPY1l1Q1lCPHpkdTZKU0lrYnxtYytTISNlYnxVPjJ7fW5vdS1KJUhuVGNANmRSSzJKcjt7PU0teWRqMzheY0hzdUBySkpkTGFFU000CitucXRxfmF0THdIWjl3dkNHTnk8ZF5ZI0d0VWktZTt5eTA1MGMwbkQlNVY2Ni11ei0pbnYrRyM3aUU+M20haFA/TWo5I1l9RmFTcUpSXns+CitERWslcX5lUU11JHZGPi1aNVV9RTlnYXIrNWBzZHtuaHZFe3BERWNyTEx3XkVzMHhfIVFCLT1CPE5nQy1kdWlvX2I/a0AtQFRwT1Bob2dICitaSVdIbSF6PTZweUJid2JaV05kX3MtRTJGKzQmI3NzMk9eRHttYWA/KllJPCVgVTdvcjxvQDFJRkNCYVBzUStxZWRlQjdRYU40Q35fS25iCitRLShadjdQWDdndV9LKiglQGppYDJtZUFsfmpCcnIzMTUoZz83eX5wc0tEfjU3Y0hoXkM9Yi1qUFpBMilTRzkwbkhVQX1fPG93SU0qRmdWCitqSj0lPFBlQGxgVj0wSSRaak4hZE4xI0UqVVUoKj47PGtvRHZBWDVgSDVDKU9KZGBZZz4jQ1duNVlXOU98KmBraXR6ej1PPiZERCZCQHIkCitvRlF6PHw+ezRieW1Mcn1SZylySENrU0chVjgpVUwhdGNBNUA3QD8zdT59cCVXYmtDdUBzNjc0OXoqdTA7NFdUY3MqYl8qI0B2WF4jI0lCCitXQkxsSTdibFNvUCNvMnZAcXFmUChiQV9pdFExa0hqKUJ0VFZgWUdRcFYhbz4/ZzUlQHEyYTFDV2lYdzVUYHVTIXAqYEpteCg8Tng4IzZYCistZmlkTSQ+a25qbEZkR35FTl51Z3J2QD5VNn5ldUB1M2MlPWs8fVN7I19qZmAtKTAoQDghWTlMQzI0THJ4NEZrPyYrYW9XVlBnLXdqbkVGCis7WWp1cTd1THZqMW5rYSZSXlQ7VExMRnhzflN8bl9hQFdaPDhZJlopR21CVzdoJj1TRHEwaUEqc281emc5M2lIKFFLZnZaWl87Q092ZlNVCit0PDBUPHdlalUoaS1NMkhCSDNoMkhwbDh9X2lWXzxXeiYjMz5CYkA+e3VwTjV4SyswJEAybUk8X18hKEVWdEhjclEtY0w2PUBZcjE+TUB+CitqWCh6IzNxclhobUEpJnNAZTdvJnJRfmozSFApQlI7N1hKI352TE0pb14yYURtKSZESVhFMGE1UilpQChwbGpsUyF5OS1zeHp6PH50VTAzCitZYWF0JFV4eXpkTWEyWUF+YTVwZ0lZcU9mVzJ3U21gRWU3Kys2eCVCQEJSTTUjbnI9aER4VlNBfn5mcVJyI3E0dHZkQi07ZENyKmRjTHRTCishend1RjQpJXgtVyU3cUA7dEFYeSRyXnMhVSllJUhjVH5mTXtaK2RUUGFJezVNPWhpbDJ9KUE/ZXRfI042YU9xfUpySGpwMmRLT0Y7d0hHCitiUT5Yc2kxZTMhK0BgWD94e1A9MWdZNlBtNnIwem8yY2BWbHAtd3l9dXlZSXt5KVh6bUFqRDJ6V0FBWm0zKWpGTEhJWFNXdVF0JVM/QXVfCittMGxKYGpDMUxsb2IqRkhLcih0cFBrWjU2NVBRTmt5RU84OGNlVWAhZGImX0VlV2ZEfHojblBLVUhmdGI7VFhNQytjUklvOXckUzh8bD4/CitqcENzMVckR3khRVFkWiMqRnxTPitsNDBOKkgtQmwjI3tUWDZhVyQrV0hqR1V6Yz1rWmwxaE5Nb0pMeDteUiNXUDV5TF83UktaRjwlaWNqCistMl9DcyNLcj5YUFo8aE5lTUtTLXo1bEJuaUNiRl5TNUlJKFBvfW1nVUU/YHcmdDZmJWJvbyYoelNhemFRPUVePmlCWUdjc3taPHkmM3kjCityMWcqQiFoWmBpVjElT0E5ZCFxKyt3QktQfDMlZ19XQGU8Q25HR1ZzTD1rMzNAKV5GPiEoaCsxMFpJfGdWbU5yQjFQPDJiWXVFO0lgckU2Cit7JEhaUk9aUm1DVl5NWmIkVCR2IzJsYVc8LShDeGN9XyRXLVE2RztmNEBBWXd7Zk0yUmRIb017WnBWPkNlVjItNXUtTUkkJSYyU2hyKWlOCit7WWJXeWNWe01ga1B3X1ZpajByZFdNeyNNKVktKSk5WnskdVQ7QkcrRWo1NnBQNChpfHpOSHNmTW4lQ0ZLSSo7SigyWGBjKCY8UClHRmhuCit8anBkO1IlbnojajRHPShuQGFNPWNxRntSSmsxXjskR3lCPGIlWFl+JHlxZFZBe2s5a15zZHJTWT92bF5FV0czcW92T0NVWHVgP2hVMUpJCitOKCNVclhwUnRTJVQrR2g3XnJlJkojZUJEUW00YVEmV1ojcDtZc3M9XnBIclVVfDl9SytETGEycFhKRjxpWDRmQnA3PCltOG0+KnBkVWQlCitLQVA5K2dTakVRY0EmPXsjN0okdzVDVVM3NyRnJWRwZXFyV0g5YjRnJHZ5Q0h6em5QRkhSZV9oYXd4elE8Qko3eTlpM08wSEc5KWtDdyNQCitGMU9HY1Z6bn1jfCF9YX4tWTdVKyVNX05IXiY5JTdZciY0NUBjYWM+SW5OdVA8cikrSHclZ0wldVk9enh7K2ZHY0clRmItVz0tPTQ3K2VtCitjO2s8NElyTlVpKntAWHNLcTlXLTJedjtrVSlnekBhJTFnQCRvYjkxRFVkU3hKNElla0ZWX3g7Sl8tO1d+YWQ3a3k0KiNZeHRiJmd1bk5eCitQOWAwdnpEZSllPzJ0dEJQYTRES3NASkpLbFJxKj5EQ2dMcGtVVXYzd0h5LXQrcXYrM2JNK3pvQGc2PndpPEpaOUNpUytPP2Z+b2AhWDRWCitvR0RKTGk3Ri1zTSlJQ098OzNIU0s7NlFGNXxjYURGdylYSFpISG88PTI4IXZRMF9Jb1pOZm54eCMjSV5QaXUwdUdLTjltdkUtYzxmeEJ4CisyT2dSJCNXPnhUKVlDUU5wdU9vbnBCbzxGV2khTktAUH02Y3lHRjk0QyFlcUApQS1ZRURRWXZAQ04raTVGa1BlNFFlfUpRZ2lRcnU1Ki1ECitnTGRPQFIjdzQzNTAtYzZCNHI+VWh3aHs+dVAoVVFRIUQjdEE0MiNteXNIIXdJQkQ/eWkkWXR6eGApNElwYikhSlQhR1ZNQ0h8ZmhCJjlACitpcUtZRkl1UWEzWEVUMXIpRXlBc3tnMmtXVX5wPm1sUXk2bTZOeUB2YUladEBMYT5VXiU1Jip2OEdRTTRuPiQxKHhMRjRBWXd1Y3lHQ3R5CitYU0J7cHZfNEFadHsxJkJ+U3BnaFRDVyVpXnRzRFl+d2lqZSshUUlLSVZlT2BRbTIyMj43Zj1+blZfTVJgY01qUDg5ZSh0SzYmKHJQaD5PCisoc0leYnsld2g5TllWWENBLX4tZ2kyO3hLaF5UfSgpcD9sZXEwRzFpP0ExYkQ2bWx6QyVwPGxtd0Mxd1o4c1pMRn1tYjV1ZmxYMF92Vz9iCit0cUR8JVBpK1pSM1QtSzk3MiExQEEpTWp2LU8wQDdnVH5VSExFJlI8dXgyMjJsezh5YUE1QT4xLSRFZSFpSUp9UjJZQGx1amE1WnRmWUQ8CisjclU7IUMrRU1xTERfZiloSGl3fFgleD5KVyU2QShTbn5nckozcGJTbWRjQURWY3F4MEtvaV99eE95Wn11VGI4ZFgxeWRlQkFmUUQwS317CitKQXEpRj1LV2B0cX00eXNnfUVYbldReD98VDd1X1VtZU5MU0YrYTg8eSNUaE0wMllIUjhxOD14ZCYhSWgrM0NyaDZ3MzR9WGZrZ181ZjNHCismdHomKF9OIyk/WHF7Kj5xWntKPzgodUBiQ0U9PmtPJWV6JHJpTD5uaXZxYUE+WEVTXyRtb0Q7Vzx4I3VvQnhjbWBYdFR7U2tvemtXWXEyCisrKjc9ZHhBME44KXcxbVMwMTA5TTRCa3JAJG1KWmBpRUVkRkZKa2UyfFArP2QrdFBCZj8hRkpCKChLblB7Y2xEaDR8dzJpUHNjeVl4flYqCisqWiN5dDgjaD99eTE/fXRnTCk+YERzPXJTcUg3WisqVldYdl9Pal4xeiY4bGd6NmVaJnhhbF5qVmQ0Tjc5TDdhTlBQTyNRTE5YS3s9T1JsCiskX2JmYlNQQVZXQk4oeSlWQ3lnV1M+RmIzezZfPGAjb0d7NSlCaUdSI3J9OFNvJWZsTTRVck5oZFl0VCs8WWR5RDVZez4kPldOeDZwK1p7CitDMEpOPnR3PEpzI3phfHYzTHp9JkBGeXoxJG9YNjI9WDd+aiF9WmRaVmhMZWMxbWF6OWdUYGwoX2dPe2d6Z2k9K3d0c3w5X19ZYUIqSTFICitIYSo0U2BaclNCX1I7d3dhMzlPO3IzWjJfc0l7YlhQSWJjYlRKazYjKFkwSng3VU9MVTV9KV8zMU92NUpKIVpyNXEoUWwhenZDaXxUdUNQCit2XmM2R0IzUipwWSFMZnUoPkRnR00yVzc7RjEhUE1IcDhzKl8yQjJHR0BTc0p1RSpLP2NEJiRNcn5WOVFiUjlfUWZSVXRfYWFVOz4meFlnCis9UTNhSCV5PSRqP2NWO2Fuby1XVERxK2YtQFA+M2pgPDxVLVB7amd3Rk1neyNSOzB6UlhrWlZSeVhMQV9qYGktQlMwOTRrWmE2ZHFpb0Y0CislK0AkJU52YDhZZXRWd3J+dVdPUzkkP2E1c0BFRGp9azdxKDNESjd4TEpTS3hGNXxsPlRsciNid1NFN0hwTURhMGBpeXt9ei1DRktudilmCitAWClRR1ZWeUVLVnYrckAjMXpecnN9VlVgUmdIQEIwVWhlS0RIWkteNTFtV09PSGNoQk8yPH44I0UxK3dFfHxDUTlDeX00dlRyPGJPM2lVCiteZE5efUpobktUSUBYejQ2e30yfElnU2BrbnMqUCloPkA2YVdBSzJtdGV5N0R3eX5hOX16TTAwMmxPMDAxPXIwMDN9bGE0JW5XV29+M3xhCit4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FiI2lRTVg8ez1rYiMhVExGTFleYldwOHpLRV52OShUNVhmdHdoe2lXVXhCJEImcSpeMT87NilsCislalA8OVpPNkB3Nk1PMSZgY1o7Tk5KMzIhM0lMdzBlJn0hUz8mNWBqTlMpN1ZKSmE0NU9DcXBYPl59U0szd19EJXd1MDRTJkFZfWpxcEZYCis+R0FubU5iI340PUJXa3VmdmFQbElNeXtBdU90IVZHeEUwSzl4bi0+aWlganZqJHQ1IztRT1VKKitib0MlNXFoJUxZOFFtZC1DaytTN08mCitzRHtxeXJUaTxoc3lmQnhhay1Rdzx0QTc4IXdhNXdSZlFSPjkpRCs9K2M1Xz5DRVlyXmgzY2okV3luIU02bD0/Uj91b0VnenQqQH1rVV5RCitJR0BRK0hmaCphRVVULU4xI1BQOEtoe1g+T1RYe2FzWGNJLTUrdVQmKEp9aFNMQChaI3BYezRFYD1JRjZpSUMzYWgySzdiTWQhcT1PNXZ3Citscityd0gwMjYhUkgtWHJEbXYtWSsyVnpTU2J3TFZwQyk/d1htSVRvZkxRR1dIUEI1WmNIJTcpRzY1TzUrMU5od1FJVFFHey19VzJ8ZjRFCis0NkFze1JzO2RDVCtQNU5KbU8pa0c8QDREKXMmXiVoSlYzP3hBOX4rcG9PRHZ6YjxhKHBlZTYhemJTNUphUmI1IVI9KSF8S2t9QXVncjBnCitDeEJsT0x0cmxodmp1eDtVdy1zOWEodCRtdVNGY34pVUNyNFF7I2FnTGklKSNGWiR3ZTQtU3lTWD5Hb0UkejBoQ3o5Yys1byU0KkJoejBnCit8TCFqTCE4bzhmbzcrYnE0QHVRYDduT21aNnhAfCZDND8yTWhJO2o2fCQmSXBUK1gxcjtmR0Y8Yld1dEZQej9zRUIpWVE9SnlZUypnOGRGCiskaEhaK2BzdlpgcmlKUWh5e080I2t6RUMjWXo3UV5yRkcqfDJwNUZta3JgZE5KUENxKlZ8SlFRWDQpSypjfU95N1hCVGNhVUhkdSRNdFRRCituVWAydXR1eWN4fDkoJldYRCk1YzYoY31BNm9vOU5gZ1NkQFdjM0REWjIkZ2hhSklgczMzUnVWTykhejd2X3V0MDJMZ2R8QTlAWW1EdkpNCitmdHJ6VHtDKVR5bXtpbjc/XkRrKDxhNnwhZV5sRHpVVSh5OyEzMmNPb1VJJGhFdmJifEdrXkc3cjUrSiUkM013a3dffCojSTxTSVRKMWZGCitiMlFFV15gPD0qMC1pV3c+Z1k3an55MSUoJXJtSEZlK094TWk+OUN2Tyo0O0ExU244WiQyQ0k1O1hyLWZwXlRMaWYraVNJZ0BIbnoxS0hXCis2JUVzXkpDMDhoR0hRdFhkVytQNUNXK1lTNmB4ND81c1o+fXIlYEZicklhczlpU3I+byFBJjtJY0FuYGdoamVqYGBjUU9hZlc/Q0c7VkVmCisrLTtodF9xc0s+JE1OTn15MDZYQSFrUCgrdiUwR1ZjWUtKaiNFRnZNK01wTzR4JUNFdUxhVCltZUVqbDh9ZChRYjMyPzw7fUdSdkx9S1ZKCitrR192S1FyJDw7TVgpfUx3cWBDTWhYOWlQUipRMHsmPzdQTUZFVSNNYXN+UztFcnN+RTMzNVFlNzteJjBCbDdkaWA8KiY4RERMbkF6aHgyCis7eX1QKD8oV2AyJm4zTF5KIzYlcEoha0w4QnYqI0x7T0xVfFJ0PDd3dCQ+T19MI1NRRUY+KXhISkYtPDJyJntNa1hGbTI4elVYKW5WJGJ3Cis4YmQhKjI9Xm5ESm55JjU8eFJza05kLTNpQTFHQG55KHBQaWZkcTxDZWk0QjNpWWc8Wno7MTVgTmZDb30oWF4la2tfb0E4aT5TP0EocklwCit6N2RzdCU8UXZsPWh4fFJzX2NASXh5WHMyalFKZ05tND9nVGZUN0pXfGZmcGopX0dTa0dNX3ZCWHJvd3FJPl5hMGlEam47cUFfZkIxSiRsCishaz5XJVI1fkwpdEB0SmlrLTAtdFJOPiUoc3ctSEo0UG5pOzY9e248Jj0xaGRYMiNtbUVQQ3NYXmxFWHdqOCFNPVh6JStFdSEzeWdCZnIkCis9SVVlMWBAaGwkSGMqbTF4eFBHZSE+WGBtdWlSKHh3Z24jS3c3RztMM3V2TnskUVo1Wl44bD52U2RndEh4IUpSKThTQ24wak4+fihuYHhlCitfRXN9XkNSbHphK3MrQ352Y2ErYGZZJDcmST9YbDttUClzKExxRVo3QWZBSkd6RDY/U2p5fEYqNF9Mb2Q0V0pfezY2UXFBUDxkKkdoKChiCis1OD9sUTZ3LXRjLTArZUA1bnctWkIjNmpZOUk9WEtMPSkrfjFifn49e2hveVZLMj5yT3Bpcm9NVj5XWE9wTiFKQzE7a2tabjs7RWMxN0QkCit6ZyNuZ3lxSiRIRWFDMSlyPUwkbDxJKEN+RnVDZjtiKSNVZDAxeEJmZm1DMk1IWExaS05kU30wQlpyPm9oQzIoc0dRe3JENiU8M0ZjNlReCit5ZD5Oc25QR3tYMDAtU2d2aU5leENgUGcjaHMwSypebmJMfDs4SXV+TDdjeUB+TEh2KlomIXlKQW4rRztTanBLXn03QWlwOFJaVCliRyFhCit+c1lSZCg0dj9gdElYOT5KVEFeWiZsc3ZJa2F+SlFBcF5SR2R3Mkk5e2IxX1RUeSo8SWVfPXx1WjN0X2J4MFM2aztFalBkYFV3aE9SOGx1CiszP2tseDV+cTljZTc2Tlo1bWhHSmAlQERVayh4NSYoZU1JbVItJjtadllObkEwcjA7dSgxZT00RmVzZ20rXzZFYk9DWjIlX3pfNk5WNDNJCitEKis/V0h4PVNoclM9WD9pQG5AUCFsdD9WM0p7QTsjSUA/Zkd4YkM3YUVQeSt1JkYmenY4KmpVdig2YUtUWWUwTVNNYSV2bnY/QHxaI21eCit3ZkVyJEllM2Q+QmUyUEhWWjc+KVEtRE81VXZpdCZlJG91ZWw+JmdxRiFBTTw1JmB6ZnZKcXM8TGAqel52fU11d2F4TXhDOVVnR05zdFBjCitRQj1zNjg8Pj52O2tRVXR3fnpZfWE5OzZYPU1HT3d7MS1MTCRSIXIofCh+QHJqYEh1QFlNUihSKVNYZWFtamohNmAkZnBTJTlTTGwqSzI9CiskK0twTDQ1PyVYT3QkeiEmYSEtNU9hTWElfktkWE4pa2Z0WDYqN3xpVDc0P1J0ZnBaN29fYXp8RGRtaSRRLTNmPzIjNEBwMlV3fjNVYjFZCit6YFZkbDVUKVZ9Mlg1M31LfEwhcnlnS0k4bXlxTzs3RWs3Xyg4UXFJKyUmfT84OzBkN0E5NDYoRnJDZil1JSlgNiZPKkghaWJUKG42KUI5CitvUXFyeDxyUHE0ZFM2e0I0QWl8STU8MFNRNyk/SGRvYF5JbSVedUh7Wk5zV1BqZHBOKkIrTk9pZ1ZXI2lgOTBRTnJFJChvR2srOSprTDVvCisjVXNEOWpTYHB6eE5pS0hLbE4oKzxjY3U7eFhPZXkxZk94K35+TlNKTipeLShgWjNtQWl7dUAkRVVMazZvIzBTSGMjcGpXZzlsSyZsPURyCitqMSlNRE9CNjNSKldYS0YmbU8ldDt8N2Moc2s/WSU0XktLditaQnhFKTlmQ3tScWEpR3lJcSVtZGd2TmJJSCNQe2Q8TmJQWSVDPENyO3taCitiZDZVYyRIc2VeR28oTz5eajtqaS1BTXBpJn1fMW96dTVJK193ZTFHMExPZ2h3STdWbSgtNylEVEw/RGpnI1llMG5hcFVUcGw1cE90JnQ8Cit6Y3dgZl5qXldedXtlakJmUmRCP2otWnFqZEZOUXJtNjN4QTVLKSR1dHomMz1qfCghdFAmP3lhME0ocyMtQWttSUZ6cmcrPn1uckIkdyokCis9Nm9ZcClCXz5CYHgxeUIlOGN0bmJYPT4qe01CSXZjTXRweylTJWJ6bm8tS2RJPlVDZCNBcWs5PzVDYzg/P0Jwfi1DSCVSV0dSNEtgYGhACismdChKMjUlX1ZtOG5pMV8yOF9PRWNwVD0rV2hHen1JKyF9c1ZxQmlxV3FoTjcxWWlqfG48JTRLJWlheDdrN2NAZm42NCs1MFBfUF5xTnhHCispUEJePCZFJTJwSTJ+YE0oZVlVKlB7MkxAdHx0PSN5KmFebTtAUSNhdGFfYD5EJGlJaVZ1WXB1KWE3a0I7dj0tNT5qRzsmQnEleF5iOGc5CitBWD1XOUNfSCVHeyhQLU5+aFpTVG9uSlBoS01nUypqXmNsZ0olWl9ZR09oQD92S2dSP3pGeztPc3U5VEZRPnhffDRMd1phenk1ZntHR3hPCitvUztIMTJUSlQxVjxJX2lTKGJ5VVU8XlpVVy10eiZHPXd3dldGUzAmQUQlalJLdERYRHJSc0dXKVUtUzQkbC1LOGtqKEBKeElzI0xKWlNvCislVyZhQWA2ZDtoaXA9cElYRFBPYl9AJmhhUmBRaXt+U2lMNGk/UVpXemNCayhmXyNVc0lCP019NyUlXnl7eld+JG87ZFhkWGlAailUOURWCit4UFprKjwyQlJtPTx3Jjh5Vm9WPzJfTFVWc3xqfkx7dWJmeWdUN0dFe2VaMUR2bClaUmRtPD9eNDhBPFNoNng4QihfLTVtPiFwVlAxJmNoCityOX1TaVgkKyFDYSUrQyZQRiEtY2ZqIyRIYXlJTDg1Z25nc2Epa2F7ZT8ySyo7d1F1PCZvVlklS2k3eDRHZnRYUWdNJCMteUpOR0F7OG8xCitgZzNqVXpgcj9rXnJqNjxhfGx5QlEmS0htYzhtdXA2PlhrPkNMPzc3aVQpM29rbll2KzFXflVWNURARyY8c2Q3d2VsblZIY0ZmUjNYZkdrCispeVhgPmBlZD95MFo+Wj0xUVktTzAwO297bEA+P2E7XnxyYzJMSiVmNzYxUy0wMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMCis+VlB8RD9GTGlRa1ktd1VNRkxpV2pZJWdfa1klWHdsckM0b2ArY3B5Wj9xNU55NWxCV0hkRDgkeiZnZj0wT19OQE1weERiTD0hZUNeT0d9CitoWmdjNFBmK0t1bm0tXmBHYkQ4SXhsRHF6PFZIU2U1eFd+a0VXaXNmMTxrdnBrdCVWZ0RQPDU8bHJRTWs1SVZscFhfQ2Q8VVBUcj94MWsyCis+ZUxhTGJKcT9+VCFCR01UaFN0KztjPnZNWTklKm5CSDBrPDN9YlRlcnBFdCtvei1RM0N5UHp5NDx7JW5vbCMhIzk8dlUyK2Y3YT5jRD5VCit5TW96aV8hJDFmd0k+JG49S357dThXSGNgdSZBRlprPWchKkJaZX1aSX1eXzVmKzVYZGMlMGx7ezh2JEUmS0I2VzUmSyVRN34+OTJPMSErCisqJnxtaUZfRVpjKzFCfjtwK09IPHB6dDlaWHxoVD9iVHBrIT0oIUxqVGRpdkd2fDZSUHZVQkdCenhyTCpWJEx1RztURUcxWlpRenVFJDt8CitPVDZ8Rz4wJENSIWRKTWtmQn08WTM0aT5EfGp2Z31XeE4tSkx4XjA+KWw4NzJGQkVNcXJmPDMyKXsld2VjWjV2QHlpMShhPEtlT3pKYktXCitvU2xKfnx0YV9HWn1pKERKTDNaY0FkajBXOXEqOVI2QVU+MmxTczR7V3tIc2JeQUB0V3NmcFNVVVBpKEZTPWZMdSFALUh4SF9tQEJsMDhUCismJmRrUUJBZDF5a34/VX5iREAqNm5CUElWajBjPHRjTkYwSz1fPXRkS2A2ZGJfcS13TkNnRCVRe3pXZnl3OCMhYUt8JEx0JGEwOGJyWnZrCitZLXs3dVY4Qj9AZG5kTkZGO3pfV2xWemN1QS1SZHUmZFgmc3tfTWktJGtIMTx5PFlDKClrZztlaSFhWm8zQmlUK0sqaHJVe1VVMjQjYU1DCitYNTskVShxS3NQJXIyaTUzNDZ4VUtKND4+WFpFLUUyRGJaJT9mdn5iVHxXWG4kcEh0UGhWbG9OQXdad0U1TF8mTWE/eCZlc3xyP1dORjNNCitfQj48OSladExPJlkrPlVRRUM1OW9BcTdZZ2R6SiYleiQ7ZXE5Y3xyT0YhN0QmUFZGYyFFRj9FIzUjQSUydGVlKDM7Qm1UX2JFcyN8KX4jCitkR2IhTVdfS1UpYm4yRjFrSVVpN0NBP15yNmJPLThWM2R2Um50WEtUZ2x1ZTVLbHE3PldtTjVQaDBiZnE2ZkcwVFI/eSNLfjR6fkNpWUUrCis/YXtlRG1mRmB2VGU5ODxyK3A9YkdoV3ZDKD4/TDxVdjRzSkspQkxXaGhRaENnMEMkJFpHJHNsdypiVDQ0fCltSlJkYE5ZdFdoSVZiX3tVCit0Zi00RGEkZV92Q308aGNHOW98Typmc0k8P0JuNWN1bkdfeXt4MERjbV9sRiE3OyE/Z2N1NihKSG0pNUFSR2haKmhQZDc3d2shfUNsMzU+CiszI0FHdnJlVGtwTSR8cTdNQWYoc2t0fENnJHVIVHNeMDA9PCliR0tMTGY4cHAmc2hSZE5ANC0lPDVfa2gwX0t8JERgQ3F5UnppZWBpU3FkCit6UT9ld0tiUzZEOypoQlhqeyEhTmlybkFfcjI1azFROTVNSVhlM3BOVHsybG9iV0xOUCgwXlVLLS1VR3hLT05rejdaMzhgWFJaMyVCM0xVCistPk4+K0FueSF1cj5MZi1JQEVgPDBuUWJ7S2FVbkBZISh6RD9MNGhibGMwZzU2Rmt6ZzNFMDZUK3VmaVBwQXlnQVRhMCF4RSkzclI9TGlhCitXQHdCSTU4NHsjSF87TmFQJFRWP2AoZUxyRSpHM1coWnVVTjR7bnY8U2ArUnBMTS1yUGhsekhgaTxhS1NZUD8jWmBvMV5jdDVWaVd1WTBOCitxaE9qdDlAemxZeHR1diZ6dHcoOUFNcVQ8V2RXNlIyWGpSd3B0NioyaXw3RDBlJTtQRTFHXjRIeWQkQ0hRTGxsKSs8P2oxMjkydHtTdU1KCitpenUmdkkwaGxuQEpZLXpEYGoxeiNpKSsoKWxja2xvWEVNeFh9bEdxPjg3JitfNiMqKnhBbn43I2FQNShHeUZleikwdGopNGFjUS1PQyQ1CitUJHszPldNUmU8VCVmTk9JPjN0WE9wVEF0ZlczUERQPnVLblFAT1BxKVRBWiRmWjA8UDx3eHA4fUc8cy1uNTdCV2ZWP1Y+dGA5aFNYMlJECispZyF3KT1HRyUwdWlJRkBQNVllJUM1cXtJZylSTit3dCMtJkhkaj43a1BtPjFCK1AhNGRHISpTJHJuMTsmc2dIRU4zPHdHfTVLWVlLNns/Cis7Jm5qWGEhfXhfKFpfcS01WXA0diRNb2tUYl8jSzBCcC01Q1ByIXhYJFFjYzA/bCM0JDwtS3lTZiVvIUJEO0N0ZVdISktqS2U5PWY2VCFpCitHOVE1cCZSSilUZERCOzBfbUxWTE8/XmU0OH1GMWMkaTc4RTBrTyh3bTwjTWFaQ2pBcz9FMVNoPXNHZmxCSS1menx6Kk9mIVNYYTkoWlplCis8I254aGdxTlA8WkJhLVppQDgjfXhtUy1lMVU0ZT56WWkxfEZ2PiE1P1ZAPURAPVB+UVIkSyleJj1jTz4/JVk8X1N6bkA8bz96YHppJk9SCis8WE9zUWYjREU0ITREJntXUThZcUMmb24kbCZvbWRyJndOWkQ0T3spMVp8aGVQOGNZRjxRRkNXSGpYUXtwQm0yQWcmSlN3dktjaWxkNjdgCisoRG9PUXhKJGs2RSEqZF4zQmRrYiE4Z0dib1UhVF8qdjdkfWMlU3NKUnpYJGBlNGcpMXt7SGpBeVIpV1ZlY3RBRC16YWNjYzFvZm9nTkFBCitJVCUmWS1XVyhBV3tMcXNCejw/fig8eklRJXpGP3F+aFo1SiRXKHA5QkR1c01lSCZWbXQ/aGg8WXZsJWZoTzI2eTU0JGM1QGk5RGZgSTVkCit3ZiswJE9sTHowaW5AaGUjRDtNKUIzNC1oXi0wMXklfmt9eDcpYGJKQj4oLXNTVXEobS1wLW5NeWIxR1EwQG90Z1UhMTRAP3Q4USF0UnEhCiskRV4tI1E2P09Fd0hpa0l5KiE5YWpmdyF0JEs1VnVAb0c1dDJKKnZXXiVUZFY0WW43cjVpOCEoYVQ1LV5WZ3F3b0hsaHpZa3U7T0drUSo+Cis7P0BKTTBoRCsheWhoUDF1d35lVFNvMWtyUHN1cyRNZU9ySS01MSMtd2FLejNic1IzQkQmUkJYUm5YXnwlYnEkM0hOakpvPit3QWNjYHo7Cit1dTQoOH49MnIlSUdVcH1EPzE+RnRqVH48c2ZFNT5AZmh6TX19SCM/c2koQF9AeHIjfiM5dTxNaDtJOzRzdlR9UDdzayF2ezlZPW9tRUpUCitsViFnNU95b0p3IW9ZUiohdEcwSVJKTnlja2NQJkZJNUhwSDlLbENKUHZrLV4wUlcmfTd9YEspZ3F6Qzt0YWZPOUtRSDAwMDA4MFB+ZD1OCis4cFlGSEgtb1AwTWBjcTAybHhPMEJ+dD1GSm9fUVpERFI/YjF6P0NYPk10QlV0Y2I4ZDN9e2xpYHlefGhWVDlyQkU3X3JuKGNLVnI9PzJeCitKcncjeTNCaFFzYVV4Y2hmK1VscXJUQEw3RldaV3AmMCpKP0pvOUdlb3IkdHF0JXxSLWQ4RyMramdwcGYkPm83aUE7XmlKRnd9S2FHRT1PCitPWXFqYn5VQU1qTUhQa2lYLUFRUm49ITtSSndAYDwzNWpmMVFRbnFfSTM5d3dybD1MKTJvJnZPeClvT3Iwa1RSYkE9e3xofmFaMm5iZTc7CitXI1pmcWpJO1BaWGIwTSpTZ3ZFVGdaNGY/M2cxQj1pMU5pTDBiN0R4RFZJTnMtYmQ2ViVZMUA3bVpqe3BQeiVOLUoxNmJZJnNaIUZvOHpYCitpZTlZJGxiWTlYIXRDODtAckxpRCh1SiprbCRGbm5WSlU4NV5OMjdPfk9PMWRXa148VzVFXjQraWtvej0rPDQxM1ghaCRXMDt2bkhuNktYCis9cWRZbzclMjQxQzc0IzdLJmMzWl44MGVaOE1oXis/YGlEbzZARyhXMzNFWWFzWFNLOSlwXkxTQFZOYl9gTkBKI3oxYnI+bUR9NUh2LUlgCislMTV0K0hecHhiZipFM1BeTUh8Y1lAMFkrSHQ5K3NMSEpxeyt2OWViJUgxJHRmVlc5RDIpYjkoRj5hd1Y9dm5QIz50eUErblhkQW45eFgxCit0MDA7dyVRZHdeMHF3NnZoKEpHelNUUWBDbEwlMTlTTW9Gd1ZHbCNoVHZiLXcxRntiIVJAVkAxO2hobTZjb3BFSG5AV0VCR1lkUlg8YVk2CitPeWgwN2JLQEhEWlYoQjcpfGpuVyNoUSlqaHIocD8maXgyQG5XPjg1YlBqWmc7YWpAc3IzQ1JGRHx3KkZydylFUlUjRHpLPnBMfW1oY0pKCitJWXt4VDRxUEYhNVl3XmhwRSQqdk9sPWNNdG84IUFBNiVWbD12UnlESj9GVE4wS2RxJmcwKFkyX09LbVpPfjIqTCstMi17O35EJmZ3eFFiCit8M2NUZldmN0tsTztjPz07NVEqTzZMbWlOSDYxUmxkeXlNbGhGJm1EP282fWNJZzhqRV5RbHBpaD1PR081TFFyLU1COGN6TFQ9fTReVEAzCisxUVktTzAwO297bEA+PTY1Qmk8PjBzc0tWMkxKI1gwMDAxUlg+YyFOWio2VTFaZSgqV1Z7ZEo2WS1NejVaKkRHZGQ5NzcjWjx7YT57X2JDCitLJTJFTWNLPG4yP2U4e3Apc2BpcDckdXcxTVdsPUIqRF9+QHNSWXtmcXpPemsyTlpMdUEjc3skUG9fbC1sWSpON3NwZnMmakVmfVNjNiVgCitpPnE2ZitJU318KChnZnchd2t0RWU3UmFPTkxrel9HMWlsfEtYYzROQ0c8bHxeRHEydVlkKzFKVlBkaW90Zz09Rk4hb3drRHVTRlR4fWRsCitKeVAlOStZfDJ+dEh1cChZa3RyOUFsO0J0IXEmOEVNX3EjZHYtX1RQYHJuR1haPVkleCYhcU87QyFTWGx3NiEjQTNBaGRAfW9iNlN+bE0mCis2ZlYwJk9hQH1Vak1uPi1Db31CZFRAN1ZZKSY0NzhmI2VDWmBaR1lYVilgMmBtdm51WF88c3EoN3lyP0poQ0hBZWhocEwyfWAzb1NLeG4hCitsaVcyYXk3bUQkK2UzWTZVQipVdjNmNSlqSmRTZEI7dnp1fl4jXjV3TUc1JCQqb3FIPXhJOThzYFFgOyRpfiRtSSZjYHRtdTReNm5TZSRvCis7ZTMxdDBgMEQ8TWphY1IyZXxlMzg5VSZ5bkJQc1JCSE0oWl8rfiheSU88KTklMEg+JjgwYH05WUk2Tj9AQn0qWFh0KykqblhreFc+ODVJCitudCU0dD1PaztAdVEjNzMqJD8lbGRyWEd5fEpec3AyKUJTd1VzJEhTUEZuV0VIe0VLZGg7OEh0c3wmKmtHJlE7LWRoMG99OUcyY1Y2LTtOCithdWZuakVhLUJCOHVlNUBUejh1LX41fWYrI1R5ZVFyOCFiYlF8JkZgUHZJITVNVVBrcn5JKGsmNUc7Njd5MjM2TkhoNF9LPGNwM0RYTDU+CitRNk05PGp8UUVuTDU0PFZ4Qk89dmhuNDtzZW87aHxNcCs9LX5QWSF3PGkweHpxJjB8QnFTMy1SXm5TVk1iTVN0Yj4pNS05NGhxTShHaGpvCitPcE9JJj1YTComPF81PWxDYkFNK3VoIzQ9NXVPX0hEKktJZFheUGslMUN4XiQ9JFNkY2NZe1peayo/UTtIV19QK1RWJmdUX2Z+R3x3V3whCituO0JTS15fTVZzQ3tsUF8rP3UhVW90TnslPnl4SmVlJVVQfE1heXc0MitlYjVecEd2ZGdwOGw7YTtNdVdgQHM3MCVHX2BGVmNKdGJgeyNZCisqQU5wYyVSc2V9bTtKYyYlUD9nKk1Pb1hxRmJgNERiKzRNaTsjUlFnVzRrYXdrblN2WWBISWwoV1VtMlFYQVpWP3smMTVpcj8xUVktTzAwCis7b3tsQD49bV98ZS1vMHt7UlQyPjx7VjAwMDFSWD5jIU5aKjZVMVplKCpXV14hZF5kU3h6ZmQ4SmxPaWB5Xnx6NTc+KUsoVWlMLWt1a0hUCiszOUhRRSk8cD93dXtpKFZARWBtVHVEd2d7cS1HNWM1RWxrVk90Kn1YfStaUVc7OUJyUllOR1BJQEBXV2w8PWxpKzdrOT1sO3x3YnUjVGMkCitaY2dTclorUlA0JkspUCY4IzdSLXJlVSVpVm15VDlYcm8ldCV5SzE3UiV3N2dGaiQ3d1huNVFLaChZPCZFZ28zMGdEOHAkIUhna34tb0I1CitZXnlCKElCS1dPVkQ/ZEpVdyhUdDgocFYtMGwlIT9GcDRESmJMXlM7RnhQfUkjSEtiQ3lWSyQ0cit1NGR+QWM3bDxwNkl8eGZkSUR7NFchCit8Z0FBbEc8OTRlSkFMMShrQUMyTjQ+Qm80NCpGWTYzT01kNHNXJGZzN1RuIUtwaUd4OW5wT293Um4kQHphNkxmQV5Fbml7S3RIM3ArM0R8CitvbH1jWHliJSV2ZTBEVVp2eih3aHIpMXNJVkhpPGQpTEpmVCZXa1ZZKVVyWjElXlY7JjRuJVctPzFlTn1SKHdKTnIqUHF0TyRNdlo1JnxBCit+elc7e1JBbVUmS0I7QXc+blBvY1JScnVyISRpaGpMcVpRZFJEbHdkMkZvR2FPR1JFUFQyZ3JrfSVnYVZBK0FgSmcmSTdeeEE9Rl5WUEVmCitWc3tXUz9eNTl3SEl+Rj5RWk5BVl9XPjhIU3M/JGQrPG96dVNucmI1QXBQfV9IQm1uQzg3QWVVcSpafm1pcHoyPHhaSW1YJllZU3FzUnpuCitmK2t6fV9hUTU8Z2dSJG95LTxBay1hI3h8bVpSXzktV3Q8eyNVaEskYDNxanRIdEZwdSp4NV5WNVVsU0poeXU9XnBNRmRgaUR3dFRMV0p4CituQ0FabTRZdEJNfChGdENMRFlaYVF1Zm90MF8wckcmQG0/Yi1BTkc7U0c2U3pxTTJCfDAmazs/WHxVcWx9cSNBJG9vNWRNWGRaRCY5KWE8CitRUUplPTQ0JkkxVDZ+ZVFaRjJHYFZmSipqJk0oblpzJEJNckcjT3VlTG9OVDVIdnskKE1BRmMrJHZwQztKfU9IYCRjOWp4XzBGcD5OVmNOCit2b0I+WnN9ZWh0V3RRLTk9Ky16WGZUWFQpQH47cE15bVpnTUdOO2ZxM2AlbUNIO1B4U0o5SHxea1M8cU10Q0lYe14qV3xRQSVGZWQ4I0gmCitCXzlHJFdPSzV8dDlgWnxNUlFZTUA+RjQ3JlpiXjh3e2xzVDgjJjNgI19WfVpIUHJCYUh0SSFWSX1HfXtBSUNvIzM/ST82KkMzI2NEbGUqCitOIWdXNUdQYiRUPTc9I0l+bUlBQkVXOzNJQWw2aW1aQGNkeT5XPUQ7Nm13NH5iQj5wOV8weztSfk85S1FIMDAwMDgwUH5kPU07O2M/b3ZICit4PDBNLUtsMDJCWkswQn50PUZKb19RWkREUj9iMSFJUlk7WjFjZDJMY2xpYHlefHpVeDtFRTxwfllYM3dTUkJgaj51cHtLQTIjVTkpMFNgCitRP2R0cEVNV3ZnSmYhYnVzZE1GVT9HQXdGSmk2KFReNHgxMGp2Sjl7QVBpVmY0dEJKMGIwaUdzMDk/P3klTlVhQDhkOFh9S1FZe09AI25KCispaUdqe0gpUDxwX09+V3pGTW0tQSozRi1iTVNfUFNxdFUqLVR4dkdQRWkhK1VmLVkoMnh6czEpIUt6WjFTbD5NanpESnNqZWtiUnlaS2lfCiswUEt2XzlzRkxZZV5TQVg7Y2xteXtrPXk7TmR6fDdmKm49cWFBKiZwbWpAa3krcz5ecT1kKFJKKGJKUkRvaShFTjJrNmk8QyFgcC1Xdk42CitxNj5xMXo8YX5ZcjRXY218Z2A0bV9DPl5hcUlPcWQ7enlfe1ViWUBIXztUZnc4dys9KGxhLVY2e3ZTRGsoV2ApYmtgPmdNS09jfipacGZDCit1Z1VUcE1ibEpIa0dfISk8bnI/ZVJNTXtOdFIpa0okWVJvYTc0Y3tfNUlacDUkKyQ4VEZ5Q1k/UldJTVF7MmFpT0Y3UTJNc1hMJFB4T2gyCiszV1ZwMFByJVhxTmwwZEtFVlkhenhuQXJ6XnN3TjA3KnMtIXZvakRUbjM0VlljMlNnYFlzSHw1flVyc099I0tEZGFLbCMkXmxwRnRgPTUlCisreXhLM2d5ezZwWWxRUXNzQ1M0TzlLUUgwMDAwODBQfmQ9TSp9VyhxQmpsejA3RSRkMDJjck4wQn50PUZKb19RWkREUj9iMSFMYmI5NztCCitZJVh3bCVeT3tCPDJMZD16aytiRnUpVmRsX2ptfkUwPXdEbVU0VE9vR2BxSkN4aj4qTCtFeWNyRG9He3IlbC1ENztmRipAbHQwb3dvS1NRCit2YWJgNH0/LT9vXiFTXkloSDtybHBPSCkkcFljM1JfWXN0JC12RERtT1VEQFgpLSlAVSk+dSEwPzFYV3pMX3RPMVJZK3JBUmxEVGBpWWdBCitGWHlCOGBkQVMxN29JOXkqNXhaSnt5dkdSKCZXfl40XlJ6TGU5MVEhTkt1YVh0e2x+P1RRWUo7clRNViQhdGhyfERre21+U0g/T0NQbm5kCisoNStSSS1ma19xNTYqcGZfZnYxMjFfLVJseklpZlMoSlk4ZHxkSUlqd2xRRSV9PDMzejhSNztrSU5kdm1IP0Myb3pQJFVMRW9zJjdTQyV7CitlbGxnMlYte1d6aCRPKGQwUjxFJVRoQy1IQF9nM0wzPyo2Km1KPWZgS2MrJntCdDQ5PEV3Y34rUkBBUUlYNz9VLW0zWF4wSVpVel9QaHsxCitmTWt1ZDloaUYmJVJ0d01LNHtLclNrZGZ1dmZjQSVtZnUhKU1nOH5oTSVqSGR2PGBXWVU/P3JTSkM7NEFIQzRObXpmYGBjak4mY1djZjdmCit3MEtHODNIRzJTbGIlb34xMVh6ZiooYDN1a3p4MTxObnBTaVY3Q3J+Q3RmVyNwSWF9R3poVzBRd1J5VWJVZTclc2BzOGJTVEBBXnV3RXk+Cis7Qz92fjhaelBRPX01ODQ4bG9SZFpaQlNkdTZpTDY7eFl6aWkxVnYreFNiNUNsKWUrTDFSTXdJUkllfU5zQT9NaU1uUF9QflY3ZUlmezYoCitmPjJCNGRQI1kqIyFabjEofT5wcnp6UUhaX1Y2XmwkY3BvTXxDWEpwTiF+c0c3K0Z7SEA0I2AxPER9WFBPZU4yJjNgPDR0eVlyK25wUTsxCit5RWl4dXFTWDdVZz0lSkB8dzk5dXs7VDZpTWp3YVAzYGozQFl6VV5EP0R+a2d1SHs3Wl4/dFQ7eiNtUlJFfEhCMmRrOCY3Vz1ZPVBtKk1XCisob3pKKCUlPE4kPXdabyN1amZxcTh2T1lyTEsmelFqczYoVVBnYkt5YCRHJGlhPyVMMDBmUTk+bHhXe2Q2RCEtQ1o2TUFVUmlWOyFDUnc+Cit6a29RejxDSChYTD5CWEE1cCM/I0c3Q09nKkFqVWp0M0hZZDJFaEB5RDZqK3dQMmZgPXJlaDg3IVQ+cFVHJkFLUitXYmkqRlhhVnx8JkZBCitOMHZBakBwVTl0O01lOWQyZ3JsVFQ7T1Q7O2YpR3AjUlU4P0I8ez1aWnBIVV9fZyl0cEpTbndsa34tQ04hPk1XM2x5T0B+WE1RYChlamg1CiswYUMqfEQtLTRRdjZ0NXhudnpBb08hV3JVOFFDXlY3bDZCeCtZa0A9XmVII1RBNT94fSo/VCplaiR3OVdealNlQXNYZHlodH1uJmM1bEpXCitNc0spPmFDelQhPy1ZQDx9cW00aTt7YU8pUShpX2cqP01Nd0xVdGklaFp0QGI+eHN7Tj18IXNPRCpYQjZPO1IqcyZpbX1zcSR1JSZ6NVhWCitlTEFpKFNtUFQlbVA2KipGVVZ2bEl9R3EhRHNvVm9NNFhvJFJafEhgSz4oNDE3b3tpaiNrbiV8e0d5ZFdoSDNjJWhtczxAKVJuIyYtQkAjCitxRGtRIX1HYkZjfk4+QyhBbTF6MF4jJWFEO0o0TUhGOE9HQkFYYUo7KVcoY24kcHhtT3cqYl9CYVlvYGhNaXB+VGZKd3glc1BxM3kybUxRCisoQCl4dmJ+NUY8dW1iMldwa1JBbVJHO2RDZFZAey04b280c01WO1pRVXoxI3tVckNRfVdRaj1gS01UUFc4bVZ6ZE0xeCojbiU1YC0hQzN9CitEM3UxcjQ9QGh6cjs0enAwbXNGTFNDYEdRRGl5eDVrbytaM1JwKFRPV3ZTLXZGZyFLeGdqJVIjVlhpKUtjb1VKIXsyKnpIQnt3ZXNXaXlKCiszKCYoTWp9dFRsIXMjOVhqZCp0aE5jVmg1aWNeak16VWNAKVpReXVpaUBjJSlaMlZgO3U0PkEqMUxuK0wzNHNjbyFyfUVgYXI8NCRwUHgtCitTbHBhSXFFWX5gMk9tRHYxKGE7JWYmQk1fWlY8fjQzI2AxfmVaMEgte1BGOUBjbUpga2YmWEhaekMlVUhVdH5nTl9sKV4kPHZlUyE1SFRHCitUYSlUUkJ6VEpRTUUmY1RJeyE1ZV5mXjhieTJWQHYqcns8Rmo8PEdYO3NROVQmaGY1ZEF5KXxoSCZiLUErNXNRZkYyODBQZFJ+QW85X2F4Cit2OWRvOXR9NHMjQzB0QklVdTJOPzhfM3w7ZF5gQzBFaHdsTUdZaTteZyorNHFtWHtkKVdCS2QjOXFYakgpck9tJDwpTFo+UE9HJm1BQG5vCis3JStkcUlwSXd3RmI9QWo3N0s/NGREMkNmOTY3QS12PU1VbT1NbzIrdFI1Tk5ec242PiZsTCQkd2UzKFB8RHR1Sz0/JkVpMjktb3wqOT9vCitwQlRzNiREeT40OCliQHllaGU5dnk8Z0E8TkYjVUlFbVdicV9ldzhMP0R3bXZmSn1sSyNUNDkjJGJ7OVYzaHxPdHE8QWM+PFh5QWhsLSFJCitqU2NrVG0rWnJFYDxaTFElS2p8VlVJZlFUdDRBdnJNMTRweFokdyljNzQpYlY7UDkkRWN2dSh0UEF4N0A5bk1eU0xHe0ZhQnI2LUo0MXFRCitqT0NfVGFOTzBoamdWVTZ9KS0jRT1INmRMdTZ8S2w4N3l4bUhwdkVlZk1DdWx7ISQwTGVwPT5rWXJWNTBsPU5HT1Vfa2oyR2lDRyV5UmA4Cit8e01IZl5DTkl9RGQoJEt3cU8kRFVXc01VR3ZTWTl4cCFXYUgrO2MrKj0xa0RMej8jKG56UGlgfCN5M3M+Y0pLKFQ4YWooUDQ4Y3M0S080Cit5cnRibUp5TVpsSWB5MDdxUjRCWmVUTUhJKG5RQ34ob21Mc3ZASiFFKHxQKE1ien1AczgoMnxEeD9ZJXFBUEM7Pmo5bl9oemtVazw0VnNQCitUezY5R3x7dj9CdkRvY1E7biM/PjJqens8VU5ISGA2TzNQc29rU2NyJiF9cW0xZXdCZnxuaDVASGo7Mmd1MyROOH5SKlhAfFRwbz5iJWlXCis0SWpyKW5oTkJrSkZneTZ3LTdfYUxVIWJCeyEpa3ZwI1VvRkpsJTFySXphX2IkS0N+enp5XlgyNXVTek13KG0+M19OfUxyRkBWMDtYfWV3Cis3ZStRbjImTEVucVp+OGM+XkszbnNma3xGSStmYmdgeE5nSShnXyswaiUkVk53NGFXVVVGVkxaTlZRQXg2TiZHUiViK0VOSTtgRXY8aCtMCitTdnF0eDBfVCUxKDkzXlh7MTc+Y0VZdHxrNkU4XkN6e2RWYDQqKmNNeyRNY2ttMUxlek1WZzxacUxWe0I3Rj5sMURhcGtqd212dn4tSG0hCitKaD9yb2wxTll5Z1BZPGMzemR1Jjl8cFotPno1bmxyWn1KOzVfdyQrRTVOVj8hcE9oVFM/K2RvRTt3YEsraSt0bjdHQ2hNNG5TVG5WST1LCis8RVh4bV5yU18xcU1JZDZ0NjQ0ZCZXYl92PlVYI2xmO04zSS10dWUpclRGdiVeaXYrYD09YSMmKm85JDBuVjhEYndLbUpveTs3THAwQ09uCitpbXFHeWoxJXgtKEY9KV8/ZztqJSZIM2spQmopeTFsaEZxclg4dFM1OHJ3UEIralZ7VXFNSlVDKmN4Vn5xSDVUbXUmNXAxdig9UlIqakpXCitrR350LVReWGxHMCYjQnZ0MnBBN3RBaDFzIztnIysyI2o2ckQ/R1IlMjI+en1DTGN5RWtQTjJIc0djI0s8Z0NsK05jdW4zKDlCP2hCJD92Cis/Vlg1OTxzZWQra0RKfDIoVmRjWWZVO1NUYz97NHZ6fSNHOWpRWV9meHtjK0g+IWF3b14mS1dMOXktKXBBTkdOMGpENWdWalRhQl5aa1M0CitoYTY5d05MRCs5KGNuaWs7NnVuMj8kdjd8NXBCMHdtT0dEaSpSUG54VWxFWntaYT8hNDlFMzZWVjN+eF9xX2koQnxraUFMMU9xS0Qpak9zCitNenZ5NmA9UXUqYHNBX0srUj99Q2BsQmFxdDRLSVd9WGV7SFVUWWxtO3lzV3JZMTF6VDZyaCNFaXRgPmg7NkNTc30lPVBYQEtjcyhCUnlFCitfPnhHI3Y5QG9HWiFGalZgYHdeIzNKIXNyTV9ZaEMxS1lLMyhGUCE3QVJofWpQX2QpK1dzVDZ0ZFktODU0RVJMUCheOFkyZVVGZ0kzeUhtCis2b3x2NiRudml8PmgxUkdzVGBkU2E1PlB1ajhVVlgjMyVUN3VHLVgrMWo/PSZgajc+SDxVKks/NCYhdHxsNEgrU1lrVykjUHwwSjd8WmV0CisjUypISFQ+QjV4Rl97ZXM3YigpQC1XbmhYb0lJOUw4PFk9N2xEZzcmX1ZhdUZ8WWlVKkZYZlY9UTNxUFQ2ZjFYbX14dnZ1T0NTMnhDaXtUCitne1MyKT82ZV9RMCNmdT1qQ2JHdk12b0JZaGhPP1V5O0x2SElzSWRmVjMmVVlpdElpeGNTYEpvJkF1fDluSStlbkgpZCRBMjB9PmBILUV1CitRVjlaQD5xQX5VLWlMRz9eO2dte2ZQTFdLZn5uTSQ7PmBUX2sydmJVZl5ETnpoaXpuY3dgMUp5bChJJVkwb1g8VWVFKEY/V1dnI25oZSV2CitFQXQmbWY/eGxmV2Q5dEZBKzRDTjY5TygwMio1dTNhX0lBaGNidU9MaU1IUClNJjM0eWA2VDhQV1cjKT1XXlJyS3MmbiQyeU1EbSlxLTczCit+cF8pUno7KDdwRnZSOSZxXndKIXI9biNiOCpveyokeG9LZXJtWU5wcVF4QiF8bXdxO056MkVfQHtufTAqcEAhUy1lY0JiZmBpZzthNC07Cis+eUMpWUQkOUsoY3g3Y2okKTJfQGlxJXtGK2Y+ZXwmJnczb0ZqWDZ6P31haWJwTHsmQDFTbVZPaypXRDJZTyl4K2EpPSYtKnkzTGNqc1VPCit5MTslb3omZHJjfkZeV28+QUlVOH5Xd3QtRnVWPT14bSF3SUlAeGAwP3Vwe09rP0NDQmI4KFZ7JGhzZTE+KHB2c0hhODZZKilodFk0cD05CitRandAKmV1aD5iPSskV0ZWVjx4U1VlKFkxOXk5MV9aQWh4elZzSiRUdE1pKiRZSy1PV0g/I0dnV3wpZldiTGplYzM4Ulp4KVo3dDx+Oz9qCitHUjNHcG9zYVZneHBaJF4kVDUoT3shO1oxP0Nmdz88R09WOGZFKW5vZ21EeWhHLWR8YEgmfmtFbVMjWTcoU0NnajNEcTlFT3BnVE85d2xVCitKZlBXciN5U1gxJVdWKiFaTHpMSzJUSnt0OUZZWClpKHtIWSs5Rk9SWnJGSiVnSCVDPE0mQXEwPzRIeXZyMitwUU1KSS13fCowfWRmKm42CisqQFpNMyY8JHNzUE5ncXdJYzx6Sl81RipOZFZmOXgwLUNISHQjb0U/R2w8JDJPZkxWPGZpKGhAJnxYU3t9TlRZSFdFPXxZX1EhUHBgKVZzCispM0VKYFBxT0NGNDlPUFd9Z1NxcDNGYUlUXj8/YWVuc0U7N3g1eW8lbzUhKnAje1p2eUFBdEg9Rj8kWXVpKXp7fkJkQjElPkdXWE1lYylGCitzKj87VWBgKTwoPG5WMSFOMTY7YTAqLWtNUCRPaEJON31mUU4tIVp0Rjw9YHhuR2NZV0k/SGZRfGxoLWs7dlRCbFdseSopcFg5LSRYISFBCit0TH16R0A0Qyt9NFZNWUl3fEBjPWA5I3F0NkAzNCFUVVlsTEcrSW5ESilWPCR2VW8hZztiIUd5TGhOUyNjPVVMdEBiVVZLMSotZCNMWUAqCitRQ0NIezMwSnB+aztTfF8/V1BYQkBJY1gpZWBKQlV5bz10dmx3UX5rUElnX3hie1FwVWg9KHkqcihmb2EwQktBciFIbyR2QmRnWFkpaktVCitsZTh4OWBLJVFiWDc3eCtRTk1rNTxaaipmM2UxcygzRnhCMzIya09RK0hUPVhMUykmQnJjTzlLUUgwMDAwODBQfmQ9TXskcG41SEpTLTA4Cis8PFEwMkJaSzBCfnQ9RkpvX1FaRERSP2IxIVVaYjk2M25kQ2doZll2ZVclZjhXMUNxeSpibnVqekFPYF9QbT87SkI4eSgxIy1rI254X28oCitPTiE5UE98QGZYWV5yUHtAN2YmOU1saDRUYmRjb2pER1ZXV3Z9RnNQYGQ5LXIjUGpnS0RKVUIhdFMqY28jRTdkWiNJNWgkaXR5LTR4N3kkCitgUCNaST1vND0kc1JDcEJjJVhgRip7UEUyNSFwU3t5cCtjeVlwT3RjP0xHJEB7ITtTUilVd2ZtPG84K3xSb3swd18oX0BAKl5UTXpyczZNCit3XmhUOzlHdU5eKU57WEU5a0F7ezsoN2hlaklyKT43a0w8djJrViltX1pfWlR0RnZ3RTtZbWp1P1h2Mml+aSt9QkUjZ0R1KDB+dSV7ZGhICitJfShBcDk2aWRHfENWTGtrJHdXaHFQNFo5YjdrbiNNJHhkPH07I2dBKU5LOHkmO1Y8bHJoOU44bk1aajJ0Mz9Bbn1JPEs0JCp2JSE3Z2l0CitORyQ2YDxRa0pDOyh+dXA/fTMyNHRtUlQ5YzJVbnM8S2NmM3ZGJWYjPjRsIXV9ISE9fWpaOF5QUj8zT1ZMJVowMTA7S1ZxO21uZT5HdT42Cis5TjNkUzJ1KV81X1d6SXZVc0N3USRLTnshNktOSDNPMXNNbVBKTHVoNkxGWUpKTTs4Mn02TmBranF4ZDFOclA3YlFkT2MyWD8zdmE8Mz5+CitCdT4kYT8qWl8yUXlXVEMmQlo8XkFEQjlUYVVWV0JLNl4odmt1QTd5PGdBPF5jfjxuP1c0PXcjMml1MnhyOWxeQEZUKGVucUZgMCF3PjlsCisyQGt6RWEkPkh4LWNCVyRCdHQ1fTtTJjJObUw+bWNGWWdFVDQxWWppVmd4VEZOcD9OJkB6KHU9clA3MmF7QUNWTWRhSnM9K2xEJFJxJlN+CitEWU14eVdecWpgfTJ1OXxiRmQwX3VCbmd7NndhUXVhcnB3UWN0NmkhSllPRDVpMSEhKV93eVAkb2xtRmJ3XiVAWipYJSNhN0Ikd0EwX0NTCitWb0Y/M215clh7NTJDUExmRUxTSmx5cih7P0VxdnRqd2N7M3UrYF8rWjs8dTRjQXJ2cjg1eHpKSzVUWHY3SSlyUn5nc3g0fGZJNyVzYm9eCit1fT5CLT9FJEFSPXFwVSh1LVQwcjRlRiR0R004aGZlOUFnaWEmODdUUCRoaGk3U202dj4/Qm9nMjxkKUVOdFdqKUZkTCYyWVY8d25yTWdMCitVY2cxUG07SXxOUChCZ1AzUnBVLVVvTml9RW1QcGVrJVpBYGZkeGRGU2l+PitYcCF0S1krK316UUF4UChZRWU8WXpqU1o9MVlhTH51P2ZwCit7TkAmenNxeTN8VEYlJjY2dGAqMWghfiRUNTZHJkpLYW8/Jk1DeWoqUXM8akl0LXk5Vy0oaURnR3RjaVA9NyltSWZpbkA4IUpGamdxNDg8CitUQmpNJENyaTdfYUllNVUteGFNZHU7T05AdD9TaEB5YVFTV1BCT18rdj5Ce3VsR3clVH1WalRMYjJWTG4oN1Y9Kn5JNTtpNkRMMjVJUU1XCitablRZIXFmWFRKYVdJVDs3ellpRyRZJlZsZl5rSk80WTI2JEdFXm5rbSQ8d0hSVG0taU42b1JQQyRER0p0eEpMJkozSD40KDdKVms5TTAmCis9bzBSYFZ9ZG1ueXBDYkVBZiZUeX5jJnswQ2p4ZThUKUNsRkxLeihSbllSPT9tR2BERGt0WERWdyQhcSpzdXNgb0MqKkhqZTFDQz4wRiVtCit6TmE5K1RHPWtZUkR0aG1tTnMyTzQqNiM8KTdkMEckdENuRypQVCszaklSaU1lNipVXypVeSp3RX1MWmlAVk0xbz9fZks3Y2hvMylUZ09KCit2TVUwJHotVnRsdzlhMDlRXzBXYkZ7cGNPfWM+dT9ZUUglfUBPSkh1S0JaeGdYX0ZpJihYciNpdiZKdUVzRjJXYCNQbF8rSFpxaXxhRUwlCit4KnNPc0hOU2YmQiVybDxIcCNHRTxlck0zbTVTUXpfXlYyNzZYP2M5VXlMbzVoSzxgfWRhNFhxZUdhPkYxOVNlaV50RGE/eVd2Tjt9U2JlCitMMSZ7SWB4VkcoRF8/SlBeYnl0RjU5OHBYYl48eFdNeGoqNXw9SyhnP0pjZWtAa29TSWt8K0oqbSVVRUF4VWgrbG8hQ05UJmxNXnt3WjcwCitRQkE4P2txQUV2Y2IxUFdmPS17SShIRH5MeHg+eTJQWW58UzBTYD9TMHJGVWJZJWhvWl8qNSUyUnx7Unl8QURxVVF6KHBhQU9nP1UpVSt8CitmeXlVfiVvT01ZWXdwdUlYN05zRHd7UlUoOzd5NXo8UWUhckA+NVBlJHAtUmN0dERvK3AoUDBlXmU4TDc5SWhqcWNjYj9PcSkkaCUqNmN7CitxSElJI2Fac3NRPXFmVD5FQGo+VlRydzZMZCZUMjNeaDQtQk4xSUt8MEk+WWw1ZnkwfVgwV0dDN3tLIzF8S0I8SG4xX1Zkd2NVSHU3P2JnCitVRyo0UmFZSSRtWWo3Skx1YGI8QHFJeE89fEUlZWBmMz55bDxvTTk7eisrMCs8eXshJUhybUBHOGdiMzIxPkUkfTZTaDx0e09HVCVecXs1Cisyd09Qa2diTSMoPlchM29sRjRfVk4qZ3htKEMoNnlwPD1UUTRjYGFfZStuLURRME1WYmJ0V2B2KGwjWX1sdlZ6Qk8xfjFqJSE2VF4yZiRiCiswQzY5cSZCK05RUkt0UFFZfkZHb0NDcCNVc3dIfDtgbGskVHZXYldqSjtze3I/flNCZWQmNUBeZ1ZVcitpSnZYXjxpPWhjREVNJjc2dUZFCitub2dTUnA+aDh8OCo2dHpYekI8dExCNlh1UihQQ1M3QzJ3PWtofWJqb2lRaGpPQHZhbTZZT3xqRl5rbHpgNTdTT3R8aU9nUWd3WmdJc1UmCit6aVVTSmBDNi0/ZEVJaF9zTGVxN3J2eEhvZEdaaV5IdzUqZWJfKjx0eXE/a3BMSUszPz1oRkVjQF5lY3l8WT1ZaDRhRHVgbnEwXnQ3KkNNCitDQ3lJd3FYeXppLVg7akJ0X0pGPEZnNFowUHEjZ15EQHt4PTB0O0xKQXYwWj5aPTFRWS1PMDA7b3tsQD4/WT4qdGhMMV5AdjM1ZFopZDAwCiswMVJYPmMhTloqNlUxWmUoKldiN2YoMlZgd2dMZDk3R21aYChFJGUpcTIrU19HMD5NPH1yRUM3MV92WEAoV1oocU1NNTBpR2MrNV5ifVFOCitSXn53ZHF3fkkmWT8pXj01QnFNMUsxTEkmY30yOE5NQF5LTVkzJCRtYDFUSUJmUDRtR0s0O0FTdkgxYz9mWSF6IyFJPXxhazJCU2BsUzclCitWTWxYTnc0VGtqMndDJHdlV2FTQHZafDtrSm5uVi1JdyNBQT4rNzU0dkopPWtMNm5qUCQkTVZeUyhVMkpTQmVVNGpSPitfNnptdVRQeHRTCis7c21BYjlgPjdvPm5QSUJwZnxpLSlmM3VOWD5mR2AyaCR+RDZxbiNpLT1CemVjM08ofVNNayVRfUljPXpFYmU3QTQxPEFWKSo+NylHKlQzCitFQHZ0Sz91K2BhM2h2dTdwPnNrfnRRdzk2Rkp2UWF0SDZSQX01Vl9NMVE0KXx5emxqUzdgZHVPdjVgb1I9Z2AyM3tjYEs9dmB2ck56bUdNCitqKXtVUSheZWwyTWlLb2ZvbkRPfEU3SEp9K0xwWHM1eyp0aSNaZm4md1kqMld1YnBRWnNeUjFtPClEZGc/QFNER2NRaG9nWTZuT3IzczgwCittNEZBITNCeDUjZiQ3JXFYN3Y5eSRtNTJ3VVJyc21UaWJQOT5vanpSUkc3P1dvPCZeeWpeS0R2IVZzdExMcWEoT19zJSltREBSYU1iJUVqCismI1J8e15STENNQXVmWGAlbjIkYVkwJlIkYzhWYUE9MmVrX3dLfURSZUVfckxBYzNGZ14zdjk0RyM/QkBTKHJ0MVpsKz59SzJ4PWI5KTc9CitfQ35hdnxuZ3UkWSl+QXxoalZneUNkc2Z6cT14MW0oMHtUUjVBd3AmXjEtV25JTCpDbkZpNShRVmExVGs4JSFaIVRSQjVLNXghfko0KlJxCit8R08mITBQNTFtaUNrZ0c8eFh1Qk5GM0M2QSRaQHdpJDhhc001RmtNaiZSYD1UfWooKzE+VkBFM1hzb3t6aHNNYl9hPHNAemtpUCE+Myh4Cit9VWU5ZjE8VDZ+ZHM2KX05Kjs2Vn49dEore0taKmJjO3I4ZXwoTnVnZERpMGlfcUx6JGdiXm1fNnYrTnh9TncweEpSPzZ0WGNYKlZMRihvCitEM2JHQVdWb1ZQUyRUVy1JQkg5eilRZG9rVEBOcUpAWE9CVikmWiQ/Rm1rZCFxMCY3TVBUQzVAUHhaVSMkNiFXcT5zWWMlUX1gRm1NZ2dECitXP1NBNDUoZl54K3RnJV80S0lzS0dzciEobExzU0k2RWAtQnBXaE15ZCU5MT1WZD1TN1BYXzgzNTZ+UXRYdTQkVG5XPWp2a0VjRkJTWldDCisyc3MpakpWU1NFfUB1RGpxbEVgdEZBTmN9OVFib3pSOTNVTDxHZSZuKmZWVERtSHswTFVve15Ha0wpdmA7byM3Z2dYanpeSlpLcj8reiNECitDJlBYMXV6SyVzLWVvUTNJbDlySXYzWGl0LTlCZTRhIUQ3aiFNRURZLWEtQGBuMzQ7bUl7WT5GX0ZLdHFyTkJSTGc3YDc5bG5BSiQhdiZ0CitMMmF2TmB3KHMkXktEWlZRM0lic09BR2tIcjFQVX10QC1JfDFpfTdqVW5BZ2RDam4pMHlvTnNSezwydyhDaEBKNmwwOzlzN0ooaCN1cTNZCitgfUpDSGN9b3E2bjNkNmNHNj1XQFJNdVEqa0N7ZylBO2Q0ZytLR0BZKiVDTT41UG18Q2tVPEdeWDQyQmBocjBDSkRtUiMtZEwmR3p4bEI0CitSQDxic3VIcE89eU9BRCk7XiFxcyUzd3V0VFQ3NkstNSZOeHBTVT94YlkwUyVnO2U3KShpJTZ3O29DME4zbEVhSHE0P3w4alokJldsfjdjCis7Z3x5SEF0eilCVEhMUigjKT5sU2g9VGRNUVJ0NER1dHg/aGw0eiVFRjxwNU1BdjFKYXRFUGFwSnVvT0h1WkJ0USlXZ0FXZEJ8JlJHb19aCittMXdxI2FkO1k3Tl9OaHJsPFN+ZClkdX1kLSg9YzEoNVY/b0xCaVg0TCpvckdjLUk8e0Q7I3VaMFBXUkFmNE9GSlN2d2BiWC1YYnZ9dk8xCitOemNkdXA8bTtoQFdwSjNJX3xwPE9pMGszcHhzSXUlKXZpWFAqKldGcWQtT0VUdTdCcTZXS193N21vamAoSENpbWI8QT5wRiE0Pl8/VXhkCisoM1ZScm5jfDxDO0lkdClmNGF2Pn5Mb0R6ZiZIYiMtcGZESyU/Xm9nYWN6WnJMVUkrWil+PSkrTikxazFJbGc3TyNtOF9VYS1VOGBCTUNmCitDJXk0aU4qZFhCY191JVg8Y0ZiTkApYUI2PXIwakxrfE93Zk1kQiZhWXd9JV5xI3FAUmI4NCZBTEUqbEpjWiYtUjN0czRtVChrJmpgTFdTCit2M1lOXnQxakRHKUZza2lrMz1UVjY4UkcpVW42R1MoQUBrRlVuc1FSbl9WVGN0QFZKTippYSQyPzApbUxpTUF2VFktSk4jNGB2aU5iVlJuCislKmRHPEY+V1ghWUw7MThPVF9ESHd8SmlwakRLKypmVjw/OE0yP2FqTEBOQzFnai02V2IxUHxxKHQtSGc2JW0yVSF7Sy18N3YtN0hzRUlCCitwQEZyUU96T3w0fjM1MWpxalkrejkpUG16d2NAc3JeeEo5QiZfTG1uVFE5MC03eDUmQHg/dkljRTNyYklhZXU2MHcpTHRoYmtUXnhjfUFCCisocn0yUCloPkA2YVdBSzJtdGV5N0RyTnYmXypFITAwMz9pMDAweUswMDN9bGE0JXpUWkVhejBXT0ZaYlhtNThlYUN5QzAtRVo0QTVQJGJ5CitMQVdSKzZ9SGY0VzhOMHpxYnRAbkw2WXNvRmp6KlNaUGxgPGwycD1RKiNFdmVpbGp1I081MnpEQStvOWE5cTszSiQ3NDI5OTA7WUdNbUxnCitFTntUfSpxJGNiXmlMJWswdyFiSG40YSlIWUU2VEtIUWdQYGR1UTw8ZCUqdz5CbHchTHJzOyZEZWx0dEc/b2p4JGRHalRZdUR0OExiK249CiszYChvOHBzVytMYXgzRWxtNWV0dm0oSHpTdn54N1c5d0VQZG92RjEjYEllb0d9K3FMQ1NnWjZ8MDduN1ZXfXJDWTgpbjY7U0ZpWEZoPzFqCitNcUVETWp2Zjs+ajhsK2g/K3Y1Y29gfFErIUVeWTlyKTw9fFdUeEE8PSt5NihfTCRLfVpnNyFTYkA/SWpMRTtYSXJqUDAyJjNqNjw4NHwmCis9USVJTXU3azxJU0UydSpIVWNCTzRPKWN0O3NKfCVkYUYmeSZ+MHNVR2Y9cWphWVFUaWZDZjZJcDA5MGk+bEMrIylfQWw4RnxDeFI+OS1WCit7PmklOVpjOztsZGZ9SzY2aS1yKj8mQ1RiJGZWZ0pye0lFMFMjR3w3Vlg+Rk1QYyt7fEd4JDUtNmVVO0RFTy1lUypVUllDODx3R31XdSFFCitPbnJoa2IwZCZLZlFaS0pxc2QpSG0kSUUpeiMhSyV3KikoTkklMGZaKkhvYjZ9VD92R2ZhRio+e153S0RxZ2RWb15QWFdsS3dsMzFHNmlwCitxIW9yT1YyeTE+aCh2TjUqX28pTF47RlkzakhSNj84OE1QUG5RO2BFOGgzTWQ+JHJVVndgcnNQbWUxWCVNfTxlVl5QYVo1SUUxRF5gKj88Cis8b1czY2EjcjxRQmcrKzs5cl8/ITFMVWZgQlNtU0RlWGdNOylPa3ZNeDVEPGs8WEw3TH0kSjhyIUZMSXlGSH43VC02P0Y1MD8+OHBSO0tWCisyM1lNXkwpbzMoR21pJHA8eksldjBaZVQmTFFgKmN4WU9hJFBKbnRFU2tgQDlEM3daIU85Rz5rZU09cnlrWU1PWF9KIW9NPzh9SllnMiZ4CitnYyZ1XnRIX3BEVHJ2JEprJXpaY2ttXyRiMC1jN1FmcHNLR2BGMS07Tjg3JVVnVkdGWTs1aUsoPyhBOEROVCQxKlRnN3o+OVFndCQpQTc8CiskSlZBOVFHZzJwcD9LTiYzR3x1ISUkVVJWdkR6NFhVaEUwJFM5e0k1OUQ+Nno5PVJsODxUTj87MnFjNkM7XjdnR0ByKipzVWUoTW9kR2pQCitiUmRpaXo3NzAyJS1gNnVpczIjeXdKdiV1QWAzcSZAUlBTUnlJNm1uXkhRYTxnV21gZzgrdCNUZWx4Yj5XeXhFZFchSThONGBudCVOX3F5CitSUGpYaH1aN2YjUDJyZldBND8/MDZsKlI0NWFuRCZzTTNGKnsxJjErMlhYJlJxMWtiWDBZKCRuRTklXzNlY3NhNDBvcFA5QzZfRmxtfSVpCithSEpIeWJVUzxnOVhPMzlhR2R2IzhJbS1JQCQ8N1dsPFU4NyFhSm45ekBOWDRtdj5BUHwxZEpXdmM0MyZ+WUAybEdXUm1MTTRYU1hqcVF9CitnLVk+emBiODh+OU9nN0UwUiM7N150MG8yTmpPcDk4UH5JckJ8fipUNVZudChfaCVQcF9oK1g5KlEzQjdjNzNEPWF5YjJ0Nk1jPSVAVHF7CitxcVFMe0JzM1Yxa2ltfG44RkYlc3VRKz99JSloX208PXt+OUZYSHAxT285X1JBcjExTTs7Z3lDU1IpY2tWRyR3dFNtcUlodGJze2RONXZ+CitIK1hib0VYM3FMfT1uP0sqcC0rI0tneygwKGskWm5yazxhYUd7dkF7X2hKSWImcGAyJSp4OT1TYWxUalhhe2p7d1otWFdWPXpeNTQyMTNBCitZU3RGQ05SQG9nKz84aUtPXkZjRSl4aFBDdnlYNjc9KlRTdCU2bnN7PEQ3YDdgbiRqLTBCd0o0MFpDd1dJamE4MHRSSlA4fDVXaEJUb3BZCitycX1aZVZkemA2I2chWWpLZF4ob0IpPyV1bUpOSzc+PTJVO1lBUjZ0Wlc9aXBxV2NPJmtDNn1nKGd+JVl7Iz5gQGdfSiFKY3J0MDgjbjM3CisjMyV3aTVKYlAmTWRyRVNyTjNSKyR0KWNFZilRcUJXXkRAUFBXI2lKbl9TeEkza1JSeFVGUE1INFpMWnBKUkVAUiozPWtjI3ZwU003KSZDCis4cUF1bmBfJnI9UHtBKVhjbnxYNk9wVTxicz1+b3tlUHlUTHN2TExWM2wpVXhAYmI/OUFoXmtMOE4lWX5YY0ZiOWloQGFTUzx0THNvJnxPCitSNnBfUHU/VzUpZ0EkVVRJMXlkTUxmbkd6VHhaSVFlVFliJDNBWjBsLUYjZlBAb2hHPGBmVj9jWDJneUhxRzsjaG9kP2NuRU5TbiVCO3coCis2JEhick17cCFoJChAOCpEZVlHVmlDIXNhRF5XY0E/REc0Q3taYD1GSj1oTX5eRUc0O3pYT3drT3N2I0hVelNiKTFCQDQ5QWd5bDU8dn1iCit0YWctZjEtNGchOEN8WGM8NEUrVXg/OHElRmtRKjw0X0hxNTBCTEVtX0Z7bXl9bGxgbUMxaWxPOUtRSDAwMDA4MFB+ZD1OMmBlJEtoT2dKCiswN01HXzAydSVQMEJ+dD1GSm9fUVpERFI/YjEhdm5YPk4wTFZRZyRKYUN3emhaSHdiSjVkUTk4RiQ1T0podThHO2E9dEl5N0R9TyVVUH4jCisqcCh5cV43QXMzV04jMCFrZU1qPHBvYX1PZk1BbTN0QUJ8Pkk4UWxQNVJwJlpgakRjdWNaNTs1VSl2fE5RYGdJZnleajVTezx3Zld0SkoqCitQRWw9Izsjb19TSEAld1hgX3hjIV41aiFYRiRlKFF3NjI5LS07dkd8TyVabj8zQCV1S2Jqc3cxfnA9JShTUzk5Mkh8JWI1cWk3dVkoWG1BCiskZ2NKQEZTfncyN2pxa2xiNE1NflF4Syg2UyVxPFM3Q2d5V0s5IzZCe3tLeXptcCtFRDlUQjR9Pk0wQiFiaD5PPy17RTR1JURtdmwjclleCitqWDJlTXtlK2BTTX5eaDY4Y2FJPnBDWi1vdW4zdSZjZkFqSUo2ZzZZWHVmdipKa1p5V0g9bUJJTTxANmdGWE8+ezF4R2R3SUlCZGg2V3VrCit4I1FsfjUqP2FHQz9wQilwYzBZe29za0B2dFl3MitwOT4+ZTJXUHxFN1J9T348Sz4xa0NCQ0I2P2N0RUVLdmNYeiRSVkNVaVVZWmA2ZTdfCitfSGhfb0w9bzVVPUp3UlhLPEFCMl8kZz1EWCYhZDVsJWFqVDYxYzZibj9kVzk5I2R+biRJT0Z+Wk8wNEpfMnFoZTJkeUJHNDtSODEoT1ZmCit2IV5OPHoySGJQPjVvanhnZW5JeE4zRVFNIVQ7Pm43cFdhUGNnY297d0BqUXp5bk5CbjV3bD5RJFZWYTRmK3I5fHVVY3AzSDsxMjRTWkpvCitlfE4lOGhpekpMJlEtVSlPWT5CKEwxJHY0YCtWcmJnTjMzO2dgZylpYElXcX54VyU1R3MmUTt1UklGJkx2Knk+bSY3c0dKd0JweD1LQTFQCis7ZjxnT1VYZ1g4dUMpS3spVU9oQUp5I0FrN0lpMkZ9Pmg1UjZVa2tgVXMoUW5rdTYrLUF6YiNLV2kwSnl8Z2ItWCM8NTtsYHVeeElIMFJWCitUX3ttdk5aRCtjTH5ITHUtN15fK3FIJS0hPnx9Sjs/dGU8eDBWWj57bm9iUmdJXjJhNmU5a1JXSEkkNFgmV0Bkc0M5YE8paGhgOCskWlomCitDUHBpLTw2cERkU0d8cCZBSF4tTShEa2I8bWAhI0dtX2REYygrYjc7Zm52I2BAJj5VRmQ4dkBEQy1DO0RJZylMU0psVXx1eT5zak93YFJfCis+QXheMyg/WTFQTHtpdHw2VCFnUkI1UDRVS1ZObVd7RXsrMHFreV4mTTA9VktAJWZpPTNrV3czYGhBTGNFPzA7XyFTeT1GfFZQcEdlfWJtCis5RTVLVyZzPTBULV51ZzB7dVlrOFBYSWUweWIqK1FuQE5LZkVMOTU1d3xLXmYmcEY0UnM1UEZEZkg2cWJ0aXd3MXZ0YGd8fntqQGRtamNfCitHc3ZTWG9MOT9rXjdBQXJwUCQlZlIkezZeNWVaNnB6ayQpcU4zTT0rc01gMnZiUH5MVHYqKGB3e0MrTXxFRGBEPyh8VWRlRkVxYUxobHQ/CisoUVI5cl9LJWZeeSs9NSlLJjF3Nl4kQFJhPVUtI0s5OGNgS0IhJmxpUCElb15APXlpQyk7a0d3OXI7d2lfcT1uTzRmVENXYWNVYiReZ21FCitiMHxYUVIwMDBPOF5PWTd5Y3p7cEZHWTl8eDUqK3tsNiN4SkxhQXxOYVZ7ZEozVlF5cXxGTCE4VldvI35SZDhKdzFrSn5tOWZBP1FPeEZ+CitHckVOdmZ5TVlPPVIqfktqbzlELWdCYz9iZjVtTUVLRFN5Vn5OVWlZdVI4SXFEbmVLX2wkOSZETU04UDNPI0dlaTAoNjF8SF5DVVJjdz9ACis2UEo9c2tgczNNcX54T15aZjFsQkZyKCQ2ODJEPXVVflUoSlp5VTdZakZEaXYxb1d2X0ZNdi1fQkg0RnJnTSFWJEpKI00tfEomQGtwekA3Cis1aDg7dipENSpTKjNyb0dkKCU0YWB4STFleH0oQS1Mb2VnbHN5ZjUlfi05dXM4bWJuIzVfdFY8ZCVHdj84SFQqZXI8U31mOF4yKF93MTdXCitJaWJtYW5DP2okJkM1PT57WXImUUNGUDIzTmhSY3dtaSNaNCk+SXpgVD01UTlaRnlUMlNmKyklM2B1aVYhd2Z9SmRYMHxhI1BhOXJHcTJ4Cismd2VJWk0mSWlXSW1oPnpCXz5FPTxQfDNXVCNYTHV+Z3hONnspP2JVbyRIJTlDe2BiP0ReeXxNS0Ezdm9acE1OSV8jNGtvZTt5KG5oKX1lCis4MG45Q1pPYkdnfSltMEE3KG9ASn1lVnpFRk5GYk0pMjleeVVJcFVsYGdPKUdpP0JxM1E9UWwqQD5IY3NtPzB5ZyZ4MD8lQH1HfmRQKSVSCit7S2w0KmJMdkRURXshKE1UZURjMH58YTs3QTQtc1dRJH55ZjZ8aEZOYi04NXokZD8hR3V6ZFJCc0tSQzwtUE8oRmFDb2V4ajh8MCNRSk93CitHa29feC1+RHNJSj5lRWckOXJfa35iMHUqQD8qdTtnITt+RU14S244WGc1c0dmZzRGVGNRfDRAa1d9QlVNQDBxUFl6bndfamgrQDJvT25nCitBaXxrZyRvKEN3P248aGUoI3tzb1VCSWZDWmZZJD1zVURKRjtgaTFQRTY5P3NGIXA5KE1JY3R6ekZwM2hQT1M+UDFqMWY1c311c3pwYXYtCitvalM8d2tPYmc7clVGSDE1Xk07bXxzJnpKbyZBZWRMMFQzMWBEPkt3NjZwP2hIQ0ZKSz9pYXEofUYhYE4pQFp3MlMlYCNxYUNMYyV+JDFACit5fTQ0NDJLeWt5ckh6Q3tleUljMTgjIzI+STVOaDhaMkduNjYmUShHMz81WjhEPElIYVFOeU48Wj9qY05ldGZFSTklZ3x+SH5iXkhqfEB5CitjQEx0Ym9rU0UzVlVZdHlvIVgkdlowZDBJaGZMVWUwZFlTbilNJUpiIy1aYHBSTXhja0RqbnFHTj5na2IoXmc2aHIjQntYTTNMWD5NTT8rCis7dWw7NUVxP1NrUlBKUm09cjt9U1p4RD45S2Y3ZFJIV25DQmtZekZtQzAmfnY3ays8bFRxRlokcXVabmxsM3oyRTNXe3pBMyleODdLZnpTCitoXjtgKDQ5aEAtZVVfXmEqKlNsPl5ITj5CLTFMaVd0fiNhOXZAdmtuLUx+R21uV3F4ei0oPWhJM1pRaVprRXFKYThAVUZOaiFZX3U/QnJ5CithNFQwbFViRF5HfHJXdVlWRF9VYmhVcmh2Z2BTX3xPZ2AlKTs/QUZLUiMxUT47JHl0cytTMD15M15+RnptN3s8M2NDeFpgSTFPVExOYTRFCit+VnJuezJlen5YUUM4YHlHanUxWjFrR3tmcUQxRVo0SlpNY0hNZFcmSzxeMDRLUT1PJDM/T1I9Tm5IQj8hTzhDWUcjJT9+aT0hXiRvfjlOCitgNEVGb2tzUjNLUGZAWURFZTNnPmIyNjwtP0QtQ0t6Rk9sVl9rc29IMTVHUHN2ZyhuO303KUdAb2Iqe3B3VnJlNkYmeCRyK1MzN0Qta3pYCit3cUZIYnotSGNPKGxsYk13eklSVW9XbDU/UjMoX2g2NkpTKVpyPnVNNDVmaTNrVmJGNGUtbEF2bnMlbklVbHM7JHxGOX43dl5ON2RudVlhCiteckpePEJeYTh9SEt6RjBSNE9KWCklRTU8Mno9XnIhQyR0WGNBSHorVDFSYTlrYE1iamRyNGg+JFd6eWVEYm9SWE1TcE5NOEd5JCZnKzI7CitIaS1UaVJoLUpUcmJYd1J4KHpTTU5aeTF2PTA7MnYzYX54VT0qO016I1pEQ0Yjd25NZk9tITVhcXhCNnVkKSsqP05HS1FoT1pkZ0c1ZTtWCithQSF3KDY4aFQ1RG4mfVJ7XjNTbzlYczFnc1hueX1rOUc+ViNmRktOeV5gQlFkdGJKIXBVcztKZy05VCl+MylramR7OE1NR30kIzsjKGokCitadW5GJUFtTVVYUytaLSFweEAqTyNwfi1mYUdxajB1bGV1WE9NU2Z2KHdnK2pmZjtVLXw4Plg7byktTmw+dSpWeWlAWGFfdj4+ZE0oIWlJCitoc2o2eU5JKGF3SSRCaGlKb25jcFdwejFBcFJFUzkyb3Noez9TPyNHcHNtaSYpe1JpJVlsWDxqSlEyYCN+N3BhPlVqQEdjMDd3M0xJd3hLCitwQXxPYSttJGBnX1h+SitlNX5zQyNuayM/cng5dz1VaVFUSkc2QV9MWVBsb0JqVWIyZSRTVHNfZHE3RHdYSUYwT0NnOVRDZVNsKDlzS01sCis4RlF7Vmo4SzcyKUdvZyhaYUcyKjxjYHg+P2l2cHA0RUJMLWFoO3UjRj1QISp5QHAzenduWXdAM1BOOCgqc0lLen5lS2VaKHUzUDklKig7CitWSWprbSY/Pnd8XjUxMEktJkhNSyg/cH0zOUIqIT8we3gtaHE5dXdIUEJIaldlMHI2c1JrUk1La0Y0fi1wVXVUTjVOdjZpQ2pTJVRwKVRNCit4RlJlO3QhUzlLfGBzTzlAJWdVVjFuQCRKU0tQYXAydVNLNDkhOD0yJnJPJiNkWkNVMUpBR3lIMldpQiNleiZwa1klMHtxIUp8P24jNXVGCis7Z3VDUjBOZkZIKGklTyU7cEhqcTh3WmpfZFNibGQ+a2doRXslNk1ZcGhsNFZTYDRYWHBCSnxDTDVie1o1fkx4dElKTjluTEBAYzxxdDQ1CitrY1MmMXlqPmt7cV9PUzgkNkEqN1d8fVFFdnpfdHImVE96N0hDUGtnQjlDe049U1ZKLUE3fT9oRygrWWMrMilENl5vJCg7N1MjbVdAWm5lCitAU25BKUJjSmUzWXRfcEU9NWNiIz9JQyN2RUxaUVglLVk/PD8oeGI+e2MmPyhkZUxOSDstdXBHO3oodVYtLTleLWhhZSNsVDg4K351WnFTCis1dTVkUF9DNH5UNUA7YEs1JUgqWl5gP0x9UlRtIzA2cGB6OyF+cmdFU340RTVKblV5WlNDYiV6PlRqZkhBP25QJkxPVEBLcjh3YHUpJT9XCitUQUNRQjFxZEUrNHZYbWVCY2RjMFJhO08yWFhHcDY/LVhlZnZIeUJEYHx3V1E0PWxnbHdqX2hZaW5wWFNHPnhydX1OWEByS15zZjBqPl9tCistZVFAMV9nMmdZNSRiNDBoJjYlJnVNR19YYEI4LVpDZEczWkFie19pRHsmdmFafipXYzV+Qz5vJEgzSFR5ZnhGNDtiPk1QVm8tfEpTWTRRCitQKWg+QDZhV0FLMm10ZXk3RHMjanR6KG8wMDAycjIwMDAmTTAwM31sYTQlelRaRSNfOUZKRTcyWmZTSTFVb0xRWWx+ISRVK2Nwc1h1M3ZGCitiUHt7NWFJWk9KczM+blpaP1R7Z2BpPTsoMTZhaG52bHViaz8xKExFV1VfWDlHUW5JOHQ/JENVMk1EcCU8X3djIXdJRjReXm1GSGtyKUIrCitRRSZiMHZ7bkA9dCtlNSZuQU4hWnxsUHxeVUU0OWJHcVQ8TFloZ3QxeUlEKGpCWUlGNiVTdDJHZGtTR0xsZTVEQEU5WCR5Mj1SOGQoQCFnCitfKWlZPWtveU1VOHxxP1UkKWQ2enI2dU92IzJ6cmdVbj14N0x7RC16PjNwJClte1hgYUE7c15ZVnBTRWA/bUNuVWM5IXcmRn09X0smYmJPCispRXBYLUgzbjdjeG1DdmkrfDhzPjdHc0pMI0VheHdXKEEyTERRWHNqZk47R1cxMVV0QFliRWl6PVp+ZWVLU3Qja2cyX1VvdEh5WkZWZ08kCitxOW5+SFQ9Y2ZES0Uzfippc1d7eV55M3FpUz1mIURoITkjNyRifTJ8Pko3eUVLKmJZP2NnayoyOEUhfmZYRWEtSnc/XkVOTDdaNGNrYUY9CitQNz9SWUE0RyVqSUZTI1o3UEFnSWc9R01sdExNJXg2eGIhQ1B1NGIzPnlJYSh+TjJmJlloP1h8SUNQTDs0ZSFHQ3QqI3VzVjFBS2lTKER+CisyMDt2RnZudTRxMytfN15TOFVZMGxrVnBPRnc5YFZCUEFwX1JzYkprYlhQOzIhRmswKzRxKi02STFNbjJIJW9fU0JmeX5ZfTt5WFRONiUrCis5R3B4LSV2RGNUczlFVm15YzgrbDxWKEdkJj0pYF9taT9nOU1XQG8rLXZoJk5ATGdyWWNLRiR8ZGUxSE80IW9oVEM3SGFQcFU0Pmp9bDV2Cit6dF5sQytgcm9vdEdVfk1yTU5ZU2l+fVpAc1QxRkolPSUxdFZfflpEbF9mYDdxI1g2aHo/ekx7NFQrRllzQENqUFY/PS1oUXQtaCVxQ3I2Cit0JnlsbGteZSFuUX45eD1qXkwqOE1QVTlmclA3P2lAaTl+WlJJbSFaZUV4WCs0dylibTNwb3xWVkwqMShfWWYlbDRSQGVDN2pXY1V4NjBDCitqNyhgR3FHcVM4UGh4ZklxVT5Sb1pLckckfCE/Sld9WTVXWXNIPyUtYnF2JT4+U35aZ0o2V3xxVHg1NVJad1NrdiNgVS0hfS1raDlfQCZDCiteIUBiVj9SZDN2JDRJbyV6R25FRGxIPFVTZ0lVMXhPdlotU35qTmVyTSs4bExofWFSWDh6XnJ8Uy03SVNXMDI+RUViMnYqalg9NnBJYDNjCitJUW50fEx2JHh9O089NGIhcUppcz4oQnVhQkBEWE87MXBzJFpYLXlnZk5OMy0mKmAkN2s1KEAlezVrWDBCaG1IWGotcnUqITN3WlRjQkhnCitYaXpCeyZ3Qm84fkRwbDBoMkglbjNidnUxe188R3QrMkckdXY5Pnx2fkhwfipIbURVZzg2TW9SSmRGNTVWWWVUWktESGhYTXUxRmotWE5tCitxbU5hTzJudVBKJSpreTJhZWpTMHplez43JFFlR1lHTn4lTF5vVVF+WUVFdTA9ZDxnNztOUCVuSDlJb3EwI2doaEFaWGBFWiMmQV9JNXBQCitvPyFAcGNFMDhlbXRtQm8tczBOKHxuTz5eaHl9eX1WJkhnK0dFN2x3b0NpSUdEa0ZjbzwkdShVRlRWcWtGVCtxaENtT0JXNURjRFhHdn5LCitwMyYjP2wlYUd8QmJJTmJXZz5hSkE8PEdMSHVAWlI3VitJQTRIPSFVflg4fHVTQWQ1REZGIWU4K2VqQTJmTll5REhWRk9Ccm9ffDYoKmdlCis/K3YydEUjaFlRdSokcXB2KzA5QzwzZEZheVQ/M1V7ST9KUzBzTEk8TVdPWk5rTHghVl8mXkQhZzJ5KEZUaGRkeFdDZEJWQlNvQD4qPWVWCitQWGdAVSgtNkU9OElvfUJkPCVFSE1mKmVPVCF5Qm5jeTUrYUoxKVl4ND9KNlR1VH0/JlhOPkQ9SFUla2Q5QkVOJlNZS3tzbjU5T2RNelg+CitFdlVnP3F8Kl8mKEs7PHU3T293WV8zN0w1MmtlJCUwOFFJVWdaMXVmNjVMTWlBMHtyUWB0OzVEUCV3T3c0Yl42cFR3bmN1YFFpMytHOUhICisqYSEmUGJxUXxQSE1INEJsKGJ9M21eNTh1Pmh+Kikze2JtQTJBdlQmRmhpKUQ5Q01gR1JDOGVqSFlsdkkzNnFASkJ7bFFWPGJPTFcxSHV1CitiPSpreTN5OWVxdXhVTHZJb1B3dlA1JjkodnU7alF0b2A5ZH45RDRrV3Yhbkhtdmc7cHt3cWh7X3kkTmFSPmhVJG99dCNMZFojYmA3aFY/CitwWmtXKmBrMDdkVnZfQkp0TGQqT0ZwKHlHQEJyZUh7RzxQKWg+QDZhV0FLMm10ZXk3RHN9anJJJD89MDAxfnowMDA7TzAwM31sYTQlelRaCitFI185Rkp4KEJiWXBMQldAJT9HYUN6LUtZamZNa2s+Qit6Q1FAN2taNXB3Q0FOSGIoRjIkODduPDwmbmsraSpBR1EkRmFBJkNfVFp+OyZmCis/PClXT3hfY2ZOMDBXWTt5P2VWIVAlZXVFV19vKTEtOH5KU3U8PGc/ODJzfj9wUkJobW5YYFAhKzA4YXpDTlliVyNVaExzdUFqdjdhTiExCitfcE5vJWRsPzBvSmNhQmIyJUdXNztAcC1APSFoRmZySlk5dVo3QUNSRmBaPER6PWw1WCUmekMmcVlAVmNTPUp8SUlVSyhVRC0lbk8rRkFyCit5NzZ5e3JjRGlePSFETUc+ZEE+N1JxX1F3NnJKdnhDbz1ZVlAmRXx4aWFeWGs9flUlcSt1YFcyZ1AqfmMqVXdydTQ2NnN9Iz9qVXFQMEYmCitQezNqSG1aSjVSLTItZihVYnlAZVhhaGdMP3wrQFlqbjI3S0ItemhPPHIxZmdaNGpFU2N3a0Z7ZylOaikoX3x6Z2g3KDJqbEAxQkpSYW93CislKC1jQm9wSjE5PzIkV2JJeT90eFA4RUtrJFEyPzFFaWclT3VxRFRCRF48Qz9tNktqXzdeOTQ9KT4qeG50TGU9VzlHck87Qm0rXlNeXzVtCitwamlUeENtezh5R3ohXko/N0lwVEFZX35NSSFTWmpjNm5uUnkkczxPZG49QVlWdnJncDEzV2g0Tlh2azU0MWpsZW0/MURBJVglfTVMTGEjCitjRENBeGs8OSM1I3JaRnI3SyYwcXROLU9HUll3bX5oKENASF5HfFkxek9NeCYxNFE3QXI1NHUwSFFUSzJDOCtPcWpvbkxrUD8/PGVBYjtVCitrKWhye2sqLTB6THByfmRkSTh9e0NJaFprJm8mQnBLZ0JSMENlOUsoPWFoeEdeTlMwNjY9Z1NQKzxDLSZkcFQ9amJ3Q1Y9WnBfUCNlZmUrCitPVD8tfWtUajt+IWFmYUtTRzc8M1ZwVTApWmN9IThQbEI+PHp8al5iVVlqRiNFcDh1S0x+WXVYXm5BZEkoZUR7IVE8Xi1AVUBzRlojcFlgCitJeTBqXlh0Sz1fdW40PzNPciZMLVNeJE14Y0NxZWdFe0tQciszfSk9byhmViFscChhdUV1fm55QnVEPlhJSXhGTGlXUTVfSTElNmNNPEIlCitARVE7dWJ6b2pee0h9LTQwTipiQkowSkoyMlJJJVU5dU1KYmhZZm1mdWxqRiRnWXpDdnl+Z29DdkxPdW9GcD84R3RVSyhGYUx3eHZWKm0jCis4VkpMdEVEMSlBV05mZHw0aHphNCk4XlhAdGNNMHhnbkZIPzhKV1c8P0ktUEl3UDBGV0o3T3FleEtgRjglMCMlJWY/PypAU3pBe2ZzNVlZCismJWd9Uj98XihvdXhvQjRMbHZtPiNAOFZ0bnJwMnE9KmtzMjkzOT5FXndrJDE9Y15Bc2ZkWFljNSFlfU9FeD84RHlBMElHfCZEdlk/KGB1CituWi1AXyhpaXtRdVI8S1Rqdm18SmRyX2ZQVll2PXFUV0djSkQ9REZhX08/YjA9JGA5eD1GOTBIbEVFdURza3whYjVyJSZQajxAVmtCT3Y3CitsSWwyPXRVZGVPVmNFRVNfMnMxM0NQTXUoZ0w2eUpVd080KGlWSGhCKXBVWjMxYz0rSH5mZ0s5QCtXJUNpY2wlIURxbFNqREB+Ukk8aDI9Cit3KWoyZUs3Y0lARmxlUyY0PE9+flJeVWo0UjVLK0pyflo9cmNVU3pMTUBSaDg9ail2SD0/VSNYJXRQdUo8RDNacFp4e09wTn0lUClheGVDCit8Yy1qR15hJF5XPkBFKWoxUHhXbWMhQ1d2WTUrcG01MUlpTyY0QmFKcTduXnNkYmF3I3VFaHxzM0d2aDtpN2JnI35UdE8wRkVOc0VFelEhCiskbW9FWFN3eXN8QERhfH5pRG0lUCR3ZG9mYWtGTDtYZilubHoxIXNnV3lCNz8+QFVOb1I4PHQ0cDhCM2E/IVZxLUdtQCMyUmNlcWVzJldmCit7NjB3OTZeX2pURkJtbjs3QU9gaGhjN0c2QGpeOGhJRmpFPjN0NHpHZFdzKGRfI0lHSWA1djZYeEQ1O3dhU3tmRGltWUFEfV9GaHprVj92Cis2TXpOSiViPHUkYiV0Qyk/cEYyNjZweyg+aihoQklzaG40Q0FJOzs7NkhDZFNPejI7Q09uYHNfQSpKNzQ4RGl7bDk1Vk1ENVJHSXpZY2U0Cis8OG95SjIwK3NVe0UoT1BYZTs4MW8oRlIhYWFhYmZEfXNvfWdGTz5HMiUwdmptbXxBITY8SThrQz9IPm1qXkVFV1VMPnwhajE+VjIxczRUCitRRjQhMWloezI9X3BvND9Oa1pOKiNlQjR6Q2xUUXl4QHg2NGJQO19DKVFLNkMzMTwlOHJ1Y2xLYzxJJWpzPyljVkZJcFBtVUdReDR+Z0FHCit+QUhjPHxQQHRKR3gkQ1ZnNDFnQDk/aiVjbkpGR3dzR0xefkRFPWZKQnRAMzBLMWlMezlNQk4rNT4jWjlaQlhQfH0lOUxmclg9LWRMUDZFCitmIWJ5bE5RR00+eWg5OCllWmM2UyFqI3swYnpsdnMzTnhEI25qZEY1NEUlTGFWdUo1NFJ8MyktKHVraFl8MzlPPk08KUcmZ31nMSFGcFIlCitZKX08Z0N5b25KaGV+eEgmY0gqT2tGNElyIXYoKDwhaExGMnV1RDZYa04zZ2heMiNHcm9xMUFxbXBHK1RzemRUQjdsRHoqNTlmO0N+ZylDCis2JFghSUZKQ3Q/dk5ZfnJQfll+YzY5SUt7MTlWbFA9LUYzazZoWmoqRClsPyVOTStFVzdWdnVydmQ7fndJTFlpTVpicTUoY1B1UFM1d311CitvRStCfT1UNGJBOE1fVzt5WHVnUypKSVkpUWkkMHVSND9neVc8TE9PekpuanQjPDsqKjZ7b1ZRTiYwcDNqejxjfkolKWNpdStOWGN8NlcrCitgPWJHKyQzWn53OD83Typ+RDQ9KS00ZWFAYWNwQzRZZDtjclh1X3V7JkYrMFNsJGUxQ0EhYD1OUXB0dWY+QyM4e15QdyFkU2M7RHlHWUJ5CitGbVVIe0BKcj8wK0BLVDQxYk8/M0RoaEZ8OSg3VEs7QE5rS3UzU0BqbkZnNlpWTy02JWA4fkpQO1h+WkZxJWlVPVVuJTc8VSkwTyExPnxDCitoOFVSNEhCSSomYDByUUl5S1hZRmI7RkFhelp1P2t1fGdwQVhMJkFJb2RZM3FAaGEwXntPRGROcCNRVXFNNU90NT4maX5WdzZ0KFZBbiNaCitHdVM8djktWXZ0QClNKyRJJXpBZytDcS17PXZ0U2NEaykmK1g2cT0tb3RFMXdjMCl6ZEdhNW99OyNLaVQqSCtYdXJ2eklYQ3E7NHhBKyMmCit3UVpgUyQxc1dPelQoPUZoPldlYzVzSVY2X3dsPGA7ZEtDKldxKH15YnpJTztueUVafFZlWSVRWE0mK2teP2MzRnAqT3ctWW8pPzljaEJ9CittZi1lTEkrWH1yeGA3ej1fc1BuYERjPihmYlQ3P3lGJmBwPngrT1kyWDxeYjhBZDg1VU5ZMz4ybmFNKGlIa2tuaDBgcl8mQzckeTNrZ2NuCitVSXwwJGY3RFF2MTB0TUI3a3REYy1eQGx8PWtQNypya1hyNmQ+X3s9c3hHbDZjO2JDdz55U3JtI3c/NWpUX3VOdVFeZUglIVF2RUR6SW5FCitUNXNYQjYjfWROKHNHYnotN2YwQ3pSYXIzU0JYI0xBTHN0IUwjRUpHMVohazhxfkEmNys2O0VAUm19WHohQ3I0dTNSMW1QUC14PUt7PHFnCitRSHdPJHRUVHxMU0NqSGtKb1g4fXY8NGpsU2I3R3w1KWoxT2IoUFVIRn0jJE9CcW5MPm51cGoxeUt1Q1ZwQHZEeHxMdyRPSCRMPDxjbSVLCit8b1NNZ3FZUHEwPj19YVhLNzw0elVSOFJvTUg4MFk8ZXwwcmxPIUpDaUMxNXc8Z3ZeSVklIUFOenZ6bm9YZ2VpIVl2cjZGcUQ3QHAqKT1zCistUj9yfTViZ3VPNih4X3JESihIJGdkPUc9YkdBWT5YelgpQ04obTJgSj9UVkpoYlNYLTZsWkRHTkxoUEJPbm09S29MKiU9dGQpakZAbXo9CisyYC1fOEMzPlNxM3F4a2A0SEt1fnthampLRk95U1ZQY21wc3xpVEpXIXUpV2ZqezxqSnlhZVl3WUZXSjxuVj1sMGdqQnJ9MG4pNTBldWtiCittRWtaVTspMFVNT1NPdjd+aCFuWjlPR08/RDM3JUtqV042bERpenF3WiY8OVpJbkBgUittY0pEeHFNLUdWNzduSThjcUNiRCh8clZiYXh2CitwSGImJiMqWnBPelpgeGQkd0xHYCpUdWcrRn1MSnxiKH1Ab3twQ3A0KlVpRjVSfEx7aUkkJip8cUxSVEteOE1AV2Y4M1NVKFZuQXs8Vm19CisyIU9VKVlnMkdqeEZnYk9qREtiUGRYKVc9JlJrdXE7cSQxSSg9MzcpMjd0PWN3VnB6U2I5XlZrPlFlRy1oNXVZdW5STUFudnUxPXVENlQ1CitkJW9ZdW59dX08eExQZWZVIWJ0OHR1bU4hfFJ0ZVZtXygweD98ej1qZjtGTnVDMTR8OXczQ0g5WCpBPXIrJj1ZI2xjT0VJMT1hS2kpK1E9CitYUjdabmRrJVdhKHdKVlpYeSM3JWZOOWJsTVVjc3ZlUHEhUSpvKkVUQ3RUJiNCaHB4N2k9ZyMze2U0MmIzQSZEPmtieipEdFVASkRwWH5iCitYISVYcFJqV0B2THhLJVJKQXlQJi01dGxaQ1lmcTI9NiN8aWxWbzdsUXZEZyEkZUp7emhTdnE7STNeY1BXaklCPUteU25ZPW08KVZAeFJuCis/NUhBREVKbkZsMCl3Y2tFfUB3ZUdfaEY2b0x4VTJ1OVFRKVkpWGN3KiokKjlXblkpLUpQX3B8ZVRYYWtBZkRFZTgrMHBQPTFJMFd3Xl9ICitjO0xFQk9gaiUydnQ2SnUmKVZCKVpSfUJ4TVFzNWNxc3hMOG9RPHtPQE8rNTE8MTsrans7bkByOE5AdXRWZXE5LWZudzhXbFFCYH5jZ3F+CitlTUZKfmJwQzBvK3p3XlpNUTdfdSpBR1J9PklnbEJPfV48ITxaNi05dE5FKHhVK2ItbXNNKSQ7WkopSiEmQDtSJUo5aTN2NGtYRWxKdmE8CitRTHNZRV9GV3MldHl9Q0JGMF4wND04Vi1ydE9Xb0w9PEwkNT5ETWhyWH1kRyg3KzNPXz1obCNKX1dQbHhJKnRpKkBSJXJUVVR6K3xacjApCitOTWVsekAlPjJQZkZYOWxONnN0dElrfkNNeTw2IyRWMXN3a3JiUUxTVUl2YDxCantCKXZhTWdMPXY1PEJEYmUrQ2ZIUXR5eT52LTh1Qlk7Citle2ZOPygya3NNRShUWHlhclYhfCVobjtLMl9sTHs8ZT83Q0FKbyslbHJXNnw7bHQwKDhRQ3tWNWYjcDdicWRAZjA9cUxrMUh4MldmaFchCit2OVpfYyRJNl8/TVM8TXFSVTg9b218RT4rWlUyc0M4OD80P0x3dEdwTD04an5ebWdFNF8+cGc3MllmdEphNFpoO2Q2Tkx6YG1RZlRHVWJSCit7bSMweXpvdy1OSTA5dXJ8fG8xOV9hX2Y5Yl45ZXdlczAzPFAlUD15JEVzR3JjemtTfTF3VkdJeCRKY2EmOyhMR0kpeWgzIW0paE9zNyohCitjWUc+NUVWdHtPfHZUb1Y0d3k1TDNgITV3d0Q/LTJldCpoNl8qbUJMcigwQ3pYQTNfM15ZMmMwbXhVaitEJXo+cXAjNkVvb2w+V35AM0lHCit4Z2lrTmdlRDdnU2JpKkxGak56NnlzajErNk0rWmtveGdkNm0hNT87JENwZUhicW9HJHw2LWZjIURZeWxmRlJPaXBmSDB0N3FHTXN6KjNhCit3YG5eVGBqckx3REtlfjRXZTFzdDZFQChGcHE+RnBNO0gtVDQtZzd+MTw/amk+I1VWOUR2fX1ZSzFEM1ZqNHpRMUZ8JCExPSZANTheO19tCis5O2J+eyhFPygtdVMyOXp4KGE+SGpDckNQMkt5fFlNaTB7UChnYWpGe3BMSk05WnlaM3pjRWA2aUtxeHk9bHNzU3QkI1o7PkJ9UUI1dm1fCiswJHNlNHtkXn1jYXRWRzMxN0loVWhtSGlZIyVySzw+RUR7Pl90SU9TbHBJaU9SfnBnY2FlPH1fNmJYcWxFYmVxRktzZzZRekQ9KUAzUDYoCitDbG5SP0MxWHZsYylQVCQoTV87fVBOZVkyczheYGUoVUJ5JFJgcldzcm4mRGN8YHI8ekE0bmxfeVVWKShPNmJrZzloM20xX1pAN3MwcGFjCityTkxPP2Z2dkYrYVdtNjBZISF6Uz5RVHB2Uk4jfStpM2l1dFNCKFhHOVF2P2U1KCMkSTF1RzBkRDxiRTdgVXR9bCRGUFVaVFd8I20keCFWCitZdno9dG5qNH1RKT9pYmh1bzhka2R8ZE1aVXcpTURIPl57QkExMGZ1ZzhYY2dIJT4+Q1d0d2M9ZDdibiF6KlclQGV5eG8kQX5ZPGxRQ1JBCisoeXg0PVN4TUR8aWtZaG0kZCVtZGFIUmUxWjM3QnpkUDJpN3NWLVBxN1g0MXlkYHk+b3hvUVRXJiVQPFBHcSRrKyN1JT5xZ3FwZjgmcypOCis3KXZRTUg2RSFRVFRMVkVGKGRzJTMpMnhOWmVwP0VRK3ltWHo0aWI1YGV3KjtLbkwpOEt+elQ8cE5ATXdNN0wwUGJPYStaKXRkNWpaRnlRCis3eXpVQUstRyY2cE8rPDgzfDMkTS1USE5JVy1kRWl7blpXSHh4ZU4qYiFfSiUkJFRDPU92fmpHe2hwaSQ2Tk10MTtyN010NGBTN3dwKFFaCitYUHw0Y3VlbiojZzNaVTNfSVNlJXliNFBzanRuR2EwZWx2QGZ2diVDQ01IMGwlYig2Zk8rMGp4bEA8dTJYUjk3bWw2Z3w9WXBrNkJYfUU1CitaY2t+dVJLQy1qLUNaSW4zN0NzKnhOJV5EKytDTl5UV193TkRiQDw+eW8weWpyZy1yP0VuQz08UipeckdLVDhiVGcoZi1XRW9ANWBvKkE9CitZanhASEpLeWNUJShZanx4PztPUygrN0dePUNMI19GVlN2cXNwPkxqVDRPNVBRSjhZWTVTZTdTaXV9K1pDWCRqen55cGFYY3lYMWwyXlJ5CiskUTY8SC17SGpOIWJLUFRVOGZ3b1NROE8tMDMofGpPajxZbn5NV0V8K3UzT2MmMTxBVX1LN1RJczZCJExscmdXdFNga01gbmdJOURyX15zCitISXghfmo8blk4NCNeKlcqIWR5bDw5fkU/RTNUV2lYeD5kSkY3V0lUUDs+K3MwQm1LKCZ5dzdrZkQmUD5ealk3NnIzMGdvYXkrZXZ3TlEkCitwe2Q/ITd8P093dHkkZVR0LU0yJnIrfSpVWiYyI1hpVHxmcGVRMzkpSFA2SysyWWw0XlgjO0c/MjhRb089cHl7emQtWis3NihzSWJXbS12CitmMVQ3OHNnRShXRWlKVU4rNVJTbz91QDg1clE9b1l1X0o/SVZLRDZJU2t8Q2ckMH59KTd1OXB5WWFFME9paD9hRWxzfl8qX0VQd1N3RGUoCit2M3Y5YlVuJEF+d1FPfmcxKmRmUWpnSEZaSnZRcmJmSE1TUSYzWnZxOUtNNSQzKkZXOzFBbkA5K3diWT9HXiFmbDgrPjQoOCl1Z1UyaWpSCitQT1lmYEJkT1I2PGJCSWNoZHNyWHYxKjZaMHdRZD4jYVlHOHU7PWx+MlVacD0xWkJkMyheUW1ZaDk9QDdXUkpzN256LWh0WEVpZkNWQGllCitGNyFTP0RxOGd8fm9NdD0yd0xpT3JVeSMtPXV2QWR0ayNCejQzJDNed0hiR05IUEd1QmNGe1BMRWdnUWJgXnpVdjY1VlMxfXJed059ZmNmCitWK1VfV3grI04+eEhab1BqMlRFc3t1TzEkP1M0MnA1Q3JtUkdrfEVYaiN4eVVHRmVTKDxreWZNWG00LUhVanxuWVo/VD9zVUlGZlduK09kCitkNWE/JnBzQE5mYDZVUkF4cDt4YzBaIWJeM0d+RXIjWlgwckNlaUZpX08pe2VMMTI5alE2dWp6LVFVXkxDK0dpNFpHOCV6cnEoeyVkbDVECis0dXQjXik5YWU+OD8yXzhZVDl0YjMyXihRY2xveEBFbHQwIz9XTHtLd0QxbmtLO2laIztEIzV9bStzdFNVaGZ3TCVlJldifDU3fjBNZUo4CisjKSlCIyQjbXgze0U8US1tKHB7YE8zMzFkPUs3ayRQc3h2ZFZoSDJ5eT0zZmB3WFZ4Z3kyLUF5SGBxRmtATyVTUHdEajJPS2ktfFMoLSRfCit0fXFsST49TSFibEkrNnhaRkFeJnd3fkA7MTlsN0pIQmVYOEA5KTlmWSRRK2w7YXYoV0gpcXRBNiZhSSVqTHJ0Plh1fHZaYk4ra1o3SkZkCis1R00odz5sdF91U2ZCc1khMih2NUEyRWZyeGR7aHRRQVErdHg9aH5IK3VoZWteQW5iVTZBZTtEWH04dml5T2o1TzdiK3NaX1ZeP19VSDFRCitiKzc8TmZVR3sxMDA/SSYtXntuWDV+dTt+Pz4wa3BZJDJTR2IwZVp1am5nV1VKUn0tYkRrKCFLayluNSk8ckcjJXFxPjRhO2kjLVQ5VGJjCislbl9EcmhLMHVhZzBMeW5xbX1mS3AlVT49VVJUa2NgK3s7PXh4Pl9aJUVTJC1QI1JAc2EmNXFlZWRuUV9lP1hQZyVARCM8V2RaYjdgSmp+Cis+WmgkN1dzRmhxJXlfQHo7dSVJdlI4UllKNUtVNnVQcVNoRDkoNWYmekBwK159bGlhcl9EcnlLZyQ2d1JTcGt9NEkmK3RXIy0yI0xiSmxBCis+aTxTb1VgPylicih7LWBQP3EpcTFJUXRFTkB1OXFzQUx1YGJgKGY+V34hWUhAODlFUDBlWHRQbnlnTzh5Nm10ZUlhYFdOPVRPckF5Vy1JCispSDZvNl5BQ1pVdE8+JCokKHc4emZZczgkUj5nSGVWZ25UbGxJQkszMHtBOyhVezcjV31eQmUrOCQyViU0dkgrKWs3I014PFJlPEpQUCE/CitEKDVtZ3NsTDQ7ZXshQEtzNDZlfEM2K19wVW56Y0xyQFd2N1JAOFQzT2FCS0BPOUtRSDAwMDA4MFB+ZD1OMihmVXlnPml9MDduMS0wMlRsCitNMEJ+dD1GS3VzUldvJmFWVXRlaSVYPj95LUVedjhFRTZVR1JEOTl8KCVncytvJV8tSykldTdrRlB7XzxKJFMqMlVAQzAjbTZhcCMoSmhgCit+STteUHhAYV5tOV5ZISN4Rnolb2lZM1E4YjNyQzJUaVApaD5ANmFXQUsybXRleTdEczRLR0h1fWkwMDhGITAwMHZKMDAzfWxhNCY2ZFdNCit5bn5GS0tSTVdxMi1kZDN7aHBqPjBldXkhUkVrSEF0KUVqPkg0RkBxPyhlPkRFO21OM2xXaGQqViQmUkVZSHtAeXZNYTg4YT5fS3tEPkA8CitBQileK3t9VmtQdigrQ2ZVfC1uVlA9KU9Pa1E9UVlUTnombzJLYlFOMkhFJUBIZFU7KzRzRUxIPiVYJk45N3p1VkNPWFhGI2Q+aTEqTjFYCitDaDghLXdqRGhPPj9gdGU2RWRYJHRZeSYzKzNLaWw4QCNKaXA5WVN4NEIkeig2PmZLMVFNeERpRGlRRVEwTGpnU0BuNFpHRUd3KntlZypRCisqcytxfDFFdEtyfWxIPHFPR2VYbylwSCk9Q0tpeUJxdk9yRDBvdFA4dHRyaG9qNmkqbHA9M2lTRGNtUG1LMHxYUVIwMDBPOF5PWTd5MDAwCiswMDBzc0kyMDAwMDA4VU8kUWFBfE5hWipYT0RWUlVKNFpnVmVSVXVrWT5iWUVYQ2FDcmomUCloPkA2YVdBSzJtdGV5N0R2KUNaJmhSajAwCis1OD0wMDA7TzAwM31sYTQmQ2dXcFpKM1g+Vj9HRkpeTE9XcU1eVWFDeDs/VGFUa1E2bl5KZFNUa0F5WVQlKWRrQEM5SU5+PX0xWkNeVHlFCitDJnZXNiRkbDZuSXUjN3p4VVlPT2FlPz0/ZWM9THpqTUYlUCQrcEtsb3F3QTY7TWp9c2dsWU53JG9ENzI1OXBnMW5zXyVgI21yQi1LVD43CitxfmNYalNaMjZMR2tMMCo+Nm1HZzMlO1koYWp5cjZnNGdjK09Re1ZMO3liKzdUKV8hU0dyKCVZaDM8ZlJGcUFpNyRaNXtDUUdBQzhTJGQ0Cis9ODxlP0o5U3VzUTNiZD9NMjA5MT1ZWEs7LT19YndIPX51VEdRQ2hNU0l3MX4lWEh2MjMkbzhPI2twd1E4c0I8N3JNeGctU2Z5bWxhd049CishOShINWJSdVYqZCFnfWo2c09rRWklZyRgRkZMPUVrJCpCIXp3RHdSWGdAe0khMEs1QjVzPTk/XkcpdD9sKyUmRmt6UTh4IUBPMiExMHJNCitSe213RmMjWD5tI3F3M3d5WHN1YCtEMEg9bWklLVRgWEZZR0xTR3JmKjAlVyhHNW0tJV58cDBEQCpMSkFrOHoqVEdtPl5ve3B7NXFqQT1nCitqNFJzT207d29yM35DUUZGZHVeeV9nWU5mbEQ8bUFSNGY3TCFVIzFpMiFBRz9adTxPTWtmPypCUzNnTCZYNHBnKWUpMHxWJGNTV3NFSXxWCisyZDMhPjQ5bDVlUUZ6TmdINVVgYzFKI3JjRE8/UDBMP2UmYFRLK2JASk5fMEFkUVFyU0tKSU9AMnk0XmU9OCtOTUd3az05Jj80O04yZGM4CitsWmJiSXVGJHFAPUF9Myl8a1dWQCFwQiVQe1dLKil0NilKfHw/fDwmMXV1JDJObSkqbTFiPzNzUiQwbzwtcmQwbk1ob1BlU2xeMUs8JXI+Cit0M2R7Kil1TzBTaXJ3ck16diMhPElCdEhsVjZQbHJuRlJ8ODszaD5APmZQX05ZWHc1X1heKlNAZzQtWkJfKj1IQF5vPkpXTHlGPTUpbVhACitOeUgmWF9oSXp7WVBIKE1wUi1YJmZAT1ZYZE1WaSt8U25KYFVlWjhFcUFkIXNsPzJGN2dAIUR8ND87cSNCc1k0bU9oXmVuZlVKXlMofn5DCitycCVXPHdAZVhEX3FYMUYhYCQ/VmRCaUxJO3FRZGRtbnMyUSMzUi0/dXBCYzQ9SCM8ZmRwXyNZOSY0LU5VJCp9PGBLa2tkPj4ydUcqI3xBCityUD9xfTt4YnRwVWU7fGhfYURyTlRTdGNweGFkd0NCIz84JWJePm1EPnFxUlMoZWBta3lLJTNWVSlTNG8kcWN8ZD9sRGRSM3VtbHUmcDgjCislQkhWPTJRWS1gN0c/RHZac09jYWItfSMpaE95PVk0VStDVT9vfWo8eXlUdkB6enh1dVBHe0w8Rz02KEV0VW83UFJgc0MtQ0lGPEJXN289CitUUnAwVXt0cWJWOzdJZDlqfkA3VWZkb0slXz0rKEV8aFVMeEZ0K1I0Y1RfQj5TRDQmakQ4JkdSfFM4cTJ4OEhQKDFAS2g2OFZaX1NVIV9ICittMV9nfGo+LVpidGQ3OE5SPXZsa0VJJDRuWTM9ez8jdG9vODxYfEomNUkrb1M3PW9JcUBgYkRnKWF0KCNPVm01aWhwVWVZek8xUl8yMCpVCitoV2NtUy1LdntQeSlKck1SNDNmPHVQRkdwOWZ+PWxBVm95P1pvdGhnRW43flA0YEUzKFJrMXBgRURDOFVreTEzdlAzPnFqfXRmY1ghIWgwCit7PWpARnEhOTlLRTVOJmNHNGh+KlU+LXFFYzJeUlBOcFYxSGYzdyFaJHVRamRJQCNFM3tDfFdTQGd1I3tIenNQRigmSDY1MCMydnd3OTZUCit9dGpXYjBsQT9uNlRqfTRWKUJmfVBeKUZDTTB8WFFSMDAwTzheT1k3eVR4cnI3ZkIqbWg2YWZHTDY5NTFKYUF8TmFhJUZLWlV0ZWklWD4/Cit5LUVedjhlanpKMjxBUGh6S28rN3hHLWUzK2UrczwrKiFHUT5aKTs1WHZBQnpaPFg3YGkjXk1CeHkwV25tcU9vJE5rUUNQd01xQD0yWlReCitrY0ZaZWNueD94SEBXTEI2fE8+OHoweykyPFVNcT1URCk1Mj41QU9wWHV9NGE/eksyemRxI1ZoZHxNVSteezEjQF8jMGNpWUlOcEFEXystCitlKjkmWX5+TThPOUtRSDAwMDA4MFB+ZD1OOEg+cXV0cDAyMExDUSUwMjJUSjBCfnQ9RkxHc1pGTEdzWlV1SjErV2lEYGV0czREcitzNV5HCit7U15taTE7dGgyKHdfIXM1QyR9SEhWO1ZiQ0xTYHRhaFZmJnZUbWtHX0t2aXlIdlFsQy1oQ2ZHVHo5Q0AjXlQrKmNrbGEpSXkqYUNkfCpICitJVChBU0hKNHRyRFZ4Ki0pXjc/TFoyRF4pJFhidlJMY1lXNmptZ2peWStEM0dRWmU+JlQ5bjFDZVZxdy1CWH08fCh6c1leWTleSFlxTDtUCitFT1poNCNLNTNEWDVreEJsVDlod0l3dnRDcGMtYGN5PmN8cy04JWVqVzEyZSl2Kk92bDhJUihQQW0jYWo8cUhwallaWGxWaU5TZUsmJkB9CitqOWJrY1U0aCppWk8+JlRIQXhzPEhxVmBZe2xwMlZzdXxZZGhaNWotRipHPmJHI3U2KjYpekw/Y29VKkxTPmZBYXhAU3dCa1JyeXJ1YHd2Cispd0taV3V4eXtFYjwmRTBSP1R5T2A7QH1pe1FIQ2NDcTtRYGsmfFQmaHJvRmE3TTdLWGJ2cTl1QHVSViVZRTBpVS0yTEw2JE95NGxOQkRoCitORWZkIS1AUUEzZT8wLVV7UEY4Jm5TVDJzYH0zY1k2dE1zTT5nd3t0XzQlOXBeNkw4SF44SDdvV0leRUxzUlU/e240bGFlU2BHSkQkdmU4CitPKmt+aTxXMypXfXBwPXE1anlCWTQ0a2swJip9K3lgQCVueShoRFY/LXA5Y2pJSF4mQEtGO1VhR1pQZGY7NXVvPjNOY3ZqUi1CPWI1ZH1oCitBfnkmdzBDTzxwe3xOdms3ME5rSUJEWj5KISl5ciR3YitHKjxRPG8zWUFVSiRjR3hgdTJxbDFSeClkPGI8b0hXamUwQUV3TzN4TGE8WE5CCis3QFYmNmNgdE8rbU0zQnFeRWY1KDFfTWFnMDNCcyVKQnw9NU5rRlVnT294R1IrVyo+PjVFRCFmUF5sOTxFckZZKThmKHduV0U0RkleRWRGCitlV3pkbjtJVSNWVktPKGJJcFJHUnpFM0BDTyhvJDM4eCRtPm8lTFc3fHZFaXNXQzVUdjFqVGB4PmxHVldNQW9NOEEpOG5ieX1DPyM5MzhOCisjNFZ5a1ReQTYxN1lmckZJSFUoK25PZnU4NzQ3eH0hfj5vfG4lKCRARVFVbE90VGo2cTIwTWFia1coSShVRDR2Ni1tJG1wV0NaTW0xXyYrCislelhOQE1iXyY2akBQQFpYdXR2VzY9NkAmKXYxYCNlQmpXV1dmaV5Xe1NHQGhHNC1OPmw4VWdyPTlxQnw1U31+YXVyMEA1Jj47O0k5MnsyCitBdEpDIzJ6emQqejU1cVdBZWAtSzAjI3VIWmc+TSEzfS1VeWNqdHorJSlxI1Vme2BxYipZdnlBTlRZe0lIamFeTy1pXl8/WlNCPV91ZVkoCit6PEB4YTt4UW53LVVtNTxAYFoqSGRqKnh3Mi09dUhiZFVnekwlaSZKXzVNfEdJSnhWKlcwSUQ8SEgoNXdObE1XVXtTenJ4dXJLYmIjTU1lCisjT2ZWbnBkP1JBTmc7Pz5zLVQ1Pzg8eElnMUdNM3F1ekRTWjc5SzVmKlgwPUFHUz1hKUMweUExYDc7cWY/MnJsKHNnSlRJZnZ1YDdxcEBRCittejBWRWIjeFUtQ2M+PVVaOG5+YFBiZm5oUjtANmp1PHsmS0UtTHgyc2FHS3w1M0NAJm1aTm9xUV56OU12b1pCfEdDTERzJDg8KiNjTXd7CitLZnBofFY3PTQzU3QwQE01TS1NP2E0X3o4Ynt1e2E4Z0EqMU1nJl9NMTExJXs4cWE2VkpNTShmbFpLSE55PUJPfittZzw7RlgqJn1uKXpQCis9Y3R8U0pPUDhtQVlWaCU3TTZlZWgmbGt4MUhLNDJ5d1lgMEBZcj82MjA9JmBiIyV5PXU2SHZyajU5aDYxVz5YaERAdW9LKnhreExjaz8yCitYZXskJF8zIWJwUjNwcGNVRW45cGN1KE9aajl1JjFsJmBNZmB2OXRGVVJGcFdxa2hmMEEtbHJ2VVd8K1hNJVdkZUEhVDd9QWtsT1kjOXNmCitWV15Od3FgKzBPSW1nTnJvViZhKzYhUV5RMXc0QHFTKFFaQSZLbDt0b2QxKVlLPnFVZzJ6P05FXiRkS1F9Wn03blRmbXdZM3E3NlpHez1oCitDS2ghU2hOVyVLdDVXeDIhbypaP1U8JGxwUk1oSmsyNndaWD5rQDJtKVIqVzBndVo5OW1uantiQyV6ekczQDx6RWhkUHhtTHtvaHNNLUVaCit8TUpRSlJEVWBqY18tcUdqNXg1JjtjKGBeRnVrbmdJblMoR35uOFhMPDlofjwqU0cjNkkjVlhBanRiaXJ2VUk7cCk7XzBQb2dMTmBtMX1ICisoRG1PUFUrVVRDYCNWN000VlFJJWp1JFg/TnVTWDZnPW14WGQ0e292QiU4JWZ8bE1HJDtSNlk+cjVJVz43JUJxLWpYSGVuRlhVfGwzTHExCitJOFBWPlEoWUVidSQ0R0Fre3dHJWxNOz4xNS1vRlQwYzxrUG0+ZW9+cD1EdkRKZ1MtOGdCNCZFJWRIX3FIWF53TjJgZFZDZ2EmRGtLZEkzCis1LSQpaVpEamQ3TSpSX3JDMTxMVWlTRWd7UEpzKjs4ZT5uKkRSPiFBfEBaJHZMSHhXbWdnbGVJJXdPYHJLNlBfSmEtI0k1NklDK3cxOV96Cis0c05kRSYoTE9jdThyPlNjMGFKTSlwV3YtNlEpKTEjKHdlclBDJDVeYzd5TjNZUzlAVUJyRyE/NytEe3l3NXw5Rmc4YWoqKDhhR3Axe2xLCitDQS1zIVl6YiQpOVpZPStwbGJjdCFRSDMrcU4kZVl3YFUjb1gxbTlOXiU4SmxFVFNzTzxYUVJ9cHVOa04qK0hadGozXkxEcDVDbWR+KmR4CislV0ZkJGtkMnYzNlNxTytSM0pQM2NBZngxekhQdlp+QmQ9N2ZkdVItKV9SM3s3bHNPa3dKc1clVWhQalQpUnZoM3pgblBnTkhkcEI3flc3Cis9THxKdyNQRWolXkImN3tFWX17NlF4UE51V3UpcEpPSytyc0JYQVEzTnYjZG9yQ1JBMHc5MHhQQkpxK0NaR1o0SGolOGp2ViQkaighZ31DCitDOC1QJFBDWTlAUHk9aGlPbmswMDRUMCFwe0s9Z2VmajJjTytNe1Vpbmt0Mnw0WlBaa1dDPjttPm00ZXVXOW15S3VONlQqR0U9V2V8THluCitIOHMoN1BtPUFMeXItTUV4c1dpaiYqd3k4YHo+aFpHfktoVW9SKlBmb3VNfFdiZF5PNiVSQjRrdHtqWVVuLWIwS047UiZGMEIlUlArXjdACisxT2daQF5RaCNoMTNZM1EycS11QTc7O15nb2FFUThgdFIyJTREUng0UWx3ZHF+MjZ0bkEjKl5ocUd+Ozc3YUUqNkhjTU9LI0A7MztAXlE8CituSGxkeGtrIzhkQWxzQ1NmcS1KbHU4ekpRO2JfXnJ0REE8WH58SX12NTM1M2FiMUAhaWhSKVlsTSZgSHIpNDc+enpLZTR6d0E2OzVPUm4hCitURFErVC19NiRvM2N+Mj19aXJoOXRrZV98TG9aSFFebkUlTn4zWm54bVEqNDZFQ0YjIyNidUQoLVFOaCpod0oyQ2ByUzN9IUY1IXVGbUpuCitzTjF8U3x3RmVmUmJEezt0e3k4LThFQmw9cXgmfUl6d3h1ez8xYD9vZSVaKW5Ra1RpXn0lfT5gISFLeypJPWxYWVZKNXAxbT4yTnJZYzUmCitxQm0jUkJiTn1RQ3NDJjNpcnVtfWQ0OV5JeWNqWlFQMCteLUokZzx5Kk1ZalIpYzFHKmRTYXpWR2pjPi0pVCszKnQlajt1XigmSCRrV1hmCitLYS0+a1d6K3dIOzc3O0dae0hKI0JacXUtWlRCJDZFM3kzX140VEt0YXh0UndRX2V8Jm5hTlA0XnVTJGlZNXUkSWdkZjEteVpTazw3WXduCitycXhSMyRVSFlYJVdVMzJhT3JTSHgoKDlRYlJqYkdJWXh8WklHdld7QkhwZzAkdUphVnZ8PFlrZikzbHdqX1BPTXBfZyhvVVVCQExyS2cpCitjVEkrZUBAZnlMXj9KTDBaPn5uZ0VtOThXOTdPQW53YEVtYkRvfkx6czBXeWJsQGB3TTdPPiFjS1Z0aHR2YkE9XjJremNCViZTU05hfVdtCitpZUFsdCs2fmE1TTJhbiRhbDJwcGkpIT1eNn44Tit2ISU+PV9eOFZHQkdoaT4mMntoVHdgV3xtUnswazNXSFNaR2UoSDZiQH4yZSthdCM/CitrdGZWJjlHakVjTnNaeV81LUBNQDZZQztKTDBmfUhqUy1PNjl5bUJjdnVhPWRYTGpPY05YWmZMUW5HNWRBX3NZdzQmVGhvfDNxTWsjeyg1Cis5NjVYSWw7YSFBZ3F9UHFEMWd8bDA0b15XJDFCPnw9b1JEX0YxMiY2MTE0R0hAZ3JFbH4yWDYmPzs3elk1K3ApTFdIekdJUV5YJDcwZHR1Cit+eTcmODxXeFhRVEw9ZyZoSWdMNFkrSUhhbSY+c0B+UTdKaFV8bmkkXitVZnp1RyMxJDhRI0BfNVBCRkdiTktjWHpkNVpofEBvWjBDWFZoCitAb09rYFV5ciFXSjFJP2AtTX0+SCh+PXFTRENDRDBjVj9ZZXVedGtwPjw0XnstK2lWVFpPbVZYIWw+dFRlUG9mS013QD9RRHF1all1WkA/CitKYE85Pj9qP2MzJmF0WEdgSyQxUGJnN3FLSWgtRyNmPDc7MXJeaUBlWCMwRjdRUjEjSXZ1aFAxYW4wOUdPU0VxRCU/cWclaWtIeWUkMWtXCitHJCZAfktzK1FxN00pWkJYIWokZlckXlBGNTBhWG1TPDYmTHNYfllFe3tjYC0wfFhRUjAwME84Xk9ZN3k4WkFAOy16Zms5U2Z+STE3NjFTCitNYUF8TmFhJUZLWmElRkt9WD5OMExWUWckSmFDemxEe2c+T3VhbGgtWUs8fDExbT9OUSZDVGB6M2pOQDhUc3V4PylsZFFQdS01Q2JTPHE8CitzKWZDMkRNPVFSSSZYSileQE5Ya3soejhBYmk8Xmo5MnlSKTtpXlI9Xzx6VEdCOHZFR2Zsbyl0dz5aTShKfmxYNVklXj1AUFp8TkdHK0B4CitFP3ZabVEtK3tARClsU0lefEhWWTNeblRLKUIpaWl+WEF0KmNyVXlmNkMoVjUjcHZSczhkI0hURyMkNEk9Xj9he08ySllxPT8jOCY+cGZKCiszN1NALVFjb3EqM31MRiZiRFAkPVV2JGt0ZH5WekdQWmd7WiR3Kk4pI2IkPFlnVmwpKTd7PF9Kc2E5eHpodUtTOExBSW4oSHpeWnQzfCNvCitgJi10bDkjcVo5YG1TZXkjVVQ7ajNpWitsMUYtWExkJmQrMi12M1ZZUDw5QXYrOzE0R2pYcDJpWkM4JTZUMnFlSTlWPj5ocEM7ZUVkajAmCis1LUBWZ0NTTTdhTXg4K0s4YXd2OXZKeCQ9QlZyJlpsdnphRk5GYUFZZXBoVmQoSHdjb1pNUylAO21hSDRBd294Njw5d3FSK1lLRjBfPms+CitiYD09JkRCQGc2MlBATihGN1NkWG9+IXZSZW5PKkhWalU2dWpaaT5mS1FoaVRJOThsOyhHKlF7N3krKlNSIUR7SSE9T19NalQtVzFQWWVFCitzNnY3c1dTVXpXdXxDeDVkaj5VJXo8JDx1QDs7UkNAPT12fDYmTGhQTUl9K1NUUVF6KCY2dmQmWl9QaT97VHFVPnsoQGZmeUYkQF47cjF0CitFd2p+JHNzT2tNKC1yM3VAS0Q7KWQqblo4fmg5NEVwTiprcSUzeEdRYEEqK0Q7bkxGd35WKmV2empLOSEmXmNOI2pzbStlRzNFJF4/RnZXCitpampSN1g/Q1dgT1Fgc2dlaVp+YHY4KEQ4PztgXypfZVM0dCplRTtBUnpRVyYhTTU+R2xkbC1pRTF3T0NybmR8VWJAaSV3USs1Q0g5YmRuCiswSE5oaEVZRk0jbUVhMHMhKnN+dzt8MWdXOTg/dnlYbXA2Y2NjampXYlRkS0smcFpZeTUzSGIjKFNJYD9tM1NmeHsld0tYR3tteyE/ajl4Cis8Y2xSKEMhTT5xXiU4RlJfPGE9X1p4XmUhdWtyclpMdm9JdFNeVFBMe1dzdCg5dz84X207JCh2amRxUEl9SlhUVHJFPHRGUlhAM1pgVGwzCitpVjFldCZnK2VTVVI0YE54IzZ4ZTFsI15gWGted3FmKzlTfD9pJDJfS0AwclklJnRaR098WXlEb2I9UUR3WXUmampweFYwJDNwaSUwWXNJCitNbDlob0R4JDM3c2s3KyVWQ2c5e1ZuQChTTV9XUTZQJmUrfDc2UCUyRn1TSihFPnpQallXfFN0WD9DKnt4fThKd3EtK3NeOHF9U21AQVV5Cis5N2hhfHRmfj1MKGZubHotSlBvTHN0NERKQ3xlRSV0UT03Pyo+JFVPV2I8JFBvZEtxM0loVyEhZH0hU1JAPXVAPlFCU2FIKExlPG9BaSFNCis3Q0pxNE9SSlNhYjh6dWslN1lEajFmJD8oPzZPRGdGTlVvNWQ+RkkrQnVMZkVJJjV+dD1HMjkpSHpKVGVDNDs+b31GbnFwIyNROElLdEs2Cis2dHpWamlaaUItKyswakBfbSEmVjZuOXNhZG4+c2ZAYWBWWTV8OTZ1RzNmN3BkSTRMfjlOaGw0M0dwLUBFcmR9Tn1gb3A4Vip0c3hzelVhCis1S1ZtJWx5PXdgNyFZVSlkRTNXOFJeI0B0MGk9REhuTU97S3gqbD1APnJvQU5FSG5Tajs3REkqc0dyUThqRDZlVmRFfXBWUT5xNElwQ0UpCit+Z3tJcD9meHdKZzw8ZDdDVTBeZUROWUtOMzdGcDB5NG5DaHFBX1A9T0hRWUsmbkVsSTVhKUxaWldKWSppe3d9ZDswVDl4YFI/dVRgazhVCit4dnlhS1d6enl3a2wqQ1NNak5nS2RFd0N9dVVrLUV6byFoaGdSKn19WGQ2d1dSTn4rdEMwZjFGYGU1RDwoMmNROGhPekEjNGY+e1Q3aUE0Cit5Z1BqIyNKfE0tMlBjRjEhKTkmaCgwY30mPnYxR3dtbFBxQnRmSG1kR1NITllMWkk4ZjJQMSkwQSVmP04rJUFGb3BEXn1KOD8/dCVKJE99CisyPG5XQkJzN2llNT8rTGVQKHt1WTRvOXxrenMjMVI3b3dPb1M/b0Q5MXFOLSpuUG90Vk8qNE4hYjNzNCFhcjhoendDdk8/MFg2RDNlTSkxCitQRSg1YmU4bTclQ2kyLV98dD5hVDh9ME1zMjQjeyhXRjEmeWZmUkM1V3h0TWFIczY9Xy1JKGBtRVdDVnBWSlA2WmRGak5tZFFETmc8Yil6CittTFQpJFp4Pl5JWCQjezc4N3JZM2UoV316Pz5Ob2B5cVVtS1k1QVlreDBQRlAzYEAtOVRidiR2U21GTytwOzRGaTB1KzttQWlUQEspUT9WCit2R25aU207RyV4MCVnelV0YnwzQlR0NyZgQE40QVVzdG40MXEmckU7cn50e2M/X3FXTTtzPVJXdW5COClndHNMXmktODQ4RHVBWHkzTWwoCis9SyElbTJEQmZQQWp4MW5wcmlObWQhRVp4RXZfd0kjOXVja2ozPUE0fj98Ujdpa1IkUyZ7dXg1SmxJdXYkM0tTckA0bHp0VTRWNXRGT2FJCisqMG1KPEhsN29rZHVyc1IpTUFxZzxQYXpuTERmOzRfbFl5cmxtQT4zKFVIdyh4eEZkYlRJYjg0QkJNbHc3VUtEMHNzQGVWb0NRZyFHMHFlCitiRzZsNz4lQ1BRSWNJNGRqYV5wanotMVMmQ2xXWj5yQGMqO1k1MzUlOzZnN2AzVn5IOHhtaWMhWHdBQlRXWkRPYjA5IylHa349OTNYNUFACis4NW8lbzg5PitVTytOQ25vTVlrSTdeYnRaTjxQa242VUtvQjtCKE5vd0JMZmc3S3x0Mm9yVylKYF5vNDtAfG51KXp6NWtzPys0QEIrI05FCitVeWBRTFdwKmlPOTtzMGp4JHVad0wkTmx6Klp7cVAqakxxTXIrdXp+U2pCfmArWVVNWSVBMjt8NXxmaUolRWRyYChgO3grTElTdERYbGROCitYJjhVRHcrPUBRJDhFYGslTyQzWXRFfCUzMHNzWlJYPm41LXNSdng8WFE2Jnc2S3RkS2MpY1p1OVA5ezwoY1VyP2Fee3JSWHN6MVh0NkotCitUViZhPzRsIU5UflFKWGRTKnRkfWchWGYwM0JUeEJmRTxSbElZPiNvfmZ2JnY3QkdhNj5GPzhKTChQTTJaY2dram9jUzxQcU5HPGdQYkF1Cit5Kz5EcTUxN0N5UC1vT3g8eTByNiNgdmJrJUtwSjMhfWVmeHtXUjNaeipRJStval5FUyMpYiNfPiVpJVFQa2hDNyVrRHJqfElTentnMnJzCit1T09TQnFKbkhDekxrVjd5YDdoY0FFU2ZQJl45ZyF1Q2wza1ViQ1hURVdXczBRKEVfanlXSDhpdDdhcFpVZSg8JT0re3l6c2VzMngyTXU1CitUbGxrTjRsOVRXYkYyck00bUN1SmQqVHEtRGM9LW5NOFV4VEBsZ3JDaUBmNVQ4IzgkbWt8WlhpM0IkSDJtKi10c1NLT0ByUVdTfCVGaFJ8CitnREwmaH4/cD5TeG9ASVlGJGktZUpzKilIMz1wbSRwYlRHWjNrIV43YE08TVlKdTRCVyUkRVEtaFZMJko1XlJvZVlNYUlFTTtRQGFPbzNHCiswTlQ8KHB9REpWYUQkc3U0K3ZgOCgheGRGK2J5ZGVWe158UnEqa0FwQGQxaGo8MTNfIWNEPktlb3I2cz1JJE5wfXIpWT9USnBHSjh4az9gCitaTG5PYEVIKEd5eDwtJENsTilWJW09OGtCJFErJSZQWXZySmljbHpfYVg8SmRnaXFxcEpBdGFuaVJkWWshMWJKcUBjMEEkZmFgWG5ufEBuCitpZDYrQFJGZjEzdUxQelAwcGlhZURMOXxQQ05eJkU1PnUxSXQpbWQpUXRyVFcwTGstTjN9ejw+ZXklVXQwIXxQPiFlVG5Mdmp2YG1DTHxxCitMa2VxMjcweWpvOSNBTjtSa04oczV+bjBmNVI7IVJgKGFjSTUqLTclaGorXyMraHJhYzx4LXFAJjFzc3dhUGVaODtobXhmUDRmNnk3SUZ1CitgNW9+OCleXyg7fThtbCoodT5sIWElZngoNjVPYVl9Mzk3U2J1NGkzPD10UmwlSF5BfF4jcjZXPVlIazBsfDFHdipaeCE0T1MmJjlyNnVFCitTek8lO18rcm5WYDVxQzMqSC0zfVE5YEFkYVlYXm9tJGp+PHwjekZhd0s8cUw5cjB4dkdmbXxYSkI5PUEpLTk3JnVeJkBQQylkTVpreE9lCitgYyN5JUp4eXFreTdgY3cwVXxwRSl9eDhjay17IyhVbG1naEZ+UWk2bz1wNGx3eiZWTnE5PiRGTCU1dClITkshKm54bnF+IVJZIWV+I1JPCitybEJ7MmZEdVBTVSl9fUclTWAtYklvVjNSe0hQbnhFUkw5UVMzRVZlWkNQR1ApP0p0TDlYMyhGY1pZQWc7KzRmO1lzNmM/djJePHZCYnctCitnblRSay1laXtiO09EJHd7OGglY0ZlK3JMZFJGJWMpPDRWeEArPnw9MTZaLWU/an1wJDRgXyVtMmhYYl5Den40WnFMWlZ4X0kpI2l7eVolCitNKmRgeXZCKldXQjd7TE8jWlAxUXhFcX0tQ2JwfFomezVaQzFgKWtDNFFTUDY+PzY/bDFKeXQ/dnZEJWY2cFlsXjtqVjhDY3Q0ZGg3V1BTCitsYnhZUmJiM3pDWXQ0UHRGRUl9UygkeUN9NmxJdURadmtnYk97eG81KG8xd2dVODhuT2ZFazNjVU4wO0MrRFQlSVAhN2B6N2dvfjR7MmxhCitKVzA0MUhjI0FDU1oyS3E3OWwwSVRxdmRAX3pMLWA9azljYjNsUkdjNGU9dEdaYmxhSjM3Xm4rZTlCbGFITXt4a2RWPkt1T2tRNTMxWEhVCis+RSFCUkJqYzZWWlZJIUA4NygqTkx+JEd2NEkmezVWdWNBe3phc1VzWTRQX1VIdX0tSGFFMk9FcT58XlhiblMkQ35VVkR2b1AlYEpqTjt1Cit0cGp7KVpjMWlqV1RAS1FPTUZ6PHdra1Y7UUNYbXZLKT53R2Yze1ZWOEllP2M3dG9TWG4yMjJWM0xFKTFFcyR1Q3AzcHJVcUw5YW1saU5ECitsT0lWY3lzKmxGZjlGbU9YSCtndDxQTnZjMjhDe3NXMjRnUG9YO21lMXY3eUp1bX1ZT3Ume2BBLTxPYFgqKERtZFhMMTxzTko3UG9OcURUCitTd1UpJDZWNiM1MmEwfiFJUmRNb0hidFpJWmUrRD59fk90cnNYdkAqUDQyUk4mRzF1YHRfTX5qaWxkY2lXVzEjT2phdSVlWjcpNE08NDVBCitjfXFnb2ZSRkBCKHp+Yjt3JH0mYXlST3hgOWZeK0s8eU82PHRjPG1fejNaLXstKTJTVURqNVc0SXNrYjdWcC1QOzllZnpHMmkrNTNMPj0tCitUey1aU1RJc3B5MnhUPXBGcVBBOFdncSo7OGJ1M0BnOSUkUHduPjJTKTVHd15pNHhEcTcqMiFudTNLYkt2UWNuQ3heKHVFYk5yXnc8JGt9CishRXpWeGZmYkJTaWlvd3lvaiE/RkQmRlo+WGVGUUsmP3FYWWd+N3hGQC09IVJpdGZTZmpKWlMmWitDTD94KXFMYTxURTVRYWwwZHlSSkJKCitDbDVBbTgxZ20zZlc4Mm1QP1Qrbl8rTVVVeHRkbXola2R9JW9wU3t6U1Q/WVIxUl5FeHhvJFlRUXxFaTlOMGN3fWd5MjJxViNfaFhwUFIhCitVRmB9NCNNRD93RFJkMkVZejEzbUh4ej5CRUJlSXktcjMmcSpWNyEpaylEdH4tLTRnVm8rQCRSJTlXeX1rPGNXTCtRYGRDbUI2JFhBbnk2CitiVj41NXFmNi1hTCQod3QwcjxKPlhNTyRoYTx+OWdPWDJzJTUqZnQjWTc/ejRgTXEhbm1jZ0BzNG4xamlTJnxSZGVHfWJhJjs/b0hmYClICithclglUCkkK1Y1NXRJMzQ3XjdkbmR3YlohWjVGXzF1cyh2SUJ1blNNQ0pSPzw5aCU7PjA1c0VBZCFUY2tRZU9ZWT92cXNpSSVfS0M8MTtyCistWWJuZypee1pXTmE4ZmBpRit4bnlUXjV2Mz9pfWhPcmV4SSt+MEw1NGE+Z2pNa1RyNjZzbjAwbSFsdVJ4PUdiUW9CTypMLUBib1N5IW1yCitjcSE+QCQzRmE9ckkzQms+ZlpxSiFfWFFwZWFSNTBYMU5iYUopRl9yKTQxMnBvcUdjYzBhemBzM3c3dUM5ald6YFJJJXBlYDl1NDFJcHh+CitZWjtGSDtgWD1mTihJOXNsN1BIYjNlOHxBJnc2X2QrVWVvTzV0cl4kQj0mN0EzJmJpIWtkVilLbThLQ1pjPjZrZV5pOWpFQSFEeHIwSigqCisqUSkhUksrfE4oV1o1MXI4NnxSNzFwNkhwVl55NE5WaC1oaTV9PEsoTn5hOzxsYk1jYUp0SkYranVTSlFrPElLfmQxa3FZJWQ+bUhpeChHCis8UylrKWJ9Z3VHYz1oQUgmRD47WSZzKnpfJT9OMHZJbnhmVSYjZCRVfGtfPlMkcEREYUleVllKRWlXOGcqU0xMSiNPUShHMjxMeEApPyYhCis8PnhMSWVlTUp1blBYPnN3elg7UkxHRHwleURAZi1XWjc9RmZVY3J1Y2RWWXZeRjdhQntPa01RI3x5OTZ1JC1xST9WeV53c3MoNX03OyFACitsSkxHS0pYSz1vMz1PZDNENil0Tnx3XilGN3pSQmZASUl3aGI5U29hSDxia0d1NFlrRUV2eT1KITxjT3N0JVF9VVBHYWBwUHJvTjFMIVlTCislOSpsbGx8dVlvbjZNNUwqPDMlYCNlJVApV0paWFVFck1lSTlidlh5bUFuayZrck1rfnQoX0V0UH5IdiRVazJqWS0jTilVNDFAZVBTYkZtCitCMzAwNGJAbDg3eiZ2M00xWDJWKmlrSUV1TmVxcnhQKmZmayNmMV9xWD9EemlNQytRRlV0eyNZczlqZDhFWDxkMUNJRnsxfXs7QHBEMWlRCitXPXI3ezN2dDspPDV3KHchcj9ZcEJOcDE2TUhMOElRR2J0JEBvY0BUa1Z7Yz9RbiQ0amlaOzAmKHQwQUg1LT4zZnFyPkIySnkrbS1mV18pCitNJUVYRXluPks3V05MclI/fGJ8QHE/UipFU2tPM3whMT09K2spSlJ8T0xFV2ZHJHliSFU1QTZnKmpxZlFUQ09xK2drPjR3TWVVYDstdzlKCitjZkRpJHctb35VWFpsYTghUDVNU29KdXplO0xeVlM3MTVJe3djUzBWYSs+KGpvMUFILXBfKzVebUFJb2Ahb2U2WnxDZEtGcik9Vi08TVV4Cit6akZ4Zj1RUGdoc3spZkU7QEBqcnNgJG0wQzM2eCZONUxDMjlHbUU1a2smVD1mMzJVbW5MYElgVDY7USVKVHdIKkpqI0VMRDlre1N5JUJjCitHNVIhRmNaaiN2PmorO0ExcnFTd1J4S1doVilNM3RQd3w7fFl4Z3lHYk5ybylgYF5CPGY9RXo/Nyo0eW0haFJ0NTQ4d2I2RGNUdF5hQF42Cit5QiZyI2gpK2gkKU9EI04pNU9zUzN4O00rYHNXYm40bGJpbHxHfDtqbF4kZ1YzLVFJeWR2a3JlT2NlfkhwNC1BU2VGZGQ0VzVQdW1mMkg3Cis7bGlTfnFDN1NoRk5ZNzckaG1iajN5UWUtb0Y9YjttNyhKWSZtVyplemxIcyRUXy0+TWZjMWEpMFpqd3d1R0BtUEdgZ3lRaEpyQn0xTVBgCis1K0h3JmpzOz5tSjhZeHlvPXE3ITt2JSYqeElOM1Z9OH1CJUYhXlB2ckg9djJgN1AhQVg/akV9R0cwZ1lsWmRjY2pmQSFoM0pVa3UpcXUzCishRmMqeWFyOCtfaVBkY2BBNnV+eWxEWG95ez5FISZGVSlvQlgkej1OKzwtIXtQaks+MSpkXyg2TTshellmaUtVd1FWNWhiallNTVpwYGlACitnRTAkYkJZQit5Q3UqY3ZLQzElJU8xVTMqQ2Ikd31ZV0I5fWxFOXBDaVYtaGdSQDhZRTl2RG50V0xnWkwlX3tZdW9fcy1AdHp2cGV0SUZCCitHXmdRb2hLPDRPJXAtV14yTHlUZj0oKX5oVmhFNVMhSWBEO3lIe240bzxILVoyc0Q+WDBnI1ZSYWokantUe3sqZTdJVDNHWV5gelVxNW5yCitIWFM2OEgzT28rJERERlZVa2h1PlcyeUk2T245bTZGZ3MlOSM8dUF9dik+NSRMM01LKVEwen5SWTVPRzl3cXVoKVFJK3UhaVlAb2QwP1dtCis0SHAqSW9BcihuaUVwTkdwd2UzaH0jX3VgeihtSyRQVSRiKGtLPCF5QEZZZ2p9V1BZQndYSXgxXzJfTlBXTHVaOURCbzFsMCY9NDJ+I1YjCis+fGRAVEN+SVVnYCQ1MiVAKGE9WDUzS3t2fFhYQDxjbjBjViZiemZHUioqYEdsOz0qUkZCLT9FMX09eVohIW5TOGlOS0VSZjshKDEyb152Cit4c15gS3dPYClGVTMhS3xSWkAmT2FmYE9yOUt+aUxndH1qI0lFRWRib1VZeSs1dVkwTWVycTNjSWB3OGB7dyhwaT9PczBWWUQ7dzFyIWVtCitENHdXYDJGbkY+ejk4X0pARlI1MlFBJnZ2b3BCLUJzX2psZ29rdWkwWiVNLSVMQH4+V219X2psYkFpZTFDNWxlRzghUkZUYmc8KD8oJF5+CitCcT9uS1g4aCM8aXV3fEgzY1RjKlZXZExWciZwSSp7PnZ7V1NKIUZPSFIrfTdpRyU8SylCNnwoWmF1U3soRmtwX3Bhc3V7ODF3XkxqWkNDCis3X3NsTS1fKzsyUlZhe2NGZWt2P3RFanZnOFhsTWRuMFBOdng7SyFySCRkTm45Q1pnXypofHxNRS1ZNF9VeXlLUjEmWmE+PEhNJUhJd258CiswUUk7bnB3TEY7KTVtOy19QDM4VFdHNXVWWE9BNzFBZ1Y3b3dtTyRXTWRCfldTTmVsK1pVKz87JD5IZHRBdGxJUiZRX0tIVWhqVEg3X3lpCitwTXN1JD1fRiYlNVRmWTQ0a3BtYF5MPj1kfkhgbz1faV5nZUxUSGtJT041WDNne0pxcT8tREsoMFpFZnZ9KXUtaTslPW40VzdKemRWMDJPCistPmYmM0o+NjJCeG42ZV5lQmZwZnhOfU5AbFNWNGF7RSN5MW95fj9JREhKZ3Y1cDtNKzZAclpwZm9EMyRnMEdmT2FRWXMySnl9QTFYTF9FCis3K0t3RisqOCMjejR8aE0wVzBUYXlvR2R4KXhtX3FLQT8zcDQja0hjPUl6TmVweG1ZSjh2d3tpMEZ0fXtnezhpJjZVMGBNNWlnbGcwSiZFCitpcShBTXBtOXNUNTdxYHJLQjk/V3o4ezJ9PzVCQSY4SWVxbjhDMGAqSyZxfXFqLTFSLU1FUlg7PkR8X0hkdjdMSXZpMW04fCFZYiV4QVRPCis+X3t2YGNfT2FNSXlxXnBZOD1mO3M7USVrIXlLMG98bV9WPFMka1IyZExHSndCallpPklTbTVTQURXRSFsMSszdjt4YjFzblMwekpINCYoCitfcmtmSHFUNSM/NVpmeFo8bl9icSFTZXJGTCZCQEZXSWY/NHA3b25rM3NtcHUjaSh2QVU2SWNlSzRBRiQ4UiFMPmA3Q2tfY2ZJbndkLV9YCitwR3FqWmQzfno3fC0meXNNYUVucTNmVFEyUioldmplQl50cTVeeGJud24/NSszR3xRQXtvNXg2PWpIeHMyMG92bVMyb2A8dzUjcCkrUmsqCis7KzEkclNBKyE0ejElPDwhWnVuJEM4cTVQblJeaXBgZXF1JjFJMmF0SVdZMFJKbyYzdUlDREpJU358TGY/V0tUak4qU0EpdkJTfn5KfFNnCitPNSZTcU97M3d4PzZiaT9YVmluTWtVe0FyYkFWNHZzaSpiIXhXbGRGbmRxR0xvYldqO3t4WUI3ck8lPWpyTUo4M34yWEp+Y19GNXJGbm8oCitmbXUtdG1vYGNeSGZtKmAzPE5vaUd6QkNOdF52UUw4PnU2em17MS00R24oSjNiOHBvbnI+LWFDc1VYKHFJU01RXmZDYjdeRVFrYGJ2RTdRCis8JFJVfHQ0TlYjME4hMW12MkhQUHc3PkJZfmlqP3JQM0dOdHg/JUlaRklgTTJgciEzRHNVbGRBVkF9WGk2WkV6RkthVVIxd3NTXy1qNlg3Cit+TVFZXyNoUShJaChYTUc2NFpSJWV4WV9CODN+YFFVfDhCQCVXb0wlMjU4MFhpSnZUWX5mPy0zP1hkdTNjbjJAK3NfSzNUK0RRR3E5bnRJCitJPHZANGVoWkw+Wj1GaSo1KkMwK2o1bktNQnU+cHtWZ2J6MVpyMy1ePnhiRjRZK3htPTk/eGJ5VGYpK215UCpxaWpjZCZqZ3U+SDUwKT4lCit7Q15xcm9ZR2twMWd7P0U9I19IcHZOLU1UIyhNJU1ZMlBgYmtjfSt5VEgpXlp9dXlgY2phNFo4cDlTXiNUZWg8PlZpJWc1UzxEZykmaD4+CisrdHg3SzYxSzU5djVMZX5OMik+IXsxNm4mXzRhLU82WjJLPSpYRW1KRmdSP3dRZ2kjYVpOayVYTFYzO3tfOz9PIU5gbWY/Kylae1NHPXFRCitIYy1kUD5xNTNYMnZRbTJvTTwxaiQlQkp7QkB1bD9sKHBFX2JWMyNnPkc/P1UrblNMNSFaSCVVIUkpdllYVXUwMi1hTz5CQGVya1RwMl9zCitpPlR2TkNgKXFsWUF7WmxxR3Rmc3ZYO1I/MEV+I3RSaGZucExROUNhUnlPTTh3aSVIOTNHXnAlcWg8VUQwJHdpYWs7X0ZDNXJXdl5JcGJHCiszTWJgSVZANUstK2c8NCRUZFo9SDgqdytZQzs0Wn5yJXp8eSE/WE18MWVufG4mZ2I2eGUldlBRQU85ZCE4QUJBQVd8ajR0Nm0rfXA8PHNrCitVXzBIIUtAKDx5R2NBeTs+ezRTcHE4PUh5N2ElZTApTkc4fiYlPFVzY3F4b1l6aFU8PnFxYWE1amElbzA8UHV3WT5aNTR4TEplZHJkP29tCis3KGxKekU+WUtWcz52RUdxRFAhYE05OHckMGRxPGo7WjNON2R3JTR8XmMjS0MqV2xKRWs9U0NhZUEyQXY7QDZTck96JUNaSnFLOXV1SzNUCitafj5JUFRVbWR0bkIlQ3dtQztoXjZsIWJxXyV3THk8MUR8MHwrJmFBSzM8TT0ydXNMMS1kMmtAM0tPaW8ofilAcElkN0s/Kkx7NiQ4PiRkCis9TE5tTShAe1hmV1NSJSk4MVF9OGw/LUZDMTBVazt2I0N8OV48R3hyQSF5Yjk+LSh4Mk8wOU9qVkVFTFE8VU5nOVdOazE3Q1otXkY1K1dhCitvRyp9fm8ybl5laEdLUCV7K0tzSiNISXV2eXVkPTc4VyVNX0xYQD5ESkV0eDEyfkUxflM+ekRwUyUtLSlvNTZVKmxfUE5wXlBgI3xmb0BUCitic1h5SkEpdjJ2bmFvaWw2MGlod0NmP3V9NlFgRDxsU01xbnxudGVxdEpueUVpTUJJQWFgNk1zejs+YkxpelRuYihwalozMkImRDk5N0lBCitGQ2lJfUFoQjRUUGJYVVRWRXkoMWw0S212LX00b0FULWFDPERoOyZUTWU7dUVKXkE0cV85QGowSGowdGJBSTUkPmhuU1ZNYnZsUmRwNDBeCitie2Y2aiQ7NzdYOFMjV21CeSZaMFA/JWhpMmwpNzlJelVfYTxmbG1OODdHY1ZLVS1jYztFXyZRSyhaRktrQ2lBbncldzd8MXRkZTlhfXl5CisleztnbWRmSnhfakZYZmxOTlVoS1F4Ozw1a2lAMVZ2YWdgQGlhZytlIygoQGkydzYoYXlYeDZscD8/RG9eKDQwb1ZoJlJpT2RyViNEZzl1CitVMEl9JDc0aEJhKilUZ0JAfUhfTXdTNkd8Kl8xblZrakRjUzRFRTdVTno2OSlDMSlfZmN+UnAtMk85eVNkcX1MP3ReKUdodztQZHs2X2RTCitEcCorY3wkcW5jK0Z0RkA/UWxVI1lUVEpNaHRSeE1qX19RSnl0YlJlb3c4OXc4ZDtEa04/dSpzaD1xdXAyM1dQTHpHaTJZPmZEZyZzN05HCitrOEFTZTFIZVUyVlBxJmBZQTZDWj1tQ3REUilYJSMlc3Ikd01vRTh4KWIlKUd2YlkhQkdMSyFQa2F7YTFpU09SRSNQRXJKMyReJnZpY2hzCismITAxUGMyLUgjMShDRWxvOGRFUndoOS1iTnArTE9gMGhXaWJEYnMoVj92bW9lYURIJCF4Jj5kK2w/RlRlaXMrWldJTS1VQnlrPypaJip6CituV1YtITVeN0BBWFZ4QVpaY3N2aFFLK2d6JDBlYEhwQl5sc1RtZmxqfXJLYWxteCEpcVl4cXJjaDZZQGBCanFocDx9YjZsZih7PjFAMnAtCis/TG1nYzVjNVAkdjgtOXk2ZmtYdHV1QXBQRSlqYEtoTjY1QDREeHMtVjsrZlJxZ1g7I0NIPT1mUGBVSzc2ekRHbnopd0NyZWVwY2AmMk4mCitZcFA/cjZyMlhlI3wya0htQTZMV1ZCXj1uKTNOJG92dElpVWMwbnQkclVZfFVnQDN9OEFGOHw2YkpIWjBSdjhNMyEjbHhUUioqQVlXMHM2CitpUDxYQUhiaHYjbk1HNmZafFh9JVhNbFhtQ3lVM29fbGg2bEw1NTtFTldiNzZ5YmlpZWxAQGBqdGJwTz1GXm81OUFlVmVmPVNjaC18Wms0CitfOUEwQiljWjBDPjFwVztMIzA9d0hTcTQzYClARWxOV0JQY049UnJQT2dpcWttSS1SajZEJVRTS0hLaSg/X3VMQzBpRmIpKUttNm89bUpzCisrbjFScFdyQ341VGpPb3Z4QXxlXi1kPEM3SThQfld8XzxERElHQU84JV9kKTIlaWl5QlRSS3Y8JDw+TGg5Pkd7NlFLbjFJeGJnUjFiTTwhCitEPjY3MUBUTSNBQEY5TlhZXytLQllKQTlLTlU1MTQpZ1BeVUV2SjdYa0k7eiExY0tmfVNBbHVedDNaaWlEdGJZdVFePEttQyhQUWxqR0xrCisoJiUoRFF2bk89ODNSamUkekJQYmdaRlNaa2F+U1pZZ3xBYEdNSjZ6ajliUEJucVljRD5APC04I092eUB+S0NlY2l1S3lWfj9PO1d7c0N1Citta2xAU05HKFU+STkrMGo1dDk0T0JfYVJaRjBGXkFJWGslKih0Yyo9dWtKc3koWFY1VDBuc1NrNk0me1QtTyhWfl41YntTeGVteGspJSZ+CitxNHFRJUhhYSZ+KyRAaXFwazhLZXAjQTglJmJvQzA5e2tDXjRGbTB4eXUqbFpRbkZHSkVuNU1RcWN2S3U9WSRpaCQ9dEJseXxEMVkqa21YCis3Q2Z3VHUwMDFXIUdVV0VHREx6OTR6SWwrZz9fKHNYRkVWeGpmJUpLa0dqYWMjb35+PHNXO3JKT0QzIytGWU1CN3BLZjg2Qlc9TE9laHFgCisxZD9UaFoyU3tmbXZSIVpEPkY/UTRrZCgtb0tmJWk2YHVoKS0wMmJ+ajUhI3lsbGwhSTFDNEspdjZpcV8lMn1gdmxBOV55eUBOKnBndy1ZCityeUo/SnFjSFU1WlNnamdfSF4jXlg7R3QtKj9nOTVXT2FoM2U3OyVPYj0ybCUxUG97YlBVaFJlZi0kbnB3YXlAVD1lbGY0YTVsJSg+PzNECiteTUNnIWxMY1BxKmJnb2dFRmZKTWU+WnAxZUZFcVReVTV+ZFJTUVRvQyhuKUNjWGlaNlQpWDhRM18+UGNGYEkrKmUyczYyZn5XQns1MzdwCitZP31hfjV7IT9qUzIwQG1uNTNDcnhBTyR8fDJuZ3MhY3pMXj5NQShaWXtociFvRj0kYDQ9QzF2U1pSUkBWM0IhIVgtNVhiPSg3IWFhcSVrCitRaWhuZEpJNjRxNmJnZ3k9eTM0RnY9RXFmRTB5X0t2LXNNdzY7d0lQWnxRI1hMeDQ7QFMtZVdyV0F2ZmUyIzhpS25Jc35BNkt+O1ZzJi1mCit7S2orbFRpaDJWWVZxVlN5bnA8cHYqUjRjTX44PkYoQHVkUVZKOTdtYS1fc1pPKFA8UXZLQk9DZ2FjTk1gbX1XTjw2dENuVC1TSDlyJiZ7CitAYjR5MzdGSk5jQ3tSampmZU5vejFEcXwlJWdMUGd6amlPNFdxWjEybiZ2ant2PHdjOHg0K2BRRiVad3BIYzRnezQ1bjc4JHlYbSYpe2syCiszJlBLeGhjJj9RbWk5UWs0b1N6NGJjQXVsP2F7a1lZPzF6e1FqRnFSQm5BU29aaUNCZFVCX09NbkR7YHVVcmdvSTU8YV9DVkJTM1o7b3AxCitkNkxybiZ2QE57amtjdWN5YGBJVlNpVSQmJX45TDhwIWhaV0BWamtJYms4bkdEeV9YJSZ7VDZ5I34ldSktWDlVJDR3ZUFGIz8kP0RSN0RlCitEcjNpZUlSPnghK3R5VmpNKW01Vk9rUzs3JTJgeSRwT00oZ1YkRiNxdk90VnRecTJ8K20wKVd5TDl1O1EtR3s+QSUlR3JKaz92ZkRmTlQqCit3XmR9NHFxQ0BaKXJIWnsxenlYJkg5Q3dyPFkxWCRfSDg9V3FROGh9ZWBmVUMmVVd5NyowNyNKYzg3a2NZRG1peDQ8KndIeSh3Xk1NTlR7CisyOF9xXjlxQ1VeVj5HQzZZQD5yP0Q+NVk+fiZ6TGdUWjBMNElrcFFRbkxRUll5Z3V0eH1KUF9IeW87ZFItJXJeRnMjSHBDcDJSYn1NQ1BhCitQNmh4ezFpeyVlfjkqYSNmVjNheTFiYEtqV2pkSDF9S0R9YWlsbFk/PjBUbmg2czFEe3hMKEs3eCMyNSlZMnYmO3Z1NUd2PlRwXmVWQ0NHCis4JFhFO24jWngkZTMzTHBJJmEjUEVLZE5rI3tVYmYqNzM4YGM0aCVvUXV7QG93MH0oX2EleCZOODtHRW9TYHZybFhCeUNBQVlraGxodHJwCitAVSFjbiU1SDN6THI/bHdEN2dhQ3FGbFRWKzduTUZ0cCl3OW10MGhyc3t4IU8pTSNIVTt+MCp2MklBQzVTX0k9bmZsalVBRDw9SXh8ZCp8Cis7O2xIMGR6eytlZXFOJTJWJiVyUjQkQVdqMXkjQmFVP2J7KXYlUzNpb3IqTVk3UlkmTnJlNiEzbk5DMTM/JVNAZmZFVSNWPyEhNUI/Uz5zCit5PEpxd051RE1CcShmRFF9QnlmfFF4Q0Z6bF91USFTeCpjRGxqcGN8UTI0UlZleitWWTAqPGZnNShieTxYclhUM09QaD9efFIlRl5mKTNsCis3Ujh5TG1RN0hBRFRFX1U0TllEQXExKFprI3hXSSRvWlc3MlY+WXhJVkNkfUpATmh3M0R6KTc0TFEreCZNWndIcyolPGpGV2g1djU4blBpCisjZmJ6JHN1Z01wY3JIdyZiNGxDOXJeby0qPEs8KHlaO2Z5NG9KMzlocW9qSmFTNCNLRjRHcWBJdmUyK30/cFNRXkprQj99QUE+TjVxK3MlCisoXjEwOEpfLS0rZ0lHZHQtWmRFXlczWkNHWmlEYWdLbk55MElpfXA/e2p9UypAWlVrbWhuUGsrNEJZTWZLaUBsYD9ZZTMleHc+ZVR9c18tCitaT01TPCV9eHFnbEE4cHo3OyZYcW9ER3RLSHpwIyV4MH42XzxuQmY7aGZvVCU2dlBCPiFtJVBiQz42Z1F3STsyUGVyXkRIKjFfWUxuMmg1CithY2AhcVEpSjdDTDZHLTg+UnEzPU1gPUdQdUFwcEF2bGdsVTlGMWZ+V1c+WiNsU2tBbH5EfHhRRVhfdH1YcFVXUkcmNkZnKUFqfXFCSkI7CitoPDFMaDdGNkt6aD1KMWolRHZ4eztgbVZoOTFIJSpAOCZqNEJEUVpOTnNOczBLIytYUj44dkZ1Nzw7OEh6NT5xbUwjY3cqNzRQcnMrRWJKCistVWMqdTtPJHUyJVVrQzt2emUzJFk3VkI0UzVWPGYtVWx5SXpacSYxQkRWMU4oUj4wTSpRSWBnWWY0QV90VlopY2krQDZ0MlU7MyVXNDEqCishNlhXOEpzVG8rUTArSldYY3BMPSNscHQqYC1iP3lBO2czZDt3SFRDKlh5TyNRVUslUntWa2hGSzVyTDVtSl9wPHFmNVRVRyF5eCszKVotCit5d2s1eml2YGtFMk9QcGJhYXlBdFFvTVM0JjJ6MjdldERabHN5KH5qaXc5U2E1bWUlbDMwYk91eiY3bSljdD1DMm4wYW5aSXZqLWREcSklCitXYW1SWVJzPTdDbUZxOGQ+Vk09X05kc0NpMnI/P1NpSzEkeGR7V2BaQUA3V0ZlJl5oU35QY0U7JUlRXytTX1FqanU7Q2xHJjxAZGpzVSFQCitDcl88e318JHV9bnhPXlBIX2I4d1deOXdWPWE/a3ZKSGIhST5zQzQ1KyNoWUZBXmdjcXg3ezV0cSMjdTJDcUB8NGNJPiRUIXsoREJIZShjCitmZ2JLPU9pUU5NcyUtYzxES0JSbytxdnZ4c08hOVZ1WWVXYUF9OzJWbXdpPzEjJiE7NkVsfGFCQnVwMkVQR0I4OFFAdyhCPW1QJTNWRGNjCitndy10TkAyRj47TXpiQTFVWkAzLVEmJEBxKFlkJSUkcns9TnAqJW1mRG51cWwkTGNjVSZ1QkQtT3tIb214d055WEVXR0lIIyohaz1he25sCis7Xz40fVUyZ0ZJenc2b0VEZSZJOyVORXFkeyZHP05ib35vY2xiO0plZVpnTlVTb3RPVFJ8QExhd0lXI2ghSVJVT1h5WGYpaEZ9P3ZQTG8lCis3T0ZWZ1NXJV95QGRfe3M0dVNNNkAzbSVBVGpLQWR6V3l7d0Y1aENaWD1hY059Xjc4d3U+K0FFWVlodGV8TUlCUFBNaEx0dm56bTNxK3VGCitSLT5iM20jWSREaUBESF4oZkZ2cCo0JnZ3Q0JDSCsqNmp0UzIpekYxWUsjdG5ZMVA9RVhkZ3dPUm96VW1mTWQzWUk8emI2PjdaP3ZTSD8wCitIQld3fFc+K3lpUCRGN1BrbjRWbyhuSm5rJi1IRl9uajArPzNMVFJETVFUYS15Z3Z1TSV2KFZqblkqdDdnREBFdzUpYlZ9Ql8jPFY5KnYyCitRTUJ9YmJVLUJQNVZ8NGQmYSFhQUFOQHBLNTA+cVMhcU4wb1FyfUlGWmMqMnIwMjFnfE1KKTRRPis+Y2FfV3BveSFee3dJalY3SWtuQlB4CitQMkBLd1NjcFkmQX5YcVMhdiZ0JmF2KFVnJjZ4fDdKd0ZAaGpGKGZ+U25LbFB1NW4yV242NlhnPkIwMXpYMiVUUDklfEoxajkkQlEjSnJpCit6R2wwNklAOEVecU88MFVzZ34yMV9pWipWU015PDcwRFBgfnF4YTNiP3lgem89YXotckpPfnRMfSM2eXdxUGVJVGE7b3I+LWB+JnFES2xTCitJS2xWVHAqbVhCQ1lCQj4/a2FkeXM4bG5Va0Q9TXZrOT1+JmBYalZ0b0Y3aDUoQW1AKT5ZN2NicU8mMTdIWlhYMGpSb04lKilVZmR2eGs+CitaKnduSUJaMU0+dk5LbH04YFFUJkNoTzVBby00P1N+PHokUDxuSG4hNjRTJUZLdndofFJEeUI3cUxlV1QkLSlGK3RRRXNNdkczTU5KN3MkCitVV2lSI2xoYSNnUiY3ekp3O3ImNjIqbUJWN0J9Tj9ZWU1wPGtscmRnbFcxbEM2SFdZb19+Umg9T0kxQkFGPWA4T0lDZ1M+YXNeSF9CcncqCitWLWxmK3ImIyhOX2FuTjdteStgYm1LNnl+WkA5K2lsNDV8SitXZGZ6VDZzJGxMKVRLfTs7RUE2QSUpZUhRQkAqRiR9cjQldU40M084JkZGCitGMVFZLU8wMDtve2xAPj1gN3wkMyU4dnA8X1lYQVRlMDAwMVJYPmMhY1dwT1daV3BRNn5XcHBsWmRDZmcqbGpBbVctfWhHX0djfVFQclF5CitiQGU0MW9ALWRvI3NUZSkqdz1TfGpDZHM5M31nZTJaakIjJDZSKT9NOXlQaj4/I0B1VzAlUVZHajBrNFRgPVhmKmxfYy1KKlltZ2w+bkEzCitCbGV0VVJfJipFN0Q2TypRbClTSEl1OSo8cmhGUSZuUXltclg1QSEkUiElUTF3Tio/Y2VCRXlQQDlwTztidHBxVT1USXlyYFB9ek80Nz1YCitDcFFJd3JzUWZNYnQmcDhUanE8S0pTRVZoSGZpbHZRO1BrRzY+biphRWooc1J9QypybGpZRD1kRWV3TT8rPEc+KUdnbVc9a1JWZGJyQztwCitNZUVGTmBKdDlRdVBUbWp6djtUQlRlSUs1Sz5zQj0zMil3Mm8jNGU7SHhrQUE0ViF0c0VAamA5bipte2MqWXd7dUx0VSlkX25ta3RuP2UzCismRDY4VkB2WkdOZnErbnxKWihnY0YzfSQtRktmdUp4UDg+enVQaERWeVlNS0ohUkZ0eDxfKnVeJGUpUndfQTAqREI3aSVWSmlSKWpLRnV9CitVJWo9VT1XRHlhMyFnUFpCYUd3e3AwZldkUWtKMmlhU2o+RSZCWntFRFlLQjhsZlg2M1dKPXptQT1tVSYrREJYSGdkbnIkbUNDOX4hdm0oCitBd1N6O1VhR0gpPE1VMmgzWDVXdU5DdURYSlpPRnl6SWJTXmd9fTYyfCViPGhANCpoNCs4XmB2ZUdeYGFuN1hgPUdYOVAwZTM7MXc1QU1ACitPY3tMR2p3fW1KNzctdTFJU3xtZCRNUC1aUighR3NfTDFuYWhuYE4kb1NUVVZnciQpI3w5JHxfYFgoe1Q5OFZiRTM5a3AwKHgtUmIkWHhpCit3dVNBcmd1aG8yR083dGFzJHB6b184fkdVKHZFUUt7KygjTWE5dEpNYVpNTEBAYDJzUzEtb05RWWBjNzN0cmA3K1R8UGZRdHlZVGU8MX1mCitCUzVIMDszeH4hMmJ8P1M3TFpGS15UViNLMyU2aDVCb0xDYUs/ejtfYVVyeTMqO3p8VTFiOH08OU4hQVFLPmtvcFI0bmtEeU1GUTM5ZC1iCitDUVI1QCgyVTBLMD1VPy1IQE9pbGtJYm0lT1VYY29MYV9YcFomU19XK0AhSnQzbV9gUnh7bFVjeGZiYHREMyRld05CRD5teUpBU3A9UVZfCis2R0EkQVpwcXpackB3VkliKGQ8QEtUbUAhb1lYdD9KQVV5ZT14JDZZKEZ+ZWE4IUlDZERlNzhGVmpkKGVXTiR1bklgVm5qUHpnYG8xclowCit1VnhgNjd7d09MOVR+Q21IaCFKcmwqTHJnPXNUaDZlWkdgMUpPV0NeRjdjQFZ8cj9hc3hhTFR7RHA9VTAwelglMkdeRngrTUhSQEFUKGV7Cis1SlM5IWpSKj0yRmV9VmhCTXdPRjNUUmI+a2JlO3tjQFczZzUrI3tyaT1zaSZLJHAlemJFc2h2TTtJdVdvZHUrSWRmX0ZsKzUoNkdedG9yCitYTWlqXyRJK1dXM0hadmQhQTxHVjFQWHRDVDgwVXxxMDtjWVYpKXtGJUUoNVAqVzdmZ3xfNCVPZVRyXnwhQThCdVpPaU8/V0F4fXUpQU9PCitUPVF6Sko8bXZ9WTlDUl54Qk9rJTQ8clp5RTVLZWRnZHdMNlVTO0Z8X2tgWTN1e0BTYk84K2E7NiYzV2RMKnVHaURAbTR5MmhCI1psRWZ7CitKPWxMKUBYQj5udW54ezIhRHc7YzhqUCFsND1JblBpQ0pEMHo0KDFwfkdKO24tRzBlTm05QUMtQG5UdzMtRytRSVB8K15BUTdnPFpubl8xCitCSDA2dz1abkhVSzVuNVdoJGs7KTt8TjhIO0JvUktafjRlQHV0djs1Kk5VSzNvUlBoWHxUWjkzd0FPeTlmXntMRU5Zcnlfa2FkZXlhcjxaCis4P2BmX2tBUWM/Q0BfeFZkTFNeX2Y2Nj84JHd9QyVhI3hCWGhtR0VKMWRuVHgzcnplPmpXfiZ9ZDF4QSEyYztKdCpnS0djSEU8XnxyemkzCishcDJQb3dNcz14Pm5RO1ByX2QpKmZiJWJpdk9qSUV0IzI/NXwjTktENiV4Ulg5UTlqfU8jMz1INXcyYTB4MDZqOTtoUz1RaCg0KExkU1VNCisocmhFMGkmJSlYYikmPHllQkp9dWE0XzQlS2t1R31aTD9BczROe3tFWVhMKktYWjtxQlchdHAyZGN3JDFUdmR2NXQja25lOXhETThWe3tvCis7ISt7KDA9eiF1JX5kQ180UjJJdVBHS01rZlV1Ui13SExGbE8/QVk3UHwtTlg+b0tZQGg/Rk1OdjNyOXJuKS1UO0BoSkUqR049S0loMFhHCitWNmNwN2MxQSlRKXAlWUZaWXxmaSgjZmYkZUo7KkFzRTdtayh+WjNwQ0omfm1DRn5TOEVCZVo/RHoweypEUDFGTz0wb0M+JiFMbDlDXlB6CisybmxXQEljYGdmKFQoJT0zdDJ0TngwYWxgYUBHIz5TIVVgRnFRQiR8dC0kflNBNXV3NCo9Xk15I3QmQSV2P2NmV0VtI1g4Ozt4b15AY3g5CitFZkdCaUIoREYha145emgyI2w3OSpjVEdKNSQySkh8WFA3eEdOR0ozZE5tUmYmQj9tUH01N2wmKlYwNkxTczl7LXFoUnhpOUlzTiN0OD1gCisxdnF0QTNGO2hFYmNObGlldCs7WlI9WVUxa09fcmAjNlM0Z1c5ZD4rOG09Zn11XjQtNW49PXh6emxiYWp1bTcxKlROPX08QXs3cFNjZGBgCisqRm4pUmxjTnpgQVdSX0Y9fm1CZWFqc1dOMXp3JHZVJH5WfXU1cGZTQ2pEMlhzWW4zVFBxUD9jc05lXzlBSE84YnI+czVHfnFiTzFKV0VkCitqSzFtezFYUXBoKkglZ145aGlnSUA0MWhWVTgyR0MrbXo3T2RMSTAyfGhydkNYST0mM1EtQk5Ae2RQUSR1TDhkbj4oMWwxNClIe0ZjMS02CitGazFIcV4yXjRsRj96WXlSPUhGcllVM2dwMVo2VXRZaSFBXzg1dVp+PUgkdn1XdUpYS3c/YktFMGVqd2ZsM35TO3JOWmI3V0FxajFleEk1CitTJCs5MT87UkN3fjBXQ0JsaXlLZEh5VFd5cEVUR0tCenVoS1U7LUkhdWVfM2tuI34qKXVhUU9fXkU4SDltJT4xdDZFa0hjLXgtWWolPz9LCit4bUtVP3NDTm5xITFLbzFwMiUjJkUpSFlrK2AxMXdDQTtwQk9iSk8tanlxNj1LczdPPkc+Mkw9U1BnRm49UU85WW5YVnFFKTA9RlppQGBPCislcX4rdDdIPGs0RXlrcE03eCk/Zmg0NjJUeW9IZCskeDQ2RE1jeShUJUx4WDI8ViZPV1BiQVEobCFFPn5Sb3FSYz1RTDApUlFTcXt6KFF7CitfZjRYIy0ycyk0ZXRsI0IxJlErS3JDRks4RXgydEF0YHFRQFcja0pMXzI9fnI9Pzl+emFiemhRRV9pOCFFNWxhIXhsO2IhVXkkLUgoeSYtCis7YWMwai1LTFozZ20lXnNTT29BUThIR15xQDZgdl5QJkM/YGxOS0QwTXVmUFpOMGtULSM9a3dYbkBHc3hzMl4+fjZqNTJPRGhoWSlxWmN6Cis/aEhYNCFFZWElaj18dndjO1hGMntVb0k8NE1Na35nJGM2MHdPRDh5eUhAbj5XPjwya3JoT3wtfiVnWGlCXkJsfkBGbDM0Qmdna15KcXFACitOVm1VWHgjR2FYWlFqYl48THNONjk0NHtIYnI8QlhvMTBsK0tqZFdfTE5Se1hkcklLRihLOT1RM2tzeVRebnhlNkBzZ142KX4yR29+MnlSCitmcCtNQnE9VyVZb1RmJis/Yno0fF4xRmg5UmR3P1dJWTBsVjJ8Vz9NfmBBI0p7cTshajZ6RTxxRChBVW9Me2h4TU0wVmxJTFdXPVhxdzU3CitIZHxDOHBvRnVpQjxAJUVaVSlxPCYyPnN7UylpMChMeklNaW1uMyFqYVp4U2lvIylMRSpXPHN4fWZvbCVNbjxoOShaTmM7OW5eMHttP0s0CitseGlWUm9NSHNZQXFCYWcrMC05UTdaN3IydjI4Z2pQU31xJUpIayNXVE0kMjUyUlFMWSpUQGtkZHtxMilqNDVJbGlmQ0BoN0hsdmtiVjZHCitRXzlKTGU2fkxNTlA2cjxPcGxTdiF1dHR4SFQkWTgzViV3U3oxI00+MGd+RjVXT2pUWndMWThYTS0hOzdzd34rLX05QGAzcTFIR1k4VFp3CitDZUdUI2ttM0B0V3ZzSWJQWTAwK3lqLWlaJEZHeXJJc3A8XmcmaWgoPDc2diFwRnl2QjhhdjArI3BRfnZ3fUxjPHh7VSkpbFhPeVAqcTdHCitxVHVDaWByMDdKeyhEdTRkb2FBZzFuUW1tUG9efEUkOGh1PTxLeFFKYUBvPUYjVGslclAmdCNJd0pYKCs7a0NfWTdZOSh1LWxKbHd4K2BUCitAOUFZXjV6NFk0UVJ0KWwxVFNxY082c2xkamlHSSZDb0BSVkMlVU5eLUl8YEhPfV5DOWJofH47QmA/YTFYZG07UmolLTkrTjVAJChac0x9CitqJVkqUSt6NCV1WGdBMDdAUWpnWTJpdWwjalNHTChOVX1Je3k9Nm1KRj47ayklaTI3MmRmUU4jN3BBKUZfP31ZTmNGJnsqWTB7RHdpZ0VoCitkOTZkSTBxb0Raby1UNUl7UHdeOUljd2kkRTQwX3J+QlVefGdZVk9GWWEpQUIySUZyTTY1aUFOM3J3ITA/PX1CdGk4cXpqJWByYHxyZFh5CitMS2hHMDY+N3xzRz14QyY4SFBHKFR4NUlVUnFFV1UwQTlZcjQoYXR8KDVqVmhCWmpsY3hPZG5lYiM0diUtO0RwYU5UZkk0KilwcENOWHlJCitUM2dLXztgP2gxMG8zaUR9fih2PE04NyZwNmhURTBpS3xieGloekB8SkhmVH1GQ293MFZoa140RS1nbGtLeEwlUiM8cD9FY3FMbzZmUnEqCitncmYqX0R1Pnw8ODZKbUtfS3BxNUglMHpSP3gjfW9KSUVuS0gre3lrbE55K0lJNmU2cmVyaTItR214XjBoLS0jMSpxeX5zQyZfQXQwRCo9CitPXn5wQT9aam9gKHxRVmJTUVhKQW1yPyY8cTZjK3phPytxfD5ib1g9TGkqR1lDSUw7U0ZxSXQmbiFCYGlTQTBxZE8yWnJ9V1NKUH05WjclCitfVDFxeklpTXAzYVhPOT8/QHNfPmtieUgqSDE7djlsJmgkIyZsWVh+bmk2MXc3YGBuM0wxUWQ4PytoPyMwZkwla1pZPlcyTXBAWUJxZUdACitoU1chWjhHaz9ueTk5aj8meGAja2t8eD5vZmxEb15HPXJlO0YoendIXyVwdSVMRDRib0V5e0BROGNifSlQWUFyTyhlWVomO2s7SEpiJUxfCitNZShWUE1fJnE3LU0rK3BocSVSJkBQMkhSVipuUkhjKVQqTGpYd0Urc2hJUUZOM2FQTUh1WHEpUiE1OWVqSyNSX2xmUUI4NXw0RDVIQFg4CithfG8kc1JlQ35jRylzJDdBVSE/NkEodjZJJFhDKF97NjJWd3dicUdOdWt4ezt5dC1wQ15hI3lITzRVKzM/P1g8elgqNUF0TCVtd1p2QFFDCitRJW8qMDdGKm9PTWNne1NhfCMkRWxuRmUyaSRgJlJlUj1TSXZKc1FabSN8RSgxJD1RNmh3eHwzaXpoMmtMeUsrZitUeyZzZFFBaTZpfXhsCitOYU0jX3lEbWV0NXM2VyhOYUI4fnEwYntMQXkoX3o7TzNpdUh6YkZzX3FGPlZYU1ohST5MKlV3RzZLKVB4Xzc3andRJXZxeV9XOUo7NHdzCisjSF5fO3R6VV9FYkRSXzlkX3l+akFkey1PJjFGZ1hVPTJGKHgobG0jJnotVEh6M1JATGNvaFBmWnRKa1F0PER4dWE+RWwkIWh3cWklOWBnCitQMmlALUNXdEkyRUIlWjVreUFmJnd2bSFyVHxkRHo9IT5pQU14KERVP0t0Vjh0amdTVyp9TSh2JF5qbjt1fTRVXz4yPHA3LU1aYk82V21vCistamN9Zm8rRHBXJFM9XnByTXEmX3AlTjglfiokP1o0YmFEdUVlVExHQ3J5fVIlQCQ0bHB8TWVZezB7MzwrSGI0ZlRxS2hGNEc8ezM4RTMjCis+bTlBYEYlUnM0dX1qR1E5eSp8NmRiRFQ4OSR4TClTZilCdHtXa3ZuejNQQ1FBMDwxbWs7O3heP2QyJWwhSndMSTV6dkV1M3ZeSXZTZTV1CityQGQlWll4aGM5cEgoeUZ3T3g1a25NMC1FcThRc0pWJTwrXjE9PEUqcFJMNipJQHtOU0UjUkQwfHhxTDMkREoyeXhUYTEoYUo9eFNqLUkkCitkPU42OztYO2xeJHMoZG9rVXNKNig8RzRoTEJacDMxM3ZhO21mZl5WVD1gbChDZTtFe1FJdE90MmtoMDNebHg4JkBSNmpPcyM7KVROdEc9CitqOHJ1fD9XRE93T35kY0RxZDNxQ0dRMG9UP0VodD9MeTNWYjA3LSFtSHJ5STZHJlBrISU2LT0tQ3UrJDJvdllCbD5MeVVleSMpUnhVbm1aCitpTjhHZj5rKmU3QXwmJHUyNXkkcTNjeFcrXlc/a04wKDI2KjVFQXRwc1lvUkRhNEUtMCpfRChUX3RIcmRYa2Z7NTVgaCR0Wm83JGlrNGM5Cis+JkVONVg2VWl6bSYkSj9oTzV1NCNEZn47P21VKV84clFLTV5qZkpvO0olb0lTJnZiRE9jS0s0cCZ+IytWaDVxak1aeW1qekg0TCk4KGpnCiteKmw5fD93ZEFsVno5eGNPZFRsRGU+X0lleytGflRjPjJTdFRQaDErdHJtKiNRUFNvNUw4RVQ2ZEpfZFhZQWB7bWRKfG98I3ZDMUBEdUYyCitHOUVxQSVMJHljYFE+Qyk5K29gLTsmVUMtJX1FeWpqeWlGdVJ6dkEldm4pZUReJkw4cmZsQF9pJWRNOS1Bcmp6PHF9KnwjdVpEbHkkfj4xCitBaC1CfV8lVlZUbE5Zejd4VjtkUmxqRClzY35Pbkh7QGJHdWNGN2xyV2w3WTlNZDtuWlFMTjFTKzdqajg7QWJZTHFIdUJRNnA/KE5NMj5iCitUdVJ1cnJKSiZGT0JVTDI7Q3hsYlFwTiVnamdDMms0Snt+ekhqYWUqbXY8RERuN3hZMlgzSDtTbkxFXjhZN0Q5Kl9GRG1BTCs9TlkpR3A3CitXI0lBPFdzKFZrSyhfJjs1YmpfdE1haVdvdmBDP3g7YnsmK0MrPWJPYmFTZCFCTXV3JG8jfiNSNHJpVkgwYzxIcHJNd3c1SE4pdHZjfmsrCitXfDVtZjJPWXV9cFE0S21lMmszazNEbTtHJVApR30hNTNtQ2dBZl8lVlg9aXRmYzUoS0tuO0BEPzduc0xDNXhBVUBaTDdwNCFeYW4mZEt4CitrKFp9RX0rYVRiZjJLfnRmaFJRcCh4I2R5UWhQOCZhbUBlPHZiZkswfWxaUVZKeEB5d1lNUCleMX5qeVk9NSp1T0R0WGlpWlhyel89VihjCit6ejlQazcjejBHMTwwSSV4eGQzTVQyQ1JQNHh6VH1qXztAVD8rUm5xdjsmNDtrQklaNDdeZXYjYzYwPDxONDA3VXNDSDYpd05VbFkyK0JiCitqSWBgOVdHKlNSNW56dVIla3F3e0NaVzI9bkM1RCk8aSFlSSVtY1kmdilSWDE4UClgelc1S0treERAPzApQ2lid09pTXdnO2dNSFNEXkp0CitnPDl+Xjd8Mm9nVmVOeCFQfmUoVlM3YTJVJn50XlFEditQdUxwbFEpI0ckYjRIZGVrRSRefT1lREd3Pj8wOX49YU19TyN6a0k+YkltXkUpCiszR2M5Q1FRRiRUKDhidz80ODJtdioxfnRqej5Vd2QzJSp1fnBjVT59TklzOyg2M2U2RmxHdmdScEI0b19lPT54V0ZuPno4RGhxK0toR1BVCitTVyFrbCV3Ui1Nb3BDPHpPSnI2Z2JecTJUbi13d1E8TjRqITN4Pk9WR21NbUdTJmBhNF91YCRAdFBkN05sOG9zdGlNI0hrUX5lbUBHeXhZCishc1drT3JNait4cyFsVFh1V2xWWWh3PDx6PT5MV3dJJDhxcFBKXnF7SGgqeEtAZnJSJDUxRkZxdCRSeyN4Mn49OD9wTjNxczgrSCR5SGJzCitXbH5nTExrbWpOOHEyIT1PNT1tV2JTRjdYci1yKlJoKDxRPkZISXZsdmF1ekZ9eHJqSnFrPCpxK1ktMFpgb0kwO1M5O2JJWk0zQ1VfNEUxCis0c2NNWlI0NComci1QdG50PlZ7ZmIqNkpYKHVeNzd0I1VDVS1KOSlwPSVuJjZzSzlYQm1FWiZNOV47YkFZU0lpSl9qQm8oITwzISsxc3BwCitibTxVJiYzSnx5byVWQX1TM056cWM1RFZDdV4tMVU4QGZaJTxxb3ROSDw2T3R3PktlQD9mU194YWs7RWl5dzdhej80RncoKTw+UHBuYWBFCitUTzdSSEpnRzhqK0YrMGhYVUwrd3Mxc0tfeHtGTDY2c2VyZ2Z1VV9TZWsmIzVDTnt9a0llVWN4a35Nb2M+QDhCUHdkVyh6dlZvd2VzaCVFCit3VjJXYzFGS156YikkanpxPW4kVytGbE45azZATmxKZFFWeFo7Yj1eRGl3akwrWDJ2aWVOUW1VbldNc2R6OF5HWG48MGlDfC16MFRDKXEkCit5c3xIanMhKiMjU0U7QjRvU2d5OD0tUG12UEN2REM4QVZ4RCY9c2JLeElGTjcxcHEqNklgbTRnPyhSdjRQczdwVlBeYDUhYkpIVlowIyUhCitEektQKiYxeFNpanpZUHBWQWBlfmE5aCNvKlFJZC09Yzdjbz8yYCVNOSFnejA0QWttJUVpR3RXMmRlRmIjeH4qPSM9RlhfRXlwNWxFT3ZACitPKzdHLWRNNm5gNyV4PWN3LW56a1JYSEZNMFAhTmY+X15mTXdZYTcldHZfQiNVS3BMeUZ7amwzcTMxbjNvLSshNDVYbnNJe2d3XjY/PGYwCitPTEkjZDtsY3AtS3cybzsqUHdecSRMSCRfdj45PzhTJlVmOSptPTd+RX14T19wPVdFfDJmOXxARnRCMjRyTk9TNFk9RVhAdVhne2VnQ0UhCitFTFMrTWEtWkpYblVBWnErKjxkKFZVdDwyTSRKSHhwY2xARX5feG05bGZeTmojP183MU49LUtWYi1DT2V4WVU2JF9hRzFTfTNMZys0WGl7CisqWT1JVGFLQzJOdzEoIWRYeypjfDA7NSpuUzQ/dFE1YDRAMUp0MG5md3BRVWc2emU3QGJBe1VTdGEkbmwyaDxXSjMtenxvWUc0fG9oRjFMCiszeW44My1VVSRKOFJZOUhrdUo4SlppLTdRX3tmNktzR0lhNTB7NShiMWstZF5iMT5kTUJOKntYbD9kPGpiJFF1dUtZc2s0ajJBcHAxUnJQCitwKXY7X1dpRyk+OFc8dVB5V1dTVCtTKXBgTlc2fHQlKSZTayVEQG1TaTJhfTNfajRTPEQ2fVNDUVA4bkJYb0h2REl8TUwmT1E8dDQzYHZuCisjYlBCeGtxeU9JTGBmMU9gRSpHWGtlKjxWNVk+eXZCS21aRCZgaiR4X0dyNlBKLTQ+JUszMHVTVjZEPkpPe1JjfDdkSDBKcXY/em96WipICitfbkprbnBCVSE/ZkJxPHVRc0dWbExHNDl3WVdHT3FoOUBZVVNTUTUkPmx1KyMqbnh3X3A1QUAmeExZYW96fDsoeTg8R1YkNFMtYlJYd255Cit7WSFTNG47TkxVITAjKVV8eVowdiZpfiReS3wkR3h3P3h6QGNFZXV5LTMkckNpTn4xZShlVWtsLXg3Vnl2MT1iRU4tND9jLSQtOE5LMTVyCis1VXVOWW17KTd6I001b1BKVitgJDh3dlppeXAhJjJlT0N2Mnk9R2NieEtme2x5fikrc3Q/aW1kSjFzfCRycWp8KEljKUhSTUlAYXhaMHZMCitVUSpfYz10QHlnKUlkS2o0bnVKRVkmM0spVmJCe3YydCRsJHxhQzxANkM2dGFNdX1yYjFJdWAwM0QzNEZwQn54RyU9cmVaU2ZgNmpaJlZKCitxOE11N2VpUkl5Xy0ze2A+WExOWDV5MjV+eUVRe0BfXjRqNW5wOCo5cmY1VXole15eSmRRQ1dkfTIqdTJvQ3k5PStiMmBmK05lbmRMSGdhCitNSXx2dHE+Yz9KR0soQTdtZVdIRUdaQnN4JW1eWl52YXEyeTJOfGh8UkV7MntDP3t7M2luRVB+Wld9XlY1UTR2MGcrJnFaK1NrP1BxLWpRCitMZW9VQH5pTlVoZzVifmllUDIraTBxeXxrfSVQKXVHbGJXQ3opJUl6Pio4bG5XZThlTjFpNnE5aUNZY080WVlyXkoxPFJQfmBxMmVFO0tPCitNelo1JSkmezhyTU1HPWFUcHt9XnFTfHowfDJSWUVEfllQKUNlb0IzWXRFOSgyekNpM181YH54ZENhdnR7anRUJXFueGo/YCszWjl5a3hFCit2cFhteWZTTyMqOE91eHprKWkrdCktYENCKDVzLWpWQXlwKDc8US1WIWM8dVMoMmtZdmcyJDw+R3E2THdkWT04ZzBRVl9EQGg0THhRdXNACispVyg+Rn5SUko+KkMhYV95P2R2T2RzcFNmJDNGNDl0bXBodEJ5UllVMzN1dWNraXJSdyt7dWtEfSlzRCtNcmpXNlhhcTtueXlCamdzO2sxCitrbm12bjtjWXBqfTlUTUB8bWVUb1grP1g5fXImeWVMe3tAMD00by1hKCR8VTRUfG1xUk8yIzlhZmR2TWZrQT5zeEd+ND1zSXYtZiNoPms3CitseUomcEpvSzViQEVoOHUxbmBKSnFUSkhfODVPPSt3JkloNlUwTzdwbmtoZSswI0FQYlRgVCpycXRiUCZ6T3FVSFNjNG5KOSNBSXFnRDFeCituajNeXlBIVE95SFF4RW0hNCpJN2RNXnxUZFNuYUNTUE09OEs2SVkybCg7MU9ua0ZNdlMtYTRicVdjRWNie2ZKMDxgfWI3YEdvZi1GflBnCis0UkYoK1hVOFNKdj04NCpSalNMdHlqJnBRflVRTElKUD9sUEkxR3hodTE7dFFOJHo9Um9uczs1WDtaWWxPPmdaayErfXRzQE5IMlJCdn5VCitRfFZCWX0hcnZFdkJhfHt9cUtTZUJZR2l6d08zZGdnZ2loSzBRdyUlV0ghZnpiVD5Lfmw+cT4tbT5ZajRAPERpP2hNV3YjRShITlBMMXQyCitPJS1AQW1OSlNIRjViO2FgZEtQVEpIJCsxIW0rXnleZH03QDEySXlnQmR9YkNeUWtQZSsrR0thUCM7WkF2MG0oY3pxJSVHTFQ8QEBWQjBFCitsd1pPYiZBMUtFLWMkb211diNJMkMwT0BZRil3QT5DMTYhYDh5JTw8a15xY1MyU3NHKTgje1RhKDtVSFIlPFV4YWsmc0haVFA5QTtoMXVfCitXJXZiZUs4Pz83ViR2N0xsb35LYHVvY3JhO1cpe31xeiUhKU85IXtTSihnX2Y/ITl6N3dJUzE9Xit2c3RtYFpiYDA/ZyRvRn5IMUt3anI1CitKYztLam1aR3FRWk9sMS15YnlIRXdXcVI/aWl1NlNZcEtFLVFYMTNxWXB6Unp+aiZ7UGRNQFgrXkREQ3E2e0AzUmdJZjZZKWlnX34rcFpQCiswOHReWXM3ZSo7aVUwfFhRUjAwME84Xk9ZN3l4a3hrIVVrQ3NJLXh+a2A3eXRrT2FBfE5hYSVGS1phJUZLfWIjN15IYjk3O0JZJVh3bHR5Cit4PWQrXyk4ZnBJPD5aRmVJVTR4IXR9TEUoUyVoLTJ3e34qK3NKM0pVRF5Pa3RoJD44ZDQ9R2tFY2NkZChZdVRxOWpoNzFsMj00NjNLSkAmCitXJmw2SmQmenYyUXcmRVJmSGRWc1NLZmVFeFc8NiVEcnpreyhDMU1BR3ZyOHVUcUMhYGFKJEw/QVcpd1cxQ0hqI0N6VkN3TEpGSjFtYzVjCit5NlZxMHRxKktWS0slSWhaJEV1X3phe3ApIVpWZVlnUjBxZHAxc3RwSChVeEdYIzZVOygxdnkkI21fJHxDRHBXakZ1V1VnPUlVcV4xNGRMCitvWjMpKl5DdWBibU55RHxOcmRQIVRKdTwhQmtufCZAST98NStuXm1DNnA7JDAweTxxfVZFKmQ1YigwPCUoSG5fJFYqIyt5QmtJZWtUZSNACismMHhtSHlIK3Y8KkxKdF83eHV6QWwrRjg5QiYrN3gkSXUmYi05ellAKkJALTBDZDZCSUBoQmd2a0QzUDxfTzhlbVMkZnN0V21CME5EWTRhCitOUjdhTSVrMW1PIyZiWWdoez87RFZjfiR+RWcrWENLY01BTipLNFphYjc5RlhsXj9WbDZsfXoxVylyRWQxeGNeUkxKT0tJNVBIZn5MPWBZCitCLXdndHJUcCokU1BSe1FTTHUmQ0psT35qQCVnNWNwYT4oQ0xNeWRfYEc5KWN0TChxMTAlZSgyN0Jic094UUMzNjlTQ01pNG0mNiRibD52CitkTC1iaWVTNEcqWl9pdXVjaU1zVzY2bU5DKlIwJG14aGxzc3olRi1LbmlRejFzN0FrOEJfaT1iT2QtdTJ4Y08rd1hkXnhqYlJgJDkldllHCitjZEpBKyRLOFZ8RU8mfno4Xl9JeE5YeD1jdyM0fWU/QVdZITwpakJYbiZTa0c4ViRAPUp5PkF7bGxmV2VeZlkyLXd3OWd1LXZYO05oKk5XCitNangyODR5KCF9VzQkKntEITAxNH51LUJMI1UyVTd3aEt8ckVEQUhoYVhkU0A5R09NZ2doO3t1V3RENWRpU2dHcj9Mb0l+O2kqVGtWSTs3CitYTDxBdGZ2XzVHMWtQMlZyenotMTckRit2aStKXk8hcHtXTCFiP0w3dkZhNldTV2NRSklHWFlpe2g4KCE3YHFxb0chZWZ9cT1vVUlVUT5pCitOfEY7OWN2ZFhxV2d7O19GfGtZX2tafEFifn09bHtXJjk0R195TDhQeklHKSlkV1lYbjBkRDlKKj5kSD0xYCZGVFkjQG89aClHSENFO3dwCitRaGU0eVZiZmV0KmZ8bkxFSXtmRjNHWGYpRnRCblRqKHxPKWR+WGd2Zlh0bGZnaGM3JSk8ak94dVJfTDFlemMtMyg2eHpUTTk9ZilfaWg4CitCRUBIMypmJHdXNjRFNSNhMi1PNDNPMmx5NzFDcFRKU1RaOUshRF47OFJwPEMxPTxRM0dydmlqYUA/JVNHPWBEVzBNV0JvJSFiYzxGN2l4CitnO3Y+QUZZRj0+d153eG5aRkxtLUVEWFokdSprT04+OXFfZ21oNlNHflkoKUYjQyUyeCZPRX1uUDYxLWJIeG9wJjcqWWZ2Qi1zNXN+TSQjCit4PWwoUDFkVyY1MHY7ay1KNnFPeUFqcSVsRSkrK0ZVOVBjPEoqbysqbkB9SHBiI0ZOb3VJbE5YUDBtPkhuIW5LekNZQldGd3opcWZKcHMxCisyeSNfb3FZWWRBbms5R2krbH47JjwkK29kOEpXTXVFKSQkYl9yV2RRbitJNnJKI2U2NihGJFg+Z2FSJjREMFhnPF9WViU0XnU5RmNwJkk4Cis7KlkhNURqeCpvJF9lVFo0PjFjazB0cG9CUTg5eUBobHZaJWRFdE14ZXZBakxQK3dFfHpvI09MWUNwLVlieWgtfjx4OWVlS3tUfjs1WkxRCitYK3NiZE98RVlSQ2UhM2BWX1VwVmd4dytQTio+O1ZMSFNfNUVHZ0JJekdvRmZTcTRuVUBxQSQlb1cmcyFMbVNtaERvemFWa3AhWjdiXj5xCit3RUpKR2BnZ0IyKHtYUzN5WCgjOXZ3SXwpQ2glczd3QjFaTm42XjZZME5ZWDtxSGUhZG1PVXI0cWtJWV9pNm5hR01fc1o/QSgpJmopTEd3CitkcERxQG1rRGMtSUBfT0NHdlBFRE5AO0VBRnpqcHREVDdHUEBUZGspQj5SMTgqWk1TTzs5RiYoWjc9MkhFb1gpWnApMjQ9cVQoJVdsVEYkCitTJSV7bW1qRDlFYCNDbTxgby0hI19OS2VEJk0/MTxHNEpWMjAmej1oVjYmUEpiTUAxV0xwPHQyYFdQck5ocl5kNVBZVWkocGUyKkNHQzRBCittTmctTXtBfSZwPkxCP0EpZyRsMkBBOD47MTAyMkpibGwte2A8bVFtNkNwbT9gPVEzQnEjWml3NkdvPihXWjBaQCFNUl9iZGNxU0lCLXdSCispVDBicGtKUzt6YyR1PXxmZnI+fVMlSyh+WkUoWjtBOXgyNHB7djJ4QnM7SkNpNDViSFc9d3lqdGN4YGdBTXhjbnEzVWFPZ09pb25Xc3VOCitsMXw1eV9pR3Uka3pwZ2o8JlIrT281S187PENPfCFodnkpQ2dqSDtYeTtVbHZvI1NuNH1reUhiQDVvcSsjOWY0UyQmYWN9VitwZm01XlZOCitna2QkQE1hcnpORXREOC1hbnJlbTZvOCR8MENqTllGfilKPUdwc0FFYENwTCp7IThUOE19Pnl4ZmdqS0hIc2BXaURPd2oyallISiohKT9YCis9PDhYbHFEey01K21HVmc2QTY3RlVAKzJhd3J+JmlecF5YaUJKcmdva2MtSFYoJHpFc0VSaVFjJn1vVUAzcD1uKlEwYjdMZER2eyYjJFlrCitifT13WC1fRF99bitvRXs/eSUtZ1QjaFY8WDhUVTJjPipXcm5yZ05qSV5VMz0xbzszUmx8MVJ+WUJ4NV5rUD9seThPX25lPH13UVNII1dMCis4YDFaaGJOeXNrOzAyZnw2TlFHc3xNbzNXNTlIO0BnYioocitIUVpFM3EjUnpOanplPzlabEk1TnFMNTByV0lxQD9jJW40KyFjTDxzJG0yCit2KzZBPXBYI0NZLTcpJUY0LSMhZlZvSU9FKl57P2k7ayFJPF9oUjRxJnpFWUNpRSNMbndCRTBYU3ZOQnE8QDZGS1diZnljeCQxRTZpRENxCitQWW5aQ2ZtUjk1S1RwTlQmN35Pcj55a2FpajREX0ZJU0JkbU5IfFIzQW09WCFQZWxKfj1ie3JEQF4yQEAxWSRKdEFBSTxGdjdfY19MUlYwCitCcnhwWm95JUQ/YDQyQWl0ODNNX0p7d1ZpPXsmPktrVWN0IU96XkcjOU8wezBoWkA2YiRkJU0+V1ZzRj8zfGJHdmdHYnVDMFJ0LSV4MG5PCithb2B9bzNuQ1VFTE08RFhVayM/Y2BQMD4rcD9DazJMakgtPiNVYCh7VV9GZ1MqKSUzajdjYz17SlNoa149U0ZBcSpMJDlFJGNUT1g0U2g9CisldmhMV3BnemdFbDRQST52Y2MleyVGN3tBeTVQVn5VNX1ZVDtPTFcoYCQrMkd9UCU4fWtudDF5JStwWXxAeHthfEg7UXM/cU85S1FIMDAwCiswODBQfmQ9TT9APUFQX1EyVzBLUkFkMDJLZkwwQn50PUZMaVdqWTshTVBVdWtZPmJZRVhDYUN6LUxZamZMMWxIY18hQ2kzfEorN3UpPyQhCisxRiUqPlArb3IjaT1TU0BMLXx3Z1E4fGtWRkltMm10RWcrOD0tWW0/cj5BTjtZP09BNU11YTV9NGBmPkZNVzhfanVrXkQtcC1AYis+TTA5CitFKkhhUzR9NjlTejh0QlBSOUl3WWZDKih0Rm57VlU2SWY5NldLSW5yTjB6YW5pU0gwVFAqVCZwfSNpZk1iK3cwYj1CdEFiPCE+TWdMYipACiteMV4pVWxGb2N5Jis0WDFXb3RVT0h8QXJQSDFwaCF7NWh9Yj4oKDVuU0xieWt1VHhvZmN+IVEwaXBNMkRGTnk+bzl5THdYKnY0dEswLVNgCitNR1l+X0BUQHwtb0dYPG5GbjE1VmZFTHooSVhZUFJ5dyo+c09JbmMwOSh1LXN2K29AUSR2V2ZCOFI1YV9kMW1lVyZHSnxLQWRERT9kYm1pCitxIyp3MWxVI2Z6ZXZDQj5BV1R7UT9VbFpBdnx0RTlQcm87YzZ4KjJIMkdVJj1EODhqU35fODhAPTYpKHd6dSY/KkEqTjJ9Xm04b2N3ZVVVCisjR0liYzs5dGNydHc3JGdhNzhgM1NTdkBFekRAaj9FN1VkK0wpe3kyYlo1b290VSFNQUN9V3U3UiR7Q3RJPjs8IUVFbVZrP2VlKFNUNzgjCitmUDktYiZadDRSMExWeCk8dHA/QlAtJGU4SVhLayQ2NE00T2dpLXdCPCUmaEtROENedEVgJDtRc2tkeVRxWXw1MVltT0hATHNuJEh0YjtPCitLMnhpX2pkUjY1R3ZKS2pGd21nQUVDSFBid1p9ekBOcHtNdj9LUHpsPDNjN0d2SUJ0PCE3XiQ2TV8hanphdl5EfHUoSFUmbShyZ01RXkQpCitmTlN0QWQ/SDAwJkpLMyFBR0FZY0FARjlyVHFTdEwqZishSj5WV1Z7a2FeYCRQI3hgRzVUbyleKEp3Unp2cWxVPnFndEJWZ1ZUVlF7PEhjCitRKnEhUVBRa2R0TUxpZkIwSj1XayM5JE1KdDEjWWNaWEo5PlMzZURlQWZvMWVhV15YQkMzKzBqZXl4emBiQXJXT2xeem0hYzJWajclcFpFCitjfWBrX35XQFFkQUslZU1RZzBtPjQzQ0MoIUtzcFB4OTtwP01mWUshPDRkYDNhJkJiK2dhR1diNWJTSC1sQ3tKOEUmWUVURn5OXlM3Z0w3CitNfmY2eyslPz9jc08wPyY+UTJpPSVNeWxfK3hCPTQ2LTtXRiM/b0BjcCVFXnd9Yyojaz8pVTshYGY5Ryg8cjEmZDAzYCFsKiFxODVlN0s9CitzPjtAZDZuUDZzZlNJe1dhdU9rIUAkYlE+SH5pTENDZypDN2FuOzA0bEQ5SE0lP0RxMkx7IzBkIzhZdms0Wit6PjRRbHZOKGt3dFJLWURhCis9Z2BYeWp4MWsmVWZHUyV6Ql5YSUhLcypZV0MkTmJTMVA4SjUjfUU2JXRFcEhpMnZMPzVSQD5YI1JVNkBoMnNIcV9aTipqSUVrVH5kKGIzCis8SlB0UEp+R01vVCgoKE1fWGl8V1pLcF4waSgrQWc1Q1dralozZH53SiZLSD96YFQ7Ync1RFd0VXUzQ0Q7QzA1JEhqcSRPbihnOGh6USl8CitWZ2wmTD8xWktwdFlTWUl6eVFRR0o4NXUjKk9wLWd2d2crWWVpQExrNEpESlZaWUw/N0t8WTlrUC07eCR0PWhpISVkOWg5KUBgTk9ia183CishMjw8ZVJqc0U2TDJxX2ZkVXZKZmNaVFRaXyVJJDNIc3drRVIkamBTX3VrMDZKUXl7eCl4bX16RXFGZXQ/JFZDZz42XldGcmpPLSp2Wll8Cittd1M3QVEqbzdtd3g4JE1HQ1Rad1oqTX1CVj49ZVkwIT5BfTA2aXthaUhObV9LT3xyZzZAS2cqTVZsTFktI2pJIzhLSTxpaFlXJW5FfFc0CitWV1RRRTY8VylGZG0rNGdDK0QoekxwaVNxTVd5ekNMeXdBWjB4QkA9em1RdFdTWG1MM3N1eihfSUIreFIrY0ItPHQwcEY8LVM0Jnl5OEJjCismb2Ela09FaXMpeiY1WHgjUWwyUkNfNGZSRjBZXnRqPTY1X29TO0FeRXpjbWh0XlFhMCNLblZ0JWU4Y2AmZzBUNXMmbVFeazE+akdZJkhPCit8WW1HIWdgPzMqNTc2alNNfE5ycDRLYTQhQjA3PmpzUXkyVkRgbUs8SGJSdihaeSE7ZXdCLThLbjRrYSRscDxgMXRNN15PdSYjOV5seChNCis7JFReIXJDUmomSzF7bTJAcGMyeENaazY/ZVc+cyNETjBOQm9WeDdAJigjKmYkSyFuQkRsMiM+ZF5hSUhzcVV7elN6KncxZVZgZmM4bjkmCittdkduMT5NNW9sYk16cmBJTXFtOENJd0l6I1VsfDVjdn50QzAjIXRRQktuQnp5ZGJ7bVJpPiM0RityUWRRa2FGbmVxYVQoe3k7d2Axc3hMCitWMk4wfVNqM3lja1k2V0hPaUROO19oe0hxaSMxKGRlT0U1QUotSGNUZD1yUThxbzNAaUhTO0JMYEg9S35pMHk5Z3N2RmR9TXJVbkdpRF9JCit4YUUmWHctKmJmJUM9fmBxJW9EcDtkVDdZQ2NIV099VEpzRHNmTDsqQ3hGQ1FST2FDPVM7JlJyRW8oR3s8c15APkAyZlMtRjlmSWh3bT5fCitZeUtGVG5IJmxuN2krUk1ldUgheH07bG5SWFNaS1Vnaz1MfjBNM0BaIVIyRXlpSno7Z2toSnAzPmg+VjV9fms9bWprU3w5eiNXZmtMPU1ACitCfV97bChSJmMpMDNDaWRFMiMhRkhGfW9jaiFAeSN+UnVRTUNiKGVJVj5rR05xV0UoYnMjaWdyJjxqTz9zNXpNYHhGRi1CMER1RWFXdTtyCitDXjxrQTA9MnhVTn5DYG55ZGhUdz9Ccj91e0tYa35DdXFrNFB6dmJmaFpEfnJJIzc2b1FDcjhZVD1XNmFBIyEjU24tQi07S1d7SCskeTVzCislOFVnX3Y7OExQP01qbXZRUjB8QEUrdHZVX3d0NH0xaVQzO0VlTCN1VkMtTCM/SH1CMntYNTRwJCFoeCp7VVJOQjZnMXJSQzxobG1kbGJICit6ciY0bWl+d3d3Ry17SS1AWUxPQm8qK2R3PVZ6KjNYLXAxWD5WPUxZT1QxOFZBeHckTDlWXiFlJj0wJTg5Wjd8NGxCMmgkdUsrKVptK2dVCitpXkJPIzJAWXImfGMmISk4SlJLdX09M1E0biE/M19aLWs5RWV+RGpMMEVFLTNTO0Y8Qk1PYjlNcHk0akw4UDdfJT92NEspazFjMGxURklJCis3PWRpUCYldzt6WEMjKiZ5R2QxNjBAQWJFM25jZmAlVD52dzg5dDJMKH5yMEhJQyhQOzgzQCttOzx9USshfGoqQEM2IXdkTnFwQlMra2FSCitxZkxJNEo4VVU4NHkoRSMmOU9uR2FPN3EjakgwXj4jJGVkdSZTM3sjN0klKDlCeWZBJklZXz87N15YKGA4OClXUDU/RjhlMXRMSn1Kd2c4CitpbUo9MytSJGorKik8Kio4QipUfkAwaGd+S3pubytOeEVxWm1zSCViPjBvZDU/VFFuP1Z3RXFTUUNUeE5hemElQEsmaldQdXFHUFMmezlUCisoNnw1OH0lUHxYRHl3ZCt8Sj47TWRHczNsZ3pheUU5dDhTWTNhTldncGFSWGkyQDtKMXJNXmxNMClodGRCMHJ8KEo1eGN4M1FqUH0kQTY+CitBazl5dkArXml5XkYwNVN3cnI9XnEmZ28/bUIlcV8pX0xLSW1ZMnUqMjFKX30qR2hMU2xXd3gxVyM/VHUlWD1ZelhNazhBd29EdVdOfHgkCitmcXtXVHxRXitycCRmYl9KJGdXMjBrRUFGQFVtT0EqblU/RmF0ZjNiK2p5YTk2WiRoSCVQYCU5NXFlIXJlMykwUilyLTd7YnFgUTZSYiNyCituaXxgUnF5fUhTWH59UDVtcCNZV2xWNzU1UlNGRTFLblNaZ040an1uNihTKldHSnJ7IUFRczx0Y357NyVBQWI0dntMeCFeblVsWnNGPylPCitmVHV6dV91KyE2bncpWXpwMFQ5cEdqUj5DfGU0Qmp1PD5+cE9YSE9eM1BTLVFOS2dNdkIrITxrVXc9cU5mPUV4cDc0LWpqVjxeXzdadnRXCitYMVV8dFU+SitDN1NlIXokLS0jYmAkXlBSczJkYSVMMXNMS19+Mn1haz4jeGJybFVhKkFAY0VSYDNwRmUpSTM7ezF0QXlGMyQzYDJWREp0Cis4PUJTU29AZHpJN2lVczBsPH5CU0FMKjVII2ZoakJfKSlfVCZ9PHtIZlM/PGxNI08pe2ZCNT17WHxiTitKUzkpWlZAXzV3R25Gd1BqJXRmCis1cGJvM181ZCZFbXtsOzZkMHgjRTtzeEJjX2dFJFdBOU5WcHltaGYxcilKVzRlJV8lP1NYVSZ6TlUhYEs9WkY0VWFLMjkmI3olRVVxZTZSCitiPDs/U0R2bSRKamdlS2A0dFpqblooT2VlKk0pb0M7dzxRZ3Y+LWxTRmVPQ0hAN3piN0tsb3RPJVAkVzcpXn1qeDhFc218O1FAZUJlZWdCCit6cy05eHszMGl+eCluYU1sP2tWb1lHfTckYSZgWEFje0dYIylSfHdjWm9rIVIqNyhhZGJiUFN6ZmNpbEYtP0p7WlBaZDxKK0B4cEdoTCVQCis1QWp3aGxoOGtIYWlMUTt8PXZxUnpZWnJofjBGRXR9TSFGVWl3eVpyeT9pMm9aWEZRTU5xcDdQeFQkdlp+LUo/T2VmZFczVGE/ISRKc1M3CitOak5ockBsXmZyaXlCSyk3eWlmUE5UbCZEXnE4IXdod3dQS3ZxaE5JO1JNWXFpUX1FJD9vY0NAdHdlYSl2YSRgUm5pSyYqODZ3MGc4KFVSCitORHshczx4aW83VnlhNSgmNUtaVURlXjk4KytPPT9tT0pXSDI4bDJvKGomdnNsPCZTeDVxXjc1VUd9ciNScVMjJiRUZ2hwJl97N2VDUXxBCitjOVRPMVMySDx9KiQ9WS1oZCNTbWY2fn1oYVZne1dXPndfbk1TRi1VdUJXX1NzSitzSmM/Jm90MlEqWEEyeFhvbztHeTdGO0VuO0dPLT01CitDUGAqc0dIREdzIythUSpQI1heeUYqcUZuMzU0WFZ2b0NXfCtPa3NJPyMxaSt+ZG09REtNWUYlakVnV3gxVVV4ayZ7OGZIb3g1eyp6c2hICit2SjljdWsqSntOZVIyejBBNzBaXmBLPysqbj49VSt0cjA0NF40d21Ne3JXU1F8Y3I4PWF2USlGUCtfYH1YdTJqeyVHWDVRait7clhfJUR7CitwdHdBZndNOF8/JFlkM1J1WmZVSmErSlRURlBHZGBRdTlNKyE5M3JmT1JWWSVsWHZ5MVYodXRHZDdxLUh0WkgjakkpP217YFdDMX1ALTtJCit4TkExbTt4Ml4hZFgwNDIjQS1hNUg9JW1yPFZBXjRRSkY9QX50ZiE8c1FoPEU5T3Zqej1KMGxjSyV5O0FwPFNQaytJYD5DdmdlXkp+NDRuCit1eHNnXzMtLTNIQE9hRHdMekx+KVZATXx3R087MjFaRzJWPD9pKzU5WW84Nj9VZGFIQGgmVWFGKyhJVjxNIz04NlpsKmtIeDU8PmVSUTZFCit1djxjSTdAezl0VVpOZjB4XzcjOX4wNT5KemdtKHZwQmckO3pac1lnZitYPFVVRGcoQk40R0hudj9JaCQ0Kl9WMENyJi05cWNJVS1wSCpvCisleUkrcjMoVCs+YF8lczZENURBR1BKdTlCUDk0NzhFVkp1UnZ6O1l9Z2RObC1pP2YzOVZXSXU+KUV7QDhUQWM+LTwtam5iPGs0LWs/KlJ2CitOZHI0NUtMYVJ5RlJRJG47PkMxZ15wQ3lpQmhAV3MxQiUyTXRnd3Y9TUwtdT1ZSHNHP2xvOT1uQ1M4QkE7bn0pbXhiITspYlAxczZnKi1XCituZyExMTBEdD9MS31SJk5ndWI9IXBzaExmbUtVQSYxWTZRcFBqcnNJU30mJS1ETnNfJHxVQ35wO0ZOT04ocVZgVXNpTVJMc05hMDx5LW1OCis4a31zQD5nKlMoeWZtSGdHVHkzQHpYNXY7LWJMNnVNeDwjZlF9Tjs0Vi1WO1RYO2hxPzJiKX52JmJKTG9GayhDPkNja0Z2SztIanBGWUB9CisoJHU3TFJNXyM3SUkrSkR6K0l4OzwrQjEzLVlUbig4bkJSNjc9a0cpbUttfVlPJWdaQnJ0RkBaXyg8ZSkqUHFjK2RHN19wMlJJdX1PbENMCiskNmxlV3B4RGZMRmo1YVphUHE5WT9TdUZPN3RMWHlMbk53WmlaMmhqY3tqRGU/TyRmcXoxYSg7SHVBSHhnKlFufTxOPSkrRDx5Ny0kPSp3CitRWWFuO35qdlheNzV+V1RLMCNEdWEmcHt4RiRWSDtLbWpeKGtac3YkP05Ydlc/dzVkTG9eV2lyOUBeNStIQCQmeTVDIylVS1Iwbio2TmUtCis1QWYlalgxfEJNN0JlaV4kIWFCPU19VjtKKk19ZT5Cbn5pOUxNSGZ7bjA9VV8yMHpjPSYjeE0wUX5PT1ZhQTVJOXFXNGxeQHdSMCM1U2N6CistdHQtN3k8djNJPD9iPW5nQWJmSk1XKTxLUUk0KnYxYHxaJFIoMmt3eXZIYm1FJCVHM2tUPT9PTEJTcmg9cjhUWTIwaiVCJkRgbUZGVjEhCitULWVNN0IpTXk9I2FiPkNaUio0cSlDNCF6aSpwbX5Ga2xSN0JEVHEqcWN+PzFWNGN2WkkocytoQGN0TU5sWERMSzVPPHBPMSpxQEJ+YVQ/CishXzZGRzFAbzlLbX0pVnRIOHhBRSFtKiU0KU9tNDVhKmIkbHttY3hBUTJpUnQlKT47dzV5MGxBVXdBQXtuY1hLfmdZTClOSDhSYjYwNUhHCit1WWJsISpRU15uUzJVcTApbWQyXj5XWj5tdEo9bmt2Z15UY0xHIU5RdVZpIXtgTTkqaVZmOEE/O312MVQteWY9djVpRy13PlBweF42cW9fCitxXkJJdzB4ZEZ1T1J5SC04WTtSWlIoaWFuZm5BUCZ9XikxQW5admEwZ3YhSnM/MiZgb3NJdG5YWHk5b3JJMFpHdUA3TVkjcm59QjhmN3pfCisraEUqPERmQD5OMk13Qn45TlBnNE9ZN1BAUXNpbjQ2eVpxT2U+ISE+dCtse05ZdkFKRUo4TSpNJE12Rm0+M1k8QFp8PHYmQTA9bUhBeVBZCitmWUs4JGhKdFgpMj9nJT1TO0xobDxrUSU1cXJmT3hYcWtkKW8kPXZ+SG5ZQCVtUnFxJkFqekN5M1dhO29nYWpHVnVOYX56VWAtTDNfMUA0CitOaSRXPkJPMklOSXFUeyNDNEpxNmhJZD05TnlGfXJLMVdSM1kldUxoQzRlJkwhVDR9SGg0X2k3fTw7VVFUZnheKWRXaFN5VlpHZUxnfWpGCitgbCUoZ25AckQkZjl+PmpgaGp6PU5nQzd0MFF3RnEjbVJGQjhuWjBASkU5ZC1SeWw4Qj1QXz9pS0MwUkIyYmxLZlhWSGVmbzFhY01hYGVlCitAOF8+XlIoPVd1QF5LPClzRFJhJlJNNnY8eEx3dFlLNyshN2shTG1FLWlaJUMtZyVJTTEoa0NKa3tleVhVOFdtY3BfNX4+XzdTUHRIOVNKCit7b1NaaCopZUI+WVM5dFJMbE4jeCNvb0JFY14lWlZsPko8cXFEU0M4SmxeI20/R0dQNEYpVDt2RlU+NyRHUzY3RyY9RVEyXyEyUVAre2M3CisoQy1Le3RDJENAcVY9fDxDZjhEKG4yJmt4OT5BZV51biNwViohSWcjeWB3NHVuaiRhPlBrPEY4QDhBYjJxaTw0TEhleGUkanp3WV9sRDQ1Cit1bUhYcnVTcF9scitjZHF2Z1JDcEd6U0Qye2lxekB+X3JvJVVTa0xONVlwNz50a1BDVDdJbFdiTCh8QUNIQ0N5ezV0PHRjOEFxKTxtOUc+CitAU1VPdzQhdSVmbEJSREN9JnRsYXM/Pm1EZTFpcSl3SiZyeGZxN3IjVk8hQXRnaFFYWkp9JWBaVW9vWUtIbFdDMlB4MTh2TGdTX3VeUHVJCitmV2lLR2NodzloTk53QiVzQ2dGbTI5STspR2JVYi10VmlDc29JdTtJUkhUNSlOd2JNJVMpTH1qSU84amA5PzAqTWJhP1pFNGk5VVJhNjN5CitadjxDV0ZjY1J1KzF7eUdHfVhHRXFFTFgtVVZ4KWE4M05tc3kpR1ZLWik0XzVreipwKjlHRCRFRTM1YFpTWloxa2gtND1qNXd5JSN4e2ttCitaODxrezxSJkwkbTtfS3ZpWEwzN0wtNkQ0RVAxQypATUFkMlFgJkNYIWpyOWZiMT1mbnokVDFfU0RfYTllIyRgVSNeYCs2emRIbi0mMyZFCitnYD07e2lke3BCbT41Z1FWI1QjM1UkMHRXUHFhNnNITjJgNmtUNnJZKmlORSp5d04wV2k9QGlWdmdNTz5aVjtfRkNII0UrMVlFQEE5Ql5ACitiYzdVckF4d15xP1B4VVgxaDV0KW17cG9DXlhDTj8tYHheUjY3PkR0JH5hTXwqaEUrOzRANG0hKSRzZ140O3FFJDxvVD5KMElJQWZEVGVqCitsby1vVGx6eHx7b2BILV8lailqJCs4JHNIbl5HdiEhYHF4VkxMfXVBYDs+UGo9KUJicTFmRCk0YUJlP3shcGNnO3UlYmNaX3dldnE4YWhACitzbzRMXlhkZnohcF5rais/UHc1dTswbXYrSDBCJTlyS3BtbiooR0pOT04hKiNYZ2hhTVRALVdyX1VPa0RwUihrcnh8X1hmZX04fFI5NlRWCitOekw2U2N0VndOWWwmUFNyaHRNc2NMYXBzNHRjcC1jRD9MVV4keCVvZnBfcXl2PGMpQnpgc1NOJiM3Xkg8aWh1SUZsKGlpIUlfViZAKjRtCispeWc1NDI9SFpXbXlQVyYmS0ZhaVd0PmAkXl8xVEluTVFVNkNSKiM4OStyc353KHtBVHlDZShfbXAjYXI1N158N05SbTBBZHoxOSt9Tl5qCitrO3FEfStaT1ZaSFF5S249MUIzPCV4YlJsdXNtXyRwfnxsZih+OWYpYDBpSkdKVTgzQiVEOUApNzBCUWRRcXYoRkpRcXJVb2UrJHhLRWpACitgJiszYVhIakNQZWVXVWZwcFQpZVpibzVQOUNUPXtgVC1tXmZmSEJZO25oYGxeXzs2QVdtamZsYkJyN25MZTtJQT1mZEJ0blQ0aGVERW0yCithelVPM09feyRfeFFgWCt2UXZUKzQkUTBEXjl6X2hwcmtnSlYjZHR3ZVZwNlF3fnheYWpMPDdeaDhZQG9qTyNgUTklXmA5KWNMUF5GSlNaCitnekRxQlE9TUx9MTV7P3R2TTt3clRqZCN6PGEzUW9ldDEkPjB7Uk8wVjRBdllzN2g7QUlALUhzcTlsOFFhcF8rOztEaEl6IyRINn1rcl9+CitCJnNjRl9WLU15bXB6MkBNJHNqX3R7WHxISm1nc2BuO24kTDV9UnstTXhDUzRfM2pyJUZMaU1qZ3w5UDx2QU1oZkl3UmxFXjFLNVk0dntXCisyLT9qMChtIUFBMzUmWT8rZzYmdj43NCM3OXxqKz1zbHl8NkBmSHNXbH5vJlBaKXMlSjR0c2pqRDlfaXtLfiF6cWJGUVlsfWFRWT4oIzM0CisjQTtBV24lPUR3ZzNCfjFlSEZQUmBtQHx1YlRaRFZvPUpFZWBuT2RvaTtgZXg0ZTN3bXhEYTFUVmpFR2M+UHVmLXRFfWBObHlLUEtqeXt2CitZV0R4QTUwNWg1X3UkUFhKRU1EMnN2ME5tPXIkQVFwa1hBVCtoblNtJHtwPUpoQXRTZ3cmZUhuQWlIPnRPfjJNPHYtez4+KS1vdVAoT1Z+CitaOD5eMk45bW1Fd1RYQ2J+YGVKSjY7a1EtJGI/NT5iZD51RUZ1alNGTG8ke084JCNLMjI3XjhARzFZdSg4cW4rNk9zbkAkQ3NESmcyUG9tCitwYHlHXnNmYUxhdypyaE5zTjBLQUtaVSV+THUrcFRgdlB6ZEg/X1c8d2QoOCg9aTJ2VXNYKnN0fUJocSs3YTUoMXZxbCVTY2J6c3dXVSEjCispWkYhMDlvanJYJVl8PiF6NktCWkB2SFQjTmZhe0JacERwTjxZeF9WQmFlaSZlNzdRXzwhTjJ5I0p7eDMtRDBSdylGNFh5THtxNCN2UylzCitTcCVOU3liUylzJndPcnRyNldGVG0+eyZsZlUoZnhQI1AmRktNVDFyQnVtayYkISpHOCU4MTt1RUhQT2dMaFg5PD5QQFRTNnBhcmo/bkIjCitJO1hwTChOX3BPUF9PbWpXe3B6WHBkJWhPTEhPKzg8Tkw/QnNWY1ZOYk0kRGtPPT9YRntzdTQyaG1YSSZVejJCcCVKKEtYeSNkKntoSzRrCit1ZjQqbldWc2ZCPkQ1KztHeGExZyVnY1R4S0U7bSYjamZPUDAqd0Z3Z1ZWfDA4RzJmX35XdVQta1VuY1dFO1psRCpaPUtJMm9vJVFLMjZVCishYVdrNWlyXm9IJXNtc2AjLTNjRl9lPDBKZX1AT0AxQDIqIVNmT2ZLNSR4VyZKZEVsZ00wNiNSdGhOP3BVbz40SkZxJHtgKyhqciVedENVCitJNTlqMVFqWi1qWmdCZz40e0k1S2RqbjsheGtMX1ZWY2FjUng8ZU9SJj1FRWhDYmY4Pnttc1lHPHBtVEBiQFVKZVomQGk/SVA1Un1XSVE4CisjZGAzbWQtXldSSmtReVBUN2R5VzlmaDJfUCVaaCt4cUwhN29rUkFGfTVHSitiOStJSnlJOUhnYUJ4WSNodSRkenN7aG9hfkpUN1pRey1PCis1VjdVPih7IV8hLXFeTFpzUFQ4Vm4kcCpYPURwPlY9KntzUCZadHI5NHR8Qisob1YocFRhfmt+b2BWfExfTG8/eC10djsyNVBnNyU5JV5YCitNPmZPYjUobE5AKlhrQk1YQ3F1OHIkZmdTNyt7MiF7PXN0PCo+UTMxLWhmZDRXdnpJNkQmZ2YwZnRUdDhqSU9KYkdob1lwd3BEQ2h1aCp8CitWSiFASHZBVFchV1IzcEFKc3R9QTFvYndGNSpPKzR5dVJPJDIkQ0VxQUduQHB0RVRIViorM2w5JkVxVjJPYXNvJXJpSipYajRGayowWW51CitNKnckelU0PGhydzR2TnRyPmZpP008NVNKYkYwUj1mc3dRZCZAYCVWVXlRem9+Y2lBaHo7Tz5NZndZUnlTOHZQUTNAZkhkTkNLYkgrN1RXCitBUnolI3k+djJkJDM0fTFpVDBZMTg7JHxCMCFJPGNKKHIkTXpycmhlVH5oZ00rWkZNOElQPWs3Wm55cGJ5Q3x5YSFAU207aGg1R1leUSZRCitMRXpua0RoKn5hcE5QbGZFa0JrIV94dUBOZiNZTCNGTW1ncWdsM09RVCtFWGtsaTJBPEtgUHN1a3l7NXcwOT5Del9sRnwlMi1hVTtHUHNWCitVNDBuVT4rN2E7KVRxZkJsViNBZlg4IWYtajxVVlN7eEc4LXZaKUIwSk9QRkxhTWpMK29HUHF1WmF6YSNgZnU4MGctU1V4NncmWE5YekN5Cit5RFVZUzAkWUlMeSMtJWZ+aVNVQFk4PjJvTjNLXnM4fVd3ZU5aNCl5KyV1YjxGaTY+ZiY5PmtUMCQwTFFuSz9TJTgja2NHPHFEZClfZ0JpCit3K047MWlwZGw3V2haRT4jaEhNSk9Zfi04ZUl9I0NzQUhVdChANEVAQzlxSHJHYEpJKmBEblIzd1NkdnxoMGcwZ0FlMWdeXnQoJT8kNHF2CitBSmN2NDd6KlkpMWs1aiVzbX1qJTlgYGt4YlQ+LT8zaypIemoyZV81WksmJiRIZ0tyMit2JXBMM0dLVzJ+eTkxeWRgQHxBJW5tNGVJZHxvCitQX182RF5mSjY3YHBjMDUjPSh2cTh6SHVzWkErSWo7PVFiTigybk9GZTMxP349ZFhDI3pgPz5LVmNKfjZPbShUIWNYY2l5Xml3UHpRX2NRCit0b2ZqRUowX0t4cWE8PlQ3elQrakBhTD4yZlBUIy12MUhobWhsPlF4REAwK0F7cyZVVyt3KDhhbVJYUndWVWA7cDU1bkBDRFVRbnNvbzF8CislSkUzZDleeWo7WE0mZGMwaE9odiQqO0dnZiFUMVgxJjNSPiN8JEw0blM8fCM5SEA4K3EmQHtld00+UkpxfVN+ZXMwJlFYe3hVSVVrcGFECit4TkhecDZQS2ZVIT15c3lePTJNVmgxOGc/UHRgTG1wX21Aa1Q4KG18NFpzNG9JPVdDOTdvPD5mNnF0Q3cyWGY4Z1dYdzhIMCt8VEl2XzMxCisocFhpYDllSyNoSjtzPF45RFV9YD5sQHtHfWR4e09HSH5ybllHRiFMfFM8SFkjYF5IVU1IO200eSs4IXNrPD9WOF52JTdhVTJ9WTJ0Y2d3Cis/N3Uke3NnR2RLSzsxUGUrKk95MXYkWThzS3M7KCQ2OCYhKDJuQighRVN1ZWstY3t3aDZkTFRaNTZIbT5ZSWBVNVBeaj11QnxoSUVaSFUmCis3OTBWU3pvQ0lAfnkqNk1WYVY3Zyl1a3pWJHlSTEU5WWdZPngtan03NHZSfG1wMFc5M3w2OVd7clIxXm5GNyEhRH4/MDcwJTVeUysoaj0hCitEeUpRJXNgPC1uaGUjOXVlTDFlSkxFdSFGN2MmM0wkQG5TQmd6TnUwI2Q3eU8xVnhAR15oOz01bVU2cyQpaUAoJSFeKGQpO3tMZl85QUVNCistd3RIbjFTcFdIV0t9K1p5NkhCP0I7Wnk2dSlPZDhJeFNqe0lyc3RFSUVZLWhzTUgteGBBeUpRUjRaTVEmZ2RvKHVob25IVnFkRTlvLWk2CisjJTZDb1JraH54R1dJQXNPMHQxRnU1ajEtcUdjWkQkQHFOQTZWa1h4cDZySEh3WX00UEtQKG9Ab0VqKHdkUyZCQX4kMGRuYmtVX0BfX0BmCis/N0YlPSp4ZztnRmwhWTApJFhrN3g8Yn1CPmNqND1zQWp1KyhmKXEpd1IhfFplZWkxa28zOU5LSGB5KGAyemcrKDs7YyZQQURHWV8mRyVtCitpPlYqPyRRaFIpaFpXOD9SRkpXfTxaSmhsJk1jd0tiPzctOVVvMX0yLTlJTm10K2Vqb1NaZEItdlZ7KFhUdChwRSlhPihoR0czO2EzM0VQCitfSWReUGhTSHBsN2FEV0xrbk9lV0kqX2B4fURzXzNXNE9hMUdqOFBJNGN3QkRibWtgYFk5PnMpVkpBRk94JEReJnRSPVReeU9tR2NFLVpoCiswV0h4VUN6MTBnOXU7K3BRV34kSVpOYkM0LXtpR0I4ZXsjYWtncklwRjFnVH4hc1djSE9XVislSDBPdEhOdF5mfUR3SGB9a2coOFd6SVU8CitmbWhXNE5EP2xjck05ZShrPDZqJCNvUTFMTU57akFYVns1Uz93fnhpX1A8dXk0SnVjaDgqRGRwNUw5eSZmNHJEWk1fPE56VXBNJXhJOzN9Cis9MlkoSzQ5NkdVMGN7Tkk3ZllGNWFRM35yRG5jeDlFMloydDhjLWRXUShmYF91UUVNZk9FX0lLJjtfbCV1RSR8OHM/OU02TGQrZiVGWXtqCitKZSo7aVUwfFhRUjAwME84Xk9ZN3leTyZWcTJucWxJKWd1NF42YVdBS2FBfE5hYiMhVExiMXp8VmFBYXc2YjFyYXM/T0khTitEYTBCPVUyCis9c1RMcmtWYUdhQUg2Pz09cWNJLU83dCNSVVAxKHp+TjFJKTN8PXg5YShjNUJhWC18aVYqTDBwezhSLUsyWGB+WWE/PiZ0WTEtOTZae3RsCitJc0FPWDNRVGtyfGFsKEkqeT1RNiMyaHFFc2s1P2U+X2ZOaiRWJkY+UUJVI2xOJEBxS2RVPzc8eFJDZ2EjZyYzWGhMQ15KKz5FOEZSJm1oCiskOWxsUTc5eW5jRmg3ZzhxO3dgdjVGKCtJRH02XzVoKzU0UXV3aUFqYD5geENFcDh+ekxOYENHckwwYHE4Y0dwPkYkUyU+eXcqQGV5dnZYCisqb2VmRU1VRzN8MzNFV1QyNTE9MkRRazlXMVlRdjtmcDZ7QFhhRnxHekUxI1pMT15MWFZTNHd6NDREaDJ4SjFKY2ZGVUNoIUU8bUQ7UThGCis4aWleT21YKClWSWk1UUUoNjIhcHxNMnNxeS0hRFM9IXE8ez0wbkFrKjt0Y1IzKjIhUzZzN3I0ODxWeSRNfEl4blchLXooVWJgTGtuX0o/CitqNVVXMXQ5WjI2fnYmcFhOY0tpYWtpJnpGKExteT9lS1R0czdFSE0zMCpKbitPIUNpe0F3ITYjNW00bkNsTVh2T2dXMDhYZilnRyZLPTQ+CitHKWcqMjVUZTZRbnJXZEoqXndoPUs4I053bDJzSyExSkpLZTtCSmFIYTdRb1M9YDhMXjdwI0ZxVUwyRytNSSFUZCNqe2FfTDsmXnR6VyRfCit4QVJyZCpBKCpJY3M0UDlrdXg5dXxSMzNucDR5dWZlN3teTDhreldyJDlVfktfNnVVdUBnNnROWEcmNSRaJGN2PkNuTS03JitnWEhVVSRtCisyMjx3SHpeWDctPjhUOzA2akxednUheGJwSVBoNHNyIV5sI2YmXkxeS0MoJDRSJXNrSXJfPDE5R0N5TTV3Zyo/QHBXT0g5OzAjT35pVFU2CisqNStlPykxfE8xbE1TbUFKY0hKbyheeTgzNHBzOUkyY3hmTGJYTDVVU2VRfFQkRj5WXmdmdmU4fmU4Qj13NT0kPykoIWo1Rl9JSypYJStfCisjZT1JfkxQYUpkbUwkVmE5JCUjY2NeNkRvVkF2K0Q+Xyp+V0t2QVJeNCZOeThhNDw7LX5DakQhITRZZ2lRdVNqfWR3QWYpU2ducDV5TmIlCitHKTdeaHpuVEt6cTFhQztkMFVnOWc1OWt0QWJWc1V1OEFGZHlzI3ZhdiYtRG9GWSVJWFdWaU08ZFlHYFhQaGFKT25pe3Y+TWlPNHFLYmVkCishe0w9MShIMmlROCk/fmR+YUFsNUtnYiNKM24+S1o+fjxRKSoyJVd2dXJ6QFhLUWE1KzdQbz12X1ItLVJ5TUxAT0xGX0BqRG89bHkrNG9MCitHZS1DKzxXMzUmaXhJZ04wVnclZkVSRlhlcSFnUEwhVzV1Vj8jY0lCaUJUNDU0MkFGKzRPJHNmODlSWXsweTFQc25kQ2wtd1VAeXZFaEF5Cit6a3xxVFBPd0c7TjY5eys7Rzc+SUVGUTlgWUw2KWRRM3ooWFQ9bjE5QXEyNz88aFk0bDFqM2FlJSgqa0Z9WUBsIW5NbEolaz94N2Y4akNsCitiMyRqUz5vVkF9eSpoaHB2b1daRn5pTW5afl8oaFVkO19HOClobFQzMm13e1BEM142cWAocD5NeERYeGRiVV5XemQ0PldQKzFIPGw3OTVSCitRJlo4RG1xalQ5UWp7K0V8ZmB1Uk9FNmN+QjZiWDYjVjVsPEcyJHQhclhpUEMjeTxjb1dQcUZvWHhTaWZ5SVdVb25sNUs2TXRpa2cqfCVJCis3Q3twPSN3d0VxITk+fTkkXiNKZiUxUE0rO3xIMClISFNkcSU7QCUwVzNYUm00RyF4UHZ7MD4pZVdnME1JRmVsZGd5KitTN2tEUTlrcUgoCitEIXNGRmNlRGFsVmQ4cVFKRn5hfHJ9NTRwMDVFYnxXWDIkQGVQN0lVPTNgQHJ3NURBcFAwJWZjZnBKb3ZeRFhSblFmeyU8Z2BLcyVfUFpoCitnanl1WWsyMkBDRGQwTkZXWlkjX0MjX0YpT1c2K1lEJjZXRE1RdzZWKlNjOz5IKHBUU3s8QElLKGdwaWkxPzh+WUd5XjlgNmQ5SWZadzcjCit9RjdmdXB0Xmo0aVZtMGpUSGlZZS1PV2ZuMDA5OTh4d2piRTJ5e1FUam9qYjFQZXVJQmBrb3E0WVhzYTQ1aCl4PlMmSmNBXiZDdWB8KUJWCitQfkQ9NHsoJUUpfnReI29ZJStqcSglY01HWjk7Skl7LWFZb1M8JlQtMndxTVpzaFMoYyt+UUg2Nl9gPFlwKWZNPn1YPWpGdTNEeH5vWj0yCit7PXVPJGFadExTcW0tU0paZm5lSiNKfGNzZHc7TEdaY18mNj8xSXFlZ1kkS0o2fjUzUEd5Uz8jQUB7WnVYJU1kbTc8TExEdk5JOyR1OypwCitFI3MhbXY8OCk5I0srYjExYXtScSYrVHxtcjFBYjdFU0V7ekZpVTZ+aT0lYGRGMz5oP2Q2SWRlcSh2SCFLUmkhVnFXeW9LU1R8MmRlWjMqCitlIXx5S0JnOSppb2BoPUJadVZQY1JxI3RaSWRwRmwtN2F1bkBvT0Z+bm9YZVctJn0kfDx1O29TfD9YLVZAd3lLRzZCTz9gP3Z4NTJTK2NSCitTfi1reisySj9DIVpNWnpfIzc+V0BhKTV5YU5sM2NMQChNZXI5a3pPUzFsI0gzQVNpMEt9N2E/dGpKWnpoSVpvaG97PmVhRjQmMUphTm1OCisyMThEMn50e1VgfldrWjNEJVZNQSs5MnNhTjFpYDlIZj0mcVFvYnk0fmpYYzRnfGRuUjJuQ0R+QTViI2E7Z15lPUthKFJ4Jjc1TnFKdjAhCis3cWI2dipxZ29FdCpFR1h2bF9jWj5odHA/Q3UoOGw+Mnt5Knt5P2ooJkxDdWFoRTwwTisjVSU3O3VVeU18KmlHc0ZWb0dYa0AkZSVMOTN2CitOSUtWR3ohOStgdmp9MzE0dD93a2xTUCR+V3YhTk5jfTVTaz9NfUxQYjlIcmRVQSZZbzBfa3UrQjQwUDhAOGZ6WnN2OWIqY2VaMkpIXnBqCit3UmEqSFRTVjUhVTMtTl45MDZ0d0NaZ1gjM3FLJFBWaG5xbFg5aDBDOW85ZWsmenwxOS1AJk9odFRzY3tnQ1J1MUt7I3JxeV5TbzdqWV85CitDYVQkYGhQT0E2USRKZl9sNDZhPHZGSzR6Y0ZaZD15JnYzVFE2e1RXP0k/TnBTZyp9eDxMT2Z5aFhYVXo5a1BTck51ZF8oKUt6RG4lNE13Cis5I2dlJTI8WEJ7clFhQnM/X1Q+ezdyd196UzU2SDJeQE9NWj1aY15QUCZwSl5rVH5rYGVYJkEkNmFLWmpKY3d6KXcpSGhjRnIwZFFRVEFQCit7dDklR21SejJQVENvIVFnUlg+JDI2aWFTMjFpUkcrKDxTTFUjYUQkciZAZkZ+fW4odE0pVnVZQTJUfXp4aTFnP0UpZGpMdmpNbk9zJipxCis7RTRQeUZCSWticlZnPV41ITdsZXVVWDF2U2xTY1FEZGZARzlweCpsNGh9X0ZZMEImV3tXVylYNStxTS0wWkp4VCpmKChNenBfUHN4MDYwCitOfE1tMUFQVmR2Ki1SYnFjXlFuSiZtbiNyaWVkdGtWUGBkX0tYfiNOOWZAMDglIU1CMD40M3JOY0YqdSF2ektCPmY9JWM1Z2J3ZmB7PDRfCithcDg5JXAocVpUMTZERUlmNk1UXmZeb2xmVHMoN1V6aj9gQVBqYkU+Wm4heD9sR2oqQ0wlWTdtKykocmQjRmhqe3BBYHt9KVV6NGcyZi0+CitwNU9WTFNwQWpIMCQxRiR6NlM5Qn0rYzJuVXt4Zk5vd005UjZaI1BuT30wZmJaTWRMOVkoJntgcDZ5akpJemdlSUZXVFNTdUxXTzZJbyV0CitadCh1PDZuPnlGJDx0fWQzeC1VNk80RldtVU03S3dvVH1GMX5xbSg4RkVFaj0kJkxmKlN5RmtucWZTYUhyNC07QUBNJmxiUWNGYEd0aHIqCit5SlAtMD9qNX4qZWVuTU11fVFLQ2xANmpoMm5valAkKi0xRHI7OWBlVElMSzBudXk0MnhKYDBRNHF2fTZRe3lyaSZYdUpGTC02VFNUODJ4CitqYjA4M1J4Y2V6MlNtbmNiVmxleVNYfjA/WihVb2A8KmI2KX4wS25GTG0taFopaSlnNV84NzIoeWFmeXp6dCttPjY2OUskZWFGTzlGcWYoCit5VjwoJEI1VGMwSiM0VjI0NU1KX2JsWCV2WnFsZVZMa3NLNTNmUCloPkA2YVdBSzJtdGV5N0R2cXRPKWRaZTAwMUJiMDAwc0kwMDN9bGE0CismVXFYPjQ7WlZzJlkzV0ctLWRyQnVPZytifDVoYHp5SGdGYjhuYDBtSEp4dSopdHo3M2ZpclpLYDFfT00pYikkJV84X0RBYFd6cHpVRVowCit6P3dZJEh5bTklRyh9PFAodkklM0lXdFI+bSRlfVNVcDQoPEd2YFNhfm88Vzw5XjtvPzQyVHdNV0dVb0JVY1pSYmVMZyRBM2RfUVh0ZkxoCitlaCNGJlUqeGZrKX1Lbi1Kbj9HI3R0ZiFNNGl5dDJMczV0X3BqSChhKzJpaWM4bSFvPUZeKEchZmEkd3wtd0l4a2U7JmN1MiM8Nj8xSlZFCis8b3UteHxiYVQzamtHcHJCN2pUIWJvRFp5dldLOUtlJno+KiVScU1vNDR3YEdYcVo2Nk9gaXd2LWxMaVdxc09GUnQpTzIocUtOZypCSkdsCisxKTc5WVdeVntZSTkhSzJqYUNTYWVjWHxSPDtLblJ3RCFZU34qMWxZPzFDZ1M4VG9Pe1E1VCVtPGl1Z05AUG1yOVo+M2AxVUlzeyF1ISVwCis7PWRMaEAqPlE3S29HRjdxMHlfMmdveG1gR0IoV2kmJnIpYnVBYWZ5fXIkTEc7WWMyYks8O1cjbVh3enQxWTwwXyZBQU9TN0FNdjdWKFU9CitXZVh+PVBzPkY9VFhzZHg4YzZMJjIoPSErd0UxSnw4QWZ3eWpBR0dIUE9Ab3BZX2NyeV59XyNvK0xfdFlye0VjVHI1WT1xd358fkVrP3tFCit6WUdSOC0oVFAwXl4xU3x2OGsyeXleUHRoNzl4K2Y1V0dzK2dzM2hJd283PXZXJjlaYjlKMn5KRSo9OXN3aU8odDl7NHFnJT5wNVp3aT19Cit3VCk5WCZBNitHNldmd31VV2dYd0VhIzZydlApaD5ANmFXQUsybXRleTdEdjlUaEdeZGMwMDN3UjAwMDtPMDAzfWxhNCZVcVg+NDtaV015CishMlduKkQ8WD5WPldhQ3lCfE8+NWdnNVdWWUgzQFFOYFRweE9CTHRPfD40dU95YUhfJF5WVnI3a19FdnNGenYkRUBkLWBTUHFTaDdyZEM9Cit+ezRjVl56YWBCV1VvKEdBb2xaeHc+OGdhY1ZPc3omVnlvSDB1M2xLJW08JFhFZGQ5YmhsND00JTN4bmJ0diRqbTUyUyhyOCptRzI8MjEpCitSM2t7PnNwSXg+SmcxfnRXSEw/NCU2LSZNZzZAcFd5eUhNYWUkQWFYc1pNZkpqPj94KXlNWnZvYj47VD5qP08xU24rN0UhUEBMRnp0P1F9CithblBTZFM7OH53b0x8bUdadmxWJEheOEBkJnpybGlIIXReM2tLYlNvS2p5ZUVYQzQxIT52ITtkRDh9ZGFVKk10M0I7MEY8cjQzRzVESUdHCitKUWYybzJmcWd3MWpWI1d3Zkt5M1FCYXRYXjJ9flBIVi1ISXhxflo+IWBIbVhgd2Ryb3c5LStHbXVZRnspMnZVIykrUEw3UjZaRkQpS0N7Cit+WG5OPzNsRCpwTHYqND00MjAkNzktRGpHQURMflJ5SXBTK15aKV9YREwleW1JJTJ8KWxneFJwWXcxOSZRVj15dFRRdWpJQ1p5O0tTK3A+CitzfGI+d3FiRTI1fHkpR0dJZkwxY2tCQyRZd1J0P1hsT3hOVWNoQTU4KkN9ejRHYSgjKjFqOz1jVkVyQFVMbFlWK2ZnWE9KViNnZ2UmaWA3CitTMXR6Z19ldH0kKVUoU1Z9O0s3YDVtS3F0RGVUTlVpdmAyTH5ANis3WnRkeWo7PUZpPWhMPkk9M3A7MFp6a3RnayFUdGU3NmtiVWsqU2U4CisySGNfSCsmVH0jdDRsSiRLMnlMZT5NVGo9QVk0T3lHSnd9YE1LT29rT0swLXEyUTRmfiE1K0BMZlZ6VGEyKH13b2p4JlYyTHdsSEBZNWVXCit7Sl44WTc3SllxdSpNdnlmaE9AeElHRXtCWW0mdGIwdzhaaEE9Zik/QEpHdDl6bztKc3ZFOEw7LVpQc1Z9O3kkN1lvRFlwJCpPKXRRT0oyCit+dF84b2l9KiFtOXhsbT1RKHdEUT04VkFGPkBMMVYlfVY9RlpMWThmV088QXh2Qzw8aCpwSWMlPzt6ZH56YE8tP0dqNy1eME5kfTJGbm1SCithal8lbTFeTXk3bGFiam5+OEFHVkteQWVJODA+R05JLVBNWi1xRXhPQiUwX3RMbEdTaDc+PiFEdnAlSFh8Tj8wOG1RPDFRWS1PMDA7b3tsCitAPj94TCshdyUwUlJBbDB7e1JRMDAwMVJYPmMhZmJaS21KRkpAX01XcGpDUmJZKlFXYUN2UH4hRVcweTQ4OGorLXI3U2BBVHhGejtNMV5TCishK2BiQjBYcWgmT3ZsPTYoVihRZGBUTm5iKGxsXiZGbDYkKk5BaWhvb0xDfF9SUEtETUNsbVhzPlYhdjNabUtQaDhiUWUpRElPTlVBLVQ0Cit5cytLeX5wNnRJaCRnP05lRSFYP2M3NCtRVk1+OWl2dmNIU3klYD9HWkhZWUAwZDVBck14e2hwZ25wOVBBciRIQW0zMG4kYnpkKEZabzlTCisqQ0BIZDRCNkc5cUVsaUhrQyg5JjZ9YilzNDxyI2UkeTJoVTY4VX1CVVZ0SzV5d0t3OVhnXnRjP01uOGYzXkImdT83NV8pIT0wdmh+Y1BkCitQVUNaWGhodjtZMEleeFFKLTJWcVpQYml3aU5sd2M+bmtAZyl6Zz1xI21eJmY9blpRdGhWYFkhVj9La3BmQTVNT0BgZV5TZ1VBNEwpNTx1CitrdyEqUyFWe0YqfCZyOU18M09APTJhOFVnUWVBckswJGBpO2BCcl5vWmI8JENYaERSbFRmQ0k8JV5KNyNfVkZ4RGRPWEliYn5xODgrTWVfCit3IWRze1NzKnB7P0xNdDtaNVpAb1heTUR3ezNeb296RzhYNVopT096MGhIdldzdjM2JUI0dXJMM3IjJlljM0gmUy1oVFEyYjluZjk+MnUzCitJdWZ+M1Q7UmRoRnlkMWlzLWklYm57U1F6fTB8WFFSMDAwTzheT1k3eVZOJHdjdmpoTUR7dE4mQjZhV0FLYUF8TmFiIyFUTGIxIVVmWEo9Citfe1hEKURnamFGTjQrY3AkXypSTFIpaGYxd1M2eTRofTVBemF0R3ZHUmE5VXZIckslZ2JjPTA9ZU1OaE5XQXtTR2daQ3xnO3A3dDc/aWVDCitLQFVxRHNqYzwkMlliUj8kMzF0WnQrLWgjYSkhdClhUjlwQ3NZRGtpeVZjIWBZIWI7cXJLNzsmfH5GcE5KP3FSa31OdUkhVE49fEJAaGghCitrSVpLTj1tQ3RVa2xuOHcwN3EhcktCMU9tVGdfMV5JallnOXFBXk80V1ZIVEVAYSZoKDx3YyF3fERvQ2B7QkFaak8qQH0zVCo9fW5UbH1yCitxV0xvd3JCdFlvbm9DNyRsSDh6O0cjYmVZbThgMCRxNT4+Z3hFZDhpZkx1K3o1cCFhQ2oraUtUPmsja0grUilsWGg5RU93RDJmJCNAdnF6Cit1bGZ1TDQrQGJ+QU48b3QoJHN4VkRIcEVhaz5yO1RhRUNeNHQ9byZMbzB5dHVnZiNecmp7ZTlwTGh1NH0yYS09RkxYQCRJa3dVQ09vVVZPCis/dGhTX1o5ZXdROGZDQDcocTZEdjtXZz5lcUN4MChWVFlVeExeSEJBZmJOXzMjWEVHPCN4QjBvRTBSO3MzMmdCXmAlJkZub0JudzIxTEBXCit9NVFBJD9kTks8T2xVX1V2PEpsJFZ9TUNKNSl6KWY8KzZAfEZecGdkO1YxYmVWPUVDPEAmbj5ANmB5ckd1cThkS1pibW8xPjJ6U1NtUXQ4CittLSswKERQWlU4dVh9MnlYTlJtemBrPX1lT0stPClzJENyQEt7SnlXJmA+ekFOSU0wel9kI0BmRGsyN1dsI28tYjk4eypKNjFlMDFqNHBwCitKOWZJZl90cCspVWAoTitSaiE9bCs7STkjSWlBR09JVl8+TnVFTjRvdX1yR1lYODBlO01FYlNBd05FLWpHeFl3TmpTUEsyb0l4a1YhblV5CitOQXNgPTJXOEg5Tz82RlFDUjcoZiVQczN9VndPMHk3a2h7TGlVbGVLNV93SFE+Qko4YV9aZktiQChNMHFGUShaV21YX0UkMyEyQWAyPVkyCitjbHkqWUQ9Y2RQeUNBenlBYjBafWohP0R1N0tZcWkpblRKODxCZDtPUTZ0OT5iclBQPWx0TDNkRCUyMTxlUDYxNUU/JFJlXzM7NldoPGZsCit5UkJzU3xtbyEtI1daeDlhfjdBPlE2Xj9zdDNPWXxQYVNkVnBEbjFmYHwhZG1hSmRGZTJQMkpoOWA2PlY3bCRxT3lgKXpROCNpR3ZDRnYrCitVQFJsXkFRKCl7LURsbWB0R3U5S0NTJD8rLT12fUttU2t0QDZ+Mj17fUB8JWEmTUd0SXUtTk4oNU57U0J7TyoqJTNDYEk3SXMyTTF1QEFGCitvPmF8fVVKRFcqKXxUQjg2Q35Laj5TQ2A3JG9qQ0JGaEMjVkJOSVA9TitYZU0wSXBCNjwpelB3Nk4mSjRCfnlmUXZsfm50aGVBT0BQRXw/CisoWjctKzZoTn1LZEFnQFcoRWA7Wk8yPGU7UTE9Q0UhYzdSYj0mXldVQldiRTA8bjU4cWVoYGFYYzFmdH1fUE9pZEtfMEJjKWpXSzdOMEd+CitTVjVPITE/YC15MGA2ezQ4dFh2WFp9ZDZxZElxYnV3JChyaHdLYzJyI2UwX1FJNkBPaVBeWmBUT01ZeUJOV1FlIUhmblVWcy0ydSlgWHRLCitBbnN2VmR7Qi0wcykyQTlXNHUrRXN6aTteNERxSk5BMWBeIUp4cXQmaD9BN2BNdmczVz1saXRpfm1Na3lFIUE/NjhANFhvWGt1VHxFe0tNCishaDVLKVB6TDhFeGQobSojVy15NGUhfmMmO2YkX0hAUXBgaTEhb3o0e0NTalBURE84VWtpLVclT1QlPU95ZGNtXyFBPFI0SGNLMkokJmg9CitQI0V4bWU4VFc5TkZBRSNLczJAWD5gOFhEOURmNz9qe05wZmVJYyhLbj52c2llZnFlK0JoY2ZTPTwqJUdjTnFRNzJ4TFVuPCEhJUZUX0opCitDTmBIK2tDalM5WU85S1FIMDAwMDgwUH5kPU40NUpsQHNTMXEwSjlZVTAyS2ZMMEJ+dD1GTGlXalk7IU1mYiMhRTViWSl+TmFDeX5PWkV4CitFKTVkUTk4IUtwQUo1NFFHI1ZGUUJaTHkpOXYmQD9UWXRWTmR2MHdiTWNDSzlRVWxwVWshZjhRUFRWb2BFWjE4cU17OX08Yj05Z3B8JisoCitYWmAlMl4hR09JdkQpVjx6JUtZMExQSFFDVnBydUQoYTNkT1lQOHRqTUFIekI1V1RAMHEmMjc0bytFUjM8OThUe05GJlpBUE94P04qMilpCitrQmMkckNCU1ErfE5ZQGc5V0d9eCN5JnxTLUojbWdwIU9LKjNRTkNVfXU5dzwreXR6V1I+TXZZIz5vR0hCPEtDXiEpaEVobHxaPkF5YXMwCis3UWJEO0o+NSo5WTIyYzIoQGcoJGFxPSFjSXlgIUw1Kzkkd249KU5XTmo4K0lMJnI7QFpPSm9gJVotWkNpbVZqfVh+QCY1JntLOGBIV3QjCitMWjVnRVBBJCstcntEUksya1QpdWwxdGorfElYNn0tMzNAYWRVN1ZifksjUHVFI205JTJDLUlCZG0rWEtBPEJ6aihKe3paKDxDcHY2KlpiCitwKHpYTSFMYVJRQz1iLSpHdDxJSWhQYVYmWGBYKXdXTU55ZCN+QDd3Y1NLc0c8M29pOGpWTDh4eC1BaERERTV5S35pSVZPPmkhcDNvRWFBCis3QDg0fUNfNFdhdVEkWX1+dWZqXzZKYThSR0d4TGdXMHlsbSZTNThPZ1gpTXdET3luJHVgfCM/Qk5ebk95KmIyVnBFX2hFdnxJdXpKMU9vCitTdjF5OWFSQWArK3hhdjV+Jl5YMSUyeiRYZmcmOWZ+UjNDRj0tez5BJVZpT0BidH16KShXSGhvQFhWdl9sZDk5KUF7TjFzQ0EqP09LP1VgCitTK09vZWxNeiN2bHY7emRGX202TiopdyklRilzPkFhSkpGezZ7LT58dWhlYXNJND8zK1RSWnMhMUYjQzdhKkZkb1RJTk1LQFlTY20ydDVKCitqayZUQGwhTT1BQSsqOzQrQl47KmpXViY1aCpEdDhmYkpJWkxeS2hzPSlzYHUmdEBzfCs9SE9ENyt2Y0kqbnA+c0tLXlJOfV53ZlNaQG02CitpaD1GZCNzQGEjTDVPZG99VXw1Mz9ZWlItN2NtLTNtaVNGcnhoaDIrOVNXdDgpS1U8QT9WRmwtPHpFVUFAciZPXnc/QEZ+NCsjbClPUkhOCitAa3ZpNDtsQG9eRXd3PzxnOXUwbjJYQyZlZl9oVlEmZF8tJDtFK21AczQ+NCZTVkMyRVIlSj1yMHQ+R0lweXY+aTdhTTNBanhBQyZjRkM1CitUajhseiVZKUppM1Qoe2pXIVcjSkopVXA5RE5JJVlNNFFFaEElSmhXJFJ3UEZFSzJRZmlCX0E0bC1Zel4pNFRHPUBaVkNuYn1yMnktZkRUCit5RzI4NTJHWlhRWExyWmdvfUZMVVNtQGFfN3FAOElmJEp+QWJIYHVYZlNSekdwbjx7P3dfcTghOC0jVTJWRGRjMT0pejlVUlEzOGVKKndqCitFJEdNaS0rOFl9NGtvYDJpdTQwTTRIMXQqUDlSeHVJUmRaeXxUKFl0dE83NmFoR0ZBYU82Uz1Tc0Rkcm1mRWtQITByc2g/UjhMQn1nNkpRCiswQnoha3VLI0dEQylCP2deX1U7LUZPb0R8WSZCUnhFXjB6cWl3M3I2STwhYk82ZEo9NWRHMz9xZV8pT195TlJFZ2A8c2Rfe2QlcF9WTUQ3CitaPihQRkRxP1BsXz8peDAyPE09d2pXNEY+KnNXSmsrXzhnQ0pDWD5OcCFXNytmYjFMYlFRIXB0UmJxVE5Xcnl5SHJ9ZVpyYXJKPDd2MDRwCis+RUJoTk9SWVUrTHpLTVFtdypDMlV3NTZnM2c1bUl6QmNsM0RoR0w5dXFAdjdTN2R2diZWSF5zR3VtaTEkODUoNCZmc31aLXJtQTglPGorCitNJnYwUkBAeG1ZTzU7YDZwNmcqezReZ1lmeTFITEBKbnl5X2RTMEQlNDQkeSg+PHspTWB9SF5jXlpVPjQmayZNJlZmTWBTKztyWFRja2VwCit4WiZUMz01WjJGS1k0QmJRe21gd3JtZmRLMTc3WCZhJTR0KU9aNTJ8YGVReE0peTQ2T01AUHg1KHNrNVA8aTZQKU4yY0xxJmd2YzBUZjUzCit8KDZWKG0pQ3IyIU1vTyZgYUIrXl9NaCFLJW9tWHt7PCpZcTVFSDg1bDgmfWB8XzRseTZuO2JHez51KE9BNUwkV0tKVG0+MzM7T0s8bGBqCitPaU1WJCM3UVJYIUEkM2BUMFlfWlV0ckN5XzhRQjMqNVZDeDNsNGB7bWtpbShMdGM/USVSc1dJVEZ+WH1+TTY5QDJvd1FRSWQtP1dsdXZ4Cit3NWJXejsoNUd0anotI1ZyJV9XUjJlMnJIJj8/aHEoMU1QZlk+c3V1Wj0pLWdJO1NGfDhVUn5fb2pSRjRIOyYtI0l6Jm12SX5AK3h0fngxCis+fiFwZGtmfmFeelE+bkpxLWVNKSFTdilTQGBCb2xwVkFlSCs5XkNoKUpLPjQkRD1Kc2ZoUzR3bHp3PmVqbzUrdWIhR2IhKSRjVkMhMjtTCitmRVFhOHREamoxbE8+Szd6SWIkPHIzJCs2TD91PTM3Zn10OXw8UmFyWSRoSDVHcXx6KUBuV1lSLSlDZGVTUWpKXjlRYCV4RnhJP3hyTzc9CisqNylpQnY/UipBU356bFZ6UTk1V3lhKngxWEhyPk5XKW9+Tig+eVFgX1pLZSlgKHp4ck4hO3tNP19vN21OSE4jVW1LTUoyZElgVUQ4JWhBCiswfSkmOSRtJGF2bkpAISU4LXItIWhmc2VTdj1oKyEqPUpUPW5TZ1diX3xVTzlLUUgwMDAwODBQfmQ9TjEtblQrWnpjMDBDcE14MDFwNUYwCitCfnQ9RkxpV2pZOyFNbFgpYlZpI2FUXnsrYyotdmAmU1NTOGZ8NT8kfFEzTyg3K357Pn4zUmN2eER0azxQWmJ+RW0xYnBHQVdRJHlGSV50CitVLTNnPHd0SkE3IX1eZjZyREN6X1JsVFlyUXlhWiE+dmkzXiZXUUR6JCRoSmhWfC0oRSg+YnZZelpkbSt1fVZIbEU0NWxJO3NmYn5hYXVQCit2SitNYWA3RilTaHloI2hndWJrYzh7ezhtVGVhPFJUXlI5N2dzb1orVVJuLVd5Mjx1d2U3Tnk+fCtALWFqWiRKSX5ANlVJYD4oMHI+cm5qCit7PWQreWQme3c4SjtNV2VTe3NrVFhTRGA+dztEOTBXNyZgWWwkZ3tyZ31ZPClVO1NGfWNOamoqPVpATHVwZUgjeGdpcjRmNWwrVGl5eTN3CitOU3ZoM1cxN1k9Qiooe3cxSH1zVlQhTStlKVFHenZXJXt4bVktSmU3ail5VD1Kc1NqVyZHRzdjYlpeK0Y3UCtNNmElZWZ2SFJ3cWhVKFA3CiszQjZKQ34tUyFiMCReVWJRUXNOY2VHQ0lLYXdhemhAan0hdE0qVGRnP0s3Tz4pMSNDMlkzY14oemZofGViUCFTNzdLKSR0KnZOOD5ESX11CitiPWghaFNGSTUrJGNRUnVIRSleP0ZDVmc/TXlPSklCV0BeYysmTUR7N3F4NmUmWCE0TG5mdEE+ZzxsQ1BZanpOPCgoMmw9MmMtfH11dFBICitTOHAleVlEajVEc21FKGE+U2FJRG4+fDFCUzEjNyMjaHtfelRtQkBUOEVHZXtJPio0S2BnZyF5UXUrOW9uIXJ0OXx4Vj5kYWtpc3ZQSEIpCistbkk1PFdoQmZ1KXZ5UFdMKXBjP3stO1cwJnZHYDhBV3hxKyRXanZIUCYkeytaNDtFMThxZSZkNjV5QzlxSmlSeVlnTXImYF9tKT9wS1RuCitXO0I+eUIlSCgqUldQcG01Xkp0PStLfHQxUWMoVUhhXnp1WDk2d3hNN1g3WmdveW15Vz5fXj09JDxDPnd8aTRqXnVHQUpuSDF7MWQ/a2JmCitDaHlaXn14Ui1vYHhzJUQrTThIaXx9cUdJS3g2WiR2Un1sTDdOOVYmV1ZyP0FyWEsqYVY3PmxEeXo5RkJgOFdlUWFaJUFodCg4aE1vfWl+CitlVjdgS3E2ZFZBMFFGcF4ma1ZyZ28wZSlkXz9pe282fHFWbFdxfmgmalE8VDtgTyVBYm8/Z3k2enBTejFMfUV5ISNiVyYpdXxRb3o9M0w8CitMd0VwRSg2Y016QWV+SUQ8bkB4eE1mRiQ7JVpseVFocGU1M0x4bV4wY3xNMGJ1QVFILT07ez4jXlZHWGg/WD9MclBsOCExQ0k4cmdLKm4+CitFM0cmZ2BkP05Oa1d4dSs7WE9kbCoqZHIqeiRsX2t8MUZ+fnYoNWw0NTlIRyk2LUchYXpZSVAlT1FDcXI7b2plSFBuQ282T2ZSKDhnc1lHCit6UWhMbXdHJDdyZXo2RUJDVkRyVm48KzNkejE5KXo9bzBMZi1yR0R6fF9xKVBHVkdgYXtrKDloRCRUKE1RQV5nX1hUNy1zQXoxQWozY3F1CitmRXBnQ01tOzRLek1LODJCVGdWP0FDZChFT3ExcG4+eXJAZkFffH10RTRTflVlR2h4PGw4Zmc5aHJKVitYJUYmVl81bz1VckstcGN1UCY/Citwbjc0Y0Q3UTshQlUxNGlOSGdNIThpTzk5KjtrVW9QTD99RjB2eT52RFRLdlNpfVprR0JeckxqVXhBKWdWaztSYTMrZSR+QmV6PjNLMzdSCitvcndrVSohcWRjSG1VXjYlXyRRangyaih4cDBhaFBWWH1+QXRqN09PX00pMnlgQlNEPUMxeDdxXmBkIyElPzcjUjxoWT5AJV4/RjZnbzNvCitlUFl8JkktekktXil3YD9GPU5gM209az8tVzRoR1VZKHJkYzNwUHgzQW5qUU0mckMxRjtsV1huQjt2WjZPP1pxOHkqTDBuN1FyOyFZLTR9Cis7cSgmMjMmUnl2NGBgVks+c0BUVz8mRCNjRT1HWl9aUFBkWCYxZXk7fXokT3I9c1BQfGcjWjI5YzR6VXl0QUArQFBgPVlBPVorYTg5RjBOCitMS3s8UVRGcHExTGxJIVAzM2omYy1zbjxrQ1lMeWtWVWJYPWNJNT97WFZJcUVJfHRaNEpAalZaQFhqfDt0dkNTK0ZNdFFeeGVaSHt9N2NOCitDQ0x2IyRwWH14VV5eSGVYV2R5JF5Oez1fZVNZe2JUJSE1MGY1cyVmOWcxNUxnYlV8YEI/SHomaWFpKEN2amNjYTsjaE5pQHxANHV8M3U4Cis1T1dNRy1wYk14TEwhJFZnTVdqTlU1UUh0PFpLemhGQCpRQEZnZlA8QDhtU3NKM2ZycXdiT2RPY1YtOGI3bjs0YXhLZ084VWJ3K0xabG1+CitOSXZqTT5nTVBlLT03Mk9eTTFvTkBEZmE/YnU3cDhyMEJXZ2sjXiQteUdEamwyNDE+RU8ycipLNVB3RXxDa0R+I25EWTFvTUtOWHIzWk9kCitsQVFFYFR8PF94WHlsbnU1PnwzT35vOWApZjJ8SFk8RjhjP3woUnRNPlArOz4za0wqNzI8WFhJNHdMV0d+cmpjOTJBamVxZTdoYGdnbl84Cisyd2ooM1FPRnZjT21yYFFPeWFLQ2JaIzE+bT5APj5uWnleZVFWb19RPUtvXnlHSmM2X00wJWVLZmNIRlVzMFNeNzU8MWIqQTRyel87RmZDCitxSFJtOFN3M2cqWXhiJkZNMklZMysydGs2KEdNSnM4I25eWXR4bmU5KXA7fVVmP2U0cXlYeGlFdUExOTU/I3B5aDV0Qnhgb1Q7MUZxd1QxCitASmBwM05ue0ljTTArZXw9dCpEcSYrKThCXkQzRyVIR2FgcEVeaUw7cT1ydklyMjM1Mjd5cih3aWR0RXd8NXtXVWFpZFckSkE8bkRwLUtWCis9LU0mfClMKCZ1TTFle0BVLV9KWkIlY3hEO1Q7R31MSEhLQ2FOanBNfEM4WnVIOSY2OypiOEFmJWNNM312fElAS3w8Rl8xSSFCNERGRio9CituU1ZJKSRKUyE0R2hTTWBEOVIkeHlCNishZ1JYKDQ5JmNYX3VyZUxhLWRFMyYrUCRLemtzNDxmJl49WVFQKmh4PFIxTHtsVT1jaVE3V3laCitvQmhTMW5MMXNPMjZZV2ZUfWIkIVYkezBUS1ArZEJ9SFU4QlY0QExeM3pRaXRPZittYm4kVTBaYkJwJHZ3QW05eGJHUExVYSR7NGZnQGAwCituPEdsNVE7T19IdHc/RFhYUnV3R1Jye05zeXs8Wihwdk4oYl97QyRpO1ZzamgzNzBNJkFMJVh2azxefDZ6Xn1nPEdXSCMmdzBqTnZldE5VCismMSt2TXl6Pz9vK2VEdVErQk9NN2omM1g3Kmp5ZitVZHVjZ3AoYHY0YlgyYE1nNkJ7eFhJTm8wdE1YWSRwRG8/Sk5LMy1LNUZlYmk2Qmo5Citxd19uVjVwOWxhdEBUVEN8Pj9FSGdYKkcpSSs7cnxiKHkkI1Ikb1VGVndKaU87fkNZJX1jQ2M5NVI3cDhgRTdtYFlOT2gtQ2pUVVk3TWBLCitRQ1V1KUpEPGxPQEs0dGglfWlNYVh0X0V1WF42Vkd6aEg4LTlqOT9qSD5lR05VZWYhUUZUI3tISSlnI19qUCViKUdKdXBVMj1reWQxUz8+CitaeG1nYEZDYTwydUN7V0ZBR0R2VG4xVVElKzhkR196b3VZfDNndWYkRmhrTlJrJmd0QDtuWDx6Tj9TZGswJCFBdCNBT0pUUSk+e0dBbzkkCitxP2h1X2xGWjE+KGZwN1FeQ0khck9pTHBiRFk/RTVjWTxGZ1VkTnJNRntYSkgqZD9wendodSRtUkt7QyFjM0hJST81Z2w/Yz1tT0VtMmUxCitJdm0mRmojczJfTU85S1FIMDAwMDgwUH5kPU0/YSY0UjhiODgwUHJtVTAyMlRKMEJ+dD1GTHE7ZEZKRTcyWmZTSTFVb0xRWXI1Z1FqK2N4CislaHt9bmB2ITFDJVRZa1I7UWlseF9VK1UqOHgtTFNOfkFHJClKQ0VEZzlpeWtUMkByd1RNX3VlQlpRRDJWSjg5XipsPG0zRFBCRzFtd3s+Cit6SWo3bCFkWFhUTSF0dnVHIUBrKloqK0RvVTtMODhnKih0OHtzR2J+YWdSd1A4dUp0amJEQEJ3PSFjWnh+K35sfjwpbT9DOzZNalNIO3s8CiskdlVBd1VXaWt8NVYwNW5SUWpsZH00dWI8dSo9c3FSNW52amw3RkRZOX54dz17JVBVenVsSD1CTiNXIzRrej9HU1RGOFV1YFBpSDw1I0BtCisqX0dPQ2ZZZkZkWmR5LT5HSEpGc0tMRCg5SiFjRF4tZDVXcmxYfWlsOzducXcjYTYzUzcmRCkrO2c4O3dUOEtIfGJ4VGtaYVZKZV9XfFBTCit6TmYxV0RGND4zYUU7WjlSbzMyRWU3QGEwc3s4PnBZSGxpcX1BN0x0VE5vYmhxKmNIUlhBODlOfmw3ZXI1PmoqSzt4aVJkdylMZEtQTH44CitNZU5YeXhDIVZhTFdVfmhjQElHO1kja1YpNkRpNkluPlNyWkRmI0lOLVZ8MWJYMV8rXiZtbWNEbGRxSnR8bHU+X0lKTFk3R3E4SWRwRENpCityPjhleDtvTjxCaWd5LWVvViNIQT1AeVlOPDVhYVY9RzRTVnl9OE5hZ0A9SGxgajRnJlM4IW40fVA4dTJLK2gzSG17KCNCUmVgME95eE94CityUG0xVChZT31LalZNUSp8WWM9JWFrejF2fTl8KDZPNGNASEQ0anU+eT5pSmZZLWIlYnJmejUleEtMQT96fmxuMiQoUjh0ZTx9elU5Y15YCitZJEx9eEJNISRrISlHbGEwSGdhdCY7cVFucG9NV1FgTTkzI0FpTTxxZ311cns0Ryl6WkZmJHxZYSkxK2NmYk11KzJAfW1tVlM+ZT1sOChYCityO1AjQiZKVz5yZSMteVhjPE1uWkQ2RWFCNCQ/aVVabnQhWVprOFJReHFnKER9PUNTUkcmOW1IJkh6THhgOFZEX0w5a35mYDB8aEctcy1QCitoeWdPe0xOJGMxU35uWENfcF9nb2o/MGl4KkBGTDBwO1BIeUBmeSRGRGE4P08rOHVuMn0qPDZMNG5mfDZaej45Qz5vP3RAP1k1IWVkUEwlCiszI1FRMzBtajg7RmRNYm9faFhWMmZZXm05QzBEJDFjJmw8X3U/RWJ9UzchaCRQJkRla1NyUjM1MCQ8TiN2RnhlTCVIXy13VXkzTiZ3WX1sCitMWG1OJUAhaSU7NFZOWSUoYD8/UlUmYUVBcVkrYlIkOyghezNNQXhoSmkhbTgwckZxRjtNJkdVIys1K1lobDV2QnxVZSVhQU9AeUZxUjQpCitjeGZAMUdeRSZsPTFqel5tX1piYWRsKmVHRnojS0g+SD1QMGZOaTk9c3ckX21MQ2gjOXEpQjwkNCM7eXYzfmduKiFWUTQweGN1QUBLPV9LCit6JWBBQE4+MWRufFg+a2E2Y2huNDZKcTtIalhgdWhnI1B9NWRwPTEkXzAlfFY+dUtIeSpDeTRPNUx0Q0d8KjgoKFRCTVNpezE5PD4jNytCCitELXRVLSt2STgwPDhHNWsxSjdFYkVBSWtkdC1NUllueWZFI0teKEp0dkwmZWF9bGQtaE5aOXQ+JkRoekJoS3YlMThTSlo+Nlo7VnYhY28oCis5KVRMV0pGLWFTVElfeFhIYXhWUjwrSyErXzAkeWUmeFB0VzkyN2xXWnErai19SjdDRWYra2RmKlpKNWpjZCM/UShWU3pkalA4UyhJeTghCispSTRQPUdCRERQTkxDZGR2blpmb0tPQ1c+bEZtOHVmRHE3PDVMKVNrcTxCdEFpQDdgZGVmcTttKlJBeDI4YypRTGRgKTN3I3Z2LT40UVRHCisyUyQ3emR+b3R6VTZ6cFQ4Zkhva25MZWVhLVcta0N3IztaUmkpVCs2Jn0hX3pVYGVMSUFGP1F5d31QZTVmQiRge0A9V01xLSRyeGl0bUhCCitlVG19PnZ2WlBsTFZjJTV8OUVAcDRnRjhrNmt+NTQ4dn49UEdlbDVVPWpIdntCXnlIZz1KdEh5aSo5Ui09amVyejVWfCRKZjR0U25ic21QCit3WW1GdSRIbiYlZjZrcDhjJE1Welk1I3JDa303Zj0majVKWW88NU5qY25uaW5TTFB+Q351M0pNX3xMPzhGN1JTfHAjbjIwO1IrMis4NCpNCitJUDByNy03VjN4RVVhV18lMCtqNXE4ST13ME9FO3Q4YmNjVn1AZyFMc21VVWBAX2JqNClXN0J3PF8+Y1Z0SD1NWi01Vm12KE95M1MlOVBwCishU3hFOXk0SnxTckRXZVdhQU5INXJjTioyUGk3YE1YcT5lJCZwWSsmcS1HeD13V35hLVhvMikrNj5+T3hyRXNOUitUPj54M0YzZSomRDV1CitaYVg9XjM9Q2tgJjJ7XjYtVmkzSyhpJlZ4TmFGaW5lYEhZbiFxODVWNklkTG1pcEo9UE9XTHUleT5NX3BmbWtOc0l0KlctQlped2lAJDRFCis8SURuKWVPbzVnJSZOZShwVWJ3c3YyI1ZRUmQmeFZlNStEcyZAaCROMCNwNz13XilGU2JAKXd9NS1APlhGXlhAWHJNeGFgS2pBeytESFY0CitIMTAhQSk9SXthdDVlRlJFLU5sKHFmI2AzYExMU0AwR2tFZUErZj9laHZeM0xsd1ZSN24lMm9naTQ5UlpqKmRvdWcqcXsjYGJnTXw9RHJSCiskdjhfUUljKUs9eHBYWGRQeHlKTD1wNWdOTSpWPnxpM3JrWGo5d1oyRlNXTXdzcDNXT3VRUCRjMVEhOzdkWlZMcSZLMHM8NS04cXNVTEV2Cit6YFlkLW9kdFFeK2h2eU5WVzwmb0NpZThJcz5hKExydVhKM2o4cH5IYmJkRmJCQXJwaTRebH16WjtNYjMlMk16Vy0lNmg8WCVhNUszfCkmCistJi03PHo1PXNgbXRhUj0yOSQ0czh1V1pZSHd5cn5uO2NAXmpDKWRvMWZ5bkFmbDhtdHpYWXdXTCslS1ItdWxeS1JBfC1jX3JabU9AVDlTCitKVEBgOztzLShRUWJWazJYSk4oVXlMayRQS3kzQkQ5VClTRHYhfHRoO1lNPnRrVTY2Vylkfk44bCpicF9RQT9GR0dlPnlfZG0waVFpeSZ+CitefXF9a0woWDViWk4yP3s0eXokdSZWciE+bFFra0Uxb25vKj1zdm1ZYkQzY0psfEx+Nnpeb2ZZQHFKKUgkS3NSaEp4cEkyZ1o3XjgjZElyCit1bkcqODxSbCpwP0hJZnNTZ01Aek0lYGlBKyt8MUF8SSQhTkZqcmE0WDFwSDt6TTlJPD1YTDUxNzg3OGxtKzVTYn08PXReK0ZPd1okZ05ICitjVXQ4eH43JE47S1khNWJBdTNXWlpLd1VwJV5PaDtwUFNlY1hSV183IXNGNjMmWj03ZHJ5bXl1e19zO1hOUnc7JTBneG52TSM3b2l+fGU8CitmUFZ2MTU9SWd2M1A7JiRmNENtPTJwUFdzdlM8VW1ifkFgTWNwIW1eQyRHaFNrPihIdzt6X3MwZjJTY0NsdlkpMDJvT3ElQzFndkheIzteCislSFojVSsyeU1gRl84cmZHZSg8KEo/fH5EO08hQTgkZzVjS21JSz1HRDdEb3c2N19UfS1hTDB+MUZ4I3QjQSsoQmQlbFZkOUExSlpDWTl2Cis3Zl9udzsmPmFCb25YOyNheGc8IWh3SXtkVU1gcTY/TkArODs5dSFQT1laKTRLemIyKVZOKng1S3peJUloKUBLbm1pOzUyZykmQm9gNENtCit4cGNAd3JJbDtMQVJ7MDsoelNqfSFnZ3lGe1MtKyNLeV9KT3RNXkFJOWVlN1dvamBZfGR4PlJOcTdPXnt2K3decSk/MUBUaFdoXnV0ITlzCisxcnhJVyZfKCVDWTtLd2hYfGwkOHhQPVk/S3Etb1dNJmpgPH04dmtqUWlrfXFXdyY2QHEwMCYoPlpvdTJNcGxRUUpjaG5kcGhJX2I1PXJpCitQJiVoYlg4UEpFaGJSXm9jdnxLUXR7ME9+WnE8OU5BeFNEVXU0djtAeGxlTF45KjZ1ciMjTU1mIVpMNyQ3UmI+eWNXPmg8KV4/eWk2cGtSCitLeHkqPG4pd3YxRiV8VWZPIWliKVJieCVSZTdPV0JyKVh1NEZIMm9qO1F+e1l4e2hQVjstcVFCcm5+KFA/Uik/aWZAWGFRekMyfD87ZWFTCishJU40MEYrTmx0Q25SZU1PcF9LMlQ2I2d0RHE8NTl+IT5OTlcqWEFlRFgrQnVTTmNJPmdzSVhTPyZNPDZ0YEVvNG4hJWJAX2cyaitmVTh1CitkfWxZbW9+Vm9XS25GZD5kJF8pQXwyTTU7Mng2NEl7VzFLb0heTGcjPmBtKylmelQ/SVp7R2lyZG9AdXo5YXJnT3R3ZXR4dTlUVUZNKWA4CismMllXXzMyRDtNVm8mZTl2NVE4YlhxVXJEaWAyemZWaX1SNnNsO3QwcHklcHR2Z0h3OHopcGxwbWY+eUBnUUdAOGJ8ZTgwTzZrZjQwUWxXCitxUntGfXxHMHErIyNOZ0d5QEcqVEJmanBDJG17ME5YRE4jO0RmIUE9UVgrbCljI3lrfTNVVUR5NWk0JWo3entSSWclQkFPeDF8YU0pbysxCislZSYrfH5VfTVVZ0FaOFNIciRmdWRtVV9zWlBtTEB2aDR9cFBsVyg3VnJmJUxSQFZhPDVMVm9WXipQcTtCV0AxfGZPRFhpezhybCFiaDclCitabFB8dSo7aEVNfnQjNVhgWXlraV5nSmdwXyNadWgwTnB8MislZFAwa09TUSRhNXVSVDNgazF2M2V6TjNhc2c8Y1cqY1FDR2RSMVpibDgoCis3XzNfNj5lZ2hmYD96UW5ZbmRCJm9nRTw/anp7R0VsTCMrOSMmV3o7fDMpZnY1WS05JF5nIUhRWHJ5NFlIMFdSaGg4czI0fWtzbFUoZFhlCisoQTRpeT8qb1J7ckJfd0NDRFRfdlpKXndIQlVzYmxVZnpzVE1qS1lTN0BFc0dkST0zMGsyPWEhP1BhdkdaSHYtZk8maCh3X0JrWipLfjtBCit4dyZTS2skSU5jViomdSQpYmJXR3Z4bmdMTTVeVk14WV5Ybi0qSzVeP2BwVXV1KnZZfE9gV2lQV1JHI0llbXsyMytkKHd5Tnw2TTNRY15ZCitgJTZWSTJDeEhwWUlCIWQ8QHp3VTRBXlo4N3Y9WitsYzR+PTdfNXgpNT1JemdLLW9DPmxhUnAqYipKSyVWcVVVUmYmYXhqMCtrOWJycjg2CitpZXlhMj9WTkdzYnFseXNlfkZBbkBiNyFvbVVqb0N6cUxxRHlzUkBVNSl0U19tTWJNJCZ+dUJaTUtxPEBRR3hRTWNWZmZ5fm13JEpzb09oCitrfl56MXp+QndsSX1+Qk41cVRHOHYwPnFjUDRJan1IWD9SP0I3WW5vOWVjS3MpXjZOcS14X15Mckp5dm1senFxajtaTVF1SUdIIUN3eGQ7CitaIz85OF83U2dyYzE0d1djNEsjZjJSbiVmOEY0QVUyTk9DbkQmODA9Y2UmSnNDNEFGKz9tITt2dW02ZTlaP0p2ajYqbCVDfnUwblkwMWtACis5T0oralAjKEVuITFaciQxMT9OYGY7KHM1JWFYYT8+clg8MTlZfihyMGR5MHVfK09sQmNZcSNwck9nZUNfRUViMjReVEAzMVFZLU8wMDtvCit7bEA+P3FuVGhxdzFwb2pgNWRaKVkwMDAxUlg+YyFnVns8UUpWUn5VPGF4UVJybH4tR0QrY3AkX19wY3pEMShGaDNaUTIwPzAoY25LYndoCit6LTlnMXgpWmFePitXcFI7Mm04ND4pemtjVVhxQ3tQc3Qkcn50aHYpajhpKmg5XkxUVFFiUiZoIytzMlpzWlZmUns9dD5MdVdaI01tVERHCit2dXhBS1hASXc9JXFIYSMzPShTQTRVJUFiKT1SPD5NeytqbCtFKkchZUN0TTJrflckdyNofVIrWGk9UGEzOCkteCYzRHlDTHcpUUtSbjRYCis9NW59KUJRMitVaHFATzgkO2UobnMtVmApaUxORjBxeSNgamdgPWRDVFdjKndXQyorUUpsdmw2U150YzZBK3RYQno7VD1MUmlNK1o/M2VFCiteOz1tUkNDaWE2bGdHTjBFRWBvZjF2UWRfMkFqPFctTnpOI0lYQC1gWmEmenZra1hufTVQPUJEKHZvUlNlcjhgOFF7aHhuKVkqdSV6JFVvCis9c3Nla0UzRlhkYDtaWDVMKHQlWDVJeFZeam9mZj59OGplR3wkRGlkRCtyUjY9bjhzZ2d4NiEmN21pYjZ5bWxJQ2NyOEB6R3RiI2xUb1FZCitaKE48Kz1kSmpTVChld1FgKXtFRGRxSVE4bzQ7ZlNsPU5VTGV2Zk85JW0jMDF8KCQtbzh9RVorYEtGVVRLSHJqUnhIYVl0UyFLUDJEQjxXCisySTFXUm1NVEZyOzlRb1YxIzJuayNtd2NueHE/cT9SPTsxWG9PQGctQldIYXI/diVMS19IUSpedjl6MDMpQ19ncjZHT3BeV3VAQzVaQzJ2CitHTU8qa3FtNF5QOVd5WTchfkBVMVYydHgwbXFfZUpWKVRxZjAwYis2TWl6aCZjYn5GZSFxKih6bmFAT2U+bFZuJX5HYjFSNEckdDBFQ2BDCitGSjhQRCo2JlZUNEpkZElUOGxnX2o4c3BBYnIreG9gVVJJNipHQU5xO2xPIzdGQlRPRiRPZkZjYGpTKSs4THE9JStpOGRwZ3Y4cWhxdFUyCit5KCQpPTJBNDEwPkAqXk8xZl9Wd0hMcUspN1Z4NWFQN0FtVz1xZF4tZ19QYDspWU9wcUNiPyt9QzNgd09ASlQ+TGhnai1pJE1wPmhndUpCCitGTlM4WXZHU3lqeCZXLSEkfnpsJXdGJXkhUFljKjA9dSh9Z0B6WjhGKUstTElfRmUzWUk7QWopIzRMOWdyUnk4I3ZZQ2A/LVBzSzdZZEVSCitHQEdrNW8zTyooNzxGbVVJalBgPlp6dCo/MXpfQ1MhKEFNRXF+PU88UkAtaTB6bClqJEhmaVJ6PUJzISRqP2deMCsmKjBERCN0V0d4blAzCitQPDR0T21IeXMtWTY5dz99SUl0UlhEc2BRMXpfX3QxfTQhU2EycT0pe3sjZTE+X1I8IXk2N15kc2Zifj47cXE4WVkkWWFebnJTKjdfTnNpCitfRjJzYHEtJHIxc0I7LUU1RSM1ZzNERCNTenohX0IpUjtTJEkjX31nV2lBZHF2Q0IpcE5uNkZFRE5YY1c4UCN7Z1Jqan5uWnsyezV7aEhgCit3el95fiU5VCVqS0NLbzRMRWRLaVIhTDxVR1c1LVpmTllFQTc0IVF9YUAyMG1lVSYxWlJVfD13LSpqd3A7WFEycChpOGYzYiUoNWEzSXt2Cit9M2l9YSh6YnBXUX5XSFMwMyM9dkB6enAocyNKQWd+PVFmMkNDTGBNTHJ6OT5Sbk4taGd4NHNFeTtISFVIMHZQfmU9IXIrTXg9S3decW8mCis1dkRtMXgzZztFfmt7YEdrU1JKMGVsJHF6bkVuUyVHNXIzIXF1ektyaiVfPG81cFY8cWklJXQmbndZWlJEVVA4VXZMM280Wnc3bSFESzxpCitvVUB4eUl2YU5Aezl+R2VCUjkyeSpRKGtCfVJnSXtCaVZ7I0A8ej9eOGdyWCo5cihHXjdqRmQqNTN3K0xEeD5rMVFHaSFjeWdrd1ZGeSVMCitwSH4oclI/I3xCNnZANnhQYllhPWs5fE5SJVZ6K00qUioyTEI3dWJodn5WMk1MS1RHajxud1dSY084QSFTN0NBJGVUVHlVYUcxc3h6JXoxCitLO3Nvdytsb318S2dPWTYlLVlmeXE2YHV2PT5te1cjSWJsdE1nQ3JwQyhkQS17d3s4PEgha0xOR2d6bypVJXhhYXdAdDBPVz40WiNsSno4CitMa2EoPDYtZGRWPXtkSUNoN1k8fDtUbll6R0pJSl9oQXlzTTVXdXRKPWFAKDJZdm4kJWUrck1MNEUoV14wKCotNCk5ISt8elJ7c1V2OGAjCit3WHs1PEpIfV4wIyMmKmd+OWRxVyFCOE89K3ZKSHFxSF5HR3lxcHMycz9MOTJ2PWRiQTJIbFlBeUFBS3o/cm17T3AxMlkxeEdfajU9RzszCis3MntjalVPaE9hQmdgI0BaTmhleSlUJk0rX1QwI2dZSzwqNWk/SzV6QSswNyFzRE1WXiN6ZGNgc1d5XiQod2o4NWtKciRRPU8+KGJGZ3BECisoZEopSk85S1FIMDAwMDgwUH5kPU43SVAzazNSX2owSnQzaDAxZn5FMEJ+dD1GTHE7ZEZLMjBWRV52OTM4Q3tSI3coO0crZzFFJihAfnRmCisyNj5UM31FUmdoP15hPXpga3hTYkwjfUhfVnZZM0BiZ3sxNlY2IzRJK0F0e09hdXk9MUN5YzlLQDhQNH5OYXcjZzNCemRiXyQmIVRkc3U1CitCWGRRX3JwSEIwUkNZVVREemFYUnQoKUlEbGVIOTBSP19iZ1EwUCtoRTZJaWhXTjZETWFAWEZ8cWBLZ1gzZ0dablk4RWN2a2ApS0lBeXBeCitEaDsjNX0rS3hNYVZ6T2xjMisrd29Ydkg3YHxuQW1nZWo9fVVyYU1ucU94R0xQSWo/RXpzS2teZUJNeFRyc2dUMSEhYFJ4Mk9ePWVaYDJCCitabEt7OXw3OT44aTshWGN1PFpeMCpEaTZkfThfc3Zsa3t3TylGNXY4bzwoJERuPFV6YnZXaV55O345WkxxTmIwb1ZYNm1NI2cyZzd4JFp6CitINnJQQCheQXlUP3lJejU2O3JTcW5ySGtvczNQPDRxMHFZVipRJEZec18yIztJTkN1RjhCRDtzO2ZDZDRURDt+dU5rWVpTSlZKPil7dTROCitlJGFeWUpBbVI3I3BEd3Q5OH0mQHdrXmMoJHF6SUx3dHVzUHZMS34xRnQySyYoOU5VdXozV3ltJl9JQkdYbTcxcHxpJSU3O1N1RXNmWWdlCitoTEsofChjbzc5UkI8K0pfeCQzT3ErIS1zV2BqXzFoWHU3NGlINnBAPGdRbHReRm1JRnA2VW19dUFkYTk1eXFpbXp5NUVrbloyRWJ+TyM5CisrK28hZ1ViX01xMkFKQj9BbDY7PFFXQFh1ZEdZTDM7YiRyZXQtOSVlWWlwQCtKKG4hRnFqfG92K3lpcCstdSpoNXVtQFlWMXBCeF8+fmRYCitoZXBJXzJRYCpFVWx5fDN4aSpOTDh8fWBlUXN4Rzx+dTtoTzQ0fnM3KjNfez9sKTd3ZFg5fGRuI3JVb1RhPTx4Sytmd2QzPzcwdGNfMUlKCitraGhAdy1FalRAJj5tQlptdkB9KmhmfS01OGB6RShxfCRHeHd0O3tFSFhqam1wTE5gTzZMMiRrcH4zNmVHc1pDSWJIRClBVkVMWjR5P2dpCitXeUpzODAzdWNAT2dNe0sqJFFNSEdFKCR7bnYmX0g8Y3h7bU0qWkBWMzQlMHZhdT9LfExXclZuVCU1V1Y5OF9OdEQxY2NhKVg5dmgkK3x+CitfRXBUWjhzQEsoIzAtUERiMHA/ZH5BWFdBfSNRVV87KHRYbj55UUk1U0VkNX4/TEsjWUpgazxGRjY0P3daJGxXNnFAakU2bnJNSzt2QD1ICitfP1BOUzFUbEA4fSVuVDIrTyhCdVp6MT1KOSk0RGxxQnZsMEQ5XjRIaW52YSZtUT5yI3ZDYG5sYCtGcW47RGRBWmd7NDRtKisybl58QCokCiswcU96Jmwmey0yKj08XjkyX35hVHU0VGBvMS1DTTVNe05abiF5cFk1cWVUUkhqb0BTTj9OQkZRITRyYjJHMjRnQiF9ZC0jcTNPcGx+VVh2CitgSDRadjBpPS1ybShTbVJCcUJGIWl3NGRqMXlwKkRTcz9acUA3RXBRIz19dlFrVlppbXhlRD4+bytudk9QKT9XeDliZms8QW9xeUZrTitNCitkdUxsQlNlY1p1fE82WlErdjk4UiQkaTY/aUE1YjJLZlh6eEVfOEp2eE9zWGBKMEQoQnNVPkpVZDxkbHxUVzdNfChoI192JlA8X21le0BvCit8aG1ZTU40NDRKXmxuMSRkVHN7dHJaKzZ2QzJaQiQmeEAydVU4dSZ0TGteLU9Yd1dwdzdXYVExNlcqTXp4Y2A8KiMxX15HSUtlbk93TCtLCitIeztGP3xJRipURmlTd1QpWWRvWUA9cXt3PWBwPz1qJmNuWiZYdDFOVFQmZCNwcyhtVFk4KGN0cn5eeTVqUWY/I1RDQ0xTMzZQNURCOzt0Cit4dz1zcmNTajFJajMhQG9mWTE/aWIycmJXOWo7TDxtWkIrTWlldHtleGJEbipYPCloU2tkRFBWTmkjNj9wI3A/RFE7OVdkNiQ/M3VIaS1KCitxVnRGfnZwKDxUez07RUdRckFwdUs+KzRySGNsNSpYME5OWDd0R0c3aXd5ZXdOX0M1KXJvOHNsP1A8NihaOWo2czl0dEwkJUohQl9qalBZCit6eUVYQGQ5U0szSl9pODxqYkBRTXdLXiU8cTlvIUBtXyNBc2BfOX07UCpgKl5OKXB7e1hAajRmQ0JNQ2wxRH0leDNVZm5CVj9paElKOW1aCisoWEBtVTRrM1EkWVl6X2QpKFpYNXdiYk1VPFhueVRoZnoyWDhfKClBNDQ5cj57P1VxfmgoQktPSTg/MHw2TEpjbk0jTXZLcWllZnpoMGxWCitLfDxGSm9Gfng4ak1GaERPU2tSJTFfR3NJbkdpd2dgb1B1WkdzRUNwLVVLaDhQUDlKUXZHWlEtQCU7MlJednUhIyhTLWBteXVQPi1EczI5CitCI190YzdCP2FqOTFGVnAwcm0xblM9QGBWJXVwPSp6USQobUdgdWoqamd1RUVWXitBZlpDWE8yM2BZPTMkeDFDYV9mPTIjJnhjNGJ9elBnCisxUHdQPkhleH05REp4ZWI/NWp7KUsmcks/VTc8YzloM1I9P3prJnBvbl5yR2ZkPmBQb0hoXmBpb2FNaV8zanlXKXp1JCs3QTI9O30mOUQtCisqPn51bmpPfX5sblI1PFpIZG4xZSVJV3stfFZ1OGJlZk16flV0MWJrQi0oSzMyeDd+T01NPkYlRm1pck1RS3J3SHYwanRIdiVma29ESnF8Cis4cmhzTWRvKXhyeU8zUCFXOXF8elVHRC1FPWd1T3JjJkk0c0RAcDVWJHZTZGB9aS10KWMjSk9GTjJKV29+QW1DRU9fWWJjcVR4ZU56c2YpCis5MVkxO15DVSo7LV9aX1FhVX4mTy08PmFhP1ZMYkwoYHUwZkZPRVQkbF87Mj8wbGF5USMxb1ctfHMxT2hqK1FQLW1QQE5oOEl0RVkrUGZrCis9cSNlJXxMMTBTPzxQSUY2NWFkV35MTzRhN09tSjVYZVJtYTQ4KCteVWlTJmM0cS0wKmVEWmYpR1ZhQGc8UDB6ZDlnYUBITz9CRGNPTEZoCitMQX1uS2t+c18qeGluXlIxdGtwWmNLIUBfOHQlSUMrX1Y3eDZgPjw2bn1ReWg8fCQ0SWBXRlVpYShxYn5UZUFRSUg7NmkoRiZ6cENSZXAlCit+aW4oU0wjRnpESytUeUBiMThgKFFWczYkR2ZXN145dS0+IXNiP1ImQ0hPelA5QTM5TGUxfmd0eERGY31xMHxTfHtyey07MENZfTgpaiFMCisxdy1QckwhSUpJOXBpO0ZlenAtUVk5NUowdE5ARStwTldFNDMoJWA1SUhCUzwhNVhRVnFOeVA1X0RmY0ByUC0ydlJBO31xUV9AYFczWDNDCit0QFIoYH1nMTt3WmNKPndsUzw0VmJJYT9VRFRacnltcmdua1BuclJ4JFphQShUZUVKQUIlamg9SmImMm5HcmdDe15zWCtoRVl0JmptJEl5Cis1TjxPQlRIJEVBQWQ/K2kxdCpWJkEkLWJgU1J0bmVOZHRUUSU4VHYxWEZkT2R0P19PcERaRDhBdyRXe1o5IXIyRGFNJiooSF8/XmA3MzFpCismTipvWjEwSzwxIWZGUDt6PnY/WlA4cV50bztyZ1lZZUcrMEpEUVIxMSk0YD89M0d3eFQtJik4aWVgQl8xKHFKNTJzI2g0I3BkKzswI3pWCitBUDBTYTgtMylmMlN7LVVsdG9yKHl5OXZJLTdhQWx5SGJsU1VvRFA8a3lIOXRAal5xYlE0bTsyYVpXO0k2PWBCPlY9SHpzNjsrTj1HdDMjCitKRiteNUt4Snd2aWxWZlhsfTs2bztlPn1OOEVHTUkpeSVneSFTIWxYM3JuTTI3fmhWOSR8WFpDZ184Rjs3U1hWeTwtI3ptYzFGQWlAJktJCitjP3tfKWk9Z2FUTWN2Xj95KUgwfFhRUjAwME84Xk9ZN3k3QE0wb2p8QmgjWlc5MGk2YVdBS2FBfE5hYzRLb2RaRG4jfWIjaUg4WSVYd2x3CitPRFA3KyVeI1l6UTAxZl5zdD9IUDFCREQzeCR4PExZbyMyYGVrbzFpWT9ucHlwa2l5eUJBOVNkdUw/Sm1TNlZ2KHh3WHNtTmM0cVg2RGgxCitiY0s+ZmxCUHYjVEUpX29ATTl5REFAc2VMYiElQUtqVz9UcXpMc1VsTWRebDh5RCE2ek9+R3NDIylAcT0xP3B+aWxlQzd7K05zWERaZmcyCitEWkskYllxSy14fUhqMTlJS0BkSjtAKXVLQE9ZdWV1cWh2a0c8Pzx8UU5wbU5SK0VPRmFSKFYze2lIVGdRTUR4ZXdDe0p1cW9rPnlmdll8Cis+ZHdiXlhZRTJoWkt4dEVtOHtBVENFRyFecytmciZzWXRFdHhIY2MhdmRhYXhCe1l8LTZAenpAWWlRJjUkRzlwX3hSc2w/NEcqMnZWJlgwCis7VG9vN1kqemoofkRVTGZqdnRtUkZUQWpyWGJoWj49bCRXdkpvVioyKTEpWW1ebSlKKSowaldfMXlSVjtLbFooU3lYXyZDU2kqJDFabWpCCitmcGR1bUY3bU8meENmOTVLTG1Fe21odipUdiMyMEdTRHorIX5DYjxEYDBuMk5SQShLezBAVXtoWHdJTVRERX1GWjl7WlBEO2s9ODQ0c05gCispdV8pUy1hJVpvQkYqSVNOSlNuX1JgSXRGc0xDcFNWIWBQMkF0dCgjPVR3X3F3cjJNO3R1PjJEY0Z1UThsTGFfZypFNiNuTmotbz1rb0IzCitIdG09YnxGXlZ5MEt4PWtOV3JOMUc3am0yVGooWlIlc1N7KnZAPERQRGM2K1VWSiE1UWdScHRlMip5KzxaeHUqcXRWPC1OITZYNnJfPm96Cis4ZShMRDZQTH5CQnRuSl8/cm1UfS1MWkVIKitfJjFlQDVMODRxTyF6OGMlUT1WJCl4RWtEOEY5QnJTOHdhQXhNODZ1SWEqK2s4RVhzKXxHCiswbXZsdk1INWBGSFozV2YqMz1YempzPHNoI2UwQ3VnYnpvYjRyTGY7WTBRYjBWYmEoPldlLXw0aEleeFljKj83eFh5PkwtOW5KMk8xYzVnCit9TThuWkV8WG1yQHs3OWEzSFVJKHNjQWhRZ34kUkhjWkkyJmEpTGBPPFVLX2wmfTAtOyo7K1UxdUJwREpWQD9UMERHK3xzSVhZOFE8KEF5CislTHxtNTlscF5qWX5JODB1dnFWVjNZSnE2TFpWPWZWYCt3TE1GRnxSQGV7ZTNTJEktPztBNkYoSytWb1JyZTF2dipYdXkrdEJPYEIlMChnCis5X3o0e1htYGtiPntKR1R+Nk43am1oIXopPHAzJnVeLS18OG09bnx2eHg1QU9HY19CciVMUVYrTjJMUDJHdUIhUUpzYGQxXyt9KkhzP1hMCis4VGVTbUdEdDAlVE1WWDtlR3I4YFZSYWlOMEByVzApeFo+QyhmPTJOYXlsdFFrJVZpSUJ6b2w+OSE+fEpCUk51Z0I/RUAlUiEyMUFvejcrCitUXzQodzhGdzVfJkJwYHY2eWglVDAzNzwqVHlCcmwrTmxpcXU+JSFpNj1LMEpwZm84NkQxPyNwVSEhdkRXVXVIUnZfaXdMPXd6YC1rJkd7CisqWWBCdWM4UDI1ezVaXi02YiEtJDlAaX5yY3tDJGtFKWo0MT1qRkJHRHN3KTArTlFXcXFTNEFDaSZ4MTU9YEQwLXJTSnl0bytpYkFFMU9iCismPT5PJUleKVVaRXloKGhoIXo+bmQxZ1lsZjBwRjtpaSloZGxJS297dD4kYDBlPCU3PyRAZjU5JmNEPEExUDdlUkh7IXVtLTcrb1JJKyZSCitYVVpjZFNeYVdiPG1CVWhfK3FjZFJGTXtnPz0+KUVEI00zZ1BpUipyc0lSZHZFI2wkSDI0NmVZMTN3RyRQKjVnZ01oS2p4VzgjSHxSJiF3CitfPVltUkUmdEYpckpkWHtUZV41NDVBV1h9RSUtej09RFooMyFyQH5QenQtaGFZOStNcWp8KFo/OXlDT0g9UmBJQk9IcndXJjY3VEFmYFROCitGLWVkQiNUcTBIdzt7Z30xYFQ9M05sWUZHV0B7Sn0/OEBrUStIKHB+XkNDbD43aSFafSpIdnRPP0hKN2A1Wk1obkY3Jl4+d3VXO2pqaX1aCitxTnFtOWI3MlpsSWM0KzVQYSRCclN2WnVea2lFYl82JlhYU3xKPkVfKGdnKDZUVllqdEYqJD9YdUtmNW5tYGtaJWFlcnlGN2x9aEckIWEpCitae2Fvd20pdmxrbVV6JjtfaVBeZ1hVWTxlMlkoZTJ7eGJtakFDVSFzPng3PytaJjNedmZHPD8tcjRQQDRjJip7ZCokRHk3JkNreSlpMmloCit8VXgzKUlfVylUTkZFfCFZalgqVSVXZn5zWUM3Y08zWVF0K1grV1o0aE85S1FIMDAwMDgwUH5kPU0/PEBONWpfazUwT1RrRDAyS2ZMMEJ+Cit0PUZMcTtkRkxRTmJjNGN5Tlg+Vj5XYUN5flFaSTljeTUmckk5IVJ9JXE+REphfXVQRTlXKzEjfmh0X1lBYGk/cUVLQFZiSSooWURVQTxSCitkQlhFe2d2NSZKMFAzNmxFdihwIz5AZzg9RCpzaHg3N3FYNUBgJTRsSyh5dCFmMyZHRkJkcmpaaUZLJCk7KSomLUN9biNFZShYYzNhazRgCis/Wm53bGktdWQyNi1MSlcxNXxLVHtJJDw8I1QjeVBGJHZ+c0gkPmh4Z1Q+T0ltOyF9IXg/PmQpfFlqYHBEcHBudmZsU290dHU7TnJeRz1DCismWm4jPjwqfnxOZlJFWUBOSyslUlU0cERAbUJEQ0Zjdl5RSDtwM0czej1iVEVgZHcyaShOdlIzQ1FvKHRlNWYpSUh4cnlhei1pTlViMnllCisyazBUZy14UVpBNXlqdEVTUzVjeT0xd1Z6OUBabkdAI2Z1cUMhPHhzIVN1d18yTTFUQUFhbjlvT0hnT28yREJLOWBDb3w8UURDPG9fIWpGCitrMHFEVDNhV2pVMG5UUkFTOzh5SjJZcihZIys/KGg/PW5vTG1IVG1ZcmZkYjtLNkJhT3ZiUl82IXNGZUY9N3hzPmNMP2RxZzg5czMkajxgCitWYEYoZ1VqcVdRa34/RDF7d015RnROXk89Z0dKSkhGbUd0PHFCeHo4PClRaUl8djdpUHg9XkpOdDJgKVkxSmNJfnBKZE5vaU5VVlE+c21NCis9V2BAblpvSlR4ZE01T3AhaSV9VTQ3eVpMJHpjdnNBSX5rUitBfXYrSHB8ZHMhPTxaIXcwRFpzN0F0eVpaKVdiZ1pJXnE+VWdJRD41ZyU5Cis3YlBpI2xZQT1HamBtTkQ5KVI7PiN7cit7Y1hAJEk7JW44Mm1wUXdVNXhlT2FjQkcpNlcyLTxiIzd3a3hoS2B4bk1lSzF+TTBuejtLa2FoCityJkM2WiRsdTE8cHlOQj1jTl4qYWlLUCE9RXlncm96VDxjJWEkS1FWY2hpSn5DY2hTRmwhbGU2aiRrbG9XR0M4cjNOfWh9TEY0cHEpcX4oCitTYk1Kd2pzcDQkRD1yKEQjYVZnRVIhcG0ld1ZPQUReSklGdlBLNU1Raj5GeFpxPy0kQXVhZ1FZSVMjR1U8cHhAMWg0ZzBJP2I5UXtjdlVGCit+d2spPj9gYypGYWR6KjwrMkh2ZilZYjUjJnx1YD0kbjwhQHUxdVhiQldYWURsLURYXi0pSmw0Xz9wcWdNdyF7dWohJSt4PnJObjQ7RUd1CitzaCtheGttPjZqUTdTeFR6RjM7QVEmZXRBWWpRN0JiNFFPNmItMndgZER6TyU5QHlUKyszaXImfDskKGZre1dwJHVULVllUklVTTIhMlQ4CitqQ0FuUyg7R3orIWJNdEt5Zk8jVS1iaj5eKUpRRDQoe185aXFNUkV4UEo5bW4tKWR4dl9EJVY3RFYyO3o2bFJ9bT1ZQypDISh8LS1JRkBeCitrTFhhbitGJlNoUmc1QDxNaE0xWHpkXiR2QXYpUUgqWXRBPDFHaDdSNVNIZmsjMHd6ejhpWnBjdjF9Tz8menpPSytfdng8IVphVStMIT12CitNSzhCZyg5TUF+MVhDQTs7a2JqdWM9UE0yWVAxYkZMc0F6bHZhbyQqNVNwPXN3U2JfKyt2ZnQtcy1HZEw/MnZScGQqd1p8ZT8rfXJQcXg2CisqNkp3aUBvenRXO2pzJk1wcSl8NHR4KWhyOyp5MDNKQDYhNnI7R1NQY0h4QT1gfmlAUSNKPS01TCgyeHlUYE13PEY9bm9paXUpPDhkMktUCit+XjVgSld+dmhVXkRLM0Z8RmFaNTlOUnFfWUI+Pi19Vz1XTz1ofFQrOU12KFdvP2pyJjNeaH5DcSM0RmMoRzFXcVNefDY8T285Um0jbCl+CishU3pSb2V9WT5HQGdiRzNQUUtrezg8QjRoZk1zQWJFSkR5PEFRZnthaFVrV09qeW9Ucys4USQ0dlRwZnNXaSpSV3JwdEAzKj5AbFFAeUdYCitien1jIUlfK24zdSprZ1dLdm1DQ3ZeKi1ObndnV1ZxQXZlNUdGajQjXztJIXhEaUwpc0V2NElHNHdAdHlBckhXeExTPEdrbSVMRlFAQyY9CitHQER+MytxdiVSRHRxSWUpWHJTTGdxKGNpZ05rWlcqQGAoKktJSWxQell1SipqYWhVTFpVeGNqWDBiPCl4eWU9Wk8wcF50MHlsTl4tMWZtCisjUjNSUFlueyZiQjJLd3FaaTtHUTk/fDZyVkdkP30zeWBPYlBvT1JudEgqWUo4clkycVY9NkQhdVVvZG99VUFiKEtyMWEwTnVhbUlmPmYqCitYVURUP2EkcXg3RlRTK2dubyUwNEBeUmg8TEZ8KGdxO2A1djtMfSZSeVYtNmhTRDgzTT5Ke2N3SnpCenhIZV9HTFNCPDBeSGd3YjB7RkZ5Cis/QGhwPzxUQmdmYEU4MG9vfmNqb3RefHhRPFdWdmZlfWZGOFhGWnhAbjFGKTJ3WEYqRmdlTWJxNyV5R2U0aURFfCtMZHpgVyQyNTI5ZG57CituQiRKYEVJRXVrd2pUcCpANnEhISpePElGNVAhRSNpR0N5KGhVRDNkKVZRdnRnTWpkN3lJOHklJmlpQkohVH5PTEJNenImQDlEfHhWM053CitBbWJKNlFDaHRtQlN4aTYyYl51ZlVLYyE8OChlKGtsSDRDQ0ZCXyVVeUZqR0F7MmFte3YoZjteQUohNzVLVDE2YU8rPlYlTztuaVRpZU01CisqbyElPHR9QzdWPHo+VU5fbGpqe3ReIVlPMCt4SWdAe1k1ZUU4Pl5kOFliLWBkRjNkV2dXdHR+dVEqMW9NcEg+Q2MxUkhUd1dYN1pfTlk3Cis2aDU1WCl5JloyfWcxaHZecWJZa3skRF5za2dFJHhXazdhRUlxenBnelUpaThyWlBlTG4zR3w4b05KV2Yre057KygwRCZKQWdLOzVtdFJXCitMWF9MPzklbTBCeWd1eSFfUXFue0xraGJMOCNyYypDPmlFUnhsfFhvQkJGbFlaZVhEMk94aDFkPyQ8b3tuflkpMy0rNj1ANmdqI087M253CitNUkRUcjhDV0h2PFUhPnYoRHl0d3A4ZXhTaENOfn1gd0xpP3xxOCo+QmNMYVdAVUB9PX1ZYGxLQDt0NnViN19xZFZpfTdsbDZAVU9IT20tCitDQFoqbW84alFEdEY0QHJfPkIpSWpSIUV4Ql8lIVNFQTdkOFJlKzQkKWkjUWJeOU8pX2Z3IzI7I2k+OGhkPz99Y2JZRkFeMk80ZGo7UntQCitXeXhtUzlKRzw5aUkwTjt4PHBXWHltYEtDcnwlPVJ3UEZxNkV8JDtgb3M2XiV2Nkp6WH5HQSRXdVo1I2ZTVkRPQ0B4azF9UVgkM2BPKE1pCitROGxTYDIxQDlTT1hLXm5neT9qNVg9SnEoMnYwK09xN043ZUteU29JQCU/X15sdXxEQXJeT3d2UX19aWMpZCl0LSVgU1oocWVkbUZeWXR9CitXdj59elVrc19SJFomSD94LWJJYHkhcXomUHp8eCNZcE0xOWFvYlR0Q1puMGpOS2NMQSZyOFN5ZSNvbnFsUEFVNCM7cXYmVjE8SHNMeW1LCitIQmUycDh4c1NDMGFvbExOQDg3XkpjdmYrVFptQ3deMG9DV2MkdyYhbDtPZi1KMyQtXmEyYjM1fD95dkU+dXwxdSk1OX5odWJ3QzNPe2NMCitPNkszJDdDbiQ2SHE3eUJwcGU1UGxPUFk2NighREZ2UHRqUz57PjNmNjJeO1haTDU/eG1RO04/d2sxPjc7PD1me054dHFgZH52KUklRXJQCitPYHEjZDZ8ODRiQkJFalhyVWMkcHVIeWwmPUVGOT94ZX56UXdhajFJbmxhOVAkJVhaTk09dlN3dDFSIWtMe1NafUQ8RSk7e1ljbDVNND1wCitYajA/NVkoc31OWHMwYzgrSkFeX216WjtIOD0xIz5AbE1qKEFZIUB2RSRFIW9HYEVGcHkqRWZjUnZGKkJ4I3gtdjNDKjJ1dU9OYk12YFRzCis/NnIlb0wrVCk7RiMzaDFRKVlHVW9OMmAmaGF0akRPWVpmPlg7dz9AamlicylCRXlrVkwmSDJNUC05RTxtWHJoNTg7eV42QVBWSEl4Rjs0CitnZ1BGSD51aT40QVBnbSlFa2p9Yig0UH5oU3gmVzU0VHZhMTJsV1dgKHZ1MUBeYkdaZXRYYnhRTT0tbzBUKiFnPEA2MFFtcVk0I2ZAKUg7CitRfkx1PVl1S1VreiMxRnhUMk5WYyVvO2BQQSNiaSoyNjhuPlQyJSNZMldlPiMlbFF2M3M8KGZseUZgPXJjeyo8aXBgSFd6Um14bz4wYlVVCitjT3NuamF4dTlRM05OTWBDOHxgKDBgcTtXJWFFTiNDanBKNDlZJXhhJGp6cDNYJHcqR3UlKkk2X3EraFFSO0JuOyF9KTYtbHJeY3t2bjw4Cit4WmFuOT83UHlzPzNVckNFYm1qPkchYmxASWNjKC1kejk8QzBkRVJoVSU1MSh4MS0/cmw7OUZ7c04oOSFVIzR7dDBVSy1KPzt2M3pyPG9FCitRVUpnRVhlaUJKYWdAenhjYl5yYno+RHBpOU55LX1UQWUkR0wya2V2SXAzTWlyV1RnXm5BQUhWPEJsI2dfaDA4VC1BIWNncEowe0UxOEs8CitzVVZVSDxtY2x2Q1dQfHV6WX58WldZdTxnUTNXRCRoSFRHQVdBdU9FbzNYM3I7RSYqNlp5WnpvLSMtfkgrQGlFdXxDY0hEJkdrUCt3TzI9CiszSXRtcWk8Mn4mJH1fV0s2azNod0xYM0JWKioyK3BQN2ZjKSVSWXdTe0NlK1hZT25pPzI/aHlsNUdnfT5CaipaOUxJSS1SXztmcHx4e1B2CiskSWlyRCM7bXNJNXljTUxyaTlwPm9DPVdZaipvaz5CM1BZZ3E3TCozI2JrcnVWa05BTDJOVF5ZRT5oUmAmM2ZuRXkmYDV6UnpJPFFqWl5CCitNb1J4UWk7RDBhKTA9UktNdkRLLWh+LSN5Mn5ZMEtPejxZZGFkTUNFa3xCKzNrcnhvem89YlAmJVNvdilMTDNaRik1IUtRUSVkU19RTjh6Cis2QylEV1QpYGNJRDtEP3RiJUhOd3pOSHM1ZGZzPSN5ajJKVGRkbDhPLSR2ZXJXVnlfVjMkN1NSIV5iMj9RcDxCcl9uZT5Qa0dfWEYlVzNjCitmaGo4YGlPNlJ2SCk7Z0FNK301fGA3Xy1pNyh+Zj49OENkb2c4Q2FzSTdlX1BiSkhtRGVJUCs8WnVOdDsraUZoNV9XYnorU085S1FIMDAwCiswODBRaSpfTkJ2fk5gRT55UjA2aFokMDMhZVowQn50PUVqS1BQRTsyNDtYPilXZlg+TWszRkdOTENMc0NnbFI3cD14RV4+MnBtNkV8dSEhCitRaG4/fEYoeSs+bn53RCtXU0NweHI3byZNYStCOGomVlo7dWhgZ2FvVWJERz1hITF2SCNFWjl8c2ZJWDB1Xnotdkt7ViRMZ0woWG5meTtZCitvVFF+OWIhbk9sO01iLWNTVFVteVZBeiNWbmA0UkoodzBtMWwzeyh0IzZYPlFBPT5yRHVqZng4RGEjN3FRbDxhOSRwIUdafjI+IytfOzN3CitTXzFLRUJKLUlITmljVEo1NCQ8OCZgQFk/IVVQZUhLPyZuPzVsWDJvJGQmYX5oWEBiODhFNlJuMStpcHFKTE5RM3VtMzlLOzNJdTZAbm88CitZWUY8Jj50NWk+cWYtSURva1dvd2VFfk5xWktHTDloPyV4I0I8bE05ZlUmdzBTRD5LPDtPflA1NXJPXil8M0dLYk1GY0dHZyh7R0k/Oy1ECis8SkBuaX4me3s7bkF3Nk4lPk10MEJKbDMoUWpDdTFLWWZiK0JqNndkVERucX11MWowd1JfUGo7MGhVbCVLelpKWnBaIUU0b081VyM4Mm1zCis2c084dF9+cDxfVntEJWxFOWtoKStOfTJtKyVUTyk0NjVRbUZabG94WkUxYSF0M1BaZk9Tc2AmcDN+bSZHKkJDczBjUjFRWS1PMDA7cDFsCitAPj1DKUFsN1EwMDAwKTAwMDBhMDAwMVJYPmN0IUUtQH1MRUBXd1FiUy1JYVdeWFRMWmdnXmFVdk9ffVpnZ2BsYmEtQCZQUmBGTyZkKjdXCitGSFNEWEVHUXxDPHRvVDVQX1JgMWwyKkJpblJ5X3RGKjt3KjFYK1gmMDhtUTwxUVktTzAwO3AxbEA+Pig0ajl+SDBzc0toMXBvamMwMDAxCitSWD5jdCFFLUB9TEVAV3dRYlMtSWFXXlhUVFdwclU9VlJUX0dZSUFSSHR5RW9hNkVQNntFMCYqJU00ZEolUkVoK21QJFZLMThqLXhBPmczCit3bml8TChoe0U7K0BeNTQ2QXpLOWdAYTF1UF9HQ1NURz98T0h+O1ZGVFEjQFdjSFl7JmdKdCgrQWFrfkI+WjFAe3dGcyZlUm9GUmxncjtICisjODtvUV83YGM7VUJSM2dicTZ8Qyh7LVk/M013YF5TITNTP0ozWkZyK2RLWWlPS0A1SUooOE1JajBvPDxxcVpEYSFgemBhPk9EX0VGVCUpCitlUSpjVEgqKVNibEdHXmRmQHZ6I0kjZW4xKUQwOERqcWRONl51YEtGPUFoVFVWUXBLbj1mYSMtJGFPc0A1eUY9UzRgWVd0SU40ZmtpSjZ5Cit2Qj09PGpofVMoakd2LWFPQ0FVbDdrQCF0Syp0Kko8WHVRYnFSKEN4Z1lsbkxOTT89ST81fXokJmMmRlJocX1gVntNIzZYanFaQEl2bjMmCitfa3VqUEZMIUgxKkAkMXFVc3c3KF5uUX47KURTTnxDKipyTCU2JX0pWWZxTl9zOS1tbyFJVHwjKCVHIVdjSzx3KW0mQWxtXzZ1NGM/KnA8CitoKHc4aihvQTNkLT5PdzZWOE1pSVZuNHswTDx1d3lyZmY2UylRWjBUSW5Xa3lHSmtabyZoJjJGVHZ2I2RMcmN+QGB4OFZ7dDJ3P20xUyEtCiskaUNHJT9XT0w9NFYmRl5vOENlRkljak5pOGswYElnZnQ7V2BNaUpjazReVlU3LXQ4RH1KSDRgWW48RDs5dHpyI3lqI2VQSXRTRmtAcXFPCisrKHRmb3xvem85WWpJaVlPb013IW9rSCVfdTlsJVpCX3NjSjI/fk0zdnU+fU5SUDFIeFMpIyprYTFofVN0Jj9vYXgmIT1MYGQxRSE8JkcqCitya34jJXFfZmBRRCRfRV8+UyN2Qjs7aD54KjtXQzVXZlAjXlJvKFQ4YWt4Q09qdTxyMDc8bm5mUFRzI2U3dzUlJW5ROV54YysjUCpROys8Cit2VFVIZU1MLWxfdT80SlFwTzlLUUgwMDAwODBRaSpfTjJOWH5vLVk2WjA0QExrMDJ9fVMwQn50PUVqS1BQRTsyNDtYPilXZlg+TWszRkt9CitYVkVeMmRjWm1VK3hFUkhXcSV9R3J4UEYxb31DQENzVSlscEROJm4kXkFPRCF0UyUrQ1Z+RHckaVBCcWs+KEU3YngzUCloPkA2YVdBSzJtCit0dCU3RHZZKW0lO2BCMDAwQzQwMDFFWDAwM31sYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWRJamE5P2E/YzRjZlhiYS0/dCRTbUxqMDhtUTwxCitRWS1PMDA7cDFsQD4+YkdrPFNpMDAwMVAwMDAwUDAwMDFSWD5jdCFFLUB9TEVAV3dRYlMtSWFXXlhUN05KVHxWMyhyVlImQ3Z9QEVoXjU7CismJENpNilIQzM2UHQ4aiROLVc3UXZRa0omJHQqNjNGOSllbiZAais1R1NNXjg8Tzw1cUZWWGNaKSh0MnZPM2xla3ZRajgxRG95MUlObGRwCis9RDV4fmomQ0FiQSlsSk4rZ296ajxNN1JKQE85S1FIMDAwMDgwUWkqX017Y2tVPkZFTGgwS0VxUTAyfX1TMEJ+dD1FaktQUEU7MjQ7WD4pCitXZlg+TWszRkhKPk1LfTExUkw2dWU4WnFxO3plYyFKYmlIOERgKlMhRmhPajhJQW0jQSRUSDdQdXs4KyZUNnUpV0ooUXU2b0ErSFRUPjIlCiswPU9Hdn5+R1ctcmwrT2dJc0pNYE5YYDZGQjdpWSRQZzdLdWdWKjskd2NtNTgxPzVsYHhBMHJVay15RzQ2eEdSODx3JDhEYCo9RCZieGtrCitoT0s5RU09ViYkUTd5dkV6K01OTjZYbmFSYml5KkpBdU1FWklkYEFNX2V6bzs4TWtgP309YnE1MlN6JD1VNklEYWRmSChEPE1rP3VkeTc+CityRXktQVNrRkpeTXROO3t1MmZ6a3I/fVhLT3RINCk+VCk8YD1lVCVLQ2JKMmt1IzRMK05YVnBoLXBTSH1NZHgpJCFVRTx3dFNxeH1ESTZ0CitNQzIldTNBNkArenY5blRHRUFKJnpzRG1+e3MpQj13NlY2Km01X2sme2pFJX5DPlpwUC1EUHw/RUBySmMpMylsQ1YjNSU9NTg/NXF1aXRSCitFOWheeHNFYGRTK2BDdS04PF9OWlE/T3FHXnQwOEdAcWRrX1pLMHd3dDtGVXlRemw8KnBucVJ4JHxzP2ZnK1FSa2t6NzRUZ3o+RmFQO0piCiskK3s8OUo4TChYTSNEWVpnYSpjT1AkZFdERn1eVnJZO0VRYDczazNyNTdiJStOLWtlPik9KmFBK01GVmJ9UH1PR0VNak8+d2dtcTw5WSlQCit8KWthVUkqT1VNNlFNI1VZXzwyX2AmfEc9Z0Azd3E7XjV1KHZGX1JzI04tT0R+XlI1KTlkdlozK3NOamN+UktPQDxnPUQta3VTbk0mNj17CithISluazIxVnV5JXY1VCpHSUAtM096VFE2Oz94Xk1yUjBVSCVHMH1CX04pV05VYz1xNil3ZXgzKj48UE1pRVRESVVmRWp1QXF4WVFgYylnCitabiZeO2MxcX1rTlcmU0AkSDlwdjxGMXxgdl8hKjREM0B4ZDdCTWlxYzRpPHVgNG5ETmpCVE5rPzh1ST1aQmJFVmNKS196TThwNiNEdzJ+CitVeWFzemVxO0lAK1p1aGFaazZyQXNCTlE7UEdmUl42YEdRMilaOzYrZFg3NTBsa3RROEZic2V8PkVIcWgxKWpCeVVLM1F5MEl3YFVRR0UkCitldlJCdDg+YWokRzRiTEhBM1hGZ2R6KTI1JlFMI3g0OTArXnl5PChoTVN9IUprVlRyU2cjPis4KT5XaG5XI3xUSipZU2olfDcqOHs1ZzAmCitMMj1xMHxYUVIwMDBPOF8+fnElamchKlJgelpoYlI5NjUxOFVPJFFhQXxOWUghZCtRR0E/OWtiOTYwZlpmMCpVUWJqe2dRYmVfVSQmI2JXCis2Nkw8bGBjSzRiPTMmdGIjMnx6fjM9JHg7IUk8WTYjUEljdj5mV2xXUkEkeiMqVmVzQVEhM04hOTN0R3F7a1RVMlAxXmh+JDRSU25hR2RgCislJWRTc2M3e21XfU52TGZxY3h9aEEzQj1RVHlWS08kMCMlMX5BTkxiPHA4NF8/TUpVZWMjfmxRczVjKXM9TkFtLXpia3Boc2w4SylaO0s7CitFWS13Y3JOQ09VYDlaZjVXZmd0bnNZWCNKeD88Oz1SQFImSXhwZjglJj1BTnFBIXg+ZkszUm1heTZIR3BnZz11cFhxJCgwK3ItfiE5eF83Cit9cSNxeXVIS0J3TCM5QE8mczdCS2BxdSteIUcxN3AheVA2R2xiRj9mP18+dSFxcjBiJj8jVXghO3ZLIVF1RlApYEpUXnU9P0c4NGlMeHchCit0JT9ZWmljazNgV0xLSVUtNmNiQ3BGOX54O1didGIhQVA7P3hCfDBeVUR9RXhfR0hVTFg+NTQyY1pOQXtlPjBPUSZyVU4+aj0rfEV1T3B1Cis+TDJfMiFVK1FzQVY+UjxYY2t4dHhKaDtndUZ8bHMzKShXQEFyT1YmZTw2amxBQVdpJkdLbSVtJiNKKnsyc2d+UW9hTjtaTyM+Yn05KGctCis4MWE/MX55MXJLKTswfVZaemI3bExmXmRGOGlTWUZSQmVod2dKe0JfeEpUbnAwOFM0WHZiOCl0QVk/SnspSyswWjFxZFN4IShaNkFlK0lRCithezJ2O3V3bSQoIVg9ZGc5azRsNio8YChRcC1KYEomXkNnRTMhNGFORnVqTUAmeihaNX14Ml4kb34xfi0wJSU3V3VtJUcybF9AIyVeKzZSCit9cEpEaTErSVNeMyR9UWJuS2VZTmJmeENodCVie2A7WiYhNXpsbEAjYFJiMT5eQ05KPlo5byg5YjdMR310TzIzR0xKI0E+OFBKMG9hMyskCit+JmtnSDxySkh1KW44I08yVipzb2hPdkM4ejJ5Y19IeCFFaXp8Y21IbU4+KT5pSSlgXzE1Sj0oR25qb3hRNlohNUYtREVhVU5rNilaSkgwCitrWTVaKW4jVjRkPDI0cGpgcThebGFnayp1RSZ8YXlzZW9FMFIyRSRuaz4wQD1OUFl4TjgjZjVMdXp3dld2QE1KVF9SVmVAdld7fSNGMX0zCituc31ATVE+PDVrQVBTYyUoQ2U3RkM8QnAoa2pRUi1LZ31gNkd5K0VwZGE3ViFhdFB7QnAjRjluX2tQZDBmUSpTOVdAY28wSFh6YXZjezJ7CitiPTFjQUgqNCY5UGdAZTV2I0x7U2w4aiRERV98MHZxWXAxNVdSPmFgNGBDSSp8Xi1WQmB8N1I7O01qLW0rb0JWZUR0eTYkP0tFI3tQaypyCitEa197Q0twXnVfbG9LY0BVez9xUWA7Kip+OzNWKS12SUNGdHZIeW5ATEt5JWZxZm55fDFoVEMtSTw8SG1oYExkRkxzQkoyUUV3bDVyKHNsCit5SypVQV92eWAkfmBLYC1lSkZpe19EM19FNz5GOGZJIWBrNXIzQFBZQ1J3bGMhd2pGbk5oUS01WXU0OG4rVVZDMTA4bj1NWjZpd2NsfjR3Citvej45USNhR1lHOy15dGVuIXk8ZHJVeDV+JjU2VHNGODR5YF5iMD8jUUpPV0RNNTZLZT44SjIten0+KVloN1Uwe09qcFlpQyM1PUkqSzBqCitYeiVBdkxOIyFDcWhkfUBjMGdTOyVlNEBGYi09UHFOe3w1WldtbHg9SEM7JF5eSV9oKjhERCVPeUk8dSNpUEVmZj1gfHhyQWxjNUtGdG5NCitDYFo+fGdlNCFKSEhjWClOVnRUakZEYUdUaFlvY2xkTFJNSD9+cHNDZGdaTEcyTWN3aztPY1dYUyNUZy0paTM7cEE+Xz9UIUcyQitLdVQrCiszfHsmY3JHPkx6LWtAQ3phTkVzcDFUSU92R1c4d0A3MWJpM1dudi13O0c7NWwpQGtHIz9uVW9CPEM/LUZlb3JTdHc+ejVwfGpgIWk8UzliCitLQkdOKipnZTBEVT5RQz9fZFpnZT95UmpXMCY/cj5jMlc5dG0yX29WfHw0X2FCZjcqbH1CPiY1KjI0LWJnITR4TXE0TD9UTz9DOGV9e3E/CitAKkRndTJkOGU0dUNKIVd4UDJ1IWd3VURtVUxlN1JaVCR6KiEjM3t3a0o7QE4pYER7dj5HdihuP1FuP3ZveGd2Y25eVWB0NHN4e3w0ODVeCitxa2hteHlARyRnUElFNUNgZCFec19yTjU/OWQ4Mm5JXn1ESjBAdW1OMk5zVSV6NDIlMl9ZKTNMQVM4YEQyczYpSW50TUxoMmctQmZWWVR1CislNHdaJHcxfEswUWQmRzlzfF5TJVEzbyppU3ZuKyNlKj5POU0kISNXcU55Tn0+I0dBfFhCP29hWW4hWXw5ZypkWkE1eU9zTWxPJjExZnxCCisyX2VPem9Vc0NePWBnZH47UTdYVWFNYmdzYm9yRVlxSHtyJFg2I0RxJkNsaihVJmllcUdkXlRlQEZPbGs2Vk9mcT1OfnB9bCFaUns8c2wqCis0Zj5rKSFDOFU5STxraUxKPW9FQW9VSzB2MlRGZ3Mhdn0pd1lJeXwrXnNkMHJ0TWRkTnhWeHRZZTx2cFhSai1SVz13aGdkTHVsNCVSZXZ6Cit6QXZzPClTO2Z6M1Z+bjFfbVN1amZiSFVTUC1ZTE1YcFJWY0dPamohZjtIPEhAP3tjWl4/NTFIVWZ4a0t7eXliRCFKamtuXiFvbUZuaStrCitIdnJ9KzZCPFVsR19RenxwcnloJmVvM1cyeTd2fUtiVFhRTWZgOXk4JTQ1TnJ8dS1fbEtEYWp5RjJiVzx4KHQ9SUcxM2duVGdtREVzUXpqCit7ViNnJksjUXIoMm45UnxWZyhkLTN3Mys/NXJjc3QzP2dKfHM8YTFKdFk9Tkx+bCQtN09hKHhkYGQkK3gxdzkxY25ZTEdjYkYtcmE5PXdCCitlZ1hucmhKX1QkMmVtWHlNVGFtNi18R0NRZyZ3Mz4xQ3QtS014Nk4kZTEpdjl7RiooQVQpMWcxV0NZZmw/cW9nPVdmM29WNDQ2VUQrJlAtCitGOUFrRmJ9R085YiQjdEh9b0BSO1crcDtacn4yP3Z3VjBoTFNfXmFWU2w8PXVuMm5oTjk+LVdaTyUpQ2ptREpHKEhjdHEwJjY/VS12c2dJCis3Mzl+Kj8+ZjZSNUs/NkhCZW9TcmNSKHdiQWd6NnQhXmkrVkolc2c/VTdSWno/MGRDe2NROG0xX304I01iYSh3aFBseUJ6JGB7NDlrT0lOCituMiNLJmAoO0lmV0xSPyVMXkwzRSMtfiNQUzxlY3Y/NUo4RXJrKyloYmpsJXdRbDBfY2xIY2liYVlTbWx0VTw1Wk4kY31zay0xNyh9Kj4oCitjMnsoUT5ERCYyZS0hUVI4YEtnalBBREFoYURud3JJJnZpdX1vWnNlS01EQTx2OGQxYGRVa0lzaF4hdmFoS1k0USQtJCMweWszPHZqVnohCit6WlEoYSo4NUgtYihLayozbCRXP3tfWClaTVZkYVJNS2klQl8jOFdINF81Y0w8Mzw9LTBAYnVDQis8fDQ+RUw4YiY2ZmpFOFowYyFaI2U4CisqNmE2OXYmdlBBSVEkTjlKWCpfaVJsIXB8NTJQYFVxa25QbW9+I0lAUGEpa2pUMHY0NG4+anlhTSNTQlJ0S29HZHZWJjJEQWo+d1hjUVVMCitIdDFHZUxMfkF2QFVYPithMU1XPmM4YlgyQSMzTChjQD9vajlGX3FpeGROIXtiSzBRQnFxMnt6MnlmLWV4ITtpI05QYzZ4MFlfZ15UWHdJCitGKVRqIUs4U0hyKHJfVjhQWXBCWXt0a3BeUj5RZVUxXiR+RGRfKUghSV5eTjdtQSRfZl9wYUZIUjNNbCF2SE1SXipjJWFJPyhAUGRzMGtOCitCSjtCXzJxa2R6ejxuem8+WkxFayo8VntAe3RCeip6aXMqP00+KHFOOVMlYkBOUjJHZW19T0FTa31rMj5zak0lUFM2bkNYVktyNmghUzdrCitAdjJyO2slQmI9Qj9HbyZlaX1oVj1wI15ITSVFSEk8ODh5SWJAZzM8Vmo+RGhWdjxkYER1fmRzNnleYGYrTHgtbDt8RmVZcHp2VGlgZFlHCismVXpHdFYpZH45UU19UkgmU0kpdDlBQHpPR1lVQ1VKdzM0ZVhDcE5oa0c4ZCE0e3pRMm1vMTRsbX4qLVZuSFNrOT5VQ2wjVWZzbF9ZMWYhCitIR340dVpAa08jVHQ5RT5adWx6MWQrbyZ1dThNJDw3TF58MjAzNnEtUUxgRjwrfGp2Rj8/az50Y00qUF4tRHc5Qy0lUTZwM314RTt1TSpECisre29eX0NfX0ghITZjdmdOSldoZylTaCk7LUw4SEFNYkF4TU5Db3FqU3BabXN5fERnQkRvQT1SMU4paXk2PmF8Rm5WNyR+KnBqKVA0QVArCitPSzxkNSMqOFEjNUx2JmkxY05EUmxtTmhMMX5PVFFfeEQyQE4pTkFYWFZlIThGTG1lT3IzcSZoXnNGPHI0YWpvZCQhQWhxdU1zfn5hUEc/CitKMWk4OVZxX1l3SiUpe3V2MmoxLTElSy1iQUxXMEVJTW5JTWFZfEdad0srKSsycDVJWn5BeEohK2hmOHdaN2I8M2ooQzN+dSstczt7UWJtCitnYHdMLSN4KFFaa0BuTyteayRpSHkkb1p0LTh1dGckPCpncjxgdU5BQ2w+OTlMWjE/KmYmQzxjTztefTh8MzlhRUg+b1pvMHVHVihERz4qCit5MEt9VUp5UHoxJWxrfVgkUXwoPnhxa3N+bGRgMyg+TytMeFc2fkxCV2Zpfit1QSF6eklpc099THJ5YVlSZ1VrOyo/MChXZEktfiorbVNmCis9RV8jMXF8TT14b3I/SUFackFxP29VQEw9Pl5rWWMoPDgyRFlDMihXPEB8YjIzRVI1ITBjWHFza0FtVVIze3NvXlY/aHd4OXQ4ZEN6Mj0+CitoemVSM147bVc8cDgmayV0TGppRDBBZD9GfE0qcj07VWBmK3NKTEhIOzZeYmQ1Xmo2KitrcTVHPSZgV342R3AtPz08dGomWVBfeHA5UWdRCitoWkMtM2B9ODFwRGhQM09yTz0oNSo3WWFxSnVQLWhDP0lefjA8amJVXmJWPD5ZJEZOZyhicDNgV3lkPVk8YWclQXt1OW5ARX0+RS1Ye3ZyCitYN2UrMF9fKn1RMEhPd2hLKEIkKnxTRmVJOUU2aGRIKCpndystZVItUFRKX2FTTC16UlhAWDJJPHQ+RTA7Z2M9OHwtSHdjPVokWVZtX2NXCityZlR9YDA7fmJ5Pj1wR3JGT0k3TmFZOTx7bjUhaXxpbD4+NmNMPERzWFVBPkhZfnVSTVFXN090UEhRcSEqazRAMHhnSlhreihnaC13TlRHCitYPj99ODtidzQxPFcjbzxCY1FmKH17IU9eOXp8by1ZdzRGNyoqfCgpUjVjeX5eSUZqaVFsKDJHI0dpTFZ+LUl9eig5c0omKHtEa2ZuUDJ6CitndGtvcz1uNG52b0U8TTJUYk1VNV9iRH1INHtZYEpteXA8THViQnRic1J0XlRTNXledGV4UmY3ZzRYYDY9b1puXiVYT1JGc08yaj9tMjk2Cit4ejN1fiM4RjdzVWZRNUBSKGR7JkslWWg7OzJBMnNrRDFtU2VCUFI5XjJodV55OVZ3NFZ2KS1eTnlLKXo1MXFKcnJ5M2EkfGlQMShsPmYyCitPdHYtMiVafV49OGc+ajArd2d+Vm5uRF5hbDZsbl9ZP1lHYHYtM0UqM3c0blJoc3ModGg7a2FyMHBDPWxHZDxFZ1FWU3d1IVdrRTs+KTNiCisrLS1UPF5ka29Ub0I2KzVibkBlMV52KGt3VHVZNClOakNTQmVsYiFabiE4cnNWJCllJmYkJE88d3hSNzE0RWA1fURNPmV6SD9JSGNXczt7CitESl9Ee0F3R3RxNUleUjNHUSN2cD1fWD9yTndgP20xZUFZcj4kPUs4P2ducX5JdDVOaTJZa2NOIXliN2UxZHAjRms8Jkt6LXY0PjdANm1uCis1WmZXWmFKNlh6enF3RVNqfl9pb0A8OU04WX5eWXR9TTBqPz5PZy0ocEo0bmswLWZaPTF5TFhYQE84bVU4K1BQKjlnb2hWWHNRfXl0cz1ECitySjRUXlJufEYjWjN3QElQPyQ/clV8NClEaWw0eFEyYkNRPWUkNklQQG1iZ3dkbz9GMnBeaTsjaFBZT0FGJklsNWNfaHlFTzQrQFchK1Z6Cis4U0BCTVFge1hWYCllU3UqMEllRDRLITJJN0l+PjgwVzxVJi07LUFpMmo1YUl8SyFQSChDR0N5b0lxXzFvQyYmSD5hYV4hM1ZBbiNVUjZgCitsVl57PGNWO1MmP3lMVFE3Um91QEViPntpZUB6bjl1WCEoZmwqNk9xXnI0dz1qcXVwVlgkJGVxTipndiF1WFNCMCpWJHB+K2pRV0xJfSZ+CitHPXpZeClLRUoqOCRfRyF1N3ArKUs2entBZXFzcSUtd3dodmZhVl5BS1ppVGswMX0mXzZvXk90WXpqdGJXTCpmKTRITnVNUXRFaHpLZSY5CitJSURMamBCcEI7KDxhNk1lVVhmQ0VmX2o/emYyLVYtfU0tY2ZQKThyUVVIP31XZjBDaDFINGRpcDdjYHo9WWs0Yz4yUkQrajJsbWEzUDNvCis2P1k9ezRHbHZATjBrM0NvLTVzcD5ZfGhJc1M+PiU8cVFJV2JxdT9Lbl9LQUlLRm84TiNzIVlBbm9rNUFGIT9UTTc2fEB6TDstaGE9fjRDCis1MGg9PG0zM2JsbTtkI2k7OzdpSTE7ZWxSYUg5MTx9PXpvSCokWSNsYjswZGJgS04+Mn1vIU5fI3dNcWI8fTZ9YSlSWjFYTWE5RitUY25ZCis9OG9CbSNGM1lHREU0amFkWm1jTnMhITVTPmgwKzVgTDJqbDBIYzcteFhAYUgwZGVQI2Q5Xj5JS0VgMiREdWBAOEJVSGJHVmRBXkFefiZgCiswdG9IJUFCfGJRIWtUYHIoTExqcFYoVW8tJWhufTZUPklxVFpwMUE3IWFPSGIrdnBlLShAcWJDdmo3OU8kRnFETy08WUVvUj5Na2JFTypmCisjPFAxaGQ9IUVHRHVKX1VRbWhjQyEyKVgtO31fans1d3tMKihyQUtVYVNIWFRwOE9wKns0QU5eeCpZZzZVTjZ4NEMwSXZvVGtJM1BtM2dRCis0R316eGt8bnUqdTd6OFRmS1c3MF45TkI4SU5yUUImJD1kP1hqSmlmSUlZKEVpYyl3fVIrOSRAbHwwYUd4SjkqanZWRUZId0hpJEUoS3k/CiszaEBARUMoaCMybHctUjZEZWg3TSp7NjI+bnVNaml8O01HZmo3JHdATl9GUnNrYGVERGxnVn5pTk8qe05Ue1RhUlUreGNLP0ZnI0pSYWB9CitLLVFaJEMqSTxDUVR6RmBFY3xNdzJmWiYrPH1lPSpkWmFsQFBqZlgqZlFDRWhVVHtwITFYUyp3RWpqYkMwKFRWai1jdFhDeWVZSyY9YTwqCisrd2A2RktwfkNtbElhO3t8R1h2KSRrYSMmYGlHdGkzbE8zVSU0bGJlb1kmNzV+XiRtS04yV2peT0pkMmUqe1YzcjRIYXJkcTc5PksxUEAkCitVdSMze1kmSiswRTY5JDk8WkYzQkFOelBDR24hOGQ4fTEkZmo9M1JhSkU1WEpeayN7Mn4rbCF0TFRkTSRhbU48SW9EZzJrbz5ZTjdLQEZUCitjbTBVKkxVUFledjw1aHJiUE48fjMtYHVVaVVHQHM2YjFsbzFHUEtOWk0lamlnRDJgaV9BVlB1Xmh8M1Z3JmJsOzJGZzB1YGA1LWdgKmJNCisoWkh4R2E0KSFFYW8xMXpOe3lEUE1adHpJQWNzUUpTUUp8RTIxfFVuWShkWCNoY2YtVU9qJHY4KyMycDN4RW8lVCRudyhicEFRTmR0IXxhCitEUW4lREkmSVl+U3tQZWlrSzg3WC13WDZ0PzlVdGRDUnFVPypJZVRMY3E+ZFlEZGFMU2g8amMlZWI8ZT5DRXcydDk1YmxVPzxmJWU3V3ZaCitfIzhnTGhPczAxMnRZYWBaNVNaZChkT0hiaGp+eDxieWZHbFBlTyQhIWZqLWFRZUUtWl9XRlAldT5eX3VONms8UShqXmtoPDx7T2RAWlZUCis4PGpCWng8YTIjfCZhZSF0Tmk3Vik8VGUoMWopT1lCODZaJmJDZShiKitDVXBmTkNxRVQ2T3ska3JKfGU9Xi1ke3VxSnhNKFhGNENoYntQCitkMTIjI1NuVj9gSUpITEkyIXg0WSkmUi1OaWZKaFk+VyheQ2U9TEZzfFhgZkBtYn1FbnMzQ2N7MnktIT1eP2M+VjF0aWRGPWVeekpEbn09CitPc0NyJkx2UEF6TSFTQHE9YWFVV19jR15vNmVlSD1xaExgM1JITFAjfkNzN1U1R1NZOVkyckZlMSZhUW57VDAjIVFTZ2ZmVVokKCtJM2NgCitgJmpYRGUtSiRGTXMkdFNrY0NiXiZyWkJzXmUzfEN6RSY4WEspYEk2P0JpSERKbnNEaUJAeFBrOC1PQXFoZ0wyTzg0fncybktkTmQ9OSZQCitCWiRTTmV0VWpLYEZ6JFlwPERgKTk2LUxpaTdfJiZaNmxAQFQhMjNmNV50UlJPS3pmT15VPXp5TmRsVGRyYTFze0hOQUdhZXgrWVFmbEdyCit5c2d6MHVGREp1aXcwZypDbEZXTUJ+TyReR3dLNzJmRy1hKDw/MFFYSD1SVWUqTSgjPzVwV0MtQnltPyh6OFZzfmpPU25BY2pTRlVaJHkqCitEcXNySjBKaGAzOGMlZ31eUnMkRkx2MXY+YjkzMTw5eE15TXQocVd+VkNIUUFNQXVsNih4TDV7Zkh1R04qSXYtcGhEZkUke1d1RlhXJXEpCitvViUzZ0BGcTYjalR5JCRfYFJnb0pXUjM3V2pOaypHdXd7b0oqdTRufm4mZGxAJHFyLSQ2STgrdUFxc1VMXz5sPEZKRzlkekheeUgjJXotCisoVzRUOHdJcHptezZhZE5nZFJFV0YhWCZkPV54Tj5OTTYkOzNsRzZveGQ7VmRUYmcjZj1HYX1tb1UmZldvUEl5K2NefSZIM3s/Yig/cmBHCitXYUtCTGZ0PlcqdE5FZXBCSlImRHJyelB1RTJzQTIrVjhRQDY9KXMmakRlWlkoeVR9VyppaDBtemd9Zn5jNT1GaistaGZ8Y1NIRUViPFhfCitTfjFgQSU2SVBDKW9XczZLJmYjYVBIKXpYSzkobz9qaXFwfHl4UXZOfUc1Nnd3U0Zlam0yQF5lb3Y+cShgPlJMS1FSUk9AcD8oSWgzMChLCitTZDRyYl9LaT1mNCt0RlN2RHtldSZDTzJeQlpHRiRASStSTlIyQiR7NV42JGhYYmdvPDk+cjFtT3hsciQ+NiYzSjN6Q3pIX3VNNHxKfmdMCitgY0oxdFYyV0NkWEtTb0Q1YVpOUypXXilLOCVHJDVvV1pHck00diQ3PD1DJF89VE5wUHlIZDJKa0lIdT5WaDYlK0pmKEk0JWsyZmFfKV9sCit0cyZWRlR3YUgxVVA3VTN5ZCZaN3tJeyV3QEkkbElkQ1lze2olYUxkSSlkJXJgSWhoMDdKO3RpUkNqVntiMjNQdzhmOFd4eFB2TF5lTTk+CitmYUtGV2h3fjVIRFhseSp8Pj0/LWlARiRoP2kzS19AazN+Q2tTa141Z2pUdnFMK1k3amJPY1p8S2tAKk11PitfKGpOaDhSQjhiZmtTP30+CitgMF9KdjcyRDt0d2V2PnFsNnFIUGdVKXMoXjc0dVJocmFXQ2ohcjBvPTBXWT1aQTAoSWlFY25iVXpsQ3ghYWs/ST1rRnpVdH50PWYwbTtrCis7fj4yMVJebCF9cmVnbDM7RjB1fmM8JVlUOTBHMTBJfEZie3JCfFEmTEQwbFReNk9TYTMxRE8/eUdleDlqaCglPjh2e2IjSitNVy17NWFsCis1V3hXd2E9bG5PRkluI0Z4T2V5PmZ+ey1pUTlUQShTRytYKyY+ZE1vNDcmdjwjeXExeXEqfGEoRnQrdFloaUJoUzk9cmpsRFd2TiN+elUkCis+T3NxQz5qU3NuJHtMdlpGOEY8LV4zb1dLd3R2NXhueWp6RTNMSW9ZakxCPjdTfFZIRypoNip7Tm5udDleemhhWWt4cSR3WlMjSFgrbVFHCityKk91d0w1QmNxT3FpX1pRYU8tNFMyd3FDU047S2t5OSgpTD0/JlNTZz9pV1R5OH0zWmUmc18xeFdQZzgjeyVlZWpQPyh+T2B2RClWMDc7CitSfklmRntqQGZxQ0hsKmtgM1JIYUsrcVdSTUxhZVZse0JZU29tbypuOz4rUmlzPFVFQDJiekRsPUhXTFR8Wl8xc1ZpZn18ZjhjfSpAJWJzCiskWk5GKT96aGI+Wig7e0ZqdHtJSyo4JkhsSFJIRUtXSUxhdXxlMXV7Pj4oYVg1eiYtJTg0U2lqRXYqTU0yJml1UTtXZ2oyJUxKOCojclF7Citsc0BpJHI/VlROKExrUnghcFhJWmBWWT9OfmpHPXEmdCRWZT1UOVY5cjl3NjY0Wk11O3h+TUN1cW96ZU5ENTJXUHR4aWByQjdtPW9kfjhwCitROFVZbFd9SXFDMTFnbnQ9PHBRb05RY2xBT0ZtciVrbGV3QGB2SGpHay1sWHt0U3NAUjZRKWdeaWApVEk9M0V0dk9OJGtHQ1ljUilOUlUqCitHYEYtQngmejF1QVUzfmgyPTx+S0tVe3AzfjVTJlZeUkNIWWVrWGwqPCtqSUdhPVYqZ1lBNUAoTDVOa3BHQ1k9IUVrSnF7MVktUGhJeVljCitjUGtkezNXZ18oTk9gPldAPmdtaSpiTF5tRmZ6QXJRNXl0ckpubEl4YzlpVDUpXy0/TjNpfEIwKWB1RCo1KCVgTSRvYjd2OGsyZjFYO0o8CitxdD42JV9KOSFKSyVma34mIVctRGEmbnAyZHg7ZXtHOHFYXzBaS0dnO2lPMmBUYjcpd29QVz5kOTQmPnYtT2BYIXd3M0ZKR2dzLVZzfH1ACit5OSUpcE03M3cqcytOJlR0PDZEZitZU3k0KTdwMU5LbTBia2IlJG1vUjJXczF2WTtne1QraDh4MGA7O21Vbk1+YEhKPUsyYGk3fmF5ZWoyCit0ZkBvYTs1OXMrIy1ialgkdTQyOFAhPktIVGpTWCN7ViZOcjRiN15GcHRAc1JII3laRjZAVV9SM3BySjBXZllDX0FRVGdHYVN0c3d2LWY5CitZZXM2Z0ZtVGoyY2hJVmp7O05HSEFYYWJkVTcjaD5qWmNWfjVLKn00QkxlTTZfYlFWbXZFcnthfExDTjwhNCp4Pi1YPXIwfWZtUXI0VWE+CitKIz05QGhNeCt3V3FmPTFRclNpezhXVjRNdXB4SG1gYklrWjB4JUNXWnY4dSlFJkc5Mj9rP1g7Uys/fkJYOGBBTWYqN31LZlRvcFhIIzkyCitadWEmXmlabGR2ZykrZVJKbUQqZ2clO3c1cUp1VEB0Wno2Ui1WTWNJVTxESFg0Km5uVG1te0hLKjJ5SkwtYn1xeCQrJngrTF92QGJnQGZPCis7OChBWns4d0RMaWQjemd3OCZrRjFQP00kSThUVGtfPDwlO3VBQCplPytXNVVUfDYzenM9O2Btcnh4R2IzeVBfYyN9ZzFII2c7ZHBQdChMCit7Wjc7U0hKTVVpKU5gZmpjUE4yO1RMT05qWVchKz0tNVhxQHA9PzBTPCNBbjl1IzREfU0/eHwlbm4kfXlnXnx6OzhFcVNfM0BPezdzTGRuCispbCZOczUqYyolMz9OWWI7UTZJZEhaJjc9aXBtNnpPQ1V5ezZpT2o/JiVnQEojS0dEXnd3UntkPzNNOTwlZEp9b1hwTnBYPHRHeyQ8UUtiCitHbVhfV2ZgcmFiRHtYbjtkXlctYT16Izx8XkpiY1RpTnZMMHllKFBsKntvdyNSVGB+NDk1P0A4az40RCl3Sk9eX0ReVmcjb2lhS2QxUWFfCitrdUgpU2hQOG5yaXBkT3xaP19fV2xHKih+b1Z3fDd2cG9eM3Ihb2wpZTwkVj9CdiM2e0VzN2IqNjl7YmVqUUBZb2okYFJTNEhEaWApZ00rCitYZX4hN2g+VEQ8eWRgZiYmekVaald0MGokS1F3WUUkSV9vMilkLW1TTVcrWSZEfURjQ1RSRGtHb1N6SGNLJmdrZDluX1BvNHlrUUlUMihECis1KiR1ZE9kcU5OKl4wdGlKUUo/WmBqJWVgdnw0QTBZWG42NUpaSiNfZENWQHtBKzRaS1lhZDJQUUJZPXFib0RWMVpUUCVaWjRheWBRY3ckCisjITxaTEcwfSU+KUBnRElHZ1duSXBlQHxDPi16aVAxUTwjaTNgfD1fO2N1Mkh4enFEPSsheD5SQG9eZW1hTD1IblpfRGwoVTl5amA5SjhxCisycSpJTjFfPTw4WFA4dWt7K3FDfUhUIVUoMVRUNTs+ZUVPVlkmT3xGWj4lXntZfWh9OFE1cns2UHY1SDgybEI7SjtKTTk+TzkqSTdCNkdsCitQUyYjMUc9QjFkP01reUY2RVUkaGhDfkUlaip8Xm4wZk0rdTZMZVY0PCtCU2g0WE83eURFQHFXa3ZCcj5hLXMybXJkKz9NITFwVnZmWTdDCis8eUFpVWVaXkwtXj9iTk5RKiR+Xlp7X3xXTTMxdGJNak5talApOVlAMF8hOCErMVZHcU85OW5xS0UmeUdVPk4kQHJsZl5sYEBzdGJyfGVwCitlcW4yNjUwVkR3I18yPEJqTjZKMXFtXjNnSEJ+eHREfSZ4SUJ6e2plUl9Ve2U/LXFYKm0+KHtHQ0lBUHxgMGN7MSNXYERpK2Q2PUpoJXltCiskSVJ4JTtITz9hfUZpcTBQbmArdzEqKmBZb0k3SDs5MFRNJVN6OF5aI0NiR00rWEhnUDQ5T09KeiFSdCkmNGQ1UmhtUWQ0dVNfdHREI0BgCitQd2VJXl5iRWtrKDdtd289QVZXYigkIyhnYyotQ3ArMD5sVSoxRU9+akhmTVk8M0p3flk0WUUjNGc0aEctUHtRUVE+ZV9qc3MtfWAhNyQjCispYVZHZSVjUEpPT1RUIU82QnE3UjdsP3AtNmBPKWhIK1ZfOSN3YF9QbU9Ze2oyU01AQCsqfF4ldmMlOSZEJUhMQDxjSHc8Wlhaa3crLUsmCit3STsjenltJD9HZm5GWjhhI25lSV87PUdQLXZnWW4hMGBzKWNLKWs9RTtXKC1KTDteaH5SLVl0P1UqPyVyUTd4aXpLdUg+KjgqQ0NaNCt7CisyPXVSXz1fbGpZTztRKXx4b098ZGA7KmVQcj5sRTNYKm0jKDQ2MGJZTyN5aWI+TVVwcyliZSpJQF95TC1kJEs0RWl7TzxBI0JjRkZ5RlIkCitadjwtXn1HNiFGaUQhUiF7MDM3Rmd1d0ZeNVg9cHlPd3xxYiV7fkF5SkF1N1ZBeyYzSWMkfkJzISRfaU4ycz5iUDNoak43SiREU018PVNnCitBYWYlTH45PjkoMzIrYDtnX3RLNlNkUGVZWSV3ZipnTnA9bEZqVG43RTdDYiV3T2Qqdz5aPS1ETz8/ZWhmKFJjM1ErK1VBdEE2KDsxNExmCis+fnB6aTBkVktRQnpAdGRoKnVLaSRvR0N7PVM0JXEyPEN0PDNLKTAlJHNBMFQwU3lLM3pgd2FmY0R1QUNJZEdgKTJjcyo5T1hmc3MlMlo4CitrTn5NdVMtWUoqQ0gmP05Cej53N25RUCRBKGxyMzZNMSEkbj5oT0slS2dSZHBSS1V9JDdsTmZvdiN7LUBAPTg8RnR5S2Bxa0loRGs9anE/CiswKHhha2hPQipoWCFyQ2NfNG5gdWB8UX50dzU/YC0tJTAjOyU0VnJJYFBsY2JvT09NYzwqMT4yRjZ8REJyMjl0Pmg9NFc/RyZOdXdJTnVrCisqMzhOKU5UI094c3tDbXNxbXV2b301elU+TEUzSVZyTERlMEIhTjhFWGs7dyhpUCVyMjZHZkNYOyRgI21SY3JeQ0FLVlJVI3shbmlAczAjCit4cE5JJiNiUDBkeDZiQ2o1Sj9+IXtQeHk4Zz9TcHU7PWEhJDV9YSQ9cWxIVDNhMW9efllsQDc9MFR5ZFBnKVU7diMwU29AQkBrbUBYaVpoCisweTJJektVNHRNVStlUFNVI3Z3KDE+IXpUcENiey1BTDklLTB1QT0/O0c0QndNKHQtMTVyPEpIQkdjI3xvO3VTZ2RJVFl3K2Y+RGh8TjxjCismZ2tlSFlzb3g/al8xfDtDaEY/cFZJJW9lMlRQZWltKGk7IUZ8aEooRnJEVmdoKFU7VTx2OSRyN3wxfEAlY24pa1VEYGYoVkR1MWM2cjJTCisrOXE9VHkoI3FiWGBiNkRVayFma19SeVpjbyl5RUlXNnBmc3gwPj1xaitfRDBXXjt3RWR9LUJpdFF7aGotbDZZRD1LcUU2JWpCJEhYRnBlCis/ZSZ+M1VSX1Z5REFVSnBMSFckQGUxdSFnQSEpQUJmdDN5KmlDRjM2X2xePXxzMU1xNllHZEFwUj5tIXp8bWA4NFU/bDQ+cSsoP2J3WX16CisqNXJMYCZ1SVhZV24wcEc5UXwwfl82RDZHa3l2Znp9Wj01Pmd8b0JgVGNIdEZZZjl8MDRAXlc7SWE9byFqMXd0VCljPEctOEZBMUBQbUp5CisrckQ5LT1YaiNMOXYrbGt1S3E0fTV6XmY+ViFzdyU8aDdUfTFkc2slI0EtTUJYblR7MHJJQlloUDsldn1eI0wyMU01JWgmJDRBPmx7YFpQCitLbmkydFQxcE87IU0wcjVGLWNBdi09P08kRCNLSipecmlESi0qcnZtUnIkZW9yZVBzKGoxcXQrJlE3eitHU01qdXtGRWpueHJefXZzTD5pCitjfUhSQmU+Yi02JWQxPmV7bHpKXkNvaT1tc0d9K0B0dEdRRnA7dHhzNHdgOUNwSSFMakc5Ql9tPUtPODV6dSg+VFcld3FsM1Q/dFpqYEwtCitJYlFXRnxeSztWYnlfZWszQnBOVWg5Xm5JX1ReMEFaSW87MVJeJFlSMldsQEIwPnhLfD5EVUFAODJlbV8hJCp6JEo1MXp+YDVqbD5mJiNgCitjOT0/X19OX3l5ZVIkKUJheEZVK1Y1IXc+SklhMy1NfDFeZFJKQ2I7ZTttWElQZ2lJMHdGTiUkJTduUnMwXyVEWVckWnRQJEwwcElZUlhKCislZHRLfiU3RUV+cE53THZ3cWZzPm9QVztjRSFxdH5kUn0qU0dkb0g9YzY4cDZlYTtiTFpnflNvKypLRFBDPSY5dEVFNDFwUjlCVlIodGAoCis4XjlVZ0BuX3doRSotVkxJbnFgVD0zd3llOyF9PkRRMTJsN1VfcDVramA7RTF9KSpMNXAqJiYxPlU8MCZHYTY/TVo4MXFYUyFsfTV7VSg7CitNMFcmP3ktIXtyeH1FPWUldyQhJWVjZEZoPEA4UTAkVU5QcXAweHM1QSZvJHhDTG5ufWRPQVF4dFlTUDwyS3RWZClZSSMoIT1BXyZeMEdmCittM3MmOy1hKk48X05KNHpvSGNlYn5hNiVxZj4rRlZIUFZQe09jdF9qbipIN358dGZhcXsjRzZEZ2ZAKG5ZTS15bjFmSUZBN3l4LShSeWclCitNODdZZTR4X2pmUSF6QypyV3B8dXp7a3skSVIlcWM9XlVLKCtHayRAKyZyeEJSVHEhRCFKdE5ILWJnWlJgVj1zKSZ0KyVOYVAmdD45UXFFCitacTdkYnUmO3o4Y25lKX0le3s0cT0wfkRvX2sxTmxScFFDNy10X0tIQCE5JWNxTjxmIT45TSUzN1R0dlhfOz1WdnY2Mk9kQ0ZvR0dWWmJqCit+KE8wODdoPjI8aj4+TktpfHlyKk9gdjU5dWRAZyFxSTd6b2tKekp0e0JzempKQzRmZy1hZmBlQDNuWD83TTQ2eiQmLTxkRkEkUndEJVZ1CitHKUNrcGpgS2lEbWRYSVFhK3FSTEZKeG1iR2dgcFlhYXRiTUtwdGQ5ZjlCWX5xcm9PYnlUOUhxX1d3d0R6V3t5OzI0UDg+NlU0eURvcFIwCitTYSMpVGd4OFktXykyaT42Ml59V2hkVSlJITxONiYhe2RBV3QlNnwyMTR9UUFhcSt8TSFXazQlV1olSHpTPGkrVldDcVhMMEtaNnooLWF3Cis5VEgmZ3VGamRAfmlLaEUyVVRmQCVwIWFBSUNIbHhwOFIrMHpvU2s+fTlQQXYhMTVyMDtqRiU5X0ApM3FJaTZXflglJis5QDA8SiEwNHg+Cis9N1Iodn4tdXI1dWg/S3xAbi10andSSGlhJDF4dms1RzR0RFMkaiR4cHpLY2s9R251I0RHITVJUzstJUxLbUxJblpnOU9pPlIjMXBQQyNvCismZlh8b1JHOHN5cHhCYkFIbHZfdztrUzQwP3ItOUIpb1ZqbH56WlNPY15XZXJxYm0xUWJRWVBDbk1uR2wzU3BIZW9GOGtYSngpSiNuZlhsCispc3c1KyFpVkxTOVBhSE1NSEhGcEA0KjQzVEl4Tz9KZ1lDfUNiTUBpUFg0QDRAKXdAbEcocX58QnB9LWRUcVo8MGU+alc4eG55PGNWcmloCitkRHp8JkV3Q3BPRlhQaUp2c2luM2s1QilyJnsxQDdmOCQ3UWIrP1NIeE1IaTtMbF5JdT1tQ1BzYnU7LWV5ZjA2Vk03cmAqUWlAOz13K3p2Cit2MS1iblpoRCtycXxeeHZoa0khc3lecEVMR1NoRjdQPXVfb3t6KXJyZjhZdlc8R195YHhnS3ZjWmN3eVg8Yjl9dTV6KkR3N0x6UDUxaG9WCitnIXU4SHc1c2M4WFp4RSh2TkFrOz9iJGZrZz4pSEFfY0VXRG1STVRSbFgqO3VVb3FlfCt0bWhmRzVyR01QYHF3bGRPWXJganheVHFTfUtKCitYe0xUR0Uta3pNPVBMKy1YWHVyJGlMN3dYJXg2YV8mUjw0dHZrRVRtQnI3dUsmQ2JrMDZ9U0JGS2tKS3gzJWBYIXxGTVB1NkE+Pz19WmohCis7Myh0a0ltfnpAZ2ReKFJLYHQhbklpVWVZZn4pdnctck9fYzA5UjtweXxiY3xHU0pJQW9jTmkxOXshajlSeXB3UHElQiNuTntiPjZhQU9UCitjLWA9aUUpeGd+bUNEU3c3Skg4PnhgU0UjTzw3WUFUTUR5SSR7Y3ZoSF5pND4rb0claj5GOHF1TiZhQ2N6XyM4OGJFLXt3VXRmaFcrT3t9CitZb2BzRD9QUHBDTmt1dTY7Z3EwOHkhRTAydHE4RUR2VkV+WntCV3RnRVQodk1FKTd9eDdxakQpPH5vezBQaHJ3bHVQZUJQTFJKdEVjfHFeCis2KE0lY3x3R0tLck5SZDJ0d1VOPUFfQ0B9PXxTVzdNY29TZEh+ZHU3MEJScXhaJEBJVVpJeGtwIVAjR2ZsZ2pSb2ZiZHo2R2AwNz5SMGgtCis8USZTRTAwMTtVVmdsVV56UilJZmNPdmVBTlc3ZEdmRl5PTWZMdzt4ZUtFbykkMzY/fEVLR1JwWGVFSnMyJE02dlNkXjVgdXombV9+R3klCitZe0g4SF9SOFRhITZpN1ZVO1NuKT0+SSsqe1J3KzNRb0ZAej5oeVdFV3RlfH5McUxkSGR4c0NuKGhAcDNnPjA+TWRNdk5KMVQwMnApWFJYCitoSlh7dGRkLXZVUSVpTlZfPV9+ejlYUGc/OEw3U1YtJThgZWFZVnpSeTZeYGReey1fd3V0ZFFyO0sldiQkTUtfV0FjTl8yJT5hVnhyV1BNCislemdmME9jVnIqa0F2a1Y/aWZpbVA9JSVuST9wbWo8Y1pyPUBOKzR4e2dRcFRuenNjKWJndWxzO3tyUzVZaGE7KFZSRkR4bCgkSm50MkcyCitneU9WNDByYHZnWkpRemRteD0tfkR8bGB4QjxsRl5iT2FjMz1OQHMyaXNVQURiTHxuZnJBZCN9TGh7ZEp6RipRcUB+Yk0mV3VQT3MyYnVUCisxVHRJOGxLMUwhRTVtantUa08ySThPU0JNP1pBWDNhPF84JlF+MTh5YU1DMyoqTXs2d1o5ZlVKUGVKMDVNdn5SWnFGQXVZXihQRjA4bVEtCiswdSUhajAwMDA4MFB+ZD1NfSo3KDBoU0VfMEluemkwMXA1RjAwMDAwMDAwMDAwSGxFYzAwMDFSWD5jIUpVdWtZPmJZRVhDYUN1Tm0wUmp7CitRNmFXQUsybXRleTdEcjEtcS04UyEwMDJrPTAwMGpGMDAwMDAwMDAwMDAwNStjIXdtb2NhQXxOYVV0ZXV1WD5NTyVFXnY4Sk85MjhEMH43CishTjAwO297bEA+Pnl6MU9PeTNqaEZsREY2VHgwMDAwMDAwMDAwMDAwMV9mZz13OTBCfnQ9RkpmVkhXbip0YFpERFI/RV52OEpPOTI4RDB+Cis3IU4wMDtve2xAPj9aRnZMQmszOytQKEM7JEt2MDAwMDAwMDAwMDAwMDFfZiV6SCQwQn50PUZKZlZIV3BINn5iN2dXYWFDdU5tMFJqe1E2CithV0FLMm10ZXk3RHJWeXQoXmw5MDAzPHswMDBwSDAwMDAwMDAwMDAwMDUrYyZMO28+YUF8TmFWe0skX2FDQipKWmdWYmhjfkRDTTB1JSFqCiswMDAwODBQfmQ9TSpfM1gjTTJARzBLanx6MDFwNUYwMDAwMDAwMDAwMEhsRWNIfjtgfVg+YyFPWitDOE5aKChGRWFDdU5tMFJqe1E2YVdBCitLMm10ZXk3RHc0P1A1c3NaMDA4TCgwMDBwSDAwMDAwMDAwMDAwMDUrYzA5eWI2YUF8TmFXcTR5e2FDQipKWmdWYmhjfkRDTTB1JSFqMDAwCiswODBQfmQ9TX1sQmxwaFluTjBPel5AMDFOO0MwMDAwMDAwMDAwMEhsRWhUPnQ9Wlg+YyFUWmUoUzZFXnY4Sk85MjhEMH43IU4wMDtve2xACis+PSFgTUdtRTNJRzd+ODJ8dGYwMDAwMDAwMDAwMDAwMV9mcG1AbDBCfnQ9RktsbVBWUlVKNFpnVmJoY35EQ00wdSUhajAwMDA4MFB+ZD1OCitBRlJPdG5+IXwwODBANzAxKkhIMDAwMDAwMDAwMDBIbEg1bTtlQjlYPmMhYVdwRmV5SEZSTlRiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5CisrcEtyP2VFPExlb0Ijai02OTUxSjAwMDAwMDAwMDBxPTVwVDAwM31sYTQmT29WUlV0S1V0QDElV3BnZlljfkRDTTB1JSFqMDAwMDgwUH5kCis9TjIyaHsqT1ZqeDBQMXhCMDFOO0MwMDAwMDAwMDAwMEhsR2lwOHg9R1g+YyFoWGt9JD1FXnY4Sk85MjhEMH43IU4wMDtve2xAPj50dnw3CitQcTFPTmNjMj48e1cwMDAwMDAwMDAwMDAwMV9mb3tZQTBCfnQ9RkpFP0xaZSh3QUZKRTcyWmZTSTFVb0xRWVApaCo8NmF5M2gwMDBPOF5PCitZN3locUplKkdkbG5QRD5uZkU3eXRrTzAwMDAwMDAwMDBxPTUjPjAwM31sYTQlbldXb34zfGF4WkNjVlBzQC1XcGleYmFDdU5tMFJqe1E2CithV0FLMm10ZXk3RHIkbjJhUlJ7MDAwRjgwMDA7TzAwMDAwMDAwMDAwMDUrY1p2KzdWYUF8TmFVdl8wfldOJmdXYSVDLWNXb34zfGF4UVJyCitQKWgqPDZheTNoMDAwTzheT1k3eUEkejxFJmp8bmteZDxsUjdYU2JOMDAwMDAwMDAwMHE9NT90MFJWN21hNCVuV1dvfjN8YXhaZGFiYUh1CitWWmY3b1ZjfkRDTTB1JSFqMDAwMDgwUH5kPU1gQ0cpUFQ/RT8wTmBAfjAxXk5JMDAwMDAwMDAwMDBIbEVyNUNIJmlYPmMhSmM0Y200WipuCitobFg/UU1oY35EQ00wdSUhajAwMDA4MFB+ZD1NfFRFLSNzVUVWMDVrI3MwM3JZWTAwMDAwMDAwMDAwSGxFK0VkYzs8WD5jIUpjNGNtNFoqCituaFJaRERlMldwWnEzVmxRN2BYPk10QlV0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1NPWxmR3F7YW1SMEUtVSowM2lTWDAwMDAwMDAwMDAwCitIbEZwRSYlez1YPmMhSmM0Y200WipuaFJaRERlMldwWnEzVmxRb0JhJSpMQmIxcmFzUCloKjw2YXkzaDAwME84Xk9ZN3lvY2dIbXReZmM0CitFJiVgbEJtZSphMDAwMDAwMDAwMHE9OUVOMFJWN21hNCVuV1dvfjN8YXhZX0hWYHliI1oqRnZRWilgN0xVdWtZPmJZRVhDYUN1Tm0wUmp7CitRNmFXQUsybXRleTdEd0ByYlhAcmEwMDNrVjAwMUtaMDAwMDAwMDAwMDAwNStjUzJZMHVhQXxOYVV2XzB+V04mZ1dWX3s9eFduKnR7YmFICitRT0ZKV1kxYUNCdklFXnY4Sk85MjhEMH43IU4wMDtve2xAPj01cz5ianYwUlI5TjB7e1JhMDAwMDAwMDAwMDAwMDFfZnNyfV4wQn50PUZKCitFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ1BCVmB5YkFhQ3VObTBSantRNmFXQUsybXRleTdEdkxwSzY7Vj4wMDFgdTAwMUhZMDAwMDAwCiswMDAwMDA1K2N7NXRedmFBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZKb19RYUE5O1ZhQ3VObTBSantRNmFXQUsybXRleTdEdmxLCis3YX5GbzAwNHw5MDAxVGMwMDAwMDAwMDAwMDA1K2MmTzhBQ2FBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZKb19SYmFIUU9ZLU1zCitUYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHF0PkJsViNKMDA0TGgwMDFXZDAwMDAwMDAwMDAwMDUrY1I3bjg8YUF8TmFVdl8wfldOJmdXVl97Cis9eFduKnR7YmFIUU9GSkBfTVdwe0Y2YUJ5WEVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj52OWFXc0wxcG9sbTQqJm9yMDAwMDAwMDAwMDAwCiswMV9malVoQTBCfnQ9RkpFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ2VLYiNpSFFiWktMQUVedjhKTzkyOEQwfjchTjAwO297bEA+PH5DCitXNGo2MkxKI3E3eXRrejAwMDAwMDAwMDAwMDAxX2ZpNj00MEJ+dD1GSkU/TFplKHdBRkpvYjJYa313PlpnZ15RWSVnPFZhJW97flg/a1RZCithQ3VObTBSantRNmFXQUsybXRleTdEdFBGI1hgSVEwMDhtPDAwMUtaMDAwMDAwMDAwMDAwNStjSTltWSNhQXxOYVV2XzB+V04mZ1dWX3s9Cit4V24qdHtiYUhRT0ZMIWNiYUJ5WEVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj55OWFqOXkwMDAxUzBSUjlpMDAwMDAwMDAwMDAwMDFfZmkrCit3SzBCfnQ9RkpFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ1BCVmB5Yl9GSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eSFLCitWaVFUTGwwQiVuYmtsRWRUJWowMDAwMDAwMDAwcT04OVkwUlY3bWE0JW5XV29+M3xheFlfSFZgeWIjWipGdlFaKWA3UFZQan16YjEhQ1RZCistTHwjVlBqfXpFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9TaHtqWj0wUlJCYTB7e1JuMDAwMDAwMDAwMDAwMDFfZiR3NGcwQn50PUZKRT9MCitaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ1BCVmB5Yl9GTEdzTVg+KHM9VlBqfXpFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1ZTjJqOHYwMDAyCit0MDAwMFcwMDAwMDAwMDAwMDAwMV9mI0dCVTBCfnQ9RkpFP0xaZSh3QUZKb19QWipwTzZWSn19X1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwCiswODBQfmQ9TjArMDU/S0FAYjAwMFI5MDJ9fVMwMDAwMDAwMDAwMEhsRyZXZFEoaVg+YyFKYzRjbTRaKm5oVlopfFVKVlFwYkFWUXpEMkVeCit2OEpPOTI4RDB+NyFOMDA7b3tsQD4/LWFrd253Mj48e3RCbWUqLTAwMDAwMDAwMDAwMDAxX2ZpITZXMEJ+dD1GSkU/TFplKHdBRkpvX1BaCisqcE82Vkp+NUJiN14jTWNXR2BqR0E/aj1QKWgqPDZheTNoMDAwTzheT1k3eT9xYld2M0lZSENKcTc+KEFeLXBZMDAwMDAwMDAwMHE9OHMtCiswUlY3bWE0JW5XV29+M3xheFlfVlk7U1U1WkRCOElaZlNJQlZRZ3UwV2lEYGVQKWgqPDZheTNoMDAwTzheT1k3eXYjRmtNRjlpU3EwVGNpCitMOVJMNlQwMDAwMDAwMDAwcT1CTSEwUlY3bWE0JW5XV29+M3xheFlfVlk7U1U1WkRCOFdYPkt6ekVedjhKTzkyOEQwfjchTjAwO297bEA+Cis+b3ZMXyljMXBva0s3NjFTcjAwMDAwMDAwMDAwMDAxX2ZlZD5BMEJ+dD1GSkU/TFplKHdBRkpvX1BaKnBPNlZKfi1TWmdnZEdaN3kobVApCitoKjw2YXkzaDAwME84Xk9ZN3lnQmc0R1Q+JF85TUZJYy05ez5PVjAwMDAwMDAwMDBxPTlzUjBSVjdtYTQlbldXb34zfGF4WXxRYjk4S0pWCitsUTdgWD5NdEJVdGNiOGN+RENNMHUlIWowMDAwODBQfmQ9TjRkZzZZRUxRdjBNd29VMDM4NFQwMDAwMDAwMDAwMEhsRXFmJmw8PFg+YyFKCitjNGNtNFoqbmhXWD4pWEpYPHsjOVoqNmQ0YlNganRQKWgqPDZheTNoMDAwTzheT1k3eSZYPDQjZWw3cTJiaWU9cjl7Pk9WMDAwMDAwMDAwCiswcT1BXk0wUlY3bWE0JW5XV29+M3xheFl8UWI5OEtKVmxRTjJiWVdzKWI3ZH1ZY35EQ00wdSUhajAwMDA4MFB+ZD1OOCQjflRuUUJiMFBzCistJjAyfX1TMDAwMDAwMDAwMDBIbEZhK1dgUEBYPmMhSmM0Y200WipuaFdYPilYSlg8eyNGWmUoUzZFXnY4Sk85MjhEMH43IU4wMDtve2xACis+PnpVdkxSOEc1YFJwIX5nJnYwMDAwMDAwMDAwMDAwMV9mdEsoQTBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGS2xtUFZSVWJEYjFyYXNQCispaCo8NmF5M2gwMDBPOF5PWTd5cCRqQjxLbzAtXzl5SV59OXs+T1YwMDAwMDAwMDAwcT01bj4wc3dHbmE0JW5XV29+M3xheFl8UWI5OEtKCitWbFFvQlpmUnleYjk2M25jfkRDTTB1JSFqMDAwMDgwUH5kPU0/RGQpMCp3YSUwRSFwQDAzSEFVMDAwMDAwMDAwMDBIbEZgRzZEY19YPmMhCitKYzRjbTRaKm5oV1g+KVhKWDx7I0pWUkNDX2EmczxsY35EQ00wdSUhajAwMDA4MFB+ZD1OQkV1WmkpJGtRMElIUCQwM1FHVjAwMDAwMDAwCiswMDBIbEZQSXN5UTJYPmMhSmM0Y200WipuaFdYPilYSlg8eyNKV3ByVT1WUlRfR2FDdU5tMFJqe1E2YVdBSzJtdGV5N0RzUXhvX1RyOzAwCis0ST4wMDFCVzAwMDAwMDAwMDAwMDUrY0BMZDdgYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSWElRlJHYiNofjZiMXJhc1ApaCo8NmF5M2gwCiswME84Xk9ZN3ltUmZCa0pQYGxAWEV5KTw5c21GVTAwMDAwMDAwMDBxPUJldTBzd0duYTQlbldXb34zfGF4WXxRYjk4S0pWbFEpSmElcGdNCitiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5O3tHKD9yPlh6fDA5Kms4OHZwPFIwMDAwMDAwMDAwcT02dU4wc3dHbmE0JW5XV29+M3xheFl8CitRYjk4S0pWbFErdkdBP0MhV2wmMjIwdSUhajAwMDA4MFB+ZD1Ne0hgbjN7fClRMDA0ZGcwMj1AUjAwMDAwMDAwMDAwSGxFY0NJYkwpWD5jCishSmM0Y200WipuaFdYPilYSlg8eyNRSFooM31jeDZ5YTBSantRNmFXQUsybXRleTdEcz1qNl9oTUYwMDJKODAwMHtSMDAwMDAwMDAwMDAwCis1K2NqQHw8UmFBfE5hVXZfMH5XTiZnV1dOQ0FCWS13VUliIyFUTEVedjhKTzkyOEQwfjchTjAwO297bEA+PUM3SCVTfTgyfHZFVG1TJGIwCiswMDAwMDAwMDAwMDAxX2YlNnZ4MEJ+dD1GSkU/TFplKHdBRkp4KFJiWmx2MkZMcV5lYjdebUdFXnY4Sk85MjhEMH43IU4wMDtve2xAPj5TCitNU3VsRnJUX297UDV9VEwwMDAwMDAwMDAwMDAwMV9mIWk/ejBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGTHlJQ0VAZ09TUCloKjw2YXkzCitoMDAwTzheT1k3eSlXLV9YNn0xMlcwQmB7Uzh2cDxSMDAwMDAwMDAwMHE9OHUyMU9SWXBhNCVuV1dvfjN8YXhZfFFiOThLSlZsUV8jRyVqCitVJFdsJjIyMHUlIWowMDAwODBQfmQ9TV5JbHxFZDMrXjBFM3RTMDJ9fVMwMDAwMDAwMDAwMEhsR1lqUmdSM1g+YyFKYzRjbTRaKm5oV1g+CispWEpYPHsjVFhrfSQ9RV52OEpPOTI4RDB+NyFOMDA7b3tsQD49TT9gUW5PMDAwMEkwUlI5ZzAwMDAwMDAwMDAwMDAxX2YhKHFOMEJ+dD1GCitKRT9MWmUod0FGSngoUmJabHYyRkpFRnxWezM0NGEmI3xXVXVrWT5iWUVYQ2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R1bSZGSjthRjAwN0dhCiswMDFRYjAwMDAwMDAwMDAwMDUrYz1kJVI+YUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSVV0KGNuWWpBSUpiVDRnYmI3TC1XY35EQ00wdSUhCitqMDAwMDgwUH5kPU0+TUk/JTE5Z2wwNVc2JTA0RCRkMDAwMDAwMDAwMDBIbEhWd0ZMbGhYPmMhSmM0Y200WipuaFdYPilYSlg8eyM1VnFzCislemFCcCZTRkxQKmhiWktsWmFDdU5tMFJqe1E2YVdBSzJtdGV5N0RzT3UwSWxgYDAwMjEoMDAxaWgwMDAwMDAwMDAwMDA1K2NoMCtCOGFBCit8TmFVdl8wfldOJmdXV05DQUJZLXdVSVV0KGNuWWpBSUpiVDR5eGI3T0NBV0AlP0dWYGdWaU85MjhEMH43IU4wMDtve2xAPj00S1MmX3g5CitzbUdOWCNmQiEwMDAwMDAwMDAwMDAwMV9meUM0VzBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGSkVGfFZ7MzQ0YSYjfHFkMj9mTFpmMHBgCitFXnY4Sk85MjhEMH43IU4wMDtve2xAPj4jTHBXUHdTcFdkalgjb0h6MDAwMDAwMDAwMDAwMDFfZiVOa1EwQn50PUZKRT9MWmUod0FGSngoCitSYlpsdjJGSkVGfFZ7MzQ0YSYjfHJWUkJ8XlktS0tSY35EQ00wdSUhajAwMDA4MFB+ZD1OMlokbEVRJGREMExsVVkwM1pNVzAwMDAwMDAwCiswMDBIbEdQTyRHcFBYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297bEA+PmptVTU4SE5kCitOI0BRdm09VzAwMDAwMDAwMDAwMDAxX2ZuYHF5MEJ+dD1GSkU/TFplKHdBRktCZGFZJkMzWVZsUUtGWmdYXkRaZ2dgbGFDdU5tMFJqe1E2CithV0FLMm10ZXk3RG9rYzlJWEZEMDAzamswUlNUYTAwMDAwMDAwMDAwMDUrY2FHM0BHYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZLQmRhCitZJkNGVWEmdSpKRV52OEpPOTI4RDB+NyFOMDA7b3tsQD49aiZuWE5BNmFXQ2xLbVkoQjAwMDAwMDAwMDAwMDAxX2Z3MH5OMEJ+dD1GSkU/CitMWmUod0FGS0JkYVkmQzNZVmxRY0VWUlU3OVpFUC1aY35EQ00wdSUhajAwMDA4MFB+ZD1OMWJZajNEWF9gMElfPWowMyFlWjAwMDAwMDAwCiswMDBIbEhRQCYqOEtYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJWD5NP0piYVFsYVducGJEYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHZlezM7CitSWUMwMDhfJTAwMUVYMDAwMDAwMDAwMDAwNStjMk5ETVdhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PRkxQbVRYPkA2TldwWFpYY35EQ00wCit1JSFqMDAwMDgwUH5kPU1eWXpxPjxiK0wwRCZ3NDAzaVNYMDAwMDAwMDAwMDBIbEc4Q0k8ajtYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJCitiWj17QVpmU2FEYXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eTl2PEJ3Vis4O0ohd2RpYjlSTDZUMDAwMDAwMDAwMHE9RDgkMkxOenNhNCVuCitXV29+M3xheFo5ZlpFUTdjWDx7I1JiWkttSkVedjhKTzkyOEQwfjchTjAwO297bEA+PDswMDAwMjAwMDAwMDAwMGUwMDAwMDAwMDAwMDAwCisxX2Zwa2QrMEJ+dD1GSkU/TFplKHdBRktCZGFZJkMzWVZsUVRDWTs8TEViMXo/Q1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwMDgwUH5kPU08CitSZ3gjRllSNTAzSERWMDNgcWIwMDAwMDAwMDAwMEhsR3VOZTJMTVg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUlXQCY3NldwWjtiVXQoYyVXCitpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3llLTRtTkFPUWRYWn5fMVRIVUl6czAwMDAwMDAwMDBxPUElNTJMTnpzYTQlbldXb34zfGF4WjlmCitaRVE3Y1g8eyNDWD40PzVhJnM/WFk7YjV7VnI2dGBWX3xHemJhWmxRVnMmKDdiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5Nj9iXyR4Qj50CitHeChXYVFHWE1ZcDAwMDAwMDAwMDBxPTUpYjJMTnpzYTQlbldXb34zfGF4WjlmWkVRN2NYPHsjQ1g+ND81YSZzP2ZaZmEjP2JZRT57YllXCitqKFhrbGA1V3BwbFpjfkRDTTB1JSFqMDAwMDgwUH5kPU0tWjlIekBQJkYwQntmaDAzLWthMDAwMDAwMDAwMDBIbEV0UFhfPlNYPmMhSmM0CitjbTRaKm5oYWJadS1rWS13VUlXQCY3NldwWjtiWS13KEVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9RbFd6I2cxXkBzQURGNlUwMDAwMDAwCiswMDAwMDAwMV9mJTglYTBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFFUQ1k7PExFYjEhZGpiWkt2SFZRaDNeWExCeGFjfkRDTTB1JSFqCiswMDAwODBQfmQ9TT53ektwfEpufTBBSytDMDRWP2YwMDAwMDAwMDAwMEhsRWlTX2M0ZFg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUlXQCY3Cis2V3BaO2JiNzV8MmJaTDVKYXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eVczXmZwJjtiQWRiXzQoYkRnWGNnMDAwMDAwMDAwMHE9RWlnMkxOCit6c2E0JW5XV29+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz90WGxabjFiOHVsfVdpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3kweGBxbjVDCitIJUg+SHo9JUQqeWxoMDAwMDAwMDAwMHE9NlApMkxOenNhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNQV3BaZ0BZLXhJQmF4WShCWD5NdEJVCit0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1OQjhsS09MaCRhMDU+dUswNUpkbjAwMDAwMDAwMDAwSGxGJFVJemVoWD5jIUpjNGNtNFoqbmhhCitiWnUta1ktd1VJYjdnWEFWUWd1N1dwWGNRYlp1O05XcFpnQFkteElCYXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eTAwMDAwMHNzSTIwMDAwCiswRWRUJWowMDAwMDAwMDAwcT03VlMyTE56c2E0JW5XV29+M3xheFo5ZlpFUTdjWDx7I1FhJUUqPFdNT2MwV3BaO2JVdGVpJVg+P3ktRV52Cis4Sk85MjhEMH43IU4wMDtve2xAPj9qVHdmM3gwc3NKZzFeQHNrMDAwMDAwMDAwMDAwMDFfZnFgclgwQn50PUZKRT9MWmUod0FGS0JkYVkmCitDM1lWbFEtWldvMlB4VlFfUzFhJnM/cFZSJFpaY35EQ00wdSUhajAwMDA4MFB+ZD1OMSNsSDw+Q1lZMDhJQDUwNClGajAwMDAwMDAwMDAwCitIbEg4WlUrRXhYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFHezdWcyZZM1dNeSk1RkpFNzJaZlNJMVVvTFFZUCloKjw2YXkzaDAwME84CiteT1k3eXk5fXdhTGs8N3trMkxAUURnWGNnMDAwMDAwMDAwMHE9NjF9MkxOenNhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFKj1iIWx2Cis1V3BaO2JVdChjJVdpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3lWSmF+a21qP2c8NihJbHNDOyRLZTAwMDAwMDAwMDBxPUFgJjJMTnpzYTQlCituV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFKj1iIWx2NVdwWjtiV04mUlFhQ3VObTBSantRNmFXQUsybXRleTdEciZ1ZG5XYDYwMDIhZjAwCisxZmcwMDAwMDAwMDAwMDA1K2NjOFVpOGFBfE5hVXZfMH5XTiZnV1htbzlDSEVkfk9GTFpLY1dueSh7WS1EOX1iMSE5ZGElRSpNYUN1Tm0wCitSantRNmFXQUsybXRleTdEdG54Q0hvfX0wMDdUNjAwMXVsMDAwMDAwMDAwMDAwNStjIWp1TzlhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PCitGTFpLY1dueSh7WS1EOX1iMSE5ZGElRSotWTxPKktFXnY4Sk85MjhEMH43IU4wMDtve2xAPj56SGhuZFExXkB0dDc2MVMmMDAwMDAwMDAwCiswMDAwMV9maSQ4QTBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFEtWldvMzZeWS0/cTViMXo/Q1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwCiswODBQfmQ9TjZvYER1TDFARDBBP0VpMDRWP2YwMDAwMDAwMDAwMEhsRWdzUnNhWFg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUliYUd7N2NWCitUUjZXcFo7YlV0KGMlV2lEYGVQKWgqPDZheTNoMDAwTzheT1k3eW92I1Z3YDJoZGBqUmdQekNqYkJkMDAwMDAwMDAwMHE9OE1aMkxOenNhCis0JW5XV29+M3xheFo5ZlpFUTdjWDx7I1FhJUUrQVZRZ3o8YSZzP2FaKjRBY2N+RENNMHUlIWowMDAwODBQfmQ9TSs1Tm1EQ1B0SjBQWWIwCiswNFY/ZjAwMDAwMDAwMDAwSGxHN3U/R05mWD5jIUpjNGNtNFoqbmhhYlp1LWtZLXdVSWJhR3s3Y1ZUUjZXcFo7Yldwcnw3V2lEYGVQKWgqCis8NmF5M2gwMDBPOF5PWTd5RWZ9IVohMiRwUDxfR2ApRmFRN20wMDAwMDAwMDAwcT1DNCQyTE56c2E0JW5XV29+M3xheFo5ZlpFUTdjWDx7CisjUWElRStBVlFnejxhJnM/ZFdvfm41WD4pWFBXbnBiRGFDdU5tMFJqe1E2YVdBSzJtdGV5N0RxRTQqY35ZYjAwM3dnMDAxb2owMDAwMDAwCiswMDAwMDUrYyRHSGFwYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZMWktjV3BgbjBZaGBrQ0ZLbD5pWS1NekVXbzBnS2N+RENNMHUlIWowCiswMDA4MFB+ZD1NfEMrelBgbTtGMFI5TDcwNG8zaDAwMDAwMDAwMDAwSGxGQ3p5fDx1WD5jIUpjNGNtNFoqbmhhYlp1LWtZLXdVSWJhR3s3CitjVlRSNldwWjtiYUNLfktXTiZSUWFDdU5tMFJqe1E2YVdBSzJtdGV5N0R1VTctS2Q1RDAwN2hnMDAxUWIwMDAwMDAwMDAwMDA1K2NLKkkrCitCYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZMWktnV2lNWX1YPk10QlV0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1OQXpOYWxZSWRJMEd8CitUQDAzcllZMDAwMDAwMDAwMDBIbEVsIzBMT3lYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFIOEJGSkVGfGI3ZH1ZY35EQ00wdSUhajAwCiswMDgwUH5kPU08aTk5c2lwd3swR2IyPDAzIWVaMDAwMDAwMDAwMDBIbEcmI1JtWHpYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFIOEJGCitKeGhLYSVwOFFhQ3VObTBSantRNmFXQUsybXRleTdEcjFAWnE2TTcwMDhkPjAwMThWMDAwMDAwMDAwMDAwNStjdDtZdWRhQXxOYVV2XzB+CitXTiZnV1htbzlDSEVkfk9GTFpLZ1dpTjFmRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/IWYyOCRUM0lHN2dCTER5KDAwMDAwMDAwMDAwMDAxCitfZmR8UzUwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lNWX1YPk10QlV0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1NP3clOEh5O0I0MDlnCit0RTAzLWthMDAwMDAwMDAwMDBIbEdQKUNUfT9YPmMhSmM0Y200WipuaGVaKTBtX1g+NFVMWS13KDVZO1IrMFdAJjY/RV52OEpPOTI4RDB+Cis3IU4wMDtve2xAPj9keC09NFMwe3tSVDM7K05uMDAwMDAwMDAwMDAwMDFfZiZTTUEwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lNQE9XCitOQzcyWikwbV9YPjRVS2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R1R2JBUURDaDAwMiFHMDAxS1owMDAwMDAwMDAwMDA1K2N2RCpnI2FBfE5hCitVdl8wfldOJmdXWTtSKzBXQCY2P0ZLfXNPWTtSKzBXQCY2P0VedjhKTzkyOEQwfjchTjAwO297bEA+P21RaER8ZDFwb2t+NiN4SngwMDAwCiswMDAwMDAwMDAxX2ZqSHlgMEJ+dD1GSkU/TFplKHdBRktsbVBZaTRPfFdpTkFhWS14MDVZO1IrMFdAJjY/RV52OEpPOTI4RDB+NyFOMDA7Citve2xAPj09USQ9aCUwe3tSdTNJRzVuMDAwMDAwMDAwMDAwMDFfZnM1JH0wQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lOQWlaRVJfN1lpCit3XzBZaTRPfFdpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3loLXt0T00qO3U8RiQ0ZXJBXi1wWTAwMDAwMDAwMDBxPTV8VzJMTnpzYTQlbldXCitvfjN8YXhaWFVWezJoJlg+TW1QVXRlS2paKl9FRVVvTFFZUCloKjw2YXkzaDAwME84Xk9ZN3lTaz5wWWB+ZCZ9aVVSLXVBcGlnWDAwMDAwCiswMDAwMHE9QSN+MkxOenNhNCVuV1dvfjN8YXhaWFVWezJoJlg+TW1QVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297bEA+PjVOND1ZCit7MHNzS3oxT05hYTAwMDAwMDAwMDAwMDAxX2Z6SSY8MEJ+dD1GSkU/TFplKHdBRkt9VUZZaGg8O1pmN3JGVntkSjZWUlNCVmN+RENNMHUlCishajAwMDA4MFB+ZD1OM04xTndOKE5EMDEqY08wMy1rYTAwMDAwMDAwMDAwSGxHdV5hbFdOWD5jIUpjNGNtNFoqbmhpVlBrN3lYSzhMe0ZKCitFKFhhJj0+TGIjaTVNRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4+Z2Z8fDd6ODJ8dlVaMiRseDAwMDAwMDAwMDAwMDAxX2ZtOFBmMEJ+dD1GCitKRT9MWmUod0FGS31VRlloaDw7WmY3clphQWpqQFdAJSt8YjFyYXNQKWgqPDZheTNoMDAwTzheT1k3eT1tciVZTWgqWX50dTZvbkFPSFhXCiswMDAwMDAwMDAwcT1CZ3IybW8rdGE0JW5XV29+M3xheFpYVVZ7MmgmWD5NbVBjNGN5Tlg+Vj5XYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHQjCis9ck4/TSswMDgyajBSU1pjMDAwMDAwMDAwMDAwNStjRWd1S35hQXxOYVV2XzB+V04mZ1dhQkY4QGElRlJHYiNofjZiMXo/Q1g+TXRCVXRjCitiOGN+RENNMHUlIWowMDAwODBQfmQ9TkJVWkVqRkpRWjBNODJtMDNaTVcwMDAwMDAwMDAwMEhsR35qfGMjOFg+YyFKYzRjbTRaKm5oaWEmCitLcEhXcGleY1V0ZWklWD4/eS1FXnY4Sk85MjhEMH43IU4wMDtve2xAPjw+Q2hzSWgxT05iJjNJRzViMDAwMDAwMDAwMDAwMDFfZnZBKVMwCitCfnQ9RkpFP0xaZSh3QUZLfXtpWEw0bjhiMSEwSGF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3lFPWFhKUI/QUJlYDJfI345ez5PVjAwMDAwCiswMDAwMHE9NkB5Mm1vK3RhNCVuV1dvfjN8YXhaWGxaKWI5NGI4fDBhWipee1RXcFhaWGN+RENNMHUlIWowMDAwODBQfmQ9TTt3YD5NK2dKCit9MDhSQDQwM1FHVjAwMDAwMDAwMDAwSGxHNW9DcEFMWD5jIUpjNGNtNFoqbmhpYSZLcEhXcGleY1hrfjEwV3BaO2FhQ3VObTBSantRNmFXCitBSzJtdGV5N0R0TFIrZ3w8eDAwMkQmMDAxOFYwMDAwMDAwMDAwMDA1K2MmWSViWWFBfE5hVXZfMH5XTiZnV2FCXj5GYSVGUktGTFE4ZFpmCis8M0FFXnY4Sk85MjhEMH43IU4wMDtve2xAPj12anM/aTMwe3tSOzJMSiNkMDAwMDAwMDAwMDAwMDFfZmVFQXQwQn50PUZKRT9MWmUod0FGCitMR3NaYiFCc09iMXo/Q1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwMDgwUH5kPU1eV3I7T21gNmcwSUVSJTAzWk1XMDAwMDAwMDAwMDBIbEhLCitydzlPV1g+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJWUHMpJmJZKmdMRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/SnA2Mkt+MXBvamk2I3hKCittMDAwMDAwMDAwMDAwMDFfZnVnd3gwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjF6fFZYKWJWaVApaCo8NmF5M2gwMDBPOF5PWTd5RFB7CitMUGVoMl5uaVcmZF84fl58UzAwMDAwMDAwMDBxPTZRezJtbyt0YTQlbldXb34zfGF4WmRhYWRsO0xiYU85WmIjIVBoYUN1Tm0wUmp7UTZhCitXQUsybXRleTdEdi1pVDdGRDwwc3p2cTFPT2laMDAwMDAwMDAwMDAwNStjJmNfRzxhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkpvYjJXCitwWj5iYUFqPiFPOTI4RDB+NyFOMDA7b3tsQD4+PkYpeG0wMFJSQUgwc3NJVjAwMDAwMDAwMDAwMDAxX2ZtY0JiMEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhM01hJiZWcGFDdU5tMFJqe1E2YVdBSzJtdGV5N0RyVXgjb1JDZzAwNnhPMDAxNVUwMDAwMDAwMDAwMDA1K2NfKEJUCisrYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZKb19RYUE5O1ZhQ3VObTBSantRNmFXQUsybXRleTdEdm9VNXpPQmIwMDFYTDAwMThWMDAwCiswMDAwMDAwMDA1K2NXSkw9QWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GSm9fU1lpVlYzRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/Ujl2CituYnEwe3tUazI+PHtoMDAwMDAwMDAwMDAwMDFfZnErO0cwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjEhOWhWYFhyM1g+Vj9HRV52OEpPCis5MjhEMH43IU4wMDtve2xAPj1BY0t5N0kwUlI5cjB7e1JXMDAwMDAwMDAwMDAwMDFfZmgxZkQwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPCitiMSFJYlopPFpkYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHgzZT9mQiooMDA4KUwwMDE1VTAwMDAwMDAwMDAwMDUrYz5SayV9YUF8TmFVdl8wCit+V04mZ1dhJUZMS1dwaXxNRkt1c1JXbyZhVWFDdU5tMFJqe1E2YVdBSzJtdGV5N0RzKFN7d1J0WDAwNnBQMDAxQlcwMDAwMDAwMDAwMDA1CisrYzQxV3MlYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZMUHljYjdebUdiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5RHdAZ088cGNsI2ZECis4WnRCbWUqYTAwMDAwMDAwMDBxPUQzIzNqbEN3YTQlbldXb34zfGF4WmRhYWRsO0xiYU85cmJZWE9MYjY7YWBXTXkrTWFDdU5tMFJqe1E2CithV0FLMm10ZXk3RHNIODM4UVRVMDA1eTIwMDFIWTAwMDAwMDAwMDAwMDUrY2A8QEVgYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZMUUtxCitiel5qT2ElRlFhYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHdaPnhEe08rMDAzNH4wMDEyVDAwMDAwMDAwMDAwMDUrY3NHfCEyYUF8TmFVdl8wCit+V04mZ1dhJUZMS1dwaXxNRkxpV2pZOyFKZmN+RENNMHUlIWowMDAwODBQfmQ9TX5eQSQ8dWQ+UDA2cVchMDRWP2YwMDAwMDAwMDAwMEhsCitGSHpZNzN4WD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eWFjCitvTmJqUkY3dzQrUWBLRiNyR24wMDAwMDAwMDAwcT1DQT4zamxDd2E0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XCitNeTxPVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297bEA+PkZvV0MpNWtwS1hxTElENlYwMDAwMDAwMDAwMDAwMV9mdEpEeDBCfnQ9CitGSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrbF8+V3Bwb01YPWdRTmElRktZYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHhWCitvODNZPngwMDVLKjAwMSlwMDAwMDAwMDAwMDAwNStjVHZRQUlhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxITNQVlJCCis/O2JUNDlRWEVrdGdaKD9PfkVedjhKTzkyOEQwfjchTjAwO297bEA+Pk52UjdGJTFPTmNZMj48e3kwMDAwMDAwMDAwMDAwMV9meWhAMzBCCit+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrbF8+V3Bwb05Ya2xfPldwcmdAYlNganRQKWgqPDZheTNoMDAwTzheCitPWTd5Xz5qVD80aGFBTjNNMnBrSVJGM3YwMDAwMDAwMDAwcT04SWEzOz1MeGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRCitWYHlQPVdNeTxPVmB5UD1XTkNBQmElcDA5YlpLdkhFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1paUtVLSgxT05jZjRnZGY8MDAwMDAwMDAwCiswMDAwMV9mdzUlXzBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwcG9OWGtsYDVXcHJuOVoqXzJSYSZLCitafmF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3lfITtQZlRMUzw5WlUrRFdIVUl6czAwMDAwMDAwMDBxPTl+RjM7PUx4YTQlbldXb34zfGF4CitaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9WYHlQPWI3Z2RKYSZLWn5heFFSclApaCo8NmF5M2gwMDBPOF5PWTd5en1YTnEtCit+I3t2NGhhQU5JeypMeDAwMDAwMDAwMDBxPTdBTjM7PUx4YTQlbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FWYHlQPVdNeTxPCitWe2M/PlpmQTNKVlJVNn1WUGp9JVplPWNUY35EQ00wdSUhajAwMDA4MFB+ZD1NPER5JUlaKi10MEVHa3EwNTFSbDAwMDAwMDAwMDAwSGxGCit0YXRyYClYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZKb3c3YSU1JDZGSm9fUWFBOTtWYUN1Tm0wUmp7UTZhV0FLMm10CitleTdEeFA1enxYYjwwMDFgeTAwMSVvMDAwMDAwMDAwMDAwNStjMWElQW1hQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxCishM1BWUkI/O2JUNENYWmdYXkRaZ2dgbGFDdU5tMFJqe1E2YVdBSzJtdGV5N0R1WkZDZE56eTAwOHl8MDAxLXEwMDAwMDAwMDAwMDA1K2MzCitVfnx2YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSQj87YlQ0Q1lJVyMkTmEmS1p+YXhRUnJQKWgqPDZheTNoCiswMDBPOF5PWTd5clkrSnJhUmRNV2F8ezNnRzVgUG8wMDAwMDAwMDAwcT1CZT0zOz1MeGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3Cit5WEp2Q1FWYHlQPVdNeTxPV3BpVjJhJktafmF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3kpPTIlIyRwcnVhcEI/fUpFJnU9azAwMDAwMDAwCiswMHE9OUxHMzs9THhhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9XcGlWNVo3eShtUCloKjw2YXkzaDAwCiswTzheT1k3eXRiRHZoM2szaUdVSmR7Tkd5bmhxMDAwMDAwMDAwMHE9OX5oMzs9THhhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYCitKdkNRVmB5UD1XTXk8T1dwIWd9YUJ5O09WcjZuSmFDdU5tMFJqe1E2YVdBSzJtdGV5N0RwPU5FfElUTzAwNWVeMDAxJW8wMDAwMDAwMDAwCiswMDUrYytsdmVVYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSQj87YlQ0SWZWezM5fGElRktZYUN1Tm0wUmp7CitRNmFXQUsybXRleTdEb2xNI15mMFQwMDReeTAwMS1xMDAwMDAwMDAwMDAwNStjK1RSUVNhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9CitVRlloaDwpYjEhM1BWUkI/O2JUNElmVnszQTdhJktafmF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3lCflBPaS0jYEVXSUVWbE1HNWBQbzAwCiswMDAwMDAwMHE9N31fMzs9THhhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9XcCFoOGNWPT5CYVZ+SXFQCispaCo8NmF5M2gwMDBPOF5PWTd5RXV1Sjc4M088U2owT016R3luaHEwMDAwMDAwMDAwcT05cks0RkdVeWE0JW5XV29+M3xheFpkYWFkbDtMCitiYU85b1ZQazd5WEp2Q1FWYHlQPVdNeTxPV3AhaDhjV2BvVlZyNm5KYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHFYYV5iUEFtMDA2NnUwMDEpCitwMDAwMDAwMDAwMDAwNStjLXpOPEthQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxITNQVlJCPztiVDRPT0dCWXRVV14hCitlNUVedjhKTzkyOEQwfjchTjAwO297bEA+PUl3Y0dYQDB7e1MjMV5Ac3gwMDAwMDAwMDAwMDAwMV9mZzVXTDBCfnQ9RkpFP0xaZSh3QUZMCitHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrbF8+V3Bwb1JWbHAhXkdIYE5sVnI2bkphQ3VObTBSantRNmFXQUsybXRleTdEd1pmdHRNKnswCiswMXZFMDAxPXIwMDAwMDAwMDAwMDA1K2NoOzl1NGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNFJTCitWc2Q0N2FCXj5BV3BYWlhjfkRDTTB1JSFqMDAwMDgwUH5kPU4wK2FmNCElfFowTW9idDA1QVhtMDAwMDAwMDAwMDBIbEZOZmVpcH5YPmMhCitKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZLVElYV14hZTVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1FaDIrCitSZjY5NTJ8TzhAe2IwMDAwMDAwMDAwMDAwMV9mbH1CRjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwCitwb1VhQVIoQ2NySXt4UCloKjw2YXkzaDAwME84Xk9ZN3lOS3klbTM9MDROQEckQFlJeypMeDAwMDAwMDAwMDBxPUQrfDRGR1V5YTQlbldXCitvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9ZKy1JXlZzJmgxVlJDNjxaZiRSNVdvI35SY35EQ00wdSUhajAwMDA4CiswUH5kPU4xVUZ3V0JtJk4wNmokajA2Rzh3MDAwMDAwMDAwMDBIbEZXX1lEQVdYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxECis/RkpvdzdhJTUkNkZLbDZNWEpkSkNYPjRxMVZ7TENfV28jflJjfkRDTTB1JSFqMDAwMDgwUH5kPU0tZEBJOWMyanMwOH12bTA1PD50MDAwCiswMDAwMDAwMEhsR1cwfWNSaVg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZLbDZNWEo+THtXb3ZEM1dNCit5bkZhQ3VObTBSantRNmFXQUsybXRleTdEcGVWZGtVVGowMDFeRDAwMX11MDAwMDAwMDAwMDAwNStjVUpWV2FhQXxOYVV2XzB+V04mZ1dhCislRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNGRTWmY5c15Wc2Q0N1pFc3t7WSVYd2xQKWgqPDZheTNoMDAwTzheT1k3eVBgOD9YCisjfGkpZF8lSHdmSXsqTHgwMDAwMDAwMDAwcT04Wnc0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8CitPWSstSV5YbXhJOVZSQzY8WmYkUjVXbyN+UmN+RENNMHUlIWowMDAwODBQfmQ9TUB2MF9VRjhZQDAxR1N0MDUkKnMwMDAwMDAwMDAwMEhsCitGKEFgU3A+WD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RktsNk1YTE0qYFg+RCgwV28jflJjfkRDTTB1CislIWowMDAwODBQfmQ9TjlDSFRuUl5CUjBCe3JsMDV0I3IwMDAwMDAwMDAwMEhsR2RFZS0mMVg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhCitBOUw+VlB8RD9GSm93N2ElNSQ2RktsNlNYPkt1YWEmS1p+YXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eXJKUWtkb2RmXj8jMCZyY0h+O191CiswMDAwMDAwMDAwcT05KWY0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1pETTArVlJDYjJiWn5OCitTVnI2bkphQ3VObTBSantRNmFXQUsybXRleTdEdnZFazJfZmQwMDZIQzAwMX11MDAwMDAwMDAwMDAwNStjWSZpfTlhQXxOYVV2XzB+V04mCitnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNGdVVns+UDZaKl8yUmEmS1p+YXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eUAjCitTWmxPYmhAM2hELW5lRjh9fWwwMDAwMDAwMDAwcT02ZWY0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XCitNeTxPWkRNMHtiOFJrZ2N+RENNMHUlIWowMDAwODBQfmQ9TkJTQlN4T3hUdjBKI3pYMDV8e3UwMDAwMDAwMDAwMEhsR21OZSUjVFg+YyFKCitjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RkxQcEpYa2xgNVdwcj9JWig/T35FXnY4Sk85MjhEMH43IU4wMDtvCit7bEA+PiYrfnZPezFPTmNyMzsrTikwMDAwMDAwMDAwMDAwMV9mckw7RjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnCitpTVhrbF8+V3Bwb2RWcTxlPmEmTDhUYUJePkFXcFhaWGN+RENNMHUlIWowMDAwODBQfmQ9TjAodm5Se2FEMzBKSUpPMDVicHAwMDAwMDAwCiswMDAwSGxIYlIxTkBlWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RkxQPlhiOHZFUlZyNm5KYUN1Tm0wCitSantRNmFXQUsybXRleTdEdWd8SGFiQGEwMDZpZTAwMjR3MDAwMDAwMDAwMDAwNStjT2otXkFhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNCitGS31VRlloaDwpYjEhM1BWUkI/O2JUNCZvWD9BNkRiNzU+YFdwcmdAYlo+R2xhQ3VObTBSantRNmFXQUsybXRleTdEciRFQVpzMjMwMDNNCitIMDAxKXAwMDAwMDAwMDAwMDA1K2NgKFh8TWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNCZ1VztrCiskaVooP09+RV52OEpPOTI4RDB+NyFOMDA7b3tsQD4+TXctenNnMHt7UkEybWs7djAwMDAwMDAwMDAwMDAxX2ZvZihCMEJ+dD1GSkU/TFplCisod0FGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2llYSVebUFWbHl2YVV1a1k+YllFWENhQ3VObTBSantRNmFXQUsybXRleTdEcExFRVFpZXUwCiswN25+MDAxPXIwMDAwMDAwMDAwMDA1K2NKOEJMOWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUjliCitaKXxMM1Z7fmI2WmdWYmhjfkRDTTB1JSFqMDAwMDgwUH5kPU1eZTs4Xz5+SSkwNWM7MTA1YnBwMDAwMDAwMDAwMDBIbEZpY01icT5YPmMhCitKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkxpUWtZLXdVTUZKb19SWmU/UzFYPlY+V2FDdU5tMFJqe1E2YVdBSzJtdGV5N0RxCis/Q01tWH56MDAzYHgwMDFgdDAwMDAwMDAwMDAwMDUrY0w0eXRlYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7CiswKl9HY1JMclpmPDJgYlpLdkhhQnB2SEVedjhKTzkyOEQwfjchTjAwO297bEA+PUhIWX11KzFwb2pSNWRaKSkwMDAwMDAwMDAwMDAwMV9mCityK0ZKMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpZWElXm1BVmx5dmdjdz1SN2JaS3ZIYjFyYXNQKWgqPDZheTNoCiswMDBPOF5PWTd5XkcwUikxcVQyQyRyYjxyRjh9fWwwMDAwMDAwMDAwcT05YSM0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3Cit5WEp2Q1FiI2lRTVg8ez1rV0AlKz9XT0ZXWGN+RENNMHUlIWowMDAwODBQfmQ9TXtFJWhBVVhwODBPPCQtMDVKZG4wMDAwMDAwMDAwMEhsCitHeXU/XyVtWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkpAX01XcEhuRWJTYGp0UCloKjw2YXkzaDAwCiswTzheT1k3eVRkSCYkSFZYZyV6OWF3dUd5bmhxMDAwMDAwMDAwMHE9OEFiNGdoZHphNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYCitKdkNRYiNpUU1YPHs9a2FCcHZIWkREUjxYSnY5T2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R3alkhaGU3VjAwNEl1MDAxeG0wMDAwMDAwMDAwCiswMDUrYyhaQ0o+YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSJndhZGw7TGJTYGp0UCloKjw2YXkzCitoMDAwTzheT1k3eUxqb0U0NC14PFhPRiNlc0YjckduMDAwMDAwMDAwMHE9QkV2NGdoZHphNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrCis3eVhKdkNRYiNpUU1YPHs9a2ElRlJIWipGc0NFXnY4Sk85MjhEMH43IU4wMDtve2xAPjw7MDAwMDIwMDAwMDAwMDB2MDAwMDAwMDAwMDAwCiswMV9mJkpQSjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZlWipGdlFYPHsjNVV1a1k+YllFWENhCitDdU5tMFJqe1E2YVdBSzJtdGV5N0RvdTlvNm5hODAwNWcyMDAyMXYwMDAwMDAwMDAwMDA1K2NSQCk4JGFBfE5hVXZfMH5XTiZnV2ElRkxLCitXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSTHJaZ2deS1ZsUXJWWTtBQ0ZaKWA0YmN+RENNMHUlIWowMDAwODBQfmQ9TT96NkNnPj8pCis3MEIkNHowNkc4dzAwMDAwMDAwMDAwSGxGTDtTSzxCWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkpvCitfUmJhSDg4Rkt+SHBhQWpfRGI4SWVmY35EQ00wdSUhajAwMDA4MFB+ZD1ONTlrIUFVXjtBMDc/Sj0wNkc4dzAwMDAwMDAwMDAwSGxFdD9oCitYS09YPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GS31VRlloaDwpYjF6P0NYPk10QlV0Y2I4Y35EQ00wCit1JSFqMDAwMDgwUH5kPU1AR1M+WFlkTEQwT3VrQTA2cVchMDAwMDAwMDAwMDBIbEdhP2hYS09YPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyCithQTlMPlZQfEQ/RkxpUWtZLXdVTUZLfVVGWWhoPCliMSFkbFdNeSg/V001PXlWe3xUWGN+RENNMHUlIWowMDAwODBQfmQ9TjdHbXl2ME0lCitTMEJrSikwNXQjcjAwMDAwMDAwMDAwSGxIUmAzP1laWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkt9CitVRlloaDwpYjEhcGdjckl7eFApaCo8NmF5M2gwMDBPOF5PWTd5NVVePEYtMmVhcCVtRHhaTyNsREAwMDAwMDAwMDAwcT1CT2Q0KittIWE0CislbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FiI2lRTVg8ez1rYUE5TD5WUHxEP0ZMUUhqVXV8SkBWYHlKIVoqejJSVlFwbkVVCit0ZWklWD4/eS1FXnY4Sk85MjhEMH43IU4wMDtve2xAPj4+KVNNZHgxXkB1VTRnZGdEMDAwMDAwMDAwMDAwMDFfZiRJcW0wQn50PUZKRT9MCitaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZyVlBrN3lYSnZDUWI4fkU4WkREantYa1RiPWI5OFFEWkRsV0NYPkQrCis5V28+MHtiWVhPOVoqREdkY35EQ00wdSUhajAwMDA4MFB+ZD1ONCUtQGdhWktwME9rUHowNSQqczAwMDAwMDAwMDAwSGxGbzVEeCV3WD5jCishSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GTGlXalklZ0Q1WD5NdEJVdGNiOGN+RENNMHUlIWowMDAwODBQCit+ZD1OQlZVLVIxNV9HME5vNCMwNXx7dTAwMDAwMDAwMDAwSGxHcTVmMT14WD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GCitMaVFrWS13VU1GTGlXalklZ1BQWmY8MmBiWkt2SEVedjhKTzkyOEQwfjchTjAwO297bEA+Pj5zdzJJfTBzc0loMm1rO3owMDAwMDAwMDAwCiswMDAxX2ZmXlNOMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpZWElXm1BVmx5dndiWktsYWElRkxLV3Bpe2NhQ3VOCittMFJqe1E2YVdBSzJtdGV5N0RzM1E7V1FCZTAwMUB1MDAxQHMwMDAwMDAwMDAwMDA1K2NHI1U+OGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpCit8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSPj9YPjJjWVdwaStFWmdYV1dhQ3VObTBSantRNmFXQUsybXRleTdEdiQzK2F5cDcwMDZgJDAwCisxKXAwMDAwMDAwMDAwMDA1K2NuSHZ1UGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUj4/WD4yY1lXCitwcnxSRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/Yz1OWXp3NEZDVyZDamJDNDAwMDAwMDAwMDAwMDAxX2ZqVEc7MEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2llYSVebUFWbHl2d2JaS2xhYjh+RThFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9yM1VGWEwzamhFCit9Qj4oXzUwMDAwMDAwMDAwMDAwMV9mZWJiZTBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZ3YlpLCitsYWJaS3A2WipfRG9hQ3VObTBSantRNmFXQUsybXRleTdEd0NTPX5AMj0wMDdKdTAwMSFuMDAwMDAwMDAwMDAwNStjbkwhVCNhQXxOYVV2CitfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUj4/WD4yY2JhJT9WZWN+RENNMHUlIWowMDAwODBQfmQ9TjhwWUZICitILW9QME1gY3EwMmx4TzAwMDAwMDAwMDAwSGxIRU5lPSpVWD5jIU5aKjZVMVplKCpXVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297CitsQD49NjVCaTw+MHNzS1YyTEojWDAwMDAwMDAwMDAwMDAxX2Z2SFJuMEJ+dD1GSm9fUVpERFI/YjEhM1daRSRSNWJaS3ZIRV52OEpPOTI4CitEMH43IU4wMDtve2xAPj1tX3xlLW8we3tSVDI+PHtWMDAwMDAwMDAwMDAwMDFfZiFSK0YwQn50PUZKb19RWkREUj9iMSFDY1dvM0cwRV52Cis4Sk85MjhEMH43IU4wMDtve2xAPj1IN1NOcmwwUlJCajB7e1JOMDAwMDAwMDAwMDAwMDFfZmtSVWQwQn50PUZKb19RWkREUj9iMSFJUlk7CitaMWNjfkRDTTB1JSFqMDAwMDgwUH5kPU0qfVcocUJqbHowN0UkZDAyY3JOMDAwMDAwMDAwMDBIbEUqUlN5N2dYPmMhTloqNlUxWmUoKldYCis+TjBMVlFnJEphQ3VObTBSantRNmFXQUsybXRleTdEc1c5bE1wWm0wMDJgUTAwMHlLMDAwMDAwMDAwMDAwNStjaSg/TX1hQXxOYVZ7ZEozCitWUXlxfEZLbFVaYlNganRQKWgqPDZheTNoMDAwTzheT1k3eSszVismUnxXdDh7MUVeRTc2MVNNMDAwMDAwMDAwMHE9RF5mNCorbSFhNCV6CitUWkVhejBXT0ZaYlducHEtWGZBTWhQKWgqPDZheTNoMDAwTzheT1k3eVFpOyQ7QXFEXmRaVzkwaTZhV0FLMDAwMDAwMDAwMHE9OSZHNCorCittIWE0JXpUWkVhejBXT0ZaYlhtNThlYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHVhejg5JmVpMDAyWV8wMDA+UDAwMDAwMDAwMDAwMDUrYyVYCitiZHxhQXxOYVZ7ZEozVlF5cXxGTGlFZFpnWF5EWS19IVljfkRDTTB1JSFqMDAwMDgwUH5kPU18Z2x3I3huPjIwMV9QbDAyS2ZMMDAwMDAwCiswMDAwMEhsR15kays5YFg+YyFOWio2VTFaZSgqV2NXN20wWSVYd2xQKWgqPDZheTNoMDAwTzheT1k3eWQ7WUNzbG0hMylOKH0lMjc2MVNNCiswMDAwMDAwMDAwcT03aHU0KittIWE0JXpUWkUjXzlGSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eWZ9KjlETyUodERJOWRQCit6N3l0a08wMDAwMDAwMDAwcT01ajY0KittIWE0JXpUWkUjXzlGSngoQmJZcExCV0AlP0dhQ3VObTBSantRNmFXQUsybXRleTdEdVdZWFNfCitpRzAwMmgtMDAwJk0wMDAwMDAwMDAwMDA1K2NnUCN1b2FBfE5hWkVze3tZOyFNUFV1a1k+YllFWENhQ3VObTBSantRNmFXQUsybXRleTdECitzNEtHSHV9aTAwOEYhMDAwdkowMDAwMDAwMDAwMDA1K2NfQDU1fGFBfE5hWkVze3tZOyFNWlplKFM2RV52OEpPOTI4RDB+NyFOMDA7b3tsCitAPjw7MDAwMDIwMDAwMDAwMDBRMDAwMDAwMDAwMDAwMDFfZmVON3kwQn50PUZLPSpWYSQkNjdaKkZyaFV0ZWklWD4/eS1FXnY4Sk85MjhECiswfjchTjAwO297bEA+P1JGPmg2NTFPTmIjNComb2QwMDAwMDAwMDAwMDAwMV9ma2RHWDBCfnQ9Rks9KlZhJCQ2N1oqRnJoV14hZF5kU3h6CitmY35EQ00wdSUhajAwMDA4MFB+ZD1NX2cmcjhHcngpMDJCY0wwMjJUSjAwMDAwMDAwMDAwSGxINXI0SW1iWD5jIWNXcE9XR1V1a1k+YllFCitYQ2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R3Rk5HcTZTcjAwNzElMDAwdkowMDAwMDAwMDAwMDA1K2NrRVJhKmFBfE5hYSVGS1phJUZLfVdACismNj9FXnY4Sk85MjhEMH43IU4wMDtve2xAPj1ERW1RKkVERjZVaXJ+bSpLMDAwMDAwMDAwMDAwMDFfZmQ7WTwwQn50PUZMR3NaRkxHc1pVCit1a1owYllYMDRFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1gN3wkMyU4dnA8X1lYQVRlMDAwMDAwMDAwMDAwMDFfZmY/S24wQn50PUZMR3NaCitGTEdzWlV2cCkyRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/Mk5IaHB2Mm1rPXo4dnA8cDAwMDAwMDAwMDAwMDAxX2ZyfEdKMEJ+dD1GTEdzCitaRkxHc1pVditNMlpnWF5EWS19IVljfkRDTTB1JSFqMDAwMDgwUH5kPU0/QD1BUF9RMlcwS1JBZDAyS2ZMMDAwMDAwMDAwMDBIbEUqMDF5CitDaFg+YyFmYlpLbUpGSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eV5PJlZxMm5xbEkpZ3U0XjZhV0FLMDAwMDAwMDAwMHE9Cis1bjs1Q0N2I2E0JlVxWD40O1pWUV9Ge1g+eE5lYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHZxdE8pZFplMDAxQmIwMDBzSTAwMDAwMDAwMDAwCiswNStjSlNxP1hhQXxOYWIjIVRMYjEhMGJYPjRSSmFDdU5tMFJqe1E2YVdBSzJtdGV5N0R2OVRoR15kYzAwM3dSMDAwO08wMDAwMDAwMDAwCiswMDUrY1klQ0F9YUF8TmFiIyFUTGIxITZOYUJeajFWUlVKNFpaMj9uUCloKjw2YXkzaDAwME84Xk9ZN3lAPFoqd3F5WWNgZzk4OG43WFNiCitOMDAwMDAwMDAwMHE9QTdpNUNDdiNhNCZVcVg+NDtaV0AmNj9iOXItZ1dvPDVTY35EQ00wdSUhajAwMDA4MFB+ZD1NYDJSQlZ6VUdRMFI5CitYQjAyQlpLMDAwMDAwMDAwMDBIbEZoRiVTVDdYPmMhZmJaS21KRktsbVRYSzhMe0VedjhKTzkyOEQwfjchTjAwO297bEA+Pn1gIT9+QjFeCitAdUY2I3hKZzAwMDAwMDAwMDAwMDAxX2ZqPjQ3MEJ+dD1GTGlXalk7IU1mYiMhRTViWSl+TmFDdU5tMFJqe1E2YVdBSzJtdGV5N0R1NWsxCis9fH01MDA0RngwMDBqRjAwMDAwMDAwMDAwMDUrYzEzZUdgYUF8TmFiIyFUTGIxIXZpRV52OEpPOTI4RDB+NyFOMDA7b3tsQD49b3FsOHBaCis0RkNZfUVkVCUkMDAwMDAwMDAwMDAwMDFfZmxFZFowQn50PUZMcTtkRkpFNzJaZlNJMVVvTFFZUCloKjw2YXkzaDAwME84Xk9ZN3k+elJyCis1JUxNPWNPQSFENzVkWilIMDAwMDAwMDAwMHE9QyYtNUNDdiNhNCZYYWIxITBIZFNQTDVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9TaF9zCitKQzI+PH1OOVJMNmgwMDAwMDAwMDAwMDAwMV9meVlAODBCfnQ9RkxxO2RGSzIwVkVedjhKTzkyOEQwfjchTjAwO297bEA+PUJvMH5YfjFwCitva1U2OTUxZDAwMDAwMDAwMDAwMDAxX2ZpaHpkMEJ+dD1GTHE7ZEZLdU9WVnw4K0FWUWVtTmN+RENNMHUlIWowMDAwODBQfmQ9TT88QE41CitqX2s1ME9Ua0QwMktmTDAwMDAwMDAwMDAwSGxIUVhiPUUhWD5jIWdWezxRYWJ6Kmo5YSZ1e0taWjI/blApaCo8NmF5M2gwMDBPOF8+fnElCit7YmEpVmJwWmVYSnAldiRCTER5WjAwMDAwMDAwMDBxPTkyfjVDQ3YjYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWJoZVEkdGNvUCpoMXpQQStuCitEYldscUgwdSUhajAwMDA4MFFpKl9NO1gpaEJgTj5fMDdMKSkwMy1rYTAwMDAwMDAwMDAwSGxFI2NNdCRAWD5jdCFFLUB9TEVAV3dRYlMtCitJYVdeWFRMWmdnXmFVdk9ffVpnZ2BsYmEtQDdPOTI4RDB+NyFOMDA7cDFsQD4+KDRqOX5IMHNzS2gxcG9qYzAwMDAwMDAwMDAwMDAxX2ZyCitXUHYwQn50PUVqS1BQRTsyNDtYPilXZlg+TWszRkt1T1hWUHMpK1ZKPlFPWipFWGEwUmp7UTZhV0FLMm10dCU3RHVIJURWe0Y/MDAxcmswCiswMH5TMDAwMDAwMDAwMDAwNStjQ3dkUzdhQXxOWUghZCtRR0E/OWtiOTYwZlpmMCpVYUFJO1VZSUFSSFApaCo8NmF5M2gwMDBPOF8+fnElCisjfit1JTFeQHM2MU9OYTRBcGlnWDAwMDAwMDAwMDBxPUFybjVDQ3YjYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWRJamE5P2E/YzRjZlhiYS1ACis3TzkyOEQwfjchTjAwO3AxbEA+PmJHazxTaTAwMDFQMDAwMFAwMDAwMDAwMDAwMDAwMV9mel41dDBCfnQ9RWpLUFBFOzI0O1g+KVdmWD5NCitrM0ZJUHhLTU5DamowUmp7UTZhV0FLMm10dCU3RHNOZDRlOTl1MDA2eFEwMDB+UzAwMDAwMDAwMDAwMDUrY1lrTHA/YUF8TllIIWQrUUdBCis/OWtiOTYwZlpmMCpVTyt7MmVMX3QoUlApaCo8NmF5M2gwMDBPOF8+fnElamchKlJgelpoYlI5NjUxOFVPJFEwMDAwMDAwMDAwcT1BbHA1CitDQ3YjYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWMwc0xyK3BmUCloe3swMDAwMD47VVdsWEd7UDkhS2VAYjAwMAorIiIiCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvaW5kZXhfb3BzLnB5IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy9pbmRleF9vcHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmM2JiMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvaW5kZXhfb3BzLnB5CkBAIC0wLDAgKzEsMTUxIEBACitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgc3RyaW5nCitpbXBvcnQganNvbgorZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKK2Zyb20gZWxhc3RpY3NlYXJjaCBpbXBvcnQgRWxhc3RpY3NlYXJjaAoraW1wb3J0IGVsYXN0aWNzZWFyY2gKK2ltcG9ydCBlbGFzdGljc2VhcmNoLmhlbHBlcnMKK2Zyb20gZWxhc3RpY3NlYXJjaC5jbGllbnQgaW1wb3J0IEluZGljZXNDbGllbnQsIENhdENsaWVudAoraW1wb3J0IHN5cywgb3MsIGdldG9wdAorZnJvbSBmaWxlX3V0aWxzIGltcG9ydCByZWFkRmlsZVRvSnNvbgorZnJvbSBjb25maWdfcHJvcGVydGllcyBpbXBvcnQgZ2V0R2xvYmFsVmFyIAorCisKKworZGVmIGNyZWF0ZUluZGV4KGNsaWVudCwgaW5kZXhOYW1lLCBjcmVhdGVCb2R5KToKKyAgICB0cnk6CisgICAgICBwcmludCAic3RhcnQgY3JlYXRlSW5kZXgiCisgICAgICBpZiAoY2xpZW50ID09IE5vbmUpOgorICAgICAgICAgY2xpZW50ID0gRWxhc3RpY3NlYXJjaChbJ2xvY2FsaG9zdCddKQorICAgICAgZXNJbmRleENsaWVudCA9IEluZGljZXNDbGllbnQoY2xpZW50KQorICAgICAgcmVzID0gZGVsZXRlSW5kZXgoY2xpZW50LCBpbmRleE5hbWUpCisgICAgICBpZiAocmVzICE9IDApOgorICAgICAgICAgcHJpbnQgIm9wZXJhdGlvbiBmYWlsZWQiCisgICAgICAgICByZXR1cm4gMgorICAgICAgY3JlYXRlX3Jlcz1lbGFzdGljc2VhcmNoLmNsaWVudC5JbmRpY2VzQ2xpZW50LmNyZWF0ZShlc0luZGV4Q2xpZW50LCBpbmRleD1pbmRleE5hbWUsIGJvZHk9Y3JlYXRlQm9keSkKKyAgICAgIHByaW50ICJjcmVhdGUgaW5kZXggcmVzcG9uc2U6ICIsIGNyZWF0ZV9yZXMKKyAgICAgIGlmIChjcmVhdGVfcmVzWydhY2tub3dsZWRnZWQnXSAhPSBUcnVlKToKKyAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gY3JlYXRlIGluZGV4IgorICAgICAgICAgcmV0dXJuIDEKKyAgICAgIGVsc2U6CisgICAgICAgICBwcmludCAiaW5kZXggIixpbmRleE5hbWUsICIgY3JlYXRlZCBzdWNjZXNzZnVsbHkiCisgICAgICAgICByZXR1cm4gMAorICAgIGV4Y2VwdCBFeGNlcHRpb24sIGVycm9yOgorICAgICAgcHJpbnQgIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duISIKKyAgICAgIHByaW50IHN0cihlcnJvcikKKyAgICAgIHJldHVybiAyCisgIAorCitkZWYgZGVsZXRlSW5kZXgoY2xpZW50LCBpbmRleE5hbWUpOgorICAgdHJ5OgorICAgICBwcmludCAic3RhcnQgZGVsZXRlSW5kZXgiCisgICAgIGlmIChjbGllbnQgPT0gTm9uZSk6CisgICAgICAgICBjbGllbnQgPSBFbGFzdGljc2VhcmNoKFsnbG9jYWxob3N0J10pCisgICAgIGVzSW5kZXhDbGllbnQgPSBJbmRpY2VzQ2xpZW50KGNsaWVudCkKKyAgICAgaXNFeGlzdHM9ZWxhc3RpY3NlYXJjaC5jbGllbnQuSW5kaWNlc0NsaWVudC5leGlzdHMoZXNJbmRleENsaWVudCwgaW5kZXhOYW1lKQorICAgICBpZiAoIGlzRXhpc3RzID09IFRydWUgKToKKyAgICAgICAgZGVsZXRlX3Jlcz1lbGFzdGljc2VhcmNoLmNsaWVudC5JbmRpY2VzQ2xpZW50LmRlbGV0ZShlc0luZGV4Q2xpZW50LCBpbmRleD1pbmRleE5hbWUpCisgICAgICAgIGlmIChkZWxldGVfcmVzWydhY2tub3dsZWRnZWQnXSAhPSBUcnVlKToKKyAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byBkZWxldGUgaW5kZXgiCisgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIHByaW50ICJpbmRleCAiLGluZGV4TmFtZSwgIiBkZWxldGVkIgorICAgICAgICAgICByZXR1cm4gMAorICAgICBlbHNlOgorICAgICAgICBwcmludCAiaW5kZXggbm90IGZvdW5kIC0gYXNzdW1lIGFscmVhZHkgZGVsZXRlZCIKKyAgICAgICAgcmV0dXJuIDAKKyAgIGV4Y2VwdCBFeGNlcHRpb24sIGVycm9yOgorICAgICAgcHJpbnQgIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duISIKKyAgICAgIHByaW50IHN0cihlcnJvcikKKyAgICAgIHJldHVybiAyCisKK2RlZiBjb3B5SW5kZXgoY2xpZW50LCBmcm9tSW5kZXgsIHRvSW5kZXgpOgorICAgIHRyeTogCisgICAgICBwcmludCAic3RhcnQgY29weUluZGV4IgorICAgICAgaWYgKGNsaWVudCA9PSBOb25lKToKKyAgICAgICAgIGNsaWVudCA9IEVsYXN0aWNzZWFyY2goWydsb2NhbGhvc3QnXSkKKyAgICAgIGNsaWVudC5pbmRpY2VzLnJlZnJlc2goaW5kZXg9ZnJvbUluZGV4KQorICAgICAgY291bnQ9Y2xpZW50LnNlYXJjaChmcm9tSW5kZXgsIHNlYXJjaF90eXBlPSdjb3VudCcpCisgICAgICBwcmludCAib3JpZ2luYWwgaW5kZXggY291bnQ6ICIsY291bnQKKyAgICAgIGRvY051bSwgZG9jRXJyb3JzID0gZWxhc3RpY3NlYXJjaC5oZWxwZXJzLnJlaW5kZXgoY2xpZW50LCBmcm9tSW5kZXgsIHRvSW5kZXgpCisgICAgICBwcmludCAiY29weSByZXN1bHQ6ICIsIGRvY051bSwgZG9jRXJyb3JzIAorICAgICAgaWYgKGRvY051bSAhPSBjb3VudFsnaGl0cyddWyd0b3RhbCddKToKKyAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gY29weSBhbGwgZG9jdW1lbnRzLiBleHBlY3RlZDogIiwgY291bnRbJ2hpdHMnXVsndG90YWwnXSwgIiBhY3R1YWw6ICIsIGRvY051bQorICAgICAgICAgcmV0dXJuIDEKKyAgICAgICMgaWYgKGxlbihkb2NFcnJvcnMpICE9IDApOgorICAgICAgICAgIyBwcmludCAiY29weSByZXR1cm5lZCB3aXRoIGVycm9ycyIKKyAgICAgICAgICMgcHJpbnQgZG9jRXJyb3JzCisgICAgICAgICAjIHJldHVybiAxCisgICAgICByZXR1cm4gMAorICAgIGV4Y2VwdCBFeGNlcHRpb24sIGVycm9yOgorICAgICAgcHJpbnQgIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duISIKKyAgICAgIHByaW50IHN0cihlcnJvcikKKyAgICAgIHJldHVybiAyCisgIAorCitkZWYgdXNhZ2UoKToKKyAgICAgcHJpbnQgJ1VTQUdFOiAnLCBzeXMuYXJndlswXSwgJy1vIDxvcGVyYXRpb24gOiBjcmVhdGUgfCBkZWxldGUgfCBtb3ZlPiAtbiA8aW5kZXhOYW1lPiAtYSA8YWRkcmVzcz4gLWYgPG1hcHBpbmdGaWxlIChmb3IgY3JlYXRlKT4gLXQgPHRvSW5kZXggKGZvciBtb3ZlIG9wZXJhdGlvbik+JyAKKyAgICAgCisKKworZGVmIG1haW4oYXJndik6CisgICBwcmludCAic3RhcnQgc2NyaXB0IHdpdGggIiwgbGVuKHN5cy5hcmd2KSwgJ2FyZ3VtZW50cy4nCisgICBwcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKworICAgdHJ5OgorICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJndiwgImg6bzphOm46Zjp0OiIsIFsib3BlcmF0aW9uIiwiYWRkcmVzcyIsImluZGV4TmFtZSIsImZpbGUiLCJ0b0luZGV4Il0pCisgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorICAgICAgICAgdXNhZ2UoKQorICAgICAgICAgc3lzLmV4aXQoMikKKyAKKyAgIGhvc3QgPSBOb25lCisgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKKyAgICAgICAgIHByaW50IG9wdCwgYXJnCisgICAgICAgICBpZiBvcHQgPT0gJy1oJzoKKyAgICAgICAgICAgICB1c2FnZSgpCisgICAgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICAgICAgIGVsaWYgb3B0IGluICgnLWYnLCAnLS1maWxlJyk6CisgICAgICAgICAgICBtYXBwaW5nPXJlYWRGaWxlVG9Kc29uKGFyZykKKyAgICAgICAgIGVsaWYgb3B0IGluICgnLWEnLCAnLS1hZGRyZXNzJyk6CisgICAgICAgICAgICBob3N0PWFyZworICAgICAgICAgZWxpZiBvcHQgaW4gKCctbycsICctLW9wZXJhdGlvbicpOgorICAgICAgICAgICAgb3BlcmF0aW9uPWFyZworICAgICAgICAgZWxpZiBvcHQgaW4gKCctbicsICctLWluZGV4TmFtZScpOgorICAgICAgICAgICAgaW5kZXhOYW1lPWFyZworICAgICAgICAgZWxpZiBvcHQgaW4gKCctdCcsICctLXRvSW5kZXgnKToKKyAgICAgICAgICAgIGRlc3RJbmRleE5hbWU9YXJnCisKKyAgIGlmIChvcGVyYXRpb24gPT0gTm9uZSk6CisgICAgICAgdXNhZ2UoKQorICAgICAgIHN5cy5leGl0KDIpCisgICBlbGlmIChob3N0ID09IE5vbmUpOgorICAgICAgIHByaW50ICJhZGRyZXNzIGlzIG1hbmRhdG9yeSBhcmd1bWVudCIKKyAgICAgICB1c2FnZSgpCisgICAgICAgc3lzLmV4aXQoMikKKyAgIGVsaWYgb3BlcmF0aW9uID09ICdjcmVhdGUnOgorICAgICAgIHByaW50ICJjcmVhdGUgbmV3IGluZGV4ICIsIGluZGV4TmFtZQorICAgICAgIGNsaWVudCA9IEVsYXN0aWNzZWFyY2goW3snaG9zdCc6IGhvc3QsICd0aW1lb3V0Jzo1fV0gKQorICAgICAgIHJlcyA9IGNyZWF0ZUluZGV4KGNsaWVudCwgaW5kZXhOYW1lLCBtYXBwaW5nKQorICAgCisgICBlbGlmIG9wZXJhdGlvbiA9PSAnZGVsZXRlJzoKKyAgICAgICBwcmludCAiZGVsZXRlIGluZGV4ICIsIGluZGV4TmFtZQorICAgICAgIGNsaWVudCA9IEVsYXN0aWNzZWFyY2goW3snaG9zdCc6IGhvc3QsICd0aW1lb3V0Jzo1fV0gKQorICAgICAgIHJlcyA9IGRlbGV0ZUluZGV4KGNsaWVudCwgaW5kZXhOYW1lKQorCisgICBlbGlmIG9wZXJhdGlvbiA9PSAnbW92ZSc6CisgICAgICAgcHJpbnQgIm1vdmUgaW5kZXggIiwgaW5kZXhOYW1lLCAiIHRvICIsIGRlc3RJbmRleE5hbWUKKyAgICAgICBjbGllbnQgPSBFbGFzdGljc2VhcmNoKFt7J2hvc3QnOiBob3N0LCAndGltZW91dCc6NX1dICkKKyAgICAgICByZXMgPSBjb3B5SW5kZXgoY2xpZW50LCBpbmRleE5hbWUsIGRlc3RJbmRleE5hbWUpCisgICBlbHNlOgorICAgICAgIHVzYWdlKCkKKyAgICAgICBleGl0KDIpCisgICBpZiByZXMgIT0gMDoKKyAgICAgIHByaW50ICJFUlJPUjogb3BlcmF0aW9uIEZhaWxlZCIKKyAgICAgIGV4aXQoMSkKKyAgICAKKworICAKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorCisKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvYXVkaXRpbmdnZXR1ZWJjbHVzdGVyZXZlbnQudHh0IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy9hdWRpdGluZ2dldHVlYmNsdXN0ZXJldmVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlOTQzNQotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvYXVkaXRpbmdnZXR1ZWJjbHVzdGVyZXZlbnQudHh0CkBAIC0wLDAgKzEsOCBAQAoreyAgICAgICAgICAgICJhY3Rpb24iOiAiQUNUSU9OIiwKKyAgICAgICAgICAgICAidGltZXN0YW1wIjogIlRJTUVTVEFNUCIsCisgICAgICAgICAgICAgInJlcXVlc3RJZCI6ICJSRVFVRVNUX0lEIiwKKyAgICAgICAgICAgICAic2VydmljZUluc3RhbmNlSWQiOiAiU0VSVklDRV9JTlNUQU5DRV9JRCIsCisgICAgICAgICAgICAgImRlc2MiOiAiREVTQyIsCisgICAgICAgICAgICAgInN0YXR1cyI6ICJTVEFUVVMiLAorICAgICAgICAgICAgICJjb25zdW1lcklkIjogIkNPTlNVTUVSX0lEIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvZGlzdHJpYnV0aW9uZGVwbG95ZXZlbnQudHh0IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy9kaXN0cmlidXRpb25kZXBsb3lldmVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0ZjAzNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvZGlzdHJpYnV0aW9uZGVwbG95ZXZlbnQudHh0CkBAIC0wLDAgKzEsMTQgQEAKK3sKKyAgICAgICAgICAgICAiYWN0aW9uIjogIkFDVElPTiIsCisgICAgICAgICAgICAgInRpbWVzdGFtcCI6ICJUSU1FU1RBTVAiLAorICAgICAgICAgICAgICJyZXF1ZXN0SWQiOiAiUkVRVUVTVF9JRCIsCisgICAgICAgICAgICAgInNlcnZpY2VJbnN0YW5jZUlkIjogIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiLAorICAgICAgICAgICAgICJkZXNjIjogIkRFU0MiLAorICAgICAgICAgICAgICJzdGF0dXMiOiAiU1RBVFVTIiwKKyAgICAgICAgICAgICAiY3VyclZlcnNpb24iOiAiQ1VSUl9WRVJTSU9OIiwKKyAgICAgICAgICAgICAiZGlzdHJpYnV0aW9uSWQiOiAiRElEIiwKKyAgICAgICAgICAgICAibW9kaWZpZXJOYW1lIjogIk1PRElGSUVSX05BTUUiLAorICAgICAgICAgICAgICJtb2RpZmllclVpZCI6ICJNT0RJRklFUl9VSUQiLAorICAgICAgICAgICAgICJyZXNvdXJjZU5hbWUiOiAiUkVTT1VSQ0VfTkFNRSIsCisgICAgICAgICAgICAgInJlc291cmNlVHlwZSI6ICJSRVNPVVJDRV9UWVBFIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvZGlzdHJpYnV0aW9uZG93bmxvYWRldmVudC50eHQgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL3R5cGVzL2Rpc3RyaWJ1dGlvbmRvd25sb2FkZXZlbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWM0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL3R5cGVzL2Rpc3RyaWJ1dGlvbmRvd25sb2FkZXZlbnQudHh0CkBAIC0wLDAgKzEsOSBAQAoreyAgICAgICAgICAgICJhY3Rpb24iOiAiQUNUSU9OIiwKKyAgICAgICAgICAgICAidGltZXN0YW1wIjogIlRJTUVTVEFNUCIsCisgICAgICAgICAgICAgInJlcXVlc3RJZCI6ICJSRVFVRVNUX0lEIiwKKyAgICAgICAgICAgICAic2VydmljZUluc3RhbmNlSWQiOiAiU0VSVklDRV9JTlNUQU5DRV9JRCIsCisgICAgICAgICAgICAgImRlc2MiOiAiREVTQyIsCisgICAgICAgICAgICAgInN0YXR1cyI6ICJTVEFUVVMiLAorICAgICAgICAgICAgICJyZXNvdXJjZVVybCI6ICJSRVNPVVJDRV9VUkwiLAorICAgICAgICAgICAgICJjb25zdW1lcklkIjogIkNPTlNVTUVSX0lEIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvZGlzdHJpYnV0aW9uZW5naW5lZXZlbnQudHh0IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy9kaXN0cmlidXRpb25lbmdpbmVldmVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MTA0MgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvZGlzdHJpYnV0aW9uZW5naW5lZXZlbnQudHh0CkBAIC0wLDAgKzEsMTMgQEAKK3sKKyAgICAgICAgICAgICAiYWN0aW9uIjogIkFDVElPTiIsCisgICAgICAgICAgICAgInRpbWVzdGFtcCI6ICJUSU1FU1RBTVAiLAorICAgICAgICAgICAgICJyZXF1ZXN0SWQiOiAiUkVRVUVTVF9JRCIsCisgICAgICAgICAgICAgInNlcnZpY2VJbnN0YW5jZUlkIjogIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiLAorICAgICAgICAgICAgICJkZXNjIjogIkRFU0MiLAorICAgICAgICAgICAgICJzdGF0dXMiOiAiU1RBVFVTIiwKKyAgICAgICAgICAgICAiY29uc3VtZXJJZCI6ICJDT05TVU1FUl9JRCIsCisgICAgICAgICAgICAgInJvbGUiOiAiUk9MRSIsCisgICAgICAgICAgICAgInRvcGljTmFtZSI6ICJUT1BJQ19OQU1FIiwKKyAgICAgICAgICAgICAiYXBpS2V5IjogIkFQSV9LRVkiLAorICAgICAgICAgICAgICJlbnZpcm9ubWVudE5hbWUiOiAiRF9FTlYiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy9kaXN0cmlidXRpb25ub3RpZmljYXRpb25ldmVudC50eHQgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL3R5cGVzL2Rpc3RyaWJ1dGlvbm5vdGlmaWNhdGlvbmV2ZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc1ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy9kaXN0cmlidXRpb25ub3RpZmljYXRpb25ldmVudC50eHQKQEAgLTAsMCArMSwxNiBAQAoreworICAgICAgICAgICAgICJhY3Rpb24iOiAiQUNUSU9OIiwKKyAgICAgICAgICAgICAidGltZXN0YW1wIjogIlRJTUVTVEFNUCIsCisgICAgICAgICAgICAgInJlcXVlc3RJZCI6ICJSRVFVRVNUX0lEIiwKKyAgICAgICAgICAgICAic2VydmljZUluc3RhbmNlSWQiOiAiU0VSVklDRV9JTlNUQU5DRV9JRCIsCisgICAgICAgICAgICAgImRlc2MiOiAiREVTQyIsCisgICAgICAgICAgICAgInN0YXR1cyI6ICJTVEFUVVMiLAorICAgICAgICAgICAgICJjdXJyVmVyc2lvbiI6ICJDVVJSX1ZFUlNJT04iLAorICAgICAgICAgICAgICJjdXJyU3RhdGUiOiAiQ1VSUl9TVEFURSIsCisgICAgICAgICAgICAgImRpc3RyaWJ1dGlvbklkIjogIkRJRCIsCisgICAgICAgICAgICAgIm1vZGlmaWVyTmFtZSI6ICJNT0RJRklFUl9OQU1FIiwKKyAgICAgICAgICAgICAibW9kaWZpZXJVaWQiOiAiTU9ESUZJRVJfVUlEIiwKKyAgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogIlJFU09VUkNFX05BTUUiLAorICAgICAgICAgICAgICJyZXNvdXJjZVR5cGUiOiAiUkVTT1VSQ0VfVFlQRSIsCisgICAgICAgICAgICAgInRvcGljTmFtZSI6ICJUT1BJQ19OQU1FIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvZGlzdHJpYnV0aW9uc3RhdHVzZXZlbnQudHh0IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy9kaXN0cmlidXRpb25zdGF0dXNldmVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlZDlkZAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvZGlzdHJpYnV0aW9uc3RhdHVzZXZlbnQudHh0CkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgICAgICAgICAgICAiYWN0aW9uIjogIkFDVElPTiIsCisgICAgICAgICAgICAgInRpbWVzdGFtcCI6ICJUSU1FU1RBTVAiLAorICAgICAgICAgICAgICJyZXF1ZXN0SWQiOiAiUkVRVUVTVF9JRCIsCisgICAgICAgICAgICAgInNlcnZpY2VJbnN0YW5jZUlkIjogIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiLAorICAgICAgICAgICAgICJkZXNjIjogIkRFU0MiLAorICAgICAgICAgICAgICJzdGF0dXMiOiAiU1RBVFVTIiwKKyAgICAgICAgICAgICAicmVzb3VyY2VVcmwiOiAiUkVTT1VSQ0VfVVJMIiwKKyAgICAgICAgICAgICAiY29uc3VtZXJJZCI6ICJDT05TVU1FUl9JRCIsCisgICAgICAgICAgICAgImRpc3RyaWJ1dGlvbklkIjogIkRJRCIsCisgICAgICAgICAgICAgInRvcGljTmFtZSI6ICJUT1BJQ19OQU1FIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvcmVzb3VyY2VhZG1pbmV2ZW50LnR4dCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvcmVzb3VyY2VhZG1pbmV2ZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjMxYWEzCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy9yZXNvdXJjZWFkbWluZXZlbnQudHh0CkBAIC0wLDAgKzEsMjEgQEAKK3sKKyAgICAgICAgICAgICAiYWN0aW9uIjogIkFDVElPTiIsCisgICAgICAgICAgICAgInRpbWVzdGFtcCI6ICJUSU1FU1RBTVAiLAorICAgICAgICAgICAgICJyZXF1ZXN0SWQiOiAiUkVRVUVTVF9JRCIsCisgICAgICAgICAgICAgInNlcnZpY2VJbnN0YW5jZUlkIjogIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiLAorICAgICAgICAgICAgICJkZXNjIjogIkRFU0MiLAorICAgICAgICAgICAgICJzdGF0dXMiOiAiU1RBVFVTIiwKKyAgICAgICAgICAgICAiY3VyclZlcnNpb24iOiAiQ1VSUl9WRVJTSU9OIiwKKyAgICAgICAgICAgICAiY3VyclN0YXRlIjogIkNVUlJfU1RBVEUiLAorICAgICAgICAgICAgICJkaXN0cmlidXRpb25JZCI6ICJESUQiLAorICAgICAgICAgICAgICJtb2RpZmllck5hbWUiOiAiTU9ESUZJRVJfTkFNRSIsCisgICAgICAgICAgICAgIm1vZGlmaWVyVWlkIjogIk1PRElGSUVSX1VJRCIsCisgICAgICAgICAgICAgInByZXZWZXJzaW9uIjogIlBSRVZfVkVSU0lPTiIsCisgICAgICAgICAgICAgInByZXZTdGF0ZSI6ICJQUkVWX1NUQVRFIiwKKyAgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogIlJFU09VUkNFX05BTUUiLAorICAgICAgICAgICAgICJyZXNvdXJjZVR5cGUiOiAiUkVTT1VSQ0VfVFlQRSIsCisgICAgICAgICAgICAgImRQcmV2U3RhdHVzIjogIkRQUkVWX1NUQVRVUyIsCisgICAgICAgICAgICAgImRDdXJyU3RhdHVzIjogIkRDVVJSX1NUQVRVUyIsCisgICAgICAgICAgICAgImNvbW1lbnQiOiAiQ09NTUVOVCIsCisgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJBUlRJRkFDVF9OQU1FIgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvdXNlcmFjY2Vzc2V2ZW50LnR4dCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvdXNlcmFjY2Vzc2V2ZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQyN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL2VzLXJlc291cmNlcy90eXBlcy91c2VyYWNjZXNzZXZlbnQudHh0CkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgICAgICAgICAgICAiYWN0aW9uIjogIkFDVElPTiIsCisgICAgICAgICAgICAgInRpbWVzdGFtcCI6ICJUSU1FU1RBTVAiLAorICAgICAgICAgICAgICJyZXF1ZXN0SWQiOiAiUkVRVUVTVF9JRCIsCisgICAgICAgICAgICAgInNlcnZpY2VJbnN0YW5jZUlkIjogIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiLAorICAgICAgICAgICAgICJkZXNjIjogIkRFU0MiLAorICAgICAgICAgICAgICJzdGF0dXMiOiAiU1RBVFVTIiwKKyAgICAgICAgICAgICAidXNlclVpZCI6ICJVU0VSX1VJRCIsCisgICAgICAgICAgICAgInVzZXJOYW1lIjogIlVTRVJfTkFNRSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL3R5cGVzL3VzZXJhZG1pbmV2ZW50LnR4dCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9lcy1yZXNvdXJjZXMvdHlwZXMvdXNlcmFkbWluZXZlbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTBkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvZXMtcmVzb3VyY2VzL3R5cGVzL3VzZXJhZG1pbmV2ZW50LnR4dApAQCAtMCwwICsxLDIwIEBACit7CisgICAgICAgICAgICAgImFjdGlvbiI6ICJBQ1RJT04iLAorICAgICAgICAgICAgICJ0aW1lc3RhbXAiOiAiVElNRVNUQU1QIiwKKyAgICAgICAgICAgICAicmVxdWVzdElkIjogIlJFUVVFU1RfSUQiLAorICAgICAgICAgICAgICJzZXJ2aWNlSW5zdGFuY2VJZCI6ICJTRVJWSUNFX0lOU1RBTkNFX0lEIiwKKyAgICAgICAgICAgICAiZGVzYyI6ICJERVNDIiwKKyAgICAgICAgICAgICAic3RhdHVzIjogIlNUQVRVUyIsCisgICAgICAgICAgICAgIm1vZGlmaWVyTmFtZSI6ICJNT0RJRklFUl9OQU1FIiwKKyAgICAgICAgICAgICAibW9kaWZpZXJVaWQiOiAiTU9ESUZJRVJfVUlEIiwKKyAgICAgICAgICAgICAidXNlclVpZCI6ICJVU0VSX1VJRCIsCisgICAgICAgICAgICAgInVzZXJOYW1lIjogIlVTRVJfTkFNRSIsCisgICAgICAgICAgICAgInVzZXJFbWFpbCI6ICJVU0VSX0VNQUlMIiwKKyAgICAgICAgICAgICAidXNlclJvbGUiOiAiVVNFUl9ST0xFIiwKKyAgICAgICAgICAgICAidXNlckJlZm9yZU5hbWUiOiAiVVNFUl9CRUZPUkVfTkFNRSIsCisgICAgICAgICAgICAgInVzZXJCZWZvcmVFbWFpbCI6ICJVU0VSX0JFRk9SRV9FTUFJTCIsCisgICAgICAgICAgICAgInVzZXJCZWZvcmVSb2xlIjogIlVTRVJfQkVGT1JFX1JPTEUiLAorICAgICAgICAgICAgICJ1c2VyQWZ0ZXJOYW1lIjogIlVTRVJfQUZURVJfTkFNRSIsCisgICAgICAgICAgICAgInVzZXJBZnRlckVtYWlsIjogIlVTRVJfQUZURVJfRU1BSUwiLAorICAgICAgICAgICAgICJ1c2VyQWZ0ZXJSb2xlIjogIlVTRVJfQUZURVJfUk9MRSIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9iYXNlT3BlcmF0aW9uLnNoIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvYmFzZU9wZXJhdGlvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjdiNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvYmFzZU9wZXJhdGlvbi5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorCitDVVJSRU5UX0RJUj1gcHdkYAorQkFTRURJUj0kKGRpcm5hbWUgJDApCisKK2lmIFsgJHtCQVNFRElSOjA6MX0gPSAiLyIgXQordGhlbgorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQkFTRURJUgorZWxzZQorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQ1VSUkVOVF9ESVIvJEJBU0VESVIKK2ZpCisKKyNlY2hvICRGVUxMX1BBVEgKKworTElCX0RJUj0kRlVMTF9QQVRILy4uCitCSU5fRElSPSRGVUxMX1BBVEgvLi4vYmluCitDT05GSUdfRElSPSRGVUxMX1BBVEgvLi4vY29uZmlnCisKK0pWTV9WRVJCT1NFPS1EdmVyYm9zZQorCitKVk1fTE9HX0ZJTEU9Ii1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT0ke0NPTkZJR19ESVJ9L2xvZ2JhY2sueG1sIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI0JJTlM9YGZpbmQgJEJJTl9ESVIgLW5hbWUgIiouamFyIiB8IHRyICJcXG4iICI6ImAKKworTElCUz1gZmluZCAkTElCX0RJUiAtbmFtZSAiKi5qYXIiIHwgdHIgIlxcbiIgIjoiYAorCitKQVJTPSRKQVJTOiRCSU5TOiRMSUJTCisKKworZXhwb3J0IEpBUlMKK2V4cG9ydCBKVk1fTE9HX0ZJTEUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2NsZWFuQ3Nhci5zaCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2NsZWFuQ3Nhci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTFjZGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvY2xlYW5Dc2FyLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEYXRhIE1pZ3JhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgY2xlYW4tY3NhciAkQCIKK2VjaG8gJGNvbW1hbmQKKworJGNvbW1hbmQKK3Jlc3VsdD0kPworCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqICRyZXN1bHQgKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2V4aXQgJHJlc3VsdAorCisKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2RhdGFNaWdyYXRpb24uc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kYXRhTWlncmF0aW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWM2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kYXRhTWlncmF0aW9uLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEYXRhIE1pZ3JhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgbWlncmF0ZS0xNjAyLTE2MDQgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kYXRhTWlncmF0aW9uMTYwNy5zaCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2RhdGFNaWdyYXRpb24xNjA3LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzg1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kYXRhTWlncmF0aW9uMTYwNy5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGF0YSBNaWdyYXRpb24gMTYwNworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgbWlncmF0ZS0xNjA0LTE2MDcgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kYXRhTWlncmF0aW9uMTYxMC5zaCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2RhdGFNaWdyYXRpb24xNjEwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDYxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kYXRhTWlncmF0aW9uMTYxMC5zaApAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vYmFzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGF0YSBNaWdyYXRpb24gMTYxMAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgZml4LXByb3BlcnRpZXMgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworaWYgWyAkcmVzdWx0IC1lcSAwIF0KK3RoZW4KKyAgY29tbWFuZD0iamF2YSAkSlZNX0xPR19GSUxFIC1jcCAkSkFSUyAkbWFpbkNsYXNzIGFsaWduLXRvc2NhLWFydGlmYWN0cyAkQCIKKyAgZWNobyAkY29tbWFuZAorICAkY29tbWFuZAorICByZXN1bHQ9JD8KK2ZpCisKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKiogJHJlc3VsdCAqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKworZXhpdCAkcmVzdWx0CisKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZGVsZXRlQWxsUHJvZHVjdHMuc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kZWxldGVBbGxQcm9kdWN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU0NjhkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZGVsZXRlQWxsUHJvZHVjdHMuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL2Jhc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGRlbGV0ZSBhbGwgcHJvZHVjdHMgZnJvbSB0aXRhbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5SZW1vdmVVdGlscyIKKworY29tbWFuZD0iamF2YSAkSlZNX0xPR19GSUxFIC1jcCAkSkFSUyAkbWFpbkNsYXNzIHJlbW92ZS1wcm9kdWN0cyAkQCIKK2VjaG8gJGNvbW1hbmQKKworJGNvbW1hbmQKK3Jlc3VsdD0kPworCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqICRyZXN1bHQgKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2V4aXQgJHJlc3VsdAorCisKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2Rlcml2ZWRGcm9tQWxpZ25tZW50LnNoIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZGVyaXZlZEZyb21BbGlnbm1lbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUwMjVhMAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2Rlcml2ZWRGcm9tQWxpZ25tZW50LnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEYXRhIE1pZ3JhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgYWxpZ24tZGVyaXZlZC1mcm9tLTE2MDQgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9lc1RvQ2Fzc2FuZHJhTWlncmF0aW9uLnNoIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXNUb0Nhc3NhbmRyYU1pZ3JhdGlvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM5MDRjCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXNUb0Nhc3NhbmRyYU1pZ3JhdGlvbi5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vYmFzaAorCitDVVJSRU5UX0RJUj1gcHdkYAorQkFTRURJUj0kKGRpcm5hbWUgJDApCisKK2lmIFsgJHtCQVNFRElSOjA6MX0gPSAiLyIgXQordGhlbgorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQkFTRURJUgorZWxzZQorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQ1VSUkVOVF9ESVIvJEJBU0VESVIKK2ZpCisKK3NvdXJjZSAke0ZVTExfUEFUSH0vYmFzZU9wZXJhdGlvbi5zaAorCittYWluQ2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLm1haW4uRXNUb0Nhc3NhbmRyYURhdGFNaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgZXMtdG8tY2Fzc25kcmEtbWlncmF0aW9uICRAIgorZWNobyAkY29tbWFuZAorCiskY29tbWFuZAorcmVzdWx0PSQ/CisKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKiogJHJlc3VsdCAqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKworZXhpdCAkcmVzdWx0CisKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXNUb0Nhc3NhbmRyYU1pZ3JhdGlvbkV4cG9ydE9ubHkuc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9lc1RvQ2Fzc2FuZHJhTWlncmF0aW9uRXhwb3J0T25seS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzhlMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXNUb0Nhc3NhbmRyYU1pZ3JhdGlvbkV4cG9ydE9ubHkuc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL2Jhc2gKKworQ1VSUkVOVF9ESVI9YHB3ZGAKK0JBU0VESVI9JChkaXJuYW1lICQwKQorCitpZiBbICR7QkFTRURJUjowOjF9ID0gIi8iIF0KK3RoZW4KKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JEJBU0VESVIKK2Vsc2UKKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JENVUlJFTlRfRElSLyRCQVNFRElSCitmaQorCitzb3VyY2UgJHtGVUxMX1BBVEh9L2Jhc2VPcGVyYXRpb24uc2gKKworbWFpbkNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5tYWluLkVzVG9DYXNzYW5kcmFEYXRhTWlncmF0aW9uTWVudSIKKworY29tbWFuZD0iamF2YSAkSlZNX0xPR19GSUxFIC1jcCAkSkFSUyAkbWFpbkNsYXNzIGVzLXRvLWNhc3NuZHJhLW1pZ3JhdGlvbi1leHBvcnQtb25seSAkQCIKK2VjaG8gJGNvbW1hbmQKKworJGNvbW1hbmQKK3Jlc3VsdD0kPworCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqICRyZXN1bHQgKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2V4aXQgJHJlc3VsdAorCisKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2VzVG9DYXNzYW5kcmFNaWdyYXRpb25JbXBvcnRPbmx5LnNoIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXNUb0Nhc3NhbmRyYU1pZ3JhdGlvbkltcG9ydE9ubHkuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlM2NhOAotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2VzVG9DYXNzYW5kcmFNaWdyYXRpb25JbXBvcnRPbmx5LnNoCkBAIC0wLDAgKzEsMjkgQEAKKyMhL2Jpbi9iYXNoCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5Fc1RvQ2Fzc2FuZHJhRGF0YU1pZ3JhdGlvbk1lbnUiCisKK2NvbW1hbmQ9ImphdmEgJEpWTV9MT0dfRklMRSAtY3AgJEpBUlMgJG1haW5DbGFzcyBlcy10by1jYXNzbmRyYS1taWdyYXRpb24taW1wb3J0LW9ubHkgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9leHBvcnRHcmFwaC5zaCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2V4cG9ydEdyYXBoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OGNiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9leHBvcnRHcmFwaC5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vYmFzaAorCitDVVJSRU5UX0RJUj1gcHdkYAorQkFTRURJUj0kKGRpcm5hbWUgJDApCisKK2lmIFsgJHtCQVNFRElSOjA6MX0gPSAiLyIgXQordGhlbgorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQkFTRURJUgorZWxzZQorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQ1VSUkVOVF9ESVIvJEJBU0VESVIKK2ZpCisKK3NvdXJjZSAke0ZVTExfUEFUSH0vYmFzZU9wZXJhdGlvbi5zaAorCittYWluQ2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLm1haW4uRXhwb3J0SW1wb3J0TWVudSIKKworY29tbWFuZD0iamF2YSAkSlZNX0xPR19GSUxFIC1jcCAkSkFSUyAkbWFpbkNsYXNzIGV4cG9ydCAkQCIKK2VjaG8gJGNvbW1hbmQKKworJGNvbW1hbmQKK3Jlc3VsdD0kPworCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqICRyZXN1bHQgKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2V4aXQgJHJlc3VsdAorCisKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2V4cG9ydEdyYXBoQXNHcmFwaE1sLnNoIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXhwb3J0R3JhcGhBc0dyYXBoTWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkNjYwYwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2V4cG9ydEdyYXBoQXNHcmFwaE1sLnNoCkBAIC0wLDAgKzEsMjkgQEAKKyMhL2Jpbi9iYXNoCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5FeHBvcnRJbXBvcnRNZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgZXhwb3J0LWFzLWdyYXBoLW1sICRAIgorZWNobyAkY29tbWFuZAorCiskY29tbWFuZAorcmVzdWx0PSQ/CisKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKiogJHJlc3VsdCAqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKworZXhpdCAkcmVzdWx0CisKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXhwb3J0VXNlcnMuc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9leHBvcnRVc2Vycy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzAxYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZXhwb3J0VXNlcnMuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL2Jhc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGV4cG9ydCBhbGwgdXNlcnMgZnJvbSB0aXRhbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5FeHBvcnRJbXBvcnRNZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgZXhwb3J0dXNlcnMgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9maXhfaWNvbnMuc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9maXhfaWNvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwZGVhNwotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ZpeF9pY29ucy5zaApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vYmFzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGF0YSBNaWdyYXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDVVJSRU5UX0RJUj1gcHdkYAorQkFTRURJUj0kKGRpcm5hbWUgJDApCisKK2lmIFsgJHtCQVNFRElSOjA6MX0gPSAiLyIgXQordGhlbgorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQkFTRURJUgorZWxzZQorICAgICAgICAgICAgICAgIEZVTExfUEFUSD0kQ1VSUkVOVF9ESVIvJEJBU0VESVIKK2ZpCisKK3NvdXJjZSAke0ZVTExfUEFUSH0vYmFzZU9wZXJhdGlvbi5zaAorCittYWluQ2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmFzZGN0b29sLm1haW4uTWlncmF0aW9uTWVudSIKKworY29tbWFuZD0iamF2YSAkSlZNX0xPR19GSUxFIC1jcCAkSkFSUyAkbWFpbkNsYXNzIGZpeC1pY29ucyAkQCIKK2VjaG8gJGNvbW1hbmQKKworJGNvbW1hbmQKK3Jlc3VsdD0kPworCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqICRyZXN1bHQgKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2V4aXQgJHJlc3VsdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ZpeF9pc3N1ZS5zaCBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ZpeF9pc3N1ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjYzZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZml4X2lzc3VlLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEYXRhIE1pZ3JhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgZml4LXByb3BlcnRpZXMgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9ncm91cHNBbGlnbm1lbnQuc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9ncm91cHNBbGlnbm1lbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyYjI0NgotLS0gL2Rldi9udWxsCisrKyBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2dyb3Vwc0FsaWdubWVudC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR3JvdXBzIEFsaWdubWVudAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgYWxpZ24tZ3JvdXBzICRAIgorZWNobyAkY29tbWFuZAorCiskY29tbWFuZAorcmVzdWx0PSQ/CisKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKiogJHJlc3VsdCAqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKworZXhpdCAkcmVzdWx0CisKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0R3JhcGguc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnRHcmFwaC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRkMmZkCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0R3JhcGguc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL2Jhc2gKKworQ1VSUkVOVF9ESVI9YHB3ZGAKK0JBU0VESVI9JChkaXJuYW1lICQwKQorCitpZiBbICR7QkFTRURJUjowOjF9ID0gIi8iIF0KK3RoZW4KKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JEJBU0VESVIKK2Vsc2UKKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JENVUlJFTlRfRElSLyRCQVNFRElSCitmaQorCitzb3VyY2UgJHtGVUxMX1BBVEh9L2Jhc2VPcGVyYXRpb24uc2gKKworbWFpbkNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5tYWluLkV4cG9ydEltcG9ydE1lbnUiCisKK2NvbW1hbmQ9ImphdmEgJEpWTV9MT0dfRklMRSAtY3AgJEpBUlMgJG1haW5DbGFzcyBpbXBvcnQgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9wb3B1bGF0ZUNvbXBvbmVudENhY2hlLnNoIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcG9wdWxhdGVDb21wb25lbnRDYWNoZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWRkYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcG9wdWxhdGVDb21wb25lbnRDYWNoZS5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR3JvdXBzIEFsaWdubWVudAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgcG9wdWxhdGUtY29tcG9uZW50LWNhY2hlICRAIgorZWNobyAkY29tbWFuZAorCiskY29tbWFuZAorcmVzdWx0PSQ/CisKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKiogJHJlc3VsdCAqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKworZXhpdCAkcmVzdWx0CisKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL2R1cGxpY2F0ZXMucHkgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9weXRob24vZHVwbGljYXRlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTYwYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL2R1cGxpY2F0ZXMucHkKQEAgLTAsMCArMSw0NyBAQAoraW1wb3J0IGpzb24KK2ltcG9ydCBzeXMKKworZGljdCA9IHt9IAorZHVwbGlhY3RlVWlkID0ge30gCisjZGVidWdGbGFnID0gVHJ1ZSAKK2RlYnVnRmxhZyA9IEZhbHNlIAorCitkZWYgZGVidWcoc3RyMSwgc3RyMj0iIik6CisgICAgJ3ByaW50IG9ubHkgaWYgZGVidWcgZW5hYmxlZCcKKyAgICBpZiAoZGVidWdGbGFnID09IFRydWUpOiBwcmludCBzdHIxLCBzdHIyCisKK3ByaW50ICdOdW1iZXIgb2YgYXJndW1lbnRzOicsIGxlbihzeXMuYXJndiksICdhcmd1bWVudHMuJworCisKK3dpdGggb3BlbihzeXMuYXJndlsxXSkgYXMganNvbl9maWxlOgorICAgIGpzb25fZGF0YSA9IGpzb24ubG9hZChqc29uX2ZpbGUpCisgICAgZm9yIHggaW4ganNvbl9kYXRhWyd2ZXJ0aWNlcyddOgorCXVpZCA9IE5vbmUKKwlub2RlTGFiZWw9eC5nZXQoJ25vZGVMYWJlbCcpCisJZGVidWcobm9kZUxhYmVsKQorCWlmICggbm9kZUxhYmVsID09ICd1c2VyJyApOgorCSAgICB1aWQgPSB4Wyd1c2VySWQnXQorIAllbGlmICggbm9kZUxhYmVsID09ICd0YWcnICk6CisJICAgIHVpZCA9IHhbJ25hbWUnXSAKKyAJZWxpZiAoIG5vZGVMYWJlbCA9PSBOb25lICk6CisgCSAgICBwYXNzCisgCWVsaWYgKCBub2RlTGFiZWwgPT0gJ2xvY2tOb2RlJyApOgorCSAgICB1aWQgPSB4LmdldCgndWlkJykKKwllbHNlOiB1aWQgPSB4Wyd1aWQnXQkJCisKKwlkZWJ1Zyhub2RlTGFiZWwsIHVpZCkKKworCWV4aXN0SWQgPSBkaWN0LmdldCh1aWQpCisJaWYgKGV4aXN0SWQgPT0gTm9uZSk6CisJICAgIGRpY3RbdWlkXSA9IHguZ2V0KCdfaWQnKQorCWVsc2U6CisgICAgICAgICAgICBkdXBsaWFjdGVVaWRbdWlkXSA9IGV4aXN0SWQgCSAgICAKKworICAgIHByaW50IGR1cGxpYWN0ZVVpZCAKKworIyAgICB3aXRoIG9wZW4oJ2RhdGEudHh0JywgJ3cnKSBhcyBvdXRmaWxlOgorIyAgICAgICAganNvbi5kdW1wKGpzb25fZGF0YSwgb3V0ZmlsZSkKKworCisgICAgCisjCXByaW50IHhbJ3VpZCddCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9weXRob24vZHVwbGljYXRlc0FuZFJlbW92ZS5weSBiL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3B5dGhvbi9kdXBsaWNhdGVzQW5kUmVtb3ZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmQzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9weXRob24vZHVwbGljYXRlc0FuZFJlbW92ZS5weQpAQCAtMCwwICsxLDEzNiBAQAoraW1wb3J0IGpzb24KK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKKworZGljdCA9IHt9IAorZHVwbGlhY3RlVWlkID0ge30gCisjZGVidWdGbGFnID0gVHJ1ZSAKK2RlYnVnRmxhZyA9IEZhbHNlIAorCitkZWYgam9pbl9zdHJpbmdzKGxzdCk6CisgICAgY29uY2F0ID0gIiIKKyAgICBmb3Igc3RyaW5nIGluIGxzdDoKKwlpZiAoc3RyaW5nICE9IE5vbmUpOgorCQlpZiAodHlwZShzdHJpbmcpID09IGludCk6CisJCQlzdHJpbmcgPSBzdHIoc3RyaW5nKQorICAgICAgICAJY29uY2F0ICs9IChzdHJpbmcgKyAiICIpCisgICAgcmV0dXJuIGNvbmNhdAorCitkZWYgZGVidWcoZGVzYywgKmFyZ3MpOgorCSdwcmludCBvbmx5IGlmIGRlYnVnIGVuYWJsZWQnCisJaWYgKGRlYnVnRmxhZyA9PSBUcnVlKTogCisJCXByaW50IGRlc2MsIGpvaW5fc3RyaW5ncyhhcmdzKSAgCisKK2RlZiBsb2coZGVzYywgYXJnKToKKwkncHJpbnQgbG9nIGluZm8nCisJcHJpbnQgZGVzYywgYXJnICAKKworZGVmIGdldFVpZCh2ZXJ0ZXgpOgorCXVpZCA9IE5vbmUKKwlub2RlTGFiZWw9dmVydGV4LmdldCgnbm9kZUxhYmVsJykKKwlkZWJ1Zyhub2RlTGFiZWwpCisJaWYgKCBub2RlTGFiZWwgPT0gJ3VzZXInICk6CisJCXVpZCA9IHZlcnRleFsndXNlcklkJ10KKwllbGlmICggbm9kZUxhYmVsID09ICd0YWcnICk6CisJCXVpZCA9IHZlcnRleFsnbmFtZSddCisJZWxpZiAoIG5vZGVMYWJlbCA9PSBOb25lICk6CisJCXBhc3MKKwllbGlmICggbm9kZUxhYmVsID09ICdsb2NrTm9kZScgKToKKwkJdWlkID0gdmVydGV4LmdldCgndWlkJykKKwllbHNlOiB1aWQgPSB2ZXJ0ZXhbJ3VpZCddCisKKwlkZWJ1Zyhub2RlTGFiZWwsIHVpZCkKKworCXJldHVybiB1aWQJICAgCisKK2RlZiBnZW5lcmF0ZUZpbGUoaW5wdXRGaWxlLCBvdXRwdXRGaWxlKToKKwkKKwl3aXRoIG9wZW4oaW5wdXRGaWxlKSBhcyBqc29uX2ZpbGU6CisJCWR1cGxpYWN0ZVVpZCA9IHt9CisJCWpzb25fZGF0YSA9IGpzb24ubG9hZChqc29uX2ZpbGUpCisJCWZvciB4IGluIGpzb25fZGF0YVsndmVydGljZXMnXToKKwkJCXVpZCA9IGdldFVpZCh4KQorCisJCQlleGlzdElkID0gZGljdC5nZXQodWlkKQorCQkJaWYgKGV4aXN0SWQgPT0gTm9uZSk6CisJCQkJZGljdFt1aWRdID0geC5nZXQoJ19pZCcpCisJCQllbHNlOgorCQkJCWR1cGxpYWN0ZVVpZFt1aWRdID0gZXhpc3RJZCAJICAgIAorCisJCWxvZygiZHVwbGljYXRlIGlkcyIsIGR1cGxpYWN0ZVVpZCkKKworCQlqc29uX2RhdGFfdmVydGljZXMgPSBqc29uX2RhdGFbJ3ZlcnRpY2VzJ10KKwkJbG9nKCJudW1iZXIgb2YgdmVydGljZXMgaXMiLCBsZW4oanNvbl9kYXRhX3ZlcnRpY2VzKSkKKworCQlpZHMgPSB7fSAKKwkJZGVsZXRlSW5kZXhlcyA9IFtdCisJCSAKKwkJZm9yIGkgaW4geHJhbmdlKGxlbihqc29uX2RhdGFfdmVydGljZXMpKToKKwkJI3ByaW50ICIqKioqKiogIiwgaSwgIiAqKioqKioqKioqKioqIgorCQkjcHJpbnQganNvbl9kYXRhX3ZlcnRpY2VzW2ldCisJCQlpZCA9IGpzb25fZGF0YV92ZXJ0aWNlc1tpXVsiX2lkIl0KKwkJCXVpZCA9IGdldFVpZChqc29uX2RhdGFfdmVydGljZXNbaV0pCisJCQlpc0R1cGxpY2F0ZUlkID0gZHVwbGlhY3RlVWlkLmdldCh1aWQpCisJCQlpZiAoaXNEdXBsaWNhdGVJZCAhPSBOb25lKToKKwkJCQlkZWJ1ZygidWlkIHRvIGlkIHBhaXIiLCB1aWQgaWYgdWlkICE9IE5vbmUgZWxzZSAnTm9uZScsIGlkKQorCQkJCXZhbHVlID0gaWRzLmdldCh1aWQpCisJCQkJaWYgKHZhbHVlID09IE5vbmUpOgorCQkJCQlsaXN0ID0gW2lkLF0JCisJCQkJCWlkc1t1aWRdID0gbGlzdCAKKwkJCQllbHNlOgorCQkJCQl2YWx1ZS5hcHBlbmQoaWQpCQorCQkJCQlkZWxldGVJbmRleGVzLmFwcGVuZChpZCkJCisKKwkJbG9nKCJpZHMiLCBpZHMpCisJCWxvZygiZGVsZXRlSW5kZXhlcyIsIGRlbGV0ZUluZGV4ZXMpCisJCWxvZygiZGVsZXRlSW5kZXhlcyBzaXplIiwgbGVuKGRlbGV0ZUluZGV4ZXMpKQorCisJCWZpbHRlcl92ZXJ0ZXggPSBbIHggZm9yIHggaW4ganNvbl9kYXRhX3ZlcnRpY2VzIGlmIHguZ2V0KCdfaWQnKSBub3QgaW4gZGVsZXRlSW5kZXhlcyBdCisJCWpzb25fZGF0YVsndmVydGljZXMnXSA9IGZpbHRlcl92ZXJ0ZXgJCisKKwkJbG9nKCJudW1iZXIgb2YgdmVydGV4ZXMgYWZ0ZXIgZmlsdGVyIiwgbGVuKGZpbHRlcl92ZXJ0ZXgpKQorCisJCWpzb25fZGF0YV9lZGdlcyA9IGpzb25fZGF0YVsnZWRnZXMnXQorCisJCWxvZygibnVtYmVyIG9mIGVkZ2VzIiwgbGVuKGpzb25fZGF0YV9lZGdlcykpCisJCQorCQlmaWx0ZXJfZWRnZSA9IFsgeCBmb3IgeCBpbiBqc29uX2RhdGFfZWRnZXMgaWYgeFsnX291dFYnXSBub3QgaW4gKGRlbGV0ZUluZGV4ZXMpIGFuZCB4WydfaW5WJ10gbm90IGluIChkZWxldGVJbmRleGVzKSBdCisgICAgICAgICAgICAgICAganNvbl9kYXRhWydlZGdlcyddID0gZmlsdGVyX2VkZ2UKKworCQlsb2coIm51bWJlciBvZiBlZGdlcyBhZnRlciBmaWx0ZXIiLCBsZW4oanNvbl9kYXRhWydlZGdlcyddKSkKKworCQlqc29uX2RhdGEgPSBPcmRlcmVkRGljdChzb3J0ZWQoanNvbl9kYXRhLml0ZW1zKCksIGtleT1sYW1iZGEgdDogdFswXSwgcmV2ZXJzZT1UcnVlKSkJCisJCisJCXdpdGggb3BlbihvdXRwdXRGaWxlLCAndycpIGFzIG91dGZpbGU6CisJCQkjanNvbi5kdW1wKGpzb25fZGF0YSwgb3V0ZmlsZSkKKwkJCWpzb24uZHVtcChqc29uX2RhdGEsIG91dGZpbGUpCisJCWxvZygib3V0cHV0IGZpbGUgaXMiLCBvdXRwdXRGaWxlKTsKKworZGVmIG1haW4oYXJndik6CisgICAgICAgIHByaW50ICdOdW1iZXIgb2YgYXJndW1lbnRzOicsIGxlbihzeXMuYXJndiksICdhcmd1bWVudHMuJworICAgICAgICBpbnB1dGZpbGUgPSBOb25lIAorICAgICAgICBvdXRwdXRmaWxlID0gJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImg6aTpvOiIsWyJpZmlsZT0iLCJvZmlsZT0iXSkKKyAgICAgICAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCBzeXMuYXJndlswXSwgJy1pIDxpbnB1dGZpbGU+JworICAgICAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgorICAgICAgICAgICAgICAgIGlmIG9wdCA9PSAnLWgnOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3lzLmFyZ3ZbMF0sICctaSA8aW5wdXRmaWxlPicKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5leGl0KDMpCisgICAgICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItaSIsICItLWlmaWxlIik6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dGZpbGUgPSBhcmcKKworICAgICAgICBpZiAoIGlucHV0ZmlsZSA9PSBOb25lICk6CisgICAgICAgICAgICAgICAgcHJpbnQgc3lzLmFyZ3ZbMF0gLCctaSA8aW5wdXRmaWxlPicKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgzKQorCisgICAgICAgIHByaW50ICdJbnB1dCBmaWxlIGlzICInLCBpbnB1dGZpbGUKKyAgICAgICAgZ2VuZXJhdGVGaWxlKGlucHV0ZmlsZSwgaW5wdXRmaWxlICsgJy5ub2R1cGxpY2F0ZXMnKQorCQkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgbWFpbihzeXMuYXJndlsxOl0pCisgICAgCisjCXByaW50IHhbJ3VpZCddCmRpZmYgLS1naXQgYS9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9weXRob24vZ3JhcGhTaXplLnB5IGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL2dyYXBoU2l6ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM2ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL2dyYXBoU2l6ZS5weQpAQCAtMCwwICsxLDU2IEBACitpbXBvcnQganNvbgoraW1wb3J0IHN5cywgZ2V0b3B0CisKK2RpY3QgPSB7fSAKK2R1cGxpYWN0ZVVpZCA9IHt9IAorI2RlYnVnRmxhZyA9IFRydWUgCitkZWJ1Z0ZsYWcgPSBGYWxzZSAKKworZGVmIGRlYnVnKGRlc2MsICphcmdzKToKKwkncHJpbnQgb25seSBpZiBkZWJ1ZyBlbmFibGVkJworCWlmIChkZWJ1Z0ZsYWcgPT0gVHJ1ZSk6IAorCQlwcmludCBkZXNjLCBqb2luX3N0cmluZ3MoYXJncykgIAorCitkZWYgbG9nKGRlc2MsIGFyZyk6CisJJ3ByaW50IGxvZyBpbmZvJworCXByaW50IGRlc2MsIGFyZyAgCisKK2RlZiBncmFwaFNpemUoaW5wdXRGaWxlKToKKwkKKwl3aXRoIG9wZW4oaW5wdXRGaWxlKSBhcyBqc29uX2ZpbGU6CisJCWpzb25fZGF0YSA9IGpzb24ubG9hZChqc29uX2ZpbGUpCisKKwkJanNvbl9kYXRhX3ZlcnRpY2VzID0ganNvbl9kYXRhWyd2ZXJ0aWNlcyddCisJCWxvZygibnVtYmVyIG9mIHZlcnRpY2VzIGlzIiwgbGVuKGpzb25fZGF0YV92ZXJ0aWNlcykpCisKKwkJanNvbl9kYXRhX2VkZ2VzID0ganNvbl9kYXRhWydlZGdlcyddCisJCWxvZygibnVtYmVyIG9mIGVkZ2VzIGlzIiwgbGVuKGpzb25fZGF0YV9lZGdlcykpCisKK2RlZiBtYWluKGFyZ3YpOgorICAgICAgICBwcmludCAnTnVtYmVyIG9mIGFyZ3VtZW50czonLCBsZW4oc3lzLmFyZ3YpLCAnYXJndW1lbnRzLicKKyAgICAgICAgaW5wdXRmaWxlID0gTm9uZSAKKyAgICAgICAgb3V0cHV0ZmlsZSA9ICcnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmd2LCJoOmk6bzoiLFsiaWZpbGU9Iiwib2ZpbGU9Il0pCisgICAgICAgIGV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgc3lzLmFyZ3ZbMF0sICctaSA8aW5wdXRmaWxlPicKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgyKQorICAgICAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKKyAgICAgICAgICAgICAgICBpZiBvcHQgPT0gJy1oJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHN5cy5hcmd2WzBdLCAnLWkgPGlucHV0ZmlsZT4nCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgzKQorICAgICAgICAgICAgICAgIGVsaWYgb3B0IGluICgiLWkiLCAiLS1pZmlsZSIpOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRmaWxlID0gYXJnCisKKyAgICAgICAgaWYgKCBpbnB1dGZpbGUgPT0gTm9uZSApOgorICAgICAgICAgICAgICAgIHByaW50IHN5cy5hcmd2WzBdLCAnLWkgPGlucHV0ZmlsZT4nCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMykKKworICAgICAgICBwcmludCAnSW5wdXQgZmlsZSBpcyAnLCBpbnB1dGZpbGUKKyAgICAgICAgZ3JhcGhTaXplKGlucHV0ZmlsZSkKKwkJCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorICAgIAorIwlwcmludCB4Wyd1aWQnXQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL3VzZXIvZXhwb3J0VXNlcnMucHkgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9weXRob24vdXNlci9leHBvcnRVc2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzJhM2IwCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL3VzZXIvZXhwb3J0VXNlcnMucHkKQEAgLTAsMCArMSwxMjIgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyBFeHBvcnQgYWxsIGFjdGl2ZSB1c2VycyB0byBmaWxlIC0gZm9yIDE2MDIrCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgICAgIworIyAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQorIyBhY3RpdmF0aW9uIDoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgICAgICAgcHl0aG9uIGV4cG9ydFVzZXJzLnB5IFstaSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLWYgPG91dHB1dCBmaWxlPiB8IC0tb2ZpbGU9PG91dHB1dCBmaWxlPiBdICAgIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIAkgICAjCQkJCisjIHNob3J0ZXN0IGFjdGl2YXRpb24gKGJlIGhvc3QgPSBsb2NhbGhvc3QsIGJlIHBvcnQgPSA4MDgwKTogCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCisjCQlweXRob24gZXhwb3J0VXNlcnMucHkgWy1mIDxvdXRwdXQgZmlsZT4gfCAtLW9maWxlPTxvdXRwdXQgZmlsZT4gXQkJCQkJCQkJCQkJCSAJCQkJICAgICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQUxMX1VTRVJTX1NVRkZJWCA9ICcvc2RjMi9yZXN0L3YxL3VzZXIvdXNlcnMnCisKK2RlZiBlcnJvckFuZEV4aXQoZXJyb3JDb2RlLCBlcnJvckRlc2MpOgorICAgICAgICBpZiAoIGVycm9yQ29kZSA+IDAgKToKKyAgICAgICAgICAgICAgICBwcmludCgic3RhdHVzPSIgKyBzdHIoZXJyb3JDb2RlKSArICIuICIgKyBlcnJvckRlc2MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoInN0YXR1cz0iICsgc3RyKGVycm9yQ29kZSkpCisgICAgICAgIHN5cy5leGl0KGVycm9yQ29kZSkKKworZGVmIGdldFVzZXJzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIpOgorCisJdHJ5OgorCQlidWZmZXIgPSBTdHJpbmdJTygpCisJCWMgPSBweWN1cmwuQ3VybCgpCisKKwkJdXJsID0gJ2h0dHA6Ly8nICsgYmVIb3N0ICsgJzonICsgYmVQb3J0ICsgQUxMX1VTRVJTX1NVRkZJWCAKKwkJcHJpbnQodXJsKQorCQljLnNldG9wdChjLlVSTCwgdXJsKQorCQljLnNldG9wdChjLldSSVRFRlVOQ1RJT04sIGJ1ZmZlci53cml0ZSkKKwkJI2Muc2V0b3B0KGMuV1JJVEVGVU5DVElPTiwgbGFtYmRhIHg6IE5vbmUpCisJCWFkbWluSGVhZGVyID0gJ1VTRVJfSUQ6ICcgKyBhZG1pblVzZXIKKwkJYy5zZXRvcHQocHljdXJsLkhUVFBIRUFERVIsIFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJywgJ0FjY2VwdDogYXBwbGljYXRpb24vanNvbicsIGFkbWluSGVhZGVyXSkKKwkJcmVzID0gYy5wZXJmb3JtKCkKKwkJI3ByaW50KHJlcykKKworCQkjcHJpbnQoJ1N0YXR1czogJWQnICUgYy5nZXRpbmZvKGMuUkVTUE9OU0VfQ09ERSkpCisKKwkJYy5jbG9zZSgpCisKKwkJYm9keSA9IGJ1ZmZlci5nZXR2YWx1ZSgpCisKKyAgICAgICAgI3ByaW50KGJvZHkpCisKKwkJcmV0dXJuIChib2R5LCBOb25lKQorCisJZXhjZXB0IEV4Y2VwdGlvbiBhcyBpbnN0OgorCQlwcmludCBpbnN0CisgICAgICAgICNwcmludCB0eXBlKGluc3QpICAgICAjIHRoZSBleGNlcHRpb24gaW5zdGFuY2UKKyAgICAgICAgI3ByaW50IGluc3QuYXJncyAgICAgICMgYXJndW1lbnRzIHN0b3JlZCBpbiAuYXJncworICAgICAgICAjcHJpbnQgaW5zdCAgICAgICAgICAgIyBfX3N0cl9fIGFsbG93cyBhcmdzIHRvIGJlIHByaW50ZWQgZGlyZWN0bHkKKyAgICAgICAgI3gsIHkgPSBpbnN0LmFyZ3MKKyAgICAgICAgI3ByaW50ICd4ID0nLCB4CisJCQorCQlyZXR1cm4gKE5vbmUsIGluc3QpCisKKworZGVmIHVzYWdlKCk6CisJcHJpbnQgc3lzLmFyZ3ZbMF0sICdbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxvdXRwdXQgZmlsZT4gfCAtLW9maWxlPTxvdXRwdXQgZmlsZT4gXScKKworZGVmIG1haW4oYXJndik6CisJcHJpbnQgJ051bWJlciBvZiBhcmd1bWVudHM6JywgbGVuKHN5cy5hcmd2KSwgJ2FyZ3VtZW50cy4nCisKKwlhZG1pbkhlYWRlciA9ICdqaDAwMDMnCisJYmVIb3N0ID0gJ2xvY2FsaG9zdCcKKwliZVBvcnQgPSAnODA4MCcKKwlvdXRwdXRmaWxlID0gTm9uZSAKKworCXRyeToKKwkJb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJndiwiaTpwOmY6aDoiLFsiaXA9IiwicG9ydD0iLCJvZmlsZT0iXSkKKwlleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorCQl1c2FnZSgpCisJCWVycm9yQW5kRXhpdCgyLCAnSW52YWxpZCBpbnB1dCcpCisgICAgICAgIAorCWZvciBvcHQsIGFyZyBpbiBvcHRzOgorICAgICAgICAjcHJpbnQgb3B0LCBhcmcKKwkJaWYgb3B0ID09ICctaCc6CisJCQl1c2FnZSgpCisJCQlzeXMuZXhpdCgzKQorCQllbGlmIG9wdCBpbiAoIi1pIiwgIi0taXAiKToKKwkJCWJlSG9zdCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1wIiwgIi0tcG9ydCIpOgorCQkJYmVQb3J0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLWYiLCAiLS1vZmlsZSIpOgorCQkJb3V0cHV0ZmlsZSA9IGFyZworCisJcHJpbnQgJ2JlIGhvc3QgPScsYmVIb3N0LCcsIGJlIHBvcnQgPScsIGJlUG9ydCwnLCBvdXRwdXQgZmlsZSA9JyxvdXRwdXRmaWxlCisKKwlpZiAoIG91dHB1dGZpbGUgPT0gTm9uZSApOgorCQl1c2FnZSgpCisJCXN5cy5leGl0KDMpCisKKwl1c2VycyA9IGdldFVzZXJzKGJlSG9zdCwgYmVQb3J0LCBhZG1pbkhlYWRlcikKKwllcnJvciA9IHVzZXJzWzFdCisJYm9keSA9IHVzZXJzWzBdCisKKwlpZiAoIGVycm9yICE9IE5vbmUgKToKKwkJZXJyb3JBbmRFeGl0KDUsIHN0cihlcnJvcikpCisKKwkjcHJpbnQgYm9keQorCisJaW8gPSBTdHJpbmdJTyhib2R5KQorCXVzZXJzQXNKc29uID0ganNvbi5sb2FkKGlvKQorCisJd3JpdGVGaWxlID0gb3BlbihvdXRwdXRmaWxlLCAndycpCisKKwlqc29uLmR1bXAodXNlcnNBc0pzb24sIHdyaXRlRmlsZSkKKworCXdyaXRlRmlsZS5jbG9zZSgpCisKKwlwcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCisJZXJyb3JBbmRFeGl0KDAsIE5vbmUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL3VzZXIvaW1wb3J0VXNlcnMucHkgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9weXRob24vdXNlci9pbXBvcnRVc2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjljYmJlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcHl0aG9uL3VzZXIvaW1wb3J0VXNlcnMucHkKQEAgLTAsMCArMSwyMTUgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIEltcG9ydCBhbGwgdXNlcnMgZnJvbSBhIGdpdmVuIGZpbGUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQkKKyMgYWN0aXZhdGlvbiA6CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCisjICAgICAgIHB5dGhvbiBpbXBvcnRVc2Vycy5weSBbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0gICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAJICAgIwkJCQorIyBzaG9ydGVzdCBhY3RpdmF0aW9uIChiZSBob3N0ID0gbG9jYWxob3N0LCBiZSBwb3J0ID0gODA4MCk6IAkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkJCQkJCQkJCQkJCQkJCQkgICAgICAgIworIwkJcHl0aG9uIGltcG9ydFVzZXJzLnB5IFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdCQkJCQkJCQkJCQkJIAkJCQkgICAgICAgICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitkZWYgaW1wb3J0VXNlcnMoYmVIb3N0LCBiZVBvcnQsIHVzZXJzLCBhZG1pblVzZXIpOgorCQorCXJlc3VsdCA9IFtdCQorCisJZm9yIHVzZXIgaW4gdXNlcnM6CisJCQkKKwkJI3ByaW50KCJHb2luZyB0byBhZGQgdXNlciAiICsgdXNlclsndXNlcklkJ10pCisJCisJCWdldFJlcyA9IGdldFVzZXIoYmVIb3N0LCBiZVBvcnQsIHVzZXIpCQorCQl1c2VySWQgPSBnZXRSZXNbMF0KKwkJZXJyb3IgPSBnZXRSZXNbMV0KKwkJI3ByaW50IGVycm9yCisJCWlmICggZXJyb3IgIT0gTm9uZSBhbmQgZXJyb3IgPT0gNDA0ICk6CisJCQlyZXMgPSBjcmVhdGVVc2VyKGJlSG9zdCwgYmVQb3J0LCB1c2VyICxhZG1pblVzZXIpCQkJCisJCQlyZXN1bHQuYXBwZW5kKHJlcykJCQkKKwkJZWxzZToKKwkJCWlmICggZXJyb3IgPT0gMjAwICk6CisJCQkJY3VyUmVzdWx0ID0gKHVzZXJJZCwgNDA5KQorCQkJCXJlc3VsdC5hcHBlbmQoY3VyUmVzdWx0KQkKKwkJCWVsc2U6CisJCQkJcmVzdWx0LmFwcGVuZChnZXRSZXMpCisKKwlyZXR1cm4gcmVzdWx0CQkJCQorCisKK2RlZiBjb252ZXJ0VXNlcnNUb0NyZWF0aW9uT2JqZWN0KHVzZXJzKToKKworCWNsb25lVXNlcnMgID0gY29weS5kZWVwY29weSh1c2VycykKKwlmb3IgdXNlciBpbiBjbG9uZVVzZXJzOgorCQkjcHJpbnQgdXNlcgkKKwkJaWYgKHVzZXIuZ2V0KCdmdWxsTmFtZScpICE9IE5vbmUpOgorCQkJZGVsIHVzZXJbJ2Z1bGxOYW1lJ10KKwkJI3VzZXJbJ3VzZXJJZCddID0gdXNlclsndXNlcklkJ10gKyAnMScKKwkJI3ByaW50IHVzZXIKKworCXJldHVybiBjbG9uZVVzZXJzCisKK2RlZiBnZXRVc2VyKGJlSG9zdCwgYmVQb3J0LCB1c2VyKToKKworCXVzZXJJZCA9IHVzZXJbJ3VzZXJJZCddCisJdHJ5OgorCQlidWZmZXIgPSBTdHJpbmdJTygpCisJCWMgPSBweWN1cmwuQ3VybCgpCisKKwkJI3ByaW50IHR5cGUodXNlcklkKQorCQl1cmwgPSAnaHR0cDovLycgKyBiZUhvc3QgKyAnOicgKyBiZVBvcnQgKyAnL3NkYzIvcmVzdC92MS91c2VyLycgKyBzdHIodXNlcklkKQorCQljLnNldG9wdChjLlVSTCwgdXJsKQorCisJCSNhZG1pbkhlYWRlciA9ICdVU0VSX0lEOiAnICsgYWRtaW5Vc2VyCisJCWMuc2V0b3B0KHB5Y3VybC5IVFRQSEVBREVSLCBbJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nXSkKKwkJYy5zZXRvcHQoYy5XUklURUZVTkNUSU9OLCBsYW1iZGEgeDogTm9uZSkKKwkJcmVzID0gYy5wZXJmb3JtKCkKKwkJCQkJCisJCSNwcmludCgiQmVmb3JlIGdldCByZXNwb25zZSBjb2RlIikJCisJCWh0dHBSZXMgPSBjLmdldGluZm8oYy5SRVNQT05TRV9DT0RFKQorCQkjcHJpbnQoIkFmdGVyIGdldCByZXNwb25zZSBjb2RlIikJCisJCXJlc3BvbnNlQ29kZSA9IGMuZ2V0aW5mbyhjLlJFU1BPTlNFX0NPREUpCisJCQorCQkjcHJpbnQoJ1N0YXR1czogJyArIHN0cihyZXNwb25zZUNvZGUpKQorCisJCWMuY2xvc2UoKQorCisJCXJldHVybiAodXNlcklkLCBodHRwUmVzKQorCisJZXhjZXB0IEV4Y2VwdGlvbiBhcyBpbnN0OgorCQlwcmludChpbnN0KQorCQlyZXR1cm4gKHVzZXJJZCwgTm9uZSkJCQkJCisKKwkJCisKK2RlZiBjcmVhdGVVc2VyKGJlSG9zdCwgYmVQb3J0LCB1c2VyLCBhZG1pblVzZXIpOgorCisJdXNlcklkID0gdXNlclsndXNlcklkJ10KKwl0cnk6CisJCWJ1ZmZlciA9IFN0cmluZ0lPKCkKKwkJYyA9IHB5Y3VybC5DdXJsKCkKKworCQl1cmwgPSAnaHR0cDovLycgKyBiZUhvc3QgKyAnOicgKyBiZVBvcnQgKyAnL3NkYzIvcmVzdC92MS91c2VyJworCQljLnNldG9wdChjLlVSTCwgdXJsKQorCQljLnNldG9wdChjLlBPU1QsIDEpCQkKKworCQlhZG1pbkhlYWRlciA9ICdVU0VSX0lEOiAnICsgYWRtaW5Vc2VyCisJCWMuc2V0b3B0KHB5Y3VybC5IVFRQSEVBREVSLCBbJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nLCBhZG1pbkhlYWRlcl0pCisKKwkJZGF0YSA9IGpzb24uZHVtcHModXNlcikKKwkJYy5zZXRvcHQoYy5QT1NURklFTERTLCBkYXRhKQkKKworCQljLnNldG9wdChjLldSSVRFRlVOQ1RJT04sIGxhbWJkYSB4OiBOb25lKQorCQkjcHJpbnQoImJlZm9yZSBwZXJmb3JtIikJCisJCXJlcyA9IGMucGVyZm9ybSgpCisgICAgICAgICNwcmludChyZXMpCisJCisJCSNwcmludCgiQmVmb3JlIGdldCByZXNwb25zZSBjb2RlIikJCisJCWh0dHBSZXMgPSBjLmdldGluZm8oYy5SRVNQT05TRV9DT0RFKQorCQkjcHJpbnQoIkFmdGVyIGdldCByZXNwb25zZSBjb2RlIikJCisJCXJlc3BvbnNlQ29kZSA9IGMuZ2V0aW5mbyhjLlJFU1BPTlNFX0NPREUpCisJCQorCQkjcHJpbnQoJ1N0YXR1czogJyArIHN0cihyZXNwb25zZUNvZGUpKQorCisJCWMuY2xvc2UoKQorCisJCXJldHVybiAodXNlcklkLCBodHRwUmVzKQorCisJZXhjZXB0IEV4Y2VwdGlvbiBhcyBpbnN0OgorCQlwcmludChpbnN0KQorCQlyZXR1cm4gKHVzZXJJZCwgTm9uZSkJCQkJCisKKworZGVmIGVycm9yQW5kRXhpdChlcnJvckNvZGUsIGVycm9yRGVzYyk6CisJaWYgKCBlcnJvckNvZGUgPiAwICk6CisJCXByaW50KCJzdGF0dXM9IiArIHN0cihlcnJvckNvZGUpICsgIi4gIiArIGVycm9yRGVzYykgCisJZWxzZToKKwkJcHJpbnQoInN0YXR1cz0iICsgc3RyKGVycm9yQ29kZSkpCisJc3lzLmV4aXQoZXJyb3JDb2RlKQorCQorZGVmIHVzYWdlKCk6CisJcHJpbnQgc3lzLmFyZ3ZbMF0sICdbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0nCisKK2RlZiBtYWluKGFyZ3YpOgorCXByaW50ICdOdW1iZXIgb2YgYXJndW1lbnRzOicsIGxlbihzeXMuYXJndiksICdhcmd1bWVudHMuJworCisJYmVIb3N0ID0gJ2xvY2FsaG9zdCcgCisJYmVQb3J0ID0gJzgwODAnCisJaW5wdXRmaWxlID0gTm9uZSAKKworCWFkbWluVXNlciA9ICdqaDAwMDMnCisKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDpmOmg6IixbImlwPSIsInBvcnQ9IiwiaWZpbGU9Il0pCisJZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKwkJdXNhZ2UoKQorCQllcnJvckFuZEV4aXQoMiwgJ0ludmFsaWQgaW5wdXQnKQorCQkgCisJZm9yIG9wdCwgYXJnIGluIG9wdHM6CisJI3ByaW50IG9wdCwgYXJnCisJCWlmIG9wdCA9PSAnLWgnOgorCQkJdXNhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc3lzLmV4aXQoMykKKwkJZWxpZiBvcHQgaW4gKCItaSIsICItLWlwIik6CisJCQliZUhvc3QgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItcCIsICItLXBvcnQiKToKKwkJCWJlUG9ydCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1mIiwgIi0taWZpbGUiKToKKwkJCWlucHV0ZmlsZSA9IGFyZworCisJcHJpbnQgJ2JlIGhvc3QgPScsYmVIb3N0LCcsIGJlIHBvcnQgPScsIGJlUG9ydCwnLCB1c2VycyBmaWxlID0nLGlucHV0ZmlsZQorCQorCWlmICggaW5wdXRmaWxlID09IE5vbmUgKToKKwkJdXNhZ2UoKQorCQlzeXMuZXhpdCgzKQorCisJcHJpbnQgJ0lucHV0IGZpbGUgaXMgJywgaW5wdXRmaWxlCisKKwl1c2Vyc0ZpbGUgPSBvcGVuKGlucHV0ZmlsZSkKKworCWpzb25fZGF0YSA9IGpzb24ubG9hZCh1c2Vyc0ZpbGUpCisKKwkjcHJpbnQganNvbl9kYXRhCisKKwljbG9uZVVzZXJzID0gY29udmVydFVzZXJzVG9DcmVhdGlvbk9iamVjdChqc29uX2RhdGEpCisKKwlhY3RpdmVVc2VycyA9IGZpbHRlcihsYW1iZGEgeDogeFsnc3RhdHVzJ10gPT0gJ0FDVElWRScsIGNsb25lVXNlcnMpCisKKwkjcHJpbnQgYWN0aXZlVXNlcnMKKworCXJlc3VsdFRhYmxlID0gaW1wb3J0VXNlcnMoYmVIb3N0LCBiZVBvcnQsIGFjdGl2ZVVzZXJzLCBhZG1pblVzZXIpCisKKwlnID0gbGFtYmRhIHg6IHhbMV0gIT0gMjAxIGFuZCB4WzFdICE9IDQwOQorCisJcmVzdWx0ID0gZmlsdGVyKGcsIHJlc3VsdFRhYmxlKQorCisJaWYgKCBsZW4ocmVzdWx0KSA+IDAgKToKKwkJI3ByaW50KCJFUlJPUjogRmFpbGVkIHRvIGxvYWQgdGhlIHVzZXJzICIgKyAnLCAnLmpvaW4obWFwKGxhbWJkYSB4OiB4WzBdLHJlc3VsdCkpKQorCQllcnJvckFuZEV4aXQoMywgIkZhaWxlZCB0byBsb2FkIHRoZSB1c2VycyAiICsgJywgJy5qb2luKG1hcChsYW1iZGEgeDogeFswXSxyZXN1bHQpKSkJCisKKwlnID0gbGFtYmRhIHg6IHhbMV0gPT0gNDA5CisJcmVzdWx0ID0gZmlsdGVyKGcsIHJlc3VsdFRhYmxlKQorCisJcHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQorCXByaW50KCJFeGlzdGluZyB1c2VyczogIiArICcsICcuam9pbihtYXAobGFtYmRhIHg6IHhbMF0scmVzdWx0KSkpCisKKwlyZXN1bHQgPSBmaWx0ZXIobGFtYmRhIHg6IHhbMV0gPT0gMjAxLCByZXN1bHRUYWJsZSkKKwlpZiAoIGxlbihyZXN1bHQpID09IDAgKToKKwkJcHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQorCQlwcmludCgiTm8gTkVXIHVzZXIgd2FzIGxvYWRlZC4gQWxsIHVzZXJzIGFyZSBhbHJlYWR5IGV4aXN0IikKKwkJcHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQorCWVsc2U6CisJCXByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKKwkJcHJpbnQoIkxvYWRlZCB1c2VyczogIiArICcsICcuam9pbihtYXAobGFtYmRhIHg6IHhbMF0scmVzdWx0KSkpCisJCXByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKKworCWVycm9yQW5kRXhpdCgwLCBOb25lKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvc2NoZW1hQ3JlYXRpb24uc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9zY2hlbWFDcmVhdGlvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdkYjVlCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvc2NoZW1hQ3JlYXRpb24uc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL2Jhc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERhdGEgTWlncmF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQ1VSUkVOVF9ESVI9YHB3ZGAKK0JBU0VESVI9JChkaXJuYW1lICQwKQorCitpZiBbICR7QkFTRURJUjowOjF9ID0gIi8iIF0KK3RoZW4KKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JEJBU0VESVIKK2Vsc2UKKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JENVUlJFTlRfRElSLyRCQVNFRElSCitmaQorCitzb3VyY2UgJHtGVUxMX1BBVEh9L2Jhc2VPcGVyYXRpb24uc2gKKworbWFpbkNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5tYWluLkRhdGFTY2hlbWFNZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgY3JlYXRlLWNhc3NhbmRyYS1zdHJ1Y3R1cmVzICRAIgorZWNobyAkY29tbWFuZAorCiskY29tbWFuZAorcmVzdWx0PSQ/CisKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKiogJHJlc3VsdCAqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKKworZXhpdCAkcmVzdWx0CisKKwpkaWZmIC0tZ2l0IGEvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvdXBkYXRlSXNWbmYuc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy91cGRhdGVJc1ZuZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJmYjljCi0tLSAvZGV2L251bGwKKysrIGIvYXNkY3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvdXBkYXRlSXNWbmYuc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL2Jhc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICAgRXhhbXBsZToKKyMgICAgIC4vdXBkYXRlSXNWbmYuc2ggLi4vY29uZmlnL3RpdGFuLnByb3BlcnRpZXMgQnNlcnZpY2UsTXlzZXJ2aWNlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQ1VSUkVOVF9ESVI9YHB3ZGAKK0JBU0VESVI9JChkaXJuYW1lICQwKQorCitpZiBbICR7QkFTRURJUjowOjF9ID0gIi8iIF0KK3RoZW4KKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JEJBU0VESVIKK2Vsc2UKKyAgICAgICAgICAgICAgICBGVUxMX1BBVEg9JENVUlJFTlRfRElSLyRCQVNFRElSCitmaQorCitzb3VyY2UgJHtGVUxMX1BBVEh9L2Jhc2VPcGVyYXRpb24uc2gKKworbWFpbkNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5hc2RjdG9vbC5tYWluLlVwZGF0ZUlzVm5mTWVudSIKKworY29tbWFuZD0iamF2YSAkSlZNX0xPR19GSUxFIC1jcCAkSkFSUyAkbWFpbkNsYXNzIHVwZGF0ZUlzVm5mVHJ1ZSAkQCIKK2VjaG8gJGNvbW1hbmQKKworJGNvbW1hbmQKK3Jlc3VsdD0kPworCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqICRyZXN1bHQgKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2V4aXQgJHJlc3VsdAorCisKZGlmZiAtLWdpdCBhL2FzZGN0b29sL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3ZmY05hbWVBbGlnbm1lbnQuc2ggYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy92ZmNOYW1lQWxpZ25tZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmJiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy92ZmNOYW1lQWxpZ25tZW50LnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEYXRhIE1pZ3JhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgICAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworc291cmNlICR7RlVMTF9QQVRIfS9iYXNlT3BlcmF0aW9uLnNoCisKK21haW5DbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYXNkY3Rvb2wubWFpbi5NaWdyYXRpb25NZW51IgorCitjb21tYW5kPSJqYXZhICRKVk1fTE9HX0ZJTEUgLWNwICRKQVJTICRtYWluQ2xhc3MgYWxpZ24tdmZjLW5hbWVzLTE2MDQgJEAiCitlY2hvICRjb21tYW5kCisKKyRjb21tYW5kCityZXN1bHQ9JD8KKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqKioqKiAkcmVzdWx0ICoqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorCitleGl0ICRyZXN1bHQKKworCmRpZmYgLS1naXQgYS9hc2RjdG9vbC90YXJiYWxsLnhtbCBiL2FzZGN0b29sL3RhcmJhbGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGViNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hc2RjdG9vbC90YXJiYWxsLnhtbApAQCAtMCwwICsxLDI2IEBACis8YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+CisgIDxpZD5iaW48L2lkPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhcjwvZm9ybWF0PgorICA8L2Zvcm1hdHM+CisgIDxmaWxlcz4KKyAgICA8ZmlsZT4KKyAgICAgICAgPHNvdXJjZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LWphci13aXRoLWRlcGVuZGVuY2llcy5qYXI8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8ZGVzdE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyPC9kZXN0TmFtZT4KKyAgICA8L2ZpbGU+CisgIDwvZmlsZXM+CisgIAorICA8ZmlsZVNldHM+ICAKKwk8ZmlsZVNldD4KKwkJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0czwvZGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNjcmlwdHM8L291dHB1dERpcmVjdG9yeT4KKwk8L2ZpbGVTZXQ+CisJPGZpbGVTZXQ+CisJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZzwvZGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNvbmZpZzwvb3V0cHV0RGlyZWN0b3J5PgorCTwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlLy5naXRpZ25vcmUgYi9jYXRhbG9nLWJlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmZTVkMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDggQEAKKy90YXJnZXQKKy90YXJnZXQKKy90YXJnZXQKKworL3RhcmdldAorL3RhcmdldAorL3RhcmdldAorL2J1aWxkCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlLy5weWRldnByb2plY3QgYi9jYXRhbG9nLWJlLy5weWRldnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMTM3MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvLnB5ZGV2cHJvamVjdApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPD9lY2xpcHNlLXB5ZGV2IHZlcnNpb249IjEuMCI/PjxweWRldl9wcm9qZWN0PgorPHB5ZGV2X3Byb3BlcnR5IG5hbWU9Im9yZy5weXRob24ucHlkZXYuUFlUSE9OX1BST0pFQ1RfVkVSU0lPTiI+cHl0aG9uIDIuNzwvcHlkZXZfcHJvcGVydHk+Cis8cHlkZXZfcHJvcGVydHkgbmFtZT0ib3JnLnB5dGhvbi5weWRldi5QWVRIT05fUFJPSkVDVF9JTlRFUlBSRVRFUiI+RGVmYXVsdDwvcHlkZXZfcHJvcGVydHk+Cis8L3B5ZGV2X3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL1JFQURNRS50eHQgYi9jYXRhbG9nLWJlL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1NDg0MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDQxIEBACisjb3BlbiBycG0KKyNpbnN0YWxsIGpldHR5CisjcnVuIGluc3RhbGxKZXR0eUJhc2Uuc2gKKyNjb3B5IGp2bS5wcm9wZXJ0aWVzIHRvIGJhc2UKKyNleHBvcnQgdmFyaWFibGVzCisjcnVuIHN0YXJ0SmV0dHkuc2gKKworI1Byb3BlcnRpZXM6CisKKyAgICBTVE9QLlBPUlQ9W251bWJlcl0KKyAgICAgIFRoZSBwb3J0IHRvIHVzZSB0byBzdG9wIHRoZSBydW5uaW5nIEpldHR5IHNlcnZlci4KKyAgICAgIFJlcXVpcmVkIGFsb25nIHdpdGggU1RPUC5LRVkgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSAtLXN0b3Agb3B0aW9uIGFib3ZlLgorCisgICAgU1RPUC5LRVk9W2FscGhhbnVtZXJpY10KKyAgICAgIFRoZSBwYXNzcGhyYXNlIGRlZmluZWQgdG8gc3RvcCB0aGUgc2VydmVyLgorICAgICAgUmVxdXJpZWQgYWxvbmcgd2l0aCBTVE9QLlBPUlQgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSAtLXN0b3Agb3B0aW9uIGFib3ZlLgorCisgICAgU1RPUC5XQUlUPVtudW1iZXJdCisgICAgICBUaGUgdGltZSAoaW4gc2Vjb25kcykgdG8gd2FpdCBmb3IgY29uZmlybWF0aW9uIHRoYXQgdGhlIHJ1bm5pbmcKKyAgICAgIEpldHR5IHNlcnZlciBoYXMgc3RvcHBlZC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0b3BwZXIgd2lsbCB3YWl0CisgICAgICBpbmRlZmluaXRlbHkuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAtLXN0b3Agb3B0aW9uLgorICAgICAgCisgICAgICAKKyNVcGxvYWQgTm9ybWF0aXZlIHR5cGVzOgorIyAxLiBjcmVhdGUgemlwIGZpbGUgY29udGFpbmluZyB0aGUgeWFtbAorIyAyLiBjcmVhdGUganNvbiBzdHJpbmcgKHBheWxvYWROYW1lIHNob3VsZCBiZSB0aGUgeW1sIGZpbGUgbmFtZSk6IHsKKyMJCQkJCSJwYXlsb2FkTmFtZSI6Im5vcm1hdGl2ZS10eXBlcy1uZXctcm9vdC55bWwiLAorIwkJCQkJInVzZXJJZCI6ImFkbWluaWQiLAorIwkJCQkJInJlc291cmNlTmFtZSI6InRvc2NhLm5vZGVzLlJvb3QiLAorIwkJCQkJImRlc2NyaXB0aW9uIjoiUmVwcmVzZW50cyBhIGdlbmVyaWMgc29mdHdhcmUgY29tcG9uZW50IHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIENvbXB1dGUgTm9kZSBUeXBlLiIsCisjCQkJCQkicmVzb3VyY2VJY29uUGF0aCI6ImRlZmF1bHRpY29uIiwKKyMJCQkJCSJjYXRlZ29yeSI6IkFic3RyYWN0IiwKKyMJCQkJCSJ0YWdzIjpbIlJvb3QiXQorIwkJCQkJfQorIyAKKyMKKyMgMy4gcnVuIGN1cmwgY29tbWFuZDogY3VybCAtdiAtRiByZXNvdXJjZU1ldGFkYXRhPTxqc29uIHN0cmluZz4gLUYgcmVzb3VyY2VaaXA9QDx6aXAgZmlsZSBsb2NhdGlvbj4gPEJFIGhvc3Q6cG9ydD4vc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL211bHRpcGFydAorIyAgICBlLmcuOiAKKyMJY3VybCAtdiAtRiByZXNvdXJjZU1ldGFkYXRhPSd7InBheWxvYWROYW1lIjoibm9ybWF0aXZlLXR5cGVzLW5ldy1yb290LnltbCIsInVzZXJJZCI6ImFkbWluaWQiLCJyZXNvdXJjZU5hbWUiOiJ0b3NjYS5ub2Rlcy5Sb290IiwiZGVzY3JpcHRpb24iOiJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwicmVzb3VyY2VJY29uUGF0aCI6ImRlZmF1bHRpY29uIiwiY2F0ZWdvcnkiOiJBYnN0cmFjdCIsInRhZ3MiOlsiUm9vdCJdfScgLUYgcmVzb3VyY2VaaXA9QC92YXIvdG1wL25vcm1hdGl2ZS10eXBlcy1uZXctcm9vdC56aXAgbG9jYWxob3N0OjgwODAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL211bHRpcGFydAorCisjIAkKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvbm9ybWF0aXZlcy54bWwgYi9jYXRhbG9nLWJlL25vcm1hdGl2ZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTg2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL25vcm1hdGl2ZXMueG1sCkBAIC0wLDAgKzEsMTggQEAKKzxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiCit4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KKyAgPGlkPmJpbjwvaWQ+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGZpbGVTZXRzPiAgCisJPGZpbGVTZXQ+CisJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydDwvZGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmltcG9ydDwvb3V0cHV0RGlyZWN0b3J5PgorCTwvZmlsZVNldD4KKwk8ZmlsZVNldD4KKwkJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0czwvZGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNjcmlwdHM8L291dHB1dERpcmVjdG9yeT4KKwk8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9wb20ueG1sIGIvY2F0YWxvZy1iZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZjQyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3BvbS54bWwKQEAgLTAsMCArMSw3OTAgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8YXJ0aWZhY3RJZD5jYXRhbG9nLWJlPC9hcnRpZmFjdElkPgorCTxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKwk8cGFyZW50PgorCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+c2RjLW1haW48L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorCTwvcGFyZW50PgorCisKKwk8cHJvcGVydGllcz4KKwkJPHN3YWdnZXItdWktdmVyc2lvbj4yLjEuMC1NMjwvc3dhZ2dlci11aS12ZXJzaW9uPgorCTwvcHJvcGVydGllcz4KKworCisKKworCTxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKwkJPGRlcGVuZGVuY2llcz4KKworCQkJPCEtLSBKU09OIGFuZCBZQU1MIFBhcnNpbmcgLS0+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWZvcm1hdDwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmU8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7amFja3Nvbi5hbm5vdGF0aW9ucy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXkuY29udHJpYnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amVyc2V5LW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjE0PC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCQk8L2RlcGVuZGVuY2llcz4KKwk8L2RlcGVuZGVuY3lNYW5hZ2VtZW50PgorCisKKworCisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNlY3VyaXR5LXV0aWxzPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtzZWN1cml0eS11dGlscy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Ymx1ZXByaW50cy1zYWlsLWdyYXBoPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi42LjA8L3ZlcnNpb24+CisJCQk8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisJCQk8ZXhjbHVzaW9ucz4KKwkJCQk8ZXhjbHVzaW9uPgorCQkJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQk8L2V4Y2x1c2lvbnM+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS50aW5rZXJwb3AuYmx1ZXByaW50czwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmJsdWVwcmludHMtZ3JhcGgtc2FpbDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuNS4wPC92ZXJzaW9uPgorCQkJPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBTd2FnZ2VyIERlcGVuZGVuY2llcyBTdGFydCAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20ud29yZG5pazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnN3YWdnZXItamVyc2V5Mi1qYXhyczwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTx2ZXJzaW9uPjEuNS4xLU0yPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIFN3YWdnZXIgRGVwZW5kZW5jaWVzIEVuZCAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbi1hcHAtYXBpPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtjb21tb24tYXBwLWFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGMuYmU8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb24tYmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2NvbW1vbi1iZS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjLmJlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2F0YWxvZy1kYW88L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2NhdGFsb2ctZGFvLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhdGFsb2ctbW9kZWw8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2NhdGFsb2ctbW9kZWwudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIHNsZjRqICsgbG9nYmFjayAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZ2JhY2stY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gU25ha2UgWWFtbCAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNuYWtleWFtbDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gRmlsZSBjaGFuZ2VzIGxpc3RlbmVyIC0tPgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1qY2ktY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gR3NvbiAtLT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3NvbjwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gSnNvbiAtLT4KKworCisKKworCQk8IS0tIGplcnNleSAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCisJCTwhLS0gaHR0cCBjbGllbnQgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8IS0tIGh0dHAgY2xpZW50IEVORCAtLT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4zLjQuMS4yMDE0MDYyMDE4MTUtcjwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisKKwkJPCEtLSBzcHJpbmcgLSB1c2VkIGJ5IEE0QyAtLT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy13ZWJtdmM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctYW9wPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWV4cHJlc3Npb248L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5ncm9vdnk8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5ncm9vdnktYWxsPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5qYW5pbm88L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qYW5pbm88L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5qYW5pbm88L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWNvbXBpbGVyPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+My4wLjY8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBUSVRBTiAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udGhpbmthdXJlbGl1cy50aXRhbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRpdGFuLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3RpdGFuLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmpzb248L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPmpzb248L2FydGlmYWN0SWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKwkJCQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJPC9leGNsdXNpb25zPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udGhpbmthdXJlbGl1cy50aXRhbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRpdGFuLWNhc3NhbmRyYTwvYXJ0aWZhY3RJZD4KKwkJCTwhLS08YXJ0aWZhY3RJZD5hc2RjLXRpdGFuLWNhc3NhbmRyYTwvYXJ0aWZhY3RJZCAtLT4KKwkJCTx2ZXJzaW9uPiR7dGl0YW4udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8IS0tPHZlcnNpb24+MS4wLjAtc25hcHNob3Q8L3ZlcnNpb24gLS0+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8ZXhjbHVzaW9ucz4KKwkJCQk8ZXhjbHVzaW9uPgorCQkJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGdyb3VwSWQ+aW8ubmV0dHk8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPm5ldHR5LWFsbDwvYXJ0aWZhY3RJZD4KKwkJCQk8L2V4Y2x1c2lvbj4KKwkJCTwvZXhjbHVzaW9ucz4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8IS0tIFRJVEFOIEVORCAtLT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5nb29nbGVjb2RlLmpzb24tc2ltcGxlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anNvbi1zaW1wbGU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisKKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmVsYXN0aWNzZWFyY2g8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5lbGFzdGljc2VhcmNoPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5lbGFzdGljc2VhcmNoLnBsdWdpbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNoaWVsZDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7ZWxhc3RpYy1zZWFyY2gudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBmdW5jdGlvbmFsIGphdmEgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmZ1bmN0aW9uYWxqYXZhPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+ZnVuY3Rpb25hbGphdmE8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIEFzcGVjdHMgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmpjYWJpPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amNhYmktYXNwZWN0czwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFzcGVjdGo8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5hc3BlY3RqcnQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIENBTUJSSUEgQ0xJRU5UIGZvciBVLUVCIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5hdHQubnNhPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2FtYnJpYUNsaWVudDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uYXR0Lm5zYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNhQ2xpZW50TGlicmFyeTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJPC9leGNsdXNpb25zPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuanNvbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpzb248L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yMDEzMTAxODwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGlua2VyZ3JhcGgtZ3JlbWxpbjwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuMC4xLWluY3ViYXRpbmc8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUudGlua2VycG9wPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3JlbWxpbi1ncm9vdnk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4zLjAuMS1pbmN1YmF0aW5nPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBDQVNTQU5EUkEgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmRhdGFzdGF4LmNhc3NhbmRyYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhc3NhbmRyYS1kcml2ZXItY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y2Fzc2FuZHJhLmRyaXZlci52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtZHJpdmVyLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2Nhc3NhbmRyYS5kcml2ZXIudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBDQVNTQU5EUkEgRU5EIC0tPgorCisJCTwhLS0gSW5zZXJ0ZWQgZm9yIEVDT01QIFBvcnRhbCBJbnRlZ3JhdGlvbiAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLmVjb21wc2Rrb3M8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5lY29tcEZXPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtlY29tcC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTxleGNsdXNpb25zPgorCQkJCTxleGNsdXNpb24+CisJCQkJCTxncm91cElkPmNvbS5hdHQubnNhPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5jYW1icmlhQ2xpZW50PC9hcnRpZmFjdElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJCTxleGNsdXNpb24+CisJCQkJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCQkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCQk8L2V4Y2x1c2lvbj4KKwkJCTwvZXhjbHVzaW9ucz4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gQXJ0aWZhY3QgR2VuZXJhdG9yIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjLnNkY19jb21tb248L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5vcGVuZWNvbXAtc2RjLWFydGlmYWN0LWdlbmVyYXRvci1hcGk8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2FydGVmYWN0LWdlbi1hcGkudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjLnNkY19jb21tb248L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5vcGVuZWNvbXAtc2RjLWFydGlmYWN0LWdlbmVyYXRvci1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHthcnRlZmFjdC1nZW4tY29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGMuc2RjX2NvbW1vbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPm9wZW5lY29tcC1jb21tb24tbGliPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtkb3gtY29tbW9uLWxpYi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTx0eXBlPnBvbTwvdHlwZT4KKwkJPC9kZXBlbmRlbmN5PgorCisKKwkJPCEtLSBKZXR0eSBQcm94eSAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpldHR5LXByb3h5PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisKKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amV0dHktc2VydmxldHM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2pldHR5LnNlcnZsZXRzLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBURVNUIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisJCQk8dHlwZT5wb208L3R5cGU+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amV0dHktc2VydmxldDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qZXR0eS13ZWJhcHA8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmp1bml0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctdGVzdDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy10eDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7c3ByaW5nLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+CisKKworCisJPGJ1aWxkPgorCisJCTxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgorCisKKwkJPHBsdWdpbnM+CisJCQk8cGx1Z2luPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorCQkJCQkJPGxvZ2JhY2suY29uZmlndXJhdGlvbkZpbGU+c3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWw8L2xvZ2JhY2suY29uZmlndXJhdGlvbkZpbGU+CisJCQkJCTwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9wbHVnaW4+CisJCQkKKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi42PC92ZXJzaW9uPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8cGFja2FnaW5nRXhjbHVkZXM+V0VCLUlORlxsaWJcc2xmNGotbG9nNGoqLmphciwKKwkJCQkJCVdFQi1JTkYvY2xhc3Nlcy9lbGFzdGljc2VhcmNoLnltbCwKKwkJCQkJCVdFQi1JTkYvY2xhc3Nlcy9wb3J0YWwucHJvcGVydGllczwvcGFja2FnaW5nRXhjbHVkZXM+CisJCQkJCQk8YXJjaGl2ZT4KKwkJCQkJCQk8bWFuaWZlc3RFbnRyaWVzPgorCQkJCQkJCQk8U0RDLVZlcnNpb24+JHtwYXJlbnQudmVyc2lvbn08L1NEQy1WZXJzaW9uPgorCQkJCQkJCTwvbWFuaWZlc3RFbnRyaWVzPgorCQkJCQkJCTxtYW5pZmVzdD4KKwkJCQkJCQkJPCEtLSA8YWRkQ2xhc3NwYXRoPnRydWU8L2FkZENsYXNzcGF0aCAtLT4KKwkJCQkJCQkJPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKwkJCQkJCQkJPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisJCQkJCQkJPC9tYW5pZmVzdD4KKwkJCQkJCTwvYXJjaGl2ZT4KKworCQkJCQkJPHdlYlJlc291cmNlcz4KKwkJCQkJCQk8cmVzb3VyY2U+CisJCQkJCQkJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisJCQkJCQkJCTwhLS0gPGRpcmVjdG9yeT50YXJnZXQvc3dhZ2dlci11aS0yLjEuMC1NMi9kaXN0PC9kaXJlY3RvcnkgLS0+CisJCQkJCQkJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXI8L2RpcmVjdG9yeT4KKwkJCQkJCQk8L3Jlc291cmNlPgorCQkJCQkJPC93ZWJSZXNvdXJjZXM+CisJCQkJCQk8YXR0YWNoQ2xhc3Nlcz50cnVlPC9hdHRhY2hDbGFzc2VzPgorCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPC9wbHVnaW4+CisKKworCisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJCTxpZD5jb3B5LWRlcGVuZGVuY2llczwvaWQ+CisJCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+CisJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQkJPGluY2x1ZGVTY29wZT5jb21waWxlPC9pbmNsdWRlU2NvcGU+CisJCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJPC9leGVjdXRpb24+CisJCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJCTxpZD5jb3B5LWluc3RhbGxlZDwvaWQ+CisJCQkJCQkJPHBoYXNlPmluc3RhbGw8L3BoYXNlPgorCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJPGdvYWw+Y29weTwvZ29hbD4KKwkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCQk8YXJ0aWZhY3RJdGVtcz4KKwkJCQkJCQkJCTxhcnRpZmFjdEl0ZW0+CisJCQkJCQkJCQkJPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgorCQkJCQkJCQkJCTxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKwkJCQkJCQkJCQk8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJCQkJCQkJPHR5cGU+JHtwcm9qZWN0LnBhY2thZ2luZ308L3R5cGU+CisJCQkJCQkJCQk8L2FydGlmYWN0SXRlbT4KKwkJCQkJCQkJPC9hcnRpZmFjdEl0ZW1zPgorCQkJCQkJCQk8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5wYXJlbnQuYmFzZWRpcn0vc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvPC9vdXRwdXREaXJlY3Rvcnk+CisJCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJPC9leGVjdXRpb24+CisJCQkJCTwvZXhlY3V0aW9ucz4KKwkJCQk8L3BsdWdpbj4KKworCisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+Y29tLmpjYWJpPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5qY2FiaS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCTx2ZXJzaW9uPiR7amNhYmkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgorCQkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJPGdvYWxzPgorCQkJCQkJCQk8Z29hbD5hamM8L2dvYWw+CisJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCTwvZXhlY3V0aW9uPgorCQkJCQk8L2V4ZWN1dGlvbnM+CisJCQkJPC9wbHVnaW4+CisKKworCisJCQkJPCEtLSBTd2FnZ2VyIFBsdWdpbnMgU3RhcnQgLS0+CisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUubWF2ZW4tZG93bmxvYWQtcGx1Z2luPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5kb3dubG9hZC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCTx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgorCQkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJPGlkPnN3YWdnZXItdWk8L2lkPgorCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJPGdvYWw+d2dldDwvZ29hbD4KKwkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCQk8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLXVpL2FyY2hpdmUvdiR7c3dhZ2dlci11aS12ZXJzaW9ufS50YXIuZ3o8L3VybD4KKwkJCQkJCQkJPHVucGFjaz50cnVlPC91bnBhY2s+CisJCQkJCQkJCTxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX08L291dHB1dERpcmVjdG9yeT4KKwkJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQkJPC9leGVjdXRpb25zPgorCQkJCTwvcGx1Z2luPgorCisKKworCQkJCTxwbHVnaW4+CisJCQkJCTxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCTx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKwkJCQkJPGV4ZWN1dGlvbnM+CisKKwkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJPGlkPmNvcHktcmVzb3VyY2VzPC9pZD4KKwkJCQkJCQk8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgorCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJPGdvYWw+Y29weS1yZXNvdXJjZXM8L2dvYWw+CisJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQkJPG91dHB1dERpcmVjdG9yeT50YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvb3V0cHV0RGlyZWN0b3J5PgorCQkJCQkJCQk8cmVzb3VyY2VzPgorCQkJCQkJCQkJPHJlc291cmNlPgorCQkJCQkJCQkJCTxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3dhZ2dlci11aS0ke3N3YWdnZXItdWktdmVyc2lvbn0vZGlzdDwvZGlyZWN0b3J5PgorCQkJCQkJCQkJCTxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgorCQkJCQkJCQkJCTxleGNsdWRlcz4KKwkJCQkJCQkJCQkJPGV4Y2x1ZGU+aW5kZXguaHRtbDwvZXhjbHVkZT4KKwkJCQkJCQkJCQk8L2V4Y2x1ZGVzPgorCQkJCQkJCQkJPC9yZXNvdXJjZT4KKwkJCQkJCQkJPC9yZXNvdXJjZXM+CisJCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJPC9leGVjdXRpb24+CisKKwkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJPGlkPmNvcHktbm9ybWF0aXZlcy1iYWNrZW5kPC9pZD4KKwkJCQkJCQk8cGhhc2U+aW5zdGFsbDwvcGhhc2U+CisJCQkJCQkJPGdvYWxzPgorCQkJCQkJCQk8Z29hbD5jb3B5LXJlc291cmNlczwvZ29hbD4KKwkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCQk8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5wYXJlbnQuYmFzZWRpcn0vc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9maWxlcy9kZWZhdWx0PC9vdXRwdXREaXJlY3Rvcnk+CisJCQkJCQkJCTxyZXNvdXJjZXM+CisJCQkJCQkJCQk8cmVzb3VyY2U+CisJCQkJCQkJCQkJPGRpcmVjdG9yeT4uL3RhcmdldDwvZGlyZWN0b3J5PgorCQkJCQkJCQkJCTxpbmNsdWRlcz4KKwkJCQkJCQkJCQkJPGluY2x1ZGU+bm9ybWF0aXZlcy50YXIuZ3o8L2luY2x1ZGU+CisJCQkJCQkJCQkJPC9pbmNsdWRlcz4KKwkJCQkJCQkJCTwvcmVzb3VyY2U+CisJCQkJCQkJCTwvcmVzb3VyY2VzPgorCQkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJCTwvZXhlY3V0aW9uPgorCisJCQkJCTwvZXhlY3V0aW9ucz4KKwkJCQk8L3BsdWdpbj4KKworCisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCTx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKwkJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJCTxpZD5ub3JtYXRpdmVzPC9pZD4KKwkJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQkJPGdvYWxzPgorCQkJCQkJCQk8Z29hbD5zaW5nbGU8L2dvYWw+CisJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQkJPGZpbmFsTmFtZT5ub3JtYXRpdmVzPC9maW5hbE5hbWU+CisJCQkJCQkJCTxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgorCQkJCQkJCQk8ZGVzY3JpcHRvcj4ke3Byb2plY3QuYmFzZWRpcn0vbm9ybWF0aXZlcy54bWw8L2Rlc2NyaXB0b3I+CisJCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJPC9leGVjdXRpb24+CisJCQkJCTwvZXhlY3V0aW9ucz4KKwkJCQk8L3BsdWdpbj4KKworCQkJPC9wbHVnaW5zPgorCisKKworCisJCQk8cGx1Z2luTWFuYWdlbWVudD4KKwkJCQk8cGx1Z2lucz4KKwkJCQk8IS0tVGhpcyBwbHVnaW4ncyBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgRWNsaXBzZSBtMmUgc2V0dGluZ3MgCisJCQkJb25seS4gSXQgaGFzIG5vIGluZmx1ZW5jZSBvbiB0aGUgTWF2ZW4gYnVpbGQgaXRzZWxmLiAtLT4KKwkJCQk8cGx1Z2luPgorCQkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5tMmU8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPmxpZmVjeWNsZS1tYXBwaW5nPC9hcnRpZmFjdElkPgorCQkJCQk8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKwkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQk8bGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgorCQkJCQkJCTxwbHVnaW5FeGVjdXRpb25zPgorCQkJCQkJCQk8cGx1Z2luRXhlY3V0aW9uPgorCQkJCQkJCQkJPHBsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKwkJCQkJCQkJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5tYXZlbi1kb3dubG9hZC1wbHVnaW48L2dyb3VwSWQ+CisJCQkJCQkJCQkJPGFydGlmYWN0SWQ+ZG93bmxvYWQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQkJCQkJCTx2ZXJzaW9uUmFuZ2U+WzEuMi4xLCk8L3ZlcnNpb25SYW5nZT4KKwkJCQkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQkJCTxnb2FsPndnZXQ8L2dvYWw+CisJCQkJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQkJCTwvcGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorCQkJCQkJCQkJPGFjdGlvbj4KKwkJCQkJCQkJCQk8aWdub3JlPjwvaWdub3JlPgorCQkJCQkJCQkJPC9hY3Rpb24+CisJCQkJCQkJCTwvcGx1Z2luRXhlY3V0aW9uPgorCisJCQkJCQkJCTxwbHVnaW5FeGVjdXRpb24+CisJCQkJCQkJCQk8cGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorCQkJCQkJCQkJCTxncm91cElkPmNvbS5qY2FiaTwvZ3JvdXBJZD4KKwkJCQkJCQkJCQk8YXJ0aWZhY3RJZD5qY2FiaS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQkJCQkJPHZlcnNpb25SYW5nZT5bMC4wLCk8L3ZlcnNpb25SYW5nZT4KKwkJCQkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQkJCTxnb2FsPmFqYzwvZ29hbD4KKwkJCQkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisJCQkJCQkJCQk8YWN0aW9uPgorCQkJCQkJCQkJCTxleGVjdXRlIC8+CisJCQkJCQkJCQk8L2FjdGlvbj4KKwkJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb24+CisKKwkJCQkJCQk8L3BsdWdpbkV4ZWN1dGlvbnM+CisJCQkJCQk8L2xpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKwkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCTwvcGx1Z2luPgorCQkJCTxwbHVnaW4+CisJCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJCTwvcGx1Z2luPgorCQkJCQorCQkJPC9wbHVnaW5zPgorCQk8L3BsdWdpbk1hbmFnZW1lbnQ+CisJCTwhLS0gU3dhZ2dlciBQbHVnaW5zIEVuZCAtLT4KKwk8L2J1aWxkPgorCisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2FwaS9JQXVkaXRpbmdNYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvYXVkaXRpbmcvYXBpL0lBdWRpdGluZ01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmI3OWMyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2FwaS9JQXVkaXRpbmdNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmF1ZGl0aW5nLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CisKK3B1YmxpYyBpbnRlcmZhY2UgSUF1ZGl0aW5nTWFuYWdlciB7CisJdm9pZCBhdWRpdEV2ZW50KEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyk7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvYXVkaXRpbmcvaW1wbC9BdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2ltcGwvQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE0YjVhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2ltcGwvQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmF1ZGl0aW5nLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitwdWJsaWMgaW50ZXJmYWNlIEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzIHsKKworCXN0YXRpYyBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gRElTVFJJQlVUSU9OX1JFR0lTVFJBVElPTl9URU1QTEFURV9BUlJBWSA9IHsKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9BUElfS0VZLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9FTlZSSU9OTUVOVF9OQU1FLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9OT1RJRklDQVRJT05fVE9QSUNfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fU1RBVFVTX1RPUElDX05BTUV9OworCQorCXN0YXRpYyBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gRElTVFJJQlVUSU9OX0RPV05MT0FEX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQworCX07CisJCisJc3RhdGljIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBHRVRfVUVCX0NMVVNURVJfQVJSQVkgPSB7CisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fU1RBVFVTX1RJTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfREVTQworCX07CisJCisJc3RhdGljIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBESVNUUklCVVRJT05fREVQTE9ZX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQworCX07CisJCisJc3RhdGljIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBESVNUUklCVVRJT05fU1RBVFVTX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfVE9QSUNfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUkVTT1VSQ0VfVVJMLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfVElNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQwkJCisJfTsKKwkKKwlzdGF0aWMgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIERJU1RSSUJVVElPTl9OT1RJRllfQVJSQVkgPSB7CisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9TVEFURSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1RPUElDX05BTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MKKwl9OworCQorCXN0YXRpYyBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gQUREX1JFTU9WRV9UT1BJQ19LRVlfQUNMX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fRU5WUklPTk1FTlRfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fVE9QSUNfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUk9MRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQVBJX0tFWSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMKKwl9OworCQorCXN0YXRpYyBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gQ1JFQVRFX1RPUElDX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fRU5WUklPTk1FTlRfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fVE9QSUNfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMKKwl9OworCQorCXN0YXRpYyBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gQUNUSVZBVEVfRElTVFJJQlVUSU9OX0FSUkFZID17CisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9TVEFURSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9EUFJFVl9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfRENVUlJfU1RBVFVTLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQworCX07CisJCisJc3RhdGljIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBDSEFOR0VfRElTVFJJQlVUSU9OX1NUQVRVU19BUlJBWSA9IHsKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9WRVJTSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1NUQVRFLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RQUkVWX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9EQ1VSUl9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ09NTUVOVAorCX07CisJCisJc3RhdGljIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBDUkVBVEVfUkVTT1VSQ0VfVEVNUExBVEVfU1VGRklYX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKwkKKwlzdGF0aWMgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIENSRUFURV9SRVNPVVJDRV9URU1QTEFURV9QUkVGSVhfQVJSQVkgPSB7CisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0lOVkFSSUFOVF9VVUlELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfVkVSU0lPTiwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfU1RBVEUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9TVEFURQkJCisJfTsKKwkKKwlzdGF0aWMgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIFVTRVJfQUNDRVNTX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVVNFUl9VSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCAKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKwkKKwlzdGF0aWMgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIFVTRVJfVEVNUExBVEVfQVJSQVkgPSB7CisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX1VJRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQworCX07CisJCisJc3RhdGljIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBBVVRIX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQVVUSF9VUkwsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQVVUSF9VU0VSLCAKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BVVRIX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BVVRIX1JFQUxNCisJfTsKKwkKKwlzdGF0aWMgIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBFQ09NUF9VU0VSX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0VDT01QX1VTRVIsIAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKworCXN0YXRpYyAgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIENBVEVHT1JZX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0NBVEVHT1JZX05BTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1VCX0NBVEVHT1JZX05BTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfR1JPVVBJTkdfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKwkKKwlzdGF0aWMgIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBHRVRfVVNFUlNfTElTVF9URU1QTEFURV9BUlJBWSA9IHsKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0RFVEFJTFMsIAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKwkKKwlzdGF0aWMgIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBHRVRfQ0FURUdPUllfSElFUkFSQ0hZX1RFTVBMQVRFX0FSUkFZID0geworCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFVEFJTFMsIAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKwlzdGF0aWMgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIFVTRVJfQURNSU5fVEVNUExBVEVfQVJSQVkgPSB7CisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0JFRk9SRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0FGVEVSLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKwlzdGF0aWMgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIEVYVEVSTkFMX0dFVF9BU1NFVF9MSVNUX1RFTVBMQVRFX0FSUkFZID0geworCQkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sCisJCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwKKwkJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwKKwkJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLAorCQkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDCisJfTsKKwlzdGF0aWMgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIEVYVEVSTkFMX0dFVF9BU1NFVF9URU1QTEFURV9BUlJBWSA9IHsKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9SRVNPVVJDRV9VUkwsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MKKwl9OworCXN0YXRpYyBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gRVhURVJOQUxfRE9XTkxPQURfQVJUSUZBQ1RfQVJSQVkgPSB7CisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQworCX07CisJc3RhdGljIEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSBFWFRFUk5BTF9DUlVEX0FQSV9BUlRJRkFDVF9BUlJBWSA9IHsKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUkVTT1VSQ0VfVVJMLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwKKwkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9QUkVWX0FSVElGQUNUX1VVSUQsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQ1VSUl9BUlRJRkFDVF9VVUlELAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FSVElGQUNUX0RBVEEsCisJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLAorCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MKKwl9OworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2ltcGwvQXVkaXRpbmdMb2dGb3JtYXRVdGlsLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvYXVkaXRpbmcvaW1wbC9BdWRpdGluZ0xvZ0Zvcm1hdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmVjMzliCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2ltcGwvQXVkaXRpbmdMb2dGb3JtYXRVdGlsLmphdmEKQEAgLTAsMCArMSwyNjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5hdWRpdGluZy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNsZjRqLk1hcmtlcjsKK2ltcG9ydCBvcmcuc2xmNGouTWFya2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEF1ZGl0aW5nTG9nRm9ybWF0VXRpbCB7CisKKwkvLyBXaGVuIGFkZGluZyBhbnkgbmV3IGZpZWxkcyBoZXJlLCBwbGVhc2Uga2VlcCB0aGUgY29udmVudGlvbiA8ZmllbGROYW1lPj0KKwkvLyA8dmFsdWU+LCB3aXRoIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZW0uCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF1ZGl0aW5nTG9nRm9ybWF0VXRpbC5jbGFzcy5nZXROYW1lKCkpOworCisJLy8gVGhpcyBpcyB0aGUga2V5IGJ5IHdoaWNoIGF1ZGl0IG1hcmtlciBpcyByZWNvZ25pemVkIGluIGxvZ2JhY2sueG1sCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFVRElUX01BUktFUl9TVFIgPSAiQVVESVRfTUFSS0VSIjsKKworCXB1YmxpYyBzdGF0aWMgTWFya2VyIGF1ZGl0TWFya2VyID0gTWFya2VyRmFjdG9yeS5nZXRNYXJrZXIoQVVESVRfTUFSS0VSX1NUUik7CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nQXVkaXRFdmVudChFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoc2IsIExvY2FsZS5VUyk7CisJCWxvZy50cmFjZSgibG9nQXVkaXRFdmVudCAtIHN0YXJ0Iik7CisKKwkJdHJ5IHsKKworCQkJLy8gQ29tbW9uIGZpZWxkcworCQkJU3RyaW5nIG1vZGlmaWVyID0gZ2V0TW9kaWZpZXIoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSksIChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCkpOworCQkJT2JqZWN0IHN0YXR1c09iaiA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUyk7CisJCQlTdHJpbmcgc3RhdHVzID0gbnVsbDsKKwkJCWlmIChzdGF0dXNPYmogIT0gbnVsbCkgeworCQkJCXN0YXR1cyA9IFN0cmluZy52YWx1ZU9mKHN0YXR1c09iaik7CisJCQl9CisJCQlTdHJpbmcgZGVzYyA9IChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQkJU3RyaW5nIGFjdGlvbiA9IChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTik7CisKKwkJCUF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEV2ZW50VHlwZSA9IEF1ZGl0aW5nQWN0aW9uRW51bS5nZXRBY3Rpb25CeU5hbWUoYWN0aW9uKTsKKwkJCVN0cmluZ0J1aWxkZXIgZm9ybWF0dGVkRXZlbnQgPSBnZXRGb3JtYXR0ZWRFdmVudChhdWRpdGluZ0ZpZWxkcywgbW9kaWZpZXIsIHN0YXR1cywgZGVzYywgYWN0aW9uLCBhdWRpdEV2ZW50VHlwZSk7CisJCQlTdHJpbmcgZm9ybWF0dGVkU3RyaW5nID0gZm9ybWF0dGVkRXZlbnQudG9TdHJpbmcoKTsKKworCQkJLy8gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZml4IERFMTY2MjI1IHdpdGhvdXQgbWFqb3IgcmVmYWN0b3JpbmcsCisJCQkvLyBhZnRlciBpdCB3YXMgcHJldmlvdXNseSBhZ3JlZWQgd2l0aCBFbGxhIHRoYXQgYWN0aXZpdHkgdHlwZSB3aWxsCisJCQkvLyBiZSB0aGUgbWV0aG9kIG5hbWUuCisKKwkJCWlmIChhdWRpdEV2ZW50VHlwZS5lcXVhbHMoQXVkaXRpbmdBY3Rpb25FbnVtLkFVVEhfUkVRVUVTVCkpIHsKKwkJCQlIdHRwUmVxdWVzdEF1dGhlbnRpY2F0aW9uKGZvcm1hdHRlZFN0cmluZyk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5pbmZvKGF1ZGl0TWFya2VyLCBmb3JtYXR0ZWRTdHJpbmcpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJ1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkOiB7fSB7fSIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKworCQl9IGZpbmFsbHkgeworCQkJZm9ybWF0dGVyLmNsb3NlKCk7CisJCQlsb2cudHJhY2UoImxvZ0F1ZGl0RXZlbnQgLSBlbmQiKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBIdHRwUmVxdWVzdEF1dGhlbnRpY2F0aW9uKFN0cmluZyBmb3JtYXR0ZWRTdHJpbmcpIHsKKwkJbG9nLmluZm8oYXVkaXRNYXJrZXIsIGZvcm1hdHRlZFN0cmluZyk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVpbGRlciBnZXRGb3JtYXR0ZWRFdmVudChFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMsIFN0cmluZyBtb2RpZmllciwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGRlc2MsIFN0cmluZyBhY3Rpb24sIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEV2ZW50VHlwZSkgeworCisJCVN0cmluZ0J1aWxkZXIgZm9ybWF0dGVkU3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQlzd2l0Y2ggKGF1ZGl0RXZlbnRUeXBlKSB7CisJCWNhc2UgQUREX1VTRVI6CisJCWNhc2UgREVMRVRFX1VTRVI6CisJCWNhc2UgVVBEQVRFX1VTRVI6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuVVNFUl9BRE1JTl9URU1QTEFURV9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCisJCQlicmVhazsKKwkJY2FzZSBVU0VSX0FDQ0VTUzoKKwkJCWZvcm1hdHRlZFN0cmluZyA9IGJ1aWxkU3RyaW5nQWNjcm9kaW5nVG9BcnJheShBdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5VU0VSX0FDQ0VTU19URU1QTEFURV9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVUSU9OX1JFR0lTVEVSOgorCQljYXNlIERJU1RSSUJVVElPTl9VTl9SRUdJU1RFUjoKKwkJCWZvcm1hdHRlZFN0cmluZyA9IGJ1aWxkU3RyaW5nQWNjcm9kaW5nVG9BcnJheShBdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5ESVNUUklCVVRJT05fUkVHSVNUUkFUSU9OX1RFTVBMQVRFX0FSUkFZLCBhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBVUERBVEVfUkVTT1VSQ0VfTUVUQURBVEE6CisJCWNhc2UgQ1JFQVRFX1JFU09VUkNFOgorCQljYXNlIElNUE9SVF9SRVNPVVJDRToKKwkJCUFycmF5TGlzdDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtPiBjcmVhdGVSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuQ1JFQVRFX1JFU09VUkNFX1RFTVBMQVRFX1BSRUZJWF9BUlJBWSkpOworCQkJY3JlYXRlUmVzb3VyY2VMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkNSRUFURV9SRVNPVVJDRV9URU1QTEFURV9TVUZGSVhfQVJSQVkpKTsKKwkJCWlmIChhdWRpdEV2ZW50VHlwZSA9PSBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFKSB7CisJCQkJY3JlYXRlUmVzb3VyY2VMaXN0LmFkZChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RPU0NBX05PREVfVFlQRSk7CisJCQl9CisJCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gY3JlYXRlUmVzb3VyY2VBcnJheSA9IG5ldyBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtWzEwMF07CisJCQljcmVhdGVSZXNvdXJjZUFycmF5ID0gY3JlYXRlUmVzb3VyY2VMaXN0LnRvQXJyYXkoY3JlYXRlUmVzb3VyY2VBcnJheSk7CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoY3JlYXRlUmVzb3VyY2VBcnJheSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgQ0hFQ0tJTl9SRVNPVVJDRToKKwkJY2FzZSBDSEVDS09VVF9SRVNPVVJDRToKKwkJY2FzZSBVTkRPX0NIRUNLT1VUX1JFU09VUkNFOgorCQljYXNlIENFUlRJRklDQVRJT05fUkVRVUVTVF9SRVNPVVJDRToKKwkJY2FzZSBTVEFSVF9DRVJUSUZJQ0FUSU9OX1JFU09VUkNFOgorCQljYXNlIENFUlRJRklDQVRJT05fU1VDQ0VTU19SRVNPVVJDRToKKwkJY2FzZSBGQUlMX0NFUlRJRklDQVRJT05fUkVTT1VSQ0U6CisJCWNhc2UgQ0FOQ0VMX0NFUlRJRklDQVRJT05fUkVTT1VSQ0U6CisJCQlBcnJheUxpc3Q8QXVkaXRpbmdGaWVsZHNLZXlzRW51bT4gY2hlY2tpbkZpZWxkc0xpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuQ1JFQVRFX1JFU09VUkNFX1RFTVBMQVRFX1BSRUZJWF9BUlJBWSkpOworCQkJY2hlY2tpbkZpZWxkc0xpc3QuYWRkKEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ09NTUVOVCk7CisJCQljaGVja2luRmllbGRzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChBdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5DUkVBVEVfUkVTT1VSQ0VfVEVNUExBVEVfU1VGRklYX0FSUkFZKSk7CisJCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gY2hlY2tpbkZpZWxkc0FycmF5ID0gbmV3IEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bMTAwXTsKKwkJCWNoZWNraW5GaWVsZHNBcnJheSA9IGNoZWNraW5GaWVsZHNMaXN0LnRvQXJyYXkoY2hlY2tpbkZpZWxkc0FycmF5KTsKKwkJCVN0cmluZyBjb21tZW50ID0gKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ09NTUVOVCk7CisJCQlpZiAoY29tbWVudCA9PSBudWxsIHx8IGNvbW1lbnQuZXF1YWxzKENvbnN0YW50cy5OVUxMX1NUUklORykpIHsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DT01NRU5ULCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJCX0KKwkJCWZvcm1hdHRlZFN0cmluZyA9IGJ1aWxkU3RyaW5nQWNjcm9kaW5nVG9BcnJheShjaGVja2luRmllbGRzQXJyYXksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEFSVElGQUNUX1VQTE9BRDoKKwkJY2FzZSBBUlRJRkFDVF9ERUxFVEU6CisJCWNhc2UgQVJUSUZBQ1RfTUVUQURBVEFfVVBEQVRFOgorCQljYXNlIEFSVElGQUNUX1BBWUxPQURfVVBEQVRFOgorCQljYXNlIEFSVElGQUNUX0RPV05MT0FEOgorCQkJQXJyYXlMaXN0PEF1ZGl0aW5nRmllbGRzS2V5c0VudW0+IGFydGlmYWN0RmllbGRzTGlzdCA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChBdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5DUkVBVEVfUkVTT1VSQ0VfVEVNUExBVEVfUFJFRklYX0FSUkFZKSk7CisJCQlhcnRpZmFjdEZpZWxkc0xpc3QuYWRkKEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUFJFVl9BUlRJRkFDVF9VVUlEKTsKKwkJCWFydGlmYWN0RmllbGRzTGlzdC5hZGQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DVVJSX0FSVElGQUNUX1VVSUQpOworCQkJYXJ0aWZhY3RGaWVsZHNMaXN0LmFkZChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FSVElGQUNUX0RBVEEpOworCQkJYXJ0aWZhY3RGaWVsZHNMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkNSRUFURV9SRVNPVVJDRV9URU1QTEFURV9TVUZGSVhfQVJSQVkpKTsKKwkJCWFydGlmYWN0RmllbGRzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChBdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5FWFRFUk5BTF9ET1dOTE9BRF9BUlRJRkFDVF9BUlJBWSkpOworCQkJQXVkaXRpbmdGaWVsZHNLZXlzRW51bVtdIGFydGlmYWN0RmllbGRzQXJyYXkgPSBuZXcgQXVkaXRpbmdGaWVsZHNLZXlzRW51bVsxMDBdOworCQkJYXJ0aWZhY3RGaWVsZHNBcnJheSA9IGFydGlmYWN0RmllbGRzTGlzdC50b0FycmF5KGFydGlmYWN0RmllbGRzQXJyYXkpOworCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KGFydGlmYWN0RmllbGRzQXJyYXksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIERPV05MT0FEX0FSVElGQUNUOgorCQkJQXJyYXlMaXN0PEF1ZGl0aW5nRmllbGRzS2V5c0VudW0+IGRvd25sb2FkQXJ0aWZhY3RGaWVsZHNMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkVYVEVSTkFMX0RPV05MT0FEX0FSVElGQUNUX0FSUkFZKSk7CisJCQlBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gZG93bmxvYWRBcnRpZmFjdEZpZWxkc0FycmF5ID0gbmV3IEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bMTAwXTsKKwkJCWFydGlmYWN0RmllbGRzQXJyYXkgPSBkb3dubG9hZEFydGlmYWN0RmllbGRzTGlzdC50b0FycmF5KGRvd25sb2FkQXJ0aWZhY3RGaWVsZHNBcnJheSk7CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoYXJ0aWZhY3RGaWVsZHNBcnJheSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVUSU9OX1NUQVRFX0NIQU5HRV9SRVFVRVNUOgorCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkFDVElWQVRFX0RJU1RSSUJVVElPTl9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVUSU9OX1NUQVRFX0NIQU5HRV9BUFBST1Y6CisJCWNhc2UgRElTVFJJQlVUSU9OX1NUQVRFX0NIQU5HRV9SRUpFQ1Q6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuQ0hBTkdFX0RJU1RSSUJVVElPTl9TVEFUVVNfQVJSQVksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIENSRUFURV9ESVNUUklCVVRJT05fVE9QSUM6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuQ1JFQVRFX1RPUElDX1RFTVBMQVRFX0FSUkFZLCBhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBRERfS0VZX1RPX1RPUElDX0FDTDoKKwkJY2FzZSBSRU1PVkVfS0VZX0ZST01fVE9QSUNfQUNMOgorCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkFERF9SRU1PVkVfVE9QSUNfS0VZX0FDTF9URU1QTEFURV9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVUSU9OX1NUQVRVUzoKKwkJCWZvcm1hdHRlZFN0cmluZyA9IGJ1aWxkU3RyaW5nQWNjcm9kaW5nVG9BcnJheShBdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5ESVNUUklCVVRJT05fU1RBVFVTX1RFTVBMQVRFX0FSUkFZLCBhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBESVNUUklCVVRJT05fTk9USUZZOgorCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkRJU1RSSUJVVElPTl9OT1RJRllfQVJSQVksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSSUJVVElPTl9ERVBMT1k6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuRElTVFJJQlVUSU9OX0RFUExPWV9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgR0VUX1VFQl9DTFVTVEVSOgorCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkdFVF9VRUJfQ0xVU1RFUl9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVUSU9OX0FSVElGQUNUX0RPV05MT0FEOgorCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkRJU1RSSUJVVElPTl9ET1dOTE9BRF9URU1QTEFURV9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgQVVUSF9SRVFVRVNUOgorCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkFVVEhfVEVNUExBVEVfQVJSQVksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTOgorCQljYXNlIEdFVF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTOgorCQljYXNlIERFTEVURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTOgorCQljYXNlIFVQREFURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTOgorCQkJZm9ybWF0dGVkU3RyaW5nID0gYnVpbGRTdHJpbmdBY2Nyb2RpbmdUb0FycmF5KEF1ZGl0aW5nTG9nRm9ybWF0Q29uc3RhbnRzLkVDT01QX1VTRVJfVEVNUExBVEVfQVJSQVksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEFERF9DQVRFR09SWToKKwkJY2FzZSBBRERfU1VCX0NBVEVHT1JZOgorCQljYXNlIEFERF9HUk9VUElORzoKKwkJCWZvcm1hdHRlZFN0cmluZyA9IGJ1aWxkU3RyaW5nQWNjcm9kaW5nVG9BcnJheShBdWRpdGluZ0xvZ0Zvcm1hdENvbnN0YW50cy5DQVRFR09SWV9URU1QTEFURV9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgR0VUX1VTRVJTX0xJU1Q6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuR0VUX1VTRVJTX0xJU1RfVEVNUExBVEVfQVJSQVksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEdFVF9DQVRFR09SWV9ISUVSQVJDSFk6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuR0VUX0NBVEVHT1JZX0hJRVJBUkNIWV9URU1QTEFURV9BUlJBWSwgYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgR0VUX0FTU0VUX0xJU1Q6CisJCWNhc2UgR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1Q6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuRVhURVJOQUxfR0VUX0FTU0VUX0xJU1RfVEVNUExBVEVfQVJSQVksIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEdFVF9BU1NFVF9NRVRBREFUQToKKwkJY2FzZSBHRVRfVE9TQ0FfTU9ERUw6CisJCQlmb3JtYXR0ZWRTdHJpbmcgPSBidWlsZFN0cmluZ0FjY3JvZGluZ1RvQXJyYXkoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuRVhURVJOQUxfR0VUX0FTU0VUX1RFTVBMQVRFX0FSUkFZLCBhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBUlRJRkFDVF9VUExPQURfQllfQVBJOgorCQljYXNlIEFSVElGQUNUX0RFTEVURV9CWV9BUEk6CisJCWNhc2UgQVJUSUZBQ1RfVVBEQVRFX0JZX0FQSToKKwkJCUFycmF5TGlzdDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtPiB1cGxvYWRBcnRpZmFjdEZpZWxkc0xpc3QgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoQXVkaXRpbmdMb2dGb3JtYXRDb25zdGFudHMuRVhURVJOQUxfQ1JVRF9BUElfQVJUSUZBQ1RfQVJSQVkpKTsKKwkJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW1bXSB1cGxvYWRBcnRpZmFjdEZpZWxkc0FycmF5ID0gbmV3IEF1ZGl0aW5nRmllbGRzS2V5c0VudW1bMTAwXTsKKwkJCWFydGlmYWN0RmllbGRzQXJyYXkgPSB1cGxvYWRBcnRpZmFjdEZpZWxkc0xpc3QudG9BcnJheSh1cGxvYWRBcnRpZmFjdEZpZWxkc0FycmF5KTsKKwkJCWZvcm1hdHRlZFN0cmluZyA9IGJ1aWxkU3RyaW5nQWNjcm9kaW5nVG9BcnJheShhcnRpZmFjdEZpZWxkc0FycmF5LCBhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIGZvcm1hdHRlZFN0cmluZzsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdCdWlsZGVyIGJ1aWxkU3RyaW5nQWNjcm9kaW5nVG9BcnJheShBdWRpdGluZ0ZpZWxkc0tleXNFbnVtW10gc29ydGVkRmllbGRzQXJyYXksIEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQlTdHJpbmdCdWlsZGVyIGZvcm1hdHRlZFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkRmllbGRzQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0ga2V5ID0gc29ydGVkRmllbGRzQXJyYXlbaV07CisKKwkJCU9iamVjdCBmaWVsZFZhbCA9IGF1ZGl0aW5nRmllbGRzLmdldChrZXkpOworCQkJaWYgKGZpZWxkVmFsICE9IG51bGwpIHsKKwkJCQlmb3JtYXR0ZWRTdHJpbmcuYXBwZW5kKGtleS5nZXREaXNwbGF5TmFtZSgpKS5hcHBlbmQoIiA9IFwiIikuYXBwZW5kKGZpZWxkVmFsKS5hcHBlbmQoIlwiIik7CisJCQkJaWYgKGkgPCBzb3J0ZWRGaWVsZHNBcnJheS5sZW5ndGggLSAxKSB7CisJCQkJCWZvcm1hdHRlZFN0cmluZy5hcHBlbmQoIiAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvcm1hdHRlZFN0cmluZzsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRNb2RpZmllcihTdHJpbmcgbW9kaWZpZXJOYW1lLCBTdHJpbmcgbW9kaWZpZXJVaWQpIHsKKwkJaWYgKG1vZGlmaWVyVWlkID09IG51bGwgfHwgbW9kaWZpZXJVaWQuZXF1YWxzKENvbnN0YW50cy5FTVBUWV9TVFJJTkcpKSB7CisJCQlyZXR1cm4gQ29uc3RhbnRzLkVNUFRZX1NUUklORzsKKwkJfQorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaWYgKG1vZGlmaWVyTmFtZSAhPSBudWxsKSB7CisJCQlzYi5hcHBlbmQobW9kaWZpZXJOYW1lKTsKKwkJfQorCQlzYi5hcHBlbmQoIigiKS5hcHBlbmQobW9kaWZpZXJVaWQpLmFwcGVuZCgiKSIpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVc2VyKFN0cmluZyB1c2VyRGF0YSkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJc2IuYXBwZW5kKHVzZXJEYXRhKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2ltcGwvQXVkaXRpbmdNYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvYXVkaXRpbmcvaW1wbC9BdWRpdGluZ01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTVhZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2F1ZGl0aW5nL2ltcGwvQXVkaXRpbmdNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5hdWRpdGluZy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5hdWRpdGluZy5hcGkuSUF1ZGl0aW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5BdWRpdENhc3NhbmRyYURhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLkNhc3NhbmRyYU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uaW1wbC5BdWRpdGluZ0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdFJlY29yZEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nR2VuZXJpY0V2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVGhyZWFkTG9jYWxzSG9sZGVyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQoImF1ZGl0aW5nTWFuYWdlciIpCitwdWJsaWMgY2xhc3MgQXVkaXRpbmdNYW5hZ2VyIGltcGxlbWVudHMgSUF1ZGl0aW5nTWFuYWdlciB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXVkaXRpbmdNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIEF1ZGl0aW5nRGFvIGF1ZGl0aW5nRGFvOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEF1ZGl0Q2Fzc2FuZHJhRGFvIGNhc3NhbmRyYURhbzsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGF1ZGl0RXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCXRyeSB7CisJCQlib29sZWFuIGRpc2FibGVBdWRpdCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmlzRGlzYWJsZUF1ZGl0KCk7CisJCQlpZiAoZGlzYWJsZUF1ZGl0KSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy8gQWRkaW5nIFVVSUQgZnJvbSB0aHJlYWQgbG9jYWwKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQsIFRocmVhZExvY2Fsc0hvbGRlci5nZXRVdWlkKCkpOworCisJCQlPYmplY3Qgc3RhdHVzID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisKKwkJCS8vIG5vcm1hbGl6aW5nIGVtcHR5IHN0cmluZyB2YWx1ZXMgLSBVUzQ3MTY2MQorCQkJbm9ybWFsaXplRW1wdHlBdWRpdFN0cmluZ1ZhbHVlcyhhdWRpdGluZ0ZpZWxkcyk7CisKKwkJCS8vIEZvcm1hdCBtb2RpZmllcgorCQkJZm9ybWF0TW9kaWZpZXIoYXVkaXRpbmdGaWVsZHMpOworCisJCQkvLyBGb3JtYXQgdXNlcgorCQkJZm9ybWF0VXNlcihhdWRpdGluZ0ZpZWxkcyk7CisKKwkJCS8vIExvZ2dpbmcgdGhlIGV2ZW50CisJCQlBdWRpdGluZ0xvZ0Zvcm1hdFV0aWwubG9nQXVkaXRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisKKwkJCS8vIERldGVybWluaW5nIHRoZSB0eXBlIG9mIHRoZSBhdWRpdGluZyBkYXRhIG9iamVjdAorCQkJQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0gPSBBdWRpdGluZ0FjdGlvbkVudW0uZ2V0QWN0aW9uQnlOYW1lKChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTikpOworCQkJbG9nLmluZm8oImF1ZGl0IGV2ZW50IHt9IG9mIHR5cGUge30iLCBhY3Rpb25FbnVtLmdldE5hbWUoKSwgYWN0aW9uRW51bS5nZXRBdWRpdGluZ0VzVHlwZSgpKTsKKwkJCUFjdGlvblN0YXR1cyBhZGRSZWNvcmRTdGF0dXMgPSBhdWRpdGluZ0Rhby5hZGRSZWNvcmQoYXVkaXRpbmdGaWVsZHMsIGFjdGlvbkVudW0uZ2V0QXVkaXRpbmdFc1R5cGUoKSk7CisJCQlpZiAoIWFkZFJlY29yZFN0YXR1cy5lcXVhbHMoQWN0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy53YXJuKCJGYWlsZWQgdG8gcGVyc2lzdCBhdWRpdGluZyBldmVudDoge30iLCBhZGRSZWNvcmRTdGF0dXMubmFtZSgpKTsKKwkJCX0KKworCQkJQXVkaXRpbmdHZW5lcmljRXZlbnQgcmVjb3JkRm9yQ2Fzc2FuZHJhID0gQXVkaXRSZWNvcmRGYWN0b3J5LmNyZWF0ZUF1ZGl0UmVjb3JkKGF1ZGl0aW5nRmllbGRzKTsKKwkJCWlmIChyZWNvcmRGb3JDYXNzYW5kcmEgIT0gbnVsbCkgeworCQkJCUNhc3NhbmRyYU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBjYXNzYW5kcmFEYW8uc2F2ZVJlY29yZChyZWNvcmRGb3JDYXNzYW5kcmEpOworCQkJCWlmICghcmVzdWx0LmVxdWFscyhDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWxvZy53YXJuKCJGYWlsZWQgdG8gcGVyc2lzdCB0byBjYXNzYW5kcmEgYXVkaXRpbmcgZXZlbnQ6IHt9IiwgYWRkUmVjb3JkU3RhdHVzLm5hbWUoKSk7CisJCQkJfQorCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBFcnJvciBkdXJpbmcgYXVkaXRpbmcgc2hvdWxkbid0IHRlcm1pbmF0ZSBmbG93CisJCQlsb2cud2FybigiRXJyb3IgZHVyaW5nIGF1ZGl0RXZlbnQ6IHt9IiwgZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZm9ybWF0VXNlcihFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKwkJaWYgKGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1VTRVJfVUlEKSAhPSBudWxsKSB7CisJCQlTdHJpbmcgdXNlckRldGFpbHMgPSAoU3RyaW5nKSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX1VJRCk7CisKKwkJCVN0cmluZyB1c2VyID0gQXVkaXRpbmdMb2dGb3JtYXRVdGlsLmdldFVzZXIodXNlckRldGFpbHMpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVVNFUl9VSUQsIHVzZXIpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZvcm1hdE1vZGlmaWVyKEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQlTdHJpbmcgbW9kaWZpZXIgPSBBdWRpdGluZ0xvZ0Zvcm1hdFV0aWwuZ2V0TW9kaWZpZXIoKFN0cmluZykgYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSksIChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCkpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsIG1vZGlmaWVyKTsKKwkJYXVkaXRpbmdGaWVsZHMucmVtb3ZlKEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIG5vcm1hbGl6ZUVtcHR5QXVkaXRTdHJpbmdWYWx1ZXMoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCWZvciAoRW50cnk8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0VudHJ5IDogYXVkaXRpbmdGaWVsZHMuZW50cnlTZXQoKSkgeworCQkJaWYgKGF1ZGl0aW5nRW50cnkuZ2V0S2V5KCkuZ2V0VmFsdWVDbGFzcygpLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7CisJCQkJU3RyaW5nIGF1ZGl0aW5nVmFsdWUgPSAoU3RyaW5nKSBhdWRpdGluZ0VudHJ5LmdldFZhbHVlKCk7CisJCQkJYm9vbGVhbiBpc0VtcHR5ID0gZmFsc2U7CisJCQkJaWYgKGF1ZGl0aW5nVmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgdHJpbW1lZFZhbHVlID0gYXVkaXRpbmdWYWx1ZS50cmltKCk7CisJCQkJCWlmICgodHJpbW1lZFZhbHVlLmVxdWFscyhDb25zdGFudHMuRU1QVFlfU1RSSU5HKSkgfHwgdHJpbW1lZFZhbHVlLmVxdWFscyhDb25zdGFudHMuTlVMTF9TVFJJTkcpIHx8IHRyaW1tZWRWYWx1ZS5lcXVhbHMoQ29uc3RhbnRzLkRPVUJMRV9OVUxMX1NUUklORykpIHsKKwkJCQkJCWlzRW1wdHkgPSB0cnVlOworCQkJCQl9CisJCQkJfSBlbHNlIHsvLyBpcyBudWxsCisJCQkJCWlzRW1wdHkgPSB0cnVlOworCQkJCX0KKwkJCQkvLyBOb3JtYWxpemluZyB0byAiIgorCQkJCWlmIChpc0VtcHR5KSB7CisJCQkJCWF1ZGl0aW5nRW50cnkuc2V0VmFsdWUoQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvY2xlYW4vQXNkY0NvbXBvbmVudHNDbGVhbmVyVGFzay5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvY2xlYW4vQXNkY0NvbXBvbmVudHNDbGVhbmVyVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjg0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9jbGVhbi9Bc2RjQ29tcG9uZW50c0NsZWFuZXJUYXNrLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmNsZWFuOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuY29uY3VycmVudC5CYXNpY1RocmVhZEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQoImFzZGNDb21wb25lbnRzQ2xlYW5lciIpCitwdWJsaWMgY2xhc3MgQXNkY0NvbXBvbmVudHNDbGVhbmVyVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBc2RjQ29tcG9uZW50c0NsZWFuZXJUYXNrLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c0NsZWFuQnVzaW5lc3NMb2dpYyBjb21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljID0gbnVsbDsKKworCXByaXZhdGUgTGlzdDxOb2RlVHlwZUVudW0+IGNvbXBvbmVudHNUb0NsZWFuOworCXByaXZhdGUgbG9uZyBjbGVhbmluZ0ludGVydmFsSW5NaW51dGVzOworCisJcHJpdmF0ZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKDEsIG5ldyBCYXNpY1RocmVhZEZhY3RvcnkuQnVpbGRlcigpLm5hbWluZ1BhdHRlcm4oIkNvbXBvbmVudHNDbGVhblRocmVhZC0lZCIpLmJ1aWxkKCkpOworCVNjaGVkdWxlZEZ1dHVyZTw/PiBzY2hlZHVsZWRGdXR1cmUgPSBudWxsOworCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlsb2cudHJhY2UoIkVudGVyIGluaXQgbWV0aG9kIG9mIEFzZGNDb21wb25lbnRzQ2xlYW5lciIpOworCQlDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKTsKKwkJQ2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbiBjbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRDbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uKCk7CisKKwkJaWYgKGNsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworCQkJbG9nLmluZm8oIkVSUk9SIC0gY29uZmlndXJhdGlvbiBpcyBub3QgdmFsaWQhISEgbWlzc2luZyBjbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVDb21wb25lbnRDbGVhbmVyU3lzdGVtRXJyb3IsICJBc2RjQ29tcG9uZW50c0NsZWFuZXJUYXNrLmluaXQoKSIsICJBc2RjQ29tcG9uZW50c0NsZWFuZXJUYXNrLmluaXQoKSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlQ29tcG9uZW50Q2xlYW5lclN5c3RlbUVycm9yKCJBc2RjQ29tcG9uZW50c0NsZWFuZXJUYXNrLWluaXQiLCAiZmVjdGggY29uZmlndXJhdGlvbiIpOworCQkJcmV0dXJuOworCisJCX0KKwkJY29tcG9uZW50c1RvQ2xlYW4gPSBuZXcgQXJyYXlMaXN0PE5vZGVUeXBlRW51bT4oKTsKKwkJTGlzdDxTdHJpbmc+IGNvbXBvbmVudHMgPSBjbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uLmdldENvbXBvbmVudHNUb0NsZWFuKCk7CisJCWlmIChjb21wb25lbnRzID09IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJubyBjb21wb25lbnQgd2VyZSBjb25maWd1cmVkIGZvciBjbGVhbmluZyIpOworCQl9CisJCWZvciAoU3RyaW5nIGNvbXBvbmVudCA6IGNvbXBvbmVudHMpIHsKKwkJCU5vZGVUeXBlRW51bSB0eXBlRW51bSA9IE5vZGVUeXBlRW51bS5nZXRCeU5hbWVJZ25vcmVDYXNlKGNvbXBvbmVudCk7CisJCQlpZiAodHlwZUVudW0gIT0gbnVsbCkKKwkJCQljb21wb25lbnRzVG9DbGVhbi5hZGQodHlwZUVudW0pOworCQl9CisKKwkJbG9uZyBpbnRlcnZhbEluTWludXRlcyA9IGNsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24uZ2V0Q2xlYW5JbnRlcnZhbEluTWludXRlcygpOworCisJCWlmIChpbnRlcnZhbEluTWludXRlcyA8IDEpIHsKKwkJCWxvZy53YXJuKCJjbGVhbmluZ0ludGVydmFsSW5NaW51dGVzIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSBtaW51dGUuIHVzZSBkZWZhdWx0Iik7CisJCQlpbnRlcnZhbEluTWludXRlcyA9IDYwOworCQl9CisJCWNsZWFuaW5nSW50ZXJ2YWxJbk1pbnV0ZXMgPSBpbnRlcnZhbEluTWludXRlczsKKworCQlzdGFydFRhc2soKTsKKworCQlsb2cudHJhY2UoIkVuZCBpbml0IG1ldGhvZCBvZiBBc2RjQ29tcG9uZW50c0NsZWFuZXIiKTsKKwl9CisKKwlAUHJlRGVzdHJveQorCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisJCXRoaXMuc3RvcFRhc2soKTsKKwkJc2h1dGRvd25FeGVjdXRvcigpOworCX0KKworCXB1YmxpYyB2b2lkIHN0YXJ0VGFzaygpIHsKKworCQlsb2cuZGVidWcoInN0YXJ0IHRhc2sgZm9yIGNsZWFuaW5nIGNvbXBvbmVudHMiKTsKKworCQl0cnkgeworCisJCQlpZiAoc2NoZWR1bGVkU2VydmljZSAhPSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJTdGFydCBDbGVhbmluZyBjb21wb25lbnRzIHRhc2suIGludGVydmFsIHt9IG1pbnV0ZXMiLCBjbGVhbmluZ0ludGVydmFsSW5NaW51dGVzKTsKKwkJCQlzY2hlZHVsZWRGdXR1cmUgPSBzY2hlZHVsZWRTZXJ2aWNlLnNjaGVkdWxlQXRGaXhlZFJhdGUodGhpcywgNSwgY2xlYW5pbmdJbnRlcnZhbEluTWludXRlcywgVGltZVVuaXQuTUlOVVRFUyk7CisKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygidW5leHBlY3RlZCBlcnJvciBvY2N1cmVkIiwgZSk7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVDb21wb25lbnRDbGVhbmVyU3lzdGVtRXJyb3IsIG1ldGhvZE5hbWUsIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUNvbXBvbmVudENsZWFuZXJTeXN0ZW1FcnJvcigiQXNkY0NvbXBvbmVudHNDbGVhbmVyVGFzay1zdGFydFRhc2siLCBlLmdldE1lc3NhZ2UoKSk7CisKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHN0b3BUYXNrKCkgeworCQlpZiAoc2NoZWR1bGVkRnV0dXJlICE9IG51bGwpIHsKKwkJCWJvb2xlYW4gcmVzdWx0ID0gc2NoZWR1bGVkRnV0dXJlLmNhbmNlbCh0cnVlKTsKKwkJCWxvZy5kZWJ1ZygiU3RvcCBjbGVhbmluZyB0YXNrLiByZXN1bHQgPSB7fSIsIHJlc3VsdCk7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlpZiAoZmFsc2UgPT0gcmVzdWx0KSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlQ29tcG9uZW50Q2xlYW5lclN5c3RlbUVycm9yLCBtZXRob2ROYW1lLCAidHJ5IHRvIHN0b3AgdGhlIHBvbGxpbmcgdGFzayIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUNvbXBvbmVudENsZWFuZXJTeXN0ZW1FcnJvcigiQXNkY0NvbXBvbmVudHNDbGVhbmVyVGFzay1zdG9wVGFzayIsICJ0cnkgdG8gc3RvcCB0aGUgcG9sbGluZyB0YXNrIik7CisJCQl9CisJCQlzY2hlZHVsZWRGdXR1cmUgPSBudWxsOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgc2h1dGRvd25FeGVjdXRvcigpIHsKKwkJaWYgKHNjaGVkdWxlZFNlcnZpY2UgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlzY2hlZHVsZWRTZXJ2aWNlLnNodXRkb3duKCk7IC8vIERpc2FibGUgbmV3IHRhc2tzIGZyb20gYmVpbmcgc3VibWl0dGVkCisJCXRyeSB7CisJCQkvLyBXYWl0IGEgd2hpbGUgZm9yIGV4aXN0aW5nIHRhc2tzIHRvIHRlcm1pbmF0ZQorCQkJaWYgKCFzY2hlZHVsZWRTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24oNjAsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisJCQkJc2NoZWR1bGVkU2VydmljZS5zaHV0ZG93bk5vdygpOyAvLyBDYW5jZWwgY3VycmVudGx5IGV4ZWN1dGluZworCQkJCQkJCQkJCQkJLy8gdGFza3MKKwkJCQkvLyBXYWl0IGEgd2hpbGUgZm9yIHRhc2tzIHRvIHJlc3BvbmQgdG8gYmVpbmcgY2FuY2VsbGVkCisJCQkJaWYgKCFzY2hlZHVsZWRTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24oNjAsIFRpbWVVbml0LlNFQ09ORFMpKQorCQkJCQlsb2cuZGVidWcoIlBvb2wgZGlkIG5vdCB0ZXJtaW5hdGUiKTsKKwkJCX0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwkJCS8vIChSZS0pQ2FuY2VsIGlmIGN1cnJlbnQgdGhyZWFkIGFsc28gaW50ZXJydXB0ZWQKKwkJCXNjaGVkdWxlZFNlcnZpY2Uuc2h1dGRvd25Ob3coKTsKKwkJCS8vIFByZXNlcnZlIGludGVycnVwdCBzdGF0dXMKKwkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCXRyeSB7CisJCQljb21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljLmNsZWFuQ29tcG9uZW50cyhjb21wb25lbnRzVG9DbGVhbik7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlsb2cuZXJyb3IoInVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCIsIGUpOworCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBuZXcgT2JqZWN0KCkgeworCQkJfS5nZXRDbGFzcygpLmdldEVuY2xvc2luZ01ldGhvZCgpLmdldE5hbWUoKTsKKworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlQ29tcG9uZW50Q2xlYW5lclN5c3RlbUVycm9yLCBtZXRob2ROYW1lLCBlLmdldE1lc3NhZ2UoKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVDb21wb25lbnRDbGVhbmVyU3lzdGVtRXJyb3IoIkFzZGNDb21wb25lbnRzQ2xlYW5lclRhc2stcnVuIiwgZS5nZXRNZXNzYWdlKCkpOworCQl9CisKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9jbGVhbi9Db21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9jbGVhbi9Db21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyYjU1YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2NsZWFuL0NvbXBvbmVudHNDbGVhbkJ1c2luZXNzTG9naWMuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5jbGVhbjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQmFzZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc291cmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuU2VydmljZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJjb21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQmFzZUJ1c2luZXNzTG9naWMgeworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIHJlc291cmNlQnVzaW5lc3NMb2dpYzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFNlcnZpY2VCdXNpbmVzc0xvZ2ljIHNlcnZpY2VCdXNpbmVzc0xvZ2ljOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudHNDbGVhbkJ1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBNYXA8Tm9kZVR5cGVFbnVtLCBFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4+IGNsZWFuQ29tcG9uZW50cyhMaXN0PE5vZGVUeXBlRW51bT4gY29tcG9uZW50c1RvQ2xlYW4pIHsKKworCQlNYXA8Tm9kZVR5cGVFbnVtLCBFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4+IGNsZWFuZWRDb21wb25lbnRzID0gbmV3IEhhc2hNYXA8Tm9kZVR5cGVFbnVtLCBFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4+KCk7CisKKwkJbG9nLnRyYWNlKCJzdGFydCBjbGVhbkNvbXBvbmVudHMiKTsKKwkJZm9yIChOb2RlVHlwZUVudW0gdHlwZSA6IGNvbXBvbmVudHNUb0NsZWFuKSB7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgUmVzb3VyY2U6CisJCQkJcHJvY2Vzc0RlbGV0aW9uRm9yVHlwZShjbGVhbmVkQ29tcG9uZW50cywgTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZUJ1c2luZXNzTG9naWMpOworCQkJCWJyZWFrOworCQkJY2FzZSBTZXJ2aWNlOgorCQkJCXByb2Nlc3NEZWxldGlvbkZvclR5cGUoY2xlYW5lZENvbXBvbmVudHMsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBzZXJ2aWNlQnVzaW5lc3NMb2dpYyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWxvZy5kZWJ1Zygie30gY29tcG9uZW50IHR5cGUgZG9lcyBub3QgaGF2ZSBjbGVhbmluZyBtZXRob2QgZGVmaW5lZCIsIHR5cGUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJbG9nLnRyYWNlKCJlbmQgY2xlYW5Db21wb25lbnRzIik7CisJCXJldHVybiBjbGVhbmVkQ29tcG9uZW50czsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0RlbGV0aW9uRm9yVHlwZShNYXA8Tm9kZVR5cGVFbnVtLCBFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4+IGNsZWFuZWRDb21wb25lbnRzLCBOb2RlVHlwZUVudW0gdHlwZSwgQ29tcG9uZW50QnVzaW5lc3NMb2dpYyBjb21wb25lbnRCdXNpbmVzc0xvZ2ljKSB7CisJCUVpdGhlcjxMaXN0PFN0cmluZz4sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVNYXJrZWRSZXNvdXJjZXMgPSBjb21wb25lbnRCdXNpbmVzc0xvZ2ljLmRlbGV0ZU1hcmtlZENvbXBvbmVudHMoKTsKKwkJaWYgKGRlbGV0ZU1hcmtlZFJlc291cmNlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNsZWFuIGRlbGV0ZWQgY29tcG9uZW50cyBvZiB0eXBlIHt9LiBlcnJvcjoge30iLCB0eXBlLCBkZWxldGVNYXJrZWRSZXNvdXJjZXMucmlnaHQoKS52YWx1ZSgpLmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CisJCX0gZWxzZSB7CisJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImxpc3Qgb2YgZGVsZXRlZCBjb21wb25lbnRzIC0gdHlwZSAiICsgdHlwZSArICI6ICIpOworCQkJCWZvciAoU3RyaW5nIGlkIDogZGVsZXRlTWFya2VkUmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpKSB7CisJCQkJCXNiLmFwcGVuZChpZCkuYXBwZW5kKCIsICIpOworCQkJCX0KKwkJCQlsb2cuZGVidWcoc2IudG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwkJY2xlYW5lZENvbXBvbmVudHMucHV0KHR5cGUsIGRlbGV0ZU1hcmtlZFJlc291cmNlcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9BcnRpZmFjdEluZm9JbXBsLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0FydGlmYWN0SW5mb0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWExMjcwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9BcnRpZmFjdEluZm9JbXBsLmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RJbmZvSW1wbCBpbXBsZW1lbnRzIElBcnRpZmFjdEluZm8geworCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3ROYW1lOworCXByaXZhdGUgQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGU7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RVUkw7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RDaGVja3N1bTsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdERlc2NyaXB0aW9uOworCXByaXZhdGUgSW50ZWdlciBhcnRpZmFjdFRpbWVvdXQ7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RVVUlEOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0VmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBnZW5lcmF0ZWRGcm9tVVVJRDsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiByZWxhdGVkQXJ0aWZhY3RzOworCisJcHVibGljIEFydGlmYWN0SW5mb0ltcGwoKSB7CisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdEluZm9JbXBsKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZiwgU3RyaW5nIGdlbmVyYXRlZEZyb21VVUlELCBMaXN0PFN0cmluZz4gcmVsYXRlZEFydGlmYWN0cykgeworCQlhcnRpZmFjdE5hbWUgPSBhcnRpZmFjdERlZi5nZXRBcnRpZmFjdE5hbWUoKTsKKwkJYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5maW5kVHlwZShhcnRpZmFjdERlZi5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCWFydGlmYWN0Q2hlY2tzdW0gPSBhcnRpZmFjdERlZi5nZXRBcnRpZmFjdENoZWNrc3VtKCk7CisJCWFydGlmYWN0RGVzY3JpcHRpb24gPSBhcnRpZmFjdERlZi5nZXREZXNjcmlwdGlvbigpOworCQlhcnRpZmFjdFRpbWVvdXQgPSBhcnRpZmFjdERlZi5nZXRUaW1lb3V0KCk7CisJCWFydGlmYWN0VVVJRCA9IGFydGlmYWN0RGVmLmdldEFydGlmYWN0VVVJRCgpOworCQlhcnRpZmFjdFZlcnNpb24gPSBhcnRpZmFjdERlZi5nZXRBcnRpZmFjdFZlcnNpb24oKTsKKwkJdGhpcy5yZWxhdGVkQXJ0aWZhY3RzID0gcmVsYXRlZEFydGlmYWN0czsKKwkJdGhpcy5nZW5lcmF0ZWRGcm9tVVVJRCA9IGdlbmVyYXRlZEZyb21VVUlEOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxBcnRpZmFjdEluZm9JbXBsPiBjb252ZXJ0VG9BcnRpZmFjdEluZm9JbXBsKFNlcnZpY2Ugc2VydmljZSwgQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSwgQ29sbGVjdGlvbjxBcnRpZmFjdERlZmluaXRpb24+IGxpc3QpIHsKKwkJTGlzdDxBcnRpZmFjdEluZm9JbXBsPiByZXQgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0SW5mb0ltcGw+KCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPj4gYXJ0aWZhY3RJZFRvRGVmID0gbGlzdC5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShBcnRpZmFjdERlZmluaXRpb246OmdldFVuaXF1ZUlkKSk7CisJCWlmIChsaXN0ICE9IG51bGwpIHsKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmIDogbGlzdCkgeworCQkJCVN0cmluZyBnZW5lcmF0ZWRGcm9tVVVJRCA9IG51bGw7CisJCQkJaWYgKGFydGlmYWN0RGVmLmdldEdlbmVyYXRlZEZyb21JZCgpICE9IG51bGwgJiYgIWFydGlmYWN0RGVmLmdldEdlbmVyYXRlZEZyb21JZCgpLmlzRW1wdHkoKSkgeworCQkJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RGcm9tID0gYXJ0aWZhY3RJZFRvRGVmLmdldChhcnRpZmFjdERlZi5nZXRHZW5lcmF0ZWRGcm9tSWQoKSkuZ2V0KDApOworCQkJCQlnZW5lcmF0ZWRGcm9tVVVJRCA9IGFydGlmYWN0RnJvbS5nZXRBcnRpZmFjdFVVSUQoKTsKKwkJCQl9CisJCQkJQXJ0aWZhY3RJbmZvSW1wbCBhcnRpZmFjdEluZm9JbXBsID0gbmV3IEFydGlmYWN0SW5mb0ltcGwoYXJ0aWZhY3REZWYsIGdlbmVyYXRlZEZyb21VVUlELCBnZXRVcGRhdGVkUmVxdWlyZWRBcnRpZmFjdHNGcm9tTmFtZXNUb1V1aWRzKGFydGlmYWN0RGVmLCByZXNvdXJjZUluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSkpOworCQkJCVN0cmluZyBhcnRpZmFjdFVSTCA9IFNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyLmJ1aWxkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0VXJsKHNlcnZpY2UsIHJlc291cmNlSW5zdGFuY2UsIGFydGlmYWN0RGVmLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJCQlhcnRpZmFjdEluZm9JbXBsLnNldEFydGlmYWN0VVJMKGFydGlmYWN0VVJMKTsKKwkJCQlyZXQuYWRkKGFydGlmYWN0SW5mb0ltcGwpOworCQkJfQorCQl9CisJCXJldHVybiByZXQ7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gY29udmVydFNlcnZpY2VBcnRpZmFjdFRvQXJ0aWZhY3RJbmZvSW1wbChTZXJ2aWNlIHNlcnZpY2UsIENvbGxlY3Rpb248QXJ0aWZhY3REZWZpbml0aW9uPiBsaXN0KSB7CisJCUxpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gcmV0ID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdEluZm9JbXBsPigpOworCQlNYXA8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+IGFydGlmYWN0SWRUb0RlZiA9IGxpc3Quc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoQXJ0aWZhY3REZWZpbml0aW9uOjpnZXRVbmlxdWVJZCkpOworCQlpZiAobGlzdCAhPSBudWxsKSB7CisJCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZiA6IGxpc3QpIHsKKwkJCQlTdHJpbmcgZ2VuZXJhdGVkRnJvbVVVSUQgPSBudWxsOworCQkJCWlmIChhcnRpZmFjdERlZi5nZXRHZW5lcmF0ZWRGcm9tSWQoKSAhPSBudWxsICYmICFhcnRpZmFjdERlZi5nZXRHZW5lcmF0ZWRGcm9tSWQoKS5pc0VtcHR5KCkpIHsKKwkJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RnJvbSA9IGFydGlmYWN0SWRUb0RlZi5nZXQoYXJ0aWZhY3REZWYuZ2V0R2VuZXJhdGVkRnJvbUlkKCkpLmdldCgwKTsKKwkJCQkJZ2VuZXJhdGVkRnJvbVVVSUQgPSBhcnRpZmFjdEZyb20uZ2V0QXJ0aWZhY3RVVUlEKCk7CisJCQkJfQorCQkJCUFydGlmYWN0SW5mb0ltcGwgYXJ0aWZhY3RJbmZvSW1wbCA9IG5ldyBBcnRpZmFjdEluZm9JbXBsKGFydGlmYWN0RGVmLCBnZW5lcmF0ZWRGcm9tVVVJRCwgZ2V0VXBkYXRlZFJlcXVpcmVkQXJ0aWZhY3RzRnJvbU5hbWVzVG9VdWlkcyhhcnRpZmFjdERlZiwgc2VydmljZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkpKTsKKwkJCQlTdHJpbmcgYXJ0aWZhY3RVUkwgPSBTZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlci5idWlsZFNlcnZpY2VBcnRpZmFjdFVybChzZXJ2aWNlLCBhcnRpZmFjdERlZi5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCQkJYXJ0aWZhY3RJbmZvSW1wbC5zZXRBcnRpZmFjdFVSTChhcnRpZmFjdFVSTCk7CisJCQkJcmV0LmFkZChhcnRpZmFjdEluZm9JbXBsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0OworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFVwZGF0ZWRSZXF1aXJlZEFydGlmYWN0c0Zyb21OYW1lc1RvVXVpZHMoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiwgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMpIHsKKwkJTGlzdDxTdHJpbmc+IHJlcXVpcmVkQXJ0aWZhY3RzID0gbnVsbDsKKwkJaWYgKGFydGlmYWN0RGVmaW5pdGlvbiAhPSBudWxsICYmIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRSZXF1aXJlZEFydGlmYWN0cygpICE9IG51bGwgJiYgIWFydGlmYWN0RGVmaW5pdGlvbi5nZXRSZXF1aXJlZEFydGlmYWN0cygpLmlzRW1wdHkoKSAmJiBhcnRpZmFjdHMgIT0gbnVsbCAmJiAhYXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJcmVxdWlyZWRBcnRpZmFjdHMgPSBhcnRpZmFjdHMudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKGFydCAtPiBhcnRpZmFjdERlZmluaXRpb24uZ2V0UmVxdWlyZWRBcnRpZmFjdHMoKS5jb250YWlucyhhcnQuZ2V0QXJ0aWZhY3ROYW1lKCkpKS5tYXAoYXJ0IC0+IGFydC5nZXRBcnRpZmFjdFVVSUQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJfQorCQlyZXR1cm4gcmVxdWlyZWRBcnRpZmFjdHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdE5hbWUoKSB7CisJCXJldHVybiBhcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3ROYW1lKFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIEFydGlmYWN0VHlwZUVudW0gZ2V0QXJ0aWZhY3RUeXBlKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSkgeworCQl0aGlzLmFydGlmYWN0VHlwZSA9IGFydGlmYWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VVJMKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RVUkw7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RVUkwoU3RyaW5nIGFydGlmYWN0VVJMKSB7CisJCXRoaXMuYXJ0aWZhY3RVUkwgPSBhcnRpZmFjdFVSTDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0Q2hlY2tzdW0oKSB7CisJCXJldHVybiBhcnRpZmFjdENoZWNrc3VtOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0Q2hlY2tzdW0oU3RyaW5nIGFydGlmYWN0Q2hlY2tzdW0pIHsKKwkJdGhpcy5hcnRpZmFjdENoZWNrc3VtID0gYXJ0aWZhY3RDaGVja3N1bTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGVzY3JpcHRpb24oU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb24pIHsKKwkJdGhpcy5hcnRpZmFjdERlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRBcnRpZmFjdFRpbWVvdXQoKSB7CisJCXJldHVybiBhcnRpZmFjdFRpbWVvdXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RUaW1lb3V0KEludGVnZXIgYXJ0aWZhY3RUaW1lb3V0KSB7CisJCXRoaXMuYXJ0aWZhY3RUaW1lb3V0ID0gYXJ0aWZhY3RUaW1lb3V0OworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVsYXRlZEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIHJlbGF0ZWRBcnRpZmFjdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVsYXRlZEFydGlmYWN0cyhMaXN0PFN0cmluZz4gcmVsYXRlZEFydGlmYWN0cykgeworCQl0aGlzLnJlbGF0ZWRBcnRpZmFjdHMgPSByZWxhdGVkQXJ0aWZhY3RzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQXJ0aWZhY3RJbmZvSW1wbCBbYXJ0aWZhY3ROYW1lPSIgKyBhcnRpZmFjdE5hbWUgKyAiLCBhcnRpZmFjdFR5cGU9IiArIGFydGlmYWN0VHlwZSArICIsIGFydGlmYWN0VVJMPSIgKyBhcnRpZmFjdFVSTCArICIsIGFydGlmYWN0Q2hlY2tzdW09IiArIGFydGlmYWN0Q2hlY2tzdW0gKyAiLCBhcnRpZmFjdERlc2NyaXB0aW9uPSIgKyBhcnRpZmFjdERlc2NyaXB0aW9uICsgIiwgYXJ0aWZhY3RUaW1lb3V0PSIKKwkJCQkrIGFydGlmYWN0VGltZW91dCArICIsIGFydGlmYWN0VVVJRD0iICsgYXJ0aWZhY3RVVUlEICsgIiwgYXJ0aWZhY3RWZXJzaW9uPSIgKyBhcnRpZmFjdFZlcnNpb24gKyAiLCBnZW5lcmF0ZWRGcm9tVVVJRD0iICsgZ2VuZXJhdGVkRnJvbVVVSUQgKyAiLCByZWxhdGVkQXJ0aWZhY3RzPSIgKyByZWxhdGVkQXJ0aWZhY3RzICsgIl0iOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RVVUlEKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VVVJRChTdHJpbmcgYXJ0aWZhY3RVVUlEKSB7CisJCXRoaXMuYXJ0aWZhY3RVVUlEID0gYXJ0aWZhY3RVVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RWZXJzaW9uKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VmVyc2lvbihTdHJpbmcgYXJ0aWZhY3RWZXJzaW9uKSB7CisJCXRoaXMuYXJ0aWZhY3RWZXJzaW9uID0gYXJ0aWZhY3RWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdGVkRnJvbVVVSUQoKSB7CisJCXJldHVybiBnZW5lcmF0ZWRGcm9tVVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRGcm9tVVVJRChTdHJpbmcgZ2VuZXJhdGVkRnJvbVVVSUQpIHsKKwkJdGhpcy5nZW5lcmF0ZWRGcm9tVVVJRCA9IGdlbmVyYXRlZEZyb21VVUlEOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9DYW1icmlhRXJyb3JSZXNwb25zZS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9DYW1icmlhRXJyb3JSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWVhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0NhbWJyaWFFcnJvclJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudC5DYW1icmlhT3BlcmF0aW9uU3RhdHVzOworCitwdWJsaWMgY2xhc3MgQ2FtYnJpYUVycm9yUmVzcG9uc2UgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9PSyA9IDIwMDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gNTAwOworCisJQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXM7CisJSW50ZWdlciBodHRwQ29kZTsKKwlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwlwdWJsaWMgQ2FtYnJpYUVycm9yUmVzcG9uc2UoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIENhbWJyaWFFcnJvclJlc3BvbnNlKENhbWJyaWFPcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3BlcmF0aW9uU3RhdHVzID0gb3BlcmF0aW9uU3RhdHVzOworCX0KKworCXB1YmxpYyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cywgSW50ZWdlciBodHRwQ29kZSkgeworCQlzdXBlcigpOworCQl0aGlzLm9wZXJhdGlvblN0YXR1cyA9IG9wZXJhdGlvblN0YXR1czsKKwkJdGhpcy5odHRwQ29kZSA9IGh0dHBDb2RlOworCX0KKworCXB1YmxpYyBDYW1icmlhT3BlcmF0aW9uU3RhdHVzIGdldE9wZXJhdGlvblN0YXR1cygpIHsKKwkJcmV0dXJuIG9wZXJhdGlvblN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25TdGF0dXMoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMpIHsKKwkJdGhpcy5vcGVyYXRpb25TdGF0dXMgPSBvcGVyYXRpb25TdGF0dXM7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0SHR0cENvZGUoKSB7CisJCXJldHVybiBodHRwQ29kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIdHRwQ29kZShJbnRlZ2VyIGh0dHBDb2RlKSB7CisJCXRoaXMuaHR0cENvZGUgPSBodHRwQ29kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRWYXJpYWJsZShTdHJpbmcgdmFyaWFibGUpIHsKKwkJdmFyaWFibGVzLmFkZCh2YXJpYWJsZSk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYXJpYWJsZXMoKSB7CisJCXJldHVybiB2YXJpYWJsZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFyaWFibGVzKExpc3Q8U3RyaW5nPiB2YXJpYWJsZXMpIHsKKwkJdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJDYW1icmlhRXJyb3JSZXNwb25zZSBbb3BlcmF0aW9uU3RhdHVzPSIgKyBvcGVyYXRpb25TdGF0dXMgKyAiLCBodHRwQ29kZT0iICsgaHR0cENvZGUgKyAiLCB2YXJpYWJsZXM9IiArIHZhcmlhYmxlcyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvQ2FtYnJpYUhhbmRsZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvQ2FtYnJpYUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI4ZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9DYW1icmlhSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjEwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LkNhbWJyaWFPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmF0dC5uc2EuYXBpQ2xpZW50Lmh0dHAuSHR0cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYXR0Lm5zYS5hcGlDbGllbnQuaHR0cC5IdHRwT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmF0dC5uc2EuY2FtYnJpYS5jbGllbnQuQ2FtYnJpYUJhdGNoaW5nUHVibGlzaGVyOworaW1wb3J0IGNvbS5hdHQubnNhLmNhbWJyaWEuY2xpZW50LkNhbWJyaWFDbGllbnQuQ2FtYnJpYUFwaUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uYXR0Lm5zYS5jYW1icmlhLmNsaWVudC5DYW1icmlhQ2xpZW50QnVpbGRlcnMuVG9waWNNYW5hZ2VyQnVpbGRlcjsKK2ltcG9ydCBjb20uYXR0Lm5zYS5jYW1icmlhLmNsaWVudC5DYW1icmlhQ2xpZW50QnVpbGRlcnMuUHVibGlzaGVyQnVpbGRlcjsKK2ltcG9ydCBjb20uYXR0Lm5zYS5jYW1icmlhLmNsaWVudC5DYW1icmlhQ2xpZW50QnVpbGRlcnMuQ29uc3VtZXJCdWlsZGVyOworaW1wb3J0IGNvbS5hdHQubnNhLmNhbWJyaWEuY2xpZW50LkNhbWJyaWFDbGllbnRCdWlsZGVycy5JZGVudGl0eU1hbmFnZXJCdWlsZGVyOworaW1wb3J0IGNvbS5hdHQubnNhLmNhbWJyaWEuY2xpZW50LkNhbWJyaWFDb25zdW1lcjsKK2ltcG9ydCBjb20uYXR0Lm5zYS5jYW1icmlhLmNsaWVudC5DYW1icmlhSWRlbnRpdHlNYW5hZ2VyOworaW1wb3J0IGNvbS5hdHQubnNhLmNhbWJyaWEuY2xpZW50LkNhbWJyaWFQdWJsaXNoZXIubWVzc2FnZTsKK2ltcG9ydCBjb20uYXR0Lm5zYS5jYW1icmlhLmNsaWVudC5DYW1icmlhVG9waWNNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDYW1icmlhSGFuZGxlciB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2FtYnJpYUhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlRJVElPTl9LRVkgPSAiYXNkYyIgKyAiYWEiOworCisJcHJpdmF0ZSBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJLyoqCisJICogcHJvY2VzcyB0aGUgcmVzcG9uc2UgZXJyb3IgZnJvbSBDYW1icmlhIGNsaWVudAorCSAqIAorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgSW50ZWdlciBwcm9jZXNzTWVzc2FnZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCisJCVN0cmluZ1tdIHBhdHRlcm5zID0geyAiKEhUVFAgU3RhdHVzICkoXFxkXFxkXFxkKSIsICIoSFRUUC9cXGQuXFxkICkoXFxkXFxkXFxkKSIgfTsKKworCQlJbnRlZ2VyIHJlc3VsdCA9IGNoZWNrUGF0dGVybihwYXR0ZXJuc1swXSwgbWVzc2FnZSwgMik7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXN1bHQgPSBjaGVja1BhdHRlcm4ocGF0dGVybnNbMV0sIG1lc3NhZ2UsIDIpOworCisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKKwkvKioKKwkgKiBjaGVjayB3aGV0aGVyIHRoZSBtZXNzYWdlIGhhcyBhIG1hdGNoIHdpdGggYSBnaXZlbiBwYXR0ZXJuIGluc2lkZSBpdAorCSAqIAorCSAqIEBwYXJhbSBwYXR0ZXJuU3RyCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiBAcGFyYW0gZ3JvdXBJbmRleAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEludGVnZXIgY2hlY2tQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyLCBTdHJpbmcgbWVzc2FnZSwgaW50IGdyb3VwSW5kZXgpIHsKKwkJSW50ZWdlciByZXN1bHQgPSBudWxsOworCisJCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuU3RyKTsKKwkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG1lc3NhZ2UpOworCQlib29sZWFuIGZpbmQgPSBtYXRjaGVyLmZpbmQoKTsKKwkJaWYgKGZpbmQpIHsKKwkJCVN0cmluZyBodHRwQ29kZSA9IG1hdGNoZXIuZ3JvdXAoZ3JvdXBJbmRleCk7CisJCQlpZiAoaHR0cENvZGUgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXJlc3VsdCA9IEludGVnZXIudmFsdWVPZihodHRwQ29kZSk7CisJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gcGFyc2UgaHR0cCBjb2RlIHt9IiwgaHR0cENvZGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHJldHJpZXZlIGFsbCB0b3BpY3MgZnJvbSBVLUVCIHNlcnZlcgorCSAqIAorCSAqIEBwYXJhbSBob3N0U2V0CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8U2V0PFN0cmluZz4sIENhbWJyaWFFcnJvclJlc3BvbnNlPiBnZXRUb3BpY3MoTGlzdDxTdHJpbmc+IGhvc3RTZXQpIHsKKworCQlDYW1icmlhVG9waWNNYW5hZ2VyIGNyZWF0ZVRvcGljTWFuYWdlciA9IG51bGw7CisJCXRyeSB7CisKKwkJCWNyZWF0ZVRvcGljTWFuYWdlciA9IG5ldyBUb3BpY01hbmFnZXJCdWlsZGVyKCkudXNpbmdIb3N0cyhob3N0U2V0KS5idWlsZCgpOworCQkJU2V0PFN0cmluZz4gdG9waWNzID0gY3JlYXRlVG9waWNNYW5hZ2VyLmdldFRvcGljcygpOworCisJCQlpZiAodG9waWNzID09IG51bGwgfHwgdHJ1ZSA9PSB0b3BpY3MuaXNFbXB0eSgpKSB7CisJCQkJQ2FtYnJpYUVycm9yUmVzcG9uc2UgY2FtYnJpYUVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsIG51bGwpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY2FtYnJpYUVycm9yUmVzcG9uc2UpOworCQkJfQorCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodG9waWNzKTsKKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IHByb2Nlc3NFcnJvcihlKTsKKworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggdG9waWNzIGZyb20gVS1FQiBzZXJ2ZXIiLCBlKTsKKwkJCXdyaXRlRXJyb3JUb0xvZyhjYW1icmlhRXJyb3JSZXNwb25zZSwgZS5nZXRNZXNzYWdlKCksIG1ldGhvZE5hbWUsICJnZXQgdG9waWNzIik7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY2FtYnJpYUVycm9yUmVzcG9uc2UpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGNyZWF0ZVRvcGljTWFuYWdlciAhPSBudWxsKSB7CisJCQkJY3JlYXRlVG9waWNNYW5hZ2VyLmNsb3NlKCk7CisJCQl9CisJCX0KKworCX0KKworCS8qKgorCSAqIHByb2Nlc3MgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSBDYW1icmlhIGNsaWVudC4KKwkgKiAKKwkgKiBzZXQgQ2FtYnJpYSBzdGF0dXMgYW5kIGh0dHAgY29kZSBpbiBjYXNlIHdlIHN1Y2NlZWQgdG8gZmV0Y2ggaXQKKwkgKiAKKwkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgQ2FtYnJpYUVycm9yUmVzcG9uc2UgcHJvY2Vzc0Vycm9yKEV4Y2VwdGlvbiBlKSB7CisKKwkJQ2FtYnJpYUVycm9yUmVzcG9uc2UgY2FtYnJpYUVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoKTsKKworCQlJbnRlZ2VyIGh0dHBDb2RlID0gcHJvY2Vzc01lc3NhZ2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCisJCWlmIChodHRwQ29kZSAhPSBudWxsKSB7CisJCQljYW1icmlhRXJyb3JSZXNwb25zZS5zZXRIdHRwQ29kZShodHRwQ29kZSk7CisJCQlzd2l0Y2ggKGh0dHBDb2RlLmludFZhbHVlKCkpIHsKKworCQkJY2FzZSA0MDE6CisJCQkJY2FtYnJpYUVycm9yUmVzcG9uc2Uuc2V0T3BlcmF0aW9uU3RhdHVzKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuQVVUSEVOVElDQVRJT05fRVJST1IpOworCQkJCWJyZWFrOworCQkJY2FzZSA0MDk6CisJCQkJY2FtYnJpYUVycm9yUmVzcG9uc2Uuc2V0T3BlcmF0aW9uU3RhdHVzKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuVE9QSUNfQUxSRUFEWV9FWElTVCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDUwMDoKKwkJCQljYW1icmlhRXJyb3JSZXNwb25zZS5zZXRPcGVyYXRpb25TdGF0dXMoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljYW1icmlhRXJyb3JSZXNwb25zZS5zZXRPcGVyYXRpb25TdGF0dXMoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5DT05OTkVDVElPTl9FUlJPUik7CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJCVRocm93YWJsZSB0aHJvd2FibGUgPSBlLmdldENhdXNlKCk7CisJCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7CisKKwkJCQlUaHJvd2FibGUgY2F1c2UgPSB0aHJvd2FibGUuZ2V0Q2F1c2UoKTsKKworCQkJCWlmIChjYXVzZSAhPSBudWxsKSB7CisJCQkJCUNsYXNzPD8+IGNsYXp6ID0gY2F1c2UuZ2V0Q2xhc3MoKTsKKwkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKwkJCQkJaWYgKGNsYXNzTmFtZS5lbmRzV2l0aCgiVW5rbm93bkhvc3RFeGNlcHRpb24iKSkgeworCQkJCQkJY2FtYnJpYUVycm9yUmVzcG9uc2Uuc2V0T3BlcmF0aW9uU3RhdHVzKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuVU5LTk9XTl9IT1NUX0VSUk9SKTsKKwkJCQkJCWNhbWJyaWFFcnJvclJlc3BvbnNlLmFkZFZhcmlhYmxlKG1lc3NhZ2UpOworCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gZm91bmQpIHsKKwkJCQljYW1icmlhRXJyb3JSZXNwb25zZS5zZXRPcGVyYXRpb25TdGF0dXMoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5DT05OTkVDVElPTl9FUlJPUik7CisJCQkJY2FtYnJpYUVycm9yUmVzcG9uc2Uuc2V0SHR0cENvZGUoSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGNhbWJyaWFFcnJvclJlc3BvbnNlOworCX0KKworCS8qKgorCSAqIHdyaXRlIHRoZSBlcnJvciB0byB0aGUgbG9nCisJICogCisJICogQHBhcmFtIGNhbWJyaWFFcnJvclJlc3BvbnNlCisJICogQHBhcmFtIGVycm9yTWVzc2FnZQorCSAqIEBwYXJhbSBtZXRob2ROYW1lCisJICogQHBhcmFtIG9wZXJhdGlvbkRlc2MKKwkgKi8KKwlwcml2YXRlIHZvaWQgd3JpdGVFcnJvclRvTG9nKENhbWJyaWFFcnJvclJlc3BvbnNlIGNhbWJyaWFFcnJvclJlc3BvbnNlLCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIG9wZXJhdGlvbkRlc2MpIHsKKworCQlTdHJpbmcgaHR0cENvZGUgPSAoY2FtYnJpYUVycm9yUmVzcG9uc2UuZ2V0SHR0cENvZGUoKSA9PSBudWxsID8gIiIgOiBTdHJpbmcudmFsdWVPZihjYW1icmlhRXJyb3JSZXNwb25zZS5nZXRIdHRwQ29kZSgpKSk7CisKKwkJc3dpdGNoIChjYW1icmlhRXJyb3JSZXNwb25zZS5nZXRPcGVyYXRpb25TdGF0dXMoKSkgeworCQljYXNlIFVOS05PV05fSE9TVF9FUlJPUjoKKwkJCVN0cmluZyBob3N0bmFtZSA9IGNhbWJyaWFFcnJvclJlc3BvbnNlLmdldFZhcmlhYmxlcygpLmdldCgwKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYlVua293bkhvc3RFcnJvciwgbWV0aG9kTmFtZSwgaG9zdG5hbWUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViVW5rb3duSG9zdEVycm9yKG1ldGhvZE5hbWUsIGh0dHBDb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIEFVVEhFTlRJQ0FUSU9OX0VSUk9SOgorCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlVWViQXV0aGVudGljYXRpb25FcnJvciwgbWV0aG9kTmFtZSwgaHR0cENvZGUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViQXV0aGVudGljYXRpb25FcnJvcihtZXRob2ROYW1lLCBodHRwQ29kZSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05OTkVDVElPTl9FUlJPUjoKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYkNvbm5lY3Rpb25FcnJvciwgbWV0aG9kTmFtZSwgaHR0cENvZGUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViQ29ubmVjdGlvbkVycm9yKG1ldGhvZE5hbWUsIGh0dHBDb2RlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU5URVJOQUxfU0VSVkVSX0VSUk9SOgorCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlVWViU3lzdGVtRXJyb3IsIG1ldGhvZE5hbWUsIG9wZXJhdGlvbkRlc2MpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViU3lzdGVtRXJyb3IobWV0aG9kTmFtZSwgb3BlcmF0aW9uRGVzYyk7CisJCQlicmVhazsKKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBjcmVhdGUgYSB0b3BpYyBpZiBpdCBkb2VzIG5vdCBleGlzdHMgaW4gdGhlIHRvcGljc0xpc3QKKwkgKiAKKwkgKiBAcGFyYW0gaG9zdFNldAorCSAqICAgICAgICAgICAgLSBsaXN0IG9mIFUtRUIgc2VydmVycworCSAqIEBwYXJhbSBhcGlLZXkKKwkgKiBAcGFyYW0gc2VjcmV0S2V5CisJICogQHBhcmFtIHRvcGljc0xpc3QKKwkgKiAgICAgICAgICAgIC0gbGlzdCBvZiBleGlzdHMgdG9waWNzCisJICogQHBhcmFtIHRvcGljTmFtZQorCSAqICAgICAgICAgICAgLSB0b3BpYyB0byBjcmVhdGUKKwkgKiBAcGFyYW0gcGFydGl0aW9uQ291bnQKKwkgKiBAcGFyYW0gcmVwbGljYXRpb25Db3VudAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgQ2FtYnJpYUVycm9yUmVzcG9uc2UgY3JlYXRlVG9waWMoQ29sbGVjdGlvbjxTdHJpbmc+IGhvc3RTZXQsIFN0cmluZyBhcGlLZXksIFN0cmluZyBzZWNyZXRLZXksIFN0cmluZyB0b3BpY05hbWUsIGludCBwYXJ0aXRpb25Db3VudCwgaW50IHJlcGxpY2F0aW9uQ291bnQpIHsKKworCQlDYW1icmlhVG9waWNNYW5hZ2VyIGNyZWF0ZVRvcGljTWFuYWdlciA9IG51bGw7CisJCXRyeSB7CisJCQljcmVhdGVUb3BpY01hbmFnZXIgPSBuZXcgVG9waWNNYW5hZ2VyQnVpbGRlcigpLnVzaW5nSG9zdHMoaG9zdFNldCkuYXV0aGVudGljYXRlZEJ5KGFwaUtleSwgc2VjcmV0S2V5KS5idWlsZCgpOworCQkJY3JlYXRlVG9waWNNYW5hZ2VyLmNyZWF0ZVRvcGljKHRvcGljTmFtZSwgIkFTREMgZGlzdHJpYnV0aW9uIG5vdGlmaWNhdGlvbiB0b3BpYyIsIHBhcnRpdGlvbkNvdW50LCByZXBsaWNhdGlvbkNvdW50KTsKKworCQl9IGNhdGNoIChHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gfCBIdHRwRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHRvcGljIHt9IiwgdG9waWNOYW1lLCBlKTsKKwkJCVN0cmluZyBtZXRob2ROYW1lID0gbmV3IE9iamVjdCgpIHsKKwkJCX0uZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdNZXRob2QoKS5nZXROYW1lKCk7CisKKwkJCUNhbWJyaWFFcnJvclJlc3BvbnNlIGNhbWJyaWFFcnJvclJlc3BvbnNlID0gcHJvY2Vzc0Vycm9yKGUpOworCisJCQlpZiAoY2FtYnJpYUVycm9yUmVzcG9uc2UuZ2V0T3BlcmF0aW9uU3RhdHVzKCkgIT0gQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5UT1BJQ19BTFJFQURZX0VYSVNUKSB7CisJCQkJd3JpdGVFcnJvclRvTG9nKGNhbWJyaWFFcnJvclJlc3BvbnNlLCBlLmdldE1lc3NhZ2UoKSwgbWV0aG9kTmFtZSwgImNyZWF0ZSB0b3BpYyIpOworCQkJfQorCisJCQlyZXR1cm4gY2FtYnJpYUVycm9yUmVzcG9uc2U7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChjcmVhdGVUb3BpY01hbmFnZXIgIT0gbnVsbCkgeworCQkJCWNyZWF0ZVRvcGljTWFuYWdlci5jbG9zZSgpOworCQkJfQorCQl9CisJCXJldHVybiBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSyk7CisJfQorCisJcHVibGljIENhbWJyaWFFcnJvclJlc3BvbnNlIHVuUmVnaXN0ZXJGcm9tVG9waWMoQ29sbGVjdGlvbjxTdHJpbmc+IGhvc3RTZXQsIFN0cmluZyB0b3BpY05hbWUsIFN0cmluZyBtYW5hZ2VyQXBpS2V5LCBTdHJpbmcgbWFuYWdlclNlY3JldEtleSwgU3RyaW5nIHN1YnNjcmliZXJBcGlLZXksIFN1YnNjcmliZXJUeXBlRW51bSBzdWJzY3JpYmVyVHlwZUVudW0pIHsKKwkJQ2FtYnJpYVRvcGljTWFuYWdlciBjcmVhdGVUb3BpY01hbmFnZXIgPSBudWxsOworCQl0cnkgeworCQkJY3JlYXRlVG9waWNNYW5hZ2VyID0gbmV3IFRvcGljTWFuYWdlckJ1aWxkZXIoKS51c2luZ0hvc3RzKGhvc3RTZXQpLmF1dGhlbnRpY2F0ZWRCeShtYW5hZ2VyQXBpS2V5LCBtYW5hZ2VyU2VjcmV0S2V5KS5idWlsZCgpOworCisJCQlpZiAoc3Vic2NyaWJlclR5cGVFbnVtID09IFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUikgeworCQkJCWNyZWF0ZVRvcGljTWFuYWdlci5yZXZva2VQcm9kdWNlcih0b3BpY05hbWUsIHN1YnNjcmliZXJBcGlLZXkpOworCQkJfSBlbHNlIHsKKwkJCQljcmVhdGVUb3BpY01hbmFnZXIucmV2b2tlQ29uc3VtZXIodG9waWNOYW1lLCBzdWJzY3JpYmVyQXBpS2V5KTsKKwkJCX0KKworCQl9IGNhdGNoIChIdHRwT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gfCBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gdW5yZWdpc3RlciB7fSBmcm9tIHRvcGljIHt9IGFzIHt9IiwgbWFuYWdlckFwaUtleSwgdG9waWNOYW1lLCBzdWJzY3JpYmVyVHlwZUVudW0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLCBlKTsKKwkJCVN0cmluZyBtZXRob2ROYW1lID0gbmV3IE9iamVjdCgpIHsKKwkJCX0uZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdNZXRob2QoKS5nZXROYW1lKCk7CisKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYk9iamVjdE5vdEZvdW5kRXJyb3IsIG1ldGhvZE5hbWUsIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVVlYk9iamVjdE5vdEZvdW5kRXJyb3IobWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9CSkVDVF9OT1RfRk9VTkQsIEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5EKTsKKwkJCXJldHVybiBjYW1icmlhRXJyb3JSZXNwb25zZTsKKworCQl9IGNhdGNoIChIdHRwRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gdW5yZWdpc3RlciB7fSBmcm9tIHRvcGljIHt9IGFzIHByb2R1Y2VyIiwgbWFuYWdlckFwaUtleSwgdG9waWNOYW1lLCBlKTsKKwkJCVN0cmluZyBtZXRob2ROYW1lID0gbmV3IE9iamVjdCgpIHsKKwkJCX0uZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdNZXRob2QoKS5nZXROYW1lKCk7CisKKwkJCUNhbWJyaWFFcnJvclJlc3BvbnNlIGNhbWJyaWFFcnJvclJlc3BvbnNlID0gcHJvY2Vzc0Vycm9yKGUpOworCisJCQl3cml0ZUVycm9yVG9Mb2coY2FtYnJpYUVycm9yUmVzcG9uc2UsIGUuZ2V0TWVzc2FnZSgpLCBtZXRob2ROYW1lLCAidW5yZWdpc3RlciBmcm9tIHRvcGljIGFzICIgKyBzdWJzY3JpYmVyVHlwZUVudW0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTsKKworCQkJcmV0dXJuIGNhbWJyaWFFcnJvclJlc3BvbnNlOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGNyZWF0ZVRvcGljTWFuYWdlciAhPSBudWxsKSB7CisJCQkJY3JlYXRlVG9waWNNYW5hZ2VyLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LLCBIdHRwU3RhdHVzLlNDX09LKTsKKwkJcmV0dXJuIGNhbWJyaWFFcnJvclJlc3BvbnNlOworCX0KKworCS8qKgorCSAqIAorCSAqIHJlZ2lzdGVyIGEgcHVibGljIGtleSAoc3Vic2NyaWJlcklkKSB0byBhIGdpdmVuIHRvcGljIGFzIGEgQ09OU1VNRVIgb3IgUFJPRFVDRVIKKwkgKiAKKwkgKiBAcGFyYW0gaG9zdFNldAorCSAqIEBwYXJhbSB0b3BpY05hbWUKKwkgKiBAcGFyYW0gbWFuYWdlckFwaUtleQorCSAqIEBwYXJhbSBtYW5hZ2VyU2VjcmV0S2V5CisJICogQHBhcmFtIHN1YnNjcmliZXJBcGlLZXkKKwkgKiBAcGFyYW0gc3Vic2NyaWJlclR5cGVFbnVtCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBDYW1icmlhRXJyb3JSZXNwb25zZSByZWdpc3RlclRvVG9waWMoQ29sbGVjdGlvbjxTdHJpbmc+IGhvc3RTZXQsIFN0cmluZyB0b3BpY05hbWUsIFN0cmluZyBtYW5hZ2VyQXBpS2V5LCBTdHJpbmcgbWFuYWdlclNlY3JldEtleSwgU3RyaW5nIHN1YnNjcmliZXJBcGlLZXksIFN1YnNjcmliZXJUeXBlRW51bSBzdWJzY3JpYmVyVHlwZUVudW0pIHsKKworCQlDYW1icmlhVG9waWNNYW5hZ2VyIGNyZWF0ZVRvcGljTWFuYWdlciA9IG51bGw7CisJCXRyeSB7CisJCQljcmVhdGVUb3BpY01hbmFnZXIgPSBuZXcgVG9waWNNYW5hZ2VyQnVpbGRlcigpLnVzaW5nSG9zdHMoaG9zdFNldCkuYXV0aGVudGljYXRlZEJ5KG1hbmFnZXJBcGlLZXksIG1hbmFnZXJTZWNyZXRLZXkpLmJ1aWxkKCk7CisKKwkJCWlmIChzdWJzY3JpYmVyVHlwZUVudW0gPT0gU3Vic2NyaWJlclR5cGVFbnVtLlBST0RVQ0VSKSB7CisJCQkJY3JlYXRlVG9waWNNYW5hZ2VyLmFsbG93UHJvZHVjZXIodG9waWNOYW1lLCBzdWJzY3JpYmVyQXBpS2V5KTsKKwkJCX0gZWxzZSB7CisJCQkJY3JlYXRlVG9waWNNYW5hZ2VyLmFsbG93Q29uc3VtZXIodG9waWNOYW1lLCBzdWJzY3JpYmVyQXBpS2V5KTsKKwkJCX0KKworCQl9IGNhdGNoIChIdHRwT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gfCBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gcmVnaXN0ZXIge30gdG8gdG9waWMge30gYXMge30iLCBtYW5hZ2VyQXBpS2V5LCB0b3BpY05hbWUsIHN1YnNjcmliZXJUeXBlRW51bS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksIGUpOworCQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBuZXcgT2JqZWN0KCkgeworCQkJfS5nZXRDbGFzcygpLmdldEVuY2xvc2luZ01ldGhvZCgpLmdldE5hbWUoKTsKKworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlVWViT2JqZWN0Tm90Rm91bmRFcnJvciwgbWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViT2JqZWN0Tm90Rm91bmRFcnJvcihtZXRob2ROYW1lLCBlLmdldE1lc3NhZ2UoKSk7CisKKwkJCUNhbWJyaWFFcnJvclJlc3BvbnNlIGNhbWJyaWFFcnJvclJlc3BvbnNlID0gbmV3IENhbWJyaWFFcnJvclJlc3BvbnNlKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuT0JKRUNUX05PVF9GT1VORCwgSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQpOworCQkJcmV0dXJuIGNhbWJyaWFFcnJvclJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEh0dHBFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byByZWdpc3RlciB7fSB0byB0b3BpYyB7fSBhcyB7fSIsIG1hbmFnZXJBcGlLZXksIHRvcGljTmFtZSwgc3Vic2NyaWJlclR5cGVFbnVtLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwgZSk7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IHByb2Nlc3NFcnJvcihlKTsKKworCQkJd3JpdGVFcnJvclRvTG9nKGNhbWJyaWFFcnJvclJlc3BvbnNlLCBlLmdldE1lc3NhZ2UoKSwgbWV0aG9kTmFtZSwgInJlZ2lzdGVyIHRvIHRvcGljIGFzICIgKyBzdWJzY3JpYmVyVHlwZUVudW0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTsKKworCQkJcmV0dXJuIGNhbWJyaWFFcnJvclJlc3BvbnNlOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGNyZWF0ZVRvcGljTWFuYWdlciAhPSBudWxsKSB7CisJCQkJY3JlYXRlVG9waWNNYW5hZ2VyLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LLCBIdHRwU3RhdHVzLlNDX09LKTsKKwkJcmV0dXJuIGNhbWJyaWFFcnJvclJlc3BvbnNlOworCX0KKworCS8qKgorCSAqIGNyZWF0ZSBhbmQgcmV0cmlldmUgYSBDYW1icmlhIENvbnN1bWVyIGZvciBhIHNwZWNpZmljIHRvcGljCisJICogCisJICogQHBhcmFtIGhvc3RTZXQKKwkgKiBAcGFyYW0gdG9waWNOYW1lCisJICogQHBhcmFtIGFwaUtleQorCSAqIEBwYXJhbSBzZWNyZXRLZXkKKwkgKiBAcGFyYW0gY29uc3VtZXJJZAorCSAqIEBwYXJhbSBjb25zdW1lckdyb3VwCisJICogQHBhcmFtIHRpbWVvdXRNUworCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBDYW1icmlhQ29uc3VtZXIgY3JlYXRlQ29uc3VtZXIoQ29sbGVjdGlvbjxTdHJpbmc+IGhvc3RTZXQsIFN0cmluZyB0b3BpY05hbWUsIFN0cmluZyBhcGlLZXksIFN0cmluZyBzZWNyZXRLZXksIFN0cmluZyBjb25zdW1lcklkLCBTdHJpbmcgY29uc3VtZXJHcm91cCwgaW50IHRpbWVvdXRNUykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQ2FtYnJpYUNvbnN1bWVyIGNvbnN1bWVyID0gbmV3IENvbnN1bWVyQnVpbGRlcigpLmF1dGhlbnRpY2F0ZWRCeShhcGlLZXksIHNlY3JldEtleSkua25vd25Bcyhjb25zdW1lckdyb3VwLCBjb25zdW1lcklkKS5vblRvcGljKHRvcGljTmFtZSkudXNpbmdIb3N0cyhob3N0U2V0KS53aXRoU29ja2V0VGltZW91dCh0aW1lb3V0TVMpLmJ1aWxkKCk7CisJCWNvbnN1bWVyLnNldEFwaUNyZWRlbnRpYWxzKGFwaUtleSwgc2VjcmV0S2V5KTsKKwkJcmV0dXJuIGNvbnN1bWVyOworCX0KKworCXB1YmxpYyB2b2lkIGNsb3NlQ29uc3VtZXIoQ2FtYnJpYUNvbnN1bWVyIGNvbnN1bWVyKSB7CisKKwkJaWYgKGNvbnN1bWVyICE9IG51bGwpIHsKKwkJCWNvbnN1bWVyLmNsb3NlKCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIHVzZSB0aGUgdG9waWNDb25zdW1lciB0byBmZXRjaCBtZXNzYWdlcyBmcm9tIHRvcGljLiBpbiBjYXNlIG5vIG1lc3NhZ2VzIHdlcmUgZmV0Y2hlZCwgZW1wdHkgQXJyYXlMaXN0IHdpbGwgYmUgcmV0dXJuZWQgKG5vdCBlcnJvcikKKwkgKiAKKwkgKiBAcGFyYW0gdG9waWNDb25zdW1lcgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEl0ZXJhYmxlPFN0cmluZz4sIENhbWJyaWFFcnJvclJlc3BvbnNlPiBmZXRjaEZyb21Ub3BpYyhDYW1icmlhQ29uc3VtZXIgdG9waWNDb25zdW1lcikgeworCisJCXRyeSB7CisJCQlJdGVyYWJsZTxTdHJpbmc+IG1lc3NhZ2VzID0gdG9waWNDb25zdW1lci5mZXRjaCgpOworCQkJaWYgKG1lc3NhZ2VzID09IG51bGwpIHsKKwkJCQltZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG1lc3NhZ2VzKTsKKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IHByb2Nlc3NFcnJvcihlKTsKKworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggZnJvbSBVLUVCIHRvcGljLiBlcnJvcj17fSIsIGUuZ2V0TWVzc2FnZSgpKTsKKwkJCXdyaXRlRXJyb3JUb0xvZyhjYW1icmlhRXJyb3JSZXNwb25zZSwgZS5nZXRNZXNzYWdlKCksIG1ldGhvZE5hbWUsICJnZXQgbWVzc2FnZXMgZnJvbSB0b3BpYyIpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggZnJvbSBVLUVCIHRvcGljIiwgZSk7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvciwgbWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IobWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjYW1icmlhRXJyb3JSZXNwb25zZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBQdWJsaXNoIG5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIGEgZ2l2ZW4gcXVldWUKKwkgKiAKKwkgKiBAcGFyYW0gdG9waWNOYW1lCisJICogQHBhcmFtIHVlYlB1YmxpY0tleQorCSAqIEBwYXJhbSB1ZWJTZWNyZXRLZXkKKwkgKiBAcGFyYW0gdWViU2VydmVycworCSAqIEBwYXJhbSBkYXRhCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBDYW1icmlhRXJyb3JSZXNwb25zZSBzZW5kTm90aWZpY2F0aW9uKFN0cmluZyB0b3BpY05hbWUsIFN0cmluZyB1ZWJQdWJsaWNLZXksIFN0cmluZyB1ZWJTZWNyZXRLZXksIExpc3Q8U3RyaW5nPiB1ZWJTZXJ2ZXJzLCBJTm90aWZpY2F0aW9uRGF0YSBkYXRhKSB7CisKKwkJQ2FtYnJpYUJhdGNoaW5nUHVibGlzaGVyIGNyZWF0ZVNpbXBsZVB1Ymxpc2hlciA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJU3RyaW5nIGpzb24gPSBnc29uLnRvSnNvbihkYXRhKTsKKwkJCWxvZ2dlci50cmFjZSgiQmVmb3JlIHNlbmRpbmcgbm90aWZpY2F0aW9uIGRhdGEge30gdG8gdG9waWMge30iLCBqc29uLCB0b3BpY05hbWUpOworCisJCQljcmVhdGVTaW1wbGVQdWJsaXNoZXIgPSBuZXcgUHVibGlzaGVyQnVpbGRlcigpLm9uVG9waWModG9waWNOYW1lKS51c2luZ0hvc3RzKHVlYlNlcnZlcnMpLmJ1aWxkKCk7CisJCQljcmVhdGVTaW1wbGVQdWJsaXNoZXIuc2V0QXBpQ3JlZGVudGlhbHModWViUHVibGljS2V5LCB1ZWJTZWNyZXRLZXkpOworCisJCQlpbnQgcmVzdWx0ID0gY3JlYXRlU2ltcGxlUHVibGlzaGVyLnNlbmQoUEFSVElUSU9OX0tFWSwganNvbik7CisKKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKDEgKiAxMDAwKTsKKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCBkdXJpbmcgc2xlZXAgYWZ0ZXIgc2VuZGluZyB0aGUgbWVzc2FnZS4iLCBlKTsKKwkJCX0KKworCQkJbG9nZ2VyLmRlYnVnKCJBZnRlciBzZW5kaW5nIG5vdGlmaWNhdGlvbiBkYXRhIHRvIHRvcGljIHt9LiByZXN1bHQgaXMge30iLCB0b3BpY05hbWUsIHJlc3VsdCk7CisKKwkJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENhbWJyaWFFcnJvclJlc3BvbnNlKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuT0ssIDIwMCk7CisKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBzZW5kIG5vdGlmaWNhdGlvbiB7fSB0byB0b3BpYyB7fSAiLCBkYXRhLCB0b3BpY05hbWUsIGUpOworCisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IHByb2Nlc3NFcnJvcihlKTsKKworCQkJd3JpdGVFcnJvclRvTG9nKGNhbWJyaWFFcnJvclJlc3BvbnNlLCBlLmdldE1lc3NhZ2UoKSwgbWV0aG9kTmFtZSwgInNlbmQgbm90aWZpY2F0aW9uIik7CisKKwkJCXJldHVybiBjYW1icmlhRXJyb3JSZXNwb25zZTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChjcmVhdGVTaW1wbGVQdWJsaXNoZXIgIT0gbnVsbCkgeworCQkJCWxvZ2dlci5kZWJ1ZygiQmVmb3JlIGNsb3NpbmcgcHVibGlzaGVyIik7CisJCQkJY3JlYXRlU2ltcGxlUHVibGlzaGVyLmNsb3NlKCk7CisJCQkJbG9nZ2VyLmRlYnVnKCJBZnRlciBjbG9zaW5nIHB1Ymxpc2hlciIpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY29udmVydExpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCkgeworCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCWlmIChsaXN0ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJCWJ1aWxkZXIuYXBwZW5kKGxpc3QuZ2V0KGkpKTsKKwkJCQlpZiAoaSA8IGxpc3Quc2l6ZSgpIC0gMSkgeworCQkJCQlidWlsZGVyLmFwcGVuZCgiLCIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIENhbWJyaWFFcnJvclJlc3BvbnNlIHNlbmROb3RpZmljYXRpb25BbmRDbG9zZShTdHJpbmcgdG9waWNOYW1lLCBTdHJpbmcgdWViUHVibGljS2V5LCBTdHJpbmcgdWViU2VjcmV0S2V5LCBMaXN0PFN0cmluZz4gdWViU2VydmVycywgSU5vdGlmaWNhdGlvbkRhdGEgZGF0YSwgbG9uZyB3YWl0QmVmb3JlQ2xvc2VUaW1lb3V0KSB7CisKKwkJQ2FtYnJpYUJhdGNoaW5nUHVibGlzaGVyIGNyZWF0ZVNpbXBsZVB1Ymxpc2hlciA9IG51bGw7CisKKwkJQ2FtYnJpYUVycm9yUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQl0cnkgeworCisJCQlTdHJpbmcganNvbiA9IGdzb24udG9Kc29uKGRhdGEpOworCQkJbG9nZ2VyLmRlYnVnKCJCZWZvcmUgc2VuZGluZyBub3RpZmljYXRpb24gZGF0YSB7fSB0byB0b3BpYyB7fSIsIGpzb24sIHRvcGljTmFtZSk7CisKKwkJCWNyZWF0ZVNpbXBsZVB1Ymxpc2hlciA9IG5ldyBQdWJsaXNoZXJCdWlsZGVyKCkub25Ub3BpYyh0b3BpY05hbWUpLnVzaW5nSG9zdHModWViU2VydmVycykuYnVpbGQoKTsKKwkJCWNyZWF0ZVNpbXBsZVB1Ymxpc2hlci5zZXRBcGlDcmVkZW50aWFscyh1ZWJQdWJsaWNLZXksIHVlYlNlY3JldEtleSk7CisKKwkJCWludCByZXN1bHQgPSBjcmVhdGVTaW1wbGVQdWJsaXNoZXIuc2VuZChQQVJUSVRJT05fS0VZLCBqc29uKTsKKworCQkJdHJ5IHsKKwkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgZHVyaW5nIHNsZWVwIGFmdGVyIHNlbmRpbmcgdGhlIG1lc3NhZ2UuIiwgZSk7CisJCQl9CisKKwkJCWxvZ2dlci5kZWJ1ZygiQWZ0ZXIgc2VuZGluZyBub3RpZmljYXRpb24gZGF0YSB0byB0b3BpYyB7fS4gcmVzdWx0IGlzIHt9IiwgdG9waWNOYW1lLCByZXN1bHQpOworCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIHNlbmQgbm90aWZpY2F0aW9uIHt9IHRvIHRvcGljIHt9ICIsIGRhdGEsIHRvcGljTmFtZSwgZSk7CisKKwkJCVN0cmluZyBtZXRob2ROYW1lID0gbmV3IE9iamVjdCgpIHsKKwkJCX0uZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdNZXRob2QoKS5nZXROYW1lKCk7CisKKwkJCXJlc3BvbnNlID0gcHJvY2Vzc0Vycm9yKGUpOworCisJCQl3cml0ZUVycm9yVG9Mb2cocmVzcG9uc2UsIGUuZ2V0TWVzc2FnZSgpLCBtZXRob2ROYW1lLCAic2VuZCBub3RpZmljYXRpb24iKTsKKworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKworCQlsb2dnZXIuZGVidWcoIkJlZm9yZSBjbG9zaW5nIHB1Ymxpc2hlci4gTWF4aW11bSB0aW1lb3V0IGlzIHt9IHNlY29uZHMuIiwgd2FpdEJlZm9yZUNsb3NlVGltZW91dCk7CisJCXRyeSB7CisJCQlMaXN0PG1lc3NhZ2U+IG1lc3NhZ2VzSW5RID0gY3JlYXRlU2ltcGxlUHVibGlzaGVyLmNsb3NlKHdhaXRCZWZvcmVDbG9zZVRpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMpOworCQkJaWYgKG1lc3NhZ2VzSW5RICE9IG51bGwgJiYgZmFsc2UgPT0gbWVzc2FnZXNJblEuaXNFbXB0eSgpKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJDYW1icmlhIGNsaWVudCByZXR1cm5lZCB7fSBub24gc2VudCBtZXNzYWdlcy4iLCBtZXNzYWdlc0luUS5zaXplKCkpOworCQkJCXJlc3BvbnNlID0gbmV3IENhbWJyaWFFcnJvclJlc3BvbnNlKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCA1MDApOworCQkJCVN0cmluZyBtZXRob2ROYW1lID0gbmV3IE9iamVjdCgpIHsKKwkJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCQkJCXdyaXRlRXJyb3JUb0xvZyhyZXNwb25zZSwgImNsb3NpbmcgcHVibGlzaGVyIHJldHVybmVkIG5vbiBzZW50IG1lc3NhZ2VzIiwgbWV0aG9kTmFtZSwgInNlbmQgbm90aWZpY2F0aW9uIik7CisJCQl9IGVsc2UgeworCQkJCWxvZ2dlci5kZWJ1ZygiTm8gbWVzc2FnZSBsZWZ0IGluIHRoZSBxdWV1ZSBhZnRlciBjbG9zaW5nIGNhbWJyaWEgcHVibGlzaGVyIik7CisJCQkJcmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSywgMjAwKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjbG9zZSBjYW1icmlhIHB1Ymxpc2hlciIsIGUpOworCQkJcmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsIDUwMCk7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCQkJd3JpdGVFcnJvclRvTG9nKHJlc3BvbnNlLCAiY2xvc2luZyBwdWJsaXNoZXIgcmV0dXJuZWQgbm9uIHNlbnQgbWVzc2FnZXMiLCBtZXRob2ROYW1lLCAic2VuZCBub3RpZmljYXRpb24iKTsKKwkJfQorCQlsb2dnZXIuZGVidWcoIkFmdGVyIGNsb3NpbmcgcHVibGlzaGVyIik7CisKKwkJcmV0dXJuIHJlc3BvbnNlOworCisJfQorCisJcHVibGljIENhbWJyaWFFcnJvclJlc3BvbnNlIGdldEFwaUtleShTdHJpbmcgc2VydmVyLCBTdHJpbmcgYXBpS2V5KSB7CisKKwkJQ2FtYnJpYUVycm9yUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCUxpc3Q8U3RyaW5nPiBob3N0U2V0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWhvc3RTZXQuYWRkKHNlcnZlcik7CisJCUNhbWJyaWFJZGVudGl0eU1hbmFnZXIgY3JlYXRlSWRlbnRpdHlNYW5hZ2VyID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNyZWF0ZUlkZW50aXR5TWFuYWdlciA9IG5ldyBJZGVudGl0eU1hbmFnZXJCdWlsZGVyKCkudXNpbmdIb3N0cyhob3N0U2V0KS5idWlsZCgpOworCQkJY3JlYXRlSWRlbnRpdHlNYW5hZ2VyLmdldEFwaUtleShhcGlLZXkpOworCQkJcmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSywgMjAwKTsKKworCQl9IGNhdGNoIChIdHRwRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gfCBDYW1icmlhQXBpRXhjZXB0aW9uIHwgR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGFwaSBrZXkge30gZnJvbSBzZXJ2ZXIgIiwgYXBpS2V5LCBzZXJ2ZXIsIGUpOworCisJCQlyZXNwb25zZSA9IHByb2Nlc3NFcnJvcihlKTsKKworCQl9CisKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EZUNvbmZpZ3VyYXRpb25TdGF0dXMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGVDb25maWd1cmF0aW9uU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0YzA4MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGVDb25maWd1cmF0aW9uU3RhdHVzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworcHVibGljIGVudW0gRGVDb25maWd1cmF0aW9uU3RhdHVzIHsKKworCU9LKCIiKSwgTUlTU0lOR19DT05GSUdVUkFUSU9OKCIiKTsKKworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJRGVDb25maWd1cmF0aW9uU3RhdHVzKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EaXN0cmlidXRpb25FbmdpbmUuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiMzFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLllhbWxUb09iamVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgiZGlzdHJpYnV0aW9uRW5naW5lIikKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25FbmdpbmUgaW1wbGVtZW50cyBJRGlzdHJpYnV0aW9uRW5naW5lIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBGUUROX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl4oW2EtekEtWjAtOV18W2EtekEtWjAtOV1bYS16QS1aMC05XFwtXXswLDYxfVthLXpBLVowLTldKShcXC4oW2EtekEtWjAtOV18W2EtekEtWjAtOV1bYS16QS1aMC05XFwtXXswLDYxfVthLXpBLVowLTldKSkqKDpbMC05XXsyLDR9KSokIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHM7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uU2VuZGVyIGRpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblNlbmRlcjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBTZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlciBzZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlcjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoIGRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGg7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGlzdHJpYnV0aW9uRW5naW5lLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrPiBlbnZOYW1lUGVySW5pdFRhc2sgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrPigpOworCXByaXZhdGUgTWFwPFN0cmluZywgRGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2s+IGVudk5hbWVQZXJQb2xsaW5nVGFzayA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2s+KCk7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEF0b21pY0Jvb2xlYW4+IGVudk5hbWVQZXJTdGF0dXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF0b21pY0Jvb2xlYW4+KCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKworCQlpZiAodHJ1ZSA9PSBlbnZOYW1lUGVySW5pdFRhc2suaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlmb3IgKERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrIHRhc2sgOiBlbnZOYW1lUGVySW5pdFRhc2sudmFsdWVzKCkpIHsKKwkJCWJvb2xlYW4gYWN0aXZlID0gdGFzay5pc0FjdGl2ZSgpOworCQkJaWYgKGFjdGl2ZSA9PSBmYWxzZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAUG9zdENvbnN0cnVjdAorCXByaXZhdGUgdm9pZCBpbml0KCkgeworCisJCWxvZ2dlci50cmFjZSgiRW50ZXIgaW5pdCBtZXRob2Qgb2YgRGlzdHJpYnV0aW9uRW5naW5lIik7CisKKwkJRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBkaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisKKwkJYm9vbGVhbiBzdGFydERpc3RyaWJ1dGlvbkVuZ2luZSA9IGRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24uaXNTdGFydERpc3RyaWJ1dGlvbkVuZ2luZSgpOworCQlsb2dnZXIuZGVidWcoIkRpc3RyaWJ1dGlvbiBlbmdpbmUgYWN0aXZhdGlvbiBwYXJhbWV0ZXIgaXMge30iLCBzdGFydERpc3RyaWJ1dGlvbkVuZ2luZSk7CisJCWlmIChmYWxzZSA9PSBzdGFydERpc3RyaWJ1dGlvbkVuZ2luZSkgeworCQkJbG9nZ2VyLmluZm8oIlRoZSBkaXNyaWJ1dGlvbiBlbmdpbmUgaXMgZGlzYWJsZWQiKTsKKworCQkJdGhpcy5kaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoLnNldEhlYWx0aENoZWNrVWViSXNEaXNhYmxlZCgpOworCisJCQlyZXR1cm47CisJCX0KKworCQlib29sZWFuIGlzVmFsaWRDb25maWcgPSB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbik7CisKKwkJaWYgKGZhbHNlID09IGlzVmFsaWRDb25maWcpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYlN5c3RlbUVycm9yLCBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5JTklUX0RJU1RSSUJVVElPTl9FTkdJTkVfRkxPVywgInZhbGlkYXRlIGRpc3RyaWJ1dGlvbiBjb25maWd1cmF0aW9uIGluIGluaXQgcGhhc2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVVlYlN5c3RlbUVycm9yKERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrLklOSVRfRElTVFJJQlVUSU9OX0VOR0lORV9GTE9XLCAidmFsaWRhdGUgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gaW4gaW5pdCBwaGFzZSIpOworCisJCQl0aGlzLmRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGguc2V0SGVhbHRoQ2hlY2tVZWJDb25maWd1cmF0aW9uRXJyb3IoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUxpc3Q8U3RyaW5nPiBlbnZpcm9ubWVudHMgPSBkaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50cygpOworCisJCWZvciAoU3RyaW5nIGVudk5hbWUgOiBlbnZpcm9ubWVudHMpIHsKKworCQkJRGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2sgZGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2sgPSBuZXcgRGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2soZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiwgZW52TmFtZSwgY29tcG9uZW50VXRpbHMsIGRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGgpOworCisJCQlsb2dnZXIuZGVidWcoIkluaXQgdGFzayBmb3IgZW52aXJvbm1lbnQge30iLCBlbnZOYW1lKTsKKworCQkJQXRvbWljQm9vbGVhbiBzdGF0dXMgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisJCQllbnZOYW1lUGVyU3RhdHVzLnB1dChlbnZOYW1lLCBzdGF0dXMpOworCQkJRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2sgZGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2sgPSBuZXcgRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2soMGwsIGRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24sIGVudk5hbWUsIHN0YXR1cywgY29tcG9uZW50VXRpbHMsIGRpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrKTsKKwkJCWRpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrLnN0YXJ0VGFzaygpOworCQkJZW52TmFtZVBlckluaXRUYXNrLnB1dChlbnZOYW1lLCBkaXN0cmlidXRpb25FbmdpbmVJbml0VGFzayk7CisJCQllbnZOYW1lUGVyUG9sbGluZ1Rhc2sucHV0KGVudk5hbWUsIGRpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrKTsKKwkJfQorCisJCWxvZ2dlci5kZWJ1ZygiSW5pdCBVRUIgaGVhbHRoIGNoZWNrIik7CisJCWRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGguc3RhcnRIZWFsdGhDaGVja1Rhc2soZW52TmFtZVBlclN0YXR1cyk7CisKKwkJbG9nZ2VyLnRyYWNlKCJFeGl0IGluaXQgbWV0aG9kIG9mIERpc3RyaWJ1dGlvbkVuZ2luZSIpOworCisJfQorCisJQFByZURlc3Ryb3kKKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKwkJbG9nZ2VyLmluZm8oImRpc3RyaWJ1dGlvbiBlbmdpbmUgc2h1dGRvd24gLSBzdGFydCIpOworCQlpZiAoZW52TmFtZVBlckluaXRUYXNrICE9IG51bGwpIHsKKwkJCWZvciAoRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2sgdGFzayA6IGVudk5hbWVQZXJJbml0VGFzay52YWx1ZXMoKSkgeworCQkJCXRhc2suZGVzdHJveSgpOworCQkJfQorCQl9CisJCWlmIChlbnZOYW1lUGVyUG9sbGluZ1Rhc2sgIT0gbnVsbCkgeworCQkJZm9yIChEaXN0cmlidXRpb25FbmdpbmVQb2xsaW5nVGFzayB0YXNrIDogZW52TmFtZVBlclBvbGxpbmdUYXNrLnZhbHVlcygpKSB7CisJCQkJdGFzay5kZXN0cm95KCk7CisJCQl9CisJCX0KKworCX0KKworCS8qKgorCSAqIHZhbGlkYXRlIG1hbmRhdG9yeSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQKKwkgKiAKKwkgKiBAcGFyYW0gZGVDb25maWd1cmF0aW9uCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQ29uZmlndXJhdGlvbihEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGRlQ29uZmlndXJhdGlvbikgeworCisJCVN0cmluZyBtZXRob2ROYW1lID0gbmV3IE9iamVjdCgpIHsKKwkJfS5nZXRDbGFzcygpLmdldEVuY2xvc2luZ01ldGhvZCgpLmdldE5hbWUoKTsKKworCQlib29sZWFuIHJlc3VsdCA9IHRydWU7CisJCXJlc3VsdCA9IGlzVmFsaWRTZXJ2ZXJzKGRlQ29uZmlndXJhdGlvbi5nZXRVZWJTZXJ2ZXJzKCksIG1ldGhvZE5hbWUsICJ1ZWJTZXJ2ZXJzIikgJiYgcmVzdWx0OworCQlyZXN1bHQgPSBpc1ZhbGlkUGFyYW0oZGVDb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50cygpLCBtZXRob2ROYW1lLCAiZW52aXJvbm1lbnRzIikgJiYgcmVzdWx0OworCQlyZXN1bHQgPSBpc1ZhbGlkUGFyYW0oZGVDb25maWd1cmF0aW9uLmdldFVlYlB1YmxpY0tleSgpLCBtZXRob2ROYW1lLCAidWViUHVibGljS2V5IikgJiYgcmVzdWx0OworCQlyZXN1bHQgPSBpc1ZhbGlkUGFyYW0oZGVDb25maWd1cmF0aW9uLmdldFVlYlNlY3JldEtleSgpLCBtZXRob2ROYW1lLCAidWViU2VjcmV0S2V5IikgJiYgcmVzdWx0OworCQlyZXN1bHQgPSBpc1ZhbGlkUGFyYW0oZGVDb25maWd1cmF0aW9uLmdldERpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lKCksIG1ldGhvZE5hbWUsICJkaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZSIpICYmIHJlc3VsdDsKKwkJcmVzdWx0ID0gaXNWYWxpZFBhcmFtKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUoKSwgbWV0aG9kTmFtZSwgImRpc3RyaWJ1dGlvblN0YXR1c1RvcGljTmFtZSIpICYmIHJlc3VsdDsKKwkJcmVzdWx0ID0gaXNWYWxpZE9iamVjdChkZUNvbmZpZ3VyYXRpb24uZ2V0Q3JlYXRlVG9waWMoKSwgbWV0aG9kTmFtZSwgImNyZWF0ZVRvcGljIikgJiYgcmVzdWx0OworCQlyZXN1bHQgPSBpc1ZhbGlkT2JqZWN0KGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpYygpLCBtZXRob2ROYW1lLCAiZGlzdHJpYnV0aW9uU3RhdHVzVG9waWMiKSAmJiByZXN1bHQ7CisJCXJlc3VsdCA9IGlzVmFsaWRPYmplY3QoZGVDb25maWd1cmF0aW9uLmdldEluaXRNYXhJbnRlcnZhbFNlYygpLCBtZXRob2ROYW1lLCAiaW5pdE1heEludGVydmFsU2VjIikgJiYgcmVzdWx0OworCQlyZXN1bHQgPSBpc1ZhbGlkT2JqZWN0KGRlQ29uZmlndXJhdGlvbi5nZXRJbml0UmV0cnlJbnRlcnZhbFNlYygpLCBtZXRob2ROYW1lLCAiaW5pdFJldHJ5SW50ZXJ2YWxTZWMiKSAmJiByZXN1bHQ7CisJCXJlc3VsdCA9IGlzVmFsaWRQYXJhbShkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWMoKS5nZXRDb25zdW1lcklkKCksIG1ldGhvZE5hbWUsICJjb25zdW1lcklkIikgJiYgcmVzdWx0OworCQlyZXN1bHQgPSBpc1ZhbGlkUGFyYW0oZGVDb25maWd1cmF0aW9uLmdldERpc3RyaWJ1dGlvblN0YXR1c1RvcGljKCkuZ2V0Q29uc3VtZXJHcm91cCgpLCBtZXRob2ROYW1lLCAiY29uc3VtZXJHcm91cCIpICYmIHJlc3VsdDsKKwkJcmVzdWx0ID0gaXNWYWxpZE9iamVjdChkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWMoKS5nZXRGZXRjaFRpbWVTZWMoKSwgbWV0aG9kTmFtZSwgImZldGNoVGltZVNlYyIpICYmIHJlc3VsdDsKKwkJcmVzdWx0ID0gaXNWYWxpZE9iamVjdChkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWMoKS5nZXRQb2xsaW5nSW50ZXJ2YWxTZWMoKSwgbWV0aG9kTmFtZSwgInBvbGxpbmdJbnRlcnZhbFNlYyIpICYmIHJlc3VsdDsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU2VydmVycyhMaXN0PFN0cmluZz4gdWViU2VydmVycywgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBwYXJhbU5hbWUpIHsKKworCQlpZiAodWViU2VydmVycyA9PSBudWxsIHx8IHVlYlNlcnZlcnMuc2l6ZSgpID09IDApIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZU1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3IsIG1ldGhvZE5hbWUsIHBhcmFtTmFtZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yKG1ldGhvZE5hbWUsIHBhcmFtTmFtZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAodWViU2VydmVycy5zaXplKCkgPCAyKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVDb25maWd1cmF0aW9uSW52YWxpZExpc3RTaXplRXJyb3IsIG1ldGhvZE5hbWUsIHBhcmFtTmFtZSwgIjIiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUNvbmZpZ3VyYXRpb25JbnZhbGlkTGlzdFNpemVFcnJvcihtZXRob2ROYW1lLCBwYXJhbU5hbWUsIDIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJZm9yIChTdHJpbmcgc2VydmVyRnFkbiA6IHVlYlNlcnZlcnMpIHsKKwkJCWlmIChmYWxzZSA9PSBpc1ZhbGlkRnFkbihzZXJ2ZXJGcWRuKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRDb25maWd1cmF0aW9uRXJyb3IsIG1ldGhvZE5hbWUsIHBhcmFtTmFtZSwgc2VydmVyRnFkbik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvcihtZXRob2ROYW1lLCBwYXJhbU5hbWUsIHNlcnZlckZxZG4pOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRnFkbihTdHJpbmcgc2VydmVyRnFkbikgeworCisJCXRyeSB7CisJCQlNYXRjaGVyIG1hdGNoZXIgPSBGUUROX1BBVFRFUk4ubWF0Y2hlcihzZXJ2ZXJGcWRuKTsKKwkJCXJldHVybiBtYXRjaGVyLm1hdGNoZXMoKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gbWF0Y2ggdmFsdWUgb2YgYWRkcmVzcyB7fSIsIHNlcnZlckZxZG4sIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhcmFtKFN0cmluZyBwYXJhbSkgeworCisJCWlmIChwYXJhbSA9PSBudWxsIHx8IHRydWUgPT0gcGFyYW0uaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhcmFtKFN0cmluZyBwYXJhbVZhbHVlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHBhcmFtTmFtZSkgeworCisJCWlmIChpc0VtcHR5UGFyYW0ocGFyYW1WYWx1ZSkpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZU1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3IsIG1ldGhvZE5hbWUsIHBhcmFtTmFtZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yKG1ldGhvZE5hbWUsIHBhcmFtTmFtZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhcmFtKExpc3Q8U3RyaW5nPiBwYXJhbVZhbHVlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHBhcmFtTmFtZSkgeworCisJCWlmIChpc0VtcHR5TGlzdChwYXJhbVZhbHVlKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvciwgbWV0aG9kTmFtZSwgcGFyYW1OYW1lKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZU1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3IobWV0aG9kTmFtZSwgcGFyYW1OYW1lKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkT2JqZWN0KE9iamVjdCBwYXJhbVZhbHVlLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHBhcmFtTmFtZSkgeworCisJCWlmIChwYXJhbVZhbHVlID09IG51bGwpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZU1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3IsIG1ldGhvZE5hbWUsIHBhcmFtTmFtZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yKG1ldGhvZE5hbWUsIHBhcmFtTmFtZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUxpc3QoTGlzdDxTdHJpbmc+IGxpc3QpIHsKKwkJaWYgKGxpc3QgPT0gbnVsbCB8fCB0cnVlID09IGxpc3QuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RW52aXJvbm1lbnRFcnJvckRlc2NyaXB0aW9uKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzKSB7CisKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBESVNUUl9FTlZJUk9OTUVOVF9OT1RfQVZBSUxBQkxFOgorCQkJcmV0dXJuICJlbnZpcm9ubWVudCBpcyB1bmF2YWlsYWJsZSI7CisJCWNhc2UgRElTVFJfRU5WSVJPTk1FTlRfTk9UX0ZPVU5EOgorCQkJcmV0dXJuICJlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCBpbiBvdXIgc3lzdGVtIjsKKwkJY2FzZSBESVNUUl9FTlZJUk9OTUVOVF9TRU5UX0lTX0lOVkFMSUQ6CisJCQlyZXR1cm4gImVudmlyb25tZW50IG5hbWUgaXMgaW52YWxpZCI7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAidW5raG93biI7CisKKwkJfQorCX0KKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGlzRW52aXJvbm1lbnRBdmFpbGFibGUoU3RyaW5nIGVudk5hbWUpIHsKKworCQlpZiAoZW52TmFtZSA9PSBudWxsIHx8IHRydWUgPT0gZW52TmFtZS5pc0VtcHR5KCkpIHsKKworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuRElTVFJfRU5WSVJPTk1FTlRfU0VOVF9JU19JTlZBTElEOworCQl9CisKKwkJQXRvbWljQm9vbGVhbiBzdGF0dXMgPSBlbnZOYW1lUGVyU3RhdHVzLmdldChlbnZOYW1lKTsKKwkJaWYgKHN0YXR1cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5ESVNUUl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQ7CisJCX0KKworCQlpZiAoZmFsc2UgPT0gc3RhdHVzLmdldCgpKSB7CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5ESVNUUl9FTlZJUk9OTUVOVF9OT1RfQVZBSUxBQkxFOworCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGlzRW52aXJvbm1lbnRBdmFpbGFibGUoKSB7CisKKwkJU3RyaW5nIGVudk5hbWUgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24oKS5nZXRFbnZpcm9ubWVudHMoKS5nZXQoMCk7CisKKwkJcmV0dXJuIGlzRW52aXJvbm1lbnRBdmFpbGFibGUoZW52TmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzYWJsZUVudmlyb25tZW50KFN0cmluZyBlbnZOYW1lKSB7CisJCS8vIFRPRE8gZGlzYWJsZSB0YXNrcworCQlBdG9taWNCb29sZWFuIHN0YXR1cyA9IGVudk5hbWVQZXJTdGF0dXMuZ2V0KGVudk5hbWUpOworCQlzdGF0dXMuc2V0KGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBub3RpZnlTZXJ2aWNlKFN0cmluZyBkaXN0cmlidXRpb25JZCwgU2VydmljZSBzZXJ2aWNlLCBJTm90aWZpY2F0aW9uRGF0YSBub3RpZmljYXRpb25EYXRhLCBTdHJpbmcgZW52TmFtZSwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIG1vZGlmaWVyTmFtZSkgeworCQkKKwkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIlJlY2VpdmVkIG5vdGlmeSBzZXJ2aWNlIHJlcXVlc3QuIGRpc3RyaWJ1dGlvbklkID0ge30sIHNlcnZpY2VVdWlkID0ge30sIHNlcnZpY2VVaWQgPSB7fSwgZW52TmFtZSA9IHt9LCB1c2VySWQgPSB7fSwgbW9kaWZpZXJOYW1lIHt9IiwgZGlzdHJpYnV0aW9uSWQsIHNlcnZpY2UuZ2V0VVVJRCgpLCBzZXJ2aWNlLmdldFVuaXF1ZUlkKCksIGVudk5hbWUsIHVzZXJJZCwgbW9kaWZpZXJOYW1lKTsKKwkJfQorCisJCURpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGVDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisKKwkJU3RyaW5nIGRpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lID0gZGVDb25maWd1cmF0aW9uLmdldERpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lKCk7CisJCVN0cmluZyB0b3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShkaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZSwgZW52TmFtZSk7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzZW5kTm90aWZpY2F0aW9uID0gZGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uU2VuZGVyLnNlbmROb3RpZmljYXRpb24odG9waWNOYW1lLCBkaXN0cmlidXRpb25JZCwgZGVDb25maWd1cmF0aW9uLCBlbnZOYW1lLCBub3RpZmljYXRpb25EYXRhLCBzZXJ2aWNlLCB1c2VySWQsIG1vZGlmaWVyTmFtZSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJGaW5pc2ggbm90aWZ5U2VydmljZS4gc3RhdHVzIGlzIHt9Iiwgc2VuZE5vdGlmaWNhdGlvbik7CisKKwkJcmV0dXJuIHNlbmROb3RpZmljYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJTm90aWZpY2F0aW9uRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaXNSZWFkeUZvckRpc3RyaWJ1dGlvbihTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBkaXN0cmlidXRpb25JZCwgU3RyaW5nIGVudk5hbWUpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBpc0Vudmlyb25tZW50QXZhaWxhYmxlKGVudk5hbWUpOworCQlpZiAoc3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCVN0cmluZyBlbnZFcnJvckRlYyA9IGdldEVudmlyb25tZW50RXJyb3JEZXNjcmlwdGlvbihzdGF0dXMpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IsIERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblNlbmRlci5ESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX1NFTkRJTkcsCisJCQkJCSJFbnZpcm9ubWVudCBuYW1lICIgKyBlbnZOYW1lICsgIiBpcyBub3QgYXZhaWxhYmxlLiBSZWFzb24gOiAiICsgZW52RXJyb3JEZWMpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IoRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uU2VuZGVyLkRJU1RSSUJVVElPTl9OT1RJRklDQVRJT05fU0VORElORywgIkVudmlyb25tZW50IG5hbWUgIiArIGVudk5hbWUgKyAiIGlzIG5vdCBhdmFpbGFibGUuIFJlYXNvbiA6ICIgKyBlbnZFcnJvckRlYyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaXNTZXJ2aWNlQ29udGFpbnNEZXBsb3ltZW50QXJ0aWZhY3RzU3RhdHVzID0gc2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXIuaXNTZXJ2aWNlQ29udGFpbnNEZXBsb3ltZW50QXJ0aWZhY3RzKHNlcnZpY2UpOworCQlpZiAoaXNTZXJ2aWNlQ29udGFpbnNEZXBsb3ltZW50QXJ0aWZhY3RzU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBpc1NlcnZpY2VDb250YWluc0RlcGxveW1lbnRBcnRpZmFjdHNTdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9IGVsc2UgeworCQkJQm9vbGVhbiBpc0RlcGxveW1lbnRBcnRpZmFjdEV4aXN0cyA9IGlzU2VydmljZUNvbnRhaW5zRGVwbG95bWVudEFydGlmYWN0c1N0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChpc0RlcGxveW1lbnRBcnRpZmFjdEV4aXN0cyA9PSBudWxsIHx8IGlzRGVwbG95bWVudEFydGlmYWN0RXhpc3RzLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkRJU1RSX0FSVElGQUNUX05PVF9GT1VORCk7CisJCQl9CisJCX0KKworCQlJTm90aWZpY2F0aW9uRGF0YSB2YWx1ZSA9IHNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyLmJ1aWxkUmVzb3VyY2VJbnN0YW5jZUZvckRpc3RyaWJ1dGlvbihzZXJ2aWNlLCBkaXN0cmlidXRpb25JZCk7CisJCXZhbHVlID0gc2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXIuYnVpbGRTZXJ2aWNlRm9yRGlzdHJpYnV0aW9uKHZhbHVlLCBzZXJ2aWNlKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodmFsdWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QwMzYyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoLmphdmEKQEAgLTAsMCArMSwzNTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja0NvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja1N0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworQENvbXBvbmVudCgiZGlzdHJpYnV0aW9uLWVuZ2luZS1jbHVzdGVyLWhlYWx0aCIpCitwdWJsaWMgY2xhc3MgRGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aCB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBVRUJfSEVBTFRIX0xPR19DT05URVhUID0gInVlYi5oZWFsdGhjaGVjayI7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgaGVhbHRoTG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVUVCX0hFQUxUSF9MT0dfQ09OVEVYVCk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUVCX0hFQUxUSF9DSEVDS19TVFIgPSAidWViSGVhbHRoQ2hlY2siOworCisJYm9vbGVhbiBsYXN0SGVhbHRoU3RhdGUgPSBmYWxzZTsKKworCU9iamVjdCBsb2NrT2plY3QgPSBuZXcgT2JqZWN0KCk7CisKKwlwcml2YXRlIGxvbmcgcmVjb25uZWN0SW50ZXJ2YWwgPSA1OworCisJcHJpdmF0ZSBsb25nIGhlYWx0aENoZWNrUmVhZFRpbWVvdXQgPSAyMDsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiB1ZWJTZXJ2ZXJzID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIHB1YmxpY0FwaUtleSA9IG51bGw7CisKKwlwdWJsaWMgZW51bSBIZWFsdGhDaGVja0luZm9SZXN1bHQgeworCisJCU9LKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuREUsIEhlYWx0aENoZWNrU3RhdHVzLlVQLCBudWxsLCBDbHVzdGVyU3RhdHVzRGVzY3JpcHRpb24uT0suZ2V0RGVzY3JpcHRpb24oKSkpLCBVTkFWQUlMQUJMRSgKKwkJCQluZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkRFLCBIZWFsdGhDaGVja1N0YXR1cy5ET1dOLCBudWxsLCBDbHVzdGVyU3RhdHVzRGVzY3JpcHRpb24uVU5BVkFJTEFCTEUuZ2V0RGVzY3JpcHRpb24oKSkpLCBOT1RfQ09ORklHVVJFRCgKKwkJCQkJCW5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuREUsIEhlYWx0aENoZWNrU3RhdHVzLkRPV04sIG51bGwsIENsdXN0ZXJTdGF0dXNEZXNjcmlwdGlvbi5OT1RfQ09ORklHVVJFRC5nZXREZXNjcmlwdGlvbigpKSksIERJU0FCTEVEKAorCQkJCQkJCQluZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkRFLCBIZWFsdGhDaGVja1N0YXR1cy5ET1dOLCBudWxsLCBDbHVzdGVyU3RhdHVzRGVzY3JpcHRpb24uRElTQUJMRUQuZ2V0RGVzY3JpcHRpb24oKSkpOworCisJCXByaXZhdGUgSGVhbHRoQ2hlY2tJbmZvIGhlYWx0aENoZWNrSW5mbzsKKworCQlIZWFsdGhDaGVja0luZm9SZXN1bHQoSGVhbHRoQ2hlY2tJbmZvIGhlYWx0aENoZWNrSW5mbykgeworCQkJdGhpcy5oZWFsdGhDaGVja0luZm8gPSBoZWFsdGhDaGVja0luZm87CisJCX0KKworCQlwdWJsaWMgSGVhbHRoQ2hlY2tJbmZvIGdldEhlYWx0aENoZWNrSW5mbygpIHsKKwkJCXJldHVybiBoZWFsdGhDaGVja0luZm87CisJCX0KKworCX0KKworCXByaXZhdGUgSGVhbHRoQ2hlY2tJbmZvIGhlYWx0aENoZWNrSW5mbyA9IEhlYWx0aENoZWNrSW5mb1Jlc3VsdC5VTkFWQUlMQUJMRS5nZXRIZWFsdGhDaGVja0luZm8oKTsKKworCXByaXZhdGUgTWFwPFN0cmluZywgQXRvbWljQm9vbGVhbj4gZW52TmFtZVBlclN0YXR1cyA9IG51bGw7CisKKwlwcml2YXRlIFNjaGVkdWxlZEZ1dHVyZTw/PiBzY2hlZHVsZWRGdXR1cmUgPSBudWxsOworCisJU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGhlYWx0aENoZWNrU2NoZWR1bGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5KCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgeworCQkJcmV0dXJuIG5ldyBUaHJlYWQociwgIlVFQi1IZWFsdGgtQ2hlY2stVGFzayIpOworCQl9CisJfSk7CisKKwlIZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sgaGVhbHRoQ2hlY2tTY2hlZHVsZWRUYXNrID0gbnVsbDsKKworCXB1YmxpYyBlbnVtIENsdXN0ZXJTdGF0dXNEZXNjcmlwdGlvbiB7CisKKwkJT0soIk9LIiksIFVOQVZBSUxBQkxFKCJVLUVCIGNsdXN0ZXIgaXMgbm90IGF2YWlsYWJsZSIpLCBOT1RfQ09ORklHVVJFRCgiVS1FQiBjbHVzdGVyIGlzIG5vdCBjb25maWd1cmVkIiksIERJU0FCTEVEKCJERSBpcyBkaXNhYmxlZCBpbiBjb25maWd1cmF0aW9uIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgZGVzYzsKKworCQlDbHVzdGVyU3RhdHVzRGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpIHsKKwkJCXRoaXMuZGVzYyA9IGRlc2M7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQkJcmV0dXJuIGRlc2M7CisJCX0KKworCX0KKworCS8qKgorCSAqIEhlYWx0aCBDaGVjayBUYXNrIFNjaGVkdWxlci4KKwkgKiAKKwkgKiBJdCBzY2hlZHVsZXMgYSB0YXNrIHdoaWNoIHNlbmQgYSBhcGlLZXkgZ2V0IHF1ZXJ5IHRvd2FyZHMgdGhlIFVFQiBzZXJ2ZXJzLiBJbiBjYXNlIGEgcXVlcnkgdG8gdGhlIGZpcnN0IFVFQiBzZXJ2ZXIgaXMgZmFpbGVkLCB0aGVuIGEgc2Vjb25kIHF1ZXJ5IGlzIHNlbnQgdG8gdGhlIG5leHQgVUVCIHNlcnZlci4KKwkgKiAKKwkgKiAKKwkgKiBAYXV0aG9yIGVzb2ZlcgorCSAqCisJICovCisJcHVibGljIGNsYXNzIEhlYWx0aENoZWNrU2NoZWR1bGVkVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworCQlMaXN0PFVlYkhlYWx0aENoZWNrQ2FsbD4gaGVhbHRoQ2hlY2tDYWxscyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCXB1YmxpYyBIZWFsdGhDaGVja1NjaGVkdWxlZFRhc2soTGlzdDxTdHJpbmc+IHVlYlNlcnZlcnMpIHsKKworCQkJbG9nZ2VyLmRlYnVnKCJDcmVhdGUgaGVhbHRoIGNoZWNrIGNhbGxzIGZvciBzZXJ2ZXJzIHt9IiwgdWViU2VydmVycyk7CisJCQlpZiAodWViU2VydmVycyAhPSBudWxsKSB7CisJCQkJZm9yIChTdHJpbmcgc2VydmVyIDogdWViU2VydmVycykgeworCQkJCQloZWFsdGhDaGVja0NhbGxzLmFkZChuZXcgVWViSGVhbHRoQ2hlY2tDYWxsKHNlcnZlciwgcHVibGljQXBpS2V5KSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQkJaGVhbHRoTG9nZ2VyLnRyYWNlKCJFeGVjdXRpbmcgVUVCIEhlYWx0aCBDaGVjayBUYXNrIC0gU3RhcnQiKTsKKworCQkJYm9vbGVhbiBoZWFsdGhTdGF0dXMgPSB2ZXJpZnlBdExlYXN0T25lRW52SXNVcCgpOworCisJCQlpZiAodHJ1ZSA9PSBoZWFsdGhTdGF0dXMpIHsKKwkJCQlib29sZWFuIHF1ZXJ5VWViU3RhdHVzID0gcXVlcnlVZWIoKTsKKwkJCQlpZiAocXVlcnlVZWJTdGF0dXMgPT0gbGFzdEhlYWx0aFN0YXRlKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlzeW5jaHJvbml6ZWQgKGxvY2tPamVjdCkgeworCQkJCQlpZiAocXVlcnlVZWJTdGF0dXMgIT0gbGFzdEhlYWx0aFN0YXRlKSB7CisJCQkJCQlsb2dnZXIudHJhY2UoIlVFQiBIZWFsdGggU3RhdGUgQ2hhbmdlZCB0byB7fS4gSXNzdWluZyBhbGFybSAvIHJlY292ZXJ5IGFsYXJtLi4uIiwgaGVhbHRoU3RhdHVzKTsKKwkJCQkJCWxhc3RIZWFsdGhTdGF0ZSA9IHF1ZXJ5VWViU3RhdHVzOworCQkJCQkJbG9nQWxhcm0obGFzdEhlYWx0aFN0YXRlKTsKKwkJCQkJCWlmICh0cnVlID09IHF1ZXJ5VWViU3RhdHVzKSB7CisJCQkJCQkJaGVhbHRoQ2hlY2tJbmZvID0gSGVhbHRoQ2hlY2tJbmZvUmVzdWx0Lk9LLmdldEhlYWx0aENoZWNrSW5mbygpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQloZWFsdGhDaGVja0luZm8gPSBIZWFsdGhDaGVja0luZm9SZXN1bHQuVU5BVkFJTEFCTEUuZ2V0SGVhbHRoQ2hlY2tJbmZvKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWhlYWx0aExvZ2dlci50cmFjZSgiTm90IGFsbCBVRUIgRW52aXJvbm1lbnRzIGFyZSB1cCIpOworCQkJfQorCisJCX0KKworCQkvKioKKwkJICogdmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGVudmlyb25tZW50IGlzIHVwLgorCQkgKiAKKwkJICovCisJCXByaXZhdGUgYm9vbGVhbiB2ZXJpZnlBdExlYXN0T25lRW52SXNVcCgpIHsKKworCQkJYm9vbGVhbiBoZWFsdGhTdGF0dXMgPSBmYWxzZTsKKworCQkJaWYgKGVudk5hbWVQZXJTdGF0dXMgIT0gbnVsbCkgeworCQkJCUNvbGxlY3Rpb248QXRvbWljQm9vbGVhbj4gdmFsdWVzID0gZW52TmFtZVBlclN0YXR1cy52YWx1ZXMoKTsKKwkJCQlpZiAodmFsdWVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChBdG9taWNCb29sZWFuIHN0YXR1cyA6IHZhbHVlcykgeworCQkJCQkJaWYgKHRydWUgPT0gc3RhdHVzLmdldCgpKSB7CisJCQkJCQkJaGVhbHRoU3RhdHVzID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGhlYWx0aFN0YXR1czsKKwkJfQorCisJCS8qKgorCQkgKiBleGVjdXRvciBmb3IgdGhlIHF1ZXJ5IGl0c2VsZgorCQkgKi8KKwkJRXhlY3V0b3JTZXJ2aWNlIGhlYWx0aENoZWNrRXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IobmV3IFRocmVhZEZhY3RvcnkoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKwkJCQlyZXR1cm4gbmV3IFRocmVhZChyLCAiVUVCLUhlYWx0aC1DaGVjay1UaHJlYWQiKTsKKwkJCX0KKwkJfSk7CisKKwkJLyoqCisJCSAqIGdvIGFsbCBVRUIgc2VydmVycyBhbmQgc2VuZCBhIGdldCBhcGlLZXlzIHF1ZXJ5LiBJbiBjYXNlIGEgcXVlcnkgaXMgc3VjY2VlZCwgbm8gcXVlcnkgaXMgc2VudCB0byB0aGUgcmVzdCBvZiBVRUIgc2VydmVycy4KKwkJICogCisJCSAqIAorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwcml2YXRlIGJvb2xlYW4gcXVlcnlVZWIoKSB7CisKKwkJCUJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCQlpbnQgcmV0cnlOdW1iZXIgPSAxOworCQkJZm9yIChVZWJIZWFsdGhDaGVja0NhbGwgaGVhbHRoQ2hlY2tDYWxsIDogaGVhbHRoQ2hlY2tDYWxscykgeworCQkJCXRyeSB7CisKKwkJCQkJaGVhbHRoTG9nZ2VyLmRlYnVnKCJCZWZvcmUgcnVubmluZyBIZWFsdGggQ2hlY2sgcmV0cnkgcXVlcnkgbnVtYmVyIHt9IHRvd2FyZHMgVUVCIHNlcnZlciB7fSIsIHJldHJ5TnVtYmVyLCBoZWFsdGhDaGVja0NhbGwuZ2V0U2VydmVyKCkpOworCisJCQkJCUZ1dHVyZTxCb29sZWFuPiBmdXR1cmUgPSBoZWFsdGhDaGVja0V4ZWN1dG9yLnN1Ym1pdChoZWFsdGhDaGVja0NhbGwpOworCQkJCQlyZXN1bHQgPSBmdXR1cmUuZ2V0KGhlYWx0aENoZWNrUmVhZFRpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMpOworCisJCQkJCWhlYWx0aExvZ2dlci5kZWJ1ZygiQWZ0ZXIgcnVubmluZyBIZWFsdGggQ2hlY2sgcmV0cnkgcXVlcnkgbnVtYmVyIHt9IHRvd2FyZHMgVUVCIHNlcnZlciB7fS4gUmVzdWx0IGlzIHt9IiwgcmV0cnlOdW1iZXIsIGhlYWx0aENoZWNrQ2FsbC5nZXRTZXJ2ZXIoKSwgcmVzdWx0KTsKKworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgdHJ1ZSA9PSByZXN1bHQuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOworCQkJCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7CisJCQkJCQltZXNzYWdlID0gZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKwkJCQkJfQorCQkJCQloZWFsdGhMb2dnZXIuZGVidWcoIkVycm9yIG9jY3VyZWQgZHVyaW5nIHJ1bm5pbmcgSGVhbHRoIENoZWNrIHJldHJ5IHF1ZXJ5IHRvd2FyZHMgVUVCIHNlcnZlciB7fS4gUmVzdWx0IGlzIHt9IiwgaGVhbHRoQ2hlY2tDYWxsLmdldFNlcnZlcigpLCBtZXNzYWdlKTsKKwkJCQl9CisJCQkJcmV0cnlOdW1iZXIrKzsKKworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0KKworCQlwdWJsaWMgTGlzdDxVZWJIZWFsdGhDaGVja0NhbGw+IGdldEhlYWx0aENoZWNrQ2FsbHMoKSB7CisJCQlyZXR1cm4gaGVhbHRoQ2hlY2tDYWxsczsKKwkJfQorCisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwcml2YXRlIHZvaWQgaW5pdCgpIHsKKworCQlsb2dnZXIudHJhY2UoIkVudGVyIGluaXQgbWV0aG9kIG9mIERpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGgiKTsKKworCQlMb25nIHJlY29ubmVjdEludGVydmFsQ29uZmlnID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0VWViSGVhbHRoQ2hlY2tSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kcygpOworCQlpZiAocmVjb25uZWN0SW50ZXJ2YWxDb25maWcgIT0gbnVsbCkgeworCQkJcmVjb25uZWN0SW50ZXJ2YWwgPSByZWNvbm5lY3RJbnRlcnZhbENvbmZpZy5sb25nVmFsdWUoKTsKKwkJfQorCQlMb25nIGhlYWx0aENoZWNrUmVhZFRpbWVvdXRDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRVZWJIZWFsdGhDaGVja1JlYWRUaW1lb3V0KCk7CisJCWlmIChoZWFsdGhDaGVja1JlYWRUaW1lb3V0Q29uZmlnICE9IG51bGwpIHsKKwkJCWhlYWx0aENoZWNrUmVhZFRpbWVvdXQgPSBoZWFsdGhDaGVja1JlYWRUaW1lb3V0Q29uZmlnLmxvbmdWYWx1ZSgpOworCQl9CisKKwkJRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBkaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisKKwkJdGhpcy51ZWJTZXJ2ZXJzID0gZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5nZXRVZWJTZXJ2ZXJzKCk7CisJCXRoaXMucHVibGljQXBpS2V5ID0gZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5nZXRVZWJQdWJsaWNLZXkoKTsKKworCQl0aGlzLmhlYWx0aENoZWNrU2NoZWR1bGVkVGFzayA9IG5ldyBIZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sodGhpcy51ZWJTZXJ2ZXJzKTsKKworCQlsb2dnZXIudHJhY2UoIkV4aXQgaW5pdCBtZXRob2Qgb2YgRGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aCIpOworCisJfQorCisJQFByZURlc3Ryb3kKKwlwcml2YXRlIHZvaWQgZGVzdHJveSgpIHsKKworCQlpZiAoc2NoZWR1bGVkRnV0dXJlICE9IG51bGwpIHsKKwkJCXNjaGVkdWxlZEZ1dHVyZS5jYW5jZWwodHJ1ZSk7CisJCQlzY2hlZHVsZWRGdXR1cmUgPSBudWxsOworCQl9CisKKwkJaWYgKGhlYWx0aENoZWNrU2NoZWR1bGVyICE9IG51bGwpIHsKKwkJCWhlYWx0aENoZWNrU2NoZWR1bGVyLnNodXRkb3duKCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIFN0YXJ0IGhlYWx0aCBjaGVjayB0YXNrLgorCSAqIAorCSAqIEBwYXJhbSBlbnZOYW1lUGVyU3RhdHVzCisJICogQHBhcmFtIHN0YXJ0VGFzaworCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0SGVhbHRoQ2hlY2tUYXNrKE1hcDxTdHJpbmcsIEF0b21pY0Jvb2xlYW4+IGVudk5hbWVQZXJTdGF0dXMsIGJvb2xlYW4gc3RhcnRUYXNrKSB7CisJCXRoaXMuZW52TmFtZVBlclN0YXR1cyA9IGVudk5hbWVQZXJTdGF0dXM7CisKKwkJaWYgKHN0YXJ0VGFzayA9PSB0cnVlICYmIHRoaXMuc2NoZWR1bGVkRnV0dXJlID09IG51bGwpIHsKKwkJCXRoaXMuc2NoZWR1bGVkRnV0dXJlID0gdGhpcy5oZWFsdGhDaGVja1NjaGVkdWxlci5zY2hlZHVsZUF0Rml4ZWRSYXRlKGhlYWx0aENoZWNrU2NoZWR1bGVkVGFzaywgMCwgcmVjb25uZWN0SW50ZXJ2YWwsIFRpbWVVbml0LlNFQ09ORFMpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc3RhcnRIZWFsdGhDaGVja1Rhc2soTWFwPFN0cmluZywgQXRvbWljQm9vbGVhbj4gZW52TmFtZVBlclN0YXR1cykgeworCQlzdGFydEhlYWx0aENoZWNrVGFzayhlbnZOYW1lUGVyU3RhdHVzLCB0cnVlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgbG9nQWxhcm0oYm9vbGVhbiBsYXN0SGVhbHRoU3RhdGUpIHsKKwkJaWYgKGxhc3RIZWFsdGhTdGF0ZSA9PSB0cnVlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVIZWFsdGhDaGVja1JlY292ZXJ5LCBVRUJfSEVBTFRIX0NIRUNLX1NUUik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVIZWFsdGhDaGVja1VlYkNsdXN0ZXJSZWNvdmVyeShVRUJfSEVBTFRIX0NIRUNLX1NUUik7CisJCX0gZWxzZSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVIZWFsdGhDaGVja0Vycm9yLCBVRUJfSEVBTFRIX0NIRUNLX1NUUik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVIZWFsdGhDaGVja1VlYkNsdXN0ZXJFcnJvcihVRUJfSEVBTFRIX0NIRUNLX1NUUik7CisJCX0KKwl9CisKKwlwdWJsaWMgSGVhbHRoQ2hlY2tJbmZvIGdldEhlYWx0aENoZWNrSW5mbygpIHsKKwkJcmV0dXJuIGhlYWx0aENoZWNrSW5mbzsKKwl9CisKKwkvKioKKwkgKiBjaGFuZ2UgdGhlIGhlYWx0aCBjaGVjayB0byBESVNBQkxFCisJICovCisJcHVibGljIHZvaWQgc2V0SGVhbHRoQ2hlY2tVZWJJc0Rpc2FibGVkKCkgeworCQloZWFsdGhDaGVja0luZm8gPSBIZWFsdGhDaGVja0luZm9SZXN1bHQuRElTQUJMRUQuZ2V0SGVhbHRoQ2hlY2tJbmZvKCk7CisJfQorCisJLyoqCisJICogY2hhbmdlIHRoZSBoZWFsdGggY2hlY2sgdG8gTk9UIENPTkZHSVVSRUQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIZWFsdGhDaGVja1VlYkNvbmZpZ3VyYXRpb25FcnJvcigpIHsKKwkJaGVhbHRoQ2hlY2tJbmZvID0gSGVhbHRoQ2hlY2tJbmZvUmVzdWx0Lk5PVF9DT05GSUdVUkVELmdldEhlYWx0aENoZWNrSW5mbygpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhlYWx0aENoZWNrT2tBbmRSZXBvcnRJbkNhc2VMYXN0U3RhdGVJc0Rvd24oKSB7CisKKwkJaWYgKGxhc3RIZWFsdGhTdGF0ZSA9PSB0cnVlKSB7CisJCQlyZXR1cm47CisJCX0KKwkJc3luY2hyb25pemVkIChsb2NrT2plY3QpIHsKKwkJCWlmIChsYXN0SGVhbHRoU3RhdGUgPT0gZmFsc2UpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkdvaW5nIHRvIHVwZGF0ZSBoZWFsdGggY2hlY2sgc3RhdGUgdG8gYXZhaWxhYmxlIik7CisJCQkJbGFzdEhlYWx0aFN0YXRlID0gdHJ1ZTsKKwkJCQloZWFsdGhDaGVja0luZm8gPSBIZWFsdGhDaGVja0luZm9SZXN1bHQuT0suZ2V0SGVhbHRoQ2hlY2tJbmZvKCk7CisJCQkJbG9nQWxhcm0obGFzdEhlYWx0aFN0YXRlKTsKKwkJCX0KKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlYWExMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2suamF2YQpAQCAtMCwwICsxLDI5MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudC5DYW1icmlhT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrIGltcGxlbWVudHMgUnVubmFibGUgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9ESVNUUklCVVRJT05fRU5HSU5FX0ZMT1cgPSAiaW5pdERpc3RyaWJ1dGlvbkVuZ2luZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxSRUFEWV9FWElTVFMgPSAiQUxSRUFEWV9FWElTVFMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNVTUVSID0gIkNPTlNVTUVSIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNFUiA9ICJQUk9EVUNFUiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRCA9ICJDUkVBVEVEIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMRUQgPSAiRkFJTEVEIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgSFRUUF9PSyA9IDIwMDsKKworCXByaXZhdGUgTG9uZyBkZWxheUJlZm9yZVN0YXJ0RmxvdyA9IDBsOworCXByaXZhdGUgRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBkZUNvbmZpZ3VyYXRpb247CisJcHJpdmF0ZSBTdHJpbmcgZW52TmFtZTsKKwlwcml2YXRlIGxvbmcgcmV0cnlJbnRlcnZhbDsKKwlwcml2YXRlIGxvbmcgY3VycmVudFJldHJ5SW50ZXJ2YWw7CisJcHJpdmF0ZSBsb25nIG1heEludGVydmFsOworCS8vIHByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSBmYWxzZTsKKwlib29sZWFuIG1heGltdW1SZXRyeUludGVydmFsID0gZmFsc2U7CisJcHJpdmF0ZSBBdG9taWNCb29sZWFuIHN0YXR1cyA9IG51bGw7CisJQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscyA9IG51bGw7CisJRGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2sgZGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2sgPSBudWxsOworCisJcHJpdmF0ZSBDYW1icmlhSGFuZGxlciBjYW1icmlhSGFuZGxlciA9IG5ldyBDYW1icmlhSGFuZGxlcigpOworCisJcHVibGljIERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrKExvbmcgZGVsYXlCZWZvcmVTdGFydEZsb3csIERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGVDb25maWd1cmF0aW9uLCBTdHJpbmcgZW52TmFtZSwgQXRvbWljQm9vbGVhbiBzdGF0dXMsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMsIERpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrIGRpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZGVsYXlCZWZvcmVTdGFydEZsb3cgPSBkZWxheUJlZm9yZVN0YXJ0RmxvdzsKKwkJdGhpcy5kZUNvbmZpZ3VyYXRpb24gPSBkZUNvbmZpZ3VyYXRpb247CisJCXRoaXMuZW52TmFtZSA9IGVudk5hbWU7CisJCXRoaXMucmV0cnlJbnRlcnZhbCA9IGRlQ29uZmlndXJhdGlvbi5nZXRJbml0UmV0cnlJbnRlcnZhbFNlYygpOworCQl0aGlzLmN1cnJlbnRSZXRyeUludGVydmFsID0gcmV0cnlJbnRlcnZhbDsKKwkJdGhpcy5tYXhJbnRlcnZhbCA9IGRlQ29uZmlndXJhdGlvbi5nZXRJbml0TWF4SW50ZXJ2YWxTZWMoKTsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJCXRoaXMuY29tcG9uZW50c1V0aWxzID0gY29tcG9uZW50c1V0aWxzOworCQl0aGlzLmRpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrID0gZGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2s7CisJfQorCisJcHJpdmF0ZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld1NjaGVkdWxlZFRocmVhZFBvb2woMSk7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2suY2xhc3MuZ2V0TmFtZSgpKTsKKworCVNjaGVkdWxlZEZ1dHVyZTw/PiBzY2hlZHVsZWRGdXR1cmUgPSBudWxsOworCisJcHVibGljIHZvaWQgc3RhcnRUYXNrKCkgeworCQlpZiAoc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlICE9IG51bGwpIHsKKwkJCUludGVnZXIgcmV0cnlJbnRlcnZhbCA9IGRlQ29uZmlndXJhdGlvbi5nZXRJbml0UmV0cnlJbnRlcnZhbFNlYygpOworCQkJbG9nZ2VyLmRlYnVnKCJTdGFydCBEaXN0cmlidXRpb24gRW5naW5lIGluaXQgdGFzay4gcmV0cnkgaW50ZXJ2YWwge30gc2Vjb25kcywgZGVsYXkgYmVmb3JlIGZpcnN0IHJ1biB7fSBzZWNvbmRzIiwgcmV0cnlJbnRlcnZhbCwgZGVsYXlCZWZvcmVTdGFydEZsb3cpOworCQkJdGhpcy5zY2hlZHVsZWRGdXR1cmUgPSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Uuc2NoZWR1bGVBdEZpeGVkUmF0ZSh0aGlzLCBkZWxheUJlZm9yZVN0YXJ0RmxvdywgcmV0cnlJbnRlcnZhbCwgVGltZVVuaXQuU0VDT05EUyk7CisKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlc3RhcnRUYXNrKCkgeworCisJCXRoaXMuc3RvcFRhc2soKTsKKworCQlsb2dnZXIuZGVidWcoIlN0YXJ0IERpc3RyaWJ1dGlvbiBFbmdpbmUgaW5pdCB0YXNrLiBuZXh0IHJ1biBpbiB7fSBzZWNvbmRzIiwgdGhpcy5jdXJyZW50UmV0cnlJbnRlcnZhbCk7CisKKwkJbG9uZyBsYXN0Q3VycmVudEludGVydmFsID0gY3VycmVudFJldHJ5SW50ZXJ2YWw7CisJCWluY3JlbWVudFJldHJ5SW50ZXJ2YWwoKTsKKworCQl0aGlzLnNjaGVkdWxlZEZ1dHVyZSA9IHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZS5zY2hlZHVsZUF0Rml4ZWRSYXRlKHRoaXMsIGxhc3RDdXJyZW50SW50ZXJ2YWwsIHRoaXMuY3VycmVudFJldHJ5SW50ZXJ2YWwsIFRpbWVVbml0LlNFQ09ORFMpOworCisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50UmV0cnlJbnRlcnZhbCgpIHsKKwkJaWYgKGN1cnJlbnRSZXRyeUludGVydmFsIDwgbWF4SW50ZXJ2YWwpIHsKKwkJCWN1cnJlbnRSZXRyeUludGVydmFsICo9IDI7CisJCQlpZiAoY3VycmVudFJldHJ5SW50ZXJ2YWwgPiBtYXhJbnRlcnZhbCkgeworCQkJCXNldE1heFJldHJ5SW50ZXJ2YWwoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNldE1heFJldHJ5SW50ZXJ2YWwoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZXRNYXhSZXRyeUludGVydmFsKCkgeworCQljdXJyZW50UmV0cnlJbnRlcnZhbCA9IG1heEludGVydmFsOworCQltYXhpbXVtUmV0cnlJbnRlcnZhbCA9IHRydWU7CisJCWxvZ2dlci5kZWJ1ZygiU2V0IG5leHQgcmV0cnkgaW5pdCBpbnRlcnZhbCB0byB7fSIsIG1heEludGVydmFsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9wVGFzaygpIHsKKwkJaWYgKHNjaGVkdWxlZEZ1dHVyZSAhPSBudWxsKSB7CisJCQlib29sZWFuIHJlc3VsdCA9IHNjaGVkdWxlZEZ1dHVyZS5jYW5jZWwodHJ1ZSk7CisJCQlsb2dnZXIuZGVidWcoIlN0b3AgcmVpbml0IHRhc2suIHJlc3VsdCA9IHt9IiwgcmVzdWx0KTsKKwkJCWlmIChmYWxzZSA9PSByZXN1bHQpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVVZWJTeXN0ZW1FcnJvciwgSU5JVF9ESVNUUklCVVRJT05fRU5HSU5FX0ZMT1csICJ0cnkgdG8gc3RvcCB0aGUgcmVpbml0IHRhc2siKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVVZWJTeXN0ZW1FcnJvcihJTklUX0RJU1RSSUJVVElPTl9FTkdJTkVfRkxPVywgInRyeSB0byBzdG9wIHRoZSByZWluaXQgdGFzayIpOworCQkJfQorCQkJc2NoZWR1bGVkRnV0dXJlID0gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisJCXRoaXMuc3RvcFRhc2soKTsKKwkJaWYgKHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSAhPSBudWxsKSB7CisJCQlzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQlyZXN1bHQgPSBpbml0RmxvdygpOworCisJCWlmICh0cnVlID09IHJlc3VsdCkgeworCQkJdGhpcy5zdG9wVGFzaygpOworCQkJdGhpcy5zdGF0dXMuc2V0KHRydWUpOworCQkJaWYgKHRoaXMuZGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2sgIT0gbnVsbCkgeworCQkJCVN0cmluZyB0b3BpY05hbWUgPSBidWlsZFRvcGljTmFtZShkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKCksIGVudk5hbWUpOworCQkJCWxvZ2dlci5kZWJ1Zygic3RhcnQgcG9sbGluZyBkaXN0cmlidXRpb24gc3RhdHVzIHRvcGljIHt9IiwgdG9waWNOYW1lKTsKKwkJCQl0aGlzLmRpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrLnN0YXJ0VGFzayh0b3BpY05hbWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGZhbHNlID09IG1heGltdW1SZXRyeUludGVydmFsKSB7CisJCQkJdGhpcy5yZXN0YXJ0VGFzaygpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogcnVuIGluaXRpYWxpemF0aW9uIGZsb3cKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIGJvb2xlYW4gaW5pdEZsb3coKSB7CisKKwkJbG9nZ2VyLnRyYWNlKCJTdGFydCBpbml0IGZsb3cgZm9yIGVudmlyb25tZW50IHt9IiwgdGhpcy5lbnZOYW1lKTsKKworCQlTZXQ8U3RyaW5nPiB0b3BpY3NMaXN0ID0gbnVsbDsKKwkJRWl0aGVyPFNldDxTdHJpbmc+LCBDYW1icmlhRXJyb3JSZXNwb25zZT4gZ2V0VG9waWNzUmVzID0gbnVsbDsKKworCQlnZXRUb3BpY3NSZXMgPSBjYW1icmlhSGFuZGxlci5nZXRUb3BpY3MoZGVDb25maWd1cmF0aW9uLmdldFVlYlNlcnZlcnMoKSk7CisJCWlmIChnZXRUb3BpY3NSZXMuaXNSaWdodCgpKSB7CisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBzdGF0dXMgPSBnZXRUb3BpY3NSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cy5nZXRPcGVyYXRpb25TdGF0dXMoKSA9PSBDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXRvcGljc0xpc3QgPSBuZXcgSGFzaFNldDw+KCk7CisJCQl9IGVsc2UgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYlN5c3RlbUVycm9yLCBJTklUX0RJU1RSSUJVVElPTl9FTkdJTkVfRkxPVywgInRyeSByZXRyaWV2ZSBsaXN0IG9mIHRvcGljcyBmcm9tIFUtRUIgc2VydmVyIik7CisKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVVZWJTeXN0ZW1FcnJvcihJTklUX0RJU1RSSUJVVElPTl9FTkdJTkVfRkxPVywgInRyeSByZXRyaWV2ZSBsaXN0IG9mIHRvcGljcyBmcm9tIFUtRUIgc2VydmVyIik7CisKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0b3BpY3NMaXN0ID0gZ2V0VG9waWNzUmVzLmxlZnQoKS52YWx1ZSgpOworCQl9CisKKwkJU3RyaW5nIG5vdGlmaWNhdGlvblRvcGljID0gYnVpbGRUb3BpY05hbWUoZGVDb25maWd1cmF0aW9uLmdldERpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lKCksIHRoaXMuZW52TmFtZSk7CisJCWxvZ2dlci5kZWJ1ZygiR29pbmcgdG8gaGFuZGxlIHRvcGljIHt9Iiwgbm90aWZpY2F0aW9uVG9waWMpOworCisJCWJvb2xlYW4gc3RhdHVzID0gY3JlYXRlVG9waWNJZk5vdEV4aXN0cyh0b3BpY3NMaXN0LCBub3RpZmljYXRpb25Ub3BpYyk7CisJCWlmIChmYWxzZSA9PSBzdGF0dXMpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHJlZ2lzdGVyUHJvZHVjZXJTdGF0dXMgPSByZWdpc3RlclRvVG9waWMobm90aWZpY2F0aW9uVG9waWMsIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUik7CisKKwkJQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBjcmVhdGVTdGF0dXMgPSByZWdpc3RlclByb2R1Y2VyU3RhdHVzLmdldE9wZXJhdGlvblN0YXR1cygpOworCisJCWlmIChjcmVhdGVTdGF0dXMgIT0gQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJU3RyaW5nIHN0YXR1c1RvcGljID0gYnVpbGRUb3BpY05hbWUoZGVDb25maWd1cmF0aW9uLmdldERpc3RyaWJ1dGlvblN0YXR1c1RvcGljTmFtZSgpLCB0aGlzLmVudk5hbWUpOworCQlsb2dnZXIuZGVidWcoIkdvaW5nIHRvIGhhbmRsZSB0b3BpYyB7fSIsIHN0YXR1c1RvcGljKTsKKwkJc3RhdHVzID0gY3JlYXRlVG9waWNJZk5vdEV4aXN0cyh0b3BpY3NMaXN0LCBzdGF0dXNUb3BpYyk7CisJCWlmIChmYWxzZSA9PSBzdGF0dXMpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHJlZ2lzdGVyQ29uY3VtZXJTdGF0dXMgPSByZWdpc3RlclRvVG9waWMoc3RhdHVzVG9waWMsIFN1YnNjcmliZXJUeXBlRW51bS5DT05TVU1FUik7CisKKwkJaWYgKHJlZ2lzdGVyQ29uY3VtZXJTdGF0dXMuZ2V0T3BlcmF0aW9uU3RhdHVzKCkgIT0gQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBDYW1icmlhRXJyb3JSZXNwb25zZSByZWdpc3RlclRvVG9waWMoU3RyaW5nIHRvcGljTmFtZSwgU3Vic2NyaWJlclR5cGVFbnVtIHN1YnNjcmliZXJUeXBlKSB7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHJlZ2lzdGVyU3RhdHVzID0gY2FtYnJpYUhhbmRsZXIucmVnaXN0ZXJUb1RvcGljKGRlQ29uZmlndXJhdGlvbi5nZXRVZWJTZXJ2ZXJzKCksIHRvcGljTmFtZSwgZGVDb25maWd1cmF0aW9uLmdldFVlYlB1YmxpY0tleSgpLCBkZUNvbmZpZ3VyYXRpb24uZ2V0VWViU2VjcmV0S2V5KCksIGRlQ29uZmlndXJhdGlvbi5nZXRVZWJQdWJsaWNLZXkoKSwgc3Vic2NyaWJlclR5cGUpOworCisJCVN0cmluZyByb2xlID0gQ09OU1VNRVI7CisJCWlmIChzdWJzY3JpYmVyVHlwZSA9PSBTdWJzY3JpYmVyVHlwZUVudW0uUFJPRFVDRVIpIHsKKwkJCXJvbGUgPSBQUk9EVUNFUjsKKwkJfQorCQlhdWRpdFJlZ2lzdHJhdGlvbih0b3BpY05hbWUsIHJlZ2lzdGVyU3RhdHVzLCByb2xlKTsKKwkJcmV0dXJuIHJlZ2lzdGVyU3RhdHVzOworCX0KKworCXByaXZhdGUgdm9pZCBhdWRpdFJlZ2lzdHJhdGlvbihTdHJpbmcgbm90aWZpY2F0aW9uVG9waWMsIENhbWJyaWFFcnJvclJlc3BvbnNlIHJlZ2lzdGVyUHJvZHVjZXJTdGF0dXMsIFN0cmluZyByb2xlKSB7CisJCWlmIChjb21wb25lbnRzVXRpbHMgIT0gbnVsbCkgeworCQkJSW50ZWdlciBodHRwQ29kZSA9IHJlZ2lzdGVyUHJvZHVjZXJTdGF0dXMuZ2V0SHR0cENvZGUoKTsKKwkJCVN0cmluZyBodHRwQ29kZVN0ciA9IFN0cmluZy52YWx1ZU9mKGh0dHBDb2RlKTsKKwkJCXRoaXMuY29tcG9uZW50c1V0aWxzLmF1ZGl0RGlzdHJpYnV0aW9uRW5naW5lKEF1ZGl0aW5nQWN0aW9uRW51bS5BRERfS0VZX1RPX1RPUElDX0FDTCwgdGhpcy5lbnZOYW1lLCBub3RpZmljYXRpb25Ub3BpYywgcm9sZSwgZGVDb25maWd1cmF0aW9uLmdldFVlYlB1YmxpY0tleSgpLCBodHRwQ29kZVN0cik7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY3JlYXRlVG9waWNJZk5vdEV4aXN0cyhTZXQ8U3RyaW5nPiB0b3BpY3NMaXN0LCBTdHJpbmcgdG9waWNOYW1lKSB7CisKKwkJaWYgKHRvcGljc0xpc3QuY29udGFpbnModG9waWNOYW1lKSkgeworCQkJaWYgKGNvbXBvbmVudHNVdGlscyAhPSBudWxsKSB7CisJCQkJdGhpcy5jb21wb25lbnRzVXRpbHMuYXVkaXREaXN0cmlidXRpb25FbmdpbmUoQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9ESVNUUklCVVRJT05fVE9QSUMsIHRoaXMuZW52TmFtZSwgdG9waWNOYW1lLCBudWxsLCBudWxsLCBBTFJFQURZX0VYSVNUUyk7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIGNyZWF0ZURpc3RyaWJUb3BpY1N0YXR1cyA9IGNhbWJyaWFIYW5kbGVyLmNyZWF0ZVRvcGljKGRlQ29uZmlndXJhdGlvbi5nZXRVZWJTZXJ2ZXJzKCksIGRlQ29uZmlndXJhdGlvbi5nZXRVZWJQdWJsaWNLZXkoKSwgZGVDb25maWd1cmF0aW9uLmdldFVlYlNlY3JldEtleSgpLCB0b3BpY05hbWUsIGRlQ29uZmlndXJhdGlvbi5nZXRDcmVhdGVUb3BpYygpLmdldFBhcnRpdGlvbkNvdW50KCksCisJCQkJZGVDb25maWd1cmF0aW9uLmdldENyZWF0ZVRvcGljKCkuZ2V0UmVwbGljYXRpb25Db3VudCgpKTsKKworCQlDYW1icmlhT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZURpc3RyaWJUb3BpY1N0YXR1cy5nZXRPcGVyYXRpb25TdGF0dXMoKTsKKwkJaWYgKHN0YXR1cyA9PSBDYW1icmlhT3BlcmF0aW9uU3RhdHVzLlRPUElDX0FMUkVBRFlfRVhJU1QpIHsKKwkJCWlmIChjb21wb25lbnRzVXRpbHMgIT0gbnVsbCkgeworCQkJCXRoaXMuY29tcG9uZW50c1V0aWxzLmF1ZGl0RGlzdHJpYnV0aW9uRW5naW5lKEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfRElTVFJJQlVUSU9OX1RPUElDLCB0aGlzLmVudk5hbWUsIHRvcGljTmFtZSwgbnVsbCwgbnVsbCwgQUxSRUFEWV9FWElTVFMpOworCQkJfQorCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlpZiAoY29tcG9uZW50c1V0aWxzICE9IG51bGwpIHsKKwkJCQl0aGlzLmNvbXBvbmVudHNVdGlscy5hdWRpdERpc3RyaWJ1dGlvbkVuZ2luZShBdWRpdGluZ0FjdGlvbkVudW0uQ1JFQVRFX0RJU1RSSUJVVElPTl9UT1BJQywgdGhpcy5lbnZOYW1lLCB0b3BpY05hbWUsIG51bGwsIG51bGwsIENSRUFURUQpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbXBvbmVudHNVdGlscyAhPSBudWxsKSB7CisJCQkJdGhpcy5jb21wb25lbnRzVXRpbHMuYXVkaXREaXN0cmlidXRpb25FbmdpbmUoQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9ESVNUUklCVVRJT05fVE9QSUMsIHRoaXMuZW52TmFtZSwgdG9waWNOYW1lLCBudWxsLCBudWxsLCBGQUlMRUQpOworCQkJfQorCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlVWViU3lzdGVtRXJyb3IsIElOSVRfRElTVFJJQlVUSU9OX0VOR0lORV9GTE9XLCAidHJ5IHRvIGNyZWF0ZSB0b3BpYyAiICsgdG9waWNOYW1lKTsKKworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViU3lzdGVtRXJyb3IoSU5JVF9ESVNUUklCVVRJT05fRU5HSU5FX0ZMT1csICJ0cnkgdG8gY3JlYXRlIHRvcGljICIgKyB0b3BpY05hbWUpOworCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvcGljTmFtZShTdHJpbmcgdG9waWNOYW1lLCBTdHJpbmcgZW52aXJvbm1lbnQpIHsKKwkJcmV0dXJuIHRvcGljTmFtZSArICItIiArIGVudmlyb25tZW50LnRvVXBwZXJDYXNlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7CisJCXJldHVybiB0aGlzLnN0YXR1cy5nZXQoKTsKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRDdXJyZW50UmV0cnlJbnRlcnZhbCgpIHsKKwkJcmV0dXJuIGN1cnJlbnRSZXRyeUludGVydmFsOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldENhbWJyaWFIYW5kbGVyKENhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyKSB7CisJCXRoaXMuY2FtYnJpYUhhbmRsZXIgPSBjYW1icmlhSGFuZGxlcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3YzQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lUG9sbGluZ1Rhc2suamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmNvbmN1cnJlbnQuQmFzaWNUaHJlYWRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uLkRpc3RyaWJ1dGlvblN0YXR1c1RvcGljQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uYXR0Lm5zYS5jYW1icmlhLmNsaWVudC5DYW1icmlhQ29uc3VtZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25FbmdpbmVQb2xsaW5nVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1RSSUJVVElPTl9TVEFUVVNfUE9MTElORyA9ICJkaXN0cmlidXRpb25FbmdpbmVTdGF0dXNQb2xsaW5nIjsKKworCXByaXZhdGUgU3RyaW5nIHRvcGljTmFtZTsKKwlwcml2YXRlIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlsczsKKwlwcml2YXRlIGludCBmZXRjaFRpbWVvdXRJblNlYyA9IDE1OworCXByaXZhdGUgaW50IHBvbGxpbmdJbnRlcnZhbEluU2VjOworCXByaXZhdGUgU3RyaW5nIGNvbnN1bWVySWQ7CisJcHJpdmF0ZSBTdHJpbmcgY29uc3VtZXJHcm91cDsKKwlwcml2YXRlIERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbjsKKworCXByaXZhdGUgQ2FtYnJpYUhhbmRsZXIgY2FtYnJpYUhhbmRsZXIgPSBuZXcgQ2FtYnJpYUhhbmRsZXIoKTsKKwlwcml2YXRlIEdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisKKwlwcml2YXRlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWRQb2xsaW5nU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKDEsIG5ldyBCYXNpY1RocmVhZEZhY3RvcnkuQnVpbGRlcigpLm5hbWluZ1BhdHRlcm4oIlRvcGljUG9sbGluZ1RocmVhZC0lZCIpLmJ1aWxkKCkpOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrLmNsYXNzLmdldE5hbWUoKSk7CisKKwlTY2hlZHVsZWRGdXR1cmU8Pz4gc2NoZWR1bGVkRnV0dXJlID0gbnVsbDsKKwlwcml2YXRlIENhbWJyaWFDb25zdW1lciBjYW1icmlhQ29uc3VtZXIgPSBudWxsOworCisJcHJpdmF0ZSBEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoIGRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGggPSBudWxsOworCisJcHVibGljIERpc3RyaWJ1dGlvbkVuZ2luZVBvbGxpbmdUYXNrKERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiwgU3RyaW5nIGVudk5hbWUsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscywgRGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aCBkaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoKSB7CisKKwkJdGhpcy5jb21wb25lbnRVdGlscyA9IGNvbXBvbmVudFV0aWxzOworCQl0aGlzLmRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gPSBkaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uOworCQlEaXN0cmlidXRpb25TdGF0dXNUb3BpY0NvbmZpZyBzdGF0dXNDb25maWcgPSBkaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uLmdldERpc3RyaWJ1dGlvblN0YXR1c1RvcGljKCk7CisJCXRoaXMucG9sbGluZ0ludGVydmFsSW5TZWMgPSBzdGF0dXNDb25maWcuZ2V0UG9sbGluZ0ludGVydmFsU2VjKCk7CisJCXRoaXMuZmV0Y2hUaW1lb3V0SW5TZWMgPSBzdGF0dXNDb25maWcuZ2V0RmV0Y2hUaW1lU2VjKCk7CisJCXRoaXMuY29uc3VtZXJHcm91cCA9IHN0YXR1c0NvbmZpZy5nZXRDb25zdW1lckdyb3VwKCk7CisJCXRoaXMuY29uc3VtZXJJZCA9IHN0YXR1c0NvbmZpZy5nZXRDb25zdW1lcklkKCk7CisJCXRoaXMuZGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aCA9IGRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGg7CisJfQorCisJcHVibGljIHZvaWQgc3RhcnRUYXNrKFN0cmluZyB0b3BpY05hbWUpIHsKKworCQl0aGlzLnRvcGljTmFtZSA9IHRvcGljTmFtZTsKKwkJbG9nZ2VyLmRlYnVnKCJzdGFydCB0YXNrIGZvciBwb2xsaW5nIHRvcGljIHt9IiwgdG9waWNOYW1lKTsKKwkJaWYgKGZldGNoVGltZW91dEluU2VjIDwgMTUpIHsKKwkJCWxvZ2dlci53YXJuKCJmZXRjaFRpbWVvdXQgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMTUgc2VjLiB1c2UgZGVmYXVsdCIpOworCQkJZmV0Y2hUaW1lb3V0SW5TZWMgPSAxNTsKKwkJfQorCQl0cnkgeworCQkJY2FtYnJpYUNvbnN1bWVyID0gY2FtYnJpYUhhbmRsZXIuY3JlYXRlQ29uc3VtZXIoZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5nZXRVZWJTZXJ2ZXJzKCksIHRvcGljTmFtZSwgZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5nZXRVZWJQdWJsaWNLZXkoKSwgZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5nZXRVZWJTZWNyZXRLZXkoKSwgY29uc3VtZXJJZCwgY29uc3VtZXJHcm91cCwKKwkJCQkJZmV0Y2hUaW1lb3V0SW5TZWMgKiAxMDAwKTsKKworCQkJaWYgKHNjaGVkdWxlZFBvbGxpbmdTZXJ2aWNlICE9IG51bGwpIHsKKwkJCQlsb2dnZXIuZGVidWcoIlN0YXJ0IERpc3RyaWJ1dGlvbiBFbmdpbmUgcG9sbGluZyB0YXNrLiBwb2xsaW5nIGludGVydmFsIHt9IHNlY29uZHMiLCBwb2xsaW5nSW50ZXJ2YWxJblNlYyk7CisJCQkJc2NoZWR1bGVkRnV0dXJlID0gc2NoZWR1bGVkUG9sbGluZ1NlcnZpY2Uuc2NoZWR1bGVBdEZpeGVkUmF0ZSh0aGlzLCAwLCBwb2xsaW5nSW50ZXJ2YWxJblNlYywgVGltZVVuaXQuU0VDT05EUyk7CisKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygidW5leHBlY3RlZCBlcnJvciBvY2N1cmVkIiwgZSk7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvciwgbWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IobWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc3RvcFRhc2soKSB7CisJCWlmIChzY2hlZHVsZWRGdXR1cmUgIT0gbnVsbCkgeworCQkJYm9vbGVhbiByZXN1bHQgPSBzY2hlZHVsZWRGdXR1cmUuY2FuY2VsKHRydWUpOworCQkJbG9nZ2VyLmRlYnVnKCJTdG9wIHBvbGxpbmcgdGFzay4gcmVzdWx0ID0ge30iLCByZXN1bHQpOworCQkJaWYgKGZhbHNlID09IHJlc3VsdCkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYlN5c3RlbUVycm9yLCBESVNUUklCVVRJT05fU1RBVFVTX1BPTExJTkcsICJ0cnkgdG8gc3RvcCB0aGUgcG9sbGluZyB0YXNrIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViU3lzdGVtRXJyb3IoRElTVFJJQlVUSU9OX1NUQVRVU19QT0xMSU5HLCAidHJ5IHRvIHN0b3AgdGhlIHBvbGxpbmcgdGFzayIpOworCQkJfQorCQkJc2NoZWR1bGVkRnV0dXJlID0gbnVsbDsKKwkJfQorCQlpZiAoY2FtYnJpYUNvbnN1bWVyICE9IG51bGwpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiY2xvc2UgY29uc3VtZXIiKTsKKwkJCWNhbWJyaWFIYW5kbGVyLmNsb3NlQ29uc3VtZXIoY2FtYnJpYUNvbnN1bWVyKTsKKwkJfQorCisJfQorCisJcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKwkJdGhpcy5zdG9wVGFzaygpOworCQlzaHV0ZG93bkV4ZWN1dG9yKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlsb2dnZXIudHJhY2UoInJ1bigpIG1ldGhvZC4gcG9sbGluZyBxdWV1ZSB7fSIsIHRvcGljTmFtZSk7CisKKwkJdHJ5IHsKKwkJCS8vIGluaXQgZXJyb3IKKwkJCWlmIChjYW1icmlhQ29uc3VtZXIgPT0gbnVsbCkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYlN5c3RlbUVycm9yLCBESVNUUklCVVRJT05fU1RBVFVTX1BPTExJTkcsICJwb2xsaW5nIHRhc2sgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVVlYlN5c3RlbUVycm9yKERJU1RSSUJVVElPTl9TVEFUVVNfUE9MTElORywgInBvbGxpbmcgdGFzayB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5Iik7CisJCQkJc3RvcFRhc2soKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCUVpdGhlcjxJdGVyYWJsZTxTdHJpbmc+LCBDYW1icmlhRXJyb3JSZXNwb25zZT4gZmV0Y2hSZXN1bHQgPSBjYW1icmlhSGFuZGxlci5mZXRjaEZyb21Ub3BpYyhjYW1icmlhQ29uc3VtZXIpOworCQkJLy8gZmV0Y2ggZXJyb3IKKwkJCWlmIChmZXRjaFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlDYW1icmlhRXJyb3JSZXNwb25zZSBlcnJvclJlc3BvbnNlID0gZmV0Y2hSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYlN5c3RlbUVycm9yLCBESVNUUklCVVRJT05fU1RBVFVTX1BPTExJTkcsICJmYWlsZWQgdG8gZmV0Y2ggbWVzc2FnZXMgZnJvbSB0b3BpYyAiICsgdG9waWNOYW1lICsgIiBlcnJvcjogIiArIGZldGNoUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVWViU3lzdGVtRXJyb3IoRElTVFJJQlVUSU9OX1NUQVRVU19QT0xMSU5HLCAiZmFpbGVkIHRvIGZldGNoIG1lc3NhZ2VzIGZyb20gdG9waWMgIiArIHRvcGljTmFtZSArICIgZXJyb3I6ICIgKyBmZXRjaFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCisJCQkJLy8gVE9ETzogaWYgc3RhdHVzPT0gaW50ZXJuYWwgZXJyb3IgKGNvbm5lY3Rpb24gcHJvYmxlbSkgY2hhbmdlCisJCQkJLy8gc3RhdGUgdG8gaW5hY3RpdmUKKwkJCQkvLyBpbiBuZXh0IHRyeSwgaWYgc3VjY2VlZCAtIGNoYW5nZSB0byBhY3RpdmUKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIHN1Y2Nlc3MKKwkJCUl0ZXJhYmxlPFN0cmluZz4gbWVzc2FnZXMgPSBmZXRjaFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoU3RyaW5nIG1lc3NhZ2UgOiBtZXNzYWdlcykgeworCQkJCWxvZ2dlci50cmFjZSgicmVjZWl2ZWQgbWVzc2FnZSB7fSIsIG1lc3NhZ2UpOworCQkJCXRyeSB7CisJCQkJCURpc3RyaWJ1dGlvblN0YXR1c05vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBnc29uLmZyb21Kc29uKG1lc3NhZ2UsIERpc3RyaWJ1dGlvblN0YXR1c05vdGlmaWNhdGlvbi5jbGFzcyk7CisJCQkJCWNvbXBvbmVudFV0aWxzLmF1ZGl0RGlzdHJpYnV0aW9uU3RhdHVzTm90aWZpY2F0aW9uKEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fU1RBVFVTLCBub3RpZmljYXRpb24uZ2V0RGlzdHJpYnV0aW9uSUQoKSwgbm90aWZpY2F0aW9uLmdldENvbnN1bWVySUQoKSwgdG9waWNOYW1lLCBub3RpZmljYXRpb24uZ2V0QXJ0aWZhY3RVUkwoKSwKKwkJCQkJCQlTdHJpbmcudmFsdWVPZihub3RpZmljYXRpb24uZ2V0VGltZXN0YW1wKCkpLCBub3RpZmljYXRpb24uZ2V0U3RhdHVzKCkubmFtZSgpLCBub3RpZmljYXRpb24uZ2V0RXJyb3JSZWFzb24oKSk7CisKKwkJCQkJZGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aC5zZXRIZWFsdGhDaGVja09rQW5kUmVwb3J0SW5DYXNlTGFzdFN0YXRlSXNEb3duKCk7CisKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBjb252ZXJ0IG1lc3NhZ2UgdG8gb2JqZWN0IiwgZSk7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVlYlN5c3RlbUVycm9yLCBESVNUUklCVVRJT05fU1RBVFVTX1BPTExJTkcsICJmYWlsZWQgdG8gcGFyc2UgbWVzc2FnZSAiICsgbWVzc2FnZSArICIgZnJvbSB0b3BpYyAiICsgdG9waWNOYW1lICsgIiBlcnJvcjogIiArIGZldGNoUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVVlYlN5c3RlbUVycm9yKERJU1RSSUJVVElPTl9TVEFUVVNfUE9MTElORywgImZhaWxlZCB0byBwYXJzZSBtZXNzYWdlICIgKyBtZXNzYWdlICsgIiBmcm9tIHRvcGljICIgKyB0b3BpY05hbWUgKyAiIGVycm9yOiAiICsgZmV0Y2hSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygidW5leHBlY3RlZCBlcnJvciBvY2N1cmVkIiwgZSk7CisJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG5ldyBPYmplY3QoKSB7CisJCQl9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworCisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvciwgbWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IobWV0aG9kTmFtZSwgZS5nZXRNZXNzYWdlKCkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgc2h1dGRvd25FeGVjdXRvcigpIHsKKwkJaWYgKHNjaGVkdWxlZFBvbGxpbmdTZXJ2aWNlID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJc2NoZWR1bGVkUG9sbGluZ1NlcnZpY2Uuc2h1dGRvd24oKTsgLy8gRGlzYWJsZSBuZXcgdGFza3MgZnJvbSBiZWluZworCQkJCQkJCQkJCQkvLyBzdWJtaXR0ZWQKKwkJdHJ5IHsKKwkJCS8vIFdhaXQgYSB3aGlsZSBmb3IgZXhpc3RpbmcgdGFza3MgdG8gdGVybWluYXRlCisJCQlpZiAoIXNjaGVkdWxlZFBvbGxpbmdTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24oNjAsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisJCQkJc2NoZWR1bGVkUG9sbGluZ1NlcnZpY2Uuc2h1dGRvd25Ob3coKTsgLy8gQ2FuY2VsIGN1cnJlbnRseQorCQkJCQkJCQkJCQkJCQkvLyBleGVjdXRpbmcgdGFza3MKKwkJCQkvLyBXYWl0IGEgd2hpbGUgZm9yIHRhc2tzIHRvIHJlc3BvbmQgdG8gYmVpbmcgY2FuY2VsbGVkCisJCQkJaWYgKCFzY2hlZHVsZWRQb2xsaW5nU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKDYwLCBUaW1lVW5pdC5TRUNPTkRTKSkKKwkJCQkJbG9nZ2VyLmRlYnVnKCJQb29sIGRpZCBub3QgdGVybWluYXRlIik7CisJCQl9CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisJCQkvLyAoUmUtKUNhbmNlbCBpZiBjdXJyZW50IHRocmVhZCBhbHNvIGludGVycnVwdGVkCisJCQlzY2hlZHVsZWRQb2xsaW5nU2VydmljZS5zaHV0ZG93bk5vdygpOworCQkJLy8gUHJlc2VydmUgaW50ZXJydXB0IHN0YXR1cworCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EaXN0cmlidXRpb25Ob3RpZmljYXRpb25TZW5kZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uU2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3Mjc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uU2VuZGVyLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24uRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uVG9waWNDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JU2VydmljZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5JbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5UaHJlYWRMb2NhbHNIb2xkZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitAQ29tcG9uZW50KCJkaXN0cmlidXRpb25Ob3RpZmljYXRpb25TZW5kZXIiKQorcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblNlbmRlciB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX1NFTkRJTkcgPSAiZGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uU2VuZGluZyI7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uU2VuZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwkvLyBmaW5hbCBTdHJpbmcgQkFTRV9BUlRJRkFDVF9VUkwgPSAiL2FzZGMvdjEvY2F0YWxvZy9zZXJ2aWNlcy8lcy8lcy8iOworCS8vIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9BUlRJRkFDVF9VUkwgPSBCQVNFX0FSVElGQUNUX1VSTAorCS8vICsgInJlc291cmNlcy8lcy8lcy9hcnRpZmFjdHMvJXMiOworCS8vIGZpbmFsIFN0cmluZyBTRVJWSUNFX0FSVElGQUNUX1VSTCA9IEJBU0VfQVJUSUZBQ1RfVVJMICsgImFydGlmYWN0cy8lcyI7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCUludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbiBpbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByb3RlY3RlZCBJU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcm90ZWN0ZWQgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByb3RlY3RlZCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHM7CisKKwlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbnVsbDsKKworCUNhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyID0gbmV3IENhbWJyaWFIYW5kbGVyKCk7CisKKwlOb3RpZmljYXRpb25FeGVjdXRvclNlcnZpY2Ugbm90aWZpY2F0aW9uRXhlY3V0b3JTZXJ2aWNlID0gbmV3IE5vdGlmaWNhdGlvbkV4ZWN1dG9yU2VydmljZSgpOworCisJcHVibGljIERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblNlbmRlcigpIHsKKwkJc3VwZXIoKTsKKworCQlEaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpY0NvbmZpZyBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpLmdldERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblRvcGljKCk7CisKKwkJZXhlY3V0b3JTZXJ2aWNlID0gbm90aWZpY2F0aW9uRXhlY3V0b3JTZXJ2aWNlLmNyZWF0ZUV4Y2VjdXRvclNlcnZpY2UoZGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uVG9waWMpOworCX0KKworCUBQcmVEZXN0cm95CisJcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisJCWxvZ2dlci5kZWJ1ZygiR29pbmcgdG8gY2xvc2Ugbm90aWZpY2F0aW9uRXhlY3V0b3JTZXJ2aWNlIik7CisJCWlmIChleGVjdXRvclNlcnZpY2UgIT0gbnVsbCkgeworCisJCQlsb25nIG1heFdhaXRpbmdUaW1lID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCkuZ2V0RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uVG9waWMoKS5nZXRNYXhXYWl0aW5nQWZ0ZXJTZW5kaW5nU2Vjb25kcygpOworCisJCQlub3RpZmljYXRpb25FeGVjdXRvclNlcnZpY2Uuc2h1dGRvd25BbmRBd2FpdFRlcm1pbmF0aW9uKGV4ZWN1dG9yU2VydmljZSwgbWF4V2FpdGluZ1RpbWUgKyAxKTsKKwkJfQorCX0KKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNlbmROb3RpZmljYXRpb24oU3RyaW5nIHRvcGljTmFtZSwgU3RyaW5nIGRpc3RyaWJ1dGlvbklkLCBEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGRlQ29uZmlndXJhdGlvbiwgU3RyaW5nIGVudk5hbWUsIElOb3RpZmljYXRpb25EYXRhIG5vdGlmaWNhdGlvbkRhdGEsIFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIG1vZGlmaWVyTmFtZSkgeworCisJCVJ1bm5hYmxlIHRhc2sgPSBuZXcgUHVibGlzaE5vdGlmaWNhdGlvblJ1bm5hYmxlKGVudk5hbWUsIGRpc3RyaWJ1dGlvbklkLCBzZXJ2aWNlLCBub3RpZmljYXRpb25EYXRhLCBkZUNvbmZpZ3VyYXRpb24sIHRvcGljTmFtZSwgdXNlcklkLCBtb2RpZmllck5hbWUsIGNhbWJyaWFIYW5kbGVyLCBjb21wb25lbnRVdGlscywgVGhyZWFkTG9jYWxzSG9sZGVyLmdldFV1aWQoKSk7CisJCXRyeSB7CisJCQlleGVjdXRvclNlcnZpY2Uuc3VibWl0KHRhc2spOworCQl9IGNhdGNoIChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIud2FybigiRmFpbGVkIHRvIHN1Ym1pdCB0YXNrLiBOdW1iZXIgb2YgdGhyZWFkcyBleGNlZWVkcyIsIGUpOworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT1ZFUkxPQUQ7CisJCX0KKworCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwkvKioKKwkgKiBBdWRpdCB0aGUgcHVibGlzaGluZyBub3RpZmljYXRpb24gaW4gY2FzZSBvZiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuCisJICogCisJICogQHBhcmFtIHRvcGljTmFtZQorCSAqIEBwYXJhbSBzdGF0dXMKKwkgKiBAcGFyYW0gZGlzdHJpYnV0aW9uSWQKKwkgKiBAcGFyYW0gZW52TmFtZQorCSAqLworCXByaXZhdGUgdm9pZCBhdWRpdERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkludGVybmFsU2VydmVyRXJyb3IoU3RyaW5nIHRvcGljTmFtZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMsIFN0cmluZyBkaXN0cmlidXRpb25JZCwgU3RyaW5nIGVudk5hbWUpIHsKKworCQlpZiAodGhpcy5jb21wb25lbnRVdGlscyAhPSBudWxsKSB7CisJCQl0aGlzLmNvbXBvbmVudFV0aWxzLmF1ZGl0RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uKEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fTk9USUZZLCAiIiwgIiAiLCAiU2VydmljZSIsICIgIiwgIiAiLCAiICIsIGVudk5hbWUsICIgIiwgdG9waWNOYW1lLCBkaXN0cmlidXRpb25JZCwgIkVycm9yOiBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IuICIgKyBzdGF0dXMsICIgIik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgQ2FtYnJpYUVycm9yUmVzcG9uc2UgcHVibGlzaE5vdGlmaWNhdGlvbihJTm90aWZpY2F0aW9uRGF0YSBkYXRhLCBEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGRlQ29uZmlndXJhdGlvbiwgU3RyaW5nIHRvcGljTmFtZSkgeworCisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHN0YXR1cyA9IGNhbWJyaWFIYW5kbGVyLnNlbmROb3RpZmljYXRpb24odG9waWNOYW1lLCBkZUNvbmZpZ3VyYXRpb24uZ2V0VWViUHVibGljS2V5KCksIGRlQ29uZmlndXJhdGlvbi5nZXRVZWJTZWNyZXRLZXkoKSwgZGVDb25maWd1cmF0aW9uLmdldFVlYlNlcnZlcnMoKSwgZGF0YSk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uU3RhdHVzTm90aWZpY2F0aW9uLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvblN0YXR1c05vdGlmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTAzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvblN0YXR1c05vdGlmaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25TdGF0dXNOb3RpZmljYXRpb24geworCisJU3RyaW5nIGRpc3RyaWJ1dGlvbklEOworCVN0cmluZyBjb25zdW1lcklEOworCWxvbmcgdGltZXN0YW1wOworCVN0cmluZyBhcnRpZmFjdFVSTDsKKwlEaXN0cmlidXRpb25TdGF0dXNOb3RpZmljYXRpb25FbnVtIHN0YXR1czsKKwlTdHJpbmcgZXJyb3JSZWFzb247CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc3RyaWJ1dGlvbklEKCkgeworCQlyZXR1cm4gZGlzdHJpYnV0aW9uSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0aW9uSUQoU3RyaW5nIGRpc3RyaWJ1dGlvbklkKSB7CisJCXRoaXMuZGlzdHJpYnV0aW9uSUQgPSBkaXN0cmlidXRpb25JZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVySUQoKSB7CisJCXJldHVybiBjb25zdW1lcklEOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVySUQoU3RyaW5nIGNvbnN1bWVySWQpIHsKKwkJdGhpcy5jb25zdW1lcklEID0gY29uc3VtZXJJZDsKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisJCXJldHVybiB0aW1lc3RhbXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgdGltZXN0YW1wKSB7CisJCXRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RVUkwoKSB7CisJCXJldHVybiBhcnRpZmFjdFVSTDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFVSTChTdHJpbmcgYXJ0aWZhY3RVUkwpIHsKKwkJdGhpcy5hcnRpZmFjdFVSTCA9IGFydGlmYWN0VVJMOworCX0KKworCXB1YmxpYyBEaXN0cmlidXRpb25TdGF0dXNOb3RpZmljYXRpb25FbnVtIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoRGlzdHJpYnV0aW9uU3RhdHVzTm90aWZpY2F0aW9uRW51bSBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFcnJvclJlYXNvbigpIHsKKwkJcmV0dXJuIGVycm9yUmVhc29uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVycm9yUmVhc29uKFN0cmluZyBlcnJvclJlYXNvbikgeworCQl0aGlzLmVycm9yUmVhc29uID0gZXJyb3JSZWFzb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJEaXN0cmlidXRpb25TdGF0dXNOb3RpZmljYXRpb24gW2Rpc3RyaWJ1dGlvbklkPSIgKyBkaXN0cmlidXRpb25JRCArICIsIGNvbnN1bWVySWQ9IiArIGNvbnN1bWVySUQgKyAiLCB0aW1lc3RhbXA9IiArIHRpbWVzdGFtcCArICIsIGFydGlmYWN0VVJMPSIgKyBhcnRpZmFjdFVSTCArICIsIHN0YXR1cz0iICsgc3RhdHVzICsgIiwgZXJyb3JSZWFzb249IiArIGVycm9yUmVhc29uICsgIl0iOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uU3RhdHVzTm90aWZpY2F0aW9uRW51bS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EaXN0cmlidXRpb25TdGF0dXNOb3RpZmljYXRpb25FbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3N2YzOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uU3RhdHVzTm90aWZpY2F0aW9uRW51bS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK3B1YmxpYyBlbnVtIERpc3RyaWJ1dGlvblN0YXR1c05vdGlmaWNhdGlvbkVudW0geworCisJRE9XTkxPQURfT0ssIERPV05MT0FEX0VSUk9SLCBBTFJFQURZX0RPV05MT0FERUQsIERFUExPWV9PSywgREVQTE9ZX0VSUk9SLCBBTFJFQURZX0RFUExPWUVELCBOT1RJRklFRCwgTk9UX05PVElGSUVECit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0lBcnRpZmFjdEluZm8uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSUFydGlmYWN0SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWY0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0lBcnRpZmFjdEluZm8uamF2YQpAQCAtMCwwICsxLDYzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworCitwdWJsaWMgaW50ZXJmYWNlIElBcnRpZmFjdEluZm8geworCisJLyoqIEFydGlmYWN0IEZpbGUgbmFtZSAqLworCVN0cmluZyBnZXRBcnRpZmFjdE5hbWUoKTsKKworCS8qKgorCSAqIEFydGlmYWN0IFR5cGUuPGJyPgorCSAqIEZvbGxvd2luZyBhcmUgdmFsaWQgdmFsdWVzIDogSEVBVCAsIERHX1hNTC4gPGJyPgorCSAqIExpc3Qgb2YgdmFsdWVzIHdpbGwgYmUgZXh0ZW5kZWQgaW4gcG9zdC0xNTEwIHJlbGVhc2VzLgorCSAqLworCUFydGlmYWN0VHlwZUVudW0gZ2V0QXJ0aWZhY3RUeXBlKCk7CisKKwkvKioKKwkgKiBSZWxhdGl2ZSBhcnRpZmFjdCdzIFVSTC4gU2hvdWxkIGJlIHVzZWQgaW4gUkVTVCBHRVQgQVBJIHRvIGRvd25sb2FkIHRoZSBhcnRpZmFjdCdzIHBheWxvYWQuPGJyPgorCSAqIFRoZSBmdWxsIGFydGlmYWN0IFVSTCB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0IDo8YnI+CisJICogaHR0cHM6Ly97c2VydmVyQmFzZVVSTH0ve3Jlc291cmNlUGF0aH08YnI+CisJICogc2VydmVyQmFzZVVSTCAtIEhvc3RuYW1lICggQVNEQyBMQiBGUUROKSArIG9wdGlvbmFsIHBvcnQgPGJyPgorCSAqIHJlc291cmNlUGF0aCAtICJhcnRpZmFjdFVSTCIgPGJyPgorCSAqIEV4IDogaHR0cHM6Ly9hc2RjLnNkYy5jb20vdjEvY2F0YWxvZy9zZXJ2aWNlcy9zcnYxLzIuMC9yZXNvdXJjZXMvYWFhLzEuMC9hcnRpZmFjdHMvYWFhLnltbAorCSAqLworCVN0cmluZyBnZXRBcnRpZmFjdFVSTCgpOworCisJLyoqCisJICogQmFzZS02NCBlbmNvZGVkIE1ENSBjaGVja3N1bSBvZiB0aGUgYXJ0aWZhY3QncyBwYXlsb2FkLjxicj4KKwkgKiBTaG91bGQgYmUgdXNlZCBmb3IgZGF0YSBpbnRlZ3JpdHkgdmFsaWRhdGlvbiB3aGVuIGFuIGFydGlmYWN0J3MgcGF5bG9hZCBpcyBkb3dubG9hZGVkLjxicj4KKwkgKi8KKwlTdHJpbmcgZ2V0QXJ0aWZhY3RDaGVja3N1bSgpOworCisJLyoqCisJICogSW5zdGFsbGF0aW9uIHRpbWVvdXQuIFVzZWQgYnkgdGhlIG9yY2hlc3RyYXRvci4KKwkgKi8KKwlJbnRlZ2VyIGdldEFydGlmYWN0VGltZW91dCgpOworCisJLyoqCisJICogQXJ0aWZhY3QgZGVzY3JpcHRpb24KKwkgKi8KKwlTdHJpbmcgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0lEaXN0cmlidXRpb25FbmdpbmUuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSURpc3RyaWJ1dGlvbkVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzE1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0lEaXN0cmlidXRpb25FbmdpbmUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSURpc3RyaWJ1dGlvbkVuZ2luZSB7CisKKwlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgbm90aWZ5U2VydmljZShTdHJpbmcgZGlzdHJpYnV0aW9uSWQsIFNlcnZpY2Ugc2VydmljZSwgSU5vdGlmaWNhdGlvbkRhdGEgbm90aWZpY2F0aW9uRGF0YSwgU3RyaW5nIGVudk5hbWUsIFN0cmluZyB1c2VySWQsIFN0cmluZyBtb2RpZmllck5hbWUpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgaXNFbnZpcm9ubWVudEF2YWlsYWJsZShTdHJpbmcgZW52TmFtZSk7CisKKwkvKioKKwkgKiBDdXJyZW50bHksIGl0IHVzZWQgZm9yIHRlc3RzLiBGb3IgcmVhbCBpbXBsZW1lbnRhdGlvbiB3ZSBuZWVkIGNhbmNlbCB0aGUgaW5pdGlhbGl6YXRpb24gdGFzayBhbmQgdGhlIHBvbGxpbmcgdGFzay4KKwkgKiAKKwkgKiBAcGFyYW0gZW52TmFtZQorCSAqLworCXB1YmxpYyB2b2lkIGRpc2FibGVFbnZpcm9ubWVudChTdHJpbmcgZW52TmFtZSk7CisKKwlwdWJsaWMgRWl0aGVyPElOb3RpZmljYXRpb25EYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc1JlYWR5Rm9yRGlzdHJpYnV0aW9uKFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIGRpc3RyaWJ1dGlvbklkLCBTdHJpbmcgZW52TmFtZSk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSU5vdGlmaWNhdGlvbkRhdGEuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSU5vdGlmaWNhdGlvbkRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY2YzQyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9JTm90aWZpY2F0aW9uRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgSU5vdGlmaWNhdGlvbkRhdGEgeworCS8qKgorCSAqIEdsb2JhbCBEaXN0cmlidXRpb24gSWRlbnRpZmllcjogVVVJRCBnZW5lcmF0ZWQgYnkgQVNEQyBwZXIgZWFjaCBkaXN0cmlidXRpb24gYWN0aXZhdGlvbi48YnI+CisJICogR2VuZXJhdGVkIFVVSUQgaXMgY29tcGxpYW50IHdpdGggUkZDIDQxMjIuPGJyPgorCSAqIEl0IGlzIGEgMTI4LWJpdCB2YWx1ZSBmb3JtYXR0ZWQgaW50byBibG9ja3Mgb2YgaGV4YWRlY2ltYWwgZGlnaXRzIHNlcGFyYXRlZCBieSBhIGh5cGhlbiAoIi0iKS48YnI+CisJICogRXguOiBBQTk3QjE3Ny05MzgzLTQ5MzQtODU0My0wRjkxQTdBMDI4MzYKKwkgKi8KKwlTdHJpbmcgZ2V0RGlzdHJpYnV0aW9uSUQoKTsKKworCS8qKiBMb2dpY2FsIFNlcnZpY2UgTmFtZS4gKi8KKwlTdHJpbmcgZ2V0U2VydmljZU5hbWUoKTsKKworCS8qKgorCSAqIFNlcnZpY2UgVmVyc2lvbi48YnI+CisJICogVHdvIGRvdCAoIi4iKSBzZXBhcmF0ZWQgZGlnaXQgYmxvY2tzLjxicj4KKwkgKiBFeC4gOiAiMi4wIgorCSAqLworCVN0cmluZyBnZXRTZXJ2aWNlVmVyc2lvbigpOworCisJLyoqCisJICogR2xvYmFsIFVVSUQgZ2VuZXJhdGVkIGJ5IEFTREMgcGVyIGVhY2ggc2VydmljZSB2ZXJzaW9uLiBHZW5lcmF0ZWQgVVVJRCBpcyBjb21wbGlhbnQgd2l0aCBSRkMgNDEyMi48YnI+CisJICogSXQgaXMgYSAxMjgtYml0IHZhbHVlIGZvcm1hdHRlZCBpbnRvIGJsb2NrcyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgc2VwYXJhdGVkIGJ5IGEgaHlwaGVuICgiLSIpLjxicj4KKwkgKiBFeC4gOiBBQTk3QjE3Ny05MzgzLTQ5MzQtODU0My0wRjkxQTdBMDI4MzYKKwkgKi8KKwlTdHJpbmcgZ2V0U2VydmljZVVVSUQoKTsKKworCS8qKgorCSAqIFNlcnZpY2UgZGVzY3JpcHRpb24KKwkgKi8KKwlTdHJpbmcgZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXJ2aWNlSW52YXJpYW50IFVVSUQKKwkgKi8KKwlTdHJpbmcgZ2V0U2VydmljZUludmFyaWFudFVVSUQoKTsKKworCS8qKiBMaXN0IG9mIHRoZSByZXNvdXJjZSBpbnN0YW5jZXMgKi8KKwlMaXN0PEpzb25Db250YWluZXJSZXNvdXJjZUluc3RhbmNlPiBnZXRSZXNvdXJjZXMoKTsKKworCS8qKiBMaXN0IG9mIHRoZSBhcnRpZmFjdHMgKi8KKwlMaXN0PEFydGlmYWN0SW5mb0ltcGw+IGdldFNlcnZpY2VBcnRpZmFjdHMoKTsKKworCXZvaWQgc2V0RGlzdHJpYnV0aW9uSUQoU3RyaW5nIGRpc3RyaWJ1dGlvbklkKTsKKworCS8qKiBMb2dpY2FsIFNlcnZpY2UgTmFtZS4gKi8KKwl2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSk7CisKKwkvKioKKwkgKiBTZXJ2aWNlIFZlcnNpb24uPGJyPgorCSAqIFR3byBkb3QgKCIuIikgc2VwYXJhdGVkIGRpZ2l0IGJsb2Nrcy48YnI+CisJICogRXguIDogIjIuMCIKKwkgKi8KKwl2b2lkIHNldFNlcnZpY2VWZXJzaW9uKFN0cmluZyBzZXJ2aWNlVmVyc2lvbik7CisKKwkvKioKKwkgKiBHbG9iYWwgVVVJRCBnZW5lcmF0ZWQgYnkgQVNEQyBwZXIgZWFjaCBzZXJ2aWNlIHZlcnNpb24uIEdlbmVyYXRlZCBVVUlEIGlzIGNvbXBsaWFudCB3aXRoIFJGQyA0MTIyLjxicj4KKwkgKiBJdCBpcyBhIDEyOC1iaXQgdmFsdWUgZm9ybWF0dGVkIGludG8gYmxvY2tzIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyBzZXBhcmF0ZWQgYnkgYSBoeXBoZW4gKCItIikuPGJyPgorCSAqIEV4LiA6IEFBOTdCMTc3LTkzODMtNDkzNC04NTQzLTBGOTFBN0EwMjgzNgorCSAqLworCXZvaWQgc2V0U2VydmljZVVVSUQoU3RyaW5nIHNlcnZpY2VVVUlEKTsKKworCS8qKgorCSAqIFNlcnZpY2UgRGVzY3JpcHRpb24KKwkgKi8KKwl2b2lkIHNldFNlcnZpY2VEZXNjcmlwdGlvbihTdHJpbmcgc2VydmljZURlc2NyaXB0aW9uKTsKKworCS8qKgorCSAqIFNlcnZpY2VJbnZhcmlhbnQgVVVJRAorCSAqLworCXZvaWQgc2V0U2VydmljZUludmFyaWFudFVVSUQoU3RyaW5nIHNlcnZpY2VJbnZhcmlhbnRVdWlkKTsKKworCS8qKiBMaXN0IG9mIHRoZSBSZXNvdXJjZSBJbnN0YW5jZXMgKi8KKwl2b2lkIHNldFJlc291cmNlcyhMaXN0PEpzb25Db250YWluZXJSZXNvdXJjZUluc3RhbmNlPiByZXNvdXJjZSk7CisKKwkvKiogTGlzdCBvZiB0aGUgUmVzb3VyY2UgSW5zdGFuY2VzICovCisJdm9pZCBzZXRTZXJ2aWNlQXJ0aWZhY3RzKExpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gYXJ0aWZhY3RzKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9JUmVzb3VyY2VBcnRpZmFjdEluZm8uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSVJlc291cmNlQXJ0aWZhY3RJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3N2I5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSVJlc291cmNlQXJ0aWZhY3RJbmZvLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VBcnRpZmFjdEluZm8gZXh0ZW5kcyBJQXJ0aWZhY3RJbmZvIHsKKworCS8qKiByZXNvdXJjZSBuYW1lICovCisJU3RyaW5nIGdldFJlc291cmNlTmFtZSgpOworCisJLyoqIHJlc291cmNlIHZlcnNpb24gKi8KKwlTdHJpbmcgZ2V0UmVzb3VyY2VWZXJzaW9uKCk7CisKKwkvKioKKwkgKiBHbG9iYWwgVVVJRCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBzcGVjaWZpYyBhcnRpZmFjdCBiZWxvbmdzIHRvLjxicj4KKwkgKiBJdCBpcyBnZW5lcmF0ZWQgYnkgQVNEQyBwZXIgZWFjaCByZXNvdXJjZSB2ZXJzaW9uLjxicj4KKwkgKiBHZW5lcmF0ZWQgVVVJRCBpcyBjb21wbGlhbnQgd2l0aCBSRkMgNDEyMi4gSXQgaXMgYSAxMjgtYml0IHZhbHVlIGZvcm1hdHRlZCBpbnRvIGJsb2NrcyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgc2VwYXJhdGVkIGJ5IGEgaHlwaGVuICgiLSIpLiA8YnI+CisJICogRXguOiBBQTk3QjE3Ny05MzgzLTQ5MzQtODU0My0wRjkxQTdBMDI4MzYKKwkgKi8KKwlTdHJpbmcgZ2V0UmVzb3VyY2VVVUlEKCk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSVNlcnZpY2VBcnRpZmFjdEluZm8uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvSVNlcnZpY2VBcnRpZmFjdEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTAyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9JU2VydmljZUFydGlmYWN0SW5mby5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVNlcnZpY2VBcnRpZmFjdEluZm8gZXh0ZW5kcyBJQXJ0aWZhY3RJbmZvIHsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9Kc29uQ29udGFpbmVyUmVzb3VyY2VJbnN0YW5jZS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9Kc29uQ29udGFpbmVyUmVzb3VyY2VJbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTZmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0pzb25Db250YWluZXJSZXNvdXJjZUluc3RhbmNlLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworCitwdWJsaWMgY2xhc3MgSnNvbkNvbnRhaW5lclJlc291cmNlSW5zdGFuY2UgeworCXByaXZhdGUgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lLCByZXNvdXJjZU5hbWUsIHJlc291cmNlVmVyc2lvbiwgcmVzb3VjcmVUeXBlLCByZXNvdXJjZVVVSUQsIHJlc291cmNlSW52YXJpYW50VVVJRDsKKwlwcml2YXRlIExpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gYXJ0aWZhY3RzOworCisJcHVibGljIEpzb25Db250YWluZXJSZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UsIFN0cmluZyByZXNvdXJjZVR5cGUsIExpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gYXJ0aWZhY3RzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMucmVzb3VyY2VJbnN0YW5jZU5hbWUgPSByZXNvdXJjZUluc3RhbmNlLmdldE5hbWUoKTsKKwkJdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZUluc3RhbmNlLmdldENvbXBvbmVudE5hbWUoKTsKKwkJdGhpcy5yZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZUluc3RhbmNlLmdldENvbXBvbmVudFZlcnNpb24oKTsKKwkJdGhpcy5yZXNvdWNyZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJCXRoaXMucmVzb3VyY2VVVUlEID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKTsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJcHVibGljIEpzb25Db250YWluZXJSZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UsIFN0cmluZyByZXNvdXJjZUludmFyaWFudFVVSUQsIFN0cmluZyByZXNvdXJjZVR5cGUsIExpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gYXJ0aWZhY3RzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMucmVzb3VyY2VJbnN0YW5jZU5hbWUgPSByZXNvdXJjZUluc3RhbmNlLmdldE5hbWUoKTsKKwkJdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZUluc3RhbmNlLmdldENvbXBvbmVudE5hbWUoKTsKKwkJdGhpcy5yZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZUluc3RhbmNlLmdldENvbXBvbmVudFZlcnNpb24oKTsKKwkJdGhpcy5yZXNvdWNyZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJCXRoaXMucmVzb3VyY2VVVUlEID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKTsKKwkJdGhpcy5yZXNvdXJjZUludmFyaWFudFVVSUQgPSByZXNvdXJjZUludmFyaWFudFVVSUQ7CisJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VJbnN0YW5jZU5hbWUoKSB7CisJCXJldHVybiByZXNvdXJjZUluc3RhbmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUluc3RhbmNlTmFtZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUpIHsKKwkJdGhpcy5yZXNvdXJjZUluc3RhbmNlTmFtZSA9IHJlc291cmNlSW5zdGFuY2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VWZXJzaW9uKCkgeworCQlyZXR1cm4gcmVzb3VyY2VWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVmVyc2lvbihTdHJpbmcgcmVzb3VyY2VWZXJzaW9uKSB7CisJCXRoaXMucmVzb3VyY2VWZXJzaW9uID0gcmVzb3VyY2VWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VjcmVUeXBlKCkgeworCQlyZXR1cm4gcmVzb3VjcmVUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291Y3JlVHlwZShTdHJpbmcgcmVzb3VjcmVUeXBlKSB7CisJCXRoaXMucmVzb3VjcmVUeXBlID0gcmVzb3VjcmVUeXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVVUlEKCkgeworCQlyZXR1cm4gcmVzb3VyY2VVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVVVJRChTdHJpbmcgcmVzb3VyY2VVVUlEKSB7CisJCXRoaXMucmVzb3VyY2VVVUlEID0gcmVzb3VyY2VVVUlEOworCX0KKworCXB1YmxpYyBMaXN0PEFydGlmYWN0SW5mb0ltcGw+IGdldEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHMoTGlzdDxBcnRpZmFjdEluZm9JbXBsPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUludmFyaWFudFVVSUQoKSB7CisJCXJldHVybiByZXNvdXJjZUludmFyaWFudFVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJbnZhcmlhbnRVVUlEKFN0cmluZyByZXNvdXJjZUludmFyaWFudFVVSUQpIHsKKwkJdGhpcy5yZXNvdXJjZUludmFyaWFudFVVSUQgPSByZXNvdXJjZUludmFyaWFudFVVSUQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL05vdGlmaWNhdGlvbkRhdGFJbXBsLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL05vdGlmaWNhdGlvbkRhdGFJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyZWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvTm90aWZpY2F0aW9uRGF0YUltcGwuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uRGF0YUltcGwgaW1wbGVtZW50cyBJTm90aWZpY2F0aW9uRGF0YSB7CisKKwlwcml2YXRlIFN0cmluZyBkaXN0cmlidXRpb25JRDsKKwlwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZTsKKwlwcml2YXRlIFN0cmluZyBzZXJ2aWNlVmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBzZXJ2aWNlVVVJRDsKKwlwcml2YXRlIFN0cmluZyBzZXJ2aWNlRGVzY3JpcHRpb247CisJcHJpdmF0ZSBTdHJpbmcgc2VydmljZUludmFyaWFudFVVSUQ7CisJcHJpdmF0ZSBMaXN0PEpzb25Db250YWluZXJSZXNvdXJjZUluc3RhbmNlPiByZXNvdXJjZXM7CisJcHJpdmF0ZSBMaXN0PEFydGlmYWN0SW5mb0ltcGw+IHNlcnZpY2VBcnRpZmFjdHM7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldERpc3RyaWJ1dGlvbklEKCkgeworCQlyZXR1cm4gZGlzdHJpYnV0aW9uSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKKwkJcmV0dXJuIHNlcnZpY2VOYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVZlcnNpb24oKSB7CisJCXJldHVybiBzZXJ2aWNlVmVyc2lvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VVVUlEKCkgeworCQlyZXR1cm4gc2VydmljZVVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0aW9uSUQoU3RyaW5nIGRpc3RyaWJ1dGlvbklEKSB7CisJCXRoaXMuZGlzdHJpYnV0aW9uSUQgPSBkaXN0cmlidXRpb25JRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKKwkJdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VWZXJzaW9uKFN0cmluZyBzZXJ2aWNlVmVyc2lvbikgeworCQl0aGlzLnNlcnZpY2VWZXJzaW9uID0gc2VydmljZVZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZVVVSUQoU3RyaW5nIHNlcnZpY2VVVUlEKSB7CisJCXRoaXMuc2VydmljZVVVSUQgPSBzZXJ2aWNlVVVJRDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIHNlcnZpY2VEZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRGVzY3JpcHRpb24oU3RyaW5nIHNlcnZpY2VEZXNjcmlwdGlvbikgeworCQl0aGlzLnNlcnZpY2VEZXNjcmlwdGlvbiA9IHNlcnZpY2VEZXNjcmlwdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIk5vdGlmaWNhdGlvbkRhdGFJbXBsIFtkaXN0cmlidXRpb25JRD0iICsgZGlzdHJpYnV0aW9uSUQgKyAiLCBzZXJ2aWNlTmFtZT0iICsgc2VydmljZU5hbWUgKyAiLCBzZXJ2aWNlVmVyc2lvbj0iICsgc2VydmljZVZlcnNpb24gKyAiLCBzZXJ2aWNlVVVJRD0iICsgc2VydmljZVVVSUQgKyAiLCBzZXJ2aWNlSW52YXJpYW50VVVJRD0iICsgc2VydmljZUludmFyaWFudFVVSUQgKyAiXSI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SnNvbkNvbnRhaW5lclJlc291cmNlSW5zdGFuY2U+IGdldFJlc291cmNlcygpIHsKKwkJcmV0dXJuIHJlc291cmNlczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoTGlzdDxKc29uQ29udGFpbmVyUmVzb3VyY2VJbnN0YW5jZT4gcmVzb3VyY2VzKSB7CisJCXRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gZ2V0U2VydmljZUFydGlmYWN0cygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gc2VydmljZUFydGlmYWN0czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQXJ0aWZhY3RzKExpc3Q8QXJ0aWZhY3RJbmZvSW1wbD4gc2VydmljZUFydGlmYWN0cykgeworCQl0aGlzLnNlcnZpY2VBcnRpZmFjdHMgPSBzZXJ2aWNlQXJ0aWZhY3RzOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW52YXJpYW50VVVJRCgpIHsKKwkJcmV0dXJuIHNlcnZpY2VJbnZhcmlhbnRVVUlEOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnZhcmlhbnRVVUlEKFN0cmluZyBzZXJ2aWNlSW52YXJpYW50VVVJRCkgeworCQl0aGlzLnNlcnZpY2VJbnZhcmlhbnRVVUlEID0gc2VydmljZUludmFyaWFudFVVSUQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL05vdGlmaWNhdGlvbkV4ZWN1dG9yU2VydmljZS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9Ob3RpZmljYXRpb25FeGVjdXRvclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZiYjJjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9Ob3RpZmljYXRpb25FeGVjdXRvclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5EaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpY0NvbmZpZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnlCdWlsZGVyOworCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uRXhlY3V0b3JTZXJ2aWNlIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihOb3RpZmljYXRpb25FeGVjdXRvclNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBFeGVjdXRvclNlcnZpY2UgY3JlYXRlRXhjZWN1dG9yU2VydmljZShEaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpY0NvbmZpZyBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYykgeworCisJCUludGVnZXIgbWluVGhyZWFkUG9vbFNpemUgPSBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYy5nZXRNaW5UaHJlYWRQb29sU2l6ZSgpOworCQlpZiAobWluVGhyZWFkUG9vbFNpemUgPT0gbnVsbCkgeworCQkJbWluVGhyZWFkUG9vbFNpemUgPSAwOworCQl9CisKKwkJSW50ZWdlciBtYXhUaHJlYWRQb29sU2l6ZSA9IGRpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblRvcGljLmdldE1heFRocmVhZFBvb2xTaXplKCk7CisJCWlmIChtYXhUaHJlYWRQb29sU2l6ZSA9PSBudWxsKSB7CisJCQltYXhUaHJlYWRQb29sU2l6ZSA9IDEwOworCQl9CisKKwkJVGhyZWFkRmFjdG9yeUJ1aWxkZXIgdGhyZWFkRmFjdG9yeUJ1aWxkZXIgPSBuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKTsKKwkJdGhyZWFkRmFjdG9yeUJ1aWxkZXIuc2V0TmFtZUZvcm1hdCgiZGlzdHJpYnV0aW9uLW5vdGlmaWNhdGlvbi10aHJlYWQtJWQiKTsKKwkJVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gdGhyZWFkRmFjdG9yeUJ1aWxkZXIuYnVpbGQoKTsKKworCQlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihtaW5UaHJlYWRQb29sU2l6ZSwgbWF4VGhyZWFkUG9vbFNpemUsIDYwTCwgVGltZVVuaXQuU0VDT05EUywgbmV3IFN5bmNocm9ub3VzUXVldWU8UnVubmFibGU+KCksIHRocmVhZEZhY3RvcnkpOworCisJCXJldHVybiBleGVjdXRvclNlcnZpY2U7CisJfQorCisJcHVibGljIHZvaWQgc2h1dGRvd25BbmRBd2FpdFRlcm1pbmF0aW9uKEV4ZWN1dG9yU2VydmljZSBwb29sLCBsb25nIG1heFRpbWVUb1dhaXQpIHsKKworCQlsb2dnZXIuZGVidWcoInNodXRkb3duIE5vdGlmaWNhdGlvbkV4ZWN1dG9yU2VydmljZSIpOworCQlwb29sLnNodXRkb3duKCk7IC8vIERpc2FibGUgbmV3IHRhc2tzIGZyb20gYmVpbmcgc3VibWl0dGVkCisJCXRyeSB7CisJCQkvLyBXYWl0IGEgd2hpbGUgZm9yIGV4aXN0aW5nIHRhc2tzIHRvIHRlcm1pbmF0ZQorCQkJaWYgKCFwb29sLmF3YWl0VGVybWluYXRpb24obWF4VGltZVRvV2FpdCwgVGltZVVuaXQuU0VDT05EUykpIHsKKwkJCQlwb29sLnNodXRkb3duTm93KCk7IC8vIENhbmNlbCBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2tzCisJCQkJLy8gV2FpdCBhIHdoaWxlIGZvciB0YXNrcyB0byByZXNwb25kIHRvIGJlaW5nIGNhbmNlbGxlZAorCQkJCWlmICghcG9vbC5hd2FpdFRlcm1pbmF0aW9uKG1heFRpbWVUb1dhaXQsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisJCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGNsb3NlIGV4ZWN1dG9yIHNlcnZpY2UiKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisJCQkvLyAoUmUtKUNhbmNlbCBpZiBjdXJyZW50IHRocmVhZCBhbHNvIGludGVycnVwdGVkCisJCQlwb29sLnNodXRkb3duTm93KCk7CisJCQkvLyBQcmVzZXJ2ZSBpbnRlcnJ1cHQgc3RhdHVzCisJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1B1Ymxpc2hOb3RpZmljYXRpb25SdW5uYWJsZS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9QdWJsaXNoTm90aWZpY2F0aW9uUnVubmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJmMzk0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9QdWJsaXNoTm90aWZpY2F0aW9uUnVubmFibGUuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LkNhbWJyaWFPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVGhyZWFkTG9jYWxzSG9sZGVyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBQdWJsaXNoTm90aWZpY2F0aW9uUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwlwcml2YXRlIFN0cmluZyBlbnZOYW1lOworCXByaXZhdGUgU3RyaW5nIGRpc3RyaWJ1dGlvbklkOworCXByaXZhdGUgU2VydmljZSBzZXJ2aWNlOworCXByaXZhdGUgSU5vdGlmaWNhdGlvbkRhdGEgZGF0YTsKKwlwcml2YXRlIERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGVDb25maWd1cmF0aW9uOworCXByaXZhdGUgU3RyaW5nIHRvcGljTmFtZTsKKwlwcml2YXRlIENhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyOworCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudFV0aWxzOworCXByaXZhdGUgU3RyaW5nIHVzZXJJZDsKKwlwcml2YXRlIFN0cmluZyBtb2RpZmllck5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdElkOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFB1Ymxpc2hOb3RpZmljYXRpb25SdW5uYWJsZS5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIFB1Ymxpc2hOb3RpZmljYXRpb25SdW5uYWJsZShTdHJpbmcgZW52TmFtZSwgU3RyaW5nIGRpc3RyaWJ1dGlvbklkLCBTZXJ2aWNlIHNlcnZpY2UsIElOb3RpZmljYXRpb25EYXRhIGRhdGEsIERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGVDb25maWd1cmF0aW9uLCBTdHJpbmcgdG9waWNOYW1lLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgbW9kaWZpZXJOYW1lLAorCQkJQ2FtYnJpYUhhbmRsZXIgY2FtYnJpYUhhbmRsZXIsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscywgU3RyaW5nIHJlcXVlc3RJZCkgeworCQlzdXBlcigpOworCQl0aGlzLmVudk5hbWUgPSBlbnZOYW1lOworCQl0aGlzLmRpc3RyaWJ1dGlvbklkID0gZGlzdHJpYnV0aW9uSWQ7CisJCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7CisJCXRoaXMuZGF0YSA9IGRhdGE7CisJCXRoaXMuZGVDb25maWd1cmF0aW9uID0gZGVDb25maWd1cmF0aW9uOworCQl0aGlzLnRvcGljTmFtZSA9IHRvcGljTmFtZTsKKwkJdGhpcy5jYW1icmlhSGFuZGxlciA9IGNhbWJyaWFIYW5kbGVyOworCQl0aGlzLmNvbXBvbmVudFV0aWxzID0gY29tcG9uZW50VXRpbHM7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCQl0aGlzLm1vZGlmaWVyTmFtZSA9IG1vZGlmaWVyTmFtZTsKKwkJdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIElOb3RpZmljYXRpb25EYXRhIGdldERhdGEoKSB7CisJCXJldHVybiBkYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldERhdGEoSU5vdGlmaWNhdGlvbkRhdGEgZGF0YSkgeworCQl0aGlzLmRhdGEgPSBkYXRhOworCX0KKworCXB1YmxpYyBEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGdldERlQ29uZmlndXJhdGlvbigpIHsKKwkJcmV0dXJuIGRlQ29uZmlndXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZUNvbmZpZ3VyYXRpb24oRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBkZUNvbmZpZ3VyYXRpb24pIHsKKwkJdGhpcy5kZUNvbmZpZ3VyYXRpb24gPSBkZUNvbmZpZ3VyYXRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3BpY05hbWUoKSB7CisJCXJldHVybiB0b3BpY05hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9waWNOYW1lKFN0cmluZyB0b3BpY05hbWUpIHsKKwkJdGhpcy50b3BpY05hbWUgPSB0b3BpY05hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VySWQoKSB7CisJCXJldHVybiB1c2VySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyB1c2VySWQpIHsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2RpZmllck5hbWUoKSB7CisJCXJldHVybiBtb2RpZmllck5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJOYW1lKFN0cmluZyBtb2RpZmllck5hbWUpIHsKKwkJdGhpcy5tb2RpZmllck5hbWUgPSBtb2RpZmllck5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcnVuKCkgeworCisJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCVRocmVhZExvY2Fsc0hvbGRlci5zZXRVdWlkKHRoaXMucmVxdWVzdElkKTsKKworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBzdGF0dXMgPSBjYW1icmlhSGFuZGxlci5zZW5kTm90aWZpY2F0aW9uQW5kQ2xvc2UodG9waWNOYW1lLCBkZUNvbmZpZ3VyYXRpb24uZ2V0VWViUHVibGljS2V5KCksIGRlQ29uZmlndXJhdGlvbi5nZXRVZWJTZWNyZXRLZXkoKSwgZGVDb25maWd1cmF0aW9uLmdldFVlYlNlcnZlcnMoKSwgZGF0YSwKKwkJCQlkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uVG9waWMoKS5nZXRNYXhXYWl0aW5nQWZ0ZXJTZW5kaW5nU2Vjb25kcygpLmxvbmdWYWx1ZSgpKTsKKworCQlsb2dnZXIuaW5mbygiQWZ0ZXIgcHVibGlzaGluZyBzZXJ2aWNlIHt9IG9mIHZlcnNpb24ge30uIFN0YXR1cyBpcyB7fSIsIHNlcnZpY2UuZ2V0TmFtZSgpLCBzZXJ2aWNlLmdldFZlcnNpb24oKSwgc3RhdHVzLmdldEh0dHBDb2RlKCkpOworCQlhdWRpdERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbih0b3BpY05hbWUsIHN0YXR1cywgc2VydmljZSwgZGlzdHJpYnV0aW9uSWQsIGVudk5hbWUsIHVzZXJJZCwgbW9kaWZpZXJOYW1lKTsKKworCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJbG9nZ2VyLmRlYnVnKCJBZnRlciBidWlsZGluZyBhbmQgcHVibGlzaGluZyBhcnRpZmFjdHMgb2JqZWN0LiBUb3RhbCB0b29rIHt9IG1pbGxpc2Vjb25kcy4iLCAoZW5kVGltZSAtIHN0YXJ0VGltZSkpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGF1ZGl0RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uKFN0cmluZyB0b3BpY05hbWUsIENhbWJyaWFFcnJvclJlc3BvbnNlIHN0YXR1cywgU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgZGlzdHJpYnV0aW9uSWQsIFN0cmluZyBlbnZOYW1lLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgbW9kaWZpZXJOYW1lKSB7CisJCWlmICh0aGlzLmNvbXBvbmVudFV0aWxzICE9IG51bGwpIHsKKwkJCUludGVnZXIgaHR0cENvZGUgPSBzdGF0dXMuZ2V0SHR0cENvZGUoKTsKKwkJCVN0cmluZyBodHRwQ29kZVN0ciA9IFN0cmluZy52YWx1ZU9mKGh0dHBDb2RlKTsKKworCQkJU3RyaW5nIGRlc2MgPSBnZXREZXNjcmlwdGlvbkZyb21FcnJvclJlc3BvbnNlKHN0YXR1cyk7CisKKwkJCXRoaXMuY29tcG9uZW50VXRpbHMuYXVkaXREaXN0cmlidXRpb25Ob3RpZmljYXRpb24oQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9OT1RJRlksIHNlcnZpY2UuZ2V0VVVJRCgpLCBzZXJ2aWNlLmdldE5hbWUoKSwgIlNlcnZpY2UiLCBzZXJ2aWNlLmdldFZlcnNpb24oKSwgdXNlcklkLCBtb2RpZmllck5hbWUsIGVudk5hbWUsIHNlcnZpY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKS5uYW1lKCksIHRvcGljTmFtZSwKKwkJCQkJZGlzdHJpYnV0aW9uSWQsIGRlc2MsIGh0dHBDb2RlU3RyKTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGdldERlc2NyaXB0aW9uRnJvbUVycm9yUmVzcG9uc2UoQ2FtYnJpYUVycm9yUmVzcG9uc2Ugc3RhdHVzKSB7CisKKwkJQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBzdGF0dXMuZ2V0T3BlcmF0aW9uU3RhdHVzKCk7CisKKwkJc3dpdGNoIChvcGVyYXRpb25TdGF0dXMpIHsKKwkJY2FzZSBPSzoKKwkJCXJldHVybiAiT0siOworCQljYXNlIEFVVEhFTlRJQ0FUSU9OX0VSUk9SOgorCQkJcmV0dXJuICJFcnJvcjogQXV0aGVudGljYXRpb24gcHJvYmxlbSB0b3dhcmRzIFUtRUIgc2VydmVyIjsKKwkJY2FzZSBJTlRFUk5BTF9TRVJWRVJfRVJST1I6CisJCQlyZXR1cm4gIkVycm9yOiBJbnRlcm5hbCBVLUVCIHNlcnZlciBlcnJvciI7CisJCWNhc2UgVU5LTk9XTl9IT1NUX0VSUk9SOgorCQkJcmV0dXJuICJFcnJvcjogQ2Fubm90IHJlYWNoIFUtRUIgc2VydmVyIGhvc3QiOworCQljYXNlIENPTk5ORUNUSU9OX0VSUk9SOgorCQkJcmV0dXJuICJFcnJvcjogQ2Fubm90IGNvbm5lY3QgdG8gVS1FQiBzZXJ2ZXIiOworCQljYXNlIE9CSkVDVF9OT1RfRk9VTkQ6CisJCQlyZXR1cm4gIkVycm9yOiBvYmplY3Qgbm90IGZvdW5kIGluIFUtRUIgc2VydmVyIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiRXJyb3I6IEludGVybmFsIENhbWJyaWEgc2VydmVyIHByb2JsZW0iOworCisJCX0KKworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvUmVzb3VyY2VBcnRpZmFjdEluZm9JbXBsLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1Jlc291cmNlQXJ0aWZhY3RJbmZvSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZjNjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1Jlc291cmNlQXJ0aWZhY3RJbmZvSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUFydGlmYWN0SW5mb0ltcGwgZXh0ZW5kcyBBcnRpZmFjdEluZm9JbXBsIGltcGxlbWVudHMgSVJlc291cmNlQXJ0aWZhY3RJbmZvIHsKKworCXByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKKwlwcml2YXRlIFN0cmluZyByZXNvdXJjZVZlcnNpb247CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VVVUlEOworCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisJCXJldHVybiByZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VOYW1lKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKwkJdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVZlcnNpb24oKSB7CisJCXJldHVybiByZXNvdXJjZVZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VWZXJzaW9uKFN0cmluZyByZXNvdXJjZVZlcnNpb24pIHsKKwkJdGhpcy5yZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZVZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVVSUQoKSB7CisJCXJldHVybiByZXNvdXJjZVVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVVUlEKFN0cmluZyByZXNvdXJjZVVVSUQpIHsKKwkJdGhpcy5yZXNvdXJjZVVVSUQgPSByZXNvdXJjZVVVSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNvdXJjZUFydGlmYWN0SW5mb0ltcGwgW3Jlc291cmNlTmFtZT0iICsgcmVzb3VyY2VOYW1lICsgIiwgcmVzb3VyY2VWZXJzaW9uPSIgKyByZXNvdXJjZVZlcnNpb24gKyAiLCByZXNvdXJjZVVVSUQ9IiArIHJlc291cmNlVVVJRCArIHN1cGVyLnRvU3RyaW5nKCkgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1NlcnZpY2VBcnRpZmFjdEluZm9JbXBsLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1NlcnZpY2VBcnRpZmFjdEluZm9JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkMTcwMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvU2VydmljZUFydGlmYWN0SW5mb0ltcGwuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitwdWJsaWMgY2xhc3MgU2VydmljZUFydGlmYWN0SW5mb0ltcGwgZXh0ZW5kcyBBcnRpZmFjdEluZm9JbXBsIGltcGxlbWVudHMgSVNlcnZpY2VBcnRpZmFjdEluZm8geworCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJTZXJ2aWNlQXJ0aWZhY3RJbmZvSW1wbCBbIiArIHN1cGVyLnRvU3RyaW5nKCkgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1NlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1NlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNDhlZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvU2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBcnRpZmFjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5JbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5TZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJzZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlciIpCitwdWJsaWMgY2xhc3MgU2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXIgeworCisJcHJpdmF0ZSBpbnQgZGVmYXVsdEFydGlmYWN0SW5zdGFsbFRpbWVvdXQgPSA2MDsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlci5jbGFzcy5nZXROYW1lKCkpOworCisJZmluYWwgc3RhdGljIFN0cmluZyBCQVNFX0FSVElGQUNUX1VSTCA9ICIvYXNkYy92MS9jYXRhbG9nL3NlcnZpY2VzLyVzLyVzLyI7CisJZmluYWwgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9BUlRJRkFDVF9VUkwgPSBCQVNFX0FSVElGQUNUX1VSTCArICJyZXNvdXJjZXMvJXMvJXMvYXJ0aWZhY3RzLyVzIjsKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfQVJUSUZBQ1RfVVJMID0gQkFTRV9BUlRJRkFDVF9VUkwgKyAiYXJ0aWZhY3RzLyVzIjsKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfSU5TVEFOQ0VfQVJUSUZBQ1RfVVJMID0gQkFTRV9BUlRJRkFDVF9VUkwgKyAicmVzb3VyY2VJbnN0YW5jZXMvJXMvYXJ0aWZhY3RzLyVzIjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJSUFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uOworCisJLyoKKwkgKiBAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZSBwcml2YXRlIEluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljOworCSAqLworCisJQFBvc3RDb25zdHJ1Y3QKKwlwcml2YXRlIHZvaWQgaW5pdCgpIHsKKwkJZGVmYXVsdEFydGlmYWN0SW5zdGFsbFRpbWVvdXQgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXREZWZhdWx0SGVhdEFydGlmYWN0VGltZW91dE1pbnV0ZXMoKTsKKwl9CisKKwlwdWJsaWMgU2VydmljZU9wZXJhdGlvbiBnZXRTZXJ2aWNlT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gc2VydmljZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlT3BlcmF0aW9uKFNlcnZpY2VPcGVyYXRpb24gc2VydmljZU9wZXJhdGlvbikgeworCQl0aGlzLnNlcnZpY2VPcGVyYXRpb24gPSBzZXJ2aWNlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBSZXNvdXJjZU9wZXJhdGlvbiBnZXRSZXNvdXJjZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHJlc291cmNlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlT3BlcmF0aW9uKFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uKSB7CisJCXRoaXMucmVzb3VyY2VPcGVyYXRpb24gPSByZXNvdXJjZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGdldEludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24oSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbikgeworCQl0aGlzLmludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbiA9IGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgSU5vdGlmaWNhdGlvbkRhdGEgYnVpbGRSZXNvdXJjZUluc3RhbmNlRm9yRGlzdHJpYnV0aW9uKFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIGRpc3RyaWJ1dGlvbklkKSB7CisJCUlOb3RpZmljYXRpb25EYXRhIG5vdGlmaWNhdGlvbkRhdGEgPSBuZXcgTm90aWZpY2F0aW9uRGF0YUltcGwoKTsKKworCQlub3RpZmljYXRpb25EYXRhLnNldFJlc291cmNlcyhjb252ZXJ0UklUb0pzb25Db250YW5pZXIoc2VydmljZSkpOworCQlub3RpZmljYXRpb25EYXRhLnNldFNlcnZpY2VOYW1lKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJbm90aWZpY2F0aW9uRGF0YS5zZXRTZXJ2aWNlVmVyc2lvbihzZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCW5vdGlmaWNhdGlvbkRhdGEuc2V0RGlzdHJpYnV0aW9uSUQoZGlzdHJpYnV0aW9uSWQpOworCQlub3RpZmljYXRpb25EYXRhLnNldFNlcnZpY2VVVUlEKHNlcnZpY2UuZ2V0VVVJRCgpKTsKKwkJbm90aWZpY2F0aW9uRGF0YS5zZXRTZXJ2aWNlRGVzY3JpcHRpb24oc2VydmljZS5nZXREZXNjcmlwdGlvbigpKTsKKwkJbm90aWZpY2F0aW9uRGF0YS5zZXRTZXJ2aWNlSW52YXJpYW50VVVJRChzZXJ2aWNlLmdldEludmFyaWFudFVVSUQoKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJCZWZvcmUgcmV0dXJuaW5nIG5vdGlmaWNhdGlvbiBkYXRhIG9iamVjdCB7fSIsIG5vdGlmaWNhdGlvbkRhdGEpOworCisJCXJldHVybiBub3RpZmljYXRpb25EYXRhOworCisJfQorCisJcHVibGljIElOb3RpZmljYXRpb25EYXRhIGJ1aWxkU2VydmljZUZvckRpc3RyaWJ1dGlvbihJTm90aWZpY2F0aW9uRGF0YSBub3RpZmljYXRpb25EYXRhLCBTZXJ2aWNlIHNlcnZpY2UpIHsKKworCQlub3RpZmljYXRpb25EYXRhLnNldFNlcnZpY2VBcnRpZmFjdHMoY29udmVydFNlcnZpY2VBcnRpZmFjdHNUb0FydGlmYWN0SW5mbyhzZXJ2aWNlKSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJCZWZvcmUgcmV0dXJuaW5nIG5vdGlmaWNhdGlvbiBkYXRhIG9iamVjdCB7fSIsIG5vdGlmaWNhdGlvbkRhdGEpOworCisJCXJldHVybiBub3RpZmljYXRpb25EYXRhOworCisJfQorCisJcHJpdmF0ZSBMaXN0PEFydGlmYWN0SW5mb0ltcGw+IGNvbnZlcnRTZXJ2aWNlQXJ0aWZhY3RzVG9BcnRpZmFjdEluZm8oU2VydmljZSBzZXJ2aWNlKSB7CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBzZXJ2aWNlQXJ0aWZhY3RzTWFwID0gc2VydmljZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiByZXQgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKworCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZiA6IHNlcnZpY2VBcnRpZmFjdHNNYXAudmFsdWVzKCkpIHsKKwkJCWlmIChhcnRpZmFjdERlZi5jaGVja0VzSWRFeGlzdCgpKSB7CisJCQkJcmV0LmFkZChhcnRpZmFjdERlZik7CisJCQl9CisJCX0KKwkJTGlzdDxBcnRpZmFjdEluZm9JbXBsPiBhcnRpZmFjdHMgPSBBcnRpZmFjdEluZm9JbXBsLmNvbnZlcnRTZXJ2aWNlQXJ0aWZhY3RUb0FydGlmYWN0SW5mb0ltcGwoc2VydmljZSwgcmV0KTsKKwkJcmV0dXJuIGFydGlmYWN0czsKKwl9CisKKwlwcml2YXRlIExpc3Q8SnNvbkNvbnRhaW5lclJlc291cmNlSW5zdGFuY2U+IGNvbnZlcnRSSVRvSnNvbkNvbnRhbmllcihTZXJ2aWNlIHNlcnZpY2UpIHsKKwkJTGlzdDxKc29uQ29udGFpbmVyUmVzb3VyY2VJbnN0YW5jZT4gcmV0ID0gbmV3IEFycmF5TGlzdDxKc29uQ29udGFpbmVyUmVzb3VyY2VJbnN0YW5jZT4oKTsKKwkJaWYgKHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkgIT0gbnVsbCkgeworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlIDogc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSkgeworCQkJCVN0cmluZyByZXNvdWNyZVR5cGUgPSAiVkYiOworCQkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHNEZWZMaXN0ID0gZ2V0QXJ0aWZhY3RzV2l0aFBheWxvYWQocmVzb3VyY2VJbnN0YW5jZSk7CisJCQkJTGlzdDxBcnRpZmFjdEluZm9JbXBsPiBhcnRpZmFjdHMgPSBBcnRpZmFjdEluZm9JbXBsLmNvbnZlcnRUb0FydGlmYWN0SW5mb0ltcGwoc2VydmljZSwgcmVzb3VyY2VJbnN0YW5jZSwgYXJ0aWZhY3RzRGVmTGlzdCk7CisJCQkJRWl0aGVyPFN0cmluZywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzcG9uc2VSZXN1bHQgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRJbnZhcmlhbnRVVUlEKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzb3VyY2VJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKSwgZmFsc2UpOworCQkJCVN0cmluZyByZXNvdXJjZUludmFyaWFudFVVSUQgPSBudWxsOworCQkJCWlmIChyZXNwb25zZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nZ2VyLmRlYnVnKCJSZXNvdXJjZSB7fSBJbnZhcmlhbnQgVVVJRCByZXRyaWV2aW5nIGZhaWxlZCIsIHJlc291cmNlSW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc291cmNlSW52YXJpYW50VVVJRCA9IHJlc3BvbnNlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCX0KKwkJCQlKc29uQ29udGFpbmVyUmVzb3VyY2VJbnN0YW5jZSBqc29uQ29udGFpbmVyID0gbmV3IEpzb25Db250YWluZXJSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2UsIHJlc291cmNlSW52YXJpYW50VVVJRCwgcmVzb3VjcmVUeXBlLCBhcnRpZmFjdHMpOworCQkJCXJldC5hZGQoanNvbkNvbnRhaW5lcik7CisJCQl9CisKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCXByaXZhdGUgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGdldEFydGlmYWN0c1dpdGhQYXlsb2FkKENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IHJldCA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCisJCS8vIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBpbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzID0KKwkJLy8gaW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0c0J1c2luZXNzTG9naWMuZ2V0SW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzRm9yUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlKTsKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveWFibGVBcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJLy8gZGVwbG95YWJsZUFydGlmYWN0cy5hZGRBbGwoaW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0cyk7CisJCWlmIChyZXNvdXJjZUluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSAhPSBudWxsKSB7CisJCQlkZXBsb3lhYmxlQXJ0aWZhY3RzLmFkZEFsbChyZXNvdXJjZUluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS52YWx1ZXMoKSk7CisJCX0KKworCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZiA6IGRlcGxveWFibGVBcnRpZmFjdHMpIHsKKwkJCWlmIChhcnRpZmFjdERlZi5jaGVja0VzSWRFeGlzdCgpKSB7CisJCQkJcmV0LmFkZChhcnRpZmFjdERlZik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0KKworCS8qKgorCSAqIGJ1aWxkIHRoZSB1cmwgZm9yIHJlc291cmNlIGludGFuY2UgYXJ0aWZhY3QKKwkgKiAKKwkgKiBAcGFyYW0gc2VydmljZQorCSAqIEBwYXJhbSByZXNvdXJjZURhdGEKKwkgKiBAcGFyYW0gYXJ0aWZhY3ROYW1lCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0VXJsKFNlcnZpY2Ugc2VydmljZSwgQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KFJFU09VUkNFX0lOU1RBTkNFX0FSVElGQUNUX1VSTCwgc2VydmljZS5nZXRTeXN0ZW1OYW1lKCksIHNlcnZpY2UuZ2V0VmVyc2lvbigpLCByZXNvdXJjZUluc3RhbmNlLmdldE5vcm1hbGl6ZWROYW1lKCksIGFydGlmYWN0TmFtZSk7CisKKwkJbG9nZ2VyLmRlYnVnKCJBZnRlciBidWlsZGluZyBhcnRpZmFjdCB1cmwge30iLCB1cmwpOworCisJCXJldHVybiB1cmw7CisJfQorCisJLyoqCisJICogYnVpbGQgdGhlIHVybCBmb3IgcmVzb3VyY2UgaW50YW5jZSBhcnRpZmFjdAorCSAqIAorCSAqIEBwYXJhbSBzZXJ2aWNlCisJICogQHBhcmFtIHJlc291cmNlRGF0YQorCSAqIEBwYXJhbSBhcnRpZmFjdE5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRTZXJ2aWNlQXJ0aWZhY3RVcmwoU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgYXJ0aWZhY3ROYW1lKSB7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoU0VSVklDRV9BUlRJRkFDVF9VUkwsIHNlcnZpY2UuZ2V0U3lzdGVtTmFtZSgpLCBzZXJ2aWNlLmdldFZlcnNpb24oKSwgYXJ0aWZhY3ROYW1lKTsKKworCQlsb2dnZXIuZGVidWcoIkFmdGVyIGJ1aWxkaW5nIGFydGlmYWN0IHVybCB7fSIsIHVybCk7CisKKwkJcmV0dXJuIHVybDsKKworCX0KKworCS8qKgorCSAqIFJldHJpZXZlIGFsbCBkZXBsb3ltZW50IGFydGlmYWN0cyBvZiBhbGwgcmVzb3VyY2VzIHVuZGVyIGEgZ2l2ZW4gc2VydmljZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUFydGlmYWN0c1Jlc3VsdAorCSAqIEBwYXJhbSBzZXJ2aWNlCisJICogQHBhcmFtIGRlQ29uZmlndXJhdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGlzU2VydmljZUNvbnRhaW5zRGVwbG95bWVudEFydGlmYWN0cyhTZXJ2aWNlIHNlcnZpY2UpIHsKKworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoZmFsc2UpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IHNlcnZpc2VBcnRpZmFjdHNNYXAgPSBzZXJ2aWNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJaWYgKHNlcnZpc2VBcnRpZmFjdHNNYXAgIT0gbnVsbCAmJiAhc2VydmlzZUFydGlmYWN0c01hcC5pc0VtcHR5KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2VzID0gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKworCQlpZiAocmVzb3VyY2VJbnN0YW5jZXMgIT0gbnVsbCkgeworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlIDogcmVzb3VyY2VJbnN0YW5jZXMpIHsKKworCQkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0c01hcHBlciA9IHJlc291cmNlSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQkJCS8vIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBpbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzID0KKwkJCQkvLyBpbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5nZXRJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHNGb3JSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2UpOworCisJCQkJYm9vbGVhbiBpc0RlcGxveWFibGVBcnRpZmFjdEZvdW5kID0gaXNDb250YWluc1BheWxvYWQoZGVwbG95bWVudEFydGlmYWN0c01hcHBlci52YWx1ZXMoKSk7Ly8gfHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzQ29udGFpbnNQYXlsb2FkKGluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdHMpOworCQkJCWlmIChpc0RlcGxveWFibGVBcnRpZmFjdEZvdW5kKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluc1BheWxvYWQoQ29sbGVjdGlvbjxBcnRpZmFjdERlZmluaXRpb24+IGNvbGxlY3Rpb24pIHsKKwkJYm9vbGVhbiBwYXlMb2FkRm91bmQgPSBjb2xsZWN0aW9uICE9IG51bGwgJiYgY29sbGVjdGlvbi5zdHJlYW0oKS5hbnlNYXRjaChwIC0+IHAuY2hlY2tFc0lkRXhpc3QoKSk7CisJCXJldHVybiBwYXlMb2FkRm91bmQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1N1YnNjcmliZXJUeXBlRW51bS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9TdWJzY3JpYmVyVHlwZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGMwZTNmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9TdWJzY3JpYmVyVHlwZUVudW0uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitwdWJsaWMgZW51bSBTdWJzY3JpYmVyVHlwZUVudW0geworCisJQ09OU1VNRVIsIFBST0RVQ0VSOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9UZXN0UXVldWUuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvVGVzdFF1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllM2M0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvVGVzdFF1ZXVlLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKKworcHVibGljIGNsYXNzIFRlc3RRdWV1ZSB7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCVRocmVhZEZhY3RvcnlCdWlsZGVyIHRocmVhZEZhY3RvcnlCdWlsZGVyID0gbmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCk7CisJCXRocmVhZEZhY3RvcnlCdWlsZGVyLnNldE5hbWVGb3JtYXQoImRpc3RyaWJ1dGlvbi1ub3RpZmljYXRpb24tdGhyZWFkIik7CisJCVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IHRocmVhZEZhY3RvcnlCdWlsZGVyLmJ1aWxkKCk7CisJCS8vIFRPRE86IGFkZCB0aGUgcGFja2FnZSBvZiBnb29nbGUgdG8gdGhlIHBvbQorCisJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDAsIDEwLCA2MEwsIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPigpLCB0aHJlYWRGYWN0b3J5KTsKKwkJLy8gRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMCwgMiwgNjBMLAorCQkvLyBUaW1lVW5pdC5TRUNPTkRTLCBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigyMCkpOworCisJCS8vIDIgdGhyZWFkcyBhcmUgYWx3YXlzIHVwIGFuZCB0aGV5IGhhbmRsZSB0aGUgdGFza3MuIGluIGNhc2UgY29yZSBzaXplCisJCS8vIGlzIDAsIG9ubHkgb25lIGlzIGhhbmRsZXMgdGhlIHRhc2tzLgorCQkvLyBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigwLCAyLCA2MEwsCisJCS8vIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KDIwKSk7CisKKwkJLy8gVE9ETyA6IGNoZWNrIHdoYXQgaGFwcGVuIHdoZW4gdGhlIG51bWJlciBvZiB0aHJlYWRzIGFyZSBmdWxsLiBUaHJvdworCQkvLyBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbgorCQkvLyBUT0RPIDogY2hlY2sgd2hhdCBoYXBwZW4gd2hldGhlciB0aGUgcG9vbCBpcyBmdWxsIGFuZCB0aGUgc2l6ZSBvZgorCQkvLyBwb29sCisKKwkJRXhlY3V0b3JTZXJ2aWNlIG5ld0NhY2hlZFRocmVhZFBvb2wgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCh0aHJlYWRGYWN0b3J5KTsKKwkJUnVubmFibGUgdGFzayA9IG5ldyBSdW5uYWJsZSgpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXRyeSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaU4gU0xFRVAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisJCQkJCVRocmVhZC5zbGVlcCgxMCAqIDEwMDApOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9VVCBTTEVFUCIpOworCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlleGVjdXRvclNlcnZpY2Uuc3VibWl0KHRhc2spOworCQkJfSBjYXRjaCAoUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKworCQluZXdDYWNoZWRUaHJlYWRQb29sLnN1Ym1pdCh0YXNrKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJBZnRlciBzdWJtaXR0aW5nIHRoZSB0YXNrIik7CisKKwkJTXlXb3JrZXJbXSB3YXRjaFRocmVhZHMgPSBuZXcgTXlXb3JrZXJbMV07CisJCUJsb2NraW5nUXVldWU8U3RyaW5nPiBxdWV1ZSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8Pig1KTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB3YXRjaFRocmVhZHMubGVuZ3RoOyBpKyspIHsKKwkJCU15V29ya2VyIG15V29ya2VyID0gbmV3IE15V29ya2VyKHF1ZXVlKTsKKwkJCW15V29ya2VyLnN0YXJ0KCk7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlxdWV1ZS5wdXQoIm1lc3NhZ2UgIiArIGkpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15VGltZXJUYXNrIGV4dGVuZHMgVGltZXJUYXNrIHsKKworCQlBdG9taWNCb29sZWFuIHN0YXRlOworCQlUaHJlYWQgdGhyZWFkOworCisJCXB1YmxpYyBNeVRpbWVyVGFzayhBdG9taWNCb29sZWFuIHN0YXRlLCBUaHJlYWQgdGhyZWFkKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5zdGF0ZSA9IHN0YXRlOworCQkJdGhpcy50aHJlYWQgPSB0aHJlYWQ7CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWZ0ZXIgY3JlYXRlIHRpbWVyIik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBydW5uaW5nIG9mIFRpbWVyIHRhc2siKTsKKwkJCWlmIChzdGF0ZS5nZXQoKSA9PSBmYWxzZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gcnVubmluZyBvZiBUaW1lciB0YXNrLiBHb2luZyB0byBpbnRlcnJ1cHQgdGhyZWFkIik7CisJCQkJLy8gdGhyZWFkLmludGVycnVwdCgpOworCQkJfSBlbHNlIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluIHJ1bm5pbmcgb2YgVGltZXIgdGFzay4gRmluaXNoZWQuIik7CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTXlXb3JrZXIgZXh0ZW5kcyBUaHJlYWQgeworCisJCWJvb2xlYW4gYWN0aXZlID0gdHJ1ZTsKKwkJcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFN0cmluZz4gcXVldWU7CisKKwkJcHVibGljIE15V29ya2VyKEJsb2NraW5nUXVldWU8U3RyaW5nPiBxdWV1ZSkgeworCQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOworCQl9CisKKwkJVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKKworCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQl0cnkgeworCQkJCXdoaWxlIChhY3RpdmUpIHsKKwkJCQkJU3RyaW5nIHMgPSBxdWV1ZS50YWtlKCk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBmZWN0aGVkIGEgbWVzc2FnZSAiICsgcyk7CisKKwkJCQkJQXRvbWljQm9vbGVhbiBhdG9taWNCb29sZWFuID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCQkJCQlNeVRpbWVyVGFzayBteVRpbWVyVGFzayA9IG5ldyBNeVRpbWVyVGFzayhhdG9taWNCb29sZWFuLCB0aGlzKTsKKwkJCQkJdGltZXIuc2NoZWR1bGUobXlUaW1lclRhc2ssIDEwICogMTAwMCk7CisJCQkJCWRvV29yayhzKTsKKwkJCQkJYXRvbWljQm9vbGVhbi5zZXQodHJ1ZSk7CisKKwkJCQl9CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcnJ1cHRlZCBvdXIgdGhyZWFkIik7CisJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgZG9Xb3JrKFN0cmluZyBzKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwkJCUNhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyID0gbmV3IENhbWJyaWFIYW5kbGVyKCk7CisJCQlJTm90aWZpY2F0aW9uRGF0YSBkYXRhID0gbmV3IE5vdGlmaWNhdGlvbkRhdGFJbXBsKCk7CisJCQlMaXN0PFN0cmluZz4gc2VydmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJc2VydmVycy5hZGQoImFhYWFhYWEiKTsKKwkJCWNhbWJyaWFIYW5kbGVyLnNlbmROb3RpZmljYXRpb24oInRvcGljTmFtZSIsICJ1ZWJQdWJsaWNLZXkiLCAidWViU2VjcmV0S2V5Iiwgc2VydmVycywgZGF0YSk7CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiSU4gV09SSyAiICsgcyk7CisJCQl0cnkgeworCQkJCVRocmVhZC5zbGVlcCgxICogMTAwMCk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworCQkJCX0KKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1VlYkhlYWx0aENoZWNrQ2FsbC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9VZWJIZWFsdGhDaGVja0NhbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIyY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9VZWJIZWFsdGhDaGVja0NhbGwuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgVWViSGVhbHRoQ2hlY2tDYWxsIGltcGxlbWVudHMgQ2FsbGFibGU8Qm9vbGVhbj4geworCisJQ2FtYnJpYUhhbmRsZXIgY2FtYnJpYUhhbmRsZXIgPSBuZXcgQ2FtYnJpYUhhbmRsZXIoKTsKKworCVN0cmluZyBzZXJ2ZXI7CisJU3RyaW5nIHB1YmxpY0FwaUtleTsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBoZWFsdGhMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoLlVFQl9IRUFMVEhfTE9HX0NPTlRFWFQpOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFVlYkhlYWx0aENoZWNrQ2FsbC5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIFVlYkhlYWx0aENoZWNrQ2FsbChTdHJpbmcgc2VydmVyLCBTdHJpbmcgcHVibGljQXBpS2V5KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuc2VydmVyID0gc2VydmVyOworCQl0aGlzLnB1YmxpY0FwaUtleSA9IHB1YmxpY0FwaUtleTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBjYWxsKCkgeworCisJCWhlYWx0aExvZ2dlci50cmFjZSgiR29pbmcgdG8gcnVuIGhlYWx0aCBjaGVjayB0b3dhcmRzIHVlYiBzZXJ2ZXIge30iLCBzZXJ2ZXIpOworCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIGNhbWJyaWFFcnJvclJlc3BvbnNlID0gY2FtYnJpYUhhbmRsZXIuZ2V0QXBpS2V5KHNlcnZlciwgcHVibGljQXBpS2V5KTsKKworCQlsb2dnZXIuZGVidWcoIkFmdGVyIHJ1bm5pbmcgSGVhbHRoIGNoZWNrIHRvd2FyZHMgdWViIHNlcnZlciB7fS4gUmVzdWx0IGlzIHt9Iiwgc2VydmVyLCBjYW1icmlhRXJyb3JSZXNwb25zZSk7CisKKwkJaWYgKGNhbWJyaWFFcnJvclJlc3BvbnNlLmh0dHBDb2RlIDwgQ2FtYnJpYUVycm9yUmVzcG9uc2UuSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQWZ0ZXIgcnVubmluZyBIZWFsdGggY2hlY2sgdG93YXJkcyB1ZWIgc2VydmVyIHt9LiBFcnJvciBjb2RlIGlzIHt9LiBTZXQgcmVzdWx0IHRvIHRydWUiLCBzZXJ2ZXIsIGNhbWJyaWFFcnJvclJlc3BvbnNlLmh0dHBDb2RlKTsKKwkJCXJlc3VsdCA9IHRydWU7CisJCX0KKworCQloZWFsdGhMb2dnZXIudHJhY2UoIlJlc3VsdCBhZnRlciBydW5uaW5nIGhlYWx0aCBjaGVjayB0b3dhcmRzIHVlYiBzZXJ2ZXIge30gaXMge30uIFJldHVybmVkIHJlc3VsdCBpcyB7fSAiLCBzZXJ2ZXIsIGNhbWJyaWFFcnJvclJlc3BvbnNlLCByZXN1bHQpOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTZXJ2ZXIoKSB7CisJCXJldHVybiBzZXJ2ZXI7CisJfQorCisJcHVibGljIENhbWJyaWFIYW5kbGVyIGdldENhbWJyaWFIYW5kbGVyKCkgeworCQlyZXR1cm4gY2FtYnJpYUhhbmRsZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FtYnJpYUhhbmRsZXIoQ2FtYnJpYUhhbmRsZXIgY2FtYnJpYUhhbmRsZXIpIHsKKwkJdGhpcy5jYW1icmlhSGFuZGxlciA9IGNhbWJyaWFIYW5kbGVyOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9WZk1vZHVsZUFydGlmYWN0UGF5bG9hZC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9WZk1vZHVsZUFydGlmYWN0UGF5bG9hZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2I2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL1ZmTW9kdWxlQXJ0aWZhY3RQYXlsb2FkLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdyb3VwRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgVmZNb2R1bGVBcnRpZmFjdFBheWxvYWQgeworCXB1YmxpYyBWZk1vZHVsZUFydGlmYWN0UGF5bG9hZChHcm91cERlZmluaXRpb24gZ3JvdXApIHsKKwkJdmZNb2R1bGVNb2RlbE5hbWUgPSBncm91cC5nZXROYW1lKCk7CisJCXZmTW9kdWxlTW9kZWxJbnZhcmlhbnRVVUlEID0gZ3JvdXAuZ2V0SW52YXJpYW50VVVJRCgpOworCQl2Zk1vZHVsZU1vZGVsVmVyc2lvbiA9IGdyb3VwLmdldFZlcnNpb24oKTsKKwkJdmZNb2R1bGVNb2RlbFVVSUQgPSBncm91cC5nZXRHcm91cFVVSUQoKTsKKwkJdmZNb2R1bGVNb2RlbERlc2NyaXB0aW9uID0gZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKTsKKworCQlhcnRpZmFjdHMgPSBncm91cC5nZXRBcnRpZmFjdHNVdWlkKCk7CisJCS8vIEJhc2UgVmFsdWUgaXMgc2V0IGZyb20gcHJvcGVydGllcworCQlzZXRCYXNlVmFsdWUoZ3JvdXApOworCisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEJhc2VWYWx1ZShHcm91cERlZmluaXRpb24gZ3JvdXApIHsKKwkJaWYgKGdyb3VwLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7CisJCQlPcHRpb25hbDxHcm91cFByb3BlcnR5PiBmaW5kQmFzZVByb3BlcnR5ID0gZ3JvdXAuZ2V0UHJvcGVydGllcygpLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0TmFtZSgpLmVxdWFscyhDb25zdGFudHMuSVNfQkFTRSkpLmZpbmRBbnkoKTsKKwkJCWlmIChmaW5kQmFzZVByb3BlcnR5LmlzUHJlc2VudCgpKSB7CisJCQkJaXNCYXNlID0gQm9vbGVhbi52YWx1ZU9mKGZpbmRCYXNlUHJvcGVydHkuZ2V0KCkuZ2V0VmFsdWUoKSk7CisJCQl9CisKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIHZmTW9kdWxlTW9kZWxOYW1lLCB2Zk1vZHVsZU1vZGVsSW52YXJpYW50VVVJRCwgdmZNb2R1bGVNb2RlbFZlcnNpb24sIHZmTW9kdWxlTW9kZWxVVUlELCB2Zk1vZHVsZU1vZGVsRGVzY3JpcHRpb247CisJcHJpdmF0ZSBCb29sZWFuIGlzQmFzZTsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBhcnRpZmFjdHM7CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHMoTGlzdDxTdHJpbmc+IGFydGlmYWN0cykgeworCQl0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlQnlHcm91cE5hbWUoVmZNb2R1bGVBcnRpZmFjdFBheWxvYWQgYXJ0MSwgVmZNb2R1bGVBcnRpZmFjdFBheWxvYWQgYXJ0MikgeworCQlJbnRlZ2VyIHRoaXNDb3VudGVyID0gSW50ZWdlci5wYXJzZUludChhcnQxLnZmTW9kdWxlTW9kZWxOYW1lLnNwbGl0KENvbnN0YW50cy5NT0RVTEVfTkFNRV9ERUxJTUlURVIpWzFdKTsKKwkJSW50ZWdlciBvdGhlckNvdW50ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KGFydDIudmZNb2R1bGVNb2RlbE5hbWUuc3BsaXQoQ29uc3RhbnRzLk1PRFVMRV9OQU1FX0RFTElNSVRFUilbMV0pOworCQlyZXR1cm4gdGhpc0NvdW50ZXIuY29tcGFyZVRvKG90aGVyQ291bnRlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9BZGRpdGlvbmFsSW5mb3JtYXRpb25CdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0FkZGl0aW9uYWxJbmZvcm1hdGlvbkJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFkNGMyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9BZGRpdGlvbmFsSW5mb3JtYXRpb25CdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSw1NzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUVsZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUdyYXBoTG9ja09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVNlcnZpY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuRGFvU3RhdHVzQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMudXRpbHMuQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuU3RyaW5nQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuU3RyaW5nVmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgiYWRkaXRpb25hbEluZm9ybWF0aW9uQnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgQWRkaXRpb25hbEluZm9ybWF0aW9uQnVzaW5lc3NMb2dpYyBleHRlbmRzIEJhc2VCdXNpbmVzc0xvZ2ljIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTiA9ICJDcmVhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb24iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9BRERJVElPTkFMX0lORk9STUFUSU9OID0gIlVwZGF0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbiI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT04gPSAiRGVsZXRlQWRkaXRpb25hbEluZm9ybWF0aW9uIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfQURESVRJT05BTF9JTkZPUk1BVElPTiA9ICJHZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24iOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFkZGl0aW9uYWxJbmZvcm1hdGlvbkJ1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uIGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbiA9IG51bGw7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSVJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElTZXJ2aWNlT3BlcmF0aW9uIHNlcnZpY2VPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSUdyYXBoTG9ja09wZXJhdGlvbiBncmFwaExvY2tPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKworCXByb3RlY3RlZCBzdGF0aWMgSUVsZW1lbnRPcGVyYXRpb24gZ2V0RWxlbWVudERhbyhDbGFzczxJRWxlbWVudE9wZXJhdGlvbj4gY2xhc3MxLCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisKKwkJcmV0dXJuIHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKGNsYXNzMSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIG5ldyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHJlc291cmNlL3NlcnZpY2Ugb24gZ3JhcGgKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkgKiBAcGFyYW0gbmV3UHJvcGVydHlEZWZpbml0aW9uCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4gRWl0aGVyPFByb3BlcnR5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPgorCSAqLworCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHJlc291cmNlSWQsIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFN0cmluZyBhZGRpdGlvbmFsSW5mb3JtYXRpb25VaWQsIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiY3JlYXRlIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24iLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2ZXJpZnlDYW5Xb3JrT25Db21wb25lbnQobm9kZVR5cGUsIHJlc291cmNlSWQsIHVzZXJJZCk7CisJCWlmIChyZXNwb25zZUZvcm1hdCAhPSBudWxsKSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8vIGxvY2sgY29tcG9uZW50CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgbG9ja1Jlc3VsdCA9IGdyYXBoTG9ja09wZXJhdGlvbi5sb2NrQ29tcG9uZW50KHJlc291cmNlSWQsIG5vZGVUeXBlKTsKKwkJaWYgKCFsb2NrUmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkTG9ja09iamVjdEVycm9yLCBDUkVBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3IoQ1JFQVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT04sIG5vZGVUeXBlLmdldE5hbWUoKSwgcmVzb3VyY2VJZCk7CisJCQlsb2cuaW5mbygiRmFpbGVkIHRvIGxvY2sgY29tcG9uZW50IHt9IGVycm9yIC0ge30iLCByZXNvdXJjZUlkLCBsb2NrUmVzdWx0KTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJdHJ5IHsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVNYXhTaXplTm90UmVhY2hlZChub2RlVHlwZSwgcmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKTsKKwkJCWlmIChyZXNwb25zZUZvcm1hdCAhPSBudWxsKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvLyB2YWxpZGF0ZSBsYWJlbAorCQkJcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFuZENvbnZlcnRLZXkoYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBDUkVBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTik7CisJCQlpZiAocmVzcG9uc2VGb3JtYXQgIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJLy8gdmFsaWRhdGUgdmFsdWUKKwkJCXJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVBbmRDb252ZXJ0VmFsdWUoYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBDUkVBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTik7CisJCQlpZiAocmVzcG9uc2VGb3JtYXQgIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlc3VsdCA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbi5jcmVhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIobm9kZVR5cGUsIHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5nZXRLZXkoKSwKKwkJCQkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldFZhbHVlKCksIHRydWUpOworCisJCQlpZiAoYWRkUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgQ1JFQVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT04pOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKENSRUFURV9BRERJVElPTkFMX0lORk9STUFUSU9OKTsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yQWRkaXRpb25hbEluZm9ybWF0aW9uKHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShhY3Rpb25TdGF0dXMsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgbm9kZVR5cGUsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uTGFiZWwpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCisJCQl9IGVsc2UgeworCQkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gaW5mb3JtYXRpb25EZWZpbml0aW9uID0gYWRkUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGNyZWF0ZWRBSSA9IGZpbmRBZGRpdGlvbkluZm9ybWF0aW9uS2V5KGluZm9ybWF0aW9uRGVmaW5pdGlvbi5nZXRQYXJhbWV0ZXJzKCksIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5nZXRLZXkoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoY3JlYXRlZEFJKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCX0gZmluYWxseSB7CisJCQljb21taXRPclJvbGxiYWNrKHJlc3VsdCk7CisJCQkvLyB1bmxvY2sgY29tcG9uZW50CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHJlc291cmNlSWQsIG5vZGVUeXBlKTsKKwkJfQorCisJfQorCisJLyoqCisJICogVmFsaWRhdGUgdGhlIHZhbHVlIGZvcm1hdC4gRm9ybWF0IHRoZSB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvCisJICogQHJldHVybiBudWxsIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gT3RoZXJ3aXNlIHJlc3BvbnNlIGZvcm1hdC4KKwkgKi8KKwlwcml2YXRlIFJlc3BvbnNlRm9ybWF0IHZhbGlkYXRlQW5kQ29udmVydFZhbHVlKEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFN0cmluZyBjb250ZXh0KSB7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3VsdCA9IG51bGw7CisKKwkJU3RyaW5nIHZhbHVlID0gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldFZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gdmFsaWRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB2YWx1ZSB7fSIsIHZhbHVlKTsKKworCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gdmFsdWVWYWxpZFJlcyA9IHZhbGlkYXRlVmFsdWUodmFsdWUpOworCQlpZiAodmFsdWVWYWxpZFJlcy5pc1JpZ2h0KCkpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRWYWx1ZUVycm9yLCBjb250ZXh0LCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uZ2V0VmFsdWUoKSwgImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdmFsdWUiLCAic3RyaW5nIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVJbnZhbGlkVmFsdWVFcnJvcihjb250ZXh0LCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uZ2V0VmFsdWUoKSwgImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdmFsdWUiLCAic3RyaW5nIik7CisJCQlyZXN1bHQgPSB2YWx1ZVZhbGlkUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlVmFsaWRSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiBmYWxzZSA9PSB2YWx1ZS5lcXVhbHMobmV3VmFsdWUpKSB7CisJCQkJCWxvZy50cmFjZSgiVGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdmFsdWUgd2FzIG5vcm1hbGl6ZWQgZnJvbSB7fSB0byB7fSIsIHZhbHVlLCBuZXdWYWx1ZSk7CisJCQkJfQorCQkJfQorCQkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLnNldFZhbHVlKG5ld1ZhbHVlKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8KKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBSZXNwb25zZUZvcm1hdCB2YWxpZGF0ZUFuZENvbnZlcnRLZXkoQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgU3RyaW5nIGNvbnRleHQpIHsKKworCQlTdHJpbmcga2V5ID0gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldEtleSgpOworCQlsb2cuZGVidWcoIkdvaW5nIHRvIHZhbGlkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24ga2V5IHt9Iiwga2V5KTsKKworCQlSZXNwb25zZUZvcm1hdCByZXN1bHQgPSBudWxsOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJRWl0aGVyPFN0cmluZywgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlS2V5UmVzID0gdmFsaWRhdGVBbmROb3JtYWxpemVLZXkoa2V5KTsKKwkJaWYgKHZhbGlkYXRlS2V5UmVzLmlzUmlnaHQoKSkgeworCQkJcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUtleVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVJbnZhbGlkVmFsdWVFcnJvciwgY29udGV4dCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldEtleSgpLCAiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsYWJlbCIsICJzdHJpbmciKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRWYWx1ZUVycm9yKGNvbnRleHQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5nZXRLZXkoKSwgImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGFiZWwiLCAic3RyaW5nIik7CisJCQlyZXN1bHQgPSByZXNwb25zZUZvcm1hdDsKKworCQl9IGVsc2UgeworCQkJU3RyaW5nIGNvbnZlcnRlZEtleSA9IHZhbGlkYXRlS2V5UmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCQlpZiAoa2V5ICE9IG51bGwgJiYgZmFsc2UgPT0ga2V5LmVxdWFscyhjb252ZXJ0ZWRLZXkpKSB7CisJCQkJCWxvZy50cmFjZSgiVGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24ga2V5IHt9IHdhcyBub3JtYWxpemVkIHRvIHt9Iiwga2V5LCBjb252ZXJ0ZWRLZXkpOworCQkJCX0KKwkJCX0KKwkJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5zZXRLZXkoY29udmVydGVkS2V5KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHZlcmlmeSB0aGF0IHRoZSBtYXhpbWFsIG51bWJlciBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHByb3BlcnRpZXMgaGFzIG5vdCBiZWVuIHJlYWNoZWQuCisJICogCisJICogQHBhcmFtIG5vZGVUeXBlCisJICogQHBhcmFtIGNvbXBvbmVudElkCisJICogQHBhcmFtIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbworCSAqIEByZXR1cm4gcmVzcG9uc2UgZm9ybWF0IGluIGNhc2UgdGhlIG1heGltYWwgbnVtYmVyIGhhcyBiZWVuIHJlYWNoZWQuCisJICovCisJcHJpdmF0ZSBSZXNwb25zZUZvcm1hdCB2YWxpZGF0ZU1heFNpemVOb3RSZWFjaGVkKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKSB7CisKKwkJUmVzcG9uc2VGb3JtYXQgcmVzdWx0OworCQlJbnRlZ2VyIGFkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5cygpOworCisJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja1JlcyA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbi5nZXROdW1iZXJPZkFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcnMobm9kZVR5cGUsIGNvbXBvbmVudElkLCB0cnVlKTsKKwkJaWYgKGNoZWNrUmVzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjaGVja1Jlcy5yaWdodCgpLnZhbHVlKCk7CisKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JBZGRpdGlvbmFsSW5mb3JtYXRpb24oc3RhdHVzKTsKKwkJCXJlc3VsdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShhY3Rpb25TdGF0dXMsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgbm9kZVR5cGUsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uTm9uZSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCUludGVnZXIgY3VycmVudE51bWJlck9mUHJvcGVydGllcyA9IGNoZWNrUmVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoY3VycmVudE51bWJlck9mUHJvcGVydGllcyA+PSBhZGRpdGlvbmFsSW5mb3JtYXRpb25NYXhOdW1iZXJPZktleXMpIHsKKwkJCWxvZy5pbmZvKCJUaGUgY3VycmVudCBudW1iZXIgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwcm9wZXJ0aWVzIGlzIHt9LiBUaGUgbWF4aW11bSBhbGxvd2VkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvcGVydGllcyBpcyB7fSIsIGN1cnJlbnROdW1iZXJPZlByb3BlcnRpZXMsIGN1cnJlbnROdW1iZXJPZlByb3BlcnRpZXMpOworCQkJcmVzdWx0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QWRkaXRpb25hbFByb3BlcnR5KEFjdGlvblN0YXR1cy5BRERJVElPTkFMX0lORk9STUFUSU9OX01BWF9OVU1CRVJfUkVBQ0hFRCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBub2RlVHlwZSwgQWRkaXRpb25hbEluZm9ybWF0aW9uRW51bS5Ob25lKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiB2YWxpZGF0ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHZhbHVlCisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPFN0cmluZywgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisKKwkJYm9vbGVhbiBpc05vbkVtcHR5U3RyaW5nID0gVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU3RyaW5nTm90RW1wdHkodmFsdWUpOworCQlpZiAoZmFsc2UgPT0gaXNOb25FbXB0eVN0cmluZykgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRBZGRpdGlvbmFsUHJvcGVydHkoQWN0aW9uU3RhdHVzLkFERElUSU9OQUxfSU5GT1JNQVRJT05fRU1QVFlfU1RSSU5HX05PVF9BTExPV0VEKSk7CisJCX0KKworCQlib29sZWFuIHZhbGlkID0gU3RyaW5nVmFsaWRhdG9yLmdldEluc3RhbmNlKCkuaXNWYWxpZCh2YWx1ZSwgbnVsbCk7CisJCWlmIChmYWxzZSA9PSB2YWxpZCkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRBZGRpdGlvbmFsUHJvcGVydHkoQWN0aW9uU3RhdHVzLkFERElUSU9OQUxfSU5GT1JNQVRJT05fVkFMVUVfTk9UX0FMTE9XRURfQ0hBUkFDVEVSUywgbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyhudWxsLCB2YWx1ZSksIG51bGwsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uVmFsdWUpKTsKKwkJfQorCisJCVN0cmluZyBjb252ZXJ0ZWQgPSBTdHJpbmdDb252ZXJ0b3IuZ2V0SW5zdGFuY2UoKS5jb252ZXJ0KHZhbHVlLCBudWxsLCBudWxsKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29udmVydGVkKTsKKwl9CisKKwlwcml2YXRlIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBmaW5kQWRkaXRpb25JbmZvcm1hdGlvbktleShMaXN0PEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbz4gcGFyYW1ldGVycywgU3RyaW5nIGtleSkgeworCisJCWZvciAoQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGluZm9QYXJhbWV0ZXJJbmZvIDogcGFyYW1ldGVycykgeworCQkJaWYgKGluZm9QYXJhbWV0ZXJJbmZvLmdldEtleSgpLmVxdWFscyhrZXkpKSB7CisJCQkJcmV0dXJuIGluZm9QYXJhbWV0ZXJJbmZvOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIHZhbGlkYXRlIGFuZCBub3JtYWxpemUgdGhlIGtleQorCSAqIAorCSAqIEBwYXJhbSBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8KKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmROb3JtYWxpemVLZXkoU3RyaW5nIGtleSkgeworCisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKCk7CisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5zZXRLZXkoa2V5KTsKKworCQlrZXkgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQWRkaXRpb25hbEluZm9ybWF0aW9uKGtleSk7CisJCWJvb2xlYW4gaXNOb25FbXB0eVN0cmluZyA9IFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGtleSk7CisJCWlmIChmYWxzZSA9PSBpc05vbkVtcHR5U3RyaW5nKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShBY3Rpb25TdGF0dXMuQURESVRJT05BTF9JTkZPUk1BVElPTl9FTVBUWV9TVFJJTkdfTk9UX0FMTE9XRUQsIG51bGwsIG51bGwsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uTGFiZWwpKTsKKwkJfQorCQlib29sZWFuIGlzVmFsaWRTdHJpbmcgPSBWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25LZXlOYW1lKGtleSk7CisJCWlmIChmYWxzZSA9PSBpc1ZhbGlkU3RyaW5nKSB7CisJCQlpZiAoZmFsc2UgPT0gVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlTGVuZ3RoKGtleSwgVmFsaWRhdGlvblV0aWxzLkFERElUSU9OQUxfSU5GT1JNQVRJT05fS0VZX01BWF9MRU5HVEgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRBZGRpdGlvbmFsUHJvcGVydHkoQWN0aW9uU3RhdHVzLkFERElUSU9OQUxfSU5GT1JNQVRJT05fRVhDRUVEU19MSU1JVCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBudWxsLCBBZGRpdGlvbmFsSW5mb3JtYXRpb25FbnVtLkxhYmVsKSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShBY3Rpb25TdGF0dXMuQURESVRJT05BTF9JTkZPUk1BVElPTl9LRVlfTk9UX0FMTE9XRURfQ0hBUkFDVEVSUywgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBudWxsLCBBZGRpdGlvbmFsSW5mb3JtYXRpb25FbnVtLkxhYmVsKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoa2V5KTsKKwl9CisKKwkvKioKKwkgKiB1cGRhdGUga2V5IGFuZCB2YWx1ZSBvZiBhIGdpdmVuIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisJICogCisJICogQHBhcmFtIG5vZGVUeXBlCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcGFyYW0gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvCisJICogQHBhcmFtIGFkZGl0aW9uYWxJbmZvcm1hdGlvblVpZAorCSAqICAgICAgICAgICAgLSBGdXR1cmUgdXNlCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBTdHJpbmcgYWRkaXRpb25hbEluZm9ybWF0aW9uVWlkLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImNyZWF0ZSBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmVyaWZ5Q2FuV29ya09uQ29tcG9uZW50KG5vZGVUeXBlLCByZXNvdXJjZUlkLCB1c2VySWQpOworCQlpZiAocmVzcG9uc2VGb3JtYXQgIT0gbnVsbCkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJLy8gbG9jayBjb21wb25lbnQKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrUmVzdWx0ID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQocmVzb3VyY2VJZCwgbm9kZVR5cGUpOworCQlpZiAoIWxvY2tSZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3IsIFVQREFURV9BRERJVElPTkFMX0lORk9STUFUSU9OKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZExvY2tPYmplY3RFcnJvcihVUERBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTiwgbm9kZVR5cGUuZ2V0TmFtZSgpLCByZXNvdXJjZUlkKTsKKwkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gbG9jayBjb21wb25lbnQge30gZXJyb3IgLSB7fSIsIHJlc291cmNlSWQsIGxvY2tSZXN1bHQpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQl0cnkgeworCisJCQkvLyB2YWxpZGF0ZSBpbnB1dAorCQkJcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFuZENvbnZlcnRLZXkoYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBVUERBVEVfQURESVRJT05BTF9JTkZPUk1BVElPTik7CisJCQlpZiAocmVzcG9uc2VGb3JtYXQgIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFuZENvbnZlcnRWYWx1ZShhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFVQREFURV9BRERJVElPTkFMX0lORk9STUFUSU9OKTsKKwkJCWlmIChyZXNwb25zZUZvcm1hdCAhPSBudWxsKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUmVzdWx0ID0gYWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLnVwZGF0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcihub2RlVHlwZSwgcmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldFVuaXF1ZUlkKCksCisJCQkJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5nZXRLZXkoKSwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldFZhbHVlKCksIHRydWUpOworCisJCQlpZiAoYWRkUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgVVBEQVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT04pOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKFVQREFURV9BRERJVElPTkFMX0lORk9STUFUSU9OKTsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yQWRkaXRpb25hbEluZm9ybWF0aW9uKHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShhY3Rpb25TdGF0dXMsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgbm9kZVR5cGUsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uTm9uZSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gaW5mb3JtYXRpb25EZWZpbml0aW9uID0gYWRkUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBwYXJhbWV0ZXJJbmZvID0gZmluZEFkZGl0aW9uSW5mb3JtYXRpb25LZXkoaW5mb3JtYXRpb25EZWZpbml0aW9uLmdldFBhcmFtZXRlcnMoKSwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldEtleSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChwYXJhbWV0ZXJJbmZvKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCX0gZmluYWxseSB7CisJCQljb21taXRPclJvbGxiYWNrKHJlc3VsdCk7CisJCQkvLyB1bmxvY2sgY29tcG9uZW50CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHJlc291cmNlSWQsIG5vZGVUeXBlKTsKKwkJfQorCisJfQorCisJLyoqCisJICogRGVsZXRlIGFuIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGFiZWwKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8KKwkgKiBAcGFyYW0gYWRkaXRpb25hbEluZm9ybWF0aW9uVWlkCisJICogICAgICAgICAgICAtIE51bGwuIEZ1dHVyZSB1c2UuCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBTdHJpbmcgYWRkaXRpb25hbEluZm9ybWF0aW9uVWlkLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImRlbGV0ZSBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmVyaWZ5Q2FuV29ya09uQ29tcG9uZW50KG5vZGVUeXBlLCByZXNvdXJjZUlkLCB1c2VySWQpOworCQlpZiAocmVzcG9uc2VGb3JtYXQgIT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJLy8gbG9jayBjb21wb25lbnQKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrUmVzdWx0ID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQocmVzb3VyY2VJZCwgbm9kZVR5cGUpOworCQlpZiAoIWxvY2tSZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3IsIERFTEVURV9BRERJVElPTkFMX0lORk9STUFUSU9OKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZExvY2tPYmplY3RFcnJvcihERUxFVEVfQURESVRJT05BTF9JTkZPUk1BVElPTiwgbm9kZVR5cGUuZ2V0TmFtZSgpLCByZXNvdXJjZUlkKTsKKwkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gbG9jayBjb21wb25lbnQge30gZXJyb3IgLSB7fSIsIHJlc291cmNlSWQsIGxvY2tSZXN1bHQpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXRyeSB7CisKKwkJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGZpbmRJZFJlcyA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIobm9kZVR5cGUsIHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJCWlmIChmaW5kSWRSZXMuaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kSWRSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsIEdFVF9BRERJVElPTkFMX0lORk9STUFUSU9OKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoR0VUX0FERElUSU9OQUxfSU5GT1JNQVRJT04pOworCQkJCX0KKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yQWRkaXRpb25hbEluZm9ybWF0aW9uKHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShhY3Rpb25TdGF0dXMsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgbm9kZVR5cGUsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uTm9uZSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBmb3VuZEFkZGl0aW9uYWxJbmZvID0gZmluZElkUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUmVzdWx0ID0gYWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLmRlbGV0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcihub2RlVHlwZSwgcmVzb3VyY2VJZCwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlpZiAoYWRkUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgREVMRVRFX0FERElUSU9OQUxfSU5GT1JNQVRJT04pOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKERFTEVURV9BRERJVElPTkFMX0lORk9STUFUSU9OKTsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yQWRkaXRpb25hbEluZm9ybWF0aW9uKHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShhY3Rpb25TdGF0dXMsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgbm9kZVR5cGUsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uTm9uZSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGZvdW5kQWRkaXRpb25hbEluZm8pOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJfSBmaW5hbGx5IHsKKwkJCWNvbW1pdE9yUm9sbGJhY2socmVzdWx0KTsKKwkJCS8vIHVubG9jayBjb21wb25lbnQKKwkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQocmVzb3VyY2VJZCwgbm9kZVR5cGUpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8KKwkgKiBAcGFyYW0gYWRkaXRpb25hbEluZm9ybWF0aW9uVWlkCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgUmVzcG9uc2VGb3JtYXQ+IGdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbihOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBTdHJpbmcgYWRkaXRpb25hbEluZm9ybWF0aW9uVWlkLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGZpbmRJZFJlcyA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbi5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIobm9kZVR5cGUsIHJlc291cmNlSWQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKworCQkJaWYgKGZpbmRJZFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRJZFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckFkZGl0aW9uYWxJbmZvcm1hdGlvbihzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRBZGRpdGlvbmFsUHJvcGVydHkoYWN0aW9uU3RhdHVzLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIG5vZGVUeXBlLCBBZGRpdGlvbmFsSW5mb3JtYXRpb25FbnVtLk5vbmUpKTsKKwkJCX0KKworCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGZvdW5kQWRkaXRpb25hbEluZm8gPSBmaW5kSWRSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGZvdW5kQWRkaXRpb25hbEluZm8pOworCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQljb21taXRPclJvbGxiYWNrKHJlc3VsdCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIEdldCBhbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwcm9wZXJ0aWVzIG9mIGEgZ2l2ZW4gcmVzb3VyY2Uvc2VydmljZQorCSAqIAorCSAqIEBwYXJhbSBub2RlVHlwZQorCSAqIEBwYXJhbSByZXNvdXJjZUlkCisJICogQHBhcmFtIGFkZGl0aW9uYWxJbmZvcm1hdGlvblVpZAorCSAqICAgICAgICAgICAgLSBGdXR1cmUgdXNlCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBnZXRBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb24oTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGFkZGl0aW9uYWxJbmZvcm1hdGlvblVpZCwgU3RyaW5nIHVzZXJJZCkgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJnZXQgQWxsIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24iLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kSWRSZXMgPSBhZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24uZ2V0QWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycyhub2RlVHlwZSwgcmVzb3VyY2VJZCwgZmFsc2UpOworCQkJaWYgKGZpbmRJZFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZmluZElkUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckFkZGl0aW9uYWxJbmZvcm1hdGlvbihzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRBZGRpdGlvbmFsUHJvcGVydHkoYWN0aW9uU3RhdHVzKSk7CisJCQl9IGVsc2UgeworCQkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gaW5mb3JtYXRpb25EZWZpbml0aW9uID0gZmluZElkUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGluZm9ybWF0aW9uRGVmaW5pdGlvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWNvbW1pdE9yUm9sbGJhY2socmVzdWx0KTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBSZXNwb25zZUZvcm1hdCB2ZXJpZnlDYW5Xb3JrT25Db21wb25lbnQoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHVzZXJJZCkgeworCisJCXN3aXRjaCAobm9kZVR5cGUpIHsKKwkJY2FzZSBSZXNvdXJjZToKKworCQkJLy8gdmVyaWZ5IHRoYXQgcmVzb3VyY2UgaXMgY2hlY2tlZC1vdXQgYW5kIHRoZSB1c2VyIGlzIHRoZSBsYXN0CisJCQkvLyB1cGRhdGVyCisJCQlpZiAoIUNvbXBvbmVudFZhbGlkYXRpb25VdGlscy5jYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZUlkLCByZXNvdXJjZU9wZXJhdGlvbiwgdXNlcklkKSkgeworCQkJCXJldHVybiBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNlcnZpY2U6CisKKwkJCS8vIHZlcmlmeSB0aGF0IHJlc291cmNlIGlzIGNoZWNrZWQtb3V0IGFuZCB0aGUgdXNlciBpcyB0aGUgbGFzdAorCQkJLy8gdXBkYXRlcgorCQkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uU2VydmljZShyZXNvdXJjZUlkLCBzZXJ2aWNlT3BlcmF0aW9uLCB1c2VySWQpKSB7CisJCQkJcmV0dXJuIGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQsIG5vZGVUeXBlLmdldE5hbWUoKSk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9BcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZDRhMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsNDEyNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5SZXN1bHRTdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5Ub3NjYVRhZ05hbWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZS5MaWZlY3ljbGVCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uLkxpZmVjeWNsZUNoYW5jZUFjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLnZhbGlkYXRpb24uRGVwbG95bWVudEFydGlmYWN0SGVhdENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5BcnRpZmFjdENhc3NhbmRyYURhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLkNhc3NhbmRyYU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkFydGlmYWN0RGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSGVhdFBhcmFtZXRlckRlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW50ZXJmYWNlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlQ3ljbGVUcmFuc2l0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5oZWF0LkhlYXRQYXJhbWV0ZXJUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBcnRpZmFjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUVsZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklVc2VyQWRtaW5PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5EYW9TdGF0dXNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLnV0aWxzLkNvbXBvbmVudFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BcnRpZmFjdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzLlJlcHJlc2VudGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EuQ3NhclV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLlRvc2NhRXJyb3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EuVG9zY2FFeHBvcnRIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLlRvc2NhUmVwcmVzZW50YXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5JVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5XcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdlbmVyYWxVdGlsaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5ZYW1sVG9PYmplY3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CitpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5wYXJzZXJzLlNBWFBhcnNlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgiYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQmFzZUJ1c2luZXNzTG9naWMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9UWVBFX09USEVSID0gIk9USEVSIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSAiYXJ0aWZhY3QgZGVzY3JpcHRpb24iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9MQUJFTCA9ICJhcnRpZmFjdCBsYWJlbCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1VSTCA9ICJhcnRpZmFjdCB1cmwiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9OQU1FID0gImFydGlmYWN0IG5hbWUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9QQVlMT0FEID0gImFydGlmYWN0IHBheWxvYWQiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1BMQUNFSE9MREVSX1RZUEUgPSAidHlwZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1BMQUNFSE9MREVSX0RJU1BMQVlfTkFNRSA9ICJkaXNwbGF5TmFtZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEFSVElGQUNUX1BMQUNFSE9MREVSX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKworCXByaXZhdGUgc3RhdGljIEludGVnZXIgZGVmYXVsdEhlYXRUaW1lb3V0OworCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgTk9OX0hFQVRfVElNRU9VVCA9IDA7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIEdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSUFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uOworCisJLy8gQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwkvLyBwcml2YXRlIElSZXNvdXJjZVVwbG9hZGVyIGRhb1VwbG9hZGVyOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uOworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJVXNlckFkbWluT3BlcmF0aW9uIHVzZXJPcGVyYXRvbjsKKworCS8vIEBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJLy8gcHJpdmF0ZSBFU0NhdGFsb2dEQU8gZXNDYXRhbG9nRGFvOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIHJlc291cmNlQnVzaW5lc3NMb2dpYzsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBTZXJ2aWNlQnVzaW5lc3NMb2dpYyBzZXJ2aWNlQnVzaW5lc3NMb2dpYzsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW5NYW5hZ2VyOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElIZWF0UGFyYW1ldGVyc09wZXJhdGlvbiBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEFydGlmYWN0Q2Fzc2FuZHJhRGFvIGFydGlmYWN0Q2Fzc2FuZHJhRGFvOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgVG9zY2FFeHBvcnRIYW5kbGVyIHRvc2NhRXhwb3J0VXRpbHM7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBDc2FyVXRpbHMgY3NhclV0aWxzOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgTGlmZWN5Y2xlQnVzaW5lc3NMb2dpYyBsaWZlY3ljbGVCdXNpbmVzc0xvZ2ljOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgSVVzZXJCdXNpbmVzc0xvZ2ljIHVzZXJCdXNpbmVzc0xvZ2ljOworCisJcHVibGljIEFydGlmYWN0c0J1c2luZXNzTG9naWMoKSB7CisJCWRlZmF1bHRIZWF0VGltZW91dCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldERlZmF1bHRIZWF0QXJ0aWZhY3RUaW1lb3V0TWludXRlcygpOworCQlpZiAoKGRlZmF1bHRIZWF0VGltZW91dCA9PSBudWxsKSB8fCAoZGVmYXVsdEhlYXRUaW1lb3V0IDwgMSkpIHsKKwkJCWRlZmF1bHRIZWF0VGltZW91dCA9IDYwOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBlbnVtIEFydGlmYWN0T3BlcmF0aW9uIHsKKworCQlDcmVhdGUoZmFsc2UpLCBVcGRhdGUoZmFsc2UpLCBEZWxldGUoZmFsc2UpLCBEb3dubG9hZChmYWxzZSk7CisKKwkJcHJpdmF0ZSBib29sZWFuIGlzRXh0ZXJuYWxBcGk7CisKKwkJQXJ0aWZhY3RPcGVyYXRpb24oYm9vbGVhbiBpc0V4dGVybmFsQXBpKSB7CisJCQl0aGlzLmlzRXh0ZXJuYWxBcGkgPSBpc0V4dGVybmFsQXBpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbEFwaSgpIHsKKwkJCXJldHVybiBpc0V4dGVybmFsQXBpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxBcGkoYm9vbGVhbiBpc0V4dGVybmFsQXBpKSB7CisJCQl0aGlzLmlzRXh0ZXJuYWxBcGkgPSBpc0V4dGVybmFsQXBpOworCQl9CisJfQorCisJLy8gbmV3IGZsb3cgVVM1NTYxODQKKwlwdWJsaWMgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVBcnRpZmFjdFJlcXVlc3QoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBhcnRpZmFjdElkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLAorCQkJU3RyaW5nIG9yaWdNZDUsIFN0cmluZyBvcmlnaW5EYXRhLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIFN0cmluZyBwYXJlbnRJZCwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpIHsKKwkJcmV0dXJuIGhhbmRsZUFydGlmYWN0UmVxdWVzdChjb21wb25lbnRJZCwgdXNlcklkLCBjb21wb25lbnRUeXBlLCBvcGVyYXRpb24sIGFydGlmYWN0SWQsIGFydGlmYWN0SW5mbywgb3JpZ01kNSwgb3JpZ2luRGF0YSwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uTmFtZSwgcGFyZW50SWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIHRydWUsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVBcnRpZmFjdFJlcXVlc3QoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBhcnRpZmFjdElkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLAorCQkJU3RyaW5nIG9yaWdNZDUsIFN0cmluZyBvcmlnaW5EYXRhLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIFN0cmluZyBwYXJlbnRJZCwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCS8vIHN0ZXAgMQorCQkvLyBkZXRlY3QgYXVkaXRpbmcgdHlwZQorCQlBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24gPSBkZXRlY3RBdWRpdGluZ1R5cGUob3BlcmF0aW9uLCBvcmlnTWQ1KTsKKwkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQkvLyBzdGVwIDIKKwkJLy8gY2hlY2sgaGVhZGVyCisJCWlmICh1c2VySWQgPT0gbnVsbCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04pOworCQkJbG9nLmRlYnVnKCJoYW5kbGVBcnRpZmFjdFJlcXVlc3QgLSBubyBIVFRQX0NTUF9IRUFERVIgLCBjb21wb25lbnQgaWQge30iLCBjb21wb25lbnRJZCk7CisJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgbnVsbCwgY29tcG9uZW50SWQsIG51bGwsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCS8vIHN0ZXAgMworCQkvLyBjaGVjayB1c2VyIGV4aXN0ZW5jZQorCQkvLyBzdGVwIDQKKwkJLy8gY2hlY2sgdXNlcidzIHJvbGUKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB1c2VyUmVzdWx0ID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudElkLCBhcnRpZmFjdElkLCBjb21wb25lbnRUeXBlLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHVzZXJSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVzZXJSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVVzZXIgdXNlciA9IHVzZXJSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyUm9sZSA9IHZhbGlkYXRlVXNlclJvbGUodXNlciwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudElkLCBhcnRpZmFjdElkLCBjb21wb25lbnRUeXBlLCBvcGVyYXRpb24pOworCQlpZiAodmFsaWRhdGVVc2VyUm9sZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVVc2VyUm9sZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJLy8gc3RlcHMgNSAtIDYgLSA3CisJCS8vIDUuIGNoZWNrIHNlcnZpY2UvcmVzb3VyY2UgZXhpc3RlbmNlCisJCS8vIDYuIGNoZWNrIHNlcnZpY2UvcmVzb3VyY2UgY2hlY2sgb3V0CisJCS8vIDcuIHVzZXIgaXMgb3duZXIgb2YgY2hlY2tvdXQgc3RhdGUKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCS8vIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSBudWxsOworCQlTdHJpbmcgcmVhbENvbXBvbmVudElkID0gY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSA/IHBhcmVudElkIDogY29tcG9uZW50SWQ7CisJCUVpdGhlcjw/IGV4dGVuZHMgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyhyZWFsQ29tcG9uZW50SWQsIHVzZXJJZCwgYXVkaXRpbmdBY3Rpb24sIHVzZXIsIGFydGlmYWN0SWQsIGNvbXBvbmVudFR5cGUsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGluVHJhbnNhY3Rpb24pOworCQlpZiAodmFsaWRhdGVDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJY29tcG9uZW50ID0gdmFsaWRhdGVDb21wb25lbnQubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVXb3JrT25SZXNvdXJjZSA9IHZhbGlkYXRlV29ya09uQ29tcG9uZW50KGNvbXBvbmVudCwgdXNlcklkLCBhdWRpdGluZ0FjdGlvbiwgdXNlciwgYXJ0aWZhY3RJZCwgb3BlcmF0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJaWYgKHZhbGlkYXRlV29ya09uUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlV29ya09uUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQkvLyBzdGVwIDgKKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSB2YWxpZGF0ZUFuZEhhbmRsZUFydGlmYWN0KGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlLCBvcGVyYXRpb24sIGFydGlmYWN0SWQsIGFydGlmYWN0SW5mbywgb3JpZ01kNSwgb3JpZ2luRGF0YSwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uTmFtZSwgcGFyZW50SWQsIHVzZXIsIGNvbXBvbmVudCwKKwkJCQlzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoaXMgTWV0aG9kIHZhbGlkYXRlcyBvbmx5IHRoZSBBcnRpZmFjdCBhbmQgZG9lcyBub3QgdmFsaWRhdGUgdXNlciAvIHJvbGUgLyBjb21wb25lbnQgZWN0Li4uPGJyPgorCSAqIEZvciByZWd1bGFyIHVzYWdlIHVzZSA8YnI+CisJICoge0BsaW5rICNoYW5kbGVBcnRpZmFjdFJlcXVlc3QoU3RyaW5nLCBTdHJpbmcsIENvbXBvbmVudFR5cGVFbnVtLCBBcnRpZmFjdE9wZXJhdGlvbiwgU3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfQorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZEhhbmRsZUFydGlmYWN0KFN0cmluZyBjb21wb25lbnRVbmlxdWVJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgYXJ0aWZhY3RVbmlxdWVJZCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiwKKwkJCVN0cmluZyBvcmlnTWQ1LCBTdHJpbmcgb3JpZ2luRGF0YSwgU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgcGFyZW50SWQsIFVzZXIgdXNlciwgQ29tcG9uZW50IGNvbXBvbmVudCwgYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJQ29tcG9uZW50IHBhcmVudCA9IGNvbXBvbmVudDsKKwkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCisJCUF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiA9IGRldGVjdEF1ZGl0aW5nVHlwZShvcGVyYXRpb24sIG9yaWdNZDUpOworCQlhcnRpZmFjdERlZmluaXRpb24gPSB2YWxpZGF0ZUFydGlmYWN0KGNvbXBvbmVudFVuaXF1ZUlkLCBjb21wb25lbnRUeXBlLCBvcGVyYXRpb24sIGFydGlmYWN0VW5pcXVlSWQsIGFydGlmYWN0RGVmaW5pdGlvbiwgcGFyZW50SWQsIGF1ZGl0aW5nQWN0aW9uLCB1c2VyLCBjb21wb25lbnQsIHBhcmVudCwgc2hvdWxkTG9jaywgZXJyb3JXcmFwcGVyKTsKKworCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdDsKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCS8vIHN0ZXAgMTAKKwkJCXJlc3VsdCA9IGRvQWN0aW9uKGNvbXBvbmVudFVuaXF1ZUlkLCBjb21wb25lbnRUeXBlLCBvcGVyYXRpb24sIGFydGlmYWN0VW5pcXVlSWQsIGFydGlmYWN0RGVmaW5pdGlvbiwgb3JpZ01kNSwgb3JpZ2luRGF0YSwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uTmFtZSwgYXVkaXRpbmdBY3Rpb24sIHVzZXIsIHBhcmVudCwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgQXJ0aWZhY3REZWZpbml0aW9uIHZhbGlkYXRlQXJ0aWZhY3QoU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBhcnRpZmFjdElkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgcGFyZW50SWQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgVXNlciB1c2VyLAorCQkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCwgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IHBhcmVudCwgYm9vbGVhbiBzaG91bGRMb2NrLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIpIHsKKwkJaWYgKG9wZXJhdGlvbiA9PSBBcnRpZmFjdE9wZXJhdGlvbi5VcGRhdGUgfHwgb3BlcmF0aW9uID09IEFydGlmYWN0T3BlcmF0aW9uLkRlbGV0ZSB8fCBvcGVyYXRpb24gPT0gQXJ0aWZhY3RPcGVyYXRpb24uRG93bmxvYWQpIHsKKwkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFydGlmYWN0ID0gdmFsaWRhdGVBcnRpZmFjdChjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZSwgYXJ0aWZhY3RJZCwgY29tcG9uZW50LCBhdWRpdGluZ0FjdGlvbiwgcGFyZW50SWQpOworCQkJaWYgKHZhbGlkYXRlQXJ0aWZhY3QuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFydGlmYWN0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBjb21wb25lbnRJZCwgdXNlciwgbnVsbCwgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQodmFsaWRhdGVBcnRpZmFjdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gQXJ0aWZhY3RPcGVyYXRpb24uRG93bmxvYWQpIHsKKwkJCQlhcnRpZmFjdEluZm8gPSB2YWxpZGF0ZUFydGlmYWN0LmxlZnQoKS52YWx1ZSgpOworCQkJCWhhbmRsZUhlYXRFbnZEb3dubG9hZChjb21wb25lbnRJZCwgdXNlciwgY29tcG9uZW50LCB2YWxpZGF0ZUFydGlmYWN0LCBzaG91bGRMb2NrLCBlcnJvcldyYXBwZXIpOworCQkJfQorCQl9CisJCXJldHVybiBhcnRpZmFjdEluZm87CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUhlYXRFbnZEb3dubG9hZChTdHJpbmcgY29tcG9uZW50SWQsIFVzZXIgdXNlciwgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCwgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQXJ0aWZhY3QsIGJvb2xlYW4gc2hvdWxkTG9jaywgV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyKSB7CisJCUFydGlmYWN0RGVmaW5pdGlvbiB2YWxpZGF0ZWRBcnRpZmFjdCA9IHZhbGlkYXRlQXJ0aWZhY3QubGVmdCgpLnZhbHVlKCk7CisKKwkJaWYgKHZhbGlkYXRlZEFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX0VOVi5nZXRUeXBlKCkpKSB7CisJCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGNvbXBvbmVudElkKSkuZmluZEFueSgpLmdldCgpOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRFbnZXaXRoSGVhdFBhcmFtcyA9IGNvbXBvbmVudEluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFVuaXF1ZUlkKCkuZXF1YWxzKHZhbGlkYXRlZEFydGlmYWN0LmdldFVuaXF1ZUlkKCkpKS5maW5kQW55KCkuZ2V0KCk7CisJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyR2VuZXJhdGVkID0gZ2VuZXJhdGVIZWF0RW52QXJ0aWZhY3QoaGVhdEVudldpdGhIZWF0UGFyYW1zLCBjb21wb25lbnQsIGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSwgdXNlciwgc2hvdWxkTG9jayk7CisJCQlpZiAoZWl0aGVyR2VuZXJhdGVkLmlzUmlnaHQoKSkgeworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZWl0aGVyR2VuZXJhdGVkLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYXJ0aWZhY3RHZW5lcmF0aW9uUmVxdWlyZWQob3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbykgeworCQlyZXR1cm4gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCkgPT0gQXJ0aWZhY3RHcm91cFR5cGVFbnVtLlRPU0NBICYmIChjb21wb25lbnQuZ2V0TGlmZWN5Y2xlU3RhdGUoKSA9PSBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOIHx8IGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpID09IExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBnZW5lcmF0ZUFuZFNhdmVUb3NjYUFydGlmYWN0KEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24sIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgdXNlciwgYm9vbGVhbiBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsCisJCQlib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBmZXRjaFRlbXBsYXRlc0Zyb21EQikgeworCisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdGVkID0gZ2VuZXJhdGVUb3NjYUFydGlmYWN0KGNvbXBvbmVudCwgYXJ0aWZhY3REZWZpbml0aW9uLCBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIGZldGNoVGVtcGxhdGVzRnJvbURCLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGdlbmVyYXRlZC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBnZW5lcmF0ZWQ7CisJCX0KKwkJYnl0ZVtdIGRlY29kZWRQYXlsb2FkID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldFBheWxvYWREYXRhKCk7CisJCWFydGlmYWN0RGVmaW5pdGlvbi5zZXRFc0lkKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEFydGlmYWN0Q2hlY2tzdW0oR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlCeXRlQXJyYXkoZGVjb2RlZFBheWxvYWQpKTsKKwkJcmV0dXJuIGxvY2tDb21wb25lbnRBbmRVcGRhdGVBcnRpZmFjdChjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3REZWZpbml0aW9uLCBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfUEFZTE9BRF9VUERBVEUsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCB1c2VyLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLCBjb21wb25lbnQsIGRlY29kZWRQYXlsb2FkLCBudWxsLCBudWxsLAorCQkJCXNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGdlbmVyYXRlVG9zY2FBcnRpZmFjdChDb21wb25lbnQgcGFyZW50LCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBib29sZWFuIGlzSW5DZXJ0aWZpY2F0aW9uUmVxdWVzdCwgYm9vbGVhbiBmZXRjaFRlbXBsYXRlc0Zyb21EQiwgYm9vbGVhbiBzaG91bGRMb2NrLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCWxvZy5kZWJ1ZygidG9zY2EgYXJ0aWZhY3QgZ2VuZXJhdGlvbiIpOworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLlRPU0NBX0NTQVIuZ2V0VHlwZSgpKSkgeworCQkJRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IGdlbmVyYXRlZCA9IGNzYXJVdGlscy5jcmVhdGVDc2FyKHBhcmVudCwgZmV0Y2hUZW1wbGF0ZXNGcm9tREIsIGlzSW5DZXJ0aWZpY2F0aW9uUmVxdWVzdCwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisKKwkJCWlmIChnZW5lcmF0ZWQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZXhwb3J0IHRvc2NhIGNzYXIgZm9yIGNvbXBvbmVudCB7fSBlcnJvciB7fSIsIHBhcmVudC5nZXRVbmlxdWVJZCgpLCBnZW5lcmF0ZWQucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZ2VuZXJhdGVkLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlieXRlW10gdmFsdWUgPSBnZW5lcmF0ZWQubGVmdCgpLnZhbHVlKCk7CisJCQlhcnRpZmFjdEluZm8uc2V0UGF5bG9hZCh2YWx1ZSk7CisKKwkJfSBlbHNlIHsKKwkJCUVpdGhlcjxUb3NjYVJlcHJlc2VudGF0aW9uLCBUb3NjYUVycm9yPiBleHBvcnRDb21wb25lbnQgPSB0b3NjYUV4cG9ydFV0aWxzLmV4cG9ydENvbXBvbmVudChwYXJlbnQpOworCQkJaWYgKGV4cG9ydENvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCBleHBvcnQgdG9zY2EgeWFtbCBmb3IgY29tcG9uZW50IHt9IGVycm9yIHt9IiwgcGFyZW50LmdldFVuaXF1ZUlkKCksIGV4cG9ydENvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21Ub3NjYUVycm9yKGV4cG9ydENvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KHN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlsb2cuZGVidWcoIlRvc2NhIHlhbWwgZXhwb3J0ZWQgZm9yIGNvbXBvbmVudCB7fSAiLCBwYXJlbnQuZ2V0VW5pcXVlSWQoKSk7CisJCQlTdHJpbmcgcGF5bG9hZCA9IGV4cG9ydENvbXBvbmVudC5sZWZ0KCkudmFsdWUoKS5nZXRNYWluWWFtbCgpOworCQkJYXJ0aWZhY3RJbmZvLnNldFBheWxvYWREYXRhKHBheWxvYWQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChFaXRoZXIubGVmdChhcnRpZmFjdEluZm8pKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZG9BY3Rpb24oU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBhcnRpZmFjdElkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgb3JpZ01kNSwKKwkJCVN0cmluZyBvcmlnaW5EYXRhLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgVXNlciB1c2VyLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgcGFyZW50LCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgeworCQkJaW50ZXJmYWNlTmFtZSA9IGludGVyZmFjZU5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCW9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7CisJCX0KKwkJc3dpdGNoIChvcGVyYXRpb24pIHsKKwkJY2FzZSBEb3dubG9hZDoKKwkJCWlmIChhcnRpZmFjdEdlbmVyYXRpb25SZXF1aXJlZChwYXJlbnQsIGFydGlmYWN0SW5mbykpIHsKKwkJCQlyZXR1cm4gZ2VuZXJhdGVUb3NjYUFydGlmYWN0KHBhcmVudCwgYXJ0aWZhY3RJbmZvLCBmYWxzZSwgZmFsc2UsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCQkJfQorCQkJcmV0dXJuIGhhbmRsZURvd25sb2FkKGNvbXBvbmVudElkLCBhcnRpZmFjdElkLCB1c2VyLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSwgcGFyZW50LCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJY2FzZSBEZWxldGU6CisJCQlyZXR1cm4gaGFuZGxlRGVsZXRlKGNvbXBvbmVudElkLCBhcnRpZmFjdElkLCB1c2VyLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSwgcGFyZW50LCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25OYW1lLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJY2FzZSBVcGRhdGU6CisJCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uZmluZFR5cGUoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpKTsKKwkJCWlmIChjb21wb25lbnRUeXBlLmVxdWFscyhDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSkKKwkJCQkJJiYgKGFydGlmYWN0VHlwZSA9PSBBcnRpZmFjdFR5cGVFbnVtLkhFQVQgfHwgYXJ0aWZhY3RUeXBlID09IEFydGlmYWN0VHlwZUVudW0uSEVBVF9WT0wgfHwgYXJ0aWZhY3RUeXBlID09IEFydGlmYWN0VHlwZUVudW0uSEVBVF9ORVQgfHwgYXJ0aWZhY3RUeXBlID09IEFydGlmYWN0VHlwZUVudW0uSEVBVF9FTlYpKSB7CisJCQkJcmV0dXJuIGhhbmRsZVVwZGF0ZUhlYXRFbnYoY29tcG9uZW50SWQsIGFydGlmYWN0SW5mbywgYXVkaXRpbmdBY3Rpb24sIGFydGlmYWN0SWQsIHVzZXIsIGNvbXBvbmVudFR5cGUsIHBhcmVudCwgb3JpZ2luRGF0YSwgb3JpZ01kNSwgb3BlcmF0aW9uLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCX0KKwkJCXJldHVybiBoYW5kbGVVcGRhdGUoY29tcG9uZW50SWQsIGFydGlmYWN0SW5mbywgb3BlcmF0aW9uLCBhdWRpdGluZ0FjdGlvbiwgYXJ0aWZhY3RJZCwgdXNlciwgY29tcG9uZW50VHlwZSwgcGFyZW50LCBvcmlnTWQ1LCBvcmlnaW5EYXRhLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25OYW1lLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJY2FzZSBDcmVhdGU6CisJCQlyZXR1cm4gaGFuZGxlQ3JlYXRlKGNvbXBvbmVudElkLCBhcnRpZmFjdEluZm8sIG9wZXJhdGlvbiwgYXVkaXRpbmdBY3Rpb24sIHVzZXIsIGNvbXBvbmVudFR5cGUsIHBhcmVudCwgb3JpZ01kNSwgb3JpZ2luRGF0YSwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uTmFtZSwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudElkCisJICogQHBhcmFtIGFydGlmYWN0SWQKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHBhcmFtIGNvbXBvbmVudFR5cGUKKwkgKiBAcGFyYW0gcGFyZW50SWQKKwkgKiAgICAgICAgICAgIFRPRE8KKwkgKiBAcmV0dXJuCisJICovCisKKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8U3RyaW5nLCBieXRlW10+LCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlRG93bmxvYWRUb3NjYU1vZGVsUmVxdWVzdChDb21wb25lbnQgY29tcG9uZW50LCBBcnRpZmFjdERlZmluaXRpb24gY3NhckFydGlmYWN0LCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlpZiAoYXJ0aWZhY3RHZW5lcmF0aW9uUmVxdWlyZWQoY29tcG9uZW50LCBjc2FyQXJ0aWZhY3QpKSB7CisJCQlFaXRoZXI8Ynl0ZVtdLCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdGVkID0gY3NhclV0aWxzLmNyZWF0ZUNzYXIoY29tcG9uZW50LCBmYWxzZSwgZmFsc2UsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCisJCQlpZiAoZ2VuZXJhdGVkLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGV4cG9ydCB0b3NjYSBjc2FyIGZvciBjb21wb25lbnQge30gZXJyb3Ige30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgZ2VuZXJhdGVkLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdlbmVyYXRlZC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPihjc2FyQXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCksIGdlbmVyYXRlZC5sZWZ0KCkudmFsdWUoKSkpOworCQl9CisJCXJldHVybiBkb3dubG9hZEFydGlmYWN0KGNzYXJBcnRpZmFjdCk7CisJfQorCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZURvd25sb2FkUmVxdWVzdEJ5SWQoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgU3RyaW5nIHVzZXJJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIHBhcmVudElkLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSkgeworCQkvLyBwZXJmb3JtIGFsbCB2YWxpZGF0aW9uIGluIGNvbW1vbiBmbG93CisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gaGFuZGxlQXJ0aWZhY3RSZXF1ZXN0KGNvbXBvbmVudElkLCB1c2VySWQsIGNvbXBvbmVudFR5cGUsIEFydGlmYWN0T3BlcmF0aW9uLkRvd25sb2FkLCBhcnRpZmFjdElkLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBwYXJlbnRJZCwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb247CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4gaW5zaWRlVmFsdWUgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCWlmIChpbnNpZGVWYWx1ZS5pc0xlZnQoKSkgeworCQkJYXJ0aWZhY3REZWZpbml0aW9uID0gaW5zaWRlVmFsdWUubGVmdCgpLnZhbHVlKCk7CisJCX0gZWxzZSB7CisJCQlhcnRpZmFjdERlZmluaXRpb24gPSBpbnNpZGVWYWx1ZS5yaWdodCgpLnZhbHVlKCkuZ2V0SW1wbGVtZW50YXRpb24oKTsKKwkJfQorCQkvLyBmb3IgdG9zY2EgYXJ0aWZhY3RzIGdlbmVyYXRlZCBvbiBkb3dubG9hZCB3aXRob3V0IHNhdmluZworCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0R3JvdXBUeXBlKCkgPT0gQXJ0aWZhY3RHcm91cFR5cGVFbnVtLlRPU0NBICYmIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRQYXlsb2FkRGF0YSgpICE9IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIGJ5dGVbXT4oYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TmFtZSgpLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0UGF5bG9hZERhdGEoKSkpOworCQl9CisJCXJldHVybiBkb3dubG9hZEFydGlmYWN0KGFydGlmYWN0RGVmaW5pdGlvbik7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBcnRpZmFjdChTdHJpbmcgY29tcG9uZW50SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBhcnRpZmFjdElkLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24sIFN0cmluZyBwYXJlbnRJZCkgeworCQkvLyBzdGVwIDkKKwkJLy8gY2hlY2sgYXJ0aWZhY3QgZXhpc3RlbmNlCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0UmVzdWx0ID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RCeUlkKGFydGlmYWN0SWQsIGZhbHNlKTsKKwkJaWYgKGFydGlmYWN0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJaWYgKGFydGlmYWN0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORCwgIiIpOworCQkJCWxvZy5kZWJ1ZygiYWRkQXJ0aWZhY3QgLSBhcnRpZmFjdCB7fSBub3QgZm91bmQiLCBhcnRpZmFjdElkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKworCQkJfSBlbHNlIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoYXJ0aWZhY3RSZXN1bHQucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJbG9nLmRlYnVnKCJhZGRBcnRpZmFjdCAtIGZhaWxlZCB0byBmZXRjaCBhcnRpZmFjdCB7fSwgZXJyb3Ige30iLCBhcnRpZmFjdElkLCBhcnRpZmFjdFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9CisJCS8vIHN0ZXAgOS4xCisJCS8vIGNoZWNrIGFydGlmYWN0IGJlbG9uZyB0byBjb21wb25lbnQKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKwkJY2FzZSBSRVNPVVJDRToKKwkJY2FzZSBTRVJWSUNFOgorCQkJZm91bmQgPSBjaGVja0FydGlmYWN0SW5Db21wb25lbnQoY29tcG9uZW50LCBhcnRpZmFjdElkKTsKKwkJCWJyZWFrOworCQljYXNlIFJFU09VUkNFX0lOU1RBTkNFOgorCQkJZm91bmQgPSBjaGVja0FydGlmYWN0SW5SZXNvdXJjZUluc3RhbmNlKGNvbXBvbmVudCwgY29tcG9uZW50SWQsIGFydGlmYWN0SWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisKKwkJfQorCQlpZiAoIWZvdW5kKSB7CisJCQkvLyBTdHJpbmcgY29tcG9uZW50ID0KKwkJCS8vIGNvbXBvbmVudFR5cGUuZXF1YWxzKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSA/ICJyZXNvdXJjZSIgOgorCQkJLy8gInNlcnZpY2UiOworCQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnRUeXBlLm5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9BUlRJRkFDVF9OT1RfRk9VTkQsIGNvbXBvbmVudE5hbWUpOworCQkJbG9nLmRlYnVnKCJhZGRBcnRpZmFjdCAtIENvbXBvbmVudCBhcnRpZmFjdCBub3QgZm91bmQgY29tcG9uZW50IElkIHt9LCBhcnRpZmFjdCBpZCB7fSIsIGNvbXBvbmVudElkLCBhcnRpZmFjdElkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdFJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZUNyZWF0ZShTdHJpbmcgcGFyZW50SWQsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIEFydGlmYWN0T3BlcmF0aW9uIG9wZXJhdGlvbiwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uLCBVc2VyIHVzZXIsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsCisJCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgcGFyZW50LCBTdHJpbmcgb3JpZ01kNSwgU3RyaW5nIG9yaWdpbkRhdGEsIFN0cmluZyBpbnRlcmZhY2VUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSwgYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlTdHJpbmcgYXJ0aWZhY3RJZCA9IG51bGw7CisKKwkJLy8gc3RlcCAxMQorCQlFaXRoZXI8Ynl0ZVtdLCBSZXNwb25zZUZvcm1hdD4gcGF5bG9hZEVpdGhlciA9IHZhbGlkYXRlSW5wdXQocGFyZW50SWQsIGFydGlmYWN0SW5mbywgb3BlcmF0aW9uLCBhdWRpdGluZ0FjdGlvbiwgYXJ0aWZhY3RJZCwgdXNlciwgY29tcG9uZW50VHlwZSwgcGFyZW50LCBvcmlnTWQ1LCBvcmlnaW5EYXRhLCBpbnRlcmZhY2VUeXBlLCBvcGVyYXRpb25OYW1lLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHBheWxvYWRFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHBheWxvYWRFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlieXRlW10gZGVjb2RlZFBheWxvYWQgPSBwYXlsb2FkRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQlOb2RlVHlwZUVudW0gcGFyZW50VHlwZSA9IGNvbnZlcnRQYXJlbnRUeXBlKGNvbXBvbmVudFR5cGUpOworCQkvLyBsb2NrIHJlc291cmNlCisKKwkJaWYgKHNob3VsZExvY2spIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja0NvbXBvbmVudCA9IGxvY2tDb21wb25lbnQocGFyZW50LCAiVXBsb2FkIEFydGlmYWN0IC0gbG9jayAiKTsKKwkJCWlmIChsb2NrQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBudWxsLCBudWxsLCBudWxsLCBsb2NrQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHRPcCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCXJlc3VsdE9wID0gY3JlYXRlQXJ0aWZhY3QocGFyZW50LCBwYXJlbnRJZCwgYXJ0aWZhY3RJbmZvLCBkZWNvZGVkUGF5bG9hZCwgdXNlciwgY29tcG9uZW50VHlwZSwgYXVkaXRpbmdBY3Rpb24sIGludGVyZmFjZVR5cGUsIG9wZXJhdGlvbk5hbWUpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHNob3VsZExvY2spIHsKKwkJCQl1bmxvY2tDb21wb25lbnQocmVzdWx0T3AsIHBhcmVudCwgaW5UcmFuc2FjdGlvbik7CisJCQl9CisKKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnRBbmRVcGRhdGVBcnRpZmFjdChTdHJpbmcgcGFyZW50SWQsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgU3RyaW5nIGFydGlmYWN0SWQsIFVzZXIgdXNlciwKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBwYXJlbnQsIGJ5dGVbXSBkZWNvZGVkUGF5bG9hZCwgU3RyaW5nIGludGVyZmFjZVR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCU5vZGVUeXBlRW51bSBwYXJlbnRUeXBlID0gY29udmVydFBhcmVudFR5cGUoY29tcG9uZW50VHlwZSk7CisKKwkJLy8gbG9jayByZXNvdXJjZQorCQlpZiAoc2hvdWxkTG9jaykgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChwYXJlbnQsICJVcGRhdGUgQXJ0aWZhY3QgLSBsb2NrICIpOworCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpLCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCQl0cnkgeworCQkJcmVzdWx0T3AgPSB1cGRhdGVBcnRpZmFjdEZsb3cocGFyZW50LCBwYXJlbnRJZCwgYXJ0aWZhY3RJZCwgYXJ0aWZhY3RJbmZvLCB1c2VyLCBkZWNvZGVkUGF5bG9hZCwgY29tcG9uZW50VHlwZSwgYXVkaXRpbmdBY3Rpb24sIGludGVyZmFjZVR5cGUsIG9wZXJhdGlvbk5hbWUpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCisJCX0gZmluYWxseSB7CisJCQlpZiAoc2hvdWxkTG9jaykgeworCQkJCXVubG9ja0NvbXBvbmVudChyZXN1bHRPcCwgcGFyZW50LCBpblRyYW5zYWN0aW9uKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVVcGRhdGUoU3RyaW5nIHBhcmVudElkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24sIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgU3RyaW5nIGFydGlmYWN0SWQsIFVzZXIgdXNlciwKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBwYXJlbnQsIFN0cmluZyBvcmlnTWQ1LCBTdHJpbmcgb3JpZ2luRGF0YSwgU3RyaW5nIGludGVyZmFjZVR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBwYXlsb2FkRWl0aGVyID0gdmFsaWRhdGVJbnB1dChwYXJlbnRJZCwgYXJ0aWZhY3RJbmZvLCBvcGVyYXRpb24sIGF1ZGl0aW5nQWN0aW9uLCBhcnRpZmFjdElkLCB1c2VyLCBjb21wb25lbnRUeXBlLCBwYXJlbnQsIG9yaWdNZDUsIG9yaWdpbkRhdGEsIGludGVyZmFjZVR5cGUsIG9wZXJhdGlvbk5hbWUsIGluVHJhbnNhY3Rpb24pOworCisJCWlmIChwYXlsb2FkRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChwYXlsb2FkRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJYnl0ZVtdIGRlY29kZWRQYXlsb2FkID0gcGF5bG9hZEVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKworCQlyZXR1cm4gbG9ja0NvbXBvbmVudEFuZFVwZGF0ZUFydGlmYWN0KHBhcmVudElkLCBhcnRpZmFjdEluZm8sIGF1ZGl0aW5nQWN0aW9uLCBhcnRpZmFjdElkLCB1c2VyLCBjb21wb25lbnRUeXBlLCBwYXJlbnQsIGRlY29kZWRQYXlsb2FkLCBpbnRlcmZhY2VUeXBlLCBvcGVyYXRpb25OYW1lLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUlucHV0KFN0cmluZyBwYXJlbnRJZCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24sIFN0cmluZyBhcnRpZmFjdElkLCBVc2VyIHVzZXIsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsCisJCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgcGFyZW50LCBTdHJpbmcgb3JpZ01kNSwgU3RyaW5nIG9yaWdpbkRhdGEsIFN0cmluZyBpbnRlcmZhY2VUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCS8vIE1kNSB2YWxpZGF0aW9ucworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlTWQ1ID0gdmFsaWRhdGVNZDUob3JpZ01kNSwgb3JpZ2luRGF0YSwgYXJ0aWZhY3RJbmZvLmdldFBheWxvYWREYXRhKCksIG9wZXJhdGlvbik7CisJCWlmICh2YWxpZGF0ZU1kNS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVNZDUucmlnaHQoKS52YWx1ZSgpOworCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJLy8gc3RlcCAxMQorCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUlucHV0KHBhcmVudElkLCBhcnRpZmFjdEluZm8sIG9wZXJhdGlvbiwgYXJ0aWZhY3RJZCwgdXNlciwgaW50ZXJmYWNlVHlwZSwgb3BlcmF0aW9uTmFtZSwgY29tcG9uZW50VHlwZSwgcGFyZW50LCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHZhbGlkYXRlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnRJZCwgdXNlciwgbnVsbCwgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IHBheWxvYWRFaXRoZXIgPSBoYW5kbGVQYXlsb2FkKGFydGlmYWN0SW5mbywgaXNBcnRpZmFjdE1ldGFkYXRhVXBkYXRlKGF1ZGl0aW5nQWN0aW9uKSk7CisJCWlmIChwYXlsb2FkRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBwYXlsb2FkRWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQlsb2cuZGVidWcoIkVycm9yIGR1cmluZyBoYW5kbGUgcGF5bG9hZCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQkvLyB2YWxpZGF0ZSBoZWF0IHBhcmFtZXRlcnMuIHRoaXMgcGFydCBtdXN0IGJlIGFmdGVyIHRoZSBwYXJhbWV0ZXJzIGFyZQorCQkvLyBleHRyYWN0ZWQgaW4gImhhbmRsZVBheWxvYWQiCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZENvbnZlcnRIZWF0UGFyYW1lcnMgPSB2YWxpZGF0ZUFuZENvbnZlcnRIZWF0UGFyYW1lcnMoYXJ0aWZhY3RJbmZvLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQlpZiAodmFsaWRhdGVBbmRDb252ZXJ0SGVhdFBhcmFtZXJzLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFuZENvbnZlcnRIZWF0UGFyYW1lcnMucmlnaHQoKS52YWx1ZSgpOworCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIGFydGlmYWN0SW5mbywgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJbG9nLmRlYnVnKCJFcnJvciBkdXJpbmcgaGFuZGxlIHBheWxvYWQiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBwYXlsb2FkRWl0aGVyOworCX0KKworCXB1YmxpYyB2b2lkIGhhbmRsZUF1ZGl0aW5nKEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbkVudW0sIENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBjb21wb25lbnRJZCwgVXNlciB1c2VyLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uLCBTdHJpbmcgcHJldkFydGlmYWN0VXVpZCwgU3RyaW5nIGN1cnJlbnRBcnRpZmFjdFV1aWQsIFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0LAorCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSkgeworCisJCWlmIChhdWRpdGluZ0FjdGlvbkVudW0uZ2V0QXVkaXRpbmdFc1R5cGUoKS5lcXVhbHMoQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5FWFRFUk5BTF9BUElfRVZFTlRfVFlQRSkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IGNyZWF0ZUFydGlmYWN0QXVkaXRpbmdGaWVsZHMoYXJ0aWZhY3REZWZpbml0aW9uLCBwcmV2QXJ0aWZhY3RVdWlkLCBjdXJyZW50QXJ0aWZhY3RVdWlkKTsKKworCQlpZiAodXNlciA9PSBudWxsKSB7CisJCQl1c2VyID0gbmV3IFVzZXIoKTsKKwkJCXVzZXIuc2V0VXNlcklkKCJVTktOT1dOIik7CisJCX0KKwkJc3dpdGNoIChjb21wb25lbnRUeXBlRW51bSkgeworCisJCWNhc2UgUkVTT1VSQ0U6CisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY29tcG9uZW50OworCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCQkvLyBJbiB0aGF0IGNhc2UsIGNvbXBvbmVudCBJRCBzaG91bGQgYmUgaW5zdGVhZCBvZiBuYW1lCisJCQkJcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKKwkJCQlyZXNvdXJjZS5zZXROYW1lKGNvbXBvbmVudElkKTsKKwkJCX0KKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgbnVsbCwgbnVsbCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKworCQljYXNlIFNFUlZJQ0U6CisJCQlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgY29tcG9uZW50OworCQkJaWYgKHNlcnZpY2UgPT0gbnVsbCkgeworCQkJCS8vIEluIHRoYXQgY2FzZSwgY29tcG9uZW50IElEIHNob3VsZCBiZSBpbnN0ZWFkIG9mIG5hbWUKKwkJCQlzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsKKwkJCQlzZXJ2aWNlLnNldE5hbWUoY29tcG9uZW50SWQpOworCQkJfQorCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50KHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBzZXJ2aWNlLCBudWxsLCBudWxsLCBhdWRpdGluZ0FjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTT1VSQ0VfSU5TVEFOQ0U6CisJCQlpZiAocmVzb3VyY2VJbnN0YW5jZU5hbWUgPT0gbnVsbCkgeworCQkJCXJlc291cmNlSW5zdGFuY2VOYW1lID0gZ2V0UmVzb3VyY2VJbnN0YW5jZU5hbWVGcm9tQ29tcG9uZW50KGNvbXBvbmVudCwgY29tcG9uZW50SWQpOworCQkJfQorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgcmVzb3VyY2VJbnN0YW5jZU5hbWUpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50KHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBjb21wb25lbnQsIG51bGwsIG51bGwsIGF1ZGl0aW5nQWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UsIGF1ZGl0aW5nRmllbGRzKTsKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlSW5zdGFuY2VOYW1lRnJvbUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgY29tcG9uZW50SWQpIHsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGNvbXBvbmVudElkKSkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOworCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUgPSBudWxsOworCQlpZiAocmVzb3VyY2VJbnN0YW5jZSAhPSBudWxsKSB7CisJCQlyZXNvdXJjZUluc3RhbmNlTmFtZSA9IHJlc291cmNlSW5zdGFuY2UuZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiByZXNvdXJjZUluc3RhbmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGNyZWF0ZUFydGlmYWN0QXVkaXRpbmdGaWVsZHMoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiwgU3RyaW5nIHByZXZBcnRpZmFjdFV1aWQsIFN0cmluZyBjdXJyZW50QXJ0aWZhY3RVdWlkKSB7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCS8vIFB1dHRpbmcgdG9nZXRoZXIgYXJ0aWZhY3QgaW5mbworCQlTdHJpbmcgYXJ0aWZhY3REYXRhID0gYnVpbGRBdWRpdGluZ0FydGlmYWN0RGF0YShhcnRpZmFjdERlZmluaXRpb24pOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BUlRJRkFDVF9EQVRBLCBhcnRpZmFjdERhdGEpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9QUkVWX0FSVElGQUNUX1VVSUQsIHByZXZBcnRpZmFjdFV1aWQpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DVVJSX0FSVElGQUNUX1VVSUQsIGN1cnJlbnRBcnRpZmFjdFV1aWQpOworCQlyZXR1cm4gYXVkaXRpbmdGaWVsZHM7CisJfQorCisJLy8gLS0tLS0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkQXVkaXRpbmdBcnRpZmFjdERhdGEoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbikgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaWYgKGFydGlmYWN0RGVmaW5pdGlvbiAhPSBudWxsKSB7CisJCQlzYi5hcHBlbmQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0R3JvdXBUeXBlKCkuZ2V0VHlwZSgpKS5hcHBlbmQoIiwiKS5hcHBlbmQoIiciKS5hcHBlbmQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKSkuYXBwZW5kKCInIikuYXBwZW5kKCIsIikuYXBwZW5kKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdFR5cGUoKSkuYXBwZW5kKCIsIikKKwkJCQkJLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCkpLmFwcGVuZCgiLCIpLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0VGltZW91dCgpKS5hcHBlbmQoIiwiKS5hcHBlbmQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEVzSWQoKSk7CisKKwkJCXNiLmFwcGVuZCgiLCIpOworCQkJaWYgKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdFZlcnNpb24oKSAhPSBudWxsKSB7CisKKwkJCQlzYi5hcHBlbmQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VmVyc2lvbigpKTsKKwkJCX0gZWxzZSB7CisJCQkJc2IuYXBwZW5kKCIgIik7CisJCQl9CisJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RVVUlEKCkgIT0gbnVsbCkgeworCQkJCXNiLmFwcGVuZChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RVVUlEKCkpOworCQkJfSBlbHNlIHsKKwkJCQlzYi5hcHBlbmQoIiAiKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVNZDUoU3RyaW5nIG9yaWdNZDUsIFN0cmluZyBvcmlnaW5EYXRhLCBieXRlW10gcGF5bG9hZCwgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uKSB7CisKKwkJaWYgKG9yaWdNZDUgIT0gbnVsbCkgeworCQkJU3RyaW5nIGVuY29kZUJhc2U2NFN0ciA9IEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5U3RyaW5nKG9yaWdpbkRhdGEpOworCisJCQlpZiAoZmFsc2UgPT0gZW5jb2RlQmFzZTY0U3RyLmVxdWFscyhvcmlnTWQ1KSkgeworCQkJCWxvZy5kZWJ1ZygiVGhlIGNhbGN1bGF0ZWQgbWQ1IGlzIGRpZmZlcmVudCB0aGVuIHRoZSByZWNlaXZlZCBvbmUiKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfSU5WQUxJRF9NRDUpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvcGVyYXRpb24gPT0gQXJ0aWZhY3RPcGVyYXRpb24uQ3JlYXRlKSB7CisJCQkJbG9nLmRlYnVnKCJNaXNzaW5nIG1kNSBoZWFkZXIgZHVyaW5nIGFydGlmYWN0IGNyZWF0ZSIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9JTlZBTElEX01ENSkpOworCQkJfQorCQkJLy8gVXBkYXRlIG1ldGFkYXRhCisJCQlpZiAocGF5bG9hZCAhPSBudWxsICYmIHBheWxvYWQubGVuZ3RoICE9IDApIHsKKwkJCQlsb2cuZGVidWcoIkNhbm5vdCBoYXZlIHBheWxvYWQgd2hpbGUgbWQ1IGhlYWRlciBpcyBtaXNzaW5nIik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUlucHV0KFN0cmluZyBwYXJlbnRJZCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgYXJ0aWZhY3RJZCwgVXNlciB1c2VyLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBDb21wb25lbnQgcGFyZW50Q29tcG9uZW50LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kU2V0QXJ0aWZhY3RuYW1lID0gdmFsaWRhdGVBbmRTZXRBcnRpZmFjdG5hbWUoYXJ0aWZhY3RJbmZvKTsKKwkJaWYgKHZhbGlkYXRlQW5kU2V0QXJ0aWZhY3RuYW1lLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUFuZFNldEFydGlmYWN0bmFtZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBhcnRpZmFjdEJ5SWQgPSBmZXRjaEN1cnJlbnRBcnRpZmFjdChvcGVyYXRpb24sIGFydGlmYWN0SWQpOworCQlpZiAoYXJ0aWZhY3RCeUlkLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChhcnRpZmFjdEJ5SWQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlBcnRpZmFjdERlZmluaXRpb24gY3VycmVudEFydGlmYWN0SW5mbyA9IGFydGlmYWN0QnlJZC5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCAmJiBpbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKKwkJCW9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7CisJCQlpbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZS50b0xvd2VyQ2FzZSgpOworCQl9CisJCUVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBsb2dpY2FsTmFtZVN0YXR1cyA9IGhhbmRsZUFydGlmYWN0TGFiZWwocGFyZW50SWQsIG9wZXJhdGlvbiwgYXJ0aWZhY3RJZCwgYXJ0aWZhY3RJbmZvLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25OYW1lLCBjdXJyZW50QXJ0aWZhY3RJbmZvLCBjb21wb25lbnRUeXBlLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGxvZ2ljYWxOYW1lU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2dpY2FsTmFtZVN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCS8vIFRoaXMgaXMgYSBwYXRjaCB0byBibG9jayBwb3NzaWJpbGl0eSBvZiB1cGRhdGluZyBzZXJ2aWNlIGFwaSBmaWVsZHMKKwkJLy8gdGhyb3VnaCBvdGhlciBhcnRpZmFjdHMgZmxvdworCisJCWlmICghb3BlcmF0aW9uLmVxdWFscyhBcnRpZmFjdE9wZXJhdGlvbi5DcmVhdGUpKSB7CisJCQljaGVja0FuZFNldFVuVXBkYXRhYmxlRmllbGRzKHVzZXIsIGFydGlmYWN0SW5mbywgY3VycmVudEFydGlmYWN0SW5mbywgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCA/IEFydGlmYWN0R3JvdXBUeXBlRW51bS5MSUZFX0NZQ0xFIDogQXJ0aWZhY3RHcm91cFR5cGVFbnVtLklORk9STUFUSU9OQUwpKTsKKwkJfSBlbHNlIHsKKwkJCWNoZWNrQ3JlYXRlRmllbGRzKHVzZXIsIGFydGlmYWN0SW5mbywgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCA/IEFydGlmYWN0R3JvdXBUeXBlRW51bS5MSUZFX0NZQ0xFIDogQXJ0aWZhY3RHcm91cFR5cGVFbnVtLklORk9STUFUSU9OQUwpKTsKKwkJfQorCisJCWNvbXBvc2VBcnRpZmFjdElkKHBhcmVudElkLCBhcnRpZmFjdElkLCBhcnRpZmFjdEluZm8sIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUpOworCQlpZiAoY3VycmVudEFydGlmYWN0SW5mbyAhPSBudWxsKSB7CisJCQlhcnRpZmFjdEluZm8uc2V0TWFuZGF0b3J5KGN1cnJlbnRBcnRpZmFjdEluZm8uZ2V0TWFuZGF0b3J5KCkpOworCQl9CisKKwkJLy8gYXJ0aWZhY3RHcm91cFR5cGUgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXBkYXRlZAorCQlpZiAoIW9wZXJhdGlvbi5lcXVhbHMoQXJ0aWZhY3RPcGVyYXRpb24uQ3JlYXRlKSkgeworCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlR3JvdXBUeXBlID0gdmFsaWRhdGVPclNldEFydGlmYWN0R3JvdXBUeXBlKGFydGlmYWN0SW5mbywgY3VycmVudEFydGlmYWN0SW5mbyk7CisJCQlpZiAodmFsaWRhdGVHcm91cFR5cGUuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUdyb3VwVHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCS8vIFRPRE8gVEVNUCAhISEKKwkJTm9kZVR5cGVFbnVtIHBhcmVudFR5cGUgPSBjb252ZXJ0UGFyZW50VHlwZShjb21wb25lbnRUeXBlKTsKKworCQkvLyBUT0RPIFRFTVAgISEhCisJCWJvb2xlYW4gaXNDcmVhdGUgPSBvcGVyYXRpb24uZXF1YWxzKEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZSk7CisKKwkJaWYgKGlzRGVwbG95bWVudEFydGlmYWN0KGFydGlmYWN0SW5mbykpIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZGVwbG95bWVudFZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZURlcGxveW1lbnRBcnRpZmFjdChwYXJlbnRDb21wb25lbnQsIHBhcmVudElkLCB1c2VyLmdldFVzZXJJZCgpLCBpc0NyZWF0ZSwgYXJ0aWZhY3RJbmZvLCBjdXJyZW50QXJ0aWZhY3RJbmZvLCBwYXJlbnRUeXBlKTsKKwkJCWlmIChkZXBsb3ltZW50VmFsaWRhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRlcGxveW1lbnRWYWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhcnRpZmFjdEluZm8uc2V0VGltZW91dChOT05fSEVBVF9USU1FT1VUKTsKKworCQkJLyoKKwkJCSAqIGlmIChpbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy4gaXNJbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3QoYXJ0aWZhY3RJbmZvKSkgeyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRpb25SZXN1bHQgPSBpbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy52YWxpZGF0ZUFydGlmYWN0KCBpc0NyZWF0ZSwgYXJ0aWZhY3RJbmZvLAorCQkJICogcGFyZW50Q29tcG9uZW50LCBwYXJlbnRUeXBlKTsgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNSaWdodCgpKSB7IHJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOyB9IH0KKwkJCSAqLworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBkZXNjcmlwdGlvblJlc3VsdCA9IHZhbGlkYXRlQW5kQ2xlYW5EZXNjcmlwdGlvbihhcnRpZmFjdEluZm8pOworCQlpZiAoZGVzY3JpcHRpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRlc2NyaXB0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlpZiAoY3VycmVudEFydGlmYWN0SW5mbyAhPSBudWxsICYmIGN1cnJlbnRBcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKS5lcXVhbHMoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLlNFUlZJQ0VfQVBJKSkgeworCQkJRWl0aGVyPEFjdGlvblN0YXR1cywgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU2VydmljZUFwaVR5cGUgPSB2YWxpZGF0ZUFydGlmYWN0VHlwZSh1c2VyLmdldFVzZXJJZCgpLCBhcnRpZmFjdEluZm8sIHBhcmVudFR5cGUpOworCQkJaWYgKHZhbGlkYXRlU2VydmljZUFwaVR5cGUuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVNlcnZpY2VBcGlUeXBlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQkvLyBDaGFuZ2Ugb2YgdHlwZSBpcyBub3QgYWxsb3dlZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQKKworCQkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZShBUlRJRkFDVF9UWVBFX09USEVSKTsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVybCA9IHZhbGlkYXRlQW5kU2VydmljZUFwaVVybChhcnRpZmFjdEluZm8pOworCQkJaWYgKHZhbGlkYXRlVXJsLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVVcmwucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVwZGF0ZSA9IHZhbGlkYXRlRmlyc3RVcGRhdGVIYXNQYXlsb2FkKGFydGlmYWN0SW5mbywgY3VycmVudEFydGlmYWN0SW5mbyk7CisJCQlpZiAodmFsaWRhdGVVcGRhdGUuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJzZXJ2aWNlQXBpIGZpcnN0IHVwZGF0ZSBjbm5vdCBiZSB3aXRob3V0IHBheWxvYWQuIik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVVwZGF0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJRWl0aGVyPEFjdGlvblN0YXR1cywgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQXJ0aWZhY3RUeXBlID0gdmFsaWRhdGVBcnRpZmFjdFR5cGUodXNlci5nZXRVc2VySWQoKSwgYXJ0aWZhY3RJbmZvLCBwYXJlbnRUeXBlKTsKKwkJCWlmICh2YWxpZGF0ZUFydGlmYWN0VHlwZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQXJ0aWZhY3RUeXBlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFwaVVybCgpICE9IG51bGwpIHsKKwkJCQlhcnRpZmFjdEluZm8uc2V0QXBpVXJsKG51bGwpOworCQkJCWxvZy5lcnJvcigiQXJ0aWZhY3QgVVJMIGNhbm5vdCBiZSBzZXQgdGhyb3VnaCB0aGlzIEFQSSAtIGlnbm9yaW5nIik7CisJCQl9CisKKwkJCWlmIChhcnRpZmFjdEluZm8uZ2V0U2VydmljZUFwaSgpICE9IG51bGwpIHsKKwkJCQlpZiAoYXJ0aWZhY3RJbmZvLmdldFNlcnZpY2VBcGkoKSkgeworCQkJCQlhcnRpZmFjdEluZm8uc2V0U2VydmljZUFwaShmYWxzZSk7CisJCQkJCWxvZy5lcnJvcigiQXJ0aWZhY3Qgc2VydmljZSBBUEkgZmxhZyBjYW5ub3QgYmUgY2hhbmdlZCAtIGlnbm9yaW5nIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGFydGlmYWN0SW5mbyk7CisJfQorCisJcHJpdmF0ZSBOb2RlVHlwZUVudW0gY29udmVydFBhcmVudFR5cGUoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCQlpZiAoY29tcG9uZW50VHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSB7CisJCQlyZXR1cm4gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCQl9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGUuZXF1YWxzKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX0lOU1RBTkNFKSkgeworCQkJcmV0dXJuIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIE5vZGVUeXBlRW51bS5TZXJ2aWNlOworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlRGVsZXRlKFN0cmluZyBwYXJlbnRJZCwgU3RyaW5nIGFydGlmYWN0SWQsIFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgcGFyZW50LAorCQkJU3RyaW5nIGludGVyZmFjZVR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlOb2RlVHlwZUVudW0gcGFyZW50VHlwZSA9IGNvbnZlcnRQYXJlbnRUeXBlKGNvbXBvbmVudFR5cGUpOworCQkvLyBsb2NrIHJlc291cmNlCisJCWlmIChzaG91bGRMb2NrKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KHBhcmVudCwgIkRlbGV0ZSBBcnRpZmFjdCAtIGxvY2sgcmVzb3VyY2U6ICIpOworCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpLCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wID0gbnVsbDsKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiBpbnNpZGVFaXRoZXIgPSBudWxsOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gbnVsbDsKKwkJYm9vbGVhbiBpc0xlZnQgPSBmYWxzZTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IG51bGw7CisJCUludGVnZXIgYXJ0aWZhY3RQYXJlbnRzQ291bnQgPSAxOworCQl0cnkgeworCQkJaWYgKGludGVyZmFjZVR5cGUgIT0gbnVsbCAmJiBvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlRyeSB0byBkZWxldGUgaW50ZWZhY2UgbGlmZWN5Y2xlIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3RJZCk7CisKKwkJCQlFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBpbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24uZGVsZXRlSW50ZXJmYWNlT3BlcmF0aW9uKHBhcmVudElkLCBpbnRlcmZhY2VUeXBlLCBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRPcGVyYXRpb25CeUludGVyZmFjZVVuaXF1ZUlkKHBhcmVudElkLCBpbnRlcmZhY2VUeXBlLCBvcGVyYXRpb25OYW1lKSwKKwkJCQkJCWluVHJhbnNhY3Rpb24pOworCQkJCWlzTGVmdCA9IHJlc3VsdC5pc0xlZnQoKTsKKwkJCQlpZiAoaXNMZWZ0KSB7CisJCQkJCWFydGlmYWN0RGVmaW5pdGlvbiA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXRJbXBsZW1lbnRhdGlvbigpOworCQkJCQlpbnNpZGVFaXRoZXIgPSBFaXRoZXIucmlnaHQocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiVHJ5IHRvIGRlbGV0ZSBhcnRpZmFjdCwgZ2V0IHBhcmVudHMge30iLCBhcnRpZmFjdElkKTsKKworCQkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnRzT2ZBcnRpZmFjdCA9IGFydGlmYWN0T3BlcmF0aW9uLmdldFBhcmVudHNPZkFydGlmYWN0KGFydGlmYWN0SWQsIHBhcmVudFR5cGUpOworCQkJCWlmIChwYXJlbnRzT2ZBcnRpZmFjdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGVudHJ5IG9uIGdyYXBoIGZvciBhcnRpZmFjdCB7fSIsIGFydGlmYWN0SWQpOworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5QXJ0aWZhY3RJZChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocGFyZW50c09mQXJ0aWZhY3QucmlnaHQoKS52YWx1ZSgpKSwgIiIpOworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJfSBlbHNlIHsKKworCQkJCQlhcnRpZmFjdFBhcmVudHNDb3VudCA9IHBhcmVudHNPZkFydGlmYWN0LmxlZnQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIk51bWJlciBvZiBwYXJlbnRzIG5vZGVzIG9uIGdyYXBoIGZvciBhcnRpZmFjdCB7fSBpcyB7fSIsIGFydGlmYWN0SWQsIGFydGlmYWN0UGFyZW50c0NvdW50KTsKKworCQkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKHBhcmVudElkLCBhcnRpZmFjdElkLCBwYXJlbnRUeXBlLCBmYWxzZSwgdHJ1ZSk7CisJCQkJCWlzTGVmdCA9IHJlc3VsdC5pc0xlZnQoKTsKKwkJCQkJaWYgKGlzTGVmdCkgeworCQkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCByZW1vdmVkIGZyb20gZ3JhcGgge30iLCBhcnRpZmFjdElkKTsKKworCQkJCQkJYXJ0aWZhY3REZWZpbml0aW9uID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCQkJaW5zaWRlRWl0aGVyID0gRWl0aGVyLmxlZnQocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVycm9yID0gcmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCWlmIChpc0xlZnQpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUlmTm90T25HcmFwaCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJaWYgKGFydGlmYWN0UGFyZW50c0NvdW50IDwgMikgeworCQkJCQlsb2cuZGVidWcoIk51bWJlciBvZiBwYXJlbnQgbm9kZXMgaXMgMS4gTmVlZCB0byBkZWxldGUgZnJvbSBFUyB7fSIsIGFydGlmYWN0SWQpOworCQkJCQlkZWxldGVJZk5vdE9uR3JhcGggPSBkZWxldGVJZk5vdE9uR3JhcGgoYXJ0aWZhY3RJZCwgYXJ0aWZhY3REZWZpbml0aW9uLmdldEVzSWQoKSwgdHJ1ZSk7CisJCQkJfQorCQkJCWlmIChkZWxldGVJZk5vdE9uR3JhcGguZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0TWFuZGF0b3J5KCkgfHwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFNlcnZpY2VBcGkoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCBpcyBtYW5kYXRvcnkgb3Igc2VydmljZSBBUEkuIENsZWFuIGFsbCBmaWVsZHMgZm9yIHt9IiwgYXJ0aWZhY3RJZCk7CisJCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0RXNJZCgiIik7CisJCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0QXJ0aWZhY3ROYW1lKCIiKTsKKwkJCQkJCWFydGlmYWN0RGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbigiIik7CisJCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0QXBpVXJsKCIiKTsKKwkJCQkJCWFydGlmYWN0RGVmaW5pdGlvbi5zZXRBcnRpZmFjdENoZWNrc3VtKCIiKTsKKwkJCQkJCXNldERlZmF1bHRBcnRpZmFjdFRpbWVvdXQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0R3JvdXBUeXBlKCksIGFydGlmYWN0RGVmaW5pdGlvbik7CisJCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0QXJ0aWZhY3RVVUlEKCIiKTsKKwkJCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCQkJYXJ0aWZhY3REZWZpbml0aW9uLnNldFBheWxvYWRVcGRhdGVEYXRlKHRpbWUpOworCQkJCQkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEhlYXRQYXJhbWV0ZXJzKG51bGwpOworCQkJCQkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEhlYXRQYXJhbXNVcGRhdGVEYXRlKG51bGwpOworCQkJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzU3RhdHVzID0gbnVsbDsKKwkJCQkJCWlmIChhcnRpZmFjdFBhcmVudHNDb3VudCA8IDIpIHsKKwkJCQkJCQlsb2cuZGVidWcoIk9ubHkgb25lIHBhcmVudCAsIGNsZWFuIGV4aXN0aW5nIHBsYWNlaG9sZGVyIGZvciB7fSIsIGFydGlmYWN0SWQpOworCQkJCQkJCXJlc1N0YXR1cyA9IGFydGlmYWN0T3BlcmF0aW9uLnVwZGF0ZUFyaWZhY3RPblJlc291cmNlKGFydGlmYWN0RGVmaW5pdGlvbiwgcGFyZW50SWQsIGFydGlmYWN0SWQsIHBhcmVudFR5cGUsIHRydWUpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlsb2cuZGVidWcoIm1vcmUgdGhhbiBvbmUgcGFyZW50ICwgY3JlYXRlIG5ldyBwbGFjZWhvbGRlciBmb3Ige30iLCBhcnRpZmFjdElkKTsKKwkJCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0VW5pcXVlSWQobnVsbCk7CisJCQkJCQkJcmVzU3RhdHVzID0gYXJ0aWZhY3RPcGVyYXRpb24uYWRkQXJpZmFjdFRvQ29tcG9uZW50KGFydGlmYWN0RGVmaW5pdGlvbiwgcGFyZW50SWQsIHBhcmVudFR5cGUsIHRydWUsIHRydWUpOworCQkJCQkJfQorCQkJCQkJaWYgKHJlc1N0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjbGVhbiBwbGFjZWhvbGRlciBmb3Ige30iLCBhcnRpZmFjdElkKTsKKwkJCQkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5QXJ0aWZhY3RJZChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSksIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpOworCQkJCQkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbG9nLmRlYnVnKCJQbGFjZWhvbGRlciB3YXMgY2xlYW5lZCBmb3Ige30iLCBhcnRpZmFjdElkKTsKKworCQkJCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdFVmdGVyQ2hhbmdlID0gcmVzU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCQkJCQkJaW5zaWRlRWl0aGVyID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3RVZnRlckNoYW5nZSk7CisJCQkJCQkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdChpbnNpZGVFaXRoZXIpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCBpc24ndCBtYW5kYXRvcnkvc2VydmljZSBBUEkuIFJlbW92ZWQuIHt9IiwgYXJ0aWZhY3RJZCk7CisJCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5sZWZ0KGluc2lkZUVpdGhlcik7CisJCQkJCX0KKworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSBhcnRpZmFjdCBmcm9tIEVTIHt9IHN0YXR1cyB7fSIsIGFydGlmYWN0SWQsIGRlbGV0ZUlmTm90T25HcmFwaCk7CisJCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlBcnRpZmFjdElkKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShkZWxldGVJZk5vdE9uR3JhcGgpLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKTsKKwkJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGVudHJ5IG9uIGdyYXBoIGZvciBhcnRpZmFjdCB7fSIsIGFydGlmYWN0SWQpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlBcnRpZmFjdElkKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShlcnJvciksICIiKTsKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnRJZCwgdXNlciwgYXJ0aWZhY3REZWZpbml0aW9uLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisJCX0gZmluYWxseSB7CisJCQlpZiAoc2hvdWxkTG9jaykgeworCQkJCXVubG9ja0NvbXBvbmVudChyZXN1bHRPcCwgcGFyZW50LCBpblRyYW5zYWN0aW9uKTsKKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZURvd25sb2FkKFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGFydGlmYWN0SWQsIFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLAorCQkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IHBhcmVudCwgYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RCeUlkID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RCeUlkKGFydGlmYWN0SWQsIGZhbHNlKTsKKwkJaWYgKGFydGlmYWN0QnlJZC5pc1JpZ2h0KCkpIHsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoYXJ0aWZhY3RCeUlkLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoIkVycm9yIHdoZW4gZ2V0dGluZyBhcnRpZmFjdCBpbmZvIGJ5IGlke30sIGVycm9yOiB7fSIsIGFydGlmYWN0SWQsIGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUFydGlmYWN0SWQoYWN0aW9uU3RhdHVzLCAiIik7CisJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBjb21wb25lbnRJZCwgdXNlciwgbnVsbCwgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGFydGlmYWN0QnlJZC5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGFydGlmYWN0RGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkVtcHR5IGFydGlmYWN0IGRlZmluaXRpb24gcmV0dXJuZWQgZnJvbSBEQiBieSBhcnRpZmFjdCBpZCB7fSIsIGFydGlmYWN0SWQpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORCwgIiIpOworCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgY29tcG9uZW50SWQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4gaW5zaWRlRWl0aGVyID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgY29tcG9uZW50SWQsIHVzZXIsIGFydGlmYWN0RGVmaW5pdGlvbiwgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW5zaWRlRWl0aGVyKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBmZXRjaEN1cnJlbnRBcnRpZmFjdChBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBhcnRpZmFjdElkKSB7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0QnlJZCA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0QnlJZChhcnRpZmFjdElkLCB0cnVlKTsKKwkJaWYgKCFvcGVyYXRpb24uZXF1YWxzKEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZSkgJiYgYXJ0aWZhY3RCeUlkLmlzUmlnaHQoKSkgeworCQkJLy8gaW4gY2FzZSBvZiB1cGRhdGUgYXJ0aWZhY3QgbXVzdCBiZQorCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlQXJ0aWZhY3RNaXNzaW5nRXJyb3IsICJBcnRpZmFjdCBVcGRhdGUgLyBVcGxvYWQiLCBhcnRpZmFjdElkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUFydGlmYWN0TWlzc2luZ0Vycm9yKCJBcnRpZmFjdCBVcGRhdGUgLyBVcGxvYWQiLCBhcnRpZmFjdElkKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGFydGlmYWN0IHt9LiBlcnJvcjoge30iLCBhcnRpZmFjdElkLCBhcnRpZmFjdEJ5SWQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShhcnRpZmFjdEJ5SWQucmlnaHQoKS52YWx1ZSgpKSwgYXJ0aWZhY3RJZCkpOworCQl9CisJCWlmIChvcGVyYXRpb24uZXF1YWxzKEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZSkgJiYgYXJ0aWZhY3RCeUlkLmlzTGVmdCgpKSB7CisJCQlsb2cuZGVidWcoIkFydGlmYWN0IHt9IGFscmVhZHkgZXhpc3QiLCBhcnRpZmFjdElkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9FWElTVCwgYXJ0aWZhY3RCeUlkLmxlZnQoKS52YWx1ZSgpLmdldEFydGlmYWN0TGFiZWwoKSkpOworCQl9CisJCUFydGlmYWN0RGVmaW5pdGlvbiBjdXJyZW50QXJ0aWZhY3RJbmZvID0gbnVsbDsKKwkJaWYgKGFydGlmYWN0QnlJZC5pc0xlZnQoKSkgeworCQkJLy8gZ2V0IHByZXZpb3VzIHZhbHVlCisJCQljdXJyZW50QXJ0aWZhY3RJbmZvID0gYXJ0aWZhY3RCeUlkLmxlZnQoKS52YWx1ZSgpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjdXJyZW50QXJ0aWZhY3RJbmZvKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVBcnRpZmFjdExhYmVsKFN0cmluZyBjb21wb25lbnRJZCwgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgYXJ0aWZhY3RJZCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyBvcGVyYXRpb25OYW1lLAorCQkJQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJlbnRBcnRpZmFjdEluZm8sIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9IGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCk7CisKKwkJaWYgKG9wZXJhdGlvbk5hbWUgPT0gbnVsbCAmJiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSA9PSBudWxsIHx8IGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkuaXNFbXB0eSgpKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlTWlzc2luZ0FydGlmYWN0SW5mb3JtYXRpb25FcnJvciwgIkFydGlmYWN0IFVwZGF0ZSAvIFVwbG9hZCIsICJhcnRpZmFjdExhYmVsIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVNaXNzaW5nQXJ0aWZhY3RJbmZvcm1hdGlvbkVycm9yKCJBcnRpZmFjdCBVcGRhdGUgLyBVcGxvYWQiLCAiYXJ0aWZhY3RMYWJlbCIpOworCQkJbG9nLmRlYnVnKCJtaXNzaW5nIGFydGlmYWN0IGxvZ2ljYWwgbmFtZSBmb3IgY29tcG9uZW50IHt9IiwgY29tcG9uZW50SWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQSwgQVJUSUZBQ1RfTEFCRUwpKTsKKwkJfQorCQlpZiAob3BlcmF0aW9uLmVxdWFscyhBcnRpZmFjdE9wZXJhdGlvbi5DcmVhdGUpICYmICFhcnRpZmFjdEluZm8uZ2V0TWFuZGF0b3J5KCkpIHsKKworCQkJaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgeworCQkJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpICE9IG51bGwgJiYgIW9wZXJhdGlvbk5hbWUuZXF1YWxzKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkpKSB7CisJCQkJCWxvZy5kZWJ1ZygiYXJ0aWZhY3QgbGFiZWwgY2Fubm90IGJlIHNldCB7fSIsIGFydGlmYWN0TGFiZWwpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTE9HSUNBTF9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXJ0aWZhY3RMYWJlbCA9IG9wZXJhdGlvbk5hbWU7CisJCQkJfQorCQkJfQorCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKTsKKwkJCWlmIChkaXNwbGF5TmFtZSA9PSBudWxsIHx8IGRpc3BsYXlOYW1lLmlzRW1wdHkoKSkKKwkJCQlkaXNwbGF5TmFtZSA9IGFydGlmYWN0TGFiZWw7CisJCQlkaXNwbGF5TmFtZSA9IFZhbGlkYXRpb25VdGlscy5jbGVhbkFydGlmYWN0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOworCQkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOworCisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0TGFiZWwoYXJ0aWZhY3RMYWJlbCkpIHsKKwkJCQlsb2cuZGVidWcoIkludmFsaWQgZm9ybWF0IGZvcm0gQXJ0aWZhY3QgbGFiZWwgOiB7fSIsIGFydGlmYWN0TGFiZWwpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJCX0KKwkJCWFydGlmYWN0TGFiZWwgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQXJ0aWZhY3RMYWJlbChhcnRpZmFjdExhYmVsKTsKKworCQkJaWYgKGFydGlmYWN0TGFiZWwuaXNFbXB0eSgpKSB7CisJCQkJbG9nLmRlYnVnKCJtaXNzaW5nIG5vcm1hbGl6ZWQgYXJ0aWZhY3QgbG9naWNhbCBuYW1lIGZvciBjb21wb25lbnQge30iLCBjb21wb25lbnRJZCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQSwgQVJUSUZBQ1RfTEFCRUwpKTsKKwkJCX0KKworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdExhYmVsTGVuZ3RoKGFydGlmYWN0TGFiZWwpKSB7CisJCQkJbG9nLmRlYnVnKCJJbnZhbGlkIGxlbmdodCBmb3JtIEFydGlmYWN0IGxhYmVsIDoge30iLCBhcnRpZmFjdExhYmVsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuRVhDRUVEU19MSU1JVCwgQVJUSUZBQ1RfTEFCRUwsIFN0cmluZy52YWx1ZU9mKFZhbGlkYXRpb25VdGlscy5BUlRJRkFDVF9MQUJFTF9MRU5HVEgpKSk7CisJCQl9CisJCQlpZiAoIXZhbGlkYXRlTGFiZWxVbmlxdWVuZXNzKGNvbXBvbmVudElkLCBhcnRpZmFjdExhYmVsLCBjb21wb25lbnRUeXBlLCBpblRyYW5zYWN0aW9uKSkgeworCQkJCWxvZy5kZWJ1ZygiTm9uIHVuaXF1ZSBBcnRpZmFjdCBsYWJlbCA6IHt9IiwgYXJ0aWZhY3RMYWJlbCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX0VYSVNULCBhcnRpZmFjdExhYmVsKSk7CisJCQl9CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0TGFiZWwoYXJ0aWZhY3RMYWJlbCk7CisKKwkJaWYgKGN1cnJlbnRBcnRpZmFjdEluZm8gIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkuZXF1YWxzKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkpKSB7CisJCQlsb2cuaW5mbygiTG9naWNhbCBhcnRpZmFjdCdzIG5hbWUgY2Fubm90IGJlIGNoYW5nZWQge30iLCBhcnRpZmFjdElkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9MT0dJQ0FMX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoQWN0aW9uU3RhdHVzLk9LKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVMYWJlbFVuaXF1ZW5lc3MoU3RyaW5nIHBhcmVudElkLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCWJvb2xlYW4gaXNVbmlxdWUgPSB0cnVlOworCQlOb2RlVHlwZUVudW0gcGFyZW50VHlwZTsKKwkJaWYgKGNvbXBvbmVudFR5cGUuZXF1YWxzKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSkgeworCQkJcGFyZW50VHlwZSA9IE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwkJfSBlbHNlIHsKKwkJCXBhcmVudFR5cGUgPSBOb2RlVHlwZUVudW0uU2VydmljZTsKKwkJfQorCQlFaXRoZXI8TWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RzID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RzKHBhcmVudElkLCBwYXJlbnRUeXBlLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGFydGlmYWN0cy5pc0xlZnQoKSkgeworCQkJZm9yIChTdHJpbmcgbGFiZWwgOiBhcnRpZmFjdHMubGVmdCgpLnZhbHVlKCkua2V5U2V0KCkpIHsKKwkJCQlpZiAobGFiZWwuZXF1YWxzKGFydGlmYWN0TGFiZWwpKSB7CisJCQkJCWlzVW5pcXVlID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoY29tcG9uZW50VHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSB7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFsbEludGVyZmFjZXNPZlJlc291cmNlID0gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmdldEFsbEludGVyZmFjZXNPZlJlc291cmNlKHBhcmVudElkLCB0cnVlLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmIChhbGxJbnRlcmZhY2VzT2ZSZXNvdXJjZS5pc0xlZnQoKSkgeworCQkJCWZvciAoSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmFjZSA6IGFsbEludGVyZmFjZXNPZlJlc291cmNlLmxlZnQoKS52YWx1ZSgpLnZhbHVlcygpKSB7CisJCQkJCWZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IGludGVyYWNlLmdldE9wZXJhdGlvbnMoKS52YWx1ZXMoKSkgeworCQkJCQkJaWYgKG9wZXJhdGlvbi5nZXRJbXBsZW1lbnRhdGlvbigpICE9IG51bGwgJiYgb3BlcmF0aW9uLmdldEltcGxlbWVudGF0aW9uKCkuZ2V0QXJ0aWZhY3RMYWJlbCgpLmVxdWFscyhhcnRpZmFjdExhYmVsKSkgeworCQkJCQkJCWlzVW5pcXVlID0gZmFsc2U7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGlzVW5pcXVlOworCX0KKworCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJcHJpdmF0ZSBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUFydGlmYWN0KG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBwYXJlbnQsIFN0cmluZyBwYXJlbnRJZCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgYnl0ZVtdIGRlY29kZWRQYXlsb2FkLCBVc2VyIHVzZXIsCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uRW51bSwgU3RyaW5nIGludGVyZmFjZVR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lKSB7CisKKwkJRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gY3JlYXRlRXNBcnRpZmFjdERhdGEoYXJ0aWZhY3RJbmZvLCBkZWNvZGVkUGF5bG9hZCk7CisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+IGluc2lkZUVpdGhlciA9IG51bGw7CisKKwkJaWYgKGFydGlmYWN0RGF0YSA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwgIlVwbG9hZCBBcnRpZmFjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIlVwbG9hZCBBcnRpZmFjdCIpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGFydGlmYWN0IG9iamVjdCBmb3IgRVMuIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbkVudW0sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIGFydGlmYWN0SW5mbywgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGVFbnVtLCBudWxsKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJldHVybiByZXN1bHRPcDsKKworCQl9CisJCS8vIHNldCBvbiBncmFwaCBvYmplY3QgaWQgb2YgYXJ0aWZhY3QgaW4gRVMhCisJCWFydGlmYWN0SW5mby5zZXRFc0lkKGFydGlmYWN0RGF0YS5nZXRJZCgpKTsKKworCQlib29sZWFuIGlzTGVmdCA9IGZhbHNlOworCQlTdHJpbmcgYXJ0aWZhY3RVbmlxdWVJZCA9IG51bGw7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBudWxsOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gbnVsbDsKKwkJaWYgKGludGVyZmFjZVR5cGUgIT0gbnVsbCAmJiBvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKKwkJCS8vIGxpZmVjeWNsZSBhcnRpZmFjdAorCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGNvbnZlcnRUb09wZXJhdGlvbihhcnRpZmFjdEluZm8sIG9wZXJhdGlvbk5hbWUpOworCisJCQlFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBpbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24udXBkYXRlSW50ZXJmYWNlT3BlcmF0aW9uKHBhcmVudElkLCBpbnRlcmZhY2VUeXBlLCBvcGVyYXRpb25OYW1lLCBvcGVyYXRpb24pOworCisJCQlpc0xlZnQgPSByZXN1bHQuaXNMZWZ0KCk7CisJCQlpZiAoaXNMZWZ0KSB7CisJCQkJYXJ0aWZhY3RVbmlxdWVJZCA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXRJbXBsZW1lbnRhdGlvbigpLmdldFVuaXF1ZUlkKCk7CisJCQkJYXJ0aWZhY3REZWZpbml0aW9uID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldEltcGxlbWVudGF0aW9uKCk7CisKKwkJCQlpbnNpZGVFaXRoZXIgPSBFaXRoZXIucmlnaHQocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5sZWZ0KGluc2lkZUVpdGhlcik7CisJCQl9IGVsc2UgeworCQkJCWVycm9yID0gcmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGluZm9ybWF0aW9uL2RlcGxveW1lbnQvYXBpIGFyaXRmYWN0cworCQkJbG9nLmRlYnVnKCJUcnkgdG8gY3JlYXRlIGVudHJ5IG9uIGdyYXBoIik7CisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUgPSBjb252ZXJ0UGFyZW50VHlwZShjb21wb25lbnRUeXBlRW51bSk7CisJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBhcnRpZmFjdE9wZXJhdGlvbi5hZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3RJbmZvLCBwYXJlbnRJZCwgbm9kZVR5cGUsIHRydWUsIHRydWUpOworCisJCQlpc0xlZnQgPSByZXN1bHQuaXNMZWZ0KCk7CisJCQlpZiAoaXNMZWZ0KSB7CisJCQkJYXJ0aWZhY3RVbmlxdWVJZCA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCQkJCWFydGlmYWN0RGVmaW5pdGlvbiA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCWluc2lkZUVpdGhlciA9IEVpdGhlci5sZWZ0KHJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdChpbnNpZGVFaXRoZXIpOworCQkJfSBlbHNlIHsKKwkJCQllcnJvciA9IHJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQl9CisJCX0KKwkJaWYgKGlzTGVmdCkgeworCQkJYm9vbGVhbiByZXMgPSBzYXZlQXJ0aWZhY3RzKGFydGlmYWN0RGF0YSwgcGFyZW50SWQsIGZhbHNlKTsKKwkJCS8vIFN0cmluZyB1bmlxdWVJZCA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCisJCQlpZiAocmVzKSB7CisJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCBzYXZlZCBpbnRvIEVTIC0ge30iLCBhcnRpZmFjdFVuaXF1ZUlkKTsKKworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb25FbnVtLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBhcnRpZmFjdEluZm8sIGFydGlmYWN0VW5pcXVlSWQsIGFydGlmYWN0VW5pcXVlSWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlRW51bSwgbnVsbCk7CisJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJfSBlbHNlIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwgIlVwbG9hZCBBcnRpZmFjdCIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJVcGxvYWQgQXJ0aWZhY3QiKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBzYXZlIHRoZSBhcnRpZmFjdC4iKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb25FbnVtLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBhcnRpZmFjdEluZm8sIG51bGwsIGFydGlmYWN0VW5pcXVlSWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlRW51bSwgbnVsbCk7CisKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGVudHJ5IG9uIGdyYXBoIGZvciBhcnRpZmFjdCB7fSIsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5QXJ0aWZhY3RJZChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZXJyb3IpLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uRW51bSwgcGFyZW50LCBwYXJlbnRJZCwgdXNlciwgYXJ0aWZhY3RJbmZvLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZUVudW0sIG51bGwpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXBsb3ltZW50QXJ0aWZhY3QoQ29tcG9uZW50IHBhcmVudENvbXBvbmVudCwgU3RyaW5nIHBhcmVudElkLCBTdHJpbmcgdXNlcklkLCBib29sZWFuIGlzQ3JlYXRlLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBBcnRpZmFjdERlZmluaXRpb24gY3VycmVudEFydGlmYWN0LCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSkgeworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCVdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlV3JhcHBlciA9IG5ldyBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PigpOworCisJCXZhbGlkYXRlQXJ0aWZhY3RUeXBlRXhpc3RzKHJlc3BvbnNlV3JhcHBlciwgYXJ0aWZhY3RJbmZvKTsKKworCQlBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uZmluZFR5cGUoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpKTsKKworCQlNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiByZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMgPSBmaWxsRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmYocGFyZW50VHlwZSk7CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlRGVwbG95bWVudEFydGlmYWN0Q29uZihhcnRpZmFjdEluZm8sIHJlc3BvbnNlV3JhcHBlciwgYXJ0aWZhY3RUeXBlLCByZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMpOworCQl9CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCS8vIENvbW1vbiBjb2RlIGZvciBhbGwgdHlwZXMKKwkJCS8vIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBhcnRpZmFjdFR5cGUKKwkJCWlmICghaXNDcmVhdGUpIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU2VydmljZUFwaVR5cGUgPSB2YWxpZGF0ZUFydGlmYWN0VHlwZU5vdENoYW5nZWQoYXJ0aWZhY3RJbmZvLCBjdXJyZW50QXJ0aWZhY3QpOworCQkJCWlmICh2YWxpZGF0ZVNlcnZpY2VBcGlUeXBlLmlzUmlnaHQoKSkgeworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHZhbGlkYXRlU2VydmljZUFwaVR5cGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWlmIChwYXJlbnRUeXBlLmVxdWFscyhOb2RlVHlwZUVudW0uUmVzb3VyY2UpKSB7CisJCQkJLy8gaWYgKHBhcmVudENvbXBvbmVudCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHBhcmVudENvbXBvbmVudDsKKwkJCQlSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSA9IHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpOworCQkJCURlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWcgY29uZmlnID0gcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzLmdldChhcnRpZmFjdFR5cGUuZ2V0VHlwZSgpKTsKKwkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChSZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVELCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlMaXN0PFN0cmluZz4gbXlMaXN0ID0gY29uZmlnLmdldFZhbGlkRm9yUmVzb3VyY2VUeXBlcygpOworCQkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlciA9IHZhbGlkYXRlUmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSwgYXJ0aWZhY3RJbmZvLCBteUxpc3QpOworCQkJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVGaWxlRXh0ZW5zaW9uKHJlc3BvbnNlV3JhcHBlciwgKCkgLT4gZ2V0RGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZyhwYXJlbnRUeXBlLCBhcnRpZmFjdFR5cGUpLCBhcnRpZmFjdEluZm8sIHBhcmVudFR5cGUsIGFydGlmYWN0VHlwZSk7CisJCX0KKworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSAmJiAhTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UuZXF1YWxzKHBhcmVudFR5cGUpKSB7CisJCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpOworCQkJaWYgKGlzQ3JlYXRlIHx8ICFhcnRpZmFjdE5hbWUuZXF1YWxzSWdub3JlQ2FzZShjdXJyZW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpKSB7CisJCQkJdmFsaWRhdGVTaW5nbGVEZXBsb3ltZW50QXJ0aWZhY3ROYW1lKHJlc3BvbnNlV3JhcHBlciwgYXJ0aWZhY3ROYW1lLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFR5cGUpOworCQkJfQorCQl9CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXN3aXRjaCAoYXJ0aWZhY3RUeXBlKSB7CisJCQljYXNlIEhFQVQ6CisJCQljYXNlIEhFQVRfVk9MOgorCQkJY2FzZSBIRUFUX05FVDogeworCQkJCXJlc3VsdCA9IHZhbGlkYXRlSGVhdERlcGxveW1lbnRBcnRpZmFjdChwYXJlbnRDb21wb25lbnQsIHVzZXJJZCwgaXNDcmVhdGUsIGFydGlmYWN0SW5mbywgY3VycmVudEFydGlmYWN0LCBwYXJlbnRUeXBlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgSEVBVF9FTlY6IHsKKwkJCQlyZXN1bHQgPSB2YWxpZGF0ZUhlYXRFbnZEZXBsb3ltZW50QXJ0aWZhY3QocGFyZW50Q29tcG9uZW50LCBwYXJlbnRJZCwgdXNlcklkLCBpc0NyZWF0ZSwgYXJ0aWZhY3RJbmZvLCBwYXJlbnRUeXBlKTsKKwkJCQlhcnRpZmFjdEluZm8uc2V0VGltZW91dChOT05fSEVBVF9USU1FT1VUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgRENBRV9JTlZFTlRPUllfVE9TQ0E6CisJCQljYXNlIERDQUVfSU5WRU5UT1JZX0pTT046CisJCQljYXNlIERDQUVfSU5WRU5UT1JZX1BPTElDWToKKwkJCQkvLyBWYWxpZGF0aW9uIGlzIGRvbmUgaW4gaGFuZGxlIHBheWxvYWQuCisJCQljYXNlIERDQUVfSU5WRU5UT1JZX0RPQzoKKwkJCWNhc2UgRENBRV9JTlZFTlRPUllfQkxVRVBSSU5UOgorCQkJY2FzZSBEQ0FFX0lOVkVOVE9SWV9FVkVOVDoKKwkJCQkvLyBObyBzcGVjaWZpYyB2YWxpZGF0aW9uCisJCQlkZWZhdWx0OiB7CisJCQkJYXJ0aWZhY3RJbmZvLnNldFRpbWVvdXQoTk9OX0hFQVRfVElNRU9VVCk7CisJCQl9CisJCQl9CisKKwkJfQorCisJCWlmICghcmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVEZXBsb3ltZW50QXJ0aWZhY3RDb25mKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlV3JhcHBlciwgQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUsIE1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+IHJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cykgeworCQlpZiAoKHJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cyA9PSBudWxsKSB8fCAhcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzLmNvbnRhaW5zS2V5KGFydGlmYWN0VHlwZS5uYW1lKCkpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IFJlc3BvbnNlRm9ybWF0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlRm9ybWF0KTsKKwkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3QgVHlwZToge30gTm90IGZvdW5kICEiLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiBmaWxsRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmYoTm9kZVR5cGVFbnVtIHBhcmVudFR5cGUpIHsKKwkJTWFwPFN0cmluZywgRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZz4gcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzID0gbnVsbDsKKwkJaWYgKHBhcmVudFR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSkpIHsKKwkJCXJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cygpOworCQl9IGVsc2UgaWYgKHBhcmVudFR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSkgeworCQkJcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UmVzb3VyY2VJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJfSBlbHNlIHsKKwkJCXJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCX0KKwkJcmV0dXJuIHJlc291cmNlRGVwbG95bWVudEFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUFydGlmYWN0VHlwZUV4aXN0cyhXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZVdyYXBwZXIsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8pIHsKKwkJQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLmZpbmRUeXBlKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCWlmIChhcnRpZmFjdFR5cGUgPT0gbnVsbCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBSZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlRm9ybWF0KTsKKwkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3QgVHlwZToge30gTm90IGZvdW5kICEiLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnIGdldERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWcoTm9kZVR5cGVFbnVtIHBhcmVudFR5cGUsIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlKSB7CisJCURlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWcgcmV0Q29uZmlnID0gbnVsbDsKKwkJU3RyaW5nIGZpbGVUeXBlID0gYXJ0aWZhY3RUeXBlLmdldFR5cGUoKTsKKwkJaWYgKHBhcmVudFR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSkpIHsKKwkJCXJldENvbmZpZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cygpLmdldChmaWxlVHlwZSk7CisJCX0gZWxzZSBpZiAocGFyZW50VHlwZS5lcXVhbHMoTm9kZVR5cGVFbnVtLlNlcnZpY2UpKSB7CisJCQlyZXRDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0cygpLmdldChmaWxlVHlwZSk7CisJCX0gZWxzZSBpZiAocGFyZW50VHlwZS5lcXVhbHMoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpKSB7CisJCQlyZXRDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRSZXNvdXJjZUluc3RhbmNlRGVwbG95bWVudEFydGlmYWN0cygpLmdldChmaWxlVHlwZSk7CisJCX0KKwkJcmV0dXJuIHJldENvbmZpZzsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZXh0cmFjdEhlYXRQYXJhbWV0ZXJzKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8pIHsKKwkJLy8gZXh0cmFjdCBoZWF0IHBhcmFtZXRlcnMKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRQYXlsb2FkRGF0YSgpICE9IG51bGwpIHsKKwkJCVN0cmluZyBoZWF0RGVjb2RlZFBheWxvYWQgPSBHZW5lcmFsVXRpbGl0eS5pc0Jhc2U2NEVuY29kZWQoYXJ0aWZhY3RJbmZvLmdldFBheWxvYWREYXRhKCkpID8gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlQmFzZTY0KGFydGlmYWN0SW5mby5nZXRQYXlsb2FkRGF0YSgpKSkgOiBuZXcgU3RyaW5nKGFydGlmYWN0SW5mby5nZXRQYXlsb2FkRGF0YSgpKTsKKwkJCUVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gaGVhdFBhcmFtZXRlcnMgPSBJbXBvcnRVdGlscy5nZXRIZWF0UGFyYW1zV2l0aG91dEltcGxpY2l0VHlwZXMoaGVhdERlY29kZWRQYXlsb2FkLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQkJaWYgKGhlYXRQYXJhbWV0ZXJzLmlzUmlnaHQoKSAmJiAoIWhlYXRQYXJhbWV0ZXJzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoUmVzdWx0U3RhdHVzRW51bS5FTEVNRU5UX05PVF9GT1VORCkpKSB7CisJCQkJbG9nLmluZm8oImZhaWxlZCB0byBwYXJzZSBoZWF0IHBhcmFtZXRlcnMgIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfREVQTE9ZTUVOVF9BUlRJRkFDVF9IRUFULCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfSBlbHNlIGlmIChoZWF0UGFyYW1ldGVycy5pc0xlZnQoKSAmJiBoZWF0UGFyYW1ldGVycy5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKSB7CisJCQkJYXJ0aWZhY3RJbmZvLnNldEhlYXRQYXJhbWV0ZXJzKGhlYXRQYXJhbWV0ZXJzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisKKwl9CisKKwkvLyBWYWxpZCBleHRlbnNpb24KKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbGVFeHRlbnNpb24oV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2VXcmFwcGVyLCBJRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZ0dldHRlciBkZXBsb3ltZW50Q29uZmlnR2V0dGVyLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSwgQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUpIHsKKwkJU3RyaW5nIGZpbGVUeXBlID0gYXJ0aWZhY3RUeXBlLmdldFR5cGUoKTsKKwkJTGlzdDxTdHJpbmc+IGFjY2VwdGVkVHlwZXMgPSBudWxsOworCQlEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnIGRlcGxveW1lbnRBY2NlcHRlZFR5cGVzID0gZGVwbG95bWVudENvbmZpZ0dldHRlci5nZXREZXBsb3ltZW50QXJ0aWZhY3RDb25maWcoKTsKKwkJaWYgKCFwYXJlbnRUeXBlLmVxdWFscyhOb2RlVHlwZUVudW0uUmVzb3VyY2UpICYmICFwYXJlbnRUeXBlLmVxdWFscyhOb2RlVHlwZUVudW0uU2VydmljZSkgJiYgIXBhcmVudFR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSkgeworCQkJbG9nLmRlYnVnKCJwYXJlbnQgdHlwZSBvZiBhcnRpZmFjdCBjYW4gYmUgZWl0aGVyIHJlc291cmNlIG9yIHNlcnZpY2UiKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoZGVwbG95bWVudEFjY2VwdGVkVHlwZXMgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJwYXJlbnQgdHlwZSBvZiBhcnRpZmFjdCBjYW4gYmUgZWl0aGVyIHJlc291cmNlIG9yIHNlcnZpY2UiKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSkpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYWNjZXB0ZWRUeXBlcyA9IGRlcGxveW1lbnRBY2NlcHRlZFR5cGVzLmdldEFjY2VwdGVkVHlwZXMoKTsKKwkJfQorCQkvKgorCQkgKiBObyBuZWVkIHRvIGNoZWNrIHNwZWNpZmljIHR5cGVzLiBJbiBjYXNlIHRoZXJlIGFyZSBubyBhY2NlcHRlZFR5cGVzIGluIGNvbmZpZ3VyYXRpb24sIHRoZW4gYW55IHR5cGUgaXMgYWNjZXB0ZWQuCisJCSAqIAorCQkgKiBpZiAoKCFhcnRpZmFjdFR5cGUuZXF1YWxzKEFydGlmYWN0VHlwZUVudW0uT1RIRVIpICYmICFhcnRpZmFjdFR5cGUuZXF1YWxzKEFydGlmYWN0VHlwZUVudW0uSEVBVF9BUlRJRkFDVCApKSAmJiAoYWNjZXB0ZWRUeXBlcyA9PSBudWxsIHx8IGFjY2VwdGVkVHlwZXMuaXNFbXB0eSgpKSApIHsgbG9nLmRlYnVnKCAiTm8gYWNjZXB0ZWQgdHlwZXMgZm91bmQgZm9yIHR5cGUge30sIHBhcmVudCB0eXBlIHt9IiwKKwkJICogZmlsZVR5cGUsIHBhcmVudFR5cGUuZ2V0TmFtZSgpKTsgU3RyaW5nIG1ldGhvZE5hbWUgPSBuZXcgT2JqZWN0KCkgeyB9LmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOyBTdHJpbmcgY29uZmlnRW50cnlNaXNzaW5nID0gKHBhcmVudFR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSkpID8gInJlc291cmNlRGVwbG95bWVudEFydGlmYWN0czoiICsgZmlsZVR5cGUgOgorCQkgKiAic2VydmljZURlcGxveW1lbnRBcnRpZmFjdHM6IiArIGZpbGVUeXBlOyBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuIEJlTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvciwgbWV0aG9kTmFtZSwgY29uZmlnRW50cnlNaXNzaW5nKTsgQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvcigKKwkJICogbWV0aG9kTmFtZSwgY29uZmlnRW50cnlNaXNzaW5nKTsgcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoIEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7IHJldHVybjsgfQorCQkgKi8KKworCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpOworCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IEdlbmVyYWxVdGlsaXR5LmdldEZpbGVuYW1lRXh0ZW5zaW9uKGFydGlmYWN0TmFtZSk7CisJCS8vIFBhdmVsIC0gRmlsZSBleHRlbnNpb24gdmFsaWRhdGlvbiBpcyBjYXNlLWluc2Vuc2l0aXZlIC0gRWxsYSwKKwkJLy8gMjEvMDIvMjAxNgorCQlpZiAoYWNjZXB0ZWRUeXBlcyAhPSBudWxsICYmICFhY2NlcHRlZFR5cGVzLmlzRW1wdHkoKSAmJiAhYWNjZXB0ZWRUeXBlcy5jb250YWlucyhmaWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpKSB7CisJCQlsb2cuZGVidWcoIkZpbGUgZXh0ZW5zaW9uIFwie31cIiBpcyBub3QgYWxsb3dlZCBmb3Ige30gd2hpY2ggaXMgb2YgdHlwZTp7fSIsIGZpbGVFeHRlbnNpb24sIGFydGlmYWN0TmFtZSwgZmlsZVR5cGUpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLldST05HX0FSVElGQUNUX0ZJTEVfRVhURU5TSU9OLCBmaWxlVHlwZSkpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlSGVhdEVudkRlcGxveW1lbnRBcnRpZmFjdChDb21wb25lbnQgcGFyZW50Q29tcG9uZW50LCBTdHJpbmcgcGFyZW50SWQsIFN0cmluZyB1c2VySWQsIGJvb2xlYW4gaXNDcmVhdGUsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlKSB7CisKKwkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+KCk7CisJCVdyYXBwZXI8QXJ0aWZhY3REZWZpbml0aW9uPiBoZWF0TURXcmFwcGVyID0gbmV3IFdyYXBwZXI8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlXcmFwcGVyPGJ5dGVbXT4gcGF5bG9hZFdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlVmFsaWRZYW1sKGVycm9yV3JhcHBlciwgYXJ0aWZhY3RJbmZvKTsKKwkJfQorCisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkvLyBWYWxpZGF0ZSBIZWF0IEV4aXN0CisJCQl2YWxpZGF0ZUhlYXRFeGlzdChhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSwgZXJyb3JXcmFwcGVyLCBoZWF0TURXcmFwcGVyLCBnZXREZXBsb3ltZW50QXJ0aWZhY3RzKHBhcmVudENvbXBvbmVudCwgcGFyZW50VHlwZSwgcGFyZW50SWQpKTsKKwkJfQorCisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpICYmIGlzQ3JlYXRlKSB7CisJCQkvLyBWYWxpZGF0ZSBPbmx5IFNpbmdsZSBIZWF0RW52IEFydGlmYWN0CisJCQl2YWxpZGF0ZVNpbmdsZUFydGlmYWN0VHlwZShlcnJvcldyYXBwZXIsIEFydGlmYWN0VHlwZUVudW0uSEVBVF9FTlYsIHBhcmVudENvbXBvbmVudCwgcGFyZW50VHlwZSwgcGFyZW50SWQpOworCQl9CisKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkgJiYgIWhlYXRNRFdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlmaWxsQXJ0aWZhY3RQYXlsb2FkVmFsaWRhdGlvbihlcnJvcldyYXBwZXIsIHBheWxvYWRXcmFwcGVyLCBoZWF0TURXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpICYmICFoZWF0TURXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVFbnZWc0hlYXQoZXJyb3JXcmFwcGVyLCBhcnRpZmFjdEluZm8sIGhlYXRNRFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHBheWxvYWRXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCisJCS8vIEluaXQgUmVzcG9uc2UKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXNwb25zZTsKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWVpdGhlclJlc3BvbnNlID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0gZWxzZSB7CisJCQllaXRoZXJSZXNwb25zZSA9IEVpdGhlci5yaWdodChlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJCXJldHVybiBlaXRoZXJSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBmaWxsQXJ0aWZhY3RQYXlsb2FkVmFsaWRhdGlvbihXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIsIFdyYXBwZXI8Ynl0ZVtdPiBwYXlsb2FkV3JhcHBlciwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbikgeworCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uLmdldFBheWxvYWREYXRhKCkgPT0gbnVsbCB8fCBhcnRpZmFjdERlZmluaXRpb24uZ2V0UGF5bG9hZERhdGEoKS5sZW5ndGggPT0gMCkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBmaWxsQXJ0aWZhY3RQYXlsb2FkID0gZmlsbEFydGlmYWN0UGF5bG9hZChwYXlsb2FkV3JhcHBlciwgYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkJCWlmIChmaWxsQXJ0aWZhY3RQYXlsb2FkLmlzUmlnaHQoKSkgeworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZmlsbEFydGlmYWN0UGF5bG9hZC5yaWdodCgpLnZhbHVlKCkpOworCQkJCWxvZy5kZWJ1ZygiRXJyb3IgZ2V0dGluZyBwYXlsb2FkIGZvciBhcnRpZmFjdDp7fSIsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwYXlsb2FkV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYXJ0aWZhY3REZWZpbml0aW9uLmdldFBheWxvYWREYXRhKCkpOworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZmlsbEFydGlmYWN0UGF5bG9hZChXcmFwcGVyPGJ5dGVbXT4gcGF5bG9hZFdyYXBwZXIsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdE1EKSB7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCUVpdGhlcjxFU0FydGlmYWN0RGF0YSwgQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJBcnRpZmFjdERhdGEgPSBhcnRpZmFjdENhc3NhbmRyYURhby5nZXRBcnRpZmFjdChhcnRpZmFjdE1ELmdldEVzSWQoKSk7CisJCS8vIEVpdGhlcjxFU0FydGlmYWN0RGF0YSwgUmVzb3VyY2VVcGxvYWRTdGF0dXM+IGVpdGhlckFydGlmYWN0RGF0YSA9CisJCS8vIGVzQ2F0YWxvZ0Rhby5nZXRBcnRpZmFjdChhcnRpZmFjdE1ELmdldEVzSWQoKSk7CisJCWlmIChlaXRoZXJBcnRpZmFjdERhdGEuaXNMZWZ0KCkpIHsKKwkJCWJ5dGVbXSBkYXRhID0gZWl0aGVyQXJ0aWZhY3REYXRhLmxlZnQoKS52YWx1ZSgpLmdldERhdGFBc0FycmF5KCk7CisJCQlpZiAoIUdlbmVyYWxVdGlsaXR5LmlzQmFzZTY0RW5jb2RlZChkYXRhKSkgeworCQkJCWRhdGEgPSBCYXNlNjQuZW5jb2RlQmFzZTY0KGRhdGEpOworCQkJfQorCQkJcGF5bG9hZFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGRhdGEpOworCQl9IGVsc2UgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlU3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRDYXNzYW5kcmFTdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyQXJ0aWZhY3REYXRhLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RvcmFnZVN0YXR1cykpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRW52VnNIZWF0KFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciwgQXJ0aWZhY3REZWZpbml0aW9uIGVudkFydGlmYWN0LCBBcnRpZmFjdERlZmluaXRpb24gaGVhdEFydGlmYWN0LCBieXRlW10gaGVhdFBheWxvYWREYXRhKSB7CisKKwkJU3RyaW5nIGVudlBheWxvYWQgPSAoR2VuZXJhbFV0aWxpdHkuaXNCYXNlNjRFbmNvZGVkKGVudkFydGlmYWN0LmdldFBheWxvYWREYXRhKCkpKSA/IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZUJhc2U2NChlbnZBcnRpZmFjdC5nZXRQYXlsb2FkRGF0YSgpKSkgOiBuZXcgU3RyaW5nKGVudkFydGlmYWN0LmdldFBheWxvYWREYXRhKCkpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYXRFbnZUb3NjYUpzb24gPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbmV3IFlhbWwoKS5sb2FkKGVudlBheWxvYWQpOworCisJCVN0cmluZyBoZWF0RGVjb2RlZFBheWxvYWQgPSAoR2VuZXJhbFV0aWxpdHkuaXNCYXNlNjRFbmNvZGVkKGhlYXRQYXlsb2FkRGF0YSkpID8gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlQmFzZTY0KGhlYXRQYXlsb2FkRGF0YSkpIDogbmV3IFN0cmluZyhoZWF0UGF5bG9hZERhdGEpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYXRUb3NjYUpzb24gPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbmV3IFlhbWwoKS5sb2FkKGhlYXREZWNvZGVkUGF5bG9hZCk7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlckhlYXRFbnZQcm9wZXJ0aWVzID0gSW1wb3J0VXRpbHMuZmluZEZpcnN0VG9zY2FNYXBFbGVtZW50KGhlYXRFbnZUb3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLlBBUkFNRVRFUlMpOworCQlFaXRoZXI8TWFwPFN0cmluZywgT2JqZWN0PiwgUmVzdWx0U3RhdHVzRW51bT4gZWl0aGVySGVhdFByb3BlcnRpZXMgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYU1hcEVsZW1lbnQoaGVhdFRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uUEFSQU1FVEVSUyk7CisJCWlmIChlaXRoZXJIZWF0RW52UHJvcGVydGllcy5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPUlJVUFRFRF9GT1JNQVQsICJIZWF0IEVudiIpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZUZvcm1hdCk7CisJCQlsb2cuZGVidWcoIkludmFsaWQgaGVhdCBlbnYgZm9ybWF0IGZvciBmaWxlOnt9IiwgZW52QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQl9IGVsc2UgaWYgKGVpdGhlckhlYXRQcm9wZXJ0aWVzLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBSZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTTUFUQ0hfSEVBVF9WU19IRUFUX0VOViwgZW52QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCksIGhlYXRBcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlRm9ybWF0KTsKKwkJCWxvZy5kZWJ1ZygiVmFsaWRhdGlvbiBvZiBoZWF0X2VudiBmb3IgYXJ0aWZhY3Q6e30gdnMgaGVhdCBhcnRpZmFjdCBmb3IgYXJ0aWZhY3QgOnt9IGZhaWxlZCIsIGVudkFydGlmYWN0LmdldEFydGlmYWN0TmFtZSgpLCBoZWF0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQl9IGVsc2UgeworCQkJU2V0PFN0cmluZz4gaGVhdFByb3BlcnRpZXNLZXlzID0gZWl0aGVySGVhdFByb3BlcnRpZXMubGVmdCgpLnZhbHVlKCkua2V5U2V0KCk7CisJCQlTZXQ8U3RyaW5nPiBoZWF0RW52UHJvcGVydGllc0tleXMgPSBlaXRoZXJIZWF0RW52UHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKS5rZXlTZXQoKTsKKwkJCWhlYXRFbnZQcm9wZXJ0aWVzS2V5cy5yZW1vdmVBbGwoaGVhdFByb3BlcnRpZXNLZXlzKTsKKwkJCWlmIChoZWF0RW52UHJvcGVydGllc0tleXMuc2l6ZSgpID4gMCkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU01BVENIX0hFQVRfVlNfSEVBVF9FTlYsIGVudkFydGlmYWN0LmdldEFydGlmYWN0TmFtZSgpLCBoZWF0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVmFsaWRZYW1sKFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbykgeworCQlZYW1sVG9PYmplY3RDb252ZXJ0ZXIgeWFtbENvbnZlcnRvciA9IG5ldyBZYW1sVG9PYmplY3RDb252ZXJ0ZXIoKTsKKwkJYm9vbGVhbiBpc1lhbWxWYWxpZCA9IHlhbWxDb252ZXJ0b3IuaXNWYWxpZFlhbWwoYXJ0aWZhY3RJbmZvLmdldFBheWxvYWREYXRhKCkpOworCQlpZiAoIWlzWWFtbFZhbGlkKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IFJlc3BvbnNlRm9ybWF0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUwsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlRm9ybWF0KTsKKwkJCWxvZy5kZWJ1ZygiWWFtbCBpcyBub3QgdmFsaWQgZm9yIGFydGlmYWN0IDoge30iLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZFhtbChieXRlW10geG1sVG9QYXJzZSkgeworCQlYTUxSZWFkZXIgcGFyc2VyID0gbmV3IFNBWFBhcnNlcigpOworCQlib29sZWFuIGlzWG1sVmFsaWQgPSB0cnVlOworCQl0cnkgeworCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sVG9QYXJzZSkpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBTQVhFeGNlcHRpb24gZSkgeworCQkJaXNYbWxWYWxpZCA9IGZhbHNlOworCQl9CisJCXJldHVybiBpc1htbFZhbGlkOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmFsaWRKc29uKGJ5dGVbXSBqc29uVG9QYXJzZSkgeworCQlTdHJpbmcgcGFyc2VkID0gbmV3IFN0cmluZyhqc29uVG9QYXJzZSk7CisJCXRyeSB7CisJCQlnc29uLmZyb21Kc29uKHBhcnNlZCwgT2JqZWN0LmNsYXNzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNpbmdsZUFydGlmYWN0VHlwZShXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIsIEFydGlmYWN0VHlwZUVudW0gYWxsb3dlZEFydGlmYWN0VHlwZSwgQ29tcG9uZW50IHBhcmVudENvbXBvbmVudCwgTm9kZVR5cGVFbnVtIHBhcmVudFR5cGUsIFN0cmluZyBwYXJlbnRSaUlkKSB7CisJCWJvb2xlYW4gdHlwZUFydGlmYWN0Rm91bmQgPSBmYWxzZTsKKwkJLy8gSXRlcmF0b3I8QXJ0aWZhY3REZWZpbml0aW9uPiBwYXJlbnREZXBsb3ltZW50QXJ0aWZhY3RzSXRyID0KKwkJLy8gKHBhcmVudFR5cGUgPT0gTm9kZVR5cGVFbnVtLlJlc291cmNlKSA/CisJCS8vIGluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmdldEFsbERlcGxveWFibGVBcnRpZmFjdHMoKFJlc291cmNlKQorCQkvLyBwYXJlbnRDb21wb25lbnQpLml0ZXJhdG9yKCkKKwkJLy8gOiBnZXREZXBsb3ltZW50QXJ0aWZhY3RzKHBhcmVudENvbXBvbmVudCwgcGFyZW50VHlwZSkuaXRlcmF0b3IoKTsKKworCQlJdGVyYXRvcjxBcnRpZmFjdERlZmluaXRpb24+IHBhcmVudERlcGxveW1lbnRBcnRpZmFjdHNJdHIgPSBnZXREZXBsb3ltZW50QXJ0aWZhY3RzKHBhcmVudENvbXBvbmVudCwgcGFyZW50VHlwZSwgcGFyZW50UmlJZCkuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoIXR5cGVBcnRpZmFjdEZvdW5kICYmIHBhcmVudERlcGxveW1lbnRBcnRpZmFjdHNJdHIuaGFzTmV4dCgpKSB7CisJCQlBcnRpZmFjdFR5cGVFbnVtIGZvdW5kQXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5maW5kVHlwZShwYXJlbnREZXBsb3ltZW50QXJ0aWZhY3RzSXRyLm5leHQoKS5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCQl0eXBlQXJ0aWZhY3RGb3VuZCA9IChmb3VuZEFydGlmYWN0VHlwZSA9PSBhbGxvd2VkQXJ0aWZhY3RUeXBlKTsKKwkJfQorCQlpZiAodHlwZUFydGlmYWN0Rm91bmQpIHsKKwkJCVN0cmluZyBwYXJlbnROYW1lID0gcGFyZW50Q29tcG9uZW50LmdldE5hbWUoKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkRFUExPWU1FTlRfQVJUSUZBQ1RfT0ZfVFlQRV9BTFJFQURZX0VYSVNUUywgcGFyZW50VHlwZS5uYW1lKCksIHBhcmVudE5hbWUsIGFsbG93ZWRBcnRpZmFjdFR5cGUuZ2V0VHlwZSgpLCBhbGxvd2VkQXJ0aWZhY3RUeXBlLmdldFR5cGUoKSk7CisKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzcG9uc2VGb3JtYXQpOworCQkJbG9nLmRlYnVnKCJDYW4ndCB1cGxvYWQgYXJ0aWZhY3Qgb2YgdHlwZToge30sIGJlY2F1c2UgYW5vdGhlciBhcnRpZmFjdCBvZiB0aGlzIHR5cGUgYWxyZWFkeSBleGlzdC4iLCBhbGxvd2VkQXJ0aWZhY3RUeXBlLmdldFR5cGUoKSk7CisKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHZhbGlkYXRlU2luZ2xlRGVwbG95bWVudEFydGlmYWN0TmFtZShXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIsIFN0cmluZyBhcnRpZmFjdE5hbWUsIENvbXBvbmVudCBwYXJlbnRDb21wb25lbnQsIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlKSB7CisJCWJvb2xlYW4gYXJ0aWZhY3ROYW1lRm91bmQgPSBmYWxzZTsKKwkJLy8gSXRlcmF0b3I8QXJ0aWZhY3REZWZpbml0aW9uPiBwYXJlbnREZXBsb3ltZW50QXJ0aWZhY3RzSXRyID0KKwkJLy8gKHBhcmVudFR5cGUgPT0gTm9kZVR5cGVFbnVtLlJlc291cmNlKSA/CisJCS8vIGluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmdldEFsbERlcGxveWFibGVBcnRpZmFjdHMoKFJlc291cmNlKQorCQkvLyBwYXJlbnRDb21wb25lbnQpLml0ZXJhdG9yKCkKKwkJLy8gOiBnZXREZXBsb3ltZW50QXJ0aWZhY3RzKHBhcmVudENvbXBvbmVudCwgcGFyZW50VHlwZSkuaXRlcmF0b3IoKTsKKworCQlJdGVyYXRvcjxBcnRpZmFjdERlZmluaXRpb24+IHBhcmVudERlcGxveW1lbnRBcnRpZmFjdHNJdHIgPSBnZXREZXBsb3ltZW50QXJ0aWZhY3RzKHBhcmVudENvbXBvbmVudCwgcGFyZW50VHlwZSwgbnVsbCkuaXRlcmF0b3IoKTsKKworCQl3aGlsZSAoIWFydGlmYWN0TmFtZUZvdW5kICYmIHBhcmVudERlcGxveW1lbnRBcnRpZmFjdHNJdHIuaGFzTmV4dCgpKSB7CisJCQlhcnRpZmFjdE5hbWVGb3VuZCA9IChhcnRpZmFjdE5hbWUuZXF1YWxzSWdub3JlQ2FzZShwYXJlbnREZXBsb3ltZW50QXJ0aWZhY3RzSXRyLm5leHQoKS5nZXRBcnRpZmFjdE5hbWUoKSkpOworCQl9CisJCWlmIChhcnRpZmFjdE5hbWVGb3VuZCkgeworCQkJU3RyaW5nIHBhcmVudE5hbWUgPSBwYXJlbnRDb21wb25lbnQuZ2V0TmFtZSgpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBSZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuREVQTE9ZTUVOVF9BUlRJRkFDVF9OQU1FX0FMUkVBRFlfRVhJU1RTLCBwYXJlbnRUeXBlLm5hbWUoKSwgcGFyZW50TmFtZSwgYXJ0aWZhY3ROYW1lKTsKKworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZUZvcm1hdCk7CisJCQlsb2cuZGVidWcoIkNhbid0IHVwbG9hZCBhcnRpZmFjdDoge30sIGJlY2F1c2UgYW5vdGhlciBhcnRpZmFjdCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0LiIsIGFydGlmYWN0TmFtZSk7CisKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUhlYXRFeGlzdChTdHJpbmcgaGVhdEVudklkLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIsIFdyYXBwZXI8QXJ0aWZhY3REZWZpbml0aW9uPiBoZWF0QXJ0aWZhY3RNRFdyYXBwZXIsIENvbGxlY3Rpb248QXJ0aWZhY3REZWZpbml0aW9uPiBwYXJlbnREZXBsb3ltZW50QXJ0aWZhY3RzKSB7CisJCWJvb2xlYW4gaGVhdEZvdW5kID0gZmFsc2U7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlcyA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEhlYXRBcnRpZmFjdEJ5SGVhdEVudklkKGhlYXRFbnZJZCwgdHJ1ZSk7CisJCWlmIChyZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRBcnRpZmFjdCA9IHJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJSXRlcmF0b3I8QXJ0aWZhY3REZWZpbml0aW9uPiBwYXJlbnRBcnRpZmFjdHNJdHIgPSBwYXJlbnREZXBsb3ltZW50QXJ0aWZhY3RzLml0ZXJhdG9yKCk7CisJCXdoaWxlICghaGVhdEZvdW5kICYmIHBhcmVudEFydGlmYWN0c0l0ci5oYXNOZXh0KCkpIHsKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBjdXJyQXJ0aWZhY3QgPSBwYXJlbnRBcnRpZmFjdHNJdHIubmV4dCgpOworCQkJaWYgKGhlYXRBcnRpZmFjdC5nZXRVbmlxdWVJZCgpLmVxdWFscyhjdXJyQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSkpIHsKKwkJCQloZWF0Rm91bmQgPSB0cnVlOworCQkJCWhlYXRBcnRpZmFjdE1EV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY3VyckFydGlmYWN0KTsKKwkJCQlsb2cudHJhY2UoIkluIHZhbGlkYXRlSGVhdEV4aXN0IGZvdW5kIGFydGlmYWN0IHt9IiwgY3VyckFydGlmYWN0KTsKKwkJCQkvKgorCQkJCSAqIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5maW5kVHlwZShjdXJyQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkpOyBpZihhcnRpZmFjdFR5cGUgPT0gQXJ0aWZhY3RUeXBlRW51bS5IRUFUIHx8IGFydGlmYWN0VHlwZSA9PSBBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MIHx8IGFydGlmYWN0VHlwZSA9PSBBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVUKXsKKwkJCQkgKiBoZWF0Rm91bmQgPSB0cnVlOyB9IGlmIChoZWF0Rm91bmQpIHsgaGVhdEFydGlmYWN0TURXcmFwcGVyLnNldElubmVyRWxlbWVudChjdXJyQXJ0aWZhY3QpOyB9CisJCQkJICovCisJCQl9CisJCX0KKwkJaWYgKCFoZWF0Rm91bmQpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSEVBVCk7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlRm9ybWF0KTsKKwkJCWxvZy5kZWJ1ZygiQ2FuJ3QgY3JlYXRlIGhlYXQgZW52IGFydGlmYWN0IGJlY2F1c2UgTm8gaGVhdCBBcnRpZmFjdCBleGlzdC4iKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlSGVhdERlcGxveW1lbnRBcnRpZmFjdChDb21wb25lbnQgcGFyZW50Q29tcG9uZW50LCBTdHJpbmcgdXNlcklkLCBib29sZWFuIGlzQ3JlYXRlLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBBcnRpZmFjdERlZmluaXRpb24gY3VycmVudEFydGlmYWN0LCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSkgeworCQlsb2cudHJhY2UoIlN0YXJ0ZWQgSEVBVCBwcmUtcGF5bG9hZCB2YWxpZGF0aW9uIGZvciBhcnRpZmFjdCB7fSIsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkpOworCQkvLyB0aW1lb3V0ID4gMCBmb3IgSEVBVCBhcnRpZmFjdHMKKwkJSW50ZWdlciB0aW1lb3V0ID0gYXJ0aWZhY3RJbmZvLmdldFRpbWVvdXQoKTsKKwkJSW50ZWdlciBkZWZhdWx0VGltZW91dCA9IChpc0NyZWF0ZSkgPyBkZWZhdWx0SGVhdFRpbWVvdXQgOiBjdXJyZW50QXJ0aWZhY3QuZ2V0VGltZW91dCgpOworCQlpZiAodGltZW91dCA9PSBudWxsKSB7CisJCQlhcnRpZmFjdEluZm8uc2V0VGltZW91dChkZWZhdWx0VGltZW91dCk7CisJCQkvLyBIRUFUIGFydGlmYWN0IGJ1dCB0aW1lb3V0IGlzIGludmFsaWQKKwkJfSBlbHNlIGlmICh0aW1lb3V0IDwgMSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX0lOVkFMSURfVElNRU9VVCkpOworCQl9CisKKwkJLy8gVVM2NDk4NTYgLSBBbGxvdyBzZXZlcmFsIEhFQVQgZmlsZXMgb24gUmVzb3VyY2UKKwkJLyoKKwkJICogaWYgKGlzQ3JlYXRlKSB7IFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsgdmFsaWRhdGVTaW5nbGVBcnRpZmFjdFR5cGUoZXJyb3JXcmFwcGVyLCBBcnRpZmFjdFR5cGVFbnVtLmZpbmRUeXBlKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSksIHBhcmVudENvbXBvbmVudCwgcGFyZW50VHlwZSk7IGlmICghZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeyByZXR1cm4KKwkJICogRWl0aGVyLnJpZ2h0KGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7IH0gfQorCQkgKi8KKworCQlsb2cudHJhY2UoIkVuZGVkIEhFQVQgdmFsaWRhdGlvbiBmb3IgYXJ0aWZhY3Qge30iLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgTGlzdDxTdHJpbmc+IHR5cGVMaXN0KSB7CisJCVN0cmluZyBsaXN0VG9TdHJpbmcgPSAodHlwZUxpc3QgIT0gbnVsbCkgPyB0eXBlTGlzdC50b1N0cmluZygpIDogIiI7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU01BVENIX0JFVFdFRU5fQVJUSUZBQ1RfVFlQRV9BTkRfQ09NUE9ORU5UX1RZUEUsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKSwgbGlzdFRvU3RyaW5nLCByZXNvdXJjZVR5cGUuZ2V0VmFsdWUoKSk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJU3RyaW5nIHJlc291cmNlVHlwZU5hbWUgPSByZXNvdXJjZVR5cGUubmFtZSgpOworCQlpZiAodHlwZUxpc3QgIT0gbnVsbCAmJiB0eXBlTGlzdC5jb250YWlucyhyZXNvdXJjZVR5cGVOYW1lKSkgeworCQkJZWl0aGVyID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKwkJcmV0dXJuIGVpdGhlcjsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZENvbnZlcnRIZWF0UGFyYW1lcnMoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgU3RyaW5nIGFydGlmYWN0VHlwZSkgeworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW0gOiBhcnRpZmFjdEluZm8uZ2V0SGVhdFBhcmFtZXRlcnMoKSkgeworCQkJCVN0cmluZyBwYXJhbWV0ZXJUeXBlID0gaGVhdFBhcmFtLmdldFR5cGUoKTsKKwkJCQlIZWF0UGFyYW1ldGVyVHlwZSBoZWF0UGFyYW1ldGVyVHlwZSA9IEhlYXRQYXJhbWV0ZXJUeXBlLmlzVmFsaWRUeXBlKHBhcmFtZXRlclR5cGUpOworCQkJCVN0cmluZyBhcnRpZmFjdFR5cGVTdHIgPSBhcnRpZmFjdFR5cGUgIT0gbnVsbCA/IGFydGlmYWN0VHlwZSA6IEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCk7CisJCQkJaWYgKGhlYXRQYXJhbWV0ZXJUeXBlID09IG51bGwpIHsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfSEVBVF9QQVJBTUVURVJfVFlQRSwgYXJ0aWZhY3RUeXBlU3RyLCBoZWF0UGFyYW0uZ2V0VHlwZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJfQorCisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5ID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShoZWF0UGFyYW0pOworCQkJCWlmICh2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5ICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmRlYnVnKCJIZWF0IHBhcmFtZXRlciB7fSBpcyBpbnZhbGlkLiBTdGF0dXMgaXM6IHt9IiwgaGVhdFBhcmFtLmdldE5hbWUoKSwgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSk7CisJCQkJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSBBY3Rpb25TdGF0dXMuSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9WQUxVRTsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoc3RhdHVzLCBhcnRpZmFjdFR5cGVTdHIsIGhlYXRQYXJhbS5nZXRUeXBlKCksIGhlYXRQYXJhbS5nZXROYW1lKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGFydGlmYWN0SW5mbyk7CisJfQorCisJcHVibGljIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBnZXREZXBsb3ltZW50QXJ0aWZhY3RzKENvbXBvbmVudCBwYXJlbnRDb21wb25lbnQsIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlLCBTdHJpbmcgY2lJZCkgeworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAocGFyZW50Q29tcG9uZW50LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSAhPSBudWxsICYmIGNpSWQgIT0gbnVsbCkgeworCQkJaWYgKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlID09IHBhcmVudFR5cGUpIHsKKwkJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFJlc3BvbnNlRm9ybWF0PiBnZXRSSSA9IGdldFJJRnJvbUNvbXBvbmVudChwYXJlbnRDb21wb25lbnQsIGNpSWQsIG51bGwsIG51bGwsIG51bGwpOworCQkJCWlmIChnZXRSSS5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIGRlcGxveW1lbnRBcnRpZmFjdHM7CisJCQkJfQorCQkJCUNvbXBvbmVudEluc3RhbmNlIHJpID0gZ2V0UkkubGVmdCgpLnZhbHVlKCk7CisJCQkJZGVwbG95bWVudEFydGlmYWN0cy5hZGRBbGwocmkuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLnZhbHVlcygpKTsKKwkJCX0gZWxzZSB7CisJCQkJZGVwbG95bWVudEFydGlmYWN0cy5hZGRBbGwocGFyZW50Q29tcG9uZW50LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS52YWx1ZXMoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGRlcGxveW1lbnRBcnRpZmFjdHM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrQ3JlYXRlRmllbGRzKFVzZXIgdXNlciwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgQXJ0aWZhY3RHcm91cFR5cGVFbnVtIHR5cGUpIHsKKwkJLy8gb24gY3JlYXRlIGlmIG51bGwgYWRkIGluZm9ybWF0aW9uYWwgdG8gY3VycmVudAorCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCkgPT0gbnVsbCkgeworCQkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0R3JvdXBUeXBlKHR5cGUpOworCQl9CisJCWlmIChhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSAhPSBudWxsKSB7CisJCQlsb2cuZXJyb3IoImFydGlmYWN0IHVuaXFpZCBjYW5ub3QgYmUgc2V0IGlnbm9yaW5nIik7CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldFVuaXF1ZUlkKG51bGwpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RSZWYoKSAhPSBudWxsKSB7CisJCQlsb2cuZXJyb3IoImFydGlmYWN0IHJlZiBjYW5ub3QgYmUgc2V0IGlnbm9yaW5nIik7CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0UmVmKG51bGwpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCkgIT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJhcnRpZmFjdCByZXBvc2l0b3J5IGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KG51bGwpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0VXNlcklkQ3JlYXRvcigpICE9IG51bGwpIHsKKwkJCWxvZy5lcnJvcigiY3JlYXRvciB1dWlkIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RDcmVhdG9yKHVzZXIuZ2V0VXNlcklkKCkpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0VXNlcklkTGFzdFVwZGF0ZXIoKSAhPSBudWxsKSB7CisJCQlsb2cuZXJyb3IoInVzZXJJZCBvZiBsYXN0IHVwZGF0ZXIgY2Fubm90IGJlIHNldCBpZ25vcmluZyIpOworCQl9CisJCWFydGlmYWN0SW5mby5zZXRVc2VySWRMYXN0VXBkYXRlcih1c2VyLmdldFVzZXJJZCgpKTsKKworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldENyZWF0b3JGdWxsTmFtZSgpICE9IG51bGwpIHsKKwkJCWxvZy5lcnJvcigiY3JlYXRvciBGdWxsIG5hbWUgY2Fubm90IGJlIHNldCBpZ25vcmluZyIpOworCQl9CisJCVN0cmluZyBmdWxsTmFtZSA9IHVzZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyLmdldExhc3ROYW1lKCk7CisJCWFydGlmYWN0SW5mby5zZXRVcGRhdGVyRnVsbE5hbWUoZnVsbE5hbWUpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0VXBkYXRlckZ1bGxOYW1lKCkgIT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJ1cGRhdGVyIEZ1bGwgbmFtZSBjYW5ub3QgYmUgc2V0IGlnbm9yaW5nIik7CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldFVwZGF0ZXJGdWxsTmFtZShmdWxsTmFtZSk7CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRDcmVhdGlvbkRhdGUoKSAhPSBudWxsKSB7CisJCQlsb2cuZXJyb3IoIkNyZWF0aW9uIERhdGUgY2Fubm90IGJlIHNldCBpZ25vcmluZyIpOworCQl9CisJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlhcnRpZmFjdEluZm8uc2V0Q3JlYXRpb25EYXRlKHRpbWUpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0TGFzdFVwZGF0ZURhdGUoKSAhPSBudWxsKSB7CisJCQlsb2cuZXJyb3IoIkxhc3QgVXBkYXRlIERhdGUgY2Fubm90IGJlIHNldCBpZ25vcmluZyIpOworCQl9CisJCWFydGlmYWN0SW5mby5zZXRMYXN0VXBkYXRlRGF0ZSh0aW1lKTsKKworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEVzSWQoKSAhPSBudWxsKSB7CisJCQlsb2cuZXJyb3IoImVzIGlkIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0RXNJZChudWxsKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGZldGNoQ3VycmVudEFydGlmYWN0KGJvb2xlYW4gaXNDcmVhdGUsIFN0cmluZyBhcnRpZmFjdElkKSB7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0QnlJZCA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0QnlJZChhcnRpZmFjdElkLCB0cnVlKTsKKwkJaWYgKGlzQ3JlYXRlID09IGZhbHNlICYmIGFydGlmYWN0QnlJZC5pc1JpZ2h0KCkpIHsKKwkJCS8vIGluIGNhc2Ugb2YgdXBkYXRlIGFydGlmYWN0IG11c3QgYmUKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUFydGlmYWN0TWlzc2luZ0Vycm9yLCAiQXJ0aWZhY3QgVXBkYXRlIC8gVXBsb2FkIiwgYXJ0aWZhY3RJZCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVBcnRpZmFjdE1pc3NpbmdFcnJvcigiQXJ0aWZhY3QgVXBkYXRlIC8gVXBsb2FkIiwgYXJ0aWZhY3RJZCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCBhcnRpZmFjdCB7fS4gZXJyb3I6IHt9IiwgYXJ0aWZhY3RJZCwgYXJ0aWZhY3RCeUlkLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoYXJ0aWZhY3RCeUlkLnJpZ2h0KCkudmFsdWUoKSksIGFydGlmYWN0SWQpKTsKKwkJfQorCQlpZiAoaXNDcmVhdGUgJiYgYXJ0aWZhY3RCeUlkLmlzTGVmdCgpKSB7CisJCQlsb2cuZGVidWcoIkFydGlmYWN0IHt9IGFscmVhZHkgZXhpc3QiLCBhcnRpZmFjdElkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9FWElTVCwgYXJ0aWZhY3RCeUlkLmxlZnQoKS52YWx1ZSgpLmdldEFydGlmYWN0TGFiZWwoKSkpOworCQl9CisJCUFydGlmYWN0RGVmaW5pdGlvbiBjdXJyZW50QXJ0aWZhY3RJbmZvID0gbnVsbDsKKwkJaWYgKGFydGlmYWN0QnlJZC5pc0xlZnQoKSkgeworCQkJLy8gZ2V0IHByZXZpb3VzIHZhbHVlCisJCQljdXJyZW50QXJ0aWZhY3RJbmZvID0gYXJ0aWZhY3RCeUlkLmxlZnQoKS52YWx1ZSgpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjdXJyZW50QXJ0aWZhY3RJbmZvKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVBcnRpZmFjdExhYmVsKFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGlzQ3JlYXRlLCBTdHJpbmcgYXJ0aWZhY3RJZCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBBcnRpZmFjdERlZmluaXRpb24gY3VycmVudEFydGlmYWN0SW5mbywKKwkJCU5vZGVUeXBlRW51bSBwYXJlbnRUeXBlKSB7CisJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKTsKKworCQlpZiAob3BlcmF0aW9uTmFtZSA9PSBudWxsICYmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpID09IG51bGwgfHwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKS5pc0VtcHR5KCkpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVNaXNzaW5nQXJ0aWZhY3RJbmZvcm1hdGlvbkVycm9yLCAiQXJ0aWZhY3QgVXBkYXRlIC8gVXBsb2FkIiwgImFydGlmYWN0TGFiZWwiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZU1pc3NpbmdBcnRpZmFjdEluZm9ybWF0aW9uRXJyb3IoIkFydGlmYWN0IFVwZGF0ZSAvIFVwbG9hZCIsICJhcnRpZmFjdExhYmVsIik7CisJCQlsb2cuZGVidWcoIm1pc3NpbmcgYXJ0aWZhY3QgbG9naWNhbCBuYW1lIGZvciBjb21wb25lbnQge30iLCByZXNvdXJjZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEsIEFSVElGQUNUX0xBQkVMKSk7CisJCX0KKwkJaWYgKGlzQ3JlYXRlICYmICFhcnRpZmFjdEluZm8uZ2V0TWFuZGF0b3J5KCkpIHsKKworCQkJaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgeworCQkJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpICE9IG51bGwgJiYgIW9wZXJhdGlvbk5hbWUuZXF1YWxzKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkpKSB7CisJCQkJCWxvZy5kZWJ1ZygiYXJ0aWZhY3QgbGFiZWwgY2Fubm90IGJlIHNldCB7fSIsIGFydGlmYWN0TGFiZWwpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTE9HSUNBTF9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXJ0aWZhY3RMYWJlbCA9IG9wZXJhdGlvbk5hbWU7CisJCQkJfQorCQkJfQorCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gVmFsaWRhdGlvblV0aWxzLmNsZWFuQXJ0aWZhY3REaXNwbGF5TmFtZShhcnRpZmFjdExhYmVsKTsKKwkJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKKworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdExhYmVsKGFydGlmYWN0TGFiZWwpKSB7CisJCQkJbG9nLmRlYnVnKCJJbnZhbGlkIGZvcm1hdCBmb3JtIEFydGlmYWN0IGxhYmVsIDoge30iLCBhcnRpZmFjdExhYmVsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCQl9CisJCQlhcnRpZmFjdExhYmVsID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUFydGlmYWN0TGFiZWwoYXJ0aWZhY3RMYWJlbCk7CisKKwkJCWlmIChhcnRpZmFjdExhYmVsLmlzRW1wdHkoKSkgeworCQkJCWxvZy5kZWJ1ZygibWlzc2luZyBub3JtYWxpemVkIGFydGlmYWN0IGxvZ2ljYWwgbmFtZSBmb3IgY29tcG9uZW50IHt9IiwgcmVzb3VyY2VJZCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQSwgQVJUSUZBQ1RfTEFCRUwpKTsKKwkJCX0KKworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdExhYmVsTGVuZ3RoKGFydGlmYWN0TGFiZWwpKSB7CisJCQkJbG9nLmRlYnVnKCJJbnZhbGlkIGxlbmdodCBmb3JtIEFydGlmYWN0IGxhYmVsIDoge30iLCBhcnRpZmFjdExhYmVsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuRVhDRUVEU19MSU1JVCwgQVJUSUZBQ1RfTEFCRUwsIFN0cmluZy52YWx1ZU9mKFZhbGlkYXRpb25VdGlscy5BUlRJRkFDVF9MQUJFTF9MRU5HVEgpKSk7CisJCQl9CisJCQlpZiAoIXZhbGlkYXRlTGFiZWxVbmlxdWVuZXNzKHJlc291cmNlSWQsIGFydGlmYWN0TGFiZWwsIHBhcmVudFR5cGUpKSB7CisJCQkJbG9nLmRlYnVnKCJOb24gdW5pcXVlIEFydGlmYWN0IGxhYmVsIDoge30iLCBhcnRpZmFjdExhYmVsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfRVhJU1QsIGFydGlmYWN0TGFiZWwpKTsKKwkJCX0KKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RMYWJlbChhcnRpZmFjdExhYmVsKTsKKworCQlpZiAoY3VycmVudEFydGlmYWN0SW5mbyAhPSBudWxsICYmICFjdXJyZW50QXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSkpIHsKKwkJCWxvZy5pbmZvKCJMb2dpY2FsIGFydGlmYWN0J3MgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCB7fSIsIGFydGlmYWN0SWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX0xPR0lDQUxfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChBY3Rpb25TdGF0dXMuT0spOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUxhYmVsVW5pcXVlbmVzcyhTdHJpbmcgcGFyZW50SWQsIFN0cmluZyBhcnRpZmFjdExhYmVsLCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSkgeworCQlib29sZWFuIGlzVW5pcXVlID0gdHJ1ZTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0cyA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0cyhwYXJlbnRJZCwgcGFyZW50VHlwZSwgdHJ1ZSk7CisJCWlmIChhcnRpZmFjdHMuaXNMZWZ0KCkpIHsKKwkJCWZvciAoU3RyaW5nIGxhYmVsIDogYXJ0aWZhY3RzLmxlZnQoKS52YWx1ZSgpLmtleVNldCgpKSB7CisJCQkJaWYgKGxhYmVsLmVxdWFscyhhcnRpZmFjdExhYmVsKSkgeworCQkJCQlpc1VuaXF1ZSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHBhcmVudFR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSkpIHsKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWxsSW50ZXJmYWNlc09mUmVzb3VyY2UgPSBpbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24uZ2V0QWxsSW50ZXJmYWNlc09mUmVzb3VyY2UocGFyZW50SWQsIHRydWUpOworCQkJaWYgKGFsbEludGVyZmFjZXNPZlJlc291cmNlLmlzTGVmdCgpKSB7CisJCQkJZm9yIChJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyYWNlIDogYWxsSW50ZXJmYWNlc09mUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkudmFsdWVzKCkpIHsKKwkJCQkJZm9yIChPcGVyYXRpb24gb3BlcmF0aW9uIDogaW50ZXJhY2UuZ2V0T3BlcmF0aW9ucygpLnZhbHVlcygpKSB7CisJCQkJCQlpZiAob3BlcmF0aW9uLmdldEltcGxlbWVudGF0aW9uKCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0SW1wbGVtZW50YXRpb24oKS5nZXRBcnRpZmFjdExhYmVsKCkuZXF1YWxzKGFydGlmYWN0TGFiZWwpKSB7CisJCQkJCQkJaXNVbmlxdWUgPSBmYWxzZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gaXNVbmlxdWU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY29tcG9zZUFydGlmYWN0SWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBhcnRpZmFjdElkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHsKKwkJU3RyaW5nIGlkID0gYXJ0aWZhY3RJZDsKKwkJaWYgKGFydGlmYWN0SWQgPT0gbnVsbCB8fCBhcnRpZmFjdElkLmlzRW1wdHkoKSkgeworCQkJU3RyaW5nIHVuaXF1ZUlkID0gbnVsbDsKKwkJCWlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgb3BlcmF0aW9uTmFtZSAhPSBudWxsKSB7CisJCQkJdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRBcnRpZmFjdEJ5SW50ZXJmYWNlVW5pcXVlSWQocmVzb3VyY2VJZCwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uTmFtZSwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCQl9IGVsc2UgeworCQkJCXVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChyZXNvdXJjZUlkLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJCX0KKwkJCWFydGlmYWN0SW5mby5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCQlhcnRpZmFjdEluZm8uc2V0RXNJZCh1bmlxdWVJZCk7CisJCQlpZCA9IHVuaXF1ZUlkOworCQl9IGVsc2UgeworCQkJYXJ0aWZhY3RJbmZvLnNldFVuaXF1ZUlkKGFydGlmYWN0SWQpOworCQkJYXJ0aWZhY3RJbmZvLnNldEVzSWQoYXJ0aWZhY3RJZCk7CisJCX0KKwkJcmV0dXJuIGlkOworCX0KKworCXByaXZhdGUgRWl0aGVyPEFjdGlvblN0YXR1cywgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQXJ0aWZhY3RUeXBlKFN0cmluZyB1c2VySWQsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlKSB7CisJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkgPT0gbnVsbCB8fCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkuaXNFbXB0eSgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVNaXNzaW5nQXJ0aWZhY3RJbmZvcm1hdGlvbkVycm9yLCAiQXJ0aWZhY3QgVXBsb2FkIC8gVXBkYXRlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVNaXNzaW5nQXJ0aWZhY3RJbmZvcm1hdGlvbkVycm9yKCJBcnRpZmFjdCBVcGRhdGUgLyBVcGxvYWQiLCAiYXJ0aWZhY3RMYWJlbCIpOworCQkJbG9nLmRlYnVnKCJNaXNzaW5nIGFydGlmYWN0IHR5cGUgZm9yIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0FSVElGQUNUX1RZUEUpKTsKKwkJfQorCisJCWJvb2xlYW4gYXJ0aWZhY3RUeXBlRXhpc3QgPSBmYWxzZTsKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3RUeXBlPiwgQWN0aW9uU3RhdHVzPiBhbGxBcnRpZmFjdFR5cGVzID0gbnVsbDsKKwkJQXJ0aWZhY3RHcm91cFR5cGVFbnVtIGFydGlmYWN0R3JvdXBUeXBlID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCk7CisKKwkJaWYgKChhcnRpZmFjdEdyb3VwVHlwZSAhPSBudWxsKSAmJiBhcnRpZmFjdEdyb3VwVHlwZS5lcXVhbHMoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpKSB7CisJCQlhbGxBcnRpZmFjdFR5cGVzID0gZ2V0RGVwbG95bWVudEFydGlmYWN0VHlwZXModXNlcklkLCBhcnRpZmFjdEluZm8sIHBhcmVudFR5cGUpOworCQl9IGVsc2UgeworCisJCQlhbGxBcnRpZmFjdFR5cGVzID0gZWxlbWVudE9wZXJhdGlvbi5nZXRBbGxBcnRpZmFjdFR5cGVzKCk7CisJCX0KKwkJaWYgKGFsbEFydGlmYWN0VHlwZXMuaXNSaWdodCgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yLCAiQXJ0aWZhY3QgVXBsb2FkIC8gVXBkYXRlIiwgImFydGlmYWN0VHlwZXMiLCBhbGxBcnRpZmFjdFR5cGVzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvcigiQXJ0aWZhY3QgVXBsb2FkIC8gVXBkYXRlIiwgImFydGlmYWN0VHlwZXMiLCBhbGxBcnRpZmFjdFR5cGVzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgbGlzdCBvZiBzdXBvcnRlZCBhcnRpZmFjdCB0eXBlcy4gZXJyb3I6IHt9IiwgYWxsQXJ0aWZhY3RUeXBlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVVzZXJJZChhbGxBcnRpZmFjdFR5cGVzLnJpZ2h0KCkudmFsdWUoKSwgdXNlcklkKSk7CisJCX0KKworCQlmb3IgKEFydGlmYWN0VHlwZSB0eXBlIDogYWxsQXJ0aWZhY3RUeXBlcy5sZWZ0KCkudmFsdWUoKSkgeworCQkJaWYgKHR5cGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpKSkgeworCQkJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdFR5cGUoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpLnRvVXBwZXJDYXNlKCkpOworCQkJCWFydGlmYWN0VHlwZUV4aXN0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghYXJ0aWZhY3RUeXBlRXhpc3QpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRUeXBlRXJyb3IsICJBcnRpZmFjdCBVcGxvYWQgLyBEZWxldGUgLyBVcGRhdGUgLSBOb3Qgc3VwcG9ydGVkIGFydGlmYWN0IHR5cGUiLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCksICJBcnRpZmFjdCAiICsgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRUeXBlRXJyb3IoIkFydGlmYWN0IFVwbG9hZCAvIERlbGV0ZSAvIFVwZGF0ZSAtIE5vdCBzdXBwb3J0ZWQgYXJ0aWZhY3QgdHlwZSIsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSwgIkFydGlmYWN0ICIgKyBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQkJbG9nLmRlYnVnKCJOb3Qgc3VwcG9ydGVkIGFydGlmYWN0IHR5cGUgPSB7fSIsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVELCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChBY3Rpb25TdGF0dXMuT0spOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8QXJ0aWZhY3RUeXBlPiwgQWN0aW9uU3RhdHVzPiBnZXREZXBsb3ltZW50QXJ0aWZhY3RUeXBlcyhTdHJpbmcgdXNlcklkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSkgeworCisJCU1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+IGRlcGxveW1lbnRBcnRpZmFjdHMgPSBudWxsOworCQlMaXN0PEFydGlmYWN0VHlwZT4gYXJ0aWZhY3RUeXBlcyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3RUeXBlPigpOworCisJCWlmIChwYXJlbnRUeXBlLmVxdWFscyhOb2RlVHlwZUVudW0uU2VydmljZSkpIHsKKwkJCWRlcGxveW1lbnRBcnRpZmFjdHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0cygpOworCQl9IGVsc2UgaWYgKHBhcmVudFR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSkgeworCQkJZGVwbG95bWVudEFydGlmYWN0cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCX0gZWxzZSB7CisJCQlkZXBsb3ltZW50QXJ0aWZhY3RzID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCX0KKwkJaWYgKGRlcGxveW1lbnRBcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJZm9yIChTdHJpbmcgYXJ0aWZhY3RUeXBlIDogZGVwbG95bWVudEFydGlmYWN0cy5rZXlTZXQoKSkgeworCQkJCUFydGlmYWN0VHlwZSBhcnRpZmFjdFQgPSBuZXcgQXJ0aWZhY3RUeXBlKCk7CisJCQkJYXJ0aWZhY3RULnNldE5hbWUoYXJ0aWZhY3RUeXBlKTsKKwkJCQlhcnRpZmFjdFR5cGVzLmFkZChhcnRpZmFjdFQpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGFydGlmYWN0VHlwZXMpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUZpcnN0VXBkYXRlSGFzUGF5bG9hZChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBBcnRpZmFjdERlZmluaXRpb24gY3VycmVudEFydGlmYWN0KSB7CisJCWlmIChjdXJyZW50QXJ0aWZhY3QuZ2V0RXNJZCgpID09IG51bGwgJiYgKGFydGlmYWN0SW5mby5nZXRQYXlsb2FkRGF0YSgpID09IG51bGwgfHwgYXJ0aWZhY3RJbmZvLmdldFBheWxvYWREYXRhKCkubGVuZ3RoID09IDApKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLCBBUlRJRkFDVF9QQVlMT0FEKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kU2V0QXJ0aWZhY3RuYW1lKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8pIHsKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKSA9PSBudWxsIHx8IGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKS5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0FSVElGQUNUX05BTUUpKTsKKwkJfQorCisJCVN0cmluZyBub3JtYWxpemVGaWxlTmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZShhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQlpZiAobm9ybWFsaXplRmlsZU5hbWUgPT0gbnVsbCB8fCBub3JtYWxpemVGaWxlTmFtZS5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0FSVElGQUNUX05BTUUpKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3ROYW1lKG5vcm1hbGl6ZUZpbGVOYW1lKTsKKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0TmFtZUxlbmd0aChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuRVhDRUVEU19MSU1JVCwgQVJUSUZBQ1RfTkFNRSwgU3RyaW5nLnZhbHVlT2YoVmFsaWRhdGlvblV0aWxzLkFSVElGQUNUX05BTUVfTEVOR1RIKSkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFydGlmYWN0VHlwZU5vdENoYW5nZWQoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJlbnRBcnRpZmFjdCkgeworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpID09IG51bGwgfHwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpLmlzRW1wdHkoKSkgeworCQkJbG9nLmluZm8oImFydGlmYWN0IHR5cGUgaXMgbWlzc2luZyBvcGVyYXRpb24gaWdub3JlZCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQVJUSUZBQ1RfVFlQRSkpOworCQl9CisKKwkJaWYgKCFjdXJyZW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkpKSB7CisJCQlsb2cuaW5mbygiYXJ0aWZhY3QgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZCBvcGVyYXRpb24gaWdub3JlZCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZU9yU2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJlbnRBcnRpZmFjdCkgeworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCkgPT0gbnVsbCkgeworCQkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0R3JvdXBUeXBlKGN1cnJlbnRBcnRpZmFjdC5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpKTsKKwkJfQorCisJCWVsc2UgaWYgKCFjdXJyZW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKS5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKS5nZXRUeXBlKCkpKSB7CisJCQlsb2cuaW5mbygiYXJ0aWZhY3QgZ3JvdXAgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZC4gb3BlcmF0aW9uIGZhaWxlZCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdEluZm8pOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0FuZFNldFVuVXBkYXRhYmxlRmllbGRzKFVzZXIgdXNlciwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJlbnRBcnRpZmFjdCwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtIHR5cGUpIHsKKworCQkvLyBvbiB1cGRhdGUgaWYgbnVsbCBhZGQgaW5mb3JtYXRpb25hbCB0byBjdXJyZW50CisJCWlmIChjdXJyZW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSA9PSBudWxsICYmIHR5cGUgIT0gbnVsbCkgeworCQkJY3VycmVudEFydGlmYWN0LnNldEFydGlmYWN0R3JvdXBUeXBlKHR5cGUpOworCQl9CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRVbmlxdWVJZCgpICE9IG51bGwgJiYgIWN1cnJlbnRBcnRpZmFjdC5nZXRVbmlxdWVJZCgpLmVxdWFscyhhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSkpIHsKKwkJCWxvZy5lcnJvcigiYXJ0aWZhY3QgdW5pcWlkIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0VW5pcXVlSWQoY3VycmVudEFydGlmYWN0LmdldFVuaXF1ZUlkKCkpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RSZWYoKSAhPSBudWxsICYmICFjdXJyZW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RSZWYoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0UmVmKCkpKSB7CisJCQlsb2cuZXJyb3IoImFydGlmYWN0IHJlZiBjYW5ub3QgYmUgc2V0IGlnbm9yaW5nIik7CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0UmVmKGN1cnJlbnRBcnRpZmFjdC5nZXRBcnRpZmFjdFJlZigpKTsKKworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0UmVwb3NpdG9yeSgpICE9IG51bGwgJiYgIWN1cnJlbnRBcnRpZmFjdC5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0UmVwb3NpdG9yeSgpKSkgeworCQkJbG9nLmVycm9yKCJhcnRpZmFjdCByZXBvc2l0b3J5IGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KGN1cnJlbnRBcnRpZmFjdC5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKSk7CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRVc2VySWRDcmVhdG9yKCkgIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0LmdldFVzZXJJZENyZWF0b3IoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldFVzZXJJZENyZWF0b3IoKSkpIHsKKwkJCWxvZy5lcnJvcigiY3JlYXRvciB1dWlkIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0VXNlcklkQ3JlYXRvcihjdXJyZW50QXJ0aWZhY3QuZ2V0VXNlcklkQ3JlYXRvcigpKTsKKworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0Q3JlYXRvcigpICE9IG51bGwgJiYgIWN1cnJlbnRBcnRpZmFjdC5nZXRBcnRpZmFjdENyZWF0b3IoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0Q3JlYXRvcigpKSkgeworCQkJbG9nLmVycm9yKCJhcnRpZmFjdCBjcmVhdG9yIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RDcmVhdG9yKGN1cnJlbnRBcnRpZmFjdC5nZXRBcnRpZmFjdENyZWF0b3IoKSk7CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRVc2VySWRMYXN0VXBkYXRlcigpICE9IG51bGwgJiYgIWN1cnJlbnRBcnRpZmFjdC5nZXRVc2VySWRMYXN0VXBkYXRlcigpLmVxdWFscyhhcnRpZmFjdEluZm8uZ2V0VXNlcklkTGFzdFVwZGF0ZXIoKSkpIHsKKwkJCWxvZy5lcnJvcigidXNlcklkIG9mIGxhc3QgdXBkYXRlciBjYW5ub3QgYmUgc2V0IGlnbm9yaW5nIik7CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldFVzZXJJZExhc3RVcGRhdGVyKHVzZXIuZ2V0VXNlcklkKCkpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0Q3JlYXRvckZ1bGxOYW1lKCkgIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0LmdldENyZWF0b3JGdWxsTmFtZSgpLmVxdWFscyhhcnRpZmFjdEluZm8uZ2V0Q3JlYXRvckZ1bGxOYW1lKCkpKSB7CisJCQlsb2cuZXJyb3IoImNyZWF0b3IgRnVsbCBuYW1lIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0Q3JlYXRvckZ1bGxOYW1lKGN1cnJlbnRBcnRpZmFjdC5nZXRDcmVhdG9yRnVsbE5hbWUoKSk7CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRVcGRhdGVyRnVsbE5hbWUoKSAhPSBudWxsICYmICFjdXJyZW50QXJ0aWZhY3QuZ2V0VXBkYXRlckZ1bGxOYW1lKCkuZXF1YWxzKGFydGlmYWN0SW5mby5nZXRVcGRhdGVyRnVsbE5hbWUoKSkpIHsKKwkJCWxvZy5lcnJvcigidXBkYXRlciBGdWxsIG5hbWUgY2Fubm90IGJlIHNldCBpZ25vcmluZyIpOworCQl9CisJCVN0cmluZyBmdWxsTmFtZSA9IHVzZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyLmdldExhc3ROYW1lKCk7CisJCWFydGlmYWN0SW5mby5zZXRVcGRhdGVyRnVsbE5hbWUoZnVsbE5hbWUpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0Q3JlYXRpb25EYXRlKCkgIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0LmdldENyZWF0aW9uRGF0ZSgpLmVxdWFscyhhcnRpZmFjdEluZm8uZ2V0Q3JlYXRpb25EYXRlKCkpKSB7CisJCQlsb2cuZXJyb3IoIkNyZWF0aW9uIERhdGUgY2Fubm90IGJlIHNldCBpZ25vcmluZyIpOworCQl9CisJCWFydGlmYWN0SW5mby5zZXRDcmVhdGlvbkRhdGUoY3VycmVudEFydGlmYWN0LmdldENyZWF0aW9uRGF0ZSgpKTsKKworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldExhc3RVcGRhdGVEYXRlKCkgIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0LmdldExhc3RVcGRhdGVEYXRlKCkuZXF1YWxzKGFydGlmYWN0SW5mby5nZXRMYXN0VXBkYXRlRGF0ZSgpKSkgeworCQkJbG9nLmVycm9yKCJMYXN0IFVwZGF0ZSBEYXRlIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJYXJ0aWZhY3RJbmZvLnNldExhc3RVcGRhdGVEYXRlKHRpbWUpOworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0RXNJZCgpICE9IG51bGwgJiYgIWN1cnJlbnRBcnRpZmFjdC5nZXRFc0lkKCkuZXF1YWxzKGFydGlmYWN0SW5mby5nZXRFc0lkKCkpKSB7CisJCQlsb2cuZXJyb3IoImVzIGlkIGNhbm5vdCBiZSBzZXQgaWdub3JpbmciKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0RXNJZChjdXJyZW50QXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSk7CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkgIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0LmdldEFydGlmYWN0RGlzcGxheU5hbWUoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSkpIHsKKwkJCWxvZy5lcnJvcigiIEFydGlmYWN0IERpc3BsYXkgTmFtZSBjYW5ub3QgYmUgc2V0IGlnbm9yaW5nIik7CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0RGlzcGxheU5hbWUoY3VycmVudEFydGlmYWN0LmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSk7CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRTZXJ2aWNlQXBpKCkgIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0LmdldFNlcnZpY2VBcGkoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldFNlcnZpY2VBcGkoKSkpIHsKKwkJCWxvZy5kZWJ1Zygic2VydmljZUFwaSBjYW5ub3QgYmUgc2V0LiBpZ25vcmluZy4iKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0U2VydmljZUFwaShjdXJyZW50QXJ0aWZhY3QuZ2V0U2VydmljZUFwaSgpKTsKKworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCkgIT0gbnVsbCAmJiAhY3VycmVudEFydGlmYWN0LmdldEFydGlmYWN0R3JvdXBUeXBlKCkuZXF1YWxzKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpKSkgeworCQkJbG9nLmRlYnVnKCJhcnRpZmFjdCBncm91cCBjYW5ub3QgYmUgc2V0LiBpZ25vcmluZy4iKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RHcm91cFR5cGUoY3VycmVudEFydGlmYWN0LmdldEFydGlmYWN0R3JvdXBUeXBlKCkpOworCisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdFZlcnNpb24oY3VycmVudEFydGlmYWN0LmdldEFydGlmYWN0VmVyc2lvbigpKTsKKworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VVVJRCgpICE9IG51bGwgJiYgIWFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFVVSUQoKS5pc0VtcHR5KCkgJiYgIWN1cnJlbnRBcnRpZmFjdC5nZXRBcnRpZmFjdFVVSUQoKS5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VVVJRCgpKSkgeworCQkJbG9nLmRlYnVnKCJhcnRpZmFjdCBVVUlEIGNhbm5vdCBiZSBzZXQuIGlnbm9yaW5nLiIpOworCQl9CisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdFVVSUQoY3VycmVudEFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpKTsKKworCQlpZiAoKGFydGlmYWN0SW5mby5nZXRIZWF0UGFyYW1ldGVycygpICE9IG51bGwpICYmIChjdXJyZW50QXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKSAhPSBudWxsKSAmJiAhYXJ0aWZhY3RJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpICYmICFjdXJyZW50QXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpIHsKKwkJCWNoZWNrQW5kU2V0VW51cGRhdGFibGVIZWF0UGFyYW1zKGFydGlmYWN0SW5mby5nZXRIZWF0UGFyYW1ldGVycygpLCBjdXJyZW50QXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXRVbnVwZGF0YWJsZUhlYXRQYXJhbXMoTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMsIExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGN1cnJlbnRQYXJhbWV0ZXJzKSB7CisKKwkJTWFwPFN0cmluZywgSGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGN1cnJlbnRQYXJhbWV0ZXJzTWFwID0gZ2V0TWFwT2ZQYXJhbWV0ZXJzKGN1cnJlbnRQYXJhbWV0ZXJzKTsKKwkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwYXJhbWV0ZXIgOiBoZWF0UGFyYW1ldGVycykgeworCQkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gY3VycmVudFBhcmFtID0gY3VycmVudFBhcmFtZXRlcnNNYXAuZ2V0KHBhcmFtZXRlci5nZXRVbmlxdWVJZCgpKTsKKworCQkJaWYgKGN1cnJlbnRQYXJhbSAhPSBudWxsKSB7CisKKwkJCQlpZiAocGFyYW1ldGVyLmdldE5hbWUoKSAhPSBudWxsICYmICFwYXJhbWV0ZXIuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudFBhcmFtLmdldE5hbWUoKSkpIHsKKwkJCQkJbG9nLmRlYnVnKCJoZWF0IHBhcmFtZXRlciBuYW1lIGNhbm5vdCBiZSB1cGRhdGVkICAoe30pLiBpZ25vcmluZy4iLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKKwkJCQkJcGFyYW1ldGVyLnNldE5hbWUoY3VycmVudFBhcmFtLmdldE5hbWUoKSk7CisJCQkJfQorCQkJCWlmIChwYXJhbWV0ZXIuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCAmJiAhcGFyYW1ldGVyLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudFBhcmFtLmdldERlZmF1bHRWYWx1ZSgpKSkgeworCQkJCQlsb2cuZGVidWcoImhlYXQgcGFyYW1ldGVyIGRlZmF1bHRWYWx1ZSBjYW5ub3QgYmUgdXBkYXRlZCAgKHt9KS4gaWdub3JpbmcuIiwgcGFyYW1ldGVyLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCQkJcGFyYW1ldGVyLnNldERlZmF1bHRWYWx1ZShjdXJyZW50UGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJCX0KKwkJCQlpZiAocGFyYW1ldGVyLmdldFR5cGUoKSAhPSBudWxsICYmICFwYXJhbWV0ZXIuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudFBhcmFtLmdldFR5cGUoKSkpIHsKKwkJCQkJbG9nLmRlYnVnKCJoZWF0IHBhcmFtZXRlciB0eXBlIGNhbm5vdCBiZSB1cGRhdGVkICAoe30pLiBpZ25vcmluZy4iLCBwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKKwkJCQkJcGFyYW1ldGVyLnNldFR5cGUoY3VycmVudFBhcmFtLmdldFR5cGUoKSk7CisJCQkJfQorCQkJCWlmIChwYXJhbWV0ZXIuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsICYmICFwYXJhbWV0ZXIuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHNJZ25vcmVDYXNlKGN1cnJlbnRQYXJhbS5nZXREZXNjcmlwdGlvbigpKSkgeworCQkJCQlsb2cuZGVidWcoImhlYXQgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIGNhbm5vdCBiZSB1cGRhdGVkICAoe30pLiBpZ25vcmluZy4iLCBwYXJhbWV0ZXIuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQkJCXBhcmFtZXRlci5zZXREZXNjcmlwdGlvbihjdXJyZW50UGFyYW0uZ2V0RGVzY3JpcHRpb24oKSk7CisJCQkJfQorCisJCQkJLy8gY2hlY2sgYW5kIHNldCBjdXJyZW50IHZhbHVlCisJCQkJaWYgKChwYXJhbWV0ZXIuZ2V0Q3VycmVudFZhbHVlKCkgPT0gbnVsbCkgJiYgKGN1cnJlbnRQYXJhbS5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSkgeworCQkJCQlsb2cuZGVidWcoImhlYXQgcGFyYW1ldGVyIGN1cnJlbnQgdmFsdWUgaXMgbnVsbC4gc2V0IGl0IHRvIGRlZmF1bHQgdmFsdWUge30pLiBpZ25vcmluZy4iLCBwYXJhbWV0ZXIuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJCQlwYXJhbWV0ZXIuc2V0Q3VycmVudFZhbHVlKGN1cnJlbnRQYXJhbS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gZ2V0TWFwT2ZQYXJhbWV0ZXJzKExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGN1cnJlbnRQYXJhbWV0ZXJzKSB7CisKKwkJTWFwPFN0cmluZywgSGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGN1cnJlbnRQYXJhbXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHBhcmFtIDogY3VycmVudFBhcmFtZXRlcnMpIHsKKwkJCWN1cnJlbnRQYXJhbXNNYXAucHV0KHBhcmFtLmdldFVuaXF1ZUlkKCksIHBhcmFtKTsKKwkJfQorCQlyZXR1cm4gY3VycmVudFBhcmFtc01hcDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRTZXJ2aWNlQXBpVXJsKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8pIHsKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eShhcnRpZmFjdEluZm8uZ2V0QXBpVXJsKCkpKSB7CisJCQlsb2cuZGVidWcoIkFydGlmYWN0IHVybCBjYW5ub3QgYmUgZW1wdHkuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLCBBUlRJRkFDVF9VUkwpKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0QXBpVXJsKGFydGlmYWN0SW5mby5nZXRBcGlVcmwoKS50b0xvd2VyQ2FzZSgpKTsKKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVybChhcnRpZmFjdEluZm8uZ2V0QXBpVXJsKCkpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9TRVJWSUNFX0FQSV9VUkwpKTsKKwkJfQorCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVybExlbmd0aChhcnRpZmFjdEluZm8uZ2V0QXBpVXJsKCkpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuRVhDRUVEU19MSU1JVCwgQVJUSUZBQ1RfVVJMLCBTdHJpbmcudmFsdWVPZihWYWxpZGF0aW9uVXRpbHMuQVBJX1VSTF9MRU5HVEgpKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kQ2xlYW5EZXNjcmlwdGlvbihBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvKSB7CisJCWlmIChhcnRpZmFjdEluZm8uZ2V0RGVzY3JpcHRpb24oKSA9PSBudWxsIHx8IGFydGlmYWN0SW5mby5nZXREZXNjcmlwdGlvbigpLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCBkZXNjcmlwdGlvbiBjYW5ub3QgYmUgZW1wdHkuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLCBBUlRJRkFDVF9ERVNDUklQVElPTikpOworCQl9CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGFydGlmYWN0SW5mby5nZXREZXNjcmlwdGlvbigpOworCQlkZXNjcmlwdGlvbiA9IFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKGRlc2NyaXB0aW9uKTsKKwkJZGVzY3JpcHRpb24gPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlV2hpdGVzcGFjZShkZXNjcmlwdGlvbik7CisJCWRlc2NyaXB0aW9uID0gVmFsaWRhdGlvblV0aWxzLnN0cmlwT2N0ZXRzKGRlc2NyaXB0aW9uKTsKKwkJZGVzY3JpcHRpb24gPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlSHRtbFRhZ3NPbmx5KGRlc2NyaXB0aW9uKTsKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJc0VuZ2xpc2goZGVzY3JpcHRpb24pKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVMZW5ndGgoZGVzY3JpcHRpb24sIFZhbGlkYXRpb25VdGlscy5BUlRJRkFDVF9ERVNDUklQVElPTl9NQVhfTEVOR1RIKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkVYQ0VFRFNfTElNSVQsIEFSVElGQUNUX0RFU0NSSVBUSU9OLCBTdHJpbmcudmFsdWVPZihWYWxpZGF0aW9uVXRpbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCkpKTsKKwkJfQorCQlhcnRpZmFjdEluZm8uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUFydGlmYWN0Rmxvdyhvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgcGFyZW50LCBTdHJpbmcgcGFyZW50SWQsIFN0cmluZyBhcnRpZmFjdElkLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBVc2VyIHVzZXIsIGJ5dGVbXSBkZWNvZGVkUGF5bG9hZCwKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgU3RyaW5nIGludGVyZmFjZVR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lKSB7CisJCUVTQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IGNyZWF0ZUVzQXJ0aWZhY3REYXRhKGFydGlmYWN0SW5mbywgZGVjb2RlZFBheWxvYWQpOworCQlTdHJpbmcgcHJldkFydGlmYWN0SWQgPSBudWxsOworCQlTdHJpbmcgY3VyckFydGlmYWN0SWQgPSBhcnRpZmFjdElkOworCisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+IGluc2lkZUVpdGhlciA9IG51bGw7CisKKwkJaWYgKGFydGlmYWN0RGF0YSA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwgIlVwZGF0ZSBBcnRpZmFjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIlVwZGF0ZSBBcnRpZmFjdCIpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGFydGlmYWN0IG9iamVjdCBmb3IgRVMuIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnRJZCwgdXNlciwgYXJ0aWZhY3RJbmZvLCBwcmV2QXJ0aWZhY3RJZCwgY3VyckFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJldHVybiByZXN1bHRPcDsKKwkJfQorCQlsb2cuZGVidWcoIlRyeSB0byB1cGRhdGUgZW50cnkgb24gZ3JhcGgiKTsKKwkJU3RyaW5nIGFydGlmYWN0VW5pcXVlSWQgPSBudWxsOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gbnVsbDsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisKKwkJYm9vbGVhbiBpc0xlZnQgPSBmYWxzZTsKKwkJaWYgKGludGVyZmFjZVR5cGUgIT0gbnVsbCAmJiBvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKKwkJCS8vIGxpZmVjeWNsZSBhcnRpZmFjdAorCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGNvbnZlcnRUb09wZXJhdGlvbihhcnRpZmFjdEluZm8sIG9wZXJhdGlvbk5hbWUpOworCisJCQlFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBpbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24udXBkYXRlSW50ZXJmYWNlT3BlcmF0aW9uKHBhcmVudElkLCBpbnRlcmZhY2VUeXBlLCBvcGVyYXRpb25OYW1lLCBvcGVyYXRpb24pOworCisJCQlpc0xlZnQgPSByZXN1bHQuaXNMZWZ0KCk7CisJCQlpZiAoaXNMZWZ0KSB7CisJCQkJYXJ0aWZhY3RVbmlxdWVJZCA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCQkJCWFydGlmYWN0RGVmaW5pdGlvbiA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXRJbXBsZW1lbnRhdGlvbigpOworCisJCQkJaW5zaWRlRWl0aGVyID0gRWl0aGVyLnJpZ2h0KHJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdChpbnNpZGVFaXRoZXIpOworCQkJfSBlbHNlIHsKKwkJCQllcnJvciA9IHJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCU5vZGVUeXBlRW51bSBjb252ZXJ0UGFyZW50VHlwZSA9IGNvbnZlcnRQYXJlbnRUeXBlKGNvbXBvbmVudFR5cGUpOworCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gYXJ0aWZhY3RPcGVyYXRpb24udXBkYXRlQXJpZmFjdE9uUmVzb3VyY2UoYXJ0aWZhY3RJbmZvLCBwYXJlbnRJZCwgYXJ0aWZhY3RJZCwgY29udmVydFBhcmVudFR5cGUsIHRydWUpOworCQkJaXNMZWZ0ID0gcmVzdWx0LmlzTGVmdCgpOworCQkJaWYgKGlzTGVmdCkgeworCQkJCWFydGlmYWN0VW5pcXVlSWQgPSByZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQlhcnRpZmFjdERlZmluaXRpb24gPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlpbnNpZGVFaXRoZXIgPSBFaXRoZXIubGVmdChyZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdE9wID0gRWl0aGVyLmxlZnQoaW5zaWRlRWl0aGVyKTsKKwkJCX0gZWxzZSB7CisJCQkJZXJyb3IgPSByZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJfQorCQl9CisJCWlmIChpc0xlZnQpIHsKKwkJCWxvZy5kZWJ1ZygiRW50eSBvbiBncmFwaCBpcyB1cGRhdGVkLiBVcGRhdGUgYXJ0aWZhY3QgaW4gRVMiKTsKKwkJCWJvb2xlYW4gcmVzOworCQkJLy8gQ2hhbmdpbmcgcHJldmlvdXMgYW5kIGN1cnJlbnQgYXJ0aWZhY3RJZCBmb3IgYXVkaXRpbmcKKwkJCXByZXZBcnRpZmFjdElkID0gY3VyckFydGlmYWN0SWQ7CisJCQljdXJyQXJ0aWZhY3RJZCA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCisJCQlpZiAoIWFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLmVxdWFscyhhcnRpZmFjdElkKSkgeworCQkJCS8vIGRpZmZlcmVudCBpZHMgPT0+IGFydGlmYWN0IG5vZGUgd2FzIGNsb25lZCAuCisJCQkJLy8gaWYgbm8gZGF0YSBpbiByZXF1ZXN0IGdldCBmcm9tIEVTCisJCQkJaWYgKGRlY29kZWRQYXlsb2FkID09IG51bGwpIHsKKwkJCQkJaWYgKCFhcnRpZmFjdERlZmluaXRpb24uZ2V0TWFuZGF0b3J5KCkgfHwgYXJ0aWZhY3REZWZpbml0aW9uLmdldEVzSWQoKSAhPSBudWxsKSB7CisJCQkJCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RGcm9tQ2Fzc2FuZHJhID0gYXJ0aWZhY3RDYXNzYW5kcmFEYW8uZ2V0QXJ0aWZhY3QoYXJ0aWZhY3RJZCk7CisJCQkJCQkvLyBFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPgorCQkJCQkJLy8gYXJ0aWZhY3Rmcm9tRVMgPSBkYW9VcGxvYWRlci5nZXRBcnRpZmFjdChhcnRpZmFjdElkKTsKKwkJCQkJCWlmIChhcnRpZmFjdEZyb21DYXNzYW5kcmEuaXNSaWdodCgpKSB7CisJCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGFydGlmYWN0IGRhdGEgZnJvbSBFUyBmb3IgYXJ0aWZhY3QgaWQgIHt9IiwgYXJ0aWZhY3RJZCk7CisJCQkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlU3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRDYXNzYW5kcmFTdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYXJ0aWZhY3RGcm9tQ2Fzc2FuZHJhLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMpKTsKKwkJCQkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnRJZCwgdXNlciwgYXJ0aWZhY3RJbmZvLCBwcmV2QXJ0aWZhY3RJZCwgY3VyckFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJCQkJfQorCQkJCQkJLy8gY2xvbmUgZGF0YSB0byBuZXcgYXJ0aWZhY3QKKwkJCQkJCWFydGlmYWN0RGF0YS5zZXREYXRhKGFydGlmYWN0RnJvbUNhc3NhbmRyYS5sZWZ0KCkudmFsdWUoKS5nZXREYXRhKCkpOworCQkJCQl9CisJCQkJfQorCQkJCWFydGlmYWN0RGF0YS5zZXRJZChhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQkJLy8gY3JlYXRlIG5ldyBlbnRyeSBpbiBFUworCQkJCXJlcyA9IHRydWU7CisJCQkJaWYgKGFydGlmYWN0RGF0YS5nZXREYXRhKCkgIT0gbnVsbCkgeworCQkJCQlyZXMgPSBzYXZlQXJ0aWZhY3RzKGFydGlmYWN0RGF0YSwgcGFyZW50SWQsIGZhbHNlKTsKKwkJCQkJLy8gc2V0IG9uIGdyYXBoIG9iamVjdCBpZCBvZiBhcnRpZmFjdCBpbiBFUyEKKwkJCQkJaWYgKHJlcykgeworCQkJCQkJYXJ0aWZhY3RJbmZvLnNldEVzSWQoYXJ0aWZhY3REYXRhLmdldElkKCkpOworCQkJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQXJpZmFjdFJlcyA9IGFydGlmYWN0T3BlcmF0aW9uLnVwZGF0ZUFyaWZhY3REZWZpbml0aW9uKGFydGlmYWN0SW5mbywgdHJ1ZSk7CisJCQkJCQlpZiAodXBkYXRlQXJpZmFjdFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgYXJ0aWZhY3Qgb24gZ3JhcGggIC0ge30iLCBhcnRpZmFjdElkKTsKKwkJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UodXBkYXRlQXJpZmFjdFJlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnRJZCwgdXNlciwgYXJ0aWZhY3RJbmZvLCBwcmV2QXJ0aWZhY3RJZCwgY3VyckFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCQkJcmV0dXJuIHJlc3VsdE9wOworCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWluc2lkZUVpdGhlciA9IEVpdGhlci5sZWZ0KHVwZGF0ZUFyaWZhY3RSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCQkJCXJlc3VsdE9wID0gRWl0aGVyLmxlZnQoaW5zaWRlRWl0aGVyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmVzID0gdHJ1ZTsKKwkJCQlpZiAoYXJ0aWZhY3REYXRhLmdldERhdGEoKSAhPSBudWxsKSB7CisJCQkJCS8vIG92ZXJyaWRlIGFydGlmYWN0IGluIEVTCisJCQkJCXJlcyA9IHNhdmVBcnRpZmFjdHMoYXJ0aWZhY3REYXRhLCBwYXJlbnRJZCwgdHJ1ZSk7CisJCQkJCWlmIChyZXMgJiYgYXJ0aWZhY3REZWZpbml0aW9uLmdldE1hbmRhdG9yeSgpKSB7CisJCQkJCQlhcnRpZmFjdEluZm8uc2V0RXNJZChhcnRpZmFjdERhdGEuZ2V0SWQoKSk7CisJCQkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBcmlmYWN0UmVzID0gYXJ0aWZhY3RPcGVyYXRpb24udXBkYXRlQXJpZmFjdERlZmluaXRpb24oYXJ0aWZhY3RJbmZvLCB0cnVlKTsKKwkJCQkJCWlmICh1cGRhdGVBcmlmYWN0UmVzLmlzUmlnaHQoKSkgeworCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBhcnRpZmFjdCBvbiBncmFwaCAgLSB7fSIsIGFydGlmYWN0SWQpOworCQkJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlBcnRpZmFjdElkKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSh1cGRhdGVBcmlmYWN0UmVzLnJpZ2h0KCkudmFsdWUoKSksIGFydGlmYWN0SWQpOworCQkJCQkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBhcnRpZmFjdEluZm8sIHByZXZBcnRpZmFjdElkLCBjdXJyQXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJCQkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChyZXMpIHsKKwkJCQlsb2cuZGVidWcoIkFydGlmYWN0IHNhdmVkIGludG8gRVMgLSB7fSIsIGFydGlmYWN0VW5pcXVlSWQpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIGFydGlmYWN0SW5mbywgcHJldkFydGlmYWN0SWQsIGN1cnJBcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQkJLy8gcmVzdWx0T3AgPSBFaXRoZXIubGVmdChyZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJCS8vIHJldHVybiByZXN1bHRPcDsKKwkJCX0gZWxzZSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsICJVcGRhdGUgQXJ0aWZhY3QiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiVXBkYXRlIEFydGlmYWN0Iik7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gc2F2ZSB0aGUgYXJ0aWZhY3QuIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBhcnRpZmFjdEluZm8sIHByZXZBcnRpZmFjdElkLCBjdXJyQXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkvLyByZXR1cm4gcmVzdWx0T3A7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgZW50cnkgb24gZ3JhcGggZm9yIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5QXJ0aWZhY3RJZChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZXJyb3IpLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBhcnRpZmFjdEluZm8sIHByZXZBcnRpZmFjdElkLCBjdXJyQXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJLy8gcmV0dXJuIHJlc3VsdE9wOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdE9wOworCX0KKworCXByaXZhdGUgRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZVBheWxvYWQoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgYm9vbGVhbiBpc0FydGlmYWN0TWV0YWRhdGFVcGRhdGUpIHsKKwkJbG9nLnRyYWNlKCJTdGFydGluZyBwYXlsb2FkIGhhbmRsaW5nIik7CisJCWJ5dGVbXSBwYXlsb2FkID0gYXJ0aWZhY3RJbmZvLmdldFBheWxvYWREYXRhKCk7CisJCWJ5dGVbXSBkZWNvZGVkUGF5bG9hZCA9IG51bGw7CisKKwkJaWYgKHBheWxvYWQgIT0gbnVsbCAmJiBwYXlsb2FkLmxlbmd0aCAhPSAwKSB7CisKKwkJCWRlY29kZWRQYXlsb2FkID0gQmFzZTY0LmRlY29kZUJhc2U2NChwYXlsb2FkKTsKKwkJCWlmIChkZWNvZGVkUGF5bG9hZC5sZW5ndGggPT0gMCkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRlY29kZSB0aGUgcGF5bG9hZC4iKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKworCQkJU3RyaW5nIGNoZWNrU3VtID0gR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlCeXRlQXJyYXkoZGVjb2RlZFBheWxvYWQpOworCQkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0Q2hlY2tzdW0oY2hlY2tTdW0pOworCQkJbG9nLnRyYWNlKCJDYWxjdWxhdGVkIGNoZWNrc3VtLCBiYXNlNjQgcGF5bG9hZDoge30sICBjaGVja3N1bToge30iLCBwYXlsb2FkLCBjaGVja1N1bSk7CisKKwkJCS8vIFNwZWNpZmljIHBheWxvYWQgdmFsaWRhdGlvbnMgb2YgZGlmZmVyZW50IHR5cGVzCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGlzVmFsaWRQYXlsb2FkID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCQlpZiAoaXNEZXBsb3ltZW50QXJ0aWZhY3QoYXJ0aWZhY3RJbmZvKSkgeworCQkJCWxvZy50cmFjZSgiU3RhcnRpbmcgZGVwbG95bWVudCBhcnRpZmFjdHMgcGF5bG9hZCB2YWxpZGF0aW9uIik7CisJCQkJU3RyaW5nIGFydGlmYWN0VHlwZSA9IGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKTsKKwkJCQlpZiAoQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKGFydGlmYWN0VHlwZSkgfHwgQXJ0aWZhY3RUeXBlRW51bS5IRUFUX1ZPTC5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFR5cGUpIHx8IEFydGlmYWN0VHlwZUVudW0uSEVBVF9ORVQuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RUeXBlKQorCQkJCQkJfHwgQXJ0aWZhY3RUeXBlRW51bS5IRUFUX0VOVi5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFR5cGUpKSB7CisJCQkJCWlzVmFsaWRQYXlsb2FkID0gdmFsaWRhdGVEZXBsb3ltZW50SGVhdFBheWxvYWQoZGVjb2RlZFBheWxvYWQsIGFydGlmYWN0VHlwZSk7CisJCQkJCWlmIChpc1ZhbGlkUGF5bG9hZC5pc0xlZnQoKSkgeworCQkJCQkJaXNWYWxpZFBheWxvYWQgPSBleHRyYWN0SGVhdFBhcmFtZXRlcnMoYXJ0aWZhY3RJbmZvKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoQXJ0aWZhY3RUeXBlRW51bS5ZQU5HX1hNTC5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFR5cGUpIHx8IEFydGlmYWN0VHlwZUVudW0uVk5GX0NBVEFMT0cuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RUeXBlKSB8fCBBcnRpZmFjdFR5cGVFbnVtLlZGX0xJQ0VOU0UuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RUeXBlKQorCQkJCQkJfHwgQXJ0aWZhY3RUeXBlRW51bS5WRU5ET1JfTElDRU5TRS5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFR5cGUpIHx8IEFydGlmYWN0VHlwZUVudW0uTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEUuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RUeXBlKQorCQkJCQkJfHwgQXJ0aWZhY3RUeXBlRW51bS5NT0RFTF9RVUVSWV9TUEVDLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKGFydGlmYWN0VHlwZSkpIHsKKwkJCQkJaXNWYWxpZFBheWxvYWQgPSB2YWxpZGF0ZVlhbmdQYXlsb2FkKGRlY29kZWRQYXlsb2FkLCBhcnRpZmFjdFR5cGUpOworCQkJCQkvLyBlbHNlCisJCQkJCS8vIGlmKEFydGlmYWN0VHlwZUVudW0uQVBQQ19DT05GSUcuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RUeXBlKQorCQkJCQkvLyB8fCApeworCQkJCX0gZWxzZSBpZiAoQXJ0aWZhY3RUeXBlRW51bS5EQ0FFX0lOVkVOVE9SWV9KU09OLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKGFydGlmYWN0VHlwZSkgfHwgQXJ0aWZhY3RUeXBlRW51bS5EQ0FFX0lOVkVOVE9SWV9UT1NDQS5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFR5cGUpKSB7CisJCQkJCVN0cmluZyBhcnRpZmFjdEZpbGVOYW1lID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpOworCQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IEdlbmVyYWxVdGlsaXR5LmdldEZpbGVuYW1lRXh0ZW5zaW9uKGFydGlmYWN0RmlsZU5hbWUpLnRvTG93ZXJDYXNlKCk7CisJCQkJCXN3aXRjaCAoZmlsZUV4dGVuc2lvbikgeworCQkJCQljYXNlICJ4bWwiOgorCQkJCQkJaXNWYWxpZFBheWxvYWQgPSB2YWxpZGF0ZVlhbmdQYXlsb2FkKGRlY29kZWRQYXlsb2FkLCBhcnRpZmFjdFR5cGUpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgImpzb24iOgorCQkJCQkJaXNWYWxpZFBheWxvYWQgPSB2YWxpZGF0ZUpzb25QYXlsb2FkKGRlY29kZWRQYXlsb2FkLCBhcnRpZmFjdFR5cGUpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgInltbCI6CisJCQkJCWNhc2UgInlhbWwiOgorCQkJCQkJaXNWYWxpZFBheWxvYWQgPSB2YWxpZGF0ZVltbFBheWxvYWQoZGVjb2RlZFBheWxvYWQsIGFydGlmYWN0VHlwZSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChpc1ZhbGlkUGF5bG9hZC5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGlzVmFsaWRQYXlsb2FkLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKworCQl9IC8vIG51bGwvZW1wdHkgcGF5bG9hZCBpcyBub3JtYWwgaWYgY2FsbGVkIGZyb20gbWV0YWRhdGEgdXBkYXRlIE9OTFkuCisJCQkvLyBUaGUgdmFsaWRhdGlvbiBvZiB3aGV0aGVyIHRoaXMgaXMgbWV0YWRhdGEvcGF5bG9hZCB1cGRhdGUgY2FzZSBpcworCQkJLy8gY3VycmVudGx5IGRvbmUgc2VwYXJhdGVseQorCQllbHNlIHsKKwkJCWlmICghaXNBcnRpZmFjdE1ldGFkYXRhVXBkYXRlKSB7CisJCQkJbG9nLmRlYnVnKCJQYXlsb2FkIGlzIG1pc3NpbmcuIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQSwgQVJUSUZBQ1RfUEFZTE9BRCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0KKwkJbG9nLnRyYWNlKCJFbmRlZCBwYXlsb2FkIGhhbmRsaW5nIik7CisJCXJldHVybiBFaXRoZXIubGVmdChkZWNvZGVkUGF5bG9hZCk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlRGVwbG95bWVudEhlYXRQYXlsb2FkKGJ5dGVbXSBwYXlsb2FkLCBTdHJpbmcgYXJ0aWZhY3RUeXBlKSB7CisJCS8vIEJhc2ljIFlBTUwgdmFsaWRhdGlvbgorCQlZYW1sVG9PYmplY3RDb252ZXJ0ZXIgeWFtbFRvT2JqZWN0Q29udmVydGVyID0gbmV3IFlhbWxUb09iamVjdENvbnZlcnRlcigpOworCQlpZiAoIXlhbWxUb09iamVjdENvbnZlcnRlci5pc1ZhbGlkWWFtbChwYXlsb2FkKSkgeworCQkJbG9nLmRlYnVnKCJJbnZhbGlkIFlBTUwgZm9ybWF0Iik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MLCBhcnRpZmFjdFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJaWYgKCFBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKGFydGlmYWN0VHlwZSkpIHsKKwkJCS8vIEhFQVQgc3BlY2lmaWMgWUFNTCB2YWxpZGF0aW9uCisJCQlEZXBsb3ltZW50QXJ0aWZhY3RIZWF0Q29uZmlndXJhdGlvbiBoZWF0Q29uZmlndXJhdGlvbiA9IHlhbWxUb09iamVjdENvbnZlcnRlci5jb252ZXJ0KHBheWxvYWQsIERlcGxveW1lbnRBcnRpZmFjdEhlYXRDb25maWd1cmF0aW9uLmNsYXNzKTsKKwkJCWlmIChoZWF0Q29uZmlndXJhdGlvbiA9PSBudWxsIHx8IGhlYXRDb25maWd1cmF0aW9uLmdldEhlYXRfdGVtcGxhdGVfdmVyc2lvbigpID09IG51bGwgfHwgaGVhdENvbmZpZ3VyYXRpb24uZ2V0UmVzb3VyY2VzKCkgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiSEVBVCBkb2Vzbid0IGNvbnRhaW4gcmVxdWlyZWQgXCJoZWF0X3RlbXBsYXRlX3ZlcnNpb25cIiBhbmQgXCJyZXNvdXJjZXNcIiBzZWN0aW9ucyAiKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ERVBMT1lNRU5UX0FSVElGQUNUX0hFQVQsIGFydGlmYWN0VHlwZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlWW1sUGF5bG9hZChieXRlW10gZGVjb2RlZFBheWxvYWQsIFN0cmluZyBhcnRpZmFjdFR5cGUpIHsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiByZXMgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJWWFtbFRvT2JqZWN0Q29udmVydGVyIHlhbWxUb09iamVjdENvbnZlcnRlciA9IG5ldyBZYW1sVG9PYmplY3RDb252ZXJ0ZXIoKTsKKwkJaWYgKCF5YW1sVG9PYmplY3RDb252ZXJ0ZXIuaXNWYWxpZFlhbWwoZGVjb2RlZFBheWxvYWQpKSB7CisJCQlsb2cuZGVidWcoIkludmFsaWQgWUFNTCBmb3JtYXQiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUwsIGFydGlmYWN0VHlwZSk7CisJCQlyZXMgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVZYW5nUGF5bG9hZChieXRlW10gcGF5bG9hZCwgU3RyaW5nIGFydGlmYWN0VHlwZSkgeworCQlib29sZWFuIGlzWG1sVmFsaWQgPSBpc1ZhbGlkWG1sKHBheWxvYWQpOworCQlpZiAoIWlzWG1sVmFsaWQpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfWE1MLCBhcnRpZmFjdFR5cGUpOworCQkJbG9nLmRlYnVnKCJJbnZhbGlkIFhNTCBjb250ZW50Iik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlSnNvblBheWxvYWQoYnl0ZVtdIHBheWxvYWQsIFN0cmluZyB0eXBlKSB7CisJCWJvb2xlYW4gaXNKc29uVmFsaWQgPSBpc1ZhbGlkSnNvbihwYXlsb2FkKTsKKwkJaWYgKCFpc0pzb25WYWxpZCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBSZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9KU09OLCB0eXBlKTsKKwkJCWxvZy5kZWJ1ZygiSW52YWxpZCBKU09OIGNvbnRlbnQiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBoYW5kbGVUcmFuc2FjdGlvbihFaXRoZXI8T3BlcmF0aW9uLCBSZXNwb25zZUZvcm1hdD4gb3BTdGF0ZSkgeworCQlpZiAob3BTdGF0ZSA9PSBudWxsIHx8IG9wU3RhdGUuaXNSaWdodCgpKSB7CisJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJfSBlbHNlIHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8T3BlcmF0aW9uLCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlQXJ0aWZhY3RCeUludGVyZmFjZShTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGludGVyZmFjZVR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgSW1tdXRhYmxlUGFpcjxVc2VyLCBSZXNvdXJjZT4gdXNlclJlc291cmNlQXVkaXRQYWlyLCBib29sZWFuIHNob3VsZExvY2ssCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQodXNlcklkKTsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnQgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZUlkKTsKKwkJaWYgKHBhcmVudC5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShwYXJlbnQucmlnaHQoKS52YWx1ZSgpKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZURlbGV0ZSA9IGhhbmRsZURlbGV0ZShyZXNvdXJjZUlkLCBhcnRpZmFjdElkLCB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfREVMRVRFLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgcGFyZW50LmxlZnQoKS52YWx1ZSgpLCBpbnRlcmZhY2VUeXBlLCBvcGVyYXRpb25OYW1lLAorCQkJCWZhbHNlLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGhhbmRsZURlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoaGFuZGxlRGVsZXRlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiByZXN1bHQgPSBoYW5kbGVEZWxldGUubGVmdCgpLnZhbHVlKCk7CisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKworCX0KKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUFsbENvbXBvbmVudEFydGlmYWN0c0lmTm90T25HcmFwaChMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzKSB7CisKKwkJaWYgKGFydGlmYWN0cyAhPSBudWxsICYmICFhcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gOiBhcnRpZmFjdHMpIHsKKwkJCQlTdHJpbmcgZXNJZCA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCk7CisJCQkJaWYgKGVzSWQgIT0gbnVsbCAmJiAhZXNJZC5pc0VtcHR5KCkpIHsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkZWxldGVJZk5vdE9uR3JhcGggPSBkZWxldGVJZk5vdE9uR3JhcGgoYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIGVzSWQsIGZhbHNlKTsKKwkJCQkJaWYgKCFkZWxldGVJZk5vdE9uR3JhcGguZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCQlyZXR1cm4gZGVsZXRlSWZOb3RPbkdyYXBoOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgT3BlcmF0aW9uIGNvbnZlcnRUb09wZXJhdGlvbihBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSkgeworCQlPcGVyYXRpb24gb3AgPSBuZXcgT3BlcmF0aW9uKCk7CisJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlvcC5zZXRDcmVhdGlvbkRhdGUodGltZSk7CisKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9IGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0TmFtZShjcmVhdGVJbnRlcmZhY2VBcnRpZmFjdE5hbWVGcm9tT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUsIGFydGlmYWN0TmFtZSkpOworCisJCW9wLnNldEltcGxlbWVudGF0aW9uKGFydGlmYWN0SW5mbyk7CisJCW9wLnNldExhc3RVcGRhdGVEYXRlKHRpbWUpOworCQlyZXR1cm4gb3A7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY3JlYXRlSW50ZXJmYWNlQXJ0aWZhY3ROYW1lRnJvbU9wZXJhdGlvbihTdHJpbmcgb3BlcmF0aW9uTmFtZSwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQlTdHJpbmcgbmV3QXJ0aWZhY3ROYW1lID0gb3BlcmF0aW9uTmFtZSArICJfIiArIGFydGlmYWN0TmFtZTsKKwkJbG9nLnRyYWNlKCJjb252ZXJ0aW5nIGFydGlmYWN0IG5hbWUge30gdG8ge30iLCBhcnRpZmFjdE5hbWUsIG5ld0FydGlmYWN0TmFtZSk7CisJCXJldHVybiBuZXdBcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGVsZXRlSWZOb3RPbkdyYXBoKFN0cmluZyBhcnRpZmFjdElkLCBTdHJpbmcgYXJ0aWZhY3RFc0lkLCBib29sZWFuIGRlbGV0ZU9ubHlQYXlsb2FkKSB7CisJCWxvZy5kZWJ1ZygiZGVsZXRlSWZOb3RPbkdyYXBoOiBkZWxldGUgb25seSBwYXlsb2FkID0ge30iLCBkZWxldGVPbmx5UGF5bG9hZCk7CisJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGVja0FydGlmYWN0Tm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiksIGFydGlmYWN0SWQsIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWlmICgoYXJ0aWZhY3RFc0lkICE9IG51bGwgJiYgIWFydGlmYWN0RXNJZC5pc0VtcHR5KCkpKSB7CisJCQlib29sZWFuIGlzTm90RXhpc3RPbkdyYXBoID0gY2hlY2tBcnRpZmFjdE5vZGUuaXNSaWdodCgpICYmIGNoZWNrQXJ0aWZhY3ROb2RlLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKworCQkJaWYgKChpc05vdEV4aXN0T25HcmFwaCkgfHwgKGNoZWNrQXJ0aWZhY3ROb2RlLmxlZnQoKS52YWx1ZSgpLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRNYW5kYXRvcnkoKSAmJiBkZWxldGVPbmx5UGF5bG9hZCkKKwkJCQkJfHwgKEFydGlmYWN0R3JvdXBUeXBlRW51bS5TRVJWSUNFX0FQSS5lcXVhbHMoY2hlY2tBcnRpZmFjdE5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0R3JvdXBUeXBlKCkpICYmIGRlbGV0ZU9ubHlQYXlsb2FkKSkgeworCQkJCS8vIGxhc3Qgb25lLiBuZWVkIHRvIGRlbGV0ZSBpbiBFUworCQkJCWxvZy5kZWJ1ZygiRW50cnkgb24gZ3JhcGggaXMgZGVsZXRlZC4gRGVsZXRlIGFydGlmYWN0IGluIEVTIGZvciBpZCA9IHt9IiwgYXJ0aWZhY3RFc0lkKTsKKwkJCQlhcnRpZmFjdENhc3NhbmRyYURhby5kZWxldGVBcnRpZmFjdChhcnRpZmFjdEVzSWQpOworCQkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJCS8vIHJldHVybgorCQkJCS8vIGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2VJZChBY3Rpb25TdGF0dXMuT0ssCisJCQkJLy8gcmVzb3VyY2VJZCk7CisKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJFbnRyeSBvbiBncmFwaCBpcyBkZWxldGVkLiBFeGlzdCBtb3JlIGNvbm5lY3Rpb25zIG9uIHRoaXMgYXJ0aWZhY3QuIERvbid0IGRlbGV0ZSBhcnRpZmFjdCBpbiBFUyBmb3IgaWQgPSB7fSIsIGFydGlmYWN0RXNJZCk7CisJCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisKKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwkvLyBkb3dubG9hZCBieSBNU08KKwlwdWJsaWMgRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IGRvd25sb2FkUnNyY0FydGlmYWN0QnlOYW1lcyhTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCisJCS8vIEdlbmVyYWwgdmFsaWRhdGlvbgorCQlpZiAoc2VydmljZU5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlVmVyc2lvbiA9PSBudWxsIHx8IHJlc291cmNlTmFtZSA9PSBudWxsIHx8IHJlc291cmNlVmVyc2lvbiA9PSBudWxsIHx8IGFydGlmYWN0TmFtZSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVyZXMgaXMgbnVsbCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisKKwkJLy8gTm9ybWFsaXppbmcgYXJ0aWZhY3QgbmFtZQorCQlhcnRpZmFjdE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplRmlsZU5hbWUoYXJ0aWZhY3ROYW1lKTsKKworCQkvLyBSZXNvdXJjZSB2YWxpZGF0aW9uCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VOYW1lQW5kVmVyc2lvbiA9IHZhbGlkYXRlUmVzb3VyY2VOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsIHJlc291cmNlVmVyc2lvbik7CisJCWlmICh2YWxpZGF0ZVJlc291cmNlTmFtZUFuZFZlcnNpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlUmVzb3VyY2VOYW1lQW5kVmVyc2lvbi5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSB2YWxpZGF0ZVJlc291cmNlTmFtZUFuZFZlcnNpb24ubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyByZXNvdXJjZUlkID0gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQkvLyBTZXJ2aWNlIHZhbGlkYXRpb24KKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVNlcnZpY2VOYW1lQW5kVmVyc2lvbiA9IHZhbGlkYXRlU2VydmljZU5hbWVBbmRWZXJzaW9uKHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbik7CisJCWlmICh2YWxpZGF0ZVNlcnZpY2VOYW1lQW5kVmVyc2lvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVTZXJ2aWNlTmFtZUFuZFZlcnNpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJEZXBsb3ltZW50IGFydGlmYWN0cyBvZiByZXNvdXJjZSB7fSBhcmUgbm90IGZvdW5kIiwgcmVzb3VyY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5ELCBhcnRpZmFjdE5hbWUpKTsKKwkJfQorCisJCUFydGlmYWN0RGVmaW5pdGlvbiBkZXBsb3ltZW50QXJ0aWZhY3QgPSBudWxsOworCisJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IGFydGlmYWN0cy52YWx1ZXMoKSkgeworCQkJaWYgKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKSAhPSBudWxsICYmIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKS5lcXVhbHMoYXJ0aWZhY3ROYW1lKSkgeworCQkJCWxvZy5kZWJ1ZygiRm91bmQgZGVwbG95bWVudCBhcnRpZmFjdCB7fSIsIGFydGlmYWN0TmFtZSk7CisJCQkJZGVwbG95bWVudEFydGlmYWN0ID0gYXJ0aWZhY3REZWZpbml0aW9uOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGRlcGxveW1lbnRBcnRpZmFjdCA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk5vIGRlcGxveW1lbnQgYXJ0aWZhY3Qge30gd2FzIGZvdW5kIGZvciByZXNvdXJjZSB7fSIsIGFydGlmYWN0TmFtZSwgcmVzb3VyY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5ELCBhcnRpZmFjdE5hbWUpKTsKKwkJfQorCisJCS8vIERvd25sb2FkaW5nIHRoZSBhcnRpZmFjdAorCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIGJ5dGVbXT4sIFJlc3BvbnNlRm9ybWF0PiBkb3dubG9hZEFydGlmYWN0RWl0aGVyID0gZG93bmxvYWRBcnRpZmFjdChkZXBsb3ltZW50QXJ0aWZhY3QpOworCQlpZiAoZG93bmxvYWRBcnRpZmFjdEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRG93bmxvYWQgYXJ0aWZhY3Qge30gZmFpbGVkIiwgYXJ0aWZhY3ROYW1lKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZG93bmxvYWRBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCWxvZy50cmFjZSgiRG93bmxvYWQgb2YgcmVzb3VyY2UgYXJ0aWZhY3Qgc3VjY2VlZGVkLCB1bmlxdWVJZCB7fSIsIGRlcGxveW1lbnRBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCkuZ2V0UmlnaHQoKSk7CisJfQorCisJLy8gZG93bmxvYWQgYnkgTVNPCisJcHVibGljIEVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBkb3dubG9hZFJzcmNJbnN0QXJ0aWZhY3RCeU5hbWVzKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHNlcnZpY2VWZXJzaW9uLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKworCQkvLyBHZW5lcmFsIHZhbGlkYXRpb24KKwkJaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgc2VydmljZVZlcnNpb24gPT0gbnVsbCB8fCByZXNvdXJjZUluc3RhbmNlTmFtZSA9PSBudWxsIHx8IGFydGlmYWN0TmFtZSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVyZXMgaXMgbnVsbCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisKKwkJLy8gTm9ybWFsaXppbmcgYXJ0aWZhY3QgbmFtZQorCQlhcnRpZmFjdE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplRmlsZU5hbWUoYXJ0aWZhY3ROYW1lKTsKKworCQkvLyBSZXNvdXJjZSB2YWxpZGF0aW9uCisJCS8qCisJCSAqIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VOYW1lQW5kVmVyc2lvbiA9IHZhbGlkYXRlUmVzb3VyY2VOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsIHJlc291cmNlVmVyc2lvbik7IGlmICh2YWxpZGF0ZVJlc291cmNlTmFtZUFuZFZlcnNpb24uaXNSaWdodCgpKSB7IHJldHVybgorCQkgKiBFaXRoZXIucmlnaHQodmFsaWRhdGVSZXNvdXJjZU5hbWVBbmRWZXJzaW9uLnJpZ2h0KCkudmFsdWUoKSk7IH0KKwkJICogCisJCSAqIFJlc291cmNlIHJlc291cmNlID0gdmFsaWRhdGVSZXNvdXJjZU5hbWVBbmRWZXJzaW9uLmxlZnQoKS52YWx1ZSgpOyBTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCSAqLworCisJCS8vIFNlcnZpY2UgdmFsaWRhdGlvbgorCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU2VydmljZU5hbWVBbmRWZXJzaW9uID0gdmFsaWRhdGVTZXJ2aWNlTmFtZUFuZFZlcnNpb24oc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uKTsKKwkJaWYgKHZhbGlkYXRlU2VydmljZU5hbWVBbmRWZXJzaW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVNlcnZpY2VOYW1lQW5kVmVyc2lvbi5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJU2VydmljZSBzZXJ2aWNlID0gdmFsaWRhdGVTZXJ2aWNlTmFtZUFuZFZlcnNpb24ubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gUmVzb3VyY2VJbnN0YW5jZSB2YWxpZGF0aW9uCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZSA9IHZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlLCByZXNvdXJjZUluc3RhbmNlTmFtZSk7CisJCWlmICh2YWxpZGF0ZVJlc291cmNlSW5zdGFuY2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IHZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZS5sZWZ0KCkudmFsdWUoKTsKKworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHJlc291cmNlSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCisJCWZpbmFsIFN0cmluZyBmaW5hbEFydGlmYWN0TmFtZSA9IGFydGlmYWN0TmFtZTsKKwkJUHJlZGljYXRlPEFydGlmYWN0RGVmaW5pdGlvbj4gZmlsdGVyQXJ0aWZhY3RCeU5hbWUgPSBwIC0+IHAuZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzKGZpbmFsQXJ0aWZhY3ROYW1lKTsKKworCQlib29sZWFuIGhhc0RlcGxveW1lbnRBcnRpZmFjdHMgPSBhcnRpZmFjdHMgIT0gbnVsbCAmJiBhcnRpZmFjdHMudmFsdWVzKCkuc3RyZWFtKCkuYW55TWF0Y2goZmlsdGVyQXJ0aWZhY3RCeU5hbWUpOworCQlBcnRpZmFjdERlZmluaXRpb24gZGVwbG95YWJsZUFydGlmYWN0OworCisJCWlmICghaGFzRGVwbG95bWVudEFydGlmYWN0cykgeworCQkJbG9nLmRlYnVnKCJEZXBsb3ltZW50IGFydGlmYWN0IHdpdGggbmFtZSB7fSBub3QgZm91bmQiLCBhcnRpZmFjdE5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORCwgYXJ0aWZhY3ROYW1lKSk7CisJCX0KKworCQlsb2cuZGVidWcoIkZvdW5kIGRlcGxveW1lbnQgYXJ0aWZhY3Qge30iLCBhcnRpZmFjdE5hbWUpOworCQlkZXBsb3lhYmxlQXJ0aWZhY3QgPSBhcnRpZmFjdHMudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKGZpbHRlckFydGlmYWN0QnlOYW1lKS5maW5kRmlyc3QoKS5nZXQoKTsKKwkJLy8gRG93bmxvYWRpbmcgdGhlIGFydGlmYWN0CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPiwgUmVzcG9uc2VGb3JtYXQ+IGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIgPSBkb3dubG9hZEFydGlmYWN0KGRlcGxveWFibGVBcnRpZmFjdCk7CisKKwkJaWYgKGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkRvd25sb2FkIGFydGlmYWN0IHt9IGZhaWxlZCIsIGFydGlmYWN0TmFtZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlsb2cudHJhY2UoIkRvd25sb2FkIG9mIHJlc291cmNlIGFydGlmYWN0IHN1Y2NlZWRlZCwgdW5pcXVlSWQge30iLCBkZXBsb3lhYmxlQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBFaXRoZXIubGVmdChkb3dubG9hZEFydGlmYWN0RWl0aGVyLmxlZnQoKS52YWx1ZSgpLmdldFJpZ2h0KCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVSZXNvdXJjZUluc3RhbmNlKFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lKSB7CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmlMaXN0ID0gc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSByaSA6IHJpTGlzdCkgeworCQkJaWYgKHJpLmdldE5vcm1hbGl6ZWROYW1lKCkuZXF1YWxzKHJlc291cmNlSW5zdGFuY2VOYW1lKSkKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORCwgcmVzb3VyY2VJbnN0YW5jZU5hbWUpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVTZXJ2aWNlTmFtZUFuZFZlcnNpb24oU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgc2VydmljZVZlcnNpb24pIHsKKworCQlFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZUxpc3RCeVN5c3RlbU5hbWUgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2VMaXN0QnlTeXN0ZW1OYW1lKHNlcnZpY2VOYW1lLCBmYWxzZSk7CisJCWlmIChzZXJ2aWNlTGlzdEJ5U3lzdGVtTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggYW55IHNlcnZpY2Ugd2l0aCBuYW1lIHt9Iiwgc2VydmljZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHNlcnZpY2VMaXN0QnlTeXN0ZW1OYW1lLnJpZ2h0KCkudmFsdWUoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSksIHNlcnZpY2VOYW1lKSk7CisJCX0KKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IHNlcnZpY2VMaXN0QnlTeXN0ZW1OYW1lLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoc2VydmljZUxpc3QgPT0gbnVsbCB8fCBzZXJ2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKwkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggYW55IHNlcnZpY2Ugd2l0aCBuYW1lIHt9Iiwgc2VydmljZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5ELCBzZXJ2aWNlTmFtZSkpOworCQl9CisKKwkJU2VydmljZSBmb3VuZFNlcnZpY2UgPSBudWxsOworCQlmb3IgKFNlcnZpY2Ugc2VydmljZSA6IHNlcnZpY2VMaXN0KSB7CisJCQlpZiAoc2VydmljZS5nZXRWZXJzaW9uKCkuZXF1YWxzKHNlcnZpY2VWZXJzaW9uKSkgeworCQkJCWxvZy50cmFjZSgiRm91bmQgc2VydmljZSB3aXRoIHZlcnNpb24ge30iLCBzZXJ2aWNlVmVyc2lvbik7CisJCQkJZm91bmRTZXJ2aWNlID0gc2VydmljZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZFNlcnZpY2UgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmaW5kIHZlcnNpb24ge30gZm9yIHNlcnZpY2Uge30iLCBzZXJ2aWNlVmVyc2lvbiwgc2VydmljZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9WRVJTSU9OX05PVF9GT1VORCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpLCBzZXJ2aWNlVmVyc2lvbikpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChmb3VuZFNlcnZpY2UpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVSZXNvdXJjZU5hbWVBbmRWZXJzaW9uKFN0cmluZyByZXNvdXJjZU5hbWUsIFN0cmluZyByZXNvdXJjZVZlcnNpb24pIHsKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUxpc3RCeVN5c3RlbU5hbWUgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZUxpc3RCeVN5c3RlbU5hbWUocmVzb3VyY2VOYW1lLCBmYWxzZSk7CisJCWlmIChyZXNvdXJjZUxpc3RCeVN5c3RlbU5hbWUuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZldGNoIGFueSByZXNvdXJjZSB3aXRoIG5hbWUge30iLCByZXNvdXJjZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc291cmNlTGlzdEJ5U3lzdGVtTmFtZS5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZU5hbWUpKTsKKwkJfQorCQlMaXN0PFJlc291cmNlPiByZXNvdXJjZUxpc3QgPSByZXNvdXJjZUxpc3RCeVN5c3RlbU5hbWUubGVmdCgpLnZhbHVlKCk7CisJCWlmIChyZXNvdXJjZUxpc3QgPT0gbnVsbCB8fCByZXNvdXJjZUxpc3QuaXNFbXB0eSgpKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZldGNoIGFueSByZXNvdXJjZSB3aXRoIG5hbWUge30iLCByZXNvdXJjZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCwgcmVzb3VyY2VOYW1lKSk7CisJCX0KKworCQlSZXNvdXJjZSBmb3VuZFJlc291cmNlID0gbnVsbDsKKwkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlTGlzdCkgeworCQkJaWYgKHJlc291cmNlLmdldFZlcnNpb24oKS5lcXVhbHMocmVzb3VyY2VWZXJzaW9uKSkgeworCQkJCWxvZy50cmFjZSgiRm91bmQgcmVzb3VyY2Ugd2l0aCB2ZXJzaW9uIHt9IiwgcmVzb3VyY2VWZXJzaW9uKTsKKwkJCQlmb3VuZFJlc291cmNlID0gcmVzb3VyY2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoZm91bmRSZXNvdXJjZSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZpbmQgdmVyc2lvbiB7fSBmb3IgcmVzb3VyY2Uge30iLCByZXNvdXJjZVZlcnNpb24sIHJlc291cmNlTmFtZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1ZFUlNJT05fTk9UX0ZPVU5ELCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpLCByZXNvdXJjZVZlcnNpb24pKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZm91bmRSZXNvdXJjZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdEJ5TmFtZXMoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgc2VydmljZVZlcnNpb24sIFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKwkJLy8gVmFsaWRhdGlvbgorCQlsb2cudHJhY2UoIlN0YXJ0aW5nIGRvd25sb2FkIG9mIHNlcnZpY2UgaW50ZXJmYWNlIGFydGlmYWN0LCBzZXJ2aWNlTmFtZSB7fSwgc2VydmljZVZlcnNpb24ge30sIGFydGlmYWN0IG5hbWUge30iLCBzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIGFydGlmYWN0TmFtZSk7CisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VWZXJzaW9uID09IG51bGwgfHwgYXJ0aWZhY3ROYW1lID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiT25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJlcyBpcyBudWxsIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKworCQkvLyBOb3JtYWxpemluZyBhcnRpZmFjdCBuYW1lCisJCWFydGlmYWN0TmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZShhcnRpZmFjdE5hbWUpOworCisJCS8vIFNlcnZpY2UgdmFsaWRhdGlvbgorCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU2VydmljZU5hbWVBbmRWZXJzaW9uID0gdmFsaWRhdGVTZXJ2aWNlTmFtZUFuZFZlcnNpb24oc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uKTsKKwkJaWYgKHZhbGlkYXRlU2VydmljZU5hbWVBbmRWZXJzaW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVNlcnZpY2VOYW1lQW5kVmVyc2lvbi5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IHZhbGlkYXRlU2VydmljZU5hbWVBbmRWZXJzaW9uLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisKKwkJLy8gTG9va2luZyBmb3IgZGVwbG95bWVudCBhcnRpZmFjdHMKKwkJU2VydmljZSBzZXJ2aWNlID0gdmFsaWRhdGVTZXJ2aWNlTmFtZUFuZFZlcnNpb24ubGVmdCgpLnZhbHVlKCk7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gc2VydmljZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQlsb2cuZGVidWcoIkRlcGxveW1lbnQgYXJ0aWZhY3RzIG9mIHNlcnZpY2Uge30gYXJlIG5vdCBmb3VuZCIsIHNlcnZpY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5ELCBhcnRpZmFjdE5hbWUpKTsKKwkJfQorCisJCUFydGlmYWN0RGVmaW5pdGlvbiBkZXBsb3ltZW50QXJ0aWZhY3QgPSBudWxsOworCisJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IGFydGlmYWN0cy52YWx1ZXMoKSkgeworCQkJaWYgKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKS5lcXVhbHMoYXJ0aWZhY3ROYW1lKSkgeworCQkJCWxvZy5kZWJ1ZygiRm91bmQgZGVwbG95bWVudCBhcnRpZmFjdCB7fSIsIGFydGlmYWN0TmFtZSk7CisJCQkJZGVwbG95bWVudEFydGlmYWN0ID0gYXJ0aWZhY3REZWZpbml0aW9uOworCQkJfQorCQl9CisKKwkJaWYgKGRlcGxveW1lbnRBcnRpZmFjdCA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk5vIGRlcGxveW1lbnQgYXJ0aWZhY3Qge30gd2FzIGZvdW5kIGZvciBzZXJ2aWNlIHt9IiwgYXJ0aWZhY3ROYW1lLCBzZXJ2aWNlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORCwgYXJ0aWZhY3ROYW1lKSk7CisJCX0KKworCQkvLyBEb3dubG9hZGluZyB0aGUgYXJ0aWZhY3QKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8U3RyaW5nLCBieXRlW10+LCBSZXNwb25zZUZvcm1hdD4gZG93bmxvYWRBcnRpZmFjdEVpdGhlciA9IGRvd25sb2FkQXJ0aWZhY3QoZGVwbG95bWVudEFydGlmYWN0KTsKKwkJaWYgKGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkRvd25sb2FkIGFydGlmYWN0IHt9IGZhaWxlZCIsIGFydGlmYWN0TmFtZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlsb2cudHJhY2UoIkRvd25sb2FkIG9mIHNlcnZpY2UgYXJ0aWZhY3Qgc3VjY2VlZGVkLCB1bmlxdWVJZCB7fSIsIGRlcGxveW1lbnRBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCkuZ2V0UmlnaHQoKSk7CisJfQorCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPiwgUmVzcG9uc2VGb3JtYXQ+IGRvd25sb2FkQXJ0aWZhY3QoU3RyaW5nIGFydGlmYWN0VW5pcXVlSWQpIHsKKwkJbG9nLnRyYWNlKCJTdGFydGluZyBkb3dubG9hZCBvZiBhcnRpZmFjdCwgdW5pcXVlSWQge30iLCBhcnRpZmFjdFVuaXF1ZUlkKTsKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RCeUlkID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RCeUlkKGFydGlmYWN0VW5pcXVlSWQsIGZhbHNlKTsKKwkJaWYgKGFydGlmYWN0QnlJZC5pc1JpZ2h0KCkpIHsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoYXJ0aWZhY3RCeUlkLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoIkVycm9yIHdoZW4gZ2V0dGluZyBhcnRpZmFjdCBpbmZvIGJ5IGlke30sIGVycm9yOiB7fSIsIGFydGlmYWN0VW5pcXVlSWQsIGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUFydGlmYWN0SWQoYWN0aW9uU3RhdHVzLCAiIikpOworCQl9CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBhcnRpZmFjdEJ5SWQubGVmdCgpLnZhbHVlKCk7CisJCWlmIChhcnRpZmFjdERlZmluaXRpb24gPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJFbXB0eSBhcnRpZmFjdCBkZWZpbml0aW9uIHJldHVybmVkIGZyb20gREIgYnkgYXJ0aWZhY3QgaWQge30iLCBhcnRpZmFjdFVuaXF1ZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQsICIiKSk7CisJCX0KKworCQlyZXR1cm4gZG93bmxvYWRBcnRpZmFjdChhcnRpZmFjdERlZmluaXRpb24pOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBjaGVja0FydGlmYWN0SW5Db21wb25lbnQob3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGFydGlmYWN0SWQpIHsKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c1MgPSBjb21wb25lbnQuZ2V0QXJ0aWZhY3RzKCk7CisJCWlmIChhcnRpZmFjdHNTICE9IG51bGwpIHsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGFydGlmYWN0c1MuZW50cnlTZXQoKSkgeworCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGFydGlmYWN0SWQpKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0c1MgPSBjb21wb25lbnQuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlpZiAoIWZvdW5kICYmIGRlcGxveW1lbnRBcnRpZmFjdHNTICE9IG51bGwpIHsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGRlcGxveW1lbnRBcnRpZmFjdHNTLmVudHJ5U2V0KCkpIHsKKwkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKS5nZXRVbmlxdWVJZCgpLmVxdWFscyhhcnRpZmFjdElkKSkgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IHRvc2NhQXJ0aWZhY3RzUyA9IGNvbXBvbmVudC5nZXRUb3NjYUFydGlmYWN0cygpOworCQlpZiAoIWZvdW5kICYmIHRvc2NhQXJ0aWZhY3RzUyAhPSBudWxsKSB7CisJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiB0b3NjYUFydGlmYWN0c1MuZW50cnlTZXQoKSkgeworCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGFydGlmYWN0SWQpKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXN3aXRjaCAoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkgeworCQljYXNlIFJFU09VUkNFOgorCQkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50ZXJmYWNlcyA9ICgoUmVzb3VyY2UpIGNvbXBvbmVudCkuZ2V0SW50ZXJmYWNlcygpOworCQkJaWYgKCFmb3VuZCAmJiBpbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+IGVudHJ5IDogaW50ZXJmYWNlcy5lbnRyeVNldCgpKSB7CisJCQkJCU1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0T3BlcmF0aW9ucygpOworCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9wZXJhdGlvbj4gZW50cnlPcCA6IG9wZXJhdGlvbnMuZW50cnlTZXQoKSkgeworCQkJCQkJaWYgKGVudHJ5T3AuZ2V0VmFsdWUoKS5nZXRJbXBsZW1lbnRhdGlvbigpICE9IG51bGwgJiYgZW50cnlPcC5nZXRWYWx1ZSgpLmdldEltcGxlbWVudGF0aW9uKCkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoYXJ0aWZhY3RJZCkpIHsKKwkJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTRVJWSUNFOgorCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcGlBcnRpZmFjdHMgPSAoKFNlcnZpY2UpIGNvbXBvbmVudCkuZ2V0U2VydmljZUFwaUFydGlmYWN0cygpOworCQkJaWYgKCFmb3VuZCAmJiBhcGlBcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGFwaUFydGlmYWN0cy5lbnRyeVNldCgpKSB7CisJCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGFydGlmYWN0SWQpKSB7CisJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCisJCX0KKworCQlyZXR1cm4gZm91bmQ7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrQXJ0aWZhY3RJblJlc291cmNlSW5zdGFuY2UoQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIGFydGlmYWN0SWQpIHsKKworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlID0gbnVsbDsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSByaSA6IHJlc291cmNlSW5zdGFuY2VzKSB7CisJCQlpZiAocmkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMocmVzb3VyY2VJbnN0YW5jZUlkKSkgeworCQkJCXJlc291cmNlSW5zdGFuY2UgPSByaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmVzb3VyY2VJbnN0YW5jZSAhPSBudWxsKSB7CisJCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHJlc291cmNlSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQkJaWYgKGFydGlmYWN0cyAhPSBudWxsKSB7CisJCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGVudHJ5IDogYXJ0aWZhY3RzLmVudHJ5U2V0KCkpIHsKKwkJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoYXJ0aWZhY3RJZCkpIHsKKwkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmb3VuZDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjw/IGV4dGVuZHMgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24sIFVzZXIgdXNlciwgU3RyaW5nIGFydGlmYWN0SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsCisJCQlTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlID0gY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpOworCQlpZiAoY29udGFpbmVyQ29tcG9uZW50VHlwZSAhPSBudWxsICYmIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlID09IG5vZGVUeXBlKSB7CisJCQlub2RlVHlwZSA9IChDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29udGFpbmVyQ29tcG9uZW50VHlwZSkpLmdldE5vZGVUeXBlKCk7CisJCX0KKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihub2RlVHlwZSk7CisKKwkJaWYgKGNvbXBvbmVudE9wZXJhdGlvbiA9PSBudWxsKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlsb2cuZGVidWcoImFkZEFydGlmYWN0IC0gbm90IHN1cHBvcnRlZCBjb21wb25lbnQgdHlwZSB7fSIsIGNvbXBvbmVudFR5cGUpOworCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIG51bGwsIGNvbXBvbmVudElkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlFaXRoZXI8PyBleHRlbmRzIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50UmVzdWx0ID0gY29tcG9uZW50T3BlcmF0aW9uLmdldENvbXBvbmVudChjb21wb25lbnRJZCwgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKGNvbXBvbmVudFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSAoY29tcG9uZW50VHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSA/IEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQgOiBBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQ7CisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRGb3JBdWRpdCA9IChjb21wb25lbnRUeXBlLmVxdWFscyhDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSkpID8gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UgOiBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFOworCisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChzdGF0dXMsIGNvbXBvbmVudElkKTsKKwkJCWxvZy5kZWJ1ZygiU2VydmljZSBub3QgZm91bmQsIHNlcnZpY2VJZCB7fSIsIGNvbXBvbmVudElkKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBudWxsLCBjb21wb25lbnRJZCwgdXNlciwgbnVsbCwgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudEZvckF1ZGl0LCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnRSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVdvcmtPbkNvbXBvbmVudChvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgdXNlcklkLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24sIFVzZXIgdXNlciwgU3RyaW5nIGFydGlmYWN0SWQsIEFydGlmYWN0T3BlcmF0aW9uIG9wZXJhdGlvbiwKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHsKKwkJaWYgKG9wZXJhdGlvbiAhPSBBcnRpZmFjdE9wZXJhdGlvbi5Eb3dubG9hZCkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjYW5Xb3JrID0gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQoY29tcG9uZW50LCB1c2VySWQpOworCQkJaWYgKGNhbldvcmsuaXNSaWdodCgpKSB7CisJCQkJU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50LmdldFVuaXF1ZUlkKCk7CisJCQkJbG9nLmRlYnVnKCJTZXJ2aWNlIHN0YXR1cyBpc24ndCAgQ0hFQ0tPVVQgb3IgdXNlciBpc24ndCBvd25lciwgc2VydmljZUlkIHt9IiwgdW5pcXVlSWQpOworCQkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnQsIHVuaXF1ZUlkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCBjYW5Xb3JrLnJpZ2h0KCkudmFsdWUoKSwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSwgbnVsbCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjYW5Xb3JrLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVdvcmtPblJlc291cmNlKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdXNlcklkLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24sIFVzZXIgdXNlciwgU3RyaW5nIGFydGlmYWN0SWQsIEFydGlmYWN0T3BlcmF0aW9uIG9wZXJhdGlvbikgeworCQlpZiAob3BlcmF0aW9uICE9IEFydGlmYWN0T3BlcmF0aW9uLkRvd25sb2FkKSB7CisJCQlpZiAoIUNvbXBvbmVudFZhbGlkYXRpb25VdGlscy5jYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSwgdXNlcklkKSkgeworCQkJCVN0cmluZyB1bmlxdWVJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJCQlsb2cuZGVidWcoIlJlc291cmNlIHN0YXR1cyBpc24ndCAgQ0hFQ0tPVVQgb3IgdXNlciBpc24ndCBvd25lciwgcmVzb3VyY2VJZCB7fSIsIHVuaXF1ZUlkKTsKKwkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcmVzb3VyY2UsIHVuaXF1ZUlkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG51bGwpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyUm9sZShVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uKSB7CisKKwkJaWYgKG9wZXJhdGlvbiAhPSBBcnRpZmFjdE9wZXJhdGlvbi5Eb3dubG9hZCkgeworCQkJU3RyaW5nIHJvbGUgPSB1c2VyLmdldFJvbGUoKTsKKwkJCWlmICghcm9sZS5lcXVhbHMoUm9sZS5BRE1JTi5uYW1lKCkpICYmICFyb2xlLmVxdWFscyhSb2xlLkRFU0lHTkVSLm5hbWUoKSkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJCWxvZy5kZWJ1ZygiYWRkQXJ0aWZhY3QgLSB1c2VyIGlzbid0IHBlcm1pdHRlZCB0byBwZXJmb3JtIG9wZXJhdGlvbiwgdXNlcklkIHt9LCByb2xlIHt9IiwgdXNlci5nZXRVc2VySWQoKSwgcm9sZSk7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIG51bGwsIGNvbXBvbmVudElkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVzZXJFeGlzdHMoU3RyaW5nIHVzZXJJZCwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uLCBTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisKKwkJcmV0dXJuIHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRJZCwgYXJ0aWZhY3RJZCwgY29tcG9uZW50VHlwZSwgZmFsc2UpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlckV4aXN0cyhTdHJpbmcgdXNlcklkLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24sIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGFydGlmYWN0SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlckV4aXN0cyA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsIGF1ZGl0aW5nQWN0aW9uLmdldE5hbWUoKSwgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKHZhbGlkYXRlVXNlckV4aXN0cy5pc1JpZ2h0KCkpIHsKKwkJCVVzZXIgdXNlciA9IG5ldyBVc2VyKCk7CisJCQl1c2VyLnNldFVzZXJJZCh1c2VySWQpOworCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIG51bGwsIGNvbXBvbmVudElkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCB2YWxpZGF0ZVVzZXJFeGlzdHMucmlnaHQoKS52YWx1ZSgpLCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVVc2VyRXhpc3RzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbGlkYXRlVXNlckV4aXN0cy5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBBdWRpdGluZ0FjdGlvbkVudW0gZGV0ZWN0QXVkaXRpbmdUeXBlKEFydGlmYWN0T3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG9yaWdNZDUpIHsKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uID0gbnVsbDsKKwkJc3dpdGNoIChvcGVyYXRpb24pIHsKKwkJY2FzZSBDcmVhdGU6CisJCQlhdWRpdGluZ0FjdGlvbiA9IG9wZXJhdGlvbi5pc0V4dGVybmFsQXBpKCkgPyBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfVVBMT0FEX0JZX0FQSSA6IEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQUQ7CisJCQlicmVhazsKKwkJY2FzZSBVcGRhdGU6CisJCQlhdWRpdGluZ0FjdGlvbiA9IG9wZXJhdGlvbi5pc0V4dGVybmFsQXBpKCkgPyBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfVVBMT0FEX0JZX0FQSSA6IG9yaWdNZDUgPT0gbnVsbCA/IEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9NRVRBREFUQV9VUERBVEUgOiBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfUEFZTE9BRF9VUERBVEU7CisJCQlicmVhazsKKwkJY2FzZSBEZWxldGU6CisJCQlhdWRpdGluZ0FjdGlvbiA9IG9wZXJhdGlvbi5pc0V4dGVybmFsQXBpKCkgPyBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfREVMRVRFX0JZX0FQSSA6IEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9ERUxFVEU7CisJCQlicmVhazsKKwkJY2FzZSBEb3dubG9hZDoKKwkJCWF1ZGl0aW5nQWN0aW9uID0gb3BlcmF0aW9uLmlzRXh0ZXJuYWxBcGkoKSA/IEF1ZGl0aW5nQWN0aW9uRW51bS5ET1dOTE9BRF9BUlRJRkFDVCA6IEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9ET1dOTE9BRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIGF1ZGl0aW5nQWN0aW9uOworCX0KKworCXByaXZhdGUgRWl0aGVyPEltbXV0YWJsZVBhaXI8U3RyaW5nLCBieXRlW10+LCBSZXNwb25zZUZvcm1hdD4gZG93bmxvYWRBcnRpZmFjdChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uKSB7CisJCVN0cmluZyBlc0FydGlmYWN0SWQgPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0RXNJZCgpOworCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3Rmcm9tRVMgPSBhcnRpZmFjdENhc3NhbmRyYURhby5nZXRBcnRpZmFjdChlc0FydGlmYWN0SWQpOworCQlpZiAoYXJ0aWZhY3Rmcm9tRVMuaXNSaWdodCgpKSB7CisJCQlDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgcmVzb3VyY2VVcGxvYWRTdGF0dXMgPSBhcnRpZmFjdGZyb21FUy5yaWdodCgpLnZhbHVlKCk7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VSZXNwb25zZSA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0Q2Fzc2FuZHJhU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlc291cmNlVXBsb2FkU3RhdHVzKTsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RvcmFnZVJlc3BvbnNlKTsKKwkJCWxvZy5kZWJ1ZygiRXJyb3Igd2hlbiBnZXR0aW5nIGFydGlmYWN0IGZyb20gRVMsIGVycm9yOiB7fSIsIGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUFydGlmYWN0SWQoYWN0aW9uU3RhdHVzLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKSk7CisJCX0KKworCQlFU0FydGlmYWN0RGF0YSBlc0FydGlmYWN0RGF0YSA9IGFydGlmYWN0ZnJvbUVTLmxlZnQoKS52YWx1ZSgpOworCQlieXRlW10gZGF0YSA9IGVzQXJ0aWZhY3REYXRhLmdldERhdGFBc0FycmF5KCk7CisJCWlmIChkYXRhID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3QgZGF0YSBmcm9tIEVTIGlzIG51bGwiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpKTsKKwkJfQorCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TmFtZSgpOworCQlsb2cudHJhY2UoIkRvd25sb2FkIG9mIGFydGlmYWN0IHN1Y2NlZWRlZCwgdW5pcXVlSWQge30sIGFydGlmYWN0IGZpbGUgbmFtZSB7fSIsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBhcnRpZmFjdE5hbWUpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBieXRlW10+KGFydGlmYWN0TmFtZSwgZGF0YSkpOworCX0KKworCXB1YmxpYyBFU0FydGlmYWN0RGF0YSBjcmVhdGVFc0FydGlmYWN0RGF0YShBcnRpZmFjdERhdGFEZWZpbml0aW9uIGFydGlmYWN0SW5mbywgYnl0ZVtdIGFydGlmYWN0UGF5bG9hZCkgeworCQlFU0FydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBuZXcgRVNBcnRpZmFjdERhdGEoYXJ0aWZhY3RJbmZvLmdldEVzSWQoKSwgYXJ0aWZhY3RQYXlsb2FkKTsKKwkJcmV0dXJuIGFydGlmYWN0RGF0YTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gc2F2ZUFydGlmYWN0cyhFU0FydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEsIFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIHJlbG9hZCkgeworCisJCUNhc3NhbmRyYU9wZXJhdGlvblN0YXR1cyByZXNvdXJjZVVwbG9hZFN0YXR1cyA9IGFydGlmYWN0Q2Fzc2FuZHJhRGFvLnNhdmVBcnRpZmFjdChhcnRpZmFjdERhdGEpOworCisJCWlmIChyZXNvdXJjZVVwbG9hZFN0YXR1cy5lcXVhbHMoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCB7fSB3YXMgc2F2ZWQgaW4gY29tcG9uZW50IHt9LiIsIGFydGlmYWN0RGF0YS5nZXRJZCgpLCByZXNvdXJjZUlkKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gc2F2ZSBhcnRpZmFjdCB7fS4iLCBhcnRpZmFjdERhdGEuZ2V0SWQoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzQXJ0aWZhY3RNZXRhZGF0YVVwZGF0ZShBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb25FbnVtKSB7CisJCXJldHVybiAoYXVkaXRpbmdBY3Rpb25FbnVtLmVxdWFscyhBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfTUVUQURBVEFfVVBEQVRFKSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRGVwbG95bWVudEFydGlmYWN0KEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8pIHsKKwkJcmV0dXJuIChBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5lcXVhbHMoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCkpKTsKKwl9CisKKwlwdWJsaWMgSVJlc291cmNlT3BlcmF0aW9uIGdldFJlc291cmNlT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUFydGlmYWN0UGxhY2VIb2xkZXJJbmZvKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgbG9naWNhbE5hbWUsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJ0aWZhY3RJbmZvTWFwLCBTdHJpbmcgdXNlcklkLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0gZ3JvdXBUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gdXNlciA9IHVzZXJBZG1pbk1hbmFnZXIuZ2V0VXNlcih1c2VySWQsIGluVHJhbnNhY3Rpb24pOworCQlpZiAodXNlci5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCQkJaWYgKHVzZXIucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhBY3Rpb25TdGF0dXMuVVNFUl9OT1RfRk9VTkQpKSB7CisJCQkJbG9nLmRlYnVnKCJjcmVhdGUgYXJ0aWZhY3QgcGxhY2Vob2xkZXIgLSBub3QgYXV0aG9yaXplZCB1c2VyLCB1c2VySWQge30iLCB1c2VySWQpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiY3JlYXRlIGFydGlmYWN0IHBsYWNlaG9sZGVyIC0gZmFpbGVkIHRvIGF1dGhvcml6ZSB1c2VyLCB1c2VySWQge30iLCB1c2VySWQpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KHVzZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGNyZWF0ZUFydGlmYWN0UGxhY2VIb2xkZXJJbmZvKHJlc291cmNlSWQsIGxvZ2ljYWxOYW1lLCBhcnRpZmFjdEluZm9NYXAsIHVzZXIubGVmdCgpLnZhbHVlKCksIGdyb3VwVHlwZSk7CisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdERlZmluaXRpb24pOworCX0KKworCXB1YmxpYyBBcnRpZmFjdERlZmluaXRpb24gY3JlYXRlQXJ0aWZhY3RQbGFjZUhvbGRlckluZm8oU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBsb2dpY2FsTmFtZSwgTWFwPFN0cmluZywgT2JqZWN0PiBhcnRpZmFjdEluZm9NYXAsIFVzZXIgdXNlciwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtIGdyb3VwVHlwZSkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCisJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSAoU3RyaW5nKSBhcnRpZmFjdEluZm9NYXAuZ2V0KEFSVElGQUNUX1BMQUNFSE9MREVSX0RJU1BMQVlfTkFNRSk7CisJCVN0cmluZyBhcnRpZmFjdFR5cGUgPSAoU3RyaW5nKSBhcnRpZmFjdEluZm9NYXAuZ2V0KEFSVElGQUNUX1BMQUNFSE9MREVSX1RZUEUpOworCQlTdHJpbmcgYXJ0aWZhY3REZXNjcmlwdGlvbiA9IChTdHJpbmcpIGFydGlmYWN0SW5mb01hcC5nZXQoQVJUSUZBQ1RfUExBQ0VIT0xERVJfREVTQ1JJUFRJT04pOworCisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdERpc3BsYXlOYW1lKGFydGlmYWN0TmFtZSk7CisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdExhYmVsKGxvZ2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpOworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RUeXBlKGFydGlmYWN0VHlwZSk7CisJCWFydGlmYWN0SW5mby5zZXREZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0R3JvdXBUeXBlKGdyb3VwVHlwZSk7CisJCXNldERlZmF1bHRBcnRpZmFjdFRpbWVvdXQoZ3JvdXBUeXBlLCBhcnRpZmFjdEluZm8pOworCisJCXNldEFydGlmYWN0UGxhY2Vob2xkZXJDb21tb25GaWVsZHMocmVzb3VyY2VJZCwgdXNlciwgYXJ0aWZhY3RJbmZvKTsKKworCQlyZXR1cm4gYXJ0aWZhY3RJbmZvOworCX0KKworCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0QXJ0aWZhY3RUaW1lb3V0KEFydGlmYWN0R3JvdXBUeXBlRW51bSBncm91cFR5cGUsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8pIHsKKwkJaWYgKGdyb3VwVHlwZS5lcXVhbHMoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpKSB7CisJCQlhcnRpZmFjdEluZm8uc2V0VGltZW91dChkZWZhdWx0SGVhdFRpbWVvdXQpOworCQl9IGVsc2UgeworCQkJYXJ0aWZhY3RJbmZvLnNldFRpbWVvdXQoTk9OX0hFQVRfVElNRU9VVCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0QXJ0aWZhY3RQbGFjZWhvbGRlckNvbW1vbkZpZWxkcyhTdHJpbmcgcmVzb3VyY2VJZCwgVXNlciB1c2VyLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvKSB7CisJCVN0cmluZyB1bmlxdWVJZCA9IG51bGw7CisKKwkJaWYgKHJlc291cmNlSWQgIT0gbnVsbCkgeworCQkJdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKHJlc291cmNlSWQudG9Mb3dlckNhc2UoKSwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCWFydGlmYWN0SW5mby5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCX0KKwkJYXJ0aWZhY3RJbmZvLnNldFVzZXJJZENyZWF0b3IodXNlci5nZXRVc2VySWQoKSk7CisJCVN0cmluZyBmdWxsTmFtZSA9IHVzZXIuZ2V0RnVsbE5hbWUoKTsKKwkJYXJ0aWZhY3RJbmZvLnNldFVwZGF0ZXJGdWxsTmFtZShmdWxsTmFtZSk7CisKKwkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJYXJ0aWZhY3RJbmZvLnNldENyZWF0b3JGdWxsTmFtZShmdWxsTmFtZSk7CisJCWFydGlmYWN0SW5mby5zZXRDcmVhdGlvbkRhdGUodGltZSk7CisKKwkJYXJ0aWZhY3RJbmZvLnNldExhc3RVcGRhdGVEYXRlKHRpbWUpOworCQlhcnRpZmFjdEluZm8uc2V0VXNlcklkTGFzdFVwZGF0ZXIodXNlci5nZXRVc2VySWQoKSk7CisKKwkJYXJ0aWZhY3RJbmZvLnNldE1hbmRhdG9yeSh0cnVlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFydGlmYWN0cyhTdHJpbmcgcGFyZW50SWQsIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIEFydGlmYWN0R3JvdXBUeXBlRW51bSBncm91cFR5cGUpIHsKKwkJcmV0dXJuIGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0cyhwYXJlbnRJZCwgcGFyZW50VHlwZSwgaW5UcmFuc2FjdGlvbiwgZ3JvdXBUeXBlLmdldFR5cGUoKSk7CisJfQorCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEhlYXRFbnZBcnRpZmFjdChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RIZWF0RW52LCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QsIFN0cmluZyBwYXJlbnRJZCwgTm9kZVR5cGVFbnVtIHBhcmVudFR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gYXJ0aWZhY3RPcGVyYXRpb24uYWRkSGVhdEVudkFydGlmYWN0KGFydGlmYWN0SGVhdEVudiwgYXJ0aWZhY3QsIHBhcmVudElkLCBwYXJlbnRUeXBlLCBpblRyYW5zYWN0aW9uKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEVTQXJ0aWZhY3REYXRhLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlRXNIZWF0RW52QXJ0aWZhY3REYXRhRnJvbVN0cmluZyhBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uLCBTdHJpbmcgcGFyYW1ldGVycykgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQlzYi5hcHBlbmQoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0SGVhdEVudkFydGlmYWN0SGVhZGVyKCkpOworCQlzYi5hcHBlbmQocGFyYW1ldGVycyk7CisJCXNiLmFwcGVuZChDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRIZWF0RW52QXJ0aWZhY3RGb290ZXIoKSk7CisJCWJ5dGVbXSBwYXlsb2FkID0gc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpOworCisJCVlhbWxUb09iamVjdENvbnZlcnRlciB5YW1sVG9PYmplY3RDb252ZXJ0ZXIgPSBuZXcgWWFtbFRvT2JqZWN0Q29udmVydGVyKCk7CisKKwkJLyoKKwkJICogaWYgKCF5YW1sVG9PYmplY3RDb252ZXJ0ZXIuaXNWYWxpZFlhbWwocGF5bG9hZCkpIHsgbG9nLmRlYnVnKCJJbnZhbGlkIFlBTUwgZm9ybWF0Iik7IFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUwsIEFydGlmYWN0VHlwZUVudW0uSEVBVF9FTlYuZ2V0VHlwZSgpKTsgcmV0dXJuCisJCSAqIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7IH0KKwkJICovCisKKwkJRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gY3JlYXRlRXNBcnRpZmFjdERhdGEoYXJ0aWZhY3REZWZpbml0aW9uLCBwYXlsb2FkKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGFydGlmYWN0RGF0YSk7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGFydGlmYWN0RGVmaW5pdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGdlbmVyYXRlSGVhdEVudkFydGlmYWN0KEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24sIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwgVXNlciBtb2RpZmllciwgYm9vbGVhbiBzaG91bGRMb2NrKSB7CisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCWhlYXRQYXJhbWV0ZXJzLnNvcnQoQ29tcGFyYXRvci5jb21wYXJpbmcoZSAtPiBlLmdldE5hbWUoKSkpOworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhcmFtZXRlcnM6XG4iKTsKKwkJaWYgKGhlYXRQYXJhbWV0ZXJzICE9IG51bGwpIHsKKworCQkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiA6IGhlYXRQYXJhbWV0ZXJzKSB7CisJCQkJaWYgKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldEN1cnJlbnRWYWx1ZSgpICE9IG51bGwpIHsKKwkJCQkJSGVhdFBhcmFtZXRlclR5cGUgdHlwZSA9IEhlYXRQYXJhbWV0ZXJUeXBlLmlzVmFsaWRUeXBlKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJCQkJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCQkJCXN3aXRjaCAodHlwZSkgeworCQkJCQkJY2FzZSBCT09MRUFOOgorCQkJCQkJCXNiLmFwcGVuZCgiICAiKS5hcHBlbmQoaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIjoiKS5hcHBlbmQoIiAiKS5hcHBlbmQoQm9vbGVhbi5wYXJzZUJvb2xlYW4oaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCkpKS5hcHBlbmQoIlxuIik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIE5VTUJFUjoKKwkJCQkJCQkvLyBpZgorCQkJCQkJCS8vIChWYWxpZGF0aW9uVXRpbHMuaXNGbG9hdE51bWJlcihoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSkpCisJCQkJCQkJLy8geworCQkJCQkJCS8vIHNiLmFwcGVuZCgiCisJCQkJCQkJLy8gIikuYXBwZW5kKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldE5hbWUoKSkuYXBwZW5kKCI6IikuYXBwZW5kKCIKKwkJCQkJCQkvLyAiKS5hcHBlbmQoRmxvYXQucGFyc2VGbG9hdChoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSkpLmFwcGVuZCgiXG4iKTsKKwkJCQkJCQkvLyB9IGVsc2UgeworCQkJCQkJCS8vIHNiLmFwcGVuZCgiCisJCQkJCQkJLy8gIikuYXBwZW5kKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldE5hbWUoKSkuYXBwZW5kKCI6IikuYXBwZW5kKCIKKwkJCQkJCQkvLyAiKS5hcHBlbmQoSW50ZWdlci5wYXJzZUludChoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSkpLmFwcGVuZCgiXG4iKTsKKwkJCQkJCQkvLyB9CisJCQkJCQkJc2IuYXBwZW5kKCIgICIpLmFwcGVuZChoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXROYW1lKCkpLmFwcGVuZCgiOiIpLmFwcGVuZCgiICIpLmFwcGVuZChuZXcgQmlnRGVjaW1hbChoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKSkudG9QbGFpblN0cmluZygpKS5hcHBlbmQoIlxuIik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIENPTU1BX0RFTElNSVRFRF9MSVNUOgorCQkJCQkJY2FzZSBKU09OOgorCQkJCQkJCXNiLmFwcGVuZCgiICAiKS5hcHBlbmQoaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIjoiKS5hcHBlbmQoIiAiKS5hcHBlbmQoaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCkpLmFwcGVuZCgiXG4iKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJU3RyaW5nIHZhbHVlID0gaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJCQkJYm9vbGVhbiBzdGFydHMgPSB2YWx1ZS5zdGFydHNXaXRoKCJcIiIpOworCQkJCQkJCWJvb2xlYW4gZW5kcyA9IHZhbHVlLmVuZHNXaXRoKCJcIiIpOworCQkJCQkJCWlmICghKHN0YXJ0cyAmJiBlbmRzKSkgeworCQkJCQkJCQlzdGFydHMgPSB2YWx1ZS5zdGFydHNXaXRoKCInIik7CisJCQkJCQkJCWVuZHMgPSB2YWx1ZS5lbmRzV2l0aCgiJyIpOworCQkJCQkJCQlpZiAoIShzdGFydHMgJiYgZW5kcykpIHsKKwkJCQkJCQkJCXZhbHVlID0gIlwiIiArIHZhbHVlICsgIlwiIjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlzYi5hcHBlbmQoIiAgIikuYXBwZW5kKGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldE5hbWUoKSkuYXBwZW5kKCI6IikuYXBwZW5kKCIgIikuYXBwZW5kKHZhbHVlKTsKKwkJCQkJCQlzYi5hcHBlbmQoIlxuIik7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZ2VuZXJhdGVBbmRTYXZlSGVhdEVudkFydGlmYWN0KGFydGlmYWN0RGVmaW5pdGlvbiwgc2IudG9TdHJpbmcoKSwgY29tcG9uZW50LCByZXNvdXJjZUluc3RhbmNlTmFtZSwgbW9kaWZpZXIsIHNob3VsZExvY2spOworCisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGFydGlmYWN0RGVmaW5pdGlvbgorCSAqIEBwYXJhbSBwYXlsb2FkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdGVBbmRTYXZlSGVhdEVudkFydGlmYWN0KEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24sIFN0cmluZyBwYXlsb2FkLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIFVzZXIgbW9kaWZpZXIsCisJCQlib29sZWFuIHNob3VsZExvY2spIHsKKwkJcmV0dXJuIGdlbmVyYXRlQXJ0aWZhY3RQYXlsb2FkKGFydGlmYWN0RGVmaW5pdGlvbiwgY29tcG9uZW50LCByZXNvdXJjZUluc3RhbmNlTmFtZSwgbW9kaWZpZXIsIHNob3VsZExvY2ssICgpIC0+IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRIZWF0UGFyYW1zVXBkYXRlRGF0ZSgpLCAoKSAtPiBjcmVhdGVFc0hlYXRFbnZBcnRpZmFjdERhdGFGcm9tU3RyaW5nKGFydGlmYWN0RGVmaW5pdGlvbiwgcGF5bG9hZCkpOworCisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBnZW5lcmF0ZUFydGlmYWN0UGF5bG9hZChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIFVzZXIgbW9kaWZpZXIsIGJvb2xlYW4gc2hvdWxkTG9jaywKKwkJCVN1cHBsaWVyPExvbmc+IHBheWxvYWRVcGRhdGVEYXRlR2VuLCBTdXBwbGllcjxFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc3BvbnNlRm9ybWF0Pj4gZXNEYXRhQ3JlYXRvcikgeworCisJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0UGF5bG9hZFVwZGF0ZURhdGUoKSA9PSBudWxsIHx8IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRQYXlsb2FkVXBkYXRlRGF0ZSgpID09IDAgfHwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFBheWxvYWRVcGRhdGVEYXRlKCkgPCBwYXlsb2FkVXBkYXRlRGF0ZUdlbi5nZXQoKSkgeworCisJCQlsb2cudHJhY2UoIkdlbmVyYWluZyBwYXlsb2FkIGZvciB7fSBhcnRpZmFjdCB7fSIsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdFR5cGUoKSwgYXJ0aWZhY3REZWZpbml0aW9uLmdldEVzSWQoKSk7CisJCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc3BvbnNlRm9ybWF0PiBhcnRpZmFjdERhdGFSZXMgPSBlc0RhdGFDcmVhdG9yLmdldCgpOworCQkJRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gbnVsbDsKKworCQkJaWYgKGFydGlmYWN0RGF0YVJlcy5pc0xlZnQoKSkgeworCQkJCWFydGlmYWN0RGF0YSA9IGFydGlmYWN0RGF0YVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCX0gZWxzZSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCWhhbmRsZUF1ZGl0aW5nKEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9QQVlMT0FEX1VQREFURSwgY29tcG9uZW50LCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgbW9kaWZpZXIsIGFydGlmYWN0RGVmaW5pdGlvbiwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNwb25zZUZvcm1hdCwKKwkJCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX0lOU1RBTkNFLCByZXNvdXJjZUluc3RhbmNlTmFtZSk7CisKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFydGlmYWN0RGF0YVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJU3RyaW5nIG5ld0NoZWNrU3VtID0gR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlCeXRlQXJyYXkoYXJ0aWZhY3REYXRhLmdldERhdGFBc0FycmF5KCkpOworCQkJU3RyaW5nIG9sZENoZWNrU3VtOworCQkJU3RyaW5nIGVzQXJ0aWZhY3RJZCA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCk7CisJCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3Rmcm9tRVM7CisJCQlFU0FydGlmYWN0RGF0YSBlc0FydGlmYWN0RGF0YTsKKwkJCWlmIChlc0FydGlmYWN0SWQgIT0gbnVsbCAmJiAhZXNBcnRpZmFjdElkLmlzRW1wdHkoKSkgeworCQkJCWFydGlmYWN0ZnJvbUVTID0gYXJ0aWZhY3RDYXNzYW5kcmFEYW8uZ2V0QXJ0aWZhY3QoZXNBcnRpZmFjdElkKTsKKwkJCQlpZiAoYXJ0aWZhY3Rmcm9tRVMuaXNSaWdodCgpKSB7CisJCQkJCUNhc3NhbmRyYU9wZXJhdGlvblN0YXR1cyByZXNvdXJjZVVwbG9hZFN0YXR1cyA9IGFydGlmYWN0ZnJvbUVTLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlUmVzcG9uc2UgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydENhc3NhbmRyYVN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZXNvdXJjZVVwbG9hZFN0YXR1cyk7CisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RvcmFnZVJlc3BvbnNlKTsKKwkJCQkJbG9nLmRlYnVnKCJFcnJvciB3aGVuIGdldHRpbmcgYXJ0aWZhY3QgZnJvbSBFUywgZXJyb3I6IHt9IiwgYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlBcnRpZmFjdElkKGFjdGlvblN0YXR1cywgYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKSkpOworCQkJCX0KKwkJCQllc0FydGlmYWN0RGF0YSA9IGFydGlmYWN0ZnJvbUVTLmxlZnQoKS52YWx1ZSgpOworCQkJCW9sZENoZWNrU3VtID0gR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlCeXRlQXJyYXkoZXNBcnRpZmFjdERhdGEuZ2V0RGF0YUFzQXJyYXkoKSk7CisJCQl9IGVsc2UgeworCQkJCW9sZENoZWNrU3VtID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0Q2hlY2tzdW0oKTsKKwkJCX0KKwkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUFyaWZhY3REZWZpbml0aW9uU3RhdHVzOworCisJCQlpZiAoc2hvdWxkTG9jaykgeworCQkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja0NvbXBvbmVudCA9IGxvY2tDb21wb25lbnQoY29tcG9uZW50LCAiVXBkYXRlIEFydGlmYWN0IC0gbG9jayByZXNvdXJjZTogIik7CisJCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCWhhbmRsZUF1ZGl0aW5nKEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9NRVRBREFUQV9VUERBVEUsIGNvbXBvbmVudCwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIG1vZGlmaWVyLCBudWxsLCBudWxsLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgbG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCksIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCksIG51bGwpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCQl0cnkgeworCQkJCWlmIChvbGRDaGVja1N1bSAhPSBudWxsICYmIG9sZENoZWNrU3VtLmVxdWFscyhuZXdDaGVja1N1bSkpIHsKKworCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0UGF5bG9hZFVwZGF0ZURhdGUocGF5bG9hZFVwZGF0ZURhdGVHZW4uZ2V0KCkpOworCQkJCQl1cGRhdGVBcmlmYWN0RGVmaW5pdGlvblN0YXR1cyA9IGFydGlmYWN0T3BlcmF0aW9uLnVwZGF0ZUFyaWZhY3REZWZpbml0aW9uKGFydGlmYWN0RGVmaW5pdGlvbiwgZmFsc2UpOworCQkJCQlsb2cudHJhY2UoIk5vIHJlYWwgdXBkYXRlIGRvbmUgaW4gcGF5bG9hZCBmb3Ige30gYXJ0aWZhY3QsIHVwZGF0aW5nIHBheWxvYWRVcGRhdGVEYXRlIHt9IiwgYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VHlwZSgpLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0RXNJZCgpKTsKKwkJCQkJaWYgKHVwZGF0ZUFyaWZhY3REZWZpbml0aW9uU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUFydGlmYWN0SWQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHVwZGF0ZUFyaWZhY3REZWZpbml0aW9uU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSksIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpOworCQkJCQkJbG9nLnRyYWNlKCJGYWlsZWQgdG8gdXBkYXRlIHBheWxvYWRVcGRhdGVEYXRlICIsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCkpOworCQkJCQkJaGFuZGxlQXVkaXRpbmcoQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX1BBWUxPQURfVVBEQVRFLCBjb21wb25lbnQsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBtb2RpZmllciwgYXJ0aWZhY3REZWZpbml0aW9uLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc3BvbnNlRm9ybWF0LAorCQkJCQkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgcmVzb3VyY2VJbnN0YW5jZU5hbWUpOworCisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisKKwkJCQkJb2xkQ2hlY2tTdW0gPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RDaGVja3N1bSgpOworCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0QXJ0aWZhY3RDaGVja3N1bShuZXdDaGVja1N1bSk7CisJCQkJCWFydGlmYWN0T3BlcmF0aW9uLnVwZGF0ZVVVSUQoYXJ0aWZhY3REZWZpbml0aW9uLCBvbGRDaGVja1N1bSwgYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VmVyc2lvbigpKTsKKwkJCQkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEVzSWQoYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJCQl1cGRhdGVBcmlmYWN0RGVmaW5pdGlvblN0YXR1cyA9IGFydGlmYWN0T3BlcmF0aW9uLnVwZGF0ZUFyaWZhY3REZWZpbml0aW9uKGFydGlmYWN0RGVmaW5pdGlvbiwgdHJ1ZSk7CisKKwkJCQkJbG9nLnRyYWNlKCJVcGRhdGUgUGF5bG9hZCAgIiwgYXJ0aWZhY3REZWZpbml0aW9uLmdldEVzSWQoKSk7CisKKwkJCQkJaWYgKHVwZGF0ZUFyaWZhY3REZWZpbml0aW9uU3RhdHVzLmlzTGVmdCgpKSB7CisKKwkJCQkJCWFydGlmYWN0RGF0YS5zZXRJZChhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQkJCQlDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgc2F2ZUFydGlmYWN0U3RhdHVzID0gYXJ0aWZhY3RDYXNzYW5kcmFEYW8uc2F2ZUFydGlmYWN0KGFydGlmYWN0RGF0YSk7CisKKwkJCQkJCWlmIChzYXZlQXJ0aWZhY3RTdGF0dXMuZXF1YWxzKENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCBTYXZlZCBJbiBFUyB7fSIsIGFydGlmYWN0RGF0YS5nZXRJZCgpKTsKKwkJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCQkJCWhhbmRsZUF1ZGl0aW5nKEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9QQVlMT0FEX1VQREFURSwgY29tcG9uZW50LCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgbW9kaWZpZXIsIGFydGlmYWN0RGVmaW5pdGlvbiwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCByZXNwb25zZUZvcm1hdCwKKwkJCQkJCQkJCUNvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX0lOU1RBTkNFLCByZXNvdXJjZUluc3RhbmNlTmFtZSk7CisKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJCQkJbG9nLmluZm8oIkZhaWxlZCB0byBzYXZlIGFydGlmYWN0IHt9LiIsIGFydGlmYWN0RGF0YS5nZXRJZCgpKTsKKwkJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJCQkJaGFuZGxlQXVkaXRpbmcoQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX1BBWUxPQURfVVBEQVRFLCBjb21wb25lbnQsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBtb2RpZmllciwgYXJ0aWZhY3REZWZpbml0aW9uLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc3BvbnNlRm9ybWF0LAorCQkJCQkJCQkJQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UsIHJlc291cmNlSW5zdGFuY2VOYW1lKTsKKworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUFydGlmYWN0SWQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHVwZGF0ZUFyaWZhY3REZWZpbml0aW9uU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSksIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpOworCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgVG8gdXBkYXRlIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3REYXRhLmdldElkKCkpOworCQkJCQkJaGFuZGxlQXVkaXRpbmcoQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX1BBWUxPQURfVVBEQVRFLCBjb21wb25lbnQsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBtb2RpZmllciwgYXJ0aWZhY3REZWZpbml0aW9uLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHJlc3BvbnNlRm9ybWF0LAorCQkJCQkJCQlDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgcmVzb3VyY2VJbnN0YW5jZU5hbWUpOworCisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKworCQkJCQl9CisJCQkJfQorCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAoc2hvdWxkTG9jaykgeworCQkJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldE5vZGVUeXBlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdERlZmluaXRpb24pOworCX0KKworCXByaXZhdGUgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVVcGRhdGVIZWF0RW52KFN0cmluZyBjb21wb25lbnRJZCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uLCBTdHJpbmcgYXJ0aWZhY3RJZCwgVXNlciB1c2VyLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLAorCQkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IHBhcmVudCwgU3RyaW5nIG9yaWdpbkRhdGEsIFN0cmluZyBvcmlnTWQ1LCBBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24sIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCU5vZGVUeXBlRW51bSBwYXJlbnRUeXBlID0gY29udmVydFBhcmVudFR5cGUoY29tcG9uZW50VHlwZSk7CisJCVN0cmluZyBwYXJlbnRJZCA9IHBhcmVudC5nZXRVbmlxdWVJZCgpOworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdFJlcyA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0QnlJZChhcnRpZmFjdElkLCBmYWxzZSk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBjdXJyQXJ0aWZhY3QgPSBhcnRpZmFjdFJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlpZiAob3JpZ01kNSAhPSBudWxsKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlTWQ1ID0gdmFsaWRhdGVNZDUob3JpZ01kNSwgb3JpZ2luRGF0YSwgYXJ0aWZhY3RJbmZvLmdldFBheWxvYWREYXRhKCksIG9wZXJhdGlvbik7CisJCQlpZiAodmFsaWRhdGVNZDUuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZU1kNS5yaWdodCgpLnZhbHVlKCk7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKworCQkJaWYgKGFydGlmYWN0SW5mby5nZXRQYXlsb2FkRGF0YSgpICE9IG51bGwgJiYgYXJ0aWZhY3RJbmZvLmdldFBheWxvYWREYXRhKCkubGVuZ3RoICE9IDApIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGRlcGxveW1lbnRWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVEZXBsb3ltZW50QXJ0aWZhY3QocGFyZW50LCBjb21wb25lbnRJZCwgdXNlci5nZXRVc2VySWQoKSwgZmFsc2UsIGFydGlmYWN0SW5mbywgY3VyckFydGlmYWN0LCBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSk7CisJCQkJaWYgKGRlcGxveW1lbnRWYWxpZGF0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGRlcGxveW1lbnRWYWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50SWQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJfQorCisJCQkJRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IHBheWxvYWRFaXRoZXIgPSBoYW5kbGVQYXlsb2FkKGFydGlmYWN0SW5mbywgaXNBcnRpZmFjdE1ldGFkYXRhVXBkYXRlKGF1ZGl0aW5nQWN0aW9uKSk7CisJCQkJaWYgKHBheWxvYWRFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gcGF5bG9hZEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCX0gZWxzZSB7IC8vIGR1cGxpY2F0ZQorCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEsIEFSVElGQUNUX1BBWUxPQUQpOworCQkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudElkLCB1c2VyLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0KKworCQkvLyBsb2NrIHJlc291cmNlCisJCWlmIChzaG91bGRMb2NrKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KHBhcmVudCwgIlVwZGF0ZSBBcnRpZmFjdCAtIGxvY2sgIik7CisJCQlpZiAobG9ja0NvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnRJZCwgdXNlciwgbnVsbCwgbnVsbCwgYXJ0aWZhY3RJZCwgbG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCksIGNvbXBvbmVudFR5cGUsIG51bGwpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCQl0cnkgeworCQkJcmVzdWx0T3AgPSB1cGRhdGVIZWF0RW52UGFyYW1zKGNvbXBvbmVudElkLCBhcnRpZmFjdElkLCBhcnRpZmFjdEluZm8sIHVzZXIsIGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIGNvbXBvbmVudFR5cGUsIGN1cnJBcnRpZmFjdCwgb3JpZ01kNSwgaW5UcmFuc2FjdGlvbik7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIHVubG9jayByZXNvdXJjZQorCQkJaWYgKHJlc3VsdE9wID09IG51bGwgfHwgcmVzdWx0T3AuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJhbGwgY2hhbmdlcyByb2xsYmFjayIpOworCQkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKQorCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJhbGwgY2hhbmdlcyBjb21taXR0ZWQiKTsKKwkJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQkJaWYgKHNob3VsZExvY2spCisJCQkJY29tcG9uZW50VHlwZSA9IHBhcmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUgPSBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHBhcmVudC5nZXRVbmlxdWVJZCgpLCBub2RlVHlwZSk7CisJCQkvLyBncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHBhcmVudElkLCBwYXJlbnRUeXBlKTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVIZWF0RW52UGFyYW1zKFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGFydGlmYWN0SWQsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uLCBDb21wb25lbnQgcGFyZW50LAorCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJBcnRpZmFjdDEsIFN0cmluZyBvcmlnTWQ1LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wID0gbnVsbDsKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiBpbnNpZGVFaXRoZXIgPSBudWxsOworCQkvKgorCQkgKiBjdXJyZW50bHkgZ2V0QXJ0aWZhY3RCeUlkIGRvZXMgbm90IHJldHJpZXZlIGhlYXRQYXJhbWV0ZXJzIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0UmVzID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RCeUlkKGFydGlmYWN0SWQsIGZhbHNlKTsgQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJBcnRpZmFjdCA9IGFydGlmYWN0UmVzLmxlZnQoKS52YWx1ZSgpOworCQkgKi8KKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gZ2V0UkkgPSBnZXRSSUZyb21Db21wb25lbnQocGFyZW50LCBjb21wb25lbnRJZCwgYXJ0aWZhY3RJZCwgYXVkaXRpbmdBY3Rpb24sIHVzZXIpOworCQlpZiAoZ2V0UkkuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdldFJJLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJQ29tcG9uZW50SW5zdGFuY2UgcmkgPSBnZXRSSS5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGdldEFydGlmYWN0UmVzID0gZ2V0QXJ0aWZhY3RGcm9tUkkocGFyZW50LCByaSwgY29tcG9uZW50SWQsIGFydGlmYWN0SWQsIGF1ZGl0aW5nQWN0aW9uLCB1c2VyKTsKKwkJaWYgKGdldEFydGlmYWN0UmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChnZXRBcnRpZmFjdFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUFydGlmYWN0RGVmaW5pdGlvbiBjdXJyQXJ0aWZhY3QgPSBnZXRBcnRpZmFjdFJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlpZiAoY3VyckFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKSB8fCBjdXJyQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzKEFydGlmYWN0VHlwZUVudW0uSEVBVF9WT0wuZ2V0VHlwZSgpKSB8fCBjdXJyQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzKEFydGlmYWN0VHlwZUVudW0uSEVBVF9ORVQuZ2V0VHlwZSgpKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudC5nZXRVbmlxdWVJZCgpLCB1c2VyLCBhcnRpZmFjdEluZm8sIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCByaS5nZXROYW1lKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gY3VycmVudEhlYXRFbnZQYXJhbXMgPSBjdXJyQXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gdXBkYXRlZEhlYXRFbnZQYXJhbXMgPSBhcnRpZmFjdEluZm8uZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gcmVkdWNlZEhlYXRFbnZQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCisJCS8vIHVwbG9hZAorCQlpZiAob3JpZ01kNSAhPSBudWxsKSB7CisJCQlFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiB1cGxvYWRQYXJhbXNWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVVcGxvYWRQYXJhbXNGcm9tRW52RmlsZShhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCB1c2VyLCBhcnRpZmFjdEluZm8sIGFydGlmYWN0SWQsIGNvbXBvbmVudFR5cGUsIHJpLmdldE5hbWUoKSwgY3VycmVudEhlYXRFbnZQYXJhbXMsCisJCQkJCXVwZGF0ZWRIZWF0RW52UGFyYW1zLCBjdXJyQXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQkJaWYgKHVwbG9hZFBhcmFtc1ZhbGlkYXRpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB1cGxvYWRQYXJhbXNWYWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnQuZ2V0VW5pcXVlSWQoKSwgdXNlciwgYXJ0aWZhY3RJbmZvLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgcmkuZ2V0TmFtZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCWFydGlmYWN0SW5mby5zZXRIZWF0UGFyYW1ldGVycyh1cGRhdGVkSGVhdEVudlBhcmFtcyk7CisJCX0KKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRDb252ZXJ0SGVhdFBhcmFtZXJzID0gdmFsaWRhdGVBbmRDb252ZXJ0SGVhdFBhcmFtZXJzKGFydGlmYWN0SW5mbywgQXJ0aWZhY3RUeXBlRW51bS5IRUFUX0VOVi5nZXRUeXBlKCkpOworCQlpZiAodmFsaWRhdGVBbmRDb252ZXJ0SGVhdFBhcmFtZXJzLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFuZENvbnZlcnRIZWF0UGFyYW1lcnMucmlnaHQoKS52YWx1ZSgpOworCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50LmdldFVuaXF1ZUlkKCksIHVzZXIsIGFydGlmYWN0SW5mbywgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIHJpLmdldE5hbWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWlmICh1cGRhdGVkSGVhdEVudlBhcmFtcyAhPSBudWxsICYmICF1cGRhdGVkSGVhdEVudlBhcmFtcy5pc0VtcHR5KCkpIHsKKwkJCVN0cmluZyBwYXJhbU5hbWU7CisJCQkvLyBmaWxsIHJlZHVjZWQgaGVhdCBlbnYgcGFyYW1ldGVycyBMaXN0IGZvciB1cGRhdGluZworCQkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0RW52UGFyYW0gOiB1cGRhdGVkSGVhdEVudlBhcmFtcykgeworCQkJCXBhcmFtTmFtZSA9IGhlYXRFbnZQYXJhbS5nZXROYW1lKCk7CisJCQkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBjdXJySGVhdFBhcmFtIDogY3VycmVudEhlYXRFbnZQYXJhbXMpIHsKKwkJCQkJaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGN1cnJIZWF0UGFyYW0uZ2V0TmFtZSgpKSkgeworCQkJCQkJU3RyaW5nIHVwZGF0ZWRQYXJhbVZhbHVlID0gaGVhdEVudlBhcmFtLmdldEN1cnJlbnRWYWx1ZSgpOworCQkJCQkJaWYgKHVwZGF0ZWRQYXJhbVZhbHVlICE9IG51bGwgJiYgdXBkYXRlZFBhcmFtVmFsdWUuZXF1YWxzKCIiKSkgeyAvLyByZXNldAorCQkJCQkJCWhlYXRFbnZQYXJhbS5zZXRDdXJyZW50VmFsdWUoaGVhdEVudlBhcmFtLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCQkJCQlyZWR1Y2VkSGVhdEVudlBhcmFtcy5hZGQoaGVhdEVudlBhcmFtKTsKKwkJCQkJCX0gZWxzZSBpZiAodXBkYXRlZFBhcmFtVmFsdWUgIT0gbnVsbCkgeworCQkJCQkJCXJlZHVjZWRIZWF0RW52UGFyYW1zLmFkZChoZWF0RW52UGFyYW0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKHJlZHVjZWRIZWF0RW52UGFyYW1zLnNpemUoKSA+IDApIHsKKwkJCQlBcnRpZmFjdERlZmluaXRpb24gcmVkdWNlZEFydGlmYWN0SW5mbyA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oYXJ0aWZhY3RJbmZvKTsKKwkJCQlyZWR1Y2VkQXJ0aWZhY3RJbmZvLnNldEhlYXRQYXJhbWV0ZXJzKHJlZHVjZWRIZWF0RW52UGFyYW1zKTsKKwkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBcnRpZmFjdFJlc3VsdCA9IGFydGlmYWN0T3BlcmF0aW9uLnVwZGF0ZUFyaWZhY3RPblJlc291cmNlKHJlZHVjZWRBcnRpZmFjdEluZm8sIGNvbXBvbmVudElkLCBhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpLCBpblRyYW5zYWN0aW9uKTsKKworCQkJCWlmICh1cGRhdGVBcnRpZmFjdFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIGFydGlmYWN0IG9uIGdyYXBoICAtIHt9IiwgYXJ0aWZhY3RJZCk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSh1cGRhdGVBcnRpZmFjdFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50LmdldFVuaXF1ZUlkKCksIHVzZXIsIGFydGlmYWN0SW5mbywgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIHJpLmdldE5hbWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCQlBcnRpZmFjdERlZmluaXRpb24gdXBkYXRlZEFydGlmYWN0ID0gdXBkYXRlQXJ0aWZhY3RSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJU3RyaW5nIHVwZGF0ZWRBcnRpZmFjdElkID0gdXBkYXRlZEFydGlmYWN0LmdldFVuaXF1ZUlkKCk7CisJCQkJaWYgKCFjdXJyQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKS5lcXVhbHModXBkYXRlZEFydGlmYWN0SWQpKSB7CisJCQkJCWN1cnJBcnRpZmFjdC5zZXRVbmlxdWVJZCh1cGRhdGVkQXJ0aWZhY3RJZCk7CisJCQkJCWN1cnJBcnRpZmFjdC5zZXRQYXlsb2FkVXBkYXRlRGF0ZSh1cGRhdGVkQXJ0aWZhY3QuZ2V0UGF5bG9hZFVwZGF0ZURhdGUoKSk7CisJCQkJCWN1cnJBcnRpZmFjdC5zZXRDcmVhdGlvbkRhdGUodXBkYXRlZEFydGlmYWN0LmdldENyZWF0aW9uRGF0ZSgpKTsKKwkJCQkJY3VyckFydGlmYWN0LnNldExhc3RVcGRhdGVEYXRlKHVwZGF0ZWRBcnRpZmFjdC5nZXRMYXN0VXBkYXRlRGF0ZSgpKTsKKwkJCQkJY3VyckFydGlmYWN0LnNldEVzSWQodXBkYXRlZEFydGlmYWN0LmdldEVzSWQoKSk7CisJCQkJfQorCQkJCWN1cnJBcnRpZmFjdC5zZXRIZWF0UGFyYW1zVXBkYXRlRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKKwkJCQlFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGhlYXRQYXJhbXNGb3JFbnYgPSAoKG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5BcnRpZmFjdE9wZXJhdGlvbikgYXJ0aWZhY3RPcGVyYXRpb24pLmdldEhlYXRQYXJhbXNGb3JFbnYoY3VyckFydGlmYWN0KTsKKwkJCQlpZiAoaGVhdFBhcmFtc0ZvckVudi5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGhlYXQgcGFyYW1ldGVycyB2YWx1ZXMgZm9yIGhlYXQgYXJ0aWZhY3Qge30iLCB1cGRhdGVkQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShoZWF0UGFyYW1zRm9yRW52LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnQuZ2V0VW5pcXVlSWQoKSwgdXNlciwgYXJ0aWZhY3RJbmZvLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgcmkuZ2V0TmFtZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJfQorCQkJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHVwZGF0ZWRIZWF0UGFyYWV0ZXJzTGlzdCA9IGhlYXRQYXJhbXNGb3JFbnYubGVmdCgpLnZhbHVlKCk7CisJCQkJY3VyckFydGlmYWN0LnNldEhlYXRQYXJhbWV0ZXJzKHVwZGF0ZWRIZWF0UGFyYWV0ZXJzTGlzdCk7CisKKwkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBcmlmYWN0UmVzID0gYXJ0aWZhY3RPcGVyYXRpb24udXBkYXRlQXJpZmFjdERlZmluaXRpb24oY3VyckFydGlmYWN0LCB0cnVlKTsKKwkJCQlpZiAodXBkYXRlQXJpZmFjdFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIGFydGlmYWN0IG9uIGdyYXBoICAtIHt9IiwgYXJ0aWZhY3RJZCk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSh1cGRhdGVBcmlmYWN0UmVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnQuZ2V0VW5pcXVlSWQoKSwgdXNlciwgYXJ0aWZhY3RJbmZvLCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgcmkuZ2V0TmFtZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaW5zaWRlRWl0aGVyID0gRWl0aGVyLmxlZnQoY3VyckFydGlmYWN0KTsKKwkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdChpbnNpZGVFaXRoZXIpOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQloYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgcGFyZW50LCBwYXJlbnQuZ2V0VW5pcXVlSWQoKSwgdXNlciwgY3VyckFydGlmYWN0LCBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgcmkuZ2V0TmFtZSgpKTsKKwkJcmV0dXJuIHJlc3VsdE9wOworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVwbG9hZFBhcmFtc0Zyb21FbnZGaWxlKEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgQ29tcG9uZW50IHBhcmVudCwgVXNlciB1c2VyLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwKKwkJCVN0cmluZyByaU5hbWUsIExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGN1cnJlbnRIZWF0RW52UGFyYW1zLCBMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiB1cGRhdGVkSGVhdEVudlBhcmFtcywgU3RyaW5nIGN1cnJBcnRpZmFjdE5hbWUpIHsKKworCQlpZiAodXBkYXRlZEhlYXRFbnZQYXJhbXMgPT0gbnVsbCB8fCB1cGRhdGVkSGVhdEVudlBhcmFtcy5pc0VtcHR5KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0RFUExPWU1FTlRfQVJUSUZBQ1RfSEVBVCwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpLCBjdXJyQXJ0aWZhY3ROYW1lKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBwYXJlbnQsIHBhcmVudC5nZXRVbmlxdWVJZCgpLCB1c2VyLCBhcnRpZmFjdEluZm8sIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCByaU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHVwbG9hZGVkSGVhdFBhcmFtIDogdXBkYXRlZEhlYXRFbnZQYXJhbXMpIHsKKwkJCVN0cmluZyBwYXJhbU5hbWUgPSB1cGxvYWRlZEhlYXRQYXJhbS5nZXROYW1lKCk7CisJCQlib29sZWFuIGlzRXhpc3RzSW5IZWF0ID0gZmFsc2U7CisJCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGN1cnJIZWF0UGFyYW0gOiBjdXJyZW50SGVhdEVudlBhcmFtcykgeworCQkJCWlmIChwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZShjdXJySGVhdFBhcmFtLmdldE5hbWUoKSkpIHsKKworCQkJCQlpc0V4aXN0c0luSGVhdCA9IHRydWU7CisJCQkJCXVwbG9hZGVkSGVhdFBhcmFtLnNldFR5cGUoY3VyckhlYXRQYXJhbS5nZXRUeXBlKCkpOworCQkJCQl1cGxvYWRlZEhlYXRQYXJhbS5zZXRDdXJyZW50VmFsdWUodXBsb2FkZWRIZWF0UGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJCQl1cGxvYWRlZEhlYXRQYXJhbS5zZXREZWZhdWx0VmFsdWUoY3VyckhlYXRQYXJhbS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCQkJCXVwbG9hZGVkSGVhdFBhcmFtLnNldFVuaXF1ZUlkKGN1cnJIZWF0UGFyYW0uZ2V0VW5pcXVlSWQoKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghaXNFeGlzdHNJbkhlYXQpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTTUFUQ0hfSEVBVF9WU19IRUFUX0VOViwgY3VyckFydGlmYWN0TmFtZSk7CisJCQkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIHBhcmVudCwgcGFyZW50LmdldFVuaXF1ZUlkKCksIHVzZXIsIGFydGlmYWN0SW5mbywgbnVsbCwgYXJ0aWZhY3RJZCwgcmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIHJpTmFtZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHVwZGF0ZWRIZWF0RW52UGFyYW1zKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IGdldFJJRnJvbUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcmlJRCwgU3RyaW5nIGFydGlmYWN0SWQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgVXNlciB1c2VyKSB7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbnVsbDsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmlzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIHJpIDogcmlzKSB7CisJCQlpZiAocmlJRC5lcXVhbHMocmkuZ2V0VW5pcXVlSWQoKSkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmkpOworCQkJfQorCQl9CisJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9OT1RfRk9VTkRfT05fU0VSVklDRSwgcmlJRCk7CisJCWxvZy5kZWJ1ZygiUmVzb3VyY2UgSW5zdGFuY2Ugbm90IGZvdW5kLCByZXNvdXJjZUluc3RhbmNlSWQge30iLCByaUlEKTsKKwkJaGFuZGxlQXVkaXRpbmcoYXVkaXRpbmdBY3Rpb24sIG51bGwsIHJpSUQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgbnVsbCk7CisJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGdldEFydGlmYWN0RnJvbVJJKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudEluc3RhbmNlIHJpLCBTdHJpbmcgcmlJRCwgU3RyaW5nIGFydGlmYWN0SWQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgVXNlciB1c2VyKSB7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbnVsbDsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBydGlmYWN0c01hcCA9IHJpLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgOiBydGlmYWN0c01hcC52YWx1ZXMoKSkgeworCQkJaWYgKGFydGlmYWN0SWQuZXF1YWxzKGFydGlmYWN0LmdldFVuaXF1ZUlkKCkpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGFydGlmYWN0KTsKKwkJCX0KKwkJfQorCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5ELCByaUlELCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCWhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnQsIHJpSUQsIHVzZXIsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgcmkuZ2V0TmFtZSgpKTsKKwkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJfQorCisJcHVibGljIENvbXBvbmVudE9wZXJhdGlvbiBnZXRDb21wb25lbnRPcGVyYXRpb24oTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHsKKworCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKwkJY2FzZSBTZXJ2aWNlOgorCQljYXNlIFJlc291cmNlSW5zdGFuY2U6CisJCQlyZXR1cm4gc2VydmljZU9wZXJhdGlvbjsKKwkJY2FzZSBSZXNvdXJjZToKKwkJCXJldHVybiByZXNvdXJjZU9wZXJhdGlvbjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIEFydGlmYWN0RGVmaW5pdGlvbiBleHRyYWN0QXJ0aWZhY3REZWZpbml0aW9uKEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4gZWl0aGVyQXJ0aWZhY3QpIHsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIHJldDsKKwkJaWYgKGVpdGhlckFydGlmYWN0LmlzTGVmdCgpKSB7CisJCQlyZXQgPSBlaXRoZXJBcnRpZmFjdC5sZWZ0KCkudmFsdWUoKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGVpdGhlckFydGlmYWN0LnJpZ2h0KCkudmFsdWUoKS5nZXRJbXBsZW1lbnRhdGlvbigpOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJLyoqCisJICogZG93bmxvYWRzIGFydGlmYWN0IG9mIGNvbXBvbmVudCBieSBVVUlEcworCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlCisJICogQHBhcmFtIGNvbXBvbmVudFV1aWQKKwkgKiBAcGFyYW0gYXJ0aWZhY3RVVUlECisJICogQHBhcmFtIGF1ZGl0QWRkaXRpb25hbFBhcmFtCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Ynl0ZVtdLCBSZXNwb25zZUZvcm1hdD4gZG93bmxvYWRDb21wb25lbnRBcnRpZmFjdEJ5VVVJRHMoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFV1aWQsIFN0cmluZyBhcnRpZmFjdFVVSUQsIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0QWRkaXRpb25hbFBhcmFtKSB7CisJCVdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdDsKKwkJYnl0ZVtdIGRvd25sb2FkZWRBcnRpZmFjdCA9IG51bGw7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBnZXRMYXRlc3RDb21wb25lbnRCeVV1aWQoY29tcG9uZW50VHlwZSwgY29tcG9uZW50VXVpZCwgZXJyb3JXcmFwcGVyKTsKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWF1ZGl0QWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQkJZG93bmxvYWRlZEFydGlmYWN0ID0gZG93bmxvYWRBcnRpZmFjdChjb21wb25lbnQuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLCBhcnRpZmFjdFVVSUQsIGVycm9yV3JhcHBlciwgY29tcG9uZW50LmdldE5hbWUoKSk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGRvd25sb2FkZWRBcnRpZmFjdCk7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIGRvd25sb2FkcyBhbiBhcnRpZmFjdCBvZiByZXNvdXJjZSBpbnN0YW5jZSBvZiBjb21wb25lbnQgYnkgVVVJRHMKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBjb21wb25lbnRVdWlkCisJICogQHBhcmFtIHJlc291cmNlTmFtZQorCSAqIEBwYXJhbSBhcnRpZmFjdFVVSUQKKwkgKiBAcGFyYW0gYXVkaXRBZGRpdGlvbmFsUGFyYW0KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBkb3dubG9hZFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdEJ5VVVJRHMoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFV1aWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwgU3RyaW5nIGFydGlmYWN0VVVJRCwgTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRBZGRpdGlvbmFsUGFyYW0pIHsKKwkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlFaXRoZXI8Ynl0ZVtdLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0OworCQlieXRlW10gZG93bmxvYWRlZEFydGlmYWN0ID0gbnVsbDsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IGdldFJlbGF0ZWRDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnRUeXBlLCBjb21wb25lbnRVdWlkLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgZXJyb3JXcmFwcGVyKTsKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWF1ZGl0QWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHJlc291cmNlSW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJCWRvd25sb2FkZWRBcnRpZmFjdCA9IGRvd25sb2FkQXJ0aWZhY3QocmVzb3VyY2VJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCksIGFydGlmYWN0VVVJRCwgZXJyb3JXcmFwcGVyLCByZXNvdXJjZUluc3RhbmNlLmdldE5hbWUoKSk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGRvd25sb2FkZWRBcnRpZmFjdCk7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHVwbG9hZHMgYW4gYXJ0aWZhY3QgdG8gYSBjb21wb25lbnQgYnkgVVVJRAorCSAqIAorCSAqIEBwYXJhbSBkYXRhCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBjb21wb25lbnRVdWlkCisJICogQHBhcmFtIGFkZGl0aW9uYWxQYXJhbXMKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGxvYWRBcnRpZmFjdFRvQ29tcG9uZW50QnlVVUlEKFN0cmluZyBkYXRhLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFV1aWQsIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMpIHsKKwkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3VsdCA9IG51bGw7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGxvYWRBcnRpZmFjdFJlc3VsdDsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIHVwbG9hZEFydGlmYWN0OworCQlDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwkJU3RyaW5nIGNvbXBvbmVudElkID0gbnVsbDsKKwkJQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uID0gQXJ0aWZhY3RPcGVyYXRpb24uQ3JlYXRlOworCQlvcGVyYXRpb24uc2V0RXh0ZXJuYWxBcGkodHJ1ZSk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8gPSBSZXByZXNlbnRhdGlvblV0aWxzLmNvbnZlcnRKc29uVG9BcnRpZmFjdERlZmluaXRpb24oZGF0YSwgQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKTsKKwkJU3RyaW5nIG9yaWdNZDUgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuTUQ1X0hFQURFUik7CisJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCisJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudFJlcyA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlKS5nZXRMYXRlc3RDb21wb25lbnRNZXRhZGF0YUJ5VXVpZChjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCksIGNvbXBvbmVudFV1aWQpOworCQlpZiAoZ2V0Q29tcG9uZW50UmVzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRDb21wb25lbnRSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDb3VsZCBub3QgZmV0Y2ggY29tcG9uZW50IHdpdGggdHlwZSB7fSBhbmQgdXVpZCB7fS4gU3RhdHVzIGlzIHt9LiAiLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRVdWlkLCBzdGF0dXMpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0YXR1cykpKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSAmJiAhZ2V0Q29tcG9uZW50UmVzLmxlZnQoKS52YWx1ZSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRTdGF0ZSgpLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpKSB7CisJCQljb21wb25lbnQgPSBjaGVja291dFBhcmVudENvbXBvbmVudChjb21wb25lbnRUeXBlLCBnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIHVzZXJJZCwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7CisJCQkJY29tcG9uZW50SWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJCX0gZWxzZSB7CisJCQkJY29tcG9uZW50SWQgPSBnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCk7CisJCQl9CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWFkZGl0aW9uYWxQYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgZ2V0Q29tcG9uZW50UmVzLmxlZnQoKS52YWx1ZSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJYWN0aW9uUmVzdWx0ID0gaGFuZGxlQXJ0aWZhY3RSZXF1ZXN0KGNvbXBvbmVudElkLCB1c2VySWQsIGNvbXBvbmVudFR5cGUsIG9wZXJhdGlvbiwgbnVsbCwgYXJ0aWZhY3RJbmZvLCBvcmlnTWQ1LCBkYXRhLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKwkJCWlmIChhY3Rpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBsb2FkIGFydGlmYWN0IHRvIGNvbXBvbmVudCB3aXRoIHR5cGUge30gYW5kIHV1aWQge30uIFN0YXR1cyBpcyB7fS4gIiwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50VXVpZCwgYWN0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChhY3Rpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdXBsb2FkQXJ0aWZhY3QgPSBhY3Rpb25SZXN1bHQubGVmdCgpLnZhbHVlKCkubGVmdCgpLnZhbHVlKCk7CisJCQl1cGRhdGVBdWRpdFBhcmFtZXRlcnNXaXRoQXJ0aWZhY3REZWZpbml0aW9uKGFkZGl0aW9uYWxQYXJhbXMsIHVwbG9hZEFydGlmYWN0KTsKKwkJCXVwbG9hZEFydGlmYWN0UmVzdWx0ID0gRWl0aGVyLmxlZnQodXBsb2FkQXJ0aWZhY3QpOworCQl9IGVsc2UgeworCQkJdXBsb2FkQXJ0aWZhY3RSZXN1bHQgPSBFaXRoZXIucmlnaHQoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gdXBsb2FkQXJ0aWZhY3RSZXN1bHQ7CisJfQorCisJLyoqCisJICogdXBsb2FkIGFuIGFydGlmYWN0IHRvIGEgcmVzb3VyY2UgaW5zdGFuY2UgYnkgVVVJRAorCSAqIAorCSAqIEBwYXJhbSBkYXRhCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBjb21wb25lbnRVdWlkCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VOYW1lCisJICogQHBhcmFtIGFkZGl0aW9uYWxQYXJhbXMKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGxvYWRBcnRpZmFjdFRvUmlCeVVVSUQoU3RyaW5nIGRhdGEsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgY29tcG9uZW50VXVpZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lLAorCQkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcykgeworCQlXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGxvYWRBcnRpZmFjdFJlc3VsdDsKKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXN1bHQgPSBudWxsOworCQlBcnRpZmFjdERlZmluaXRpb24gdXBsb2FkQXJ0aWZhY3Q7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZDsKKwkJU3RyaW5nIGNvbXBvbmVudElkOworCQlTdHJpbmcgb3JpZ01kNSA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5NRDVfSEVBREVSKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisKKwkJSW1tdXRhYmxlUGFpcjxDb21wb25lbnQsIENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRSaVBhaXIgPSBudWxsOworCQlFaXRoZXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRSZXMgPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29tcG9uZW50VHlwZSkuZ2V0TGF0ZXN0Q29tcG9uZW50TWV0YWRhdGFCeVV1aWQoY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpLCBjb21wb25lbnRVdWlkKTsKKwkJaWYgKGdldENvbXBvbmVudFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0Q29tcG9uZW50UmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQ291bGQgbm90IGZldGNoIGNvbXBvbmVudCB3aXRoIHR5cGUge30gYW5kIHV1aWQge30uIFN0YXR1cyBpcyB7fS4gIiwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50VXVpZCwgc3RhdHVzKTsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdGF0dXMpKSk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkgJiYgIWdldENvbXBvbmVudFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3RhdGUoKS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQubmFtZSgpKSkgeworCQkJY29tcG9uZW50ID0gY2hlY2tvdXRQYXJlbnRDb21wb25lbnQoY29tcG9uZW50VHlwZSwgZ2V0Q29tcG9uZW50UmVzLmxlZnQoKS52YWx1ZSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCB1c2VySWQsIGVycm9yV3JhcHBlcik7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkgeworCQkJCWNvbXBvbmVudFJpUGFpciA9IGdldFJlbGF0ZWRDb21wb25lbnRDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnRUeXBlLCBjb21wb25lbnRVdWlkLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgZXJyb3JXcmFwcGVyKTsKKwkJCX0gZWxzZSB7CisJCQkJY29tcG9uZW50UmlQYWlyID0gZ2V0UmVsYXRlZENvbXBvbmVudENvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudCwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIGVycm9yV3JhcHBlcik7CisJCQl9CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWNvbXBvbmVudEluc3RhbmNlSWQgPSBjb21wb25lbnRSaVBhaXIuZ2V0UmlnaHQoKS5nZXRVbmlxdWVJZCgpOworCQkJY29tcG9uZW50SWQgPSBjb21wb25lbnRSaVBhaXIuZ2V0TGVmdCgpLmdldFVuaXF1ZUlkKCk7CisJCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHJlc291cmNlSW5zdGFuY2VOYW1lKTsKKwkJCUFydGlmYWN0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZTsKKwkJCW9wZXJhdGlvbi5zZXRFeHRlcm5hbEFwaSh0cnVlKTsKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8gPSBSZXByZXNlbnRhdGlvblV0aWxzLmNvbnZlcnRKc29uVG9BcnRpZmFjdERlZmluaXRpb24oZGF0YSwgQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKTsKKworCQkJYWN0aW9uUmVzdWx0ID0gaGFuZGxlQXJ0aWZhY3RSZXF1ZXN0KGNvbXBvbmVudEluc3RhbmNlSWQsIHVzZXJJZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UsIG9wZXJhdGlvbiwgbnVsbCwgYXJ0aWZhY3RJbmZvLCBvcmlnTWQ1LCBkYXRhLCBudWxsLCBudWxsLCBjb21wb25lbnRJZCwgQ29tcG9uZW50VHlwZUVudW0uZmluZFBhcmFtQnlUeXBlKGNvbXBvbmVudFR5cGUpKTsKKwkJCWlmIChhY3Rpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBsb2FkIGFydGlmYWN0IHRvIGNvbXBvbmVudCBpbnN0YW5jZSB7fSBvZiBjb21wb25lbnQgd2l0aCB0eXBlIHt9IGFuZCB1dWlkIHt9LiBTdGF0dXMgaXMge30uICIsIHJlc291cmNlSW5zdGFuY2VOYW1lLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRVdWlkLCBhY3Rpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGFjdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl1cGxvYWRBcnRpZmFjdCA9IGFjdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKS5sZWZ0KCkudmFsdWUoKTsKKwkJCXVwZGF0ZUF1ZGl0UGFyYW1ldGVyc1dpdGhBcnRpZmFjdERlZmluaXRpb24oYWRkaXRpb25hbFBhcmFtcywgdXBsb2FkQXJ0aWZhY3QpOworCQkJdXBsb2FkQXJ0aWZhY3RSZXN1bHQgPSBFaXRoZXIubGVmdCh1cGxvYWRBcnRpZmFjdCk7CisJCX0gZWxzZSB7CisJCQl1cGxvYWRBcnRpZmFjdFJlc3VsdCA9IEVpdGhlci5yaWdodChlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJCXJldHVybiB1cGxvYWRBcnRpZmFjdFJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiB1cGRhdGVzIGFuIGFydGlmYWN0IG9uIGEgY29tcG9uZW50IGJ5IFVVSUQKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIGNvbXBvbmVudFR5cGUKKwkgKiBAcGFyYW0gY29tcG9uZW50VXVpZAorCSAqIEBwYXJhbSBhcnRpZmFjdFVVSUQKKwkgKiBAcGFyYW0gYWRkaXRpb25hbFBhcmFtcworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUFydGlmYWN0T25Db21wb25lbnRCeVVVSUQoU3RyaW5nIGRhdGEsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgY29tcG9uZW50VXVpZCwgU3RyaW5nIGFydGlmYWN0VVVJRCwKKwkJCU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMpIHsKKwkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlQXJ0aWZhY3RSZXN1bHQ7CisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzdWx0ID0gbnVsbDsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIHVwZGF0ZUFydGlmYWN0OworCQlDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwkJU3RyaW5nIGNvbXBvbmVudElkID0gbnVsbDsKKwkJU3RyaW5nIGFydGlmYWN0SWQgPSBudWxsOworCQlBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24gPSBBcnRpZmFjdE9wZXJhdGlvbi5VcGRhdGU7CisJCW9wZXJhdGlvbi5zZXRFeHRlcm5hbEFwaSh0cnVlKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbyA9IFJlcHJlc2VudGF0aW9uVXRpbHMuY29udmVydEpzb25Ub0FydGlmYWN0RGVmaW5pdGlvbihkYXRhLCBBcnRpZmFjdERlZmluaXRpb24uY2xhc3MpOworCQlTdHJpbmcgb3JpZ01kNSA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5NRDVfSEVBREVSKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisKKwkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50UmVzID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGUpLmdldExhdGVzdENvbXBvbmVudE1ldGFkYXRhQnlVdWlkKGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKSwgY29tcG9uZW50VXVpZCk7CisJCWlmIChnZXRDb21wb25lbnRSZXMuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdldENvbXBvbmVudFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkNvdWxkIG5vdCBmZXRjaCBjb21wb25lbnQgd2l0aCB0eXBlIHt9IGFuZCB1dWlkIHt9LiBTdGF0dXMgaXMge30uICIsIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFV1aWQsIHN0YXR1cyk7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RhdHVzKSkpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpICYmICFnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCkuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULm5hbWUoKSkpIHsKKwkJCWNvbXBvbmVudCA9IGNoZWNrb3V0UGFyZW50Q29tcG9uZW50KGNvbXBvbmVudFR5cGUsIGdldENvbXBvbmVudFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgdXNlcklkLCBlcnJvcldyYXBwZXIpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKwkJCQljb21wb25lbnRJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJfSBlbHNlIHsKKwkJCQljb21wb25lbnRJZCA9IGdldENvbXBvbmVudFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJYXJ0aWZhY3RJZCA9IGdldExhdGVzdFBhcmVudEFydGlmYWN0RGF0YUlkQnlBcnRpZmFjdFVVSUQoYXJ0aWZhY3RVVUlELCBlcnJvcldyYXBwZXIsIGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJYWRkaXRpb25hbFBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCBnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisKKwkJCWFjdGlvblJlc3VsdCA9IGhhbmRsZUFydGlmYWN0UmVxdWVzdChjb21wb25lbnRJZCwgdXNlcklkLCBjb21wb25lbnRUeXBlLCBvcGVyYXRpb24sIGFydGlmYWN0SWQsIGFydGlmYWN0SW5mbywgb3JpZ01kNSwgZGF0YSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisJCQlpZiAoYWN0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwbG9hZCBhcnRpZmFjdCB0byBjb21wb25lbnQgd2l0aCB0eXBlIHt9IGFuZCB1dWlkIHt9LiBTdGF0dXMgaXMge30uICIsIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFV1aWQsIGFjdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYWN0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXVwZGF0ZUFydGlmYWN0ID0gYWN0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmxlZnQoKS52YWx1ZSgpOworCQkJdXBkYXRlQXVkaXRQYXJhbWV0ZXJzV2l0aEFydGlmYWN0RGVmaW5pdGlvbihhZGRpdGlvbmFsUGFyYW1zLCB1cGRhdGVBcnRpZmFjdCk7CisJCQl1cGRhdGVBcnRpZmFjdFJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZUFydGlmYWN0KTsKKworCQl9IGVsc2UgeworCQkJdXBkYXRlQXJ0aWZhY3RSZXN1bHQgPSBFaXRoZXIucmlnaHQoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlQXJ0aWZhY3RSZXN1bHQ7CisJfQorCisJLyoqCisJICogdXBkYXRlcyBhbiBhcnRpZmFjdCBvbiBhIHJlc291cmNlIGluc3RhbmNlIGJ5IFVVSUQKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIGNvbXBvbmVudFR5cGUKKwkgKiBAcGFyYW0gY29tcG9uZW50VXVpZAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlTmFtZQorCSAqIEBwYXJhbSBhcnRpZmFjdFVVSUQKKwkgKiBAcGFyYW0gYWRkaXRpb25hbFBhcmFtcworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUFydGlmYWN0T25SaUJ5VVVJRChTdHJpbmcgZGF0YSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRVdWlkLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIFN0cmluZyBhcnRpZmFjdFVVSUQsCisJCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zKSB7CisKKwkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlQXJ0aWZhY3RSZXN1bHQ7CisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzdWx0ID0gbnVsbDsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIHVwZGF0ZUFydGlmYWN0OworCQlDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQgPSBudWxsOworCQlTdHJpbmcgY29tcG9uZW50SWQgPSBudWxsOworCQlTdHJpbmcgYXJ0aWZhY3RJZCA9IG51bGw7CisJCVN0cmluZyBvcmlnTWQ1ID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLk1ENV9IRUFERVIpOworCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKworCQlJbW11dGFibGVQYWlyPENvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudFJpUGFpciA9IG51bGw7CisJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudFJlcyA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlKS5nZXRMYXRlc3RDb21wb25lbnRNZXRhZGF0YUJ5VXVpZChjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCksIGNvbXBvbmVudFV1aWQpOworCQlpZiAoZ2V0Q29tcG9uZW50UmVzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRDb21wb25lbnRSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDb3VsZCBub3QgZmV0Y2ggY29tcG9uZW50IHdpdGggdHlwZSB7fSBhbmQgdXVpZCB7fS4gU3RhdHVzIGlzIHt9LiAiLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRVdWlkLCBzdGF0dXMpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0YXR1cykpKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSAmJiAhZ2V0Q29tcG9uZW50UmVzLmxlZnQoKS52YWx1ZSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRTdGF0ZSgpLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpKSB7CisJCQljb21wb25lbnQgPSBjaGVja291dFBhcmVudENvbXBvbmVudChjb21wb25lbnRUeXBlLCBnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIHVzZXJJZCwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7CisJCQkJY29tcG9uZW50UmlQYWlyID0gZ2V0UmVsYXRlZENvbXBvbmVudENvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFV1aWQsIHJlc291cmNlSW5zdGFuY2VOYW1lLCBlcnJvcldyYXBwZXIpOworCQkJfSBlbHNlIHsKKwkJCQljb21wb25lbnRSaVBhaXIgPSBnZXRSZWxhdGVkQ29tcG9uZW50Q29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50LCByZXNvdXJjZUluc3RhbmNlTmFtZSwgZXJyb3JXcmFwcGVyKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJY29tcG9uZW50SW5zdGFuY2VJZCA9IGNvbXBvbmVudFJpUGFpci5nZXRSaWdodCgpLmdldFVuaXF1ZUlkKCk7CisJCQljb21wb25lbnRJZCA9IGNvbXBvbmVudFJpUGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKTsKKwkJCWFydGlmYWN0SWQgPSBnZXRMYXRlc3RQYXJlbnRBcnRpZmFjdERhdGFJZEJ5QXJ0aWZhY3RVVUlEKGFydGlmYWN0VVVJRCwgZXJyb3JXcmFwcGVyLCBjb21wb25lbnRJbnN0YW5jZUlkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWFkZGl0aW9uYWxQYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgcmVzb3VyY2VJbnN0YW5jZU5hbWUpOworCQkJQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uID0gQXJ0aWZhY3RPcGVyYXRpb24uVXBkYXRlOworCQkJb3BlcmF0aW9uLnNldEV4dGVybmFsQXBpKHRydWUpOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbyA9IFJlcHJlc2VudGF0aW9uVXRpbHMuY29udmVydEpzb25Ub0FydGlmYWN0RGVmaW5pdGlvbihkYXRhLCBBcnRpZmFjdERlZmluaXRpb24uY2xhc3MpOworCisJCQlhY3Rpb25SZXN1bHQgPSBoYW5kbGVBcnRpZmFjdFJlcXVlc3QoY29tcG9uZW50SW5zdGFuY2VJZCwgdXNlcklkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgb3BlcmF0aW9uLCBhcnRpZmFjdElkLCBhcnRpZmFjdEluZm8sIG9yaWdNZDUsIGRhdGEsIG51bGwsIG51bGwsIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUoY29tcG9uZW50VHlwZSkpOworCQkJaWYgKGFjdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGxvYWQgYXJ0aWZhY3QgdG8gY29tcG9uZW50IGluc3RhbmNlIHt9IG9mIGNvbXBvbmVudCB3aXRoIHR5cGUge30gYW5kIHV1aWQge30uIFN0YXR1cyBpcyB7fS4gIiwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFV1aWQsIGFjdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYWN0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXVwZGF0ZUFydGlmYWN0ID0gYWN0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmxlZnQoKS52YWx1ZSgpOworCQkJdXBkYXRlQXVkaXRQYXJhbWV0ZXJzV2l0aEFydGlmYWN0RGVmaW5pdGlvbihhZGRpdGlvbmFsUGFyYW1zLCB1cGRhdGVBcnRpZmFjdCk7CisJCQl1cGRhdGVBcnRpZmFjdFJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZUFydGlmYWN0KTsKKwkJfSBlbHNlIHsKKwkJCXVwZGF0ZUFydGlmYWN0UmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJcmV0dXJuIHVwZGF0ZUFydGlmYWN0UmVzdWx0OworCisJfQorCisJLyoqCisJICogZGVsZXRlcyBhbiBhcnRpZmFjdCBvbiBhIGNvbXBvbmVudCBieSBVVUlECisJICogCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBjb21wb25lbnRVdWlkCisJICogQHBhcmFtIGFydGlmYWN0VVVJRAorCSAqIEBwYXJhbSBhZGRpdGlvbmFsUGFyYW1zCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlQXJ0aWZhY3RPbkNvbXBvbmVudEJ5VVVJRChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFV1aWQsIFN0cmluZyBhcnRpZmFjdFVVSUQsIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMpIHsKKworCQlXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVBcnRpZmFjdFJlc3VsdDsKKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXN1bHQgPSBudWxsOworCQlBcnRpZmFjdERlZmluaXRpb24gZGVsZXRlQXJ0aWZhY3Q7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlTdHJpbmcgY29tcG9uZW50SWQgPSBudWxsOworCQlTdHJpbmcgYXJ0aWZhY3RJZCA9IG51bGw7CisJCUFydGlmYWN0T3BlcmF0aW9uIG9wZXJhdGlvbiA9IEFydGlmYWN0T3BlcmF0aW9uLkRlbGV0ZTsKKwkJb3BlcmF0aW9uLnNldEV4dGVybmFsQXBpKHRydWUpOworCQlTdHJpbmcgb3JpZ01kNSA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5NRDVfSEVBREVSKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisKKwkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50UmVzID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGUpLmdldExhdGVzdENvbXBvbmVudE1ldGFkYXRhQnlVdWlkKGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKSwgY29tcG9uZW50VXVpZCk7CisJCWlmIChnZXRDb21wb25lbnRSZXMuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdldENvbXBvbmVudFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkNvdWxkIG5vdCBmZXRjaCBjb21wb25lbnQgd2l0aCB0eXBlIHt9IGFuZCB1dWlkIHt9LiBTdGF0dXMgaXMge30uICIsIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFV1aWQsIHN0YXR1cyk7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RhdHVzKSkpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpICYmICFnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCkuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULm5hbWUoKSkpIHsKKwkJCWNvbXBvbmVudCA9IGNoZWNrb3V0UGFyZW50Q29tcG9uZW50KGNvbXBvbmVudFR5cGUsIGdldENvbXBvbmVudFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgdXNlcklkLCBlcnJvcldyYXBwZXIpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKwkJCQljb21wb25lbnRJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJfSBlbHNlIHsKKwkJCQljb21wb25lbnRJZCA9IGdldENvbXBvbmVudFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJYXJ0aWZhY3RJZCA9IGdldExhdGVzdFBhcmVudEFydGlmYWN0RGF0YUlkQnlBcnRpZmFjdFVVSUQoYXJ0aWZhY3RVVUlELCBlcnJvcldyYXBwZXIsIGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJYWRkaXRpb25hbFBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCBnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisKKwkJCWFjdGlvblJlc3VsdCA9IGhhbmRsZUFydGlmYWN0UmVxdWVzdChjb21wb25lbnRJZCwgdXNlcklkLCBjb21wb25lbnRUeXBlLCBvcGVyYXRpb24sIGFydGlmYWN0SWQsIG51bGwsIG9yaWdNZDUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworCQkJaWYgKGFjdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGxvYWQgYXJ0aWZhY3QgdG8gY29tcG9uZW50IHdpdGggdHlwZSB7fSBhbmQgdXVpZCB7fS4gU3RhdHVzIGlzIHt9LiAiLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRVdWlkLCBhY3Rpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGFjdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlkZWxldGVBcnRpZmFjdCA9IGFjdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKS5sZWZ0KCkudmFsdWUoKTsKKwkJCXVwZGF0ZUF1ZGl0UGFyYW1ldGVyc1dpdGhBcnRpZmFjdERlZmluaXRpb24oYWRkaXRpb25hbFBhcmFtcywgZGVsZXRlQXJ0aWZhY3QpOworCQkJZGVsZXRlQXJ0aWZhY3RSZXN1bHQgPSBFaXRoZXIubGVmdChkZWxldGVBcnRpZmFjdCk7CisJCX0gZWxzZSB7CisJCQlkZWxldGVBcnRpZmFjdFJlc3VsdCA9IEVpdGhlci5yaWdodChlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJCXJldHVybiBkZWxldGVBcnRpZmFjdFJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBkZWxldGVzIGFuIGFydGlmYWN0IGFuIGEgcmVzb3VyY2UgaW5zdGFuY2UgYnkgVVVJRAorCSAqIAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIGNvbXBvbmVudFR5cGUKKwkgKiBAcGFyYW0gY29tcG9uZW50VXVpZAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlTmFtZQorCSAqIEBwYXJhbSBhcnRpZmFjdFVVSUQKKwkgKiBAcGFyYW0gYWRkaXRpb25hbFBhcmFtcworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZUFydGlmYWN0T25SaUJ5VVVJRChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFV1aWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwgU3RyaW5nIGFydGlmYWN0VVVJRCwKKwkJCU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMpIHsKKworCQlXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVBcnRpZmFjdFJlc3VsdDsKKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXN1bHQgPSBudWxsOworCQlBcnRpZmFjdERlZmluaXRpb24gZGVsZXRlQXJ0aWZhY3Q7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCA9IG51bGw7CisJCVN0cmluZyBjb21wb25lbnRJZCA9IG51bGw7CisJCVN0cmluZyBhcnRpZmFjdElkID0gbnVsbDsKKwkJU3RyaW5nIG9yaWdNZDUgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuTUQ1X0hFQURFUik7CisJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCQlJbW11dGFibGVQYWlyPENvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudFJpUGFpciA9IG51bGw7CisJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudFJlcyA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlKS5nZXRMYXRlc3RDb21wb25lbnRNZXRhZGF0YUJ5VXVpZChjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCksIGNvbXBvbmVudFV1aWQpOworCQlpZiAoZ2V0Q29tcG9uZW50UmVzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRDb21wb25lbnRSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDb3VsZCBub3QgZmV0Y2ggY29tcG9uZW50IHdpdGggdHlwZSB7fSBhbmQgdXVpZCB7fS4gU3RhdHVzIGlzIHt9LiAiLCBjb21wb25lbnRUeXBlLCBjb21wb25lbnRVdWlkLCBzdGF0dXMpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0YXR1cykpKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSAmJiAhZ2V0Q29tcG9uZW50UmVzLmxlZnQoKS52YWx1ZSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRTdGF0ZSgpLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpKSB7CisJCQljb21wb25lbnQgPSBjaGVja291dFBhcmVudENvbXBvbmVudChjb21wb25lbnRUeXBlLCBnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIHVzZXJJZCwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7CisJCQkJY29tcG9uZW50UmlQYWlyID0gZ2V0UmVsYXRlZENvbXBvbmVudENvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFV1aWQsIHJlc291cmNlSW5zdGFuY2VOYW1lLCBlcnJvcldyYXBwZXIpOworCQkJfSBlbHNlIHsKKwkJCQljb21wb25lbnRSaVBhaXIgPSBnZXRSZWxhdGVkQ29tcG9uZW50Q29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50LCByZXNvdXJjZUluc3RhbmNlTmFtZSwgZXJyb3JXcmFwcGVyKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJY29tcG9uZW50SW5zdGFuY2VJZCA9IGNvbXBvbmVudFJpUGFpci5nZXRSaWdodCgpLmdldFVuaXF1ZUlkKCk7CisJCQljb21wb25lbnRJZCA9IGNvbXBvbmVudFJpUGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKTsKKwkJCWFydGlmYWN0SWQgPSBnZXRMYXRlc3RQYXJlbnRBcnRpZmFjdERhdGFJZEJ5QXJ0aWZhY3RVVUlEKGFydGlmYWN0VVVJRCwgZXJyb3JXcmFwcGVyLCBjb21wb25lbnRJbnN0YW5jZUlkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKworCQkJYWRkaXRpb25hbFBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCByZXNvdXJjZUluc3RhbmNlTmFtZSk7CisJCQlBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24gPSBBcnRpZmFjdE9wZXJhdGlvbi5EZWxldGU7CisJCQlvcGVyYXRpb24uc2V0RXh0ZXJuYWxBcGkodHJ1ZSk7CisKKwkJCWFjdGlvblJlc3VsdCA9IGhhbmRsZUFydGlmYWN0UmVxdWVzdChjb21wb25lbnRJbnN0YW5jZUlkLCB1c2VySWQsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX0lOU1RBTkNFLCBvcGVyYXRpb24sIGFydGlmYWN0SWQsIG51bGwsIG9yaWdNZDUsIG51bGwsIG51bGwsIG51bGwsIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUoY29tcG9uZW50VHlwZSkpOworCisJCQlpZiAoYWN0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwbG9hZCBhcnRpZmFjdCB0byBjb21wb25lbnQgaW5zdGFuY2Uge30gb2YgY29tcG9uZW50IHdpdGggdHlwZSB7fSBhbmQgdXVpZCB7fS4gU3RhdHVzIGlzIHt9LiAiLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50VXVpZCwgYWN0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChhY3Rpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJZGVsZXRlQXJ0aWZhY3QgPSBhY3Rpb25SZXN1bHQubGVmdCgpLnZhbHVlKCkubGVmdCgpLnZhbHVlKCk7CisJCQl1cGRhdGVBdWRpdFBhcmFtZXRlcnNXaXRoQXJ0aWZhY3REZWZpbml0aW9uKGFkZGl0aW9uYWxQYXJhbXMsIGRlbGV0ZUFydGlmYWN0KTsKKwkJCWRlbGV0ZUFydGlmYWN0UmVzdWx0ID0gRWl0aGVyLmxlZnQoZGVsZXRlQXJ0aWZhY3QpOworCQl9IGVsc2UgeworCQkJZGVsZXRlQXJ0aWZhY3RSZXN1bHQgPSBFaXRoZXIucmlnaHQoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gZGVsZXRlQXJ0aWZhY3RSZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZSBnZXRSZWxhdGVkQ29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFV1aWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwgV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyKSB7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gbnVsbDsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXM7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VJbnN0YW5jZVJlcyA9IG51bGw7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBnZXRMYXRlc3RDb21wb25lbnRCeVV1aWQoY29tcG9uZW50VHlwZSwgY29tcG9uZW50VXVpZCwgZXJyb3JXcmFwcGVyKTsKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpLnN0cmVhbSgpLmZpbHRlcihjaSAtPiBjaS5nZXROb3JtYWxpemVkTmFtZSgpLmVxdWFscyhyZXNvdXJjZUluc3RhbmNlTmFtZSkpLmZpbmRBbnkoKS5nZXQoKTsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZSA9PSBudWxsKSB7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlNUQU5DRV9OT1RfRk9VTkRfT05fQ09OVEFJTkVSLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgInJlc291cmNlIGluc3RhbmNlIiwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKS5nZXRWYWx1ZSgpLCBjb21wb25lbnQuZ2V0TmFtZSgpKSk7CisJCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgaW5zdGFuY2Uge30gd2FzIG5vdCBmb3VuZCBmb3IgY29tcG9uZW50IHt9IiwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQkJfQorCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlnZXRSZXNvdXJjZUluc3RhbmNlUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbi5nZXRSZXNvdXJjZUluc3RhbmNlQnlJZChjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCWlmIChnZXRSZXNvdXJjZUluc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJCXN0YXR1cyA9IGdldFJlc291cmNlSW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdGF0dXMpKSk7CisJCQl9CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWNvbXBvbmVudEluc3RhbmNlID0gZ2V0UmVzb3VyY2VJbnN0YW5jZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWdldFJlc291cmNlSW5zdGFuY2VSZXMgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uLmdldEZ1bGxDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZSwgY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpKTsKKwkJCWlmIChnZXRSZXNvdXJjZUluc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJCXN0YXR1cyA9IGdldFJlc291cmNlSW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdGF0dXMpKSk7CisJCQl9IGVsc2UgeworCQkJCWNvbXBvbmVudEluc3RhbmNlID0gZ2V0UmVzb3VyY2VJbnN0YW5jZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2U7CisJfQorCisJcHJpdmF0ZSBJbW11dGFibGVQYWlyPENvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2U+IGdldFJlbGF0ZWRDb21wb25lbnRDb21wb25lbnRJbnN0YW5jZShDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlcikgeworCisJCUltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBDb21wb25lbnRJbnN0YW5jZT4gcmVsYXRlZENvbXBvbmVudENvbXBvbmVudEluc3RhbmNlUGFpciA9IG51bGw7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpLnN0cmVhbSgpLmZpbHRlcihjaSAtPiBjaS5nZXROb3JtYWxpemVkTmFtZSgpLmVxdWFscyhyZXNvdXJjZUluc3RhbmNlTmFtZSkpLmZpbmRBbnkoKS5nZXQoKTsKKwkJaWYgKGNvbXBvbmVudEluc3RhbmNlID09IG51bGwpIHsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5TVEFOQ0VfTk9UX0ZPVU5EX09OX0NPTlRBSU5FUiwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsICJyZXNvdXJjZSBpbnN0YW5jZSIsIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkuZ2V0VmFsdWUoKSwgY29tcG9uZW50LmdldE5hbWUoKSkpOworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgaW5zdGFuY2Uge30gd2FzIG5vdCBmb3VuZCBmb3IgY29tcG9uZW50IHt9IiwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQl9IGVsc2UgeworCQkJcmVsYXRlZENvbXBvbmVudENvbXBvbmVudEluc3RhbmNlUGFpciA9IG5ldyBJbW11dGFibGVQYWlyPD4oY29tcG9uZW50LCBjb21wb25lbnRJbnN0YW5jZSk7CisJCX0KKwkJcmV0dXJuIHJlbGF0ZWRDb21wb25lbnRDb21wb25lbnRJbnN0YW5jZVBhaXI7CisJfQorCisJcHJpdmF0ZSBJbW11dGFibGVQYWlyPENvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2U+IGdldFJlbGF0ZWRDb21wb25lbnRDb21wb25lbnRJbnN0YW5jZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgY29tcG9uZW50VXVpZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIpIHsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2U7CisJCUltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBDb21wb25lbnRJbnN0YW5jZT4gcmVsYXRlZENvbXBvbmVudENvbXBvbmVudEluc3RhbmNlUGFpciA9IG51bGw7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBnZXRMYXRlc3RDb21wb25lbnRCeVV1aWQoY29tcG9uZW50VHlwZSwgY29tcG9uZW50VXVpZCwgZXJyb3JXcmFwcGVyKTsKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpLnN0cmVhbSgpLmZpbHRlcihjaSAtPiBjaS5nZXROb3JtYWxpemVkTmFtZSgpLmVxdWFscyhyZXNvdXJjZUluc3RhbmNlTmFtZSkpLmZpbmRBbnkoKS5nZXQoKTsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZSA9PSBudWxsKSB7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlNUQU5DRV9OT1RfRk9VTkRfT05fQ09OVEFJTkVSLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgInJlc291cmNlIGluc3RhbmNlIiwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKS5nZXRWYWx1ZSgpLCBjb21wb25lbnQuZ2V0TmFtZSgpKSk7CisJCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgaW5zdGFuY2Uge30gd2FzIG5vdCBmb3VuZCBmb3IgY29tcG9uZW50IHt9IiwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZWxhdGVkQ29tcG9uZW50Q29tcG9uZW50SW5zdGFuY2VQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8Pihjb21wb25lbnQsIGNvbXBvbmVudEluc3RhbmNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVsYXRlZENvbXBvbmVudENvbXBvbmVudEluc3RhbmNlUGFpcjsKKwl9CisKKwlwcml2YXRlIGJ5dGVbXSBkb3dubG9hZEFydGlmYWN0KE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzLCBTdHJpbmcgYXJ0aWZhY3RVVUlELCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIsIFN0cmluZyBjb21wb25lbnROYW1lKSB7CisKKwkJYnl0ZVtdIGRvd25sb2FkZWRBcnRpZmFjdCA9IG51bGw7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPiwgUmVzcG9uc2VGb3JtYXQ+IGRvd25sb2FkQXJ0aWZhY3RFaXRoZXIgPSBudWxsOworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IG51bGw7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBkZXBsb3ltZW50QXJ0aWZhY3QgPSBudWxsOworCQlpZiAoYXJ0aWZhY3RzICE9IG51bGwgJiYgIWFydGlmYWN0cy5pc0VtcHR5KCkpIHsKKwkJCWRlcGxveW1lbnRBcnRpZmFjdHMgPSBhcnRpZmFjdHMudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKGFydCAtPiBhcnQuZ2V0QXJ0aWZhY3RVVUlEKCkgIT0gbnVsbCAmJiBhcnQuZ2V0QXJ0aWZhY3RVVUlEKCkuZXF1YWxzKGFydGlmYWN0VVVJRCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCX0KKwkJaWYgKGRlcGxveW1lbnRBcnRpZmFjdHMgPT0gbnVsbCB8fCBkZXBsb3ltZW50QXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJEZXBsb3ltZW50IGFydGlmYWN0IHdpdGggdXVpZCB7fSB3YXMgbm90IGZvdW5kIGZvciBjb21wb25lbnQge30iLCBhcnRpZmFjdFVVSUQsIGNvbXBvbmVudE5hbWUpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORCwgYXJ0aWZhY3RVVUlEKSk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWRlcGxveW1lbnRBcnRpZmFjdCA9IGRlcGxveW1lbnRBcnRpZmFjdHMuZ2V0KDApOworCQkJZG93bmxvYWRBcnRpZmFjdEVpdGhlciA9IGRvd25sb2FkQXJ0aWZhY3QoZGVwbG95bWVudEFydGlmYWN0KTsKKwkJCWlmIChkb3dubG9hZEFydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRvd25sb2FkIGFydGlmYWN0IHt9LiAiLCBkZXBsb3ltZW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZG93bmxvYWRBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlsb2cudHJhY2UoIlN1Y2NlZWRlZCB0byBkb3dubG9hZCBhcnRpZmFjdCB3aXRoIHVuaXF1ZUlkIHt9IiwgZGVwbG95bWVudEFydGlmYWN0LmdldFVuaXF1ZUlkKCkpOworCQkJZG93bmxvYWRlZEFydGlmYWN0ID0gZG93bmxvYWRBcnRpZmFjdEVpdGhlci5sZWZ0KCkudmFsdWUoKS5nZXRSaWdodCgpOworCQl9CisJCXJldHVybiBkb3dubG9hZGVkQXJ0aWZhY3Q7CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnQgZ2V0TGF0ZXN0Q29tcG9uZW50QnlVdWlkKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRVdWlkLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIpIHsKKwkJQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudFJlcyA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlKS5nZXRMYXRlc3RDb21wb25lbnRCeVV1aWQoY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpLCBjb21wb25lbnRVdWlkKTsKKwkJaWYgKGdldENvbXBvbmVudFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0Q29tcG9uZW50UmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQ291bGQgbm90IGZldGNoIGNvbXBvbmVudCB3aXRoIHR5cGUge30gYW5kIHV1aWQge30uIFN0YXR1cyBpcyB7fS4gIiwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50VXVpZCwgc3RhdHVzKTsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdGF0dXMpKSk7CisJCX0gZWxzZSB7CisJCQljb21wb25lbnQgPSBnZXRDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIGNvbXBvbmVudDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRMYXRlc3RQYXJlbnRBcnRpZmFjdERhdGFJZEJ5QXJ0aWZhY3RVVUlEKFN0cmluZyBhcnRpZmFjdFVVSUQsIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciwgU3RyaW5nIHBhcmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisJCVN0cmluZyBhcnRpZmFjdElkID0gbnVsbDsKKwkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQ7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1czsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGxhdGVzdEFydGlmYWN0ID0gbnVsbDsKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IG51bGw7CisJCU5vZGVUeXBlRW51bSBwYXJlbnRUeXBlOworCQlpZiAoY29tcG9uZW50VHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSB7CisJCQlwYXJlbnRUeXBlID0gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCQl9IGVsc2UgeworCQkJcGFyZW50VHlwZSA9IE5vZGVUeXBlRW51bS5TZXJ2aWNlOworCQl9CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBcnRpZmFjdHNSZXMgPSBhcnRpZmFjdE9wZXJhdGlvbi5nZXRBcnRpZmFjdHMocGFyZW50SWQsIHBhcmVudFR5cGUsIGZhbHNlKTsKKwkJaWYgKGdldEFydGlmYWN0c1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCXN0b3JhZ2VTdGF0dXMgPSBnZXRBcnRpZmFjdHNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBhcnRpZmFjdHMgZGF0YSBmb3IgcGFyZW50IGNvbXBvbmVudCB7fSB3aXRoIHVpZCB7fSwgZXJyb3I6IHt9IiwgY29tcG9uZW50VHlwZS5uYW1lKCksIHBhcmVudElkLCBzdG9yYWdlU3RhdHVzKTsKKwkJCWlmICghc3RvcmFnZVN0YXR1cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMpOworCQkJfQorCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBhcnRpZmFjdFVVSUQpKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJYXJ0aWZhY3RzID0gZ2V0QXJ0aWZhY3RzUmVzLmxlZnQoKS52YWx1ZSgpLnZhbHVlcygpLnN0cmVhbSgpLmZpbHRlcihhIC0+IGEuZ2V0QXJ0aWZhY3RVVUlEKCkgIT0gbnVsbCAmJiBhLmdldEFydGlmYWN0VVVJRCgpLmVxdWFscyhhcnRpZmFjdFVVSUQpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZldGNoIGFydGlmYWN0IHdpdGggVVVJRCB7fSBkYXRhIGZvciBwYXJlbnQgY29tcG9uZW50IHt9IHdpdGggdWlkIHt9LCBlcnJvcjoge30iLCBhcnRpZmFjdFVVSUQsIGNvbXBvbmVudFR5cGUubmFtZSgpLCBwYXJlbnRJZCwgYWN0aW9uU3RhdHVzKTsKKwkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGFydGlmYWN0VVVJRCkpOworCQkJfQorCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlsYXRlc3RBcnRpZmFjdCA9IGFydGlmYWN0cy5zdHJlYW0oKS5tYXgoKGExLCBhMikgLT4geworCQkJCWludCBjb21wYXJlUmVzID0gRG91YmxlLmNvbXBhcmUoRG91YmxlLnBhcnNlRG91YmxlKGExLmdldEFydGlmYWN0VmVyc2lvbigpKSwgRG91YmxlLnBhcnNlRG91YmxlKGEyLmdldEFydGlmYWN0VmVyc2lvbigpKSk7CisJCQkJaWYgKGNvbXBhcmVSZXMgPT0gMCkgeworCQkJCQljb21wYXJlUmVzID0gTG9uZy5jb21wYXJlKGExLmdldExhc3RVcGRhdGVEYXRlKCkgPT0gbnVsbCA/IDAgOiBhMS5nZXRMYXN0VXBkYXRlRGF0ZSgpLCBhMi5nZXRMYXN0VXBkYXRlRGF0ZSgpID09IG51bGwgPyAwIDogYTIuZ2V0TGFzdFVwZGF0ZURhdGUoKSk7CisJCQkJfQorCQkJCXJldHVybiBjb21wYXJlUmVzOworCQkJfSkuZ2V0KCk7CisJCQlpZiAobGF0ZXN0QXJ0aWZhY3QgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggbGF0ZXN0IGFydGlmYWN0IHdpdGggVVVJRCB7fSBkYXRhIGZvciBwYXJlbnQgY29tcG9uZW50IHt9IHdpdGggdWlkIHt9LCBlcnJvcjoge30iLCBhcnRpZmFjdFVVSUQsIGNvbXBvbmVudFR5cGUubmFtZSgpLCBwYXJlbnRJZCwgYWN0aW9uU3RhdHVzKTsKKwkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGFydGlmYWN0VVVJRCkpOworCQkJfQorCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlhcnRpZmFjdElkID0gbGF0ZXN0QXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKTsKKwkJfQorCQlyZXR1cm4gYXJ0aWZhY3RJZDsKKwl9CisKKwlwcml2YXRlIENvbXBvbmVudCBjaGVja291dFBhcmVudENvbXBvbmVudChDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgcGFyZW50SWQsIFN0cmluZyB1c2VySWQsIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlcikgeworCisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyUmVzID0gdXNlckJ1c2luZXNzTG9naWMuZ2V0VXNlcih1c2VySWQsIGZhbHNlKTsKKwkJaWYgKGdldFVzZXJSZXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkIG5vdCBmZXRjaCBVc2VyIG9mIGNvbXBvbmVudCB7fSB3aXRoIHVpZCB7fSB0byBjaGVja2VkIG91dC4gU3RhdHVzIGlzIHt9LiAiLCBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCksIHBhcmVudElkLCBnZXRVc2VyUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChnZXRVc2VyUmVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlVc2VyIG1vZGlmaWVyID0gZ2V0VXNlclJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGNoYW5nZUluZm8gPSBuZXcgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24oIkV4dGVybmFsIEFQSSBjaGVja291dCIsIExpZmVjeWNsZUNoYW5jZUFjdGlvbkVudW0uVVBEQVRFX0ZST01fRVhURVJOQUxfQVBJKTsKKwkJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gY2hlY2tvdXRSZXMgPSBsaWZlY3ljbGVCdXNpbmVzc0xvZ2ljLmNoYW5nZUNvbXBvbmVudFN0YXRlKGNvbXBvbmVudFR5cGUsIHBhcmVudElkLCBtb2RpZmllciwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0hFQ0tPVVQsIGNoYW5nZUluZm8sIGZhbHNlLCB0cnVlKTsKKwkJCWlmIChjaGVja291dFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvdWxkIG5vdCBjaGFuZ2Ugc3RhdGUgb2YgY29tcG9uZW50IHt9IHdpdGggdWlkIHt9IHRvIGNoZWNrZWQgb3V0LiBTdGF0dXMgaXMge30uICIsIGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKSwgcGFyZW50SWQsIGNoZWNrb3V0UmVzLnJpZ2h0KCkudmFsdWUoKS5nZXRTdGF0dXMoKSk7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjaGVja291dFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQljb21wb25lbnQgPSBjaGVja291dFJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29tcG9uZW50OworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVBdWRpdFBhcmFtZXRlcnNXaXRoQXJ0aWZhY3REZWZpbml0aW9uKE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCkgeworCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0NVUlJfQVJUSUZBQ1RfVVVJRCwgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RVVUlEKCkpOworCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FSVElGQUNUX0RBVEEsIGJ1aWxkQXVkaXRpbmdBcnRpZmFjdERhdGEoYXJ0aWZhY3QpKTsKKwkJYWRkaXRpb25hbFBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9OQU1FLCBhcnRpZmFjdC5nZXRVcGRhdGVyRnVsbE5hbWUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9BdHRyaWJ1dGVCdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0F0dHJpYnV0ZUJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZlODZkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9BdHRyaWJ1dGVCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSwyOTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXR0cmlidXRlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMudXRpbHMuQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkF0dHJpYnV0ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIGJ1c2luZXNzIGxvZ2ljIHJlbGV2YW50IGZvciBhdHRyaWJ1dGVzIG1hbmlwdWxhdGlvbi4KKyAqIAorICogQGF1dGhvciBtc2hpdHJpdAorICoKKyAqLworQENvbXBvbmVudCgiYXR0cmlidXRlQnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlQnVzaW5lc3NMb2dpYyBleHRlbmRzIEJhc2VCdXNpbmVzc0xvZ2ljIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQVRUUklCVVRFID0gIkNyZWF0ZUF0dHJpYnV0ZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9BVFRSSUJVVEUgPSAiVXBkYXRlQXR0cmlidXRlIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0FUVFJJQlVURSA9ICJEZWxldGVBdHRyaWJ1dGUiOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF0dHJpYnV0ZUJ1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qKgorCSAqIENyZWF0ZWQgYXR0cmlidXRlIG9uIHRoZSByZXNvdXJjZSB3aXRoIHJlc291cmNlSWQKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBuZXdBdHRyaWJ1dGVEZWYKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHJldHVybiBBdHRyaWJ1dGVEZWZpbml0aW9uIGlmIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IE9yIFJlc3BvbnNlRm9ybWF0CisJICovCisJcHVibGljIEVpdGhlcjxBdHRyaWJ1dGVEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQXR0cmlidXRlKFN0cmluZyByZXNvdXJjZUlkLCBBdHRyaWJ1dGVEZWZpbml0aW9uIG5ld0F0dHJpYnV0ZURlZiwgU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8QXR0cmlidXRlRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJjcmVhdGUgQXR0cmlidXRlIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrUmVzdWx0ID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQocmVzb3VyY2VJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJaWYgKGxvY2tSZXN1bHQgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkTG9ja09iamVjdEVycm9yKENSRUFURV9BVFRSSUJVVEUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgcmVzb3VyY2VJZCk7CisJCQlsb2cuaW5mbygiRmFpbGVkIHRvIGxvY2sgY29tcG9uZW50IHt9LiBFcnJvciAtIHt9IiwgcmVzb3VyY2VJZCwgbG9ja1Jlc3VsdCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJCXRyeSB7CisKKwkJCS8vIEdldCB0aGUgcmVzb3VyY2UgZnJvbSBEQgorCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBnZXRSZXNvdXJjZShyZXNvdXJjZUlkKTsKKwkJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCwgIiIpKTsKKwkJCX0KKwkJCVJlc291cmNlIHJlc291cmNlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCQkvLyB2ZXJpZnkgdGhhdCByZXNvdXJjZSBpcyBjaGVja2VkLW91dCBhbmQgdGhlIHVzZXIgaXMgdGhlIGxhc3QgdXBkYXRlcgorCQkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UsIHVzZXJJZCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pKTsKKwkJCX0KKworCQkJLy8gdmVyaWZ5IGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdCBpbiByZXNvdXJjZQorCQkJaWYgKGlzQXR0cmlidXRlRXhpc3QocmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLCByZXNvdXJjZUlkLCBuZXdBdHRyaWJ1dGVEZWYuZ2V0TmFtZSgpKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BVFRSSUJVVEVfQUxSRUFEWV9FWElTVCwgbmV3QXR0cmlidXRlRGVmLmdldE5hbWUoKSkpOworCQkJfQorCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJBbGxEYXRhVHlwZXMgPSBnZXRBbGxEYXRhVHlwZXMoYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlKTsKKwkJCWlmIChlaXRoZXJBbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJBbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCS8vIHZhbGlkYXRlIHByb3BlcnR5IGRlZmF1bHQgdmFsdWVzCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGRlZmF1bHRWYWx1ZXNWYWxpZGF0aW9uID0gdmFsaWRhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZShuZXdBdHRyaWJ1dGVEZWYsIGVpdGhlckFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQlpZiAoZGVmYXVsdFZhbHVlc1ZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChkZWZhdWx0VmFsdWVzVmFsaWRhdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQloYW5kbGVEZWZhdWx0VmFsdWUobmV3QXR0cmlidXRlRGVmLCBlaXRoZXJBbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCkpOworCisJCQkvLyBhZGQgdGhlIG5ldyBhdHRyaWJ1dGUgdG8gcmVzb3VyY2Ugb24gZ3JhcGgKKwkJCS8vIG5lZWQgdG8gZ2V0IFN0b3JhZ2VPcGFlcmF0aW9uU3RhdHVzIGFuZCBjb252ZXJ0IHRvIEFjdGlvblN0YXR1cyBmcm9tCisJCQkvLyBjb21wb25lbnRzVXRpbHMKKwkJCUVpdGhlcjxBdHRyaWJ1dGVEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBhdHRyaWJ1dGVPcGVyYXRpb24uYWRkQXR0cmlidXRlKG5ld0F0dHJpYnV0ZURlZiwgcmVzb3VyY2VJZCk7CisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZS5nZXROYW1lKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChhdHRyaWJ1dGVPcGVyYXRpb24uY29udmVydEF0dHJpYnV0ZURhdGFUb0F0dHJpYnV0ZURlZmluaXRpb24oZWl0aGVyLmxlZnQoKS52YWx1ZSgpLCBuZXdBdHRyaWJ1dGVEZWYuZ2V0TmFtZSgpLCByZXNvdXJjZUlkKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJY29tbWl0T3JSb2xsYmFjayhyZXN1bHQpOworCQkJLy8gdW5sb2NrIGNvbXBvbmVudAorCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQl9CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNBdHRyaWJ1dGVFeGlzdChMaXN0PEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHJpYnV0ZXMsIFN0cmluZyByZXNvdXJjZVVpZCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlib29sZWFuIGlzRXhpc3QgPSBmYWxzZTsKKwkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJaXNFeGlzdCA9IGF0dHJpYnV0ZXMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gT2JqZWN0cy5lcXVhbHMocC5nZXROYW1lKCksIHByb3BlcnR5TmFtZSkgJiYgT2JqZWN0cy5lcXVhbHMocC5nZXRQYXJlbnRVbmlxdWVJZCgpLCByZXNvdXJjZVVpZCkpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKTsKKwkJfQorCQlyZXR1cm4gaXNFeGlzdDsKKworCX0KKworCS8qKgorCSAqIEBwYXJhbSByZXNvdXJjZUlkCisJICogQHBhcmFtIGF0dHJpYnV0ZUlkCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEF0dHJpYnV0ZURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBnZXRBdHRyaWJ1dGUoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBhdHRyaWJ1dGVJZCwgU3RyaW5nIHVzZXJJZCkgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJnZXQgQXR0cmlidXRlIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJLy8gR2V0IHRoZSByZXNvdXJjZSBmcm9tIERCCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCk7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELCAiIikpOworCQl9CisJCVJlc291cmNlIHJlc291cmNlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCUxpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlcyA9IHJlc291cmNlLmdldEF0dHJpYnV0ZXMoKTsKKwkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFUVFJJQlVURV9OT1RfRk9VTkQsICIiKSk7CisJCX0gZWxzZSB7CisJCQlFaXRoZXI8QXR0cmlidXRlRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdDsKKwkJCS8vIHZlcmlmeSBhdHRyaWJ1dGUgZXhpc3QgaW4gcmVzb3VyY2UKKwkJCU9wdGlvbmFsPEF0dHJpYnV0ZURlZmluaXRpb24+IG9wdGlvbmFsQXR0ID0gYXR0cmlidXRlcy5zdHJlYW0oKS5maWx0ZXIoYXR0IC0+IGF0dC5nZXRVbmlxdWVJZCgpLmVxdWFscyhhdHRyaWJ1dGVJZCkgJiYgYXR0LmdldFBhcmVudFVuaXF1ZUlkKCkuZXF1YWxzKHJlc291cmNlSWQpKS5maW5kQW55KCk7CisKKwkJCWlmIChvcHRpb25hbEF0dC5pc1ByZXNlbnQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KG9wdGlvbmFsQXR0LmdldCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVRUUklCVVRFX05PVF9GT1VORCwgIiIpKTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgQXR0cmlidXRlIG9uIHJlc291cmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcGFyYW0gYXR0cmlidXRlSWQKKwkgKiBAcGFyYW0gbmV3QXR0RGVmCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEF0dHJpYnV0ZURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVBdHRyaWJ1dGUoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBhdHRyaWJ1dGVJZCwgQXR0cmlidXRlRGVmaW5pdGlvbiBuZXdBdHREZWYsIFN0cmluZyB1c2VySWQpIHsKKwkJRWl0aGVyPEF0dHJpYnV0ZURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCQkKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrUmVzdWx0ID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQocmVzb3VyY2VJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJaWYgKGxvY2tSZXN1bHQgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkTG9ja09iamVjdEVycm9yKFVQREFURV9BVFRSSUJVVEUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgcmVzb3VyY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJCQorCQl0cnkgeworCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBmcm9tIERCCisJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlc291cmNlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCk7CisJCQlpZiAoZWl0aGVyUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCwgIiIpKTsKKwkJCX0KKwkJCVJlc291cmNlIHJlc291cmNlID0gZWl0aGVyUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisKKwkJCS8vIHZlcmlmeSB0aGF0IHJlc291cmNlIGlzIGNoZWNrZWQtb3V0IGFuZCB0aGUgdXNlciBpcyB0aGUgbGFzdCB1cGRhdGVyCisJCQlpZiAoIUNvbXBvbmVudFZhbGlkYXRpb25VdGlscy5jYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSwgdXNlcklkKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQkJfQorCQkJCisJCQkvLyB2ZXJpZnkgYXR0cmlidXRlIGV4aXN0IGluIHJlc291cmNlCisJCQlFaXRoZXI8QXR0cmlidXRlRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZShyZXNvdXJjZUlkLCBhdHRyaWJ1dGVJZCwgdXNlcklkKTsKKwkJCWlmIChlaXRoZXJBdHRyaWJ1dGUuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJBdHRyaWJ1dGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQWxsRGF0YVR5cGVzID0gZ2V0QWxsRGF0YVR5cGVzKGFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZSk7CisJCQlpZiAoZWl0aGVyQWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyQWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCS8vIHZhbGlkYXRlIGF0dHJpYnV0ZSBkZWZhdWx0IHZhbHVlcworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBkZWZhdWx0VmFsdWVzVmFsaWRhdGlvbiA9IHZhbGlkYXRlUHJvcGVydHlEZWZhdWx0VmFsdWUobmV3QXR0RGVmLCBlaXRoZXJBbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCkpOworCQkJaWYgKGRlZmF1bHRWYWx1ZXNWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZGVmYXVsdFZhbHVlc1ZhbGlkYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCS8vIGFkZCB0aGUgbmV3IHByb3BlcnR5IHRvIHJlc291cmNlIG9uIGdyYXBoCisJCQlFaXRoZXI8QXR0cmlidXRlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQXR0VXBkYXRlID0gYXR0cmlidXRlT3BlcmF0aW9uLnVwZGF0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVJZCwgbmV3QXR0RGVmLCBlaXRoZXJBbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCkpOworCisJCQlpZiAoZWl0aGVyQXR0VXBkYXRlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSB1cGRhdGluZyBhdHRyaWJ1dGUgd2l0aCBpZCB7fS4gUmVhc29uIC0ge30iLCBhdHRyaWJ1dGVJZCwgZWl0aGVyQXR0VXBkYXRlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGVpdGhlckF0dFVwZGF0ZS5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZS5nZXROYW1lKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChhdHRyaWJ1dGVPcGVyYXRpb24uY29udmVydEF0dHJpYnV0ZURhdGFUb0F0dHJpYnV0ZURlZmluaXRpb24oZWl0aGVyQXR0VXBkYXRlLmxlZnQoKS52YWx1ZSgpLCBuZXdBdHREZWYuZ2V0TmFtZSgpLCByZXNvdXJjZUlkKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJY29tbWl0T3JSb2xsYmFjayhyZXN1bHQpOworCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQl9CisJfQorCisJLyoqCisJICogRGVsZXRlcyBBdHRyaWJ1dGUgb24gcmVzb3VyY2UKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBhdHRyaWJ1dGVJZAorCSAqIEBwYXJhbSB1c2VySWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxBdHRyaWJ1dGVEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlQXR0cmlidXRlKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgYXR0cmlidXRlSWQsIFN0cmluZyB1c2VySWQpIHsKKwkJRWl0aGVyPEF0dHJpYnV0ZURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZGVsZXRlIEF0dHJpYnV0ZSIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgbG9ja1Jlc3VsdCA9IGdyYXBoTG9ja09wZXJhdGlvbi5sb2NrQ29tcG9uZW50KHJlc291cmNlSWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCWlmIChsb2NrUmVzdWx0ICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZExvY2tPYmplY3RFcnJvcihERUxFVEVfQVRUUklCVVRFLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHJlc291cmNlSWQpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXRyeSB7CisJCQkvLyBHZXQgdGhlIHJlc291cmNlIGZyb20gREIKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyUmVzb3VyY2UgPSBnZXRSZXNvdXJjZShyZXNvdXJjZUlkKTsKKwkJCWlmIChlaXRoZXJSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELCAiIikpOworCQkJfQorCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlaXRoZXJSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJLy8gdmVyaWZ5IHRoYXQgcmVzb3VyY2UgaXMgY2hlY2tlZC1vdXQgYW5kIHRoZSB1c2VyIGlzIHRoZSBsYXN0IHVwZGF0ZXIKKwkJCWlmICghQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzLmNhbldvcmtPblJlc291cmNlKHJlc291cmNlLCB1c2VySWQpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCQl9CisKKwkJCS8vIHZlcmlmeSBhdHRyaWJ1dGUgZXhpc3QgaW4gcmVzb3VyY2UKKwkJCUVpdGhlcjxBdHRyaWJ1dGVEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQXR0cmlidXRlRXhpc3QgPSBnZXRBdHRyaWJ1dGUocmVzb3VyY2VJZCwgYXR0cmlidXRlSWQsIHVzZXJJZCk7CisJCQlpZiAoZWl0aGVyQXR0cmlidXRlRXhpc3QuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJBdHRyaWJ1dGVFeGlzdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBlaXRoZXJBdHRyaWJ1dGVFeGlzdC5sZWZ0KCkudmFsdWUoKS5nZXROYW1lKCk7CisKKwkJCS8vIGRlbGV0ZSBhdHRyaWJ1dGUgb2YgcmVzb3VyY2UgZnJvbSBncmFwaAorCQkJRWl0aGVyPEF0dHJpYnV0ZURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckF0dHJpYnV0ZURlbGV0ZSA9IGF0dHJpYnV0ZU9wZXJhdGlvbi5kZWxldGVBdHRyaWJ1dGUoYXR0cmlidXRlSWQpOworCQkJaWYgKGVpdGhlckF0dHJpYnV0ZURlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShlaXRoZXJBdHRyaWJ1dGVEZWxldGUucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2UuZ2V0TmFtZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGF0dHJpYnV0ZU9wZXJhdGlvbi5jb252ZXJ0QXR0cmlidXRlRGF0YVRvQXR0cmlidXRlRGVmaW5pdGlvbihlaXRoZXJBdHRyaWJ1dGVEZWxldGUubGVmdCgpLnZhbHVlKCksIGF0dHJpYnV0ZU5hbWUsIHJlc291cmNlSWQpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQljb21taXRPclJvbGxiYWNrKHJlc3VsdCk7CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHJlc291cmNlSWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0Jhc2VCdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0Jhc2VCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZGZmMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQmFzZUJ1c2luZXNzTG9naWMuamF2YQpAQCAtMCwwICsxLDU3MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklDb21wbGV4RGVmYXVsdFZhbHVlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLkFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUF0dHJpYnV0ZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklFbGVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklHcmFwaExvY2tPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUdyb3VwT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklHcm91cFR5cGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNvbXBvbmVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvZHVjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlNlcnZpY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy51dGlscy5Db21wb25lbnRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVycy5Qcm9wZXJ0eVZhbHVlQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLklVc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQnVzaW5lc3NMb2dpYyB7CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHM7CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIElVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW47CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBJR3JhcGhMb2NrT3BlcmF0aW9uIGdyYXBoTG9ja09wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBQcm9kdWN0T3BlcmF0aW9uIHByb2R1Y3RPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnREYW87CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIElHcm91cE9wZXJhdGlvbiBncm91cE9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgSUdyb3VwVHlwZU9wZXJhdGlvbiBncm91cFR5cGVPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIElBcnRpZmFjdE9wZXJhdGlvbiBhcnRpZmFjdE9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgSUF0dHJpYnV0ZU9wZXJhdGlvbiBhdHRyaWJ1dGVPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIElQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIGFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZTsKKworCXB1YmxpYyB2b2lkIHNldFVzZXJBZG1pbihVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW4pIHsKKwkJdGhpcy51c2VyQWRtaW4gPSB1c2VyQWRtaW47CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50c1V0aWxzKENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMpIHsKKwkJdGhpcy5jb21wb25lbnRzVXRpbHMgPSBjb21wb25lbnRzVXRpbHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JhcGhMb2NrT3BlcmF0aW9uKElHcmFwaExvY2tPcGVyYXRpb24gZ3JhcGhMb2NrT3BlcmF0aW9uKSB7CisJCXRoaXMuZ3JhcGhMb2NrT3BlcmF0aW9uID0gZ3JhcGhMb2NrT3BlcmF0aW9uOworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCYXNlQnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJcHJvdGVjdGVkIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyTm90RW1wdHkoVXNlciB1c2VyLCBTdHJpbmcgZWNvbXBFcnJvckNvbnRleHQpIHsKKwkJU3RyaW5nIHVzZXJJZCA9IHVzZXIuZ2V0VXNlcklkKCk7CisKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkodXNlcklkKSkgeworCQkJLy8gdXNlci5zZXRVc2VySWQoIlVOS05PV04iKTsKKwkJCWxvZy5kZWJ1ZygiVXNlciBoZWFkZXIgaXMgbWlzc2luZyAiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVzZXJNaXNzaW5nRXJyb3IsIGVjb21wRXJyb3JDb250ZXh0LCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVVzZXJNaXNzaW5nRXJyb3IoZWNvbXBFcnJvckNvbnRleHQsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHVzZXIpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlckV4aXN0cyhVc2VyIHVzZXIsIFN0cmluZyBlY29tcEVycm9yQ29udGV4dCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiB2YWxpZGF0ZVVzZXJFeGlzdHModXNlci5nZXRVc2VySWQoKSwgZWNvbXBFcnJvckNvbnRleHQsIGluVHJhbnNhY3Rpb24pOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVXNlckV4aXN0KFN0cmluZyB1c2VySWQsIFN0cmluZyBlY29tcEVycm9yQ29udGV4dCwgV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyKSB7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsIGVjb21wRXJyb3JDb250ZXh0LCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gdmFsaWRhdGVVc2VyRXhpc3RzQWN0aW9uU3RhdHVzKFN0cmluZyB1c2VySWQsIFN0cmluZyBlY29tcEVycm9yQ29udGV4dCkgeworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdG9yID0gdXNlckFkbWluLmdldFVzZXIodXNlcklkLCBmYWxzZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSB8fCBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCWlmIChlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKSkgeworCQkJCWxvZy5kZWJ1ZygidmFsaWRhdGVVc2VyRXhpc3RzIC0gbm90IGF1dGhvcml6ZWQgdXNlciwgdXNlcklkIHt9IiwgdXNlcklkKTsKKwkJCQlFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJ2YWxpZGF0ZVVzZXJFeGlzdHMgLSBmYWlsZWQgdG8gYXV0aG9yaXplIHVzZXIsIHVzZXJJZCB7fSIsIHVzZXJJZCk7CisJCQl9CisJCQlsb2cuZGVidWcoIlVzZXIgaXMgbm90IGxpc3RlZC4gdXNlcklkIHt9IiwgdXNlcklkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVzZXJNaXNzaW5nRXJyb3IsIGVjb21wRXJyb3JDb250ZXh0LCB1c2VySWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXB1YmxpYyBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlckV4aXN0cyhTdHJpbmcgdXNlcklkLCBTdHJpbmcgZWNvbXBFcnJvckNvbnRleHQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdG9yID0gdXNlckFkbWluLmdldFVzZXIodXNlcklkLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGVpdGhlckNyZWF0b3IuaXNSaWdodCgpIHx8IGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCQlpZiAoZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKEFjdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCkpIHsKKwkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQkJCWxvZy5kZWJ1ZygidmFsaWRhdGVVc2VyRXhpc3RzIC0gbm90IGF1dGhvcml6ZWQgdXNlciwgdXNlcklkIHt9IiwgdXNlcklkKTsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQkJCWxvZy5kZWJ1ZygidmFsaWRhdGVVc2VyRXhpc3RzIC0gZmFpbGVkIHRvIGF1dGhvcml6ZSB1c2VyLCB1c2VySWQge30iLCB1c2VySWQpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCQlsb2cuZGVidWcoIlVzZXIgaXMgbm90IGxpc3RlZC4gdXNlcklkIHt9IiwgdXNlcklkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVVzZXJNaXNzaW5nRXJyb3IsIGVjb21wRXJyb3JDb250ZXh0LCB1c2VySWQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVXNlck1pc3NpbmdFcnJvcihlY29tcEVycm9yQ29udGV4dCwgdXNlcklkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVzZXJSb2xlKFVzZXIgdXNlciwgTGlzdDxSb2xlPiByb2xlcykgeworCQlSb2xlIHVzZXJSb2xlID0gUm9sZS52YWx1ZU9mKHVzZXIuZ2V0Um9sZSgpKTsKKwkJaWYgKHJvbGVzICE9IG51bGwpIHsKKwkJCWlmICghcm9sZXMuY29udGFpbnModXNlclJvbGUpKSB7CisJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJCQlsb2cuZGVidWcoInVzZXIgaXMgbm90IGluIGFwcHJvcHJpYXRlIHJvbGUgdG8gcGVyZm9ybSBhY3Rpb24iKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KEJvb2xlYW4uVFJVRSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KEJvb2xlYW4uRkFMU0UpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGVjb21wRXJyb3JDb250ZXh0KSB7CisJCXJldHVybiBsb2NrQ29tcG9uZW50KGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnQsIGVjb21wRXJyb3JDb250ZXh0KTsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnRJZCwgQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGVjb21wRXJyb3JDb250ZXh0KSB7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOworCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUgPSBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgbG9ja1Jlc291cmNlU3RhdHVzID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIG5vZGVUeXBlKTsKKworCQlpZiAobG9ja1Jlc291cmNlU3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9IGVsc2UgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkTG9ja09iamVjdEVycm9yKGVjb21wRXJyb3JDb250ZXh0LCBub2RlVHlwZS5nZXROYW1lKCksIGNvbXBvbmVudElkKTsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UobG9ja1Jlc291cmNlU3RhdHVzLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgY29tcG9uZW50LmdldE5hbWUoKSk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBsb2NrIGNvbXBvbmVudCB7fSBlcnJvciAtIHt9IiwgY29tcG9uZW50SWQsIGFjdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVubG9ja0NvbXBvbmVudChFaXRoZXI8PywgPz4gZWl0aGVyLCBDb21wb25lbnQgY29tcG9uZW50LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKTsKKwkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCWlmIChlaXRoZXIgPT0gbnVsbCB8fCBlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCQkvLyB1bmxvY2sgcmVzb3VyY2UKKwkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgbm9kZVR5cGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVubG9ja0NvbXBvbmVudChFaXRoZXI8PywgPz4gZWl0aGVyLCBDb21wb25lbnQgY29tcG9uZW50KSB7CisJCXVubG9ja0NvbXBvbmVudChlaXRoZXIsIGNvbXBvbmVudCwgZmFsc2UpOworCX0KKworCXByb3RlY3RlZCA8VD4gRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUpzb25Cb2R5KFQgYm9keU9iamVjdCwgQ2xhc3M8VD4gY2xhenopIHsKKwkJaWYgKGJvZHlPYmplY3QgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJJbnZhbGlkIEpTT04gcmVjZWl2ZWQgZm9yIG9iamVjdCBvZiB0eXBlIHt9IiwgY2xhenouZ2V0U2ltcGxlTmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Q29tcG9uZW50VHlwZUVudW0sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudFR5cGUoU3RyaW5nIGNvbXBvbmVudFR5cGUpIHsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29tcG9uZW50VHlwZSk7CisJCWlmIChjb21wb25lbnRUeXBlRW51bSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkludmFsaWQgY29tcG9uZW50IHR5cGUge30iLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VTlNVUFBPUlRFRF9FUlJPUiwgY29tcG9uZW50VHlwZSkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Q29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMoU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIGJvb2xlYW4gY3JlYXRlTmV3VHJhbnNhY3Rpb24pIHsKKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlKTsKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50Rm91bmQgPSBudWxsOworCQkvLyBpZihjcmVhdGVOZXdUcmFuc2FjdGlvbil7CisJCS8vIGNvbXBvbmVudEZvdW5kID0gY29tcG9uZW50T3BlcmF0aW9uLmdldENvbXBvbmVudF90eChjb21wb25lbnRJZCwKKwkJLy8gaW5UcmFuc2FjdGlvbik7CisJCS8vIH0KKwkJLy8gZWxzZXsKKwkJY29tcG9uZW50Rm91bmQgPSBjb21wb25lbnRPcGVyYXRpb24uZ2V0Q29tcG9uZW50KGNvbXBvbmVudElkLCBpblRyYW5zYWN0aW9uKTsKKwkJLy8gfQorCisJCWlmIChjb21wb25lbnRGb3VuZC5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IGNvbXBvbmVudEZvdW5kLnJpZ2h0KCkudmFsdWUoKTsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RvcmFnZU9wZXJhdGlvblN0YXR1cywgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgd2l0aCBpZCB7fSB3YXMgbm90IGZvdW5kIiwgY29tcG9uZW50SWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudEZvdW5kLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPD8gZXh0ZW5kcyBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyhTdHJpbmcgY29tcG9uZW50SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIENvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBTdHJpbmcgdXNlcklkLAorCQkJQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uLCBVc2VyIHVzZXIpIHsKKworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGUpOworCisJCWlmIChjb21wb25lbnRPcGVyYXRpb24gPT0gbnVsbCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJbG9nLmRlYnVnKCJhZGRHcm91cCAtIG5vdCBzdXBwb3J0ZWQgY29tcG9uZW50IHR5cGUge30iLCBjb21wb25lbnRUeXBlKTsKKwkJCS8vIGhhbmRsZUF1ZGl0aW5nKGF1ZGl0aW5nQWN0aW9uLCBudWxsLCBjb21wb25lbnRJZCwgdXNlciwgbnVsbCwKKwkJCS8vIG51bGwsIGFydGlmYWN0SWQsIHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCUVpdGhlcjw/IGV4dGVuZHMgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRSZXN1bHQgPSBjb21wb25lbnRPcGVyYXRpb24uZ2V0Q29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgdHJ1ZSk7CisKKwkJaWYgKGNvbXBvbmVudFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSAoY29tcG9uZW50VHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSA/IEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQgOiBBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQ7CisKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KHN0YXR1cywgY29tcG9uZW50SWQpOworCisJCQlsb2cuZGVidWcoIlNlcnZpY2Ugbm90IGZvdW5kLCBzZXJ2aWNlSWQge30iLCBjb21wb25lbnRJZCk7CisJCQkvLyBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRGb3JBdWRpdCA9CisJCQkvLyAoY29tcG9uZW50VHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSA/CisJCQkvLyBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSA6IENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0U7CisJCQkvLyBoYW5kbGVBdWRpdGluZyhhdWRpdGluZ0FjdGlvbiwgbnVsbCwgY29tcG9uZW50SWQsIHVzZXIsIG51bGwsCisJCQkvLyBudWxsLCBhcnRpZmFjdElkLCByZXNwb25zZUZvcm1hdCwgY29tcG9uZW50Rm9yQXVkaXQsIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudFJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGNhbldvcmsgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQlpZiAoY29tcG9uZW50LmdldExpZmVjeWNsZVN0YXRlKCkgIT0gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpIHsKKwkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IHt9IGlzIG5vdCBjaGVja2VkLW91dCIsIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQkJcmV0dXJuIGNhbldvcms7CisJCX0KKworCQkvLyB2ZXJpZnkgdXNlciBpZCBpcyBub3QgbnVsbAorCQlpZiAodXNlcklkID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQ3VycmVudCB1c2VyIHVzZXJJZCBpcyBudWxsIik7CisJCQlyZXR1cm4gY2FuV29yazsKKwkJfQorCisJCS8vIHZlcmlmeSBjb21wb25lbnQgbGFzdCB1cGRhdGUgdXNlciBpcyB0aGUgY3VycmVudCB1c2VyCisJCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCA9IGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpOworCQlpZiAoIXVzZXJJZC5lcXVhbHMobGFzdFVwZGF0ZXJVc2VySWQpKSB7CisJCQlsb2cuZGVidWcoIkN1cnJlbnQgdXNlciBpcyBub3QgbGFzdCB1cGRhdGVyLCBsYXN0IHVwZGF0ZXIgdXNlcklkOiB7fSwgY3VycmVudCB1c2VyIHVzZXJJZDoge30iLCBsYXN0VXBkYXRlclVzZXJJZCwgdXNlcklkKTsKKwkJCXJldHVybiBjYW5Xb3JrOworCQl9CisKKwkJLy8gdmVyaWZ5IHJlc291cmNlIGlzIG5vdCBkZWxldGVkCisJCWlmICgoY29tcG9uZW50LmdldElzRGVsZXRlZCgpICE9IG51bGwpICYmIChjb21wb25lbnQuZ2V0SXNEZWxldGVkKCkgPT0gdHJ1ZSkpIHsKKwkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IHt9IGlzIG1hcmtlZCBhcyBkZWxldGVkIiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmV0dXJuIGNhbldvcms7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHVibGljIENvbXBvbmVudE9wZXJhdGlvbiBnZXRDb21wb25lbnRPcGVyYXRpb24oQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0pIHsKKwkJaWYgKENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UgPT0gY29tcG9uZW50VHlwZUVudW0pIHsKKwkJCXJldHVybiBzZXJ2aWNlT3BlcmF0aW9uOworCQl9IGVsc2UgaWYgKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFID09IGNvbXBvbmVudFR5cGVFbnVtKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VPcGVyYXRpb247CisJCX0gZWxzZSBpZiAoQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCA9PSBjb21wb25lbnRUeXBlRW51bSkgeworCQkJcmV0dXJuIHByb2R1Y3RPcGVyYXRpb247CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIElDb21wb25lbnRPcGVyYXRpb24gZ2V0SUNvbXBvbmVudE9wZXJhdGlvbihDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgeworCisJCXN3aXRjaCAoY29tcG9uZW50VHlwZUVudW0pIHsKKwkJY2FzZSBTRVJWSUNFOgorCQkJcmV0dXJuIHNlcnZpY2VPcGVyYXRpb247CisJCWNhc2UgUkVTT1VSQ0U6CisJCQlyZXR1cm4gcmVzb3VyY2VPcGVyYXRpb247CisJCWNhc2UgUFJPRFVDVDoKKwkJCXJldHVybiBwcm9kdWN0T3BlcmF0aW9uOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbXBvbmVudE9wZXJhdGlvbkJ5UGFyZW50Q29tcG9uZW50VHlwZShDb21wb25lbnRUeXBlRW51bSBwYXJlbnRDb21wb25lbnRUeXBlKSB7CisJCXN3aXRjaCAocGFyZW50Q29tcG9uZW50VHlwZSkgeworCQljYXNlIFNFUlZJQ0U6CisJCQlyZXR1cm4gcmVzb3VyY2VPcGVyYXRpb247CisJCWNhc2UgUkVTT1VSQ0U6CisJCQlyZXR1cm4gcmVzb3VyY2VPcGVyYXRpb247CisJCWNhc2UgUFJPRFVDVDoKKwkJCXJldHVybiBzZXJ2aWNlT3BlcmF0aW9uOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIENvbXBvbmVudFR5cGVFbnVtIGdldENvbXBvbmVudFR5cGVCeVBhcmVudENvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZUVudW0gcGFyZW50Q29tcG9uZW50VHlwZSkgeworCQlzd2l0Y2ggKHBhcmVudENvbXBvbmVudFR5cGUpIHsKKwkJY2FzZSBTRVJWSUNFOgorCQkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFOworCQljYXNlIFJFU09VUkNFOgorCQkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFOworCQljYXNlIFBST0RVQ1Q6CisJCQlyZXR1cm4gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8vIEZvciBVVAorCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8TWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGdldEFsbERhdGFUeXBlcyhBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUgYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlKSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsRGF0YVR5cGVzID0gYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlLmdldEFsbCgpOworCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChvcGVyYXRpb25TdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJGZXRjaERhdGFUeXBlcyIsICJEYXRhIHR5cGVzIGFyZSBub3QgbG9hZGVkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkRBVEFfVFlQRV9DQU5OT1RfQkVfRU1QVFkpKTsKKwkJCX0gZWxzZSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJGZXRjaERhdGFUeXBlcyIsICJGYWlsZWQgdG8gZmV0Y2ggZGF0YSB0eXBlcyIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZShJQ29tcGxleERlZmF1bHRWYWx1ZSBwcm9wZXJ0eSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBwcm9wZXJ0eSIpOworCQlTdHJpbmcgdHlwZSA9IG51bGw7CisJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQlpZiAoIXByb3BlcnR5T3BlcmF0aW9uLmlzUHJvcGVydHlUeXBlVmFsaWQocHJvcGVydHkpKSB7CisJCQlsb2cuaW5mbygiSW52YWxpZCB0eXBlIGZvciBwcm9wZXJ0eSIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFlfVFlQRSwgcHJvcGVydHkuZ2V0VHlwZSgpLCBwcm9wZXJ0eS5nZXROYW1lKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJdHlwZSA9IHByb3BlcnR5LmdldFR5cGUoKTsKKwkJaWYgKHR5cGUuZXF1YWxzKFRvc2NhUHJvcGVydHlUeXBlLkxJU1QuZ2V0VHlwZSgpKSB8fCB0eXBlLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5NQVAuZ2V0VHlwZSgpKSkgeworCQkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+IHByb3BlcnR5SW5uZXJUeXBlVmFsaWQgPSBwcm9wZXJ0eU9wZXJhdGlvbi5pc1Byb3BlcnR5SW5uZXJUeXBlVmFsaWQocHJvcGVydHksIGRhdGFUeXBlcyk7CisJCQlpbm5lclR5cGUgPSBwcm9wZXJ0eUlubmVyVHlwZVZhbGlkLmdldExlZnQoKTsKKwkJCWlmICghcHJvcGVydHlJbm5lclR5cGVWYWxpZC5nZXRSaWdodCgpLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJbG9nLmluZm8oIkludmFsaWQgaW5uZXIgdHlwZSBmb3IgcHJvcGVydHkiKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9QUk9QRVJUWV9JTk5FUl9UWVBFLCBpbm5lclR5cGUsIHByb3BlcnR5LmdldE5hbWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0KKwkJaWYgKCFwcm9wZXJ0eU9wZXJhdGlvbi5pc1Byb3BlcnR5RGVmYXVsdFZhbHVlVmFsaWQocHJvcGVydHksIGRhdGFUeXBlcykpIHsKKwkJCWxvZy5pbmZvKCJJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHByb3BlcnR5Iik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJCWlmICh0eXBlLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5MSVNULmdldFR5cGUoKSkgfHwgdHlwZS5lcXVhbHMoVG9zY2FQcm9wZXJ0eVR5cGUuTUFQLmdldFR5cGUoKSkpIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT01QTEVYX0RFRkFVTFRfVkFMVUUsIHByb3BlcnR5LmdldE5hbWUoKSwgdHlwZSwgaW5uZXJUeXBlLCBwcm9wZXJ0eS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCQl9IGVsc2UgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0RFRkFVTFRfVkFMVUUsIHByb3BlcnR5LmdldE5hbWUoKSwgdHlwZSwgcHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2UoZmluYWwgU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlsb2cuZGVidWcoIkdldCByZXNvdXJjZSB3aXRoIGlkIHt9IiwgcmVzb3VyY2VJZCk7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCk7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIlJlc291cmNlIHdpdGggaWQge30gd2FzIG5vdCBmb3VuZCIsIHJlc291cmNlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVJlc291cmNlIHJlc291cmNlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlQ29tcG9uZW50TWlzc2luZ0Vycm9yKCJQcm9wZXJ0eSBCdXNpbmVzcyBMb2dpYyIsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCksIHJlc291cmNlSWQpOworCQkJbG9nLmRlYnVnKCJHZW5lcmFsIEVycm9yIHdoaWxlIGdldCByZXNvdXJjZSB3aXRoIGlkIHt9IiwgcmVzb3VyY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEZWZhdWx0VmFsdWUoSUNvbXBsZXhEZWZhdWx0VmFsdWUgbmV3QXR0cmlidXRlRGVmLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQkvLyBjb252ZXJ0IHByb3BlcnR5CisJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZShuZXdBdHRyaWJ1dGVEZWYuZ2V0VHlwZSgpKTsKKwkJUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0eXBlLmdldENvbnZlcnRlcigpOworCQkvLyBnZXQgaW5uZXIgdHlwZQorCQlTdHJpbmcgaW5uZXJUeXBlID0gbnVsbDsKKworCQlpZiAobmV3QXR0cmlidXRlRGVmICE9IG51bGwpIHsKKwkJCVNjaGVtYURlZmluaXRpb24gc2NoZW1hID0gbmV3QXR0cmlidXRlRGVmLmdldFNjaGVtYSgpOworCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7CisJCQkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwcm9wID0gc2NoZW1hLmdldFByb3BlcnR5KCk7CisJCQkJaWYgKHNjaGVtYS5nZXRQcm9wZXJ0eSgpICE9IG51bGwpIHsKKwkJCQkJaW5uZXJUeXBlID0gcHJvcC5nZXRUeXBlKCk7CisJCQkJfQorCQkJfQorCQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKKwkJCWlmIChuZXdBdHRyaWJ1dGVEZWYuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJCWNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLmNvbnZlcnQobmV3QXR0cmlidXRlRGVmLmdldERlZmF1bHRWYWx1ZSgpLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisJCQkJbmV3QXR0cmlidXRlRGVmLnNldERlZmF1bHRWYWx1ZShjb252ZXJ0ZWRWYWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudFR5cGVFbnVtKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTdHJpbmcgZXJyb3JDb250ZXh0LCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIpIHsKKwkJaWYgKGNvbXBvbmVudFR5cGVFbnVtID09IG51bGwpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcihlcnJvckNvbnRleHQsICJpbnZhbGlkIGNvbXBvbmVudCB0eXBlIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRCkpOworCQl9CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTdHJpbmcgdXNlcklkLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIpIHsKKwkJSUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRJQ29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRPcGVyYXRpb24sIHVzZXJJZCkpIHsKKwkJCWxvZy5pbmZvKCJSZXN0cmljdGVkIG9wZXJhdGlvbiBmb3IgdXNlciB7fSBvbiB7fSB7fSIsIHVzZXJJZCwgY29tcG9uZW50VHlwZUVudW0uZ2V0VmFsdWUoKSwgY29tcG9uZW50SWQpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29tcG9uZW50TG9jayhTdHJpbmcgY29tcG9uZW50SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrU3RhdHVzID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLmdldE5vZGVUeXBlKCkpOworCQlpZiAobG9ja1N0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBsb2NrIHt9IHt9IiwgY29tcG9uZW50VHlwZUVudW0uZ2V0VmFsdWUoKSwgY29tcG9uZW50SWQpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGxvY2tTdGF0dXMpKSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCBUb3NjYVByb3BlcnR5VHlwZSBnZXRUeXBlKFN0cmluZyBwcm9wZXJ0eVR5cGUpIHsKKworCQlUb3NjYVByb3BlcnR5VHlwZSB0eXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUocHJvcGVydHlUeXBlKTsKKworCQlyZXR1cm4gdHlwZTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIGNvbW1pdE9yUm9sbGJhY2soRWl0aGVyPD8gZXh0ZW5kcyBPYmplY3QsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQpIHsKKwkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy53YXJuKCJvcGVyYXRpb24gZmFpbGVkLiBkbyByb2xsYmFjayIpOworCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIm9wZXJhdGlvbiBzdWNjZXNzLiBkbyBjb21taXQiKTsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnRCeU5hbWUoU3RyaW5nIG5hbWUsIENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBlY29tcEVycm9yQ29udGV4dCkgeworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlID0gY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tSZXNvdXJjZVN0YXR1cyA9IGdyYXBoTG9ja09wZXJhdGlvbi5sb2NrQ29tcG9uZW50QnlOYW1lKG5hbWUsIG5vZGVUeXBlKTsKKworCQlpZiAobG9ja1Jlc291cmNlU3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9IGVsc2UgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkTG9ja09iamVjdEVycm9yKGVjb21wRXJyb3JDb250ZXh0LCBub2RlVHlwZS5nZXROYW1lKCksIG5hbWUpOworCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShsb2NrUmVzb3VyY2VTdGF0dXMsIGNvbXBvbmVudFR5cGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGxvY2sgY29tcG9uZW50IHt9IGVycm9yIC0ge30iLCBuYW1lLCBhY3Rpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzQnlGaWx0ZXIoU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29tcG9uZW50VHlwZSk7CisJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEZvdW5kID0gbnVsbDsKKwkJY29tcG9uZW50Rm91bmQgPSBjb21wb25lbnRPcGVyYXRpb24uZ2V0Q29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKGNvbXBvbmVudEZvdW5kLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlT3BlcmF0aW9uU3RhdHVzID0gY29tcG9uZW50Rm91bmQucmlnaHQoKS52YWx1ZSgpOworCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdG9yYWdlT3BlcmF0aW9uU3RhdHVzLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7CisJCQlsb2cuZGVidWcoIkNvbXBvbmVudCB3aXRoIGlkIHt9IHdhcyBub3QgZm91bmQiLCBjb21wb25lbnRJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29tcG9uZW50Rm91bmQubGVmdCgpLnZhbHVlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ2FwYWJpbGl0eVR5cGVJbXBvcnRNYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjQyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzLlRvc2NhVGFnTmFtZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgiY2FwYWJpbGl0eVR5cGVJbXBvcnRNYW5hZ2VyIikKK3B1YmxpYyBjbGFzcyBDYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCUBSZXNvdXJjZQorCXByaXZhdGUgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisJQFJlc291cmNlCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzOworCUBSZXNvdXJjZQorCXByaXZhdGUgQ29tbW9uSW1wb3J0TWFuYWdlciBjb21tb25JbXBvcnRNYW5hZ2VyOworCisJcHVibGljIEVpdGhlcjxMaXN0PENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVDYXBhYmlsaXR5VHlwZXMoU3RyaW5nIGNhcGFiaWxpdHlZbWwpIHsKKwkJRWl0aGVyPExpc3Q8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBjYXBhYmlsaXR5VHlwZXMgPSBjcmVhdGVDYXBhYmlsaXR5VHlwZXNGcm9tWW1sKGNhcGFiaWxpdHlZbWwpOworCQlpZiAoY2FwYWJpbGl0eVR5cGVzLmlzUmlnaHQoKSkgeworCQkJQWN0aW9uU3RhdHVzIHN0YXR1cyA9IGNhcGFiaWxpdHlUeXBlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5Q2FwYWJpbGl0eVR5cGUoc3RhdHVzLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5VHlwZXNCeURhbyhjYXBhYmlsaXR5VHlwZXMubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGNyZWF0ZUNhcGFiaWxpdHlUeXBlc0Zyb21ZbWwoU3RyaW5nIGNhcGFiaWxpdHlZbWwpIHsKKwkJcmV0dXJuIGNvbW1vbkltcG9ydE1hbmFnZXIuY3JlYXRlRWxlbWVudFR5cGVzRnJvbVltbChjYXBhYmlsaXR5WW1sLCAoY2FwVHlwZU5hbWUsIGNhcFR5cGVKc29uRGF0YSkgLT4gY3JlYXRlQ2FwYWJpbGl0eVR5cGUoY2FwVHlwZU5hbWUsIGNhcFR5cGVKc29uRGF0YSkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ2FwYWJpbGl0eVR5cGVzQnlEYW8oTGlzdDxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24+IGNhcGFiaWxpdHlUeXBlc1RvQ3JlYXRlKSB7CisJCUxpc3Q8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uPiBjcmVhdGVkQ2FwYWJpbGl0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVpdGhlcjxMaXN0PENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXN1bHQgPSBFaXRoZXIubGVmdChjcmVhdGVkQ2FwYWJpbGl0aWVzKTsKKwkJSXRlcmF0b3I8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uPiBjYXBUeXBlSXRyID0gY2FwYWJpbGl0eVR5cGVzVG9DcmVhdGUuaXRlcmF0b3IoKTsKKwkJYm9vbGVhbiBzdG9wRGFvID0gZmFsc2U7CisJCXdoaWxlIChjYXBUeXBlSXRyLmhhc05leHQoKSAmJiAhc3RvcERhbykgeworCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlID0gY2FwVHlwZUl0ci5uZXh0KCk7CisKKwkJCWxvZy5pbmZvKCJzZW5kIGNhcGFiaWxpdHlUeXBlIHt9IHRvIGRhbyBmb3IgY3JlYXRlIiwgY2FwYWJpbGl0eVR5cGUuZ2V0VHlwZSgpKTsKKwkJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRhdGFNb2RlbFJlc3BvbnNlID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24uYWRkQ2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eVR5cGUpOworCQkJaWYgKGRhdGFNb2RlbFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUZhaWxlZEFkZGluZ0NhcGFiaWxpdHlUeXBlRXJyb3IsICJDcmVhdGUgQ2FwYWJpbGl0eVR5cGVzIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkQWRkaW5nTm9kZVR5cGVFcnJvcigiQ3JlYXRlIENhcGFiaWxpdHlUeXBlcyIsICJjYXBhYmlsaXR5IHR5cGUiKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgY2FwYWJpbGl0eVR5cGU6IHt9IiwgY2FwYWJpbGl0eVR5cGUuZ2V0VHlwZSgpKTsKKwkJCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuU0NIRU1BX1ZJT0xBVElPTikgeworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5Q2FwYWJpbGl0eVR5cGUoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yQ2FwYWJpbGl0eVR5cGUoZGF0YU1vZGVsUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKSwgY2FwYWJpbGl0eVR5cGUpOworCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQlzdG9wRGFvID0gdHJ1ZTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJY3JlYXRlZENhcGFiaWxpdGllcy5hZGQoY2FwYWJpbGl0eVR5cGUpOworCQkJfQorCQkJaWYgKCFjYXBUeXBlSXRyLmhhc05leHQoKSkgeworCQkJCWxvZy5pbmZvKCJjYXBhYmlsaXR5VHlwZXMgd2VyZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEhISIpOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCisJfQorCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY3JlYXRlQ2FwYWJpbGl0eVR5cGUoU3RyaW5nIGNhcGFiaWxpdHlUeXBlTmFtZSwgTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24pIHsKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlID0gbmV3IENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigpOworCisJCWNhcGFiaWxpdHlUeXBlLnNldFR5cGUoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQkvLyBEZXNjcmlwdGlvbgorCQlmaW5hbCBDb25zdW1lcjxTdHJpbmc+IGRlc2NyaXB0aW9uU2V0dGVyID0gZGVzY3JpcHRpb24gLT4gY2FwYWJpbGl0eVR5cGUuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQljb21tb25JbXBvcnRNYW5hZ2VyLnNldEZpZWxkKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSwgZGVzY3JpcHRpb25TZXR0ZXIpOworCQkvLyBEZXJpdmVkIEZyb20KKwkJZmluYWwgQ29uc3VtZXI8U3RyaW5nPiBkZXJpdmVkRnJvbVNldHRlciA9IGRlcml2ZWRGcm9tIC0+IGNhcGFiaWxpdHlUeXBlLnNldERlcml2ZWRGcm9tKGRlcml2ZWRGcm9tKTsKKwkJY29tbW9uSW1wb3J0TWFuYWdlci5zZXRGaWVsZCh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLkRFUklWRURfRlJPTS5nZXRFbGVtZW50TmFtZSgpLCBkZXJpdmVkRnJvbVNldHRlcik7CisJCS8vIFByb3BlcnRpZXMKKwkJY29tbW9uSW1wb3J0TWFuYWdlci5zZXRQcm9wZXJ0aWVzTWFwKHRvc2NhSnNvbiwgKHZhbHVlcykgLT4gY2FwYWJpbGl0eVR5cGUuc2V0UHJvcGVydGllcyh2YWx1ZXMpKTsKKworCQlyZXR1cm4gY2FwYWJpbGl0eVR5cGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlYTgwYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ2F0ZWdvcmllc0ltcG9ydE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGFtb2RlbC5hcGkuQ2F0ZWdvcnlUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwudXRpbHMuTm9kZVR5cGVDb252ZXJ0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5Lkdyb3VwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUVsZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJjYXRlZ29yaWVzSW1wb3J0TWFuYWdlciIpCitwdWJsaWMgY2xhc3MgQ2F0ZWdvcmllc0ltcG9ydE1hbmFnZXIgeworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXRlZ29yaWVzSW1wb3J0TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ2F0ZWdvcmllcyhTdHJpbmcgY2F0ZWdvcmllc1R5cGVzWW1sKSB7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+PiBhbGxDYXRlZ29yaWVzID0gY3JlYXRlQ2F0ZWdvcmllc0Zyb21ZbWwoY2F0ZWdvcmllc1R5cGVzWW1sKTsKKwkJcmV0dXJuIGNyZWF0ZUNhdGVnb3JpZXNCeURhbyhhbGxDYXRlZ29yaWVzKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ2F0ZWdvcmllc0J5RGFvKE1hcDxTdHJpbmcsIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPj4gYWxsQ2F0ZWdvcmllcykgeworCQlNYXA8U3RyaW5nLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJbG9nLmRlYnVnKCJjcmVhdGVDYXRlZ29yaWVzQnlEYW86IHN0YXJ0aW5nIHRvIGNyZWF0ZSBDYXRlZ29yaWVzLiIpOworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPj4gZW50cnkgOiBhbGxDYXRlZ29yaWVzLmVudHJ5U2V0KCkpIHsKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoZW50cnkuZ2V0S2V5KCkpOworCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlQ2F0ZWdvcnkgPSBOb2RlVHlwZUNvbnZlcnRVdGlscy5nZXRDYXRlZ29yeU5vZGVUeXBlQnlDb21wb25lbnRQYXJhbShjb21wb25lbnRUeXBlLCBDYXRlZ29yeVR5cGVFbnVtLkNBVEVHT1JZKTsKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZVN1YkNhdGVnb3J5ID0gTm9kZVR5cGVDb252ZXJ0VXRpbHMuZ2V0Q2F0ZWdvcnlOb2RlVHlwZUJ5Q29tcG9uZW50UGFyYW0oY29tcG9uZW50VHlwZSwgQ2F0ZWdvcnlUeXBlRW51bS5TVUJDQVRFR09SWSk7CisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGVHcm91cCA9IE5vZGVUeXBlQ29udmVydFV0aWxzLmdldENhdGVnb3J5Tm9kZVR5cGVCeUNvbXBvbmVudFBhcmFtKGNvbXBvbmVudFR5cGUsIENhdGVnb3J5VHlwZUVudW0uR1JPVVBJTkcpOworCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJbG9nLmRlYnVnKCJjcmVhdGVDYXRlZ29yaWVzQnlEYW86IGNyZWF0aW5nIGNvbXBvbmVudFR5cGU6e30gIG5vZGVUeXBlQ2F0ZWdvcnk6e30gbm9kZVR5cGVTdWJDYXRlZ29yeTp7fSBub2RlVHlwZUdyb3VwOnt9IiwgY29tcG9uZW50VHlwZSwgbm9kZVR5cGVDYXRlZ29yeSwgbm9kZVR5cGVTdWJDYXRlZ29yeSwgbm9kZVR5cGVHcm91cCk7CisJCQl9CisJCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gbmV3Q2F0ZWdvcmllc3ZhbHVlID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKworCQkJCUVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVkQ2F0ZWdvcnlSZXMgPSBjcmVhdGVDYXRlZ29yaWVEZW8oZW50cnksIGNhdGVnb3J5LCBub2RlVHlwZUNhdGVnb3J5KTsKKwkJCQlpZiAoY3JlYXRlZENhdGVnb3J5UmVzLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZWRDYXRlZ29yeVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKworCQkJCUNhdGVnb3J5RGVmaW5pdGlvbiBuZXdjYXRlZ29yeSA9IGNyZWF0ZWRDYXRlZ29yeVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlTdHJpbmcgY2F0ZWdvcnlJZCA9IG5ld2NhdGVnb3J5LmdldFVuaXF1ZUlkKCk7CisJCQkJbG9nLmRlYnVnKCJjcmVhdGVDYXRlZ29yaWVzQnlEYW86IGNyZWF0ZSBjYXRlZ29yeSB3YXMgc3VjY2Vzc2Z1bCB7fSIsIG5ld2NhdGVnb3J5KTsKKwkJCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gbmV3c3ViY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJjYXRlZ29yaWVzID0gY2F0ZWdvcnkuZ2V0U3ViY2F0ZWdvcmllcygpOworCQkJCWlmIChzdWJjYXRlZ29yaWVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0ZWdvcnkgOiBzdWJjYXRlZ29yaWVzKSB7CisJCQkJCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlZFN1YkNhdGVnb3J5ID0gY3JlYXRlU3ViQ2F0ZWdvcmllRGVvKGVudHJ5LCBuZXdjYXRlZ29yeSwgc3ViY2F0ZWdvcnksIG5vZGVUeXBlU3ViQ2F0ZWdvcnkpOworCQkJCQkJaWYgKGNyZWF0ZWRTdWJDYXRlZ29yeS5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZWRDYXRlZ29yeVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJfQorCQkJCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIG5ld3N1YmNhdGVnb3J5ID0gY3JlYXRlZFN1YkNhdGVnb3J5LmxlZnQoKS52YWx1ZSgpOworCQkJCQkJTGlzdDxHcm91cGluZ0RlZmluaXRpb24+IGdyb3VwaW5ncyA9IHN1YmNhdGVnb3J5LmdldEdyb3VwaW5ncygpOworCQkJCQkJaWYgKGdyb3VwaW5ncyAhPSBudWxsKSB7CisJCQkJCQkJTGlzdDxHcm91cGluZ0RlZmluaXRpb24+IG5ld2dyb3VwaW5ncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCQkJCWZvciAoR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nIDogZ3JvdXBpbmdzKSB7CisJCQkJCQkJCUVpdGhlcjxHcm91cGluZ0RlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVkR3JvdXBpbmcgPSBjcmVhdGVHcm91cGluZ0RlbyhlbnRyeSwgZ3JvdXBpbmcsIHN1YmNhdGVnb3J5LCBjYXRlZ29yeSwgbm9kZVR5cGVHcm91cCk7CisJCQkJCQkJCWlmIChjcmVhdGVkR3JvdXBpbmcuaXNSaWdodCgpKSB7CisJCQkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZWRDYXRlZ29yeVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJCQl9CisJCQkJCQkJCW5ld2dyb3VwaW5ncy5hZGQoY3JlYXRlZEdyb3VwaW5nLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJCQl9CisJCQkJCQkJbmV3c3ViY2F0ZWdvcnkuc2V0R3JvdXBpbmdzKG5ld2dyb3VwaW5ncyk7CisJCQkJCQl9CisJCQkJCQluZXdzdWJjYXRlZ29yaWVzLmFkZChuZXdzdWJjYXRlZ29yeSk7CisJCQkJCX0KKwkJCQkJbmV3Y2F0ZWdvcnkuc2V0U3ViY2F0ZWdvcmllcyhuZXdzdWJjYXRlZ29yaWVzKTsKKwkJCQl9CisJCQkJbmV3Q2F0ZWdvcmllc3ZhbHVlLmFkZChuZXdjYXRlZ29yeSk7CisJCQl9CisJCQlyZXN1bHQucHV0KGVudHJ5LmdldEtleSgpLCBuZXdDYXRlZ29yaWVzdmFsdWUpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEdyb3VwaW5nRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwaW5nRGVvKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPj4gZW50cnksIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZywgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YmNhdGVnb3J5LCBDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnksIE5vZGVUeXBlRW51bSBub2RlVHlwZUdyb3VwKSB7CisKKwkJbG9nLmRlYnVnKCJjcmVhdGVHcm91cGluZ0RlbzogY3JlYXRpbmcgZ3JvdXBpbmcgIHt9IiwgZ3JvdXBpbmcpOworCQlFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNyZWF0ZWRHcm91cGluZyA9IGVsZW1lbnRPcGVyYXRpb24uY3JlYXRlR3JvdXBpbmcoc3ViY2F0ZWdvcnkuZ2V0VW5pcXVlSWQoKSwgZ3JvdXBpbmcsIG5vZGVUeXBlR3JvdXApOworCQlpZiAoY3JlYXRlZEdyb3VwaW5nLmlzUmlnaHQoKSkgeworCQkJaWYgKEFjdGlvblN0YXR1cy5DT01QT05FTlRfR1JPVVBJTkdfRVhJU1RTX0ZPUl9TVUJfQ0FURUdPUlkuZXF1YWxzKGNyZWF0ZWRHcm91cGluZy5yaWdodCgpLnZhbHVlKCkpKSB7CisJCQkJbG9nLmRlYnVnKCIgY3JlYXRlIGdyb3VwaW5nIGZvciB7fS4gZ3JvdXAge30gYWxyZWFkeSBleGlzdHMiLCBlbnRyeS5nZXRLZXkoKSwgZ3JvdXBpbmcuZ2V0TmFtZSgpKTsKKwkJCQlTdHJpbmcgZ3JvdXBpbmdJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZEdyb3VwaW5nVWlkKGdyb3VwaW5nLmdldFVuaXF1ZUlkKCksIGdyb3VwaW5nLmdldE5vcm1hbGl6ZWROYW1lKCkpOworCQkJCWNyZWF0ZWRHcm91cGluZyA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0R3JvdXBpbmdVbmlxdWVGb3JUeXBlKG5vZGVUeXBlR3JvdXAsIGdyb3VwaW5nSWQpOworCQkJCWlmIChjcmVhdGVkR3JvdXBpbmcuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBncm91cGluZyB0aGF0IGV4aXN0cyBncm91cGluZ0lkOiB7fSwgdHlwZToge30iLCBncm91cGluZ0lkLCBub2RlVHlwZUdyb3VwKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY3JlYXRlZEdyb3VwaW5nLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCX0KKwkJCX0KKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBncm91cGluZ2NhdGVnb3J5IGZvciB7fSwgY2F0ZWdvcnkge30sIHN1YmNhdGVnb3J5IHt9LCBncm91cGluZyB7fSwgZXJyb3Ige30iLCBlbnRyeS5nZXRLZXkoKSwgY2F0ZWdvcnkuZ2V0TmFtZSgpLCBzdWJjYXRlZ29yeS5nZXROYW1lKCksIChncm91cGluZyAhPSBudWxsID8gZ3JvdXBpbmcuZ2V0TmFtZSgpIDogbnVsbCksIAorCQkJCQkoY3JlYXRlZEdyb3VwaW5nICE9IG51bGwgJiYgY3JlYXRlZEdyb3VwaW5nLnJpZ2h0KCkgIT0gbnVsbCA/IGNyZWF0ZWRHcm91cGluZy5yaWdodCgpLnZhbHVlKCkgOiBudWxsKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjcmVhdGVkR3JvdXBpbmcucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoImNyZWF0ZUdyb3VwaW5nRGVvOiBjcmVhdGUgR3JvdXBpbmcgd2FzIHN1Y2Nlc3NmdWwge30iLCBjcmVhdGVkR3JvdXBpbmcubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkR3JvdXBpbmcubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlU3ViQ2F0ZWdvcmllRGVvKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPj4gZW50cnksIENhdGVnb3J5RGVmaW5pdGlvbiBuZXdjYXRlZ29yeSwgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YmNhdGVnb3J5LCBOb2RlVHlwZUVudW0gbm9kZVR5cGVTdWJDYXRlZ29yeSkgeworCQlsb2cuZGVidWcoImNyZWF0ZVN1YkNhdGVnb3JpZURlbzogY3JlYXRpbmcgc3ViY2F0ZWdvcnkgIHt9Iiwgc3ViY2F0ZWdvcnkpOworCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNyZWF0ZWRTdWJDYXRlZ29yeSA9IGVsZW1lbnRPcGVyYXRpb24uY3JlYXRlU3ViQ2F0ZWdvcnkobmV3Y2F0ZWdvcnkuZ2V0VW5pcXVlSWQoKSwgc3ViY2F0ZWdvcnksIG5vZGVUeXBlU3ViQ2F0ZWdvcnkpOworCQlpZiAoY3JlYXRlZFN1YkNhdGVnb3J5LmlzUmlnaHQoKSkgeworCQkJaWYgKEFjdGlvblN0YXR1cy5DT01QT05FTlRfU1VCX0NBVEVHT1JZX0VYSVNUU19GT1JfQ0FURUdPUlkuZXF1YWxzKGNyZWF0ZWRTdWJDYXRlZ29yeS5yaWdodCgpLnZhbHVlKCkpKSB7CisJCQkJbG9nLmRlYnVnKCIgY3JlYXRlIHN1YmNhdGVnb3J5IGZvciB7fSBjYXRlZ29yeSB7fSwgYWxyZWF5IGV4aXN0cyByZXRyaWV2aW5nIiwgZW50cnkuZ2V0S2V5KCksIG5ld2NhdGVnb3J5LmdldE5hbWUoKSwgc3ViY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKKwkJCQlTdHJpbmcgc3ViQ2F0ZWdvcnlJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFN1YkNhdGVnb3J5VWlkKG5ld2NhdGVnb3J5LmdldFVuaXF1ZUlkKCksIHN1YmNhdGVnb3J5LmdldE5vcm1hbGl6ZWROYW1lKCkpOworCQkJCWNyZWF0ZWRTdWJDYXRlZ29yeSA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0U3ViQ2F0ZWdvcnkobm9kZVR5cGVTdWJDYXRlZ29yeSwgc3ViQ2F0ZWdvcnlJZCk7CisJCQkJaWYgKGNyZWF0ZWRTdWJDYXRlZ29yeS5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IHN1YiBjYXRlZ29yeSB0aGF0IGV4aXN0cyBzdWJDYXRlZ29yeUlkOiB7fSwgdHlwZToge30iLCBzdWJDYXRlZ29yeUlkLCBub2RlVHlwZVN1YkNhdGVnb3J5KTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY3JlYXRlZFN1YkNhdGVnb3J5LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHN1YmNhdGVnb3J5IGZvciB7fSBjYXRlZ29yeSB7fSwgZXJyb3Ige30iLCBlbnRyeS5nZXRLZXkoKSwgbmV3Y2F0ZWdvcnkuZ2V0TmFtZSgpLCBzdWJjYXRlZ29yeS5nZXROYW1lKCksIGNyZWF0ZWRTdWJDYXRlZ29yeS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNyZWF0ZWRTdWJDYXRlZ29yeS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlU3ViQ2F0ZWdvcmllRGVvOiBjcmVhdGUgc3ViY2F0ZWdvcnkgd2FzIHN1Y2Nlc3NmdWwge30iLCBjcmVhdGVkU3ViQ2F0ZWdvcnkubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkU3ViQ2F0ZWdvcnkubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUNhdGVnb3JpZURlbyhNYXAuRW50cnk8U3RyaW5nLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4+IGVudHJ5LCBDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnksIE5vZGVUeXBlRW51bSBub2RlVHlwZUNhdGVnb3J5KSB7CisJCWxvZy5kZWJ1ZygiY3JlYXRlQ2F0ZWdvcmllRGVvOiBjcmVhdGluZyBjYXRlZ29yeSB7fSIsIGNhdGVnb3J5KTsKKwkJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVkQ2F0ZWdvcnkgPSBlbGVtZW50T3BlcmF0aW9uLmNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5LCBub2RlVHlwZUNhdGVnb3J5KTsKKwkJaWYgKGNyZWF0ZWRDYXRlZ29yeS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYXRlZ29yeSBmb3Ige30sIGVycm9yIHt9IiwgZW50cnkuZ2V0S2V5KCksIGNhdGVnb3J5LmdldE5hbWUoKSwgY3JlYXRlZENhdGVnb3J5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlpZiAoIUFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfQUxSRUFEWV9FWElTVFMuZXF1YWxzKGNyZWF0ZWRDYXRlZ29yeS5yaWdodCgpLnZhbHVlKCkpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY3JlYXRlZENhdGVnb3J5LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoImNyZWF0ZUNhdGVnb3JpZURlbzogY2F0ZWdvcnkgZXhpc3RzIHt9IHJldHJpdmluZy4iLCBjYXRlZ29yeSk7CisJCQkJU3RyaW5nIGNhdGVnb3J5SWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRDYXRlZ29yeVVpZChjYXRlZ29yeS5nZXROb3JtYWxpemVkTmFtZSgpLCBub2RlVHlwZUNhdGVnb3J5KTsKKwkJCQljcmVhdGVkQ2F0ZWdvcnkgPSBlbGVtZW50T3BlcmF0aW9uLmdldENhdGVnb3J5KG5vZGVUeXBlQ2F0ZWdvcnksIGNhdGVnb3J5SWQpOworCQkJCWlmIChjcmVhdGVkQ2F0ZWdvcnkuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBjYXRlZ29yeSB0aGF0IGV4aXN0cyBjYXRlZ29yeUlkOiB7fSwgdHlwZToge30iLCBjYXRlZ29yeUlkLCBub2RlVHlwZUNhdGVnb3J5KTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY3JlYXRlZENhdGVnb3J5LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlQ2F0ZWdvcmllRGVvOiBjcmVhdGUgY2F0ZWdvcnkgd2FzIHN1Y2Nlc3NmdWwge30iLCBjcmVhdGVkQ2F0ZWdvcnkubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkQ2F0ZWdvcnkubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+PiBjcmVhdGVDYXRlZ29yaWVzRnJvbVltbChTdHJpbmcgY2F0ZWdvcmllc1R5cGVzWW1sKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5ldyBZYW1sKCkubG9hZChjYXRlZ29yaWVzVHlwZXNZbWwpOworCQlNYXA8U3RyaW5nLCBMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4+IGFsbENhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBjYXRlZ29yeUVudHJ5SXRyID0gdG9zY2FKc29uLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGNhdGVnb3J5RW50cnlJdHIuaGFzTmV4dCgpKSB7CisJCQlFbnRyeTxTdHJpbmcsIE9iamVjdD4gY2F0ZWdvcnlUeXBlRW50cnkgPSBjYXRlZ29yeUVudHJ5SXRyLm5leHQoKTsKKwkJCVN0cmluZyBjYXRlZ29yeVR5cGUgPSBjYXRlZ29yeVR5cGVFbnRyeS5nZXRLZXkoKTsKKwkJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzUGVyVHlwZSA9IG51bGw7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhdGVnb3J5UGVyVHlwZSA9IG51bGw7CisJCQlzd2l0Y2ggKGNhdGVnb3J5VHlwZSkgeworCQkJY2FzZSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUU6CisJCQkJY2F0ZWdvcnlQZXJUeXBlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGNhdGVnb3J5VHlwZUVudHJ5LmdldFZhbHVlKCk7CisJCQkJY2F0ZWdvcmllc1BlclR5cGUgPSBjcmVhdGVTZXJ2aWNlQ2F0ZWdvcmllcyhjYXRlZ29yeVBlclR5cGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FOgorCQkJCWNhdGVnb3J5UGVyVHlwZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBjYXRlZ29yeVR5cGVFbnRyeS5nZXRWYWx1ZSgpOworCQkJCWNhdGVnb3JpZXNQZXJUeXBlID0gY3JlYXRlUmVzb3VyY2VDYXRlZ29yaWVzKGNhdGVnb3J5UGVyVHlwZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1RfUEFSQU1fTkFNRToKKwkJCQkvLyBUT0RPCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWxvZy5kZWJ1ZygiTm90IHN1cHBvcnRlZCBjYXRlZ29yeSB0eXBlIC0ge30iLCBjYXRlZ29yeVR5cGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNhdGVnb3JpZXNQZXJUeXBlICE9IG51bGwpIHsKKwkJCQlhbGxDYXRlZ29yaWVzLnB1dChjYXRlZ29yeVR5cGUsIGNhdGVnb3JpZXNQZXJUeXBlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWxsQ2F0ZWdvcmllczsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjcmVhdGVTZXJ2aWNlQ2F0ZWdvcmllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IGNhdGVnb3JpZXMpIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVncm9pZXNEZWYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJU3RyaW5nIGNhdE5hbWUgPSBudWxsOworCQlMaXN0PFN0cmluZz4gaWNvbnMgPSBudWxsOworCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGNhdGVnb3JpZXMuZW50cnlTZXQoKSkgeworCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdERlZiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gY2F0ZWdvcnkgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCWNhdE5hbWUgPSAoU3RyaW5nKSBjYXRlZ29yeS5nZXQoIm5hbWUiKTsKKwkJCWNhdERlZi5zZXROYW1lKGNhdE5hbWUpOworCQkJaWNvbnMgPSAoTGlzdDxTdHJpbmc+KSBjYXRlZ29yeS5nZXQoImljb25zIik7CisJCQljYXREZWYuc2V0SWNvbnMoaWNvbnMpOworCQkJU3RyaW5nIG5vcm1hbGl6ZWROYW1lID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTRVbmlxdWVuZXNzKGNhdE5hbWUpOworCQkJY2F0RGVmLnNldE5vcm1hbGl6ZWROYW1lKG5vcm1hbGl6ZWROYW1lKTsKKwkJCWNhdGVncm9pZXNEZWYuYWRkKGNhdERlZik7CisJCX0KKworCQlyZXR1cm4gY2F0ZWdyb2llc0RlZjsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjcmVhdGVSZXNvdXJjZUNhdGVnb3JpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBjYXRlZ29yeVBlclR5cGUpIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVncm9pZXNEZWYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogY2F0ZWdvcnlQZXJUeXBlLmVudHJ5U2V0KCkpIHsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gY2F0ZWdvcnkgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXREZWYgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCQlTdHJpbmcgY2F0TmFtZSA9IChTdHJpbmcpIGNhdGVnb3J5LmdldCgibmFtZSIpOworCQkJY2F0RGVmLnNldE5hbWUoY2F0TmFtZSk7CisJCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MoY2F0TmFtZSk7CisJCQljYXREZWYuc2V0Tm9ybWFsaXplZE5hbWUobm9ybWFsaXplZE5hbWUpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBzdWJjYXRlZ29yaWVzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGNhdGVnb3J5LmdldCgic3ViY2F0ZWdvcmllcyIpOworCQkJTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IHN1YmNhdGVEZWYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IHN1YmNhdGVnb3J5IDogc3ViY2F0ZWdvcmllcy5lbnRyeVNldCgpKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBzdWJjYXRlZ29yeUluZm8gPSAoTWFwPFN0cmluZywgT2JqZWN0Pikgc3ViY2F0ZWdvcnkuZ2V0VmFsdWUoKTsKKwkJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViRGVmID0gbmV3IFN1YkNhdGVnb3J5RGVmaW5pdGlvbigpOworCQkJCVN0cmluZyBzdWJjYXRlZ29yeU5hbWUgPSAoU3RyaW5nKSBzdWJjYXRlZ29yeUluZm8uZ2V0KCJuYW1lIik7CisJCQkJc3ViRGVmLnNldE5hbWUoc3ViY2F0ZWdvcnlOYW1lKTsKKwkJCQlMaXN0PFN0cmluZz4gc3ViY2F0ZWdvcnlJY29ucyA9IChMaXN0PFN0cmluZz4pIHN1YmNhdGVnb3J5SW5mby5nZXQoImljb25zIik7CisJCQkJc3ViRGVmLnNldEljb25zKHN1YmNhdGVnb3J5SWNvbnMpOworCQkJCW5vcm1hbGl6ZWROYW1lID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTRVbmlxdWVuZXNzKHN1YmNhdGVnb3J5TmFtZSk7CisJCQkJc3ViRGVmLnNldE5vcm1hbGl6ZWROYW1lKG5vcm1hbGl6ZWROYW1lKTsKKwkJCQlzdWJjYXRlRGVmLmFkZChzdWJEZWYpOworCQkJfQorCisJCQljYXREZWYuc2V0U3ViY2F0ZWdvcmllcyhzdWJjYXRlRGVmKTsKKwkJCWNhdGVncm9pZXNEZWYuYWRkKGNhdERlZik7CisJCX0KKwkJcmV0dXJuIGNhdGVncm9pZXNEZWY7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldExvZyhMb2dnZXIgbG9nKSB7CisJCUNhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyLmxvZyA9IGxvZzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29tbW9uSW1wb3J0TWFuYWdlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Db21tb25JbXBvcnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5OWI2NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29tbW9uSW1wb3J0TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgamVyc2V5LnJlcGFja2FnZWQuY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5SZXN1bHRTdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qb2xpY3lUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJjb21tb25JbXBvcnRNYW5hZ2VyIikKK3B1YmxpYyBjbGFzcyBDb21tb25JbXBvcnRNYW5hZ2VyIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21tb25JbXBvcnRNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHM7CisJQFJlc291cmNlCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24sIENvbnN1bWVyPExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPj4gY29uc3VtZXIpIHsKKwkJY29uc3VtZXIuYWNjZXB0KGdldFByb3BlcnRpZXModG9zY2FKc29uKSk7CisJfQorCisJcHJpdmF0ZSBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gZ2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbikgeworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gdmFsdWVzID0gbnVsbDsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3VsdFN0YXR1c0VudW0+IHByb3BlcnRpZXMgPSBJbXBvcnRVdGlscy5nZXRQcm9wZXJ0aWVzKHRvc2NhSnNvbik7CisKKwkJaWYgKHByb3BlcnRpZXMuaXNMZWZ0KCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzTWFwID0gcHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChwcm9wZXJ0aWVzTWFwICE9IG51bGwgJiYgcHJvcGVydGllc01hcC5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKKworCQkJCWZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGVudHJ5IDogcHJvcGVydGllc01hcC5lbnRyeVNldCgpKSB7CisJCQkJCVN0cmluZyBwcm9wTmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJUHJvcGVydHlEZWZpbml0aW9uIG5ld1Byb3BlcnR5RGVmaW5pdGlvbiA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJCQkJbmV3UHJvcGVydHlEZWZpbml0aW9uLnNldE5hbWUocHJvcE5hbWUpOworCQkJCQl2YWx1ZXMuYWRkKG5ld1Byb3BlcnR5RGVmaW5pdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzTWFwKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBDb25zdW1lcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+PiBjb25zdW1lcikgeworCQlmaW5hbCBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXModG9zY2FKc29uKTsKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBjb2xsZWN0ID0gcHJvcGVydGllcy5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoZSAtPiBlLmdldE5hbWUoKSwgZSAtPiBlKSk7CisJCQljb25zdW1lci5hY2NlcHQoY29sbGVjdCk7CisJCX0KKworCX0KKworCWludGVyZmFjZSBJQ3JlYXRlRWxlbWVudFR5cGU8VDEsIFQyLCBFbGVtZW50VHlwZT4geworCQlFbGVtZW50VHlwZSBjcmVhdGVFbGVtZW50KFQxIGZpcnN0QXJnLCBUMiBzZWNvbmRBcmcpOworCX0KKworCXByb3RlY3RlZCA8RWxlbWVudERlZmluaXRpb24+IEVpdGhlcjxMaXN0PEVsZW1lbnREZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVFbGVtZW50VHlwZXNGcm9tWW1sKFN0cmluZyBlbGVtZW50VHlwZXNZbWwsIElDcmVhdGVFbGVtZW50VHlwZTxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4sIEVsZW1lbnREZWZpbml0aW9uPiBjcmVhdGVBcGkpIHsKKworCQlMaXN0PEVsZW1lbnREZWZpbml0aW9uPiBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdHJ5IHsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5ldyBZYW1sKCkubG9hZChlbGVtZW50VHlwZXNZbWwpOworCisJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVsZW1lbnRUeXBlc0VudHJ5SXRyID0gdG9zY2FKc29uLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChlbGVtZW50VHlwZXNFbnRyeUl0ci5oYXNOZXh0KCkpIHsKKwkJCQlFbnRyeTxTdHJpbmcsIE9iamVjdD4gZWxlbWVudFR5cGVOYW1lRGF0YUVudHJ5ID0gZWxlbWVudFR5cGVzRW50cnlJdHIubmV4dCgpOworCQkJCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWVEYXRhRW50cnkuZ2V0S2V5KCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlbGVtZW50VHlwZUpzb25EYXRhID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVsZW1lbnRUeXBlTmFtZURhdGFFbnRyeS5nZXRWYWx1ZSgpOworCQkJCUVsZW1lbnREZWZpbml0aW9uIGVsZW1lbnREZWZpbml0aW9uID0gY3JlYXRlQXBpLmNyZWF0ZUVsZW1lbnQoZWxlbWVudFR5cGVOYW1lLCBlbGVtZW50VHlwZUpzb25EYXRhKTsKKwkJCQllbGVtZW50VHlwZXMuYWRkKGVsZW1lbnREZWZpbml0aW9uKTsKKworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB5YW1sIGZpbGUge30ge30iLCBlbGVtZW50VHlwZXNZbWwsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MX0ZJTEUpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChlbGVtZW50VHlwZXMpOworCX0KKworCXByb3RlY3RlZCA8RmllbGRUeXBlPiB2b2lkIHNldEZpZWxkKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBTdHJpbmcgZmllbGROYW1lLCBDb25zdW1lcjxGaWVsZFR5cGU+IHNldHRlcikgeworCQlpZiAodG9zY2FKc29uLmNvbnRhaW5zS2V5KGZpZWxkTmFtZSkpIHsKKwkJCUZpZWxkVHlwZSBmaWVsZFZhbHVlID0gKEZpZWxkVHlwZSkgdG9zY2FKc29uLmdldChmaWVsZE5hbWUpOworCQkJc2V0dGVyLmFjY2VwdChmaWVsZFZhbHVlKTsKKwkJfQorCisJfQorCisJZW51bSBFbGVtZW50VHlwZUVudW0geworCQlQb2xpY3lUeXBlLCBHcm91cFR5cGUsIERhdGFUeXBlLCBDYXBhYmlsaXR5VHlwZSwgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZQorCX07CisKKwlwcml2YXRlIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckVsZW1lbnRUeXBlKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzLCBFbGVtZW50VHlwZUVudW0gZWxlbWVudFR5cGVFbnVtKSB7CisJCUFjdGlvblN0YXR1cyByZXQ7CisJCXN3aXRjaCAoZWxlbWVudFR5cGVFbnVtKSB7CisJCWNhc2UgR3JvdXBUeXBlOgorCQkJcmV0ID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yR3JvdXBUeXBlKHN0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBEYXRhVHlwZToKKwkJCXJldCA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckRhdGFUeXBlKHN0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBDYXBhYmlsaXR5VHlwZToKKwkJCXJldCA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckNhcGFiaWxpdHlUeXBlKHN0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBJbnRlcmZhY2VMaWZlY3ljbGVUeXBlOgorCQkJcmV0ID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yTGlmZWN5Y2xlVHlwZShzdGF0dXMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpdmF0ZSA8RWxlbWVudFR5cGVEZWZpbml0aW9uPiBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEZvckVsZW1lbnRUeXBlKEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIEVsZW1lbnRUeXBlRW51bSBlbGVtZW50VHlwZUVudW0sIEVsZW1lbnRUeXBlRGVmaW5pdGlvbiBlbGVtZW50VHlwZURlZmluaXRpb24pIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmV0OworCQlzd2l0Y2ggKGVsZW1lbnRUeXBlRW51bSkgeworCQljYXNlIEdyb3VwVHlwZToKKwkJCXJldCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5R3JvdXBUeXBlKGFjdGlvblN0YXR1cywgKEdyb3VwVHlwZURlZmluaXRpb24pIGVsZW1lbnRUeXBlRGVmaW5pdGlvbik7CisJCQlicmVhazsKKwkJY2FzZSBQb2xpY3lUeXBlOgorCQkJcmV0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlQb2xpY3lUeXBlKGFjdGlvblN0YXR1cywgKFBvbGljeVR5cGVEZWZpbml0aW9uKSBlbGVtZW50VHlwZURlZmluaXRpb24pOworCQkJYnJlYWs7CisJCWNhc2UgRGF0YVR5cGU6CisJCQlyZXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeURhdGFUeXBlKGFjdGlvblN0YXR1cywgKERhdGFUeXBlRGVmaW5pdGlvbikgZWxlbWVudFR5cGVEZWZpbml0aW9uLCBudWxsKTsKKwkJCWJyZWFrOworCQljYXNlIENhcGFiaWxpdHlUeXBlOgorCQkJcmV0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlDYXBhYmlsaXR5VHlwZShhY3Rpb25TdGF0dXMsIChDYXBhYmlsaXR5VHlwZURlZmluaXRpb24pIGVsZW1lbnRUeXBlRGVmaW5pdGlvbik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCXByb3RlY3RlZCA8RWxlbWVudFR5cGVEZWZpbml0aW9uPiBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgQm9vbGVhbj4+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlRWxlbWVudFR5cGVzQnlEYW8oTGlzdDxFbGVtZW50VHlwZURlZmluaXRpb24+IGVsZW1lbnRUeXBlc1RvQ3JlYXRlLAorCQkJRnVuY3Rpb248RWxlbWVudFR5cGVEZWZpbml0aW9uLCBFaXRoZXI8QWN0aW9uU3RhdHVzLCBSZXNwb25zZUZvcm1hdD4+IHZhbGlkYXRvciwgRnVuY3Rpb248RWxlbWVudFR5cGVEZWZpbml0aW9uLCBJbW11dGFibGVQYWlyPEVsZW1lbnRUeXBlRW51bSwgU3RyaW5nPj4gZWxlbWVudEluZm9HZXR0ZXIsCisJCQlGdW5jdGlvbjxTdHJpbmcsIEVpdGhlcjxFbGVtZW50VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+PiBlbGVtZW50RmV0Y2hlciwgRnVuY3Rpb248RWxlbWVudFR5cGVEZWZpbml0aW9uLCBFaXRoZXI8RWxlbWVudFR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPj4gZWxlbWVudEFkZGVyLAorCQkJQmlGdW5jdGlvbjxFbGVtZW50VHlwZURlZmluaXRpb24sIEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgRWl0aGVyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4+IGVsZW1lbnRVcGdyYWRlcikgeworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZURlZmluaXRpb24sIEJvb2xlYW4+PiBjcmVhdGVkRWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZURlZmluaXRpb24sIEJvb2xlYW4+PiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KGNyZWF0ZWRFbGVtZW50VHlwZXMpOworCisJCUl0ZXJhdG9yPEVsZW1lbnRUeXBlRGVmaW5pdGlvbj4gZWxlbWVudFR5cGVJdHIgPSBlbGVtZW50VHlwZXNUb0NyZWF0ZS5pdGVyYXRvcigpOworCisJCXRyeSB7CisKKwkJCXdoaWxlIChlbGVtZW50VHlwZUl0ci5oYXNOZXh0KCkpIHsKKwkJCQlFbGVtZW50VHlwZURlZmluaXRpb24gZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZUl0ci5uZXh0KCk7CisJCQkJZmluYWwgSW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZUVudW0sIFN0cmluZz4gZWxlbWVudEluZm8gPSBlbGVtZW50SW5mb0dldHRlci5hcHBseShlbGVtZW50VHlwZSk7CisJCQkJRWxlbWVudFR5cGVFbnVtIGVsZW1lbnRUeXBlRW51bSA9IGVsZW1lbnRJbmZvLmxlZnQ7CisJCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudEluZm8ucmlnaHQ7CisKKwkJCQlFaXRoZXI8QWN0aW9uU3RhdHVzLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVFbGVtZW50VHlwZSA9IHZhbGlkYXRvci5hcHBseShlbGVtZW50VHlwZSk7CisJCQkJaWYgKHZhbGlkYXRlRWxlbWVudFR5cGUuaXNSaWdodCgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVFbGVtZW50VHlwZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIGluIHZhbGlkYXRpb24gb2YgZWxlbWVudCB0eXBlIHt9LiBSZXNwb25zZSBpcyB7fSIsIGVsZW1lbnRUeXBlLCByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCkpOworCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlsb2cuaW5mbygic2VuZCB7fSA6IHt9IHRvIGRhbyBmb3IgY3JlYXRlIiwgZWxlbWVudFR5cGVFbnVtLm5hbWUoKSwgZWxlbWVudE5hbWUpOworCisJCQkJRWl0aGVyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmluZEVsZW1lbnRUeXBlID0gZWxlbWVudEZldGNoZXIuYXBwbHkoZWxlbWVudE5hbWUpOworCQkJCWlmIChmaW5kRWxlbWVudFR5cGUuaXNSaWdodCgpKSB7CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZEVsZW1lbnRUeXBlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJzZWFyY2hlZCB7fSBmaW5pc2hlZCB3aXRoIHJlc3VsdDp7fSIsIGVsZW1lbnRUeXBlRW51bS5uYW1lKCksIHN0YXR1cy5uYW1lKCkpOworCQkJCQlpZiAoc3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0Rm9yRWxlbWVudFR5cGUoY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JFbGVtZW50VHlwZShzdGF0dXMsIGVsZW1lbnRUeXBlRW51bSksIGVsZW1lbnRUeXBlRW51bSwgZWxlbWVudFR5cGUpOworCQkJCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJRWl0aGVyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGF0YU1vZGVsUmVzcG9uc2UgPSBlbGVtZW50QWRkZXIuYXBwbHkoZWxlbWVudFR5cGUpOworCisJCQkJCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkQWRkaW5nTm9kZVR5cGVFcnJvcigiQ3JlYXRlIHt9IiwgZWxlbWVudFR5cGVFbnVtLm5hbWUoKSk7CisJCQkJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSB7fToge30iLCBlbGVtZW50VHlwZUVudW0ubmFtZSgpLCBlbGVtZW50TmFtZSk7CisJCQkJCQkJCWlmIChkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5TQ0hFTUFfVklPTEFUSU9OKSB7CisJCQkJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0Rm9yRWxlbWVudFR5cGUoY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JFbGVtZW50VHlwZShkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCksIGVsZW1lbnRUeXBlRW51bSksIGVsZW1lbnRUeXBlRW51bSwgZWxlbWVudFR5cGUpOworCisJCQkJCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQljcmVhdGVkRWxlbWVudFR5cGVzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZURlZmluaXRpb24sIEJvb2xlYW4+KGVsZW1lbnRUeXBlLCBmYWxzZSkpOworCQkJCQkJCQl9CisJCQkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCQkJcHJvcGVydHlPcGVyYXRpb24uZ2V0VGl0YW5HZW5lcmljRGFvKCkucm9sbGJhY2soKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByb3BlcnR5T3BlcmF0aW9uLmdldFRpdGFuR2VuZXJpY0RhbygpLmNvbW1pdCgpOworCQkJCQkJCWNyZWF0ZWRFbGVtZW50VHlwZXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgQm9vbGVhbj4oZWxlbWVudFR5cGUsIHRydWUpKTsKKwkJCQkJCQlsb2cuZGVidWcoInt9IDoge30gIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4iLCBlbGVtZW50VHlwZUVudW0ubmFtZSgpLCBlbGVtZW50TmFtZSk7CisJCQkJCQl9CisJCQkJCQlpZiAoIWVsZW1lbnRUeXBlSXRyLmhhc05leHQoKSkgeworCQkJCQkJCWxvZy5pbmZvKCJhbGwge30gd2VyZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEhISIsIGVsZW1lbnRUeXBlRW51bS5uYW1lKCkpOworCQkJCQkJfQorCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCisJCQkJCWlmIChlbGVtZW50VXBncmFkZXIgIT0gbnVsbCkgeworCQkJCQkJRWl0aGVyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBncmFkZVJlc3BvbnNlID0gbnVsbDsKKwkJCQkJCXRyeSB7CisJCQkJCQkJdXBncmFkZVJlc3BvbnNlID0gZWxlbWVudFVwZ3JhZGVyLmFwcGx5KGVsZW1lbnRUeXBlLCBmaW5kRWxlbWVudFR5cGUubGVmdCgpLnZhbHVlKCkpOworCQkJCQkJCWlmICh1cGdyYWRlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBncmFkZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJCQkJaWYgKHN0YXR1cyA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCQkJCQljcmVhdGVkRWxlbWVudFR5cGVzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZURlZmluaXRpb24sIEJvb2xlYW4+KGVsZW1lbnRUeXBlLCBmYWxzZSkpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdEZvckVsZW1lbnRUeXBlKGNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yRWxlbWVudFR5cGUodXBncmFkZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSwgZWxlbWVudFR5cGVFbnVtKSwgZWxlbWVudFR5cGVFbnVtLCBlbGVtZW50VHlwZSk7CisJCQkJCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlsb2cuZGVidWcoInt9IDoge30gIHdhcyB1cGdyYWRlZCBzdWNjZXNzZnVsbHkuIiwgZWxlbWVudFR5cGVFbnVtLm5hbWUoKSwgZWxlbWVudE5hbWUpOworCQkJCQkJCQljcmVhdGVkRWxlbWVudFR5cGVzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZURlZmluaXRpb24sIEJvb2xlYW4+KGVsZW1lbnRUeXBlLCB0cnVlKSk7CisJCQkJCQkJfQorCQkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCQlpZiAodXBncmFkZVJlc3BvbnNlID09IG51bGwgfHwgdXBncmFkZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCQkJCQlwcm9wZXJ0eU9wZXJhdGlvbi5nZXRUaXRhbkdlbmVyaWNEYW8oKS5yb2xsYmFjaygpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXByb3BlcnR5T3BlcmF0aW9uLmdldFRpdGFuR2VuZXJpY0RhbygpLmNvbW1pdCgpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gbXNoaXRyaXQgT25jZSBHcm91cFR5cGUgVmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBhZGQKKwkJCQkJCS8vIGNvZGUgaGVyZQorCQkJCQkJY3JlYXRlZEVsZW1lbnRUeXBlcy5hZGQobmV3IEltbXV0YWJsZVBhaXI8RWxlbWVudFR5cGVEZWZpbml0aW9uLCBCb29sZWFuPihlbGVtZW50VHlwZSwgZmFsc2UpKTsKKwkJCQkJCWxvZy5kZWJ1Zygie30gOiB7fSBhbHJlYWR5IGV4aXN0cy4iLCBlbGVtZW50VHlwZUVudW0ubmFtZSgpLCBlbGVtZW50TmFtZSk7CisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKGVpdGhlclJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlwcm9wZXJ0eU9wZXJhdGlvbi5nZXRUaXRhbkdlbmVyaWNEYW8oKS5yb2xsYmFjaygpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKworCX0KKworCXB1YmxpYyA8RWxlbWVudFR5cGVEZWZpbml0aW9uPiBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgQm9vbGVhbj4+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlRWxlbWVudFR5cGVzKFN0cmluZyBlbGVtZW50VHlwZXNZbWwsIEZ1bmN0aW9uPFN0cmluZywgRWl0aGVyPExpc3Q8RWxlbWVudFR5cGVEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPj4gZWxlbWVudFR5cGVGcm9tWW1sQ3JlYXRlciwKKwkJCUZ1bmN0aW9uPExpc3Q8RWxlbWVudFR5cGVEZWZpbml0aW9uPiwgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZURlZmluaXRpb24sIEJvb2xlYW4+PiwgUmVzcG9uc2VGb3JtYXQ+PiBlbGVtZW50VHlwZURhb0NyZWF0ZXIsIEVsZW1lbnRUeXBlRW51bSBlbGVtZW50VHlwZUVudW0pIHsKKworCQlFaXRoZXI8TGlzdDxFbGVtZW50VHlwZURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlRnJvbVltbENyZWF0ZXIuYXBwbHkoZWxlbWVudFR5cGVzWW1sKTsKKwkJaWYgKGVsZW1lbnRUeXBlcy5pc1JpZ2h0KCkpIHsKKwkJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSBlbGVtZW50VHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdEZvckVsZW1lbnRUeXBlKHN0YXR1cywgZWxlbWVudFR5cGVFbnVtLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBlbGVtZW50VHlwZURhb0NyZWF0ZXIuYXBwbHkoZWxlbWVudFR5cGVzLmxlZnQoKS52YWx1ZSgpKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29tcG9uZW50QnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Db21wb25lbnRCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3YjhiOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29tcG9uZW50QnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsODYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlVHJpcGxlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YW1vZGVsLmFwaS5IaWdoZXN0RmlsdGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5TZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwUmVxRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQ29tcG9uZW50Q2FjaGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudE1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50QnVzaW5lc3NMb2dpYyBleHRlbmRzIEJhc2VCdXNpbmVzc0xvZ2ljIHsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyBhcnRpZmFjdHNCdXNpbmVzc0xvZ2ljOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBDb21wb25lbnRDYWNoZSBjb21wb25lbnRDYWNoZTsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21wb25lbnRCdXNpbmVzc0xvZ2ljLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJRUxEX0xBQkVMID0gInRhZyI7CisKKwlwdWJsaWMgYWJzdHJhY3QgRWl0aGVyPExpc3Q8U3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZU1hcmtlZENvbXBvbmVudHMoKTsKKworCXB1YmxpYyBhYnN0cmFjdCBDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgZ2V0Q29tcG9uZW50SW5zdGFuY2VCTCgpOworCisJcHVibGljIGFic3RyYWN0IEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgUmVzcG9uc2VGb3JtYXQ+IGdldENvbXBvbmVudEluc3RhbmNlc0ZpbHRlcmVkQnlQcm9wZXJ0aWVzQW5kSW5wdXRzKFN0cmluZyBjb21wb25lbnRJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyB1c2VySWQsIFN0cmluZyBzZWFyY2hUZXh0KTsKKworCXByb3RlY3RlZCBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlcihVc2VyIHVzZXIsIFN0cmluZyBlY29tcEVycm9yQ29udGV4dCwgQ29tcG9uZW50IGNvbXBvbmVudCwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0QWN0aW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB1c2VyVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlVXNlck5vdEVtcHR5KHVzZXIsIGVjb21wRXJyb3JDb250ZXh0KTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCWlmICh1c2VyVmFsaWRhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXVzZXIuc2V0VXNlcklkKCJVTktOT1dOIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IHVzZXJWYWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBjb21wb25lbnQsICIiLCAiIiwgYXVkaXRBY3Rpb24sIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB1c2VyUmVzdWx0ID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXIsIGVjb21wRXJyb3JDb250ZXh0LCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHVzZXJSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXNwb25zZUZvcm1hdCA9IHVzZXJSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhdWRpdEFjdGlvbiwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQl1c2VyID0gdXNlclJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJcmV0dXJuIHVzZXJSZXN1bHQ7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyUm9sZShVc2VyIHVzZXIsIENvbXBvbmVudCBjb21wb25lbnQsIExpc3Q8Um9sZT4gcm9sZXMsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEFjdGlvbiwgU3RyaW5nIGNvbW1lbnQpIHsKKwkJaWYgKHJvbGVzICE9IG51bGwgJiYgcm9sZXMuaXNFbXB0eSgpKSB7CisJCQlyb2xlcy5hZGQoUm9sZS5BRE1JTik7CisJCQlyb2xlcy5hZGQoUm9sZS5ERVNJR05FUik7CisJCX0KKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVVc2VyUm9sZSh1c2VyLCByb2xlcyk7CisJCWlmICh2YWxpZGF0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcyA9IG5ldyBFbnVtTWFwPD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCQlpZiAoY29tcG9uZW50VHlwZS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSkpIHsKKwkJCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQsIGNvbW1lbnQpOworCQkJCVN0cmluZyBkaXN0cmlidXRpb25TdGF0dXMgPSAoKFNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBjb21wb25lbnQuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5nZXREaXN0cmlidXRpb25TdGF0dXMoKTsKKwkJCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RQUkVWX1NUQVRVUywgZGlzdHJpYnV0aW9uU3RhdHVzKTsKKwkJCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RDVVJSX1NUQVRVUywgZGlzdHJpYnV0aW9uU3RhdHVzKTsKKwkJCX0KKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudCh2YWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSwgdXNlciwgY29tcG9uZW50LCAiIiwgIiIsIGF1ZGl0QWN0aW9uLCBjb21wb25lbnRUeXBlLCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJfQorCQlyZXR1cm4gdmFsaWRhdGlvblJlc3VsdDsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUoVXNlciB1c2VyLCBDb21wb25lbnQgY29tcG9uZW50LCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQlDb21wb25lbnRUeXBlRW51bSB0eXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGNvbXBvbmVudE5hbWUpKSB7CisJCQlsb2cuZGVidWcoImNvbXBvbmVudCBuYW1lIGlzIGVtcHR5Iik7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0NPTVBPTkVOVF9OQU1FLCB0eXBlLmdldFZhbHVlKCkpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4oZXJyb3JSZXNwb25zZSwgdXNlciwgY29tcG9uZW50LCAiIiwgIiIsIGFjdGlvbkVudW0sIHR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29tcG9uZW50TmFtZUxlbmd0aChjb21wb25lbnROYW1lKSkgeworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgbmFtZSBleGNlZWRzIG1heCBsZW5ndGgge30gIiwgVmFsaWRhdGlvblV0aWxzLkNPTVBPTkVOVF9OQU1FX01BWF9MRU5HVEgpOworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVCwgdHlwZS5nZXRWYWx1ZSgpLCAiIiArIFZhbGlkYXRpb25VdGlscy5DT01QT05FTlRfTkFNRV9NQVhfTEVOR1RIKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCQlpZiAoIXZhbGlkYXRlVGFnUGF0dGVybihjb21wb25lbnROYW1lKSkgeworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgbmFtZSB7fSBoYXMgaW52YWxpZCBmb3JtYXQiLCBjb21wb25lbnROYW1lKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09NUE9ORU5UX05BTUUsIHR5cGUuZ2V0VmFsdWUoKSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihlcnJvclJlc3BvbnNlLCB1c2VyLCBjb21wb25lbnQsICIiLCAiIiwgYWN0aW9uRW51bSwgdHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisJCWNvbXBvbmVudC5zZXROb3JtYWxpemVkTmFtZShWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSk7CisJCWNvbXBvbmVudC5zZXRTeXN0ZW1OYW1lKFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKGNvbXBvbmVudE5hbWUpKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXNjcmlwdGlvbkFuZENsZWFudXAoVXNlciB1c2VyLCBDb21wb25lbnQgY29tcG9uZW50LCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQlDb21wb25lbnRUeXBlRW51bSB0eXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gY29tcG9uZW50LmdldERlc2NyaXB0aW9uKCk7CisJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU3RyaW5nTm90RW1wdHkoZGVzY3JpcHRpb24pKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTiwgdHlwZS5nZXRWYWx1ZSgpKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCQlkZXNjcmlwdGlvbiA9IFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKGRlc2NyaXB0aW9uKTsKKwkJZGVzY3JpcHRpb24gPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlV2hpdGVzcGFjZShkZXNjcmlwdGlvbik7CisJCWRlc2NyaXB0aW9uID0gVmFsaWRhdGlvblV0aWxzLnN0cmlwT2N0ZXRzKGRlc2NyaXB0aW9uKTsKKwkJZGVzY3JpcHRpb24gPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlSHRtbFRhZ3NPbmx5KGRlc2NyaXB0aW9uKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXREZXNjcmlwdGlvbiA9IHZhbGlkYXRlQ29tcG9uZW50RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIHR5cGUpOworCQlpZiAodmFsaWRhdERlc2NyaXB0aW9uLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0RGVzY3JpcHRpb24ucmlnaHQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCWNvbXBvbmVudC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgQ29tcG9uZW50VHlwZUVudW0gdHlwZSkgeworCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVEZXNjcmlwdGlvbkxlbmd0aChkZXNjcmlwdGlvbikpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0RFU0NSSVBUSU9OX0VYQ0VFRFNfTElNSVQsIHR5cGUuZ2V0VmFsdWUoKSwgIiIgKyBWYWxpZGF0aW9uVXRpbHMuQ09NUE9ORU5UX0RFU0NSSVBUSU9OX01BWF9MRU5HVEgpKTsKKwkJCX0KKworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJc0VuZ2xpc2goZGVzY3JpcHRpb24pKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0RFU0NSSVBUSU9OLCB0eXBlLmdldFZhbHVlKCkpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50TmFtZVVuaXF1ZShVc2VyIHVzZXIsIENvbXBvbmVudCBjb21wb25lbnQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCUNvbXBvbmVudFR5cGVFbnVtIHR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKHR5cGUpOworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGF0YU1vZGVsUmVzcG9uc2U7CisJCWRhdGFNb2RlbFJlc3BvbnNlID0gY29tcG9uZW50T3BlcmF0aW9uLnZhbGlkYXRlQ29tcG9uZW50TmFtZUV4aXN0cyhjb21wb25lbnQuZ2V0TmFtZSgpKTsKKworCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UuaXNMZWZ0KCkpIHsKKwkJCWlmIChkYXRhTW9kZWxSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSkgeworCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmluZm8oIkNvbXBvbmVudCB3aXRoIG5hbWUge30gYWxyZWFkeSBleGlzdHMiLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTkFNRV9BTFJFQURZX0VYSVNULCB0eXBlLmdldFZhbHVlKCksIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJfQorCQl9CisJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAidmFsaWRhdGVDb21wb25lbnROYW1lVW5pcXVlIik7CisJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJ2YWxpZGF0ZUNvbXBvbmVudE5hbWVVbmlxdWUiKTsKKwkJbG9nLmRlYnVnKCJFcnJvciB3aGlsZSB2YWxpZGF0ZUNvbXBvbmVudE5hbWVVbmlxdWUgZm9yIGNvbXBvbmVudDoge30iLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKKwkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlKTsKKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbnRhY3RJZChVc2VyIHVzZXIsIENvbXBvbmVudCBjb21wb25lbnQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgY29tcG9uZW50IGNvbnRhY3QgaW5mbyIpOworCQlDb21wb25lbnRUeXBlRW51bSB0eXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9IGNvbXBvbmVudC5nZXRDb250YWN0SWQoKTsKKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGNvbnRhY3RJZCkpIHsKKwkJCWxvZy5pbmZvKCJjb250YWN0IGluZm8gaXMgbWlzc2luZy4iKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QsIHR5cGUuZ2V0VmFsdWUoKSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihlcnJvclJlc3BvbnNlLCB1c2VyLCBjb21wb25lbnQsICIiLCAiIiwgYWN0aW9uRW51bSwgdHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbnRhY3RJZFJlc3BvbnNlID0gdmFsaWRhdGVDb250YWN0SWQoY29udGFjdElkLCB0eXBlKTsKKwkJaWYgKHZhbGlkYXRlQ29udGFjdElkUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlQ29udGFjdElkUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlKTsKKwkJfQorCQlyZXR1cm4gdmFsaWRhdGVDb250YWN0SWRSZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb250YWN0SWQoU3RyaW5nIGNvbnRhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0gdHlwZSkgeworCQlpZiAoY29udGFjdElkICE9IG51bGwpIHsKKwkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29udGFjdElkKGNvbnRhY3RJZCkpIHsKKwkJCQlsb2cuaW5mbygiY29udGFjdCBpbmZvIGlzIGludmFsaWQuIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgdHlwZS5nZXRWYWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChmYWxzZSk7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVJY29uKFVzZXIgdXNlciwgQ29tcG9uZW50IGNvbXBvbmVudCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBJY29uIik7CisJCUNvbXBvbmVudFR5cGVFbnVtIHR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOworCQlTdHJpbmcgaWNvbiA9IGNvbXBvbmVudC5nZXRJY29uKCk7CisJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU3RyaW5nTm90RW1wdHkoaWNvbikpIHsKKwkJCWxvZy5pbmZvKCJpY29uIGlzIG1pc3NpbmcuIik7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLCB0eXBlLmdldFZhbHVlKCkpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4oZXJyb3JSZXNwb25zZSwgdXNlciwgY29tcG9uZW50LCAiIiwgIiIsIGFjdGlvbkVudW0sIHR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVJY29uID0gdmFsaWRhdGVJY29uKGljb24sIHR5cGUpOworCQlpZiAodmFsaWRhdGVJY29uLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUljb24ucmlnaHQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlKTsKKwkJfQorCQlyZXR1cm4gdmFsaWRhdGVJY29uOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUljb24oU3RyaW5nIGljb24sIENvbXBvbmVudFR5cGVFbnVtIHR5cGUpIHsKKwkJaWYgKGljb24gIT0gbnVsbCkgeworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJY29uTGVuZ3RoKGljb24pKSB7CisJCQkJbG9nLmRlYnVnKCJpY29uIGV4Y2VlZHMgbWF4IGxlbmd0aCIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSUNPTl9FWENFRURTX0xJTUlULCB0eXBlLmdldFZhbHVlKCksICIiICsgVmFsaWRhdGlvblV0aWxzLklDT05fTUFYX0xFTkdUSCkpOworCQkJfQorCisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUljb24oaWNvbikpIHsKKwkJCQlsb2cuaW5mbygiaWNvbiBpcyBpbnZhbGlkLiIpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0lDT04sIHR5cGUuZ2V0VmFsdWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVGFnc0xpc3RBbmRSZW1vdmVEdXBsaWNhdGVzKFVzZXIgdXNlciwgQ29tcG9uZW50IGNvbXBvbmVudCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJTGlzdDxTdHJpbmc+IHRhZ3NMaXN0ID0gY29tcG9uZW50LmdldFRhZ3MoKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVGFncyA9IHZhbGlkYXRlQ29tcG9uZW50VGFncyh0YWdzTGlzdCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7CisJCWlmICh2YWxpZGF0ZVRhZ3MuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlVGFncy5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgY29tcG9uZW50LCAiIiwgIiIsIGFjdGlvbkVudW0sIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJVmFsaWRhdGlvblV0aWxzLnJlbW92ZUR1cGxpY2F0ZUZyb21MaXN0KHRhZ3NMaXN0KTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50VGFncyhMaXN0PFN0cmluZz4gdGFncywgU3RyaW5nIG5hbWUsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHsKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBjb21wb25lbnQgdGFncyIpOworCQlib29sZWFuIGluY2x1ZGVzQ29tcG9uZW50TmFtZSA9IGZhbHNlOworCQlpbnQgdGFnTGlzdFNpemUgPSAwOworCQlpZiAodGFncyAhPSBudWxsICYmICF0YWdzLmlzRW1wdHkoKSkgeworCQkJZm9yIChTdHJpbmcgdGFnIDogdGFncykgeworCQkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVGFnTGVuZ3RoKHRhZykpIHsKKwkJCQkJbG9nLmRlYnVnKCJ0YWcgbGVuZ3RoIGV4Y2VlZHMgbGltaXQge30iLCBWYWxpZGF0aW9uVXRpbHMuVEFHX01BWF9MRU5HVEgpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULCAiIiArIFZhbGlkYXRpb25VdGlscy5UQUdfTUFYX0xFTkdUSCkpOworCQkJCX0KKwkJCQlpZiAodmFsaWRhdGVUYWdQYXR0ZXJuKHRhZykpIHsKKwkJCQkJaWYgKCFpbmNsdWRlc0NvbXBvbmVudE5hbWUpIHsKKwkJCQkJCWluY2x1ZGVzQ29tcG9uZW50TmFtZSA9IG5hbWUuZXF1YWxzKHRhZyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoImludmFsaWQgdGFnIHt9IiwgdGFnKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfRklFTERfRk9STUFULCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIFRBR19GSUVMRF9MQUJFTCkpOworCQkJCX0KKwkJCQl0YWdMaXN0U2l6ZSArPSB0YWcubGVuZ3RoKCkgKyAxOworCQkJfQorCQkJaWYgKHRhZ0xpc3RTaXplID4gMCkgeworCQkJCXRhZ0xpc3RTaXplLS07CisJCQl9CisKKwkJCWlmICghaW5jbHVkZXNDb21wb25lbnROYW1lKSB7CisJCQkJbG9nLmRlYnVnKCJ0YWdzIG11c3QgaW5jbHVkZSBjb21wb25lbnQgbmFtZSIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9UQUdTX05PX0NPTVBfTkFNRSkpOworCQkJfQorCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVUYWdMaXN0TGVuZ3RoKHRhZ0xpc3RTaXplKSkgeworCQkJCWxvZy5kZWJ1Zygib3ZlcmFsbCB0YWdzIGxlbmd0aCBleGNlZWRzIGxpbWl0IHt9IiwgVmFsaWRhdGlvblV0aWxzLlRBR19MSVNUX01BWF9MRU5HVEgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfVEFHU19FWENFRURfTElNSVQsICIiICsgVmFsaWRhdGlvblV0aWxzLlRBR19MSVNUX01BWF9MRU5HVEgpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfVEFHUykpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVGFnUGF0dGVybihTdHJpbmcgdGFnKSB7CisJCXJldHVybiBWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb21wb25lbnROYW1lUGF0dGVybih0YWcpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUHJvamVjdENvZGUoVXNlciB1c2VyLCBDb21wb25lbnQgY29tcG9uZW50LCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQlpZiAoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZXF1YWxzKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBQUk9KRUNUX0NPREUgbmFtZSAiKTsKKwkJU3RyaW5nIHByb2plY3RDb2RlID0gY29tcG9uZW50LmdldFByb2plY3RDb2RlKCk7CisKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eShwcm9qZWN0Q29kZSkpIHsKKwkJCWxvZy5pbmZvKCJwcm9qZWN0Q29kZSBpcyBtaXNzaW5nLiIpOworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19QUk9KRUNUX0NPREUpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4oZXJyb3JSZXNwb25zZSwgdXNlciwgY29tcG9uZW50LCAiIiwgIiIsIGFjdGlvbkVudW0sIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVQcm9qZWN0Q29kZVJlc3BvbnNlID0gdmFsaWRhdGVQcm9qZWN0Q29kZShwcm9qZWN0Q29kZSk7CisJCWlmICh2YWxpZGF0ZVByb2plY3RDb2RlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlUHJvamVjdENvZGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgY29tcG9uZW50LCAiIiwgIiIsIGFjdGlvbkVudW0sIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCQl9CisJCXJldHVybiB2YWxpZGF0ZVByb2plY3RDb2RlUmVzcG9uc2U7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVQcm9qZWN0Q29kZShTdHJpbmcgcHJvamVjdENvZGUpIHsKKwkJaWYgKHByb2plY3RDb2RlICE9IG51bGwpIHsKKwkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUHJvamVjdENvZGUocHJvamVjdENvZGUpKSB7CisJCQkJbG9nLmluZm8oInByb2plY3RDb2RlICBpcyBub3QgdmFsaWQuIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9QUk9KRUNUX0NPREUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbXBvbmVudEZpZWxkc0Zvck92ZXJyaWRlQXR0ZW1wdChDb21wb25lbnQgY29tcG9uZW50KSB7CisJCWlmIChjb21wb25lbnQuZ2V0TGlmZWN5Y2xlU3RhdGUoKSAhPSBudWxsKSB7CisJCQlsb2cuaW5mbygiTGlmZWN5Y2xlU3RhdGUgY2Fubm90IGJlIGRlZmluZWQgYnkgdXNlci4gVGhpcyBmaWVsZCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcGxpY2F0aW9uIik7CisJCX0KKwkJaWYgKGNvbXBvbmVudC5nZXRWZXJzaW9uKCkgIT0gbnVsbCkgeworCQkJbG9nLmluZm8oIlZlcnNpb24gY2Fubm90IGJlIGRlZmluZWQgYnkgdXNlci4gVGhpcyBmaWVsZCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcGxpY2F0aW9uIik7CisJCX0KKwkJaWYgKChjb21wb25lbnQuZ2V0Q3JlYXRvclVzZXJJZCgpICE9IG51bGwpIHx8IChjb21wb25lbnQuZ2V0Q3JlYXRvckZ1bGxOYW1lKCkgIT0gbnVsbCkpIHsKKwkJCWxvZy5pbmZvKCJDcmVhdG9yIGNhbm5vdCBiZSBkZWZpbmVkIGJ5IHVzZXIuIFRoaXMgZmllbGQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiIpOworCQl9CisJCWlmICgoY29tcG9uZW50LmdldExhc3RVcGRhdGVyVXNlcklkKCkgIT0gbnVsbCkgfHwgKGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkgIT0gbnVsbCkpIHsKKwkJCWxvZy5pbmZvKCJMYXN0IFVwZGF0ZXIgY2Fubm90IGJlIGRlZmluZWQgYnkgdXNlci4gVGhpcyBmaWVsZCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcGxpY2F0aW9uIik7CisJCX0KKwkJaWYgKChjb21wb25lbnQuZ2V0Q3JlYXRpb25EYXRlKCkgIT0gbnVsbCkpIHsKKwkJCWxvZy5pbmZvKCJDcmVhdGlvbiBEYXRlIGNhbm5vdCBiZSBkZWZpbmVkIGJ5IHVzZXIuIFRoaXMgZmllbGQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiIpOworCQl9CisJCWlmICgoY29tcG9uZW50LmlzSGlnaGVzdFZlcnNpb24oKSAhPSBudWxsKSkgeworCQkJbG9nLmluZm8oIklzIEhpZ2hlc3QgVmVyc2lvbiBjYW5ub3QgYmUgZGVmaW5lZCBieSB1c2VyLiBUaGlzIGZpZWxkIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24iKTsKKwkJfQorCQlpZiAoKGNvbXBvbmVudC5nZXRVVUlEKCkgIT0gbnVsbCkpIHsKKwkJCWxvZy5pbmZvKCJVVUlEIGNhbm5vdCBiZSBkZWZpbmVkIGJ5IHVzZXIuIFRoaXMgZmllbGQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiIpOworCQl9CisJCWlmICgoY29tcG9uZW50LmdldExhc3RVcGRhdGVEYXRlKCkgIT0gbnVsbCkpIHsKKwkJCWxvZy5pbmZvKCJMYXN0IFVwZGF0ZSBEYXRlIGNhbm5vdCBiZSBkZWZpbmVkIGJ5IHVzZXIuIFRoaXMgZmllbGQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiIpOworCQl9CisJCWlmIChjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSAhPSBudWxsKSB7CisJCQlsb2cuaW5mbygidWlkIGNhbm5vdCBiZSBkZWZpbmVkIGJ5IHVzZXIuIFRoaXMgZmllbGQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbi4iKTsKKwkJCWNvbXBvbmVudC5zZXRVbmlxdWVJZChudWxsKTsKKwkJfQorCQlpZiAoY29tcG9uZW50LmdldEludmFyaWFudFVVSUQoKSAhPSBudWxsKSB7CisJCQlsb2cuaW5mbygiSW52YXJpYW50IFVVSUQgY2Fubm90IGJlIGRlZmluZWQgYnkgdXNlci4gVGhpcyBmaWVsZCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcGxpY2F0aW9uLiIpOworCQl9CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRGaWVsZHNCZWZvcmVDcmVhdGUoVXNlciB1c2VyLCBDb21wb25lbnQgY29tcG9uZW50LCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQkvLyB2YWxpZGF0ZSBjb21wb25lbnQgbmFtZSB1bmlxdWVuZXNzCisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgY29tcG9uZW50IG5hbWUgIik7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gY29tcG9uZW50TmFtZVZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbXBvbmVudE5hbWUodXNlciwgY29tcG9uZW50LCBhY3Rpb25FbnVtKTsKKwkJaWYgKGNvbXBvbmVudE5hbWVWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGNvbXBvbmVudE5hbWVWYWxpZGF0aW9uOworCQl9CisKKwkJLy8gdmFsaWRhdGUgZGVzY3JpcHRpb24KKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBkZXNjcmlwdGlvbiIpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGRlc2NWYWxpZGF0aW9uID0gdmFsaWRhdGVEZXNjcmlwdGlvbkFuZENsZWFudXAodXNlciwgY29tcG9uZW50LCBhY3Rpb25FbnVtKTsKKwkJaWYgKGRlc2NWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGRlc2NWYWxpZGF0aW9uOworCQl9CisKKwkJLy8gdmFsaWRhdGUgdGFncworCQlsb2cuZGVidWcoInZhbGlkYXRlIHRhZ3MiKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB0YWdzVmFsaWRhdGlvbiA9IHZhbGlkYXRlVGFnc0xpc3RBbmRSZW1vdmVEdXBsaWNhdGVzKHVzZXIsIGNvbXBvbmVudCwgYWN0aW9uRW51bSk7CisJCWlmICh0YWdzVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiB0YWdzVmFsaWRhdGlvbjsKKwkJfQorCisJCS8vIHZhbGlkYXRlIGNvbnRhY3QgaW5mbworCQlsb2cuZGVidWcoInZhbGlkYXRlIGNvbnRhY3QgaW5mbyIpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGNvbnRhY3RJZFZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbnRhY3RJZCh1c2VyLCBjb21wb25lbnQsIGFjdGlvbkVudW0pOworCQlpZiAoY29udGFjdElkVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBjb250YWN0SWRWYWxpZGF0aW9uOworCQl9CisKKwkJLy8gdmFsaWRhdGUgaWNvbgorCQlsb2cuZGVidWcoInZhbGlkYXRlIGljb24iKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBpY29uVmFsaWRhdGlvbiA9IHZhbGlkYXRlSWNvbih1c2VyLCBjb21wb25lbnQsIGFjdGlvbkVudW0pOworCQlpZiAoaWNvblZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gaWNvblZhbGlkYXRpb247CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCS8qKioKKwkgKiBGZXRjaGVzIENvbXBvbmVudCBGcm9tIHRoZSBEQgorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlRW51bQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgPFIgZXh0ZW5kcyBDb21wb25lbnQ+IEVpdGhlcjxSLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgeworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJRWl0aGVyPFIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNvbXBvbmVudCA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRDb21wb25lbnQoY29tcG9uZW50SWQsIGZhbHNlKTsKKwkJcmV0dXJuIGVpdGhlckNvbXBvbmVudDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENhcFJlcURlZiwgUmVzcG9uc2VGb3JtYXQ+IGdldFJlcXVpcmVtZW50c0FuZENhcGFiaWxpdGllcyhTdHJpbmcgY29tcG9uZW50SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImNyZWF0ZSBDb21wb25lbnQgSW5zdGFuY2UiLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJRWl0aGVyPENhcFJlcURlZiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJldDsKKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlRW51bSk7CisJCUVpdGhlcjxDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyhjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZUVudW0sIGZhbHNlLCB0cnVlKTsKKwkJaWYgKGVpdGhlckNvbXBvbmVudC5pc0xlZnQoKSkgeworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckNhcGFiaWxpdGllcyA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRDYXBhYmlsaXRpZXMoZWl0aGVyQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpLCBjb21wb25lbnRUeXBlRW51bS5nZXROb2RlVHlwZSgpLCBmYWxzZSk7CisJCQlpZiAoZWl0aGVyQ2FwYWJpbGl0aWVzLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCWVpdGhlclJldCA9IEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0gZWxzZSB7CisJCQkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXF1aXJlbWVudHMgPSBjb21wb25lbnRPcGVyYXRpb24uZ2V0UmVxdWlyZW1lbnRzKGVpdGhlckNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKSwgY29tcG9uZW50VHlwZUVudW0uZ2V0Tm9kZVR5cGUoKSwgZmFsc2UpOworCQkJCWlmIChlaXRoZXJSZXF1aXJlbWVudHMuaXNSaWdodCgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCQllaXRoZXJSZXQgPSBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVxdWlyZW1lbnRzID0gZWl0aGVyUmVxdWlyZW1lbnRzLmxlZnQoKS52YWx1ZSgpOworCQkJCQljYXBhYmlsaXRpZXMgPSBlaXRoZXJDYXBhYmlsaXRpZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCWVpdGhlclJldCA9IEVpdGhlci5sZWZ0KG5ldyBDYXBSZXFEZWYocmVxdWlyZW1lbnRzLCBjYXBhYmlsaXRpZXMpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXNvdXJjZU1pc3NpbmdFcnJvciwgImdldFJlcXVpcmVtZW50c0FuZENhcGFiaWxpdGllcyIsIGNvbXBvbmVudElkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUNvbXBvbmVudE1pc3NpbmdFcnJvcigiZ2V0UmVxdWlyZW1lbnRzQW5kQ2FwYWJpbGl0aWVzIiwgY29tcG9uZW50VHlwZUVudW0uZ2V0VmFsdWUoKSwgY29tcG9uZW50SWQpOworCQkJZWl0aGVyUmV0ID0gRWl0aGVyLnJpZ2h0KGVpdGhlckNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJcmV0dXJuIGVpdGhlclJldDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50PiwgUmVzcG9uc2VGb3JtYXQ+IGdldExhdGVzdFZlcnNpb25Ob3RBYnN0cmFjdENvbXBvbmVudHMoYm9vbGVhbiBpc0Fic3RyYWN0QWJzdHJhY3QsIEhpZ2hlc3RGaWx0ZXJFbnVtIGhpZ2hlc3RGaWx0ZXIsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTdHJpbmcgaW50ZXJuYWxDb21wb25lbnRUeXBlLCBMaXN0PFN0cmluZz4gY29tcG9uZW50VWlkcywKKwkJCVN0cmluZyB1c2VySWQpIHsKKworCQlsb25nIHN0YXJ0VXNlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZ2V0IExhdGVzdCBWZXJzaW9uIE5vdCBBYnN0cmFjdCBDb21wb25lbnRzIiwgZmFsc2UpOworCQlsb25nIGVuZFVzZXIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJbG9nLmRlYnVnKCJBY3RpdmF0aW9uIHRpbWUgb2YgZ2V0IHVzZXIge30gbXMiLCAoZW5kVXNlciAtIHN0YXJ0VXNlcikpOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJaWYgKHJlc3AuaXNMZWZ0KCkpIHsKKworCQkJTGlzdDxDb21wb25lbnQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50PigpOworCQkJU2V0PFN0cmluZz4gbm9uUHJvY2Vzc2VzQ29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJCW5vblByb2Nlc3Nlc0NvbXBvbmVudHMuYWRkQWxsKGNvbXBvbmVudFVpZHMpOworCisJCQlsb25nIHN0YXJ0R2V0Q29tcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJLy8gUmVhZCBjb21wb25lbnRzIGZyb20gY2FjaGUKKwkJCVNldDxTdHJpbmc+IGZpbHRlcmVkQ29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJCWZpbHRlcmVkQ29tcG9uZW50cy5hZGRBbGwoY29tcG9uZW50VWlkcyk7CisKKwkJCUVpdGhlcjxJbW11dGFibGVUcmlwbGU8TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiwgQWN0aW9uU3RhdHVzPiBhbGxQYXJ0aWFsQ29tcG9uZW50cyA9IGNvbXBvbmVudENhY2hlLmdldENvbXBvbmVudHNGb3JMZWZ0UGFuZWwoY29tcG9uZW50VHlwZUVudW0sIGludGVybmFsQ29tcG9uZW50VHlwZSwgZmlsdGVyZWRDb21wb25lbnRzKTsKKworCQkJaWYgKGFsbFBhcnRpYWxDb21wb25lbnRzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50cyB3YXMgbm90IGZldGNoZWQgZnJvbSBjYWNoZS4gU3RhdHVzIGlzIHt9IiwgYWxsUGFydGlhbENvbXBvbmVudHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJSW1tdXRhYmxlVHJpcGxlPExpc3Q8Q29tcG9uZW50PiwgTGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4gaW1tdXRhYmxlVHJpcGxlID0gYWxsUGFydGlhbENvbXBvbmVudHMubGVmdCgpLnZhbHVlKCk7CisJCQkJTGlzdDxDb21wb25lbnQ+IHByb2Nlc3NlZENvbXBvbmVudHMgPSBpbW11dGFibGVUcmlwbGUubGVmdDsKKwkJCQlpZiAocHJvY2Vzc2VkQ29tcG9uZW50cyAhPSBudWxsKSB7CisJCQkJCXJlc3VsdC5hZGRBbGwocHJvY2Vzc2VkQ29tcG9uZW50cyk7CisJCQkJfQorCQkJCUxpc3Q8Q29tcG9uZW50PiBkaXJ0eUNvbXBvbmVudHMgPSBpbW11dGFibGVUcmlwbGUubWlkZGxlOworCQkJCWlmIChkaXJ0eUNvbXBvbmVudHMgIT0gbnVsbCkgeworCQkJCQlyZXN1bHQuYWRkQWxsKGRpcnR5Q29tcG9uZW50cyk7CisJCQkJfQorCisJCQkJU2V0PFN0cmluZz4gbm9uUHJvY2Vzc2VzQ29tcG9uZW50c0Zyb21DYWNoZSA9IGltbXV0YWJsZVRyaXBsZS5yaWdodDsKKwkJCQlub25Qcm9jZXNzZXNDb21wb25lbnRzID0gbm9uUHJvY2Vzc2VzQ29tcG9uZW50c0Zyb21DYWNoZTsKKwkJCX0KKwkJCWxvbmcgZW5kR2V0Q29tcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJbG9nLmRlYnVnKCJBY3RpdmF0aW9uIHRpbWUgb2YgZ2V0IENvbXAgZnJvbSBjYWNoZSB7fSBtcyIsIChlbmRHZXRDb21wIC0gc3RhcnRHZXRDb21wKSk7CisKKwkJCS8vIEZlY3RoIG5vbiBjYWNoZWQgY29tcG9uZW50cworCQkJTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNVaWRUb0ZldGNoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQljb21wb25lbnRzVWlkVG9GZXRjaC5hZGRBbGwobm9uUHJvY2Vzc2VzQ29tcG9uZW50cyk7CisKKwkJCWxvbmcgc3RhcnRHZXRDb21wRnJvbUdyYXBoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlpZiAoY29tcG9uZW50c1VpZFRvRmV0Y2guc2l6ZSgpID4gMCkgeworCQkJCWxvZy5kZWJ1ZygiTnVtYmVyIG9mIENvbXBvbmVudHMgdG8gZmV0Y2ggZnJvbSBncmFwaCBpcyB7fSIsIGNvbXBvbmVudHNVaWRUb0ZldGNoLnNpemUoKSk7CisJCQkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlRW51bSk7CisJCQkJQm9vbGVhbiBpc0hpZ2hlc3QgPSBpc0hpZ2hlc3QoaGlnaGVzdEZpbHRlcik7CisJCQkJRWl0aGVyPExpc3Q8Q29tcG9uZW50PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbm9uQ2hlY2tvdXRDb21wUmVzcG9uc2UgPSBjb21wb25lbnRPcGVyYXRpb24uZ2V0TGF0ZXN0VmVyc2lvbk5vdEFic3RyYWN0Q29tcG9uZW50cyhpc0Fic3RyYWN0QWJzdHJhY3QsIGlzSGlnaGVzdCwgY29tcG9uZW50VHlwZUVudW0sIGludGVybmFsQ29tcG9uZW50VHlwZSwgY29tcG9uZW50c1VpZFRvRmV0Y2gpOworCisJCQkJaWYgKG5vbkNoZWNrb3V0Q29tcFJlc3BvbnNlLmlzTGVmdCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiUmV0cml2ZWQgUmVzb3VyY2Ugc3VjY2Vzc2Z1bGx5LiIpOworCQkJCQlyZXN1bHQuYWRkQWxsKG5vbkNoZWNrb3V0Q29tcFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uobm9uQ2hlY2tvdXRDb21wUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJfQorCQkJfQorCQkJbG9uZyBlbmRHZXRDb21wRnJvbUdyYXBoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb2cuZGVidWcoIkFjdGl2YXRpb24gdGltZSBvZiBnZXQgQ29tcCBmcm9tIGdyYXBoIHt9IG1zIiwgKGVuZEdldENvbXBGcm9tR3JhcGggLSBzdGFydEdldENvbXBGcm9tR3JhcGgpKTsKKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQlyZXNwb25zZUZvcm1hdCA9IHJlc3AucmlnaHQoKS52YWx1ZSgpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGlzSGlnaGVzdChIaWdoZXN0RmlsdGVyRW51bSBoaWdoZXN0RmlsdGVyKSB7CisJCUJvb2xlYW4gaXNIaWdoZXN0ID0gbnVsbDsKKwkJc3dpdGNoIChoaWdoZXN0RmlsdGVyKSB7CisJCWNhc2UgQUxMOgorCQkJYnJlYWs7CisJCWNhc2UgSElHSEVTVF9PTkxZOgorCQkJaXNIaWdoZXN0ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIE5PTl9ISUdIRVNUX09OTFk6CisJCQlpc0hpZ2hlc3QgPSBmYWxzZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIGlzSGlnaGVzdDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4sIFJlc3BvbnNlRm9ybWF0PiBnZXRMYXRlc3RWZXJzaW9uTm90QWJzdHJhY3RDb21wb25lbnRzVWlkT25seShib29sZWFuIGlzQWJzdHJhY3RBYnN0cmFjdCwgSGlnaGVzdEZpbHRlckVudW0gaGlnaGVzdEZpbHRlciwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyBpbnRlcm5hbENvbXBvbmVudFR5cGUsIFN0cmluZyB1c2VySWQpIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBMYXRlc3QgVmVyc2lvbiBOb3QgQWJzdHJhY3QgQ29tcG9uZW50cyIsIGZhbHNlKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCWlmIChyZXNwLmlzTGVmdCgpKSB7CisKKwkJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29tcG9uZW50VHlwZUVudW0pOworCQkJQm9vbGVhbiBpc0hpZ2hlc3QgPSBpc0hpZ2hlc3QoaGlnaGVzdEZpbHRlcik7CisJCQlFaXRoZXI8Q29sbGVjdGlvbjxDb21wb25lbnRNZXRhZGF0YURhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBub25DaGVja291dENvbXBSZXNwb25zZSA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRMYXRlc3RWZXJzaW9uTm90QWJzdHJhY3RDb21wb25lbnRzTWV0YWRhdGFPbmx5KGlzQWJzdHJhY3RBYnN0cmFjdCwgaXNIaWdoZXN0LCBjb21wb25lbnRUeXBlRW51bSwgaW50ZXJuYWxDb21wb25lbnRUeXBlKTsKKworCQkJaWYgKG5vbkNoZWNrb3V0Q29tcFJlc3BvbnNlLmlzTGVmdCgpKSB7CisJCQkJbG9nLmRlYnVnKCJSZXRyaXZlZCBSZXNvdXJjZSBzdWNjZXNzZnVsbHkuIik7CisJCQkJTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJCS8vIE1hcDxTdHJpbmcsU3RyaW5nPnJlc01hcCA9CisJCQkJLy8gbm9uQ2hlY2tvdXRDb21wUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkuc3RyZWFtKCkuY29sbGVjdCgpCisJCQkJLy8gLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcCgKKwkJCQkvLyBwIC0+IHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCQkJLy8gcC0+IHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSkpOworCisJCQkJcmVzID0gbm9uQ2hlY2tvdXRDb21wUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkuc3RyZWFtKCkubWFwKHAgLT4geworCQkJCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJCW1hcC5wdXQoInVpZCIsIHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCkpOworCQkJCQltYXAucHV0KCJ2ZXJzaW9uIiwgcC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKTsKKwkJCQkJTG9uZyBsYXN0VXBkYXRlRGF0ZSA9IHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldExhc3RVcGRhdGVEYXRlKCk7CisJCQkJCVN0cmluZyBsYXN0VXBkYXRlRGF0ZVN0ciA9IGxhc3RVcGRhdGVEYXRlICE9IG51bGwgPyBTdHJpbmcudmFsdWVPZihsYXN0VXBkYXRlRGF0ZS5sb25nVmFsdWUoKSkgOiAiMCI7CisJCQkJCW1hcC5wdXQoInRpbWVzdGFtcCIsIGxhc3RVcGRhdGVEYXRlU3RyKTsKKwkJCQkJcmV0dXJuIG1hcDsKKwkJCQl9KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlcyk7CisJCQl9CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uobm9uQ2hlY2tvdXRDb21wUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0gZWxzZSB7CisJCQlyZXNwb25zZUZvcm1hdCA9IHJlc3AucmlnaHQoKS52YWx1ZSgpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVwbG95bWVudEFydGlmYWN0c1BsYWNlSG9sZGVyKENvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgdXNlcikgeworCisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FBcnRpZmFjdHNQbGFjZUhvbGRlcnMoQ29tcG9uZW50IGNvbXBvbmVudCwgVXNlciB1c2VyKSB7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RNYXAgPSBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKTsKKwkJaWYgKGFydGlmYWN0TWFwID09IG51bGwpIHsKKwkJCWFydGlmYWN0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KCk7CisJCX0KKwkJU3RyaW5nIGNvbXBvbmVudFVuaXF1ZUlkID0gY29tcG9uZW50LmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyBjb21wb25lbnRTeXN0ZW1OYW1lID0gY29tcG9uZW50LmdldFN5c3RlbU5hbWUoKTsKKwkJU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZhbHVlKCkudG9Mb3dlckNhc2UoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUFydGlmYWN0cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFRvc2NhQXJ0aWZhY3RzKCk7CisKKwkJaWYgKHRvc2NhQXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGFydGlmYWN0SW5mb01hcCA6IHRvc2NhQXJ0aWZhY3RzLmVudHJ5U2V0KCkpIHsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFydGlmYWN0SW5mbyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBhcnRpZmFjdEluZm9NYXAuZ2V0VmFsdWUoKTsKKwkJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5jcmVhdGVBcnRpZmFjdFBsYWNlSG9sZGVySW5mbyhjb21wb25lbnRVbmlxdWVJZCwgYXJ0aWZhY3RJbmZvTWFwLmdldEtleSgpLCBhcnRpZmFjdEluZm8sIHVzZXIsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5UT1NDQSk7CisJCQkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEFydGlmYWN0TmFtZShjb21wb25lbnRUeXBlICsgIi0iICsgY29tcG9uZW50U3lzdGVtTmFtZSArIGFydGlmYWN0SW5mby5nZXQoImFydGlmYWN0TmFtZSIpKTsKKwkJCQlhcnRpZmFjdE1hcC5wdXQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKSwgYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkJCX0KKwkJfQorCQljb21wb25lbnQuc2V0VG9zY2FBcnRpZmFjdHMoYXJ0aWZhY3RNYXApOworCX0KKworCXB1YmxpYyBFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHBvcHVsYXRlVG9zY2FBcnRpZmFjdHMoQ29tcG9uZW50IGNvbXBvbmVudCwgVXNlciB1c2VyLCBib29sZWFuIGlzSW5DZXJ0aWZpY2F0aW9uUmVxdWVzdCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBib29sZWFuIHNob3VsZExvY2spIHsKKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBnZW5lcmF0ZVRvc2NhUmVzID0gbnVsbDsKKwkJaWYgKGNvbXBvbmVudC5nZXRUb3NjYUFydGlmYWN0cygpICE9IG51bGwgJiYgIWNvbXBvbmVudC5nZXRUb3NjYUFydGlmYWN0cygpLmlzRW1wdHkoKSkgeworCQkJQXJ0aWZhY3REZWZpbml0aW9uIHRvc2NhQXJ0aWZhY3QgPSBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLlRPU0NBX1RFTVBMQVRFLmdldFR5cGUoKSkpLmZpbmRBbnkoKS5nZXQoKTsKKwkJCWdlbmVyYXRlVG9zY2FSZXMgPSBzYXZlVG9zY2FBcnRpZmFjdFBheWxvYWQodG9zY2FBcnRpZmFjdCwgY29tcG9uZW50LCB1c2VyLCBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24sIHRydWUpOworCQkJaWYgKGdlbmVyYXRlVG9zY2FSZXMuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGdlbmVyYXRlVG9zY2FSZXM7CisJCQl9CisJCQl0b3NjYUFydGlmYWN0ID0gY29tcG9uZW50LmdldFRvc2NhQXJ0aWZhY3RzKCkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRBcnRpZmFjdFR5cGUoKS5lcXVhbHMoQXJ0aWZhY3RUeXBlRW51bS5UT1NDQV9DU0FSLmdldFR5cGUoKSkpLmZpbmRBbnkoKS5nZXQoKTsKKwkJCWdlbmVyYXRlVG9zY2FSZXMgPSBzYXZlVG9zY2FBcnRpZmFjdFBheWxvYWQodG9zY2FBcnRpZmFjdCwgY29tcG9uZW50LCB1c2VyLCBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24sIHRydWUpOworCQl9CisJCS8vIFRPRE8gaWYgY3NhciBhcnRpZmFjdCBmYWlscyBkZWxldGUgdGVtcGxhdGUgYXJ0aWZhY3QKKwkJcmV0dXJuIGdlbmVyYXRlVG9zY2FSZXM7CisJfQorCisJcHVibGljIEVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gc2F2ZVRvc2NhQXJ0aWZhY3RQYXlsb2FkKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24sIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgdXNlciwgYm9vbGVhbiBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIGJvb2xlYW4gc2hvdWxkTG9jaywKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBmZXRjaFRlbXBsYXRlc0Zyb21EQikgeworCQlyZXR1cm4gYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5nZW5lcmF0ZUFuZFNhdmVUb3NjYUFydGlmYWN0KGFydGlmYWN0RGVmaW5pdGlvbiwgY29tcG9uZW50LCB1c2VyLCBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24sIGZldGNoVGVtcGxhdGVzRnJvbURCKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8U3RyaW5nLCBieXRlW10+LCBSZXNwb25zZUZvcm1hdD4gZ2V0VG9zY2FNb2RlbEJ5Q29tcG9uZW50VXVpZChDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgdXVpZCwgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbSkgeworCQkvLyBnZXQgaW5mbworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGUpOworCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBsYXRlc3RWZXJzaW9uID0gY29tcG9uZW50T3BlcmF0aW9uLmdldExhdGVzdENvbXBvbmVudEJ5VXVpZChjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCksIHV1aWQpOworCQlpZiAobGF0ZXN0VmVyc2lvbi5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShsYXRlc3RWZXJzaW9uLnJpZ2h0KCkudmFsdWUoKSwgY29tcG9uZW50VHlwZSkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZSk7CisKKwkJfQorCQlDb21wb25lbnQgY29tcG9uZW50ID0gbGF0ZXN0VmVyc2lvbi5sZWZ0KCkudmFsdWUoKTsKKwkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIGNvbXBvbmVudC5nZXROYW1lKCkpOworCQkvLyBUT0RPIHJlbW92ZSBhZnRlciBtaWdyYXRpb24gLSBoYW5kbGUgYXJ0aWZhY3Qgbm90IGZvdW5kKG5vCisJCS8vIHBsYWNlaG9sZGVyKQorCQlpZiAobnVsbCA9PSBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKSB8fCBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKS5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQsIEFydGlmYWN0VHlwZUVudW0uVE9TQ0FfQ1NBUi5uYW1lKCkpKTsKKwkJfQorCQlBcnRpZmFjdERlZmluaXRpb24gY3NhckFydGlmYWN0ID0gY29tcG9uZW50LmdldFRvc2NhQXJ0aWZhY3RzKCkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRBcnRpZmFjdFR5cGUoKS5lcXVhbHMoQXJ0aWZhY3RUeXBlRW51bS5UT1NDQV9DU0FSLmdldFR5cGUoKSkpLmZpbmRBbnkoKS5nZXQoKTsKKwkJcmV0dXJuIGFydGlmYWN0c0J1c2luZXNzTG9naWMuaGFuZGxlRG93bmxvYWRUb3NjYU1vZGVsUmVxdWVzdChjb21wb25lbnQsIGNzYXJBcnRpZmFjdCwgdHJ1ZSwgZmFsc2UpOworCX0KKworCXByb3RlY3RlZCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIG1hcmtDb21wb25lbnRUb0RlbGV0ZShDb21wb25lbnQgY29tcG9uZW50KSB7CisKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisJCVN0cmluZyB1bmlxdWVJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQlpZiAoKGNvbXBvbmVudC5nZXRJc0RlbGV0ZWQoKSAhPSBudWxsKSAmJiAoY29tcG9uZW50LmdldElzRGVsZXRlZCgpID09IHRydWUpKSB7CisJCQlsb2cuaW5mbygiY29tcG9uZW50IHt9IGFscmVhZHkgbWFya2VkIGFzIGRlbGV0ZWQuIGlkPSB7fSwgdHlwZT17fSIsIGNvbXBvbmVudC5nZXROYW1lKCksIHVuaXF1ZUlkLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORDsKKwkJfQorCisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29tcG9uZW50VHlwZSk7CisKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbWFya1Jlc291cmNlVG9EZWxldGUgPSBjb21wb25lbnRPcGVyYXRpb24ubWFya0NvbXBvbmVudFRvRGVsZXRlKGNvbXBvbmVudCwgdHJ1ZSk7CisJCWlmIChtYXJrUmVzb3VyY2VUb0RlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gbWFya1Jlc291cmNlVG9EZWxldGUucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gbWFyayBjb21wb25lbnQge30gb2YgdHlwZSB7fSBmb3IgZGVsZXRlLiBlcnJvciA9IHt9IiwgdW5pcXVlSWQsIGNvbXBvbmVudFR5cGUsIHJlc3VsdCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQge30gIG9mIHR5cGUge30gd2FzIG1hcmtlZCBhcyBkZWxldGVkIiwgdW5pcXVlSWQsIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZURlc2NyaXB0aW9uKFVzZXIgdXNlciwgQ29tcG9uZW50IGN1cnJlbnRDb21wb25lbnQsIENvbXBvbmVudCB1cGRhdGVkQ29tcG9uZW50LCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkYXRpbmdBY3Rpb24pIHsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uVXBkYXRlZCA9IHVwZGF0ZWRDb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uQ3VycmVudCA9IGN1cnJlbnRDb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKTsKKwkJaWYgKGRlc2NyaXB0aW9uVXBkYXRlZCAhPSBudWxsICYmICFkZXNjcmlwdGlvbkN1cnJlbnQuZXF1YWxzKGRlc2NyaXB0aW9uVXBkYXRlZCkpIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXNjcmlwdGlvblJlc3BvbnNlID0gdmFsaWRhdGVEZXNjcmlwdGlvbkFuZENsZWFudXAodXNlciwgdXBkYXRlZENvbXBvbmVudCwgYXVkYXRpbmdBY3Rpb24pOworCQkJaWYgKHZhbGlkYXRlRGVzY3JpcHRpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnMgPSB2YWxpZGF0ZURlc2NyaXB0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zKTsKKwkJCX0KKwkJCWN1cnJlbnRDb21wb25lbnQuc2V0RGVzY3JpcHRpb24odXBkYXRlZENvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRVcGRhdGVQcm9qZWN0Q29kZShVc2VyIHVzZXIsIENvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LCBDb21wb25lbnQgdXBkYXRlZENvbXBvbmVudCkgeworCQlTdHJpbmcgcHJvamVjdENvZGVVcGRhdGVkID0gdXBkYXRlZENvbXBvbmVudC5nZXRQcm9qZWN0Q29kZSgpOworCQlTdHJpbmcgcHJvamVjdENvZGVDdXJyZW50ID0gY3VycmVudENvbXBvbmVudC5nZXRQcm9qZWN0Q29kZSgpOworCQlpZiAocHJvamVjdENvZGVVcGRhdGVkICE9IG51bGwgJiYgIXByb2plY3RDb2RlQ3VycmVudC5lcXVhbHMocHJvamVjdENvZGVVcGRhdGVkKSkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0UHJvamVjdENvZGVSZXNwb25zZSA9IHZhbGlkYXRlUHJvamVjdENvZGUodXNlciwgdXBkYXRlZENvbXBvbmVudCwgbnVsbCk7CisJCQlpZiAodmFsaWRhdFByb2plY3RDb2RlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdFByb2plY3RDb2RlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zKTsKKwkJCX0KKwkJCWN1cnJlbnRDb21wb25lbnQuc2V0UHJvamVjdENvZGUodXBkYXRlZENvbXBvbmVudC5nZXRQcm9qZWN0Q29kZSgpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRVcGRhdGVJY29uKFVzZXIgdXNlciwgQ29tcG9uZW50IGN1cnJlbnRDb21wb25lbnQsIENvbXBvbmVudCB1cGRhdGVkQ29tcG9uZW50LCBib29sZWFuIGhhc0JlZW5DZXJ0aWZpZWQpIHsKKwkJU3RyaW5nIGljb25VcGRhdGVkID0gdXBkYXRlZENvbXBvbmVudC5nZXRJY29uKCk7CisJCVN0cmluZyBpY29uQ3VycmVudCA9IGN1cnJlbnRDb21wb25lbnQuZ2V0SWNvbigpOworCQlpZiAoaWNvblVwZGF0ZWQgIT0gbnVsbCAmJiAhaWNvbkN1cnJlbnQuZXF1YWxzKGljb25VcGRhdGVkKSkgeworCQkJaWYgKCFoYXNCZWVuQ2VydGlmaWVkKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0SWNvblJlc3BvbnNlID0gdmFsaWRhdGVJY29uKHVzZXIsIHVwZGF0ZWRDb21wb25lbnQsIG51bGwpOworCQkJCWlmICh2YWxpZGF0SWNvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnMgPSB2YWxpZGF0SWNvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnMpOworCQkJCX0KKwkJCQljdXJyZW50Q29tcG9uZW50LnNldEljb24odXBkYXRlZENvbXBvbmVudC5nZXRJY29uKCkpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuaW5mbygiaWNvbiB7fSBjYW5ub3QgYmUgdXBkYXRlZCBvbmNlIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gY2VydGlmaWVkIG9uY2UuIiwgaWNvblVwZGF0ZWQpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9QQVJBTUVURVJfQ0FOTk9UX0JFX0NIQU5HRUQsICJJY29uIiwgY3VycmVudENvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlTWFya2VkQ29tcG9uZW50cyhDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisKKwkJTGlzdDxTdHJpbmc+IGRlbGV0ZWRDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWxvZy50cmFjZSgic3RhcnQgZGVsZXRlTWFya2VkQ29tcG9uZW50cyIpOworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGUpOworCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZXNUb0RlbGV0ZSA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRBbGxDb21wb25lbnRzTWFya2VkRm9yRGVsZXRpb24oKTsKKwkJaWYgKHJlc291cmNlc1RvRGVsZXRlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc291cmNlc1RvRGVsZXRlLnJpZ2h0KCkudmFsdWUoKSwgY29tcG9uZW50VHlwZSkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlmb3IgKFN0cmluZyByZXNvdXJjZVRvRGVsZXRlIDogcmVzb3VyY2VzVG9EZWxldGUubGVmdCgpLnZhbHVlKCkpIHsKKworCQkJRWl0aGVyPFN0cmluZywgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZU1hcmtlZFJlc291cmNlID0gZGVsZXRlTWFya2VkQ29tcG9uZW50KHJlc291cmNlVG9EZWxldGUsIGNvbXBvbmVudFR5cGUpOworCQkJaWYgKGRlbGV0ZU1hcmtlZFJlc291cmNlLmlzTGVmdCgpKSB7CisJCQkJZGVsZXRlZENvbXBvbmVudHMuYWRkKGRlbGV0ZU1hcmtlZFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCisJCWxvZy50cmFjZSgiZW5kIGRlbGV0ZU1hcmtlZENvbXBvbmVudHMiKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRlbGV0ZWRDb21wb25lbnRzKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVNYXJrZWRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudFRvRGVsZXRlLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisKKwkJRWl0aGVyPFN0cmluZywgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29tcG9uZW50VHlwZSk7CisJCU5vZGVUeXBlRW51bSBjb21wTm9kZVR5cGUgPSBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgbG9ja1Jlc3VsdCA9IGdyYXBoTG9ja09wZXJhdGlvbi5sb2NrQ29tcG9uZW50KGNvbXBvbmVudFRvRGVsZXRlLCBjb21wTm9kZVR5cGUpOworCQlpZiAoIWxvY2tSZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3IsICJEZWxldGUgbWFya2VkIGNvbXBvbmVudCIpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gbG9jayBjb21wb25lbnQge30uIGVycm9yIC0ge30iLCBjb21wb25lbnRUb0RlbGV0ZSwgbG9ja1Jlc3VsdCk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXRyeSB7CisKKwkJCS8vIGNoZWNrIGlmIHJlc291cmNlIGhhcyByZWxhdGlvbnMKKwkJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc1Jlc291cmNlSW5Vc2UgPSBjb21wb25lbnRPcGVyYXRpb24uaXNDb21wb25lbnRJblVzZShjb21wb25lbnRUb0RlbGV0ZSk7CisJCQlpZiAoaXNSZXNvdXJjZUluVXNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5pbmZvKCJkZWxldGVNYXJrZWRSZXNvdXJjZSAtIGZhaWxlZCB0byBmaW5kIHJlbGF0aW9ucyB0byByZXNvdXJjZS4gaWQgPSB7fSwgdHlwZSA9IHt9LCBlcnJvciA9IHt9IiwgY29tcG9uZW50VG9EZWxldGUsIGNvbXBvbmVudFR5cGUsIGlzUmVzb3VyY2VJblVzZS5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlpZiAoaXNSZXNvdXJjZUluVXNlLmlzTGVmdCgpICYmIGlzUmVzb3VyY2VJblVzZS5sZWZ0KCkudmFsdWUoKSA9PSBmYWxzZSkgeworCisJCQkJLy8gZGVsZXRlIHJlc291cmNlIGFuZCBpdHMgYXJ0aWZhY3RzIGluIG9uZSB0cmFuc2FjdGlvbgorCQkJCUVpdGhlcjxMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0c1JlcyA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRDb21wb25lbnRBcnRpZmFjdHNGb3JEZWxldGUoY29tcG9uZW50VG9EZWxldGUsIGNvbXBOb2RlVHlwZSwgdHJ1ZSk7CisJCQkJaWYgKGFydGlmYWN0c1Jlcy5pc1JpZ2h0KCkgJiYgIWFydGlmYWN0c1Jlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCQlsb2cuaW5mbygiZmFpbGVkIHRvIGNoZWNrIGFydGlmYWN0cyBmb3IgY29tcG9uZW50IG5vZGUuIGlkID0ge30sIHR5cGUgPSB7fSwgZXJyb3IgPSB7fSIsIGNvbXBvbmVudFRvRGVsZXRlLCBjb21wb25lbnRUeXBlLCBhcnRpZmFjdHNSZXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJaWYgKGFydGlmYWN0c1Jlcy5pc0xlZnQoKSkgeworCQkJCQlhcnRpZmFjdHNUb0RlbGV0ZSA9IGFydGlmYWN0c1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQl9CisKKwkJCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDb21wb25lbnRSZXMgPSBjb21wb25lbnRPcGVyYXRpb24uZGVsZXRlQ29tcG9uZW50KGNvbXBvbmVudFRvRGVsZXRlLCB0cnVlKTsKKwkJCQlpZiAoZGVsZXRlQ29tcG9uZW50UmVzLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuaW5mbygiZmFpbGVkIHRvIGRlbGV0ZSBjb21wb25lbnQuIGlkID0ge30sIHR5cGUgPSB7fSwgZXJyb3IgPSB7fSIsIGNvbXBvbmVudFRvRGVsZXRlLCBjb21wb25lbnRUeXBlLCBkZWxldGVDb21wb25lbnRSZXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZGVsZXRlQ29tcG9uZW50UmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgY29tcG9uZW50VG9EZWxldGUpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy50cmFjZSgiY29tcG9uZW50IHdhcyBkZWxldGVkLCBpZCA9IHt9LCB0eXBlID0ge30iLCBjb21wb25lbnRUb0RlbGV0ZSwgY29tcG9uZW50VHlwZSk7CisJCQkJCS8vIGRlbGV0ZSByZWxhdGVkIGFydGlmYWN0cworCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUZyb21Fc1JlcyA9IGFydGlmYWN0c0J1c2luZXNzTG9naWMuZGVsZXRlQWxsQ29tcG9uZW50QXJ0aWZhY3RzSWZOb3RPbkdyYXBoKGFydGlmYWN0c1RvRGVsZXRlKTsKKwkJCQkJaWYgKCFkZWxldGVGcm9tRXNSZXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGRlbGV0ZUZyb21Fc1Jlcyk7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGNvbXBvbmVudFRvRGVsZXRlKTsKKwkJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJCWxvZy5kZWJ1ZygiY29tcG9uZW50IGFuZCBhbGwgaXRzIGFydGlmYWN0cyB3ZXJlIGRlbGV0ZWQsIGlkID0ge30sIHR5cGUgPSB7fSIsIGNvbXBvbmVudFRvRGVsZXRlLCBjb21wb25lbnRUeXBlKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoY29tcG9uZW50VG9EZWxldGUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gcmVzb3VyY2UgaW4gdXNlCisJCQkJbG9nLmRlYnVnKCJjb21wb25lbnRpcyBtYXJrZWQgZm9yIGRlbGV0ZSBidXQgc3RpbGwgaW4gdXNlLCBpZCA9IHt9LCB0eXBlID0ge30iLCBjb21wb25lbnRUb0RlbGV0ZSwgY29tcG9uZW50VHlwZSk7CisJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTjsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGNvbXBvbmVudFRvRGVsZXRlKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiZGVsZXRlIG1hcmtlZCBjb21wb25lbnQiKTsKKwkJCQlsb2cuZGVidWcoIm9wZXJhdGlvbiBmYWlsZWQuIGRvIHJvbGxiYWNrIik7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1Zygib3BlcmF0aW9uIHN1Y2Nlc3MuIGRvIGNvbW1pdCIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoY29tcG9uZW50VG9EZWxldGUsIGNvbXBOb2RlVHlwZSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Db21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllZjZmNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSwxNjYxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5DcmVhdGVBbmRBc3NvdGlhdGVJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VJbnB1dDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudFBhcmFtZXRlcnNWaWV3OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNvbXBvbmVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Db21wb25lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkdyb3VwT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLnV0aWxzLkNvbXBvbmVudFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5HZW5lcmFsVXRpbGl0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgZXh0ZW5kcyBCYXNlQnVzaW5lc3NMb2dpYyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfUExBQ0VIT0xERVJfRklMRV9FWFRFTlNJT04gPSAiZmlsZUV4dGVuc2lvbiI7CisKKwlzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVRfRU5WX05BTUUgPSAiaGVhdEVudiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVRfRU5WX1NVRkZJWCA9ICJlbnYiOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgSUNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uIGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0QnVzaW5lc3NMb2dpYzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEdyb3VwT3BlcmF0aW9uIGdyb3VwT3BlcmF0aW9uOworCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYygpIHsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFBhcmFtLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsIFN0cmluZyB1c2VySWQsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKwkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckNvbXBvbmVudFBhcmFtLCBjb250YWluZXJDb21wb25lbnRJZCwgdXNlcklkLCByZXNvdXJjZUluc3RhbmNlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFBhcmFtLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsIFN0cmluZyB1c2VySWQsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaywKKwkJCWJvb2xlYW4gY3JlYXRlTmV3VHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiY3JlYXRlIENvbXBvbmVudCBJbnN0YW5jZSIsIGluVHJhbnNhY3Rpb24pOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVZhbGlkSnNvbiA9IHZhbGlkYXRlSnNvbkJvZHkocmVzb3VyY2VJbnN0YW5jZSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQlpZiAodmFsaWRhdGVWYWxpZEpzb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlVmFsaWRKc29uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8Q29tcG9uZW50VHlwZUVudW0sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudFR5cGUgPSB2YWxpZGF0ZUNvbXBvbmVudFR5cGUoY29udGFpbmVyQ29tcG9uZW50UGFyYW0pOworCQlpZiAodmFsaWRhdGVDb21wb25lbnRUeXBlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudFR5cGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWZpbmFsIENvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBvbmVudFR5cGUgPSB2YWxpZGF0ZUNvbXBvbmVudFR5cGUubGVmdCgpLnZhbHVlKCk7CisJCWZpbmFsIENvbXBvbmVudE9wZXJhdGlvbiBjb250YWluZXJPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisKKwkJRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzID0gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGluVHJhbnNhY3Rpb24sIGNyZWF0ZU5ld1RyYW5zYWN0aW9uKTsKKwkJaWYgKHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb250YWluZXJDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQWxsb3dlZFRvQ29udGFpbkNvbXBJbnN0YW5jZXMgPSB2YWxpZGF0ZUFsbG93ZWRUb0NvbnRhaW5Db21wSW5zdGFuY2VzKGNvbnRhaW5lckNvbXBvbmVudCk7CisJCWlmICh2YWxpZGF0ZUFsbG93ZWRUb0NvbnRhaW5Db21wSW5zdGFuY2VzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUFsbG93ZWRUb0NvbnRhaW5Db21wSW5zdGFuY2VzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50ID0gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQoY29udGFpbmVyQ29tcG9uZW50LCB1c2VySWQpOworCQlpZiAodmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJaWYgKHJlc291cmNlSW5zdGFuY2UgIT0gbnVsbCAmJiBjb250YWluZXJDb21wb25lbnRUeXBlICE9IG51bGwpIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZVBhcmVudFN0YXRlID0gdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZVBhcmVudFN0YXRlKGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIHJlc291cmNlSW5zdGFuY2UpOworCQkJaWYgKHZhbGlkYXRlQ29tcG9uZW50SW5zdGFuY2VQYXJlbnRTdGF0ZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50SW5zdGFuY2VQYXJlbnRTdGF0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCWlmIChuZWVkTG9jaykgeworCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KGNvbnRhaW5lckNvbXBvbmVudCwgImNyZWF0ZUNvbXBvbmVudEluc3RhbmNlIik7CisKKwkJCWlmIChsb2NrQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJUcnkgdG8gY3JlYXRlIGVudHJ5IG9uIGdyYXBoIik7CisJCQlFaXRoZXI8Q29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzb3VyY2VOYW1lID0gZ2V0T3JpZ2luQ29tcG9uZW50TmFtZUZyb21Db21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlLCBpblRyYW5zYWN0aW9uKTsKKworCQkJaWYgKGVpdGhlclJlc291cmNlTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChlaXRoZXJSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0T3A7CisJCQl9CisJCQlDb21wb25lbnQgb3JpZ0NvbXBvbmVudCA9IGVpdGhlclJlc291cmNlTmFtZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJcmVzdWx0T3AgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZU9uR3JhcGgoY29udGFpbmVyQ29tcG9uZW50LCBvcmlnQ29tcG9uZW50LCByZXNvdXJjZUluc3RhbmNlLCB1c2VySWQsIGNvbnRhaW5lck9wZXJhdGlvbiwgaW5UcmFuc2FjdGlvbik7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChuZWVkTG9jaykKKwkJCQl1bmxvY2tDb21wb25lbnQocmVzdWx0T3AsIGNvbnRhaW5lckNvbXBvbmVudCk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPENyZWF0ZUFuZEFzc290aWF0ZUluZm8sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVBbmRBc3NvY2lhdGVSSVRvUkkoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFBhcmFtLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsIFN0cmluZyB1c2VySWQsIENyZWF0ZUFuZEFzc290aWF0ZUluZm8gY3JlYXRlQW5kQXNzb3RpYXRlSW5mbykgeworCisJCUVpdGhlcjxDcmVhdGVBbmRBc3NvdGlhdGVJbmZvLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCQlDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlID0gY3JlYXRlQW5kQXNzb3RpYXRlSW5mby5nZXROb2RlKCk7CisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBhc3NvY2lhdGlvbkluZm8gPSBjcmVhdGVBbmRBc3NvdGlhdGVJbmZvLmdldEFzc29jaWF0ZSgpOworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJjcmVhdGUgQW5kIEFzc29jaWF0ZSBSSSBUbyBSSSIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUVpdGhlcjxDb21wb25lbnRUeXBlRW51bSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50VHlwZSA9IHZhbGlkYXRlQ29tcG9uZW50VHlwZShjb250YWluZXJDb21wb25lbnRQYXJhbSk7CisJCWlmICh2YWxpZGF0ZUNvbXBvbmVudFR5cGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50VHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJZmluYWwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSA9IHZhbGlkYXRlQ29tcG9uZW50VHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJZmluYWwgQ29tcG9uZW50T3BlcmF0aW9uIGNvbnRhaW5lck9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb250YWluZXJDb21wb25lbnRUeXBlKTsKKworCQlFaXRoZXI8b3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyhjb250YWluZXJDb21wb25lbnRJZCwgY29udGFpbmVyQ29tcG9uZW50VHlwZSwgZmFsc2UsIHRydWUpOworCQlpZiAodmFsaWRhdGVDb21wb25lbnRFeGlzdHMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbnRhaW5lckNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbGxvd2VkVG9Db250YWluQ29tcEluc3RhbmNlcyA9IHZhbGlkYXRlQWxsb3dlZFRvQ29udGFpbkNvbXBJbnN0YW5jZXMoY29udGFpbmVyQ29tcG9uZW50KTsKKwkJaWYgKHZhbGlkYXRlQWxsb3dlZFRvQ29udGFpbkNvbXBJbnN0YW5jZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQWxsb3dlZFRvQ29udGFpbkNvbXBJbnN0YW5jZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQgPSB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsIHVzZXJJZCk7CisJCWlmICh2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja0NvbXBvbmVudCA9IGxvY2tDb21wb25lbnQoY29udGFpbmVyQ29tcG9uZW50LCAiY3JlYXRlQW5kQXNzb2NpYXRlUklUb1JJIik7CisJCWlmIChsb2NrQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJUcnkgdG8gY3JlYXRlIGVudHJ5IG9uIGdyYXBoIik7CisJCQlOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUgPSBjb250YWluZXJDb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisJCQlFaXRoZXI8Q29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzb3VyY2VOYW1lID0gZ2V0T3JpZ2luQ29tcG9uZW50TmFtZUZyb21Db21wb25lbnRJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlLCB0cnVlKTsKKworCQkJaWYgKGVpdGhlclJlc291cmNlTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChlaXRoZXJSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0T3A7CisJCQl9CisJCQlDb21wb25lbnQgb3JpZ0NvbXBvbmVudCA9IGVpdGhlclJlc291cmNlTmFtZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VPbkdyYXBoKGNvbnRhaW5lckNvbXBvbmVudCwgb3JpZ0NvbXBvbmVudCwgcmVzb3VyY2VJbnN0YW5jZSwgdXNlcklkLCBjb250YWluZXJPcGVyYXRpb24sIHRydWUpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBjb250YWluZXJDb21wb25lbnRJZCk7CisJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdE9wOworCisJCQl9CisKKwkJCWxvZy5kZWJ1ZygiRW50aXR5IG9uIGdyYXBoIGlzIGNyZWF0ZWQuIik7CisJCQlDb21wb25lbnRJbnN0YW5jZSByZXNSZXNvdXJjZUluZm8gPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoYXNzb2NpYXRpb25JbmZvLmdldEZyb21Ob2RlKCkgPT0gbnVsbCB8fCBhc3NvY2lhdGlvbkluZm8uZ2V0RnJvbU5vZGUoKS5pc0VtcHR5KCkpIHsKKwkJCQlhc3NvY2lhdGlvbkluZm8uc2V0RnJvbU5vZGUocmVzUmVzb3VyY2VJbmZvLmdldFVuaXF1ZUlkKCkpOworCQkJfSBlbHNlIHsKKwkJCQlhc3NvY2lhdGlvbkluZm8uc2V0VG9Ob2RlKHJlc1Jlc291cmNlSW5mby5nZXRVbmlxdWVJZCgpKTsKKwkJCX0KKworCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiA9IGFzc29jaWF0aW9uSW5mbzsvLyBjcmVhdGVSZXF1aXJlbWVudENhcGFiaWxpdHlyZWxEZWYoYXNzb2NpYXRpb25JbmZvKTsKKworCQkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0UmVxQ2FwRGVmID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lck5vZGVUeXBlLCByZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIHRydWUpOworCQkJaWYgKHJlc3VsdFJlcUNhcERlZi5pc0xlZnQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRW50eSBvbiBncmFwaCBpcyBjcmVhdGVkLiIpOworCQkJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXNSZXFDYXBhYmlsaXR5UmVsRGVmID0gcmVzdWx0UmVxQ2FwRGVmLmxlZnQoKS52YWx1ZSgpOworCQkJCUNyZWF0ZUFuZEFzc290aWF0ZUluZm8gcmVzSW5mbyA9IG5ldyBDcmVhdGVBbmRBc3NvdGlhdGVJbmZvKHJlc1Jlc291cmNlSW5mbywgcmVzUmVxQ2FwYWJpbGl0eVJlbERlZik7CisJCQkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdChyZXNJbmZvKTsKKwkJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmluZm8oIkZhaWxlZCB0byBhc3NvY2lhdGUgbm9kZSB7fSB3aXRoIG5vZGUge30iLCBhc3NvY2lhdGlvbkluZm8uZ2V0RnJvbU5vZGUoKSwgYXNzb2NpYXRpb25JbmZvLmdldFRvTm9kZSgpKTsKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRGb3JSZXNvdXJjZUluc3RhbmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2UocmVzdWx0UmVxQ2FwRGVmLnJpZ2h0KCkudmFsdWUoKSwgdHJ1ZSksICIiLCBudWxsKSk7CisJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJfQorCisJCX0gZmluYWxseSB7CisJCQl1bmxvY2tDb21wb25lbnQocmVzdWx0T3AsIGNvbnRhaW5lckNvbXBvbmVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiBnZXRPcmlnaW5Db21wb25lbnROYW1lRnJvbUNvbXBvbmVudEluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3BvbnNlOworCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDb21wb25lbnQgPSBnZXRDb21wSW5zdE9yaWdpbkNvbXBvbmVudE9wZXJhdGlvbigpLmdldENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKSwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChlaXRoZXJDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgb3JpZ2luIGNvbXBvbmVudCB3aXRoIGlkIHt9IGZvciBjb21wb25lbnQgaW5zdGFuY2Uge30gIiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCksIGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJCQllaXRoZXJSZXNwb25zZSA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRGb3JSZXNvdXJjZUluc3RhbmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShlaXRoZXJDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSksICIiLCBudWxsKSk7CisJCX0gZWxzZSB7CisJCQllaXRoZXJSZXNwb25zZSA9IEVpdGhlci5sZWZ0KGVpdGhlckNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3BvbnNlOworCX0KKworCXByaXZhdGUgRWl0aGVyPFN0cmluZywgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZU5hbWVMb2dpYyhDb21wb25lbnQgb3JpZ0NvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIFN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgYm9vbGVhbiBpc0NyZWF0ZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXN1bHQ7CisJCWZpbmFsIENvbXBvbmVudE9wZXJhdGlvbiBjb250YWluZXJPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEluTnVtYmVyU3RhdHVzID0gY29udGFpbmVyT3BlcmF0aW9uLmluY3JlYXNlQW5kR2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyKGNvbnRhaW5lckNvbXBvbmVudElkLCB0cnVlKTsKKworCQlpZiAoY29tcG9uZW50SW5OdW1iZXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgY29tcG9uZW50IGluc3RhbmNlIG51bWJlciBmb3IgY29udGFpbmVyIGNvbXBvbmVudCB7fSAiLCBjb250YWluZXJDb21wb25lbnRJZCk7CisJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0Rm9yUmVzb3VyY2VJbnN0YW5jZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlKGNvbXBvbmVudEluTnVtYmVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSwgdHJ1ZSksICIiLCBudWxsKSk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgcmVzb3VyY2VJbk51bWJlciA9IGNvbXBvbmVudEluTnVtYmVyU3RhdHVzLmxlZnQoKS52YWx1ZSgpLnRvU3RyaW5nKCk7CisJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIubGVmdChyZXNvdXJjZUluTnVtYmVyKTsKKwkJfQorCisJCWlmIChlaXRoZXJSZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyU3BlY2lmaWNMb2dpYzsKKwkJCWlmIChpc0NyZWF0ZSkgeworCQkJCWVpdGhlclNwZWNpZmljTG9naWMgPSBoYW5kbGVOYW1lTG9naWNGb3JOZXdDb21wb25lbnRJbnN0YW5jZShvcmlnQ29tcG9uZW50LCBjb21wb25lbnRJbnN0YW5jZSwgZWl0aGVyUmVzdWx0LmxlZnQoKS52YWx1ZSgpLCBjb250YWluZXJDb21wb25lbnRUeXBlLCBpblRyYW5zYWN0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJZWl0aGVyU3BlY2lmaWNMb2dpYyA9IGhhbmRsZU5hbWVMb2dpY0ZvclVwZGF0aW5nQ29tcG9uZW50SW5zdGFuY2Uob3JpZ0NvbXBvbmVudCwgY29tcG9uZW50SW5zdGFuY2UsIGNvbXBvbmVudEluTnVtYmVyU3RhdHVzLCBjb250YWluZXJDb21wb25lbnRUeXBlLCBpblRyYW5zYWN0aW9uKTsKKwkJCX0KKwkJCWlmIChlaXRoZXJTcGVjaWZpY0xvZ2ljLmlzUmlnaHQoKSkgeworCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlaXRoZXJTcGVjaWZpY0xvZ2ljLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlTmFtZUxvZ2ljRm9yVXBkYXRpbmdDb21wb25lbnRJbnN0YW5jZShDb21wb25lbnQgb3JpZ0NvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRJbk51bWJlclN0YXR1cywKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQlpZiAoY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpID09IG51bGwgfHwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpLmlzRW1wdHkoKSkgeworCQkJaWYgKG9yaWdDb21wb25lbnQgPT0gbnVsbCkgeworCQkJCUVpdGhlcjxDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXNvdXJjZU5hbWUgPSBnZXRPcmlnaW5Db21wb25lbnROYW1lRnJvbUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlLCBpblRyYW5zYWN0aW9uKTsKKworCQkJCWlmIChlaXRoZXJSZXNvdXJjZU5hbWUuaXNSaWdodCgpKSB7CisJCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlaXRoZXJSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwkJCQl9CisJCQkJb3JpZ0NvbXBvbmVudCA9IGVpdGhlclJlc291cmNlTmFtZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSBvcmlnQ29tcG9uZW50LmdldE5hbWUoKTsKKwkJCQlTdHJpbmcgbG9naWNhbE5hbWUgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5jcmVhdGVDb21wb25lbnRJbnN0TG9naWNhbE5hbWUoY29tcG9uZW50SW5OdW1iZXJTdGF0dXMubGVmdCgpLnZhbHVlKCkudG9TdHJpbmcoKSwgcmVzb3VyY2VOYW1lKTsKKwkJCQljb21wb25lbnRJbnN0YW5jZS5zZXROYW1lKGxvZ2ljYWxOYW1lKTsKKwkJCQlpZiAoY29udGFpbmVyQ29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSkgeworCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgb3JpZ0NvbXBvbmVudDsKKwkJCQkJY29tcG9uZW50SW5zdGFuY2Uuc2V0VG9zY2FDb21wb25lbnROYW1lKHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQkJCX0KKworCQkJfQorCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZU5hbWUoY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpLCBjb21wb25lbnRJbnN0YW5jZSwgZmFsc2UpOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlaXRoZXJWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlTmFtZUxvZ2ljRm9yTmV3Q29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50IG9yaWdDb21wb25lbnQsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBTdHJpbmcgcmVzb3VyY2VJbk51bWJlciwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisKKwkJaWYgKG9yaWdDb21wb25lbnQgPT0gbnVsbCkgeworCQkJRWl0aGVyPENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc291cmNlTmFtZSA9IGdldE9yaWdpbkNvbXBvbmVudE5hbWVGcm9tQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2UsIGluVHJhbnNhY3Rpb24pOworCisJCQlpZiAoZWl0aGVyUmVzb3VyY2VOYW1lLmlzUmlnaHQoKSkgeworCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlaXRoZXJSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCQkJfQorCisJCQlvcmlnQ29tcG9uZW50ID0gZWl0aGVyUmVzb3VyY2VOYW1lLmxlZnQoKS52YWx1ZSgpOworCQl9CisKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9IG9yaWdDb21wb25lbnQuZ2V0TmFtZSgpOworCQljb21wb25lbnRJbnN0YW5jZS5zZXRDb21wb25lbnROYW1lKHJlc291cmNlTmFtZSk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkgPT0gbnVsbCB8fCBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkuaXNFbXB0eSgpKQorCQkJY29tcG9uZW50SW5zdGFuY2Uuc2V0TmFtZShyZXNvdXJjZU5hbWUpOworCQlTdHJpbmcgbG9naWNhbE5hbWUgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5jcmVhdGVDb21wb25lbnRJbnN0TG9naWNhbE5hbWUocmVzb3VyY2VJbk51bWJlciwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbXBvbmVudEluc3RhbmNlTmFtZShsb2dpY2FsTmFtZSwgY29tcG9uZW50SW5zdGFuY2UsIHRydWUpOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlaXRoZXJWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJaWYgKGNvbnRhaW5lckNvbXBvbmVudFR5cGUgPT0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpIHsKKwkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBvcmlnQ29tcG9uZW50OworCQkJY29tcG9uZW50SW5zdGFuY2Uuc2V0VG9zY2FDb21wb25lbnROYW1lKHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQl9CisKKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VPbkdyYXBoKFN0cmluZyBjb250YWluZXJDb21wb25lbnRQYXJhbSwgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbnRhaW5lckNvbXBvbmVudCwgQ29tcG9uZW50IG9yaWdDb21wb25lbnQsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBTdHJpbmcgdXNlcklkLAorCQkJYm9vbGVhbiBuZWVkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPENvbXBvbmVudFR5cGVFbnVtLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRUeXBlID0gdmFsaWRhdGVDb21wb25lbnRUeXBlKGNvbnRhaW5lckNvbXBvbmVudFBhcmFtKTsKKwkJaWYgKHZhbGlkYXRlQ29tcG9uZW50VHlwZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDb21wb25lbnRUeXBlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlmaW5hbCBDb21wb25lbnRUeXBlRW51bSBjb250YWluZXJDb21wb25lbnRUeXBlID0gdmFsaWRhdGVDb21wb25lbnRUeXBlLmxlZnQoKS52YWx1ZSgpOworCQlmaW5hbCBDb21wb25lbnRPcGVyYXRpb24gY29udGFpbmVyT3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHRPcCA9IG51bGw7CisJCWlmIChuZWVkTG9jaykgeworCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KGNvbnRhaW5lckNvbXBvbmVudCwgImNyZWF0ZUNvbXBvbmVudEluc3RhbmNlIik7CisKKwkJCWlmIChsb2NrQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCXRyeSB7CisJCQlyZXN1bHRPcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlT25HcmFwaChjb250YWluZXJDb21wb25lbnQsIG9yaWdDb21wb25lbnQsIGNvbXBvbmVudEluc3RhbmNlLCB1c2VySWQsIGNvbnRhaW5lck9wZXJhdGlvbiwgaW5UcmFuc2FjdGlvbik7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChuZWVkTG9jaykKKwkJCQl1bmxvY2tDb21wb25lbnQocmVzdWx0T3AsIGNvbnRhaW5lckNvbXBvbmVudCk7CisJCX0KKworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRFeGlzdGluZ0VudlZlcnNpb25zKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlKSB7CisJCWlmIChudWxsID09IGNvbXBvbmVudEluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLnZhbHVlcygpCisJCQkJLy9maWx0ZXIgZW52IGFydGlmYWN0cworCQkJCS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKSkpCisJCQkJLy9tYXAgbmFtZSB0byB2ZXJzaW9uIAorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoYSAtPiBhLmdldEFydGlmYWN0TmFtZSgpLCBhIC0+IGEuZ2V0QXJ0aWZhY3RWZXJzaW9uKCkpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlT25HcmFwaChvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50LCBDb21wb25lbnQgb3JpZ0NvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIFN0cmluZyB1c2VySWQsCisJCQlDb21wb25lbnRPcGVyYXRpb24gY29udGFpbmVyT3BlcmF0aW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3A7CisJCWJvb2xlYW4gbmFtZUFscmVhZHlFeGlzdCA9IHRydWU7CisJCVN0cmluZyByZXNvdXJjZUluTnVtYmVyID0gIiI7CisJCVN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCA9IGNvbnRhaW5lckNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQlDb21wb25lbnRUeXBlRW51bSBjb250YWluZXJDb21wb25lbnRUeXBlID0gY29udGFpbmVyQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlID0gY29udGFpbmVyQ29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpOworCQlOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSA9IGdldE5vZGVUeXBlT2ZDb21wb25lbnRJbnN0YW5jZU9yaWdpbigpOworCQl3aGlsZSAobmFtZUFscmVhZHlFeGlzdCkgeworCisJCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyTmFtZUxvZ2ljID0gaGFuZGxlTmFtZUxvZ2ljKG9yaWdDb21wb25lbnQsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXJDb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLCBjb250YWluZXJDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoZWl0aGVyTmFtZUxvZ2ljLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyTmFtZUxvZ2ljLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9IGVsc2UgeworCQkJCXJlc291cmNlSW5OdW1iZXIgPSBlaXRoZXJOYW1lTG9naWMubGVmdCgpLnZhbHVlKCk7CisJCQl9CisKKwkJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc05hbWVFeGlzdFN0YXR1cyA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmlzQ29tcG9uZW50SW5zdGFuY2VOYW1lRXhpc3QoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lck5vZGVUeXBlLCBudWxsLCBjb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJCWlmIChpc05hbWVFeGlzdFN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjaGVjayBpZiBjb21wb25lbnQgaW5zdGFuY2UgbmFtZSBleGlzdHMgZm9yIGNvbnRhaW5lciBjb21wb25lbnQge30iLCBjb250YWluZXJDb21wb25lbnRJZCk7CisKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX1JFTEFUSU9OX05PVF9GT1VORCwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpLCBjb250YWluZXJDb21wb25lbnRJZCkpOworCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCX0KKwkJCW5hbWVBbHJlYWR5RXhpc3QgPSBpc05hbWVFeGlzdFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQl9CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJDb21wb25lbnRJZCwgY29udGFpbmVyTm9kZVR5cGUsIHJlc291cmNlSW5OdW1iZXIsIGNvbXBvbmVudEluc3RhbmNlLCBjb21wSW5zdE5vZGVUeXBlLCBpblRyYW5zYWN0aW9uKTsKKworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGVudHJ5IG9uIGdyYXBoIGZvciBjb21wb25lbnQgaW5zdGFuY2Uge30iLCBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0Rm9yUmVzb3VyY2VJbnN0YW5jZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlKHJlc3VsdC5yaWdodCgpLnZhbHVlKCksIHRydWUpLCAiIiwgbnVsbCkpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9CisKKwkJbG9nLmRlYnVnKCJFbnRpdHkgb24gZ3JhcGggaXMgY3JlYXRlZC4iKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcEluc3QgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBleGlzdGluZ0VudlZlcnNpb25zID0gZ2V0RXhpc3RpbmdFbnZWZXJzaW9ucyhjb21wb25lbnRJbnN0YW5jZSk7CisJCUVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBhZGRDb21wb25lbnRJbnN0YW5jZUFydGlmYWN0cyA9IGFkZENvbXBvbmVudEluc3RhbmNlQXJ0aWZhY3RzKGNvbnRhaW5lckNvbXBvbmVudCwgY29tcEluc3QsIHVzZXJJZCwgaW5UcmFuc2FjdGlvbiwgZXhpc3RpbmdFbnZWZXJzaW9ucyk7CisJCWlmIChhZGRDb21wb25lbnRJbnN0YW5jZUFydGlmYWN0cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjb21wb25lbnQgaW5zdGFuY2Uge30iLCBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoYWRkQ29tcG9uZW50SW5zdGFuY2VBcnRpZmFjdHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKwkJfQorCisJCXJlc3VsdE9wID0gRWl0aGVyLmxlZnQoY29tcEluc3QpOworCQlyZXR1cm4gcmVzdWx0T3A7CisJfQorCisJLyoqCisJICogYWRkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cyAtIGFkZCBhcnRpZmFjdHMgKEhFQVRfRU5WKSB0byByZXNvdXJjZSBpbnN0YW5jZSBUaGUgaW5zdGFuY2UgYXJ0aWZhY3RzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzb3VyY2UncyBhcnRpZmFjdHMKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50SW5zdGFuY2UKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHBhcmFtIGV4aXN0aW5nRW52VmVyc2lvbnMKKwkgKiBAcGFyYW0gY29udGFpbmVyQ29tcG9uZW50SWQKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIEVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBhZGRDb21wb25lbnRJbnN0YW5jZUFydGlmYWN0cyhvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50LCBDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgU3RyaW5nIHVzZXJJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBleGlzdGluZ0VudlZlcnNpb25zKSB7CisJCWxvZy5kZWJ1ZygiYWRkIGFydGlmYWN0cyB0byByZXNvdXJjZSBpbnN0YW5jZSIpOworCisJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSBzZXRSZXNvdXJjZUFydGlmYWN0c09uUmVzb3VyY2VJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZSk7CisJCWlmICghQWN0aW9uU3RhdHVzLk9LLmVxdWFscyhzdGF0dXMpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXN1bHRPcCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEZvclJlc291cmNlSW5zdGFuY2Uoc3RhdHVzLCAiIiwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3VsdE9wKTsKKwkJfQorCisJCS8vIGdlbmVyYXRlIGhlYXRfZW52IGlmIG5lY2Vzc2FyeQorCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdHMgPSBjb21wb25lbnRJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWlmIChjb21wb25lbnREZXBsb3ltZW50QXJ0aWZhY3RzID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChBY3Rpb25TdGF0dXMuT0spOworCQl9CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZmluYWxEZXBsb3ltZW50QXJ0aWZhY3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdHMpOworCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA6IGNvbXBvbmVudERlcGxveW1lbnRBcnRpZmFjdHMudmFsdWVzKCkpIHsKKwkJCS8vIGlmIChhcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAorCQkJLy8gQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSkpIHsKKwkJCVN0cmluZyB0eXBlID0gYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCk7CisKKwkJCWlmICghKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKSB8fCB0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX05FVC5nZXRUeXBlKCkpIHx8IHR5cGUuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MLmdldFR5cGUoKSkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChhcnRpZmFjdC5jaGVja0VzSWRFeGlzdCgpKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBkZXBsb3ltZW50UmVzb3VyY2VBcnRpZmFjdHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXREZXBsb3ltZW50UmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cygpOworCQkJCWlmIChkZXBsb3ltZW50UmVzb3VyY2VBcnRpZmFjdHMgPT0gbnVsbCkgeworCQkJCQlsb2cuZGVidWcoIm5vIGRlcGxveW1lbnQgYXJ0aWZhY3RzIGFyZSBjb25maWd1cmVkIGZvciByZXNvdXJjZSBpbnN0YW5jZSIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwbGFjZUhvbGRlckRhdGEgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzLmdldChIRUFUX0VOVl9OQU1FKTsKKworCQkJCVN0cmluZyBlbnZMYWJlbCA9IChhcnRpZmFjdC5nZXRBcnRpZmFjdExhYmVsKCkgKyBIRUFUX0VOVl9TVUZGSVgpLnRvTG93ZXJDYXNlKCk7CisJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUFydGlmYWN0UGxhY2VIb2xkZXIgPSBhcnRpZmFjdEJ1c2luZXNzTG9naWMuY3JlYXRlQXJ0aWZhY3RQbGFjZUhvbGRlckluZm8oY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgZW52TGFiZWwsIHBsYWNlSG9sZGVyRGF0YSwgdXNlcklkLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwKKwkJCQkJCWluVHJhbnNhY3Rpb24pOworCQkJCWlmIChjcmVhdGVBcnRpZmFjdFBsYWNlSG9sZGVyLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZUFydGlmYWN0UGxhY2VIb2xkZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SGVhdEVudiA9IGNyZWF0ZUFydGlmYWN0UGxhY2VIb2xkZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlhcnRpZmFjdEhlYXRFbnYuc2V0SGVhdFBhcmFtc1VwZGF0ZURhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQkJCWFydGlmYWN0SGVhdEVudi5zZXRUaW1lb3V0KDApOworCQkJCWJ1aWxkSGVhdEVudkZpbGVOYW1lKGFydGlmYWN0LCBhcnRpZmFjdEhlYXRFbnYsIHBsYWNlSG9sZGVyRGF0YSk7CisKKwkJCQkvLyByYmV0emVyIC0ga2VlcCBlbnYgYXJ0aWZhY3RWZXJzaW9uIC0gY2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uIGZsb3cKKwkJCQloYW5kbGVFbnZBcnRpZmFjdFZlcnNpb24oYXJ0aWZhY3RIZWF0RW52LCBleGlzdGluZ0VudlZlcnNpb25zKTsKKwkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRIZWF0RW52QXJ0aWZhY3QgPSBhcnRpZmFjdEJ1c2luZXNzTG9naWMuYWRkSGVhdEVudkFydGlmYWN0KGFydGlmYWN0SGVhdEVudiwgYXJ0aWZhY3QsIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCB0cnVlKTsKKwkJCQlpZiAoYWRkSGVhdEVudkFydGlmYWN0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgaGVhdCBlbnYgYXJ0aWZhY3Qgb24gcmVzb3VyY2UgaW5zdGFuY2UiKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRGb3JSZXNvdXJjZUluc3RhbmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2UoYWRkSGVhdEVudkFydGlmYWN0LnJpZ2h0KCkudmFsdWUoKSwgZmFsc2UpLCAiIiwgbnVsbCkpOworCQkJCX0KKworCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBhZGRIZWF0RW52QXJ0aWZhY3QubGVmdCgpLnZhbHVlKCk7CisJCQkJaWYgKGFydGlmYWN0LmdldEhlYXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0RW52UGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+KCk7CisJCQkJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcGFyYW1ldGVyIDogYXJ0aWZhY3QuZ2V0SGVhdFBhcmFtZXRlcnMoKSkgeworCQkJCQkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdEVudlBhcmFtZXRlciA9IG5ldyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbihwYXJhbWV0ZXIpOworCQkJCQkJaGVhdEVudlBhcmFtZXRlci5zZXREZWZhdWx0VmFsdWUocGFyYW1ldGVyLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwkJCQkJCWhlYXRFbnZQYXJhbWV0ZXJzLmFkZChoZWF0RW52UGFyYW1ldGVyKTsKKwkJCQkJfQorCQkJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0SGVhdFBhcmFtZXRlcnMoaGVhdEVudlBhcmFtZXRlcnMpOworCQkJCX0KKwkJCQlmaW5hbERlcGxveW1lbnRBcnRpZmFjdHMucHV0KGVudkxhYmVsLCBhcnRpZmFjdERlZmluaXRpb24pOworCisJCQkJLy8gYXVkaXQKKwkJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXJ0aWZhY3RBdWRpdGluZ0ZpZWxkcyA9IGFydGlmYWN0QnVzaW5lc3NMb2dpYy5jcmVhdGVBcnRpZmFjdEF1ZGl0aW5nRmllbGRzKGFydGlmYWN0RGVmaW5pdGlvbiwgIiIsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJCQlhcnRpZmFjdEF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJCQkJaGFuZGxlQXVkaXRpbmcoQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX1VQTE9BRCwgY29udGFpbmVyQ29tcG9uZW50LCB1c2VySWQsIGFydGlmYWN0QXVkaXRpbmdGaWVsZHMsIGluVHJhbnNhY3Rpb24pOworCQkJfQorCQkJLy8gfQorCQl9CisJCWNvbXBvbmVudEluc3RhbmNlLnNldERlcGxveW1lbnRBcnRpZmFjdHMoZmluYWxEZXBsb3ltZW50QXJ0aWZhY3RzKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KEFjdGlvblN0YXR1cy5PSyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUF1ZGl0aW5nKEF1ZGl0aW5nQWN0aW9uRW51bSBhcnRpZmFjdFVwbG9hZCwgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbnRhaW5lckNvbXBvbmVudCwgU3RyaW5nIHVzZXJJZCwgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFydGlmYWN0QXVkaXRpbmdGaWVsZHMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IHVzZXIgPSB1c2VyQWRtaW4uZ2V0VXNlcih1c2VySWQsIGluVHJhbnNhY3Rpb24pOworCQlpZiAodXNlci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCB1c2VyIHByb3BlcnRpZXMgZnJvbSBncmFwaCBmb3IgYXVkaXQiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgdXNlci5sZWZ0KCkudmFsdWUoKSwgY29udGFpbmVyQ29tcG9uZW50LCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQUQsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX0lOU1RBTkNFLCBhcnRpZmFjdEF1ZGl0aW5nRmllbGRzKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVFbnZBcnRpZmFjdFZlcnNpb24oQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRFbnZBcnRpZmFjdCwgTWFwPFN0cmluZywgU3RyaW5nPiBleGlzdGluZ0VudlZlcnNpb25zKSB7CisJCWlmIChudWxsICE9IGV4aXN0aW5nRW52VmVyc2lvbnMpIHsKKwkJCVN0cmluZyBwcmV2VmVyc2lvbiA9IGV4aXN0aW5nRW52VmVyc2lvbnMuZ2V0KGhlYXRFbnZBcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCQlpZiAobnVsbCAhPSBwcmV2VmVyc2lvbikgeworCQkJCWhlYXRFbnZBcnRpZmFjdC5zZXRBcnRpZmFjdFZlcnNpb24ocHJldlZlcnNpb24pOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGJ1aWxkSGVhdEVudkZpbGVOYW1lKEFydGlmYWN0RGVmaW5pdGlvbiBoZWF0QXJ0aWZhY3QsIEFydGlmYWN0RGVmaW5pdGlvbiBoZWF0RW52QXJ0aWZhY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcGxhY2VIb2xkZXJEYXRhKSB7CisJCVN0cmluZyBoZWF0RXh0ZW5zaW9uID0gR2VuZXJhbFV0aWxpdHkuZ2V0RmlsZW5hbWVFeHRlbnNpb24oaGVhdEFydGlmYWN0LmdldEFydGlmYWN0TmFtZSgpKTsKKwkJU3RyaW5nIGVudkV4dGVuc2lvbiA9IChTdHJpbmcpIHBsYWNlSG9sZGVyRGF0YS5nZXQoQVJUSUZBQ1RfUExBQ0VIT0xERVJfRklMRV9FWFRFTlNJT04pOworCQlTdHJpbmcgZmlsZU5hbWUgPSBoZWF0QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkucmVwbGFjZUFsbCgiLiIgKyBoZWF0RXh0ZW5zaW9uLCAiLiIgKyBlbnZFeHRlbnNpb24pOworCQloZWF0RW52QXJ0aWZhY3Quc2V0QXJ0aWZhY3ROYW1lKGZpbGVOYW1lKTsKKwl9CisKKwlwcml2YXRlIEFjdGlvblN0YXR1cyBzZXRSZXNvdXJjZUFydGlmYWN0c09uUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlKSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMgPSBhcnRpZmFjdEJ1c2luZXNzTG9naWMuZ2V0QXJ0aWZhY3RzKHJlc291cmNlSW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpOworCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlpZiAoZ2V0UmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRSZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKCFzdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHJlc291cmNlIGFydGlmYWN0cy4gc3RhdHVzIGlzIHt9Iiwgc3RhdHVzKTsKKwkJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yUmVzb3VyY2VJbnN0YW5jZShzdGF0dXMsIHRydWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJZGVwbG95bWVudEFydGlmYWN0cyA9IGdldFJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cy5sZWZ0KCkudmFsdWUoKTsKKwkJfQorCisJCWlmICghZGVwbG95bWVudEFydGlmYWN0cy5pc0VtcHR5KCkpIHsKKwkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gdGVtcERlcGxveW1lbnRBcnRpZmFjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4oZGVwbG95bWVudEFydGlmYWN0cyk7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdCA6IGRlcGxveW1lbnRBcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJCWlmICghYXJ0aWZhY3QuZ2V0VmFsdWUoKS5jaGVja0VzSWRFeGlzdCgpKSB7CisJCQkJCXRlbXBEZXBsb3ltZW50QXJ0aWZhY3RzLnJlbW92ZShhcnRpZmFjdC5nZXRLZXkoKSk7CisJCQkJfQorCQkJfQorCisJCQlyZXNvdXJjZUluc3RhbmNlLnNldERlcGxveW1lbnRBcnRpZmFjdHModGVtcERlcGxveW1lbnRBcnRpZmFjdHMpOworCQl9CisKKwkJcmV0dXJuIEFjdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFBhcmFtLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBTdHJpbmcgdXNlcklkLCBDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSkgeworCQlyZXR1cm4gdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyQ29tcG9uZW50UGFyYW0sIGNvbnRhaW5lckNvbXBvbmVudElkLCBjb21wb25lbnRJbnN0YW5jZUlkLCB1c2VySWQsIGNvbXBvbmVudEluc3RhbmNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKFN0cmluZyBjb250YWluZXJDb21wb25lbnRQYXJhbSwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwgU3RyaW5nIHVzZXJJZCwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwKKwkJCWJvb2xlYW4gbmVlZExvY2ssIGJvb2xlYW4gY3JlYXRlTmV3VHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAidXBkYXRlIENvbXBvbmVudCBJbnN0YW5jZSIsIGluVHJhbnNhY3Rpb24pOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCisJCUVpdGhlcjxDb21wb25lbnRUeXBlRW51bSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50VHlwZSA9IHZhbGlkYXRlQ29tcG9uZW50VHlwZShjb250YWluZXJDb21wb25lbnRQYXJhbSk7CisJCWlmICh2YWxpZGF0ZUNvbXBvbmVudFR5cGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50VHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJZmluYWwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSA9IHZhbGlkYXRlQ29tcG9uZW50VHlwZS5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8b3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyhjb250YWluZXJDb21wb25lbnRJZCwgY29udGFpbmVyQ29tcG9uZW50VHlwZSwgaW5UcmFuc2FjdGlvbiwgY3JlYXRlTmV3VHJhbnNhY3Rpb24pOworCQlpZiAodmFsaWRhdGVDb21wb25lbnRFeGlzdHMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbnRhaW5lckNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQgPSB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsIHVzZXJJZCk7CisJCWlmICh2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlDb21wb25lbnRUeXBlRW51bSBpbnN0YW5jZVR5cGUgPSBnZXRDb21wb25lbnRUeXBlKGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVQYXJlbnRTdGF0dXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi52YWxpZGF0ZVBhcmVudChjb250YWluZXJDb21wb25lbnRJZCwgY29tcG9uZW50SW5zdGFuY2VJZCwgaW5UcmFuc2FjdGlvbik7CisJCWlmICh2YWxpZGF0ZVBhcmVudFN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBjb21wb25lbnQgaW5zdGFuY2Uge30gb24gc2VydmljZSB7fSIsIGNvbXBvbmVudEluc3RhbmNlSWQsIGNvbnRhaW5lckNvbXBvbmVudElkKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOU1RBTkNFX05PVF9GT1VORCwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpLCBpbnN0YW5jZVR5cGUuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpKSk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisJCX0KKwkJQm9vbGVhbiBpc1ByZW50VmFsaWQgPSB2YWxpZGF0ZVBhcmVudFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKCFpc1ByZW50VmFsaWQpIHsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KAorCQkJCQljb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlNUQU5DRV9OT1RfRk9VTkRfT05fQ09OVEFJTkVSLCBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCksIGluc3RhbmNlVHlwZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCksIGNvbnRhaW5lckNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpLCBjb250YWluZXJDb21wb25lbnRJZCkpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCisJCX0KKworCQlpZiAobmVlZExvY2spIHsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsICJ1cGRhdGVDb21wb25lbnRJbnN0YW5jZSIpOworCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKworCQl0cnkgeworCisJCQlFaXRoZXI8Q29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzb3VyY2VOYW1lID0gZ2V0T3JpZ2luQ29tcG9uZW50TmFtZUZyb21Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZSwgaW5UcmFuc2FjdGlvbik7CisKKwkJCWlmIChlaXRoZXJSZXNvdXJjZU5hbWUuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoZWl0aGVyUmVzb3VyY2VOYW1lLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJfQorCQkJQ29tcG9uZW50IG9yaWdDb21wb25lbnQgPSBlaXRoZXJSZXNvdXJjZU5hbWUubGVmdCgpLnZhbHVlKCk7CisKKwkJCXJlc3VsdE9wID0gdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIG9yaWdDb21wb25lbnQsIGNvbXBvbmVudEluc3RhbmNlSWQsIGNvbXBvbmVudEluc3RhbmNlLCBpblRyYW5zYWN0aW9uKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKG5lZWRMb2NrKQorCQkJCXVubG9ja0NvbXBvbmVudChyZXN1bHRPcCwgY29udGFpbmVyQ29tcG9uZW50KTsKKwkJfQorCX0KKworCS8vIE5ldyBNdWx0aXBsZSBJbnN0YW5jZSBVcGRhdGUgQVBJCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKFN0cmluZyBjb250YWluZXJDb21wb25lbnRQYXJhbSwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLCBMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZUxpc3QsIGJvb2xlYW4gbmVlZExvY2ssCisJCQlib29sZWFuIGNyZWF0ZU5ld1RyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJ1cGRhdGUgQ29tcG9uZW50IEluc3RhbmNlIiwgdHJ1ZSk7CisJCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJRWl0aGVyPENvbXBvbmVudFR5cGVFbnVtLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRUeXBlID0gdmFsaWRhdGVDb21wb25lbnRUeXBlKGNvbnRhaW5lckNvbXBvbmVudFBhcmFtKTsKKwkJCWlmICh2YWxpZGF0ZUNvbXBvbmVudFR5cGUuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudFR5cGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJZmluYWwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSA9IHZhbGlkYXRlQ29tcG9uZW50VHlwZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50RmlsdGVyID0gbmV3IENvbXBvbmVudFBhcmFtZXRlcnNWaWV3KCk7CisJCQljb21wb25lbnRGaWx0ZXIuZGlzYWJsZUFsbCgpOworCQkJY29tcG9uZW50RmlsdGVyLnNldElnbm9yZVVzZXJzKGZhbHNlKTsKKwkJCUVpdGhlcjxvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzQnlGaWx0ZXIoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGNvbXBvbmVudEZpbHRlciwgdHJ1ZSk7CisJCQlpZiAodmFsaWRhdGVDb21wb25lbnRFeGlzdHMuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQljb250YWluZXJDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudCA9IHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50KGNvbnRhaW5lckNvbXBvbmVudCwgdXNlcklkKTsKKwkJCWlmICh2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGluc3RhbmNlVHlwZSA9IGdldENvbXBvbmVudFR5cGUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisKKwkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgOiBjb21wb25lbnRJbnN0YW5jZUxpc3QpIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVQYXJlbnRTdGF0dXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi52YWxpZGF0ZVBhcmVudChjb250YWluZXJDb21wb25lbnRJZCwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCQkJaWYgKHZhbGlkYXRlUGFyZW50U3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgY29tcG9uZW50IGluc3RhbmNlIHt9IG9uIHNlcnZpY2Uge30iLCBjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBjb250YWluZXJDb21wb25lbnRJZCk7CisJCQkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOU1RBTkNFX05PVF9GT1VORCwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpLCBpbnN0YW5jZVR5cGUuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpKSk7CisJCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCQl9CisJCQkJQm9vbGVhbiBpc1ByZW50VmFsaWQgPSB2YWxpZGF0ZVBhcmVudFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAoIWlzUHJlbnRWYWxpZCkgeworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlNUQU5DRV9OT1RfRk9VTkRfT05fQ09OVEFJTkVSLCBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCksIGluc3RhbmNlVHlwZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCksIGNvbnRhaW5lckNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpLAorCQkJCQkJCWNvbnRhaW5lckNvbXBvbmVudElkKSk7CisJCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChuZWVkTG9jaykgeworCisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsICJ1cGRhdGVDb21wb25lbnRJbnN0YW5jZSIpOworCQkJCWlmIChsb2NrQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHVwZGF0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlIDogY29tcG9uZW50SW5zdGFuY2VMaXN0KSB7CisKKwkJCQlFaXRoZXI8Q29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzb3VyY2VOYW1lID0gZ2V0T3JpZ2luQ29tcG9uZW50TmFtZUZyb21Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSk7CisKKwkJCQlpZiAoZWl0aGVyUmVzb3VyY2VOYW1lLmlzUmlnaHQoKSkgeworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChlaXRoZXJSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJCX0KKwkJCQlDb21wb25lbnQgb3JpZ0NvbXBvbmVudCA9IGVpdGhlclJlc291cmNlTmFtZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdFNpbmdsZVVwZGF0ZSA9IHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckNvbXBvbmVudElkLCBjb250YWluZXJDb21wb25lbnRUeXBlLCBvcmlnQ29tcG9uZW50LCBjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSk7CisKKwkJCQlpZiAocmVzdWx0U2luZ2xlVXBkYXRlLmlzUmlnaHQoKSkgeworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChyZXN1bHRTaW5nbGVVcGRhdGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJCX0KKwkJCQl1cGRhdGVkTGlzdC5hZGQocmVzdWx0U2luZ2xlVXBkYXRlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdCh1cGRhdGVkTGlzdCk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChuZWVkTG9jaykgeworCQkJCXVubG9ja0NvbXBvbmVudChyZXN1bHRPcCwgY29udGFpbmVyQ29tcG9uZW50KTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgQ29tcG9uZW50VHlwZUVudW0gZ2V0Q29tcG9uZW50VHlwZShDb21wb25lbnRUeXBlRW51bSBjb250YWluZXJDb21wb25lbnRUeXBlKSB7CisJCWlmIChDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULmVxdWFscyhjb250YWluZXJDb21wb25lbnRUeXBlKSkgeworCQkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfSU5TVEFOQ0U7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0U7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFBhcmFtLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50LCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgb3JpZ0NvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsCisJCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgYm9vbGVhbiBuZWVkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wID0gbnVsbDsKKwkJRWl0aGVyPENvbXBvbmVudFR5cGVFbnVtLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRUeXBlID0gdmFsaWRhdGVDb21wb25lbnRUeXBlKGNvbnRhaW5lckNvbXBvbmVudFBhcmFtKTsKKwkJaWYgKHZhbGlkYXRlQ29tcG9uZW50VHlwZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDb21wb25lbnRUeXBlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlmaW5hbCBDb21wb25lbnRUeXBlRW51bSBjb250YWluZXJDb21wb25lbnRUeXBlID0gdmFsaWRhdGVDb21wb25lbnRUeXBlLmxlZnQoKS52YWx1ZSgpOworCQlpZiAobmVlZExvY2spIHsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsICJ1cGRhdGVDb21wb25lbnRJbnN0YW5jZSIpOworCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKworCQl0cnkgeworCisJCQlyZXN1bHRPcCA9IHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb250YWluZXJDb21wb25lbnRUeXBlLCBvcmlnQ29tcG9uZW50LCBjb21wb25lbnRJbnN0YW5jZUlkLCBjb21wb25lbnRJbnN0YW5jZSwgaW5UcmFuc2FjdGlvbik7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChuZWVkTG9jaykKKwkJCQl1bmxvY2tDb21wb25lbnQocmVzdWx0T3AsIGNvbnRhaW5lckNvbXBvbmVudCk7CisJCX0KKworCX0KKworCXByaXZhdGUgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb250YWluZXJDb21wb25lbnRUeXBlLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgb3JpZ0NvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsCisJCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wOworCisJCUVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJOYW1lTG9naWMgPSBoYW5kbGVOYW1lTG9naWMob3JpZ0NvbXBvbmVudCwgY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGNvbnRhaW5lckNvbXBvbmVudElkLCBmYWxzZSwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChlaXRoZXJOYW1lTG9naWMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlck5hbWVMb2dpYy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCU5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSA9IGNvbnRhaW5lckNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaXNOYW1lRXhpc3RTdGF0dXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5pc0NvbXBvbmVudEluc3RhbmNlTmFtZUV4aXN0KGNvbnRhaW5lckNvbXBvbmVudElkLCBjb250YWluZXJOb2RlVHlwZSwgY29tcG9uZW50SW5zdGFuY2VJZCwgY29tcG9uZW50SW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCWlmIChpc05hbWVFeGlzdFN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCByZXNvdXJjZSBpbnN0YW5jZSBuYW1lcyBmb3Igc2VydmljZSB7fSIsIGNvbnRhaW5lckNvbXBvbmVudElkKTsKKworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9SRUxBVElPTl9OT1RfRk9VTkQsIGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSwgY29udGFpbmVyQ29tcG9uZW50SWQpKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKwkJfQorCQlCb29sZWFuIGlzTmFtZUV4aXN0ID0gaXNOYW1lRXhpc3RTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChpc05hbWVFeGlzdCkgeworCQkJY29udGFpbmVyQ29tcG9uZW50VHlwZSA9IGdldENvbXBvbmVudFR5cGVPZkNvbXBvbmVudEluc3RhbmNlKCk7CisJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKSk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfQorCisJCWxvZy5kZWJ1ZygiVHJ5IHRvIHVwZGF0ZSBlbnRyeSBvbiBncmFwaCIpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLnVwZGF0ZVJlc291cmNlSW5zdGFuY2UoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lck5vZGVUeXBlLCBjb21wb25lbnRJbnN0YW5jZUlkLCBjb21wb25lbnRJbnN0YW5jZSwgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKHJlc3VsdC5pc0xlZnQoKSkgeworCQkJbG9nLmRlYnVnKCJFbnR5IG9uIGdyYXBoIGlzIHVwZGF0ZWQuIik7CisJCQlDb21wb25lbnRJbnN0YW5jZSByZXNSZXNvdXJjZUluZm8gPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlyZXN1bHRPcCA9IEVpdGhlci5sZWZ0KHJlc1Jlc291cmNlSW5mbyk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBlbnRyeSBvbiBncmFwaCBmb3IgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0Rm9yUmVzb3VyY2VJbnN0YW5jZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlKHJlc3VsdC5yaWdodCgpLnZhbHVlKCksIGZhbHNlKSwgIiIsIGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSkpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFBhcmFtLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZGVsZXRlIENvbXBvbmVudCBJbnN0YW5jZSIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUVpdGhlcjxDb21wb25lbnRUeXBlRW51bSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50VHlwZSA9IHZhbGlkYXRlQ29tcG9uZW50VHlwZShjb250YWluZXJDb21wb25lbnRQYXJhbSk7CisJCWlmICh2YWxpZGF0ZUNvbXBvbmVudFR5cGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50VHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJZmluYWwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSA9IHZhbGlkYXRlQ29tcG9uZW50VHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzID0gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGZhbHNlLCB0cnVlKTsKKwkJaWYgKHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb250YWluZXJDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudCA9IHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50KGNvbnRhaW5lckNvbXBvbmVudCwgdXNlcklkKTsKKwkJaWYgKHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsICJkZWxldGVDb21wb25lbnRJbnN0YW5jZSIpOworCQlpZiAobG9ja0NvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCS8vIHZhbGlkYXRlIHJlc291cmNlCisJCS8qCisJCSAqIGlmICghQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzLmNhbldvcmtPbkNvbXBvbmVudChjb250YWluZXJDb21wb25lbnRJZCwgc2VydmljZU9wZXJhdGlvbiwgdXNlcklkKSkgeyBsb2cuaW5mbyggIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIGZvciB1c2VyIHt9IG9uIHNlcnZpY2Uge30iLCB1c2VySWQsIGNvbnRhaW5lckNvbXBvbmVudElkKTsgcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMKKwkJICogLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOyB9IC8vIGxvY2sgcmVzb3VyY2UgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrU3RhdHVzID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQoIGNvbnRhaW5lckNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0uU2VydmljZSk7IGlmIChsb2NrU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJICogbG9nLmRlYnVnKCJGYWlsZWQgdG8gbG9jayBzZXJ2aWNlIHt9IiwgY29udGFpbmVyQ29tcG9uZW50SWQpOyByZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMgLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscyAuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UobG9ja1N0YXR1cykpKTsgcmV0dXJuIHJlc3VsdE9wOyB9CisJCSAqLworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHRPcCA9IG51bGw7CisJCXRyeSB7CisJCQlyZXN1bHRPcCA9IGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckNvbXBvbmVudElkLCByZXNvdXJjZUluc3RhbmNlSWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCisJCX0gZmluYWxseSB7CisJCQkvKgorCQkJICogaWYgKHJlc3VsdE9wID09IG51bGwgfHwgcmVzdWx0T3AuaXNSaWdodCgpKSB7IHRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOyB9IGVsc2UgeyB0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7IH0gZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChjb250YWluZXJDb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCQkJICovCisJCQl1bmxvY2tDb21wb25lbnQocmVzdWx0T3AsIGNvbnRhaW5lckNvbXBvbmVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKFN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSkgeworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHRPcDsKKwkJTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlID0gY29udGFpbmVyQ29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lck5vZGVUeXBlLCBjb250YWluZXJDb21wb25lbnRJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCB0cnVlKTsKKworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGVudHJ5IG9uIGdyYXBoIGZvciByZXNvdXJjZUluc3RhbmNlIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQkvLyBUT0RPIGNoZWNrCisJCQkvKgorCQkJICogaWYgKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORC5lcXVhbHMoc3RhdHVzKSkgeyByZXN1bHRPcCA9IEVpdGhlciAucmlnaHQoY29tcG9uZW50c1V0aWxzIC5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EKSk7IH0gZWxzZSB7CisJCQkgKi8KKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChzdGF0dXMsIHJlc291cmNlSW5zdGFuY2VJZCkpOworCQkJLy8gfQorCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9CisJCUNvbXBvbmVudEluc3RhbmNlIHJlc1Jlc291cmNlSW5mbyA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdChyZXNSZXNvdXJjZUluZm8pOworCisJCWxvZy5kZWJ1ZygiRW50cnkgb24gZ3JhcGggaXMgZGVsZXRlZC4gRXhpc3QgbW9yZSBjb25uZWN0aW9ucyBvbiB0aGlzIGFydGlmYWN0LiIpOworCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHJlc1Jlc291cmNlSW5mby5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWlmIChkZXBsb3ltZW50QXJ0aWZhY3RzICE9IG51bGwgJiYgIWRlcGxveW1lbnRBcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUFydGlmYWN0c0lmTm90T25HcmFwaCA9IGFydGlmYWN0QnVzaW5lc3NMb2dpYy5kZWxldGVBbGxDb21wb25lbnRBcnRpZmFjdHNJZk5vdE9uR3JhcGgobmV3IEFycmF5TGlzdDxBcnRpZmFjdERlZmluaXRpb24+KGRlcGxveW1lbnRBcnRpZmFjdHMudmFsdWVzKCkpKTsKKwkJCWlmICghZGVsZXRlQXJ0aWZhY3RzSWZOb3RPbkdyYXBoLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSBhcnRpZmFjdCBwYXlsb2FkLiBzdGF0dXM9e30iLCBkZWxldGVBcnRpZmFjdHNJZk5vdE9uR3JhcGgubmFtZSgpKTsKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZUluc3RhbmNlSWQpKTsKKwkJCX0KKworCQl9CisJCXJldHVybiByZXN1bHRPcDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgUmVzcG9uc2VGb3JtYXQ+IGFzc29jaWF0ZVJJVG9SSShTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyB1c2VySWQsIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0pIHsKKwkJcmV0dXJuIGFzc29jaWF0ZVJJVG9SSShjb21wb25lbnRJZCwgdXNlcklkLCByZXF1aXJlbWVudERlZiwgY29tcG9uZW50VHlwZUVudW0sIGZhbHNlLCB0cnVlLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgUmVzcG9uc2VGb3JtYXQ+IGFzc29jaWF0ZVJJVG9SSShTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyB1c2VySWQsIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZiwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaywKKwkJCWJvb2xlYW4gY3JlYXRlTmV3VHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiYXNzb2NpYXRlIFJpIFRvIFJJIiwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3AgPSBudWxsOworCisJCUVpdGhlcjxvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzKGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlRW51bSwgaW5UcmFuc2FjdGlvbiwgY3JlYXRlTmV3VHJhbnNhY3Rpb24pOworCQlpZiAodmFsaWRhdGVDb21wb25lbnRFeGlzdHMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbnRhaW5lckNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQgPSB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsIHVzZXJJZCk7CisJCWlmICh2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlpZiAobmVlZExvY2spIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja0NvbXBvbmVudCA9IGxvY2tDb21wb25lbnQoY29udGFpbmVyQ29tcG9uZW50LCAiYXNzb2NpYXRlUklUb1JJIik7CisKKwkJCWlmIChsb2NrQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJdHJ5IHsKKworCQkJcmVzdWx0T3AgPSBhc3NvY2lhdGVSSVRvUklPbkdyYXBoKGNvbXBvbmVudElkLCByZXF1aXJlbWVudERlZiwgY29tcG9uZW50VHlwZUVudW0sIGluVHJhbnNhY3Rpb24pOworCisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChuZWVkTG9jaykKKwkJCQl1bmxvY2tDb21wb25lbnQocmVzdWx0T3AsIGNvbnRhaW5lckNvbXBvbmVudCk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgUmVzcG9uc2VGb3JtYXQ+IGFzc29jaWF0ZVJJVG9SSU9uR3JhcGgoU3RyaW5nIGNvbXBvbmVudElkLCBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlsb2cuZGVidWcoIlRyeSB0byBjcmVhdGUgZW50cnkgb24gZ3JhcGgiKTsKKwkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wID0gbnVsbDsKKworCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5hc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZUVudW0uZ2V0Tm9kZVR5cGUoKSwgcmVxdWlyZW1lbnREZWYsIGluVHJhbnNhY3Rpb24pOworCisJCWlmIChyZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRW50eSBvbiBncmFwaCBpcyBjcmVhdGVkLiIpOworCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLmxlZnQocmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIG5vZGUge30gd2l0aCBub2RlIHt9IiwgcmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKSwgcmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCkpOworCQkJU3RyaW5nIGZyb21OYW1lT3JJZCA9ICIiOworCQkJU3RyaW5nIHRvTmFtZU9ySWQgPSAiIjsKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZnJvbVJlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmdldFJlc291cmNlSW5zdGFuY2VCeUlkKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCkpOworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB0b1Jlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmdldFJlc291cmNlSW5zdGFuY2VCeUlkKHJlcXVpcmVtZW50RGVmLmdldFRvTm9kZSgpKTsKKworCQkJdG9OYW1lT3JJZCA9IHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCk7CisJCQlmcm9tTmFtZU9ySWQgPSByZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpOworCQkJaWYgKGZyb21SZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQlmcm9tTmFtZU9ySWQgPSBmcm9tUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKTsKKwkJCX0KKwkJCWlmICh0b1Jlc3VsdC5pc0xlZnQoKSkgeworCQkJCXRvTmFtZU9ySWQgPSB0b1Jlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXROYW1lKCk7CisJCQl9CisKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlKHJlc3VsdC5yaWdodCgpLnZhbHVlKCksIHRydWUpLCBmcm9tTmFtZU9ySWQsIHRvTmFtZU9ySWQsIHJlcXVpcmVtZW50RGVmLmdldFJlbGF0aW9uc2hpcHMoKS5nZXQoMCkuZ2V0UmVxdWlyZW1lbnQoKSkpOworCisJCQlyZXR1cm4gcmVzdWx0T3A7CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBSZXNwb25zZUZvcm1hdD4gZGlzc29jaWF0ZVJJRnJvbVJJKFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIHVzZXJJZCwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgeworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZGlzc29jaWF0ZSBSSSBGcm9tIFJJIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wID0gbnVsbDsKKwkJRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzID0gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLCBmYWxzZSwgdHJ1ZSk7CisJCWlmICh2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDb21wb25lbnRFeGlzdHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50ID0gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudCA9IHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50KGNvbnRhaW5lckNvbXBvbmVudCwgdXNlcklkKTsKKwkJaWYgKHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja0NvbXBvbmVudCA9IGxvY2tDb21wb25lbnQoY29udGFpbmVyQ29tcG9uZW50LCAiYXNzb2NpYXRlUklUb1JJIik7CisKKwkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl0cnkgeworCQkJbG9nLmRlYnVnKCJUcnkgdG8gY3JlYXRlIGVudHJ5IG9uIGdyYXBoIik7CisJCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5kaXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLmdldE5vZGVUeXBlKCksIHJlcXVpcmVtZW50RGVmLCB0cnVlKTsKKwkJCWlmIChyZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkVudHkgb24gZ3JhcGggaXMgY3JlYXRlZC4iKTsKKwkJCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCXJlc3VsdE9wID0gRWl0aGVyLmxlZnQocmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKTsKKwkJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkaXNzb2NhaXRlIG5vZGUge30gZnJvbSBub2RlIHt9IiwgcmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKSwgcmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCkpOworCQkJCVN0cmluZyBmcm9tTmFtZU9ySWQgPSAiIjsKKwkJCQlTdHJpbmcgdG9OYW1lT3JJZCA9ICIiOworCQkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZnJvbVJlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmdldFJlc291cmNlSW5zdGFuY2VCeUlkKHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCkpOworCQkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdG9SZXN1bHQgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5nZXRSZXNvdXJjZUluc3RhbmNlQnlJZChyZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKSk7CisKKwkJCQl0b05hbWVPcklkID0gcmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKTsKKwkJCQlmcm9tTmFtZU9ySWQgPSByZXF1aXJlbWVudERlZi5nZXRGcm9tTm9kZSgpOworCQkJCWlmIChmcm9tUmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJCWZyb21OYW1lT3JJZCA9IGZyb21SZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0TmFtZSgpOworCQkJCX0KKwkJCQlpZiAodG9SZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQkJdG9OYW1lT3JJZCA9IHRvUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKTsKKwkJCQl9CisKKwkJCQlyZXN1bHRPcCA9IEVpdGhlcgorCQkJCQkJLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlKHJlc3VsdC5yaWdodCgpLnZhbHVlKCksIHRydWUpLCBmcm9tTmFtZU9ySWQsIHRvTmFtZU9ySWQsIHJlcXVpcmVtZW50RGVmLmdldFJlbGF0aW9uc2hpcHMoKS5nZXQoMCkuZ2V0UmVxdWlyZW1lbnQoKSkpOworCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXVubG9ja0NvbXBvbmVudChyZXN1bHRPcCwgY29udGFpbmVyQ29tcG9uZW50KTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlQXR0cmlidXRlVmFsdWUoQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkKSB7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQXR0cmlidXRlID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24udXBkYXRlQXR0cmlidXRlVmFsdWVJblJlc291cmNlSW5zdGFuY2UoYXR0cmlidXRlLCByZXNvdXJjZUluc3RhbmNlSWQsIHRydWUpOworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQ7CisJCWlmIChlaXRoZXJBdHRyaWJ1dGUuaXNMZWZ0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiQXR0cmlidXRlIHZhbHVlIHt9IHdhcyB1cGRhdGVkIG9uIGdyYXBoLiIsIGF0dHJpYnV0ZS5nZXRWYWx1ZVVuaXF1ZVVpZCgpKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGluc3RhbmNlQXR0cmlidXRlID0gZWl0aGVyQXR0cmlidXRlLmxlZnQoKS52YWx1ZSgpOworCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChpbnN0YW5jZUF0dHJpYnV0ZSk7CisKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBhdHRyaWJ1dGUgdmFsdWUge30gaW4gcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBhdHRyaWJ1dGUsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkoZWl0aGVyQXR0cmlidXRlLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCAiIikpOworCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUlucHV0LCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlSW5wdXRWYWx1ZShDb21wb25lbnRJbnN0YW5jZUlucHV0IGlucHV0LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkKSB7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUlucHV0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJJbnB1dCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLnVwZGF0ZUlucHV0VmFsdWVJblJlc291cmNlSW5zdGFuY2UoaW5wdXQsIHJlc291cmNlSW5zdGFuY2VJZCwgdHJ1ZSk7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUlucHV0LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0OworCQlpZiAoZWl0aGVySW5wdXQuaXNMZWZ0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiSW5wdXQgdmFsdWUge30gd2FzIHVwZGF0ZWQgb24gZ3JhcGguIiwgaW5wdXQuZ2V0VmFsdWVVbmlxdWVVaWQoKSk7CisJCQlDb21wb25lbnRJbnN0YW5jZUlucHV0IGluc3RhbmNlSW5wdXQgPSBlaXRoZXJJbnB1dC5sZWZ0KCkudmFsdWUoKTsKKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoaW5zdGFuY2VJbnB1dCk7CisKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBpbnB1dCB2YWx1ZSB7fSBpbiByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIGlucHV0LCByZXNvdXJjZUluc3RhbmNlSWQpOworCisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KGVpdGhlcklucHV0LnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCAiIikpOworCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCkgeworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdDsKKworCQlXcmFwcGVyPEludGVnZXI+IGluZGV4Q291bnRlcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJdmFsaWRhdGVJbmNyZW1lbnRDb3VudGVyKHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BVFRSSUJVVEVfQ09VTlRFUiwgaW5kZXhDb3VudGVyV3JhcHBlciwgZXJyb3JXcmFwcGVyKTsKKworCQlpZiAoIWVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9IGVsc2UgeworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJBdHRyaWJ1dGUgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5hZGRBdHRyaWJ1dGVWYWx1ZVRvUmVzb3VyY2VJbnN0YW5jZShhdHRyaWJ1dGUsIHJlc291cmNlSW5zdGFuY2VJZCwgaW5kZXhDb3VudGVyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgdHJ1ZSk7CisJCQlpZiAoZWl0aGVyQXR0cmlidXRlLmlzTGVmdCgpKSB7CisJCQkJbG9nLmRlYnVnKCJBdHRyaWJ1dGUgdmFsdWUgd2FzIGFkZGVkIHRvIHJlc291cmNlIGluc3RhbmNlIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQlDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBpbnN0YW5jZUF0dHJpYnV0ZSA9IGVpdGhlckF0dHJpYnV0ZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChpbnN0YW5jZUF0dHJpYnV0ZSk7CisKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIGF0dHJpYnV0ZSB2YWx1ZSB7fSAgdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBhdHRyaWJ1dGUsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KGVpdGhlckF0dHJpYnV0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRGb3JSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkoYWN0aW9uU3RhdHVzLCAiIikpOworCisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgT3IgVXBkYXRlcyBBdHRyaWJ1dGUgSW5zdGFuY2UKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZUVudW0KKwkgKiBAcGFyYW0gY29tcG9uZW50SWQKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHBhcmFtIGF0dHJpYnV0ZQorCSAqIEBwYXJhbSB1c2VySWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlQXR0cmlidXRlVmFsdWUoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgdXNlcklkKSB7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisJCVdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKworCQl2YWxpZGF0ZVVzZXJFeGlzdCh1c2VySWQsICJjcmVhdGUgT3IgVXBkYXRlIEF0dHJpYnV0ZSBWYWx1ZSIsIGVycm9yV3JhcHBlcik7CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl2YWxpZGF0ZUNvbXBvbmVudFR5cGVFbnVtKGNvbXBvbmVudFR5cGVFbnVtLCAiQ3JlYXRlT3JVcGRhdGVBdHRyaWJ1dGVWYWx1ZSIsIGVycm9yV3JhcHBlcik7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlRW51bSwgdXNlcklkLCBlcnJvcldyYXBwZXIpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl2YWxpZGF0ZUNvbXBvbmVudExvY2soY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLCBlcnJvcldyYXBwZXIpOworCQl9CisKKwkJdHJ5IHsKKwkJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJZmluYWwgYm9vbGVhbiBpc0NyZWF0ZSA9IE9iamVjdHMuaXNOdWxsKGF0dHJpYnV0ZS5nZXRWYWx1ZVVuaXF1ZVVpZCgpKTsKKwkJCQlpZiAoaXNDcmVhdGUpIHsKKwkJCQkJcmVzdWx0ID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0cmlidXRlLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdCA9IHVwZGF0ZUF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCWZpbmFsbHkgeworCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0gZWxzZSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQkJLy8gdW5sb2NrIHJlc291cmNlCisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlRW51bS5nZXROb2RlVHlwZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlUHJvcGVydHlWYWx1ZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BlcnR5LCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFJlc3BvbnNlRm9ybWF0PiByZXN1bHRPcCA9IG51bGw7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImNyZWF0ZSBPciBVcGRhdGUgUHJvcGVydHkgVmFsdWUiLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gPT0gbnVsbCkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJDcmVhdGVPclVwZGF0ZVByb3BlcnR5VmFsdWUiLCAiaW52YWxpZCBjb21wb25lbnQgdHlwZSIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VEKSk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisJCX0KKworCQlJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldElDb21wb25lbnRPcGVyYXRpb24oY29tcG9uZW50VHlwZUVudW0pOworCisJCWlmICghQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzLmNhbldvcmtPbkNvbXBvbmVudChjb21wb25lbnRJZCwgY29tcG9uZW50T3BlcmF0aW9uLCB1c2VySWQpKSB7CisJCQlsb2cuaW5mbygiUmVzdHJpY3RlZCBvcGVyYXRpb24gZm9yIHVzZXIge30gb24gc2VydmljZSB7fSIsIHVzZXJJZCwgY29tcG9uZW50SWQpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9CisJCS8vIGxvY2sgcmVzb3VyY2UKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrU3RhdHVzID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLmdldE5vZGVUeXBlKCkpOworCQlpZiAobG9ja1N0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBsb2NrIHNlcnZpY2Uge30iLCBjb21wb25lbnRJZCk7CisJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGxvY2tTdGF0dXMpKSk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisJCX0KKwkJdHJ5IHsKKwkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlVWlkID0gcHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKTsKKwkJCWlmIChwcm9wZXJ0eVZhbHVlVWlkID09IG51bGwpIHsKKworCQkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb3VudGVyUmVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uaW5jcmVhc2VBbmRHZXRSZXNvdXJjZUluc3RhbmNlU3BlY2lmaWNDb3VudGVyKHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUWV9DT1VOVEVSLCB0cnVlKTsKKworCQkJCWlmIChjb3VudGVyUmVzLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImluY3JlYXNlQW5kR2V0UmVzb3VyY2VQcm9wZXJ0eUNvdW50ZXIgZmFpbGVkIHJlc291cmNlIGluc3RhbmNlIHt9IHByb3BlcnR5IHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBwcm9wZXJ0eSk7CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY291bnRlclJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkoc3RhdHVzKTsKKwkJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCQkJCX0KKwkJCQlJbnRlZ2VyIGluZGV4ID0gY291bnRlclJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uYWRkUHJvcGVydHlWYWx1ZVRvUmVzb3VyY2VJbnN0YW5jZShwcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBpbmRleCwgdHJ1ZSk7CisKKwkJCQlpZiAocmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiUHJvcGVydHkgdmFsdWUgd2FzIGFkZGVkIHRvIHJlc291cmNlIGluc3RhbmNlIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5ID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCQkJCXJlc3VsdE9wID0gRWl0aGVyLmxlZnQoaW5zdGFuY2VQcm9wZXJ0eSk7CisJCQkJCXJldHVybiByZXN1bHRPcDsKKworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFkZCBwcm9wZXJ0eSB2YWx1ZSB7fSB0byByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIHByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJCQkvLyBUT0RPOiBlc29mZXIgYWRkIGVycm9yCisKKwkJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRGb3JSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkoYWN0aW9uU3RhdHVzLCAiIikpOworCisJCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLnVwZGF0ZVByb3BlcnR5VmFsdWVJblJlc291cmNlSW5zdGFuY2UocHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgdHJ1ZSk7CisKKwkJCQlpZiAocmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiUHJvcGVydHkgdmFsdWUge30gd2FzIHVwZGF0ZWQgb24gZ3JhcGguIiwgcHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKSk7CisJCQkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eSA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5sZWZ0KGluc3RhbmNlUHJvcGVydHkpOworCQkJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgcHJvcGVydHkgdmFsdWUge30gaW4gcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBwcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCisJCQkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShhY3Rpb25TdGF0dXMsICIiKSk7CisKKwkJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJCX0KKwkJCX0KKworCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3VsdE9wID09IG51bGwgfHwgcmVzdWx0T3AuaXNSaWdodCgpKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCS8vIHVubG9jayByZXNvdXJjZQorCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZUVudW0uZ2V0Tm9kZVR5cGUoKSk7CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VJbnB1dCwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlSW5wdXRWYWx1ZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBDb21wb25lbnRJbnN0YW5jZUlucHV0IGlucHV0UHJvcGVydHksIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VJbnB1dCwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wID0gbnVsbDsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiY3JlYXRlIE9yIFVwZGF0ZSBJbnB1dCBWYWx1ZSIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWlmIChjb21wb25lbnRUeXBlRW51bSA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoImNyZWF0ZU9yVXBkYXRlSW5wdXRWYWx1ZSIsICJpbnZhbGlkIGNvbXBvbmVudCB0eXBlIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQpKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKwkJfQorCisJCUlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0SUNvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlRW51bSk7CisKKwkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRPcGVyYXRpb24sIHVzZXJJZCkpIHsKKwkJCWxvZy5pbmZvKCJSZXN0cmljdGVkIG9wZXJhdGlvbiBmb3IgdXNlciB7fSBvbiBzZXJ2aWNlIHt9IiwgdXNlcklkLCBjb21wb25lbnRJZCk7CisJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisJCX0KKwkJLy8gbG9jayByZXNvdXJjZQorCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tTdGF0dXMgPSBncmFwaExvY2tPcGVyYXRpb24ubG9ja0NvbXBvbmVudChjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZUVudW0uZ2V0Tm9kZVR5cGUoKSk7CisJCWlmIChsb2NrU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGxvY2sgc2VydmljZSB7fSIsIGNvbXBvbmVudElkKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UobG9ja1N0YXR1cykpKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKwkJfQorCQl0cnkgeworCQkJU3RyaW5nIHByb3BlcnR5VmFsdWVVaWQgPSBpbnB1dFByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCk7CisJCQlpZiAocHJvcGVydHlWYWx1ZVVpZCA9PSBudWxsKSB7CisKKwkJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY291bnRlclJlcyA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmluY3JlYXNlQW5kR2V0UmVzb3VyY2VJbnN0YW5jZVNwZWNpZmljQ291bnRlcihyZXNvdXJjZUluc3RhbmNlSWQsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5QVVRfQ09VTlRFUiwgdHJ1ZSk7CisKKwkJCQlpZiAoY291bnRlclJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJpbmNyZWFzZUFuZEdldFJlc291cmNlSW5wdXRDb3VudGVyIGZhaWxlZCByZXNvdXJjZSBpbnN0YW5jZSB7fSBpbnB1dFByb3BlcnR5IHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBpbnB1dFByb3BlcnR5KTsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjb3VudGVyUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShzdGF0dXMpOworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKSk7CisJCQkJfQorCQkJCUludGVnZXIgaW5kZXggPSBjb3VudGVyUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUlucHV0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5hZGRJbnB1dFZhbHVlVG9SZXNvdXJjZUluc3RhbmNlKGlucHV0UHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgaW5kZXgsIHRydWUpOworCisJCQkJaWYgKHJlc3VsdC5pc0xlZnQoKSkgeworCQkJCQlsb2cuZGVidWcoIlByb3BlcnR5IHZhbHVlIHdhcyBhZGRlZCB0byByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQkJCUNvbXBvbmVudEluc3RhbmNlSW5wdXQgaW5zdGFuY2VQcm9wZXJ0eSA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5sZWZ0KGluc3RhbmNlUHJvcGVydHkpOworCQkJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhZGQgaW5wdXQgdmFsdWUge30gdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBpbnB1dFByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJCQkvLyBUT0RPOiBlc29mZXIgYWRkIGVycm9yCisKKwkJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRGb3JSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkoYWN0aW9uU3RhdHVzLCAiIikpOworCisJCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlSW5wdXQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLnVwZGF0ZUlucHV0VmFsdWVJblJlc291cmNlSW5zdGFuY2UoaW5wdXRQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkLCB0cnVlKTsKKworCQkJCWlmIChyZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJJbnB1dCB2YWx1ZSB7fSB3YXMgdXBkYXRlZCBvbiBncmFwaC4iLCBpbnB1dFByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCkpOworCQkJCQlDb21wb25lbnRJbnN0YW5jZUlucHV0IGluc3RhbmNlUHJvcGVydHkgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJCQkJcmVzdWx0T3AgPSBFaXRoZXIubGVmdChpbnN0YW5jZVByb3BlcnR5KTsKKwkJCQkJcmV0dXJuIHJlc3VsdE9wOworCisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIHByb3BlcnR5IHZhbHVlIHt9IGluIHJlb3N1cmNlIGluc3RhbmNlIHt9IiwgaW5wdXRQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCisJCQkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShhY3Rpb25TdGF0dXMsICIiKSk7CisKKwkJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJCX0KKwkJCX0KKworCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3VsdE9wID09IG51bGwgfHwgcmVzdWx0T3AuaXNSaWdodCgpKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCS8vIHVubG9jayByZXNvdXJjZQorCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZUVudW0uZ2V0Tm9kZVR5cGUoKSk7CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZVByb3BlcnR5VmFsdWUoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBwcm9wZXJ0eVZhbHVlSWQsIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZGVsZXRlIFByb3BlcnR5IFZhbHVlIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFJlc3BvbnNlRm9ybWF0PiByZXN1bHRPcCA9IG51bGw7CisKKwkJaWYgKGNvbXBvbmVudFR5cGVFbnVtID09IG51bGwpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiQ3JlYXRlT3JVcGRhdGVQcm9wZXJ0eVZhbHVlIiwgImludmFsaWQgY29tcG9uZW50IHR5cGUiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRCkpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9CisKKwkJSUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRJQ29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudFR5cGVFbnVtKTsKKworCQlpZiAoIUNvbXBvbmVudFZhbGlkYXRpb25VdGlscy5jYW5Xb3JrT25Db21wb25lbnQoc2VydmljZUlkLCBjb21wb25lbnRPcGVyYXRpb24sIHVzZXJJZCkpIHsKKwkJCWxvZy5pbmZvKCJSZXN0cmljdGVkIG9wZXJhdGlvbiBmb3IgdXNlciB7fSBvbiBzZXJ2aWNlIHt9IiwgdXNlcklkLCBzZXJ2aWNlSWQpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQkJcmV0dXJuIHJlc3VsdE9wOworCQl9CisJCS8vIGxvY2sgcmVzb3VyY2UKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrU3RhdHVzID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQoc2VydmljZUlkLCBjb21wb25lbnRUeXBlRW51bS5nZXROb2RlVHlwZSgpKTsKKwkJaWYgKGxvY2tTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gbG9jayBzZXJ2aWNlIHt9Iiwgc2VydmljZUlkKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UobG9ja1N0YXR1cykpKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKwkJfQorCQl0cnkgeworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHByb3BlcnR5T3BlcmF0aW9uLnJlbW92ZVByb3BlcnR5VmFsdWVGcm9tUmVzb3VyY2VJbnN0YW5jZShwcm9wZXJ0eVZhbHVlSWQsIHJlc291cmNlSW5zdGFuY2VJZCwgdHJ1ZSk7CisKKwkJCWlmIChyZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQlsb2cuZGVidWcoIlByb3BlcnR5IHZhbHVlIHt9IHdhcyByZW1vdmVkIGZyb20gZ3JhcGguIiwgcHJvcGVydHlWYWx1ZUlkKTsKKwkJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5sZWZ0KGluc3RhbmNlUHJvcGVydHkpOworCQkJCXJldHVybiByZXN1bHRPcDsKKworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZW1vdmUgcHJvcGVydHkgdmFsdWUge30gaW4gcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBwcm9wZXJ0eVZhbHVlSWQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCisJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0Rm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KGFjdGlvblN0YXR1cywgIiIpKTsKKworCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCX0KKworCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3VsdE9wID09IG51bGwgfHwgcmVzdWx0T3AuaXNSaWdodCgpKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCS8vIHVubG9jayByZXNvdXJjZQorCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChzZXJ2aWNlSWQsIGNvbXBvbmVudFR5cGVFbnVtLmdldE5vZGVUeXBlKCkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZU5hbWUoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lLCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlLCBib29sZWFuIGlzQ3JlYXRlKSB7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBvbmVudFR5cGUgPSBnZXRDb21wb25lbnRUeXBlT2ZDb21wb25lbnRJbnN0YW5jZSgpOworCQlpZiAoIWlzQ3JlYXRlKSB7CisJCQlpZiAocmVzb3VyY2VJbnN0YW5jZU5hbWUgPT0gbnVsbCkKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KHJlc291cmNlSW5zdGFuY2VOYW1lKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19DT01QT05FTlRfTkFNRSwgY29udGFpbmVyQ29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpKTsKKworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCQlyZXNvdXJjZUluc3RhbmNlLnNldE5vcm1hbGl6ZWROYW1lKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnRJbnN0YW5jZU5hbWUocmVzb3VyY2VJbnN0YW5jZU5hbWUpKTsKKwkJaWYgKCFpc0NyZWF0ZSkgeworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVSZXNvdXJjZUluc3RhbmNlTmFtZUxlbmd0aChyZXNvdXJjZUluc3RhbmNlTmFtZSkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlULCBjb250YWluZXJDb21wb25lbnRUeXBlLmdldFZhbHVlKCksICIiICsgVmFsaWRhdGlvblV0aWxzLkNPTVBPTkVOVF9OQU1FX01BWF9MRU5HVEgpOworCisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZU5hbWUocmVzb3VyY2VJbnN0YW5jZU5hbWUpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT01QT05FTlRfTkFNRSwgY29udGFpbmVyQ29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpKTsKKworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZVBhcmVudFN0YXRlKENvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKwkJU3RyaW5nIGNvbXBvbmVudElkID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKTsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlc291cmNlUmVzcG9uc2UgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlID0gZ2V0Q29tcG9uZW50VHlwZUJ5UGFyZW50Q29tcG9uZW50VHlwZShjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudE9wZXJhdGlvbiAhPSBudWxsKQorCQkJZWl0aGVyUmVzb3VyY2VSZXNwb25zZSA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRDb21wb25lbnQoY29tcG9uZW50SWQsIHRydWUpOworCisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gbnVsbDsKKwkJaWYgKGVpdGhlclJlc291cmNlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGVpdGhlclJlc291cmNlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpLCBjb21wb25lbnRUeXBlKTsKKwkJCWVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKwkJY29tcG9uZW50ID0gZWl0aGVyUmVzb3VyY2VSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJTGlmZWN5Y2xlU3RhdGVFbnVtIHJlc291cmNlQ3VyclN0YXRlID0gY29tcG9uZW50LmdldExpZmVjeWNsZVN0YXRlKCk7CisJCWlmIChyZXNvdXJjZUN1cnJTdGF0ZSA9PSBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkgeworCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5JTExFR0FMX0NPTVBPTkVOVF9TVEFURTsKKwkJCWVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLnRvU3RyaW5nKCksIGNvbXBvbmVudC5nZXROYW1lKCksIHJlc291cmNlQ3VyclN0YXRlLnRvU3RyaW5nKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZUNvbXBvbmVudEluc3RhbmNlVmVyc2lvbihTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50UGFyYW0sIFN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsIFN0cmluZyB1c2VySWQsIENvbXBvbmVudEluc3RhbmNlIG5ld0NvbXBvbmVudEluc3RhbmNlKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImNoYW5nZSBDb21wb25lbnQgSW5zdGFuY2UgVmVyc2lvbiIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdE9wID0gbnVsbDsKKworCQlFaXRoZXI8Q29tcG9uZW50VHlwZUVudW0sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudFR5cGUgPSB2YWxpZGF0ZUNvbXBvbmVudFR5cGUoY29udGFpbmVyQ29tcG9uZW50UGFyYW0pOworCQlpZiAodmFsaWRhdGVDb21wb25lbnRUeXBlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudFR5cGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWZpbmFsIENvbXBvbmVudFR5cGVFbnVtIGNvbnRhaW5lckNvbXBvbmVudFR5cGUgPSB2YWxpZGF0ZUNvbXBvbmVudFR5cGUubGVmdCgpLnZhbHVlKCk7CisJCWZpbmFsIENvbXBvbmVudE9wZXJhdGlvbiBjb250YWluZXJPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisKKwkJRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzID0gdmFsaWRhdGVDb21wb25lbnRFeGlzdHMoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGZhbHNlLCB0cnVlKTsKKwkJaWYgKHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb250YWluZXJDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cy5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50ID0gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQoY29udGFpbmVyQ29tcG9uZW50LCB1c2VySWQpOworCQlpZiAodmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVQYXJlbnRTdGF0dXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi52YWxpZGF0ZVBhcmVudChjb250YWluZXJDb21wb25lbnRJZCwgY29tcG9uZW50SW5zdGFuY2VJZCwgZmFsc2UpOworCQlpZiAodmFsaWRhdGVQYXJlbnRTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgcmVzb3VyY2UgaW5zdGFuY2Uge30gb24gc2VydmljZSB7fSIsIGNvbXBvbmVudEluc3RhbmNlSWQsIGNvbnRhaW5lckNvbXBvbmVudElkKTsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5ELCBjb21wb25lbnRJbnN0YW5jZUlkKSk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisJCX0KKwkJQm9vbGVhbiBpc1ByZW50VmFsaWQgPSB2YWxpZGF0ZVBhcmVudFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKCFpc1ByZW50VmFsaWQpIHsKKwkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EX09OX1NFUlZJQ0UsIGNvbXBvbmVudEluc3RhbmNlSWQsIGNvbnRhaW5lckNvbXBvbmVudElkKSk7CisJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJfQorCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VJbnN0YW5jZVN0YXR1cyA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmdldFJlc291cmNlSW5zdGFuY2VCeUlkKGNvbXBvbmVudEluc3RhbmNlSWQpOworCQlpZiAocmVzb3VyY2VJbnN0YW5jZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCByZXNvdXJjZSBpbnN0YW5jZSB7fSBvbiBzZXJ2aWNlIHt9IiwgY29tcG9uZW50SW5zdGFuY2VJZCwgY29udGFpbmVyQ29tcG9uZW50SWQpOworCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9OT1RfRk9VTkQsIGNvbXBvbmVudEluc3RhbmNlSWQpKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKwkJfQorCQlDb21wb25lbnRJbnN0YW5jZSBjdXJyZW50UmVzb3VyY2VJbnN0YW5jZSA9IHJlc291cmNlSW5zdGFuY2VTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChjb250YWluZXJDb21wb25lbnQsICJjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24iKTsKKwkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCXRyeSB7CisJCQlpZiAoY3VycmVudFJlc291cmNlSW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCkuZXF1YWxzKG5ld0NvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpKSkgeworCQkJCXJlc3VsdE9wID0gRWl0aGVyLmxlZnQoY3VycmVudFJlc291cmNlSW5zdGFuY2UpOworCQkJCXJldHVybiByZXN1bHRPcDsKKworCQkJfQorCQkJU3RyaW5nIHJlc291cmNlSWQgPSBuZXdDb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKTsKKwkJCWlmICghZ2V0Q29tcEluc3RPcmlnaW5Db21wb25lbnRPcGVyYXRpb24oKS5pc0NvbXBvbmVudEV4aXN0KHJlc291cmNlSWQpKSB7CisJCQkJbG9nLmRlYnVnKCJyZXNvdXJjZSB7fSBub3QgZm91bmQuIiwgcmVzb3VyY2VJZCk7CisJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsICIiKSk7CisJCQkJcmV0dXJuIHJlc3VsdE9wOworCQkJfQorCisJCQkvLyBlc29mZXIgLSBiZWZvcmUgZGVsZXRpbmcgY29tcG9uZW50IGluc3RhbmNlLCB3ZSBzaG91bGQga2VlcCB0aGUKKwkJCS8vIGdyb3VwcyB3aGljaCBob2xkcyB0aGlzIGluc3RhbmNlCisJCQlMaXN0PFN0cmluZz4gZ3JvdXBzVG9SZXZlcnQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCUVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZWRHcm91cHMgPSBncm91cE9wZXJhdGlvbi5nZXRBc3NvY2lhdGVkR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZUlkLCB0cnVlKTsKKwkJCWlmIChhc3NvY2lhdGVkR3JvdXBzLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYXNzb2NpYXRlZEdyb3Vwcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiQ2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uIiwgIkZhaWxlZCB0byBnZXRjaCBncm91cHMgb2YgY3VycmVudCBjb21wb25lbnQgaW5zdGFuY2UiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUxpc3Q8U3RyaW5nPiBncm91cHMgPSBhc3NvY2lhdGVkR3JvdXBzLmxlZnQoKS52YWx1ZSgpOworCQkJCWdyb3Vwc1RvUmV2ZXJ0LmFkZEFsbChncm91cHMpOworCQkJfQorCQkJLy8gcmJldHplciAtIGJlZm9yZSBkZWxldGluZyBjb21wb25lbnQgaW5zdGFuY2UsIHJldHJpZXZlIGVudiBhcnRpZmFjdHMgdG8ga2VlcCB0cmFjayBvZiBhcnRpZmFjdFZlcnNpb24KKworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJldHJpZXZlRW52QXJ0aWZhY3RzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uZmV0Y2hDSUVudkFydGlmYWN0cyhjb21wb25lbnRJbnN0YW5jZUlkKTsKKwkJCWlmIChyZXRyaWV2ZUVudkFydGlmYWN0cy5pc0xlZnQoKSkKKwkJCQluZXdDb21wb25lbnRJbnN0YW5jZS5zZXREZXBsb3ltZW50QXJ0aWZhY3RzKHJldHJpZXZlRW52QXJ0aWZhY3RzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWVsc2UgaWYgKHJldHJpZXZlRW52QXJ0aWZhY3RzLnJpZ2h0KCkudmFsdWUoKSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJbG9nLmRlYnVnKCJmYWxpZWQgdG8gZmV0Y2ggaW5zdGFuY2UgZGVwbG95bWVudCBhcnRpZmFjdHMge30iLCBjb21wb25lbnRJbnN0YW5jZUlkICk7CisJCQl9CisKKwkJCXJlc3VsdE9wID0gZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbXBvbmVudEluc3RhbmNlSWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJaWYgKHJlc3VsdE9wLmlzUmlnaHQoKSkgeworCisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIHJlc291cmNlIGluc3RhbmNlIHt9IiwgcmVzb3VyY2VJZCk7CisKKwkJCQlyZXR1cm4gcmVzdWx0T3A7CisKKwkJCX0KKworCQkJRWl0aGVyPENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc291cmNlTmFtZSA9IGdldE9yaWdpbkNvbXBvbmVudE5hbWVGcm9tQ29tcG9uZW50SW5zdGFuY2UobmV3Q29tcG9uZW50SW5zdGFuY2UsIHRydWUpOworCisJCQlpZiAoZWl0aGVyUmVzb3VyY2VOYW1lLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdE9wID0gRWl0aGVyLnJpZ2h0KGVpdGhlclJlc291cmNlTmFtZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCX0KKworCQkJQ29tcG9uZW50IG9yaWdDb21wb25lbnQgPSBlaXRoZXJSZXNvdXJjZU5hbWUubGVmdCgpLnZhbHVlKCk7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIHJlc1Jlc291cmNlSW5mbyA9IHJlc3VsdE9wLmxlZnQoKS52YWx1ZSgpOworCQkJbmV3Q29tcG9uZW50SW5zdGFuY2Uuc2V0TmFtZShyZXNSZXNvdXJjZUluZm8uZ2V0TmFtZSgpKTsKKwkJCW5ld0NvbXBvbmVudEluc3RhbmNlLnNldFBvc1gocmVzUmVzb3VyY2VJbmZvLmdldFBvc1goKSk7CisJCQluZXdDb21wb25lbnRJbnN0YW5jZS5zZXRQb3NZKHJlc1Jlc291cmNlSW5mby5nZXRQb3NZKCkpOworCQkJbmV3Q29tcG9uZW50SW5zdGFuY2Uuc2V0RGVzY3JpcHRpb24ocmVzUmVzb3VyY2VJbmZvLmdldERlc2NyaXB0aW9uKCkpOworCisJCQlyZXN1bHRPcCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlT25HcmFwaChjb250YWluZXJDb21wb25lbnQsIG9yaWdDb21wb25lbnQsIG5ld0NvbXBvbmVudEluc3RhbmNlLCB1c2VySWQsIGNvbnRhaW5lck9wZXJhdGlvbiwgdHJ1ZSk7CisKKwkJCWlmIChyZXN1bHRPcC5pc1JpZ2h0KCkpIHsKKworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIHJlc291cmNlSWQpOworCisJCQkJcmV0dXJuIHJlc3VsdE9wOworCisJCQl9CisKKwkJCW5ld0NvbXBvbmVudEluc3RhbmNlID0gcmVzdWx0T3AubGVmdCgpLnZhbHVlKCk7CisJCQluZXdDb21wb25lbnRJbnN0YW5jZS5zZXROYW1lKHJlc1Jlc291cmNlSW5mby5nZXROYW1lKCkpOworCQkJcmVzdWx0T3AgPSB1cGRhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJDb21wb25lbnRJZCwgY29udGFpbmVyQ29tcG9uZW50VHlwZSwgb3JpZ0NvbXBvbmVudCwgbmV3Q29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgbmV3Q29tcG9uZW50SW5zdGFuY2UsIHRydWUpOworCisJCQlDb21wb25lbnRJbnN0YW5jZSB1cGRhdGVkQ29tcG9uZW50SW5zdGFuY2UgPSByZXN1bHRPcC5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChyZXN1bHRPcC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCByZXNvdXJjZUlkKTsKKwkJCQlyZXR1cm4gcmVzdWx0T3A7CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBncm91cHNUb1JldmVydC5pc0VtcHR5KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZWRHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlID0gZ3JvdXBPcGVyYXRpb24uYXNzb2NpYXRlR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZShncm91cHNUb1JldmVydCwgdXBkYXRlZENvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHVwZGF0ZWRDb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCksIHRydWUpOworCQkJCWlmIChhc3NvY2lhdGVkR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiQ2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uIiwgIkZhaWxlZCB0byBhc3NvY2lhdGUgZ3JvdXBzIHRvIG5ldyBjb21wb25lbnQgaW5zdGFuY2UiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJCXJldHVybiByZXN1bHRPcDsKKwkJCQl9CisJCQl9CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZnVsbFJlc291cmNlSW5zdGFuY2UgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5nZXRGdWxsQ29tcG9uZW50SW5zdGFuY2UocmVzdWx0T3AubGVmdCgpLnZhbHVlKCksIGdldE5vZGVUeXBlT2ZDb21wb25lbnRJbnN0YW5jZU9yaWdpbigpKTsKKwkJCWlmIChmdWxsUmVzb3VyY2VJbnN0YW5jZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHRPcCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGZ1bGxSZXNvdXJjZUluc3RhbmNlLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlSWQpKTsKKwkJCQlyZXR1cm4gcmVzdWx0T3A7CisJCQl9CisJCQlyZXN1bHRPcCA9IEVpdGhlci5sZWZ0KGZ1bGxSZXNvdXJjZUluc3RhbmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHRPcDsKKworCQl9IGZpbmFsbHkgeworCQkJdW5sb2NrQ29tcG9uZW50KHJlc3VsdE9wLCBjb250YWluZXJDb21wb25lbnQpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbGxvd2VkVG9Db250YWluQ29tcEluc3RhbmNlcyhvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50KTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCBOb2RlVHlwZUVudW0gZ2V0Tm9kZVR5cGVPZkNvbXBvbmVudEluc3RhbmNlT3JpZ2luKCk7CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9uZW50VHlwZUVudW0gZ2V0Q29tcG9uZW50VHlwZU9mQ29tcG9uZW50SW5zdGFuY2UoKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCBDb21wb25lbnRPcGVyYXRpb24gZ2V0Q29udGFpbmVyQ29tcG9uZW50T3BlcmF0aW9uKCk7CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbXBJbnN0T3JpZ2luQ29tcG9uZW50T3BlcmF0aW9uKCk7CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUluY3JlbWVudENvdW50ZXIoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeSBjb3VudGVyVHlwZSwgV3JhcHBlcjxJbnRlZ2VyPiBpbnN0YWNlQ291bnRlcldyYXBwZXIsIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlcikgeworCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY291bnRlclJlcyA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmluY3JlYXNlQW5kR2V0UmVzb3VyY2VJbnN0YW5jZVNwZWNpZmljQ291bnRlcihyZXNvdXJjZUluc3RhbmNlSWQsIGNvdW50ZXJUeXBlLCB0cnVlKTsKKworCQlpZiAoY291bnRlclJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiaW5jcmVhc2UgQW5kIEdldCB7fSBmYWlsZWQgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBjb3VudGVyVHlwZS5uYW1lKCksIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNvdW50ZXJSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShzdGF0dXMpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKSk7CisJCX0gZWxzZSB7CisJCQlpbnN0YWNlQ291bnRlcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNvdW50ZXJSZXMubGVmdCgpLnZhbHVlKCkpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZWJjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5PcmlnaW5UeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyB0aGUgbG9naWMgb2YgYXJyYW5naW5nIHJlc291cmNlIGluc3RhbmNlIG9uIHRoZSBjYW52YXMgZm9yIGltcG9ydGVkIFZGCisgKiAKKyAqIEBhdXRob3IgbXNoaXRyaXQKKyAqCisgKi8KK0BDb21wb25lbnQoImNvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljIHsKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBWRkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyB2ZkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYzsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRkNfQ0FOVkFTX0VMRU1FTlRfU0laRSA9IDUwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUF9DQU5WQVNfRUxFTUVOVF9TSVpFID0gMjE7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTlZBU19XSURUSCA9IDEwMDA7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTlZBU19IRUlHSFQgPSA3MDA7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQUNFX0JFVFdFRU5fRUxFTUVOVFMgPSBWRkNfQ0FOVkFTX0VMRU1FTlRfU0laRSAqIDQ7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIENQX1JBRElVU19GQUNUT1IgPSAwLjQ7CisKKwllbnVtIFJlbGF0aXZlUG9zaXRpb24geworCQlMRUZULCBSSUdIVCwgVVAsIERPV04KKwl9OworCisJcHJvdGVjdGVkIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgUmVzcG9uc2VGb3JtYXQ+IHNldFBvc2l0aW9uc0ZvckNvbXBvbmVudEluc3RhbmNlcyhSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBFaXRoZXIubGVmdChyZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSk7CisKKwkJYm9vbGVhbiBpc05vdEFsbFBvc2l0aW9uc0NhbGN1bGF0ZWQgPSByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSA9PSBudWxsCisJCQkJfHwgcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gKHAuZ2V0UG9zWCgpID09IG51bGwgfHwgcC5nZXRQb3NYKCkuaXNFbXB0eSgpKSB8fCAocC5nZXRQb3NZKCkgPT0gbnVsbCB8fCBwLmdldFBvc1koKS5pc0VtcHR5KCkpKS5maW5kQW55KCkuaXNQcmVzZW50KCk7CisKKwkJaWYgKGlzTm90QWxsUG9zaXRpb25zQ2FsY3VsYXRlZCkgeworCQkJLy8gQXJyYW5nZSBJY29ucyBJbiBTcGlyYWwgUGF0dGVybgorCQkJTWFwPEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+LCBDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VMb2NhdGlvbnMgPSBidWlsZFNwaXJhbFBhdHRlcm5Qb3NpdGlvbmluZ0ZvckNvbXBvbmVudEluc3RhbmNlcyhyZXNvdXJjZSk7CisKKwkJCS8vIFNldCBSZWxhdGl2ZSBMb2NhdGlvbnMgQWNjb3JkaW5nIHRvIENhbnZhcyBTaXplCisJCQljb21wb25lbnRJbnN0YW5jZUxvY2F0aW9ucy5lbnRyeVNldCgpLnN0cmVhbSgpLmZvckVhY2goZSAtPiBzZXRSZWxhdGl2ZVBvc2l0aW9uKGUpKTsKKworCQkJLy8gVXBkYXRlIGluIERCCisJCQlyZXN1bHQgPSB2ZkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1c2VySWQsIHJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLCBmYWxzZSwgZmFsc2UpOworCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCXByaXZhdGUgdm9pZCBzZXRSZWxhdGl2ZVBvc2l0aW9uKEVudHJ5PEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+LCBDb21wb25lbnRJbnN0YW5jZT4gZW50cnkpIHsKKwkJaW50IHhDZW50ZXIgPSBDQU5WQVNfV0lEVEggLyAyOworCQlpbnQgeUNlbnRlciA9IENBTlZBU19IRUlHSFQgLyAyOworCisJCUltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+IG1hdHJpeFBvc2l0aW9uID0gZW50cnkuZ2V0S2V5KCk7CisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJY29tcG9uZW50SW5zdGFuY2Uuc2V0UG9zWChjYWxjdWxhdGVDb21wb3NpdGlvblBvc2l0aW9uKHhDZW50ZXIsIG1hdHJpeFBvc2l0aW9uLmdldExlZnQoKSwgY29tcG9uZW50SW5zdGFuY2UpKTsKKwkJY29tcG9uZW50SW5zdGFuY2Uuc2V0UG9zWShjYWxjdWxhdGVDb21wb3NpdGlvblBvc2l0aW9uKHlDZW50ZXIsIG1hdHJpeFBvc2l0aW9uLmdldFJpZ2h0KCksIGNvbXBvbmVudEluc3RhbmNlKSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY2FsY3VsYXRlQ29tcG9zaXRpb25Qb3NpdGlvbihpbnQgY2VudGVyLCBkb3VibGUgcmVsYXRpdmVQb3NpdGlvbiwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UpIHsKKwkJZmluYWwgZG91YmxlIHRvcExlZnRDYW52YXNQb3NpdGlvbiA9IGNlbnRlciArIHJlbGF0aXZlUG9zaXRpb24gKiBDb21wb3NpdGlvbkJ1c2luZXNzTG9naWMuU1BBQ0VfQkVUV0VFTl9FTEVNRU5UUzsKKwkJZG91YmxlIG9mZnNldGVkQ2FudmFzUG9zaXRpb247CisJCXN3aXRjaCAoY29tcG9uZW50SW5zdGFuY2UuZ2V0T3JpZ2luVHlwZSgpKSB7CisJCWNhc2UgQ1A6CisJCQlvZmZzZXRlZENhbnZhc1Bvc2l0aW9uID0gdG9wTGVmdENhbnZhc1Bvc2l0aW9uIC0gQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljLkNQX0NBTlZBU19FTEVNRU5UX1NJWkUgLyAyOworCQkJYnJlYWs7CisJCWNhc2UgVkw6CisJCQlvZmZzZXRlZENhbnZhc1Bvc2l0aW9uID0gdG9wTGVmdENhbnZhc1Bvc2l0aW9uIC0gQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljLkNQX0NBTlZBU19FTEVNRU5UX1NJWkUgLyAyOworCQkJYnJlYWs7CisJCWNhc2UgVkY6CisJCQlvZmZzZXRlZENhbnZhc1Bvc2l0aW9uID0gdG9wTGVmdENhbnZhc1Bvc2l0aW9uIC0gQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljLlZGQ19DQU5WQVNfRUxFTUVOVF9TSVpFIC8gMjsKKwkJCWJyZWFrOworCQljYXNlIFZGQzoKKwkJCW9mZnNldGVkQ2FudmFzUG9zaXRpb24gPSB0b3BMZWZ0Q2FudmFzUG9zaXRpb24gLSBDb21wb3NpdGlvbkJ1c2luZXNzTG9naWMuVkZDX0NBTlZBU19FTEVNRU5UX1NJWkUgLyAyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvZmZzZXRlZENhbnZhc1Bvc2l0aW9uID0gdG9wTGVmdENhbnZhc1Bvc2l0aW9uIC0gQ29tcG9zaXRpb25CdXNpbmVzc0xvZ2ljLlZGQ19DQU5WQVNfRUxFTUVOVF9TSVpFIC8gMjsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBTdHJpbmcudmFsdWVPZihvZmZzZXRlZENhbnZhc1Bvc2l0aW9uKTsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwPEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+LCBDb21wb25lbnRJbnN0YW5jZT4gYnVpbGRTcGlyYWxQYXR0ZXJuUG9zaXRpb25pbmdGb3JDb21wb25lbnRJbnN0YW5jZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworCQlNYXA8SW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4sIENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZUxvY2F0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY29tcG9uZW50SW5zdGFuY2VzLmFkZEFsbChyZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSk7CisJCU1hcDxDb21wb25lbnRJbnN0YW5jZSwgTGlzdDxDb21wb25lbnRJbnN0YW5jZT4+IGNvbm5lY3RlZGVkQ3BzID0gZ2V0Q3BzQ29ubmVjdGVkVG9WRkMoY29tcG9uZW50SW5zdGFuY2VzLCByZXNvdXJjZSk7CisJCS8vIFJlbW92ZSBhbGwgY3AgdGhhdCBhcmUgY29ubmVjdGVkIGZyb20gdGhlIGxpc3QKKwkJY29tcG9uZW50SW5zdGFuY2VzLnJlbW92ZUFsbChjb25uZWN0ZWRlZENwcy52YWx1ZXMoKS5zdHJlYW0oKS5mbGF0TWFwKGUgLT4gZS5zdHJlYW0oKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisKKwkJYnVpbGRTcGlyYWxQYXR0ZXJuRm9yTWFqb3JDb21wb25lbnRzKGNvbXBvbmVudEluc3RhbmNlTG9jYXRpb25zLCBjb21wb25lbnRJbnN0YW5jZXMpOworCQlidWlsZENpcmNsZVBhdHRlcm5Gb3JDcHMoY29tcG9uZW50SW5zdGFuY2VMb2NhdGlvbnMsIGNvbm5lY3RlZGVkQ3BzKTsKKworCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2VMb2NhdGlvbnM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYnVpbGRDaXJjbGVQYXR0ZXJuRm9yQ3BzKE1hcDxJbW11dGFibGVQYWlyPERvdWJsZSwgRG91YmxlPiwgQ29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RMb2NhdGlvbnMsIE1hcDxDb21wb25lbnRJbnN0YW5jZSwgTGlzdDxDb21wb25lbnRJbnN0YW5jZT4+IGNvbm5lY3RlZENwcykgeworCisJCWZvciAoRW50cnk8Q29tcG9uZW50SW5zdGFuY2UsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+PiB2ZmNDcExpc3QgOiBjb25uZWN0ZWRDcHMuZW50cnlTZXQoKSkgeworCQkJRW50cnk8SW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4sIENvbXBvbmVudEluc3RhbmNlPiB2ZmNPZlRoZUNwcyA9IGNvbXBvbmVudEluc3RMb2NhdGlvbnMuZW50cnlTZXQoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFZhbHVlKCkuZ2V0VW5pcXVlSWQoKS5lcXVhbHModmZjQ3BMaXN0LmdldEtleSgpLmdldFVuaXF1ZUlkKCkpKS5maW5kQW55KCkuZ2V0KCk7CisJCQlidWlsZENpcmNsZVBhdHRlcm5Gb3JPbmVHcm91cE9mQ3BzKHZmY09mVGhlQ3BzLmdldEtleSgpLCB2ZmNDcExpc3QuZ2V0VmFsdWUoKSwgY29tcG9uZW50SW5zdExvY2F0aW9ucyk7CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZENpcmNsZVBhdHRlcm5Gb3JPbmVHcm91cE9mQ3BzKEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+IHZmY0xvY2F0aW9uLCBMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjcHNHcm91cCwgTWFwPEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+LCBDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdExvY2F0aW9ucykgeworCQlmaW5hbCBpbnQgbnVtYmVyT2ZDcHMgPSBjcHNHcm91cC5zaXplKCk7CisJCWRvdWJsZSBhbmdsZUJldHdlZW5DcHMgPSAoIWNwc0dyb3VwLmlzRW1wdHkoKSkgPyBNYXRoLnRvUmFkaWFucygzNjApIC8gbnVtYmVyT2ZDcHMgOiAwOworCQlkb3VibGUgY3VycmVudEFuZ2xlID0gMDsKKwkJRG91YmxlIHhDZW50ZXIgPSB2ZmNMb2NhdGlvbi5nZXRMZWZ0KCk7CisJCURvdWJsZSB5Q2VudGVyID0gdmZjTG9jYXRpb24uZ2V0UmlnaHQoKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjdXJyQ3AgOiBjcHNHcm91cCkgeworCQkJZG91YmxlIGNwWHBvc2l0aW9uID0geENlbnRlciArIENvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYy5DUF9SQURJVVNfRkFDVE9SICogTWF0aC5jb3MoY3VycmVudEFuZ2xlKTsKKwkJCWRvdWJsZSBjcFlwb3NpdGlvbiA9IHlDZW50ZXIgKyBDb21wb3NpdGlvbkJ1c2luZXNzTG9naWMuQ1BfUkFESVVTX0ZBQ1RPUiAqIE1hdGguc2luKGN1cnJlbnRBbmdsZSk7CisJCQljb21wb25lbnRJbnN0TG9jYXRpb25zLnB1dChuZXcgSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4oY3BYcG9zaXRpb24sIGNwWXBvc2l0aW9uKSwgY3VyckNwKTsKKwkJCWN1cnJlbnRBbmdsZSArPSBhbmdsZUJldHdlZW5DcHM7CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZFNwaXJhbFBhdHRlcm5Gb3JNYWpvckNvbXBvbmVudHMoTWFwPEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+LCBDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VMb2NhdGlvbnMsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcykgeworCQlpbnQgZWxlbWVudHNDb3VudGVyID0gMDsKKwkJSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4gY3VyclBsYWNlbWVudDsKKwkJSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4gcHJldlBsYWNlbWVudCA9IG51bGw7CisJCVJlbGF0aXZlUG9zaXRpb24gcmVsYXRpb25Ub1ByZXZFbGVtZW50ID0gbnVsbDsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjdXJyIDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQllbGVtZW50c0NvdW50ZXIrKzsKKwkJCWlmIChlbGVtZW50c0NvdW50ZXIgPT0gMSkgeworCQkJCWN1cnJQbGFjZW1lbnQgPSBuZXcgSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4oMEQsIDBEKTsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudHNDb3VudGVyID09IDIpIHsKKwkJCQljdXJyUGxhY2VtZW50ID0gbmV3IEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+KC0xRCwgMEQpOworCQkJCXJlbGF0aW9uVG9QcmV2RWxlbWVudCA9IFJlbGF0aXZlUG9zaXRpb24uTEVGVDsKKwkJCX0gZWxzZSB7CisJCQkJcmVsYXRpb25Ub1ByZXZFbGVtZW50ID0gZ2V0UmVsYXRpdmVQb3NpdGlvbkZvckN1cnJlbnRFbGVtZW50KGNvbXBvbmVudEluc3RhbmNlTG9jYXRpb25zLCByZWxhdGlvblRvUHJldkVsZW1lbnQsIHByZXZQbGFjZW1lbnQpOworCQkJCWN1cnJQbGFjZW1lbnQgPSBnZXRSZWxhdGl2ZUVsZW1lbnRMb2NhdGlvbihwcmV2UGxhY2VtZW50LCByZWxhdGlvblRvUHJldkVsZW1lbnQpOworCisJCQl9CisKKwkJCWNvbXBvbmVudEluc3RhbmNlTG9jYXRpb25zLnB1dChjdXJyUGxhY2VtZW50LCBjdXJyKTsKKwkJCXByZXZQbGFjZW1lbnQgPSBjdXJyUGxhY2VtZW50OworCQl9CisJfQorCisJcHJvdGVjdGVkIE1hcDxDb21wb25lbnRJbnN0YW5jZSwgTGlzdDxDb21wb25lbnRJbnN0YW5jZT4+IGdldENwc0Nvbm5lY3RlZFRvVkZDKExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGFsbENvbXBvbmVudEluc3RhbmNlcywgUmVzb3VyY2UgdmYpIHsKKwkJTWFwPENvbXBvbmVudEluc3RhbmNlLCBMaXN0PENvbXBvbmVudEluc3RhbmNlPj4gdmZjV2l0aEl0c0NwcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IGFsbFJlbGF0aW9ucyA9IHZmLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpOworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGN1cnIgOiBhbGxDb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCS8vIEZpbHRlcnMgT25seSBDUHMKKwkJCWlmIChjdXJyLmdldE9yaWdpblR5cGUoKSA9PSBPcmlnaW5UeXBlRW51bS5DUCkgeworCQkJCS8vIExpc3QgT2YgZWxlbWVudHMgdGhlIENQIGlzIGNvbm5lY3RlZCB0bworCQkJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiBjb25uZWN0ZWRUb0xpc3QgPSBhbGxSZWxhdGlvbnMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRGcm9tTm9kZSgpLmVxdWFscyhjdXJyLmdldFVuaXF1ZUlkKCkpIHx8IHAuZ2V0VG9Ob2RlKCkuZXF1YWxzKGN1cnIuZ2V0VW5pcXVlSWQoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkJLy8gQWRkcyBPbmx5IENQcyBXaGljaCBhcmUgY29ubmVjdGVkIHRvIFZGQworCQkJCWZpbHRlckNwQ29ubmVjdGVkVG9WRkMoYWxsQ29tcG9uZW50SW5zdGFuY2VzLCB2ZmNXaXRoSXRzQ3BzLCBjdXJyLCBjb25uZWN0ZWRUb0xpc3QpOworCQkJfQorCQl9CisJCXJldHVybiB2ZmNXaXRoSXRzQ3BzOworCX0KKworCXByaXZhdGUgdm9pZCBmaWx0ZXJDcENvbm5lY3RlZFRvVkZDKExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGFsbENvbXBvbmVudEluc3RhbmNlcywgTWFwPENvbXBvbmVudEluc3RhbmNlLCBMaXN0PENvbXBvbmVudEluc3RhbmNlPj4gdmZjV2l0aEl0c0NwcywgQ29tcG9uZW50SW5zdGFuY2UgY3VyckNQLCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gY29ubmVjdGVkVG9UaGVDUExpc3QpIHsKKwkJaWYgKCFjb25uZWN0ZWRUb1RoZUNQTGlzdC5pc0VtcHR5KCkpIHsKKwkJCS8vIFNldCBPZiBJZHMgT2YgY29tcG9uZW50cyBJbnN0YW5jZXMgd2hpY2ggYXJlIGNvbm5lY3RlZCBjZXJ0YWluIENQCisJCQlTZXQ8U3RyaW5nPiBtYXRlSWRzID0gY29ubmVjdGVkVG9UaGVDUExpc3Quc3RyZWFtKCkubWFwKGNwUmVsYXRpb24gLT4gY3BSZWxhdGlvbi5nZXRGcm9tTm9kZSgpLmVxdWFscyhjdXJyQ1AuZ2V0VW5pcXVlSWQoKSkgPyBjcFJlbGF0aW9uLmdldFRvTm9kZSgpIDogY3BSZWxhdGlvbi5nZXRGcm9tTm9kZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisKKwkJCS8vIFZmYyBDb21wb25lbnQgaW5zdGFuY2UgQ29ubmVjdGVkIHRvIHRoZSBDUAorCQkJT3B0aW9uYWw8Q29tcG9uZW50SW5zdGFuY2U+IG9wdGlvbmFsVmZjQ29ubmVjdGVkVG9DUCA9IGFsbENvbXBvbmVudEluc3RhbmNlcy5zdHJlYW0oKS4KKwkJCS8vIEFsbCBpbnN0YW5jZXMgY29ubmVjdGVkIHRvIENQCisJCQkJCWZpbHRlcihwIC0+IG1hdGVJZHMuY29udGFpbnMocC5nZXRVbmlxdWVJZCgpKSkuCisJCQkJCS8vIEZpbHRlciBpbiBvbmx5IFZGQyBjb25uZWN0ZWQgdG8gdGhlIENQCisJCQkJCWZpbHRlcihwIC0+IHAuZ2V0T3JpZ2luVHlwZSgpID09IE9yaWdpblR5cGVFbnVtLlZGQykuZmluZEFueSgpOworCisJCQlpZiAob3B0aW9uYWxWZmNDb25uZWN0ZWRUb0NQLmlzUHJlc2VudCgpKSB7CisJCQkJZmluYWwgQ29tcG9uZW50SW5zdGFuY2UgdmZjV2l0aENwcyA9IG9wdGlvbmFsVmZjQ29ubmVjdGVkVG9DUC5nZXQoKTsKKwkJCQlpZiAodmZjV2l0aEl0c0Nwcy5jb250YWluc0tleSh2ZmNXaXRoQ3BzKSkgeworCQkJCQl2ZmNXaXRoSXRzQ3BzLmdldCh2ZmNXaXRoQ3BzKS5hZGQoY3VyckNQKTsKKwkJCQl9IGVsc2UgeworCQkJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjcHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJCWNwc0xpc3QuYWRkKGN1cnJDUCk7CisJCQkJCXZmY1dpdGhJdHNDcHMucHV0KHZmY1dpdGhDcHMsIGNwc0xpc3QpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgUmVsYXRpdmVQb3NpdGlvbiBnZXRSZWxhdGl2ZVBvc2l0aW9uRm9yQ3VycmVudEVsZW1lbnQoTWFwPEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+LCBDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VMb2NhdGlvbnMsIFJlbGF0aXZlUG9zaXRpb24gcmVsYXRpb25Ub1ByZXZFbGVtZW50LCBJbW11dGFibGVQYWlyPERvdWJsZSwgRG91YmxlPiBwcmV2UGxhY2VtZW50KSB7CisJCXN3aXRjaCAocmVsYXRpb25Ub1ByZXZFbGVtZW50KSB7CisJCWNhc2UgTEVGVDogeworCQkJYm9vbGVhbiBpc09jY3VwaWVkID0gaXNBZGphY2VudEVsZW1lbnRPY2N1cGllZChwcmV2UGxhY2VtZW50LCBSZWxhdGl2ZVBvc2l0aW9uLlVQLCBjb21wb25lbnRJbnN0YW5jZUxvY2F0aW9ucyk7CisJCQlyZWxhdGlvblRvUHJldkVsZW1lbnQgPSBpc09jY3VwaWVkID8gUmVsYXRpdmVQb3NpdGlvbi5MRUZUIDogUmVsYXRpdmVQb3NpdGlvbi5VUDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUklHSFQ6IHsKKwkJCWJvb2xlYW4gaXNPY2N1cGllZCA9IGlzQWRqYWNlbnRFbGVtZW50T2NjdXBpZWQocHJldlBsYWNlbWVudCwgUmVsYXRpdmVQb3NpdGlvbi5ET1dOLCBjb21wb25lbnRJbnN0YW5jZUxvY2F0aW9ucyk7CisJCQlyZWxhdGlvblRvUHJldkVsZW1lbnQgPSBpc09jY3VwaWVkID8gUmVsYXRpdmVQb3NpdGlvbi5SSUdIVCA6IFJlbGF0aXZlUG9zaXRpb24uRE9XTjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVVA6IHsKKwkJCWJvb2xlYW4gaXNPY2N1cGllZCA9IGlzQWRqYWNlbnRFbGVtZW50T2NjdXBpZWQocHJldlBsYWNlbWVudCwgUmVsYXRpdmVQb3NpdGlvbi5SSUdIVCwgY29tcG9uZW50SW5zdGFuY2VMb2NhdGlvbnMpOworCQkJcmVsYXRpb25Ub1ByZXZFbGVtZW50ID0gaXNPY2N1cGllZCA/IFJlbGF0aXZlUG9zaXRpb24uVVAgOiBSZWxhdGl2ZVBvc2l0aW9uLlJJR0hUOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBET1dOOiB7CisJCQlib29sZWFuIGlzT2NjdXBpZWQgPSBpc0FkamFjZW50RWxlbWVudE9jY3VwaWVkKHByZXZQbGFjZW1lbnQsIFJlbGF0aXZlUG9zaXRpb24uTEVGVCwgY29tcG9uZW50SW5zdGFuY2VMb2NhdGlvbnMpOworCQkJcmVsYXRpb25Ub1ByZXZFbGVtZW50ID0gaXNPY2N1cGllZCA/IFJlbGF0aXZlUG9zaXRpb24uRE9XTiA6IFJlbGF0aXZlUG9zaXRpb24uTEVGVDsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisJCX0KKwkJcmV0dXJuIHJlbGF0aW9uVG9QcmV2RWxlbWVudDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNBZGphY2VudEVsZW1lbnRPY2N1cGllZChJbW11dGFibGVQYWlyPERvdWJsZSwgRG91YmxlPiBjdXJyRWxlbWVudCwgUmVsYXRpdmVQb3NpdGlvbiBhZGphY2VudEVsZW1lbnRSZWxhdGlvblRvQ3VyckVsZW1lbnQsIE1hcDxJbW11dGFibGVQYWlyPERvdWJsZSwgRG91YmxlPiwgQ29tcG9uZW50SW5zdGFuY2U+IGFsbEVsZW1lbnRzKSB7CisKKwkJSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4gYWRqYWNlbnRFbGVtZW50UG9zaXRpb24gPSBnZXRSZWxhdGl2ZUVsZW1lbnRMb2NhdGlvbihjdXJyRWxlbWVudCwgYWRqYWNlbnRFbGVtZW50UmVsYXRpb25Ub0N1cnJFbGVtZW50KTsKKwkJcmV0dXJuIGFsbEVsZW1lbnRzLmNvbnRhaW5zS2V5KGFkamFjZW50RWxlbWVudFBvc2l0aW9uKTsKKwl9CisKKwlwcml2YXRlIEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+IGdldFJlbGF0aXZlRWxlbWVudExvY2F0aW9uKEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+IGN1cnJFbGVtZW50LCBSZWxhdGl2ZVBvc2l0aW9uIHJlbGF0aXZlTG9jYXRpb24pIHsKKwkJSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4gcmVsYXRpdmVFbGVtZW50UG9zaXRpb247CisJCXN3aXRjaCAocmVsYXRpdmVMb2NhdGlvbikgeworCisJCWNhc2UgTEVGVDogeworCQkJcmVsYXRpdmVFbGVtZW50UG9zaXRpb24gPSBuZXcgSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4oY3VyckVsZW1lbnQuZ2V0TGVmdCgpIC0gMSwgY3VyckVsZW1lbnQuZ2V0UmlnaHQoKSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFJJR0hUOiB7CisJCQlyZWxhdGl2ZUVsZW1lbnRQb3NpdGlvbiA9IG5ldyBJbW11dGFibGVQYWlyPERvdWJsZSwgRG91YmxlPihjdXJyRWxlbWVudC5nZXRMZWZ0KCkgKyAxLCBjdXJyRWxlbWVudC5nZXRSaWdodCgpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVVA6IHsKKwkJCXJlbGF0aXZlRWxlbWVudFBvc2l0aW9uID0gbmV3IEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+KGN1cnJFbGVtZW50LmdldExlZnQoKSwgY3VyckVsZW1lbnQuZ2V0UmlnaHQoKSArIDEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBET1dOOiB7CisJCQlyZWxhdGl2ZUVsZW1lbnRQb3NpdGlvbiA9IG5ldyBJbW11dGFibGVQYWlyPERvdWJsZSwgRG91YmxlPihjdXJyRWxlbWVudC5nZXRMZWZ0KCksIGN1cnJFbGVtZW50LmdldFJpZ2h0KCkgLSAxKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisJCX0KKwkJcmV0dXJuIHJlbGF0aXZlRWxlbWVudFBvc2l0aW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Db25zdW1lckJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29uc3VtZXJCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2MjI1YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ29uc3VtZXJCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29uc3VtZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUdyYXBoTG9ja09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Db25zdW1lck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db25zdW1lckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuSVVzZXJCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoIkNvbnN1bWVyQnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgQ29uc3VtZXJCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQmFzZUJ1c2luZXNzTG9naWMgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNVTUVSX05BTUUgPSAiQ29uc3VtZXIgbmFtZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNVTUVSX1NBTFQgPSAiQ29uc3VtZXIgc2FsdCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNVTUVSX1BXID0gIkNvbnN1bWVyIHBhc3N3b3JkIjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHM7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29uc3VtZXJPcGVyYXRpb24gY29uc3VtZXJPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSUdyYXBoTG9ja09wZXJhdGlvbiBncmFwaExvY2tPcGVyYXRpb247CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29uc3VtZXJCdXNpbmVzc0xvZ2ljLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUNvbnN1bWVyKFVzZXIgdXNlciwgQ29uc3VtZXJEZWZpbml0aW9uIGNvbnN1bWVyKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB1c2VyVmFsaWRhdGlvbiA9IHZhbGlkYXRlVXNlcih1c2VyLCBjb25zdW1lciwgQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKworCQlpZiAodXNlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVzZXJWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJY2hlY2tGaWVsZHNGb3JPdmVycmlkZUF0dGVtcHQoY29uc3VtZXIpOworCQl1c2VyID0gdXNlclZhbGlkYXRpb24ubGVmdCgpLnZhbHVlKCk7CisJCWNvbnN1bWVyLnNldExhc3RNb2RmaWVyQXR1aWQodXNlci5nZXRVc2VySWQoKSk7CisKKwkJRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNvbnN1bWVyVmFsaWRhdGlvblJlc3BvbnNlID0gdmFsaWRhdGVDb25zdW1lcihjb25zdW1lciwgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTKTsKKwkJaWYgKGNvbnN1bWVyVmFsaWRhdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb25zdW1lclZhbGlkYXRpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb25zdW1lckNyZWRlbnRpYWxzRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lciwgcmVzcG9uc2VGb3JtYXQsIHVzZXIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJU3RyaW5nIGNvbnN1bWVyTmFtZSA9IGNvbnN1bWVyLmdldENvbnN1bWVyTmFtZSgpOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tSZXN1bHQgPSBncmFwaExvY2tPcGVyYXRpb24ubG9ja0NvbXBvbmVudChjb25zdW1lck5hbWUsIE5vZGVUeXBlRW51bS5Db25zdW1lckNyZWRlbnRpYWxzKTsKKwkJaWYgKCFsb2NrUmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkTG9ja09iamVjdEVycm9yLCAiY3JlYXRlQ29uc3VtZXIiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZExvY2tPYmplY3RFcnJvcigiY3JlYXRlQ29uc3VtZXIiLCBOb2RlVHlwZUVudW0uQ29uc3VtZXJDcmVkZW50aWFscy5nZXROYW1lKCksIGNvbnN1bWVyTmFtZSk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBsb2NrIGNvbnN1bWVyIHt9IGVycm9yIC0ge30iLCBjb25zdW1lck5hbWUsIGxvY2tSZXN1bHQpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb25zdW1lckNyZWRlbnRpYWxzRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lciwgcmVzcG9uc2VGb3JtYXQsIHVzZXIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJdHJ5IHsKKwkJCUVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc3BvbnNlID0gY29uc3VtZXJPcGVyYXRpb24uZ2V0Q3JlZGVudGlhbHMoY29uc3VtZXJOYW1lKTsKKwkJCWlmIChnZXRSZXNwb25zZS5pc0xlZnQoKSAmJiBnZXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHVwZGF0ZUNvbnN1bWVyKGNvbnN1bWVyLCB1c2VyLCB0cnVlKTsKKwkJCX0KKworCQkJRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKKwkJCWNvbnN1bWVyLnNldENvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZShkYXRlLmdldFRpbWUoKSk7CisJCQljb25zdW1lci5zZXRDb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUoTG9uZy52YWx1ZU9mKDApKTsKKworCQkJRWl0aGVyPENvbnN1bWVyRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzcG9uc2UgPSBjb25zdW1lck9wZXJhdGlvbi5jcmVhdGVDcmVkZW50aWFscyhuZXcgQ29uc3VtZXJEYXRhKGNvbnN1bWVyKSk7CisKKwkJCWlmIChjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JDb25zdW1lcihjcmVhdGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb25zdW1lckNyZWRlbnRpYWxzRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lciwgcmVzcG9uc2VGb3JtYXQsIHVzZXIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJbG9nLmRlYnVnKCJDb25zdW1lciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEhISIpOworCQkJY29uc3VtZXIgPSBuZXcgQ29uc3VtZXJEZWZpbml0aW9uKGNyZWF0ZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpLmdldENvbnN1bWVyRGF0YURlZmluaXRpb24oKSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1JFQVRFRCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb25zdW1lckNyZWRlbnRpYWxzRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCBjb25zdW1lciwgcmVzcG9uc2VGb3JtYXQsIHVzZXIpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnN1bWVyKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoY29uc3VtZXJOYW1lLCBOb2RlVHlwZUVudW0uQ29uc3VtZXJDcmVkZW50aWFscyk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyKFVzZXIgdXNlciwgQ29uc3VtZXJEZWZpbml0aW9uIGNvbnN1bWVyLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRBY3Rpb24pIHsKKworCQlpZiAodXNlci5nZXRVc2VySWQoKSA9PSBudWxsIHx8IHVzZXIuZ2V0VXNlcklkKCkudHJpbSgpLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJjcmVhdGVFY29tcFVzZXIgbWV0aG9kIC0gdXNlciBpcyBtaXNzaW5nLiB1c2VySWQ9e30iLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OKTsKKwkJCWxvZy5kZWJ1ZygiYXVkaXQgYmVmb3JlIHNlbmRpbmcgcmVzcG9uc2UiKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbnN1bWVyQ3JlZGVudGlhbHNFdmVudChhdWRpdEFjdGlvbiwgY29uc3VtZXIsIHJlc3BvbnNlRm9ybWF0LCB1c2VyKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCWxvZy5kZWJ1ZygiZ2V0IHVzZXIgZnJvbSBEQiIpOworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdG9yID0gdXNlckFkbWluLmdldFVzZXIodXNlci5nZXRVc2VySWQoKSwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkgfHwgZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoImNyZWF0ZUVjb21wVXNlciBtZXRob2QgLSB1c2VyIGlzIG5vdCBsaXN0ZWQuIHVzZXJJZD17fSIsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfQUNDRVNTKTsKKwkJCWxvZy5kZWJ1ZygiYXVkaXQgYmVmb3JlIHNlbmRpbmcgcmVzcG9uc2UiKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbnN1bWVyQ3JlZGVudGlhbHNFdmVudChhdWRpdEFjdGlvbiwgY29uc3VtZXIsIHJlc3BvbnNlRm9ybWF0LCB1c2VyKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJdXNlciA9IGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCk7CisJCS8vIHZhbGlkYXRlIHVzZXIgcm9sZQorCQlsb2cuZGVidWcoInZhbGlkYXRlIHVzZXIgcm9sZSIpOworCQlpZiAoIXVzZXIuZ2V0Um9sZSgpLmVxdWFscyhSb2xlLkFETUlOLm5hbWUoKSkpIHsKKwkJCWxvZy5pbmZvKCJyb2xlIHt9IGlzIG5vdCBhbGxvd2VkIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24iLCB1c2VyLmdldFJvbGUoKSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJbG9nLmRlYnVnKCJhdWRpdCBiZWZvcmUgc2VuZGluZyByZXNwb25zZSIpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29uc3VtZXJDcmVkZW50aWFsc0V2ZW50KGF1ZGl0QWN0aW9uLCBjb25zdW1lciwgcmVzcG9uc2VGb3JtYXQsIHVzZXIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHVzZXIpOworCX0KKworCXByaXZhdGUgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29uc3VtZXIoQ29uc3VtZXJEZWZpbml0aW9uIGNvbnN1bWVyLCBVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRhdGluZ0FjdGlvbikgeworCQlFaXRoZXI8Q29uc3VtZXJEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb25zdW1lck5hbWUgPSB2YWxpZGF0ZUNvbnN1bWVyTmFtZShjb25zdW1lcik7CisJCWlmICh2YWxpZGF0ZUNvbnN1bWVyTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDb25zdW1lck5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlFaXRoZXI8Q29uc3VtZXJEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb25zdW1lclBhc3N3b3JkID0gdmFsaWRhdGVDb25zdW1lclBhc3N3b3JkKGNvbnN1bWVyKTsKKwkJaWYgKHZhbGlkYXRlQ29uc3VtZXJQYXNzd29yZC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVDb25zdW1lclBhc3N3b3JkLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJY29uc3VtZXIgPSB2YWxpZGF0ZUNvbnN1bWVyUGFzc3dvcmQubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxDb25zdW1lckRlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUVjb21wVXNlclNhbHQgPSB2YWxpZGF0ZUNvbnN1bWVyU2FsdChjb25zdW1lcik7CisJCWlmICh2YWxpZGF0ZUVjb21wVXNlclNhbHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlRWNvbXBVc2VyU2FsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjb25zdW1lcik7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb25zdW1lckRlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbnN1bWVyTmFtZShDb25zdW1lckRlZmluaXRpb24gY29uc3VtZXIpIHsKKwkJU3RyaW5nIG5hbWUgPSBjb25zdW1lci5nZXRDb25zdW1lck5hbWUoKTsKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eShuYW1lKSkgeworCQkJbG9nLmRlYnVnKCJDb25zdW1lciBuYW1lIGNhbm5vdCBiZSBlbXB0eS4iKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEsIENPTlNVTUVSX05BTUUpKTsKKwkJfQorCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyTmFtZShuYW1lKSkgeworCQkJbG9nLmRlYnVnKCJDb25zdW1lciBuYW1lIGlzIGludmFsaWQuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UX1BBUkFNLCBDT05TVU1FUl9OQU1FKSk7CisJCX0KKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVMZW5ndGgobmFtZSwgVmFsaWRhdGlvblV0aWxzLkNPTlNVTUVSX05BTUVfTUFYX0xFTkdUSCkpIHsKKwkJCWxvZy5kZWJ1ZygiQ29uc3VtZXIgbmFtZSBleGNlZWRzIGxpbWl0LiIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkVYQ0VFRFNfTElNSVQsIENPTlNVTUVSX05BTUUsIFN0cmluZy52YWx1ZU9mKFZhbGlkYXRpb25VdGlscy5DT05TVU1FUl9OQU1FX01BWF9MRU5HVEgpKSk7CisJCX0KKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMuaXNVVEY4U3RyKG5hbWUpKSB7CisJCQlsb2cuZGVidWcoIkNvbnN1bWVyIG5hbWUgaW5jbHVkZXMgbm9uIFVURiA4IGNoYXJhY3RlcnMuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UX1BBUkFNLCBDT05TVU1FUl9OQU1FKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29uc3VtZXIpOworCX0KKworCXByaXZhdGUgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29uc3VtZXJQYXNzd29yZChDb25zdW1lckRlZmluaXRpb24gY29uc3VtZXIpIHsKKwkJU3RyaW5nIHBhc3N3b3JkID0gY29uc3VtZXIuZ2V0Q29uc3VtZXJQYXNzd29yZCgpOworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KHBhc3N3b3JkKSkgeworCQkJbG9nLmRlYnVnKCJDb25zdW1lciBwYXNzd29yZCBjYW5ub3QgYmUgZW1wdHkuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19EQVRBLCBDT05TVU1FUl9QVykpOworCQl9CisJCWlmIChwYXNzd29yZC5sZW5ndGgoKSAhPSBWYWxpZGF0aW9uVXRpbHMuQ09OU1VNRVJfUEFTU1dPUkRfTEVOR1RIKSB7CisJCQlsb2cuZGVidWcoIkNvbnN1bWVyIHBhc3N3b3JkIGxlbmd0aCBpcyBub3QgdmFsaWQuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9MRU5HVEgsIENPTlNVTUVSX1BXKSk7CisJCX0KKwkJY29uc3VtZXIuc2V0Q29uc3VtZXJQYXNzd29yZChwYXNzd29yZC50b0xvd2VyQ2FzZSgpKTsKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb25zdW1lclBhc3NTYWx0KGNvbnN1bWVyLmdldENvbnN1bWVyUGFzc3dvcmQoKSkpIHsKKwkJCWxvZy5kZWJ1ZygiQ29uc3VtZXIgcGFzc3dvcmQgaXMgaW52YWxpZC4iKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlRfUEFSQU0sIENPTlNVTUVSX1BXKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29uc3VtZXIpOworCX0KKworCXByaXZhdGUgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29uc3VtZXJTYWx0KENvbnN1bWVyRGVmaW5pdGlvbiBjb25zdW1lcikgeworCQlTdHJpbmcgc2FsdCA9IGNvbnN1bWVyLmdldENvbnN1bWVyU2FsdCgpOworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KHNhbHQpKSB7CisJCQlsb2cuZGVidWcoIkNvbnN1bWVyIHNhbHQgY2Fubm90IGJlIGVtcHR5LiIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREFUQSwgQ09OU1VNRVJfU0FMVCkpOworCQl9CisJCWlmIChzYWx0Lmxlbmd0aCgpICE9IFZhbGlkYXRpb25VdGlscy5DT05TVU1FUl9TQUxUX0xFTkdUSCkgeworCQkJbG9nLmRlYnVnKCJDb25zdW1lciBzYWx0IGxlbmd0aCBpcyBub3QgdmFsaWQuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9MRU5HVEgsIENPTlNVTUVSX1NBTFQpKTsKKwkJfQorCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyUGFzc1NhbHQoc2FsdCkpIHsKKwkJCWxvZy5kZWJ1ZygiQ29uc3VtZXIgc2FsdCBpcyBpbnZhbGlkLiIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVF9QQVJBTSwgQ09OU1VNRVJfU0FMVCkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnN1bWVyKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGdldENvbnN1bWVyKFN0cmluZyBjb25zdW1lcklkLCBVc2VyIHVzZXIpIHsKKwkJQ29uc3VtZXJEZWZpbml0aW9uIHRtcENvbnN1bWVyID0gbmV3IENvbnN1bWVyRGVmaW5pdGlvbigpOworCQl0bXBDb25zdW1lci5zZXRDb25zdW1lck5hbWUoY29uc3VtZXJJZCk7CisJCS8vIEluIGNhc2Ugb2YgZmlsdGVyIChzb3V0aGJvdW5kKSBjYWxsCisJCWlmICh1c2VyICE9IG51bGwpIHsKKwkJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdXNlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVVzZXIodXNlciwgdG1wQ29uc3VtZXIsIEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCQlpZiAodXNlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh1c2VyVmFsaWRhdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJdXNlciA9IHVzZXJWYWxpZGF0aW9uLmxlZnQoKS52YWx1ZSgpOworCQl9CisJCUVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc3VsdCA9IGNvbnN1bWVyT3BlcmF0aW9uLmdldENyZWRlbnRpYWxzKGNvbnN1bWVySWQpOworCQlpZiAoZ2V0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJQWN0aW9uU3RhdHVzIGFjdGlvbiA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckNvbnN1bWVyKGdldFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCQlpZiAoYWN0aW9uID09IEFjdGlvblN0YXR1cy5FQ09NUF9VU0VSX05PVF9GT1VORCkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvbiwgY29uc3VtZXJJZCk7CisJCQl9IGVsc2UgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvbik7CisJCQl9CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb25zdW1lckNyZWRlbnRpYWxzRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCB0bXBDb25zdW1lciwgcmVzcG9uc2VGb3JtYXQsIHVzZXIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJQ29uc3VtZXJEZWZpbml0aW9uIGNvbnN1bWVyID0gbmV3IENvbnN1bWVyRGVmaW5pdGlvbihnZXRSZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0Q29uc3VtZXJEYXRhRGVmaW5pdGlvbigpKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29uc3VtZXJDcmVkZW50aWFsc0V2ZW50KEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXIsIHJlc3BvbnNlRm9ybWF0LCB1c2VyKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnN1bWVyKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGdldENvbnN1bWVyKFN0cmluZyBjb25zdW1lcklkKSB7CisJCXJldHVybiBnZXRDb25zdW1lcihjb25zdW1lcklkLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZUNvbnN1bWVyKFN0cmluZyBjb25zdW1lcklkLCBVc2VyIHVzZXIpIHsKKwkJQ29uc3VtZXJEZWZpbml0aW9uIHRtcENvbnN1bWVyID0gbmV3IENvbnN1bWVyRGVmaW5pdGlvbigpOworCQl0bXBDb25zdW1lci5zZXRDb25zdW1lck5hbWUoY29uc3VtZXJJZCk7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdXNlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVVzZXIodXNlciwgdG1wQ29uc3VtZXIsIEF1ZGl0aW5nQWN0aW9uRW51bS5ERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUyk7CisJCWlmICh1c2VyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodXNlclZhbGlkYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl1c2VyID0gdXNlclZhbGlkYXRpb24ubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlc3VsdCA9IGNvbnN1bWVyT3BlcmF0aW9uLmRlbGV0ZUNyZWRlbnRpYWxzKGNvbnN1bWVySWQpOworCQlpZiAoZGVsZXRlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJQWN0aW9uU3RhdHVzIGFjdGlvbiA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckNvbnN1bWVyKGRlbGV0ZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCQlpZiAoYWN0aW9uID09IEFjdGlvblN0YXR1cy5FQ09NUF9VU0VSX05PVF9GT1VORCkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvbiwgY29uc3VtZXJJZCk7CisJCQl9IGVsc2UgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvbik7CisJCQl9CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb25zdW1lckNyZWRlbnRpYWxzRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkRFTEVURV9FQ09NUF9VU0VSX0NSRURFTlRJQUxTLCB0bXBDb25zdW1lciwgcmVzcG9uc2VGb3JtYXQsIHVzZXIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJQ29uc3VtZXJEZWZpbml0aW9uIGNvbnN1bWVyID0gbmV3IENvbnN1bWVyRGVmaW5pdGlvbihkZWxldGVSZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0Q29uc3VtZXJEYXRhRGVmaW5pdGlvbigpKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29uc3VtZXJDcmVkZW50aWFsc0V2ZW50KEF1ZGl0aW5nQWN0aW9uRW51bS5ERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUywgY29uc3VtZXIsIHJlc3BvbnNlRm9ybWF0LCB1c2VyKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnN1bWVyKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUNvbnN1bWVyKENvbnN1bWVyRGVmaW5pdGlvbiBjb25zdW1lciwgVXNlciBtb2RpZmllciwgYm9vbGVhbiBpc0NyZWF0ZVJlcXVlc3QpIHsKKwkJRWl0aGVyPENvbnN1bWVyRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzdWx0ID0gY29uc3VtZXJPcGVyYXRpb24udXBkYXRlQ3JlZGVudGlhbHMobmV3IENvbnN1bWVyRGF0YShjb25zdW1lcikpOworCQlpZiAodXBkYXRlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yQ29uc3VtZXIodXBkYXRlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJY29uc3VtZXIgPSBuZXcgQ29uc3VtZXJEZWZpbml0aW9uKHVwZGF0ZVJlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXRDb25zdW1lckRhdGFEZWZpbml0aW9uKCkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29uc3VtZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0ZpZWxkc0Zvck92ZXJyaWRlQXR0ZW1wdChDb25zdW1lckRlZmluaXRpb24gY29uc3VtZXIpIHsKKwkJaWYgKGNvbnN1bWVyLmdldENvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZSgpICE9IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJDb25zdW1lciBEZXRhaWxzIExhc3QgdXBkYXRlZCB0aW1lIGNhbm5vdCBiZSBkZWZpbmVkIGJ5IHVzZXIuIFRoaXMgZmllbGQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiIpOworCQl9CisJCWlmIChjb25zdW1lci5nZXRDb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUoKSAhPSBudWxsKSB7CisJCQlsb2cuaW5mbygiQ29uc3VtZXIgTGFzdCBBdXRoZW50aWNhdGlvbiB0aW1lIGNhbm5vdCBiZSBkZWZpbmVkIGJ5IHVzZXIuIFRoaXMgZmllbGQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiIpOworCQl9CisJCWlmIChjb25zdW1lci5nZXRMYXN0TW9kZmllckF0dWlkKCkgIT0gbnVsbCkgeworCQkJbG9nLmluZm8oIkNvbnN1bWVyIExhc3QgTW9kaWZpZXIgVVNFUl9JRCBjYW5ub3QgYmUgZGVmaW5lZCBieSB1c2VyLiBUaGlzIGZpZWxkIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24iKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Dc2FyVmFsaWRhdGlvblV0aWxzLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NzYXJWYWxpZGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRiMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Dc2FyVmFsaWRhdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyLkVycm9yU2V2ZXJpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR2VuZXJhbFV0aWxpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIENzYXJWYWxpZGF0aW9uVXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENzYXJWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT1NDQV9NRVRBX0ZJTEVfVkVSU0lPTiA9ICJUT1NDQS1NZXRhLUZpbGUtVmVyc2lvbiI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NBUl9WRVJTSU9OID0gIkNTQVItVmVyc2lvbiI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRF9CWSA9ICJDcmVhdGVkLUJ5IjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElORV9ERUxNID0gIlxuIjsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRPU0NBX01FVEFEQVRBX0ZJTEUgPSAiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1NDQV9NRVRBX0VOVFJZX0RFRklOSVRJT05TID0gIkVudHJ5LURlZmluaXRpb25zIjsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gVE9TQ0FfTUVUQURBVEFfRklFTERTID0geyBUT1NDQV9NRVRBX0ZJTEVfVkVSU0lPTiwgQ1NBUl9WRVJTSU9OLCBDUkVBVEVEX0JZLCBUT1NDQV9NRVRBX0VOVFJZX0RFRklOSVRJT05TIH07CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBUlRJRkFDVFNfTUVUQURBVEFfRklMRSA9ICJIRUFULm1ldGEiOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVJUSUZBQ1RTID0gIkFydGlmYWN0cy8iOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9TQ0FfQ1NBUl9FWFRFTlNJT04gPSAiLmNzYXIiOworCisJcHVibGljIHN0YXRpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ3NhcihNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIFN0cmluZyBjc2FyVVVJRCwgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscykgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU3RhdHVzID0gdmFsaWRhdGVJc1RPU0NBTWV0YWRhdGFFeGlzdChjc2FyLCBjc2FyVVVJRCwgY29tcG9uZW50c1V0aWxzKTsKKwkJaWYgKHZhbGlkYXRlU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCWxvZy50cmFjZSgiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSBmaWxlIGZvdW5kLCBDU0FSIGlkIHt9IiwgY3NhclVVSUQpOworCQlyZXR1cm4gdmFsaWRhdGVUT1NDQU1ldGFkYXRhRmlsZShjc2FyLCBjc2FyVVVJRCwgY29tcG9uZW50c1V0aWxzKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gZ2V0VG9zY2FZYW1sKE1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgU3RyaW5nIGNzYXJVVUlELCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzKSB7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVTdGF0dXMgPSB2YWxpZGF0ZUlzVE9TQ0FNZXRhZGF0YUV4aXN0KGNzYXIsIGNzYXJVVUlELCBjb21wb25lbnRzVXRpbHMpOworCQlpZiAodmFsaWRhdGVTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJYnl0ZVtdIHRvc2NhTWV0YUJ5dGVzID0gY3Nhci5nZXQoVE9TQ0FfTUVUQURBVEFfRklMRSk7CisJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworCQl0cnkgeworCQkJcHJvcHMubG9hZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odG9zY2FNZXRhQnl0ZXMpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIGZpbGUgaXMgbm90IGluIGV4cGVjdGVkIGtleS12YWx1ZSBmb3JtIGluIGNzYXIsIGNzYXIgSUQge30iLCBjc2FyVVVJRCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBub3QgaW4gZXhwZWN0ZWQga2V5LXZhbHVlIGZvcm0gaW4gQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCwgIkNTQVIgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVCwgY3NhclVVSUQpKTsKKwkJfQorCisJCVN0cmluZyB5YW1sRmlsZU5hbWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShUT1NDQV9NRVRBX0VOVFJZX0RFRklOSVRJT05TKTsKKworCQlpZiAoIWNzYXIuY29udGFpbnNLZXkoeWFtbEZpbGVOYW1lKSkgeworCQkJbG9nLmRlYnVnKCJFbnRyeS1EZWZpbml0aW9ucyBlbnRyeSBub3QgZm91bmQgaW4gVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSBmaWxlLCBjc2FyIElEIHt9IiwgY3NhclVVSUQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJFbnRyeS1EZWZpbml0aW9ucyBlbnRyeSBub3QgZm91bmQgaW4gVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSBmaWxlIGluIENTQVIgd2l0aCBpZCAiICsgY3NhclVVSUQsICJDU0FSIGludGVybmFscyBhcmUgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLllBTUxfTk9UX0ZPVU5EX0lOX0NTQVIsIGNzYXJVVUlELCB5YW1sRmlsZU5hbWUpKTsKKwkJfQorCisJCWxvZy50cmFjZSgiRm91bmQgRW50cnktRGVmaW5pdGlvbnMgcHJvcGVydHkgaW4gVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSwgRW50cnktRGVmaW5pdGlvbnM6IHt9LCBDU0FSIGlkOiB7fSIsIHlhbWxGaWxlTmFtZSwgY3NhclVVSUQpOworCQlieXRlW10geWFtbEZpbGVCeXRlcyA9IGNzYXIuZ2V0KHlhbWxGaWxlTmFtZSk7CisJCWlmICh5YW1sRmlsZUJ5dGVzID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiRW50cnktRGVmaW5pdGlvbnMge30gZmlsZSBub3QgZm91bmQgaW4gY3NhciwgY3NhciBJRCB7fSIsIHlhbWxGaWxlTmFtZSwgY3NhclVVSUQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJFbnRyeS1EZWZpbml0aW9ucyAiICsgeWFtbEZpbGVOYW1lICsgIiBmaWxlIG5vdCBmb3VuZCBpbiBDU0FSIHdpdGggaWQgIiArIGNzYXJVVUlELCAiQ1NBUiBzdHJ1Y3R1cmUgaXMgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLllBTUxfTk9UX0ZPVU5EX0lOX0NTQVIsIGNzYXJVVUlELCB5YW1sRmlsZU5hbWUpKTsKKwkJfQorCisJCVN0cmluZyB5YW1sRmlsZUNvbnRlbnRzID0gbmV3IFN0cmluZyh5YW1sRmlsZUJ5dGVzKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KHlhbWxGaWxlTmFtZSwgeWFtbEZpbGVDb250ZW50cykpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gZ2V0QXJ0aWZhY3RzTWV0YShNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIFN0cmluZyBjc2FyVVVJRCwgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscykgeworCisJCWlmICghY3Nhci5jb250YWluc0tleShBUlRJRkFDVFMgKyBBUlRJRkFDVFNfTUVUQURBVEFfRklMRSkpIHsKKwkJCWxvZy5kZWJ1ZygiRW50cnktRGVmaW5pdGlvbnMgZW50cnkgbm90IGZvdW5kIGluIFRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSwgY3NhciBJRCB7fSIsIGNzYXJVVUlEKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiRW50cnktRGVmaW5pdGlvbnMgZW50cnkgbm90IGZvdW5kIGluIFRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBpbiBDU0FSIHdpdGggaWQgIiArIGNzYXJVVUlELCAiQ1NBUiBpbnRlcm5hbHMgYXJlIGludmFsaWQiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5ZQU1MX05PVF9GT1VORF9JTl9DU0FSLCBjc2FyVVVJRCwgQVJUSUZBQ1RTX01FVEFEQVRBX0ZJTEUpKTsKKwkJfQorCisJCWxvZy50cmFjZSgiRm91bmQgRW50cnktRGVmaW5pdGlvbnMgcHJvcGVydHkgaW4gVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSwgRW50cnktRGVmaW5pdGlvbnM6IHt9LCBDU0FSIGlkOiB7fSIsIEFSVElGQUNUU19NRVRBREFUQV9GSUxFLCBjc2FyVVVJRCk7CisJCWJ5dGVbXSBhcnRpZmFjdHNNZXRhQnl0ZXMgPSBjc2FyLmdldChBUlRJRkFDVFMgKyBBUlRJRkFDVFNfTUVUQURBVEFfRklMRSk7CisJCWlmIChhcnRpZmFjdHNNZXRhQnl0ZXMgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJFbnRyeS1EZWZpbml0aW9ucyB7fSBmaWxlIG5vdCBmb3VuZCBpbiBjc2FyLCBjc2FyIElEIHt9IiwgQVJUSUZBQ1RTICsgQVJUSUZBQ1RTX01FVEFEQVRBX0ZJTEUsIGNzYXJVVUlEKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiRW50cnktRGVmaW5pdGlvbnMgIiArIEFSVElGQUNUUyArIEFSVElGQUNUU19NRVRBREFUQV9GSUxFICsgIiBmaWxlIG5vdCBmb3VuZCBpbiBDU0FSIHdpdGggaWQgIiArIGNzYXJVVUlELCAiQ1NBUiBzdHJ1Y3R1cmUgaXMgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLllBTUxfTk9UX0ZPVU5EX0lOX0NTQVIsIGNzYXJVVUlELCBBUlRJRkFDVFMgKyBBUlRJRkFDVFNfTUVUQURBVEFfRklMRSkpOworCQl9CisKKwkJU3RyaW5nIGFydGlmYWN0c0ZpbGVDb250ZW50cyA9IG5ldyBTdHJpbmcoYXJ0aWZhY3RzTWV0YUJ5dGVzKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KEFSVElGQUNUUyArIEFSVElGQUNUU19NRVRBREFUQV9GSUxFLCBhcnRpZmFjdHNGaWxlQ29udGVudHMpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPiwgUmVzcG9uc2VGb3JtYXQ+IGdldEFydGlmYWN0c0NvbnRlbnQoU3RyaW5nIGNzYXJVVUlELCBNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIFN0cmluZyBhcnRpZmFjdE5hbWUsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMpIHsKKwkJaWYgKCFjc2FyLmNvbnRhaW5zS2V5KEFSVElGQUNUUyArIGFydGlmYWN0TmFtZSkpIHsKKwkJCWxvZy5kZWJ1ZygiRW50cnktRGVmaW5pdGlvbnMgZW50cnkgbm90IGZvdW5kIGluIEFydGlmYWN0cy9IRUFULm1ldGEgZmlsZSwgY3NhciBJRCB7fSIsIGNzYXJVVUlEKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiRW50cnktRGVmaW5pdGlvbnMgZW50cnkgbm90IGZvdW5kIGluIFRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBpbiBDU0FSIHdpdGggaWQgIiArIGNzYXJVVUlELCAiQ1NBUiBpbnRlcm5hbHMgYXJlIGludmFsaWQiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkRfSU5fQ1NBUiwgQVJUSUZBQ1RTICsgYXJ0aWZhY3ROYW1lLCBjc2FyVVVJRCkpOworCQl9CisKKwkJbG9nLnRyYWNlKCJGb3VuZCBFbnRyeS1EZWZpbml0aW9ucyBwcm9wZXJ0eSBpbiBBcnRpZmFjdHMvSEVBVC5tZXRhLCBFbnRyeS1EZWZpbml0aW9uczoge30sIENTQVIgaWQ6IHt9IiwgQVJUSUZBQ1RTICsgYXJ0aWZhY3ROYW1lLCBjc2FyVVVJRCk7CisJCWJ5dGVbXSBhcnRpZmFjdEZpbGVCeXRlcyA9IGNzYXIuZ2V0KEFSVElGQUNUUyArIGFydGlmYWN0TmFtZSk7CisJCWlmIChhcnRpZmFjdEZpbGVCeXRlcyA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkVudHJ5LURlZmluaXRpb25zIHt9IGZpbGUgbm90IGZvdW5kIGluIGNzYXIsIGNzYXIgSUQge30iLCBBUlRJRkFDVFMgKyBhcnRpZmFjdE5hbWUsIGNzYXJVVUlEKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiRW50cnktRGVmaW5pdGlvbnMgIiArIEFSVElGQUNUUyArIGFydGlmYWN0TmFtZSArICIgZmlsZSBub3QgZm91bmQgaW4gQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCwgIkNTQVIgc3RydWN0dXJlIGlzIGludmFsaWQiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkRfSU5fQ1NBUiwgQVJUSUZBQ1RTICsgYXJ0aWZhY3ROYW1lLCBjc2FyVVVJRCkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPihhcnRpZmFjdE5hbWUsIGFydGlmYWN0RmlsZUJ5dGVzKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVRPU0NBTWV0YWRhdGFGaWxlKE1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgU3RyaW5nIGNzYXJVVUlELCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzKSB7CisKKwkJYnl0ZVtdIHRvc2NhTWV0YUJ5dGVzID0gY3Nhci5nZXQoVE9TQ0FfTUVUQURBVEFfRklMRSk7CisJCVN0cmluZyB0b3NjYU1ldGFkYXRhID0gbmV3IFN0cmluZyh0b3NjYU1ldGFCeXRlcyk7CisJCVN0cmluZ1tdIHNwbGl0ZWQgPSB0b3NjYU1ldGFkYXRhLnNwbGl0KE5FV19MSU5FX0RFTE0pOworCQlpZiAoc3BsaXRlZCA9PSBudWxsIHx8IHNwbGl0ZWQubGVuZ3RoIDwgVE9TQ0FfTUVUQURBVEFfRklFTERTLmxlbmd0aCkgeworCQkJbG9nLmRlYnVnKCJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIGZpbGUgaXMgbm90IGluIGV4cGVjdGVkIGtleS12YWx1ZSBmb3JtIGluIGNzYXIsIGNzYXIgSUQge30iLCBjc2FyVVVJRCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBub3QgaW4gZXhwZWN0ZWQga2V5LXZhbHVlIGZvcm0gaW4gQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCwgIkNTQVIgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVCwgY3NhclVVSUQpKTsKKwkJfQorCQkvKgorCQkgKiBpZihzcGxpdGVkLmxlbmd0aCA9PSBUT1NDQV9NRVRBREFUQV9GSUVMRFMubGVuZ3RoKXsgaWYoIXRvc2NhTWV0YWRhdGEuZW5kc1dpdGgoTkVXX0xJTkVfREVMTSkpeyBsb2cuIGRlYnVnKCJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIGZpbGUgaXMgbm90IGluIGV4cGVjdGVkIGtleS12YWx1ZSBmb3JtIGluIGNzYXIsIGNzYXIgSUQge30iICwgY3NhclVVSUQpOworCQkgKiBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuIGxvZ0ludGVybmFsRGF0YUVycm9yKCJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIGZpbGUgbm90IGluIGV4cGVjdGVkIGtleS12YWx1ZSBmb3JtIGluIENTQVIgd2l0aCBpZCAiICtjc2FyVVVJRCwgIkNTQVIgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7IHJldHVybgorCQkgKiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy4gQ1NBUl9JTlZBTElEX0ZPUk1BVCwgY3NhclVVSUQpKTsgfSB9CisJCSAqLworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gYmxvY2tfMFN0YXR1cyA9IHZhbGlkYXRlQmxvY2tfMChjc2FyVVVJRCwgc3BsaXRlZCwgY29tcG9uZW50c1V0aWxzKTsKKwkJaWYgKGJsb2NrXzBTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGJsb2NrXzBTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCbG9ja18wKFN0cmluZyBjc2FyVVVJRCwgU3RyaW5nW10gc3BsaXRlZCwgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscykgeworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKFN0cmluZyB0b3NjYUZpZWxkIDogVE9TQ0FfTUVUQURBVEFfRklFTERTKSB7CisKKwkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworCisJCQl0cnkgeworCQkJCXByb3BzLmxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNwbGl0ZWRbaW5kZXhdLmdldEJ5dGVzKCkpKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2cuZGVidWcoIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBpcyBub3QgaW4gZXhwZWN0ZWQga2V5LXZhbHVlIGZvcm0gaW4gY3NhciwgY3NhciBJRCB7fSIsIGNzYXJVVUlEKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBub3QgaW4gZXhwZWN0ZWQga2V5LXZhbHVlIGZvcm0gaW4gQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCwgIkNTQVIgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQsIGNzYXJVVUlEKSk7CisJCQl9CisJCQlpZiAoIXByb3BzLmNvbnRhaW5zS2V5KHRvc2NhRmllbGQpKSB7CisJCQkJbG9nLmRlYnVnKCJUT1NDQS5tZXRhIGZpbGUgZm9ybWF0IGlzIGludmFsaWQ6IE5vIG5ldyBsaW5lIGFmdGVyIGJsb2NrXzAgYXMgZXhwZWN0ZWQgaW4gY3NhciwgY3NhciBJRCB7fSIsIGNzYXJVVUlEKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBub3QgaW4gZXhwZWN0ZWQga2V5LXZhbHVlIGZvcm0gaW4gQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCwgIkNTQVIgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRF9GT1JNQVQsIGNzYXJVVUlEKSk7CisJCQl9CisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eSh0b3NjYUZpZWxkKTsKKwkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgeworCQkJCWxvZy5kZWJ1ZygiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBrZXktdmFsdWUgZm9ybSBpbiBjc2FyLCBjc2FyIElEIHt9IiwgY3NhclVVSUQpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSBmaWxlIG5vdCBpbiBleHBlY3RlZCBrZXktdmFsdWUgZm9ybSBpbiBDU0FSIHdpdGggaWQgIiArIGNzYXJVVUlELCAiQ1NBUiBpbnRlcm5hbHMgYXJlIGludmFsaWQiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVCwgY3NhclVVSUQpKTsKKwkJCX0KKworCQkJLy8gVE9TQ0EtTWV0YS1GaWxlLVZlcnNpb24gJiBDU0FSLVZlcnNpb24gOiBkaWdpdC5kaWdpdCAtIGZvcm1hdAorCQkJLy8gdmFsaWRhdGlvbgorCQkJaWYgKHRvc2NhRmllbGQuZXF1YWxzKFRPU0NBX01FVEFfRklMRV9WRVJTSU9OKSB8fCB0b3NjYUZpZWxkLmVxdWFscyhDU0FSX1ZFUlNJT04pKSB7CisJCQkJaWYgKCF2YWxpZGF0ZVRPU0NBTWV0YVByb3BlcnR5KHZhbHVlKSkgeworCQkJCQlsb2cuZGVidWcoIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBjb250YWlucyB7fSBpbiB3cm9uZyBmb3JtYXQgKGRpZ2l0LmRpZ2l0KSwgY3NhciBJRCB7fSIsIHRvc2NhRmllbGQsIGNzYXJVVUlEKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIGZpbGUgbm90IGluIGV4cGVjdGVkIGtleS12YWx1ZSBmb3JtIGluIENTQVIgd2l0aCBpZCAiICsgY3NhclVVSUQsICJDU0FSIGludGVybmFscyBhcmUgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVCwgY3NhclVVSUQpKTsKKwkJCQl9CisJCQl9CisJCQlpbmRleCsrOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlVE9TQ0FNZXRhUHJvcGVydHkoU3RyaW5nIHRvc2NhUHJvcGVydHkpIHsKKwkJZmluYWwgU3RyaW5nIEZMT0FUX1NUUklORyA9ICJeXFxkezF9Wy5dXFxkezF9JCI7CisJCWZpbmFsIFBhdHRlcm4gRkxPQVRfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZShGTE9BVF9TVFJJTkcpOworCisJCU1hdGNoZXIgZmxvYXRNYXRjaGVyID0gRkxPQVRfUEFUVEVSTi5tYXRjaGVyKHRvc2NhUHJvcGVydHkpOworCQlyZXR1cm4gZmxvYXRNYXRjaGVyLm1hdGNoZXMoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlSXNUT1NDQU1ldGFkYXRhRXhpc3QoTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBTdHJpbmcgY3NhclVVSUQsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMpIHsKKwkJaWYgKGNzYXIgPT0gbnVsbCB8fCBjc2FyLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJFcnJvciB3aGVuIGZldGNoaW5nIGNzYXIgd2l0aCBJRCB7fSIsIGNzYXJVVUlEKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJDcmVhdGluZyByZXNvdXJjZSBmcm9tIENTQVI6IGZldGNoaW5nIENTQVIgd2l0aCBpZCAiICsgY3NhclVVSUQgKyAiIGZhaWxlZCIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRCwgY3NhclVVSUQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJaWYgKCFjc2FyLmNvbnRhaW5zS2V5KFRPU0NBX01FVEFEQVRBX0ZJTEUpKSB7CisJCQlsb2cuZGVidWcoIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEgZmlsZSBub3QgZm91bmQgaW4gY3NhciwgY3NhciBJRCB7fSIsIGNzYXJVVUlEKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSBmaWxlIG5vdCBmb3VuZCBpbiBDU0FSIHdpdGggaWQgIiArIGNzYXJVVUlELCAiQ1NBUiBzdHJ1Y3R1cmUgaXMgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNTQVJfSU5WQUxJRCwgY3NhclVVSUQpKTsKKwkJfQorCQlieXRlW10gdG9zY2FNZXRhQnl0ZXMgPSBjc2FyLmdldChUT1NDQV9NRVRBREFUQV9GSUxFKTsKKwkJLy8gVGFsICYmIGV4Y2hhbmdlZCBmb3IgfHwKKwkJaWYgKHRvc2NhTWV0YUJ5dGVzID09IG51bGwgfHwgdG9zY2FNZXRhQnl0ZXMubGVuZ3RoID09IDApIHsKKwkJCWxvZy5kZWJ1ZygiVE9TQ0EtTWV0YWRhdGEvVE9TQ0EubWV0YSBmaWxlIG5vdCBmb3VuZCBpbiBjc2FyLCBjc2FyIElEIHt9IiwgY3NhclVVSUQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIGZpbGUgbm90IGZvdW5kIGluIENTQVIgd2l0aCBpZCAiICsgY3NhclVVSUQsICJDU0FSIHN0cnVjdHVyZSBpcyBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElELCBjc2FyVVVJRCkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KEJvb2xlYW4uVFJVRSk7CisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gZ2V0VG9zY2FZYW1sQ2hlY2tzdW0oTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBTdHJpbmcgY3NhclVVSUQsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMpIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4sIFJlc3BvbnNlRm9ybWF0PiB0b3NjYVlhbWxSZXMgPSBnZXRUb3NjYVlhbWwoY3NhciwgY3NhclVVSUQsIGNvbXBvbmVudHNVdGlscyk7CisJCWlmICh0b3NjYVlhbWxSZXMuaXNSaWdodCgpIHx8IHRvc2NhWWFtbFJlcy5sZWZ0KCkudmFsdWUoKSA9PSBudWxsIHx8IHRvc2NhWWFtbFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRSaWdodCgpID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGQgdG8gY3JlYXRlIHRvc2NhWWFtbENoZWNrc3VtIGZvciBjc2FyLCBjc2FyIElEIHt9IiwgY3NhclVVSUQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh0b3NjYVlhbWxSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVN0cmluZyBuZXdDaGVja1N1bSA9IEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5Qnl0ZUFycmF5KHRvc2NhWWFtbFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRSaWdodCgpLmdldEJ5dGVzKCkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3Q2hlY2tTdW0pOworCisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ3NhclBheWxvYWROYW1lKFN0cmluZyBwYXlsb2FkTmFtZSkgeworCQlpZiAocGF5bG9hZE5hbWUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHBheWxvYWROYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoVE9TQ0FfQ1NBUl9FWFRFTlNJT04pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9EYXRhVHlwZUltcG9ydE1hbmFnZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvRGF0YVR5cGVJbXBvcnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmYmEwZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvRGF0YVR5cGVJbXBvcnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Db21tb25JbXBvcnRNYW5hZ2VyLkVsZW1lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW1wb3J0VXRpbHMuVG9zY2FUYWdOYW1lc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVByb3BlcnR5VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImRhdGFUeXBlSW1wb3J0TWFuYWdlciIpCitwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBvcnRNYW5hZ2VyIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbnRpb24gPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5RGVmaW50aW9uLnNldE5hbWUoImFhYSIpOworCQlwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eURlZmludGlvbik7CisKKwkJTGlzdDxTdHJpbmc+IGFsbFBhcmVudHNQcm9wcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlhbGxQYXJlbnRzUHJvcHMuYWRkKCJhYWEiKTsKKwkJYWxsUGFyZW50c1Byb3BzLmFkZCgiYmJiIik7CisKKwkJU2V0PFN0cmluZz4gYWxyZWFkeUV4aXN0UHJvcHNDb2xsZWN0aW9uID0gcHJvcGVydGllcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBhbGxQYXJlbnRzUHJvcHMuY29udGFpbnMocC5nZXROYW1lKCkpKS5tYXAocCAtPiBwLmdldE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oYWxyZWFkeUV4aXN0UHJvcHNDb2xsZWN0aW9uKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEYXRhVHlwZUltcG9ydE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCUBSZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIENvbW1vbkltcG9ydE1hbmFnZXIgY29tbW9uSW1wb3J0TWFuYWdlcjsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPERhdGFUeXBlRGVmaW5pdGlvbiwgQm9vbGVhbj4+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlRGF0YVR5cGVzKFN0cmluZyBkYXRhVHlwZVltbCkgeworCQlyZXR1cm4gY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXMoZGF0YVR5cGVZbWwsIGVsZW1lbnRUeXBlWW1sIC0+IGNyZWF0ZURhdGFUeXBlc0Zyb21ZbWwoZWxlbWVudFR5cGVZbWwpLCBlbGVtZW50VHlwZXNMaXN0IC0+IGNyZWF0ZURhdGFUeXBlc0J5RGFvKGVsZW1lbnRUeXBlc0xpc3QpLCBFbGVtZW50VHlwZUVudW0uRGF0YVR5cGUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8RGF0YVR5cGVEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVEYXRhVHlwZXNGcm9tWW1sKFN0cmluZyBkYXRhVHlwZXNZbWwpIHsKKworCQlyZXR1cm4gY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXNGcm9tWW1sKGRhdGFUeXBlc1ltbCwgKGRhdGFUeXBlTmFtZSwgZGF0YVR5cGVKc29uRGF0YSkgLT4gY3JlYXRlRGF0YVR5cGUoZGF0YVR5cGVOYW1lLCBkYXRhVHlwZUpzb25EYXRhKSk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RGF0YVR5cGVEZWZpbml0aW9uLCBCb29sZWFuPj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVEYXRhVHlwZXNCeURhbyhMaXN0PERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzVG9DcmVhdGUpIHsKKworCQlyZXR1cm4gY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXNCeURhbyhkYXRhVHlwZXNUb0NyZWF0ZSwgZGF0YVR5cGUgLT4gdmFsaWRhdGVEYXRhVHlwZShkYXRhVHlwZSksIGRhdGFUeXBlIC0+IG5ldyBJbW11dGFibGVQYWlyPD4oRWxlbWVudFR5cGVFbnVtLkRhdGFUeXBlLCBkYXRhVHlwZS5nZXROYW1lKCkpLAorCQkJCWRhdGFUeXBlTmFtZSAtPiBwcm9wZXJ0eU9wZXJhdGlvbi5nZXREYXRhVHlwZUJ5TmFtZVdpdGhvdXREZXJpdmVkKGRhdGFUeXBlTmFtZSksIGRhdGFUeXBlIC0+IHByb3BlcnR5T3BlcmF0aW9uLmFkZERhdGFUeXBlKGRhdGFUeXBlKSwgKG5ld0RhdGFUeXBlLCBvbGREYXRhVHlwZSkgLT4gcHJvcGVydHlPcGVyYXRpb24udXBkYXRlRGF0YVR5cGUobmV3RGF0YVR5cGUsIG9sZERhdGFUeXBlKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QWN0aW9uU3RhdHVzLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEYXRhVHlwZShEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGUpIHsKKworCQlTdHJpbmcgZGF0YVR5cGVOYW1lID0gZGF0YVR5cGUuZ2V0TmFtZSgpOworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IGRhdGFUeXBlLmdldFByb3BlcnRpZXMoKTsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJLy8gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgZGVmaW5lZCBlaXRoZXIgaW4gdGhlIHByb3BlcnRpZXMKKwkJCS8vIHNlY3Rpb24gb3IgYXQgb25lIG9mIHRoZSBwYXJlbnRzCisJCQlTdHJpbmcgZGVyaXZlZERhdGFUeXBlID0gZGF0YVR5cGUuZ2V0RGVyaXZlZEZyb21OYW1lKCk7CisJCQkvLyBJZiB0aGVyZSBhcmUgbm8gcHJvcGVydGllcywgdGhlbiB3ZSBjYW4gY3JlYXRlIGEgZGF0YSB0eXBlIGlmIGl0CisJCQkvLyBpcyBhbiBhYnN0cmFjdCBvbmUgb3IgaXQgZGVyaXZlcyBmcm9tIG5vbiBhYnN0cmFjdCBkYXRhIHR5cGUKKwkJCWlmICgoZGVyaXZlZERhdGFUeXBlID09IG51bGwgfHwgZGVyaXZlZERhdGFUeXBlLmlzRW1wdHkoKSkpIHsKKwkJCQlpZiAoZmFsc2UgPT0gaXNBYnN0cmFjdChkYXRhVHlwZS5nZXROYW1lKCkpKSB7CisJCQkJCWlmIChmYWxzZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5pc1NjYWxhclR5cGUoZGF0YVR5cGVOYW1lKSkgeworCQkJCQkJbG9nLmRlYnVnKCJEYXRhIHR5cGUge30gbXVzdCBoYXZlIHByb3BlcnRpZXMgdW5sZXNzIGl0IGRlcml2ZXMgZnJvbSBub24gYWJzdHJhY3QgZGF0YSB0eXBlIiwgZGF0YVR5cGUuZ2V0TmFtZSgpKTsKKwkJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlEYXRhVHlwZShBY3Rpb25TdGF0dXMuREFUQV9UWVBFX05PUl9QUk9QRVJUSUVTX05FSVRIRVJfREVSSVZFRF9GUk9NLCBkYXRhVHlwZSwgbnVsbCk7CisKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBpZiBpdCBpcyBub3QgYSBzY2FsYXIgZGF0YSB0eXBlIGFuZCBpdCBkZXJpdmVzIGZyb20gYWJzdHJhY3QKKwkJCQkvLyBkYXRhIHR5cGUsIHdlIHNob3VsZCByZWplY3QgdGhlIHJlcXVlc3QuCisJCQkJaWYgKGZhbHNlID09IFRvc2NhUHJvcGVydHlUeXBlLmlzU2NhbGFyVHlwZShkYXRhVHlwZU5hbWUpICYmIHRydWUgPT0gaXNBYnN0cmFjdChkZXJpdmVkRGF0YVR5cGUpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRGF0YSB0eXBlIHt9IHdoaWNoIGRlcml2ZWQgZnJvbSBhYnN0cmFjdCBkYXRhIHR5cGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwcm9wZXJ0eSIsIGRhdGFUeXBlLmdldE5hbWUoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlEYXRhVHlwZShBY3Rpb25TdGF0dXMuREFUQV9UWVBFX05PUl9QUk9QRVJUSUVTX05FSVRIRVJfREVSSVZFRF9GUk9NLCBkYXRhVHlwZSwgbnVsbCk7CisKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLy8gcHJvcGVydGllcyB0YWcgY2Fubm90IGJlIGVtcHR5CisJCQlpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5RGF0YVR5cGUoQWN0aW9uU3RhdHVzLkRBVEFfVFlQRV9QUk9QRVJUSUVTX0NBTk5PVF9CRV9FTVBUWSwgZGF0YVR5cGUsIG51bGwpOworCisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisKKwkJCS8vIGNoZWNrIG5vIGR1cGxpY2F0ZXMKKwkJCVNldDxTdHJpbmc+IGNvbGxlY3QgPSBwcm9wZXJ0aWVzLnN0cmVhbSgpLm1hcChwIC0+IHAuZ2V0TmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisJCQlpZiAoY29sbGVjdCAhPSBudWxsKSB7CisJCQkJaWYgKHByb3BlcnRpZXMuc2l6ZSgpICE9IGNvbGxlY3Quc2l6ZSgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlEYXRhVHlwZShBY3Rpb25TdGF0dXMuREFUQV9UWVBFX0RVUExJQ0FURV9QUk9QRVJUWSwgZGF0YVR5cGUsIG51bGwpOworCisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCX0KKworCQkJTGlzdDxTdHJpbmc+IHByb3BlcnRpZXNXaXRoU2FtZVR5cGVBc0RhdGFUeXBlID0gcHJvcGVydGllcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFR5cGUoKS5lcXVhbHMoZGF0YVR5cGUuZ2V0TmFtZSgpKSkubWFwKHAgLT4gcC5nZXROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQlpZiAocHJvcGVydGllc1dpdGhTYW1lVHlwZUFzRGF0YVR5cGUgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzV2l0aFNhbWVUeXBlQXNEYXRhVHlwZS5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKKwkJCQlsb2cuZGVidWcoIlRoZSBkYXRhIHR5cGUge30gY29udGFpbnMgcHJvcGVydGllcyB3aXRoIHRoZSB0eXBlIHt9IiwgZGF0YVR5cGUuZ2V0TmFtZSgpLCBkYXRhVHlwZS5nZXROYW1lKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlEYXRhVHlwZShBY3Rpb25TdGF0dXMuREFUQV9UWVBFX1BST0VQUlRZX0NBTk5PVF9IQVZFX1NBTUVfVFlQRV9PRl9EQVRBX1RZUEUsIGRhdGFUeXBlLCBwcm9wZXJ0aWVzV2l0aFNhbWVUeXBlQXNEYXRhVHlwZSk7CisKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJfQorCisJCVN0cmluZyBkZXJpdmVkRGF0YVR5cGUgPSBkYXRhVHlwZS5nZXREZXJpdmVkRnJvbU5hbWUoKTsKKwkJaWYgKGRlcml2ZWREYXRhVHlwZSAhPSBudWxsKSB7CisJCQlFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZXJpdmVkRGF0YVR5cGVCeU5hbWUgPSBwcm9wZXJ0eU9wZXJhdGlvbi5nZXREYXRhVHlwZUJ5TmFtZShkZXJpdmVkRGF0YVR5cGUsIHRydWUpOworCQkJaWYgKGRlcml2ZWREYXRhVHlwZUJ5TmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRlcml2ZWREYXRhVHlwZUJ5TmFtZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5RGF0YVR5cGUoQWN0aW9uU3RhdHVzLkRBVEFfVFlQRV9ERVJJVkVEX0lTX01JU1NJTkcsIGRhdGFUeXBlLCBudWxsKTsKKworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5RGF0YVR5cGUoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IsIGRhdGFUeXBlLCBudWxsKTsKKworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKworCQkJCX0KKwkJCX0gZWxzZSB7CisKKwkJCQlEYXRhVHlwZURlZmluaXRpb24gZGVyaXZlZERhdGFUeXBlRGVmID0gZGVyaXZlZERhdGFUeXBlQnlOYW1lLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKKworCQkJCQlpZiAodHJ1ZSA9PSBpc1NjYWxhclR5cGUoZGVyaXZlZERhdGFUeXBlRGVmKSkgeworCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeURhdGFUeXBlKEFjdGlvblN0YXR1cy5EQVRBX1RZUEVfQ0FOTk9UX0hBVkVfUFJPUEVSVElFUywgZGF0YVR5cGUsIG51bGwpOworCisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJfQorCisJCQkJCVNldDxTdHJpbmc+IGFsbFBhcmVudHNQcm9wcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJCQkJZG8geworCQkJCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IGN1cnJlbnRQYXJlbnRzUHJvcHMgPSBkZXJpdmVkRGF0YVR5cGVEZWYuZ2V0UHJvcGVydGllcygpOworCQkJCQkJaWYgKGN1cnJlbnRQYXJlbnRzUHJvcHMgIT0gbnVsbCkgeworCQkJCQkJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA6IGN1cnJlbnRQYXJlbnRzUHJvcHMpIHsKKwkJCQkJCQkJYWxsUGFyZW50c1Byb3BzLmFkZChwcm9wZXJ0eURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlkZXJpdmVkRGF0YVR5cGVEZWYgPSBkZXJpdmVkRGF0YVR5cGVEZWYuZ2V0RGVyaXZlZEZyb20oKTsKKwkJCQkJfSB3aGlsZSAoZGVyaXZlZERhdGFUeXBlRGVmICE9IG51bGwpOworCisJCQkJCS8vIENoZWNrIHRoYXQgbm8gcHJvcGVydHkgaXMgYWxyZWFkeSBkZWZpbmVkIGluIG9uZSBvZiB0aGUKKwkJCQkJLy8gYW5jZXN0b3JzCisJCQkJCVNldDxTdHJpbmc+IGFscmVhZHlFeGlzdFByb3BzQ29sbGVjdGlvbiA9IHByb3BlcnRpZXMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gYWxsUGFyZW50c1Byb3BzLmNvbnRhaW5zKHAuZ2V0TmFtZSgpKSkubWFwKHAgLT4gcC5nZXROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKwkJCQkJaWYgKGFscmVhZHlFeGlzdFByb3BzQ29sbGVjdGlvbiAhPSBudWxsICYmIGFscmVhZHlFeGlzdFByb3BzQ29sbGVjdGlvbi5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKKwkJCQkJCUxpc3Q8U3RyaW5nPiBkdXBsaWNhdGVQcm9wcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCQkJZHVwbGljYXRlUHJvcHMuYWRkQWxsKGFscmVhZHlFeGlzdFByb3BzQ29sbGVjdGlvbik7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5RGF0YVR5cGUoQWN0aW9uU3RhdHVzLkRBVEFfVFlQRV9QUk9QRVJUWV9BTFJFQURZX0RFRklORURfSU5fQU5DRVNUT1IsIGRhdGFUeXBlLCBkdXBsaWNhdGVQcm9wcyk7CisKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQl9CisKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KEFjdGlvblN0YXR1cy5PSyk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzQWJzdHJhY3QoU3RyaW5nIGRhdGFUeXBlTmFtZSkgeworCisJCVRvc2NhUHJvcGVydHlUeXBlIGlzUHJpbWl0aXZlVG9zY2FUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUoZGF0YVR5cGVOYW1lKTsKKworCQlyZXR1cm4gaXNQcmltaXRpdmVUb3NjYVR5cGUgIT0gbnVsbCAmJiBpc1ByaW1pdGl2ZVRvc2NhVHlwZS5pc0Fic3RyYWN0KCkgPT0gdHJ1ZTsKKworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1NjYWxhclR5cGUoRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmKSB7CisKKwkJYm9vbGVhbiBpc1NjYWxhciA9IGZhbHNlOworCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGUgPSBkYXRhVHlwZURlZjsKKworCQl3aGlsZSAoZGF0YVR5cGUgIT0gbnVsbCkgeworCisJCQlTdHJpbmcgbmFtZSA9IGRhdGFUeXBlLmdldE5hbWUoKTsKKwkJCWlmIChUb3NjYVByb3BlcnR5VHlwZS5pc1NjYWxhclR5cGUobmFtZSkpIHsKKwkJCQlpc1NjYWxhciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRhdGFUeXBlID0gZGF0YVR5cGUuZ2V0RGVyaXZlZEZyb20oKTsKKwkJfQorCisJCXJldHVybiBpc1NjYWxhcjsKKwl9CisKKwlwcml2YXRlIERhdGFUeXBlRGVmaW5pdGlvbiBjcmVhdGVEYXRhVHlwZShTdHJpbmcgZGF0YVR5cGVOYW1lLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbikgeworCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVEZWZpbml0aW9uKCk7CisKKwkJZGF0YVR5cGUuc2V0TmFtZShkYXRhVHlwZU5hbWUpOworCisJCWlmICh0b3NjYUpzb24gIT0gbnVsbCkgeworCQkJLy8gRGVzY3JpcHRpb24KKwkJCWZpbmFsIENvbnN1bWVyPFN0cmluZz4gZGVzY3JpcHRpb25TZXR0ZXIgPSBkZXNjcmlwdGlvbiAtPiBkYXRhVHlwZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCQljb21tb25JbXBvcnRNYW5hZ2VyLnNldEZpZWxkKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSwgZGVzY3JpcHRpb25TZXR0ZXIpOworCQkJLy8gRGVyaXZlZCBGcm9tCisJCQlmaW5hbCBDb25zdW1lcjxTdHJpbmc+IGRlcml2ZWRGcm9tU2V0dGVyID0gZGVyaXZlZEZyb20gLT4gZGF0YVR5cGUuc2V0RGVyaXZlZEZyb21OYW1lKGRlcml2ZWRGcm9tKTsKKwkJCWNvbW1vbkltcG9ydE1hbmFnZXIuc2V0RmllbGQodG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bS5ERVJJVkVEX0ZST00uZ2V0RWxlbWVudE5hbWUoKSwgZGVyaXZlZEZyb21TZXR0ZXIpOworCQkJLy8gUHJvcGVydGllcworCQkJY29tbW9uSW1wb3J0TWFuYWdlci5zZXRQcm9wZXJ0aWVzKHRvc2NhSnNvbiwgKHZhbHVlcykgLT4gZGF0YVR5cGUuc2V0UHJvcGVydGllcyh2YWx1ZXMpKTsKKworCQkJc2V0Q29uc3RyYWludHModG9zY2FKc29uLCBkYXRhVHlwZSk7CisJCX0KKwkJcmV0dXJuIGRhdGFUeXBlOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDb25zdHJhaW50cyhNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiwgRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9EaXN0cmlidXRpb25Nb25pdG9yaW5nQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9EaXN0cmlidXRpb25Nb25pdG9yaW5nQnVzaW5lc3NMb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTQyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0Rpc3RyaWJ1dGlvbk1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLkF1ZGl0Q2Fzc2FuZHJhRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm8uRGlzdHJpYnV0aW9uU3RhdHVzSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvLkRpc3RyaWJ1dGlvblN0YXR1c0xpc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvLkRpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5EaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VMaXN0UmVzcG9uY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdHZW5lcmljRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuRGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5FU1RpbWVCYXNlZEV2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgamF2YS51dGlsLio7CisKK0BDb21wb25lbnQoImRpc3RyaWJ1dGlvbk1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25Nb25pdG9yaW5nQnVzaW5lc3NMb2dpYyBleHRlbmRzIEJhc2VCdXNpbmVzc0xvZ2ljIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZRUQgPSAiRGVwbG95ZWQiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SID0gIkVycm9yIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNUUklCVVRFRCA9ICJEaXN0cmlidXRlZCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5fUFJPR1JFU1MgPSAiSW4gUHJvZ3Jlc3MiOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8vIEBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJLy8gcHJpdmF0ZSBBdWRpdGluZ0RhbyBhdWRpdGluZ0RhbzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEF1ZGl0Q2Fzc2FuZHJhRGFvIGNhc3NhbmRyYURhbzsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzOworCisJcHVibGljIERpc3RyaWJ1dGlvbk1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljKCkgeworCX0KKworCXB1YmxpYyBFaXRoZXI8RGlzdHJpYnV0aW9uU3RhdHVzTGlzdFJlc3BvbnNlLCBSZXNwb25zZUZvcm1hdD4gZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU3RhdHVzKFN0cmluZyBkaWQsIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZ2V0IExpc3QgT2YgRGlzdHJpYnV0aW9uIFN0YXR1cyIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWxvZy50cmFjZSgiZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU3RhdHVzIGZvciBkaWQge30iLCBkaWQpOworCQlFaXRoZXI8TGlzdDxEaXN0cmlidXRpb25TdGF0dXNFdmVudD4sIEFjdGlvblN0YXR1cz4gZGlzdHJpYnV0aW9uU3RhdHVzID0gY2Fzc2FuZHJhRGFvLmdldExpc3RPZkRpc3RyaWJ1dGlvblN0YXR1c2VzKGRpZCk7CisJCWlmIChkaXN0cmlidXRpb25TdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIm5vdCBmb3VuZCBkaXN0cmlidXRpb24gc3RhdHVzZXMgZm9yIGRpZCB7fSAgIHN0YXR1cyBpcyB7fSAiLCBkaWQsIGRpc3RyaWJ1dGlvblN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoZGlzdHJpYnV0aW9uU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSwgZGlkKSk7CisJCX0KKwkJTGlzdDxEaXN0cmlidXRpb25TdGF0dXNJbmZvPiBkaXN0cmliU3RhdHVzSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PERpc3RyaWJ1dGlvblN0YXR1c0luZm8+KCk7CisJCUxpc3Q8RGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQ+IGRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50TGlzdCA9IGRpc3RyaWJ1dGlvblN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50TGlzdCAhPSBudWxsKSB7CisJCQlmb3IgKEVTVGltZUJhc2VkRXZlbnQgZGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQgOiBkaXN0cmlidXRpb25TdGF0dXNFdmVudExpc3QpIHsKKwkJCQlkaXN0cmliU3RhdHVzSW5mb0xpc3QuYWRkKG5ldyBEaXN0cmlidXRpb25TdGF0dXNJbmZvKGRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50KSk7CisJCQl9CisJCX0KKworCQlEaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2UgZGlzdHJpYnV0aW9uU3RhdHVzTGlzdFJlc3BvbnNlID0gbmV3IERpc3RyaWJ1dGlvblN0YXR1c0xpc3RSZXNwb25zZSgpOworCQlkaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2Uuc2V0RGlzdHJpYnV0aW9uU3RhdHVzTGlzdChkaXN0cmliU3RhdHVzSW5mb0xpc3QpOworCQlsb2cudHJhY2UoImxpc3Qgc3RhdHVzZXMgZm9yIGRpZCB7fSBpcyB7fSAiLCBkaWQsIGRpc3RyaWJTdGF0dXNJbmZvTGlzdCk7CisJCXJldHVybiBFaXRoZXIubGVmdChkaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2UpOworCX0KKworCXB1YmxpYyBFaXRoZXI8RGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlTGlzdFJlc3BvbmNlLCBSZXNwb25zZUZvcm1hdD4gZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU2VydmljZVN0YXR1cyhTdHJpbmcgc2VydmljZVV1aWQsIFN0cmluZyB1c2VySWQpIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBMaXN0IE9mIERpc3RyaWJ1dGlvbiBTZXJ2aWNlIFN0YXR1cyIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWxvZy50cmFjZSgiZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU2VydmljZVN0YXR1cyBmb3Igc2VydmljZVVVSUQge30iLCBzZXJ2aWNlVXVpZCk7CisJCUVpdGhlcjxMaXN0PD8gZXh0ZW5kcyBBdWRpdGluZ0dlbmVyaWNFdmVudD4sIEFjdGlvblN0YXR1cz4gc3RhdHVzID0gY2Fzc2FuZHJhRGFvLmdldFNlcnZpY2VEaXN0cmlidXRpb25TdGF0dXNlc0xpc3Qoc2VydmljZVV1aWQpOworCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZmluZCBzZXJ2aWNlIGRpc3RyaWJ1dGlvbiBzdGF0dXNlcy4gZXJyb3I6IHt9Iiwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KHN0YXR1cy5yaWdodCgpLnZhbHVlKCksIHNlcnZpY2VVdWlkKSk7CisJCX0KKwkJTGlzdDxEaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VJbmZvPiBkaXN0cmliU3RhdHVzSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8+KCk7CisJCUxpc3Q8PyBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50PiBkaXN0cmlidXRpb25TdGF0dXNFdmVudExpc3QgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCWRpc3RyaWJTdGF0dXNJbmZvTGlzdCA9IGhhbmRsZUF1ZGl0aW5nRGFvUmVzcG9uc2UoZGlzdHJpYnV0aW9uU3RhdHVzRXZlbnRMaXN0KTsKKwkJRGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlTGlzdFJlc3BvbmNlIGRpc3RyaWJ1dGlvblN0YXR1c0xpc3RSZXNwb25zZSA9IG5ldyBEaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VMaXN0UmVzcG9uY2UoKTsKKwkJZGlzdHJpYnV0aW9uU3RhdHVzTGlzdFJlc3BvbnNlLnNldERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUxpc3QoZGlzdHJpYlN0YXR1c0luZm9MaXN0KTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRpc3RyaWJ1dGlvblN0YXR1c0xpc3RSZXNwb25zZSk7CisJfQorCisJcHJpdmF0ZSBMaXN0PERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8+IGhhbmRsZUF1ZGl0aW5nRGFvUmVzcG9uc2UoTGlzdDw/IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQ+IGRpc3RyaWJTdGF0dXNJbmZvTGlzdCkgeworCQlMaXN0PERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8+IHJlc2xpc3QgPSBuZXcgQXJyYXlMaXN0PERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8+KCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8QXVkaXRpbmdHZW5lcmljRXZlbnQ+PiBzZXJ2aWNlRGlkTWFwID0gY3JlYXRlU2VydmljZURpZE1hcChkaXN0cmliU3RhdHVzSW5mb0xpc3QpOworCQlTZXQ8U3RyaW5nPiBkaWRTZXQgPSBzZXJ2aWNlRGlkTWFwLmtleVNldCgpOworCQlmb3IgKFN0cmluZyBkaWQgOiBkaWRTZXQpIHsKKwkJCURpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8gZGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mbyA9IG5ldyBEaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VJbmZvKCk7CisJCQlkaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VJbmZvLnNldERpc3RyaWJ1dGlvbklEKGRpZCk7CisJCQlTdHJpbmcgZFJlZ3Vlc3RTdGF0dXMgPSAiIjsKKwkJCVN0cmluZyBkTm90aWZ5U3RhdHVzID0gIiI7CisJCQlib29sZWFuIGlzUmVzdWx0ID0gZmFsc2U7CisJCQlMaXN0PD8gZXh0ZW5kcyBBdWRpdGluZ0dlbmVyaWNFdmVudD4gYXVkaXRpbmdHZW5lcmljRXZlbnRMaXN0ID0gc2VydmljZURpZE1hcC5nZXQoZGlkKTsKKwkJCUVTVGltZUJhc2VkRXZlbnQgcmVzQXVkaXRpbmdHZW5lcmljRXZlbnQgPSBudWxsOworCQkJZm9yIChBdWRpdGluZ0dlbmVyaWNFdmVudCBhdWRpdGluZ0dlbmVyaWNFdmVudCA6IGF1ZGl0aW5nR2VuZXJpY0V2ZW50TGlzdCkgeworCQkJCWF1ZGl0aW5nR2VuZXJpY0V2ZW50LmZpbGxGaWVsZHMoKTsKKworCQkJCVN0cmluZyBhY3Rpb24gPSAoU3RyaW5nKSBhdWRpdGluZ0dlbmVyaWNFdmVudC5nZXRGaWVsZHMoKS5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04uZ2V0RGlzcGxheU5hbWUoKSk7CisJCQkJT2JqZWN0IG1vZGlmaWVyVXNlcklkID0gYXVkaXRpbmdHZW5lcmljRXZlbnQuZ2V0RmllbGRzKCkuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELmdldERpc3BsYXlOYW1lKCkpOworCQkJCWlmIChtb2RpZmllclVzZXJJZCAhPSBudWxsKSB7CisJCQkJCWRpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8uc2V0VXNlcklkKChTdHJpbmcpIG1vZGlmaWVyVXNlcklkKTsKKwkJCQl9CisKKwkJCQlpZiAoYWN0aW9uLmVxdWFscyhBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX0RFUExPWS5nZXROYW1lKCkpKSB7CisKKwkJCQkJaXNSZXN1bHQgPSB0cnVlOworCQkJCQlyZXNBdWRpdGluZ0dlbmVyaWNFdmVudCA9IGF1ZGl0aW5nR2VuZXJpY0V2ZW50OworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9TVEFURV9DSEFOR0VfUkVRVUVTVC5nZXROYW1lKCkpKSB7CisJCQkJCWRSZWd1ZXN0U3RhdHVzID0gZ2V0U3RhdHVzRnJvbUF1ZGl0RXZlbnQoYXVkaXRpbmdHZW5lcmljRXZlbnQpOworCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX05PVElGWS5nZXROYW1lKCkpKSB7CisJCQkJCWROb3RpZnlTdGF0dXMgPSBnZXRTdGF0dXNGcm9tQXVkaXRFdmVudChhdWRpdGluZ0dlbmVyaWNFdmVudCk7CisJCQkJfQorCisJCQkJcmVzQXVkaXRpbmdHZW5lcmljRXZlbnQgPSBhdWRpdGluZ0dlbmVyaWNFdmVudDsKKworCQkJfQorCQkJZGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mby5zZXRUaW1lc3RhbXAoKFN0cmluZykgcmVzQXVkaXRpbmdHZW5lcmljRXZlbnQuZ2V0RmllbGRzKCkuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLmdldERpc3BsYXlOYW1lKCkpKTsKKworCQkJaWYgKCFpc1Jlc3VsdCkgeworCQkJCWlmIChkUmVndWVzdFN0YXR1cy5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoSHR0cFN0YXR1cy5TQ19PSykpKSB7CisJCQkJCWlmIChkTm90aWZ5U3RhdHVzLmlzRW1wdHkoKSkgeworCQkJCQkJZGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mby5zZXREZXBsb3llbWVudFN0YXR1cyhJTl9QUk9HUkVTUyk7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChkTm90aWZ5U3RhdHVzLmVxdWFscyhTdHJpbmcudmFsdWVPZihIdHRwU3RhdHVzLlNDX09LKSkpCisJCQkJCQkJZGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mby5zZXREZXBsb3llbWVudFN0YXR1cyhESVNUUklCVVRFRCk7CisJCQkJCQllbHNlCisJCQkJCQkJZGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mby5zZXREZXBsb3llbWVudFN0YXR1cyhFUlJPUik7CisJCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJZGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mby5zZXREZXBsb3llbWVudFN0YXR1cyhFUlJPUik7CisJCQl9IGVsc2UKKwkJCQlkaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VJbmZvLnNldERlcGxveWVtZW50U3RhdHVzKERFUExPWUVEKTsKKwkJCXJlc2xpc3QuYWRkKGRpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8pOworCQl9CisKKwkJcmV0dXJuIHJlc2xpc3Q7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdHVzRnJvbUF1ZGl0RXZlbnQoRVNUaW1lQmFzZWRFdmVudCBhdWRpdGluZ0dlbmVyaWNFdmVudCkgeworCQlTdHJpbmcgc3RhdHVzID0gIiI7CisJCU9iamVjdCByZXF1ZXN0U3RhdHVzID0gYXVkaXRpbmdHZW5lcmljRXZlbnQuZ2V0RmllbGRzKCkuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLmdldERpc3BsYXlOYW1lKCkpOworCQlpZiAocmVxdWVzdFN0YXR1cyBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJc3RhdHVzID0gKFN0cmluZykgcmVxdWVzdFN0YXR1czsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxBdWRpdGluZ0dlbmVyaWNFdmVudD4+IGNyZWF0ZVNlcnZpY2VEaWRNYXAoTGlzdDw/IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQ+IGRpc3RyaWJTdGF0dXNJbmZvTGlzdCkgeworCisJCU1hcDxTdHJpbmcsIExpc3Q8QXVkaXRpbmdHZW5lcmljRXZlbnQ+PiBzZXJ2aWNlRGlkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEF1ZGl0aW5nR2VuZXJpY0V2ZW50Pj4oKTsKKwkJZm9yIChBdWRpdGluZ0dlbmVyaWNFdmVudCBhdWRpdGluZ0dlbmVyaWNFdmVudCA6IGRpc3RyaWJTdGF0dXNJbmZvTGlzdCkgeworCQkJTGlzdDxBdWRpdGluZ0dlbmVyaWNFdmVudD4gYXVkaXRpbmdHZW5lcmljRXZlbnRMaXN0ID0gbnVsbDsKKwkJCVN0cmluZyBkaWQgPSAiIjsKKwkJCWF1ZGl0aW5nR2VuZXJpY0V2ZW50LmZpbGxGaWVsZHMoKTsKKworCQkJT2JqZWN0IGRpZFZhbHVlID0gYXVkaXRpbmdHZW5lcmljRXZlbnQuZ2V0RmllbGRzKCkuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0lELmdldERpc3BsYXlOYW1lKCkpOworCQkJaWYgKGRpZFZhbHVlICE9IG51bGwpIHsKKwkJCQlkaWQgPSAoU3RyaW5nKSBkaWRWYWx1ZTsKKwkJCX0KKworCQkJaWYgKCFkaWQuaXNFbXB0eSgpKSB7CisJCQkJaWYgKHNlcnZpY2VEaWRNYXAuY29udGFpbnNLZXkoZGlkKSkgeworCQkJCQlhdWRpdGluZ0dlbmVyaWNFdmVudExpc3QgPSBzZXJ2aWNlRGlkTWFwLmdldChkaWQpOworCQkJCX0KKwkJCQlpZiAoYXVkaXRpbmdHZW5lcmljRXZlbnRMaXN0ID09IG51bGwpIHsKKwkJCQkJYXVkaXRpbmdHZW5lcmljRXZlbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCQkJfQorCQkJCWF1ZGl0aW5nR2VuZXJpY0V2ZW50TGlzdC5hZGQoYXVkaXRpbmdHZW5lcmljRXZlbnQpOworCQkJCXNlcnZpY2VEaWRNYXAucHV0KGRpZCwgYXVkaXRpbmdHZW5lcmljRXZlbnRMaXN0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2VydmljZURpZE1hcDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvRWxlbWVudEJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvRWxlbWVudEJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWJiODZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9FbGVtZW50QnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsMTEyNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5OYW1lVmFsdWVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQudXRpbHMuVVJMRW5jb2RlZFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGFtb2RlbC5hcGkuQ2F0ZWdvcnlUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwudXRpbHMuTm9kZVR5cGVDb252ZXJ0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkFzc2V0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5GaWx0ZXJLZXlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3RUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EaXN0cmlidXRpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5U2NvcGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5UYWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuR3JvdXBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Db21wb25lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlVzZXJCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgiZWxlbWVudHNCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBFbGVtZW50QnVzaW5lc3NMb2dpYyBleHRlbmRzIEJhc2VCdXNpbmVzc0xvZ2ljIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFbGVtZW50QnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW5NYW5hZ2VyOworCisJLyoqCisJICogCisJICogQHBhcmFtIHVzZXIKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PiwgUmVzcG9uc2VGb3JtYXQ+IGdldEZvbGxvd2VkKFVzZXIgdXNlcikgeworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4sIFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZSA9IG51bGw7CisJCS8vIEdldHRpbmcgdGhlIHJvbGUKKwkJU3RyaW5nIHJvbGUgPSB1c2VyLmdldFJvbGUoKTsKKwkJU3RyaW5nIHVzZXJJZCA9IG51bGw7CisJCVJvbGUgY3VycmVudFJvbGUgPSBSb2xlLnZhbHVlT2Yocm9sZSk7CisKKwkJc3dpdGNoIChjdXJyZW50Um9sZSkgeworCQljYXNlIERFU0lHTkVSOgorCQkJdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKwkJCXJlc3BvbnNlID0gaGFuZGxlRGVzaWduZXIodXNlcklkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVEVTVEVSOgorCQkJdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKwkJCXJlc3BvbnNlID0gaGFuZGxlVGVzdGVyKHVzZXJJZCk7CisJCQlicmVhazsKKworCQljYXNlIEdPVkVSTk9SOgorCQkJdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKwkJCXJlc3BvbnNlID0gaGFuZGxlR292ZXJub3IodXNlcklkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT1BTOgorCQkJdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKwkJCXJlc3BvbnNlID0gaGFuZGxlT3BzKHVzZXJJZCk7CisJCQlicmVhazsKKworCQljYXNlIFBST0RVQ1RfU1RSQVRFR0lTVDoKKwkJCXVzZXJJZCA9IHVzZXIuZ2V0VXNlcklkKCk7CisJCQlyZXNwb25zZSA9IGhhbmRsZVByb2R1Y3RTdHJhdGVnaXN0KHVzZXJJZCk7CisJCQlicmVhazsKKworCQljYXNlIFBST0RVQ1RfTUFOQUdFUjoKKwkJCXVzZXJJZCA9IHVzZXIuZ2V0VXNlcklkKCk7CisJCQlyZXNwb25zZSA9IGhhbmRsZVByb2R1Y3RNYW5hZ2VyKHVzZXJJZCk7CisJCQlicmVhazsKKworCQljYXNlIEFETUlOOgorCQkJcmVzcG9uc2UgPSBoYW5kbGVBZG1pbigpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXNwb25zZTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlQWRtaW4oKSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlOworCQkvLyB1c2VySWQgc2hvdWxkIHN0YXkgbnVsbAorCQlTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMgPSBuZXcgSGFzaFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+KCk7CisJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcyA9IG5ldyBIYXNoU2V0PExpZmVjeWNsZVN0YXRlRW51bT4oKTsKKwkJbGlmZWN5Y2xlU3RhdGVzLmFkZChMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKTsKKwkJcmVzcG9uc2UgPSBnZXRGb2xsb3dlZFJlc291cmNlc0FuZFNlcnZpY2VzKG51bGwsIGxpZmVjeWNsZVN0YXRlcywgbGFzdFN0YXRlU3RhdGVzKTsKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlRGVzaWduZXIoU3RyaW5nIHVzZXJJZCkgeworCQlTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMgPSBuZXcgSGFzaFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+KCk7CisJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcyA9IG5ldyBIYXNoU2V0PExpZmVjeWNsZVN0YXRlRW51bT4oKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2U7CisJCWxpZmVjeWNsZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWxpZmVjeWNsZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlsaWZlY3ljbGVTdGF0ZXMuYWRkKExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCWxpZmVjeWNsZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlsaWZlY3ljbGVTdGF0ZXMuYWRkKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCQkvLyBtb3JlIHN0YXRlcworCQlsYXN0U3RhdGVTdGF0ZXMuYWRkKExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCXJlc3BvbnNlID0gZ2V0Rm9sbG93ZWRSZXNvdXJjZXNBbmRTZXJ2aWNlcyh1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgbGFzdFN0YXRlU3RhdGVzKTsKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlR292ZXJub3IoU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBoYW5kbGVGb2xsb3dlZENlcnRpZmllZFNlcnZpY2VzKG51bGwpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlUHJvZHVjdFN0cmF0ZWdpc3QoU3RyaW5nIHVzZXJJZCkgeworCQkvLyBTaG91bGQgYmUgZW1wdHkgbGlzdCBhY2NvcmRpbmcgdG8gRWxsYSwgMTMvMDMvMTYKKwkJTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PigpOworCQlyZXN1bHQucHV0KCJwcm9kdWN0cyIsIG5ldyBBcnJheUxpc3Q8PigpKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVQcm9kdWN0TWFuYWdlcihTdHJpbmcgdXNlcklkKSB7CisJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxpZmVjeWNsZVN0YXRlcyA9IG5ldyBIYXNoU2V0PExpZmVjeWNsZVN0YXRlRW51bT4oKTsKKwkJU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGFzdFN0YXRlU3RhdGVzID0gbmV3IEhhc2hTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4sIFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZTsKKwkJbGlmZWN5Y2xlU3RhdGVzLmFkZChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJbGlmZWN5Y2xlU3RhdGVzLmFkZChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCWxpZmVjeWNsZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJbGlmZWN5Y2xlU3RhdGVzLmFkZChMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCWxpZmVjeWNsZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCS8vIG1vcmUgc3RhdGVzCisJCWxhc3RTdGF0ZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJcmVzcG9uc2UgPSBnZXRGb2xsb3dlZFByb2R1Y3RzKHVzZXJJZCwgbGlmZWN5Y2xlU3RhdGVzLCBsYXN0U3RhdGVTdGF0ZXMpOworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVPcHMoU3RyaW5nIHVzZXJJZCkgeworCQlTZXQ8RGlzdHJpYnV0aW9uU3RhdHVzRW51bT4gZGlzdFN0YXR1cyA9IG5ldyBIYXNoU2V0PERpc3RyaWJ1dGlvblN0YXR1c0VudW0+KCk7CisJCWRpc3RTdGF0dXMuYWRkKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVEKTsKKwkJZGlzdFN0YXR1cy5hZGQoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCk7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gaGFuZGxlRm9sbG93ZWRDZXJ0aWZpZWRTZXJ2aWNlcyhkaXN0U3RhdHVzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZUZvbGxvd2VkQ2VydGlmaWVkU2VydmljZXMoU2V0PERpc3RyaWJ1dGlvblN0YXR1c0VudW0+IGRpc3RTdGF0dXMpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCisJCUVpdGhlcjxTZXQ8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VzID0gc2VydmljZU9wZXJhdGlvbi5nZXRDZXJ0aWZpZWRTZXJ2aWNlc1dpdGhEaXN0U3RhdHVzKHByb3BlcnRpZXNUb01hdGNoLCBkaXN0U3RhdHVzLCBmYWxzZSk7CisJCWlmIChzZXJ2aWNlcy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PigpOworCQkJTGlzdDxTZXJ2aWNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlsaXN0LmFkZEFsbChzZXJ2aWNlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXN1bHQucHV0KCJzZXJ2aWNlcyIsIGxpc3QpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc2VydmljZXMucmlnaHQoKS52YWx1ZSgpKSkpOworCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVUZXN0ZXIoU3RyaW5nIHVzZXJJZCkgeworCQlTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMgPSBuZXcgSGFzaFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+KCk7CisJCWxpZmVjeWNsZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlcyA9IHJlc291cmNlT3BlcmF0aW9uLmdldFRlc3RlckZvbGxvd2VkKHVzZXJJZCwgbGlmZWN5Y2xlU3RhdGVzLCBmYWxzZSk7CisKKwkJaWYgKHJlc291cmNlcy5pc0xlZnQoKSkgeworCQkJRWl0aGVyPExpc3Q8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VzID0gc2VydmljZU9wZXJhdGlvbi5nZXRUZXN0ZXJGb2xsb3dlZCh1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgZmFsc2UpOworCQkJaWYgKHNlcnZpY2VzLmlzTGVmdCgpKSB7CisJCQkJTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PigpOworCQkJCXJlc3VsdC5wdXQoInNlcnZpY2VzIiwgc2VydmljZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdC5wdXQoInJlc291cmNlcyIsIHJlc291cmNlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzZXJ2aWNlcy5yaWdodCgpLnZhbHVlKCkpKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzb3VyY2VzLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gZ2V0Rm9sbG93ZWRSZXNvdXJjZXNBbmRTZXJ2aWNlcyhTdHJpbmcgdXNlcklkLCBTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMsIFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcykgeworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlcyA9IHJlc291cmNlT3BlcmF0aW9uLmdldEZvbGxvd2VkKHVzZXJJZCwgbGlmZWN5Y2xlU3RhdGVzLCBsYXN0U3RhdGVTdGF0ZXMsIGZhbHNlKTsKKworCQlpZiAocmVzb3VyY2VzLmlzTGVmdCgpKSB7CisJCQlFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZXMgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldEZvbGxvd2VkKHVzZXJJZCwgbGlmZWN5Y2xlU3RhdGVzLCBsYXN0U3RhdGVTdGF0ZXMsIGZhbHNlKTsKKwkJCWlmIChzZXJ2aWNlcy5pc0xlZnQoKSkgeworCQkJCU1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4oKTsKKwkJCQlyZXN1bHQucHV0KCJzZXJ2aWNlcyIsIHNlcnZpY2VzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQlyZXN1bHQucHV0KCJyZXNvdXJjZXMiLCByZXNvdXJjZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc2VydmljZXMucmlnaHQoKS52YWx1ZSgpKSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc291cmNlcy5yaWdodCgpLnZhbHVlKCkpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PiwgUmVzcG9uc2VGb3JtYXQ+IGdldEZvbGxvd2VkUHJvZHVjdHMoU3RyaW5nIHVzZXJJZCwgU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzLCBTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsYXN0U3RhdGVTdGF0ZXMpIHsKKwkJRWl0aGVyPExpc3Q8UHJvZHVjdD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHByb2R1Y3RzID0gcHJvZHVjdE9wZXJhdGlvbi5nZXRGb2xsb3dlZCh1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgbGFzdFN0YXRlU3RhdGVzLCBmYWxzZSk7CisJCWlmIChwcm9kdWN0cy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PigpOworCQkJcmVzdWx0LnB1dCgicHJvZHVjdHMiLCBwcm9kdWN0cy5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShwcm9kdWN0cy5yaWdodCgpLnZhbHVlKCkpKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIE5ldyBjYXRlZ29yaWVzIGZsb3cgLSBzdGFydAorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGdldEFsbFJlc291cmNlQ2F0ZWdvcmllcygpIHsKKwkJcmV0dXJuIGVsZW1lbnRPcGVyYXRpb24uZ2V0QWxsUmVzb3VyY2VDYXRlZ29yaWVzKCk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsU2VydmljZUNhdGVnb3JpZXMoKSB7CisJCXJldHVybiBlbGVtZW50T3BlcmF0aW9uLmdldEFsbFNlcnZpY2VDYXRlZ29yaWVzKCk7CisJfQorCisJcHVibGljIEVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVDYXRlZ29yeShDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnksIFN0cmluZyBjb21wb25lbnRUeXBlUGFyYW1OYW1lLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uID0gQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9DQVRFR09SWTsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29tcG9uZW50VHlwZVBhcmFtTmFtZSk7CisJCVN0cmluZyBjb21wb25lbnRUeXBlID0gKGNvbXBvbmVudFR5cGVFbnVtID09IG51bGwgPyBjb21wb25lbnRUeXBlUGFyYW1OYW1lIDogY29tcG9uZW50VHlwZUVudW0uZ2V0VmFsdWUoKSk7CisJCUNhdGVnb3J5VHlwZUVudW0gY2F0ZWdvcnlUeXBlID0gQ2F0ZWdvcnlUeXBlRW51bS5DQVRFR09SWTsKKworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcigpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlciA9IHZhbGlkYXRlVXNlcih1c2VySWQpOworCQlpZiAodmFsaWRhdGVVc2VyLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJWYWxpZGF0aW9uIG9mIHVzZXIgZmFpbGVkLCB1c2VySWQge30iLCB1c2VySWQpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZVVzZXIucmlnaHQoKS52YWx1ZSgpOworCQkJdXNlciA9IG5ldyBVc2VyKCk7CisJCQl1c2VyLnNldFVzZXJJZCh1c2VySWQpOworCQkJU3RyaW5nIGN1cnJDYXRlZ29yeU5hbWUgPSAoY2F0ZWdvcnkgPT0gbnVsbCA/IG51bGwgOiBjYXRlZ29yeS5nZXROYW1lKCkpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgY3VyckNhdGVnb3J5TmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQl1c2VyID0gdmFsaWRhdGVVc2VyLmxlZnQoKS52YWx1ZSgpOworCisJCWlmIChjYXRlZ29yeSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkNhdGVnb3J5IGpzb24gaXMgaW52YWxpZCIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBudWxsLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCVN0cmluZyBjYXRlZ29yeU5hbWUgPSBjYXRlZ29yeS5nZXROYW1lKCk7CisJCS8vIEZvciBhdWRpdGluZyBvZiBmYWlsdXJlcyB3ZSBuZWVkIHRoZSBvcmlnaW5hbCBub24tbm9ybWFsaXplZCBuYW1lCisJCVN0cmluZyBvcmlnQ2F0ZWdvcnlOYW1lID0gY2F0ZWdvcnlOYW1lOworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgdHlwZSB7fSBpcyBpbnZhbGlkIiwgY29tcG9uZW50VHlwZVBhcmFtTmFtZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG9yaWdDYXRlZ29yeU5hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVzZXJSb2xlID0gdmFsaWRhdGVVc2VyUm9sZSh1c2VyLCBjb21wb25lbnRUeXBlRW51bSk7CisJCWlmICh2YWxpZGF0ZVVzZXJSb2xlLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJWYWxpZGF0aW9uIG9mIHVzZXIgcm9sZSBmYWlsZWQsIHVzZXJJZCB7fSIsIHVzZXJJZCk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlVXNlclJvbGUucmlnaHQoKS52YWx1ZSgpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgb3JpZ0NhdGVnb3J5TmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNhdGVnb3J5RGlzcGxheU5hbWVGb3JtYXQoY2F0ZWdvcnlOYW1lKSkgeworCQkJbG9nLmRlYnVnKCJDYXRlZ29yeSBkaXNwbGF5IG5hbWUgZm9ybWF0IGlzIGludmFsaWQsIG5hbWUge30sIGNvbXBvbmVudFR5cGUge30iLCBjYXRlZ29yeU5hbWUsIGNvbXBvbmVudFR5cGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9GT1JNQVQsIGNvbXBvbmVudFR5cGUsIGNhdGVnb3J5VHlwZS5nZXRWYWx1ZSgpKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG9yaWdDYXRlZ29yeU5hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJY2F0ZWdvcnlOYW1lID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTREaXNwbGF5KGNhdGVnb3J5TmFtZSk7CisKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lTGVuZ3RoKGNhdGVnb3J5TmFtZSkpIHsKKwkJCWxvZy5kZWJ1ZygiQ2F0ZWdvcnkgZGlzcGxheSBuYW1lIGxlbmd0aCBpcyBpbnZhbGlkLCBzaG91bGQgYmUgZnJvbSA0IHRvIDI1IGNoYXJzLCBuYW1lIHt9LCBjb21wb25lbnRUeXBlIHt9IiwgY2F0ZWdvcnlOYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfTEVOR1RILCBjb21wb25lbnRUeXBlLCBjYXRlZ29yeVR5cGUuZ2V0VmFsdWUoKSk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBvcmlnQ2F0ZWdvcnlOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWNhdGVnb3J5LnNldE5hbWUoY2F0ZWdvcnlOYW1lKTsKKworCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MoY2F0ZWdvcnlOYW1lKTsKKwkJY2F0ZWdvcnkuc2V0Tm9ybWFsaXplZE5hbWUobm9ybWFsaXplZE5hbWUpOworCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IE5vZGVUeXBlQ29udmVydFV0aWxzLmdldENhdGVnb3J5Tm9kZVR5cGVCeUNvbXBvbmVudFBhcmFtKGNvbXBvbmVudFR5cGVFbnVtLCBjYXRlZ29yeVR5cGUpOworCisJCUVpdGhlcjxCb29sZWFuLCBBY3Rpb25TdGF0dXM+IGNhdGVnb3J5VW5pcXVlRWl0aGVyID0gZWxlbWVudE9wZXJhdGlvbi5pc0NhdGVnb3J5VW5pcXVlRm9yVHlwZShub2RlVHlwZSwgbm9ybWFsaXplZE5hbWUpOworCQlpZiAoY2F0ZWdvcnlVbmlxdWVFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjaGVjayBjYXRlZ29yeSB1bmlxdWVuZXNzLCBuYW1lIHt9LCBjb21wb25lbnRUeXBlIHt9IiwgY2F0ZWdvcnlOYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNhdGVnb3J5VW5pcXVlRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBvcmlnQ2F0ZWdvcnlOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUJvb2xlYW4gaXNDYXRlZ29yeVVuaXF1ZSA9IGNhdGVnb3J5VW5pcXVlRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoIWlzQ2F0ZWdvcnlVbmlxdWUpIHsKKwkJCWxvZy5kZWJ1ZygiQ2F0ZWdvcnkgaXMgbm90IHVuaXF1ZSwgbmFtZSB7fSwgY29tcG9uZW50VHlwZSB7fSIsIGNhdGVnb3J5TmFtZSwgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX0FMUkVBRFlfRVhJU1RTLCBjb21wb25lbnRUeXBlLCBjYXRlZ29yeU5hbWUpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgb3JpZ0NhdGVnb3J5TmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNyZWF0ZUNhdGVnb3J5QnlUeXBlID0gZWxlbWVudE9wZXJhdGlvbi5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeSwgbm9kZVR5cGUpOworCQlpZiAoY3JlYXRlQ2F0ZWdvcnlCeVR5cGUuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgY2F0ZWdvcnksIG5hbWUge30sIGNvbXBvbmVudFR5cGUge30iLCBjYXRlZ29yeU5hbWUsIGNvbXBvbmVudFR5cGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9BTFJFQURZX0VYSVNUUywgY29tcG9uZW50VHlwZSwgY2F0ZWdvcnlOYW1lKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG9yaWdDYXRlZ29yeU5hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNyZWF0ZUNhdGVnb3J5QnlUeXBlLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisJCWNhdGVnb3J5ID0gY3JlYXRlQ2F0ZWdvcnlCeVR5cGUubGVmdCgpLnZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiQ3JlYXRlZCBjYXRlZ29yeSBmb3IgY29tcG9uZW50IHt9LCBuYW1lIHt9LCB1bmlxdWVJZCB7fSIsIGNvbXBvbmVudFR5cGUsIGNhdGVnb3J5TmFtZSwgY2F0ZWdvcnkuZ2V0VW5pcXVlSWQoKSk7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgY2F0ZWdvcnkuZ2V0TmFtZSgpLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCXJldHVybiBFaXRoZXIubGVmdChjYXRlZ29yeSk7CisJfQorCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVTdWJDYXRlZ29yeShTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnksIFN0cmluZyBjb21wb25lbnRUeXBlUGFyYW1OYW1lLCBTdHJpbmcgcGFyZW50Q2F0ZWdvcnlJZCwgU3RyaW5nIHVzZXJJZCkgeworCisJCUF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiA9IEF1ZGl0aW5nQWN0aW9uRW51bS5BRERfU1VCX0NBVEVHT1JZOworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb21wb25lbnRUeXBlUGFyYW1OYW1lKTsKKwkJU3RyaW5nIGNvbXBvbmVudFR5cGUgPSAoY29tcG9uZW50VHlwZUVudW0gPT0gbnVsbCA/IGNvbXBvbmVudFR5cGVQYXJhbU5hbWUgOiBjb21wb25lbnRUeXBlRW51bS5nZXRWYWx1ZSgpKTsKKwkJQ2F0ZWdvcnlUeXBlRW51bSBjYXRlZ29yeVR5cGUgPSBDYXRlZ29yeVR5cGVFbnVtLlNVQkNBVEVHT1JZOworCQkvLyBGb3IgYXVkaXRpbmcKKwkJU3RyaW5nIHBhcmVudENhdGVnb3J5TmFtZSA9IHBhcmVudENhdGVnb3J5SWQ7CisKKwkJaWYgKHN1YkNhdGVnb3J5ID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiU3ViLWNhdGVnb3J5IGpzb24gaXMgaW52YWxpZCIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCBudWxsLCBwYXJlbnRDYXRlZ29yeU5hbWUsIG51bGwsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJU3RyaW5nIHN1YkNhdGVnb3J5TmFtZSA9IHN1YkNhdGVnb3J5LmdldE5hbWUoKTsKKwkJLy8gRm9yIGF1ZGl0aW5nIG9mIGZhaWx1cmVzIHdlIG5lZWQgdGhlIG9yaWdpbmFsIG5vbi1ub3JtYWxpemVkIG5hbWUKKwkJU3RyaW5nIG9yaWdTdWJDYXRlZ29yeU5hbWUgPSBzdWJDYXRlZ29yeU5hbWU7CisKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJLyoKKwkJICogaWYgKHVzZXJJZCA9PSBudWxsKSB7IHVzZXIuc2V0VXNlcklkKCJVTktOT1dOIik7IFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OKTsgaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBvcmlnU3ViQ2F0ZWdvcnlOYW1lLAorCQkgKiBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7IHJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOyB9CisJCSAqLworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlciA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJjcmVhdGVTdWJDYXRlZ29yeSIsIGZhbHNlKTsKKwkJaWYgKHZhbGlkYXRlVXNlci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiVmFsaWRhdGlvbiBvZiB1c2VyIGZhaWxlZCwgdXNlcklkIHt9IiwgdXNlcklkKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVVc2VyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXVzZXIgPSBuZXcgVXNlcigpOworCQkJdXNlci5zZXRVc2VySWQodXNlcklkKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgb3JpZ1N1YkNhdGVnb3J5TmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQl1c2VyID0gdmFsaWRhdGVVc2VyLmxlZnQoKS52YWx1ZSgpOworCisJCWlmIChjb21wb25lbnRUeXBlRW51bSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkNvbXBvbmVudCB0eXBlIHt9IGlzIGludmFsaWQiLCBjb21wb25lbnRUeXBlUGFyYW1OYW1lKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBvcmlnU3ViQ2F0ZWdvcnlOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRUeXBlID0gdmFsaWRhdGVDb21wb25lbnRUeXBlRm9yQ2F0ZWdvcnkoY29tcG9uZW50VHlwZUVudW0sIGNhdGVnb3J5VHlwZSk7CisJCWlmICh2YWxpZGF0ZUNvbXBvbmVudFR5cGUuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIlZhbGlkYXRpb24gb2YgY29tcG9uZW50IHR5cGUgZm9yIHN1Yi1jYXRlZ29yeSBmYWlsZWQiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVDb21wb25lbnRUeXBlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgb3JpZ1N1YkNhdGVnb3J5TmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlclJvbGUgPSB2YWxpZGF0ZVVzZXJSb2xlKHVzZXIsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJaWYgKHZhbGlkYXRlVXNlclJvbGUuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIlZhbGlkYXRpb24gb2YgdXNlciByb2xlIGZhaWxlZCwgdXNlcklkIHt9IiwgdXNlcklkKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVVc2VyUm9sZS5yaWdodCgpLnZhbHVlKCk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwYXJlbnRDYXRlZ29yeU5hbWUsIG9yaWdTdWJDYXRlZ29yeU5hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJTm9kZVR5cGVFbnVtIHBhcmVudE5vZGVUeXBlID0gTm9kZVR5cGVDb252ZXJ0VXRpbHMuZ2V0Q2F0ZWdvcnlOb2RlVHlwZUJ5Q29tcG9uZW50UGFyYW0oY29tcG9uZW50VHlwZUVudW0sIENhdGVnb3J5VHlwZUVudW0uQ0FURUdPUlkpOworCQlOb2RlVHlwZUVudW0gY2hpbGROb2RlVHlwZSA9IE5vZGVUeXBlQ29udmVydFV0aWxzLmdldENhdGVnb3J5Tm9kZVR5cGVCeUNvbXBvbmVudFBhcmFtKGNvbXBvbmVudFR5cGVFbnVtLCBDYXRlZ29yeVR5cGVFbnVtLlNVQkNBVEVHT1JZKTsKKworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uOworCQlFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYXRlZ29yeUV4aXN0cyA9IHZhbGlkYXRlQ2F0ZWdvcnlFeGlzdHMocGFyZW50Tm9kZVR5cGUsIHBhcmVudENhdGVnb3J5SWQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJaWYgKHZhbGlkYXRlQ2F0ZWdvcnlFeGlzdHMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIlZhbGlkYXRpb24gb2YgcGFyZW50IGNhdGVnb3J5IGV4aXN0cyBmYWlsZWQsIHBhcmVudCBjYXRlZ29yeUlkIHt9IiwgcGFyZW50Q2F0ZWdvcnlJZCk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlQ2F0ZWdvcnlFeGlzdHMucmlnaHQoKS52YWx1ZSgpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBvcmlnU3ViQ2F0ZWdvcnlOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWNhdGVnb3J5RGVmaW5pdGlvbiA9IHZhbGlkYXRlQ2F0ZWdvcnlFeGlzdHMubGVmdCgpLnZhbHVlKCk7CisJCXBhcmVudENhdGVnb3J5TmFtZSA9IGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCk7CisKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lRm9ybWF0KHN1YkNhdGVnb3J5TmFtZSkpIHsKKwkJCWxvZy5kZWJ1ZygiU3ViLWNhdGVnb3J5IGRpc3BsYXkgbmFtZSBmb3JtYXQgaXMgaW52YWxpZCwgbmFtZSB7fSwgY29tcG9uZW50VHlwZSB7fSIsIHN1YkNhdGVnb3J5TmFtZSwgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVCwgY29tcG9uZW50VHlwZSwgY2F0ZWdvcnlUeXBlLmdldFZhbHVlKCkpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBvcmlnU3ViQ2F0ZWdvcnlOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXN1YkNhdGVnb3J5TmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVDYXRlZ29yeU5hbWU0RGlzcGxheShzdWJDYXRlZ29yeU5hbWUpOworCisJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlEaXNwbGF5TmFtZUxlbmd0aChzdWJDYXRlZ29yeU5hbWUpKSB7CisJCQlsb2cuZGVidWcoIlN1Yi1jYXRlZ29yeSBkaXNwbGF5IG5hbWUgbGVuZ3RoIGlzIGludmFsaWQsIHNob3VsZCBiZSBmcm9tIDQgdG8gMjUgY2hhcnMsIG5hbWUge30sIGNvbXBvbmVudFR5cGUge30iLCBzdWJDYXRlZ29yeU5hbWUsIGNvbXBvbmVudFR5cGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEgsIGNvbXBvbmVudFR5cGUsIGNhdGVnb3J5VHlwZS5nZXRWYWx1ZSgpKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgb3JpZ1N1YkNhdGVnb3J5TmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3Moc3ViQ2F0ZWdvcnlOYW1lKTsKKwkJc3ViQ2F0ZWdvcnkuc2V0Tm9ybWFsaXplZE5hbWUobm9ybWFsaXplZE5hbWUpOworCisJCS8vIFVuaXF1ZW5lc3MgdW5kZXIgdGhpcyBjYXRlZ29yeQorCQlFaXRoZXI8Qm9vbGVhbiwgQWN0aW9uU3RhdHVzPiBzdWJDYXRlZ29yeVVuaXF1ZUZvckNhdGVnb3J5ID0gZWxlbWVudE9wZXJhdGlvbi5pc1N1YkNhdGVnb3J5VW5pcXVlRm9yQ2F0ZWdvcnkoY2hpbGROb2RlVHlwZSwgbm9ybWFsaXplZE5hbWUsIHBhcmVudENhdGVnb3J5SWQpOworCQlpZiAoc3ViQ2F0ZWdvcnlVbmlxdWVGb3JDYXRlZ29yeS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNoZWNrIHN1Yi1jYXRlZ29yeSB1bmlxdWVuZXNzLCBwYXJlbnQgbmFtZSB7fSwgc3ViY2F0ZWdvcnkgbm9ybSBuYW1lIHt9LCBjb21wb25lbnRUeXBlIHt9IiwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBub3JtYWxpemVkTmFtZSwgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChzdWJDYXRlZ29yeVVuaXF1ZUZvckNhdGVnb3J5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwYXJlbnRDYXRlZ29yeU5hbWUsIG9yaWdTdWJDYXRlZ29yeU5hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJQm9vbGVhbiBpc1N1YlVuaXF1ZSA9IHN1YkNhdGVnb3J5VW5pcXVlRm9yQ2F0ZWdvcnkubGVmdCgpLnZhbHVlKCk7CisJCWlmICghaXNTdWJVbmlxdWUpIHsKKwkJCWxvZy5kZWJ1ZygiU3ViLWNhdGVnb3J5IGlzIG5vdCB1bmlxdWUgZm9yIGNhdGVnb3J5LCBwYXJlbnQgbmFtZSB7fSwgc3ViY2F0ZWdvcnkgbm9ybSBuYW1lIHt9LCBjb21wb25lbnRUeXBlIHt9IiwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBub3JtYWxpemVkTmFtZSwgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9FWElTVFNfRk9SX0NBVEVHT1JZLCBjb21wb25lbnRUeXBlLCBzdWJDYXRlZ29yeU5hbWUsIHBhcmVudENhdGVnb3J5TmFtZSk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwYXJlbnRDYXRlZ29yeU5hbWUsIG9yaWdTdWJDYXRlZ29yeU5hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJLy8gU2V0dGluZyBuYW1lIG9mIHN1YmNhdGVnb3J5IHRvIGZpdCB0aGUgc2ltaWxhciBzdWJjYXRlZ29yeSBuYW1lCisJCS8vIGlnbm9yaW5nIGNhc2VzLgorCQkvLyBGb3IgZXhhbXBsZSBpZiBOZXR3b3JrLS0+a1VLVSBleGlzdHMgZm9yIHNlcnZpY2UgY2F0ZWdvcnkgTmV0d29yaywKKwkJLy8gYW5kIHVzZXIgaXMgdHJ5aW5nIHRvIGNyZWF0ZSBSb3V0ZXItLT5LdWt1IGZvciBzZXJ2aWNlIGNhdGVnb3J5CisJCS8vIFJvdXRlciwKKwkJLy8gaGlzIHN1YmNhdGVnb3J5IG5hbWUgd2lsbCBiZSBSb3V0ZXItLT5rVUtVLgorCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IHN1YkNhdGVnb3J5VW5pcXVlRm9yVHlwZSA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0U3ViQ2F0ZWdvcnlVbmlxdWVGb3JUeXBlKGNoaWxkTm9kZVR5cGUsIG5vcm1hbGl6ZWROYW1lKTsKKwkJaWYgKHN1YkNhdGVnb3J5VW5pcXVlRm9yVHlwZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHZhbGlkYXRpb24gb2Ygd2hldGhlciBzaW1pbGFyIHN1Yi1jYXRlZ29yeSBleGlzdHMsIG5vcm1hbGl6ZWROYW1lIHt9IGNvbXBvbmVudFR5cGUge30iLCBub3JtYWxpemVkTmFtZSwgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChzdWJDYXRlZ29yeVVuaXF1ZUZvclR5cGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgb3JpZ1N1YkNhdGVnb3J5TmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IHN1YkNhdGVnb3J5VW5pcXVlRm9yVHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHN1YkNhdGVnb3J5RGVmaW5pdGlvbiAhPSBudWxsKSB7CisJCQlzdWJDYXRlZ29yeU5hbWUgPSBzdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpOworCQl9CisKKwkJc3ViQ2F0ZWdvcnkuc2V0TmFtZShzdWJDYXRlZ29yeU5hbWUpOworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gVmFsaWRhdGlvbnMgZW5kCisKKwkJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVTdWJDYXRlZ29yeSA9IGVsZW1lbnRPcGVyYXRpb24uY3JlYXRlU3ViQ2F0ZWdvcnkocGFyZW50Q2F0ZWdvcnlJZCwgc3ViQ2F0ZWdvcnksIGNoaWxkTm9kZVR5cGUpOworCQlpZiAoY3JlYXRlU3ViQ2F0ZWdvcnkuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgc3ViLWNhdGVnb3J5LCBuYW1lIHt9LCBjb21wb25lbnRUeXBlIHt9Iiwgc3ViQ2F0ZWdvcnlOYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KHN1YkNhdGVnb3J5VW5pcXVlRm9yVHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBvcmlnU3ViQ2F0ZWdvcnlOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeUNyZWF0ZWQgPSBjcmVhdGVTdWJDYXRlZ29yeS5sZWZ0KCkudmFsdWUoKTsKKwkJbG9nLmRlYnVnKCJDcmVhdGVkIHN1Yi1jYXRlZ29yeSBmb3IgY29tcG9uZW50IHt9LCBuYW1lIHt9LCB1bmlxdWVJZCB7fSIsIGNvbXBvbmVudFR5cGUsIHN1YkNhdGVnb3J5TmFtZSwgc3ViQ2F0ZWdvcnlDcmVhdGVkLmdldFVuaXF1ZUlkKCkpOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1JFQVRFRCk7CisJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgc3ViQ2F0ZWdvcnlDcmVhdGVkLmdldE5hbWUoKSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoc3ViQ2F0ZWdvcnlDcmVhdGVkKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwaW5nRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwaW5nKEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZywgU3RyaW5nIGNvbXBvbmVudFR5cGVQYXJhbU5hbWUsIFN0cmluZyBncmFuZFBhcmVudENhdGVnb3J5SWQsIFN0cmluZyBwYXJlbnRTdWJDYXRlZ29yeUlkLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uID0gQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9HUk9VUElORzsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29tcG9uZW50VHlwZVBhcmFtTmFtZSk7CisJCVN0cmluZyBjb21wb25lbnRUeXBlID0gKGNvbXBvbmVudFR5cGVFbnVtID09IG51bGwgPyBjb21wb25lbnRUeXBlUGFyYW1OYW1lIDogY29tcG9uZW50VHlwZUVudW0uZ2V0VmFsdWUoKSk7CisJCUNhdGVnb3J5VHlwZUVudW0gY2F0ZWdvcnlUeXBlID0gQ2F0ZWdvcnlUeXBlRW51bS5HUk9VUElORzsKKwkJLy8gRm9yIGF1ZGl0aW5nCisJCVN0cmluZyBwYXJlbnRDYXRlZ29yeU5hbWUgPSBncmFuZFBhcmVudENhdGVnb3J5SWQ7CisJCVN0cmluZyBwYXJlbnRTdWJDYXRlZ29yeU5hbWUgPSBwYXJlbnRTdWJDYXRlZ29yeUlkOworCisJCVVzZXIgdXNlcjsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVzZXIgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiY3JlYXRlIEdyb3VwaW5nIiwgZmFsc2UpOworCQlpZiAodmFsaWRhdGVVc2VyLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJWYWxpZGF0aW9uIG9mIHVzZXIgZmFpbGVkLCB1c2VySWQge30iLCB1c2VySWQpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZVVzZXIucmlnaHQoKS52YWx1ZSgpOworCQkJdXNlciA9IG5ldyBVc2VyKCk7CisJCQl1c2VyLnNldFVzZXJJZCh1c2VySWQpOworCQkJU3RyaW5nIGdyb3VwaW5nTmFtZUZvckF1ZGl0ID0gKGdyb3VwaW5nID09IG51bGwgPyBudWxsIDogZ3JvdXBpbmcuZ2V0TmFtZSgpKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lLCBncm91cGluZ05hbWVGb3JBdWRpdCwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQl1c2VyID0gdmFsaWRhdGVVc2VyLmxlZnQoKS52YWx1ZSgpOworCisJCWlmIChncm91cGluZyA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkdyb3VwaW5nIGpzb24gaXMgaW52YWxpZCIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwYXJlbnRDYXRlZ29yeU5hbWUsIHBhcmVudFN1YkNhdGVnb3J5TmFtZSwgbnVsbCwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlTdHJpbmcgZ3JvdXBpbmdOYW1lID0gZ3JvdXBpbmcuZ2V0TmFtZSgpOworCQkvLyBGb3IgYXVkaXRpbmcgb2YgZmFpbHVyZXMgd2UgbmVlZCB0aGUgb3JpZ2luYWwgbm9uLW5vcm1hbGl6ZWQgbmFtZQorCQlTdHJpbmcgb3JpZ0dyb3VwaW5nTmFtZSA9IGdyb3VwaW5nTmFtZTsKKworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgdHlwZSB7fSBpcyBpbnZhbGlkIiwgY29tcG9uZW50VHlwZVBhcmFtTmFtZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lLCBvcmlnR3JvdXBpbmdOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnRUeXBlID0gdmFsaWRhdGVDb21wb25lbnRUeXBlRm9yQ2F0ZWdvcnkoY29tcG9uZW50VHlwZUVudW0sIGNhdGVnb3J5VHlwZSk7CisJCWlmICh2YWxpZGF0ZUNvbXBvbmVudFR5cGUuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIlZhbGlkYXRpb24gb2YgY29tcG9uZW50IHR5cGUgZm9yIGdyb3VwaW5nIGZhaWxlZCIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUNvbXBvbmVudFR5cGUucmlnaHQoKS52YWx1ZSgpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBwYXJlbnRTdWJDYXRlZ29yeU5hbWUsIG9yaWdHcm91cGluZ05hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVzZXJSb2xlID0gdmFsaWRhdGVVc2VyUm9sZSh1c2VyLCBjb21wb25lbnRUeXBlRW51bSk7CisJCWlmICh2YWxpZGF0ZVVzZXJSb2xlLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJWYWxpZGF0aW9uIG9mIHVzZXIgcm9sZSBmYWlsZWQsIHVzZXJJZCB7fSIsIHVzZXJJZCk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlVXNlclJvbGUucmlnaHQoKS52YWx1ZSgpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBwYXJlbnRTdWJDYXRlZ29yeU5hbWUsIG9yaWdHcm91cGluZ05hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJTm9kZVR5cGVFbnVtIGdyYW5kUGFyZW50Tm9kZVR5cGUgPSBOb2RlVHlwZUNvbnZlcnRVdGlscy5nZXRDYXRlZ29yeU5vZGVUeXBlQnlDb21wb25lbnRQYXJhbShjb21wb25lbnRUeXBlRW51bSwgQ2F0ZWdvcnlUeXBlRW51bS5DQVRFR09SWSk7CisJCU5vZGVUeXBlRW51bSBwYXJlbnROb2RlVHlwZSA9IE5vZGVUeXBlQ29udmVydFV0aWxzLmdldENhdGVnb3J5Tm9kZVR5cGVCeUNvbXBvbmVudFBhcmFtKGNvbXBvbmVudFR5cGVFbnVtLCBDYXRlZ29yeVR5cGVFbnVtLlNVQkNBVEVHT1JZKTsKKwkJTm9kZVR5cGVFbnVtIGNoaWxkTm9kZVR5cGUgPSBOb2RlVHlwZUNvbnZlcnRVdGlscy5nZXRDYXRlZ29yeU5vZGVUeXBlQnlDb21wb25lbnRQYXJhbShjb21wb25lbnRUeXBlRW51bSwgQ2F0ZWdvcnlUeXBlRW51bS5HUk9VUElORyk7CisKKwkJLy8gVmFsaWRhdGUgY2F0ZWdvcnkKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbjsKKwkJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2F0ZWdvcnlFeGlzdHMgPSB2YWxpZGF0ZUNhdGVnb3J5RXhpc3RzKGdyYW5kUGFyZW50Tm9kZVR5cGUsIGdyYW5kUGFyZW50Q2F0ZWdvcnlJZCwgY29tcG9uZW50VHlwZUVudW0pOworCQlpZiAodmFsaWRhdGVDYXRlZ29yeUV4aXN0cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiVmFsaWRhdGlvbiBvZiBwYXJlbnQgY2F0ZWdvcnkgZXhpc3RzIGZhaWxlZCwgcGFyZW50IGNhdGVnb3J5SWQge30iLCBncmFuZFBhcmVudENhdGVnb3J5SWQpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUNhdGVnb3J5RXhpc3RzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lLCBvcmlnR3JvdXBpbmdOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWNhdGVnb3J5RGVmaW5pdGlvbiA9IHZhbGlkYXRlQ2F0ZWdvcnlFeGlzdHMubGVmdCgpLnZhbHVlKCk7CisJCXBhcmVudENhdGVnb3J5TmFtZSA9IGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCk7CisKKwkJLy8gVmFsaWRhdGUgc3ViY2F0ZWdvcnkKKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKKwkJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU3ViQ2F0ZWdvcnlFeGlzdHMgPSB2YWxpZGF0ZVN1YkNhdGVnb3J5RXhpc3RzKHBhcmVudE5vZGVUeXBlLCBwYXJlbnRTdWJDYXRlZ29yeUlkLCBjb21wb25lbnRUeXBlRW51bSk7CisJCWlmICh2YWxpZGF0ZVN1YkNhdGVnb3J5RXhpc3RzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJWYWxpZGF0aW9uIG9mIHBhcmVudCBzdWItY2F0ZWdvcnkgZXhpc3RzIGZhaWxlZCwgcGFyZW50IHN1Yi1jYXRlZ29yeSBpZCB7fSIsIHBhcmVudFN1YkNhdGVnb3J5SWQpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZVN1YkNhdGVnb3J5RXhpc3RzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lLCBvcmlnR3JvdXBpbmdOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IHZhbGlkYXRlU3ViQ2F0ZWdvcnlFeGlzdHMubGVmdCgpLnZhbHVlKCk7CisJCXBhcmVudFN1YkNhdGVnb3J5TmFtZSA9IHN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCk7CisKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lRm9ybWF0KGdyb3VwaW5nTmFtZSkpIHsKKwkJCWxvZy5kZWJ1ZygiU3ViLWNhdGVnb3J5IGRpc3BsYXkgbmFtZSBmb3JtYXQgaXMgaW52YWxpZCwgbmFtZSB7fSwgY29tcG9uZW50VHlwZSB7fSIsIGdyb3VwaW5nTmFtZSwgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVCwgY29tcG9uZW50VHlwZSwgY2F0ZWdvcnlUeXBlLmdldFZhbHVlKCkpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBwYXJlbnRTdWJDYXRlZ29yeU5hbWUsIG9yaWdHcm91cGluZ05hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJZ3JvdXBpbmdOYW1lID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTREaXNwbGF5KGdyb3VwaW5nTmFtZSk7CisKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lTGVuZ3RoKGdyb3VwaW5nTmFtZSkpIHsKKwkJCWxvZy5kZWJ1ZygiR3JvdXBpbmcgZGlzcGxheSBuYW1lIGxlbmd0aCBpcyBpbnZhbGlkLCBzaG91bGQgYmUgZnJvbSA0IHRvIDI1IGNoYXJzLCBuYW1lIHt9LCBjb21wb25lbnRUeXBlIHt9IiwgZ3JvdXBpbmdOYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfTEVOR1RILCBjb21wb25lbnRUeXBlLCBjYXRlZ29yeVR5cGUuZ2V0VmFsdWUoKSk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwYXJlbnRDYXRlZ29yeU5hbWUsIHBhcmVudFN1YkNhdGVnb3J5TmFtZSwgb3JpZ0dyb3VwaW5nTmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MoZ3JvdXBpbmdOYW1lKTsKKwkJZ3JvdXBpbmcuc2V0Tm9ybWFsaXplZE5hbWUobm9ybWFsaXplZE5hbWUpOworCisJCS8vIFVuaXF1ZW5lc3MgdW5kZXIgdGhpcyBjYXRlZ29yeQorCQlFaXRoZXI8Qm9vbGVhbiwgQWN0aW9uU3RhdHVzPiBncm91cGluZ1VuaXF1ZUZvclN1YkNhdGVnb3J5ID0gZWxlbWVudE9wZXJhdGlvbi5pc0dyb3VwaW5nVW5pcXVlRm9yU3ViQ2F0ZWdvcnkoY2hpbGROb2RlVHlwZSwgbm9ybWFsaXplZE5hbWUsIHBhcmVudFN1YkNhdGVnb3J5SWQpOworCQlpZiAoZ3JvdXBpbmdVbmlxdWVGb3JTdWJDYXRlZ29yeS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNoZWNrIGdyb3VwaW5nIHVuaXF1ZW5lc3MsIHBhcmVudCBuYW1lIHt9LCBncm91cGluZyBub3JtIG5hbWUge30sIGNvbXBvbmVudFR5cGUge30iLCBwYXJlbnRTdWJDYXRlZ29yeU5hbWUsIG5vcm1hbGl6ZWROYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGdyb3VwaW5nVW5pcXVlRm9yU3ViQ2F0ZWdvcnkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lLCBvcmlnR3JvdXBpbmdOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUJvb2xlYW4gaXNHcm91cGluZ1VuaXF1ZSA9IGdyb3VwaW5nVW5pcXVlRm9yU3ViQ2F0ZWdvcnkubGVmdCgpLnZhbHVlKCk7CisJCWlmICghaXNHcm91cGluZ1VuaXF1ZSkgeworCQkJbG9nLmRlYnVnKCJHcm91cGluZyBpcyBub3QgdW5pcXVlIGZvciBzdWItY2F0ZWdvcnksIHBhcmVudCBuYW1lIHt9LCBncm91cGluZyBub3JtIG5hbWUge30sIGNvbXBvbmVudFR5cGUge30iLCBwYXJlbnRTdWJDYXRlZ29yeU5hbWUsIG5vcm1hbGl6ZWROYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfR1JPVVBJTkdfRVhJU1RTX0ZPUl9TVUJfQ0FURUdPUlksIGNvbXBvbmVudFR5cGUsIGdyb3VwaW5nTmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lKTsKKwkJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lLCBvcmlnR3JvdXBpbmdOYW1lLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCS8vIFNldHRpbmcgbmFtZSBvZiBncm91cGluZyB0byBmaXQgdGhlIHNpbWlsYXIgZ3JvdXBpbmcgbmFtZSBpZ25vcmluZworCQkvLyBjYXNlcy4KKwkJLy8gRm9yIGV4YW1wbGUgaWYgTmV0d29yay0tPmtVS1UgZXhpc3RzIGZvciBzZXJ2aWNlIHN1Yi1jYXRlZ29yeQorCQkvLyBOZXR3b3JrLCBhbmQgdXNlciBpcyB0cnlpbmcgdG8gY3JlYXRlIGdyb3VwaW5nIFJvdXRlci0tPkt1a3UgZm9yCisJCS8vIHNlcnZpY2Ugc3ViLWNhdGVnb3J5IFJvdXRlciwKKwkJLy8gaGlzIGdyb3VwaW5nIG5hbWUgd2lsbCBiZSBSb3V0ZXItLT5rVUtVLgorCQlFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGdyb3VwaW5nVW5pcXVlRm9yVHlwZSA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0R3JvdXBpbmdVbmlxdWVGb3JUeXBlKGNoaWxkTm9kZVR5cGUsIG5vcm1hbGl6ZWROYW1lKTsKKwkJaWYgKGdyb3VwaW5nVW5pcXVlRm9yVHlwZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHZhbGlkYXRpb24gb2Ygd2hldGhlciBzaW1pbGFyIGdyb3VwaW5nIGV4aXN0cywgbm9ybWFsaXplZE5hbWUge30gY29tcG9uZW50VHlwZSB7fSIsIG5vcm1hbGl6ZWROYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGdyb3VwaW5nVW5pcXVlRm9yVHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQkJaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhyZXNwb25zZUZvcm1hdCwgdXNlciwgcGFyZW50Q2F0ZWdvcnlOYW1lLCBwYXJlbnRTdWJDYXRlZ29yeU5hbWUsIG9yaWdHcm91cGluZ05hbWUsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCUdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24gPSBncm91cGluZ1VuaXF1ZUZvclR5cGUubGVmdCgpLnZhbHVlKCk7CisJCWlmIChncm91cGluZ0RlZmluaXRpb24gIT0gbnVsbCkgeworCQkJZ3JvdXBpbmdOYW1lID0gZ3JvdXBpbmdEZWZpbml0aW9uLmdldE5hbWUoKTsKKwkJfQorCisJCWdyb3VwaW5nLnNldE5hbWUoZ3JvdXBpbmdOYW1lKTsKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFZhbGlkYXRpb25zIGVuZAorCisJCUVpdGhlcjxHcm91cGluZ0RlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlR3JvdXBpbmcgPSBlbGVtZW50T3BlcmF0aW9uLmNyZWF0ZUdyb3VwaW5nKHBhcmVudFN1YkNhdGVnb3J5SWQsIGdyb3VwaW5nLCBjaGlsZE5vZGVUeXBlKTsKKwkJaWYgKGNyZWF0ZUdyb3VwaW5nLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGdyb3VwaW5nLCBuYW1lIHt9LCBjb21wb25lbnRUeXBlIHt9IiwgZ3JvdXBpbmdOYW1lLCBjb21wb25lbnRUeXBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNyZWF0ZUdyb3VwaW5nLnJpZ2h0KCkudmFsdWUoKSk7CisJCQloYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwYXJlbnRDYXRlZ29yeU5hbWUsIHBhcmVudFN1YkNhdGVnb3J5TmFtZSwgb3JpZ0dyb3VwaW5nTmFtZSwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlHcm91cGluZ0RlZmluaXRpb24gZ3JvdXBpbmdDcmVhdGVkID0gY3JlYXRlR3JvdXBpbmcubGVmdCgpLnZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiQ3JlYXRlZCBncm91cGluZyBmb3IgY29tcG9uZW50IHt9LCBuYW1lIHt9LCB1bmlxdWVJZCB7fSIsIGNvbXBvbmVudFR5cGUsIGdyb3VwaW5nTmFtZSwgZ3JvdXBpbmdDcmVhdGVkLmdldFVuaXF1ZUlkKCkpOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1JFQVRFRCk7CisJCWhhbmRsZUNhdGVnb3J5QXVkaXRpbmcocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHBhcmVudENhdGVnb3J5TmFtZSwgcGFyZW50U3ViQ2F0ZWdvcnlOYW1lLCBncm91cGluZ0NyZWF0ZWQuZ2V0TmFtZSgpLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJCXJldHVybiBFaXRoZXIubGVmdChncm91cGluZ0NyZWF0ZWQpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZ2V0QWxsQ2F0ZWdvcmllcyhTdHJpbmcgY29tcG9uZW50VHlwZSwgU3RyaW5nIHVzZXJJZCkgeworCQlBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb24gPSBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0NBVEVHT1JZX0hJRVJBUkNIWTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCVVzZXIgdXNlciA9IG5ldyBVc2VyKCk7CisJCWlmICh1c2VySWQgPT0gbnVsbCkgeworCQkJdXNlci5zZXRVc2VySWQoIlVOS05PV04iKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdEdldENhdGVnb3J5SGllcmFyY2h5KGF1ZGl0aW5nQWN0aW9uLCB1c2VyLCBjb21wb25lbnRUeXBlLCByZXNwb25zZUZvcm1hdCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBBbGwgQ2F0ZWdvcmllcyIsIGZhbHNlKTsKKwkJaWYgKHZhbGlkYXRlVXNlci5pc1JpZ2h0KCkpIHsKKwkJCXVzZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCQlsb2cuZGVidWcoIlZhbGlkYXRpb24gb2YgdXNlciBmYWlsZWQsIHVzZXJJZCB7fSIsIHVzZXJJZCk7CisJCQlyZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlVXNlci5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRHZXRDYXRlZ29yeUhpZXJhcmNoeShhdWRpdGluZ0FjdGlvbiwgdXNlciwgY29tcG9uZW50VHlwZSwgcmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJdXNlciA9IHZhbGlkYXRlVXNlci5sZWZ0KCkudmFsdWUoKTsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb21wb25lbnRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudFR5cGVFbnVtID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQ2Fubm90IGNyZWF0ZSBjYXRlZ29yeSBmb3IgY29tcG9uZW50IHR5cGUge30iLCBjb21wb25lbnRUeXBlKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VTlNVUFBPUlRFRF9FUlJPUiwgImNvbXBvbmVudCB0eXBlIik7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRHZXRDYXRlZ29yeUhpZXJhcmNoeShhdWRpdGluZ0FjdGlvbiwgdXNlciwgY29tcG9uZW50VHlwZSwgcmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtID0gTm9kZVR5cGVDb252ZXJ0VXRpbHMuZ2V0Q2F0ZWdvcnlOb2RlVHlwZUJ5Q29tcG9uZW50UGFyYW0oY29tcG9uZW50VHlwZUVudW0sIENhdGVnb3J5VHlwZUVudW0uQ0FURUdPUlkpOworCQlFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGdldEFsbENhdGVnb3JpZXNCeVR5cGUgPSBlbGVtZW50T3BlcmF0aW9uLmdldEFsbENhdGVnb3JpZXMobm9kZVR5cGVFbnVtLCBmYWxzZSk7CisJCWlmIChnZXRBbGxDYXRlZ29yaWVzQnlUeXBlLmlzUmlnaHQoKSkgeworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoZ2V0QWxsQ2F0ZWdvcmllc0J5VHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0R2V0Q2F0ZWdvcnlIaWVyYXJjaHkoYXVkaXRpbmdBY3Rpb24sIHVzZXIsIGNvbXBvbmVudFR5cGUsIHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gZ2V0QWxsQ2F0ZWdvcmllc0J5VHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0R2V0Q2F0ZWdvcnlIaWVyYXJjaHkoYXVkaXRpbmdBY3Rpb24sIHVzZXIsIGNvbXBvbmVudFR5cGUsIHJlc3BvbnNlRm9ybWF0KTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhdGVnb3JpZXMpOworCX0KKworCXB1YmxpYyBFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5SWQsIFN0cmluZyBjb21wb25lbnRUeXBlUGFyYW1OYW1lLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImRlbGV0ZSBDYXRlZ29yeSIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbXBvbmVudFR5cGVQYXJhbU5hbWUpOworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJDYW5ub3QgY3JlYXRlIGNhdGVnb3J5IGZvciBjb21wb25lbnQgdHlwZSB7fSIsIGNvbXBvbmVudFR5cGVQYXJhbU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisKKwkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSA9IE5vZGVUeXBlQ29udmVydFV0aWxzLmdldENhdGVnb3J5Tm9kZVR5cGVCeUNvbXBvbmVudFBhcmFtKGNvbXBvbmVudFR5cGVFbnVtLCBDYXRlZ29yeVR5cGVFbnVtLkNBVEVHT1JZKTsKKworCQlFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGRlbGV0ZUNhdGVnb3J5QnlUeXBlID0gZWxlbWVudE9wZXJhdGlvbi5kZWxldGVDYXRlZ29yeShub2RlVHlwZUVudW0sIGNhdGVnb3J5SWQpOworCQlpZiAoZGVsZXRlQ2F0ZWdvcnlCeVR5cGUuaXNSaWdodCgpKSB7CisJCQkvLyBhdWRpdGluZywgbG9nZ2luZyBoZXJlLi4uCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChkZWxldGVDYXRlZ29yeUJ5VHlwZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnkgPSBkZWxldGVDYXRlZ29yeUJ5VHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJbG9nLmRlYnVnKCJEZWxldGUgY2F0ZWdvcnkgZm9yIGNvbXBvbmVudCB7fSwgbmFtZSB7fSwgdW5pcXVlSWQge30iLCBub2RlVHlwZUVudW0sIGNhdGVnb3J5LmdldE5hbWUoKSwgY2F0ZWdvcnkuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBFaXRoZXIubGVmdChjYXRlZ29yeSk7CisJfQorCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVTdWJDYXRlZ29yeShTdHJpbmcgZ3JhbmRQYXJlbnRDYXRlZ29yeUlkLCBTdHJpbmcgcGFyZW50U3ViQ2F0ZWdvcnlJZCwgU3RyaW5nIGNvbXBvbmVudFR5cGVQYXJhbU5hbWUsIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZGVsZXRlIFN1YiBDYXRlZ29yeSIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbXBvbmVudFR5cGVQYXJhbU5hbWUpOworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJDYW5ub3QgZGVsZXRlIHN1Yi1jYXRlZ29yeSBmb3IgY29tcG9uZW50IHR5cGUge30iLCBjb21wb25lbnRUeXBlUGFyYW1OYW1lKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfQorCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0gPSBOb2RlVHlwZUNvbnZlcnRVdGlscy5nZXRDYXRlZ29yeU5vZGVUeXBlQnlDb21wb25lbnRQYXJhbShjb21wb25lbnRUeXBlRW51bSwgQ2F0ZWdvcnlUeXBlRW51bS5TVUJDQVRFR09SWSk7CisKKwkJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBkZWxldGVTdWJDYXRlZ29yeUJ5VHlwZSA9IGVsZW1lbnRPcGVyYXRpb24uZGVsZXRlU3ViQ2F0ZWdvcnkobm9kZVR5cGVFbnVtLCBwYXJlbnRTdWJDYXRlZ29yeUlkKTsKKwkJaWYgKGRlbGV0ZVN1YkNhdGVnb3J5QnlUeXBlLmlzUmlnaHQoKSkgeworCQkJLy8gYXVkaXRpbmcsIGxvZ2dpbmcgaGVyZS4uLgorCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoZGVsZXRlU3ViQ2F0ZWdvcnlCeVR5cGUucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5ID0gZGVsZXRlU3ViQ2F0ZWdvcnlCeVR5cGUubGVmdCgpLnZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiRGVsZXRlZCBzdWItY2F0ZWdvcnkgZm9yIGNvbXBvbmVudCB7fSwgbmFtZSB7fSwgdW5pcXVlSWQge30iLCBub2RlVHlwZUVudW0sIHN1YkNhdGVnb3J5LmdldE5hbWUoKSwgc3ViQ2F0ZWdvcnkuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBFaXRoZXIubGVmdChzdWJDYXRlZ29yeSk7CisJfQorCisJcHVibGljIEVpdGhlcjxHcm91cGluZ0RlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVHcm91cGluZyhTdHJpbmcgZ3JhbmRQYXJlbnRDYXRlZ29yeUlkLCBTdHJpbmcgcGFyZW50U3ViQ2F0ZWdvcnlJZCwgU3RyaW5nIGdyb3VwaW5nSWQsIFN0cmluZyBjb21wb25lbnRUeXBlUGFyYW1OYW1lLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImRlbGV0ZSBHcm91cGluZyIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbXBvbmVudFR5cGVQYXJhbU5hbWUpOworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJDYW5ub3QgZGVsZXRlIGdyb3VwaW5nIGZvciBjb21wb25lbnQgdHlwZSB7fSIsIGNvbXBvbmVudFR5cGVQYXJhbU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisKKwkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSA9IE5vZGVUeXBlQ29udmVydFV0aWxzLmdldENhdGVnb3J5Tm9kZVR5cGVCeUNvbXBvbmVudFBhcmFtKGNvbXBvbmVudFR5cGVFbnVtLCBDYXRlZ29yeVR5cGVFbnVtLkdST1VQSU5HKTsKKworCQlFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGRlbGV0ZUdyb3VwaW5nQnlUeXBlID0gZWxlbWVudE9wZXJhdGlvbi5kZWxldGVHcm91cGluZyhub2RlVHlwZUVudW0sIGdyb3VwaW5nSWQpOworCQlpZiAoZGVsZXRlR3JvdXBpbmdCeVR5cGUuaXNSaWdodCgpKSB7CisJCQkvLyBhdWRpdGluZywgbG9nZ2luZyBoZXJlLi4uCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChkZWxldGVHcm91cGluZ0J5VHlwZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlHcm91cGluZ0RlZmluaXRpb24gZGVsZXRlZEdyb3VwaW5nID0gZGVsZXRlR3JvdXBpbmdCeVR5cGUubGVmdCgpLnZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiRGVsZXRlZCBncm91cGluZyBmb3IgY29tcG9uZW50IHt9LCBuYW1lIHt9LCB1bmlxdWVJZCB7fSIsIG5vZGVUeXBlRW51bSwgZGVsZXRlZEdyb3VwaW5nLmdldE5hbWUoKSwgZGVsZXRlZEdyb3VwaW5nLmdldFVuaXF1ZUlkKCkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoZGVsZXRlZEdyb3VwaW5nKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyKFN0cmluZyB1c2VySWQpIHsKKworCQkvLyB2YWxpZGF0ZSB1c2VyIGV4aXN0cworCQlpZiAodXNlcklkID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiVXNlciBpZCBpcyBudWxsIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTikpOworCQl9CisKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gdXNlclJlc3VsdCA9IHVzZXJBZG1pbk1hbmFnZXIuZ2V0VXNlcih1c2VySWQsIGZhbHNlKTsKKwkJaWYgKHVzZXJSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJCWlmICh1c2VyUmVzdWx0LnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKSkgeworCQkJCWxvZy5kZWJ1ZygiTm90IGF1dGhvcml6ZWQgdXNlciwgdXNlcklkID0ge30iLCB1c2VySWQpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGF1dGhvcml6ZSB1c2VyLCB1c2VySWQgPSB7fSIsIHVzZXJJZCk7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQodXNlclJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodXNlclJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlclJvbGUoVXNlciB1c2VyLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgeworCQlTdHJpbmcgcm9sZSA9IHVzZXIuZ2V0Um9sZSgpOworCQlib29sZWFuIHZhbGlkQWRtaW5BY3Rpb24gPSAocm9sZS5lcXVhbHMoUm9sZS5BRE1JTi5uYW1lKCkpICYmIChjb21wb25lbnRUeXBlRW51bSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFIHx8IGNvbXBvbmVudFR5cGVFbnVtID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSk7CisJCWJvb2xlYW4gdmFsaWRQcm9kdWN0QWN0aW9uID0gKHJvbGUuZXF1YWxzKFJvbGUuUFJPRFVDVF9TVFJBVEVHSVNULm5hbWUoKSkgJiYgKGNvbXBvbmVudFR5cGVFbnVtID09IENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpKTsKKworCQlpZiAoISh2YWxpZEFkbWluQWN0aW9uIHx8IHZhbGlkUHJvZHVjdEFjdGlvbikpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCQlsb2cuZGVidWcoIlVzZXIgbm90IHBlcm1pdHRlZCB0byBwZXJmb3JtIG9wZXJhdGlvbiBvbiBjYXRlZ29yeSwgdXNlcklkID0ge30sIHJvbGUgPSB7fSwgY29tcG9uZW50VHlwZSA9IHt9IiwgdXNlci5nZXRVc2VySWQoKSwgcm9sZSwgY29tcG9uZW50VHlwZUVudW0pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudFR5cGVGb3JDYXRlZ29yeShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBDYXRlZ29yeVR5cGVFbnVtIGNhdGVnb3J5VHlwZSkgeworCQlib29sZWFuIHZhbGlkUmVzb3VyY2VBY3Rpb24gPSAoY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSAmJiAoY2F0ZWdvcnlUeXBlID09IENhdGVnb3J5VHlwZUVudW0uQ0FURUdPUlkgfHwgY2F0ZWdvcnlUeXBlID09IENhdGVnb3J5VHlwZUVudW0uU1VCQ0FURUdPUlkpKTsKKwkJYm9vbGVhbiB2YWxpZFNlcnZpY2VBY3Rpb24gPSAoY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFICYmIGNhdGVnb3J5VHlwZSA9PSBDYXRlZ29yeVR5cGVFbnVtLkNBVEVHT1JZKTsKKwkJYm9vbGVhbiB2YWxpZFByb2R1Y3RBY3Rpb24gPSAoY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsgLy8gY2FuCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYW55CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXRlZ29yeQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdHlwZQorCisJCWlmICghKHZhbGlkUmVzb3VyY2VBY3Rpb24gfHwgdmFsaWRTZXJ2aWNlQWN0aW9uIHx8IHZhbGlkUHJvZHVjdEFjdGlvbikpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJbG9nLmRlYnVnKCJJdCdzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBjYXRlZ29yeSB0eXBlIHt9IGZvciBjb21wb25lbnQgdHlwZSB7fSIsIGNhdGVnb3J5VHlwZSwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYXRlZ29yeUV4aXN0cyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjYXRlZ29yeUlkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisJCUVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY2F0ZWdvcnlCeVR5cGVBbmRJZCA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0Q2F0ZWdvcnkobm9kZVR5cGUsIGNhdGVnb3J5SWQpOworCQlpZiAoY2F0ZWdvcnlCeVR5cGVBbmRJZC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHBhcmVudCBjYXRlZ29yeSwgcGFyZW50IGNhdGVnb3J5SWQge30iLCBjYXRlZ29yeUlkKTsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjYXRlZ29yeUJ5VHlwZUFuZElkLnJpZ2h0KCkudmFsdWUoKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCQkJaWYgKGFjdGlvblN0YXR1cyA9PSBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORCkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCksIENhdGVnb3J5VHlwZUVudW0uQ0FURUdPUlkuZ2V0VmFsdWUoKSwgIiIpOworCQkJfSBlbHNlIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhdGVnb3J5QnlUeXBlQW5kSWQubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU3ViQ2F0ZWdvcnlFeGlzdHMoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgc3ViQ2F0ZWdvcnlJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IHN1YkNhdGVnb3J5QnlUeXBlQW5kSWQgPSBlbGVtZW50T3BlcmF0aW9uLmdldFN1YkNhdGVnb3J5KG5vZGVUeXBlLCBzdWJDYXRlZ29yeUlkKTsKKwkJaWYgKHN1YkNhdGVnb3J5QnlUeXBlQW5kSWQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCBwYXJlbnQgY2F0ZWdvcnksIHBhcmVudCBjYXRlZ29yeUlkIHt9Iiwgc3ViQ2F0ZWdvcnlJZCk7CisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gc3ViQ2F0ZWdvcnlCeVR5cGVBbmRJZC5yaWdodCgpLnZhbHVlKCk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJCWlmIChhY3Rpb25TdGF0dXMgPT0gQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQpIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpLCBDYXRlZ29yeVR5cGVFbnVtLlNVQkNBVEVHT1JZLmdldFZhbHVlKCksICIiKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChzdWJDYXRlZ29yeUJ5VHlwZUFuZElkLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlQ2F0ZWdvcnlBdWRpdGluZyhSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCwgVXNlciB1c2VyLCBTdHJpbmcgY2F0ZWdvcnksIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgU3RyaW5nIGNvbXBvbmVudFR5cGUpIHsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q2F0ZWdvcnkocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNhdGVnb3J5LCBudWxsLCBudWxsLCBhdWRpdGluZ0FjdGlvbiwgY29tcG9uZW50VHlwZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUNhdGVnb3J5QXVkaXRpbmcoUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQsIFVzZXIgdXNlciwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgc3ViQ2F0ZWdvcnksIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgU3RyaW5nIGNvbXBvbmVudFR5cGUpIHsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q2F0ZWdvcnkocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNhdGVnb3J5LCBzdWJDYXRlZ29yeSwgbnVsbCwgYXVkaXRpbmdBY3Rpb24sIGNvbXBvbmVudFR5cGUpOworCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVDYXRlZ29yeUF1ZGl0aW5nKFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0LCBVc2VyIHVzZXIsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHN1YkNhdGVnb3J5LCBTdHJpbmcgZ3JvdXBpbmcsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbiwgU3RyaW5nIGNvbXBvbmVudFR5cGUpIHsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q2F0ZWdvcnkocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNhdGVnb3J5LCBzdWJDYXRlZ29yeSwgZ3JvdXBpbmcsIGF1ZGl0aW5nQWN0aW9uLCBjb21wb25lbnRUeXBlKTsKKwl9CisKKwkvKgorCSAqIE5ldyBjYXRlZ29yaWVzIGZsb3cgLSBlbmQKKwkgKi8KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxUYWc+LCBBY3Rpb25TdGF0dXM+IGdldEFsbFRhZ3MoU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzQWN0aW9uU3RhdHVzKHVzZXJJZCwgImdldCBBbGwgVGFncyIpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBlbGVtZW50T3BlcmF0aW9uLmdldEFsbFRhZ3MoKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UHJvcGVydHlTY29wZT4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsUHJvcGVydHlTY29wZXMoU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzQWN0aW9uU3RhdHVzKHVzZXJJZCwgImdldCBBbGwgUHJvcGVydHkgU2NvcGVzIik7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIGVsZW1lbnRPcGVyYXRpb24uZ2V0QWxsUHJvcGVydHlTY29wZXMoKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3RUeXBlPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxBcnRpZmFjdFR5cGVzKFN0cmluZyB1c2VySWQpIHsKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0c0FjdGlvblN0YXR1cyh1c2VySWQsICJnZXQgQWxsIEFydGlmYWN0IFR5cGVzIik7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIGVsZW1lbnRPcGVyYXRpb24uZ2V0QWxsQXJ0aWZhY3RUeXBlcygpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgT2JqZWN0PiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxEZXBsb3ltZW50QXJ0aWZhY3RUeXBlcygpIHsKKwkJcmV0dXJuIGVsZW1lbnRPcGVyYXRpb24uZ2V0QWxsRGVwbG95bWVudEFydGlmYWN0VHlwZXMoKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIEFjdGlvblN0YXR1cz4gZ2V0RGVmYXVsdEhlYXRUaW1lb3V0KCkgeworCQlyZXR1cm4gZWxlbWVudE9wZXJhdGlvbi5nZXREZWZhdWx0SGVhdFRpbWVvdXQoKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4+LCBSZXNwb25zZUZvcm1hdD4gZ2V0Q2F0YWxvZ0NvbXBvbmVudHMoU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZ2V0IENhdGFsb2cgQ29tcG9uZW50cyIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PiByZXNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNSZXNvdXJjZXMgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZUNhdGFsb2dEYXRhKGZhbHNlKTsKKwkJaWYgKHJlc1Jlc291cmNlcy5pc0xlZnQoKSkgeworCQkJRWl0aGVyPExpc3Q8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc1NlcnZpY2VzID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlQ2F0YWxvZ0RhdGEoZmFsc2UpOworCQkJaWYgKHJlc1NlcnZpY2VzLmlzTGVmdCgpKSB7CisJCQkJRWl0aGVyPExpc3Q8UHJvZHVjdD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc1Byb2R1Y3RzID0gcHJvZHVjdE9wZXJhdGlvbi5nZXRQcm9kdWN0Q2F0YWxvZ0RhdGEoZmFsc2UpOworCQkJCWlmIChyZXNQcm9kdWN0cy5pc0xlZnQoKSkgeworCQkJCQlyZXNNYXAucHV0KCJyZXNvdXJjZXMiLCByZXNSZXNvdXJjZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCQlyZXNNYXAucHV0KCJzZXJ2aWNlcyIsIHJlc1NlcnZpY2VzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJcmVzTWFwLnB1dCgicHJvZHVjdHMiLCByZXNQcm9kdWN0cy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdChyZXNNYXApOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShyZXNQcm9kdWN0cy5yaWdodCgpLnZhbHVlKCkpKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzU2VydmljZXMucmlnaHQoKS52YWx1ZSgpKSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc1Jlc291cmNlcy5yaWdodCgpLnZhbHVlKCkpKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4sIFJlc3BvbnNlRm9ybWF0PiBnZXRGaWx0ZXJlZENhdGFsb2dDb21wb25lbnRzKFN0cmluZyBhc3NldFR5cGUsIE1hcDxGaWx0ZXJLZXlFbnVtLCBTdHJpbmc+IGZpbHRlcnMsIFN0cmluZyBxdWVyeSkgeworCQlDb21wb25lbnRUeXBlRW51bSBhc3NldFR5cGVFbnVtID0gQXNzZXRUeXBlRW51bS5jb252ZXJ0VG9Db21wb25lbnRUeXBlRW51bShhc3NldFR5cGUpOworCisJCWlmIChxdWVyeSAhPSBudWxsKSB7CisJCQlPcHRpb25hbDxOYW1lVmFsdWVQYWlyPiBpbnZhbGlkRmlsdGVyID0gZmluZEludmFsaWRGaWx0ZXIocXVlcnksIGFzc2V0VHlwZUVudW0pOworCQkJaWYgKGludmFsaWRGaWx0ZXIuaXNQcmVzZW50KCkpIHsKKwkJCQlsb2cuZGVidWcoImdldEZpbHRlcmVkQXNzZXRMaXN0OiBpbnZhbGlkIGZpbHRlciBrZXkiKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9GSUxURVJfS0VZLCBpbnZhbGlkRmlsdGVyLmdldCgpLmdldE5hbWUoKSwgRmlsdGVyS2V5RW51bS5nZXRWYWxpZEZpbHRlcnNCeUFzc2V0VHlwZShhc3NldFR5cGVFbnVtKS50b1N0cmluZygpKSk7CisJCQl9CisJCX0KKworCQlpZiAoZmlsdGVycyA9PSBudWxsIHx8IGZpbHRlcnMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gZ2V0Q2F0YWxvZ0NvbXBvbmVudHNCeUFzc2V0VHlwZShhc3NldFR5cGVFbnVtKTsKKwkJfQorCisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oYXNzZXRUeXBlRW51bSk7CisJCUVpdGhlcjxMaXN0PENvbXBvbmVudD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRGaWx0ZXJlZENvbXBvbmVudHMoZmlsdGVycywgZmFsc2UpOworCisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7Ly8gY2F0ZWdvcnkgaGllcmFyY2h5IG1pc21hdGNoIG9yCisJCQkJCQkJCS8vIGNhdGVnb3J5L3N1YkNhdGVnb3J5L2Rpc3RyaWJ1dGlvblN0YXR1cyBub3QKKwkJCQkJCQkJLy8gZm91bmQKKwkJCUxpc3Q8U3RyaW5nPiBwYXJhbXMgPSBnZXRFcnJvclJlc3BvbnNlUGFyYW1zKGZpbHRlcnMsIGFzc2V0VHlwZUVudW0pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpLCBwYXJhbXMuZ2V0KDApLCBwYXJhbXMuZ2V0KDEpLCBwYXJhbXMuZ2V0KDIpKSk7CisJCX0KKwkJaWYgKHJlc3VsdC5sZWZ0KCkudmFsdWUoKS5pc0VtcHR5KCkpIHsvLyBubyBhc3NldHMgZm91bmQgZm9yIHJlcXVlc3RlZAorCQkJCQkJCQkJCQkJLy8gY3JpdGVyaWEKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19BU1NFVFNfRk9VTkQsIGFzc2V0VHlwZSwgcXVlcnkpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4sIFJlc3BvbnNlRm9ybWF0PiBnZXRDYXRhbG9nQ29tcG9uZW50c0J5QXNzZXRUeXBlKENvbXBvbmVudFR5cGVFbnVtIGFzc2V0VHlwZUVudW0pIHsKKworCQlpZiAoYXNzZXRUeXBlRW51bSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoImdldENhdGFsb2dDb21wb25lbnRzQnlBc3NldFR5cGU6IENvcnJlc3BvbmRpbmcgQ29tcG9uZW50VHlwZUVudW0gbm90IGZvdW5kIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKworCQlzd2l0Y2ggKGFzc2V0VHlwZUVudW0pIHsKKwkJY2FzZSBSRVNPVVJDRToKKworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUNhdGFsb2dEYXRhID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2VDYXRhbG9nRGF0YVZGTGF0ZXN0Q2VydGlmaWVkQW5kTm9uQ2VydGlmaWVkKGZhbHNlKTsKKwkJCWlmIChyZXNvdXJjZUNhdGFsb2dEYXRhLmlzTGVmdCgpKSB7CisJCQkJbG9nLmRlYnVnKCJnZXRDYXRhbG9nQ29tcG9uZW50c0J5QXNzZXRUeXBlOiBSZXNvdXJjZSBmZXRjaGluZyBzdWNjZXNzZnVsIik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlQ2F0YWxvZ0RhdGEubGVmdCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoImdldENhdGFsb2dDb21wb25lbnRzQnlBc3NldFR5cGU6IFJlc291cmNlIGZldGNoaW5nIGZhaWxlZCIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShyZXNvdXJjZUNhdGFsb2dEYXRhLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJCX0KKworCQljYXNlIFNFUlZJQ0U6CisJCQlFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZUNhdGFsb2dEYXRhID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlQ2F0YWxvZ0RhdGFMYXRlc3RDZXJ0aWZpZWRBbmROb3RDZXJ0aWZpZWQoZmFsc2UpOworCQkJaWYgKHNlcnZpY2VDYXRhbG9nRGF0YS5pc0xlZnQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZ2V0Q2F0YWxvZ0NvbXBvbmVudHNCeUFzc2V0VHlwZTogU2VydmljZSBmZXRjaGluZyBzdWNjZXNzZnVsIik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHNlcnZpY2VDYXRhbG9nRGF0YS5sZWZ0KCkudmFsdWUoKSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiZ2V0Q2F0YWxvZ0NvbXBvbmVudHNCeUFzc2V0VHlwZTogU2VydmljZSBmZXRjaGluZyBmYWlsZWQiKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc2VydmljZUNhdGFsb2dEYXRhLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBjYXNlIFBST0RVQ1Q6IEVpdGhlcjxMaXN0PFByb2R1Y3Q+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNDYXRhbG9nRGF0YSA9IHByb2R1Y3RPcGVyYXRpb24uZ2V0UHJvZHVjdENhdGFsb2dEYXRhKGZhbHNlKTsgaWYocmVzQ2F0YWxvZ0RhdGEuaXNMZWZ0KCkpeyBsb2cuIGRlYnVnKCJnZXRDYXRhbG9nQ29tcG9uZW50c0J5QXNzZXRUeXBlOiBQcm9kdWN0IGZldGNoaW5nIHN1Y2Nlc3NmdWwiICk7CisJCQkgKiByZXR1cm4gRWl0aGVyLmxlZnQocmVzQ2F0YWxvZ0RhdGEubGVmdCgpLnZhbHVlKCkpOyB9ZWxzZSB7IGxvZy4gZGVidWcoImdldENhdGFsb2dDb21wb25lbnRzQnlBc3NldFR5cGU6IFByb2R1Y3QgZmV0Y2hpbmcgZmFpbGVkIiApOyByZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscyAuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKAorCQkJICogcmVzQ2F0YWxvZ0RhdGEucmlnaHQoKS52YWx1ZSgpKSkpOyB9CisJCQkgKi8KKwkJZGVmYXVsdDoKKwkJCWxvZy5kZWJ1ZygiSW52YWxpZCBBc3NldCBUeXBlIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKwl9CisKKwkvLyBUT0RPIG5ldyBzdG9yeSBUYWwKKwlwdWJsaWMgRWl0aGVyPExpc3Q8PyBleHRlbmRzIENvbXBvbmVudD4sIFJlc3BvbnNlRm9ybWF0PiBnZXRDYXRhbG9nQ29tcG9uZW50c0J5VXVpZEFuZEFzc2V0VHlwZShTdHJpbmcgYXNzZXRUeXBlLCBTdHJpbmcgdXVpZCkgeworCisJCWlmIChhc3NldFR5cGUgPT0gbnVsbCB8fCBhc3NldFR5cGUgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJnZXRDYXRhbG9nQ29tcG9uZW50c0J5VXVpZEFuZEFzc2V0VHlwZTogT25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJlcyBpcyBudWxsIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKworCQlDb21wb25lbnRUeXBlRW51bSBhc3NldFR5cGVFbnVtID0gQXNzZXRUeXBlRW51bS5jb252ZXJ0VG9Db21wb25lbnRUeXBlRW51bShhc3NldFR5cGUpOworCisJCWlmIChhc3NldFR5cGVFbnVtID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiZ2V0Q2F0YWxvZ0NvbXBvbmVudHNCeVV1aWRBbmRBc3NldFR5cGU6IENvcnJlc3BvbmRpbmcgQ29tcG9uZW50VHlwZUVudW0gbm90IGZvdW5kIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKworCQlzd2l0Y2ggKGFzc2V0VHlwZUVudW0pIHsKKworCQljYXNlIFJFU09VUkNFOgorCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUxpc3RCeVV1aWQgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RSZXNvdXJjZUJ5VXVpZCh1dWlkLCBmYWxzZSk7CisKKwkJCWlmIChyZXNvdXJjZUxpc3RCeVV1aWQuaXNMZWZ0KCkpIHsKKwkJCQlsb2cuZGVidWcoImdldENhdGFsb2dDb21wb25lbnRzQnlVdWlkQW5kQXNzZXRUeXBlOiBSZXNvdXJjZSBmZXRjaGluZyBzdWNjZXNzZnVsIik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlTGlzdEJ5VXVpZC5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzb3VyY2VMaXN0QnlVdWlkLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoImdldENhdGFsb2dDb21wb25lbnRzQnlVdWlkQW5kQXNzZXRUeXBlOiBSZXNvdXJjZSBmZXRjaGluZyBmYWlsZWQiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCisJCWNhc2UgU0VSVklDRToKKwkJCUVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlQ2F0YWxvZ0RhdGEgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldExhdGVzdFNlcnZpY2VCeVV1aWQodXVpZCwgZmFsc2UpOworCisJCQlpZiAoc2VydmljZUNhdGFsb2dEYXRhLmlzTGVmdCgpKSB7CisJCQkJbG9nLmRlYnVnKCJnZXRDYXRhbG9nQ29tcG9uZW50c0J5VXVpZEFuZEFzc2V0VHlwZTogU2VydmljZSBmZXRjaGluZyBzdWNjZXNzZnVsIik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHNlcnZpY2VDYXRhbG9nRGF0YS5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCWxvZy5kZWJ1ZygiZ2V0Q2F0YWxvZ0NvbXBvbmVudHNCeVV1aWRBbmRBc3NldFR5cGU6IFNlcnZpY2UgZmV0Y2hpbmcgZmFpbGVkIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc2VydmljZUNhdGFsb2dEYXRhLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJLy8gY2FzZSBQcm9kdWN0IGlzIGZvciBmdXR1cmUgVVMKKwkJLyoKKwkJICogY2FzZSBQUk9EVUNUOiBFaXRoZXI8TGlzdDxQcm9kdWN0PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzQ2F0YWxvZ0RhdGEgPSBwcm9kdWN0T3BlcmF0aW9uLmdldFByb2R1Y3RDYXRhbG9nRGF0YShmYWxzZSk7IGlmKHJlc0NhdGFsb2dEYXRhLmlzTGVmdCgpKXsgbG9nLiBkZWJ1ZygiZ2V0Q2F0YWxvZ0NvbXBvbmVudHNCeUFzc2V0VHlwZTogUHJvZHVjdCBmZXRjaGluZyBzdWNjZXNzZnVsIiApOyByZXR1cm4KKwkJICogRWl0aGVyLmxlZnQocmVzQ2F0YWxvZ0RhdGEubGVmdCgpLnZhbHVlKCkpOyB9ZWxzZSB7IGxvZy4gZGVidWcoImdldENhdGFsb2dDb21wb25lbnRzQnlBc3NldFR5cGU6IFByb2R1Y3QgZmV0Y2hpbmcgZmFpbGVkIiApOyByZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscyAuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKAorCQkgKiByZXNDYXRhbG9nRGF0YS5yaWdodCgpLnZhbHVlKCkpKSk7IH0KKwkJICovCisJCWRlZmF1bHQ6CisJCQlsb2cuZGVidWcoIkludmFsaWQgQXNzZXQgVHlwZSIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBbGxDb21wb25lbnRUeXBlc1BhcmFtTmFtZXMoKSB7CisJCUxpc3Q8U3RyaW5nPiBwYXJhbU5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXBhcmFtTmFtZXMuYWRkKENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSk7CisJCXBhcmFtTmFtZXMuYWRkKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUpOworCQlwYXJhbU5hbWVzLmFkZChDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUX1BBUkFNX05BTUUpOworCQlyZXR1cm4gcGFyYW1OYW1lczsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFsbFN1cHBvcnRlZFJvbGVzKCkgeworCQlSb2xlW10gdmFsdWVzID0gUm9sZS52YWx1ZXMoKTsKKwkJTGlzdDxTdHJpbmc+IHJvbGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKFJvbGUgcm9sZSA6IHZhbHVlcykgeworCQkJcm9sZU5hbWVzLmFkZChyb2xlLm5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIHJvbGVOYW1lczsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFN0cmluZz4sIEFjdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VUeXBlc01hcCgpIHsKKwkJcmV0dXJuIGVsZW1lbnRPcGVyYXRpb24uZ2V0UmVzb3VyY2VUeXBlc01hcCgpOworCX0KKworCXByaXZhdGUgT3B0aW9uYWw8TmFtZVZhbHVlUGFpcj4gZmluZEludmFsaWRGaWx0ZXIoU3RyaW5nIHF1ZXJ5LCBDb21wb25lbnRUeXBlRW51bSBhc3NldFR5cGUpIHsKKwkJTGlzdDxOYW1lVmFsdWVQYWlyPiBwYXJhbXMgPSBVUkxFbmNvZGVkVXRpbHMucGFyc2UocXVlcnksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworCQlMaXN0PFN0cmluZz4gdmFsaWRLZXlzID0gRmlsdGVyS2V5RW51bS5nZXRWYWxpZEZpbHRlcnNCeUFzc2V0VHlwZShhc3NldFR5cGUpOworCQlQcmVkaWNhdGU8TmFtZVZhbHVlUGFpcj4gbm9NYXRjaCA9IHAgLT4gIXZhbGlkS2V5cy5jb250YWlucyhwLmdldE5hbWUoKSk7CisJCXJldHVybiBwYXJhbXMuc3RyZWFtKCkuZmlsdGVyKG5vTWF0Y2gpLmZpbmRBbnkoKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRFcnJvclJlc3BvbnNlUGFyYW1zKE1hcDxGaWx0ZXJLZXlFbnVtLCBTdHJpbmc+IGZpbHRlcnMsIENvbXBvbmVudFR5cGVFbnVtIGFzc2V0VHlwZSkgeworCQlMaXN0PFN0cmluZz4gcGFyYW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWlmICgxID09IGZpbHRlcnMuc2l6ZSgpKSB7CisJCQlwYXJhbXMuYWRkKGFzc2V0VHlwZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCkpOworCQkJcGFyYW1zLmFkZChmaWx0ZXJzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCQlwYXJhbXMuYWRkKGZpbHRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOworCQl9IGVsc2UgeworCQkJcGFyYW1zLmFkZChhc3NldFR5cGUuZ2V0VmFsdWUoKSk7CisJCQlwYXJhbXMuYWRkKGZpbHRlcnMuZ2V0KEZpbHRlcktleUVudW0uU1VCX0NBVEVHT1JZKSk7CisJCQlwYXJhbXMuYWRkKGZpbHRlcnMuZ2V0KEZpbHRlcktleUVudW0uQ0FURUdPUlkpKTsKKwkJfQorCQlyZXR1cm4gcGFyYW1zOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Hcm91cEJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvR3JvdXBCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0NTI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvR3JvdXBCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSwxNTEyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZW5hbWVVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvLkFydGlmYWN0RGVmaW5pdGlvbkluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5BcnRpZmFjdFRlbXBsYXRlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvLkdyb3VwRGVmaW5pdGlvbkluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRQYXJhbWV0ZXJzVmlldzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Hcm91cE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuR3JvdXBUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQoImdyb3VwQnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgR3JvdXBCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQmFzZUJ1c2luZXNzTG9naWMgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSU5JVElBTF9WRVJTSU9OID0gIjEiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9HUk9VUCA9ICJDcmVhdGVHcm91cCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0dST1VQID0gIlVwZGF0ZUdyb3VwIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfR1JPVVAgPSAiR2V0R3JvdXAiOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdyb3VwQnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIEdyb3VwQnVzaW5lc3NMb2dpYygpIHsKKworCX0KKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBHcm91cFR5cGVPcGVyYXRpb24gZ3JvdXBUeXBlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIEdyb3VwT3BlcmF0aW9uIGdyb3VwT3BlcmF0aW9uOworCisJLyoqCisJICogCisJICogMS4gdmFsaWRhdGUgdXNlciBleGlzdAorCSAqIAorCSAqIDIuIHZhbGlkYXRlIGNvbXBvbmVudCBjYW4gYmUgZWRpdGVkCisJICogCisJICogMy4gdmVyaWZ5IGdyb3VwIG5vdCBhbHJlYWR5IGV4aXN0CisJICogCisJICogNC4gdmVyaWZ5IHR5cGUgb2YgZ3JvdXAgZXhpc3QKKwkgKiAKKwkgKiA1LiB2ZXJpZnkgQ29tcG9uZW50IGluc3RhbmNlcyBleGlzdCB1bmRlciB0aGUgY29tcG9uZW50CisJICogCisJICogNi4gdmVyaWZ5IHRoZSBjb21wb25lbnQgaW5zdGFuY2VzIHR5cGUgYXJlIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBtZW1iZXIgdHlwZXMgaW4gdGhlIGdyb3VwIHR5cGUKKwkgKiAKKwkgKiA3LiB2ZXJpZnkgdGhlIGFydGlmYWN0cyBiZWxvbmdzIHRvIHRoZSBjb21wb25lbnQKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50SWQKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHBhcmFtIGNvbXBvbmVudFR5cGUKKwkgKiBAcGFyYW0gZ3JvdXBEZWZpbml0aW9uCisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cChTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyB1c2VySWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIEdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlckV4aXN0cyA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsIENSRUFURV9HUk9VUCwgaW5UcmFuc2FjdGlvbik7CisKKwkJCWlmICh2YWxpZGF0ZVVzZXJFeGlzdHMuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlVXNlckV4aXN0cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVVzZXIgdXNlciA9IHZhbGlkYXRlVXNlckV4aXN0cy5sZWZ0KCkudmFsdWUoKTsKKwkJCS8vIDUuIGNoZWNrIHNlcnZpY2UvcmVzb3VyY2UgZXhpc3RlbmNlCisJCQkvLyA2LiBjaGVjayBzZXJ2aWNlL3Jlc291cmNlIGNoZWNrIG91dAorCQkJLy8gNy4gdXNlciBpcyBvd25lciBvZiBjaGVja291dCBzdGF0ZQorCQkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisKKwkJCS8vIFN0cmluZyByZWFsQ29tcG9uZW50SWQgPSBjb21wb25lbnRUeXBlID09CisJCQkvLyBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSA/IHBhcmVudElkIDogY29tcG9uZW50SWQ7CisJCQlTdHJpbmcgcmVhbENvbXBvbmVudElkID0gY29tcG9uZW50SWQ7CisKKwkJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3ID0gbmV3IENvbXBvbmVudFBhcmFtZXRlcnNWaWV3KCk7CisJCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5kaXNhYmxlQWxsKCk7CisJCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVHcm91cHMoZmFsc2UpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQXJ0aWZhY3RzKGZhbHNlKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZVVzZXJzKGZhbHNlKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUNvbXBvbmVudEluc3RhbmNlcyhmYWxzZSk7CisKKwkJCUVpdGhlcjw/IGV4dGVuZHMgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyhyZWFsQ29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCB1c2VySWQsIG51bGwsIHVzZXIpOworCisJCQlpZiAodmFsaWRhdGVDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpOworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjYW5Xb3JrID0gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQoY29tcG9uZW50LCB1c2VySWQpOworCQkJaWYgKGNhbldvcmsuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNhbldvcmsucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSB0aGlzLmNyZWF0ZUdyb3VwKGNvbXBvbmVudCwgdXNlciwgY29tcG9uZW50VHlwZSwgZ3JvdXBEZWZpbml0aW9uLCBpblRyYW5zYWN0aW9uKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCisJCQl9CisKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGdldENvbXBvbmVudFR5cGVGb3JSZXNwb25zZShvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50KSB7CisJCVN0cmluZyBjb21wb25lbnRUeXBlRm9yUmVzcG9uc2UgPSAiU0VSVklDRSI7CisJCWlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworCQkJY29tcG9uZW50VHlwZUZvclJlc3BvbnNlID0gKChSZXNvdXJjZSkgY29tcG9uZW50KS5nZXRSZXNvdXJjZVR5cGUoKS5uYW1lKCk7CisJCX0KKwkJcmV0dXJuIGNvbXBvbmVudFR5cGVGb3JSZXNwb25zZTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgdGhhdCB0aGUgYXJ0aWZhY3QgbWVtYmVycyBiZWxvbmdzIHRvIHRoZSBjb21wb25lbnQKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQHBhcmFtIGFydGlmYWN0cworCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmVyaWZ5QXJ0aWZhY3RzQmVsb25nc1RvQ29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQsIExpc3Q8U3RyaW5nPiBhcnRpZmFjdHMsIFN0cmluZyBjb250ZXh0KSB7CisKKwkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IHRydWUgPT0gYXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gY29tcG9uZW50LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJaWYgKGRlcGxveW1lbnRBcnRpZmFjdHMgPT0gbnVsbCB8fCB0cnVlID09IGRlcGxveW1lbnRBcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoY29udGV4dCwgIk5vIGRlcGxveW1lbnQgYXJ0aWZhY3QgZm91bmQgdW5kZXIgY29tcG9uZW50ICIgKyBjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfQorCisJCUxpc3Q8U3RyaW5nPiBjdXJyZW50QXJ0aWZhY3RzID0gZGVwbG95bWVudEFydGlmYWN0cy52YWx1ZXMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFVuaXF1ZUlkKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCWxvZy5kZWJ1ZygiVGhlIGRlcGxveW1lbnQgYXJ0aWZhY3RzIG9mIGNvbXBvbmVudCB7fSBhcmUge30iLCBjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgZGVwbG95bWVudEFydGlmYWN0cyk7CisJCWlmIChmYWxzZSA9PSBjdXJyZW50QXJ0aWZhY3RzLmNvbnRhaW5zQWxsKGFydGlmYWN0cykpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcihjb250ZXh0LCAiTm90IGFsbCBhcnRpZmFjdHMgYmVsb25ncyB0byBjb21wb25lbnQgIiArIGNvbXBvbmVudC5nZXROb3JtYWxpemVkTmFtZSgpLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCisJfQorCisJLyoqCisJICogVmVyaWZ5IHRoYXQgdGhlIGFydGlmYWN0IG1lbWJlcnMgYmVsb25ncyB0byB0aGUgY29tcG9uZW50CisJICogCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqIEBwYXJhbSBhcnRpZmFjdHMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxBcnRpZmFjdERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZ2V0QXJ0aWZhY3RzQmVsb25nc1RvQ29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQsIExpc3Q8U3RyaW5nPiBhcnRpZmFjdHMsIFN0cmluZyBjb250ZXh0KSB7CisKKwkJLyoKKwkJICogaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IHRydWUgPT0gYXJ0aWZhY3RzLmlzRW1wdHkoKSkgeyByZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7IH0KKwkJICovCisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gY29tcG9uZW50LmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJaWYgKGRlcGxveW1lbnRBcnRpZmFjdHMgPT0gbnVsbCB8fCB0cnVlID09IGRlcGxveW1lbnRBcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoY29udGV4dCwgIk5vIGRlcGxveW1lbnQgYXJ0aWZhY3QgZm91bmQgdW5kZXIgY29tcG9uZW50ICIgKyBjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfQorCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gcmVzdWx0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQlmb3IgKFN0cmluZyBhcnRpZmFjdElkIDogYXJ0aWZhY3RzKSB7CisJCQlPcHRpb25hbDxBcnRpZmFjdERlZmluaXRpb24+IGdyb3VwQXJ0aWZhY3RPcCA9IGRlcGxveW1lbnRBcnRpZmFjdHMudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRVbmlxdWVJZCgpLmVxdWFscyhhcnRpZmFjdElkKSkuZmluZEFueSgpOworCisJCQlpZiAoZ3JvdXBBcnRpZmFjdE9wLmlzUHJlc2VudCgpKSB7CisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGdyb3VwQXJ0aWZhY3QgPSBncm91cEFydGlmYWN0T3AuZ2V0KCk7CisJCQkJcmVzdWx0TGlzdC5hZGQoZ3JvdXBBcnRpZmFjdCk7CisJCQl9IGVsc2UgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcihjb250ZXh0LCAiTm90IGFsbCBhcnRpZmFjdHMgYmVsb25ncyB0byBjb21wb25lbnQgIiArIGNvbXBvbmVudC5nZXROb3JtYWxpemVkTmFtZSgpLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKworCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdExpc3QpOworCisJfQorCisJLyoqCisJICogdmVyaWZ5IHRoYXQgdGhlIG1lbWJlcnMgYXJlIGNvbXBvbmVudCBpbnN0YW5jZXMgb2YgdGhlIGNvbXBvbmVudAorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnQKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBncm91cE1lbWJlcnMKKwkgKiBAcGFyYW0gbWVtYmVyVG9zY2FUeXBlcworCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmVyaWZ5Q29tcG9uZW50SW5zdGFuY2VzQXJlVmFsaWRNZW1iZXJzKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBncm91cFR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3JvdXBNZW1iZXJzLCBMaXN0PFN0cmluZz4gbWVtYmVyVG9zY2FUeXBlcykgeworCisJCWlmIChncm91cE1lbWJlcnMgPT0gbnVsbCB8fCB0cnVlID09IGdyb3VwTWVtYmVycy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCisJCWlmIChtZW1iZXJUb3NjYVR5cGVzID09IG51bGwgfHwgdHJ1ZSA9PSBtZW1iZXJUb3NjYVR5cGVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzICE9IG51bGwgJiYgZmFsc2UgPT0gY29tcG9uZW50SW5zdGFuY2VzLmlzRW1wdHkoKSkgeworCQkJTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2U+IGNvbXBJbnN0VWlkVG9Db21wSW5zdE1hcCA9IGNvbXBvbmVudEluc3RhbmNlcy5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAocCAtPiBwLmdldFVuaXF1ZUlkKCksIHAgLT4gcCkpOworCisJCQlTZXQ8U3RyaW5nPiBhbGxDb21wSW5zdGFuY2VzID0gY29tcEluc3RVaWRUb0NvbXBJbnN0TWFwLmtleVNldCgpOworCisJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBncm91cE1lbWJlciA6IGdyb3VwTWVtYmVycy5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGNvbXBOYW1lID0gZ3JvdXBNZW1iZXIuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIGNvbXBVaWQgPSBncm91cE1lbWJlci5nZXRWYWx1ZSgpOworCisJCQkJaWYgKGZhbHNlID09IGFsbENvbXBJbnN0YW5jZXMuY29udGFpbnMoY29tcFVpZCkpIHsKKwkJCQkJLyoKKwkJCQkJICogJTEgLSBtZW1iZXIgbmFtZSAlMiAtIGdyb3VwIG5hbWUgJTMgLSBWRiBuYW1lICU0IC0gY29tcG9uZW50IHR5cGUgW1ZGIF0KKwkJCQkJICovCisJCQkJCVN0cmluZyBjb21wb25lbnRUeXBlRm9yUmVzcG9uc2UgPSBnZXRDb21wb25lbnRUeXBlRm9yUmVzcG9uc2UoY29tcG9uZW50KTsKKworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoQ1JFQVRFX0dST1VQLCAiTm90IGFsbCBncm91cCBtZW1iZXJzIGV4aXN0cyB1bmRlciB0aGUgY29tcG9uZW50IiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdST1VQX0lOVkFMSURfQ09NUE9ORU5UX0lOU1RBTkNFLCBjb21wTmFtZSwgZ3JvdXBOYW1lLCBjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgY29tcG9uZW50VHlwZUZvclJlc3BvbnNlKSk7CisJCQkJfQorCQkJfQorCisJCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uQnlQYXJlbnRDb21wb25lbnRUeXBlKGNvbXBvbmVudFR5cGUpOworCQkJaWYgKGNvbXBvbmVudE9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlT3BlcmF0aW9uKSB7CisJCQkJUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb24gPSAoUmVzb3VyY2VPcGVyYXRpb24pIGNvbXBvbmVudE9wZXJhdGlvbjsKKworCQkJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGdyb3VwTWVtYmVyIDogZ3JvdXBNZW1iZXJzLmVudHJ5U2V0KCkpIHsKKworCQkJCQlTdHJpbmcgY29tcG9uZW50SW5zdE5hbWUgPSBncm91cE1lbWJlci5nZXRLZXkoKTsKKwkJCQkJU3RyaW5nIGNvbXBvbmVudEluc3RVaWQgPSBncm91cE1lbWJlci5nZXRWYWx1ZSgpOworCisJCQkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gY29tcEluc3RVaWRUb0NvbXBJbnN0TWFwLmdldChjb21wb25lbnRJbnN0VWlkKTsKKwkJCQkJU3RyaW5nIGNvbXBvbmVudFVpZCA9IGNvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpOworCQkJCQlMaXN0PFN0cmluZz4gY29tcG9uZW50VG9zY2FOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXNvdXJjZU9wZXJhdGlvbi5maWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaChjb21wb25lbnRVaWQsIGNvbXBvbmVudFRvc2NhTmFtZXMpOworCQkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQ1JFQVRFX0dST1VQLCAiQ2Fubm90IGZpbmQgdG9zY2EgbGlzdCBvZiBjb21wb25lbnQgaWQgIiArIGNvbXBvbmVudFVpZCwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJCQl9CisKKwkJCQkJbG9nLmRlYnVnKCJUaGUgdG9zY2EgbmFtZXMgb2YgY29tcG9uZW50IGlkIHt9IGFyZSB7fSIsIGNvbXBvbmVudFVpZCwgbWVtYmVyVG9zY2FUeXBlcyk7CisKKwkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJCQlmb3IgKFN0cmluZyBtZW1iZXJUb3NjYVR5cGUgOiBtZW1iZXJUb3NjYVR5cGVzKSB7CisJCQkJCQlpZiAoY29tcG9uZW50VG9zY2FOYW1lcy5jb250YWlucyhtZW1iZXJUb3NjYVR5cGUpKSB7CisJCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChmb3VuZCA9PSBmYWxzZSkgeworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKENSRUFURV9HUk9VUCwKKwkJCQkJCQkJIk5vIHRvc2NhIHR5cGVzIGZyb20gIiArIG1lbWJlclRvc2NhVHlwZXMgKyAiIGNhbiBiZSBmb3VuZCBpbiB0aGUgdG9zY2EgbGlzdCAiICsgY29tcG9uZW50VG9zY2FOYW1lcyArICIgb2YgY29tcG9uZW50ICIgKyBjb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCQkJLyoKKwkJCQkJCSAqICMgJTEgLSBtZW1iZXIgbmFtZSAjICUyIC0gZ3JvdXAgbmFtZSAjICUzIC0gZ3JvdXAgdHlwZQorCQkJCQkJICovCisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR1JPVVBfSU5WQUxJRF9UT1NDQV9OQU1FX09GX0NPTVBPTkVOVF9JTlNUQU5DRSwgY29tcG9uZW50SW5zdE5hbWUsIGdyb3VwTmFtZSwgZ3JvdXBUeXBlKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsb2cuZGVidWcoIkNvbXBvbmVudCBpbnN0YW5jZSB7fSBmaXRzIHRvIG9uZSBvZiB0aGUgcmVxdWlyZWQgdG9zY2EgdHlwZXMiLCBjb21wb25lbnRJbnN0YW5jZS5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKENSRUFURV9HUk9VUCwgIkNhbm5vdCBmaW5kIHRvc2NhIGxpc3Qgc2luY2UgaXQgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJvZHVjdCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbXBvbmVudE9wZXJhdGlvbihOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCisJCXN3aXRjaCAoY29tcG9uZW50VHlwZSkgeworCQljYXNlIFNlcnZpY2U6CisJCWNhc2UgUmVzb3VyY2VJbnN0YW5jZToKKwkJCXJldHVybiBzZXJ2aWNlT3BlcmF0aW9uOworCQljYXNlIFJlc291cmNlOgorCQkJcmV0dXJuIHJlc291cmNlT3BlcmF0aW9uOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgc3BlY2lmaWMgZ3JvdXAgdmVyc2lvbgorCSAqIAorCSAqIEBwYXJhbSBncm91cERlZmluaXRpb24KKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBWZXJzaW9uKEdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQlMaXN0PFN0cmluZz4gZ3JvdXBJZHNUb1VwZGF0ZVZlcnNpb24gPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZ3JvdXBJZHNUb1VwZGF0ZVZlcnNpb24uYWRkKGdyb3VwRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBWZXJzaW9uID0gdXBkYXRlR3JvdXBWZXJzaW9uKGdyb3VwSWRzVG9VcGRhdGVWZXJzaW9uLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHVwZGF0ZUdyb3VwVmVyc2lvbi5pc0xlZnQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodXBkYXRlR3JvdXBWZXJzaW9uLmxlZnQoKS52YWx1ZSgpLmdldCgwKSk7CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgZ3JvdXAgdmVyc2lvbi4gU3RhdHVzIGlzIHt9ICIsIHVwZGF0ZUdyb3VwVmVyc2lvbi5yaWdodCgpLnZhbHVlKCkpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHVwZGF0ZUdyb3VwVmVyc2lvbi5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogVXBkYXRlIGxpc3Qgb2YgZ3JvdXBzIHZlcnNpb25zCisJICogCisJICogQHBhcmFtIGdyb3Vwc1VuaXF1ZUlkCisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUdyb3VwVmVyc2lvbihMaXN0PFN0cmluZz4gZ3JvdXBzVW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJcmVzdWx0ID0gZ3JvdXBPcGVyYXRpb24udXBkYXRlR3JvdXBWZXJzaW9uKGdyb3Vwc1VuaXF1ZUlkLCB0cnVlKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGNyZWF0ZSBncm91cC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgR3JvdXBEZWZpbml0aW9uIG1ldGFkYXRhCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudElkCisJICogQHBhcmFtIHVzZXIKKwkgKiBAcGFyYW0gZ3JvdXBJZAorCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlCisJICogQHBhcmFtIGdyb3VwVXBkYXRlCisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVHcm91cE1ldGFkYXRhKFN0cmluZyBjb21wb25lbnRJZCwgVXNlciB1c2VyLCBTdHJpbmcgZ3JvdXBVbmlxdWVJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgR3JvdXBEZWZpbml0aW9uIGdyb3VwVXBkYXRlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gbnVsbDsKKworCQkvLyBWYWxpZGF0ZSB1c2VyIGFuZCB2YWxpZGF0ZSBncm91cCBiZWxvbmdzIHRvIGNvbXBvbmVudAorCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWdyb3Vwcy5hZGQoZ3JvdXBVcGRhdGUpOworCQlFaXRoZXI8Q29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVHcm91cHNCZWZvcmVVcGRhdGUgPSB2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZShjb21wb25lbnRJZCwgdXNlci5nZXRVc2VySWQoKSwgY29tcG9uZW50VHlwZSwgZ3JvdXBzLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHZhbGlkYXRlR3JvdXBzQmVmb3JlVXBkYXRlLmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlR3JvdXBzQmVmb3JlVXBkYXRlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSB2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBHZXQgdGhlIEdyb3VwRGVmaW5pdGlvbiBvYmplY3QKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ3JvdXBTdGF0dXMgPSBncm91cE9wZXJhdGlvbi5nZXRHcm91cChncm91cFVuaXF1ZUlkKTsKKwkJaWYgKGdyb3VwU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGdyb3VwU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSksICIiKSk7CisJCX0KKwkJR3JvdXBEZWZpbml0aW9uIGN1cnJlbnRHcm91cCA9IGdyb3VwU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIFZhbGlkYXRlIGdyb3VwIHR5cGUgaXMgdmZNb2R1bGUKKwkJaWYgKCFjdXJyZW50R3JvdXAuZ2V0VHlwZSgpLmVxdWFscyhDb25zdGFudHMuREVGQVVMVF9HUk9VUF9WRl9NT0RVTEUpKSB7CisJCQlsb2cuZXJyb3IoIkdyb3VwIHVwZGF0ZSBtZXRhZGF0YTogR3JvdXAgdHlwZSBpcyBkaWZmZXJlbnQgdGhlbjoge30iLCBDb25zdGFudHMuREVGQVVMVF9HUk9VUF9WRl9NT0RVTEUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfVkZfTU9EVUxFX1RZUEUsIGdyb3VwVXBkYXRlLmdldFR5cGUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0aW9uUnNwb25zZSA9IHZhbGlkYXRlQW5kVXBkYXRlR3JvdXBNZXRhZGF0YShjdXJyZW50R3JvdXAsIGdyb3VwVXBkYXRlKTsKKwkJaWYgKHZhbGlkYXRpb25Sc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJbG9nLmluZm8oIkdyb3VwIHVwZGF0ZSBtZXRhZGF0YTogdmFsaWRhdGlvbnMgZmllbGQuIik7CisJCQlyZXR1cm4gdmFsaWRhdGlvblJzcG9uc2U7CisJCX0KKwkJR3JvdXBEZWZpbml0aW9uIGdyb3VwVG9VcGRhdGUgPSB2YWxpZGF0aW9uUnNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBsb2NrIHJlc291cmNlCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja1Jlc3VsdCA9IGxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudCwgIlVwZGF0ZSBHcm91cERlZmluaXRpb24gTWV0YWRhdGEiKTsKKwkJaWYgKGxvY2tSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl0cnkgeworCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzcG9uc2UgPSBncm91cE9wZXJhdGlvbi51cGRhdGVHcm91cE5hbWUoZ3JvdXBVbmlxdWVJZCwgZ3JvdXBVcGRhdGUuZ2V0TmFtZSgpLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmICh1cGRhdGVSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIlVwZGF0ZSBHcm91cERlZmluaXRpb24gTWV0YWRhdGEiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigiVXBkYXRlIEdyb3VwRGVmaW5pdGlvbiBNZXRhZGF0YSIpOworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSBzZXZpY2Uge30iLCBncm91cFRvVXBkYXRlLmdldFVuaXF1ZUlkKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQl9CisJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodXBkYXRlUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQl9IGZpbmFsbHkgeworCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFZhbGlkYXRlIGFuZCB1cGRhdGUgR3JvdXBEZWZpbml0aW9uIG1ldGFkYXRhCisJICogCisJICogQHBhcmFtIHVzZXIKKwkgKiBAcGFyYW0gY3VycmVudEdyb3VwCisJICogQHBhcmFtIGdyb3VwVXBkYXRlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kVXBkYXRlR3JvdXBNZXRhZGF0YShHcm91cERlZmluaXRpb24gY3VycmVudEdyb3VwLCBHcm91cERlZmluaXRpb24gZ3JvdXBVcGRhdGUpIHsKKwkJLy8gQ2hlY2sgaWYgdG8gdXBkYXRlLCBhbmQgdXBkYXRlIEdyb3VwRGVmaW5pdGlvbiBuYW1lLgorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlID0gdmFsaWRhdGVBbmRVcGRhdGVHcm91cE5hbWUoY3VycmVudEdyb3VwLCBncm91cFVwZGF0ZSk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJLy8gRG8gbm90IGFsbG93IHRvIHVwZGF0ZSBHcm91cERlZmluaXRpb24gdmVyc2lvbiBkaXJlY3RseS4KKwkJU3RyaW5nIHZlcnNpb25VcGRhdGVkID0gZ3JvdXBVcGRhdGUuZ2V0VmVyc2lvbigpOworCQlTdHJpbmcgdmVyc2lvbkN1cnJlbnQgPSBjdXJyZW50R3JvdXAuZ2V0VmVyc2lvbigpOworCQlpZiAodmVyc2lvblVwZGF0ZWQgIT0gbnVsbCAmJiAhdmVyc2lvbkN1cnJlbnQuZXF1YWxzKHZlcnNpb25VcGRhdGVkKSkgeworCQkJbG9nLmluZm8oInVwZGF0ZSBHcm91cDogcmVjaXZlZCByZXF1ZXN0IHRvIHVwZGF0ZSB2ZXJzaW9uIHRvIHt9IHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIGlnbm9yaW5nLiIsIHZlcnNpb25VcGRhdGVkKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjdXJyZW50R3JvdXApOworCX0KKworCS8qKgorCSAqIFZhbGlkYXRlIGFuZCB1cGRhdGUgR3JvdXBEZWZpbml0aW9uIG5hbWUKKwkgKiAKKwkgKiBAcGFyYW0gdXNlcgorCSAqIEBwYXJhbSBjdXJyZW50R3JvdXAKKwkgKiBAcGFyYW0gZ3JvdXBVcGRhdGUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kVXBkYXRlR3JvdXBOYW1lKEdyb3VwRGVmaW5pdGlvbiBjdXJyZW50R3JvdXAsIEdyb3VwRGVmaW5pdGlvbiBncm91cFVwZGF0ZSkgeworCQlTdHJpbmcgbmFtZVVwZGF0ZWQgPSBncm91cFVwZGF0ZS5nZXROYW1lKCk7CisJCVN0cmluZyBuYW1lQ3VycmVudCA9IGN1cnJlbnRHcm91cC5nZXROYW1lKCk7CisJCWlmICghbmFtZUN1cnJlbnQuZXF1YWxzKG5hbWVVcGRhdGVkKSkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0TmFtZVJlc3BvbnNlID0gdmFsaWRhdGVHcm91cE5hbWUoY3VycmVudEdyb3VwLmdldE5hbWUoKSwgZ3JvdXBVcGRhdGUuZ2V0TmFtZSgpKTsKKwkJCWlmICh2YWxpZGF0TmFtZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9ucyA9IHZhbGlkYXROYW1lUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zKTsKKwkJCX0KKwkJCWN1cnJlbnRHcm91cC5zZXROYW1lKGdyb3VwVXBkYXRlLmdldE5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCS8qKgorCSAqIFZhbGlkYXRlIHRoYXQgZ3JvdXAgbmFtZSB0byB1cGRhdGUgaXMgdmFsaWQgKHNhbWUgYXMgY3VycmVudCBncm91cCBuYW1lIGV4Y2VwdCBmb3IgbWlkZGxlIHBhcnQpLiBGb3IgZXhhbXBsZTogQ3VycmVudCBncm91cCBuYW1lOiBNeVJlc291cmNlLi5NeURlc2MuLk1vZHVsZS0xIEdyb3VwIHRvIHVwZGF0ZTogTXlSZXNvdXJjZS4uTXlEZXNjMi4uTW9kdWxlLTEgVmVyaWZ5IHRoYXQgb25seSB0aGUgc2Vjb25kIHBhcnQKKwkgKiBNeURlc2Mgd2FzIGNoYW5nZWQuCisJICogCisJICogQHBhcmFtIGN1cnJlbnRHcm91cE5hbWUKKwkgKiBAcGFyYW0gZ3JvdXBVcGRhdGVOYW1lCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUdyb3VwTmFtZShTdHJpbmcgY3VycmVudEdyb3VwTmFtZSwgU3RyaW5nIGdyb3VwVXBkYXRlTmFtZSkgeworCQl0cnkgeworCQkJLy8gQ2hlY2sgaWYgdGhlIGdyb3VwIG5hbWUgaXMgaW4gb2xkIGZvcm1hdC4KKwkJCWlmIChQYXR0ZXJuLmNvbXBpbGUoQ29uc3RhbnRzLk1PRFVMRV9PTERfTkFNRV9QQVRURVJOKS5tYXRjaGVyKGdyb3VwVXBkYXRlTmFtZSkubWF0Y2hlcygpKSB7CisJCQkJbG9nLmVycm9yKCJHcm91cCBuYW1lIHt9IGlzIGluIG9sZCBmb3JtYXQiLCBncm91cFVwZGF0ZU5hbWUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1ZGX01PRFVMRV9OQU1FLCBncm91cFVwZGF0ZU5hbWUpKTsKKwkJCX0KKworCQkJLy8gQ2hlY2sgdGhhdCBuYW1lIHBhdHMgMSBhbmQgMyBkaWQgbm90IGNoYW5nZWQgKG9ubHkgdGhlIHNlY29uZAorCQkJLy8gcGFydCBjYW4gYmUgY2hhbmdlZCkKKwkJCS8vIEJ1dCB2ZXJpZnkgYmVmb3JlIHRoYXQgdGhlIGN1cnJlbnQgZ3JvdXAgZm9ybWF0IGlzIHRoZSBuZXcgb25lCisJCQlpZiAoIVBhdHRlcm4uY29tcGlsZShDb25zdGFudHMuTU9EVUxFX09MRF9OQU1FX1BBVFRFUk4pLm1hdGNoZXIoY3VycmVudEdyb3VwTmFtZSkubWF0Y2hlcygpKSB7CisJCQkJU3RyaW5nW10gc3BsaXQxID0gY3VycmVudEdyb3VwTmFtZS5zcGxpdCgiXFwuXFwuIik7CisJCQkJU3RyaW5nIGN1cnJlbnRSZXNvdXJjZU5hbWUgPSBzcGxpdDFbMF07CisJCQkJU3RyaW5nIGN1cnJlbnRDb3VudGVyID0gc3BsaXQxWzJdOworCisJCQkJU3RyaW5nW10gc3BsaXQyID0gZ3JvdXBVcGRhdGVOYW1lLnNwbGl0KCJcXC5cXC4iKTsKKwkJCQlTdHJpbmcgZ3JvdXBVcGRhdGVSZXNvdXJjZU5hbWUgPSBzcGxpdDJbMF07CisJCQkJU3RyaW5nIGdyb3VwVXBkYXRlQ291bnRlciA9IHNwbGl0MlsyXTsKKworCQkJCWlmICghY3VycmVudFJlc291cmNlTmFtZS5lcXVhbHMoZ3JvdXBVcGRhdGVSZXNvdXJjZU5hbWUpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1ZGX01PRFVMRV9OQU1FX01PRElGSUNBVElPTiwgY3VycmVudFJlc291cmNlTmFtZSkpOworCQkJCX0KKworCQkJCWlmICghY3VycmVudENvdW50ZXIuZXF1YWxzKGdyb3VwVXBkYXRlQ291bnRlcikpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfVkZfTU9EVUxFX05BTUVfTU9ESUZJQ0FUSU9OLCBjdXJyZW50Q291bnRlcikpOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJFcnJvciB2YWxpYWR0aW5nIGdyb3VwIG5hbWUiLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIGFzc29jaWF0ZSBhcnRpZmFjdHMgdG8gYSBnaXZlbiBncm91cAorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqIEBwYXJhbSB1c2VySWQKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBncm91cHMKKwkgKiBAcGFyYW0gc2hvdWxkTG9ja0NvbXAKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXAoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzLCBib29sZWFuIHNob3VsZExvY2tDb21wLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gbnVsbDsKKworCQlpZiAoc2hvdWxkTG9ja0NvbXAgPT0gdHJ1ZSAmJiBpblRyYW5zYWN0aW9uID09IHRydWUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiZGlzc29jaWF0ZUFydGlmYWN0c0Zyb21Hcm91cCIsICJDYW5ub3QgbG9jayBjb21wb25lbnQgc2luY2Ugd2UgYXJlIGluc2lkZSBhIHRyYW5zYWN0aW9uIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkvLyBDYW5ub3QgbG9jayBjb21wb25lbnQgc2luY2Ugd2UgYXJlIGluIGEgbWlkZGxlIG9mIGFub3RoZXIKKwkJCS8vIHRyYW5zYWN0aW9uLgorCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQ7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQl0cnkgeworCisJCQlpZiAoZ3JvdXBzID09IG51bGwgfHwgZ3JvdXBzLmlzRW1wdHkoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSykpOworCQkJfQorCisJCQlFaXRoZXI8Q29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVHcm91cHNCZWZvcmVVcGRhdGUgPSB2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZShjb21wb25lbnRJZCwgdXNlcklkLCBjb21wb25lbnRUeXBlLCBncm91cHMsIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHZhbGlkYXRlR3JvdXBzQmVmb3JlVXBkYXRlLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCWNvbXBvbmVudCA9IHZhbGlkYXRlR3JvdXBzQmVmb3JlVXBkYXRlLmxlZnQoKS52YWx1ZSgpOworCisJCQlpZiAoc2hvdWxkTG9ja0NvbXApIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KGNvbXBvbmVudCwgIkdyb3VwIC0gQXNzb2NpYXRlIEFydGlmYWN0cyIpOworCQkJCWlmIChsb2NrQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisKKwkJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiB1cGRhdGVkR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBjb21wb25lbnRHcm91cHMgPSBjb21wb25lbnQuZ2V0R3JvdXBzKCk7CisKKwkJCS8vIHBlciBncm91cCwgYXNzb2NpYXRlIHRvIGl0IHRoZSBhcnRpZmFjdHMKKwkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA6IGdyb3VwcykgeworCisJCQkJR3JvdXBEZWZpbml0aW9uIGNvbXBvbmVudEdyb3VwID0gY29tcG9uZW50R3JvdXBzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoZ3JvdXBEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpKS5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CisJCQkJaWYgKGNvbXBvbmVudEdyb3VwICE9IG51bGwpIHsKKwkJCQkJTGlzdDxTdHJpbmc+IGNvbXBvbmVudEFydGlmYWN0cyA9IGNvbXBvbmVudEdyb3VwLmdldEFydGlmYWN0cygpOworCQkJCQlpbnQgYXJ0aWZhY3RzU2l6ZUluR3JvdXAgPSBjb21wb25lbnRBcnRpZmFjdHMgPT0gbnVsbCA/IDAgOiBjb21wb25lbnRBcnRpZmFjdHMuc2l6ZSgpOworCQkJCQlpZiAoYXJ0aWZhY3RzU2l6ZUluR3JvdXAgPiAwKSB7CisJCQkJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzVG9Bc3NvY2lhdGUgPSBncm91cERlZmluaXRpb24uZ2V0QXJ0aWZhY3RzKCk7CisKKwkJCQkJCS8vIGlmIG5vIGFydGlmY2F0cyBzZW50CisJCQkJCQlpZiAoYXJ0aWZhY3RzVG9Bc3NvY2lhdGUgPT0gbnVsbCB8fCB0cnVlID09IGFydGlmYWN0c1RvQXNzb2NpYXRlLmlzRW1wdHkoKSkgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQlib29sZWFuIGlzQ2hhbmdlZCA9IGNvbXBvbmVudEFydGlmYWN0cy5yZW1vdmVBbGwoYXJ0aWZhY3RzVG9Bc3NvY2lhdGUpOworCQkJCQkJaWYgKGlzQ2hhbmdlZCkgey8vIEkuZS4gQXQgbGVhc3Qgb25lIGFydGlmYWN0IGlzIGFscmVhZHkKKwkJCQkJCQkJCQkvLyBhc3NvY2lhdGVkIHRvIHRoZSBncm91cAorCQkJCQkJCWxvZy5kZWJ1ZygiU29tZSBvZiB0aGUgYXJ0aWZhY3RzIGFscmVhZHkgYXNzb2NpYXRlZCB0byBncm91cCB7fSIsIGdyb3VwRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR1JPVVBfQVJUSUZBQ1RfQUxSRUFEWV9BU1NPQ0lBVEVELCBjb21wb25lbnRHcm91cC5nZXROYW1lKCkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXAgPSBncm91cE9wZXJhdGlvbi5hc3NvY2lhdGVBcnRpZmFjdHNUb0dyb3VwKGdyb3VwRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBncm91cERlZmluaXRpb24uZ2V0QXJ0aWZhY3RzKCksIHRydWUpOworCisJCQkJaWYgKGFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXAuaXNSaWdodCgpKSB7CisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoYXNzb2NpYXRlQXJ0aWZhY3RzVG9Hcm91cC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgZ3JvdXAge30gdW5kZXIgY29tcG9uZW50IHt9LCBlcnJvcjoge30iLCBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLCBjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJCXVwZGF0ZWRHcm91cHMuYWRkKGFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXAubGVmdCgpLnZhbHVlKCkpOworCisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZWRHcm91cHMpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGNyZWF0ZSBncm91cC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gdW5sb2NrIHJlc291cmNlCisJCQlpZiAoc2hvdWxkTG9ja0NvbXAgJiYgY29tcG9uZW50ICE9IG51bGwpIHsKKwkJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCkpOworCQkJfQorCisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGFzc29jaWF0ZU1lbWJlcnNUb0dyb3VwKFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIHVzZXJJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcywgYm9vbGVhbiBzaG91bGRMb2NrQ29tcCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisKKwkJaWYgKHNob3VsZExvY2tDb21wID09IHRydWUgJiYgaW5UcmFuc2FjdGlvbiA9PSB0cnVlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoImRpc3NvY2lhdGVBcnRpZmFjdHNGcm9tR3JvdXAiLCAiQ2Fubm90IGxvY2sgY29tcG9uZW50IHNpbmNlIHdlIGFyZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJLy8gQ2Fubm90IGxvY2sgY29tcG9uZW50IHNpbmNlIHdlIGFyZSBpbiBhIG1pZGRsZSBvZiBhbm90aGVyCisJCQkvLyB0cmFuc2FjdGlvbi4KKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJaWYgKGdyb3VwcyA9PSBudWxsIHx8IGdyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spKTsKKwkJCX0KKworCQkJRWl0aGVyPENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlR3JvdXBzQmVmb3JlVXBkYXRlID0gdmFsaWRhdGVHcm91cHNCZWZvcmVVcGRhdGUoY29tcG9uZW50SWQsIHVzZXJJZCwgY29tcG9uZW50VHlwZSwgZ3JvdXBzLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmICh2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVHcm91cHNCZWZvcmVVcGRhdGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQljb21wb25lbnQgPSB2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJaWYgKHNob3VsZExvY2tDb21wKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChjb21wb25lbnQsICJHcm91cCAtIEFzc29jaWF0ZSBNZW1iZXJzIik7CisJCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKworCQkJTGlzdDxHcm91cERlZmluaXRpb24+IHVwZGF0ZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJLy8gcGVyIGdyb3VwLCBhc3NvY2lhdGUgdG8gaXQgdGhlIG1lbWJlcnMKKwkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA6IGdyb3VwcykgeworCisJCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlTWVtYmVyc1RvR3JvdXAgPSBncm91cE9wZXJhdGlvbi5hc3NvY2lhdGVNZW1iZXJzVG9Hcm91cChncm91cERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgZ3JvdXBEZWZpbml0aW9uLmdldE1lbWJlcnMoKSwgdHJ1ZSk7CisKKwkJCQlpZiAoYXNzb2NpYXRlTWVtYmVyc1RvR3JvdXAuaXNSaWdodCgpKSB7CisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoYXNzb2NpYXRlTWVtYmVyc1RvR3JvdXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIGdyb3VwIHt9IHVuZGVyIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCksIGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0gZWxzZSB7CisJCQkJCXVwZGF0ZWRHcm91cHMuYWRkKGFzc29jaWF0ZU1lbWJlcnNUb0dyb3VwLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodXBkYXRlZEdyb3Vwcyk7CisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGNyZWF0ZSBncm91cC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKworCQkJfQorCisJCQkvLyB1bmxvY2sgcmVzb3VyY2UKKwkJCWlmIChzaG91bGRMb2NrQ29tcCAmJiBjb21wb25lbnQgIT0gbnVsbCkgeworCQkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKSk7CisJCQl9CisKKwkJfQorCX0KKworCS8qKgorCSAqIGFzc29jaWF0ZSBhcnRpZmFjdHMgdG8gYSBnaXZlbiBncm91cAorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqIEBwYXJhbSB1c2VySWQKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBncm91cHMKKwkgKiBAcGFyYW0gc2hvdWxkTG9ja0NvbXAKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbkluZm8sIFJlc3BvbnNlRm9ybWF0PiBnZXRHcm91cFdpdGhBcnRpZmFjdHNCeUlkKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGdyb3VwSWQsIFN0cmluZyB1c2VySWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb25JbmZvLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gbnVsbDsKKworCQkvLyBWYWxpZGF0ZSB1c2VyIGV4aXN0CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyRXhpc3RzID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgVVBEQVRFX0dST1VQLCB0cnVlKTsKKworCQlpZiAodmFsaWRhdGVVc2VyRXhpc3RzLmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlVXNlckV4aXN0cy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCVVzZXIgdXNlciA9IHZhbGlkYXRlVXNlckV4aXN0cy5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBWYWxpZGF0ZSBjb21wb25lbnQgZXhpc3QKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCVN0cmluZyByZWFsQ29tcG9uZW50SWQgPSBjb21wb25lbnRJZDsKKworCQl0cnkgeworCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgPSBuZXcgQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcoKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmRpc2FibGVBbGwoKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUdyb3VwcyhmYWxzZSk7CisJCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVBcnRpZmFjdHMoZmFsc2UpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlVXNlcnMoZmFsc2UpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQ29tcG9uZW50SW5zdGFuY2VzKGZhbHNlKTsKKworCQkJRWl0aGVyPD8gZXh0ZW5kcyBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzKHJlYWxDb21wb25lbnRJZCwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIHVzZXJJZCwgbnVsbCwgdXNlcik7CisJCQlpZiAodmFsaWRhdGVDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpOworCisJCQkvLyB2YWxpZGF0ZSB3ZSBjYW4gd29yayBvbiBjb21wb25lbnQKKwkJCS8qCisJCQkgKiBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGNhbldvcmsgPSB2YWxpZGF0ZUNhbldvcmtPbkNvbXBvbmVudCggY29tcG9uZW50LCB1c2VySWQpOyBpZiAoY2FuV29yay5pc1JpZ2h0KCkpIHsgcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNhbldvcmsucmlnaHQoKS52YWx1ZSgpKTsgcmV0dXJuIHJlc3VsdDsgfQorCQkJICovCisJCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzID0gY29tcG9uZW50LmdldEdyb3VwcygpOworCQkJT3B0aW9uYWw8R3JvdXBEZWZpbml0aW9uPiBmaW5kQW55ID0gZ3JvdXBzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoZ3JvdXBJZCkpLmZpbmRBbnkoKTsKKwkJCWlmIChmaW5kQW55LmlzUHJlc2VudCgpKSB7CisJCQkJR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gZmluZEFueS5nZXQoKTsKKwkJCQlCb29sZWFuIGlzQmFzZSA9IG51bGw7Ly8gQ29uc3RhbnRzLklTX0JBU0U7CisJCQkJTGlzdDxHcm91cFByb3BlcnR5PiBwcm9wcyA9IGdyb3VwLmdldFByb3BlcnRpZXMoKTsKKwkJCQlpZiAocHJvcHMgIT0gbnVsbCAmJiAhcHJvcHMuaXNFbXB0eSgpKSB7CisJCQkJCU9wdGlvbmFsPEdyb3VwUHJvcGVydHk+IGlzQmFzZVByb3BPcCA9IHByb3BzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0TmFtZSgpLmVxdWFscyhDb25zdGFudHMuSVNfQkFTRSkpLmZpbmRBbnkoKTsKKwkJCQkJaWYgKGlzQmFzZVByb3BPcC5pc1ByZXNlbnQoKSkgeworCQkJCQkJR3JvdXBQcm9wZXJ0eSBwcm9wSXNCYXNlID0gaXNCYXNlUHJvcE9wLmdldCgpOworCQkJCQkJaXNCYXNlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcElzQmFzZS5nZXRWYWx1ZSgpKTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKEdFVF9HUk9VUCwgImZhaWxlZCB0byBmaW5kIHByb3AgaXNCYXNlICIgKyBjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQkJCS8vIHJldHVybgorCQkJCQkJLy8gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisKKwkJCQkJfQorCQkJCX0KKworCQkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uSW5mbz4gYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOworCQkJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHNJZHMgPSBncm91cC5nZXRBcnRpZmFjdHMoKTsKKwkJCQlpZiAoYXJ0aWZhY3RzSWRzICE9IG51bGwgJiYgIWFydGlmYWN0c0lkcy5pc0VtcHR5KCkpIHsKKwkJCQkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGdldEFydGlmYWN0cyA9IGdldEFydGlmYWN0c0JlbG9uZ3NUb0NvbXBvbmVudChjb21wb25lbnQsIGFydGlmYWN0c0lkcywgR0VUX0dST1VQKTsKKwkJCQkJaWYgKGdldEFydGlmYWN0cy5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGQgdG8gZmluZCBhcnRpZmFjdHMgaW4gZ3JvdXAge30gdW5kZXIgY29tcG9uZW50IHt9IiwgZ3JvdXBJZCwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJCQkJLy8gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGdldEFydGlmYWN0cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJLy8gcmV0dXJuIHJlc3VsdDsKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c0Zyb21Db21wb25lbnQgPSBnZXRBcnRpZmFjdHMubGVmdCgpLnZhbHVlKCk7CisJCQkJCQlpZiAoYXJ0aWZhY3RzRnJvbUNvbXBvbmVudCAhPSBudWxsICYmICFhcnRpZmFjdHNGcm9tQ29tcG9uZW50LmlzRW1wdHkoKSkgeworCQkJCQkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IGFydGlmYWN0c0Zyb21Db21wb25lbnQpIHsKKwkJCQkJCQkJQXJ0aWZhY3REZWZpbml0aW9uSW5mbyBhcnRpZmFjdERlZmluaXRpb25JbmZvID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbkluZm8oYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkJCQkJCQkJYXJ0aWZhY3RzLmFkZChhcnRpZmFjdERlZmluaXRpb25JbmZvKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJR3JvdXBEZWZpbml0aW9uSW5mbyByZXN1bHRJbmZvID0gbmV3IEdyb3VwRGVmaW5pdGlvbkluZm8oZ3JvdXApOworCQkJCXJlc3VsdEluZm8uc2V0SXNCYXNlKGlzQmFzZSk7CisJCQkJaWYgKCFhcnRpZmFjdHMuaXNFbXB0eSgpKQorCQkJCQlyZXN1bHRJbmZvLnNldEFydGlmYWN0cyhhcnRpZmFjdHMpOworCisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocmVzdWx0SW5mbyk7CisKKwkJCQlyZXR1cm4gcmVzdWx0OworCisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGQgdG8gZmluZCBncm91cCB7fSB1bmRlciBjb21wb25lbnQge30iLCBncm91cElkLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKEdFVF9HUk9VUCwgImdyb3VwICAiICsgZ3JvdXBJZCArICIgbm90IGZvdW5kIHVuZGVyIGNvbXBvbmVudCAiICsgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQkJU3RyaW5nIGNvbXBvbmVudFR5cGVGb3JSZXNwb25zZSA9IGdldENvbXBvbmVudFR5cGVGb3JSZXNwb25zZShjb21wb25lbnQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdST1VQX0lTX01JU1NJTkcsIGdyb3VwSWQsIGNvbXBvbmVudC5nZXRTeXN0ZW1OYW1lKCksIGNvbXBvbmVudFR5cGVGb3JSZXNwb25zZSkpOworCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCisJCQl9CisKKwkJfQorCisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbXBvbmVudElkCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlCisJICogQHBhcmFtIGdyb3VwcworCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlR3JvdXBzQmVmb3JlVXBkYXRlKFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIHVzZXJJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdDsKKworCQkvLyBWYWxpZGF0ZSB1c2VyIGV4aXN0CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyRXhpc3RzID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgVVBEQVRFX0dST1VQLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHZhbGlkYXRlVXNlckV4aXN0cy5pc1JpZ2h0KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZVVzZXJFeGlzdHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJVXNlciB1c2VyID0gdmFsaWRhdGVVc2VyRXhpc3RzLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIFZhbGlkYXRlIGNvbXBvbmVudCBleGlzdAorCQlTdHJpbmcgcmVhbENvbXBvbmVudElkID0gY29tcG9uZW50SWQ7CisKKwkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgPSBuZXcgQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcoKTsKKwkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuZGlzYWJsZUFsbCgpOworCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVHcm91cHMoZmFsc2UpOworCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVBcnRpZmFjdHMoZmFsc2UpOworCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVVc2VycyhmYWxzZSk7CisJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUNvbXBvbmVudEluc3RhbmNlcyhmYWxzZSk7CisKKwkJRWl0aGVyPD8gZXh0ZW5kcyBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzKHJlYWxDb21wb25lbnRJZCwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIHVzZXJJZCwgbnVsbCwgdXNlcik7CisKKwkJaWYgKHZhbGlkYXRlQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyB2YWxpZGF0ZSB3ZSBjYW4gd29yayBvbiBjb21wb25lbnQKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjYW5Xb3JrID0gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQoY29tcG9uZW50LCB1c2VySWQpOworCQlpZiAoY2FuV29yay5pc1JpZ2h0KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjYW5Xb3JrLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJLy8gVmFsaWRhdGUgZ3JvdXBzIGV4aXN0cyBpbiB0aGUgY29tcG9uZW50CisJCVJlc3BvbnNlRm9ybWF0IHZhbGlkYXRlR3JvdXBzSW5Db21wb25lbnQgPSB2YWxpZGF0ZUdyb3Vwc0luQ29tcG9uZW50QnlGdW5jKGdyb3VwcywgY29tcG9uZW50LCBwIC0+IHAuZ2V0VW5pcXVlSWQoKSk7CisJCWlmICh2YWxpZGF0ZUdyb3Vwc0luQ29tcG9uZW50ICE9IG51bGwpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUdyb3Vwc0luQ29tcG9uZW50KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlTZXQ8U3RyaW5nPiBhcnRpZmFjdHMgPSBuZXcgSGFzaFNldDw+KCk7CisJCWdyb3Vwcy5mb3JFYWNoKHAgLT4geworCQkJaWYgKHAuZ2V0QXJ0aWZhY3RzKCkgIT0gbnVsbCkgeworCQkJCWFydGlmYWN0cy5hZGRBbGwocC5nZXRBcnRpZmFjdHMoKSk7CisJCQl9CisJCX0pOworCQkvLyB2YWxpZGF0ZSBhbGwgYXJ0aWZhY3RzIGJlbG9uZ3MgdG8gdGhlIGNvbXBvbmVudAorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZlcmlmeUFydGlmYWN0c0JlbG9uZ3NUb0NvbXBvbmVudCA9IHZlcmlmeUFydGlmYWN0c0JlbG9uZ3NUb0NvbXBvbmVudChjb21wb25lbnQsIG5ldyBBcnJheUxpc3Q8PihhcnRpZmFjdHMpLCBVUERBVEVfR1JPVVApOworCQlpZiAodmVyaWZ5QXJ0aWZhY3RzQmVsb25nc1RvQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZlcmlmeUFydGlmYWN0c0JlbG9uZ3NUb0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnQpOworCX0KKworCXByaXZhdGUgUmVzcG9uc2VGb3JtYXQgdmFsaWRhdGVHcm91cHNJbkNvbXBvbmVudChMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50KSB7CisKKwkJRnVuY3Rpb248R3JvdXBEZWZpbml0aW9uLCBTdHJpbmc+IGdldEJ5TmFtZSA9IHMgLT4gcy5nZXROYW1lKCk7CisKKwkJcmV0dXJuIHZhbGlkYXRlR3JvdXBzSW5Db21wb25lbnRCeUZ1bmMoZ3JvdXBzLCBjb21wb25lbnQsIGdldEJ5TmFtZSk7CisKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZ3JvdXBzCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqIEBwYXJhbSBnZXRCeVBhcmFtCisJICogICAgICAgICAgICAtIHRoZSBtZXRob2QgdG8gZmV0Y2ggdGhlIGtleSBvZiB0aGUgR3JvdXBEZWZpbml0aW9uKGZyb20gZ3JvdXBzKSBpbiBvcmRlciB0byBjb21wYXJlIHRvIGdyb3VwcyBpbiB0aGUgY29tcG9uZW50CisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgUmVzcG9uc2VGb3JtYXQgdmFsaWRhdGVHcm91cHNJbkNvbXBvbmVudEJ5RnVuYyhMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBGdW5jdGlvbjxHcm91cERlZmluaXRpb24sIFN0cmluZz4gZ2V0QnlQYXJhbSkgeworCQlSZXNwb25zZUZvcm1hdCByZXN1bHQgPSBudWxsOworCisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBjdXJyZW50R3JvdXBzID0gY29tcG9uZW50LmdldEdyb3VwcygpOworCisJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJTGlzdDxTdHJpbmc+IHVwZGF0ZWRHcm91cHNOYW1lID0gZ3JvdXBzLnN0cmVhbSgpLm1hcChnZXRCeVBhcmFtKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCUxpc3Q8U3RyaW5nPiBtaXNzaW5nR3JvdXBOYW1lcyA9IHVwZGF0ZWRHcm91cHNOYW1lOworCisJCWlmIChjdXJyZW50R3JvdXBzICE9IG51bGwgJiYgZmFsc2UgPT0gY3VycmVudEdyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCUxpc3Q8U3RyaW5nPiBjdXJyZW50R3JvdXBzTmFtZSA9IGN1cnJlbnRHcm91cHMuc3RyZWFtKCkubWFwKGdldEJ5UGFyYW0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJCWlmIChjdXJyZW50R3JvdXBzTmFtZS5jb250YWluc0FsbCh1cGRhdGVkR3JvdXBzTmFtZSkpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCWN1cnJlbnRHcm91cHNOYW1lLnJlbW92ZUFsbChjdXJyZW50R3JvdXBzTmFtZSk7CisJCQkJbWlzc2luZ0dyb3VwTmFtZXMgPSBjdXJyZW50R3JvdXBzTmFtZTsKKwkJCX0KKwkJfQorCQlpZiAoZmFsc2UgPT0gZm91bmQpIHsKKwkJCVN0cmluZyBjb21wb25lbnRUeXBlRm9yUmVzcG9uc2UgPSBnZXRDb21wb25lbnRUeXBlRm9yUmVzcG9uc2UoY29tcG9uZW50KTsKKwkJCVN0cmluZyBsaXN0T2ZHcm91cHMgPSBnZXRBc1N0cmluZyhtaXNzaW5nR3JvdXBOYW1lcyk7CisJCQlyZXN1bHQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdST1VQX0lTX01JU1NJTkcsIGxpc3RPZkdyb3VwcywgY29tcG9uZW50LmdldFN5c3RlbU5hbWUoKSwgY29tcG9uZW50VHlwZUZvclJlc3BvbnNlKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KSB7CisKKwkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuICIiOworCQl9CisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWxpc3QuZm9yRWFjaChwIC0+IGJ1aWxkZXIuYXBwZW5kKHAgKyAiLCIpKTsKKworCQlTdHJpbmcgcmVzdWx0ID0gYnVpbGRlci50b1N0cmluZygpOworCQlyZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGVuZ3RoKCkpOworCisJfQorCisJLyoqCisJICogZGlzc29jaWF0ZSBhcnRpZmFjdHMgZnJvbSBhIGdpdmVuIGdyb3VwCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudElkCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlCisJICogQHBhcmFtIGdyb3VwcworCSAqIEBwYXJhbSBzaG91bGRMb2NrQ29tcAorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZGlzc29jaWF0ZUFydGlmYWN0c0Zyb21Hcm91cChTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyB1c2VySWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIExpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHMsIGJvb2xlYW4gc2hvdWxkTG9ja0NvbXAsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCWlmIChzaG91bGRMb2NrQ29tcCA9PSB0cnVlICYmIGluVHJhbnNhY3Rpb24gPT0gdHJ1ZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJkaXNzb2NpYXRlQXJ0aWZhY3RzRnJvbUdyb3VwIiwgIkNhbm5vdCBsb2NrIGNvbXBvbmVudCBzaW5jZSB3ZSBhcmUgaW5zaWRlIGEgdHJhbnNhY3Rpb24iLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCS8vIENhbm5vdCBsb2NrIGNvbXBvbmVudCBzaW5jZSB3ZSBhcmUgaW4gYSBtaWRkbGUgb2YgYW5vdGhlcgorCQkJLy8gdHJhbnNhY3Rpb24uCisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVDsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJaWYgKGdyb3VwcyA9PSBudWxsIHx8IGdyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spKTsKKwkJCX0KKworCQkJRWl0aGVyPENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlR3JvdXBzQmVmb3JlVXBkYXRlID0gdmFsaWRhdGVHcm91cHNCZWZvcmVVcGRhdGUoY29tcG9uZW50SWQsIHVzZXJJZCwgY29tcG9uZW50VHlwZSwgZ3JvdXBzLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmICh2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVHcm91cHNCZWZvcmVVcGRhdGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQljb21wb25lbnQgPSB2YWxpZGF0ZUdyb3Vwc0JlZm9yZVVwZGF0ZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJaWYgKHNob3VsZExvY2tDb21wKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50ID0gbG9ja0NvbXBvbmVudChjb21wb25lbnQsICJHcm91cCAtIERpc3NvY2lhdGUgQXJ0aWZhY3RzIik7CisJCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKworCQkJTGlzdDxHcm91cERlZmluaXRpb24+IHVwZGF0ZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJTGlzdDxHcm91cERlZmluaXRpb24+IGNvbXBvbmVudEdyb3VwcyA9IGNvbXBvbmVudC5nZXRHcm91cHMoKTsKKwkJCS8vIHBlciBncm91cCwgYXNzb2NpYXRlIHRvIGl0IHRoZSBhcnRpZmFjdHMKKwkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA6IGdyb3VwcykgeworCisJCQkJR3JvdXBEZWZpbml0aW9uIGNvbXBvbmVudEdyb3VwID0gY29tcG9uZW50R3JvdXBzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoZ3JvdXBEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpKS5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CisJCQkJaWYgKGNvbXBvbmVudEdyb3VwICE9IG51bGwpIHsKKwkJCQkJTGlzdDxTdHJpbmc+IGNvbXBvbmVudEFydGlmYWN0cyA9IGNvbXBvbmVudEdyb3VwLmdldEFydGlmYWN0cygpOworCQkJCQlpbnQgYXJ0aWZhY3RzU2l6ZUluR3JvdXAgPSBjb21wb25lbnRBcnRpZmFjdHMgPT0gbnVsbCA/IDAgOiBjb21wb25lbnRBcnRpZmFjdHMuc2l6ZSgpOworCQkJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzVG9EaXNzb2NpYXRlID0gZ3JvdXBEZWZpbml0aW9uLmdldEFydGlmYWN0cygpOworCisJCQkJCS8vIGlmIG5vIGFydGlmY2F0cyBzZW50CisJCQkJCWlmIChhcnRpZmFjdHNUb0Rpc3NvY2lhdGUgPT0gbnVsbCB8fCB0cnVlID09IGFydGlmYWN0c1RvRGlzc29jaWF0ZS5pc0VtcHR5KCkpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJaWYgKGFydGlmYWN0c1NpemVJbkdyb3VwID4gMCkgeworCisJCQkJCQlib29sZWFuIGNvbnRhaW5zQWxsID0gY29tcG9uZW50QXJ0aWZhY3RzLmNvbnRhaW5zQWxsKGFydGlmYWN0c1RvRGlzc29jaWF0ZSk7CisJCQkJCQlpZiAoZmFsc2UgPT0gY29udGFpbnNBbGwpIHsgLy8gQXQgbGVhc3Qgb25lIGFydGlmYWN0IGlzCisJCQkJCQkJCQkJCQkJLy8gbm90IGFzc29jaWF0ZWQgdG8gdGhlCisJCQkJCQkJCQkJCQkJLy8gZ3JvdXAKKwkJCQkJCQlsb2cuZGVidWcoIlNvbWUgb2YgdGhlIGFydGlmYWN0cyBhbHJlYWR5IGRpc3NvY2lhdGVkIHRvIGdyb3VwIHt9IiwgZ3JvdXBEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HUk9VUF9BUlRJRkFDVF9BTFJFQURZX0RJU1NPQ0lBVEVELCBjb21wb25lbnRHcm91cC5nZXROYW1lKCkpKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChhcnRpZmFjdHNTaXplSW5Hcm91cCA9PSAwKSB7CisJCQkJCQkJaWYgKGFydGlmYWN0c1RvRGlzc29jaWF0ZSAhPSBudWxsICYmIGZhbHNlID09IGFydGlmYWN0c1RvRGlzc29jaWF0ZS5pc0VtcHR5KCkpIHsKKwkJCQkJCQkJbG9nLmRlYnVnKCJObyBhcnRpZmFjdCBpcyBmb3VuZCB1bmRlciB0aGUgZ3JvdXAge30iLCBncm91cERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HUk9VUF9BUlRJRkFDVF9BTFJFQURZX0RJU1NPQ0lBVEVELCBjb21wb25lbnRHcm91cC5nZXROYW1lKCkpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVBcnRpZmFjdHNUb0dyb3VwID0gZ3JvdXBPcGVyYXRpb24uZGlzc29jaWF0ZUFydGlmYWN0c0Zyb21Hcm91cChncm91cERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgZ3JvdXBEZWZpbml0aW9uLmdldEFydGlmYWN0cygpLCB0cnVlKTsKKworCQkJCWlmIChhc3NvY2lhdGVBcnRpZmFjdHNUb0dyb3VwLmlzUmlnaHQoKSkgeworCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIGdyb3VwIHt9IHVuZGVyIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCksIGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCQl1cGRhdGVkR3JvdXBzLmFkZChhc3NvY2lhdGVBcnRpZmFjdHNUb0dyb3VwLmxlZnQoKS52YWx1ZSgpKTsKKworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh1cGRhdGVkR3JvdXBzKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCisJCQl9CisJCQkvLyB1bmxvY2sgcmVzb3VyY2UKKwkJCWlmIChzaG91bGRMb2NrQ29tcCAmJiBjb21wb25lbnQgIT0gbnVsbCkgeworCQkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKSk7CisJCQl9CisKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cHMoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBEZWZpbml0aW9ucywgYm9vbGVhbiBzaG91bGRMb2NrQ29tcCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJaWYgKGdyb3VwRGVmaW5pdGlvbnMgIT0gbnVsbCAmJiBmYWxzZSA9PSBncm91cERlZmluaXRpb25zLmlzRW1wdHkoKSkgeworCisJCQkJaWYgKHNob3VsZExvY2tDb21wID09IHRydWUgJiYgaW5UcmFuc2FjdGlvbiA9PSB0cnVlKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiY3JlYXRlR3JvdXBzIiwgIkNhbm5vdCBsb2NrIGNvbXBvbmVudCBzaW5jZSB3ZSBhcmUgaW5zaWRlIGEgdHJhbnNhY3Rpb24iLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJLy8gQ2Fubm90IGxvY2sgY29tcG9uZW50IHNpbmNlIHdlIGFyZSBpbiBhIG1pZGRsZSBvZiBhbm90aGVyCisJCQkJCS8vIHRyYW5zYWN0aW9uLgorCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVDsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlckV4aXN0cyA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsIENSRUFURV9HUk9VUCwgdHJ1ZSk7CisJCQkJaWYgKHZhbGlkYXRlVXNlckV4aXN0cy5pc1JpZ2h0KCkpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlVXNlckV4aXN0cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCVVzZXIgdXNlciA9IHZhbGlkYXRlVXNlckV4aXN0cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3ID0gbmV3IENvbXBvbmVudFBhcmFtZXRlcnNWaWV3KCk7CisJCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuZGlzYWJsZUFsbCgpOworCQkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUdyb3VwcyhmYWxzZSk7CisJCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQXJ0aWZhY3RzKGZhbHNlKTsKKwkJCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVVc2VycyhmYWxzZSk7CisJCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQ29tcG9uZW50SW5zdGFuY2VzKGZhbHNlKTsKKworCQkJCUVpdGhlcjw/IGV4dGVuZHMgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cyhjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIHVzZXJJZCwgbnVsbCwgdXNlcik7CisKKwkJCQlpZiAodmFsaWRhdGVDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCQljb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCWlmIChzaG91bGRMb2NrQ29tcCkgeworCQkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KGNvbXBvbmVudCwgIkNyZWF0ZUdyb3VwcyIpOworCQkJCQlpZiAobG9ja0NvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQobG9ja0NvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJfQorCisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjYW5Xb3JrID0gdmFsaWRhdGVDYW5Xb3JrT25Db21wb25lbnQoY29tcG9uZW50LCB1c2VySWQpOworCQkJCWlmIChjYW5Xb3JrLmlzUmlnaHQoKSkgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY2FuV29yay5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA6IGdyb3VwRGVmaW5pdGlvbnMpIHsKKwkJCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwID0gdGhpcy5jcmVhdGVHcm91cChjb21wb25lbnQsIHVzZXIsIGNvbXBvbmVudFR5cGUsIGdyb3VwRGVmaW5pdGlvbiwgdHJ1ZSk7CisJCQkJCWlmIChjcmVhdGVHcm91cC5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBncm91cCB7fS4iLCBncm91cERlZmluaXRpb24pOworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNyZWF0ZUdyb3VwLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJCUdyb3VwRGVmaW5pdGlvbiBjcmVhdGVkR3JvdXAgPSBjcmVhdGVHcm91cC5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJZ3JvdXBzLmFkZChjcmVhdGVkR3JvdXApOworCQkJCX0KKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JvdXBzKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCisJCQl9CisJCQkvLyB1bmxvY2sgcmVzb3VyY2UKKwkJCWlmIChzaG91bGRMb2NrQ29tcCAmJiBjb21wb25lbnQgIT0gbnVsbCkgeworCQkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKSk7CisJCQl9CisKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cChDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIHVzZXIsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIEdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gY3JlYXRlIGdyb3VwIHt9IiwgZ3JvdXBEZWZpbml0aW9uKTsKKworCQl0cnkgeworCisJCQkvLyAzLiB2ZXJpZnkgZ3JvdXAgbm90IGFscmVhZHkgZXhpc3QKKwkJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHMgPSBjb21wb25lbnQuZ2V0R3JvdXBzKCk7CisJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQlpZiAoZ3JvdXBzICE9IG51bGwgJiYgZmFsc2UgPT0gZ3JvdXBzLmlzRW1wdHkoKSkgeworCisJCQkJR3JvdXBEZWZpbml0aW9uIGV4aXN0R3JvdXBEZWYgPSBncm91cHMuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShncm91cERlZmluaXRpb24uZ2V0TmFtZSgpKSkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOworCisJCQkJZm91bmQgPSBleGlzdEdyb3VwRGVmICE9IG51bGw7CisJCQl9CisKKwkJCWlmICh0cnVlID09IGZvdW5kKSB7CisJCQkJU3RyaW5nIGNvbXBvbmVudFR5cGVGb3JSZXNwb25zZSA9IGdldENvbXBvbmVudFR5cGVGb3JSZXNwb25zZShjb21wb25lbnQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdST1VQX0FMUkVBRFlfRVhJU1QsIGdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCksIGNvbXBvbmVudC5nZXROb3JtYWxpemVkTmFtZSgpLCBjb21wb25lbnRUeXBlRm9yUmVzcG9uc2UpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvLyA0LiB2ZXJpZnkgdHlwZSBvZiBncm91cCBleGlzdAorCQkJU3RyaW5nIGdyb3VwVHlwZSA9IGdyb3VwRGVmaW5pdGlvbi5nZXRUeXBlKCk7CisJCQlpZiAoZ3JvdXBUeXBlID09IG51bGwgfHwgZ3JvdXBUeXBlLmlzRW1wdHkoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdST1VQX01JU1NJTkdfR1JPVVBfVFlQRSwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXBUeXBlID0gZ3JvdXBUeXBlT3BlcmF0aW9uLmdldExhdGVzdEdyb3VwVHlwZUJ5VHlwZShncm91cFR5cGUsIHRydWUpOworCQkJaWYgKGdldEdyb3VwVHlwZS5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdldEdyb3VwVHlwZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoQ1JFQVRFX0dST1VQLCAiZ3JvdXAgdHlwZSAiICsgZ3JvdXBUeXBlICsgIiBjYW5ub3QgYmUgZm91bmQiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HUk9VUF9UWVBFX0lTX0lOVkFMSUQsIGdyb3VwVHlwZSkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCS8vIDYuIHZlcmlmeSB0aGUgY29tcG9uZW50IGluc3RhbmNlcyB0eXBlIGFyZSBhbGxvd2VkIGFjY29yZGluZyB0bworCQkJLy8gdGhlIG1lbWJlciB0eXBlcyBpbiB0aGUgZ3JvdXAgdHlwZQorCQkJR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGVEZWZpbml0aW9uID0gZ2V0R3JvdXBUeXBlLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGFyZVZhbGlkTWVtYmVycyA9IHZlcmlmeUNvbXBvbmVudEluc3RhbmNlc0FyZVZhbGlkTWVtYmVycyhjb21wb25lbnQsIGNvbXBvbmVudFR5cGUsIGdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCksIGdyb3VwVHlwZSwgZ3JvdXBEZWZpbml0aW9uLmdldE1lbWJlcnMoKSwgZ3JvdXBUeXBlRGVmaW5pdGlvbi5nZXRNZW1iZXJzKCkpOworCisJCQlpZiAoYXJlVmFsaWRNZW1iZXJzLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gYXJlVmFsaWRNZW1iZXJzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCS8vIDcuIHZlcmlmeSB0aGUgYXJ0aWZhY3RzIGJlbG9uZ3MgdG8gdGhlIGNvbXBvbmVudAorCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBhcmVWYWxpZEFydGlmYWN0cyA9IHZlcmlmeUFydGlmYWN0c0JlbG9uZ3NUb0NvbXBvbmVudChjb21wb25lbnQsIGdyb3VwRGVmaW5pdGlvbi5nZXRBcnRpZmFjdHMoKSwgQ1JFQVRFX0dST1VQKTsKKwkJCWlmIChhcmVWYWxpZEFydGlmYWN0cy5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGFyZVZhbGlkQXJ0aWZhY3RzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0gPSBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisKKwkJCS8vIGFkZCBpbnZhcmlhbnRVVUlECisJCQlTdHJpbmcgaW52YXJpYW50VVVJRCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZEludmFyaWFudFVVSUQoKTsKKwkJCWdyb3VwRGVmaW5pdGlvbi5zZXRJbnZhcmlhbnRVVUlEKGludmFyaWFudFVVSUQpOworCisJCQkvLyBhZGQgZ3JvdXBVVUlECisJCQlTdHJpbmcgZ3JvdXBVVUlEID0gVW5pcXVlSWRCdWlsZGVyLmdlbmVyYXRlVVVJRCgpOworCQkJZ3JvdXBEZWZpbml0aW9uLnNldEdyb3VwVVVJRChncm91cFVVSUQpOworCisJCQkvLyBhZGQgdmVyc2lvbgorCQkJZ3JvdXBEZWZpbml0aW9uLnNldFZlcnNpb24oSU5JVElBTF9WRVJTSU9OKTsKKworCQkJLy8gc2V0IGdyb3VwVHlwZSB1aWQKKwkJCWdyb3VwRGVmaW5pdGlvbi5zZXRUeXBlVWlkKGdyb3VwVHlwZURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisKKwkJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEdyb3VwVG9HcmFwaCA9IGdyb3VwT3BlcmF0aW9uLmFkZEdyb3VwKG5vZGVUeXBlRW51bSwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIGdyb3VwRGVmaW5pdGlvbiwgdHJ1ZSk7CisKKwkJCWlmIChhZGRHcm91cFRvR3JhcGguaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlT3BlcmF0aW9uU3RhdHVzID0gYWRkR3JvdXBUb0dyYXBoLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKSk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGdyb3VwIHt9IHVuZGVyIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCksIGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQkJfSBlbHNlIHsKKwkJCQlHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uQ3JlYXRlZCA9IGFkZEdyb3VwVG9HcmFwaC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChncm91cERlZmluaXRpb25DcmVhdGVkKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGNyZWF0ZSBncm91cC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVZmTW9kdWxlR3JvdXBOYW1lcyhTdHJpbmcgcmVzb3VyY2VTeXN0ZW1OYW1lLCBMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IHVwZGF0ZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUdyb3VwTmFtZXNSZXMgPSBFaXRoZXIubGVmdCh1cGRhdGVkR3JvdXBzKTsKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBOYW1lUmVzOworCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZVJlczsKKwkJaW50IGNvdW50ZXI7CisJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwIDogZ3JvdXBzKSB7CisJCQlpZiAoIWdyb3VwLmdldFR5cGUoKS5lcXVhbHMoQ29uc3RhbnRzLkRFRkFVTFRfR1JPVVBfVkZfTU9EVUxFKSAmJiAhUGF0dGVybi5jb21waWxlKENvbnN0YW50cy5NT0RVTEVfT0xEX05BTUVfUEFUVEVSTikubWF0Y2hlcihncm91cC5nZXROYW1lKCkpLm1hdGNoZXMoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY291bnRlciA9IEludGVnZXIucGFyc2VJbnQoZ3JvdXAuZ2V0TmFtZSgpLnNwbGl0KENvbnN0YW50cy5NT0RVTEVfTkFNRV9ERUxJTUlURVIpWzFdKTsKKwkJCXZhbGlkYXRlR2VuZXJhdGVHcm91cE5hbWVSZXMgPSB2YWxpZGF0ZUdlbmVyYXRlVmZNb2R1bGVHcm91cE5hbWUocmVzb3VyY2VTeXN0ZW1OYW1lLCBncm91cC5nZXREZXNjcmlwdGlvbigpLCBjb3VudGVyKTsKKwkJCWlmICh2YWxpZGF0ZUdlbmVyYXRlR3JvdXBOYW1lUmVzLmlzUmlnaHQoKSkgeworCQkJCXVwZGF0ZUdyb3VwTmFtZXNSZXMgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJdXBkYXRlR3JvdXBOYW1lUmVzID0gZ3JvdXBPcGVyYXRpb24udXBkYXRlR3JvdXBOYW1lKGdyb3VwLmdldFVuaXF1ZUlkKCksIHZhbGlkYXRlR2VuZXJhdGVHcm91cE5hbWVSZXMubGVmdCgpLnZhbHVlKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHVwZGF0ZUdyb3VwTmFtZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHVwZGF0ZUdyb3VwTmFtZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXVwZGF0ZUdyb3VwTmFtZXNSZXMgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCQkJCWJyZWFrOworCQkJfQorCQkJdXBkYXRlZEdyb3Vwcy5hZGQodXBkYXRlR3JvdXBOYW1lUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlR3JvdXBOYW1lc1JlczsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUdlbmVyYXRlVmZNb2R1bGVHcm91cE5hbWVzKExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IGFsbEdyb3VwcywgU3RyaW5nIHJlc291cmNlU3lzdGVtTmFtZSwgaW50IHN0YXJ0R3JvdXBDb3VudGVyKSB7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZXNSZXMgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJQ29sbGVjdGlvbnMuc29ydChhbGxHcm91cHMsIChhcnQxLCBhcnQyKSAtPiBBcnRpZmFjdFRlbXBsYXRlSW5mby5jb21wYXJlQnlHcm91cE5hbWUoYXJ0MSwgYXJ0MikpOworCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIGdyb3VwIDogYWxsR3JvdXBzKSB7CisJCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZVJlcyA9IHZhbGlkYXRlR2VuZXJhdGVWZk1vZHVsZUdyb3VwTmFtZShyZXNvdXJjZVN5c3RlbU5hbWUsIGdyb3VwLmdldERlc2NyaXB0aW9uKCksIHN0YXJ0R3JvdXBDb3VudGVyKyspOworCQkJaWYgKHZhbGlkYXRlR2VuZXJhdGVHcm91cE5hbWVSZXMuaXNSaWdodCgpKSB7CisJCQkJdmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZXNSZXMgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJZ3JvdXAuc2V0R3JvdXBOYW1lKHZhbGlkYXRlR2VuZXJhdGVHcm91cE5hbWVSZXMubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiB2YWxpZGF0ZUdlbmVyYXRlR3JvdXBOYW1lc1JlczsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSBtb2R1bGUgbmFtZSBmcm9tIHJlc291cmNlTmFtZSwgZGVzY3JpcHRpb24gYW5kIGNvdW50ZXIKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VTeXN0ZW1OYW1lCisJICogQHBhcmFtIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGdyb3VwQ291bnRlcgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUdlbmVyYXRlVmZNb2R1bGVHcm91cE5hbWUoU3RyaW5nIHJlc291cmNlU3lzdGVtTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZ3JvdXBDb3VudGVyKSB7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUdlbmVyYXRlR3JvdXBOYW1lUmVzOworCQlpZiAocmVzb3VyY2VTeXN0ZW1OYW1lICE9IG51bGwgJiYgZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBQYXR0ZXJuLmNvbXBpbGUoQ29uc3RhbnRzLk1PRFVMRV9ERVNDX1BBVFRFUk4pLm1hdGNoZXIoZGVzY3JpcHRpb24pLm1hdGNoZXMoKSkgeworCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gZGVzY3JpcHRpb24ucmVwbGFjZUFsbCgiXFwuXFwuIiwgIlxcLiIpOworCQkJdmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZVJlcyA9IEVpdGhlci5sZWZ0KFN0cmluZy5mb3JtYXQoQ29uc3RhbnRzLk1PRFVMRV9OQU1FX0ZPUk1BVCwgcmVzb3VyY2VTeXN0ZW1OYW1lLCBGaWxlbmFtZVV0aWxzLnJlbW92ZUV4dGVuc2lvbihmaWxlTmFtZSksIGdyb3VwQ291bnRlcikpOworCQl9IGVsc2UgeworCQkJdmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZVJlcyA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfVkZfTU9EVUxFX05BTUUpKTsKKwkJfQorCQlyZXR1cm4gdmFsaWRhdGVHZW5lcmF0ZUdyb3VwTmFtZVJlczsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lcyhNYXA8U3RyaW5nLCBHcm91cERlZmluaXRpb24+IGdyb3VwcywgU3RyaW5nIHJlc291cmNlU3lzdGVtTmFtZSkgeworCisJCU1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4gdXBkYXRlZE5hbWVzR3JvdXBzID0gbmV3IEhhc2hNYXA8PigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZWROYW1lc0dyb3Vwcyk7CisJCWZvciAoRW50cnk8U3RyaW5nLCBHcm91cERlZmluaXRpb24+IGdyb3VwRW50cnkgOiBncm91cHMuZW50cnlTZXQoKSkgeworCQkJR3JvdXBEZWZpbml0aW9uIGN1ckdyb3VwID0gZ3JvdXBFbnRyeS5nZXRWYWx1ZSgpOworCQkJU3RyaW5nIGdyb3VwVHlwZSA9IGN1ckdyb3VwLmdldFR5cGUoKTsKKwkJCVN0cmluZyBncm91cE5hbWUgPSBncm91cEVudHJ5LmdldEtleSgpOworCQkJaW50IGNvdW50ZXI7CisJCQlTdHJpbmcgZGVzY3JpcHRpb247CisJCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gbmV3R3JvdXBOYW1lUmVzOworCQkJaWYgKGdyb3VwVHlwZS5lcXVhbHMoQ29uc3RhbnRzLkRFRkFVTFRfR1JPVVBfVkZfTU9EVUxFKSAmJiAhUGF0dGVybi5jb21waWxlKENvbnN0YW50cy5NT0RVTEVfTkVXX05BTUVfUEFUVEVSTikubWF0Y2hlcihncm91cE5hbWUpLm1hdGNoZXMoKSkgeworCisJCQkJaWYgKFBhdHRlcm4uY29tcGlsZShDb25zdGFudHMuTU9EVUxFX09MRF9OQU1FX1BBVFRFUk4pLm1hdGNoZXIoZ3JvdXBFbnRyeS5nZXRLZXkoKSkubWF0Y2hlcygpKSB7CisJCQkJCWNvdW50ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KGdyb3VwRW50cnkuZ2V0S2V5KCkuc3BsaXQoQ29uc3RhbnRzLk1PRFVMRV9OQU1FX0RFTElNSVRFUilbMV0pOworCQkJCQlkZXNjcmlwdGlvbiA9IGN1ckdyb3VwLmdldERlc2NyaXB0aW9uKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY291bnRlciA9IGdldE5leHRWZk1vZHVsZU5hbWVDb3VudGVyKHVwZGF0ZWROYW1lc0dyb3Vwcyk7CisJCQkJCWRlc2NyaXB0aW9uID0gZ3JvdXBOYW1lOworCQkJCX0KKwkJCQluZXdHcm91cE5hbWVSZXMgPSB2YWxpZGF0ZUdlbmVyYXRlVmZNb2R1bGVHcm91cE5hbWUocmVzb3VyY2VTeXN0ZW1OYW1lLCBkZXNjcmlwdGlvbiwgY291bnRlcik7CisJCQkJaWYgKG5ld0dyb3VwTmFtZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2VuZXJhdGUgbmV3IHZmIG1vZHVsZSBncm91cCBuYW1lLiBTdGF0dXMgaXMge30gIiwgbmV3R3JvdXBOYW1lUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChuZXdHcm91cE5hbWVSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWdyb3VwTmFtZSA9IG5ld0dyb3VwTmFtZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQljdXJHcm91cC5zZXROYW1lKGdyb3VwTmFtZSk7CisJCQl9CisJCQl1cGRhdGVkTmFtZXNHcm91cHMucHV0KGdyb3VwTmFtZSwgY3VyR3JvdXApOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIGludCBnZXROZXh0VmZNb2R1bGVOYW1lQ291bnRlcihNYXA8U3RyaW5nLCBHcm91cERlZmluaXRpb24+IGdyb3VwcykgeworCQlpbnQgY291bnRlciA9IDA7CisJCWlmIChncm91cHMgIT0gbnVsbCAmJiAhZ3JvdXBzLmlzRW1wdHkoKSkgeworCQkJY291bnRlciA9IGdldE5leHRWZk1vZHVsZU5hbWVDb3VudGVyKGdyb3Vwcy52YWx1ZXMoKSk7CisJCX0KKwkJcmV0dXJuIGNvdW50ZXI7CisJfQorCisJcHVibGljIGludCBnZXROZXh0VmZNb2R1bGVOYW1lQ291bnRlcihDb2xsZWN0aW9uPEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzKSB7CisJCWludCBjb3VudGVyID0gMDsKKwkJaWYgKGdyb3VwcyAhPSBudWxsICYmICFncm91cHMuaXNFbXB0eSgpKSB7CisJCQlMaXN0PEludGVnZXI+IGNvdW50ZXJzID0gZ3JvdXBzLnN0cmVhbSgpLmZpbHRlcihncm91cCAtPiBQYXR0ZXJuLmNvbXBpbGUoQ29uc3RhbnRzLk1PRFVMRV9ORVdfTkFNRV9QQVRURVJOKS5tYXRjaGVyKGdyb3VwLmdldE5hbWUoKSkubWF0Y2hlcygpIHx8IFBhdHRlcm4uY29tcGlsZShDb25zdGFudHMuTU9EVUxFX09MRF9OQU1FX1BBVFRFUk4pLm1hdGNoZXIoZ3JvdXAuZ2V0TmFtZSgpKS5tYXRjaGVzKCkpCisJCQkJCS5tYXAoZ3JvdXAgLT4gSW50ZWdlci5wYXJzZUludChncm91cC5nZXROYW1lKCkuc3BsaXQoQ29uc3RhbnRzLk1PRFVMRV9OQU1FX0RFTElNSVRFUilbMV0pKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJY291bnRlciA9IChjb3VudGVycyA9PSBudWxsIHx8IGNvdW50ZXJzLmlzRW1wdHkoKSkgPyAwIDogY291bnRlcnMuc3RyZWFtKCkubWF4KChhLCBiKSAtPiBJbnRlZ2VyLmNvbXBhcmUoYSwgYikpLmdldCgpICsgMTsKKwkJfQorCQlyZXR1cm4gY291bnRlcjsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXBkYXRlVmZHcm91cE5hbWVzT25HcmFwaChMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzLCBTdHJpbmcgcmVzb3VyY2VTeXN0ZW1OYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IHVwZGF0ZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZWRHcm91cHMpOworCisJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwIDogZ3JvdXBzKSB7CisJCQlTdHJpbmcgZ3JvdXBUeXBlID0gZ3JvdXAuZ2V0VHlwZSgpOworCQkJU3RyaW5nIG9sZEdyb3VwTmFtZSA9IGdyb3VwLmdldE5hbWUoKTsKKwkJCVN0cmluZyBuZXdHcm91cE5hbWU7CisJCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gbmV3R3JvdXBOYW1lUmVzOworCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBOYW1lUmVzOworCQkJaW50IGNvdW50ZXI7CisJCQlpZiAoZ3JvdXBUeXBlLmVxdWFscyhDb25zdGFudHMuREVGQVVMVF9HUk9VUF9WRl9NT0RVTEUpICYmIFBhdHRlcm4uY29tcGlsZShDb25zdGFudHMuTU9EVUxFX09MRF9OQU1FX1BBVFRFUk4pLm1hdGNoZXIob2xkR3JvdXBOYW1lKS5tYXRjaGVzKCkpIHsKKwkJCQljb3VudGVyID0gSW50ZWdlci5wYXJzZUludChncm91cC5nZXROYW1lKCkuc3BsaXQoQ29uc3RhbnRzLk1PRFVMRV9OQU1FX0RFTElNSVRFUilbMV0pOworCQkJCW5ld0dyb3VwTmFtZVJlcyA9IHZhbGlkYXRlR2VuZXJhdGVWZk1vZHVsZUdyb3VwTmFtZShyZXNvdXJjZVN5c3RlbU5hbWUsIGdyb3VwLmdldERlc2NyaXB0aW9uKCksIGNvdW50ZXIpOworCQkJCWlmIChuZXdHcm91cE5hbWVSZXMuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdlbmVyYXRlIG5ldyB2ZiBtb2R1bGUgZ3JvdXAgbmFtZS4gU3RhdHVzIGlzIHt9ICIsIG5ld0dyb3VwTmFtZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQobmV3R3JvdXBOYW1lUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQluZXdHcm91cE5hbWUgPSBuZXdHcm91cE5hbWVSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJdXBkYXRlR3JvdXBOYW1lUmVzID0gZ3JvdXBPcGVyYXRpb24udXBkYXRlR3JvdXBOYW1lKGdyb3VwLmdldFVuaXF1ZUlkKCksIG5ld0dyb3VwTmFtZSwgaW5UcmFuc2FjdGlvbik7CisJCQkJaWYgKHVwZGF0ZUdyb3VwTmFtZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIHZmIG1vZHVsZSBncm91cCBuYW1lIGZvciBncm91cCB7fSAuIFN0YXR1cyBpcyB7fSAiLCBvbGRHcm91cE5hbWUsIHVwZGF0ZUdyb3VwTmFtZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UodXBkYXRlR3JvdXBOYW1lUmVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQl1cGRhdGVkR3JvdXBzLmFkZChncm91cCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwcyhDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIHVzZXIsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIExpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cERlZmluaXRpb25zLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ2VuZXJhdGVkR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBFaXRoZXIubGVmdChnZW5lcmF0ZWRHcm91cHMpOworCisJCXRyeSB7CisKKwkJCWlmIChncm91cERlZmluaXRpb25zICE9IG51bGwgJiYgZmFsc2UgPT0gZ3JvdXBEZWZpbml0aW9ucy5pc0VtcHR5KCkpIHsKKwkJCQlmb3IgKEdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24gOiBncm91cERlZmluaXRpb25zKSB7CisJCQkJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cCA9IHRoaXMuY3JlYXRlR3JvdXAoY29tcG9uZW50LCB1c2VyLCBjb21wb25lbnRUeXBlLCBncm91cERlZmluaXRpb24sIHRydWUpOworCQkJCQlpZiAoY3JlYXRlR3JvdXAuaXNSaWdodCgpKSB7CisJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY3JlYXRlR3JvdXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQkJR3JvdXBEZWZpbml0aW9uIGdlbmVyYXRlZEdyb3VwID0gY3JlYXRlR3JvdXAubGVmdCgpLnZhbHVlKCk7CisJCQkJCWdlbmVyYXRlZEdyb3Vwcy5hZGQoZ2VuZXJhdGVkR3JvdXApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCisJCQl9CisKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0dyb3VwVHlwZUltcG9ydE1hbmFnZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvR3JvdXBUeXBlSW1wb3J0TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZWUzODMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0dyb3VwVHlwZUltcG9ydE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbW1vbkltcG9ydE1hbmFnZXIuRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5Ub3NjYVRhZ05hbWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JR3JvdXBUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImdyb3VwVHlwZUltcG9ydE1hbmFnZXIiKQorcHVibGljIGNsYXNzIEdyb3VwVHlwZUltcG9ydE1hbmFnZXIgeworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmludGlvbiA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHlEZWZpbnRpb24uc2V0TmFtZSgiYWFhIik7CisJCXByb3BlcnRpZXMuYWRkKHByb3BlcnR5RGVmaW50aW9uKTsKKworCQlMaXN0PFN0cmluZz4gYWxsUGFyZW50c1Byb3BzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWFsbFBhcmVudHNQcm9wcy5hZGQoImFhYSIpOworCQlhbGxQYXJlbnRzUHJvcHMuYWRkKCJiYmIiKTsKKworCQlTZXQ8U3RyaW5nPiBhbHJlYWR5RXhpc3RQcm9wc0NvbGxlY3Rpb24gPSBwcm9wZXJ0aWVzLnN0cmVhbSgpLmZpbHRlcihwIC0+IGFsbFBhcmVudHNQcm9wcy5jb250YWlucyhwLmdldE5hbWUoKSkpLm1hcChwIC0+IHAuZ2V0TmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihhbHJlYWR5RXhpc3RQcm9wc0NvbGxlY3Rpb24pOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdyb3VwVHlwZUltcG9ydE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCUBSZXNvdXJjZQorCXByaXZhdGUgSUdyb3VwVHlwZU9wZXJhdGlvbiBncm91cFR5cGVPcGVyYXRpb247CisJQFJlc291cmNlCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzOworCUBSZXNvdXJjZQorCXByaXZhdGUgSVJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBDb21tb25JbXBvcnRNYW5hZ2VyIGNvbW1vbkltcG9ydE1hbmFnZXI7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxHcm91cFR5cGVEZWZpbml0aW9uLCBCb29sZWFuPj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cFR5cGVzKFN0cmluZyBncm91cFR5cGVzWW1sKSB7CisJCXJldHVybiBjb21tb25JbXBvcnRNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRUeXBlcyhncm91cFR5cGVzWW1sLCBlbGVtZW50VHlwZVltbCAtPiBjcmVhdGVHcm91cFR5cGVzRnJvbVltbChlbGVtZW50VHlwZVltbCksIGdyb3VwVHlwZXNMaXN0IC0+IGNyZWF0ZUdyb3VwVHlwZXNCeURhbyhncm91cFR5cGVzTGlzdCksIEVsZW1lbnRUeXBlRW51bS5Hcm91cFR5cGUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8R3JvdXBUeXBlRGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gY3JlYXRlR3JvdXBUeXBlc0Zyb21ZbWwoU3RyaW5nIGdyb3VwVHlwZXNZbWwpIHsKKworCQlyZXR1cm4gY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXNGcm9tWW1sKGdyb3VwVHlwZXNZbWwsIChncm91cFR5cGVOYW1lLCBncm91cFR5cGVKc29uRGF0YSkgLT4gY3JlYXRlR3JvdXBUeXBlKGdyb3VwVHlwZU5hbWUsIGdyb3VwVHlwZUpzb25EYXRhKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEdyb3VwVHlwZURlZmluaXRpb24sIEJvb2xlYW4+PiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwVHlwZXNCeURhbyhMaXN0PEdyb3VwVHlwZURlZmluaXRpb24+IGdyb3VwVHlwZXNUb0NyZWF0ZSkgeworCQlyZXR1cm4gY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXNCeURhbyhncm91cFR5cGVzVG9DcmVhdGUsIGdyb3VwVHlwZSAtPiB2YWxpZGF0ZUdyb3VwVHlwZShncm91cFR5cGUpLCBncm91cFR5cGUgLT4gbmV3IEltbXV0YWJsZVBhaXI8PihFbGVtZW50VHlwZUVudW0uR3JvdXBUeXBlLCBncm91cFR5cGUuZ2V0VHlwZSgpKSwKKwkJCQlncm91cFR5cGVOYW1lIC0+IGdyb3VwVHlwZU9wZXJhdGlvbi5nZXRMYXRlc3RHcm91cFR5cGVCeVR5cGUoZ3JvdXBUeXBlTmFtZSksIGdyb3VwVHlwZSAtPiBncm91cFR5cGVPcGVyYXRpb24uYWRkR3JvdXBUeXBlKGdyb3VwVHlwZSksIG51bGwpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEFjdGlvblN0YXR1cywgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlR3JvdXBUeXBlKEdyb3VwVHlwZURlZmluaXRpb24gZ3JvdXBUeXBlKSB7CisJCUVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBFaXRoZXIubGVmdChBY3Rpb25TdGF0dXMuT0spOworCQlpZiAoZ3JvdXBUeXBlLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisJCQlpZiAoZ3JvdXBUeXBlLmdldE1lbWJlcnMoKS5pc0VtcHR5KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR1JPVVBfTUVNQkVSX0VNUFRZLCBncm91cFR5cGUuZ2V0VHlwZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKFN0cmluZyBtZW1iZXIgOiBncm91cFR5cGUuZ2V0TWVtYmVycygpKSB7CisJCQkJCS8vIFZlcmlmeSB0aGF0IHN1Y2ggUmVzb3VyY2UgZXhpc3QKKwkJCQkJRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJNZW1iZXJFeGlzdCA9IHJlc291cmNlT3BlcmF0aW9uLmdldExhdGVzdEJ5VG9zY2FSZXNvdXJjZU5hbWUobWVtYmVyLCBmYWxzZSk7CisJCQkJCWlmIChlaXRoZXJNZW1iZXJFeGlzdC5pc1JpZ2h0KCkpIHsKKwkJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gZWl0aGVyTWVtYmVyRXhpc3QucmlnaHQoKS52YWx1ZSgpOworCQkJCQkJbG9nLmRlYnVnKCJFcnJvciB3aGVuIGZldGNoaW5nIHBhcmVudCByZXNvdXJjZSB7fSwgZXJyb3I6IHt9IiwgbWVtYmVyLCBvcGVyYXRpb25TdGF0dXMpOworCQkJCQkJQWN0aW9uU3RhdHVzIGNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKG9wZXJhdGlvblN0YXR1cyk7CisJCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVDb21wb25lbnRNaXNzaW5nRXJyb3IoIkltcG9ydCBHcm91cFR5cGUiLCAicmVzb3VyY2UiLCBtZW1iZXIpOworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSwgbWVtYmVyKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBHcm91cFR5cGVEZWZpbml0aW9uIGNyZWF0ZUdyb3VwVHlwZShTdHJpbmcgZ3JvdXBUeXBlTmFtZSwgTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24pIHsKKworCQlHcm91cFR5cGVEZWZpbml0aW9uIGdyb3VwVHlwZSA9IG5ldyBHcm91cFR5cGVEZWZpbml0aW9uKCk7CisKKwkJaWYgKHRvc2NhSnNvbiAhPSBudWxsKSB7CisJCQkvLyBEZXNjcmlwdGlvbgorCQkJZmluYWwgQ29uc3VtZXI8U3RyaW5nPiBkZXNjcmlwdGlvblNldHRlciA9IGRlc2NyaXB0aW9uIC0+IGdyb3VwVHlwZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCQljb21tb25JbXBvcnRNYW5hZ2VyLnNldEZpZWxkKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSwgZGVzY3JpcHRpb25TZXR0ZXIpOworCQkJLy8gRGVyaXZlZCBGcm9tCisJCQlmaW5hbCBDb25zdW1lcjxTdHJpbmc+IGRlcml2ZWRGcm9tU2V0dGVyID0gZGVyaXZlZEZyb20gLT4gZ3JvdXBUeXBlLnNldERlcml2ZWRGcm9tKGRlcml2ZWRGcm9tKTsKKwkJCWNvbW1vbkltcG9ydE1hbmFnZXIuc2V0RmllbGQodG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bS5ERVJJVkVEX0ZST00uZ2V0RWxlbWVudE5hbWUoKSwgZGVyaXZlZEZyb21TZXR0ZXIpOworCQkJLy8gUHJvcGVydGllcworCQkJY29tbW9uSW1wb3J0TWFuYWdlci5zZXRQcm9wZXJ0aWVzKHRvc2NhSnNvbiwgKHZhbHVlcykgLT4gZ3JvdXBUeXBlLnNldFByb3BlcnRpZXModmFsdWVzKSk7CisJCQkvLyBNZXRhZGF0YQorCQkJZmluYWwgQ29uc3VtZXI8TWFwPFN0cmluZywgU3RyaW5nPj4gbWV0YWRhdGFTZXR0ZXIgPSBtZXRhZGF0YSAtPiBncm91cFR5cGUuc2V0TWV0YWRhdGEobWV0YWRhdGEpOworCQkJY29tbW9uSW1wb3J0TWFuYWdlci5zZXRGaWVsZCh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLk1FVEFEQVRBLmdldEVsZW1lbnROYW1lKCksIG1ldGFkYXRhU2V0dGVyKTsKKwkJCS8vIE1lbWJlcnMKKwkJCWZpbmFsIENvbnN1bWVyPExpc3Q8U3RyaW5nPj4gbWVtYmVyc1NldHRlciA9IG1lbWJlcnMgLT4gZ3JvdXBUeXBlLnNldE1lbWJlcnMobWVtYmVycyk7CisJCQljb21tb25JbXBvcnRNYW5hZ2VyLnNldEZpZWxkKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uTUVNQkVSUy5nZXRFbGVtZW50TmFtZSgpLCBtZW1iZXJzU2V0dGVyKTsKKworCQkJZ3JvdXBUeXBlLnNldFR5cGUoZ3JvdXBUeXBlTmFtZSk7CisKKwkJCWdyb3VwVHlwZS5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKworCQkJZ3JvdXBUeXBlLnNldFZlcnNpb24oSW1wb3J0VXRpbHMuQ29uc3RhbnRzLkZJUlNUX0NFUlRJRklFRF9WRVJTSU9OX1ZFUlNJT04pOworCQl9CisJCXJldHVybiBncm91cFR5cGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0hlYWx0aENoZWNrQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9IZWFsdGhDaGVja0J1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRmYzFhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9IZWFsdGhDaGVja0J1c2luZXNzTG9naWMuamF2YQpAQCAtMCwwICsxLDQ0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuRGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuVWViSGVhbHRoQ2hlY2tDYWxsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyLkVycm9yU2V2ZXJpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5JRXNIZWFsdGhDaGVja0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc3dpdGNob3Zlci5kZXRlY3Rvci5Td2l0Y2hvdmVyRGV0ZWN0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5IZWFsdGhDaGVja0luZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5IZWFsdGhDaGVja0luZm8uSGVhbHRoQ2hlY2tDb21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5IZWFsdGhDaGVja0luZm8uSGVhbHRoQ2hlY2tTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK0BDb21wb25lbnQoImhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljIHsKKworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEJFX0hFQUxUSF9MT0dfQ09OVEVYVCA9ICJiZS5oZWFsdGhjaGVjayI7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgaGVhbHRoTG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQkVfSEVBTFRIX0xPR19DT05URVhUKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRV9IRUFMVEhfQ0hFQ0tfU1RSID0gImJlSGVhbHRoQ2hlY2siOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBJRXNIZWFsdGhDaGVja0RhbyBlc0hlYWx0aENoZWNrRGFvOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoIGRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGg7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBTd2l0Y2hvdmVyRGV0ZWN0b3Igc3dpdGNob3ZlckRldGVjdG9yOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSB2b2xhdGlsZSBMaXN0PEhlYWx0aENoZWNrSW5mbz4gbGFzdEJlSGVhbHRoQ2hlY2tJbmZvcyA9IG51bGw7CisKKwkvLyBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBIZWFsdGhDaGVja0J1c2luZXNzTG9naWMgaW5zdGFuY2U7CisJLy8KKwlwdWJsaWMgSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljKCkgeworCisJfQorCisJcHJpdmF0ZSBTY2hlZHVsZWRGdXR1cmU8Pz4gc2NoZWR1bGVkRnV0dXJlID0gbnVsbDsKKworCVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBoZWFsdGhDaGVja1NjaGVkdWxlciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKwkJCXJldHVybiBuZXcgVGhyZWFkKHIsICJCRS1IZWFsdGgtQ2hlY2stVGFzayIpOworCQl9CisJfSk7CisKKwlIZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sgaGVhbHRoQ2hlY2tTY2hlZHVsZWRUYXNrID0gbnVsbDsKKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKworCQlsYXN0QmVIZWFsdGhDaGVja0luZm9zID0gZ2V0QmVIZWFsdGhDaGVja0luZm9zKCk7CisKKwkJbG9nLmRlYnVnKCJBZnRlciBpbml0aWFsaXppbmcgbGFzdEJlSGVhbHRoQ2hlY2tJbmZvcyA6e30iLCBsYXN0QmVIZWFsdGhDaGVja0luZm9zKTsKKworCQloZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sgPSBuZXcgSGVhbHRoQ2hlY2tTY2hlZHVsZWRUYXNrKCk7CisKKwkJaWYgKHRoaXMuc2NoZWR1bGVkRnV0dXJlID09IG51bGwpIHsKKwkJCXRoaXMuc2NoZWR1bGVkRnV0dXJlID0gdGhpcy5oZWFsdGhDaGVja1NjaGVkdWxlci5zY2hlZHVsZUF0Rml4ZWRSYXRlKGhlYWx0aENoZWNrU2NoZWR1bGVkVGFzaywgMCwgMywgVGltZVVuaXQuU0VDT05EUyk7CisJCX0KKworCX0KKworCS8vCisJLy8gcHVibGljIHN0YXRpYyBIZWFsdGhDaGVja0J1c2luZXNzTG9naWMgZ2V0SW5zdGFuY2UoKXsKKwkvLy8vIGlmIChpbnN0YW5jZSA9PSBudWxsKXsKKwkvLy8vIGluc3RhbmNlID0gaW5pdCgpOworCS8vLy8gfQorCS8vIHJldHVybiBpbnN0YW5jZTsKKwkvLyB9CisKKwkvLyBwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljIGluaXQoKSB7CisJLy8gaWYgKGluc3RhbmNlID09IG51bGwpeworCS8vIGluc3RhbmNlID0gbmV3IEhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYygpOworCS8vIH0KKwkvLyByZXR1cm4gaW5zdGFuY2U7CisJLy8gfQorCisJcHJpdmF0ZSBMaXN0PEhlYWx0aENoZWNrSW5mbz4gZ2V0QmVIZWFsdGhDaGVja0luZm9zKFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisKKwkJTGlzdDxIZWFsdGhDaGVja0luZm8+IGhlYWx0aENoZWNrSW5mb3MgPSBuZXcgQXJyYXlMaXN0PEhlYWx0aENoZWNrSW5mbz4oKTsKKworCQkvLyBCRQorCQlnZXRCZUhlYWx0aENoZWNrKHNlcnZsZXRDb250ZXh0LCBoZWFsdGhDaGVja0luZm9zKTsKKworCQkvLyBFUworCQlnZXRFc0hlYWx0aENoZWNrKHNlcnZsZXRDb250ZXh0LCBoZWFsdGhDaGVja0luZm9zKTsKKworCQkvLyBUaXRhbgorCQlnZXRUaXRhbkhlYWx0aENoZWNrKHNlcnZsZXRDb250ZXh0LCBoZWFsdGhDaGVja0luZm9zKTsKKworCQkvLyBEaXN0cmlidXRpb24gRW5naW5lCisJCWdldERpc3RyaWJ1dGlvbkVuZ2luZUNoZWNrKHNlcnZsZXRDb250ZXh0LCBoZWFsdGhDaGVja0luZm9zKTsKKworCQlyZXR1cm4gaGVhbHRoQ2hlY2tJbmZvczsKKwl9CisKKwlwcml2YXRlIExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBnZXRCZUhlYWx0aENoZWNrKFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LCBMaXN0PEhlYWx0aENoZWNrSW5mbz4gaGVhbHRoQ2hlY2tJbmZvcykgeworCQlTdHJpbmcgYXBwVmVyc2lvbiA9IEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRBcHBWZXJzaW9uKCk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJPSyI7CisJCWhlYWx0aENoZWNrSW5mb3MuYWRkKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuQkUsIEhlYWx0aENoZWNrU3RhdHVzLlVQLCBhcHBWZXJzaW9uLCBkZXNjcmlwdGlvbikpOworCQlyZXR1cm4gaGVhbHRoQ2hlY2tJbmZvczsKKwl9CisKKwlwdWJsaWMgTGlzdDxIZWFsdGhDaGVja0luZm8+IGdldFRpdGFuSGVhbHRoQ2hlY2soU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBoZWFsdGhDaGVja0luZm9zKSB7CisJCS8vIFRpdGFuIGhlYWx0aCBjaGVjayBhbmQgdmVyc2lvbgorCQlUaXRhbkdlbmVyaWNEYW8gdGl0YW5TdGF0dXNEYW8gPSAoVGl0YW5HZW5lcmljRGFvKSBnZXREYW8oc2VydmxldENvbnRleHQsIFRpdGFuR2VuZXJpY0Rhby5jbGFzcyk7CisJCVN0cmluZyBkZXNjcmlwdGlvbjsKKwkJYm9vbGVhbiBpc1RpdGFuVXA7CisKKwkJdHJ5IHsKKwkJCWlzVGl0YW5VcCA9IHRpdGFuU3RhdHVzRGFvLmlzR3JhcGhPcGVuKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlkZXNjcmlwdGlvbiA9ICJUaXRhbiBlcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpOworCQkJaGVhbHRoQ2hlY2tJbmZvcy5hZGQobmV3IEhlYWx0aENoZWNrSW5mbyhIZWFsdGhDaGVja0NvbXBvbmVudC5USVRBTiwgSGVhbHRoQ2hlY2tTdGF0dXMuRE9XTiwgbnVsbCwgZGVzY3JpcHRpb24pKTsKKwkJCXJldHVybiBoZWFsdGhDaGVja0luZm9zOworCQl9CisJCWlmIChpc1RpdGFuVXApIHsKKwkJCWRlc2NyaXB0aW9uID0gIk9LIjsKKwkJCWhlYWx0aENoZWNrSW5mb3MuYWRkKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuVElUQU4sIEhlYWx0aENoZWNrU3RhdHVzLlVQLCBudWxsLCBkZXNjcmlwdGlvbikpOworCQl9IGVsc2UgeworCQkJZGVzY3JpcHRpb24gPSAiVGl0YW4gZ3JhcGggaXMgZG93biI7CisJCQloZWFsdGhDaGVja0luZm9zLmFkZChuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LlRJVEFOLCBIZWFsdGhDaGVja1N0YXR1cy5ET1dOLCBudWxsLCBkZXNjcmlwdGlvbikpOworCQl9CisJCXJldHVybiBoZWFsdGhDaGVja0luZm9zOworCX0KKworCXB1YmxpYyBMaXN0PEhlYWx0aENoZWNrSW5mbz4gZ2V0RXNIZWFsdGhDaGVjayhTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgTGlzdDxIZWFsdGhDaGVja0luZm8+IGhlYWx0aENoZWNrSW5mb3MpIHsKKworCQkvLyBFUyBoZWFsdGggY2hlY2sgYW5kIHZlcnNpb24KKwkJSUVzSGVhbHRoQ2hlY2tEYW8gZXNTdGF0dXNEYW8gPSAoSUVzSGVhbHRoQ2hlY2tEYW8pIGdldERhbyhzZXJ2bGV0Q29udGV4dCwgSUVzSGVhbHRoQ2hlY2tEYW8uY2xhc3MpOworCQlIZWFsdGhDaGVja1N0YXR1cyBoZWFsdGhDaGVja1N0YXR1czsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uOworCisJCXRyeSB7CisJCQloZWFsdGhDaGVja1N0YXR1cyA9IGVzU3RhdHVzRGFvLmdldENsdXN0ZXJIZWFsdGhTdGF0dXMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWhlYWx0aENoZWNrU3RhdHVzID0gSGVhbHRoQ2hlY2tTdGF0dXMuRE9XTjsKKwkJCWRlc2NyaXB0aW9uID0gIkVTIGNsdXN0ZXIgZXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKTsKKwkJCWhlYWx0aENoZWNrSW5mb3MuYWRkKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuRVMsIGhlYWx0aENoZWNrU3RhdHVzLCBudWxsLCBkZXNjcmlwdGlvbikpOworCQkJcmV0dXJuIGhlYWx0aENoZWNrSW5mb3M7CisJCX0KKwkJaWYgKGhlYWx0aENoZWNrU3RhdHVzLmVxdWFscyhIZWFsdGhDaGVja1N0YXR1cy5ET1dOKSkgeworCQkJZGVzY3JpcHRpb24gPSAiRVMgY2x1c3RlciBpcyBkb3duIjsKKwkJfSBlbHNlIHsKKwkJCWRlc2NyaXB0aW9uID0gIk9LIjsKKwkJfQorCQloZWFsdGhDaGVja0luZm9zLmFkZChuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkVTLCBoZWFsdGhDaGVja1N0YXR1cywgbnVsbCwgZGVzY3JpcHRpb24pKTsKKwkJcmV0dXJuIGhlYWx0aENoZWNrSW5mb3M7CisJfQorCisJcHVibGljIE9iamVjdCBnZXREYW8oU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIENsYXNzPD8+IGNsYXp6KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKKworCQlyZXR1cm4gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oY2xhenopOworCX0KKworCXByaXZhdGUgdm9pZCBnZXREaXN0cmlidXRpb25FbmdpbmVDaGVjayhTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgTGlzdDxIZWFsdGhDaGVja0luZm8+IGhlYWx0aENoZWNrSW5mb3MpIHsKKworCQlEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoIGRlRGFvID0gKERpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGgpIGdldERhbyhzZXJ2bGV0Q29udGV4dCwgRGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aC5jbGFzcyk7CisJCUhlYWx0aENoZWNrSW5mbyBoZWFsdGhDaGVja0luZm8gPSBkZURhby5nZXRIZWFsdGhDaGVja0luZm8oKTsKKworCQloZWFsdGhDaGVja0luZm9zLmFkZChoZWFsdGhDaGVja0luZm8pOworCisJfQorCisJcHVibGljIGJvb2xlYW4gaXNEaXN0cmlidXRpb25FbmdpbmVVcChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCkgeworCisJCURpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGggZGVEYW8gPSAoRGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aCkgZ2V0RGFvKHNlcnZsZXRDb250ZXh0LCBEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoLmNsYXNzKTsKKwkJSGVhbHRoQ2hlY2tJbmZvIGhlYWx0aENoZWNrSW5mbyA9IGRlRGFvLmdldEhlYWx0aENoZWNrSW5mbygpOworCQlpZiAoaGVhbHRoQ2hlY2tJbmZvLmdldEhlYWx0aENoZWNrU3RhdHVzKCkuZXF1YWxzKEhlYWx0aENoZWNrU3RhdHVzLkRPV04pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBnZXRCZUhlYWx0aENoZWNrSW5mb3NTdGF0dXMoKSB7CisKKwkJcmV0dXJuIGxhc3RCZUhlYWx0aENoZWNrSW5mb3M7CisKKwl9CisKKwlwcml2YXRlIExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBnZXRCZUhlYWx0aENoZWNrSW5mb3MoKSB7CisKKwkJbG9nLnRyYWNlKCJJbiBnZXRCZUhlYWx0aENoZWNrSW5mb3MiKTsKKworCQlMaXN0PEhlYWx0aENoZWNrSW5mbz4gaGVhbHRoQ2hlY2tJbmZvcyA9IG5ldyBBcnJheUxpc3Q8SGVhbHRoQ2hlY2tJbmZvPigpOworCisJCS8vIEJFCisJCWdldEJlSGVhbHRoQ2hlY2soaGVhbHRoQ2hlY2tJbmZvcyk7CisKKwkJLy8gRVMKKwkJZ2V0RXNIZWFsdGhDaGVjayhoZWFsdGhDaGVja0luZm9zKTsKKworCQkvLyBUaXRhbgorCQlnZXRUaXRhbkhlYWx0aENoZWNrKGhlYWx0aENoZWNrSW5mb3MpOworCisJCS8vIERpc3RyaWJ1dGlvbiBFbmdpbmUKKwkJZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ2hlY2soaGVhbHRoQ2hlY2tJbmZvcyk7CisKKwkJcmV0dXJuIGhlYWx0aENoZWNrSW5mb3M7CisJfQorCisJcHJpdmF0ZSBMaXN0PEhlYWx0aENoZWNrSW5mbz4gZ2V0QmVIZWFsdGhDaGVjayhMaXN0PEhlYWx0aENoZWNrSW5mbz4gaGVhbHRoQ2hlY2tJbmZvcykgeworCQlTdHJpbmcgYXBwVmVyc2lvbiA9IEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRBcHBWZXJzaW9uKCk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJPSyI7CisJCWhlYWx0aENoZWNrSW5mb3MuYWRkKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuQkUsIEhlYWx0aENoZWNrU3RhdHVzLlVQLCBhcHBWZXJzaW9uLCBkZXNjcmlwdGlvbikpOworCQlyZXR1cm4gaGVhbHRoQ2hlY2tJbmZvczsKKwl9CisKKwlwdWJsaWMgTGlzdDxIZWFsdGhDaGVja0luZm8+IGdldEVzSGVhbHRoQ2hlY2soTGlzdDxIZWFsdGhDaGVja0luZm8+IGhlYWx0aENoZWNrSW5mb3MpIHsKKworCQkvLyBFUyBoZWFsdGggY2hlY2sgYW5kIHZlcnNpb24KKwkJSGVhbHRoQ2hlY2tTdGF0dXMgaGVhbHRoQ2hlY2tTdGF0dXM7CisJCVN0cmluZyBkZXNjcmlwdGlvbjsKKworCQl0cnkgeworCQkJaGVhbHRoQ2hlY2tTdGF0dXMgPSBlc0hlYWx0aENoZWNrRGFvLmdldENsdXN0ZXJIZWFsdGhTdGF0dXMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWhlYWx0aENoZWNrU3RhdHVzID0gSGVhbHRoQ2hlY2tTdGF0dXMuRE9XTjsKKwkJCWRlc2NyaXB0aW9uID0gIkVTIGNsdXN0ZXIgZXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKTsKKwkJCWhlYWx0aENoZWNrSW5mb3MuYWRkKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuRVMsIGhlYWx0aENoZWNrU3RhdHVzLCBudWxsLCBkZXNjcmlwdGlvbikpOworCQkJcmV0dXJuIGhlYWx0aENoZWNrSW5mb3M7CisJCX0KKwkJaWYgKGhlYWx0aENoZWNrU3RhdHVzLmVxdWFscyhIZWFsdGhDaGVja1N0YXR1cy5ET1dOKSkgeworCQkJZGVzY3JpcHRpb24gPSAiRVMgY2x1c3RlciBpcyBkb3duIjsKKwkJfSBlbHNlIHsKKwkJCWRlc2NyaXB0aW9uID0gIk9LIjsKKwkJfQorCQloZWFsdGhDaGVja0luZm9zLmFkZChuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkVTLCBoZWFsdGhDaGVja1N0YXR1cywgbnVsbCwgZGVzY3JpcHRpb24pKTsKKwkJcmV0dXJuIGhlYWx0aENoZWNrSW5mb3M7CisJfQorCisJcHVibGljIExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBnZXRUaXRhbkhlYWx0aENoZWNrKExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBoZWFsdGhDaGVja0luZm9zKSB7CisJCS8vIFRpdGFuIGhlYWx0aCBjaGVjayBhbmQgdmVyc2lvbgorCQlTdHJpbmcgZGVzY3JpcHRpb247CisJCWJvb2xlYW4gaXNUaXRhblVwOworCisJCXRyeSB7CisJCQlpc1RpdGFuVXAgPSB0aXRhbkdlbmVyaWNEYW8uaXNHcmFwaE9wZW4oKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWRlc2NyaXB0aW9uID0gIlRpdGFuIGVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCk7CisJCQloZWFsdGhDaGVja0luZm9zLmFkZChuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LlRJVEFOLCBIZWFsdGhDaGVja1N0YXR1cy5ET1dOLCBudWxsLCBkZXNjcmlwdGlvbikpOworCQkJcmV0dXJuIGhlYWx0aENoZWNrSW5mb3M7CisJCX0KKwkJaWYgKGlzVGl0YW5VcCkgeworCQkJZGVzY3JpcHRpb24gPSAiT0siOworCQkJaGVhbHRoQ2hlY2tJbmZvcy5hZGQobmV3IEhlYWx0aENoZWNrSW5mbyhIZWFsdGhDaGVja0NvbXBvbmVudC5USVRBTiwgSGVhbHRoQ2hlY2tTdGF0dXMuVVAsIG51bGwsIGRlc2NyaXB0aW9uKSk7CisJCX0gZWxzZSB7CisJCQlkZXNjcmlwdGlvbiA9ICJUaXRhbiBncmFwaCBpcyBkb3duIjsKKwkJCWhlYWx0aENoZWNrSW5mb3MuYWRkKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuVElUQU4sIEhlYWx0aENoZWNrU3RhdHVzLkRPV04sIG51bGwsIGRlc2NyaXB0aW9uKSk7CisJCX0KKwkJcmV0dXJuIGhlYWx0aENoZWNrSW5mb3M7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdldERpc3RyaWJ1dGlvbkVuZ2luZUNoZWNrKExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBoZWFsdGhDaGVja0luZm9zKSB7CisKKwkJSGVhbHRoQ2hlY2tJbmZvIGhlYWx0aENoZWNrSW5mbyA9IGRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGguZ2V0SGVhbHRoQ2hlY2tJbmZvKCk7CisKKwkJaGVhbHRoQ2hlY2tJbmZvcy5hZGQoaGVhbHRoQ2hlY2tJbmZvKTsKKworCX0KKworCUBQcmVEZXN0cm95CisJcHJpdmF0ZSB2b2lkIGRlc3Ryb3koKSB7CisKKwkJaWYgKHNjaGVkdWxlZEZ1dHVyZSAhPSBudWxsKSB7CisJCQlzY2hlZHVsZWRGdXR1cmUuY2FuY2VsKHRydWUpOworCQkJc2NoZWR1bGVkRnV0dXJlID0gbnVsbDsKKwkJfQorCisJCWlmIChoZWFsdGhDaGVja1NjaGVkdWxlciAhPSBudWxsKSB7CisJCQloZWFsdGhDaGVja1NjaGVkdWxlci5zaHV0ZG93bigpOworCQl9CisKKwl9CisKKwlwdWJsaWMgY2xhc3MgSGVhbHRoQ2hlY2tTY2hlZHVsZWRUYXNrIGltcGxlbWVudHMgUnVubmFibGUgeworCisJCUxpc3Q8VWViSGVhbHRoQ2hlY2tDYWxsPiBoZWFsdGhDaGVja0NhbGxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJcHVibGljIEhlYWx0aENoZWNrU2NoZWR1bGVkVGFzaygpIHsKKworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQkJaGVhbHRoTG9nZ2VyLnRyYWNlKCJFeGVjdXRpbmcgQkUgSGVhbHRoIENoZWNrIFRhc2siKTsKKworCQkJTGlzdDxIZWFsdGhDaGVja0luZm8+IGJlSGVhbHRoQ2hlY2tJbmZvcyA9IGdldEJlSGVhbHRoQ2hlY2tJbmZvcygpOworCQkJYm9vbGVhbiBoZWFsdGhTdGF0dXMgPSBnZXRBZ2dyZWdhdGVCZVN0YXR1cyhiZUhlYWx0aENoZWNrSW5mb3MpOworCisJCQlib29sZWFuIGxhc3RIZWFsdGhTdGF0dXMgPSBnZXRBZ2dyZWdhdGVCZVN0YXR1cyhsYXN0QmVIZWFsdGhDaGVja0luZm9zKTsKKworCQkJaWYgKGxhc3RIZWFsdGhTdGF0dXMgIT0gaGVhbHRoU3RhdHVzKSB7CisJCQkJbG9nLnRyYWNlKCJCRSBIZWFsdGggU3RhdGUgQ2hhbmdlZCB0byB7fS4gSXNzdWluZyBhbGFybSAvIHJlY292ZXJ5IGFsYXJtLi4uIiwgaGVhbHRoU3RhdHVzKTsKKworCQkJCWxhc3RCZUhlYWx0aENoZWNrSW5mb3MgPSBiZUhlYWx0aENoZWNrSW5mb3M7CisJCQkJbG9nQWxhcm0oaGVhbHRoU3RhdHVzKTsKKworCQkJfSBlbHNlIHsKKwkJCQkvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RhdHVzJ3MgbGlzdCBpbiBjYXNlIG9uZSBvZgorCQkJCS8vIHRoZSBzdGF0dXNlcyB3YXMgY2hhbmdlZAorCQkJCWlmICh0cnVlID09IGFueVN0YXR1c0NoYW5nZWQoYmVIZWFsdGhDaGVja0luZm9zLCBsYXN0QmVIZWFsdGhDaGVja0luZm9zKSkgeworCQkJCQlsYXN0QmVIZWFsdGhDaGVja0luZm9zID0gYmVIZWFsdGhDaGVja0luZm9zOworCQkJCX0KKworCQkJfQorCisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBsb2dBbGFybShib29sZWFuIGxhc3RIZWFsdGhTdGF0ZSkgeworCQlpZiAobGFzdEhlYWx0aFN0YXRlID09IHRydWUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUhlYWx0aENoZWNrUmVjb3ZlcnkoQkVfSEVBTFRIX0NIRUNLX1NUUik7CisJCX0gZWxzZSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVIZWFsdGhDaGVja0Vycm9yKEJFX0hFQUxUSF9DSEVDS19TVFIpOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGdldEFnZ3JlZ2F0ZUJlU3RhdHVzKExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBiZUhlYWx0aENoZWNrSW5mb3MpIHsKKworCQlib29sZWFuIHN0YXR1cyA9IHRydWU7CisKKwkJZm9yIChIZWFsdGhDaGVja0luZm8gaGVhbHRoQ2hlY2tJbmZvIDogYmVIZWFsdGhDaGVja0luZm9zKSB7CisJCQlpZiAoaGVhbHRoQ2hlY2tJbmZvLmdldEhlYWx0aENoZWNrU3RhdHVzKCkuZXF1YWxzKEhlYWx0aENoZWNrU3RhdHVzLkRPV04pICYmIGhlYWx0aENoZWNrSW5mby5nZXRIZWFsdGhDaGVja0NvbXBvbmVudCgpICE9IEhlYWx0aENoZWNrQ29tcG9uZW50LkRFKSB7CisJCQkJc3RhdHVzID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNpdGVNb2RlKCkgeworCQlyZXR1cm4gc3dpdGNob3ZlckRldGVjdG9yLmdldFNpdGVNb2RlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gYW55U3RhdHVzQ2hhbmdlZChMaXN0PEhlYWx0aENoZWNrSW5mbz4gYmVIZWFsdGhDaGVja0luZm9zLCBMaXN0PEhlYWx0aENoZWNrSW5mbz4gbGFzdEJlSGVhbHRoQ2hlY2tJbmZvcykgeworCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisKKwkJaWYgKGJlSGVhbHRoQ2hlY2tJbmZvcyAhPSBudWxsICYmIGxhc3RCZUhlYWx0aENoZWNrSW5mb3MgIT0gbnVsbCkgeworCisJCQlNYXA8SGVhbHRoQ2hlY2tDb21wb25lbnQsIEhlYWx0aENoZWNrU3RhdHVzPiBjdXJyZW50VmFsdWVzID0gYmVIZWFsdGhDaGVja0luZm9zLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0SGVhbHRoQ2hlY2tDb21wb25lbnQoKSwgcCAtPiBwLmdldEhlYWx0aENoZWNrU3RhdHVzKCkpKTsKKwkJCU1hcDxIZWFsdGhDaGVja0NvbXBvbmVudCwgSGVhbHRoQ2hlY2tTdGF0dXM+IGxhc3RWYWx1ZXMgPSBsYXN0QmVIZWFsdGhDaGVja0luZm9zLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0SGVhbHRoQ2hlY2tDb21wb25lbnQoKSwgcCAtPiBwLmdldEhlYWx0aENoZWNrU3RhdHVzKCkpKTsKKworCQkJaWYgKGN1cnJlbnRWYWx1ZXMgIT0gbnVsbCAmJiBsYXN0VmFsdWVzICE9IG51bGwpIHsKKwkJCQlpbnQgY3VycmVudFNpemUgPSBjdXJyZW50VmFsdWVzLnNpemUoKTsKKwkJCQlpbnQgbGFzdFNpemUgPSBsYXN0VmFsdWVzLnNpemUoKTsKKworCQkJCWlmIChjdXJyZW50U2l6ZSAhPSBsYXN0U2l6ZSkgeworCQkJCQlyZXN1bHQgPSB0cnVlOworCQkJCX0gZWxzZSB7CisKKwkJCQkJZm9yIChFbnRyeTxIZWFsdGhDaGVja0NvbXBvbmVudCwgSGVhbHRoQ2hlY2tTdGF0dXM+IGVudHJ5IDogY3VycmVudFZhbHVlcy5lbnRyeVNldCgpKSB7CisJCQkJCQlIZWFsdGhDaGVja0NvbXBvbmVudCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQkJCUhlYWx0aENoZWNrU3RhdHVzIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJCQkJaWYgKGZhbHNlID09IGxhc3RWYWx1ZXMuY29udGFpbnNLZXkoa2V5KSkgeworCQkJCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCUhlYWx0aENoZWNrU3RhdHVzIGxhc3RIZWFsdGhDaGVja1N0YXR1cyA9IGxhc3RWYWx1ZXMuZ2V0KGtleSk7CisKKwkJCQkJCWlmICh2YWx1ZSAhPSBsYXN0SGVhbHRoQ2hlY2tTdGF0dXMpIHsKKwkJCQkJCQlyZXN1bHQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChjdXJyZW50VmFsdWVzID09IG51bGwgJiYgbGFzdFZhbHVlcyA9PSBudWxsKSB7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQl9CisKKwkJfSBlbHNlIGlmIChiZUhlYWx0aENoZWNrSW5mb3MgPT0gbnVsbCAmJiBsYXN0QmVIZWFsdGhDaGVja0luZm9zID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9JRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZ0dldHRlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9JRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZ0dldHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTY5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0lEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnR2V0dGVyLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLkRlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc7CisKK3B1YmxpYyBpbnRlcmZhY2UgSURlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWdHZXR0ZXIgeworCURlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWcgZ2V0RGVwbG95bWVudEFydGlmYWN0Q29uZmlnKCk7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0ltcG9ydFV0aWxzLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0ltcG9ydFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNzM0MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW1wb3J0VXRpbHMuamF2YQpAQCAtMCwwICsxLDcyMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdFc2NhcGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudGV4dC50cmFuc2xhdGUuQ2hhclNlcXVlbmNlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BdHRyaWJ1dGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklucHV0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5oZWF0LkhlYXRQYXJhbWV0ZXJUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbi5Qcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdzb25GYWN0b3J5OworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5EdW1wZXJPcHRpb25zOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5jb25zdHJ1Y3Rvci5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwucmVwcmVzZW50ZXIuUmVwcmVzZW50ZXI7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLnJlc29sdmVyLlJlc29sdmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0VXRpbHMgeworCXByaXZhdGUgSW1wb3J0VXRpbHMoKSB7CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBDdXN0b21SZXNvbHZlciBjdXN0b21SZXNvbHZlciA9IG5ldyBDdXN0b21SZXNvbHZlcigpOworCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tUmVzb2x2ZXIgZXh0ZW5kcyBSZXNvbHZlciB7CisJCXByb3RlY3RlZCB2b2lkIGFkZEltcGxpY2l0UmVzb2x2ZXJzKCkgeworCQkJLy8gYXZvaWQgaW1wbGljaXQgcmVzb2x2ZXJzCisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gZ2V0SGVhdFBhcmFtc1dpdGhvdXRJbXBsaWNpdFR5cGVzKFN0cmluZyBoZWF0RGVjb2RlZFBheWxvYWQsIFN0cmluZyBhcnRpZmFjdFR5cGUpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBoZWF0RGF0YSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBuZXcgWWFtbChuZXcgQ29uc3RydWN0b3IoKSwgbmV3IFJlcHJlc2VudGVyKCksIG5ldyBEdW1wZXJPcHRpb25zKCksIGN1c3RvbVJlc29sdmVyKS5sb2FkKGhlYXREZWNvZGVkUGF5bG9hZCk7CisJCXJldHVybiBnZXRIZWF0UGFyYW1ldGVycyhoZWF0RGF0YSwgYXJ0aWZhY3RUeXBlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIENvbnN0YW50cyB7CisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfQ0VSVElGSUVEX1ZFUlNJT05fVkVSU0lPTiA9ICIxLjAiOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9OT05fQ0VSVElGSUVEX1ZFUlNJT04gPSAiMC4xIjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX05BTUUgPSAiQVRUIChUb3NjYSkiOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfUkVMRUFTRSA9ICIxLjAuMC53ZDAzIjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBMaWZlY3ljbGVTdGF0ZUVudW0gTk9STUFUSVZFX1RZUEVfTElGRV9DWUNMRSA9IExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQ7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBOT1JNQVRJVkVfVFlQRV9ISUdIRVNUX1ZFUlNJT04gPSB0cnVlOworCQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQlNUUkFDVF9DQVRFR09SWSA9ICJHZW5lcmljL0Fic3RyYWN0IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1RfQ0FURUdPUllfTkFNRSA9ICJHZW5lcmljIjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1RfU1VCQ0FURUdPUlkgPSAiQWJzdHJhY3QiOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lDT04gPSAiZGVmYXVsdGljb24iOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUl9WRkNfREVTQ1JJUFRJT04gPSAiTm90IHJldXNhYmxlIGlubmVyIFZGQyI7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfREVGSU5FRF9SRVNPVVJDRV9OQU1FU1BBQ0VfUFJFRklYID0gIm9yZy5vcGVuZWNvbXAucmVzb3VyY2UuIjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gVE9TQ0FfREVGSU5JVElPTl9WRVJTSU9OUyA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInRvc2NhX3NpbXBsZV95YW1sXzFfMF8wIiwgInRvc2NhX3NpbXBsZV9wcm9maWxlX2Zvcl9uZnZfMV8wXzAiLCAidG9zY2Ffc2ltcGxlX3lhbWxfMV8wIiB9KTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gVE9TQ0FfWU1MX0NTQVJfVkFMSURfU1VGRklYID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiLnltbCIsICIueWFtbCIsICIuY3NhciIgfSk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0pTT05fUEFZTE9BRF9OQU1FID0gInBheWxvYWROYW1lIjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1RfTk9ERSA9ICJhYnN0YWN0IjsKKwl9CisKKwlwdWJsaWMgZW51bSBSZXN1bHRTdGF0dXNFbnVtIHsKKwkJRUxFTUVOVF9OT1RfRk9VTkQsIEdFTkVSQUxfRVJST1IsIE9LLCBJTlZBTElEX1BST1BFUlRZX0RFRkFVTFRfVkFMVUUsIElOVkFMSURfUFJPUEVSVFlfVFlQRSwgSU5WQUxJRF9QUk9QRVJUWV9WQUxVRSwgTUlTU0lOR19FTlRSWV9TQ0hFTUFfVFlQRQorCX0KKworCXB1YmxpYyBlbnVtIFRvc2NhRWxlbWVudFR5cGVFbnVtIHsKKwkJQk9PTEVBTiwgU1RSSU5HLCBNQVAsIExJU1QsIEFMTAorCX0KKworCXB1YmxpYyBlbnVtIFRvc2NhVGFnTmFtZXNFbnVtIHsKKwkJREVSSVZFRF9GUk9NKCJkZXJpdmVkX2Zyb20iKSwgSVNfUEFTU1dPUkQoImlzX3Bhc3N3b3JkIiksCisJCS8vIFByb3BlcnRpZXMKKwkJUFJPUEVSVElFUygicHJvcGVydGllcyIpLCBUWVBFKCJ0eXBlIiksIFNUQVRVUygic3RhdHVzIiksIEVOVFJZX1NDSEVNQSgiZW50cnlfc2NoZW1hIiksIFJFUVVJUkVEKCJyZXF1aXJlZCIpLCBERVNDUklQVElPTigiZGVzY3JpcHRpb24iKSwgREVGQVVMVF9WQUxVRSgiZGVmYXVsdCIpLCBWQUxVRSgidmFsdWUiKSwgQ09OU1RSQUlOVFMoImNvbnN0cmFpbnRzIiksCisJCS8vIEdyb3VwIFR5cGVzCisJCU1FTUJFUlMoIm1lbWJlcnMiKSwgTUVUQURBVEEoIm1ldGFkYXRhIiksCisJCS8vIFBvbGljeSBUeXBlcworCQlUQVJHRVRTKCJ0YXJnZXRzIiksCisJCS8vIENhcGFiaWxpdGllcworCQlDQVBBQklMSVRJRVMoImNhcGFiaWxpdGllcyIpLCBWQUxJRF9TT1VSQ0VfVFlQRVMoInZhbGlkX3NvdXJjZV90eXBlcyIpLAorCQkvLyBSZXF1aXJlbWVudHMKKwkJUkVRVUlSRU1FTlRTKCJyZXF1aXJlbWVudHMiKSwgTk9ERSgibm9kZSIpLCBSRUxBVElPTlNISVAoInJlbGF0aW9uc2hpcCIpLCBDQVBBQklMSVRZKCJjYXBhYmlsaXR5IiksIElOVEVSRkFDRVMoImludGVyZmFjZXMiKSwKKwkJLy8gSGVhdCBlbnYgVmFsaWRhdGlvbgorCQlQQVJBTUVURVJTKCJwYXJhbWV0ZXJzIiksCisJCS8vIEltcG9ydCBWYWxpZGF0aW9ucworCQlUT1NDQV9WRVJTSU9OKCJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uIiksIFRPUE9MT0dZX1RFTVBMQVRFKCJ0b3BvbG9neV90ZW1wbGF0ZSIpLCBOT0RFX1RZUEVTKCJub2RlX3R5cGVzIiksIE9DQ1VSUkVOQ0VTKCJvY2N1cnJlbmNlcyIpLCBOT0RFX1RFTVBMQVRFUygibm9kZV90ZW1wbGF0ZXMiKSwgR1JPVVBTKCJncm91cHMiKSwgSU5QVVRTKCJpbnB1dHMiKSwKKwkJLy8gQXR0cmlidXRlcworCQlBVFRSSUJVVEVTKCJhdHRyaWJ1dGVzIiksIExBQkVMKCJsYWJlbCIpLCBISURERU4oImhpZGRlbiIpLCBJTU1VVEFCTEUoImltbXV0YWJsZSIpLCBHRVRfSU5QVVQoImdldF9pbnB1dCIpOworCisJCXByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lOworCisJCXByaXZhdGUgVG9zY2FUYWdOYW1lc0VudW0oU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworCQkJcmV0dXJuIGVsZW1lbnROYW1lOworCQl9CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVFbGVtZW50TmFtZU5vdEZvdW5kKFN0cmluZyBlbGVtZW50TmFtZSwgT2JqZWN0IGVsZW1lbnRWYWx1ZSwgVG9zY2FFbGVtZW50VHlwZUVudW0gZWxlbWVudFR5cGUsIExpc3Q8T2JqZWN0PiByZXR1cm5lZExpc3QpIHsKKwkJaWYgKGVsZW1lbnRWYWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworCQkJSW1wb3J0VXRpbHMuZmluZFRvc2NhRWxlbWVudHMoKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVsZW1lbnRWYWx1ZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlLCByZXR1cm5lZExpc3QpOworCQl9IGVsc2UgaWYgKGVsZW1lbnRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCUltcG9ydFV0aWxzLmZpbmRBbGxUb3NjYUVsZW1lbnRzSW5MaXN0KChMaXN0PE9iamVjdD4pIGVsZW1lbnRWYWx1ZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlLCByZXR1cm5lZExpc3QpOworCQl9CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVFbGVtZW50TmFtZUZvdW5kKFN0cmluZyBlbGVtZW50TmFtZSwgVG9zY2FFbGVtZW50VHlwZUVudW0gZWxlbWVudFR5cGUsIExpc3Q8T2JqZWN0PiByZXR1cm5lZExpc3QsIE9iamVjdCBlbGVtZW50VmFsdWUpIHsKKworCQlpZiAoZWxlbWVudFZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgeworCQkJaWYgKGVsZW1lbnRUeXBlID09IFRvc2NhRWxlbWVudFR5cGVFbnVtLkJPT0xFQU4gfHwgZWxlbWVudFR5cGUgPT0gVG9zY2FFbGVtZW50VHlwZUVudW0uQUxMKSB7CisJCQkJcmV0dXJuZWRMaXN0LmFkZChlbGVtZW50VmFsdWUpOworCQkJfQorCQl9CisKKwkJZWxzZSBpZiAoZWxlbWVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlpZiAoZWxlbWVudFR5cGUgPT0gVG9zY2FFbGVtZW50VHlwZUVudW0uU1RSSU5HIHx8IGVsZW1lbnRUeXBlID09IFRvc2NhRWxlbWVudFR5cGVFbnVtLkFMTCkgeworCQkJCXJldHVybmVkTGlzdC5hZGQoZWxlbWVudFZhbHVlKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChlbGVtZW50VmFsdWUgaW5zdGFuY2VvZiBNYXApIHsKKwkJCWlmIChlbGVtZW50VHlwZSA9PSBUb3NjYUVsZW1lbnRUeXBlRW51bS5NQVAgfHwgZWxlbWVudFR5cGUgPT0gVG9zY2FFbGVtZW50VHlwZUVudW0uQUxMKSB7CisJCQkJcmV0dXJuZWRMaXN0LmFkZChlbGVtZW50VmFsdWUpOworCQkJfQorCQkJSW1wb3J0VXRpbHMuZmluZFRvc2NhRWxlbWVudHMoKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVsZW1lbnRWYWx1ZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlLCByZXR1cm5lZExpc3QpOworCisJCX0gZWxzZSBpZiAoZWxlbWVudFZhbHVlIGluc3RhbmNlb2YgTGlzdCkgeworCQkJaWYgKGVsZW1lbnRUeXBlID09IFRvc2NhRWxlbWVudFR5cGVFbnVtLkxJU1QgfHwgZWxlbWVudFR5cGUgPT0gVG9zY2FFbGVtZW50VHlwZUVudW0uQUxMKSB7CisJCQkJcmV0dXJuZWRMaXN0LmFkZChlbGVtZW50VmFsdWUpOworCQkJfQorCQkJSW1wb3J0VXRpbHMuZmluZEFsbFRvc2NhRWxlbWVudHNJbkxpc3QoKExpc3Q8T2JqZWN0PikgZWxlbWVudFZhbHVlLCBlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUsIHJldHVybmVkTGlzdCk7CisKKwkJfQorCQkvLyBGb3IgSW50ZWdlciwgRG91YmxlIGV0Yy4uLgorCQllbHNlIGlmIChlbGVtZW50VHlwZSA9PSBUb3NjYUVsZW1lbnRUeXBlRW51bS5BTEwpIHsKKwkJCWlmIChlbGVtZW50VmFsdWUgIT0gbnVsbCkgeworCQkJCXJldHVybmVkTGlzdC5hZGQoU3RyaW5nLnZhbHVlT2YoZWxlbWVudFZhbHVlKSk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybmVkTGlzdC5hZGQoZWxlbWVudFZhbHVlKTsKKwkJCX0KKworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kQWxsVG9zY2FFbGVtZW50c0luTGlzdChMaXN0PE9iamVjdD4gbGlzdCwgU3RyaW5nIGVsZW1lbnROYW1lLCBUb3NjYUVsZW1lbnRUeXBlRW51bSBlbGVtZW50VHlwZSwgTGlzdDxPYmplY3Q+IHJldHVybmVkTGlzdCkgeworCQlJdGVyYXRvcjxPYmplY3Q+IGxpc3RJdHIgPSBsaXN0Lml0ZXJhdG9yKCk7CisJCXdoaWxlIChsaXN0SXRyLmhhc05leHQoKSkgeworCQkJT2JqZWN0IGVsZW1lbnRWYWx1ZSA9IGxpc3RJdHIubmV4dCgpOworCQkJaGFuZGxlRWxlbWVudE5hbWVOb3RGb3VuZChlbGVtZW50TmFtZSwgZWxlbWVudFZhbHVlLCBlbGVtZW50VHlwZSwgcmV0dXJuZWRMaXN0KTsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8T2JqZWN0LCBSZXN1bHRTdGF0dXNFbnVtPiBmaW5kVG9zY2FFbGVtZW50KE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bSBlbGVtZW50TmFtZSwgVG9zY2FFbGVtZW50VHlwZUVudW0gZWxlbWVudFR5cGUpIHsKKwkJTGlzdDxPYmplY3Q+IGZvdW5kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gcmV0dXJuZWRFbGVtZW50ID0gRWl0aGVyLnJpZ2h0KFJlc3VsdFN0YXR1c0VudW0uRUxFTUVOVF9OT1RfRk9VTkQpOworCQlJbXBvcnRVdGlscy5maW5kVG9zY2FFbGVtZW50cyh0b3NjYUpzb24sIGVsZW1lbnROYW1lLmdldEVsZW1lbnROYW1lKCksIGVsZW1lbnRUeXBlLCBmb3VuZEVsZW1lbnRzKTsKKwkJaWYgKGZvdW5kRWxlbWVudHMuc2l6ZSgpID4gMCkgeworCQkJcmV0dXJuZWRFbGVtZW50ID0gRWl0aGVyLmxlZnQoZm91bmRFbGVtZW50cy5nZXQoMCkpOworCQl9CisJCXJldHVybiByZXR1cm5lZEVsZW1lbnQ7CisKKwl9CisKKwkvKioKKwkgKiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgYWxsIHRvc2NhIGVsZW1lbnRzIHdpdGgga2V5IGVxdWFscyB0byBlbGVtZW50TmFtZSBhbmQgdmFsdWUgZXF1YWxzIHRvIGVsZW1lbnRUeXBlLiA8YnI+CisJICogUmV0dXJucyBFaXRoZXIgZWxlbWVudCB3aXRoOjxicj4KKwkgKiBMaXN0IHdpdGggYWxsIHZhbHVlIGlmIHZhbHVlcyBmb3VuZDxicj4KKwkgKiBPciBFTEVNRU5UX05PVF9GT1VORCBBY3Rpb25TdGF0dXMKKwkgKiAKKwkgKiBAcGFyYW0gdG9zY2FKc29uCisJICogQHBhcmFtIHRvc2NhVGFnTmFtZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxMaXN0PE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IGZpbmRUb3NjYUVsZW1lbnRzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBTdHJpbmcgZWxlbWVudE5hbWUsIFRvc2NhRWxlbWVudFR5cGVFbnVtIGVsZW1lbnRUeXBlLCBMaXN0PE9iamVjdD4gcmV0dXJuZWRMaXN0KSB7CisJCUVpdGhlcjxMaXN0PE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IHJldHVybmVkRWxlbWVudCA9IEVpdGhlci5yaWdodChSZXN1bHRTdGF0dXNFbnVtLkVMRU1FTlRfTk9UX0ZPVU5EKTsKKwkJU3RyaW5nIHNraXBLZXkgPSBudWxsOworCQlpZiAodG9zY2FKc29uLmNvbnRhaW5zS2V5KGVsZW1lbnROYW1lKSkgeworCQkJT2JqZWN0IGVsZW1lbnRWYWx1ZSA9IHRvc2NhSnNvbi5nZXQoZWxlbWVudE5hbWUpOworCQkJaGFuZGxlRWxlbWVudE5hbWVGb3VuZChlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUsIHJldHVybmVkTGlzdCwgZWxlbWVudFZhbHVlKTsKKwkJCXNraXBLZXkgPSBlbGVtZW50TmFtZTsKKwkJfQorCisJCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgT2JqZWN0Pj4ga2V5VmFsSXRyID0gdG9zY2FKc29uLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGtleVZhbEl0ci5oYXNOZXh0KCkpIHsKKwkJCUVudHJ5PFN0cmluZywgT2JqZWN0PiBrZXlWYWxFbnRyeSA9IGtleVZhbEl0ci5uZXh0KCk7CisJCQlpZiAoIVN0cmluZy52YWx1ZU9mKGtleVZhbEVudHJ5LmdldEtleSgpKS5lcXVhbHMoc2tpcEtleSkpIHsKKwkJCQloYW5kbGVFbGVtZW50TmFtZU5vdEZvdW5kKGVsZW1lbnROYW1lLCBrZXlWYWxFbnRyeS5nZXRWYWx1ZSgpLCBlbGVtZW50VHlwZSwgcmV0dXJuZWRMaXN0KTsKKwkJCX0KKwkJfQorCisJCWlmIChyZXR1cm5lZExpc3Quc2l6ZSgpID4gMCkgeworCQkJcmV0dXJuZWRFbGVtZW50ID0gRWl0aGVyLmxlZnQocmV0dXJuZWRMaXN0KTsKKwkJfQorCisJCXJldHVybiByZXR1cm5lZEVsZW1lbnQ7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHN0YXRpYyA8VD4gRWl0aGVyPExpc3Q8VD4sIFJlc3VsdFN0YXR1c0VudW0+IGZpbmRGaXJzdFRvc2NhTGlzdEVsZW1lbnQoTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtIHRvc2NhVGFnTmFtZSkgeworCQlFaXRoZXI8TGlzdDxUPiwgUmVzdWx0U3RhdHVzRW51bT4gcmV0dXJuZWRFbGVtZW50ID0gRWl0aGVyLnJpZ2h0KFJlc3VsdFN0YXR1c0VudW0uRUxFTUVOVF9OT1RfRk9VTkQpOworCQlFaXRoZXI8T2JqZWN0LCBSZXN1bHRTdGF0dXNFbnVtPiBmaW5kRmlyc3RUb3NjYUVsZW1lbnQgPSBmaW5kVG9zY2FFbGVtZW50KHRvc2NhSnNvbiwgdG9zY2FUYWdOYW1lLCBUb3NjYUVsZW1lbnRUeXBlRW51bS5MSVNUKTsKKwkJaWYgKGZpbmRGaXJzdFRvc2NhRWxlbWVudC5pc0xlZnQoKSkgeworCQkJcmV0dXJuZWRFbGVtZW50ID0gRWl0aGVyLmxlZnQoKExpc3Q8VD4pIGZpbmRGaXJzdFRvc2NhRWxlbWVudC5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIHJldHVybmVkRWxlbWVudDsKKworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBzdGF0aWMgPFQ+IEVpdGhlcjxNYXA8U3RyaW5nLCBUPiwgUmVzdWx0U3RhdHVzRW51bT4gZmluZEZpcnN0VG9zY2FNYXBFbGVtZW50KE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bSB0b3NjYVRhZ05hbWUpIHsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFQ+LCBSZXN1bHRTdGF0dXNFbnVtPiByZXR1cm5lZEVsZW1lbnQgPSBFaXRoZXIucmlnaHQoUmVzdWx0U3RhdHVzRW51bS5FTEVNRU5UX05PVF9GT1VORCk7CisJCUVpdGhlcjxPYmplY3QsIFJlc3VsdFN0YXR1c0VudW0+IGZpbmRGaXJzdFRvc2NhRWxlbWVudCA9IGZpbmRUb3NjYUVsZW1lbnQodG9zY2FKc29uLCB0b3NjYVRhZ05hbWUsIFRvc2NhRWxlbWVudFR5cGVFbnVtLk1BUCk7CisJCWlmIChmaW5kRmlyc3RUb3NjYUVsZW1lbnQuaXNMZWZ0KCkpIHsKKwkJCXJldHVybmVkRWxlbWVudCA9IEVpdGhlci5sZWZ0KChNYXA8U3RyaW5nLCBUPikgZmluZEZpcnN0VG9zY2FFbGVtZW50LmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCQlyZXR1cm4gcmV0dXJuZWRFbGVtZW50OworCisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8U3RyaW5nLCBSZXN1bHRTdGF0dXNFbnVtPiBmaW5kRmlyc3RUb3NjYVN0cmluZ0VsZW1lbnQoTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtIHRvc2NhVGFnTmFtZSkgeworCQlFaXRoZXI8U3RyaW5nLCBSZXN1bHRTdGF0dXNFbnVtPiByZXR1cm5lZEVsZW1lbnQgPSBFaXRoZXIucmlnaHQoUmVzdWx0U3RhdHVzRW51bS5FTEVNRU5UX05PVF9GT1VORCk7CisJCUVpdGhlcjxPYmplY3QsIFJlc3VsdFN0YXR1c0VudW0+IGZpbmRGaXJzdFRvc2NhRWxlbWVudHMgPSBmaW5kVG9zY2FFbGVtZW50KHRvc2NhSnNvbiwgdG9zY2FUYWdOYW1lLCBUb3NjYUVsZW1lbnRUeXBlRW51bS5TVFJJTkcpOworCQlpZiAoZmluZEZpcnN0VG9zY2FFbGVtZW50cy5pc0xlZnQoKSkgeworCQkJcmV0dXJuZWRFbGVtZW50ID0gRWl0aGVyLmxlZnQoKFN0cmluZykgZmluZEZpcnN0VG9zY2FFbGVtZW50cy5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIHJldHVybmVkRWxlbWVudDsKKwl9CisKKwkvKioKKwkgKiBzZWFyY2hlcyBmb3IgZmlyc3QgVG9zY2EgaW4gSnNvbiBtYXAgKHRvc2NhSnNvbikgYm9vbGVhbiBlbGVtZW50IGJ5IG5hbWUgKHRvc2NhVGFnTmFtZSkgcmV0dXJucyBmb3VuZCBlbGVtZW50IG9yIEVMRU1FTlRfTk9UX0ZPVU5EIHN0YXR1cworCSAqIAorCSAqIEBwYXJhbSB0b3NjYUpzb24KKwkgKiBAcGFyYW0gdG9zY2FUYWdOYW1lCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPFN0cmluZywgUmVzdWx0U3RhdHVzRW51bT4gZmluZEZpcnN0VG9zY2FCb29sZWFuRWxlbWVudChNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0gdG9zY2FUYWdOYW1lKSB7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3VsdFN0YXR1c0VudW0+IHJldHVybmVkRWxlbWVudCA9IEVpdGhlci5yaWdodChSZXN1bHRTdGF0dXNFbnVtLkVMRU1FTlRfTk9UX0ZPVU5EKTsKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gZmluZEZpcnN0VG9zY2FFbGVtZW50cyA9IGZpbmRUb3NjYUVsZW1lbnQodG9zY2FKc29uLCB0b3NjYVRhZ05hbWUsIFRvc2NhRWxlbWVudFR5cGVFbnVtLkJPT0xFQU4pOworCQlpZiAoZmluZEZpcnN0VG9zY2FFbGVtZW50cy5pc0xlZnQoKSkgeworCQkJcmV0dXJuZWRFbGVtZW50ID0gRWl0aGVyLmxlZnQoU3RyaW5nLnZhbHVlT2YoZmluZEZpcnN0VG9zY2FFbGVtZW50cy5sZWZ0KCkudmFsdWUoKSkpOworCQl9CisJCXJldHVybiByZXR1cm5lZEVsZW1lbnQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eUNvbnN0cmFpbnRzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlWYWx1ZSwgUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5KSB7CisJCUVpdGhlcjxMaXN0PE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IHByb3BlcnR5RmllbGRjb25zdHJhaW50cyA9IGZpbmRGaXJzdFRvc2NhTGlzdEVsZW1lbnQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uQ09OU1RSQUlOVFMpOworCQlpZiAocHJvcGVydHlGaWVsZGNvbnN0cmFpbnRzLmlzTGVmdCgpKSB7CisJCQlMaXN0PE9iamVjdD4ganNvbkNvbnN0cmFpbnRMaXN0ID0gcHJvcGVydHlGaWVsZGNvbnN0cmFpbnRzLmxlZnQoKS52YWx1ZSgpOworCisJCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCVR5cGUgY29uc3RyYWludFR5cGUgPSBuZXcgVHlwZVRva2VuPFByb3BlcnR5Q29uc3RyYWludD4oKSB7CisJCQl9LmdldFR5cGUoKTsKKwkJCUdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnJlZ2lzdGVyVHlwZUFkYXB0ZXIoY29uc3RyYWludFR5cGUsIG5ldyBQcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXIoKSkuY3JlYXRlKCk7CisKKwkJCWZvciAoT2JqZWN0IGNvbnN0cmFpbnRKc29uIDoganNvbkNvbnN0cmFpbnRMaXN0KSB7CisJCQkJUHJvcGVydHlDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludCA9IGdzb24uZnJvbUpzb24oZ3Nvbi50b0pzb24oY29uc3RyYWludEpzb24pLCBjb25zdHJhaW50VHlwZSk7CisJCQkJY29uc3RyYWludExpc3QuYWRkKHByb3BlcnR5Q29uc3RyYWludCk7CisJCQl9CisJCQlwcm9wZXJ0eS5zZXRDb25zdHJhaW50cyhjb25zdHJhaW50TGlzdCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3BlcnR5RGVmaW5pdGlvbiBjcmVhdGVNb2R1bGVQcm9wZXJ0eShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5VmFsdWUpIHsKKworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWYgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKHByb3BlcnR5VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUsIHR5cGUgLT4gcHJvcGVydHlEZWYuc2V0VHlwZSh0eXBlKSk7CisJCUltcG9ydFV0aWxzLnNldFByb3BlcnR5RmllbGRSZXF1aXJlZChwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eURlZik7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKHByb3BlcnR5VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLkRFU0NSSVBUSU9OLCBkZXNjIC0+IHByb3BlcnR5RGVmLnNldERlc2NyaXB0aW9uKGRlc2MpKTsKKworCQlFaXRoZXI8T2JqZWN0LCBSZXN1bHRTdGF0dXNFbnVtPiBmaW5kVG9zY2FFbGVtZW50ID0gSW1wb3J0VXRpbHMuZmluZFRvc2NhRWxlbWVudChwcm9wZXJ0eVZhbHVlLCBUb3NjYVRhZ05hbWVzRW51bS5ERUZBVUxUX1ZBTFVFLCBUb3NjYUVsZW1lbnRUeXBlRW51bS5BTEwpOworCQlpZiAoZmluZFRvc2NhRWxlbWVudC5pc0xlZnQoKSkgeworCQkJU3RyaW5nIHByb3BlcnR5SnNvblN0cmluZ1ZhbHVlID0gZ2V0UHJvcGVydHlKc29uU3RyaW5nVmFsdWUoZmluZFRvc2NhRWxlbWVudC5sZWZ0KCkudmFsdWUoKSwgcHJvcGVydHlEZWYuZ2V0VHlwZSgpKTsKKwkJCXByb3BlcnR5RGVmLnNldERlZmF1bHRWYWx1ZShwcm9wZXJ0eUpzb25TdHJpbmdWYWx1ZSk7CisJCX0KKwkJSW1wb3J0VXRpbHMuc2V0RmllbGQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uSVNfUEFTU1dPUkQsIHBhc3MgLT4gcHJvcGVydHlEZWYuc2V0UGFzc3dvcmQoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocGFzcykpKTsKKwkJSW1wb3J0VXRpbHMuc2V0RmllbGQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uU1RBVFVTLCBzdGF0dXMgLT4gcHJvcGVydHlEZWYuc2V0U3RhdHVzKHN0YXR1cykpOworCQlJbXBvcnRVdGlscy5zZXRQcm9wZXJ0eVNjaGVtZShwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eURlZik7CisJCUltcG9ydFV0aWxzLnNldFByb3BlcnR5Q29uc3RyYWludHMocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlEZWYpOworCisJCXJldHVybiBwcm9wZXJ0eURlZjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElucHV0RGVmaW5pdGlvbiBjcmVhdGVNb2R1bGVJbnB1dChNYXA8U3RyaW5nLCBPYmplY3Q+IGlucHV0VmFsdWUpIHsKKworCQlJbnB1dERlZmluaXRpb24gaW5wdXREZWYgPSBuZXcgSW5wdXREZWZpbml0aW9uKCk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGlucHV0VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUsIHR5cGUgLT4gaW5wdXREZWYuc2V0VHlwZSh0eXBlKSk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGlucHV0VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLlJFUVVJUkVELCByZXEgLT4gaW5wdXREZWYuc2V0UmVxdWlyZWQoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocmVxKSkpOworCQlJbXBvcnRVdGlscy5zZXRGaWVsZChpbnB1dFZhbHVlLCBUb3NjYVRhZ05hbWVzRW51bS5ERVNDUklQVElPTiwgZGVzYyAtPiBpbnB1dERlZi5zZXREZXNjcmlwdGlvbihkZXNjKSk7CisKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gZmluZFRvc2NhRWxlbWVudCA9IEltcG9ydFV0aWxzLmZpbmRUb3NjYUVsZW1lbnQoaW5wdXRWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uREVGQVVMVF9WQUxVRSwgVG9zY2FFbGVtZW50VHlwZUVudW0uQUxMKTsKKwkJaWYgKGZpbmRUb3NjYUVsZW1lbnQuaXNMZWZ0KCkpIHsKKwkJCVN0cmluZyBwcm9wZXJ0eUpzb25TdHJpbmdWYWx1ZSA9IGdldFByb3BlcnR5SnNvblN0cmluZ1ZhbHVlKGZpbmRUb3NjYUVsZW1lbnQubGVmdCgpLnZhbHVlKCksIGlucHV0RGVmLmdldFR5cGUoKSk7CisJCQlpbnB1dERlZi5zZXREZWZhdWx0VmFsdWUocHJvcGVydHlKc29uU3RyaW5nVmFsdWUpOworCQl9CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGlucHV0VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLklTX1BBU1NXT1JELCBwYXNzIC0+IGlucHV0RGVmLnNldFBhc3N3b3JkKEJvb2xlYW4ucGFyc2VCb29sZWFuKHBhc3MpKSk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGlucHV0VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLlNUQVRVUywgc3RhdHVzIC0+IGlucHV0RGVmLnNldFN0YXR1cyhzdGF0dXMpKTsKKwkJSW1wb3J0VXRpbHMuc2V0RmllbGQoaW5wdXRWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uTEFCRUwsIGxhYmVsIC0+IGlucHV0RGVmLnNldExhYmVsKGxhYmVsKSk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGlucHV0VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLkhJRERFTiwgaGlkZGVuIC0+IGlucHV0RGVmLnNldEhpZGRlbihCb29sZWFuLnBhcnNlQm9vbGVhbihoaWRkZW4pKSk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGlucHV0VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLkhJRERFTiwgaW1tdXRhYmxlIC0+IGlucHV0RGVmLnNldEltbXV0YWJsZShCb29sZWFuLnBhcnNlQm9vbGVhbihpbW11dGFibGUpKSk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGlucHV0VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLkxBQkVMLCBsYWJlbCAtPiBpbnB1dERlZi5zZXRMYWJlbChsYWJlbCkpOworCQlJbXBvcnRVdGlscy5zZXRQcm9wZXJ0eVNjaGVtZShpbnB1dFZhbHVlLCBpbnB1dERlZik7CisJCUltcG9ydFV0aWxzLnNldFByb3BlcnR5Q29uc3RyYWludHMoaW5wdXRWYWx1ZSwgaW5wdXREZWYpOworCisJCXJldHVybiBpbnB1dERlZjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlTW9kdWxlQXR0cmlidXRlKE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlTWFwKSB7CisKKwkJQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVEZWYgPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvbigpOworCQlJbXBvcnRVdGlscy5zZXRGaWVsZChhdHRyaWJ1dGVNYXAsIFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUsIHR5cGUgLT4gYXR0cmlidXRlRGVmLnNldFR5cGUodHlwZSkpOworCQlJbXBvcnRVdGlscy5zZXRGaWVsZChhdHRyaWJ1dGVNYXAsIFRvc2NhVGFnTmFtZXNFbnVtLkRFU0NSSVBUSU9OLCBkZXNjIC0+IGF0dHJpYnV0ZURlZi5zZXREZXNjcmlwdGlvbihkZXNjKSk7CisJCUltcG9ydFV0aWxzLnNldEZpZWxkKGF0dHJpYnV0ZU1hcCwgVG9zY2FUYWdOYW1lc0VudW0uU1RBVFVTLCBzdGF0dXMgLT4gYXR0cmlidXRlRGVmLnNldFN0YXR1cyhzdGF0dXMpKTsKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gZWl0aGVyRGVmYXVsdFZhbHVlID0gSW1wb3J0VXRpbHMuZmluZFRvc2NhRWxlbWVudChhdHRyaWJ1dGVNYXAsIFRvc2NhVGFnTmFtZXNFbnVtLkRFRkFVTFRfVkFMVUUsIFRvc2NhRWxlbWVudFR5cGVFbnVtLkFMTCk7CisJCWlmIChlaXRoZXJEZWZhdWx0VmFsdWUuaXNMZWZ0KCkpIHsKKwkJCVN0cmluZyBhdHRyaWJ1dGVEZWZhdWx0VmFsdWUgPSBnZXRQcm9wZXJ0eUpzb25TdHJpbmdWYWx1ZShlaXRoZXJEZWZhdWx0VmFsdWUubGVmdCgpLnZhbHVlKCksIGF0dHJpYnV0ZURlZi5nZXRUeXBlKCkpOworCQkJYXR0cmlidXRlRGVmLnNldERlZmF1bHRWYWx1ZShhdHRyaWJ1dGVEZWZhdWx0VmFsdWUpOworCQl9CisJCUVpdGhlcjxPYmplY3QsIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlclZhbHVlID0gSW1wb3J0VXRpbHMuZmluZFRvc2NhRWxlbWVudChhdHRyaWJ1dGVNYXAsIFRvc2NhVGFnTmFtZXNFbnVtLlZBTFVFLCBUb3NjYUVsZW1lbnRUeXBlRW51bS5BTEwpOworCQlpZiAoZWl0aGVyVmFsdWUuaXNMZWZ0KCkpIHsKKwkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGdldFByb3BlcnR5SnNvblN0cmluZ1ZhbHVlKGVpdGhlclZhbHVlLmxlZnQoKS52YWx1ZSgpLCBhdHRyaWJ1dGVEZWYuZ2V0VHlwZSgpKTsKKwkJCWF0dHJpYnV0ZURlZi5zZXRWYWx1ZShhdHRyaWJ1dGVWYWx1ZSk7CisJCX0KKwkJSW1wb3J0VXRpbHMuc2V0QXR0cmlidXRlU2NoZW1lKGF0dHJpYnV0ZU1hcCwgYXR0cmlidXRlRGVmKTsKKwkJcmV0dXJuIGF0dHJpYnV0ZURlZjsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5RmllbGRTdGF0dXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eVZhbHVlLCBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWYpIHsKKwkJRWl0aGVyPFN0cmluZywgUmVzdWx0U3RhdHVzRW51bT4gcHJvcGVydHlGaWVsZElzU3RhdHVzID0gZmluZEZpcnN0VG9zY2FTdHJpbmdFbGVtZW50KHByb3BlcnR5VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLlNUQVRVUyk7CisJCWlmIChwcm9wZXJ0eUZpZWxkSXNTdGF0dXMuaXNMZWZ0KCkpIHsKKwkJCXByb3BlcnR5RGVmLnNldFN0YXR1cyhwcm9wZXJ0eUZpZWxkSXNTdGF0dXMubGVmdCgpLnZhbHVlKCkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEF0dHJpYnV0ZUZpZWxkU3RhdHVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlWYWx1ZSwgQXR0cmlidXRlRGVmaW5pdGlvbiBwcm9wZXJ0eURlZikgeworCQlFaXRoZXI8U3RyaW5nLCBSZXN1bHRTdGF0dXNFbnVtPiBwcm9wZXJ0eUZpZWxkSXNTdGF0dXMgPSBmaW5kRmlyc3RUb3NjYVN0cmluZ0VsZW1lbnQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uU1RBVFVTKTsKKwkJaWYgKHByb3BlcnR5RmllbGRJc1N0YXR1cy5pc0xlZnQoKSkgeworCQkJcHJvcGVydHlEZWYuc2V0U3RhdHVzKHByb3BlcnR5RmllbGRJc1N0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJvcGVydHlTY2hlbWUoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eVZhbHVlLCBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uKSB7CisJCUVpdGhlcjxTY2hlbWFEZWZpbml0aW9uLCBSZXN1bHRTdGF0dXNFbnVtPiBlaXRoZXJTY2hlbWEgPSBnZXRTY2hlbWEocHJvcGVydHlWYWx1ZSk7CisJCWlmIChlaXRoZXJTY2hlbWEuaXNMZWZ0KCkpIHsKKwkJCVNjaGVtYURlZmluaXRpb24gc2NoZW1hRGVmID0gbmV3IFNjaGVtYURlZmluaXRpb24oKTsKKwkJCXNjaGVtYURlZi5zZXRQcm9wZXJ0eShlaXRoZXJTY2hlbWEubGVmdCgpLnZhbHVlKCkuZ2V0UHJvcGVydHkoKSk7CisJCQlwcm9wZXJ0eURlZmluaXRpb24uc2V0U2NoZW1hKHNjaGVtYURlZik7CisJCX0KKworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlU2NoZW1lKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlWYWx1ZSwgQXR0cmlidXRlRGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24pIHsKKwkJRWl0aGVyPFNjaGVtYURlZmluaXRpb24sIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlclNjaGVtYSA9IGdldFNjaGVtYShwcm9wZXJ0eVZhbHVlKTsKKwkJaWYgKGVpdGhlclNjaGVtYS5pc0xlZnQoKSkgeworCQkJU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWFEZWYgPSBuZXcgU2NoZW1hRGVmaW5pdGlvbigpOworCQkJc2NoZW1hRGVmLnNldFByb3BlcnR5KGVpdGhlclNjaGVtYS5sZWZ0KCkudmFsdWUoKS5nZXRQcm9wZXJ0eSgpKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXRTY2hlbWEoc2NoZW1hRGVmKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWl0aGVyPFNjaGVtYURlZmluaXRpb24sIFJlc3VsdFN0YXR1c0VudW0+IGdldFNjaGVtYShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5VmFsdWUpIHsKKwkJRWl0aGVyPFNjaGVtYURlZmluaXRpb24sIFJlc3VsdFN0YXR1c0VudW0+IHJlc3VsdCA9IEVpdGhlci5yaWdodChSZXN1bHRTdGF0dXNFbnVtLkVMRU1FTlRfTk9UX0ZPVU5EKTsKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gcHJvcGVydHlGaWVsZEVudHJ5U2NoZW1lID0gZmluZFRvc2NhRWxlbWVudChwcm9wZXJ0eVZhbHVlLCBUb3NjYVRhZ05hbWVzRW51bS5FTlRSWV9TQ0hFTUEsIFRvc2NhRWxlbWVudFR5cGVFbnVtLkFMTCk7CisJCWlmIChwcm9wZXJ0eUZpZWxkRW50cnlTY2hlbWUuaXNMZWZ0KCkpIHsKKwkJCWlmIChwcm9wZXJ0eUZpZWxkRW50cnlTY2hlbWUubGVmdCgpLnZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgc2NoZW1hVHlwZSA9IChTdHJpbmcpIHByb3BlcnR5RmllbGRFbnRyeVNjaGVtZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYSA9IG5ldyBTY2hlbWFEZWZpbml0aW9uKCk7CisJCQkJUHJvcGVydHlEZWZpbml0aW9uIHNjaGVtZVByb3BlcnR5ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQkJCXNjaGVtZVByb3BlcnR5LnNldFR5cGUoc2NoZW1hVHlwZSk7CisJCQkJc2NoZW1hLnNldFByb3BlcnR5KHNjaGVtZVByb3BlcnR5KTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChzY2hlbWEpOworCisJCQl9IGVsc2UgaWYgKHByb3BlcnR5RmllbGRFbnRyeVNjaGVtZS5sZWZ0KCkudmFsdWUoKSBpbnN0YW5jZW9mIE1hcCkgeworCQkJCVByb3BlcnR5RGVmaW5pdGlvbiBzY2hlbWVQcm9wZXJ0eSA9IGNyZWF0ZU1vZHVsZVByb3BlcnR5KChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwcm9wZXJ0eUZpZWxkRW50cnlTY2hlbWUubGVmdCgpLnZhbHVlKCkpOworCQkJCVNjaGVtYURlZmluaXRpb24gc2NoZW1hID0gbmV3IFNjaGVtYURlZmluaXRpb24oKTsKKwkJCQlzY2hlbWEuc2V0UHJvcGVydHkoc2NoZW1lUHJvcGVydHkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHNjaGVtYSk7CisKKwkJCX0KKworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eUZpZWxkSXNQYXNzd29yZChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5VmFsdWUsIFByb3BlcnR5RGVmaW5pdGlvbiBkYXRhRGVmaW5pdGlvbikgeworCQlFaXRoZXI8U3RyaW5nLCBSZXN1bHRTdGF0dXNFbnVtPiBwcm9wZXJ0eUZpZWxkSXNQYXNzd29yZCA9IGZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudChwcm9wZXJ0eVZhbHVlLCBUb3NjYVRhZ05hbWVzRW51bS5JU19QQVNTV09SRCk7CisJCWlmIChwcm9wZXJ0eUZpZWxkSXNQYXNzd29yZC5pc0xlZnQoKSkgeworCQkJZGF0YURlZmluaXRpb24uc2V0UGFzc3dvcmQoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcGVydHlGaWVsZElzUGFzc3dvcmQubGVmdCgpLnZhbHVlKCkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3VsdFN0YXR1c0VudW0gc2V0UHJvcGVydHlGaWVsZERlZmF1bHRWYWx1ZShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5VmFsdWUsIFByb3BlcnR5RGVmaW5pdGlvbiBkYXRhRGVmaW5pdGlvbikgeworCQlFaXRoZXI8T2JqZWN0LCBSZXN1bHRTdGF0dXNFbnVtPiBwcm9wZXJ0eUZpZWxkRGVmYXVsdFZhbHVlID0gZmluZFRvc2NhRWxlbWVudChwcm9wZXJ0eVZhbHVlLCBUb3NjYVRhZ05hbWVzRW51bS5ERUZBVUxUX1ZBTFVFLCBUb3NjYUVsZW1lbnRUeXBlRW51bS5BTEwpOworCQlHc29uIGdzb24gPSBHc29uRmFjdG9yeS5nZXRHc29uKCk7CisJCWlmIChwcm9wZXJ0eUZpZWxkRGVmYXVsdFZhbHVlLmlzTGVmdCgpKSB7CisJCQlPYmplY3QgZGVmYXVsdFZhbHVlID0gcHJvcGVydHlGaWVsZERlZmF1bHRWYWx1ZS5sZWZ0KCkudmFsdWUoKTsKKwkJCVN0cmluZyB0eXBlID0gZGF0YURlZmluaXRpb24uZ2V0VHlwZSgpOworCQkJVG9zY2FQcm9wZXJ0eVR5cGUgaW5uZXJUb3NjYVR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZSh0eXBlKTsKKwkJCS8vIGVzb2ZlciAtIHN1cHBvcnRpbmcgY3VzdG9taXplZCBkYXRhIHR5cGVzLiBUaGUgdmFsaWRhdGlvbiBvZiB0aGUKKwkJCS8vIHR5cGUgd2lsbCBiZSBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIHByb3BlcnR5LgorCQkJLy8gaWYoaW5uZXJUb3NjYVR5cGUgPT0gbnVsbCl7CisJCQkvLyByZXR1cm4gUmVzdWx0U3RhdHVzRW51bS5NSVNTSU5HX0VOVFJZX1NDSEVNQV9UWVBFOworCQkJLy8gfQorCQkJLy8gY3VzdG9taXplZCBkYXRhIHR5cGVzIHZhbHVlIGlzIHJlcHJlc2VudGVkIGFzIGpzb24uCisJCQkvLyBBbHNvIGN1c3RvbWl6ZWQgZGF0YSB0eXBlcyB3aGljaCBhcmUgc2NhbGFyIG9uZXMsIGZvciBleGFtcGxlLAorCQkJLy8gZGF0YSB0eXBlIHdoaWNoIGRlcml2ZWQgZnJvbSBpbnRlZ2VyLCB0aGVpciB2YWx1ZSB3aWxsIGJlCisJCQkvLyByZXByZXNlbnRlZCBhcyBqc29uLgorCQkJaWYgKGlubmVyVG9zY2FUeXBlID09IG51bGwgfHwgaW5uZXJUb3NjYVR5cGUuZXF1YWxzKFRvc2NhUHJvcGVydHlUeXBlLkxJU1QpIHx8IGlubmVyVG9zY2FUeXBlLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5NQVApKSB7CisJCQkJU3RyaW5nIGpzb25PYmogPSBudWxsOworCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworCQkJCQlqc29uT2JqID0gZ3Nvbi50b0pzb24oZGVmYXVsdFZhbHVlKTsKKwkJCQl9CisKKwkJCQlkYXRhRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoanNvbk9iaik7CisJCQl9IGVsc2UgeworCQkJCWRhdGFEZWZpbml0aW9uLnNldERlZmF1bHRWYWx1ZShTdHJpbmcudmFsdWVPZihkZWZhdWx0VmFsdWUpKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIFJlc3VsdFN0YXR1c0VudW0uT0s7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdWx0U3RhdHVzRW51bSBzZXRBdHRyaWJ1dGVGaWVsZERlZmF1bHRWYWx1ZShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5VmFsdWUsIEF0dHJpYnV0ZURlZmluaXRpb24gZGF0YURlZmluaXRpb24pIHsKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gcHJvcGVydHlGaWVsZERlZmF1bHRWYWx1ZSA9IGZpbmRUb3NjYUVsZW1lbnQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uREVGQVVMVF9WQUxVRSwgVG9zY2FFbGVtZW50VHlwZUVudW0uQUxMKTsKKwkJR3NvbiBnc29uID0gR3NvbkZhY3RvcnkuZ2V0R3NvbigpOworCQlpZiAocHJvcGVydHlGaWVsZERlZmF1bHRWYWx1ZS5pc0xlZnQoKSkgeworCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5RmllbGREZWZhdWx0VmFsdWUubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgdHlwZSA9IGRhdGFEZWZpbml0aW9uLmdldFR5cGUoKTsKKwkJCVRvc2NhUHJvcGVydHlUeXBlIGlubmVyVG9zY2FUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUodHlwZSk7CisJCQkvLyBlc29mZXIgLSBzdXBwb3J0aW5nIGN1c3RvbWl6ZWQgZGF0YSB0eXBlcy4gVGhlIHZhbGlkYXRpb24gb2YgdGhlCisJCQkvLyB0eXBlIHdpbGwgYmUgaW4gdGhlIGNyZWF0aW9uIG9mIHRoZSBwcm9wZXJ0eS4KKwkJCS8vIGlmKGlubmVyVG9zY2FUeXBlID09IG51bGwpeworCQkJLy8gcmV0dXJuIFJlc3VsdFN0YXR1c0VudW0uTUlTU0lOR19FTlRSWV9TQ0hFTUFfVFlQRTsKKwkJCS8vIH0KKwkJCS8vIGN1c3RvbWl6ZWQgZGF0YSB0eXBlcyB2YWx1ZSBpcyByZXByZXNlbnRlZCBhcyBqc29uLgorCQkJLy8gQWxzbyBjdXN0b21pemVkIGRhdGEgdHlwZXMgd2hpY2ggYXJlIHNjYWxhciBvbmVzLCBmb3IgZXhhbXBsZSwKKwkJCS8vIGRhdGEgdHlwZSB3aGljaCBkZXJpdmVkIGZyb20gaW50ZWdlciwgdGhlaXIgdmFsdWUgd2lsbCBiZQorCQkJLy8gcmVwcmVzZW50ZWQgYXMganNvbi4KKwkJCWlmIChpbm5lclRvc2NhVHlwZSA9PSBudWxsIHx8IGlubmVyVG9zY2FUeXBlLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5MSVNUKSB8fCBpbm5lclRvc2NhVHlwZS5lcXVhbHMoVG9zY2FQcm9wZXJ0eVR5cGUuTUFQKSkgeworCQkJCVN0cmluZyBqc29uT2JqID0gbnVsbDsKKwkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCQkJanNvbk9iaiA9IGdzb24udG9Kc29uKGRlZmF1bHRWYWx1ZSk7CisJCQkJfQorCisJCQkJZGF0YURlZmluaXRpb24uc2V0RGVmYXVsdFZhbHVlKGpzb25PYmopOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoU3RyaW5nLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiBSZXN1bHRTdGF0dXNFbnVtLk9LOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWVsZChNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0gdGFnTmFtZSwgQ29uc3VtZXI8U3RyaW5nPiBzZXR0ZXIpIHsKKwkJRWl0aGVyPFN0cmluZywgUmVzdWx0U3RhdHVzRW51bT4gZmllbGRTdHJpbmdWYWx1ZSA9IGZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudCh0b3NjYUpzb24sIHRhZ05hbWUpOworCQlpZiAoZmllbGRTdHJpbmdWYWx1ZS5pc0xlZnQoKSkgeworCQkJc2V0dGVyLmFjY2VwdChmaWVsZFN0cmluZ1ZhbHVlLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eUZpZWxkRGVzY3JpcHRpb24oTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eVZhbHVlLCBQcm9wZXJ0eURlZmluaXRpb24gZGF0YURlZmluaXRpb24pIHsKKwkJRWl0aGVyPFN0cmluZywgUmVzdWx0U3RhdHVzRW51bT4gcHJvcGVydHlGaWVsZERlc2NyaXB0aW9uID0gZmluZEZpcnN0VG9zY2FTdHJpbmdFbGVtZW50KHByb3BlcnR5VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLkRFU0NSSVBUSU9OKTsKKwkJaWYgKHByb3BlcnR5RmllbGREZXNjcmlwdGlvbi5pc0xlZnQoKSkgeworCQkJZGF0YURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24ocHJvcGVydHlGaWVsZERlc2NyaXB0aW9uLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJvcGVydHlGaWVsZFJlcXVpcmVkKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlWYWx1ZSwgUHJvcGVydHlEZWZpbml0aW9uIGRhdGFEZWZpbml0aW9uKSB7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3VsdFN0YXR1c0VudW0+IHByb3BlcnR5RmllbGRSZXF1aXJlZCA9IGZpbmRGaXJzdFRvc2NhQm9vbGVhbkVsZW1lbnQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uUkVRVUlSRUQpOworCQlpZiAocHJvcGVydHlGaWVsZFJlcXVpcmVkLmlzTGVmdCgpKSB7CisJCQlkYXRhRGVmaW5pdGlvbi5zZXRSZXF1aXJlZChCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wZXJ0eUZpZWxkUmVxdWlyZWQubGVmdCgpLnZhbHVlKCkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlRmllbGRUeXBlKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlWYWx1ZSwgQXR0cmlidXRlRGVmaW5pdGlvbiBkYXRhRGVmaW5pdGlvbikgeworCQlFaXRoZXI8U3RyaW5nLCBSZXN1bHRTdGF0dXNFbnVtPiBwcm9wZXJ0eUZpZWxkVHlwZSA9IGZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudChwcm9wZXJ0eVZhbHVlLCBUb3NjYVRhZ05hbWVzRW51bS5UWVBFKTsKKwkJaWYgKHByb3BlcnR5RmllbGRUeXBlLmlzTGVmdCgpKSB7CisJCQlkYXRhRGVmaW5pdGlvbi5zZXRUeXBlKHByb3BlcnR5RmllbGRUeXBlLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJvcGVydHlGaWVsZFR5cGUoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eVZhbHVlLCBQcm9wZXJ0eURlZmluaXRpb24gZGF0YURlZmluaXRpb24pIHsKKwkJRWl0aGVyPFN0cmluZywgUmVzdWx0U3RhdHVzRW51bT4gcHJvcGVydHlGaWVsZFR5cGUgPSBmaW5kRmlyc3RUb3NjYVN0cmluZ0VsZW1lbnQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uVFlQRSk7CisJCWlmIChwcm9wZXJ0eUZpZWxkVHlwZS5pc0xlZnQoKSkgeworCQkJZGF0YURlZmluaXRpb24uc2V0VHlwZShwcm9wZXJ0eUZpZWxkVHlwZS5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEF0dHJpYnV0ZUZpZWxkRGVzY3JpcHRpb24oTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eVZhbHVlLCBBdHRyaWJ1dGVEZWZpbml0aW9uIGRhdGFEZWZpbml0aW9uKSB7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3VsdFN0YXR1c0VudW0+IHByb3BlcnR5RmllbGREZXNjcmlwdGlvbiA9IGZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudChwcm9wZXJ0eVZhbHVlLCBUb3NjYVRhZ05hbWVzRW51bS5ERVNDUklQVElPTik7CisJCWlmIChwcm9wZXJ0eUZpZWxkRGVzY3JpcHRpb24uaXNMZWZ0KCkpIHsKKwkJCWRhdGFEZWZpbml0aW9uLnNldERlc2NyaXB0aW9uKHByb3BlcnR5RmllbGREZXNjcmlwdGlvbi5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXN1bHRTdGF0dXNFbnVtPiBnZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uKSB7CisJCUZ1bmN0aW9uPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBlbGVtZW50R2VuQnlOYW1lID0gZWxlbWVudE5hbWUgLT4gY3JlYXRlUHJvcGVydGllcyhlbGVtZW50TmFtZSk7CisJCUZ1bmN0aW9uPE1hcDxTdHJpbmcsIE9iamVjdD4sIFByb3BlcnR5RGVmaW5pdGlvbj4gZnVuYyA9IG1hcCAtPiBjcmVhdGVNb2R1bGVQcm9wZXJ0eShtYXApOworCisJCXJldHVybiBnZXRFbGVtZW50cyh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLlBST1BFUlRJRVMsIGVsZW1lbnRHZW5CeU5hbWUsIGZ1bmMpOworCisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8TWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gZ2V0SW5wdXRzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uKSB7CisJCUZ1bmN0aW9uPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBlbGVtZW50R2VuQnlOYW1lID0gZWxlbWVudE5hbWUgLT4gY3JlYXRlSW5wdXRzKGVsZW1lbnROYW1lKTsKKwkJRnVuY3Rpb248TWFwPFN0cmluZywgT2JqZWN0PiwgSW5wdXREZWZpbml0aW9uPiBmdW5jID0gbWFwIC0+IGNyZWF0ZU1vZHVsZUlucHV0KG1hcCk7CisKKwkJcmV0dXJuIGdldEVsZW1lbnRzKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uSU5QVVRTLCBlbGVtZW50R2VuQnlOYW1lLCBmdW5jKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPE1hcDxTdHJpbmcsIEF0dHJpYnV0ZURlZmluaXRpb24+LCBSZXN1bHRTdGF0dXNFbnVtPiBnZXRBdHRyaWJ1dGVzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uKSB7CisJCUZ1bmN0aW9uPFN0cmluZywgQXR0cmlidXRlRGVmaW5pdGlvbj4gZWxlbWVudEdlbkJ5TmFtZSA9IGVsZW1lbnROYW1lIC0+IGNyZWF0ZUF0dHJpYnV0ZShlbGVtZW50TmFtZSk7CisJCUZ1bmN0aW9uPE1hcDxTdHJpbmcsIE9iamVjdD4sIEF0dHJpYnV0ZURlZmluaXRpb24+IGZ1bmMgPSBtYXAgLT4gY3JlYXRlTW9kdWxlQXR0cmlidXRlKG1hcCk7CisKKwkJcmV0dXJuIGdldEVsZW1lbnRzKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uQVRUUklCVVRFUywgZWxlbWVudEdlbkJ5TmFtZSwgZnVuYyk7CisJfQorCisJcHVibGljIHN0YXRpYyA8RWxlbWVudERlZmluaXRpb24+IEVpdGhlcjxNYXA8U3RyaW5nLCBFbGVtZW50RGVmaW5pdGlvbj4sIFJlc3VsdFN0YXR1c0VudW0+IGdldEVsZW1lbnRzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bSBlbGVtZW50VGFnTmFtZSwgRnVuY3Rpb248U3RyaW5nLCBFbGVtZW50RGVmaW5pdGlvbj4gZWxlbWVudEdlbkJ5TmFtZSwKKwkJCUZ1bmN0aW9uPE1hcDxTdHJpbmcsIE9iamVjdD4sIEVsZW1lbnREZWZpbml0aW9uPiBmdW5jKSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBFbGVtZW50RGVmaW5pdGlvbj4sIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChSZXN1bHRTdGF0dXNFbnVtLkVMRU1FTlRfTk9UX0ZPVU5EKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IHRvc2NhQXR0cmlidXRlcyA9IGZpbmRGaXJzdFRvc2NhTWFwRWxlbWVudCh0b3NjYUpzb24sIGVsZW1lbnRUYWdOYW1lKTsKKwkJaWYgKHRvc2NhQXR0cmlidXRlcy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uQXR0cmlidXRlcyA9IHRvc2NhQXR0cmlidXRlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCU1hcDxTdHJpbmcsIEVsZW1lbnREZWZpbml0aW9uPiBtb2R1bGVBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8PigpOworCQkJSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBwcm9wZXJ0aWVzTmFtZVZhbHVlID0ganNvbkF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKHByb3BlcnRpZXNOYW1lVmFsdWUuaGFzTmV4dCgpKSB7CisJCQkJRW50cnk8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZU5hbWVWYWx1ZSA9IHByb3BlcnRpZXNOYW1lVmFsdWUubmV4dCgpOworCQkJCWlmIChhdHRyaWJ1dGVOYW1lVmFsdWUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIE1hcCkgeworCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQkJRWxlbWVudERlZmluaXRpb24gYXR0cmlidXRlID0gZnVuYy5hcHBseSgoTWFwPFN0cmluZywgT2JqZWN0PikgYXR0cmlidXRlTmFtZVZhbHVlLmdldFZhbHVlKCkpOworCQkJCQltb2R1bGVBdHRyaWJ1dGVzLnB1dChTdHJpbmcudmFsdWVPZihhdHRyaWJ1dGVOYW1lVmFsdWUuZ2V0S2V5KCkpLCBhdHRyaWJ1dGUpOworCQkJCX0gZWxzZSB7CisKKwkJCQkJRWxlbWVudERlZmluaXRpb24gZWxlbWVudCA9IGVsZW1lbnRHZW5CeU5hbWUuYXBwbHkoU3RyaW5nLnZhbHVlT2YoYXR0cmlidXRlTmFtZVZhbHVlLmdldFZhbHVlKCkpKTsKKworCQkJCQltb2R1bGVBdHRyaWJ1dGVzLnB1dChTdHJpbmcudmFsdWVPZihhdHRyaWJ1dGVOYW1lVmFsdWUuZ2V0S2V5KCkpLCBlbGVtZW50KTsKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKG1vZHVsZUF0dHJpYnV0ZXMuc2l6ZSgpID4gMCkgeworCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KG1vZHVsZUF0dHJpYnV0ZXMpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKworCX0KKworCXByaXZhdGUgc3RhdGljIEF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCUF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZURlZmluaXRpb24oKTsKKworCQlhdHRyaWJ1dGUuc2V0TmFtZShuYW1lKTsKKwkJcmV0dXJuIGF0dHJpYnV0ZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eURlZmluaXRpb24gY3JlYXRlUHJvcGVydGllcyhTdHJpbmcgbmFtZSkgeworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHkgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5LnNldERlZmF1bHRWYWx1ZShuYW1lKTsKKwkJcHJvcGVydHkuc2V0TmFtZShuYW1lKTsKKwkJcmV0dXJuIHByb3BlcnR5OworCX0KKworCXByaXZhdGUgc3RhdGljIElucHV0RGVmaW5pdGlvbiBjcmVhdGVJbnB1dHMoU3RyaW5nIG5hbWUpIHsKKwkJSW5wdXREZWZpbml0aW9uIGlucHV0ID0gbmV3IElucHV0RGVmaW5pdGlvbigpOworCisJCWlucHV0LnNldE5hbWUobmFtZSk7CisJCXJldHVybiBpbnB1dDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gZ2V0SGVhdFBhcmFtZXRlcnMoTWFwPFN0cmluZywgT2JqZWN0PiBoZWF0RGF0YSwgU3RyaW5nIGFydGlmYWN0VHlwZSkgeworCisJCUVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFJlc3VsdFN0YXR1c0VudW0uRUxFTUVOVF9OT1RfRk9VTkQpOworCQlFaXRoZXI8TWFwPFN0cmluZywgT2JqZWN0PiwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FQcm9wZXJ0aWVzID0gZmluZEZpcnN0VG9zY2FNYXBFbGVtZW50KGhlYXREYXRhLCBUb3NjYVRhZ05hbWVzRW51bS5QQVJBTUVURVJTKTsKKwkJaWYgKHRvc2NhUHJvcGVydGllcy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uUHJvcGVydGllcyA9IHRvc2NhUHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IG1vZHVsZVByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgT2JqZWN0Pj4gcHJvcGVydGllc05hbWVWYWx1ZSA9IGpzb25Qcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChwcm9wZXJ0aWVzTmFtZVZhbHVlLmhhc05leHQoKSkgeworCQkJCUVudHJ5PFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU5hbWVWYWx1ZSA9IHByb3BlcnRpZXNOYW1lVmFsdWUubmV4dCgpOworCQkJCWlmIChwcm9wZXJ0eU5hbWVWYWx1ZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJCWlmICghYXJ0aWZhY3RUeXBlLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKSkpIHsKKwkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJCQkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLCBSZXN1bHRTdGF0dXNFbnVtPiBwcm9wZXJ0eVN0YXR1cyA9IGNyZWF0ZU1vZHVsZUhlYXRQYXJhbWV0ZXIoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BlcnR5TmFtZVZhbHVlLmdldFZhbHVlKCkpOworCQkJCQkJaWYgKHByb3BlcnR5U3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocHJvcGVydHlTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCX0KKwkJCQkJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHByb3BlcnR5ID0gcHJvcGVydHlTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCQlwcm9wZXJ0eS5zZXROYW1lKFN0cmluZy52YWx1ZU9mKHByb3BlcnR5TmFtZVZhbHVlLmdldEtleSgpKSk7CisJCQkJCQltb2R1bGVQcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhZGRIZWF0UGFyYW1EZWZpbml0aW9uKG1vZHVsZVByb3BlcnRpZXMsIHByb3BlcnR5TmFtZVZhbHVlLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWFkZEhlYXRQYXJhbURlZmluaXRpb24obW9kdWxlUHJvcGVydGllcywgcHJvcGVydHlOYW1lVmFsdWUsIGZhbHNlKTsKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKG1vZHVsZVByb3BlcnRpZXMuc2l6ZSgpID4gMCkgeworCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KG1vZHVsZVByb3BlcnRpZXMpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSGVhdFBhcmFtRGVmaW5pdGlvbihMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBtb2R1bGVQcm9wZXJ0aWVzLCBFbnRyeTxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlOYW1lVmFsdWUsIGJvb2xlYW4gaXNKc29uKSB7CisJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHByb3BlcnR5ID0gbmV3IEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uKCk7CisJCU9iamVjdCB2YWx1ZSA9IHByb3BlcnR5TmFtZVZhbHVlLmdldFZhbHVlKCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0eS5zZXREZWZhdWx0VmFsdWUoaXNKc29uID8gbmV3IEdzb24oKS50b0pzb24odmFsdWUpLnRvU3RyaW5nKCkgOiBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVKYXZhKFN0cmluZy52YWx1ZU9mKHZhbHVlKSkpOworCQl9CisJCXByb3BlcnR5LnNldE5hbWUoU3RyaW5nLnZhbHVlT2YocHJvcGVydHlOYW1lVmFsdWUuZ2V0S2V5KCkpKTsKKwkJbW9kdWxlUHJvcGVydGllcy5hZGQocHJvcGVydHkpOworCX0KKworCXByaXZhdGUgc3RhdGljIEVpdGhlcjxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiwgUmVzdWx0U3RhdHVzRW51bT4gY3JlYXRlTW9kdWxlSGVhdFBhcmFtZXRlcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5VmFsdWUpIHsKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcHJvcGVydHlEZWYgPSBuZXcgSGVhdFBhcmFtZXRlckRlZmluaXRpb24oKTsKKwkJU3RyaW5nIHR5cGU7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3VsdFN0YXR1c0VudW0+IHByb3BlcnR5RmllbGRUeXBlID0gZmluZEZpcnN0VG9zY2FTdHJpbmdFbGVtZW50KHByb3BlcnR5VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUpOworCQlpZiAocHJvcGVydHlGaWVsZFR5cGUuaXNMZWZ0KCkpIHsKKwkJCXR5cGUgPSBwcm9wZXJ0eUZpZWxkVHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJCXByb3BlcnR5RGVmLnNldFR5cGUodHlwZSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFJlc3VsdFN0YXR1c0VudW0uSU5WQUxJRF9QUk9QRVJUWV9UWVBFKTsKKwkJfQorCQlFaXRoZXI8U3RyaW5nLCBSZXN1bHRTdGF0dXNFbnVtPiBwcm9wZXJ0eUZpZWxkRGVzY3JpcHRpb24gPSBmaW5kRmlyc3RUb3NjYVN0cmluZ0VsZW1lbnQocHJvcGVydHlWYWx1ZSwgVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04pOworCQlpZiAocHJvcGVydHlGaWVsZERlc2NyaXB0aW9uLmlzTGVmdCgpKSB7CisJCQlwcm9wZXJ0eURlZi5zZXREZXNjcmlwdGlvbihwcm9wZXJ0eUZpZWxkRGVzY3JpcHRpb24ubGVmdCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gcHJvcGVydHlGaWVsZERlZmF1bHRWYWwgPSBmaW5kVG9zY2FFbGVtZW50KHByb3BlcnR5VmFsdWUsIFRvc2NhVGFnTmFtZXNFbnVtLkRFRkFVTFRfVkFMVUUsIFRvc2NhRWxlbWVudFR5cGVFbnVtLkFMTCk7CisJCWlmIChwcm9wZXJ0eUZpZWxkRGVmYXVsdFZhbC5pc0xlZnQoKSkgeworCQkJaWYgKHByb3BlcnR5RmllbGREZWZhdWx0VmFsLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFJlc3VsdFN0YXR1c0VudW0uSU5WQUxJRF9QUk9QRVJUWV9WQUxVRSk7CisJCQl9CisJCQlPYmplY3QgdmFsdWUgPSBwcm9wZXJ0eUZpZWxkRGVmYXVsdFZhbC5sZWZ0KCkudmFsdWUoKTsKKwkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSB0eXBlLmVxdWFscyhIZWF0UGFyYW1ldGVyVHlwZS5KU09OLmdldFR5cGUoKSkgPyBuZXcgR3NvbigpLnRvSnNvbih2YWx1ZSkudG9TdHJpbmcoKSA6IFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZUphdmEoU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKKwkJCXByb3BlcnR5RGVmLnNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOworCQkJcHJvcGVydHlEZWYuc2V0Q3VycmVudFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocHJvcGVydHlEZWYpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5SnNvblN0cmluZ1ZhbHVlKE9iamVjdCB2YWx1ZSwgU3RyaW5nIHR5cGUpIHsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJVG9zY2FQcm9wZXJ0eVR5cGUgdmFsaWRUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUodHlwZSk7CisJCWlmICh2YWxpZFR5cGUgPT0gbnVsbCB8fCB2YWxpZFR5cGUuZXF1YWxzKFRvc2NhUHJvcGVydHlUeXBlLk1BUCkgfHwgdmFsaWRUeXBlLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5MSVNUKSkgeworCQkJcmV0dXJuIGdzb24udG9Kc29uKHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiByZW1vdmVzIGZyb20gSnNvbiBtYXAgKHRvc2NhSnNvbikgZmlyc3QgZWxlbWVudCBmb3VuZCBieSBuYW1lIChlbGVtZW50TmFtZSkgbm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNvdWxkIHVwZGF0ZSB0aGUgcmVjZWl2ZWQgYXJndW1lbnQgdG9zY2FKc29uCisJICogCisJICogQHBhcmFtIHRvc2NhSnNvbgorCSAqIEBwYXJhbSBlbGVtZW50TmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFbGVtZW50RnJvbUpzb25NYXAoTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24sIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHRvc2NhSnNvbi5lbnRyeVNldCgpKSB7CisJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJaWYgKGtleS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7CisJCQkJdG9zY2FKc29uLnJlbW92ZShlbGVtZW50TmFtZSk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworCQkJCXJlbW92ZUVsZW1lbnRGcm9tSnNvbk1hcCgoTWFwPFN0cmluZywgT2JqZWN0PikgdmFsdWUsIGVsZW1lbnROYW1lKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0c0J1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0c0J1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkxMTBlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9JbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLkRlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworLy9QYXZlbAorLy9jdXJyZW50bHkgTk9UIElOIFVTRSAtIHRoZXJlIGFyZSBubyBpbmZvcm1hdGlvbmFsIGRlcGxveWVkIGFydGlmYWN0cyBhZnRlciBVUzYwMTg4MCAKKworQG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQoImluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBJbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyB7CisKKwkvKgorCSAqIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5jbGFzcy4gZ2V0TmFtZSgpKTsKKwkgKiAKKwkgKiBAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZSBwcml2YXRlIEFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljOworCSAqIAorCSAqIHB1YmxpYyBib29sZWFuIGlzSW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0KEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8pIHsgbG9nLmRlYnVnKCJjaGVja2luZyBpZiBhcnRpZmFjdCB7fSBpcyBpbmZvcm1hdGlvbmFsRGVwbG95YWJsZSIsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKSk7IGJvb2xlYW4gaW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0ID0gZmFsc2U7IE1hcDxTdHJpbmcsCisJICogRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZz4gcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKSAuZ2V0UmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMoKTsgaWYoIHJlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzICE9IG51bGwgJiYKKwkgKiByZXNvdXJjZUluZm9ybWF0aW9uYWxEZXBsb3llZEFydGlmYWN0cy5jb250YWluc0tleShhcnRpZmFjdEluZm8uIGdldEFydGlmYWN0VHlwZSgpKSl7IGlmKCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSA9PSBBcnRpZmFjdEdyb3VwVHlwZUVudW0uSU5GT1JNQVRJT05BTCAmJiBhcnRpZmFjdEluZm8uY2hlY2tFc0lkRXhpc3QoKSl7IGluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdCA9IHRydWU7CisJICogCisJICogfSB9IFN0cmluZyBtZXNzYWdlID0gKGluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdCkgPyAiYXJ0aWZhY3Qge30gaXMgaW5mb3JtYXRpb25hbERlcGxveWFibGUiIDogImFydGlmYWN0IHt9IGlzIG5vdCBpbmZvcm1hdGlvbmFsRGVwbG95YWJsZSI7IGxvZy5kZWJ1ZyhtZXNzYWdlLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpOyByZXR1cm4gaW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0OyB9CisJICogCisJICogcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBcnRpZmFjdChib29sZWFuIGlzQ3JlYXRlLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBDb21wb25lbnQgcGFyZW50LCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSkgeworCSAqIAorCSAqIGxvZy5kZWJ1ZygiY2hlY2tpbmcgaWYgaW5mb3JtYXRpb25hbERlcGxveWFibGUgYXJ0aWZhY3Qge30gaXMgdmFsaWQgIiwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpKTsgV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2VGb3JtYXRXcmFwcGVyID0gbmV3IFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+KCk7IE1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+CisJICogcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS4gZ2V0UmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMoKTsKKwkgKiAKKwkgKiAKKwkgKiBhcnRpZmFjdEJ1c2luZXNzTG9naWMudmFsaWRhdGVBcnRpZmFjdFR5cGVFeGlzdHMocmVzcG9uc2VGb3JtYXRXcmFwcGVyLCBhcnRpZmFjdEluZm8pOyBpZiggcmVzcG9uc2VGb3JtYXRXcmFwcGVyLmlzRW1wdHkoKSAmJiBpc0NyZWF0ZSApeyBhcnRpZmFjdEJ1c2luZXNzTG9naWMudmFsaWRhdGVTaW5nbGVBcnRpZmFjdFR5cGUocmVzcG9uc2VGb3JtYXRXcmFwcGVyLAorCSAqIEFydGlmYWN0VHlwZUVudW0uZmluZFR5cGUoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpKSwgcGFyZW50LCBwYXJlbnRUeXBlKTsgfSBpZiggcmVzcG9uc2VGb3JtYXRXcmFwcGVyLmlzRW1wdHkoKSApeyBBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uZmluZFR5cGUoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpKTsKKwkgKiBhcnRpZmFjdEJ1c2luZXNzTG9naWMudmFsaWRhdGVGaWxlRXh0ZW5zaW9uKHJlc3BvbnNlRm9ybWF0V3JhcHBlciwgKCkgLT4gcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMuZ2V0KGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSApLCBhcnRpZmFjdEluZm8sIHBhcmVudFR5cGUsIGFydGlmYWN0VHlwZSk7IH0KKwkgKiAKKwkgKiBpZiggcmVzcG9uc2VGb3JtYXRXcmFwcGVyLmlzRW1wdHkoKSApeyB2YWxpZGF0ZVBheWxvYWRDb250ZW50KHJlc3BvbnNlRm9ybWF0V3JhcHBlciwgYXJ0aWZhY3RJbmZvKTsgfQorCSAqIAorCSAqIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2U7IGlmKCByZXNwb25zZUZvcm1hdFdyYXBwZXIuaXNFbXB0eSgpICl7IHJlc3BvbnNlID0gRWl0aGVyLmxlZnQodHJ1ZSk7IH0gZWxzZXsgcmVzcG9uc2UgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXRXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsgfQorCSAqIAorCSAqIFN0cmluZyBtZXNzYWdlID0gKHJlc3BvbnNlLmlzTGVmdCgpKSA/ICJpbmZvcm1hdGlvbmFsRGVwbG95YWJsZSBhcnRpZmFjdCB7fSBpcyB2YWxpZCIgOiAiaW5mb3JtYXRpb25hbERlcGxveWFibGUgYXJ0aWZhY3Qge30gaXMgbm90IHZhbGlkIjsgbG9nLmRlYnVnKG1lc3NhZ2UsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKSk7IHJldHVybiByZXNwb25zZTsgfQorCSAqIAorCSAqIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVBheWxvYWRDb250ZW50KFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlRm9ybWF0V3JhcHBlciwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0VG9WZXJpZnkpIHsgQXJ0aWZhY3RUeXBlRW51bSBhcnRpZmFjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLmZpbmRUeXBlKGFydGlmYWN0VG9WZXJpZnkuZ2V0QXJ0aWZhY3RUeXBlKCkpOyBpZiggYXJ0aWZhY3RUeXBlID09CisJICogQXJ0aWZhY3RUeXBlRW51bS5ZQU5HX1hNTCApeyBTdHJpbmcgcmF3UGF5bG9hZERhdGEgPSBhcnRpZmFjdFRvVmVyaWZ5LmdldFBheWxvYWREYXRhKCk7IFN0cmluZyB4bWxUb1BhcnNlID0gQmFzZTY0LmlzQmFzZTY0KHJhd1BheWxvYWREYXRhKSA/IG5ldyBTdHJpbmcob3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQuZGVjb2RlQmFzZTY0KHJhd1BheWxvYWREYXRhICkpIDogcmF3UGF5bG9hZERhdGE7CisJICogCisJICogYm9vbGVhbiBpc1htbFZhbGlkID0gYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljLmlzVmFsaWRYbWwoeG1sVG9QYXJzZS5nZXRCeXRlcygpKTsgaWYoICFpc1htbFZhbGlkICl7IFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLiBJTlZBTElEX1hNTCwKKwkgKiBhcnRpZmFjdFRvVmVyaWZ5LmdldEFydGlmYWN0VHlwZSgpKTsgcmVzcG9uc2VGb3JtYXRXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZUZvcm1hdCk7IGxvZy5kZWJ1ZygiWG1sIGlzIG5vdCB2YWxpZCBmb3IgYXJ0aWZhY3QgOiB7fSIsIGFydGlmYWN0VG9WZXJpZnkuZ2V0QXJ0aWZhY3ROYW1lKCkpOyB9IH0gfQorCSAqIAorCSAqIAorCSAqIAorCSAqIAorCSAqIHB1YmxpYyBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gZ2V0SW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzRm9yUmVzb3VyY2VJbnN0YW5jZSggQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSApIHsgU3RyaW5nIHJlc291cmNlVWlkID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKTsgU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlSW5zdGFuY2UuZ2V0Q29tcG9uZW50TmFtZSgpOworCSAqIHJldHVybiBnZXRJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHNGb3JSZXNvdXJjZShyZXNvdXJjZVVpZCwgcmVzb3VyY2VOYW1lKTsgfQorCSAqIAorCSAqIHByaXZhdGUgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGdldEluZm9ybWF0aW9uYWxEZXBsb3llZEFydGlmYWN0c0ZvclJlc291cmNlKCBTdHJpbmcgcmVzb3VyY2VVaWQsIFN0cmluZyByZXNvdXJjZU5hbWUpIHsgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGluZm9ybWF0aW9uYWxEZXBsb3llZEFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOyBsb2cuCisJICogZGVidWcoImNoZWNraW5nIGlmIGluZm9ybWF0aW9uYWxEZXBsb3lhYmxlIGFydGlmYWN0cyBleGlzdCBmb3IgcmVzb3VyY2Uge30gIiAsIHJlc291cmNlTmFtZSk7IE1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+IHJlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkgKiAuZ2V0UmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMoKTsKKwkgKiAKKwkgKiAKKwkgKiBFaXRoZXI8TWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQXJ0aWZhY3RzID0gYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljLmdldEFydGlmYWN0cyhyZXNvdXJjZVVpZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLklORk9STUFUSU9OQUwpOworCSAqIAorCSAqIGlmKCBlaXRoZXJBcnRpZmFjdHMuaXNMZWZ0KCkgJiYgcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMgIT0gbnVsbCApeyBQcmVkaWNhdGU8QXJ0aWZhY3REZWZpbml0aW9uPiBwcmVkaWNhdGUgPSBwIC0+IHJlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzLmNvbnRhaW5zS2V5KHAuZ2V0QXJ0aWZhY3RUeXBlKCkpICYmIHAuY2hlY2tFc0lkRXhpc3QoKSAmJgorCSAqIHAuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSA9PSBBcnRpZmFjdEdyb3VwVHlwZUVudW0uSU5GT1JNQVRJT05BTDsgaW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzID0gZWl0aGVyQXJ0aWZhY3RzLmxlZnQoKS52YWx1ZSgpLnZhbHVlcygpLnN0cmVhbSgpLmZpbHRlciggcHJlZGljYXRlICkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsgfQorCSAqIAorCSAqIGlmKCBpbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMuaXNFbXB0eSgpICl7IGxvZy5kZWJ1Zygibm8gaW5mb3JtYXRpb25hbERlcGxveWFibGUgYXJ0aWZhY3RzIGV4aXN0IGZvciByZXNvdXJjZSB7fSAiLCByZXNvdXJjZU5hbWUpOyB9IGVsc2V7IGxvZy4gZGVidWcoImluZm9ybWF0aW9uYWxEZXBsb3lhYmxlIGFydGlmYWN0cyBmb3VuZCBmb3IgcmVzb3VyY2Uge30gYXJlIDp7fSIsIHJlc291cmNlTmFtZSwKKwkgKiBpbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMudG9TdHJpbmcoKSk7IH0KKwkgKiAKKwkgKiAKKwkgKiByZXR1cm4gaW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzOyB9CisJICogCisJICogcHVibGljIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBnZXRBbGxEZXBsb3lhYmxlQXJ0aWZhY3RzKCBSZXNvdXJjZSByZXNvdXJjZSApeyBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gbWVyZ2VkID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdERlZmluaXRpb24+KCk7CisJICogCisJICogTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHMgPSBhcnRpZmFjdEJ1c2luZXNzTG9naWMuZ2V0RGVwbG95bWVudEFydGlmYWN0cyhyZXNvdXJjZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsgbWVyZ2VkLmFkZEFsbChkZXBsb3ltZW50QXJ0aWZhY3RzKTsKKwkgKiAKKwkgKiBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gaW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzRm9yUmVzb3VyY2UgPSBnZXRJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHNGb3JSZXNvdXJjZSggcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsgbWVyZ2VkLmFkZEFsbChpbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHNGb3JSZXNvdXJjZSk7CisJICogCisJICogcmV0dXJuIG1lcmdlZDsgfQorCSAqLworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9JbnB1dHNCdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0lucHV0c0J1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDA2MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9JbnB1dHNCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSw1MjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdElucHV0c01hcDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUlucHV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklucHV0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5JbnB1dHNPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuUHJvcGVydHlWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5JbnB1dHNEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImlucHV0c0J1c2luZXNzTG9naWMiKQorcHVibGljIGNsYXNzIElucHV0c0J1c2luZXNzTG9naWMgZXh0ZW5kcyBCYXNlQnVzaW5lc3NMb2dpYyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0lOUFVUID0gIkNyZWF0ZUlucHV0IjsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbnB1dHNCdXNpbmVzc0xvZ2ljLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb24gPSBudWxsOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElucHV0c09wZXJhdGlvbiBpbnB1dHNPcGVyYXRpb24gPSBudWxsOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uID0gbnVsbDsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHM7CisKKwkvKioKKwkgKiBhc3NvY2lhdGUgaW5wdXRzIHRvIGEgZ2l2ZW4gY29tcG9uZW50IHdpdGggcGFnaW5nCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudElkCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEBwYXJhbSBmcm9tSWQKKwkgKiBAcGFyYW0gYW1vdW50CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZ2V0SW5wdXRzKFN0cmluZyB1c2VySWQsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGZyb21OYW1lLAorCQkJaW50IGFtb3VudCkgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJnZXQgSW5wdXRzIiwgZmFsc2UpOworCisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbnB1dHNFaXRoZXJSZXMgPSBpbnB1dHNPcGVyYXRpb24KKwkJCQkuZ2V0SW5wdXRzT2ZDb21wb25lbnQoY29tcG9uZW50SWQsIGZyb21OYW1lLCBhbW91bnQpOworCQlpZiAoaW5wdXRzRWl0aGVyUmVzLmlzUmlnaHQoKSkgeworCQkJaWYgKGlucHV0c0VpdGhlclJlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgQXJyYXlMaXN0PElucHV0RGVmaW5pdGlvbj4oKSk7CisJCQl9CisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGlucHV0c0VpdGhlclJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGlucHV0cyB1bmRlciBjb21wb25lbnQge30sIGVycm9yOiB7fSIsIGNvbXBvbmVudElkLCBhY3Rpb25TdGF0dXMubmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW5wdXRzRWl0aGVyUmVzLmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCS8qKgorCSAqIGFzc29jaWF0ZSBwcm9wZXJ0aWVzIHRvIGEgZ2l2ZW4gY29tcG9uZW50IGluc3RhbmNlIGlucHV0CisJICogCisJICogQHBhcmFtIGluc3RhbmNlSWQKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHBhcmFtIGlucHV0SWQKKwkgKiBAcmV0dXJuCisJICovCisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFJlc3BvbnNlRm9ybWF0PiBnZXRDb21wb25lbnRJbnN0YW5jZVByb3BlcnRpZXNCeUlucHV0SWQoCisJCQlTdHJpbmcgdXNlcklkLCBTdHJpbmcgaW5zdGFuY2VJZCwgU3RyaW5nIGlucHV0SWQpIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBQcm9wZXJ0aWVzIGJ5IGlucHV0IiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHByb3BlcnRpZXNFaXRoZXJSZXMgPSBpbnB1dHNPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0aWVzQnlJbnB1dElkKGluc3RhbmNlSWQsIGlucHV0SWQpOworCQlpZiAocHJvcGVydGllc0VpdGhlclJlcy5pc1JpZ2h0KCkpIHsKKworCQkJaWYgKHByb3BlcnRpZXNFaXRoZXJSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpKTsKKwkJCX0KKworCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShwcm9wZXJ0aWVzRWl0aGVyUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgaW5wdXRzIHVuZGVyIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwgaW5zdGFuY2VJZCwgYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHByb3BlcnRpZXNFaXRoZXJSZXMubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+LCBSZXNwb25zZUZvcm1hdD4gZ2V0SW5wdXRzRm9yQ29tcG9uZW50SW5wdXQoU3RyaW5nIHVzZXJJZCwKKwkJCVN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGlucHV0SWQpIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBJbnB1dHMgYnkgaW5wdXQiLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaW5wdXRzRWl0aGVyUmVzID0gaW5wdXRzT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzQnlJbnB1dElkKGNvbXBvbmVudElkLCBpbnB1dElkKTsKKwkJaWYgKGlucHV0c0VpdGhlclJlcy5pc1JpZ2h0KCkpIHsKKworCQkJaWYgKGlucHV0c0VpdGhlclJlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+KCkpOworCQkJfQorCisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGlucHV0c0VpdGhlclJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGlucHV0cyBmb3IgaW5wdXQgdW5kZXIgY29tcG9uZW50IHt9LCBlcnJvcjoge30iLCBjb21wb25lbnRJZCwgYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGlucHV0c0VpdGhlclJlcy5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8SW5wdXREZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU11bHRpcGxlSW5wdXRzKFN0cmluZyB1c2VySWQsIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIENvbXBvbmVudEluc3RJbnB1dHNNYXAgY29tcG9uZW50SW5zdElucHV0c01hcFVpLCBib29sZWFuIHNob3VsZExvY2tDb21wLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8SW5wdXREZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQl0cnkgeworCQkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBQcm9wZXJ0aWVzIGJ5IGlucHV0IiwgZmFsc2UpOworCisJCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVVzZXIgdXNlciA9IHJlc3AubGVmdCgpLnZhbHVlKCk7CisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuZGlzYWJsZUFsbCgpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlR3JvdXBzKGZhbHNlKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUFydGlmYWN0cyhmYWxzZSk7CisJCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVVc2VycyhmYWxzZSk7CisKKwkJCUVpdGhlcjw/IGV4dGVuZHMgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudEV4aXN0cygKKwkJCQkJY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCB1c2VySWQsIG51bGwsIHVzZXIpOworCisJCQlpZiAodmFsaWRhdGVDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpOworCisJCQlpZiAoc2hvdWxkTG9ja0NvbXApIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KGNvbXBvbmVudCwgQ1JFQVRFX0lOUFVUKTsKKwkJCQlpZiAobG9ja0NvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gY2FuV29yayA9IHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50KGNvbXBvbmVudCwgdXNlcklkKTsKKwkJCWlmIChjYW5Xb3JrLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjYW5Xb3JrLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhbGxEYXRhVHlwZXMgPSBnZXRBbGxEYXRhVHlwZXMoCisJCQkJCWFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZSk7CisJCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcyA9IGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKTsKKworCQkJRWl0aGVyPExpc3Q8SW5wdXREZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlSW5wdXRzUmVzdWx0ID0gdGhpcy5pbnB1dHNPcGVyYXRpb24KKwkJCQkJLmFkZElucHV0c1RvQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCksIGNvbXBvbmVudEluc3RJbnB1dHNNYXBVaSwKKwkJCQkJCQlkYXRhVHlwZXMpOworCisJCQlpZiAoY3JlYXRlSW5wdXRzUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMKKwkJCQkJCS5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShjcmVhdGVJbnB1dHNSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgaW5wdXRzIHVuZGVyIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwgY29tcG9uZW50SWQsIGFjdGlvblN0YXR1cy5uYW1lKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKworCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoY3JlYXRlSW5wdXRzUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBjcmVhdGUgZ3JvdXAuIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCisJCQl9CisJCQkvLyB1bmxvY2sgcmVzb3VyY2UKKwkJCWlmIChzaG91bGRMb2NrQ29tcCAmJiBjb21wb25lbnQgIT0gbnVsbCkgeworCQkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKSk7CisJCQl9CisKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PElucHV0RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVJbnB1dHMoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLAorCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0c0RlZmluaXRpb25zLCBib29sZWFuIHNob3VsZExvY2tDb21wLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8SW5wdXREZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCXRyeSB7CisKKwkJCWlmIChpbnB1dHNEZWZpbml0aW9ucyAhPSBudWxsICYmIGZhbHNlID09IGlucHV0c0RlZmluaXRpb25zLmlzRW1wdHkoKSkgeworCisJCQkJaWYgKHNob3VsZExvY2tDb21wID09IHRydWUgJiYgaW5UcmFuc2FjdGlvbiA9PSB0cnVlKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiY3JlYXRlR3JvdXBzIiwKKwkJCQkJCQkiQ2Fubm90IGxvY2sgY29tcG9uZW50IHNpbmNlIHdlIGFyZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQkvLyBDYW5ub3QgbG9jayBjb21wb25lbnQgc2luY2Ugd2UgYXJlIGluIGEgbWlkZGxlIG9mIGFub3RoZXIKKwkJCQkJLy8gdHJhbnNhY3Rpb24uCisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyRXhpc3RzID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgQ1JFQVRFX0lOUFVULCB0cnVlKTsKKwkJCQlpZiAodmFsaWRhdGVVc2VyRXhpc3RzLmlzUmlnaHQoKSkgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVVc2VyRXhpc3RzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCisJCQkJVXNlciB1c2VyID0gdmFsaWRhdGVVc2VyRXhpc3RzLmxlZnQoKS52YWx1ZSgpOworCisJCQkJRWl0aGVyPD8gZXh0ZW5kcyBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbXBvbmVudCA9IHZhbGlkYXRlQ29tcG9uZW50RXhpc3RzKAorCQkJCQkJY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUsIGluVHJhbnNhY3Rpb24sIGZhbHNlKTsKKwkJCQlpZiAodmFsaWRhdGVDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCQljb21wb25lbnQgPSB2YWxpZGF0ZUNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCWlmIChzaG91bGRMb2NrQ29tcCkgeworCQkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tDb21wb25lbnQgPSBsb2NrQ29tcG9uZW50KGNvbXBvbmVudCwgQ1JFQVRFX0lOUFVUKTsKKwkJCQkJaWYgKGxvY2tDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gY2FuV29yayA9IHZhbGlkYXRlQ2FuV29ya09uQ29tcG9uZW50KGNvbXBvbmVudCwgdXNlcklkKTsKKwkJCQlpZiAoY2FuV29yay5pc1JpZ2h0KCkpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNhbldvcmsucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQlyZXN1bHQgPSBjcmVhdGVJbnB1dHNJbkdyYXBoKGlucHV0c0RlZmluaXRpb25zLCBjb21wb25lbnQsIHVzZXIsIGluVHJhbnNhY3Rpb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGNyZWF0ZSBncm91cC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKworCQkJfQorCQkJLy8gdW5sb2NrIHJlc291cmNlCisJCQlpZiAoc2hvdWxkTG9ja0NvbXAgJiYgY29tcG9uZW50ICE9IG51bGwpIHsKKwkJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCkpOworCQkJfQorCisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlSW5wdXRzSW5HcmFwaChMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzRGVmaW5pdGlvbnMsCisJCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBVc2VyIHVzZXIsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0OworCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzID0gbmV3IEFycmF5TGlzdDxJbnB1dERlZmluaXRpb24+KCk7CisJCWZvciAoSW5wdXREZWZpbml0aW9uIGlucHV0RGVmaW5pdGlvbiA6IGlucHV0c0RlZmluaXRpb25zKSB7CisJCQkvLyBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGlucHV0TmFtZSwgSW5wdXREZWZpbml0aW9uCisJCQkvLyBuZXdJbnB1dERlZmluaXRpb24sIFN0cmluZyB1c2VySWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbgorCQkJRWl0aGVyPElucHV0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUlucHV0ID0gY3JlYXRlSW5wdXQoY29tcG9uZW50LCB1c2VyLAorCQkJCQljb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLCBpbnB1dERlZmluaXRpb24uZ2V0TmFtZSgpLCBpbnB1dERlZmluaXRpb24sIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGNyZWF0ZUlucHV0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBncm91cCB7fS4iLCBjcmVhdGVJbnB1dCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNyZWF0ZUlucHV0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUlucHV0RGVmaW5pdGlvbiBjcmVhdGVkR3JvdXAgPSBjcmVhdGVJbnB1dC5sZWZ0KCkudmFsdWUoKTsKKwkJCWlucHV0cy5hZGQoY3JlYXRlZEdyb3VwKTsKKwkJfQorCQlyZXN1bHQgPSBFaXRoZXIubGVmdChpbnB1dHMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIERlbGV0ZSBpbnB1dCBmcm9tIHNlcnZpY2UKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQHBhcmFtIHVzZXIKKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZQorCSAqIEBwYXJhbSBpbnB1dElkCisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxJbnB1dERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVJbnB1dChTdHJpbmcgY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgaW5wdXRJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJbG9nLmRlYnVnKCJHb2luZyB0byBkZWxldGUgaW5wdXQgaWQ6IHt9IiwgaW5wdXRJZCk7CisKKwkJLy8gVmFsaWRhdGUgdXNlciAoZXhpc3RzKQorCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHVzZXJFaXRoZXIgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiRGVsZXRlIGlucHV0IiwgdHJ1ZSk7CisJCWlmICh1c2VyRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh1c2VyRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQkvLyBHZXQgY29tcG9uZW50IHVzaW5nIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkCisJCUVpdGhlcjxvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEVpdGhlciA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0Q29tcG9uZW50KGNvbXBvbmVudElkLCB0cnVlKTsKKwkJaWYgKGNvbXBvbmVudEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShjb21wb25lbnRFaXRoZXIucmlnaHQoKS52YWx1ZSgpKSkpOworCQl9CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQgPSBjb21wb25lbnRFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gVmFsaWRhdGUgaW5wdXRJZCBpcyBjaGlsZCBvZiB0aGUgY29tcG9uZW50CisJCS8vIEFuZCBnZXQgdGhlIGlucHV0RGVmaW5pdGlvbiBmb3IgdGhlIHJlc3BvbnNlCisJCUlucHV0RGVmaW5pdGlvbiBpbnB1dERlZmluaXRpb24gPSBudWxsOworCQlPcHRpb25hbDxJbnB1dERlZmluaXRpb24+IG9wdGlvbmFsSW5wdXQgPSBjb21wb25lbnQuZ2V0SW5wdXRzKCkuc3RyZWFtKCkuCisJCS8vIGZpbHRlciBieSBJRAorCQkJCWZpbHRlcihpbnB1dCAtPiBpbnB1dC5nZXRVbmlxdWVJZCgpLmVxdWFscyhpbnB1dElkKSkuCisJCQkJLy8gR2V0IHRoZSBpbnB1dAorCQkJCWZpbmRBbnkoKTsKKwkJaWYgKG9wdGlvbmFsSW5wdXQuaXNQcmVzZW50KCkpIHsKKwkJCWlucHV0RGVmaW5pdGlvbiA9IG9wdGlvbmFsSW5wdXQuZ2V0KCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5QVVRfSVNfTk9UX0NISUxEX09GX0NPTVBPTkVOVCwgaW5wdXRJZCwgY29tcG9uZW50SWQpKTsKKwkJfQorCisJCS8vIExvY2sgY29tcG9uZW50CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja1Jlc3VsdEVpdGhlciA9IGxvY2tDb21wb25lbnQoY29tcG9uZW50SWQsIGNvbXBvbmVudCwgImRlbGV0ZUlucHV0Iik7CisJCWlmIChsb2NrUmVzdWx0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBsb2NrUmVzdWx0RWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJLy8gRGVsZXRlIGlucHV0IG9wZXJhdGlvbnMKKwkJRWl0aGVyPFN0cmluZywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlRWl0aGVyID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCXRyeSB7CisJCQlkZWxldGVFaXRoZXIgPSBpbnB1dHNPcGVyYXRpb24uZGVsZXRlSW5wdXQoaW5wdXRJZCk7CisJCQlpZiAoZGVsZXRlRWl0aGVyLmlzUmlnaHQoKSl7CisJCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgaWQ6IHt9IGRlbGV0ZSBpbnB1dCBpZDoge30gZmFpbGVkIiwgY29tcG9uZW50SWQsIGlucHV0SWQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShkZWxldGVFaXRoZXIucmlnaHQoKS52YWx1ZSgpKSwgY29tcG9uZW50LmdldE5hbWUoKSkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGlucHV0RGVmaW5pdGlvbik7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZGVsZXRlRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IGlkOiB7fSBkZWxldGUgaW5wdXQgaWQ6IHt9IGZhaWxlZCIsIGNvbXBvbmVudElkLCBpbnB1dElkKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgaWQ6IHt9IGRlbGV0ZSBpbnB1dCBpZDoge30gc3VjY2VzcyIsIGNvbXBvbmVudElkLCBpbnB1dElkKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCQl1bmxvY2tDb21wb25lbnQoZGVsZXRlRWl0aGVyLCBjb21wb25lbnQpOworCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlIG5ldyBwcm9wZXJ0eSBvbiByZXNvdXJjZSBpbiBncmFwaAorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUlkCisJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCSAqIEBwYXJhbSBuZXdQcm9wZXJ0eURlZmluaXRpb24KKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHJldHVybiBFaXRoZXI8UHJvcGVydHlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+CisJICovCisKKwlwcml2YXRlIEVpdGhlcjxJbnB1dERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVJbnB1dChvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LAorCQkJVXNlciB1c2VyLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgaW5wdXROYW1lLCBJbnB1dERlZmluaXRpb24gbmV3SW5wdXREZWZpbml0aW9uLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPElucHV0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gY3JlYXRlIGlucHV0IHt9IiwgbmV3SW5wdXREZWZpbml0aW9uKTsKKworCQl0cnkgeworCisJCQkvLyB2ZXJpZnkgcHJvcGVydHkgbm90IGV4aXN0IGluIHJlc291cmNlCisJCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gcmVzb3VyY2VQcm9wZXJ0aWVzID0gY29tcG9uZW50LmdldElucHV0cygpOworCisJCQlpZiAocmVzb3VyY2VQcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCQlpZiAoaW5wdXRzT3BlcmF0aW9uLmlzSW5wdXRFeGlzdChyZXNvdXJjZVByb3BlcnRpZXMsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBpbnB1dE5hbWUpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5QUk9QRVJUWV9BTFJFQURZX0VYSVNULCAiIikpOworCQkJCX0KKwkJCX0KKworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhbGxEYXRhVHlwZXMgPSBnZXRBbGxEYXRhVHlwZXMoCisJCQkJCWFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZSk7CisJCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzID0gYWxsRGF0YVR5cGVzLmxlZnQoKS52YWx1ZSgpOworCisJCQkvLyB2YWxpZGF0ZSBpbnB1dCBkZWZhdWx0IHZhbHVlcworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBkZWZhdWx0VmFsdWVzVmFsaWRhdGlvbiA9IHZhbGlkYXRlUHJvcGVydHlEZWZhdWx0VmFsdWUobmV3SW5wdXREZWZpbml0aW9uLAorCQkJCQlkYXRhVHlwZXMpOworCQkJaWYgKGRlZmF1bHRWYWx1ZXNWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZGVmYXVsdFZhbHVlc1ZhbGlkYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCS8vIGNvbnZlcnQgcHJvcGVydHkKKwkJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBnZXRUeXBlKG5ld0lucHV0RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQkJUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0eXBlLmdldENvbnZlcnRlcigpOworCQkJLy8gZ2V0IGlubmVyIHR5cGUKKwkJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQkJaWYgKG5ld0lucHV0RGVmaW5pdGlvbiAhPSBudWxsKSB7CisJCQkJU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWEgPSBuZXdJbnB1dERlZmluaXRpb24uZ2V0U2NoZW1hKCk7CisJCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7CisJCQkJCVByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcCA9IHNjaGVtYS5nZXRQcm9wZXJ0eSgpOworCQkJCQlpZiAocHJvcCAhPSBudWxsKSB7CisJCQkJCQlpbm5lclR5cGUgPSBwcm9wLmdldFR5cGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlTdHJpbmcgY29udmVydGVkVmFsdWUgPSBudWxsOworCQkJCWlmIChuZXdJbnB1dERlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlci5jb252ZXJ0KG5ld0lucHV0RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSwgaW5uZXJUeXBlLAorCQkJCQkJCWFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCW5ld0lucHV0RGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoY29udmVydGVkVmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gYWRkIHRoZSBuZXcgcHJvcGVydHkgdG8gcmVzb3VyY2Ugb24gZ3JhcGgKKwkJCS8vIG5lZWQgdG8gZ2V0IFN0b3JhZ2VPcGFlcmF0aW9uU3RhdHVzIGFuZCBjb252ZXJ0IHRvIEFjdGlvblN0YXR1cworCQkJLy8gZnJvbSBjb21wb25lbnRzVXRpbHMKKwkJCUVpdGhlcjxJbnB1dHNEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBpbnB1dHNPcGVyYXRpb24uYWRkSW5wdXQoaW5wdXROYW1lLCBuZXdJbnB1dERlZmluaXRpb24sCisJCQkJCWNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCkpOworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdCgKKwkJCQkJCWNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShlaXRoZXIucmlnaHQoKS52YWx1ZSgpKSwgY29tcG9uZW50LmdldE5hbWUoKSkpOworCQkJfQorCQkJLy8gQFRPRE8gY29tbWl0CisJCQkvLyBpbnB1dHNPcGVyYXRpb24uZ2V0VGl0YW5HZW5lcmljRGFvKCkuY29tbWl0KCk7CisJCQlJbnB1dERlZmluaXRpb24gY3JlYXRlZElucHV0eURlZmluaXRpb24gPSBpbnB1dHNPcGVyYXRpb24KKwkJCQkJLmNvbnZlcnRJbnB1dERhdGFUb0lucHV0RGVmaW5pdGlvbihlaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJY3JlYXRlZElucHV0eURlZmluaXRpb24uc2V0TmFtZShpbnB1dE5hbWUpOworCQkJY3JlYXRlZElucHV0eURlZmluaXRpb24uc2V0UGFyZW50VW5pcXVlSWQoY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlZElucHV0eURlZmluaXRpb24pOworCisJCX0gZmluYWxseSB7CisKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gY3JlYXRlIGdyb3VwLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGNyZWF0ZSBncm91cC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKworCQkJfQorCisJCX0KKworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA5ODBiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9JbnRlcmZhY2VMaWZlY3ljbGVUeXBlSW1wb3J0TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JbnRlcmZhY2VEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJpbnRlcmZhY2VMaWZlY3ljbGVUeXBlSW1wb3J0TWFuYWdlciIpCitwdWJsaWMgY2xhc3MgSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXIgeworCisJQFJlc291cmNlCisJcHJpdmF0ZSBJSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbjsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIENvbW1vbkltcG9ydE1hbmFnZXIgY29tbW9uSW1wb3J0TWFuYWdlcjsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbnRlcmZhY2VMaWZlY3ljbGVUeXBlSW1wb3J0TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIEVpdGhlcjxMaXN0PEludGVyZmFjZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlTGlmZWN5Y2xlVHlwZXMoU3RyaW5nIGludGVyZmFjZUxpZmVjeWNsZVR5cGVzWW1sKSB7CisKKwkJRWl0aGVyPExpc3Q8SW50ZXJmYWNlRGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gaW50ZXJmYWNlcyA9IGNyZWF0ZUxpZmVjeWNseVR5cGVGcm9tWW1sKGludGVyZmFjZUxpZmVjeWNsZVR5cGVzWW1sKTsKKwkJaWYgKGludGVyZmFjZXMuaXNSaWdodCgpKSB7CisJCQlBY3Rpb25TdGF0dXMgc3RhdHVzID0gaW50ZXJmYWNlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5R3JvdXBUeXBlKHN0YXR1cywgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gY3JlYXRlSW50ZXJmYWNlc0J5RGFvKGludGVyZmFjZXMubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxJbnRlcmZhY2VEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVMaWZlY3ljbHlUeXBlRnJvbVltbChTdHJpbmcgaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXNZbWwpIHsKKwkJcmV0dXJuIGNvbW1vbkltcG9ydE1hbmFnZXIuY3JlYXRlRWxlbWVudFR5cGVzRnJvbVltbChpbnRlcmZhY2VMaWZlY3ljbGVUeXBlc1ltbCwgKGxpZmVjeWNsZVR5cGVOYW1lLCBsaWZlY3ljbGVUeXBlSnNvbkRhdGEpIC0+IGNyZWF0ZUxpZmVjeWNsZVR5cGUobGlmZWN5Y2xlVHlwZU5hbWUsIGxpZmVjeWNsZVR5cGVKc29uRGF0YSkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxJbnRlcmZhY2VEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUludGVyZmFjZXNCeURhbyhMaXN0PEludGVyZmFjZURlZmluaXRpb24+IGludGVyZmFjZXNUb0NyZWF0ZSkgeworCQlMaXN0PEludGVyZmFjZURlZmluaXRpb24+IGNyZWF0ZWRJbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVpdGhlcjxMaXN0PEludGVyZmFjZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQoY3JlYXRlZEludGVyZmFjZXMpOworCQlJdGVyYXRvcjxJbnRlcmZhY2VEZWZpbml0aW9uPiBpbnRlcmZhY2VJdHIgPSBpbnRlcmZhY2VzVG9DcmVhdGUuaXRlcmF0b3IoKTsKKwkJYm9vbGVhbiBzdG9wRGFvID0gZmFsc2U7CisJCXdoaWxlIChpbnRlcmZhY2VJdHIuaGFzTmV4dCgpICYmICFzdG9wRGFvKSB7CisJCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZiA9IGludGVyZmFjZUl0ci5uZXh0KCk7CisKKwkJCWxvZy5pbmZvKCJzZW5kIGludGVyZmFjZURlZmluaXRpb24ge30gdG8gZGFvIGZvciBjcmVhdGUiLCBpbnRlcmZhY2VEZWYuZ2V0VHlwZSgpKTsKKworCQkJRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRhdGFNb2RlbFJlc3BvbnNlID0gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmNyZWF0ZUludGVyZmFjZVR5cGUoaW50ZXJmYWNlRGVmKTsKKwkJCWlmIChkYXRhTW9kZWxSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuaW5mbygiZmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2UgOiB7fSAgZXJyb3I6IHt9IiwgaW50ZXJmYWNlRGVmLmdldFR5cGUoKSwgZGF0YU1vZGVsUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJaWYgKGRhdGFNb2RlbFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlNDSEVNQV9WSU9MQVRJT04pIHsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yTGlmZWN5Y2xlVHlwZShkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpLCBpbnRlcmZhY2VEZWYuZ2V0VHlwZSgpKTsKKwkJCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJc3RvcERhbyA9IHRydWU7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWNyZWF0ZWRJbnRlcmZhY2VzLmFkZChkYXRhTW9kZWxSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCQlpZiAoIWludGVyZmFjZUl0ci5oYXNOZXh0KCkpIHsKKwkJCQlsb2cuaW5mbygibGlmZWN5Y2xlIHR5cGVzIHdlcmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkhISEiKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCX0KKworCXByaXZhdGUgSW50ZXJmYWNlRGVmaW5pdGlvbiBjcmVhdGVMaWZlY3ljbGVUeXBlKFN0cmluZyBpbnRlcmZhY2VEZWZpbml0aW9uLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbikgeworCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZiA9IG5ldyBJbnRlcmZhY2VEZWZpbml0aW9uKCk7CisJCWludGVyZmFjZURlZi5zZXRUeXBlKGludGVyZmFjZURlZmluaXRpb24pOworCisJCU1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3BlcmF0aW9uPigpOworCisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHRvc2NhSnNvbi5lbnRyeVNldCgpKSB7CisJCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbigpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcFByb3AgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJb3BlcmF0aW9uLnNldERlc2NyaXB0aW9uKChTdHJpbmcpIG9wUHJvcC5nZXQoImRlc2NyaXB0aW9uIikpOworCQkJb3BlcmF0aW9ucy5wdXQoZW50cnkuZ2V0S2V5KCksIG9wZXJhdGlvbik7CisJCX0KKwkJaW50ZXJmYWNlRGVmLnNldE9wZXJhdGlvbnMob3BlcmF0aW9ucyk7CisJCXJldHVybiBpbnRlcmZhY2VEZWY7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldExvZyhMb2dnZXIgbG9nKSB7CisJCUludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyLmxvZyA9IGxvZzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvTW9uaXRvcmluZ0J1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvTW9uaXRvcmluZ0J1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTcwOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Nb25pdG9yaW5nQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uaW1wbC5Nb25pdG9yaW5nRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5tb25pdG9yaW5nLk1vbml0b3JpbmdFdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoIm1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBNb25pdG9yaW5nQnVzaW5lc3NMb2dpYyB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTW9uaXRvcmluZ0J1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBNb25pdG9yaW5nRGFvIG1vbml0b3JpbmdEYW87CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvZ01vbml0b3JpbmdFdmVudChNb25pdG9yaW5nRXZlbnQgbW9uaXRvcmluZ0V2ZW50KSB7CisJCWlmIChtb25pdG9yaW5nRGFvID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwkJQWN0aW9uU3RhdHVzIHN0YXR1cyA9IG1vbml0b3JpbmdEYW8uYWRkUmVjb3JkKG1vbml0b3JpbmdFdmVudCk7CisJCWlmICghc3RhdHVzLmVxdWFscyhBY3Rpb25TdGF0dXMuT0spKSB7CisJCQlsb2cud2FybigiRmFpbGVkIHRvIHBlcnNpc3QgbW9uaXRvcmluZyBldmVudDoge30iLCBzdGF0dXMubmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RXNIb3N0KCkgeworCisJCVN0cmluZyByZXMgPSBtb25pdG9yaW5nRGFvLmdldEVzSG9zdCgpOworCQlyZXMgPSByZXMucmVwbGFjZUFsbCgiW1xcW1xcXV0iLCAiIik7CisJCXJlcyA9IHJlcy5zcGxpdCgiLCIpWzBdOworCQlyZXMgPSByZXMucmVwbGFjZUFsbCgiWyddIiwgIiIpOworCQlyZXMgPSByZXMuc3BsaXQoIjoiKVswXTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVzUG9ydCgpIHsKKwkJcmV0dXJuIG1vbml0b3JpbmdEYW8uZ2V0RXNQb3J0KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1BvbGljeVR5cGVJbXBvcnRNYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1BvbGljeVR5cGVJbXBvcnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwNjcwZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUG9saWN5VHlwZUltcG9ydE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Db21tb25JbXBvcnRNYW5hZ2VyLkVsZW1lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW1wb3J0VXRpbHMuVG9zY2FUYWdOYW1lc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUG9saWN5VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUdyb3VwT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklQb2xpY3lUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoInBvbGljeVR5cGVJbXBvcnRNYW5hZ2VyIikKK3B1YmxpYyBjbGFzcyBQb2xpY3lUeXBlSW1wb3J0TWFuYWdlciB7CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCUBSZXNvdXJjZQorCXByaXZhdGUgSVBvbGljeVR5cGVPcGVyYXRpb24gcG9saWN5VHlwZU9wZXJhdGlvbjsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHM7CisJQFJlc291cmNlCisJcHJpdmF0ZSBJUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBJR3JvdXBPcGVyYXRpb24gZ3JvdXBPcGVyYXRpb247CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIENvbW1vbkltcG9ydE1hbmFnZXIgY29tbW9uSW1wb3J0TWFuYWdlcjsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBCb29sZWFuPj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVQb2xpY3lUeXBlcyhTdHJpbmcgZ3JvdXBUeXBlc1ltbCkgeworCQlyZXR1cm4gY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXMoZ3JvdXBUeXBlc1ltbCwgZWxlbWVudFR5cGVZbWwgLT4gY3JlYXRlUG9saWN5VHlwZXNGcm9tWW1sKGVsZW1lbnRUeXBlWW1sKSwgZ3JvdXBUeXBlc0xpc3QgLT4gY3JlYXRlUG9saWN5VHlwZXNCeURhbyhncm91cFR5cGVzTGlzdCksIEVsZW1lbnRUeXBlRW51bS5Qb2xpY3lUeXBlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PFBvbGljeVR5cGVEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVQb2xpY3lUeXBlc0Zyb21ZbWwoU3RyaW5nIHBvbGljeVR5cGVzWW1sKSB7CisKKwkJcmV0dXJuIGNvbW1vbkltcG9ydE1hbmFnZXIuY3JlYXRlRWxlbWVudFR5cGVzRnJvbVltbChwb2xpY3lUeXBlc1ltbCwgKHBvbGljeVR5cGVOYW1lLCBncm91cFR5cGVKc29uRGF0YSkgLT4gY3JlYXRlUG9saWN5VHlwZShwb2xpY3lUeXBlTmFtZSwgZ3JvdXBUeXBlSnNvbkRhdGEpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UG9saWN5VHlwZURlZmluaXRpb24sIEJvb2xlYW4+PiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVBvbGljeVR5cGVzQnlEYW8oTGlzdDxQb2xpY3lUeXBlRGVmaW5pdGlvbj4gcG9saWN5VHlwZXNUb0NyZWF0ZSkgeworCQlyZXR1cm4gY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXNCeURhbyhwb2xpY3lUeXBlc1RvQ3JlYXRlLCBwb2xpY3lUeXBlIC0+IHZhbGlkYXRlUG9saWN5VHlwZShwb2xpY3lUeXBlKSwgcG9saWN5VHlwZSAtPiBuZXcgSW1tdXRhYmxlUGFpcjw+KEVsZW1lbnRUeXBlRW51bS5Qb2xpY3lUeXBlLCBwb2xpY3lUeXBlLmdldFR5cGUoKSksCisJCQkJcG9saWN5VHlwZU5hbWUgLT4gcG9saWN5VHlwZU9wZXJhdGlvbi5nZXRMYXRlc3RQb2xpY3lUeXBlQnlUeXBlKHBvbGljeVR5cGVOYW1lKSwgcG9saWN5VHlwZSAtPiBwb2xpY3lUeXBlT3BlcmF0aW9uLmFkZFBvbGljeVR5cGUocG9saWN5VHlwZSksIG51bGwpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEFjdGlvblN0YXR1cywgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUG9saWN5VHlwZShQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xpY3lUeXBlKSB7CisJCUVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBFaXRoZXIubGVmdChBY3Rpb25TdGF0dXMuT0spOworCQlpZiAocG9saWN5VHlwZS5nZXRUYXJnZXRzKCkgIT0gbnVsbCkgeworCQkJaWYgKHBvbGljeVR5cGUuZ2V0VGFyZ2V0cygpLmlzRW1wdHkoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5UQVJHRVRTX0VNUFRZLCBwb2xpY3lUeXBlLmdldFR5cGUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCWlmIChyZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQlmb3IgKFN0cmluZyB0YXJnZXROYW1lIDogcG9saWN5VHlwZS5nZXRUYXJnZXRzKCkpIHsKKwkJCQkJYm9vbGVhbiBpc1ZhbGlkID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0QnlUb3NjYVJlc291cmNlTmFtZSh0YXJnZXROYW1lLCBmYWxzZSkuaXNMZWZ0KCk7CisJCQkJCWlmICghaXNWYWxpZCkgeworCQkJCQkJaXNWYWxpZCA9IGdyb3VwT3BlcmF0aW9uLmlzR3JvdXBFeGlzdCh0YXJnZXROYW1lLCBmYWxzZSk7CisJCQkJCX0KKwkJCQkJaWYgKCFpc1ZhbGlkKSB7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVEFSR0VUU19OT05fVkFMSUQsIHBvbGljeVR5cGUuZ2V0VHlwZSgpLCB0YXJnZXROYW1lKTsKKwkJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBQb2xpY3lUeXBlRGVmaW5pdGlvbiBjcmVhdGVQb2xpY3lUeXBlKFN0cmluZyBncm91cFR5cGVOYW1lLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbikgeworCisJCVBvbGljeVR5cGVEZWZpbml0aW9uIHBvbGljeVR5cGUgPSBuZXcgUG9saWN5VHlwZURlZmluaXRpb24oKTsKKworCQlpZiAodG9zY2FKc29uICE9IG51bGwpIHsKKwkJCS8vIERlc2NyaXB0aW9uCisJCQlmaW5hbCBDb25zdW1lcjxTdHJpbmc+IGRlc2NyaXB0aW9uU2V0dGVyID0gZGVzY3JpcHRpb24gLT4gcG9saWN5VHlwZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCQljb21tb25JbXBvcnRNYW5hZ2VyLnNldEZpZWxkKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSwgZGVzY3JpcHRpb25TZXR0ZXIpOworCQkJLy8gRGVyaXZlZCBGcm9tCisJCQlmaW5hbCBDb25zdW1lcjxTdHJpbmc+IGRlcml2ZWRGcm9tU2V0dGVyID0gZGVyaXZlZEZyb20gLT4gcG9saWN5VHlwZS5zZXREZXJpdmVkRnJvbShkZXJpdmVkRnJvbSk7CisJCQljb21tb25JbXBvcnRNYW5hZ2VyLnNldEZpZWxkKHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uREVSSVZFRF9GUk9NLmdldEVsZW1lbnROYW1lKCksIGRlcml2ZWRGcm9tU2V0dGVyKTsKKwkJCS8vIFByb3BlcnRpZXMKKwkJCWNvbW1vbkltcG9ydE1hbmFnZXIuc2V0UHJvcGVydGllcyh0b3NjYUpzb24sICh2YWx1ZXMpIC0+IHBvbGljeVR5cGUuc2V0UHJvcGVydGllcyh2YWx1ZXMpKTsKKwkJCS8vIE1ldGFkYXRhCisJCQlmaW5hbCBDb25zdW1lcjxNYXA8U3RyaW5nLCBTdHJpbmc+PiBtZXRhZGF0YVNldHRlciA9IG1ldGFkYXRhIC0+IHBvbGljeVR5cGUuc2V0TWV0YWRhdGEobWV0YWRhdGEpOworCQkJY29tbW9uSW1wb3J0TWFuYWdlci5zZXRGaWVsZCh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLk1FVEFEQVRBLmdldEVsZW1lbnROYW1lKCksIG1ldGFkYXRhU2V0dGVyKTsKKwkJCS8vIFRhcmdldHMKKwkJCWZpbmFsIENvbnN1bWVyPExpc3Q8U3RyaW5nPj4gdGFyZ2V0c1NldHRlciA9IHRhcmdldHMgLT4gcG9saWN5VHlwZS5zZXRUYXJnZXRzKHRhcmdldHMpOworCQkJY29tbW9uSW1wb3J0TWFuYWdlci5zZXRGaWVsZCh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLlRBUkdFVFMuZ2V0RWxlbWVudE5hbWUoKSwgdGFyZ2V0c1NldHRlcik7CisKKwkJCXBvbGljeVR5cGUuc2V0VHlwZShncm91cFR5cGVOYW1lKTsKKworCQkJcG9saWN5VHlwZS5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKworCQkJcG9saWN5VHlwZS5zZXRWZXJzaW9uKEltcG9ydFV0aWxzLkNvbnN0YW50cy5GSVJTVF9DRVJUSUZJRURfVkVSU0lPTl9WRVJTSU9OKTsKKwkJfQorCQlyZXR1cm4gcG9saWN5VHlwZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUHJvZHVjdEJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUHJvZHVjdEJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU0NTEzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Qcm9kdWN0QnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsODg3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YW1vZGVsLmFwaS5DYXRlZ29yeVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5Lkdyb3VwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNhY2hlTWFuZ2VyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklFbGVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlByb2R1Y3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLnV0aWxzLkNvbXBvbmVudFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgicHJvZHVjdEJ1c2luZXNzTG9naWMiKQorcHVibGljIGNsYXNzIFByb2R1Y3RCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQ29tcG9uZW50QnVzaW5lc3NMb2dpYyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9GVUxMX05BTUUgPSAiZnVsbCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfQUJCUkVWSUFURURfTkFNRSA9ICJhYmJyZXZpYXRlZCI7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2R1Y3RCdXNpbmVzc0xvZ2ljLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfVkVSU0lPTiA9ICIwLjEiOworCXByaXZhdGUgc3RhdGljIExpc3Q8Um9sZT4gY3JlYXRpb25Sb2xlczsKKwlwcml2YXRlIHN0YXRpYyBMaXN0PFJvbGU+IHVwZGF0ZVJvbGVzOworCXByaXZhdGUgc3RhdGljIExpc3Q8Um9sZT4gY29udGFjdHNSb2xlczsKKworCXB1YmxpYyBQcm9kdWN0QnVzaW5lc3NMb2dpYygpIHsKKwkJY3JlYXRpb25Sb2xlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl1cGRhdGVSb2xlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljb250YWN0c1JvbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJLy8gb25seSBQTSBpcyBhbGxvd2VkIHRvIGNyZWF0ZS91cGRhdGUgcHJvZHVjdHMKKwkJY3JlYXRpb25Sb2xlcy5hZGQoUm9sZS5QUk9EVUNUX01BTkFHRVIpOworCQl1cGRhdGVSb2xlcy5hZGQoUm9sZS5QUk9EVUNUX01BTkFHRVIpOworCQkvLyBPbmx5IFBNIGlzIGFsbG93ZWQgdG8gYmUgcHJvZHVjdCBjb250YWN0cworCQljb250YWN0c1JvbGVzLmFkZChSb2xlLlBST0RVQ1RfTUFOQUdFUik7CisJfQorCisJQEF1dG93aXJlZAorCXByaXZhdGUgSUVsZW1lbnRPcGVyYXRpb24gZWxlbWVudERhbzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFByb2R1Y3RDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgcHJvZHVjdENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElDYWNoZU1hbmdlck9wZXJhdGlvbiBjYWNoZU1hbmFnZXJPcGVyYXRpb247CisKKwlwdWJsaWMgRWl0aGVyPFByb2R1Y3QsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCwgVXNlciB1c2VyKSB7CisJCUF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtID0gQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRTsKKwkJQ29tcG9uZW50VHlwZUVudW0gdHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUOworCisJCS8vIHZhbGlkYXRlIHVzZXIgLSBzaG91bGQgYmUgZmlyc3QgdG8gZ2V0IHRoZSBtYXhpbXVtIGF1ZGl0aW5nIGluZm8gaW4KKwkJLy8gY2FzZSBvZiBzdWJzZXF1ZW50IGZhaWx1cmVzCisJCWxvZy5kZWJ1ZygiZ2V0IHVzZXIgZnJvbSBEQiIpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckNyZWF0b3IgPSB2YWxpZGF0ZVVzZXIodXNlciwgIkNyZWF0ZSBQcm9kdWN0IiwgcHJvZHVjdCwgYWN0aW9uRW51bSwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXVzZXIgPSBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIHZhbGlkYXRlIHVzZXIgcm9sZQorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzID0gdmFsaWRhdGVVc2VyUm9sZSh1c2VyLCBwcm9kdWN0LCBjcmVhdGlvblJvbGVzLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJaWYgKHZhbGlkYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJaWYgKHByb2R1Y3QgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJJbnZhbGlkIHByb2R1Y3QganNvbi4gQ2hlY2sgcHJvZHVjdCBzZXJ2bGV0IGxvZyBmb3IgY3JlYXRlUHJvZHVjdCBlbnRyeSBwYXJhbXMiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIGFjdGlvbkVudW0sIHR5cGVFbnVtKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJLy8gd2FybiBhYm91dCBub24tdXBkYXRhYmxlIGZpZWxkcworCQljaGVja1VudXBkYXRhYmxlUHJvZHVjdEZpZWxkcyhwcm9kdWN0KTsKKworCQlFaXRoZXI8UHJvZHVjdCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUHJvZHVjdFJlc3BvbnNlID0gdmFsaWRhdGVQcm9kdWN0QmVmb3JlQ3JlYXRlKHByb2R1Y3QsIHVzZXIsIGFjdGlvbkVudW0pOworCQlpZiAodmFsaWRhdGVQcm9kdWN0UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlUHJvZHVjdFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlsb2cuZGVidWcoInNlbmQgcHJvZHVjdCB7fSB0byBkYW8gZm9yIGNyZWF0ZSIsIHByb2R1Y3QuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrUmVzdWx0ID0gbG9ja0NvbXBvbmVudEJ5TmFtZShwcm9kdWN0LmdldFN5c3RlbU5hbWUoKSwgcHJvZHVjdCwgIkNyZWF0ZSBQcm9kdWN0Iik7CisJCWlmIChsb2NrUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBsb2NrUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcm9kdWN0LCAiIiwgIiIsIGFjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlsb2cuZGVidWcoIlByb2R1Y3QgbmFtZSBsb2NrZWQgaXMge30sIHN0YXR1cyA9IHt9IiwgcHJvZHVjdC5nZXRTeXN0ZW1OYW1lKCksIGxvY2tSZXN1bHQpOworCisJCXRyeSB7CisJCQlFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUHJvZHVjdEVpdGhlciA9IHByb2R1Y3RPcGVyYXRpb24uY3JlYXRlUHJvZHVjdChwcm9kdWN0KTsKKworCQkJaWYgKGNyZWF0ZVByb2R1Y3RFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUNvbXBvbmVudChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoY3JlYXRlUHJvZHVjdEVpdGhlci5yaWdodCgpLnZhbHVlKCkpLCBwcm9kdWN0LCB0eXBlRW51bSk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIGFjdGlvbkVudW0sIHR5cGVFbnVtKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKworCQkJbG9nLmRlYnVnKCJQcm9kdWN0IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1JFQVRFRCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgcHJvZHVjdCwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgYWN0aW9uRW51bSwgdHlwZUVudW0pOworCisJCQkvLyAvL0FkZCBwcm9kdWN0IHRvIGNhY2hlCisJCQlQcm9kdWN0IGNyZWF0ZWRQcm9kdWN0ID0gY3JlYXRlUHJvZHVjdEVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJCS8vIGNhY2hlTWFuYWdlck9wZXJhdGlvbi51cGRhdGVDb21wb25lbnRJbkNhY2hlKGNyZWF0ZWRQcm9kdWN0LmdldFVuaXF1ZUlkKCksCisJCQkvLyBjcmVhdGVkUHJvZHVjdC5nZXRMYXN0VXBkYXRlRGF0ZSgpLCBOb2RlVHlwZUVudW0uUHJvZHVjdCk7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkUHJvZHVjdCk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnRCeU5hbWUocHJvZHVjdC5nZXRTeXN0ZW1OYW1lKCksIHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlByb2R1Y3QpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tVbnVwZGF0YWJsZVByb2R1Y3RGaWVsZHMoUHJvZHVjdCBwcm9kdWN0KSB7CisJCWNoZWNrQ29tcG9uZW50RmllbGRzRm9yT3ZlcnJpZGVBdHRlbXB0KHByb2R1Y3QpOworCQlpZiAocHJvZHVjdC5nZXROb3JtYWxpemVkTmFtZSgpICE9IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJOb3JtYWxpemVkTmFtZSBjYW5ub3QgYmUgZGVmaW5lZCBieSB1c2VyLiBUaGlzIGZpZWxkIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24iKTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPFByb2R1Y3QsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVByb2R1Y3RCZWZvcmVDcmVhdGUoUHJvZHVjdCBwcm9kdWN0LCBVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVByb2R1Y3RGaWVsZHMgPSB2YWxpZGF0ZVByb2R1Y3RGaWVsZHNCZWZvcmVDcmVhdGUodXNlciwgcHJvZHVjdCwgYWN0aW9uRW51bSk7CisJCWlmICh2YWxpZGF0ZVByb2R1Y3RGaWVsZHMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlUHJvZHVjdEZpZWxkcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJaWYgKHByb2R1Y3QuZ2V0SXNBY3RpdmUoKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIm5vIGlzQWN0aXZlIHZhbHVlIHdhcyBwcm92aWRlZCwgc2V0dGluZyB0byBkZWZhdWx0OiBmYWxzZSIpOworCQkJcHJvZHVjdC5zZXRJc0FjdGl2ZShmYWxzZSk7CisJCX0KKworCQlwcm9kdWN0LnNldENyZWF0b3JVc2VySWQodXNlci5nZXRVc2VySWQoKSk7CisKKwkJLy8gZW5yaWNoIG9iamVjdAorCQlsb2cuZGVidWcoImVucmljaCBwcm9kdWN0IHdpdGggdmVyc2lvbiBhbmQgc3RhdGUiKTsKKwkJcHJvZHVjdC5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCXByb2R1Y3Quc2V0VmVyc2lvbihJTklUSUFMX1ZFUlNJT04pOworCisJCS8vIEdlbmVyYXRlIGludmFyaWFudCBVVUlEIC0gbXVzdCBiZSBoZXJlIGFuZCBub3QgaW4gb3BlcmF0aW9uIHNpbmNlIGl0CisJCS8vIHNob3VsZCBzdGF5IGNvbnN0YW50IGR1cmluZyBjbG9uZQorCQlTdHJpbmcgaW52YXJpYW50VVVJRCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZEludmFyaWFudFVVSUQoKTsKKwkJcHJvZHVjdC5zZXRJbnZhcmlhbnRVVUlEKGludmFyaWFudFVVSUQpOworCisJCXJldHVybiBFaXRoZXIubGVmdChwcm9kdWN0KTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVQcm9kdWN0RmllbGRzQmVmb3JlQ3JlYXRlKFVzZXIgdXNlciwgUHJvZHVjdCBwcm9kdWN0LCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCisJCS8vIFRvIGJlIHJlbW92ZWQgaW4gMTYwNworCQkvLyBTZWUgYmVsb3cKKwkJU3RyaW5nIG9sZE5hbWUgPSBwcm9kdWN0LmdldE5hbWUoKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGNvbXBvbmVudE5hbWVWYWxpZGF0aW9uID0gdmFsaWRhdGVQcm9kdWN0TmFtZUFuZENsZWFudXAodXNlciwgcHJvZHVjdCwgYWN0aW9uRW51bSk7CisJCWlmIChjb21wb25lbnROYW1lVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBjb21wb25lbnROYW1lVmFsaWRhdGlvbjsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gY29tcG9uZW50TmFtZVVuaXF1ZW5lc3NWYWxpZGF0aW9uID0gdmFsaWRhdGVDb21wb25lbnROYW1lVW5pcXVlKHVzZXIsIHByb2R1Y3QsIGFjdGlvbkVudW0pOworCQlpZiAoY29tcG9uZW50TmFtZVVuaXF1ZW5lc3NWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGNvbXBvbmVudE5hbWVVbmlxdWVuZXNzVmFsaWRhdGlvbjsKKwkJfQorCisJCS8vIFRvIGJlIHJlbW92ZWQgaW4gMTYwNyBhbmQgcmVwbGFjZWQgd2l0aCBnZW5lcmljCisJCS8vIHZhbGlkYXRlVGFnc0xpc3RBbmRSZW1vdmVEdXBsaWNhdGVzKCkKKwkJLy8gU2VlIGNvbW1lbnRzIG9uIHRoZSB2YWxpZGF0ZVRhZ3NMaXN0QW5kUmVtb3ZlRHVwbGljYXRlcyh1c2VyLAorCQkvLyBwcm9kdWN0LCBvbGROYW1lLCBhY3Rpb25FbnVtKSBmdW5jdGlvbgorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHRhZ3NWYWxpZGF0aW9uID0gdmFsaWRhdGVUYWdzTGlzdEFuZFJlbW92ZUR1cGxpY2F0ZXModXNlciwgcHJvZHVjdCwgb2xkTmFtZSwgYWN0aW9uRW51bSk7CisJCWlmICh0YWdzVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiB0YWdzVmFsaWRhdGlvbjsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVJY29uUmVzcG9uc2UgPSB2YWxpZGF0ZUljb24odXNlciwgcHJvZHVjdCwgYWN0aW9uRW51bSk7CisJCWlmICh2YWxpZGF0ZUljb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiB2YWxpZGF0ZUljb25SZXNwb25zZTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcHJvamVjdENvZGVWYWxpZGF0aW9uID0gdmFsaWRhdGVQcm9qZWN0Q29kZSh1c2VyLCBwcm9kdWN0LCBhY3Rpb25FbnVtKTsKKwkJaWYgKHByb2plY3RDb2RlVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBwcm9qZWN0Q29kZVZhbGlkYXRpb247CisJCX0KKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjYXRlZ29yeVZhbGlkYXRpb24gPSB2YWxpZGF0ZUdyb3VwaW5nKHVzZXIsIHByb2R1Y3QsIGFjdGlvbkVudW0pOworCQlpZiAoY2F0ZWdvcnlWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGNhdGVnb3J5VmFsaWRhdGlvbjsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gY29udGFjdHNMaXN0VmFsaWRhdGlvbiA9IHZhbGlkYXRlQW5kVXBkYXRlUHJvZHVjdENvbnRhY3RzTGlzdCh1c2VyLCBwcm9kdWN0LCBhY3Rpb25FbnVtKTsKKwkJaWYgKGNvbnRhY3RzTGlzdFZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gY29udGFjdHNMaXN0VmFsaWRhdGlvbjsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcHJvZHVjdEZ1bGxOYW1lVmFsaWRhdGlvbiA9IHZhbGlkYXRlUHJvZHVjdEZ1bGxOYW1lQW5kQ2xlYW51cCh1c2VyLCBwcm9kdWN0LCBhY3Rpb25FbnVtKTsKKwkJaWYgKHByb2R1Y3RGdWxsTmFtZVZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gcHJvZHVjdEZ1bGxOYW1lVmFsaWRhdGlvbjsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZGVzY1ZhbGlkYXRpb24gPSB2YWxpZGF0ZURlc2NyaXB0aW9uQW5kQ2xlYW51cCh1c2VyLCBwcm9kdWN0LCBhY3Rpb25FbnVtKTsKKwkJaWYgKGRlc2NWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGRlc2NWYWxpZGF0aW9uOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgQm9vbGVhbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVByb2R1Y3ROYW1lRXhpc3RzKFN0cmluZyBwcm9kdWN0TmFtZSwgU3RyaW5nIHVzZXJJZCkgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJ2YWxpZGF0ZSBQcm9kdWN0IE5hbWUgRXhpc3RzIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRhdGFNb2RlbFJlc3BvbnNlID0gcHJvZHVjdE9wZXJhdGlvbi52YWxpZGF0ZUNvbXBvbmVudE5hbWVFeGlzdHMocHJvZHVjdE5hbWUpOworCisJCWlmIChkYXRhTW9kZWxSZXNwb25zZS5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgQm9vbGVhbj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOworCQkJcmVzdWx0LnB1dCgiaXNWYWxpZCIsIGRhdGFNb2RlbFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1ZygidmFsaWRhdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4iKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQl9CisKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGRhdGFNb2RlbFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSkpOworCisJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZVByb2R1Y3RDb250YWN0c0xpc3QoVXNlciB1c2VyLCBQcm9kdWN0IHByb2R1Y3QsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCUxpc3Q8U3RyaW5nPiBjb250YWN0cyA9IHByb2R1Y3QuZ2V0Q29udGFjdHMoKTsKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVMaXN0Tm90RW1wdHkoY29udGFjdHMpKSB7CisJCQlsb2cuZGVidWcoIkNvbnRhY3RzIGxpc3QgY2Fubm90IGJlIGVtcHR5IGZvciBwcm9kdWN0IHt9IiwgcHJvZHVjdC5nZXROYW1lKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkVNUFRZX1BST0RVQ1RfQ09OVEFDVFNfTElTVCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgcHJvZHVjdCwgIiIsICIiLCBhY3Rpb25FbnVtLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJYm9vbGVhbiBpc1Byb2R1Y3RDcmVhdG9ySW5Db250YWN0cyA9IGZhbHNlOworCQlTdHJpbmcgbW9kaWZpZXJVc2VySWQgPSB1c2VyLmdldFVzZXJJZCgpOworCQlmb3IgKFN0cmluZyBjb250YWN0IDogY29udGFjdHMpIHsKKwkJCWlmIChjb250YWN0LmVxdWFscyhtb2RpZmllclVzZXJJZCkpIHsKKwkJCQlsb2cudHJhY2UoIm1vZGlmaWVyIHVzZXJJZCBmb3VuZCBpbiBwcm9kdWN0IGNvbnRhY3RzIik7CisJCQkJaXNQcm9kdWN0Q3JlYXRvckluQ29udGFjdHMgPSB0cnVlOworCQkJCS8vIE5vIG5lZWQgdG8gdmFsaWRhdGUgZm9yIHRoaXMgdXNlcklkIC0gaXQncyBtb2RpZmllcidzCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnRhY3RJZChjb250YWN0KSkgeworCQkJCWxvZy5kZWJ1ZygiUHJvZHVjdCBjb250YWN0cyBoYXMgaW52YWxpZCB1c2VySWQge30gZm9yIHByb2R1Y3Qge30iLCBjb250YWN0LCBwcm9kdWN0LmdldE5hbWUoKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QuZ2V0VmFsdWUoKSk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisKKwkJCVVzZXIgY29udGFjdFVzZXIgPSBuZXcgVXNlcigpOworCQkJY29udGFjdFVzZXIuc2V0VXNlcklkKGNvbnRhY3QpOworCQkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVzZXIgPSB2YWxpZGF0ZVVzZXJFeGlzdHMoY29udGFjdCwgIkNyZWF0ZSBQcm9kdWN0IiwgZmFsc2UpOworCQkJaWYgKHZhbGlkYXRlVXNlci5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNhbm5vdCBzZXQgY29udGFjdCB3aXRoIHVzZXJJZCB7fSBhcyBwcm9kdWN0IGNvbnRhY3QsIGVycm9yOiB7fSIsIGNvbnRhY3QsIHZhbGlkYXRlVXNlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0RVQ1RfQ09OVEFDVCwgY29udGFjdCk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisKKwkJCWNvbnRhY3RVc2VyID0gdmFsaWRhdGVVc2VyLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlclJvbGUgPSB2YWxpZGF0ZVVzZXJSb2xlKGNvbnRhY3RVc2VyLCBjb250YWN0c1JvbGVzKTsKKwkJCWlmICh2YWxpZGF0ZVVzZXJSb2xlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiQ2Fubm90IHNldCBjb250YWN0IHdpdGggdXNlcklkIHt9IGFzIHByb2R1Y3QgY29udGFjdCwgZXJyb3I6IHt9IiwgY29udGFjdCwgdmFsaWRhdGVVc2VyUm9sZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0RVQ1RfQ09OVEFDVCwgY29udGFjdCk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisKKwkJfQorCisJCWlmICghaXNQcm9kdWN0Q3JlYXRvckluQ29udGFjdHMpIHsKKwkJCWxvZy5kZWJ1ZygibW9kaWZpZXIgdXNlcklkIHt9IG5vdCBmb3VuZCBpbiBwcm9kdWN0IGNvbnRhY3RzIC0gYWRkaW5nIGl0IiwgbW9kaWZpZXJVc2VySWQpOworCQkJY29udGFjdHMuYWRkKG1vZGlmaWVyVXNlcklkKTsKKwkJfQorCisJCS8vIHBhc3NlZCAtIHNldHRpbmcgYWxsIGNvbnRhY3RzIHVzZXIgaWRzIHRvIGxvd2VyY2FzZQorCQlMaXN0PFN0cmluZz4gdGVtcENvbnRhY3RzID0gY29udGFjdHMuc3RyZWFtKCkubWFwKGUgLT4gZS50b0xvd2VyQ2FzZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlWYWxpZGF0aW9uVXRpbHMucmVtb3ZlRHVwbGljYXRlRnJvbUxpc3QodGVtcENvbnRhY3RzKTsKKwkJcHJvZHVjdC5zZXRDb250YWN0cyh0ZW1wQ29udGFjdHMpOworCisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVHcm91cGluZyhVc2VyIHVzZXIsIFByb2R1Y3QgcHJvZHVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBwcm9kdWN0LmdldENhdGVnb3JpZXMoKTsKKwkJaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCB8fCBjYXRlZ29yaWVzLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJHcm91cGluZyBsaXN0IGlzIGVtcHR5IGZvciBwcm9kdWN0IHt9IiwgcHJvZHVjdC5nZXROYW1lKCkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+Pj4gbm9uRHVwbGljYXRlZENhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+Pj4oKTsKKwkJLy8gcmVtb3ZlIGR1cGxpY2F0ZWQgZW50cmllcworCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXQgOiBjYXRlZ29yaWVzKSB7CisJCQlTdHJpbmcgY2F0TmFtZSA9IGNhdC5nZXROYW1lKCk7CisJCQlpZiAoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU3RyaW5nTm90RW1wdHkoY2F0TmFtZSkgPT0gZmFsc2UpIHsKKwkJCQkvLyBlcnJvciBtaXNzaW5nIGNhdCBuYW1lCisJCQkJbG9nLmRlYnVnKCJNaXNzaW5nIGNhdGVnb3J5IG5hbWUgZm9yIHByb2R1Y3Qge30iLCBwcm9kdWN0LmdldE5hbWUoKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NBVEVHT1JZLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULmdldFZhbHVlKCkpOworCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcm9kdWN0LCAiIiwgIiIsIGFjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGNhdEVudHJ5ID0gbm9uRHVwbGljYXRlZENhdGVnb3JpZXMuZ2V0KGNhdE5hbWUpOworCQkJaWYgKGNhdEVudHJ5ID09IG51bGwpIHsKKwkJCQljYXRFbnRyeSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+KCk7CisJCQkJbm9uRHVwbGljYXRlZENhdGVnb3JpZXMucHV0KGNhdE5hbWUsIGNhdEVudHJ5KTsKKwkJCX0KKwkJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJjYXRlZ29yaWVzID0gY2F0LmdldFN1YmNhdGVnb3JpZXMoKTsKKwkJCWlmIChzdWJjYXRlZ29yaWVzID09IG51bGwgfHwgc3ViY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKKwkJCQkvLyBlcnJvciBtaXNzaW5nIHN1YmNhdCBmb3IgY2F0CisJCQkJbG9nLmRlYnVnKCJNaXNzaW5nIHN1Yi1jYXRlZ29yaWVzIGZvciBjYXRlZ29yeSB7fSBpbiBwcm9kdWN0IHt9IiwgY2F0TmFtZSwgcHJvZHVjdC5nZXROYW1lKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19TVUJDQVRFR09SWSk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlmb3IgKFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJjYXQgOiBzdWJjYXRlZ29yaWVzKSB7CisJCQkJU3RyaW5nIHN1YkNhdE5hbWUgPSBzdWJjYXQuZ2V0TmFtZSgpOworCQkJCWlmIChWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eShzdWJDYXROYW1lKSA9PSBmYWxzZSkgeworCQkJCQkvLyBlcnJvciBtaXNzaW5nIHN1YiBjYXQgbmFtZSBmb3IgY2F0CisJCQkJCWxvZy5kZWJ1ZygiTWlzc2luZyBvciBlbXB0eSBzdWItY2F0ZWdvcnkgZm9yIGNhdGVnb3J5IHt9IGluIHByb2R1Y3Qge30iLCBjYXROYW1lLCBwcm9kdWN0LmdldE5hbWUoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19TVUJDQVRFR09SWSk7CisJCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcm9kdWN0LCAiIiwgIiIsIGFjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQl9CisJCQkJU2V0PFN0cmluZz4gc3ViY2F0RW50cnkgPSBjYXRFbnRyeS5nZXQoc3ViQ2F0TmFtZSk7CisJCQkJaWYgKHN1YmNhdEVudHJ5ID09IG51bGwpIHsKKwkJCQkJc3ViY2F0RW50cnkgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCQkJCWNhdEVudHJ5LnB1dChzdWJDYXROYW1lLCBzdWJjYXRFbnRyeSk7CisJCQkJfQorCQkJCUxpc3Q8R3JvdXBpbmdEZWZpbml0aW9uPiBncm91cGluZ3MgPSBzdWJjYXQuZ2V0R3JvdXBpbmdzKCk7CisJCQkJZm9yIChHcm91cGluZ0RlZmluaXRpb24gZ3JvdXAgOiBncm91cGluZ3MpIHsKKwkJCQkJU3RyaW5nIGdyb3VwTmFtZSA9IGdyb3VwLmdldE5hbWUoKTsKKwkJCQkJaWYgKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGdyb3VwTmFtZSkgPT0gZmFsc2UpIHsKKwkJCQkJCS8vIGVycm9yIG1pc3NpbmcgZ3JvdXBpbmcgZm9yIHN1YiBjYXQgbmFtZSBhbmQgY2F0CisJCQkJCQlsb2cuZGVidWcoIk1pc3Npbmcgb3IgZW1wdHkgZ3JvdXBuZyBuYW1lIGZvciBzdWItY2F0ZWdvcnkge30gZm9yIGNhdGVnb3J5IHt9IGluIHByb2R1Y3Qge30iLCBzdWJDYXROYW1lLCBjYXROYW1lLCBwcm9kdWN0LmdldE5hbWUoKSk7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfU1VCQ0FURUdPUlkpOworCQkJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJfQorCQkJCQlpZiAoIXN1YmNhdEVudHJ5LmNvbnRhaW5zKGdyb3VwTmFtZSkpIHsKKwkJCQkJCXN1YmNhdEVudHJ5LmFkZChncm91cE5hbWUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbG9nLmRlYnVnKCJHcm91cGluZyBbIHt9IF0gYWxyZWFkeSBleGlzdCBmb3IgY2F0ZWdvcnkgWyB7fSBdIGFuZCBzdWJjYXRlZ29yeSBbIHt9IF0iLCBncm91cE5hbWUsIGNhdE5hbWUsIHN1YkNhdE5hbWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IC8vIGZvciBlbmQgb2YgY2hlY2tpbmcgZHVwbGljYXRlZAorCQkJLy8gdmFsaWRhdGUgZXhpc3RlbmNlCisJCUVpdGhlcjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gYWxsUHJvZHVjdENhdGVnb3JpZXMgPSBlbGVtZW50RGFvLmdldEFsbFByb2R1Y3RDYXRlZ29yaWVzKCk7CisKKwkJaWYgKGFsbFByb2R1Y3RDYXRlZ29yaWVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJObyBwcm9kdWN0IGNhdGVnb3JpZXMge30iLCBhbGxQcm9kdWN0Q2F0ZWdvcmllcy5yaWdodCgpLnZhbHVlKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWxsUHJvZHVjdENhdGVnb3JpZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcm9kdWN0LCAiIiwgIiIsIGFjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJYm9vbGVhbiBjYXRFeGlzdDsKKwkJLy8gY29udmVydCBub24tZHVwbGljYXRlZCB0byBkYXRhIG1vZGVsaW5nIGZvcm1hdCBhbmQgdXBkYXRlIGluIHRoZQorCQkvLyBpbnB1dCBvYmplY3QKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IG5ld0NhdExpc3QgPSBuZXcgQXJyYXlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4oKTsKKworCQkvLyBvdmVyIGFsbCBjYXRlZ29yaWVzIGZyb20gcmVxdWVzdAorCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+Pj4gZW50cnkgOiBub25EdXBsaWNhdGVkQ2F0ZWdvcmllcy5lbnRyeVNldCgpKSB7CisJCQljYXRFeGlzdCA9IGZhbHNlOworCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiA9IG51bGw7CisJCQkvLyBvdmVyIGFsbCBjYXRlZ29yaWVzIGZyb20gVGl0YW4KKwkJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzTGlzdCA9IGFsbFByb2R1Y3RDYXRlZ29yaWVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKGNhdGVnb3JpZXNMaXN0ICE9IG51bGwpIHsKKwkJCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRJbkRiIDogY2F0ZWdvcmllc0xpc3QpIHsKKwkJCQkJaWYgKGVudHJ5LmdldEtleSgpLmVxdWFscyhjYXRJbkRiLmdldE5hbWUoKSkpIHsKKwkJCQkJCWNhdEV4aXN0ID0gdHJ1ZTsKKwkJCQkJCWJvb2xlYW4gc3ViY2F0RXhpc3Q7CisJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCWNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oY2F0SW5EYik7CisJCQkJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnkgPSBudWxsOworCisJCQkJCQlNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gc3ViY2F0cyA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNldDxTdHJpbmc+PiBzdWJjYXQgOiBzdWJjYXRzLmVudHJ5U2V0KCkpIHsKKwkJCQkJCQlzdWJjYXRFeGlzdCA9IGZhbHNlOworCQkJCQkJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJjYXRlZ29yaWVzTGlzdCA9IGNhdEluRGIuZ2V0U3ViY2F0ZWdvcmllcygpOworCQkJCQkJCWlmIChzdWJjYXRlZ29yaWVzTGlzdCAhPSBudWxsKSB7CisJCQkJCQkJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YmNhdEluRGIgOiBzdWJjYXRlZ29yaWVzTGlzdCkgeworCQkJCQkJCQkJaWYgKHN1YmNhdEluRGIuZ2V0TmFtZSgpLmVxdWFscyhzdWJjYXQuZ2V0S2V5KCkpKSB7CisJCQkJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJCQkJc3ViQ2F0ZWdvcnkgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKHN1YmNhdEluRGIpOworCQkJCQkJCQkJCXN1YmNhdEV4aXN0ID0gdHJ1ZTsKKwkJCQkJCQkJCQlTZXQ8U3RyaW5nPiBncm91cGluZyA9IHN1YmNhdC5nZXRWYWx1ZSgpOworCQkJCQkJCQkJCWJvb2xlYW4gZ3JvdXBFeGlzdDsKKwkJCQkJCQkJCQlHcm91cGluZ0RlZmluaXRpb24gZ3JvdXBpbmdEZWZpbml0aW9uID0gbnVsbDsKKwkJCQkJCQkJCQlmb3IgKFN0cmluZyBncm91cCA6IGdyb3VwaW5nKSB7CisJCQkJCQkJCQkJCWdyb3VwRXhpc3QgPSBmYWxzZTsKKwkJCQkJCQkJCQkJTGlzdDxHcm91cGluZ0RlZmluaXRpb24+IGdyb3VwaW5ncyA9IHN1YmNhdEluRGIuZ2V0R3JvdXBpbmdzKCk7CisJCQkJCQkJCQkJCWlmIChncm91cGluZ3MgIT0gbnVsbCkgeworCQkJCQkJCQkJCQkJZm9yIChHcm91cGluZ0RlZmluaXRpb24gZ3JvdXBJbkRiIDogZ3JvdXBpbmdzKSB7CisJCQkJCQkJCQkJCQkJaWYgKGdyb3VwSW5EYi5nZXROYW1lKCkuZXF1YWxzKGdyb3VwKSkgeworCQkJCQkJCQkJCQkJCQlncm91cEV4aXN0ID0gdHJ1ZTsKKwkJCQkJCQkJCQkJCQkJZ3JvdXBpbmdEZWZpbml0aW9uID0gbmV3IEdyb3VwaW5nRGVmaW5pdGlvbihncm91cEluRGIpOworCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQlpZiAoIWdyb3VwRXhpc3QpIHsKKwkJCQkJCQkJCQkJCS8vIGVycm9yIGdyb3VwaW5nIGlzbid0IGRlZmluZWQKKwkJCQkJCQkJCQkJCS8vIGluIFRpdGFuCisJCQkJCQkJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9HUk9VUF9BU1NPQ0lBVElPTiwgQ2F0ZWdvcnlUeXBlRW51bS5HUk9VUElORy5nZXRWYWx1ZSgpLCBncm91cCk7CisJCQkJCQkJCQkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgcHJvZHVjdCwgIiIsICIiLCBhY3Rpb25FbnVtLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJCQkJCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCXN1YkNhdGVnb3J5LmFkZEdyb3VwaW5nKGdyb3VwaW5nRGVmaW5pdGlvbik7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmICghc3ViY2F0RXhpc3QpIHsKKwkJCQkJCQkJLy8gZXJyb3Igc3ViIGNhdGVnb3J5IGlzbid0IGRlZmluZWQgaW4gVGl0YW4KKwkJCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfR1JPVVBfQVNTT0NJQVRJT04sIENhdGVnb3J5VHlwZUVudW0uU1VCQ0FURUdPUlkuZ2V0VmFsdWUoKSwgc3ViY2F0LmdldEtleSgpKTsKKwkJCQkJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQkJCX0KKwkJCQkJCQljYXRlZ29yeURlZmluaXRpb24uYWRkU3ViQ2F0ZWdvcnkoc3ViQ2F0ZWdvcnkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKCFjYXRFeGlzdCkgeworCQkJCS8vIGVycm9yIGNhdGVnb3J5IGlzbid0IGRlZmluZWQgaW4gVGl0YW4KKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9HUk9VUF9BU1NPQ0lBVElPTiwgQ2F0ZWdvcnlUeXBlRW51bS5DQVRFR09SWS5nZXRWYWx1ZSgpLCBlbnRyeS5nZXRLZXkoKSk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQluZXdDYXRMaXN0LmFkZChjYXRlZ29yeURlZmluaXRpb24pOworCQl9CisJCXByb2R1Y3Quc2V0Q2F0ZWdvcmllcyhuZXdDYXRMaXN0KTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXB1YmxpYyBFaXRoZXI8UHJvZHVjdCwgUmVzcG9uc2VGb3JtYXQ+IGdldFByb2R1Y3QoU3RyaW5nIHByb2R1Y3RJZCwgVXNlciB1c2VyKSB7CisJCVN0cmluZyBlY29tcEVycm9yQ29udGV4dCA9ICJHZXQgcHJvZHVjdCI7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVFbXB0eVJlc3VsdCA9IHZhbGlkYXRlVXNlck5vdEVtcHR5KHVzZXIsIGVjb21wRXJyb3JDb250ZXh0KTsKKwkJaWYgKHZhbGlkYXRlRW1wdHlSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlRW1wdHlSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQ3JlYXRvciA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VyLCBlY29tcEVycm9yQ29udGV4dCwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPFByb2R1Y3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0b3JhZ2VTdGF0dXMgPSBwcm9kdWN0T3BlcmF0aW9uLmdldENvbXBvbmVudChwcm9kdWN0SWQsIGZhbHNlKTsKKworCQlpZiAoc3RvcmFnZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCByZXNvdXJjZSBieSBpZCB7fSIsIHByb2R1Y3RJZCk7CisJCQlpZiAoc3RvcmFnZVN0YXR1cy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCS8vIFRPRE8gY2hlY2sgZXJyb3IKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUFJPRFVDVF9OT1RfRk9VTkQsIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QuZ2V0VmFsdWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMucmlnaHQoKS52YWx1ZSgpKSwgIiIpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoc3RvcmFnZVN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHVibGljIEVpdGhlcjxQcm9kdWN0LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlUHJvZHVjdChTdHJpbmcgcHJvZHVjdElkLCBVc2VyIHVzZXIpIHsKKwkJU3RyaW5nIGVjb21wRXJyb3JDb250ZXh0ID0gIkRlbGV0ZSBwcm9kdWN0IjsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUVtcHR5UmVzdWx0ID0gdmFsaWRhdGVVc2VyTm90RW1wdHkodXNlciwgZWNvbXBFcnJvckNvbnRleHQpOworCQlpZiAodmFsaWRhdGVFbXB0eVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVFbXB0eVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDcmVhdG9yID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXIsIGVjb21wRXJyb3JDb250ZXh0LCBmYWxzZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RvcmFnZVN0YXR1cyA9IHByb2R1Y3RPcGVyYXRpb24uZGVsZXRlUHJvZHVjdChwcm9kdWN0SWQsIGZhbHNlKTsKKworCQlpZiAoc3RvcmFnZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSByZXNvdXJjZSBieSBpZCB7fSIsIHByb2R1Y3RJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMucmlnaHQoKS52YWx1ZSgpKSwgIiIpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoc3RvcmFnZVN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUHJvZHVjdEZ1bGxOYW1lQW5kQ2xlYW51cChVc2VyIHVzZXIsIFByb2R1Y3QgcHJvZHVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJU3RyaW5nIGZ1bGxOYW1lID0gcHJvZHVjdC5nZXRGdWxsTmFtZSgpOworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGZ1bGxOYW1lKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19PTkVfT0ZfQ09NUE9ORU5UX05BTUVTLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULmdldFZhbHVlKCksIFBST0RVQ1RfRlVMTF9OQU1FKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJZnVsbE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlTm9uZVV0ZjhDaGFycyhmdWxsTmFtZSk7CisJCWZ1bGxOYW1lID0gVmFsaWRhdGlvblV0aWxzLnJlbW92ZUh0bWxUYWdzKGZ1bGxOYW1lKTsKKwkJZnVsbE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlV2hpdGVzcGFjZShmdWxsTmFtZSk7CisJCWZ1bGxOYW1lID0gVmFsaWRhdGlvblV0aWxzLnN0cmlwT2N0ZXRzKGZ1bGxOYW1lKTsKKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVByb2R1Y3RGdWxsTmFtZUxlbmd0aChmdWxsTmFtZSkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfTEVOR1RILCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULmdldFZhbHVlKCksIFBST0RVQ1RfRlVMTF9OQU1FKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcm9kdWN0LCAiIiwgIiIsIGFjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUlzRW5nbGlzaChmdWxsTmFtZSkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfRk9STUFULCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULmdldFZhbHVlKCksIFBST0RVQ1RfRlVMTF9OQU1FKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcm9kdWN0LCAiIiwgIiIsIGFjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlwcm9kdWN0LnNldEZ1bGxOYW1lKGZ1bGxOYW1lKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVByb2R1Y3ROYW1lQW5kQ2xlYW51cChVc2VyIHVzZXIsIFByb2R1Y3QgcHJvZHVjdCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJU3RyaW5nIG5hbWUgPSBwcm9kdWN0LmdldE5hbWUoKTsKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eShuYW1lKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfT05FX09GX0NPTVBPTkVOVF9OQU1FUywgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVC5nZXRWYWx1ZSgpLCBQUk9EVUNUX0FCQlJFVklBVEVEX05BTUUpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCS8vIFByb2R1Y3QgbmFtZSBpcyByZXF1aXJlZCB0byBoYXZlIHNhbWUgdmFsaWRhdGlvbiBhbmQgbm9ybWFsaXphdGlvbiBhcworCQkvLyBjYXRlZ29yeQorCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNhdGVnb3J5RGlzcGxheU5hbWVGb3JtYXQobmFtZSkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfRk9STUFULCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULmdldFZhbHVlKCksIFBST0RVQ1RfQUJCUkVWSUFURURfTkFNRSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgcHJvZHVjdCwgIiIsICIiLCBhY3Rpb25FbnVtLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJU3RyaW5nIG5vcm1hbGl6ZWROYW1lNERpc3BsYXkgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNERpc3BsYXkobmFtZSk7CisKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lTGVuZ3RoKG5vcm1hbGl6ZWROYW1lNERpc3BsYXkpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSCwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVC5nZXRWYWx1ZSgpLCBQUk9EVUNUX0FCQlJFVklBVEVEX05BTUUpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHByb2R1Y3QsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXByb2R1Y3Quc2V0TmFtZShub3JtYWxpemVkTmFtZTREaXNwbGF5KTsKKwkJU3RyaW5nIG5vcm1hbGl6ZWROYW1lNFVuaXF1ZW5lc3MgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShub3JtYWxpemVkTmFtZTREaXNwbGF5KTsKKwkJcHJvZHVjdC5zZXROb3JtYWxpemVkTmFtZShub3JtYWxpemVkTmFtZTRVbmlxdWVuZXNzKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgY3VycmVudCB0YWctLS0+cHJvZHVjdCBuYW1lIGJlaGF2aW91ciwgd2hpY2gKKwkvLyB3aWxsIGJlIGNoYW5nZWQgaW4gMTYwNy4KKwkvLyBJdCB3YXMgYWdyZWVkIHdpdGggRWxsYSBvbiAyMy8yLzE2IHRoYXQgdGhlIHRhZyB2YWxpZGF0aW9uIG9mIHByb2R1Y3QKKwkvLyB3aWxsIGJlIG1hZGUgYWdhaW5zdCB0aGUgb2xkIHByb2R1Y3QgbmFtZSAoYmVmb3JlIG5vcm1hbGl6YXRpb24pLAorCS8vIGFuZCBpbiAxNjA3IFVTIHdpbGwgYmUgZGVmaW5lZCB3aGVyZSBVSSB3aWxsIG5vIGxvbmdlciBwYXNzIHRhZyBvZgorCS8vIGNvbXBvbmVudCBuYW1lLCBhbmQgQkUgd2lsbCBhZGQgaXQgYnkgaXRzZWxmIGFmdGVyIGFsbCBuZWVkZWQKKwkvLyBub3JtYWxpemF0aW9ucy4KKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVUYWdzTGlzdEFuZFJlbW92ZUR1cGxpY2F0ZXMoVXNlciB1c2VyLCBQcm9kdWN0IHByb2R1Y3QsIFN0cmluZyBvbGRQcm9kdWN0TmFtZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJTGlzdDxTdHJpbmc+IHRhZ3NMaXN0ID0gcHJvZHVjdC5nZXRUYWdzKCk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVRhZ3MgPSB2YWxpZGF0ZUNvbXBvbmVudFRhZ3ModGFnc0xpc3QsIG9sZFByb2R1Y3ROYW1lLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJaWYgKHZhbGlkYXRlVGFncy5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdmFsaWRhdGVUYWdzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcm9kdWN0LCAiIiwgIiIsIGFjdGlvbkVudW0sIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJVmFsaWRhdGlvblV0aWxzLnJlbW92ZUR1cGxpY2F0ZUZyb21MaXN0KHRhZ3NMaXN0KTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRBcnRpZmFjdHNQbGFjZUhvbGRlcihvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBVc2VyIHVzZXIpIHsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8UHJvZHVjdCwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVByb2R1Y3RNZXRhZGF0YShTdHJpbmcgcHJvZHVjdElkLCBQcm9kdWN0IHVwZGF0ZWRQcm9kdWN0LCBVc2VyIHVzZXIpIHsKKwkJQ29tcG9uZW50VHlwZUVudW0gdHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckNyZWF0b3IgPSB2YWxpZGF0ZVVzZXIodXNlciwgIlVwZGF0ZSBQcm9kdWN0IiwgdXBkYXRlZFByb2R1Y3QsIG51bGwsIGZhbHNlKTsKKwkJaWYgKGVpdGhlckNyZWF0b3IuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl1c2VyID0gZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyB2YWxpZGF0ZSB1c2VyIHJvbGUKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlVXNlclJvbGUodXNlciwgdXBkYXRlZFByb2R1Y3QsIHVwZGF0ZVJvbGVzLCBudWxsLCBudWxsKTsKKwkJaWYgKHZhbGlkYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJaWYgKHVwZGF0ZWRQcm9kdWN0ID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiSW52YWxpZCBwcm9kdWN0IGpzb24uIENoZWNrIHByb2R1Y3Qgc2VydmxldCBsb2cgZm9yIHVwZGF0ZVByb2R1Y3QgZW50cnkgcGFyYW1zIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPFByb2R1Y3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0b3JhZ2VTdGF0dXMgPSBwcm9kdWN0T3BlcmF0aW9uLmdldENvbXBvbmVudChwcm9kdWN0SWQsIGZhbHNlKTsKKwkJaWYgKHN0b3JhZ2VTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlpZiAoc3RvcmFnZVN0YXR1cy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5QUk9EVUNUX05PVF9GT1VORCwgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVC5uYW1lKCkudG9Mb3dlckNhc2UoKSkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMucmlnaHQoKS52YWx1ZSgpLCB0eXBlRW51bSksICIiKSk7CisJCX0KKworCQlQcm9kdWN0IGN1cnJlbnRQcm9kdWN0ID0gc3RvcmFnZVN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQlpZiAoIUNvbXBvbmVudFZhbGlkYXRpb25VdGlscy5jYW5Xb3JrT25Db21wb25lbnQocHJvZHVjdElkLCBwcm9kdWN0T3BlcmF0aW9uLCB1c2VyLmdldFVzZXJJZCgpKSkgeworCQkJbG9nLmluZm8oIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIGZvciB1c2VyIHt9IG9uIHByb2R1Y3Qge30iLCB1c2VyLmdldFVzZXJJZCgpLCBjdXJyZW50UHJvZHVjdC5nZXRDcmVhdG9yVXNlcklkKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCX0KKworCQlFaXRoZXI8UHJvZHVjdCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRpb25Sc3BvbnNlID0gdmFsaWRhdGVBbmRVcGRhdGVQcm9kdWN0TWV0YWRhdGEodXNlciwgY3VycmVudFByb2R1Y3QsIHVwZGF0ZWRQcm9kdWN0KTsKKwkJaWYgKHZhbGlkYXRpb25Sc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJbG9nLmluZm8oInByb2R1Y3QgdXBkYXRlIG1ldGFkYXRhOiB2YWxpZGF0aW9ucyBmaWVsZC4iKTsKKwkJCXJldHVybiB2YWxpZGF0aW9uUnNwb25zZTsKKwkJfQorCisJCVByb2R1Y3QgcHJvZHVjdFRvVXBkYXRlID0gdmFsaWRhdGlvblJzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCS8vIGxvY2sgcmVzb3VyY2UKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrUmVzdWx0ID0gbG9ja0NvbXBvbmVudChjdXJyZW50UHJvZHVjdC5nZXRVbmlxdWVJZCgpLCBjdXJyZW50UHJvZHVjdCwgIlVwZGF0ZSBQcm9kdWN0IE1ldGFkYXRhIik7CisJCWlmIChsb2NrUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJdHJ5IHsKKwkJCUVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXNwb25zZSA9IHByb2R1Y3RPcGVyYXRpb24udXBkYXRlQ29tcG9uZW50KHByb2R1Y3RUb1VwZGF0ZSwgdHJ1ZSk7CisJCQlpZiAodXBkYXRlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJcHJvZHVjdE9wZXJhdGlvbi5yb2xsYmFjaygpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiVXBkYXRlIFByb2R1Y3QgTWV0YWRhdGEiKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgcHJvZHVjdCB7fSIsIHByb2R1Y3RUb1VwZGF0ZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJfQorCQkJcHJvZHVjdE9wZXJhdGlvbi5jb21taXQoKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCX0gZmluYWxseSB7CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHByb2R1Y3RJZCwgTm9kZVR5cGVFbnVtLlByb2R1Y3QpOworCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UHJvZHVjdCwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kVXBkYXRlUHJvZHVjdE1ldGFkYXRhKFVzZXIgdXNlciwgUHJvZHVjdCBjdXJyZW50UHJvZHVjdCwgUHJvZHVjdCB1cGRhdGVkUHJvZHVjdCkgeworCisJCWJvb2xlYW4gaGFzQmVlbkNlcnRpZmllZCA9IFZhbGlkYXRpb25VdGlscy5oYXNCZWVuQ2VydGlmaWVkKGN1cnJlbnRQcm9kdWN0LmdldFZlcnNpb24oKSk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZVByb2R1Y3ROYW1lKHVzZXIsIGN1cnJlbnRQcm9kdWN0LCB1cGRhdGVkUHJvZHVjdCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZUZ1bGxOYW1lKHVzZXIsIGN1cnJlbnRQcm9kdWN0LCB1cGRhdGVkUHJvZHVjdCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZURlc2NyaXB0aW9uKHVzZXIsIGN1cnJlbnRQcm9kdWN0LCB1cGRhdGVkUHJvZHVjdCwgbnVsbCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZUNhdGVnb3J5KHVzZXIsIGN1cnJlbnRQcm9kdWN0LCB1cGRhdGVkUHJvZHVjdCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZUNvbnRhY3RMaXN0KHVzZXIsIGN1cnJlbnRQcm9kdWN0LCB1cGRhdGVkUHJvZHVjdCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZVRhZ3ModXNlciwgY3VycmVudFByb2R1Y3QsIHVwZGF0ZWRQcm9kdWN0KTsKKwkJaWYgKHJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IHJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCQlyZXNwb25zZSA9IHZhbGlkYXRlQW5kVXBkYXRlUHJvamVjdENvZGUodXNlciwgY3VycmVudFByb2R1Y3QsIHVwZGF0ZWRQcm9kdWN0KTsKKwkJaWYgKHJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IHJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCQlpZiAodXBkYXRlZFByb2R1Y3QuZ2V0SXNBY3RpdmUoKSAhPSBudWxsKSB7CisJCQljdXJyZW50UHJvZHVjdC5zZXRJc0FjdGl2ZSh1cGRhdGVkUHJvZHVjdC5nZXRJc0FjdGl2ZSgpKTsKKwkJfQorCisJCXJlc3BvbnNlID0gdmFsaWRhdGVBbmRVcGRhdGVJY29uKHVzZXIsIGN1cnJlbnRQcm9kdWN0LCB1cGRhdGVkUHJvZHVjdCwgaGFzQmVlbkNlcnRpZmllZCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJU3RyaW5nIGN1cnJlbnRJbnZhcmlhbnRVdWlkID0gY3VycmVudFByb2R1Y3QuZ2V0SW52YXJpYW50VVVJRCgpOworCQlTdHJpbmcgdXBkYXRlZEludmFyaWFudFV1aWQgPSB1cGRhdGVkUHJvZHVjdC5nZXRJbnZhcmlhbnRVVUlEKCk7CisKKwkJaWYgKCh1cGRhdGVkSW52YXJpYW50VXVpZCAhPSBudWxsKSAmJiAoIXVwZGF0ZWRJbnZhcmlhbnRVdWlkLmVxdWFscyhjdXJyZW50SW52YXJpYW50VXVpZCkpKSB7CisJCQlsb2cud2FybigiUHJvZHVjdCBpbnZhcmlhbnQgVVVJRCBpcyBhdXRvbWF0aWNhbGx5IHNldCBhbmQgY2Fubm90IGJlIHVwZGF0ZWQiKTsKKwkJCXVwZGF0ZWRQcm9kdWN0LnNldEludmFyaWFudFVVSUQoY3VycmVudEludmFyaWFudFV1aWQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjdXJyZW50UHJvZHVjdCk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRVcGRhdGVQcm9kdWN0TmFtZShVc2VyIHVzZXIsIFByb2R1Y3QgY3VycmVudFByb2R1Y3QsIFByb2R1Y3QgdXBkYXRlZFByb2R1Y3QpIHsKKwkJU3RyaW5nIHVwZGF0ZWRQcm9kdWN0TmFtZSA9IHVwZGF0ZWRQcm9kdWN0LmdldE5hbWUoKTsKKwkJU3RyaW5nIHRhZ3MgPSAiIjsKKwkJU3RyaW5nIGN1cnJlbnRQcm9kdWN0TmFtZSA9IGN1cnJlbnRQcm9kdWN0LmdldE5hbWUoKTsKKwkJaWYgKHVwZGF0ZWRQcm9kdWN0TmFtZSAhPSBudWxsKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRQcm9kdWN0TmFtZVJlc3BvbnNlID0gdmFsaWRhdGVQcm9kdWN0TmFtZUFuZENsZWFudXAodXNlciwgdXBkYXRlZFByb2R1Y3QsIG51bGwpOworCQkJaWYgKHZhbGlkYXRQcm9kdWN0TmFtZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9ucyA9IHZhbGlkYXRQcm9kdWN0TmFtZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9ucyk7CisJCQl9CisJCQl1cGRhdGVkUHJvZHVjdE5hbWUgPSB1cGRhdGVkUHJvZHVjdC5nZXROYW1lKCk7CisJCQlpZiAoIWN1cnJlbnRQcm9kdWN0TmFtZS5lcXVhbHModXBkYXRlZFByb2R1Y3ROYW1lKSkgeworCQkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcHJvZHVjdE5hbWVVbmlxdWVuZXNzVmFsaWRhdGlvbiA9IHZhbGlkYXRlQ29tcG9uZW50TmFtZVVuaXF1ZSh1c2VyLCB1cGRhdGVkUHJvZHVjdCwgbnVsbCk7CisJCQkJaWYgKHByb2R1Y3ROYW1lVW5pcXVlbmVzc1ZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBwcm9kdWN0TmFtZVVuaXF1ZW5lc3NWYWxpZGF0aW9uOworCQkJCX0KKwkJCQljdXJyZW50UHJvZHVjdC5zZXROYW1lKHVwZGF0ZWRQcm9kdWN0TmFtZSk7CisJCQkJdGFncyA9IHVwZGF0ZWRQcm9kdWN0TmFtZTsKKwkJCQl1cGRhdGVkUHJvZHVjdE5hbWUgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNERpc3BsYXkodXBkYXRlZFByb2R1Y3ROYW1lKTsKKwkJCQljdXJyZW50UHJvZHVjdC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0Tm9ybWFsaXplZE5hbWUoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudE5hbWUodXBkYXRlZFByb2R1Y3ROYW1lKSk7CisJCQkJTGlzdDxTdHJpbmc+IHVwZGF0ZWRUYWdzID0gdXBkYXRlZFByb2R1Y3QuZ2V0VGFncygpOworCQkJCS8vIEFzIGRpc2N1c3NlZCB3aXRoIEVsbGEgY3VycmVudGx5ICgxNjA0KSB3ZSBhcmUgbm90IHJlbW92aW5nCisJCQkJLy8gdGhlIG9sZCBuYW1lIGZyb20gdGFncy4KKwkJCQlpZiAodXBkYXRlZFRhZ3MgPT0gbnVsbCkgeworCQkJCQl1cGRhdGVkVGFncyA9IGN1cnJlbnRQcm9kdWN0LmdldFRhZ3MoKTsKKwkJCQl9CisJCQkJdXBkYXRlZFRhZ3MuYWRkKHRhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRVcGRhdGVGdWxsTmFtZShVc2VyIHVzZXIsIFByb2R1Y3QgY3VycmVudFByb2R1Y3QsIFByb2R1Y3QgdXBkYXRlZFByb2R1Y3QpIHsKKwkJU3RyaW5nIHVwZGF0ZWRQcm9kdWN0TmFtZSA9IHVwZGF0ZWRQcm9kdWN0LmdldEZ1bGxOYW1lKCk7CisJCVN0cmluZyBjdXJyZW50UHJvZHVjdE5hbWUgPSBjdXJyZW50UHJvZHVjdC5nZXRGdWxsTmFtZSgpOworCQlpZiAodXBkYXRlZFByb2R1Y3ROYW1lICE9IG51bGwgJiYgIWN1cnJlbnRQcm9kdWN0TmFtZS5lcXVhbHModXBkYXRlZFByb2R1Y3ROYW1lKSkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0UHJvZHVjdE5hbWVSZXNwb25zZSA9IHZhbGlkYXRlUHJvZHVjdEZ1bGxOYW1lQW5kQ2xlYW51cCh1c2VyLCB1cGRhdGVkUHJvZHVjdCwgbnVsbCk7CisJCQlpZiAodmFsaWRhdFByb2R1Y3ROYW1lUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdFByb2R1Y3ROYW1lUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zKTsKKwkJCX0KKwkJCWN1cnJlbnRQcm9kdWN0LnNldEZ1bGxOYW1lKHVwZGF0ZWRQcm9kdWN0LmdldEZ1bGxOYW1lKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRVcGRhdGVDYXRlZ29yeShVc2VyIHVzZXIsIFByb2R1Y3QgY3VycmVudFByb2R1Y3QsIFByb2R1Y3QgdXBkYXRlZFByb2R1Y3QpIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5VXBkYXRlZCA9IHVwZGF0ZWRQcm9kdWN0LmdldENhdGVnb3JpZXMoKTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5Q3VycmVudCA9IGN1cnJlbnRQcm9kdWN0LmdldENhdGVnb3JpZXMoKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRDYXRlZ29yeVJlc3BvbnNlID0gdmFsaWRhdGVHcm91cGluZyh1c2VyLCB1cGRhdGVkUHJvZHVjdCwgbnVsbCk7CisJCWlmICh2YWxpZGF0Q2F0ZWdvcnlSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSB2YWxpZGF0Q2F0ZWdvcnlSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJY2F0ZWdvcnlVcGRhdGVkID0gdXBkYXRlZFByb2R1Y3QuZ2V0Q2F0ZWdvcmllcygpOworCQlpZiAoY2F0ZWdvcnlVcGRhdGVkICE9IG51bGwpIHsKKwkJCWN1cnJlbnRQcm9kdWN0LnNldENhdGVnb3JpZXMoY2F0ZWdvcnlVcGRhdGVkKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kVXBkYXRlQ29udGFjdExpc3QoVXNlciB1c2VyLCBQcm9kdWN0IGN1cnJlbnRQcm9kdWN0LCBQcm9kdWN0IHVwZGF0ZWRQcm9kdWN0KSB7CisJCUxpc3Q8U3RyaW5nPiB1cGRhdGVkQ29udGFjdHMgPSB1cGRhdGVkUHJvZHVjdC5nZXRDb250YWN0cygpOworCQlMaXN0PFN0cmluZz4gY3VycmVudENvbnRhY3RzID0gY3VycmVudFByb2R1Y3QuZ2V0Q29udGFjdHMoKTsKKwkJaWYgKHVwZGF0ZWRDb250YWN0cyAhPSBudWxsKSB7CisJCQlpZiAoIShjdXJyZW50Q29udGFjdHMuY29udGFpbnNBbGwodXBkYXRlZENvbnRhY3RzKSAmJiB1cGRhdGVkQ29udGFjdHMuY29udGFpbnNBbGwoY3VycmVudENvbnRhY3RzKSkpIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRSZXNwb25zZSA9IHZhbGlkYXRlQW5kVXBkYXRlUHJvZHVjdENvbnRhY3RzTGlzdCh1c2VyLCB1cGRhdGVkUHJvZHVjdCwgbnVsbCk7CisJCQkJaWYgKHZhbGlkYXRSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnMpOworCQkJCX0KKwkJCQljdXJyZW50UHJvZHVjdC5zZXRDb250YWN0cyh1cGRhdGVkUHJvZHVjdC5nZXRDb250YWN0cygpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kVXBkYXRlVGFncyhVc2VyIHVzZXIsIFByb2R1Y3QgY3VycmVudFByb2R1Y3QsIFByb2R1Y3QgdXBkYXRlZFByb2R1Y3QpIHsKKwkJTGlzdDxTdHJpbmc+IHRhZ3NVcGRhdGVkID0gdXBkYXRlZFByb2R1Y3QuZ2V0VGFncygpOworCQlMaXN0PFN0cmluZz4gdGFnc0N1cnJlbnQgPSBjdXJyZW50UHJvZHVjdC5nZXRUYWdzKCk7CisJCWlmICh0YWdzVXBkYXRlZCAhPSBudWxsKSB7CisJCQlpZiAoISh0YWdzQ3VycmVudC5jb250YWluc0FsbCh0YWdzVXBkYXRlZCkgJiYgdGFnc1VwZGF0ZWQuY29udGFpbnNBbGwodGFnc0N1cnJlbnQpKSkgeworCQkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdFJlc3BvbnNlID0gdmFsaWRhdGVUYWdzTGlzdEFuZFJlbW92ZUR1cGxpY2F0ZXModXNlciwgdXBkYXRlZFByb2R1Y3QsIGN1cnJlbnRQcm9kdWN0LmdldE5hbWUoKSwgbnVsbCk7CisJCQkJaWYgKHZhbGlkYXRSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnMpOworCQkJCX0KKwkJCQljdXJyZW50UHJvZHVjdC5zZXRUYWdzKHVwZGF0ZWRQcm9kdWN0LmdldFRhZ3MoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlTWFya2VkQ29tcG9uZW50cygpIHsKKwkJLy8gbWFya0FzRGVsZXRlZCBpc250IGltcGxlbWVudGVkIHlldAorCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEFycmF5TGlzdDw+KCkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVGFnUGF0dGVybihTdHJpbmcgdGFnKSB7CisJCXJldHVybiBWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lRm9ybWF0KHRhZyk7CisJfQorCisJcHVibGljIEVpdGhlcjxQcm9kdWN0LCBSZXNwb25zZUZvcm1hdD4gZ2V0UHJvZHVjdEJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIHByb2R1Y3ROYW1lLCBTdHJpbmcgcHJvZHVjdFZlcnNpb24sIFN0cmluZyB1c2VySWQpIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBTZXJ2aWNlIEJ5IE5hbWUgQW5kIFZlcnNpb24iLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJRWl0aGVyPFByb2R1Y3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0b3JhZ2VTdGF0dXMgPSBwcm9kdWN0T3BlcmF0aW9uLmdldFByb2R1Y3RCeU5hbWVBbmRWZXJzaW9uKHByb2R1Y3ROYW1lLCBwcm9kdWN0VmVyc2lvbiwgZmFsc2UpOworCQlpZiAoc3RvcmFnZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBzZXJ2aWNlIGJ5IG5hbWUge30gYW5kIHZlcnNpb24ge30iLCBwcm9kdWN0TmFtZSwgcHJvZHVjdFZlcnNpb24pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMucmlnaHQoKS52YWx1ZSgpLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKSwgcHJvZHVjdE5hbWUpKTsKKwkJfQorCQlQcm9kdWN0IHByb2R1Y3QgPSBzdG9yYWdlU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQocHJvZHVjdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBnZXRDb21wb25lbnRJbnN0YW5jZUJMKCkgeworCQlyZXR1cm4gcHJvZHVjdENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBSZXNwb25zZUZvcm1hdD4gZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeVByb3BlcnRpZXNBbmRJbnB1dHMoU3RyaW5nIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHNlYXJjaFRleHQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIElDYWNoZU1hbmdlck9wZXJhdGlvbiBnZXRDYWNoZU1hbmFnZXJPcGVyYXRpb24oKSB7CisJCXJldHVybiBjYWNoZU1hbmFnZXJPcGVyYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FjaGVNYW5hZ2VyT3BlcmF0aW9uKElDYWNoZU1hbmdlck9wZXJhdGlvbiBjYWNoZU1hbmFnZXJPcGVyYXRpb24pIHsKKwkJdGhpcy5jYWNoZU1hbmFnZXJPcGVyYXRpb24gPSBjYWNoZU1hbmFnZXJPcGVyYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvZHVjdE9wZXJhdGlvbihQcm9kdWN0T3BlcmF0aW9uIHByb2R1Y3RPcGVyYXRpb24pIHsKKwkJdGhpcy5wcm9kdWN0T3BlcmF0aW9uID0gcHJvZHVjdE9wZXJhdGlvbjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1Byb2R1Y3RDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUHJvZHVjdENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTg4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1Byb2R1Y3RDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNvbXBvbmVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJwcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBQcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIHsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQWxsb3dlZFRvQ29udGFpbkNvbXBJbnN0YW5jZXMob3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbnRhaW5lckNvbXBvbmVudCkgeworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE5vZGVUeXBlRW51bSBnZXROb2RlVHlwZU9mQ29tcG9uZW50SW5zdGFuY2VPcmlnaW4oKSB7CisJCS8vIFRPRE8gUGF2ZWwgdGhpcyBtaWdodCBiZSBhbHNvIGEgcmVzb3VyY2U/CisJCXJldHVybiBOb2RlVHlwZUVudW0uU2VydmljZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbnRhaW5lckNvbXBvbmVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHByb2R1Y3RPcGVyYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvbmVudE9wZXJhdGlvbiBnZXRDb21wSW5zdE9yaWdpbkNvbXBvbmVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHNlcnZpY2VPcGVyYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvbmVudFR5cGVFbnVtIGdldENvbXBvbmVudFR5cGVPZkNvbXBvbmVudEluc3RhbmNlKCkgeworCQlyZXR1cm4gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9JTlNUQU5DRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1Byb3BlcnR5QnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Qcm9wZXJ0eUJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZiMWMxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Qcm9wZXJ0eUJ1c2luZXNzTG9naWMuamF2YQpAQCAtMCwwICsxLDM5MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklFbGVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLnV0aWxzLkNvbXBvbmVudFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVByb3BlcnR5VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlByb3BlcnR5VmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRW50cnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoInByb3BlcnR5QnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgUHJvcGVydHlCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQmFzZUJ1c2luZXNzTG9naWMgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QUk9QRVJUWSA9ICJDcmVhdGVQcm9wZXJ0eSI7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvcGVydHlCdXNpbmVzc0xvZ2ljLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSVJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uID0gbnVsbDsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbiA9IG51bGw7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKworCXByb3RlY3RlZCBzdGF0aWMgSUVsZW1lbnRPcGVyYXRpb24gZ2V0RWxlbWVudERhbyhDbGFzczxJRWxlbWVudE9wZXJhdGlvbj4gY2xhc3MxLCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisKKwkJcmV0dXJuIHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKGNsYXNzMSk7CisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZ2V0QWxsRGF0YVR5cGVzKCkgeworCQlFaXRoZXI8TWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckFsbERhdGFUeXBlcyA9IGdldEFsbERhdGFUeXBlcyhhcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUpOworCQlyZXR1cm4gZWl0aGVyQWxsRGF0YVR5cGVzOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBuZXcgcHJvcGVydHkgb24gcmVzb3VyY2UgaW4gZ3JhcGgKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkgKiBAcGFyYW0gbmV3UHJvcGVydHlEZWZpbml0aW9uCisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4gRWl0aGVyPFByb3BlcnR5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPgorCSAqLworCXB1YmxpYyBFaXRoZXI8RW50cnlEYXRhPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVByb3BlcnR5KFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eURlZmluaXRpb24gbmV3UHJvcGVydHlEZWZpbml0aW9uLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPEVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJjcmVhdGUgUHJvcGVydHkiLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tSZXN1bHQgPSBncmFwaExvY2tPcGVyYXRpb24ubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQlpZiAoIWxvY2tSZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3IoQ1JFQVRFX1BST1BFUlRZLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHJlc291cmNlSWQpOworCQkJbG9nLmluZm8oIkZhaWxlZCB0byBsb2NrIGNvbXBvbmVudCB7fS4gRXJyb3IgLSB7fSIsIHJlc291cmNlSWQsIGxvY2tSZXN1bHQpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXRyeSB7CisJCQkvLyBHZXQgdGhlIHJlc291cmNlIGZyb20gREIKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCk7CisJCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCwgIiIpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCS8vIHZlcmlmeSB0aGF0IHJlc291cmNlIGlzIGNoZWNrZWQtb3V0IGFuZCB0aGUgdXNlciBpcyB0aGUgbGFzdAorCQkJLy8gdXBkYXRlcgorCQkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UsIHVzZXJJZCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCS8vIHZlcmlmeSBwcm9wZXJ0eSBub3QgZXhpc3QgaW4gcmVzb3VyY2UKKwkJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiByZXNvdXJjZVByb3BlcnRpZXMgPSByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCk7CisKKwkJCWlmIChyZXNvdXJjZVByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJCWlmIChwcm9wZXJ0eU9wZXJhdGlvbi5pc1Byb3BlcnR5RXhpc3QocmVzb3VyY2VQcm9wZXJ0aWVzLCByZXNvdXJjZUlkLCBwcm9wZXJ0eU5hbWUpKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlBST1BFUlRZX0FMUkVBRFlfRVhJU1QsICIiKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCisJCQlFaXRoZXI8TWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGFsbERhdGFUeXBlcyA9IGdldEFsbERhdGFUeXBlcyhhcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUpOworCQkJaWYgKGFsbERhdGFUeXBlcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMgPSBhbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCS8vIHZhbGlkYXRlIHByb3BlcnR5IGRlZmF1bHQgdmFsdWVzCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGRlZmF1bHRWYWx1ZXNWYWxpZGF0aW9uID0gdmFsaWRhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZShuZXdQcm9wZXJ0eURlZmluaXRpb24sIGRhdGFUeXBlcyk7CisJCQlpZiAoZGVmYXVsdFZhbHVlc1ZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGRlZmF1bHRWYWx1ZXNWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCS8vIGNvbnZlcnQgcHJvcGVydHkKKwkJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBnZXRUeXBlKG5ld1Byb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQkJaWYgKHR5cGUgIT0gbnVsbCkgeworCQkJCVByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgY29udmVydGVyID0gdHlwZS5nZXRDb252ZXJ0ZXIoKTsKKwkJCQkvLyBnZXQgaW5uZXIgdHlwZQorCQkJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQkJCWlmIChuZXdQcm9wZXJ0eURlZmluaXRpb24gIT0gbnVsbCkgeworCQkJCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYSA9IG5ld1Byb3BlcnR5RGVmaW5pdGlvbi5nZXRTY2hlbWEoKTsKKwkJCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7CisJCQkJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3AgPSBzY2hlbWEuZ2V0UHJvcGVydHkoKTsKKwkJCQkJCWlmIChwcm9wICE9IG51bGwpIHsKKwkJCQkJCQlpbm5lclR5cGUgPSBwcm9wLmdldFR5cGUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlTdHJpbmcgY29udmVydGVkVmFsdWUgPSBudWxsOworCQkJCQlpZiAobmV3UHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKKwkJCQkJCWNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLmNvbnZlcnQobmV3UHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCQluZXdQcm9wZXJ0eURlZmluaXRpb24uc2V0RGVmYXVsdFZhbHVlKGNvbnZlcnRlZFZhbHVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gYWRkIHRoZSBuZXcgcHJvcGVydHkgdG8gcmVzb3VyY2Ugb24gZ3JhcGgKKwkJCS8vIG5lZWQgdG8gZ2V0IFN0b3JhZ2VPcGFlcmF0aW9uU3RhdHVzIGFuZCBjb252ZXJ0IHRvIEFjdGlvblN0YXR1cworCQkJLy8gZnJvbSBjb21wb25lbnRzVXRpbHMKKwkJCUVpdGhlcjxQcm9wZXJ0eURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IHByb3BlcnR5T3BlcmF0aW9uLmFkZFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3UHJvcGVydHlEZWZpbml0aW9uLCByZXNvdXJjZUlkKTsKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlLmdldE5hbWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVByb3BlcnR5RGVmaW5pdGlvbiBjcmVhdGVkUHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHlPcGVyYXRpb24uY29udmVydFByb3BlcnR5RGF0YVRvUHJvcGVydHlEZWZpbml0aW9uKGVpdGhlci5sZWZ0KCkudmFsdWUoKSwgcHJvcGVydHlOYW1lLCByZXNvdXJjZUlkKTsKKwkJCUVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydHkgPSBuZXcgRW50cnlEYXRhPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPihwcm9wZXJ0eU5hbWUsIGNyZWF0ZWRQcm9wZXJ0eURlZmluaXRpb24pOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocHJvcGVydHkpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJY29tbWl0T3JSb2xsYmFjayhyZXN1bHQpOworCQkJLy8gdW5sb2NrIGNvbXBvbmVudAorCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBHZXQgcHJvcGVydHkgb2YgcmVzb3VyY2UKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBwcm9wZXJ0eUlkCisJICogQHBhcmFtIHVzZXJJZAorCSAqICAgICAgICAgICAgVE9ETworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGdldFByb3BlcnR5KFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcHJvcGVydHlJZCwgU3RyaW5nIHVzZXJJZCkgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJjcmVhdGUgQ29tcG9uZW50IEluc3RhbmNlIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJLy8gR2V0IHRoZSByZXNvdXJjZSBmcm9tIERCCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCk7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELCAiIikpOworCQl9CisJCVJlc291cmNlIHJlc291cmNlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIHZlcmlmeSBwcm9wZXJ0eSBleGlzdCBpbiByZXNvdXJjZQorCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IHJlc291cmNlLmdldFByb3BlcnRpZXMoKTsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlBST1BFUlRZX05PVF9GT1VORCwgIiIpKTsKKwkJfQorCQlmb3IgKFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKwkJCS8vIGVzb2ZlciAtIGNoZWNrIGFsc28gdGhhdCB0aGUgcHJvcGVydHkgYmVsb25ncyB0byB0aGUgY3VycmVudAorCQkJLy8gcmVzb3VyY2UKKwkJCWlmIChwcm9wZXJ0eS5nZXRVbmlxdWVJZCgpLmVxdWFscyhwcm9wZXJ0eUlkKSAmJiBwcm9wZXJ0eS5nZXRQYXJlbnRVbmlxdWVJZCgpLmVxdWFscyhyZXNvdXJjZUlkKSkgeworCQkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQlwcm9wTWFwLnB1dChwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5KTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocHJvcE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTk9UX0ZPVU5ELCAiIikpOworCX0KKworCS8qKgorCSAqIGRlbGV0ZSBwcm9wZXJ0eSBvZiByZXNvdXJjZSBmcm9tIGdyYXBoCisJICogCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcGFyYW0gcHJvcGVydHlJZAorCSAqIEBwYXJhbSB1c2VySWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxFbnRyeURhdGE8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlUHJvcGVydHkoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBwcm9wZXJ0eUlkLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPEVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJkZWxldGUgUHJvcGVydHkiLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tSZXN1bHQgPSBncmFwaExvY2tPcGVyYXRpb24ubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQlpZiAoIWxvY2tSZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3IoQ1JFQVRFX1BST1BFUlRZLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHJlc291cmNlSWQpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXRyeSB7CisKKwkJCS8vIEdldCB0aGUgcmVzb3VyY2UgZnJvbSBEQgorCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBnZXRSZXNvdXJjZShyZXNvdXJjZUlkKTsKKwkJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELCAiIikpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJLy8gdmVyaWZ5IHRoYXQgcmVzb3VyY2UgaXMgY2hlY2tlZC1vdXQgYW5kIHRoZSB1c2VyIGlzIHRoZSBsYXN0CisJCQkvLyB1cGRhdGVyCisJCQlpZiAoIUNvbXBvbmVudFZhbGlkYXRpb25VdGlscy5jYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSwgdXNlcklkKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJLy8gdmVyaWZ5IHByb3BlcnR5IGV4aXN0IGluIHJlc291cmNlCisJCQlFaXRoZXI8RW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gc3RhdHVzR2V0UHJvcGVydHkgPSBnZXRQcm9wZXJ0eShyZXNvdXJjZUlkLCBwcm9wZXJ0eUlkLCB1c2VySWQpOworCQkJaWYgKHN0YXR1c0dldFByb3BlcnR5LmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXNHZXRQcm9wZXJ0eS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gc3RhdHVzR2V0UHJvcGVydHkubGVmdCgpLnZhbHVlKCkuZ2V0S2V5KCk7CisKKwkJCS8vIGRlbGV0ZSBwcm9wZXJ0eSBvZiByZXNvdXJjZSBmcm9tIGdyYXBoCisJCQkvLyBUT0RPOiBuZWVkIHRvIGdldCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzCisJCQlFaXRoZXI8UHJvcGVydHlEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBwcm9wZXJ0eU9wZXJhdGlvbi5kZWxldGVQcm9wZXJ0eShwcm9wZXJ0eUlkKTsKKwkJCS8vIEVpdGhlcjxQcm9wZXJ0eURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9CisJCQkvLyBwcm9wZXJ0eU9wZXJhdGlvbi5kZWxldGVQcm9wZXJ0eUZyb21HcmFwaChwcm9wZXJ0eUlkKTsKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlLmdldE5hbWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQkvLyBwcm9wZXJ0eU9wZXJhdGlvbi5nZXRUaXRhbkdlbmVyaWNEYW8oKS5jb21taXQoKTsKKwkJCVByb3BlcnR5RGVmaW5pdGlvbiBjcmVhdGVkUHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHlPcGVyYXRpb24uY29udmVydFByb3BlcnR5RGF0YVRvUHJvcGVydHlEZWZpbml0aW9uKGVpdGhlci5sZWZ0KCkudmFsdWUoKSwgcHJvcGVydHlOYW1lLCByZXNvdXJjZUlkKTsKKwkJCUVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydHkgPSBuZXcgRW50cnlEYXRhPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPihwcm9wZXJ0eU5hbWUsIGNyZWF0ZWRQcm9wZXJ0eURlZmluaXRpb24pOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocHJvcGVydHkpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJY29tbWl0T3JSb2xsYmFjayhyZXN1bHQpOworCQkJLy8gdW5sb2NrIGNvbXBvbmVudAorCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQl9CisJfQorCisJLyoqCisJICogdXBkYXRlIHByb3BlcnR5CisJICogCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcGFyYW0gcHJvcGVydHlJZAorCSAqIEBwYXJhbSBuZXdQcm9wZXJ0eURlZmluaXRpb24KKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8RW50cnlEYXRhPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVByb3BlcnR5KFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcHJvcGVydHlJZCwgUHJvcGVydHlEZWZpbml0aW9uIG5ld1Byb3BlcnR5RGVmaW5pdGlvbiwgU3RyaW5nIHVzZXJJZCkgeworCisJCUVpdGhlcjxFbnRyeURhdGE8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gbnVsbDsKKworCQkvLyBHZXQgdGhlIHJlc291cmNlIGZyb20gREIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBnZXRSZXNvdXJjZShyZXNvdXJjZUlkKTsKKwkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsICIiKSk7CisJCX0KKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gdmVyaWZ5IHRoYXQgcmVzb3VyY2UgaXMgY2hlY2tlZC1vdXQgYW5kIHRoZSB1c2VyIGlzIHRoZSBsYXN0IHVwZGF0ZXIKKwkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UsIHVzZXJJZCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQl9CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrUmVzdWx0ID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQocmVzb3VyY2VJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJaWYgKCFsb2NrUmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkTG9ja09iamVjdEVycm9yKENSRUFURV9QUk9QRVJUWSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCByZXNvdXJjZUlkKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQl0cnkgeworCisJCQkvLyB2ZXJpZnkgcHJvcGVydHkgZXhpc3QgaW4gcmVzb3VyY2UKKwkJCUVpdGhlcjxFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBzdGF0dXNHZXRQcm9wZXJ0eSA9IGdldFByb3BlcnR5KHJlc291cmNlSWQsIHByb3BlcnR5SWQsIHVzZXJJZCk7CisJCQlpZiAoc3RhdHVzR2V0UHJvcGVydHkuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1c0dldFByb3BlcnR5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBzdGF0dXNHZXRQcm9wZXJ0eS5sZWZ0KCkudmFsdWUoKS5nZXRLZXkoKTsKKworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhbGxEYXRhVHlwZXMgPSBnZXRBbGxEYXRhVHlwZXMoYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlKTsKKwkJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFsbERhdGFUeXBlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcyA9IGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCS8vIHZhbGlkYXRlIHByb3BlcnR5IGRlZmF1bHQgdmFsdWVzCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGRlZmF1bHRWYWx1ZXNWYWxpZGF0aW9uID0gdmFsaWRhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZShuZXdQcm9wZXJ0eURlZmluaXRpb24sIGRhdGFUeXBlcyk7CisJCQlpZiAoZGVmYXVsdFZhbHVlc1ZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGRlZmF1bHRWYWx1ZXNWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJLy8gYWRkIHRoZSBuZXcgcHJvcGVydHkgdG8gcmVzb3VyY2Ugb24gZ3JhcGgKKwkJCS8vIFRPRE86IGNvbnZlcnQgVGl0YW5PcGVyYXRpb25TdGF0dXMgdG8gU3RvcmdhZS4uLgorCQkJRWl0aGVyPFByb3BlcnR5RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gcHJvcGVydHlPcGVyYXRpb24udXBkYXRlUHJvcGVydHkocHJvcGVydHlJZCwgbmV3UHJvcGVydHlEZWZpbml0aW9uLCBkYXRhVHlwZXMpOworCQkJLy8gRWl0aGVyPFByb3BlcnR5RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0KKwkJCS8vIHByb3BlcnR5T3BlcmF0aW9uLnVwZGF0ZVByb3BlcnR5RnJvbUdyYXBoKHByb3BlcnR5SWQsCisJCQkvLyBuZXdQcm9wZXJ0eURlZmluaXRpb24pOworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgdXBkYXRpbmcgcHJvcGVydHkgd2l0aCBpZCB7fS4gUmVhc29uIC0ge30iLCBwcm9wZXJ0eUlkLCBlaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlLmdldE5hbWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisKKwkJCVByb3BlcnR5RGVmaW5pdGlvbiBjcmVhdGVkUHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHlPcGVyYXRpb24uY29udmVydFByb3BlcnR5RGF0YVRvUHJvcGVydHlEZWZpbml0aW9uKGVpdGhlci5sZWZ0KCkudmFsdWUoKSwgcHJvcGVydHlOYW1lLCByZXNvdXJjZUlkKTsKKwkJCUVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydHkgPSBuZXcgRW50cnlEYXRhPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPihwcm9wZXJ0eU5hbWUsIGNyZWF0ZWRQcm9wZXJ0eURlZmluaXRpb24pOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocHJvcGVydHkpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJY29tbWl0T3JSb2xsYmFjayhyZXN1bHQpOworCQkJLy8gdW5sb2NrIGNvbXBvbmVudAorCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUmVxdWlyZW1lbnRzQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9SZXF1aXJlbWVudHNCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZGU5OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUmVxdWlyZW1lbnRzQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMudXRpbHMuQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJyZXF1aXJlbWVudHNCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBSZXF1aXJlbWVudHNCdXNpbmVzc0xvZ2ljIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVxdWlyZW1lbnRzQnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHM7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIHJlc291cmNlQnVzaW5lc3NMb2dpYzsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVJlcXVpcmVtZW50KFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcmVxdWlyZW1lbnRJZCwgUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmaW5pdGlvbiwgU3RyaW5nIHVzZXJJZCkgeworCisJCS8vIEdldCB0aGUgcmVzb3VyY2UgZnJvbSBEQgorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IGdldFJlc291cmNlKHJlc291cmNlSWQpOworCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBnZXQgcmVzb3VyY2Uge30gZnJvbSBEQiIsIHJlc291cmNlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdGF0dXMucmlnaHQoKS52YWx1ZSgpKSwgIiIpKTsKKwkJfQorCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc291cmNlTWlzc2luZ0Vycm9yLCAiUmVxdWlyZW1lbnQgQnVzaW5lc3MgTG9naWMiLCByZXNvdXJjZUlkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUNvbXBvbmVudE1pc3NpbmdFcnJvcigiUmVxdWlyZW1lbnQgQnVzaW5lc3MgTG9naWMiLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpLCByZXNvdXJjZUlkKTsKKwkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZ2V0IHJlc291cmNlIHt9IGZyb20gREIiLCByZXNvdXJjZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwkJLy8gdmVyaWZ5IHRoYXQgcmVzb3VyY2UgaXMgY2hlY2tlZC1vdXQgYW5kIHRoZSB1c2VyIGlzIHRoZSBsYXN0IHVwZGF0ZXIKKwkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UsIHVzZXJJZCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQl9CisKKwkJLy8gVE9ETworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2UoZmluYWwgU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlsb2cuZGVidWcoIkdldCByZXNvdXJjZSB3aXRoIGlkIHt9IiwgcmVzb3VyY2VJZCk7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCk7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIlJlc291cmNlIHdpdGggaWQge30gd2FzIG5vdCBmb3VuZCIsIHJlc291cmNlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVJlc291cmNlIHJlc291cmNlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJHZW5lcmFsIEVycm9yIHdoaWxlIGdldCByZXNvdXJjZSB3aXRoIGlkIHt9IiwgcmVzb3VyY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUmVzb3VyY2VCdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1Jlc291cmNlQnVzaW5lc3NMb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzAzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1Jlc291cmNlQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsNTQ3NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWMuQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzLlJlc3VsdFN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzLlRvc2NhRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5Ub3NjYVRhZ05hbWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZS5MaWZlY3ljbGVCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uLkxpZmVjeWNsZUNoYW5jZUFjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyLkVycm9yU2V2ZXJpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGFtb2RlbC5hcGkuSGlnaGVzdEZpbHRlckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YW1vZGVsLnV0aWxzLkFydGlmYWN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvLkFydGlmYWN0VGVtcGxhdGVJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm8uTWVyZ2VkQXJ0aWZhY3RJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlSW5wdXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRQYXJhbWV0ZXJzVmlldzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR2V0SW5wdXRWYWx1ZUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdyb3VwUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JbnB1dERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW50ZXJmYWNlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlQ3ljbGVUcmFuc2l0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlBhcnNlZFRvc2NhWWFtbEluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVwbG9hZENhcEluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVwbG9hZFByb3BJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVwbG9hZFJlcUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXBsb2FkUmVzb3VyY2VJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuaGVhdC5IZWF0UGFyYW1ldGVyVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNhY2hlTWFuZ2VyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUVsZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNzYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkRhb1N0YXR1c0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuR3JvdXBPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLklucHV0c09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5VbmlxdWVJZEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy51dGlscy5Db21wb25lbnRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzLlJlcHJlc2VudGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5JVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXRpbHMuQ29tbW9uQmVVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5XcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5rcGkuYXBpLkFTRENLcGlBcGk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR2VuZXJhbFV0aWxpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuRHVtcGVyT3B0aW9uczsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLnJlcHJlc2VudGVyLlJlcHJlc2VudGVyOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5yZXNvbHZlci5SZXNvbHZlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgicmVzb3VyY2VCdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUJ1c2luZXNzTG9naWMgZXh0ZW5kcyBDb21wb25lbnRCdXNpbmVzc0xvZ2ljIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFDRV9IT0xERVJfUkVTT1VSQ0VfVFlQRVMgPSAidmFsaWRGb3JSZXNvdXJjZVR5cGVzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX1ZFUlNJT04gPSAiMC4xIjsKKworCVBhdHRlcm4gU1RSX1JFUExBQ0VfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXlsgXSpcXHtbIF0qIiArICJzdHJfcmVwbGFjZSIgKyAiPSIpOworCVBhdHRlcm4gVE9LRU5fUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiWyBdKlxce1sgXSoiICsgInRva2VuIiArICI9Iik7CisJUGF0dGVybiBHRVRfUFJPUEVSVFlfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiWyBdKlxce1sgXSoiICsgImdldF9wcm9wZXJ0eSIgKyAiPSIpOworCVBhdHRlcm4gQ09OQ0FUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlsgXSpcXHtbIF0qIiArICJjb25jYXQiICsgIj0iKTsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZXNvdXJjZUJ1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBSZXNvdXJjZUJ1c2luZXNzTG9naWMoKSB7CisJCWxvZy5kZWJ1ZygiUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIHN0YXJ0ZWQiKTsKKwl9CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gPSBudWxsOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgSUludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbiBpbnRlcmZhY2VUeXBlT3BlcmF0aW9uID0gbnVsbDsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIExpZmVjeWNsZUJ1c2luZXNzTG9naWMgbGlmZWN5Y2xlQnVzaW5lc3NMb2dpYzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIENzYXJPcGVyYXRpb24gY3Nhck9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFZGQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIHZmQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUmVzb3VyY2VJbXBvcnRNYW5hZ2VyIHJlc291cmNlSW1wb3J0TWFuYWdlcjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEdyb3VwQnVzaW5lc3NMb2dpYyBncm91cEJ1c2luZXNzTG9naWM7CisJQEF1dG93aXJlZAorCXByaXZhdGUgSW5wdXRzQnVzaW5lc3NMb2dpYyBpbnB1dHNCdXNpbmVzc0xvZ2ljOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElucHV0c09wZXJhdGlvbiBpbnB1dE9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEdyb3VwT3BlcmF0aW9uIGdyb3VwT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgSUhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uIGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgSUFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uIGNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIENvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYyBjb21wb3NpdGlvbkJ1c2luZXNzTG9naWM7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJQ2FjaGVNYW5nZXJPcGVyYXRpb24gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uOworCisJcHJpdmF0ZSBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJcHVibGljIENzYXJPcGVyYXRpb24gZ2V0Q3Nhck9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIGNzYXJPcGVyYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3Nhck9wZXJhdGlvbihDc2FyT3BlcmF0aW9uIGNzYXJPcGVyYXRpb24pIHsKKwkJdGhpcy5jc2FyT3BlcmF0aW9uID0gY3Nhck9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgSVJlc291cmNlT3BlcmF0aW9uIGdldFJlc291cmNlT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU9wZXJhdGlvbihSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbikgeworCQl0aGlzLnJlc291cmNlT3BlcmF0aW9uID0gcmVzb3VyY2VPcGVyYXRpb247CisJfQorCisJcHVibGljIExpZmVjeWNsZUJ1c2luZXNzTG9naWMgZ2V0TGlmZWN5Y2xlQnVzaW5lc3NMb2dpYygpIHsKKwkJcmV0dXJuIGxpZmVjeWNsZUJ1c2luZXNzTG9naWM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlTWFuYWdlcihMaWZlY3ljbGVCdXNpbmVzc0xvZ2ljIGxpZmVjeWNsZUJ1c2luZXNzTG9naWMpIHsKKwkJdGhpcy5saWZlY3ljbGVCdXNpbmVzc0xvZ2ljID0gbGlmZWN5Y2xlQnVzaW5lc3NMb2dpYzsKKwl9CisKKwlwdWJsaWMgSUVsZW1lbnRPcGVyYXRpb24gZ2V0RWxlbWVudERhbygpIHsKKwkJcmV0dXJuIGVsZW1lbnREYW87CisJfQorCisJcHVibGljIHZvaWQgc2V0RWxlbWVudERhbyhJRWxlbWVudE9wZXJhdGlvbiBlbGVtZW50RGFvKSB7CisJCXRoaXMuZWxlbWVudERhbyA9IGVsZW1lbnREYW87CisJfQorCisJcHVibGljIElVc2VyQnVzaW5lc3NMb2dpYyBnZXRVc2VyQWRtaW4oKSB7CisJCXJldHVybiB0aGlzLnVzZXJBZG1pbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VyQWRtaW4oVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluKSB7CisJCXRoaXMudXNlckFkbWluID0gdXNlckFkbWluOworCX0KKworCXB1YmxpYyBDb21wb25lbnRzVXRpbHMgZ2V0Q29tcG9uZW50c1V0aWxzKCkgeworCQlyZXR1cm4gdGhpcy5jb21wb25lbnRzVXRpbHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50c1V0aWxzKENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMpIHsKKwkJdGhpcy5jb21wb25lbnRzVXRpbHMgPSBjb21wb25lbnRzVXRpbHM7CisJfQorCisJcHVibGljIEFydGlmYWN0c0J1c2luZXNzTG9naWMgZ2V0QXJ0aWZhY3RzTWFuYWdlcigpIHsKKwkJcmV0dXJuIGFydGlmYWN0c0J1c2luZXNzTG9naWM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RzTWFuYWdlcihBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c01hbmFnZXIpIHsKKwkJdGhpcy5hcnRpZmFjdHNCdXNpbmVzc0xvZ2ljID0gYXJ0aWZhY3RzTWFuYWdlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU9wZXJhdGlvbihJUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb24pIHsKKwkJdGhpcy5wcm9wZXJ0eU9wZXJhdGlvbiA9IHByb3BlcnR5T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUgZ2V0QXBwbGljYXRpb25EYXRhVHlwZUNhY2hlKCkgeworCQlyZXR1cm4gYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZShBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUgYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlKSB7CisJCXRoaXMuYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlID0gYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgY2VydGlmaWVkLCB0aGUgcmV0dXJuZWQgcmVzb3VyY2VzIGFyZSBvbmx5IGFic3RyYWN0IG9yIG9ubHkgbm9uZSBhYnN0cmFjdCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhcmFtCisJICogCisJICogQHBhcmFtIGdldEFic3RyYWN0CisJICogQHBhcmFtIHVzZXJJZAorCSAqICAgICAgICAgICAgVE9ETworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBSZXNwb25zZUZvcm1hdD4gZ2V0QWxsQ2VydGlmaWVkUmVzb3VyY2VzKGJvb2xlYW4gZ2V0QWJzdHJhY3QsIEhpZ2hlc3RGaWx0ZXJFbnVtIGhpZ2hlc3RGaWx0ZXIsIFN0cmluZyB1c2VySWQpIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBBbGwgQ2VydGlmaWVkIFJlc291cmNlcyIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlJUmVzb3VyY2VPcGVyYXRpb24gZGF0YU1vZGVsID0gZ2V0UmVzb3VyY2VPcGVyYXRpb24oKTsKKwkJQm9vbGVhbiBpc0hpZ2hlc3QgPSBudWxsOworCQlzd2l0Y2ggKGhpZ2hlc3RGaWx0ZXIpIHsKKwkJY2FzZSBBTEw6CisJCQlicmVhazsKKwkJY2FzZSBISUdIRVNUX09OTFk6CisJCQlpc0hpZ2hlc3QgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgTk9OX0hJR0hFU1RfT05MWToKKwkJCWlzSGlnaGVzdCA9IGZhbHNlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCUVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGF0YU1vZGVsUmVzcG9uc2UgPSBkYXRhTW9kZWwuZ2V0QWxsQ2VydGlmaWVkUmVzb3VyY2VzKGdldEFic3RyYWN0LCBpc0hpZ2hlc3QpOworCisJCWlmIChkYXRhTW9kZWxSZXNwb25zZS5pc0xlZnQoKSkgeworCQkJbG9nLmRlYnVnKCJSZXRyaXZlZCBSZXNvdXJjZSBzdWNjZXNzZnVsbHkuIik7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZGF0YU1vZGVsUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQl9CisKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGRhdGFNb2RlbFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSkpOworCisJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgQm9vbGVhbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlTmFtZUV4aXN0cyhTdHJpbmcgcmVzb3VyY2VOYW1lLCBSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZUVudW0sIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAidmFsaWRhdGUgUmVzb3VyY2UgTmFtZSBFeGlzdHMiLCBmYWxzZSk7CisJCWlmIChyZXNwLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlJUmVzb3VyY2VPcGVyYXRpb24gZGF0YU1vZGVsID0gZ2V0UmVzb3VyY2VPcGVyYXRpb24oKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGF0YU1vZGVsUmVzcG9uc2UgPSBkYXRhTW9kZWwudmFsaWRhdGVSZXNvdXJjZU5hbWVFeGlzdHMocmVzb3VyY2VOYW1lLCByZXNvdXJjZVR5cGVFbnVtKTsKKworCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UuaXNMZWZ0KCkpIHsKKwkJCU1hcDxTdHJpbmcsIEJvb2xlYW4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCXJlc3VsdC5wdXQoImlzVmFsaWQiLCBkYXRhTW9kZWxSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoInZhbGlkYXRpb24gd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuIik7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJfQorCisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpKTsKKworCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyVUlQYXlsb2FkLCBTdHJpbmcgcGF5bG9hZE5hbWUpIHsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VSZXNwb25zZSA9IHZhbGlkYXRlUmVzb3VyY2VCZWZvcmVDcmVhdGUocmVzb3VyY2UsIHVzZXIsIGZhbHNlKTsKKwkJaWYgKGNyZWF0ZVJlc291cmNlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VSZXNwb25zZTsKKwkJfQorCisJCS8vIENyZWF0aW5nIHJlc291cmNlIGVpdGhlciBieSBEQU8gb3IgZnJvbSBDU0FSCisJCVN0cmluZyBjc2FyVVVJRCA9IG51bGw7CisJCWlmIChwYXlsb2FkTmFtZSA9PSBudWxsKSB7CisJCQljc2FyVVVJRCA9IHJlc291cmNlLmdldENzYXJVVUlEKCk7CisJCX0gZWxzZSB7CisJCQljc2FyVVVJRCA9IHBheWxvYWROYW1lOworCQl9CisJCWlmIChjc2FyVVVJRCAhPSBudWxsICYmICFjc2FyVVVJRC5pc0VtcHR5KCkpIHsKKwkJCS8vIGNoZWNrIGlmIFZGIHdpdGggdGhlIHNhbWUgQ3NhciBVVUlEIG9yIHdpdGggaGUgc2FtZSBuYW1lIGFscmVhZHkKKwkJCS8vIGV4aXN0cworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUNzYXJVdWlkVW5pcXVlbmVzc1JlcyA9IHJlc291cmNlT3BlcmF0aW9uLnZhbGlkYXRlQ3NhclV1aWRVbmlxdWVuZXNzKGNzYXJVVUlEKTsKKwkJCWlmICh2YWxpZGF0ZUNzYXJVdWlkVW5pcXVlbmVzc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB2YWxpZGF0ZSB1bmlxdWVuZXNzIG9mIENzYXJVVUlEIHt9IGZvciByZXNvdXJjZSIsIGNzYXJVVUlELCByZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSh2YWxpZGF0ZUNzYXJVdWlkVW5pcXVlbmVzc1Jlcy5yaWdodCgpLnZhbHVlKCkpKSk7CisJCQl9CisKKwkJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGV4aXN0aW5nUmVzb3VyY2VSZXMgPSB2YWxpZGF0ZUNzYXJVdWlkVW5pcXVlbmVzc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChleGlzdGluZ1Jlc291cmNlUmVzICE9IG51bGwgJiYgZXhpc3RpbmdSZXNvdXJjZVJlcy5zaXplKCkgPiAwKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHJlc291cmNlIHt9LCBjc2FyVVVJRCB7fSBhbHJlYWR5IGV4aXN0IGZvciBhIGRpZmZlcmVudCBWRiB7fSIsIHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSwgY3NhclVVSUQsIGV4aXN0aW5nUmVzb3VyY2VSZXMuZ2V0KDApLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlZTUF9BTFJFQURZX0VYSVNUUywgY3NhclVVSUQsIGV4aXN0aW5nUmVzb3VyY2VSZXMuZ2V0KDApLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKGVycm9yUmVzcG9uc2UsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIG51bGwpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisKKwkJCWxvZy5kZWJ1ZygiQ3NhclVVSUQgaXMge30gLSBnb2luZyB0byBjcmVhdGUgcmVzb3VyY2UgZnJvbSBDU0FSIiwgY3NhclVVSUQpOworCQkJY3JlYXRlUmVzb3VyY2VSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlRnJvbUNzYXIocmVzb3VyY2UsIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIGZhbHNlLCBFaXRoZXIubGVmdChjc2FyVUlQYXlsb2FkKSwgY3NhclVVSUQpOworCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlUmVzcG9uc2U7CisJCX0KKworCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VCeURhbyhyZXNvdXJjZSwgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSwgZmFsc2UpOworCX0KKworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZVJlc291cmNlRnJvbUNzYXIoUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyVUlQYXlsb2FkLCBTdHJpbmcgcGF5bG9hZE5hbWUsIFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVJlc291cmNlUmVzcG9uc2UgPSBudWxsOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlUmVzcG9uc2UgPSBudWxsOworCQlXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4oKTsKKwkJU3RyaW5nIGNzYXJVVUlEID0gbnVsbDsKKwkJU3RyaW5nIGNzYXJWZXJzaW9uID0gbnVsbDsKKwkJaWYgKHBheWxvYWROYW1lID09IG51bGwpIHsKKwkJCWNzYXJVVUlEID0gcmVzb3VyY2UuZ2V0Q3NhclVVSUQoKTsKKwkJCWNzYXJWZXJzaW9uID0gcmVzb3VyY2UuZ2V0Q3NhclZlcnNpb24oKTsKKwkJfSBlbHNlIHsKKwkJCWNzYXJVVUlEID0gcGF5bG9hZE5hbWU7CisJCX0KKwkJaWYgKGNzYXJVVUlEICE9IG51bGwgJiYgIWNzYXJVVUlELmlzRW1wdHkoKSkgeworCQkJUmVzb3VyY2Ugb2xkUmVzb3VyY2UgPSBnZXRSZXNvdXJjZUJ5VW5pcXVlSWQocmVzcG9uc2VXcmFwcGVyLCByZXNvdXJjZVVuaXF1ZUlkKTsKKwkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJdmFsaWRhdGVDc2FyVXVpZE1hdGNoaW5nKHJlc3BvbnNlV3JhcHBlciwgb2xkUmVzb3VyY2UsIHJlc291cmNlLCBjc2FyVVVJRCwgcmVzb3VyY2VVbmlxdWVJZCwgdXNlcik7CisJCQl9CisJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCXZhbGlkYXRlQ3NhcklzTm90QWxyZWFkeVVzZWQocmVzcG9uc2VXcmFwcGVyLCBvbGRSZXNvdXJjZSwgcmVzb3VyY2UsIGNzYXJVVUlELCB1c2VyKTsKKwkJCX0KKwkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJaWYgKG9sZFJlc291cmNlICE9IG51bGwgJiYgVmFsaWRhdGlvblV0aWxzLmhhc0JlZW5DZXJ0aWZpZWQob2xkUmVzb3VyY2UuZ2V0VmVyc2lvbigpKSkgeworCQkJCQlvdmVycmlkZUltbXV0YWJsZU1ldGFkYXRhKG9sZFJlc291cmNlLCByZXNvdXJjZSk7CisJCQkJfQorCQkJCXZhbGlkYXRlUmVzb3VyY2VSZXNwb25zZSA9IHZhbGlkYXRlUmVzb3VyY2VCZWZvcmVDcmVhdGUocmVzb3VyY2UsIHVzZXIsIGZhbHNlKTsKKwkJCQlpZiAodmFsaWRhdGVSZXNvdXJjZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHZhbGlkYXRlUmVzb3VyY2VSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJU3RyaW5nIG9sZENzYXJWZXJzaW9uID0gb2xkUmVzb3VyY2UuZ2V0Q3NhclZlcnNpb24oKTsKKwkJCQlsb2cuZGVidWcoIkNzYXJVVUlEIGlzIHt9IC0gZ29pbmcgdG8gdXBkYXRlIHJlc291cmNlIHdpdGggVW5pcXVlSWQge30gZnJvbSBDU0FSIiwgY3NhclVVSUQsIHJlc291cmNlVW5pcXVlSWQpOworCQkJCS8vIChvbiBib2FyZGluZyBmbG93KTogSWYgdGhlIHVwZGF0ZSBpbmNsdWRlcyBzYW1lIGNzYXJVVUlEIGFuZAorCQkJCS8vIHNhbWUgY3NhclZlcnNpb24gYXMgYWxyZWFkeSBpbiB0aGUgVkYgLSBubyBuZWVkIHRvIGltcG9ydCB0aGUKKwkJCQkvLyBjc2FyIChkbyBvbmx5IG1ldGFkYXRhIGNoYW5nZXMgaWYgdGhlcmUgYXJlKS4KKwkJCQlpZiAoY3NhclZlcnNpb24gIT0gbnVsbCAmJiBvbGRDc2FyVmVyc2lvbiAhPSBudWxsICYmIG9sZENzYXJWZXJzaW9uLmVxdWFscyhjc2FyVmVyc2lvbikpIHsKKwkJCQkJdXBkYXRlUmVzb3VyY2VSZXNwb25zZSA9IHVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VVbmlxdWVJZCwgcmVzb3VyY2UsIG9sZFJlc291cmNlLCB1c2VyLCBmYWxzZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdXBkYXRlUmVzb3VyY2VSZXNwb25zZSA9IHVwZGF0ZVJlc291cmNlRnJvbUNzYXIob2xkUmVzb3VyY2UsIHJlc291cmNlLCB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0uVVBEQVRFX1JFU09VUkNFX01FVEFEQVRBLCBmYWxzZSwgRWl0aGVyLmxlZnQoY3NhclVJUGF5bG9hZCksIGNzYXJVVUlEKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgcmVzb3VyY2Uge30sIGNzYXJVVUlEIG9yIHBheWxvYWQgbmFtZSBpcyBtaXNzaW5nIiwgcmVzb3VyY2UuZ2V0U3lzdGVtTmFtZSgpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ1NBUl9VVUlELCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UoZXJyb3JSZXNwb25zZSwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVycm9yUmVzcG9uc2UpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2VSZXNwb25zZTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ3NhcklzTm90QWxyZWFkeVVzZWQoV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2VXcmFwcGVyLCBSZXNvdXJjZSBvbGRSZXNvdXJjZSwgUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBjc2FyVVVJRCwgVXNlciB1c2VyKSB7CisJCS8vIChvbiBib2FyZGluZyBmbG93KTogSWYgdGhlIHVwZGF0ZSBpbmNsdWRlcyBhIGNzYXJVVUlEOiB2ZXJpZnkgdGhpcworCQkvLyBjc2FyVVVJRCBpcyBub3QgaW4gdXNlIGJ5IGFub3RoZXIgVkYsIElmIGl0IGlzIC0gdXNlIHNhbWUgZXJyb3IgYXMKKwkJLy8gYWJvdmU6CisJCS8vICJFcnJvcjogVGhlIFZTUCB3aXRoIFVVSUQgJTEgd2FzIGFscmVhZHkgaW1wb3J0ZWQgZm9yIFZGICUyLiBQbGVhc2UKKwkJLy8gc2VsZWN0IGFub3RoZXIgb3IgdXBkYXRlIHRoZSBleGlzdGluZyBWRi4iICUxIC0gY3NhclVVSUQsICUyIC0gVkYKKwkJLy8gbmFtZQorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlTGlua2VkVG9Dc2FyUmVzID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0UmVzb3VyY2VCeUNzYXJPck5hbWUoY3NhclVVSUQsIHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSk7CisJCWlmIChyZXNvdXJjZUxpbmtlZFRvQ3NhclJlcy5pc1JpZ2h0KCkpIHsKKwkJCWlmICghU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQuZXF1YWxzKHJlc291cmNlTGlua2VkVG9Dc2FyUmVzLnJpZ2h0KCkudmFsdWUoKSkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmaW5kIHByZXZpb3VzIHJlc291cmNlIGJ5IENTQVIge30gYW5kIHN5c3RlbSBuYW1lIHt9IiwgY3NhclVVSUQsIHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSk7CisJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc291cmNlTGlua2VkVG9Dc2FyUmVzLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghcmVzb3VyY2VMaW5rZWRUb0NzYXJSZXMubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMob2xkUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSkgJiYgIXJlc291cmNlTGlua2VkVG9Dc2FyUmVzLmxlZnQoKS52YWx1ZSgpLmdldE5hbWUoKS5lcXVhbHMob2xkUmVzb3VyY2UuZ2V0TmFtZSgpKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVlNQX0FMUkVBRFlfRVhJU1RTLCBjc2FyVVVJRCwgcmVzb3VyY2VMaW5rZWRUb0NzYXJSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TmFtZSgpKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKGVycm9yUmVzcG9uc2UsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5VUERBVEVfUkVTT1VSQ0VfTUVUQURBVEEsIG51bGwpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNzYXJVdWlkTWF0Y2hpbmcoV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2VXcmFwcGVyLCBSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2Ugb2xkUmVzb3VyY2UsIFN0cmluZyBjc2FyVVVJRCwgU3RyaW5nIHJlc291cmNlVW5pcXVlSWQsIFVzZXIgdXNlcikgeworCQkvLyAob24gYm9hcmRpbmcgZmxvdyk6IElmIHRoZSB1cGRhdGUgaW5jbHVkZXMgY3NhclVVSUQgd2hpY2ggaXMKKwkJLy8gZGlmZmVyZW50IGZyb20gdGhlIGNzYXJVVUlEIG9mIHRoZSBWRiAtIGZhaWwgd2l0aAorCQkvLyBlcnJvcjogIkVycm9yOiBSZXNvdXJjZSAlMSBjYW5ub3QgYmUgdXBkYXRlZCB1c2luZyBzaW5jZSBpdCBpcyBsaW5rZWQKKwkJLy8gdG8gYSBkaWZmZXJlbnQgVlNQIiAlMSAtIFZGIG5hbWUKKwkJU3RyaW5nIG9sZENzYXJVVUlEID0gb2xkUmVzb3VyY2UuZ2V0Q3NhclVVSUQoKTsKKwkJaWYgKG9sZENzYXJVVUlEICE9IG51bGwgJiYgIW9sZENzYXJVVUlELmlzRW1wdHkoKSAmJiAhY3NhclVVSUQuZXF1YWxzKG9sZENzYXJVVUlEKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIHJlc291cmNlIHdpdGggVW5pcXVlSWQge30gdXNpbmcgQ3NhciB7fSwgc2luY2UgdGhlIHJlc291cmNlIGlzIGxpbmtlZCB0byBhIGRpZmZlcmVudCBWU1Age30iLCByZXNvdXJjZVVuaXF1ZUlkLCBjc2FyVVVJRCwgb2xkQ3NhclVVSUQpOworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTElOS0VEX1RPX0RJRkZFUkVOVF9WU1AsIHJlc291cmNlLmdldE5hbWUoKSwgY3NhclVVSUQsIG9sZENzYXJVVUlEKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKGVycm9yUmVzcG9uc2UsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5VUERBVEVfUkVTT1VSQ0VfTUVUQURBVEEsIG51bGwpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKwkJfQorCX0KKworCXByaXZhdGUgUmVzb3VyY2UgZ2V0UmVzb3VyY2VCeVVuaXF1ZUlkKFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlV3JhcHBlciwgU3RyaW5nIHJlc291cmNlVW5pcXVlSWQpIHsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvbGRSZXNvdXJjZVJlcyA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlVW5pcXVlSWQpOworCQlpZiAob2xkUmVzb3VyY2VSZXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmaW5kIHByZXZpb3VzIHJlc291cmNlIGJ5IFVuaXF1ZUlkIHt9LCBzdGF0dXM6IHt9IiwgcmVzb3VyY2VVbmlxdWVJZCwgb2xkUmVzb3VyY2VSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShvbGRSZXNvdXJjZVJlcy5yaWdodCgpLnZhbHVlKCkpKSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gb2xkUmVzb3VyY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIG92ZXJyaWRlSW1tdXRhYmxlTWV0YWRhdGEoUmVzb3VyY2Ugb2xkUnJlc291cmNlLCBSZXNvdXJjZSByZXNvdXJjZSkgeworCQlyZXNvdXJjZS5zZXROYW1lKG9sZFJyZXNvdXJjZS5nZXROYW1lKCkpOworCQlyZXNvdXJjZS5zZXRJY29uKG9sZFJyZXNvdXJjZS5nZXRJY29uKCkpOworCQlyZXNvdXJjZS5zZXRUYWdzKG9sZFJyZXNvdXJjZS5nZXRUYWdzKCkpOworCQlyZXNvdXJjZS5zZXRWZW5kb3JOYW1lKG9sZFJyZXNvdXJjZS5nZXRWZW5kb3JOYW1lKCkpOworCQlyZXNvdXJjZS5zZXRDYXRlZ29yaWVzKG9sZFJyZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCkpOworCQlyZXNvdXJjZS5zZXREZXJpdmVkRnJvbShvbGRScmVzb3VyY2UuZ2V0RGVyaXZlZEZyb20oKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVSZXNvdXJjZUZyb21Dc2FyKFJlc291cmNlIG9sZFJyZXNvdXJjZSwgUmVzb3VyY2UgbmV3UnJlc291cmNlLCBVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSB1cGRhdGVSZXNvdXJjZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBFaXRoZXI8TWFwPFN0cmluZywgYnl0ZVtdPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3NhclVJUGF5bG9hZCwKKwkJCVN0cmluZyBjc2FyVVVJRCkgeworCisJCS8vIGNoZWNrIHN0YXRlCisJCWlmIChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5lcXVhbHMob2xkUnJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkpKSB7CisJCQlpZiAoIW9sZFJyZXNvdXJjZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLmVxdWFscyh1c2VyLmdldFVzZXJJZCgpKSkgeworCQkJCWxvZy5kZWJ1ZygiQ3VycmVudCB1c2VyIGlzIG5vdCBsYXN0IHVwZGF0ZXIsIGxhc3QgdXBkYXRlciB1c2VySWQ6IHt9LCBjdXJyZW50IHVzZXIgdXNlcklkOiB7fSIsIG9sZFJyZXNvdXJjZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pKTsKKwkJCX0KKwkJfQorCQlTdHJpbmcgbG9ja2VkUmVzb3VyY2VJZCA9IG9sZFJyZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gY3JlYXRlZEFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBieXRlW10+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjc2FyID0gbnVsbDsKKwkJaWYgKGNzYXJVSVBheWxvYWQgIT0gbnVsbCAmJiBjc2FyVUlQYXlsb2FkLmxlZnQoKSAhPSBudWxsICYmIGNzYXJVSVBheWxvYWQubGVmdCgpLnZhbHVlKCkgIT0gbnVsbCkgeworCQkJY3NhciA9IGNzYXJVSVBheWxvYWQ7CisJCX0gZWxzZSB7CisJCQljc2FyID0gY3Nhck9wZXJhdGlvbi5nZXRDc2FyKGNzYXJVVUlELCB1c2VyKTsKKwkJfQorCQlpZiAoY3Nhci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBjc2FyIGZvciBjYXNyVVVJRHt9ICIsIGNzYXJVVUlEKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShjc2FyLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJfQorCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IHRvc2NhWWFtbENzYXJTdGF0dXMgPSB2YWxpZGF0ZUFuZFBhcnNlQ3NhcihuZXdScmVzb3VyY2UsIHVzZXIsIGNzYXJVVUlELCBjc2FyKTsKKwkJaWYgKHRvc2NhWWFtbENzYXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHRvc2NhWWFtbENzYXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gY2hlY2tzdW0gPSBDc2FyVmFsaWRhdGlvblV0aWxzLmdldFRvc2NhWWFtbENoZWNrc3VtKGNzYXIubGVmdCgpLnZhbHVlKCksIGNzYXJVVUlELCBjb21wb25lbnRzVXRpbHMpOworCQlpZiAoY2hlY2tzdW0uaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjYWxjdWxhdGUgY2hlY2tzdW0gZm9yIGNhc3JVVUlEe30gZXJyb3Ige30gIiwgY3NhclVVSUQsIGNoZWNrc3VtLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNoZWNrc3VtLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJYm9vbGVhbiBpc1VwZGF0ZVlhbWwgPSB0cnVlOworCQlpZiAoY2hlY2tzdW0ubGVmdCgpLnZhbHVlKCkuZXF1YWxzKG9sZFJyZXNvdXJjZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKCkpKSB7CisJCQlsb2cuZGVidWcoIlRoZSBjaGVja3N1bXMgYXJlIGVxdWFscyBmb3IgY3NhclVVSUQge30sIGV4aXN0aW5nIGNoZWNzdW0gaXMge30sIG5ldyBvbmUgaXMge30gIiwgY3NhclVVSUQsIG9sZFJyZXNvdXJjZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKCksIGNoZWNrc3VtLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWlmIChvbGRScmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpKQorCQkJCWlzVXBkYXRlWWFtbCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJb2xkUnJlc291cmNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRJbXBvcnRlZFRvc2NhQ2hlY2tzdW0oY2hlY2tzdW0ubGVmdCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrUmVzdWx0ID0gbG9ja0NvbXBvbmVudChsb2NrZWRSZXNvdXJjZUlkLCBvbGRScmVzb3VyY2UsICJ1cGRhdGUgUmVzb3VyY2UgRnJvbSBDc2FyIik7CisJCWlmIChsb2NrUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiBwcmVwYXJlRm9yVXBkYXRlID0gbnVsbDsKKwkJCVJlc291cmNlIHByZXBhcmVkUmVzb3VyY2UgPSBudWxsOworCQkJaWYgKGlzVXBkYXRlWWFtbCkgeworCisJCQkJcHJlcGFyZUZvclVwZGF0ZSA9IHVwZGF0ZUV4aXN0aW5nUmVzb3VyY2VCeUltcG9ydChuZXdScmVzb3VyY2UsIG9sZFJyZXNvdXJjZSwgdXNlciwgdHJ1ZSwgZmFsc2UpOworCisJCQkJaWYgKHByZXBhcmVGb3JVcGRhdGUuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHByZXBhcmUgcmVzb3VyY2UgZm9yIHVwZGF0ZSA6IHt9IiwgcHJlcGFyZUZvclVwZGF0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocHJlcGFyZUZvclVwZGF0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCQlwcmVwYXJlZFJlc291cmNlID0gcHJlcGFyZUZvclVwZGF0ZS5sZWZ0KCkudmFsdWUoKS5sZWZ0OworCQkJCVN0cmluZyB5YW1sRmlsZU5hbWUgPSB0b3NjYVlhbWxDc2FyU3RhdHVzLmxlZnQoKS52YWx1ZSgpLmdldEtleSgpOworCQkJCVN0cmluZyB5YW1sRmlsZUNvbnRlbnRzID0gdG9zY2FZYW1sQ3NhclN0YXR1cy5sZWZ0KCkudmFsdWUoKS5nZXRWYWx1ZSgpOworCQkJCWxvZy50cmFjZSgiWUFNTCB0b3BvbG9neSBmaWxlIGZvdW5kIGluIENTQVIsIGZpbGUgbmFtZToge30sIGNvbnRlbnRzOiB7fSIsIHlhbWxGaWxlTmFtZSwgeWFtbEZpbGVDb250ZW50cyk7CisKKwkJCQkvLyBFaXRoZXI8TWFwPFN0cmluZywgUmVzb3VyY2U+LCBSZXNwb25zZUZvcm1hdD4KKwkJCQkvLyBwYXJzZU5vZGVUeXBlSW5mb1lhbWxFaXRoZXIgPQorCQkJCS8vIGNyZWF0ZVJlc291cmNlc0Zyb21ZYW1sTm9kZVR5cGVzTGlzdCh5YW1sRmlsZU5hbWUscHJlcGFyZWRSZXNvdXJjZSwKKwkJCQkvLyB5YW1sRmlsZUNvbnRlbnRzLCB1c2VyLGZhbHNlKTsKKworCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBSZXNvdXJjZT4sIFJlc3BvbnNlRm9ybWF0PiBwYXJzZU5vZGVUeXBlSW5mb1lhbWxFaXRoZXIgPSB0aGlzLmhhbmRsZU5vZGVUeXBlcyh5YW1sRmlsZU5hbWUsIHByZXBhcmVkUmVzb3VyY2UsIHVzZXIsIHlhbWxGaWxlQ29udGVudHMsIGNzYXIubGVmdCgpLnZhbHVlKCksIGZhbHNlKTsKKwkJCQlpZiAocGFyc2VOb2RlVHlwZUluZm9ZYW1sRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHBhcnNlTm9kZVR5cGVJbmZvWWFtbEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcmVwYXJlZFJlc291cmNlLCAiIiwgIiIsIHVwZGF0ZVJlc291cmNlLCBudWxsKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQlFaXRoZXI8UGFyc2VkVG9zY2FZYW1sSW5mbywgUmVzcG9uc2VGb3JtYXQ+IHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mb01hcCA9IHBhcnNlUmVzb3VyY2VJbmZvRnJvbVlhbWwoeWFtbEZpbGVOYW1lLCBwcmVwYXJlZFJlc291cmNlLCB5YW1sRmlsZUNvbnRlbnRzLCB1c2VyKTsKKwkJCQlpZiAodXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvTWFwLmlzUmlnaHQoKSkgeworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mb01hcC5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBwcmVwYXJlZFJlc291cmNlLCAiIiwgIiIsIHVwZGF0ZVJlc291cmNlLCBudWxsKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQlNYXA8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+IGlucHV0cyA9IHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mb01hcC5sZWZ0KCkudmFsdWUoKS5nZXRJbnB1dHMoKTsKKwkJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVJbnB1dHNPblJlc291cmNlID0gY3JlYXRlSW5wdXRzT25SZXNvdXJjZShwcmVwYXJlZFJlc291cmNlLCB1c2VyLCBpbnB1dHMsIHRydWUpOworCQkJCWlmIChjcmVhdGVJbnB1dHNPblJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgcmVzb3VyY2UgaW5wdXRzIHN0YXR1cyBpcyB7fSIsIGNyZWF0ZUlucHV0c09uUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjcmVhdGVJbnB1dHNPblJlc291cmNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UoY3JlYXRlSW5wdXRzT25SZXNvdXJjZS5yaWdodCgpLnZhbHVlKCksIHVzZXIsIHByZXBhcmVkUmVzb3VyY2UsICIiLCAiIiwgdXBkYXRlUmVzb3VyY2UsIG51bGwpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCQlwcmVwYXJlZFJlc291cmNlID0gY3JlYXRlSW5wdXRzT25SZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCU1hcDxTdHJpbmcsIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbz4gaW5zdGFuY2VzID0gdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvTWFwLmxlZnQoKS52YWx1ZSgpLmdldEluc3RhbmNlcygpOworCQkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlciA9IGNyZWF0ZVJlc291cmNlSW5zdGFuY2VzKHVzZXIsIHlhbWxGaWxlTmFtZSwgcHJlcGFyZWRSZXNvdXJjZSwgaW5zdGFuY2VzLCB0cnVlLCBmYWxzZSwgcGFyc2VOb2RlVHlwZUluZm9ZYW1sRWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQlpZiAoY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2VzIHN0YXR1cyBpcyB7fSIsIGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlci5yaWdodCgpLnZhbHVlKCksIHVzZXIsIHByZXBhcmVkUmVzb3VyY2UsICIiLCAiIiwgdXBkYXRlUmVzb3VyY2UsIG51bGwpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCQlwcmVwYXJlZFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCisJCQkJY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyID0gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnModXNlciwgeWFtbEZpbGVOYW1lLCBwcmVwYXJlZFJlc291cmNlLCBpbnN0YW5jZXMsIHRydWUsIGZhbHNlKTsKKwkJCQlpZiAoY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgcmVsYXRpb24gYmV0d2VlbiByZXNvdXJjZSBpbnN0YW5jZXMgc3RhdHVzIGlzIHt9IiwgY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjcmVhdGVSZXNvdXJjZXNJbnN0YW5jZXNFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQlwcmVwYXJlZFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCisJCQkJRWl0aGVyPE1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lc1JlcyA9IGdyb3VwQnVzaW5lc3NMb2dpYy52YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lcyh1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm9NYXAubGVmdCgpLnZhbHVlKCkuZ2V0R3JvdXBzKCksIHByZXBhcmVkUmVzb3VyY2UuZ2V0U3lzdGVtTmFtZSgpKTsKKwkJCQlpZiAodmFsaWRhdGVVcGRhdGVWZkdyb3VwTmFtZXNSZXMuaXNSaWdodCgpKSB7CisKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lc1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQkvLyBhZGQgZ3JvdXBzIHRvIHJlc291cmNlCisJCQkJTWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiBncm91cHM7CisKKwkJCQlpZiAoIXZhbGlkYXRlVXBkYXRlVmZHcm91cE5hbWVzUmVzLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSkgeworCQkJCQlncm91cHMgPSB2YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlncm91cHMgPSB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm9NYXAubGVmdCgpLnZhbHVlKCkuZ2V0R3JvdXBzKCk7CisJCQkJfQorCQkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZWRHcm91cHNPblJlc291cmNlID0gdXBkYXRlR3JvdXBzT25SZXNvdXJjZShwcmVwYXJlZFJlc291cmNlLCB1c2VyLCBncm91cHMpOworCQkJCWlmICh1cGRhdGVkR3JvdXBzT25SZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKworCQkJCQlyZXR1cm4gdXBkYXRlZEdyb3Vwc09uUmVzb3VyY2U7CisJCQkJfQorCQkJCXByZXBhcmVkUmVzb3VyY2UgPSB1cGRhdGVkR3JvdXBzT25SZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJfSBlbHNlIHsKKwkJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBkYXRhTW9kZWxSZXNwb25zZSA9IHVwZGF0ZVJlc291cmNlTWV0YWRhdGEob2xkUnJlc291cmNlLmdldFVuaXF1ZUlkKCksIG5ld1JyZXNvdXJjZSwgdXNlciwgb2xkUnJlc291cmNlLCBmYWxzZSwgdHJ1ZSk7CisJCQkJaWYgKGRhdGFNb2RlbFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgcmVzb3VyY2UgbWV0YWRhdGEge30iLCBkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoZGF0YU1vZGVsUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQlwcmVwYXJlZFJlc291cmNlID0gZGF0YU1vZGVsUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJCX0KKworCQkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlZENzYXJBcnRpZmFjdHNFaXRoZXIgPSBoYW5kbGVDc2FyQXJ0aWZhY3RzKHByZXBhcmVkUmVzb3VyY2UsIHVzZXIsIGNzYXJVVUlELCBjc2FyLmxlZnQoKS52YWx1ZSgpLCBjcmVhdGVkQXJ0aWZhY3RzLCBBcnRpZmFjdE9wZXJhdGlvbi5VcGRhdGUsIGZhbHNlLCB0cnVlKTsKKwkJCWlmIChjcmVhdGVkQ3NhckFydGlmYWN0c0VpdGhlci5pc1JpZ2h0KCkpIHsKKworCQkJCXJldHVybiBjcmVhdGVkQ3NhckFydGlmYWN0c0VpdGhlcjsKKwkJCX0KKwkJCXByZXBhcmVkUmVzb3VyY2UgPSBjcmVhdGVkQ3NhckFydGlmYWN0c0VpdGhlci5sZWZ0KCkudmFsdWUoKTsKKworCQkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyU2V0UG9zaXRpb24gPSBjb21wb3NpdGlvbkJ1c2luZXNzTG9naWMuc2V0UG9zaXRpb25zRm9yQ29tcG9uZW50SW5zdGFuY2VzKHByZXBhcmVkUmVzb3VyY2UsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJcmVzdWx0ID0gZWl0aGVyU2V0UG9zaXRpb24uaXNSaWdodCgpID8gRWl0aGVyLnJpZ2h0KGVpdGhlclNldFBvc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSkgOiBFaXRoZXIubGVmdChwcmVwYXJlZFJlc291cmNlKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cud2Fybigib3BlcmF0aW9uIGZhaWxlZC4gZG8gcm9sbGJhY2siKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQlpZiAoIWNyZWF0ZWRBcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGVsZXRlRnJvbUVzUmVzID0gYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5kZWxldGVBbGxDb21wb25lbnRBcnRpZmFjdHNJZk5vdE9uR3JhcGgoY3JlYXRlZEFydGlmYWN0cyk7CisJCQkJCWlmICghZGVsZXRlRnJvbUVzUmVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShkZWxldGVGcm9tRXNSZXMpOworCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBvbGRScmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQkJfQorCQkJCQlsb2cuZGVidWcoImNvbXBvbmVudCBhbmQgYWxsIGl0cyBhcnRpZmFjdHMgd2VyZSBkZWxldGVkLCBpZCA9IHt9Iiwgb2xkUnJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIm9wZXJhdGlvbiBzdWNjZXNzLiBkbyBjb21taXQiKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCQlsb2cuZGVidWcoInVubG9jayByZXNvdXJjZSB7fSIsIGxvY2tlZFJlc291cmNlSWQpOworCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChsb2NrZWRSZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VGcm9tQ3NhcihSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gY3JlYXRlUmVzb3VyY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgRWl0aGVyPE1hcDxTdHJpbmcsIGJ5dGVbXT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNzYXJVSVBheWxvYWQsIFN0cmluZyBjc2FyVVVJRCkgeworCQlsb2cudHJhY2UoIioqKioqKioqKioqKiogY3JlYXRlZCBzdWNjZXNzZnVsbHkgZnJvbSBZQU1MLCByZXNvdXJjZSBUT1NDQSAiKTsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgYnl0ZVtdPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3NhciA9IG51bGw7CisJCWlmIChjc2FyVUlQYXlsb2FkICE9IG51bGwgJiYgY3NhclVJUGF5bG9hZC5sZWZ0KCkgIT0gbnVsbCAmJiBjc2FyVUlQYXlsb2FkLmxlZnQoKS52YWx1ZSgpICE9IG51bGwpIHsKKwkJCWNzYXIgPSBjc2FyVUlQYXlsb2FkOworCQl9IGVsc2UgeworCQkJY3NhciA9IGNzYXJPcGVyYXRpb24uZ2V0Q3Nhcihjc2FyVVVJRCwgdXNlcik7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4sIFJlc3BvbnNlRm9ybWF0PiB0b3NjYVlhbWxDc2FyU3RhdHVzID0gdmFsaWRhdGVBbmRQYXJzZUNzYXIocmVzb3VyY2UsIHVzZXIsIGNzYXJVVUlELCBjc2FyKTsKKwkJaWYgKHRvc2NhWWFtbENzYXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHRvc2NhWWFtbENzYXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gdG9zY2FZYW1sQ2hlY2tzdW0gPSBDc2FyVmFsaWRhdGlvblV0aWxzLmdldFRvc2NhWWFtbENoZWNrc3VtKGNzYXIubGVmdCgpLnZhbHVlKCksIGNzYXJVVUlELCBjb21wb25lbnRzVXRpbHMpOworCQlpZiAodG9zY2FZYW1sQ2hlY2tzdW0uaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjYWxjdWxhdGUgY2hlY2tzdW0gZm9yIENTQVIge30sIGVycm9yICB7fSIsIGNzYXJVVUlELCB0b3NjYVlhbWxDaGVja3N1bS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh0b3NjYVlhbWxDaGVja3N1bS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJlc291cmNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRJbXBvcnRlZFRvc2NhQ2hlY2tzdW0odG9zY2FZYW1sQ2hlY2tzdW0ubGVmdCgpLnZhbHVlKCkpOworCisJCVN0cmluZyB5YW1sRmlsZU5hbWUgPSB0b3NjYVlhbWxDc2FyU3RhdHVzLmxlZnQoKS52YWx1ZSgpLmdldEtleSgpOworCQlTdHJpbmcgeWFtbEZpbGVDb250ZW50cyA9IHRvc2NhWWFtbENzYXJTdGF0dXMubGVmdCgpLnZhbHVlKCkuZ2V0VmFsdWUoKTsKKwkJbG9nLnRyYWNlKCJZQU1MIHRvcG9sb2d5IGZpbGUgZm91bmQgaW4gQ1NBUiwgZmlsZSBuYW1lOiB7fSwgY29udGVudHM6IHt9IiwgeWFtbEZpbGVOYW1lLCB5YW1sRmlsZUNvbnRlbnRzKTsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VGcm9tWWFtbCA9IGNyZWF0ZVJlc291cmNlRnJvbVlhbWwocmVzb3VyY2UsIHVzZXIsIHlhbWxGaWxlQ29udGVudHMsIHlhbWxGaWxlTmFtZSwgY3Nhci5sZWZ0KCkudmFsdWUoKSwgY3NhclVVSUQpOworCQlpZiAoY3JlYXRlUmVzb3VyY2VGcm9tWWFtbC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgY3JlYXRlIHJlc291cmNlIGZyb20gWUFNTCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjcmVhdGVSZXNvdXJjZUZyb21ZYW1sLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlSZXNvdXJjZSB2ZlJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VGcm9tWWFtbC5sZWZ0KCkudmFsdWUoKTsKKwkJbG9nLnRyYWNlKCIqKioqKioqKioqKioqVkYgUmVzb3VyY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkgZnJvbSBZQU1MLCByZXNvdXJjZSBUT1NDQSBuYW1lOiB7fSIsIHZmUmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSk7CisJCXJldHVybiBFaXRoZXIubGVmdCh2ZlJlc291cmNlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kUGFyc2VDc2FyKFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIFN0cmluZyBjc2FyVVVJRCwgRWl0aGVyPE1hcDxTdHJpbmcsIGJ5dGVbXT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNzYXIpIHsKKwkJaWYgKGNzYXIuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHZhbHVlID0gY3Nhci5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkVycm9yIHdoZW4gZmV0Y2hpbmcgY3NhciB3aXRoIElEIHt9LCBlcnJvcjoge30iLCBjc2FyVVVJRCwgdmFsdWUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkNyZWF0aW5nIHJlc291cmNlIGZyb20gQ1NBUjogZmV0Y2hpbmcgQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCArICIgZmFpbGVkIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UodmFsdWUpLCBjc2FyVVVJRCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDc2FyU3RhdHVzID0gQ3NhclZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNzYXIoY3Nhci5sZWZ0KCkudmFsdWUoKSwgY3NhclVVSUQsIGNvbXBvbmVudHNVdGlscyk7CisJCWlmICh2YWxpZGF0ZUNzYXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlQ3NhclN0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkVycm9yIHdoZW4gdmFsaWRhdGUgY3NhciB3aXRoIElEIHt9LCBlcnJvcjoge30iLCBjc2FyVVVJRCwgcmVzcG9uc2VGb3JtYXQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkNyZWF0aW5nIHJlc291cmNlIGZyb20gQ1NBUjogZmV0Y2hpbmcgQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCArICIgZmFpbGVkIik7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IHRvc2NhWWFtbENzYXJTdGF0dXMgPSBDc2FyVmFsaWRhdGlvblV0aWxzLmdldFRvc2NhWWFtbChjc2FyLmxlZnQoKS52YWx1ZSgpLCBjc2FyVVVJRCwgY29tcG9uZW50c1V0aWxzKTsKKworCQlpZiAodG9zY2FZYW1sQ3NhclN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gdG9zY2FZYW1sQ3NhclN0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkVycm9yIHdoZW4gdHJ5IHRvIGdldCBjc2FyIHRvc2NheWFtbEZpbGUgd2l0aCBjc2FyIElEIHt9LCBlcnJvcjoge30iLCBjc2FyVVVJRCwgcmVzcG9uc2VGb3JtYXQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkNyZWF0aW5nIHJlc291cmNlIGZyb20gQ1NBUjogZmV0Y2hpbmcgQ1NBUiB3aXRoIGlkICIgKyBjc2FyVVVJRCArICIgZmFpbGVkIik7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gdG9zY2FZYW1sQ3NhclN0YXR1czsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VCZWZvcmVDcmVhdGUoUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCWxvZy50cmFjZSgidmFsaWRhdGluZyByZXNvdXJjZSBiZWZvcmUgY3JlYXRlIik7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQ3JlYXRvciA9IHZhbGlkYXRlVXNlcih1c2VyLCAiQ3JlYXRlIFJlc291cmNlIiwgcmVzb3VyY2UsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIGZhbHNlKTsKKwkJaWYgKGVpdGhlckNyZWF0b3IuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl1c2VyLmNvcHlEYXRhKGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCkpOworCisJCS8vIHZhbGlkYXRlIHVzZXIgcm9sZQorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzID0gdmFsaWRhdGVVc2VyUm9sZSh1c2VyLCByZXNvdXJjZSwgbmV3IEFycmF5TGlzdDxSb2xlPigpLCBBdWRpdGluZ0FjdGlvbkVudW0uQ1JFQVRFX1JFU09VUkNFLCBudWxsKTsKKwkJaWYgKHZhbGlkYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCS8vIFZGICJkZXJpdmVkRnJvbSIgc2hvdWxkIGJlIG51bGwgKG9yIGlnbm9yZWQpCisJCWlmICghcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKFJlc291cmNlVHlwZUVudW0uVkYpKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlRGVyaXZlZEZyb21Ob3RFbXB0eSA9IHZhbGlkYXRlRGVyaXZlZEZyb21Ob3RFbXB0eSh1c2VyLCByZXNvdXJjZSwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSk7CisJCQlpZiAodmFsaWRhdGVEZXJpdmVkRnJvbU5vdEVtcHR5LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVEZXJpdmVkRnJvbU5vdEVtcHR5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2VCZWZvcmVDcmVhdGUocmVzb3VyY2UsIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIGluVHJhbnNhY3Rpb24pOworCisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlRnJvbVlhbWwoUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgU3RyaW5nIHRvcG9sb2d5VGVtcGxhdGVZYW1sLCBTdHJpbmcgeWFtbE5hbWUsIE1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgU3RyaW5nIGNzYXJVVUlEKSB7CisKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWRBcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJbG9nLnRyYWNlKCIqKioqKioqKioqKioqIGNyZWF0ZVJlc291cmNlRnJvbVlhbWwgYmVmb3JlIHBhcnNlIHlhbWwgIik7CisJCUVpdGhlcjxQYXJzZWRUb3NjYVlhbWxJbmZvLCBSZXNwb25zZUZvcm1hdD4gcGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlciA9IHBhcnNlUmVzb3VyY2VJbmZvRnJvbVlhbWwoeWFtbE5hbWUsIHJlc291cmNlLCB0b3BvbG9neVRlbXBsYXRlWWFtbCwgdXNlcik7CisJCWlmIChwYXJzZVJlc291cmNlSW5mb0Zyb21ZYW1sRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBwYXJzZVJlc291cmNlSW5mb0Zyb21ZYW1sRWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCWxvZy50cmFjZSgiKioqKioqKioqKioqKiBjcmVhdGVSZXNvdXJjZUZyb21ZYW1sIGFmdGVyIHBhcnNlIHlhbWwgIik7CisJCVBhcnNlZFRvc2NhWWFtbEluZm8gcGFyc2VkVG9zY2FZYW1sSW5mbyA9IHBhcnNlUmVzb3VyY2VJbmZvRnJvbVlhbWxFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiVGhlIHBhcnNlZCB0b3NjYSB5YW1sIGluZm8gaXMge30iLCBwYXJzZWRUb3NjYVlhbWxJbmZvKTsKKwkJbG9nLnRyYWNlKCIqKioqKioqKioqKioqIGNyZWF0ZVJlc291cmNlRnJvbVlhbWwgYmVmb3JlIGNyZWF0ZSAiKTsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlZFJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZUFuZFJJc0Zyb21ZYW1sKHlhbWxOYW1lLCByZXNvdXJjZSwgdXNlciwgcGFyc2VkVG9zY2FZYW1sSW5mbywgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgZmFsc2UsIGNzYXJVVUlELCBjc2FyLCBjcmVhdGVkQXJ0aWZhY3RzLCB0b3BvbG9neVRlbXBsYXRlWWFtbCk7CisJCWxvZy50cmFjZSgiKioqKioqKioqKioqKiBjcmVhdGVSZXNvdXJjZUZyb21ZYW1sIGFmdGVyIGNyZWF0ZSAiKTsKKwkJaWYgKGNyZWF0ZWRSZXNvdXJjZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjcmVhdGVkUmVzb3VyY2VSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXJldHVybiBjcmVhdGVkUmVzb3VyY2VSZXNwb25zZTsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgUmVzb3VyY2U+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VzRnJvbVlhbWxOb2RlVHlwZXNMaXN0KFN0cmluZyB5YW1sTmFtZSwgUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyByZXNvdXJjZVltbCwgVXNlciB1c2VyLCBib29sZWFuIG5lZWRMb2NrKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXBwZWRUb3NjYVRlbXBsYXRlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5ldyBZYW1sKCkubG9hZChyZXNvdXJjZVltbCk7CisKKwkJRWl0aGVyPFN0cmluZywgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FfdmVyc2lvbiA9IEltcG9ydFV0aWxzLmZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudChtYXBwZWRUb3NjYVRlbXBsYXRlLCBUb3NjYVRhZ05hbWVzRW51bS5UT1NDQV9WRVJTSU9OKTsKKwkJaWYgKHRvc2NhX3ZlcnNpb24uaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1RPU0NBX1RFTVBMQVRFKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlck5vZGVUeXBlcyA9IEltcG9ydFV0aWxzLmZpbmRGaXJzdFRvc2NhTWFwRWxlbWVudChtYXBwZWRUb3NjYVRlbXBsYXRlLCBUb3NjYVRhZ05hbWVzRW51bS5OT0RFX1RZUEVTKTsKKworCQlNYXA8U3RyaW5nLCBSZXNvdXJjZT4gbm9kZVR5cGVzUmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8PigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgUmVzb3VyY2U+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQobm9kZVR5cGVzUmVzb3VyY2VzKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcFRvQ29udmVydCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQltYXBUb0NvbnZlcnQucHV0KFRvc2NhVGFnTmFtZXNFbnVtLlRPU0NBX1ZFUlNJT04uZ2V0RWxlbWVudE5hbWUoKSwgdG9zY2FfdmVyc2lvbi5sZWZ0KCkudmFsdWUoKSk7CisKKwkJaWYgKGVpdGhlck5vZGVUeXBlcy5pc0xlZnQoKSkgeworCisJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IG5vZGVzTmFtZVZhbHVlID0gZWl0aGVyTm9kZVR5cGVzLmxlZnQoKS52YWx1ZSgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKworCQkJd2hpbGUgKG5vZGVzTmFtZVZhbHVlLmhhc05leHQoKSkgeworCisJCQkJRW50cnk8U3RyaW5nLCBPYmplY3Q+IG5vZGVUeXBlID0gbm9kZXNOYW1lVmFsdWUubmV4dCgpOworCQkJCWxvZy50cmFjZSgiKioqKioqKioqKioqKiBHb2luZyB0byBjcmVhdGUgbm9kZSB7fSIsIG5vZGVUeXBlLmdldEtleSgpKTsKKwkJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc291cmNlQ3JlYXRlZCA9IHRoaXMuY3JlYXRlTm9kZVR5cGVSZXNvdXJjZUZyb21ZYW1sKHlhbWxOYW1lLCBub2RlVHlwZSwgdXNlciwgbWFwVG9Db252ZXJ0LCByZXNvdXJjZSwgbmVlZExvY2spOworCQkJCWxvZy50cmFjZSgiKioqKioqKioqKioqKiBmaW5pc2hlZCB0byBjcmVhdGUgbm9kZSB7fSIsIG5vZGVUeXBlLmdldEtleSgpKTsKKwkJCQlpZiAocmVzb3VyY2VDcmVhdGVkLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc291cmNlQ3JlYXRlZC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlSZXNvdXJjZSB2ZmNDcmVhdGVkID0gcmVzb3VyY2VDcmVhdGVkLmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKTsKKworCQkJCW5vZGVUeXBlc1Jlc291cmNlcy5wdXQobm9kZVR5cGUuZ2V0S2V5KCksIHZmY0NyZWF0ZWQpOworCQkJCW1hcFRvQ29udmVydC5yZW1vdmUoVG9zY2FUYWdOYW1lc0VudW0uTk9ERV9UWVBFUy5nZXRFbGVtZW50TmFtZSgpKTsKKworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXROb2RlVHlwZUFjdHVhbE5hbWUoU3RyaW5nIGZ1bGxOYW1lKSB7CisJCVN0cmluZyBuYW1lV2l0aG91TmFtZXNwYWNlUHJlZml4ID0gZnVsbE5hbWUuc3Vic3RyaW5nKENvbnN0YW50cy5VU0VSX0RFRklORURfUkVTT1VSQ0VfTkFNRVNQQUNFX1BSRUZJWC5sZW5ndGgoKSk7CisJCVN0cmluZ1tdIGZpbmRUeXBlcyA9IG5hbWVXaXRob3VOYW1lc3BhY2VQcmVmaXguc3BsaXQoIlxcLiIpOworCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gZmluZFR5cGVzWzBdOworCQlyZXR1cm4gbmFtZVdpdGhvdU5hbWVzcGFjZVByZWZpeC5zdWJzdHJpbmcocmVzb3VyY2VUeXBlLmxlbmd0aCgpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbW11dGFibGVQYWlyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlTm9kZVR5cGVSZXNvdXJjZUZyb21ZYW1sKFN0cmluZyB5YW1sTmFtZSwgRW50cnk8U3RyaW5nLCBPYmplY3Q+IG5vZGVOYW1lVmFsdWUsIFVzZXIgdXNlciwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXBUb0NvbnZlcnQsIFJlc291cmNlIHJlc291cmNlVmYsIGJvb2xlYW4gbmVlZExvY2spIHsKKworCQlFaXRoZXI8VXBsb2FkUmVzb3VyY2VJbmZvLCBSZXNwb25zZUZvcm1hdD4gcmVzb3VyY2VNZXRhRGF0YSA9IGZpbGxSZXNvdXJjZU1ldGFkYXRhKHlhbWxOYW1lLCByZXNvdXJjZVZmLCBub2RlTmFtZVZhbHVlLmdldEtleSgpLCB1c2VyKTsKKwkJaWYgKHJlc291cmNlTWV0YURhdGEuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc291cmNlTWV0YURhdGEucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCS8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgWWFtbCBmcm9tIGVhY2ggbm9kZV90eXBlcyBpbiBvcmRlciB0byBjcmVhdGUKKwkJLy8gcmVzb3VyY2UgZnJvbSBlYWNoIG5vZGUgdHlwZSB1c2luZyBpbXBvcnQgbm9ybWF0aXZlIGZsb3cuCisJCUR1bXBlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBEdW1wZXJPcHRpb25zKCk7CisJCW9wdGlvbnMuc2V0RGVmYXVsdEZsb3dTdHlsZShEdW1wZXJPcHRpb25zLkZsb3dTdHlsZS5CTE9DSyk7CisJCVlhbWwgeWFtbCA9IG5ldyBZYW1sKG9wdGlvbnMpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gc2luZ2xlVmZjID0gbmV3IEhhc2hNYXA8PigpOworCisJCVN0cmluZyBhY3R1YWxOYW1lID0gdGhpcy5nZXROb2RlVHlwZUFjdHVhbE5hbWUobm9kZU5hbWVWYWx1ZS5nZXRLZXkoKSk7CisJCWlmICghYWN0dWFsTmFtZS5zdGFydHNXaXRoKEltcG9ydFV0aWxzLkNvbnN0YW50cy5BQlNUUkFDVF9OT0RFKSkgeworCQkJYWN0dWFsTmFtZSA9ICIuIiArIEltcG9ydFV0aWxzLkNvbnN0YW50cy5BQlNUUkFDVF9OT0RFICsgYWN0dWFsTmFtZTsKKwkJfQorCisJCS8vIFNldHRpbmcgdG9zY2EgbmFtZQorCQlTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWUgPSBJbXBvcnRVdGlscy5Db25zdGFudHMuVVNFUl9ERUZJTkVEX1JFU09VUkNFX05BTUVTUEFDRV9QUkVGSVggKyByZXNvdXJjZU1ldGFEYXRhLmxlZnQoKS52YWx1ZSgpLmdldFJlc291cmNlVHlwZSgpLnRvTG93ZXJDYXNlKCkgKyAnLicgKyByZXNvdXJjZVZmLmdldFN5c3RlbU5hbWUoKSArIGFjdHVhbE5hbWU7CisJCXNpbmdsZVZmYy5wdXQodG9zY2FSZXNvdXJjZU5hbWUsIG5vZGVOYW1lVmFsdWUuZ2V0VmFsdWUoKSk7CisJCW1hcFRvQ29udmVydC5wdXQoVG9zY2FUYWdOYW1lc0VudW0uTk9ERV9UWVBFUy5nZXRFbGVtZW50TmFtZSgpLCBzaW5nbGVWZmMpOworCisJCVN0cmluZyBzaW5nbGVWZmNZYW1sID0geWFtbC5kdW1wQXNNYXAobWFwVG9Db252ZXJ0KTsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckNyZWF0b3IgPSB2YWxpZGF0ZVVzZXIodXNlciwgIkNoZWNrSW4gUmVzb3VyY2UiLCByZXNvdXJjZVZmLCBBdWRpdGluZ0FjdGlvbkVudW0uQ0hFQ0tJTl9SRVNPVVJDRSwgdHJ1ZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJdXNlciA9IGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCk7CisKKwkJcmV0dXJuIHRoaXMuY3JlYXRlUmVzb3VyY2VGcm9tTm9kZVR5cGUoc2luZ2xlVmZjWWFtbCwgcmVzb3VyY2VNZXRhRGF0YS5sZWZ0KCkudmFsdWUoKSwgdXNlciwgdHJ1ZSwgbmVlZExvY2spOworCX0KKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VDcmVhdGlvbkZyb21Ob2RlVHlwZShSZXNvdXJjZSByZXNvdXJjZSwgVXNlciBjcmVhdG9yKSB7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZURlcml2ZWRGcm9tTm90RW1wdHkgPSB0aGlzLnZhbGlkYXRlRGVyaXZlZEZyb21Ob3RFbXB0eShjcmVhdG9yLCByZXNvdXJjZSwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSk7CisJCWlmICh2YWxpZGF0ZURlcml2ZWRGcm9tTm90RW1wdHkuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlRGVyaXZlZEZyb21Ob3RFbXB0eS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNvdXJjZUZyb21Ob2RlVHlwZShTdHJpbmcgbm9kZVR5cGVZYW1sLCBVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VNZXRhRGF0YSwgVXNlciBjcmVhdG9yLCBib29sZWFuIGlzSW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaykgeworCisJCUxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGxpZmVjeWNsZUNoYW5nZUluZm8gPSBuZXcgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24oImNlcnRpZmljYXRpb24gb24gaW1wb3J0IiwgTGlmZWN5Y2xlQ2hhbmNlQWN0aW9uRW51bS5DUkVBVEVfRlJPTV9DU0FSKTsKKwkJRnVuY3Rpb248UmVzb3VyY2UsIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4+IHZhbGlkYXRvciA9IChyZXNvdXJjZSkgLT4gdGhpcy52YWxpZGF0ZVJlc291cmNlQ3JlYXRpb25Gcm9tTm9kZVR5cGUocmVzb3VyY2UsIGNyZWF0b3IpOworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUltcG9ydE1hbmFnZXIuaW1wb3J0Q2VydGlmaWVkUmVzb3VyY2Uobm9kZVR5cGVZYW1sLCByZXNvdXJjZU1ldGFEYXRhLCBjcmVhdG9yLCB2YWxpZGF0b3IsIGxpZmVjeWNsZUNoYW5nZUluZm8sIGlzSW5UcmFuc2FjdGlvbiwgdHJ1ZSwgbmVlZExvY2spOworCX0KKworCXByaXZhdGUgRWl0aGVyPFVwbG9hZFJlc291cmNlSW5mbywgUmVzcG9uc2VGb3JtYXQ+IGZpbGxSZXNvdXJjZU1ldGFkYXRhKFN0cmluZyB5YW1sTmFtZSwgUmVzb3VyY2UgcmVzb3VyY2VWZiwgU3RyaW5nIG5vZGVUeXBlTmFtZSwgVXNlciB1c2VyKSB7CisJCVVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZU1ldGFEYXRhID0gbmV3IFVwbG9hZFJlc291cmNlSW5mbygpOworCisJCS8vIHZhbGlkYXRlIG5vZGV0eXBlIG5hbWUgcHJlZml4CisJCWlmICghbm9kZVR5cGVOYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlVTRVJfREVGSU5FRF9SRVNPVVJDRV9OQU1FU1BBQ0VfUFJFRklYKSkgeworCQkJbG9nLmRlYnVnKCJpbnZhbGlkIG5vZGVUeXBlTmFtZTp7fSBkb2VzIG5vdCBzdGFydCB3aXRoIHt9LiIsIG5vZGVUeXBlTmFtZSwgQ29uc3RhbnRzLlVTRVJfREVGSU5FRF9SRVNPVVJDRV9OQU1FU1BBQ0VfUFJFRklYKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgeWFtbE5hbWUsIHJlc291cmNlTWV0YURhdGEuZ2V0TmFtZSgpLCBub2RlVHlwZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlTdHJpbmcgYWN0dWFsTmFtZSA9IHRoaXMuZ2V0Tm9kZVR5cGVBY3R1YWxOYW1lKG5vZGVUeXBlTmFtZSk7CisJCVN0cmluZyBuYW1lUHJlZml4ID0gbm9kZVR5cGVOYW1lLnJlcGxhY2UoYWN0dWFsTmFtZSwgIiIpOworCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gbmFtZVByZWZpeC5zdWJzdHJpbmcoQ29uc3RhbnRzLlVTRVJfREVGSU5FRF9SRVNPVVJDRV9OQU1FU1BBQ0VfUFJFRklYLmxlbmd0aCgpKTsKKworCQkvLyBpZiB3ZSBpbXBvcnQgZnJvbSBjc2FyLCB0aGUgbm9kZV90eXBlIG5hbWUgY2FuIGJlCisJCS8vIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuYWJzdHJhY3Qubm9kZV9uYW1lIC0gaW4gdGhpcyBjYXNlIHdlIGFsd2F5cworCQkvLyBjcmVhdGUgYSB2ZmMKKwkJaWYgKHJlc291cmNlVHlwZS5lcXVhbHMoQ29uc3RhbnRzLkFCU1RSQUNUKSkgeworCQkJcmVzb3VyY2VUeXBlID0gUmVzb3VyY2VUeXBlRW51bS5WRkMubmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCX0KKwkJLy8gdmFsaWRhdGluZyB0eXBlCisJCWlmICghUmVzb3VyY2VUeXBlRW51bS5jb250YWlucyhyZXNvdXJjZVR5cGUudG9VcHBlckNhc2UoKSkpIHsKKwkJCWxvZy5kZWJ1ZygiaW52YWxpZCByZXNvdXJjZVR5cGU6e30gdGhlIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUgdmFsaWRlIHR5cGVzOnt9LiIsIHJlc291cmNlVHlwZS50b1VwcGVyQ2FzZSgpLCBSZXNvdXJjZVR5cGVFbnVtLnZhbHVlcygpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgeWFtbE5hbWUsIHJlc291cmNlTWV0YURhdGEuZ2V0TmFtZSgpLCBub2RlVHlwZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQkvLyBTZXR0aW5nIG5hbWUKKwkJcmVzb3VyY2VNZXRhRGF0YS5zZXROYW1lKHJlc291cmNlVmYuZ2V0U3lzdGVtTmFtZSgpICsgYWN0dWFsTmFtZSk7CisKKwkJLy8gU2V0dGluZyB0eXBlIGZyb20gbmFtZQorCQlTdHJpbmcgdHlwZSA9IHJlc291cmNlVHlwZS50b1VwcGVyQ2FzZSgpOworCQlyZXNvdXJjZU1ldGFEYXRhLnNldFJlc291cmNlVHlwZSh0eXBlKTsKKworCQlyZXNvdXJjZU1ldGFEYXRhLnNldERlc2NyaXB0aW9uKEltcG9ydFV0aWxzLkNvbnN0YW50cy5JTk5FUl9WRkNfREVTQ1JJUFRJT04pOworCQlyZXNvdXJjZU1ldGFEYXRhLnNldEljb24oSW1wb3J0VXRpbHMuQ29uc3RhbnRzLkRFRkFVTFRfSUNPTik7CisJCXJlc291cmNlTWV0YURhdGEuc2V0Q29udGFjdElkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlyZXNvdXJjZU1ldGFEYXRhLnNldFZlbmRvck5hbWUocmVzb3VyY2VWZi5nZXRWZW5kb3JOYW1lKCkpOworCQlyZXNvdXJjZU1ldGFEYXRhLnNldFZlbmRvclJlbGVhc2UocmVzb3VyY2VWZi5nZXRWZW5kb3JSZWxlYXNlKCkpOworCisJCS8vIFNldHRpbmcgdGFnCisJCUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXRhZ3MuYWRkKHJlc291cmNlTWV0YURhdGEuZ2V0TmFtZSgpKTsKKwkJcmVzb3VyY2VNZXRhRGF0YS5zZXRUYWdzKHRhZ3MpOworCisJCS8vIFNldHRpbmcgY2F0ZWdvcnkKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQljYXRlZ29yeS5zZXROYW1lKEltcG9ydFV0aWxzLkNvbnN0YW50cy5BQlNUUkFDVF9DQVRFR09SWV9OQU1FKTsKKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5ID0gbmV3IFN1YkNhdGVnb3J5RGVmaW5pdGlvbigpOworCQlzdWJDYXRlZ29yeS5zZXROYW1lKEltcG9ydFV0aWxzLkNvbnN0YW50cy5BQlNUUkFDVF9TVUJDQVRFR09SWSk7CisJCWNhdGVnb3J5LmFkZFN1YkNhdGVnb3J5KHN1YkNhdGVnb3J5KTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOworCQlyZXNvdXJjZU1ldGFEYXRhLnNldENhdGVnb3JpZXMoY2F0ZWdvcmllcyk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlTWV0YURhdGEpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VBbmRSSXNGcm9tWWFtbChTdHJpbmcgeWFtbE5hbWUsIFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIFBhcnNlZFRvc2NhWWFtbEluZm8gcGFyc2VkVG9zY2FZYW1sSW5mbywgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIGJvb2xlYW4gaXNOb3JtYXRpdmUsIFN0cmluZyBjc2FyVVVJRCwKKwkJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWRBcnRpZmFjdHMsIFN0cmluZyB0b3BvbG9neVRlbXBsYXRlWWFtbCkgeworCisJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tSZXN1bHQgPSBsb2NrQ29tcG9uZW50QnlOYW1lKHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSwgcmVzb3VyY2UsICJDcmVhdGUgUmVzb3VyY2UiKTsKKwkJaWYgKGxvY2tSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGxvY2tSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJbG9nLmRlYnVnKCJuYW1lIGlzIGxvY2tlZCB7fSBzdGF0dXMgPSB7fSIsIHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSwgbG9ja1Jlc3VsdCk7CisKKwkJdHJ5IHsKKwkJCWxvZy50cmFjZSgiKioqKioqKioqKioqKiBjcmVhdGVSZXNvdXJjZUZyb21ZYW1sIGJlZm9yZSBmdWxsIGNyZWF0ZSByZXNvdXJjZSB7fSIsIHlhbWxOYW1lKTsKKwkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlc0VpdGhlciA9IGNyZWF0ZVJlc291cmNlVHJhbnNhY3Rpb24ocmVzb3VyY2UsIHVzZXIsIGFjdGlvbkVudW0sIGlzTm9ybWF0aXZlLCB0cnVlKTsKKwkJCWxvZy50cmFjZSgiKioqKioqKioqKioqKiBjcmVhdGVSZXNvdXJjZUZyb21ZYW1sIGFmdGVyIGZ1bGwgY3JlYXRlIHJlc291cmNlIHt9IiwgeWFtbE5hbWUpOworCQkJaWYgKGNyZWF0ZVJlc291cmNlc0VpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VzRWl0aGVyOworCQkJfQorCQkJcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZXNFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkvLyBhZGQgZ3JvdXBzIHRvIHJlc291cmNlCisJCQlsb2cudHJhY2UoIioqKioqKioqKioqKiogR29pbmcgdG8gYWRkIGlucHV0cyBmcm9tIHlhbWwge30iLCB5YW1sTmFtZSk7CisKKwkJCU1hcDxTdHJpbmcsIElucHV0RGVmaW5pdGlvbj4gaW5wdXRzID0gcGFyc2VkVG9zY2FZYW1sSW5mby5nZXRJbnB1dHMoKTsKKwkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUlucHV0c09uUmVzb3VyY2UgPSBjcmVhdGVJbnB1dHNPblJlc291cmNlKHJlc291cmNlLCB1c2VyLCBpbnB1dHMsIHRydWUpOworCQkJaWYgKGNyZWF0ZUlucHV0c09uUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJcmV0dXJuIGNyZWF0ZUlucHV0c09uUmVzb3VyY2U7CisJCQl9CisJCQlyZXNvdXJjZSA9IGNyZWF0ZUlucHV0c09uUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJCQlsb2cudHJhY2UoIioqKioqKioqKioqKiogRmluaXNoIHRvIGFkZCBpbnB1dHMgZnJvbSB5YW1sIHt9IiwgeWFtbE5hbWUpOworCisJCQlNYXA8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+IHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mb01hcCA9IHBhcnNlZFRvc2NhWWFtbEluZm8uZ2V0SW5zdGFuY2VzKCk7CisJCQlsb2cudHJhY2UoIioqKioqKioqKioqKiogR29pbmcgdG8gY3JlYXRlIG5vZGVzLCBSSSdzIGFuZCBSZWxhdGlvbnMgIGZyb20geWFtbCB7fSIsIHlhbWxOYW1lKTsKKwkJCWNyZWF0ZVJlc291cmNlc0VpdGhlciA9IGNyZWF0ZVJJQW5kUmVsYXRpb25zRnJvbVlhbWwoeWFtbE5hbWUsIHJlc291cmNlLCB1c2VyLCB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm9NYXAsIGFjdGlvbkVudW0sIHRvcG9sb2d5VGVtcGxhdGVZYW1sLCBjc2FyLCBjc2FyVVVJRCk7CisJCQlsb2cudHJhY2UoIioqKioqKioqKioqKiogRmluaXNoZWQgdG8gY3JlYXRlIG5vZGVzLCBSSSBhbmQgUmVsYXRpb24gIGZyb20geWFtbCB7fSIsIHlhbWxOYW1lKTsKKwkJCWlmIChjcmVhdGVSZXNvdXJjZXNFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlc0VpdGhlcjsKKwkJCX0KKworCQkJcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZXNFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkvLyB2YWxpZGF0ZSB1cGRhdGUgdmYgbW9kdWxlIGdyb3VwIG5hbWVzCisJCQlFaXRoZXI8TWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXBkYXRlVmZHcm91cE5hbWVzUmVzID0gZ3JvdXBCdXNpbmVzc0xvZ2ljLnZhbGlkYXRlVXBkYXRlVmZHcm91cE5hbWVzKHBhcnNlZFRvc2NhWWFtbEluZm8uZ2V0R3JvdXBzKCksIHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSk7CisJCQlpZiAodmFsaWRhdGVVcGRhdGVWZkdyb3VwTmFtZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lc1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJLy8gYWRkIGdyb3VwcyB0byByZXNvdXJjZQorCQkJTWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiBncm91cHM7CisJCQlsb2cudHJhY2UoIioqKioqKioqKioqKiogR29pbmcgdG8gYWRkIGdyb3VwcyBmcm9tIHlhbWwge30iLCB5YW1sTmFtZSk7CisKKwkJCWlmICghdmFsaWRhdGVVcGRhdGVWZkdyb3VwTmFtZXNSZXMubGVmdCgpLnZhbHVlKCkuaXNFbXB0eSgpKSB7CisJCQkJZ3JvdXBzID0gdmFsaWRhdGVVcGRhdGVWZkdyb3VwTmFtZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCQl9IGVsc2UgeworCQkJCWdyb3VwcyA9IHBhcnNlZFRvc2NhWWFtbEluZm8uZ2V0R3JvdXBzKCk7CisJCQl9CisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cHNPblJlc291cmNlID0gY3JlYXRlR3JvdXBzT25SZXNvdXJjZShyZXNvdXJjZSwgdXNlciwgZ3JvdXBzKTsKKwkJCWlmIChjcmVhdGVHcm91cHNPblJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiBjcmVhdGVHcm91cHNPblJlc291cmNlOworCQkJfQorCQkJcmVzb3VyY2UgPSBjcmVhdGVHcm91cHNPblJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJbG9nLnRyYWNlKCIqKioqKioqKioqKioqIEZpbmlzaGVkIHRvIGFkZCBncm91cHMgZnJvbSB5YW1sIHt9IiwgeWFtbE5hbWUpOworCisJCQlsb2cudHJhY2UoIioqKioqKioqKioqKiogR29pbmcgdG8gYWRkIGFydGlmYWN0cyBmcm9tIHlhbWwge30iLCB5YW1sTmFtZSk7CisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVkQ3NhckFydGlmYWN0c0VpdGhlciA9IHRoaXMuaGFuZGxlQ3NhckFydGlmYWN0cyhyZXNvdXJjZSwgdXNlciwgY3NhclVVSUQsIGNzYXIsIGNyZWF0ZWRBcnRpZmFjdHMsIEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZSwgZmFsc2UsIHRydWUpOworCQkJbG9nLnRyYWNlKCIqKioqKioqKioqKioqIEZpbmlzaGVkIHRvIGFkZCBhcnRpZmFjdHMgZnJvbSB5YW1sIHt9IiwgeWFtbE5hbWUpOworCQkJaWYgKGNyZWF0ZWRDc2FyQXJ0aWZhY3RzRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IGZhbHNlOworCQkJCXJldHVybiBjcmVhdGVkQ3NhckFydGlmYWN0c0VpdGhlcjsKKwkJCX0KKwkJCXJlc291cmNlID0gY3JlYXRlZENzYXJBcnRpZmFjdHNFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJCUFTRENLcGlBcGkuY291bnRDcmVhdGVkUmVzb3VyY2VzS1BJKCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCisJCX0gZmluYWxseSB7CisJCQlpZiAoIXJlc3VsdCkgeworCQkJCWxvZy53YXJuKCJvcGVyYXRpb24gZmFpbGVkLiBkbyByb2xsYmFjayIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCWlmICghY3JlYXRlZEFydGlmYWN0cy5pc0VtcHR5KCkpIHsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkZWxldGVGcm9tRXNSZXMgPSBhcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmRlbGV0ZUFsbENvbXBvbmVudEFydGlmYWN0c0lmTm90T25HcmFwaChjcmVhdGVkQXJ0aWZhY3RzKTsKKwkJCQkJaWYgKCFkZWxldGVGcm9tRXNSZXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGRlbGV0ZUZyb21Fc1Jlcyk7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQkJbG9nLmRlYnVnKCJjb21wb25lbnQgYW5kIGFsbCBpdHMgYXJ0aWZhY3RzIHdlcmUgZGVsZXRlZCwgaWQgPSB7fSIsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1Zygib3BlcmF0aW9uIHN1Y2Nlc3MuIGRvIGNvbW1pdCIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKworCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudEJ5TmFtZShyZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCksIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisKKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cHNPblJlc291cmNlKFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzKSB7CisJCWlmIChncm91cHMgIT0gbnVsbCAmJiBmYWxzZSA9PSBncm91cHMuaXNFbXB0eSgpKSB7CisJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gbWVyZ2VHcm91cHNVc2luZ1Jlc291cmNlID0gdXBkYXRlR3JvdXBNZW1iZXJzVXNpbmdSZXNvdXJjZShncm91cHMsIHJlc291cmNlKTsKKworCQkJaWYgKG1lcmdlR3JvdXBzVXNpbmdSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBwcmVwYXJlIGdyb3VwcyBmb3IgY3JlYXRpb24iKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG1lcmdlR3JvdXBzVXNpbmdSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc0FzTGlzdCA9IG1lcmdlR3JvdXBzVXNpbmdSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJLy8gRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwcyA9CisJCQkvLyBncm91cEJ1c2luZXNzTG9naWMuY3JlYXRlR3JvdXBzKAorCQkJLy8gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdXNlci5nZXRVc2VySWQoKSwKKwkJCS8vIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBncm91cHNBc0xpc3QsIGZhbHNlLAorCQkJLy8gdHJ1ZSk7CisJCQkvLyBJbiB0aGlzIG1ldGhvZCB3ZSBhc3N1bWUgYWxsIGluc3RhbmNlcyBleGlzdHMgaW4gcmVzb3VyY2UKKwkJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cHMgPSBncm91cEJ1c2luZXNzTG9naWMuY3JlYXRlR3JvdXBzKHJlc291cmNlLCB1c2VyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZ3JvdXBzQXNMaXN0LCB0cnVlKTsKKwkJCWlmIChjcmVhdGVHcm91cHMuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjcmVhdGVHcm91cHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZSk7CisJCX0KKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZWRSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCQlpZiAodXBkYXRlZFJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSh1cGRhdGVkUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2UpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHVwZGF0ZWRSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVHcm91cHNPblJlc291cmNlKFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzKSB7CisJCWlmIChncm91cHMgIT0gbnVsbCAmJiBmYWxzZSA9PSBncm91cHMuaXNFbXB0eSgpKSB7CisJCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzRnJvbVJlc291cmNlID0gcmVzb3VyY2UuZ2V0R3JvdXBzKCk7CisJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gbWVyZ2VHcm91cHNVc2luZ1Jlc291cmNlID0gdXBkYXRlR3JvdXBNZW1iZXJzVXNpbmdSZXNvdXJjZShncm91cHMsIHJlc291cmNlKTsKKworCQkJaWYgKG1lcmdlR3JvdXBzVXNpbmdSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBwcmVwYXJlIGdyb3VwcyBmb3IgY3JlYXRpb24iKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG1lcmdlR3JvdXBzVXNpbmdSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc0FzTGlzdCA9IG1lcmdlR3JvdXBzVXNpbmdSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8R3JvdXBEZWZpbml0aW9uPigpOworCQkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxHcm91cERlZmluaXRpb24+KCk7CisJCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzVG9DcmVhdGUgPSBuZXcgQXJyYXlMaXN0PEdyb3VwRGVmaW5pdGlvbj4oKTsKKwkJCWlmIChncm91cHNGcm9tUmVzb3VyY2UgIT0gbnVsbCAmJiAhZ3JvdXBzRnJvbVJlc291cmNlLmlzRW1wdHkoKSkgeworCQkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwIDogZ3JvdXBzQXNMaXN0KSB7CisJCQkJCU9wdGlvbmFsPEdyb3VwRGVmaW5pdGlvbj4gb3AgPSBncm91cHNGcm9tUmVzb3VyY2Uuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKGdyb3VwLmdldE5hbWUoKSkpLmZpbmRBbnkoKTsKKwkJCQkJaWYgKG9wLmlzUHJlc2VudCgpKSB7CisJCQkJCQlHcm91cERlZmluaXRpb24gZ3JvdXBUb1VwZGF0ZSA9IG9wLmdldCgpOworCQkJCQkJZ3JvdXBUb1VwZGF0ZS5zZXRNZW1iZXJzKGdyb3VwLmdldE1lbWJlcnMoKSk7CisJCQkJCQlncm91cHNUb1VwZGF0ZS5hZGQoZ3JvdXBUb1VwZGF0ZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlncm91cHNUb0NyZWF0ZS5hZGQoZ3JvdXApOworCQkJCQl9CisJCQkJfQorCQkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwIDogZ3JvdXBzRnJvbVJlc291cmNlKSB7CisJCQkJCU9wdGlvbmFsPEdyb3VwRGVmaW5pdGlvbj4gb3AgPSBncm91cHNBc0xpc3Quc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKGdyb3VwLmdldE5hbWUoKSkpLmZpbmRBbnkoKTsKKwkJCQkJaWYgKCFvcC5pc1ByZXNlbnQoKSAmJiAoZ3JvdXAuZ2V0QXJ0aWZhY3RzKCkgPT0gbnVsbCB8fCBncm91cC5nZXRBcnRpZmFjdHMoKS5pc0VtcHR5KCkpKSB7CisKKwkJCQkJCWdyb3Vwc1RvRGVsZXRlLmFkZChncm91cCk7CisJCQkJCX0KKworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWdyb3Vwc1RvQ3JlYXRlLmFkZEFsbChncm91cHNBc0xpc3QpOworCisJCQlpZiAoIWdyb3Vwc1RvQ3JlYXRlLmlzRW1wdHkoKSkgeworCQkJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cHMgPSBncm91cEJ1c2luZXNzTG9naWMuY3JlYXRlR3JvdXBzKHJlc291cmNlLCB1c2VyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZ3JvdXBzVG9DcmVhdGUsIHRydWUpOworCisJCQkJaWYgKGNyZWF0ZUdyb3Vwcy5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjcmVhdGVHcm91cHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghZ3JvdXBzVG9EZWxldGUuaXNFbXB0eSgpKSB7CisJCQkJZm9yIChHcm91cERlZmluaXRpb24gZ3JvdXAgOiBncm91cHNUb0RlbGV0ZSkgeworCQkJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVHcm91cEVpdGhlciA9IGdyb3VwT3BlcmF0aW9uLmRlbGV0ZUdyb3VwKGdyb3VwLmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJCQlpZiAoZGVsZXRlR3JvdXBFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgPSBkZWxldGVHcm91cEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMpOworCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGdyb3VwIHt9IHVuZGVyIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwgZ3JvdXAuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYWN0aW9uU3RhdHVzLm5hbWUoKSk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChncm91cHNUb1VwZGF0ZSAhPSBudWxsICYmICFncm91cHNUb1VwZGF0ZS5pc0VtcHR5KCkpIHsKKwkJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gYXNzb3RpYXRlR3JvdXBFaXRoZXIgPSBncm91cEJ1c2luZXNzTG9naWMuYXNzb2NpYXRlTWVtYmVyc1RvR3JvdXAocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdXNlci5nZXRVc2VySWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIGdyb3Vwc1RvVXBkYXRlLCBmYWxzZSwgdHJ1ZSk7CisJCQkJaWYgKGFzc290aWF0ZUdyb3VwRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvY2lhdGUgYXJ0aWZhY3RzIHRvIGdyb3Vwcy4gU3RhdHVzIGlzIHt9ICIsIGFzc290aWF0ZUdyb3VwRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYXNzb3RpYXRlR3JvdXBFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJCX0KKwkJCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gdXBkYXRlZEdyb3VwcyA9IGFzc290aWF0ZUdyb3VwRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJCUxpc3Q8U3RyaW5nPiBncm91cHNJZCA9IHVwZGF0ZWRHcm91cHMuc3RyZWFtKCkubWFwKGUgLT4gZS5nZXRVbmlxdWVJZCgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCQkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlVmVyc2lvbkVpdGhlciA9IGdyb3VwQnVzaW5lc3NMb2dpYy51cGRhdGVHcm91cFZlcnNpb24oZ3JvdXBzSWQsIHRydWUpOworCQkJCWlmICh1cGRhdGVWZXJzaW9uRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgZ3JvdXBzIHZlcnNpb24uIFN0YXR1cyBpcyB7fSAiLCB1cGRhdGVWZXJzaW9uRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UodXBkYXRlVmVyc2lvbkVpdGhlci5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCisJCQkJfQorCQkJfQorCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCQl9CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVkUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJaWYgKHVwZGF0ZWRSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UodXBkYXRlZFJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlSW5wdXRzT25SZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBNYXA8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+IGlucHV0cywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCWlmIChpbnB1dHMgIT0gbnVsbCAmJiBmYWxzZSA9PSBpbnB1dHMuaXNFbXB0eSgpKSB7CisJCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzQXNMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnB1dERlZmluaXRpb24+KCk7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBlbnRyeSA6IGlucHV0cy5lbnRyeVNldCgpKSB7CisJCQkJSW5wdXREZWZpbml0aW9uIGlucHV0ID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlpbnB1dC5zZXROYW1lKGVudHJ5LmdldEtleSgpKTsKKwkJCQlpbnB1dHNBc0xpc3QuYWRkKGlucHV0KTsKKwkJCX0KKwkJCUVpdGhlcjxMaXN0PElucHV0RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cHMgPSBpbnB1dHNCdXNpbmVzc0xvZ2ljLmNyZWF0ZUlucHV0c0luR3JhcGgoaW5wdXRzQXNMaXN0LCByZXNvdXJjZSwgdXNlciwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoY3JlYXRlR3JvdXBzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlR3JvdXBzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCQl9CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVkUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJaWYgKHVwZGF0ZWRSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UodXBkYXRlZFJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUdyb3VwTWVtYmVyc1VzaW5nUmVzb3VyY2UoTWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiBncm91cHMsIFJlc291cmNlIGNvbXBvbmVudCkgeworCisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisKKwkJaWYgKGdyb3VwcyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiBlbnRyeSA6IGdyb3Vwcy5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGdyb3VwTmFtZSA9IGVudHJ5LmdldEtleSgpOworCisJCQkJR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQlHcm91cERlZmluaXRpb24gdXBkYXRlZEdyb3VwRGVmaW5pdGlvbiA9IG5ldyBHcm91cERlZmluaXRpb24oZ3JvdXBEZWZpbml0aW9uKTsKKwkJCQl1cGRhdGVkR3JvdXBEZWZpbml0aW9uLnNldE1lbWJlcnMobnVsbCk7CisKKwkJCQkvLyBnZXQgdGhlIG1lbWJlcnMgb2YgdGhlIGdyb3VwCisJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBtZW1iZXJzID0gZ3JvdXBEZWZpbml0aW9uLmdldE1lbWJlcnMoKTsKKwkJCQlpZiAobWVtYmVycyAhPSBudWxsKSB7CisJCQkJCVNldDxTdHJpbmc+IGNvbXBJbnN0YW5jZXNOYW1lcyA9IG1lbWJlcnMua2V5U2V0KCk7CisKKwkJCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlcyA9PSBudWxsIHx8IHRydWUgPT0gY29tcG9uZW50SW5zdGFuY2VzLmlzRW1wdHkoKSkgeworCQkJCQkJU3RyaW5nIG1lbWJlcnNBc3RTdHJpbmcgPSBjb21wSW5zdGFuY2VzTmFtZXMuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSk7CisJCQkJCQlsb2cuZGVidWcoIlRoZSBtZW1iZXJzIHt9IGluIGdyb3VwIHt9IGNhbm5vdCBiZSBmb3VuZCBpbiBjb21wb25lbnQge30uIFRoZXJlIGFyZSBubyBjb21wb25lbnQgaW5zdGFuY2VzIiwgbWVtYmVyc0FzdFN0cmluZywgZ3JvdXBOYW1lLCBjb21wb25lbnQuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR1JPVVBfSU5WQUxJRF9DT01QT05FTlRfSU5TVEFOQ0UsIG1lbWJlcnNBc3RTdHJpbmcsIGdyb3VwTmFtZSwgY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCksIGdldENvbXBvbmVudFR5cGVGb3JSZXNwb25zZShjb21wb25lbnQpKSk7CisJCQkJCX0KKwkJCQkJLy8gRmluZCBhbGwgY29tcG9uZW50IGluc3RhbmNlcyB3aXRoIHRoZSBtZW1iZXIgbmFtZXMKKwkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBtZW1iZXJOYW1lcyA9IGNvbXBvbmVudEluc3RhbmNlcy5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoQ29tcG9uZW50SW5zdGFuY2U6OmdldE5hbWUsIENvbXBvbmVudEluc3RhbmNlOjpnZXRVbmlxdWVJZCkpOworCQkJCQltZW1iZXJOYW1lcy5wdXRBbGwoZ3JvdXBzLmtleVNldCgpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChnIC0+IGcsIGcgLT4gIiIpKSk7CisJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVsZXZhbnRJbnN0YW5jZXMgPSBtZW1iZXJOYW1lcy5lbnRyeVNldCgpLnN0cmVhbSgpLmZpbHRlcihuIC0+IGNvbXBJbnN0YW5jZXNOYW1lcy5jb250YWlucyhuLmdldEtleSgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKG4gLT4gbi5nZXRLZXkoKSwgbiAtPiBuLmdldFZhbHVlKCkpKTsKKworCQkJCQlpZiAocmVsZXZhbnRJbnN0YW5jZXMgPT0gbnVsbCB8fCByZWxldmFudEluc3RhbmNlcy5zaXplKCkgIT0gY29tcEluc3RhbmNlc05hbWVzLnNpemUoKSkgeworCisJCQkJCQlMaXN0PFN0cmluZz4gZm91bmRNZW1iZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJCQlpZiAocmVsZXZhbnRJbnN0YW5jZXMgIT0gbnVsbCkgeworCQkJCQkJCWZvdW5kTWVtYmVycyA9IHJlbGV2YW50SW5zdGFuY2VzLmtleVNldCgpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkJCQl9CisJCQkJCQljb21wSW5zdGFuY2VzTmFtZXMucmVtb3ZlQWxsKGZvdW5kTWVtYmVycyk7CisJCQkJCQlTdHJpbmcgbWVtYmVyc0FzdFN0cmluZyA9IGNvbXBJbnN0YW5jZXNOYW1lcy5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKTsKKwkJCQkJCWxvZy5kZWJ1ZygiVGhlIG1lbWJlcnMge30gaW4gZ3JvdXAge30gY2Fubm90IGJlIGZvdW5kIGluIGNvbXBvbmVudCB7fSIsIG1lbWJlcnNBc3RTdHJpbmcsIGdyb3VwTmFtZSwgY29tcG9uZW50LmdldE5vcm1hbGl6ZWROYW1lKCkpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdST1VQX0lOVkFMSURfQ09NUE9ORU5UX0lOU1RBTkNFLCBtZW1iZXJzQXN0U3RyaW5nLCBncm91cE5hbWUsIGNvbXBvbmVudC5nZXROb3JtYWxpemVkTmFtZSgpLCBnZXRDb21wb25lbnRUeXBlRm9yUmVzcG9uc2UoY29tcG9uZW50KSkpOworCQkJCQl9CisKKwkJCQkJdXBkYXRlZEdyb3VwRGVmaW5pdGlvbi5zZXRNZW1iZXJzKHJlbGV2YW50SW5zdGFuY2VzKTsKKwkJCQl9CisKKwkJCQlyZXN1bHQuYWRkKHVwZGF0ZWRHcm91cERlZmluaXRpb24pOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUklBbmRSZWxhdGlvbnNGcm9tWWFtbChTdHJpbmcgeWFtbE5hbWUsIFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbz4gdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvTWFwLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwKKwkJCVN0cmluZyB0b3BvbG9neVRlbXBsYXRlWWFtbCwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBTdHJpbmcgY3NhclVVSUQpIHsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQ7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlcjsKKwkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqIEdvaW5nIHRvIGNyZWF0ZSBhbGwgbm9kZXMge30iLCB5YW1sTmFtZSk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBSZXNvdXJjZT4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVkUmVzb3VyY2VzRnJvbWROb2RlVHlwZU1hcCA9IHRoaXMuaGFuZGxlTm9kZVR5cGVzKHlhbWxOYW1lLCByZXNvdXJjZSwgdXNlciwgdG9wb2xvZ3lUZW1wbGF0ZVlhbWwsIGNzYXIsIGZhbHNlKTsKKwkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqIEZpbmlzaGVkIHRvIGNyZWF0ZSBhbGwgbm9kZXMge30iLCB5YW1sTmFtZSk7CisJCWlmIChjcmVhdGVkUmVzb3VyY2VzRnJvbWROb2RlVHlwZU1hcC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHJlc291cmNlcyBmcm9tIG5vZGUgdHlwZXMgc3RhdHVzIGlzIHt9IiwgY3JlYXRlZFJlc291cmNlc0Zyb21kTm9kZVR5cGVNYXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlZFJlc291cmNlc0Zyb21kTm9kZVR5cGVNYXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKiBHb2luZyB0byBjcmVhdGUgYWxsIHJlc291cmNlIGluc3RhbmNlcyB7fSIsIHlhbWxOYW1lKTsKKwkJY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyID0gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZXModXNlciwgeWFtbE5hbWUsIHJlc291cmNlLCB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm9NYXAsIHRydWUsIGZhbHNlLCBjcmVhdGVkUmVzb3VyY2VzRnJvbWROb2RlVHlwZU1hcC5sZWZ0KCkudmFsdWUoKSk7CisKKwkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqIEZpbmlzaGVkIHRvIGNyZWF0ZSBhbGwgcmVzb3VyY2UgaW5zdGFuY2VzIHt9IiwgeWFtbE5hbWUpOworCQlpZiAoY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY3JlYXRlIHJlc291cmNlIGluc3RhbmNlcyBzdGF0dXMgaXMge30iLCBjcmVhdGVSZXNvdXJjZXNJbnN0YW5jZXNFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJlc3VsdCA9IGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlcjsKKwkJCXJldHVybiBjcmVhdGVSZXNvdXJjZXNJbnN0YW5jZXNFaXRoZXI7CisJCX0KKwkJcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZXNJbnN0YW5jZXNFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKiBHb2luZyB0byBjcmVhdGUgYWxsIHJlbGF0aW9ucyB7fSIsIHlhbWxOYW1lKTsKKwkJY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VzRWl0aGVyID0gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnModXNlciwgeWFtbE5hbWUsIHJlc291cmNlLCB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm9NYXAsIHRydWUsIGZhbHNlKTsKKworCQlsb2cuZGVidWcoIioqKioqKioqKioqKiogRmluaXNoZWQgdG8gY3JlYXRlIGFsbCByZWxhdGlvbnMge30iLCB5YW1sTmFtZSk7CisKKwkJaWYgKGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSByZWxhdGlvbiBiZXR3ZWVuIHJlc291cmNlIGluc3RhbmNlcyBzdGF0dXMgaXMge30iLCBjcmVhdGVSZXNvdXJjZXNJbnN0YW5jZXNFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJlc3VsdCA9IGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlcjsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSB7CisJCQlyZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlc0luc3RhbmNlc0VpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJfQorCisJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKiBHb2luZyB0byBjcmVhdGUgcG9zaXRpb25zIHt9IiwgeWFtbE5hbWUpOworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJTZXRQb3NpdGlvbiA9IGNvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYy5zZXRQb3NpdGlvbnNGb3JDb21wb25lbnRJbnN0YW5jZXMocmVzb3VyY2UsIHVzZXIuZ2V0VXNlcklkKCkpOworCQlsb2cuZGVidWcoIioqKioqKioqKioqKiogRmluaXNoZWQgdG8gc2V0IHBvc2l0aW9ucyB7fSIsIHlhbWxOYW1lKTsKKwkJcmVzdWx0ID0gZWl0aGVyU2V0UG9zaXRpb24uaXNSaWdodCgpID8gRWl0aGVyLnJpZ2h0KGVpdGhlclNldFBvc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSkgOiBFaXRoZXIubGVmdChyZXNvdXJjZSk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBSZXNvdXJjZT4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVOb2RlVHlwZXMoU3RyaW5nIHlhbWxOYW1lLCBSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBTdHJpbmcgdG9wb2xvZ3lUZW1wbGF0ZVlhbWwsIE1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgYm9vbGVhbiBuZWVkTG9jaykgeworCisJCU1hcDxTdHJpbmcsIFJlc291cmNlPiBjcmVhdGVkUmVzb3VyY2VzRnJvbWROb2RlVHlwZU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFJlc291cmNlPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KGNyZWF0ZWRSZXNvdXJjZXNGcm9tZE5vZGVUeXBlTWFwKTsKKworCQlTdHJpbmcgeWFtbEZpbGVOYW1lID0gQ29uc3RhbnRzLkdMT0JBTF9TVUJTVElUVVRJT05fVFlQRV9TRVJWSUNFX1RFTVBMQVRFOworCisJCWlmIChjc2FyICE9IG51bGwgJiYgY3Nhci5jb250YWluc0tleSh5YW1sRmlsZU5hbWUpKSB7CisJCQlieXRlW10geWFtbEZpbGVCeXRlcyA9IGNzYXIuZ2V0KHlhbWxGaWxlTmFtZSk7CisJCQlTdHJpbmcgZ2xvYmFsVHlwZXNZYW1sID0gbmV3IFN0cmluZyh5YW1sRmlsZUJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBSZXNvdXJjZT4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVkTm9kZVR5cGVzRnJvbUdsb2JhbFR5cGVzVGVtcGxhdGVFaXRoZXIgPSB0aGlzLmNyZWF0ZVJlc291cmNlc0Zyb21ZYW1sTm9kZVR5cGVzTGlzdCh5YW1sRmlsZU5hbWUsIHJlc291cmNlLCBnbG9iYWxUeXBlc1lhbWwsIHVzZXIsIG5lZWRMb2NrKTsKKwkJCWlmIChjcmVhdGVkTm9kZVR5cGVzRnJvbUdsb2JhbFR5cGVzVGVtcGxhdGVFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjcmVhdGVkTm9kZVR5cGVzRnJvbUdsb2JhbFR5cGVzVGVtcGxhdGVFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBudWxsKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCWNyZWF0ZWRSZXNvdXJjZXNGcm9tZE5vZGVUeXBlTWFwLnB1dEFsbChjcmVhdGVkTm9kZVR5cGVzRnJvbUdsb2JhbFR5cGVzVGVtcGxhdGVFaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFJlc291cmNlPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZWROb2RlVHlwZUZyb21NYWluVGVtcGxhdGVFaXRoZXIgPSBjcmVhdGVSZXNvdXJjZXNGcm9tWWFtbE5vZGVUeXBlc0xpc3QoeWFtbE5hbWUsIHJlc291cmNlLCB0b3BvbG9neVRlbXBsYXRlWWFtbCwgdXNlciwgbmVlZExvY2spOworCQlpZiAoY3JlYXRlZE5vZGVUeXBlRnJvbU1haW5UZW1wbGF0ZUVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY3JlYXRlZE5vZGVUeXBlRnJvbU1haW5UZW1wbGF0ZUVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWNyZWF0ZWRSZXNvdXJjZXNGcm9tZE5vZGVUeXBlTWFwLnB1dEFsbChjcmVhdGVkTm9kZVR5cGVGcm9tTWFpblRlbXBsYXRlRWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKworCQkvLyBhZGQgdGhlIGNyZWF0ZWQgbm9kZSB0eXBlcyB0byB0aGUgY2FjaGUgYWx0aG91Z2ggdGhleSBhcmUgbm90IGluIHRoZQorCQkvLyBncmFwaC4KKwkJY3JlYXRlZFJlc291cmNlc0Zyb21kTm9kZVR5cGVNYXAudmFsdWVzKCkuc3RyZWFtKCkuZm9yRWFjaChwIC0+IGNhY2hlTWFuYWdlck9wZXJhdGlvbi5zdG9yZUNvbXBvbmVudEluQ2FjaGUocCwgTm9kZVR5cGVFbnVtLlJlc291cmNlKSk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZUNzYXJBcnRpZmFjdHMoUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgU3RyaW5nIGNzYXJVVUlELCBNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBjcmVhdGVkQXJ0aWZhY3RzLCBBcnRpZmFjdE9wZXJhdGlvbiBhcnRpZmFjdE9wZXJhdGlvbiwgYm9vbGVhbiBzaG91bGRMb2NrLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJaWYgKGNzYXIgIT0gbnVsbCkgeworCQkJU3RyaW5nIHZlbmRvckxpY2Vuc2VNb2RlbElkID0gbnVsbDsKKwkJCVN0cmluZyB2ZkxpY2Vuc2VNb2RlbElkID0gbnVsbDsKKworCQkJaWYgKGFydGlmYWN0T3BlcmF0aW9uLmVxdWFscyhBcnRpZmFjdE9wZXJhdGlvbi5VcGRhdGUpKSB7CisJCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzTWFwID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQkJCWlmIChkZXBsb3ltZW50QXJ0aWZhY3RzTWFwICE9IG51bGwgJiYgIWRlcGxveW1lbnRBcnRpZmFjdHNNYXAuaXNFbXB0eSgpKSB7CisJCQkJCWZvciAoRW50cnk8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0RW50cnkgOiBkZXBsb3ltZW50QXJ0aWZhY3RzTWFwLmVudHJ5U2V0KCkpIHsKKwkJCQkJCWlmIChhcnRpZmFjdEVudHJ5LmdldFZhbHVlKCkuZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuVkVORE9SX0xJQ0VOU0VfTU9ERUwpKQorCQkJCQkJCXZlbmRvckxpY2Vuc2VNb2RlbElkID0gYXJ0aWZhY3RFbnRyeS5nZXRWYWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisJCQkJCQlpZiAoYXJ0aWZhY3RFbnRyeS5nZXRWYWx1ZSgpLmdldEFydGlmYWN0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLlZGX0xJQ0VOU0VfTU9ERUwpKQorCQkJCQkJCXZmTGljZW5zZU1vZGVsSWQgPSBhcnRpZmFjdEVudHJ5LmdldFZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQkJY3JlYXRlT3JVcGRhdGVMaWNlbnNlQXJ0aWZhY3QocmVzb3VyY2UsIHVzZXIsIGNzYXJVVUlELCBjc2FyLCBDb25zdGFudHMuVkVORE9SX0xJQ0VOU0VfTU9ERUwsIEFydGlmYWN0VHlwZUVudW0uVkVORE9SX0xJQ0VOU0UuZ2V0VHlwZSgpLCBDb25zdGFudHMuVkVORE9SX0xJQ0VOU0VfTEFCRUwsIENvbnN0YW50cy5WRU5ET1JfTElDRU5TRV9ESVNQTEFZX05BTUUsCisJCQkJCUNvbnN0YW50cy5WRU5ET1JfTElDRU5TRV9ERVNDUklQVElPTiwgdmVuZG9yTGljZW5zZU1vZGVsSWQsIGFydGlmYWN0T3BlcmF0aW9uLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCWNyZWF0ZU9yVXBkYXRlTGljZW5zZUFydGlmYWN0KHJlc291cmNlLCB1c2VyLCBjc2FyVVVJRCwgY3NhciwgQ29uc3RhbnRzLlZGX0xJQ0VOU0VfTU9ERUwsIEFydGlmYWN0VHlwZUVudW0uVkZfTElDRU5TRS5nZXRUeXBlKCksIENvbnN0YW50cy5WRl9MSUNFTlNFX0xBQkVMLCBDb25zdGFudHMuVkZfTElDRU5TRV9ESVNQTEFZX05BTUUsIENvbnN0YW50cy5WRl9MSUNFTlNFX0RFU0NSSVBUSU9OLAorCQkJCQl2ZkxpY2Vuc2VNb2RlbElkLCBhcnRpZmFjdE9wZXJhdGlvbiwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4sIFJlc3BvbnNlRm9ybWF0PiBhcnRpZmFjc01ldGFDc2FyU3RhdHVzID0gQ3NhclZhbGlkYXRpb25VdGlscy5nZXRBcnRpZmFjdHNNZXRhKGNzYXIsIGNzYXJVVUlELCBjb21wb25lbnRzVXRpbHMpOworCQkJaWYgKGFydGlmYWNzTWV0YUNzYXJTdGF0dXMuaXNMZWZ0KCkpIHsKKworCQkJCVN0cmluZyBhcnRpZmFjdHNGaWxlTmFtZSA9IGFydGlmYWNzTWV0YUNzYXJTdGF0dXMubGVmdCgpLnZhbHVlKCkuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIGFydGlmYWN0c0NvbnRlbnRzID0gYXJ0aWZhY3NNZXRhQ3NhclN0YXR1cy5sZWZ0KCkudmFsdWUoKS5nZXRWYWx1ZSgpOworCQkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUFydGlmYWN0c0Zyb21Dc2FyID0gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCQkJCWlmIChhcnRpZmFjdE9wZXJhdGlvbi5lcXVhbHMoQXJ0aWZhY3RPcGVyYXRpb24uQ3JlYXRlKSkKKwkJCQkJY3JlYXRlQXJ0aWZhY3RzRnJvbUNzYXIgPSBjcmVhdGVSZXNvdXJjZUFydGlmYWN0c0Zyb21Dc2FyKGNzYXJVVUlELCBjc2FyLCByZXNvdXJjZSwgdXNlciwgYXJ0aWZhY3RzQ29udGVudHMsIGFydGlmYWN0c0ZpbGVOYW1lLCBjcmVhdGVkQXJ0aWZhY3RzLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCQllbHNlCisJCQkJCWNyZWF0ZUFydGlmYWN0c0Zyb21Dc2FyID0gdXBkYXRlUmVzb3VyY2VBcnRpZmFjdHNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgcmVzb3VyY2UsIHVzZXIsIGFydGlmYWN0c0NvbnRlbnRzLCBhcnRpZmFjdHNGaWxlTmFtZSwgY3JlYXRlZEFydGlmYWN0cywgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQkJaWYgKGNyZWF0ZUFydGlmYWN0c0Zyb21Dc2FyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkNvdWxkbid0IGNyZWF0ZSBhcnRpZmFjdHMgZnJvbSBhcnRpZmFjdHMubWV0YSIpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZUFydGlmYWN0c0Zyb21Dc2FyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCisJCQkJcmVzb3VyY2UgPSBjcmVhdGVBcnRpZmFjdHNGcm9tQ3Nhci5sZWZ0KCkudmFsdWUoKTsKKwkJCX0gZWxzZSB7CisJCQkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc1RvRGVsZXRlID0gcmVzb3VyY2UuZ2V0R3JvdXBzKCk7CisKKwkJCQlpZiAoZ3JvdXBzVG9EZWxldGUgIT0gbnVsbCAmJiAhZ3JvdXBzVG9EZWxldGUuaXNFbXB0eSgpKSB7CisJCQkJCVNldDxTdHJpbmc+IGFydGlmYWN0c1RvRGVsZXRlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQkJCQlmb3IgKEdyb3VwRGVmaW5pdGlvbiBncm91cCA6IGdyb3Vwc1RvRGVsZXRlKSB7CisJCQkJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzID0gZ3JvdXAuZ2V0QXJ0aWZhY3RzKCk7CisJCQkJCQlpZiAoYXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCQkJCQlhcnRpZmFjdHNUb0RlbGV0ZS5hZGRBbGwoYXJ0aWZhY3RzKTsKKwkJCQkJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVHcm91cEVpdGhlciA9IGdyb3VwT3BlcmF0aW9uLmRlbGV0ZUdyb3VwKGdyb3VwLmdldFVuaXF1ZUlkKCksIGluVHJhbnNhY3Rpb24pOworCQkJCQkJCWlmIChkZWxldGVHcm91cEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlT3BlcmF0aW9uU3RhdHVzID0gZGVsZXRlR3JvdXBFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMpOworCQkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgZ3JvdXAge30gdW5kZXIgY29tcG9uZW50IHt9LCBlcnJvcjoge30iLCBncm91cC5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZS5nZXROb3JtYWxpemVkTmFtZSgpLCBhY3Rpb25TdGF0dXMubmFtZSgpKTsKKwkJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWZvciAoU3RyaW5nIGFydGlmYWN0SWQgOiBhcnRpZmFjdHNUb0RlbGV0ZSkgeworCQkJCQkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVEZWxldGUgPSBhcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmhhbmRsZURlbGV0ZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBhcnRpZmFjdElkLCB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfREVMRVRFLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwKKwkJCQkJCQkJcmVzb3VyY2UsIG51bGwsIG51bGwsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCQkJCQkJaWYgKGhhbmRsZURlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlsb2cuZGVidWcoIkNvdWxkbid0IGRlbGV0ZSAgYXJ0aWZhY3Qge30iLCBhcnRpZmFjdElkKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGhhbmRsZURlbGV0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJfQorCisJCQkJCX0KKwkJCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJHZXJSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGluVHJhbnNhY3Rpb24pOworCQkJCQlpZiAoZWl0aGVyR2VyUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGVpdGhlckdlclJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlKTsKKworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisKKwkJCQkJfQorCQkJCQlyZXNvdXJjZSA9IGVpdGhlckdlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVPclVwZGF0ZUxpY2Vuc2VBcnRpZmFjdChSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBTdHJpbmcgY3NhclVVSUQsIE1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgU3RyaW5nIGFydGlmYWN0RmlsZU5hbWUsIFN0cmluZyBhcnRpZmFjdFR5cGUsIFN0cmluZyBhcnRpZmFjdExhYmVsLCBTdHJpbmcgYXJ0aWZhY3REaXNwbGF5TmFtZSwKKwkJCVN0cmluZyBhcnRpZmFjdERlc2NyaXB0aW9uLCBTdHJpbmcgYXJ0aWZhY3RJZCwgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlieXRlW10gYXJ0aWZhY3RGaWxlQnl0ZXMgPSBudWxsOworCisJCWlmIChjc2FyLmNvbnRhaW5zS2V5KENvbnN0YW50cy5BUlRJRkFDVFMgKyBhcnRpZmFjdEZpbGVOYW1lKSkgeworCQkJYXJ0aWZhY3RGaWxlQnl0ZXMgPSBjc2FyLmdldChDb25zdGFudHMuQVJUSUZBQ1RTICsgYXJ0aWZhY3RGaWxlTmFtZSk7CisJCX0KKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJaWYgKG9wZXJhdGlvbi5lcXVhbHMoQXJ0aWZhY3RPcGVyYXRpb24uVXBkYXRlKSkgeworCQkJaWYgKGFydGlmYWN0SWQgIT0gbnVsbCAmJiAhYXJ0aWZhY3RJZC5pc0VtcHR5KCkgJiYgYXJ0aWZhY3RGaWxlQnl0ZXMgPT0gbnVsbCkgeworCQkJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlRGVsZXRlID0gYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5oYW5kbGVEZWxldGUocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3RJZCwgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX0RFTEVURSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHJlc291cmNlLCBudWxsLAorCQkJCQkJbnVsbCwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQkJaWYgKGhhbmRsZURlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGhhbmRsZURlbGV0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlpZiAoKGFydGlmYWN0SWQgPT0gbnVsbCB8fCBhcnRpZmFjdElkLmlzRW1wdHkoKSkgJiYgYXJ0aWZhY3RGaWxlQnl0ZXMgIT0gbnVsbCkgeworCQkJCW9wZXJhdGlvbiA9IEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZTsKKwkJCX0KKworCQl9CisJCWlmIChhcnRpZmFjdEZpbGVCeXRlcyAhPSBudWxsKSB7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHZlbmRvckxpY2Vuc2VNb2RlbEpzb24gPSBidWlsZEpzb25Gb3JVcGRhdGVBcnRpZmFjdChhcnRpZmFjdElkLCBhcnRpZmFjdEZpbGVOYW1lLCBhcnRpZmFjdFR5cGUsIGFydGlmYWN0TGFiZWwsIGFydGlmYWN0RGlzcGxheU5hbWUsIGFydGlmYWN0RGVzY3JpcHRpb24sIGFydGlmYWN0RmlsZUJ5dGVzLCBudWxsKTsKKwkJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gdmZMaWNlbmNlQXJ0aWZhY3RDcmVhdGVFaXRoZXIgPSBjcmVhdGVPclVwZGF0ZUNzYXJBcnRpZmFjdEZyb21Kc29uKHJlc291cmNlLCB1c2VyLCB2ZW5kb3JMaWNlbnNlTW9kZWxKc29uLCBvcGVyYXRpb24sIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCisJCQlpZiAodmZMaWNlbmNlQXJ0aWZhY3RDcmVhdGVFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJVcGxvYWRMaWNlbnNlQXJ0aWZhY3QiLCAiRmFpbGVkIHRvIHVwbG9hZCBsaWNlbnNlIGFydGlmYWN0OiAiICsgYXJ0aWZhY3RGaWxlTmFtZSArICJXaXRoIGNzYXIgdXVpZDogIiArIGNzYXJVVUlELCBFcnJvclNldmVyaXR5LldBUk5JTkcpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmZMaWNlbmNlQXJ0aWZhY3RDcmVhdGVFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVPclVwZGF0ZUNzYXJBcnRpZmFjdEZyb21Kc29uKFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiwgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uLCBib29sZWFuIHNob3VkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJU3RyaW5nIGpzb25TdHIgPSBnc29uLnRvSnNvbihqc29uKTsKKworCQlTdHJpbmcgb3JpZ01kNSA9IEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5U3RyaW5nKGpzb25TdHIpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uRnJvbUpzb24gPSBSZXByZXNlbnRhdGlvblV0aWxzLmNvbnZlcnRKc29uVG9BcnRpZmFjdERlZmluaXRpb24oanNvblN0ciwgQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKTsKKworCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwbG9hZEFydGlmYWN0VG9TZXJ2aWNlID0gYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5oYW5kbGVBcnRpZmFjdFJlcXVlc3QocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdXNlci5nZXRVc2VySWQoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG9wZXJhdGlvbiwKKwkJCQlhcnRpZmFjdERlZmluaXRpb25Gcm9tSnNvbi5nZXRVbmlxdWVJZCgpLCBhcnRpZmFjdERlZmluaXRpb25Gcm9tSnNvbiwgb3JpZ01kNSwganNvblN0ciwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgc2hvdWRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHVwbG9hZEFydGlmYWN0VG9TZXJ2aWNlLmlzUmlnaHQoKSkKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodXBsb2FkQXJ0aWZhY3RUb1NlcnZpY2UucmlnaHQoKS52YWx1ZSgpKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodXBsb2FkQXJ0aWZhY3RUb1NlcnZpY2UubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVSZXNvdXJjZUFydGlmYWN0c0Zyb21Dc2FyKFN0cmluZyBjc2FyVVVJRCwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBTdHJpbmcgYXJ0aWZhY3RzTWV0YUZpbGUsIFN0cmluZyBhcnRpZmFjdHNNZXRhRmlsZU5hbWUsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBjcmVhdGVkTmV3QXJ0aWZhY3RzLAorCQkJYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4+LCBSZXNwb25zZUZvcm1hdD4gcGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlciA9IHBhcnNlUmVzb3VyY2VBcnRpZmFjdHNJbmZvRnJvbUZpbGUocmVzb3VyY2UsIGFydGlmYWN0c01ldGFGaWxlLCBhcnRpZmFjdHNNZXRhRmlsZU5hbWUsIHVzZXIpOworCQlpZiAocGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gcGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHMgPSByZXNvdXJjZS5nZXRHcm91cHMoKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBseW1lbnRBcnRpZmFjdCA9IHJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWREZXBseW1lbnRBcnRpZmFjdHNBZnRlckRlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlpZiAoZGVwbHltZW50QXJ0aWZhY3QgIT0gbnVsbCAmJiAhZGVwbHltZW50QXJ0aWZhY3QuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGRlcGx5bWVudEFydGlmYWN0LmVudHJ5U2V0KCkpIHsKKwkJCQljcmVhdGVkRGVwbHltZW50QXJ0aWZhY3RzQWZ0ZXJEZWxldGUuYWRkKGVudHJ5LmdldFZhbHVlKCkpOworCQkJfQorCQl9CisJCWludCBsYWJlbENvdW50ZXIgPSBjcmVhdGVkRGVwbHltZW50QXJ0aWZhY3RzQWZ0ZXJEZWxldGUuc2l6ZSgpOworCisJCWlmIChkZXBseW1lbnRBcnRpZmFjdCA9PSBudWxsIHx8IGRlcGx5bWVudEFydGlmYWN0LmlzRW1wdHkoKSkgeworCQkJaWYgKGdyb3VwcyAhPSBudWxsICYmICFncm91cHMuaXNFbXB0eSgpKSB7CisJCQkJZm9yIChHcm91cERlZmluaXRpb24gZ3JvdXAgOiBncm91cHMpIHsKKwkJCQkJaWYgKGdyb3VwLmdldEFydGlmYWN0cygpICE9IG51bGwgJiYgIWdyb3VwLmdldEFydGlmYWN0cygpLmlzRW1wdHkoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIGFydGlmYWN0cyBmcm9tIGNzYXIuIExpc3Qgb2YgZW10eSBidXQgZ3JvdXAgbm90IGVtcHR5Iik7CisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlQXJ0aWZhY3RzKGNzYXJVVUlELCBjc2FyLCByZXNvdXJjZSwgdXNlciwgcGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlci5sZWZ0KCkudmFsdWUoKSwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSwgY3JlYXRlZE5ld0FydGlmYWN0cywgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCX0KKwkJLy8gZmluZCBhcnRpZmFjdHMgdG8gZGVsZXRlCisJCVNldDxTdHJpbmc+IGFydGlmYWN0Tm90SW5Hcm91cFNldCA9IGZpbmRBcnRpZmFjdHNOb3RJbkdyb3VwVG9EZWxldGUoZ3JvdXBzLCBjcmVhdGVkRGVwbHltZW50QXJ0aWZhY3RzQWZ0ZXJEZWxldGUpOworCisJCS8vIGRlbGV0ZSBhbGwgYXJ0aWZhY3RzIHdoaWNoIG5vdCBpbiBncm91cHMKKwkJaWYgKCFhcnRpZmFjdE5vdEluR3JvdXBTZXQuaXNFbXB0eSgpKSB7CisJCQlmb3IgKFN0cmluZyBhcnRpZmFjdElkIDogYXJ0aWZhY3ROb3RJbkdyb3VwU2V0KSB7CisJCQkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVEZWxldGUgPSBhcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmhhbmRsZURlbGV0ZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBhcnRpZmFjdElkLCB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfREVMRVRFLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgcmVzb3VyY2UsIG51bGwsCisJCQkJCQludWxsLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCQlpZiAoaGFuZGxlRGVsZXRlLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGhhbmRsZURlbGV0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKworCQkJfQorCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJHZXJSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGVpdGhlckdlclJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZWl0aGVyR2VyUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2UpOworCisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisKKwkJCX0KKworCQkJcmVzb3VyY2UgPSBlaXRoZXJHZXJSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkJCWRlcGx5bWVudEFydGlmYWN0ID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCisJCQljcmVhdGVkRGVwbHltZW50QXJ0aWZhY3RzQWZ0ZXJEZWxldGUuY2xlYXIoKTsKKwkJCWlmIChkZXBseW1lbnRBcnRpZmFjdCAhPSBudWxsICYmICFkZXBseW1lbnRBcnRpZmFjdC5pc0VtcHR5KCkpIHsKKwkJCQlmb3IgKEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGRlcGx5bWVudEFydGlmYWN0LmVudHJ5U2V0KCkpIHsKKwkJCQkJY3JlYXRlZERlcGx5bWVudEFydGlmYWN0c0FmdGVyRGVsZXRlLmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBmaW5kIG1hc3RlciBpbiBncm91cAorCQlNYXA8R3JvdXBEZWZpbml0aW9uLCBNYXA8QXJ0aWZhY3REZWZpbml0aW9uLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+PiBncm91cEFydGlmYWN0ID0gZmluZE1hc3RlckFydGlmYWN0SW5Hcm91cChncm91cHMsIGRlcGx5bWVudEFydGlmYWN0KTsKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBjcmVhdGUgc2V0IHBhcnNlZAorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBhcnRpZmFjdHMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCU1hcDxTdHJpbmcsIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBwYXJzZWRBcnRpZmFjdHNNYXAgPSBwYXJzZVJlc291cmNlSW5mb0Zyb21ZYW1sRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQlDb2xsZWN0aW9uPExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBwYXJzZWRBcmlmYWN0c0NvbGxlY3Rpb24gPSBwYXJzZWRBcnRpZmFjdHNNYXAudmFsdWVzKCk7CisJCU1hcDxBcnRpZmFjdFRlbXBsYXRlSW5mbywgU2V0PEFydGlmYWN0VGVtcGxhdGVJbmZvPj4gcGFyc2VkR3JvdXAgPSBuZXcgSGFzaE1hcDxBcnRpZmFjdFRlbXBsYXRlSW5mbywgU2V0PEFydGlmYWN0VGVtcGxhdGVJbmZvPj4oKTsKKworCQlmb3IgKExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHBhcnNlZEdyb3VwVGVtcGxhdGVMaXN0IDogcGFyc2VkQXJpZmFjdHNDb2xsZWN0aW9uKSB7CisJCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIHBhcnNlZEdyb3VwVGVtcGxhdGUgOiBwYXJzZWRHcm91cFRlbXBsYXRlTGlzdCkgeworCQkJCXBhcnNlZEdyb3VwVGVtcGxhdGUuc2V0R3JvdXBOYW1lKCIiKTsKKwkJCQlTZXQ8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHBhcnNlZEFydGlmYWN0c05hbWVzID0gbmV3IEhhc2hTZXQ8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+KCk7CisJCQkJcGFyc2VkQXJ0aWZhY3RzTmFtZXMuYWRkKHBhcnNlZEdyb3VwVGVtcGxhdGUpOworCQkJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRHcm91cFRlbXBsYXRlTGlzdCA9IHBhcnNlZEdyb3VwVGVtcGxhdGUuZ2V0UmVsYXRlZEFydGlmYWN0c0luZm8oKTsKKwkJCQlpZiAocmVsYXRlZEdyb3VwVGVtcGxhdGVMaXN0ICE9IG51bGwgJiYgIXJlbGF0ZWRHcm91cFRlbXBsYXRlTGlzdC5pc0VtcHR5KCkpIHsKKwkJCQkJY3JlYXRlQXJ0aWZhY3RzR3JvdXBTZXQocGFyc2VkR3JvdXBUZW1wbGF0ZUxpc3QsIHBhcnNlZEFydGlmYWN0c05hbWVzKTsKKwkJCQl9CisJCQkJcGFyc2VkR3JvdXAucHV0KHBhcnNlZEdyb3VwVGVtcGxhdGUsIHBhcnNlZEFydGlmYWN0c05hbWVzKTsKKwkJCX0KKwkJfQorCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBmaW5kIGFydGlmYWN0cyB0bworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZGVsZXRlLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCVNldDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c1RvRGVsZXRlID0gbmV3IEhhc2hTZXQ8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlNYXA8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+IGdyb3VwVG9EZWxldGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPj4oKTsKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBkaXNzb2NBcnRpZmFjdEZyb21Hcm91cCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworCisJCVNldDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4ganNvbk1hc3RlckFydGlmYWN0cyA9IHBhcnNlZEdyb3VwLmtleVNldCgpOworCisJCU1hcDxHcm91cERlZmluaXRpb24sIE1lcmdlZEFydGlmYWN0SW5mbz4gbWVyZ2VkZ3JvdXAgPSBtZXJnZUdyb3VwSW5VcGRhdGVGbG93KGdyb3VwQXJ0aWZhY3QsIHBhcnNlZEdyb3VwLCBhcnRpZmFjdHNUb0RlbGV0ZSwgZ3JvdXBUb0RlbGV0ZSwganNvbk1hc3RlckFydGlmYWN0cyk7CisKKwkJLy8gZmluZCBhcnRpZmFjdHMgdG8gZGVsZXRlCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+IGRlbGV0ZUdyb3VwIDogZ3JvdXBUb0RlbGV0ZS5lbnRyeVNldCgpKSB7CisKKwkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBkZWxldGVHcm91cC5nZXRWYWx1ZSgpOworCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgOiBhcnRpZmFjdHMpIHsKKwkJCQlmaW5kQXJ0aWZhY3RUb0RlbGV0ZShwYXJzZWRHcm91cCwgYXJ0aWZhY3RzVG9EZWxldGUsIGRlbGV0ZUdyb3VwLmdldEtleSgpLCBhcnRpZmFjdCk7CisJCQl9CisKKwkJfQorCisJCS8vIFNldDxTdHJpbmc+IGRlbGV0ZWRBcnRpZmFjdHNOYW1lID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlFaXRoZXI8TGlzdDxBcnRpZmFjdERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlZEFydGlmYWN0c0VpdGhlciA9IGRlbGV0ZUFydGlmYWN0c0luVXBkYXRlQ3NhckZsb3cocmVzb3VyY2UsIHVzZXIsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24sIGFydGlmYWN0c1RvRGVsZXRlLCBncm91cFRvRGVsZXRlKTsKKwkJaWYgKGRlbGV0ZWRBcnRpZmFjdHNFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgYXJ0aWZhY3RzLiBTdGF0dXMgaXMge30gIiwgZGVsZXRlZEFydGlmYWN0c0VpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRlbGV0ZWRBcnRpZmFjdHNFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKworCQl9CisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBkZWxldGVkQXJ0aWZhY3RzID0gZGVsZXRlZEFydGlmYWN0c0VpdGhlci5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBuZWVkIHRvIHVwZGF0ZSByZXNvdXJjZSBpZiB3ZSB1cGRhdGVkIGFydGlmYWN0cworCQlpZiAoZGVsZXRlZEFydGlmYWN0cyAhPSBudWxsICYmICFkZWxldGVkQXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gZGVsZXRlZEFydGlmYWN0IDogZGVsZXRlZEFydGlmYWN0cykgeworCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRUb1JlbW92ZSA9IG51bGw7CisJCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0RnJvbVJlc291cmNlIDogY3JlYXRlZERlcGx5bWVudEFydGlmYWN0c0FmdGVyRGVsZXRlKSB7CisJCQkJCWlmIChkZWxldGVkQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKS5lcXVhbHNJZ25vcmVDYXNlKGFydEZyb21SZXNvdXJjZS5nZXRVbmlxdWVJZCgpKSkgeworCQkJCQkJYXJ0VG9SZW1vdmUgPSBhcnRGcm9tUmVzb3VyY2U7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoYXJ0VG9SZW1vdmUgIT0gbnVsbCkKKwkJCQkJY3JlYXRlZERlcGx5bWVudEFydGlmYWN0c0FmdGVyRGVsZXRlLnJlbW92ZShhcnRUb1JlbW92ZSk7CisKKwkJCX0KKwkJfQorCisJCS8vLy8vLy8vLy8vLy8vIGRpc3NvY2lhdGUsIGFzc29jaWF0ZSBvciBjcmVhdGUKKwkJLy8vLy8vLy8vLy8vLy8gYXJ0aWZhY3RzLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBhc3NEaXNzb3RpYXRlRWl0aGVyID0gYXNzb2NpYXRlQW5kRGlzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXAoY3NhclVVSUQsIGNzYXIsIHJlc291cmNlLCB1c2VyLCBjcmVhdGVkTmV3QXJ0aWZhY3RzLCBsYWJlbENvdW50ZXIsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24sIGNyZWF0ZWREZXBseW1lbnRBcnRpZmFjdHNBZnRlckRlbGV0ZSwKKwkJCQlkaXNzb2NBcnRpZmFjdEZyb21Hcm91cCwgbWVyZ2VkZ3JvdXAsIGRlbGV0ZWRBcnRpZmFjdHMpOworCisJCWlmIChhc3NEaXNzb3RpYXRlRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGFydGlmYWN0cy4gU3RhdHVzIGlzIHt9ICIsIGFzc0Rpc3NvdGlhdGVFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJcmV0dXJuIEVpdGhlci5yaWdodChhc3NEaXNzb3RpYXRlRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJfQorCQlyZXNvdXJjZSA9IGFzc0Rpc3NvdGlhdGVFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCWdyb3VwcyA9IHJlc291cmNlLmdldEdyb3VwcygpOworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkvLyB1cGRhdGUgdmZNb2R1bGUgbmFtZXMKKwkJU2V0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBGb3JBc3NvY2lhdGVXaXRoTWVtYmVycyA9IG1lcmdlZGdyb3VwLmtleVNldCgpOworCQlpZiAoZ3JvdXBzICE9IG51bGwgJiYgIWdyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lc1JlcyA9IGdyb3VwQnVzaW5lc3NMb2dpYy52YWxpZGF0ZVVwZGF0ZVZmR3JvdXBOYW1lc09uR3JhcGgoZ3JvdXBzLCByZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHZhbGlkYXRlVXBkYXRlVmZHcm91cE5hbWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVVcGRhdGVWZkdyb3VwTmFtZXNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBoZWF0R3JvdXBzID0gbnVsbDsKKworCQkJLy8gTGlzdDxJQXJ0aWZhY3RJbmZvPiBjb2xsZWN0ID0gcmVzb3VyY2VzLnN0cmVhbSgpLmZsYXRNYXAoIGUgLT4KKwkJCS8vIGUuZ2V0QXJ0aWZhY3RzKCkuc3RyZWFtKCkpLmZpbHRlcihwIC0+CisJCQkvLyByZWxldmFudEFydGlmYWN0VHlwZXMuY29udGFpbnMocC5nZXRBcnRpZmFjdFR5cGUoKQorCQkJLy8gKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCS8vIExpc3Q8R3JvdXBEZWZpbml0aW9uPiBoZWF0R3JvdXBzID0gY3JlYXRlZEdyb3Vwcy5zdHJlYW0oKS5maWx0ZXIoCisJCQkvLyBlIC0+IGUuZ2V0UHJvcGVydGllcygpLnN0cmVhbSgpLmZpbHRlcihwIC0+CisJCQkvLyBwLmdldE5hbWUoKS5jb250YWlucyhDb25zdGFudHMuSEVBVF9GSUxFX1BST1BTKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQloZWF0R3JvdXBzID0gZ3JvdXBzLnN0cmVhbSgpLmZpbHRlcihlIC0+IGUuZ2V0TWVtYmVycygpICE9IG51bGwpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQk7CisKKwkJCWZvciAoR3JvdXBEZWZpbml0aW9uIHVwZGF0ZWRHcm91cERlZiA6IGdyb3VwRm9yQXNzb2NpYXRlV2l0aE1lbWJlcnMpIHsKKwkJCQlHcm91cERlZmluaXRpb24gZ3JvdXAgPSBudWxsOworCQkJCU9wdGlvbmFsPEdyb3VwRGVmaW5pdGlvbj4gb3BHciA9IGdyb3Vwcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFVuaXF1ZUlkKCkuZXF1YWxzKHVwZGF0ZWRHcm91cERlZi5nZXRVbmlxdWVJZCgpKSkuZmluZEFueSgpOworCQkJCWlmIChvcEdyLmlzUHJlc2VudCgpKSB7CisJCQkJCWdyb3VwID0gb3BHci5nZXQoKTsKKwkJCQkJZ3JvdXBUb1VwZGF0ZS5hZGQoZ3JvdXApOworCQkJCX0KKwkJCQlpZiAoZ3JvdXAgIT0gbnVsbCkgeworCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCQkJU2V0PFN0cmluZz4gYXJ0aWZhY3RzR3JvdXAgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCQkJCWFydGlmYWN0c0dyb3VwLmFkZEFsbChncm91cC5nZXRBcnRpZmFjdHMoKSk7CisJCQkJCWFzc29jaWF0ZU1lbWJlcnNUVG9BcnRpZmFjdHMoY3JlYXRlZE5ld0FydGlmYWN0cywgY3JlYXRlZERlcGx5bWVudEFydGlmYWN0c0FmdGVyRGVsZXRlLCBoZWF0R3JvdXBzLCBhcnRpZmFjdHNHcm91cCwgbWVtYmVycyk7CisJCQkJCWlmICghbWVtYmVycy5pc0VtcHR5KCkpIHsKKwkJCQkJCWdyb3VwLnNldE1lbWJlcnMobWVtYmVycyk7CisKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQkJaWYgKCFncm91cFRvVXBkYXRlLmlzRW1wdHkoKSkgeworCQkJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhc3NvdGlhdGVHcm91cEVpdGhlciA9IGdyb3VwQnVzaW5lc3NMb2dpYy5hc3NvY2lhdGVNZW1iZXJzVG9Hcm91cChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1c2VyLmdldFVzZXJJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZ3JvdXBUb1VwZGF0ZSwgZmFsc2UsIHRydWUpOworCQkJCWlmIChhc3NvdGlhdGVHcm91cEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGFydGlmYWN0cyB0byBncm91cHMuIFN0YXR1cyBpcyB7fSAiLCBhc3NvdGlhdGVHcm91cEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFzc290aWF0ZUdyb3VwRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCS8vLy8vLy8vLy8vLy8vLy8gY3JlYXRlIG5ldyBhcnRpZmFjdHMgaW4gdXBkYXRlCisJCS8vLy8vLy8vLy8vLy8vLy8gZmxvdy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gbmV3QXJ0aWZhY3RzR3JvdXAgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPigpOworCisJCWZvciAoRW50cnk8QXJ0aWZhY3RUZW1wbGF0ZUluZm8sIFNldDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4+IHBhcnNlZEdyb3VwU2V0RW50cnkgOiBwYXJzZWRHcm91cC5lbnRyeVNldCgpKSB7CisJCQlBcnRpZmFjdFRlbXBsYXRlSW5mbyBwYXJzZWRBcnRpZmFjdE1hc3RlciA9IHBhcnNlZEdyb3VwU2V0RW50cnkuZ2V0S2V5KCk7CisJCQlib29sZWFuIGlzTmV3R3JvdXAgPSB0cnVlOworCQkJZm9yIChFbnRyeTxHcm91cERlZmluaXRpb24sIE1hcDxBcnRpZmFjdERlZmluaXRpb24sIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPj4+IGdyb3VwTGlzdEVudHJ5IDogZ3JvdXBBcnRpZmFjdC5lbnRyeVNldCgpKSB7CisJCQkJTWFwPEFydGlmYWN0RGVmaW5pdGlvbiwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+PiBncm91cEFydGlmYWN0cyA9IGdyb3VwTGlzdEVudHJ5LmdldFZhbHVlKCk7CisJCQkJU2V0PEFydGlmYWN0RGVmaW5pdGlvbj4gZ3JvdXAgPSBncm91cEFydGlmYWN0cy5rZXlTZXQoKTsKKwkJCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8gOiBncm91cCkgeworCQkJCQlpZiAocGFyc2VkQXJ0aWZhY3RNYXN0ZXIuZ2V0RmlsZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdE5hbWUoKSkpIHsKKwkJCQkJCXBhcnNlZEFydGlmYWN0TWFzdGVyLnNldEdyb3VwTmFtZShncm91cExpc3RFbnRyeS5nZXRLZXkoKS5nZXROYW1lKCkpOworCQkJCQkJaXNOZXdHcm91cCA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGlzTmV3R3JvdXApCisJCQkJbmV3QXJ0aWZhY3RzR3JvdXAuYWRkKHBhcnNlZEFydGlmYWN0TWFzdGVyKTsKKworCQl9CisJCWlmICghbmV3QXJ0aWZhY3RzR3JvdXAuaXNFbXB0eSgpKSB7CisJCQlDb2xsZWN0aW9ucy5zb3J0KG5ld0FydGlmYWN0c0dyb3VwLCAoYXJ0MSwgYXJ0MikgLT4gQXJ0aWZhY3RUZW1wbGF0ZUluZm8uY29tcGFyZUJ5R3JvdXBOYW1lKGFydDEsIGFydDIpKTsKKwkJCWludCBzdGFydEdyb3VwQ291bnRlciA9IGdyb3VwQnVzaW5lc3NMb2dpYy5nZXROZXh0VmZNb2R1bGVOYW1lQ291bnRlcihncm91cHMpOworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUdyb3VwTmFtZXNSZXMgPSBncm91cEJ1c2luZXNzTG9naWMudmFsaWRhdGVHZW5lcmF0ZVZmTW9kdWxlR3JvdXBOYW1lcyhuZXdBcnRpZmFjdHNHcm91cCwgcmVzb3VyY2UuZ2V0U3lzdGVtTmFtZSgpLCBzdGFydEdyb3VwQ291bnRlcik7CisJCQlpZiAodmFsaWRhdGVHcm91cE5hbWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVHcm91cE5hbWVzUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiByZXNTdGF0dXMgPSBjcmVhdGVHcm91cERlcGxveW1lbnRBcnRpZmFjdHNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgcmVzb3VyY2UsIHVzZXIsIG5ld0FydGlmYWN0c0dyb3VwLCBjcmVhdGVkTmV3QXJ0aWZhY3RzLCBjcmVhdGVkRGVwbHltZW50QXJ0aWZhY3RzQWZ0ZXJEZWxldGUsIGxhYmVsQ291bnRlciwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAocmVzU3RhdHVzLmlzUmlnaHQoKSkKKwkJCQlyZXR1cm4gcmVzU3RhdHVzOworCQl9CisKKwkJLy8gdXBkYXRlZEdyb3VwCisJCWlmICghZ3JvdXBGb3JBc3NvY2lhdGVXaXRoTWVtYmVycy5pc0VtcHR5KCkpIHsKKworCQkJTGlzdDxTdHJpbmc+IGdyb3Vwc0lkID0gZ3JvdXBGb3JBc3NvY2lhdGVXaXRoTWVtYmVycy5zdHJlYW0oKS5tYXAoZSAtPiBlLmdldFVuaXF1ZUlkKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVZlcnNpb25FaXRoZXIgPSBncm91cEJ1c2luZXNzTG9naWMudXBkYXRlR3JvdXBWZXJzaW9uKGdyb3Vwc0lkLCB0cnVlKTsKKwkJCWlmICh1cGRhdGVWZXJzaW9uRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBncm91cHMgdmVyc2lvbi4gU3RhdHVzIGlzIHt9ICIsIHVwZGF0ZVZlcnNpb25FaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHVwZGF0ZVZlcnNpb25FaXRoZXIucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2UpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCisJCQl9CisJCX0KKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckdlclJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChlaXRoZXJHZXJSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZWl0aGVyR2VyUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2UpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChlaXRoZXJHZXJSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVBcnRpZmFjdHNJblVwZGF0ZUNzYXJGbG93KFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBTZXQ8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHNUb0RlbGV0ZSwKKwkJCU1hcDxTdHJpbmcsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPj4gZ3JvdXBUb0RlbGV0ZSkgeworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gZGVsZXRlZEFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCisJCWlmICghYXJ0aWZhY3RzVG9EZWxldGUuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA6IGFydGlmYWN0c1RvRGVsZXRlKSB7CisKKwkJCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZURlbGV0ZSA9IGFydGlmYWN0c0J1c2luZXNzTG9naWMuaGFuZGxlRGVsZXRlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0LmdldFVuaXF1ZUlkKCksIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9ERUxFVEUsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLAorCQkJCQkJcmVzb3VyY2UsIG51bGwsIG51bGwsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCQkJCWlmIChoYW5kbGVEZWxldGUuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoaGFuZGxlRGVsZXRlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJCWRlbGV0ZWRBcnRpZmFjdHMuYWRkKGhhbmRsZURlbGV0ZS5sZWZ0KCkudmFsdWUoKS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCX0KKwkJfQorCQlpZiAoIWdyb3VwVG9EZWxldGUuaXNFbXB0eSgpKSB7CisJCQlsb2cuZGVidWcoInRyeSB0byBkZWxldGUgZ3JvdXAiKTsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+IGRlbGV0ZUdyb3VwIDogZ3JvdXBUb0RlbGV0ZS5lbnRyeVNldCgpKSB7CisJCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlR3JvdXBFaXRoZXIgPSBncm91cE9wZXJhdGlvbi5kZWxldGVHcm91cChkZWxldGVHcm91cC5nZXRLZXkoKSwgaW5UcmFuc2FjdGlvbik7CisJCQkJaWYgKGRlbGV0ZUdyb3VwRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgPSBkZWxldGVHcm91cEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RvcmFnZU9wZXJhdGlvblN0YXR1cyk7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBncm91cCB7fSB1bmRlciBjb21wb25lbnQge30sIGVycm9yOiB7fSIsIGRlbGV0ZUdyb3VwLmdldEtleSgpLCByZXNvdXJjZS5nZXROb3JtYWxpemVkTmFtZSgpLCBhY3Rpb25TdGF0dXMubmFtZSgpKTsKKworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpKTsKKworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZGVsZXRlZEFydGlmYWN0cyk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBhc3NvY2lhdGVBbmREaXNzb2NpYXRlQXJ0aWZhY3RzVG9Hcm91cChTdHJpbmcgY3NhclVVSUQsIE1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWROZXdBcnRpZmFjdHMsIGludCBsYWJlbENvdW50ZXIsIGJvb2xlYW4gc2hvdWxkTG9jaywKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWREZXBseW1lbnRBcnRpZmFjdHNBZnRlckRlbGV0ZSwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBkaXNzb2NBcnRpZmFjdEZyb21Hcm91cCwgTWFwPEdyb3VwRGVmaW5pdGlvbiwgTWVyZ2VkQXJ0aWZhY3RJbmZvPiBtZXJnZWRncm91cCwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGRlbGV0ZWRBcnRpZmFjdHMpIHsKKwkJTWFwPEdyb3VwRGVmaW5pdGlvbiwgTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4+IGFydGlmYWN0c1RvQXNzb3RpYXRlID0gbmV3IEhhc2hNYXA8R3JvdXBEZWZpbml0aW9uLCBMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPj4oKTsKKwkJTWFwPEdyb3VwRGVmaW5pdGlvbiwgTGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGVmaW5pdGlvbiwgQXJ0aWZhY3RUZW1wbGF0ZUluZm8+Pj4gYXJ0aWZhY3RzVG9VcGRhdGVNYXAgPSBuZXcgSGFzaE1hcDxHcm91cERlZmluaXRpb24sIExpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPj4+KCk7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc0VpdGhlciA9IEVpdGhlci5sZWZ0KHJlc291cmNlKTsKKwkJZm9yIChFbnRyeTxHcm91cERlZmluaXRpb24sIE1lcmdlZEFydGlmYWN0SW5mbz4gZW50cnkgOiBtZXJnZWRncm91cC5lbnRyeVNldCgpKSB7CisJCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gZGlzc0FydGlmYWN0c0luR3JvdXAgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldExpc3RUb0Rpc3NvdGlhdGVBcnRpZmFjdEZyb21Hcm91cChkZWxldGVkQXJ0aWZhY3RzKTsKKwkJCWlmIChkaXNzQXJ0aWZhY3RzSW5Hcm91cCAhPSBudWxsICYmICFkaXNzQXJ0aWZhY3RzSW5Hcm91cC5pc0VtcHR5KCkpIHsKKwkJCQlMaXN0PFN0cmluZz4gZGlzc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnQgOiBkaXNzQXJ0aWZhY3RzSW5Hcm91cCkgeworCQkJCQlkaXNzTGlzdC5hZGQoYXJ0LmdldFVuaXF1ZUlkKCkpOworCQkJCX0KKwkJCQlkaXNzb2NBcnRpZmFjdEZyb21Hcm91cC5wdXQoZW50cnkuZ2V0S2V5KCkuZ2V0VW5pcXVlSWQoKSwgZGlzc0xpc3QpOworCQkJfQorCisJCQlMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBuZXdBcnRpZmFjdHNJbkdyb3VwID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRMaXN0VG9Bc3NvY2lhdGVBcnRpZmFjdFRvR3JvdXAoKTsKKwkJCWlmIChuZXdBcnRpZmFjdHNJbkdyb3VwICE9IG51bGwgJiYgIW5ld0FydGlmYWN0c0luR3JvdXAuaXNFbXB0eSgpKQorCQkJCWFydGlmYWN0c1RvQXNzb3RpYXRlLnB1dChlbnRyeS5nZXRLZXkoKSwgbmV3QXJ0aWZhY3RzSW5Hcm91cCk7CisKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPj4gYXJ0aWZhY3RzVG9VcGRhdGUgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldExpc3RUb1VwZGF0ZUFydGlmYWN0SW5Hcm91cCgpOworCQkJaWYgKGFydGlmYWN0c1RvVXBkYXRlICE9IG51bGwgJiYgIWFydGlmYWN0c1RvVXBkYXRlLmlzRW1wdHkoKSkKKwkJCQlhcnRpZmFjdHNUb1VwZGF0ZU1hcC5wdXQoZW50cnkuZ2V0S2V5KCksIGFydGlmYWN0c1RvVXBkYXRlKTsKKwkJfQorCisJCS8vIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBkaXNzb2NBcnRpZmFjdEZyb21Hcm91cCA9IG5ldworCQkvLyBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+KCk7CisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBkaXNzb3RpYXRlQXJ0aWZhY3RzZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxHcm91cERlZmluaXRpb24+KCk7CisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGRpc3NvdGlhdGVFbnRyeSA6IGRpc3NvY0FydGlmYWN0RnJvbUdyb3VwLmVudHJ5U2V0KCkpIHsKKworCQkJR3JvdXBEZWZpbml0aW9uIGRpc3NvdGlhdGVHcm91cCA9IG5ldyBHcm91cERlZmluaXRpb24oKTsKKwkJCWRpc3NvdGlhdGVHcm91cC5zZXRVbmlxdWVJZChkaXNzb3RpYXRlRW50cnkuZ2V0S2V5KCkpOworCQkJZGlzc290aWF0ZUdyb3VwLnNldEFydGlmYWN0cyhkaXNzb3RpYXRlRW50cnkuZ2V0VmFsdWUoKSk7CisJCQlkaXNzb3RpYXRlQXJ0aWZhY3RzZ3JvdXBzLmFkZChkaXNzb3RpYXRlR3JvdXApOworCQl9CisJCWlmICghZGlzc290aWF0ZUFydGlmYWN0c2dyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCWxvZy5kZWJ1ZygidHJ5IHRvIGRpc3NvY2lhdGUgYXJ0aWZhY3RzICBmcm9tIGdyb3VwcyAiKTsKKwkJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBkaXNzb3RpYXRlR3JvdXBFaXRoZXIgPSBncm91cEJ1c2luZXNzTG9naWMuZGlzc29jaWF0ZUFydGlmYWN0c0Zyb21Hcm91cChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1c2VyLmdldFVzZXJJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZGlzc290aWF0ZUFydGlmYWN0c2dyb3Vwcywgc2hvdWxkTG9jaywKKwkJCQkJaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoZGlzc290aWF0ZUdyb3VwRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRpc3NvY2lhdGUgYXJ0aWZhY3RzIGZyb20gZ3JvdXBzLiBTdGF0dXMgaXMge30gIiwgZGlzc290aWF0ZUdyb3VwRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzRWl0aGVyID0gRWl0aGVyLnJpZ2h0KGRpc3NvdGlhdGVHcm91cEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNFaXRoZXI7CisKKwkJCX0KKwkJfQorCisJCWlmICghYXJ0aWZhY3RzVG9VcGRhdGVNYXAuaXNFbXB0eSgpKSB7CisJCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gdXBkYXRlZEFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCQkJZm9yIChFbnRyeTxHcm91cERlZmluaXRpb24sIExpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPj4+IGFydGlmYWN0c1RvVXBkYXRlRW50cnkgOiBhcnRpZmFjdHNUb1VwZGF0ZU1hcC5lbnRyeVNldCgpKSB7CisJCQkJTGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGVmaW5pdGlvbiwgQXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBhcnRpZmFjdHNUb1VwZGF0ZUxpc3QgPSBhcnRpZmFjdHNUb1VwZGF0ZUVudHJ5LmdldFZhbHVlKCk7CisJCQkJZm9yIChJbW11dGFibGVQYWlyPEFydGlmYWN0RGVmaW5pdGlvbiwgQXJ0aWZhY3RUZW1wbGF0ZUluZm8+IGFydGlmYWN0IDogYXJ0aWZhY3RzVG9VcGRhdGVMaXN0KSB7CisJCQkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVBcnRpZmFjdEVpdGhlciA9IHVwZGF0ZURlcGxveW1lbnRBcnRpZmFjdHNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgcmVzb3VyY2UsIHVzZXIsIGFydGlmYWN0LmdldEtleSgpLCBhcnRpZmFjdC5nZXRWYWx1ZSgpLCB1cGRhdGVkQXJ0aWZhY3RzLAorCQkJCQkJCWFydGlmYWN0LmdldFJpZ2h0KCkuZ2V0UmVsYXRlZEFydGlmYWN0c0luZm8oKSwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQkJCWlmICh1cGRhdGVBcnRpZmFjdEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSBhcnRpZmFjdHMuIHN0YXR1cyBpcyB7fSIsIHVwZGF0ZUFydGlmYWN0RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQlyZXNFaXRoZXIgPSBFaXRoZXIucmlnaHQodXBkYXRlQXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCXJldHVybiByZXNFaXRoZXI7CisKKwkJCQkJfQorCisJCQkJfQorCQkJfQorCisJCX0KKworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gYXNzb2NpYXRlQXJ0aWZhY3RHcm91cCA9IG5ldyBBcnJheUxpc3Q8R3JvdXBEZWZpbml0aW9uPigpOworCisJCWZvciAoRW50cnk8R3JvdXBEZWZpbml0aW9uLCBMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPj4gYXNzb2NpYXRlRW50cnkgOiBhcnRpZmFjdHNUb0Fzc290aWF0ZS5lbnRyeVNldCgpKSB7CisJCQlMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBhc3NvY2lhdGVkQXJ0aWZhY3QgPSBhc3NvY2lhdGVFbnRyeS5nZXRWYWx1ZSgpOworCQkJU2V0PFN0cmluZz4gYXJpZmFjdHNVaWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQkJZm9yIChBcnRpZmFjdFRlbXBsYXRlSW5mbyBhcnRpZmFjdFRlbXBsYXRlIDogYXNzb2NpYXRlZEFydGlmYWN0KSB7IC8vIHRyeQorCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bworCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmaW5kCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFydGlmYWN0CisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlc291cmNlCisJCQkJYm9vbGVhbiBpc0NyZWF0ZSA9IHRydWU7CisJCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gY3JlYXRlZEFydGlmYWN0IDogY3JlYXRlZERlcGx5bWVudEFydGlmYWN0c0FmdGVyRGVsZXRlKSB7CisJCQkJCWlmIChhcnRpZmFjdFRlbXBsYXRlLmdldEZpbGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShjcmVhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpKSB7CisJCQkJCQlhcmlmYWN0c1VpZHMuYWRkKGNyZWF0ZWRBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCWlzQ3JlYXRlID0gZmFsc2U7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJfQorCQkJCWlmIChpc0NyZWF0ZSkgeyAvLyBjaGVjayBpZiBhbHJlYWR5IGNyZWF0ZWQKKwkJCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gY3JlYXRlZE5ld0FydGlmYWN0IDogY3JlYXRlZE5ld0FydGlmYWN0cykgeworCQkJCQkJaWYgKGFydGlmYWN0VGVtcGxhdGUuZ2V0RmlsZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGNyZWF0ZWROZXdBcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKSkpIHsKKwkJCQkJCQlhcmlmYWN0c1VpZHMuYWRkKGNyZWF0ZWROZXdBcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCQlpc0NyZWF0ZSA9IGZhbHNlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKGlzQ3JlYXRlKSB7CisJCQkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVBcnRpZmFjdEVpdGhlciA9IGNyZWF0ZURlcGxveW1lbnRBcnRpZmFjdChjc2FyVVVJRCwgY3NhciwgcmVzb3VyY2UsIHVzZXIsIGFydGlmYWN0VGVtcGxhdGUsIGNyZWF0ZWROZXdBcnRpZmFjdHMsIGxhYmVsQ291bnRlciwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQkJCWlmIChjcmVhdGVBcnRpZmFjdEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQkJCXJlc0VpdGhlciA9IEVpdGhlci5yaWdodChjcmVhdGVBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJcmV0dXJuIHJlc0VpdGhlcjsKKwkJCQkJfQorCQkJCQlhcmlmYWN0c1VpZHMuYWRkKGNyZWF0ZUFydGlmYWN0RWl0aGVyLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCQkJCX0KKworCQkJfQorCQkJaWYgKGFyaWZhY3RzVWlkcy5zaXplKCkgPiAwKSB7CisJCQkJTGlzdDxTdHJpbmc+IGFydGlmYWN0c1RvQXNzb2NpYXRlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJYXJ0aWZhY3RzVG9Bc3NvY2lhdGUuYWRkQWxsKGFyaWZhY3RzVWlkcyk7CisJCQkJR3JvdXBEZWZpbml0aW9uIGFzc290aWF0ZUdyb3VwID0gbmV3IEdyb3VwRGVmaW5pdGlvbigpOworCQkJCWFzc290aWF0ZUdyb3VwLnNldFVuaXF1ZUlkKGFzc29jaWF0ZUVudHJ5LmdldEtleSgpLmdldFVuaXF1ZUlkKCkpOworCQkJCWFzc290aWF0ZUdyb3VwLnNldEFydGlmYWN0cyhhcnRpZmFjdHNUb0Fzc29jaWF0ZSk7CisJCQkJYXNzb2NpYXRlQXJ0aWZhY3RHcm91cC5hZGQoYXNzb3RpYXRlR3JvdXApOworCisJCQl9CisJCX0KKworCQlpZiAoIWFzc29jaWF0ZUFydGlmYWN0R3JvdXAuaXNFbXB0eSgpKSB7CisKKwkJCWxvZy5kZWJ1ZygiVHJ5IHRvIGFzc29jaWF0ZSBhcnRpZmFjdHMgdG8gZ3JvdXBzLiIpOworCisJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gYXNzb3RpYXRlR3JvdXBFaXRoZXIgPSBncm91cEJ1c2luZXNzTG9naWMuYXNzb2NpYXRlQXJ0aWZhY3RzVG9Hcm91cChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1c2VyLmdldFVzZXJJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgYXNzb2NpYXRlQXJ0aWZhY3RHcm91cCwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoYXNzb3RpYXRlR3JvdXBFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGFydGlmYWN0cyB0byBncm91cHMuIFN0YXR1cyBpcyB7fSAiLCBhc3NvdGlhdGVHcm91cEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc0VpdGhlciA9IEVpdGhlci5yaWdodChhc3NvdGlhdGVHcm91cEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNFaXRoZXI7CisKKwkJCX0KKwkJfQorCisJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IHBhcmFtZXRlcnNWaWV3ID0gbmV3IENvbXBvbmVudFBhcmFtZXRlcnNWaWV3KCk7CisJCXBhcmFtZXRlcnNWaWV3LmRpc2FibGVBbGwoKTsKKwkJcGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQ29tcG9uZW50SW5zdGFuY2VzKGZhbHNlKTsKKwkJcGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlVXNlcnMoZmFsc2UpOworCQlwYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVBcnRpZmFjdHMoZmFsc2UpOworCQlwYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVHcm91cHMoZmFsc2UpOworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckdlclJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0Q29tcG9uZW50KHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHBhcmFtZXRlcnNWaWV3LCBpblRyYW5zYWN0aW9uKTsKKworCQlpZiAoZWl0aGVyR2VyUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGVpdGhlckdlclJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlKTsKKworCQkJcmVzRWl0aGVyID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJldHVybiByZXNFaXRoZXI7CisKKwkJfQorCQlyZXNFaXRoZXIgPSBFaXRoZXIubGVmdChlaXRoZXJHZXJSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisJCXJldHVybiByZXNFaXRoZXI7CisJfQorCisJcHJpdmF0ZSBNYXA8R3JvdXBEZWZpbml0aW9uLCBNZXJnZWRBcnRpZmFjdEluZm8+IG1lcmdlR3JvdXBJblVwZGF0ZUZsb3coTWFwPEdyb3VwRGVmaW5pdGlvbiwgTWFwPEFydGlmYWN0RGVmaW5pdGlvbiwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+Pj4gZ3JvdXBBcnRpZmFjdCwgTWFwPEFydGlmYWN0VGVtcGxhdGVJbmZvLCBTZXQ8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBwYXJzZWRHcm91cCwKKwkJCVNldDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c1RvRGVsZXRlLCBNYXA8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+IGdyb3VwVG9EZWxldGUsIFNldDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4ganNvbk1hc3RlckFydGlmYWN0cykgeworCQlNYXA8R3JvdXBEZWZpbml0aW9uLCBNZXJnZWRBcnRpZmFjdEluZm8+IG1lcmdlZGdyb3VwID0gbmV3IEhhc2hNYXA8R3JvdXBEZWZpbml0aW9uLCBNZXJnZWRBcnRpZmFjdEluZm8+KCk7CisJCWZvciAoRW50cnk8R3JvdXBEZWZpbml0aW9uLCBNYXA8QXJ0aWZhY3REZWZpbml0aW9uLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+PiBncm91cExpc3RFbnRyeSA6IGdyb3VwQXJ0aWZhY3QuZW50cnlTZXQoKSkgeworCQkJTWFwPEFydGlmYWN0RGVmaW5pdGlvbiwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+PiBjcmVhdGVkQXJ0aWZhY3RNYXAgPSBncm91cExpc3RFbnRyeS5nZXRWYWx1ZSgpOworCQkJYm9vbGVhbiBpc05lZWRUb0RlbGV0ZUdyb3VwID0gdHJ1ZTsKKwkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBsaXN0VG9EZWxldGUgPSBudWxsOworCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gbWFzZXJBcnRpZmFjdCA6IGNyZWF0ZWRBcnRpZmFjdE1hcC5rZXlTZXQoKSkgeworCQkJCWxpc3RUb0RlbGV0ZSA9IGNyZWF0ZWRBcnRpZmFjdE1hcC5nZXQobWFzZXJBcnRpZmFjdCk7CisJCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0VG9EZWxldGUgOiBsaXN0VG9EZWxldGUpIHsKKwkJCQkJZmluZEFydGlmYWN0VG9EZWxldGUocGFyc2VkR3JvdXAsIGFydGlmYWN0c1RvRGVsZXRlLCBncm91cExpc3RFbnRyeS5nZXRLZXkoKS5nZXRVbmlxdWVJZCgpLCBhcnRUb0RlbGV0ZSk7CisJCQkJfQorCQkJCWZvciAoQXJ0aWZhY3RUZW1wbGF0ZUluZm8ganNvbk1hc3RlckFydGlmYWN0IDoganNvbk1hc3RlckFydGlmYWN0cykgeworCQkJCQlpZiAobWFzZXJBcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGpzb25NYXN0ZXJBcnRpZmFjdC5nZXRGaWxlTmFtZSgpKSkgeworCQkJCQkJTWVyZ2VkQXJ0aWZhY3RJbmZvIG1lcmdlZEdyb3VwID0gbmV3IE1lcmdlZEFydGlmYWN0SW5mbygpOworCQkJCQkJbWVyZ2VkR3JvdXAuc2V0SnNvbkFydGlmYWN0VGVtcGxhdGUoanNvbk1hc3RlckFydGlmYWN0KTsKKwkJCQkJCW1lcmdlZEdyb3VwLnNldENyZWF0ZWRBcnRpZmFjdChjcmVhdGVkQXJ0aWZhY3RNYXAuZ2V0KG1hc2VyQXJ0aWZhY3QpKTsKKwkJCQkJCW1lcmdlZGdyb3VwLnB1dChncm91cExpc3RFbnRyeS5nZXRLZXkoKSwgbWVyZ2VkR3JvdXApOworCQkJCQkJaXNOZWVkVG9EZWxldGVHcm91cCA9IGZhbHNlOworCisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKwkJCWlmIChpc05lZWRUb0RlbGV0ZUdyb3VwKSB7CisJCQkJZ3JvdXBUb0RlbGV0ZS5wdXQoZ3JvdXBMaXN0RW50cnkuZ2V0S2V5KCkuZ2V0VW5pcXVlSWQoKSwgbGlzdFRvRGVsZXRlKTsKKwkJCX0KKworCQl9CisJCXJldHVybiBtZXJnZWRncm91cDsKKwl9CisKKwlwcml2YXRlIFNldDxTdHJpbmc+IGZpbmRBcnRpZmFjdHNOb3RJbkdyb3VwVG9EZWxldGUoTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcywgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWREZXBseW1lbnRBcnRpZmFjdHNBZnRlckRlbGV0ZSkgeworCQlTZXQ8U3RyaW5nPiBhcnRpZmFjdE5vdEluR3JvdXBTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0IDogY3JlYXRlZERlcGx5bWVudEFydGlmYWN0c0FmdGVyRGVsZXRlKSB7CisJCQlib29sZWFuIG5lZWRUb0RlbGV0ZSA9IHRydWU7CisJCQlpZiAoYXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuVkVORE9SX0xJQ0VOU0VfTU9ERUwpIHx8IGFydGlmYWN0LmdldEFydGlmYWN0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLlZGX0xJQ0VOU0VfTU9ERUwpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGdyb3VwcyAhPSBudWxsKSB7CisJCQkJZm9yIChHcm91cERlZmluaXRpb24gZ3JvdXAgOiBncm91cHMpIHsKKwkJCQkJTGlzdDxTdHJpbmc+IGdyb3VwQXJ0aWZhY3RJZHMgPSBncm91cC5nZXRBcnRpZmFjdHMoKTsKKwkJCQkJaWYgKGdyb3VwQXJ0aWZhY3RJZHMgPT0gbnVsbCB8fCBncm91cEFydGlmYWN0SWRzLmlzRW1wdHkoKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJZm9yIChTdHJpbmcgZ3JvdXBBcnRpZmFjdGlkIDogZ3JvdXBBcnRpZmFjdElkcykgeworCQkJCQkJaWYgKGdyb3VwQXJ0aWZhY3RpZC5lcXVhbHNJZ25vcmVDYXNlKGFydGlmYWN0LmdldFVuaXF1ZUlkKCkpKQorCQkJCQkJCW5lZWRUb0RlbGV0ZSA9IGZhbHNlOworCisJCQkJCX0KKworCQkJCX0KKwkJCX0KKwkJCWlmIChuZWVkVG9EZWxldGUpCisJCQkJYXJ0aWZhY3ROb3RJbkdyb3VwU2V0LmFkZChhcnRpZmFjdC5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlyZXR1cm4gYXJ0aWZhY3ROb3RJbkdyb3VwU2V0OworCX0KKworCXByaXZhdGUgdm9pZCBmaW5kQXJ0aWZhY3RUb0RlbGV0ZShNYXA8QXJ0aWZhY3RUZW1wbGF0ZUluZm8sIFNldDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4+IHBhcnNlZEdyb3VwLCBTZXQ8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHNUb0RlbGV0ZSwgU3RyaW5nIGRlbGV0ZUdyb3VwSWQsIEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCkgeworCQlib29sZWFuIGlzTmVlZFRvRGVsZXRlQXJ0aWZhY3QgPSB0cnVlOworCQlmb3IgKEVudHJ5PEFydGlmYWN0VGVtcGxhdGVJbmZvLCBTZXQ8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBwYXJzZWRHcm91cFNldEVudHJ5IDogcGFyc2VkR3JvdXAuZW50cnlTZXQoKSkgeworCQkJU2V0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBhcnRpZmFjdHNOYW1lcyA9IHBhcnNlZEdyb3VwU2V0RW50cnkuZ2V0VmFsdWUoKTsKKwkJCWZvciAoQXJ0aWZhY3RUZW1wbGF0ZUluZm8gdGVtcGxhdGUgOiBhcnRpZmFjdHNOYW1lcykgeworCQkJCWlmIChhcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRlbXBsYXRlLmdldEZpbGVOYW1lKCkpICYmIGFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UodGVtcGxhdGUuZ2V0VHlwZSgpKSkgeworCQkJCQlpc05lZWRUb0RlbGV0ZUFydGlmYWN0ID0gZmFsc2U7CisKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGlzTmVlZFRvRGVsZXRlQXJ0aWZhY3QpIHsKKworCQkJYXJ0aWZhY3RzVG9EZWxldGUuYWRkKGFydGlmYWN0KTsKKworCQl9CisJfQorCisJcHJpdmF0ZSBNYXA8R3JvdXBEZWZpbml0aW9uLCBNYXA8QXJ0aWZhY3REZWZpbml0aW9uLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+PiBmaW5kTWFzdGVyQXJ0aWZhY3RJbkdyb3VwKExpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHMsIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbHltZW50QXJ0aWZhY3QpIHsKKwkJTWFwPEdyb3VwRGVmaW5pdGlvbiwgTWFwPEFydGlmYWN0RGVmaW5pdGlvbiwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+Pj4gZ3JvdXBBcnRpZmFjdCA9IG5ldyBIYXNoTWFwPEdyb3VwRGVmaW5pdGlvbiwgTWFwPEFydGlmYWN0RGVmaW5pdGlvbiwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+Pj4oKTsKKworCQlmb3IgKEdyb3VwRGVmaW5pdGlvbiBncm91cCA6IGdyb3VwcykgeworCQkJTWFwPEFydGlmYWN0RGVmaW5pdGlvbiwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+PiBndXBzTWFwID0gbmV3IEhhc2hNYXA8QXJ0aWZhY3REZWZpbml0aW9uLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4+KCk7CisJCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdERlZmluaXRpb24+KCk7CisJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzTGlzdCA9IGdyb3VwLmdldEFydGlmYWN0cygpOworCQkJaWYgKGFydGlmYWN0c0xpc3QgIT0gbnVsbCAmJiAhYXJ0aWZhY3RzTGlzdC5pc0VtcHR5KCkpIHsKKworCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBtYXN0ZXJBcnRpZmFjdCA9IEFydGlmYWN0VXRpbHMuZmluZE1hc3RlckFydGlmYWN0KGRlcGx5bWVudEFydGlmYWN0LCBhcnRpZmFjdHMsIGFydGlmYWN0c0xpc3QpOworCQkJCWlmIChtYXN0ZXJBcnRpZmFjdCAhPSBudWxsKQorCQkJCQlndXBzTWFwLnB1dChtYXN0ZXJBcnRpZmFjdCwgYXJ0aWZhY3RzKTsKKwkJCQlncm91cEFydGlmYWN0LnB1dChncm91cCwgZ3Vwc01hcCk7CisKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JvdXBBcnRpZmFjdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQXJ0aWZhY3RzR3JvdXBTZXQoTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcGFyc2VkR3JvdXBUZW1wbGF0ZUxpc3QsIFNldDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcGFyc2VkQXJ0aWZhY3RzTmFtZSkgeworCisJCWZvciAoQXJ0aWZhY3RUZW1wbGF0ZUluZm8gcGFyc2VkR3JvdXBUZW1wbGF0ZSA6IHBhcnNlZEdyb3VwVGVtcGxhdGVMaXN0KSB7CisJCQlwYXJzZWRBcnRpZmFjdHNOYW1lLmFkZChwYXJzZWRHcm91cFRlbXBsYXRlKTsKKwkJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRBcnRpZmFjdHMgPSBwYXJzZWRHcm91cFRlbXBsYXRlLmdldFJlbGF0ZWRBcnRpZmFjdHNJbmZvKCk7CisJCQlpZiAocmVsYXRlZEFydGlmYWN0cyAhPSBudWxsICYmICFyZWxhdGVkQXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJCWNyZWF0ZUFydGlmYWN0c0dyb3VwU2V0KHJlbGF0ZWRBcnRpZmFjdHMsIHBhcnNlZEFydGlmYWN0c05hbWUpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlQXJ0aWZhY3RzRnJvbUNzYXIoU3RyaW5nIGNzYXJVVUlELCBNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIFN0cmluZyBhcnRpZmFjdHNNZXRhRmlsZSwgU3RyaW5nIGFydGlmYWN0c01ldGFGaWxlTmFtZSwgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWRBcnRpZmFjdHMsCisJCQlib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCWxvZy5kZWJ1ZygicGFyc2VSZXNvdXJjZUFydGlmYWN0c0luZm9Gcm9tRmlsZSBzdGFydCIpOworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4+LCBSZXNwb25zZUZvcm1hdD4gcGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlciA9IHBhcnNlUmVzb3VyY2VBcnRpZmFjdHNJbmZvRnJvbUZpbGUocmVzb3VyY2UsIGFydGlmYWN0c01ldGFGaWxlLCBhcnRpZmFjdHNNZXRhRmlsZU5hbWUsIHVzZXIpOworCQlpZiAocGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gcGFyc2VSZXNvdXJjZUluZm9Gcm9tWWFtbEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlsb2cuZGVidWcoInBhcnNlUmVzb3VyY2VBcnRpZmFjdHNJbmZvRnJvbUZpbGUgZW5kIik7CisKKwkJbG9nLmRlYnVnKCJjcmVhdGVSZXNvdXJjZUFydGlmYWN0cyBzdGFydCIpOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiByZXNwU3RhdHVzID0gY3JlYXRlUmVzb3VyY2VBcnRpZmFjdHMoY3NhclVVSUQsIGNzYXIsIHJlc291cmNlLCB1c2VyLCBwYXJzZVJlc291cmNlSW5mb0Zyb21ZYW1sRWl0aGVyLmxlZnQoKS52YWx1ZSgpLCBBdWRpdGluZ0FjdGlvbkVudW0uQ1JFQVRFX1JFU09VUkNFLCBjcmVhdGVkQXJ0aWZhY3RzLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHJlc3BTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gcmVzcFN0YXR1czsKKwkJfQorCQlsb2cuZGVidWcoImNyZWF0ZVJlc291cmNlQXJ0aWZhY3RzIGVuZCIpOworCQlsb2cuZGVidWcoImdldFJlc291cmNlIHN0YXJ0Iik7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyR2VyUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBpblRyYW5zYWN0aW9uKTsKKwkJbG9nLmRlYnVnKCJnZXRSZXNvdXJjZSBlbmQiKTsKKwkJaWYgKGVpdGhlckdlclJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShlaXRoZXJHZXJSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZSk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGVpdGhlckdlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlR3JvdXBEZXBsb3ltZW50QXJ0aWZhY3RzRnJvbUNzYXIoU3RyaW5nIGNzYXJVVUlELCBNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IGFydGlmYWN0c1RlbXBsYXRlTGlzdCwKKwkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBjcmVhdGVkTmV3QXJ0aWZhY3RzLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzRnJvbVJlc291cmNlLCBpbnQgbGFiZWxDb3VudGVyLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiByZXNTdGF0dXMgPSBFaXRoZXIubGVmdChyZXNvdXJjZSk7CisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBjcmVhdGVkR3JvdXBzID0gcmVzb3VyY2UuZ2V0R3JvdXBzKCk7CisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBoZWF0R3JvdXBzID0gbnVsbDsKKwkJaWYgKGNyZWF0ZWRHcm91cHMgIT0gbnVsbCAmJiAhY3JlYXRlZEdyb3Vwcy5pc0VtcHR5KCkpIHsKKworCQkJLy8gTGlzdDxJQXJ0aWZhY3RJbmZvPiBjb2xsZWN0ID0gcmVzb3VyY2VzLnN0cmVhbSgpLmZsYXRNYXAoIGUgLT4KKwkJCS8vIGUuZ2V0QXJ0aWZhY3RzKCkuc3RyZWFtKCkpLmZpbHRlcihwIC0+CisJCQkvLyByZWxldmFudEFydGlmYWN0VHlwZXMuY29udGFpbnMocC5nZXRBcnRpZmFjdFR5cGUoKQorCQkJLy8gKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCS8vIExpc3Q8R3JvdXBEZWZpbml0aW9uPiBoZWF0R3JvdXBzID0gY3JlYXRlZEdyb3Vwcy5zdHJlYW0oKS5maWx0ZXIoCisJCQkvLyBlIC0+IGUuZ2V0UHJvcGVydGllcygpLnN0cmVhbSgpLmZpbHRlcihwIC0+CisJCQkvLyBwLmdldE5hbWUoKS5jb250YWlucyhDb25zdGFudHMuSEVBVF9GSUxFX1BST1BTKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQloZWF0R3JvdXBzID0gY3JlYXRlZEdyb3Vwcy5zdHJlYW0oKS5maWx0ZXIoZSAtPiBlLmdldE1lbWJlcnMoKSAhPSBudWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJOworCQl9CisKKwkJZm9yIChBcnRpZmFjdFRlbXBsYXRlSW5mbyBncm91cFRlbXBsYXRlSW5mbyA6IGFydGlmYWN0c1RlbXBsYXRlTGlzdCkgeworCQkJU3RyaW5nIGdyb3VwTmFtZSA9IGdyb3VwVGVtcGxhdGVJbmZvLmdldEdyb3VwTmFtZSgpOworCQkJU2V0PFN0cmluZz4gYXJ0aWZhY3RzR3JvdXAgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKwkJCXJlc1N0YXR1cyA9IGNyZWF0ZURlcGxveW1lbnRBcnRpZmFjdHNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgcmVzb3VyY2UsIHVzZXIsIGFydGlmYWN0c0dyb3VwLCBncm91cFRlbXBsYXRlSW5mbywgY3JlYXRlZE5ld0FydGlmYWN0cywgYXJ0aWZhY3RzRnJvbVJlc291cmNlLCBsYWJlbENvdW50ZXIsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHJlc1N0YXR1cy5pc1JpZ2h0KCkpCisJCQkJcmV0dXJuIHJlc1N0YXR1czsKKworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBtZW1iZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCQlhc3NvY2lhdGVNZW1iZXJzVFRvQXJ0aWZhY3RzKGNyZWF0ZWROZXdBcnRpZmFjdHMsIGFydGlmYWN0c0Zyb21SZXNvdXJjZSwgaGVhdEdyb3VwcywgYXJ0aWZhY3RzR3JvdXAsIG1lbWJlcnMpOworCisJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhcnRpZmFjdHNHcm91cCk7CisKKwkJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24gPSBuZXcgR3JvdXBEZWZpbml0aW9uKCk7CisJCQlncm91cERlZmluaXRpb24uc2V0TmFtZShncm91cE5hbWUpOworCQkJZ3JvdXBEZWZpbml0aW9uLnNldFR5cGUoQ29uc3RhbnRzLkRFRkFVTFRfR1JPVVBfVkZfTU9EVUxFKTsKKwkJCWdyb3VwRGVmaW5pdGlvbi5zZXRBcnRpZmFjdHMoYXJ0aWZhY3RzTGlzdCk7CisJCQlpZiAoIW1lbWJlcnMuaXNFbXB0eSgpKQorCQkJCWdyb3VwRGVmaW5pdGlvbi5zZXRNZW1iZXJzKG1lbWJlcnMpOworCisJCQlMaXN0PEdyb3VwUHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PEdyb3VwUHJvcGVydHk+KCk7CisJCQlHcm91cFByb3BlcnR5IHByb3AgPSBuZXcgR3JvdXBQcm9wZXJ0eSgpOworCQkJcHJvcC5zZXROYW1lKENvbnN0YW50cy5JU19CQVNFKTsKKwkJCXByb3Auc2V0VmFsdWUoQm9vbGVhbi50b1N0cmluZyhncm91cFRlbXBsYXRlSW5mby5pc0Jhc2UoKSkpOworCisJCQlwcm9wZXJ0aWVzLmFkZChwcm9wKTsKKwkJCWdyb3VwRGVmaW5pdGlvbi5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwID0gZ3JvdXBCdXNpbmVzc0xvZ2ljLmNyZWF0ZUdyb3VwKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHVzZXIuZ2V0VXNlcklkKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBncm91cERlZmluaXRpb24sIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGNyZWF0ZUdyb3VwLmlzUmlnaHQoKSkKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZUdyb3VwLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJfQorCQlyZXR1cm4gcmVzU3RhdHVzOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlRGVwbG95bWVudEFydGlmYWN0c0Zyb21Dc2FyKFN0cmluZyBjc2FyVVVJRCwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBTZXQ8U3RyaW5nPiBhcnRpZmFjdHNHcm91cCwgQXJ0aWZhY3RUZW1wbGF0ZUluZm8gYXJ0aWZhY3RUZW1wbGF0ZUluZm8sCisJCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gY3JlYXRlZEFydGlmYWN0cywgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c0Zyb21SZXNvdXJjZSwgaW50IGxhYmVsQ291bnRlciwgYm9vbGVhbiBzaG91ZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiByZXNTdGF0dXMgPSBFaXRoZXIubGVmdChyZXNvdXJjZSk7CisJCVN0cmluZyBhcnRpZmFjdEZpbGVOYW1lID0gYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0RmlsZU5hbWUoKTsKKwkJU3RyaW5nIGFydGlmYWN0VWlkID0gIiI7CisJCWJvb2xlYW4gYWxyZWFkeUV4aXN0ID0gZmFsc2U7CisKKwkJLy8gY2hlY2sgaWYgYXJ0aWZhY3RzIGFscmVhZHkgZXhpc3QKKwkJaWYgKGFydGlmYWN0c0Zyb21SZXNvdXJjZSAhPSBudWxsICYmICFhcnRpZmFjdHNGcm9tUmVzb3VyY2UuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEZyb21SZXNvdXJjZSA6IGFydGlmYWN0c0Zyb21SZXNvdXJjZSkgeworCQkJCWlmIChhcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRBcnRpZmFjdE5hbWUoKS5lcXVhbHMoYXJ0aWZhY3RGaWxlTmFtZSkpIHsKKwkJCQkJYXJ0aWZhY3RVaWQgPSBhcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQkJCQlpZiAoIWFydGlmYWN0RnJvbVJlc291cmNlLmdldEFydGlmYWN0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpKSkgeworCQkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCB3aXRoIG5hbWUge30gYW5kIHR5cGUge30gYWxyZWFkeSBleGlzdCB3aXRoIHR5cGUgIHt9IiwgYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpLCBhcnRpZmFjdEZyb21SZXNvdXJjZS5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXRyLCBmaWxlTmFtZSAiICsgYXJ0aWZhY3RGaWxlTmFtZSwgIkFydGlmYWN0IGludGVybmFscyBhcmUgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX0FMUkFEWV9FWElTVF9JTl9ESUZGRVJFTlRfVFlQRV9JTl9DU0FSLCBhcnRpZmFjdEZpbGVOYW1lLCBhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRUeXBlKCksIGFydGlmYWN0RnJvbVJlc291cmNlLmdldEFydGlmYWN0VHlwZSgpKSk7CisJCQkJCX0KKwkJCQkJYWxyZWFkeUV4aXN0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CisKKwkJfQorCQlpZiAoIWFscmVhZHlFeGlzdCkgeworCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gY3JlYXRlZEFydGlmYWN0IDogY3JlYXRlZEFydGlmYWN0cykgeworCQkJCWlmIChjcmVhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzKGFydGlmYWN0RmlsZU5hbWUpKSB7CisJCQkJCWFydGlmYWN0VWlkID0gY3JlYXRlZEFydGlmYWN0LmdldFVuaXF1ZUlkKCk7CisJCQkJCWlmICghY3JlYXRlZEFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpKSkgeworCQkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCB3aXRoIG5hbWUge30gYW5kIHR5cGUge30gYWxyZWFkeSBleGlzdCB3aXRoIHR5cGUgIHt9IiwgYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpLCBjcmVhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJBcnRpZmFjdCAgZmlsZSBpcyBub3QgaW4gZXhwZWN0ZWQgZm9ybWF0ciwgZmlsZU5hbWUgIiArIGFydGlmYWN0RmlsZU5hbWUsICJBcnRpZmFjdCBpbnRlcm5hbHMgYXJlIGludmFsaWQiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9BTFJBRFlfRVhJU1RfSU5fRElGRkVSRU5UX1RZUEVfSU5fQ1NBUiwgYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpLCBjcmVhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkpKTsKKwkJCQkJfQorCQkJCQlhbHJlYWR5RXhpc3QgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0KKwkJfQorCQkvLyBpZiBub3QgZXhpc3QgbmVlZCB0byBjcmVhdGUKKwkJaWYgKCFhbHJlYWR5RXhpc3QpIHsKKworCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IG5ld0FydGlmYWN0RWl0aGVyID0gY3JlYXRlRGVwbG95bWVudEFydGlmYWN0KGNzYXJVVUlELCBjc2FyLCByZXNvdXJjZSwgdXNlciwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8sIGNyZWF0ZWRBcnRpZmFjdHMsIGxhYmVsQ291bnRlciwgc2hvdWRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmIChuZXdBcnRpZmFjdEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlyZXNTdGF0dXMgPSBFaXRoZXIucmlnaHQobmV3QXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzU3RhdHVzOworCQkJfQorCQkJYXJ0aWZhY3RVaWQgPSBuZXdBcnRpZmFjdEVpdGhlci5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCisJCX0KKworCQlhcnRpZmFjdHNHcm91cC5hZGQoYXJ0aWZhY3RVaWQpOworCisJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRBcnRpZmFjdHMgPSBhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRSZWxhdGVkQXJ0aWZhY3RzSW5mbygpOworCQlpZiAocmVsYXRlZEFydGlmYWN0cyAhPSBudWxsKSB7CisJCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIHJlbGF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mbyA6IHJlbGF0ZWRBcnRpZmFjdHMpIHsKKwkJCQlyZXNTdGF0dXMgPSBjcmVhdGVEZXBsb3ltZW50QXJ0aWZhY3RzRnJvbUNzYXIoY3NhclVVSUQsIGNzYXIsIHJlc291cmNlLCB1c2VyLCBhcnRpZmFjdHNHcm91cCwgcmVsYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvLCBjcmVhdGVkQXJ0aWZhY3RzLCBhcnRpZmFjdHNGcm9tUmVzb3VyY2UsIGxhYmVsQ291bnRlciwgc2hvdWRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCQlpZiAocmVzU3RhdHVzLmlzUmlnaHQoKSkKKwkJCQkJcmV0dXJuIHJlc1N0YXR1czsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzU3RhdHVzOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VBcnRpZmFjdHMoU3RyaW5nIGNzYXJVVUlELCBNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIE1hcDxTdHJpbmcsIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBhcnRpZmFjdHNNYXAsIEF1ZGl0aW5nQWN0aW9uRW51bSBjcmVhdGVSZXNvdXJjZSwKKwkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBjcmVhdGVkQXJ0aWZhY3RzLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc1N0YXR1cyA9IEVpdGhlci5sZWZ0KHJlc291cmNlKTsKKworCQlDb2xsZWN0aW9uPExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBhcmlmYWN0c0NvbGxlY3Rpb24gPSBhcnRpZmFjdHNNYXAudmFsdWVzKCk7CisKKwkJZm9yIChMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBncm91cFRlbXBsYXRlTGlzdCA6IGFyaWZhY3RzQ29sbGVjdGlvbikgeworCQkJaWYgKGdyb3VwVGVtcGxhdGVMaXN0ICE9IG51bGwpIHsKKwkJCQlyZXNTdGF0dXMgPSBjcmVhdGVHcm91cERlcGxveW1lbnRBcnRpZmFjdHNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgcmVzb3VyY2UsIHVzZXIsIGdyb3VwVGVtcGxhdGVMaXN0LCBjcmVhdGVkQXJ0aWZhY3RzLCAwLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCQlpZiAocmVzU3RhdHVzLmlzUmlnaHQoKSkKKwkJCQkJcmV0dXJuIHJlc1N0YXR1czsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXNTdGF0dXM7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwRGVwbG95bWVudEFydGlmYWN0c0Zyb21Dc2FyKFN0cmluZyBjc2FyVVVJRCwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBhcnRpZmFjdHNUZW1wbGF0ZUxpc3QsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBjcmVhdGVkQXJ0aWZhY3RzLAorCQkJaW50IGxhYmVsQ291bnRlciwgYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gcmVzU3RhdHVzID0gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gY3JlYXRlZEdyb3VwcyA9IHJlc291cmNlLmdldEdyb3VwcygpOworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gaGVhdEdyb3VwcyA9IG51bGw7CisJCWlmIChjcmVhdGVkR3JvdXBzICE9IG51bGwgJiYgIWNyZWF0ZWRHcm91cHMuaXNFbXB0eSgpKSB7CisKKwkJCS8vIExpc3Q8SUFydGlmYWN0SW5mbz4gY29sbGVjdCA9IHJlc291cmNlcy5zdHJlYW0oKS5mbGF0TWFwKCBlIC0+CisJCQkvLyBlLmdldEFydGlmYWN0cygpLnN0cmVhbSgpKS5maWx0ZXIocCAtPgorCQkJLy8gcmVsZXZhbnRBcnRpZmFjdFR5cGVzLmNvbnRhaW5zKHAuZ2V0QXJ0aWZhY3RUeXBlKCkKKwkJCS8vICkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkvLyBMaXN0PEdyb3VwRGVmaW5pdGlvbj4gaGVhdEdyb3VwcyA9IGNyZWF0ZWRHcm91cHMuc3RyZWFtKCkuZmlsdGVyKAorCQkJLy8gZSAtPiBlLmdldFByb3BlcnRpZXMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPgorCQkJLy8gcC5nZXROYW1lKCkuY29udGFpbnMoQ29uc3RhbnRzLkhFQVRfRklMRV9QUk9QUykpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJaGVhdEdyb3VwcyA9IGNyZWF0ZWRHcm91cHMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gZS5nZXRNZW1iZXJzKCkgIT0gbnVsbCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCTsKKwkJfQorCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIGdyb3VwVGVtcGxhdGVJbmZvIDogYXJ0aWZhY3RzVGVtcGxhdGVMaXN0KSB7CisJCQlTdHJpbmcgZ3JvdXBOYW1lID0gZ3JvdXBUZW1wbGF0ZUluZm8uZ2V0R3JvdXBOYW1lKCk7CisJCQlTZXQ8U3RyaW5nPiBhcnRpZmFjdHNHcm91cCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCQkJbG9nLmRlYnVnKCJjcmVhdGVEZXBsb3ltZW50QXJ0aWZhY3RzRnJvbUNzYXIgc3RhcnQiKTsKKwkJCXJlc1N0YXR1cyA9IGNyZWF0ZURlcGxveW1lbnRBcnRpZmFjdHNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgcmVzb3VyY2UsIHVzZXIsIGFydGlmYWN0c0dyb3VwLCBncm91cFRlbXBsYXRlSW5mbywgY3JlYXRlZEFydGlmYWN0cywgbGFiZWxDb3VudGVyLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlRGVwbG95bWVudEFydGlmYWN0c0Zyb21Dc2FyIGVuZCIpOworCQkJaWYgKHJlc1N0YXR1cy5pc1JpZ2h0KCkpCisJCQkJcmV0dXJuIHJlc1N0YXR1czsKKworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBtZW1iZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCQlhc3NvY2lhdGVNZW1iZXJzVFRvQXJ0aWZhY3RzKGNyZWF0ZWRBcnRpZmFjdHMsIG51bGwsIGhlYXRHcm91cHMsIGFydGlmYWN0c0dyb3VwLCBtZW1iZXJzKTsKKworCQkJTGlzdDxTdHJpbmc+IGFydGlmYWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oYXJ0aWZhY3RzR3JvdXApOworCisJCQlHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uID0gbmV3IEdyb3VwRGVmaW5pdGlvbigpOworCQkJZ3JvdXBEZWZpbml0aW9uLnNldE5hbWUoZ3JvdXBOYW1lKTsKKwkJCWdyb3VwRGVmaW5pdGlvbi5zZXRUeXBlKENvbnN0YW50cy5ERUZBVUxUX0dST1VQX1ZGX01PRFVMRSk7CisJCQlncm91cERlZmluaXRpb24uc2V0QXJ0aWZhY3RzKGFydGlmYWN0c0xpc3QpOworCQkJaWYgKCFtZW1iZXJzLmlzRW1wdHkoKSkKKwkJCQlncm91cERlZmluaXRpb24uc2V0TWVtYmVycyhtZW1iZXJzKTsKKwkJCUxpc3Q8R3JvdXBQcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8R3JvdXBQcm9wZXJ0eT4oKTsKKwkJCUdyb3VwUHJvcGVydHkgcHJvcCA9IG5ldyBHcm91cFByb3BlcnR5KCk7CisJCQlwcm9wLnNldE5hbWUoQ29uc3RhbnRzLklTX0JBU0UpOworCQkJcHJvcC5zZXRWYWx1ZShCb29sZWFuLnRvU3RyaW5nKGdyb3VwVGVtcGxhdGVJbmZvLmlzQmFzZSgpKSk7CisKKwkJCXByb3BlcnRpZXMuYWRkKHByb3ApOworCQkJZ3JvdXBEZWZpbml0aW9uLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisJCQlsb2cuZGVidWcoImNyZWF0ZUdyb3VwIHN0YXJ0Iik7CisJCQkvLyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlR3JvdXAgPQorCQkJLy8gZ3JvdXBCdXNpbmVzc0xvZ2ljLmNyZWF0ZUdyb3VwKHJlc291cmNlLmdldFVuaXF1ZUlkKCksCisJCQkvLyB1c2VyLmdldFVzZXJJZCgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZ3JvdXBEZWZpbml0aW9uLAorCQkJLy8gaW5UcmFuc2FjdGlvbik7CisJCQkvLyBJZ25vcmUgdmFsaWRhdGlvbnMgYW5kIGdldCBjb21wb25lbnQKKworCQkJLy8gU2luY2UgaW4gdGhlc2UgZ3JvdXBzIHdlIGhhbmRsZSBvbmx5IGFydGlmYWN0cywgdGhlbiBubyBuZWVkIHRvCisJCQkvLyBmZXRjaCBjb21wb25lbnQgaW5zdGFuY2VzCisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuZGlzYWJsZUFsbCgpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlVXNlcnMoZmFsc2UpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQXJ0aWZhY3RzKGZhbHNlKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUdyb3VwcyhmYWxzZSk7CisJCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVDb21wb25lbnRJbnN0YW5jZXMoZmFsc2UpOworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRDb21wb25lbnQocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJfQorCisJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlR3JvdXAgPSBncm91cEJ1c2luZXNzTG9naWMuY3JlYXRlR3JvdXAoY29tcG9uZW50LmxlZnQoKS52YWx1ZSgpLCB1c2VyLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgZ3JvdXBEZWZpbml0aW9uLCBpblRyYW5zYWN0aW9uKTsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlR3JvdXAgZW5kIik7CisJCQlpZiAoY3JlYXRlR3JvdXAuaXNSaWdodCgpKQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlR3JvdXAucmlnaHQoKS52YWx1ZSgpKTsKKworCQl9CisJCXJldHVybiByZXNTdGF0dXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFzc29jaWF0ZU1lbWJlcnNUVG9BcnRpZmFjdHMoTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWRBcnRpZmFjdHMsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHNGcm9tUmVzb3VyY2UsIExpc3Q8R3JvdXBEZWZpbml0aW9uPiBoZWF0R3JvdXBzLCBTZXQ8U3RyaW5nPiBhcnRpZmFjdHNHcm91cCwgTWFwPFN0cmluZywgU3RyaW5nPiBtZW1iZXJzKSB7CisJCWlmIChoZWF0R3JvdXBzICE9IG51bGwgJiYgIWhlYXRHcm91cHMuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEdyb3VwRGVmaW5pdGlvbiBoZWF0R3JvdXAgOiBoZWF0R3JvdXBzKSB7CisJCQkJTGlzdDxHcm91cFByb3BlcnR5PiBncnBvdXBQcm9wcyA9IGhlYXRHcm91cC5nZXRQcm9wZXJ0aWVzKCk7CisJCQkJaWYgKGdycG91cFByb3BzICE9IG51bGwpIHsKKwkJCQkJT3B0aW9uYWw8R3JvdXBQcm9wZXJ0eT4gb3AgPSBncnBvdXBQcm9wcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoQ29uc3RhbnRzLkhFQVRfRklMRV9QUk9QUykpLmZpbmRBbnkoKTsKKwkJCQkJaWYgKG9wLmlzUHJlc2VudCgpKSB7CisJCQkJCQlHcm91cFByb3BlcnR5IHByb3AgPSBvcC5nZXQoKTsKKwkJCQkJCVN0cmluZyBoZWF0RmlsZU5BbWUgPSBwcm9wLmdldFZhbHVlKCk7CisJCQkJCQlpZiAobnVsbCA9PSBoZWF0RmlsZU5BbWUgfHwgaGVhdEZpbGVOQW1lLmlzRW1wdHkoKSkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCQlmb3IgKFN0cmluZyBhcnRpZmFjdElkIDogYXJ0aWZhY3RzR3JvdXApIHsKKwkJCQkJCQlPcHRpb25hbDxBcnRpZmFjdERlZmluaXRpb24+IG9wQXJ0ID0gY3JlYXRlZEFydGlmYWN0cy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGFydGlmYWN0SWQpKS5maW5kQW55KCk7CisJCQkJCQkJaWYgKG9wQXJ0LmlzUHJlc2VudCgpKSB7CisJCQkJCQkJCWFydGlmYWN0cy5hZGQob3BBcnQuZ2V0KCkpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoYXJ0aWZhY3RzRnJvbVJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJb3BBcnQgPSBhcnRpZmFjdHNGcm9tUmVzb3VyY2Uuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRVbmlxdWVJZCgpLmVxdWFscyhhcnRpZmFjdElkKSkuZmluZEFueSgpOworCQkJCQkJCQlpZiAob3BBcnQuaXNQcmVzZW50KCkpIHsKKwkJCQkJCQkJCWFydGlmYWN0cy5hZGQob3BBcnQuZ2V0KCkpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJT3B0aW9uYWw8QXJ0aWZhY3REZWZpbml0aW9uPiByZXNPcCA9IGFydGlmYWN0cy5zdHJlYW0oKS5maWx0ZXIocCAtPiBoZWF0RmlsZU5BbWUuY29udGFpbnMocC5nZXRBcnRpZmFjdE5hbWUoKSkpLmZpbmRBbnkoKTsKKwkJCQkJCWlmIChyZXNPcC5pc1ByZXNlbnQoKSkgeworCQkJCQkJCW1lbWJlcnMucHV0QWxsKGhlYXRHcm91cC5nZXRNZW1iZXJzKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZURlcGxveW1lbnRBcnRpZmFjdHNGcm9tQ3NhcihTdHJpbmcgY3NhclVVSUQsIE1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhciwgUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgU2V0PFN0cmluZz4gYXJ0aWZhY3RzR3JvdXAsIEFydGlmYWN0VGVtcGxhdGVJbmZvIGFydGlmYWN0VGVtcGxhdGVJbmZvLAorCQkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWRBcnRpZmFjdHMsIGludCBsYWJlbENvdW50ZXIsIGJvb2xlYW4gc2hvdWRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gcmVzU3RhdHVzID0gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCQlTdHJpbmcgYXJ0aWZhY3RGaWxlTmFtZSA9IGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEZpbGVOYW1lKCk7CisJCVN0cmluZyBhcnRpZmFjdFVpZCA9ICIiOworCQlib29sZWFuIGFscmVhZHlFeGlzdCA9IGZhbHNlOworCisJCS8vIGNoZWNrIGlmIGFydGlmYWN0cyBhbHJlYWR5IGV4aXN0CisJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGNyZWF0ZWRBcnRpZmFjdCA6IGNyZWF0ZWRBcnRpZmFjdHMpIHsKKwkJCWlmIChjcmVhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzKGFydGlmYWN0RmlsZU5hbWUpKSB7CisJCQkJYXJ0aWZhY3RVaWQgPSBjcmVhdGVkQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKTsKKwkJCQlpZiAoIWNyZWF0ZWRBcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldFR5cGUoKSkpIHsKKwkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCB3aXRoIG5hbWUge30gYW5kIHR5cGUge30gYWxyZWFkeSBleGlzdCB3aXRoIHR5cGUgIHt9IiwgYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpLCBjcmVhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXRyLCBmaWxlTmFtZSAiICsgYXJ0aWZhY3RGaWxlTmFtZSwgIkFydGlmYWN0IGludGVybmFscyBhcmUgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX0RJRkZFUkVOVF9UWVBFX0lOX0NTQVIsIGFydGlmYWN0RmlsZU5hbWUsIGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldFR5cGUoKSwgY3JlYXRlZEFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpKSk7CisJCQkJfQorCQkJCWFscmVhZHlFeGlzdCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJfQorCQkvLyBpZiBub3QgZXhpc3QgbmVlZCB0byBjcmVhdGUKKwkJaWYgKCFhbHJlYWR5RXhpc3QpIHsKKworCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IG5ld0FydGlmYWN0RWl0aGVyID0gY3JlYXRlRGVwbG95bWVudEFydGlmYWN0KGNzYXJVVUlELCBjc2FyLCByZXNvdXJjZSwgdXNlciwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8sIGNyZWF0ZWRBcnRpZmFjdHMsIGxhYmVsQ291bnRlciwgc2hvdWRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmIChuZXdBcnRpZmFjdEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlyZXNTdGF0dXMgPSBFaXRoZXIucmlnaHQobmV3QXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzU3RhdHVzOworCQkJfQorCQkJYXJ0aWZhY3RVaWQgPSBuZXdBcnRpZmFjdEVpdGhlci5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCisJCX0KKworCQlhcnRpZmFjdHNHcm91cC5hZGQoYXJ0aWZhY3RVaWQpOworCisJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRBcnRpZmFjdHMgPSBhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRSZWxhdGVkQXJ0aWZhY3RzSW5mbygpOworCQlpZiAocmVsYXRlZEFydGlmYWN0cyAhPSBudWxsKSB7CisJCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIHJlbGF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mbyA6IHJlbGF0ZWRBcnRpZmFjdHMpIHsKKwkJCQlyZXNTdGF0dXMgPSBjcmVhdGVEZXBsb3ltZW50QXJ0aWZhY3RzRnJvbUNzYXIoY3NhclVVSUQsIGNzYXIsIHJlc291cmNlLCB1c2VyLCBhcnRpZmFjdHNHcm91cCwgcmVsYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvLCBjcmVhdGVkQXJ0aWZhY3RzLCBsYWJlbENvdW50ZXIsIHNob3VkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQkJaWYgKHJlc1N0YXR1cy5pc1JpZ2h0KCkpCisJCQkJCXJldHVybiByZXNTdGF0dXM7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc1N0YXR1czsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVEZXBsb3ltZW50QXJ0aWZhY3QoU3RyaW5nIGNzYXJVVUlELCBNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIsIFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIEFydGlmYWN0VGVtcGxhdGVJbmZvIGFydGlmYWN0VGVtcGxhdGVJbmZvLCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gY3JlYXRlZEFydGlmYWN0cywKKwkJCWludCBsYWJlbENvdW50ZXIsIGJvb2xlYW4gc2hvdWRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJU3RyaW5nIGFydGlmYWN0VWlkOworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIGJ5dGVbXT4sIFJlc3BvbnNlRm9ybWF0PiBhcnRpZmFjdENvbnRlbnRlbnRTdGF0dXMgPSBDc2FyVmFsaWRhdGlvblV0aWxzLmdldEFydGlmYWN0c0NvbnRlbnQoY3NhclVVSUQsIGNzYXIsIGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEZpbGVOYW1lKCksIGNvbXBvbmVudHNVdGlscyk7CisJCWlmIChhcnRpZmFjdENvbnRlbnRlbnRTdGF0dXMuaXNSaWdodCgpKQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChhcnRpZmFjdENvbnRlbnRlbnRTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJbGFiZWxDb3VudGVyICs9IGNyZWF0ZWRBcnRpZmFjdHMuc2l6ZSgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IGJ1aWxkSnNvbkZvckFydGlmYWN0KGFydGlmYWN0VGVtcGxhdGVJbmZvLCBhcnRpZmFjdENvbnRlbnRlbnRTdGF0dXMubGVmdCgpLnZhbHVlKCkuZ2V0VmFsdWUoKSwgbGFiZWxDb3VudGVyKTsKKworCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwbG9hZEFydGlmYWN0VG9TZXJ2aWNlID0gY3JlYXRlT3JVcGRhdGVDc2FyQXJ0aWZhY3RGcm9tSnNvbihyZXNvdXJjZSwgdXNlciwganNvbiwgQXJ0aWZhY3RPcGVyYXRpb24uQ3JlYXRlLCBzaG91ZExvY2ssIGluVHJhbnNhY3Rpb24pOworCisJCWlmICh1cGxvYWRBcnRpZmFjdFRvU2VydmljZS5pc1JpZ2h0KCkpCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVwbG9hZEFydGlmYWN0VG9TZXJ2aWNlLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJlbnRJbmZvID0gdXBsb2FkQXJ0aWZhY3RUb1NlcnZpY2UubGVmdCgpLnZhbHVlKCkubGVmdCgpLnZhbHVlKCk7CisJCWlmIChjdXJyZW50SW5mby5nZXRIZWF0UGFyYW1ldGVycygpICE9IG51bGwpIHsKKworCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUVudkVpdGhlciA9IHVwZGF0ZUhlYXRQYXJhbXNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8sIGN1cnJlbnRJbmZvKTsKKwkJCWlmICh1cGRhdGVFbnZFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIHBhcmFtZXRlcnMgdG8gYXJ0aWZhY3Qge30iLCBhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRGaWxlTmFtZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVwZGF0ZUVudkVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCisJCQl9CisJCQlhcnRpZmFjdFVpZCA9IHVwZGF0ZUVudkVpdGhlci5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCQkJY3JlYXRlZEFydGlmYWN0cy5hZGQodXBkYXRlRW52RWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWN1cnJlbnRJbmZvID0gdXBkYXRlRW52RWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQl9IGVsc2UgeworCisJCQlhcnRpZmFjdFVpZCA9IGN1cnJlbnRJbmZvLmdldFVuaXF1ZUlkKCk7CisJCQljcmVhdGVkQXJ0aWZhY3RzLmFkZChjdXJyZW50SW5mbyk7CisKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3VycmVudEluZm8pOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlRGVwbG95bWVudEFydGlmYWN0c0Zyb21Dc2FyKFN0cmluZyBjc2FyVVVJRCwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBBcnRpZmFjdERlZmluaXRpb24gb2xkQXJ0aWZhY3QsIEFydGlmYWN0VGVtcGxhdGVJbmZvIGFydGlmYWN0VGVtcGxhdGVJbmZvLAorCQkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IHVwZGF0ZWRBcnRpZmFjdHMsIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHVwZGF0ZWRSZXF1aXJlZEFydGlmYWN0cywgYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcmVzU3RhdHVzID0gbnVsbDsKKwkJU3RyaW5nIGFydGlmYWN0RmlsZU5hbWUgPSBhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRGaWxlTmFtZSgpOworCQlTdHJpbmcgYXJ0aWZhY3RVaWQgPSAiIjsKKworCQkvLyBjaGVjayBpZiBhcnRpZmFjdHMgYWxyZWFkeSBleGlzdAorCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiB1cGRhdGVkQXJ0aWZhY3QgOiB1cGRhdGVkQXJ0aWZhY3RzKSB7CisJCQlpZiAodXBkYXRlZEFydGlmYWN0LmdldEFydGlmYWN0TmFtZSgpLmVxdWFscyhhcnRpZmFjdEZpbGVOYW1lKSkgeworCQkJCWFydGlmYWN0VWlkID0gdXBkYXRlZEFydGlmYWN0LmdldFVuaXF1ZUlkKCk7CisJCQkJaWYgKCF1cGRhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRUeXBlKCkpKSB7CisJCQkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3Qgd2l0aCBuYW1lIHt9IGFuZCB0eXBlIHt9IGFscmVhZHkgdXBkYXRlZCB3aXRoIHR5cGUgIHt9IiwgYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpLCB1cGRhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXRyLCBmaWxlTmFtZSAiICsgYXJ0aWZhY3RGaWxlTmFtZSwgIkFydGlmYWN0IGludGVybmFscyBhcmUgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQlyZXNTdGF0dXMgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9BTFJBRFlfRVhJU1RfSU5fRElGRkVSRU5UX1RZUEVfSU5fQ1NBUiwgYXJ0aWZhY3RGaWxlTmFtZSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpLCB1cGRhdGVkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCkpKTsKKwkJCQkJcmV0dXJuIHJlc1N0YXR1czsKKwkJCQl9CisJCQkJcmVzU3RhdHVzID0gRWl0aGVyLmxlZnQodXBkYXRlZEFydGlmYWN0KTsKKwkJCQlyZXR1cm4gcmVzU3RhdHVzOworCQkJfQorCisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIGJ5dGVbXT4sIFJlc3BvbnNlRm9ybWF0PiBhcnRpZmFjdENvbnRlbnRlbnRTdGF0dXMgPSBDc2FyVmFsaWRhdGlvblV0aWxzLmdldEFydGlmYWN0c0NvbnRlbnQoY3NhclVVSUQsIGNzYXIsIGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEZpbGVOYW1lKCksIGNvbXBvbmVudHNVdGlscyk7CisJCWlmIChhcnRpZmFjdENvbnRlbnRlbnRTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXNTdGF0dXMgPSBFaXRoZXIucmlnaHQoYXJ0aWZhY3RDb250ZW50ZW50U3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzU3RhdHVzOworCQl9CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gYnVpbGRKc29uRm9yVXBkYXRlQXJ0aWZhY3Qob2xkQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSwgYXJ0aWZhY3RGaWxlTmFtZSwgb2xkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUeXBlKCksIG9sZEFydGlmYWN0LmdldEFydGlmYWN0TGFiZWwoKSwgb2xkQXJ0aWZhY3QuZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpLCBvbGRBcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpLAorCQkJCWFydGlmYWN0Q29udGVudGVudFN0YXR1cy5sZWZ0KCkudmFsdWUoKS5nZXRSaWdodCgpLCB1cGRhdGVkUmVxdWlyZWRBcnRpZmFjdHMpOworCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHVwbG9hZEFydGlmYWN0VG9TZXJ2aWNlID0gY3JlYXRlT3JVcGRhdGVDc2FyQXJ0aWZhY3RGcm9tSnNvbihyZXNvdXJjZSwgdXNlciwganNvbiwgQXJ0aWZhY3RPcGVyYXRpb24uVXBkYXRlLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKworCQlpZiAodXBsb2FkQXJ0aWZhY3RUb1NlcnZpY2UuaXNSaWdodCgpKSB7CisJCQlyZXNTdGF0dXMgPSBFaXRoZXIucmlnaHQodXBsb2FkQXJ0aWZhY3RUb1NlcnZpY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXNTdGF0dXM7CisJCX0KKwkJQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJlbnRJbmZvID0gdXBsb2FkQXJ0aWZhY3RUb1NlcnZpY2UubGVmdCgpLnZhbHVlKCkubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZUVudkVpdGhlciA9IHVwZGF0ZUhlYXRQYXJhbXNGcm9tQ3Nhcihjc2FyVVVJRCwgY3NhciwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8sIGN1cnJlbnRJbmZvKTsKKwkJaWYgKHVwZGF0ZUVudkVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIHRvIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3RGaWxlTmFtZSk7CisJCQlyZXNTdGF0dXMgPSBFaXRoZXIucmlnaHQodXBkYXRlRW52RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzU3RhdHVzOworCQl9CisKKwkJYXJ0aWZhY3RVaWQgPSB1cGRhdGVFbnZFaXRoZXIubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKwkJdXBkYXRlZEFydGlmYWN0cy5hZGQodXBkYXRlRW52RWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwkJcmVzU3RhdHVzID0gRWl0aGVyLmxlZnQodXBkYXRlRW52RWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKworCQlyZXR1cm4gcmVzU3RhdHVzOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlSGVhdFBhcmFtc0Zyb21Dc2FyKFN0cmluZyBjc2FyVVVJRCwgTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyLCBBcnRpZmFjdFRlbXBsYXRlSW5mbyBhcnRpZmFjdFRlbXBsYXRlSW5mbywgQXJ0aWZhY3REZWZpbml0aW9uIGN1cnJlbnRJbmZvKSB7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiByZXNTdGF0dXMgPSBFaXRoZXIubGVmdChjdXJyZW50SW5mbyk7CisJCWlmIChhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKSAhPSBudWxsICYmICFhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKS5pc0VtcHR5KCkpIHsKKworCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8U3RyaW5nLCBieXRlW10+LCBSZXNwb25zZUZvcm1hdD4gYXJ0aWZhY3RwYXJhbXNTdGF0dXMgPSBDc2FyVmFsaWRhdGlvblV0aWxzLmdldEFydGlmYWN0c0NvbnRlbnQoY3NhclVVSUQsIGNzYXIsIGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEVudigpLCBjb21wb25lbnRzVXRpbHMpOworCQkJaWYgKGFydGlmYWN0cGFyYW1zU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCXJlc1N0YXR1cyA9IEVpdGhlci5yaWdodChhcnRpZmFjdHBhcmFtc1N0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNTdGF0dXM7CisJCQl9CisJCQlFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBwcm9wc1N0YXR1cyA9IGV4dHJhY3RIZWF0UGFyYW1ldGVycyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0RW52KCksIGFydGlmYWN0cGFyYW1zU3RhdHVzLmxlZnQoKS52YWx1ZSgpLmdldFZhbHVlKCkpOworCQkJaWYgKHByb3BzU3RhdHVzLmlzUmlnaHQoKSkgeworCisJCQkJcmVzU3RhdHVzID0gRWl0aGVyLnJpZ2h0KHByb3BzU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc1N0YXR1czsKKwkJCX0KKwkJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHVwZGF0ZWRIZWF0RW52UGFyYW1zID0gcHJvcHNTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBjdXJyZW50SGVhdEVudlBhcmFtcyA9IGN1cnJlbnRJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBuZXdIZWF0RW52UGFyYW1zID0gbmV3IEFycmF5TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4oKTsKKworCQkJaWYgKHVwZGF0ZWRIZWF0RW52UGFyYW1zICE9IG51bGwgJiYgIXVwZGF0ZWRIZWF0RW52UGFyYW1zLmlzRW1wdHkoKSAmJiBjdXJyZW50SGVhdEVudlBhcmFtcyAhPSBudWxsICYmICFjdXJyZW50SGVhdEVudlBhcmFtcy5pc0VtcHR5KCkpIHsKKworCQkJCVN0cmluZyBwYXJhbU5hbWU7CisJCQkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0RW52UGFyYW0gOiB1cGRhdGVkSGVhdEVudlBhcmFtcykgeworCisJCQkJCXBhcmFtTmFtZSA9IGhlYXRFbnZQYXJhbS5nZXROYW1lKCk7CisJCQkJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gY3VyckhlYXRQYXJhbSA6IGN1cnJlbnRIZWF0RW52UGFyYW1zKSB7CisJCQkJCQlpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoY3VyckhlYXRQYXJhbS5nZXROYW1lKCkpKSB7CisKKwkJCQkJCQlTdHJpbmcgdXBkYXRlZFBhcmFtVmFsdWUgPSBoZWF0RW52UGFyYW0uZ2V0Q3VycmVudFZhbHVlKCk7CisJCQkJCQkJaWYgKHVwZGF0ZWRQYXJhbVZhbHVlID09IG51bGwpCisJCQkJCQkJCXVwZGF0ZWRQYXJhbVZhbHVlID0gaGVhdEVudlBhcmFtLmdldERlZmF1bHRWYWx1ZSgpOworCQkJCQkJCUhlYXRQYXJhbWV0ZXJUeXBlIHBhcmFtVHlwZSA9IEhlYXRQYXJhbWV0ZXJUeXBlLmlzVmFsaWRUeXBlKGN1cnJIZWF0UGFyYW0uZ2V0VHlwZSgpKTsKKwkJCQkJCQlpZiAoIXBhcmFtVHlwZS5nZXRWYWxpZGF0b3IoKS5pc1ZhbGlkKHVwZGF0ZWRQYXJhbVZhbHVlLCBudWxsKSkgeworCQkJCQkJCQlBY3Rpb25TdGF0dXMgc3RhdHVzID0gQWN0aW9uU3RhdHVzLklOVkFMSURfSEVBVF9QQVJBTUVURVJfVkFMVUU7CisJCQkJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KHN0YXR1cywgQXJ0aWZhY3RUeXBlRW51bS5IRUFUX0VOVi5nZXRUeXBlKCksIHBhcmFtVHlwZS5nZXRUeXBlKCksIHBhcmFtTmFtZSk7CisJCQkJCQkJCXJlc1N0YXR1cyA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCQkJCXJldHVybiByZXNTdGF0dXM7CisJCQkJCQkJfQorCQkJCQkJCWN1cnJIZWF0UGFyYW0uc2V0Q3VycmVudFZhbHVlKHBhcmFtVHlwZS5nZXRDb252ZXJ0ZXIoKS5jb252ZXJ0KHVwZGF0ZWRQYXJhbVZhbHVlLCBudWxsLCBudWxsKSk7CisJCQkJCQkJbmV3SGVhdEVudlBhcmFtcy5hZGQoY3VyckhlYXRQYXJhbSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFuZXdIZWF0RW52UGFyYW1zLmlzRW1wdHkoKSkgeworCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLnVwZGF0ZUhlYXRQYXJhbWV0ZXJzKGN1cnJlbnRIZWF0RW52UGFyYW1zKTsKKworCQkJCQlpZiAob3BlcmF0aW9uU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBhcnRpZmFjdCBvbiBncmFwaCAgLSB7fSIsIGN1cnJlbnRJbmZvLmdldFVuaXF1ZUlkKCkpOworCisJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uob3BlcmF0aW9uU3RhdHVzKSk7CisJCQkJCQlyZXNTdGF0dXMgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQkJcmV0dXJuIHJlc1N0YXR1czsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQl9CisJCXJldHVybiByZXNTdGF0dXM7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBleHRyYWN0SGVhdFBhcmFtZXRlcnMoU3RyaW5nIGFydGlmYWN0VHlwZSwgU3RyaW5nIGZpbGVOYW1lLCBieXRlW10gY29udGVudCkgeworCQkvLyBleHRyYWN0IGhlYXQgcGFyYW1ldGVycworCQlTdHJpbmcgaGVhdERlY29kZWRQYXlsb2FkID0gR2VuZXJhbFV0aWxpdHkuaXNCYXNlNjRFbmNvZGVkKGNvbnRlbnQpID8gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlQmFzZTY0KGNvbnRlbnQpKSA6IG5ldyBTdHJpbmcoY29udGVudCk7CisJCUVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gaGVhdFBhcmFtZXRlcnMgPSBJbXBvcnRVdGlscy5nZXRIZWF0UGFyYW1zV2l0aG91dEltcGxpY2l0VHlwZXMoaGVhdERlY29kZWRQYXlsb2FkLCBhcnRpZmFjdFR5cGUpOworCQlpZiAoaGVhdFBhcmFtZXRlcnMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZpbGUge30gaXMgbm90IGluIGV4cGVjdGVkIGtleS12YWx1ZSBmb3JtIGluIGNzYXIgIiwgZmlsZU5hbWUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJGaWxlICIgKyBmaWxlTmFtZSArICIgaXMgbm90IGluIGV4cGVjdGVkIGtleS12YWx1ZSBmb3JtIGluIGNzYXIgIiwgIkNTQVIgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ERVBMT1lNRU5UX0FSVElGQUNUX0hFQVQsIGZpbGVOYW1lKSk7CisKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoaGVhdFBhcmFtZXRlcnMubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGJ1aWxkSnNvbkZvckFydGlmYWN0KEFydGlmYWN0VGVtcGxhdGVJbmZvIGFydGlmYWN0VGVtcGxhdGVJbmZvLCBieXRlW10gYXJ0aWZhY3RDb250ZW50ZW50LCBpbnQgYXRyaWZhY3RMYWJlbENvdW50ZXIpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJU3RyaW5nIGFydGlmYWN0TmFtZSA9IGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEZpbGVOYW1lKCk7CisKKwkJanNvbi5wdXQoQ29uc3RhbnRzLkFSVElGQUNUX05BTUUsIGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEZpbGVOYW1lKCkpOworCQlqc29uLnB1dChDb25zdGFudHMuQVJUSUZBQ1RfVFlQRSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0VHlwZSgpKTsKKwkJanNvbi5wdXQoQ29uc3RhbnRzLkFSVElGQUNUX0RFU0NSSVBUSU9OLCAiY3JlYXRlZCBmcm9tIGNzYXIiKTsKKworCQkvKgorCQkgKiBERTI1MDIwNAorCQkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmIGJhc2U2NCBlbmNvZGluZy4gQWxsIGZpbGVzIHRoYXQgYXJlIGluc2lkZSB0aGUgQ1NBUiBhcmUgbm90IGVuY29kZWQgYW5kIG5lZWQgdG8gZW5jb2RlZC4gVGhlIGNoZWNrIGZvciBpc0Jhc2U2NCBpcyBub3QgaW4gY2FzZXMgd2UgZ2V0IGZpbGVzIHdpdGggZXh0ZW5zaW9uIC5jZXJ0IG9yIC5rZXkgdGhlc2UgZmlsZXMgYXJlIGJhc2U2NCBidXQgaWYgZG8gbm90CisJCSAqIGVuY29kZSB0aGVtIGFnYWluLCB3aGVuIHRoZSB1c2VyIGRvd25sb2FkIHRoZW0sIHRoZSBkZWNvZGVkIGZpbGUgd2lsbCByZXR1cm4gbm90IHRoZSBlbmNvZGVkIGZpbGUgdGhhdCB3YXMgdXBsb2FkLgorCQkgKi8KKwkJLy8gU3RyaW5nIGVuY29kZWRQYXlsb2FkID0gbmV3IFN0cmluZyhhcnRpZmFjdENvbnRlbnRlbnQpOworCQkvLyBib29sZWFuIGlzRW5jb2RlZCA9IEdlbmVyYWxVdGlsaXR5LmlzQmFzZTY0RW5jb2RlZChhcnRpZmFjdENvbnRlbnRlbnQpOworCQkvLyBpZiAoIWlzRW5jb2RlZCkgeworCQkvLyBsb2cuZGVidWcoInBheWxvYWQgaXMgZW5jb2RlZC4gcGVyZm9ybSBkZWNvZGUiKTsKKwkJU3RyaW5nIGVuY29kZWRQYXlsb2FkID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhhcnRpZmFjdENvbnRlbnRlbnQpOworCQkvLyB9CisJCWpzb24ucHV0KENvbnN0YW50cy5BUlRJRkFDVF9QQVlMT0FEX0RBVEEsIGVuY29kZWRQYXlsb2FkKTsKKwkJU3RyaW5nIGRpc3BsYXlOYW1lID0gYXJ0aWZhY3ROYW1lOworCQlpZiAoYXJ0aWZhY3ROYW1lLmxhc3RJbmRleE9mKCIuIikgPiAwKQorCQkJZGlzcGxheU5hbWUgPSBhcnRpZmFjdE5hbWUuc3Vic3RyaW5nKDAsIGFydGlmYWN0TmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKKwkJanNvbi5wdXQoQ29uc3RhbnRzLkFSVElGQUNUX0RJU1BMQVlfTkFNRSwgZGlzcGxheU5hbWUpOworCQlTdHJpbmcgbGFiZWwgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQXJ0aWZhY3RMYWJlbChhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRUeXBlKCkgKyBhdHJpZmFjdExhYmVsQ291bnRlcik7CisJCWpzb24ucHV0KENvbnN0YW50cy5BUlRJRkFDVF9MQUJFTCwgbGFiZWwpOworCQlqc29uLnB1dChDb25zdGFudHMuQVJUSUZBQ1RfR1JPVVBfVFlQRSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQuZ2V0VHlwZSgpKTsKKwkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVxdWlyZWRBcnRpZmFjdHMgPSBhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRSZWxhdGVkQXJ0aWZhY3RzSW5mbygpOworCQlqc29uLnB1dChDb25zdGFudHMuUkVRVUlSRURfQVJUSUZBQ1RTLCAocmVxdWlyZWRBcnRpZmFjdHMgPT0gbnVsbCB8fCByZXF1aXJlZEFydGlmYWN0cy5pc0VtcHR5KCkpID8gbmV3IEFycmF5TGlzdDw+KCkKKwkJCQk6IHJlcXVpcmVkQXJ0aWZhY3RzLnN0cmVhbSgpLmZpbHRlcihlIC0+IGUuZ2V0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfQVJUSUZBQ1QuZ2V0VHlwZSgpKSB8fCBlLmdldFR5cGUoKS5lcXVhbHMoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX05FU1RFRC5nZXRUeXBlKCkpKS5tYXAoZSAtPiBlLmdldEZpbGVOYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworCQlyZXR1cm4ganNvbjsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGRKc29uRm9yVXBkYXRlQXJ0aWZhY3QoU3RyaW5nIGFydGlmYWN0SWQsIFN0cmluZyBhcnRpZmFjdE5hbWUsIFN0cmluZyBhcnRpZmFjdFR5cGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIGJ5dGVbXSBhcnRpZmFjdENvbnRlbnRlbnQsCisJCQlMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiB1cGRhdGVkUmVxdWlyZWRBcnRpZmFjdHMpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJaWYgKGFydGlmYWN0SWQgIT0gbnVsbCAmJiAhYXJ0aWZhY3RJZC5pc0VtcHR5KCkpCisJCQlqc29uLnB1dChDb25zdGFudHMuQVJUSUZBQ1RfSUQsIGFydGlmYWN0SWQpOworCisJCWpzb24ucHV0KENvbnN0YW50cy5BUlRJRkFDVF9OQU1FLCBhcnRpZmFjdE5hbWUpOworCQlqc29uLnB1dChDb25zdGFudHMuQVJUSUZBQ1RfVFlQRSwgYXJ0aWZhY3RUeXBlKTsKKwkJanNvbi5wdXQoQ29uc3RhbnRzLkFSVElGQUNUX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7CisKKwkJU3RyaW5nIGVuY29kZWRQYXlsb2FkID0gbmV3IFN0cmluZyhhcnRpZmFjdENvbnRlbnRlbnQpOworCQkvLyBERTI1MDIwNCAtIG5lZWQgdG8gZW5jb2RlIGFsbC4KKwkJLy9ib29sZWFuIGlzRW5jb2RlZCA9IEdlbmVyYWxVdGlsaXR5LmlzQmFzZTY0RW5jb2RlZChhcnRpZmFjdENvbnRlbnRlbnQpOworCQkvL2lmICghaXNFbmNvZGVkKSB7CisJCQlsb2cuZGVidWcoInBheWxvYWQgaXMgZW5jb2RlZC4gcGVyZm9ybSBkZWNvZGUiKTsKKwkJCWVuY29kZWRQYXlsb2FkID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhhcnRpZmFjdENvbnRlbnRlbnQpOworCQkvL30KKworCQlqc29uLnB1dChDb25zdGFudHMuQVJUSUZBQ1RfUEFZTE9BRF9EQVRBLCBlbmNvZGVkUGF5bG9hZCk7CisJCWpzb24ucHV0KENvbnN0YW50cy5BUlRJRkFDVF9ESVNQTEFZX05BTUUsIGRpc3BsYXlOYW1lKTsKKwkJanNvbi5wdXQoQ29uc3RhbnRzLkFSVElGQUNUX0xBQkVMLCBsYWJlbCk7CisJCWpzb24ucHV0KENvbnN0YW50cy5BUlRJRkFDVF9HUk9VUF9UWVBFLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5nZXRUeXBlKCkpOworCQlqc29uLnB1dChDb25zdGFudHMuUkVRVUlSRURfQVJUSUZBQ1RTLCAodXBkYXRlZFJlcXVpcmVkQXJ0aWZhY3RzID09IG51bGwgfHwgdXBkYXRlZFJlcXVpcmVkQXJ0aWZhY3RzLmlzRW1wdHkoKSkgPyBuZXcgQXJyYXlMaXN0PD4oKQorCQkJCTogdXBkYXRlZFJlcXVpcmVkQXJ0aWZhY3RzLnN0cmVhbSgpLmZpbHRlcihlIC0+IGUuZ2V0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfQVJUSUZBQ1QuZ2V0VHlwZSgpKSB8fCBlLmdldFR5cGUoKS5lcXVhbHMoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX05FU1RFRC5nZXRUeXBlKCkpKS5tYXAoZSAtPiBlLmdldEZpbGVOYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworCQlyZXR1cm4ganNvbjsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPj4sIFJlc3BvbnNlRm9ybWF0PiBwYXJzZVJlc291cmNlQXJ0aWZhY3RzSW5mb0Zyb21GaWxlKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgYXJ0aWZhY3RzTWV0YUZpbGUsIFN0cmluZyBhcnRpZmFjdEZpbGVOYW1lLCBVc2VyIHVzZXIpIHsKKworCQl0cnkgeworCQkJSnNvbk9iamVjdCBqc29uRWxlbWVudCA9IG5ldyBKc29uT2JqZWN0KCk7CisJCQlqc29uRWxlbWVudCA9IGdzb24uZnJvbUpzb24oYXJ0aWZhY3RzTWV0YUZpbGUsIGpzb25FbGVtZW50LmdldENsYXNzKCkpOworCisJCQlKc29uRWxlbWVudCBpbXBvcnRTdHJ1Y3R1cmVFbGVtZW50ID0ganNvbkVsZW1lbnQuZ2V0KENvbnN0YW50cy5JTVBPUlRfU1RSVUNUVVJFKTsKKwkJCWlmIChpbXBvcnRTdHJ1Y3R1cmVFbGVtZW50ID09IG51bGwgfHwgaW1wb3J0U3RydWN0dXJlRWxlbWVudC5pc0pzb25OdWxsKCkpIHsKKwkJCQlsb2cuZGVidWcoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXRyLCBmaWxlTmFtZSAge30iLCBhcnRpZmFjdEZpbGVOYW1lKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXRyLCBmaWxlTmFtZSAiICsgYXJ0aWZhY3RGaWxlTmFtZSwgIkFydGlmYWN0IGludGVybmFscyBhcmUgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSURfRk9STUFULCBhcnRpZmFjdEZpbGVOYW1lKSk7CisJCQl9CisKKwkJCU1hcDxTdHJpbmcsIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4+IGFydGlmYWN0VGVtcGxhdGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4+KCk7CisJCQlhcnRpZmFjdFRlbXBsYXRlTWFwID0gY29tcG9uZW50c1V0aWxzLnBhcnNlSnNvblRvT2JqZWN0KGltcG9ydFN0cnVjdHVyZUVsZW1lbnQudG9TdHJpbmcoKSwgSGFzaE1hcC5jbGFzcyk7CisJCQlpZiAoYXJ0aWZhY3RUZW1wbGF0ZU1hcC5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuZGVidWcoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXRyLCBmaWxlTmFtZSAge30iLCBhcnRpZmFjdEZpbGVOYW1lKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXRyLCBmaWxlTmFtZSAiICsgYXJ0aWZhY3RGaWxlTmFtZSwgIkFydGlmYWN0IGludGVybmFscyBhcmUgaW52YWxpZCIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSURfRk9STUFULCBhcnRpZmFjdEZpbGVOYW1lKSk7CisJCQl9CisKKwkJCVNldDxTdHJpbmc+IGFydGlmYWN0c1R5cGVLZXlzID0gYXJ0aWZhY3RUZW1wbGF0ZU1hcC5rZXlTZXQoKTsKKwkJCU1hcDxTdHJpbmcsIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBhcnRpZmFjdHNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+PigpOworCQkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gYWxsR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKFN0cmluZyBhcnRpZmFjdHNUeXBlS2V5IDogYXJ0aWZhY3RzVHlwZUtleXMpIHsKKworCQkJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gbyA9IGFydGlmYWN0VGVtcGxhdGVNYXAuZ2V0KGFydGlmYWN0c1R5cGVLZXkpOworCQkJCUVpdGhlcjxMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiwgUmVzcG9uc2VGb3JtYXQ+IGFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdFBhaXJTdGF0dXMgPSBjcmVhdGVBcnRpZmFjdFRlbXBsYXRlSW5mb01vZHVsZShhcnRpZmFjdHNUeXBlS2V5LCBvKTsKKwkJCQlpZiAoYXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0UGFpclN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCAgZmlsZSBpcyBub3QgaW4gZXhwZWN0ZWQgZm9ybWF0ciwgZmlsZU5hbWUgIHt9IiwgYXJ0aWZhY3RGaWxlTmFtZSk7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiQXJ0aWZhY3QgIGZpbGUgaXMgbm90IGluIGV4cGVjdGVkIGZvcm1hdCwgZmlsZU5hbWUgIiArIGFydGlmYWN0RmlsZU5hbWUsICJBcnRpZmFjdCBpbnRlcm5hbHMgYXJlIGludmFsaWQiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChhcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3RQYWlyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IGFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdCA9IGFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdFBhaXJTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQkJaWYgKGFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdCA9PSBudWxsKSB7CisJCQkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3QgIGZpbGUgaXMgbm90IGluIGV4cGVjdGVkIGZvcm1hdHIsIGZpbGVOYW1lICB7fSIsIGFydGlmYWN0RmlsZU5hbWUpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXQsIGZpbGVOYW1lICIgKyBhcnRpZmFjdEZpbGVOYW1lLCAiQXJ0aWZhY3QgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DU0FSX0lOVkFMSURfRk9STUFULCBhcnRpZmFjdEZpbGVOYW1lKSk7CisKKwkJCQl9CisJCQkJYWxsR3JvdXBzLmFkZEFsbChhcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3QpOworCQkJCWFydGlmYWN0c01hcC5wdXQoYXJ0aWZhY3RzVHlwZUtleSwgYXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0KTsKKwkJCX0KKwkJCWludCBjb3VudGVyID0gZ3JvdXBCdXNpbmVzc0xvZ2ljLmdldE5leHRWZk1vZHVsZU5hbWVDb3VudGVyKHJlc291cmNlLmdldEdyb3VwcygpKTsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVHcm91cE5hbWVzUmVzID0gZ3JvdXBCdXNpbmVzc0xvZ2ljLnZhbGlkYXRlR2VuZXJhdGVWZk1vZHVsZUdyb3VwTmFtZXMoYWxsR3JvdXBzLCByZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCksIGNvdW50ZXIpOworCQkJaWYgKHZhbGlkYXRlR3JvdXBOYW1lc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlR3JvdXBOYW1lc1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGFydGlmYWN0c01hcCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXQsIGZpbGVOYW1lICB7fSIsIGFydGlmYWN0RmlsZU5hbWUpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgd2l0aCBleGNlcHRpb24uIiwgZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoIkFydGlmYWN0ICBmaWxlIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXQsIGZpbGVOYW1lICIgKyBhcnRpZmFjdEZpbGVOYW1lLCAiQXJ0aWZhY3QgaW50ZXJuYWxzIGFyZSBpbnZhbGlkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElEX0ZPUk1BVCwgYXJ0aWZhY3RGaWxlTmFtZSkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUFydGlmYWN0VGVtcGxhdGVJbmZvTW9kdWxlKFN0cmluZyBhcnRpZmFjdHNUeXBlS2V5LCBMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGpzb25PYmplY3QpIHsKKwkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gYXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0ID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4oKTsKKwkJZm9yIChNYXA8U3RyaW5nLCBPYmplY3Q+IG8gOiBqc29uT2JqZWN0KSB7CisJCQlFaXRoZXI8QXJ0aWZhY3RUZW1wbGF0ZUluZm8sIFJlc3BvbnNlRm9ybWF0PiBhcnRpZmFjdHRlbXBsYXRlSW5mb1N0YXR1cyA9IEFydGlmYWN0VGVtcGxhdGVJbmZvLmNyZWF0ZUFydGlmYWN0VGVtcGxhdGVJbmZvRnJvbUpzb24oY29tcG9uZW50c1V0aWxzLCBhcnRpZmFjdHNUeXBlS2V5LCBvLCBhcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3QsIG51bGwpOworCQkJaWYgKGFydGlmYWN0dGVtcGxhdGVJbmZvU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYXJ0aWZhY3R0ZW1wbGF0ZUluZm9TdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJQXJ0aWZhY3RUZW1wbGF0ZUluZm8gYXJ0aWZhY3R0ZW1wbGF0ZUluZm8gPSBhcnRpZmFjdHRlbXBsYXRlSW5mb1N0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChhcnRpZmFjdHRlbXBsYXRlSW5mbyAhPSBudWxsKSB7CisJCQkJYXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0LmFkZChhcnRpZmFjdHRlbXBsYXRlSW5mbyk7CisJCQl9CisKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoYXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0KTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlSW5zdGFuY2VzUmVsYXRpb25zKFVzZXIgdXNlciwgU3RyaW5nIHlhbWxOYW1lLCBSZXNvdXJjZSByZXNvdXJjZSwgTWFwPFN0cmluZywgVXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvPiB1cGxvYWRSZXNJbnN0YW5jZXNNYXAsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaykgeworCQlsb2cuZGVidWcoImNyZWF0ZVJlc291cmNlSW5zdGFuY2VzUmVsYXRpb25zIHRyeSB0byBjcmVhdGUgcmVsYXRpb25zICIpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXNMaXN0ID0gcmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWlmICh1cGxvYWRSZXNJbnN0YW5jZXNNYXAgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8gaXMgZW1wdHksIGZpbGVOYW1lICB7fSIsIHlhbWxOYW1lKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbERhdGFFcnJvcigiVXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvIGlzIGVtdHksIGZpbGVOYW1lICB7fSIsIHlhbWxOYW1lLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSwgeWFtbE5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzTGlzdCA9PSBudWxsIHx8IGNvbXBvbmVudEluc3RhbmNlc0xpc3QuaXNFbXB0eSgpKSB7CisJCQlsb2cuZGVidWcoImNvbXBvbmVudEluc3RhbmNlc0xpc3QgaXMgZW1wdHkgaW4gcmVzb3VyY2Uge30gIiwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoImNvbXBvbmVudEluc3RhbmNlc0xpc3QgaXMgZW1wdHkgaW4gcmVzb3VyY2Uge30gIiwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT1RfVE9QT0xPR1lfVE9TQ0FfVEVNUExBVEUsIHlhbWxOYW1lKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+PiBwcm9wZXJ0aWVzTGlzdFBlclJlc291cmNlID0gbmV3IEhhc2hNYXA8PigpOworCisJCWxvbmcgdG90YWxDcmVhdGVSZWwgPSAwOworCQlsb25nIHRvdGFsQ3JlYXRlUHJvcFZhbCA9IDA7CisJCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgVXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvPj4gbm9kZXNJbmZvVmFsdWUgPSB1cGxvYWRSZXNJbnN0YW5jZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAobm9kZXNJbmZvVmFsdWUuaGFzTmV4dCgpKSB7CisJCQlFbnRyeTxTdHJpbmcsIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbz4gdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvRW50cnkgPSBub2Rlc0luZm9WYWx1ZS5uZXh0KCk7CisJCQlVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8gdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvID0gdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvRW50cnkuZ2V0VmFsdWUoKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2UgY3VycmVudENvbXBJbnN0YW5jZSA9IG51bGw7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0YW5jZSA6IGNvbXBvbmVudEluc3RhbmNlc0xpc3QpIHsKKwkJCQlpZiAoY29tcEluc3RhbmNlLmdldE5hbWUoKS5lcXVhbHModXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldE5hbWUoKSkpIHsKKwkJCQkJY3VycmVudENvbXBJbnN0YW5jZSA9IGNvbXBJbnN0YW5jZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY3VycmVudENvbXBJbnN0YW5jZSA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBuYW1lIHt9ICBpbiByZXNvdXJjZSB7fSAiLCB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0TmFtZSgpLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxEYXRhRXJyb3IoImNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG5hbWUgIiArIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCkgKyAiICBpbiByZXNvdXJjZSB7fSAiLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9UX1RPUE9MT0dZX1RPU0NBX1RFTVBMQVRFLCB5YW1sTmFtZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkID0gY3VycmVudENvbXBJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCisJCQlsb2cuZGVidWcoIioqKioqKioqKioqKiogYWRkUHJvcGVydHlWYWx1ZXNUb1JpIHN0YXJ0Iik7CisJCQlsb25nIHN0YXJ0QWRkUHJvcGVydHkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkJUmVzcG9uc2VGb3JtYXQgYWRkUHJvcGVydGllc1ZhbHVlVG9SaVJlcyA9IGFkZFByb3BlcnR5VmFsdWVzVG9SaSh1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8sIHJlc291cmNlLCByZXNvdXJjZUluc3RhbmNlSWQsIGN1cnJlbnRDb21wSW5zdGFuY2UsIHlhbWxOYW1lLCBwcm9wZXJ0aWVzTGlzdFBlclJlc291cmNlKTsKKwkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKiBhZGRQcm9wZXJ0eVZhbHVlc1RvUmkgZW5kIik7CisJCQl0b3RhbENyZWF0ZVByb3BWYWwgKz0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRBZGRQcm9wZXJ0eSk7CisKKwkJCWlmIChhZGRQcm9wZXJ0aWVzVmFsdWVUb1JpUmVzLmdldFN0YXR1cygpICE9IDIwMCkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYWRkUHJvcGVydGllc1ZhbHVlVG9SaVJlcyk7CisJCQl9CisJCQlNYXA8U3RyaW5nLCBMaXN0PFVwbG9hZFJlcUluZm8+PiByZWdNYXAgPSB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0UmVxdWlyZW1lbnRzKCk7CisJCQlpZiAocmVnTWFwID09IG51bGwpCisJCQkJY29udGludWU7CisJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIExpc3Q8VXBsb2FkUmVxSW5mbz4+PiBub2Rlc1JlZ1ZhbHVlID0gcmVnTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKworCQkJbG9uZyBzdGFydEFkZFJlbGF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCXdoaWxlIChub2Rlc1JlZ1ZhbHVlLmhhc05leHQoKSkgeworCQkJCUVudHJ5PFN0cmluZywgTGlzdDxVcGxvYWRSZXFJbmZvPj4gbm9kZXNSZWdJbmZvRW50cnkgPSBub2Rlc1JlZ1ZhbHVlLm5leHQoKTsKKworCQkJCUxpc3Q8VXBsb2FkUmVxSW5mbz4gdXBsb2FkUmVnSW5mb0xpc3QgPSBub2Rlc1JlZ0luZm9FbnRyeS5nZXRWYWx1ZSgpOworCQkJCWZvciAoVXBsb2FkUmVxSW5mbyB1cGxvYWRSZWdJbmZvIDogdXBsb2FkUmVnSW5mb0xpc3QpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBjcmVhdGUgIHJlbGF0aW9uIHt9IiwgdXBsb2FkUmVnSW5mby5nZXROYW1lKCkpOworCQkJCQlTdHJpbmcgcmVnTmFtZSA9IHVwbG9hZFJlZ0luZm8uZ2V0TmFtZSgpOworCQkJCQlTdHJpbmcgbm9kZUNhcE5hbWUgPSB1cGxvYWRSZWdJbmZvLmdldE5vZGUoKTsKKwkJCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlZ0NhcFJlbERlZiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJCQkJcmVnQ2FwUmVsRGVmLnNldEZyb21Ob2RlKHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQkJCWxvZy5kZWJ1ZygidHJ5IHRvIGZpbmQgYXZhaWxhYmxlIHJlcXVpcmVtZW50IHt9ICIsIHJlZ05hbWUpOworCQkJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVxU3RhdHVzID0gZmluZEF2aWFibGVSZXF1aXJlbWVuKHJlZ05hbWUsIHlhbWxOYW1lLCB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8sIGN1cnJlbnRDb21wSW5zdGFuY2UpOworCQkJCQlpZiAoZWl0aGVyUmVxU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZmluZCBhdmFpbGFibGUgcmVxdWlyZW1lbnQge30gc3RhdHVzIGlzIHt9IiwgcmVnTmFtZSwgZWl0aGVyUmVxU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlclJlcVN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisKKwkJCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHZhbGlkUmVxID0gZWl0aGVyUmVxU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVxQW5kUmVsYXRpb25zaGlwUGFpckxpc3QgPSByZWdDYXBSZWxEZWYuZ2V0UmVsYXRpb25zaGlwcygpOworCQkJCQlpZiAocmVxQW5kUmVsYXRpb25zaGlwUGFpckxpc3QgPT0gbnVsbCkKKwkJCQkJCXJlcUFuZFJlbGF0aW9uc2hpcFBhaXJMaXN0ID0gbmV3IEFycmF5TGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+KCk7CisJCQkJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZXFBbmRSZWxhdGlvbnNoaXBQYWlyID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcigpOworCQkJCQlyZXFBbmRSZWxhdGlvbnNoaXBQYWlyLnNldFJlcXVpcmVtZW50KHJlZ05hbWUpOworCQkJCQlyZXFBbmRSZWxhdGlvbnNoaXBQYWlyLnNldFJlcXVpcmVtZW50T3duZXJJZCh2YWxpZFJlcS5nZXRPd25lcklkKCkpOworCQkJCQlyZXFBbmRSZWxhdGlvbnNoaXBQYWlyLnNldFJlcXVpcmVtZW50VWlkKHZhbGlkUmVxLmdldFVuaXF1ZUlkKCkpOworCisJCQkJCUNvbXBvbmVudEluc3RhbmNlIGN1cnJlbnRDYXBDb21wSW5zdGFuY2UgPSBudWxsOworCQkJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0YW5jZSA6IGNvbXBvbmVudEluc3RhbmNlc0xpc3QpIHsKKwkJCQkJCWlmIChjb21wSW5zdGFuY2UuZ2V0TmFtZSgpLmVxdWFscyh1cGxvYWRSZWdJbmZvLmdldE5vZGUoKSkpIHsKKwkJCQkJCQljdXJyZW50Q2FwQ29tcEluc3RhbmNlID0gY29tcEluc3RhbmNlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGN1cnJlbnRDYXBDb21wSW5zdGFuY2UgPT0gbnVsbCkgeworCQkJCQkJbG9nLmRlYnVnKCJjb21wb25lbnQgaW5zdGFuY2UgIHdpdGggbmFtZSB7fSAgaW4gcmVzb3VyY2Uge30gIiwgdXBsb2FkUmVnSW5mby5nZXROb2RlKCksIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBuYW1lICIgKyB1cGxvYWRSZWdJbmZvLmdldE5vZGUoKSArICIgIGluIHJlc291cmNlIHt9ICIsIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSwgeWFtbE5hbWUpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCX0KKwkJCQkJcmVnQ2FwUmVsRGVmLnNldFRvTm9kZShjdXJyZW50Q2FwQ29tcEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJCQlsb2cuZGVidWcoInRyeSB0byBmaW5kIGF2aWFibGUgQ2FwYWJpbGl0eSAgcmVxIG5hbWUgaXMge30gIiwgdmFsaWRSZXEuZ2V0TmFtZSgpKTsKKwkJCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gYXZpYWJsZUNhcEZvclJlbCA9IGZpbmRBdmFpbGFibGVDYXBhYmlsaXR5QnlUeXBlT3JOYW1lKHZhbGlkUmVxLCBjdXJyZW50Q2FwQ29tcEluc3RhbmNlLCB1cGxvYWRSZWdJbmZvKTsKKwkJCQkJaWYgKGF2aWFibGVDYXBGb3JSZWwgPT0gbnVsbCkgeworCQkJCQkJbG9nLmRlYnVnKCJhdmlhYmxlIGNhcGFiaWxpdHkgd2FzIG5vdCBmb3VuZC4gcmVxIG5hbWUgaXMge30gY29tcG9uZW50IGluc3RhbmNlIGlzIHt9IiwgdmFsaWRSZXEuZ2V0TmFtZSgpLCBjdXJyZW50Q2FwQ29tcEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJhdmlhYmxlIGNhcGFiaWxpdHkgd2FzIG5vdCBmb3VuZC4gcmVxIG5hbWUgaXMgIiArIHZhbGlkUmVxLmdldE5hbWUoKSArICIgY29tcG9uZW50IGluc3RhbmNlIGlzICIgKyBjdXJyZW50Q2FwQ29tcEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHJlc291cmNlLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCUVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSwgeWFtbE5hbWUpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCX0KKwkJCQkJcmVxQW5kUmVsYXRpb25zaGlwUGFpci5zZXRDYXBhYmlsaXR5KGF2aWFibGVDYXBGb3JSZWwuZ2V0TmFtZSgpKTsKKwkJCQkJcmVxQW5kUmVsYXRpb25zaGlwUGFpci5zZXRDYXBhYmlsaXR5VWlkKGF2aWFibGVDYXBGb3JSZWwuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCXJlcUFuZFJlbGF0aW9uc2hpcFBhaXIuc2V0Q2FwYWJpbGl0eU93bmVySWQoYXZpYWJsZUNhcEZvclJlbC5nZXRPd25lcklkKCkpOworCQkJCQlyZXFBbmRSZWxhdGlvbnNoaXBQYWlyTGlzdC5hZGQocmVxQW5kUmVsYXRpb25zaGlwUGFpcik7CisJCQkJCXJlZ0NhcFJlbERlZi5zZXRSZWxhdGlvbnNoaXBzKHJlcUFuZFJlbGF0aW9uc2hpcFBhaXJMaXN0KTsKKwkJCQkJQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEluc3RhbmNlQkwgPSBnZXRDb21wb25lbnRJbnN0YW5jZUJMKCk7CisJCQkJCUVpdGhlcjxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZWxhdGlvblJlcyA9IGNvbXBvbmVudEluc3RhbmNlQkwuYXNzb2NpYXRlUklUb1JJT25HcmFwaChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCByZWdDYXBSZWxEZWYsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBpblRyYW5zYWN0aW9uKTsKKwkJCQkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqIGZpbmlzaGVkIHRvIGNyZWF0ZSAgcmVsYXRpb24ge30iLCB1cGxvYWRSZWdJbmZvLmdldE5hbWUoKSk7CisJCQkJCWlmIChlaXRoZXJSZWxhdGlvblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGFzc29jaWF0ZSByaSB7fSB0byByaSB7fSIsIHJlZ0NhcFJlbERlZi5nZXRGcm9tTm9kZSgpLCByZWdDYXBSZWxEZWYuZ2V0VG9Ob2RlKCkpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJSZWxhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKwkJCXRvdGFsQ3JlYXRlUmVsICs9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0QWRkUmVsYXRpb24pOworCQl9CisJCS8qCisJCSAqIExpc3Q8SW5wdXREZWZpbml0aW9uPiBpbnB1dHMgPSByZXNvdXJjZS5nZXRJbnB1dHMoKTsgZm9yKElucHV0RGVmaW5pdGlvbiBpbnB1dDogaW5wdXRzKXsgaWYoaW5wdXQuZ2V0UHJvcGVydGllcygpICE9IG51bGwpeyB0aGlzLmlucHV0T3BlcmF0aW9uLmFzc29jaWF0ZVByb3BlcnRpZXNUb0lucHV0T25HcmFwaChpbnB1dC4gZ2V0VW5pcXVlSWQoKSwgaW5wdXQuZ2V0UHJvcGVydGllcygpKTsgfSB9CisJCSAqLworCisJCS8vIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyR2VyUmVzb3VyY2UgPQorCQkvLyByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBpblRyYW5zYWN0aW9uKTsKKwkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqIGNyZWF0ZSByZWxhdGlvbnMgdG9vayA6IGNyZWF0ZSB7fSwgYWRkIHByb3BlcnR5IHZhbHVlIHt9IiwgdG90YWxDcmVhdGVSZWwsIHRvdGFsQ3JlYXRlUHJvcFZhbCk7CisJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKiBpbiBjcmVhdGUgcmVsYXRpb25zLCBnZXRSZXNvdXJjZSBzdGFydCIpOworCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBwYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQlwYXJhbWV0ZXJzVmlldy5kaXNhYmxlQWxsKCk7CisJCXBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUNvbXBvbmVudEluc3RhbmNlcyhmYWxzZSk7CisJCXBhcmFtZXRlcnNWaWV3LnNldElnbm9yZVVzZXJzKGZhbHNlKTsKKwkJcGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQXJ0aWZhY3RzKGZhbHNlKTsKKwkJcGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlR3JvdXBzKGZhbHNlKTsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJHZXJSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldENvbXBvbmVudChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBwYXJhbWV0ZXJzVmlldywgaW5UcmFuc2FjdGlvbik7CisJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKiBpbiBjcmVhdGUgcmVsYXRpb25zLCBnZXRSZXNvdXJjZSBlbmQiKTsKKwkJaWYgKGVpdGhlckdlclJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShlaXRoZXJHZXJSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZSk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGVpdGhlckdlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIFJlc3BvbnNlRm9ybWF0IGFkZFByb3BlcnR5VmFsdWVzVG9SaShVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8gdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLCBSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgQ29tcG9uZW50SW5zdGFuY2UgY3VycmVudENvbXBJbnN0YW5jZSwgU3RyaW5nIHlhbWxOYW1lLAorCQkJTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+PiBwcm9wZXJ0aWVzTGlzdFBlclJlc291cmNlKSB7CisKKwkJTWFwPFN0cmluZywgTGlzdDxVcGxvYWRQcm9wSW5mbz4+IHByb3BNYXAgPSB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0UHJvcGVydGllcygpOworCQlpZiAocHJvcE1hcCAhPSBudWxsICYmIHByb3BNYXAuc2l6ZSgpID4gMCkgeworCQkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBjdXJyUHJvcGVydGllc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPigpOworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURlZmluaXRpb24+KCk7CisJCQlJbnRlZ2VyIGluZGV4ID0gY3VycmVudENvbXBJbnN0YW5jZS5nZXRQcm9wZXJ0eVZhbHVlQ291bnRlcigpOworCQkJSW50ZWdlciBpbmRleElucHV0ID0gY3VycmVudENvbXBJbnN0YW5jZS5nZXRJbnB1dFZhbHVlQ291bnRlcigpOworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IGxpc3RGcm9tTWFwID0gcHJvcGVydGllc0xpc3RQZXJSZXNvdXJjZS5nZXQoY3VycmVudENvbXBJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKSk7CisJCQlpZiAobGlzdEZyb21NYXAgIT0gbnVsbCkgeworCQkJCXByb3BlcnRpZXNMaXN0ID0gbGlzdEZyb21NYXA7CisJCQl9IGVsc2UgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGdldFByb3BlcnR5UmVzID0gKChQcm9wZXJ0eU9wZXJhdGlvbikgcHJvcGVydHlPcGVyYXRpb24pLmZpbmRBbGxSZXNvdXJjZVByb3BlcnRpZXNSZWN1cnNpdmVseShjdXJyZW50Q29tcEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpLCBwcm9wZXJ0aWVzTGlzdCk7CisJCQkJaWYgKCFnZXRQcm9wZXJ0eVJlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGZpbmQgcHJvcGVydGllcyBvZiByZXNvdXJjZSB7fSBzdGF0dXMgaXMge30iLCBjdXJyZW50Q29tcEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpLCBnZXRQcm9wZXJ0eVJlcyk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGdldFByb3BlcnR5UmVzKSksIHlhbWxOYW1lKTsKKwkJCQkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCQkJCX0KKwkJCQlwcm9wZXJ0aWVzTGlzdFBlclJlc291cmNlLnB1dChjdXJyZW50Q29tcEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpLCBwcm9wZXJ0aWVzTGlzdCk7CisJCQl9CisJCQlpZiAocHJvcGVydGllc0xpc3Quc2l6ZSgpID4gMCkgeworCQkJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3AgOiBwcm9wZXJ0aWVzTGlzdCkgeworCQkJCQlTdHJpbmcgcHJvcE5hbWUgPSBwcm9wLmdldE5hbWUoKTsKKwkJCQkJaWYgKCFjdXJyUHJvcGVydGllc01hcC5jb250YWluc0tleShwcm9wTmFtZSkpIHsKKwkJCQkJCWN1cnJQcm9wZXJ0aWVzTWFwLnB1dChwcm9wTmFtZSwgcHJvcCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZm9yIChMaXN0PFVwbG9hZFByb3BJbmZvPiBwcm9wZXJ0eUxpc3QgOiBwcm9wTWFwLnZhbHVlcygpKSB7CisJCQkJCVVwbG9hZFByb3BJbmZvIHByb3BlcnR5SW5mbyA9IHByb3BlcnR5TGlzdC5nZXQoMCk7CisJCQkJCVN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5SW5mby5nZXROYW1lKCk7CisJCQkJCWlmICghY3VyclByb3BlcnRpZXNNYXAuY29udGFpbnNLZXkocHJvcE5hbWUpKSB7CisJCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBmaW5kIHByb3BlcnR5IHt9ICIsIHByb3BOYW1lKTsKKwkJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5QUk9QRVJUWV9OT1RfRk9VTkQsIHByb3BOYW1lKTsKKwkJCQkJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKwkJCQkJfQorCQkJCQlQcm9wZXJ0eURlZmluaXRpb24gY3VyUHJvcGVydHlEZWYgPSBjdXJyUHJvcGVydGllc01hcC5nZXQocHJvcE5hbWUpOworCQkJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BlcnR5ID0gbnVsbDsKKwkJCQkJQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBpbnB1dFZhbHVlID0gbnVsbDsKKwkJCQkJLy8gVE9ETworCQkJCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQkJCQlMaXN0PEdldElucHV0VmFsdWVJbmZvPiBnZXRJbnB1dHMgPSBudWxsOworCQkJCQlib29sZWFuIGlzVmFsaWRhdGUgPSB0cnVlOworCQkJCQlpZiAocHJvcGVydHlJbmZvLmdldFZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQkJZ2V0SW5wdXRzID0gcHJvcGVydHlJbmZvLmdldEdldF9pbnB1dCgpOworCQkJCQkJaXNWYWxpZGF0ZSA9IGdldElucHV0cyA9PSBudWxsIHx8IGdldElucHV0cy5pc0VtcHR5KCk7CisJCQkJCQlpZiAoaXNWYWxpZGF0ZSkgeworCQkJCQkJCXZhbHVlID0gSW1wb3J0VXRpbHMuZ2V0UHJvcGVydHlKc29uU3RyaW5nVmFsdWUocHJvcGVydHlJbmZvLmdldFZhbHVlKCksIGN1clByb3BlcnR5RGVmLmdldFR5cGUoKSk7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQl2YWx1ZSA9IEltcG9ydFV0aWxzLmdldFByb3BlcnR5SnNvblN0cmluZ1ZhbHVlKHByb3BlcnR5SW5mby5nZXRWYWx1ZSgpLCBUb3NjYVRhZ05hbWVzRW51bS5HRVRfSU5QVVQuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQkJCX0KKworCQkJCQlwcm9wZXJ0eSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KGN1clByb3BlcnR5RGVmLCB2YWx1ZSwgbnVsbCk7CisKKwkJCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmFkZFByb3BlcnR5VmFsdWVUb1Jlc291cmNlSW5zdGFuY2UocHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgaXNWYWxpZGF0ZSwgaW5kZXgsIHRydWUpOworCQkJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHZhbHVlIHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9IiwgcHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJcmV0dXJuIGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShhY3Rpb25TdGF0dXMsIGN1cnJlbnRDb21wSW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJCQkJfQorCQkJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaW5jcmVhc2VDb3VudGVyUmVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uaW5jcmVhc2VBbmRHZXRSZXNvdXJjZUluc3RhbmNlU3BlY2lmaWNDb3VudGVyKHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUWV9DT1VOVEVSLCB0cnVlKTsKKwkJCQkJaWYgKGluY3JlYXNlQ291bnRlclJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGluY3JlYXNlIHJlc291cmNlIHByb3BlcnR5IGNvdW50ZXIge30gdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBwcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2VGb3JSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkoaW5jcmVhc2VDb3VudGVyUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0Rm9yUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KGFjdGlvblN0YXR1cywgY3VycmVudENvbXBJbnN0YW5jZS5nZXROYW1lKCkpOworCQkJCQl9CisJCQkJCWluZGV4ID0gaW5jcmVhc2VDb3VudGVyUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQlpZiAoZ2V0SW5wdXRzICE9IG51bGwgJiYgIWdldElucHV0cy5pc0VtcHR5KCkpIHsKKwkJCQkJCWZvciAoR2V0SW5wdXRWYWx1ZUluZm8gZ2V0SW5wdXQgOiBnZXRJbnB1dHMpIHsKKwkJCQkJCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzID0gcmVzb3VyY2UuZ2V0SW5wdXRzKCk7CisJCQkJCQkJaWYgKGlucHV0cyA9PSBudWxsIHx8IGlucHV0cy5pc0VtcHR5KCkpIHsKKwkJCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9LiBJbnB1dHMgbGlzdCBpcyBlbXB0eSAiLCBwcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQkJCQkJcmV0dXJuIGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlPcHRpb25hbDxJbnB1dERlZmluaXRpb24+IG9wdGlvbmFsID0gaW5wdXRzLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0TmFtZSgpLmVxdWFscyhnZXRJbnB1dC5nZXRJbnB1dE5hbWUoKSkpLmZpbmRBbnkoKTsKKwkJCQkJCQlpZiAoIW9wdGlvbmFsLmlzUHJlc2VudCgpKSB7CisJCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgaW5wdXQge30gIiwgZ2V0SW5wdXQuZ2V0SW5wdXROYW1lKCkpOworCQkJCQkJCQkvLyBAQFRPRE8gZXJyb3IgbWVzc2FnZQorCQkJCQkJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJCQkJCX0KKwkJCQkJCQlJbnB1dERlZmluaXRpb24gaW5wdXQgPSBvcHRpb25hbC5nZXQoKTsKKwkJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBpbnB1dE9wZXJhdGlvbi5hc3NvY2lhdGVQcm9wZXJ0eVRvSW5wdXQocmVzb3VyY2VJbnN0YW5jZUlkLCBpbnB1dC5nZXRVbmlxdWVJZCgpLCByZXN1bHQubGVmdCgpLnZhbHVlKCksIGdldElucHV0KTsKKwkJCQkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSBpbnB1dCB7fSB0cCBwcm9wZXJ0eSAgdmFsdWV7fSAiLCBnZXRJbnB1dC5nZXRJbnB1dE5hbWUoKSwgcmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldFZhbHVlVW5pcXVlVWlkKCkpOworCQkJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKSwgeWFtbE5hbWUpOworCQkJCQkJCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisJCQkJCQkJfQorCQkJCQkJCUdldElucHV0VmFsdWVJbmZvIGdldElucHV0SW5kZXggPSBnZXRJbnB1dC5nZXRHZXRJbnB1dEluZGV4KCk7CisJCQkJCQkJaWYgKGdldElucHV0SW5kZXggIT0gbnVsbCkgeworCQkJCQkJCQlvcHRpb25hbCA9IGlucHV0cy5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoZ2V0SW5wdXRJbmRleC5nZXRJbnB1dE5hbWUoKSkpLmZpbmRBbnkoKTsKKwkJCQkJCQkJaWYgKCFvcHRpb25hbC5pc1ByZXNlbnQoKSkgeworCQkJCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmluZCBpbnB1dCB7fSAiLCBnZXRJbnB1dEluZGV4LmdldElucHV0TmFtZSgpKTsKKwkJCQkJCQkJCS8vIEBAVE9ETyBlcnJvciBtZXNzYWdlCisJCQkJCQkJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJCQkJCQl9CisJCQkJCQkJCUlucHV0RGVmaW5pdGlvbiBpbnB1dEluZGV4ID0gb3B0aW9uYWwuZ2V0KCk7CisJCQkJCQkJCXN0YXR1cyA9IGlucHV0T3BlcmF0aW9uLmFzc29jaWF0ZVByb3BlcnR5VG9JbnB1dChyZXNvdXJjZUluc3RhbmNlSWQsIGlucHV0SW5kZXguZ2V0VW5pcXVlSWQoKSwgcmVzdWx0LmxlZnQoKS52YWx1ZSgpLCBnZXRJbnB1dEluZGV4KTsKKwkJCQkJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGlucHV0IHt9IHRwIHByb3BlcnR5ICB2YWx1ZXt9ICIsIGdldElucHV0LmdldElucHV0TmFtZSgpLCByZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0VmFsdWVVbmlxdWVVaWQoKSk7CisJCQkJCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKSwgeWFtbE5hbWUpOworCQkJCQkJCQkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCQkJCQkJCQl9CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwl9CisKKwkvLyBVUzc0MDgyMCBSZWxhdGUgUklzIGFjY29yZGluZyB0byBjYXBhYmlsaXR5IG5hbWUKKwlwcml2YXRlIENhcGFiaWxpdHlEZWZpbml0aW9uIGZpbmRBdmFpbGFibGVDYXBhYmlsaXR5QnlUeXBlT3JOYW1lKFJlcXVpcmVtZW50RGVmaW5pdGlvbiB2YWxpZFJlcSwgQ29tcG9uZW50SW5zdGFuY2UgY3VycmVudENhcENvbXBJbnN0YW5jZSwgVXBsb2FkUmVxSW5mbyB1cGxvYWRSZXFJbmZvKSB7CisJCWlmIChudWxsID09IHVwbG9hZFJlcUluZm8uZ2V0Q2FwYWJpbGl0eU5hbWUoKSB8fCB2YWxpZFJlcS5nZXRDYXBhYmlsaXR5KCkuZXF1YWxzKHVwbG9hZFJlcUluZm8uZ2V0Q2FwYWJpbGl0eU5hbWUoKSkpIHsvLyBnZXQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYnkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2FwYWJpbGl0eQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0eXBlCisJCQlyZXR1cm4gZmluZEF2aWFibGVDYXBhYmlsaXR5KHZhbGlkUmVxLCBjdXJyZW50Q2FwQ29tcEluc3RhbmNlKTsKKwkJfQorCQlyZXR1cm4gZmluZEF2YWlsYWJsZUNhcGFiaWxpdHkodmFsaWRSZXEsIGN1cnJlbnRDYXBDb21wSW5zdGFuY2UsIHVwbG9hZFJlcUluZm8pOworCX0KKworCXByaXZhdGUgQ2FwYWJpbGl0eURlZmluaXRpb24gZmluZEF2YWlsYWJsZUNhcGFiaWxpdHkoUmVxdWlyZW1lbnREZWZpbml0aW9uIHZhbGlkUmVxLCBDb21wb25lbnRJbnN0YW5jZSBjdXJyZW50Q2FwQ29tcEluc3RhbmNlLCBVcGxvYWRSZXFJbmZvIHVwbG9hZFJlcUluZm8pIHsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcE1hcCA9IGN1cnJlbnRDYXBDb21wSW5zdGFuY2UuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWlmICghY2FwTWFwLmNvbnRhaW5zS2V5KHZhbGlkUmVxLmdldENhcGFiaWxpdHkoKSkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCU9wdGlvbmFsPENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBCeU5hbWUgPSBjYXBNYXAuZ2V0KHZhbGlkUmVxLmdldENhcGFiaWxpdHkoKSkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKHVwbG9hZFJlcUluZm8uZ2V0Q2FwYWJpbGl0eU5hbWUoKSkpLmZpbmRBbnkoKTsKKwkJaWYgKCFjYXBCeU5hbWUuaXNQcmVzZW50KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcCA9IGNhcEJ5TmFtZS5nZXQoKTsKKwkJLy8gVE9ETyB0ZW1wb3JhcnkgZml4IC0gcmVtb3ZlIHNwZWNpZmljIGNhcGFiaWxpdHkgbm9kZSB2YWxpZGF0aW9uIC0KKwkJLy8gU3RyaW5nIHJlcU5vZGUgPSB2YWxpZFJlcS5nZXROb2RlKCk7CisJCS8vIGlmIChyZXFOb2RlICE9IG51bGwgJiYgIXJlcU5vZGUuaXNFbXB0eSgpICYmCisJCS8vICFjYXAuZ2V0Q2FwYWJpbGl0eVNvdXJjZXMoKS5jb250YWlucyhyZXFOb2RlKSkgeworCQkvLyByZXR1cm4gbnVsbDsKKwkJLy8gfQorCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25QYWlyID0gZ2V0UmVxUmVsUGFpcihjYXApOworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uaXNBdmFpbGFibGVDYXBhYmlsdHkoY3VycmVudENhcENvbXBJbnN0YW5jZSwgcmVsYXRpb25QYWlyKTsKKwkJaWYgKGVpdGhlclN0YXR1cy5pc1JpZ2h0KCkgfHwgZWl0aGVyU3RhdHVzLmxlZnQoKS52YWx1ZSgpID09IGZhbHNlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gY2FwOworCX0KKworCXByaXZhdGUgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIGdldFJlcVJlbFBhaXIoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwKSB7CisJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvblBhaXIgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCk7CisJCXJlbGF0aW9uUGFpci5zZXRDYXBhYmlsaXR5VWlkKGNhcC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVsYXRpb25QYWlyLnNldENhcGFiaWxpdHkoY2FwLmdldE5hbWUoKSk7CisJCXJlbGF0aW9uUGFpci5zZXRDYXBhYmlsaXR5T3duZXJJZChjYXAuZ2V0T3duZXJJZCgpKTsKKwkJcmV0dXJuIHJlbGF0aW9uUGFpcjsKKwl9CisKKwlwcml2YXRlIENhcGFiaWxpdHlEZWZpbml0aW9uIGZpbmRBdmlhYmxlQ2FwYWJpbGl0eShSZXF1aXJlbWVudERlZmluaXRpb24gdmFsaWRSZXEsIENvbXBvbmVudEluc3RhbmNlIGN1cnJlbnRDYXBDb21wSW5zdGFuY2UpIHsKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gYXZpYWJsZUNhcEZvclJlbCA9IG51bGw7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBNYXAgPSBjdXJyZW50Q2FwQ29tcEluc3RhbmNlLmdldENhcGFiaWxpdGllcygpOworCQlpZiAoY2FwTWFwLmNvbnRhaW5zS2V5KHZhbGlkUmVxLmdldENhcGFiaWxpdHkoKSkpIHsKKwkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcExpc3QgPSBjYXBNYXAuZ2V0KHZhbGlkUmVxLmdldENhcGFiaWxpdHkoKSk7CisKKwkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwIDogY2FwTGlzdCkgeworCQkJCS8vIFRPRE8gdGVtcG9yYXJ5IGZpeCAtIHJlbW92ZSBzcGVjaWZpYyBjYXBhYmlsaXR5IG5vZGUKKwkJCQkvLyBTdHJpbmcgcmVxTm9kZSA9IHZhbGlkUmVxLmdldE5vZGUoKTsKKwkJCQkvLyBpZiAocmVxTm9kZSAhPSBudWxsICYmICFyZXFOb2RlLmlzRW1wdHkoKSkgeworCQkJCS8vIGlmICghY2FwLmdldENhcGFiaWxpdHlTb3VyY2VzKCkuY29udGFpbnMocmVxTm9kZSkpIHsKKwkJCQkvLyBjb250aW51ZTsKKwkJCQkvLyB9CisJCQkJLy8gfQorCisJCQkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uUGFpciA9IGdldFJlcVJlbFBhaXIoY2FwKTsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uaXNBdmFpbGFibGVDYXBhYmlsdHkoY3VycmVudENhcENvbXBJbnN0YW5jZSwgcmVsYXRpb25QYWlyKTsKKwkJCQlpZiAoZWl0aGVyU3RhdHVzLmlzUmlnaHQoKSB8fCBlaXRoZXJTdGF0dXMubGVmdCgpLnZhbHVlKCkgPT0gZmFsc2UpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsc2UgeworCQkJCQlhdmlhYmxlQ2FwRm9yUmVsID0gY2FwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGF2aWFibGVDYXBGb3JSZWw7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZmluZEF2aWFibGVSZXF1aXJlbWVuKFN0cmluZyByZWdOYW1lLCBTdHJpbmcgeWFtbE5hbWUsIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbyB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8sIENvbXBvbmVudEluc3RhbmNlIGN1cnJlbnRDb21wSW5zdGFuY2UpIHsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBjb21JbnN0UmVnRGVmTWFwID0gY3VycmVudENvbXBJbnN0YW5jZS5nZXRSZXF1aXJlbWVudHMoKTsKKworCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4+IHJlZ0xpc3RWYWx1ZSA9IGNvbUluc3RSZWdEZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQlSZXF1aXJlbWVudERlZmluaXRpb24gdmFsaWRSZWdEZWYgPSBudWxsOworCQl3aGlsZSAocmVnTGlzdFZhbHVlLmhhc05leHQoKSkgeworCQkJRW50cnk8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlZ0luZm9FbnRyeSA9IHJlZ0xpc3RWYWx1ZS5uZXh0KCk7CisKKwkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBjb21JbnN0UmVnRGVmTGlzdCA9IHJlZ0luZm9FbnRyeS5nZXRWYWx1ZSgpOworCisJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiBjb21JbnN0UmVnRGVmIDogY29tSW5zdFJlZ0RlZkxpc3QpIHsKKwkJCQlpZiAoIXJlZ05hbWUuZXF1YWxzKGNvbUluc3RSZWdEZWYuZ2V0TmFtZSgpKSkKKwkJCQkJY29udGludWU7CisJCQkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uUGFpciA9IG5ldyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIoKTsKKwkJCQlyZWxhdGlvblBhaXIuc2V0UmVxdWlyZW1lbnRVaWQoY29tSW5zdFJlZ0RlZi5nZXRVbmlxdWVJZCgpKTsKKwkJCQlyZWxhdGlvblBhaXIuc2V0Q2FwYWJpbGl0eShjb21JbnN0UmVnRGVmLmdldENhcGFiaWxpdHkoKSk7CisJCQkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50T3duZXJJZChjb21JbnN0UmVnRGVmLmdldE93bmVySWQoKSk7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclN0YXR1cyA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmlzQXZhaWxhYmxlUmVxdWlyZW1lbnQoY3VycmVudENvbXBJbnN0YW5jZSwgcmVsYXRpb25QYWlyKTsKKwkJCQlpZiAoZWl0aGVyU3RhdHVzLmlzTGVmdCgpICYmIGVpdGhlclN0YXR1cy5sZWZ0KCkudmFsdWUoKSA9PSB0cnVlKSB7CisJCQkJCXZhbGlkUmVnRGVmID0gY29tSW5zdFJlZ0RlZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHZhbGlkUmVnRGVmICE9IG51bGwpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAodmFsaWRSZWdEZWYgPT0gbnVsbCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgeWFtbE5hbWUsIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCksIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbGlkUmVnRGVmKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFBhcnNlZFRvc2NhWWFtbEluZm8sIFJlc3BvbnNlRm9ybWF0PiBwYXJzZVJlc291cmNlSW5mb0Zyb21ZYW1sKFN0cmluZyB5YW1sRmlsZU5hbWUsIFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcmVzb3VyY2VZbWwsIFVzZXIgdXNlcikgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwcGVkVG9zY2FUZW1wbGF0ZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBuZXcgWWFtbCgpLmxvYWQocmVzb3VyY2VZbWwpOworCQlFaXRoZXI8T2JqZWN0LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYUVsZW1lbnRFaXRoZXIgPSBJbXBvcnRVdGlscy5maW5kVG9zY2FFbGVtZW50KG1hcHBlZFRvc2NhVGVtcGxhdGUsIFRvc2NhVGFnTmFtZXNFbnVtLlRPUE9MT0dZX1RFTVBMQVRFLCBUb3NjYUVsZW1lbnRUeXBlRW51bS5BTEwpOworCQlpZiAodG9zY2FFbGVtZW50RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlSW5wdXRzRWl0aGVyID0gY3JlYXRlSW5wdXRzRnJvbVlhbWwoeWFtbEZpbGVOYW1lLCBtYXBwZWRUb3NjYVRlbXBsYXRlLCByZXNvdXJjZSk7CisJCWlmIChjcmVhdGVJbnB1dHNFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNyZWF0ZUlucHV0c0VpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+LCBSZXNwb25zZUZvcm1hdD4gdXBsb2FkUmVzSW5zdGFuY2VzRWl0aGVyID0gY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VJbmZvRnJvbVlhbWwoeWFtbEZpbGVOYW1lLCBtYXBwZWRUb3NjYVRlbXBsYXRlLCByZXNvdXJjZSk7CisJCWlmICh1cGxvYWRSZXNJbnN0YW5jZXNFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHVwbG9hZFJlc0luc3RhbmNlc0VpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBHcm91cERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlR3JvdXBzRnJvbVlhbWwgPSBjcmVhdGVHcm91cHNGcm9tWWFtbCh5YW1sRmlsZU5hbWUsIG1hcHBlZFRvc2NhVGVtcGxhdGUsIHJlc291cmNlKTsKKwkJaWYgKGNyZWF0ZUdyb3Vwc0Zyb21ZYW1sLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjcmVhdGVHcm91cHNGcm9tWWFtbC5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCVBhcnNlZFRvc2NhWWFtbEluZm8gcGFyc2VkVG9zY2FZYW1sSW5mbyA9IG5ldyBQYXJzZWRUb3NjYVlhbWxJbmZvKCk7CisJCXBhcnNlZFRvc2NhWWFtbEluZm8uc2V0SW5wdXRzKGNyZWF0ZUlucHV0c0VpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCXBhcnNlZFRvc2NhWWFtbEluZm8uc2V0SW5zdGFuY2VzKHVwbG9hZFJlc0luc3RhbmNlc0VpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCXBhcnNlZFRvc2NhWWFtbEluZm8uc2V0R3JvdXBzKGNyZWF0ZUdyb3Vwc0Zyb21ZYW1sLmxlZnQoKS52YWx1ZSgpKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocGFyc2VkVG9zY2FZYW1sSW5mbyk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNvdXJjZUluc3RhbmNlcyhVc2VyIHVzZXIsIFN0cmluZyB5YW1sTmFtZSwgUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDxTdHJpbmcsIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbz4gdXBsb2FkUmVzSW5zdGFuY2VzTWFwLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIGJvb2xlYW4gbmVlZExvY2ssCisJCQlNYXA8U3RyaW5nLCBSZXNvdXJjZT4gbm9kZVR5cGVOYW1lc3BhY2VNYXApIHsKKwkJbG9nLmRlYnVnKCJjcmVhdGVSZXNvdXJjZUluc3RhbmNlcyBpcyB7fSAtIGdvaW5nIHRvIGNyZWF0ZSByZXNvdXJjZSBpbnN0YW5zZSBmcm9tIENTQVIiLCB5YW1sTmFtZSk7CisJCWlmICh1cGxvYWRSZXNJbnN0YW5jZXNNYXAgPT0gbnVsbCB8fCB1cGxvYWRSZXNJbnN0YW5jZXNNYXAuaXNFbXB0eSgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9UX1RPUE9MT0dZX1RPU0NBX1RFTVBMQVRFKTsKKworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCQlNYXA8U3RyaW5nLCBSZXNvdXJjZT4gZXhpc3Rpbmdub2RlVHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2U+KCk7CisJCWlmIChub2RlVHlwZU5hbWVzcGFjZU1hcCAhPSBudWxsICYmICFub2RlVHlwZU5hbWVzcGFjZU1hcC5pc0VtcHR5KCkpIHsKKwkJCW5vZGVUeXBlTmFtZXNwYWNlTWFwLmVudHJ5U2V0KCkuc3RyZWFtKCkuZm9yRWFjaCh4IC0+IGV4aXN0aW5nbm9kZVR5cGVNYXAucHV0KHguZ2V0VmFsdWUoKS5nZXRUb3NjYVJlc291cmNlTmFtZSgpLCB4LmdldFZhbHVlKCkpKTsKKwkJfQorCisJCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgVXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvPj4gbm9kZXNJbmZvVmFsdWUgPSB1cGxvYWRSZXNJbnN0YW5jZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAobm9kZXNJbmZvVmFsdWUuaGFzTmV4dCgpKSB7CisJCQlsb2cuZGVidWcoIioqKioqKioqKioqKipHb2luZyB0byBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2VzIHt9IiwgeWFtbE5hbWUpOworCQkJRW50cnk8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+IHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mb0VudHJ5ID0gbm9kZXNJbmZvVmFsdWUubmV4dCgpOworCQkJVXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbyA9IHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mb0VudHJ5LmdldFZhbHVlKCk7CisKKwkJCS8vIHVwZGF0aW5nIHR5cGUgaWYgdGhlIHR5cGUgaXMgbm9kZSB0eXBlIG5hbWUgLSB3ZSBuZWVkIHRvIHRha2UgdGhlCisJCQkvLyB1cGRhdGVkIG5hbWUKKwkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKkdvaW5nIHRvIGNyZWF0ZSByZXNvdXJjZSBpbnN0YW5jZXMge30iLCB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0TmFtZSgpKTsKKwkJCWlmIChub2RlVHlwZU5hbWVzcGFjZU1hcC5jb250YWluc0tleSh1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0VHlwZSgpKSkgeworCQkJCXVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5zZXRUeXBlKG5vZGVUeXBlTmFtZXNwYWNlTWFwLmdldCh1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0VHlwZSgpKS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKwkJCX0KKworCQkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzb3VyY2UgPSB2YWxpZGF0ZVJlc291cmNlSW5zdGFuY2VCZWZvcmVDcmVhdGUoeWFtbE5hbWUsIGluVHJhbnNhY3Rpb24sIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbywgZXhpc3Rpbmdub2RlVHlwZU1hcCk7CisJCQlpZiAoZWl0aGVyUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGVpdGhlclJlc291cmNlOworCQkJfQorCQkJUmVzb3VyY2UgcmVmUmVzb3VyY2UgPSBlaXRoZXJSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2UoKTsKKworCQkJY29tcG9uZW50SW5zdGFuY2Uuc2V0TmFtZSh1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0TmFtZSgpKTsKKwkJCWNvbXBvbmVudEluc3RhbmNlLnNldENvbXBvbmVudFVpZChyZWZSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKworCQkJQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSA9IHJlc291cmNlLmdldENvbXBvbmVudFR5cGUoKTsKKwkJCU5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSA9IGNvbnRhaW5lckNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKTsKKworCQkJaWYgKGNvbnRhaW5lck5vZGVUeXBlLmVxdWFscyhOb2RlVHlwZUVudW0uUmVzb3VyY2UpICYmIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRDYXBhYmlsaXRpZXMoKSAhPSBudWxsKSB7CisJCQkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgUmVzcG9uc2VGb3JtYXQ+IGdldFZhbGlkQ29tcG9uZW50SW5zdGFuY2VDYXBhYmlsaXRpZXNSZXMgPSBnZXRWYWxpZENvbXBvbmVudEluc3RhbmNlQ2FwYWJpbGl0aWVzKHJlZlJlc291cmNlLmdldENhcGFiaWxpdGllcygpLCB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0Q2FwYWJpbGl0aWVzKCkpOworCQkJCWlmIChnZXRWYWxpZENvbXBvbmVudEluc3RhbmNlQ2FwYWJpbGl0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdldFZhbGlkQ29tcG9uZW50SW5zdGFuY2VDYXBhYmlsaXRpZXNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb21wb25lbnRJbnN0YW5jZS5zZXRDYXBhYmlsaXRpZXMoZ2V0VmFsaWRDb21wb25lbnRJbnN0YW5jZUNhcGFiaWxpdGllc1Jlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQkJaWYgKCFleGlzdGluZ25vZGVUeXBlTWFwLmNvbnRhaW5zS2V5KHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpKSB7CisJCQkJbG9nLmRlYnVnKCJjcmVhdGVSZXNvdXJjZUluc3RhbmNlcyAtIG5vdCBmb3VuZCBsYXRlcyB2ZXJzaW9uIGZvciByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIG5hbWUge30gYW5kIHR5cGUgIiwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldE5hbWUoKSwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldFR5cGUoKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgeWFtbE5hbWUsIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCksIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJUmVzb3VyY2Ugb3JpZ1Jlc291cmNlID0gZXhpc3Rpbmdub2RlVHlwZU1hcC5nZXQodXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldFR5cGUoKSk7CisJCQlDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgY29tcG9uZW50SW5zdGFuY2VCTCA9IGdldENvbXBvbmVudEluc3RhbmNlQkwoKTsKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckNyZWF0ZUNJID0gY29tcG9uZW50SW5zdGFuY2VCTC5jcmVhdGVDb21wb25lbnRJbnN0YW5jZU9uR3JhcGgoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSwgcmVzb3VyY2UsIG9yaWdSZXNvdXJjZSwgY29tcG9uZW50SW5zdGFuY2UsIHVzZXIuZ2V0VXNlcklkKCksIG5lZWRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmIChlaXRoZXJDcmVhdGVDSS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImNyZWF0ZVJlc291cmNlSW5zdGFuY2VzIC0gZmFpbGVkIHRvIGNyZWF0ZSByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIG5hbWUge30gYW5kIHR5cGUgIiwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldE5hbWUoKSwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldFR5cGUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDcmVhdGVDSS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVkQ0kgPSBlaXRoZXJDcmVhdGVDSS5sZWZ0KCkudmFsdWUoKTsKKwkJCWNyZWF0ZWRDSS5zZXROYW1lKHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCkpOworCQkJLyoKKwkJCSAqIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKFN0cmluZyBjb250YWluZXJDb21wb25lbnRQYXJhbSwgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbnRhaW5lckNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIGJvb2xlYW4gbmVlZExvY2spCisJCQkgKi8KKwkJCWVpdGhlckNyZWF0ZUNJID0gY29tcG9uZW50SW5zdGFuY2VCTC51cGRhdGVDb21wb25lbnRJbnN0YW5jZShDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FLCByZXNvdXJjZSwgb3JpZ1Jlc291cmNlLCBjcmVhdGVkQ0kuZ2V0VW5pcXVlSWQoKSwgY3JlYXRlZENJLCBuZWVkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoZWl0aGVyQ3JlYXRlQ0kuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJjcmVhdGVSZXNvdXJjZUluc3RhbmNlcyAtIGZhaWxlZCB0byB1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2Ugd2l0aCBuYW1lIHt9IGFuZCB0eXBlICIsIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCksIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyQ3JlYXRlQ0kucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiKioqKioqKioqKioqKmZpbmlzaGVkIHRvIGNyZWF0ZSBhbmQgdXBkYXRlIHJlc291cmNlIGluc3RhbmNlcyB7fSIsIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCkpOworCisJCX0KKwkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqR29pbmcgdG8gZ2V0IHJlc291cmNlIHt9IiwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IHBhcmFtZXRlcnNWaWV3ID0gbmV3IENvbXBvbmVudFBhcmFtZXRlcnNWaWV3KCk7CisJCXBhcmFtZXRlcnNWaWV3LmRpc2FibGVBbGwoKTsKKwkJcGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQ29tcG9uZW50SW5zdGFuY2VzKGZhbHNlKTsKKwkJcGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlVXNlcnMoZmFsc2UpOworCQlwYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVJbnB1dHMoZmFsc2UpOyAvLyBpbnB1dHMgYXJlIHJlYWQgd2hlbiBjcmVhdGluZworCQkJCQkJCQkJCQkJLy8gcHJvcGVydHkgdmFsdWVzIG9uIGluc3RhbmNlcworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckdlclJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0Q29tcG9uZW50KHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHBhcmFtZXRlcnNWaWV3LCBpblRyYW5zYWN0aW9uKTsKKwkJbG9nLmRlYnVnKCIqKioqKioqKioqKioqZmluaXNoZWQgdG8gZ2V0IHJlc291cmNlIHt9IiwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWlmIChlaXRoZXJHZXJSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZWl0aGVyR2VyUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2UpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKworCQl9CisKKwkJaWYgKGVpdGhlckdlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldENvbXBvbmVudEluc3RhbmNlcygpID09IG51bGwgfHwgZWl0aGVyR2VyUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuaXNFbXB0eSgpKSB7CisKKwkJCWxvZy5kZWJ1ZygiRXJyb3Igd2hlbiBjcmVhdGUgcmVzb3VyY2UgaW5jdGFuc2UgZnJvbSBjc2FyLiBDb21wb25lbnRJbnN0YW5jZXMgbGlzdCBlbXB0eSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkVycm9yIHdoZW4gY3JlYXRlIHJlc291cmNlIGluY3RhbnNlIGZyb20gY3Nhci4gQ29tcG9uZW50SW5zdGFuY2VzIGxpc3QgZW1wdHkiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT1RfVE9QT0xPR1lfVE9TQ0FfVEVNUExBVEUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChlaXRoZXJHZXJSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlSW5zdGFuY2VCZWZvcmVDcmVhdGUoU3RyaW5nIHlhbWxOYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbyB1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8sIE1hcDxTdHJpbmcsIFJlc291cmNlPiBub2RlVHlwZU5hbWVzcGFjZU1hcCkgeworCQlsb2cuZGVidWcoInZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZUJlZm9yZUNyZWF0ZSAtIGdvaW5nIHRvIHZhbGlkYXRlIHJlc291cmNlIGluc3RhbmNlIHdpdGggbmFtZSB7fSBhbmQgdHlwZSBiZWZvcmUgY3JlYXRlIiwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldE5hbWUoKSwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldFR5cGUoKSk7CisJCVJlc291cmNlIHJlZlJlc291cmNlID0gbnVsbDsKKwkJaWYgKG5vZGVUeXBlTmFtZXNwYWNlTWFwLmNvbnRhaW5zS2V5KHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpKSB7CisJCQlyZWZSZXNvdXJjZSA9IG5vZGVUeXBlTmFtZXNwYWNlTWFwLmdldCh1cGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uZ2V0VHlwZSgpKTsKKwkJfSBlbHNlIHsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlcnZhbGlkYXRlUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi52YWxpZGF0ZVRvc2NhUmVzb3VyY2VOYW1lRXhpc3RzKHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpOworCQkJaWYgKChlaXRoZXJ2YWxpZGF0ZVJlc291cmNlLmlzUmlnaHQoKSAmJiBlaXRoZXJ2YWxpZGF0ZVJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgfHwgZWl0aGVydmFsaWRhdGVSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSA9PSB0cnVlKSB7CisJCQkJbG9nLmRlYnVnKCJ2YWxpZGF0ZVJlc291cmNlSW5zdGFuY2VCZWZvcmVDcmVhdGUgLSByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIG5hbWUge30gYW5kIHR5cGUgbm90IHZhbGlkIiwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldE5hbWUoKSwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldFR5cGUoKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgeWFtbE5hbWUsIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCksIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmaW5kUmVzb3VyY2VFaXRoZXIgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RDZXJ0aWZpZWRCeVRvc2NhUmVzb3VyY2VOYW1lKHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGZpbmRSZXNvdXJjZUVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoInZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZUJlZm9yZUNyZWF0ZSAtIG5vdCBmb3VuZCBsYXRlcyB2ZXJzaW9uIGZvciByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIG5hbWUge30gYW5kIHR5cGUgIiwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldE5hbWUoKSwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLmdldFR5cGUoKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGZpbmRSZXNvdXJjZUVpdGhlci5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCXJlZlJlc291cmNlID0gZmluZFJlc291cmNlRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJbm9kZVR5cGVOYW1lc3BhY2VNYXAucHV0KHJlZlJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCksIHJlZlJlc291cmNlKTsKKwkJfQorCQlTdHJpbmcgY29tcG9uZW50U3RhdGUgPSByZWZSZXNvdXJjZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3RhdGUoKTsKKwkJaWYgKGNvbXBvbmVudFN0YXRlLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpKSB7CisJCQlsb2cuZGVidWcoInZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZUJlZm9yZUNyZWF0ZSAtIGNvbXBvbmVudCBpbnN0YW5jZSBvZiBjb21wb25lbnQge30gY2FuIG5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgdGhlIGNvbXBvbmVudCBpcyBpbiBhbiBpbGxlZ2FsIHN0YXRlIHt9LiIsIHJlZlJlc291cmNlLmdldE5hbWUoKSwgY29tcG9uZW50U3RhdGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklMTEVHQUxfQ09NUE9ORU5UX1NUQVRFLCByZWZSZXNvdXJjZS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0VmFsdWUoKSwgcmVmUmVzb3VyY2UuZ2V0TmFtZSgpLCBjb21wb25lbnRTdGF0ZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZUVudW0gPSByZWZSZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKTsKKwkJaWYgKHJlc291cmNlVHlwZUVudW0gPT0gUmVzb3VyY2VUeXBlRW51bS5WRikgeworCQkJbG9nLmRlYnVnKCJ2YWxpZGF0ZVJlc291cmNlSW5zdGFuY2VCZWZvcmVDcmVhdGUgLSAgcmVmIHJlc291cmNlIHR5cGUgaXMgICIsIHJlc291cmNlVHlwZUVudW0pOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfTk9ERV9URU1QTEFURSwgeWFtbE5hbWUsIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXROYW1lKCksIHVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5nZXRUeXBlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlZlJlc291cmNlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VzSW5zdGFuY2VJbmZvRnJvbVlhbWwoU3RyaW5nIHlhbWxGaWxlTmFtZSwgTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24sIFJlc291cmNlIHJlc291cmNlKSB7CisJCU1hcDxTdHJpbmcsIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbz4gbW9kdWxlQ29tcG9uZW50SW5zdGFuY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+KCk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQobW9kdWxlQ29tcG9uZW50SW5zdGFuY2VzKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlck5vZGVzVGVtbGF0ZXMgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYU1hcEVsZW1lbnQodG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bS5OT0RFX1RFTVBMQVRFUyk7CisJCWlmIChlaXRoZXJOb2Rlc1RlbWxhdGVzLmlzTGVmdCgpKSB7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb25Ob2RlVGVtcGxhdGVzID0gZWl0aGVyTm9kZXNUZW1sYXRlcy5sZWZ0KCkudmFsdWUoKTsKKworCQkJSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBub2Rlc05hbWVWYWx1ZSA9IGpzb25Ob2RlVGVtcGxhdGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChub2Rlc05hbWVWYWx1ZS5oYXNOZXh0KCkpIHsKKwkJCQlFbnRyeTxTdHJpbmcsIE9iamVjdD4gbm9kZU5hbWVWYWx1ZSA9IG5vZGVzTmFtZVZhbHVlLm5leHQoKTsKKwkJCQlFaXRoZXI8VXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyTm9kZSA9IGNyZWF0ZU1vZHVsZUNvbXBvbmVudEluc3RhbmNlSW5mbyhub2RlTmFtZVZhbHVlLmdldFZhbHVlKCkpOworCQkJCWlmIChlaXRoZXJOb2RlLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuaW5mbygiZXJyb3Igd2hlbiBjcmVhdGluZyBub2RlIHRlbXBsYXRlOnt9LCBmb3IgcmVzb3VyY2U6e30iLCBub2RlTmFtZVZhbHVlLmdldEtleSgpLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlck5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8gdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvID0gZWl0aGVyTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLnNldE5hbWUobm9kZU5hbWVWYWx1ZS5nZXRLZXkoKSk7CisJCQkJCW1vZHVsZUNvbXBvbmVudEluc3RhbmNlcy5wdXQobm9kZU5hbWVWYWx1ZS5nZXRLZXkoKSwgdXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvKTsKKwkJCQl9CisKKwkJCX0KKworCQl9CisJCWlmIChtb2R1bGVDb21wb25lbnRJbnN0YW5jZXMuaXNFbXB0eSgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9UX1RPUE9MT0dZX1RPU0NBX1RFTVBMQVRFLCB5YW1sRmlsZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbywgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU1vZHVsZUNvbXBvbmVudEluc3RhbmNlSW5mbyhPYmplY3Qgbm9kZVRlbXBsYXRlSnNvbikgeworCisJCVVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbyBub2RlVGVtcGxhdGVJbmZvID0gbmV3IFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbygpOworCQlFaXRoZXI8VXBsb2FkQ29tcG9uZW50SW5zdGFuY2VJbmZvLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQobm9kZVRlbXBsYXRlSW5mbyk7CisKKwkJdHJ5IHsKKwkJCWlmIChub2RlVGVtcGxhdGVKc29uIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQkJU3RyaW5nIG5vZGVUZW1wbGF0ZUpzb25TdHJpbmcgPSAoU3RyaW5nKSBub2RlVGVtcGxhdGVKc29uOworCQkJCW5vZGVUZW1wbGF0ZUluZm8uc2V0VHlwZShub2RlVGVtcGxhdGVKc29uU3RyaW5nKTsKKwkJCX0gZWxzZSBpZiAobm9kZVRlbXBsYXRlSnNvbiBpbnN0YW5jZW9mIE1hcCkgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbm9kZVRlbXBsYXRlSnNvbk1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBub2RlVGVtcGxhdGVKc29uOworCQkJCS8vIFR5cGUKKwkJCQlpZiAobm9kZVRlbXBsYXRlSnNvbk1hcC5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5UWVBFLmdldEVsZW1lbnROYW1lKCkpKSB7CisJCQkJCW5vZGVUZW1wbGF0ZUluZm8uc2V0VHlwZSgoU3RyaW5nKSBub2RlVGVtcGxhdGVKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5UWVBFLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCQl9CisKKwkJCQlpZiAobm9kZVRlbXBsYXRlSnNvbk1hcC5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5SRVFVSVJFTUVOVFMuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUmVxSW5mbz4+LCBSZXNwb25zZUZvcm1hdD4gcmVnUmVzcG9uc2UgPSBjcmVhdGVSZXFNb2R1bGVGcm9tWWFtbChub2RlVGVtcGxhdGVJbmZvLCBub2RlVGVtcGxhdGVKc29uTWFwKTsKKwkJCQkJaWYgKHJlZ1Jlc3BvbnNlLmlzUmlnaHQoKSkKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVnUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJaWYgKHJlZ1Jlc3BvbnNlLmxlZnQoKS52YWx1ZSgpLnNpemUoKSA+IDApIHsKKwkJCQkJCW5vZGVUZW1wbGF0ZUluZm8uc2V0UmVxdWlyZW1lbnRzKHJlZ1Jlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChub2RlVGVtcGxhdGVKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLkNBUEFCSUxJVElFUy5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxVcGxvYWRDYXBJbmZvPj4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDYXBSZXMgPSBjcmVhdGVDYXBNb2R1bGVGcm9tWWFtbChub2RlVGVtcGxhdGVJbmZvLCBub2RlVGVtcGxhdGVKc29uTWFwKTsKKwkJCQkJaWYgKGVpdGhlckNhcFJlcy5pc1JpZ2h0KCkpCisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlckNhcFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlpZiAoZWl0aGVyQ2FwUmVzLmxlZnQoKS52YWx1ZSgpLnNpemUoKSA+IDApIHsKKwkJCQkJCW5vZGVUZW1wbGF0ZUluZm8uc2V0Q2FwYWJpbGl0aWVzKGVpdGhlckNhcFJlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKG5vZGVUZW1wbGF0ZUpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uUFJPUEVSVElFUy5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxVcGxvYWRQcm9wSW5mbz4+LCBSZXNwb25zZUZvcm1hdD4gcmVnUmVzcG9uc2UgPSBjcmVhdGVQcm9wTW9kdWxlRnJvbVlhbWwobm9kZVRlbXBsYXRlSnNvbk1hcCk7CisJCQkJCWlmIChyZWdSZXNwb25zZS5pc1JpZ2h0KCkpCisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlZ1Jlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCWlmIChyZWdSZXNwb25zZS5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPiAwKSB7CisJCQkJCQlub2RlVGVtcGxhdGVJbmZvLnNldFByb3BlcnRpZXMocmVnUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSkpOworCisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIkltcG9ydCBSZXNvdXJjZSAtIGNyZWF0ZSBjYXBhYmlsaXR5Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigiSW1wb3J0IFJlc291cmNlIC0gY3JlYXRlIGNhcGFiaWxpdHkiKTsKKwkJCWxvZy5kZWJ1ZygiZXJyb3Igd2hlbiBjcmVhdGluZyBjYXBhYmlsaXR5LCBtZXNzYWdlOnt9IiwgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUHJvcEluZm8+PiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVByb3BNb2R1bGVGcm9tWWFtbChNYXA8U3RyaW5nLCBPYmplY3Q+IG5vZGVUZW1wbGF0ZUpzb25NYXApIHsKKwkJTWFwPFN0cmluZywgTGlzdDxVcGxvYWRQcm9wSW5mbz4+IG1vZHVsZVByb3AgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUHJvcEluZm8+PigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxVcGxvYWRQcm9wSW5mbz4+LCBSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2UgPSBFaXRoZXIubGVmdChtb2R1bGVQcm9wKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IHRvc2NhUHJvcGVydGllcyA9IEltcG9ydFV0aWxzLmZpbmRGaXJzdFRvc2NhTWFwRWxlbWVudChub2RlVGVtcGxhdGVKc29uTWFwLCBUb3NjYVRhZ05hbWVzRW51bS5QUk9QRVJUSUVTKTsKKwkJaWYgKHRvc2NhUHJvcGVydGllcy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uUHJvcGVydGllcyA9IHRvc2NhUHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGpzb25Qcm9wT2JqIDoganNvblByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJCS8vIFByb3BlcnR5CisJCQkJU3RyaW5nIHByb3BOYW1lID0ganNvblByb3BPYmouZ2V0S2V5KCk7CisJCQkJT2JqZWN0IHByb3BWYWx1ZSA9IGpzb25Qcm9wT2JqLmdldFZhbHVlKCk7CisKKwkJCQlpZiAodmFsdWVDb250YWluc1BhdHRlcm4oU1RSX1JFUExBQ0VfUEFUVEVSTiwgcHJvcFZhbHVlKSkgeworCQkJCQlsb2cuZGVidWcoIklnbm9yZSBwcm9wZXJ0eSB2YWx1ZSB7fS4iLCBwcm9wTmFtZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmICh2YWx1ZUNvbnRhaW5zUGF0dGVybihUT0tFTl9QQVRURVJOLCBwcm9wVmFsdWUpKSB7CisJCQkJCWxvZy5kZWJ1ZygiSWdub3JlIHByb3BlcnR5IHZhbHVlIHt9LiIsIHByb3BOYW1lKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICh2YWx1ZUNvbnRhaW5zUGF0dGVybihHRVRfUFJPUEVSVFlfUEFUVEVSTiwgcHJvcFZhbHVlKSkgeworCQkJCQlsb2cuZGVidWcoIklnbm9yZSBwcm9wZXJ0eSB2YWx1ZSB7fS4iLCBwcm9wTmFtZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmICh2YWx1ZUNvbnRhaW5zUGF0dGVybihDT05DQVRfUEFUVEVSTiwgcHJvcFZhbHVlKSkgeworCQkJCQlsb2cuZGVidWcoIklnbm9yZSBwcm9wZXJ0eSB2YWx1ZSB7fS4iLCBwcm9wTmFtZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCVVwbG9hZFByb3BJbmZvIHByb3BlcnR5RGVmID0gbmV3IFVwbG9hZFByb3BJbmZvKCk7CisJCQkJcHJvcGVydHlEZWYuc2V0VmFsdWUocHJvcFZhbHVlKTsKKwkJCQlpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJCWlmICgoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BWYWx1ZSkuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uVFlQRS5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQkJcHJvcGVydHlEZWYuc2V0VHlwZSgoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BWYWx1ZSkuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUuZ2V0RWxlbWVudE5hbWUoKSkudG9TdHJpbmcoKSk7CisJCQkJCX0KKworCQkJCQlpZiAoKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwcm9wVmFsdWUpLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLkdFVF9JTlBVVC5nZXRFbGVtZW50TmFtZSgpKQorCQkJCQkJCXx8IEltcG9ydFV0aWxzLmdldFByb3BlcnR5SnNvblN0cmluZ1ZhbHVlKHByb3BWYWx1ZSwgVG9zY2FQcm9wZXJ0eVR5cGUuTUFQLmdldFR5cGUoKSkuY29udGFpbnMoVG9zY2FUYWdOYW1lc0VudW0uR0VUX0lOUFVULmdldEVsZW1lbnROYW1lKCkpKSB7CisJCQkJCQljcmVhdGVHZXRJbnB1dE1vZHVsZUZyb21NYXAocHJvcE5hbWUsIChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwcm9wVmFsdWUsIHByb3BlcnR5RGVmKTsKKwkJCQkJfQorCisJCQkJCWlmICgoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BWYWx1ZSkuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJCXByb3BlcnR5RGVmLnNldERlc2NyaXB0aW9uKCgoTWFwPFN0cmluZywgT2JqZWN0PikgcHJvcFZhbHVlKS5nZXQoVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSkudG9TdHJpbmcoKSk7CisJCQkJCX0KKwkJCQkJaWYgKCgoTWFwPFN0cmluZywgT2JqZWN0PikgcHJvcFZhbHVlKS5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5ERUZBVUxUX1ZBTFVFLmdldEVsZW1lbnROYW1lKCkpKSB7CisJCQkJCQlwcm9wZXJ0eURlZi5zZXRWYWx1ZSgoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BWYWx1ZSkuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLkRFRkFVTFRfVkFMVUUuZ2V0RWxlbWVudE5hbWUoKSkpOworCQkJCQl9CisJCQkJCWlmICgoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BWYWx1ZSkuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uSVNfUEFTU1dPUkQuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJCXByb3BlcnR5RGVmLnNldFBhc3N3b3JkKEJvb2xlYW4uZ2V0Qm9vbGVhbigoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BWYWx1ZSkuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLklTX1BBU1NXT1JELmdldEVsZW1lbnROYW1lKCkpLnRvU3RyaW5nKCkpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByb3BlcnR5RGVmLnNldFZhbHVlKHByb3BWYWx1ZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCQkJTGlzdDxPYmplY3Q+IHByb3BWYWx1ZUxpc3QgPSAoTGlzdDxPYmplY3Q+KSBwcm9wVmFsdWU7CisKKwkJCQkJY3JlYXRlSW5wdXRQcm9wTGlzdChwcm9wZXJ0eURlZiwgcHJvcFZhbHVlTGlzdCk7CisJCQkJCXByb3BlcnR5RGVmLnNldFZhbHVlKHByb3BWYWx1ZSk7CisJCQkJfQorCisJCQkJcHJvcGVydHlEZWYuc2V0TmFtZShwcm9wTmFtZSk7CisJCQkJaWYgKG1vZHVsZVByb3AuY29udGFpbnNLZXkocHJvcE5hbWUpKSB7CisJCQkJCW1vZHVsZVByb3AuZ2V0KHByb3BOYW1lKS5hZGQocHJvcGVydHlEZWYpOworCQkJCX0gZWxzZSB7CisJCQkJCUxpc3Q8VXBsb2FkUHJvcEluZm8+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFVwbG9hZFByb3BJbmZvPigpOworCQkJCQlsaXN0LmFkZChwcm9wZXJ0eURlZik7CisJCQkJCW1vZHVsZVByb3AucHV0KHByb3BOYW1lLCBsaXN0KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVJbnB1dFByb3BMaXN0KFVwbG9hZFByb3BJbmZvIHByb3BlcnR5RGVmLCBMaXN0PE9iamVjdD4gcHJvcFZhbHVlTGlzdCkgeworCQlmb3IgKE9iamVjdCBvYmpWYWx1ZSA6IHByb3BWYWx1ZUxpc3QpIHsKKworCQkJaWYgKG9ialZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBvYmpNYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0Pikgb2JqVmFsdWU7CisJCQkJU2V0PFN0cmluZz4ga2V5cyA9IG9iak1hcC5rZXlTZXQoKTsKKwkJCQlmb3IgKFN0cmluZyBrZXkgOiBrZXlzKSB7CisJCQkJCU9iamVjdCB2YWx1ZSA9IG9iak1hcC5nZXQoa2V5KTsKKwkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJCQljcmVhdGVHZXRJbnB1dE1vZHVsZUZyb21NYXAoa2V5LCAoTWFwPFN0cmluZywgT2JqZWN0PikgdmFsdWUsIHByb3BlcnR5RGVmKTsKKworCQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgeworCQkJCQkJTGlzdDxPYmplY3Q+IHByb3BTdWJWYWx1ZUxpc3QgPSAoTGlzdDxPYmplY3Q+KSB2YWx1ZTsKKworCQkJCQkJY3JlYXRlSW5wdXRQcm9wTGlzdChwcm9wZXJ0eURlZiwgcHJvcFN1YlZhbHVlTGlzdCk7CisJCQkJCX0KKworCQkJCX0KKworCQkJfSBlbHNlIGlmIChvYmpWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCQlMaXN0PE9iamVjdD4gcHJvcFN1YlZhbHVlTGlzdCA9IChMaXN0PE9iamVjdD4pIG9ialZhbHVlOworCisJCQkJY3JlYXRlSW5wdXRQcm9wTGlzdChwcm9wZXJ0eURlZiwgcHJvcFN1YlZhbHVlTGlzdCk7CisKKwkJCX0KKworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUdldElucHV0TW9kdWxlRnJvbU1hcChTdHJpbmcgcHJvcE5hbWUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcFZhbHVlLCBVcGxvYWRQcm9wSW5mbyBwcm9wZXJ0eURlZikgeworCisJCWlmIChwcm9wVmFsdWUuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uR0VUX0lOUFVULmdldEVsZW1lbnROYW1lKCkpKSB7CisJCQlPYmplY3QgZ2V0SW5wdXQgPSBwcm9wVmFsdWUuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLkdFVF9JTlBVVC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCUdldElucHV0VmFsdWVJbmZvIGdldElucHV0SW5mbyA9IG5ldyBHZXRJbnB1dFZhbHVlSW5mbygpOworCQkJTGlzdDxHZXRJbnB1dFZhbHVlSW5mbz4gZ2V0SW5wdXRzID0gcHJvcGVydHlEZWYuZ2V0R2V0X2lucHV0KCk7CisJCQlpZiAoZ2V0SW5wdXRzID09IG51bGwpIHsKKwkJCQlnZXRJbnB1dHMgPSBuZXcgQXJyYXlMaXN0PEdldElucHV0VmFsdWVJbmZvPigpOworCQkJfQorCQkJaWYgKGdldElucHV0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisKKwkJCQlnZXRJbnB1dEluZm8uc2V0SW5wdXROYW1lKChTdHJpbmcpIGdldElucHV0KTsKKwkJCQlnZXRJbnB1dEluZm8uc2V0UHJvcE5hbWUocHJvcE5hbWUpOworCisJCQl9IGVsc2UgaWYgKGdldElucHV0IGluc3RhbmNlb2YgTGlzdCkgeworCQkJCUxpc3Q8T2JqZWN0PiBnZXRJbnB1dExpc3QgPSAoTGlzdDxPYmplY3Q+KSBnZXRJbnB1dDsKKwkJCQlnZXRJbnB1dEluZm8uc2V0UHJvcE5hbWUocHJvcE5hbWUpOworCQkJCWdldElucHV0SW5mby5zZXRJbnB1dE5hbWUoKFN0cmluZykgZ2V0SW5wdXRMaXN0LmdldCgwKSk7CisJCQkJaWYgKGdldElucHV0TGlzdC5zaXplKCkgPj0gMSkgeworCQkJCQlPYmplY3QgaW5kZXhPYmogPSBnZXRJbnB1dExpc3QuZ2V0KDEpOworCQkJCQlpZiAoaW5kZXhPYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisJCQkJCQlnZXRJbnB1dEluZm8uc2V0SW5kZXhWYWx1ZSgoSW50ZWdlcikgaW5kZXhPYmopOworCQkJCQl9IGVsc2UgaWYgKGluZGV4T2JqIGluc3RhbmNlb2YgRmxvYXQpIHsKKwkJCQkJCWludCBpbmRleCA9ICgoRmxvYXQpIGluZGV4T2JqKS5pbnRWYWx1ZSgpOworCQkJCQkJZ2V0SW5wdXRJbmZvLnNldEluZGV4VmFsdWUoaW5kZXgpOworCQkJCQl9IGVsc2UgaWYgKGluZGV4T2JqIGluc3RhbmNlb2YgTWFwICYmICgoTWFwPFN0cmluZywgT2JqZWN0PikgaW5kZXhPYmopLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLkdFVF9JTlBVVC5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQkJT2JqZWN0IGluZGV4ID0gKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBpbmRleE9iaikuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLkdFVF9JTlBVVC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJCUdldElucHV0VmFsdWVJbmZvIGdldElucHV0SW5mb0luZGV4ID0gbmV3IEdldElucHV0VmFsdWVJbmZvKCk7CisJCQkJCQlnZXRJbnB1dEluZm9JbmRleC5zZXRJbnB1dE5hbWUoKFN0cmluZykgaW5kZXgpOworCQkJCQkJZ2V0SW5wdXRJbmZvSW5kZXguc2V0UHJvcE5hbWUocHJvcE5hbWUpOworCQkJCQkJZ2V0SW5wdXRJbmZvLnNldEdldElucHV0SW5kZXgoZ2V0SW5wdXRJbmZvSW5kZXgpOworCQkJCQl9CisJCQkJCWdldElucHV0SW5mby5zZXRMaXN0KHRydWUpOworCQkJCX0KKworCQkJfQorCQkJZ2V0SW5wdXRzLmFkZChnZXRJbnB1dEluZm8pOworCQkJcHJvcGVydHlEZWYuc2V0R2V0X2lucHV0KGdldElucHV0cyk7CisJCQlwcm9wZXJ0eURlZi5zZXRWYWx1ZShwcm9wVmFsdWUpOworCQl9IGVsc2UgeworCQkJU2V0PFN0cmluZz4ga2V5cyA9IHByb3BWYWx1ZS5rZXlTZXQoKTsKKwkJCWZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKKwkJCQlPYmplY3QgdmFsdWUgPSBwcm9wVmFsdWUuZ2V0KGtleSk7CisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJCWNyZWF0ZUdldElucHV0TW9kdWxlRnJvbU1hcChrZXksIChNYXA8U3RyaW5nLCBPYmplY3Q+KSB2YWx1ZSwgcHJvcGVydHlEZWYpOworCisJCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCQkJTGlzdDxPYmplY3Q+IHZhbHVlTGlzdCA9IChMaXN0PE9iamVjdD4pIHZhbHVlOworCQkJCQlmb3IgKE9iamVjdCBvIDogdmFsdWVMaXN0KSB7CisJCQkJCQlpZiAobyBpbnN0YW5jZW9mIE1hcCkgeworCQkJCQkJCWNyZWF0ZUdldElucHV0TW9kdWxlRnJvbU1hcChrZXksIChNYXA8U3RyaW5nLCBPYmplY3Q+KSBvLCBwcm9wZXJ0eURlZik7CisKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJfQorCX0KKworCS8qCisJICogcHJpdmF0ZSBib29sZWFuIHZhbHVlQ29udGFpbnNTdHJSZXBsYWNlKE9iamVjdCBwcm9wVmFsdWUpIHsKKwkgKiAKKwkgKiBsb2cuZGVidWcoInZhbHVlQ29udGFpbnNTdHJSZXBsYWNlIHZhbHVlIGlzIHt9IiwgcHJvcFZhbHVlKTsgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7IGxvZy5kZWJ1ZygidmFsdWVDb250YWluc1N0clJlcGxhY2UgdmFsdWUgaXMge30iLCBwcm9wVmFsdWUuZ2V0Q2xhc3MoKSk7IE1hdGNoZXIgbWF0Y2hlciA9CisJICogU1RSX1JFUExBQ0VfUEFUVEVSTi5tYXRjaGVyKHByb3BWYWx1ZS50b1N0cmluZygpKTsgcmVzdWx0ID0gbWF0Y2hlci5maW5kKCk7IH0KKwkgKiAKKwkgKiByZXR1cm4gcmVzdWx0OyB9CisJICogCisJICogcHJpdmF0ZSBib29sZWFuIHZhbHVlQ29udGFpbnNUb2tlbihPYmplY3QgcHJvcFZhbHVlKSB7CisJICogCisJICogbG9nLmRlYnVnKCJ2YWx1ZUNvbnRhaW5zVG9rZW4gdmFsdWUgaXMge30iLCBwcm9wVmFsdWUpOyBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsgbG9nLmRlYnVnKCJ2YWx1ZUNvbnRhaW5zVG9rZW4gdmFsdWUgaXMge30iLCBwcm9wVmFsdWUuZ2V0Q2xhc3MoKSk7IE1hdGNoZXIgbWF0Y2hlciA9IFRPS0VOX1BBVFRFUk4ubWF0Y2hlcihwcm9wVmFsdWUudG9TdHJpbmcoKSk7IHJlc3VsdCA9CisJICogbWF0Y2hlci5maW5kKCk7IH0KKwkgKiAKKwkgKiByZXR1cm4gcmVzdWx0OyB9CisJICovCisKKwlwcml2YXRlIGJvb2xlYW4gdmFsdWVDb250YWluc1BhdHRlcm4oUGF0dGVybiBwYXR0ZXJuLCBPYmplY3QgcHJvcFZhbHVlKSB7CisKKwkJbG9nLmRlYnVnKCJ2YWx1ZUNvbnRhaW5zVG9rZW4gdmFsdWUgaXMge30iLCBwcm9wVmFsdWUpOworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQlpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygidmFsdWVDb250YWluc3BhdHRlcm4gdmFsdWUgaXMge30iLCBwcm9wVmFsdWUuZ2V0Q2xhc3MoKSk7CisJCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIocHJvcFZhbHVlLnRvU3RyaW5nKCkpOworCQkJcmVzdWx0ID0gbWF0Y2hlci5maW5kKCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxVcGxvYWRDYXBJbmZvPj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVDYXBNb2R1bGVGcm9tWWFtbChVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8gbm9kZVRlbXBsYXRlSW5mbywgTWFwPFN0cmluZywgT2JqZWN0PiBub2RlVGVtcGxhdGVKc29uTWFwKSB7CisJCU1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkQ2FwSW5mbz4+IG1vZHVsZUNhcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxVcGxvYWRDYXBJbmZvPj4oKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkQ2FwSW5mbz4+LCBSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2UgPSBFaXRoZXIubGVmdChtb2R1bGVDYXApOworCQlFaXRoZXI8TGlzdDxPYmplY3Q+LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYVJlcXVpcmVtZW50cyA9IEltcG9ydFV0aWxzLmZpbmRGaXJzdFRvc2NhTGlzdEVsZW1lbnQobm9kZVRlbXBsYXRlSnNvbk1hcCwgVG9zY2FUYWdOYW1lc0VudW0uQ0FQQUJJTElUSUVTKTsKKwkJaWYgKHRvc2NhUmVxdWlyZW1lbnRzLmlzTGVmdCgpKSB7CisJCQlMaXN0PE9iamVjdD4ganNvbkNhcGFiaWxpdGllcyA9IHRvc2NhUmVxdWlyZW1lbnRzLmxlZnQoKS52YWx1ZSgpOworCisJCQlmb3IgKE9iamVjdCBqc29uQ2FwT2JqIDoganNvbkNhcGFiaWxpdGllcykgeworCQkJCS8vIFJlcXVpcmVtZW50CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBjYXBKc29uV3JhcHBlciA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uQ2FwT2JqOworCQkJCVN0cmluZyBjYXBOYW1lID0gY2FwSnNvbldyYXBwZXIua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJRWl0aGVyPFVwbG9hZENhcEluZm8sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDYXAgPSBjcmVhdGVNb2R1bGVOb2RlVGVtcGxhdGVDYXAoY2FwSnNvbldyYXBwZXIuZ2V0KGNhcE5hbWUpKTsKKwkJCQlpZiAoZWl0aGVyQ2FwLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuaW5mbygiZXJyb3Igd2hlbiBjcmVhdGluZyBSZXF1aXJlbWVudDp7fSwgZm9yIG5vZGU6e30iLCBjYXBOYW1lLCBub2RlVGVtcGxhdGVJbmZvKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDYXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlVcGxvYWRDYXBJbmZvIHJlcXVpcmVtZW50RGVmID0gZWl0aGVyQ2FwLmxlZnQoKS52YWx1ZSgpOworCQkJCQlyZXF1aXJlbWVudERlZi5zZXROYW1lKGNhcE5hbWUpOworCQkJCQlpZiAobW9kdWxlQ2FwLmNvbnRhaW5zS2V5KGNhcE5hbWUpKSB7CisJCQkJCQltb2R1bGVDYXAuZ2V0KGNhcE5hbWUpLmFkZChyZXF1aXJlbWVudERlZik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlMaXN0PFVwbG9hZENhcEluZm8+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFVwbG9hZENhcEluZm8+KCk7CisJCQkJCQlsaXN0LmFkZChyZXF1aXJlbWVudERlZik7CisJCQkJCQltb2R1bGVDYXAucHV0KGNhcE5hbWUsIGxpc3QpOworCQkJCQl9CisKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PFVwbG9hZFJlcUluZm8+PiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlcU1vZHVsZUZyb21ZYW1sKFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbyBub2RlVGVtcGxhdGVJbmZvLCBNYXA8U3RyaW5nLCBPYmplY3Q+IG5vZGVUZW1wbGF0ZUpzb25NYXApIHsKKwkJTWFwPFN0cmluZywgTGlzdDxVcGxvYWRSZXFJbmZvPj4gbW9kdWxlUmVxdWlyZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFVwbG9hZFJlcUluZm8+PigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxVcGxvYWRSZXFJbmZvPj4sIFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZSA9IEVpdGhlci5sZWZ0KG1vZHVsZVJlcXVpcmVtZW50cyk7CisJCUVpdGhlcjxMaXN0PE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IHRvc2NhUmVxdWlyZW1lbnRzID0gSW1wb3J0VXRpbHMuZmluZEZpcnN0VG9zY2FMaXN0RWxlbWVudChub2RlVGVtcGxhdGVKc29uTWFwLCBUb3NjYVRhZ05hbWVzRW51bS5SRVFVSVJFTUVOVFMpOworCQlpZiAodG9zY2FSZXF1aXJlbWVudHMuaXNMZWZ0KCkpIHsKKwkJCUxpc3Q8T2JqZWN0PiBqc29uUmVxdWlyZW1lbnRzID0gdG9zY2FSZXF1aXJlbWVudHMubGVmdCgpLnZhbHVlKCk7CisKKwkJCWZvciAoT2JqZWN0IGpzb25SZXF1aXJlbWVudE9iaiA6IGpzb25SZXF1aXJlbWVudHMpIHsKKwkJCQkvLyBSZXF1aXJlbWVudAorCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRKc29uV3JhcHBlciA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uUmVxdWlyZW1lbnRPYmo7CisJCQkJU3RyaW5nIHJlcXVpcmVtZW50TmFtZSA9IHJlcXVpcmVtZW50SnNvbldyYXBwZXIua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJRWl0aGVyPFVwbG9hZFJlcUluZm8sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXF1aXJlbWVudCA9IGNyZWF0ZU1vZHVsZU5vZGVUZW1wbGF0ZVJlZyhyZXF1aXJlbWVudEpzb25XcmFwcGVyLmdldChyZXF1aXJlbWVudE5hbWUpKTsKKwkJCQlpZiAoZWl0aGVyUmVxdWlyZW1lbnQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5pbmZvKCJlcnJvciB3aGVuIGNyZWF0aW5nIFJlcXVpcmVtZW50Ont9LCBmb3Igbm9kZTp7fSIsIHJlcXVpcmVtZW50TmFtZSwgbm9kZVRlbXBsYXRlSW5mbyk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyUmVxdWlyZW1lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlVcGxvYWRSZXFJbmZvIHJlcXVpcmVtZW50RGVmID0gZWl0aGVyUmVxdWlyZW1lbnQubGVmdCgpLnZhbHVlKCk7CisJCQkJCXJlcXVpcmVtZW50RGVmLnNldE5hbWUocmVxdWlyZW1lbnROYW1lKTsKKwkJCQkJaWYgKG1vZHVsZVJlcXVpcmVtZW50cy5jb250YWluc0tleShyZXF1aXJlbWVudE5hbWUpKSB7CisJCQkJCQltb2R1bGVSZXF1aXJlbWVudHMuZ2V0KHJlcXVpcmVtZW50TmFtZSkuYWRkKHJlcXVpcmVtZW50RGVmKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUxpc3Q8VXBsb2FkUmVxSW5mbz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VXBsb2FkUmVxSW5mbz4oKTsKKwkJCQkJCWxpc3QuYWRkKHJlcXVpcmVtZW50RGVmKTsKKwkJCQkJCW1vZHVsZVJlcXVpcmVtZW50cy5wdXQocmVxdWlyZW1lbnROYW1lLCBsaXN0KTsKKwkJCQkJfQorCisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgRWl0aGVyPFVwbG9hZENhcEluZm8sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVNb2R1bGVOb2RlVGVtcGxhdGVDYXAoT2JqZWN0IGNhcE9iamVjdCkgeworCQlVcGxvYWRDYXBJbmZvIGNhcFRlbXBsYXRlSW5mbyA9IG5ldyBVcGxvYWRDYXBJbmZvKCk7CisJCUVpdGhlcjxVcGxvYWRDYXBJbmZvLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoY2FwVGVtcGxhdGVJbmZvKTsKKworCQlpZiAoY2FwT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlTdHJpbmcgbm9kZVRlbXBsYXRlSnNvblN0cmluZyA9IChTdHJpbmcpIGNhcE9iamVjdDsKKwkJCWNhcFRlbXBsYXRlSW5mby5zZXROb2RlKG5vZGVUZW1wbGF0ZUpzb25TdHJpbmcpOworCQl9IGVsc2UgaWYgKGNhcE9iamVjdCBpbnN0YW5jZW9mIE1hcCkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBub2RlVGVtcGxhdGVKc29uTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGNhcE9iamVjdDsKKwkJCS8vIFR5cGUKKwkJCWlmIChub2RlVGVtcGxhdGVKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLk5PREUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQljYXBUZW1wbGF0ZUluZm8uc2V0Tm9kZSgoU3RyaW5nKSBub2RlVGVtcGxhdGVKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5OT0RFLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCX0KKwkJCWlmIChub2RlVGVtcGxhdGVKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQljYXBUZW1wbGF0ZUluZm8uc2V0VHlwZSgoU3RyaW5nKSBub2RlVGVtcGxhdGVKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5UWVBFLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCX0KKwkJCWlmIChub2RlVGVtcGxhdGVKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLlZBTElEX1NPVVJDRV9UWVBFUy5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCUVpdGhlcjxMaXN0PE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IHZhbGlkU291cmNlVHlwZXNSZXMgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYUxpc3RFbGVtZW50KG5vZGVUZW1wbGF0ZUpzb25NYXAsIFRvc2NhVGFnTmFtZXNFbnVtLlZBTElEX1NPVVJDRV9UWVBFUyk7CisJCQkJaWYgKHZhbGlkU291cmNlVHlwZXNSZXMuaXNMZWZ0KCkpIHsKKwkJCQkJY2FwVGVtcGxhdGVJbmZvLnNldFZhbGlkU291cmNlVHlwZXModmFsaWRTb3VyY2VUeXBlc1Jlcy5sZWZ0KCkudmFsdWUoKS5zdHJlYW0oKS5tYXAobyAtPiBvLnRvU3RyaW5nKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworCQkJCX0KKwkJCX0KKwkJCWlmIChub2RlVGVtcGxhdGVKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLlBST1BFUlRJRVMuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxVcGxvYWRQcm9wSW5mbz4+LCBSZXNwb25zZUZvcm1hdD4gcmVnUmVzcG9uc2UgPSBjcmVhdGVQcm9wTW9kdWxlRnJvbVlhbWwobm9kZVRlbXBsYXRlSnNvbk1hcCk7CisJCQkJaWYgKHJlZ1Jlc3BvbnNlLmlzUmlnaHQoKSkKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZWdSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCWlmICghcmVnUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkuaXNFbXB0eSgpKSB7CisJCQkJCUxpc3Q8VXBsb2FkUHJvcEluZm8+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFVwbG9hZFByb3BJbmZvPigpOworCQkJCQlyZWdSZXNwb25zZS5sZWZ0KCkudmFsdWUoKS52YWx1ZXMoKS5mb3JFYWNoKGxpc3QgLT4gcHJvcGVydGllcy5hZGRBbGwobGlzdCkpOworCQkJCQlpZiAoIXByb3BlcnRpZXMuaXNFbXB0eSgpKQorCQkJCQkJY2FwVGVtcGxhdGVJbmZvLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxVcGxvYWRSZXFJbmZvLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlTW9kdWxlTm9kZVRlbXBsYXRlUmVnKE9iamVjdCByZWdPYmplY3QpIHsKKworCQlVcGxvYWRSZXFJbmZvIHJlZ1RlbXBsYXRlSW5mbyA9IG5ldyBVcGxvYWRSZXFJbmZvKCk7CisJCUVpdGhlcjxVcGxvYWRSZXFJbmZvLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQocmVnVGVtcGxhdGVJbmZvKTsKKworCQlpZiAocmVnT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlTdHJpbmcgbm9kZVRlbXBsYXRlSnNvblN0cmluZyA9IChTdHJpbmcpIHJlZ09iamVjdDsKKwkJCXJlZ1RlbXBsYXRlSW5mby5zZXROb2RlKG5vZGVUZW1wbGF0ZUpzb25TdHJpbmcpOworCQl9IGVsc2UgaWYgKHJlZ09iamVjdCBpbnN0YW5jZW9mIE1hcCkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBub2RlVGVtcGxhdGVKc29uTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHJlZ09iamVjdDsKKwkJCS8vIFR5cGUKKwkJCWlmIChub2RlVGVtcGxhdGVKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLk5PREUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQlyZWdUZW1wbGF0ZUluZm8uc2V0Tm9kZSgoU3RyaW5nKSBub2RlVGVtcGxhdGVKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5OT0RFLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCX0KKwkJCS8vIFVTNzQwODIwIFJlbGF0ZSBSSXMgYWNjb3JkaW5nIHRvIGNhcGFiaWxpdHkgbmFtZQorCQkJaWYgKG5vZGVUZW1wbGF0ZUpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uQ0FQQUJJTElUWS5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCXJlZ1RlbXBsYXRlSW5mby5zZXRDYXBhYmlsaXR5TmFtZSgoU3RyaW5nKSBub2RlVGVtcGxhdGVKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5DQVBBQklMSVRZLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHByb3BhZ2F0ZVN0YXRlVG9DZXJ0aWZpZWQoVXNlciB1c2VyLCBSZXNvdXJjZSByZXNvdXJjZSwgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24gbGlmZWN5Y2xlQ2hhbmdlSW5mbywgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBib29sZWFuIG5lZWRMb2NrKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IG51bGw7CisKKwkJLy8gcmVzb3VyY2UgdXBkYXRlZCB3aXRoIGNoZWNrb3V0LiBjZXJ0aWZ5IHRoZSByZXNvdXJjZQorCQlpZiAocmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCkpIHsKKwkJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUG9wdWxhdGVkID0gcG9wdWxhdGVUb3NjYUFydGlmYWN0cyhyZXNvdXJjZSwgdXNlciwgZmFsc2UsIGluVHJhbnNhY3Rpb24sIG5lZWRMb2NrKTsKKwkJCXJlc3VsdCA9IGVpdGhlclBvcHVsYXRlZC5pc0xlZnQoKSA/IEVpdGhlci5sZWZ0KHJlc291cmNlKSA6IEVpdGhlci5yaWdodChlaXRoZXJQb3B1bGF0ZWQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJdHJ5IHsKKwkJCXJlc3VsdCA9IGxpZmVjeWNsZUJ1c2luZXNzTG9naWMuY2hhbmdlU3RhdGUocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdXNlciwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0VSVElGSUNBVElPTl9SRVFVRVNULCBsaWZlY3ljbGVDaGFuZ2VJbmZvLCBpblRyYW5zYWN0aW9uLCBuZWVkTG9jayk7CisJCQlpZiAocmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJcmVzb3VyY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gbGlmZWN5Y2xlQnVzaW5lc3NMb2dpYy5jaGFuZ2VTdGF0ZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1c2VyLCBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5TVEFSVF9DRVJUSUZJQ0FUSU9OLCBsaWZlY3ljbGVDaGFuZ2VJbmZvLCBpblRyYW5zYWN0aW9uLCBuZWVkTG9jayk7CisJCQl9CisJCQlpZiAocmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJcmVzb3VyY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gbGlmZWN5Y2xlQnVzaW5lc3NMb2dpYy5jaGFuZ2VTdGF0ZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1c2VyLCBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DRVJUSUZZLCBsaWZlY3ljbGVDaGFuZ2VJbmZvLCBpblRyYW5zYWN0aW9uLCBuZWVkTG9jayk7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIkNoYW5nZSBMaWZlY3ljbGVTdGF0ZSAtIENlcnRpZnkiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigiQ2hhbmdlIExpZmVjeWNsZVN0YXRlIC0gQ2VydGlmeSIpOworCQkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJCWxvZy5kZWJ1Zygib3BlcmF0aW9uIGZhaWxlZC4gZG8gcm9sbGJhY2siKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJbG9nLmRlYnVnKCJvcGVyYXRpb24gc3VjY2Vzcy4gZG8gY29tbWl0Iik7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlT3JVcGRhdGVSZXNvdXJjZUJ5SW1wb3J0KFJlc291cmNlLFVzZXIsYm9vbGVhbiwgYm9vbGVhbixib29sZWFuKX0gaW5zdGVhZAorCSAqLworCXB1YmxpYyBFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VCeUltcG9ydChSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdFbnVtLCBib29sZWFuIGlzTm9ybWF0aXZlLCBib29sZWFuIG5lZWRMb2NrKSB7CisJCXJldHVybiBjcmVhdGVPclVwZGF0ZVJlc291cmNlQnlJbXBvcnQocmVzb3VyY2UsIHVzZXIsIGlzTm9ybWF0aXZlLCBmYWxzZSwgbmVlZExvY2spOworCX0KKworCXB1YmxpYyBFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VCeUltcG9ydChSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBib29sZWFuIGlzTm9ybWF0aXZlLCBib29sZWFuIGlzSW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaykgeworCisJCS8vIGNoZWNrIGlmIHJlc291cmNlIGFscmVhZHkgZXhpc3QKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBsYXRlc3RCeU5hbWUgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RCeU5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlKTsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCisJCS8vIGNyZWF0ZQorCQlpZiAobGF0ZXN0QnlOYW1lLmlzUmlnaHQoKSAmJiBsYXRlc3RCeU5hbWUucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBsYXRlc3RCeVRvc2NhTmFtZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldExhdGVzdEJ5VG9zY2FSZXNvdXJjZU5hbWUocmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSwgdHJ1ZSk7CisJCQlpZiAobGF0ZXN0QnlUb3NjYU5hbWUuaXNSaWdodCgpICYmIGxhdGVzdEJ5VG9zY2FOYW1lLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKQorCQkJCXJlc3VsdCA9IGNyZWF0ZVJlc291cmNlQnlJbXBvcnQocmVzb3VyY2UsIHVzZXIsIGlzTm9ybWF0aXZlLCBpc0luVHJhbnNhY3Rpb24pOworCisJCQllbHNlIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGxhdGVzdEJ5TmFtZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzb3VyY2VNaXNzaW5nRXJyb3IsICJDcmVhdGUgLyBVcGRhdGUgcmVzb3VyY2UgYnkgaW1wb3J0IiwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVDb21wb25lbnRNaXNzaW5nRXJyb3IoIkNyZWF0ZSAvIFVwZGF0ZSByZXNvdXJjZSBieSBpbXBvcnQiLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCWxvZy5kZWJ1ZygicmVzb3VyY2UgYWxyZWFkeSBleGlzdCB7fS4gc3RhdHVzPXt9IiwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBzdGF0dXMpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9BTFJFQURZX0VYSVNUUyk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UsIG51bGwpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisKKwkJfQorCisJCS8vIHVwZGF0ZQorCQllbHNlIGlmIChsYXRlc3RCeU5hbWUuaXNMZWZ0KCkpIHsKKwkJCXJlc3VsdCA9IHVwZGF0ZUV4aXN0aW5nUmVzb3VyY2VCeUltcG9ydChyZXNvdXJjZSwgbGF0ZXN0QnlOYW1lLmxlZnQoKS52YWx1ZSgpLCB1c2VyLCBpc05vcm1hdGl2ZSwgbmVlZExvY2spOworCQl9CisKKwkJLy8gZXJyb3IKKwkJZWxzZSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGxhdGVzdEJ5TmFtZS5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXNvdXJjZU1pc3NpbmdFcnJvciwgIkNyZWF0ZSAvIFVwZGF0ZSByZXNvdXJjZSBieSBpbXBvcnQiLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGxhdGVzdCB2ZXJzaW9uIG9mIHJlc291cmNlIHt9LiBzdGF0dXM9e30iLCByZXNvdXJjZS5nZXROYW1lKCksIHN0YXR1cyk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGxhdGVzdEJ5TmFtZS5yaWdodCgpLnZhbHVlKCkpLCByZXNvdXJjZSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbW11dGFibGVQYWlyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VCeUltcG9ydChSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyLCBib29sZWFuIGlzTm9ybWF0aXZlLCBib29sZWFuIGlzSW5UcmFuc2FjdGlvbikgeworCQlsb2cuZGVidWcoInJlc291cmNlIHdpdGggbmFtZSB7fSBkb2VzIG5vdCBleGlzdC4gY3JlYXRlIG5ldyByZXNvdXJjZSIsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlID0gdmFsaWRhdGVSZXNvdXJjZUJlZm9yZUNyZWF0ZShyZXNvdXJjZSwgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgaXNJblRyYW5zYWN0aW9uKTsKKwkJaWYgKHJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2VCeURhbyhyZXNvdXJjZSwgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgaXNOb3JtYXRpdmUsIGlzSW5UcmFuc2FjdGlvbik7CisJCWlmIChjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJfSBlbHNlIHsKKwkJCUltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4gcmVzb3VyY2VQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8PihjcmVhdGVSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSwgQWN0aW9uU3RhdHVzLkNSRUFURUQpOworCQkJQVNEQ0twaUFwaS5jb3VudEltcG9ydFJlc291cmNlc0tQSSgpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlUGFpcik7CisKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VFeGlzdChTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbGF0ZXN0QnlOYW1lID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0QnlOYW1lKHJlc291cmNlTmFtZSwgZmFsc2UpOworCQlyZXR1cm4gbGF0ZXN0QnlOYW1lLmlzTGVmdCgpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVFeGlzdGluZ1Jlc291cmNlQnlJbXBvcnQoUmVzb3VyY2UgbmV3UmVzb3VyY2UsIFJlc291cmNlIG9sZFJlc291cmNlLCBVc2VyIHVzZXIsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaykgeworCQlTdHJpbmcgbG9ja2VkUmVzb3VyY2VJZCA9IG9sZFJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCWxvZy5kZWJ1ZygiZm91bmQgcmVzb3VyY2U6IG5hbWU9e30sIGlkPXt9LCB2ZXJzaW9uPXt9LCBzdGF0ZT17fSIsIG9sZFJlc291cmNlLmdldE5hbWUoKSwgbG9ja2VkUmVzb3VyY2VJZCwgb2xkUmVzb3VyY2UuZ2V0VmVyc2lvbigpLCBvbGRSZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJaWYgKG5lZWRMb2NrKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrUmVzdWx0ID0gbG9ja0NvbXBvbmVudChsb2NrZWRSZXNvdXJjZUlkLCBvbGRSZXNvdXJjZSwgIlVwZGF0ZSBSZXNvdXJjZSBieSBJbXBvcnQiKTsKKwkJCQlpZiAobG9ja1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBwcmVwYXJlUmVzb3VyY2VGb3JVcGRhdGUgPSBwcmVwYXJlUmVzb3VyY2VGb3JVcGRhdGUob2xkUmVzb3VyY2UsIHVzZXIsIGluVHJhbnNhY3Rpb24sIGZhbHNlKTsKKwkJCWlmIChwcmVwYXJlUmVzb3VyY2VGb3JVcGRhdGUuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBwcmVwYXJlUmVzb3VyY2VGb3JVcGRhdGUucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5pbmZvKCJyZXNvdXJjZSB7fSBjYW5ub3QgYmUgdXBkYXRlZC4gcmVhc29uPXt9IiwgbG9ja2VkUmVzb3VyY2VJZCwgcmVzcG9uc2VGb3JtYXQuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpKTsKKwkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbmV3UmVzb3VyY2UsIG9sZFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkubmFtZSgpLCBvbGRSZXNvdXJjZS5nZXRWZXJzaW9uKCksIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UsIG51bGwpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChwcmVwYXJlUmVzb3VyY2VGb3JVcGRhdGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJb2xkUmVzb3VyY2UgPSBwcmVwYXJlUmVzb3VyY2VGb3JVcGRhdGUubGVmdCgpLnZhbHVlKCk7CisKKwkJCW1lcmdlT2xkUmVzb3VyY2VNZXRhZGF0YVdpdGhOZXcob2xkUmVzb3VyY2UsIG5ld1Jlc291cmNlKTsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUZpZWxkc1Jlc3BvbnNlID0gdmFsaWRhdGVSZXNvdXJjZUZpZWxkc0JlZm9yZVVwZGF0ZShvbGRSZXNvdXJjZSwgbmV3UmVzb3VyY2UsIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHZhbGlkYXRlRmllbGRzUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlRmllbGRzUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvLyBjb250YWN0IGluZm8gbm9ybWFsaXphdGlvbgorCQkJbmV3UmVzb3VyY2Uuc2V0Q29udGFjdElkKG5ld1Jlc291cmNlLmdldENvbnRhY3RJZCgpLnRvTG93ZXJDYXNlKCkpOworCQkJLy8gbm9uLXVwZGF0YWJsZSBmaWVsZHMKKwkJCW5ld1Jlc291cmNlLnNldENyZWF0b3JVc2VySWQodXNlci5nZXRVc2VySWQoKSk7CisJCQluZXdSZXNvdXJjZS5zZXRDcmVhdG9yRnVsbE5hbWUodXNlci5nZXRGdWxsTmFtZSgpKTsKKwkJCW5ld1Jlc291cmNlLnNldExhc3RVcGRhdGVyVXNlcklkKHVzZXIuZ2V0VXNlcklkKCkpOworCQkJbmV3UmVzb3VyY2Uuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSh1c2VyLmdldEZ1bGxOYW1lKCkpOworCQkJbmV3UmVzb3VyY2Uuc2V0VW5pcXVlSWQob2xkUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQluZXdSZXNvdXJjZS5zZXRWZXJzaW9uKG9sZFJlc291cmNlLmdldFZlcnNpb24oKSk7CisJCQluZXdSZXNvdXJjZS5zZXRJbnZhcmlhbnRVVUlEKG9sZFJlc291cmNlLmdldEludmFyaWFudFVVSUQoKSk7CisJCQluZXdSZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShvbGRSZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKwkJCW5ld1Jlc291cmNlLnNldFVVSUQob2xkUmVzb3VyY2UuZ2V0VVVJRCgpKTsKKwkJCW5ld1Jlc291cmNlLnNldE5vcm1hbGl6ZWROYW1lKG9sZFJlc291cmNlLmdldE5vcm1hbGl6ZWROYW1lKCkpOworCQkJbmV3UmVzb3VyY2Uuc2V0U3lzdGVtTmFtZShvbGRSZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCkpOworCQkJaWYgKG9sZFJlc291cmNlLmdldENzYXJVVUlEKCkgIT0gbnVsbCkgeworCQkJCW5ld1Jlc291cmNlLnNldENzYXJVVUlEKG9sZFJlc291cmNlLmdldENzYXJVVUlEKCkpOworCQkJfQorCQkJaWYgKG9sZFJlc291cmNlLmdldEltcG9ydGVkVG9zY2FDaGVja3N1bSgpICE9IG51bGwpIHsKKwkJCQluZXdSZXNvdXJjZS5zZXRJbXBvcnRlZFRvc2NhQ2hlY2tzdW0ob2xkUmVzb3VyY2UuZ2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKCkpOworCQkJfQorCQkJbmV3UmVzb3VyY2Uuc2V0QWJzdHJhY3Qob2xkUmVzb3VyY2UuaXNBYnN0cmFjdCgpKTsKKworCQkJaWYgKG5ld1Jlc291cmNlLmdldERlcml2ZWRGcm9tKCkgPT0gbnVsbCB8fCBuZXdSZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpLmlzRW1wdHkoKSkgeworCQkJCW5ld1Jlc291cmNlLnNldERlcml2ZWRGcm9tKG9sZFJlc291cmNlLmdldERlcml2ZWRGcm9tKCkpOworCQkJfQorCQkJLy8gVE9ETyByaGFsaWxpOiBoYW5kbGUgYXJ0aWZhY3RzIGhlcmUgKGRlbGV0ZSBmcm9tIG9sZCByZXNvdXJjZSBhbmQKKwkJCS8vIGFkZCBmb3IgbmV3KQorCQkJLy8gVE9ETyByYmV0emVyOiByZW1vdmUgYWZ0ZXIgbWlncmF0aW9uIC0gaW4gY2FzZSBvZiByZXNvdXJjZXMKKwkJCS8vIGNyZWF0ZWQgd2l0aG91dCB0b3NjYSBhcnRpZmFjdHMgLSBhZGQgdGhlIHBsYWNlaG9sZGVycworCQkJaWYgKG5ld1Jlc291cmNlLmdldFRvc2NhQXJ0aWZhY3RzKCkgPT0gbnVsbCB8fCBuZXdSZXNvdXJjZS5nZXRUb3NjYUFydGlmYWN0cygpLmlzRW1wdHkoKSkgeworCQkJCXNldFRvc2NhQXJ0aWZhY3RzUGxhY2VIb2xkZXJzKG5ld1Jlc291cmNlLCB1c2VyKTsKKwkJCX0KKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gb3ZlcnJpZGVSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLm92ZXJyaWRlUmVzb3VyY2UobmV3UmVzb3VyY2UsIG9sZFJlc291cmNlLCB0cnVlKTsKKworCQkJaWYgKG92ZXJyaWRlUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShvdmVycmlkZVJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSksIG5ld1Jlc291cmNlKTsKKwkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbmV3UmVzb3VyY2UsIG5ld1Jlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkubmFtZSgpLCBuZXdSZXNvdXJjZS5nZXRWZXJzaW9uKCksIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UsIG51bGwpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJbG9nLmRlYnVnKCJSZXNvdXJjZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEhISIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBuZXdSZXNvdXJjZSwgb2xkUmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKS5uYW1lKCksIG9sZFJlc291cmNlLmdldFZlcnNpb24oKSwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgbnVsbCk7CisKKwkJCUltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4gcmVzb3VyY2VQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8PihvdmVycmlkZVJlc291cmNlLmxlZnQoKS52YWx1ZSgpLCBBY3Rpb25TdGF0dXMuT0spOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocmVzb3VyY2VQYWlyKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiQ2hhbmdlIExpZmVjeWNsZVN0YXRlIC0gQ2VydGlmeSIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJDaGFuZ2UgTGlmZWN5Y2xlU3RhdGUgLSBDZXJ0aWZ5Iik7CisJCQkJbG9nLmRlYnVnKCJvcGVyYXRpb24gZmFpbGVkLiBkbyByb2xsYmFjayIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfSBlbHNlIGlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJbG9nLmRlYnVnKCJvcGVyYXRpb24gc3VjY2Vzcy4gZG8gY29tbWl0Iik7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQkJaWYgKG5lZWRMb2NrID09IHRydWUpIHsKKwkJCQlsb2cuZGVidWcoInVubG9jayByZXNvdXJjZSB7fSIsIGxvY2tlZFJlc291cmNlSWQpOworCQkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQobG9ja2VkUmVzb3VyY2VJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJCX0KKwkJfQorCisJfQorCisJLyoqCisJICogTWVyZ2Ugb2xkIHJlc291cmNlIHdpdGggbmV3LiBLZWVwIG9sZCBjYXRlZ29yeSBhbmQgdmVuZG9yIG5hbWUgd2l0aG91dCBjaGFuZ2UKKwkgKiAKKwkgKiBAcGFyYW0gb2xkUmVzb3VyY2UKKwkgKiBAcGFyYW0gbmV3UmVzb3VyY2UKKwkgKi8KKwlwcml2YXRlIHZvaWQgbWVyZ2VPbGRSZXNvdXJjZU1ldGFkYXRhV2l0aE5ldyhSZXNvdXJjZSBvbGRSZXNvdXJjZSwgUmVzb3VyY2UgbmV3UmVzb3VyY2UpIHsKKworCQkvLyBrZWVwIG9sZCBjYXRlZ29yeSBhbmQgdmVuZG9yIG5hbWUgd2l0aG91dCBjaGFuZ2UKKwkJLy8gbWVyZ2UgdGhlIHJlc3Qgb2YgdGhlIHJlc291cmNlIG1ldGFkYXRhCisJCWlmIChuZXdSZXNvdXJjZS5nZXRUYWdzKCkgPT0gbnVsbCB8fCBuZXdSZXNvdXJjZS5nZXRUYWdzKCkuaXNFbXB0eSgpKSB7CisJCQluZXdSZXNvdXJjZS5zZXRUYWdzKG9sZFJlc291cmNlLmdldFRhZ3MoKSk7CisJCX0KKworCQlpZiAobmV3UmVzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSA9PSBudWxsKSB7CisJCQluZXdSZXNvdXJjZS5zZXREZXNjcmlwdGlvbihvbGRSZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpKTsKKwkJfQorCisJCWlmIChuZXdSZXNvdXJjZS5nZXRWZW5kb3JSZWxlYXNlKCkgPT0gbnVsbCkgeworCQkJbmV3UmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZShvbGRSZXNvdXJjZS5nZXRWZW5kb3JSZWxlYXNlKCkpOworCQl9CisKKwkJaWYgKG5ld1Jlc291cmNlLmdldENvbnRhY3RJZCgpID09IG51bGwpIHsKKwkJCW5ld1Jlc291cmNlLnNldENvbnRhY3RJZChvbGRSZXNvdXJjZS5nZXRDb250YWN0SWQoKSk7CisJCX0KKworCQluZXdSZXNvdXJjZS5zZXRDYXRlZ29yaWVzKG9sZFJlc291cmNlLmdldENhdGVnb3JpZXMoKSk7CisJCW5ld1Jlc291cmNlLnNldFZlbmRvck5hbWUob2xkUmVzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHByZXBhcmVSZXNvdXJjZUZvclVwZGF0ZShSZXNvdXJjZSBsYXRlc3RSZXNvdXJjZSwgVXNlciB1c2VyLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIGJvb2xlYW4gbmVlZExvY2spIHsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBFaXRoZXIubGVmdChsYXRlc3RSZXNvdXJjZSk7CisJCS8vIGNoZWNrIGlmIHVzZXIgY2FuIGVkaXQgcmVzb3VyY2UKKwkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uUmVzb3VyY2UobGF0ZXN0UmVzb3VyY2UsIHVzZXIuZ2V0VXNlcklkKCkpKSB7CisJCQkvLyBjaGVja291dAorCQkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGUgPSBsaWZlY3ljbGVCdXNpbmVzc0xvZ2ljLmNoYW5nZVN0YXRlKGxhdGVzdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHVzZXIsIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNIRUNLT1VULCBuZXcgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24oInVwZGF0ZSBieSBpbXBvcnQiKSwgaW5UcmFuc2FjdGlvbiwgbmVlZExvY2spOworCQkJcmVzdWx0ID0gY2hhbmdlU3RhdGU7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlQmVmb3JlQ3JlYXRlKFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVJlc291cmNlRmllbGRzQmVmb3JlQ3JlYXRlKHVzZXIsIGdldFJlc291cmNlT3BlcmF0aW9uKCksIHJlc291cmNlLCBhY3Rpb25FbnVtLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGVpdGhlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlclZhbGlkYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZUNhcGFiaWxpdHlUeXBlc0NyZWF0ZSh1c2VyLCBnZXRDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbigpLCByZXNvdXJjZSwgYWN0aW9uRW51bSwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlTGlmZWN5Y2xlVHlwZXNDcmVhdGUodXNlciwgcmVzb3VyY2UsIGFjdGlvbkVudW0pOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyVmFsaWRhdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVJlc291cmNlVHlwZSh1c2VyLCByZXNvdXJjZSwgYWN0aW9uRW51bSk7CisJCWlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlyZXNvdXJjZS5zZXRDcmVhdG9yVXNlcklkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlyZXNvdXJjZS5zZXRDcmVhdG9yRnVsbE5hbWUodXNlci5nZXRGaXJzdE5hbWUoKSArICIgIiArIHVzZXIuZ2V0TGFzdE5hbWUoKSk7CisJCXJlc291cmNlLnNldENvbnRhY3RJZChyZXNvdXJjZS5nZXRDb250YWN0SWQoKS50b0xvd2VyQ2FzZSgpKTsKKwkJaWYgKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhSZXNvdXJjZVR5cGVFbnVtLlZGKSkgeworCQkJcmVzb3VyY2Uuc2V0VG9zY2FSZXNvdXJjZU5hbWUoQ29tbW9uQmVVdGlscy5nZW5lcmF0ZVRvc2NhUmVzb3VyY2VOYW1lKFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpLCByZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCkpKTsKKwkJfQorCisJCS8vIEdlbmVyYXRlIGludmFyaWFudCBVVUlEIC0gbXVzdCBiZSBoZXJlIGFuZCBub3QgaW4gb3BlcmF0aW9uIHNpbmNlIGl0CisJCS8vIHNob3VsZCBzdGF5IGNvbnN0YW50IGR1cmluZyBjbG9uZQorCQlTdHJpbmcgaW52YXJpYW50VVVJRCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZEludmFyaWFudFVVSUQoKTsKKwkJcmVzb3VyY2Uuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlVHlwZShVc2VyIHVzZXIsIFJlc291cmNlIHJlc291cmNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQlpZiAocmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJJbnZhbGlkIHJlc291cmNlIHR5cGUgZm9yIHJlc291cmNlIik7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UoZXJyb3JSZXNwb25zZSwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7CisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVMaWZlY3ljbGVUeXBlc0NyZWF0ZShVc2VyIHVzZXIsIFJlc291cmNlIHJlc291cmNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQlpZiAocmVzb3VyY2UuZ2V0SW50ZXJmYWNlcygpICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0SW50ZXJmYWNlcygpLnNpemUoKSA+IDApIHsKKwkJCWxvZy5kZWJ1ZygidmFsaWRhdGUgaW50ZXJmYWNlIGxpZmVjeWNsZSBUeXBlcyBFeGlzdCIpOworCQkJSXRlcmF0b3I8SW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50SXRyID0gcmVzb3VyY2UuZ2V0SW50ZXJmYWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaW50SXRyLmhhc05leHQoKSAmJiBlaXRoZXJSZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24gPSBpbnRJdHIubmV4dCgpOworCQkJCVN0cmluZyBpbnRUeXBlID0gaW50ZXJmYWNlRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCQkJCUVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDYXBUeXBlRm91bmQgPSBpbnRlcmZhY2VUeXBlT3BlcmF0aW9uLmdldEludGVyZmFjZShpbnRUeXBlKTsKKwkJCQlpZiAoZWl0aGVyQ2FwVHlwZUZvdW5kLmlzUmlnaHQoKSkgeworCQkJCQlpZiAoZWl0aGVyQ2FwVHlwZUZvdW5kLnJpZ2h0KCkudmFsdWUoKSA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlSW50ZXJmYWNlTWlzc2luZ0Vycm9yLCAiQ3JlYXRlIFJlc291cmNlIC0gdmFsaWRhdGVMaWZlY3ljbGVUeXBlc0NyZWF0ZSIsIGludFR5cGUpOworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlR3JhcGhPYmplY3RNaXNzaW5nRXJyb3IoIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlTGlmZWN5Y2xlVHlwZXNDcmVhdGUiLCAiSW50ZXJmYWNlIiwgaW50VHlwZSk7CisJCQkJCQlsb2cuZGVidWcoIkxpZmVjeWNsZSBUeXBlOiB7fSBpcyByZXF1aXJlZCBieSByZXNvdXJjZToge30gYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBEQiIsIGludFR5cGUsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwgIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlTGlmZWN5Y2xlVHlwZXNDcmVhdGUiKTsKKwkJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJDcmVhdGUgUmVzb3VyY2UgLSB2YWxpZGF0ZUxpZmVjeWNsZVR5cGVzQ3JlYXRlIik7CisJCQkJCQlsb2cuZGVidWcoInJlcXVlc3QgdG8gZGF0YSBtb2RlbCBmYWlsZWQgd2l0aCBlcnJvcjoge30iLCBlaXRoZXJDYXBUeXBlRm91bmQucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJCX0KKworCQkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0xJRkVDWUNMRV9UWVBFLCBpbnRUeXBlKTsKKwkJCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNhcGFiaWxpdHlUeXBlc0NyZWF0ZShVc2VyIHVzZXIsIElDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiwgUmVzb3VyY2UgcmVzb3VyY2UsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQlpZiAocmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCkgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDYXBhYmlsaXRpZXMoKS5zaXplKCkgPiAwKSB7CisJCQlsb2cuZGVidWcoInZhbGlkYXRlIGNhcGFiaWxpdHkgVHlwZXMgRXhpc3QgLSBjYXBhYmlsaXRpZXMgc2VjdGlvbiIpOworCisJCQlmb3IgKFN0cmluZyB0eXBlIDogcmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCkua2V5U2V0KCkpIHsKKworCQkJCWVpdGhlclJlc3VsdCA9IHZhbGlkYXRlQ2FwYWJpbGl0eVR5cGVFeGlzdHModXNlciwgY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24sIHJlc291cmNlLCBhY3Rpb25FbnVtLCBlaXRoZXJSZXN1bHQsIHR5cGUsIGluVHJhbnNhY3Rpb24pOworCQkJCWlmIChlaXRoZXJSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHJlc291cmNlLmdldFJlcXVpcmVtZW50cygpICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVxdWlyZW1lbnRzKCkuc2l6ZSgpID4gMCkgeworCQkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBjYXBhYmlsaXR5IFR5cGVzIEV4aXN0IC0gcmVxdWlyZW1lbnRzIHNlY3Rpb24iKTsKKworCQkJZm9yIChTdHJpbmcgdHlwZSA6IHJlc291cmNlLmdldFJlcXVpcmVtZW50cygpLmtleVNldCgpKSB7CisKKwkJCQllaXRoZXJSZXN1bHQgPSB2YWxpZGF0ZUNhcGFiaWxpdHlUeXBlRXhpc3RzKHVzZXIsIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uLCByZXNvdXJjZSwgYWN0aW9uRW51bSwgZWl0aGVyUmVzdWx0LCB0eXBlLCBpblRyYW5zYWN0aW9uKTsKKwkJCQlpZiAoZWl0aGVyUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlclJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2FwYWJpbGl0eVR5cGVFeGlzdHMoVXNlciB1c2VyLCBJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24sIFJlc291cmNlIHJlc291cmNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXN1bHQsIFN0cmluZyB0eXBlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNhcFR5cGVGb3VuZCA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uLmdldENhcGFiaWxpdHlUeXBlKHR5cGUsIGluVHJhbnNhY3Rpb24pOworCQlpZiAoZWl0aGVyQ2FwVHlwZUZvdW5kLmlzUmlnaHQoKSkgeworCQkJaWYgKGVpdGhlckNhcFR5cGVGb3VuZC5yaWdodCgpLnZhbHVlKCkgPT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVDYXBhYmlsaXR5VHlwZU1pc3NpbmdFcnJvciwgIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlQ2FwYWJpbGl0eVR5cGVzQ3JlYXRlIiwgdHlwZSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlR3JhcGhPYmplY3RNaXNzaW5nRXJyb3IoIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlQ2FwYWJpbGl0eVR5cGVzQ3JlYXRlIiwgIkNhcGFiaWxpdHkgVHlwZSIsIHR5cGUpOworCQkJCWxvZy5kZWJ1ZygiQ2FwYWJpbGl0eSBUeXBlOiB7fSBpcyByZXF1aXJlZCBieSByZXNvdXJjZToge30gYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBEQiIsIHR5cGUsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlQ2FwYWJpbGl0eVR5cGVzQ3JlYXRlIik7CisJCQl9CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwgIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlQ2FwYWJpbGl0eVR5cGVzQ3JlYXRlIik7CisJCQlsb2cuZGVidWcoIlRyeWluZyB0byBnZXQgY2FwYWJpbGl0eSB0eXBlIHt9IGZhaWxlZCB3aXRoIGVycm9yOiB7fSIsIHR5cGUsIGVpdGhlckNhcFR5cGVGb3VuZC5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ0FQQUJJTElUWV9UWVBFLCB0eXBlKTsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKGVycm9yUmVzcG9uc2UsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIGFjdGlvbkVudW0sIG51bGwpOworCQl9CisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlQnlEYW8oUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIGJvb2xlYW4gaXNOb3JtYXRpdmUpIHsKKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlQnlEYW8ocmVzb3VyY2UsIHVzZXIsIGFjdGlvbkVudW0sIGlzTm9ybWF0aXZlLCBmYWxzZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlQnlEYW8oUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIGJvb2xlYW4gaXNOb3JtYXRpdmUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkvLyBjcmVhdGUgcmVzb3VyY2UKKworCQkvLyBsb2NrIG5ldyByZXNvdXJjZSBuYW1lIGluIG9yZGVyIHRvIGF2b2lkIGNyZWF0aW9uIHJlc291cmNlIHdpdGggc2FtZQorCQkvLyBuYW1lCisJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tSZXN1bHQgPSBsb2NrQ29tcG9uZW50QnlOYW1lKHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSwgcmVzb3VyY2UsICJDcmVhdGUgUmVzb3VyY2UiKTsKKwkJCWlmIChsb2NrUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbG9ja1Jlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIGFjdGlvbkVudW0sIG51bGwpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlsb2cuZGVidWcoIm5hbWUgaXMgbG9ja2VkIHt9LiBzdGF0dXMgPSB7fSIsIHJlc291cmNlLmdldFN5c3RlbU5hbWUoKSwgbG9ja1Jlc3VsdCk7CisJCX0KKwkJdHJ5IHsKKwkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHJlc3BTdGF0dXMgPSBjcmVhdGVSZXNvdXJjZVRyYW5zYWN0aW9uKHJlc291cmNlLCB1c2VyLCBhY3Rpb25FbnVtLCBpc05vcm1hdGl2ZSwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAocmVzcFN0YXR1cy5pc0xlZnQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7CisJCQkJQVNEQ0twaUFwaS5jb3VudENyZWF0ZWRSZXNvdXJjZXNLUEkoKTsKKwkJCX0gZWxzZQorCQkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BTdGF0dXMucmlnaHQoKS52YWx1ZSgpLCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJCXJldHVybiByZXNwU3RhdHVzOworCisJCX0gZmluYWxseSB7CisJCQlpZiAoaW5UcmFuc2FjdGlvbiA9PSBmYWxzZSkgeworCQkJCS8vIGdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQocmVzb3VyY2UuZ2V0U3lzdGVtTmFtZSgpLAorCQkJCS8vIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudEJ5TmFtZShyZXNvdXJjZS5nZXRTeXN0ZW1OYW1lKCksIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlVHJhbnNhY3Rpb24oUmVzb3VyY2UgcmVzb3VyY2UsIFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIGJvb2xlYW4gaXNOb3JtYXRpdmUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkvLyB2YWxpZGF0ZSByZXNvdXJjZSBuYW1lIHVuaXF1ZW5lc3MKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSByZXNvdXJjZSBuYW1lIik7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlUmVzb3VyY2VOYW1lRXhpc3RzKHVzZXIsIHJlc291cmNlLCBhY3Rpb25FbnVtKTsKKwkJaWYgKGVpdGhlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlclZhbGlkYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWxvZy5kZWJ1Zygic2VuZCByZXNvdXJjZSB7fSB0byBkYW8gZm9yIGNyZWF0ZSIsIHJlc291cmNlLmdldE5hbWUoKSk7CisKKwkJY3JlYXRlQXJ0aWZhY3RzUGxhY2VIb2xkZXJEYXRhKHJlc291cmNlLCB1c2VyKTsKKworCQkvLworCQlpZiAoIWlzTm9ybWF0aXZlKSB7CisJCQkvLyBlbnJpY2ggb2JqZWN0CisJCQlsb2cuZGVidWcoImVucmljaCByZXNvdXJjZSB3aXRoIGNyZWF0b3IsIHZlcnNpb24gYW5kIHN0YXRlIik7CisJCQlyZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCQlyZXNvdXJjZS5zZXRWZXJzaW9uKElOSVRJQUxfVkVSU0lPTik7CisJCQlyZXNvdXJjZS5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKwkJCXJlc291cmNlLnNldEFic3RyYWN0KGZhbHNlKTsKKwkJfQorCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGF0YU1vZGVsUmVzcG9uc2UgPSByZXNvdXJjZU9wZXJhdGlvbi5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgaW5UcmFuc2FjdGlvbik7CisKKwkJLy8gUmVzb3VyY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkhISEKKwkJaWYgKGRhdGFNb2RlbFJlc3BvbnNlLmlzTGVmdCgpKSB7CisJCQlsb2cuZGVidWcoIlJlc291cmNlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISEhIik7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChkYXRhTW9kZWxSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGRhdGFNb2RlbFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSksIHJlc291cmNlKTsKKworCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQXJ0aWZhY3RzUGxhY2VIb2xkZXJEYXRhKFJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIpIHsKKwkJLy8gY3JlYXRlIG1hbmRhdG9yeSBhcnRpZmFjdHMKKworCQkvLyBUT0RPIGl0IG11c3QgYmUgcmVtb3ZlZCBhZnRlciB0aGF0IGFydGlmYWN0IHVuaXF1ZUlkIGNyZWF0aW9uIHdpbGwgYmUKKwkJLy8gbW92ZWQgdG8gQXJ0aWZhY3RPcGVyYXRpb24KKwkJLy8gU3RyaW5nIHJlc291cmNlVW5pcXVlSWQgPQorCQkvLyBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXNvdXJjZVVuaXF1ZUlkKHJlc291cmNlLmdldFJlc291cmNlTmFtZSgpLAorCQkvLyByZXNvdXJjZS5nZXRSZXNvdXJjZVZlcnNpb24oKSk7CisKKwkJc2V0SW5mb3JtYXRpb25hbEFydGlmYWN0c1BsYWNlSG9sZGVyKHJlc291cmNlLCB1c2VyKTsKKwkJc2V0RGVwbG95bWVudEFydGlmYWN0c1BsYWNlSG9sZGVyKHJlc291cmNlLCB1c2VyKTsKKwkJc2V0VG9zY2FBcnRpZmFjdHNQbGFjZUhvbGRlcnMocmVzb3VyY2UsIHVzZXIpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRBcnRpZmFjdHNQbGFjZUhvbGRlcihDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIHVzZXIpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNvbXBvbmVudDsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdE1hcCA9IHJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJaWYgKGFydGlmYWN0TWFwID09IG51bGwpIHsKKwkJCWFydGlmYWN0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KCk7CisJCX0KKwkJTWFwPFN0cmluZywgT2JqZWN0PiBkZXBsb3ltZW50UmVzb3VyY2VBcnRpZmFjdHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXREZXBsb3ltZW50UmVzb3VyY2VBcnRpZmFjdHMoKTsKKwkJaWYgKGRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ZXJhdG9yID0gZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlFbnRyeTxTdHJpbmcsIE9iamVjdD4gY3VyckVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCWJvb2xlYW4gc2hvdWxkQ3JlYXRlQXJ0aWZhY3QgPSB0cnVlOworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJ0aWZhY3REZXRhaWxzID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGN1cnJFbnRyeS5nZXRWYWx1ZSgpOworCQkJCU9iamVjdCBvYmplY3QgPSBhcnRpZmFjdERldGFpbHMuZ2V0KFBMQUNFX0hPTERFUl9SRVNPVVJDRV9UWVBFUyk7CisJCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7CisJCQkJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdFR5cGVzID0gKExpc3Q8U3RyaW5nPikgb2JqZWN0OworCQkJCQlpZiAoIWFydGlmYWN0VHlwZXMuY29udGFpbnMocmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkubmFtZSgpKSkgeworCQkJCQkJc2hvdWxkQ3JlYXRlQXJ0aWZhY3QgPSBmYWxzZTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmluZm8oInJlc291cmNlIHR5cGVzIGZvciBhcnRpZmFjdCBwbGFjZWhvbGRlciB7fSB3ZXJlIG5vdCBkZWZpbmVkLiBkZWZhdWx0IGlzIGFsbCByZXNvdXJjZXMiLCBjdXJyRW50cnkuZ2V0S2V5KCkpOworCQkJCX0KKwkJCQlpZiAoc2hvdWxkQ3JlYXRlQXJ0aWZhY3QpIHsKKwkJCQkJaWYgKGFydGlmYWN0c0J1c2luZXNzTG9naWMgIT0gbnVsbCkgeworCQkJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGFydGlmYWN0c0J1c2luZXNzTG9naWMuY3JlYXRlQXJ0aWZhY3RQbGFjZUhvbGRlckluZm8ocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgY3VyckVudHJ5LmdldEtleSgpLCAoTWFwPFN0cmluZywgT2JqZWN0PikgY3VyckVudHJ5LmdldFZhbHVlKCksIHVzZXIsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5UKTsKKwkJCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24gIT0gbnVsbCAmJiAhYXJ0aWZhY3RNYXAuY29udGFpbnNLZXkoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKSkpCisJCQkJCQkJYXJ0aWZhY3RNYXAucHV0KGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdExhYmVsKCksIGFydGlmYWN0RGVmaW5pdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmVzb3VyY2Uuc2V0RGVwbG95bWVudEFydGlmYWN0cyhhcnRpZmFjdE1hcCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEluZm9ybWF0aW9uYWxBcnRpZmFjdHNQbGFjZUhvbGRlcihSZXNvdXJjZSByZXNvdXJjZSwgVXNlciB1c2VyKSB7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RNYXAgPSByZXNvdXJjZS5nZXRBcnRpZmFjdHMoKTsKKwkJaWYgKGFydGlmYWN0TWFwID09IG51bGwpIHsKKwkJCWFydGlmYWN0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KCk7CisJCX0KKwkJU3RyaW5nIHJlc291cmNlVW5pcXVlSWQgPSByZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQlMaXN0PFN0cmluZz4gZXhsdWRlUmVzb3VyY2VDYXRlZ29yeSA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4Y2x1ZGVSZXNvdXJjZUNhdGVnb3J5KCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25hbFJlc291cmNlQXJ0aWZhY3RzID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0SW5mb3JtYXRpb25hbFJlc291cmNlQXJ0aWZhY3RzKCk7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gcmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpOworCQlib29sZWFuIGlzQ3JlYXRlQXJ0aWZhY3QgPSB0cnVlOworCQlpZiAoZXhsdWRlUmVzb3VyY2VDYXRlZ29yeSAhPSBudWxsKSB7CisJCQlTdHJpbmcgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmdldCgwKS5nZXROYW1lKCk7CisJCQlmb3IgKFN0cmluZyBleGx1ZGUgOiBleGx1ZGVSZXNvdXJjZUNhdGVnb3J5KSB7CisJCQkJaWYgKGV4bHVkZS5lcXVhbHNJZ25vcmVDYXNlKGNhdGVnb3J5KSkgeworCQkJCQlpc0NyZWF0ZUFydGlmYWN0ID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJaWYgKGluZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0cyAhPSBudWxsICYmIGlzQ3JlYXRlQXJ0aWZhY3QpIHsKKwkJCVNldDxTdHJpbmc+IGtleXMgPSBpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHMua2V5U2V0KCk7CisJCQlmb3IgKFN0cmluZyBpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdE5hbWUgOiBrZXlzKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcnRpZmFjdEluZm9NYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgaW5mb3JtYXRpb25hbFJlc291cmNlQXJ0aWZhY3RzLmdldChpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdE5hbWUpOworCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBhcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmNyZWF0ZUFydGlmYWN0UGxhY2VIb2xkZXJJbmZvKHJlc291cmNlVW5pcXVlSWQsIGluZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0TmFtZSwgYXJ0aWZhY3RJbmZvTWFwLCB1c2VyLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uSU5GT1JNQVRJT05BTCk7CisJCQkJYXJ0aWZhY3RNYXAucHV0KGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdExhYmVsKCksIGFydGlmYWN0RGVmaW5pdGlvbik7CisKKwkJCX0KKwkJfQorCQlyZXNvdXJjZS5zZXRBcnRpZmFjdHMoYXJ0aWZhY3RNYXApOworCX0KKworCS8qKgorCSAqIGRlbGV0ZVJlc291cmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcGFyYW0gdXNlcgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgUmVzcG9uc2VGb3JtYXQgZGVsZXRlUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlSWQsIFVzZXIgdXNlcikgeworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDcmVhdG9yID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXIsICJEZWxldGUgUmVzb3VyY2UiLCBmYWxzZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpOworCQl9CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZVN0YXR1cyA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlSWQpOworCQlpZiAocmVzb3VyY2VTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgcmVzb3VyY2Uge30iLCByZXNvdXJjZUlkKTsKKwkJCXJldHVybiBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc291cmNlU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSksICIiKTsKKwkJfQorCisJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tSZXN1bHQgPSBsb2NrQ29tcG9uZW50KHJlc291cmNlSWQsIHJlc291cmNlLCAiTWFyayByZXNvdXJjZSB0byBkZWxldGUiKTsKKwkJaWYgKGxvY2tSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCisJCXRyeSB7CisKKwkJCXJlc3VsdCA9IG1hcmtDb21wb25lbnRUb0RlbGV0ZShyZXNvdXJjZSk7CisJCQlpZiAocmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKTsKKwkJCX0gZWxzZSB7CisJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShyZXN1bHQpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShhY3Rpb25TdGF0dXMsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQl9CisJCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCAhcmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy53YXJuKCJvcGVyYXRpb24gZmFpbGVkLiBkbyByb2xsYmFjayIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIm9wZXJhdGlvbiBzdWNjZXNzLiBkbyBjb21taXQiKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHJlc291cmNlSWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCX0KKworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBkZWxldGVSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIHZlcnNpb24sIFVzZXIgdXNlcikgeworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCk7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQ3JlYXRvciA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VyLCAiRGVsZXRlIFJlc291cmNlIiwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCisJCS8vIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzTGlzdCA9IG51bGw7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJdHJ5IHsKKworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZVN0YXR1cyA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsIHZlcnNpb24sIHRydWUpOworCQkJaWYgKHJlc291cmNlU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCByZXNvdXJjZSB7fSB2ZXJzaW9uIHt9IiwgcmVzb3VyY2VOYW1lLCB2ZXJzaW9uKTsKKwkJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzb3VyY2VTdGF0dXMucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2VOYW1lKTsKKwkJCX0KKworCQkJcmVzb3VyY2VzTGlzdCA9IHJlc291cmNlU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCX0gZmluYWxseSB7CisJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgIXJlc3VsdC5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlsb2cud2Fybigib3BlcmF0aW9uIGZhaWxlZC4gZG8gcm9sbGJhY2siKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc3VsdCk7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGFjdGlvblN0YXR1cywgcmVzb3VyY2VOYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJvcGVyYXRpb24gc3VjY2Vzcy4gZG8gY29tbWl0Iik7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZXNMaXN0KSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tSZXN1bHQgPSBsb2NrQ29tcG9uZW50KHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHJlc291cmNlLCAiRGVsZXRlIFJlc291cmNlIik7CisJCQlpZiAobG9ja1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQkJcmV0dXJuIGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisJCQl0cnkgeworCQkJCXJlc3VsdCA9IG1hcmtDb21wb25lbnRUb0RlbGV0ZShyZXNvdXJjZSk7CisJCQkJaWYgKCFyZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzdWx0KTsKKwkJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGFjdGlvblN0YXR1cywgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCQkJCX0KKworCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgIXJlc3VsdC5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJbG9nLndhcm4oIm9wZXJhdGlvbiBmYWlsZWQuIGRvIHJvbGxiYWNrIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1Zygib3BlcmF0aW9uIHN1Y2Nlc3MuIGRvIGNvbW1pdCIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGdldFJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkLCBVc2VyIHVzZXIpIHsKKworCQlpZiAodXNlciAhPSBudWxsKSB7CisJCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckNyZWF0b3IgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlciwgIkNyZWF0ZSBSZXNvdXJjZSIsIGZhbHNlKTsKKwkJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJSVJlc291cmNlT3BlcmF0aW9uIGRhdGFNb2RlbCA9IGdldFJlc291cmNlT3BlcmF0aW9uKCk7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RvcmFnZVN0YXR1cyA9IGRhdGFNb2RlbC5nZXRSZXNvdXJjZShyZXNvdXJjZUlkKTsKKworCQlpZiAoc3RvcmFnZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCByZXNvdXJjZSBieSBpZCB7fSIsIHJlc291cmNlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdG9yYWdlU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSksICIiKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHN0b3JhZ2VTdGF0dXMubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgUmVzcG9uc2VGb3JtYXQ+IGdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLCBTdHJpbmcgdXNlcklkKSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgImdldCBSZXNvdXJjZSBCeSBOYW1lIEFuZCBWZXJzaW9uIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsIHJlc291cmNlVmVyc2lvbiwgZmFsc2UpOworCQlpZiAoZ2V0UmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgcmVzb3VyY2UgYnkgbmFtZSB7fSBhbmQgdmVyc2lvbiB7fSIsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZ2V0UmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKSwgcmVzb3VyY2VOYW1lKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGdldFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiB1cGRhdGVSZXNvdXJjZU1ldGFkYXRhCisJICogCisJICogQHBhcmFtIHVzZXIKKwkgKiAgICAgICAgICAgIC0gbW9kaWZpZXIgZGF0YSAodXNlcklkKQorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogICAgICAgICAgICBUT0RPCisJICogQHBhcmFtIHJlc291cmNlSWRUb1VwZGF0ZQorCSAqICAgICAgICAgICAgLSB0aGUgcmVzb3VyY2UgaWRlbnRpZmllcgorCSAqIEBwYXJhbSBuZXdSZXNvdXJjZQorCSAqIAorCSAqIEByZXR1cm4gRWl0aGVyPFJlc291cmNlLCByZXNwb25zZUZvcm1hdD4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlUmVzb3VyY2VNZXRhZGF0YShTdHJpbmcgcmVzb3VyY2VJZFRvVXBkYXRlLCBSZXNvdXJjZSBuZXdSZXNvdXJjZSwgUmVzb3VyY2UgY3VycmVudFJlc291cmNlLCBVc2VyIHVzZXIsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VyLmdldFVzZXJJZCgpLCAidXBkYXRlIFJlc291cmNlIE1ldGFkYXRhIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJSVJlc291cmNlT3BlcmF0aW9uIGRhdGFNb2RlbCA9IGdldFJlc291cmNlT3BlcmF0aW9uKCk7CisJCWxvZy5kZWJ1ZygiR2V0IHJlc291cmNlIHdpdGggaWQge30iLCByZXNvdXJjZUlkVG9VcGRhdGUpOworCQlib29sZWFuIG5lZWRUb1VubG9jayA9IGZhbHNlOworCQlib29sZWFuIHJvbGxiYWNrTmVlZGVkID0gdHJ1ZTsKKworCQl0cnkgeworCQkJLy8gRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdG9yYWdlU3RhdHVzID0KKwkJCS8vIGRhdGFNb2RlbC5nZXRSZXNvdXJjZV90eChyZXNvdXJjZUlkVG9VcGRhdGUsIGZhbHNlKTsKKwkJCWlmIChjdXJyZW50UmVzb3VyY2UgPT0gbnVsbCkgeworCQkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RvcmFnZVN0YXR1cyA9IGRhdGFNb2RlbC5nZXRSZXNvdXJjZShyZXNvdXJjZUlkVG9VcGRhdGUsIGZhbHNlKTsKKwkJCQlpZiAoc3RvcmFnZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdG9yYWdlU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSksICIiKSk7CisJCQkJfQorCisJCQkJY3VycmVudFJlc291cmNlID0gc3RvcmFnZVN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCX0KKwkJCS8vIHZlcmlmeSB0aGF0IHJlc291cmNlIGlzIGNoZWNrZWQtb3V0IGFuZCB0aGUgdXNlciBpcyB0aGUgbGFzdAorCQkJLy8gdXBkYXRlcgorCQkJaWYgKCFDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uUmVzb3VyY2UoY3VycmVudFJlc291cmNlLCB1c2VyLmdldFVzZXJJZCgpKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQkJfQorCisJCQkvLyBsb2NrIHJlc291cmNlCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tSZXN1bHQgPSBncmFwaExvY2tPcGVyYXRpb24ubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkVG9VcGRhdGUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQlpZiAoIWxvY2tSZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkTG9ja09iamVjdEVycm9yLCAiVXBsb2FkIEFydGlmYWN0IC0gbG9jayAiICsgcmVzb3VyY2VJZFRvVXBkYXRlICsgIjogIiArIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkTG9ja09iamVjdEVycm9yKCJVcGxvYWQgQXJ0aWZhY3QgLSBsb2NrICIsIE5vZGVUeXBlRW51bS5SZXNvdXJjZS5nZXROYW1lKCksIHJlc291cmNlSWRUb1VwZGF0ZSk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gbG9jayByZXNvdXJjZSB7fSBlcnJvciAtIHt9IiwgcmVzb3VyY2VJZFRvVXBkYXRlLCBsb2NrUmVzdWx0KTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UobG9ja1Jlc3VsdCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQluZWVkVG9VbmxvY2sgPSB0cnVlOworCisJCQkvLyBjcml0aWNhbCBzZWN0aW9uIHN0YXJ0cyBoZXJlCisJCQkvLyBjb252ZXJ0IGpzb24gdG8gb2JqZWN0CisKKwkJCS8vIFVwZGF0ZSBhbmQgdXBkYXRlZCByZXNvdXJjZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgImRlcml2ZWRGcm9tIgorCQkJLy8gbGlzdAorCQkJLy8gVGhpcyBjb2RlIGlzIG5vdCBjYWxsZWQgZnJvbSBpbXBvcnQgcmVzb3VyY2VzLCBiZWNhdXNlIG9mIHJvb3QKKwkJCS8vIFZGICJkZXJpdmVkRnJvbSIgc2hvdWxkIGJlIG51bGwgKG9yIGlnbm9yZWQpCisJCQlpZiAoIWN1cnJlbnRSZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMoUmVzb3VyY2VUeXBlRW51bS5WRikpIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGRlcml2ZWRGcm9tTm90RW1wdHlFaXRoZXIgPSB2YWxpZGF0ZURlcml2ZWRGcm9tTm90RW1wdHkobnVsbCwgbmV3UmVzb3VyY2UsIG51bGwpOworCQkJCWlmIChkZXJpdmVkRnJvbU5vdEVtcHR5RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZvciB1cGRhdGVkIHJlc291cmNlIHt9LCBkZXJpdmVkIGZyb20gZmllbGQgaXMgZW1wdHkiLCBuZXdSZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRlcml2ZWRGcm9tTm90RW1wdHlFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisKKwkJCQlkZXJpdmVkRnJvbU5vdEVtcHR5RWl0aGVyID0gdmFsaWRhdGVEZXJpdmVkRnJvbU5vdEVtcHR5KG51bGwsIGN1cnJlbnRSZXNvdXJjZSwgbnVsbCk7CisJCQkJaWYgKGRlcml2ZWRGcm9tTm90RW1wdHlFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZm9yIGN1cnJlbnQgcmVzb3VyY2Uge30sIGRlcml2ZWQgZnJvbSBmaWVsZCBpcyBlbXB0eSIsIGN1cnJlbnRSZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRlcml2ZWRGcm9tTm90RW1wdHlFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5ld1Jlc291cmNlLnNldERlcml2ZWRGcm9tKG51bGwpOworCQkJfQorCisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBkYXRhTW9kZWxSZXNwb25zZSA9IHVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VJZFRvVXBkYXRlLCBuZXdSZXNvdXJjZSwgdXNlciwgY3VycmVudFJlc291cmNlLCBmYWxzZSwgdHJ1ZSk7CisJCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIHJlc291cmNlIG1ldGFkYXRhISEhIik7CisJCQkJcm9sbGJhY2tOZWVkZWQgPSB0cnVlOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZGF0YU1vZGVsUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJbG9nLmRlYnVnKCJSZXNvdXJjZSBtZXRhZGF0YSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEhISIpOworCQkJcm9sbGJhY2tOZWVkZWQgPSBmYWxzZTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChkYXRhTW9kZWxSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmICghaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyb2xsYmFja05lZWRlZCkgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAobmVlZFRvVW5sb2NrKSB7CisJCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChyZXNvdXJjZUlkVG9VcGRhdGUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVJlc291cmNlTWV0YWRhdGEoU3RyaW5nIHJlc291cmNlSWRUb1VwZGF0ZSwgUmVzb3VyY2UgbmV3UmVzb3VyY2UsIFVzZXIgdXNlciwgUmVzb3VyY2UgY3VycmVudFJlc291cmNlLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUlSZXNvdXJjZU9wZXJhdGlvbiBkYXRhTW9kZWwgPSBnZXRSZXNvdXJjZU9wZXJhdGlvbigpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VGaWVsZHMgPSB2YWxpZGF0ZVJlc291cmNlRmllbGRzQmVmb3JlVXBkYXRlKGN1cnJlbnRSZXNvdXJjZSwgbmV3UmVzb3VyY2UsIGluVHJhbnNhY3Rpb24pOworCQlpZiAodmFsaWRhdGVSZXNvdXJjZUZpZWxkcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVSZXNvdXJjZUZpZWxkcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCS8vIFNldHRpbmcgbGFzdCB1cGRhdGVyIGFuZCB1bmlxdWVJZAorCQluZXdSZXNvdXJjZS5zZXRDb250YWN0SWQobmV3UmVzb3VyY2UuZ2V0Q29udGFjdElkKCkudG9Mb3dlckNhc2UoKSk7CisJCW5ld1Jlc291cmNlLnNldExhc3RVcGRhdGVyVXNlcklkKHVzZXIuZ2V0VXNlcklkKCkpOworCQluZXdSZXNvdXJjZS5zZXRVbmlxdWVJZChyZXNvdXJjZUlkVG9VcGRhdGUpOworCQkvLyBDYW5ub3Qgc2V0IGhpZ2hlc3QgdmVyc2lvbiB0aHJvdWdoIFVJCisJCW5ld1Jlc291cmNlLnNldEhpZ2hlc3RWZXJzaW9uKG51bGwpOworCQluZXdSZXNvdXJjZS5zZXRDcmVhdGlvbkRhdGUoY3VycmVudFJlc291cmNlLmdldENyZWF0aW9uRGF0ZSgpKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHByb2Nlc3NVcGRhdGVPZkRlcml2ZWRGcm9tID0gcHJvY2Vzc1VwZGF0ZU9mRGVyaXZlZEZyb20oY3VycmVudFJlc291cmNlLCBuZXdSZXNvdXJjZSwgdXNlci5nZXRVc2VySWQoKSwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKHByb2Nlc3NVcGRhdGVPZkRlcml2ZWRGcm9tLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCB1cGRhdGUgZGVyaXZlZCBmcm9tIGZvciByZXNvdXJjZSB7fSIsIHJlc291cmNlSWRUb1VwZGF0ZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHByb2Nlc3NVcGRhdGVPZkRlcml2ZWRGcm9tLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlsb2cuZGVidWcoInNlbmQgcmVzb3VyY2Uge30gdG8gZGFvIGZvciB1cGRhdGUiLCBuZXdSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkYXRhTW9kZWxSZXNwb25zZSA9IGRhdGFNb2RlbC51cGRhdGVSZXNvdXJjZShuZXdSZXNvdXJjZSwgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKGRhdGFNb2RlbFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpLCBuZXdSZXNvdXJjZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfSBlbHNlIGlmIChkYXRhTW9kZWxSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk5vIHJlc3BvbnNlIGZyb20gdXBkYXRlUmVzb3VyY2UiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRhdGFNb2RlbFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiB2YWxpZGF0ZVJlc291cmNlRmllbGRzQmVmb3JlQ3JlYXRlCisJICogCisJICogQHBhcmFtIHVzZXIKKwkgKiAgICAgICAgICAgIC0gbW9kaWZpZXIgZGF0YSAodXNlcklkKQorCSAqIEBwYXJhbSBkYXRhTW9kZWwKKwkgKiAgICAgICAgICAgIC0gSVJlc291cmNlT3BlcmF0aW9uIGZvciByZXNvdXJjZSBjcnVkCisJICogQHBhcmFtIHJlc291cmNlCisJICogICAgICAgICAgICAtIFJlc291cmNlIG9iamVjdCB0byB2YWxpZGF0ZQorCSAqIEByZXR1cm4gRWl0aGVyPEJvb2xlYW4sIEVycm9yUmVzcG9uc2U+CisJICovCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VGaWVsZHNCZWZvcmVDcmVhdGUoVXNlciB1c2VyLCBJUmVzb3VyY2VPcGVyYXRpb24gZGF0YU1vZGVsLCBSZXNvdXJjZSByZXNvdXJjZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGNvbXBvbmVudHNGaWVsZHNWYWxpZGF0aW9uID0gdmFsaWRhdGVDb21wb25lbnRGaWVsZHNCZWZvcmVDcmVhdGUodXNlciwgcmVzb3VyY2UsIGFjdGlvbkVudW0pOworCQlpZiAoY29tcG9uZW50c0ZpZWxkc1ZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gY29tcG9uZW50c0ZpZWxkc1ZhbGlkYXRpb247CisJCX0KKworCQkvLyB2YWxpZGF0ZSBuYW1lCisKKwkJLyoKKwkJICogbG9nLmRlYnVnKCJ2YWxpZGF0ZSByZXNvdXJjZSBuYW1lIik7IEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlQ29tcG9uZW50TmFtZSh1c2VyLCByZXNvdXJjZSwgYWN0aW9uRW51bSk7IGlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeyByZXR1cm4gZWl0aGVyVmFsaWRhdGlvbjsgfQorCQkgKiAKKwkJICogLy8gdmFsaWRhdGUgZGVzY3JpcHRpb24gbG9nLmRlYnVnKCJ2YWxpZGF0ZSBkZXNjcmlwdGlvbiIpOyBlaXRoZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVEZXNjcmlwdGlvbkFuZENsZWFudXAodXNlciwgcmVzb3VyY2UsIGFjdGlvbkVudW0pOyBpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsgcmV0dXJuIGVpdGhlclZhbGlkYXRpb247IH0KKwkJICovCisKKwkJLy8gdmFsaWRhdGUgaWNvbgorCQkvKgorCQkgKiBsb2cuZGVidWcoInZhbGlkYXRlIGljb24iKTsgZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlSWNvbih1c2VyLCByZXNvdXJjZSwgYWN0aW9uRW51bSk7IGlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeyByZXR1cm4gZWl0aGVyVmFsaWRhdGlvbjsgfQorCQkgKi8KKworCQkvLyB2YWxpZGF0ZSB0YWdzCisJCS8qCisJCSAqIGxvZy5kZWJ1ZygidmFsaWRhdGUgdGFncyIpOyBlaXRoZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVUYWdzTGlzdEFuZFJlbW92ZUR1cGxpY2F0ZXModXNlciwgcmVzb3VyY2UsIGFjdGlvbkVudW0pOyBpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsgcmV0dXJuIGVpdGhlclZhbGlkYXRpb247IH0KKwkJICovCisKKwkJLy8gdmFsaWRhdGUgY2F0ZWdvcnkKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBjYXRlZ29yeSIpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZUNhdGVnb3J5KHVzZXIsIHJlc291cmNlLCBhY3Rpb25FbnVtLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGVpdGhlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gZWl0aGVyVmFsaWRhdGlvbjsKKwkJfQorCisJCS8vIHZhbGlkYXRlIHZlbmRvciBuYW1lICYgcmVsZWFzZQorCQlsb2cuZGVidWcoInZhbGlkYXRlIHZlbmRvciBuYW1lIik7CisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVZlbmRvck5hbWUodXNlciwgcmVzb3VyY2UsIGFjdGlvbkVudW0pOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJWYWxpZGF0aW9uOworCQl9CisKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSB2ZW5kb3IgcmVsZWFzZSIpOworCQllaXRoZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVWZW5kb3JSZWxlYXNlTmFtZSh1c2VyLCByZXNvdXJjZSwgYWN0aW9uRW51bSk7CisJCWlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGVpdGhlclZhbGlkYXRpb247CisJCX0KKworCQkvLyB2YWxpZGF0ZSBjb3N0CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgY29zdCIpOworCQllaXRoZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVDb3N0KHVzZXIsIHJlc291cmNlLCBhY3Rpb25FbnVtKTsKKwkJaWYgKGVpdGhlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gZWl0aGVyVmFsaWRhdGlvbjsKKwkJfQorCisJCS8vIHZhbGlkYXRlIGxpY2Vuc2VUeXBlCisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgbGljZW5zZVR5cGUiKTsKKwkJZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlTGljZW5zZVR5cGUodXNlciwgcmVzb3VyY2UsIGFjdGlvbkVudW0pOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJWYWxpZGF0aW9uOworCQl9CisKKwkJLy8gdmFsaWRhdGUgdGVtcGxhdGUgKGRlcml2ZWQgZnJvbSkKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBkZXJpdmVkIGZyb20iKTsKKwkJaWYgKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhSZXNvdXJjZVR5cGVFbnVtLlZGKSkgeworCQkJcmVzb3VyY2Uuc2V0RGVyaXZlZEZyb20obnVsbCk7CisJCX0KKwkJZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlRGVyaXZlZEZyb21FeGlzdCh1c2VyLCByZXNvdXJjZSwgYWN0aW9uRW51bSk7CisJCWlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQkvLyB3YXJuIGFib3V0IG5vbi11cGRhdGFibGUgZmllbGRzCisJCWNoZWNrQ29tcG9uZW50RmllbGRzRm9yT3ZlcnJpZGVBdHRlbXB0KHJlc291cmNlKTsKKwkJU3RyaW5nIGN1cnJlbnRDcmVhdG9yRnVsbE5hbWUgPSByZXNvdXJjZS5nZXRDcmVhdG9yRnVsbE5hbWUoKTsKKwkJaWYgKGN1cnJlbnRDcmVhdG9yRnVsbE5hbWUgIT0gbnVsbCkgeworCQkJbG9nLndhcm4oIlJlc291cmNlIENyZWF0b3IgZnVsbG5hbWUgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlTdHJpbmcgY3VycmVudExhc3RVcGRhdGVyRnVsbE5hbWUgPSByZXNvdXJjZS5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCk7CisJCWlmIChjdXJyZW50TGFzdFVwZGF0ZXJGdWxsTmFtZSAhPSBudWxsKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgTGFzdFVwZGF0ZXIgZnVsbG5hbWUgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlMb25nIGN1cnJlbnRMYXN0VXBkYXRlRGF0ZSA9IHJlc291cmNlLmdldExhc3RVcGRhdGVEYXRlKCk7CisJCWlmIChjdXJyZW50TGFzdFVwZGF0ZURhdGUgIT0gbnVsbCkgeworCQkJbG9nLndhcm4oIlJlc291cmNlIGxhc3QgdXBkYXRlIGRhdGUgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlCb29sZWFuIGN1cnJlbnRBYnN0cmFjdCA9IHJlc291cmNlLmlzQWJzdHJhY3QoKTsKKwkJaWYgKGN1cnJlbnRBYnN0cmFjdCAhPSBudWxsKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgYWJzdHJhY3QgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJLyoqCisJICogdmFsaWRhdGVSZXNvdXJjZUZpZWxkc0JlZm9yZVVwZGF0ZQorCSAqIAorCSAqIEBwYXJhbSBjdXJyZW50UmVzb3VyY2UKKwkgKiAgICAgICAgICAgIC0gUmVzb3VyY2Ugb2JqZWN0IHRvIHZhbGlkYXRlCisJICogQHJldHVybiBFaXRoZXI8Qm9vbGVhbiwgRXJyb3JSZXNwb25zZT4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVSZXNvdXJjZUZpZWxkc0JlZm9yZVVwZGF0ZShSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UsIFJlc291cmNlIHVwZGF0ZUluZm9SZXNvdXJjZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJYm9vbGVhbiBoYXNCZWVuQ2VydGlmaWVkID0gVmFsaWRhdGlvblV0aWxzLmhhc0JlZW5DZXJ0aWZpZWQoY3VycmVudFJlc291cmNlLmdldFZlcnNpb24oKSk7CisKKwkJLy8gdmFsaWRhdGUgcmVzb3VyY2UgbmFtZQorCQlsb2cuZGVidWcoInZhbGlkYXRlIHJlc291cmNlIG5hbWUgYmVmb3JlIHVwZGF0ZSIpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVJlc291cmNlTmFtZShjdXJyZW50UmVzb3VyY2UsIHVwZGF0ZUluZm9SZXNvdXJjZSwgaGFzQmVlbkNlcnRpZmllZCk7CisJCWlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGVpdGhlclZhbGlkYXRpb247CisJCX0KKworCQkvLyB2YWxpZGF0ZSBkZXNjcmlwdGlvbgorCQlsb2cuZGVidWcoInZhbGlkYXRlIGRlc2NyaXB0aW9uIGJlZm9yZSB1cGRhdGUiKTsKKwkJZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlRGVzY3JpcHRpb25BbmRDbGVhbnVwKG51bGwsIHVwZGF0ZUluZm9SZXNvdXJjZSwgbnVsbCk7CisJCWlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGVpdGhlclZhbGlkYXRpb247CisJCX0KKworCQlsb2cuZGVidWcoInZhbGlkYXRlIGljb24gYmVmb3JlIHVwZGF0ZSIpOworCQllaXRoZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVJY29uKGN1cnJlbnRSZXNvdXJjZSwgdXBkYXRlSW5mb1Jlc291cmNlLCBoYXNCZWVuQ2VydGlmaWVkKTsKKwkJaWYgKGVpdGhlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gZWl0aGVyVmFsaWRhdGlvbjsKKwkJfQorCisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgdGFncyBiZWZvcmUgdXBkYXRlIik7CisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVRhZ3NMaXN0QW5kUmVtb3ZlRHVwbGljYXRlcyhudWxsLCB1cGRhdGVJbmZvUmVzb3VyY2UsIG51bGwpOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJWYWxpZGF0aW9uOworCQl9CisKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSB2ZW5kb3IgbmFtZSBiZWZvcmUgdXBkYXRlIik7CisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVZlbmRvck5hbWUoY3VycmVudFJlc291cmNlLCB1cGRhdGVJbmZvUmVzb3VyY2UsIGhhc0JlZW5DZXJ0aWZpZWQpOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJWYWxpZGF0aW9uOworCQl9CisKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSB2ZW5kb3IgcmVsZWFzZSBiZWZvcmUgdXBkYXRlIik7CisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVZlbmRvclJlbGVhc2VOYW1lKG51bGwsIHVwZGF0ZUluZm9SZXNvdXJjZSwgbnVsbCk7CisJCWlmIChlaXRoZXJWYWxpZGF0aW9uLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGVpdGhlclZhbGlkYXRpb247CisJCX0KKworCQlsb2cuZGVidWcoInZhbGlkYXRlIGNvbnRhY3QgaW5mbyBiZWZvcmUgdXBkYXRlIik7CisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbnRhY3RJZChudWxsLCB1cGRhdGVJbmZvUmVzb3VyY2UsIG51bGwpOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJWYWxpZGF0aW9uOworCQl9CisKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBkZXJpdmVkIGJlZm9yZSB1cGRhdGUiKTsKKwkJZWl0aGVyVmFsaWRhdGlvbiA9IHZhbGlkYXRlRGVyaXZlZEZyb21EdXJpbmdVcGRhdGUoY3VycmVudFJlc291cmNlLCB1cGRhdGVJbmZvUmVzb3VyY2UsIGhhc0JlZW5DZXJ0aWZpZWQpOworCQlpZiAoZWl0aGVyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJWYWxpZGF0aW9uOworCQl9CisKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBjYXRlZ29yeSBiZWZvcmUgdXBkYXRlIik7CisJCWVpdGhlclZhbGlkYXRpb24gPSB2YWxpZGF0ZUNhdGVnb3J5KGN1cnJlbnRSZXNvdXJjZSwgdXBkYXRlSW5mb1Jlc291cmNlLCBoYXNCZWVuQ2VydGlmaWVkLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGVpdGhlclZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gZWl0aGVyVmFsaWRhdGlvbjsKKwkJfQorCisJCS8vIHdhcm4gYWJvdXQgbm9uLXVwZGF0YWJsZSBmaWVsZHMKKwkJU3RyaW5nIGN1cnJlbnRSZXNvdXJjZVZlcnNpb24gPSBjdXJyZW50UmVzb3VyY2UuZ2V0VmVyc2lvbigpOworCQlTdHJpbmcgdXBkYXRlZFJlc291cmNlVmVyc2lvbiA9IHVwZGF0ZUluZm9SZXNvdXJjZS5nZXRWZXJzaW9uKCk7CisKKwkJaWYgKCh1cGRhdGVkUmVzb3VyY2VWZXJzaW9uICE9IG51bGwpICYmICghdXBkYXRlZFJlc291cmNlVmVyc2lvbi5lcXVhbHMoY3VycmVudFJlc291cmNlVmVyc2lvbikpKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgdmVyc2lvbiBpcyBhdXRvbWF0aWNhbGx5IHNldCBhbmQgY2Fubm90IGJlIHVwZGF0ZWQiKTsKKwkJfQorCisJCVN0cmluZyBjdXJyZW50Q3JlYXRvclVzZXJJZCA9IGN1cnJlbnRSZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCk7CisJCVN0cmluZyB1cGRhdGVkQ3JlYXRvclVzZXJJZCA9IHVwZGF0ZUluZm9SZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCk7CisKKwkJaWYgKCh1cGRhdGVkQ3JlYXRvclVzZXJJZCAhPSBudWxsKSAmJiAoIXVwZGF0ZWRDcmVhdG9yVXNlcklkLmVxdWFscyhjdXJyZW50Q3JlYXRvclVzZXJJZCkpKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgQ3JlYXRvciBVc2VyIGlkIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGFuZCBjYW5ub3QgYmUgdXBkYXRlZCIpOworCQl9CisKKwkJU3RyaW5nIGN1cnJlbnRDcmVhdG9yRnVsbE5hbWUgPSBjdXJyZW50UmVzb3VyY2UuZ2V0Q3JlYXRvckZ1bGxOYW1lKCk7CisJCVN0cmluZyB1cGRhdGVkQ3JlYXRvckZ1bGxOYW1lID0gdXBkYXRlSW5mb1Jlc291cmNlLmdldENyZWF0b3JGdWxsTmFtZSgpOworCisJCWlmICgodXBkYXRlZENyZWF0b3JGdWxsTmFtZSAhPSBudWxsKSAmJiAoIXVwZGF0ZWRDcmVhdG9yRnVsbE5hbWUuZXF1YWxzKGN1cnJlbnRDcmVhdG9yRnVsbE5hbWUpKSkgeworCQkJbG9nLndhcm4oIlJlc291cmNlIENyZWF0b3IgZnVsbG5hbWUgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlTdHJpbmcgY3VycmVudExhc3RVcGRhdGVyVXNlcklkID0gY3VycmVudFJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCk7CisJCVN0cmluZyB1cGRhdGVkTGFzdFVwZGF0ZXJVc2VySWQgPSB1cGRhdGVJbmZvUmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKTsKKworCQlpZiAoKHVwZGF0ZWRMYXN0VXBkYXRlclVzZXJJZCAhPSBudWxsKSAmJiAoIXVwZGF0ZWRMYXN0VXBkYXRlclVzZXJJZC5lcXVhbHMoY3VycmVudExhc3RVcGRhdGVyVXNlcklkKSkpIHsKKwkJCWxvZy53YXJuKCJSZXNvdXJjZSBMYXN0VXBkYXRlciB1c2VySWQgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlTdHJpbmcgY3VycmVudExhc3RVcGRhdGVyRnVsbE5hbWUgPSBjdXJyZW50UmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpOworCQlTdHJpbmcgdXBkYXRlZExhc3RVcGRhdGVyRnVsbE5hbWUgPSB1cGRhdGVJbmZvUmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpOworCisJCWlmICgodXBkYXRlZExhc3RVcGRhdGVyRnVsbE5hbWUgIT0gbnVsbCkgJiYgKCF1cGRhdGVkTGFzdFVwZGF0ZXJGdWxsTmFtZS5lcXVhbHMoY3VycmVudExhc3RVcGRhdGVyRnVsbE5hbWUpKSkgeworCQkJbG9nLndhcm4oIlJlc291cmNlIExhc3RVcGRhdGVyIGZ1bGxuYW1lIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGFuZCBjYW5ub3QgYmUgdXBkYXRlZCIpOworCQl9CisKKwkJTG9uZyBjdXJyZW50Q3JlYXRpb25EYXRlID0gY3VycmVudFJlc291cmNlLmdldENyZWF0aW9uRGF0ZSgpOworCQlMb25nIHVwZGF0ZWRDcmVhdGlvbkRhdGUgPSB1cGRhdGVJbmZvUmVzb3VyY2UuZ2V0Q3JlYXRpb25EYXRlKCk7CisKKwkJaWYgKCh1cGRhdGVkQ3JlYXRpb25EYXRlICE9IG51bGwpICYmICghdXBkYXRlZENyZWF0aW9uRGF0ZS5lcXVhbHMoY3VycmVudENyZWF0aW9uRGF0ZSkpKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgQ3JlYXRpb24gZGF0ZSBpcyBhdXRvbWF0aWNhbGx5IHNldCBhbmQgY2Fubm90IGJlIHVwZGF0ZWQiKTsKKwkJfQorCisJCUxvbmcgY3VycmVudExhc3RVcGRhdGVEYXRlID0gY3VycmVudFJlc291cmNlLmdldExhc3RVcGRhdGVEYXRlKCk7CisJCUxvbmcgdXBkYXRlZExhc3RVcGRhdGVEYXRlID0gdXBkYXRlSW5mb1Jlc291cmNlLmdldExhc3RVcGRhdGVEYXRlKCk7CisKKwkJaWYgKCh1cGRhdGVkTGFzdFVwZGF0ZURhdGUgIT0gbnVsbCkgJiYgKCF1cGRhdGVkTGFzdFVwZGF0ZURhdGUuZXF1YWxzKGN1cnJlbnRMYXN0VXBkYXRlRGF0ZSkpKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgbGFzdCB1cGRhdGUgZGF0ZSBpcyBhdXRvbWF0aWNhbGx5IHNldCBhbmQgY2Fubm90IGJlIHVwZGF0ZWQiKTsKKwkJfQorCisJCUxpZmVjeWNsZVN0YXRlRW51bSBjdXJyZW50TGlmZWN5Y2xlU3RhdGUgPSBjdXJyZW50UmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKTsKKwkJTGlmZWN5Y2xlU3RhdGVFbnVtIHVwZGF0ZWRMaWZlY3ljbGVTdGF0ZSA9IHVwZGF0ZUluZm9SZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpOworCisJCWlmICgodXBkYXRlZExpZmVjeWNsZVN0YXRlICE9IG51bGwpICYmICghdXBkYXRlZExpZmVjeWNsZVN0YXRlLmVxdWFscyhjdXJyZW50TGlmZWN5Y2xlU3RhdGUpKSkgeworCQkJbG9nLndhcm4oIlJlc291cmNlIGxpZmVjeWNsZSBzdGF0ZSBkYXRlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGFuZCBjYW5ub3QgYmUgdXBkYXRlZCIpOworCQl9CisKKwkJQm9vbGVhbiBjdXJyZW50QWJzdHJhY3QgPSBjdXJyZW50UmVzb3VyY2UuaXNBYnN0cmFjdCgpOworCQlCb29sZWFuIHVwZGF0ZWRBYnN0cmFjdCA9IHVwZGF0ZUluZm9SZXNvdXJjZS5pc0Fic3RyYWN0KCk7CisKKwkJaWYgKCh1cGRhdGVkQWJzdHJhY3QgIT0gbnVsbCkgJiYgKCF1cGRhdGVkQWJzdHJhY3QuZXF1YWxzKGN1cnJlbnRBYnN0cmFjdCkpKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgYWJzdHJhY3QgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlCb29sZWFuIGN1cnJlbnRIaWdoZXN0VmVyc2lvbiA9IGN1cnJlbnRSZXNvdXJjZS5pc0hpZ2hlc3RWZXJzaW9uKCk7CisJCUJvb2xlYW4gdXBkYXRlZEhpZ2hlc3RWZXJzaW9uID0gdXBkYXRlSW5mb1Jlc291cmNlLmlzSGlnaGVzdFZlcnNpb24oKTsKKworCQlpZiAoKHVwZGF0ZWRIaWdoZXN0VmVyc2lvbiAhPSBudWxsKSAmJiAoIXVwZGF0ZWRIaWdoZXN0VmVyc2lvbi5lcXVhbHMoY3VycmVudEhpZ2hlc3RWZXJzaW9uKSkpIHsKKwkJCWxvZy53YXJuKCJSZXNvdXJjZSBoaWdoZXN0IHZlcnNpb24gaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlTdHJpbmcgY3VycmVudFV1aWQgPSBjdXJyZW50UmVzb3VyY2UuZ2V0VVVJRCgpOworCQlTdHJpbmcgdXBkYXRlZFV1aWQgPSB1cGRhdGVJbmZvUmVzb3VyY2UuZ2V0VVVJRCgpOworCisJCWlmICgodXBkYXRlZFV1aWQgIT0gbnVsbCkgJiYgKCF1cGRhdGVkVXVpZC5lcXVhbHMoY3VycmVudFV1aWQpKSkgeworCQkJbG9nLndhcm4oIlJlc291cmNlIFVVSUQgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCX0KKworCQlSZXNvdXJjZVR5cGVFbnVtIGN1cnJlbnRSZXNvdXJjZVR5cGUgPSBjdXJyZW50UmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCk7CisJCVJlc291cmNlVHlwZUVudW0gdXBkYXRlZFJlc291cmNlVHlwZSA9IHVwZGF0ZUluZm9SZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKTsKKworCQlpZiAoKHVwZGF0ZWRSZXNvdXJjZVR5cGUgIT0gbnVsbCkgJiYgKCF1cGRhdGVkUmVzb3VyY2VUeXBlLmVxdWFscyhjdXJyZW50UmVzb3VyY2VUeXBlKSkpIHsKKwkJCWxvZy53YXJuKCJSZXNvdXJjZSBUeXBlICBjYW5ub3QgYmUgdXBkYXRlZCIpOworCisJCX0KKwkJdXBkYXRlSW5mb1Jlc291cmNlLnNldFJlc291cmNlVHlwZShjdXJyZW50UmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOworCisJCVN0cmluZyBjdXJyZW50SW52YXJpYW50VXVpZCA9IGN1cnJlbnRSZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJCVN0cmluZyB1cGRhdGVkSW52YXJpYW50VXVpZCA9IHVwZGF0ZUluZm9SZXNvdXJjZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisKKwkJaWYgKCh1cGRhdGVkSW52YXJpYW50VXVpZCAhPSBudWxsKSAmJiAoIXVwZGF0ZWRJbnZhcmlhbnRVdWlkLmVxdWFscyhjdXJyZW50SW52YXJpYW50VXVpZCkpKSB7CisJCQlsb2cud2FybigiUmVzb3VyY2UgaW52YXJpYW50IFVVSUQgaXMgYXV0b21hdGljYWxseSBzZXQgYW5kIGNhbm5vdCBiZSB1cGRhdGVkIik7CisJCQl1cGRhdGVJbmZvUmVzb3VyY2Uuc2V0SW52YXJpYW50VVVJRChjdXJyZW50SW52YXJpYW50VXVpZCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCS8qCisJICogcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VOYW1lKFVzZXIgdXNlciwgUmVzb3VyY2UgcmVzb3VyY2UsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7IGxvZy5kZWJ1ZygidmFsaWRhdGUgcmVzb3VyY2UgbmFtZSBpcyBub3QgZW1wdHkiKTsgU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlLmdldFJlc291cmNlTmFtZSgpOworCSAqIAorCSAqIGlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU3RyaW5nTm90RW1wdHkocmVzb3VyY2VOYW1lKSkgeyBsb2cuZGVidWcoIlJlc291cmNlIG5hbWUgaXMgZW1wdHkiKTsgUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ09NUE9ORU5UX05BTUUsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCSAqIGNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsgcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7IH0KKwkgKiAKKwkgKiBpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc291cmNlTmFtZUxlbmd0aChyZXNvdXJjZU5hbWUpKSB7IGxvZy5kZWJ1ZygiUmVzb3VyY2UgbmFtZSBpcyBleGNlZWRzIG1heCBsZW5ndGgge30gIiwgVmFsaWRhdGlvblV0aWxzLlJFU09VUkNFX05BTUVfTUFYX0xFTkdUSCk7IFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy4KKwkgKiBDT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlULCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpLCAiIiArIFZhbGlkYXRpb25VdGlscy5SRVNPVVJDRV9OQU1FX01BWF9MRU5HVEgpOyBjb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7IHJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCSAqIH0KKwkgKiAKKwkgKiBpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpKSB7IGxvZy5kZWJ1ZygiUmVzb3VyY2UgbmFtZSB7fSBoYXMgaW52YWxpZCBmb3JtYXQiLCByZXNvdXJjZU5hbWUpOyBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT01QT05FTlRfTkFNRSwKKwkgKiBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsgY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIGFjdGlvbkVudW0sIG51bGwpOyByZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsgfSByZXNvdXJjZS5zZXROb3JtYWxpemVkTmFtZShWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZSgKKwkgKiByZXNvdXJjZU5hbWUpKTsgcmVzb3VyY2Uuc2V0U3lzdGVtTmFtZShWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShyZXNvdXJjZU5hbWUpKSA7CisJICogCisJICogcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOyB9CisJICovCisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVSZXNvdXJjZU5hbWUoUmVzb3VyY2UgY3VycmVudFJlc291cmNlLCBSZXNvdXJjZSB1cGRhdGVJbmZvUmVzb3VyY2UsIGJvb2xlYW4gaGFzQmVlbkNlcnRpZmllZCkgeworCQlTdHJpbmcgcmVzb3VyY2VOYW1lVXBkYXRlZCA9IHVwZGF0ZUluZm9SZXNvdXJjZS5nZXROYW1lKCk7CisJCVN0cmluZyByZXNvdXJjZU5hbWVDdXJyZW50ID0gY3VycmVudFJlc291cmNlLmdldE5hbWUoKTsKKwkJaWYgKCFyZXNvdXJjZU5hbWVDdXJyZW50LmVxdWFscyhyZXNvdXJjZU5hbWVVcGRhdGVkKSkgeworCQkJaWYgKCFoYXNCZWVuQ2VydGlmaWVkKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlTmFtZVJlc3BvbnNlID0gdmFsaWRhdGVDb21wb25lbnROYW1lKG51bGwsIHVwZGF0ZUluZm9SZXNvdXJjZSwgbnVsbCk7CisJCQkJaWYgKHZhbGlkYXRlUmVzb3VyY2VOYW1lUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSB2YWxpZGF0ZVJlc291cmNlTmFtZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCQl9CisJCQkJdmFsaWRhdGVSZXNvdXJjZU5hbWVSZXNwb25zZSA9IHZhbGlkYXRlUmVzb3VyY2VOYW1lRXhpc3RzKG51bGwsIHVwZGF0ZUluZm9SZXNvdXJjZSwgbnVsbCk7CisJCQkJaWYgKHZhbGlkYXRlUmVzb3VyY2VOYW1lUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSB2YWxpZGF0ZVJlc291cmNlTmFtZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCQl9CisJCQkJY3VycmVudFJlc291cmNlLnNldE5hbWUocmVzb3VyY2VOYW1lVXBkYXRlZCk7CisJCQkJY3VycmVudFJlc291cmNlLnNldE5vcm1hbGl6ZWROYW1lKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKHJlc291cmNlTmFtZVVwZGF0ZWQpKTsKKwkJCQljdXJyZW50UmVzb3VyY2Uuc2V0U3lzdGVtTmFtZShWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShyZXNvdXJjZU5hbWVVcGRhdGVkKSk7CisKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmluZm8oIlJlc291cmNlIG5hbWUge30gY2Fubm90IGJlIHVwZGF0ZWQgb25jZSB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2VydGlmaWVkIG9uY2UuIiwgcmVzb3VyY2VOYW1lVXBkYXRlZCk7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlSWNvbihSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UsIFJlc291cmNlIHVwZGF0ZUluZm9SZXNvdXJjZSwgYm9vbGVhbiBoYXNCZWVuQ2VydGlmaWVkKSB7CisJCVN0cmluZyBpY29uVXBkYXRlZCA9IHVwZGF0ZUluZm9SZXNvdXJjZS5nZXRJY29uKCk7CisJCVN0cmluZyBpY29uQ3VycmVudCA9IGN1cnJlbnRSZXNvdXJjZS5nZXRJY29uKCk7CisJCWlmICghaWNvbkN1cnJlbnQuZXF1YWxzKGljb25VcGRhdGVkKSkgeworCQkJaWYgKCFoYXNCZWVuQ2VydGlmaWVkKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUljb24gPSB2YWxpZGF0ZUljb24obnVsbCwgdXBkYXRlSW5mb1Jlc291cmNlLCBudWxsKTsKKwkJCQlpZiAodmFsaWRhdGVJY29uLmlzUmlnaHQoKSkgeworCQkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gdmFsaWRhdGVJY29uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxvZy5pbmZvKCJJY29uIHt9IGNhbm5vdCBiZSB1cGRhdGVkIG9uY2UgdGhlIHJlc291cmNlIGhhcyBiZWVuIGNlcnRpZmllZCBvbmNlLiIsIGljb25VcGRhdGVkKTsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JQ09OX0NBTk5PVF9CRV9DSEFOR0VEKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVWZW5kb3JOYW1lKFJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSwgUmVzb3VyY2UgdXBkYXRlSW5mb1Jlc291cmNlLCBib29sZWFuIGhhc0JlZW5DZXJ0aWZpZWQpIHsKKwkJU3RyaW5nIHZlbmRvck5hbWVVcGRhdGVkID0gdXBkYXRlSW5mb1Jlc291cmNlLmdldFZlbmRvck5hbWUoKTsKKwkJU3RyaW5nIHZlbmRvck5hbWVDdXJyZW50ID0gY3VycmVudFJlc291cmNlLmdldFZlbmRvck5hbWUoKTsKKwkJaWYgKCF2ZW5kb3JOYW1lQ3VycmVudC5lcXVhbHModmVuZG9yTmFtZVVwZGF0ZWQpKSB7CisJCQlpZiAoIWhhc0JlZW5DZXJ0aWZpZWQpIHsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVmVuZG9yTmFtZSA9IHZhbGlkYXRlVmVuZG9yTmFtZShudWxsLCB1cGRhdGVJbmZvUmVzb3VyY2UsIG51bGwpOworCQkJCWlmICh2YWxpZGF0ZVZlbmRvck5hbWUuaXNSaWdodCgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSB2YWxpZGF0ZVZlbmRvck5hbWUucmlnaHQoKS52YWx1ZSgpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbG9nLmluZm8oIlZlbmRvciBuYW1lIHt9IGNhbm5vdCBiZSB1cGRhdGVkIG9uY2UgdGhlIHJlc291cmNlIGhhcyBiZWVuIGNlcnRpZmllZCBvbmNlLiIsIHZlbmRvck5hbWVVcGRhdGVkKTsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9WRU5ET1JfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2F0ZWdvcnkoUmVzb3VyY2UgY3VycmVudFJlc291cmNlLCBSZXNvdXJjZSB1cGRhdGVJbmZvUmVzb3VyY2UsIGJvb2xlYW4gaGFzQmVlbkNlcnRpZmllZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYXRlZ29yeU5hbWUgPSB2YWxpZGF0ZUNhdGVnb3J5KG51bGwsIHVwZGF0ZUluZm9SZXNvdXJjZSwgbnVsbCwgaW5UcmFuc2FjdGlvbik7CisJCWlmICh2YWxpZGF0ZUNhdGVnb3J5TmFtZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSB2YWxpZGF0ZUNhdGVnb3J5TmFtZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisJCWlmIChoYXNCZWVuQ2VydGlmaWVkKSB7CisJCQlDYXRlZ29yeURlZmluaXRpb24gY3VycmVudENhdGVnb3J5ID0gY3VycmVudFJlc291cmNlLmdldENhdGVnb3JpZXMoKS5nZXQoMCk7CisJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gY3VycmVudFN1YkNhdGVnb3J5ID0gY3VycmVudENhdGVnb3J5LmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCk7CisJCQlDYXRlZ29yeURlZmluaXRpb24gdXBkYXRlQ2F0ZWdvcnkgPSB1cGRhdGVJbmZvUmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKTsKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiB1cGR0YWVTdWJDYXRlZ29yeSA9IHVwZGF0ZUNhdGVnb3J5LmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCk7CisJCQlpZiAoIWN1cnJlbnRDYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKHVwZGF0ZUNhdGVnb3J5LmdldE5hbWUoKSkgfHwgIWN1cnJlbnRTdWJDYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKHVwZHRhZVN1YkNhdGVnb3J5LmdldE5hbWUoKSkpIHsKKwkJCQlsb2cuaW5mbygiQ2F0ZWdvcnkge30gY2Fubm90IGJlIHVwZGF0ZWQgb25jZSB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2VydGlmaWVkIG9uY2UuIiwgY3VycmVudFJlc291cmNlLmdldENhdGVnb3JpZXMoKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfQ0FURUdPUllfQ0FOTk9UX0JFX0NIQU5HRUQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZURlcml2ZWRGcm9tRHVyaW5nVXBkYXRlKFJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSwgUmVzb3VyY2UgdXBkYXRlSW5mb1Jlc291cmNlLCBib29sZWFuIGhhc0JlZW5DZXJ0aWZpZWQpIHsKKworCQlMaXN0PFN0cmluZz4gY3VycmVudERlcml2ZWRGcm9tID0gY3VycmVudFJlc291cmNlLmdldERlcml2ZWRGcm9tKCk7CisJCUxpc3Q8U3RyaW5nPiB1cGRhdGVkRGVyaXZlZEZyb20gPSB1cGRhdGVJbmZvUmVzb3VyY2UuZ2V0RGVyaXZlZEZyb20oKTsKKwkJaWYgKGN1cnJlbnREZXJpdmVkRnJvbSA9PSBudWxsIHx8IGN1cnJlbnREZXJpdmVkRnJvbS5pc0VtcHR5KCkgfHwgdXBkYXRlZERlcml2ZWRGcm9tID09IG51bGwgfHwgdXBkYXRlZERlcml2ZWRGcm9tLmlzRW1wdHkoKSkgeworCQkJbG9nLnRyYWNlKCJVcGRhdGUgbm9ybWF0aXZlIHR5cGVzIik7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKworCQlTdHJpbmcgZGVyaXZlZEZyb21DdXJyZW50ID0gY3VycmVudERlcml2ZWRGcm9tLmdldCgwKTsKKwkJU3RyaW5nIGRlcml2ZWRGcm9tVXBkYXRlZCA9IHVwZGF0ZWREZXJpdmVkRnJvbS5nZXQoMCk7CisKKwkJaWYgKCFkZXJpdmVkRnJvbUN1cnJlbnQuZXF1YWxzKGRlcml2ZWRGcm9tVXBkYXRlZCkpIHsKKwkJCWlmICghaGFzQmVlbkNlcnRpZmllZCkgeworCQkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXJpdmVkRnJvbUV4aXN0c0VpdGhlciA9IHZhbGlkYXRlRGVyaXZlZEZyb21FeGlzdChudWxsLCB1cGRhdGVJbmZvUmVzb3VyY2UsIG51bGwpOworCQkJCWlmICh2YWxpZGF0ZURlcml2ZWRGcm9tRXhpc3RzRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gdmFsaWRhdGVEZXJpdmVkRnJvbUV4aXN0c0VpdGhlcjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiRGVyaXZlZCBmcm9tIGNhbm5vdCBiZSB1cGRhdGVkIG9uY2UgdGhlIHJlc291cmNlIGhhcyBiZWVuIGNlcnRpZmllZCBvbmNlLiIpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0RFUklWRURfRlJPTV9DQU5OT1RfQkVfQ0hBTkdFRCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIEZvciBkZXJpdmVkIGZyb20sIHdlIG11c3Qga25vdyB3aGV0aGVyIGl0IHdhcyBhY3R1YWxseSBjaGFuZ2VkLAorCQkJLy8gb3RoZXJ3aXNlIHdlIG11c3QgZG8gbm8gYWN0aW9uLgorCQkJLy8gRHVlIHRvIGNoYW5nZXMgaXQgaW5mbGljdHMgb24gZGF0YSBtb2RlbCAocmVtb3ZlIGFydGlmYWN0cywKKwkJCS8vIHByb3BlcnRpZXMuLi4pLCBpdCdzIG5vdCBsaWtlIGEgZmxhdCBmaWVsZCB3aGljaCBjYW4gYmUKKwkJCS8vIG92ZXJ3cml0dGVuIGlmIG5vdCBjaGFuZ2VkLgorCQkJLy8gU28gd2UgbXVzdCBpbmRpY2F0ZSB0aGF0IGRlcml2ZWQgZnJvbSBpcyBub3QgY2hhbmdlZAorCQkJdXBkYXRlSW5mb1Jlc291cmNlLnNldERlcml2ZWRGcm9tKG51bGwpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXJpdmVkRnJvbUV4aXN0KFVzZXIgdXNlciwgUmVzb3VyY2UgcmVzb3VyY2UsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisKKwkJaWYgKHJlc291cmNlLmdldERlcml2ZWRGcm9tKCkgPT0gbnVsbCB8fCByZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisKKwkJSVJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uID0gZ2V0UmVzb3VyY2VPcGVyYXRpb24oKTsKKworCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gcmVzb3VyY2UuZ2V0RGVyaXZlZEZyb20oKS5nZXQoMCk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRhdGFNb2RlbFJlc3BvbnNlID0gcmVzb3VyY2VPcGVyYXRpb24udmFsaWRhdGVUb3NjYVJlc291cmNlTmFtZUV4aXN0cyh0ZW1wbGF0ZU5hbWUpOworCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwgIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlRGVyaXZlZEZyb21FeGlzdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkNyZWF0ZSBSZXNvdXJjZSAtIHZhbGlkYXRlRGVyaXZlZEZyb21FeGlzdCIpOworCQkJbG9nLmRlYnVnKCJyZXF1ZXN0IHRvIGRhdGEgbW9kZWwgZmFpbGVkIHdpdGggZXJyb3I6IHt9Iiwgc3RvcmFnZVN0YXR1cy5uYW1lKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdG9yYWdlU3RhdHVzKSwgcmVzb3VyY2UpOworCQkJbG9nLnRyYWNlKCJhdWRpdCBiZWZvcmUgc2VuZGluZyByZXNwb25zZSIpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIGFjdGlvbkVudW0sIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpIHsKKwkJCWxvZy5pbmZvKCJyZXNvdXJjZSB0ZW1wbGF0ZSB3aXRoIG5hbWUge30gZG9lcyBub3QgZXhpc3RzIiwgdGVtcGxhdGVOYW1lKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5QQVJFTlRfUkVTT1VSQ0VfTk9UX0ZPVU5EKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXJpdmVkRnJvbU5vdEVtcHR5KFVzZXIgdXNlciwgUmVzb3VyY2UgcmVzb3VyY2UsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgcmVzb3VyY2UgZGVyaXZlZEZyb20gZmllbGQiKTsKKwkJaWYgKChyZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpID09IG51bGwpIHx8IChyZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpLmlzRW1wdHkoKSkgfHwgKHJlc291cmNlLmdldERlcml2ZWRGcm9tKCkuZ2V0KDApKSA9PSBudWxsIHx8IChyZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpLmdldCgwKS50cmltKCkuaXNFbXB0eSgpKSkgeworCQkJbG9nLmluZm8oImRlcml2ZWQgZnJvbSAodGVtcGxhdGUpIGZpZWxkIGlzIG1pc3NpbmcgZm9yIHRoZSByZXNvdXJjZSIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfREVSSVZFRF9GUk9NX1RFTVBMQVRFKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlTmFtZUV4aXN0cyhVc2VyIHVzZXIsIFJlc291cmNlIHJlc291cmNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCisJCUlSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbiA9IGdldFJlc291cmNlT3BlcmF0aW9uKCk7CisJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZU9wZXJhdGlvblJlc3BvbnNlID0gcmVzb3VyY2VPcGVyYXRpb24udmFsaWRhdGVSZXNvdXJjZU5hbWVFeGlzdHMocmVzb3VyY2UuZ2V0TmFtZSgpLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7CisJCWlmIChyZXNvdXJjZU9wZXJhdGlvblJlc3BvbnNlLmlzTGVmdCgpKSB7CisJCQlpZiAocmVzb3VyY2VPcGVyYXRpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSkgeworCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJyZXNvdXJjZSB3aXRoIG5hbWUge30gYWxyZWFkeSBleGlzdHMiLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCksIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UoZXJyb3JSZXNwb25zZSwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJfQorCQlsb2cuZGVidWcoImVycm9yIHdoaWxlIHZhbGlkYXRlUmVzb3VyY2VOYW1lRXhpc3RzIGZvciByZXNvdXJjZToge30iLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShyZXNvdXJjZU9wZXJhdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSkpOworCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwl9CisKKwkvKgorCSAqIHByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVRhZ3NMaXN0QW5kUmVtb3ZlRHVwbGljYXRlcyhVc2VyIHVzZXIsIFJlc291cmNlIHJlc291cmNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeyBMaXN0PFN0cmluZz4gdGFnc0xpc3QgPSByZXNvdXJjZS5nZXRUYWdzKCk7CisJICogCisJICogRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVRhZ3MgPSB2YWxpZGF0ZVJlc291cmNlVGFncyh0YWdzTGlzdCwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VOYW1lKCkpOyBpZiAodmFsaWRhdGVUYWdzLmlzUmlnaHQoKSkgeyBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlVGFncy5yaWdodCgpLnZhbHVlKCk7CisJICogY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIGFjdGlvbkVudW0sIG51bGwpOyByZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsgfSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlRHVwbGljYXRlRnJvbUxpc3QodGFnc0xpc3QpOyByZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJICogCisJICogfQorCSAqIAorCSAqIHByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc291cmNlVGFncyhMaXN0PFN0cmluZz4gdGFncywgU3RyaW5nIHJlc291cmNlTmFtZSkgeyBsb2cuZGVidWcoInZhbGlkYXRlIHJlc291cmNlIHRhZ3MiKTsgYm9vbGVhbiBpbmNsdWRlc1Jlc291cmNlTmFtZSA9IGZhbHNlOyBpbnQgdGFnTGlzdFNpemUgPSAwOyBpZiAodGFncyAhPSBudWxsICYmICF0YWdzLmlzRW1wdHkoKSkgeyBmb3IKKwkgKiAoU3RyaW5nIHRhZyA6IHRhZ3MpIHsgaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVUYWdMZW5ndGgodGFnKSkgeyBsb2cuZGVidWcoInRhZyBsZW5ndGggZXhjZWVkcyBsaW1pdCB7fSIsIFZhbGlkYXRpb25VdGlscy5UQUdfTUFYX0xFTkdUSCk7IHJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy4KKwkgKiBDT01QT05FTlRfU0lOR0xFX1RBR19FWENFRURfTElNSVQsICIiICsgVmFsaWRhdGlvblV0aWxzLlRBR19NQVhfTEVOR1RIKSk7IH0gaWYgKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbXBvbmVudE5hbWVQYXR0ZXJuKHRhZykpIHsgaWYgKCFpbmNsdWRlc1Jlc291cmNlTmFtZSkgeyBpbmNsdWRlc1Jlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZS5lcXVhbHModGFnKTsgfSB9IGVsc2UgeworCSAqIGxvZy5kZWJ1ZygiaW52YWxpZCB0YWcge30iLCB0YWcpOyByZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuIENPTVBPTkVOVF9JTlZBTElEX1RBRykpOyB9IHRhZ0xpc3RTaXplICs9IHRhZy5sZW5ndGgoKSArIDE7IH0gaWYgKCFpbmNsdWRlc1Jlc291cmNlTmFtZSkgeyBsb2cuZGVidWcoICJ0YWdzIG11c3QgaW5jbHVkZSByZXNvdXJjZSBuYW1lIik7CisJICogcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLiBDT01QT05FTlRfSU5WQUxJRF9UQUdTX05PX0NPTVBfTkFNRSkpOyB9IGlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVGFnTGlzdExlbmd0aCh0YWdMaXN0U2l6ZSkpIHsgbG9nLmRlYnVnKCAib3ZlcmFsbCB0YWdzIGxlbmd0aCB7fSwgZXhjZWVkcyBsaW1pdCB7fSIsIHRhZ0xpc3RTaXplLAorCSAqIFZhbGlkYXRpb25VdGlscy5UQUdfTElTVF9NQVhfTEVOR1RIKTsgcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLiBDT01QT05FTlRfVEFHU19FWENFRURfTElNSVQsICIiICsgVmFsaWRhdGlvblV0aWxzLlRBR19MSVNUX01BWF9MRU5HVEgpKTsgfSByZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7IH0KKwkgKiAKKwkgKiByZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuIENPTVBPTkVOVF9NSVNTSU5HX1RBR1MpKTsgfQorCSAqLworCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2F0ZWdvcnkoVXNlciB1c2VyLCBSZXNvdXJjZSByZXNvdXJjZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gcmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpOworCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsIHx8IGNhdGVnb3JpZXMuc2l6ZSgpID09IDApIHsKKwkJCWxvZy5kZWJ1ZygiUmVzb3VyY2UgY2F0ZWdvcnkgaXMgZW1wdHkiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlpZiAoY2F0ZWdvcmllcy5zaXplKCkgPiAxKSB7CisJCQlsb2cuZGVidWcoIk11c3QgYmUgb25seSBvbmUgY2F0ZWdvcnkgZm9yIHJlc291cmNlIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1RPT19NVUNIX0NBVEVHT1JJRVMsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5ID0gY2F0ZWdvcmllcy5nZXQoMCk7CisJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJjYXRlZ29yaWVzID0gY2F0ZWdvcnkuZ2V0U3ViY2F0ZWdvcmllcygpOworCQlpZiAoc3ViY2F0ZWdvcmllcyA9PSBudWxsIHx8IHN1YmNhdGVnb3JpZXMuc2l6ZSgpID09IDApIHsKKwkJCWxvZy5kZWJ1ZygiTWlzc2luaWcgc3ViY2F0ZWdvcnkgZm9yIHJlc291cmNlIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfU1VCQ0FURUdPUlkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJaWYgKHN1YmNhdGVnb3JpZXMuc2l6ZSgpID4gMSkgeworCQkJbG9nLmRlYnVnKCJNdXN0IGJlIG9ubHkgb25lIHN1YiBhdGVnb3J5IGZvciByZXNvdXJjZSIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX1RPT19NVUNIX1NVQkNBVEVHT1JJRVMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0ZWdvcnkgPSBzdWJjYXRlZ29yaWVzLmdldCgwKTsKKworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGNhdGVnb3J5LmdldE5hbWUoKSkpIHsKKwkJCWxvZy5kZWJ1ZygiUmVzb3VyY2UgY2F0ZWdvcnkgaXMgZW1wdHkiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KHN1YmNhdGVnb3J5LmdldE5hbWUoKSkpIHsKKwkJCWxvZy5kZWJ1ZygiUmVzb3VyY2UgY2F0ZWdvcnkgaXMgZW1wdHkiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19TVUJDQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDYXRlZ29yeSA9IHZhbGlkYXRlQ2F0ZWdvcnlMaXN0ZWQoY2F0ZWdvcnksIHN1YmNhdGVnb3J5LCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHZhbGlkYXRlQ2F0ZWdvcnkuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlQ2F0ZWdvcnkucmlnaHQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIGFjdGlvbkVudW0sIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2F0ZWdvcnlMaXN0ZWQoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5LCBTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0ZWdvcnksIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCAmJiBzdWJjYXRlZ29yeSAhPSBudWxsKSB7CisJCQlsb2cuZGVidWcoInZhbGlkYXRpbmcgcmVzb3VyY2UgY2F0ZWdvcnkge30gYWdhaW5zdCB2YWxpZCBjYXRlZ29yaWVzIGxpc3QiLCBjYXRlZ29yeSk7CisJCQlFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGNhdGVnb3JpZXMgPSBlbGVtZW50RGFvLmdldEFsbENhdGVnb3JpZXMoTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGNhdGVnb3JpZXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gcmV0cml2ZSByZXNvdXJjZSBjYXRlZ29yaWVzIGZyb20gVGl0YW4iKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjYXRlZ29yaWVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnlMaXN0ID0gY2F0ZWdvcmllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdCA6IGNhdGVnb3J5TGlzdCkgeworCQkJCWlmIChjYXQuZ2V0TmFtZSgpLmVxdWFscyhjYXRlZ29yeS5nZXROYW1lKCkpKSB7CisJCQkJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YmNhdCA6IGNhdC5nZXRTdWJjYXRlZ29yaWVzKCkpIHsKKwkJCQkJCWlmIChzdWJjYXQuZ2V0TmFtZSgpLmVxdWFscyhzdWJjYXRlZ29yeS5nZXROYW1lKCkpKSB7CisJCQkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWxvZy5kZWJ1ZygiU3ViQ2F0ZWdvcnkge30gaXMgbm90IHBhcnQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZ3JvdXAuIFJlc291cmNlIHN1YmNhdGVnb3J5IHZhbGlkIHZhbHVlcyBhcmUge30iLCBzdWJjYXRlZ29yeSwgY2F0LmdldFN1YmNhdGVnb3JpZXMoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSkpOworCQkJCX0KKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQ2F0ZWdvcnkge30gaXMgbm90IHBhcnQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZ3JvdXAuIFJlc291cmNlIGNhdGVnb3J5IHZhbGlkIHZhbHVlcyBhcmUge30iLCBjYXRlZ29yeSwgY2F0ZWdvcnlMaXN0KTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChmYWxzZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVWZW5kb3JSZWxlYXNlTmFtZShVc2VyIHVzZXIsIFJlc291cmNlIHJlc291cmNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9IHJlc291cmNlLmdldFZlbmRvclJlbGVhc2UoKTsKKworCQlsb2cuZGVidWcoInZhbGlkYXRlIHZlbmRvciByZWxlc2UgbmFtZSIpOworCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KHZlbmRvclJlbGVhc2UpKSB7CisJCQlsb2cuaW5mbygidmVuZG9yIHJlbGVzZSBuYW1lIGlzIG1pc3NpbmcuIik7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX1ZFTkRPUl9SRUxFQVNFKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKGVycm9yUmVzcG9uc2UsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIGFjdGlvbkVudW0sIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVWZW5kb3JSZWxlYXNlUmVzcG9uc2UgPSB2YWxpZGF0ZVZlbmRvclJlbGVhc2VOYW1lKHZlbmRvclJlbGVhc2UpOworCQlpZiAodmFsaWRhdGVWZW5kb3JSZWxlYXNlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlVmVuZG9yUmVsZWFzZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJfQorCQlyZXR1cm4gdmFsaWRhdGVWZW5kb3JSZWxlYXNlUmVzcG9uc2U7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVWZW5kb3JSZWxlYXNlTmFtZShTdHJpbmcgdmVuZG9yUmVsZWFzZSkgeworCQlpZiAodmVuZG9yUmVsZWFzZSAhPSBudWxsKSB7CisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVZlbmRvclJlbGVhc2VMZW5ndGgodmVuZG9yUmVsZWFzZSkpIHsKKwkJCQlsb2cuaW5mbygidmVuZG9yIHJlbGVhc2UgZXhjZWRzIGxpbWl0LiIpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlZFTkRPUl9SRUxFQVNFX0VYQ0VFRFNfTElNSVQsICIiICsgVmFsaWRhdGlvblV0aWxzLlZFTkRPUl9SRUxFQVNFX01BWF9MRU5HVEgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisKKwkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVmVuZG9yUmVsZWFzZSh2ZW5kb3JSZWxlYXNlKSkgeworCQkJCWxvZy5pbmZvKCJ2ZW5kb3IgcmVsZWFzZSAgaXMgbm90IHZhbGlkLiIpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX1JFTEVBU0UpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVZlbmRvck5hbWUoVXNlciB1c2VyLCBSZXNvdXJjZSByZXNvdXJjZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSByZXNvdXJjZS5nZXRWZW5kb3JOYW1lKCk7CisJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlU3RyaW5nTm90RW1wdHkodmVuZG9yTmFtZSkpIHsKKwkJCWxvZy5pbmZvKCJ2ZW5kb3IgbmFtZSBpcyBtaXNzaW5nLiIpOworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19WRU5ET1JfTkFNRSk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVmVuZG9yTmFtZVJlc3BvbnNlID0gdmFsaWRhdGVWZW5kb3JOYW1lKHZlbmRvck5hbWUpOworCQlpZiAodmFsaWRhdGVWZW5kb3JOYW1lUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRlVmVuZG9yTmFtZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCByZXNvdXJjZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJfQorCQlyZXR1cm4gdmFsaWRhdGVWZW5kb3JOYW1lUmVzcG9uc2U7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVWZW5kb3JOYW1lKFN0cmluZyB2ZW5kb3JOYW1lKSB7CisJCWlmICh2ZW5kb3JOYW1lICE9IG51bGwpIHsKKwkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVmVuZG9yTmFtZUxlbmd0aCh2ZW5kb3JOYW1lKSkgeworCQkJCWxvZy5pbmZvKCJ2ZW5kb3IgbmFtZSBleGNlZHMgbGltaXQuIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVkVORE9SX05BTUVfRVhDRUVEU19MSU1JVCwgIiIgKyBWYWxpZGF0aW9uVXRpbHMuVkVORE9SX05BTUVfTUFYX0xFTkdUSCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKworCQkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVWZW5kb3JOYW1lKHZlbmRvck5hbWUpKSB7CisJCQkJbG9nLmluZm8oInZlbmRvciBuYW1lICBpcyBub3QgdmFsaWQuIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9WRU5ET1JfTkFNRSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChmYWxzZSk7CisKKwl9CisJCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ29zdChVc2VyIHVzZXIsIFJlc291cmNlIHJlc291cmNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCQlTdHJpbmcgY29zdCA9IHJlc291cmNlLmdldENvc3QoKTsKKwkJaWYgKGNvc3QgIT0gbnVsbCkgeworCisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvc3QoY29zdCkpIHsKKwkJCQlsb2cuZGVidWcoInJlc291cmNlIGNvc3QgaXMgaW52YWxpZC4iKTsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUxpY2Vuc2VUeXBlKFVzZXIgdXNlciwgUmVzb3VyY2UgcmVzb3VyY2UsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgbGljZW5zZVR5cGUiKTsKKwkJU3RyaW5nIGxpY2Vuc2VUeXBlID0gcmVzb3VyY2UuZ2V0TGljZW5zZVR5cGUoKTsKKwkJaWYgKGxpY2Vuc2VUeXBlICE9IG51bGwpIHsKKwkJCUxpc3Q8U3RyaW5nPiBsaWNlbnNlVHlwZXMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRMaWNlbnNlVHlwZXMoKTsKKwkJCWlmICghbGljZW5zZVR5cGVzLmNvbnRhaW5zKGxpY2Vuc2VUeXBlKSkgeworCQkJCWxvZy5kZWJ1ZygiTGljZW5zZSB0eXBlIHt9IGlzbid0IGNvbmZpZ3VyZWQiKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCQlpZiAoYWN0aW9uRW51bSAhPSBudWxsKSB7CisJCQkJCS8vIEluIHVwZGF0ZSBjYXNlLCBubyBhdWRpdCBpcyByZXF1aXJlZAorCQkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgcmVzb3VyY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgbnVsbCk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcHJvY2Vzc1VwZGF0ZU9mRGVyaXZlZEZyb20oUmVzb3VyY2UgY3VycmVudFJlc291cmNlLCBSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UsIFN0cmluZyB1c2VySWQsIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxPcGVyYXRpb24sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVBcnRpZmFjdEJ5SW50ZXJmYWNlID0gbnVsbDsKKwkJaWYgKHVwZGF0ZWRSZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpICE9IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiU3RhcnRpbmcgZGVyaXZlZCBmcm9tIHVwZGF0ZSBmb3IgcmVzb3VyY2Uge30iLCB1cGRhdGVkUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQlsb2cuZGVidWcoIjEuIFJlbW92aW5nIGludGVyZmFjZSBhcnRpZmFjdHMgZnJvbSBncmFwaCIpOworCQkJLy8gUmVtb3ZlIGFsbCBpbnRlcmZhY2UgYXJ0aWZhY3RzIG9mIHJlc291cmNlCisJCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHVwZGF0ZWRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50ZXJmYWNlcyA9IGN1cnJlbnRSZXNvdXJjZS5nZXRJbnRlcmZhY2VzKCk7CisKKwkJCWlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCQlDb2xsZWN0aW9uPEludGVyZmFjZURlZmluaXRpb24+IHZhbHVlcyA9IGludGVyZmFjZXMudmFsdWVzKCk7CisJCQkJZm9yIChJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24gOiB2YWx1ZXMpIHsKKwkJCQkJU3RyaW5nIGludGVyZmFjZVR5cGUgPSBpbnRlcmZhY2VUeXBlT3BlcmF0aW9uLmdldFNob3J0SW50ZXJmYWNlTmFtZShpbnRlcmZhY2VEZWZpbml0aW9uKTsKKworCQkJCQlsb2cudHJhY2UoIlN0YXJ0aW5nIGludGVyZmFjZSBhcnRpZmFjdHMgcmVtb3ZhbCBmb3IgaW50ZXJmYWNlIHR5cGUge30iLCBpbnRlcmZhY2VUeXBlKTsKKwkJCQkJTWFwPFN0cmluZywgT3BlcmF0aW9uPiBvcGVyYXRpb25zID0gaW50ZXJmYWNlRGVmaW5pdGlvbi5nZXRPcGVyYXRpb25zKCk7CisJCQkJCWlmIChvcGVyYXRpb25zICE9IG51bGwpIHsKKwkJCQkJCWZvciAoRW50cnk8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbkVudHJ5IDogb3BlcmF0aW9ucy5lbnRyeVNldCgpKSB7CisJCQkJCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbkVudHJ5LmdldFZhbHVlKCk7CisJCQkJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGltcGxlbWVudGF0aW9uID0gb3BlcmF0aW9uLmdldEltcGxlbWVudGF0aW9uKCk7CisJCQkJCQkJaWYgKGltcGxlbWVudGF0aW9uICE9IG51bGwpIHsKKwkJCQkJCQkJU3RyaW5nIHVuaXF1ZUlkID0gaW1wbGVtZW50YXRpb24uZ2V0VW5pcXVlSWQoKTsKKwkJCQkJCQkJbG9nLmRlYnVnKCJSZW1vdmluZyBpbnRlcmZhY2UgYXJ0aWZhY3QgZGVmaW5pdGlvbiB7fSwgb3BlcmF0aW9uIHt9LCBpbnRlcmZhY2VUeXBlIHt9IiwgdW5pcXVlSWQsIG9wZXJhdGlvbkVudHJ5LmdldEtleSgpLCBpbnRlcmZhY2VUeXBlKTsKKwkJCQkJCQkJLy8gb25seSB0aGluZyB0aGF0IHRyYW5zYWN0cyBhbmQgbG9ja3MgaGVyZQorCQkJCQkJCQlkZWxldGVBcnRpZmFjdEJ5SW50ZXJmYWNlID0gYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5kZWxldGVBcnRpZmFjdEJ5SW50ZXJmYWNlKHJlc291cmNlSWQsIGludGVyZmFjZVR5cGUsIG9wZXJhdGlvbkVudHJ5LmdldEtleSgpLCB1c2VySWQsIHVuaXF1ZUlkLCBudWxsLCBzaG91bGRMb2NrLCB0cnVlKTsKKwkJCQkJCQkJaWYgKGRlbGV0ZUFydGlmYWN0QnlJbnRlcmZhY2UuaXNSaWdodCgpKSB7CisJCQkJCQkJCQlsb2cuZGVidWcoIkNvdWxkbid0IHJlbW92ZSBhcnRpZmFjdCBkZWZpbml0aW9uIHdpdGggaWQge30iLCB1bmlxdWVJZCk7CisJCQkJCQkJCQlpZiAoIWluVHJhbnNhY3Rpb24pIHsKKwkJCQkJCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZGVsZXRlQXJ0aWZhY3RCeUludGVyZmFjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJbG9nLnRyYWNlKCJObyBpbXBsZW1lbnRhdGlvbiBmb3VuZCBmb3Igb3BlcmF0aW9uIHt9IC0gbm90aGluZyB0byBkZWxldGUiLCBvcGVyYXRpb25FbnRyeS5nZXRLZXkoKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJbG9nLnRyYWNlKCJObyBvcGVyYXRpb25zIGZvdW5kIGZvciBpbnRlcmZhY2UgdHlwZSB7fSIsIGludGVyZmFjZVR5cGUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJbG9nLmRlYnVnKCIyLiBSZW1vdmluZyBwcm9wZXJ0aWVzIik7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmluZFByb3BlcnRpZXNPZk5vZGUgPSBwcm9wZXJ0eU9wZXJhdGlvbi5kZWxldGVBbGxQcm9wZXJ0aWVzQXNzb2NpYXRlZFRvTm9kZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlSWQpOworCisJCQlpZiAoZmluZFByb3BlcnRpZXNPZk5vZGUuaXNSaWdodCgpICYmICFmaW5kUHJvcGVydGllc09mTm9kZS5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIG9mIHJlc291cmNlIik7CisJCQkJaWYgKCFpblRyYW5zYWN0aW9uKQorCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZmluZFByb3BlcnRpZXNPZk5vZGUucmlnaHQoKS52YWx1ZSgpKSkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIkRlcml2ZWQgZnJvbSB3YXNuJ3QgY2hhbmdlZCBkdXJpbmcgdXBkYXRlIik7CisJCX0KKworCQlpZiAoIWluVHJhbnNhY3Rpb24pCisJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKworCX0KKworCS8qKioqIEF1ZGl0aW5nICoqKioqKioqKioqKioqKioqKiovCisKKwlwcm90ZWN0ZWQgc3RhdGljIElFbGVtZW50T3BlcmF0aW9uIGdldEVsZW1lbnREYW8oQ2xhc3M8SUVsZW1lbnRPcGVyYXRpb24+IGNsYXNzMSwgU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID0gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCisJCXJldHVybiB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihjbGFzczEpOworCX0KKworCXB1YmxpYyBJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gZ2V0Q2FwYWJpbGl0eVR5cGVPcGVyYXRpb24oKSB7CisJCXJldHVybiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbihJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24pIHsKKwkJdGhpcy5jYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUHJvcGVydGllc0RlZmF1bHRWYWx1ZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSByZXNvdXJjZSBwcm9wZXJ0aWVzIGRlZmF1bHQgdmFsdWVzIik7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpOworCQlTdHJpbmcgdHlwZSA9IG51bGw7CisJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQlmb3IgKFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKwkJCQlpZiAoIXByb3BlcnR5T3BlcmF0aW9uLmlzUHJvcGVydHlUeXBlVmFsaWQocHJvcGVydHkpKSB7CisJCQkJCWxvZy5pbmZvKCJJbnZhbGlkIHR5cGUgZm9yIHByb3BlcnR5Iik7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1BST1BFUlRZX1RZUEUsIHByb3BlcnR5LmdldFR5cGUoKSwgcHJvcGVydHkuZ2V0TmFtZSgpKTsKKwkJCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhbGxEYXRhVHlwZXMgPSBnZXRBbGxEYXRhVHlwZXMoYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlKTsKKwkJCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFsbERhdGFUeXBlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKworCQkJCXR5cGUgPSBwcm9wZXJ0eS5nZXRUeXBlKCk7CisJCQkJaWYgKHR5cGUuZXF1YWxzKFRvc2NhUHJvcGVydHlUeXBlLkxJU1QuZ2V0VHlwZSgpKSB8fCB0eXBlLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5NQVAuZ2V0VHlwZSgpKSkgeworCQkJCQlJbW11dGFibGVQYWlyPFN0cmluZywgQm9vbGVhbj4gcHJvcGVydHlJbm5lclR5cGVWYWxpZCA9IHByb3BlcnR5T3BlcmF0aW9uLmlzUHJvcGVydHlJbm5lclR5cGVWYWxpZChwcm9wZXJ0eSwgYWxsRGF0YVR5cGVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJaW5uZXJUeXBlID0gcHJvcGVydHlJbm5lclR5cGVWYWxpZC5nZXRMZWZ0KCk7CisJCQkJCWlmICghcHJvcGVydHlJbm5lclR5cGVWYWxpZC5nZXRSaWdodCgpLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJCQlsb2cuaW5mbygiSW52YWxpZCBpbm5lciB0eXBlIGZvciBwcm9wZXJ0eSIpOworCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFlfSU5ORVJfVFlQRSwgaW5uZXJUeXBlLCBwcm9wZXJ0eS5nZXROYW1lKCkpOworCQkJCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCFwcm9wZXJ0eU9wZXJhdGlvbi5pc1Byb3BlcnR5RGVmYXVsdFZhbHVlVmFsaWQocHJvcGVydHksIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSkpIHsKKwkJCQkJbG9nLmluZm8oIkludmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkiKTsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCQkJCWlmICh0eXBlLmVxdWFscyhUb3NjYVByb3BlcnR5VHlwZS5MSVNULmdldFR5cGUoKSkgfHwgdHlwZS5lcXVhbHMoVG9zY2FQcm9wZXJ0eVR5cGUuTUFQLmdldFR5cGUoKSkpIHsKKwkJCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBMRVhfREVGQVVMVF9WQUxVRSwgcHJvcGVydHkuZ2V0TmFtZSgpLCB0eXBlLCBpbm5lclR5cGUsIHByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0RFRkFVTFRfVkFMVUUsIHByb3BlcnR5LmdldE5hbWUoKSwgdHlwZSwgcHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJCQl9CisJCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCWJyZWFrOworCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVNYXJrZWRDb21wb25lbnRzKCkgeworCQlyZXR1cm4gZGVsZXRlTWFya2VkQ29tcG9uZW50cyhDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBnZXRDb21wb25lbnRJbnN0YW5jZUJMKCkgeworCQlyZXR1cm4gdmZDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWM7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZUZvclJlc3BvbnNlKENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJU3RyaW5nIGNvbXBvbmVudFR5cGVGb3JSZXNwb25zZSA9ICJTRVJWSUNFIjsKKwkJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQljb21wb25lbnRUeXBlRm9yUmVzcG9uc2UgPSAoKFJlc291cmNlKSBjb21wb25lbnQpLmdldFJlc291cmNlVHlwZSgpLm5hbWUoKTsKKwkJfQorCQlyZXR1cm4gY29tcG9uZW50VHlwZUZvclJlc3BvbnNlOworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVHcm91cHNGcm9tWWFtbChTdHJpbmcgeWFtbEZpbGVOYW1lLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworCQlNYXA8U3RyaW5nLCBHcm91cERlZmluaXRpb24+IGdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KGdyb3Vwcyk7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlck5vZGVzVGVtbGF0ZXMgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYU1hcEVsZW1lbnQodG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bS5HUk9VUFMpOworCQlpZiAoZWl0aGVyTm9kZXNUZW1sYXRlcy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uTm9kZVRlbXBsYXRlcyA9IGVpdGhlck5vZGVzVGVtbGF0ZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCWlmIChqc29uTm9kZVRlbXBsYXRlcyAhPSBudWxsICYmIGZhbHNlID09IGpzb25Ob2RlVGVtcGxhdGVzLmlzRW1wdHkoKSkgeworCQkJCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgT2JqZWN0Pj4gbm9kZXNOYW1lVmFsdWUgPSBqc29uTm9kZVRlbXBsYXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKG5vZGVzTmFtZVZhbHVlLmhhc05leHQoKSkgeworCQkJCQlFbnRyeTxTdHJpbmcsIE9iamVjdD4gZ3JvdXBOYW1lVmFsdWUgPSBub2Rlc05hbWVWYWx1ZS5uZXh0KCk7CisKKwkJCQkJU3RyaW5nIGdyb3VwTmFtZSA9IGdyb3VwTmFtZVZhbHVlLmdldEtleSgpOworCQkJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyTm9kZSA9IGNyZWF0ZUdyb3VwSW5mbyhncm91cE5hbWUsIGdyb3VwTmFtZVZhbHVlLmdldFZhbHVlKCkpOworCQkJCQlpZiAoZWl0aGVyTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQkJCVN0cmluZyBtZXNzYWdlID0gIkZhaWxlZCB3aGVuIGNyZWF0aW5nIGdyb3VwOiAiICsgZ3JvdXBOYW1lVmFsdWUuZ2V0S2V5KCkgKyAiIGZvciByZXNvdXJjZToiICsgcmVzb3VyY2UuZ2V0TmFtZSgpOworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJJbXBvcnRSZXNvdXJjZSIsIG1lc3NhZ2UsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlck5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24gPSBlaXRoZXJOb2RlLmxlZnQoKS52YWx1ZSgpOworCQkJCQkJZ3JvdXBzLnB1dChncm91cE5hbWUsIGdyb3VwRGVmaW5pdGlvbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIElucHV0RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVJbnB1dHNGcm9tWWFtbChTdHJpbmcgeWFtbEZpbGVOYW1lLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gaW5wdXRzID0gSW1wb3J0VXRpbHMuZ2V0SW5wdXRzKHRvc2NhSnNvbik7CisJCWlmIChpbnB1dHMuaXNSaWdodCgpKSB7CisJCQlTdHJpbmcgbWVzc2FnZSA9ICJGYWlsZWQgd2hlbiBjcmVhdGluZyBpbnB1dHM6ICBmb3IgcmVzb3VyY2U6IiArIHJlc291cmNlLmdldE5hbWUoKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiSW1wb3J0UmVzb3VyY2UiLCBtZXNzYWdlLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiByZXN1bHRNYXAgPSBuZXcgSGFzaE1hcCgpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdE1hcCk7CisKKwkJfQorCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoaW5wdXRzLmxlZnQoKS52YWx1ZSgpKTsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwSW5mbyhTdHJpbmcgZ3JvdXBOYW1lLCBPYmplY3QgZ3JvdXBUZW1wbGF0ZUpzb24pIHsKKworCQlHcm91cERlZmluaXRpb24gZ3JvdXBJbmZvID0gbmV3IEdyb3VwRGVmaW5pdGlvbigpOworCQlncm91cEluZm8uc2V0TmFtZShncm91cE5hbWUpOworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JvdXBJbmZvKTsKKworCQl0cnkgeworCQkJaWYgKGdyb3VwVGVtcGxhdGVKc29uICE9IG51bGwgJiYgZ3JvdXBUZW1wbGF0ZUpzb24gaW5zdGFuY2VvZiBNYXApIHsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGdyb3VwVGVtcGxhdGVKc29uTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGdyb3VwVGVtcGxhdGVKc29uOworCQkJCS8vIFR5cGUKKwkJCQlTdHJpbmcgZ3JvdXBUeXBlID0gbnVsbDsKKwkJCQlpZiAoZ3JvdXBUZW1wbGF0ZUpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uVFlQRS5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQlncm91cFR5cGUgPSAoU3RyaW5nKSBncm91cFRlbXBsYXRlSnNvbk1hcC5nZXQoVG9zY2FUYWdOYW1lc0VudW0uVFlQRS5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJZ3JvdXBJbmZvLnNldFR5cGUoZ3JvdXBUeXBlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIlRoZSAndHlwZScgbWVtYmVyIGlzIG5vdCBmb3VuZCB1bmRlciBncm91cCB7fSIsIGdyb3VwTmFtZSk7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSkpOworCQkJCX0KKworCQkJCWlmIChncm91cFRlbXBsYXRlSnNvbk1hcC5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5ERVNDUklQVElPTi5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQlncm91cEluZm8uc2V0RGVzY3JpcHRpb24oKFN0cmluZykgZ3JvdXBUZW1wbGF0ZUpzb25NYXAuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLkRFU0NSSVBUSU9OLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCQl9CisKKwkJCQlpZiAoZ3JvdXBUZW1wbGF0ZUpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uTUVNQkVSUy5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQlPYmplY3QgbWVtYmVycyA9IGdyb3VwVGVtcGxhdGVKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5NRU1CRVJTLmdldEVsZW1lbnROYW1lKCkpOworCQkJCQlpZiAobWVtYmVycyAhPSBudWxsKSB7CisJCQkJCQlpZiAobWVtYmVycyBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnNMb2FkZWQgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJCQkJTGlzdDw/PiBtZW1iZXJzQXNMaXN0ID0gKExpc3Q8Pz4pIG1lbWJlcnM7CisJCQkJCQkJZm9yIChPYmplY3QgbWVtYmVyIDogbWVtYmVyc0FzTGlzdCkgeworCQkJCQkJCQltZW1iZXJzTG9hZGVkLnB1dChtZW1iZXIudG9TdHJpbmcoKSwgIiIpOworCQkJCQkJCX0KKwkJCQkJCQlncm91cEluZm8uc2V0TWVtYmVycyhtZW1iZXJzTG9hZGVkKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbG9nLmRlYnVnKCJUaGUgJ3R5cGUnIG1lbWJlciBpcyBub3QgZm91bmQgdW5kZXIgZ3JvdXAge30iLCBncm91cE5hbWUpOworCQkJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKGdyb3VwVGVtcGxhdGVKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLlBST1BFUlRJRVMuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJT2JqZWN0IHByb3BlcnRpZXMgPSBncm91cFRlbXBsYXRlSnNvbk1hcC5nZXQoVG9zY2FUYWdOYW1lc0VudW0uUFJPUEVSVElFUy5nZXRFbGVtZW50TmFtZSgpKTsKKworCQkJCQlFaXRoZXI8TGlzdDxHcm91cFByb3BlcnR5PiwgUmVzcG9uc2VGb3JtYXQ+IHJlZ1Jlc3BvbnNlID0gY3JlYXRlUHJvcGVydGllc1ZhbHVlTW9kdWxlRnJvbVlhbWwocHJvcGVydGllcywgZ3JvdXBOYW1lLCBncm91cFR5cGUpOworCQkJCQlpZiAocmVnUmVzcG9uc2UuaXNSaWdodCgpKQorCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZWdSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlpZiAocmVnUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkuc2l6ZSgpID4gMCkgeworCQkJCQkJZ3JvdXBJbmZvLnNldFByb3BlcnRpZXMocmVnUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSkpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIkltcG9ydCBSZXNvdXJjZSAtIGNyZWF0ZSBncm91cCIpOworCQkJbG9nLmRlYnVnKCJlcnJvciB3aGVuIGNyZWF0aW5nIGdyb3VwLCBtZXNzYWdlOnt9IiwgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8R3JvdXBQcm9wZXJ0eT4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVQcm9wZXJ0aWVzVmFsdWVNb2R1bGVGcm9tWWFtbChPYmplY3QgcHJvcGVydGllcywgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIGdyb3VwVHlwZSkgeworCisJCUxpc3Q8R3JvdXBQcm9wZXJ0eT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCX0KKworCQlFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ3JvdXBUeXBlUmVzID0gZ3JvdXBUeXBlT3BlcmF0aW9uLmdldExhdGVzdEdyb3VwVHlwZUJ5VHlwZShncm91cFR5cGUsIHRydWUpOworCisJCWlmIChncm91cFR5cGVSZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR1JPVVBfTUlTU0lOR19HUk9VUF9UWVBFLCBncm91cFR5cGUpKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZ3RQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCQlHcm91cFR5cGVEZWZpbml0aW9uIGdyb3VwVHlwZURlZmluaXRpb24gPSBncm91cFR5cGVSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNEZWYgPSBncm91cFR5cGVEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKTsKKworCQlpZiAocHJvcGVydGllc0RlZiAhPSBudWxsKSB7CisJCQlndFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzRGVmLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0TmFtZSgpLCBwIC0+IHApKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKworCQkJaWYgKHByb3BlcnRpZXMgaW5zdGFuY2VvZiBNYXApIHsKKworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgcHJvcGVydGllczsKKwkJCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHByb3BzLmVudHJ5U2V0KCkpIHsKKworCQkJCQlTdHJpbmcgcHJvcE5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQkJT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJCQlQcm9wZXJ0eURlZmluaXRpb24gZ3REZWZpbml0aW9uID0gZ3RQcm9wZXJ0aWVzLmdldChwcm9wTmFtZSk7CisJCQkJCWlmIChndERlZmluaXRpb24gPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdST1VQX1BST1BFUlRZX05PVF9GT1VORCwgcHJvcE5hbWUsIGdyb3VwTmFtZSwgZ3JvdXBUeXBlKSk7CisJCQkJCX0KKworCQkJCQlUb3NjYVByb3BlcnR5VHlwZSB0eXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUoZ3REZWZpbml0aW9uLmdldFR5cGUoKSk7CisKKwkJCQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKKwkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJCWlmICh0eXBlID09IG51bGwgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7CisJCQkJCQkJY29udmVydGVkVmFsdWUgPSBnc29uLnRvSnNvbih2YWx1ZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvbnZlcnRlZFZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCUdyb3VwUHJvcGVydHkgZ3JvdXBQcm9wZXJ0eSA9IG5ldyBHcm91cFByb3BlcnR5KCk7CisJCQkJCWdyb3VwUHJvcGVydHkuc2V0VmFsdWUoY29udmVydGVkVmFsdWUpOworCQkJCQlncm91cFByb3BlcnR5LnNldE5hbWUocHJvcE5hbWUpOworCisJCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgYnVpbGRpbmcgZ3JvdXAgcHJvcGVydHkge30iLCBncm91cFByb3BlcnR5KTsKKworCQkJCQlyZXN1bHQuYWRkKGdyb3VwUHJvcGVydHkpOworCQkJCX0KKworCQkJfQorCisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gZ2V0TGF0ZXN0UmVzb3VyY2VGcm9tQ3NhclV1aWQoU3RyaW5nIGNzYXJVdWlkLCBVc2VyIHVzZXIpIHsKKworCQkvLyB2YWxpZGF0ZSB1c2VyCisJCWlmICh1c2VyICE9IG51bGwpIHsKKwkJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdXNlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlciwgIkdldCByZXNvdXJjZSBmcm9tIGNzYXIgVVVJRCIsIGZhbHNlKTsKKwkJCWlmICh1c2VyVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVzZXJWYWxpZGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKworCQkvLyBnZXQgcmVzb3VyY2UgZnJvbSBjc2FyIHV1aWQKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RSZXNvdXJjZUJ5Q3Nhck9yTmFtZShjc2FyVXVpZCwgIiIpOworCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfRlJPTV9DU0FSX05PVF9GT1VORCwgY3NhclV1aWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChlaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFJlc3BvbnNlRm9ybWF0PiBnZXRDb21wb25lbnRJbnN0YW5jZXNGaWx0ZXJlZEJ5UHJvcGVydGllc0FuZElucHV0cyhTdHJpbmcgY29tcG9uZW50SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgc2VhcmNoVGV4dCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4sIFJlc3BvbnNlRm9ybWF0PiBnZXRWYWxpZENvbXBvbmVudEluc3RhbmNlQ2FwYWJpbGl0aWVzKE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBkZWZhdWx0Q2FwYWJpbGl0aWVzLCBNYXA8U3RyaW5nLCBMaXN0PFVwbG9hZENhcEluZm8+PiB1cGxvYWRlZENhcGFiaWxpdGllcykgeworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IHZhbGlkQ2FwYWJpbGl0aWVzTWFwID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PFVwbG9hZENhcEluZm8+PiB1cGxvYWRlZENhcGFiaWxpdGllc0VudHJ5IDogdXBsb2FkZWRDYXBhYmlsaXRpZXMuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlID0gdXBsb2FkZWRDYXBhYmlsaXRpZXNFbnRyeS5nZXRWYWx1ZSgpLmdldCgwKS5nZXRUeXBlKCk7CisJCQlpZiAoIWRlZmF1bHRDYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoY2FwYWJpbGl0eVR5cGUpKSB7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ0FQQUJJTElUWV9UWVBFLCBjYXBhYmlsaXR5VHlwZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9IGVsc2UgeworCQkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGRlbGF1bHRDYXBhYmlsaXR5ID0gZGVmYXVsdENhcGFiaWxpdGllcy5nZXQoY2FwYWJpbGl0eVR5cGUpLmdldCgwKTsKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgU3RyaW5nPiB2YWxpZGF0aW9uUmVzID0gdmFsaWRhdGVVbmlxdWVuZXNzVXBkYXRlVXBsb2FkZWRDb21wb25lbnRJbnN0YW5jZUNhcGFiaWxpdHkoZGVsYXVsdENhcGFiaWxpdHksIHVwbG9hZGVkQ2FwYWJpbGl0aWVzRW50cnkuZ2V0VmFsdWUoKS5nZXQoMCkpOworCQkJCWlmICh2YWxpZGF0aW9uUmVzLmlzUmlnaHQoKSkgeworCQkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTkFNRV9BTFJFQURZX0VYSVNUUywgdmFsaWRhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQl9CisJCQkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gdmFsaWRDYXBhYmlsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCXZhbGlkQ2FwYWJpbGl0eUxpc3QuYWRkKGRlbGF1bHRDYXBhYmlsaXR5KTsKKwkJCQl2YWxpZENhcGFiaWxpdGllc01hcC5wdXQodXBsb2FkZWRDYXBhYmlsaXRpZXNFbnRyeS5nZXRLZXkoKSwgdmFsaWRDYXBhYmlsaXR5TGlzdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbGlkQ2FwYWJpbGl0aWVzTWFwKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBTdHJpbmc+IHZhbGlkYXRlVW5pcXVlbmVzc1VwZGF0ZVVwbG9hZGVkQ29tcG9uZW50SW5zdGFuY2VDYXBhYmlsaXR5KENhcGFiaWxpdHlEZWZpbml0aW9uIGRlZmF1bHRDYXBhYmlsaXR5LCBVcGxvYWRDYXBJbmZvIHVwbG9hZGVkQ2FwYWJpbGl0eSkgeworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHZhbGlkUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGRlZmF1bHRQcm9wZXJ0aWVzID0gZGVmYXVsdENhcGFiaWxpdHkuZ2V0UHJvcGVydGllcygpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChQcm9wZXJ0eURlZmluaXRpb246OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKwkJTGlzdDxVcGxvYWRQcm9wSW5mbz4gdXBsb2FkZWRQcm9wZXJ0aWVzID0gdXBsb2FkZWRDYXBhYmlsaXR5LmdldFByb3BlcnRpZXMoKTsKKwkJZm9yIChVcGxvYWRQcm9wSW5mbyBwcm9wZXJ0eSA6IHVwbG9hZGVkUHJvcGVydGllcykgeworCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHByb3BlcnR5LmdldFR5cGUoKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgdmFsaWRQcm9wZXJ0eTsKKwkJCWlmIChkZWZhdWx0UHJvcGVydGllcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7CisJCQkJaWYgKHByb3BlcnR5VHlwZSAhPSBudWxsICYmICFkZWZhdWx0UHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKS5nZXRUeXBlKCkuZXF1YWxzKHByb3BlcnR5VHlwZSkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChwcm9wZXJ0eU5hbWUpOworCQkJCX0KKwkJCX0KKwkJCXZhbGlkUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQkJdmFsaWRQcm9wZXJ0eS5zZXROYW1lKHByb3BlcnR5TmFtZSk7CisJCQlpZiAocHJvcGVydHkuZ2V0VmFsdWUoKSAhPSBudWxsKQorCQkJCXZhbGlkUHJvcGVydHkuc2V0VmFsdWUocHJvcGVydHkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKwkJCXZhbGlkUHJvcGVydHkuc2V0RGVzY3JpcHRpb24ocHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQl2YWxpZFByb3BlcnR5LnNldFBhc3N3b3JkKHByb3BlcnR5LmlzUGFzc3dvcmQoKSk7CisJCQl2YWxpZFByb3BlcnRpZXMuYWRkKHZhbGlkUHJvcGVydHkpOworCQl9CisJCWRlZmF1bHRDYXBhYmlsaXR5LnNldFByb3BlcnRpZXModmFsaWRQcm9wZXJ0aWVzKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXB1YmxpYyBJQ2FjaGVNYW5nZXJPcGVyYXRpb24gZ2V0Q2FjaGVNYW5hZ2VyT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhY2hlTWFuYWdlck9wZXJhdGlvbihJQ2FjaGVNYW5nZXJPcGVyYXRpb24gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uKSB7CisJCXRoaXMuY2FjaGVNYW5hZ2VyT3BlcmF0aW9uID0gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9SZXNvdXJjZUltcG9ydE1hbmFnZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUmVzb3VyY2VJbXBvcnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5NDgxYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUmVzb3VyY2VJbXBvcnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5MjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuYXBpLklBdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW1wb3J0VXRpbHMuUmVzdWx0U3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW1wb3J0VXRpbHMuVG9zY2FUYWdOYW1lc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkF0dHJpYnV0ZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JbnRlcmZhY2VEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVwbG9hZFJlc291cmNlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUdyYXBoTG9ja09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgicmVzb3VyY2VJbXBvcnRNYW5hZ2VyIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUltcG9ydE1hbmFnZXIgeworCisJcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElBdWRpdGluZ01hbmFnZXIgYXVkaXRpbmdNYW5hZ2VyOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIHJlc291cmNlQnVzaW5lc3NMb2dpYzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElHcmFwaExvY2tPcGVyYXRpb24gZ3JhcGhMb2NrT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisKKwlwcml2YXRlIFJlc3BvbnNlRm9ybWF0TWFuYWdlciByZXNwb25zZUZvcm1hdE1hbmFnZXI7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzb3VyY2VJbXBvcnRNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiBpbXBvcnROb3JtYXRpdmVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VZbWwsIFVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZU1ldGFEYXRhLCBVc2VyIGNyZWF0b3IsIGJvb2xlYW4gY3JlYXRlTmV3VmVyc2lvbiwgYm9vbGVhbiBuZWVkTG9jaykgeworCisJCUxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGxpZmVjeWNsZUNoYW5nZUluZm8gPSBuZXcgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24oKTsKKwkJbGlmZWN5Y2xlQ2hhbmdlSW5mby5zZXRVc2VyUmVtYXJrcygiY2VydGlmaWNhdGlvbiBvbiBpbXBvcnQiKTsKKwkJRnVuY3Rpb248UmVzb3VyY2UsIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4+IHZhbGlkYXRvciA9IChyZXNvdXJjZSkgLT4gcmVzb3VyY2VCdXNpbmVzc0xvZ2ljLnZhbGlkYXRlUHJvcGVydGllc0RlZmF1bHRWYWx1ZXMocmVzb3VyY2UpOworCisJCXJldHVybiBpbXBvcnRDZXJ0aWZpZWRSZXNvdXJjZShyZXNvdXJjZVltbCwgcmVzb3VyY2VNZXRhRGF0YSwgY3JlYXRvciwgdmFsaWRhdG9yLCBsaWZlY3ljbGVDaGFuZ2VJbmZvLCBmYWxzZSwgY3JlYXRlTmV3VmVyc2lvbiwgbmVlZExvY2spOworCX0KKworCXB1YmxpYyBFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGltcG9ydENlcnRpZmllZFJlc291cmNlKFN0cmluZyByZXNvdXJjZVltbCwgVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlTWV0YURhdGEsIFVzZXIgY3JlYXRvciwgRnVuY3Rpb248UmVzb3VyY2UsIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4+IHZhbGlkYXRpb25GdW5jdGlvbiwKKwkJCUxpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGxpZmVjeWNsZUNoYW5nZUluZm8sIGJvb2xlYW4gaXNJblRyYW5zYWN0aW9uLCBib29sZWFuIGNyZWF0ZU5ld1ZlcnNpb24sIGJvb2xlYW4gbmVlZExvY2spIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKKwkJSW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiByZXNwb25zZVBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPihyZXNvdXJjZSwgQWN0aW9uU3RhdHVzLkNSRUFURUQpOworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3BvbnNlID0gRWl0aGVyLmxlZnQocmVzcG9uc2VQYWlyKTsKKworCQlTdHJpbmcgbGF0ZXN0Q2VydGlmaWVkUmVzb3VyY2VJZCA9IG51bGw7CisJCXRyeSB7CisJCQlzZXRDb25zdGFudE1ldGFEYXRhKHJlc291cmNlKTsKKwkJCXNldE1ldGFEYXRhRnJvbUpzb24ocmVzb3VyY2VNZXRhRGF0YSwgcmVzb3VyY2UpOworCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VGcm9tWWFtbCA9IHBvcHVsYXRlUmVzb3VyY2VGcm9tWWFtbChyZXNvdXJjZVltbCwgcmVzb3VyY2UsIGlzSW5UcmFuc2FjdGlvbik7CisJCQlpZiAodmFsaWRhdGVSZXNvdXJjZUZyb21ZYW1sLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gdmFsaWRhdGVSZXNvdXJjZUZyb21ZYW1sLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlhdWRpdEVycm9ySW1wb3J0KHJlc291cmNlTWV0YURhdGEsIGNyZWF0b3IsIHZhbGlkYXRpb25FcnJvclJlc3BvbnNlLCB0cnVlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRpb25FcnJvclJlc3BvbnNlKTsKKworCQkJfQorCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGlzVmFsaWRSZXNvdXJjZSA9IHZhbGlkYXRpb25GdW5jdGlvbi5hcHBseShyZXNvdXJjZSk7CisJCQlpZiAoaXNWYWxpZFJlc291cmNlLmlzTGVmdCgpKSB7CisJCQkJLy8gVGhlIGZsYWcgY3JlYXRlTmV3VmVyc2lvbiBpZiBmYWxzZSBkb2Vzbid0IGNyZWF0ZSBuZXcgdmVyc2lvbgorCQkJCWlmICghY3JlYXRlTmV3VmVyc2lvbikgeworCQkJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGxhdGVzdEJ5TmFtZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldExhdGVzdEJ5TmFtZShyZXNvdXJjZS5nZXROYW1lKCksIGlzSW5UcmFuc2FjdGlvbik7CisJCQkJCWlmIChsYXRlc3RCeU5hbWUuaXNMZWZ0KCkpIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVCwgcmVzb3VyY2UpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJlc3BvbnNlID0gcmVzb3VyY2VCdXNpbmVzc0xvZ2ljLmNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VCeUltcG9ydChyZXNvdXJjZSwgY3JlYXRvciwgdHJ1ZSwgaXNJblRyYW5zYWN0aW9uLCBuZWVkTG9jayk7CisJCQkJaWYgKHJlc3BvbnNlLmlzTGVmdCgpKSB7CisJCQkJCXJlc291cmNlID0gcmVzcG9uc2UubGVmdCgpLnZhbHVlKCkubGVmdDsKKwkJCQkJbGF0ZXN0Q2VydGlmaWVkUmVzb3VyY2VJZCA9IGdldExhdGVzdENlcnRpZmllZFJlc291cmNlSWQocmVzb3VyY2UpOworCQkJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjZXJ0aWZpY2F0aW9uUmVzcG9uc2UgPSByZXNvdXJjZUJ1c2luZXNzTG9naWMucHJvcGFnYXRlU3RhdGVUb0NlcnRpZmllZChjcmVhdG9yLCByZXNvdXJjZSwgbGlmZWN5Y2xlQ2hhbmdlSW5mbywgaXNJblRyYW5zYWN0aW9uLCBuZWVkTG9jayk7CisJCQkJCWlmIChjZXJ0aWZpY2F0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCQlyZXNwb25zZSA9IEVpdGhlci5yaWdodChjZXJ0aWZpY2F0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlc3BvbnNlUGFpciA9IG5ldyBJbW11dGFibGVQYWlyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+KGNlcnRpZmljYXRpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSwgcmVzcG9uc2UubGVmdCgpLnZhbHVlKCkucmlnaHQpOworCQkJCQkJcmVzcG9uc2UgPSBFaXRoZXIubGVmdChyZXNwb25zZVBhaXIpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlSZXNwb25zZUZvcm1hdCB2YWxpZGF0aW9uRXJyb3JSZXNwb25zZSA9IGlzVmFsaWRSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJYXVkaXRFcnJvckltcG9ydChyZXNvdXJjZU1ldGFEYXRhLCBjcmVhdG9yLCB2YWxpZGF0aW9uRXJyb3JSZXNwb25zZSwgdHJ1ZSk7CisJCQkJcmVzcG9uc2UgPSBFaXRoZXIucmlnaHQodmFsaWRhdGlvbkVycm9yUmVzcG9uc2UpOworCQkJfQorCisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXhjZXB0aW9uUmVzcG9uc2UgPSBoYW5kbGVJbXBvcnRSZXNvdXJjZUV4ZWNwdGlvbihyZXNvdXJjZU1ldGFEYXRhLCBjcmVhdG9yLCB0cnVlLCBlKTsKKwkJCXJlc3BvbnNlID0gRWl0aGVyLnJpZ2h0KGV4Y2VwdGlvblJlc3BvbnNlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChsYXRlc3RDZXJ0aWZpZWRSZXNvdXJjZUlkICE9IG51bGwgJiYgbmVlZExvY2spIHsKKwkJCQlsb2cuZGVidWcoInVubG9jayByZXNvdXJjZSB7fSIsIGxhdGVzdENlcnRpZmllZFJlc291cmNlSWQpOworCQkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQobGF0ZXN0Q2VydGlmaWVkUmVzb3VyY2VJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRMYXRlc3RDZXJ0aWZpZWRSZXNvdXJjZUlkKFJlc291cmNlIHJlc291cmNlKSB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWxsVmVyc2lvbnMgPSByZXNvdXJjZS5nZXRBbGxWZXJzaW9ucygpOworCQlEb3VibGUgbGF0ZXN0Q2VydGlmaWVkVmVyc2lvbiA9IDAuMDsKKwkJaWYgKGFsbFZlcnNpb25zICE9IG51bGwpIHsKKwkJCWZvciAoU3RyaW5nIHZlcnNpb24gOiBhbGxWZXJzaW9ucy5rZXlTZXQoKSkgeworCQkJCURvdWJsZSBkVmVyc2lvbiA9IERvdWJsZS52YWx1ZU9mKHZlcnNpb24pOworCQkJCWlmICgoZFZlcnNpb24gPiBsYXRlc3RDZXJ0aWZpZWRWZXJzaW9uKSAmJiAodmVyc2lvbi5lbmRzV2l0aCgiLjAiKSkpIHsKKwkJCQkJbGF0ZXN0Q2VydGlmaWVkVmVyc2lvbiA9IGRWZXJzaW9uOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBhbGxWZXJzaW9ucy5nZXQoU3RyaW5nLnZhbHVlT2YobGF0ZXN0Q2VydGlmaWVkVmVyc2lvbikpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiBpbXBvcnRVc2VyRGVmaW5lZFJlc291cmNlKFN0cmluZyByZXNvdXJjZVltbCwgVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlTWV0YURhdGEsIFVzZXIgY3JlYXRvciwgYm9vbGVhbiBpc1JldXNhYmxlLCBib29sZWFuIGlzSW5UcmFuc2FjdGlvbikgeworCisJCVJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7CisJCUltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4gcmVzcG9uc2VQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4ocmVzb3VyY2UsIEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZSA9IEVpdGhlci5sZWZ0KHJlc3BvbnNlUGFpcik7CisKKwkJdHJ5IHsKKwkJCXNldE1ldGFEYXRhRnJvbUpzb24ocmVzb3VyY2VNZXRhRGF0YSwgcmVzb3VyY2UpOworCisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VGcm9tWWFtbCA9IHBvcHVsYXRlUmVzb3VyY2VGcm9tWWFtbChyZXNvdXJjZVltbCwgcmVzb3VyY2UsIGlzSW5UcmFuc2FjdGlvbik7CisJCQlpZiAodmFsaWRhdGVSZXNvdXJjZUZyb21ZYW1sLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gdmFsaWRhdGVSZXNvdXJjZUZyb21ZYW1sLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlhdWRpdEVycm9ySW1wb3J0KHJlc291cmNlTWV0YURhdGEsIGNyZWF0b3IsIHZhbGlkYXRpb25FcnJvclJlc3BvbnNlLCBmYWxzZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0aW9uRXJyb3JSZXNwb25zZSk7CisKKwkJCX0KKworCQkJLy8gY3VycmVudGx5IGltcG9ydCBWRiBpc24ndCBzdXBwb3J0ZWQuIEluIGZ1dHVyZSB3aWxsIGJlIHN1cHBvcnRlZAorCQkJLy8gaW1wb3J0IFZGIG9ubHkgd2l0aCBDU0VSIGZpbGUhIQorCQkJaWYgKFJlc291cmNlVHlwZUVudW0uVkYuZXF1YWxzKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKSkgeworCQkJCWxvZy5kZWJ1ZygiTm93IGltcG9ydCBWRiBpc24ndCBzdXBwb3J0ZWQuIEl0IHdpbGwgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSB3aXRoIENTRVIgZmlsZSBvbmx5Iik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKSk7CisJCQl9CisKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXJpdmVkRnJvbU5vdEVtcHR5ID0gcmVzb3VyY2VCdXNpbmVzc0xvZ2ljLnZhbGlkYXRlRGVyaXZlZEZyb21Ob3RFbXB0eShjcmVhdG9yLCByZXNvdXJjZSwgQXVkaXRpbmdBY3Rpb25FbnVtLkNSRUFURV9SRVNPVVJDRSk7CisJCQlpZiAodmFsaWRhdGVEZXJpdmVkRnJvbU5vdEVtcHR5LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVEZXJpdmVkRnJvbU5vdEVtcHR5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVQcm9wZXJ0aWVzVHlwZXMgPSByZXNvdXJjZUJ1c2luZXNzTG9naWMudmFsaWRhdGVQcm9wZXJ0aWVzRGVmYXVsdFZhbHVlcyhyZXNvdXJjZSk7CisKKwkJCWlmICh2YWxpZGF0ZVByb3BlcnRpZXNUeXBlcy5pc0xlZnQoKSkgeworCQkJCXJlc3BvbnNlID0gcmVzb3VyY2VCdXNpbmVzc0xvZ2ljLmNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VCeUltcG9ydChyZXNvdXJjZSwgY3JlYXRvciwgZmFsc2UsIGlzSW5UcmFuc2FjdGlvbiwgdHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCVJlc3BvbnNlRm9ybWF0IHZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gdmFsaWRhdGVQcm9wZXJ0aWVzVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWF1ZGl0RXJyb3JJbXBvcnQocmVzb3VyY2VNZXRhRGF0YSwgY3JlYXRvciwgdmFsaWRhdGlvbkVycm9yUmVzcG9uc2UsIGZhbHNlKTsKKwkJCQlyZXNwb25zZSA9IEVpdGhlci5yaWdodCh2YWxpZGF0aW9uRXJyb3JSZXNwb25zZSk7CisJCQl9CisKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQlSZXNwb25zZUZvcm1hdCBleGNlcHRpb25SZXNwb25zZSA9IGhhbmRsZUltcG9ydFJlc291cmNlRXhlY3B0aW9uKHJlc291cmNlTWV0YURhdGEsIGNyZWF0b3IsIGZhbHNlLCBlKTsKKwkJCXJlc3BvbnNlID0gRWl0aGVyLnJpZ2h0KGV4Y2VwdGlvblJlc3BvbnNlKTsKKwkJfQorCisJCXJldHVybiByZXNwb25zZTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBwb3B1bGF0ZVJlc291cmNlRnJvbVlhbWwoU3RyaW5nIHJlc291cmNlWW1sLCBSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbkFsbCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBuZXcgWWFtbCgpLmxvYWQocmVzb3VyY2VZbWwpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiA9IHRvc2NhSnNvbkFsbDsKKworCQkvLyBDaGVja3MgaWYgZXhpc3QgYW5kIGJ1aWxkcyB0aGUgbm9kZV90eXBlcyBtYXAKKwkJaWYgKHRvc2NhSnNvbkFsbC5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5OT0RFX1RZUEVTLmdldEVsZW1lbnROYW1lKCkpKSB7CisJCQl0b3NjYUpzb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCXRvc2NhSnNvbi5wdXQoVG9zY2FUYWdOYW1lc0VudW0uTk9ERV9UWVBFUy5nZXRFbGVtZW50TmFtZSgpLCB0b3NjYUpzb25BbGwuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLk5PREVfVFlQRVMuZ2V0RWxlbWVudE5hbWUoKSkpOworCQl9CisJCS8vIERlcml2ZWQgRnJvbQorCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBzZXREZXJpdmVkRnJvbSA9IHNldERlcml2ZWRGcm9tKHRvc2NhSnNvbiwgcmVzb3VyY2UsIGluVHJhbnNhY3Rpb24pOworCQlpZiAoc2V0RGVyaXZlZEZyb20uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHNldERlcml2ZWRGcm9tLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UgPSBzZXREZXJpdmVkRnJvbS5sZWZ0KCkudmFsdWUoKTsKKwkJc2V0VG9zY2FSZXNvdXJjZU5hbWUodG9zY2FKc29uLCByZXNvdXJjZSk7CisJCXNldEF0dHJpYnV0ZXModG9zY2FKc29uLCByZXNvdXJjZSk7CisJCWVpdGhlclJlc3VsdCA9IHNldENhcGFiaWxpdGllcyh0b3NjYUpzb24sIHJlc291cmNlLCBwYXJlbnRSZXNvdXJjZSk7CisJCWlmIChlaXRoZXJSZXN1bHQuaXNSaWdodCgpKQorCQkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwkJc2V0UHJvcGVydGllcyh0b3NjYUpzb24sIHJlc291cmNlKTsKKwkJZWl0aGVyUmVzdWx0ID0gc2V0UmVxdWlyZW1lbnRzKHRvc2NhSnNvbiwgcmVzb3VyY2UsIHBhcmVudFJlc291cmNlKTsKKwkJaWYgKGVpdGhlclJlc3VsdC5pc1JpZ2h0KCkpCisJCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCQlzZXRJbnRlcmZhY2VMaWZlY3ljbGUodG9zY2FKc29uLCByZXNvdXJjZSk7CisKKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VG9zY2FSZXNvdXJjZU5hbWUoTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24sIFJlc291cmNlIHJlc291cmNlKSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBPYmplY3Q+LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYUVsZW1lbnQgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYU1hcEVsZW1lbnQodG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bS5OT0RFX1RZUEVTKTsKKwkJaWYgKHRvc2NhRWxlbWVudC5pc0xlZnQoKSB8fCB0b3NjYUVsZW1lbnQubGVmdCgpLnZhbHVlKCkuc2l6ZSgpID09IDEpIHsKKwkJCVN0cmluZyB0b3NjYVJlc291cmNlTmFtZSA9IHRvc2NhRWxlbWVudC5sZWZ0KCkudmFsdWUoKS5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKwkJCXJlc291cmNlLnNldFRvc2NhUmVzb3VyY2VOYW1lKHRvc2NhUmVzb3VyY2VOYW1lKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZXRJbnRlcmZhY2VMaWZlY3ljbGUoTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYUpzb24sIFJlc291cmNlIHJlc291cmNlKSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBPYmplY3Q+LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYUludGVyZmFjZXMgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYU1hcEVsZW1lbnQodG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bS5JTlRFUkZBQ0VTKTsKKwkJaWYgKHRvc2NhSW50ZXJmYWNlcy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uSW50ZXJmYWNlcyA9IHRvc2NhSW50ZXJmYWNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCU1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+IG1vZHVsZUludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+KCk7CisJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGludGVyZmFjZXNOYW1lVmFsdWUgPSBqc29uSW50ZXJmYWNlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaW50ZXJmYWNlc05hbWVWYWx1ZS5oYXNOZXh0KCkpIHsKKwkJCQlFbnRyeTxTdHJpbmcsIE9iamVjdD4gaW50ZXJmYWNlTmFtZVZhbHVlID0gaW50ZXJmYWNlc05hbWVWYWx1ZS5uZXh0KCk7CisJCQkJRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFJlc3VsdFN0YXR1c0VudW0+IGVpdGhlckludGVyZmFjZSA9IGNyZWF0ZU1vZHVsZUludGVyZmFjZShpbnRlcmZhY2VOYW1lVmFsdWUuZ2V0VmFsdWUoKSk7CisJCQkJaWYgKGVpdGhlckludGVyZmFjZS5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmluZm8oImVycm9yIHdoZW4gY3JlYXRpbmcgaW50ZXJmYWNlOnt9LCBmb3IgcmVzb3VyY2U6e30iLCBpbnRlcmZhY2VOYW1lVmFsdWUuZ2V0S2V5KCksIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbW9kdWxlSW50ZXJmYWNlcy5wdXQoaW50ZXJmYWNlTmFtZVZhbHVlLmdldEtleSgpLCBlaXRoZXJJbnRlcmZhY2UubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKworCQkJfQorCQkJaWYgKG1vZHVsZUludGVyZmFjZXMuc2l6ZSgpID4gMCkgeworCQkJCXJlc291cmNlLnNldEludGVyZmFjZXMobW9kdWxlSW50ZXJmYWNlcyk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBSZXN1bHRTdGF0dXNFbnVtPiBjcmVhdGVNb2R1bGVJbnRlcmZhY2UoT2JqZWN0IGludGVyZmFjZUpzb24pIHsKKwkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmYgPSBuZXcgSW50ZXJmYWNlRGVmaW5pdGlvbigpOworCQlFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgUmVzdWx0U3RhdHVzRW51bT4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoaW50ZXJmKTsKKworCQl0cnkgeworCQkJaWYgKGludGVyZmFjZUpzb24gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgcmVxdWlyZW1lbnRKc29uU3RyaW5nID0gKFN0cmluZykgaW50ZXJmYWNlSnNvbjsKKwkJCQlpbnRlcmYuc2V0VHlwZShyZXF1aXJlbWVudEpzb25TdHJpbmcpOworCQkJfSBlbHNlIGlmIChpbnRlcmZhY2VKc29uIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudEpzb25NYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgaW50ZXJmYWNlSnNvbjsKKwkJCQlpZiAocmVxdWlyZW1lbnRKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXF1aXJlbWVudEpzb25NYXAuZ2V0KFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQkJCWludGVyZi5zZXRUeXBlKHR5cGUpOworCQkJCQlpbnRlcmYuc2V0VW5pcXVlSWQodHlwZS50b0xvd2VyQ2FzZSgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChSZXN1bHRTdGF0dXNFbnVtLkdFTkVSQUxfRVJST1IpOworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIkltcG9ydCBSZXNvdXJjZS0gY3JlYXRlIGludGVyZmFjZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIkltcG9ydCBSZXNvdXJjZS0gY3JlYXRlIGludGVyZmFjZSIpOworCQkJbG9nLmRlYnVnKCJlcnJvciB3aGVuIGNyZWF0aW5nIGludGVyZmFjZSwgbWVzc2FnZTp7fSIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChSZXN1bHRTdGF0dXNFbnVtLkdFTkVSQUxfRVJST1IpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gc2V0UmVxdWlyZW1lbnRzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UpIHsvLyBOb3RlIHRoYXQgcGFyZW50UmVzb3VyY2UgY2FuIGJlIG51bGwKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXN1bHQgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJRWl0aGVyPExpc3Q8T2JqZWN0PiwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FSZXF1aXJlbWVudHMgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYUxpc3RFbGVtZW50KHRvc2NhSnNvbiwgVG9zY2FUYWdOYW1lc0VudW0uUkVRVUlSRU1FTlRTKTsKKwkJaWYgKHRvc2NhUmVxdWlyZW1lbnRzLmlzTGVmdCgpKSB7CisJCQlMaXN0PE9iamVjdD4ganNvblJlcXVpcmVtZW50cyA9IHRvc2NhUmVxdWlyZW1lbnRzLmxlZnQoKS52YWx1ZSgpOworCQkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBtb2R1bGVSZXF1aXJlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4oKTsKKwkJCS8vIENoZWNraW5nIGZvciBuYW1lIGR1cGxpY2F0aW9uCisJCQlTZXQ8U3RyaW5nPiByZXFOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJCS8vIEdldHRpbmcgZmxhdHRlbmVkIGxpc3Qgb2YgY2FwYWJpbGl0aWVzIG9mIHBhcmVudCBub2RlIC0gY2FwIG5hbWUKKwkJCS8vIHRvIGNhcCB0eXBlCisJCQlFaXRoZXI8TWFwPFN0cmluZywgU3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IHJlcU5hbWUyVHlwZSA9IGdldFJlcU5hbWUyVHlwZShwYXJlbnRSZXNvdXJjZSk7CisJCQlpZiAocmVxTmFtZTJUeXBlLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gcmVxTmFtZTJUeXBlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkVycm9yIGR1cmluZyBzZXR0aW5nIHJlcXVpcmVtZW50cyBvZiBpbXBvcnRlZCByZXNvdXJjZToge30iLCByZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcU5hbWUyVHlwZU1hcCA9IHJlcU5hbWUyVHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoT2JqZWN0IGpzb25SZXF1aXJlbWVudE9iaiA6IGpzb25SZXF1aXJlbWVudHMpIHsKKwkJCQkvLyBSZXF1aXJlbWVudAorCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWlyZW1lbnRKc29uV3JhcHBlciA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uUmVxdWlyZW1lbnRPYmo7CisJCQkJU3RyaW5nIHJlcXVpcmVtZW50TmFtZSA9IHJlcXVpcmVtZW50SnNvbldyYXBwZXIua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJU3RyaW5nIHJlcU5hbWVMb3dlckNhc2UgPSByZXF1aXJlbWVudE5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCQlpZiAocmVxTmFtZXMuY29udGFpbnMocmVxTmFtZUxvd2VyQ2FzZSkpIHsKKwkJCQkJbG9nLmRlYnVnKCJNb3JlIHRoYW4gb25lIHJlcXVpcmVtZW50IHdpdGggc2FtZSBuYW1lIHt9IChjYXNlLWluc2Vuc2l0aXZlKSBpbiBpbXBvcnRlZCBUT1NDQSBmaWxlIGlzIGludmFsaWQiLCByZXFOYW1lTG93ZXJDYXNlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklNUE9SVF9EVVBMSUNBVEVfUkVRX0NBUF9OQU1FLCAicmVxdWlyZW1lbnQiLCByZXFOYW1lTG93ZXJDYXNlKSk7CisJCQkJfQorCQkJCXJlcU5hbWVzLmFkZChyZXFOYW1lTG93ZXJDYXNlKTsKKwkJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVxdWlyZW1lbnQgPSBjcmVhdGVSZXF1aXJlbWVudEZyb21JbXBvcnRGaWxlKHJlcXVpcmVtZW50SnNvbldyYXBwZXIuZ2V0KHJlcXVpcmVtZW50TmFtZSkpOworCQkJCWlmIChlaXRoZXJSZXF1aXJlbWVudC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmluZm8oImVycm9yIHdoZW4gY3JlYXRpbmcgUmVxdWlyZW1lbnQ6e30sIGZvciByZXNvdXJjZTp7fSIsIHJlcXVpcmVtZW50TmFtZSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJSZXF1aXJlbWVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxdWlyZW1lbnREZWYgPSBlaXRoZXJSZXF1aXJlbWVudC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXF1aXJlbWVudERlZi5zZXROYW1lKHJlcXVpcmVtZW50TmFtZSk7CisJCQkJaWYgKG1vZHVsZVJlcXVpcmVtZW50cy5jb250YWluc0tleShyZXF1aXJlbWVudERlZi5nZXRDYXBhYmlsaXR5KCkpKSB7CisJCQkJCW1vZHVsZVJlcXVpcmVtZW50cy5nZXQocmVxdWlyZW1lbnREZWYuZ2V0Q2FwYWJpbGl0eSgpKS5hZGQocmVxdWlyZW1lbnREZWYpOworCQkJCX0gZWxzZSB7CisJCQkJCUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+KCk7CisJCQkJCWxpc3QuYWRkKHJlcXVpcmVtZW50RGVmKTsKKwkJCQkJbW9kdWxlUmVxdWlyZW1lbnRzLnB1dChyZXF1aXJlbWVudERlZi5nZXRDYXBhYmlsaXR5KCksIGxpc3QpOworCQkJCX0KKworCQkJCS8vIFZhbGlkYXRpbmcgYWdhaW5zdCByZXEvY2FwIG9mICJkZXJpdmVkIGZyb20iIG5vZGUKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVnNQYXJlbnRDYXAgPSB2YWxpZGF0ZUNhcE5hbWVWc0Rlcml2ZWQocmVxTmFtZTJUeXBlTWFwLCByZXF1aXJlbWVudERlZi5nZXRDYXBhYmlsaXR5KCksIHJlcXVpcmVtZW50RGVmLmdldE5hbWUoKSk7CisJCQkJaWYgKHZhbGlkYXRlVnNQYXJlbnRDYXAuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVWc1BhcmVudENhcC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlpZiAoIXZhbGlkYXRlVnNQYXJlbnRDYXAubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJSZXF1aXJlbWVudCB3aXRoIG5hbWUge30gYWxyZWFkeSBleGlzdHMgaW4gcGFyZW50IHt9IiwgcmVxdWlyZW1lbnREZWYuZ2V0TmFtZSgpLCBwYXJlbnRSZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU1QT1JUX1JFUV9DQVBfTkFNRV9FWElTVFNfSU5fREVSSVZFRCwgInJlcXVpcmVtZW50IiwgcmVxdWlyZW1lbnREZWYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCksIHBhcmVudFJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtb2R1bGVSZXF1aXJlbWVudHMuc2l6ZSgpID4gMCkgeworCQkJCXJlc291cmNlLnNldFJlcXVpcmVtZW50cyhtb2R1bGVSZXF1aXJlbWVudHMpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlcXVpcmVtZW50RnJvbUltcG9ydEZpbGUoT2JqZWN0IHJlcXVpcmVtZW50SnNvbikgeworCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxdWlyZW1lbnQgPSBuZXcgUmVxdWlyZW1lbnREZWZpbml0aW9uKCk7CisJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBFaXRoZXIubGVmdChyZXF1aXJlbWVudCk7CisKKwkJdHJ5IHsKKwkJCWlmIChyZXF1aXJlbWVudEpzb24gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgcmVxdWlyZW1lbnRKc29uU3RyaW5nID0gKFN0cmluZykgcmVxdWlyZW1lbnRKc29uOworCQkJCXJlcXVpcmVtZW50LnNldENhcGFiaWxpdHkocmVxdWlyZW1lbnRKc29uU3RyaW5nKTsKKwkJCX0gZWxzZSBpZiAocmVxdWlyZW1lbnRKc29uIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiByZXF1aXJlbWVudEpzb25NYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgcmVxdWlyZW1lbnRKc29uOworCQkJCWlmIChyZXF1aXJlbWVudEpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uQ0FQQUJJTElUWS5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQlyZXF1aXJlbWVudC5zZXRDYXBhYmlsaXR5KChTdHJpbmcpIHJlcXVpcmVtZW50SnNvbk1hcC5nZXQoVG9zY2FUYWdOYW1lc0VudW0uQ0FQQUJJTElUWS5nZXRFbGVtZW50TmFtZSgpKSk7CisJCQkJfQorCisJCQkJaWYgKHJlcXVpcmVtZW50SnNvbk1hcC5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5OT0RFLmdldEVsZW1lbnROYW1lKCkpKSB7CisJCQkJCXJlcXVpcmVtZW50LnNldE5vZGUoKFN0cmluZykgcmVxdWlyZW1lbnRKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5OT0RFLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCQl9CisKKwkJCQlpZiAocmVxdWlyZW1lbnRKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLlJFTEFUSU9OU0hJUC5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQlyZXF1aXJlbWVudC5zZXRSZWxhdGlvbnNoaXAoKFN0cmluZykgcmVxdWlyZW1lbnRKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5SRUxBVElPTlNISVAuZ2V0RWxlbWVudE5hbWUoKSkpOworCQkJCX0KKwkJCQlpZiAocmVxdWlyZW1lbnRKc29uTWFwLmNvbnRhaW5zS2V5KFRvc2NhVGFnTmFtZXNFbnVtLk9DQ1VSUkVOQ0VTLmdldEVsZW1lbnROYW1lKCkpKSB7CisJCQkJCUxpc3Q8T2JqZWN0PiBvY2N1cnJlbmNlc0xpc3QgPSAoTGlzdCkgcmVxdWlyZW1lbnRKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5PQ0NVUlJFTkNFUy5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFNldE9jY3VycmVuY2VzU3RhdHVzID0gdmFsaWRhdGVPY2N1cnJlbmNlcyhvY2N1cnJlbmNlc0xpc3QpOworCQkJCQlpZiAodmFsaWRhdGVBbmRTZXRPY2N1cnJlbmNlc1N0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUFuZFNldE9jY3VycmVuY2VzU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJCWlmICh2YWxpZGF0ZUFuZFNldE9jY3VycmVuY2VzU3RhdHVzLmxlZnQoKS52YWx1ZSgpID09IHRydWUpIHsKKwkJCQkJCXJlcXVpcmVtZW50LnNldE1pbk9jY3VycmVuY2VzKG9jY3VycmVuY2VzTGlzdC5nZXQoMCkudG9TdHJpbmcoKSk7CisJCQkJCQlyZXF1aXJlbWVudC5zZXRNYXhPY2N1cnJlbmNlcyhvY2N1cnJlbmNlc0xpc3QuZ2V0KDEpLnRvU3RyaW5nKCkpOworCQkJCQl9CisKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfWUFNTCkpOworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIkltcG9ydCBSZXNvdXJjZSAtIGNyZWF0ZSBSZXF1aXJlbWVudCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIkltcG9ydCBSZXNvdXJjZSAtIGNyZWF0ZSBSZXF1aXJlbWVudCIpOworCQkJbG9nLmRlYnVnKCJlcnJvciB3aGVuIGNyZWF0aW5nIHJlcXVpcmVtZW50LCBtZXNzYWdlOnt9IiwgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgUmVzdWx0U3RhdHVzRW51bSBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBSZXNvdXJjZSByZXNvdXJjZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJlZHVjZWRUb3NjYUpzb24gPSBuZXcgSGFzaE1hcDw+KHRvc2NhSnNvbik7CisJCUltcG9ydFV0aWxzLnJlbW92ZUVsZW1lbnRGcm9tSnNvbk1hcChyZWR1Y2VkVG9zY2FKc29uLCAiY2FwYWJpbGl0aWVzIik7CisJCVJlc3VsdFN0YXR1c0VudW0gcmVzdWx0ID0gUmVzdWx0U3RhdHVzRW51bS5PSzsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3VsdFN0YXR1c0VudW0+IHByb3BlcnRpZXMgPSBJbXBvcnRVdGlscy5nZXRQcm9wZXJ0aWVzKHJlZHVjZWRUb3NjYUpzb24pOworCQlpZiAocHJvcGVydGllcy5pc0xlZnQoKSkgeworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHZhbHVlID0gcHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJZm9yIChFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZW50cnkgOiB2YWx1ZS5lbnRyeVNldCgpKSB7CisJCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCQlwcm9wZXJ0eURlZmluaXRpb24uc2V0TmFtZShuYW1lKTsKKwkJCQkJcHJvcGVydGllc0xpc3QuYWRkKHByb3BlcnR5RGVmaW5pdGlvbik7CisJCQkJfQorCQkJfQorCQkJcmVzb3VyY2Uuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzTGlzdCk7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBwcm9wZXJ0aWVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgUmVzdWx0U3RhdHVzRW51bSBzZXRBdHRyaWJ1dGVzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBSZXNvdXJjZSByZXNvdXJjZSkgeworCQlSZXN1bHRTdGF0dXNFbnVtIHJlc3VsdCA9IFJlc3VsdFN0YXR1c0VudW0uT0s7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBBdHRyaWJ1dGVEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gYXR0cmlidXRlcyA9IEltcG9ydFV0aWxzLmdldEF0dHJpYnV0ZXModG9zY2FKc29uKTsKKwkJaWYgKGF0dHJpYnV0ZXMuaXNMZWZ0KCkpIHsKKwkJCUxpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJTWFwPFN0cmluZywgQXR0cmlidXRlRGVmaW5pdGlvbj4gdmFsdWUgPSBhdHRyaWJ1dGVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQlmb3IgKEVudHJ5PFN0cmluZywgQXR0cmlidXRlRGVmaW5pdGlvbj4gZW50cnkgOiB2YWx1ZS5lbnRyeVNldCgpKSB7CisJCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJCUF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlRGVmID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJYXR0cmlidXRlRGVmLnNldE5hbWUobmFtZSk7CisJCQkJCWF0dHJpYnV0ZUxpc3QuYWRkKGF0dHJpYnV0ZURlZik7CisJCQkJfQorCQkJfQorCQkJcmVzb3VyY2Uuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVMaXN0KTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IGF0dHJpYnV0ZXMucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBzZXREZXJpdmVkRnJvbShNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiwgUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8U3RyaW5nLCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYURlcml2ZWRGcm9tRWxlbWVudCA9IEltcG9ydFV0aWxzLmZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudCh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLkRFUklWRURfRlJPTSk7CisJCVJlc291cmNlIGRlcml2ZWRGcm9tUmVzb3VyY2UgPSBudWxsOworCQlpZiAodG9zY2FEZXJpdmVkRnJvbUVsZW1lbnQuaXNMZWZ0KCkpIHsKKwkJCVN0cmluZyBkZXJpdmVkRnJvbSA9IHRvc2NhRGVyaXZlZEZyb21FbGVtZW50LmxlZnQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJEZXJpdmVkIGZyb20gVE9TQ0EgbmFtZSBpcyB7fSIsIGRlcml2ZWRGcm9tKTsKKwkJCXJlc291cmNlLnNldERlcml2ZWRGcm9tKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgZGVyaXZlZEZyb20gfSkpOworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBsYXRlc3RCeVRvc2NhUmVzb3VyY2VOYW1lID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0QnlUb3NjYVJlc291cmNlTmFtZShkZXJpdmVkRnJvbSwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAobGF0ZXN0QnlUb3NjYVJlc291cmNlTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGxhdGVzdEJ5VG9zY2FSZXNvdXJjZU5hbWUucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChvcGVyYXRpb25TdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCQlvcGVyYXRpb25TdGF0dXMgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQ7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiRXJyb3Igd2hlbiBmZXRjaGluZyBwYXJlbnQgcmVzb3VyY2Uge30sIGVycm9yOiB7fSIsIGRlcml2ZWRGcm9tLCBvcGVyYXRpb25TdGF0dXMpOworCQkJCUFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShvcGVyYXRpb25TdGF0dXMpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUNvbXBvbmVudE1pc3NpbmdFcnJvcigiSW1wb3J0IFRPU0NBIFlBTUwiLCAicmVzb3VyY2UiLCBkZXJpdmVkRnJvbSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UsIGRlcml2ZWRGcm9tKSk7CisJCQl9CisJCQlkZXJpdmVkRnJvbVJlc291cmNlID0gbGF0ZXN0QnlUb3NjYVJlc291cmNlTmFtZS5sZWZ0KCkudmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZGVyaXZlZEZyb21SZXNvdXJjZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHNldENhcGFiaWxpdGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiwgUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlIHBhcmVudFJlc291cmNlKSB7Ly8gTm90ZSB0aGF0IHBhcmVudFJlc291cmNlIGNhbiBiZSBudWxsCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBPYmplY3Q+LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYUNhcGFiaWxpdGllcyA9IEltcG9ydFV0aWxzLmZpbmRGaXJzdFRvc2NhTWFwRWxlbWVudCh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLkNBUEFCSUxJVElFUyk7CisJCWlmICh0b3NjYUNhcGFiaWxpdGllcy5pc0xlZnQoKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBqc29uQ2FwYWJpbGl0aWVzID0gdG9zY2FDYXBhYmlsaXRpZXMubGVmdCgpLnZhbHVlKCk7CisJCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gbW9kdWxlQ2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4oKTsKKwkJCUl0ZXJhdG9yPEVudHJ5PFN0cmluZywgT2JqZWN0Pj4gY2FwYWJpbGl0aWVzTmFtZVZhbHVlID0ganNvbkNhcGFiaWxpdGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCQlTZXQ8U3RyaW5nPiBjYXBOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJCS8vIEdldHRpbmcgZmxhdHRlbmVkIGxpc3Qgb2YgY2FwYWJpbGl0aWVzIG9mIHBhcmVudCBub2RlIC0gY2FwIG5hbWUKKwkJCS8vIHRvIGNhcCB0eXBlCisJCQlFaXRoZXI8TWFwPFN0cmluZywgU3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IGNhcE5hbWUyVHlwZSA9IGdldENhcE5hbWUyVHlwZShwYXJlbnRSZXNvdXJjZSk7CisJCQlpZiAoY2FwTmFtZTJUeXBlLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY2FwTmFtZTJUeXBlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkVycm9yIGR1cmluZyBzZXR0aW5nIGNhcGFiaWxpdGllcyBvZiBpbXBvcnRlZCByZXNvdXJjZToge30iLCByZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNhcE5hbWUyVHlwZU1hcCA9IGNhcE5hbWUyVHlwZS5sZWZ0KCkudmFsdWUoKTsKKwkJCXdoaWxlIChjYXBhYmlsaXRpZXNOYW1lVmFsdWUuaGFzTmV4dCgpKSB7CisJCQkJRW50cnk8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdHlOYW1lVmFsdWUgPSBjYXBhYmlsaXRpZXNOYW1lVmFsdWUubmV4dCgpOworCisJCQkJLy8gVmFsaWRhdGluZyB0aGF0IG5vIHJlcS9jYXAgZHVwbGljYXRlcyBleGlzdCBpbiBpbXBvcnRlZCBZQU1MCisJCQkJU3RyaW5nIGNhcE5hbWVMb3dlckNhc2UgPSBjYXBhYmlsaXR5TmFtZVZhbHVlLmdldEtleSgpLnRvTG93ZXJDYXNlKCk7CisJCQkJaWYgKGNhcE5hbWVzLmNvbnRhaW5zKGNhcE5hbWVMb3dlckNhc2UpKSB7CisJCQkJCWxvZy5kZWJ1ZygiTW9yZSB0aGFuIG9uZSBjYXBhYmlsaXR5IHdpdGggc2FtZSBuYW1lIHt9IChjYXNlLWluc2Vuc2l0aXZlKSBpbiBpbXBvcnRlZCBUT1NDQSBmaWxlIGlzIGludmFsaWQiLCBjYXBOYW1lTG93ZXJDYXNlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklNUE9SVF9EVVBMSUNBVEVfUkVRX0NBUF9OQU1FLCAiY2FwYWJpbGl0eSIsIGNhcE5hbWVMb3dlckNhc2UpKTsKKwkJCQl9CisJCQkJY2FwTmFtZXMuYWRkKGNhcE5hbWVMb3dlckNhc2UpOworCisJCQkJRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQ2FwYWJpbGl0eSA9IGNyZWF0ZUNhcGFiaWxpdHlGcm9tSW1wb3J0RmlsZShjYXBhYmlsaXR5TmFtZVZhbHVlLmdldFZhbHVlKCkpOworCQkJCWlmIChlaXRoZXJDYXBhYmlsaXR5LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImVycm9yIHdoZW4gY3JlYXRpbmcgY2FwYWJpbGl0eTp7fSwgZm9yIHJlc291cmNlOnt9IiwgY2FwYWJpbGl0eU5hbWVWYWx1ZS5nZXRLZXkoKSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDYXBhYmlsaXR5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCisJCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZiA9IGVpdGhlckNhcGFiaWxpdHkubGVmdCgpLnZhbHVlKCk7CisJCQkJY2FwYWJpbGl0eURlZi5zZXROYW1lKGNhcGFiaWxpdHlOYW1lVmFsdWUuZ2V0S2V5KCkpOworCQkJCWlmIChtb2R1bGVDYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoY2FwYWJpbGl0eURlZi5nZXRUeXBlKCkpKSB7CisJCQkJCW1vZHVsZUNhcGFiaWxpdGllcy5nZXQoY2FwYWJpbGl0eURlZi5nZXRUeXBlKCkpLmFkZChjYXBhYmlsaXR5RGVmKTsKKwkJCQl9IGVsc2UgeworCQkJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4oKTsKKwkJCQkJbGlzdC5hZGQoY2FwYWJpbGl0eURlZik7CisJCQkJCW1vZHVsZUNhcGFiaWxpdGllcy5wdXQoY2FwYWJpbGl0eURlZi5nZXRUeXBlKCksIGxpc3QpOworCQkJCX0KKworCQkJCS8vIFZhbGlkYXRpbmcgYWdhaW5zdCByZXEvY2FwIG9mICJkZXJpdmVkIGZyb20iIG5vZGUKKwkJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVnNQYXJlbnRDYXAgPSB2YWxpZGF0ZUNhcE5hbWVWc0Rlcml2ZWQoY2FwTmFtZTJUeXBlTWFwLCBjYXBhYmlsaXR5RGVmLmdldFR5cGUoKSwgY2FwYWJpbGl0eURlZi5nZXROYW1lKCkpOworCQkJCWlmICh2YWxpZGF0ZVZzUGFyZW50Q2FwLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlVnNQYXJlbnRDYXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQkJaWYgKCF2YWxpZGF0ZVZzUGFyZW50Q2FwLmxlZnQoKS52YWx1ZSgpKSB7CisJCQkJCS8vIEhlcmUgcGFyZW50UmVzb3VyY2UgaXMgZm9yIHN1cmUgbm90IG51bGwsIHNvIGl0J3MKKwkJCQkJLy8gbnVsbC1zYWZlCisJCQkJCWxvZy5kZWJ1ZygiQ2FwYWJpbGl0eSB3aXRoIG5hbWUge30gYWxyZWFkeSBleGlzdHMgaW4gcGFyZW50IHt9IiwgY2FwYWJpbGl0eURlZi5nZXROYW1lKCksIHBhcmVudFJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTVBPUlRfUkVRX0NBUF9OQU1FX0VYSVNUU19JTl9ERVJJVkVELCAiY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlEZWYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCksIHBhcmVudFJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtb2R1bGVDYXBhYmlsaXRpZXMuc2l6ZSgpID4gMCkgeworCQkJCXJlc291cmNlLnNldENhcGFiaWxpdGllcyhtb2R1bGVDYXBhYmlsaXRpZXMpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIFN0cmluZz4sIFJlc3BvbnNlRm9ybWF0PiBnZXRDYXBOYW1lMlR5cGUoUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UpIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjYXBOYW1lMnR5cGUgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7CisJCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzID0gcGFyZW50UmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCQlpZiAoY2FwYWJpbGl0aWVzICE9IG51bGwpIHsKKwkJCQlmb3IgKExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcERlZmluaXRpb25zIDogY2FwYWJpbGl0aWVzLnZhbHVlcygpKSB7CisJCQkJCWZvciAoQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwRGVmaW5pdGlvbiA6IGNhcERlZmluaXRpb25zKSB7CisJCQkJCQlTdHJpbmcgbmFtZUxvd2VyQ2FzZSA9IGNhcERlZmluaXRpb24uZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCQkJCQlpZiAoY2FwTmFtZTJ0eXBlLmdldChuYW1lTG93ZXJDYXNlKSAhPSBudWxsKSB7CisJCQkJCQkJU3RyaW5nIHBhcmVudFJlc291cmNlTmFtZSA9IHBhcmVudFJlc291cmNlLmdldE5hbWUoKTsKKwkJCQkJCQlsb2cuZGVidWcoIlJlc291cmNlIHdpdGggbmFtZSB7fSBoYXMgbW9yZSB0aGFuIG9uZSBjYXBhYmlsaXR5IHdpdGggbmFtZSB7fSwgaWdub3JpbmcgY2FzZSIsIHBhcmVudFJlc291cmNlTmFtZSwgbmFtZUxvd2VyQ2FzZSk7CisJCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJJbXBvcnQgcmVzb3VyY2UiLCAiUGFyZW50IHJlc291cmNlICIgKyBwYXJlbnRSZXNvdXJjZU5hbWUgKyAiIG9mIGltcG9ydGVkIHJlc291cmNlIGhhcyBvbmUgb3IgbW9yZSBjYXBhYmlsaXRpZXMgd2l0aCBuYW1lICIgKyBuYW1lTG93ZXJDYXNlLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJCQkJfQorCQkJCQkJY2FwTmFtZTJ0eXBlLnB1dChuYW1lTG93ZXJDYXNlLCBjYXBEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhcE5hbWUydHlwZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgU3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IGdldFJlcU5hbWUyVHlwZShSZXNvdXJjZSBwYXJlbnRSZXNvdXJjZSkgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcU5hbWUydHlwZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJaWYgKHBhcmVudFJlc291cmNlICE9IG51bGwpIHsKKwkJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzID0gcGFyZW50UmVzb3VyY2UuZ2V0UmVxdWlyZW1lbnRzKCk7CisJCQlpZiAocmVxdWlyZW1lbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFEZWZpbml0aW9ucyA6IHJlcXVpcmVtZW50cy52YWx1ZXMoKSkgeworCQkJCQlmb3IgKFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uIDogcmVxRGVmaW5pdGlvbnMpIHsKKwkJCQkJCVN0cmluZyBuYW1lTG93ZXJDYXNlID0gcmVxRGVmaW5pdGlvbi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJCQkJCWlmIChyZXFOYW1lMnR5cGUuZ2V0KG5hbWVMb3dlckNhc2UpICE9IG51bGwpIHsKKwkJCQkJCQlTdHJpbmcgcGFyZW50UmVzb3VyY2VOYW1lID0gcGFyZW50UmVzb3VyY2UuZ2V0TmFtZSgpOworCQkJCQkJCWxvZy5kZWJ1ZygiUmVzb3VyY2Ugd2l0aCBuYW1lIHt9IGhhcyBtb3JlIHRoYW4gb25lIHJlcXVpcmVtZW50IHdpdGggbmFtZSB7fSwgaWdub3JpbmcgY2FzZSIsIHBhcmVudFJlc291cmNlTmFtZSwgbmFtZUxvd2VyQ2FzZSk7CisJCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRGF0YUVycm9yKCJJbXBvcnQgcmVzb3VyY2UiLCAiUGFyZW50IHJlc291cmNlICIgKyBwYXJlbnRSZXNvdXJjZU5hbWUgKyAiIG9mIGltcG9ydGVkIHJlc291cmNlIGhhcyBvbmUgb3IgbW9yZSByZXF1aXJlbWVudHMgd2l0aCBuYW1lICIgKyBuYW1lTG93ZXJDYXNlLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJCQkJfQorCQkJCQkJcmVxTmFtZTJ0eXBlLnB1dChuYW1lTG93ZXJDYXNlLCByZXFEZWZpbml0aW9uLmdldENhcGFiaWxpdHkoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlcU5hbWUydHlwZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQ2FwTmFtZVZzRGVyaXZlZChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmVudENhcE5hbWUyVHlwZSwgU3RyaW5nIGNoaWxkQ2FwYWJpbGl0eVR5cGUsIFN0cmluZyByZXFDYXBOYW1lKSB7CisJCVN0cmluZyBjYXBOYW1lTG93ZXJDYXNlID0gcmVxQ2FwTmFtZS50b0xvd2VyQ2FzZSgpOworCQlsb2cudHJhY2UoIlZhbGlkYXRpbmcgY2FwYWJpbGl0eSB7fSB2cyBwYXJlbnQgcmVzb3VyY2UiLCBjYXBOYW1lTG93ZXJDYXNlKTsKKwkJU3RyaW5nIHBhcmVudENhcFR5cGUgPSBwYXJlbnRDYXBOYW1lMlR5cGUuZ2V0KGNhcE5hbWVMb3dlckNhc2UpOworCQlpZiAocGFyZW50Q2FwVHlwZSAhPSBudWxsKSB7CisJCQlpZiAoY2hpbGRDYXBhYmlsaXR5VHlwZS5lcXVhbHMocGFyZW50Q2FwVHlwZSkpIHsKKwkJCQlsb2cuZGVidWcoIkNhcGFiaWxpdHkgd2l0aCBuYW1lIHt9IGlzIG9mIHNhbWUgdHlwZSB7fSBmb3IgaW1wb3J0ZWQgcmVzb3VyY2UgYW5kIGl0cyBwYXJlbnQgLSB0aGlzIGlzIE9LIiwgY2FwTmFtZUxvd2VyQ2FzZSwgY2hpbGRDYXBhYmlsaXR5VHlwZSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQkJfQorCQkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlRGVyaXZlZEZyb20gPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbi5pc0NhcGFiaWxpdHlUeXBlRGVyaXZlZEZyb20oY2hpbGRDYXBhYmlsaXR5VHlwZSwgcGFyZW50Q2FwVHlwZSk7CisJCQlpZiAoY2FwYWJpbGl0eVR5cGVEZXJpdmVkRnJvbS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvdWxkbid0IGNoZWNrIHdoZXRoZXIgaW1wb3J0ZWQgcmVzb3VyY2UgY2FwYWJpbGl0eSBkZXJpdmVzIGZyb20gaXRzIHBhcmVudCdzIGNhcGFiaWxpdHkiKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoY2FwYWJpbGl0eVR5cGVEZXJpdmVkRnJvbS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdChjYXBhYmlsaXR5VHlwZURlcml2ZWRGcm9tLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVDYXBhYmlsaXR5RnJvbUltcG9ydEZpbGUoT2JqZWN0IGNhcGFiaWxpdHlKc29uKSB7CisKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gPSBuZXcgQ2FwYWJpbGl0eURlZmluaXRpb24oKTsKKwkJRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoY2FwYWJpbGl0eURlZmluaXRpb24pOworCisJCXRyeSB7CisJCQlpZiAoY2FwYWJpbGl0eUpzb24gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgY2FwYWJpbGl0eUpzb25TdHJpbmcgPSAoU3RyaW5nKSBjYXBhYmlsaXR5SnNvbjsKKwkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRUeXBlKGNhcGFiaWxpdHlKc29uU3RyaW5nKTsKKwkJCX0gZWxzZSBpZiAoY2FwYWJpbGl0eUpzb24gaW5zdGFuY2VvZiBNYXApIHsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGNhcGFiaWxpdHlKc29uTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGNhcGFiaWxpdHlKc29uOworCQkJCS8vIFR5cGUKKwkJCQlpZiAoY2FwYWJpbGl0eUpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uVFlQRS5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRUeXBlKChTdHJpbmcpIGNhcGFiaWxpdHlKc29uTWFwLmdldChUb3NjYVRhZ05hbWVzRW51bS5UWVBFLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCQl9CisJCQkJLy8gVmFsaWRTb3VyY2VUeXBlcworCQkJCWlmIChjYXBhYmlsaXR5SnNvbk1hcC5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5WQUxJRF9TT1VSQ0VfVFlQRVMuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VmFsaWRTb3VyY2VUeXBlcygoTGlzdDxTdHJpbmc+KSBjYXBhYmlsaXR5SnNvbk1hcC5nZXQoVG9zY2FUYWdOYW1lc0VudW0uVkFMSURfU09VUkNFX1RZUEVTLmdldEVsZW1lbnROYW1lKCkpKTsKKwkJCQl9CisJCQkJLy8gVmFsaWRTb3VyY2VUeXBlcworCQkJCWlmIChjYXBhYmlsaXR5SnNvbk1hcC5jb250YWluc0tleShUb3NjYVRhZ05hbWVzRW51bS5ERVNDUklQVElPTi5nZXRFbGVtZW50TmFtZSgpKSkgeworCQkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbigoU3RyaW5nKSBjYXBhYmlsaXR5SnNvbk1hcC5nZXQoVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSkpOworCQkJCX0KKwkJCQlpZiAoY2FwYWJpbGl0eUpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uT0NDVVJSRU5DRVMuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKwkJCQkJTGlzdDxPYmplY3Q+IG9jY3VycmVuY2VzTGlzdCA9IChMaXN0KSBjYXBhYmlsaXR5SnNvbk1hcC5nZXQoVG9zY2FUYWdOYW1lc0VudW0uT0NDVVJSRU5DRVMuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRTZXRPY2N1cnJlbmNlc1N0YXR1cyA9IHZhbGlkYXRlT2NjdXJyZW5jZXMob2NjdXJyZW5jZXNMaXN0KTsKKwkJCQkJaWYgKHZhbGlkYXRlQW5kU2V0T2NjdXJyZW5jZXNTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVBbmRTZXRPY2N1cnJlbmNlc1N0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCQlpZiAodmFsaWRhdGVBbmRTZXRPY2N1cnJlbmNlc1N0YXR1cy5sZWZ0KCkudmFsdWUoKSA9PSB0cnVlKSB7CisJCQkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRNaW5PY2N1cnJlbmNlcyhvY2N1cnJlbmNlc0xpc3QuZ2V0KDApLnRvU3RyaW5nKCkpOworCQkJCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0TWF4T2NjdXJyZW5jZXMob2NjdXJyZW5jZXNMaXN0LmdldCgxKS50b1N0cmluZygpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoY2FwYWJpbGl0eUpzb25NYXAuY29udGFpbnNLZXkoVG9zY2FUYWdOYW1lc0VudW0uUFJPUEVSVElFUy5nZXRFbGVtZW50TmFtZSgpKSkgeworCisJCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXN1bHRTdGF0dXNFbnVtPiBwcm9wZXJ0aWVzUmVzID0gSW1wb3J0VXRpbHMuZ2V0UHJvcGVydGllcyhjYXBhYmlsaXR5SnNvbk1hcCk7CisJCQkJCWlmIChwcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUFJPUEVSVFlfTk9UX0ZPVU5EKSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJvcGVydGllc1Jlcy5sZWZ0KCkudmFsdWUoKS5lbnRyeVNldCgpLnN0cmVhbSgpLmZvckVhY2goZSAtPiBlLmdldFZhbHVlKCkuc2V0TmFtZShlLmdldEtleSgpLnRvTG93ZXJDYXNlKCkpKTsKKwkJCQkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gY2FwYWJpbGl0eVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzUmVzLmxlZnQoKS52YWx1ZSgpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChwIC0+IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KHAsIHAuZ2V0RGVmYXVsdFZhbHVlKCksIG51bGwpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0UHJvcGVydGllcyhjYXBhYmlsaXR5UHJvcGVydGllcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9ZQU1MKSk7CisKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiSW1wb3J0IFJlc291cmNlIC0gY3JlYXRlIGNhcGFiaWxpdHkiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJJbXBvcnQgUmVzb3VyY2UgLSBjcmVhdGUgY2FwYWJpbGl0eSIpOworCQkJbG9nLmRlYnVnKCJlcnJvciB3aGVuIGNyZWF0aW5nIGNhcGFiaWxpdHksIG1lc3NhZ2U6e30iLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUwpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBSZXNwb25zZUZvcm1hdCBoYW5kbGVJbXBvcnRSZXNvdXJjZUV4ZWNwdGlvbihVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VNZXRhRGF0YSwgVXNlciB1c2VyLCBib29sZWFuIGlzTm9ybWF0aXZlLCBSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJU3RyaW5nIHBheWxvYWROYW1lID0gKHJlc291cmNlTWV0YURhdGEgIT0gbnVsbCkgPyByZXNvdXJjZU1ldGFEYXRhLmdldFBheWxvYWROYW1lKCkgOiAiIjsKKwkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJJbXBvcnQgUmVzb3VyY2UgIiArIHBheWxvYWROYW1lKTsKKwkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIkltcG9ydCBSZXNvdXJjZSAiICsgcGF5bG9hZE5hbWUpOworCisJCWxvZy5kZWJ1ZygiRXJyb3Igd2hlbiBpbXBvcnRpbmcgcmVzb3VyY2UgZnJvbSBwYXlsb2FkOnt9IEV4Y2VwdGlvbiB0ZXh0OiB7fSIsIHBheWxvYWROYW1lLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2VXcmFwcGVyID0gZ2V0UmVzcG9uc2VGb3JtYXRNYW5hZ2VyKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQlhdWRpdEVycm9ySW1wb3J0KHJlc291cmNlTWV0YURhdGEsIHVzZXIsIGVycm9yUmVzcG9uc2VXcmFwcGVyLCBpc05vcm1hdGl2ZSk7CisJCXJldHVybiBlcnJvclJlc3BvbnNlV3JhcHBlcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXVkaXRFcnJvckltcG9ydChVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VNZXRhRGF0YSwgVXNlciB1c2VyLCBSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlV3JhcHBlciwgYm9vbGVhbiBpc05vcm1hdGl2ZSkgeworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBuZXcgRW51bU1hcDw+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UuZ2V0TmFtZSgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgcmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfUFJFVl9WRVJTSU9OLCAiIik7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgdXNlci5nZXRVc2VySWQoKSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfU1RBVEUsICIiKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfSU5WQVJJQU5UX1VVSUQsICIiKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBlcnJvclJlc3BvbnNlV3JhcHBlci5nZXRTdGF0dXMoKSk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisJCWlmIChlcnJvclJlc3BvbnNlV3JhcHBlci5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlID0gZXJyb3JSZXNwb25zZVdyYXBwZXIuZ2V0TWVzc2FnZUlkKCkgKyAiOiAiOworCQl9CisJCW1lc3NhZ2UgKz0gZXJyb3JSZXNwb25zZVdyYXBwZXIuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtZXNzYWdlKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSwgdXNlci5nZXRGaXJzdE5hbWUoKSArICIgIiArIHVzZXIuZ2V0TGFzdE5hbWUoKSk7CisKKwkJU3RyaW5nIHZlcnNpb24sIGxpZmVDeWNsZVN0YXRlOworCQlpZiAoaXNOb3JtYXRpdmUpIHsKKwkJCXZlcnNpb24gPSBDb25zdGFudHMuRklSU1RfQ0VSVElGSUVEX1ZFUlNJT05fVkVSU0lPTjsKKwkJCWxpZmVDeWNsZVN0YXRlID0gTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCk7CisJCX0gZWxzZSB7CisJCQl2ZXJzaW9uID0gIiI7CisJCQlsaWZlQ3ljbGVTdGF0ZSA9IExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULm5hbWUoKTsKKworCQl9CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTiwgdmVyc2lvbik7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUsIGxpZmVDeWNsZVN0YXRlKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVE9TQ0FfTk9ERV9UWVBFLCAiIik7CisKKwkJZ2V0QXVkaXRpbmdNYW5hZ2VyKCkuYXVkaXRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE1ldGFEYXRhRnJvbUpzb24oVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlTWV0YURhdGEsIFJlc291cmNlIHJlc291cmNlKSB7CisJCXJlc291cmNlLnNldFRhZ3MocmVzb3VyY2VNZXRhRGF0YS5nZXRUYWdzKCkpOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcyA9IHJlc291cmNlTWV0YURhdGEuZ2V0Q2F0ZWdvcmllcygpOworCQlyZXNvdXJjZS5zZXRDYXRlZ29yaWVzKGNhdGVnb3JpZXMpOworCQlyZXNvdXJjZS5zZXREZXNjcmlwdGlvbihyZXNvdXJjZU1ldGFEYXRhLmdldERlc2NyaXB0aW9uKCkpOworCQlyZXNvdXJjZS5zZXRJY29uKHJlc291cmNlTWV0YURhdGEuZ2V0UmVzb3VyY2VJY29uUGF0aCgpKTsKKwkJcmVzb3VyY2Uuc2V0TmFtZShyZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisJCWlmIChjYXRlZ29yaWVzICE9IG51bGwgJiYgIWNhdGVnb3JpZXMuaXNFbXB0eSgpKSB7CisJCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWYgPSBjYXRlZ29yaWVzLmdldCgwKTsKKwkJCXJlc291cmNlLnNldEFic3RyYWN0KGZhbHNlKTsKKwkJCWlmIChjYXRlZ29yeURlZiAhPSBudWxsICYmIGNhdGVnb3J5RGVmLmdldE5hbWUoKSAhPSBudWxsICYmIGNhdGVnb3J5RGVmLmdldE5hbWUoKS5lcXVhbHMoQ29uc3RhbnRzLkFCU1RSQUNUX0NBVEVHT1JZX05BTUUpKSB7CisJCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmID0gY2F0ZWdvcnlEZWYuZ2V0U3ViY2F0ZWdvcmllcygpLmdldCgwKTsKKwkJCQlpZiAoc3ViQ2F0ZWdvcnlEZWYgIT0gbnVsbCAmJiBzdWJDYXRlZ29yeURlZi5nZXROYW1lKCkuZXF1YWxzKENvbnN0YW50cy5BQlNUUkFDVF9TVUJDQVRFR09SWSkpIHsKKwkJCQkJcmVzb3VyY2Uuc2V0QWJzdHJhY3QodHJ1ZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJlc291cmNlLnNldENvbnRhY3RJZChyZXNvdXJjZU1ldGFEYXRhLmdldENvbnRhY3RJZCgpKTsKKwkJcmVzb3VyY2Uuc2V0Q3JlYXRvclVzZXJJZChyZXNvdXJjZU1ldGFEYXRhLmdldENvbnRhY3RJZCgpKTsKKworCQlpZiAocmVzb3VyY2VNZXRhRGF0YS5nZXRWZW5kb3JOYW1lKCkgIT0gbnVsbCkgeworCQkJcmVzb3VyY2Uuc2V0VmVuZG9yTmFtZShyZXNvdXJjZU1ldGFEYXRhLmdldFZlbmRvck5hbWUoKSk7CisJCX0KKworCQlpZiAocmVzb3VyY2VNZXRhRGF0YS5nZXRWZW5kb3JSZWxlYXNlKCkgIT0gbnVsbCkgeworCQkJcmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZShyZXNvdXJjZU1ldGFEYXRhLmdldFZlbmRvclJlbGVhc2UoKSk7CisJCX0KKworCQlyZXNvdXJjZS5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS52YWx1ZU9mKHJlc291cmNlTWV0YURhdGEuZ2V0UmVzb3VyY2VUeXBlKCkpKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDb25zdGFudE1ldGFEYXRhKFJlc291cmNlIHJlc291cmNlKSB7CisJCXJlc291cmNlLnNldFZlcnNpb24oSW1wb3J0VXRpbHMuQ29uc3RhbnRzLkZJUlNUX0NFUlRJRklFRF9WRVJTSU9OX1ZFUlNJT04pOworCQk7CisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKEltcG9ydFV0aWxzLkNvbnN0YW50cy5OT1JNQVRJVkVfVFlQRV9MSUZFX0NZQ0xFKTsKKwkJcmVzb3VyY2Uuc2V0SGlnaGVzdFZlcnNpb24oSW1wb3J0VXRpbHMuQ29uc3RhbnRzLk5PUk1BVElWRV9UWVBFX0hJR0hFU1RfVkVSU0lPTik7CisJCXJlc291cmNlLnNldFZlbmRvck5hbWUoSW1wb3J0VXRpbHMuQ29uc3RhbnRzLlZFTkRPUl9OQU1FKTsKKwkJcmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZShJbXBvcnRVdGlscy5Db25zdGFudHMuVkVORE9SX1JFTEVBU0UpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlT2NjdXJyZW5jZXMoTGlzdDxPYmplY3Q+IG9jY3VycmVuc2VzTGlzdCkgeworCisJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlTGlzdE5vdEVtcHR5KG9jY3VycmVuc2VzTGlzdCkpIHsKKwkJCWxvZy5kZWJ1ZygiT2NjdXJyZW5zZXMgbGlzdCBlbXB0eSIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfT0NDVVJSRU5DRVMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAob2NjdXJyZW5zZXNMaXN0LnNpemUoKSA8IDIpIHsKKwkJCWxvZy5kZWJ1ZygiT2NjdXJyZW5zZXMgbGlzdCBzaXplIG5vdCAyIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9PQ0NVUlJFTkNFUyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlPYmplY3QgbWluT2JqID0gb2NjdXJyZW5zZXNMaXN0LmdldCgwKTsKKwkJT2JqZWN0IG1heE9iaiA9IG9jY3VycmVuc2VzTGlzdC5nZXQoMSk7CisJCUludGVnZXIgbWluT2NjdXJyZW5jZXMgPSBudWxsOworCQlJbnRlZ2VyIG1heE9jY3VycmVuY2VzID0gbnVsbDsKKwkJaWYgKG1pbk9iaiBpbnN0YW5jZW9mIEludGVnZXIpCisJCQltaW5PY2N1cnJlbmNlcyA9IChJbnRlZ2VyKSBtaW5PYmo7CisJCWVsc2UgeworCQkJbG9nLmRlYnVnKCJJbnZhbGlkIG9jY3VycmVuc2VzIGZvcm1hdC4gbG93X2JvdW5kIG9jY3VycmVuc2UgbXVzdCBiZSBJbnRlZ2VyIHt9IiwgbWluT2JqKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX09DQ1VSUkVOQ0VTKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCWlmIChtaW5PY2N1cnJlbmNlcyA8IDApIHsKKwkJCWxvZy5kZWJ1ZygiSW52YWxpZCBvY2N1cnJlbnNlcyBmb3JtYXQubG93X2JvdW5kIG9jY3VycmVuc2UgbmVnYXRpdmUge30iLCBtaW5PY2N1cnJlbmNlcyk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9PQ0NVUlJFTkNFUyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWlmIChtYXhPYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCWlmIChtYXhPYmouZXF1YWxzKCJVTkJPVU5ERUQiKSkgeworCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJJbnZhbGlkIG9jY3VycmVuc2VzIGZvcm1hdC4gTWF4IG9jY3VycmVuY2UgaXMge30iLCBtYXhPYmopOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX09DQ1VSUkVOQ0VTKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtYXhPYmogaW5zdGFuY2VvZiBJbnRlZ2VyKQorCQkJCW1heE9jY3VycmVuY2VzID0gKEludGVnZXIpIG1heE9iajsKKwkJCWVsc2UgeworCQkJCWxvZy5kZWJ1ZygiSW52YWxpZCBvY2N1cnJlbnNlcyBmb3JtYXQuICBNYXggb2NjdXJyZW5jZSBpcyB7fSIsIG1heE9iaik7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfT0NDVVJSRU5DRVMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlpZiAobWF4T2NjdXJyZW5jZXMgPD0gMCB8fCBtYXhPY2N1cnJlbmNlcyA8IG1pbk9jY3VycmVuY2VzKSB7CisJCQkJbG9nLmRlYnVnKCJJbnZhbGlkIG9jY3VycmVuc2VzIGZvcm1hdC4gIG1pbiBvY2N1cnJlbmNlIGlzIHt9LiBNYXggb2NjdXJyZW5jZSBpcyB7fSIsIG1pbk9jY3VycmVuY2VzLCBtYXhPY2N1cnJlbmNlcyk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfT0NDVVJSRU5DRVMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCisJfQorCisJcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCkgeworCQlpZiAodGhpcy5zZXJ2bGV0Q29udGV4dCA9PSBudWxsKSB7CisJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCQlpZiAodGhpcy5zZXJ2bGV0Q29udGV4dCA9PSBudWxsKSB7CisJCQkJCXRoaXMuc2VydmxldENvbnRleHQgPSBzZXJ2bGV0Q29udGV4dDsKKwkJCQkJcmVzcG9uc2VGb3JtYXRNYW5hZ2VyID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisJCQkJCXJlc291cmNlQnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoc2VydmxldENvbnRleHQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VFeGlzdChTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXJldHVybiByZXNvdXJjZUJ1c2luZXNzTG9naWMuaXNSZXNvdXJjZUV4aXN0KHJlc291cmNlTmFtZSk7CisJfQorCisJcHJpdmF0ZSBSZXNvdXJjZUJ1c2luZXNzTG9naWMgZ2V0UmVzb3VyY2VCTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCVJlc291cmNlQnVzaW5lc3NMb2dpYyByZXNvdXJjZUJsID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oUmVzb3VyY2VCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwkJcmV0dXJuIHJlc291cmNlQmw7CisJfQorCisJcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworCQlyZXR1cm4gc2VydmxldENvbnRleHQ7CisJfQorCisJcHVibGljIElBdWRpdGluZ01hbmFnZXIgZ2V0QXVkaXRpbmdNYW5hZ2VyKCkgeworCQlyZXR1cm4gYXVkaXRpbmdNYW5hZ2VyOworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdE1hbmFnZXIgZ2V0UmVzcG9uc2VGb3JtYXRNYW5hZ2VyKCkgeworCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXRNYW5hZ2VyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlRm9ybWF0TWFuYWdlcihSZXNwb25zZUZvcm1hdE1hbmFnZXIgcmVzcG9uc2VGb3JtYXRNYW5hZ2VyKSB7CisJCXRoaXMucmVzcG9uc2VGb3JtYXRNYW5hZ2VyID0gcmVzcG9uc2VGb3JtYXRNYW5hZ2VyOworCX0KKworCXB1YmxpYyBSZXNvdXJjZUJ1c2luZXNzTG9naWMgZ2V0UmVzb3VyY2VCdXNpbmVzc0xvZ2ljKCkgeworCQlyZXR1cm4gcmVzb3VyY2VCdXNpbmVzc0xvZ2ljOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVzaW5lc3NMb2dpYyhSZXNvdXJjZUJ1c2luZXNzTG9naWMgcmVzb3VyY2VCdXNpbmVzc0xvZ2ljKSB7CisJCXRoaXMucmVzb3VyY2VCdXNpbmVzc0xvZ2ljID0gcmVzb3VyY2VCdXNpbmVzc0xvZ2ljOworCX0KKworCXB1YmxpYyBMb2dnZXIgZ2V0TG9nKCkgeworCQlyZXR1cm4gbG9nOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2coTG9nZ2VyIGxvZykgeworCQlSZXNvdXJjZUltcG9ydE1hbmFnZXIubG9nID0gbG9nOworCX0KKworCXB1YmxpYyBJR3JhcGhMb2NrT3BlcmF0aW9uIGdldEdyYXBoTG9ja09wZXJhdGlvbigpIHsKKwkJcmV0dXJuIGdyYXBoTG9ja09wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcmFwaExvY2tPcGVyYXRpb24oSUdyYXBoTG9ja09wZXJhdGlvbiBncmFwaExvY2tPcGVyYXRpb24pIHsKKwkJdGhpcy5ncmFwaExvY2tPcGVyYXRpb24gPSBncmFwaExvY2tPcGVyYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmxldENvbnRleHQoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHsKKwkJdGhpcy5zZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXRDb250ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIHNldEF1ZGl0aW5nTWFuYWdlcihJQXVkaXRpbmdNYW5hZ2VyIGF1ZGl0aW5nTWFuYWdlcikgeworCQl0aGlzLmF1ZGl0aW5nTWFuYWdlciA9IGF1ZGl0aW5nTWFuYWdlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU9wZXJhdGlvbihSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbikgeworCQl0aGlzLnJlc291cmNlT3BlcmF0aW9uID0gcmVzb3VyY2VPcGVyYXRpb247CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1Jlc3BvbnNlRm9ybWF0TWFuYWdlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9SZXNwb25zZUZvcm1hdE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGMwYmYzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9SZXNwb25zZUZvcm1hdE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5FcnJvckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkVycm9ySW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRXJyb3JJbmZvLkVycm9ySW5mb1R5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uT2tSZXNwb25zZUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlBvbGljeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFJlc3BvbnNlRm9ybWF0TWFuYWdlciB7CisKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBSZXNwb25zZUZvcm1hdE1hbmFnZXIgaW5zdGFuY2U7CisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXI7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc3BvbnNlRm9ybWF0TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIHN0YXRpYyBSZXNwb25zZUZvcm1hdE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7CisJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisKKwkJCWluc3RhbmNlID0gaW5pdCgpOworCQl9CisJCXJldHVybiBpbnN0YW5jZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgUmVzcG9uc2VGb3JtYXRNYW5hZ2VyIGluaXQoKSB7CisJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisJCQlpbnN0YW5jZSA9IG5ldyBSZXNwb25zZUZvcm1hdE1hbmFnZXIoKTsKKwkJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJcHVibGljIFJlc3BvbnNlRm9ybWF0IGdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cyByZXNwb25zZUVudW0sIFN0cmluZy4uLiB2YXJpYWJsZXMpIHsKKwkJRXJyb3JDb25maWd1cmF0aW9uIGVycm9yQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldEVycm9yQ29uZmlndXJhdGlvbigpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gZXJyb3JDb25maWd1cmF0aW9uLmdldEVycm9ySW5mbyhyZXNwb25zZUVudW0ubmFtZSgpKTsKKwkJaWYgKGVycm9ySW5mbyA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuRWNvbXBFcnJvck5vdEZvdW5kLCAiUmVzcG9uc2VGb3JtYXRNYW5hZ2VyIiwgcmVzcG9uc2VFbnVtLm5hbWUoKSk7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBsb2NhdGUge30gaW4gZXJyb3IgY29uZmlndXJhdGlvbiIsIHJlc3BvbnNlRW51bS5uYW1lKCkpOworCQkJZXJyb3JJbmZvID0gZXJyb3JDb25maWd1cmF0aW9uLmdldEVycm9ySW5mbyhBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUi5uYW1lKCkpOworCQl9CisJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2VXcmFwcGVyID0gbmV3IFJlc3BvbnNlRm9ybWF0KGVycm9ySW5mby5nZXRDb2RlKCkpOworCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gZXJyb3JJbmZvLmdldE1lc3NhZ2UoKTsKKwkJU3RyaW5nIGVycm9yTWVzc2FnZUlkID0gZXJyb3JJbmZvLmdldE1lc3NhZ2VJZCgpOworCQlFcnJvckluZm9UeXBlIGVycm9ySW5mb1R5cGUgPSBlcnJvckluZm8uZ2V0RXJyb3JJbmZvVHlwZSgpOworCQlpZiAoZXJyb3JJbmZvVHlwZS5lcXVhbHMoRXJyb3JJbmZvVHlwZS5TRVJWSUNFX0VYQ0VQVElPTikpIHsKKwkJCWVycm9yUmVzcG9uc2VXcmFwcGVyLnNldFNlcnZpY2VFeGNlcHRpb24obmV3IFNlcnZpY2VFeGNlcHRpb24oZXJyb3JNZXNzYWdlSWQsIGVycm9yTWVzc2FnZSwgdmFyaWFibGVzKSk7CisJCX0gZWxzZSBpZiAoZXJyb3JJbmZvVHlwZS5lcXVhbHMoRXJyb3JJbmZvVHlwZS5QT0xJQ1lfRVhDRVBUSU9OKSkgeworCQkJZXJyb3JSZXNwb25zZVdyYXBwZXIuc2V0UG9saWN5RXhjZXB0aW9uKG5ldyBQb2xpY3lFeGNlcHRpb24oZXJyb3JNZXNzYWdlSWQsIGVycm9yTWVzc2FnZSwgdmFyaWFibGVzKSk7CisJCX0gZWxzZSBpZiAoZXJyb3JJbmZvVHlwZS5lcXVhbHMoRXJyb3JJbmZvVHlwZS5PSykpIHsKKwkJCWVycm9yUmVzcG9uc2VXcmFwcGVyLnNldE9rUmVzcG9uc2VJbmZvKG5ldyBPa1Jlc3BvbnNlSW5mbyhlcnJvck1lc3NhZ2VJZCwgZXJyb3JNZXNzYWdlLCB2YXJpYWJsZXMpKTsKKwkJfQorCQlyZXR1cm4gZXJyb3JSZXNwb25zZVdyYXBwZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9TZXJ2aWNlQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9TZXJ2aWNlQnVzaW5lc3NMb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmU4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1NlcnZpY2VCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSwxNzY4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuTWFwVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLklEaXN0cmlidXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLklOb3RpZmljYXRpb25EYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5WZk1vZHVsZUFydGlmYWN0UGF5bG9hZDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZS5MaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5BdWRpdENhc3NhbmRyYURhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuT3JpZ2luVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRpc3RyaWJ1dGlvblN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklDYWNoZU1hbmdlck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JU2VydmljZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Db21wb25lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlNlcnZpY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLnV0aWxzLkNvbXBvbmVudFZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdHZW5lcmljRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuRGlzdHJpYnV0aW9uRGVwbG95RXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuUmVzb3VyY2VBZG1pbkV2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmtwaS5hcGkuQVNEQ0twaUFwaTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5UaHJlYWRMb2NhbHNIb2xkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgic2VydmljZUJ1c2luZXNzTG9naWMiKQorcHVibGljIGNsYXNzIFNlcnZpY2VCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQ29tcG9uZW50QnVzaW5lc3NMb2dpYyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX1NVQ0NFU1NfMjAwID0gIjIwMCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX0RFUExPWUVEID0gIkRFUExPWUVEIjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnREYW87CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJRGlzdHJpYnV0aW9uRW5naW5lIGRpc3RyaWJ1dGlvbkVuZ2luZTsKKworCS8vIEBBdXRvd2lyZWQKKwkvLyBwcml2YXRlIEF1ZGl0aW5nRGFvIGF1ZGl0aW5nRGFvOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQXVkaXRDYXNzYW5kcmFEYW8gYXVkaXRDYXNzYW5kcmFEYW87CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBTZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIHNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWM7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJQ2FjaGVNYW5nZXJPcGVyYXRpb24gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlcnZpY2VCdXNpbmVzc0xvZ2ljLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfVkVSU0lPTiA9ICIwLjEiOworCisJcHVibGljIFNlcnZpY2VCdXNpbmVzc0xvZ2ljKCkgeworCQlsb2cuZGVidWcoIlNlcnZpY2VCdXNpbmVzc0xvZ2ljIHN0YXJ0ZWQiKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTZXJ2aWNlRGlzdHJpYnV0aW9uU3RhdGUoU3RyaW5nIHNlcnZpY2VJZCwgU3RyaW5nIHN0YXRlLCBMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbiBjb21tZW50T2JqLCBVc2VyIHVzZXIpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlci5nZXRVc2VySWQoKSwgImNoYW5nZSBTZXJ2aWNlIERpc3RyaWJ1dGlvbiBTdGF0ZSIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWxvZy5kZWJ1ZygiY2hlY2sgcmVxdWVzdCBzdGF0ZSIpOworCQlFaXRoZXI8RGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW0sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUVudW0gPSB2YWxpZGF0ZVRyYW5zaXRpb25FbnVtKHN0YXRlLCB1c2VyKTsKKwkJaWYgKHZhbGlkYXRlRW51bS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVFbnVtLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJRGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW0gZGlzdHJpYnV0aW9uVHJhbnNpdGlvbiA9IHZhbGlkYXRlRW51bS5sZWZ0KCkudmFsdWUoKTsKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0QWN0aW9uID0gKGRpc3RyaWJ1dGlvblRyYW5zaXRpb24gPT0gRGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW0uQVBQUk9WRSA/IEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fU1RBVEVfQ0hBTkdFX0FQUFJPViA6IEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fU1RBVEVfQ0hBTkdFX1JFSkVDVCk7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiBjb21tZW50UmVzcG9uc2UgPSB2YWxpZGF0ZUNvbW1lbnQoY29tbWVudE9iaiwgdXNlciwgYXVkaXRBY3Rpb24pOworCQlpZiAoY29tbWVudFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21tZW50UmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlTdHJpbmcgY29tbWVudCA9IGNvbW1lbnRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU2VydmljZSA9IHZhbGlkYXRlU2VydmljZURpc3RyaWJ1dGlvbkNoYW5nZSh1c2VyLCBzZXJ2aWNlSWQsIGF1ZGl0QWN0aW9uLCBjb21tZW50KTsKKwkJaWYgKHZhbGlkYXRlU2VydmljZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVTZXJ2aWNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJU2VydmljZSBzZXJ2aWNlID0gdmFsaWRhdGVTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpOworCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtIGluaXRTdGF0ZSA9IHNlcnZpY2UuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCk7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVVzZXIgPSB2YWxpZGF0ZVVzZXJEaXN0cmlidXRpb25DaGFuZ2UodXNlciwgc2VydmljZSwgYXVkaXRBY3Rpb24sIGNvbW1lbnQpOworCQlpZiAodmFsaWRhdGVVc2VyLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVVzZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl1c2VyID0gdmFsaWRhdGVVc2VyLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGxvY2sgcmVzb3VyY2UKKwkJLyoKKwkJICogU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrUmVzdWx0ID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSk7IGlmICghbG9ja1Jlc3VsdC5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsgQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLgorCQkgKiBCZUZhaWxlZExvY2tPYmplY3RFcnJvciwgIkNoYW5nZVNlcnZpY2VEaXN0cmlidXRpb25TdGF0ZSIpOyBsb2cuZGVidWcoIkZhaWxlZCB0byBsb2NrIHNlcnZpY2Uge30gZXJyb3IgLSB7fSIsIHNlcnZpY2VJZCwgbG9ja1Jlc3VsdCk7IFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SLAorCQkgKiBzZXJ2aWNlLmdldFZlcnNpb24oKSwgc2VydmljZS5nZXRTZXJ2aWNlTmFtZSgpKTsKKwkJICogCisJCSAqIGNyZWF0ZUF1ZGl0KHVzZXIsIGF1ZGl0QWN0aW9uLCBjb21tZW50LCBzZXJ2aWNlLCByZXNwb25zZUZvcm1hdCk7IHJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy4gR0VORVJBTF9FUlJPUikpOyB9CisJCSAqLworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tSZXN1bHQgPSBsb2NrQ29tcG9uZW50KHNlcnZpY2VJZCwgc2VydmljZSwgIkNoYW5nZVNlcnZpY2VEaXN0cmlidXRpb25TdGF0ZSIpOworCQlpZiAobG9ja1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbG9ja1Jlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQljcmVhdGVBdWRpdCh1c2VyLCBhdWRpdEFjdGlvbiwgY29tbWVudCwgc2VydmljZSwgcmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQl0cnkgeworCisJCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtIG5ld1N0YXRlOworCQkJaWYgKGRpc3RyaWJ1dGlvblRyYW5zaXRpb24gPT0gRGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW0uQVBQUk9WRSkgeworCQkJCW5ld1N0YXRlID0gRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fQVBQUk9WRUQ7CisJCQl9IGVsc2UgeworCQkJCW5ld1N0YXRlID0gRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQ7CisJCQl9CisJCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gc2VydmljZU9wZXJhdGlvbi51cGRhdGVEZXN0cmlidXRpb25TdGF0dXMoc2VydmljZSwgdXNlciwgbmV3U3RhdGUpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIkNoYW5nZVNlcnZpY2VEaXN0cmlidXRpb25TdGF0ZSIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJDaGFuZ2VTZXJ2aWNlRGlzdHJpYnV0aW9uU3RhdGUiKTsKKwkJCQlsb2cuZGVidWcoInNlcnZpY2Uge30gaXMgIGNoYW5nZSBkZXN0cmlidWF0aW9uIHN0YXR1cyBmYWlsZWQiLCBzZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SLCBzZXJ2aWNlLmdldFZlcnNpb24oKSwgc2VydmljZS5nZXROYW1lKCkpOworCQkJCWNyZWF0ZUF1ZGl0KHVzZXIsIGF1ZGl0QWN0aW9uLCBjb21tZW50LCBzZXJ2aWNlLCByZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCX0KKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCVNlcnZpY2UgdXBkYXRlZFNlcnZpY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RDVVJSX1NUQVRVUywgdXBkYXRlZFNlcnZpY2UuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCkubmFtZSgpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RQUkVWX1NUQVRVUywgaW5pdFN0YXRlLm5hbWUoKSk7CisJCQljcmVhdGVBdWRpdCh1c2VyLCBhdWRpdEFjdGlvbiwgY29tbWVudCwgdXBkYXRlZFNlcnZpY2UsIHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0ZpZWxkcyk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQl9IGZpbmFsbHkgeworCQkJZ3JhcGhMb2NrT3BlcmF0aW9uLnVubG9ja0NvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+LCBSZXNwb25zZUZvcm1hdD4gZ2V0Q29tcG9uZW50QXVkaXRSZWNvcmRzKFN0cmluZyBjb21wb25lbnRWZXJzaW9uLCBTdHJpbmcgY29tcG9uZW50VVVJRCwgU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZ2V0IENvbXBvbmVudCBBdWRpdCBSZWNvcmRzIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUVpdGhlcjxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+LCBBY3Rpb25TdGF0dXM+IHJlc3VsdDsKKwkJdHJ5IHsKKworCQkJLy8gQ2VydGlmaWVkIFZlcnNpb24KKwkJCWlmIChjb21wb25lbnRWZXJzaW9uLmVuZHNXaXRoKCIuMCIpKSB7CisJCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiwgQWN0aW9uU3RhdHVzPiBlaXRoZXJBdWRpdGluZ0ZvckNlcnRpZmllZCA9IGF1ZGl0Q2Fzc2FuZHJhRGFvLmdldEJ5U2VydmljZUluc3RhbmNlSWQoY29tcG9uZW50VVVJRCk7CisJCQkJaWYgKGVpdGhlckF1ZGl0aW5nRm9yQ2VydGlmaWVkLmlzTGVmdCgpKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGdldEF1ZGl0aW5nRmllbGRzTGlzdChlaXRoZXJBdWRpdGluZ0ZvckNlcnRpZmllZC5sZWZ0KCkudmFsdWUoKSkpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChlaXRoZXJBdWRpdGluZ0ZvckNlcnRpZmllZC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJCS8vIFVuY2VydGlmaWVkIFZlcnNpb24KKwkJCWVsc2UgeworCQkJCXJlc3VsdCA9IGdldEF1ZGl0UmVjb3Jkc0ZvclVuY2VydGlmaWVkQ29tcG9uZW50KGNvbXBvbmVudFVVSUQsIGNvbXBvbmVudFZlcnNpb24pOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJnZXQgQXVkaXQgUmVjb3JkcyBmYWlsZWQgd2l0aCBleGNlcHRpb24ge30iLCBlKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4sIEFjdGlvblN0YXR1cz4gZ2V0QXVkaXRSZWNvcmRzRm9yVW5jZXJ0aWZpZWRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudFVVSUQsIFN0cmluZyBjb21wb25lbnRWZXJzaW9uKSB7CisJCS8vIEZpcnN0IFF1ZXJ5CisJCUVpdGhlcjxMaXN0PFJlc291cmNlQWRtaW5FdmVudD4sIEFjdGlvblN0YXR1cz4gZWl0aGVycHJldlZlckF1ZGl0ID0gYXVkaXRDYXNzYW5kcmFEYW8uZ2V0QXVkaXRCeVNlcnZpY2VJZEFuZFByZXZWZXJzaW9uKGNvbXBvbmVudFVVSUQsIGNvbXBvbmVudFZlcnNpb24pOworCisJCWlmIChlaXRoZXJwcmV2VmVyQXVkaXQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlcnByZXZWZXJBdWRpdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJLy8gU2Vjb25kIFF1ZXJ5CisJCUVpdGhlcjxMaXN0PFJlc291cmNlQWRtaW5FdmVudD4sIEFjdGlvblN0YXR1cz4gZWl0aGVyQ3VyclZlckF1ZGl0ID0gYXVkaXRDYXNzYW5kcmFEYW8uZ2V0QXVkaXRCeVNlcnZpY2VJZEFuZEN1cnJWZXJzaW9uKGNvbXBvbmVudFVVSUQsIGNvbXBvbmVudFZlcnNpb24pOworCQlpZiAoZWl0aGVyQ3VyclZlckF1ZGl0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDdXJyVmVyQXVkaXQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gcHJldlZlckF1ZGl0TGlzdCA9IGdldEF1ZGl0aW5nRmllbGRzTGlzdChlaXRoZXJwcmV2VmVyQXVkaXQubGVmdCgpLnZhbHVlKCkpOworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGN1cnJWZXJBdWRpdExpc3QgPSBnZXRBdWRpdGluZ0ZpZWxkc0xpc3QoZWl0aGVyQ3VyclZlckF1ZGl0LmxlZnQoKS52YWx1ZSgpKTsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGR1cGxpY2F0ZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PigpOworCQlkdXBsaWNhdGVFbGVtZW50cy5hZGRBbGwocHJldlZlckF1ZGl0TGlzdCk7CisJCWR1cGxpY2F0ZUVsZW1lbnRzLnJldGFpbkFsbChjdXJyVmVyQXVkaXRMaXN0KTsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGpvaW5lZE5vbkR1cGxpY2F0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PigpOworCQlqb2luZWROb25EdXBsaWNhdGVkTGlzdC5hZGRBbGwocHJldlZlckF1ZGl0TGlzdCk7CisJCWpvaW5lZE5vbkR1cGxpY2F0ZWRMaXN0LnJlbW92ZUFsbChkdXBsaWNhdGVFbGVtZW50cyk7CisJCWpvaW5lZE5vbkR1cGxpY2F0ZWRMaXN0LmFkZEFsbChjdXJyVmVyQXVkaXRMaXN0KTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoam9pbmVkTm9uRHVwbGljYXRlZExpc3QpOworCX0KKworCXByaXZhdGUgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRBdWRpdGluZ0ZpZWxkc0xpc3QoTGlzdDw/IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQ+IHByZXZWZXJBdWRpdExpc3QpIHsKKworCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHByZXZWZXJBdWRpdCA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKwkJZm9yIChBdWRpdGluZ0dlbmVyaWNFdmVudCBhdWRpdEV2ZW50IDogcHJldlZlckF1ZGl0TGlzdCkgeworCQkJYXVkaXRFdmVudC5maWxsRmllbGRzKCk7CisJCQlwcmV2VmVyQXVkaXQuYWRkKGF1ZGl0RXZlbnQuZ2V0RmllbGRzKCkpOworCQl9CisJCXJldHVybiBwcmV2VmVyQXVkaXQ7CisJfQorCisJLyoqCisJICogY3JlYXRlU2VydmljZQorCSAqIAorCSAqIEBwYXJhbSBzZXJ2aWNlCisJICogICAgICAgICAgICAtIFNlcnZpY2UKKwkgKiBAcGFyYW0gdXNlcgorCSAqICAgICAgICAgICAgLSBtb2RpZmllciBkYXRhICh1c2VySWQpCisJICogQHJldHVybiBFaXRoZXI8U2VydmljZSwgcmVzcG9uc2VGb3JtYXQ+CisJICovCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlU2VydmljZShTZXJ2aWNlIHNlcnZpY2UsIFVzZXIgdXNlcikgeworCisJCS8vIGdldCB1c2VyIGRldGFpbHMKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDcmVhdG9yID0gdmFsaWRhdGVVc2VyKHVzZXIsICJDcmVhdGUgU2VydmljZSIsIHNlcnZpY2UsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIGZhbHNlKTsKKwkJaWYgKGVpdGhlckNyZWF0b3IuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl1c2VyID0gZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyB2YWxpZGF0ZSB1c2VyIHJvbGUKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlVXNlclJvbGUodXNlciwgc2VydmljZSwgbmV3IEFycmF5TGlzdDxSb2xlPigpLCBBdWRpdGluZ0FjdGlvbkVudW0uQ1JFQVRFX1JFU09VUkNFLCBudWxsKTsKKwkJaWYgKHZhbGlkYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXNlcnZpY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKworCQkvLyB3YXJuIG9uIG92ZXJyaWRkZW4gZmllbGRzCisJCWNoZWNrRmllbGRzRm9yT3ZlcmlkZUF0dGFtcHQoc2VydmljZSk7CisJCS8vIGVucmljaCBvYmplY3QKKwkJbG9nLmRlYnVnKCJlbnJpY2ggc2VydmljZSB3aXRoIHZlcnNpb24gYW5kIHN0YXRlIik7CisJCXNlcnZpY2Uuc2V0U3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlzZXJ2aWNlLnNldFZlcnNpb24oSU5JVElBTF9WRVJTSU9OKTsKKwkJc2VydmljZS5zZXREaXN0cmlidXRpb25TdGF0dXMoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVNlcnZpY2VSZXNwb25zZSA9IHZhbGlkYXRlU2VydmljZUJlZm9yZUNyZWF0ZShzZXJ2aWNlLCB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0uQ1JFQVRFX1JFU09VUkNFKTsKKwkJaWYgKGNyZWF0ZVNlcnZpY2VSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBjcmVhdGVTZXJ2aWNlUmVzcG9uc2U7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VCeURhbyhzZXJ2aWNlLCBBdWRpdGluZ0FjdGlvbkVudW0uQ1JFQVRFX1JFU09VUkNFLCBzZXJ2aWNlT3BlcmF0aW9uLCB1c2VyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tGaWVsZHNGb3JPdmVyaWRlQXR0YW1wdChTZXJ2aWNlIHNlcnZpY2UpIHsKKwkJY2hlY2tDb21wb25lbnRGaWVsZHNGb3JPdmVycmlkZUF0dGVtcHQoc2VydmljZSk7CisJCWlmICgoc2VydmljZS5nZXREaXN0cmlidXRpb25TdGF0dXMoKSAhPSBudWxsKSkgeworCQkJbG9nLmluZm8oIkRpc3RyaWJ1dGlvbiBTdGF0dXMgY2Fubm90IGJlIGRlZmluZWQgYnkgdXNlci4gVGhpcyBmaWVsZCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcGxpY2F0aW9uIik7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlU2VydmljZUJ5RGFvKFNlcnZpY2Ugc2VydmljZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIElTZXJ2aWNlT3BlcmF0aW9uIGRhdGFNb2RlbCwgVXNlciB1c2VyKSB7CisJCWxvZy5kZWJ1Zygic2VuZCBzZXJ2aWNlIHt9IHRvIGRhbyBmb3IgY3JlYXRlIiwgc2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGxvY2tSZXN1bHQgPSBsb2NrQ29tcG9uZW50QnlOYW1lKHNlcnZpY2UuZ2V0U3lzdGVtTmFtZSgpLCBzZXJ2aWNlLCAiQ3JlYXRlIFNlcnZpY2UiKTsKKwkJaWYgKGxvY2tSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGxvY2tSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHNlcnZpY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWxvZy5kZWJ1ZygiU3lzdGVtIG5hbWUgbG9ja2VkIGlzIHt9LCBzdGF0dXMgPSB7fSIsIHNlcnZpY2UuZ2V0U3lzdGVtTmFtZSgpLCBsb2NrUmVzdWx0KTsKKworCQl0cnkgeworCisJCQljcmVhdGVNYW5kYXRvcnlBcnRpZmFjdHNEYXRhKHNlcnZpY2UsIHVzZXIpOworCQkJY3JlYXRlU2VydmljZUFwaUFydGlmYWN0c0RhdGEoc2VydmljZSwgdXNlcik7CisJCQlzZXRUb3NjYUFydGlmYWN0c1BsYWNlSG9sZGVycyhzZXJ2aWNlLCB1c2VyKTsKKworCQkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRhdGFNb2RlbFJlc3BvbnNlID0gZGF0YU1vZGVsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZSk7CisKKwkJCS8vIHNlcnZpY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkhISEKKwkJCWlmIChkYXRhTW9kZWxSZXNwb25zZS5pc0xlZnQoKSkgeworCQkJCWxvZy5kZWJ1ZygiU2VydmljZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEhISIpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgc2VydmljZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJCQlBU0RDS3BpQXBpLmNvdW50Q3JlYXRlZFNlcnZpY2VzS1BJKCk7CisKKwkJCQlTZXJ2aWNlIGNyZWF0ZWRTZXJ2aWNlID0gZGF0YU1vZGVsUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCQkJLy8gLy9hZGQgc2VydmljZSB0byBjYWNoZQorCQkJCS8vIGNhY2hlTWFuYWdlck9wZXJhdGlvbi51cGRhdGVDb21wb25lbnRJbkNhY2hlKGNyZWF0ZWRTZXJ2aWNlLmdldFVuaXF1ZUlkKCksCisJCQkJLy8gY3JlYXRlZFNlcnZpY2UuZ2V0TGFzdFVwZGF0ZURhdGUoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGRhdGFNb2RlbFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUNvbXBvbmVudChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZGF0YU1vZGVsUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKSwgc2VydmljZSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCQlsb2cuZGVidWcoImF1ZGl0IGJlZm9yZSBzZW5kaW5nIHJlc3BvbnNlIik7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgc2VydmljZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCisJCX0gZmluYWxseSB7CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50QnlOYW1lKHNlcnZpY2UuZ2V0U3lzdGVtTmFtZSgpLCBzZXJ2aWNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVTZXJ2aWNlQXBpQXJ0aWZhY3RzRGF0YShTZXJ2aWNlIHNlcnZpY2UsIFVzZXIgdXNlcikgeworCQkvLyBjcmVhdGUgbWFuZGF0b3J5IGFydGlmYWN0cworCisJCS8vIFRPRE8gaXQgbXVzdCBiZSByZW1vdmVkIGFmdGVyIHRoYXQgYXJ0aWZhY3QgdW5pcXVlSWQgY3JlYXRpb24gd2lsbCBiZQorCQkvLyBtb3ZlZCB0byBBcnRpZmFjdE9wZXJhdGlvbgorCQkvLyBTdHJpbmcgc2VydmljZVVuaXF1ZUlkID0KKwkJLy8gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkU2VydmljZVVuaXF1ZUlkKHNlcnZpY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwKKwkJLy8gc2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKTsKKwkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZCA9IHNlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdE1hcCA9IHNlcnZpY2UuZ2V0QXJ0aWZhY3RzKCk7CisJCWlmIChhcnRpZmFjdE1hcCA9PSBudWxsKQorCQkJYXJ0aWZhY3RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHNlcnZpY2VBcGlBcnRpZmFjdHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlQXBpQXJ0aWZhY3RzKCk7CisJCUxpc3Q8U3RyaW5nPiBleGx1ZGVTZXJ2aWNlQ2F0ZWdvcnkgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGNsdWRlU2VydmljZUNhdGVnb3J5KCk7CisKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBzZXJ2aWNlLmdldENhdGVnb3JpZXMoKTsKKwkJYm9vbGVhbiBpc0NyZWF0ZUFydGlmYWN0ID0gdHJ1ZTsKKwkJaWYgKGNhdGVnb3JpZXMgIT0gbnVsbCAmJiBleGx1ZGVTZXJ2aWNlQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhZXhsdWRlU2VydmljZUNhdGVnb3J5LmlzRW1wdHkoKSkgeworCQkJZm9yIChTdHJpbmcgZXhsdWRlIDogZXhsdWRlU2VydmljZUNhdGVnb3J5KSB7CisJCQkJaWYgKGV4bHVkZS5lcXVhbHNJZ25vcmVDYXNlKGNhdGVnb3JpZXMuZ2V0KDApLmdldE5hbWUoKSkpIHsKKwkJCQkJaXNDcmVhdGVBcnRpZmFjdCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCWlmIChzZXJ2aWNlQXBpQXJ0aWZhY3RzICE9IG51bGwgJiYgaXNDcmVhdGVBcnRpZmFjdCkgeworCQkJU2V0PFN0cmluZz4ga2V5cyA9IHNlcnZpY2VBcGlBcnRpZmFjdHMua2V5U2V0KCk7CisJCQlmb3IgKFN0cmluZyBzZXJ2aWNlQXBpQXJ0aWZhY3ROYW1lIDoga2V5cykgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJ0aWZhY3RJbmZvTWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHNlcnZpY2VBcGlBcnRpZmFjdHMuZ2V0KHNlcnZpY2VBcGlBcnRpZmFjdE5hbWUpOworCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBjcmVhdGVBcnRpZmFjdERlZmluaXRpb24oc2VydmljZVVuaXF1ZUlkLCBzZXJ2aWNlQXBpQXJ0aWZhY3ROYW1lLCBhcnRpZmFjdEluZm9NYXAsIHVzZXIsIHRydWUpOworCQkJCWFydGlmYWN0RGVmaW5pdGlvbi5zZXRBcnRpZmFjdEdyb3VwVHlwZShBcnRpZmFjdEdyb3VwVHlwZUVudW0uU0VSVklDRV9BUEkpOworCQkJCWFydGlmYWN0TWFwLnB1dChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RMYWJlbCgpLCBhcnRpZmFjdERlZmluaXRpb24pOworCQkJfQorCisJCQlzZXJ2aWNlLnNldEFydGlmYWN0cyhhcnRpZmFjdE1hcCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVTZXJ2aWNlQmVmb3JlQ3JlYXRlKFNlcnZpY2Ugc2VydmljZSwgVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSkgeworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGlvblJlc3BvbnNlID0gdmFsaWRhdGVTZXJ2aWNlRmllbGRzQmVmb3JlQ3JlYXRlKHVzZXIsIHNlcnZpY2UsIGFjdGlvbkVudW0pOworCQlpZiAodmFsaWRhdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlzZXJ2aWNlLnNldENyZWF0b3JGdWxsTmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJc2VydmljZS5zZXRDb250YWN0SWQoc2VydmljZS5nZXRDb250YWN0SWQoKS50b0xvd2VyQ2FzZSgpKTsKKworCQkvLyBHZW5lcmF0ZSBpbnZhcmlhbnQgVVVJRCAtIG11c3QgYmUgaGVyZSBhbmQgbm90IGluIG9wZXJhdGlvbiBzaW5jZSBpdAorCQkvLyBzaG91bGQgc3RheSBjb25zdGFudCBkdXJpbmcgY2xvbmUKKwkJU3RyaW5nIGludmFyaWFudFVVSUQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRJbnZhcmlhbnRVVUlEKCk7CisJCXNlcnZpY2Uuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoc2VydmljZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU2VydmljZUZpZWxkc0JlZm9yZUNyZWF0ZShVc2VyIHVzZXIsIFNlcnZpY2Ugc2VydmljZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjb21wb25lbnRzRmllbGRzVmFsaWRhdGlvbiA9IHZhbGlkYXRlQ29tcG9uZW50RmllbGRzQmVmb3JlQ3JlYXRlKHVzZXIsIHNlcnZpY2UsIGFjdGlvbkVudW0pOworCQlpZiAoY29tcG9uZW50c0ZpZWxkc1ZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gY29tcG9uZW50c0ZpZWxkc1ZhbGlkYXRpb247CisJCX0KKworCQkvLyB2YWxpZGF0ZSBzZXJ2aWNlIG5hbWUgdW5pcXVlbmVzcworCQlsb2cuZGVidWcoInZhbGlkYXRlIHNlcnZpY2UgbmFtZSB1bmlxdWVuZXNzIik7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gc2VydmljZU5hbWVVbmlxdWVuZXNzVmFsaWRhdGlvbiA9IHZhbGlkYXRlQ29tcG9uZW50TmFtZVVuaXF1ZSh1c2VyLCBzZXJ2aWNlLCBhY3Rpb25FbnVtKTsKKwkJaWYgKHNlcnZpY2VOYW1lVW5pcXVlbmVzc1ZhbGlkYXRpb24uaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gc2VydmljZU5hbWVVbmlxdWVuZXNzVmFsaWRhdGlvbjsKKwkJfQorCisJCS8vIHZhbGlkYXRlIGNhdGVnb3J5CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgY2F0ZWdvcnkiKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjYXRlZ29yeVZhbGlkYXRpb24gPSB2YWxpZGF0ZVNlcnZpY2VDYXRlZ29yeSh1c2VyLCBzZXJ2aWNlLCBhY3Rpb25FbnVtKTsKKwkJaWYgKGNhdGVnb3J5VmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBjYXRlZ29yeVZhbGlkYXRpb247CisJCX0KKworCQlsb2cuZGVidWcoInZhbGlkYXRlIHByb2plY3ROYW1lIik7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcHJvamVjdENvZGVWYWxpZGF0aW9uID0gdmFsaWRhdGVQcm9qZWN0Q29kZSh1c2VyLCBzZXJ2aWNlLCBhY3Rpb25FbnVtKTsKKwkJaWYgKHByb2plY3RDb2RlVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBwcm9qZWN0Q29kZVZhbGlkYXRpb247CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVTZXJ2aWNlQ2F0ZWdvcnkoVXNlciB1c2VyLCBTZXJ2aWNlIHNlcnZpY2UsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgU2VydmljZSBjYXRlZ29yeSIpOworCisJCWlmIChzZXJ2aWNlLmdldENhdGVnb3JpZXMoKSA9PSBudWxsIHx8IHNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpLnNpemUoKSA9PSAwKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIHVzZXIsIHNlcnZpY2UsICIiLCAiIiwgYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0Q2F0ZWdvcnkgPSB2YWxpZGF0ZVNlcnZpY2VDYXRlZ29yeShzZXJ2aWNlLmdldENhdGVnb3JpZXMoKSk7CisJCWlmICh2YWxpZGF0Q2F0ZWdvcnkuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IHZhbGlkYXRDYXRlZ29yeS5yaWdodCgpLnZhbHVlKCk7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgc2VydmljZSwgIiIsICIiLCBhY3Rpb25FbnVtLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgQm9vbGVhbj4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVNlcnZpY2VOYW1lRXhpc3RzKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHVzZXJJZCkgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gcmVzcCA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VySWQsICJ2YWxpZGF0ZSBTZXJ2aWNlIE5hbWUgRXhpc3RzIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRhdGFNb2RlbFJlc3BvbnNlID0gc2VydmljZU9wZXJhdGlvbi52YWxpZGF0ZVNlcnZpY2VOYW1lRXhpc3RzKHNlcnZpY2VOYW1lKTsKKworCQlpZiAoZGF0YU1vZGVsUmVzcG9uc2UuaXNMZWZ0KCkpIHsKKwkJCU1hcDxTdHJpbmcsIEJvb2xlYW4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCXJlc3VsdC5wdXQoImlzVmFsaWQiLCBkYXRhTW9kZWxSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoInZhbGlkYXRpb24gd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuIik7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJfQorCisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShkYXRhTW9kZWxSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpKTsKKworCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbGVtZW50RGFvKElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnREYW8pIHsKKwkJdGhpcy5lbGVtZW50RGFvID0gZWxlbWVudERhbzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlT3BlcmF0aW9uKFNlcnZpY2VPcGVyYXRpb24gc2VydmljZU9wZXJhdGlvbikgeworCQl0aGlzLnNlcnZpY2VPcGVyYXRpb24gPSBzZXJ2aWNlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc3NhbmRyYUF1ZGl0aW5nRGFvKEF1ZGl0Q2Fzc2FuZHJhRGFvIGF1ZGl0aW5nRGFvKSB7CisJCXRoaXMuYXVkaXRDYXNzYW5kcmFEYW8gPSBhdWRpdGluZ0RhbzsKKwl9CisKKwkvKgorCSAqIHB1YmxpYyB2b2lkIHNldFVzZXJBZG1pbihVc2VyQWRtaW5CdWlzaW5lc3NMb2dpYyB1c2VyQWRtaW4pIHsgdGhpcy51c2VyQWRtaW4gPSB1c2VyQWRtaW47IH0KKwkgKiAKKwkgKiBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRzVXRpbHMoQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscykgeyB0aGlzLmNvbXBvbmVudHNVdGlscyA9IGNvbXBvbmVudHNVdGlsczsgfQorCSAqIAorCSAqIHB1YmxpYyB2b2lkIHNldEdyYXBoTG9ja09wZXJhdGlvbihJR3JhcGhMb2NrT3BlcmF0aW9uIGdyYXBoTG9ja09wZXJhdGlvbikgeyB0aGlzLmdyYXBoTG9ja09wZXJhdGlvbiA9IGdyYXBoTG9ja09wZXJhdGlvbjsgfQorCSAqLworCisJcHVibGljIEFydGlmYWN0c0J1c2luZXNzTG9naWMgZ2V0QXJ0aWZhY3RCbCgpIHsKKwkJcmV0dXJuIGFydGlmYWN0c0J1c2luZXNzTG9naWM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RCbChBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0QmwpIHsKKwkJdGhpcy5hcnRpZmFjdHNCdXNpbmVzc0xvZ2ljID0gYXJ0aWZhY3RCbDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVTZXJ2aWNlTWV0YWRhdGEoU3RyaW5nIHNlcnZpY2VJZCwgU2VydmljZSBzZXJ2aWNlVXBkYXRlLCBVc2VyIHVzZXIpIHsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDcmVhdG9yID0gdmFsaWRhdGVVc2VyKHVzZXIsICJ1cGRhdGVTZXJ2aWNlTWV0YWRhdGEiLCBzZXJ2aWNlVXBkYXRlLCBudWxsLCBmYWxzZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJdXNlciA9IGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gdmFsaWRhdGUgdXNlciByb2xlCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVSZXMgPSB2YWxpZGF0ZVVzZXJSb2xlKHVzZXIsIHNlcnZpY2VVcGRhdGUsIG5ldyBBcnJheUxpc3Q8Um9sZT4oKSwgbnVsbCwgbnVsbCk7CisJCWlmICh2YWxpZGF0ZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdG9yYWdlU3RhdHVzID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWlmIChzdG9yYWdlU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMucmlnaHQoKS52YWx1ZSgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSwgIiIpKTsKKwkJfQorCisJCVNlcnZpY2UgY3VycmVudFNlcnZpY2UgPSBzdG9yYWdlU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCWlmICghQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzLmNhbldvcmtPblNlcnZpY2UoY3VycmVudFNlcnZpY2UuZ2V0VW5pcXVlSWQoKSwgc2VydmljZU9wZXJhdGlvbiwgdXNlci5nZXRVc2VySWQoKSkpIHsKKwkJCWxvZy5pbmZvKCJSZXN0cmljdGVkIG9wZXJhdGlvbiBmb3IgdXNlciB7fSBvbiBzZXJ2aWNlIHt9IiwgdXNlci5nZXRVc2VySWQoKSwgY3VycmVudFNlcnZpY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTikpOworCQl9CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0aW9uUnNwb25zZSA9IHZhbGlkYXRlQW5kVXBkYXRlU2VydmljZU1ldGFkYXRhKHVzZXIsIGN1cnJlbnRTZXJ2aWNlLCBzZXJ2aWNlVXBkYXRlKTsKKwkJaWYgKHZhbGlkYXRpb25Sc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJbG9nLmluZm8oInNlcnZpY2UgdXBkYXRlIG1ldGFkYXRhOiB2YWxpZGF0aW9ucyBmaWVsZC4iKTsKKwkJCXJldHVybiB2YWxpZGF0aW9uUnNwb25zZTsKKwkJfQorCQlTZXJ2aWNlIHNlcnZpY2VUb1VwZGF0ZSA9IHZhbGlkYXRpb25Sc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQkvLyBsb2NrIHJlc291cmNlCisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrUmVzdWx0ID0gbG9ja0NvbXBvbmVudChzZXJ2aWNlSWQsIGN1cnJlbnRTZXJ2aWNlLCAiVXBkYXRlIFNlcnZpY2UgTWV0YWRhdGEiKTsKKwkJaWYgKGxvY2tSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGxvY2tSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl0cnkgeworCQkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlc3BvbnNlID0gc2VydmljZU9wZXJhdGlvbi51cGRhdGVTZXJ2aWNlKHNlcnZpY2VUb1VwZGF0ZSwgdHJ1ZSk7CisJCQlpZiAodXBkYXRlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJVcGRhdGUgU2VydmljZSBNZXRhZGF0YSIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJVcGRhdGUgU2VydmljZSBNZXRhZGF0YSIpOworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSBzZXZpY2Uge30iLCBzZXJ2aWNlVG9VcGRhdGUuZ2V0VW5pcXVlSWQoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCX0KKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCX0gZmluYWxseSB7CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kVXBkYXRlU2VydmljZU1ldGFkYXRhKFVzZXIgdXNlciwgU2VydmljZSBjdXJyZW50U2VydmljZSwgU2VydmljZSBzZXJ2aWNlVXBkYXRlKSB7CisKKwkJYm9vbGVhbiBoYXNCZWVuQ2VydGlmaWVkID0gVmFsaWRhdGlvblV0aWxzLmhhc0JlZW5DZXJ0aWZpZWQoY3VycmVudFNlcnZpY2UuZ2V0VmVyc2lvbigpKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZSA9IHZhbGlkYXRlQW5kVXBkYXRlQ2F0ZWdvcnkodXNlciwgY3VycmVudFNlcnZpY2UsIHNlcnZpY2VVcGRhdGUsIGhhc0JlZW5DZXJ0aWZpZWQsIG51bGwpOworCQlpZiAocmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gcmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJCVN0cmluZyBjcmVhdG9yVXNlcklkVXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0Q3JlYXRvclVzZXJJZCgpOworCQlTdHJpbmcgY3JlYXRvclVzZXJJZEN1cnJlbnQgPSBjdXJyZW50U2VydmljZS5nZXRDcmVhdG9yVXNlcklkKCk7CisJCWlmIChjcmVhdG9yVXNlcklkVXBkYXRlZCAhPSBudWxsICYmICFjcmVhdG9yVXNlcklkQ3VycmVudC5lcXVhbHMoY3JlYXRvclVzZXJJZFVwZGF0ZWQpKSB7CisJCQlsb2cuaW5mbygidXBkYXRlIHNydmljZTogcmVjaXZlZCByZXF1ZXN0IHRvIHVwZGF0ZSBjcmVhdG9yVXNlcklkIHRvIHt9IHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIGlnbm9yaW5nLiIsIGNyZWF0b3JVc2VySWRVcGRhdGVkKTsKKwkJfQorCisJCVN0cmluZyBjcmVhdG9yRnVsbE5hbWVVcGRhdGVkID0gc2VydmljZVVwZGF0ZS5nZXRDcmVhdG9yRnVsbE5hbWUoKTsKKwkJU3RyaW5nIGNyZWF0b3JGdWxsTmFtZUN1cnJlbnQgPSBjdXJyZW50U2VydmljZS5nZXRDcmVhdG9yRnVsbE5hbWUoKTsKKwkJaWYgKGNyZWF0b3JGdWxsTmFtZVVwZGF0ZWQgIT0gbnVsbCAmJiAhY3JlYXRvckZ1bGxOYW1lQ3VycmVudC5lcXVhbHMoY3JlYXRvckZ1bGxOYW1lVXBkYXRlZCkpIHsKKwkJCWxvZy5pbmZvKCJ1cGRhdGUgc3J2aWNlOiByZWNpdmVkIHJlcXVlc3QgdG8gdXBkYXRlIGNyZWF0b3JGdWxsTmFtZSB0byB7fSB0aGUgZmllbGQgaXMgbm90IHVwZGF0YWJsZSBpZ25vcmluZy4iLCBjcmVhdG9yRnVsbE5hbWVVcGRhdGVkKTsKKwkJfQorCisJCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZFVwZGF0ZWQgPSBzZXJ2aWNlVXBkYXRlLmdldExhc3RVcGRhdGVyVXNlcklkKCk7CisJCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZEN1cnJlbnQgPSBjdXJyZW50U2VydmljZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpOworCQlpZiAobGFzdFVwZGF0ZXJVc2VySWRVcGRhdGVkICE9IG51bGwgJiYgIWxhc3RVcGRhdGVyVXNlcklkQ3VycmVudC5lcXVhbHMobGFzdFVwZGF0ZXJVc2VySWRVcGRhdGVkKSkgeworCQkJbG9nLmluZm8oInVwZGF0ZSBzcnZpY2U6IHJlY2l2ZWQgcmVxdWVzdCB0byB1cGRhdGUgbGFzdFVwZGF0ZXJVc2VySWQgdG8ge30gdGhlIGZpZWxkIGlzIG5vdCB1cGRhdGFibGUgaWdub3JpbmcuIiwgbGFzdFVwZGF0ZXJVc2VySWRVcGRhdGVkKTsKKwkJfQorCisJCVN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lVXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpOworCQlTdHJpbmcgbGFzdFVwZGF0ZXJGdWxsTmFtZUN1cnJlbnQgPSBjdXJyZW50U2VydmljZS5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCk7CisJCWlmIChsYXN0VXBkYXRlckZ1bGxOYW1lVXBkYXRlZCAhPSBudWxsICYmICFsYXN0VXBkYXRlckZ1bGxOYW1lQ3VycmVudC5lcXVhbHMobGFzdFVwZGF0ZXJGdWxsTmFtZVVwZGF0ZWQpKSB7CisJCQlsb2cuaW5mbygidXBkYXRlIHNydmljZTogcmVjaXZlZCByZXF1ZXN0IHRvIHVwZGF0ZSBsYXN0VXBkYXRlckZ1bGxOYW1lIHRvIHt9IHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIGlnbm9yaW5nLiIsIGxhc3RVcGRhdGVyRnVsbE5hbWVVcGRhdGVkICk7CisJCX0KKworCQlyZXNwb25zZSA9IHZhbGlkYXRlQW5kVXBkYXRlU2VydmljZU5hbWUodXNlciwgY3VycmVudFNlcnZpY2UsIHNlcnZpY2VVcGRhdGUsIGhhc0JlZW5DZXJ0aWZpZWQsIG51bGwpOworCQlpZiAocmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gcmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0gZGlzdHJpYnV0aW9uU3RhdHVzVXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCk7CisJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0gZGlzdHJpYnV0aW9uU3RhdHVzQ3VycmVudCA9IGN1cnJlbnRTZXJ2aWNlLmdldERpc3RyaWJ1dGlvblN0YXR1cygpOworCQlpZiAoZGlzdHJpYnV0aW9uU3RhdHVzVXBkYXRlZCAhPSBudWxsICYmICFkaXN0cmlidXRpb25TdGF0dXNVcGRhdGVkLm5hbWUoKS5lcXVhbHMoKGRpc3RyaWJ1dGlvblN0YXR1c0N1cnJlbnQgIT0gbnVsbCA/IGRpc3RyaWJ1dGlvblN0YXR1c0N1cnJlbnQubmFtZSgpIDogbnVsbCkpKSB7CisJCQlsb2cuaW5mbygidXBkYXRlIHNydmljZTogcmVjaXZlZCByZXF1ZXN0IHRvIHVwZGF0ZSBkaXN0cmlidXRpb25TdGF0dXMgdG8ge30gdGhlIGZpZWxkIGlzIG5vdCB1cGRhdGFibGUgaWdub3JpbmcuIiwgZGlzdHJpYnV0aW9uU3RhdHVzVXBkYXRlZCk7CisJCX0KKworCQlpZiAoc2VydmljZVVwZGF0ZS5nZXRQcm9qZWN0Q29kZSgpICE9IG51bGwpIHsKKwkJCXJlc3BvbnNlID0gdmFsaWRhdGVBbmRVcGRhdGVQcm9qZWN0Q29kZSh1c2VyLCBjdXJyZW50U2VydmljZSwgc2VydmljZVVwZGF0ZSwgbnVsbCk7CisJCQlpZiAocmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IHJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJfQorCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZUljb24odXNlciwgY3VycmVudFNlcnZpY2UsIHNlcnZpY2VVcGRhdGUsIGhhc0JlZW5DZXJ0aWZpZWQsIG51bGwpOworCQlpZiAocmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gcmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJCUxvbmcgY3JlYXRpb25EYXRlVXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0Q3JlYXRpb25EYXRlKCk7CisJCUxvbmcgY3JlYXRpb25EYXRlQ3VycmVudCA9IGN1cnJlbnRTZXJ2aWNlLmdldENyZWF0aW9uRGF0ZSgpOworCQlpZiAoY3JlYXRpb25EYXRlVXBkYXRlZCAhPSBudWxsICYmICFjcmVhdGlvbkRhdGVDdXJyZW50LmVxdWFscyhjcmVhdGlvbkRhdGVVcGRhdGVkKSkgeworCQkJbG9nLmluZm8oInVwZGF0ZSBzcnZpY2U6IHJlY2l2ZWQgcmVxdWVzdCB0byB1cGRhdGUgY3JlYXRpb25EYXRlIHRvIHt9IHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIGlnbm9yaW5nLiIsIGNyZWF0aW9uRGF0ZVVwZGF0ZWQpOworCQl9CisKKwkJU3RyaW5nIHZlcnNpb25VcGRhdGVkID0gc2VydmljZVVwZGF0ZS5nZXRWZXJzaW9uKCk7CisJCVN0cmluZyB2ZXJzaW9uQ3VycmVudCA9IGN1cnJlbnRTZXJ2aWNlLmdldFZlcnNpb24oKTsKKwkJaWYgKHZlcnNpb25VcGRhdGVkICE9IG51bGwgJiYgIXZlcnNpb25DdXJyZW50LmVxdWFscyh2ZXJzaW9uVXBkYXRlZCkpIHsKKwkJCWxvZy5pbmZvKCJ1cGRhdGUgc3J2aWNlOiByZWNpdmVkIHJlcXVlc3QgdG8gdXBkYXRlIHZlcnNpb24gdG8ge30gdGhlIGZpZWxkIGlzIG5vdCB1cGRhdGFibGUgaWdub3JpbmcuIiwgdmVyc2lvblVwZGF0ZWQpOworCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZURlc2NyaXB0aW9uKHVzZXIsIGN1cnJlbnRTZXJ2aWNlLCBzZXJ2aWNlVXBkYXRlLCBoYXNCZWVuQ2VydGlmaWVkLCBudWxsKTsKKwkJaWYgKHJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IHJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCQlyZXNwb25zZSA9IHZhbGlkYXRlQW5kVXBkYXRlVGFncyh1c2VyLCBjdXJyZW50U2VydmljZSwgc2VydmljZVVwZGF0ZSwgaGFzQmVlbkNlcnRpZmllZCwgbnVsbCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJcmVzcG9uc2UgPSB2YWxpZGF0ZUFuZFVwZGF0ZUNvbnRhY3RJZCh1c2VyLCBjdXJyZW50U2VydmljZSwgc2VydmljZVVwZGF0ZSwgbnVsbCk7CisJCWlmIChyZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSByZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwkJTG9uZyBsYXN0VXBkYXRlRGF0ZVVwZGF0ZWQgPSBzZXJ2aWNlVXBkYXRlLmdldExhc3RVcGRhdGVEYXRlKCk7CisJCUxvbmcgbGFzdFVwZGF0ZURhdGVDdXJyZW50ID0gY3VycmVudFNlcnZpY2UuZ2V0TGFzdFVwZGF0ZURhdGUoKTsKKwkJaWYgKGxhc3RVcGRhdGVEYXRlVXBkYXRlZCAhPSBudWxsICYmICFsYXN0VXBkYXRlRGF0ZUN1cnJlbnQuZXF1YWxzKGxhc3RVcGRhdGVEYXRlVXBkYXRlZCkpIHsKKwkJCWxvZy5pbmZvKCJ1cGRhdGUgc3J2aWNlOiByZWNpdmVkIHJlcXVlc3QgdG8gdXBkYXRlIGxhc3RVcGRhdGVEYXRlIHRvIHt9IHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIGlnbm9yaW5nLiIsIGxhc3RVcGRhdGVEYXRlVXBkYXRlZCk7CisJCX0KKworCQlMaWZlY3ljbGVTdGF0ZUVudW0gbGlmZWN5Y2xlU3RhdGVVcGRhdGVkID0gc2VydmljZVVwZGF0ZS5nZXRMaWZlY3ljbGVTdGF0ZSgpOworCQlMaWZlY3ljbGVTdGF0ZUVudW0gbGlmZWN5Y2xlU3RhdGVDdXJyZW50ID0gY3VycmVudFNlcnZpY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKTsKKwkJaWYgKGxpZmVjeWNsZVN0YXRlVXBkYXRlZCAhPSBudWxsICYmICFsaWZlY3ljbGVTdGF0ZUN1cnJlbnQubmFtZSgpLmVxdWFscyhsaWZlY3ljbGVTdGF0ZVVwZGF0ZWQubmFtZSgpKSkgeworCQkJbG9nLmluZm8oInVwZGF0ZSBzcnZpY2U6IHJlY2l2ZWQgcmVxdWVzdCB0byB1cGRhdGUgbGlmZWN5Y2xlU3RhdGUgdG8ge30gdGhlIGZpZWxkIGlzIG5vdCB1cGRhdGFibGUgaWdub3JpbmcuIiwgbGlmZWN5Y2xlU3RhdGVVcGRhdGVkKTsKKwkJfQorCisJCUJvb2xlYW4gaXNIaWdoZXN0VmVyc2lvblVwZGF0ZWQgPSBzZXJ2aWNlVXBkYXRlLmlzSGlnaGVzdFZlcnNpb24oKTsKKwkJQm9vbGVhbiBpc0hpZ2hlc3RWZXJzaW9uQ3VycmVudCA9IGN1cnJlbnRTZXJ2aWNlLmlzSGlnaGVzdFZlcnNpb24oKTsKKwkJaWYgKGlzSGlnaGVzdFZlcnNpb25VcGRhdGVkICE9IG51bGwgJiYgIWlzSGlnaGVzdFZlcnNpb25DdXJyZW50LmVxdWFscyhpc0hpZ2hlc3RWZXJzaW9uVXBkYXRlZCkpIHsKKwkJCWxvZy5pbmZvKCJ1cGRhdGUgc3J2aWNlOiByZWNpdmVkIHJlcXVlc3QgdG8gdXBkYXRlIGlzSGlnaGVzdFZlcnNpb24gdG8ge30gdGhlIGZpZWxkIGlzIG5vdCB1cGRhdGFibGUgaWdub3JpbmcuIiwgaXNIaWdoZXN0VmVyc2lvblVwZGF0ZWQpOworCQl9CisKKwkJU3RyaW5nIHV1aWRVcGRhdGVkID0gc2VydmljZVVwZGF0ZS5nZXRVVUlEKCk7CisJCVN0cmluZyB1dWlkQ3VycmVudCA9IGN1cnJlbnRTZXJ2aWNlLmdldFVVSUQoKTsKKwkJaWYgKCF1dWlkQ3VycmVudC5lcXVhbHModXVpZFVwZGF0ZWQpKSB7CisJCQlsb2cuaW5mbygidXBkYXRlIHNydmljZTogcmVjaXZlZCByZXF1ZXN0IHRvIHVwZGF0ZSB1dWlkIHRvIHt9IHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIGlnbm9yaW5nLiIsIHV1aWRVcGRhdGVkKTsKKwkJfQorCisJCVN0cmluZyBjdXJyZW50SW52YXJpYW50VXVpZCA9IGN1cnJlbnRTZXJ2aWNlLmdldEludmFyaWFudFVVSUQoKTsKKwkJU3RyaW5nIHVwZGF0ZWRJbnZhcmlhbnRVdWlkID0gc2VydmljZVVwZGF0ZS5nZXRJbnZhcmlhbnRVVUlEKCk7CisKKwkJaWYgKCh1cGRhdGVkSW52YXJpYW50VXVpZCAhPSBudWxsKSAmJiAoIXVwZGF0ZWRJbnZhcmlhbnRVdWlkLmVxdWFscyhjdXJyZW50SW52YXJpYW50VXVpZCkpKSB7CisJCQlsb2cud2FybigiUHJvZHVjdCBpbnZhcmlhbnQgVVVJRCBpcyBhdXRvbWF0aWNhbGx5IHNldCBhbmQgY2Fubm90IGJlIHVwZGF0ZWQiKTsKKwkJCXNlcnZpY2VVcGRhdGUuc2V0SW52YXJpYW50VVVJRChjdXJyZW50SW52YXJpYW50VXVpZCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGN1cnJlbnRTZXJ2aWNlKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZUNvbnRhY3RJZChVc2VyIHVzZXIsIFNlcnZpY2UgY3VycmVudFNlcnZpY2UsIFNlcnZpY2Ugc2VydmljZVVwZGF0ZSwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGF0aW5nQWN0aW9uKSB7CisJCVN0cmluZyBjb250YWN0SWRVcGRhdGVkID0gc2VydmljZVVwZGF0ZS5nZXRDb250YWN0SWQoKTsKKwkJU3RyaW5nIGNvbnRhY3RJZEN1cnJlbnQgPSBjdXJyZW50U2VydmljZS5nZXRDb250YWN0SWQoKTsKKwkJaWYgKCFjb250YWN0SWRDdXJyZW50LmVxdWFscyhjb250YWN0SWRVcGRhdGVkKSkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0Q29udGFjdElkID0gdmFsaWRhdGVDb250YWN0SWQodXNlciwgc2VydmljZVVwZGF0ZSwgYXVkYXRpbmdBY3Rpb24pOworCQkJaWYgKHZhbGlkYXRDb250YWN0SWQuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdENvbnRhY3RJZC5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnMpOworCQkJfQorCQkJY3VycmVudFNlcnZpY2Uuc2V0Q29udGFjdElkKGNvbnRhY3RJZFVwZGF0ZWQudG9Mb3dlckNhc2UoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZVRhZ3MoVXNlciB1c2VyLCBTZXJ2aWNlIGN1cnJlbnRTZXJ2aWNlLCBTZXJ2aWNlIHNlcnZpY2VVcGRhdGUsIGJvb2xlYW4gaGFzQmVlbkNlcnRpZmllZCwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGF0aW5nQWN0aW9uKSB7CisJCUxpc3Q8U3RyaW5nPiB0YWdzVXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0VGFncygpOworCQlMaXN0PFN0cmluZz4gdGFnc0N1cnJlbnQgPSBjdXJyZW50U2VydmljZS5nZXRUYWdzKCk7CisJCWlmICh0YWdzVXBkYXRlZCA9PSBudWxsIHx8IHRhZ3NVcGRhdGVkLmlzRW1wdHkoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX1RBR1MpOworCQkJY29tcG9uZW50c1V0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4ocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHNlcnZpY2VVcGRhdGUsICIiLCAiIiwgYXVkYXRpbmdBY3Rpb24sIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAoISh0YWdzQ3VycmVudC5jb250YWluc0FsbCh0YWdzVXBkYXRlZCkgJiYgdGFnc1VwZGF0ZWQuY29udGFpbnNBbGwodGFnc0N1cnJlbnQpKSkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0UmVzcG9uc2UgPSB2YWxpZGF0ZVRhZ3NMaXN0QW5kUmVtb3ZlRHVwbGljYXRlcyh1c2VyLCBzZXJ2aWNlVXBkYXRlLCBhdWRhdGluZ0FjdGlvbik7CisJCQlpZiAodmFsaWRhdFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9ucyA9IHZhbGlkYXRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnMpOworCQkJfQorCQkJY3VycmVudFNlcnZpY2Uuc2V0VGFncyh0YWdzVXBkYXRlZCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZURlc2NyaXB0aW9uKFVzZXIgdXNlciwgU2VydmljZSBjdXJyZW50U2VydmljZSwgU2VydmljZSBzZXJ2aWNlVXBkYXRlLCBib29sZWFuIGhhc0JlZW5DZXJ0aWZpZWQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRhdGluZ0FjdGlvbikgeworCQlTdHJpbmcgZGVzY3JpcHRpb25VcGRhdGVkID0gc2VydmljZVVwZGF0ZS5nZXREZXNjcmlwdGlvbigpOworCQlTdHJpbmcgZGVzY3JpcHRpb25DdXJyZW50ID0gY3VycmVudFNlcnZpY2UuZ2V0RGVzY3JpcHRpb24oKTsKKwkJaWYgKCFkZXNjcmlwdGlvbkN1cnJlbnQuZXF1YWxzKGRlc2NyaXB0aW9uVXBkYXRlZCkpIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVEZXNjcmlwdGlvblJlc3BvbnNlID0gdmFsaWRhdGVEZXNjcmlwdGlvbkFuZENsZWFudXAodXNlciwgc2VydmljZVVwZGF0ZSwgYXVkYXRpbmdBY3Rpb24pOworCQkJaWYgKHZhbGlkYXRlRGVzY3JpcHRpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnMgPSB2YWxpZGF0ZURlc2NyaXB0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zKTsKKwkJCX0KKwkJCWN1cnJlbnRTZXJ2aWNlLnNldERlc2NyaXB0aW9uKHNlcnZpY2VVcGRhdGUuZ2V0RGVzY3JpcHRpb24oKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZVByb2plY3RDb2RlKFVzZXIgdXNlciwgU2VydmljZSBjdXJyZW50U2VydmljZSwgU2VydmljZSBzZXJ2aWNlVXBkYXRlLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkYXRpbmdBY3Rpb24pIHsKKwkJU3RyaW5nIHByb2plY3RDb2RlVXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0UHJvamVjdENvZGUoKTsKKwkJU3RyaW5nIHByb2plY3RDb2RlQ3VycmVudCA9IGN1cnJlbnRTZXJ2aWNlLmdldFByb2plY3RDb2RlKCk7CisJCWlmICghcHJvamVjdENvZGVDdXJyZW50LmVxdWFscyhwcm9qZWN0Q29kZVVwZGF0ZWQpKSB7CisJCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRQcm9qZWN0Q29kZVJlc3BvbnNlID0gdmFsaWRhdGVQcm9qZWN0Q29kZSh1c2VyLCBzZXJ2aWNlVXBkYXRlLCBhdWRhdGluZ0FjdGlvbik7CisJCQlpZiAodmFsaWRhdFByb2plY3RDb2RlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdFByb2plY3RDb2RlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zKTsKKwkJCX0KKwkJCWN1cnJlbnRTZXJ2aWNlLnNldFByb2plY3RDb2RlKHByb2plY3RDb2RlVXBkYXRlZCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFuZFVwZGF0ZUljb24oVXNlciB1c2VyLCBTZXJ2aWNlIGN1cnJlbnRTZXJ2aWNlLCBTZXJ2aWNlIHNlcnZpY2VVcGRhdGUsIGJvb2xlYW4gaGFzQmVlbkNlcnRpZmllZCwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGF0aW5nQWN0aW9uKSB7CisJCVN0cmluZyBpY29uVXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0SWNvbigpOworCQlTdHJpbmcgaWNvbkN1cnJlbnQgPSBjdXJyZW50U2VydmljZS5nZXRJY29uKCk7CisJCWlmICghaWNvbkN1cnJlbnQuZXF1YWxzKGljb25VcGRhdGVkKSkgeworCQkJaWYgKCFoYXNCZWVuQ2VydGlmaWVkKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0SWNvblJlc3BvbnNlID0gdmFsaWRhdGVJY29uKHVzZXIsIHNlcnZpY2VVcGRhdGUsIGF1ZGF0aW5nQWN0aW9uKTsKKwkJCQlpZiAodmFsaWRhdEljb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdEljb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zKTsKKwkJCQl9CisJCQkJY3VycmVudFNlcnZpY2Uuc2V0SWNvbihpY29uVXBkYXRlZCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5pbmZvKCJpY29uIHt9IGNhbm5vdCBiZSB1cGRhdGVkIG9uY2UgdGhlIHNlcnZpY2UgaGFzIGJlZW4gY2VydGlmaWVkIG9uY2UuIiwgaWNvblVwZGF0ZWQpOworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfSUNPTl9DQU5OT1RfQkVfQ0hBTkdFRCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kVXBkYXRlU2VydmljZU5hbWUoVXNlciB1c2VyLCBTZXJ2aWNlIGN1cnJlbnRTZXJ2aWNlLCBTZXJ2aWNlIHNlcnZpY2VVcGRhdGUsIGJvb2xlYW4gaGFzQmVlbkNlcnRpZmllZCwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGF0aW5nQWN0aW9uKSB7CisJCVN0cmluZyBzZXJ2aWNlTmFtZVVwZGF0ZWQgPSBzZXJ2aWNlVXBkYXRlLmdldE5hbWUoKTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lQ3VycmVudCA9IGN1cnJlbnRTZXJ2aWNlLmdldE5hbWUoKTsKKwkJaWYgKCFzZXJ2aWNlTmFtZUN1cnJlbnQuZXF1YWxzKHNlcnZpY2VOYW1lVXBkYXRlZCkpIHsKKwkJCWlmICghaGFzQmVlbkNlcnRpZmllZCkgeworCQkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdFNlcnZpY2VOYW1lUmVzcG9uc2UgPSB2YWxpZGF0ZUNvbXBvbmVudE5hbWUodXNlciwgc2VydmljZVVwZGF0ZSwgYXVkYXRpbmdBY3Rpb24pOworCQkJCWlmICh2YWxpZGF0U2VydmljZU5hbWVSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zID0gdmFsaWRhdFNlcnZpY2VOYW1lUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9ucyk7CisJCQkJfQorCisJCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBzZXJ2aWNlTmFtZVVuaXF1ZW5lc3NWYWxpZGF0aW9uID0gdmFsaWRhdGVDb21wb25lbnROYW1lVW5pcXVlKHVzZXIsIHNlcnZpY2VVcGRhdGUsIGF1ZGF0aW5nQWN0aW9uKTsKKwkJCQlpZiAoc2VydmljZU5hbWVVbmlxdWVuZXNzVmFsaWRhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIHNlcnZpY2VOYW1lVW5pcXVlbmVzc1ZhbGlkYXRpb247CisJCQkJfQorCQkJCWN1cnJlbnRTZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWVVcGRhdGVkKTsKKwkJCQljdXJyZW50U2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0Tm9ybWFsaXplZE5hbWUoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudE5hbWUoc2VydmljZU5hbWVVcGRhdGVkKSk7CisJCQkJY3VycmVudFNlcnZpY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFN5c3RlbU5hbWUoVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoc2VydmljZU5hbWVVcGRhdGVkKSk7CisKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmluZm8oInNlcnZpY2UgbmFtZSB7fSBjYW5ub3QgYmUgdXBkYXRlZCBvbmNlIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGNlcnRpZmllZCBvbmNlLiIsIHNlcnZpY2VOYW1lVXBkYXRlZCk7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuU0VSVklDRV9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbmRVcGRhdGVDYXRlZ29yeShVc2VyIHVzZXIsIFNlcnZpY2UgY3VycmVudFNlcnZpY2UsIFNlcnZpY2Ugc2VydmljZVVwZGF0ZSwgYm9vbGVhbiBoYXNCZWVuQ2VydGlmaWVkLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkYXRpbmdBY3Rpb24pIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3J5VXBkYXRlZCA9IHNlcnZpY2VVcGRhdGUuZ2V0Q2F0ZWdvcmllcygpOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnlDdXJyZW50ID0gY3VycmVudFNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRDYXRlZ29yeVJlc3BvbnNlID0gdmFsaWRhdGVTZXJ2aWNlQ2F0ZWdvcnkodXNlciwgc2VydmljZVVwZGF0ZSwgYXVkYXRpbmdBY3Rpb24pOworCQlpZiAodmFsaWRhdENhdGVnb3J5UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnMgPSB2YWxpZGF0Q2F0ZWdvcnlSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9ucyk7CisJCX0KKwkJaWYgKCFjYXRlZ29yeUN1cnJlbnQuZ2V0KDApLmdldE5hbWUoKS5lcXVhbHMoY2F0ZWdvcnlVcGRhdGVkLmdldCgwKS5nZXROYW1lKCkpKSB7CisJCQlpZiAoIWhhc0JlZW5DZXJ0aWZpZWQpIHsKKwkJCQljdXJyZW50U2VydmljZS5zZXRDYXRlZ29yaWVzKGNhdGVnb3J5VXBkYXRlZCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5pbmZvKCJjYXRlZ29yeSB7fSBjYW5ub3QgYmUgdXBkYXRlZCBvbmNlIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGNlcnRpZmllZCBvbmNlLiIsIGNhdGVnb3J5VXBkYXRlZCk7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuU0VSVklDRV9DQVRFR09SWV9DQU5OT1RfQkVfQ0hBTkdFRCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVNlcnZpY2VDYXRlZ29yeShMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gbGlzdCkgeworCQlpZiAobGlzdCAhPSBudWxsKSB7CisJCQlpZiAobGlzdC5zaXplKCkgPiAxKSB7CisJCQkJbG9nLmRlYnVnKCJNdXN0IGJlIG9ubHkgb25lIGNhdGVnb3J5IGZvciBzZXJ2aWNlIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9UT09fTVVDSF9DQVRFR09SSUVTLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLmdldFZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5ID0gbGlzdC5nZXQoMCk7CisJCQlpZiAoY2F0ZWdvcnkuZ2V0U3ViY2F0ZWdvcmllcygpICE9IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlN1YmNhdGVnb3JpZXMgY2Fubm90IGJlIGRlZmluZWQgZm9yIHNlcnZpY2UiKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuU0VSVklDRV9DQU5OT1RfQ09OVEFJTl9TVUJDQVRFR09SWSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGNhdGVnb3J5LmdldE5hbWUoKSkpIHsKKwkJCQlsb2cuZGVidWcoIlJlc291cmNlIGNhdGVnb3J5IGlzIGVtcHR5Iik7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NBVEVHT1JZLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLmdldFZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlsb2cuZGVidWcoInZhbGlkYXRpbmcgc2VydmljZSBjYXRlZ29yeSB7fSBhZ2FpbnN0IHZhbGlkIGNhdGVnb3JpZXMgbGlzdCIsIGxpc3QpOworCQkJRWl0aGVyPExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBjYXRlZ29yeXMgPSBlbGVtZW50RGFvLmdldEFsbFNlcnZpY2VDYXRlZ29yaWVzKCk7CisJCQlpZiAoY2F0ZWdvcnlzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHJldHJpdmUgc2VydmljZSBjYXRlZ29yaWVzIGZyb20gVGl0YW4iKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjYXRlZ29yeXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yeUxpc3QgPSBjYXRlZ29yeXMubGVmdCgpLnZhbHVlKCk7CisJCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiB2YWx1ZSA6IGNhdGVnb3J5TGlzdCkgeworCQkJCWlmICh2YWx1ZS5nZXROYW1lKCkuZXF1YWxzKGNhdGVnb3J5LmdldE5hbWUoKSkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQkJCX0KKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQ2F0ZWdvcnkge30gaXMgbm90IHBhcnQgb2Ygc2VydmljZSBjYXRlZ29yeSBncm91cC4gU2VydmljZSBjYXRlZ29yeSB2YWxpZCB2YWx1ZXMgYXJlIHt9IiwgbGlzdCwgY2F0ZWdvcnlMaXN0KTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgUmVzcG9uc2VGb3JtYXQgZGVsZXRlU2VydmljZShTdHJpbmcgc2VydmljZUlkLCBVc2VyIHVzZXIpIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCVN0cmluZyBlY29tcEVycm9yQ29udGV4dCA9ICJkZWxldGUgc2VydmljZSI7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDcmVhdG9yID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXIsIGVjb21wRXJyb3JDb250ZXh0LCBmYWxzZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCXVzZXIgPSBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlU3RhdHVzID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWlmIChzZXJ2aWNlU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IHNlcnZpY2Uge30iLCBzZXJ2aWNlSWQpOworCQkJcmV0dXJuIGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc2VydmljZVN0YXR1cy5yaWdodCgpLnZhbHVlKCkpLCAiIik7CisJCX0KKworCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrUmVzdWx0ID0gbG9ja0NvbXBvbmVudChzZXJ2aWNlLCAiTWFyayBzZXJ2aWNlIHRvIGRlbGV0ZSIpOworCQlpZiAobG9ja1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCXJldHVybiBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisKKwkJdHJ5IHsKKworCQkJcmVzdWx0ID0gbWFya0NvbXBvbmVudFRvRGVsZXRlKHNlcnZpY2UpOworCQkJaWYgKHJlc3VsdC5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCk7CisJCQl9IGVsc2UgeworCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzdWx0KTsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoYWN0aW9uU3RhdHVzLCBzZXJ2aWNlLmdldE5hbWUoKSk7CisJCQl9CisJCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCAhcmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy53YXJuKCJvcGVyYXRpb24gZmFpbGVkLiBkbyByb2xsYmFjayIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJEZWxldGUgU2VydmljZSIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIm9wZXJhdGlvbiBzdWNjZXNzLiBkbyBjb21taXQiKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCQl9CisJfQorCisJcHVibGljIFJlc3BvbnNlRm9ybWF0IGRlbGV0ZVNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHZlcnNpb24sIFVzZXIgdXNlcikgeworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJU3RyaW5nIGVjb21wRXJyb3JDb250ZXh0ID0gImRlbGV0ZSBzZXJ2aWNlIjsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUVtcHR5UmVzdWx0ID0gdmFsaWRhdGVVc2VyTm90RW1wdHkodXNlciwgZWNvbXBFcnJvckNvbnRleHQpOworCQlpZiAodmFsaWRhdGVFbXB0eVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiB2YWxpZGF0ZUVtcHR5UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQ3JlYXRvciA9IHZhbGlkYXRlVXNlckV4aXN0cyh1c2VyLCBlY29tcEVycm9yQ29udGV4dCwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQl1c2VyID0gZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGdldFJlc3VsdCA9IGdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKHNlcnZpY2VOYW1lLCB2ZXJzaW9uLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJaWYgKGdldFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBnZXRSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCVNlcnZpY2Ugc2VydmljZSA9IGdldFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gbG9ja1Jlc3VsdCA9IGxvY2tDb21wb25lbnQoc2VydmljZSwgIk1hcmsgc2VydmljZSB0byBkZWxldGUiKTsKKwkJaWYgKGxvY2tSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCisJCXRyeSB7CisJCQlyZXN1bHQgPSBtYXJrQ29tcG9uZW50VG9EZWxldGUoc2VydmljZSk7CisJCQlpZiAocmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKTsKKwkJCX0gZWxzZSB7CisJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShyZXN1bHQpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShhY3Rpb25TdGF0dXMsIHNlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8ICFyZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLndhcm4oIm9wZXJhdGlvbiBmYWlsZWQuIGRvIHJvbGxiYWNrIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIkRlbGV0ZSBTZXJ2aWNlIik7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1Zygib3BlcmF0aW9uIHN1Y2Nlc3MuIGRvIGNvbW1pdCIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoc2VydmljZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uU2VydmljZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBnZXRTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlSWQsIFVzZXIgdXNlcikgeworCQlTdHJpbmcgZWNvbXBFcnJvckNvbnRleHQgPSAiR2V0IHNlcnZpY2UiOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlRW1wdHlSZXN1bHQgPSB2YWxpZGF0ZVVzZXJOb3RFbXB0eSh1c2VyLCBlY29tcEVycm9yQ29udGV4dCk7CisJCWlmICh2YWxpZGF0ZUVtcHR5UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUVtcHR5UmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckNyZWF0b3IgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlciwgZWNvbXBFcnJvckNvbnRleHQsIGZhbHNlKTsKKwkJaWYgKGVpdGhlckNyZWF0b3IuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl1c2VyID0gZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RvcmFnZVN0YXR1cyA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZShzZXJ2aWNlSWQpOworCQlpZiAoc3RvcmFnZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBzZXJ2aWNlIGJ5IGlkIHt9Iiwgc2VydmljZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdG9yYWdlU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSksIHNlcnZpY2VJZCkpOworCQl9CisJCS8vIFNlcnZpY2Ugc2VydmljZSA9CisJCS8vIGNyZWF0ZVNlcnZpY2VBcGlBcnRpZmFjdExJc3Qoc3RvcmFnZVN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisJCVNlcnZpY2Ugc2VydmljZSA9IHN0b3JhZ2VTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBnZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlcklkLCAiZ2V0IFNlcnZpY2UgQnkgTmFtZSBBbmQgVmVyc2lvbiIsIGZhbHNlKTsKKwkJaWYgKHJlc3AuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3AucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RvcmFnZVN0YXR1cyA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCBudWxsLCBmYWxzZSk7CisJCWlmIChzdG9yYWdlU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IHNlcnZpY2UgYnkgbmFtZSB7fSBhbmQgdmVyc2lvbiB7fSIsIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RvcmFnZVN0YXR1cy5yaWdodCgpLnZhbHVlKCksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpLCBzZXJ2aWNlTmFtZSkpOworCQl9CisJCVNlcnZpY2Ugc2VydmljZSA9IHN0b3JhZ2VTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlTWFuZGF0b3J5QXJ0aWZhY3RzRGF0YShTZXJ2aWNlIHNlcnZpY2UsIFVzZXIgdXNlcikgeworCQkvLyBjcmVhdGUgbWFuZGF0b3J5IGFydGlmYWN0cworCisJCS8vIFRPRE8gaXQgbXVzdCBiZSByZW1vdmVkIGFmdGVyIHRoYXQgYXJ0aWZhY3QgdW5pcXVlSWQgY3JlYXRpb24gd2lsbCBiZQorCQkvLyBtb3ZlZCB0byBBcnRpZmFjdE9wZXJhdGlvbgorCQkvLyBTdHJpbmcgc2VydmljZVVuaXF1ZUlkID0KKwkJLy8gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkU2VydmljZVVuaXF1ZUlkKHNlcnZpY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwKKwkJLy8gc2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKTsKKwkJU3RyaW5nIHNlcnZpY2VVbmlxdWVJZCA9IHNlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdE1hcCA9IHNlcnZpY2UuZ2V0QXJ0aWZhY3RzKCk7CisJCWlmIChhcnRpZmFjdE1hcCA9PSBudWxsKQorCQkJYXJ0aWZhY3RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0SW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdHMoKTsKKwkJTGlzdDxTdHJpbmc+IGV4bHVkZVNlcnZpY2VDYXRlZ29yeSA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4Y2x1ZGVTZXJ2aWNlQ2F0ZWdvcnkoKTsKKworCQlTdHJpbmcgY2F0ZWdvcnkgPSBzZXJ2aWNlLmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpOworCQlib29sZWFuIGlzQ3JlYXRlQXJ0aWZhY3QgPSB0cnVlOworCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCAmJiBleGx1ZGVTZXJ2aWNlQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhZXhsdWRlU2VydmljZUNhdGVnb3J5LmlzRW1wdHkoKSkgeworCQkJZm9yIChTdHJpbmcgZXhsdWRlIDogZXhsdWRlU2VydmljZUNhdGVnb3J5KSB7CisJCQkJaWYgKGV4bHVkZS5lcXVhbHNJZ25vcmVDYXNlKGNhdGVnb3J5KSkgeworCQkJCQlpc0NyZWF0ZUFydGlmYWN0ID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJaWYgKGluZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzICE9IG51bGwgJiYgaXNDcmVhdGVBcnRpZmFjdCkgeworCQkJU2V0PFN0cmluZz4ga2V5cyA9IGluZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzLmtleVNldCgpOworCQkJZm9yIChTdHJpbmcgaW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdE5hbWUgOiBrZXlzKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcnRpZmFjdEluZm9NYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgaW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdHMuZ2V0KGluZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3ROYW1lKTsKKwkJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gY3JlYXRlQXJ0aWZhY3REZWZpbml0aW9uKHNlcnZpY2VVbmlxdWVJZCwgaW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdE5hbWUsIGFydGlmYWN0SW5mb01hcCwgdXNlciwgZmFsc2UpOworCQkJCWFydGlmYWN0TWFwLnB1dChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RMYWJlbCgpLCBhcnRpZmFjdERlZmluaXRpb24pOworCisJCQl9CisKKwkJCXNlcnZpY2Uuc2V0QXJ0aWZhY3RzKGFydGlmYWN0TWFwKTsKKwkJfQorCX0KKworCXByaXZhdGUgQXJ0aWZhY3REZWZpbml0aW9uIGNyZWF0ZUFydGlmYWN0RGVmaW5pdGlvbihTdHJpbmcgc2VydmljZUlkLCBTdHJpbmcgbG9naWNhbE5hbWUsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJ0aWZhY3RJbmZvTWFwLCBVc2VyIHVzZXIsIEJvb2xlYW4gaXNTZXJ2aWNlQXBpKSB7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbyA9IGFydGlmYWN0c0J1c2luZXNzTG9naWMuY3JlYXRlQXJ0aWZhY3RQbGFjZUhvbGRlckluZm8oc2VydmljZUlkLCBsb2dpY2FsTmFtZSwgYXJ0aWZhY3RJbmZvTWFwLCB1c2VyLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uSU5GT1JNQVRJT05BTCk7CisKKwkJaWYgKGlzU2VydmljZUFwaSkgeworCQkJYXJ0aWZhY3RJbmZvLnNldE1hbmRhdG9yeShmYWxzZSk7CisJCQlhcnRpZmFjdEluZm8uc2V0U2VydmljZUFwaSh0cnVlKTsKKwkJfQorCQlyZXR1cm4gYXJ0aWZhY3RJbmZvOworCX0KKworCXByaXZhdGUgRWl0aGVyPERpc3RyaWJ1dGlvblRyYW5zaXRpb25FbnVtLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVUcmFuc2l0aW9uRW51bShTdHJpbmcgZGlzdHJpYnV0aW9uVHJhbnNpdGlvbiwgVXNlciB1c2VyKSB7CisJCURpc3RyaWJ1dGlvblRyYW5zaXRpb25FbnVtIHRyYW5zaXRpb25FbnVtID0gbnVsbDsKKworCQl0cmFuc2l0aW9uRW51bSA9IERpc3RyaWJ1dGlvblRyYW5zaXRpb25FbnVtLmdldEZyb21EaXNwbGF5TmFtZShkaXN0cmlidXRpb25UcmFuc2l0aW9uKTsKKwkJaWYgKHRyYW5zaXRpb25FbnVtID09IG51bGwpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiQ2hhbmdlIFNlcnZpY2UgRGlzdHJpYnV0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigiQ2hhbmdlIFNlcnZpY2UgRGlzdHJpYnV0aW9uIik7CisJCQlsb2cuaW5mbygic3RhdGUgb3BlcmF0aW9uIGlzIG5vdCB2YWxpZC4gb3BlcmF0aW9ucyBhbGxvd2VkIGFyZToge30iLCBEaXN0cmlidXRpb25UcmFuc2l0aW9uRW51bS52YWx1ZXNBc1N0cmluZygpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRyYW5zaXRpb25FbnVtKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUNvbW1lbnQoTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24gY29tbWVudCwgVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRBY3Rpb24pIHsKKwkJU3RyaW5nIGRhdGEgPSBjb21tZW50LmdldFVzZXJSZW1hcmtzKCk7CisKKwkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLnRyaW0oKS5pc0VtcHR5KCkpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRKc29uSW5wdXQsICJDaGFuZ2UgU2VydmljZSBEaXN0cmlidXRpb24iKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRKc29uSW5wdXQoIkNoYW5nZSBTZXJ2aWNlIERpc3RyaWJ1dGlvbiIpOworCQkJbG9nLmRlYnVnKCJ1c2VyIGNvbW1lbnQgY2Fubm90IGJlIGVtcHR5IG9yIG51bGwuIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKwkJZGF0YSA9IFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKGRhdGEpOworCQlkYXRhID0gVmFsaWRhdGlvblV0aWxzLnJlbW92ZUh0bWxUYWdzKGRhdGEpOworCQlkYXRhID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZVdoaXRlc3BhY2UoZGF0YSk7CisJCWRhdGEgPSBWYWxpZGF0aW9uVXRpbHMuc3RyaXBPY3RldHMoZGF0YSk7CisKKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVMZW5ndGgoZGF0YSwgVmFsaWRhdGlvblV0aWxzLkNPTU1FTlRfTUFYX0xFTkdUSCkpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRKc29uSW5wdXQsICJDaGFuZ2UgU2VydmljZSBEaXN0cmlidXRpb24iKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRKc29uSW5wdXQoIkNoYW5nZSBTZXJ2aWNlIERpc3RyaWJ1dGlvbiIpOworCQkJbG9nLmRlYnVnKCJ1c2VyIGNvbW1lbnQgZXhjZWVkcyBsaW1pdC4iKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5FWENFRURTX0xJTUlULCAiY29tbWVudCIsIFN0cmluZy52YWx1ZU9mKFZhbGlkYXRpb25VdGlscy5DT01NRU5UX01BWF9MRU5HVEgpKSk7CisJCX0KKwkJaWYgKCFWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJc0VuZ2xpc2goZGF0YSkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZGF0YSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU2VydmljZURpc3RyaWJ1dGlvbkNoYW5nZShVc2VyIHVzZXIsIFN0cmluZyBzZXJ2aWNlSWQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEFjdGlvbiwgU3RyaW5nIGNvbW1lbnQpIHsKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0b3JhZ2VTdGF0dXMgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uoc2VydmljZUlkKTsKKwkJaWYgKHN0b3JhZ2VTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuU0VSVklDRV9OT1RfRk9VTkQsIHNlcnZpY2VJZCk7CisJCQljcmVhdGVBdWRpdCh1c2VyLCBhdWRpdEFjdGlvbiwgY29tbWVudCwgcmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJU2VydmljZSBzZXJ2aWNlID0gc3RvcmFnZVN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQlpZiAoc2VydmljZS5nZXRMaWZlY3ljbGVTdGF0ZSgpICE9IExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpIHsKKwkJCWxvZy5pbmZvKCJzZXJ2aWNlIHt9IGlzICBub3QgYXZhaWxhYmxlIGZvciBkaXN0cmlidXRpb24uIFNob3VsZCBiZSBpbiBjZXJ0aWZpZWQgc3RhdGUiLCBzZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLCBzZXJ2aWNlLmdldFZlcnNpb24oKSwgc2VydmljZS5nZXROYW1lKCkpOworCQkJY3JlYXRlQXVkaXQodXNlciwgYXVkaXRBY3Rpb24sIGNvbW1lbnQsIHNlcnZpY2UsIHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVVc2VyRGlzdHJpYnV0aW9uQ2hhbmdlKFVzZXIgdXNlciwgU2VydmljZSBzZXJ2aWNlLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRBY3Rpb24sIFN0cmluZyBjb21tZW50KSB7CisJCWxvZy5kZWJ1ZygiZ2V0IHVzZXIgZnJvbSBEQiIpOworCQkvKgorCQkgKiBFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdG9yID0gdXNlckFkbWluLmdldFVzZXIodXNlci5nZXRVc2VySWQoKSk7cyBpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkgfHwgZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7IEJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS4gQmVVc2VyTWlzc2luZ0Vycm9yLAorCQkgKiAiQWN0aXZhdGUgRGlzdHJpYnV0aW9uIiwgdXNlci5nZXRVc2VySWQoKSk7IGxvZy4gZGVidWcoImNoYW5nZVNlcnZpY2VEaXN0cmlidXRpb25TdGF0ZSBtZXRob2QgLSB1c2VyIGlzIG5vdCBsaXN0ZWQuIHVzZXJJZD0iICsgdXNlci5nZXRVc2VySWQoKSk7IFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0KKwkJICogY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCk7IGNyZWF0ZUF1ZGl0KHVzZXIsIGF1ZGl0QWN0aW9uLCBjb21tZW50LCByZXNwb25zZUZvcm1hdCk7IHJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOyB9IHVzZXIgPSBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpOyBsb2cuZGVidWcoInZhbGlkYXRlIHVzZXIgcm9sZSIpOyBpZgorCQkgKiAoIXZhbGlkYXRlVXNlclRlbXAodXNlciwgUm9sZS5BRE1JTiwgUm9sZS5HT1ZFUk5PUikpIHsgbG9nLmluZm8oInJvbGUge30gaXMgbm90IGFsbG93ZWQgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbiIsIHVzZXIuZ2V0Um9sZSgpKTsgUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJICogY3JlYXRlQXVkaXQodXNlciwgYXVkaXRBY3Rpb24sIGNvbW1lbnQsIHNlcnZpY2UsIHJlc3BvbnNlRm9ybWF0KTsgcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7IH0KKwkJICovCisJCS8vIGdldCB1c2VyIGRldGFpbHMKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJDcmVhdG9yID0gdmFsaWRhdGVVc2VyKHVzZXIsICJBY3RpdmF0ZSBEaXN0cmlidXRpb24iLCBzZXJ2aWNlLCBhdWRpdEFjdGlvbiwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXVzZXIgPSBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIHZhbGlkYXRlIHVzZXIgcm9sZQorCQlMaXN0PFJvbGU+IHJvbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJvbGVzLmFkZChSb2xlLkFETUlOKTsKKwkJcm9sZXMuYWRkKFJvbGUuR09WRVJOT1IpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzID0gdmFsaWRhdGVVc2VyUm9sZSh1c2VyLCBzZXJ2aWNlLCByb2xlcywgYXVkaXRBY3Rpb24sIGNvbW1lbnQpOworCQlpZiAodmFsaWRhdGVSZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHVzZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBdWRpdChVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEFjdGlvbiwgU3RyaW5nIGNvbW1lbnQsIFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0KSB7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisKKwkJY3JlYXRlQXVkaXQodXNlciwgYXVkaXRBY3Rpb24sIGNvbW1lbnQsIG51bGwsIHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0ZpZWxkcyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1ZGl0KFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0QWN0aW9uLCBTdHJpbmcgY29tbWVudCwgU2VydmljZSBjb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0KSB7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RDVVJSX1NUQVRVUywgY29tcG9uZW50LmdldERpc3RyaWJ1dGlvblN0YXR1cygpLm5hbWUoKSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RQUkVWX1NUQVRVUywgY29tcG9uZW50LmdldERpc3RyaWJ1dGlvblN0YXR1cygpLm5hbWUoKSk7CisJCWNyZWF0ZUF1ZGl0KHVzZXIsIGF1ZGl0QWN0aW9uLCBjb21tZW50LCBjb21wb25lbnQsIGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpLm5hbWUoKSwgY29tcG9uZW50LmdldFZlcnNpb24oKSwgcmVzcG9uc2VGb3JtYXQsIGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQXVkaXQoVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRBY3Rpb24sIFN0cmluZyBjb21tZW50LCBTZXJ2aWNlIGNvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQsIEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQlsb2cuZGVidWcoImF1ZGl0IGJlZm9yZSBzZW5kaW5nIHJlc3BvbnNlIik7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQsIGNvbW1lbnQpOworCQljb21wb25lbnRzVXRpbHMuYXVkaXRDb21wb25lbnQocmVzcG9uc2VGb3JtYXQsIHVzZXIsIGNvbXBvbmVudCwgbnVsbCwgbnVsbCwgYXVkaXRBY3Rpb24sIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQXVkaXQoVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRBY3Rpb24sIFN0cmluZyBjb21tZW50LCBTZXJ2aWNlIGNvbXBvbmVudCwgU3RyaW5nIHByZXZTdGF0ZSwgU3RyaW5nIHByZXZWZXJzaW9uLCBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCwgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCWxvZy5kZWJ1ZygiYXVkaXQgYmVmb3JlIHNlbmRpbmcgcmVzcG9uc2UiKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ09NTUVOVCwgY29tbWVudCk7CisJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudChyZXNwb25zZUZvcm1hdCwgdXNlciwgY29tcG9uZW50LCBwcmV2U3RhdGUsIHByZXZWZXJzaW9uLCBhdWRpdEFjdGlvbiwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGFjdGl2YXRlRGlzdHJpYnV0aW9uKFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyBlbnZOYW1lLCBVc2VyIG1vZGlmaWVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyQ3JlYXRvciA9IHZhbGlkYXRlVXNlckV4aXN0cyhtb2RpZmllci5nZXRVc2VySWQoKSwgImFjdGl2YXRlIERpc3RyaWJ1dGlvbiIsIGZhbHNlKTsKKwkJaWYgKGVpdGhlckNyZWF0b3IuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVVzZXIgdXNlciA9IGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZSA9IG51bGw7CisJCVNlcnZpY2UgdXBkYXRlZFNlcnZpY2UgPSBudWxsOworCQlTdHJpbmcgZGlkID0gVGhyZWFkTG9jYWxzSG9sZGVyLmdldFV1aWQoKTsKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0lELCBkaWQpOworCQkvLyBERTE5NDAyMQorCQlTdHJpbmcgY29uZmlndXJlZEVudk5hbWUgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24oKS5nZXRFbnZpcm9ubWVudHMoKS5nZXQoMCk7CisJCWlmIChjb25maWd1cmVkRW52TmFtZSAhPSBudWxsICYmIGZhbHNlID09IGVudk5hbWUuZXF1YWxzKGNvbmZpZ3VyZWRFbnZOYW1lKSkgeworCQkJbG9nLnRyYWNlKCJVcGRhdGUgZW52aXJvbm1lbnQgbmFtZSB0byBiZSB7fSBpbnN0ZWFkIG9mIHt9IiwgY29uZmlndXJlZEVudk5hbWUsIGVudk5hbWUpOworCQkJZW52TmFtZSA9IGNvbmZpZ3VyZWRFbnZOYW1lOworCQl9CisJCS8vIERFMTk0MDIxCisKKwkJU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlib29sZWFuIGlzRGlzdHJpYnV0aW9uRW5naW5lVXAgPSBnZXRIZWFsdGhDaGVja0JMKHNlcnZsZXRDb250ZXh0KS5pc0Rpc3RyaWJ1dGlvbkVuZ2luZVVwKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOyAvLyBERQorCQlpZiAoIWlzRGlzdHJpYnV0aW9uRW5naW5lVXApIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiRGlzdHJpYnV0aW9uIEVuZ2luZSBpcyBET1dOIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigiRGlzdHJpYnV0aW9uIEVuZ2luZSBpcyBET1dOIik7CisJCQlsb2cuZGVidWcoIkRpc3RyaWJ1dGlvbiBFbmdpbmUgaXMgRE9XTiIpOworCQkJcmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZSk7CisJCX0KKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZVJlcyA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZShzZXJ2aWNlSWQpOworCQlpZiAoc2VydmljZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHJldHJpZXZpbmcgc2VydmljZSIpOworCQkJcmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHNlcnZpY2VSZXMucmlnaHQoKS52YWx1ZSgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSwgc2VydmljZUlkKTsKKwkJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudChyZXNwb25zZSwgdXNlciwgbnVsbCwgbnVsbCwgbnVsbCwgQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9TVEFURV9DSEFOR0VfUkVRVUVTVCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgYXVkaXRpbmdGaWVsZHMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZSk7CisJCX0KKwkJU2VydmljZSBzZXJ2aWNlID0gc2VydmljZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJU3RyaW5nIGRjdXJyU3RhdHVzID0gc2VydmljZS5nZXREaXN0cmlidXRpb25TdGF0dXMoKS5uYW1lKCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0RQUkVWX1NUQVRVUywgZGN1cnJTdGF0dXMpOworCisJCUVpdGhlcjxJTm90aWZpY2F0aW9uRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVhZHlGb3JEaXN0cmlidXRpb24gPSBkaXN0cmlidXRpb25FbmdpbmUuaXNSZWFkeUZvckRpc3RyaWJ1dGlvbihzZXJ2aWNlLCBkaWQsIGVudk5hbWUpOworCQlpZiAocmVhZHlGb3JEaXN0cmlidXRpb24uaXNMZWZ0KCkpIHsKKwkJCUlOb3RpZmljYXRpb25EYXRhIG5vdGlmaWNhdGlvbkRhdGEgPSByZWFkeUZvckRpc3RyaWJ1dGlvbi5sZWZ0KCkudmFsdWUoKTsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgbm90aWZ5U2VydmljZVJlc3BvbnNlID0gZGlzdHJpYnV0aW9uRW5naW5lLm5vdGlmeVNlcnZpY2UoZGlkLCBzZXJ2aWNlLCBub3RpZmljYXRpb25EYXRhLCBlbnZOYW1lLCB1c2VyLmdldFVzZXJJZCgpLCB1c2VyLmdldEZ1bGxOYW1lKCkpOworCQkJaWYgKG5vdGlmeVNlcnZpY2VSZXNwb25zZSA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVTdGF0ZVJlcyA9IHVwZGF0ZURpc3RyaWJ1dGlvblN0YXR1c0ZvckFjdGl2YXRpb24oc2VydmljZSwgdXNlciwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCk7CisJCQkJaWYgKHVwZGF0ZVN0YXRlUmVzLmlzTGVmdCgpICYmIHVwZGF0ZVN0YXRlUmVzLmxlZnQoKS52YWx1ZSgpICE9IG51bGwpIHsKKwkJCQkJdXBkYXRlZFNlcnZpY2UgPSB1cGRhdGVTdGF0ZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJZGN1cnJTdGF0dXMgPSB1cGRhdGVkU2VydmljZS5nZXREaXN0cmlidXRpb25TdGF0dXMoKS5uYW1lKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gVGhlIHJlc3BvbnNlIGlzIG5vdCByZWxldmFudAorCQkJCQl1cGRhdGVkU2VydmljZSA9IHNlcnZpY2U7CisJCQkJfQorCQkJCUFTRENLcGlBcGkuY291bnRBY3RpdmF0ZWREaXN0cmlidXRpb24oKTsKKwkJCQlyZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZWRTZXJ2aWNlKTsKKwkJCX0gZWxzZSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJBY3RpdmF0ZSBEaXN0cmlidXRpb24gLSBzZW5kIG5vdGlmaWNhdGlvbiIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJBY3RpdmF0ZSBEaXN0cmlidXRpb24gLSBzZW5kIG5vdGlmaWNhdGlvbiIpOworCQkJCWxvZy5kZWJ1ZygiZGlzdHJpYnV0aW9uRW5naW5lLm5vdGlmeVNlcnZpY2UgcmVzcG9uc2UgaXM6IHt9Iiwgbm90aWZ5U2VydmljZVJlc3BvbnNlKTsKKwkJCQlyZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGlzdEVuZ2luZVZhbGlkYXRpb25SZXNwb25zZSA9IHJlYWR5Rm9yRGlzdHJpYnV0aW9uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJlc3BvbnNlID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlERShjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoZGlzdEVuZ2luZVZhbGlkYXRpb25SZXNwb25zZSksIHNlcnZpY2UuZ2V0TmFtZSgpLCBlbnZOYW1lKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZSk7CisJCX0KKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfRENVUlJfU1RBVFVTLCBkY3VyclN0YXR1cyk7CisJCWNvbXBvbmVudHNVdGlscy5hdWRpdENvbXBvbmVudChyZXNwb25zZSwgdXNlciwgc2VydmljZSwgbnVsbCwgbnVsbCwgQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9TVEFURV9DSEFOR0VfUkVRVUVTVCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgYXVkaXRpbmdGaWVsZHMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8vIGNvbnZlcnQgdG8gcHJpdmF0ZSBhZnRlciBkZWxldGlvbiBvZiB0ZW1wIHVybAorCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZURpc3RyaWJ1dGlvblN0YXR1c0ZvckFjdGl2YXRpb24oU2VydmljZSBzZXJ2aWNlLCBVc2VyIHVzZXIsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0gc3RhdGUpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlci5nZXRVc2VySWQoKSwgInVwZGF0ZSBEaXN0cmlidXRpb24gU3RhdHVzIEZvciBBY3RpdmF0aW9uIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IHNlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrUmVzdWx0ID0gbG9ja0NvbXBvbmVudChzZXJ2aWNlSWQsIHNlcnZpY2UsICJ1cGRhdGVEaXN0cmlidXRpb25TdGF0dXNGb3JBY3RpdmF0aW9uIik7CisJCWlmIChsb2NrUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChsb2NrUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJdHJ5IHsKKwkJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBzZXJ2aWNlT3BlcmF0aW9uLnVwZGF0ZURlc3RyaWJ1dGlvblN0YXR1cyhzZXJ2aWNlLCB1c2VyLCBzdGF0ZSk7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAidXBkYXRlRGlzdHJpYnV0aW9uU3RhdHVzRm9yQWN0aXZhdGlvbiIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJ1cGRhdGVEaXN0cmlidXRpb25TdGF0dXNGb3JBY3RpdmF0aW9uIik7CisJCQkJbG9nLmRlYnVnKCJzZXJ2aWNlIHt9ICBjaGFuZ2UgZGlzdHJpYnV0aW9uIHN0YXR1cyBmYWlsZWQiLCBzZXJ2aWNlSWQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQl9CisJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWdyYXBoTG9ja09wZXJhdGlvbi51bmxvY2tDb21wb25lbnQoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBtYXJrRGlzdHJpYnV0aW9uQXNEZXBsb3llZChTdHJpbmcgc2VydmljZUlkLCBTdHJpbmcgZGlkLCBVc2VyIHVzZXIpIHsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHJlc3AgPSB2YWxpZGF0ZVVzZXJFeGlzdHModXNlci5nZXRVc2VySWQoKSwgIm1hcmsgRGlzdHJpYnV0aW9uIEFzIERlcGxveWVkIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJbG9nLmRlYnVnKCJtYXJrIGRpc3RyaWJ1dGlvbiBkZXBsb3llZCIpOworCisJCUF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEFjdGlvbiA9IEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fREVQTE9ZOworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZVJlc3BvbnNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWlmIChnZXRTZXJ2aWNlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTZXJ2aWNlTWlzc2luZ0Vycm9yLCAibWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWQiLCBzZXJ2aWNlSWQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlQ29tcG9uZW50TWlzc2luZ0Vycm9yKCJtYXJrRGlzdHJpYnV0aW9uQXNEZXBsb3llZCIsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSwgc2VydmljZUlkKTsKKwkJCWxvZy5kZWJ1Zygic2VydmljZSB7fSBub3QgZm91bmQiLCBzZXJ2aWNlSWQpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBhdWRpdERlcGxveUVycm9yKGRpZCwgdXNlciwgYXVkaXRBY3Rpb24sIG51bGwsIGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShnZXRTZXJ2aWNlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSwgIiIpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCVNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2VSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUm9sZUZvckRlcGxveSA9IHZhbGlkYXRlUm9sZUZvckRlcGxveShkaWQsIHVzZXIsIGF1ZGl0QWN0aW9uLCBzZXJ2aWNlKTsKKwkJaWYgKHZhbGlkYXRlUm9sZUZvckRlcGxveS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVSb2xlRm9yRGVwbG95LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJdXNlciA9IHZhbGlkYXRlUm9sZUZvckRlcGxveS5sZWZ0KCkudmFsdWUoKTsKKworCQlyZXR1cm4gY2hlY2tEaXN0cmlidXRpb25BbmREZXBsb3koZGlkLCB1c2VyLCBhdWRpdEFjdGlvbiwgc2VydmljZSk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBnZW5lcmF0ZVZmTW9kdWxlQXJ0aWZhY3RzKFNlcnZpY2Ugc2VydmljZSwgVXNlciBtb2RpZmllciwgYm9vbGVhbiBzaG91bGRMb2NrKSB7CisJCUZ1bmN0aW9uPENvbXBvbmVudEluc3RhbmNlLCBMaXN0PEFydGlmYWN0R2VuZXJhdG9yPEFydGlmYWN0RGVmaW5pdGlvbj4+PiBhcnRpZmFjdFRhc2tHZW5lcmF0b3JDcmVhdG9yID0gcmkgLT4KKwkJLy8gT25seSBvbmUgVkYgTW9kdWxlIEFydGlmYWN0IHBlciBpbnN0YW5jZSAtIGFkZCBpdCB0byBhIGxpc3Qgb2Ygb25lCisJCUFycmF5cy5hc0xpc3QobmV3IFZmTW9kdWxlQXJ0aWZhY0dlbmVyYXRvcihtb2RpZmllciwgcmksIHNlcnZpY2UsIHNob3VsZExvY2spKTsKKworCQlyZXR1cm4gZ2VuZXJhdGVEZXBsb3ltZW50QXJ0aWZhY3RzKHNlcnZpY2UsIG1vZGlmaWVyLCBhcnRpZmFjdFRhc2tHZW5lcmF0b3JDcmVhdG9yKTsKKworCX0KKworCXByaXZhdGUgTGlzdDxHcm91cERlZmluaXRpb24+IGNvbGxlY3RHcm91cHNGb3JDb21wSW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2UgY3VyclZGLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZVdyYXBwZXIpIHsKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IHJlbGV2YW50R3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckdyb3VwcyA9IGdyb3VwT3BlcmF0aW9uLmdldEFsbEdyb3VwcyhjdXJyVkYuZ2V0Q29tcG9uZW50VWlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisKKwkJaWYgKGVpdGhlckdyb3Vwcy5pc1JpZ2h0KCkpIHsKKwkJCWZpbmFsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IGVpdGhlckdyb3Vwcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RvcmFnZVN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCAmJiBzdG9yYWdlU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHN0b3JhZ2VTdGF0dXMpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cykpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlyZWxldmFudEdyb3VwcyA9IGVpdGhlckdyb3Vwcy5sZWZ0KCkudmFsdWUoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBHcm91cFR5cGVFbnVtLlZGX01PRFVMRS5nZXRHcm91cFR5cGVOYW1lKCkuZXF1YWxzKHAuZ2V0VHlwZSgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJfQorCQlyZXR1cm4gcmVsZXZhbnRHcm91cHM7CisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdERlZmluaXRpb24gZ2V0VmZNb2R1bGVBcnRpZmFjdEZvckNvbXBJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZSBjdXJyVkYsIFNlcnZpY2Ugc2VydmljZSwgVXNlciBtb2RpZmllciwgTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc0ZvckN1cnJWRiwgV3JhcHBlcjxTdHJpbmc+IHBheWxvYWRXcmFwcGVyLCBXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZVdyYXBwZXIpIHsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIHZmTW9kdWxlQWVydGlmYWN0ID0gbnVsbDsKKworCQlPcHRpb25hbDxBcnRpZmFjdERlZmluaXRpb24+IG9wdGlvbmFsVmZNb2R1bGVBcnRpZmFjdCA9IGN1cnJWRi5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRBcnRpZmFjdFR5cGUoKS5lcXVhbHMoQXJ0aWZhY3RUeXBlRW51bS5WRl9NT0RVTEVTX01FVEFEQVRBLm5hbWUoKSkpLmZpbmRBbnkoKTsKKwkJaWYgKG9wdGlvbmFsVmZNb2R1bGVBcnRpZmFjdC5pc1ByZXNlbnQoKSkgeworCQkJdmZNb2R1bGVBZXJ0aWZhY3QgPSBvcHRpb25hbFZmTW9kdWxlQXJ0aWZhY3QuZ2V0KCk7CisJCX0gZWxzZSB7CisJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlVmZNb2R1bGVBcnRpZmFjdCA9IGNyZWF0ZVZmTW9kdWxlQXJ0aWZhY3QobW9kaWZpZXIsIGN1cnJWRiwgc2VydmljZSwgcGF5bG9hZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJaWYgKGNyZWF0ZVZmTW9kdWxlQXJ0aWZhY3QuaXNMZWZ0KCkpIHsKKwkJCQl2Zk1vZHVsZUFlcnRpZmFjdCA9IGNyZWF0ZVZmTW9kdWxlQXJ0aWZhY3QubGVmdCgpLnZhbHVlKCk7CisJCQl9IGVsc2UgeworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY3JlYXRlVmZNb2R1bGVBcnRpZmFjdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCXJldHVybiB2Zk1vZHVsZUFlcnRpZmFjdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmlsbFZmTW9kdWxlSGVhdEVudlBheWxvYWQoTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc0ZvckN1cnJWRiwgQ29tcG9uZW50SW5zdGFuY2UgY3VyclZGSW5zdGFuY2UsIFdyYXBwZXI8U3RyaW5nPiBwYXlsb2FkV3JhcHBlcikgeworCQkvLyBDb252ZXJ0cyBHcm91cERlZmluaXRpb24gdG8gVmZNb2R1bGVBcnRpZmFjdFBheWxvYWQgd2hpY2ggaXMgdGhlCisJCS8vIGZvcm1hdCB1c2VkIGluIHRoZSBwYXlsb2FkCisKKwkJTGlzdDxWZk1vZHVsZUFydGlmYWN0UGF5bG9hZD4gdmZNb2R1bGVQYXlsb2FkRm9yQ3VyclZGID0gZ3JvdXBzRm9yQ3VyclZGLnN0cmVhbSgpLm1hcChncm91cCAtPiBuZXcgVmZNb2R1bGVBcnRpZmFjdFBheWxvYWQoZ3JvdXApKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlDb2xsZWN0aW9ucy5zb3J0KHZmTW9kdWxlUGF5bG9hZEZvckN1cnJWRiwgKGFydDEsIGFydDIpIC0+IFZmTW9kdWxlQXJ0aWZhY3RQYXlsb2FkLmNvbXBhcmVCeUdyb3VwTmFtZShhcnQxLCBhcnQyKSk7CisJCS8vIFVwZGF0ZSBQYXlsb2FkIFdpdGggSGVhdCBFbnYKKwkJdmZNb2R1bGVQYXlsb2FkRm9yQ3VyclZGLnN0cmVhbSgpLmZvckVhY2goZSAtPiBhZGRIZWF0RW52QXJ0aWZhY3RzVG9WRk1vZHVsZVBheWxvYWQoZSwgY3VyclZGSW5zdGFuY2UpKTsKKworCQlmaW5hbCBHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCisJCVN0cmluZyB2Zk1vZHVsZVBheWxvYWRTdHJpbmcgPSBnc29uLnRvSnNvbih2Zk1vZHVsZVBheWxvYWRGb3JDdXJyVkYpOworCQlwYXlsb2FkV3JhcHBlci5zZXRJbm5lckVsZW1lbnQodmZNb2R1bGVQYXlsb2FkU3RyaW5nKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBhZGRIZWF0RW52QXJ0aWZhY3RzVG9WRk1vZHVsZVBheWxvYWQoVmZNb2R1bGVBcnRpZmFjdFBheWxvYWQgdmZNb2R1bGVQYXlsb2FkLCBDb21wb25lbnRJbnN0YW5jZSBjdXJyVkZJbnN0YW5jZSkgeworCQlMaXN0PFN0cmluZz4gb3JpZ2luYWxNb2R1bGVBcnRpZmFjdHMgPSB2Zk1vZHVsZVBheWxvYWQuZ2V0QXJ0aWZhY3RzKCk7CisJCWlmICghTWFwVXRpbHMuaXNFbXB0eShjdXJyVkZJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkpICYmICFDb2xsZWN0aW9uVXRpbHMuaXNFbXB0eShvcmlnaW5hbE1vZHVsZUFydGlmYWN0cykpIHsKKworCQkJZmluYWwgQ29sbGVjdGlvbjxBcnRpZmFjdERlZmluaXRpb24+IGRlcEluc0FydGlmYWN0cyA9IGN1cnJWRkluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS52YWx1ZXMoKTsKKwkJCS8vIEFsbCBIZWF0X0VOVgorCQkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGhlYXRFbnZBcnRpZmFjdHMgPSBkZXBJbnNBcnRpZmFjdHMuc3RyZWFtKCkuZmlsdGVyKGFydCAtPiBhcnQuZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzKEFydGlmYWN0VHlwZUVudW0uSEVBVF9FTlYuZ2V0VHlwZSgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCS8vIFVuaXF1ZSBJZCBPZiBBcnRpZmFjdHMgSW4gdGhlIHZmIG1vZHVsZQorCQkJTGlzdDxTdHJpbmc+IG1vZHVsZUFydFVuaXF1ZUlkID0gZGVwSW5zQXJ0aWZhY3RzLnN0cmVhbSgpLmZpbHRlcihhcnQgLT4gb3JpZ2luYWxNb2R1bGVBcnRpZmFjdHMuY29udGFpbnMoYXJ0LmdldEFydGlmYWN0VVVJRCgpKSkubWFwKGFydCAtPiBhcnQuZ2V0VW5pcXVlSWQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCS8vIENvbGxlY3QgT25seSBIZWF0IEFydGlmYXRjcyB0aGF0IGFyZSBHZW5lcmF0ZWQgZnJvbSBhcnRpZmFjdHMgaW4KKwkJCS8vIHRoZSBtb2R1bGUKKwkJCUxpc3Q8U3RyaW5nPiByZWxldmFudEhlYXRFbnZVVUlEID0gaGVhdEVudkFydGlmYWN0cy5zdHJlYW0oKS5maWx0ZXIoaGVhdEVudiAtPiBtb2R1bGVBcnRVbmlxdWVJZC5jb250YWlucyhoZWF0RW52LmdldEdlbmVyYXRlZEZyb21JZCgpKSkubWFwKGhlYXRFbnYgLT4gaGVhdEVudi5nZXRBcnRpZmFjdFVVSUQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJTGlzdDxTdHJpbmc+IGZ1bGxBcnRpZmFjdExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZ1bGxBcnRpZmFjdExpc3QuYWRkQWxsKG9yaWdpbmFsTW9kdWxlQXJ0aWZhY3RzKTsKKwkJCWZ1bGxBcnRpZmFjdExpc3QuYWRkQWxsKHJlbGV2YW50SGVhdEVudlVVSUQpOworCisJCQl2Zk1vZHVsZVBheWxvYWQuc2V0QXJ0aWZhY3RzKGZ1bGxBcnRpZmFjdExpc3QpOworCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdGVWZk1vZHVsZUFydGlmYWN0KFVzZXIgbW9kaWZpZXIsIENvbXBvbmVudEluc3RhbmNlIGN1cnJWRkluc3RhbmNlLCBTZXJ2aWNlIHNlcnZpY2UsIGJvb2xlYW4gc2hvdWxkTG9jaykgeworCQlBcnRpZmFjdERlZmluaXRpb24gdmZNb2R1bGVBZXJ0aWZhY3QgPSBudWxsOworCQlXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVdyYXBwZXI8U3RyaW5nPiBwYXlsb2FkV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc0ZvckN1cnJWRiA9IGNvbGxlY3RHcm91cHNGb3JDb21wSW5zdGFuY2UoY3VyclZGSW5zdGFuY2UsIHJlc3BvbnNlV3JhcHBlcik7CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlmaWxsVmZNb2R1bGVIZWF0RW52UGF5bG9hZChncm91cHNGb3JDdXJyVkYsIGN1cnJWRkluc3RhbmNlLCBwYXlsb2FkV3JhcHBlcik7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZmTW9kdWxlQWVydGlmYWN0ID0gZ2V0VmZNb2R1bGVBcnRpZmFjdEZvckNvbXBJbnN0YW5jZShjdXJyVkZJbnN0YW5jZSwgc2VydmljZSwgbW9kaWZpZXIsIGdyb3Vwc0ZvckN1cnJWRiwgcGF5bG9hZFdyYXBwZXIsIHJlc3BvbnNlV3JhcHBlcik7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkgJiYgdmZNb2R1bGVBZXJ0aWZhY3QgIT0gbnVsbCkgeworCQkJdmZNb2R1bGVBZXJ0aWZhY3QgPSBmaWxsVmZNb2R1bGVQYXlsb2FkKG1vZGlmaWVyLCBjdXJyVkZJbnN0YW5jZSwgdmZNb2R1bGVBZXJ0aWZhY3QsIHNob3VsZExvY2ssIHBheWxvYWRXcmFwcGVyLCByZXNwb25zZVdyYXBwZXIpOworCQl9CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHJlc3VsdDsKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHZmTW9kdWxlQWVydGlmYWN0KTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZXNwb25zZVdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEFydGlmYWN0RGVmaW5pdGlvbiBmaWxsVmZNb2R1bGVQYXlsb2FkKFVzZXIgbW9kaWZpZXIsIENvbXBvbmVudEluc3RhbmNlIGN1cnJWRiwgQXJ0aWZhY3REZWZpbml0aW9uIHZmTW9kdWxlQWVydGlmYWN0LCBib29sZWFuIHNob3VsZExvY2ssIFdyYXBwZXI8U3RyaW5nPiBwYXlsb2FkV3JhcHBlciwgV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gcmVzcG9uc2VXcmFwcGVyKSB7CisJCUFydGlmYWN0RGVmaW5pdGlvbiByZXN1bHQgPSBudWxsOworCQlmaW5hbCBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UoY3VyclZGLmdldENvbXBvbmVudFVpZCgpKTsKKwkJaWYgKGVpdGhlclJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGVpdGhlclJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJfSBlbHNlIHsKKwkJCVJlc291cmNlIHJlc291cmNlID0gZWl0aGVyUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUGF5bG9hZCA9IGFydGlmYWN0c0J1c2luZXNzTG9naWMuZ2VuZXJhdGVBcnRpZmFjdFBheWxvYWQodmZNb2R1bGVBZXJ0aWZhY3QsIHJlc291cmNlLCBjdXJyVkYuZ2V0TmFtZSgpLCBtb2RpZmllciwgc2hvdWxkTG9jaywgKCkgLT4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksCisJCQkJCSgpIC0+IEVpdGhlci5sZWZ0KGFydGlmYWN0c0J1c2luZXNzTG9naWMuY3JlYXRlRXNBcnRpZmFjdERhdGEodmZNb2R1bGVBZXJ0aWZhY3QsIHBheWxvYWRXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSkpOworCQkJaWYgKGVpdGhlclBheWxvYWQuaXNMZWZ0KCkpIHsKKwkJCQlyZXN1bHQgPSBlaXRoZXJQYXlsb2FkLmxlZnQoKS52YWx1ZSgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVpdGhlclBheWxvYWQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlVmZNb2R1bGVBcnRpZmFjdChVc2VyIG1vZGlmaWVyLCBDb21wb25lbnRJbnN0YW5jZSBjdXJyVkYsIFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHZmTW9kdWxlUGF5bG9hZFN0cmluZykgeworCisJCUFydGlmYWN0RGVmaW5pdGlvbiB2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbiA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oKTsKKworCQl2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbigiQXV0by1nZW5lcmF0ZWQgVkYgTW9kdWxlcyBpbmZvcm1hdGlvbiBhcnRpZmFjdCIpOworCQl2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbi5zZXRBcnRpZmFjdERpc3BsYXlOYW1lKCJWZiBNb2R1bGVzIE1ldGFkYXRhIik7CisJCXZmTW9kdWxlQXJ0aWZhY3REZWZpbml0aW9uLnNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtLlZGX01PRFVMRVNfTUVUQURBVEEuZ2V0VHlwZSgpKTsKKwkJdmZNb2R1bGVBcnRpZmFjdERlZmluaXRpb24uc2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpOworCQl2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbi5zZXRBcnRpZmFjdExhYmVsKCJ2Zk1vZHVsZXNNZXRhZGF0YSIpOworCQl2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbi5zZXRUaW1lb3V0KDApOworCQl2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbi5zZXRBcnRpZmFjdE5hbWUoY3VyclZGLmdldE5vcm1hbGl6ZWROYW1lKCkgKyAiX21vZHVsZXMuanNvbiIpOworCQl2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbi5zZXRQYXlsb2FkRGF0YSh2Zk1vZHVsZVBheWxvYWRTdHJpbmcpOworCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEFyaWZhY3RUb0NvbXBvbmVudCA9IGFydGlmYWN0T3BlcmF0aW9uLmFkZEFyaWZhY3RUb0NvbXBvbmVudCh2Zk1vZHVsZUFydGlmYWN0RGVmaW5pdGlvbiwgY3VyclZGLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCB0cnVlLCB0cnVlKTsKKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0OworCQlpZiAoYWRkQXJpZmFjdFRvQ29tcG9uZW50LmlzTGVmdCgpKSB7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChhZGRBcmlmYWN0VG9Db21wb25lbnQubGVmdCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoYWRkQXJpZmFjdFRvQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdGVIZWF0RW52QXJ0aWZhY3RzKFNlcnZpY2Ugc2VydmljZSwgVXNlciBtb2RpZmllciwgYm9vbGVhbiBzaG91bGRMb2NrKSB7CisKKwkJRnVuY3Rpb248Q29tcG9uZW50SW5zdGFuY2UsIExpc3Q8QXJ0aWZhY3RHZW5lcmF0b3I8QXJ0aWZhY3REZWZpbml0aW9uPj4+IGFydGlmYWN0VGFza0dlbmVyYXRvckNyZWF0b3IgPSByZXNvdXJjZUluc3RhbmNlIC0+CisJCS8vIEdldCBBbGwgRGVwbG95bWVudCBBcnRpZmFjdHMKKwkJc2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKS5zdHJlYW0oKS5maWx0ZXIocmkgLT4gcmkgIT0gbnVsbCAmJiByaSA9PSByZXNvdXJjZUluc3RhbmNlKS5maWx0ZXIocmkgLT4gcmkuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpICE9IG51bGwpLmZsYXRNYXAocmkgLT4gcmkuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLnZhbHVlcygpLnN0cmVhbSgpKS4KKwkJLy8gRmlsdGVyIGluIE9ubHkgSGVhdCBFbnYKKwkJCQlmaWx0ZXIoZGVwQXJ0aWZhY3QgLT4gQXJ0aWZhY3RUeXBlRW51bS5IRUFUX0VOVi5nZXRUeXBlKCkuZXF1YWxzKGRlcEFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpKSkuCisJCQkJLy8gQ3JlYXRlIEFydGlmYWN0R2VuZXJhdG9yIGZyb20gdGhvc2UgQXJ0aWZhY3RzCisJCQkJbWFwKGRlcEFydGlmYWN0IC0+IG5ldyBIZWF0RW52QXJ0aWZhY3RHZW5lcmF0b3IoZGVwQXJ0aWZhY3QsIHNlcnZpY2UsIHJlc291cmNlSW5zdGFuY2UuZ2V0TmFtZSgpLCBtb2RpZmllciwgc2hvdWxkTG9jaykpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJcmV0dXJuIGdlbmVyYXRlRGVwbG95bWVudEFydGlmYWN0cyhzZXJ2aWNlLCBtb2RpZmllciwgYXJ0aWZhY3RUYXNrR2VuZXJhdG9yQ3JlYXRvcik7CisKKwl9CisKKwlwcml2YXRlIDxDYWxsVmFsPiBFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGdlbmVyYXRlRGVwbG95bWVudEFydGlmYWN0cyhTZXJ2aWNlIHNlcnZpY2UsIFVzZXIgbW9kaWZpZXIsIEZ1bmN0aW9uPENvbXBvbmVudEluc3RhbmNlLCBMaXN0PEFydGlmYWN0R2VuZXJhdG9yPENhbGxWYWw+Pj4gYXJ0aWZhY3RUYXNrR2VuZXJhdG9yQ3JlYXRvcikgeworCisJCUxpc3Q8RnV0dXJlPEVpdGhlcjxDYWxsVmFsLCBSZXNwb25zZUZvcm1hdD4+PiBhbGxGdXR1cmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJLy8gR2V0IEZsYXQgTGlzdCBvZiAoQ2FsbGFibGUpIEFydGlmYWN0R2VuZXJhdG9yIGZvciBhbGwgdGhlIFJJIGluIHRoZQorCQkvLyBzZXJ2aWNlCisJCWlmIChzZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpICE9IG51bGwpIHsKKwkJCUxpc3Q8QXJ0aWZhY3RHZW5lcmF0b3I8Q2FsbFZhbD4+IGFydGlmYWN0R2VuTGlzdCA9IHNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc3RyZWFtKCkuZmxhdE1hcChyaSAtPiBhcnRpZmFjdFRhc2tHZW5lcmF0b3JDcmVhdG9yLmFwcGx5KHJpKS5zdHJlYW0oKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCWlmIChhcnRpZmFjdEdlbkxpc3QgIT0gbnVsbCAmJiAhYXJ0aWZhY3RHZW5MaXN0LmlzRW1wdHkoKSkgeworCQkJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woYXJ0aWZhY3RHZW5MaXN0LnNpemUoKSk7CisKKwkJCQlhcnRpZmFjdEdlbkxpc3Quc3RyZWFtKCkuZm9yRWFjaChlIC0+IGFsbEZ1dHVyZXMuYWRkKGV4ZWN1dG9yLnN1Ym1pdChlKSkpOworCisJCQkJYm9vbGVhbiBpc1N1Y2Nlc3MgPSB0cnVlOworCQkJCVJlc3BvbnNlRm9ybWF0IGZpcnN0RXJyb3IgPSBudWxsOworCQkJCWZvciAoRnV0dXJlPEVpdGhlcjxDYWxsVmFsLCBSZXNwb25zZUZvcm1hdD4+IGVudHJ5IDogYWxsRnV0dXJlcykgeworCQkJCQl0cnkgeworCQkJCQkJRWl0aGVyPENhbGxWYWwsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25TdGF0dXMgPSBlbnRyeS5nZXQoMjAsIFRpbWVVbml0LlNFQ09ORFMpOworCQkJCQkJaWYgKGFjdGlvblN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlpc1N1Y2Nlc3MgPSBmYWxzZTsKKwkJCQkJCQlpZiAoZmlyc3RFcnJvciA9PSBudWxsKSB7CisJCQkJCQkJCWZpcnN0RXJyb3IgPSBhY3Rpb25TdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQkJCX0KKwkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZW5lcmF0ZSBhcnRpZmFjdCBlcnJvciA6IHt9IiwgYWN0aW9uU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjb2xsZWN0IHJlc3VsdCBmcm9tIGFydGlmYWN0IGdlbmVyYXRvciAiLCBlKTsKKwkJCQkJCWlzU3VjY2VzcyA9IGZhbHNlOworCQkJCQkJZmlyc3RFcnJvciA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJCX0KKwkJCQl9CisJCQkJZXhlY3V0b3Iuc2h1dGRvd24oKTsKKwkJCQlpZiAoIWlzU3VjY2VzcykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZpcnN0RXJyb3IpOworCQkJCX0KKwkJCX0KKworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlKTsKKwl9CisKKwlhYnN0cmFjdCBjbGFzcyBBcnRpZmFjdEdlbmVyYXRvcjxDYWxsVmFsPiBpbXBsZW1lbnRzIENhbGxhYmxlPEVpdGhlcjxDYWxsVmFsLCBSZXNwb25zZUZvcm1hdD4+IHsKKworCX0KKworCWNsYXNzIEhlYXRFbnZBcnRpZmFjdEdlbmVyYXRvciBleHRlbmRzIEFydGlmYWN0R2VuZXJhdG9yPEFydGlmYWN0RGVmaW5pdGlvbj4geworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uOworCQlTZXJ2aWNlIHNlcnZpY2U7CisJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZTsKKwkJVXNlciBtb2RpZmllcjsKKwkJYm9vbGVhbiBzaG91bGRMb2NrOworCisJCUhlYXRFbnZBcnRpZmFjdEdlbmVyYXRvcihBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uLCBTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwgVXNlciBtb2RpZmllciwgYm9vbGVhbiBzaG91bGRMb2NrKSB7CisJCQl0aGlzLmFydGlmYWN0RGVmaW5pdGlvbiA9IGFydGlmYWN0RGVmaW5pdGlvbjsKKwkJCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7CisJCQl0aGlzLnJlc291cmNlSW5zdGFuY2VOYW1lID0gcmVzb3VyY2VJbnN0YW5jZU5hbWU7CisJCQl0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7CisJCQl0aGlzLnNob3VsZExvY2sgPSBzaG91bGRMb2NrOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworCQkJcmV0dXJuIGFydGlmYWN0c0J1c2luZXNzTG9naWMuZ2VuZXJhdGVIZWF0RW52QXJ0aWZhY3QoYXJ0aWZhY3REZWZpbml0aW9uLCBzZXJ2aWNlLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgbW9kaWZpZXIsIHNob3VsZExvY2spOworCQl9CisKKwkJcHVibGljIEFydGlmYWN0RGVmaW5pdGlvbiBnZXRBcnRpZmFjdERlZmluaXRpb24oKSB7CisJCQlyZXR1cm4gYXJ0aWZhY3REZWZpbml0aW9uOworCQl9CisKKwl9CisKKwljbGFzcyBWZk1vZHVsZUFydGlmYWNHZW5lcmF0b3IgZXh0ZW5kcyBBcnRpZmFjdEdlbmVyYXRvcjxBcnRpZmFjdERlZmluaXRpb24+IHsKKwkJcHJpdmF0ZSBVc2VyIHVzZXI7CisJCXByaXZhdGUgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2U7CisJCXByaXZhdGUgU2VydmljZSBzZXJ2aWNlOworCQlib29sZWFuIHNob3VsZExvY2s7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworCQkJcmV0dXJuIGdlbmVyYXRlVmZNb2R1bGVBcnRpZmFjdCh1c2VyLCBjb21wb25lbnRJbnN0YW5jZSwgc2VydmljZSwgc2hvdWxkTG9jayk7CisJCX0KKworCQlwcml2YXRlIFZmTW9kdWxlQXJ0aWZhY0dlbmVyYXRvcihVc2VyIHVzZXIsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBTZXJ2aWNlIHNlcnZpY2UsIGJvb2xlYW4gc2hvdWxkTG9jaykgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMudXNlciA9IHVzZXI7CisJCQl0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50SW5zdGFuY2U7CisJCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOworCQkJdGhpcy5zaG91bGRMb2NrID0gc2hvdWxkTG9jazsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGVja0Rpc3RyaWJ1dGlvbkFuZERlcGxveShTdHJpbmcgZGlkLCBVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEFjdGlvbiwgU2VydmljZSBzZXJ2aWNlKSB7CisJCWJvb2xlYW4gaXNEZXBsb3llZCA9IGlzRGlzdHJpYnV0aW9uRGVwbG95ZWQoZGlkLCBzZXJ2aWNlKTsKKwkJaWYgKGlzRGVwbG95ZWQpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlKTsKKwkJfQorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGRpc3RyaWJ1dGlvblN1Y2Nlc3MgPSBjaGVja0Rpc3RyaWJ1dGlvblN1Y2Nlc3MoZGlkLCB1c2VyLCBhdWRpdEFjdGlvbiwgc2VydmljZSk7CisJCWlmIChkaXN0cmlidXRpb25TdWNjZXNzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChkaXN0cmlidXRpb25TdWNjZXNzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlsb2cuZGVidWcoIm1hcmsgZGlzdHJpYnV0aW9uIHt9IGFzIGRlcGxveWVkIC0gc3VjY2VzcyIsIGRpZCk7CisJCWNvbXBvbmVudHNVdGlscy5hdWRpdFNlcnZpY2VEaXN0cmlidXRpb25EZXBsb3llZChhdWRpdEFjdGlvbiwgc2VydmljZS5nZXROYW1lKCksIHNlcnZpY2UuZ2V0VmVyc2lvbigpLCBzZXJ2aWNlLmdldFVVSUQoKSwgZGlkLCBTVEFUVVNfREVQTE9ZRUQsICJPSyIsIHVzZXIpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoc2VydmljZSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRGlzdHJpYnV0aW9uRGVwbG95ZWQoU3RyaW5nIGRpZCwgU2VydmljZSBzZXJ2aWNlKSB7CisJCUVpdGhlcjxMaXN0PERpc3RyaWJ1dGlvbkRlcGxveUV2ZW50PiwgQWN0aW9uU3RhdHVzPiBhbHJlYWR5RGVwbG95ZWQgPSBhdWRpdENhc3NhbmRyYURhby5nZXREaXN0cmlidXRpb25EZXBsb3lCeVN0YXR1cyhkaWQsIEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fREVQTE9ZLmdldE5hbWUoKSwgU1RBVFVTX0RFUExPWUVEKTsKKworCQlib29sZWFuIGlzRGVwbG95ZWQgPSBmYWxzZTsKKwkJaWYgKGFscmVhZHlEZXBsb3llZC5pc0xlZnQoKSAmJiAhYWxyZWFkeURlcGxveWVkLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSkgeworCQkJLy8gYWxyZWFkeSBkZXBsb3llZAorCQkJbG9nLmRlYnVnKCJkaXN0cmlidXRpb24ge30gaXMgYWxyZWFkeSBkZXBsb3llZCIsIGRpZCk7CisJCQlpc0RlcGxveWVkID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gaXNEZXBsb3llZDsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjaGVja0Rpc3RyaWJ1dGlvblN1Y2Nlc3MoU3RyaW5nIGRpZCwgVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRBY3Rpb24sIFNlcnZpY2Ugc2VydmljZSkgeworCisJCWxvZy50cmFjZSgiY2hlY2tEaXN0cmlidXRpb25TdWNjZXNzIik7CisJCS8vIGdldCBhbGwgIkRSZXF1ZXN0IiByZWNvcmRzIGZvciB0aGlzIGRpc3RyaWJ1dGlvbgorCQkvLyBFaXRoZXI8TGlzdDxFU1RpbWVCYXNlZEV2ZW50PiwgQWN0aW9uU3RhdHVzPiBkaXN0UmVxdWVzdHNSZXNwb25zZSA9CisJCS8vIGF1ZGl0aW5nRGFvLmdldExpc3RPZkRpc3RyaWJ1dGlvbkJ5QWN0aW9uKGRpZCwKKwkJLy8gQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9TVEFURV9DSEFOR0VfUkVRVUVTVC5nZXROYW1lKCksICIiLAorCQkvLyBSZXNvdXJjZUFkbWluRXZlbnQuY2xhc3MpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGRpc3RSZXF1ZXN0c1Jlc3BvbnNlID0gYXVkaXRDYXNzYW5kcmFEYW8uZ2V0RGlzdHJpYnV0aW9uUmVxdWVzdChkaWQsIEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fU1RBVEVfQ0hBTkdFX1JFUVVFU1QuZ2V0TmFtZSgpKTsKKwkJaWYgKGRpc3RSZXF1ZXN0c1Jlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBhdWRpdERlcGxveUVycm9yKGRpZCwgdXNlciwgYXVkaXRBY3Rpb24sIHNlcnZpY2UsIGRpc3RSZXF1ZXN0c1Jlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCisJCUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiBkaXN0cmlidXRpb25SZXF1ZXN0cyA9IGRpc3RSZXF1ZXN0c1Jlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoZGlzdHJpYnV0aW9uUmVxdWVzdHMuaXNFbXB0eSgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEaXN0cmlidXRpb25NaXNzaW5nRXJyb3IsICJtYXJrRGlzdHJpYnV0aW9uQXNEZXBsb3llZCIsIGRpZCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEaXN0cmlidXRpb25NaXNzaW5nRXJyb3IoIm1hcmtEaXN0cmlidXRpb25Bc0RlcGxveWVkIiwgZGlkKTsKKwkJCWxvZy5pbmZvKCJkaXN0cmlidXRpb24ge30gaXMgbm90IGZvdW5kIiwgZGlkKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gYXVkaXREZXBsb3lFcnJvcihkaWQsIHVzZXIsIGF1ZGl0QWN0aW9uLCBzZXJ2aWNlLCBBY3Rpb25TdGF0dXMuRElTVFJJQlVUSU9OX1JFUVVFU1RFRF9OT1RfRk9VTkQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJCX0KKwkJYm9vbGVhbiBpc1JlcXVlc3RTdWNjZWVkZWQgPSBmYWxzZTsKKwkJZm9yIChSZXNvdXJjZUFkbWluRXZlbnQgZXZlbnQgOiBkaXN0cmlidXRpb25SZXF1ZXN0cykgeworCQkJU3RyaW5nIGV2ZW50U3RhdHVzID0gZXZlbnQuZ2V0U3RhdHVzKCk7CisJCQlpZiAoZXZlbnRTdGF0dXMgIT0gbnVsbCAmJiBldmVudFN0YXR1cy5lcXVhbHMoU1RBVFVTX1NVQ0NFU1NfMjAwKSkgeworCQkJCWlzUmVxdWVzdFN1Y2NlZWRlZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBnZXQgYWxsICJETm90aWZ5IiByZWNvcmRzIGZvciB0aGlzIGRpc3RyaWJ1dGlvbgorCQkvLyBFaXRoZXI8TGlzdDxFU1RpbWVCYXNlZEV2ZW50PiwgQWN0aW9uU3RhdHVzPgorCQkvLyBkaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlID0KKwkJLy8gYXVkaXRpbmdEYW8uZ2V0TGlzdE9mRGlzdHJpYnV0aW9uQnlBY3Rpb24oZGlkLAorCQkvLyBBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX05PVElGWS5nZXROYW1lKCksICIiLAorCQkvLyBEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudC5jbGFzcyk7CisJCUVpdGhlcjxMaXN0PERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50PiwgQWN0aW9uU3RhdHVzPiBkaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlID0gYXVkaXRDYXNzYW5kcmFEYW8uZ2V0RGlzdHJpYnV0aW9uTm90aWZ5KGRpZCwgQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9OT1RJRlkuZ2V0TmFtZSgpKTsKKwkJaWYgKGRpc3ROb3RpZmljYXRpb25zUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGF1ZGl0RGVwbG95RXJyb3IoZGlkLCB1c2VyLCBhdWRpdEFjdGlvbiwgc2VydmljZSwgZGlzdE5vdGlmaWNhdGlvbnNSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJCX0KKworCQlMaXN0PERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50PiBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25zID0gZGlzdE5vdGlmaWNhdGlvbnNSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYm9vbGVhbiBpc05vdGlmaWNhdGlvbnNTdWNjZWVkZWQgPSBmYWxzZTsKKwkJZm9yIChEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudCBldmVudCA6IGRpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbnMpIHsKKwkJCVN0cmluZyBldmVudFN0YXR1cyA9IGV2ZW50LmdldFN0YXR1cygpOworCQkJaWYgKGV2ZW50U3RhdHVzICE9IG51bGwgJiYgZXZlbnRTdGF0dXMuZXF1YWxzKFNUQVRVU19TVUNDRVNTXzIwMCkpIHsKKwkJCQlpc05vdGlmaWNhdGlvbnNTdWNjZWVkZWQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gaWYgcmVxdWVzdCBmYWlsZWQgT1IgdGhlcmUgYXJlIG5vdGlmaWNhdGlvbnMgdGhhdCBmYWlsZWQKKwkJaWYgKCEoaXNSZXF1ZXN0U3VjY2VlZGVkICYmIGlzTm90aWZpY2F0aW9uc1N1Y2NlZWRlZCkpIHsKKworCQkJbG9nLmluZm8oImRpc3RyaWJ1dGlvbiB7fSBoYXMgZmFpbGVkIiwgZGlkKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5ESVNUUklCVVRJT05fUkVRVUVTVEVEX0ZBSUxFRCwgZGlkKTsKKwkJCWF1ZGl0RGVwbG95RXJyb3IoZGlkLCB1c2VyLCBhdWRpdEFjdGlvbiwgc2VydmljZSwgQWN0aW9uU3RhdHVzLkRJU1RSSUJVVElPTl9SRVFVRVNURURfRkFJTEVELCBkaWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgUmVzcG9uc2VGb3JtYXQgYXVkaXREZXBsb3lFcnJvcihTdHJpbmcgZGlkLCBVc2VyIHVzZXIsIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdEFjdGlvbiwgU2VydmljZSBzZXJ2aWNlLCBBY3Rpb25TdGF0dXMgc3RhdHVzLCBTdHJpbmcuLi4gcGFyYW1zKSB7CisKKwkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoc3RhdHVzLCBwYXJhbXMpOworCQlTdHJpbmcgbWVzc2FnZSA9ICIiOworCQlpZiAoZXJyb3IuZ2V0TWVzc2FnZUlkKCkgIT0gbnVsbCkgeworCQkJbWVzc2FnZSA9IGVycm9yLmdldE1lc3NhZ2VJZCgpICsgIjogIjsKKwkJfQorCQltZXNzYWdlICs9IGVycm9yLmdldEZvcm1hdHRlZE1lc3NhZ2UoKTsKKworCQlpZiAoc2VydmljZSAhPSBudWxsKSB7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRTZXJ2aWNlRGlzdHJpYnV0aW9uRGVwbG95ZWQoYXVkaXRBY3Rpb24sIHNlcnZpY2UuZ2V0TmFtZSgpLCBzZXJ2aWNlLmdldFZlcnNpb24oKSwgc2VydmljZS5nZXRVVUlEKCksIGRpZCwgZXJyb3IuZ2V0U3RhdHVzKCkudG9TdHJpbmcoKSwgbWVzc2FnZSwgdXNlcik7CisJCX0gZWxzZSB7CisJCQljb21wb25lbnRzVXRpbHMuYXVkaXRTZXJ2aWNlRGlzdHJpYnV0aW9uRGVwbG95ZWQoYXVkaXRBY3Rpb24sICIiLCAiIiwgIiIsIGRpZCwgZXJyb3IuZ2V0U3RhdHVzKCkudG9TdHJpbmcoKSwgbWVzc2FnZSwgdXNlcik7CisJCX0KKwkJcmV0dXJuIGVycm9yOworCX0KKworCXByaXZhdGUgRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJvbGVGb3JEZXBsb3koU3RyaW5nIGRpZCwgVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRBY3Rpb24sIFNlcnZpY2Ugc2VydmljZSkgeworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdG9yID0gdXNlckFkbWluLmdldFVzZXIodXNlci5nZXRVc2VySWQoKSwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkgfHwgZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVVc2VyTWlzc2luZ0Vycm9yLCAiRGVwbG95IFNlcnZpY2UiLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVVzZXJNaXNzaW5nRXJyb3IoIkRlcGxveSBTZXJ2aWNlIiwgdXNlci5nZXRVc2VySWQoKSk7CisJCQlsb2cuZGVidWcoInZhbGlkYXRlUm9sZUZvckRlcGxveSBtZXRob2QgLSB1c2VyIGlzIG5vdCBsaXN0ZWQuIHVzZXJJZD17fSIsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5ELCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCWF1ZGl0RGVwbG95RXJyb3IoZGlkLCB1c2VyLCBhdWRpdEFjdGlvbiwgc2VydmljZSwgQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXVzZXIgPSBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpOworCQlsb2cuZGVidWcoInZhbGlkYXRlIHVzZXIgcm9sZSIpOworCQlMaXN0PFJvbGU+IHJvbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJvbGVzLmFkZChSb2xlLkFETUlOKTsKKwkJcm9sZXMuYWRkKFJvbGUuT1BTKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlVXNlclJvbGUodXNlciwgc2VydmljZSwgcm9sZXMsIGF1ZGl0QWN0aW9uLCBudWxsKTsKKwkJaWYgKHZhbGlkYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmluZm8oInJvbGUge30gaXMgbm90IGFsbG93ZWQgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbiIsIHVzZXIuZ2V0Um9sZSgpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCQlhdWRpdERlcGxveUVycm9yKGRpZCwgdXNlciwgYXVkaXRBY3Rpb24sIHNlcnZpY2UsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodXNlcik7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXREZXBsb3ltZW50QXJ0aWZhY3RzUGxhY2VIb2xkZXIoQ29tcG9uZW50IGNvbXBvbmVudCwgVXNlciB1c2VyKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlTWFya2VkQ29tcG9uZW50cygpIHsKKwkJcmV0dXJuIGRlbGV0ZU1hcmtlZENvbXBvbmVudHMoQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJfQorCisJcHJpdmF0ZSBIZWFsdGhDaGVja0J1c2luZXNzTG9naWMgZ2V0SGVhbHRoQ2hlY2tCTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlIZWFsdGhDaGVja0J1c2luZXNzTG9naWMgaGVhbHRoQ2hlY2tCbCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKEhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJCXJldHVybiBoZWFsdGhDaGVja0JsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgZ2V0Q29tcG9uZW50SW5zdGFuY2VCTCgpIHsKKwkJcmV0dXJuIHNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgUmVzcG9uc2VGb3JtYXQ+IGdldENvbXBvbmVudEluc3RhbmNlc0ZpbHRlcmVkQnlQcm9wZXJ0aWVzQW5kSW5wdXRzKFN0cmluZyBjb21wb25lbnRJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyB1c2VySWQsIFN0cmluZyBzZWFyY2hUZXh0KSB7CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiByZXNwID0gdmFsaWRhdGVVc2VyRXhpc3RzKHVzZXJJZCwgIkdldCBDb21wb25lbnQgSW5zdGFuY2VzIiwgZmFsc2UpOworCQlpZiAocmVzcC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlRW51bSk7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRJbnN0YW5jZXNSZXNwb25zZSA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRBbGxDb21wb25lbnRJbnN0bmNlc01ldGFkYXRhKGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlRW51bS5nZXROb2RlVHlwZSgpKTsKKwkJaWYgKGNvbXBvbmVudEluc3RhbmNlc1Jlc3BvbnNlLmlzUmlnaHQoKSkgeworCisJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZT4oKSk7CisJCQl9CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UoY29tcG9uZW50SW5zdGFuY2VzUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IGNvbXBvbmVudEluc3RhbmNlc1Jlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQljb21wb25lbnRJbnN0YW5jZXMgPSBjb21wb25lbnRJbnN0YW5jZXMuc3RyZWFtKCkuZmlsdGVyKGluc3RhbmNlIC0+IGluc3RhbmNlLmdldE9yaWdpblR5cGUoKS5lcXVhbHMoT3JpZ2luVHlwZUVudW0uVkYpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnRJbnN0YW5jZXMpOworCX0KKworCXB1YmxpYyBJQ2FjaGVNYW5nZXJPcGVyYXRpb24gZ2V0Q2FjaGVNYW5hZ2VyT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhY2hlTWFuYWdlck9wZXJhdGlvbihJQ2FjaGVNYW5nZXJPcGVyYXRpb24gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uKSB7CisJCXRoaXMuY2FjaGVNYW5hZ2VyT3BlcmF0aW9uID0gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvU2VydmljZUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9TZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyY2YwMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvU2VydmljZUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoInNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMiKQorcHVibGljIGNsYXNzIFNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgZXh0ZW5kcyBDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbGxvd2VkVG9Db250YWluQ29tcEluc3RhbmNlcyhvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50KSB7CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTm9kZVR5cGVFbnVtIGdldE5vZGVUeXBlT2ZDb21wb25lbnRJbnN0YW5jZU9yaWdpbigpIHsKKwkJcmV0dXJuIE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbnRhaW5lckNvbXBvbmVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHNlcnZpY2VPcGVyYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvbmVudE9wZXJhdGlvbiBnZXRDb21wSW5zdE9yaWdpbkNvbXBvbmVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHJlc291cmNlT3BlcmF0aW9uOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb25lbnRUeXBlRW51bSBnZXRDb21wb25lbnRUeXBlT2ZDb21wb25lbnRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX0lOU1RBTkNFOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvVkZDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvVkZDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQyODk3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9WRkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgidmZDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMiKQorcHVibGljIGNsYXNzIFZGQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGV4dGVuZHMgQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihWRkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbGxvd2VkVG9Db250YWluQ29tcEluc3RhbmNlcyhvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29udGFpbmVyQ29tcG9uZW50KSB7CisJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBjb250YWluZXJDb21wb25lbnQ7CisJCVJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCk7CisJCWlmIChSZXNvdXJjZVR5cGVFbnVtLlZGICE9IHJlc291cmNlVHlwZSkgeworCQkJbG9nLmRlYnVnKCJDYW5ub3QgYXR0YWNoIHJlc291cmNlIGluc3RhbmNlcyB0byBjb250YWluZXIgcmVzb3VyY2Ugb2YgdHlwZSB7fSIsIHJlc291cmNlVHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfQ0FOTk9UX0NPTlRBSU5fUkVTT1VSQ0VfSU5TVEFOQ0VTLCByZXNvdXJjZVR5cGUuZ2V0VmFsdWUoKSkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTm9kZVR5cGVFbnVtIGdldE5vZGVUeXBlT2ZDb21wb25lbnRJbnN0YW5jZU9yaWdpbigpIHsKKwkJcmV0dXJuIE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbnRhaW5lckNvbXBvbmVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHJlc291cmNlT3BlcmF0aW9uOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb25lbnRPcGVyYXRpb24gZ2V0Q29tcEluc3RPcmlnaW5Db21wb25lbnRPcGVyYXRpb24oKSB7CisJCXJldHVybiByZXNvdXJjZU9wZXJhdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9uZW50VHlwZUVudW0gZ2V0Q29tcG9uZW50VHlwZU9mQ29tcG9uZW50SW5zdGFuY2UoKSB7CisJCXJldHVybiBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvbi5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0NlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1YjNhOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlQ3ljbGVUcmFuc2l0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JTGlmZWN5Y2xlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGlvbkNoYW5nZVRyYW5zaXRpb24gZXh0ZW5kcyBMaWZlQ3ljbGVUcmFuc2l0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBMaWZlY3ljbGVTdGF0ZUVudW0gbmV4dFN0YXRlOworCXByaXZhdGUgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0gbmFtZTsKKwlwcml2YXRlIEF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbjsKKwlwcml2YXRlIEFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTWFuYWdlcjsKKworCXB1YmxpYyBDZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvbihMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bSBuYW1lLCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHMsIElMaWZlY3ljbGVPcGVyYXRpb24gbGlmZWN5Y2xlT3BlcmF0aW9uKSB7CisJCXN1cGVyKGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24pOworCisJCXRoaXMubmFtZSA9IG5hbWU7CisKKwkJLy8gYXV0aG9yaXplZCByb2xlcworCQlSb2xlW10gY2VydGlmaWNhdGlvbkNoYW5nZVJvbGVzID0geyBSb2xlLkFETUlOLCBSb2xlLlRFU1RFUiB9OworCQlhZGRBdXRob3JpemVkUm9sZXMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIEFycmF5cy5hc0xpc3QoY2VydGlmaWNhdGlvbkNoYW5nZVJvbGVzKSk7CisJCWFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCBBcnJheXMuYXNMaXN0KGNlcnRpZmljYXRpb25DaGFuZ2VSb2xlcykpOworCQkvLyBUT0RPIHRvIGJlIGxhdGVyIGRlZmluZWQgZm9yIHByb2R1Y3QKKworCQlzd2l0Y2ggKHRoaXMubmFtZSkgeworCQljYXNlIENFUlRJRlk6CisJCQl0aGlzLmF1ZGl0aW5nQWN0aW9uID0gQXVkaXRpbmdBY3Rpb25FbnVtLkNFUlRJRklDQVRJT05fU1VDQ0VTU19SRVNPVVJDRTsKKwkJCXRoaXMubmV4dFN0YXRlID0gTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRDsKKwkJCWJyZWFrOworCQljYXNlIEZBSUxfQ0VSVElGSUNBVElPTjoKKwkJCXRoaXMuYXVkaXRpbmdBY3Rpb24gPSBBdWRpdGluZ0FjdGlvbkVudW0uRkFJTF9DRVJUSUZJQ0FUSU9OX1JFU09VUkNFOworCQkJbmV4dFN0YXRlID0gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTjsKKwkJCWJyZWFrOworCQljYXNlIENBTkNFTF9DRVJUSUZJQ0FUSU9OOgorCQkJdGhpcy5hdWRpdGluZ0FjdGlvbiA9IEF1ZGl0aW5nQWN0aW9uRW51bS5DQU5DRUxfQ0VSVElGSUNBVElPTl9SRVNPVVJDRTsKKwkJCW5leHRTdGF0ZSA9IExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bSBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQXVkaXRpbmdBY3Rpb25FbnVtIGdldEF1ZGl0aW5nQWN0aW9uKCkgeworCQlyZXR1cm4gYXVkaXRpbmdBY3Rpb247CisJfQorCisJcHVibGljIEFydGlmYWN0c0J1c2luZXNzTG9naWMgZ2V0QXJ0aWZhY3RzTWFuYWdlcigpIHsKKwkJcmV0dXJuIGFydGlmYWN0c01hbmFnZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RzTWFuYWdlcihBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c01hbmFnZXIpIHsKKwkJdGhpcy5hcnRpZmFjdHNNYW5hZ2VyID0gYXJ0aWZhY3RzTWFuYWdlcjsKKwl9CisKKwlwcml2YXRlIFJlc3BvbnNlRm9ybWF0IGZvcm1hdENlcnRpZmljYXRpb25FcnJvcihDb21wb25lbnQgY29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3BvbnNlLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLCAiQ2hhbmdlIExpZmVjeWNsZVN0YXRlIC0gQ2VydGlmeSBmYWlsZWQgb24gZ3JhcGgiKTsKKwkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkNoYW5nZSBMaWZlY3ljbGVTdGF0ZSAtIENlcnRpZnkgZmFpbGVkIG9uIGdyYXBoIik7CisJCWxvZy5kZWJ1ZygiY2VydGlmaWNhdGlvbiBjaGFuZ2UgZmFpbGVkIG9uIGdyYXBoIik7CisKKwkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudFV0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5Q29tcG9uZW50KGFjdGlvblN0YXR1cywgY29tcG9uZW50LCBjb21wb25lbnRUeXBlKTsKKwkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0gb2xkU3RhdGUsIExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGxpZmVjeWNsZUNoYW5nZUluZm8pIHsKKwkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKTsKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSBiZWZvcmUgY2VydGlmaWNhdGlvbiBjaGFuZ2UuIHJlc291cmNlIG5hbWU9e30sIG9sZFN0YXRlPXt9LCBvd25lciB1c2VySWQ9e30iLCBjb21wb25lbnROYW1lLCBvbGRTdGF0ZSwgb3duZXIuZ2V0VXNlcklkKCkpOworCisJCS8vIHZhbGlkYXRlIHVzZXIKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB1c2VyVmFsaWRhdGlvblJlc3BvbnNlID0gdXNlclJvbGVWYWxpZGF0aW9uKG1vZGlmaWVyLCBjb21wb25lbnRUeXBlLCBsaWZlY3ljbGVDaGFuZ2VJbmZvKTsKKwkJaWYgKHVzZXJWYWxpZGF0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gdXNlclZhbGlkYXRpb25SZXNwb25zZTsKKwkJfQorCisJCWlmICghb2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05PVF9SRUFEWV9GT1JfQ0VSVElGSUNBVElPTiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCisJCWlmIChvbGRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpICYmICFtb2RpZmllci5lcXVhbHMob3duZXIpICYmICFtb2RpZmllci5nZXRSb2xlKCkuZXF1YWxzKFJvbGUuQURNSU4ubmFtZSgpKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NFUlRfSU5fUFJPR1JFU1NfU1RBVEUsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudFR5cGUubmFtZSgpLnRvTG93ZXJDYXNlKCksIG93bmVyLmdldEZpcnN0TmFtZSgpLCBvd25lci5nZXRMYXN0TmFtZSgpLCBvd25lci5nZXRVc2VySWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnRCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEJsLCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCWxvZy5pbmZvKCJzdGFydCBwZXJmb3JtaW5nIGNlcnRpZmljYXRpb24gY2hhbmdlIGZvciByZXNvdXJjZSB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUgPSBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisKKwkJdHJ5IHsKKwkJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjZXJ0aWZpY2F0aW9uQ2hhbmdlUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlpZiAobmV4dFN0YXRlLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKSkgeworCQkJCWNlcnRpZmljYXRpb25DaGFuZ2VSZXN1bHQgPSBsaWZlQ3ljbGVPcGVyYXRpb24uY2VydGlmeUNvbXBvbmVudChub2RlVHlwZSwgY29tcG9uZW50LCBtb2RpZmllciwgb3duZXIsIHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQljZXJ0aWZpY2F0aW9uQ2hhbmdlUmVzdWx0ID0gbGlmZUN5Y2xlT3BlcmF0aW9uLmNhbmNlbE9yRmFpbENlcnRpZmljYXRpb24obm9kZVR5cGUsIGNvbXBvbmVudCwgbW9kaWZpZXIsIG93bmVyLCBuZXh0U3RhdGUsIHRydWUpOworCQkJfQorCisJCQlpZiAoY2VydGlmaWNhdGlvbkNoYW5nZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGZvcm1hdENlcnRpZmljYXRpb25FcnJvcihjb21wb25lbnQsIGNlcnRpZmljYXRpb25DaGFuZ2VSZXN1bHQucmlnaHQoKS52YWx1ZSgpLCBjb21wb25lbnRUeXBlKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCWlmIChuZXh0U3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpKSB7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU9sZENvbXBvbmVudFZlcnNpb25zID0gbGlmZUN5Y2xlT3BlcmF0aW9uLmRlbGV0ZU9sZENvbXBvbmVudFZlcnNpb25zKG5vZGVUeXBlLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwKKwkJCQkJCWNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VVVJRCgpLCB0cnVlKTsKKwkJCQlpZiAoZGVsZXRlT2xkQ29tcG9uZW50VmVyc2lvbnMuaXNSaWdodCgpKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZm9ybWF0Q2VydGlmaWNhdGlvbkVycm9yKGNvbXBvbmVudCwgZGVsZXRlT2xkQ29tcG9uZW50VmVyc2lvbnMucmlnaHQoKS52YWx1ZSgpLCBjb21wb25lbnRUeXBlKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNlcnRpZmljYXRpb25DaGFuZ2VSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsICJDaGFuZ2UgTGlmZWN5Y2xlU3RhdGUiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiQ2hhbmdlIExpZmVjeWNsZVN0YXRlIik7CisJCQkJaWYgKGluVHJhbnNhY3Rpb24gPT0gZmFsc2UpIHsKKwkJCQkJbG9nLmRlYnVnKCJvcGVyYXRpb24gZmFpbGVkLiBkbyByb2xsYmFjayIpOworCQkJCQlsaWZlQ3ljbGVPcGVyYXRpb24uZ2V0UmVzb3VyY2VPcGVyYXRpb24oKS5nZXRUaXRhbkdlbmVyaWNEYW8oKS5yb2xsYmFjaygpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGluVHJhbnNhY3Rpb24gPT0gZmFsc2UpIHsKKwkJCQkJbG9nLmRlYnVnKCJvcGVyYXRpb24gc3VjY2Vzcy4gZG8gY29tbWl0Iik7CisJCQkJCWxpZmVDeWNsZU9wZXJhdGlvbi5nZXRSZXNvdXJjZU9wZXJhdGlvbigpLmdldFRpdGFuR2VuZXJpY0RhbygpLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGVsZXRlT2xkVmVyc2lvbihMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzVG9EZWxldGUsIFJlc291cmNlIHJlc291cmNlVG9EZWxldGUpIHsKKwkJUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb24gPSBsaWZlQ3ljbGVPcGVyYXRpb24uZ2V0UmVzb3VyY2VPcGVyYXRpb24oKTsKKworCQlFaXRoZXI8TGlzdDxBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdHNSZXMgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRDb21wb25lbnRBcnRpZmFjdHNGb3JEZWxldGUocmVzb3VyY2VUb0RlbGV0ZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUpOworCQlpZiAoYXJ0aWZhY3RzUmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGFydGlmYWN0c1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCX0KKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZXNvdXJjZVJlcyA9IHJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJlc291cmNlVG9EZWxldGUuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCWlmIChkZWxldGVSZXNvdXJjZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBkZWxldGVSZXNvdXJjZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCX0KKwkJYXJ0aWZhY3RzVG9EZWxldGUuYWRkQWxsKGFydGlmYWN0c1Jlcy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvQ2VydGlmaWNhdGlvblJlcXVlc3RUcmFuc2l0aW9uLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvQ2VydGlmaWNhdGlvblJlcXVlc3RUcmFuc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhOWNiZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DZXJ0aWZpY2F0aW9uUmVxdWVzdFRyYW5zaXRpb24uamF2YQpAQCAtMCwwICsxLDQwOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5TZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ29tcG9uZW50QnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuU2VydmljZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk9yaWdpblR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JTGlmZWN5Y2xlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNhcGFiaWxpdHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5Ub3NjYUV4cG9ydEhhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGlvblJlcXVlc3RUcmFuc2l0aW9uIGV4dGVuZHMgTGlmZUN5Y2xlVHJhbnNpdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2VydGlmaWNhdGlvblJlcXVlc3RUcmFuc2l0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIFNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyIHNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyOworCXByaXZhdGUgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisJcHJpdmF0ZSBTZXJ2aWNlQnVzaW5lc3NMb2dpYyBzZXJ2aWNlQnVzaW5lc3NMb2dpYzsKKwlwcml2YXRlIFRvc2NhRXhwb3J0SGFuZGxlciB0b3NjYUV4cG9ydFV0aWxzOworCisJcHVibGljIENlcnRpZmljYXRpb25SZXF1ZXN0VHJhbnNpdGlvbihDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHMsIElMaWZlY3ljbGVPcGVyYXRpb24gbGlmZWN5Y2xlT3BlcmF0aW9uLCBTZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlciBzZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlciwgU2VydmljZUJ1c2luZXNzTG9naWMgc2VydmljZUJ1c2luZXNzTG9naWMsCisJCQlDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb24sIFRvc2NhRXhwb3J0SGFuZGxlciB0b3NjYUV4cG9ydFV0aWxzKSB7CisJCXN1cGVyKGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24pOworCisJCS8vIGF1dGhvcml6ZWQgcm9sZXMKKwkJUm9sZVtdIHJlc291cmNlU2VydmljZUNoZWNrb3V0Um9sZXMgPSB7IFJvbGUuQURNSU4sIFJvbGUuREVTSUdORVIgfTsKKwkJLy8gUm9sZVtdIHByb2R1Y3RDaGVja291dFJvbGVzID0ge1JvbGUuQURNSU4sIFJvbGUuUFJPRFVDVF9NQU5BR0VSLAorCQkvLyBSb2xlLlBST0RVQ1RfU1RSQVRFR0lTVH07CisJCWFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgQXJyYXlzLmFzTGlzdChyZXNvdXJjZVNlcnZpY2VDaGVja291dFJvbGVzKSk7CisJCWFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCBBcnJheXMuYXNMaXN0KHJlc291cmNlU2VydmljZUNoZWNrb3V0Um9sZXMpKTsKKwkJLy8gVE9ETyB0byBiZSBsYXRlciBkZWZpbmVkIGZvciBwcm9kdWN0CisJCS8vIGFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5QUk9EVUNULAorCQkvLyBBcnJheXMuYXNMaXN0KHByb2R1Y3RDaGVja291dFJvbGVzKSk7CisKKwkJdGhpcy5zZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlciA9IHNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyOworCQlpZiAobGlmZUN5Y2xlT3BlcmF0aW9uICE9IG51bGwpCisJCQl0aGlzLnJlc291cmNlT3BlcmF0aW9uID0gbGlmZUN5Y2xlT3BlcmF0aW9uLmdldFJlc291cmNlT3BlcmF0aW9uKCk7CisJCXRoaXMuc2VydmljZUJ1c2luZXNzTG9naWMgPSBzZXJ2aWNlQnVzaW5lc3NMb2dpYzsKKwkJdGhpcy5jYXBhYmlsaXR5T3BlcmF0aW9uID0gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKwkJdGhpcy50b3NjYUV4cG9ydFV0aWxzID0gdG9zY2FFeHBvcnRVdGlsczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0gZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNFUlRJRklDQVRJT05fUkVRVUVTVDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQXVkaXRpbmdBY3Rpb25FbnVtIGdldEF1ZGl0aW5nQWN0aW9uKCkgeworCQlyZXR1cm4gQXVkaXRpbmdBY3Rpb25FbnVtLkNFUlRJRklDQVRJT05fUkVRVUVTVF9SRVNPVVJDRTsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWQoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWlmIChyZXNvdXJjZUluc3RhbmNlICE9IG51bGwpIHsKKwkJCU9wdGlvbmFsPENvbXBvbmVudEluc3RhbmNlPiBub25DZXJ0aWZpZWRSSU9wdGlvbmFsID0gcmVzb3VyY2VJbnN0YW5jZS5zdHJlYW0oKS5maWx0ZXIocCAtPiAhVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2VydGlmaWVkVmVyc2lvbihwLmdldENvbXBvbmVudFZlcnNpb24oKSkpLmZpbmRBbnkoKTsKKwkJCS8vIFVuY2VydGlmaWVkIFJlc291cmNlIEZvdW5kCisJCQlpZiAobm9uQ2VydGlmaWVkUklPcHRpb25hbC5pc1ByZXNlbnQoKSkgeworCQkJCUNvbXBvbmVudEluc3RhbmNlIG5vbkNlcnRpZmllZFJJID0gbm9uQ2VydGlmaWVkUklPcHRpb25hbC5nZXQoKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNGb3JtYXQgPSBnZXRSZWxldmFudFJlc3BvbnNlRm9ybWF0VW5jZXJ0aWZpZWRSSShub25DZXJ0aWZpZWRSSSwgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7CisJCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc0Zvcm1hdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFJlc3BvbnNlRm9ybWF0IGdldFJlbGV2YW50UmVzcG9uc2VGb3JtYXRVbmNlcnRpZmllZFJJKENvbXBvbmVudEluc3RhbmNlIG5vbkNlcnRpZmllZFJJLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShub25DZXJ0aWZpZWRSSS5nZXRDb21wb25lbnRVaWQoKSk7CisJCWlmIChlaXRoZXJSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisKKwkJfSBlbHNlIHsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXM7CisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVpdGhlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSByZXNvdXJjZU9wZXJhdGlvbi5maW5kTGFzdENlcnRpZmllZFJlc291cmNlQnlVVUlEKHJlc291cmNlKTsKKworCQkJaWYgKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZU1pbm9yVmVyc2lvbihub25DZXJ0aWZpZWRSSS5nZXRDb21wb25lbnRWZXJzaW9uKCkpKSB7CisJCQkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkgfHwgc3RhdHVzLmxlZnQoKS52YWx1ZSgpID09IG51bGwgfHwgc3RhdHVzLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSkgeworCQkJCQlhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuVkFMSURBVEVEX1JFU09VUkNFX05PVF9GT1VORDsKKwkJCQl9IGVsc2UgeworCQkJCQlhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuRk9VTkRfQUxSRUFEWV9WQUxJREFURURfUkVTT1VSQ0U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSB8fCBzdGF0dXMubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCB8fCBzdGF0dXMubGVmdCgpLnZhbHVlKCkuaXNFbXB0eSgpKQorCQkJCQlhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuRk9VTkRfTElTVF9WQUxJREFURURfUkVTT1VSQ0VTOworCQkJCWVsc2UgeworCQkJCQlhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuRk9VTkRfQUxSRUFEWV9WQUxJREFURURfUkVTT1VSQ0U7CisJCQkJfQorCisJCQl9CisJCQlTdHJpbmcgY29tcFR5cGUgPSAoY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSkgPyAiVkYiIDogInNlcnZpY2UiOworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGNvbXBUeXBlLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQl9CisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBY3Rpb25TdGF0dXMsIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4+IHZhbGlkYXRlTWFuZGF0b3J5QXJ0aWZhY3RzU3VwcGxpZWQoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMpIHsKKworCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgdHJ1ZSA9PSBhcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gaW52YWxpZEFydGlmYWN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlmb3IgKEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdCA6IGFydGlmYWN0cy5lbnRyeVNldCgpKSB7CisKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBhcnRpZmFjdC5nZXRWYWx1ZSgpOworCQkJaWYgKHRydWUgPT0gYXJ0aWZhY3REZWZpbml0aW9uLmdldE1hbmRhdG9yeSgpKSB7CisJCQkJU3RyaW5nIGFydGlmYWN0RXNJZCA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCk7CisJCQkJaWYgKGFydGlmYWN0RXNJZCA9PSBudWxsIHx8IHRydWUgPT0gYXJ0aWZhY3RFc0lkLmlzRW1wdHkoKSkgeworCQkJCQlpbnZhbGlkQXJ0aWZhY3RzLnB1dChhcnRpZmFjdC5nZXRLZXkoKSwgYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAodHJ1ZSA9PSBpbnZhbGlkQXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KEFjdGlvblN0YXR1cy5PSyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGludmFsaWRBcnRpZmFjdHMpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGUoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50QnVzaW5lc3NMb2dpYyBjb21wb25lbnRCbCwgVXNlciBtb2RpZmllciwgVXNlciBvd25lciwgYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlsb2cuZGVidWcoInN0YXJ0IHBlcmZvcm1pbmcgY2VydGlmaWNhdGlvbiByZXF1ZXN0IGZvciByZXNvdXJjZSB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKworCQkvLyBFaXRoZXI8QWN0aW9uU3RhdHVzLCBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+PgorCQkvLyB2YWxpZGF0ZU1hbmRhdG9yeUFydGlmYWN0cyA9CisJCS8vIHZhbGlkYXRlTWFuZGF0b3J5QXJ0aWZhY3RzU3VwcGxpZWQoY29tcG9uZW50LmdldEFydGlmYWN0cygpKTsKKwkJLy8gbG9nLmRlYnVnKCJBZnRlciBjaGVja2luZyBtYW5kYXRvcnkgYXJ0aWZhY3RzIHdlcmUgcG9wdWxhdGVkLiBSZXN1bHQKKwkJLy8gaXMgIiArIHZhbGlkYXRlTWFuZGF0b3J5QXJ0aWZhY3RzKTsKKwkJLy8gaWYgKHZhbGlkYXRlTWFuZGF0b3J5QXJ0aWZhY3RzLmlzUmlnaHQoKSkgeworCQkvLyBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudFV0aWxzCisJCS8vIC5nZXRSZXNwb25zZUZvcm1hdEJ5TWlzc2luZ0FydGlmYWN0cygKKwkJLy8gY29tcG9uZW50VHlwZSwKKwkJLy8gdmFsaWRhdGVNYW5kYXRvcnlBcnRpZmFjdHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCS8vIH0KKwkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IG51bGw7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbnVsbDsKKworCQlpZiAoY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFIHx8IChjb21wb25lbnRUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFICYmICgoUmVzb3VyY2UpIGNvbXBvbmVudCkuZ2V0UmVzb3VyY2VUeXBlKCkgPT0gUmVzb3VyY2VUeXBlRW51bS5WRikpIHsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBzdGF0dXNDZXJ0ID0gdmFsaWRhdGVBbGxSZXNvdXJjZUluc3RhbmNlQ2VydGlmaWVkKGNvbXBvbmVudCk7CisJCQlpZiAoc3RhdHVzQ2VydC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1c0NlcnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJc3RhdHVzQ2VydCA9IHZhbGlkYXRlQ29uZmlndXJlZEF0b21pY1JlcUNhcFNhdGlzZmllZChjb21wb25lbnQpOworCQkJaWYgKHN0YXR1c0NlcnQuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXNDZXJ0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJaWYgKGNvbXBvbmVudFR5cGUgPT0gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHZhbGlkYXRlRGVsb3ltZW50QXJ0aWZhY3RTdXBwbGllZCgoU2VydmljZSkgY29tcG9uZW50KTsKKwkJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBzdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWFjdGlvblN0YXR1cyA9IGNvbXBvbmVudFV0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKG9wZXJhdGlvblN0YXR1cyk7CisJCQl9IGVsc2UgeworCQkJCUJvb2xlYW4gaXNEZXBsb3ltZW50QXJ0aWZhY3RFeGlzdHMgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQkJaWYgKGlzRGVwbG95bWVudEFydGlmYWN0RXhpc3RzID09IG51bGwgfHwgaXNEZXBsb3ltZW50QXJ0aWZhY3RFeGlzdHMuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKKwkJCQkJYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLlNFUlZJQ0VfREVQTE9ZTUVOVF9BUlRJRkFDVF9OT1RfRk9VTkQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBnZW5lcmF0ZUhlYXRFbnZSZXN1bHQgPSBzZXJ2aWNlQnVzaW5lc3NMb2dpYy5nZW5lcmF0ZUhlYXRFbnZBcnRpZmFjdHMoKFNlcnZpY2UpIGNvbXBvbmVudCwgbW9kaWZpZXIsIHNob3VsZExvY2spOworCQkJCQlpZiAoZ2VuZXJhdGVIZWF0RW52UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChnZW5lcmF0ZUhlYXRFbnZSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGdlbmVyYXRlVmZNb2R1bGVSZXN1bHQgPSBzZXJ2aWNlQnVzaW5lc3NMb2dpYy5nZW5lcmF0ZVZmTW9kdWxlQXJ0aWZhY3RzKChTZXJ2aWNlKSBjb21wb25lbnQsIG1vZGlmaWVyLCBzaG91bGRMb2NrKTsKKwkJCQkJaWYgKGdlbmVyYXRlVmZNb2R1bGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdlbmVyYXRlVmZNb2R1bGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGFjdGlvblN0YXR1cyAhPSBudWxsKSB7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5Q29tcG9uZW50KGFjdGlvblN0YXR1cywgY29tcG9uZW50LCBjb21wb25lbnRUeXBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKworCQl9CisKKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJQb3B1bGF0ZWQgPSBjb21wb25lbnRCbC5wb3B1bGF0ZVRvc2NhQXJ0aWZhY3RzKGNvbXBvbmVudCwgbW9kaWZpZXIsIHRydWUsIGluVHJhbnNhY3Rpb24sIHNob3VsZExvY2spOworCQlpZiAoZWl0aGVyUG9wdWxhdGVkICE9IG51bGwgJiYgZWl0aGVyUG9wdWxhdGVkLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJQb3B1bGF0ZWQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IChjb21wb25lbnRUeXBlLmVxdWFscyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSkgPyBOb2RlVHlwZUVudW0uU2VydmljZSA6IE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNlcnRpZmljYXRpb25SZXF1ZXN0UmVzdWx0ID0gbGlmZUN5Y2xlT3BlcmF0aW9uLnJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KG5vZGVUeXBlLCBjb21wb25lbnQsIG1vZGlmaWVyLCBvd25lciwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChjZXJ0aWZpY2F0aW9uUmVxdWVzdFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiY2hlY2tvdXQgZmFpbGVkIG9uIGdyYXBoIik7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3BvbnNlID0gY2VydGlmaWNhdGlvblJlcXVlc3RSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJYWN0aW9uU3RhdHVzID0gY29tcG9uZW50VXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzcG9uc2UpOworCisJCQlpZiAocmVzcG9uc2UuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuRU5USVRZX0FMUkVBRFlfRVhJU1RTKSkgeworCQkJCWFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5DT01QT05FTlRfVkVSU0lPTl9BTFJFQURZX0VYSVNUOworCQkJfQorCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5Q29tcG9uZW50KGFjdGlvblN0YXR1cywgY29tcG9uZW50LCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNlcnRpZmljYXRpb25SZXF1ZXN0UmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb25maWd1cmVkQXRvbWljUmVxQ2FwU2F0aXNmaWVkKENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJbG9nLmRlYnVnKCJTdWJtaXQgZm9yIHRlc3RpbmcgdmFsaWRhdGlvbiAtIFN0YXJ0IHZhbGlkYXRpbmcgY29uZmlndXJlZCByZXEvY2FwIHNhdGlzZmllZCBmb3IgaW5uZXIgYXRvbWljIGluc3RhbmNlcywgY29tcG9uZW50IGlkOnt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXMgIT0gbnVsbCkgeworCQkJLy8gUHJlcGFyZSByZWxhdGlvbnNoaXBzIGRhdGEgc3RydWN0dXJlcworCQkJLy8gQmV0dGVyIG1ha2UgaXQgbGlzdCB0aGFuIHNldCBpbiBjYXNlIHdlIG5lZWQgdG8gY291bnQgcmVxL2NhcAorCQkJLy8gb2NjdXJyZW5jZXMgaW4gdGhlIGZ1dHVyZQorCQkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXFOYW1lMklkcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gY2FwTmFtZTJJZHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlwYXJzZVJlbGF0aW9uc0ZvclJlcUNhcFZlcmlmaWNhdGlvbihjb21wb25lbnQsIHJlcU5hbWUySWRzLCBjYXBOYW1lMklkcyk7CisJCQlNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydCA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRSZXF1aXJlbWVudHNUb0Z1bGZpbGxCZWZvcmVDZXJ0KCk7CisJCQlNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gY2FwYWJpbGl0aWVzVG9Db25zdW1lQmVmb3JlQ2VydCA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDYXBhYmlsaXRpZXNUb0NvbnN1bWVCZWZvcmVDZXJ0KCk7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0IDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQkJU3RyaW5nIGNvbXBJbnN0SWQgPSBjb21wSW5zdC5nZXRVbmlxdWVJZCgpOworCQkJCU9yaWdpblR5cGVFbnVtIG9yaWdpblR5cGUgPSBjb21wSW5zdC5nZXRPcmlnaW5UeXBlKCk7CisJCQkJaWYgKG9yaWdpblR5cGUgPT0gbnVsbCkgeworCQkJCQlsb2cuZXJyb3IoIk9yaWdpbiB0eXBlIGlzIG5vdCBzZXQgZm9yIGNvbXBvbmVudCBpbnN0YW5jZSB7fSAtIGl0IHNob3VsZG4ndCBoYXBwZW4uIFNraXBwaW5nIHRoaXMgY29tcG9uZW50IGluc3RhbmNlLi4uIiwgY29tcEluc3QuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlTdHJpbmcgY29tcEluc3RUeXBlID0gb3JpZ2luVHlwZS5nZXRWYWx1ZSgpOworCQkJCS8vIFZhbGlkYXRpbmcgY29uZmlndXJlZCByZXF1aXJlbWVudHMgZnVsZmlsbGVkCisJCQkJaWYgKG51bGwgIT0gcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydCkgeworCQkJCQlTZXQ8U3RyaW5nPiByZXFUb0Z1bGZpbGxGb3JUeXBlID0gcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydC5nZXQoY29tcEluc3RUeXBlKTsKKwkJCQkJaWYgKHJlcVRvRnVsZmlsbEZvclR5cGUgIT0gbnVsbCkgeworCQkJCQkJZm9yIChTdHJpbmcgcmVxTmFtZVRvRnVsZmlsbCA6IHJlcVRvRnVsZmlsbEZvclR5cGUpIHsKKwkJCQkJCQlMaXN0PFN0cmluZz4gcmVxTmFtZUxpc3QgPSByZXFOYW1lMklkcy5nZXQocmVxTmFtZVRvRnVsZmlsbCk7CisJCQkJCQkJaWYgKHJlcU5hbWVMaXN0ID09IG51bGwgfHwgIXJlcU5hbWVMaXN0LmNvbnRhaW5zKGNvbXBJbnN0SWQpKSB7CisJCQkJCQkJCWxvZy5kZWJ1ZygiUmVxdWlyZW1lbnQge30gd2Fzbid0IGZ1bGZpbGxlZCBmb3IgY29tcG9uZW50IGluc3RhbmNlIHt9IG9mIHR5cGUge30iLCByZXFOYW1lVG9GdWxmaWxsLCBjb21wSW5zdElkLCBjb21wSW5zdFR5cGUpOworCQkJCQkJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJCQkJCQkJU3RyaW5nIGNvbXBQYXJhbSA9IChjb21wb25lbnRUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSA/ICJWRiIgOiBjb21wb25lbnRUeXBlLmdldFZhbHVlKCkudG9Mb3dlckNhc2UoKTsKKwkJCQkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVRX0NBUF9OT1RfU0FUSVNGSUVEX0JFRk9SRV9DRVJUSUZJQ0FUSU9OLCBjb21wb25lbnQuZ2V0TmFtZSgpLCBjb21wUGFyYW0sIG9yaWdpblR5cGUuZ2V0RGlzcGxheVZhbHVlKCksIGNvbXBJbnN0LmdldE5hbWUoKSwgInJlcXVpcmVtZW50IiwKKwkJCQkJCQkJCQlyZXFOYW1lVG9GdWxmaWxsLCAiZnVsZmlsbGVkIik7CisJCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBWYWxpZGF0aW5nIGNvbmZpZ3VyZWQgY2FwYWJpbGl0aWVzIGNvbnN1bWVkCisJCQkJaWYgKG51bGwgIT0gY2FwYWJpbGl0aWVzVG9Db25zdW1lQmVmb3JlQ2VydCkgeworCQkJCQlTZXQ8U3RyaW5nPiBjYXBUb0NvbnN1bWVGb3JUeXBlID0gY2FwYWJpbGl0aWVzVG9Db25zdW1lQmVmb3JlQ2VydC5nZXQoY29tcEluc3RUeXBlKTsKKwkJCQkJaWYgKGNhcFRvQ29uc3VtZUZvclR5cGUgIT0gbnVsbCkgeworCQkJCQkJZm9yIChTdHJpbmcgY2FwTmFtZVRvQ29uc3VtZSA6IGNhcFRvQ29uc3VtZUZvclR5cGUpIHsKKwkJCQkJCQlMaXN0PFN0cmluZz4gY2FwTmFtZUxpc3QgPSBjYXBOYW1lMklkcy5nZXQoY2FwTmFtZVRvQ29uc3VtZSk7CisJCQkJCQkJaWYgKGNhcE5hbWVMaXN0ID09IG51bGwgfHwgIWNhcE5hbWVMaXN0LmNvbnRhaW5zKGNvbXBJbnN0SWQpKSB7CisJCQkJCQkJCWxvZy5kZWJ1ZygiQ2FwYWJpbGl0eSB7fSB3YXNuJ3QgY29uc3VtZWQgZm9yIGNvbXBvbmVudCBpbnN0YW5jZSB7fSBvZiB0eXBlIHt9IiwgY2FwTmFtZVRvQ29uc3VtZSwgY29tcEluc3RJZCwgY29tcEluc3RUeXBlKTsKKwkJCQkJCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisJCQkJCQkJCVN0cmluZyBjb21wUGFyYW0gPSAoY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSkgPyAiVkYiIDogY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCk7CisJCQkJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFUV9DQVBfTk9UX1NBVElTRklFRF9CRUZPUkVfQ0VSVElGSUNBVElPTiwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcFBhcmFtLCBvcmlnaW5UeXBlLmdldERpc3BsYXlWYWx1ZSgpLCBjb21wSW5zdC5nZXROYW1lKCksICJjYXBhYmlsaXR5IiwKKwkJCQkJCQkJCQljYXBOYW1lVG9Db25zdW1lLCAiY29uc3VtZWQiKTsKKwkJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWxvZy5kZWJ1ZygiU3VibWl0IGZvciB0ZXN0aW5nIHZhbGlkYXRpb24gLSB2YWxpZGF0aW5nIGNvbmZpZ3VyZWQgcmVxL2NhcCBzYXRpc2ZpZWQgZm9yIGlubmVyIGF0b21pYyBpbnN0YW5jZXMgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LCBjb21wb25lbnQgaWQ6e30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcGFyc2VSZWxhdGlvbnNGb3JSZXFDYXBWZXJpZmljYXRpb24oQ29tcG9uZW50IGNvbXBvbmVudCwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXFOYW1lMklkcywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBjYXBOYW1lMklkcykgeworCQlsb2cuZGVidWcoIlN1Ym1pdCBmb3IgdGVzdGluZyB2YWxpZGF0aW9uIC0gUHJlcGFyaW5nIHJlbGF0aW9ucyBmb3IgaW5uZXIgYXRvbWljIGluc3RhbmNlcyB2YWxpZGF0aW9uIik7CisJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiBjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKCk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxQ2FwUmVsRGVmIDogY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKSB7CisJCQkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMgPSByZXFDYXBSZWxEZWYuZ2V0UmVsYXRpb25zaGlwcygpOworCQkJCWlmIChyZWxhdGlvbnNoaXBzICE9IG51bGwpIHsKKwkJCQkJZm9yIChSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVxUmVsUGFpciA6IHJlbGF0aW9uc2hpcHMpIHsKKwkJCQkJCVN0cmluZyBjYXBVbmlxdWVJZCA9IHJlcVJlbFBhaXIuZ2V0Q2FwYWJpbGl0eVVpZCgpOworCQkJCQkJRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5nZXRDYXBhYmlsaXR5KGNhcFVuaXF1ZUlkKTsKKwkJCQkJCWlmIChjYXBhYmlsaXR5LmlzUmlnaHQoKSkgeworCQkJCQkJCWxvZy5lcnJvcigiQ291bGRuJ3QgZmV0Y2ggY2FwYWJpbGl0eSBieSBpZCB7fSIsIGNhcFVuaXF1ZUlkKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJCQl9CisJCQkJCQlTdHJpbmcgcmVxQ2FwVHlwZSA9IGNhcGFiaWxpdHkubGVmdCgpLnZhbHVlKCkuZ2V0VHlwZSgpOworCQkJCQkJU3RyaW5nIGNhcGFiaWxpdHlPd25lcklkID0gcmVxUmVsUGFpci5nZXRDYXBhYmlsaXR5T3duZXJJZCgpOworCQkJCQkJU3RyaW5nIHJlcXVpcmVtZW50T3duZXJJZCA9IHJlcVJlbFBhaXIuZ2V0UmVxdWlyZW1lbnRPd25lcklkKCk7CisJCQkJCQkvLyBVcGRhdGUgcmVxCisJCQkJCQlMaXN0PFN0cmluZz4gcmVxSWRzID0gcmVxTmFtZTJJZHMuZ2V0KHJlcUNhcFR5cGUpOworCQkJCQkJaWYgKHJlcUlkcyA9PSBudWxsKSB7CisJCQkJCQkJcmVxSWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJCQkJcmVxTmFtZTJJZHMucHV0KHJlcUNhcFR5cGUsIHJlcUlkcyk7CisJCQkJCQl9CisJCQkJCQlyZXFJZHMuYWRkKHJlcXVpcmVtZW50T3duZXJJZCk7CisJCQkJCQkvLyBVcGRhdGUgY2FwCisJCQkJCQlMaXN0PFN0cmluZz4gY2FwSWRzID0gY2FwTmFtZTJJZHMuZ2V0KHJlcUNhcFR5cGUpOworCQkJCQkJaWYgKGNhcElkcyA9PSBudWxsKSB7CisJCQkJCQkJY2FwSWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJCQkJY2FwTmFtZTJJZHMucHV0KHJlcUNhcFR5cGUsIGNhcElkcyk7CisJCQkJCQl9CisJCQkJCQljYXBJZHMuYWRkKGNhcGFiaWxpdHlPd25lcklkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWxvZy5kZWJ1ZygiUGFyc2VkIHJlcSBmb3IgdmFsaWRhdGlvbjoge30sIHBhcnNlZCBjYXAgZm9yIHZhbGlkYXRpb246IHt9IiwgcmVxTmFtZTJJZHMsIGNhcE5hbWUySWRzKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiVGhlcmUgYXJlIG5vIHJlbGF0aW9ucyBmb3VuZCBmb3IgY29tcG9uZW50IHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24oQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgVXNlciBtb2RpZmllciwgVXNlciBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtIG9sZFN0YXRlLCBMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbiBsaWZlY3ljbGVDaGFuZ2VJbmZvKSB7CisJCVN0cmluZyBjb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgYmVmb3JlIGNlcnRpZmljYXRpb24gcmVxdWVzdC4gcmVzb3VyY2UgbmFtZT17fSwgb2xkU3RhdGU9e30sIG93bmVyIHVzZXJJZD17fSIsIGNvbXBvbmVudE5hbWUsIG9sZFN0YXRlLCBvd25lci5nZXRVc2VySWQoKSk7CisKKwkJLy8gdmFsaWRhdGUgdXNlcgorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHVzZXJWYWxpZGF0aW9uUmVzcG9uc2UgPSB1c2VyUm9sZVZhbGlkYXRpb24obW9kaWZpZXIsIGNvbXBvbmVudFR5cGUsIGxpZmVjeWNsZUNoYW5nZUluZm8pOworCQlpZiAodXNlclZhbGlkYXRpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiB1c2VyVmFsaWRhdGlvblJlc3BvbnNlOworCQl9CisKKwkJLy8gY2FzZSBvZiAiYXRvbWljIiBjaGVja2luIGFuZCBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QgLSBtb2RpZmllciBtdXN0IGJlCisJCS8vIHRoZSBvd25lcgorCQlpZiAob2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKSAmJiAhbW9kaWZpZXIuZXF1YWxzKG93bmVyKSAmJiAhbW9kaWZpZXIuZ2V0Um9sZSgpLmVxdWFscyhSb2xlLkFETUlOLm5hbWUoKSkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DSEVDS09VVF9CWV9BTk9USEVSX1VTRVIsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudFR5cGUubmFtZSgpLnRvTG93ZXJDYXNlKCksIG93bmVyLmdldEZpcnN0TmFtZSgpLCBvd25lci5nZXRMYXN0TmFtZSgpLCBvd25lci5nZXRVc2VySWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCisJCS8vIG90aGVyIHN0YXRlcworCQlpZiAob2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfQUxSRUFEWV9DRVJUSUZJRUQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudFR5cGUubmFtZSgpLnRvTG93ZXJDYXNlKCksIG93bmVyLmdldEZpcnN0TmFtZSgpLCBvd25lci5nZXRMYXN0TmFtZSgpLCBvd25lci5nZXRVc2VySWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCQlpZiAob2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NFUlRfSU5fUFJPR1JFU1NfU1RBVEUsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudFR5cGUubmFtZSgpLnRvTG93ZXJDYXNlKCksIG93bmVyLmdldEZpcnN0TmFtZSgpLCBvd25lci5nZXRMYXN0TmFtZSgpLCBvd25lci5nZXRVc2VySWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCQlpZiAob2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTikpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9TRU5UX0ZPUl9DRVJUSUZJQ0FUSU9OLCBjb21wb25lbnROYW1lLCBjb21wb25lbnRUeXBlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCBvd25lci5nZXRGaXJzdE5hbWUoKSwgb3duZXIuZ2V0TGFzdE5hbWUoKSwgb3duZXIuZ2V0VXNlcklkKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVEZWxveW1lbnRBcnRpZmFjdFN1cHBsaWVkKFNlcnZpY2Ugc2VydmljZSkgeworCisJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlQ29udGFpbnNEZXBsb3ltZW50QXJ0aWZhY3RzID0gdGhpcy5zZXJ2aWNlRGlzdHJpYnV0aW9uQXJ0aWZhY3RzQnVpbGRlci5pc1NlcnZpY2VDb250YWluc0RlcGxveW1lbnRBcnRpZmFjdHMoc2VydmljZSk7CisKKwkJcmV0dXJuIHNlcnZpY2VDb250YWluc0RlcGxveW1lbnRBcnRpZmFjdHM7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DaGVja2luVHJhbnNpdGlvbi5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0NoZWNraW5UcmFuc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyMjcyOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DaGVja2luVHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVDeWNsZVRyYW5zaXRpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDaGVja2luVHJhbnNpdGlvbiBleHRlbmRzIExpZmVDeWNsZVRyYW5zaXRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENoZWNraW5UcmFuc2l0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgQ2hlY2tpblRyYW5zaXRpb24oQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudFV0aWxzLCBJTGlmZWN5Y2xlT3BlcmF0aW9uIGxpZmVjeWNsZU9wZXJhdGlvbikgeworCQlzdXBlcihjb21wb25lbnRVdGlscywgbGlmZWN5Y2xlT3BlcmF0aW9uKTsKKworCQkvLyBhdXRob3JpemVkIHJvbGVzCisJCVJvbGVbXSByZXNvdXJjZVNlcnZpY2VDaGVja291dFJvbGVzID0geyBSb2xlLkFETUlOLCBSb2xlLkRFU0lHTkVSIH07CisJCVJvbGVbXSBwcm9kdWN0Q2hlY2tvdXRSb2xlcyA9IHsgUm9sZS5BRE1JTiwgUm9sZS5QUk9EVUNUX01BTkFHRVIgfTsKKwkJYWRkQXV0aG9yaXplZFJvbGVzKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBBcnJheXMuYXNMaXN0KHJlc291cmNlU2VydmljZUNoZWNrb3V0Um9sZXMpKTsKKwkJYWRkQXV0aG9yaXplZFJvbGVzKENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIEFycmF5cy5hc0xpc3QocmVzb3VyY2VTZXJ2aWNlQ2hlY2tvdXRSb2xlcykpOworCQlhZGRBdXRob3JpemVkUm9sZXMoQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgQXJyYXlzLmFzTGlzdChwcm9kdWN0Q2hlY2tvdXRSb2xlcykpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtIGdldE5hbWUoKSB7CisJCXJldHVybiBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DSEVDS0lOOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBdWRpdGluZ0FjdGlvbkVudW0gZ2V0QXVkaXRpbmdBY3Rpb24oKSB7CisJCXJldHVybiBBdWRpdGluZ0FjdGlvbkVudW0uQ0hFQ0tJTl9SRVNPVVJDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnRCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEJsLCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlsb2cuZGVidWcoInN0YXJ0IHBlcmZvcm1pbmcgY2hlY2tpbiBmb3Ige30ge30iLCBjb21wb25lbnRUeXBlLm5hbWUoKSwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKTsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNoZWNraW5SZXNvdXJjZVJlc3VsdCA9IGxpZmVDeWNsZU9wZXJhdGlvbi5jaGVja2luQ29tcG9uZW50KG5vZGVUeXBlLCBjb21wb25lbnQsIG1vZGlmaWVyLCBvd25lciwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChjaGVja2luUmVzb3VyY2VSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImNoZWNrb3V0IGZhaWxlZCBvbiBncmFwaCIpOworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXNwb25zZSA9IGNoZWNraW5SZXNvdXJjZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50VXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzcG9uc2UpOworCisJCQlpZiAocmVzcG9uc2UuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuRU5USVRZX0FMUkVBRFlfRVhJU1RTKSkgeworCQkJCWFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5DT01QT05FTlRfVkVSU0lPTl9BTFJFQURZX0VYSVNUOworCQkJfQorCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5Q29tcG9uZW50KGFjdGlvblN0YXR1cywgY29tcG9uZW50LCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNoZWNraW5SZXNvdXJjZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bSBvbGRTdGF0ZSwgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24gbGlmZWN5Y2xlQ2hhbmdlSW5mbykgeworCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOworCQlsb2cuZGVidWcoInZhbGlkYXRlIGJlZm9yZSBjaGVja2luLiBjb21wb25lbnQgbmFtZT17fSwgb2xkU3RhdGU9e30sIG93bmVyIHVzZXJJZD17fSIsIGNvbXBvbmVudE5hbWUsIG9sZFN0YXRlLCBvd25lci5nZXRVc2VySWQoKSk7CisKKwkJLy8gdmFsaWRhdGUgdXNlcgorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHVzZXJWYWxpZGF0aW9uUmVzcG9uc2UgPSB1c2VyUm9sZVZhbGlkYXRpb24obW9kaWZpZXIsIGNvbXBvbmVudFR5cGUsIGxpZmVjeWNsZUNoYW5nZUluZm8pOworCQlpZiAodXNlclZhbGlkYXRpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiB1c2VyVmFsaWRhdGlvblJlc3BvbnNlOworCQl9CisKKwkJaWYgKCFvbGRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKSAmJiAhb2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0FMUkVBRFlfQ0hFQ0tFRF9JTiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb3duZXIuZ2V0Rmlyc3ROYW1lKCksIG93bmVyLmdldExhc3ROYW1lKCksIG93bmVyLmdldFVzZXJJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisKKwkJaWYgKG9sZFN0YXRlLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkgJiYgIW1vZGlmaWVyLmVxdWFscyhvd25lcikgJiYgIW1vZGlmaWVyLmdldFJvbGUoKS5lcXVhbHMoUm9sZS5BRE1JTi5uYW1lKCkpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0hFQ0tPVVRfQllfQU5PVEhFUl9VU0VSLCBjb21wb25lbnROYW1lLCBjb21wb25lbnRUeXBlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCBvd25lci5nZXRGaXJzdE5hbWUoKSwgb3duZXIuZ2V0TGFzdE5hbWUoKSwgb3duZXIuZ2V0VXNlcklkKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJCX0KKworCQlpZiAob2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTikgJiYgIW1vZGlmaWVyLmVxdWFscyhvd25lcikgJiYgIW1vZGlmaWVyLmdldFJvbGUoKS5lcXVhbHMoUm9sZS5BRE1JTi5uYW1lKCkpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfU0VOVF9GT1JfQ0VSVElGSUNBVElPTiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb3duZXIuZ2V0Rmlyc3ROYW1lKCksIG93bmVyLmdldExhc3ROYW1lKCksIG93bmVyLmdldFVzZXJJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DaGVja291dFRyYW5zaXRpb24uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DaGVja291dFRyYW5zaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU2YmRiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0NoZWNrb3V0VHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVDeWNsZVRyYW5zaXRpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDaGVja291dFRyYW5zaXRpb24gZXh0ZW5kcyBMaWZlQ3ljbGVUcmFuc2l0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFDRV9IT0xERVJfUkVTT1VSQ0VfVFlQRVMgPSAidmFsaWRGb3JSZXNvdXJjZVR5cGVzIjsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDaGVja291dFRyYW5zaXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBDaGVja291dFRyYW5zaXRpb24oQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudFV0aWxzLCBJTGlmZWN5Y2xlT3BlcmF0aW9uIGxpZmVjeWNsZU9wZXJhdGlvbikgeworCQlzdXBlcihjb21wb25lbnRVdGlscywgbGlmZWN5Y2xlT3BlcmF0aW9uKTsKKworCQkvLyBhdXRob3JpemVkIHJvbGVzCisJCVJvbGVbXSByZXNvdXJjZVNlcnZpY2VDaGVja291dFJvbGVzID0geyBSb2xlLkFETUlOLCBSb2xlLkRFU0lHTkVSIH07CisJCVJvbGVbXSBwcm9kdWN0Q2hlY2tvdXRSb2xlcyA9IHsgUm9sZS5BRE1JTiwgUm9sZS5QUk9EVUNUX01BTkFHRVIgfTsKKwkJYWRkQXV0aG9yaXplZFJvbGVzKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBBcnJheXMuYXNMaXN0KHJlc291cmNlU2VydmljZUNoZWNrb3V0Um9sZXMpKTsKKwkJYWRkQXV0aG9yaXplZFJvbGVzKENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIEFycmF5cy5hc0xpc3QocmVzb3VyY2VTZXJ2aWNlQ2hlY2tvdXRSb2xlcykpOworCQlhZGRBdXRob3JpemVkUm9sZXMoQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgQXJyYXlzLmFzTGlzdChwcm9kdWN0Q2hlY2tvdXRSb2xlcykpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtIGdldE5hbWUoKSB7CisJCXJldHVybiBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DSEVDS09VVDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQXVkaXRpbmdBY3Rpb25FbnVtIGdldEF1ZGl0aW5nQWN0aW9uKCkgeworCQlyZXR1cm4gQXVkaXRpbmdBY3Rpb25FbnVtLkNIRUNLT1VUX1JFU09VUkNFOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudEJ1c2luZXNzTG9naWMgY29tcG9uZW50QmwsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJbG9nLmRlYnVnKCJzdGFydCBwZXJmb3JtaW5nIHt9IGZvciByZXNvdXJjZSB7fSIsIGdldE5hbWUoKS5uYW1lKCksIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKworCQlpZiAoY29tcG9uZW50QmwgIT0gbnVsbCkKKwkJCWNvbXBvbmVudEJsLnNldERlcGxveW1lbnRBcnRpZmFjdHNQbGFjZUhvbGRlcihjb21wb25lbnQsIG1vZGlmaWVyKTsKKwkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlID0gY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpOworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tvdXRSZXNvdXJjZVJlc3VsdCA9IGxpZmVDeWNsZU9wZXJhdGlvbi5jaGVja291dENvbXBvbmVudChub2RlVHlwZSwgY29tcG9uZW50LCBtb2RpZmllciwgb3duZXIsIGluVHJhbnNhY3Rpb24pOworCisJCWlmIChjaGVja291dFJlc291cmNlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJjaGVja291dCBmYWlsZWQgb24gZ3JhcGgiKTsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzcG9uc2UgPSBjaGVja291dFJlc291cmNlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShyZXNwb25zZSk7CisKKwkJCWlmIChyZXNwb25zZS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5FTlRJVFlfQUxSRUFEWV9FWElTVFMpKSB7CisJCQkJYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9WRVJTSU9OX0FMUkVBRFlfRVhJU1Q7CisJCQl9CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlDb21wb25lbnQoYWN0aW9uU3RhdHVzLCBjb21wb25lbnQsIGNvbXBvbmVudFR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2hlY2tvdXRSZXNvdXJjZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bSBvbGRTdGF0ZSwgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24gbGlmZWN5Y2xlQ2hhbmdlSW5mbykgeworCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOworCQlsb2cuZGVidWcoInZhbGlkYXRlIGJlZm9yZSBjaGVja291dC4gcmVzb3VyY2UgbmFtZT17fSwgb2xkU3RhdGU9e30sIG93bmVyIHVzZXJJZD17fSIsIGNvbXBvbmVudE5hbWUsIG9sZFN0YXRlLCBvd25lci5nZXRVc2VySWQoKSk7CisKKwkJLy8gdmFsaWRhdGUgdXNlcgorCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHVzZXJWYWxpZGF0aW9uUmVzcG9uc2UgPSB1c2VyUm9sZVZhbGlkYXRpb24obW9kaWZpZXIsIGNvbXBvbmVudFR5cGUsIGxpZmVjeWNsZUNoYW5nZUluZm8pOworCQlpZiAodXNlclZhbGlkYXRpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiB1c2VyVmFsaWRhdGlvblJlc3BvbnNlOworCQl9CisKKwkJLy8gRGlzYWJsZWQgYXMgb2YgMTYwNCBwYXRjaCBhZnRlciBkaXNjdXNzaW5nIHdpdGggRWxsYS9FbGkvTWljaGFlbAorCisJCS8qCisJCSAqIGlmIChjb21wb25lbnRUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpeyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHByb2R1Y3RDb250YWN0c0VpdGhlciA9IHByb2R1Y3RDb250YWN0c1ZhbGlkYXRpb24oKFByb2R1Y3QpY29tcG9uZW50LCBtb2RpZmllcik7IGlmIChwcm9kdWN0Q29udGFjdHNFaXRoZXIuaXNSaWdodCgpKXsgcmV0dXJuIHByb2R1Y3RDb250YWN0c0VpdGhlcjsgfSB9CisJCSAqLworCisJCS8vIGNoZWNrIHJlc291cmNlIGlzIG5vdCBsb2NrZWQgYnkgYW5vdGhlciB1c2VyCisJCWlmIChvbGRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fQ0hFQ0tPVVRfU1RBVEUsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudFR5cGUubmFtZSgpLnRvTG93ZXJDYXNlKCksIG93bmVyLmdldEZpcnN0TmFtZSgpLCBvd25lci5nZXRMYXN0TmFtZSgpLCBvd25lci5nZXRVc2VySWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCisJCWlmIChvbGRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpKSB7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fQ0VSVF9JTl9QUk9HUkVTU19TVEFURSwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb3duZXIuZ2V0Rmlyc3ROYW1lKCksIG93bmVyLmdldExhc3ROYW1lKCksIG93bmVyLmdldFVzZXJJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisKKwkJaWYgKG9sZFN0YXRlLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pKSB7CisJCQlpZiAoIW1vZGlmaWVyLmdldFJvbGUoKS5lcXVhbHMoUm9sZS5ERVNJR05FUi5uYW1lKCkpICYmICFtb2RpZmllci5nZXRSb2xlKCkuZXF1YWxzKFJvbGUuQURNSU4ubmFtZSgpKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9TRU5UX0ZPUl9DRVJUSUZJQ0FUSU9OLCBjb21wb25lbnROYW1lLCBjb21wb25lbnRUeXBlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCBvd25lci5nZXRGaXJzdE5hbWUoKSwgb3duZXIuZ2V0TGFzdE5hbWUoKSwgb3duZXIuZ2V0VXNlcklkKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwkvKgorCSAqIHByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBwcm9kdWN0Q29udGFjdHNWYWxpZGF0aW9uKFByb2R1Y3QgcHJvZHVjdCwgVXNlciBtb2RpZmllcikgeyAvLyB2YWxpZGF0ZSB1c2VyIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzcG9uc2UgPSBFaXRoZXIubGVmdCh0cnVlKTsgU3RyaW5nIHJvbGUgPSBtb2RpZmllci5nZXRSb2xlKCk7IGlmCisJICogKFVzZXJSb2xlRW51bS5QUk9EVUNUX01BTkFHRVIuZ2V0TmFtZSgpLmVxdWFscyhyb2xlKSB8fCBVc2VyUm9sZUVudW0uUFJPRFVDVF9TVFJBVEVHSVNULmdldE5hbWUoKS5lcXVhbHMocm9sZSkpeyBTdHJpbmcgdXNlcklkID0gbW9kaWZpZXIuZ2V0VXNlcklkKCk7IGlmICghcHJvZHVjdC5nZXRDb250YWN0cygpLmNvbnRhaW5zKHVzZXJJZCkpeyBsb2cuCisJICogZGVidWcoIlVzZXIgd2l0aCB1c2VySWQge30gY2Fubm90IGNoZWNrb3V0IHByb2R1Y3QuIHVzZXJJZCBub3QgZm91bmQgaW4gcHJvZHVjdCBjb250YWN0cyBsaXN0IiAsIHVzZXJJZCk7IFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsgcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJICogfSBlbHNlIHsgbG9nLiB0cmFjZSgiRm91bmQgdXNlciB1c2VySWQge30gaW4gcHJvZHVjdCBjb250YWN0cyAtIGNoZWNrb3V0IHJlcXVlc3QgdmFsaWRhdGVkIiApOyB9IH0gcmV0dXJuIGVpdGhlclJlc3BvbnNlOyB9CisJICovCisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9MaWZlQ3ljbGVUcmFuc2l0aW9uLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvTGlmZUN5Y2xlVHJhbnNpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDk0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvTGlmZUN5Y2xlVHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24uTGlmZWN5Y2xlQ2hhbmNlQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVDeWNsZVRyYW5zaXRpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlmZUN5Y2xlVHJhbnNpdGlvbiB7CisKKwlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXI7CisJcHJvdGVjdGVkIElMaWZlY3ljbGVPcGVyYXRpb24gbGlmZUN5Y2xlT3BlcmF0aW9uOworCXByb3RlY3RlZCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHM7CisKKwlwcm90ZWN0ZWQgTWFwPENvbXBvbmVudFR5cGVFbnVtLCBMaXN0PFJvbGU+PiBhdXRob3JpemVkUm9sZXM7CisKKwlwcm90ZWN0ZWQgTGlmZUN5Y2xlVHJhbnNpdGlvbihDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHMsIElMaWZlY3ljbGVPcGVyYXRpb24gbGlmZWN5Y2xlT3BlcmF0aW9uKSB7CisKKwkJLy8gY29uZmlndXJhdGlvbk1hbmFnZXIgPSAoQ29uZmlndXJhdGlvbk1hbmFnZXIpCisJCS8vIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5DT05GSUdVUkFUSU9OX01BTkFHRVJfQVRUUik7CisJCS8vIGxpZmVDeWNsZU9wZXJhdGlvbiA9IExpZmVjeWNsZU9wZXJhdGlvbi5nZXRJbnN0YW5jZSgpOworCQl0aGlzLmNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKKwkJdGhpcy5saWZlQ3ljbGVPcGVyYXRpb24gPSBsaWZlY3ljbGVPcGVyYXRpb247CisJCXRoaXMuY29tcG9uZW50VXRpbHMgPSBjb21wb25lbnRVdGlsczsKKwkJdGhpcy5hdXRob3JpemVkUm9sZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0gZ2V0TmFtZSgpOworCisJcHVibGljIGFic3RyYWN0IEF1ZGl0aW5nQWN0aW9uRW51bSBnZXRBdWRpdGluZ0FjdGlvbigpOworCisJcHVibGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgeworCQlyZXR1cm4gY29uZmlndXJhdGlvbk1hbmFnZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIpIHsKKwkJdGhpcy5jb25maWd1cmF0aW9uTWFuYWdlciA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyOworCX0KKworCXB1YmxpYyBJTGlmZWN5Y2xlT3BlcmF0aW9uIGdldExpZmVDeWNsZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIGxpZmVDeWNsZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaWZlQ3ljbGVPcGVyYXRpb24oSUxpZmVjeWNsZU9wZXJhdGlvbiBsaWZlQ3ljbGVPcGVyYXRpb24pIHsKKwkJdGhpcy5saWZlQ3ljbGVPcGVyYXRpb24gPSBsaWZlQ3ljbGVPcGVyYXRpb247CisJfQorCisJcHVibGljIExpc3Q8Um9sZT4gZ2V0QXV0aG9yaXplZFJvbGVzKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHsKKwkJcmV0dXJuIGF1dGhvcml6ZWRSb2xlcy5nZXQoY29tcG9uZW50VHlwZSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkQXV0aG9yaXplZFJvbGVzKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIExpc3Q8Um9sZT4gYXV0aG9yaXplZFJvbGVzKSB7CisJCXRoaXMuYXV0aG9yaXplZFJvbGVzLnB1dChjb21wb25lbnRUeXBlLCBhdXRob3JpemVkUm9sZXMpOworCX0KKworCS8vCisJLy8gcHVibGljIEVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4KKwkvLyBjaGFuZ2VTdGF0ZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBDb21wb25lbnQgY29tcG9uZW50LAorCS8vIENvbXBvbmVudEJ1c2luZXNzTG9naWMgY29tcG9uZW50QmwsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIpeworCS8vIHJldHVybiBjaGFuZ2VTdGF0ZShjb21wb25lbnRUeXBlLCBjb21wb25lbnQsIGNvbXBvbmVudEJsLCBtb2RpZmllciwKKwkvLyBvd25lciwgZmFsc2UpOworCS8vIH0KKworCXB1YmxpYyBhYnN0cmFjdCBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudEJ1c2luZXNzTG9naWMgY29tcG9uZW50QmwsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIGJvb2xlYW4gbmVlZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgYWJzdHJhY3QgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24oQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgVXNlciBtb2RpZmllciwgVXNlciBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtIG9sZFN0YXRlLCBMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbiBsaWZlY3ljbGVDaGFuZ2VJbmZvKTsKKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0gb2xkU3RhdGUpIHsKKworCQlyZXR1cm4gdGhpcy52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24oY29tcG9uZW50LCBjb21wb25lbnRUeXBlLCBtb2RpZmllciwgb3duZXIsIG9sZFN0YXRlLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBnZXRDb21wb25lbnRPd25lcgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBnZXRDb21wb25lbnRPd25lcihDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisKKwkJcmV0dXJuIGdldENvbXBvbmVudE93bmVyKGNvbXBvbmVudCwgY29tcG9uZW50VHlwZSwgZmFsc2UpOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGdldENvbXBvbmVudE93bmVyKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKTsKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlT3duZXJSZXN1bHQgPSBnZXRMaWZlQ3ljbGVPcGVyYXRpb24oKS5nZXRDb21wb25lbnRPd25lcihjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgbm9kZVR5cGUsIGluVHJhbnNhY3Rpb24pOworCQlpZiAocmVzb3VyY2VPd25lclJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUNvbXBvbmVudChjb21wb25lbnRVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShyZXNvdXJjZU93bmVyUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSksIGNvbXBvbmVudCwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VPd25lclJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJLyoqCisJICogaXNVc2VyVmFsaWRGb3JSZXF1ZXN0CisJICogCisJICogQHBhcmFtIG1vZGlmaWVyCisJICogQHBhcmFtIGFjdGlvbgorCSAqICAgICAgICAgICAgVE9ETworCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB1c2VyUm9sZVZhbGlkYXRpb24oVXNlciBtb2RpZmllciwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24gbGlmZWN5Y2xlQ2hhbmdlSW5mbykgeworCisJCS8vIHZhbGlkYXRlIHVzZXIKKwkJaWYgKGdldEF1dGhvcml6ZWRSb2xlcyhjb21wb25lbnRUeXBlKS5jb250YWlucyhSb2xlLnZhbHVlT2YobW9kaWZpZXIuZ2V0Um9sZSgpKSkpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCisJCS8vIHRoaXMgaXMgb25seSB3aGVuIGNyZWF0aW5nIHZmYy9jcCB3aGVuIGltcG9ydCB2ZiBmcm9tIGNzYXIgLSB3aGVuIHdlCisJCS8vIGNyZWF0ZSByZXNvdXJjZXMgZnJvbSBub2RlIHR5cGUsIHdlIGNyZWF0ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3RhdGUKKwkJLy8gdG8gY2VydGlmaWVkCisJCWlmIChsaWZlY3ljbGVDaGFuZ2VJbmZvICE9IG51bGwgJiYgbGlmZWN5Y2xlQ2hhbmdlSW5mby5nZXRBY3Rpb24oKSAhPSBudWxsICYmIGxpZmVjeWNsZUNoYW5nZUluZm8uZ2V0QWN0aW9uKCkgPT0gTGlmZWN5Y2xlQ2hhbmNlQWN0aW9uRW51bS5DUkVBVEVfRlJPTV9DU0FSKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0xpZmVjeWNsZUJ1c2luZXNzTG9naWMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9MaWZlY3ljbGVCdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3MDliYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9MaWZlY3ljbGVCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSw1NzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuU2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlByb2R1Y3RCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5SZXNvdXJjZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlNlcnZpY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlQ3ljbGVUcmFuc2l0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklDYWNoZU1hbmdlck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JR3JhcGhMb2NrT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvZHVjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlNlcnZpY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLlRvc2NhRXhwb3J0SGFuZGxlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgibGlmZWN5Y2xlQnVzaW5lc3NMb2dpYyIpCitwdWJsaWMgY2xhc3MgTGlmZWN5Y2xlQnVzaW5lc3NMb2dpYyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVCA9ICJjb21tZW50IjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElHcmFwaExvY2tPcGVyYXRpb24gZ3JhcGhMb2NrT3BlcmF0aW9uID0gbnVsbDsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUHJvZHVjdE9wZXJhdGlvbiBwcm9kdWN0T3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQ2FwYWJpbGl0eU9wZXJhdGlvbiBjYXBhYmlsaXR5T3BlcmF0aW9uOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpZmVjeWNsZUJ1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHM7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSUxpZmVjeWNsZU9wZXJhdGlvbiBsaWZlY3ljbGVPcGVyYXRpb247CisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c01hbmFnZXI7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgU2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXIgc2VydmljZURpc3RyaWJ1dGlvbkFydGlmYWN0c0J1aWxkZXI7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgU2VydmljZUJ1c2luZXNzTG9naWMgc2VydmljZUJ1c2luZXNzTG9naWM7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIHJlc291cmNlQnVzaW5lc3NMb2dpYzsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBQcm9kdWN0QnVzaW5lc3NMb2dpYyBwcm9kdWN0QnVzaW5lc3NMb2dpYzsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFRvc2NhRXhwb3J0SGFuZGxlciB0b3NjYUV4cG9ydFV0aWxzOworCisJQEF1dG93aXJlZAorCUlDYWNoZU1hbmdlck9wZXJhdGlvbiBjYWNoZU1hbmFnZXJPcGVyYXRpb247CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpZmVDeWNsZVRyYW5zaXRpb24+IHN0YXRlVHJhbnNpdGlvbnM7CisJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCS8vIGluaXQgcGFyYW1ldGVycworCQlpZiAoIWlzSW5pdGlhbGl6ZWQpIHsKKwkJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJCWlmICghaXNJbml0aWFsaXplZCkgeworCQkJCQlpbml0U3RhdGVPcGVyYXRpb25zKCk7CisJCQkJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBpbml0U3RhdGVPcGVyYXRpb25zKCkgeworCQlzdGF0ZVRyYW5zaXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaWZlQ3ljbGVUcmFuc2l0aW9uPigpOworCisJCUxpZmVDeWNsZVRyYW5zaXRpb24gY2hlY2tvdXRPcCA9IG5ldyBDaGVja291dFRyYW5zaXRpb24oY29tcG9uZW50VXRpbHMsIGxpZmVjeWNsZU9wZXJhdGlvbik7CisJCXN0YXRlVHJhbnNpdGlvbnMucHV0KGNoZWNrb3V0T3AuZ2V0TmFtZSgpLm5hbWUoKSwgY2hlY2tvdXRPcCk7CisKKwkJVW5kb0NoZWNrb3V0VHJhbnNpdGlvbiB1bmRvQ2hlY2tvdXRPcCA9IG5ldyBVbmRvQ2hlY2tvdXRUcmFuc2l0aW9uKGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24pOworCQl1bmRvQ2hlY2tvdXRPcC5zZXRBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljKGFydGlmYWN0c0J1c2luZXNzTG9naWMpOworCQlzdGF0ZVRyYW5zaXRpb25zLnB1dCh1bmRvQ2hlY2tvdXRPcC5nZXROYW1lKCkubmFtZSgpLCB1bmRvQ2hlY2tvdXRPcCk7CisKKwkJTGlmZUN5Y2xlVHJhbnNpdGlvbiBjaGVja2luT3AgPSBuZXcgQ2hlY2tpblRyYW5zaXRpb24oY29tcG9uZW50VXRpbHMsIGxpZmVjeWNsZU9wZXJhdGlvbik7CisJCXN0YXRlVHJhbnNpdGlvbnMucHV0KGNoZWNraW5PcC5nZXROYW1lKCkubmFtZSgpLCBjaGVja2luT3ApOworCisJCUxpZmVDeWNsZVRyYW5zaXRpb24gY2VydGlmaWNhdGlvblJlcXVlc3QgPSBuZXcgQ2VydGlmaWNhdGlvblJlcXVlc3RUcmFuc2l0aW9uKGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24sIHNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyLCBzZXJ2aWNlQnVzaW5lc3NMb2dpYywgY2FwYWJpbGl0eU9wZXJhdGlvbiwgdG9zY2FFeHBvcnRVdGlscyk7CisJCXN0YXRlVHJhbnNpdGlvbnMucHV0KGNlcnRpZmljYXRpb25SZXF1ZXN0LmdldE5hbWUoKS5uYW1lKCksIGNlcnRpZmljYXRpb25SZXF1ZXN0KTsKKworCQlMaWZlQ3ljbGVUcmFuc2l0aW9uIHN0YXJ0Q2VydGlmaWNhdGlvbiA9IG5ldyBTdGFydENlcnRpZmljYXRpb25UcmFuc2l0aW9uKGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24pOworCQlzdGF0ZVRyYW5zaXRpb25zLnB1dChzdGFydENlcnRpZmljYXRpb24uZ2V0TmFtZSgpLm5hbWUoKSwgc3RhcnRDZXJ0aWZpY2F0aW9uKTsKKworCQlMaWZlQ3ljbGVUcmFuc2l0aW9uIGZhaWxDZXJ0aWZpY2F0aW9uID0gbmV3IENlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uKExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkZBSUxfQ0VSVElGSUNBVElPTiwgY29tcG9uZW50VXRpbHMsIGxpZmVjeWNsZU9wZXJhdGlvbik7CisJCXN0YXRlVHJhbnNpdGlvbnMucHV0KGZhaWxDZXJ0aWZpY2F0aW9uLmdldE5hbWUoKS5uYW1lKCksIGZhaWxDZXJ0aWZpY2F0aW9uKTsKKworCQlMaWZlQ3ljbGVUcmFuc2l0aW9uIGNhbmNlbENlcnRpZmljYXRpb24gPSBuZXcgQ2VydGlmaWNhdGlvbkNoYW5nZVRyYW5zaXRpb24oTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0FOQ0VMX0NFUlRJRklDQVRJT04sIGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24pOworCQlzdGF0ZVRyYW5zaXRpb25zLnB1dChjYW5jZWxDZXJ0aWZpY2F0aW9uLmdldE5hbWUoKS5uYW1lKCksIGNhbmNlbENlcnRpZmljYXRpb24pOworCisJCUNlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uIHN1Y2Nlc3NDZXJ0aWZpY2F0aW9uID0gbmV3IENlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uKExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNFUlRJRlksIGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24pOworCQlzdWNjZXNzQ2VydGlmaWNhdGlvbi5zZXRBcnRpZmFjdHNNYW5hZ2VyKGFydGlmYWN0c0J1c2luZXNzTG9naWMpOworCQlzdGF0ZVRyYW5zaXRpb25zLnB1dChzdWNjZXNzQ2VydGlmaWNhdGlvbi5nZXROYW1lKCkubmFtZSgpLCBzdWNjZXNzQ2VydGlmaWNhdGlvbik7CisJfQorCisJcHVibGljIExpZmVDeWNsZVRyYW5zaXRpb24gZ2V0TGlmZWN5Y2xlVHJhbnNpdGlvbihMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bSB0cmFuc2l0aW9uRW51bSkgeworCQlyZXR1cm4gc3RhdGVUcmFuc2l0aW9ucy5nZXQodHJhbnNpdGlvbkVudW0ubmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTZXJ2aWNlU3RhdGUoU3RyaW5nIHNlcnZpY2VJZCwgVXNlciBtb2RpZmllciwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0gdHJhbnNpdGlvbkVudW0sIExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGNoYW5nZUluZm8sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaykgeworCQlyZXR1cm4gKEVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4pIGNoYW5nZUNvbXBvbmVudFN0YXRlKENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIHNlcnZpY2VJZCwgbW9kaWZpZXIsIHRyYW5zaXRpb25FbnVtLCBjaGFuZ2VJbmZvLCBpblRyYW5zYWN0aW9uLCBuZWVkTG9jayk7CisJfQorCisJLy8gVE9ETzogcmhhbGlsaSAtIHNob3VsZCB1c2UgY2hhbmdlQ29tcG9uZW50U3RhdGUgd2hlbiBwb3NzaWJsZQorCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZShTdHJpbmcgcmVzb3VyY2VJZCwgVXNlciBtb2RpZmllciwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0gdHJhbnNpdGlvbkVudW0sIExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGNoYW5nZUluZm8sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgYm9vbGVhbiBuZWVkTG9jaykgeworCQlyZXR1cm4gKEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+KSBjaGFuZ2VDb21wb25lbnRTdGF0ZShDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgcmVzb3VyY2VJZCwgbW9kaWZpZXIsIHRyYW5zaXRpb25FbnVtLCBjaGFuZ2VJbmZvLCBpblRyYW5zYWN0aW9uLCBuZWVkTG9jayk7CisKKwkJLy8gTGlmZUN5Y2xlVHJhbnNpdGlvbiBsaWZlQ3ljbGVUcmFuc2l0aW9uID0KKwkJLy8gc3RhdGVUcmFuc2l0aW9ucy5nZXQodHJhbnNpdGlvbkVudW0ubmFtZSgpKTsKKwkJLy8gaWYgKGxpZmVDeWNsZVRyYW5zaXRpb24gPT0gbnVsbCkgeworCQkvLyBsb2cuZGVidWcoInN0YXRlIG9wZXJhdGlvbiBpcyBub3QgdmFsaWQuIG9wZXJhdGlvbnMgYWxsb3dlZCBhcmU6IHt9IiwKKwkJLy8gTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0udmFsdWVzQXNTdHJpbmcoKSk7CisJCS8vIFJlc3BvbnNlRm9ybWF0IGVycm9yID0KKwkJLy8gY29tcG9uZW50VXRpbHMuZ2V0SW52YWxpZENvbnRlbnRFcnJvckFuZEF1ZGl0KG1vZGlmaWVyLAorCQkvLyBBdWRpdGluZ0FjdGlvbkVudW0uQ0hFQ0tPVVRfUkVTT1VSQ0UpOworCQkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJLy8gfQorCQkvLworCQkvLyBFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBvcGVyYXRpb25SZXN1bHQ7CisJCS8vIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJLy8gYm9vbGVhbiBuZWVkVG9VbmxvY2tSZXNvdXJjZSA9IGZhbHNlOworCQkvLworCQkvLyBsb2cuZGVidWcoImdldCByZXNvdXJjZSBmcm9tIGdyYXBoIik7CisJCS8vIFJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2U7CisJCS8vIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc291cmNlUmVzcG9uc2UgPQorCQkvLyBnZXRSZXNvdXJjZUZvckNoYW5nZShyZXNvdXJjZUlkLCBtb2RpZmllciwgbGlmZUN5Y2xlVHJhbnNpdGlvbik7CisJCS8vIGlmIChlaXRoZXJSZXNvdXJjZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkvLyByZXR1cm4gZWl0aGVyUmVzb3VyY2VSZXNwb25zZTsKKwkJLy8gfQorCQkvLyByZXNvdXJjZSA9IGVpdGhlclJlc291cmNlUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCS8vIFN0cmluZyByZXNvdXJjZUN1cnJWZXJzaW9uID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VWZXJzaW9uKCk7CisJCS8vIExpZmVjeWNsZVN0YXRlRW51bSByZXNvdXJjZUN1cnJTdGF0ZSA9IHJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCk7CisJCS8vCisJCS8vIGlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCS8vIC8vIGxvY2sgcmVzb3VyY2UKKwkJLy8gRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJMb2NrUmVzb3VyY2UgPQorCQkvLyBsb2NrUmVzb3VyY2UocmVzb3VyY2UpOworCQkvLyBpZiAoZWl0aGVyTG9ja1Jlc291cmNlLmlzUmlnaHQoKSkgeworCQkvLyBlcnJvclJlc3BvbnNlID0gZWl0aGVyTG9ja1Jlc291cmNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJLy8gY29tcG9uZW50VXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgcmVzb3VyY2UsCisJCS8vIHJlc291cmNlQ3VyclN0YXRlLm5hbWUoKSwgcmVzb3VyY2VDdXJyVmVyc2lvbiwKKwkJLy8gbGlmZUN5Y2xlVHJhbnNpdGlvbi5nZXRBdWRpdGluZ0FjdGlvbigpLCBudWxsKTsKKwkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJLy8gfQorCQkvLyBuZWVkVG9VbmxvY2tSZXNvdXJjZSA9IHRydWU7CisJCS8vIH0KKwkJLy8KKwkJLy8gdHJ5IHsKKwkJLy8gRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiByZXNvdXJjZU5vdERlbGV0ZWQgPQorCQkvLyB2YWxpZGF0ZVJlc291cmNlTm90RGVsZXRlZChtb2RpZmllciwgbGlmZUN5Y2xlVHJhbnNpdGlvbiwgcmVzb3VyY2UsCisJCS8vIHJlc291cmNlQ3VyclZlcnNpb24pOworCQkvLyBpZiAocmVzb3VyY2VOb3REZWxldGVkLmlzUmlnaHQoKSkgeworCQkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc291cmNlTm90RGVsZXRlZC5yaWdodCgpLnZhbHVlKCkpOworCQkvLyB9CisJCS8vCisJCS8vIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVIaWdoZXN0VmVyc2lvbiA9CisJCS8vIHZhbGlkYXRlSGlnaGVzdFZlcnNpb24obW9kaWZpZXIsIGxpZmVDeWNsZVRyYW5zaXRpb24sIHJlc291cmNlLAorCQkvLyByZXNvdXJjZUN1cnJWZXJzaW9uKTsKKwkJLy8gaWYgKHZhbGlkYXRlSGlnaGVzdFZlcnNpb24uaXNSaWdodCgpKSB7CisJCS8vIHJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVIaWdoZXN0VmVyc2lvbi5yaWdodCgpLnZhbHVlKCkpOworCQkvLyB9CisJCS8vCisJCS8vIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXJSZXN1bHQgPQorCQkvLyBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldFJlc291cmNlT3duZXIocmVzb3VyY2UpOworCQkvLyBpZiAob3duZXJSZXN1bHQuaXNSaWdodCgpKSB7CisJCS8vIHJldHVybiBFaXRoZXIucmlnaHQob3duZXJSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJLy8gfQorCQkvLyBVc2VyIG93bmVyID0gb3duZXJSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCS8vIGxvZy5kZWJ1Zygib3duZXIgb2YgcmVzb3VyY2Uge30gaXMge30iLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpLAorCQkvLyBvd25lci5nZXRVc2VySWQoKSk7CisJCS8vCisJCS8vIExpZmVjeWNsZVN0YXRlRW51bSBvbGRTdGF0ZSA9IHJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCk7CisJCS8vCisJCS8vIEVpdGhlcjxTdHJpbmcsIFJlc3BvbnNlRm9ybWF0PiBjb21tZW50VmFsaWRhdGlvblJlc3VsdCA9CisJCS8vIHZhbGlkYXRlQ29tbWVudChjaGFuZ2VJbmZvLCB0cmFuc2l0aW9uRW51bSk7CisJCS8vIGlmIChjb21tZW50VmFsaWRhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJLy8gZXJyb3JSZXNwb25zZSA9IGNvbW1lbnRWYWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJLy8gRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3CisJCS8vIEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwKKwkJLy8gT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJLy8gYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ09NTUVOVCwKKwkJLy8gY2hhbmdlSW5mby5nZXRVc2VyUmVtYXJrcygpKTsKKwkJLy8gY29tcG9uZW50VXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgcmVzb3VyY2UsCisJCS8vIHJlc291cmNlQ3VyclN0YXRlLm5hbWUoKSwgcmVzb3VyY2VDdXJyVmVyc2lvbiwKKwkJLy8gbGlmZUN5Y2xlVHJhbnNpdGlvbi5nZXRBdWRpdGluZ0FjdGlvbigpLCBhdWRpdGluZ0ZpZWxkcyk7CisJCS8vIHJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCS8vIH0KKwkJLy8gY2hhbmdlSW5mby5zZXRVc2VyUmVtYXJrcyhjb21tZW50VmFsaWRhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCS8vCisJCS8vIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gc3RhdGVWYWxpZGF0aW9uUmVzdWx0ID0KKwkJLy8gbGlmZUN5Y2xlVHJhbnNpdGlvbi52YWxpZGF0ZVJlc291cmNlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZS5nZXRSZXNvdXJjZU5hbWUoKSwKKwkJLy8gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG1vZGlmaWVyLCBvd25lciwgb2xkU3RhdGUpOworCQkvLyBpZiAoc3RhdGVWYWxpZGF0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkvLyBlcnJvclJlc3BvbnNlID0gc3RhdGVWYWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJLy8gY29tcG9uZW50VXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgcmVzb3VyY2UsCisJCS8vIHJlc291cmNlQ3VyclN0YXRlLm5hbWUoKSwgcmVzb3VyY2VDdXJyVmVyc2lvbiwKKwkJLy8gbGlmZUN5Y2xlVHJhbnNpdGlvbi5nZXRBdWRpdGluZ0FjdGlvbigpLCBudWxsKTsKKwkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJLy8gfQorCQkvLworCQkvLyBvcGVyYXRpb25SZXN1bHQgPSBsaWZlQ3ljbGVUcmFuc2l0aW9uLmNoYW5nZVN0YXRlT3BlcmF0aW9uKHJlc291cmNlLAorCQkvLyBtb2RpZmllciwgb3duZXIsIGluVHJhbnNhY3Rpb24pOworCQkvLworCQkvLyBpZiAob3BlcmF0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkvLyBlcnJvclJlc3BvbnNlID0gb3BlcmF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJLy8gbG9nLmRlYnVnKCJhdWRpdCBiZWZvcmUgc2VuZGluZyByZXNwb25zZSIpOworCQkvLyBjb21wb25lbnRVdGlscy5hdWRpdFJlc291cmNlKGVycm9yUmVzcG9uc2UsIG1vZGlmaWVyLCByZXNvdXJjZSwKKwkJLy8gcmVzb3VyY2VDdXJyU3RhdGUubmFtZSgpLCByZXNvdXJjZUN1cnJWZXJzaW9uLAorCQkvLyBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldEF1ZGl0aW5nQWN0aW9uKCksIG51bGwpOworCQkvLworCQkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQkvLyB9CisJCS8vIFJlc291cmNlIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24gPSBvcGVyYXRpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCS8vIEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldworCQkvLyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sCisJCS8vIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCS8vIGF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQsCisJCS8vIGNoYW5nZUluZm8uZ2V0VXNlclJlbWFya3MoKSk7CisJCS8vIGNvbXBvbmVudFV0aWxzLmF1ZGl0UmVzb3VyY2UoY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwKKwkJLy8gbW9kaWZpZXIsIHJlc291cmNlQWZ0ZXJPcGVyYXRpb24sIHJlc291cmNlQ3VyclN0YXRlLm5hbWUoKSwKKwkJLy8gcmVzb3VyY2VDdXJyVmVyc2lvbiwgbGlmZUN5Y2xlVHJhbnNpdGlvbi5nZXRBdWRpdGluZ0FjdGlvbigpLAorCQkvLyBhdWRpdGluZ0ZpZWxkcyk7CisJCS8vIHJldHVybiBvcGVyYXRpb25SZXN1bHQ7CisJCS8vCisJCS8vIH0gZmluYWxseSB7CisJCS8vIGxvZy5kZWJ1ZygidW5sb2NrIHJlc291cmNlIHt9IiwgcmVzb3VyY2VJZCk7CisJCS8vIGlmIChuZWVkVG9VbmxvY2tSZXNvdXJjZSAmJiByZXNvdXJjZSAhPSBudWxsKSB7CisJCS8vIHJlc291cmNlLnNldFVuaXF1ZUlkKHJlc291cmNlSWQpOworCQkvLyBncmFwaExvY2tPcGVyYXRpb24udW5sb2NrUmVzb3VyY2UocmVzb3VyY2UpOworCQkvLyB9CisJCS8vIH0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZUNvbXBvbmVudFN0YXRlKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRJZCwgVXNlciBtb2RpZmllciwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0gdHJhbnNpdGlvbkVudW0sIExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGNoYW5nZUluZm8sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwKKwkJCWJvb2xlYW4gbmVlZExvY2spIHsKKworCQlMaWZlQ3ljbGVUcmFuc2l0aW9uIGxpZmVDeWNsZVRyYW5zaXRpb24gPSBzdGF0ZVRyYW5zaXRpb25zLmdldCh0cmFuc2l0aW9uRW51bS5uYW1lKCkpOworCQlpZiAobGlmZUN5Y2xlVHJhbnNpdGlvbiA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoInN0YXRlIG9wZXJhdGlvbiBpcyBub3QgdmFsaWQuIG9wZXJhdGlvbnMgYWxsb3dlZCBhcmU6IHt9IiwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0udmFsdWVzQXNTdHJpbmcoKSk7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGNvbXBvbmVudFV0aWxzLmdldEludmFsaWRDb250ZW50RXJyb3JBbmRBdWRpdChtb2RpZmllciwgQXVkaXRpbmdBY3Rpb25FbnVtLkNIRUNLT1VUX1JFU09VUkNFKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisJCUNvbXBvbmVudEJ1c2luZXNzTG9naWMgYmwgPSBnZXRDb21wb25lbnRCTChjb21wb25lbnRUeXBlKTsKKworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IG9wZXJhdGlvblJlc3VsdCA9IG51bGw7CisJCUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOworCQkvLyBib29sZWFuIG5lZWRUb1VubG9ja1Jlc291cmNlID0gZmFsc2U7CisJCWxvZy5kZWJ1ZygiZ2V0IHJlc291cmNlIGZyb20gZ3JhcGgiKTsKKwkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZTsKKworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc291cmNlUmVzcG9uc2UgPSBnZXRDb21wb25lbnRGb3JDaGFuZ2UoY29tcG9uZW50VHlwZSwgY29tcG9uZW50SWQsIG1vZGlmaWVyLCBsaWZlQ3ljbGVUcmFuc2l0aW9uLCBjaGFuZ2VJbmZvKTsKKwkJaWYgKGVpdGhlclJlc291cmNlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gZWl0aGVyUmVzb3VyY2VSZXNwb25zZTsKKwkJfQorCQljb21wb25lbnQgPSBlaXRoZXJSZXNvdXJjZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlTdHJpbmcgcmVzb3VyY2VDdXJyVmVyc2lvbiA9IGNvbXBvbmVudC5nZXRWZXJzaW9uKCk7CisJCUxpZmVjeWNsZVN0YXRlRW51bSByZXNvdXJjZUN1cnJTdGF0ZSA9IGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpOworCisJCS8vIGxvY2sgcmVzb3VyY2UKKwkJaWYgKGluVHJhbnNhY3Rpb24gPT0gZmFsc2UgJiYgbmVlZExvY2spIHsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyTG9ja1Jlc291cmNlID0gbG9ja0NvbXBvbmVudChjb21wb25lbnRUeXBlLCBjb21wb25lbnQpOworCQkJaWYgKGVpdGhlckxvY2tSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvclJlc3BvbnNlID0gZWl0aGVyTG9ja1Jlc291cmNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQljb21wb25lbnRVdGlscy5hdWRpdENvbXBvbmVudChlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgY29tcG9uZW50LCByZXNvdXJjZUN1cnJTdGF0ZS5uYW1lKCksIHJlc291cmNlQ3VyclZlcnNpb24sIGxpZmVDeWNsZVRyYW5zaXRpb24uZ2V0QXVkaXRpbmdBY3Rpb24oKSwgY29tcG9uZW50VHlwZSwgbnVsbCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJCS8vIG5lZWRUb1VubG9ja1Jlc291cmNlID0gdHJ1ZTsKKwkJfQorCQl0cnkgeworCQkJRWl0aGVyPFN0cmluZywgUmVzcG9uc2VGb3JtYXQ+IGNvbW1lbnRWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVDb21tZW50KGNoYW5nZUluZm8sIHRyYW5zaXRpb25FbnVtKTsKKwkJCWlmIChjb21tZW50VmFsaWRhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvclJlc3BvbnNlID0gY29tbWVudFZhbGlkYXRpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ09NTUVOVCwgY2hhbmdlSW5mby5nZXRVc2VyUmVtYXJrcygpKTsKKwkJCQljb21wb25lbnRVdGlscy5hdWRpdENvbXBvbmVudChlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgY29tcG9uZW50LCByZXNvdXJjZUN1cnJTdGF0ZS5uYW1lKCksIHJlc291cmNlQ3VyclZlcnNpb24sIGxpZmVDeWNsZVRyYW5zaXRpb24uZ2V0QXVkaXRpbmdBY3Rpb24oKSwgY29tcG9uZW50VHlwZSwgYXVkaXRpbmdGaWVsZHMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisJCQljaGFuZ2VJbmZvLnNldFVzZXJSZW1hcmtzKGNvbW1lbnRWYWxpZGF0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUhpZ2hlc3RWZXJzaW9uID0gdmFsaWRhdGVIaWdoZXN0VmVyc2lvbihtb2RpZmllciwgbGlmZUN5Y2xlVHJhbnNpdGlvbiwgY29tcG9uZW50LCByZXNvdXJjZUN1cnJWZXJzaW9uLCBjb21wb25lbnRUeXBlKTsKKwkJCWlmICh2YWxpZGF0ZUhpZ2hlc3RWZXJzaW9uLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmFsaWRhdGVIaWdoZXN0VmVyc2lvbi5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyUmVzdWx0ID0gbGlmZUN5Y2xlVHJhbnNpdGlvbi5nZXRDb21wb25lbnRPd25lcihjb21wb25lbnQsIGNvbXBvbmVudFR5cGUsIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKG93bmVyUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQob3duZXJSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCVVzZXIgb3duZXIgPSBvd25lclJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1Zygib3duZXIgb2YgcmVzb3VyY2Uge30gaXMge30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgb3duZXIuZ2V0VXNlcklkKCkpOworCisJCQlMaWZlY3ljbGVTdGF0ZUVudW0gb2xkU3RhdGUgPSBjb21wb25lbnQuZ2V0TGlmZWN5Y2xlU3RhdGUoKTsKKworCQkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBzdGF0ZVZhbGlkYXRpb25SZXN1bHQgPSBsaWZlQ3ljbGVUcmFuc2l0aW9uLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihjb21wb25lbnQsIGNvbXBvbmVudFR5cGUsIG1vZGlmaWVyLCBvd25lciwgb2xkU3RhdGUsIGNoYW5nZUluZm8pOworCQkJaWYgKHN0YXRlVmFsaWRhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvclJlc3BvbnNlID0gc3RhdGVWYWxpZGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQsIGNoYW5nZUluZm8uZ2V0VXNlclJlbWFya3MoKSk7CisJCQkJY29tcG9uZW50VXRpbHMuYXVkaXRDb21wb25lbnQoZXJyb3JSZXNwb25zZSwgbW9kaWZpZXIsIGNvbXBvbmVudCwgcmVzb3VyY2VDdXJyU3RhdGUubmFtZSgpLCByZXNvdXJjZUN1cnJWZXJzaW9uLCBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldEF1ZGl0aW5nQWN0aW9uKCksIGNvbXBvbmVudFR5cGUsIGF1ZGl0aW5nRmllbGRzKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCisJCQl9CisKKwkJCW9wZXJhdGlvblJlc3VsdCA9IGxpZmVDeWNsZVRyYW5zaXRpb24uY2hhbmdlU3RhdGUoY29tcG9uZW50VHlwZSwgY29tcG9uZW50LCBibCwgbW9kaWZpZXIsIG93bmVyLCBmYWxzZSwgaW5UcmFuc2FjdGlvbik7CisKKwkJCWlmIChvcGVyYXRpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJZXJyb3JSZXNwb25zZSA9IG9wZXJhdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJhdWRpdCBiZWZvcmUgc2VuZGluZyByZXNwb25zZSIpOworCQkJCWNvbXBvbmVudFV0aWxzLmF1ZGl0Q29tcG9uZW50QWRtaW4oZXJyb3JSZXNwb25zZSwgbW9kaWZpZXIsIGNvbXBvbmVudCwgcmVzb3VyY2VDdXJyU3RhdGUubmFtZSgpLCByZXNvdXJjZUN1cnJWZXJzaW9uLCBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldEF1ZGl0aW5nQWN0aW9uKCksIGNvbXBvbmVudFR5cGUpOworCisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJCX0KKwkJCUNvbXBvbmVudCByZXNvdXJjZUFmdGVyT3BlcmF0aW9uID0gb3BlcmF0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQsIGNoYW5nZUluZm8uZ2V0VXNlclJlbWFya3MoKSk7CisJCQljb21wb25lbnRVdGlscy5hdWRpdENvbXBvbmVudChjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBtb2RpZmllciwgcmVzb3VyY2VBZnRlck9wZXJhdGlvbiwgcmVzb3VyY2VDdXJyU3RhdGUubmFtZSgpLCByZXNvdXJjZUN1cnJWZXJzaW9uLCBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldEF1ZGl0aW5nQWN0aW9uKCksIGNvbXBvbmVudFR5cGUsIGF1ZGl0aW5nRmllbGRzKTsKKwkJCXJldHVybiBvcGVyYXRpb25SZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWxvZy5kZWJ1ZygidW5sb2NrIGNvbXBvbmVudCB7fSIsIGNvbXBvbmVudElkKTsKKwkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlICYmIG5lZWRMb2NrICYmIGNvbXBvbmVudCAhPSBudWxsKSB7CisJCQkJY29tcG9uZW50LnNldFVuaXF1ZUlkKGNvbXBvbmVudElkKTsKKwkJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUgPSBjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCk7CisKKwkJCQkvLyBIYW5kbGUgY29tcG9uZW50IGNoYW5nZSBpbiB0aGUgY2FjaGUgb2YgdGhlIHNpZGUgYWZmZWN0IG9mCisJCQkJLy8gdGhlIG9wZXJhdGlvbgorCQkJCWlmIChvcGVyYXRpb25SZXN1bHQgIT0gbnVsbCAmJiBvcGVyYXRpb25SZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQkJQ29tcG9uZW50IGNvbXBvbmVudEFmdGVyT3BlcnRpb24gPSBvcGVyYXRpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJCVN0cmluZyB1bmlxdWVJZCA9IGNvbXBvbmVudEFmdGVyT3BlcnRpb24uZ2V0VW5pcXVlSWQoKTsKKwkJCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudElkLmVxdWFscyh1bmlxdWVJZCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRHVyaW5nIGNoYW5nZSBzdGF0ZSwgYW5vdGhlciBjb21wb25lbnQge30gaGFzIGJlZW4gY3JlYXRlZC91cGRhdGVkIiwgdW5pcXVlSWQpOworCQkJCQkJaWYgKHVuaXF1ZUlkICE9IG51bGwpIHsKKwkJCQkJCQljYWNoZU1hbmFnZXJPcGVyYXRpb24udXBkYXRlQ29tcG9uZW50SW5DYWNoZSh1bmlxdWVJZCwgY29tcG9uZW50QWZ0ZXJPcGVydGlvbi5nZXRMYXN0VXBkYXRlRGF0ZSgpLCBub2RlVHlwZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KGNvbXBvbmVudElkLCBub2RlVHlwZSk7CisKKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGdldENvbXBvbmVudEZvckNoYW5nZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQsIFVzZXIgbW9kaWZpZXIsIExpZmVDeWNsZVRyYW5zaXRpb24gbGlmZUN5Y2xlVHJhbnNpdGlvbiwgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24gY2hhbmdlSW5mbykgeworCisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXNvdXJjZVJlc3BvbnNlID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCXN3aXRjaCAoY29tcG9uZW50VHlwZSkgeworCQljYXNlIFNFUlZJQ0U6CisJCQllaXRoZXJSZXNvdXJjZVJlc3BvbnNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRDb21wb25lbnQoY29tcG9uZW50SWQsIHRydWUpOworCQkJYnJlYWs7CisJCWNhc2UgUFJPRFVDVDoKKwkJCWVpdGhlclJlc291cmNlUmVzcG9uc2UgPSBwcm9kdWN0T3BlcmF0aW9uLmdldENvbXBvbmVudChjb21wb25lbnRJZCwgdHJ1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBSRVNPVVJDRToKKwkJCWVpdGhlclJlc291cmNlUmVzcG9uc2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRDb21wb25lbnQoY29tcG9uZW50SWQsIHRydWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBudWxsOworCQlpZiAoZWl0aGVyUmVzb3VyY2VSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShlaXRoZXJSZXNvdXJjZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSwgY29tcG9uZW50VHlwZSk7CisJCQllcnJvclJlc3BvbnNlID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJCWxvZy5kZWJ1ZygiYXVkaXQgYmVmb3JlIHNlbmRpbmcgcmVzcG9uc2UiKTsKKwkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DT01NRU5ULCBjaGFuZ2VJbmZvLmdldFVzZXJSZW1hcmtzKCkpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgY29tcG9uZW50SWQpOworCQkJY29tcG9uZW50VXRpbHMuYXVkaXRDb21wb25lbnQoZXJyb3JSZXNwb25zZSwgbW9kaWZpZXIsIG51bGwsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIGxpZmVDeWNsZVRyYW5zaXRpb24uZ2V0QXVkaXRpbmdBY3Rpb24oKSwgY29tcG9uZW50VHlwZSwgYXVkaXRpbmdGaWVsZHMpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChlaXRoZXJSZXNvdXJjZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVIaWdoZXN0VmVyc2lvbihVc2VyIG1vZGlmaWVyLCBMaWZlQ3ljbGVUcmFuc2l0aW9uIGxpZmVDeWNsZVRyYW5zaXRpb24sIFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcmVzb3VyY2VDdXJyVmVyc2lvbikgeworCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlOworCQlpZiAoIXJlc291cmNlLmlzSGlnaGVzdFZlcnNpb24oKSkgeworCQkJbG9nLmRlYnVnKCJyZXNvdXJjZSB2ZXJzaW9uIHt9IGlzIG5vdCB0aGUgbGFzdCB2ZXJzaW9uIG9mIHJlc291cmNlIHt9IiwgcmVzb3VyY2UuZ2V0VmVyc2lvbigpLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSEFTX05FV0VSX1ZFUlNJT04sIHJlc291cmNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQkJY29tcG9uZW50VXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgcmVzb3VyY2UsIHJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkubmFtZSgpLCByZXNvdXJjZUN1cnJWZXJzaW9uLCBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldEF1ZGl0aW5nQWN0aW9uKCksIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUmVzb3VyY2VOb3REZWxldGVkKFVzZXIgbW9kaWZpZXIsIExpZmVDeWNsZVRyYW5zaXRpb24gbGlmZUN5Y2xlVHJhbnNpdGlvbiwgUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyByZXNvdXJjZUN1cnJWZXJzaW9uKSB7CisKKwkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZTsKKwkJaWYgKChyZXNvdXJjZS5nZXRJc0RlbGV0ZWQoKSAhPSBudWxsKSAmJiAocmVzb3VyY2UuZ2V0SXNEZWxldGVkKCkgPT0gdHJ1ZSkpIHsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EOworCQkJZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlSZXNvdXJjZShhY3Rpb25TdGF0dXMsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQlsb2cuZGVidWcoInJlc291cmNlIHt9IHt9IGlzIG1hcmtlZCBmb3IgZGVsZXRlIiwgcmVzb3VyY2UuZ2V0TmFtZSgpLCByZXNvdXJjZS5nZXRWZXJzaW9uKCkpOworCQkJY29tcG9uZW50VXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgbnVsbCwgIiIsICIiLCBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldEF1ZGl0aW5nQWN0aW9uKCksIG51bGwpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVIaWdoZXN0VmVyc2lvbihVc2VyIG1vZGlmaWVyLCBMaWZlQ3ljbGVUcmFuc2l0aW9uIGxpZmVDeWNsZVRyYW5zaXRpb24sIENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyByZXNvdXJjZUN1cnJWZXJzaW9uLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2U7CisJCWlmICghY29tcG9uZW50LmlzSGlnaGVzdFZlcnNpb24oKSkgeworCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgdmVyc2lvbiB7fSBpcyBub3QgdGhlIGxhc3QgdmVyc2lvbiBvZiBjb21wb25lbnQge30iLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSwKKwkJCQkJY29tcG9uZW50LmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSEFTX05FV0VSX1ZFUlNJT04sIGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpLCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCkudG9Mb3dlckNhc2UoKSk7CisJCQljb21wb25lbnRVdGlscy5hdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIG1vZGlmaWVyLCBjb21wb25lbnQsIGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpLm5hbWUoKSwgcmVzb3VyY2VDdXJyVmVyc2lvbiwgbGlmZUN5Y2xlVHJhbnNpdGlvbi5nZXRBdWRpdGluZ0FjdGlvbigpLCBjb21wb25lbnRUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBsb2NrQ29tcG9uZW50KENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlID0gY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tSZXNvdXJjZVN0YXR1cyA9IGdyYXBoTG9ja09wZXJhdGlvbi5sb2NrQ29tcG9uZW50KGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBub2RlVHlwZSk7CisKKwkJaWYgKGxvY2tSZXNvdXJjZVN0YXR1cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShsb2NrUmVzb3VyY2VTdGF0dXMpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGdldFJlc291cmNlRm9yQ2hhbmdlKFN0cmluZyByZXNvdXJjZUlkLCBVc2VyIG1vZGlmaWVyLCBMaWZlQ3ljbGVUcmFuc2l0aW9uIGxpZmVDeWNsZVRyYW5zaXRpb24pIHsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXNvdXJjZVJlc3BvbnNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCwgdHJ1ZSk7CisKKwkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IG51bGw7CisJCWlmIChlaXRoZXJSZXNvdXJjZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudFV0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGVpdGhlclJlc291cmNlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCWVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoYWN0aW9uU3RhdHVzLCAiIik7CisJCQlsb2cuZGVidWcoImF1ZGl0IGJlZm9yZSBzZW5kaW5nIHJlc3BvbnNlIik7CisJCQkvLyBGb3IgYXVkaXQgb2Ygbm90IGZvdW5kLCByZXNvdXJjZU5hbWUgc2hvdWxkIGJlIHVuaXF1ZUlEIGFjY29yZGluZworCQkJLy8gdG8gRWxsYQorCQkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHJlc291cmNlSWQpOworCQkJY29tcG9uZW50VXRpbHMuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCBtb2RpZmllciwgbnVsbCwgIiIsICIiLCBsaWZlQ3ljbGVUcmFuc2l0aW9uLmdldEF1ZGl0aW5nQWN0aW9uKCksIG51bGwpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisJCVJlc291cmNlIHJlc291cmNlID0gZWl0aGVyUmVzb3VyY2VSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8U3RyaW5nLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVDb21tZW50KExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uIGNoYW5nZUluZm8sIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtIHRyYW5zaXRpb25FbnVtKSB7CisJCVN0cmluZyBjb21tZW50ID0gY2hhbmdlSW5mby5nZXRVc2VyUmVtYXJrcygpOworCQlpZiAoTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0FOQ0VMX0NFUlRJRklDQVRJT04gPT0gdHJhbnNpdGlvbkVudW0gfHwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0VSVElGWSA9PSB0cmFuc2l0aW9uRW51bSB8fCBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5GQUlMX0NFUlRJRklDQVRJT04gPT0gdHJhbnNpdGlvbkVudW0gfHwgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0hFQ0tJTiA9PSB0cmFuc2l0aW9uRW51bQorCQkJCXx8IExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNFUlRJRklDQVRJT05fUkVRVUVTVCA9PSB0cmFuc2l0aW9uRW51bQorCQkvLyBpbXBvcnQ/CisJCSkgeworCisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KGNvbW1lbnQpKSB7CisJCQkJbG9nLmRlYnVnKCJ1c2VyIGNvbW1lbnQgY2Fubm90IGJlIGVtcHR5IG9yIG51bGwuIik7CisJCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0RBVEEsIENPTU1FTlQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JSZXNwb25zZSk7CisJCQl9CisKKwkJCWNvbW1lbnQgPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlTm9uZVV0ZjhDaGFycyhjb21tZW50KTsKKwkJCWNvbW1lbnQgPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlSHRtbFRhZ3MoY29tbWVudCk7CisJCQljb21tZW50ID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZVdoaXRlc3BhY2UoY29tbWVudCk7CisJCQljb21tZW50ID0gVmFsaWRhdGlvblV0aWxzLnN0cmlwT2N0ZXRzKGNvbW1lbnQpOworCisJCQlpZiAoIVZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUxlbmd0aChjb21tZW50LCBWYWxpZGF0aW9uVXRpbHMuQ09NTUVOVF9NQVhfTEVOR1RIKSkgeworCQkJCWxvZy5kZWJ1ZygidXNlciBjb21tZW50IGV4Y2VlZHMgbGltaXQuIik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuRVhDRUVEU19MSU1JVCwgQ09NTUVOVCwgU3RyaW5nLnZhbHVlT2YoVmFsaWRhdGlvblV0aWxzLkNPTU1FTlRfTUFYX0xFTkdUSCkpKTsKKwkJCX0KKwkJCWlmICghVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSXNFbmdsaXNoKGNvbW1lbnQpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbW1lbnQpOworCX0KKworCXByaXZhdGUgQ29tcG9uZW50QnVzaW5lc3NMb2dpYyBnZXRDb21wb25lbnRCTChDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgeworCQlDb21wb25lbnRCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWM7CisJCXN3aXRjaCAoY29tcG9uZW50VHlwZUVudW0pIHsKKwkJY2FzZSBSRVNPVVJDRTogeworCQkJYnVzaW5lc3NMb2dpYyA9IHRoaXMucmVzb3VyY2VCdXNpbmVzc0xvZ2ljOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTRVJWSUNFOiB7CisJCQlidXNpbmVzc0xvZ2ljID0gdGhpcy5zZXJ2aWNlQnVzaW5lc3NMb2dpYzsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUFJPRFVDVDogeworCQkJYnVzaW5lc3NMb2dpYyA9IHRoaXMucHJvZHVjdEJ1c2luZXNzTG9naWM7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6IHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiZ2V0Q29tcG9uZW50QkwiKTsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgY29tcG9uZW50IHR5cGU6IiArIGNvbXBvbmVudFR5cGVFbnVtLmdldFZhbHVlKCkpOworCQl9CisJCX0KKwkJcmV0dXJuIGJ1c2luZXNzTG9naWM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvTGlmZWN5Y2xlQ2hhbmdlSW5mb0Jhc2UuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9MaWZlY3ljbGVDaGFuZ2VJbmZvQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzVjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvTGlmZWN5Y2xlQ2hhbmdlSW5mb0Jhc2UuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVDaGFuZ2VJbmZvQmFzZSB7CisKKwlwdWJsaWMgTGlmZWN5Y2xlQ2hhbmdlSW5mb0Jhc2UoKSB7CisJfQorCisJcHVibGljIExpZmVjeWNsZUNoYW5nZUluZm9CYXNlKFN0cmluZyB1c2VyUmVtYXJrcykgeworCQlzdXBlcigpOworCQl0aGlzLnVzZXJSZW1hcmtzID0gdXNlclJlbWFya3M7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgdXNlclJlbWFya3M7CisKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJSZW1hcmtzKCkgeworCQlyZXR1cm4gdXNlclJlbWFya3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlclJlbWFya3MoU3RyaW5nIHVzZXJSZW1hcmtzKSB7CisJCXRoaXMudXNlclJlbWFya3MgPSB1c2VyUmVtYXJrczsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9MaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MGUxODcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbiBleHRlbmRzIExpZmVjeWNsZUNoYW5nZUluZm9CYXNlIHsKKworCXB1YmxpYyBlbnVtIExpZmVjeWNsZUNoYW5jZUFjdGlvbkVudW0geworCQlDUkVBVEVfRlJPTV9DU0FSLCBVUERBVEVfRlJPTV9FWFRFUk5BTF9BUEkKKwl9OworCisJcHJpdmF0ZSBMaWZlY3ljbGVDaGFuY2VBY3Rpb25FbnVtIGFjdGlvbjsKKworCXB1YmxpYyBMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbigpIHsKKwl9CisKKwlwdWJsaWMgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24oU3RyaW5nIHVzZXJSZW1hcmtzKSB7CisJCXN1cGVyKHVzZXJSZW1hcmtzKTsKKwl9CisKKwlwdWJsaWMgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24oU3RyaW5nIHVzZXJSZW1hcmtzLCBMaWZlY3ljbGVDaGFuY2VBY3Rpb25FbnVtIGFjdGlvbikgeworCQlzdXBlcih1c2VyUmVtYXJrcyk7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBMaWZlY3ljbGVDaGFuY2VBY3Rpb25FbnVtIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oTGlmZWN5Y2xlQ2hhbmNlQWN0aW9uRW51bSBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL1N0YXJ0Q2VydGlmaWNhdGlvblRyYW5zaXRpb24uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9TdGFydENlcnRpZmljYXRpb25UcmFuc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MTQwYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9TdGFydENlcnRpZmljYXRpb25UcmFuc2l0aW9uLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ29tcG9uZW50QnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUxpZmVjeWNsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFN0YXJ0Q2VydGlmaWNhdGlvblRyYW5zaXRpb24gZXh0ZW5kcyBMaWZlQ3ljbGVUcmFuc2l0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTdGFydENlcnRpZmljYXRpb25UcmFuc2l0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgU3RhcnRDZXJ0aWZpY2F0aW9uVHJhbnNpdGlvbihDb21wb25lbnRzVXRpbHMgY29tcG9uZW50VXRpbHMsIElMaWZlY3ljbGVPcGVyYXRpb24gbGlmZWN5Y2xlT3BlcmF0aW9uKSB7CisJCXN1cGVyKGNvbXBvbmVudFV0aWxzLCBsaWZlY3ljbGVPcGVyYXRpb24pOworCisJCS8vIGF1dGhvcml6ZWQgcm9sZXMKKwkJUm9sZVtdIHJzcmNTZXJ2aWNlU3RhcnRDZXJ0aWZpY2F0aW9uUm9sZXMgPSB7IFJvbGUuQURNSU4sIFJvbGUuVEVTVEVSIH07CisJCWFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgQXJyYXlzLmFzTGlzdChyc3JjU2VydmljZVN0YXJ0Q2VydGlmaWNhdGlvblJvbGVzKSk7CisJCWFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCBBcnJheXMuYXNMaXN0KHJzcmNTZXJ2aWNlU3RhcnRDZXJ0aWZpY2F0aW9uUm9sZXMpKTsKKwkJLy8gVE9ETyB0byBiZSBsYXRlciBkZWZpbmVkIGZvciBwcm9kdWN0CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtIGdldE5hbWUoKSB7CisJCXJldHVybiBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5TVEFSVF9DRVJUSUZJQ0FUSU9OOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBdWRpdGluZ0FjdGlvbkVudW0gZ2V0QXVkaXRpbmdBY3Rpb24oKSB7CisJCXJldHVybiBBdWRpdGluZ0FjdGlvbkVudW0uU1RBUlRfQ0VSVElGSUNBVElPTl9SRVNPVVJDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnRCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEJsLCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCWxvZy5kZWJ1Zygic3RhcnQgcGVyZm9ybWluZyBjZXJ0aWZpY2F0aW9uIHRlc3QgZm9yIHJlc291cmNlIHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IChjb21wb25lbnRUeXBlLmVxdWFscyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSkgPyBOb2RlVHlwZUVudW0uU2VydmljZSA6IE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXRlQ2hhbmdlUmVzdWx0ID0gbGlmZUN5Y2xlT3BlcmF0aW9uLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihub2RlVHlwZSwgY29tcG9uZW50LCBtb2RpZmllciwgb3duZXIsIGluVHJhbnNhY3Rpb24pOworCQlpZiAoc3RhdGVDaGFuZ2VSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoInN0YXJ0IGNlcnRpZmljYXRpb24gZmFpbGVkIG9uIGdyYXBoIik7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3BvbnNlID0gc3RhdGVDaGFuZ2VSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudFV0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHJlc3BvbnNlKTsKKworCQkJaWYgKHJlc3BvbnNlLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkVOVElUWV9BTFJFQURZX0VYSVNUUykpIHsKKwkJCQlhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1ZFUlNJT05fQUxSRUFEWV9FWElTVDsKKwkJCX0KKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUNvbXBvbmVudChhY3Rpb25TdGF0dXMsIGNvbXBvbmVudCwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChzdGF0ZUNoYW5nZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bSBvbGRTdGF0ZSwgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24gbGlmZWN5Y2xlQ2hhbmdlSW5mbykgeworCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOworCQlsb2cuZGVidWcoInZhbGlkYXRlIGJlZm9yZSBzdGFydCBjZXJ0aWZpY2F0aW9uIHRlc3QuIHJlc291cmNlIG5hbWU9e30sIG9sZFN0YXRlPXt9LCBvd25lciB1c2VySWQ9e30iLCBjb21wb25lbnROYW1lLCBvbGRTdGF0ZSwgb3duZXIuZ2V0VXNlcklkKCkpOworCisJCS8vIHZhbGlkYXRlIHVzZXIKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB1c2VyVmFsaWRhdGlvblJlc3BvbnNlID0gdXNlclJvbGVWYWxpZGF0aW9uKG1vZGlmaWVyLCBjb21wb25lbnRUeXBlLCBsaWZlY3ljbGVDaGFuZ2VJbmZvKTsKKwkJaWYgKHVzZXJWYWxpZGF0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gdXNlclZhbGlkYXRpb25SZXNwb25zZTsKKwkJfQorCisJCWlmIChvbGRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTikgfHwgb2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05PVF9SRUFEWV9GT1JfQ0VSVElGSUNBVElPTiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJfQorCisJCWlmIChvbGRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9BTFJFQURZX0NFUlRJRklFRCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb3duZXIuZ2V0Rmlyc3ROYW1lKCksIG93bmVyLmdldExhc3ROYW1lKCksIG93bmVyLmdldFVzZXJJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisKKwkJaWYgKG9sZFN0YXRlLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUykpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTl9DRVJUX0lOX1BST0dSRVNTX1NUQVRFLCBjb21wb25lbnROYW1lLCBjb21wb25lbnRUeXBlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCBvd25lci5nZXRGaXJzdE5hbWUoKSwgb3duZXIuZ2V0TGFzdE5hbWUoKSwgb3duZXIuZ2V0VXNlcklkKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvVW5kb0NoZWNrb3V0VHJhbnNpdGlvbi5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL1VuZG9DaGVja291dFRyYW5zaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2IyMTFiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL1VuZG9DaGVja291dFRyYW5zaXRpb24uamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5BcnRpZmFjdHNCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Db21wb25lbnRCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUxpZmVjeWNsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgVW5kb0NoZWNrb3V0VHJhbnNpdGlvbiBleHRlbmRzIExpZmVDeWNsZVRyYW5zaXRpb24geworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDaGVja291dFRyYW5zaXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIEFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTWFuYWdlcjsKKworCXB1YmxpYyBVbmRvQ2hlY2tvdXRUcmFuc2l0aW9uKENvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscywgSUxpZmVjeWNsZU9wZXJhdGlvbiBsaWZlY3ljbGVPcGVyYXRpb24pIHsKKwkJc3VwZXIoY29tcG9uZW50VXRpbHMsIGxpZmVjeWNsZU9wZXJhdGlvbik7CisKKwkJLy8gYXV0aG9yaXplZCByb2xlcworCQlSb2xlW10gcmVzb3VyY2VTZXJ2aWNlQ2hlY2tvdXRSb2xlcyA9IHsgUm9sZS5BRE1JTiwgUm9sZS5ERVNJR05FUiB9OworCQlSb2xlW10gcHJvZHVjdENoZWNrb3V0Um9sZXMgPSB7IFJvbGUuQURNSU4sIFJvbGUuUFJPRFVDVF9NQU5BR0VSIH07CisJCWFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgQXJyYXlzLmFzTGlzdChyZXNvdXJjZVNlcnZpY2VDaGVja291dFJvbGVzKSk7CisJCWFkZEF1dGhvcml6ZWRSb2xlcyhDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCBBcnJheXMuYXNMaXN0KHJlc291cmNlU2VydmljZUNoZWNrb3V0Um9sZXMpKTsKKwkJYWRkQXV0aG9yaXplZFJvbGVzKENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QsIEFycmF5cy5hc0xpc3QocHJvZHVjdENoZWNrb3V0Um9sZXMpKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bSBnZXROYW1lKCkgeworCQlyZXR1cm4gTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uVU5ET19DSEVDS09VVDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQXVkaXRpbmdBY3Rpb25FbnVtIGdldEF1ZGl0aW5nQWN0aW9uKCkgeworCQlyZXR1cm4gQXVkaXRpbmdBY3Rpb25FbnVtLlVORE9fQ0hFQ0tPVVRfUkVTT1VSQ0U7CisJfQorCisJcHVibGljIEFydGlmYWN0c0J1c2luZXNzTG9naWMgZ2V0QXJ0aWZhY3RzQnVzaW5lc3NMb2dpYygpIHsKKwkJcmV0dXJuIGFydGlmYWN0c01hbmFnZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyhBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c0J1c2luZXNzTG9naWMpIHsKKwkJdGhpcy5hcnRpZmFjdHNNYW5hZ2VyID0gYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24oQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgVXNlciBtb2RpZmllciwgVXNlciBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtIG9sZFN0YXRlLCBMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbiBsaWZlY3ljbGVDaGFuZ2VJbmZvKSB7CisJCVN0cmluZyBjb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgYmVmb3JlIHVuZG8gY2hlY2tvdXQuIHJlc291cmNlIG5hbWU9e30sIG9sZFN0YXRlPXt9LCBvd25lciB1c2VySWQ9e30iLCBjb21wb25lbnROYW1lLCBvbGRTdGF0ZSwgb3duZXIuZ2V0VXNlcklkKCkpOworCisJCS8vIHZhbGlkYXRlIHVzZXIKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB1c2VyVmFsaWRhdGlvblJlc3BvbnNlID0gdXNlclJvbGVWYWxpZGF0aW9uKG1vZGlmaWVyLCBjb21wb25lbnRUeXBlLCBsaWZlY3ljbGVDaGFuZ2VJbmZvKTsKKwkJaWYgKHVzZXJWYWxpZGF0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gdXNlclZhbGlkYXRpb25SZXNwb25zZTsKKwkJfQorCisJCS8vIGNoZWNrIHJlc291cmNlIGlzIG5vdCBsb2NrZWQgYnkgYW5vdGhlciB1c2VyCisJCWlmICghb2xkU3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0FMUkVBRFlfQ0hFQ0tFRF9JTiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb3duZXIuZ2V0Rmlyc3ROYW1lKCksIG93bmVyLmdldExhc3ROYW1lKCksIG93bmVyLmdldFVzZXJJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisKKwkJaWYgKCFtb2RpZmllci5lcXVhbHMob3duZXIpICYmICFtb2RpZmllci5nZXRSb2xlKCkuZXF1YWxzKFJvbGUuQURNSU4ubmFtZSgpKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NIRUNLT1VUX0JZX0FOT1RIRVJfVVNFUiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb3duZXIuZ2V0Rmlyc3ROYW1lKCksIG93bmVyLmdldExhc3ROYW1lKCksIG93bmVyLmdldFVzZXJJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudEJ1c2luZXNzTG9naWMgY29tcG9uZW50QmwsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiByZXN1bHQgPSBudWxsOworCQlsb2cuZGVidWcoInN0YXJ0IHBlcmZvcm1pbmcgdW5kby1jaGVja291dCBmb3IgcmVzb3VyY2Uge30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RzUmVzID0gbGlmZUN5Y2xlT3BlcmF0aW9uLmdldENvbXBvbmVudE9wZXJhdGlvbihjb21wb25lbnRUeXBlLmdldE5vZGVUeXBlKCkpLmdldENvbXBvbmVudEFydGlmYWN0c0ZvckRlbGV0ZShjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50VHlwZS5nZXROb2RlVHlwZSgpLCB0cnVlKTsKKwkJaWYgKGFydGlmYWN0c1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBjb21wb25lbnRVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShhcnRpZmFjdHNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUNvbXBvbmVudChhY3Rpb25TdGF0dXMsIGNvbXBvbmVudCwgY29tcG9uZW50VHlwZSk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQkvLyBUT0RPIC0gc3RhcnQgdHJhbnNhY3Rpb24KKwkJdHJ5IHsKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IGNvbXBvbmVudFR5cGUuZ2V0Tm9kZVR5cGUoKTsKKworCQkJLy8gMS4gcGVyZm9ybSB1bmRvIGNoZWNrb3V0IG9uIGdyYXBoICh1cGRhdGUgc3RhdHVzIGFuZCBkZWxldGUKKwkJCS8vIGN1cnJlbnQgdmVyc2lvbikKKwkJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1bmRvQ2hlY2tvdXRSZXNvdXJjZVJlc3VsdCA9IGxpZmVDeWNsZU9wZXJhdGlvbi51bmRvQ2hlY2tvdXQobm9kZVR5cGUsIGNvbXBvbmVudCwgbW9kaWZpZXIsIG93bmVyLCB0cnVlKTsKKworCQkJaWYgKHVuZG9DaGVja291dFJlc291cmNlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiY2hlY2tvdXQgZmFpbGVkIG9uIGdyYXBoIik7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXNwb25zZSA9IHVuZG9DaGVja291dFJlc291cmNlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY29tcG9uZW50VXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UocmVzcG9uc2UpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50VXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeUNvbXBvbmVudChhY3Rpb25TdGF0dXMsIGNvbXBvbmVudCwgY29tcG9uZW50VHlwZSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvLyAyLiBkZWxldGUgdW5yZWxhdGVkIGFydGlmYWN0cworCQkJLy8gdXNlIGFydGlmYWN0cyBBUEkgdG8gZGVsZXRlIGFydGlmYWN0cyBmcm9tIHN3aWZ0IC8gZWxhc3RpY3NlYXJjaAorCisJCQlpZiAoYXJ0aWZhY3RzUmVzLmxlZnQoKS52YWx1ZSgpICE9IG51bGwpIHsKKwkJCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gYXJ0aWZhY3RzUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGVsZXRlQWxsUmVzb3VyY2VBcnRpZmFjdHMgPSBhcnRpZmFjdHNNYW5hZ2VyLmRlbGV0ZUFsbENvbXBvbmVudEFydGlmYWN0c0lmTm90T25HcmFwaChhcnRpZmFjdHMpOworCisJCQkJaWYgKCFkZWxldGVBbGxSZXNvdXJjZUFydGlmYWN0cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IGNvbXBvbmVudFV0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKGRlbGV0ZUFsbFJlc291cmNlQXJ0aWZhY3RzKTsKKwkJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5Q29tcG9uZW50KGFjdGlvblN0YXR1cywgY29tcG9uZW50LCBjb21wb25lbnRUeXBlKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHVuZG9DaGVja291dFJlc291cmNlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsICJDaGFuZ2UgTGlmZWN5Y2xlU3RhdGUgLSBVbmRvIENoZWNrb3V0IGZhaWxlZCBvbiBncmFwaCIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJDaGFuZ2UgTGlmZWN5Y2xlU3RhdGUgLSBVbmRvIENoZWNrb3V0IGZhaWxlZCBvbiBncmFwaCIpOworCisJCQkJbG9nLmRlYnVnKCJvcGVyYXRpb24gZmFpbGVkLiBkbyByb2xsYmFjayIpOworCQkJCWxpZmVDeWNsZU9wZXJhdGlvbi5nZXRSZXNvdXJjZU9wZXJhdGlvbigpLmdldFRpdGFuR2VuZXJpY0RhbygpLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1Zygib3BlcmF0aW9uIHN1Y2Nlc3MuIGRvIGNvbW1pdCIpOworCQkJCWxpZmVDeWNsZU9wZXJhdGlvbi5nZXRSZXNvdXJjZU9wZXJhdGlvbigpLmdldFRpdGFuR2VuZXJpY0RhbygpLmNvbW1pdCgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhbW9kZWwvYXBpL0NhdGVnb3J5VHlwZUVudW0uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhbW9kZWwvYXBpL0NhdGVnb3J5VHlwZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGZlNTZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGFtb2RlbC9hcGkvQ2F0ZWdvcnlUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwuYXBpOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK3B1YmxpYyBlbnVtIENhdGVnb3J5VHlwZUVudW0gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJQ0FURUdPUlkoImNhdGVnb3J5IiksIFNVQkNBVEVHT1JZKCJzdWItY2F0ZWdvcnkiKSwgR1JPVVBJTkcoImdyb3VwaW5nIik7CisKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCUNhdGVnb3J5VHlwZUVudW0oU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YW1vZGVsL2FwaS9IaWdoZXN0RmlsdGVyRW51bS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGFtb2RlbC9hcGkvSGlnaGVzdEZpbHRlckVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZmNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGFtb2RlbC9hcGkvSGlnaGVzdEZpbHRlckVudW0uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YW1vZGVsLmFwaTsKKworcHVibGljIGVudW0gSGlnaGVzdEZpbHRlckVudW0geworCisJQUxMLCBISUdIRVNUX09OTFksIE5PTl9ISUdIRVNUX09OTFk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhbW9kZWwvdXRpbHMvQXJ0aWZhY3RVdGlscy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGFtb2RlbC91dGlscy9BcnRpZmFjdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2NjkxMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhbW9kZWwvdXRpbHMvQXJ0aWZhY3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwudXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RVdGlscyB7CisJcHVibGljIHN0YXRpYyBBcnRpZmFjdERlZmluaXRpb24gZmluZE1hc3RlckFydGlmYWN0KE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbHltZW50QXJ0aWZhY3QsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMsIExpc3Q8U3RyaW5nPiBhcnRpZmFjdHNMaXN0KSB7CisJCWZvciAoU3RyaW5nIGFydGlmYWN0VWlkIDogYXJ0aWZhY3RzTGlzdCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBkZXBseW1lbnRBcnRpZmFjdC5lbnRyeVNldCgpKSB7CisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0ID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlpZiAoYXJ0aWZhY3RVaWQuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdC5nZXRVbmlxdWVJZCgpKSkgeworCQkJCQlhcnRpZmFjdHMuYWRkKGFydGlmYWN0KTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCQlpZiAoYXJ0aWZhY3RzLnNpemUoKSA9PSAxKSB7CisJCQlyZXR1cm4gYXJ0aWZhY3RzLmdldCgwKTsKKwkJfQorCQlBcnRpZmFjdERlZmluaXRpb24gbWFzdGVyQXJ0aWZhY3QgPSBudWxsOworCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8gOiBhcnRpZmFjdHMpIHsKKwkJCVN0cmluZyBhdHJpZmFjdFR5cGUgPSBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCk7CisJCQlpZiAoYXRyaWZhY3RUeXBlLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX1ZPTC5nZXRUeXBlKCkpIHx8IGF0cmlmYWN0VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9ORVQuZ2V0VHlwZSgpKSkgeworCQkJCW1hc3RlckFydGlmYWN0ID0gYXJ0aWZhY3RJbmZvOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGF0cmlmYWN0VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpKSB7CisJCQkJbWFzdGVyQXJ0aWZhY3QgPSBhcnRpZmFjdEluZm87CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIG1hc3RlckFydGlmYWN0OworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhbW9kZWwvdXRpbHMvTm9kZVR5cGVDb252ZXJ0VXRpbHMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhbW9kZWwvdXRpbHMvTm9kZVR5cGVDb252ZXJ0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjcxNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGFtb2RlbC91dGlscy9Ob2RlVHlwZUNvbnZlcnRVdGlscy5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwudXRpbHM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwuYXBpLkNhdGVnb3J5VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBOb2RlVHlwZUNvbnZlcnRVdGlscyB7CisJcHVibGljIHN0YXRpYyBOb2RlVHlwZUVudW0gZ2V0Q2F0ZWdvcnlOb2RlVHlwZUJ5Q29tcG9uZW50UGFyYW0oQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIENhdGVnb3J5VHlwZUVudW0gY2F0ZWdvcnlUeXBlKSB7CisJCU5vZGVUeXBlRW51bSByZXMgPSBudWxsOworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gIT0gbnVsbCkgeworCQkJc3dpdGNoIChjb21wb25lbnRUeXBlRW51bSkgeworCQkJY2FzZSBTRVJWSUNFOgorCQkJCXN3aXRjaCAoY2F0ZWdvcnlUeXBlKSB7CisJCQkJY2FzZSBDQVRFR09SWToKKwkJCQkJcmVzID0gTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQkvLyBkb2Vzbid0IHN1cHBvcnQgc3ViY2F0ZWdvcmllcyBvciBncm91cGluZworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFJFU09VUkNFOgorCQkJCXN3aXRjaCAoY2F0ZWdvcnlUeXBlKSB7CisJCQkJY2FzZSBDQVRFR09SWToKKwkJCQkJcmVzID0gTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1VCQ0FURUdPUlk6CisJCQkJCXJlcyA9IE5vZGVUeXBlRW51bS5SZXNvdXJjZVN1YmNhdGVnb3J5OworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkvLyBkb2Vzbid0IHN1cHBvcnQgZ3JvdXBpbmcKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQUk9EVUNUOgorCQkJCXN3aXRjaCAoY2F0ZWdvcnlUeXBlKSB7CisJCQkJY2FzZSBDQVRFR09SWToKKwkJCQkJcmVzID0gTm9kZVR5cGVFbnVtLlByb2R1Y3RDYXRlZ29yeTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTVUJDQVRFR09SWToKKwkJCQkJcmVzID0gTm9kZVR5cGVFbnVtLlByb2R1Y3RTdWJjYXRlZ29yeTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBHUk9VUElORzoKKwkJCQkJcmVzID0gTm9kZVR5cGVFbnVtLlByb2R1Y3RHcm91cGluZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9BdWRpdEhhbmRsZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vQXVkaXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjNDE1YwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vQXVkaXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5DYW1icmlhRXJyb3JSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuU3Vic2NyaWJlclR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LlJlZ2lzdHJhdGlvblJlcXVlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworCitwdWJsaWMgY2xhc3MgQXVkaXRIYW5kbGVyIHsKKwlDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzOworCVN0cmluZyBpbnN0YW5jZUlEOworCXByaXZhdGUgUmVnaXN0cmF0aW9uUmVxdWVzdCByZWdpc3RyYXRpb25SZXF1ZXN0OworCisJcHVibGljIEF1ZGl0SGFuZGxlcihDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzLCBTdHJpbmcgaW5zdGFuY2VJRCwgUmVnaXN0cmF0aW9uUmVxdWVzdCByZWdpc3RyYXRpb25SZXF1ZXN0KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29tcG9uZW50c1V0aWxzID0gY29tcG9uZW50c1V0aWxzOworCQl0aGlzLmluc3RhbmNlSUQgPSBpbnN0YW5jZUlEOworCQl0aGlzLnJlZ2lzdHJhdGlvblJlcXVlc3QgPSByZWdpc3RyYXRpb25SZXF1ZXN0OworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0UmVnaXN0ZXJBQ0woQ2FtYnJpYUVycm9yUmVzcG9uc2UgcmVnaXN0ZXJSZXNwb25zZSwgU3Vic2NyaWJlclR5cGVFbnVtIHN1YnNjcmliZXJSb2xlKSB7CisKKwkJU3RyaW5nIHRvcGljTmFtZSA9IChzdWJzY3JpYmVyUm9sZSA9PSBTdWJzY3JpYmVyVHlwZUVudW0uQ09OU1VNRVIpID8gRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYy5nZXROb3RpZmljYXRpb25Ub3BpY05hbWUocmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSkKKwkJCQk6IERpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuZ2V0U3RhdHVzVG9waWNOYW1lKHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQljb21wb25lbnRzVXRpbHMuYXVkaXRUb3BpY0FDTEtleXMoQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9LRVlfVE9fVE9QSUNfQUNMLCByZWdpc3RyYXRpb25SZXF1ZXN0LmdldERpc3RyRW52TmFtZSgpLCB0b3BpY05hbWUsIHN1YnNjcmliZXJSb2xlLm5hbWUoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXRBcGlQdWJsaWNLZXkoKSwgU3RyaW5nLnZhbHVlT2YocmVnaXN0ZXJSZXNwb25zZS5nZXRIdHRwQ29kZSgpKSk7CisJfQorCisJcHVibGljIHZvaWQgYXVkaXRVblJlZ2lzdGVyQUNMKENhbWJyaWFFcnJvclJlc3BvbnNlIHJlZ2lzdGVyUmVzcG9uc2UsIFN1YnNjcmliZXJUeXBlRW51bSBzdWJzY3JpYmVyUm9sZSkgeworCQlTdHJpbmcgdG9waWNOYW1lID0gKHN1YnNjcmliZXJSb2xlID09IFN1YnNjcmliZXJUeXBlRW51bS5DT05TVU1FUikgPyBEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmdldE5vdGlmaWNhdGlvblRvcGljTmFtZShyZWdpc3RyYXRpb25SZXF1ZXN0LmdldERpc3RyRW52TmFtZSgpKQorCQkJCTogRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYy5nZXRTdGF0dXNUb3BpY05hbWUocmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisJCWNvbXBvbmVudHNVdGlscy5hdWRpdFRvcGljQUNMS2V5cyhBdWRpdGluZ0FjdGlvbkVudW0uUkVNT1ZFX0tFWV9GUk9NX1RPUElDX0FDTCwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSwgdG9waWNOYW1lLCBzdWJzY3JpYmVyUm9sZS5uYW1lKCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0QXBpUHVibGljS2V5KCksIFN0cmluZy52YWx1ZU9mKHJlZ2lzdGVyUmVzcG9uc2UuZ2V0SHR0cENvZGUoKSkpOworCisJfQorCisJcHVibGljIHZvaWQgYXVkaXRSZWdpc3RlclJlcXVlc3QoQ2FtYnJpYUVycm9yUmVzcG9uc2UgcmVnaXN0ZXJSZXNwb25zZSkgeworCQljb21wb25lbnRzVXRpbHMuYXVkaXRSZWdpc3Rlck9yVW5SZWdpc3RlckV2ZW50KEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fUkVHSVNURVIsIGluc3RhbmNlSUQsIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0QXBpUHVibGljS2V5KCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCksIFN0cmluZy52YWx1ZU9mKHJlZ2lzdGVyUmVzcG9uc2UuZ2V0SHR0cENvZGUoKSksCisJCQkJcmVnaXN0ZXJSZXNwb25zZS5nZXRPcGVyYXRpb25TdGF0dXMoKS5uYW1lKCksIERpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuZ2V0Tm90aWZpY2F0aW9uVG9waWNOYW1lKHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpLCBEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmdldFN0YXR1c1RvcGljTmFtZShyZWdpc3RyYXRpb25SZXF1ZXN0LmdldERpc3RyRW52TmFtZSgpKSk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdFVuUmVnaXN0ZXJSZXF1ZXN0KENhbWJyaWFFcnJvclJlc3BvbnNlIHJlZ2lzdGVyUmVzcG9uc2UpIHsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0UmVnaXN0ZXJPclVuUmVnaXN0ZXJFdmVudChBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX1VOX1JFR0lTVEVSLCBpbnN0YW5jZUlELCByZWdpc3RyYXRpb25SZXF1ZXN0LmdldEFwaVB1YmxpY0tleSgpLCByZWdpc3RyYXRpb25SZXF1ZXN0LmdldERpc3RyRW52TmFtZSgpLCBTdHJpbmcudmFsdWVPZihyZWdpc3RlclJlc3BvbnNlLmdldEh0dHBDb2RlKCkpLAorCQkJCXJlZ2lzdGVyUmVzcG9uc2UuZ2V0T3BlcmF0aW9uU3RhdHVzKCkubmFtZSgpLCBEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmdldE5vdGlmaWNhdGlvblRvcGljTmFtZShyZWdpc3RyYXRpb25SZXF1ZXN0LmdldERpc3RyRW52TmFtZSgpKSwgRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYy5nZXRTdGF0dXNUb3BpY05hbWUocmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9EaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxZGUyMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYy5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuQ2FtYnJpYUVycm9yUmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLkNhbWJyaWFIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5EaXN0cmlidXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLkRpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5TdWJzY3JpYmVyVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc3BvbnNlRm9ybWF0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLmFwaS5jbGllbnQuQ2FtYnJpYU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudC5SZWdpc3RyYXRpb25SZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LlNlcnZlckxpc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudC5Ub3BpY1JlZ2lzdHJhdGlvblJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LlRvcGljVW5yZWdpc3RyYXRpb25SZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJkaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljIikKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJU1RFUl9JTl9ESVNUUklCVVRJT05fRU5HSU5FID0gInJlZ2lzdGVySW5EaXN0cmlidXRpb25FbmdpbmUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOX1JFR0lTVEVSX0lOX0RJU1RSSUJVVElPTl9FTkdJTkUgPSAidW5yZWdpc3RlckluRGlzdHJpYnV0aW9uRW5naW5lIjsKKwlwcml2YXRlIEdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIERpc3RyaWJ1dGlvbkVuZ2luZSBkaXN0cmlidXRpb25FbmdpbmU7CisKKwlwcml2YXRlIFJlc3BvbnNlRm9ybWF0TWFuYWdlciByZXNwb25zZUZvcm1hdE1hbmFnZXIgPSBSZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwlwcml2YXRlIENhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyOworCisJcHVibGljIEVpdGhlcjxTZXJ2ZXJMaXN0UmVzcG9uc2UsIFJlc3BvbnNlRm9ybWF0PiBnZXRVZWJTZXJ2ZXJMaXN0KCkgeworCisJCURpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpOworCisJCUxpc3Q8U3RyaW5nPiBzZXJ2ZXJMaXN0ID0gZGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5nZXRVZWJTZXJ2ZXJzKCk7CisKKwkJaWYgKHNlcnZlckxpc3QgIT0gbnVsbCAmJiAhc2VydmVyTGlzdC5pc0VtcHR5KCkpIHsKKworCQkJU2VydmVyTGlzdFJlc3BvbnNlIHNlcnZlckxpc3RSZXNwb25zZSA9IG5ldyBTZXJ2ZXJMaXN0UmVzcG9uc2UoKTsKKworCQkJc2VydmVyTGlzdFJlc3BvbnNlLnNldFVlYlNlcnZlckxpc3Qoc2VydmVyTGlzdCk7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2ZXJMaXN0UmVzcG9uc2UpOworCQl9IGVsc2UgeworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZVdyYXBwZXIgPSBnZXRSZXNwb25zZUZvcm1hdE1hbmFnZXIoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2VXcmFwcGVyKTsKKwkJfQorCisJfQorCisJcHVibGljIHZvaWQgaGFuZGxlUmVnaXN0cmF0aW9uKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgUmVnaXN0cmF0aW9uUmVxdWVzdCByZWdpc3RyYXRpb25SZXF1ZXN0LCBBdWRpdEhhbmRsZXIgYXVkaXRIYW5kbGVyKSB7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHJlZ2lzdGVyUmVzcG9uc2UgPSBudWxsOworCQl0cnkgeworCQkJcmVnaXN0ZXJSZXNwb25zZSA9IHJlZ2lzdGVyRGlzdHJpYnV0aW9uQ2xpZW50VG9Ub3BpYyhyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3QsIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUik7CisJCQlhdWRpdEhhbmRsZXIuYXVkaXRSZWdpc3RlckFDTChyZWdpc3RlclJlc3BvbnNlLCBTdWJzY3JpYmVyVHlwZUVudW0uUFJPRFVDRVIpOworCisJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCXJlZ2lzdGVyUmVzcG9uc2UgPSByZWdpc3RlckRpc3RyaWJ1dGlvbkNsaWVudFRvVG9waWMocmVzcG9uc2VXcmFwcGVyLCByZWdpc3RyYXRpb25SZXF1ZXN0LCBTdWJzY3JpYmVyVHlwZUVudW0uQ09OU1VNRVIpOworCQkJCWF1ZGl0SGFuZGxlci5hdWRpdFJlZ2lzdGVyQUNMKHJlZ2lzdGVyUmVzcG9uc2UsIFN1YnNjcmliZXJUeXBlRW51bS5DT05TVU1FUik7CisJCQkJLy8gU2Vjb25kIFJlZ2lzdGVyIGZhaWxlZCAtIHVucmVnaXN0ZXIgdGhlIGZpcnN0CisJCQkJaWYgKCFyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHVuUmVnaXN0ZXJSZXNwb25zZSA9IHVuUmVnaXN0ZXJEaXN0cmlidXRpb25DbGllbnRGcm9tVG9waWMocmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLlBST0RVQ0VSKTsKKwkJCQkJYXVkaXRIYW5kbGVyLmF1ZGl0VW5SZWdpc3RlckFDTCh1blJlZ2lzdGVyUmVzcG9uc2UsIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUik7CisJCQkJfQorCQkJfQorCisJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCVRvcGljUmVnaXN0cmF0aW9uUmVzcG9uc2Ugb2tUb3BpY1Jlc3BvbnNlID0gYnVpbGRUb3BpY1Jlc3BvbnNlKHJlZ2lzdHJhdGlvblJlcXVlc3QpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoUmVzcG9uc2Uuc3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spLmVudGl0eShva1RvcGljUmVzcG9uc2UpLmJ1aWxkKCkpOworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvciwgUkVHSVNURVJfSU5fRElTVFJJQlVUSU9OX0VOR0lORSwgInJlZ2lzdHJhdGlvbiBvZiBzdWJzY3JpYmVyIHRvIHRvcGljIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvcihSRUdJU1RFUl9JTl9ESVNUUklCVVRJT05fRU5HSU5FLCAicmVnaXN0cmF0aW9uIG9mIHN1YnNjcmliZXIgdG8gdG9waWMiKTsKKwkJCVJlc3BvbnNlIGVycm9yUmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0UmVzcG9uc2VGb3JtYXRNYW5hZ2VyKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0gZmluYWxseSB7CisJCQlhdWRpdEhhbmRsZXIuYXVkaXRSZWdpc3RlclJlcXVlc3QocmVnaXN0ZXJSZXNwb25zZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBoYW5kbGVVblJlZ2lzdHJhdGlvbihXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFJlZ2lzdHJhdGlvblJlcXVlc3QgdW5SZWdpc3RyYXRpb25SZXF1ZXN0LCBBdWRpdEhhbmRsZXIgYXVkaXRIYW5kbGVyKSB7CisJCVdyYXBwZXI8Q2FtYnJpYUVycm9yUmVzcG9uc2U+IGNhbWJyaWFSZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCXRyeSB7CisJCQlDYW1icmlhRXJyb3JSZXNwb25zZSB1bnJlZ2lzdGVyQ2xpZW50UHJvZHVjZXJUb3BpY1Jlc3BvbnNlID0gdW5SZWdpc3RlckRpc3RyaWJ1dGlvbkNsaWVudEZyb21Ub3BpYyh1blJlZ2lzdHJhdGlvblJlcXVlc3QsIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUik7CisJCQlhdWRpdEhhbmRsZXIuYXVkaXRVblJlZ2lzdGVyQUNMKHVucmVnaXN0ZXJDbGllbnRQcm9kdWNlclRvcGljUmVzcG9uc2UsIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUik7CisJCQl1cGRhdGVSZXNwb25zZVdyYXBwZXIoY2FtYnJpYVJlc3BvbnNlV3JhcHBlciwgdW5yZWdpc3RlckNsaWVudFByb2R1Y2VyVG9waWNSZXNwb25zZSk7CisKKwkJCUNhbWJyaWFFcnJvclJlc3BvbnNlIHVucmVnaXN0ZXJDbGllbnRDb25zdW1lclRvcGljUmVzcG9uc2UgPSB1blJlZ2lzdGVyRGlzdHJpYnV0aW9uQ2xpZW50RnJvbVRvcGljKHVuUmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLkNPTlNVTUVSKTsKKwkJCWF1ZGl0SGFuZGxlci5hdWRpdFVuUmVnaXN0ZXJBQ0wodW5yZWdpc3RlckNsaWVudENvbnN1bWVyVG9waWNSZXNwb25zZSwgU3Vic2NyaWJlclR5cGVFbnVtLkNPTlNVTUVSKTsKKwkJCXVwZGF0ZVJlc3BvbnNlV3JhcHBlcihjYW1icmlhUmVzcG9uc2VXcmFwcGVyLCB1bnJlZ2lzdGVyQ2xpZW50Q29uc3VtZXJUb3BpY1Jlc3BvbnNlKTsKKworCQkJLy8gU3VjY2VzcyB1bnJlZ2lzdGVyIGJvdGggdG9waWNzCisJCQlUb3BpY1VucmVnaXN0cmF0aW9uUmVzcG9uc2UgdW5yZWdpc3RlclJlc3BvbnNlID0gbmV3IFRvcGljVW5yZWdpc3RyYXRpb25SZXNwb25zZShnZXROb3RpZmljYXRpb25Ub3BpY05hbWUodW5SZWdpc3RyYXRpb25SZXF1ZXN0LmdldERpc3RyRW52TmFtZSgpKSwgZ2V0U3RhdHVzVG9waWNOYW1lKHVuUmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSksCisJCQkJCXVucmVnaXN0ZXJDbGllbnRDb25zdW1lclRvcGljUmVzcG9uc2UuZ2V0T3BlcmF0aW9uU3RhdHVzKCksIHVucmVnaXN0ZXJDbGllbnRQcm9kdWNlclRvcGljUmVzcG9uc2UuZ2V0T3BlcmF0aW9uU3RhdHVzKCkpOworCisJCQlpZiAoY2FtYnJpYVJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKS5nZXRPcGVyYXRpb25TdGF0dXMoKSA9PSBDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChSZXNwb25zZS5zdGF0dXMoSHR0cFN0YXR1cy5TQ19PSykuZW50aXR5KHVucmVnaXN0ZXJSZXNwb25zZSkuYnVpbGQoKSk7CisJCQl9IGVsc2UgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURpc3RyaWJ1dGlvbkVuZ2luZVN5c3RlbUVycm9yLCBVTl9SRUdJU1RFUl9JTl9ESVNUUklCVVRJT05fRU5HSU5FLCAidW5yZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IoVU5fUkVHSVNURVJfSU5fRElTVFJJQlVUSU9OX0VOR0lORSwgInVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoUmVzcG9uc2Uuc3RhdHVzKEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKS5lbnRpdHkodW5yZWdpc3RlclJlc3BvbnNlKS5idWlsZCgpKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURpc3RyaWJ1dGlvbkVuZ2luZVN5c3RlbUVycm9yLCBVTl9SRUdJU1RFUl9JTl9ESVNUUklCVVRJT05fRU5HSU5FLCAidW5yZWdpc3RyYXRpb24gb2Ygc3Vic2NyaWJlciB0byB0b3BpYyIpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRSZXNwb25zZUZvcm1hdE1hbmFnZXIoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKworCQl9IGZpbmFsbHkgeworCQkJYXVkaXRIYW5kbGVyLmF1ZGl0VW5SZWdpc3RlclJlcXVlc3QoY2FtYnJpYVJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlUmVzcG9uc2VXcmFwcGVyKFdyYXBwZXI8Q2FtYnJpYUVycm9yUmVzcG9uc2U+IGNhbWJyaWFSZXNwb25zZVdyYXBwZXIsIENhbWJyaWFFcnJvclJlc3BvbnNlIGN1cnJlbnRSZXNwb25zZSkgeworCQlpZiAoY2FtYnJpYVJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWNhbWJyaWFSZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGN1cnJlbnRSZXNwb25zZSk7CisJCX0gZWxzZSBpZiAoY3VycmVudFJlc3BvbnNlLmdldE9wZXJhdGlvblN0YXR1cygpICE9IENhbWJyaWFPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWNhbWJyaWFSZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGN1cnJlbnRSZXNwb25zZSk7CisKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm90aWZpY2F0aW9uVG9waWNOYW1lKFN0cmluZyBlbnZOYW1lKSB7CisJCURpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisJCXJldHVybiBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoKSwgZW52TmFtZSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdGF0dXNUb3BpY05hbWUoU3RyaW5nIGVudk5hbWUpIHsKKwkJRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBjb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24oKTsKKwkJcmV0dXJuIERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrLmJ1aWxkVG9waWNOYW1lKGNvbmZpZy5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUoKSwgZW52TmFtZSk7CisKKwl9CisKKwlwcm90ZWN0ZWQgQ2FtYnJpYUVycm9yUmVzcG9uc2UgdW5SZWdpc3RlckRpc3RyaWJ1dGlvbkNsaWVudEZyb21Ub3BpYyhSZWdpc3RyYXRpb25SZXF1ZXN0IHVuUmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtIHN1YnNjcmliZXJUeXBlKSB7CisJCURpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisJCVN0cmluZyB0b3BpY05hbWU7CisJCWlmIChzdWJzY3JpYmVyVHlwZSA9PSBTdWJzY3JpYmVyVHlwZUVudW0uUFJPRFVDRVIpIHsKKwkJCXRvcGljTmFtZSA9IGdldFN0YXR1c1RvcGljTmFtZSh1blJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQl9IGVsc2UgeworCQkJdG9waWNOYW1lID0gZ2V0Tm90aWZpY2F0aW9uVG9waWNOYW1lKHVuUmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisKKwkJfQorCQlsb2cuZGVidWcoInVucmVnaXN0ZXJpbmcgY2xpZW50IGFzIHt9ICwgZnJvbSB0b3BpYzoge30iLCBzdWJzY3JpYmVyVHlwZS5uYW1lKCksIHRvcGljTmFtZSk7CisJCXJldHVybiBnZXRDYW1icmlhSGFuZGxlcigpLnVuUmVnaXN0ZXJGcm9tVG9waWMoY29uZmlnLmdldFVlYlNlcnZlcnMoKSwgdG9waWNOYW1lLCBjb25maWcuZ2V0VWViUHVibGljS2V5KCksIGNvbmZpZy5nZXRVZWJTZWNyZXRLZXkoKSwgdW5SZWdpc3RyYXRpb25SZXF1ZXN0LmdldEFwaVB1YmxpY0tleSgpLCBzdWJzY3JpYmVyVHlwZSk7CisJfQorCisJcHJpdmF0ZSBUb3BpY1JlZ2lzdHJhdGlvblJlc3BvbnNlIGJ1aWxkVG9waWNSZXNwb25zZShSZWdpc3RyYXRpb25SZXF1ZXN0IHJlZ2lzdHJhdGlvblJlcXVlc3QpIHsKKwkJRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBjb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24oKTsKKwkJU3RyaW5nIHN0YXR1c1RvcGljTmFtZSA9IERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrLmJ1aWxkVG9waWNOYW1lKGNvbmZpZy5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisJCVN0cmluZyBub3RpZmljYXRpb25Ub3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisKKwkJVG9waWNSZWdpc3RyYXRpb25SZXNwb25zZSB0b3BpY1Jlc3BvbnNlID0gbmV3IFRvcGljUmVnaXN0cmF0aW9uUmVzcG9uc2UoKTsKKwkJdG9waWNSZXNwb25zZS5zZXREaXN0ck5vdGlmaWNhdGlvblRvcGljTmFtZShub3RpZmljYXRpb25Ub3BpY05hbWUpOworCQl0b3BpY1Jlc3BvbnNlLnNldERpc3RyU3RhdHVzVG9waWNOYW1lKHN0YXR1c1RvcGljTmFtZSk7CisJCXJldHVybiB0b3BpY1Jlc3BvbnNlOworCX0KKworCXByb3RlY3RlZCBDYW1icmlhRXJyb3JSZXNwb25zZSByZWdpc3RlckRpc3RyaWJ1dGlvbkNsaWVudFRvVG9waWMoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBSZWdpc3RyYXRpb25SZXF1ZXN0IHJlZ2lzdHJhdGlvblJlcXVlc3QsIFN1YnNjcmliZXJUeXBlRW51bSBzdWJzY3JpYmVyVHlwZSkgeworCQlEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGNvbmZpZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpOworCQlTdHJpbmcgdG9waWNOYW1lLCBlcnJvck1zZzsKKworCQkvLyBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBhcyBjb25zdW1lcgorCQlpZiAoc3Vic2NyaWJlclR5cGUgPT0gU3Vic2NyaWJlclR5cGVFbnVtLkNPTlNVTUVSKSB7CisJCQl0b3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisJCQllcnJvck1zZyA9ICJyZWdpc3RyYXRpb24gb2Ygc3Vic2NyaWJlciB0byB0b3BpYzoiICsgdG9waWNOYW1lICsgIiBhcyBjb25zdW1lciBmYWlsZWQiOworCQl9CisJCS8vIFJlZ2lzdGVyIGZvciBzdGF0dXMgYXMgcHJvZHVjZXIKKwkJZWxzZSB7CisJCQl0b3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQkJZXJyb3JNc2cgPSAicmVnaXN0cmF0aW9uIG9mIHN1YnNjcmliZXIgdG8gdG9waWM6IiArIHRvcGljTmFtZSArICIgYXMgcHJvZHVjZXIgZmFpbGVkIjsKKwkJfQorCQlsb2cuZGVidWcoInJlZ2lzdGVyaW5nIGNsaWVudCBhcyB7fSAsIGZyb20gdG9waWM6IHt9Iiwgc3Vic2NyaWJlclR5cGUubmFtZSgpLCB0b3BpY05hbWUpOworCQlDYW1icmlhRXJyb3JSZXNwb25zZSByZWdpc3RlclRvVG9waWMgPSBnZXRDYW1icmlhSGFuZGxlcigpLnJlZ2lzdGVyVG9Ub3BpYyhjb25maWcuZ2V0VWViU2VydmVycygpLCB0b3BpY05hbWUsIGNvbmZpZy5nZXRVZWJQdWJsaWNLZXkoKSwgY29uZmlnLmdldFVlYlNlY3JldEtleSgpLCByZWdpc3RyYXRpb25SZXF1ZXN0LmdldEFwaVB1YmxpY0tleSgpLCBzdWJzY3JpYmVyVHlwZSk7CisKKwkJaWYgKHJlZ2lzdGVyVG9Ub3BpYy5nZXRPcGVyYXRpb25TdGF0dXMoKSAhPSBDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlSZXNwb25zZSBmYWlsZWRSZWdpc3RyYXRpb25SZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRSZXNwb25zZUZvcm1hdE1hbmFnZXIoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IsIFJFR0lTVEVSX0lOX0RJU1RSSUJVVElPTl9FTkdJTkUsIGVycm9yTXNnKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURpc3RyaWJ1dGlvbkVuZ2luZVN5c3RlbUVycm9yKFJFR0lTVEVSX0lOX0RJU1RSSUJVVElPTl9FTkdJTkUsIGVycm9yTXNnKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZmFpbGVkUmVnaXN0cmF0aW9uUmVzcG9uc2UpOworCQl9CisJCXJldHVybiByZWdpc3RlclRvVG9waWM7CisJfQorCisJcHJvdGVjdGVkIFJlc3BvbnNlIGJ1aWxkRXJyb3JSZXNwb25zZShSZXNwb25zZUZvcm1hdCByZXF1ZXN0RXJyb3JXcmFwcGVyKSB7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2Uuc3RhdHVzKHJlcXVlc3RFcnJvcldyYXBwZXIuZ2V0U3RhdHVzKCkpLmVudGl0eShnc29uLnRvSnNvbihyZXF1ZXN0RXJyb3JXcmFwcGVyLmdldFJlcXVlc3RFcnJvcigpKSkuYnVpbGQoKTsKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdE1hbmFnZXIgZ2V0UmVzcG9uc2VGb3JtYXRNYW5hZ2VyKCkgeworCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXRNYW5hZ2VyOworCX0KKworCXB1YmxpYyBEaXN0cmlidXRpb25FbmdpbmUgZ2V0RGlzdHJpYnV0aW9uRW5naW5lKCkgeworCQlyZXR1cm4gZGlzdHJpYnV0aW9uRW5naW5lOworCX0KKworCXB1YmxpYyBDYW1icmlhSGFuZGxlciBnZXRDYW1icmlhSGFuZGxlcigpIHsKKwkJaWYgKGNhbWJyaWFIYW5kbGVyID09IG51bGwpIHsKKwkJCWNhbWJyaWFIYW5kbGVyID0gbmV3IENhbWJyaWFIYW5kbGVyKCk7CisJCX0KKwkJcmV0dXJuIGNhbWJyaWFIYW5kbGVyOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9hcGkvY2xpZW50L0NhbWJyaWFPcGVyYXRpb25TdGF0dXMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9DYW1icmlhT3BlcmF0aW9uU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhNjYwMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9DYW1icmlhT3BlcmF0aW9uU3RhdHVzLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50OworCitwdWJsaWMgZW51bSBDYW1icmlhT3BlcmF0aW9uU3RhdHVzIHsKKwlPSywgQ09OTk5FQ1RJT05fRVJST1IsIE5PVF9GT1VORCwgVE9QSUNfQUxSRUFEWV9FWElTVCwgT0JKRUNUX05PVF9GT1VORCwgSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBBVVRIRU5USUNBVElPTl9FUlJPUiwgVU5LTk9XTl9IT1NUX0VSUk9SLAorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9hcGkvY2xpZW50L1JlZ2lzdHJhdGlvblJlcXVlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9SZWdpc3RyYXRpb25SZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxNGVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9SZWdpc3RyYXRpb25SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50OworCitwdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUmVxdWVzdCB7CisJU3RyaW5nIGFwaVB1YmxpY0tleTsKKwlTdHJpbmcgZGlzdHJFbnZOYW1lOworCisJcHVibGljIFJlZ2lzdHJhdGlvblJlcXVlc3QoU3RyaW5nIGFwaVB1YmxpY0tleSwgU3RyaW5nIGRpc3RyRW52TmFtZSkgeworCQl0aGlzLmFwaVB1YmxpY0tleSA9IGFwaVB1YmxpY0tleTsKKwkJdGhpcy5kaXN0ckVudk5hbWUgPSBkaXN0ckVudk5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcGlQdWJsaWNLZXkoKSB7CisJCXJldHVybiBhcGlQdWJsaWNLZXk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXN0ckVudk5hbWUoKSB7CisJCXJldHVybiBkaXN0ckVudk5hbWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGlzdHJpYnV0aW9uL2FwaS9jbGllbnQvU2VydmVyTGlzdFJlc3BvbnNlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGlzdHJpYnV0aW9uL2FwaS9jbGllbnQvU2VydmVyTGlzdFJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3YTY5MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9TZXJ2ZXJMaXN0UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLmFwaS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFNlcnZlckxpc3RSZXNwb25zZSB7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiB1ZWJTZXJ2ZXJMaXN0OworCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRVZWJTZXJ2ZXJMaXN0KCkgeworCQlyZXR1cm4gdWViU2VydmVyTGlzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVZWJTZXJ2ZXJMaXN0KExpc3Q8U3RyaW5nPiB1ZWJTZXJ2ZXJMaXN0KSB7CisJCXRoaXMudWViU2VydmVyTGlzdCA9IHVlYlNlcnZlckxpc3Q7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9hcGkvY2xpZW50L1RvcGljUmVnaXN0cmF0aW9uUmVzcG9uc2UuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9Ub3BpY1JlZ2lzdHJhdGlvblJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhMzRhMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9Ub3BpY1JlZ2lzdHJhdGlvblJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50OworCitwdWJsaWMgY2xhc3MgVG9waWNSZWdpc3RyYXRpb25SZXNwb25zZSB7CisJU3RyaW5nIGRpc3RyTm90aWZpY2F0aW9uVG9waWNOYW1lOworCVN0cmluZyBkaXN0clN0YXR1c1RvcGljTmFtZTsKKworCXB1YmxpYyB2b2lkIHNldERpc3RyTm90aWZpY2F0aW9uVG9waWNOYW1lKFN0cmluZyBkaXN0ck5vdGlmaWNhdGlvblRvcGljTmFtZSkgeworCQl0aGlzLmRpc3RyTm90aWZpY2F0aW9uVG9waWNOYW1lID0gZGlzdHJOb3RpZmljYXRpb25Ub3BpY05hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzdHJTdGF0dXNUb3BpY05hbWUoU3RyaW5nIGRpc3RyU3RhdHVzVG9waWNOYW1lKSB7CisJCXRoaXMuZGlzdHJTdGF0dXNUb3BpY05hbWUgPSBkaXN0clN0YXR1c1RvcGljTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc3RyTm90aWZpY2F0aW9uVG9waWNOYW1lKCkgeworCQlyZXR1cm4gZGlzdHJOb3RpZmljYXRpb25Ub3BpY05hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXN0clN0YXR1c1RvcGljTmFtZSgpIHsKKwkJcmV0dXJuIGRpc3RyU3RhdHVzVG9waWNOYW1lOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9Ub3BpY1VucmVnaXN0cmF0aW9uUmVzcG9uc2UuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vYXBpL2NsaWVudC9Ub3BpY1VucmVnaXN0cmF0aW9uUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI5ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9hcGkvY2xpZW50L1RvcGljVW5yZWdpc3RyYXRpb25SZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudDsKKworcHVibGljIGNsYXNzIFRvcGljVW5yZWdpc3RyYXRpb25SZXNwb25zZSB7CisJU3RyaW5nIGRpc3RyTm90aWZpY2F0aW9uVG9waWNOYW1lOworCVN0cmluZyBkaXN0clN0YXR1c1RvcGljTmFtZTsKKwlDYW1icmlhT3BlcmF0aW9uU3RhdHVzIG5vdGlmaWNhdGlvblVucmVnaXN0ZXJSZXN1bHQ7CisJQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBzdGF0dXNVbnJlZ2lzdGVyUmVzdWx0OworCisJcHVibGljIFRvcGljVW5yZWdpc3RyYXRpb25SZXNwb25zZShTdHJpbmcgZGlzdHJOb3RpZmljYXRpb25Ub3BpY05hbWUsIFN0cmluZyBkaXN0clN0YXR1c1RvcGljTmFtZSwgQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBub3RpZmljYXRpb25VbnJlZ2lzdGVyUmVzdWx0LCBDYW1icmlhT3BlcmF0aW9uU3RhdHVzIHN0YXR1c1VucmVnaXN0ZXJSZXN1bHQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5kaXN0ck5vdGlmaWNhdGlvblRvcGljTmFtZSA9IGRpc3RyTm90aWZpY2F0aW9uVG9waWNOYW1lOworCQl0aGlzLmRpc3RyU3RhdHVzVG9waWNOYW1lID0gZGlzdHJTdGF0dXNUb3BpY05hbWU7CisJCXRoaXMubm90aWZpY2F0aW9uVW5yZWdpc3RlclJlc3VsdCA9IG5vdGlmaWNhdGlvblVucmVnaXN0ZXJSZXN1bHQ7CisJCXRoaXMuc3RhdHVzVW5yZWdpc3RlclJlc3VsdCA9IHN0YXR1c1VucmVnaXN0ZXJSZXN1bHQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXN0ck5vdGlmaWNhdGlvblRvcGljTmFtZSgpIHsKKwkJcmV0dXJuIGRpc3RyTm90aWZpY2F0aW9uVG9waWNOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGlzdHJTdGF0dXNUb3BpY05hbWUoKSB7CisJCXJldHVybiBkaXN0clN0YXR1c1RvcGljTmFtZTsKKwl9CisKKwlwdWJsaWMgQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBnZXROb3RpZmljYXRpb25VbnJlZ2lzdGVyUmVzdWx0KCkgeworCQlyZXR1cm4gbm90aWZpY2F0aW9uVW5yZWdpc3RlclJlc3VsdDsKKwl9CisKKwlwdWJsaWMgQ2FtYnJpYU9wZXJhdGlvblN0YXR1cyBnZXRTdGF0dXNVbnJlZ2lzdGVyUmVzdWx0KCkgeworCQlyZXR1cm4gc3RhdHVzVW5yZWdpc3RlclJlc3VsdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGlzdHJpYnV0aW9uL3NlcnZsZXQvRGlzdHJpYnV0aW9uQ2F0YWxvZ1NlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vc2VydmxldC9EaXN0cmlidXRpb25DYXRhbG9nU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDEwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGlzdHJpYnV0aW9uL3NlcnZsZXQvRGlzdHJpYnV0aW9uQ2F0YWxvZ1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuQmVHZW5lcmljU2VydmxldDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi92MS9jYXRhbG9nIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25DYXRhbG9nU2VydmxldCBleHRlbmRzIEJlR2VuZXJpY1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERpc3RyaWJ1dGlvbkNhdGFsb2dTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gRG93bmxvYWQgKEdFVCkgYXJ0aWZhY3RzCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCUBHRVQKKwlAUGF0aCgiL3NlcnZpY2VzL3tzZXJ2aWNlTmFtZX0ve3NlcnZpY2VWZXJzaW9ufS9hcnRpZmFjdHMve2FydGlmYWN0TmFtZX0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRvd25sb2FkIHNlcnZpY2UgYXJ0aWZhY3QiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgZG93bmxvYWRlZCBhcnRpZmFjdCIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXJ0aWZhY3QgZG93bmxvYWRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMSwgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uIHJlcXVpcmVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJBcnRpZmFjdCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdChAUGF0aFBhcmFtKCJzZXJ2aWNlTmFtZSIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSwgQFBhdGhQYXJhbSgic2VydmljZVZlcnNpb24iKSBmaW5hbCBTdHJpbmcgc2VydmljZVZlcnNpb24sIEBQYXRoUGFyYW0oImFydGlmYWN0TmFtZSIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdE5hbWUsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCVN0cmluZyBpbnN0YW5jZUlkSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKTsKKwkJU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uRW51bSA9IEF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fQVJUSUZBQ1RfRE9XTkxPQUQ7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW0gPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQlhZGRpdGlvbmFsUGFyYW0ucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELCBpbnN0YW5jZUlkSGVhZGVyKTsKKwkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9SRVNPVVJDRV9VUkwsIHJlcXVlc3RVUkkpOworCisJCWlmIChpbnN0YW5jZUlkSGVhZGVyID09IG51bGwgfHwgaW5zdGFuY2VJZEhlYWRlci5pc0VtcHR5KCkpIHsKKwkJCWxvZy5kZWJ1ZygiTWlzc2luZyBYLUVDT01QLUluc3RhbmNlSUQgaGVhZGVyIik7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX1hfRUNPTVBfSU5TVEFOQ0VfSUQpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXREaXN0cmlidXRpb25Eb3dubG9hZChyZXNwb25zZUZvcm1hdCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQl0cnkgeworCQkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCQlBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c0xvZ2ljID0gZ2V0QXJ0aWZhY3RCTChjb250ZXh0KTsKKwkJCUVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBkb3dubG9hZFJzcmNBcnRpZmFjdEVpdGhlciA9IGFydGlmYWN0c0xvZ2ljLmRvd25sb2FkU2VydmljZUFydGlmYWN0QnlOYW1lcyhzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIGFydGlmYWN0TmFtZSk7CisJCQlpZiAoZG93bmxvYWRSc3JjQXJ0aWZhY3RFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBkb3dubG9hZFJzcmNBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXREaXN0cmlidXRpb25Eb3dubG9hZChyZXNwb25zZUZvcm1hdCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJYnl0ZVtdIHZhbHVlID0gZG93bmxvYWRSc3JjQXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsdWUpOworCisJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQkJCWhlYWRlcnMucHV0KENvbnN0YW50cy5DT05URU5UX0RJU1BPU0lUSU9OX0hFQURFUiwgZ2V0Q29udGVudERpc3Bvc2l0aW9uVmFsdWUoYXJ0aWZhY3ROYW1lKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RGlzdHJpYnV0aW9uRG93bmxvYWQocmVzcG9uc2VGb3JtYXQsIGF1ZGl0aW5nQWN0aW9uRW51bSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgaXMsIGhlYWRlcnMpOworCQkJfQorCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiZG93bmxvYWQgTXVyYW5vIHBhY2thZ2UgYXJ0aWZhY3QgZm9yIHNlcnZpY2UgLSBleHRlcm5hbCBBUEkiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoImRvd25sb2FkIE11cmFubyBwYWNrYWdlIGFydGlmYWN0IGZvciBzZXJ2aWNlIC0gZXh0ZXJuYWwgQVBJIik7CisJCQlsb2cuZGVidWcoImRvd25sb2FkIGFydGlmYWN0IGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VOYW1lfS97c2VydmljZVZlcnNpb259L3Jlc291cmNlcy97cmVzb3VyY2VOYW1lfS97cmVzb3VyY2VWZXJzaW9ufS9hcnRpZmFjdHMve2FydGlmYWN0TmFtZX0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRvd25sb2FkIHJlc291cmNlIGFydGlmYWN0IiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGRvd25sb2FkZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IGRvd25sb2FkZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDEsIG1lc3NhZ2UgPSAiQXV0aG9yaXphdGlvbiByZXF1aXJlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQXJ0aWZhY3Qgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0KEBQYXRoUGFyYW0oInNlcnZpY2VOYW1lIikgZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lLCBAUGF0aFBhcmFtKCJzZXJ2aWNlVmVyc2lvbiIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgQFBhdGhQYXJhbSgicmVzb3VyY2VOYW1lIikgZmluYWwgU3RyaW5nIHJlc291cmNlTmFtZSwKKwkJCUBQYXRoUGFyYW0oInJlc291cmNlVmVyc2lvbiIpIGZpbmFsIFN0cmluZyByZXNvdXJjZVZlcnNpb24sIEBQYXRoUGFyYW0oImFydGlmYWN0TmFtZSIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdE5hbWUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJU3RyaW5nIGluc3RhbmNlSWRIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpOworCQlTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb25FbnVtID0gQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9BUlRJRkFDVF9ET1dOTE9BRDsKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbSA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsIGluc3RhbmNlSWRIZWFkZXIpOworCQlhZGRpdGlvbmFsUGFyYW0ucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwgcmVxdWVzdFVSSSk7CisKKwkJaWYgKGluc3RhbmNlSWRIZWFkZXIgPT0gbnVsbCB8fCBpbnN0YW5jZUlkSGVhZGVyLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJNaXNzaW5nIFgtRUNPTVAtSW5zdGFuY2VJRCBoZWFkZXIiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdERpc3RyaWJ1dGlvbkRvd25sb2FkKHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXRyeSB7CisJCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTG9naWMgPSBnZXRBcnRpZmFjdEJMKGNvbnRleHQpOworCQkJRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IGRvd25sb2FkUnNyY0FydGlmYWN0RWl0aGVyID0gYXJ0aWZhY3RzTG9naWMuZG93bmxvYWRSc3JjQXJ0aWZhY3RCeU5hbWVzKHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgcmVzb3VyY2VOYW1lLCByZXNvdXJjZVZlcnNpb24sIGFydGlmYWN0TmFtZSk7CisJCQlpZiAoZG93bmxvYWRSc3JjQXJ0aWZhY3RFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBkb3dubG9hZFJzcmNBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXREaXN0cmlidXRpb25Eb3dubG9hZChyZXNwb25zZUZvcm1hdCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJYnl0ZVtdIHZhbHVlID0gZG93bmxvYWRSc3JjQXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJLy8gUmV0dXJuaW5nIDY0LWVuY29kZWQgYXMgaXQgd2FzIHJlY2VpdmVkIGR1cmluZyB1cGxvYWQKKwkJCQlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2YWx1ZSk7CisJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQkJCWhlYWRlcnMucHV0KENvbnN0YW50cy5DT05URU5UX0RJU1BPU0lUSU9OX0hFQURFUiwgZ2V0Q29udGVudERpc3Bvc2l0aW9uVmFsdWUoYXJ0aWZhY3ROYW1lKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RGlzdHJpYnV0aW9uRG93bmxvYWQocmVzcG9uc2VGb3JtYXQsIGF1ZGl0aW5nQWN0aW9uRW51bSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgaXMsIGhlYWRlcnMpOworCQkJfQorCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiZG93bmxvYWQgaW50ZXJmYWNlIGFydGlmYWN0IGZvciByZXNvdXJjZSAtIGV4dGVybmFsIEFQSSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiZG93bmxvYWQgaW50ZXJmYWNlIGFydGlmYWN0IGZvciByZXNvdXJjZSAtIGV4dGVybmFsIEFQSSIpOworCQkJbG9nLmRlYnVnKCJkb3dubG9hZCBhcnRpZmFjdCBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlAR0VUCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZU5hbWV9L3tzZXJ2aWNlVmVyc2lvbn0vcmVzb3VyY2VJbnN0YW5jZXMve3Jlc291cmNlSW5zdGFuY2VOYW1lfS9hcnRpZmFjdHMve2FydGlmYWN0TmFtZX0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRvd25sb2FkIHJlc291cmNlIGFydGlmYWN0IiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGRvd25sb2FkZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IGRvd25sb2FkZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDEsIG1lc3NhZ2UgPSAiQXV0aG9yaXphdGlvbiByZXF1aXJlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQXJ0aWZhY3Qgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3QoQFBhdGhQYXJhbSgic2VydmljZU5hbWUiKSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIEBQYXRoUGFyYW0oInNlcnZpY2VWZXJzaW9uIikgZmluYWwgU3RyaW5nIHNlcnZpY2VWZXJzaW9uLCBAUGF0aFBhcmFtKCJyZXNvdXJjZUluc3RhbmNlTmFtZSIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwKKwkJCUBQYXRoUGFyYW0oImFydGlmYWN0TmFtZSIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdE5hbWUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJU3RyaW5nIGluc3RhbmNlSWRIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpOworCQlTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb25FbnVtID0gQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9BUlRJRkFDVF9ET1dOTE9BRDsKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbSA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsIGluc3RhbmNlSWRIZWFkZXIpOworCQlhZGRpdGlvbmFsUGFyYW0ucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwgcmVxdWVzdFVSSSk7CisKKwkJaWYgKGluc3RhbmNlSWRIZWFkZXIgPT0gbnVsbCB8fCBpbnN0YW5jZUlkSGVhZGVyLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJNaXNzaW5nIFgtRUNPTVAtSW5zdGFuY2VJRCBoZWFkZXIiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdERpc3RyaWJ1dGlvbkRvd25sb2FkKHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXRyeSB7CisJCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTG9naWMgPSBnZXRBcnRpZmFjdEJMKGNvbnRleHQpOworCQkJRWl0aGVyPGJ5dGVbXSwgUmVzcG9uc2VGb3JtYXQ+IGRvd25sb2FkUnNyY0FydGlmYWN0RWl0aGVyID0gYXJ0aWZhY3RzTG9naWMuZG93bmxvYWRSc3JjSW5zdEFydGlmYWN0QnlOYW1lcyhzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHJlc291cmNlSW5zdGFuY2VOYW1lLCBhcnRpZmFjdE5hbWUpOworCQkJaWYgKGRvd25sb2FkUnNyY0FydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZG93bmxvYWRSc3JjQXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RGlzdHJpYnV0aW9uRG93bmxvYWQocmVzcG9uc2VGb3JtYXQsIGF1ZGl0aW5nQWN0aW9uRW51bSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQl9IGVsc2UgeworCQkJCWJ5dGVbXSB2YWx1ZSA9IGRvd25sb2FkUnNyY0FydGlmYWN0RWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJCS8vIFJldHVybmluZyA2NC1lbmNvZGVkIGFzIGl0IHdhcyByZWNlaXZlZCBkdXJpbmcgdXBsb2FkCisJCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsdWUpOworCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQloZWFkZXJzLnB1dChDb25zdGFudHMuQ09OVEVOVF9ESVNQT1NJVElPTl9IRUFERVIsIGdldENvbnRlbnREaXNwb3NpdGlvblZhbHVlKGFydGlmYWN0TmFtZSkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdERpc3RyaWJ1dGlvbkRvd25sb2FkKHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGlzLCBoZWFkZXJzKTsKKwkJCX0KKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImRvd25sb2FkIGludGVyZmFjZSBhcnRpZmFjdCBmb3IgcmVzb3VyY2UgLSBleHRlcm5hbCBBUEkiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoImRvd25sb2FkIGludGVyZmFjZSBhcnRpZmFjdCBmb3IgcmVzb3VyY2UgLSBleHRlcm5hbCBBUEkiKTsKKwkJCWxvZy5kZWJ1ZygiZG93bmxvYWQgYXJ0aWZhY3QgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9zZXJ2bGV0L0Rpc3RyaWJ1dGlvblNlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vc2VydmxldC9EaXN0cmlidXRpb25TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NTZiYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vc2VydmxldC9EaXN0cmlidXRpb25TZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uc2VydmxldDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5BdWRpdEhhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLkRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLmFwaS5jbGllbnQuUmVnaXN0cmF0aW9uUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudC5TZXJ2ZXJMaXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0cy5CZUdlbmVyaWNTZXJ2bGV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuSHR0cFV0aWw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEiKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvblNlcnZsZXQgZXh0ZW5kcyBCZUdlbmVyaWNTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEaXN0cmlidXRpb25TZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisJQFJlc291cmNlCisJcHJpdmF0ZSBEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljIGRpc3RyaWJ1dGlvbkxvZ2ljOworCisJQEdFVAorCUBQYXRoKCIvZGlzdHJpYnV0aW9uVWViQ2x1c3RlciIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0VWViU2VydmVyTGlzdChAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKSBTdHJpbmcgaW5zdGFuY2VJZCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlhfRUNPTVBfUkVRVUVTVF9JRF9IRUFERVIpIFN0cmluZyByZXF1ZXN0SWQsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuQVVUSE9SSVpBVElPTl9IRUFERVIpIFN0cmluZyBhdXRob3JpemF0aW9uLCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuQUNDRVBUX0hFQURFUikgU3RyaW5nIGFjY2VwdCkgeworCQlpbml0KHJlcXVlc3QpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IG51bGw7CisJCWlmIChpbnN0YW5jZUlkID09IG51bGwpIHsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRCk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdE1pc3NpbmdJbnN0YW5jZUlkKEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfVUVCX0NMVVNURVIsIHJlc3BvbnNlRm9ybWF0LmdldFN0YXR1cygpLnRvU3RyaW5nKCksIHJlc3BvbnNlRm9ybWF0LmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKwkJdHJ5IHsKKwkJCUVpdGhlcjxTZXJ2ZXJMaXN0UmVzcG9uc2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGRpc3RyaWJ1dGlvbkxvZ2ljLmdldFVlYlNlcnZlckxpc3QoKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0R2V0VWViQ2x1c3RlcihBdWRpdGluZ0FjdGlvbkVudW0uR0VUX1VFQl9DTFVTVEVSLCBpbnN0YW5jZUlkLCBudWxsLCByZXNwb25zZUZvcm1hdC5nZXRTdGF0dXMoKS50b1N0cmluZygpLCByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCkpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiZmFpbGVkIHRvIGdldCB1ZWIgc2VyYnZlciBsaXN0IGZyb20gY29maWd1cmF0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJmYWlsZWQgdG8gZ2V0IHVlYiBzZXJidmVyIGxpc3QgZnJvbSBjb2ZpZ3VyYXRpb24iKTsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCB1ZWIgc2VyYnZlciBsaXN0IGZyb20gY29maWd1cmF0aW9uIiwgZSk7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0R2V0VWViQ2x1c3RlcihBdWRpdGluZ0FjdGlvbkVudW0uR0VUX1VFQl9DTFVTVEVSLCBpbnN0YW5jZUlkLCBudWxsLCByZXNwb25zZUZvcm1hdC5nZXRTdGF0dXMoKS50b1N0cmluZygpLCByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCkpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGxpc3Qgb2YgdmFsaWQgYXJ0aWZhY3QgdHlwZXMgZm9yIHZhbGlkYXRpb24gZG9uZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGNsaWVudC48YnI+CisJICogVGhlIGxpc3QgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGVudW0gQXJ0aWZhY3RUeXBlRW51bS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdAorCSAqIEBwYXJhbSBpbnN0YW5jZUlkCisJICogQHBhcmFtIHJlcXVlc3RJZAorCSAqIEBwYXJhbSBhdXRob3JpemF0aW9uCisJICogQHBhcmFtIGFjY2VwdAorCSAqIEByZXR1cm4KKwkgKi8KKwlAR0VUCisJQFBhdGgoIi9hcnRpZmFjdFR5cGVzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCXB1YmxpYyBSZXNwb25zZSBnZXRWYWxpZEFydGlmYWN0VHlwZXMoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5YX0VDT01QX0lOU1RBTkNFX0lEX0hFQURFUikgU3RyaW5nIGluc3RhbmNlSWQsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5YX0VDT01QX1JFUVVFU1RfSURfSEVBREVSKSBTdHJpbmcgcmVxdWVzdElkLAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLkFVVEhPUklaQVRJT05fSEVBREVSKSBTdHJpbmcgYXV0aG9yaXphdGlvbiwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLkFDQ0VQVF9IRUFERVIpIFN0cmluZyBhY2NlcHQpIHsKKwkJaW5pdChyZXF1ZXN0KTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisKKwkJdmFsaWRhdGVIZWFkZXJzKHJlc3BvbnNlV3JhcHBlciwgcmVxdWVzdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkdFVF9WQUxJRF9BUlRJRkFDVF9UWVBFUyk7CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBBcnRpZmFjdFR5cGVFbnVtLnZhbHVlcygpKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3BvbnNlID0gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQl9CisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlAUE9TVAorCUBQYXRoKCIvcmVnaXN0ZXJGb3JEaXN0cmlidXRpb24iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJcHVibGljIFJlc3BvbnNlIHJlZ2lzdGVyRm9yRGlzdHJpYnV0aW9uKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcmVxdWVzdEpzb24pIHsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWluaXQocmVxdWVzdCk7CisKKwkJV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlXcmFwcGVyPFJlZ2lzdHJhdGlvblJlcXVlc3Q+IHJlZ2lzdHJhdGlvblJlcXVlc3RXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCisJCXZhbGlkYXRlSGVhZGVycyhyZXNwb25zZVdyYXBwZXIsIHJlcXVlc3QsIEF1ZGl0aW5nQWN0aW9uRW51bS5BRERfS0VZX1RPX1RPUElDX0FDTCk7CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlSnNvbihyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3RXcmFwcGVyLCByZXF1ZXN0SnNvbik7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlRW52KHJlc3BvbnNlV3JhcHBlciwgcmVnaXN0cmF0aW9uUmVxdWVzdFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQl9CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWRpc3RyaWJ1dGlvbkxvZ2ljLmhhbmRsZVJlZ2lzdHJhdGlvbihyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3RXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCBidWlsZEF1ZGl0SGFuZGxlcihyZXF1ZXN0LCByZWdpc3RyYXRpb25SZXF1ZXN0V3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSkpOworCQl9IGVsc2UgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IsIERpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuUkVHSVNURVJfSU5fRElTVFJJQlVUSU9OX0VOR0lORSwgInJlZ2lzdHJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IoRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYy5SRUdJU1RFUl9JTl9ESVNUUklCVVRJT05fRU5HSU5FLCAicmVnaXN0cmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkIik7CisJCX0KKworCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCUBQT1NUCisJQFBhdGgoIi91blJlZ2lzdGVyRm9yRGlzdHJpYnV0aW9uIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCXB1YmxpYyBSZXNwb25zZSB1blJlZ2lzdGVyRm9yRGlzdHJpYnV0aW9uKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcmVxdWVzdEpzb24pIHsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWluaXQocmVxdWVzdCk7CisKKwkJV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlXcmFwcGVyPFJlZ2lzdHJhdGlvblJlcXVlc3Q+IHVuUmVnaXN0cmF0aW9uUmVxdWVzdFdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisKKwkJdmFsaWRhdGVIZWFkZXJzKHJlc3BvbnNlV3JhcHBlciwgcmVxdWVzdCwgQXVkaXRpbmdBY3Rpb25FbnVtLlJFTU9WRV9LRVlfRlJPTV9UT1BJQ19BQ0wpOworCisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl2YWxpZGF0ZUpzb24ocmVzcG9uc2VXcmFwcGVyLCB1blJlZ2lzdHJhdGlvblJlcXVlc3RXcmFwcGVyLCByZXF1ZXN0SnNvbik7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlRW52KHJlc3BvbnNlV3JhcHBlciwgdW5SZWdpc3RyYXRpb25SZXF1ZXN0V3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKS5nZXREaXN0ckVudk5hbWUoKSk7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCWRpc3RyaWJ1dGlvbkxvZ2ljLmhhbmRsZVVuUmVnaXN0cmF0aW9uKHJlc3BvbnNlV3JhcHBlciwgdW5SZWdpc3RyYXRpb25SZXF1ZXN0V3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgYnVpbGRBdWRpdEhhbmRsZXIocmVxdWVzdCwgdW5SZWdpc3RyYXRpb25SZXF1ZXN0V3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSkpOworCQl9IGVsc2UgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IsIERpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuVU5fUkVHSVNURVJfSU5fRElTVFJJQlVUSU9OX0VOR0lORSwgInVucmVnaXN0cmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvcihEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLlVOX1JFR0lTVEVSX0lOX0RJU1RSSUJVVElPTl9FTkdJTkUsICJ1bnJlZ2lzdHJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCIpOworCQl9CisKKwkJcmV0dXJuIHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVFbnYoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBTdHJpbmcgZGlzdHJFbnZOYW1lKSB7CisKKwkJLy8gREUxOTQwMjEKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBlbnZpcm9ubWVudFN0YXR1cyA9IGRpc3RyaWJ1dGlvbkxvZ2ljLmdldERpc3RyaWJ1dGlvbkVuZ2luZSgpLmlzRW52aXJvbm1lbnRBdmFpbGFibGUoKTsKKwkJLy8gREUxOTQwMjEKKwkJLy8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBlbnZpcm9ubWVudFN0YXR1cyA9CisJCS8vIGRpc3RyaWJ1dGlvbkxvZ2ljLmdldERpc3RyaWJ1dGlvbkVuZ2luZSgpLmlzRW52aXJvbm1lbnRBdmFpbGFibGUoZGlzdHJFbnZOYW1lKTsKKwkJaWYgKGVudmlyb25tZW50U3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWlmIChlbnZpcm9ubWVudFN0YXR1cyA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkRJU1RSX0VOVklST05NRU5UX05PVF9GT1VORCkgeworCQkJCVJlc3BvbnNlIG1pc3NpbmdIZWFkZXJSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShkaXN0cmlidXRpb25Mb2dpYy5nZXRSZXNwb25zZUZvcm1hdE1hbmFnZXIoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuRElTVFJJQlVUSU9OX0VOVl9ET0VTX05PVF9FWElTVCkpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQobWlzc2luZ0hlYWRlclJlc3BvbnNlKTsKKwkJCX0gZWxzZSB7CisJCQkJUmVzcG9uc2UgbWlzc2luZ0hlYWRlclJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGRpc3RyaWJ1dGlvbkxvZ2ljLmdldFJlc3BvbnNlRm9ybWF0TWFuYWdlcigpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChtaXNzaW5nSGVhZGVyUmVzcG9uc2UpOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlpZiAoZGlzdHJpYnV0aW9uTG9naWMgPT0gbnVsbCkgeworCQkJZGlzdHJpYnV0aW9uTG9naWMgPSBnZXREaXN0cmlidXRpb25CTChyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUhlYWRlcnMoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uKSB7CisJCWlmIChyZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpID09IG51bGwpIHsKKwkJCVJlc3BvbnNlIG1pc3NpbmdIZWFkZXJSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShkaXN0cmlidXRpb25Mb2dpYy5nZXRSZXNwb25zZUZvcm1hdE1hbmFnZXIoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEKSk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KG1pc3NpbmdIZWFkZXJSZXNwb25zZSk7CisJCQkvLyBBdWRpdAorCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0TWlzc2luZ0luc3RhbmNlSWQoYXVkaXRpbmdBY3Rpb24sIHJlc3BvbnNlRm9ybWF0LmdldFN0YXR1cygpLnRvU3RyaW5nKCksIHJlc3BvbnNlRm9ybWF0LmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CisKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSnNvbihXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFdyYXBwZXI8UmVnaXN0cmF0aW9uUmVxdWVzdD4gcmVnaXN0cmF0aW9uUmVxdWVzdFdyYXBwZXIsIFN0cmluZyByZXF1ZXN0SnNvbikgeworCQlpZiAocmVxdWVzdEpzb24gPT0gbnVsbCB8fCByZXF1ZXN0SnNvbi5pc0VtcHR5KCkpIHsKKwkJCVJlc3BvbnNlIG1pc3NpbmdCb2R5UmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZGlzdHJpYnV0aW9uTG9naWMuZ2V0UmVzcG9uc2VGb3JtYXRNYW5hZ2VyKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQk9EWSkpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChtaXNzaW5nQm9keVJlc3BvbnNlKTsKKwkJfSBlbHNlIHsKKwkJCUVpdGhlcjxSZWdpc3RyYXRpb25SZXF1ZXN0LCBFeGNlcHRpb24+IGVpdGhlclJlZ2lzdHJhdGlvbiA9IEh0dHBVdGlsLmNvbnZlcnRKc29uU3RyaW5nVG9PYmplY3QocmVxdWVzdEpzb24sIFJlZ2lzdHJhdGlvblJlcXVlc3QuY2xhc3MpOworCQkJaWYgKGVpdGhlclJlZ2lzdHJhdGlvbi5pc0xlZnQoKSkgeworCQkJCVJlZ2lzdHJhdGlvblJlcXVlc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IGVpdGhlclJlZ2lzdHJhdGlvbi5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAocmVnaXN0cmF0aW9uUmVxdWVzdC5nZXRBcGlQdWJsaWNLZXkoKSA9PSBudWxsKSB7CisJCQkJCVJlc3BvbnNlIG1pc3NpbmdCb2R5UmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZGlzdHJpYnV0aW9uTG9naWMuZ2V0UmVzcG9uc2VGb3JtYXRNYW5hZ2VyKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfUFVCTElDX0tFWSkpOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KG1pc3NpbmdCb2R5UmVzcG9uc2UpOworCisJCQkJfSBlbHNlIGlmIChyZWdpc3RyYXRpb25SZXF1ZXN0LmdldERpc3RyRW52TmFtZSgpID09IG51bGwpIHsKKwkJCQkJUmVzcG9uc2UgbWlzc2luZ0JvZHlSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShkaXN0cmlidXRpb25Mb2dpYy5nZXRSZXNwb25zZUZvcm1hdE1hbmFnZXIoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19FTlZfTkFNRSkpOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KG1pc3NpbmdCb2R5UmVzcG9uc2UpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlZ2lzdHJhdGlvblJlcXVlc3RXcmFwcGVyLnNldElubmVyRWxlbWVudChyZWdpc3RyYXRpb25SZXF1ZXN0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVJlc3BvbnNlIG1pc3NpbmdCb2R5UmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZGlzdHJpYnV0aW9uTG9naWMuZ2V0UmVzcG9uc2VGb3JtYXRNYW5hZ2VyKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfQk9EWSkpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQobWlzc2luZ0JvZHlSZXNwb25zZSk7CisJCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYyBnZXREaXN0cmlidXRpb25CTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlyZXR1cm4gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJfQorCisJcHJpdmF0ZSBBdWRpdEhhbmRsZXIgYnVpbGRBdWRpdEhhbmRsZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFJlZ2lzdHJhdGlvblJlcXVlc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCkgeworCQlyZXR1cm4gbmV3IEF1ZGl0SGFuZGxlcihnZXRDb21wb25lbnRzVXRpbHMoKSwgcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKSwgcmVnaXN0cmF0aW9uUmVxdWVzdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Vjb21wL0Vjb21wSW50SW1wbC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Vjb21wL0Vjb21wSW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzAyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZWNvbXAvRWNvbXBJbnRJbXBsLmphdmEKQEAgLTAsMCArMSwzNzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5lY29tcDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyLkVycm9yU2V2ZXJpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZWNvbXAuY29udmVydGVycy5FY29tcFJvbGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZWNvbXAuY29udmVydGVycy5FY29tcFVzZXJDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlcjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUub25ib2FyZGluZy5jcm9zc2FwaS5JUG9ydGFsUmVzdEFQSVNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxzZGsuY29yZS5vbmJvYXJkaW5nLmNyb3NzYXBpLlBvcnRhbEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnJlc3RmdWwuZG9tYWluLkVjb21wUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnJlc3RmdWwuZG9tYWluLkVjb21wVXNlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKgorICogUG9ydGFsQVBJRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpOworICovCitwdWJsaWMgY2xhc3MgRWNvbXBJbnRJbXBsIGltcGxlbWVudHMgSVBvcnRhbFJlc3RBUElTZXJ2aWNlIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRWNvbXBJbnRJbXBsLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgRWNvbXBJbnRJbXBsKCkgeworCQlsb2cuZGVidWcoIkVjb21wSW50SW1wbCBDbGFzcyBJbnN0YW50aWF0ZWQiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwdXNoVXNlcihFY29tcFVzZXIgdXNlcikgdGhyb3dzIFBvcnRhbEFQSUV4Y2VwdGlvbiB7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2YgRUNPTVAgcHVzaFVzZXIiKTsKKwkJdHJ5IHsKKwkJCWlmICh1c2VyID09IG51bGwpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIlB1c2hVc2VyIiwgIlJlY2lldmVkIG51bGwgZm9yIGFyZ3VtZW50IHVzZXIiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCWxvZy5kZWJ1ZygiUmVjaWV2ZWQgbnVsbCBmb3IgYXJndW1lbnQgdXNlciIpOworCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIlJlY2lldmVkIG51bGwgZm9yIGFyZ3VtZW50IHVzZXIiKTsKKwkJCX0KKworCQkJVXNlckJ1c2luZXNzTG9naWMgdXNlckJ1c2luZXNzTG9naWMgPSBnZXRVc2VyQnVzaW5lc3NMb2dpYygpOworCisJCQlmaW5hbCBTdHJpbmcgbW9kaWZpZXJBdHRJZCA9ICJqaDAwMDMiOworCQkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCQltb2RpZmllci5zZXRVc2VySWQobW9kaWZpZXJBdHRJZCk7CisJCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgbW9kaWZpZXJBdHRJZCk7CisKKwkJCUVpdGhlcjxVc2VyLCBTdHJpbmc+IG5ld0FTRENVc2VyID0gRWNvbXBVc2VyQ29udmVydGVyLmNvbnZlcnRFY29tcFVzZXJUb1VzZXIodXNlcik7CisJCQlpZiAobmV3QVNEQ1VzZXIuaXNSaWdodCgpKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJQdXNoVXNlciIsICJGYWlsZWQgdG8gY29udmVydCB1c2VyIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgdXNlciB7fSIsdXNlci50b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHVzZXIgIiArIG5ld0FTRENVc2VyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9IGVsc2UgaWYgKG5ld0FTRENVc2VyLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIlB1c2hVc2VyIiwgIk5VTEwgcG9pbnRlciByZXR1cm5lZCBmcm9tIHVzZXIgY29udmVydGVyIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgdXNlciB7fSIsIHVzZXIudG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSB1c2VyICIgKyBuZXdBU0RDVXNlci5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlVc2VyIGNvbnZlcnRlZEFzZGNVc2VyID0gbmV3QVNEQ1VzZXIubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVVzZXJSZXNwb25zZSA9IHVzZXJCdXNpbmVzc0xvZ2ljLmNyZWF0ZVVzZXIobW9kaWZpZXIsIGNvbnZlcnRlZEFzZGNVc2VyKTsKKworCQkJLy8gQUxSRUFEWSBFWElTVCBSZXNwb25zZUZvcm1hdAorCQkJZmluYWwgU3RyaW5nIEFMUkVBRFlfRVhJU1RTX1JFU1BPTlNFX0lEID0gIlNWQzQwMDYiOworCisJCQlpZiAoY3JlYXRlVXNlclJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWlmICghY3JlYXRlVXNlclJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKS5nZXRNZXNzYWdlSWQoKS5lcXVhbHMoQUxSRUFEWV9FWElTVFNfUkVTUE9OU0VfSUQpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIHt9IiwgdXNlci50b1N0cmluZygpKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJQdXNoVXNlciIsICJGYWlsZWQgdG8gY3JlYXRlIHVzZXIiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIiArIGNyZWF0ZVVzZXJSZXNwb25zZS5yaWdodCgpKTsKKwkJCQl9CisJCQkJbG9nLmRlYnVnKCJVc2VyIGFscmVhZHkgZXhpc3Qge30iLCB1c2VyLnRvU3RyaW5nKCkpOworCQkJfQorCQkJbG9nLmRlYnVnKCJVc2VyIGNyZWF0ZWQge30iLCB1c2VyLnRvU3RyaW5nKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHVzZXIge30iLCB1c2VyLCBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiUHVzaFVzZXIiLCAiRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHVzZXIiLCBlKTsKKwkJfQorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIAorCSAqIGxvZ2luSWQgLSBlcXVhbHMgdG8gdXNlcklkCisJICogCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZWRpdFVzZXIoU3RyaW5nIGxvZ2luSWQsIEVjb21wVXNlciB1c2VyKSB0aHJvd3MgUG9ydGFsQVBJRXhjZXB0aW9uIHsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiBFQ09NUCBlZGl0VXNlciIpOworCisJCXRyeSB7CisJCQlpZiAodXNlciA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJSZWNpZXZlZCBudWxsIGZvciBhcmd1bWVudCB1c2VyIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJFZGl0VXNlciIsICJSZWNpZXZlZCBudWxsIGZvciBhcmd1bWVudCB1c2VyIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCJSZWNpZXZlZCBudWxsIGZvciBhcmd1bWVudCB1c2VyIik7CisJCQl9IGVsc2UgaWYgKGxvZ2luSWQgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiUmVjaWV2ZWQgbnVsbCBmb3IgYXJndW1lbnQgbG9naW5JZCIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiRWRpdFVzZXIiLCAiUmVjaWV2ZWQgbnVsbCBmb3IgYXJndW1lbnQgbG9naW5JZCIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiUmVjaWV2ZWQgbnVsbCBmb3IgYXJndW1lbnQgbG9naW5JZCIpOworCQkJfQorCisJCQlVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQnVzaW5lc3NMb2dpYyA9IGdldFVzZXJCdXNpbmVzc0xvZ2ljKCk7CisKKwkJCWlmICh1c2VyLmdldExvZ2luSWQoKSAhPSBudWxsICYmICF1c2VyLmdldExvZ2luSWQoKS5lcXVhbHMobG9naW5JZCkpIHsKKwkJCQlsb2cuZGVidWcoImxvZ2luSWQgYW5kIHVzZXIgbG9naW5JZCBub3QgZXF1YWwiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkVkaXRVc2VyIiwgImxvZ2luSWQgYW5kIHVzZXIgbG9naW5JZCBub3QgZXF1YWwiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oImxvZ2luSWQgbm90IGVxdWFscyB0byB0aGUgdXNlciBsb2dpbklkIGZpZWxkIik7CisJCQl9IGVsc2UgaWYgKHVzZXIuZ2V0TG9naW5JZCgpID09IG51bGwpIHsKKwkJCQl1c2VyLnNldExvZ2luSWQobG9naW5JZCk7CisJCQl9CisKKwkJCUVpdGhlcjxVc2VyLCBTdHJpbmc+IGFzZGNVc2VyID0gRWNvbXBVc2VyQ29udmVydGVyLmNvbnZlcnRFY29tcFVzZXJUb1VzZXIodXNlcik7CisJCQlpZiAoYXNkY1VzZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY29udmVydCB1c2VyIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJFZGl0VXNlciIsICJGYWlsZWQgdG8gY29udmVydCB1c2VyIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKGFzZGNVc2VyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9IGVsc2UgaWYgKGFzZGNVc2VyLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIk5VTEwgcG9pbnRlciByZXR1cm5lZCBmcm9tIHVzZXIgY29udmVydGVyIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJFZGl0VXNlciIsICJOVUxMIHBvaW50ZXIgcmV0dXJuZWQgZnJvbSB1c2VyIGNvbnZlcnRlciIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiRmFpbGVkIHRvIGVkaXQgdXNlciIpOworCQkJfQorCisJCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVVzZXJDcmVkZW50aWFsc1Jlc3BvbnNlID0gdXNlckJ1c2luZXNzTG9naWMudXBkYXRlVXNlckNyZWRlbnRpYWxzKGFzZGNVc2VyLmxlZnQoKS52YWx1ZSgpKTsKKworCQkJaWYgKHVwZGF0ZVVzZXJDcmVkZW50aWFsc1Jlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZVVzZXJDcmVkZW50aWFscyIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiRWRpdFVzZXIiLCAiRmFpbGVkIHRvIHVwZGF0ZVVzZXJDcmVkZW50aWFscyIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIkZhaWxlZCB0byBlZGl0IHVzZXIiICsgdXBkYXRlVXNlckNyZWRlbnRpYWxzUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZVVzZXJDcmVkZW50aWFscyIpOworCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiRmFpbGVkIHRvIGVkaXQgdXNlciIsIGUpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWNvbXBVc2VyIGdldFVzZXIoU3RyaW5nIGxvZ2luSWQpIHRocm93cyBQb3J0YWxBUElFeGNlcHRpb24geworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIEVDT01QIGdldFVzZXIiKTsKKworCQl0cnkgeworCisJCQlpZiAobG9naW5JZCA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJSZWNpZXZlZCBudWxsIGZvciBhcmd1bWVudCBsb2dpbklkIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJHZXRVc2VyIiwgIlJlY2lldmVkIG51bGwgZm9yIGFyZ3VtZW50IGxvZ2luSWQiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIlJlY2lldmVkIG51bGwgZm9yIGFyZ3VtZW50IGxvZ2luSWQiKTsKKwkJCX0KKworCQkJVXNlckJ1c2luZXNzTG9naWMgdXNlckJ1c2luZXNzTG9naWMgPSBnZXRVc2VyQnVzaW5lc3NMb2dpYygpOworCisJCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyUmVzcG9uc2UgPSB1c2VyQnVzaW5lc3NMb2dpYy5nZXRVc2VyKGxvZ2luSWQsIGZhbHNlKTsKKworCQkJaWYgKGdldFVzZXJSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgVXNlciIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiR2V0VXNlciIsICJGYWlsZWQgdG8gZ2V0IFVzZXIiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgVXNlciIgKyBnZXRVc2VyUmVzcG9uc2UucmlnaHQoKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChnZXRVc2VyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQlFaXRoZXI8RWNvbXBVc2VyLCBTdHJpbmc+IGVjb21wVXNlciA9IEVjb21wVXNlckNvbnZlcnRlci5jb252ZXJ0VXNlclRvRWNvbXBVc2VyKGdldFVzZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCWlmIChlY29tcFVzZXIuaXNMZWZ0KCkgJiYgZWNvbXBVc2VyLmxlZnQoKS52YWx1ZSgpICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiBlY29tcFVzZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgVXNlciIpOworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJHZXRVc2VyIiwgIkZhaWxlZCB0byBnZXQgVXNlciIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQkJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKGVjb21wVXNlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IFVzZXIiKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKCJHZXRVc2VyIiwgIkZhaWxlZCB0byBnZXQgVXNlciIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgVXNlciIgKyBnZXRVc2VyUmVzcG9uc2UucmlnaHQoKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IFVzZXIiKTsKKwkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgVXNlciIsIGUpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8RWNvbXBVc2VyPiBnZXRVc2VycygpIHRocm93cyBQb3J0YWxBUElFeGNlcHRpb24geworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIEVDT01QIGdldFVzZXJzIik7CisKKwkJdHJ5IHsKKwkJCVVzZXJCdXNpbmVzc0xvZ2ljIHVzZXJCdXNpbmVzc0xvZ2ljID0gZ2V0VXNlckJ1c2luZXNzTG9naWMoKTsKKworCQkJZmluYWwgU3RyaW5nIG1vZGlmaWVyQXR0SWQgPSAiamgwMDAzIjsKKworCQkJRWl0aGVyPExpc3Q8VXNlcj4sIFJlc3BvbnNlRm9ybWF0PiBnZXRVc2Vyc1Jlc3BvbnNlID0gdXNlckJ1c2luZXNzTG9naWMuZ2V0VXNlcnNMaXN0KG1vZGlmaWVyQXR0SWQsIG51bGwsIG51bGwpOworCisJCQlpZiAoZ2V0VXNlcnNSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgVXNlcnMiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkdldFVzZXJzIiwgIkZhaWxlZCB0byBnZXQgdXNlcnMiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgVXNlcnMiICsgZ2V0VXNlcnNSZXNwb25zZS5yaWdodCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGdldFVzZXJzUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQlMaXN0PEVjb21wVXNlcj4gZWNvbXBVc2VyTGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKwkJCQkJZm9yIChVc2VyIHVzZXIgOiBnZXRVc2Vyc1Jlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKSB7CisJCQkJCQlFaXRoZXI8RWNvbXBVc2VyLCBTdHJpbmc+IGVjb21wVXNlciA9IEVjb21wVXNlckNvbnZlcnRlci5jb252ZXJ0VXNlclRvRWNvbXBVc2VyKHVzZXIpOworCQkJCQkJaWYgKGVjb21wVXNlci5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjb252ZXJ0IFVzZXIge30iLCB1c2VyKTsKKwkJCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkdldFVzZXJzIiwgIkZhaWxlZCB0byBjb252ZXJ0IFVzZXIiICsgdXNlci50b1N0cmluZygpLCBFcnJvclNldmVyaXR5LldBUk5JTkcpOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfSBlbHNlIGlmIChlY29tcFVzZXIubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNvbnZlcnQgVXNlciB7fSIsIHVzZXIpOworCQkJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiR2V0VXNlcnMiLCAiRmFpbGVkIHRvIGNvbnZlcnQgVXNlciIgKyB1c2VyLnRvU3RyaW5nKCksIEVycm9yU2V2ZXJpdHkuV0FSTklORyk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQllY29tcFVzZXJMaXN0LmFkZChlY29tcFVzZXIubGVmdCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJCXJldHVybiBlY29tcFVzZXJMaXN0OworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCB1c2VycyIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkdldFVzZXJzIiwgIkZhaWxlZCB0byBnZXQgdXNlcnMiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IFVzZXJzIiArIGdldFVzZXJzUmVzcG9uc2UucmlnaHQoKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHVzZXJzIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkdldFVzZXJzIiwgIkZhaWxlZCB0byBnZXQgdXNlcnMiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBVc2VycyIsIGUpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8RWNvbXBSb2xlPiBnZXRBdmFpbGFibGVSb2xlcygpIHRocm93cyBQb3J0YWxBUElFeGNlcHRpb24geworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIEVDT01QIGdldEF2YWlsYWJsZVJvbGVzIik7CisJCXRyeSB7CisJCQlMaXN0PEVjb21wUm9sZT4gZWNvbXBSb2xlc0xpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisJCQlmb3IgKFJvbGUgcm9sZSA6IFJvbGUudmFsdWVzKCkpIHsKKwkJCQlFY29tcFJvbGUgZWNvbXBSb2xlID0gbmV3IEVjb21wUm9sZSgpOworCQkJCWVjb21wUm9sZS5zZXRJZChuZXcgTG9uZyhyb2xlLm9yZGluYWwoKSkpOworCQkJCWVjb21wUm9sZS5zZXROYW1lKHJvbGUubmFtZSgpKTsKKwkJCQllY29tcFJvbGVzTGlzdC5hZGQoZWNvbXBSb2xlKTsKKwkJCX0KKworCQkJaWYgKGVjb21wUm9sZXNMaXN0LmlzRW1wdHkoKSkgeworCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oKTsKKwkJCX0KKworCQkJcmV0dXJuIGVjb21wUm9sZXNMaXN0OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggcm9sZXMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiR2V0QXZhaWxhYmxlUm9sZXMiLCAiRmFpbGVkIHRvIGZldGNoIHJvbGVzIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIlJvbGVzIGZldGNoaW5nIGZhaWxlZCIsIGUpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGUgdXNlciByb2xlIHVwZGF0ZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBvbmx5CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHVzaFVzZXJSb2xlKFN0cmluZyBsb2dpbklkLCBMaXN0PEVjb21wUm9sZT4gcm9sZXMpIHRocm93cyBQb3J0YWxBUElFeGNlcHRpb24geworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIEVDT01QIHB1c2hVc2VyUm9sZSIpOworCisJCWZpbmFsIFN0cmluZyBtb2RpZmllckF0dElkID0gImpoMDAwMyI7CisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQobW9kaWZpZXJBdHRJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCBtb2RpZmllckF0dElkKTsKKworCQlVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQnVzaW5lc3NMb2dpYyA9IGdldFVzZXJCdXNpbmVzc0xvZ2ljKCk7CisKKwkJU3RyaW5nIHVwZGF0ZWRSb2xlID0gbnVsbDsKKworCQlpZiAocm9sZXMgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiRXJyb3I6IFJlY2lldmVkIG51bGwgZm9yIHJvbGVzIik7CisJCX0gZWxzZSBpZiAocm9sZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKwkJCUVjb21wUm9sZSBlY29tcFJvbGUgPSByb2xlcy5pdGVyYXRvcigpLm5leHQoKTsKKwkJCXVwZGF0ZWRSb2xlID0gRWNvbXBSb2xlQ29udmVydGVyLmNvbnZlcnRFY29tcFJvbGVUb1JvbGUoZWNvbXBSb2xlKTsKKwkJCWxvZy5kZWJ1ZygicHVzaGluZyByb2xlOiB7fSB0byB1c2VyOiB7fSIsIHVwZGF0ZWRSb2xlLCBsb2dpbklkKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiRXJyb3I6IE5vIHJvbGVzIGluIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiUHVzaFVzZXJSb2xlIiwgIkZhaWxlZCB0byBmZXRjaCByb2xlcyIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCJFcnJvcjogTm8gcm9sZXMgaW4gTGlzdCIpOworCQl9CisKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVVc2VyUm9sZVJlc3BvbnNlID0gdXNlckJ1c2luZXNzTG9naWMudXBkYXRlVXNlclJvbGUobW9kaWZpZXIsIGxvZ2luSWQsIHVwZGF0ZWRSb2xlKTsKKwkJaWYgKHVwZGF0ZVVzZXJSb2xlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkVycm9yOiBGYWlsZWQgdG8gdXBkYXRlIHJvbGUiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiUHVzaFVzZXJSb2xlIiwgIkZhaWxlZCB0byB1cGRhdGUgcm9sZSIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCJGYWlsZWQgdG8gdXBkYXRlIHJvbGUiICsgdXBkYXRlVXNlclJvbGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkudG9TdHJpbmcoKSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxFY29tcFJvbGU+IGdldFVzZXJSb2xlcyhTdHJpbmcgbG9naW5JZCkgdGhyb3dzIFBvcnRhbEFQSUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIEVDT01QIGdldFVzZXJSb2xlcyIpOworCisJCQlVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQnVzaW5lc3NMb2dpYyA9IGdldFVzZXJCdXNpbmVzc0xvZ2ljKCk7CisKKwkJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGdldFVzZXJSZXNwb25zZSA9IHVzZXJCdXNpbmVzc0xvZ2ljLmdldFVzZXIobG9naW5JZCwgZmFsc2UpOworCisJCQlpZiAoZ2V0VXNlclJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRXJyb3I6IEZhaWxlZCB0byBnZXQgUm9sZXMiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkdldFVzZXJSb2xlcyIsICJGYWlsZWQgdG8gZ2V0IFJvbGVzIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IFJvbGVzIiArIGdldFVzZXJSZXNwb25zZS5yaWdodCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGdldFVzZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKSB7CisJCQkJCUVpdGhlcjxFY29tcFVzZXIsIFN0cmluZz4gZWNvbXBVc2VyID0gRWNvbXBVc2VyQ29udmVydGVyLmNvbnZlcnRVc2VyVG9FY29tcFVzZXIoZ2V0VXNlclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJaWYgKGVjb21wVXNlci5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRXJyb3I6IEZhaWxlZCB0byBjb252ZXJ0IFJvbGVzIik7CisJCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkdldFVzZXJSb2xlcyIsICJGYWlsZWQgdG8gY29udmVydCBSb2xlcyIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbihlY29tcFVzZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIGlmIChlY29tcFVzZXIubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJCQkJbG9nLmRlYnVnKCJFcnJvcjogRmFpbGVkIHRvIGNvbnZlcnQgUm9sZXMiKTsKKwkJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiR2V0VXNlclJvbGVzIiwgIkZhaWxlZCB0byBjb252ZXJ0IFJvbGVzIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCQl0aHJvdyBuZXcgUG9ydGFsQVBJRXhjZXB0aW9uKCk7CisJCQkJCX0KKworCQkJCQlyZXR1cm4gbmV3IExpbmtlZExpc3Q8PihlY29tcFVzZXIubGVmdCgpLnZhbHVlKCkuZ2V0Um9sZXMoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJFcnJvcjogRmFpbGVkIHRvIGdldCBSb2xlcyIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW52YWxpZElucHV0RXJyb3IoIkdldFVzZXJSb2xlcyIsICJGYWlsZWQgdG8gZ2V0IFJvbGVzIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCXRocm93IG5ldyBQb3J0YWxBUElFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgUm9sZXMiICsgZ2V0VXNlclJlc3BvbnNlLnJpZ2h0KCkpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRXJyb3I6IEZhaWxlZCB0byBnZXQgUm9sZXMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiR2V0VXNlclJvbGVzIiwgIkZhaWxlZCB0byBnZXQgUm9sZXMiLCBFcnJvclNldmVyaXR5LklORk8pOworCQkJdGhyb3cgbmV3IFBvcnRhbEFQSUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBSb2xlcyIsIGUpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBcHBBdXRoZW50aWNhdGVkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgUG9ydGFsQVBJRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBWYWxpZGF0aW9uIHNob3VsZCBiZSBjaGFuZ2VkIGNvbXBsZXRlbHkKKwkJZmluYWwgU3RyaW5nIFVTRVJOQU1FID0gcmVxdWVzdC5nZXRIZWFkZXIoInVzZXJuYW1lIik7CisJCWZpbmFsIFN0cmluZyBQQVNTV09SRCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJwYXNzd29yZCIpOworCisJCWlmIChVU0VSTkFNRSAhPSBudWxsICYmIFBBU1NXT1JEICE9IG51bGwpIHsKKwkJCWlmICghVVNFUk5BTUUuZXF1YWxzKCIiKSAmJiAhUEFTU1dPUkQuZXF1YWxzKCIiKSkgeworCQkJCWxvZy5kZWJ1ZygiVXNlciBhdXRoZW50aWNhdGVkIC0gVXNlcm5hbWU6IHt9IFBhc3N3b3JkOiB7fSIsIFVTRVJOQU1FLCBQQVNTV09SRCk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlsb2cuZGVidWcoIlVzZXIgYXV0aGVudGljYXRpb24gZmFpbGVkIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIFVzZXJCdXNpbmVzc0xvZ2ljIGdldFVzZXJCdXNpbmVzc0xvZ2ljKCkgeworCQlBcHBsaWNhdGlvbkNvbnRleHQgY3R4ID0gQ29udGV4dExvYWRlci5nZXRDdXJyZW50V2ViQXBwbGljYXRpb25Db250ZXh0KCk7CisJCVVzZXJCdXNpbmVzc0xvZ2ljIHVzZXJCdXNpbmVzc0xvZ2ljID0gKFVzZXJCdXNpbmVzc0xvZ2ljKSBjdHguZ2V0QmVhbigidXNlckJ1c2luZXNzTG9naWMiKTsKKwkJcmV0dXJuIHVzZXJCdXNpbmVzc0xvZ2ljOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9lY29tcC9jb252ZXJ0ZXJzL0Vjb21wUm9sZUNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Vjb21wL2NvbnZlcnRlcnMvRWNvbXBSb2xlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5NzBjZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9lY29tcC9jb252ZXJ0ZXJzL0Vjb21wUm9sZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5lY29tcC5jb252ZXJ0ZXJzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnJlc3RmdWwuZG9tYWluLkVjb21wUm9sZTsKKworcHVibGljIGZpbmFsIGNsYXNzIEVjb21wUm9sZUNvbnZlcnRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRWNvbXBSb2xlQ29udmVydGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIEVjb21wUm9sZUNvbnZlcnRlcigpIHsKKwl9CisKKwkvLyBUT0RPIEFkZCBFaXRoZXIgb3IgRXhjZXB0aW9uIGluIGNhc2Ugb2YgY29udmVydGF0aW9uIGZhaWx1cmUKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RWNvbXBSb2xlVG9Sb2xlKEVjb21wUm9sZSBlY29tcFJvbGUpIHsKKworCQlsb2cuZGVidWcoImNvbnZlcnRpbmcgcm9sZSIpOworCQlpZiAoZWNvbXBSb2xlID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygicmVjaWV2ZWQgbnVsbCBmb3Igcm9sZXMiKTsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJZm9yIChSb2xlIHJvbGUgOiBSb2xlLnZhbHVlcygpKSB7CisJCQlpZiAocm9sZS5vcmRpbmFsKCkgPT0gZWNvbXBSb2xlLmdldElkKCkpIHsKKwkJCQlyZXR1cm4gcm9sZS5uYW1lKCk7CisJCQl9CisJCX0KKwkJbG9nLmRlYnVnKCJubyByb2xlcyBjb252ZXJ0ZWQiKTsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Vjb21wL2NvbnZlcnRlcnMvRWNvbXBVc2VyQ29udmVydGVyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZWNvbXAvY29udmVydGVycy9FY29tcFVzZXJDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNiNTNjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Vjb21wL2NvbnZlcnRlcnMvRWNvbXBVc2VyQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5lY29tcC5jb252ZXJ0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuVXNlclN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnJlc3RmdWwuZG9tYWluLkVjb21wUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLnJlc3RmdWwuZG9tYWluLkVjb21wVXNlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgRWNvbXBVc2VyQ29udmVydGVyIHsKKworCXByaXZhdGUgRWNvbXBVc2VyQ29udmVydGVyKCkgeworCX0KKworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIEVjb21wVXNlckNvbnZlcnRlciBpbnN0YW5jZSA9IG5ldworCS8vIEVjb21wVXNlckNvbnZlcnRlcigpOworCisJLyoKKwkgKiBwdWJsaWMgc3RhdGljIEVjb21wVXNlckNvbnZlcnRlciBnZXRJbnNhdG5jZSgpIHsgcmV0dXJuIGluc3RhbmNlOyB9CisJICovCisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxFY29tcFVzZXIsIFN0cmluZz4gY29udmVydFVzZXJUb0Vjb21wVXNlcihVc2VyIGFzZGNVc2VyKSB7CisJCUVjb21wVXNlciBjb252ZXJ0ZWRVc2VyID0gbmV3IEVjb21wVXNlcigpOworCisJCWlmIChhc2RjVXNlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KCJVc2VyIGlzIG51bGwiKTsKKwkJfQorCisJCWNvbnZlcnRlZFVzZXIuc2V0Rmlyc3ROYW1lKGFzZGNVc2VyLmdldEZpcnN0TmFtZSgpKTsKKwkJY29udmVydGVkVXNlci5zZXRMYXN0TmFtZShhc2RjVXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJY29udmVydGVkVXNlci5zZXRMb2dpbklkKGFzZGNVc2VyLmdldFVzZXJJZCgpKTsKKwkJY29udmVydGVkVXNlci5zZXRPcmdVc2VySWQoYXNkY1VzZXIuZ2V0VXNlcklkKCkpOworCQljb252ZXJ0ZWRVc2VyLnNldEVtYWlsKGFzZGNVc2VyLmdldEVtYWlsKCkpOworCisJCWlmIChhc2RjVXNlci5nZXRTdGF0dXMoKS5lcXVhbHMoVXNlclN0YXR1c0VudW0uQUNUSVZFKSkgeworCQkJY29udmVydGVkVXNlci5zZXRBY3RpdmUodHJ1ZSk7CisJCX0gZWxzZSBpZiAoYXNkY1VzZXIuZ2V0U3RhdHVzKCkuZXF1YWxzKFVzZXJTdGF0dXNFbnVtLklOQUNUSVZFKSkgeworCQkJY29udmVydGVkVXNlci5zZXRBY3RpdmUoZmFsc2UpOworCQl9CisKKwkJRWNvbXBSb2xlIGNvbnZlcnRlZFJvbGUgPSBuZXcgRWNvbXBSb2xlKCk7CisJCWZvciAoUm9sZSByb2xlIDogUm9sZS52YWx1ZXMoKSkgeworCQkJaWYgKHJvbGUubmFtZSgpLmVxdWFscyhhc2RjVXNlci5nZXRSb2xlKCkpIHx8IHJvbGUudG9TdHJpbmcoKS5lcXVhbHMoYXNkY1VzZXIuZ2V0Um9sZSgpKSkgeworCQkJCWNvbnZlcnRlZFJvbGUuc2V0TmFtZShyb2xlLm5hbWUoKSk7CisJCQkJY29udmVydGVkUm9sZS5zZXRJZChuZXcgTG9uZyhyb2xlLm9yZGluYWwoKSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJU2V0PEVjb21wUm9sZT4gY29udmVydGVkUm9sZVNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJY29udmVydGVkUm9sZVNldC5hZGQoY29udmVydGVkUm9sZSk7CisJCWNvbnZlcnRlZFVzZXIuc2V0Um9sZXMoY29udmVydGVkUm9sZVNldCk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnZlcnRlZFVzZXIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPFVzZXIsIFN0cmluZz4gY29udmVydEVjb21wVXNlclRvVXNlcihFY29tcFVzZXIgZWNvbXBVc2VyKSB7CisJCVVzZXIgY29udmVydGVkVXNlciA9IG5ldyBVc2VyKCk7CisKKwkJaWYgKGVjb21wVXNlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KCJFY29tcFVzZXIgaXMgbnVsbCIpOworCQl9CisKKwkJY29udmVydGVkVXNlci5zZXRGaXJzdE5hbWUoZWNvbXBVc2VyLmdldEZpcnN0TmFtZSgpKTsKKwkJY29udmVydGVkVXNlci5zZXRMYXN0TmFtZShlY29tcFVzZXIuZ2V0TGFzdE5hbWUoKSk7CisKKwkJaWYgKCFlY29tcFVzZXIuZ2V0TG9naW5JZCgpLmlzRW1wdHkoKSkgeworCQkJY29udmVydGVkVXNlci5zZXRVc2VySWQoZWNvbXBVc2VyLmdldExvZ2luSWQoKSk7CisJCX0gZWxzZSB7CisJCQljb252ZXJ0ZWRVc2VyLnNldFVzZXJJZChlY29tcFVzZXIuZ2V0T3JnVXNlcklkKCkpOworCQl9CisKKwkJY29udmVydGVkVXNlci5zZXRFbWFpbChlY29tcFVzZXIuZ2V0RW1haWwoKSk7CisKKwkJaWYgKGVjb21wVXNlci5nZXRSb2xlcygpICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPEVjb21wUm9sZT4gaXRlciA9IGVjb21wVXNlci5nZXRSb2xlcygpLml0ZXJhdG9yKCk7CisKKwkJCWlmIChpdGVyLmhhc05leHQoKSkgeworCQkJCVN0cmluZyB1cGRhdGVkUm9sZSA9IEVjb21wUm9sZUNvbnZlcnRlci5jb252ZXJ0RWNvbXBSb2xlVG9Sb2xlKGl0ZXIubmV4dCgpKTsKKwkJCQljb252ZXJ0ZWRVc2VyLnNldFJvbGUodXBkYXRlZFJvbGUpOworCQkJfQorCQl9CisKKwkJaWYgKGVjb21wVXNlci5pc0FjdGl2ZSgpKSB7CisJCQljb252ZXJ0ZWRVc2VyLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5BQ1RJVkUpOworCQl9IGVsc2UgeworCQkJY29udmVydGVkVXNlci5zZXRTdGF0dXMoVXNlclN0YXR1c0VudW0uSU5BQ1RJVkUpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnZlcnRlZFVzZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L0FydGlmYWN0RXh0ZXJuYWxTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9BcnRpZmFjdEV4dGVybmFsU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZGNlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9BcnRpZmFjdEV4dGVybmFsU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNjQ2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZXh0ZXJuYWxhcGkuc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0cy5CZUdlbmVyaWNTZXJ2bGV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzLlJlcHJlc2VudGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5XcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdlbmVyYWxVdGlsaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogVGhpcyBTZXJ2bGV0IHNlcnZlcyBleHRlcm5hbCB1c2VycyBvcGVyYXRpb25zIG9uIGFydGlmYWN0cy4KKyAqIAorICogQGF1dGhvciBtc2hpdHJpdAorICoKKyAqLworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NhdGFsb2ciKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEFydGlmYWN0RXh0ZXJuYWxTZXJ2bGV0IGV4dGVuZHMgQmVHZW5lcmljU2VydmxldCB7CisKKwlAQ29udGV4dAorCXByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXJ0aWZhY3RFeHRlcm5hbFNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qKgorCSAqIFVwbG9hZHMgYW4gYXJ0aWZhY3QgdG8gcmVzb3VyY2Ugb3Igc2VydmljZQorCSAqIAorCSAqIEBwYXJhbSBhc3NldFR5cGUKKwkgKiBAcGFyYW0gdXVpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlAUE9TVAorCUBQYXRoKCIve2Fzc2V0VHlwZX0ve3V1aWR9L2FydGlmYWN0cyIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAidXBsb2FkcyBvZiBhcnRpZmFjdCB0byBhIHJlc291cmNlIG9yIHNlcnZpY2UiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJ1cGxvYWRzIG9mIGFydGlmYWN0IHRvIGEgcmVzb3VyY2Ugb3Igc2VydmljZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXJ0aWZhY3QgdXBsb2FkZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDEsIG1lc3NhZ2UgPSAiQXV0aG9yaXphdGlvbiByZXF1aXJlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQXNzZXQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBsb2FkQXJ0aWZhY3QoQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwgQFBhdGhQYXJhbSgidXVpZCIpIGZpbmFsIFN0cmluZyB1dWlkLCBAQXBpUGFyYW0odmFsdWUgPSAianNvbiBkZXNjcmliZSB0aGUgYXJ0aWZhY3QiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhKSB7CisKKwkJV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IG51bGw7CisJCVN0cmluZyBpbnN0YW5jZUlkSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKTsKKwkJU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdFVSSTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoYXNzZXRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJ1cGxvYWRBcnRpZmFjdDogYXNzZXRUeXBlIHBhcmFtZXRlciB7fSBpcyBub3QgdmFsaWQiLCBhc3NldFR5cGUpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMgPSBuZXcgRW51bU1hcDw+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpICYmIChpbnN0YW5jZUlkSGVhZGVyID09IG51bGwgfHwgaW5zdGFuY2VJZEhlYWRlci5pc0VtcHR5KCkpKSB7CisJCQlsb2cuZGVidWcoInVwbG9hZEFydGlmYWN0OiBNaXNzaW5nIFgtRUNPTVAtSW5zdGFuY2VJRCBoZWFkZXIiKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsVXBsb2FkQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpICYmICh1c2VySWQgPT0gbnVsbCB8fCB1c2VySWQuaXNFbXB0eSgpKSkgeworCQkJbG9nLmRlYnVnKCJ1cGxvYWRBcnRpZmFjdDogTWlzc2luZyBVU0VSX0lEIGhlYWRlciIpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ09OVEFDVCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsVXBsb2FkQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl0cnkgeworCQkJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQkJCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTG9naWMgPSBnZXRBcnRpZmFjdEJMKGNvbnRleHQpOworCQkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGxvYWRBcnRpZmFjdEVpdGhlciA9IGFydGlmYWN0c0xvZ2ljLnVwbG9hZEFydGlmYWN0VG9Db21wb25lbnRCeVVVSUQoZGF0YSwgcmVxdWVzdCwgY29tcG9uZW50VHlwZSwgdXVpZCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQkJaWYgKHVwbG9hZEFydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGxvYWQgYXJ0aWZhY3QiKTsKKwkJCQkJcmVzcG9uc2VGb3JtYXQgPSB1cGxvYWRBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGxvYWRBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlPYmplY3QgcmVwcmVzZW50YXRpb24gPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24odXBsb2FkQXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJCWhlYWRlcnMucHV0KENvbnN0YW50cy5NRDVfSEVBREVSLCBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeVN0cmluZygoU3RyaW5nKSByZXByZXNlbnRhdGlvbikpOworCQkJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGxvYWRBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVwcmVzZW50YXRpb24sIGhlYWRlcnMpKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gImZhaWxlZCB0byB1cGxvYWQgYXJ0aWZhY3QgdG8gYSByZXNvdXJjZSBvciBzZXJ2aWNlIjsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKG1lc3NhZ2UpOworCQkJCWxvZy5kZWJ1ZyhtZXNzYWdlLCBlKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCS8qKgorCSAqIFVwbG9hZHMgYW4gYXJ0aWZhY3QgdG8gcmVzb3VyY2UgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcGFyYW0gYXNzZXRUeXBlCisJICogQHBhcmFtIHV1aWQKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZU5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJQFBPU1QKKwlAUGF0aCgiL3thc3NldFR5cGV9L3t1dWlkfS9yZXNvdXJjZUluc3RhbmNlcy97cmVzb3VyY2VJbnN0YW5jZU5hbWV9L2FydGlmYWN0cyIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAidXBsb2FkcyBhbiBhcnRpZmFjdCB0byBhIHJlc291cmNlIGluc3RhbmNlIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAidXBsb2FkcyBhbiBhcnRpZmFjdCB0byBhIHJlc291cmNlIGluc3RhbmNlIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJBcnRpZmFjdCB1cGxvYWRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMSwgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uIHJlcXVpcmVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJBc3NldCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGxvYWRBcnRpZmFjdFRvSW5zdGFuY2UoQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwgQFBhdGhQYXJhbSgidXVpZCIpIGZpbmFsIFN0cmluZyB1dWlkLCBAUGF0aFBhcmFtKCJyZXNvdXJjZUluc3RhbmNlTmFtZSIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJqc29uIGRlc2NyaWJlIHRoZSBhcnRpZmFjdCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEpIHsKKworCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbnVsbDsKKwkJU3RyaW5nIGluc3RhbmNlSWRIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpOworCQlTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0VVJJOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShhc3NldFR5cGUpOworCQlpZiAoY29tcG9uZW50VHlwZSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoInVwbG9hZEFydGlmYWN0OiBhc3NldFR5cGUgcGFyYW1ldGVyIHt9IGlzIG5vdCB2YWxpZCIsIGFzc2V0VHlwZSk7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJfQorCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcyA9IG5ldyBFbnVtTWFwPD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkgJiYgKGluc3RhbmNlSWRIZWFkZXIgPT0gbnVsbCB8fCBpbnN0YW5jZUlkSGVhZGVyLmlzRW1wdHkoKSkpIHsKKwkJCWxvZy5kZWJ1ZygidXBsb2FkQXJ0aWZhY3Q6IE1pc3NpbmcgWC1FQ09NUC1JbnN0YW5jZUlEIGhlYWRlciIpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGxvYWRBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkgJiYgKHVzZXJJZCA9PSBudWxsIHx8IHVzZXJJZC5pc0VtcHR5KCkpKSB7CisJCQlsb2cuZGVidWcoInVwbG9hZEFydGlmYWN0OiBNaXNzaW5nIFVTRVJfSUQgaGVhZGVyIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DT05UQUNUKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGxvYWRBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXRyeSB7CisJCQkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCQkJQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyBhcnRpZmFjdHNMb2dpYyA9IGdldEFydGlmYWN0QkwoY29udGV4dCk7CisJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwbG9hZEFydGlmYWN0RWl0aGVyID0gYXJ0aWZhY3RzTG9naWMudXBsb2FkQXJ0aWZhY3RUb1JpQnlVVUlEKGRhdGEsIHJlcXVlc3QsIGNvbXBvbmVudFR5cGUsIHV1aWQsIHJlc291cmNlSW5zdGFuY2VOYW1lLCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQlpZiAodXBsb2FkQXJ0aWZhY3RFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwbG9hZCBhcnRpZmFjdCIpOworCQkJCQlyZXNwb25zZUZvcm1hdCA9IHVwbG9hZEFydGlmYWN0RWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbFVwbG9hZEFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQkJCX0gZWxzZSB7CisJCQkJCU9iamVjdCByZXByZXNlbnRhdGlvbiA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbih1cGxvYWRBcnRpZmFjdEVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLk1ENV9IRUFERVIsIEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5U3RyaW5nKChTdHJpbmcpIHJlcHJlc2VudGF0aW9uKSk7CisJCQkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbFVwbG9hZEFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXByZXNlbnRhdGlvbiwgaGVhZGVycykpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiZmFpbGVkIHRvIHVwbG9hZCBhcnRpZmFjdCB0byBhIHJlc291cmNlIGluc3RhbmNlIjsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKG1lc3NhZ2UpOworCQkJCWxvZy5kZWJ1ZyhtZXNzYWdlLCBlKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCS8qKgorCSAqIHVwZGF0ZXMgYW4gYXJ0aWZhY3Qgb24gYSByZXNvdXJjZSBvciBzZXJ2aWNlCisJICogCisJICogQHBhcmFtIGFzc2V0VHlwZQorCSAqIEBwYXJhbSB1dWlkCisJICogQHBhcmFtIGFydGlmYWN0VVVJRAorCSAqIEByZXR1cm4KKwkgKi8KKwlAUE9TVAorCUBQYXRoKCIve2Fzc2V0VHlwZX0ve3V1aWR9L2FydGlmYWN0cy97YXJ0aWZhY3RVVUlEfSIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAidXBkYXRlcyBhbiBhcnRpZmFjdCBvbiBhIHJlc291cmNlIG9yIHNlcnZpY2UiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJ1cGxvYWRzIG9mIGFydGlmYWN0IHRvIGEgcmVzb3VyY2Ugb3Igc2VydmljZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXJ0aWZhY3QgVXBkYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMSwgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uIHJlcXVpcmVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJBc3NldCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVBcnRpZmFjdChAUGF0aFBhcmFtKCJhc3NldFR5cGUiKSBmaW5hbCBTdHJpbmcgYXNzZXRUeXBlLCBAUGF0aFBhcmFtKCJ1dWlkIikgZmluYWwgU3RyaW5nIHV1aWQsIEBQYXRoUGFyYW0oImFydGlmYWN0VVVJRCIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdFVVSUQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAianNvbiBkZXNjcmliZSB0aGUgYXJ0aWZhY3QiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhKSB7CisKKwkJV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IG51bGw7CisJCVN0cmluZyBpbnN0YW5jZUlkSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKTsKKwkJU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdFVSSTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoYXNzZXRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVBcnRpZmFjdDogYXNzZXRUeXBlIHBhcmFtZXRlciB7fSBpcyBub3QgdmFsaWQiLCBhc3NldFR5cGUpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMgPSBuZXcgRW51bU1hcDw+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCisJCS8vIE1hbmRhdG9yeQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSAmJiAoaW5zdGFuY2VJZEhlYWRlciA9PSBudWxsIHx8IGluc3RhbmNlSWRIZWFkZXIuaXNFbXB0eSgpKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVBcnRpZmFjdDogTWlzc2luZyBYLUVDT01QLUluc3RhbmNlSUQgaGVhZGVyIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX1hfRUNPTVBfSU5TVEFOQ0VfSUQpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbFVwZGF0ZUFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSAmJiAodXNlcklkID09IG51bGwgfHwgdXNlcklkLmlzRW1wdHkoKSkpIHsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlQXJ0aWZhY3Q6IE1pc3NpbmcgVVNFUl9JRCBoZWFkZXIiKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbFVwZGF0ZUFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdHJ5IHsKKwkJCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJCQlBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c0xvZ2ljID0gZ2V0QXJ0aWZhY3RCTChjb250ZXh0KTsKKwkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdXBsb2FkQXJ0aWZhY3RFaXRoZXIgPSBhcnRpZmFjdHNMb2dpYy51cGRhdGVBcnRpZmFjdE9uQ29tcG9uZW50QnlVVUlEKGRhdGEsIHJlcXVlc3QsIGNvbXBvbmVudFR5cGUsIHV1aWQsIGFydGlmYWN0VVVJRCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQkJaWYgKHVwbG9hZEFydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgYXJ0aWZhY3QiKTsKKwkJCQkJcmVzcG9uc2VGb3JtYXQgPSB1cGxvYWRBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGRhdGVBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlPYmplY3QgcmVwcmVzZW50YXRpb24gPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24odXBsb2FkQXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJCWhlYWRlcnMucHV0KENvbnN0YW50cy5NRDVfSEVBREVSLCBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeVN0cmluZygoU3RyaW5nKSByZXByZXNlbnRhdGlvbikpOworCQkJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGRhdGVBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVwcmVzZW50YXRpb24sIGhlYWRlcnMpKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gImZhaWxlZCB0byB1cGRhdGUgYXJ0aWZhY3Qgb24gYSByZXNvdXJjZSBvciBzZXJ2aWNlIjsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKG1lc3NhZ2UpOworCQkJCWxvZy5kZWJ1ZyhtZXNzYWdlLCBlKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCS8qKgorCSAqIHVwZGF0ZXMgYW4gYXJ0aWZhY3Qgb24gYSByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSBhc3NldFR5cGUKKwkgKiBAcGFyYW0gdXVpZAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlTmFtZQorCSAqIEBwYXJhbSBhcnRpZmFjdFVVSUQKKwkgKiBAcmV0dXJuCisJICovCisJQFBPU1QKKwlAUGF0aCgiL3thc3NldFR5cGV9L3t1dWlkfS9yZXNvdXJjZUluc3RhbmNlcy97cmVzb3VyY2VJbnN0YW5jZU5hbWV9L2FydGlmYWN0cy97YXJ0aWZhY3RVVUlEfSIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAidXBkYXRlcyBhbiBhcnRpZmFjdCBvbiBhIHJlc291cmNlIGluc3RhbmNlIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAidXBsb2FkcyBvZiBhcnRpZmFjdCB0byBhIHJlc291cmNlIG9yIHNlcnZpY2UiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IFVwZGF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDEsIG1lc3NhZ2UgPSAiQXV0aG9yaXphdGlvbiByZXF1aXJlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQXNzZXQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlQXJ0aWZhY3RPblJlc291cmNlSW5zdGFuY2UoQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwgQFBhdGhQYXJhbSgidXVpZCIpIGZpbmFsIFN0cmluZyB1dWlkLCBAUGF0aFBhcmFtKCJyZXNvdXJjZUluc3RhbmNlTmFtZSIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwKKwkJCUBQYXRoUGFyYW0oImFydGlmYWN0VVVJRCIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdFVVSUQsIEBBcGlQYXJhbSh2YWx1ZSA9ICJqc29uIGRlc2NyaWJlIHRoZSBhcnRpZmFjdCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEpIHsKKworCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbnVsbDsKKwkJU3RyaW5nIGluc3RhbmNlSWRIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpOworCQlTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0VVJJOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShhc3NldFR5cGUpOworCQlpZiAoY29tcG9uZW50VHlwZSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoInVwZGF0ZUFydGlmYWN0T25SZXNvdXJjZUluc3RhbmNlOiBhc3NldFR5cGUgcGFyYW1ldGVyIHt9IGlzIG5vdCB2YWxpZCIsIGFzc2V0VHlwZSk7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJfQorCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcyA9IG5ldyBFbnVtTWFwPD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkgJiYgKGluc3RhbmNlSWRIZWFkZXIgPT0gbnVsbCB8fCBpbnN0YW5jZUlkSGVhZGVyLmlzRW1wdHkoKSkpIHsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlQXJ0aWZhY3RPblJlc291cmNlSW5zdGFuY2U6IE1pc3NpbmcgWC1FQ09NUC1JbnN0YW5jZUlEIGhlYWRlciIpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGRhdGVBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkgJiYgKHVzZXJJZCA9PSBudWxsIHx8IHVzZXJJZC5pc0VtcHR5KCkpKSB7CisJCQlsb2cuZGVidWcoInVwZGF0ZUFydGlmYWN0T25SZXNvdXJjZUluc3RhbmNlOiBNaXNzaW5nIFVTRVJfSUQgaGVhZGVyIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DT05UQUNUKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxVcGRhdGVBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXRyeSB7CisJCQkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCQkJQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyBhcnRpZmFjdHNMb2dpYyA9IGdldEFydGlmYWN0QkwoY29udGV4dCk7CisJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IHVwbG9hZEFydGlmYWN0RWl0aGVyID0gYXJ0aWZhY3RzTG9naWMudXBkYXRlQXJ0aWZhY3RPblJpQnlVVUlEKGRhdGEsIHJlcXVlc3QsIGNvbXBvbmVudFR5cGUsIHV1aWQsIHJlc291cmNlSW5zdGFuY2VOYW1lLCBhcnRpZmFjdFVVSUQsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJCWlmICh1cGxvYWRBcnRpZmFjdEVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIGFydGlmYWN0Iik7CisJCQkJCXJlc3BvbnNlRm9ybWF0ID0gdXBsb2FkQXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsVXBkYXRlQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJT2JqZWN0IHJlcHJlc2VudGF0aW9uID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKHVwbG9hZEFydGlmYWN0RWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQkJCQloZWFkZXJzLnB1dChDb25zdGFudHMuTUQ1X0hFQURFUiwgR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlTdHJpbmcoKFN0cmluZykgcmVwcmVzZW50YXRpb24pKTsKKwkJCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsVXBkYXRlQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlcHJlc2VudGF0aW9uLCBoZWFkZXJzKSk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJmYWlsZWQgdG8gdXBkYXRlIGFydGlmYWN0IG9uIHJlc291cmNlIGluc3RhbmNlIjsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKG1lc3NhZ2UpOworCQkJCWxvZy5kZWJ1ZyhtZXNzYWdlLCBlKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCS8qKgorCSAqIGRlbGV0ZXMgYW4gYXJ0aWZhY3Qgb2YgYSByZXNvdXJjZSBvciBzZXJ2aWNlCisJICogCisJICogQHBhcmFtIGFzc2V0VHlwZQorCSAqIEBwYXJhbSB1dWlkCisJICogQHBhcmFtIGFydGlmYWN0VVVJRAorCSAqIEByZXR1cm4KKwkgKi8KKwlAREVMRVRFCisJQFBhdGgoIi97YXNzZXRUeXBlfS97dXVpZH0vYXJ0aWZhY3RzL3thcnRpZmFjdFVVSUR9IikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJkZWxldGVzIGFuIGFydGlmYWN0IG9mIGEgcmVzb3VyY2Ugb3Igc2VydmljZSIsIGh0dHBNZXRob2QgPSAiREVMRVRFIiwgbm90ZXMgPSAiZGVsZXRlcyBhbiBhcnRpZmFjdCBvZiBhIHJlc291cmNlIG9yIHNlcnZpY2UiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IERlbGV0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDEsIG1lc3NhZ2UgPSAiQXV0aG9yaXphdGlvbiByZXF1aXJlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQXNzZXQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlQXJ0aWZhY3QoQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwgQFBhdGhQYXJhbSgidXVpZCIpIGZpbmFsIFN0cmluZyB1dWlkLCBAUGF0aFBhcmFtKCJhcnRpZmFjdFVVSUQiKSBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RVVUlEKSB7CisKKwkJV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJU3RyaW5nIGluc3RhbmNlSWRIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpOworCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKwkJU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0VVJJOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGFzc2V0VHlwZSk7CisJCWlmIChjb21wb25lbnRUeXBlID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlQXJ0aWZhY3Q6IGFzc2V0VHlwZSBwYXJhbWV0ZXIge30gaXMgbm90IHZhbGlkIiwgYXNzZXRUeXBlKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zID0gbmV3IEVudW1NYXA8PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSAmJiAoaW5zdGFuY2VJZEhlYWRlciA9PSBudWxsIHx8IGluc3RhbmNlSWRIZWFkZXIuaXNFbXB0eSgpKSkgeworCQkJbG9nLmRlYnVnKCJkZWxldGVBcnRpZmFjdDogTWlzc2luZyBYLUVDT01QLUluc3RhbmNlSUQgaGVhZGVyIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX1hfRUNPTVBfSU5TVEFOQ0VfSUQpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbERlbGV0ZUFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSAmJiAodXNlcklkID09IG51bGwgfHwgdXNlcklkLmlzRW1wdHkoKSkpIHsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlQXJ0aWZhY3Q6IE1pc3NpbmcgVVNFUl9JRCBoZWFkZXIiKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbERlbGV0ZUFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdHJ5IHsKKwkJCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJCQlBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c0xvZ2ljID0gZ2V0QXJ0aWZhY3RCTChjb250ZXh0KTsKKwkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gdXBsb2FkQXJ0aWZhY3RFaXRoZXIgPSBhcnRpZmFjdHNMb2dpYy5kZWxldGVBcnRpZmFjdE9uQ29tcG9uZW50QnlVVUlEKHJlcXVlc3QsIGNvbXBvbmVudFR5cGUsIHV1aWQsIGFydGlmYWN0VVVJRCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQkJaWYgKHVwbG9hZEFydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBkZWxldGUgYXJ0aWZhY3QiKTsKKwkJCQkJcmVzcG9uc2VGb3JtYXQgPSB1cGxvYWRBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxEZWxldGVBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlPYmplY3QgcmVwcmVzZW50YXRpb24gPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24odXBsb2FkQXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJCWhlYWRlcnMucHV0KENvbnN0YW50cy5NRDVfSEVBREVSLCBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeVN0cmluZygoU3RyaW5nKSByZXByZXNlbnRhdGlvbikpOworCQkJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxEZWxldGVBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVwcmVzZW50YXRpb24sIGhlYWRlcnMpKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gImZhaWxlZCB0byBkZWxldGUgYW4gYXJ0aWZhY3Qgb2YgYSByZXNvdXJjZSBvciBzZXJ2aWNlIjsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKG1lc3NhZ2UpOworCQkJCWxvZy5kZWJ1ZyhtZXNzYWdlLCBlKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCS8qKgorCSAqIGRlbGV0ZXMgYW4gYXJ0aWZhY3Qgb2YgYSByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSBhc3NldFR5cGUKKwkgKiBAcGFyYW0gdXVpZAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlTmFtZQorCSAqIEByZXR1cm4KKwkgKi8KKwlAREVMRVRFCisJQFBhdGgoInthc3NldFR5cGV9L3t1dWlkfS9yZXNvdXJjZUluc3RhbmNlcy97cmVzb3VyY2VJbnN0YW5jZU5hbWV9L2FydGlmYWN0cy97YXJ0aWZhY3RVVUlEfSIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiZGVsZXRlcyBhbiBhcnRpZmFjdCBvZiBhIHJlc291cmNlIGluc2F0bmNlIiwgaHR0cE1ldGhvZCA9ICJERUxFVEUiLCBub3RlcyA9ICJkZWxldGVzIGFuIGFydGlmYWN0IG9mIGEgcmVzb3VyY2UgaW5zYXRuY2UiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IERlbGV0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDEsIG1lc3NhZ2UgPSAiQXV0aG9yaXphdGlvbiByZXF1aXJlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQXNzZXQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlQXJ0aWZhY3RPblJlc291cmNlSW5zdGFuY2UoQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwgQFBhdGhQYXJhbSgidXVpZCIpIGZpbmFsIFN0cmluZyB1dWlkLCBAUGF0aFBhcmFtKCJyZXNvdXJjZUluc3RhbmNlTmFtZSIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSwKKwkJCUBQYXRoUGFyYW0oImFydGlmYWN0VVVJRCIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdFVVSUQpIHsKKworCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCQlTdHJpbmcgaW5zdGFuY2VJZEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5YX0VDT01QX0lOU1RBTkNFX0lEX0hFQURFUik7CisJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCQlTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3RVUkk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoYXNzZXRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJkZWxldGVBcnRpZmFjdE9uUmVzb3VyY2VJbnNhdG5jZTogYXNzZXRUeXBlIHBhcmFtZXRlciB7fSBpcyBub3QgdmFsaWQiLCBhc3NldFR5cGUpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMgPSBuZXcgRW51bU1hcDw+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpICYmIChpbnN0YW5jZUlkSGVhZGVyID09IG51bGwgfHwgaW5zdGFuY2VJZEhlYWRlci5pc0VtcHR5KCkpKSB7CisJCQlsb2cuZGVidWcoImRlbGV0ZUFydGlmYWN0T25SZXNvdXJjZUluc2F0bmNlOiBNaXNzaW5nIFgtRUNPTVAtSW5zdGFuY2VJRCBoZWFkZXIiKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsRGVsZXRlQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpICYmICh1c2VySWQgPT0gbnVsbCB8fCB1c2VySWQuaXNFbXB0eSgpKSkgeworCQkJbG9nLmRlYnVnKCJkZWxldGVBcnRpZmFjdE9uUmVzb3VyY2VJbnNhdG5jZTogTWlzc2luZyBVU0VSX0lEIGhlYWRlciIpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ09OVEFDVCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsRGVsZXRlQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtcyk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl0cnkgeworCQkJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQkJCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTG9naWMgPSBnZXRBcnRpZmFjdEJMKGNvbnRleHQpOworCQkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB1cGxvYWRBcnRpZmFjdEVpdGhlciA9IGFydGlmYWN0c0xvZ2ljLmRlbGV0ZUFydGlmYWN0T25SaUJ5VVVJRChyZXF1ZXN0LCBjb21wb25lbnRUeXBlLCB1dWlkLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgYXJ0aWZhY3RVVUlELCBhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCQlpZiAodXBsb2FkQXJ0aWZhY3RFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSBhcnRpZmFjdCIpOworCQkJCQlyZXNwb25zZUZvcm1hdCA9IHVwbG9hZEFydGlmYWN0RWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbERlbGV0ZUFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQkJCX0gZWxzZSB7CisJCQkJCU9iamVjdCByZXByZXNlbnRhdGlvbiA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbih1cGxvYWRBcnRpZmFjdEVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLk1ENV9IRUFERVIsIEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5U3RyaW5nKChTdHJpbmcpIHJlcHJlc2VudGF0aW9uKSk7CisJCQkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbERlbGV0ZUFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXByZXNlbnRhdGlvbiwgaGVhZGVycykpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiZmFpbGVkIHRvIGRlbGV0ZSBhbiBhcnRpZmFjdCBvZiBhIHJlc291cmNlIGluc3RhbmNlIjsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKG1lc3NhZ2UpOworCQkJCWxvZy5kZWJ1ZyhtZXNzYWdlLCBlKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCS8qKgorCSAqIGRvd25sb2FkcyBhbiBhcnRpZmFjdCBvZiBhIGNvbXBvbmVudCAoZWl0aGVyIGEgc2VydmljZSBvciBhIHJlc291cmNlKSBieSBhcnRpZmFjdFVVSUQKKwkgKiAKKwkgKiBAcGFyYW0gYXNzZXRUeXBlCisJICogQHBhcmFtIHV1aWQKKwkgKiBAcGFyYW0gYXJ0aWZhY3RVVUlECisJICogQHJldHVybgorCSAqLworCUBHRVQKKwlAUGF0aCgiL3thc3NldFR5cGV9L3t1dWlkfS9hcnRpZmFjdHMve2FydGlmYWN0VVVJRH0iKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRG93bmxvYWQgY29tcG9uZW50IGFydGlmYWN0IiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGRvd25sb2FkZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IGRvd25sb2FkZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDEsIG1lc3NhZ2UgPSAiQXV0aG9yaXphdGlvbiByZXF1aXJlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQXJ0aWZhY3Qgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZG93bmxvYWRDb21wb25lbnRBcnRpZmFjdCgKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSkgQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwKKwkJCUBQYXRoUGFyYW0oInV1aWQiKSBmaW5hbCBTdHJpbmcgdXVpZCwgQFBhdGhQYXJhbSgiYXJ0aWZhY3RVVUlEIikgZmluYWwgU3RyaW5nIGFydGlmYWN0VVVJRCkgeworCisJCVdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCVN0cmluZyBpbnN0YW5jZUlkSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKTsKKwkJU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0VVJJOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShhc3NldFR5cGUpOworCQlpZiAoY29tcG9uZW50VHlwZSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoImRvd25sb2FkQ29tcG9uZW50QXJ0aWZhY3Q6IGFzc2V0VHlwZSBwYXJhbWV0ZXIge30gaXMgbm90IHZhbGlkIiwgYXNzZXRUeXBlKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW0gPSBuZXcgRW51bU1hcDw+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpICYmIChpbnN0YW5jZUlkSGVhZGVyID09IG51bGwgfHwgaW5zdGFuY2VJZEhlYWRlci5pc0VtcHR5KCkpKSB7CisJCQlsb2cuZGVidWcoImRvd25sb2FkQ29tcG9uZW50QXJ0aWZhY3Q6IE1pc3NpbmcgWC1FQ09NUC1JbnN0YW5jZUlEIGhlYWRlciIpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxEb3dubG9hZEFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbSk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl0cnkgeworCQkJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQkJCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTG9naWMgPSBnZXRBcnRpZmFjdEJMKGNvbnRleHQpOworCQkJCUVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBkb3dubG9hZENvbXBvbmVudEFydGlmYWN0RWl0aGVyID0gYXJ0aWZhY3RzTG9naWMuZG93bmxvYWRDb21wb25lbnRBcnRpZmFjdEJ5VVVJRHMoY29tcG9uZW50VHlwZSwgdXVpZCwgYXJ0aWZhY3RVVUlELCBhZGRpdGlvbmFsUGFyYW0pOworCQkJCWlmIChkb3dubG9hZENvbXBvbmVudEFydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlyZXNwb25zZUZvcm1hdCA9IGRvd25sb2FkQ29tcG9uZW50QXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsRG93bmxvYWRBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW0pOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWJ5dGVbXSB2YWx1ZSA9IGRvd25sb2FkQ29tcG9uZW50QXJ0aWZhY3RFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJCUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHZhbHVlKTsKKwkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQkJCQloZWFkZXJzLnB1dChDb25zdGFudHMuTUQ1X0hFQURFUiwgR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlCeXRlQXJyYXkodmFsdWUpKTsKKwkJCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsRG93bmxvYWRBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZS5nZXRWYWx1ZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW0pOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgaXMsIGhlYWRlcnMpKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gImZhaWxlZCB0byBkb3dubG9hZCBhbiBhcnRpZmFjdCBvZiBhIHJlc291cmNlIG9yIHNlcnZpY2UiOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IobWVzc2FnZSk7CisJCQkJbG9nLmRlYnVnKG1lc3NhZ2UsIGUpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSkpOworCQkJfQorCQl9CisJCXJldHVybiByZXNwb25zZVdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCk7CisJfQorCisJLyoqCisJICogZG93bmxvYWRzIGFuIGFydGlmYWN0IG9mIGEgcmVzb3VyY2UgaW5zdGFuY2Ugb2YgYSBjb21wb25lbnQgKGVpdGhlciBhIHNlcnZpY2Ugb3IgYSByZXNvdXJjZSkgYnkgYXJ0aWZhY3RVVUlECisJICogCisJICogQHBhcmFtIGFzc2V0VHlwZQorCSAqIEBwYXJhbSB1dWlkCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VOYW1lCisJICogQHBhcmFtIGFydGlmYWN0VVVJRAorCSAqIEByZXR1cm4KKwkgKi8KKwlAR0VUCisJQFBhdGgoIi97YXNzZXRUeXBlfS97dXVpZH0vcmVzb3VyY2VJbnN0YW5jZXMve3Jlc291cmNlSW5zdGFuY2VOYW1lfS9hcnRpZmFjdHMve2FydGlmYWN0VVVJRH0iKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRG93bmxvYWQgcmVzb3VyY2UgaW5zdGFuY2UgYXJ0aWZhY3QiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgZG93bmxvYWRlZCBhcnRpZmFjdCIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXJ0aWZhY3QgZG93bmxvYWRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMSwgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uIHJlcXVpcmVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJBcnRpZmFjdCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBkb3dubG9hZFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdCgKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSkgQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwKKwkJCUBQYXRoUGFyYW0oInV1aWQiKSBmaW5hbCBTdHJpbmcgdXVpZCwgQFBhdGhQYXJhbSgicmVzb3VyY2VJbnN0YW5jZU5hbWUiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIEBQYXRoUGFyYW0oImFydGlmYWN0VVVJRCIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdFVVSUQpIHsKKworCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCQlTdHJpbmcgaW5zdGFuY2VJZEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5YX0VDT01QX0lOU1RBTkNFX0lEX0hFQURFUik7CisJCVN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdFVSSTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoYXNzZXRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJkb3dubG9hZFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdDogYXNzZXRUeXBlIHBhcmFtZXRlciB7fSBpcyBub3QgdmFsaWQiLCBhc3NldFR5cGUpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCX0KKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbSA9IG5ldyBFbnVtTWFwPD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkgJiYgKGluc3RhbmNlSWRIZWFkZXIgPT0gbnVsbCB8fCBpbnN0YW5jZUlkSGVhZGVyLmlzRW1wdHkoKSkpIHsKKwkJCWxvZy5kZWJ1ZygiZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3Q6IE1pc3NpbmcgWC1FQ09NUC1JbnN0YW5jZUlEIGhlYWRlciIpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxEb3dubG9hZEFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbSk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCkpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl0cnkgeworCQkJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQkJCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTG9naWMgPSBnZXRBcnRpZmFjdEJMKGNvbnRleHQpOworCQkJCUVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBkb3dubG9hZFJlc291cmNlQXJ0aWZhY3RFaXRoZXIgPSBhcnRpZmFjdHNMb2dpYy5kb3dubG9hZFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdEJ5VVVJRHMoY29tcG9uZW50VHlwZSwgdXVpZCwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIGFydGlmYWN0VVVJRCwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCQlpZiAoZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQlyZXNwb25zZUZvcm1hdCA9IGRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxEb3dubG9hZEFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbSk7CisJCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnl0ZVtdIHZhbHVlID0gZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0RWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJCQlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2YWx1ZSk7CisJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLk1ENV9IRUFERVIsIEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5Qnl0ZUFycmF5KHZhbHVlKSk7CisJCQkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbERvd25sb2FkQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGlzLCBoZWFkZXJzKSk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJmYWlsZWQgdG8gZG93bmxvYWQgYW4gYXJ0aWZhY3Qgb2YgYSByZXNvdXJjZSBpbnN0YW5jZSI7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcihtZXNzYWdlKTsKKwkJCQlsb2cuZGVidWcobWVzc2FnZSwgZSk7CisJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9Bc3NldE1ldGFkYXRhQ29udmVydGVyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9Bc3NldE1ldGFkYXRhQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlYWMwOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L0Fzc2V0TWV0YWRhdGFDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDM4MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLnNlcnZsZXQuRGlzdHJpYnV0aW9uQ2F0YWxvZ1NlcnZsZXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZXh0ZXJuYWxhcGkuc2VydmxldC5yZXByZXNlbnRhdGlvbi5BcnRpZmFjdE1ldGFkYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQucmVwcmVzZW50YXRpb24uQXNzZXRNZXRhZGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uLlJlc291cmNlQXNzZXREZXRhaWxlZE1ldGFkYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQucmVwcmVzZW50YXRpb24uUmVzb3VyY2VBc3NldE1ldGFkYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQucmVwcmVzZW50YXRpb24uUmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQucmVwcmVzZW50YXRpb24uU2VydmljZUFzc2V0RGV0YWlsZWRNZXRhZGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uLlNlcnZpY2VBc3NldE1ldGFkYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgiYXNzZXQtbWV0YWRhdGEtdXRpbHMiKQorcHVibGljIGNsYXNzIEFzc2V0TWV0YWRhdGFDb252ZXJ0ZXIgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEaXN0cmlidXRpb25DYXRhbG9nU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKworCS8qCisJICogUmVsYXRpdmUgYXNzZXTigJlzIFVSTC4gU2hvdWxkIGJlIHVzZWQgaW4gUkVTVCBHRVQgQVBJIHRvIGRvd25sb2FkIHRoZSBhc3NldOKAmXMgQ1NBUi4gaHR0cHM6Ly97c2VydmVyQmFzZVVSTH0ve2NzYXJQYXRofSBjYW4gYmUgb2J0YWluZWQgZnJvbSAoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpCisJICovCisJcHVibGljIEVpdGhlcjxMaXN0PD8gZXh0ZW5kcyBBc3NldE1ldGFkYXRhPiwgUmVzcG9uc2VGb3JtYXQ+IGNvbnZlcnRUb0Fzc2V0TWV0YWRhdGEoTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50PiBjb21wb25lbnRMaXN0LCBTdHJpbmcgc2VydmVyQmFzZVVSTCwgYm9vbGVhbiBkZXRhaWxlZCkgeworCQlpZiAoY29tcG9uZW50TGlzdCA9PSBudWxsIHx8IGNvbXBvbmVudExpc3QuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IExpbmtlZExpc3Q8PigpKTsKKwkJfQorCisJCUxpc3Q8QXNzZXRNZXRhZGF0YT4gcmV0UmVzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKwkJQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbXBvbmVudExpc3QuaXRlcmF0b3IoKS5uZXh0KCk7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOworCisJCWZvciAoQ29tcG9uZW50IGN1cnIgOiBjb21wb25lbnRMaXN0KSB7CisKKwkJCUVpdGhlcjw/IGV4dGVuZHMgQXNzZXRNZXRhZGF0YSwgUmVzcG9uc2VGb3JtYXQ+IHJlc01ldGFEYXRhID0gY29udmVydFRvTWV0YWRhdGEoY29tcG9uZW50VHlwZSwgc2VydmVyQmFzZVVSTCwgZGV0YWlsZWQsIGN1cnIpOworCisJCQlpZiAocmVzTWV0YURhdGEuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNNZXRhRGF0YS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlyZXRSZXNMaXN0LmFkZChyZXNNZXRhRGF0YS5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmV0UmVzTGlzdCk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjw/IGV4dGVuZHMgQXNzZXRNZXRhZGF0YSwgUmVzcG9uc2VGb3JtYXQ+IGNvbnZlcnRUb01ldGFkYXRhKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBzZXJ2ZXJCYXNlVVJMLCBib29sZWFuIGRldGFpbGVkLCBDb21wb25lbnQgY3VycikgeworCisJCXN3aXRjaCAoY29tcG9uZW50VHlwZSkgeworCisJCWNhc2UgUkVTT1VSQ0U6CisKKwkJCXJldHVybiBnZW5lcmF0ZVJlc291cmNlTWVhdGRhdGEoc2VydmVyQmFzZVVSTCwgZGV0YWlsZWQsIGN1cnIpOworCisJCWNhc2UgU0VSVklDRToKKworCQkJcmV0dXJuIGdlbmVyYXRlU2VydmljZU1ldGFkYXRhKHNlcnZlckJhc2VVUkwsIGRldGFpbGVkLCBjdXJyKTsKKworCQkvLyBGb3IgZnV0dXJlIFVTJ3MgdGhhdCBpbmNsdWRlIHByb2R1Y3QKKwkJLyoKKwkJICogY2FzZSBQUk9EVUNUOiBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgUHJvZHVjdCkgeyBMaXN0PFByb2R1Y3RBc3NldE1ldGFkYXRhPiByZXRSZXNMaXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOyBmb3IgKENvbXBvbmVudCBjdXJyIDogY29tcG9uZW50TGlzdCkgeyByZXRSZXNMaXN0LmFkZChjb252ZXJ0VG9Qcm9kdWN0QXNzZXRNZXRhZGF0YSgoUHJvZHVjdCkgY3Vyciwgc2VydmVyQmFzZVVSTCkpOyB9IHJldHVybgorCQkgKiBFaXRoZXIubGVmdChyZXRSZXNMaXN0KTsKKwkJICovCisJCWRlZmF1bHQ6CisKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QWRkaXRpb25hbFByb3BlcnR5KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPD8gZXh0ZW5kcyBBc3NldE1ldGFkYXRhLCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdGVSZXNvdXJjZU1lYXRkYXRhKFN0cmluZyBzZXJ2ZXJCYXNlVVJMLCBib29sZWFuIGRldGFpbGVkLCBDb21wb25lbnQgY3VycikgeworCQlBc3NldE1ldGFkYXRhIG1ldGFEYXRhOworCQltZXRhRGF0YSA9IGNyZWF0ZU1ldGFkYU9iamVjdChkZXRhaWxlZCwgY3Vyci5nZXRDb21wb25lbnRUeXBlKCkpOworCQltZXRhRGF0YSA9IGNvbnZlcnRUb1Jlc291cmNlTWV0YWRhdGEoKFJlc291cmNlQXNzZXRNZXRhZGF0YSkgbWV0YURhdGEsIChSZXNvdXJjZSkgY3Vyciwgc2VydmVyQmFzZVVSTCwgZGV0YWlsZWQpOworCisJCWlmIChkZXRhaWxlZCkgeworCQkJRWl0aGVyPFJlc291cmNlQXNzZXREZXRhaWxlZE1ldGFkYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb252ZXJ0ZWQgPSBjb252ZXJ0VG9SZXNvdXJjZURldGFpbGVkTWV0YWRhdGEoKFJlc291cmNlQXNzZXREZXRhaWxlZE1ldGFkYXRhKSBtZXRhRGF0YSwgKFJlc291cmNlKSBjdXJyLCBzZXJ2ZXJCYXNlVVJMKTsKKwkJCWlmIChjb252ZXJ0ZWQuaXNSaWdodCgpKSB7CisJCQkJQWN0aW9uU3RhdHVzIHN0b3JhZ2VSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShjb252ZXJ0ZWQucmlnaHQoKS52YWx1ZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoc3RvcmFnZVJlc3BvbnNlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChtZXRhRGF0YSk7CisJfQorCisJcHJpdmF0ZSBBc3NldE1ldGFkYXRhIGNyZWF0ZU1ldGFkYU9iamVjdChib29sZWFuIGRldGFpbGVkLCBDb21wb25lbnRUeXBlRW51bSB0eXBlKSB7CisJCUFzc2V0TWV0YWRhdGEgbWV0YURhdGEgPSBudWxsOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBTRVJWSUNFOgorCQkJaWYgKCFkZXRhaWxlZCkgeworCQkJCW1ldGFEYXRhID0gbmV3IFNlcnZpY2VBc3NldE1ldGFkYXRhKCk7CisJCQl9IGVsc2UgeworCQkJCW1ldGFEYXRhID0gbmV3IFNlcnZpY2VBc3NldERldGFpbGVkTWV0YWRhdGEoKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFU09VUkNFOgorCQkJaWYgKCFkZXRhaWxlZCkgeworCQkJCW1ldGFEYXRhID0gbmV3IFJlc291cmNlQXNzZXRNZXRhZGF0YSgpOworCQkJfSBlbHNlIHsKKwkJCQltZXRhRGF0YSA9IG5ldyBSZXNvdXJjZUFzc2V0RGV0YWlsZWRNZXRhZGF0YSgpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gbWV0YURhdGE7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8PyBleHRlbmRzIEFzc2V0TWV0YWRhdGEsIFJlc3BvbnNlRm9ybWF0PiBnZW5lcmF0ZVNlcnZpY2VNZXRhZGF0YShTdHJpbmcgc2VydmVyQmFzZVVSTCwgYm9vbGVhbiBkZXRhaWxlZCwgQ29tcG9uZW50IGN1cnIpIHsKKwkJQXNzZXRNZXRhZGF0YSBtZXRhRGF0YSA9IGNyZWF0ZU1ldGFkYU9iamVjdChkZXRhaWxlZCwgY3Vyci5nZXRDb21wb25lbnRUeXBlKCkpOworCisJCW1ldGFEYXRhID0gY29udmVydFRvU2VydmljZUFzc2V0TWV0YWRhdGEoKFNlcnZpY2VBc3NldE1ldGFkYXRhKSBtZXRhRGF0YSwgKFNlcnZpY2UpIGN1cnIsIHNlcnZlckJhc2VVUkwsIGRldGFpbGVkKTsKKworCQlpZiAoZGV0YWlsZWQpIHsKKwkJCUVpdGhlcjxTZXJ2aWNlQXNzZXREZXRhaWxlZE1ldGFkYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb252ZXJ0ZWQgPSBjb252ZXJ0VG9TZXJ2aWNlRGV0YWlsZWRNZXRhZGF0YSgoU2VydmljZUFzc2V0RGV0YWlsZWRNZXRhZGF0YSkgbWV0YURhdGEsIChTZXJ2aWNlKSBjdXJyLCBzZXJ2ZXJCYXNlVVJMKTsKKwkJCWlmIChjb252ZXJ0ZWQuaXNSaWdodCgpKSB7CisJCQkJQWN0aW9uU3RhdHVzIHN0b3JhZ2VSZXNwb25zZSA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShjb252ZXJ0ZWQucmlnaHQoKS52YWx1ZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoc3RvcmFnZVJlc3BvbnNlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChtZXRhRGF0YSk7CisJfQorCisJcHJpdmF0ZSA8VSBleHRlbmRzIEFzc2V0TWV0YWRhdGEsIFQgZXh0ZW5kcyBDb21wb25lbnQ+IFUgY29udmVydFRvQXNzZXQoVSBhc3NldCwgVCBjb21wb25lbnQsIFN0cmluZyBzZXJ2ZXJCYXNlVVJMLCBib29sZWFuIGRldGFpbGVkKSB7CisJCWFzc2V0LnNldFV1aWQoY29tcG9uZW50LmdldFVVSUQoKSk7CisJCWFzc2V0LnNldEludmFyaWFudFVVSUQoY29tcG9uZW50LmdldEludmFyaWFudFVVSUQoKSk7CisJCWFzc2V0LnNldE5hbWUoY29tcG9uZW50LmdldE5hbWUoKSk7CisJCWFzc2V0LnNldFZlcnNpb24oY29tcG9uZW50LmdldFZlcnNpb24oKSk7CisJCWlmICghZGV0YWlsZWQpIHsKKwkJCWFzc2V0LnNldFRvc2NhTW9kZWxVUkwoc2VydmVyQmFzZVVSTCArICIvIiArIGNvbXBvbmVudC5nZXRVVUlEKCkgKyAiL3Rvc2NhTW9kZWwiKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyB0b3NjYU1vZGVsVXJsID0gKG5ldyBTdHJpbmcoc2VydmVyQmFzZVVSTCkpLnJlcGxhY2UoIm1ldGFkYXRhIiwgInRvc2NhTW9kZWwiKTsKKwkJCWFzc2V0LnNldFRvc2NhTW9kZWxVUkwodG9zY2FNb2RlbFVybCk7CisJCX0KKworCQlyZXR1cm4gYXNzZXQ7CisJfQorCisJcHJpdmF0ZSA8VCBleHRlbmRzIFJlc291cmNlQXNzZXRNZXRhZGF0YT4gVCBjb252ZXJ0VG9SZXNvdXJjZU1ldGFkYXRhKFQgYXNzZXRUb1BvcHVsYXRlLCBSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHNlcnZlckJhc2VVUkwsIGJvb2xlYW4gZGV0YWlsZWQpIHsKKwkJYXNzZXRUb1BvcHVsYXRlID0gY29udmVydFRvQXNzZXQoYXNzZXRUb1BvcHVsYXRlLCByZXNvdXJjZSwgc2VydmVyQmFzZVVSTCwgZGV0YWlsZWQpOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uID0gcmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOworCQlhc3NldFRvUG9wdWxhdGUuc2V0Q2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKSk7CisKKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IGNhdGVnb3J5RGVmaW5pdGlvbi5nZXRTdWJjYXRlZ29yaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKwkJYXNzZXRUb1BvcHVsYXRlLnNldFN1YkNhdGVnb3J5KHN1YkNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlhc3NldFRvUG9wdWxhdGUuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpLm5hbWUoKSk7CisJCWFzc2V0VG9Qb3B1bGF0ZS5zZXRMaWZlY3ljbGVTdGF0ZShyZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLm5hbWUoKSk7CisJCWFzc2V0VG9Qb3B1bGF0ZS5zZXRMYXN0VXBkYXRlclVzZXJJZChyZXNvdXJjZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKworCQlyZXR1cm4gKFQpIGFzc2V0VG9Qb3B1bGF0ZTsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgU2VydmljZUFzc2V0TWV0YWRhdGE+IFQgY29udmVydFRvU2VydmljZUFzc2V0TWV0YWRhdGEoVCBhc3NldFRvUG9wdWxhdGUsIFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHNlcnZlckJhc2VVUkwsIGJvb2xlYW4gZGV0YWlsZWQpIHsKKwkJYXNzZXRUb1BvcHVsYXRlID0gY29udmVydFRvQXNzZXQoYXNzZXRUb1BvcHVsYXRlLCBzZXJ2aWNlLCBzZXJ2ZXJCYXNlVVJMLCBkZXRhaWxlZCk7CisKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiA9IHNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisJCWFzc2V0VG9Qb3B1bGF0ZS5zZXRDYXRlZ29yeShjYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJYXNzZXRUb1BvcHVsYXRlLnNldExpZmVjeWNsZVN0YXRlKHNlcnZpY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKS5uYW1lKCkpOworCQlhc3NldFRvUG9wdWxhdGUuc2V0TGFzdFVwZGF0ZXJVc2VySWQoc2VydmljZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkJYXNzZXRUb1BvcHVsYXRlLnNldERpc3RyaWJ1dGlvblN0YXR1cyhzZXJ2aWNlLmdldERpc3RyaWJ1dGlvblN0YXR1cygpLm5hbWUoKSk7CisKKwkJcmV0dXJuIChUKSBhc3NldFRvUG9wdWxhdGU7CisJfQorCisJcHJpdmF0ZSA8VCBleHRlbmRzIFJlc291cmNlQXNzZXREZXRhaWxlZE1ldGFkYXRhPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29udmVydFRvUmVzb3VyY2VEZXRhaWxlZE1ldGFkYXRhKFQgYXNzZXRUb1BvcHVsYXRlLCBSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHNlcnZlckJhc2VVUkwpIHsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSByZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKworCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzICE9IG51bGwpIHsKKwkJCUVpdGhlcjxMaXN0PFJlc291cmNlSW5zdGFuY2VNZXRhZGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlSW5zdGFuY2VNZXRhZGF0YSA9IGNvbnZlcnRUb1Jlc291cmNlSW5zdGFuY2VNZXRhZGF0YShjb21wb25lbnRJbnN0YW5jZXMsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUsIHJlc291cmNlLmdldFVVSUQoKSk7CisJCQlpZiAocmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCWFzc2V0VG9Qb3B1bGF0ZS5zZXRSZXNvdXJjZXMocmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHJlc291cmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJYXNzZXRUb1BvcHVsYXRlID0gcG9wdWxhdGVSZXNvdXJjZVdpdGhBcnRpZmFjdHMoYXNzZXRUb1BvcHVsYXRlLCByZXNvdXJjZSwgc2VydmVyQmFzZVVSTCwgZGVwbG95bWVudEFydGlmYWN0cyk7CisKKwkJYXNzZXRUb1BvcHVsYXRlLnNldExhc3RVcGRhdGVyRnVsbE5hbWUocmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpKTsKKwkJYXNzZXRUb1BvcHVsYXRlLnNldFRvc2NhUmVzb3VyY2VOYW1lKHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCisJCXJldHVybiBFaXRoZXIubGVmdChhc3NldFRvUG9wdWxhdGUpOworCX0KKworCXByaXZhdGUgPFQgZXh0ZW5kcyBTZXJ2aWNlQXNzZXREZXRhaWxlZE1ldGFkYXRhPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29udmVydFRvU2VydmljZURldGFpbGVkTWV0YWRhdGEoVCBhc3NldFRvUG9wdWxhdGUsIFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHNlcnZlckJhc2VVUkwpIHsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBzZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpOworCisJCWlmIChjb21wb25lbnRJbnN0YW5jZXMgIT0gbnVsbCkgeworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhID0gY29udmVydFRvUmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhKGNvbXBvbmVudEluc3RhbmNlcywgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FLCBzZXJ2aWNlLmdldFVVSUQoKSk7CisJCQlpZiAocmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCWFzc2V0VG9Qb3B1bGF0ZS5zZXRSZXNvdXJjZXMocmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IHNlcnZpY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlhc3NldFRvUG9wdWxhdGUgPSBwb3B1bGF0ZVNlcnZpY2VXaXRoQXJ0aWZhY3RzKGFzc2V0VG9Qb3B1bGF0ZSwgc2VydmljZSwgZGVwbG95bWVudEFydGlmYWN0cyk7CisKKwkJYXNzZXRUb1BvcHVsYXRlLnNldExhc3RVcGRhdGVyRnVsbE5hbWUoc2VydmljZS5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkpOworCisJCXJldHVybiBFaXRoZXIubGVmdChhc3NldFRvUG9wdWxhdGUpOworCX0KKworCXByaXZhdGUgPFQgZXh0ZW5kcyBSZXNvdXJjZUFzc2V0RGV0YWlsZWRNZXRhZGF0YT4gVCBwb3B1bGF0ZVJlc291cmNlV2l0aEFydGlmYWN0cyhUIGFzc2V0LCBSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHNlcnZlckJhc2VVUkwsIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzKSB7CisKKwkJTGlzdDxBcnRpZmFjdE1ldGFkYXRhPiBhcnRpZmFjdE1ldGFMaXN0ID0gcG9wdWxhdGVBc3NldFdpdGhBcnRpZmFjdHMocmVzb3VyY2UsIGFydGlmYWN0cyk7CisKKwkJYXNzZXQuc2V0QXJ0aWZhY3RzKGFydGlmYWN0TWV0YUxpc3QpOworCisJCXJldHVybiBhc3NldDsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgU2VydmljZUFzc2V0RGV0YWlsZWRNZXRhZGF0YT4gVCBwb3B1bGF0ZVNlcnZpY2VXaXRoQXJ0aWZhY3RzKFQgYXNzZXQsIFNlcnZpY2Ugc2VydmljZSwgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMpIHsKKworCQlMaXN0PEFydGlmYWN0TWV0YWRhdGE+IGFydGlmYWN0TWV0YUxpc3QgPSBwb3B1bGF0ZUFzc2V0V2l0aEFydGlmYWN0cyhzZXJ2aWNlLCBhcnRpZmFjdHMpOworCisJCWFzc2V0LnNldEFydGlmYWN0cyhhcnRpZmFjdE1ldGFMaXN0KTsKKworCQlyZXR1cm4gYXNzZXQ7CisJfQorCisJcHJpdmF0ZSBMaXN0PEFydGlmYWN0TWV0YWRhdGE+IHBvcHVsYXRlQXNzZXRXaXRoQXJ0aWZhY3RzKENvbXBvbmVudCBjb21wb25lbnQsIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzKSB7CisJCUxpc3Q8QXJ0aWZhY3RNZXRhZGF0YT4gYXJ0aWZhY3RNZXRhTGlzdCA9IG51bGw7CisJCWlmIChhcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJYXJ0aWZhY3RNZXRhTGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKwkJCUNvbGxlY3Rpb248QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRlZmFjdERlZkxpc3QgPSBhcnRpZmFjdHMudmFsdWVzKCk7CisKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IGFydGVmYWN0RGVmTGlzdCkgeworCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0RXNJZCgpICE9IG51bGwgJiYgIWFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCkuaXNFbXB0eSgpKSB7CisJCQkJCUFydGlmYWN0TWV0YWRhdGEgY29udmVydGVkQXJ0aWZhY3RNZXRhZGF0YSA9IGNvbnZlcnRUb0FydGlmYWN0TWV0YWRhdGEoYXJ0aWZhY3REZWZpbml0aW9uLCBDb21wb25lbnRUeXBlRW51bS5maW5kUGFyYW1CeVR5cGUoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSksIGNvbXBvbmVudC5nZXRVVUlEKCksIG51bGwpOworCQkJCQlhcnRpZmFjdE1ldGFMaXN0LmFkZChjb252ZXJ0ZWRBcnRpZmFjdE1ldGFkYXRhKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGFydGlmYWN0TWV0YUxpc3QuaXNFbXB0eSgpID8gbnVsbCA6IGFydGlmYWN0TWV0YUxpc3Q7CisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdE1ldGFkYXRhIGNvbnZlcnRUb0FydGlmYWN0TWV0YWRhdGEoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0LCBTdHJpbmcgY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFVVSUQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSkgeworCQkvLyAvYXNkYy92MS9jYXRhbG9nL3tzZXJ2aWNlcy9yZXNvdXJjZXN9L3tjb21wb25lbnRVVUlEfS9hcnRpZmFjdHMve2FydGlmYWN0VVVJRH0KKwkJZmluYWwgU3RyaW5nIENPTVBPTkVOVF9BUlRJRkFDVF9VUkwgPSAiL2FzZGMvdjEvY2F0YWxvZy8lcy8lcy9hcnRpZmFjdHMvJXMiOworCisJCS8vIC9hc2RjL3YxL2NhdGFsb2cve3NlcnZpY2VzL3Jlc291cmNlc30ve2NvbXBvbmVudFVVSUR9L3Jlc291cmNlSW5zdGFuY2VzL3tyZXNvdXJjZUluc3RhbmNlTmFtZX0vYXJ0aWZhY3RzL3thcnRpZmFjdFVVSUR9CisJCWZpbmFsIFN0cmluZyBSRVNPVVJDRV9JTlNUQU5DRV9BUlRJRkFDVF9VUkwgPSAiL2FzZGMvdjEvY2F0YWxvZy8lcy8lcy9yZXNvdXJjZUluc3RhbmNlcy8lcy9hcnRpZmFjdHMvJXMiOworCisJCUFydGlmYWN0TWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgQXJ0aWZhY3RNZXRhZGF0YSgpOworCisJCW1ldGFkYXRhLnNldEFydGlmYWN0TmFtZShhcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCW1ldGFkYXRhLnNldEFydGlmYWN0VHlwZShhcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKSk7CisKKwkJaWYgKHJlc291cmNlSW5zdGFuY2VOYW1lID09IG51bGwgfHwgcmVzb3VyY2VJbnN0YW5jZU5hbWUuaXNFbXB0eSgpKSB7CisJCQltZXRhZGF0YS5zZXRBcnRpZmFjdFVSTChTdHJpbmcuZm9ybWF0KENPTVBPTkVOVF9BUlRJRkFDVF9VUkwsIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFVVSUQsIGFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpKSk7CisJCX0gZWxzZSB7CisJCQltZXRhZGF0YS5zZXRBcnRpZmFjdFVSTChTdHJpbmcuZm9ybWF0KFJFU09VUkNFX0lOU1RBTkNFX0FSVElGQUNUX1VSTCwgY29tcG9uZW50VHlwZSwgY29tcG9uZW50VVVJRCwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIGFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpKSk7CisJCX0KKworCQltZXRhZGF0YS5zZXRBcnRpZmFjdERlc2NyaXB0aW9uKGFydGlmYWN0LmdldERlc2NyaXB0aW9uKCkpOworCQltZXRhZGF0YS5zZXRBcnRpZmFjdFRpbWVvdXQoYXJ0aWZhY3QuZ2V0VGltZW91dCgpID4gMCA/IGFydGlmYWN0LmdldFRpbWVvdXQoKSA6IG51bGwpOworCQltZXRhZGF0YS5zZXRBcnRpZmFjdENoZWNrc3VtKGFydGlmYWN0LmdldEFydGlmYWN0Q2hlY2tzdW0oKSk7CisJCW1ldGFkYXRhLnNldEFydGlmYWN0VVVJRChhcnRpZmFjdC5nZXRBcnRpZmFjdFVVSUQoKSk7CisJCW1ldGFkYXRhLnNldEFydGlmYWN0VmVyc2lvbihhcnRpZmFjdC5nZXRBcnRpZmFjdFZlcnNpb24oKSk7CisJCW1ldGFkYXRhLnNldEdlbmVyYXRlZEZyb21VVUlEKGFydGlmYWN0LmdldEdlbmVyYXRlZEZyb21JZCgpKTsKKworCQlyZXR1cm4gbWV0YWRhdGE7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxSZXNvdXJjZUluc3RhbmNlTWV0YWRhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb252ZXJ0VG9SZXNvdXJjZUluc3RhbmNlTWV0YWRhdGEoTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzLCBTdHJpbmcgY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudFVVSUQpIHsKKwkJTGlzdDxSZXNvdXJjZUluc3RhbmNlTWV0YWRhdGE+IHJldExpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gdXVpZER1cGxpY2F0ZXNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA6IGNvbXBvbmVudEluc3RhbmNlcykgeworCQkJUmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IFJlc291cmNlSW5zdGFuY2VNZXRhZGF0YSgpOworCQkJU3RyaW5nIGNvbXBvbmVudFVpZCA9IGNvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpOworCQkJU3RyaW5nIGludmFyaWFudFVVSUQ7CisKKwkJCWlmICghdXVpZER1cGxpY2F0ZXNNYXAuY29udGFpbnNLZXkoY29tcG9uZW50VWlkKSkgeworCQkJCUVpdGhlcjxTdHJpbmcsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEludmFyVXVpZHJlc3BvbnNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0SW52YXJpYW50VVVJRChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGNvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpLCBmYWxzZSk7CisJCQkJaWYgKGdldEludmFyVXVpZHJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImNvbnZlcnRUb1Jlc291cmNlSW5zdGFuY2VNZXRhZGF0YTogRmFpbGVkIGdldHRpbmcgSW52YXJpYW50IFVVSUQiKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChnZXRJbnZhclV1aWRyZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWludmFyaWFudFVVSUQgPSBnZXRJbnZhclV1aWRyZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJdXVpZER1cGxpY2F0ZXNNYXAucHV0KGNvbXBvbmVudFVpZCwgaW52YXJpYW50VVVJRCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpbnZhcmlhbnRVVUlEID0gdXVpZER1cGxpY2F0ZXNNYXAuZ2V0KGNvbXBvbmVudFVpZCk7CisJCQl9CisKKwkJCW1ldGFkYXRhLnNldFJlc291cmNlSW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKwkJCW1ldGFkYXRhLnNldFJlc291cmNlSW5zdGFuY2VOYW1lKGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJCQltZXRhZGF0YS5zZXRSZXNvdXJjZU5hbWUoY29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50TmFtZSgpKTsKKwkJCW1ldGFkYXRhLnNldFJlc291cmNlVmVyc2lvbihjb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRWZXJzaW9uKCkpOworCQkJbWV0YWRhdGEuc2V0UmVzb3VjcmVUeXBlKGNvbXBvbmVudEluc3RhbmNlLmdldE9yaWdpblR5cGUoKS5nZXRWYWx1ZSgpKTsKKwkJCW1ldGFkYXRhLnNldFJlc291cmNlVVVJRChjb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKSk7CisKKwkJCUNvbGxlY3Rpb248QXJ0aWZhY3REZWZpbml0aW9uPiB2YWx1ZXMgPSBjb21wb25lbnRJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkudmFsdWVzKCk7CisJCQlMaW5rZWRMaXN0PEFydGlmYWN0TWV0YWRhdGE+IGFydGlmYWN0TWV0YUxpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IHZhbHVlcykgeworCQkJCUFydGlmYWN0TWV0YWRhdGEgY29udmVydGVkID0gY29udmVydFRvQXJ0aWZhY3RNZXRhZGF0YShhcnRpZmFjdERlZmluaXRpb24sIGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFVVSUQsIGNvbXBvbmVudEluc3RhbmNlLmdldE5vcm1hbGl6ZWROYW1lKCkpOworCQkJCWFydGlmYWN0TWV0YUxpc3QuYWRkKGNvbnZlcnRlZCk7CisJCQl9CisKKwkJCW1ldGFkYXRhLnNldEFydGlmYWN0cyhhcnRpZmFjdE1ldGFMaXN0KTsKKworCQkJcmV0TGlzdC5hZGQobWV0YWRhdGEpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJldExpc3QpOworCX0KKworCS8vIEZvciBmdXR1cmUgVVMgdG8gc3VwcG9ydCBQcm9kdWN0CisJLyoKKwkgKiBwcml2YXRlIFByb2R1Y3RBc3NldE1ldGFkYXRhIGNvbnZlcnRUb1Byb2R1Y3RBc3NldE1ldGFkYXRhKFByb2R1Y3QgcHJvZHVjdCwgU3RyaW5nIHNlcnZlckJhc2VVUkwpIHsgUHJvZHVjdEFzc2V0TWV0YWRhdGEgcmV0UHJvZEFzc2V0ID0gbmV3IFByb2R1Y3RBc3NldE1ldGFkYXRhKCk7CisJICogCisJICogcmV0UHJvZEFzc2V0ID0gY29udmVydFRvQXNzZXQocmV0UHJvZEFzc2V0LCBwcm9kdWN0LCBzZXJ2ZXJCYXNlVVJMKTsgcmV0UHJvZEFzc2V0LnNldExpZmVjeWNsZVN0YXRlKHByb2R1Y3QuZ2V0TGlmZWN5Y2xlU3RhdGUoKS5uYW1lKCkpOyByZXRQcm9kQXNzZXQuc2V0TGFzdFVwZGF0ZXJVc2VySWQocHJvZHVjdC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkgKiByZXRQcm9kQXNzZXQuc2V0QWN0aXZlKHByb2R1Y3QuZ2V0SXNBY3RpdmUoKSk7IHJldFByb2RBc3NldC5zZXRDb250YWN0cyhwcm9kdWN0LmdldENvbnRhY3RzKCkpOworCSAqIAorCSAqIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gcHJvZHVjdC5nZXRDYXRlZ29yaWVzKCk7IExpc3Q8UHJvZHVjdENhdGVnb3J5R3JvdXBNZXRhZGF0YT4gY2F0ZWdvcnlNZXRhZGF0YUxpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisJICogCisJICogaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCB8fCBjYXRlZ29yaWVzLmlzRW1wdHkoKSkgeyByZXR1cm4gcmV0UHJvZEFzc2V0OyB9IGVsc2UgeyBmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24gOiBjYXRlZ29yaWVzKSB7IFN0cmluZyBjYXRlZ29yeU5hbWUgPSBjYXRlZ29yeURlZmluaXRpb24uZ2V0TmFtZSgpOyBMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gc3ViY2F0ZWdvcmllcyA9CisJICogY2F0ZWdvcnlEZWZpbml0aW9uLmdldFN1YmNhdGVnb3JpZXMoKTsgZm9yIChTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEZWZpbml0aW9uIDogc3ViY2F0ZWdvcmllcykgeyBTdHJpbmcgc3ViQ2F0ZWdvcnlOYW1lID0gc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKTsgTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcyA9IHByb2R1Y3QuZ2V0R3JvdXBzKCk7IGZvciAoR3JvdXBEZWZpbml0aW9uCisJICogZ3JvdXBEZWZpbml0aW9uIDogZ3JvdXBzKSB7IFN0cmluZyBncm91cE5hbWUgPSBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpOyBjYXRlZ29yeU1ldGFkYXRhTGlzdC5hZGQobmV3IFByb2R1Y3RDYXRlZ29yeUdyb3VwTWV0YWRhdGEoY2F0ZWdvcnlOYW1lLCBzdWJDYXRlZ29yeU5hbWUsIGdyb3VwTmFtZSkpOyB9IH0gfSByZXRQcm9kQXNzZXQuc2V0UHJvZHVjdEdyb3VwaW5ncyhjYXRlZ29yeU1ldGFkYXRhTGlzdCk7CisJICogcmV0dXJuIHJldFByb2RBc3NldDsgfSB9CisJICovCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9Bc3NldHNEYXRhU2VydmxldC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvQXNzZXRzRGF0YVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhkNmZkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvQXNzZXRzRGF0YVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLk5hbWVWYWx1ZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkVsZW1lbnRCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuRmlsdGVyS2V5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uLkFzc2V0TWV0YWRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzLkJlR2VuZXJpY1NlcnZsZXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuUmVwcmVzZW50YXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdlbmVyYWxVdGlsaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi92MS9jYXRhbG9nIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBBc3NldHNEYXRhU2VydmxldCBleHRlbmRzIEJlR2VuZXJpY1NlcnZsZXQgeworCisJQENvbnRleHQKKwlwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisJcHJpdmF0ZSBBc3NldE1ldGFkYXRhQ29udmVydGVyIGFzc2V0TWV0YWRhdGFVdGlsczsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXNzZXRzRGF0YVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBHRVQKKwlAUGF0aCgiL3thc3NldFR5cGV9IikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJGZXRjaCBsaXN0IG9mIGFzc2V0cyIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyBsaXN0IG9mIGFzc2V0cyIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXNzZXRzIEZldGNoZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAxLCBtZXNzYWdlID0gIkF1dGhvcml6YXRpb24gcmVxdWlyZWQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIkFzc2V0IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldEFzc2V0TGlzdChAUGF0aFBhcmFtKCJhc3NldFR5cGUiKSBmaW5hbCBTdHJpbmcgYXNzZXRUeXBlLCBAUXVlcnlQYXJhbSgiY2F0ZWdvcnkiKSBTdHJpbmcgY2F0ZWdvcnksIEBRdWVyeVBhcmFtKCJzdWJDYXRlZ29yeSIpIFN0cmluZyBzdWJDYXRlZ29yeSwgQFF1ZXJ5UGFyYW0oImRpc3RyaWJ1dGlvblN0YXR1cyIpIFN0cmluZyBkaXN0cmlidXRpb25TdGF0dXMpIHsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbnVsbDsKKwkJU3RyaW5nIGluc3RhbmNlSWRIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpOworCQlTdHJpbmcgcXVlcnkgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisJCVN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdFVSSTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVN0cmluZyBzZXJ2ZXJCYXNlVVJMID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsKKworCQlBdWRpdGluZ0FjdGlvbkVudW0gYXVkaXRpbmdBY3Rpb25FbnVtID0gcXVlcnkgPT0gbnVsbCA/IEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfQVNTRVRfTElTVCA6IEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfRklMVEVSRURfQVNTRVRfTElTVDsKKworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwgaW5zdGFuY2VJZEhlYWRlcik7CisJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUkVTT1VSQ0VfVVJMLCBxdWVyeSA9PSBudWxsID8gcmVxdWVzdFVSSSA6IHJlcXVlc3RVUkkgKyAiPyIgKyBxdWVyeSk7CisKKwkJLy8gTWFuZGF0b3J5CisJCWlmIChpbnN0YW5jZUlkSGVhZGVyID09IG51bGwgfHwgaW5zdGFuY2VJZEhlYWRlci5pc0VtcHR5KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZ2V0QXNzZXRMaXN0OiBNaXNzaW5nIFgtRUNPTVAtSW5zdGFuY2VJRCBoZWFkZXIiKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsR2V0QXNzZXQocmVzcG9uc2VGb3JtYXQsIGF1ZGl0aW5nQWN0aW9uRW51bSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJdHJ5IHsKKwkJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQkJRWxlbWVudEJ1c2luZXNzTG9naWMgZWxlbWVudExvZ2ljID0gZ2V0RWxlbWVudEJMKGNvbnRleHQpOworCisJCQlnZXRBc3NldFV0aWxzKGNvbnRleHQpOworCQkJTWFwPEZpbHRlcktleUVudW0sIFN0cmluZz4gZmlsdGVycyA9IG5ldyBIYXNoTWFwPEZpbHRlcktleUVudW0sIFN0cmluZz4oKTsKKworCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKKwkJCQlmaWx0ZXJzLnB1dChGaWx0ZXJLZXlFbnVtLkNBVEVHT1JZLCBjYXRlZ29yeSk7CisJCQl9CisJCQlpZiAoc3ViQ2F0ZWdvcnkgIT0gbnVsbCkgeworCQkJCWZpbHRlcnMucHV0KEZpbHRlcktleUVudW0uU1VCX0NBVEVHT1JZLCBzdWJDYXRlZ29yeSk7CisJCQl9CisJCQlpZiAoZGlzdHJpYnV0aW9uU3RhdHVzICE9IG51bGwpIHsKKwkJCQlmaWx0ZXJzLnB1dChGaWx0ZXJLZXlFbnVtLkRJU1RSSUJVVElPTl9TVEFUVVMsIGRpc3RyaWJ1dGlvblN0YXR1cyk7CisJCQl9CisKKwkJCUVpdGhlcjxMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+LCBSZXNwb25zZUZvcm1hdD4gYXNzZXRUeXBlRGF0YSA9IGVsZW1lbnRMb2dpYy5nZXRGaWx0ZXJlZENhdGFsb2dDb21wb25lbnRzKGFzc2V0VHlwZSwgZmlsdGVycywgcXVlcnkpOworCisJCQlpZiAoYXNzZXRUeXBlRGF0YS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImdldEFzc2V0TGlzdDogQXNzZXQgRmV0Y2hpbmcgRmFpbGVkIik7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBhc3NldFR5cGVEYXRhLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdEV4dGVybmFsR2V0QXNzZXQocmVzcG9uc2VGb3JtYXQsIGF1ZGl0aW5nQWN0aW9uRW51bSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJnZXRBc3NldExpc3Q6IEFzc2V0IEZldGNoaW5nIFN1Y2Nlc3MiKTsKKwkJCQlFaXRoZXI8TGlzdDw/IGV4dGVuZHMgQXNzZXRNZXRhZGF0YT4sIFJlc3BvbnNlRm9ybWF0PiByZXNNZXRhZGF0YSA9IGFzc2V0TWV0YWRhdGFVdGlscy5jb252ZXJ0VG9Bc3NldE1ldGFkYXRhKGFzc2V0VHlwZURhdGEubGVmdCgpLnZhbHVlKCksIHNlcnZlckJhc2VVUkwsIGZhbHNlKTsKKwkJCQlpZiAocmVzTWV0YWRhdGEuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZ2V0QXNzZXRMaXN0OiBBc3NldCBjb252ZXJzaW9uIEZhaWxlZCIpOworCQkJCQlyZXNwb25zZUZvcm1hdCA9IHJlc01ldGFkYXRhLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbEdldEFzc2V0KHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisJCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCQlPYmplY3QgcmVzdWx0ID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKHJlc01ldGFkYXRhLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbEdldEFzc2V0KHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisKKwkJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgcmVzdWx0KTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJGZXRjaCBmaWx0ZXJlZCBsaXN0IG9mIGFzc2V0cyIpOworCQkJbG9nLmRlYnVnKCJnZXRBc3NldExpc3Q6IEZldGNoIGxpc3Qgb2YgYXNzZXRzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIve2Fzc2V0VHlwZX0ve3V1aWR9L21ldGFkYXRhIikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJGZXRjaCBtZXRhZGF0YSBvZiBhc3NldCBieSB1dWlkIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIG1ldGFkYXRhIG9mIGFzc2V0IiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJBc3NldHMgRmV0Y2hlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMSwgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uIHJlcXVpcmVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJBc3NldCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRBc3NldExpc3RCeVV1aWQoQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwgQFBhdGhQYXJhbSgidXVpZCIpIGZpbmFsIFN0cmluZyB1dWlkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBudWxsOworCQlTdHJpbmcgaW5zdGFuY2VJZEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5YX0VDT01QX0lOU1RBTkNFX0lEX0hFQURFUik7CisJCUF1ZGl0aW5nQWN0aW9uRW51bSBhdWRpdGluZ0FjdGlvbkVudW0gPSBBdWRpdGluZ0FjdGlvbkVudW0uR0VUX0FTU0VUX01FVEFEQVRBOworCQlTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3RVUkk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQlTdHJpbmcgc2VydmVyQmFzZVVSTCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7CisKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbSA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoYXNzZXRUeXBlKTsKKwkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwgaW5zdGFuY2VJZEhlYWRlcik7CisJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUkVTT1VSQ0VfVVJMLCByZXF1ZXN0VVJJKTsKKwkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSk7CisJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCB1dWlkKTsKKworCQkvLyBNYW5kYXRvcnkKKwkJaWYgKGluc3RhbmNlSWRIZWFkZXIgPT0gbnVsbCB8fCBpbnN0YW5jZUlkSGVhZGVyLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJnZXRBc3NldExpc3Q6IE1pc3NpbmcgWC1FQ09NUC1JbnN0YW5jZUlEIGhlYWRlciIpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxHZXRBc3NldChyZXNwb25zZUZvcm1hdCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQl0cnkgeworCQkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCQlFbGVtZW50QnVzaW5lc3NMb2dpYyBlbGVtZW50TG9naWMgPSBnZXRFbGVtZW50QkwoY29udGV4dCk7CisJCQlnZXRBc3NldFV0aWxzKGNvbnRleHQpOworCisJCQlFaXRoZXI8TGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50PiwgUmVzcG9uc2VGb3JtYXQ+IGFzc2V0VHlwZURhdGEgPSBlbGVtZW50TG9naWMuZ2V0Q2F0YWxvZ0NvbXBvbmVudHNCeVV1aWRBbmRBc3NldFR5cGUoYXNzZXRUeXBlLCB1dWlkKTsKKworCQkJaWYgKGFzc2V0VHlwZURhdGEuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJnZXRBc3NldExpc3Q6IEFzc2V0IEZldGNoaW5nIEZhaWxlZCIpOworCQkJCXJlc3BvbnNlRm9ybWF0ID0gYXNzZXRUeXBlRGF0YS5yaWdodCgpLnZhbHVlKCk7CisJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbEdldEFzc2V0KHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJnZXRBc3NldExpc3Q6IEFzc2V0IEZldGNoaW5nIFN1Y2Nlc3MiKTsKKwkJCQlhZGRpdGlvbmFsUGFyYW0ucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgYXNzZXRUeXBlRGF0YS5sZWZ0KCkudmFsdWUoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOworCQkJCUVpdGhlcjxMaXN0PD8gZXh0ZW5kcyBBc3NldE1ldGFkYXRhPiwgUmVzcG9uc2VGb3JtYXQ+IHJlc01ldGFkYXRhID0gYXNzZXRNZXRhZGF0YVV0aWxzLmNvbnZlcnRUb0Fzc2V0TWV0YWRhdGEoYXNzZXRUeXBlRGF0YS5sZWZ0KCkudmFsdWUoKSwgc2VydmVyQmFzZVVSTCwgdHJ1ZSk7CisJCQkJaWYgKHJlc01ldGFkYXRhLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImdldEFzc2V0TGlzdDogQXNzZXQgY29udmVyc2lvbiBGYWlsZWQiKTsKKwkJCQkJcmVzcG9uc2VGb3JtYXQgPSByZXNNZXRhZGF0YS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxHZXRBc3NldChyZXNwb25zZUZvcm1hdCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCQl9CisJCQkJT2JqZWN0IHJlc3VsdCA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihyZXNNZXRhZGF0YS5sZWZ0KCkudmFsdWUoKS5pdGVyYXRvcigpLm5leHQoKSk7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxHZXRBc3NldChyZXNwb25zZUZvcm1hdCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhZGRpdGlvbmFsUGFyYW0pOworCisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIHJlc3VsdCk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiRmV0Y2ggZmlsdGVyZWQgbGlzdCBvZiBhc3NldHMiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0QXNzZXRMaXN0OiBGZXRjaCBsaXN0IG9mIGFzc2V0cyBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBnZXRBc3NldFV0aWxzKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCWFzc2V0TWV0YWRhdGFVdGlscyA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKEFzc2V0TWV0YWRhdGFDb252ZXJ0ZXIuY2xhc3MpOworCX0KKworCUBHRVQKKwlAUGF0aCgiL3thc3NldFR5cGV9L3t1dWlkfS90b3NjYU1vZGVsIikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkZldGNoIGFzc2V0IGNzYXIiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgYXNzZXQgY3NhciIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXNzZXQgTW9kZWwgRmV0Y2hlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMSwgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uIHJlcXVpcmVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJBc3NldCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRUb3NjYU1vZGVsKEBQYXRoUGFyYW0oInV1aWQiKSBmaW5hbCBTdHJpbmcgdXVpZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSkgQFBhdGhQYXJhbSgiYXNzZXRUeXBlIikgZmluYWwgU3RyaW5nIGFzc2V0VHlwZSwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5BVVRIT1JJWkFUSU9OX0hFQURFUikgU3RyaW5nIGF1dGhvcml6YXRpb24pIHsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30ge30iLCByZXF1ZXN0LmdldE1ldGhvZCgpLCB1cmwpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gbnVsbDsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoYXNzZXRUeXBlKTsKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGF1ZGl0aW5nQWN0aW9uRW51bSA9IEF1ZGl0aW5nQWN0aW9uRW51bS5HRVRfVE9TQ0FfTU9ERUw7CisJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9JTlNUQU5DRV9JRF9IRUFERVIpOworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwgdXNlcklkKTsKKwkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9SRVNPVVJDRV9VUkwsIHVybCk7CisJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLCBjb21wb25lbnRUeXBlLmdldFZhbHVlKCkpOworCQlhZGRpdGlvbmFsUGFyYW0ucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRCwgdXVpZCk7CisKKwkJaWYgKHVzZXJJZCA9PSBudWxsIHx8IHVzZXJJZC5pc0VtcHR5KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZ2V0VG9zY2FNb2RlbDogTWlzc2luZyBYLUVDT01QLUluc3RhbmNlSUQgaGVhZGVyIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX1hfRUNPTVBfSU5TVEFOQ0VfSUQpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbEdldEFzc2V0KHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCXRyeSB7CisJCQlDb21wb25lbnRCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEJMID0gZ2V0Q29tcG9uZW50QkwoY29tcG9uZW50VHlwZSwgY29udGV4dCk7CisKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgYnl0ZVtdPiwgUmVzcG9uc2VGb3JtYXQ+IGNzYXJBcnRpZmFjdCA9IGNvbXBvbmVudEJMLmdldFRvc2NhTW9kZWxCeUNvbXBvbmVudFV1aWQoY29tcG9uZW50VHlwZSwgdXVpZCwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCWlmIChjc2FyQXJ0aWZhY3QuaXNSaWdodCgpKSB7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjc2FyQXJ0aWZhY3QucmlnaHQoKS52YWx1ZSgpOworCQkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0RXh0ZXJuYWxHZXRBc3NldChyZXNwb25zZUZvcm1hdCwgYXVkaXRpbmdBY3Rpb25FbnVtLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJYnl0ZVtdIHZhbHVlID0gY3NhckFydGlmYWN0LmxlZnQoKS52YWx1ZSgpLmdldFJpZ2h0KCk7CisJCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsdWUpOworCQkJCVN0cmluZyBjb250ZW5ldE1ENSA9IEdlbmVyYWxVdGlsaXR5LmNhbGN1bGF0ZU1ENUJ5Qnl0ZUFycmF5KHZhbHVlKTsKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLkNPTlRFTlRfRElTUE9TSVRJT05fSEVBREVSLCBnZXRDb250ZW50RGlzcG9zaXRpb25WYWx1ZShjc2FyQXJ0aWZhY3QubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpKSk7CisJCQkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLk1ENV9IRUFERVIsIGNvbnRlbmV0TUQ1KTsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbEdldEFzc2V0KHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGlzLCBoZWFkZXJzKTsKKwkJCX0KKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IGFzc2V0IHRvc2NhIG1vZGVsIik7CisJCQlsb2cuZGVidWcoImZhbGllZCB0byBnZXQgYXNzZXQgdG9zY2EgbW9kZWwiLCBlKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRFeHRlcm5hbEdldEFzc2V0KHJlc3BvbnNlRm9ybWF0LCBhdWRpdGluZ0FjdGlvbkVudW0sIGFkZGl0aW9uYWxQYXJhbSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9BcnRpZmFjdE1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9BcnRpZmFjdE1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxOTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL0FydGlmYWN0TWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQucmVwcmVzZW50YXRpb247CisKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdE1ldGFkYXRhIHsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RUeXBlOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0VVJMOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb247CisJcHJpdmF0ZSBJbnRlZ2VyIGFydGlmYWN0VGltZW91dDsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdENoZWNrc3VtOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0VVVJRDsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdFZlcnNpb247CisJcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVkRnJvbVVVSUQ7CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdE5hbWUoU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQl0aGlzLmFydGlmYWN0TmFtZSA9IGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VHlwZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFR5cGUoU3RyaW5nIGFydGlmYWN0VHlwZSkgeworCQl0aGlzLmFydGlmYWN0VHlwZSA9IGFydGlmYWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VVJMKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RVUkw7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RVUkwoU3RyaW5nIGFydGlmYWN0VVJMKSB7CisJCXRoaXMuYXJ0aWZhY3RVUkwgPSBhcnRpZmFjdFVSTDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGVzY3JpcHRpb24oU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb24pIHsKKwkJdGhpcy5hcnRpZmFjdERlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRBcnRpZmFjdFRpbWVvdXQoKSB7CisJCXJldHVybiBhcnRpZmFjdFRpbWVvdXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RUaW1lb3V0KEludGVnZXIgYXJ0aWZhY3RUaW1lb3V0KSB7CisJCXRoaXMuYXJ0aWZhY3RUaW1lb3V0ID0gYXJ0aWZhY3RUaW1lb3V0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RDaGVja3N1bSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0Q2hlY2tzdW07CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RDaGVja3N1bShTdHJpbmcgYXJ0aWZhY3RDaGVja3N1bSkgeworCQl0aGlzLmFydGlmYWN0Q2hlY2tzdW0gPSBhcnRpZmFjdENoZWNrc3VtOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RVVUlEKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VVVJRChTdHJpbmcgYXJ0aWZhY3RVVUlEKSB7CisJCXRoaXMuYXJ0aWZhY3RVVUlEID0gYXJ0aWZhY3RVVUlEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RWZXJzaW9uKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VmVyc2lvbihTdHJpbmcgYXJ0aWZhY3RWZXJzaW9uKSB7CisJCXRoaXMuYXJ0aWZhY3RWZXJzaW9uID0gYXJ0aWZhY3RWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdGVkRnJvbVVVSUQoKSB7CisJCXJldHVybiBnZW5lcmF0ZWRGcm9tVVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRGcm9tVVVJRChTdHJpbmcgZ2VuZXJhdGVkRnJvbVVVSUQpIHsKKwkJdGhpcy5nZW5lcmF0ZWRGcm9tVVVJRCA9IGdlbmVyYXRlZEZyb21VVUlEOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvcmVwcmVzZW50YXRpb24vQXNzZXRNZXRhZGF0YS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvcmVwcmVzZW50YXRpb24vQXNzZXRNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTRmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9Bc3NldE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNzZXRNZXRhZGF0YSBpbXBsZW1lbnRzIElBc3NldE1ldGFkYXRhIHsKKwlwcml2YXRlIFN0cmluZyB1dWlkOworCXByaXZhdGUgU3RyaW5nIGludmFyaWFudFVVSUQ7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOworCXByaXZhdGUgU3RyaW5nIHRvc2NhTW9kZWxVUkw7CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uLklBc3NldE1ldGFkYXRhIyBnZXRVdWlkKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFV1aWQoKSB7CisJCXJldHVybiB1dWlkOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLnNlcnZsZXQucmVwcmVzZW50YXRpb24uSUFzc2V0TWV0YWRhdGEjIHNldFV1aWQoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRVdWlkKFN0cmluZyB1dWlkKSB7CisJCXRoaXMudXVpZCA9IHV1aWQ7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uc2VydmxldC5yZXByZXNlbnRhdGlvbi5JQXNzZXRNZXRhZGF0YSMgZ2V0SW52YXJpYW50VVVJRCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRJbnZhcmlhbnRVVUlEKCkgeworCQlyZXR1cm4gaW52YXJpYW50VVVJRDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uLklBc3NldE1ldGFkYXRhIyBzZXRJbnZhcmlhbnRVVUlEKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCkgeworCQl0aGlzLmludmFyaWFudFVVSUQgPSBpbnZhcmlhbnRVVUlEOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLnNlcnZsZXQucmVwcmVzZW50YXRpb24uSUFzc2V0TWV0YWRhdGEjIGdldE5hbWUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uc2VydmxldC5yZXByZXNlbnRhdGlvbi5JQXNzZXRNZXRhZGF0YSMgc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uLklBc3NldE1ldGFkYXRhIyBnZXRWZXJzaW9uKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLnNlcnZsZXQucmVwcmVzZW50YXRpb24uSUFzc2V0TWV0YWRhdGEjIHNldFZlcnNpb24oamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uc2VydmxldC5yZXByZXNlbnRhdGlvbi5JQXNzZXRNZXRhZGF0YSMgdG9zY2FNb2RlbFVSTCgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUb3NjYU1vZGVsVVJMKCkgeworCQlyZXR1cm4gdG9zY2FNb2RlbFVSTDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uLklBc3NldE1ldGFkYXRhIyB0b3NjYU1vZGVsVVJMKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VG9zY2FNb2RlbFVSTChTdHJpbmcgdG9zY2FNb2RlbFVSTCkgeworCQl0aGlzLnRvc2NhTW9kZWxVUkwgPSB0b3NjYU1vZGVsVVJMOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL0lBc3NldE1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9JQXNzZXRNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWE4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9JQXNzZXRNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIElBc3NldE1ldGFkYXRhIHsKKworCVN0cmluZyBnZXRVdWlkKCk7CisKKwl2b2lkIHNldFV1aWQoU3RyaW5nIHV1aWQpOworCisJU3RyaW5nIGdldEludmFyaWFudFVVSUQoKTsKKworCXZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCk7CisKKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKworCVN0cmluZyBnZXRWZXJzaW9uKCk7CisKKwl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pOworCisJU3RyaW5nIGdldFRvc2NhTW9kZWxVUkwoKTsKKworCXZvaWQgc2V0VG9zY2FNb2RlbFVSTChTdHJpbmcgdG9zY2FNb2RlbFVSTCk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL1Byb2R1Y3RBc3NldE1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9Qcm9kdWN0QXNzZXRNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDljMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9Qcm9kdWN0QXNzZXRNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBQcm9kdWN0QXNzZXRNZXRhZGF0YSBleHRlbmRzIEFzc2V0TWV0YWRhdGEgeworCXByaXZhdGUgU3RyaW5nIGxpZmVjeWNsZVN0YXRlOworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkOworCXByaXZhdGUgYm9vbGVhbiBpc0FjdGl2ZTsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBjb250YWN0czsKKwlwcml2YXRlIExpc3Q8UHJvZHVjdENhdGVnb3J5R3JvdXBNZXRhZGF0YT4gcHJvZHVjdEdyb3VwaW5nczsKKworCXB1YmxpYyBTdHJpbmcgZ2V0TGlmZWN5Y2xlU3RhdGUoKSB7CisJCXJldHVybiBsaWZlY3ljbGVTdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVTdGF0ZShTdHJpbmcgbGlmZWN5Y2xlU3RhdGUpIHsKKwkJdGhpcy5saWZlY3ljbGVTdGF0ZSA9IGxpZmVjeWNsZVN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSB7CisJCXJldHVybiBsYXN0VXBkYXRlclVzZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlclVzZXJJZChTdHJpbmcgbGFzdFVwZGF0ZXJVc2VySWQpIHsKKwkJdGhpcy5sYXN0VXBkYXRlclVzZXJJZCA9IGxhc3RVcGRhdGVyVXNlcklkOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgeworCQlyZXR1cm4gaXNBY3RpdmU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gaXNBY3RpdmUpIHsKKwkJdGhpcy5pc0FjdGl2ZSA9IGlzQWN0aXZlOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29udGFjdHMoKSB7CisJCXJldHVybiBjb250YWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb250YWN0cyhMaXN0PFN0cmluZz4gY29udGFjdHMpIHsKKwkJdGhpcy5jb250YWN0cyA9IGNvbnRhY3RzOworCX0KKworCXB1YmxpYyBMaXN0PFByb2R1Y3RDYXRlZ29yeUdyb3VwTWV0YWRhdGE+IGdldFByb2R1Y3RHcm91cGluZ3MoKSB7CisJCXJldHVybiBwcm9kdWN0R3JvdXBpbmdzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb2R1Y3RHcm91cGluZ3MoTGlzdDxQcm9kdWN0Q2F0ZWdvcnlHcm91cE1ldGFkYXRhPiBwcm9kdWN0R3JvdXBpbmdzKSB7CisJCXRoaXMucHJvZHVjdEdyb3VwaW5ncyA9IHByb2R1Y3RHcm91cGluZ3M7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9Qcm9kdWN0Q2F0ZWdvcnlHcm91cE1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9Qcm9kdWN0Q2F0ZWdvcnlHcm91cE1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3ZjlkNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL1Byb2R1Y3RDYXRlZ29yeUdyb3VwTWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZXh0ZXJuYWxhcGkuc2VydmxldC5yZXByZXNlbnRhdGlvbjsKKworcHVibGljIGNsYXNzIFByb2R1Y3RDYXRlZ29yeUdyb3VwTWV0YWRhdGEgeworCXByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OworCXByaXZhdGUgU3RyaW5nIHN1YkNhdGVnb3J5OworCXByaXZhdGUgU3RyaW5nIGdyb3VwOworCisJcHVibGljIFByb2R1Y3RDYXRlZ29yeUdyb3VwTWV0YWRhdGEoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgc3ViQ2F0ZWdvcnksIFN0cmluZyBncm91cCkgeworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJCXRoaXMuc3ViQ2F0ZWdvcnkgPSBzdWJDYXRlZ29yeTsKKwkJdGhpcy5ncm91cCA9IGdyb3VwOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7CisJCXJldHVybiBjYXRlZ29yeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKKwkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3ViQ2F0ZWdvcnkoKSB7CisJCXJldHVybiBzdWJDYXRlZ29yeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdWJDYXRlZ29yeShTdHJpbmcgc3ViQ2F0ZWdvcnkpIHsKKwkJdGhpcy5zdWJDYXRlZ29yeSA9IHN1YkNhdGVnb3J5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXAoKSB7CisJCXJldHVybiBncm91cDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cChTdHJpbmcgZ3JvdXApIHsKKwkJdGhpcy5ncm91cCA9IGdyb3VwOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL1Jlc291cmNlQXNzZXREZXRhaWxlZE1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9SZXNvdXJjZUFzc2V0RGV0YWlsZWRNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjgyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9SZXNvdXJjZUFzc2V0RGV0YWlsZWRNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUFzc2V0RGV0YWlsZWRNZXRhZGF0YSBleHRlbmRzIFJlc291cmNlQXNzZXRNZXRhZGF0YSB7CisKKwlwcml2YXRlIFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lOworCXByaXZhdGUgU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lOworCXByaXZhdGUgTGlzdDxSZXNvdXJjZUluc3RhbmNlTWV0YWRhdGE+IHJlc291cmNlczsKKwlwcml2YXRlIExpc3Q8QXJ0aWZhY3RNZXRhZGF0YT4gYXJ0aWZhY3RzOworCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlckZ1bGxOYW1lKFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lKSB7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3NjYVJlc291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIHRvc2NhUmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvc2NhUmVzb3VyY2VOYW1lKFN0cmluZyB0b3NjYVJlc291cmNlTmFtZSkgeworCQl0aGlzLnRvc2NhUmVzb3VyY2VOYW1lID0gdG9zY2FSZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIExpc3Q8UmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhPiBnZXRSZXNvdXJjZXMoKSB7CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKExpc3Q8UmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhPiByZXNvdXJjZXMpIHsKKwkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisJfQorCisJcHVibGljIExpc3Q8QXJ0aWZhY3RNZXRhZGF0YT4gZ2V0QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhMaXN0PEFydGlmYWN0TWV0YWRhdGE+IGFydGlmYWN0TWV0YUxpc3QpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdE1ldGFMaXN0OworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL1Jlc291cmNlQXNzZXRNZXRhZGF0YS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvcmVwcmVzZW50YXRpb24vUmVzb3VyY2VBc3NldE1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3NWZhYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL1Jlc291cmNlQXNzZXRNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5leHRlcm5hbGFwaS5zZXJ2bGV0LnJlcHJlc2VudGF0aW9uOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VBc3NldE1ldGFkYXRhIGV4dGVuZHMgQXNzZXRNZXRhZGF0YSB7CisJcHJpdmF0ZSBTdHJpbmcgY2F0ZWdvcnk7CisJcHJpdmF0ZSBTdHJpbmcgc3ViQ2F0ZWdvcnk7CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VUeXBlOworCXByaXZhdGUgU3RyaW5nIGxpZmVjeWNsZVN0YXRlOworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkOworCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdWJDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIHN1YkNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFN1YkNhdGVnb3J5KFN0cmluZyBzdWJDYXRlZ29yeSkgeworCQl0aGlzLnN1YkNhdGVnb3J5ID0gc3ViQ2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGVTdGF0ZSgpIHsKKwkJcmV0dXJuIGxpZmVjeWNsZVN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpZmVjeWNsZVN0YXRlKFN0cmluZyBsaWZlY3ljbGVTdGF0ZSkgeworCQl0aGlzLmxpZmVjeWNsZVN0YXRlID0gbGlmZWN5Y2xlU3RhdGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlclVzZXJJZCgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVyVXNlcklkKFN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCkgeworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvcmVwcmVzZW50YXRpb24vUmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9SZXNvdXJjZUluc3RhbmNlTWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTM0MjJmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvcmVwcmVzZW50YXRpb24vUmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQucmVwcmVzZW50YXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFJlc291cmNlSW5zdGFuY2VNZXRhZGF0YSB7CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VOYW1lOworCXByaXZhdGUgU3RyaW5nIHJlc291cmNlSW52YXJpYW50VVVJRDsKKwlwcml2YXRlIFN0cmluZyByZXNvdXJjZVZlcnNpb247CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VjcmVUeXBlOworCXByaXZhdGUgU3RyaW5nIHJlc291cmNlVVVJRDsKKwlwcml2YXRlIExpc3Q8QXJ0aWZhY3RNZXRhZGF0YT4gYXJ0aWZhY3RzOworCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUluc3RhbmNlTmFtZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlSW5zdGFuY2VOYW1lKFN0cmluZyByZXNvdXJjZUluc3RhbmNlTmFtZSkgeworCQl0aGlzLnJlc291cmNlSW5zdGFuY2VOYW1lID0gcmVzb3VyY2VJbnN0YW5jZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisJCXJldHVybiByZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VOYW1lKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKwkJdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUludmFyaWFudFVVSUQoKSB7CisJCXJldHVybiByZXNvdXJjZUludmFyaWFudFVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJbnZhcmlhbnRVVUlEKFN0cmluZyByZXNvdXJjZUludmFyaWFudFVVSUQpIHsKKwkJdGhpcy5yZXNvdXJjZUludmFyaWFudFVVSUQgPSByZXNvdXJjZUludmFyaWFudFVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVZlcnNpb24oKSB7CisJCXJldHVybiByZXNvdXJjZVZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VWZXJzaW9uKFN0cmluZyByZXNvdXJjZVZlcnNpb24pIHsKKwkJdGhpcy5yZXNvdXJjZVZlcnNpb24gPSByZXNvdXJjZVZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdWNyZVR5cGUoKSB7CisJCXJldHVybiByZXNvdWNyZVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VjcmVUeXBlKFN0cmluZyByZXNvdWNyZVR5cGUpIHsKKwkJdGhpcy5yZXNvdWNyZVR5cGUgPSByZXNvdWNyZVR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVVSUQoKSB7CisJCXJldHVybiByZXNvdXJjZVVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVVUlEKFN0cmluZyByZXNvdXJjZVVVSUQpIHsKKwkJdGhpcy5yZXNvdXJjZVVVSUQgPSByZXNvdXJjZVVVSUQ7CisJfQorCisJcHVibGljIExpc3Q8QXJ0aWZhY3RNZXRhZGF0YT4gZ2V0QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhMaXN0PEFydGlmYWN0TWV0YWRhdGE+IGFydGlmYWN0cykgeworCQl0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0czsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9TZXJ2aWNlQXNzZXREZXRhaWxlZE1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9TZXJ2aWNlQXNzZXREZXRhaWxlZE1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkODhiNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9leHRlcm5hbGFwaS9zZXJ2bGV0L3JlcHJlc2VudGF0aW9uL1NlcnZpY2VBc3NldERldGFpbGVkTWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZXh0ZXJuYWxhcGkuc2VydmxldC5yZXByZXNlbnRhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgU2VydmljZUFzc2V0RGV0YWlsZWRNZXRhZGF0YSBleHRlbmRzIFNlcnZpY2VBc3NldE1ldGFkYXRhIHsKKwlwcml2YXRlIFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lOworCXByaXZhdGUgTGlzdDxSZXNvdXJjZUluc3RhbmNlTWV0YWRhdGE+IHJlc291cmNlczsKKwlwcml2YXRlIExpc3Q8QXJ0aWZhY3RNZXRhZGF0YT4gYXJ0aWZhY3RzOworCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlckZ1bGxOYW1lKFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lKSB7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIExpc3Q8UmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhPiBnZXRSZXNvdXJjZXMoKSB7CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKExpc3Q8UmVzb3VyY2VJbnN0YW5jZU1ldGFkYXRhPiByZXNvdXJjZXMpIHsKKwkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisJfQorCisJcHVibGljIExpc3Q8QXJ0aWZhY3RNZXRhZGF0YT4gZ2V0QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhMaXN0PEFydGlmYWN0TWV0YWRhdGE+IGFydGlmYWN0cykgeworCQl0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0czsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZXh0ZXJuYWxhcGkvc2VydmxldC9yZXByZXNlbnRhdGlvbi9TZXJ2aWNlQXNzZXRNZXRhZGF0YS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvcmVwcmVzZW50YXRpb24vU2VydmljZUFzc2V0TWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTRmOTczCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2V4dGVybmFsYXBpL3NlcnZsZXQvcmVwcmVzZW50YXRpb24vU2VydmljZUFzc2V0TWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZXh0ZXJuYWxhcGkuc2VydmxldC5yZXByZXNlbnRhdGlvbjsKKworcHVibGljIGNsYXNzIFNlcnZpY2VBc3NldE1ldGFkYXRhIGV4dGVuZHMgQXNzZXRNZXRhZGF0YSB7CisJcHJpdmF0ZSBTdHJpbmcgY2F0ZWdvcnk7CisJcHJpdmF0ZSBTdHJpbmcgbGlmZWN5Y2xlU3RhdGU7CisJcHJpdmF0ZSBTdHJpbmcgbGFzdFVwZGF0ZXJVc2VySWQ7CisJcHJpdmF0ZSBTdHJpbmcgZGlzdHJpYnV0aW9uU3RhdHVzOworCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGVTdGF0ZSgpIHsKKwkJcmV0dXJuIGxpZmVjeWNsZVN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpZmVjeWNsZVN0YXRlKFN0cmluZyBsaWZlY3ljbGVTdGF0ZSkgeworCQl0aGlzLmxpZmVjeWNsZVN0YXRlID0gbGlmZWN5Y2xlU3RhdGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlclVzZXJJZCgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVyVXNlcklkKFN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCkgeworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXN0cmlidXRpb25TdGF0dXMoKSB7CisJCXJldHVybiBkaXN0cmlidXRpb25TdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0aW9uU3RhdHVzKFN0cmluZyBkaXN0cmlidXRpb25TdGF0dXMpIHsKKwkJdGhpcy5kaXN0cmlidXRpb25TdGF0dXMgPSBkaXN0cmlidXRpb25TdGF0dXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ZpbHRlcnMvQmFzaWNBdXRoZW50aWNhdGlvbkZpbHRlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ZpbHRlcnMvQmFzaWNBdXRoZW50aWNhdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTFkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZmlsdGVycy9CYXNpY0F1dGhlbnRpY2F0aW9uRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Db25zdW1lckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db25zdW1lckRlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5zZWN1cml0eS5QYXNzd29yZHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAUHJpb3JpdHkoMTApCitwdWJsaWMgY2xhc3MgQmFzaWNBdXRoZW50aWNhdGlvbkZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisJQENvbnRleHQKKwlwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCBzcjsKKworCXByb3RlY3RlZCBHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCisJcHJpdmF0ZSBTdHJpbmcgcmVhbG0gPSAiQVNEQyI7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmFzaWNBdXRoZW50aWNhdGlvbkZpbHRlci5jbGFzcy5nZXROYW1lKCkpOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVN0cmluZyBhdXRoSGVhZGVyID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKENvbnN0YW50cy5BVVRIT1JJWkFUSU9OX0hFQURFUik7CisJCWlmIChhdXRoSGVhZGVyICE9IG51bGwpIHsKKwkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXV0aEhlYWRlcik7CisJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQkJU3RyaW5nIGJhc2ljID0gc3QubmV4dFRva2VuKCk7CisKKwkJCQlpZiAoYmFzaWMuZXF1YWxzSWdub3JlQ2FzZSgiQmFzaWMiKSkgeworCQkJCQl0cnkgeworCQkJCQkJU3RyaW5nIGNyZWRlbnRpYWxzID0gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlQmFzZTY0KHN0Lm5leHRUb2tlbigpKSwgIlVURi04Iik7CisJCQkJCQlsb2cuZGVidWcoIkNyZWRlbnRpYWxzOiB7fSIsIGNyZWRlbnRpYWxzKTsKKwkJCQkJCWNoZWNrVXNlckNyZWRlbnRpbGVzKHJlcXVlc3RDb250ZXh0LCBjcmVkZW50aWFscyk7CisJCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIENvdWxkbid0IHJldHJpZXZlIGF1dGhlbnRpY2F0aW9uIiwgZSk7CisJCQkJCQlhdXRoSW52YWxpZEhlYWRlckVycm9yKHJlcXVlc3RDb250ZXh0KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5lcnJvcigiQXV0aGVudGljYXRpb24gRmlsdGVyIEZhaWxlZCBDb3VsZG4ndCByZXRyaWV2ZSBhdXRoZW50aWNhdGlvbiwgbm8gYmFzaWMgYXV0YW50aWNhdGlvbi4iKTsKKwkJCQkJYXV0aEludmFsaWRIZWFkZXJFcnJvcihyZXF1ZXN0Q29udGV4dCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsb2cuZXJyb3IoIkF1dGhlbnRpY2F0aW9uIEZpbHRlciBGYWlsZWQgQ291bGRuJ3QgcmV0cmlldmUgYXV0aGVudGljYXRpb24sIG5vIGJhc2ljIGF1dGFudGljYXRpb24uIik7CisJCQkJYXV0aEludmFsaWRIZWFkZXJFcnJvcihyZXF1ZXN0Q29udGV4dCk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWxvZy5lcnJvcigiQXV0aGVudGljYXRpb24gRmlsdGVyIEZhaWxlZCBubyBhdXRoYXJpemF0aW9uIGhlYWRlciIpOworCQkJYXV0aFJlcXVpcmVkRXJyb3IocmVxdWVzdENvbnRleHQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrVXNlckNyZWRlbnRpbGVzKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBTdHJpbmcgY3JlZGVudGlhbHMpIHsKKwkJaW50IHAgPSBjcmVkZW50aWFscy5pbmRleE9mKCI6Iik7CisJCWlmIChwICE9IC0xKSB7CisJCQlTdHJpbmcgX3VzZXJuYW1lID0gY3JlZGVudGlhbHMuc3Vic3RyaW5nKDAsIHApLnRyaW0oKTsKKwkJCVN0cmluZyBfcGFzc3dvcmQgPSBjcmVkZW50aWFscy5zdWJzdHJpbmcocCArIDEpLnRyaW0oKTsKKworCQkJQ29uc3VtZXJCdXNpbmVzc0xvZ2ljIGNvbnN1bWVyQkwgPSBnZXRDb25zdW1lckJ1c2luZXNzTG9naWMoKTsKKwkJCWlmIChjb25zdW1lckJMID09IG51bGwpIHsKKwkJCQlsb2cuZXJyb3IoIkF1dGhlbnRpY2F0aW9uIEZpbHRlciBGYWlsZWQgdG8gZ2V0IGNvbnN1bWVyQkwuIik7CisJCQkJcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLnNlcnZlckVycm9yKCkuc3RhdHVzKFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpLmJ1aWxkKCkpOworCQkJfSBlbHNlIHsKKwkJCQlFaXRoZXI8Q29uc3VtZXJEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gY29uc3VtZXJCTC5nZXRDb25zdW1lcihfdXNlcm5hbWUpOworCQkJCXZhbGlkYXRlUGFzc3dvcmQocmVxdWVzdENvbnRleHQsIF91c2VybmFtZSwgX3Bhc3N3b3JkLCByZXN1bHQpOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIENvdWxkbid0IHJldHJpZXZlIGF1dGhlbnRpY2F0aW9uLCBubyBiYXNpYyBhdXRhbnRpY2F0aW9uLiIpOworCQkJYXV0aEludmFsaWRIZWFkZXJFcnJvcihyZXF1ZXN0Q29udGV4dCk7CisKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBTdHJpbmcgX3VzZXJuYW1lLCBTdHJpbmcgX3Bhc3N3b3JkLCBFaXRoZXI8Q29uc3VtZXJEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0KSB7CisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQlJbnRlZ2VyIHN0YXR1cyA9IHJlc3VsdC5yaWdodCgpLnZhbHVlKCkuZ2V0U3RhdHVzKCk7CisJCQlpZiAoc3RhdHVzID09IFN0YXR1cy5OT1RfRk9VTkQuZ2V0U3RhdHVzQ29kZSgpKSB7CisJCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIENvdWxkbid0IGZpbmQgdXNlciIpOworCQkJCWF1dGhVc2VyTm90Rm91bmRFcnJvcihyZXF1ZXN0Q29udGV4dCwgX3VzZXJuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIHRvIGdldCBjb25zdW1lckJMLiIpOworCQkJCXJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLnN0YXR1cyhTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SKS5idWlsZCgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUNvbnN1bWVyRGVmaW5pdGlvbiBjb25zdW1lckNyZWRlbnRpYWxzID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKCFQYXNzd29yZHMuaXNFeHBlY3RlZFBhc3N3b3JkKF9wYXNzd29yZCwgY29uc3VtZXJDcmVkZW50aWFscy5nZXRDb25zdW1lclNhbHQoKSwgY29uc3VtZXJDcmVkZW50aWFscy5nZXRDb25zdW1lclBhc3N3b3JkKCkpKSB7CisJCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIGludmFsaWRlIHBhc3N3b3JkIik7CisJCQkJYXV0aEludmFsaWRlUGFzc3dvcmRFcnJvcihyZXF1ZXN0Q29udGV4dCwgX3VzZXJuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJYXV0aFN1Y2Nlc2Vzc2Z1bChyZXF1ZXN0Q29udGV4dCwgX3VzZXJuYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhdXRoU3VjY2VzZXNzZnVsKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBTdHJpbmcgX3VzZXJuYW1lKSB7CisJCUNvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscyA9IGdldENvbXBvbmVudHNVdGlscygpOworCQlpZiAoY29tcG9uZW50VXRpbHMgPT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIHRvIGdldCBjb21wb25lbnQgdXRpbHMuIik7CisJCQlyZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpLmJ1aWxkKCkpOworCQl9CisJCWNvbXBvbmVudFV0aWxzLmF1ZGl0QXV0aEV2ZW50KEF1ZGl0aW5nQWN0aW9uRW51bS5BVVRIX1JFUVVFU1QsIHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRQYXRoKCksIF91c2VybmFtZSwgQXV0aFN0YXR1cy5BVVRIX1NVQ0NFU1MudG9TdHJpbmcoKSwgcmVhbG0pOworCX0KKworCXByaXZhdGUgdm9pZCBhdXRoSW52YWxpZGVQYXNzd29yZEVycm9yKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBTdHJpbmcgX3VzZXJuYW1lKSB7CisJCUNvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscyA9IGdldENvbXBvbmVudHNVdGlscygpOworCQlpZiAoY29tcG9uZW50VXRpbHMgPT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIHRvIGdldCBjb21wb25lbnQgdXRpbHMuIik7CisJCQlyZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpLmJ1aWxkKCkpOworCQl9CisJCWNvbXBvbmVudFV0aWxzLmF1ZGl0QXV0aEV2ZW50KEF1ZGl0aW5nQWN0aW9uRW51bS5BVVRIX1JFUVVFU1QsIHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRQYXRoKCksIF91c2VybmFtZSwgQXV0aFN0YXR1cy5BVVRIX0ZBSUxFRF9JTlZBTElEX1BBU1NXT1JELnRvU3RyaW5nKCksIHJlYWxtKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVVUSF9GQUlMRUQpOworCQlyZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBmYWxzZSkpOworCX0KKworCXByaXZhdGUgdm9pZCBhdXRoVXNlck5vdEZvdW5kRXJyb3IoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIFN0cmluZyBfdXNlcm5hbWUpIHsKKwkJQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudFV0aWxzID0gZ2V0Q29tcG9uZW50c1V0aWxzKCk7CisJCWlmIChjb21wb25lbnRVdGlscyA9PSBudWxsKSB7CisJCQlsb2cuZXJyb3IoIkF1dGhlbnRpY2F0aW9uIEZpbHRlciBGYWlsZWQgdG8gZ2V0IGNvbXBvbmVudCB1dGlscy4iKTsKKwkJCXJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5zdGF0dXMoU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUikuYnVpbGQoKSk7CisJCX0KKwkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRBdXRoRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkFVVEhfUkVRVUVTVCwgcmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldFBhdGgoKSwgX3VzZXJuYW1lLCBBdXRoU3RhdHVzLkFVVEhfRkFJTEVEX1VTRVJfTk9UX0ZPVU5ELnRvU3RyaW5nKCksIHJlYWxtKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVVUSF9GQUlMRUQpOworCQlyZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBmYWxzZSkpOworCX0KKworCXByaXZhdGUgdm9pZCBhdXRoSW52YWxpZEhlYWRlckVycm9yKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisJCUNvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscyA9IGdldENvbXBvbmVudHNVdGlscygpOworCQlpZiAoY29tcG9uZW50VXRpbHMgPT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJBdXRoZW50aWNhdGlvbiBGaWx0ZXIgRmFpbGVkIHRvIGdldCBjb21wb25lbnQgdXRpbHMuIik7CisJCQlyZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpLmJ1aWxkKCkpOworCQl9CisJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0QXV0aEV2ZW50KEF1ZGl0aW5nQWN0aW9uRW51bS5BVVRIX1JFUVVFU1QsIHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRQYXRoKCksICIiLCBBdXRoU3RhdHVzLkFVVEhfRkFJTEVEX0lOVkFMSURfQVVUSEVOVElDQVRJT05fSEVBREVSLnRvU3RyaW5nKCksIHJlYWxtKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVVUSF9GQUlMRURfSU5WQUxJREVfSEVBREVSKTsKKwkJcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgZmFsc2UpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXV0aFJlcXVpcmVkRXJyb3IoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKwkJQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudFV0aWxzID0gZ2V0Q29tcG9uZW50c1V0aWxzKCk7CisJCWlmIChjb21wb25lbnRVdGlscyA9PSBudWxsKSB7CisJCQlsb2cuZXJyb3IoIkF1dGhlbnRpY2F0aW9uIEZpbHRlciBGYWlsZWQgdG8gZ2V0IGNvbXBvbmVudCB1dGlscy4iKTsKKwkJCXJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5zdGF0dXMoU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUikuYnVpbGQoKSk7CisJCX0KKwkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRBdXRoRXZlbnQoQXVkaXRpbmdBY3Rpb25FbnVtLkFVVEhfUkVRVUVTVCwgcmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldFBhdGgoKSwgIiIsIEF1dGhTdGF0dXMuQVVUSF9SRVFVSVJFRC50b1N0cmluZygpLCByZWFsbSk7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFVVEhfUkVRVUlSRUQpOworCQlyZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCB0cnVlKSk7CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgZ2V0Q29tcG9uZW50c1V0aWxzKCkgeworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gc3IuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oQ29tcG9uZW50c1V0aWxzLmNsYXNzKTsKKwkJcmV0dXJuIGNvbXBvbmVudHNVdGlsczsKKwl9CisKKwlwcml2YXRlIENvbnN1bWVyQnVzaW5lc3NMb2dpYyBnZXRDb25zdW1lckJ1c2luZXNzTG9naWMoKSB7CisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBzci5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCUNvbnN1bWVyQnVzaW5lc3NMb2dpYyBjb25zdW1lckJ1c2luZXNzTG9naWMgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihDb25zdW1lckJ1c2luZXNzTG9naWMuY2xhc3MpOworCQlyZXR1cm4gY29uc3VtZXJCdXNpbmVzc0xvZ2ljOworCX0KKworCXB1YmxpYyBlbnVtIEF1dGhTdGF0dXMgeworCQlBVVRIX1JFUVVJUkVELCBBVVRIX0ZBSUxFRF9VU0VSX05PVF9GT1VORCwgQVVUSF9GQUlMRURfSU5WQUxJRF9QQVNTV09SRCwgQVVUSF9GQUlMRURfSU5WQUxJRF9BVVRIRU5USUNBVElPTl9IRUFERVIsIEFVVEhfU1VDQ0VTUworCX0KKworCXByb3RlY3RlZCBSZXNwb25zZSBidWlsZEVycm9yUmVzcG9uc2UoUmVzcG9uc2VGb3JtYXQgcmVxdWVzdEVycm9yV3JhcHBlciwgYm9vbGVhbiBhZGRXd3dBdXRoZW50aWNhdGlvbkhlYWRlcikgeworCQlSZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2VCdWlsZGVyID0gUmVzcG9uc2Uuc3RhdHVzKHJlcXVlc3RFcnJvcldyYXBwZXIuZ2V0U3RhdHVzKCkpOworCQlpZiAoYWRkV3d3QXV0aGVudGljYXRpb25IZWFkZXIpIHsKKwkJCXJlc3BvbnNlQnVpbGRlciA9IHJlc3BvbnNlQnVpbGRlci5oZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAiQmFzaWMgcmVhbG09XCIiICsgcmVhbG0gKyAiXCIiKTsKKwkJfQorCQlSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlQnVpbGRlci5lbnRpdHkoZ3Nvbi50b0pzb24ocmVxdWVzdEVycm9yV3JhcHBlci5nZXRSZXF1ZXN0RXJyb3IoKSkpLmJ1aWxkKCk7CisJCXJldHVybiByZXNwb25zZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9maWx0ZXJzL0JlU2VydmxldEZpbHRlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ZpbHRlcnMvQmVTZXJ2bGV0RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjMTFkMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9maWx0ZXJzL0JlU2VydmxldEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5UaHJlYWRMb2NhbHNIb2xkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNsZjRqLk1EQzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworQFByb3ZpZGVyCitAUHJpb3JpdHkoMSkKK3B1YmxpYyBjbGFzcyBCZVNlcnZsZXRGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKwlAQ29udGV4dAorCXByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHNyOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJlU2VydmxldEZpbHRlci5jbGFzcy5nZXROYW1lKCkpOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCisJCQlNREMuY2xlYXIoKTsKKworCQkJLy8gSW4gY2FzZSBvZiA0MDUgcmVzcG9uc2UgY29kZSwgdGhpcyBmdW5jdGlvbiBpcyBub3QgZW50ZXJlZCwgdGhlbgorCQkJLy8gd2UnbGwgcHJvY2VzcworCQkJLy8gdGhlIE1EQyBmaWVsZHMgYW5kIFVVSUQgZHVyaW5nIHRoZSByZXNwb25zZQorCQkJVGhyZWFkTG9jYWxzSG9sZGVyLnNldE1kY1Byb2Nlc3NlZCh0cnVlKTsKKworCQkJLy8gVGltaW5nIEhUVFAgcmVxdWVzdAorCQkJVGhyZWFkTG9jYWxzSG9sZGVyLnNldFJlcXVlc3RTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisJCQlTdHJpbmcgdXVpZCA9IHByb2Nlc3NNZGNGaWVsZHMocmVxdWVzdENvbnRleHQpOworCisJCQlUaHJlYWRMb2NhbHNIb2xkZXIuc2V0VXVpZCh1dWlkKTsKKworCQkJaW5IdHRwUmVxdWVzdCgpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiRXJyb3IgZHVyaW5nIHJlcXVlc3QgZmlsdGVyIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJFcnJvciBkdXJpbmcgcmVxdWVzdCBmaWx0ZXIiKTsKKwkJCWxvZy5kZWJ1ZygiRXJyb3IgZHVyaW5nIHJlcXVlc3QgZmlsdGVyOiB7fSAiLCBlKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCS8vIEZvcm1hdHRpbmcgdGhlIHJlc3BvbnNlIGluIGNhc2Ugb2YgNDA1CisJCQlpZiAocmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpID09IFJlc3BvbnNlLlN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRUQuZ2V0U3RhdHVzQ29kZSgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQpOworCQkJCXJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkobmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKS50b0pzb24ocmVzcG9uc2VGb3JtYXQuZ2V0UmVxdWVzdEVycm9yKCkpKTsKKwkJCX0KKworCQkJaWYgKFRocmVhZExvY2Fsc0hvbGRlci5pc01kY1Byb2Nlc3NlZCgpKSB7CisJCQkJLy8gZmlsdGVyKCkgd2FzIGV4ZWN1dGVkIGR1cmluZyByZXF1ZXN0IC0gdGhpcyBpcyB0aGUgcmVndWxhcgorCQkJCS8vIGZsb3cKKwkJCQlyZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZChDb25zdGFudHMuWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUiwgVGhyZWFkTG9jYWxzSG9sZGVyLmdldFV1aWQoKSk7CisJCQkJTG9uZyBzdGFydFRpbWUgPSBUaHJlYWRMb2NhbHNIb2xkZXIuZ2V0UmVxdWVzdFN0YXJ0VGltZSgpOworCQkJCWlmIChzdGFydFRpbWUgIT0gbnVsbCkgeworCQkJCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQkJTURDLnB1dCgidGltZXIiLCBMb25nLnRvU3RyaW5nKGVuZFRpbWUgLSBzdGFydFRpbWUpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIHRoaXMgaXMgdGhlIDQwNSByZXNwb25zZSBjb2RlIGNhc2UKKwkJCQkvLyB3ZSBoYXZlIG5vIE1EQyBmaWVsZHMgc2luY2UgZmlsdGVyKCkgd2Fzbid0IGV4ZWN1dGVkIGR1cmluZworCQkJCS8vIHJlcXVlc3QKKwkJCQlTdHJpbmcgdXVpZCA9IHByb2Nlc3NNZGNGaWVsZHMocmVxdWVzdENvbnRleHQpOworCQkJCXJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKENvbnN0YW50cy5YX0VDT01QX1JFUVVFU1RfSURfSEVBREVSLCB1dWlkKTsKKwkJCX0KKworCQkJb3V0SHR0cFJlc3BvbnNlKHJlc3BvbnNlQ29udGV4dCk7CisKKwkJCS8vIENsZWFuaW5nIHVwCisJCQlNREMuY2xlYXIoKTsKKwkJCVRocmVhZExvY2Fsc0hvbGRlci5jbGVhbnVwKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiRXJyb3IgZHVyaW5nIHJlcXVlc3QgZmlsdGVyIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJFcnJvciBkdXJpbmcgcmVxdWVzdCBmaWx0ZXIiKTsKKwkJCWxvZy5kZWJ1ZygiRXJyb3IgZHVyaW5nIHJlc3BvbnNlIGZpbHRlcjoge30gIiwgZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBwcm9jZXNzTWRjRmllbGRzKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisJCS8vIHVzZXJJZCBmb3IgbG9nZ2luZworCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisJCU1EQy5wdXQoInVzZXJJZCIsIHVzZXJJZCk7CisKKwkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlEID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKENvbnN0YW50cy5YX0VDT01QX1NFUlZJQ0VfSURfSEVBREVSKTsKKwkJTURDLnB1dCgic2VydmljZUluc3RhbmNlSUQiLCBzZXJ2aWNlSW5zdGFuY2VJRCk7CisKKwkJTURDLnB1dCgicmVtb3RlQWRkciIsIHNyLmdldFJlbW90ZUFkZHIoKSk7CisJCU1EQy5wdXQoImxvY2FsQWRkciIsIHNyLmdldExvY2FsQWRkcigpKTsKKworCQkvLyBVVUlECisJCVN0cmluZyB1dWlkID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKENvbnN0YW50cy5YX0VDT01QX1JFUVVFU1RfSURfSEVBREVSKTsKKwkJaWYgKHV1aWQgPT0gbnVsbCkgeworCQkJLy8gR2VuZXJhdGUgdGhlIFVVSUQKKwkJCXV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCisJCQkvLyBBZGQgdG8gTURDIGZvciBsb2dnaW5nCisJCQlNREMucHV0KCJ1dWlkIiwgdXVpZCk7CisKKwkJCS8vIFRoaXMgbG9nIG1lc3NhZ2Ugc2hvdWxkIGFscmVhZHkgYmUgd2l0aCB0aGUgVVVJRAorCQkJdXVpZEdlbmVyYXRpb24odXVpZCk7CisKKwkJfSBlbHNlIHsKKwkJCS8vIEFjY29yZGluZyB0byBFbGxhLCBpbiBjYXNlIHRoaXMgaGVhZGVyIGV4aXN0cywgd2UgZG9uJ3QgaGF2ZSB0bworCQkJLy8gcGVyZm9ybSBhbnkgdmFsaWRhdGlvbnMKKwkJCS8vIHNpbmNlIGl0J3Mgbm90IG91ciByZXNwb25zaWJpbHR5LCBzbyB3ZSBsb2cgdGhlIFVVSUQganVzdCBhcyBpdAorCQkJLy8gd2FzIHJlY2VpdmVkLgorCQkJTURDLnB1dCgidXVpZCIsIHV1aWQpOworCQl9CisJCXJldHVybiB1dWlkOworCX0KKworCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGdldENvbXBvbmVudHNVdGlscygpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHRoaXMuc3IuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCXJldHVybiB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihDb21wb25lbnRzVXRpbHMuY2xhc3MpOworCX0KKworCS8vIEV4dHJhY3RlZCBmb3IgcHVycG9zZSBvZiBjbGVhciBtZXRob2QgbmFtZSwgZm9yIGxvZ2JhY2sgJU0gcGFyYW1ldGVyCisJcHJpdmF0ZSB2b2lkIGluSHR0cFJlcXVlc3QoKSB7CisJCWlmIChpc0luZm9Mb2coKSkgeworCQkJbG9nLmluZm8oInt9IHt9IHt9Iiwgc3IuZ2V0TWV0aG9kKCksIHNyLmdldFJlcXVlc3RVUkkoKSwgc3IuZ2V0UHJvdG9jb2woKSk7CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoInt9IHt9IHt9Iiwgc3IuZ2V0TWV0aG9kKCksIHNyLmdldFJlcXVlc3RVUkkoKSwgc3IuZ2V0UHJvdG9jb2woKSk7CisJCX0KKwl9CisKKwkvLyBFeHRyYWN0ZWQgZm9yIHB1cnBvc2Ugb2YgY2xlYXIgbWV0aG9kIG5hbWUsIGZvciBsb2diYWNrICVNIHBhcmFtZXRlcgorCXByaXZhdGUgdm9pZCBvdXRIdHRwUmVzcG9uc2UoQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgeworCQlpZiAoaXNJbmZvTG9nKCkpIHsKKwkJCWxvZy5pbmZvKCJ7fSB7fSB7fSBTQz1cInt9XCIiLCBzci5nZXRNZXRob2QoKSwgc3IuZ2V0UmVxdWVzdFVSSSgpLCBzci5nZXRQcm90b2NvbCgpLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJ7fSB7fSB7fSBTQz1cInt9XCIiLCBzci5nZXRNZXRob2QoKSwgc3IuZ2V0UmVxdWVzdFVSSSgpLCBzci5nZXRQcm90b2NvbCgpLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzSW5mb0xvZygpIHsKKwkJYm9vbGVhbiBsb2dSZXF1ZXN0ID0gdHJ1ZTsKKwkJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCk7CisJCVN0cmluZyByZXF1ZXN0VVJJID0gc3IuZ2V0UmVxdWVzdFVSSSgpOworCQlpZiAocmVxdWVzdFVSSSAhPSBudWxsICYmIGNvbmZpZ3VyYXRpb24uZ2V0VW5Mb2dnZWRVcmxzKCkgIT0gbnVsbCkgeworCQkJbG9nUmVxdWVzdCA9ICFjb25maWd1cmF0aW9uLmdldFVuTG9nZ2VkVXJscygpLmNvbnRhaW5zKHJlcXVlc3RVUkkpOworCQl9CisKKwkJcmV0dXJuIGxvZ1JlcXVlc3Q7CisJfQorCisJLy8gRXh0cmFjdGVkIGZvciBwdXJwb3NlIG9mIGNsZWFyIG1ldGhvZCBuYW1lLCBmb3IgbG9nYmFjayAlTSBwYXJhbWV0ZXIKKwlwcml2YXRlIHZvaWQgdXVpZEdlbmVyYXRpb24oU3RyaW5nIHV1aWQpIHsKKwkJbG9nLmluZm8oIk5vIHJlcXVlc3RJRCAgcHJvdmlkZWQgLT4gR2VuZXJhdGVkIFVVSUQge30iLCB1dWlkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZmlsdGVycy9Db21wb25lbnRzQXZhaWxhYmlsaXR5RmlsdGVyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZmlsdGVycy9Db21wb25lbnRzQXZhaWxhYmlsaXR5RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3MmUyZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9maWx0ZXJzL0NvbXBvbmVudHNBdmFpbGFiaWxpdHlGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5IZWFsdGhDaGVja0luZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5IZWFsdGhDaGVja0luZm8uSGVhbHRoQ2hlY2tTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CisKK0BQcmlvcml0eSgxMSkKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRzQXZhaWxhYmlsaXR5RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKwlAQ29udGV4dAorCXByb3RlY3RlZCBIdHRwU2VydmxldFJlcXVlc3Qgc3I7CisJcHJvdGVjdGVkIEdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudHNBdmFpbGFiaWxpdHlGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgcmVxdWVzdFVybCA9IHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRQYXRoKCk7CisJCWlmICghcmVxdWVzdFVybC5lcXVhbHMoImhlYWx0aENoZWNrIikpIHsKKwkJCUxpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBiZUhlYWx0aENoZWNrSW5mb3MgPSBnZXRCZUhlYWx0aENoZWNrSW5mb3ModGhpcy5zci5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCQlBY3Rpb25TdGF0dXMgc3RhdHVzID0gZ2V0QWdncmVnYXRlQmVTdGF0dXMoYmVIZWFsdGhDaGVja0luZm9zKTsKKworCQkJaWYgKCFzdGF0dXMuZXF1YWxzKEFjdGlvblN0YXR1cy5PSykpIHsKKwkJCQlsb2cuZXJyb3IoIkNvbXBvbmVudHMgQXZhaWxhYmlsaXR5IEZpbHRlciBGYWlsZWQgLSBFUy9DYXNzYW5kcmEgaXMgRE9XTiIpOworCQkJCWF2YWlsYWJpbGl0eUVycm9yKHJlcXVlc3RDb250ZXh0KTsKKwkJCX0KKwkJfQorCisJfQorCisJcHJvdGVjdGVkIEFjdGlvblN0YXR1cyBnZXRBZ2dyZWdhdGVCZVN0YXR1cyhMaXN0PEhlYWx0aENoZWNrSW5mbz4gYmVIZWFsdGhDaGVja0luZm9zKSB7CisJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSBBY3Rpb25TdGF0dXMuT0s7CisJCWZvciAoSGVhbHRoQ2hlY2tJbmZvIGhlYWx0aENoZWNrSW5mbyA6IGJlSGVhbHRoQ2hlY2tJbmZvcykgeworCQkJaWYgKGhlYWx0aENoZWNrSW5mby5nZXRIZWFsdGhDaGVja1N0YXR1cygpLmVxdWFscyhIZWFsdGhDaGVja1N0YXR1cy5ET1dOKSkgeworCQkJCXN0YXR1cyA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHJvdGVjdGVkIExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBnZXRCZUhlYWx0aENoZWNrSW5mb3MoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHsKKworCQlMaXN0PEhlYWx0aENoZWNrSW5mbz4gaGVhbHRoQ2hlY2tJbmZvcyA9IG5ldyBBcnJheUxpc3Q8SGVhbHRoQ2hlY2tJbmZvPigpOworCQlIZWFsdGhDaGVja0J1c2luZXNzTG9naWMgaGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljID0gZ2V0SGVhbHRoQ2hlY2tCTChzZXJ2bGV0Q29udGV4dCk7CisJCWhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYy5nZXRUaXRhbkhlYWx0aENoZWNrKGhlYWx0aENoZWNrSW5mb3MpOyAvLyBUaXRhbgorCQlyZXR1cm4gaGVhbHRoQ2hlY2tJbmZvczsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tcG9uZW50c1V0aWxzIGdldENvbXBvbmVudHNVdGlscygpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHNyLmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID0gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKwkJV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChjb250ZXh0KTsKKwkJQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscyA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKENvbXBvbmVudHNVdGlscy5jbGFzcyk7CisJCXJldHVybiBjb21wb25lbnRzVXRpbHM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmlsaXR5RXJyb3IoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKwkJQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudFV0aWxzID0gZ2V0Q29tcG9uZW50c1V0aWxzKCk7CisJCWlmIChjb21wb25lbnRVdGlscyA9PSBudWxsKSB7CisJCQlsb2cuZXJyb3IoIkNvbXBvbmVudHMgQXZhaWxhYmlsaXR5IEZpbHRlciBGYWlsZWQgdG8gZ2V0IGNvbXBvbmVudCB1dGlscy4iKTsKKwkJCXJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5zdGF0dXMoU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUikuYnVpbGQoKSk7CisJCX0KKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCVJlc3BvbnNlQnVpbGRlciByZXNwb25zZUJ1aWxkZXIgPSBSZXNwb25zZS5zdGF0dXMocmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCkpOworCQlSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlQnVpbGRlci5lbnRpdHkoZ3Nvbi50b0pzb24ocmVzcG9uc2VGb3JtYXQuZ2V0UmVxdWVzdEVycm9yKCkpKS5idWlsZCgpOworCQlyZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgocmVzcG9uc2UpOworCX0KKworCXByaXZhdGUgSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljIGdldEhlYWx0aENoZWNrQkwoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID0gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKwkJV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChjb250ZXh0KTsKKwkJSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljIGhlYWx0aENoZWNrQmwgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihIZWFsdGhDaGVja0J1c2luZXNzTG9naWMuY2xhc3MpOworCQlyZXR1cm4gaGVhbHRoQ2hlY2tCbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbXBsL0NvbXBvbmVudHNVdGlscy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ltcGwvQ29tcG9uZW50c1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyYWJlYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbXBsL0NvbXBvbmVudHNVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQ2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uVmVyc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuRGVzZXJpYWxpemF0aW9uQ29uZmlnOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5Kc29uRGVzZXJpYWxpemVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLm1vZHVsZS5TaW1wbGVNb2R1bGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuYXBpLklBdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc3BvbnNlRm9ybWF0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuQWRkaXRpb25hbEluZm9ybWF0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29uc3VtZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlBvbGljeVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb24uUHJvcGVydHlDb25zdHJhaW50RGVzZXJpYWxpc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbi5Qcm9wZXJ0eUNvbnN0cmFpbnRKYWNrc29uRGVzZXJpYWxpc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5Ub3NjYUVycm9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5UaHJlYWRMb2NhbHNIb2xkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgiY29tcG9uZW50VXRpbHMiKQorcHVibGljIGNsYXNzIENvbXBvbmVudHNVdGlscyB7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSUF1ZGl0aW5nTWFuYWdlciBhdWRpdGluZ01hbmFnZXI7CisKKwlwcml2YXRlIFJlc3BvbnNlRm9ybWF0TWFuYWdlciByZXNwb25zZUZvcm1hdE1hbmFnZXI7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29tcG9uZW50c1V0aWxzLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIEluaXQoKSB7CisJCXRoaXMucmVzcG9uc2VGb3JtYXRNYW5hZ2VyID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisJfQorCisJcHVibGljIElBdWRpdGluZ01hbmFnZXIgZ2V0QXVkaXRpbmdNYW5hZ2VyKCkgeworCQlyZXR1cm4gYXVkaXRpbmdNYW5hZ2VyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEF1ZGl0aW5nTWFuYWdlcihJQXVkaXRpbmdNYW5hZ2VyIGF1ZGl0aW5nTWFuYWdlcikgeworCQl0aGlzLmF1ZGl0aW5nTWFuYWdlciA9IGF1ZGl0aW5nTWFuYWdlcjsKKwl9CisKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBSZXNwb25zZUZvcm1hdD4gY29udmVydEpzb25Ub09iamVjdChTdHJpbmcgZGF0YSwgVXNlciB1c2VyLCBDbGFzczxUPiBjbGF6eiwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJaWYgKGRhdGEgPT0gbnVsbCkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlSW52YWxpZEpzb25JbnB1dCwgImNvbnZlcnRKc29uVG9PYmplY3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRKc29uSW5wdXQoImNvbnZlcnRKc29uVG9PYmplY3QiKTsKKwkJCWxvZy5kZWJ1Zygib2JqZWN0IGlzIG51bGwgYWZ0ZXIgY29udmVydGluZyBmcm9tIGpzb24iKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0SW52YWxpZENvbnRlbnRFcnJvckFuZEF1ZGl0KHVzZXIsIGFjdGlvbkVudW0pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJdHJ5IHsKKwkJCVQgb2JqID0gcGFyc2VKc29uVG9PYmplY3QoZGF0YSwgY2xhenopOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG9iaik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBJTlZBTElEIEpTT04KKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRKc29uSW5wdXQsICJjb252ZXJ0SnNvblRvT2JqZWN0Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVJbnZhbGlkSnNvbklucHV0KCJjb252ZXJ0SnNvblRvT2JqZWN0Iik7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjb252ZXJ0IGZyb20ganNvbiB7fSIsIGRhdGEsIGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRJbnZhbGlkQ29udGVudEVycm9yQW5kQXVkaXQodXNlciwgYWN0aW9uRW51bSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgcGFyc2VKc29uVG9PYmplY3QoU3RyaW5nIGRhdGEsIENsYXNzPFQ+IGNsYXp6KSB7CisJCVR5cGUgY29uc3RyYWludFR5cGUgPSBuZXcgVHlwZVRva2VuPFByb3BlcnR5Q29uc3RyYWludD4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5yZWdpc3RlclR5cGVBZGFwdGVyKGNvbnN0cmFpbnRUeXBlLCBuZXcgUHJvcGVydHlDb25zdHJhaW50RGVzZXJpYWxpc2VyKCkpLmNyZWF0ZSgpOworCQlsb2cudHJhY2UoImNvbnZlcnQganNvbiB0byBvYmplY3QuIGpzb249XG57fSIsIGRhdGEpOworCQlUIHJlc291cmNlID0gZ3Nvbi5mcm9tSnNvbihkYXRhLCBjbGF6eik7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBSZXNwb25zZUZvcm1hdD4gY29udmVydEpzb25Ub09iamVjdFVzaW5nT2JqZWN0TWFwcGVyKFN0cmluZyBkYXRhLCBVc2VyIHVzZXIsIENsYXNzPFQ+IGNsYXp6LCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0gdHlwZUVudW0pIHsKKwkJVCBjb21wb25lbnQgPSBudWxsOworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpLmNvbmZpZ3VyZShEZXNlcmlhbGl6YXRpb25Db25maWcuRmVhdHVyZS5GQUlMX09OX1VOS05PV05fUFJPUEVSVElFUywgZmFsc2UpOworCisJCXRyeSB7CisJCQlsb2cudHJhY2UoImNvbnZlcnQganNvbiB0byBvYmplY3QuIGpzb249XG57fSIsIGRhdGEpOworCisJCQlmaW5hbCBTaW1wbGVNb2R1bGUgbW9kdWxlID0gbmV3IFNpbXBsZU1vZHVsZSgiY3VzdG9tZXJTZXJpYWxpemF0aW9uTW9kdWxlIiwgbmV3IFZlcnNpb24oMSwgMCwgMCwgInN0YXRpYyB2ZXJzaW9uIikpOworCQkJSnNvbkRlc2VyaWFsaXplcjxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGRlc3JpYWxpemVyID0gbmV3IFByb3BlcnR5Q29uc3RyYWludEphY2tzb25EZXNlcmlhbGlzZXIoKTsKKwkJCWFkZERlc2VyaWFsaXplcihtb2R1bGUsIFByb3BlcnR5Q29uc3RyYWludC5jbGFzcywgZGVzcmlhbGl6ZXIpOworCQkJLy8KKwkJCW1hcHBlci5yZWdpc3Rlck1vZHVsZShtb2R1bGUpOworCisJCQljb21wb25lbnQgPSBtYXBwZXIucmVhZFZhbHVlKGRhdGEsIGNsYXp6KTsKKwkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRKc29uSW5wdXQsICJjb252ZXJ0SnNvblRvT2JqZWN0Iik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJCWxvZy5kZWJ1Zygib2JqZWN0IGlzIG51bGwgYWZ0ZXIgY29udmVydGluZyBmcm9tIGpzb24iKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldEludmFsaWRDb250ZW50RXJyb3JBbmRBdWRpdENvbXBvbmVudCh1c2VyLCBhY3Rpb25FbnVtLCB0eXBlRW51bSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVJbnZhbGlkSnNvbklucHV0LCAiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY29udmVydCBmcm9tIGpzb24ge30iLCBkYXRhLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0SW52YWxpZENvbnRlbnRFcnJvckFuZEF1ZGl0Q29tcG9uZW50KHVzZXIsIGFjdGlvbkVudW0sIHR5cGVFbnVtKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnQpOworCX0KKworCXB1YmxpYyA8VD4gdm9pZCBhZGREZXNlcmlhbGl6ZXIoU2ltcGxlTW9kdWxlIG1vZHVsZSwgQ2xhc3M8VD4gY2xhenosIGZpbmFsIEpzb25EZXNlcmlhbGl6ZXI8VD4gZGVzZXJpYWxpemVyKSB7CisJCW1vZHVsZS5hZGREZXNlcmlhbGl6ZXIoY2xhenosIGRlc2VyaWFsaXplcik7CisJfQorCisJLy8gRXJyb3IgcmVzcG9uc2UKKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBTdHJpbmcuLi4gcGFyYW1zKSB7CisJCXJldHVybiByZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBwYXJhbXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3BvbnNlIGZvcm1hdCBvZiByZXNvdXJjZSBlcnJvciB3aXRoIHJlc3BlY3RpdmUgdmFyaWFibGVzIGFjY29yZGluZyB0byBhY3Rpb25TdGF0dXMuIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSBhY3Rpb25TdGF0dXMgaXMgYW5vbnltb3VzbHkgY29udmVydGVkIGZyb20gc3RvcmFnZSBvcGVyYXRpb24sIGFuZCB0aGUgY2FsbGVyIGRvZXNuJ3Qga25vdyB3aGF0IGFjdGlvblN0YXR1cyBoZQorCSAqIHJlY2VpdmVkLiBJdCdzIGNhbGxlcidzIFJlc3BvbnNpYmlsaXR5IHRvIGZpbGwgdGhlIHJlc291cmNlIG9iamVjdCBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB3aXRoIG5lZWRlZCBmaWVsZHMuCisJICogCisJICogTm90ZSB0aGF0IFJFU09VUkNFX0lOX1VTRSBjYXNlIHBhc3NlcyBoYXJkY29kZWQgInJlc291cmNlIiBzdHJpbmcgdG8gdGhlIGVycm9yIHBhcmFtZXRlci4gVGhpcyBtZWFucyB0aGF0IGlmIFJlc291cmNlIG9iamVjdCB3aWxsIGFsc28gYmUgdXNlZCBmb3IgU2VydmljZSwgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgYW5kIHdlIHNob3VsZCB0ZWxsIFJlc291cmNlIGZyb20gU2VydmljZS4KKwkgKiAKKwkgKiBAcGFyYW0gYWN0aW9uU3RhdHVzCisJICogQHBhcmFtIHJlc291cmNlCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEJ5UmVzb3VyY2UoQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCXJldHVybiBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpOworCQl9CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCisJCXN3aXRjaCAoYWN0aW9uU3RhdHVzKSB7CisJCWNhc2UgQ09NUE9ORU5UX1ZFUlNJT05fQUxSRUFEWV9FWElTVDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9WRVJTSU9OX0FMUkVBRFlfRVhJU1QsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCksIHJlc291cmNlLmdldFZlcnNpb24oKSk7CisJCQlicmVhazsKKwkJY2FzZSBSRVNPVVJDRV9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQsIHJlc291cmNlLmdldE5hbWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfTkFNRV9BTFJFQURZX0VYSVNUOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9JTl9VU0U6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fVVNFLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKwl9CisKKwlwdWJsaWMgUmVzcG9uc2VGb3JtYXQgZ2V0UmVzcG9uc2VGb3JtYXRCeVJlc291cmNlKEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKwkJaWYgKHJlc291cmNlTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJfQorCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKworCQlzd2l0Y2ggKGFjdGlvblN0YXR1cykgeworCQljYXNlIFJFU09VUkNFX05PVF9GT1VORDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCwgcmVzb3VyY2VOYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEJ5Q2FwYWJpbGl0eVR5cGUoQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlKSB7CisJCWlmIChjYXBhYmlsaXR5VHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJfQorCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKworCQlzd2l0Y2ggKGFjdGlvblN0YXR1cykgeworCQljYXNlIENBUEFCSUxJVFlfVFlQRV9BTFJFQURZX0VYSVNUOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ0FQQUJJTElUWV9UWVBFX0FMUkVBRFlfRVhJU1QsIGNhcGFiaWxpdHlUeXBlLmdldFR5cGUoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBmb3JtYXQgb2YgcmVzb3VyY2UgZXJyb3Igd2l0aCByZXNwZWN0aXZlIHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gYWN0aW9uU3RhdHVzLiBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgYWN0aW9uU3RhdHVzIGlzIGFueW5vbW91c2x5IGNvbnZlcnRlZCBmcm9tIHN0b3JhZ2Ugb3BlcmF0aW9uLCBhbmQgdGhlIGNhbGxlciBkb2Vzbid0IGtub3cgd2hhdCBhY3Rpb25TdGF0dXMgaGUKKwkgKiByZWNlaXZlZC4gSXQncyBjYWxsZXIncyByZXNwb25pc2liaWxpdHkgdG8gZmlsbCB0aGUgcGFzc2VkIHJlc291cmNlIG9iamVjdCB3aXRoIG5lZWRlZCBmaWVsZHMuCisJICogCisJICogQHBhcmFtIGFjdGlvblN0YXR1cworCSAqIEBwYXJhbSB1c2VyCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEJ5VXNlcihBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBVc2VyIHVzZXIpIHsKKwkJaWYgKHVzZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCX0KKwkJUmVzcG9uc2VGb3JtYXQgcmVxdWVzdEVycm9yV3JhcHBlcjsKKwkJc3dpdGNoIChhY3Rpb25TdGF0dXMpIHsKKwkJY2FzZSBJTlZBTElEX1VTRVJfSUQ6CisJCQlyZXF1ZXN0RXJyb3JXcmFwcGVyID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCWJyZWFrOworCQljYXNlIElOVkFMSURfRU1BSUxfQUREUkVTUzoKKwkJCXJlcXVlc3RFcnJvcldyYXBwZXIgPSBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIHVzZXIuZ2V0RW1haWwoKSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlZBTElEX1JPTEU6CisJCQlyZXF1ZXN0RXJyb3JXcmFwcGVyID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCB1c2VyLmdldFJvbGUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBVU0VSX05PVF9GT1VORDoKKwkJY2FzZSBVU0VSX0FMUkVBRFlfRVhJU1Q6CisJCWNhc2UgVVNFUl9JTkFDVElWRToKKwkJY2FzZSBVU0VSX0hBU19BQ1RJVkVfRUxFTUVOVFM6CisJCQlyZXF1ZXN0RXJyb3JXcmFwcGVyID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVxdWVzdEVycm9yV3JhcHBlciA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcmVxdWVzdEVycm9yV3JhcHBlcjsKKwl9CisKKwlwdWJsaWMgUmVzcG9uc2VGb3JtYXQgZ2V0UmVzcG9uc2VGb3JtYXRCeVVzZXJJZChBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBTdHJpbmcgdXNlcklkKSB7CisJCVVzZXIgdXNlciA9IG5ldyBVc2VyKCk7CisJCXVzZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCXJldHVybiBnZXRSZXNwb25zZUZvcm1hdEJ5VXNlcihhY3Rpb25TdGF0dXMsIHVzZXIpOworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEJ5REUoQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywgU3RyaW5nIHNlcnZpY2VJZCwgU3RyaW5nIGVudk5hbWUpIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisKKwkJc3dpdGNoIChhY3Rpb25TdGF0dXMpIHsKKwkJY2FzZSBESVNUUklCVVRJT05fRU5WSVJPTk1FTlRfTk9UX0FWQUlMQUJMRToKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkRJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfQVZBSUxBQkxFLCBlbnZOYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5ESVNUUklCVVRJT05fRU5WSVJPTk1FTlRfTk9UX0ZPVU5ELCBlbnZOYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSSUJVVElPTl9BUlRJRkFDVF9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5ESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5ELCBzZXJ2aWNlSWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisJfQorCisJcHVibGljIFJlc3BvbnNlRm9ybWF0IGdldFJlc3BvbnNlRm9ybWF0QnlBcnRpZmFjdElkKEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIFN0cmluZyBhcnRpZmFjdElkKSB7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCisJCXN3aXRjaCAoYWN0aW9uU3RhdHVzKSB7CisJCWNhc2UgUkVTT1VSQ0VfTk9UX0ZPVU5EOgorCQljYXNlIEFSVElGQUNUX05PVF9GT1VORDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORCwgYXJ0aWZhY3RJZCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKwl9CisKKwlwdWJsaWMgUmVzcG9uc2VGb3JtYXQgZ2V0SW52YWxpZENvbnRlbnRFcnJvckFuZEF1ZGl0KFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSByZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCWxvZy5kZWJ1ZygiYXVkaXQgYmVmb3JlIHNlbmRpbmcgcmVzcG9uc2UiKTsKKwkJYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBhY3Rpb25FbnVtLCBudWxsKTsKKwkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRJbnZhbGlkQ29udGVudEVycm9yQW5kQXVkaXRDb21wb25lbnQoVXNlciB1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0gdHlwZUVudW0pIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSByZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCWxvZy5kZWJ1ZygiYXVkaXQgYmVmb3JlIHNlbmRpbmcgcmVzcG9uc2UiKTsKKwkJYXVkaXRDb21wb25lbnRBZG1pbihyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBhY3Rpb25FbnVtLCB0eXBlRW51bSk7CisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdFJlc291cmNlKFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0LCBVc2VyIG1vZGlmaWVyLCBSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHByZXZTdGF0ZSwgU3RyaW5nIHByZXZWZXJzaW9uLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMpIHsKKwkJaWYgKGFjdGlvbkVudW0gIT0gbnVsbCkgeworCQkJbG9nLnRyYWNlKCJJbnNpZGUgYXVkaXRpbmcgZm9yIGF1ZGl0IGFjdGlvbiB7fSIsIGFjdGlvbkVudW0ubmFtZSgpKTsKKwkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCQlTdHJpbmcgbWVzc2FnZSA9ICIiOworCisJCQlpZiAocmVzcG9uc2VGb3JtYXQuZ2V0TWVzc2FnZUlkKCkgIT0gbnVsbCkgeworCQkJCW1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSArICI6ICI7CisJCQl9CisJCQltZXNzYWdlICs9IHJlc3BvbnNlRm9ybWF0LmdldEZvcm1hdHRlZE1lc3NhZ2UoKTsKKworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb25FbnVtLmdldE5hbWUoKSk7CisKKwkJCXVwZGF0ZVVzZXJGaWVsZHMobW9kaWZpZXIsIGF1ZGl0aW5nRmllbGRzKTsKKworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9QUkVWX1ZFUlNJT04sIHByZXZWZXJzaW9uKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfU1RBVEUsIHByZXZTdGF0ZSk7CisJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJCS8vIGZpZWxkcyB0aGF0IGFyZSBmaWxsZWQgZHVyaW5nIGNyZWF0aW9uIGFuZCBtaWdodCBzdGlsbCBiZQorCQkJCS8vIGVtcHR5CisJCQkJU3RyaW5nIHJlc291cmNlQ3VyclZlcnNpb24gPSAocmVzb3VyY2UuZ2V0VmVyc2lvbigpICE9IG51bGwpID8gcmVzb3VyY2UuZ2V0VmVyc2lvbigpIDogIiI7CisJCQkJU3RyaW5nIHJlc291cmNlQ3VyclN0YXRlID0gKHJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkgIT0gbnVsbCkgPyByZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLm5hbWUoKSA6ICIiOworCQkJCVN0cmluZyB1dWlkID0gKHJlc291cmNlLmdldFVVSUQoKSAhPSBudWxsKSA/IHJlc291cmNlLmdldFVVSUQoKSA6ICIiOworCQkJCVN0cmluZyBpbnZhcmlhbnRVVUlEID0gKHJlc291cmNlLmdldEludmFyaWFudFVVSUQoKSAhPSBudWxsKSA/IHJlc291cmNlLmdldEludmFyaWFudFVVSUQoKSA6ICIiOworCisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sIHJlc291cmNlQ3VyclZlcnNpb24pOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUsIHJlc291cmNlQ3VyclN0YXRlKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCB1dWlkKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9JTlZBUklBTlRfVVVJRCwgaW52YXJpYW50VVVJRCk7CisKKwkJCX0gZWxzZSB7CisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfSU5WQVJJQU5UX1VVSUQsICIiKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCAiIik7CisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgIiIpOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTiwgIiIpOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUsICIiKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9JTlZBUklBTlRfVVVJRCwgIiIpOworCQkJfQorCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWVzc2FnZSk7CisKKwkJCS8vIEluIHRob3NlIHNwZWNpZmljIGNhc2VzIHdlIHdhbnQgc29tZSBzcGVjaWZpYyBmaWVsZHMgZnJvbQorCQkJLy8gcmVzb3VyY2Ugb2JqZWN0CisJCQlzd2l0Y2ggKGFjdGlvbkVudW0pIHsKKwkJCWNhc2UgSU1QT1JUX1JFU09VUkNFOgorCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RPU0NBX05PREVfVFlQRSwgcmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVE9TQ0FfTk9ERV9UWVBFLCAiIik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gVGhpcyBpcyB0byBhZGQvb3ZlcndyaXRlIGFueXRoaW5nIHNldCBpbiB0aGlzIGZ1bmN0aW9uIGlmIHNvbWUKKwkJCS8vIHBhcmFtcyB3ZXJlIHBhc3NlZCBmcm9tIGFib3ZlLAorCQkJLy8gZm9yIGV4YW1wbGUgcmVzb3VyY2VOYW1lIG9mIHJlc291cmNlIGltcG9ydAorCQkJaWYgKGFkZGl0aW9uYWxQYXJhbXMgIT0gbnVsbCkgeworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dEFsbChhZGRpdGlvbmFsUGFyYW1zKTsKKwkJCX0KKworCQkJZ2V0QXVkaXRpbmdNYW5hZ2VyKCkuYXVkaXRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVXNlckZpZWxkcyhVc2VyIG1vZGlmaWVyLCBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKwkJaWYgKG1vZGlmaWVyICE9IG51bGwpIHsKKwkJCVN0cmluZyBmaXJzdE5hbWUgPSBtb2RpZmllci5nZXRGaXJzdE5hbWUoKTsKKwkJCVN0cmluZyBsYXN0TmFtZSA9IG1vZGlmaWVyLmdldExhc3ROYW1lKCk7CisJCQlpZiAoZmlyc3ROYW1lICE9IG51bGwgfHwgbGFzdE5hbWUgIT0gbnVsbCkgey8vIHRvIHByZXZlbnQgIm51bGwKKwkJCQkJCQkJCQkJCQkJLy8gbnVsbCIgbmFtZXMKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9OQU1FLCBmaXJzdE5hbWUgKyAiICIgKyBsYXN0TmFtZSk7CisJCQl9CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0RGlzdHJpYnV0aW9uRG93bmxvYWQoUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcykgeworCQlsb2cudHJhY2UoIkluc2lkZSBhdWRpdGluZyBmb3IgYXVkaXQgYWN0aW9uIHt9IiwgYWN0aW9uRW51bS5uYW1lKCkpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWlmIChyZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlID0gcmVzcG9uc2VGb3JtYXQuZ2V0TWVzc2FnZUlkKCkgKyAiOiAiOworCQl9CisJCW1lc3NhZ2UgKz0gcmVzcG9uc2VGb3JtYXQuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIGFjdGlvbkVudW0uZ2V0TmFtZSgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtZXNzYWdlKTsKKworCQkvLyBUaGlzIGlzIHRvIGFkZC9vdmVyd3JpdGUgYW55dGhpbmcgc2V0IGluIHRoaXMgZnVuY3Rpb24gaWYgc29tZSBwYXJhbXMKKwkJLy8gd2VyZSBwYXNzZWQgZnJvbSBhYm92ZSwKKwkJLy8gZm9yIGV4YW1wbGUgcmVzb3VyY2VOYW1lIG9mIHJlc291cmNlIGltcG9ydAorCQlpZiAoYWRkaXRpb25hbFBhcmFtcyAhPSBudWxsKSB7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXRBbGwoYWRkaXRpb25hbFBhcmFtcyk7CisJCX0KKworCQlnZXRBdWRpdGluZ01hbmFnZXIoKS5hdWRpdEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdEV4dGVybmFsR2V0QXNzZXQoUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcykgeworCQlsb2cudHJhY2UoIkluc2lkZSBhdWRpdGluZyBmb3IgYXVkaXQgYWN0aW9uIHt9IiwgYWN0aW9uRW51bS5uYW1lKCkpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWlmIChyZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlID0gcmVzcG9uc2VGb3JtYXQuZ2V0TWVzc2FnZUlkKCkgKyAiOiAiOworCQl9CisJCW1lc3NhZ2UgKz0gcmVzcG9uc2VGb3JtYXQuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIGFjdGlvbkVudW0uZ2V0TmFtZSgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtZXNzYWdlKTsKKworCQlpZiAoYWRkaXRpb25hbFBhcmFtcyAhPSBudWxsKSB7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXRBbGwoYWRkaXRpb25hbFBhcmFtcyk7CisJCX0KKworCQlnZXRBdWRpdGluZ01hbmFnZXIoKS5hdWRpdEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdEV4dGVybmFsQ3J1ZEFwaUFydGlmYWN0KFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0LCBTdHJpbmcgY29tcG9uZW50VHlwZSwgU3RyaW5nIGFjdGlvbkVudW0sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcykgeworCQlsb2cudHJhY2UoIkluc2lkZSBhdWRpdGluZyBmb3IgYXVkaXQgYWN0aW9uIHt9IiwgYWN0aW9uRW51bSk7CisJCVN0cmluZyBpbnN0YW5jZUlkSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKTsKKwkJU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJaW50IHN0YXR1cyA9IHJlc3BvbnNlRm9ybWF0LmdldFN0YXR1cygpOworCQlTdHJpbmcgbWVzc2FnZSA9ICIiOworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQlpZiAocmVzcG9uc2VGb3JtYXQuZ2V0TWVzc2FnZUlkKCkgIT0gbnVsbCkgeworCQkJbWVzc2FnZSA9IHJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpICsgIjogIjsKKwkJfQorCQltZXNzYWdlICs9IHJlc3BvbnNlRm9ybWF0LmdldEZvcm1hdHRlZE1lc3NhZ2UoKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb25FbnVtKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELCBpbnN0YW5jZUlkSGVhZGVyKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwgcmVxdWVzdFVSSSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUsIGNvbXBvbmVudFR5cGUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIHN0YXR1cyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1lc3NhZ2UpOworCisJCWlmIChhZGRpdGlvbmFsUGFyYW1zICE9IG51bGwpIHsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dEFsbChhZGRpdGlvbmFsUGFyYW1zKTsKKwkJfQorCisJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0RXh0ZXJuYWxEb3dubG9hZEFydGlmYWN0KFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0LCBTdHJpbmcgY29tcG9uZW50VHlwZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zKSB7CisJCWF1ZGl0RXh0ZXJuYWxDcnVkQXBpQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIEF1ZGl0aW5nQWN0aW9uRW51bS5ET1dOTE9BRF9BUlRJRkFDVC5nZXROYW1lKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0RXh0ZXJuYWxVcGxvYWRBcnRpZmFjdChSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCwgU3RyaW5nIGNvbXBvbmVudFR5cGUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcykgeworCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSk7CisJCWFkZGl0aW9uYWxQYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUFJFVl9BUlRJRkFDVF9VVUlELCAiIik7CisJCWF1ZGl0RXh0ZXJuYWxDcnVkQXBpQXJ0aWZhY3QocmVzcG9uc2VGb3JtYXQsIGNvbXBvbmVudFR5cGUsIEF1ZGl0aW5nQWN0aW9uRW51bS5BUlRJRkFDVF9VUExPQURfQllfQVBJLmdldE5hbWUoKSwgcmVxdWVzdCwgYWRkaXRpb25hbFBhcmFtcyk7CisJfQorCisJcHVibGljIHZvaWQgYXVkaXRFeHRlcm5hbFVwZGF0ZUFydGlmYWN0KFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0LCBTdHJpbmcgY29tcG9uZW50VHlwZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zKSB7CisJCWFkZGl0aW9uYWxQYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELCByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpKTsKKwkJYWRkaXRpb25hbFBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9QUkVWX0FSVElGQUNUX1VVSUQsICIiKTsKKwkJYXVkaXRFeHRlcm5hbENydWRBcGlBcnRpZmFjdChyZXNwb25zZUZvcm1hdCwgY29tcG9uZW50VHlwZSwgQXVkaXRpbmdBY3Rpb25FbnVtLkFSVElGQUNUX1VQREFURV9CWV9BUEkuZ2V0TmFtZSgpLCByZXF1ZXN0LCBhZGRpdGlvbmFsUGFyYW1zKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdEV4dGVybmFsRGVsZXRlQXJ0aWZhY3QoUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQsIFN0cmluZyBjb21wb25lbnRUeXBlLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMpIHsKKwkJYWRkaXRpb25hbFBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsIHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikpOworCQlhZGRpdGlvbmFsUGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1BSRVZfQVJUSUZBQ1RfVVVJRCwgIiIpOworCQlhdWRpdEV4dGVybmFsQ3J1ZEFwaUFydGlmYWN0KHJlc3BvbnNlRm9ybWF0LCBjb21wb25lbnRUeXBlLCBBdWRpdGluZ0FjdGlvbkVudW0uQVJUSUZBQ1RfREVMRVRFX0JZX0FQSS5nZXROYW1lKCksIHJlcXVlc3QsIGFkZGl0aW9uYWxQYXJhbXMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0Q2F0ZWdvcnkoUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQsIFVzZXIgbW9kaWZpZXIsIFN0cmluZyBjYXRlZ29yeU5hbWUsIFN0cmluZyBzdWJDYXRlZ29yeU5hbWUsIFN0cmluZyBncm91cGluZ05hbWUsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBTdHJpbmcgY29tcG9uZW50VHlwZSkgeworCQlsb2cudHJhY2UoIkluc2lkZSBhdWRpdGluZyBmb3IgYXVkaXQgYWN0aW9uIHt9IiwgYWN0aW9uRW51bS5uYW1lKCkpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisKKwkJaWYgKHJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpICE9IG51bGwpIHsKKwkJCW1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSArICI6ICI7CisJCX0KKwkJbWVzc2FnZSArPSByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCk7CisKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJdXBkYXRlVXNlckZpZWxkcyhtb2RpZmllciwgYXVkaXRpbmdGaWVsZHMpOworCQkvLyBTdHJpbmcgY29tcG9uZW50VHlwZVN0ciA9IChjb21wb25lbnRUeXBlRW51bSAhPSBudWxsID8KKwkJLy8gY29tcG9uZW50VHlwZUVudW0uZ2V0VmFsdWUoKSA6IG51bGwpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLCBjb21wb25lbnRUeXBlKTsKKworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIGFjdGlvbkVudW0uZ2V0TmFtZSgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBtZXNzYWdlKTsKKworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DQVRFR09SWV9OQU1FLCBjYXRlZ29yeU5hbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVUJfQ0FURUdPUllfTkFNRSwgc3ViQ2F0ZWdvcnlOYW1lKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfR1JPVVBJTkdfTkFNRSwgZ3JvdXBpbmdOYW1lKTsKKwkJZ2V0QXVkaXRpbmdNYW5hZ2VyKCkuYXVkaXRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VSZXNwb25zZSkgeworCisJCXJldHVybiBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShzdG9yYWdlUmVzcG9uc2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwl9CisKKwlwdWJsaWMgQWN0aW9uU3RhdHVzIGNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVJlc3BvbnNlLCBDb21wb25lbnRUeXBlRW51bSB0eXBlKSB7CisKKwkJQWN0aW9uU3RhdHVzIHJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQlpZiAoc3RvcmFnZVJlc3BvbnNlID09IG51bGwpIHsKKwkJCXJldHVybiByZXNwb25zZUVudW07CisJCX0KKwkJc3dpdGNoIChzdG9yYWdlUmVzcG9uc2UpIHsKKwkJY2FzZSBPSzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5PSzsKKwkJCWJyZWFrOworCQljYXNlIENPTk5FQ1RJT05fRkFJTFVSRToKKwkJY2FzZSBHUkFQSF9JU19MT0NLOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBCQURfUkVRVUVTVDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQ7CisJCQlicmVhazsKKwkJY2FzZSBFTlRJVFlfQUxSRUFEWV9FWElTVFM6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVDsKKwkJCWJyZWFrOworCQljYXNlIFBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuUEFSRU5UX1JFU09VUkNFX05PVF9GT1VORDsKKwkJCWJyZWFrOworCQljYXNlIE1VTFRJUExFX1BBUkVOVF9SRVNPVVJDRV9GT1VORDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5NVUxUSVBMRV9QQVJFTlRfUkVTT1VSQ0VfRk9VTkQ7CisJCQlicmVhazsKKwkJY2FzZSBOT1RfRk9VTkQ6CisJCQlpZiAoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UgPT0gdHlwZSkgeworCQkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQ7CisJCQl9IGVsc2UgaWYgKENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QgPT0gdHlwZSkgeworCQkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5QUk9EVUNUX05PVF9GT1VORDsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5EOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRkFJTEVEX1RPX0xPQ0tfRUxFTUVOVDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5fVVNFOworCQkJYnJlYWs7CisJCWNhc2UgQVJUSUZBQ1RfTk9UX0ZPVU5EOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9GT1VORDsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSX0VOVklST05NRU5UX05PVF9BVkFJTEFCTEU6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuRElTVFJJQlVUSU9OX0VOVklST05NRU5UX05PVF9BVkFJTEFCTEU7CisJCQlicmVhazsKKwkJY2FzZSBESVNUUl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuRElTVFJJQlVUSU9OX0VOVklST05NRU5UX05PVF9GT1VORDsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSX0VOVklST05NRU5UX1NFTlRfSVNfSU5WQUxJRDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5ESVNUUklCVVRJT05fRU5WSVJPTk1FTlRfSU5WQUxJRDsKKwkJCWJyZWFrOworCQljYXNlIERJU1RSX0FSVElGQUNUX05PVF9GT1VORDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5ESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5EOworCQkJYnJlYWs7CisJCWNhc2UgSU5WQUxJRF9UWVBFOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVDsKKwkJCWJyZWFrOworCQljYXNlIElOVkFMSURfVkFMVUU6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UOworCQkJYnJlYWs7CisJCWNhc2UgQ1NBUl9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuQ1NBUl9OT1RfRk9VTkQ7CisJCQlicmVhazsKKwkJY2FzZSBQUk9QRVJUWV9OQU1FX0FMUkVBRFlfRVhJU1RTOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLlBST1BFUlRZX05BTUVfQUxSRUFEWV9FWElTVFM7CisJCQlicmVhazsKKwkJY2FzZSBNQVRDSF9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9OT1RfRk9VTkRfRk9SX0NBVEVHT1JZOworCQkJYnJlYWs7CisJCWNhc2UgQ0FURUdPUllfTk9UX0ZPVU5EOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKwkJbG9nLmRlYnVnKCJjb252ZXJ0IHN0b3JhZ2UgcmVzcG9uc2Uge30gdG8gYWN0aW9uIHJlc3BvbnNlIHt9Iiwgc3RvcmFnZVJlc3BvbnNlLm5hbWUoKSwgcmVzcG9uc2VFbnVtLm5hbWUoKSk7CisJCXJldHVybiByZXNwb25zZUVudW07CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVRvc2NhRXJyb3IoVG9zY2FFcnJvciB0b3NjYUVycm9yKSB7CisJCUFjdGlvblN0YXR1cyByZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJaWYgKHRvc2NhRXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3BvbnNlRW51bTsKKwkJfQorCQlzd2l0Y2ggKHRvc2NhRXJyb3IpIHsvLyBUT0RPIG1hdGNoIGVycm9ycworCQljYXNlIE5PREVfVFlQRV9DQVBBQklMSVRZX0VSUk9SOgorCQljYXNlIE5PVF9TVVBQT1JURURfVE9TQ0FfVFlQRToKKwkJY2FzZSBOT0RFX1RZUEVfUkVRVUlSRU1FTlRfRVJST1I6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXNwb25zZUVudW07CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckNhcGFiaWxpdHlUeXBlKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVJlc3BvbnNlKSB7CisJCUFjdGlvblN0YXR1cyByZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKworCQlzd2l0Y2ggKHN0b3JhZ2VSZXNwb25zZSkgeworCQljYXNlIE9LOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLk9LOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTkVDVElPTl9GQUlMVVJFOgorCQljYXNlIEdSQVBIX0lTX0xPQ0s6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIEJBRF9SRVFVRVNUOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVDsKKwkJCWJyZWFrOworCQljYXNlIEVOVElUWV9BTFJFQURZX0VYSVNUUzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5DQVBBQklMSVRZX1RZUEVfQUxSRUFEWV9FWElTVDsKKwkJCWJyZWFrOworCQljYXNlIFNDSEVNQV9WSU9MQVRJT046CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuQ0FQQUJJTElUWV9UWVBFX0FMUkVBRFlfRVhJU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKwkJbG9nLmRlYnVnKCJjb252ZXJ0IHN0b3JhZ2UgcmVzcG9uc2Uge30gdG8gYWN0aW9uIHJlc3BvbnNlIHt9Iiwgc3RvcmFnZVJlc3BvbnNlLm5hbWUoKSwgcmVzcG9uc2VFbnVtLm5hbWUoKSk7CisJCXJldHVybiByZXNwb25zZUVudW07CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckxpZmVjeWNsZVR5cGUoU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlUmVzcG9uc2UpIHsKKwkJQWN0aW9uU3RhdHVzIHJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCisJCXN3aXRjaCAoc3RvcmFnZVJlc3BvbnNlKSB7CisJCWNhc2UgT0s6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuT0s7CisJCQlicmVhazsKKwkJY2FzZSBDT05ORUNUSU9OX0ZBSUxVUkU6CisJCWNhc2UgR1JBUEhfSVNfTE9DSzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJYnJlYWs7CisJCWNhc2UgQkFEX1JFUVVFU1Q6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UOworCQkJYnJlYWs7CisJCWNhc2UgRU5USVRZX0FMUkVBRFlfRVhJU1RTOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkxJRkVDWUNMRV9UWVBFX0FMUkVBRFlfRVhJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBTQ0hFTUFfVklPTEFUSU9OOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkxJRkVDWUNMRV9UWVBFX0FMUkVBRFlfRVhJU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKwkJbG9nLmRlYnVnKCJjb252ZXJ0IHN0b3JhZ2UgcmVzcG9uc2Uge30gdG8gYWN0aW9uIHJlc3BvbnNlIHt9Iiwgc3RvcmFnZVJlc3BvbnNlLm5hbWUoKSwgcmVzcG9uc2VFbnVtLm5hbWUoKSk7CisJCXJldHVybiByZXNwb25zZUVudW07CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2UoU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlUmVzcG9uc2UsIGJvb2xlYW4gaXNSZWxhdGlvbikgeworCQlBY3Rpb25TdGF0dXMgcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisKKwkJc3dpdGNoIChzdG9yYWdlUmVzcG9uc2UpIHsKKwkJY2FzZSBPSzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5PSzsKKwkJCWJyZWFrOworCQljYXNlIElOVkFMSURfSUQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfQkFEX1JFUVVFU1Q7CisJCQlicmVhazsKKwkJY2FzZSBJTlZBTElEX1BST1BFUlRZOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFk7CisJCQlicmVhazsKKwkJY2FzZSBHUkFQSF9JU19MT0NLOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBCQURfUkVRVUVTVDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQ7CisJCQlicmVhazsKKwkJY2FzZSBNQVRDSF9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTUFUQ0hfTk9UX0ZPVU5EOworCQkJYnJlYWs7CisJCWNhc2UgU0NIRU1BX1ZJT0xBVElPTjoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9BTFJFQURZX0VYSVNUOworCQkJYnJlYWs7CisJCWNhc2UgTk9UX0ZPVU5EOgorCQkJaWYgKGlzUmVsYXRpb24pIHsKKwkJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfUkVMQVRJT05fTk9UX0ZPVU5EOworCQkJfSBlbHNlIHsKKwkJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisJCWxvZy5kZWJ1ZygiY29udmVydCBzdG9yYWdlIHJlc3BvbnNlIHt9IHRvIGFjdGlvbiByZXNwb25zZSB7fSIsIHN0b3JhZ2VSZXNwb25zZS5uYW1lKCksIHJlc3BvbnNlRW51bS5uYW1lKCkpOworCQlyZXR1cm4gcmVzcG9uc2VFbnVtOworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEZvclJlc291cmNlSW5zdGFuY2UoQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUpIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisKKwkJc3dpdGNoIChhY3Rpb25TdGF0dXMpIHsKKwkJY2FzZSBSRVNPVVJDRV9JTlNUQU5DRV9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgcmVzb3VyY2VJbnN0YW5jZU5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgc2VydmljZU5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUpIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisKKwkJc3dpdGNoIChhY3Rpb25TdGF0dXMpIHsKKwkJY2FzZSBSRVNPVVJDRV9JTlNUQU5DRV9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgcmVzb3VyY2VJbnN0YW5jZU5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvclJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eShTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VSZXNwb25zZSkgeworCQlBY3Rpb25TdGF0dXMgcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisKKwkJc3dpdGNoIChzdG9yYWdlUmVzcG9uc2UpIHsKKwkJY2FzZSBPSzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5PSzsKKwkJCWJyZWFrOworCQljYXNlIElOVkFMSURfSUQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfQkFEX1JFUVVFU1Q7CisJCQlicmVhazsKKwkJY2FzZSBHUkFQSF9JU19MT0NLOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBCQURfUkVRVUVTVDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQ7CisJCQlicmVhazsKKwkJY2FzZSBNQVRDSF9OT1RfRk9VTkQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfSU5TVEFOQ0VfTUFUQ0hfTk9UX0ZPVU5EOworCQkJYnJlYWs7CisJCWNhc2UgU0NIRU1BX1ZJT0xBVElPTjoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5SRVNPVVJDRV9JTlNUQU5DRV9BTFJFQURZX0VYSVNUOworCQkJYnJlYWs7CisJCWNhc2UgTk9UX0ZPVU5EOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlicmVhazsKKwkJfQorCQlsb2cuZGVidWcoImNvbnZlcnQgc3RvcmFnZSByZXNwb25zZSB7fSB0byBhY3Rpb24gcmVzcG9uc2Uge30iLCBzdG9yYWdlUmVzcG9uc2UubmFtZSgpLCByZXNwb25zZUVudW0ubmFtZSgpKTsKKwkJcmV0dXJuIHJlc3BvbnNlRW51bTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdENvbXBvbmVudEFkbWluKFJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0LCBVc2VyIG1vZGlmaWVyLCBDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgcHJldlN0YXRlLCBTdHJpbmcgcHJldlZlcnNpb24sIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBDb21wb25lbnRUeXBlRW51bSB0eXBlKSB7CisJCWF1ZGl0Q29tcG9uZW50KHJlc3BvbnNlRm9ybWF0LCBtb2RpZmllciwgY29tcG9uZW50LCBwcmV2U3RhdGUsIHByZXZWZXJzaW9uLCBhY3Rpb25FbnVtLCB0eXBlLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdENvbXBvbmVudChSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCwgVXNlciBtb2RpZmllciwgQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHByZXZTdGF0ZSwgU3RyaW5nIHByZXZWZXJzaW9uLCBBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgQ29tcG9uZW50VHlwZUVudW0gdHlwZSwgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMpIHsKKwkJaWYgKGFjdGlvbkVudW0gIT0gbnVsbCkgeworCQkJbG9nLnRyYWNlKCJJbnNpZGUgYXVkaXRpbmcgZm9yIGF1ZGl0IGFjdGlvbiB7fSIsIGFjdGlvbkVudW0ubmFtZSgpKTsKKwkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisKKwkJCWludCBzdGF0dXMgPSByZXNwb25zZUZvcm1hdC5nZXRTdGF0dXMoKTsKKwkJCVN0cmluZyBtZXNzYWdlID0gIiI7CisKKwkJCWlmIChyZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKSB7CisJCQkJbWVzc2FnZSA9IHJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpICsgIjogIjsKKwkJCX0KKwkJCW1lc3NhZ2UgKz0gcmVzcG9uc2VGb3JtYXQuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpOworCisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIGFjdGlvbkVudW0uZ2V0TmFtZSgpKTsKKworCQkJdXBkYXRlVXNlckZpZWxkcyhtb2RpZmllciwgYXVkaXRpbmdGaWVsZHMpOworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwgdHlwZS5nZXRWYWx1ZSgpLnJlcGxhY2UoIiAiLCAiIikpOworCisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9QUkVWX1ZFUlNJT04sIHByZXZWZXJzaW9uKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfU1RBVEUsIHByZXZTdGF0ZSk7CisJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKwkJCQkvLyBmaWVsZHMgdGhhdCBhcmUgZmlsbGVkIGR1cmluZyBjcmVhdGlvbiBhbmQgbWlnaHQgc3RpbGwgYmUKKwkJCQkvLyBlbXB0eQorCQkJCVN0cmluZyByZXNvdXJjZUN1cnJWZXJzaW9uID0gY29tcG9uZW50LmdldFZlcnNpb24oKTsKKwkJCQlTdHJpbmcgcmVzb3VyY2VDdXJyU3RhdGUgPSAoY29tcG9uZW50LmdldExpZmVjeWNsZVN0YXRlKCkgIT0gbnVsbCkgPyBjb21wb25lbnQuZ2V0TGlmZWN5Y2xlU3RhdGUoKS5uYW1lKCkgOiAiIjsKKwkJCQlTdHJpbmcgcmVzb3VyY2VVdWlkID0gKGNvbXBvbmVudC5nZXRVVUlEKCkgIT0gbnVsbCkgPyBjb21wb25lbnQuZ2V0VVVJRCgpIDogIiI7CisJCQkJU3RyaW5nIGludmFyaWFudFVVSUQgPSAoY29tcG9uZW50LmdldEludmFyaWFudFVVSUQoKSAhPSBudWxsKSA/IGNvbXBvbmVudC5nZXRJbnZhcmlhbnRVVUlEKCkgOiAiIjsKKworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sIHJlc291cmNlQ3VyclZlcnNpb24pOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUsIHJlc291cmNlQ3VyclN0YXRlKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCByZXNvdXJjZVV1aWQpOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0lOVkFSSUFOVF9VVUlELCBpbnZhcmlhbnRVVUlEKTsKKwkJCX0gZWxzZSB7CisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgIiIpOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTiwgIiIpOworCQkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUsICIiKTsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCAiIik7CisJCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfSU5WQVJJQU5UX1VVSUQsICIiKTsKKwkJCX0KKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgc3RhdHVzKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1lc3NhZ2UpOworCisJCQkvLyBUaGlzIGlzIG1lYW50IHRvIG92ZXJ3cml0ZSBhbnl0aGluZyBzZXQgaW4gdGhpcyBmdW5jdGlvbiBpZiBzb21lCisJCQkvLyBwYXJhbXMgd2VyZSBwYXNzZWQgZnJvbSBhYm92ZSwKKwkJCS8vIGZvciBleGFtcGxlIHJlc291cmNlTmFtZSBvZiByZXNvdXJjZSBpbXBvcnQKKwkJCWlmIChhZGRpdGlvbmFsUGFyYW1zICE9IG51bGwpIHsKKwkJCQlhdWRpdGluZ0ZpZWxkcy5wdXRBbGwoYWRkaXRpb25hbFBhcmFtcyk7CisJCQl9CisKKwkJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYXVkaXREaXN0cmlidXRpb25FbmdpbmUoQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIFN0cmluZyBlbnZpcm9ubWVudE5hbWUsIFN0cmluZyB0b3BpY05hbWUsIFN0cmluZyByb2xlLCBTdHJpbmcgYXBpS2V5LCBTdHJpbmcgc3RhdHVzKSB7CisKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb25FbnVtLmdldE5hbWUoKSk7CisKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0VOVlJJT05NRU5UX05BTUUsIGVudmlyb25tZW50TmFtZSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9UT1BJQ19OQU1FLCB0b3BpY05hbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUk9MRSwgcm9sZSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9BUElfS0VZLCBhcGlLZXkpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIHN0YXR1cyk7CisKKwkJZ2V0QXVkaXRpbmdNYW5hZ2VyKCkuYXVkaXRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJfQorCisJcHVibGljIHZvaWQgYXVkaXREaXN0cmlidXRpb25Ob3RpZmljYXRpb24oQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIFN0cmluZyBzZXJ2aWNlVVVJRCwgU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIHJlc291cmNlVHlwZSwgU3RyaW5nIGN1cnJWZXJzaW9uLCBTdHJpbmcgbW9kaWZpZXJVaWQsIFN0cmluZyBtb2RpZmllck5hbWUsIFN0cmluZyBlbnZpcm9ubWVudE5hbWUsIFN0cmluZyBjdXJyU3RhdGUsCisJCQlTdHJpbmcgdG9waWNOYW1lLCBTdHJpbmcgZGlzdHJpYnV0aW9uSWQsIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHN0YXR1cykgeworCisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uRW51bS5nZXROYW1lKCkpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCBzZXJ2aWNlVVVJRCk7CisKKwkJLy8gYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0VOVlJJT05NRU5UX05BTUUsCisJCS8vIGVudmlyb25tZW50TmFtZSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9UT1BJQ19OQU1FLCB0b3BpY05hbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIGRpc3RyaWJ1dGlvbklkKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sIGN1cnJWZXJzaW9uKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9TVEFURSwgY3VyclN0YXRlKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2VUeXBlKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgZGVzY3JpcHRpb24pOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsIG1vZGlmaWVyVWlkKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSwgbW9kaWZpZXJOYW1lKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgcmVzb3VyY2VOYW1lKTsKKworCQlnZXRBdWRpdGluZ01hbmFnZXIoKS5hdWRpdEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdEF1dGhFdmVudChBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgU3RyaW5nIHVybCwgU3RyaW5nIHVzZXIsIFN0cmluZyBhdXRoU3RhdHVzLCBTdHJpbmcgcmVhbG0pIHsKKworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIGFjdGlvbkVudW0uZ2V0TmFtZSgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQVVUSF9VUkwsIHVybCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfVVNFUiwgdXNlcik7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfU1RBVFVTLCBhdXRoU3RhdHVzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQVVUSF9SRUFMTSwgcmVhbG0pOworCQlnZXRBdWRpdGluZ01hbmFnZXIoKS5hdWRpdEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdERpc3RyaWJ1dGlvblN0YXR1c05vdGlmaWNhdGlvbihBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgU3RyaW5nIGRpc3RyaWJ1dGlvbklkLCBTdHJpbmcgY29uc3VtZXJJZCwgU3RyaW5nIHRvcGljTmFtZSwgU3RyaW5nIHJlc291cmNlVXJsLCBTdHJpbmcgc3RhdHVzVGltZSwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGVycm9yUmVhc29uKSB7CisKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb25FbnVtLmdldE5hbWUoKSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQsIGRpc3RyaWJ1dGlvbklkKTsKKwkJVGhyZWFkTG9jYWxzSG9sZGVyLnNldFV1aWQoZGlzdHJpYnV0aW9uSWQpOworCisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRCwgZGlzdHJpYnV0aW9uSWQpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsIGNvbnN1bWVySWQpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fVE9QSUNfTkFNRSwgdG9waWNOYW1lKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwgcmVzb3VyY2VVcmwpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fU1RBVFVTX1RJTUUsIHN0YXR1c1RpbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIHN0YXR1cyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIGVycm9yUmVhc29uKTsKKworCQlnZXRBdWRpdGluZ01hbmFnZXIoKS5hdWRpdEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdEdldFVlYkNsdXN0ZXIoQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIFN0cmluZyBjb25zdW1lcklkLCBTdHJpbmcgc3RhdHVzVGltZSwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb25FbnVtLmdldE5hbWUoKSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwgY29uc3VtZXJJZCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfVElNRSwgc3RhdHVzVGltZSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgc3RhdHVzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1NUQVRVU19ERVNDLCBkZXNjcmlwdGlvbik7CisKKwkJZ2V0QXVkaXRpbmdNYW5hZ2VyKCkuYXVkaXRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJfQorCisJcHVibGljIHZvaWQgYXVkaXRNaXNzaW5nSW5zdGFuY2VJZChBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb25FbnVtLmdldE5hbWUoKSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCwgbnVsbCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCwgbnVsbCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgc3RhdHVzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgZGVzY3JpcHRpb24pOworCisJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0VG9waWNBQ0xLZXlzKEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBTdHJpbmcgZW52TmFtZSwgU3RyaW5nIHRvcGljTmFtZSwgU3RyaW5nIHJvbGUsIFN0cmluZyBhcGlQdWJsaWNLZXksIFN0cmluZyBzdGF0dXMpIHsKKworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIGFjdGlvbkVudW0uZ2V0TmFtZSgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0VOVlJJT05NRU5UX05BTUUsIGVudk5hbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fVE9QSUNfTkFNRSwgdG9waWNOYW1lKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JPTEUsIHJvbGUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQVBJX0tFWSwgYXBpUHVibGljS2V5KTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCisJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0UmVnaXN0ZXJPclVuUmVnaXN0ZXJFdmVudChBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgU3RyaW5nIGNvbnN1bWVySWQsIFN0cmluZyBhcGlQdWJsaWNLZXksIFN0cmluZyBlbnZOYW1lLCBTdHJpbmcgc3RhdHVzLCBTdHJpbmcgc3RhdHVzRGVzYywgU3RyaW5nIG5vdGlmVG9waWNOYW1lLCBTdHJpbmcgc3RhdHVzVG9waWNOYW1lKSB7CisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uRW51bS5nZXROYW1lKCkpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsIGNvbnN1bWVySWQpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQVBJX0tFWSwgYXBpUHVibGljS2V5KTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0VOVlJJT05NRU5UX05BTUUsIGVudk5hbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIHN0YXR1cyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfREVTQywgc3RhdHVzRGVzYyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9OT1RJRklDQVRJT05fVE9QSUNfTkFNRSwgbm90aWZUb3BpY05hbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fU1RBVFVTX1RPUElDX05BTUUsIHN0YXR1c1RvcGljTmFtZSk7CisJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0U2VydmljZURpc3RyaWJ1dGlvbkRlcGxveWVkKEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgU3RyaW5nIHNlcnZpY2VVVUlELCBTdHJpbmcgZGlzdHJpYnV0aW9uSWQsIFN0cmluZyBzdGF0dXMsIFN0cmluZyBkZXNjLCBVc2VyIG1vZGlmaWVyKSB7CisKKwkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb25FbnVtLmdldE5hbWUoKSk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsIHNlcnZpY2VVVUlEKTsKKworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9OQU1FLCBtb2RpZmllci5nZXRGaXJzdE5hbWUoKSArICIgIiArIG1vZGlmaWVyLmdldExhc3ROYW1lKCkpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSwgIlNlcnZpY2UiKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgc2VydmljZU5hbWUpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sIHNlcnZpY2VWZXJzaW9uKTsKKworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIGRpc3RyaWJ1dGlvbklkKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBkZXNjKTsKKworCQlnZXRBdWRpdGluZ01hbmFnZXIoKS5hdWRpdEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdENvbnN1bWVyQ3JlZGVudGlhbHNFdmVudChBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgQ29uc3VtZXJEZWZpbml0aW9uIGNvbnN1bWVyLCBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCwgVXNlciBtb2RpZmllcikgeworCisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uRW51bS5nZXROYW1lKCkpOworCQlpZiAobW9kaWZpZXIgIT0gbnVsbCkgeworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSwgbW9kaWZpZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyBtb2RpZmllci5nZXRMYXN0TmFtZSgpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQl9CisJCVN0cmluZ0J1aWxkZXIgZWNvbXBVc2VyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaWYgKGNvbnN1bWVyICE9IG51bGwpIHsKKwkJCWlmIChjb25zdW1lci5nZXRDb25zdW1lck5hbWUoKSAhPSBudWxsICYmICFjb25zdW1lci5nZXRDb25zdW1lck5hbWUoKS50cmltKCkuaXNFbXB0eSgpKSB7CisJCQkJZWNvbXBVc2VyLmFwcGVuZChjb25zdW1lci5nZXRDb25zdW1lck5hbWUoKSk7CisJCQl9CisJCQlpZiAoY29uc3VtZXIuZ2V0Q29uc3VtZXJTYWx0KCkgIT0gbnVsbCAmJiAhY29uc3VtZXIuZ2V0Q29uc3VtZXJTYWx0KCkudHJpbSgpLmlzRW1wdHkoKSkgeworCQkJCWlmIChlY29tcFVzZXIubGVuZ3RoKCkgPiAwKSB7CisJCQkJCWVjb21wVXNlci5hcHBlbmQoIiwiKTsKKwkJCQl9CisJCQkJZWNvbXBVc2VyLmFwcGVuZChjb25zdW1lci5nZXRDb25zdW1lclNhbHQoKSk7CisJCQl9CisJCQlpZiAoY29uc3VtZXIuZ2V0Q29uc3VtZXJQYXNzd29yZCgpICE9IG51bGwgJiYgIWNvbnN1bWVyLmdldENvbnN1bWVyUGFzc3dvcmQoKS50cmltKCkuaXNFbXB0eSgpKSB7CisJCQkJaWYgKGVjb21wVXNlci5sZW5ndGgoKSA+IDApIHsKKwkJCQkJZWNvbXBVc2VyLmFwcGVuZCgiLCIpOworCQkJCX0KKwkJCQllY29tcFVzZXIuYXBwZW5kKGNvbnN1bWVyLmdldENvbnN1bWVyUGFzc3dvcmQoKSk7CisJCQl9CisJCX0KKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRUNPTVBfVVNFUiwgZWNvbXBVc2VyLnRvU3RyaW5nKCkpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisKKwkJaWYgKHJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpICE9IG51bGwpIHsKKwkJCW1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSArICI6ICI7CisJCX0KKwkJbWVzc2FnZSArPSByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgc3RhdHVzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWVzc2FnZSk7CisKKwkJZ2V0QXVkaXRpbmdNYW5hZ2VyKCkuYXVkaXRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJfQorCisJcHVibGljIHZvaWQgYXVkaXRHZXRVc2Vyc0xpc3QoQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIFVzZXIgbW9kaWZpZXIsIFN0cmluZyBkZXRhaWxzLCBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCkgeworCisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uRW51bS5nZXROYW1lKCkpOworCQlpZiAobW9kaWZpZXIgIT0gbnVsbCkgeworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSwgbW9kaWZpZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyBtb2RpZmllci5nZXRMYXN0TmFtZSgpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQl9CisKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVVNFUl9ERVRBSUxTLCBkZXRhaWxzKTsKKwkJaW50IHN0YXR1cyA9IHJlc3BvbnNlRm9ybWF0LmdldFN0YXR1cygpOworCQlTdHJpbmcgbWVzc2FnZSA9ICIiOworCisJCWlmIChyZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlID0gcmVzcG9uc2VGb3JtYXQuZ2V0TWVzc2FnZUlkKCkgKyAiOiAiOworCQl9CisJCW1lc3NhZ2UgKz0gcmVzcG9uc2VGb3JtYXQuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIHN0YXR1cyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIG1lc3NhZ2UpOworCQlnZXRBdWRpdGluZ01hbmFnZXIoKS5hdWRpdEV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhdWRpdEFkbWluVXNlckFjdGlvbihBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgVXNlciBtb2RpZmllciwgVXNlciB1c2VyQmVmb3JlLCBVc2VyIHVzZXJBZnRlciwgUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQpIHsKKworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sIGFjdGlvbkVudW0uZ2V0TmFtZSgpKTsKKwkJaWYgKG1vZGlmaWVyICE9IG51bGwpIHsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX05BTUUsIG1vZGlmaWVyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgbW9kaWZpZXIuZ2V0TGFzdE5hbWUoKSk7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgIiIpOworCQl9CisJCWlmICh1c2VyQmVmb3JlICE9IG51bGwpIHsKKwkJCVN0cmluZyB1c2VyQmVmb3JlVXNlcklkID0gKHVzZXJCZWZvcmUuZ2V0VXNlcklkKCkgIT0gbnVsbCkgPyB1c2VyQmVmb3JlLmdldFVzZXJJZCgpIDogIiI7CisJCQlTdHJpbmcgdXNlckJlZm9yRmlyc3ROYW1lID0gKHVzZXJCZWZvcmUuZ2V0Rmlyc3ROYW1lKCkgIT0gbnVsbCkgPyAiLCAiICsgdXNlckJlZm9yZS5nZXRGaXJzdE5hbWUoKSArICIgIiA6ICIiOworCQkJU3RyaW5nIHVzZXJCZWZvckxhc3ROYW1lID0gKHVzZXJCZWZvcmUuZ2V0TGFzdE5hbWUoKSAhPSBudWxsKSA/IHVzZXJCZWZvcmUuZ2V0TGFzdE5hbWUoKSA6ICIiOworCQkJU3RyaW5nIHVzZXJCZWZvckVtYWlsID0gKHVzZXJCZWZvcmUuZ2V0RW1haWwoKSAhPSBudWxsKSA/ICIsICIgKyB1c2VyQmVmb3JlLmdldEVtYWlsKCkgOiAiIjsKKwkJCVN0cmluZyB1c2VyQmVmb3JSbG9lID0gKHVzZXJCZWZvcmUuZ2V0Um9sZSgpICE9IG51bGwpID8gIiwgIiArIHVzZXJCZWZvcmUuZ2V0Um9sZSgpIDogIiI7CisKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1VTRVJfQkVGT1JFLCB1c2VyQmVmb3JlVXNlcklkICsgdXNlckJlZm9yRmlyc3ROYW1lICsgdXNlckJlZm9yTGFzdE5hbWUgKyB1c2VyQmVmb3JFbWFpbCArIHVzZXJCZWZvclJsb2UpOworCQl9IGVsc2UgeworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVVNFUl9CRUZPUkUsICIiKTsKKwkJfQorCQlpZiAodXNlckFmdGVyICE9IG51bGwpIHsKKwkJCVN0cmluZyB1c2VyQWZ0ZXJVc2VySWQgPSAodXNlckFmdGVyLmdldFVzZXJJZCgpICE9IG51bGwpID8gdXNlckFmdGVyLmdldFVzZXJJZCgpIDogIiI7CisJCQlTdHJpbmcgdXNlckFmdGVyRmlyc3ROYW1lID0gKHVzZXJBZnRlci5nZXRGaXJzdE5hbWUoKSAhPSBudWxsKSA/ICIsICIgKyB1c2VyQWZ0ZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgOiAiIjsKKwkJCVN0cmluZyB1c2VyQWZ0ZXJMYXN0TmFtZSA9ICh1c2VyQWZ0ZXIuZ2V0TGFzdE5hbWUoKSAhPSBudWxsKSA/IHVzZXJBZnRlci5nZXRMYXN0TmFtZSgpIDogIiI7CisJCQlTdHJpbmcgdXNlckFmdGVyRW1haWwgPSAodXNlckFmdGVyLmdldEVtYWlsKCkgIT0gbnVsbCkgPyAiLCAiICsgdXNlckFmdGVyLmdldEVtYWlsKCkgOiAiIjsKKwkJCVN0cmluZyB1c2VyQWZ0ZXJSbG9lID0gKHVzZXJBZnRlci5nZXRSb2xlKCkgIT0gbnVsbCkgPyAiLCAiICsgdXNlckFmdGVyLmdldFJvbGUoKSA6ICIiOworCisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0FGVEVSLCB1c2VyQWZ0ZXJVc2VySWQgKyB1c2VyQWZ0ZXJGaXJzdE5hbWUgKyB1c2VyQWZ0ZXJMYXN0TmFtZSArIHVzZXJBZnRlckVtYWlsICsgdXNlckFmdGVyUmxvZSk7CisJCX0gZWxzZSB7CisJCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0FGVEVSLCAiIik7CisJCX0KKworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisKKwkJaWYgKHJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpICE9IG51bGwpIHsKKwkJCW1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSArICI6ICI7CisJCX0KKwkJbWVzc2FnZSArPSByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgc3RhdHVzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWVzc2FnZSk7CisJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0VXNlckFjY2VzcyhBdWRpdGluZ0FjdGlvbkVudW0gYWN0aW9uRW51bSwgVXNlciB1c2VyLCBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCkgeworCisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uRW51bS5nZXROYW1lKCkpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX1VJRCwgdXNlci5nZXRGaXJzdE5hbWUoKSArICIgIiArIHVzZXIuZ2V0TGFzdE5hbWUoKSArICcoJyArIHVzZXIuZ2V0VXNlcklkKCkgKyAnKScpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisKKwkJaWYgKHJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpICE9IG51bGwpIHsKKwkJCW1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSArICI6ICI7CisJCX0KKwkJbWVzc2FnZSArPSByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgc3RhdHVzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWVzc2FnZSk7CisJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyB2b2lkIGF1ZGl0R2V0Q2F0ZWdvcnlIaWVyYXJjaHkoQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0sIFVzZXIgbW9kaWZpZXIsIFN0cmluZyBkZXRhaWxzLCBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCkgeworCisJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcyA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uRW51bS5nZXROYW1lKCkpOworCQlpZiAobW9kaWZpZXIgIT0gbnVsbCkgeworCQkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSwgbW9kaWZpZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyBtb2RpZmllci5nZXRMYXN0TmFtZSgpKTsKKwkJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQl9CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFVEFJTFMsIGRldGFpbHMpOworCQlpbnQgc3RhdHVzID0gcmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCk7CisJCVN0cmluZyBtZXNzYWdlID0gIiI7CisKKwkJaWYgKHJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpICE9IG51bGwpIHsKKwkJCW1lc3NhZ2UgPSByZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKSArICI6ICI7CisJCX0KKwkJbWVzc2FnZSArPSByZXNwb25zZUZvcm1hdC5nZXRGb3JtYXR0ZWRNZXNzYWdlKCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgc3RhdHVzKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbWVzc2FnZSk7CisJCWdldEF1ZGl0aW5nTWFuYWdlcigpLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEJ5Q29tcG9uZW50KEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMsIENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudFR5cGVFbnVtIHR5cGUpIHsKKwkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJfQorCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKworCQlzd2l0Y2ggKGFjdGlvblN0YXR1cykgeworCQljYXNlIENPTVBPTkVOVF9WRVJTSU9OX0FMUkVBRFlfRVhJU1Q6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfVkVSU0lPTl9BTFJFQURZX0VYSVNULCB0eXBlLmdldFZhbHVlKCksIGNvbXBvbmVudC5nZXRWZXJzaW9uKCkpOworCQkJYnJlYWs7CisJCWNhc2UgUkVTT1VSQ0VfTk9UX0ZPVU5EOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELCBjb21wb25lbnQuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfTkFNRV9BTFJFQURZX0VYSVNUOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVCwgdHlwZS5nZXRWYWx1ZSgpLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfSU5fVVNFOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX1VTRSwgdHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJYnJlYWs7CisJCWNhc2UgU0VSVklDRV9ERVBMT1lNRU5UX0FSVElGQUNUX05PVF9GT1VORDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfREVQTE9ZTUVOVF9BUlRJRkFDVF9OT1RfRk9VTkQsIGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlRm9ybWF0OworCX0KKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU3RyaW5nTm90RW1wdHkoVXNlciB1c2VyLCBDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgdmFsdWUsIEFjdGlvblN0YXR1cyBiYWRSZXN1bHQsIEF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCWlmICgodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlLnRyaW0oKS5pc0VtcHR5KCkpKSB7CisJCQlsb2cuaW5mbyhiYWRSZXN1bHQubmFtZSgpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2UgPSBnZXRSZXNwb25zZUZvcm1hdChiYWRSZXN1bHQpOworCQkJaWYgKGFjdGlvbkVudW0gIT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiYXVkaXQgYmVmb3JlIHNlbmRpbmcgcmVzcG9uc2UiKTsKKwkJCQlhdWRpdENvbXBvbmVudEFkbWluKGVycm9yUmVzcG9uc2UsIHVzZXIsIGNvbXBvbmVudCwgIiIsICIiLCBhY3Rpb25FbnVtLCBnZXRDb21wb25lbnRUeXBlKGNvbXBvbmVudCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvclJlc3BvbnNlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHVibGljIEJvb2xlYW4gdmFsaWRhdGVTdHJpbmdOb3RFbXB0eShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKCh2YWx1ZSA9PSBudWxsKSB8fCAodmFsdWUudHJpbSgpLmlzRW1wdHkoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIENvbXBvbmVudFR5cGVFbnVtIGdldENvbXBvbmVudFR5cGUoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2VydmljZSkgeworCQkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0U7CisJCX0gLy8gZWxzZSBpZihjb21wb25lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZSl7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlU3RyaW5nTWF0Y2hlc1BhdHRlcm4oVXNlciB1c2VyLCBDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgdmFsdWUsIFBhdHRlcm4gcGF0dGVybiwgQWN0aW9uU3RhdHVzIGJhZFJlc3VsdCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJaWYgKCFwYXR0ZXJuLm1hdGNoZXIodmFsdWUpLm1hdGNoZXMoKSkgeworCQkJbG9nLmVycm9yKGJhZFJlc3VsdC5uYW1lKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZSA9IGdldFJlc3BvbnNlRm9ybWF0KGJhZFJlc3VsdCk7CisJCQlpZiAoYWN0aW9uRW51bSAhPSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJhdWRpdCBiZWZvcmUgc2VuZGluZyByZXNwb25zZSIpOworCQkJCWF1ZGl0Q29tcG9uZW50QWRtaW4oZXJyb3JSZXNwb25zZSwgdXNlciwgY29tcG9uZW50LCAiIiwgIiIsIGFjdGlvbkVudW0sIGdldENvbXBvbmVudFR5cGUoY29tcG9uZW50KSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yUmVzcG9uc2UpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiAiIEVycm9yOiBNaXNzaW5nIE1hbmRhdG9yeSBJbmZvcm1hdGlvbmFsICVzMSAlczIgOiAlczMgIiB3aGVyZSAlczEgLSAicmVzb3VyY2UiLyJzZXJ2aWNlIiAlczIgLSAiYXJ0aWZhY3QiLyAiYXJ0aWZhY3RzIiAlczMgLSBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtaXNzaW5nIGluZm9ybWF0aW9uYWwgYXJ0aWZhY3QgdHlwZXMKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2UKKwkgKiBAcGFyYW0gY29tcG9uZW50TWlzc2luZ01hbmRhdG9yeUFydGlmYWN0cworCSAqIEBwYXJhbSB2YWx1ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgUmVzcG9uc2VGb3JtYXQgZ2V0UmVzcG9uc2VGb3JtYXRCeU1pc3NpbmdBcnRpZmFjdHMoQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMpIHsKKworCQlTdHJpbmcgYXJ0aWZhY3RUaXRsZSA9ICJhcnRpZmFjdCI7CisJCWlmIChhcnRpZmFjdHMuc2l6ZSgpID4gMSkgeworCQkJYXJ0aWZhY3RUaXRsZSA9ICJhcnRpZmFjdHMiOworCQl9CisJCUNvbGxlY3Rpb248QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHNMYWJlbHMgPSBhcnRpZmFjdHMudmFsdWVzKCk7CisJCVN0cmluZ0J1aWxkZXIgYXJ0aWZhY3RzTGFiZWxCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzTGFiZWxzTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlhcnRpZmFjdHNMYWJlbHNMaXN0LmFkZEFsbChhcnRpZmFjdHNMYWJlbHMpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFydGlmYWN0c0xhYmVsc0xpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZiA9IGFydGlmYWN0c0xhYmVsc0xpc3QuZ2V0KGkpOworCQkJYXJ0aWZhY3RzTGFiZWxCdWlsZGVyLmFwcGVuZChhcnRpZmFjdERlZi5nZXRBcnRpZmFjdERpc3BsYXlOYW1lKCkpOworCQkJaWYgKGkgPCBhcnRpZmFjdHNMYWJlbHNMaXN0LnNpemUoKSAtIDEpIHsKKwkJCQlhcnRpZmFjdHNMYWJlbEJ1aWxkZXIuYXBwZW5kKCI7Iik7CisJCQl9CisJCX0KKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfTUFOREFUT1JZX0FSVElGQUNUUywgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgYXJ0aWZhY3RUaXRsZSwgYXJ0aWZhY3RzTGFiZWxCdWlsZGVyLnRvU3RyaW5nKCkpOworCisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKwl9CisKKwlwdWJsaWMgQWN0aW9uU3RhdHVzIGNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlRm9yQWRkaXRpb25hbEluZm9ybWF0aW9uKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVJlc3BvbnNlKSB7CisJCUFjdGlvblN0YXR1cyByZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKworCQlzd2l0Y2ggKHN0b3JhZ2VSZXNwb25zZSkgeworCQljYXNlIE9LOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLk9LOworCQkJYnJlYWs7CisJCWNhc2UgRU5USVRZX0FMUkVBRFlfRVhJU1RTOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBJTlZBTElEX0lEOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkFERElUSU9OQUxfSU5GT1JNQVRJT05fTk9UX0ZPVU5EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisJCWxvZy5kZWJ1ZygiY29udmVydCBzdG9yYWdlIHJlc3BvbnNlIHt9IHRvIGFjdGlvbiByZXNwb25zZSB7fSIsIHN0b3JhZ2VSZXNwb25zZS5uYW1lKCksIHJlc3BvbnNlRW51bS5uYW1lKCkpOworCQlyZXR1cm4gcmVzcG9uc2VFbnVtOworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0gbGFiZWxPclZhbHVlKSB7CisKKwkJaWYgKGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9PSBudWxsKSB7CisJCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKCk7CisJCX0KKwkJaWYgKGxhYmVsT3JWYWx1ZSA9PSBudWxsKSB7CisJCQlsYWJlbE9yVmFsdWUgPSBBZGRpdGlvbmFsSW5mb3JtYXRpb25FbnVtLk5vbmU7CisJCX0KKworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IG51bGw7CisJCXN3aXRjaCAoYWN0aW9uU3RhdHVzKSB7CisJCWNhc2UgQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCAiQWRkaXRpb25hbCBwYXJhbWV0ZXIiLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uZ2V0S2V5KCkpOworCQkJYnJlYWs7CisJCWNhc2UgQURESVRJT05BTF9JTkZPUk1BVElPTl9FWENFRURTX0xJTUlUOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGxhYmVsT3JWYWx1ZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgVmFsaWRhdGlvblV0aWxzLkFERElUSU9OQUxfSU5GT1JNQVRJT05fS0VZX01BWF9MRU5HVEgudG9TdHJpbmcoKSk7CisJCQlicmVhazsKKwkJY2FzZSBBRERJVElPTkFMX0lORk9STUFUSU9OX01BWF9OVU1CRVJfUkVBQ0hFRDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBub2RlVHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQlicmVhazsKKwkJY2FzZSBBRERJVElPTkFMX0lORk9STUFUSU9OX0VNUFRZX1NUUklOR19OT1RfQUxMT1dFRDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCWJyZWFrOworCQljYXNlIEFERElUSU9OQUxfSU5GT1JNQVRJT05fS0VZX05PVF9BTExPV0VEX0NIQVJBQ1RFUlM6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBBRERJVElPTkFMX0lORk9STUFUSU9OX1ZBTFVFX05PVF9BTExPV0VEX0NIQVJBQ1RFUlM6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBBRERJVElPTkFMX0lORk9STUFUSU9OX05PVF9GT1VORDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisJfQorCisJcHVibGljIFJlc3BvbnNlRm9ybWF0IGdldFJlc3BvbnNlRm9ybWF0QWRkaXRpb25hbFByb3BlcnR5KEFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMpIHsKKwkJcmV0dXJuIGdldFJlc3BvbnNlRm9ybWF0QWRkaXRpb25hbFByb3BlcnR5KGFjdGlvblN0YXR1cywgbnVsbCwgbnVsbCwgbnVsbCk7CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckNvbnN1bWVyKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVJlc3BvbnNlKSB7CisJCUFjdGlvblN0YXR1cyByZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKworCQlzd2l0Y2ggKHN0b3JhZ2VSZXNwb25zZSkgeworCQljYXNlIE9LOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLk9LOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTkVDVElPTl9GQUlMVVJFOgorCQljYXNlIEdSQVBIX0lTX0xPQ0s6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIEJBRF9SRVFVRVNUOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVDsKKwkJCWJyZWFrOworCQljYXNlIEVOVElUWV9BTFJFQURZX0VYSVNUUzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5DT05TVU1FUl9BTFJFQURZX0VYSVNUUzsKKwkJCWJyZWFrOworCQljYXNlIFNDSEVNQV9WSU9MQVRJT046CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuQ09OU1VNRVJfQUxSRUFEWV9FWElTVFM7CisJCQlicmVhazsKKwkJY2FzZSBOT1RfRk9VTkQ6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuRUNPTVBfVVNFUl9OT1RfRk9VTkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKwkJbG9nLmRlYnVnKCJjb252ZXJ0IHN0b3JhZ2UgcmVzcG9uc2Uge30gdG8gYWN0aW9uIHJlc3BvbnNlIHt9Iiwgc3RvcmFnZVJlc3BvbnNlLm5hbWUoKSwgcmVzcG9uc2VFbnVtLm5hbWUoKSk7CisJCXJldHVybiByZXNwb25zZUVudW07CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckdyb3VwVHlwZShTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VSZXNwb25zZSkgeworCQlBY3Rpb25TdGF0dXMgcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisKKwkJc3dpdGNoIChzdG9yYWdlUmVzcG9uc2UpIHsKKwkJY2FzZSBPSzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5PSzsKKwkJCWJyZWFrOworCQljYXNlIENPTk5FQ1RJT05fRkFJTFVSRToKKwkJY2FzZSBHUkFQSF9JU19MT0NLOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBCQURfUkVRVUVTVDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQ7CisJCQlicmVhazsKKwkJY2FzZSBFTlRJVFlfQUxSRUFEWV9FWElTVFM6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR1JPVVBfVFlQRV9BTFJFQURZX0VYSVNUOworCQkJYnJlYWs7CisJCWNhc2UgU0NIRU1BX1ZJT0xBVElPTjoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HUk9VUF9UWVBFX0FMUkVBRFlfRVhJU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKwkJbG9nLmRlYnVnKCJjb252ZXJ0IHN0b3JhZ2UgcmVzcG9uc2Uge30gdG8gYWN0aW9uIHJlc3BvbnNlIHt9Iiwgc3RvcmFnZVJlc3BvbnNlLm5hbWUoKSwgcmVzcG9uc2VFbnVtLm5hbWUoKSk7CisJCXJldHVybiByZXNwb25zZUVudW07CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBjb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZUZvckRhdGFUeXBlKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVJlc3BvbnNlKSB7CisJCUFjdGlvblN0YXR1cyByZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKworCQlzd2l0Y2ggKHN0b3JhZ2VSZXNwb25zZSkgeworCQljYXNlIE9LOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLk9LOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTkVDVElPTl9GQUlMVVJFOgorCQljYXNlIEdSQVBIX0lTX0xPQ0s6CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIEJBRF9SRVFVRVNUOgorCQkJcmVzcG9uc2VFbnVtID0gQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVDsKKwkJCWJyZWFrOworCQljYXNlIEVOVElUWV9BTFJFQURZX0VYSVNUUzoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5EQVRBX1RZUEVfQUxSRUFEWV9FWElTVDsKKwkJCWJyZWFrOworCQljYXNlIFNDSEVNQV9WSU9MQVRJT046CisJCQlyZXNwb25zZUVudW0gPSBBY3Rpb25TdGF0dXMuREFUQV9UWVBFX0FMUkVBRFlfRVhJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBDQU5OT1RfVVBEQVRFX0VYSVNUSU5HX0VOVElUWToKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5EQVRBX1RZUEVfQ0FOTk9UX0JFX1VQREFURURfQkFEX1JFUVVFU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRW51bSA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKwkJbG9nLmRlYnVnKCJjb252ZXJ0IHN0b3JhZ2UgcmVzcG9uc2Uge30gdG8gYWN0aW9uIHJlc3BvbnNlIHt9Iiwgc3RvcmFnZVJlc3BvbnNlLm5hbWUoKSwgcmVzcG9uc2VFbnVtLm5hbWUoKSk7CisJCXJldHVybiByZXNwb25zZUVudW07CisJfQorCisJcHVibGljIFJlc3BvbnNlRm9ybWF0IGdldFJlc3BvbnNlRm9ybWF0QnlHcm91cFR5cGUoQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywgR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGUpIHsKKwkJaWYgKGdyb3VwVHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJfQorCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKworCQlzd2l0Y2ggKGFjdGlvblN0YXR1cykgeworCQljYXNlIEdST1VQX01FTUJFUl9FTVBUWToKKwkJY2FzZSBHUk9VUF9UWVBFX0FMUkVBRFlfRVhJU1Q6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgZ3JvdXBUeXBlLmdldFR5cGUoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEJ5UG9saWN5VHlwZShBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzLCBQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xpY3lUeXBlKSB7CisJCWlmIChwb2xpY3lUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMpOworCQl9CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCisJCXN3aXRjaCAoYWN0aW9uU3RhdHVzKSB7CisJCWNhc2UgUE9MSUNZX1RZUEVfQUxSRUFEWV9FWElTVDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBwb2xpY3lUeXBlLmdldFR5cGUoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXNwb25zZUZvcm1hdDsKKworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBnZXRSZXNwb25zZUZvcm1hdEJ5RGF0YVR5cGUoQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cywgRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlLCBMaXN0PFN0cmluZz4gcHJvcGVydGllcykgeworCQlpZiAoZGF0YVR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCX0KKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisKKwkJc3dpdGNoIChhY3Rpb25TdGF0dXMpIHsKKwkJY2FzZSBEQVRBX1RZUEVfQUxSRUFEWV9FWElTVDoKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBkYXRhVHlwZS5nZXROYW1lKCkpOworCQkJYnJlYWs7CisJCWNhc2UgREFUQV9UWVBFX05PUl9QUk9QRVJUSUVTX05FSVRIRVJfREVSSVZFRF9GUk9NOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGRhdGFUeXBlLmdldE5hbWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBEQVRBX1RZUEVfUFJPUEVSVElFU19DQU5OT1RfQkVfRU1QVFk6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgZGF0YVR5cGUuZ2V0TmFtZSgpKTsKKwkJCWJyZWFrOworCQljYXNlIERBVEFfVFlQRV9QUk9QRVJUWV9BTFJFQURZX0RFRklORURfSU5fQU5DRVNUT1I6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgZGF0YVR5cGUuZ2V0TmFtZSgpLCBwcm9wZXJ0aWVzID09IG51bGwgPyAiIiA6IFN0cmluZy52YWx1ZU9mKHByb3BlcnRpZXMpKTsKKwkJCWJyZWFrOworCQljYXNlIERBVEFfVFlQRV9ERVJJVkVEX0lTX01JU1NJTkc6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgZGF0YVR5cGUuZ2V0RGVyaXZlZEZyb21OYW1lKCkpOworCQkJYnJlYWs7CisJCWNhc2UgREFUQV9UWVBFX0RVUExJQ0FURV9QUk9QRVJUWToKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0UmVzcG9uc2VGb3JtYXQoYWN0aW9uU3RhdHVzLCBkYXRhVHlwZS5nZXROYW1lKCkpOworCQkJYnJlYWs7CisJCWNhc2UgREFUQV9UWVBFX1BST0VQUlRZX0NBTk5PVF9IQVZFX1NBTUVfVFlQRV9PRl9EQVRBX1RZUEU6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgZGF0YVR5cGUuZ2V0TmFtZSgpLCBwcm9wZXJ0aWVzID09IG51bGwgPyAiIiA6IFN0cmluZy52YWx1ZU9mKHByb3BlcnRpZXMpKTsKKwkJCWJyZWFrOworCQljYXNlIERBVEFfVFlQRV9DQU5OT1RfSEFWRV9QUk9QRVJUSUVTOgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRSZXNwb25zZUZvcm1hdChhY3Rpb25TdGF0dXMsIGRhdGFUeXBlLmdldE5hbWUoKSk7CisJCQlicmVhazsKKwkJY2FzZSBEQVRBX1RZUEVfQ0FOTk9UX0JFX1VQREFURURfQkFEX1JFUVVFU1Q6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cywgZGF0YVR5cGUuZ2V0TmFtZSgpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldFJlc3BvbnNlRm9ybWF0KGFjdGlvblN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ltcGwvRG93bmxvYWRBcnRpZmFjdExvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW1wbC9Eb3dubG9hZEFydGlmYWN0TG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmY2ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ltcGwvRG93bmxvYWRBcnRpZmFjdExvZ2ljLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TdHJlYW1pbmdPdXRwdXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTY0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuUmVzb3VyY2VVcGxvYWRTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5BcnRpZmFjdEFjY2Vzc0luZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5BcnRpZmFjdEFjY2Vzc0xpc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5TZXJ2bGV0SnNvblJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR2VuZXJhbFV0aWxpdHk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgRG93bmxvYWRBcnRpZmFjdExvZ2ljIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEb3dubG9hZEFydGlmYWN0TG9naWMuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCXB1YmxpYyBSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0KGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUsIGZpbmFsIFN0cmluZyByZXNvdXJjZVZlcnNpb24sIGZpbmFsIFN0cmluZyBhcnRpZmFjdE5hbWUsIEVpdGhlcjw/IGV4dGVuZHMgRVNBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPiBnZXRBcnRpZmFjdFN0YXR1cywgU3RyaW5nIGFydGlmYWN0SWQpIHsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCWlmIChnZXRBcnRpZmFjdFN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiQ291bGQgbm90IGZpbmQgYXJ0aWZhY3QgZm9yIHdpdGggaWQ6IHt9IiwgYXJ0aWZhY3RJZCk7CisJCQlSZXNvdXJjZVVwbG9hZFN0YXR1cyBzdGF0dXMgPSBnZXRBcnRpZmFjdFN0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IHN0YXR1cy5DT01QT05FTlRfTk9UX0VYSVNUKQorCQkJCXJlc3BvbnNlID0gUmVzcG9uc2Uuc3RhdHVzKEh0dHBTdGF0dXMuU0NfTk9fQ09OVEVOVCkuYnVpbGQoKTsKKwkJCWVsc2UKKwkJCQlyZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cyhIdHRwU3RhdHVzLlNDX05PVF9GT1VORCkuYnVpbGQoKTsKKworCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9CisJCS8vIGNvbnZlcnQgYXJ0aWZhY3QgdG8gaW5wdXRzdHJlYW0KKwkJZWxzZSB7CisJCQlFU0FydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBnZXRBcnRpZmFjdFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWJ5dGVbXSBhcnRpZmFjdFBheWxvYWQgPSBhcnRpZmFjdERhdGEuZ2V0RGF0YUFzQXJyYXkoKTsKKworCQkJU3RyaW5nIHBheWxvYWRTdHIgPSBuZXcgU3RyaW5nKGFydGlmYWN0UGF5bG9hZCk7CisJCQlieXRlW10gZGVjb2RlZFBheWxvYWQgPSBhcnRpZmFjdFBheWxvYWQ7CisJCQlib29sZWFuIGlzRW5jb2RlZCA9IEdlbmVyYWxVdGlsaXR5LmlzQmFzZTY0RW5jb2RlZChwYXlsb2FkU3RyKTsKKwkJCWlmIChpc0VuY29kZWQpIHsKKwkJCQlsb2cuZGVidWcoInBheWxvYWQgaXMgZW5jb2RlZC4gcGVyZm9ybSBkZWNvZGUiKTsKKwkJCQlkZWNvZGVkUGF5bG9hZCA9IEJhc2U2NC5kZWNvZGUobmV3IFN0cmluZyhhcnRpZmFjdFBheWxvYWQpKTsKKwkJCX0KKwkJCWZpbmFsIElucHV0U3RyZWFtIGFydGlmYWN0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRlY29kZWRQYXlsb2FkKTsKKwkJCWxvZy5kZWJ1ZygiZm91bmQgYXJ0aWZhY3QgZm9yIHdpdGggaWQ6IHt9IiwgYXJ0aWZhY3RJZCk7CisJCQl0cnkgeworCisJCQkJLy8gb3V0cHV0c3RyZWFtIGZvciByZXNwb25zZQorCQkJCVN0cmVhbWluZ091dHB1dCBzdHJlYW0gPSBuZXcgU3RyZWFtaW5nT3V0cHV0KCkgeworCQkJCQlwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJSU9VdGlscy5jb3B5KGFydGlmYWN0U3RyZWFtLCBvdXRwdXQpOworCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9OworCQkJCWFydGlmYWN0U3RyZWFtLmNsb3NlKCk7CisJCQkJcmV0dXJuIFJlc3BvbnNlLm9rKHN0cmVhbSkudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpLmhlYWRlcigiY29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyBmaWxlbmFtZSA9ICIgKyBhcnRpZmFjdE5hbWUpCisJCQkJCQkvLyAuaGVhZGVyKENvbnN0YW50cy5NRDVfSEVBREVSLCBuZXcKKwkJCQkJCS8vIFN0cmluZyhhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpKSkKKwkJCQkJCS5idWlsZCgpOworCisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJGYWlsZWQgdG8gc3RyZWFtIGFydGlmYWN0IGRhdGEgb24gdGhlIHJlc3BvbnNlIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIkZhaWxlZCB0byBzdHJlYW0gYXJ0aWZhY3QgZGF0YSBvbiB0aGUgcmVzcG9uc2UiKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBzdHJlYW0gYXJ0aWZhY3QgZGF0YSBvbiB0aGUgcmVzcG9uc2U6IHt9IiwgZS5nZXRNZXNzYWdlKCkpOworCQkJCXJlc3BvbnNlID0gYnVpbGRSZXNwb25zZShIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgIkZhaWxlZCB0byBzdHJlYW0gYXJ0aWZhY3QgZGF0YSBvbiB0aGUgcmVzcG9uc2UiKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgTGlzdDxBcnRpZmFjdEFjY2Vzc0luZm8+IGNvbnZlcnRBcnRpZmFjdExpc3QoTGlzdDw/IGV4dGVuZHMgRVNBcnRpZmFjdERhdGE+IGFydGlmYWN0c0xpc3QsIFN0cmluZyBzZXJ2bGV0UGF0aCkgeworCisJCUxpc3Q8QXJ0aWZhY3RBY2Nlc3NJbmZvPiBhcnRpZmFjdEFjY2Vzc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0QWNjZXNzSW5mbz4oKTsKKwkJZm9yIChFU0FydGlmYWN0RGF0YSBhcnRpZmFjdCA6IGFydGlmYWN0c0xpc3QpIHsKKwkJCUFydGlmYWN0QWNjZXNzSW5mbyBhY2Nlc3NJbmZvID0gbmV3IEFydGlmYWN0QWNjZXNzSW5mbyhhcnRpZmFjdCwgc2VydmxldFBhdGgpOworCQkJYXJ0aWZhY3RBY2Nlc3NMaXN0LmFkZChhY2Nlc3NJbmZvKTsKKwkJfQorCQlyZXR1cm4gYXJ0aWZhY3RBY2Nlc3NMaXN0OworCX0KKworCXB1YmxpYyBSZXNwb25zZSBjcmVhdGVBcnRpZmFjdExpc3RSZXNwb25zZShmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIEVpdGhlcjxMaXN0PEVTQXJ0aWZhY3REYXRhPiwgUmVzb3VyY2VVcGxvYWRTdGF0dXM+IGdldEFydGlmYWN0c1N0YXR1cy8qCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBMaXN0IDwgPyBleHRlbmRzIElSZXNvdXJjZURhdGE+IGFydGlmYWN0c0xpc3QKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqLywgU3RyaW5nIHNlcnZsZXRQYXRoKSB7CisJCVJlc3BvbnNlIHJlc3BvbnNlOworCQlMaXN0PEFydGlmYWN0QWNjZXNzSW5mbz4gYXJ0aWZhY3RBY2Nlc3NJbmZvczsKKwkJaWYgKGdldEFydGlmYWN0c1N0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCS8vIGlmIHRoZXJlIGFyZSBubyBhcnRpZmFjdHMgLSByZXR1cm4gTm8tQ29udGVudAorCQkJUmVzb3VyY2VVcGxvYWRTdGF0dXMgc3RhdHVzID0gZ2V0QXJ0aWZhY3RzU3RhdHVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gUmVzb3VyY2VVcGxvYWRTdGF0dXMuQ09NUE9ORU5UX05PVF9FWElTVCB8fCBzdGF0dXMgPT0gUmVzb3VyY2VVcGxvYWRTdGF0dXMuU0VSVklDRV9OT1RfRVhJU1QpIHsKKwkJCQlsb2cuZGVidWcoInJlc291cmNlIHt9IGRvZXMgbm90IGV4aXN0Iiwgc2VydmljZU5hbWUpOworCQkJCXJlc3BvbnNlID0gUmVzcG9uc2Uuc3RhdHVzKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5EKS5lbnRpdHkoIltdIikuYnVpbGQoKTsKKworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIk5vIGNvbnRlbnQgd2FzIGZvdW5kIGZvciB7fSIsIHNlcnZpY2VOYW1lKTsKKwkJCQlyZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cyhIdHRwU3RhdHVzLlNDX05PX0NPTlRFTlQpLmVudGl0eSgiW10iKS5idWlsZCgpOworCQkJfQorCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9IGVsc2UgeworCQkJTGlzdDw/IGV4dGVuZHMgRVNBcnRpZmFjdERhdGE+IGFydGlmYWN0c0xpc3QgPSBnZXRBcnRpZmFjdHNTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoInt9IGFydGlmYWN0cyB3ZXJlIGZvdW5kIGZvciB7fSIsIGFydGlmYWN0c0xpc3Quc2l6ZSgpLCBzZXJ2aWNlTmFtZSk7CisJCQlhcnRpZmFjdEFjY2Vzc0luZm9zID0gY29udmVydEFydGlmYWN0TGlzdChhcnRpZmFjdHNMaXN0LCBzZXJ2bGV0UGF0aCk7CisKKwkJCVN0cmluZyBhcnRpZmFjdERhdGFKc29uID0gZ3Nvbi50b0pzb24obmV3IEFydGlmYWN0QWNjZXNzTGlzdChhcnRpZmFjdEFjY2Vzc0luZm9zKSk7CisJCQlyZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cyhIdHRwU3RhdHVzLlNDX09LKS5lbnRpdHkoYXJ0aWZhY3REYXRhSnNvbikudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5idWlsZCgpOworCisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKwl9CisKKwlwdWJsaWMgUmVzcG9uc2UgYnVpbGRSZXNwb25zZShpbnQgc3RhdHVzLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CisKKwkJU2VydmxldEpzb25SZXNwb25zZSBqc29uUmVzcG9uc2UgPSBuZXcgU2VydmxldEpzb25SZXNwb25zZSgpOworCQlqc29uUmVzcG9uc2Uuc2V0RGVzY3JpcHRpb24oZXJyb3JNZXNzYWdlKTsKKwkJanNvblJlc3BvbnNlLnNldFNvdXJjZShDb25zdGFudHMuQ0FUQUxPR19CRSk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5zdGF0dXMoc3RhdHVzKS5lbnRpdHkoanNvblJlc3BvbnNlKS5idWlsZCgpOworCisJCXJldHVybiByZXNwb25zZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbXBsL1NlcnZsZXRVdGlscy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ltcGwvU2VydmxldFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZDliZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbXBsL1NlcnZsZXRVdGlscy5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuSVVzZXJCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworQENvbXBvbmVudCgic2VydmxldFV0aWxzIikKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0VXRpbHMgeworCUBSZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKwlwcml2YXRlIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJQFJlc291cmNlCisJcHJpdmF0ZSBJVXNlckJ1c2luZXNzTG9naWMgYWRtaW5NYW5hZ2VyOworCisJcHVibGljIENvbXBvbmVudHNVdGlscyBnZXRDb21wb25lbnRzVXRpbHMoKSB7CisJCXJldHVybiBjb21wb25lbnRzVXRpbHM7CisJfQorCisJcHVibGljIEdzb24gZ2V0R3NvbigpIHsKKwkJcmV0dXJuIGdzb247CisJfQorCisJcHVibGljIElVc2VyQnVzaW5lc3NMb2dpYyBnZXRVc2VyQWRtaW4oKSB7CisJCXJldHVybiBhZG1pbk1hbmFnZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2ltcGwvV2ViQXBwQ29udGV4dFdyYXBwZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbXBsL1dlYkFwcENvbnRleHRXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyMTk4NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbXBsL1dlYkFwcENvbnRleHRXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGw7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5zdXBwb3J0LldlYkFwcGxpY2F0aW9uQ29udGV4dFV0aWxzOworCitwdWJsaWMgY2xhc3MgV2ViQXBwQ29udGV4dFdyYXBwZXIgeworCisJcHVibGljIFdlYkFwcGxpY2F0aW9uQ29udGV4dCBnZXRXZWJBcHBDb250ZXh0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKworCQlyZXR1cm4gV2ViQXBwbGljYXRpb25Db250ZXh0VXRpbHMuZ2V0V2ViQXBwbGljYXRpb25Db250ZXh0KGNvbnRleHQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQXJ0aWZhY3RBY2Nlc3NJbmZvLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9BcnRpZmFjdEFjY2Vzc0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI0NDZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQXJ0aWZhY3RBY2Nlc3NJbmZvLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRVNBcnRpZmFjdERhdGE7CisKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdEFjY2Vzc0luZm8geworCisJcHVibGljIEFydGlmYWN0QWNjZXNzSW5mbygpIHsKKwl9CisKKwlwdWJsaWMgQXJ0aWZhY3RBY2Nlc3NJbmZvKEVTQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSkgeworCQkvLyB0aGlzLm5hbWUgPSBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3ROYW1lKCk7CisJCXRoaXMuaWQgPSBhcnRpZmFjdERhdGEuZ2V0SWQoKTsKKwkJLy8gdGhpcy50eXBlID0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0VHlwZSgpOworCQkvLyB0aGlzLmRlc2NyaXB0aW9uID0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKTsKKwkJLy8gdGhpcy5jcmVhdG9yID0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0Q3JlYXRvcigpOworCQkvLyBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpOworCQkvLyBEYXRlIGNyZWF0aW9uVGltZXN0YW1wID0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0Q3JlYXRpb25UaW1lc3RhbXAoKTsKKwkJLy8gdGhpcy5jcmVhdGlvblRpbWUgPSAoY3JlYXRpb25UaW1lc3RhbXAgIT0KKwkJLy8gbnVsbCk/ZGF0ZUZvcm1hdC5mb3JtYXQoY3JlYXRpb25UaW1lc3RhbXApOiBudWxsOworCQkvLyBEYXRlIHVwZGF0ZVRpbWVzdGFtcCA9IGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdExhc3RVcGRhdGVUaW1lc3RhbXAoKTsKKwkJLy8gdGhpcy5sYXN0VXBkYXRlVGltZSA9ICh1cGRhdGVUaW1lc3RhbXAgIT0KKwkJLy8gbnVsbCk/ZGF0ZUZvcm1hdC5mb3JtYXQodXBkYXRlVGltZXN0YW1wKTpudWxsOworCQkvLyB0aGlzLmxhc3RVcGRhdGVyID0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0TGFzdFVwZGF0ZXIoKTsKKwkJLy8gaWYgKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdENoZWNrc3VtKCkgIT0gbnVsbCl7CisJCS8vIHRoaXMuY2hlY2tzdW0gPSBuZXcgU3RyaW5nKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdENoZWNrc3VtKCkpOworCQkvLyB9IGVsc2UgeworCQkvLyB0aGlzLmNoZWNrc3VtID0gbnVsbDsKKwkJLy8gfQorCX0KKworCXB1YmxpYyBBcnRpZmFjdEFjY2Vzc0luZm8oRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhLCBTdHJpbmcgc2VydmxldENvbnRleHQpIHsKKwkJLy8gdGhpcy5uYW1lID0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0TmFtZSgpOworCQlTdHJpbmdCdWlsZGVyIHVybEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQl1cmxCdWlsZGVyID0gdXJsQnVpbGRlci5hcHBlbmQoc2VydmxldENvbnRleHQpLmFwcGVuZCgiLyIpOworCQkvLyBpZiAoQXJ0aWZhY3REYXRhRW51bS5DT01QT05FTlRfQVJUSUZBQ1QuZXF1YWxzKHJlc291cmNlKSl7CisJCXVybEJ1aWxkZXIuYXBwZW5kKCJyZXNvdXJjZXMvIikKKwkJCQkvLyAuYXBwZW5kKGFydGlmYWN0RGF0YS5nZXRSZXNvdXJjZUlkKCkpLmFwcGVuZCgiLyIpCisKKwkJCQkuYXBwZW5kKCIvYXJ0aWZhY3RzLyIpOworCQkvKgorCQkgKiB9ZWxzZSB7IFNlcnZpY2VBcnRpZmFjdERhdGEgc2VydmljZUFydGlmYWN0ID0gKFNlcnZpY2VBcnRpZmFjdERhdGEpYXJ0aWZhY3REYXRhOyB1cmxCdWlsZGVyLmFwcGVuZCgic2VydmljZXMvIikgLmFwcGVuZChzZXJ2aWNlQXJ0aWZhY3QuZ2V0U2VydmljZU5hbWUoKSkuYXBwZW5kKCIvIikgLmFwcGVuZChzZXJ2aWNlQXJ0aWZhY3QuZ2V0U2VydmljZVZlcnNpb24oKSkgLmFwcGVuZCgiL2FydGlmYWN0cy8iKQorCQkgKiAuYXBwZW5kKHNlcnZpY2VBcnRpZmFjdC5nZXROb2RlVGVtcGxhdGVOYW1lKCkpIC5hcHBlbmQoIi8iKTsgfQorCQkgKi8KKwkJLy8gdXJsQnVpbGRlci5hcHBlbmQoYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJdGhpcy51cmwgPSB1cmxCdWlsZGVyLnRvU3RyaW5nKCk7CisKKwl9CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIHVybDsKKwlwcml2YXRlIFN0cmluZyBpZDsKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCXByaXZhdGUgU3RyaW5nIGNyZWF0b3I7CisJcHJpdmF0ZSBTdHJpbmcgY3JlYXRpb25UaW1lOworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVyOworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVUaW1lOworCXByaXZhdGUgU3RyaW5nIGNoZWNrc3VtOworCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yKCkgeworCQlyZXR1cm4gY3JlYXRvcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdG9yKFN0cmluZyBjcmVhdG9yKSB7CisJCXRoaXMuY3JlYXRvciA9IGNyZWF0b3I7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdGlvblRpbWUoKSB7CisJCXJldHVybiBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKFN0cmluZyBjcmVhdGlvblRpbWUpIHsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlcigpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVyKFN0cmluZyBsYXN0VXBkYXRlcikgeworCQl0aGlzLmxhc3RVcGRhdGVyID0gbGFzdFVwZGF0ZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlVGltZSgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVUaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVUaW1lKFN0cmluZyBsYXN0VXBkYXRlVGltZSkgeworCQl0aGlzLmxhc3RVcGRhdGVUaW1lID0gbGFzdFVwZGF0ZVRpbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDaGVja3N1bSgpIHsKKwkJcmV0dXJuIGNoZWNrc3VtOworCX0KKworCXB1YmxpYyB2b2lkIHNldENoZWNrc3VtKFN0cmluZyBjaGVja3N1bSkgeworCQl0aGlzLmNoZWNrc3VtID0gY2hlY2tzdW07CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQXJ0aWZhY3RBY2Nlc3NMaXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9BcnRpZmFjdEFjY2Vzc0xpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGViMDUwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQXJ0aWZhY3RBY2Nlc3NMaXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEFydGlmYWN0QWNjZXNzTGlzdCB7CisKKwlwdWJsaWMgQXJ0aWZhY3RBY2Nlc3NMaXN0KExpc3Q8QXJ0aWZhY3RBY2Nlc3NJbmZvPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJcHJpdmF0ZSBMaXN0PEFydGlmYWN0QWNjZXNzSW5mbz4gYXJ0aWZhY3RzOworCisJcHVibGljIExpc3Q8QXJ0aWZhY3RBY2Nlc3NJbmZvPiBnZXRBcnRpZmFjdHMoKSB7CisJCXJldHVybiBhcnRpZmFjdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RzKExpc3Q8QXJ0aWZhY3RBY2Nlc3NJbmZvPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQXJ0aWZhY3REZWZpbml0aW9uSW5mby5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQXJ0aWZhY3REZWZpbml0aW9uSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2QyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9BcnRpZmFjdERlZmluaXRpb25JbmZvLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm87CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdERlZmluaXRpb25JbmZvIHsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCS8qKiBTcGVjaWZpZXMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgYXJ0aWZhY3QuICovCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3ROYW1lOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0RGlzcGxheU5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RWZXJzaW9uOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0VVVJRDsKKworCXB1YmxpYyBBcnRpZmFjdERlZmluaXRpb25JbmZvKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24pIHsKKwkJdW5pcXVlSWQgPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwkJYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TmFtZSgpOworCQlhcnRpZmFjdERpc3BsYXlOYW1lID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0RGlzcGxheU5hbWUoKTsKKwkJYXJ0aWZhY3RWZXJzaW9uID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VmVyc2lvbigpOworCQlhcnRpZmFjdFVVSUQgPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RVVUlEKCk7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdE5hbWUoU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQl0aGlzLmFydGlmYWN0TmFtZSA9IGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGlzcGxheU5hbWUoKSB7CisJCXJldHVybiBhcnRpZmFjdERpc3BsYXlOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGlzcGxheU5hbWUoU3RyaW5nIGFydGlmYWN0RGlzcGxheU5hbWUpIHsKKwkJdGhpcy5hcnRpZmFjdERpc3BsYXlOYW1lID0gYXJ0aWZhY3REaXNwbGF5TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VmVyc2lvbigpIHsKKwkJcmV0dXJuIGFydGlmYWN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFZlcnNpb24oU3RyaW5nIGFydGlmYWN0VmVyc2lvbikgeworCQl0aGlzLmFydGlmYWN0VmVyc2lvbiA9IGFydGlmYWN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VVVJRCgpIHsKKwkJcmV0dXJuIGFydGlmYWN0VVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFVVSUQoU3RyaW5nIGFydGlmYWN0VVVJRCkgeworCQl0aGlzLmFydGlmYWN0VVVJRCA9IGFydGlmYWN0VVVJRDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0FydGlmYWN0VGVtcGxhdGVJbmZvLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9BcnRpZmFjdFRlbXBsYXRlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTdiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9BcnRpZmFjdFRlbXBsYXRlSW5mby5qYXZhCkBAIC0wLDAgKzEsMzUyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLkRlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdFR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIEFydGlmYWN0VGVtcGxhdGVJbmZvIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRSA9ICJmaWxlTmFtZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WID0gImVudiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfQkFTRSA9ICJpc0Jhc2UiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTQVJfSEVBVCA9ICJIRUFUIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NBUl9BUlRJRkFDVCA9ICJhcnRpZmFjdHMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDU0FSX05FVFdPUksgPSAibmV0d29yayI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTQVJfVk9MVU1FID0gInZvbHVtZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTQVJfTkVTVEVEID0gIm5lc3RlZCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IERFU0MgPSAiZGVzY3JpcHRpb24iOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBcnRpZmFjdFRlbXBsYXRlSW5mby5jbGFzcy5nZXROYW1lKCkpOworCVN0cmluZyB0eXBlOworCVN0cmluZyBmaWxlTmFtZTsKKwlTdHJpbmcgZW52OworCWJvb2xlYW4gaXNCYXNlOworCVN0cmluZyBncm91cE5hbWU7CisJU3RyaW5nIGRlc2NyaXB0aW9uOworCisJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVsYXRlZEFydGlmYWN0c0luZm87CisJcHJpdmF0ZSBzdGF0aWMgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCXB1YmxpYyBBcnRpZmFjdFRlbXBsYXRlSW5mbygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQXJ0aWZhY3RUZW1wbGF0ZUluZm8oU3RyaW5nIHR5cGUsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGVudiwgTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVsYXRlZEFydGlmYWN0c0luZm8pIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworCQl0aGlzLmVudiA9IGVudjsKKwkJdGhpcy5yZWxhdGVkQXJ0aWZhY3RzSW5mbyA9IHJlbGF0ZWRBcnRpZmFjdHNJbmZvOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7CisJCXJldHVybiBmaWxlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKKwkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RW52KCkgeworCQlyZXR1cm4gZW52OworCX0KKworCXB1YmxpYyB2b2lkIHNldEVudihTdHJpbmcgZW52KSB7CisJCXRoaXMuZW52ID0gZW52OworCX0KKworCXB1YmxpYyBMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBnZXRSZWxhdGVkQXJ0aWZhY3RzSW5mbygpIHsKKwkJcmV0dXJuIHJlbGF0ZWRBcnRpZmFjdHNJbmZvOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlbGF0ZWRBcnRpZmFjdHNJbmZvKExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRBcnRpZmFjdHNJbmZvKSB7CisJCXRoaXMucmVsYXRlZEFydGlmYWN0c0luZm8gPSByZWxhdGVkQXJ0aWZhY3RzSW5mbzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEdyb3VwTmFtZSgpIHsKKwkJcmV0dXJuIGdyb3VwTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cE5hbWUoU3RyaW5nIGdyb3VwTmFtZSkgeworCQl0aGlzLmdyb3VwTmFtZSA9IGdyb3VwTmFtZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Jhc2UoKSB7CisJCXJldHVybiBpc0Jhc2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmFzZShib29sZWFuIGlzQmFzZSkgeworCQl0aGlzLmlzQmFzZSA9IGlzQmFzZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkFydGlmYWN0VGVtcGxhdGVJbmZvIFt0eXBlPSIgKyB0eXBlICsgIiwgZmlsZU5hbWU9IiArIGZpbGVOYW1lICsgIiwgZW52PSIgKyBlbnYgKyAiLCBpc0Jhc2U9IiArIGlzQmFzZSArICIsIGdyb3VwTmFtZT0iICsgZ3JvdXBOYW1lICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsgIiwgcmVsYXRlZEFydGlmYWN0c0luZm89IiArIHJlbGF0ZWRBcnRpZmFjdHNJbmZvICsgIl0iOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPEFydGlmYWN0VGVtcGxhdGVJbmZvLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQXJ0aWZhY3RUZW1wbGF0ZUluZm9Gcm9tSnNvbihDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzLCBTdHJpbmcgdHlwZSwgTWFwPFN0cmluZywgT2JqZWN0PiBvLCBMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBjcmVhdGVkQXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0LAorCQkJQXJ0aWZhY3RUZW1wbGF0ZUluZm8gcGFyZW50QXJ0aWZhY3QpIHsKKwkJU3RyaW5nIGNvbnRlbnQgPSBnc29uLnRvSnNvbihvKTsKKwkJSnNvbk9iamVjdCBqc29uRWxlbWVudCA9IG5ldyBKc29uT2JqZWN0KCk7CisJCUFydGlmYWN0VGVtcGxhdGVJbmZvIHJlc291cmNlSW5mbyA9IG5ldyBBcnRpZmFjdFRlbXBsYXRlSW5mbygpOworCisJCWpzb25FbGVtZW50ID0gZ3Nvbi5mcm9tSnNvbihjb250ZW50LCBqc29uRWxlbWVudC5nZXRDbGFzcygpKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFydGlmYWN0VGVtcGxhdGVNYXAgPSBjb21wb25lbnRzVXRpbHMucGFyc2VKc29uVG9PYmplY3QoanNvbkVsZW1lbnQudG9TdHJpbmcoKSwgSGFzaE1hcC5jbGFzcyk7CisJCWlmIChhcnRpZmFjdFRlbXBsYXRlTWFwLmNvbnRhaW5zS2V5KFRZUEUpKQorCQkJcmVzb3VyY2VJbmZvLnNldFR5cGUoKFN0cmluZykgYXJ0aWZhY3RUZW1wbGF0ZU1hcC5nZXQoVFlQRSkpOworCQlpZiAoYXJ0aWZhY3RUZW1wbGF0ZU1hcC5jb250YWluc0tleShGSUxFX05BTUUpKQorCQkJcmVzb3VyY2VJbmZvLnNldEZpbGVOYW1lKChTdHJpbmcpIGFydGlmYWN0VGVtcGxhdGVNYXAuZ2V0KEZJTEVfTkFNRSkpOworCQlpZiAoYXJ0aWZhY3RUZW1wbGF0ZU1hcC5jb250YWluc0tleShJU19CQVNFKSkKKwkJCXJlc291cmNlSW5mby5zZXRCYXNlKChCb29sZWFuKSBhcnRpZmFjdFRlbXBsYXRlTWFwLmdldChJU19CQVNFKSk7CisJCWlmIChhcnRpZmFjdFRlbXBsYXRlTWFwLmNvbnRhaW5zS2V5KEVOVikpIHsKKwkJCU9iamVjdCBlbnZPYmogPSBhcnRpZmFjdFRlbXBsYXRlTWFwLmdldChFTlYpOworCQkJU3RyaW5nIGVudlN0ciA9ICIiOworCQkJaWYgKGVudk9iaiBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCWVudlN0ciA9IChTdHJpbmcpIGVudk9iajsKKwkJCX0gZWxzZSBpZiAoZW52T2JqIGluc3RhbmNlb2YgTWFwKSB7CisJCQkJTWFwIGVudk1hcCA9IChNYXApIGVudk9iajsKKwkJCQlpZiAoZW52TWFwLmNvbnRhaW5zS2V5KEZJTEVfTkFNRSkpIHsKKwkJCQkJZW52U3RyID0gKFN0cmluZykgZW52TWFwLmdldChGSUxFX05BTUUpOworCQkJCX0KKwkJCX0KKwkJCXJlc291cmNlSW5mby5zZXRFbnYoZW52U3RyKTsKKwkJfQorCQlpZiAoYXJ0aWZhY3RUZW1wbGF0ZU1hcC5jb250YWluc0tleShERVNDKSkgeworCQkJcmVzb3VyY2VJbmZvLnNldERlc2NyaXB0aW9uKChTdHJpbmcpIGFydGlmYWN0VGVtcGxhdGVNYXAuZ2V0KERFU0MpKTsKKwkJfSBlbHNlIHsKKwkJCXJlc291cmNlSW5mby5zZXREZXNjcmlwdGlvbigoU3RyaW5nKSBhcnRpZmFjdFRlbXBsYXRlTWFwLmdldChGSUxFX05BTUUpKTsKKwkJfQorCisJCWJvb2xlYW4gYXJ0aWZhY3RUeXBlRXhpc3QgPSBmYWxzZTsKKwkJU3RyaW5nIGNvcnJlY3RUeXBlID0gdHlwZTsKKwkJaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShDU0FSX05FU1RFRCkpCisJCQljb3JyZWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uSEVBVF9ORVNURUQuZ2V0VHlwZSgpOworCQllbHNlIGlmICgodHlwZS5lcXVhbHNJZ25vcmVDYXNlKENTQVJfVk9MVU1FKSkpCisJCQljb3JyZWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uSEVBVF9WT0wuZ2V0VHlwZSgpOworCQllbHNlIGlmICgodHlwZS5lcXVhbHNJZ25vcmVDYXNlKENTQVJfTkVUV09SSykpKQorCQkJY29ycmVjdFR5cGUgPSBBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVULmdldFR5cGUoKTsKKwkJZWxzZSBpZiAoKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShDU0FSX0FSVElGQUNUKSkpCisJCQljb3JyZWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uSEVBVF9BUlRJRkFDVC5nZXRUeXBlKCk7CisJCWVsc2UgaWYgKCh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQ1NBUl9IRUFUKSkpCisJCQljb3JyZWN0VHlwZSA9IEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCk7CisJCWVsc2UKKwkJCWNvcnJlY3RUeXBlID0gQXJ0aWZhY3RUeXBlRW51bS5PVEhFUi5nZXRUeXBlKCk7CisJCUVpdGhlcjxMaXN0PEFydGlmYWN0VHlwZT4sIEFjdGlvblN0YXR1cz4gYWxsQXJ0aWZhY3RUeXBlcyA9IGdldERlcGxveW1lbnRBcnRpZmFjdFR5cGVzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisKKwkJaWYgKGFsbEFydGlmYWN0VHlwZXMuaXNSaWdodCgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yKCJBcnRpZmFjdCBVcGxvYWQgLyBVcGRhdGUiLCAiYXJ0aWZhY3RUeXBlcyIsIGFsbEFydGlmYWN0VHlwZXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuRkFJTEVEX1JFVFJJVkVfQVJUSUZBQ1RTX1RZUEVTKSk7CisJCX0KKworCQlmb3IgKEFydGlmYWN0VHlwZSBhcnRUeXBlIDogYWxsQXJ0aWZhY3RUeXBlcy5sZWZ0KCkudmFsdWUoKSkgeworCisJCQlpZiAoYXJ0VHlwZS5nZXROYW1lKCkuY29udGFpbnMoY29ycmVjdFR5cGUpKSB7CisJCQkJcmVzb3VyY2VJbmZvLnR5cGUgPSBhcnRUeXBlLmdldE5hbWUoKTsKKwkJCQlhcnRpZmFjdFR5cGVFeGlzdCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWFydGlmYWN0VHlwZUV4aXN0KSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVJbnZhbGlkVHlwZUVycm9yKCJBcnRpZmFjdCIsICItTm90IHN1cHBvcnRlZCBhcnRpZmFjdCB0eXBlICIsIGNvcnJlY3RUeXBlKTsKKwkJCWxvZy5kZWJ1ZygiTm90IHN1cHBvcnRlZCBhcnRpZmFjdCB0eXBlID0ge30iLCBjb3JyZWN0VHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVELCBjb3JyZWN0VHlwZSkpOworCQl9CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJOZWVkVG9DcmVhdGUgPSB2YWxpZGF0ZUVudihjb21wb25lbnRzVXRpbHMsIGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3QsIHJlc291cmNlSW5mbyk7CisJCWlmIChlaXRoZXJOZWVkVG9DcmVhdGUuaXNSaWdodCgpKQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJOZWVkVG9DcmVhdGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJZWl0aGVyTmVlZFRvQ3JlYXRlID0gdmFsaWRhdGVQYXJlbnRUeXBlKGNvbXBvbmVudHNVdGlscywgcmVzb3VyY2VJbmZvLCBwYXJlbnRBcnRpZmFjdCk7CisJCWlmIChlaXRoZXJOZWVkVG9DcmVhdGUuaXNSaWdodCgpKQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChlaXRoZXJOZWVkVG9DcmVhdGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJZWl0aGVyTmVlZFRvQ3JlYXRlID0gdmFsaWRhdGVJc0FscmVhZHlFeGlzdChjb21wb25lbnRzVXRpbHMsIHJlc291cmNlSW5mbywgY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdCwgcGFyZW50QXJ0aWZhY3QpOworCQlpZiAoZWl0aGVyTmVlZFRvQ3JlYXRlLmlzUmlnaHQoKSkKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyTmVlZFRvQ3JlYXRlLnJpZ2h0KCkudmFsdWUoKSk7CisJCVNldDxTdHJpbmc+IGtleXMgPSBvLmtleVNldCgpOworCQlmb3IgKFN0cmluZyBrZXkgOiBrZXlzKSB7CisJCQlpZiAoby5nZXQoa2V5KSBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCQlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IGFydGlmTGlzdCA9IChMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KSBvLmdldChrZXkpOworCQkJCWZvciAoTWFwPFN0cmluZywgT2JqZWN0PiByZWxhdGVkQXJ0aWZhY3RzTWFwIDogYXJ0aWZMaXN0KSB7CisJCQkJCUVpdGhlcjxBcnRpZmFjdFRlbXBsYXRlSW5mbywgUmVzcG9uc2VGb3JtYXQ+IHJlbGF0ZWRBcnRpZmFjdCA9IEFydGlmYWN0VGVtcGxhdGVJbmZvLmNyZWF0ZUFydGlmYWN0VGVtcGxhdGVJbmZvRnJvbUpzb24oY29tcG9uZW50c1V0aWxzLCBrZXksIHJlbGF0ZWRBcnRpZmFjdHNNYXAsIGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3QsIHJlc291cmNlSW5mbyk7CisJCQkJCWlmIChyZWxhdGVkQXJ0aWZhY3QuaXNSaWdodCgpKQorCQkJCQkJcmV0dXJuIHJlbGF0ZWRBcnRpZmFjdDsKKwkJCQkJaWYgKHJlc291cmNlSW5mby5yZWxhdGVkQXJ0aWZhY3RzSW5mbyA9PSBudWxsKQorCQkJCQkJcmVzb3VyY2VJbmZvLnJlbGF0ZWRBcnRpZmFjdHNJbmZvID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4oKTsKKwkJCQkJcmVzb3VyY2VJbmZvLnJlbGF0ZWRBcnRpZmFjdHNJbmZvLmFkZChyZWxhdGVkQXJ0aWZhY3QubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VJbmZvKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlSXNBbHJlYWR5RXhpc3QoQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscywgQXJ0aWZhY3RUZW1wbGF0ZUluZm8gcmVzb3VyY2VJbmZvLCBMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiBjcmVhdGVkQXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0LCBBcnRpZmFjdFRlbXBsYXRlSW5mbyBwYXJlbnRBcnRpZmFjdCkgeworCisJCWlmIChwYXJlbnRBcnRpZmFjdCA9PSBudWxsKSB7CisJCQlpZiAoY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdCA9PSBudWxsIHx8IGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3QuaXNFbXB0eSgpKQorCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCWZvciAoQXJ0aWZhY3RUZW1wbGF0ZUluZm8gY3JlYXRlZEFydGlmYWN0IDogY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdCkgeworCQkJCWlmIChjcmVhdGVkQXJ0aWZhY3QuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2VJbmZvLmdldFR5cGUoKSkgJiYgY3JlYXRlZEFydGlmYWN0LmdldEZpbGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZUluZm8uZ2V0RmlsZU5hbWUoKSkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX0FMUkFEWV9FWElTVF9JTl9NQVNURVJfSU5fQ1NBUiwgcmVzb3VyY2VJbmZvLmdldEZpbGVOYW1lKCksIGNyZWF0ZWRBcnRpZmFjdC50eXBlKSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9IGVsc2UgeworCQkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVsYXRlZEFydGlmYWN0cyA9IHBhcmVudEFydGlmYWN0LmdldFJlbGF0ZWRBcnRpZmFjdHNJbmZvKCk7CisJCQlpZiAocmVsYXRlZEFydGlmYWN0cyA9PSBudWxsIHx8IHJlbGF0ZWRBcnRpZmFjdHMuaXNFbXB0eSgpKQorCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCWZvciAoQXJ0aWZhY3RUZW1wbGF0ZUluZm8gcmVsYXRlZEFydGlmYWN0IDogcmVsYXRlZEFydGlmYWN0cykgeworCQkJCWlmIChyZWxhdGVkQXJ0aWZhY3QuZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2VJbmZvLmdldFR5cGUoKSkpIHsKKwkJCQkJaWYgKHJlbGF0ZWRBcnRpZmFjdC5nZXRGaWxlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2VJbmZvLmdldEZpbGVOYW1lKCkpKSB7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX01BU1RFUl9JTl9DU0FSLCByZXNvdXJjZUluZm8uZ2V0RmlsZU5hbWUoKSwgcGFyZW50QXJ0aWZhY3QuZ2V0RmlsZU5hbWUoKSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVBhcmVudFR5cGUoQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscywgQXJ0aWZhY3RUZW1wbGF0ZUluZm8gcmVzb3VyY2VJbmZvLCBBcnRpZmFjdFRlbXBsYXRlSW5mbyBwYXJlbnRBcnRpZmFjdCkgeworCisJCWlmIChwYXJlbnRBcnRpZmFjdCA9PSBudWxsKQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQlpZiAocmVzb3VyY2VJbmZvLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9BUlRJRkFDVC5nZXRUeXBlKCkpKQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQlpZiAocmVzb3VyY2VJbmZvLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpICYmIHBhcmVudEFydGlmYWN0ICE9IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfVkFMSURfSU5fTUFTVEVSLCByZXNvdXJjZUluZm8uZ2V0RmlsZU5hbWUoKSwgcmVzb3VyY2VJbmZvLmdldFR5cGUoKSwgcGFyZW50QXJ0aWZhY3QuZ2V0RmlsZU5hbWUoKSwgcGFyZW50QXJ0aWZhY3QuZ2V0VHlwZSgpKSk7CisJCX0KKwkJaWYgKChyZXNvdXJjZUluZm8uZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX05FVC5nZXRUeXBlKCkpIHx8IHJlc291cmNlSW5mby5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MLmdldFR5cGUoKSkpCisJCQkJJiYgIXBhcmVudEFydGlmYWN0LmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX1ZBTElEX0lOX01BU1RFUiwgcmVzb3VyY2VJbmZvLmdldEZpbGVOYW1lKCksIHJlc291cmNlSW5mby5nZXRUeXBlKCksIHBhcmVudEFydGlmYWN0LmdldEZpbGVOYW1lKCksIHBhcmVudEFydGlmYWN0LmdldFR5cGUoKSkpOworCQl9CisJCWlmIChwYXJlbnRBcnRpZmFjdC5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVTVEVELmdldFR5cGUoKSkpIHsKKwkJCWlmIChyZXNvdXJjZUluZm8uZ2V0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX0FSVElGQUNULmdldFR5cGUoKSkpIHsKKwkJCQlFaXRoZXIubGVmdCh0cnVlKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfVkFMSURfSU5fTUFTVEVSLCByZXNvdXJjZUluZm8uZ2V0RmlsZU5hbWUoKSwgcmVzb3VyY2VJbmZvLmdldFR5cGUoKSwgcGFyZW50QXJ0aWZhY3QuZ2V0RmlsZU5hbWUoKSwgcGFyZW50QXJ0aWZhY3QuZ2V0VHlwZSgpKSk7CisJCX0KKwkJaWYgKHBhcmVudEFydGlmYWN0LmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpICYmIHJlc291cmNlSW5mby5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9WQUxJRF9JTl9NQVNURVIsIHJlc291cmNlSW5mby5nZXRGaWxlTmFtZSgpLCByZXNvdXJjZUluZm8uZ2V0VHlwZSgpLCBwYXJlbnRBcnRpZmFjdC5nZXRGaWxlTmFtZSgpLCBwYXJlbnRBcnRpZmFjdC5nZXRUeXBlKCkpKTsKKwkJfQorCisJCWlmIChwYXJlbnRBcnRpZmFjdC5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKSkgeworCQkJRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVFbnYoQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscywgTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvTGlzdCwgQXJ0aWZhY3RUZW1wbGF0ZUluZm8gcmVzb3VyY2VJbmZvKSB7CisKKwkJaWYgKGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3QgPT0gbnVsbCB8fCBjcmVhdGVkQXJ0aWZhY3RUZW1wbGF0ZUluZm9MaXN0LmlzRW1wdHkoKSkKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJaWYgKHJlc291cmNlSW5mby5nZXRUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfTkVTVEVELmdldFR5cGUoKSkgfHwgcmVzb3VyY2VJbmZvLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKEFydGlmYWN0VHlwZUVudW0uSEVBVF9BUlRJRkFDVC5nZXRUeXBlKCkpKQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mbyA6IGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mb0xpc3QpIHsKKwkJCS8vIGNoZWNrIGlmIGFydGlmYWN0IHdpdGggdGhpcyBuYW1lIGFscmVhZHkgcGFyc2VkLiBJZiBwYXJzZWQgY2hlY2sKKwkJCS8vIGVudiBuYW1lLiBpdCBtdXN0IGJlIHRoZSBzYW1lLgorCQkJaWYgKHJlc291cmNlSW5mby5nZXRGaWxlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEZpbGVOYW1lKCkpKSB7CisJCQkJaWYgKChyZXNvdXJjZUluZm8uZ2V0RW52KCkgPT0gbnVsbCB8fCByZXNvdXJjZUluZm8uZ2V0RW52KCkuaXNFbXB0eSgpKSAmJiAoY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEVudigpICE9IG51bGwgJiYgIWNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKS5pc0VtcHR5KCkpKSB7CisJCQkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3QgIGZpbGUgd2l0aCBuYW1lIHt9IHR5cGV7fSAgYWxyZWFkeSBwYXJzZWQgYnV0IHdpdGggZW52IHt9IiwgcmVzb3VyY2VJbmZvLmdldEZpbGVOYW1lKCksIHJlc291cmNlSW5mby5nZXRUeXBlKCksIGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfVkFMSURfRU5WLCByZXNvdXJjZUluZm8uZ2V0RmlsZU5hbWUoKSwgcmVzb3VyY2VJbmZvLmdldFR5cGUoKSwgcmVzb3VyY2VJbmZvLmdldEVudigpLCBjcmVhdGVkQXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0RW52KCkpKTsKKwkJCQl9CisJCQkJaWYgKHJlc291cmNlSW5mby5nZXRFbnYoKSAhPSBudWxsICYmICFyZXNvdXJjZUluZm8uZ2V0RW52KCkuaXNFbXB0eSgpICYmIGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKSAhPSBudWxsICYmICFjcmVhdGVkQXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0RW52KCkuaXNFbXB0eSgpCisJCQkJCQkmJiAhY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEVudigpLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2VJbmZvLmdldEVudigpKSkgeworCQkJCQlsb2cuZGVidWcoIkFydGlmYWN0ICBmaWxlIHdpdGggbmFtZSB7fSB0eXBle30gZW52IHt9IGFscmVhZHkgcGFyc2VkIGJ1dCB3aXRoIGVudiB7fSIsIHJlc291cmNlSW5mby5nZXRGaWxlTmFtZSgpLCByZXNvdXJjZUluZm8uZ2V0VHlwZSgpLCByZXNvdXJjZUluZm8uZ2V0RW52KCksIGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfVkFMSURfRU5WLCByZXNvdXJjZUluZm8uZ2V0RmlsZU5hbWUoKSwgcmVzb3VyY2VJbmZvLmdldFR5cGUoKSwgcmVzb3VyY2VJbmZvLmdldEVudigpLCBjcmVhdGVkQXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0RW52KCkpKTsKKwkJCQl9CisJCQkJaWYgKChyZXNvdXJjZUluZm8uZ2V0RW52KCkgIT0gbnVsbCAmJiAhcmVzb3VyY2VJbmZvLmdldEVudigpLmlzRW1wdHkoKSkgJiYgKGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKSA9PSBudWxsIHx8IGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKS5pc0VtcHR5KCkpKSB7CisJCQkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3QgIGZpbGUgd2l0aCBuYW1lIHt9IHR5cGV7fSBlbnYge30gYWxyZWFkeSBwYXJzZWQgYnV0IHdpdGggZW52IHt9IiwgcmVzb3VyY2VJbmZvLmdldEZpbGVOYW1lKCksIHJlc291cmNlSW5mby5nZXRUeXBlKCksIHJlc291cmNlSW5mby5nZXRFbnYoKSwgY3JlYXRlZEFydGlmYWN0VGVtcGxhdGVJbmZvLmdldEVudigpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkFSVElGQUNUX05PVF9WQUxJRF9FTlYsIHJlc291cmNlSW5mby5nZXRGaWxlTmFtZSgpLCByZXNvdXJjZUluZm8uZ2V0VHlwZSgpLCByZXNvdXJjZUluZm8uZ2V0RW52KCksIGNyZWF0ZWRBcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRFbnYoKSkpOworCQkJCX0KKwkJCX0KKwkJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRBcnRpZmFjdHMgPSBjcmVhdGVkQXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0UmVsYXRlZEFydGlmYWN0c0luZm8oKTsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gc3RhdHVzID0gdmFsaWRhdGVFbnYoY29tcG9uZW50c1V0aWxzLCByZWxhdGVkQXJ0aWZhY3RzLCByZXNvdXJjZUluZm8pOworCQkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpCisJCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3RUeXBlPiwgQWN0aW9uU3RhdHVzPiBnZXREZXBsb3ltZW50QXJ0aWZhY3RUeXBlcyhOb2RlVHlwZUVudW0gcGFyZW50VHlwZSkgeworCisJCU1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+IGRlcGxveW1lbnRBcnRpZmFjdHMgPSBudWxsOworCQlMaXN0PEFydGlmYWN0VHlwZT4gYXJ0aWZhY3RUeXBlcyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3RUeXBlPigpOworCisJCWlmIChwYXJlbnRUeXBlLmVxdWFscyhOb2RlVHlwZUVudW0uU2VydmljZSkpIHsKKwkJCWRlcGxveW1lbnRBcnRpZmFjdHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0cygpOworCQl9IGVsc2UgeworCQkJZGVwbG95bWVudEFydGlmYWN0cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cygpOworCQl9CisJCWlmIChkZXBsb3ltZW50QXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCWZvciAoU3RyaW5nIGFydGlmYWN0VHlwZSA6IGRlcGxveW1lbnRBcnRpZmFjdHMua2V5U2V0KCkpIHsKKwkJCQlBcnRpZmFjdFR5cGUgYXJ0aWZhY3RUID0gbmV3IEFydGlmYWN0VHlwZSgpOworCQkJCWFydGlmYWN0VC5zZXROYW1lKGFydGlmYWN0VHlwZSk7CisJCQkJYXJ0aWZhY3RUeXBlcy5hZGQoYXJ0aWZhY3RUKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdFR5cGVzKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlQnlHcm91cE5hbWUoQXJ0aWZhY3RUZW1wbGF0ZUluZm8gYXJ0MSwgQXJ0aWZhY3RUZW1wbGF0ZUluZm8gYXJ0MikgeworCQlyZXR1cm4gYXJ0MS5pc0Jhc2UgPyAoYXJ0Mi5pc0Jhc2UgPyAwIDogLTEpIDogKGFydDIuaXNCYXNlID8gMSA6IDApOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQXJ0aWZhY3RUeXBlc0luZm8uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0FydGlmYWN0VHlwZXNJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5YjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0FydGlmYWN0VHlwZXNJbmZvLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0VHlwZTsKKworcHVibGljIGNsYXNzIEFydGlmYWN0VHlwZXNJbmZvIHsKKworCUludGVnZXIgaGVhdERlZmF1bHRUaW1lb3V0ID0gNjA7CisJTGlzdDxBcnRpZmFjdFR5cGU+IGFydGlmYWN0VHlwZXM7CisKKwlwdWJsaWMgTGlzdDxBcnRpZmFjdFR5cGU+IGdldEFydGlmYWN0VHlwZXMoKSB7CisJCXJldHVybiBhcnRpZmFjdFR5cGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VHlwZXMoTGlzdDxBcnRpZmFjdFR5cGU+IGFydGlmYWN0VHlwZXMpIHsKKwkJdGhpcy5hcnRpZmFjdFR5cGVzID0gYXJ0aWZhY3RUeXBlczsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRIZWF0RGVmYXVsdFRpbWVvdXQoKSB7CisJCXJldHVybiBoZWF0RGVmYXVsdFRpbWVvdXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0SGVhdERlZmF1bHRUaW1lb3V0KEludGVnZXIgaGVhdERlZmF1bHRUaW1lb3V0KSB7CisJCXRoaXMuaGVhdERlZmF1bHRUaW1lb3V0ID0gaGVhdERlZmF1bHRUaW1lb3V0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQ3JlYXRlQW5kQXNzb3RpYXRlSW5mby5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vQ3JlYXRlQW5kQXNzb3RpYXRlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZmE0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9DcmVhdGVBbmRBc3NvdGlhdGVJbmZvLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm87CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CisKK3B1YmxpYyBjbGFzcyBDcmVhdGVBbmRBc3NvdGlhdGVJbmZvIHsKKwlwcml2YXRlIENvbXBvbmVudEluc3RhbmNlIG5vZGU7CisJcHJpdmF0ZSBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgYXNzb2NpYXRlOworCisJcHVibGljIENyZWF0ZUFuZEFzc290aWF0ZUluZm8oQ29tcG9uZW50SW5zdGFuY2Ugbm9kZSwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGFzc29jaWF0ZSkgeworCQlzdXBlcigpOworCQl0aGlzLm5vZGUgPSBub2RlOworCQl0aGlzLmFzc29jaWF0ZSA9IGFzc29jaWF0ZTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2UgZ2V0Tm9kZSgpIHsKKwkJcmV0dXJuIG5vZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9kZShDb21wb25lbnRJbnN0YW5jZSBub2RlKSB7CisJCXRoaXMubm9kZSA9IG5vZGU7CisJfQorCisJcHVibGljIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBnZXRBc3NvY2lhdGUoKSB7CisJCXJldHVybiBhc3NvY2lhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXNzb2NpYXRlKFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBhc3NvY2lhdGUpIHsKKwkJdGhpcy5hc3NvY2lhdGUgPSBhc3NvY2lhdGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9EaXN0cmlidXRpb25TdGF0dXMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0Rpc3RyaWJ1dGlvblN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjNmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9EaXN0cmlidXRpb25TdGF0dXMuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBlbnVtIERpc3RyaWJ1dGlvblN0YXR1cyB7CisJREVQTE9ZRUQoIkRlcGxveWVkIiwgIkRFUExPWUVEIik7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIGF1ZGl0aW5nU3RhdHVzOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERpc3RyaWJ1dGlvblN0YXR1cy5jbGFzcy5nZXROYW1lKCkpOworCisJRGlzdHJpYnV0aW9uU3RhdHVzKFN0cmluZyBuYW1lLCBTdHJpbmcgYXVkaXRpbmdTdGF0dXMpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5hdWRpdGluZ1N0YXR1cyA9IGF1ZGl0aW5nU3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBdWRpdGluZ1N0YXR1cygpIHsKKwkJcmV0dXJuIGF1ZGl0aW5nU3RhdHVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgRGlzdHJpYnV0aW9uU3RhdHVzIGdldFN0YXR1c0J5QXVkaXRpbmdTdGF0dXNOYW1lKFN0cmluZyBhdWRpdGluZ1N0YXR1cykgeworCQlEaXN0cmlidXRpb25TdGF0dXMgcmVzID0gbnVsbDsKKwkJRGlzdHJpYnV0aW9uU3RhdHVzW10gdmFsdWVzID0gdmFsdWVzKCk7CisJCWZvciAoRGlzdHJpYnV0aW9uU3RhdHVzIHZhbHVlIDogdmFsdWVzKSB7CisJCQlpZiAodmFsdWUuZ2V0QXVkaXRpbmdTdGF0dXMoKS5lcXVhbHMoYXVkaXRpbmdTdGF0dXMpKSB7CisJCQkJcmVzID0gdmFsdWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHJlcyA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk5vIERpc3RyaWJ1dGlvblN0YXR1cyAgaXMgbWFwcGVkIHRvIG5hbWUge30iLCBhdWRpdGluZ1N0YXR1cyk7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0Rpc3RyaWJ1dGlvblN0YXR1c0luZm8uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0Rpc3RyaWJ1dGlvblN0YXR1c0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjc1OTZjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vRGlzdHJpYnV0aW9uU3RhdHVzSW5mby5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5FU1RpbWVCYXNlZEV2ZW50OworCitwdWJsaWMgY2xhc3MgRGlzdHJpYnV0aW9uU3RhdHVzSW5mbyB7CisJU3RyaW5nIG9tZkNvbXBvbmVudElEOworCVN0cmluZyB0aW1lc3RhbXA7CisJU3RyaW5nIHVybDsKKwlTdHJpbmcgc3RhdHVzOworCVN0cmluZyBlcnJvclJlYXNvbjsKKworCXB1YmxpYyBEaXN0cmlidXRpb25TdGF0dXNJbmZvKEVTVGltZUJhc2VkRXZlbnQgZGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQpIHsKKwkJc3VwZXIoKTsKKwkJb21mQ29tcG9uZW50SUQgPSAoU3RyaW5nKSBkaXN0cmlidXRpb25TdGF0dXNFdmVudC5nZXRGaWVsZHMoKS5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQuZ2V0RGlzcGxheU5hbWUoKSk7CisJCXRpbWVzdGFtcCA9IChTdHJpbmcpIGRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50LmdldEZpZWxkcygpLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfVElNRS5nZXREaXNwbGF5TmFtZSgpKTsvLyBkaXN0cmlidXRpb25TdGF0dXNFdmVudC5nZXRTdGF0dXNUaW1lKCk7CisJCXVybCA9IChTdHJpbmcpIGRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50LmdldEZpZWxkcygpLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9SRVNPVVJDRV9VUkwuZ2V0RGlzcGxheU5hbWUoKSk7Ly8gZGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQuZ2V0UmVzb3VyZVVSTCgpOworCQlzdGF0dXMgPSAoU3RyaW5nKSBkaXN0cmlidXRpb25TdGF0dXNFdmVudC5nZXRGaWVsZHMoKS5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMuZ2V0RGlzcGxheU5hbWUoKSk7Ly8gZGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQuZ2V0U3RhdHVzKCk7CisJCWVycm9yUmVhc29uID0gKFN0cmluZykgZGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQuZ2V0RmllbGRzKCkuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQy5nZXREaXNwbGF5TmFtZSgpKTsKKworCX0KKworCXB1YmxpYyBEaXN0cmlidXRpb25TdGF0dXNJbmZvKFN0cmluZyBvbWZDb21wb25lbnRJRCwgU3RyaW5nIHRpbWVzdGFtcCwgU3RyaW5nIHVybCwgU3RyaW5nIHN0YXR1cykgeworCQlzdXBlcigpOworCQl0aGlzLm9tZkNvbXBvbmVudElEID0gb21mQ29tcG9uZW50SUQ7CisJCXRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworCQl0aGlzLnVybCA9IHVybDsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRPbWZDb21wb25lbnRJRCgpIHsKKwkJcmV0dXJuIG9tZkNvbXBvbmVudElEOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9tZkNvbXBvbmVudElEKFN0cmluZyBvbWZDb21wb25lbnRJRCkgeworCQl0aGlzLm9tZkNvbXBvbmVudElEID0gb21mQ29tcG9uZW50SUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKSB7CisJCXJldHVybiB0aW1lc3RhbXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKFN0cmluZyB0aW1lc3RhbXApIHsKKwkJdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFcnJvclJlYXNvbigpIHsKKwkJcmV0dXJuIGVycm9yUmVhc29uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVycm9yUmVhc29uKFN0cmluZyBlcnJvclJlYXNvbikgeworCQl0aGlzLmVycm9yUmVhc29uID0gZXJyb3JSZWFzb247CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9EaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2UuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0Rpc3RyaWJ1dGlvblN0YXR1c0xpc3RSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTIyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9EaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRGlzdHJpYnV0aW9uU3RhdHVzTGlzdFJlc3BvbnNlIHsKKworCXByaXZhdGUgTGlzdDxEaXN0cmlidXRpb25TdGF0dXNJbmZvPiBkaXN0cmliU3RhdHVzSW5mb0xpc3Q7CisKKwlwdWJsaWMgTGlzdDxEaXN0cmlidXRpb25TdGF0dXNJbmZvPiBnZXREaXN0cmlidXRpb25TdGF0dXNMaXN0KCkgeworCQlyZXR1cm4gZGlzdHJpYlN0YXR1c0luZm9MaXN0OworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGlvblN0YXR1c0xpc3QoTGlzdDxEaXN0cmlidXRpb25TdGF0dXNJbmZvPiBkaXN0cmliU3RhdHVzSW5mb0xpc3QpIHsKKwkJdGhpcy5kaXN0cmliU3RhdHVzSW5mb0xpc3QgPSBkaXN0cmliU3RhdHVzSW5mb0xpc3Q7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9EaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VJbmZvLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9EaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhNDgxZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0Rpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8geworCVN0cmluZyBkaXN0cmlidXRpb25JRDsKKwlTdHJpbmcgdGltZXN0YW1wOworCVN0cmluZyB1c2VySWQ7CisJU3RyaW5nIGRlcGxveWVtZW50U3RhdHVzOworCisJcHVibGljIERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUluZm8oKSB7CisJCXN1cGVyKCk7CisKKwl9CisKKwlwdWJsaWMgRGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mbyhTdHJpbmcgZGlzdHJpYnV0aW9uSUQsIFN0cmluZyB0aW1lc3RhbXAsIFN0cmluZyB1c2VySWQsIFN0cmluZyBkZXBsb3llbWVudFN0YXR1cykgeworCQlzdXBlcigpOworCQl0aGlzLmRpc3RyaWJ1dGlvbklEID0gZGlzdHJpYnV0aW9uSUQ7CisJCXRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworCQl0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKwkJdGhpcy5kZXBsb3llbWVudFN0YXR1cyA9IGRlcGxveWVtZW50U3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGlzdHJpYnV0aW9uSUQoKSB7CisJCXJldHVybiBkaXN0cmlidXRpb25JRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRpb25JRChTdHJpbmcgZGlzdHJpYnV0aW9uSUQpIHsKKwkJdGhpcy5kaXN0cmlidXRpb25JRCA9IGRpc3RyaWJ1dGlvbklEOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGltZXN0YW1wKCkgeworCQlyZXR1cm4gdGltZXN0YW1wOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgdGltZXN0YW1wKSB7CisJCXRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcklkKCkgeworCQlyZXR1cm4gdXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJJZChTdHJpbmcgdXNlcklkKSB7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95ZW1lbnRTdGF0dXMoKSB7CisJCXJldHVybiBkZXBsb3llbWVudFN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXBsb3llbWVudFN0YXR1cyhTdHJpbmcgZGVwbG95ZW1lbnRTdGF0dXMpIHsKKwkJdGhpcy5kZXBsb3llbWVudFN0YXR1cyA9IGRlcGxveWVtZW50U3RhdHVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vRGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlTGlzdFJlc3BvbmNlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9EaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VMaXN0UmVzcG9uY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDE1NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vRGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlTGlzdFJlc3BvbmNlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUxpc3RSZXNwb25jZSB7CisKKwlwcml2YXRlIExpc3Q8RGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mbz4gZGlzdHJpYlN0YXR1c09mU2VydmljZUluZm9MaXN0OworCisJcHVibGljIExpc3Q8RGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mbz4gZ2V0RGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlTGlzdCgpIHsKKwkJcmV0dXJuIGRpc3RyaWJTdGF0dXNPZlNlcnZpY2VJbmZvTGlzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VMaXN0KExpc3Q8RGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlSW5mbz4gZGlzdHJpYlN0YXR1c09mU2VydmljZUluZm9MaXN0KSB7CisJCXRoaXMuZGlzdHJpYlN0YXR1c09mU2VydmljZUluZm9MaXN0ID0gZGlzdHJpYlN0YXR1c09mU2VydmljZUluZm9MaXN0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vR3JvdXBEZWZpbml0aW9uSW5mby5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vR3JvdXBEZWZpbml0aW9uSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDljNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9Hcm91cERlZmluaXRpb25JbmZvLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Hcm91cERhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdyb3VwRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEdyb3VwRGVmaW5pdGlvbkluZm8geworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwkvLyB0aGUgaWQgaXMgdW5pcXVlIHBlciBncm91cCBpbnN0YW5jZSBvbiBncmFwaC4KKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCS8vIHRoZSBncm91cCBVVUlEIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4gb25lIG9mIHRoZSBhcnRpZmFjdHMvY29tcG9uZW50CisJLy8gaW5zdGFuY2VzIGhhcyBiZWVuIGNoYW5nZWQuCisJcHJpdmF0ZSBTdHJpbmcgZ3JvdXBVVUlEOworCisJLy8gdmVyc2lvbiBzaG91bGQgYmUgY2hhbmdlZCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIHRvIHRoZSBncm91cCdzIG1ldGFkYXRhCisJLy8gb3IgdG8gdGhlIGdyb3VwcyBtZW1iZXJzCisJLy8gKG5vdCBuZWNlc3NhcmlseSB3aGVuIHRoZSBWRiB2ZXJzaW9uIGlzIGNoYW5nZWQpLiBUaGlzIGZpZWxkIGNhbm5vdCBiZQorCS8vIHVwZGF0ZWQgYnkgdXNlcgorCXByaXZhdGUgU3RyaW5nIHZlcnNpb247CisKKwlwcml2YXRlIFN0cmluZyBpbnZhcmlhbnRVVUlEOworCisJQm9vbGVhbiBpc0Jhc2UgPSBudWxsOworCisJLy8gYXJ0aWZhY3RzIC0gbGlzdCBvZiBhcnRpZmFjdCB1aWQuIEFsbCBhcnRpZmFjdHMgaW4gdGhlIGdyb3VwIG11c3QgYWxyZWFkeQorCS8vIGJlIHVwbG9hZGVkIHRvIHRoZSBWRgorCXByaXZhdGUgTGlzdDxBcnRpZmFjdERlZmluaXRpb25JbmZvPiBhcnRpZmFjdHM7CisKKwlwdWJsaWMgR3JvdXBEZWZpbml0aW9uSW5mbygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgR3JvdXBEZWZpbml0aW9uSW5mbyhHcm91cERlZmluaXRpb24gb3RoZXIpIHsKKwkJdGhpcy5zZXROYW1lKG90aGVyLmdldE5hbWUoKSk7CisJCXRoaXMuc2V0VW5pcXVlSWQob3RoZXIuZ2V0VW5pcXVlSWQoKSk7CisJCXRoaXMuc2V0VmVyc2lvbihvdGhlci5nZXRWZXJzaW9uKCkpOworCQl0aGlzLnNldEdyb3VwVVVJRChvdGhlci5nZXRHcm91cFVVSUQoKSk7CisJCXRoaXMuc2V0SW52YXJpYW50VVVJRChvdGhlci5nZXRJbnZhcmlhbnRVVUlEKCkpOworCisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbnZhcmlhbnRVVUlEKCkgeworCQlyZXR1cm4gaW52YXJpYW50VVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnZhcmlhbnRVVUlEKFN0cmluZyBpbnZhcmlhbnRVVUlEKSB7CisJCXRoaXMuaW52YXJpYW50VVVJRCA9IGludmFyaWFudFVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRHcm91cFVVSUQoKSB7CisJCXJldHVybiBncm91cFVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JvdXBVVUlEKFN0cmluZyBncm91cFVVSUQpIHsKKwkJdGhpcy5ncm91cFVVSUQgPSBncm91cFVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0SXNCYXNlKCkgeworCQlyZXR1cm4gaXNCYXNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldElzQmFzZShCb29sZWFuIGlzQmFzZSkgeworCQl0aGlzLmlzQmFzZSA9IGlzQmFzZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxBcnRpZmFjdERlZmluaXRpb25JbmZvPiBnZXRBcnRpZmFjdHMoKSB7CisJCXJldHVybiBhcnRpZmFjdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RzKExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uSW5mbz4gYXJ0aWZhY3RzKSB7CisJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiR3JvdXBEZWZpbml0aW9uSW5mbyBbIiArIHN1cGVyLnRvU3RyaW5nKCkgKyAiLCBpc0Jhc2U9IiArIGlzQmFzZSArICIsIGFydGlmYWN0cz0iICsgYXJ0aWZhY3RzICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vR3JvdXBUZW1wbGF0ZUluZm8uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0dyb3VwVGVtcGxhdGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3MWE4MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL0dyb3VwVGVtcGxhdGVJbmZvLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgR3JvdXBUZW1wbGF0ZUluZm8geworCVN0cmluZyBncm91cE5hbWU7CisJYm9vbGVhbiBpc0Jhc2U7CisJQXJ0aWZhY3RUZW1wbGF0ZUluZm8gYXJ0aWZhY3RUZW1wbGF0ZUluZm87CisKKwlwdWJsaWMgR3JvdXBUZW1wbGF0ZUluZm8oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBOYW1lKCkgeworCQlyZXR1cm4gZ3JvdXBOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEdyb3VwTmFtZShTdHJpbmcgZ3JvdXBOYW1lKSB7CisJCXRoaXMuZ3JvdXBOYW1lID0gZ3JvdXBOYW1lOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQmFzZSgpIHsKKwkJcmV0dXJuIGlzQmFzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCYXNlKGJvb2xlYW4gaXNCYXNlKSB7CisJCXRoaXMuaXNCYXNlID0gaXNCYXNlOworCX0KKworCXB1YmxpYyBBcnRpZmFjdFRlbXBsYXRlSW5mbyBnZXRBcnRpZmFjdFRlbXBsYXRlSW5mbygpIHsKKwkJcmV0dXJuIGFydGlmYWN0VGVtcGxhdGVJbmZvOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VGVtcGxhdGVJbmZvKEFydGlmYWN0VGVtcGxhdGVJbmZvIGFydGlmYWN0VGVtcGxhdGVJbmZvKSB7CisJCXRoaXMuYXJ0aWZhY3RUZW1wbGF0ZUluZm8gPSBhcnRpZmFjdFRlbXBsYXRlSW5mbzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL01lcmdlZEFydGlmYWN0SW5mby5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vTWVyZ2VkQXJ0aWZhY3RJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMzhiMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL01lcmdlZEFydGlmYWN0SW5mby5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgTWVyZ2VkQXJ0aWZhY3RJbmZvIHsKKworCXByaXZhdGUgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWRBcnRpZmFjdDsKKwlwcml2YXRlIEFydGlmYWN0VGVtcGxhdGVJbmZvIGpzb25BcnRpZmFjdFRlbXBsYXRlOworCXByaXZhdGUgU2V0PFN0cmluZz4gcGFyc2V0QXJ0aWZhY3RzTmFtZXM7CisKKwlwdWJsaWMgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGdldENyZWF0ZWRBcnRpZmFjdCgpIHsKKwkJcmV0dXJuIGNyZWF0ZWRBcnRpZmFjdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGVkQXJ0aWZhY3QoTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGNyZWF0ZWRBcnRpZmFjdCkgeworCQl0aGlzLmNyZWF0ZWRBcnRpZmFjdCA9IGNyZWF0ZWRBcnRpZmFjdDsKKwkJcGFyc2V0QXJ0aWZhY3RzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCXBhcnNldEFydGlmYWN0c05hbWVzLmFkZChqc29uQXJ0aWZhY3RUZW1wbGF0ZS5nZXRGaWxlTmFtZSgpKTsKKwkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVsYXRlZEdyb3VwVGVtcGxhdGVMaXN0ID0ganNvbkFydGlmYWN0VGVtcGxhdGUuZ2V0UmVsYXRlZEFydGlmYWN0c0luZm8oKTsKKwkJaWYgKHJlbGF0ZWRHcm91cFRlbXBsYXRlTGlzdCAhPSBudWxsICYmICFyZWxhdGVkR3JvdXBUZW1wbGF0ZUxpc3QuaXNFbXB0eSgpKSB7CisJCQl0aGlzLmNyZWF0ZUFydGlmYWN0c0dyb3VwU2V0KHJlbGF0ZWRHcm91cFRlbXBsYXRlTGlzdCwgcGFyc2V0QXJ0aWZhY3RzTmFtZXMpOworCQl9CisKKwl9CisKKwlwdWJsaWMgQXJ0aWZhY3RUZW1wbGF0ZUluZm8gZ2V0SnNvbkFydGlmYWN0VGVtcGxhdGUoKSB7CisJCXJldHVybiBqc29uQXJ0aWZhY3RUZW1wbGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRKc29uQXJ0aWZhY3RUZW1wbGF0ZShBcnRpZmFjdFRlbXBsYXRlSW5mbyBqc29uQXJ0aWZhY3RUZW1wbGF0ZSkgeworCQl0aGlzLmpzb25BcnRpZmFjdFRlbXBsYXRlID0ganNvbkFydGlmYWN0VGVtcGxhdGU7CisJfQorCisJcHVibGljIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IGdldExpc3RUb0Fzc29jaWF0ZUFydGlmYWN0VG9Hcm91cCgpIHsKKwkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+KCk7CisJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRBcnRpZmFjdHMgPSBqc29uQXJ0aWZhY3RUZW1wbGF0ZS5nZXRSZWxhdGVkQXJ0aWZhY3RzSW5mbygpOworCQlpZiAocmVsYXRlZEFydGlmYWN0cyAhPSBudWxsICYmICFyZWxhdGVkQXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJZ2V0TmV3QXJ0aWZhY3RzSW5Hcm91cChyZXNMaXN0LCByZWxhdGVkQXJ0aWZhY3RzKTsKKwkJfQorCQlyZXR1cm4gcmVzTGlzdDsKKwl9CisKKwlwdWJsaWMgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGdldExpc3RUb0Rpc3NvdGlhdGVBcnRpZmFjdEZyb21Hcm91cChMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gZGVsZXRlZEFydGlmYWN0cykgeworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gcmVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlmb3IgKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gOiBjcmVhdGVkQXJ0aWZhY3QpIHsKKwkJCWlmICghcGFyc2V0QXJ0aWZhY3RzTmFtZXMuY29udGFpbnMoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TmFtZSgpKSkgeworCQkJCWJvb2xlYW4gaXNEZWxldGVkID0gZmFsc2U7CisJCQkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gZGVsZXRlZEFydGlmYWN0IDogZGVsZXRlZEFydGlmYWN0cykgeworCQkJCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkuZXF1YWxzSWdub3JlQ2FzZShkZWxldGVkQXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSkpIHsKKwkJCQkJCWlzRGVsZXRlZCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJfQorCQkJCWlmICghaXNEZWxldGVkKQorCQkJCQlyZXNMaXN0LmFkZChhcnRpZmFjdERlZmluaXRpb24pOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gcmVzTGlzdDsKKwl9CisKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGVmaW5pdGlvbiwgQXJ0aWZhY3RUZW1wbGF0ZUluZm8+PiBnZXRMaXN0VG9VcGRhdGVBcnRpZmFjdEluR3JvdXAoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPj4gcmVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPj4oKTsKKwkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uIDogY3JlYXRlZEFydGlmYWN0KSB7CisJCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoanNvbkFydGlmYWN0VGVtcGxhdGUuZ2V0RmlsZU5hbWUoKSkpIHsKKwkJCQlyZXNMaXN0LmFkZChuZXcgSW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPihhcnRpZmFjdERlZmluaXRpb24sIGpzb25BcnRpZmFjdFRlbXBsYXRlKSk7CisJCQl9CisJCX0KKwkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVsYXRlZEFydGlmYWN0cyA9IGpzb25BcnRpZmFjdFRlbXBsYXRlLmdldFJlbGF0ZWRBcnRpZmFjdHNJbmZvKCk7CisJCWlmIChyZWxhdGVkQXJ0aWZhY3RzICE9IG51bGwgJiYgIXJlbGF0ZWRBcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQlnZXRVcGRhdGVBcnRpZmFjdHNJbkdyb3VwKHJlc0xpc3QsIHJlbGF0ZWRBcnRpZmFjdHMpOworCQl9CisJCXJldHVybiByZXNMaXN0OworCX0KKworCXByaXZhdGUgdm9pZCBnZXRVcGRhdGVBcnRpZmFjdHNJbkdyb3VwKExpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPj4gcmVzTGlzdCwgTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4ganNvbkFydGlmYWN0cykgeworCisJCWZvciAoQXJ0aWZhY3RUZW1wbGF0ZUluZm8gYXJ0aWZhY3RUZW1wbGF0ZUluZm8gOiBqc29uQXJ0aWZhY3RzKSB7CisKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IGNyZWF0ZWRBcnRpZmFjdCkgeworCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRGaWxlTmFtZSgpKSkgeworCQkJCQlyZXNMaXN0LmFkZChuZXcgSW1tdXRhYmxlUGFpcjxBcnRpZmFjdERlZmluaXRpb24sIEFydGlmYWN0VGVtcGxhdGVJbmZvPihhcnRpZmFjdERlZmluaXRpb24sIGFydGlmYWN0VGVtcGxhdGVJbmZvKSk7CisJCQkJfQorCQkJfQorCisJCQlMaXN0PEFydGlmYWN0VGVtcGxhdGVJbmZvPiByZWxhdGVkQXJ0aWZhY3RzID0gYXJ0aWZhY3RUZW1wbGF0ZUluZm8uZ2V0UmVsYXRlZEFydGlmYWN0c0luZm8oKTsKKwkJCWlmIChyZWxhdGVkQXJ0aWZhY3RzICE9IG51bGwgJiYgIXJlbGF0ZWRBcnRpZmFjdHMuaXNFbXB0eSgpKSB7CisJCQkJZ2V0VXBkYXRlQXJ0aWZhY3RzSW5Hcm91cChyZXNMaXN0LCByZWxhdGVkQXJ0aWZhY3RzKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBnZXROZXdBcnRpZmFjdHNJbkdyb3VwKExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlc0xpc3QsIExpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IGpzb25BcnRpZmFjdHMpIHsKKworCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIGFydGlmYWN0VGVtcGxhdGVJbmZvIDoganNvbkFydGlmYWN0cykgeworCQkJYm9vbGVhbiBpc05ld0FydGlmYWN0ID0gdHJ1ZTsKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA6IGNyZWF0ZWRBcnRpZmFjdCkgeworCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShhcnRpZmFjdFRlbXBsYXRlSW5mby5nZXRGaWxlTmFtZSgpKSkgeworCQkJCQlpc05ld0FydGlmYWN0ID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJaWYgKGlzTmV3QXJ0aWZhY3QpCisJCQkJcmVzTGlzdC5hZGQoYXJ0aWZhY3RUZW1wbGF0ZUluZm8pOworCQkJTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcmVsYXRlZEFydGlmYWN0cyA9IGFydGlmYWN0VGVtcGxhdGVJbmZvLmdldFJlbGF0ZWRBcnRpZmFjdHNJbmZvKCk7CisJCQlpZiAocmVsYXRlZEFydGlmYWN0cyAhPSBudWxsICYmICFyZWxhdGVkQXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJCWdldE5ld0FydGlmYWN0c0luR3JvdXAocmVzTGlzdCwgcmVsYXRlZEFydGlmYWN0cyk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQXJ0aWZhY3RzR3JvdXBTZXQoTGlzdDxBcnRpZmFjdFRlbXBsYXRlSW5mbz4gcGFyc2VkR3JvdXBUZW1wbGF0ZUxpc3QsIFNldDxTdHJpbmc+IHBhcnNlZEFydGlmYWN0c05hbWUpIHsKKworCQlmb3IgKEFydGlmYWN0VGVtcGxhdGVJbmZvIHBhcnNlZEdyb3VwVGVtcGxhdGUgOiBwYXJzZWRHcm91cFRlbXBsYXRlTGlzdCkgeworCQkJcGFyc2VkQXJ0aWZhY3RzTmFtZS5hZGQocGFyc2VkR3JvdXBUZW1wbGF0ZS5nZXRGaWxlTmFtZSgpKTsKKwkJCUxpc3Q8QXJ0aWZhY3RUZW1wbGF0ZUluZm8+IHJlbGF0ZWRBcnRpZmFjdHMgPSBwYXJzZWRHcm91cFRlbXBsYXRlLmdldFJlbGF0ZWRBcnRpZmFjdHNJbmZvKCk7CisJCQlpZiAocmVsYXRlZEFydGlmYWN0cyAhPSBudWxsICYmICFyZWxhdGVkQXJ0aWZhY3RzLmlzRW1wdHkoKSkgeworCQkJCWNyZWF0ZUFydGlmYWN0c0dyb3VwU2V0KHJlbGF0ZWRBcnRpZmFjdHMsIHBhcnNlZEFydGlmYWN0c05hbWUpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9TZXJ2aWNlSW5mby5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vU2VydmljZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdjNDllCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vU2VydmljZUluZm8uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgU2VydmljZUluZm8geworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIExpc3Q8U2VydmljZVZlcnNpb25JbmZvPiB2ZXJzaW9uczsKKworCXB1YmxpYyBTZXJ2aWNlSW5mbyhTdHJpbmcgc2VydmljZU5hbWUsIExpc3Q8U2VydmljZVZlcnNpb25JbmZvPiBsaXN0KSB7CisJCXRoaXMubmFtZSA9IHNlcnZpY2VOYW1lOworCQl0aGlzLnZlcnNpb25zID0gbGlzdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTZXJ2aWNlVmVyc2lvbkluZm8+IGdldFZlcnNpb25zKCkgeworCQlyZXR1cm4gdmVyc2lvbnM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbnMoTGlzdDxTZXJ2aWNlVmVyc2lvbkluZm8+IHZlcnNpb25zKSB7CisJCXRoaXMudmVyc2lvbnMgPSB2ZXJzaW9uczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL1NlcnZpY2VWZXJzaW9uSW5mby5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vU2VydmljZVZlcnNpb25JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmOGExMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL1NlcnZpY2VWZXJzaW9uSW5mby5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvOworCitwdWJsaWMgY2xhc3MgU2VydmljZVZlcnNpb25JbmZvIHsKKworCS8vIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOworCXByaXZhdGUgU3RyaW5nIHZlcnNpb247CisJcHJpdmF0ZSBTdHJpbmcgdXJsOworCisJcHVibGljIFNlcnZpY2VWZXJzaW9uSW5mbyhTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwgU3RyaW5nIGNvbnRleHQpIHsKKwkJc3VwZXIoKTsKKwkJLy8gdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworCQl0aGlzLnZlcnNpb24gPSBzZXJ2aWNlVmVyc2lvbjsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGNvbnRleHQpOworCQlzYi5hcHBlbmQoInNlcnZpY2VzLyIpLmFwcGVuZChzZXJ2aWNlTmFtZSkuYXBwZW5kKCIvIikuYXBwZW5kKHNlcnZpY2VWZXJzaW9uKTsKKwkJdXJsID0gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHNlcnZpY2VWZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHNlcnZpY2VWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworCQlyZXR1cm4gdXJsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisJCXRoaXMudXJsID0gdXJsOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL1NlcnZpY2VzV3JhcHBlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vU2VydmljZXNXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyNmNmNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL1NlcnZpY2VzV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5pbmZvOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlc1dyYXBwZXIgeworCXByaXZhdGUgTGlzdDxTZXJ2aWNlSW5mbz4gc2VydmljZXM7CisKKwlwdWJsaWMgTGlzdDxTZXJ2aWNlSW5mbz4gZ2V0U2VydmljZXMoKSB7CisJCXJldHVybiBzZXJ2aWNlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlcyhMaXN0PFNlcnZpY2VJbmZvPiBzZXJ2aWNlcykgeworCQl0aGlzLnNlcnZpY2VzID0gc2VydmljZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vU2VydmxldEpzb25SZXNwb25zZS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vU2VydmxldEpzb25SZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTkzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9TZXJ2bGV0SnNvblJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm87CisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0SnNvblJlc3BvbnNlIHsKKworCVN0cmluZyBzb3VyY2U7CisJU3RyaW5nIGRlc2NyaXB0aW9uOworCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CisJCXJldHVybiBzb3VyY2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKKwkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9Ub3NjYU5vZGVUeXBlSW5mby5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vVG9zY2FOb2RlVHlwZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2luZm8vVG9zY2FOb2RlVHlwZUluZm8uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVG9zY2FOb2RlVHlwZUluZm8geworCisJcHJpdmF0ZSBTdHJpbmcgbm9kZU5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdGVtcGxhdGVWZXJzaW9uOworCXByaXZhdGUgTGlzdDxUb3NjYU5vZGVUeXBlSW50ZXJmYWNlPiBpbnRlcmZhY2VzOworCXByaXZhdGUgU3RyaW5nIGljb25QYXRoOworCisJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKKwkJcmV0dXJuIG5vZGVOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKFN0cmluZyBub2RlTmFtZSkgeworCQl0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZVZlcnNpb24oKSB7CisJCXJldHVybiB0ZW1wbGF0ZVZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0VGVtcGxhdGVWZXJzaW9uKFN0cmluZyB0ZW1wbGF0ZVZlcnNpb24pIHsKKwkJdGhpcy50ZW1wbGF0ZVZlcnNpb24gPSB0ZW1wbGF0ZVZlcnNpb247CisJfQorCisJcHVibGljIExpc3Q8VG9zY2FOb2RlVHlwZUludGVyZmFjZT4gZ2V0SW50ZXJmYWNlcygpIHsKKwkJcmV0dXJuIGludGVyZmFjZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlcyhMaXN0PFRvc2NhTm9kZVR5cGVJbnRlcmZhY2U+IGludGVyZmFjZXMpIHsKKwkJdGhpcy5pbnRlcmZhY2VzID0gaW50ZXJmYWNlczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEljb25QYXRoKCkgeworCQlyZXR1cm4gaWNvblBhdGg7CisJfQorCisJcHVibGljIHZvaWQgc2V0SWNvblBhdGgoU3RyaW5nIGljb25QYXRoKSB7CisJCXRoaXMuaWNvblBhdGggPSBpY29uUGF0aDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlRvc2NhTm9kZVR5cGVJbmZvIFtub2RlTmFtZT0iICsgbm9kZU5hbWUgKyAiLCB0ZW1wbGF0ZVZlcnNpb249IiArIHRlbXBsYXRlVmVyc2lvbiArICIsIGludGVyZmFjZXM9IiArIGludGVyZmFjZXMgKyAiLCBpY29uUGF0aD0iICsgaWNvblBhdGggKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9Ub3NjYU5vZGVUeXBlSW50ZXJmYWNlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvaW5mby9Ub3NjYU5vZGVUeXBlSW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViYWI3NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9pbmZvL1Rvc2NhTm9kZVR5cGVJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVG9zY2FOb2RlVHlwZUludGVyZmFjZSB7CisKKwlMaXN0PFN0cmluZz4gc2NyaXB0czsKKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U2NyaXB0cygpIHsKKwkJcmV0dXJuIHNjcmlwdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2NyaXB0cyhMaXN0PFN0cmluZz4gc2NyaXB0cykgeworCQl0aGlzLnNjcmlwdHMgPSBzY3JpcHRzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2xpc3Rlbi9CRUFwcENvbnRleHRMaXN0ZW5lci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2xpc3Rlbi9CRUFwcENvbnRleHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MGEzZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbGlzdGVuL0JFQXBwQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5saXN0ZW47CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkRvd25sb2FkQXJ0aWZhY3RMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb25pdG9yaW5nLkJlTW9uaXRvcmluZ1NlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5saXN0ZW5lci5BcHBDb250ZXh0TGlzdGVuZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUub25ib2FyZGluZy51ZWIuVWViRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUub25ib2FyZGluZy51ZWIuVWViTWFuYWdlcjsKKworcHVibGljIGNsYXNzIEJFQXBwQ29udGV4dExpc3RlbmVyIGV4dGVuZHMgQXBwQ29udGV4dExpc3RlbmVyIGltcGxlbWVudHMgU2VydmxldENvbnRleHRMaXN0ZW5lciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfRklMRV9OQU1FID0gIi9NRVRBLUlORi9NQU5JRkVTVC5NRiI7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJFQXBwQ29udGV4dExpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIHN0YXRpYyBVZWJNYW5hZ2VyIHVlYk1hbmFnZXIgPSBudWxsOworCisJcHVibGljIHZvaWQgY29udGV4dEluaXRpYWxpemVkKFNlcnZsZXRDb250ZXh0RXZlbnQgY29udGV4dCkgeworCisJCXN1cGVyLmNvbnRleHRJbml0aWFsaXplZChjb250ZXh0KTsKKworCQlDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvblNvdXJjZSgpKTsKKwkJbG9nLmRlYnVnKCJsb2FkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBjb25maWdEaXI6IHt9IGFwcE5hbWU6IHt9IiwgRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENvbmZpZ0RpcigpLCBFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0QXBwTmFtZSgpKTsKKworCQljb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5DT05GSUdVUkFUSU9OX01BTkFHRVJfQVRUUiwgY29uZmlndXJhdGlvbk1hbmFnZXIpOworCisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcENvbnRleHRXcmFwcGVyID0gbmV3IFdlYkFwcENvbnRleHRXcmFwcGVyKCk7CisJCWNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUiwgd2ViQXBwQ29udGV4dFdyYXBwZXIpOworCisJCURvd25sb2FkQXJ0aWZhY3RMb2dpYyBkb3dubG9hZEFydGlmYWN0TG9naWMgPSBuZXcgRG93bmxvYWRBcnRpZmFjdExvZ2ljKCk7CisJCWNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkRPV05MT0FEX0FSVElGQUNUX0xPR0lDX0FUVFIsIGRvd25sb2FkQXJ0aWZhY3RMb2dpYyk7CisKKwkJY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0RDX1JFTEVBU0VfVkVSU0lPTl9BVFRSLCBnZXRWZXJzaW9uRnJvbU1hbmlmZXN0KGNvbnRleHQpKTsKKworCQkvLyBNb25pdG9yaW5nIHNlcnZpY2UKKwkJQmVNb25pdG9yaW5nU2VydmljZSBibXMgPSBuZXcgQmVNb25pdG9yaW5nU2VydmljZShjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpOworCQlibXMuc3RhcnQoY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpLmdldFN5c3RlbU1vbml0b3JpbmcoKS5nZXRQcm9iZUludGVydmFsSW5TZWNvbmRzKDE1KSk7CisKKwkJaW5pdFVlYk1hbmFnZXIoKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGV4ZWN1dGluZyB7fSIsIHRoaXMuZ2V0Q2xhc3MoKSk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdFVlYk1hbmFnZXIoKSB7CisJCXRyeSB7CisJCQlpZiAodWViTWFuYWdlciA9PSBudWxsKSB7CisJCQkJdWViTWFuYWdlciA9IFVlYk1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwkJCQl1ZWJNYW5hZ2VyLmluaXRMaXN0ZW5lcihudWxsKTsKKwkJCX0KKwkJfSBjYXRjaCAoVWViRXhjZXB0aW9uIGV4KSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBpbml0aWFsaXplIFVlYk1hbmFnZXIiLCBleCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxDb25uZWN0aW9uRXJyb3IoIkluaXRVZWJNYW5hZ2VyIiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGxpc3RlbmVyIG9mIFVlYk1hbmFnZXIiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIGluaXQgbGlzdGVuZXIgb2YgVWViTWFuYWdlciIpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBjb250ZXh0KSB7CisJCWlmICh1ZWJNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXVlYk1hbmFnZXIuc2h1dGRvd24oKTsKKwkJCXVlYk1hbmFnZXIgPSBudWxsOworCQl9CisJCXN1cGVyLmNvbnRleHREZXN0cm95ZWQoY29udGV4dCk7CisKKwl9CisKKwlwcml2YXRlIElSZXNvdXJjZU9wZXJhdGlvbiBnZXRSZXNvdXJjZU9wZXJhdGlvbk1hbmFnZXIoQ2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU9wZXJhdGlvbj4gY2xhenosIFdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJDb250ZXh0KSB7CisKKwkJcmV0dXJuIHdlYkNvbnRleHQuZ2V0QmVhbihjbGF6eik7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvbkZyb21NYW5pZmVzdChTZXJ2bGV0Q29udGV4dEV2ZW50IGNvbnRleHQpIHsKKwkJU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7CisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShNQU5JRkVTVF9GSUxFX05BTUUpOworCisJCVN0cmluZyB2ZXJzaW9uID0gbnVsbDsKKwkJdHJ5IHsKKwkJCU1hbmlmZXN0IG1mID0gbmV3IE1hbmlmZXN0KGlucHV0U3RyZWFtKTsKKwkJCUF0dHJpYnV0ZXMgYXR0cyA9IG1mLmdldE1haW5BdHRyaWJ1dGVzKCk7CisJCQl2ZXJzaW9uID0gYXR0cy5nZXRWYWx1ZShDb25zdGFudHMuU0RDX1JFTEVBU0VfVkVSU0lPTl9BVFRSKTsKKwkJCWlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi5pc0VtcHR5KCkpIHsKKwkJCQlsb2cud2FybigiZmFpbGVkIHRvIHJlYWQgQVNEQyB2ZXJzaW9uIGZyb20gTUFOSUZFU1QuIik7CisJCQl9IGVsc2UgeworCQkJCWxvZy5pbmZvKCJBU0RDIHZlcnNpb24gZnJvbSBNQU5JRkVTVCBpcyB7fSIsIHZlcnNpb24pOworCQkJfQorCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy53YXJuKCJmYWlsZWQgdG8gcmVhZCBBU0RDIHZlcnNpb24gZnJvbSBNQU5JRkVTVCIsIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCisJCXJldHVybiB2ZXJzaW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vbml0b3JpbmcvRXNHYXRld2F5LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9uaXRvcmluZy9Fc0dhdGV3YXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGE1NmNkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vbml0b3JpbmcvRXNHYXRld2F5LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50LmFwaS5SZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkucHJveHkuUHJveHlTZXJ2bGV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Nb25pdG9yaW5nQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBFc0dhdGV3YXkgZXh0ZW5kcyBQcm94eVNlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEVzR2F0ZXdheS5jbGFzcy5nZXROYW1lKCkpOworCisJQE92ZXJyaWRlCisJcHVibGljIFVSSSByZXdyaXRlVVJJKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIG9yaWdpbmFsVXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisKKwkJU3RyaW5nIHJlZGlyZWN0ZWRVcmwgPSBnZXRNb2RpZmllZFVybChyZXF1ZXN0KTsKKworCQlsb2cuZGVidWcoIkVzR2F0ZXdheSBSZWRpcmVjdGluZyByZXF1ZXN0IGZyb206IHt9ICwgdG86IHt9Iiwgb3JpZ2luYWxVcmwsIHJlZGlyZWN0ZWRVcmwpOworCQlyZXR1cm4gVVJJLmNyZWF0ZShyZWRpcmVjdGVkVXJsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjdXN0b21pemVQcm94eVJlcXVlc3QoUmVxdWVzdCBwcm94eVJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCXN1cGVyLmN1c3RvbWl6ZVByb3h5UmVxdWVzdChwcm94eVJlcXVlc3QsIHJlcXVlc3QpOworCisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgb25SZXNwb25zZVN1Y2Nlc3MoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFJlc3BvbnNlIHByb3h5UmVzcG9uc2UpIHsKKwkJc3VwZXIub25SZXNwb25zZVN1Y2Nlc3MocmVxdWVzdCwgcmVzcG9uc2UsIHByb3h5UmVzcG9uc2UpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZWRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJU3RyaW5nIGVzSG9zdCA9IG51bGw7CisJCVN0cmluZyBlc1BvcnQgPSBudWxsOworCQlNb25pdG9yaW5nQnVzaW5lc3NMb2dpYyBtb25pdG9yaW5nQkwgPSBnZXRNb25pdG9yaW5nQkwocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCWlmIChtb25pdG9yaW5nQkwgPT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gcmV0cml2ZSBtb25pdG9yaW5nQkwuIik7CisJCX0gZWxzZSB7CisJCQllc0hvc3QgPSBtb25pdG9yaW5nQkwuZ2V0RXNIb3N0KCk7CisJCQllc1BvcnQgPSBtb25pdG9yaW5nQkwuZ2V0RXNQb3J0KCk7CisJCX0KKworCQlTdHJpbmcgc2NoZW1lID0gcmVxdWVzdC5nZXRTY2hlbWUoKTsKKwkJU3RyaW5nIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOyAvLyAvbXl3ZWJhcHAKKwkJU3RyaW5nIHNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOyAvLyAvc2VydmxldC9NeVNlcnZsZXQKKwkJU3RyaW5nIHBhdGhJbmZvID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOyAvLyAvYS9iO2M9MTIzCisJCVN0cmluZyBxdWVyeVN0cmluZyA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsgLy8gZD03ODkKKworCQlTdHJpbmdCdWlsZGVyIHVybCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXVybC5hcHBlbmQoc2NoZW1lKS5hcHBlbmQoIjovLyIpLmFwcGVuZChlc0hvc3QpOworCQl1cmwuYXBwZW5kKCI6IikuYXBwZW5kKGVzUG9ydCk7CisJCXVybC5hcHBlbmQoY29udGV4dFBhdGgpLmFwcGVuZChzZXJ2bGV0UGF0aCk7CisKKwkJaWYgKHBhdGhJbmZvICE9IG51bGwpIHsKKwkJCXVybC5hcHBlbmQocGF0aEluZm8pOworCQl9CisJCWlmIChxdWVyeVN0cmluZyAhPSBudWxsKSB7CisJCQl1cmwuYXBwZW5kKCI/IikuYXBwZW5kKHF1ZXJ5U3RyaW5nKTsKKwkJfQorCisJCVN0cmluZyByZWRpcmVjdGVkVXJsID0gdXJsLnRvU3RyaW5nKCkucmVwbGFjZSgiL3NkYzIvZXNHYXRld2F5LyIsICIvIik7CisJCXJldHVybiByZWRpcmVjdGVkVXJsOworCisJfQorCisJcHJvdGVjdGVkIE1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljIGdldE1vbml0b3JpbmdCTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCU1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljIG1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oTW9uaXRvcmluZ0J1c2luZXNzTG9naWMuY2xhc3MpOworCisJCXJldHVybiBtb25pdG9yaW5nQnVzaW5lc3NMb2dpYzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9BYnN0cmFjdFZhbGlkYXRpb25zU2VydmxldC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0Fic3RyYWN0VmFsaWRhdGlvbnNTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4YWRkZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9BYnN0cmFjdFZhbGlkYXRpb25zU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsODQzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ3NhclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW1wb3J0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzLlJlc3VsdFN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzLlRvc2NhRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5Ub3NjYVRhZ05hbWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuUmVzb3VyY2VJbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLlNlcnZsZXRVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5VcGxvYWRSZXNvdXJjZUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuUmVzb3VyY2VVcGxvYWRTZXJ2bGV0LlJlc291cmNlQXV0aG9yaXR5VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5JVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuVXBsb2FkQXJ0aWZhY3RJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5HZW5lcmFsVXRpbGl0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5ZYW1sVG9PYmplY3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuWmlwVXRpbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblN5bnRheEV4Y2VwdGlvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uc1NlcnZsZXQgZXh0ZW5kcyBCZUdlbmVyaWNTZXJ2bGV0IHsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgU2VydmxldFV0aWxzIHNlcnZsZXRVdGlsczsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgUmVzb3VyY2VJbXBvcnRNYW5hZ2VyIHJlc291cmNlSW1wb3J0TWFuYWdlcjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlsczsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBMT0NLID0gbmV3IE9iamVjdCgpOworCXByaXZhdGUgTG9nZ2VyIGxvZyA9IG51bGw7CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KExvZ2dlciBsb2cpIHsKKwkJaW5pdExvZyhsb2cpOworCQlpbml0U3ByaW5nRnJvbUNvbnRleHQoKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBpbml0TG9nKExvZ2dlciBsb2cpIHsKKwkJaWYgKHRoaXMubG9nID09IG51bGwpIHsKKwkJCXN5bmNocm9uaXplZCAoTE9DSykgeworCQkJCWlmICh0aGlzLmxvZyA9PSBudWxsKSB7CisJCQkJCXRoaXMubG9nID0gbG9nOworCQkJCX0KKworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRTcHJpbmdGcm9tQ29udGV4dCgpIHsKKwkJaWYgKHNlcnZsZXRVdGlscyA9PSBudWxsKSB7CisJCQlzeW5jaHJvbml6ZWQgKExPQ0spIHsKKwkJCQlpZiAoc2VydmxldFV0aWxzID09IG51bGwpIHsKKwkJCQkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHNlcnZsZXRSZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQkJCQlXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID0gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKwkJCQkJV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChjb250ZXh0KTsKKwkJCQkJc2VydmxldFV0aWxzID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oU2VydmxldFV0aWxzLmNsYXNzKTsKKwkJCQkJcmVzb3VyY2VJbXBvcnRNYW5hZ2VyID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oUmVzb3VyY2VJbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlc291cmNlRG9lc05vdEV4aXN0KFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgVXNlciB1c2VyLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCWlmIChyZXNvdXJjZUltcG9ydE1hbmFnZXIuaXNSZXNvdXJjZUV4aXN0KHJlc291cmNlTmFtZSkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX0FMUkVBRFlfRVhJU1RTKTsKKwkJCVJlc3BvbnNlIGVycm9yUmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbSA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCQlhZGRpdGlvbmFsUGFyYW0ucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgcmVzb3VyY2VOYW1lKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG51bGwsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVzZXJFeGlzdChXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFdyYXBwZXI8VXNlcj4gdXNlcldyYXBwZXIsIFN0cmluZyB1c2VySWQpIHsKKwkJbG9nLmRlYnVnKCJnZXQgdXNlciB7fSBmcm9tIERCIiwgdXNlcklkKTsKKwkJLy8gZ2V0IHVzZXIgZGV0YWlscworCQlpZiAodXNlcklkID09IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJ1c2VyIHVzZXJJZCBpcyBudWxsIik7CisJCQlSZXNwb25zZSByZXNwb25zZSA9IHJldHVybk1pc3NpbmdJbmZvcm1hdGlvbihuZXcgVXNlcigpKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzcG9uc2UpOworCQl9CisKKwkJZWxzZSB7CisJCQlJVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluID0gZ2V0U2VydmxldFV0aWxzKCkuZ2V0VXNlckFkbWluKCk7CisJCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdG9yID0gdXNlckFkbWluLmdldFVzZXIodXNlcklkLCBmYWxzZSk7CisJCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuaW5mbygidXNlciBpcyBub3QgbGlzdGVkLiB1c2VySWQ9e30iLCB1c2VySWQpOworCQkJCVVzZXIgdXNlciA9IG5ldyBVc2VyKCk7CisJCQkJdXNlci5zZXRVc2VySWQodXNlcklkKTsKKwkJCQlSZXNwb25zZSByZXNwb25zZSA9IHJldHVybk1pc3NpbmdJbmZvcm1hdGlvbih1c2VyKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlKTsKKwkJCX0gZWxzZSB7CisJCQkJdXNlcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIFJlc3BvbnNlIHJldHVybk1pc3NpbmdJbmZvcm1hdGlvbihVc2VyIHVzZXIpIHsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTik7CisJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG51bGwsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgbnVsbCk7CisJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGF0YU5vdE51bGwoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBPYmplY3QuLi4gZGF0YVBhcmFtcykgeworCQlmb3IgKE9iamVjdCBkYXRhRWxlbWVudCA6IGRhdGFQYXJhbXMpIHsKKwkJCWlmIChkYXRhRWxlbWVudCA9PSBudWxsKSB7CisJCQkJbG9nLmluZm8oIkludmFsaWQgYm9keSB3YXMgcmVjZWl2ZWQuIik7CisJCQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzcG9uc2UpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVVzZXJSb2xlKFdyYXBwZXI8UmVzcG9uc2U+IGVycm9yUmVzcG9uc2VXcmFwcGVyLCBVc2VyIHVzZXIpIHsKKwkJbG9nLmRlYnVnKCJ2YWxpZGF0ZSB1c2VyIHJvbGUiKTsKKwkJaWYgKCF1c2VyLmdldFJvbGUoKS5lcXVhbHMoUm9sZS5BRE1JTi5uYW1lKCkpICYmICF1c2VyLmdldFJvbGUoKS5lcXVhbHMoUm9sZS5ERVNJR05FUi5uYW1lKCkpKSB7CisJCQlsb2cuaW5mbygidXNlciBpcyBub3QgaW4gYXBwcm9wcmlhdGUgcm9sZSB0byBwZXJmb3JtIGFjdGlvbiIpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJbG9nLmRlYnVnKCJhdWRpdCBiZWZvcmUgc2VuZGluZyByZXNwb25zZSIpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBudWxsKTsKKworCQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJZXJyb3JSZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlKTsKKwkJfQorCisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVaaXAoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBGaWxlIGZpbGUsIFN0cmluZyBwYXlsb2FkTmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCUlucHV0U3RyZWFtIGZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gdW56aXBwZWRGb2xkZXIgPSBaaXBVdGlsLnJlYWRaaXAobmV3IFppcElucHV0U3RyZWFtKGZpbGVJbnB1dFN0cmVhbSkpOworCQlpZiAocGF5bG9hZE5hbWUgPT0gbnVsbCB8fCBwYXlsb2FkTmFtZS5pc0VtcHR5KCkgfHwgIXVuemlwcGVkRm9sZGVyLmNvbnRhaW5zS2V5KHBheWxvYWROYW1lKSkgeworCQkJbG9nLmluZm8oIkludmFsaWQganNvbiB3YXMgcmVjZWl2ZWQuIHBheWxvYWROYW1lIHNob3VsZCBiZSB5bWwgZmlsZSBuYW1lIik7CisJCQlSZXNwb25zZSBlcnJvclJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIGZpbGxaaXBDb250ZW50cyhXcmFwcGVyPFN0cmluZz4geWFtbFN0cmluZ1dyYXBwZXIsIEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCUlucHV0U3RyZWFtIGZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gdW56aXBwZWRGb2xkZXIgPSBaaXBVdGlsLnJlYWRaaXAobmV3IFppcElucHV0U3RyZWFtKGZpbGVJbnB1dFN0cmVhbSkpOworCQlTdHJpbmcgeW1sTmFtZSA9IHVuemlwcGVkRm9sZGVyLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQlmaWxsVG9zY2FUZW1wbGF0ZUZyb21aaXAoeWFtbFN0cmluZ1dyYXBwZXIsIHltbE5hbWUsIGZpbGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGZpbGxUb3NjYVRlbXBsYXRlRnJvbVppcChXcmFwcGVyPFN0cmluZz4geWFtbFN0cmluZ1dyYXBwZXIsIFN0cmluZyBwYXlsb2FkTmFtZSwgRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gZmlsZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJTWFwPFN0cmluZywgYnl0ZVtdPiB1bnppcHBlZEZvbGRlciA9IFppcFV0aWwucmVhZFppcChuZXcgWmlwSW5wdXRTdHJlYW0oZmlsZUlucHV0U3RyZWFtKSk7CisJCWJ5dGVbXSB5YW1sRmlsZUluQnl0ZXMgPSB1bnppcHBlZEZvbGRlci5nZXQocGF5bG9hZE5hbWUpOworCQlTdHJpbmcgeWFtbEFzU3RyaW5nID0gbmV3IFN0cmluZyh5YW1sRmlsZUluQnl0ZXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworCQlsb2cuZGVidWcoInJlY2VpdmVkIHlhbWw6IHt9IiwgeWFtbEFzU3RyaW5nKTsKKwkJeWFtbFN0cmluZ1dyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHlhbWxBc1N0cmluZyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVVc2VyUm9sZShXcmFwcGVyPFJlc3BvbnNlPiBlcnJvclJlc3BvbnNlV3JhcHBlciwgVXNlciB1c2VyLCBSZXNvdXJjZUF1dGhvcml0eVR5cGVFbnVtIHJlc291cmNlQXV0aG9yaXR5KSB7CisJCWxvZy5kZWJ1ZygidmFsaWRhdGUgdXNlciByb2xlIik7CisJCWlmIChyZXNvdXJjZUF1dGhvcml0eSA9PSBSZXNvdXJjZUF1dGhvcml0eVR5cGVFbnVtLk5PUk1BVElWRV9UWVBFX0JFKSB7CisJCQlpZiAoIXVzZXIuZ2V0Um9sZSgpLmVxdWFscyhSb2xlLkFETUlOLm5hbWUoKSkpIHsKKwkJCQlsb2cuaW5mbygidXNlciBpcyBub3QgaW4gYXBwcm9wcmlhdGUgcm9sZSB0byBwZXJmb3JtIGFjdGlvbiIpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJCQlsb2cuZGVidWcoImF1ZGl0IGJlZm9yZSBzZW5kaW5nIHJlc3BvbnNlIik7CisJCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBudWxsKTsKKworCQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCQllcnJvclJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzcG9uc2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFsaWRhdGVVc2VyUm9sZShlcnJvclJlc3BvbnNlV3JhcHBlciwgdXNlcik7CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQW5kRmlsbFJlc291cmNlSnNvbihXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFdyYXBwZXI8VXBsb2FkUmVzb3VyY2VJbmZvPiB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLCBVc2VyIHVzZXIsIFJlc291cmNlQXV0aG9yaXR5VHlwZUVudW0gcmVzb3VyY2VBdXRob3JpdHlFbnVtLCBTdHJpbmcgcmVzb3VyY2VJbmZvKSB7CisJCWJvb2xlYW4gaXNWYWxpZDsKKwkJdHJ5IHsKKwkJCWxvZy5kZWJ1ZygiVGhlIHJlY2VpdmVkIGpzb24gaXMge30iLCByZXNvdXJjZUluZm8pOworCQkJVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mb09iamVjdCA9IGdzb24uZnJvbUpzb24ocmVzb3VyY2VJbmZvLCBVcGxvYWRSZXNvdXJjZUluZm8uY2xhc3MpOworCQkJaWYgKHJlc291cmNlSW5mb09iamVjdCA9PSBudWxsKSB7CisJCQkJaXNWYWxpZCA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXJlc291cmNlQXV0aG9yaXR5RW51bS5pc0JhY2tFbmRJbXBvcnQoKSkgeworCQkJCQlpc1ZhbGlkID0gcmVzb3VyY2VJbmZvT2JqZWN0LmdldFBheWxvYWROYW1lKCkgIT0gbnVsbCAmJiAhcmVzb3VyY2VJbmZvT2JqZWN0LmdldFBheWxvYWROYW1lKCkuaXNFbXB0eSgpOworCQkJCQkvLyBUT0RPIFRhbCBvbmx5IHJlc291cmNlIG5hbWUgaXMgY2hlY2tlZAorCQkJCX0gZWxzZSB7CisJCQkJCWlzVmFsaWQgPSB0cnVlOworCQkJCX0KKwkJCQl1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNvdXJjZUluZm9PYmplY3QpOworCQkJfQorCisJCX0gY2F0Y2ggKEpzb25TeW50YXhFeGNlcHRpb24gZSkgeworCQkJaXNWYWxpZCA9IGZhbHNlOworCisJCX0KKwkJaWYgKCFpc1ZhbGlkKSB7CisJCQlsb2cuaW5mbygiSW52YWxpZCBqc29uIHdhcyByZWNlaXZlZC4iKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBudWxsLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UsIG51bGwpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXV0aG9yaXR5VHlwZShXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFN0cmluZyBhdXRob3JpdHlUeXBlKSB7CisJCWxvZy5kZWJ1ZygiVGhlIHJlY2VpdmVkIGF1dGhvcml0eSB0eXBlIGlzIHt9IiwgYXV0aG9yaXR5VHlwZSk7CisJCVJlc291cmNlQXV0aG9yaXR5VHlwZUVudW0gYXV0aG9yaXR5VHlwZUVudW0gPSBSZXNvdXJjZUF1dGhvcml0eVR5cGVFbnVtLmZpbmRCeVVybFBhdGgoYXV0aG9yaXR5VHlwZSk7CisJCWlmIChhdXRob3JpdHlUeXBlRW51bSA9PSBudWxsKSB7CisJCQlsb2cuaW5mbygiSW52YWxpZCBhdXRob3JpdHkgdHlwZSB3YXMgcmVjZWl2ZWQuIik7CisJCQlSZXNwb25zZSBlcnJvclJlc3AgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3ApOworCQl9CisJfQorCisJcHVibGljIFNlcnZsZXRVdGlscyBnZXRTZXJ2bGV0VXRpbHMoKSB7CisJCWluaXRTcHJpbmdGcm9tQ29udGV4dCgpOworCQlyZXR1cm4gc2VydmxldFV0aWxzOworCX0KKworCXB1YmxpYyBHc29uIGdldEdzb24oKSB7CisJCXJldHVybiBnZXRTZXJ2bGV0VXRpbHMoKS5nZXRHc29uKCk7CisJfQorCisJcHVibGljIENvbXBvbmVudHNVdGlscyBnZXRDb21wb25lbnRzVXRpbHMoKSB7CisJCXJldHVybiBnZXRTZXJ2bGV0VXRpbHMoKS5nZXRDb21wb25lbnRzVXRpbHMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBheWxvYWRJc1Rvc2NhKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgVXBsb2FkUmVzb3VyY2VJbmZvIHVwbG9hZFJlc291cmNlSW5mbywgVXNlciB1c2VyLCBTdHJpbmcgdG9zY2FQYXlsb2FkKSB7CisJCWxvZy5kZWJ1ZygiY2hlY2tpbmcgcGF5bG9hZCBpcyB2YWxpZCB0b3NjYSIpOworCQlib29sZWFuIGlzVmFsaWQ7CisJCVN0cmluZyBoZWF0RGVjb2RlZFBheWxvYWQgPSAoR2VuZXJhbFV0aWxpdHkuaXNCYXNlNjRFbmNvZGVkKHRvc2NhUGF5bG9hZCkpID8gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlQmFzZTY0KHRvc2NhUGF5bG9hZCkpIDogdG9zY2FQYXlsb2FkOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcHBlZFRvc2NhVGVtcGxhdGUgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbmV3IFlhbWwoKS5sb2FkKGhlYXREZWNvZGVkUGF5bG9hZCk7CisJCUVpdGhlcjxTdHJpbmcsIFJlc3VsdFN0YXR1c0VudW0+IGZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudCA9IEltcG9ydFV0aWxzLmZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudChtYXBwZWRUb3NjYVRlbXBsYXRlLCBUb3NjYVRhZ05hbWVzRW51bS5UT1NDQV9WRVJTSU9OKTsKKworCQlpZiAoZmluZEZpcnN0VG9zY2FTdHJpbmdFbGVtZW50LmlzUmlnaHQoKSkgeworCQkJaXNWYWxpZCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJU3RyaW5nIGRlZmVuaXRpb25WZXJzaW9uRm91bmQgPSBmaW5kRmlyc3RUb3NjYVN0cmluZ0VsZW1lbnQubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoZGVmZW5pdGlvblZlcnNpb25Gb3VuZCA9PSBudWxsIHx8IGRlZmVuaXRpb25WZXJzaW9uRm91bmQuaXNFbXB0eSgpKSB7CisJCQkJaXNWYWxpZCA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlpc1ZhbGlkID0gSW1wb3J0VXRpbHMuQ29uc3RhbnRzLlRPU0NBX0RFRklOSVRJT05fVkVSU0lPTlMuY29udGFpbnMoZGVmZW5pdGlvblZlcnNpb25Gb3VuZCk7CisJCQl9CisJCX0KKworCQlpZiAoIWlzVmFsaWQpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfVE9TQ0FfVEVNUExBVEUpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCB1cGxvYWRSZXNvdXJjZUluZm8uZ2V0TmFtZSgpKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG51bGwsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGF5bG9hZElzWW1sKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgVXNlciB1c2VyLCBVcGxvYWRSZXNvdXJjZUluZm8gdXBsb2FkUmVzb3VyY2VJbmZvLCBTdHJpbmcgdG9zY2FUYW1wbGF0ZVBheWxvYWQpIHsKKwkJbG9nLmRlYnVnKCJjaGVja2luZyB0b3NjYSB0ZW1wbGF0ZSBpcyB2YWxpZCB5bWwiKTsKKwkJWWFtbFRvT2JqZWN0Q29udmVydGVyIHlhbWxDb252ZXJ0b3IgPSBuZXcgWWFtbFRvT2JqZWN0Q29udmVydGVyKCk7CisJCWJvb2xlYW4gaXNZYW1sVmFsaWQgPSB5YW1sQ29udmVydG9yLmlzVmFsaWRZYW1sKHRvc2NhVGFtcGxhdGVQYXlsb2FkLmdldEJ5dGVzKCkpOworCQlpZiAoIWlzWWFtbFZhbGlkKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUxfRklMRSk7CisJCQlSZXNwb25zZSBlcnJvclJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW0gPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHVwbG9hZFJlc291cmNlSW5mby5nZXROYW1lKCkpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGF5bG9hZE5hbWVTcGFjZShXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIFVzZXIgdXNlciwgU3RyaW5nIHRvc2NhUGF5bG9hZCkgeworCQlib29sZWFuIGlzVmFsaWQ7CisJCVN0cmluZyBuYW1lU3BhY2UgPSAiIjsKKworCQlTdHJpbmcgaGVhdERlY29kZWRQYXlsb2FkID0gKEdlbmVyYWxVdGlsaXR5LmlzQmFzZTY0RW5jb2RlZCh0b3NjYVBheWxvYWQpKSA/IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZUJhc2U2NCh0b3NjYVBheWxvYWQpKSA6IHRvc2NhUGF5bG9hZDsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXBwZWRUb3NjYVRlbXBsYXRlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5ldyBZYW1sKCkubG9hZChoZWF0RGVjb2RlZFBheWxvYWQpOworCQlFaXRoZXI8TWFwPFN0cmluZywgT2JqZWN0PiwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FFbGVtZW50ID0gSW1wb3J0VXRpbHMuZmluZEZpcnN0VG9zY2FNYXBFbGVtZW50KG1hcHBlZFRvc2NhVGVtcGxhdGUsIFRvc2NhVGFnTmFtZXNFbnVtLk5PREVfVFlQRVMpOworCQlpZiAodG9zY2FFbGVtZW50LmlzUmlnaHQoKSB8fCB0b3NjYUVsZW1lbnQubGVmdCgpLnZhbHVlKCkuc2l6ZSgpICE9IDEpIHsKKwkJCWlzVmFsaWQgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCW5hbWVTcGFjZSA9IHRvc2NhRWxlbWVudC5sZWZ0KCkudmFsdWUoKS5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKwkJCWlzVmFsaWQgPSBuYW1lU3BhY2Uuc3RhcnRzV2l0aChDb25zdGFudHMuVVNFUl9ERUZJTkVEX1JFU09VUkNFX05BTUVTUEFDRV9QUkVGSVgpOworCQl9CisJCWlmICghaXNWYWxpZCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9SRVNPVVJDRV9OQU1FU1BBQ0UpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCByZXNvdXJjZUluZm8uZ2V0TmFtZSgpKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG51bGwsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgc3RyMSA9IG5hbWVTcGFjZS5zdWJzdHJpbmcoQ29uc3RhbnRzLlVTRVJfREVGSU5FRF9SRVNPVVJDRV9OQU1FU1BBQ0VfUFJFRklYLmxlbmd0aCgpKTsKKwkJCVN0cmluZ1tdIGZpbmRUeXBlcyA9IHN0cjEuc3BsaXQoIlxcLiIpOworCQkJaWYgKFJlc291cmNlVHlwZUVudW0uY29udGFpbnMoZmluZFR5cGVzWzBdLnRvVXBwZXJDYXNlKCkpKSB7CisJCQkJU3RyaW5nIHR5cGUgPSBmaW5kVHlwZXNbMF0udG9VcHBlckNhc2UoKTsKKwkJCQlyZXNvdXJjZUluZm8uc2V0UmVzb3VyY2VUeXBlKHR5cGUpOworCQkJfSBlbHNlIHsKKwkJCQlyZXNvdXJjZUluZm8uc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLm5hbWUoKSk7CisJCQl9CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGF5bG9hZElzU2luZ2xlUmVzb3VyY2UoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBVcGxvYWRSZXNvdXJjZUluZm8gdXBsb2FkUmVzb3VyY2VJbmZvLCBVc2VyIHVzZXIsIFN0cmluZyB0b3NjYVBheWxvYWQpIHsKKwkJbG9nLmRlYnVnKCJjaGVja2luZyBwYXlsb2FkIGNvbnRhaW5zIHNpbmdsZSByZXNvdXJjZSIpOworCQlib29sZWFuIGlzVmFsaWQ7CisJCVN0cmluZyBoZWF0RGVjb2RlZFBheWxvYWQgPSAoR2VuZXJhbFV0aWxpdHkuaXNCYXNlNjRFbmNvZGVkKHRvc2NhUGF5bG9hZCkpID8gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlQmFzZTY0KHRvc2NhUGF5bG9hZCkpIDogdG9zY2FQYXlsb2FkOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcHBlZFRvc2NhVGVtcGxhdGUgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbmV3IFlhbWwoKS5sb2FkKGhlYXREZWNvZGVkUGF5bG9hZCk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBPYmplY3Q+LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYUVsZW1lbnQgPSBJbXBvcnRVdGlscy5maW5kRmlyc3RUb3NjYU1hcEVsZW1lbnQobWFwcGVkVG9zY2FUZW1wbGF0ZSwgVG9zY2FUYWdOYW1lc0VudW0uTk9ERV9UWVBFUyk7CisJCWlmICh0b3NjYUVsZW1lbnQuaXNSaWdodCgpKSB7CisJCQlpc1ZhbGlkID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlpc1ZhbGlkID0gdG9zY2FFbGVtZW50LmxlZnQoKS52YWx1ZSgpLnNpemUoKSA9PSAxOworCQl9CisKKwkJaWYgKCFpc1ZhbGlkKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT1RfU0lOR0xFX1JFU09VUkNFKTsKKwkJCVJlc3BvbnNlIGVycm9yUmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbSA9IG5ldyBFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4oQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5jbGFzcyk7CisJCQlhZGRpdGlvbmFsUGFyYW0ucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRSwgdXBsb2FkUmVzb3VyY2VJbmZvLmdldE5hbWUoKSk7CisJCQlnZXRDb21wb25lbnRzVXRpbHMoKS5hdWRpdFJlc291cmNlKHJlc3BvbnNlRm9ybWF0LCB1c2VyLCBudWxsLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5JTVBPUlRfUkVTT1VSQ0UsIGFkZGl0aW9uYWxQYXJhbSk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVycm9yUmVzcG9uc2UpOworCQl9CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBheWxvYWRJc05vdFNlcnZpY2UoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBVc2VyIHVzZXIsIFVwbG9hZFJlc291cmNlSW5mbyB1cGxvYWRSZXNvdXJjZUluZm8sIFN0cmluZyB0b3NjYVBheWxvYWQpIHsKKwkJbG9nLmRlYnVnKCJjaGVja2luZyBwYXlsb2FkIGlzIG5vdCBhIHRvc2NhIHNlcnZpY2UiKTsKKwkJU3RyaW5nIGhlYXREZWNvZGVkUGF5bG9hZCA9IChHZW5lcmFsVXRpbGl0eS5pc0Jhc2U2NEVuY29kZWQodG9zY2FQYXlsb2FkKSkgPyBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGVCYXNlNjQodG9zY2FQYXlsb2FkKSkgOiB0b3NjYVBheWxvYWQ7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwcGVkVG9zY2FUZW1wbGF0ZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBuZXcgWWFtbCgpLmxvYWQoaGVhdERlY29kZWRQYXlsb2FkKTsKKwkJRWl0aGVyPE9iamVjdCwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FFbGVtZW50ID0gSW1wb3J0VXRpbHMuZmluZFRvc2NhRWxlbWVudChtYXBwZWRUb3NjYVRlbXBsYXRlLCBUb3NjYVRhZ05hbWVzRW51bS5UT1BPTE9HWV9URU1QTEFURSwgVG9zY2FFbGVtZW50VHlwZUVudW0uQUxMKTsKKworCQlpZiAodG9zY2FFbGVtZW50LmlzTGVmdCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT1RfUkVTT1VSQ0VfVE9TQ0FfVEVNUExBVEUpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCB1cGxvYWRSZXNvdXJjZUluZm8uZ2V0TmFtZSgpKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG51bGwsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGF5bG9hZElzVG9wb2xvZ3lUZW1wbGF0ZShXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFVzZXIgdXNlciwgVXBsb2FkUmVzb3VyY2VJbmZvIHVwbG9hZFJlc291cmNlSW5mbywgU3RyaW5nIHRvc2NhUGF5bG9hZCkgeworCQlsb2cuZGVidWcoImNoZWNraW5nIHBheWxvYWQgaXMgYSB0b3NjYSB0b3BvbG9neSB0ZW1wbGF0ZSIpOworCQlTdHJpbmcgaGVhdERlY29kZWRQYXlsb2FkID0gKEdlbmVyYWxVdGlsaXR5LmlzQmFzZTY0RW5jb2RlZCh0b3NjYVBheWxvYWQpKSA/IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZUJhc2U2NCh0b3NjYVBheWxvYWQpKSA6IHRvc2NhUGF5bG9hZDsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXBwZWRUb3NjYVRlbXBsYXRlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIG5ldyBZYW1sKCkubG9hZChoZWF0RGVjb2RlZFBheWxvYWQpOworCQlFaXRoZXI8T2JqZWN0LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYUVsZW1lbnQgPSBJbXBvcnRVdGlscy5maW5kVG9zY2FFbGVtZW50KG1hcHBlZFRvc2NhVGVtcGxhdGUsIFRvc2NhVGFnTmFtZXNFbnVtLlRPUE9MT0dZX1RFTVBMQVRFLCBUb3NjYUVsZW1lbnRUeXBlRW51bS5BTEwpOworCisJCWlmICh0b3NjYUVsZW1lbnQuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT1RfVE9QT0xPR1lfVE9TQ0FfVEVNUExBVEUpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCB1cGxvYWRSZXNvdXJjZUluZm8uZ2V0TmFtZSgpKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG51bGwsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVG9zY2FUZW1wbGF0ZVBheWxvYWROYW1lKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgVXBsb2FkUmVzb3VyY2VJbmZvIHVwbG9hZFJlc291cmNlSW5mbywgVXNlciB1c2VyKSB7CisJCVN0cmluZyB0b3NjYVRlbXBsYXRlUGF5bG9hZE5hbWUgPSB1cGxvYWRSZXNvdXJjZUluZm8uZ2V0UGF5bG9hZE5hbWUoKTsKKwkJYm9vbGVhbiBpc1ZhbGlkU3VmZml4ID0gZmFsc2U7CisJCWlmICh0b3NjYVRlbXBsYXRlUGF5bG9hZE5hbWUgIT0gbnVsbCAmJiAhdG9zY2FUZW1wbGF0ZVBheWxvYWROYW1lLmlzRW1wdHkoKSkgeworCQkJZm9yIChTdHJpbmcgdmFsaWRTdWZmaXggOiBJbXBvcnRVdGlscy5Db25zdGFudHMuVE9TQ0FfWU1MX0NTQVJfVkFMSURfU1VGRklYKSB7CisJCQkJaXNWYWxpZFN1ZmZpeCA9IGlzVmFsaWRTdWZmaXggfHwgdG9zY2FUZW1wbGF0ZVBheWxvYWROYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgodmFsaWRTdWZmaXgpOworCQkJfQorCQl9CisJCWlmICghaXNWYWxpZFN1ZmZpeCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9UT1NDQV9GSUxFX0VYVEVOU0lPTik7CisJCQlSZXNwb25zZSBlcnJvclJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW0gPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHVwbG9hZFJlc291cmNlSW5mby5nZXROYW1lKCkpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKwkJfQorCisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNRDUoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBVc2VyIHVzZXIsIFVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcmVzb3VyY2VJbmZvSnNvblN0cmluZykgeworCQlib29sZWFuIGlzVmFsaWQ7CisJCVN0cmluZyByZWNpZXZlZE1ENSA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5NRDVfSEVBREVSKTsKKwkJaWYgKHJlY2lldmVkTUQ1ID09IG51bGwpIHsKKwkJCWlzVmFsaWQgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBjYWxjdWxhdGVNRDUgPSBHZW5lcmFsVXRpbGl0eS5jYWxjdWxhdGVNRDVCeVN0cmluZyhyZXNvdXJjZUluZm9Kc29uU3RyaW5nKTsKKwkJCWlzVmFsaWQgPSBjYWxjdWxhdGVNRDUuZXF1YWxzKHJlY2lldmVkTUQ1KTsKKwkJfQorCQlpZiAoIWlzVmFsaWQpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfUkVTT1VSQ0VfQ0hFQ0tTVU0pOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCByZXNvdXJjZUluZm8uZ2V0TmFtZSgpKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIG51bGwsICIiLCAiIiwgQXVkaXRpbmdBY3Rpb25FbnVtLklNUE9SVF9SRVNPVVJDRSwgYWRkaXRpb25hbFBhcmFtKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwb25zZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudFR5cGUoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBXcmFwcGVyPENvbXBvbmVudFR5cGVFbnVtPiBjb21wb25lbnRXcmFwcGVyLCBTdHJpbmcgY29tcG9uZW50VHlwZSkgeworCQlib29sZWFuIGlzVmFsaWQ7CisJCWlmIChjb21wb25lbnRUeXBlID09IG51bGwpIHsKKwkJCWlzVmFsaWQgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FLmVxdWFsc0lnbm9yZUNhc2UoY29tcG9uZW50VHlwZSkpIHsKKwkJCQlpc1ZhbGlkID0gdHJ1ZTsKKwkJCQljb21wb25lbnRXcmFwcGVyLnNldElubmVyRWxlbWVudChDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCQl9IGVsc2UgaWYgKENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKGNvbXBvbmVudFR5cGUpKSB7CisJCQkJaXNWYWxpZCA9IHRydWU7CisJCQkJY29tcG9uZW50V3JhcHBlci5zZXRJbm5lckVsZW1lbnQoQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCQl9IGVsc2UgeworCQkJCWlzVmFsaWQgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAoIWlzVmFsaWQpIHsKKwkJCWxvZy5kZWJ1ZygiSW52YWxpZCBjb21wb25lbnRUeXBlOnt9IiwgY29tcG9uZW50VHlwZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZXJyb3JSZXNwKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGZpbGxUb3NjYVRlbXBsYXRlRnJvbUpzb24oV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBXcmFwcGVyPFN0cmluZz4geWFtbFN0cmluZ1dyYXBwZXIsIFVzZXIgdXNlciwgVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbykgeworCQlpZiAocmVzb3VyY2VJbmZvLmdldFBheWxvYWREYXRhKCkgPT0gbnVsbCB8fCByZXNvdXJjZUluZm8uZ2V0UGF5bG9hZERhdGEoKS5pc0VtcHR5KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfUkVTT1VSQ0VfUEFZTE9BRCk7CisJCQlSZXNwb25zZSBlcnJvclJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW0gPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHJlc291cmNlSW5mby5nZXROYW1lKCkpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyB0b3NjYVBheWxvYWQgPSByZXNvdXJjZUluZm8uZ2V0UGF5bG9hZERhdGEoKTsKKwkJCVN0cmluZyBkZWNvZGVkUGF5bG9hZCA9IChHZW5lcmFsVXRpbGl0eS5pc0Jhc2U2NEVuY29kZWQodG9zY2FQYXlsb2FkKSkgPyBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGVCYXNlNjQodG9zY2FQYXlsb2FkKSkgOiB0b3NjYVBheWxvYWQ7CisJCQl5YW1sU3RyaW5nV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZGVjb2RlZFBheWxvYWQpOworCQl9CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaWxsUGF5bG9hZChXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFdyYXBwZXI8VXBsb2FkUmVzb3VyY2VJbmZvPiB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLCBXcmFwcGVyPFN0cmluZz4geWFtbFN0cmluZ1dyYXBwZXIsIFVzZXIgdXNlciwgU3RyaW5nIHJlc291cmNlSW5mb0pzb25TdHJpbmcsIFJlc291cmNlQXV0aG9yaXR5VHlwZUVudW0gcmVzb3VyY2VBdXRob3JpdHlFbnVtLAorCQkJRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJaWYgKHJlc291cmNlQXV0aG9yaXR5RW51bS5pc0JhY2tFbmRJbXBvcnQoKSkgeworCQkJCS8vIFByZVBheWxvYWQgVmFsaWRhdGlvbnMKKwkJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCQl2YWxpZGF0ZURhdGFOb3ROdWxsKHJlc3BvbnNlV3JhcHBlciwgZmlsZSwgcmVzb3VyY2VJbmZvSnNvblN0cmluZyk7CisJCQkJfQorCQkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJCXZhbGlkYXRlWmlwKHJlc3BvbnNlV3JhcHBlciwgZmlsZSwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKS5nZXRQYXlsb2FkTmFtZSgpKTsKKwkJCQl9CisKKwkJCQkvLyBGaWxsIFBheUxvYWQgRnJvbSBGaWxlCisJCQkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQkJZmlsbFRvc2NhVGVtcGxhdGVGcm9tWmlwKHlhbWxTdHJpbmdXcmFwcGVyLCB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLmdldElubmVyRWxlbWVudCgpLmdldFBheWxvYWROYW1lKCksIGZpbGUpOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkvLyBGaWxsIFBheUxvYWQgRnJvbSBKU09OCisJCQkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQkJZmlsbFRvc2NhVGVtcGxhdGVGcm9tSnNvbihyZXNwb25zZVdyYXBwZXIsIHlhbWxTdHJpbmdXcmFwcGVyLCB1c2VyLCB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJfQorCisJcHJvdGVjdGVkIHZvaWQgc3BlY2lmaWNSZXNvdXJjZUF1dGhvcml0eVZhbGlkYXRpb25zKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgV3JhcHBlcjxVcGxvYWRSZXNvdXJjZUluZm8+IHVwbG9hZFJlc291cmNlSW5mb1dyYXBwZXIsIFdyYXBwZXI8U3RyaW5nPiB5YW1sU3RyaW5nV3JhcHBlciwgVXNlciB1c2VyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHJlc291cmNlSW5mb0pzb25TdHJpbmcsCisJCQlSZXNvdXJjZUF1dGhvcml0eVR5cGVFbnVtIHJlc291cmNlQXV0aG9yaXR5RW51bSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCS8vIFVJIE9ubHkgVmFsaWRhdGlvbgorCQkJaWYgKCFyZXNvdXJjZUF1dGhvcml0eUVudW0uaXNCYWNrRW5kSW1wb3J0KCkpIHsKKwkJCQlpbXBvcnRVSVZhbGlkYXRpb25zKHJlc3BvbnNlV3JhcHBlciwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgdXNlciwgcmVxdWVzdCwgcmVzb3VyY2VJbmZvSnNvblN0cmluZyk7CisJCQl9CisKKwkJCS8vIFVzZXIgRGVmaW5lZCBUeXBlIFJlc291cmNlcworCQkJaWYgKHJlc291cmNlQXV0aG9yaXR5RW51bS5pc1VzZXJUeXBlUmVzb3VyY2UoKSAmJiAhQ3NhclZhbGlkYXRpb25VdGlscy5pc0NzYXJQYXlsb2FkTmFtZSh1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLmdldElubmVyRWxlbWVudCgpLmdldFBheWxvYWROYW1lKCkpKSB7CisJCQkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQkJdmFsaWRhdGVQYXlsb2FkTmFtZVNwYWNlKHJlc3BvbnNlV3JhcHBlciwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgdXNlciwgeWFtbFN0cmluZ1dyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJCX0KKworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY29tbW9uR2VuZXJhbFZhbGlkYXRpb25zKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgV3JhcHBlcjxVc2VyPiB1c2VyV3JhcHBlciwgV3JhcHBlcjxVcGxvYWRSZXNvdXJjZUluZm8+IHVwbG9hZFJlc291cmNlSW5mb1dyYXBwZXIsIFJlc291cmNlQXV0aG9yaXR5VHlwZUVudW0gcmVzb3VyY2VBdXRob3JpdHlFbnVtLCBTdHJpbmcgdXNlcklkLAorCQkJU3RyaW5nIHJlc291cmNlSW5mb0pzb25TdHJpbmcpIHsKKworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVVc2VyRXhpc3QocmVzcG9uc2VXcmFwcGVyLCB1c2VyV3JhcHBlciwgdXNlcklkKTsKKwkJfQorCisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl2YWxpZGF0ZVVzZXJSb2xlKHJlc3BvbnNlV3JhcHBlciwgdXNlcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHJlc291cmNlQXV0aG9yaXR5RW51bSk7CisJCX0KKworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVBbmRGaWxsUmVzb3VyY2VKc29uKHJlc3BvbnNlV3JhcHBlciwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlciwgdXNlcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHJlc291cmNlQXV0aG9yaXR5RW51bSwgcmVzb3VyY2VJbmZvSnNvblN0cmluZyk7CisJCX0KKworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVUb3NjYVRlbXBsYXRlUGF5bG9hZE5hbWUocmVzcG9uc2VXcmFwcGVyLCB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlUmVzb3VyY2VUeXBlKHJlc3BvbnNlV3JhcHBlciwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgdXNlcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvdXJjZVR5cGUoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBVcGxvYWRSZXNvdXJjZUluZm8gdXBsb2FkUmVzb3VyY2VJbmZvLCBVc2VyIHVzZXIpIHsKKwkJU3RyaW5nIHJlc291cmNlVHlwZSA9IHVwbG9hZFJlc291cmNlSW5mby5nZXRSZXNvdXJjZVR5cGUoKTsKKwkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsIHx8ICFSZXNvdXJjZVR5cGVFbnVtLmNvbnRhaW5zKHJlc291cmNlVHlwZSkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQlSZXNwb25zZSBlcnJvclJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCUVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW0gPSBuZXcgRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQkJYWRkaXRpb25hbFBhcmFtLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHVwbG9hZFJlc291cmNlSW5mby5nZXROYW1lKCkpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGltcG9ydFVJVmFsaWRhdGlvbnMoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBVc2VyIHVzZXIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcmVzb3VyY2VJbmZvSnNvblN0cmluZykgeworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVNRDUocmVzcG9uc2VXcmFwcGVyLCB1c2VyLCByZXNvdXJjZUluZm8sIHJlcXVlc3QsIHJlc291cmNlSW5mb0pzb25TdHJpbmcpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpICYmIHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LmdldE1ldGhvZCgpICE9IG51bGwgJiYgcmVxdWVzdC5nZXRNZXRob2QoKS5lcXVhbHMoIlBPU1QiKSkgeworCQkJdmFsaWRhdGVSZXNvdXJjZURvZXNOb3RFeGlzdChyZXNwb25zZVdyYXBwZXIsIHVzZXIsIHJlc291cmNlSW5mby5nZXROYW1lKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY29tbW9uUGF5bG9hZFZhbGlkYXRpb25zKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgV3JhcHBlcjxTdHJpbmc+IHlhbWxTdHJpbmdXcmFwcGVyLCBVc2VyIHVzZXIsIFVwbG9hZFJlc291cmNlSW5mbyB1cGxvYWRSZXNvdXJjZUluZm8pIHsKKworCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVQYXlsb2FkSXNZbWwocmVzcG9uc2VXcmFwcGVyLCB1c2VyLCB1cGxvYWRSZXNvdXJjZUluZm8sIHlhbWxTdHJpbmdXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVQYXlsb2FkSXNUb3NjYShyZXNwb25zZVdyYXBwZXIsIHVwbG9hZFJlc291cmNlSW5mbywgdXNlciwgeWFtbFN0cmluZ1dyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQl2YWxpZGF0ZVBheWxvYWRJc05vdFNlcnZpY2UocmVzcG9uc2VXcmFwcGVyLCB1c2VyLCB1cGxvYWRSZXNvdXJjZUluZm8sIHlhbWxTdHJpbmdXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVQYXlsb2FkSXNTaW5nbGVSZXNvdXJjZShyZXNwb25zZVdyYXBwZXIsIHVwbG9hZFJlc291cmNlSW5mbywgdXNlciwgeWFtbFN0cmluZ1dyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdG9wb2xvZ3lUZW1wbGF0ZVBheWxvYWRWYWxpZGF0aW9ucyhXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFdyYXBwZXI8U3RyaW5nPiB5YW1sU3RyaW5nV3JhcHBlciwgVXNlciB1c2VyLCBVcGxvYWRSZXNvdXJjZUluZm8gdXBsb2FkUmVzb3VyY2VJbmZvKSB7CisKKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlUGF5bG9hZElzWW1sKHJlc3BvbnNlV3JhcHBlciwgdXNlciwgdXBsb2FkUmVzb3VyY2VJbmZvLCB5YW1sU3RyaW5nV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlUGF5bG9hZElzVG9zY2EocmVzcG9uc2VXcmFwcGVyLCB1cGxvYWRSZXNvdXJjZUluZm8sIHVzZXIsIHlhbWxTdHJpbmdXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJdmFsaWRhdGVQYXlsb2FkSXNUb3BvbG9neVRlbXBsYXRlKHJlc3BvbnNlV3JhcHBlciwgdXNlciwgdXBsb2FkUmVzb3VyY2VJbmZvLCB5YW1sU3RyaW5nV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUltcG9ydChXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFVzZXIgdXNlciwgVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mb09iamVjdCwgU3RyaW5nIHlhbWxBc1N0cmluZywgUmVzb3VyY2VBdXRob3JpdHlUeXBlRW51bSBhdXRob3JpdHksIGJvb2xlYW4gY3JlYXRlTmV3VmVyc2lvbiwgU3RyaW5nIHJlc291cmNlVW5pcXVlSWQpIHsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8b3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVPclVwZGF0ZVJlc3BvbnNlID0gbnVsbDsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQlPYmplY3QgcmVwcmVzZW50YXRpb24gPSBudWxsOworCisJCWlmIChDc2FyVmFsaWRhdGlvblV0aWxzLmlzQ3NhclBheWxvYWROYW1lKHJlc291cmNlSW5mb09iamVjdC5nZXRQYXlsb2FkTmFtZSgpKSkgeworCQkJbG9nLmRlYnVnKCJpbXBvcnQgcmVzb3VyY2UgZnJvbSBjc2FyIik7CisJCQljcmVhdGVPclVwZGF0ZVJlc3BvbnNlID0gaW1wb3J0UmVzb3VyY2VGcm9tVUlDc2FyKHJlc291cmNlSW5mb09iamVjdCwgdXNlciwgcmVzb3VyY2VVbmlxdWVJZCk7CisJCX0gZWxzZSBpZiAoIWF1dGhvcml0eS5pc1VzZXJUeXBlUmVzb3VyY2UoKSkgeworCQkJbG9nLmRlYnVnKCJpbXBvcnQgbm9ybWF0aXZlIHR5cGUgcmVzb3VyY2UiKTsKKwkJCWNyZWF0ZU9yVXBkYXRlUmVzcG9uc2UgPSByZXNvdXJjZUltcG9ydE1hbmFnZXIuaW1wb3J0Tm9ybWF0aXZlUmVzb3VyY2UoeWFtbEFzU3RyaW5nLCByZXNvdXJjZUluZm9PYmplY3QsIHVzZXIsIGNyZWF0ZU5ld1ZlcnNpb24sIHRydWUpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJpbXBvcnQgdXNlciByZXNvdXJjZSAobm90IG5vcm1hdGl2ZSB0eXBlKSIpOworCQkJY3JlYXRlT3JVcGRhdGVSZXNwb25zZSA9IHJlc291cmNlSW1wb3J0TWFuYWdlci5pbXBvcnRVc2VyRGVmaW5lZFJlc291cmNlKHlhbWxBc1N0cmluZywgcmVzb3VyY2VJbmZvT2JqZWN0LCB1c2VyLCBmYWxzZSwgZmFsc2UpOworCQl9CisJCWlmIChjcmVhdGVPclVwZGF0ZVJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoY3JlYXRlT3JVcGRhdGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJdHJ5IHsKKwkJCQlyZXByZXNlbnRhdGlvbiA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihjcmVhdGVPclVwZGF0ZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKSk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCUFjdGlvblN0YXR1cyBzdWNjZXNzU3RhdHVzID0gY3JlYXRlT3JVcGRhdGVSZXNwb25zZS5sZWZ0KCkudmFsdWUoKS5yaWdodDsKKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KHN1Y2Nlc3NTdGF0dXMpLCByZXByZXNlbnRhdGlvbik7CisJCX0KKwkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8SW1tdXRhYmxlUGFpcjxvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGltcG9ydFJlc291cmNlRnJvbVVJQ3NhcihVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvT2JqZWN0LCBVc2VyIHVzZXIsIFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkKSB7CisKKwkJRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlcyA9IG51bGw7CisJCUltbXV0YWJsZVBhaXI8b3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UsIEFjdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IG51bGw7CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlIHJlc291cmNlID0gbmV3IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlKCk7CisJCVN0cmluZyBwYXlsb2FkTmFtZSA9IHJlc291cmNlSW5mb09iamVjdC5nZXRQYXlsb2FkTmFtZSgpOworCQlmaWxsUmVzb3VyY2VGcm9tUmVzb3VyY2VJbmZvT2JqZWN0KHJlc291cmNlLCByZXNvdXJjZUluZm9PYmplY3QpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBieXRlW10+LCBSZXNwb25zZUZvcm1hdD4gY3NhclVJUGF5bG9hZFJlcyA9IGdldFNjYXJGcm9tUGF5bG9hZChyZXNvdXJjZUluZm9PYmplY3QpOworCQlpZiAoY3NhclVJUGF5bG9hZFJlcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY3NhclVJUGF5bG9hZFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gY3NhclVJUGF5bG9hZCA9IGNzYXJVSVBheWxvYWRSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJY3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlcyA9IGdldEFuZFZhbGlkYXRlQ3NhcllhbWwoY3NhclVJUGF5bG9hZCwgcmVzb3VyY2UsIHVzZXIsIHBheWxvYWROYW1lKTsKKwkJaWYgKGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VSZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlpZiAocmVzb3VyY2VVbmlxdWVJZCA9PSBudWxsIHx8IHJlc291cmNlVW5pcXVlSWQuaXNFbXB0eSgpKSB7CisJCQljcmVhdGVPclVwZGF0ZVJlc291cmNlUmVzID0gcmVzb3VyY2VJbXBvcnRNYW5hZ2VyLmdldFJlc291cmNlQnVzaW5lc3NMb2dpYygpLmNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB1c2VyLCBjc2FyVUlQYXlsb2FkLCBwYXlsb2FkTmFtZSk7CisJCQlpZiAoY3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCWFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5DUkVBVEVEOworCQl9IGVsc2UgeworCQkJY3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlcyA9IHJlc291cmNlSW1wb3J0TWFuYWdlci5nZXRSZXNvdXJjZUJ1c2luZXNzTG9naWMoKS52YWxpZGF0ZUFuZFVwZGF0ZVJlc291cmNlRnJvbUNzYXIocmVzb3VyY2UsIHVzZXIsIGNzYXJVSVBheWxvYWQsIHBheWxvYWROYW1lLCByZXNvdXJjZVVuaXF1ZUlkKTsKKwkJCWlmIChjcmVhdGVPclVwZGF0ZVJlc291cmNlUmVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlT3JVcGRhdGVSZXNvdXJjZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLk9LOworCQl9CisJCXJlc3VsdCA9IG5ldyBJbW11dGFibGVQYWlyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlLCBBY3Rpb25TdGF0dXM+KGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VSZXMubGVmdCgpLnZhbHVlKCksIGFjdGlvblN0YXR1cyk7CisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gZ2V0QW5kVmFsaWRhdGVDc2FyWWFtbChNYXA8U3RyaW5nLCBieXRlW10+IGNzYXJVSVBheWxvYWQsIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlIHJlc291cmNlLCBVc2VyIHVzZXIsIFN0cmluZyBjc2FyVVVJRCkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IGdldFRvc2NhWWFtbFJlcyA9IENzYXJWYWxpZGF0aW9uVXRpbHMuZ2V0VG9zY2FZYW1sKGNzYXJVSVBheWxvYWQsIGNzYXJVVUlELCBnZXRDb21wb25lbnRzVXRpbHMoKSk7CisKKwkJaWYgKGdldFRvc2NhWWFtbFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0VG9zY2FZYW1sUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRXJyb3Igd2hlbiB0cnkgdG8gZ2V0IGNzYXIgdG9zY2F5YW1sRmlsZSB3aXRoIGNzYXIgSUQge30sIGVycm9yOiB7fSIsIGNzYXJVVUlELCByZXNwb25zZUZvcm1hdCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiQ3JlYXRpbmcgcmVzb3VyY2UgZnJvbSBDU0FSOiBmZXRjaGluZyBDU0FSIHdpdGggaWQgIiArIGNzYXJVVUlEICsgIiBmYWlsZWQiKTsKKwkJCWdldENvbXBvbmVudHNVdGlscygpLmF1ZGl0UmVzb3VyY2UocmVzcG9uc2VGb3JtYXQsIHVzZXIsIHJlc291cmNlLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIG51bGwpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJU3RyaW5nIHRvc2NhWWFtbCA9IGdldFRvc2NhWWFtbFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRWYWx1ZSgpOworCisJCWxvZy5kZWJ1ZygiY2hlY2tpbmcgdG9zY2EgdGVtcGxhdGUgaXMgdmFsaWQgeW1sIik7CisJCVlhbWxUb09iamVjdENvbnZlcnRlciB5YW1sQ29udmVydG9yID0gbmV3IFlhbWxUb09iamVjdENvbnZlcnRlcigpOworCQlib29sZWFuIGlzVmFsaWQgPSB5YW1sQ29udmVydG9yLmlzVmFsaWRZYW1sKHRvc2NhWWFtbC5nZXRCeXRlcygpKTsKKwkJaWYgKCFpc1ZhbGlkKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUxfRklMRSk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlsb2cuZGVidWcoImNoZWNraW5nIHBheWxvYWQgaXMgdmFsaWQgdG9zY2EiKTsKKwkJU3RyaW5nIGhlYXREZWNvZGVkUGF5bG9hZCA9IChHZW5lcmFsVXRpbGl0eS5pc0Jhc2U2NEVuY29kZWQodG9zY2FZYW1sKSkgPyBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGVCYXNlNjQodG9zY2FZYW1sKSkgOiB0b3NjYVlhbWw7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwcGVkVG9zY2FUZW1wbGF0ZSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBuZXcgWWFtbCgpLmxvYWQoaGVhdERlY29kZWRQYXlsb2FkKTsKKwkJRWl0aGVyPFN0cmluZywgUmVzdWx0U3RhdHVzRW51bT4gZmluZEZpcnN0VG9zY2FTdHJpbmdFbGVtZW50ID0gSW1wb3J0VXRpbHMuZmluZEZpcnN0VG9zY2FTdHJpbmdFbGVtZW50KG1hcHBlZFRvc2NhVGVtcGxhdGUsIFRvc2NhVGFnTmFtZXNFbnVtLlRPU0NBX1ZFUlNJT04pOworCisJCWlmIChmaW5kRmlyc3RUb3NjYVN0cmluZ0VsZW1lbnQuaXNSaWdodCgpKSB7CisJCQlpc1ZhbGlkID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgZGVmZW5pdGlvblZlcnNpb25Gb3VuZCA9IGZpbmRGaXJzdFRvc2NhU3RyaW5nRWxlbWVudC5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChkZWZlbml0aW9uVmVyc2lvbkZvdW5kID09IG51bGwgfHwgZGVmZW5pdGlvblZlcnNpb25Gb3VuZC5pc0VtcHR5KCkpIHsKKwkJCQlpc1ZhbGlkID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCWlzVmFsaWQgPSBJbXBvcnRVdGlscy5Db25zdGFudHMuVE9TQ0FfREVGSU5JVElPTl9WRVJTSU9OUy5jb250YWlucyhkZWZlbml0aW9uVmVyc2lvbkZvdW5kKTsKKwkJCX0KKwkJfQorCisJCWlmICghaXNWYWxpZCkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9UT1NDQV9URU1QTEFURSk7CisJCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtID0gbmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKTsKKwkJCWFkZGl0aW9uYWxQYXJhbS5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShyZXNwb25zZUZvcm1hdCwgdXNlciwgbnVsbCwgIiIsICIiLCBBdWRpdGluZ0FjdGlvbkVudW0uSU1QT1JUX1JFU09VUkNFLCBhZGRpdGlvbmFsUGFyYW0pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmlsbFJlc291cmNlRnJvbVJlc291cmNlSW5mb09iamVjdChvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZSByZXNvdXJjZSwgVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mb09iamVjdCkgeworCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZUluZm9PYmplY3QgIT0gbnVsbCkgeworCQkJcmVzb3VyY2Uuc2V0RGVzY3JpcHRpb24ocmVzb3VyY2VJbmZvT2JqZWN0LmdldERlc2NyaXB0aW9uKCkpOworCQkJcmVzb3VyY2Uuc2V0VGFncyhyZXNvdXJjZUluZm9PYmplY3QuZ2V0VGFncygpKTsKKwkJCXJlc291cmNlLnNldENhdGVnb3JpZXMocmVzb3VyY2VJbmZvT2JqZWN0LmdldENhdGVnb3JpZXMoKSk7CisJCQlyZXNvdXJjZS5zZXRDb250YWN0SWQocmVzb3VyY2VJbmZvT2JqZWN0LmdldENvbnRhY3RJZCgpKTsKKwkJCXJlc291cmNlLnNldE5hbWUocmVzb3VyY2VJbmZvT2JqZWN0LmdldE5hbWUoKSk7CisJCQlyZXNvdXJjZS5zZXRJY29uKHJlc291cmNlSW5mb09iamVjdC5nZXRSZXNvdXJjZUljb25QYXRoKCkpOworCQkJcmVzb3VyY2Uuc2V0VmVuZG9yTmFtZShyZXNvdXJjZUluZm9PYmplY3QuZ2V0VmVuZG9yTmFtZSgpKTsKKwkJCXJlc291cmNlLnNldFZlbmRvclJlbGVhc2UocmVzb3VyY2VJbmZvT2JqZWN0LmdldFZlbmRvclJlbGVhc2UoKSk7CisJCQlyZXNvdXJjZS5zZXRSZXNvdXJjZVR5cGUoUmVzb3VyY2VUeXBlRW51bS52YWx1ZU9mKHJlc291cmNlSW5mb09iamVjdC5nZXRSZXNvdXJjZVR5cGUoKSkpOworCQkJTGlzdDxVcGxvYWRBcnRpZmFjdEluZm8+IGFydGlmYWN0TGlzdCA9IHJlc291cmNlSW5mb09iamVjdC5nZXRBcnRpZmFjdExpc3QoKTsKKwkJCWlmIChhcnRpZmFjdExpc3QgIT0gbnVsbCkgeworCQkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzSE0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJCQlmb3IgKFVwbG9hZEFydGlmYWN0SW5mbyBhcnRpZmFjdCA6IGFydGlmYWN0TGlzdCkgeworCQkJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWYgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJCQkJCWFydGlmYWN0RGVmLnNldEFydGlmYWN0TmFtZShhcnRpZmFjdC5nZXRBcnRpZmFjdE5hbWUoKSk7CisJCQkJCWFydGlmYWN0RGVmLnNldEFydGlmYWN0VHlwZShhcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKS5nZXRUeXBlKCkpOworCQkJCQlhcnRpZmFjdERlZi5zZXREZXNjcmlwdGlvbihhcnRpZmFjdC5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpOworCQkJCQlhcnRpZmFjdERlZi5zZXRQYXlsb2FkRGF0YShhcnRpZmFjdC5nZXRBcnRpZmFjdERhdGEoKSk7CisJCQkJCWFydGlmYWN0RGVmLnNldEFydGlmYWN0UmVmKGFydGlmYWN0LmdldEFydGlmYWN0UGF0aCgpKTsKKwkJCQkJYXJ0aWZhY3RzSE0ucHV0KGFydGlmYWN0RGVmLmdldEFydGlmYWN0TmFtZSgpLCBhcnRpZmFjdERlZik7CisJCQkJfQorCQkJCXJlc291cmNlLnNldEFydGlmYWN0cyhhcnRpZmFjdHNITSk7CisJCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIGJ5dGVbXT4sIFJlc3BvbnNlRm9ybWF0PiBnZXRTY2FyRnJvbVBheWxvYWQoVXBsb2FkUmVzb3VyY2VJbmZvIGlubmVyRWxlbWVudCkgeworCQlTdHJpbmcgY3NhclVVSUQgPSBpbm5lckVsZW1lbnQuZ2V0UGF5bG9hZE5hbWUoKTsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gaW5uZXJFbGVtZW50LmdldFBheWxvYWREYXRhKCk7CisJCWlmIChwYXlsb2FkRGF0YSA9PSBudWxsKSB7CisJCQlsb2cuaW5mbygiRmFpbGVkIHRvIGRlY29kZSByZWNlaXZlZCBjc2FyIiwgY3NhclVVSUQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNTQVJfTk9UX0ZPVU5ELCBjc2FyVVVJRCkpOworCQl9CisKKwkJYnl0ZVtdIGRlY29kZWRQYXlsb2FkID0gKEdlbmVyYWxVdGlsaXR5LmlzQmFzZTY0RW5jb2RlZChwYXlsb2FkRGF0YSkpID8gQmFzZTY0LmRlY29kZUJhc2U2NChwYXlsb2FkRGF0YS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSkgOiBwYXlsb2FkRGF0YS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKwkJaWYgKGRlY29kZWRQYXlsb2FkID09IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gZGVjb2RlIHJlY2VpdmVkIGNzYXIiLCBjc2FyVVVJRCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9OT1RfRk9VTkQsIGNzYXJVVUlEKSk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBieXRlW10+IGNzYXIgPSBaaXBVdGlsLnJlYWRaaXAoZGVjb2RlZFBheWxvYWQpOworCQlpZiAoY3NhciA9PSBudWxsKSB7CisJCQlsb2cuaW5mbygiRmFpbGVkIHRvIHVuemlwIHJlY2VpdmVkIGNzYXIiLCBjc2FyVVVJRCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1NBUl9JTlZBTElELCBjc2FyVVVJRCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjc2FyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlucHV0U3RyZWFtKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBXcmFwcGVyPFN0cmluZz4gZGF0YVdyYXBwZXIsIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7CisJCWJ5dGVbXSBieXRlcyA9IElPVXRpbHMudG9CeXRlQXJyYXkoaW5wdXRTdHJlYW0pOworCQlpZiAoYnl0ZXMgPT0gbnVsbCB8fCBieXRlcy5sZW5ndGggPT0gMCkgeworCQkJbG9nLmluZm8oIkVtcHR5IGJvZHkgd2FzIHNlbnQuIik7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGFXcmFwcGVyLnNldElubmVyRWxlbWVudChuZXcgU3RyaW5nKGJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCA8VD4gdm9pZCB2YWxpZGF0ZUNsYXNzUGFyc2UoU3RyaW5nIGRhdGEsIFdyYXBwZXI8VD4gcGFyc2VkQ2xhc3NXcmFwcGVyLCBTdXBwbGllcjxDbGFzczxUPj4gY2xhc3NHZW4sIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlcikgeworCQl0cnkgeworCQkJVCBwYXJzZWRDbGFzcyA9IGdzb24uZnJvbUpzb24oZGF0YSwgY2xhc3NHZW4uZ2V0KCkpOworCQkJaWYgKHBhcnNlZENsYXNzID09IG51bGwpIHsKKwkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJCX0gZWxzZSB7CisJCQkJcGFyc2VkQ2xhc3NXcmFwcGVyLnNldElubmVyRWxlbWVudChwYXJzZWRDbGFzcyk7CisJCQl9CisJCX0gY2F0Y2ggKEpzb25TeW50YXhFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVjb2RlIHJlY2VpdmVkIHt9IHt9IHRvIG9iamVjdC4iLCBjbGFzc0dlbi5nZXQoKS5nZXROYW1lKCksIGRhdGEsIGUpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIFdyYXBwZXI8Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljPiBibFdyYXBwZXIsIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlcikgeworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEluc3RhbmNlTG9naWMgPSBnZXRDb21wb25lbnRJbnN0YW5jZUJMKGNvbnRleHQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJaWYgKGNvbXBvbmVudEluc3RhbmNlTG9naWMgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJVbnN1cHBvcnRlZCBjb21wb25lbnQgdHlwZSB7fSIsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpKTsKKwkJfSBlbHNlIHsKKwkJCWJsV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY29tcG9uZW50SW5zdGFuY2VMb2dpYyk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgPFQ+IFJlc3BvbnNlIGJ1aWxkUmVzcG9uc2VGcm9tRWxlbWVudChXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIsIFdyYXBwZXI8VD4gYXR0cmlidXRlV3JhcHBlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmVzcG9uc2UgcmVzcG9uc2U7CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQkJU3RyaW5nIHJlc3VsdCA9IG1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcoYXR0cmlidXRlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQpOworCQl9IGVsc2UgeworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0FkZGl0aW9uYWxJbmZvcm1hdGlvblNlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9BZGRpdGlvbmFsSW5mb3JtYXRpb25TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmOGY5NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9BZGRpdGlvbmFsSW5mb3JtYXRpb25TZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw0NzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQWRkaXRpb25hbEluZm9ybWF0aW9uQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUGFyYW07CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvY2F0YWxvZyIpCitAQXBpKHZhbHVlID0gIkFkZGl0aW9uYWwgSW5mb3JtYXRpb24gU2VydmxldCIsIGRlc2NyaXB0aW9uID0gIkFkZGl0aW9uYWwgSW5mb3JtYXRpb24gU2VydmxldCIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQWRkaXRpb25hbEluZm9ybWF0aW9uU2VydmxldCBleHRlbmRzIEJlR2VuZXJpY1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFkZGl0aW9uYWxJbmZvcm1hdGlvblNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBQT1NUCisJQFBhdGgoIi9yZXNvdXJjZXMve3Jlc291cmNlSWR9L2FkZGl0aW9uYWxpbmZvIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24gTGFiZWwgYW5kIFZhbHVlIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIEFkZGl0aW9uYWwgSW5mb3JhbXRpb24gcHJvcGVydHkiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ga2V5IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBjcmVhdGVSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkxhYmVsKEBBcGlQYXJhbSh2YWx1ZSA9ICJyZXNvdXJjZSBpZCB0byB1cGRhdGUgd2l0aCBuZXcgcHJvcGVydHkiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGtleSB2YWx1ZSB0byBiZSBjcmVhdGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCXJldHVybiBjcmVhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlSWQsIHJlcXVlc3QsIHVzZXJJZCwgZGF0YSk7CisKKwl9CisKKwlAUE9TVAorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VJZH0vYWRkaXRpb25hbGluZm8iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiBMYWJlbCBhbmQgVmFsdWUiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgQWRkaXRpb25hbCBJbmZvcmFtdGlvbiBwcm9wZXJ0eSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBrZXkgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbChAQXBpUGFyYW0odmFsdWUgPSAic2VydmljZSBpZCB0byB1cGRhdGUgd2l0aCBuZXcgcHJvcGVydHkiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInNlcnZpY2VJZCIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlSWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBrZXkgdmFsdWUgdG8gYmUgY3JlYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlyZXR1cm4gY3JlYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWxGb3JDb21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHNlcnZpY2VJZCwgcmVxdWVzdCwgdXNlcklkLCBkYXRhKTsKKworCX0KKworCUBQVVQKKwlAUGF0aCgiL3Jlc291cmNlcy97cmVzb3VyY2VJZH0vYWRkaXRpb25hbGluZm8ve2xhYmVsSWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24gTGFiZWwgYW5kIFZhbHVlIiwgaHR0cE1ldGhvZCA9ICJQVVQiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgQWRkaXRpb25hbCBJbmZvcmFtdGlvbiBwcm9wZXJ0eSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB1cGRhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBrZXkgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWwoQEFwaVBhcmFtKHZhbHVlID0gInJlc291cmNlIGlkIHRvIHVwZGF0ZSB3aXRoIG5ldyBwcm9wZXJ0eSIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gImxhYmVsIGlkIiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJsYWJlbElkIikgZmluYWwgU3RyaW5nIGxhYmVsSWQsIEBBcGlQYXJhbSh2YWx1ZSA9ICJBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGtleSB2YWx1ZSB0byBiZSBjcmVhdGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlyZXR1cm4gdXBkYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWxGb3JDb21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZUlkLCBsYWJlbElkLCByZXF1ZXN0LCB1c2VySWQsIGRhdGEpOworCisJfQorCisJQFBVVAorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VJZH0vYWRkaXRpb25hbGluZm8ve2xhYmVsSWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24gTGFiZWwgYW5kIFZhbHVlIiwgaHR0cE1ldGhvZCA9ICJQVVQiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgQWRkaXRpb25hbCBJbmZvcmFtdGlvbiBwcm9wZXJ0eSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB1cGRhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBrZXkgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbChAQXBpUGFyYW0odmFsdWUgPSAic2VydmljZSBpZCB0byB1cGRhdGUgd2l0aCBuZXcgcHJvcGVydHkiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInNlcnZpY2VJZCIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlSWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAibGFiZWwgaWQiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oImxhYmVsSWQiKSBmaW5hbCBTdHJpbmcgbGFiZWxJZCwgQEFwaVBhcmFtKHZhbHVlID0gIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ga2V5IHZhbHVlIHRvIGJlIGNyZWF0ZWQiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCXJldHVybiB1cGRhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgc2VydmljZUlkLCBsYWJlbElkLCByZXF1ZXN0LCB1c2VySWQsIGRhdGEpOworCisJfQorCisJQERFTEVURQorCUBQYXRoKCIvcmVzb3VyY2VzL3tyZXNvdXJjZUlkfS9hZGRpdGlvbmFsaW5mby97bGFiZWxJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiBMYWJlbCBhbmQgVmFsdWUiLCBodHRwTWV0aG9kID0gIkRFTEVURSIsIG5vdGVzID0gIlJldHVybnMgZGVsZXRlZCBBZGRpdGlvbmFsIEluZm9yYW10aW9uIHByb3BlcnR5IiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRlbGV0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGtleSBhbHJlYWR5IGV4aXN0IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbChAQXBpUGFyYW0odmFsdWUgPSAicmVzb3VyY2UgaWQgdG8gdXBkYXRlIHdpdGggbmV3IHByb3BlcnR5IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJyZXNvdXJjZUlkIikgZmluYWwgU3RyaW5nIHJlc291cmNlSWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAibGFiZWwgaWQiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oImxhYmVsSWQiKSBmaW5hbCBTdHJpbmcgbGFiZWxJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCXJldHVybiBkZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlSWQsIGxhYmVsSWQsIHJlcXVlc3QsIHVzZXJJZCk7CisKKwl9CisKKwlAREVMRVRFCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZUlkfS9hZGRpdGlvbmFsaW5mby97bGFiZWxJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiBMYWJlbCBhbmQgVmFsdWUiLCBodHRwTWV0aG9kID0gIkRFTEVURSIsIG5vdGVzID0gIlJldHVybnMgZGVsZXRlZCBBZGRpdGlvbmFsIEluZm9yYW10aW9uIHByb3BlcnR5IiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRlbGV0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGtleSBhbHJlYWR5IGV4aXN0IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlU2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkxhYmVsKEBBcGlQYXJhbSh2YWx1ZSA9ICJzZXJ2aWNlIGlkIHRvIHVwZGF0ZSB3aXRoIG5ldyBwcm9wZXJ0eSIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgic2VydmljZUlkIikgZmluYWwgU3RyaW5nIHNlcnZpY2VJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJsYWJlbCBpZCIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgibGFiZWxJZCIpIGZpbmFsIFN0cmluZyBsYWJlbElkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJcmV0dXJuIGRlbGV0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkxhYmVsRm9yQ29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBzZXJ2aWNlSWQsIGxhYmVsSWQsIHJlcXVlc3QsIHVzZXJJZCk7CisKKwl9CisKKwlAR0VUCisJQFBhdGgoIi9yZXNvdXJjZXMve3Jlc291cmNlSWR9L2FkZGl0aW9uYWxpbmZvL3tsYWJlbElkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkdldCBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIGJ5IGlkIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIEFkZGl0aW9uYWwgSW5mb3JhbXRpb24gcHJvcGVydHkiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gImZldGNoZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ga2V5IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkxhYmVsKEBBcGlQYXJhbSh2YWx1ZSA9ICJyZXNvdXJjZSBpZCB0byB1cGRhdGUgd2l0aCBuZXcgcHJvcGVydHkiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJsYWJlbCBpZCIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgibGFiZWxJZCIpIGZpbmFsIFN0cmluZyBsYWJlbElkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbkxhYmVsRm9yQ29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzb3VyY2VJZCwgbGFiZWxJZCwgcmVxdWVzdCwgdXNlcklkKTsKKworCX0KKworCUBHRVQKKwlAUGF0aCgiL3NlcnZpY2VzL3tzZXJ2aWNlSWR9L2FkZGl0aW9uYWxpbmZvL3tsYWJlbElkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkdldCBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIGJ5IGlkIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIEFkZGl0aW9uYWwgSW5mb3JhbXRpb24gcHJvcGVydHkiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gImZldGNoZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ga2V5IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWwoQEFwaVBhcmFtKHZhbHVlID0gInNlcnZpY2UgaWQgdG8gdXBkYXRlIHdpdGggbmV3IHByb3BlcnR5IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJzZXJ2aWNlSWQiKSBmaW5hbCBTdHJpbmcgc2VydmljZUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gImxhYmVsIGlkIiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJsYWJlbElkIikgZmluYWwgU3RyaW5nIGxhYmVsSWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWxGb3JDb21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHNlcnZpY2VJZCwgbGFiZWxJZCwgcmVxdWVzdCwgdXNlcklkKTsKKworCX0KKworCUBHRVQKKwlAUGF0aCgiL3Jlc291cmNlcy97cmVzb3VyY2VJZH0vYWRkaXRpb25hbGluZm8iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJHZXQgYWxsIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24gdW5kZXIgcmVzb3VyY2UiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgQWRkaXRpb25hbCBJbmZvcmFtdGlvbiBwcm9wZXJ0eSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAibGlzdCBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBrZXkgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldEFsbFJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWwoQEFwaVBhcmFtKHZhbHVlID0gInJlc291cmNlIGlkIHRvIHVwZGF0ZSB3aXRoIG5ldyBwcm9wZXJ0eSIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCXJldHVybiBnZXRBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlSWQsIHJlcXVlc3QsIHVzZXJJZCk7CisKKwl9CisKKwlAR0VUCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZUlkfS9hZGRpdGlvbmFsaW5mbyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkdldCBhbGwgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiB1bmRlciBzZXJ2aWNlIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIEFkZGl0aW9uYWwgSW5mb3JhbXRpb24gcHJvcGVydHkiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gImxpc3Qgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ga2V5IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRBbGxTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWwoQEFwaVBhcmFtKHZhbHVlID0gInNlcnZpY2UgaWQgdG8gdXBkYXRlIHdpdGggbmV3IHByb3BlcnR5IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJzZXJ2aWNlSWQiKSBmaW5hbCBTdHJpbmcgc2VydmljZUlkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCXJldHVybiBnZXRBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgc2VydmljZUlkLCByZXF1ZXN0LCB1c2VySWQpOworCisJfQorCisJLyoqCisJICogCisJICogQ3JlYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvcGVydHkgdW5kZXIgZ2l2ZW4gcmVzb3VyY2Uvc2VydmljZQorCSAqIAorCSAqIEBwYXJhbSBub2RlVHlwZQorCSAqIEBwYXJhbSB1bmlxdWVJZAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIHVzZXJJZAorCSAqIEBwYXJhbSBkYXRhCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBSZXNwb25zZSBjcmVhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyB1bmlxdWVJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyB1c2VySWQsIFN0cmluZyBkYXRhKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCQlsb2cuZGVidWcoImRhdGEgaXMge30iLCBkYXRhKTsKKworCQl0cnkgeworCQkJLy8gY29udmVydCBqc29uIHRvIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbworCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IGdzb24uZnJvbUpzb24oZGF0YSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmNsYXNzKTsKKworCQkJLy8gY3JlYXRlIHRoZSBuZXcgcHJvcGVydHkKKwkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldEJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gYnVzaW5lc3NMb2dpYy5jcmVhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb24obm9kZVR5cGUsIHVuaXF1ZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIG51bGwsIHVzZXJJZCk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24ge30uIFJFYXNvbiAtIHt9IiwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCByZXNwb25zZUZvcm1hdCk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQl9CisKKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBjcmVhdGVkQUkgPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJCWxvZy5kZWJ1ZygiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB7fT17fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSB3aXRoIGlkIHt9IiwgY3JlYXRlZEFJLmdldEtleSgpLCBjcmVhdGVkQUkuZ2V0VmFsdWUoKSwgY3JlYXRlZEFJLmdldFVuaXF1ZUlkKCkpOworCisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGNyZWF0ZWRBSSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJDcmVhdGUgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiIpOworCQkJbG9nLmRlYnVnKCJDcmVhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHByb3BlcnR5IGJ5IGlkIHVuZGVyIGdpdmVuIHJlc291cmNlL3NlcnZpY2UKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcGFyYW0gdW5pcXVlSWQKKwkgKiBAcGFyYW0gbGFiZWxJZAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIHVzZXJJZAorCSAqIEBwYXJhbSBkYXRhCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBSZXNwb25zZSB1cGRhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyB1bmlxdWVJZCwgU3RyaW5nIGxhYmVsSWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgZGF0YSkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKwkJbG9nLmRlYnVnKCJkYXRhIGlzIHt9IiwgZGF0YSk7CisKKwkJdHJ5IHsKKwkJCS8vIGNvbnZlcnQganNvbiB0byBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8KKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gPSBnc29uLmZyb21Kc29uKGRhdGEsIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5jbGFzcyk7CisKKwkJCS8vIGNyZWF0ZSB0aGUgbmV3IHByb3BlcnR5CisJCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25CdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRCTChjb250ZXh0KTsKKworCQkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLnNldFVuaXF1ZUlkKGxhYmVsSWQpOworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gYnVzaW5lc3NMb2dpYy51cGRhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb24obm9kZVR5cGUsIHVuaXF1ZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIG51bGwsIHVzZXJJZCk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvcGVydHkuIFJlYXNvbiAtIHt9IiwgcmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gY3JlYXRlZEFJID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCisJCQlsb2cuZGVidWcoIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ge309e30gdXBkYXRlZCBzdWNjZXNzZnVsbHkgd2l0aCBpZCB7fSIsIGNyZWF0ZWRBSS5nZXRLZXkoKSwgY3JlYXRlZEFJLmdldFZhbHVlKCksIGNyZWF0ZWRBSS5nZXRVbmlxdWVJZCgpKTsKKworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgY3JlYXRlZEFJKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIlVwZGF0ZSBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJVcGRhdGUgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiIpOworCQkJbG9nLmRlYnVnKCJVcGRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIAorCSAqIERlbGV0ZSBhbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHByb3BlcnR5IGJ5IGlkIHVuZGVyIGdpdmVuIHJlc291cmNlL3NlcnZpY2UKKwkgKgorCSAqIEBwYXJhbSBub2RlVHlwZQorCSAqIEBwYXJhbSB1bmlxdWVJZAorCSAqIEBwYXJhbSBsYWJlbElkCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBSZXNwb25zZSBkZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb25MYWJlbEZvckNvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyB1bmlxdWVJZCwgU3RyaW5nIGxhYmVsSWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCXRyeSB7CisKKwkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldEJMKGNvbnRleHQpOworCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbygpOworCQkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLnNldFVuaXF1ZUlkKGxhYmVsSWQpOworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gYnVzaW5lc3NMb2dpYy5kZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb24obm9kZVR5cGUsIHVuaXF1ZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIG51bGwsIHVzZXJJZCk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvcGVydHkuIFJlYXNvbiAtIHt9IiwgcmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gY3JlYXRlZEFJID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCisJCQlsb2cuZGVidWcoIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ge309e30gZGVsZXRlZCBzdWNjZXNzZnVsbHkgd2l0aCBpZCB7fSIsIGNyZWF0ZWRBSS5nZXRLZXkoKSwgY3JlYXRlZEFJLmdldFZhbHVlKCksIGNyZWF0ZWRBSS5nZXRVbmlxdWVJZCgpKTsKKworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgY3JlYXRlZEFJKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkRlbGV0ZSBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJEZWxldGUgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiIpOworCQkJbG9nLmRlYnVnKCJEZWxldGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIEdldCBhIHNwZWNpZmljIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvcGVydHkgYnkgYSBnaXZlbiBpZCB1bmRlciBnaXZlbiByZXNvdXJjZS9zZXJ2aWNlCisJICogCisJICogQHBhcmFtIG5vZGVUeXBlCisJICogQHBhcmFtIHVuaXF1ZUlkCisJICogQHBhcmFtIGxhYmVsSWQKKwkgKiBAcGFyYW0gcmVxdWVzdAorCSAqIEBwYXJhbSB1c2VySWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIFJlc3BvbnNlIGdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbkxhYmVsRm9yQ29tcG9uZW50KE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcgbGFiZWxJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJdHJ5IHsKKworCQkJLy8gY3JlYXRlIHRoZSBuZXcgcHJvcGVydHkKKwkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldEJMKGNvbnRleHQpOworCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbygpOworCQkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLnNldFVuaXF1ZUlkKGxhYmVsSWQpOworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gYnVzaW5lc3NMb2dpYy5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24obm9kZVR5cGUsIHVuaXF1ZUlkLCBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIG51bGwsIHVzZXJJZCk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvcGVydHkuIFJlYXNvbiAtIHt9IiwgcmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gY3JlYXRlZEFJID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCisJCQlsb2cuZGVidWcoIkFkZGl0aW9uYWwgaW5mb3JtYXRpb24ge309e30gZmV0Y2hlZCBzdWNjZXNzZnVsbHkgd2l0aCBpZCB7fSIsIGNyZWF0ZWRBSS5nZXRLZXkoKSwgY3JlYXRlZEFJLmdldFZhbHVlKCksIGNyZWF0ZWRBSS5nZXRVbmlxdWVJZCgpKTsKKworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgY3JlYXRlZEFJKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgQWRkaXRpb25hbCBJbmZvcm1hdGlvbiIpOworCisJCQlsb2cuZGVidWcoImdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJfQorCisJLyoqCisJICogR2V0IGFsbCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHByb3BlcnRpZXMgdW5kZXIgZ2l2ZW4gcmVzb3VyY2Uvc2VydmljZQorCSAqIAorCSAqIEBwYXJhbSBub2RlVHlwZQorCSAqIEBwYXJhbSB1bmlxdWVJZAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgUmVzcG9uc2UgZ2V0QWxsQWRkaXRpb25hbEluZm9ybWF0aW9uTGFiZWxGb3JDb21wb25lbnQoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdW5pcXVlSWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCXRyeSB7CisKKwkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldEJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlciA9IGJ1c2luZXNzTG9naWMuZ2V0QWxsQWRkaXRpb25hbEluZm9ybWF0aW9uKG5vZGVUeXBlLCB1bmlxdWVJZCwgbnVsbCwgdXNlcklkKTsKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gdXBkYXRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcHJvcGVydHkuIFJlYXNvbiAtIHt9IiwgcmVzcG9uc2VGb3JtYXQpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJCWxvZy5kZWJ1ZygiQWxsIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmV0cmlldmVkIGZvciBjb21wb25lbnQge30gaXMge30iLCB1bmlxdWVJZCwgYWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbik7CisKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24pOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IEFsbCBBZGRpdGlvbmFsIEluZm9ybWF0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgQWxsIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24iKTsKKwkJCWxvZy5kZWJ1ZygiR2V0IGFsbCBhZGRpb3RhbmwgaW5mb3JtYXRpb24gcHJvcGVydGllcyBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCX0KKworCXByaXZhdGUgQWRkaXRpb25hbEluZm9ybWF0aW9uQnVzaW5lc3NMb2dpYyBnZXRCTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25CdXNpbmVzc0xvZ2ljIGJsID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oQWRkaXRpb25hbEluZm9ybWF0aW9uQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJCXJldHVybiBibDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9BcnRpZmFjdFNlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9BcnRpZmFjdFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2FmMDBhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0FydGlmYWN0U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNTY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5BcnRpZmFjdE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0VWlEb3dubG9hZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGk7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogUm9vdCByZXNvdXJjZSAoZXhwb3NlZCBhdCAiLyIgcGF0aCkKKyAqLworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NhdGFsb2ciKQorQEFwaSh2YWx1ZSA9ICJSZXNvdXJjZSBBcnRpZmFjdCBTZXJ2bGV0IiwgZGVzY3JpcHRpb24gPSAiUmVzb3VyY2UgQXJ0aWZhY3QgU2VydmxldCIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RTZXJ2bGV0IGV4dGVuZHMgQmVHZW5lcmljU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXJ0aWZhY3RTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwkvLyAqKioqKioqKioqKioqKiogUmVzb3VyY2VzCisJQFBPU1QKKwlAUGF0aCgiL3Jlc291cmNlcy97cmVzb3VyY2VJZH0vYXJ0aWZhY3RzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIEFydGlmYWN0IiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIEFydGlmYWN0RGVmaW5pdGlvbiIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkFydGlmYWN0IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBsb2FkQXJ0aWZhY3QoQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLCBAQXBpUGFyYW0odmFsdWUgPSAianNvbiBkZXNjcmliZSB0aGUgYXJ0aWZhY3QiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCQkJcmV0dXJuIGhhbmRsZVVwbG9hZFJlcXVlc3QoZGF0YSwgcmVxdWVzdCwgcmVzb3VyY2VJZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImxvYWRBcnRpZmFjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigibG9hZEFydGlmYWN0Iik7CisJCQlsb2cuZGVidWcoImxvYWRBcnRpZmFjdCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQFBPU1QKKwlAUGF0aCgiL3Jlc291cmNlcy97cmVzb3VyY2VJZH0vYXJ0aWZhY3RzL3thcnRpZmFjdElkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlVwZGF0ZSBBcnRpZmFjdCIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgdXBkYXRlZCBhcnRpZmFjdCIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVBcnRpZmFjdChAUGF0aFBhcmFtKCJyZXNvdXJjZUlkIikgZmluYWwgU3RyaW5nIHJlc291cmNlSWQsIEBQYXRoUGFyYW0oImFydGlmYWN0SWQiKSBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgQEFwaVBhcmFtKHZhbHVlID0gImpzb24gZGVzY3JpYmUgdGhlIGFydGlmYWN0IiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCXRyeSB7CisJCQlyZXR1cm4gaGFuZGxlVXBkYXRlUmVxdWVzdChkYXRhLCByZXF1ZXN0LCByZXNvdXJjZUlkLCBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAidXBkYXRlQXJ0aWZhY3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoInVwZGF0ZUFydGlmYWN0Iik7CisJCQlsb2cuZGVidWcoInVwZGF0ZUFydGlmYWN0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAREVMRVRFCisJQFBhdGgoIi9yZXNvdXJjZXMve3Jlc291cmNlSWR9L2FydGlmYWN0cy97YXJ0aWZhY3RJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJEZWxldGUgQXJ0aWZhY3QiLCBodHRwTWV0aG9kID0gIkRFTEVURSIsIG5vdGVzID0gIlJldHVybnMgZGVsZXRlIGFydGlmYWN0IiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJSZXNvdXJjZSBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRlbGV0ZUFydGlmYWN0KEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwgQFBhdGhQYXJhbSgiYXJ0aWZhY3RJZCIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCQkJcmV0dXJuIGhhbmRsZURlbGV0ZVJlcXVlc3QocmVxdWVzdCwgcmVzb3VyY2VJZCwgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG51bGwsIG51bGwpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImRlbGV0ZUFydGlmYWN0Iik7CisJCQlsb2cuZGVidWcoImRlbGV0ZUFydGlmYWN0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLyAqKioqKioqKioqKioqKiogU2VydmljZXMKKwlAUE9TVAorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VJZH0vYXJ0aWZhY3RzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIEFydGlmYWN0IiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIEFydGlmYWN0RGVmaW5pdGlvbiIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkFydGlmYWN0IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBsb2FkSW5mb3JtYXRpb25BcnRpZmFjdChAUGF0aFBhcmFtKCJzZXJ2aWNlSWQiKSBmaW5hbCBTdHJpbmcgc2VydmljZUlkLCBAQXBpUGFyYW0odmFsdWUgPSAianNvbiBkZXNjcmliZSB0aGUgYXJ0aWZhY3QiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCQkJcmV0dXJuIGhhbmRsZVVwbG9hZFJlcXVlc3QoZGF0YSwgcmVxdWVzdCwgc2VydmljZUlkLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJsb2FkSW5mb3JtYXRpb25BcnRpZmFjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigibG9hZEluZm9ybWF0aW9uQXJ0aWZhY3QiKTsKKwkJCWxvZy5kZWJ1ZygibG9hZEluZm9ybWF0aW9uQXJ0aWZhY3QgdW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBQT1NUCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZUlkfS9hcnRpZmFjdHMve2FydGlmYWN0SWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIEFydGlmYWN0IiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyB1cGRhdGVkIGFydGlmYWN0IiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJTZXJ2aWNlIGFydGlmYWN0IGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlSW5mb3JtYXRpb25BcnRpZmFjdChAUGF0aFBhcmFtKCJzZXJ2aWNlSWQiKSBmaW5hbCBTdHJpbmcgc2VydmljZUlkLCBAUGF0aFBhcmFtKCJhcnRpZmFjdElkIikgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsIEBBcGlQYXJhbSh2YWx1ZSA9ICJqc29uIGRlc2NyaWJlIHRoZSBhcnRpZmFjdCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCQkJcmV0dXJuIGhhbmRsZVVwZGF0ZVJlcXVlc3QoZGF0YSwgcmVxdWVzdCwgc2VydmljZUlkLCBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJ1cGRhdGVJbmZvcm1hdGlvbkFydGlmYWN0Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJ1cGRhdGVJbmZvcm1hdGlvbkFydGlmYWN0Iik7CisJCQlsb2cuZGVidWcoInVwZGF0ZUluZm9ybWF0aW9uQXJ0aWZhY3QgdW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCS8vICoqKioqKioqKioqKioqKiBTZXJ2aWNlcyBhcGkgYXJ0aWZhY3RzCisJQFBPU1QKKwlAUGF0aCgiL3NlcnZpY2VzL3tzZXJ2aWNlSWR9L2FydGlmYWN0cy9hcGkve2FydGlmYWN0SWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIEFwaSBBcnRpZmFjdCIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgY3JlYXRlZCBBcnRpZmFjdERlZmluaXRpb24iLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFwaSBBcnRpZmFjdCBVcGRhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZUFwaUFydGlmYWN0KEBQYXRoUGFyYW0oInNlcnZpY2VJZCIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlSWQsIEBQYXRoUGFyYW0oImFydGlmYWN0SWQiKSBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgQEFwaVBhcmFtKHZhbHVlID0gImpzb24gZGVzY3JpYmUgdGhlIGFydGlmYWN0IiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5NRDVfSEVBREVSKSBTdHJpbmcgb3JpZ01kNSkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCQkJcmV0dXJuIGhhbmRsZVVwZGF0ZVJlcXVlc3QoZGF0YSwgcmVxdWVzdCwgc2VydmljZUlkLCBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJ1cGRhdGVBcGlBcnRpZmFjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigidXBkYXRlQXBpQXJ0aWZhY3QiKTsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlQXBpQXJ0aWZhY3QgdW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBERUxFVEUKKwlAUGF0aCgiL3NlcnZpY2VzL3tzZXJ2aWNlSWR9L2FydGlmYWN0cy9hcGkve2FydGlmYWN0SWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRGVsZXRlIEFwaSBBcnRpZmFjdCIsIGh0dHBNZXRob2QgPSAiREVMRVRFIiwgbm90ZXMgPSAiUmV0dXJucyBEZWxldGVkIEFydGlmYWN0RGVmaW5pdGlvbiIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDQsIG1lc3NhZ2UgPSAiQXBpIEFydGlmYWN0IGRlbGV0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSB9KQorCXB1YmxpYyBSZXNwb25zZSBkZWxldGVBcGlBcnRpZmFjdChAUGF0aFBhcmFtKCJzZXJ2aWNlSWQiKSBmaW5hbCBTdHJpbmcgc2VydmljZUlkLCBAUGF0aFBhcmFtKCJhcnRpZmFjdElkIikgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuTUQ1X0hFQURFUikgU3RyaW5nIG9yaWdNZDUpIHsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJdHJ5IHsKKwkJCXJldHVybiBoYW5kbGVEZWxldGVSZXF1ZXN0KHJlcXVlc3QsIHNlcnZpY2VJZCwgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgbnVsbCwgbnVsbCk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiZGVsZXRlQXBpQXJ0aWZhY3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoImRlbGV0ZUFwaUFydGlmYWN0Iik7CisJCQlsb2cuZGVidWcoImRlbGV0ZUFwaUFydGlmYWN0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAREVMRVRFCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZUlkfS9hcnRpZmFjdHMve2FydGlmYWN0SWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRGVsZXRlIEFydGlmYWN0IiwgaHR0cE1ldGhvZCA9ICJERUxFVEUiLCBub3RlcyA9ICJSZXR1cm5zIGRlbGV0ZSBhcnRpZmFjdCIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiU2VydmljZSBhcnRpZmFjdCBkZWxldGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRlbGV0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdChAUGF0aFBhcmFtKCJzZXJ2aWNlSWQiKSBmaW5hbCBTdHJpbmcgc2VydmljZUlkLCBAUGF0aFBhcmFtKCJhcnRpZmFjdElkIikgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCXRyeSB7CisJCQlyZXR1cm4gaGFuZGxlRGVsZXRlUmVxdWVzdChyZXF1ZXN0LCBzZXJ2aWNlSWQsIGFydGlmYWN0SWQsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIG51bGwsIG51bGwpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImRlbGV0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiZGVsZXRlSW5mb3JtYXRpb25hbEFydGlmYWN0Iik7CisJCQlsb2cuZGVidWcoImRlbGV0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJLyoKKwkgKiBET1dOTE9BRCBBcnRpZmFjdHMgYnkganNvbiBib2R5IGluIGJhc2UgNjQgKGJlY2F1c2Ugb2YgdXNlcklkIHByb2JsZW0gd2l0aCBocmVmKQorCSAqLworCisJQEdFVAorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VJZH0vYXJ0aWZhY3RzL3thcnRpZmFjdElkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRvd25sb2FkIHNlcnZpY2UgQXJ0aWZhY3QgaW4gQmFzZTY0IiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGRvd25sb2FkZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlNlcnZpY2UgYXJ0aWZhY3QgZG93bmxvYWRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJTZXJ2aWNlL0FydGlmYWN0IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRvd25sb2FkU2VydmljZUFydGlmYWN0QmFzZTY0KEBQYXRoUGFyYW0oInNlcnZpY2VJZCIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlSWQsIEBQYXRoUGFyYW0oImFydGlmYWN0SWQiKSBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJdHJ5IHsKKwkJCXJldHVybiBoYW5kbGVEb3dubG9hZFJlcXVlc3QocmVxdWVzdCwgc2VydmljZUlkLCBhcnRpZmFjdElkLCBudWxsLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCBudWxsKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJkb3dubG9hZFNlcnZpY2VBcnRpZmFjdEJhc2U2NCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3RCYXNlNjQiKTsKKwkJCWxvZy5kZWJ1ZygiZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3RCYXNlNjQgdW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBHRVQKKwlAUGF0aCgiL3Jlc291cmNlcy97cmVzb3VyY2VJZH0vYXJ0aWZhY3RzL3thcnRpZmFjdElkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRvd25sb2FkIHJlc291cmNlIEFydGlmYWN0IGluIEJhc2U2NCIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyBkb3dubG9hZGVkIGFydGlmYWN0IiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXNvdXJjZSBhcnRpZmFjdCBkb3dubG9hZGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlJlc291cmNlL0FydGlmYWN0IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdEJhc2U2NChAUGF0aFBhcmFtKCJyZXNvdXJjZUlkIikgZmluYWwgU3RyaW5nIHJlc291cmNlSWQsIEBQYXRoUGFyYW0oImFydGlmYWN0SWQiKSBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJdHJ5IHsKKwkJCXJldHVybiBoYW5kbGVEb3dubG9hZFJlcXVlc3QocmVxdWVzdCwgcmVzb3VyY2VJZCwgYXJ0aWZhY3RJZCwgbnVsbCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG51bGwpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdEJhc2U2NCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiZG93bmxvYWRSZXNvdXJjZUFydGlmYWN0QmFzZTY0Iik7CisJCQlsb2cuZGVidWcoImRvd25sb2FkUmVzb3VyY2VBcnRpZmFjdEJhc2U2NCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZXMve2NvbXBvbmVudEluc3RhbmNlSWR9L2FydGlmYWN0cy97YXJ0aWZhY3RJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJEb3dubG9hZCBjb21wb25lbnQgQXJ0aWZhY3QgaW4gQmFzZTY0IiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGRvd25sb2FkZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJlc291cmNlSW5zdGFuY2UgYXJ0aWZhY3QgZG93bmxvYWRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJSZXNvdXJjZUluc3RhbmNlL0FydGlmYWN0IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRvd25sb2FkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0QmFzZTY0KAorCQkJQEFwaVBhcmFtKHZhbHVlID0gInZhbGlkIHZhbHVlczogcmVzb3VyY2VzIC8gc2VydmljZXMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FKSBAUGF0aFBhcmFtKCJjb250YWluZXJDb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsCisJCQlAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwgQFBhdGhQYXJhbSgiY29tcG9uZW50SW5zdGFuY2VJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBAUGF0aFBhcmFtKCJhcnRpZmFjdElkIikgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCXRyeSB7CisJCQlyZXR1cm4gaGFuZGxlRG93bmxvYWRSZXF1ZXN0KHJlcXVlc3QsIGNvbXBvbmVudEluc3RhbmNlSWQsIGFydGlmYWN0SWQsIGNvbXBvbmVudElkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiZG93bmxvYWRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RCYXNlNjQiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoImRvd25sb2FkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0QmFzZTY0Iik7CisJCQlsb2cuZGVidWcoImRvd25sb2FkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0QmFzZTY0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLyAqKioqKioqKioqKioqKiogUmVzb3VyY2UgbGlmZWN5Y2xlICggaW50ZXJmY2VzICkKKworCUBQT1NUCisJQFBhdGgoIi9yZXNvdXJjZXMve3Jlc291cmNlSWR9L3tpbnRlcmZhY2VUeXBlfS97b3BlcmF0aW9ufS9hcnRpZmFjdHMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgQXJ0aWZhY3QgYW5kIEF0dGFjaCB0byBpbnRlcmZhY2UiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgcmVzb3VyY2UiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlJlc291cmNlIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJBcnRpZmFjdCBhbHJlYWR5IGV4aXN0IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgbG9hZEFydGlmYWN0VG9JbnRlcmZhY2UoQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLCBAUGF0aFBhcmFtKCJpbnRlcmZhY2VUeXBlIikgZmluYWwgU3RyaW5nIGludGVyZmFjZVR5cGUsIEBQYXRoUGFyYW0oIm9wZXJhdGlvbiIpIGZpbmFsIFN0cmluZyBvcGVyYXRpb24sCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5NRDVfSEVBREVSKSBTdHJpbmcgb3JpZ01kNSwgQEFwaVBhcmFtKHZhbHVlID0gImpzb24gZGVzY3JpYmUgdGhlIGFydGlmYWN0IiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCXRyeSB7CisJCQlyZXR1cm4gaGFuZGxlQXJ0aWZhY3RSZXF1ZXN0KGRhdGEsIHJlcXVlc3QsIHJlc291cmNlSWQsIGludGVyZmFjZVR5cGUsIG9wZXJhdGlvbiwgbnVsbCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZSwgbnVsbCwgbnVsbCk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAibG9hZEFydGlmYWN0VG9JbnRlcmZhY2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoImxvYWRBcnRpZmFjdFRvSW50ZXJmYWNlIik7CisJCQlsb2cuZGVidWcoImxvYWRBcnRpZmFjdFRvSW50ZXJmYWNlIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKworCX0KKworCUBERUxFVEUKKwlAUGF0aCgiL3Jlc291cmNlcy97cmVzb3VyY2VJZH0ve2ludGVyZmFjZVR5cGV9L3tvcGVyYXRpb259L2FydGlmYWN0cy97YXJ0aWZhY3RJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJkZWxldGUgQXJ0aWZhY3QgZnJvbSBpbnRlcmZhY2UiLCBodHRwTWV0aG9kID0gImRlbGV0ZSIsIG5vdGVzID0gImRlbGV0ZSBtYXRjaGluZyBhcnRpZmFjdCBmcm9tIGludGVyZmFjZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiZGVsZXRlIGFydGlmYWN0IHVuZGVyIGludGVyZmFjZSBkZWxldGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiQXJ0aWZhY3QgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRlbGV0ZUFydGlmYWN0VG9JbnRlcmZhY2UoQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLCBAUGF0aFBhcmFtKCJpbnRlcmZhY2VUeXBlIikgZmluYWwgU3RyaW5nIGludGVyZmFjZVR5cGUsIEBQYXRoUGFyYW0oIm9wZXJhdGlvbiIpIGZpbmFsIFN0cmluZyBvcGVyYXRpb24sIEBQYXRoUGFyYW0oImFydGlmYWN0SWQiKSBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCXRyeSB7CisJCQlyZXR1cm4gaGFuZGxlRGVsZXRlUmVxdWVzdChyZXF1ZXN0LCByZXNvdXJjZUlkLCBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgaW50ZXJmYWNlVHlwZSwgb3BlcmF0aW9uKTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJkZWxldGVBcnRpZmFjdFRvSW50ZXJmYWNlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJkZWxldGVBcnRpZmFjdFRvSW50ZXJmYWNlIik7CisJCQlsb2cuZGVidWcoImRlbGV0ZUFydGlmYWN0VG9JbnRlcmZhY2UgdW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBQT1NUCisJQFBhdGgoIi9yZXNvdXJjZXMve3Jlc291cmNlSWR9L3tpbnRlcmZhY2VUeXBlfS97b3BlcmF0aW9ufS9hcnRpZmFjdHMve2FydGlmYWN0SWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAidXBkYXRlIEFydGlmYWN0ICBBdHRhY2ggdG8gaW50ZXJmYWNlIiwgaHR0cE1ldGhvZCA9ICJwb3N0Iiwgbm90ZXMgPSAidXBkYXRlcyBhcnRpZmFjdCBieSBpbnRlcmZhY2UiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gImRlbGV0ZSBhcnRpZmFjdCB1bmRlciBpbnRlcmZhY2UgZGVsZXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkFydGlmYWN0IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVBcnRpZmFjdFRvSW50ZXJmYWNlKEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwgQFBhdGhQYXJhbSgiaW50ZXJmYWNlVHlwZSIpIGZpbmFsIFN0cmluZyBpbnRlcmZhY2VUeXBlLCBAUGF0aFBhcmFtKCJvcGVyYXRpb24iKSBmaW5hbCBTdHJpbmcgb3BlcmF0aW9uLCBAUGF0aFBhcmFtKCJhcnRpZmFjdElkIikgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5NRDVfSEVBREVSKSBTdHJpbmcgb3JpZ01kNSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAianNvbiBkZXNjcmliZSB0aGUgYXJ0aWZhY3QiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhKSB7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCXRyeSB7CisJCQlyZXR1cm4gaGFuZGxlQXJ0aWZhY3RSZXF1ZXN0KGRhdGEsIHJlcXVlc3QsIHJlc291cmNlSWQsIGludGVyZmFjZVR5cGUsIG9wZXJhdGlvbiwgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIEFydGlmYWN0T3BlcmF0aW9uLlVwZGF0ZSwgbnVsbCwgbnVsbCk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAidXBkYXRlQXJ0aWZhY3RUb0ludGVyZmFjZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigidXBkYXRlQXJ0aWZhY3RUb0ludGVyZmFjZSIpOworCQkJbG9nLmRlYnVnKCJ1cGRhdGVBcnRpZmFjdFRvSW50ZXJmYWNlIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAUE9TVAorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZS97Y29tcG9uZW50SW5zdGFuY2VJZH0vYXJ0aWZhY3RzL3thcnRpZmFjdElkfS9oZWF0UGFyYW1zIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIFJlc291cmNlIEluc3RhbmNlIEhFQVRfRU5WIHBhcmFtZXRlcnMiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IHVwZGF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlUklBcnRpZmFjdCgKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSkgQFBhdGhQYXJhbSgiY29udGFpbmVyQ29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb250YWluZXJDb21wb25lbnRUeXBlLAorCQkJQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBQYXRoUGFyYW0oImNvbXBvbmVudEluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwgQFBhdGhQYXJhbSgiYXJ0aWZhY3RJZCIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gImpzb24gZGVzY3JpYmUgdGhlIGFydGlmYWN0IiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJdHJ5IHsKKwkJCXJldHVybiBoYW5kbGVBcnRpZmFjdFJlcXVlc3QoZGF0YSwgcmVxdWVzdCwgY29tcG9uZW50SW5zdGFuY2VJZCwgbnVsbCwgbnVsbCwgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UsIEFydGlmYWN0T3BlcmF0aW9uLlVwZGF0ZSwgY29tcG9uZW50SWQsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgInVwZGF0ZVJJQXJ0aWZhY3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoInVwZGF0ZVJJQXJ0aWZhY3QiKTsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlUklBcnRpZmFjdCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQFBPU1QKKwlAUGF0aCgiL3tjb250YWluZXJDb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L3Jlc291cmNlSW5zdGFuY2Uve2NvbXBvbmVudEluc3RhbmNlSWR9L2FydGlmYWN0cy97YXJ0aWZhY3RJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJVcGRhdGUgUmVzb3VyY2UgSW5zdGFuY2UgYXJ0aWZhY3QgcGF5bG9hZCIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgdXBkYXRlZCBhcnRpZmFjdCIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXJ0aWZhY3QgdXBkYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVDb21wb25lbnRJbnN0YW5jZUFydGlmYWN0KEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLk1ENV9IRUFERVIpIFN0cmluZyBvcmlnTWQ1LAorCQkJQEFwaVBhcmFtKHZhbHVlID0gInZhbGlkIHZhbHVlczogcmVzb3VyY2VzIC8gc2VydmljZXMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FKSBAUGF0aFBhcmFtKCJjb250YWluZXJDb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsCisJCQlAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwgQFBhdGhQYXJhbSgiY29tcG9uZW50SW5zdGFuY2VJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBAUGF0aFBhcmFtKCJhcnRpZmFjdElkIikgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAianNvbiBkZXNjcmliZSB0aGUgYXJ0aWZhY3QiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCQkJcmV0dXJuIGhhbmRsZUFydGlmYWN0UmVxdWVzdChkYXRhLCByZXF1ZXN0LCBjb21wb25lbnRJbnN0YW5jZUlkLCBudWxsLCBudWxsLCBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgQXJ0aWZhY3RPcGVyYXRpb24uVXBkYXRlLCBjb21wb25lbnRJZCwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAibG9hZFJlc291cmNlSW5zdGFuY2VIZWF0RW52QXJ0aWZhY3QiKTsKKwkJCWxvZy5kZWJ1ZygibG9hZFJlc291cmNlSW5zdGFuY2VIZWF0RW52QXJ0aWZhY3QgdW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBQT1NUCisJQFBhdGgoIi97Y29udGFpbmVyQ29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9yZXNvdXJjZUluc3RhbmNlL3tjb21wb25lbnRJbnN0YW5jZUlkfS9hcnRpZmFjdHMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJMb2FkIFJlc291cmNlIEluc3RhbmNlIGFydGlmYWN0IHBheWxvYWQiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IHVwZGF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgbG9hZENvbXBvbmVudEluc3RhbmNlQXJ0aWZhY3QoQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuTUQ1X0hFQURFUikgU3RyaW5nIG9yaWdNZDUsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAidmFsaWQgdmFsdWVzOiByZXNvdXJjZXMgLyBzZXJ2aWNlcyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUgKyAiLCIgKyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUUpIEBQYXRoUGFyYW0oImNvbnRhaW5lckNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSwKKwkJCUBQYXRoUGFyYW0oImNvbXBvbmVudElkIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudElkLCBAUGF0aFBhcmFtKCJjb21wb25lbnRJbnN0YW5jZUlkIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsIEBBcGlQYXJhbSh2YWx1ZSA9ICJqc29uIGRlc2NyaWJlIHRoZSBhcnRpZmFjdCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCQkJcmV0dXJuIGhhbmRsZUFydGlmYWN0UmVxdWVzdChkYXRhLCByZXF1ZXN0LCBjb21wb25lbnRJbnN0YW5jZUlkLCBudWxsLCBudWxsLCBudWxsLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgQXJ0aWZhY3RPcGVyYXRpb24uQ3JlYXRlLCBjb21wb25lbnRJZCwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAibG9hZFJlc291cmNlSW5zdGFuY2VIZWF0RW52QXJ0aWZhY3QiKTsKKwkJCWxvZy5kZWJ1ZygibG9hZFJlc291cmNlSW5zdGFuY2VIZWF0RW52QXJ0aWZhY3QgdW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBERUxFVEUKKwlAUGF0aCgiL3tjb250YWluZXJDb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L3Jlc291cmNlSW5zdGFuY2Uve2NvbXBvbmVudEluc3RhbmNlSWR9L2FydGlmYWN0cy97YXJ0aWZhY3RJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJEZWxldGUgUmVzb3VyY2UgSW5zdGFuY2UgYXJ0aWZhY3QiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGRlbGV0ZWQgYXJ0aWZhY3QiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkFydGlmYWN0IHVwZGF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlQ29tcG9uZW50SW5zdGFuY2VBcnRpZmFjdChASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5NRDVfSEVBREVSKSBTdHJpbmcgb3JpZ01kNSwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSkgQFBhdGhQYXJhbSgiY29udGFpbmVyQ29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb250YWluZXJDb21wb25lbnRUeXBlLAorCQkJQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBQYXRoUGFyYW0oImNvbXBvbmVudEluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwgQFBhdGhQYXJhbSgiYXJ0aWZhY3RJZCIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gImpzb24gZGVzY3JpYmUgdGhlIGFydGlmYWN0IiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJdHJ5IHsKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gaGFuZGxlRGVsZXRlUmVxdWVzdChyZXF1ZXN0LCBjb21wb25lbnRJbnN0YW5jZUlkLCBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSwgbnVsbCwgbnVsbCwgY29tcG9uZW50SWQpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImRlbGV0ZUFydGlmYWN0Iik7CisJCQlsb2cuZGVidWcoImRlbGV0ZUFydGlmYWN0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLyAvLy8vLy8vLy8vIEFQSSBFTkQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvLyAqKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqKioqKioqKioqKioKKworCXByaXZhdGUgUmVzcG9uc2UgaGFuZGxlVXBsb2FkUmVxdWVzdChTdHJpbmcgZGF0YSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBjb21wb25lbnRJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCQlyZXR1cm4gaGFuZGxlQXJ0aWZhY3RSZXF1ZXN0KGRhdGEsIHJlcXVlc3QsIGNvbXBvbmVudElkLCBudWxsLCBjb21wb25lbnRUeXBlLCBBcnRpZmFjdE9wZXJhdGlvbi5DcmVhdGUpOworCX0KKworCXByaXZhdGUgUmVzcG9uc2UgaGFuZGxlVXBkYXRlUmVxdWVzdChTdHJpbmcgZGF0YSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGFydGlmYWN0SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHsKKwkJcmV0dXJuIGhhbmRsZUFydGlmYWN0UmVxdWVzdChkYXRhLCByZXF1ZXN0LCBjb21wb25lbnRJZCwgYXJ0aWZhY3RJZCwgY29tcG9uZW50VHlwZSwgQXJ0aWZhY3RPcGVyYXRpb24uVXBkYXRlKTsKKwl9CisKKwlwcml2YXRlIFJlc3BvbnNlIGhhbmRsZURvd25sb2FkUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgU3RyaW5nIHBhcmVudElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSkgeworCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTG9naWMgPSBnZXRBcnRpZmFjdEJMKGNvbnRleHQpOworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIGJ5dGVbXT4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXN1bHQgPSBhcnRpZmFjdHNMb2dpYy5oYW5kbGVEb3dubG9hZFJlcXVlc3RCeUlkKGNvbXBvbmVudElkLCBhcnRpZmFjdElkLCB1c2VySWQsIGNvbXBvbmVudFR5cGUsIHBhcmVudElkLCBjb250YWluZXJDb21wb25lbnRUeXBlKTsKKworCQlSZXNwb25zZSByZXNwb25zZTsKKwkJaWYgKGFjdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJYnl0ZVtdIGZpbGUgPSBhY3Rpb25SZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0UmlnaHQoKTsKKwkJCVN0cmluZyBiYXNlNjRDb250ZW50cyA9IG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZUJhc2U2NChmaWxlKSk7CisJCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gYWN0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCUFydGlmYWN0VWlEb3dubG9hZERhdGEgYXJ0aWZhY3RVaURvd25sb2FkRGF0YSA9IG5ldyBBcnRpZmFjdFVpRG93bmxvYWREYXRhKCk7CisJCQlhcnRpZmFjdFVpRG93bmxvYWREYXRhLnNldEFydGlmYWN0TmFtZShhcnRpZmFjdE5hbWUpOworCQkJYXJ0aWZhY3RVaURvd25sb2FkRGF0YS5zZXRCYXNlNjRDb250ZW50cyhiYXNlNjRDb250ZW50cyk7CisJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgYXJ0aWZhY3RVaURvd25sb2FkRGF0YSk7CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgUmVzcG9uc2UgaGFuZGxlRGVsZXRlUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGludGVyZmFjZVR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lKSB7CisJCXJldHVybiBoYW5kbGVEZWxldGVSZXF1ZXN0KHJlcXVlc3QsIGNvbXBvbmVudElkLCBhcnRpZmFjdElkLCBjb21wb25lbnRUeXBlLCBpbnRlcmZhY2VUeXBlLCBvcGVyYXRpb25OYW1lLCBudWxsKTsKKwl9CisKKwlwcml2YXRlIFJlc3BvbnNlIGhhbmRsZURlbGV0ZVJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGFydGlmYWN0SWQsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBpbnRlcmZhY2VUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSwgU3RyaW5nIHBhcmVudElkKSB7CisJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyBhcnRpZmFjdHNMb2dpYyA9IGdldEFydGlmYWN0QkwoY29udGV4dCk7CisJCUVpdGhlcjxFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzdWx0ID0gYXJ0aWZhY3RzTG9naWMuaGFuZGxlQXJ0aWZhY3RSZXF1ZXN0KGNvbXBvbmVudElkLCB1c2VySWQsIGNvbXBvbmVudFR5cGUsIEFydGlmYWN0T3BlcmF0aW9uLkRlbGV0ZSwgYXJ0aWZhY3RJZCwgbnVsbCwgbnVsbCwgbnVsbCwgaW50ZXJmYWNlVHlwZSwgb3BlcmF0aW9uTmFtZSwKKwkJCQlwYXJlbnRJZCwgbnVsbCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlOworCQlpZiAoYWN0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0gZWxzZSB7CisJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBPcGVyYXRpb24+IHJlc3VsdCA9IGFjdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChyZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzcG9uc2U7CisKKwl9CisKKwlwcml2YXRlIFJlc3BvbnNlIGhhbmRsZUFydGlmYWN0UmVxdWVzdChTdHJpbmcgZGF0YSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgYXJ0aWZhY3RJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSwgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgcGFyZW50SWQsCisJCQlTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvID0gUmVwcmVzZW50YXRpb25VdGlscy5jb252ZXJ0SnNvblRvQXJ0aWZhY3REZWZpbml0aW9uKGRhdGEsIEFydGlmYWN0RGVmaW5pdGlvbi5jbGFzcyk7CisJCVN0cmluZyBvcmlnTWQ1ID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLk1ENV9IRUFERVIpOworCisJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0c0xvZ2ljID0gZ2V0QXJ0aWZhY3RCTChjb250ZXh0KTsKKwkJRWl0aGVyPEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIE9wZXJhdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXN1bHQgPSBhcnRpZmFjdHNMb2dpYy5oYW5kbGVBcnRpZmFjdFJlcXVlc3QoY29tcG9uZW50SWQsIHVzZXJJZCwgY29tcG9uZW50VHlwZSwgb3BlcmF0aW9uLCBhcnRpZmFjdElkLCBhcnRpZmFjdEluZm8sIG9yaWdNZDUsIGRhdGEsIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUsIHBhcmVudElkLAorCQkJCWNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQlSZXNwb25zZSByZXNwb25zZTsKKwkJaWYgKGFjdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiByZXN1bHQgPSBhY3Rpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAocmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlOworCisJfQorCisJcHJpdmF0ZSBSZXNwb25zZSBoYW5kbGVBcnRpZmFjdFJlcXVlc3QoU3RyaW5nIGRhdGEsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyBhcnRpZmFjdElkLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlLCBBcnRpZmFjdE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKKwkJcmV0dXJuIGhhbmRsZUFydGlmYWN0UmVxdWVzdChkYXRhLCBzZXJ2bGV0UmVxdWVzdCwgY29tcG9uZW50SWQsIG51bGwsIG51bGwsIGFydGlmYWN0SWQsIGNvbXBvbmVudFR5cGUsIG9wZXJhdGlvbiwgbnVsbCwgbnVsbCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQXR0cmlidXRlU2VydmxldC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0F0dHJpYnV0ZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU2NGFlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0F0dHJpYnV0ZVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkF0dHJpYnV0ZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXR0cmlidXRlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGk7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogV2ViIFNlcnZsZXQgZm9yIGFjdGlvbnMgb24gQXR0cmlidXRlcworICogCisgKiBAYXV0aG9yIG1zaGl0cml0CisgKgorICovCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvY2F0YWxvZyIpCitAQXBpKHZhbHVlID0gIlJlc291cmNlIEF0dHJpYnV0ZSBTZXJ2bGV0IiwgZGVzY3JpcHRpb24gPSAiUmVzb3VyY2UgQXR0cmlidXRlIFNlcnZsZXQiKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEF0dHJpYnV0ZVNlcnZsZXQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25zU2VydmxldCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF0dHJpYnV0ZVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qKgorCSAqIENyZWF0ZXMgbmV3IEF0dHJpYnV0ZSBvbiBhIHJlc291cmNlIHdpdGggZ2l2ZW4gcmVzb3VyY2UgSUQKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBkYXRhCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHJldHVybgorCSAqLworCUBQT1NUCisJQFBhdGgoInJlc291cmNlcy97cmVzb3VyY2VJZH0vYXR0cmlidXRlcyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBSZXNvdXJjZSBBdHRyaWJ1dGUiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgcmVzb3VyY2UgYXR0cmlidXRlIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJSZXNvdXJjZSBwcm9wZXJ0eSBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiUmVzb3VyY2UgYXR0cmlidXRlIGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBjcmVhdGVBdHRyaWJ1dGUoQEFwaVBhcmFtKHZhbHVlID0gInJlc291cmNlIGlkIHRvIHVwZGF0ZSB3aXRoIG5ldyBhdHRyaWJ1dGUiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwgQEFwaVBhcmFtKHZhbHVlID0gIlJlc291cmNlIGF0dHJpYnV0ZSB0byBiZSBjcmVhdGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygiZGF0YSBpcyB7fSIsIGRhdGEpOworCisJCXRyeSB7CisJCQlXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCQlXcmFwcGVyPEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHJpYnV0ZXNXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQkJLy8gY29udmVydCBqc29uIHRvIEF0dHJpYnV0ZURlZmluaXRpb24KKworCQkJYnVpbGRBdHRyaWJ1dGVGcm9tU3RyaW5nKGRhdGEsIGF0dHJpYnV0ZXNXcmFwcGVyLCBlcnJvcldyYXBwZXIpOworCQkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQlBdHRyaWJ1dGVCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRCdXNpbmVzc0xvZ2ljKGNvbnRleHQsICgpIC0+IEF0dHJpYnV0ZUJ1c2luZXNzTG9naWMuY2xhc3MpOworCQkJCUVpdGhlcjxBdHRyaWJ1dGVEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQXR0cmlidXRlID0gYnVzaW5lc3NMb2dpYy5jcmVhdGVBdHRyaWJ1dGUocmVzb3VyY2VJZCwgYXR0cmlidXRlc1dyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHVzZXJJZCk7CisJCQkJaWYgKGNyZWF0ZUF0dHJpYnV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChjcmVhdGVBdHRyaWJ1dGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhdHRyaWJ1dGVzV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY3JlYXRlQXR0cmlidXRlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisKKwkJCVJlc3BvbnNlIHJlc3BvbnNlOworCQkJaWYgKCFlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJbG9nLmluZm8oIkZhaWxlZCB0byBjcmVhdGUgQXR0cmlidXRlLiBSZWFzb24gLSAiLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCQl9IGVsc2UgeworCQkJCUF0dHJpYnV0ZURlZmluaXRpb24gY3JlYXRlZEF0dERlZiA9IGF0dHJpYnV0ZXNXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQkJCWxvZy5kZWJ1ZygiQXR0cmlidXRlIHt9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IHdpdGggaWQge30iLCBjcmVhdGVkQXR0RGVmLmdldE5hbWUoKSwgY3JlYXRlZEF0dERlZi5nZXRVbmlxdWVJZCgpKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGNyZWF0ZWRBdHREZWYpKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJDcmVhdGUgQXR0cmlidXRlIik7CisJCQlsb2cuZGVidWcoImNyZWF0ZSBwcm9wZXJ0eSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgZXhpc3RpbmcgQXR0cmlidXRlIHdpdGggZ2l2ZW4gYXR0cmlidXRlSUQgb24gYSByZXNvdXJjZSB3aXRoIGdpdmVuIHJlc291cmNlSUQKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBhdHRyaWJ1dGVJZAorCSAqIEBwYXJhbSBkYXRhCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHJldHVybgorCSAqLworCUBQVVQKKwlAUGF0aCgicmVzb3VyY2VzL3tyZXNvdXJjZUlkfS9hdHRyaWJ1dGVzL3thdHRyaWJ1dGVJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJVcGRhdGUgUmVzb3VyY2UgQXR0cmlidXRlIiwgaHR0cE1ldGhvZCA9ICJQVVQiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgYXR0cmlidXRlIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXNvdXJjZSBhdHRyaWJ1dGUgdXBkYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVBdHRyaWJ1dGUoQEFwaVBhcmFtKHZhbHVlID0gInJlc291cmNlIGlkIHRvIHVwZGF0ZSB3aXRoIG5ldyBhdHRyaWJ1dGUiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJhdHRyaWJ1dGUgaWQgdG8gdXBkYXRlIiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJhdHRyaWJ1dGVJZCIpIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVJZCwgQEFwaVBhcmFtKHZhbHVlID0gIlJlc291cmNlIGF0dHJpYnV0ZSB0byB1cGRhdGUiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCS8vIGdldCBtb2RpZmllciBpZAorCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCXRyeSB7CisJCQkvLyBjb252ZXJ0IGpzb24gdG8gUHJvcGVydHlEZWZpbml0aW9uCisJCQlXcmFwcGVyPFJlc3BvbnNlRm9ybWF0PiBlcnJvcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCQlXcmFwcGVyPEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHJpYnV0ZXNXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQkJLy8gY29udmVydCBqc29uIHRvIEF0dHJpYnV0ZURlZmluaXRpb24KKworCQkJYnVpbGRBdHRyaWJ1dGVGcm9tU3RyaW5nKGRhdGEsIGF0dHJpYnV0ZXNXcmFwcGVyLCBlcnJvcldyYXBwZXIpOworCisJCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCUF0dHJpYnV0ZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldEJ1c2luZXNzTG9naWMoY29udGV4dCwgKCkgLT4gQXR0cmlidXRlQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJCQkJRWl0aGVyPEF0dHJpYnV0ZURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJVcGRhdGVBdHRyaWJ1dGUgPSBidXNpbmVzc0xvZ2ljLnVwZGF0ZUF0dHJpYnV0ZShyZXNvdXJjZUlkLCBhdHRyaWJ1dGVJZCwgYXR0cmlidXRlc1dyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHVzZXJJZCk7CisJCQkJLy8gdXBkYXRlIHByb3BlcnR5CisJCQkJaWYgKGVpdGhlclVwZGF0ZUF0dHJpYnV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChlaXRoZXJVcGRhdGVBdHRyaWJ1dGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhdHRyaWJ1dGVzV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZWl0aGVyVXBkYXRlQXR0cmlidXRlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisKKwkJCVJlc3BvbnNlIHJlc3BvbnNlOworCQkJaWYgKCFlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJbG9nLmluZm8oIkZhaWxlZCB0byB1cGRhdGUgQXR0cmlidXRlLiBSZWFzb24gLSAiLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCQl9IGVsc2UgeworCQkJCUF0dHJpYnV0ZURlZmluaXRpb24gdXBkYXRlZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQkJCWxvZy5kZWJ1ZygiQXR0cmlidXRlIGlkIHt9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICIsIHVwZGF0ZWRBdHRyaWJ1dGUuZ2V0VW5pcXVlSWQoKSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24odXBkYXRlZEF0dHJpYnV0ZSkpOworCQkJfQorCisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIlVwZGF0ZSBBdHRyaWJ1dGUiKTsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlIGF0dHJpYnV0ZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCX0KKworCS8qKgorCSAqIERlbGV0ZXMgZXhpc3RpbmcgQXR0cmlidXRlIHdpdGggZ2l2ZW4gYXR0cmlidXRlSUQgb24gYSByZXNvdXJjZSB3aXRoIGdpdmVuIHJlc291cmNlSUQKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBhdHRyaWJ1dGVJZAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIHVzZXJJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlAREVMRVRFCisJQFBhdGgoInJlc291cmNlcy97cmVzb3VyY2VJZH0vYXR0cmlidXRlcy97YXR0cmlidXRlSWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIFJlc291cmNlIEF0dHJpYnV0ZSIsIGh0dHBNZXRob2QgPSAiREVMRVRFIiwgbm90ZXMgPSAiUmV0dXJucyBkZWxldGVkIGF0dHJpYnV0ZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDQsIG1lc3NhZ2UgPSAiZGVsZXRlZCBhdHRyaWJ1dGUiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJSZXNvdXJjZSBwcm9wZXJ0eSBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBkZWxldGVBdHRyaWJ1dGUoQEFwaVBhcmFtKHZhbHVlID0gInJlc291cmNlIGlkIG9mIGF0dHJpYnV0ZSIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gIkF0dHJpYnV0ZSBpZCB0byBkZWxldGUiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oImF0dHJpYnV0ZUlkIikgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZUlkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCXRyeSB7CisKKwkJCS8vIGRlbGV0ZSB0aGUgcHJvcGVydHkKKwkJCUF0dHJpYnV0ZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldEJ1c2luZXNzTG9naWMoY29udGV4dCwgKCkgLT4gQXR0cmlidXRlQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJCQlFaXRoZXI8QXR0cmlidXRlRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckF0dHJpYnV0ZSA9IGJ1c2luZXNzTG9naWMuZGVsZXRlQXR0cmlidXRlKHJlc291cmNlSWQsIGF0dHJpYnV0ZUlkLCB1c2VySWQpOworCQkJaWYgKGVpdGhlckF0dHJpYnV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgQXR0cmlidXRlLiBSZWFzb24gLSAiLCBlaXRoZXJBdHRyaWJ1dGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGVpdGhlckF0dHJpYnV0ZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVEZWZpbml0aW9uID0gZWl0aGVyQXR0cmlidXRlLmxlZnQoKS52YWx1ZSgpOworCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVEZWZpbml0aW9uLmdldE5hbWUoKTsKKworCQkJbG9nLmRlYnVnKCJBdHRyaWJ1dGUge30gZGVsZXRlZCBzdWNjZXNzZnVsbHkgd2l0aCBpZCB7fSIsIG5hbWUsIGF0dHJpYnV0ZURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihhdHRyaWJ1dGVEZWZpbml0aW9uKSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkRlbGV0ZSBBdHRyaWJ1dGUiKTsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlIGF0dHJpYnV0ZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBidWlsZEF0dHJpYnV0ZUZyb21TdHJpbmcoU3RyaW5nIGRhdGEsIFdyYXBwZXI8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlc1dyYXBwZXIsIFdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlcikgeworCisJCXRyeSB7CisJCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCQkJZmluYWwgQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGUgPSBnc29uLmZyb21Kc29uKGRhdGEsIEF0dHJpYnV0ZURlZmluaXRpb24uY2xhc3MpOworCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7CisJCQkJbG9nLmluZm8oIkF0dHJpYnV0ZSBjb250ZW50IGlzIGludmFsaWQgLSB7fSIsIGRhdGEpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZUZvcm1hdCk7CisJCQl9IGVsc2UgeworCQkJCWF0dHJpYnV0ZXNXcmFwcGVyLnNldElubmVyRWxlbWVudChhdHRyaWJ1dGUpOworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZUZvcm1hdCk7CisJCQlsb2cuZGVidWcoIkF0dHJpYnV0ZSBjb250ZW50IGlzIGludmFsaWQgLSB7fSIsIGRhdGEsIGUpOworCQkJbG9nLmluZm8oIkF0dHJpYnV0ZSBjb250ZW50IGlzIGludmFsaWQgLSB7fSIsIGRhdGEpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0JlR2VuZXJpY1NlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9CZUdlbmVyaWNTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxYjU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9CZUdlbmVyaWNTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmNsZWFuLkNvbXBvbmVudHNDbGVhbkJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuRWxlbWVudEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkdyb3VwQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuTW9uaXRvcmluZ0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlByb2R1Y3RCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Qcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5SZXNvdXJjZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlNlcnZpY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5TZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5WRkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLklFbGVtZW50REFPOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uc2VydmxldHMuQmFzaWNTZXJ2bGV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitwdWJsaWMgY2xhc3MgQmVHZW5lcmljU2VydmxldCBleHRlbmRzIEJhc2ljU2VydmxldCB7CisKKwlAQ29udGV4dAorCXByb3RlY3RlZCBIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3Q7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmVHZW5lcmljU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJLyoqKioqKioqKioqKioqKioqKioqIE5ldyBlcnJvciByZXNwb25zZSBtZWNoYW5pc20gKioqKioqKioqKioqKiovCisKKwlwcm90ZWN0ZWQgUmVzcG9uc2UgYnVpbGRFcnJvclJlc3BvbnNlKFJlc3BvbnNlRm9ybWF0IHJlcXVlc3RFcnJvcldyYXBwZXIpIHsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5zdGF0dXMocmVxdWVzdEVycm9yV3JhcHBlci5nZXRTdGF0dXMoKSkuZW50aXR5KGdzb24udG9Kc29uKHJlcXVlc3RFcnJvcldyYXBwZXIuZ2V0UmVxdWVzdEVycm9yKCkpKS5idWlsZCgpOworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHJvdGVjdGVkIFJlc3BvbnNlIGJ1aWxkT2tSZXNwb25zZShSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlV3JhcHBlciwgT2JqZWN0IGVudGl0eSkgeworCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGVycm9yUmVzcG9uc2VXcmFwcGVyLCBlbnRpdHksIG51bGwpOworCX0KKworCXByb3RlY3RlZCBSZXNwb25zZSBidWlsZE9rUmVzcG9uc2UoUmVzcG9uc2VGb3JtYXQgZXJyb3JSZXNwb25zZVdyYXBwZXIsIE9iamVjdCBlbnRpdHksIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEhlYWRlcnMpIHsKKwkJaW50IHN0YXR1cyA9IGVycm9yUmVzcG9uc2VXcmFwcGVyLmdldFN0YXR1cygpOworCQlSZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2VCdWlsZGVyID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cyk7CisJCWlmIChlbnRpdHkgIT0gbnVsbCkgeworCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorCQkJCWxvZy50cmFjZSgicmV0dXJuZWQgZW50aXR5IGlzIHt9IiwgZW50aXR5LnRvU3RyaW5nKCkpOworCQkJcmVzcG9uc2VCdWlsZGVyID0gcmVzcG9uc2VCdWlsZGVyLmVudGl0eShlbnRpdHkpOworCQl9CisJCWlmIChhZGRpdGlvbmFsSGVhZGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVyIDogYWRkaXRpb25hbEhlYWRlcnMuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBoZWFkZXJOYW1lID0gYWRkaXRpb25hbEhlYWRlci5nZXRLZXkoKTsKKwkJCQlTdHJpbmcgaGVhZGVyVmFsdWUgPSBhZGRpdGlvbmFsSGVhZGVyLmdldFZhbHVlKCk7CisJCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorCQkJCQlsb2cudHJhY2UoIkFkZGluZyBoZWFkZXIge30gd2l0aCB2YWx1ZSB7fSB0byB0aGUgcmVzcG9uc2UiLCBoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSk7CisJCQkJcmVzcG9uc2VCdWlsZGVyLmhlYWRlcihoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3BvbnNlQnVpbGRlci5idWlsZCgpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJcHJvdGVjdGVkIFVzZXJCdXNpbmVzc0xvZ2ljIGdldFVzZXJBZG1pbk1hbmFnZXIoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlyZXR1cm4gZ2V0QnVzaW5lc3NMb2dpYyhjb250ZXh0LCAoKSAtPiBVc2VyQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlQnVzaW5lc3NMb2dpYyBnZXRSZXNvdXJjZUJMKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJcmV0dXJuIGdldEJ1c2luZXNzTG9naWMoY29udGV4dCwgKCkgLT4gUmVzb3VyY2VCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tcG9uZW50c0NsZWFuQnVzaW5lc3NMb2dpYyBnZXRDb21wb25lbnRDbGVhbmVyQkwoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlyZXR1cm4gZ2V0QnVzaW5lc3NMb2dpYyhjb250ZXh0LCAoKSAtPiBDb21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwl9CisKKwlwcm90ZWN0ZWQgU2VydmljZUJ1c2luZXNzTG9naWMgZ2V0U2VydmljZUJMKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJcmV0dXJuIGdldEJ1c2luZXNzTG9naWMoY29udGV4dCwgKCkgLT4gU2VydmljZUJ1c2luZXNzTG9naWMuY2xhc3MpOworCX0KKworCXByb3RlY3RlZCBQcm9kdWN0QnVzaW5lc3NMb2dpYyBnZXRQcm9kdWN0QkwoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlyZXR1cm4gZ2V0QnVzaW5lc3NMb2dpYyhjb250ZXh0LCAoKSAtPiBQcm9kdWN0QnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJfQorCisJcHJvdGVjdGVkIEFydGlmYWN0c0J1c2luZXNzTG9naWMgZ2V0QXJ0aWZhY3RCTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCXJldHVybiBnZXRCdXNpbmVzc0xvZ2ljKGNvbnRleHQsICgpIC0+IEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MpOworCX0KKworCXByb3RlY3RlZCBFbGVtZW50QnVzaW5lc3NMb2dpYyBnZXRFbGVtZW50QkwoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlyZXR1cm4gZ2V0QnVzaW5lc3NMb2dpYyhjb250ZXh0LCAoKSAtPiBFbGVtZW50QnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJfQorCisJcHJvdGVjdGVkIE1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljIGdldE1vbml0b3JpbmdCTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCXJldHVybiBnZXRCdXNpbmVzc0xvZ2ljKGNvbnRleHQsICgpIC0+IE1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwl9CisKKwlwcm90ZWN0ZWQgPFNvbWVCdXNpbmVzc0xvZ2ljPiBTb21lQnVzaW5lc3NMb2dpYyBnZXRCdXNpbmVzc0xvZ2ljKFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFN1cHBsaWVyPENsYXNzPFNvbWVCdXNpbmVzc0xvZ2ljPj4gYnVzaW5lc3NMb2dpY0NsYXNzR2VuKSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlTb21lQnVzaW5lc3NMb2dpYyBtb25pdG9yaW5nQnVzaW5lc3NMb2dpYyA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKGJ1c2luZXNzTG9naWNDbGFzc0dlbi5nZXQoKSk7CisJCXJldHVybiBtb25pdG9yaW5nQnVzaW5lc3NMb2dpYzsKKwl9CisKKwlwcm90ZWN0ZWQgR3JvdXBCdXNpbmVzc0xvZ2ljIGdldEdyb3VwQkwoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlHcm91cEJ1c2luZXNzTG9naWMgZ3JvdXBCdXNpbmVzc0xvZ2ljID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oR3JvdXBCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwkJcmV0dXJuIGdyb3VwQnVzaW5lc3NMb2dpYzsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGdldENvbXBvbmVudEluc3RhbmNlQkwoU2VydmxldENvbnRleHQgY29udGV4dCwgQ29tcG9uZW50VHlwZUVudW0gY29udGFpbmVyQ29tcG9uZW50VHlwZSkgeworCQlXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID0gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKwkJV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChjb250ZXh0KTsKKwkJaWYgKGNvbnRhaW5lckNvbXBvbmVudFR5cGUgPT0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpIHsKKwkJCXJldHVybiB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihWRkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJCX0KKwkJaWYgKGNvbnRhaW5lckNvbXBvbmVudFR5cGUgPT0gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSkgeworCQkJcmV0dXJuIHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKFNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMuY2xhc3MpOworCQl9CisJCWlmIChjb250YWluZXJDb21wb25lbnRUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpIHsKKwkJCXJldHVybiB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihQcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgSUVsZW1lbnREQU8gZ2V0RWxlbWVudERhbyhDbGFzczw/IGV4dGVuZHMgSUVsZW1lbnREQU8+IGNsYXp6LCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisKKwkJcmV0dXJuIHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKGNsYXp6KTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tcG9uZW50c1V0aWxzIGdldENvbXBvbmVudHNVdGlscygpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHRoaXMuc2VydmxldFJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCUNvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihDb21wb25lbnRzVXRpbHMuY2xhc3MpOworCQlyZXR1cm4gY29tcG9uZW50c1V0aWxzOworCX0KKworCS8qKgorCSAqIFVzZWQgdG8gc3VwcG9ydCBVbml0IFRlc3QuPGJyPgorCSAqIEhlYWRlciBQYXJhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gVW5pdCBUZXN0cworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGluaXRIZWFkZXJQYXJhbShTdHJpbmcgaGVhZGVyVmFsdWUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgaGVhZGVyTmFtZSkgeworCQlTdHJpbmcgcmV0VmFsdWU7CisJCWlmIChoZWFkZXJWYWx1ZSAhPSBudWxsKSB7CisJCQlyZXRWYWx1ZSA9IGhlYWRlclZhbHVlOworCQl9IGVsc2UgeworCQkJcmV0VmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihoZWFkZXJOYW1lKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsdWU7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50RGlzcG9zaXRpb25WYWx1ZShTdHJpbmcgYXJ0aWZhY3RGaWxlTmFtZSkgeworCQlyZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoImF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiIikuYXBwZW5kKGFydGlmYWN0RmlsZU5hbWUpLmFwcGVuZCgiXCIiKS50b1N0cmluZygpOworCX0KKworCXByb3RlY3RlZCBDb21wb25lbnRCdXNpbmVzc0xvZ2ljIGdldENvbXBvbmVudEJMKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCUNvbXBvbmVudEJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYzsKKwkJc3dpdGNoIChjb21wb25lbnRUeXBlRW51bSkgeworCQljYXNlIFJFU09VUkNFOiB7CisJCQlidXNpbmVzc0xvZ2ljID0gZ2V0UmVzb3VyY2VCTChjb250ZXh0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0VSVklDRTogeworCQkJYnVzaW5lc3NMb2dpYyA9IGdldFNlcnZpY2VCTChjb250ZXh0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUFJPRFVDVDogeworCQkJYnVzaW5lc3NMb2dpYyA9IGdldFByb2R1Y3RCTChjb250ZXh0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUkVTT1VSQ0VfSU5TVEFOQ0U6IHsKKwkJCWJ1c2luZXNzTG9naWMgPSBnZXRSZXNvdXJjZUJMKGNvbnRleHQpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJnZXRDb21wb25lbnRCTCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoImdldENvbXBvbmVudEJMIik7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGNvbXBvbmVudCB0eXBlOiIgKyBjb21wb25lbnRUeXBlRW51bS5nZXRWYWx1ZSgpKTsKKwkJfQorCQl9CisJCXJldHVybiBidXNpbmVzc0xvZ2ljOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9CZU1vbml0b3JpbmdTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQmVNb25pdG9yaW5nU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmY2Q5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQmVNb25pdG9yaW5nU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuRGlzdHJpYnV0aW9uTW9uaXRvcmluZ0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuTW9uaXRvcmluZ0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrV3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja0NvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja1N0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5tb25pdG9yaW5nLk1vbml0b3JpbmdFdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5UUkFDRSwgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi8iKQorQEFwaSh2YWx1ZSA9ICJCRSBNb25pdG9yaW5nIiwgZGVzY3JpcHRpb24gPSAiQkUgTW9uaXRvcmluZyIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQmVNb25pdG9yaW5nU2VydmxldCBleHRlbmRzIEJlR2VuZXJpY1NlcnZsZXQgeworCisJR3NvbiBwcmV0dHlHc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25maWdTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlAR0VUCisJQFBhdGgoIi9oZWFsdGhDaGVjayIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gInJldHVybiBhZ2dyZWdhdGUgQkUgaGVhbHRoIGNoZWNrIG9mIFRpdGFuLCBFUyBhbmQgQkUiLCBub3RlcyA9ICJyZXR1cm4gQkUgaGVhbHRoIGNoZWNrIiwgcmVzcG9uc2UgPSBTdHJpbmcuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiVGl0YW4sIEVTIGFuZCBCRSBhcmUgYWxsIHVwIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIk9uZSBvciBtb3JlIEJFIGNvbXBvbmVudHMgKFRpdGFuLCBFUywgQkUpIGFyZSBkb3duIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0SGVhbHRoQ2hlY2soQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJdHJ5IHsKKwkJCUhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYyBoZWFsdGhDaGVja0J1c2luZXNzTG9naWMgPSBnZXRIZWFsdGhDaGVja0JMKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJTGlzdDxIZWFsdGhDaGVja0luZm8+IGJlSGVhbHRoQ2hlY2tJbmZvcyA9IGhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYy5nZXRCZUhlYWx0aENoZWNrSW5mb3NTdGF0dXMoKTsKKworCQkJLy8gTGlzdDxIZWFsdGhDaGVja0luZm8+IGJlSGVhbHRoQ2hlY2tJbmZvcyA9CisJCQkvLyBIZWFsdGhDaGVja0J1c2luZXNzTG9naWMuZ2V0SW5zdGFuY2UoKS5nZXRCZUhlYWx0aENoZWNrSW5mb3MocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCQlBY3Rpb25TdGF0dXMgc3RhdHVzID0gZ2V0QWdncmVnYXRlQmVTdGF0dXMoYmVIZWFsdGhDaGVja0luZm9zKTsKKwkJCVN0cmluZyBzZGNWZXJzaW9uID0gZ2V0VmVyc2lvbkZyb21Db250ZXh0KHJlcXVlc3QpOworCQkJaWYgKHNkY1ZlcnNpb24gPT0gbnVsbCB8fCBzZGNWZXJzaW9uLmlzRW1wdHkoKSkgeworCQkJCXNkY1ZlcnNpb24gPSAiVU5LTk9XTiI7CisJCQl9CisJCQlTdHJpbmcgc2l0ZU1vZGUgPSBoZWFsdGhDaGVja0J1c2luZXNzTG9naWMuZ2V0U2l0ZU1vZGUoKTsKKwkJCUhlYWx0aENoZWNrV3JhcHBlciBoZWFsdGhDaGVjayA9IG5ldyBIZWFsdGhDaGVja1dyYXBwZXIoYmVIZWFsdGhDaGVja0luZm9zLCBzZGNWZXJzaW9uLCBzaXRlTW9kZSk7CisJCQkvLyBUaGUgcmVzcG9uc2UgY2FuIGJlIGVpdGhlciB3aXRoIDIwMCBvciA1MDAgYWdncmVnYXRlIHN0YXR1cyAtIHRoZQorCQkJLy8gYm9keSBvZiBpbmRpdmlkdWFsIHN0YXR1c2VzIGlzIHJldHVybmVkIGVpdGhlciB3YXkKKworCQkJU3RyaW5nIGhlYWx0aENoZWNrU3RyID0gcHJldHR5R3Nvbi50b0pzb24oaGVhbHRoQ2hlY2spOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChzdGF0dXMpLCBoZWFsdGhDaGVja1N0cik7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUhlYWx0aENoZWNrRXJyb3IsICJCZUhlYWx0aENoZWNrIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVIZWFsdGhDaGVja0Vycm9yKCJCZUhlYWx0aENoZWNrIik7CisJCQlsb2cuZGVidWcoIkJFIGhlYWx0aCBjaGVjayB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQFBPU1QKKwlAUGF0aCgiL21vbml0b3JpbmciKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJcHVibGljIFJlc3BvbnNlIHByb2Nlc3NNb25pdG9yaW5nTWV0cmljcyhAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGpzb24pIHsKKwkJdHJ5IHsKKwkJCU1vbml0b3JpbmdFdmVudCBtb25pdG9yaW5nRXZlbnQgPSBjb252ZXJ0Q29udGVudFRvSnNvbihqc29uLCBNb25pdG9yaW5nRXZlbnQuY2xhc3MpOworCQkJaWYgKG1vbml0b3JpbmdFdmVudCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdEFkZGl0aW9uYWxQcm9wZXJ0eShBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJfQorCQkJbG9nLnRyYWNlKCJSZWNlaXZlZCBtb25pdG9yaW5nIG1ldHJpY3M6IHt9IiwgbW9uaXRvcmluZ0V2ZW50LnRvU3RyaW5nKCkpOworCQkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCQlNb25pdG9yaW5nQnVzaW5lc3NMb2dpYyBibCA9IGdldE1vbml0b3JpbmdCTChjb250ZXh0KTsKKwkJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0ID0gYmwubG9nTW9uaXRvcmluZ0V2ZW50KG1vbml0b3JpbmdFdmVudCk7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIG51bGwpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkJFIHN5c3RlbSBtZXRyaWNzIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0QWRkaXRpb25hbFByb3BlcnR5KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi92ZXJzaW9uIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAicmV0dXJuIHRoZSBBU0RDIGFwcGxpY2F0aW9uIHZlcnNpb24iLCBub3RlcyA9ICJyZXR1cm4gdGhlIFNEQyBhcHBsaWNhdGlvbiB2ZXJzaW9uIiwgcmVzcG9uc2UgPSBTdHJpbmcuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAicmV0dXJuIFNEQyB2ZXJzaW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0U2RjVmVyc2lvbihAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQl0cnkgeworCQkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCQlTdHJpbmcgdmVyc2lvbiA9IGdldFZlcnNpb25Gcm9tQ29udGV4dChyZXF1ZXN0KTsKKwkJCWxvZy5kZWJ1Zygic2RjIHZlcnNpb24gZnJvbSBtYW5pZmVzdCBpczoge30iLCB2ZXJzaW9uKTsKKwkJCWlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi5pc0VtcHR5KCkpIHsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5TRENfVkVSU0lPTl9OT1RfRk9VTkQpKTsKKwkJCX0KKworCQkJSGVhbHRoQ2hlY2tJbmZvIHZlcnNpb25JbmZvID0gbmV3IEhlYWx0aENoZWNrSW5mbygpOworCQkJdmVyc2lvbkluZm8uc2V0VmVyc2lvbih2ZXJzaW9uKTsKKworCQkJLy8gVGhlIHJlc3BvbnNlIGNhbiBiZSBlaXRoZXIgd2l0aCAyMDAgb3IgNTAwIGFnZ3JlZ2F0ZSBzdGF0dXMgLSB0aGUKKwkJCS8vIGJvZHkgb2YgaW5kaXZpZHVhbCBzdGF0dXNlcyBpcyByZXR1cm5lZCBlaXRoZXIgd2F5CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHZlcnNpb25JbmZvKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImdldFNEQ1ZlcnNpb24iKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoImdldFNEQ1ZlcnNpb24iKTsKKwkJCWxvZy5kZWJ1ZygiQkUgZ2V0IFNEQyB2ZXJzaW9uIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRWZXJzaW9uRnJvbUNvbnRleHQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0RDX1JFTEVBU0VfVkVSU0lPTl9BVFRSKTsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJcHJpdmF0ZSBBY3Rpb25TdGF0dXMgZ2V0QWdncmVnYXRlQmVTdGF0dXMoTGlzdDxIZWFsdGhDaGVja0luZm8+IGJlSGVhbHRoQ2hlY2tJbmZvcykgeworCQlBY3Rpb25TdGF0dXMgc3RhdHVzID0gQWN0aW9uU3RhdHVzLk9LOworCQlmb3IgKEhlYWx0aENoZWNrSW5mbyBoZWFsdGhDaGVja0luZm8gOiBiZUhlYWx0aENoZWNrSW5mb3MpIHsKKwkJCWlmIChoZWFsdGhDaGVja0luZm8uZ2V0SGVhbHRoQ2hlY2tTdGF0dXMoKS5lcXVhbHMoSGVhbHRoQ2hlY2tTdGF0dXMuRE9XTikgJiYgaGVhbHRoQ2hlY2tJbmZvLmdldEhlYWx0aENoZWNrQ29tcG9uZW50KCkgIT0gSGVhbHRoQ2hlY2tDb21wb25lbnQuREUpIHsKKwkJCQlzdGF0dXMgPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXByb3RlY3RlZCBNb25pdG9yaW5nRXZlbnQgY29udmVydENvbnRlbnRUb0pzb24oU3RyaW5nIGNvbnRlbnQsIENsYXNzPE1vbml0b3JpbmdFdmVudD4gY2xhenopIHsKKworCQlNb25pdG9yaW5nRXZlbnQgb2JqZWN0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW9iamVjdCA9IGdzb24uZnJvbUpzb24oY29udGVudCwgY2xhenopOworCQkJb2JqZWN0LnNldEZpZWxkcyhudWxsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNvbnZlcnQgdGhlIGNvbnRlbnQge30gdG8gb2JqZWN0LiB7fSIsIGNvbnRlbnQuc3Vic3RyaW5nKDAsIE1hdGgubWluKDUwLCBjb250ZW50Lmxlbmd0aCgpKSksIGUpOworCQl9CisKKwkJcmV0dXJuIG9iamVjdDsKKwl9CisKKwlwcml2YXRlIEhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYyBnZXRIZWFsdGhDaGVja0JMKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCUhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYyBoZWFsdGhDaGVja0JsID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwkJcmV0dXJuIGhlYWx0aENoZWNrQmw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ29tcG9uZW50SW5zdGFuY2VTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ29tcG9uZW50SW5zdGFuY2VTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2ZDBiYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Db21wb25lbnRJbnN0YW5jZVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDc0NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Db21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm8uQ3JlYXRlQW5kQXNzb3RpYXRlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb24uUHJvcGVydHlDb25zdHJhaW50RGVzZXJpYWxpc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGk7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogUm9vdCByZXNvdXJjZSAoZXhwb3NlZCBhdCAiLyIgcGF0aCkKKyAqLworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NhdGFsb2ciKQorQEFwaSh2YWx1ZSA9ICJSZXNvdXJjZSBJbnN0YW5jZSBTZXJ2bGV0IiwgZGVzY3JpcHRpb24gPSAiUmVzb3VyY2UgSW5zdGFuY2UgU2VydmxldCIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2VTZXJ2bGV0IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uc1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudEluc3RhbmNlU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJVHlwZSBjb25zdHJhaW50VHlwZSA9IG5ldyBUeXBlVG9rZW48UHJvcGVydHlDb25zdHJhaW50PigpIHsKKwl9LmdldFR5cGUoKTsKKworCUdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnJlZ2lzdGVyVHlwZUFkYXB0ZXIoY29uc3RyYWludFR5cGUsIG5ldyBQcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXIoKSkuY3JlYXRlKCk7CisKKwlAUE9TVAorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBDb21wb25lbnRJbnN0YW5jZSIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgY3JlYXRlZCBDb21wb25lbnRJbnN0YW5jZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiQ29tcG9uZW50IGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJDb21wb25lbnQgaW5zdGFuY2UgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKEBBcGlQYXJhbSh2YWx1ZSA9ICJSSSBvYmplY3QgdG8gYmUgY3JlYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBQYXRoUGFyYW0oImNvbXBvbmVudElkIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gInZhbGlkIHZhbHVlczogcmVzb3VyY2VzIC8gc2VydmljZXMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FKSBAUGF0aFBhcmFtKCJjb250YWluZXJDb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIEBBcGlQYXJhbSh2YWx1ZSA9ICJVU0VSX0lEIG9mIG1vZGlmaWVyIHVzZXIiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyB1c2VySWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCXRyeSB7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gUmVwcmVzZW50YXRpb25VdGlscy5mcm9tUmVwcmVzZW50YXRpb24oZGF0YSwgQ29tcG9uZW50SW5zdGFuY2UuY2xhc3MpOworCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQlDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgY29tcG9uZW50SW5zdGFuY2VMb2dpYyA9IGdldENvbXBvbmVudEluc3RhbmNlQkwoY29udGV4dCwgY29tcG9uZW50VHlwZUVudW0pOworCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlTG9naWMgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiVW5zdXBwb3J0ZWQgY29tcG9uZW50IHR5cGUge30iLCBjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VTlNVUFBPUlRFRF9FUlJPUiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSkpOworCQkJfQorCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBjb21wb25lbnRJbnN0YW5jZUxvZ2ljLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGNvbnRhaW5lckNvbXBvbmVudElkLCB1c2VySWQsIGNvbXBvbmVudEluc3RhbmNlKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNSRUFURUQpLCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJDcmVhdGUgQ29tcG9uZW50IEluc3RhbmNlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJDcmVhdGUgQ29tcG9uZW50IEluc3RhbmNlIik7CisJCQlsb2cuZGVidWcoImNyZWF0ZSBjb21wb25lbnQgaW5zdGFuY2UgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAUE9TVAorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZS97Y29tcG9uZW50SW5zdGFuY2VJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJVcGRhdGUgcmVzb3VyY2UgaW5zdGFuY2UiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgcmVzb3VyY2UgaW5zdGFuY2UiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJlc291cmNlIGluc3RhbmNlIHVwZGF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBQYXRoUGFyYW0oImNvbXBvbmVudEluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIC8gcHJvZHVjdHMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FICsgIiwiCisJCQkJCSsgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVF9QQVJBTV9OQU1FKSBAUGF0aFBhcmFtKCJjb250YWluZXJDb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJdHJ5IHsKKworCQkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworCisJCQlieXRlW10gYnl0ZXMgPSBJT1V0aWxzLnRvQnl0ZUFycmF5KGlucHV0U3RyZWFtKTsKKworCQkJaWYgKGJ5dGVzID09IG51bGwgfHwgYnl0ZXMubGVuZ3RoID09IDApIHsKKwkJCQlsb2cuaW5mbygiRW1wdHkgYm9keSB3YXMgc2VudC4iKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJCX0KKworCQkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisKKwkJCVN0cmluZyBkYXRhID0gbmV3IFN0cmluZyhieXRlcyk7CisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBjb21wb25lbnRJbnN0YW5jZUxvZ2ljID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VCTChjb250ZXh0LCBjb21wb25lbnRUeXBlRW51bSk7CisJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VMb2dpYyA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJVbnN1cHBvcnRlZCBjb21wb25lbnQgdHlwZSB7fSIsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlVOU1VQUE9SVEVEX0VSUk9SLCBjb250YWluZXJDb21wb25lbnRUeXBlKSk7CisJCQl9CisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0UmVzcG9uc2UgPSBjb252ZXJ0VG9SZXNvdXJjZUluc3RhbmNlKGRhdGEpOworCisJCQlpZiAoY29udmVydFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiUmVzb3VyY2UgSW5zdGFuY2UgLSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlIik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIlJlc291cmNlIEluc3RhbmNlIC0gdXBkYXRlUmVzb3VyY2VJbnN0YW5jZSIpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNvbnZlcnQgcmVjZWl2ZWQgZGF0YSB0byBCRSBmb3JtYXQuIik7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShjb252ZXJ0UmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IGNvbnZlcnRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gY29tcG9uZW50SW5zdGFuY2VMb2dpYy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjb250YWluZXJDb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCwgY29tcG9uZW50SW5zdGFuY2VJZCwgdXNlcklkLCByZXNvdXJjZUluc3RhbmNlKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVXBkYXRlIFJlc291cmNlIEluc3RhbmNlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJVcGRhdGUgUmVzb3VyY2UgSW5zdGFuY2UiKTsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlIHJlc291cmNlIGluc3RhbmNlIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKworCX0KKworCS8vIFRPRE8gVGFsIE5ldyBNdWx0aXBsZSBJbnN0YW5jZSBBUEkKKwlAUE9TVAorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZS9tdWx0aXBsZUNvbXBvbmVudEluc3RhbmNlIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIHJlc291cmNlIGluc3RhbmNlIG11bHRpcGxlIGNvbXBvbmVudCIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgdXBkYXRlZCByZXNvdXJjZSBpbnN0YW5jZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgaW5zdGFuY2UgdXBkYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVNdWx0aXBsZUNvbXBvbmVudEluc3RhbmNlKEBQYXRoUGFyYW0oImNvbXBvbmVudElkIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudElkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gInZhbGlkIHZhbHVlczogcmVzb3VyY2VzIC8gc2VydmljZXMgLyBwcm9kdWN0cyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUgKyAiLCIgKyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUUgKyAiLCIKKwkJCQkJKyBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUX1BBUkFNX05BTUUpIEBQYXRoUGFyYW0oImNvbnRhaW5lckNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBAQXBpUGFyYW0odmFsdWUgPSAiQ29tcG9uZW50IEluc3RhbmNlIEpTT04gQXJyYXkiLCByZXF1aXJlZCA9IHRydWUpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUpzb25BcnJheSkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZUpzb25BcnJheSA9PSBudWxsIHx8IGNvbXBvbmVudEluc3RhbmNlSnNvbkFycmF5Lmxlbmd0aCgpID09IDApIHsKKwkJCQlsb2cuaW5mbygiRW1wdHkgSlNPTiBsaXN0IHdhcyBzZW50LiIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCkpOworCQkJfQorCisJCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKworCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQlDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgY29tcG9uZW50SW5zdGFuY2VMb2dpYyA9IGdldENvbXBvbmVudEluc3RhbmNlQkwoY29udGV4dCwgY29tcG9uZW50VHlwZUVudW0pOworCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlTG9naWMgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiVW5zdXBwb3J0ZWQgY29tcG9uZW50IHR5cGUge30iLCBjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VTlNVUFBPUlRFRF9FUlJPUiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSkpOworCQkJfQorCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0UmVzcG9uc2UgPSBjb252ZXJ0VG9NdWx0aXBsZVJlc291cmNlSW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2VKc29uQXJyYXkpOworCisJCQlpZiAoY29udmVydFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCS8vIFVzaW5nIGJvdGggRUNPTVAgZXJyb3IgbWV0aG9kcywgc2hvdyB0byBTb2ZlcgorCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJSZXNvdXJjZSBJbnN0YW5jZSAtIHVwZGF0ZVJlc291cmNlSW5zdGFuY2UiKTsKKwkJCQkvKgorCQkJCSAqIEJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvciggRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIlJlc291cmNlIEluc3RhbmNlIC0gdXBkYXRlUmVzb3VyY2VJbnN0YW5jZSIpOworCQkJCSAqLworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNvbnZlcnQgcmVjZWl2ZWQgZGF0YSB0byBCRSBmb3JtYXQuIik7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShjb252ZXJ0UmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VMaXN0ID0gY29udmVydFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGNvbXBvbmVudEluc3RhbmNlTG9naWMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY29udGFpbmVyQ29tcG9uZW50VHlwZSwgY29tcG9uZW50SWQsIHVzZXJJZCwgY29tcG9uZW50SW5zdGFuY2VMaXN0LCB0cnVlLCB0cnVlKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8qCisJCQkgKiBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoIEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIlVwZGF0ZSBSZXNvdXJjZSBJbnN0YW5jZSIgKTsKKwkJCSAqLworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiVXBkYXRlIFJlc291cmNlIEluc3RhbmNlIik7CisJCQlsb2cuZGVidWcoInVwZGF0ZSByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisKKwl9CisKKwlAREVMRVRFCisJQFBhdGgoIi97Y29udGFpbmVyQ29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9yZXNvdXJjZUluc3RhbmNlL3tyZXNvdXJjZUluc3RhbmNlSWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRGVsZXRlIFJlc291cmNlSW5zdGFuY2UiLCBodHRwTWV0aG9kID0gIkRFTEVURSIsIG5vdGVzID0gIlJldHVybnMgZGVsZXRlIHJlc291cmNlSW5zdGFuY2UiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlJlc291cmNlSW5zdGFuY2UgZGVsZXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBkZWxldGVSZXNvdXJjZUluc3RhbmNlKEBQYXRoUGFyYW0oImNvbXBvbmVudElkIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudElkLCBAUGF0aFBhcmFtKCJyZXNvdXJjZUluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gInZhbGlkIHZhbHVlczogcmVzb3VyY2VzIC8gc2VydmljZXMgLyBwcm9kdWN0cyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUgKyAiLCIgKyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUUgKyAiLCIKKwkJCQkJKyBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUX1BBUkFNX05BTUUpIEBQYXRoUGFyYW0oImNvbnRhaW5lckNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEluc3RhbmNlTG9naWMgPSBnZXRDb21wb25lbnRJbnN0YW5jZUJMKGNvbnRleHQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZUxvZ2ljID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlVuc3VwcG9ydGVkIGNvbXBvbmVudCB0eXBlIHt9IiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpKTsKKwkJCX0KKwkJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBjb21wb25lbnRJbnN0YW5jZUxvZ2ljLmRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkLCByZXNvdXJjZUluc3RhbmNlSWQsIHVzZXJJZCk7CisKKwkJCWlmIChhY3Rpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCksIG51bGwpOworCQkJfQorCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkRlbGV0ZSBSZXNvdXJjZSBJbnN0YW5jZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiRGVsZXRlIFJlc291cmNlIEluc3RhbmNlIik7CisJCQlsb2cuZGVidWcoImRlbGV0ZSByZXNvdXJjZSBpbnN0YW5jZSB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQEFwaVBhcmFtKHZhbHVlID0gImFsbG93ZWQgdmFsdWVzIGFyZSByZXNvdXJjZXMgL3NlcnZpY2VzIC8gcHJvZHVjdHMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVF9QQVJBTV9OQU1FLCByZXF1aXJlZCA9IHRydWUpCisJQFBPU1QKKwlAUGF0aCgiL3tjb250YWluZXJDb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L3Jlc291cmNlSW5zdGFuY2UvYXNzb2NpYXRlIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQXNzb2NpYXRlIFJJIHRvIFJJIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIFJlbGF0aW9uc2hpcEluZm8iLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlJlbGF0aW9uc2hpcCBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIk1pc3NpbmcgaW5mb3JtYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJSZWxhdGlvbnNoaXAgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGFzc29jaWF0ZVJJVG9SSShAQXBpUGFyYW0odmFsdWUgPSAidW5pcXVlIGlkIG9mIHRoZSBjb250YWluZXIgY29tcG9uZW50IikgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAiYWxsb3dlZCB2YWx1ZXMgYXJlIHJlc291cmNlcyAvc2VydmljZXMgLyBwcm9kdWN0cyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUgKyAiLCIgKyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUUgKyAiLCIKKwkJCQkJKyBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUX1BBUkFNX05BTUUsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgiY29udGFpbmVyQ29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb250YWluZXJDb21wb25lbnRUeXBlLAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLCBAQXBpUGFyYW0odmFsdWUgPSAiUmVsYXRpb25zaGlwSW5mbyIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEluc3RhbmNlTG9naWMgPSBnZXRDb21wb25lbnRJbnN0YW5jZUJMKGNvbnRleHQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZUxvZ2ljID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlVuc3VwcG9ydGVkIGNvbXBvbmVudCB0eXBlIHt9IiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpKTsKKwkJCX0KKworCQkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgUmVzcG9uc2VGb3JtYXQ+IHJlZ0luZm9XID0gY29udmVydFRvUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKGRhdGEpOworCisJCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBSZXNwb25zZUZvcm1hdD4gcmVzdWx0T3A7CisJCQlpZiAocmVnSW5mb1cuaXNSaWdodCgpKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJSZXNvdXJjZSBJbnN0YW5jZSAtIGFzc29jaWF0ZVJJVG9SSSIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJSZXNvdXJjZSBJbnN0YW5jZSAtIGFzc29jaWF0ZVJJVG9SSSIpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNvbnZlcnQgcmVjZWl2ZWQgZGF0YSB0byBCRSBmb3JtYXQuIik7CisJCQkJcmVzdWx0T3AgPSBFaXRoZXIucmlnaHQocmVnSW5mb1cucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gcmVnSW5mb1cubGVmdCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0T3AgPSBjb21wb25lbnRJbnN0YW5jZUxvZ2ljLmFzc29jaWF0ZVJJVG9SSShjb21wb25lbnRJZCwgdXNlcklkLCByZXF1aXJlbWVudERlZiwgY29tcG9uZW50VHlwZUVudW0pOworCQkJfQorCisJCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSByZXN1bHRPcDsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9IGVsc2UgeworCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkFzc29jaWF0ZSBSZXNvdXJjZSBJbnN0YW5jZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiQXNzb2NpYXRlIFJlc291cmNlIEluc3RhbmNlIik7CisJCQlsb2cuZGVidWcoImFzc29jaWF0ZSByZXNvdXJjZSBpbnN0YW5jZSB0byBhbm90aGVyIFJJIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAUFVUCisJQFBhdGgoIi97Y29udGFpbmVyQ29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9yZXNvdXJjZUluc3RhbmNlL2Rpc3NvY2lhdGUiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJEaXNzb2NpYXRlIFJJIGZyb20gUkkiLCBodHRwTWV0aG9kID0gIlBVVCIsIG5vdGVzID0gIlJldHVybnMgZGVsZXRlZCBSZWxhdGlvbnNoaXBJbmZvIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJSZWxhdGlvbnNoaXAgZGVsZXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJNaXNzaW5nIGluZm9ybWF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRpc3NvY2lhdGVSSUZyb21SSSgKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJhbGxvd2VkIHZhbHVlcyBhcmUgcmVzb3VyY2VzIC9zZXJ2aWNlcyAvIHByb2R1Y3RzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSArICIsIgorCQkJCQkrIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1RfUEFSQU1fTkFNRSwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJjb250YWluZXJDb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAidW5pcXVlIGlkIG9mIHRoZSBjb250YWluZXIgY29tcG9uZW50IikgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCwgQEFwaVBhcmFtKHZhbHVlID0gIlJlbGF0aW9uc2hpcEluZm8iLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLAorCQkJQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJdHJ5IHsKKworCQkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEluc3RhbmNlTG9naWMgPSBnZXRDb21wb25lbnRJbnN0YW5jZUJMKGNvbnRleHQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZUxvZ2ljID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlVuc3VwcG9ydGVkIGNvbXBvbmVudCB0eXBlIHt9IiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpKTsKKwkJCX0KKworCQkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgUmVzcG9uc2VGb3JtYXQ+IHJlZ0luZm9XID0gY29udmVydFRvUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKGRhdGEpOworCQkJaWYgKHJlZ0luZm9XLmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiUmVzb3VyY2UgSW5zdGFuY2UgLSBkaXNzb2NpYXRlUklGcm9tUkkiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigiUmVzb3VyY2UgSW5zdGFuY2UgLSBkaXNzb2NpYXRlUklGcm9tUkkiKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjb252ZXJ0IHJlY2VpdmVkIGRhdGEgdG8gQkUgZm9ybWF0LiIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVnSW5mb1cucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmID0gcmVnSW5mb1cubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBjb21wb25lbnRJbnN0YW5jZUxvZ2ljLmRpc3NvY2lhdGVSSUZyb21SSShjb21wb25lbnRJZCwgdXNlcklkLCByZXF1aXJlbWVudERlZiwgY29tcG9uZW50VHlwZUVudW0pOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJEaXNzb2NpYXRlIFJlc291cmNlIEluc3RhbmNlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJEaXNzb2NpYXRlIFJlc291cmNlIEluc3RhbmNlIik7CisJCQlsb2cuZGVidWcoImRpc3NvY2lhdGUgcmVzb3VyY2UgaW5zdGFuY2UgZnJvbSBzZXJ2aWNlIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQFBPU1QKKwlAUGF0aCgiL3tjb250YWluZXJDb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L3Jlc291cmNlSW5zdGFuY2UvY3JlYXRlQW5kQXNzb2NpYXRlIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIFJJIGFuZCBhc3NvY2lhdGUgUkkgdG8gUkkiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgUkkgYW5kIFJlbGF0aW9uc2hpcEluZm8iLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlJJIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJSZWxhdGlvbnNoaXAgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZUFuZEFzc29jaWF0ZVJJVG9SSShAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSkgQFBhdGhQYXJhbSgiY29udGFpbmVyQ29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb250YWluZXJDb21wb25lbnRUeXBlLAorCQkJQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCXRyeSB7CisKKwkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKKworCQkJYnl0ZVtdIGJ5dGVzID0gSU9VdGlscy50b0J5dGVBcnJheShpbnB1dFN0cmVhbSk7CisKKwkJCWlmIChieXRlcyA9PSBudWxsIHx8IGJ5dGVzLmxlbmd0aCA9PSAwKSB7CisJCQkJbG9nLmluZm8oIkVtcHR5IGJvZHkgd2FzIHNlbnQuIik7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCQl9CisKKwkJCVN0cmluZyB1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCisJCQlTdHJpbmcgZGF0YSA9IG5ldyBTdHJpbmcoYnl0ZXMpOworCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBjb21wb25lbnRJbnN0YW5jZUxvZ2ljID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VCTChjb250ZXh0LCBjb21wb25lbnRUeXBlRW51bSk7CisJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VMb2dpYyA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJVbnN1cHBvcnRlZCBjb21wb25lbnQgdHlwZSB7fSIsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlVOU1VQUE9SVEVEX0VSUk9SLCBjb250YWluZXJDb21wb25lbnRUeXBlKSk7CisJCQl9CisKKwkJCUVpdGhlcjxDcmVhdGVBbmRBc3NvdGlhdGVJbmZvLCBBY3Rpb25TdGF0dXM+IGNvbnZlcnRTdGF0dXMgPSBjb252ZXJ0SnNvblRvT2JqZWN0KGRhdGEsIENyZWF0ZUFuZEFzc290aWF0ZUluZm8uY2xhc3MpOworCQkJaWYgKGNvbnZlcnRTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJSZXNvdXJjZSBJbnN0YW5jZSAtIGNyZWF0ZUFuZEFzc29jaWF0ZVJJVG9SSSIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJSZXNvdXJjZSBJbnN0YW5jZSAtIGNyZWF0ZUFuZEFzc29jaWF0ZVJJVG9SSSIpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNvbnZlcnQgcmVjZWl2ZWQgZGF0YSB0byBCRSBmb3JtYXQuIik7CisJCQkJRWl0aGVyPE9iamVjdCwgUmVzcG9uc2VGb3JtYXQ+IGZvcm1hdHRlZFJlc3BvbnNlID0gRWl0aGVyLnJpZ2h0KGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KGNvbnZlcnRTdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShmb3JtYXR0ZWRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlDcmVhdGVBbmRBc3NvdGlhdGVJbmZvIGNyZWF0ZUFuZEFzc290aWF0ZUluZm8gPSBjb252ZXJ0U3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJRWl0aGVyPENyZWF0ZUFuZEFzc290aWF0ZUluZm8sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGNvbXBvbmVudEluc3RhbmNlTG9naWMuY3JlYXRlQW5kQXNzb2NpYXRlUklUb1JJKGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkLCB1c2VySWQsIGNyZWF0ZUFuZEFzc290aWF0ZUluZm8pOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1JFQVRFRCksIGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJDcmVhdGUgYW5kIEFzc29jaWF0ZSBSZXNvdXJjZSBJbnN0YW5jZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiQ3JlYXRlIGFuZCBBc3NvY2lhdGUgUmVzb3VyY2UgSW5zdGFuY2UiKTsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlIGFuZCBhc3NvY2lhdGUgUkkgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAUE9TVAorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZS97Y29tcG9uZW50SW5zdGFuY2VJZH0vcHJvcGVydHkiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJVcGRhdGUgcmVzb3VyY2UgaW5zdGFuY2UgcHJvcGVydHkiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgcmVzb3VyY2UgaW5zdGFuY2UgcHJvcGVydHkiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlJlc291cmNlIGluc3RhbmNlIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KEBBcGlQYXJhbSh2YWx1ZSA9ICJzZXJ2aWNlIGlkIikgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAidmFsaWQgdmFsdWVzOiByZXNvdXJjZXMgLyBzZXJ2aWNlcyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUgKyAiLCIgKyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUUpIEBQYXRoUGFyYW0oImNvbnRhaW5lckNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJyZXNvdXJjZSBpbnN0YW5jZSBpZCIpIEBQYXRoUGFyYW0oImNvbXBvbmVudEluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwgQEFwaVBhcmFtKHZhbHVlID0gImlkIG9mIHVzZXIgaW5pdGlhdGluZyB0aGUgb3BlcmF0aW9uIikgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLAorCQkJQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQl0cnkgeworCQkJV3JhcHBlcjxTdHJpbmc+IGRhdGFXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQkJV3JhcHBlcjxSZXNwb25zZUZvcm1hdD4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQkJV3JhcHBlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0eVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisKKwkJCXZhbGlkYXRlSW5wdXRTdHJlYW0ocmVxdWVzdCwgZGF0YVdyYXBwZXIsIGVycm9yV3JhcHBlcik7CisKKwkJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJdmFsaWRhdGVDbGFzc1BhcnNlKGRhdGFXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCBwcm9wZXJ0eVdyYXBwZXIsICgpIC0+IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuY2xhc3MsIGVycm9yV3JhcHBlcik7CisJCQl9CisKKwkJCWlmICghZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJCX0KKworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eSA9IHByb3BlcnR5V3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKworCQkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB1cGRhdGVSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuIFJlY2VpdmVkIHByb3BlcnR5IGlzIHt9IiwgcHJvcGVydHkpOworCisJCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQlDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMgY29tcG9uZW50SW5zdGFuY2VMb2dpYyA9IGdldENvbXBvbmVudEluc3RhbmNlQkwoY29udGV4dCwgY29tcG9uZW50VHlwZUVudW0pOworCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlTG9naWMgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiVW5zdXBwb3J0ZWQgY29tcG9uZW50IHR5cGUge30iLCBjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VTlNVUFBPUlRFRF9FUlJPUiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSkpOworCQkJfQorCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gY29tcG9uZW50SW5zdGFuY2VMb2dpYy5jcmVhdGVPclVwZGF0ZVByb3BlcnR5VmFsdWUoY29tcG9uZW50VHlwZUVudW0sIGNvbXBvbmVudElkLCBjb21wb25lbnRJbnN0YW5jZUlkLCBwcm9wZXJ0eSwgdXNlcklkKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgPSBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCQlTdHJpbmcgcmVzdWx0ID0gbWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoImNyZWF0ZSBhbmQgYXNzb2NpYXRlIFJJIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiwgZS5nZXRNZXNzYWdlKCkpOworCQkJbG9nLmRlYnVnKCJjcmVhdGUgYW5kIGFzc29jaWF0ZSBSSSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCisJfQorCisJLyoqCisJICogVXBkYXRlcyBSZXNvdXJjZUluc3RhbmNlIEF0dHJpYnV0ZQorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqIEBwYXJhbSBjb250YWluZXJDb21wb25lbnRUeXBlCisJICogQHBhcmFtIGNvbXBvbmVudEluc3RhbmNlSWQKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcmV0dXJuCisJICovCisJQFBPU1QKKwlAUGF0aCgiL3tjb250YWluZXJDb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L3Jlc291cmNlSW5zdGFuY2Uve2NvbXBvbmVudEluc3RhbmNlSWR9L2F0dHJpYnV0ZSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlVwZGF0ZSByZXNvdXJjZSBpbnN0YW5jZSBhdHRyaWJ1dGUiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgcmVzb3VyY2UgaW5zdGFuY2UgYXR0cmlidXRlIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJSZXNvdXJjZSBpbnN0YW5jZSBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUoQEFwaVBhcmFtKHZhbHVlID0gInNlcnZpY2UgaWQiKSBAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZCB2YWx1ZXM6IHJlc291cmNlcyAvIHNlcnZpY2VzIiwgYWxsb3dhYmxlVmFsdWVzID0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSArICIsIiArIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0VfUEFSQU1fTkFNRSkgQFBhdGhQYXJhbSgiY29udGFpbmVyQ29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb250YWluZXJDb21wb25lbnRUeXBlLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gInJlc291cmNlIGluc3RhbmNlIGlkIikgQFBhdGhQYXJhbSgiY29tcG9uZW50SW5zdGFuY2VJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBAQXBpUGFyYW0odmFsdWUgPSAiaWQgb2YgdXNlciBpbml0aWF0aW5nIHRoZSBvcGVyYXRpb24iKSBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCXRyeSB7CisKKwkJCVdyYXBwZXI8UmVzcG9uc2VGb3JtYXQ+IGVycm9yV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJCVdyYXBwZXI8U3RyaW5nPiBkYXRhV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJCVdyYXBwZXI8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+IGF0dHJpYnV0ZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCQlXcmFwcGVyPENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYz4gYmxXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCisJCQl2YWxpZGF0ZUlucHV0U3RyZWFtKHJlcXVlc3QsIGRhdGFXcmFwcGVyLCBlcnJvcldyYXBwZXIpOworCisJCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCXZhbGlkYXRlQ2xhc3NQYXJzZShkYXRhV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgYXR0cmlidXRlV3JhcHBlciwgKCkgLT4gQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUuY2xhc3MsIGVycm9yV3JhcHBlcik7CisJCQl9CisKKwkJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJdmFsaWRhdGVDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMocmVxdWVzdCwgY29udGFpbmVyQ29tcG9uZW50VHlwZSwgYmxXcmFwcGVyLCBlcnJvcldyYXBwZXIpOworCQkJfQorCisJCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBjb21wb25lbnRJbnN0YW5jZUxvZ2ljID0gYmxXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2YgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUuIFJlY2VpdmVkIGF0dHJpYnV0ZSBpcyB7fSIsIGF0dHJpYnV0ZVdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlckF0dHJpYnV0ZSA9IGNvbXBvbmVudEluc3RhbmNlTG9naWMuY3JlYXRlT3JVcGRhdGVBdHRyaWJ1dGVWYWx1ZShjb21wb25lbnRUeXBlRW51bSwgY29tcG9uZW50SWQsIGNvbXBvbmVudEluc3RhbmNlSWQsIGF0dHJpYnV0ZVdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHVzZXJJZCk7CisJCQkJaWYgKGVpdGhlckF0dHJpYnV0ZS5pc1JpZ2h0KCkpIHsKKwkJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChlaXRoZXJBdHRyaWJ1dGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhdHRyaWJ1dGVXcmFwcGVyLnNldElubmVyRWxlbWVudChlaXRoZXJBdHRyaWJ1dGUubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGJ1aWxkUmVzcG9uc2VGcm9tRWxlbWVudChlcnJvcldyYXBwZXIsIGF0dHJpYnV0ZVdyYXBwZXIpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoImNyZWF0ZSBhbmQgYXNzb2NpYXRlIFJJIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiwgZS5nZXRNZXNzYWdlKCkpOworCQkJbG9nLmRlYnVnKCJjcmVhdGUgYW5kIGFzc29jaWF0ZSBSSSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCisJfQorCisJQERFTEVURQorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZS97Y29tcG9uZW50SW5zdGFuY2VJZH0vcHJvcGVydHkve3Byb3BlcnR5SWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIHJlc291cmNlIGluc3RhbmNlIiwgaHR0cE1ldGhvZCA9ICJERUxFVEUiLCBub3RlcyA9ICJSZXR1cm5zIGRlbGV0ZWQgcmVzb3VyY2UgaW5zdGFuY2UgcHJvcGVydHkiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlJlc291cmNlIGluc3RhbmNlIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KEBBcGlQYXJhbSh2YWx1ZSA9ICJzZXJ2aWNlIGlkIikgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAidmFsaWQgdmFsdWVzOiByZXNvdXJjZXMgLyBzZXJ2aWNlcyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUgKyAiLCIgKyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUUpIEBQYXRoUGFyYW0oImNvbnRhaW5lckNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJyZXNvdXJjZSBpbnN0YW5jZSBpZCIpIEBQYXRoUGFyYW0oImNvbXBvbmVudEluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwgQEFwaVBhcmFtKHZhbHVlID0gInByb3BlcnR5IGlkIikgQFBhdGhQYXJhbSgicHJvcGVydHlJZCIpIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gImlkIG9mIHVzZXIgaW5pdGlhdGluZyB0aGUgb3BlcmF0aW9uIikgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQl0cnkgeworCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBjb21wb25lbnRJbnN0YW5jZUxvZ2ljID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VCTChjb250ZXh0LCBjb21wb25lbnRUeXBlRW51bSk7CisJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VMb2dpYyA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJVbnN1cHBvcnRlZCBjb21wb25lbnQgdHlwZSB7fSIsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlVOU1VQUE9SVEVEX0VSUk9SLCBjb250YWluZXJDb21wb25lbnRUeXBlKSk7CisJCQl9CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBjb21wb25lbnRJbnN0YW5jZUxvZ2ljLmRlbGV0ZVByb3BlcnR5VmFsdWUoY29tcG9uZW50VHlwZUVudW0sIGNvbXBvbmVudElkLCBjb21wb25lbnRJbnN0YW5jZUlkLCBwcm9wZXJ0eUlkLCB1c2VySWQpOworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PX0NPTlRFTlQpLCBudWxsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiY3JlYXRlIGFuZCBhc3NvY2lhdGUgUkkgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiLCBlLmdldE1lc3NhZ2UoKSk7CisJCQlsb2cuZGVidWcoImNyZWF0ZSBhbmQgYXNzb2NpYXRlIFJJIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisKKwl9CisKKwlAUE9TVAorCUBQYXRoKCIve2NvbnRhaW5lckNvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vcmVzb3VyY2VJbnN0YW5jZS97Y29tcG9uZW50SW5zdGFuY2VJZH0vY2hhbmdlVmVyc2lvbiIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlVwZGF0ZSByZXNvdXJjZSBpbnN0YW5jZSIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgdXBkYXRlZCByZXNvdXJjZSBpbnN0YW5jZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgaW5zdGFuY2UgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBjaGFuZ2VSZXNvdXJjZUluc3RhbmNlVmVyc2lvbihAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwgQFBhdGhQYXJhbSgiY29tcG9uZW50SW5zdGFuY2VJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gInZhbGlkIHZhbHVlczogcmVzb3VyY2VzIC8gc2VydmljZXMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FKSBAUGF0aFBhcmFtKCJjb250YWluZXJDb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJdHJ5IHsKKworCQkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworCisJCQlieXRlW10gYnl0ZXMgPSBJT1V0aWxzLnRvQnl0ZUFycmF5KGlucHV0U3RyZWFtKTsKKworCQkJaWYgKGJ5dGVzID09IG51bGwgfHwgYnl0ZXMubGVuZ3RoID09IDApIHsKKwkJCQlsb2cuaW5mbygiRW1wdHkgYm9keSB3YXMgc2VudC4iKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJCX0KKworCQkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisKKwkJCVN0cmluZyBkYXRhID0gbmV3IFN0cmluZyhieXRlcyk7CisKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbnRhaW5lckNvbXBvbmVudFR5cGUpOworCQkJQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIGNvbXBvbmVudEluc3RhbmNlTG9naWMgPSBnZXRDb21wb25lbnRJbnN0YW5jZUJMKGNvbnRleHQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZUxvZ2ljID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlVuc3VwcG9ydGVkIGNvbXBvbmVudCB0eXBlIHt9IiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuVU5TVVBQT1JURURfRVJST1IsIGNvbnRhaW5lckNvbXBvbmVudFR5cGUpKTsKKwkJCX0KKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gY29udmVydFJlc3BvbnNlID0gY29udmVydFRvUmVzb3VyY2VJbnN0YW5jZShkYXRhKTsKKworCQkJaWYgKGNvbnZlcnRSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIlJlc291cmNlIEluc3RhbmNlIC0gdXBkYXRlUmVzb3VyY2VJbnN0YW5jZSIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJSZXNvdXJjZSBJbnN0YW5jZSAtIHVwZGF0ZVJlc291cmNlSW5zdGFuY2UiKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjb252ZXJ0IHJlY2VpdmVkIGRhdGEgdG8gQkUgZm9ybWF0LiIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoY29udmVydFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIG5ld1Jlc291cmNlSW5zdGFuY2UgPSBjb252ZXJ0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGNvbXBvbmVudEluc3RhbmNlTG9naWMuY2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uKGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkLCBjb21wb25lbnRJbnN0YW5jZUlkLCB1c2VySWQsIG5ld1Jlc291cmNlSW5zdGFuY2UpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJVcGRhdGUgUmVzb3VyY2UgSW5zdGFuY2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIlVwZGF0ZSBSZXNvdXJjZSBJbnN0YW5jZSIpOworCQkJbG9nLmRlYnVnKCJ1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2Ugd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0VG9SZXNvdXJjZUluc3RhbmNlKFN0cmluZyBkYXRhKSB7CisKKwkJLy8gRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBBY3Rpb25TdGF0dXM+IGNvbnZlcnRTdGF0dXMgPQorCQkvLyBjb252ZXJ0SnNvblRvT2JqZWN0KGRhdGEsIENvbXBvbmVudEluc3RhbmNlLmNsYXNzKTsKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBSZXNwb25zZUZvcm1hdD4gY29udmVydFN0YXR1cyA9IGdldENvbXBvbmVudHNVdGlscygpLmNvbnZlcnRKc29uVG9PYmplY3RVc2luZ09iamVjdE1hcHBlcihkYXRhLCBuZXcgVXNlcigpLCBDb21wb25lbnRJbnN0YW5jZS5jbGFzcywgbnVsbCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfSU5TVEFOQ0UpOworCQlpZiAoY29udmVydFN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29udmVydFN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2VJbmZvID0gY29udmVydFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VJbnN0YW5jZUluZm8pOworCX0KKworCS8vIFRPRE8gVGFsIE5ldyBBUEkgZm9yIE11bHRpcGxlIEl0ZW1zIG1vdmUgb24gY2FudmFzCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0VG9NdWx0aXBsZVJlc291cmNlSW5zdGFuY2UoU3RyaW5nIGRhdGFMaXN0KSB7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlW10sIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0U3RhdHVzID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuY29udmVydEpzb25Ub09iamVjdFVzaW5nT2JqZWN0TWFwcGVyKGRhdGFMaXN0LCBuZXcgVXNlcigpLCBDb21wb25lbnRJbnN0YW5jZVtdLmNsYXNzLCBudWxsLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9JTlNUQU5DRSk7CisJCWlmIChjb252ZXJ0U3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb252ZXJ0U3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoQXJyYXlzLmFzTGlzdChjb252ZXJ0U3RhdHVzLmxlZnQoKS52YWx1ZSgpKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBSZXNwb25zZUZvcm1hdD4gY29udmVydFRvUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKFN0cmluZyBkYXRhKSB7CisKKwkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgQWN0aW9uU3RhdHVzPiBjb252ZXJ0U3RhdHVzID0gY29udmVydEpzb25Ub09iamVjdChkYXRhLCBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuY2xhc3MpOworCQlpZiAoY29udmVydFN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoY29udmVydFN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmID0gY29udmVydFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZik7CisJfQorCisJcHJpdmF0ZSA8VD4gRWl0aGVyPFQsIEFjdGlvblN0YXR1cz4gY29udmVydEpzb25Ub09iamVjdChTdHJpbmcgZGF0YSwgQ2xhc3M8VD4gY2xhenopIHsKKwkJdHJ5IHsKKwkJCWxvZy50cmFjZSgiY29udmVydCBqc29uIHRvIG9iamVjdC4ganNvbj1cbnt9IiwgZGF0YSk7CisJCQlUIHQgPSBudWxsOworCQkJdCA9IGdzb24uZnJvbUpzb24oZGF0YSwgY2xhenopOworCQkJaWYgKHQgPT0gbnVsbCkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUludmFsaWRKc29uSW5wdXQsICJjb252ZXJ0SnNvblRvT2JqZWN0Iik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJCWxvZy5kZWJ1Zygib2JqZWN0IGlzIG51bGwgYWZ0ZXIgY29udmVydGluZyBmcm9tIGpzb24iKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gSU5WQUxJRCBKU09OCisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVJbnZhbGlkSnNvbklucHV0LCAiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY29udmVydCBmcm9tIGpzb24iLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ29tcG9uZW50U2VydmxldC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0NvbXBvbmVudFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJlYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0NvbXBvbmVudFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ29tcG9uZW50QnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwuYXBpLkhpZ2hlc3RGaWx0ZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBSZXFEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVBhcmFtOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2U7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZXM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NhdGFsb2ciKQorQEFwaSh2YWx1ZSA9ICJDb21wb25lbnQgU2VydmxldCIsIGRlc2NyaXB0aW9uID0gIkNvbXBvbmVudCBTZXJ2bGV0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBDb21wb25lbnRTZXJ2bGV0IGV4dGVuZHMgQmVHZW5lcmljU2VydmxldCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudFNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBHRVQKKwlAUGF0aCgiL3tjb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L3JlcXVpcm1lbnRzQ2FwYWJpbGl0aWVzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiR2V0IENvbXBvbmVudCBSZXF1aXJtZW50cyBBbmQgQ2FwYWJpbGl0aWVzIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIFJlcXVpcm1lbnRzIEFuZCBDYXBhYmlsaXRpZXMgYWNjb3JkaW5nIHRvIGNvbXBvbmVudElkIiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJDb21wb25lbnQgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQ29tcG9uZW50IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldFJlcXVpcmVtZW50QW5kQ2FwYWJpbGl0aWVzKEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisJCVJlc3BvbnNlIHJlc3BvbnNlOworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb21wb25lbnRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudFR5cGVFbnVtICE9IG51bGwpIHsKKwkJCUNvbXBvbmVudEJ1c2luZXNzTG9naWMgY29tcEJMID0gZ2V0Q29tcG9uZW50QkwoY29tcG9uZW50VHlwZUVudW0sIGNvbnRleHQpOworCQkJRWl0aGVyPENhcFJlcURlZiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlcXVpcmVtZW50c0FuZENhcGFiaWxpdGllcyA9IGNvbXBCTC5nZXRSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXMoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLCB1c2VySWQpOworCQkJaWYgKGVpdGhlclJlcXVpcmVtZW50c0FuZENhcGFiaWxpdGllcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShlaXRoZXJSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgZ3Nvbi50b0pzb24oZWl0aGVyUmVxdWlyZW1lbnRzQW5kQ2FwYWJpbGl0aWVzLmxlZnQoKS52YWx1ZSgpKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCX0KKworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJQEdFVAorCUBQYXRoKCIve2NvbXBvbmVudFR5cGV9L2xhdGVzdHZlcnNpb24vbm90YWJzdHJhY3QiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJHZXQgQ29tcG9uZW50IFJlcXVpcm1lbnRzIEFuZCBDYXBhYmlsaXRpZXMiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgUmVxdWlybWVudHMgQW5kIENhcGFiaWxpdGllcyBhY2NvcmRpbmcgdG8gY29tcG9uZW50SWQiLCByZXNwb25zZSA9IFJlc291cmNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkNvbXBvbmVudCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJDb21wb25lbnQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0TGF0ZXN0VmVyc2lvbk5vdEFic3RyYWN0Q2hlY2tvdXRDb21wb25lbnRzKEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBRdWVyeVBhcmFtKCJpbnRlcm5hbENvbXBvbmVudFR5cGUiKSBTdHJpbmcgaW50ZXJuYWxDb21wb25lbnRUeXBlLAorCQkJQFF1ZXJ5UGFyYW0oImNvbXBvbmVudFVpZHMiKSBMaXN0PFN0cmluZz4gY29tcG9uZW50VWlkcywgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCIoZ2V0KSBTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb21wb25lbnRUeXBlKTsKKwkJCUNvbXBvbmVudEJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldENvbXBvbmVudEJMKGNvbXBvbmVudFR5cGVFbnVtLCBjb250ZXh0KTsKKworCQkJbG9nLmRlYnVnKCJSZWNlaXZlZCBjb21wb25lbnRVaWRzIHNpemUgaXMge30iLCAoY29tcG9uZW50VWlkcyA9PSBudWxsID8gMCA6IGNvbXBvbmVudFVpZHMuc2l6ZSgpKSk7CisKKwkJCUVpdGhlcjxMaXN0PENvbXBvbmVudD4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0TGF0ZXN0VmVyc2lvbk5vdEFic3RyYWN0Q29tcG9uZW50cyhmYWxzZSwgSGlnaGVzdEZpbHRlckVudW0uSElHSEVTVF9PTkxZLCBjb21wb25lbnRUeXBlRW51bSwgaW50ZXJuYWxDb21wb25lbnRUeXBlLCBjb21wb25lbnRVaWRzLCB1c2VySWQpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGFsbCBub24gYWJzdHJhY3Qge30iLCBjb21wb25lbnRUeXBlKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlPYmplY3QgY29tcG9uZW50cyA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGNvbXBvbmVudHMpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IENlcnRpZmllZCBOb24gQWJzdHJhY3QiICsgY29tcG9uZW50VHlwZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgQ2VydGlmaWVkIE5vbiBBYnN0cmFjdCIgKyBjb21wb25lbnRUeXBlKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0Q2VydGlmaWVkTm90QWJzdHJhY3RDb21wb25lbnRzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisKKwl9CisKKwlAUE9TVAorCUBQYXRoKCIve2NvbXBvbmVudFR5cGV9L2xhdGVzdHZlcnNpb24vbm90YWJzdHJhY3QiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJHZXQgQ29tcG9uZW50IFJlcXVpcm1lbnRzIEFuZCBDYXBhYmlsaXRpZXMiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgUmVxdWlybWVudHMgQW5kIENhcGFiaWxpdGllcyBhY2NvcmRpbmcgdG8gY29tcG9uZW50SWQiLCByZXNwb25zZSA9IFJlc291cmNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkNvbXBvbmVudCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJDb21wb25lbnQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0TGF0ZXN0VmVyc2lvbk5vdEFic3RyYWN0Q2hlY2tvdXRDb21wb25lbnRzQnlCb2R5KEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBRdWVyeVBhcmFtKCJpbnRlcm5hbENvbXBvbmVudFR5cGUiKSBTdHJpbmcgaW50ZXJuYWxDb21wb25lbnRUeXBlLAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLCBAQXBpUGFyYW0odmFsdWUgPSAiQ29uc3VtZXIgT2JqZWN0IHRvIGJlIGNyZWF0ZWQiLCByZXF1aXJlZCA9IHRydWUpIExpc3Q8U3RyaW5nPiBkYXRhKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJbG9nLmRlYnVnKCIoZ2V0KSBTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb21wb25lbnRUeXBlKTsKKwkJCUNvbXBvbmVudEJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldENvbXBvbmVudEJMKGNvbXBvbmVudFR5cGVFbnVtLCBjb250ZXh0KTsKKwkJCUxpc3Q8U3RyaW5nPiBjb21wb25lbnRVaWRzID0gZGF0YTsKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCQlsb2cuZGVidWcoIlJlY2VpdmVkIGNvbXBvbmVudFVpZHMgc2l6ZSBpcyB7fSIsIChjb21wb25lbnRVaWRzID09IG51bGwgPyAwIDogY29tcG9uZW50VWlkcy5zaXplKCkpKTsKKworCQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnQ+LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmdldExhdGVzdFZlcnNpb25Ob3RBYnN0cmFjdENvbXBvbmVudHMoZmFsc2UsIEhpZ2hlc3RGaWx0ZXJFbnVtLkhJR0hFU1RfT05MWSwgY29tcG9uZW50VHlwZUVudW0sIGludGVybmFsQ29tcG9uZW50VHlwZSwgY29tcG9uZW50VWlkcywgdXNlcklkKTsKKworCQkJLy8gbG9uZyBlbmRCbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgYWxsIG5vbiBhYnN0cmFjdCB7fSIsIGNvbXBvbmVudFR5cGUpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJfQorCQkJT2JqZWN0IGNvbXBvbmVudHMgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJUmVzcG9uc2UgcmVzcG9uc2VUb1JldHVybiA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBjb21wb25lbnRzKTsKKworCQkJbG9uZyBlbmRSZXNwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCS8vIGxvZy5pbmZvKCIqKioqKioqKioqIFRpbWUgY2FsY3VsYXRpb24gaW4gbXM6IEJMIHt9ICwgUmVzcG9uc2Uge30sCisJCQkvLyBUb3RhbCB7fSIsIChlbmRCbCAtIHN0YXJ0ICksIChlbmRSZXNwIC0gZW5kQmwpLCAoZW5kUmVzcCAtCisJCQkvLyBzdGFydCkpOworCQkJcmV0dXJuIHJlc3BvbnNlVG9SZXR1cm47CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgQ2VydGlmaWVkIE5vbiBBYnN0cmFjdCIgKyBjb21wb25lbnRUeXBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBDZXJ0aWZpZWQgTm9uIEFic3RyYWN0IiArIGNvbXBvbmVudFR5cGUpOworCQkJbG9nLmRlYnVnKCJnZXRDZXJ0aWZpZWROb3RBYnN0cmFjdENvbXBvbmVudHMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKworCX0KKworCUBHRVQKKwlAUGF0aCgiL3tjb21wb25lbnRUeXBlfS9sYXRlc3R2ZXJzaW9uL25vdGFic3RyYWN0L3VpZG9ubHkiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJHZXQgQ29tcG9uZW50IHVpZCBvbmx5IiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGNvbXBvbmVudElkIiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJDb21wb25lbnQgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQ29tcG9uZW50IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldExhdGVzdFZlcnNpb25Ob3RBYnN0cmFjdENoZWNrb3V0Q29tcG9uZW50c0lkZXNPbmx5KEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBRdWVyeVBhcmFtKCJpbnRlcm5hbENvbXBvbmVudFR5cGUiKSBTdHJpbmcgaW50ZXJuYWxDb21wb25lbnRUeXBlLAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLCBAQXBpUGFyYW0odmFsdWUgPSAidWlkIGxpc3QiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldCkgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb21wb25lbnRUeXBlKTsKKwkJCUNvbXBvbmVudEJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldENvbXBvbmVudEJMKGNvbXBvbmVudFR5cGVFbnVtLCBjb250ZXh0KTsKKworCQkJRWl0aGVyPExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0TGF0ZXN0VmVyc2lvbk5vdEFic3RyYWN0Q29tcG9uZW50c1VpZE9ubHkoZmFsc2UsIEhpZ2hlc3RGaWx0ZXJFbnVtLkhJR0hFU1RfT05MWSwgY29tcG9uZW50VHlwZUVudW0sIGludGVybmFsQ29tcG9uZW50VHlwZSwgdXNlcklkKTsKKwkJCWlmIChhY3Rpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgYWxsIG5vbiBhYnN0cmFjdCB7fSIsIGNvbXBvbmVudFR5cGUpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCU9iamVjdCBjb21wb25lbnRzID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgY29tcG9uZW50cyk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgQ2VydGlmaWVkIE5vbiBBYnN0cmFjdCIgKyBjb21wb25lbnRUeXBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBDZXJ0aWZpZWQgTm9uIEFic3RyYWN0IiArIGNvbXBvbmVudFR5cGUpOworCQkJbG9nLmRlYnVnKCJnZXRDZXJ0aWZpZWROb3RBYnN0cmFjdENvbXBvbmVudHMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKworCX0KKworCUBHRVQKKwlAUGF0aCgiL3tjb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L2NvbXBvbmVudEluc3RhbmNlcyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkdldCBDb21wb25lbnQgaW5zdGFuY2VzIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGNvbXBvbmVudCBpbnN0YW5jZXMiLCByZXNwb25zZSA9IFJlc291cmNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkNvbXBvbmVudCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJDb21wb25lbnQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeVByb3BlcnRpZXNBbmRJbnB1dHMoQFBhdGhQYXJhbSgiY29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRUeXBlLCBAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlAUXVlcnlQYXJhbSgic2VhcmNoVGV4dCIpIFN0cmluZyBzZWFyY2hUZXh0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsIEBBcGlQYXJhbSh2YWx1ZSA9ICJ1aWQiICsgIiIgKyAibGlzdCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCIoZ2V0KSBTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtID0gQ29tcG9uZW50VHlwZUVudW0uZmluZEJ5UGFyYW1OYW1lKGNvbXBvbmVudFR5cGUpOworCQkJQ29tcG9uZW50QnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0Q29tcG9uZW50QkwoY29tcG9uZW50VHlwZUVudW0sIGNvbnRleHQpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeVByb3BlcnRpZXNBbmRJbnB1dHMoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLCB1c2VySWQsIHNlYXJjaFRleHQpOworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBhbGwgY29tcG9uZW50IGluc3RhbmNlcyBmaWx0ZXJlZCBieSBwcm9wZXJ0aWVzIGFuZCBpbnB1dHMge30iLCBjb21wb25lbnRUeXBlKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlPYmplY3QgY29tcG9uZW50cyA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGNvbXBvbmVudHMpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IENvbXBvbmVudCBJbnN0YW5jZXMgZmlsdGVyZWQgYnkgcHJvcGVydGllcyAmIGlucHV0cyIgKyBjb21wb25lbnRUeXBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBDb21wb25lbnQgSW5zdGFuY2VzIGZpbHRlcmVkIGJ5IHByb3BlcnRpZXMgJiBpbnB1dHMiICsgY29tcG9uZW50VHlwZSk7CisJCQlsb2cuZGVidWcoImdldENvbXBvbmVudEluc3RhbmNlc0ZpbHRlcmVkQnlQcm9wZXJ0aWVzQW5kSW5wdXRzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Db25maWdNZ3JTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ29uZmlnTWdyU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGIxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ29uZmlnTWdyU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnNlcnZsZXRzLkJhc2ljU2VydmxldDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CisKKy8qKgorICogUm9vdCByZXNvdXJjZSAoZXhwb3NlZCBhdCAiLyIgcGF0aCkKKyAqLworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL2NvbmZpZ21nciIpCitwdWJsaWMgY2xhc3MgQ29uZmlnTWdyU2VydmxldCBleHRlbmRzIEJhc2ljU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29uZmlnTWdyU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQEdFVAorCUBQYXRoKCIvZ2V0IikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJcHVibGljIFN0cmluZyBnZXRDb25maWcoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBRdWVyeVBhcmFtKCJ0eXBlIikgU3RyaW5nIHR5cGUpIHsKKworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IChDb25maWd1cmF0aW9uTWFuYWdlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKTsKKworCQlpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuZXF1YWxzKCJjb25maWd1cmF0aW9uIikpIHsKKworCQkJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpOworCQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworCQkJCWxvZy53YXJuKCJDb25maWd1cmF0aW9uIG9mIHR5cGUge30gd2FzIG5vdCBmb3VuZCIsIENvbmZpZ3VyYXRpb24uY2xhc3MpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuaW5mbygiVGhlIHZhbHVlIHJldHVybmVkIGZyb20gZ2V0Q29uZmlnIGlzIHt9IiwgY29uZmlndXJhdGlvbik7CisKKwkJCQlyZXN1bHQgPSBnc29uLnRvSnNvbihjb25maWd1cmF0aW9uKTsKKworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCUBQT1NUCisJQFBhdGgoIi9zZXQxIikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCXB1YmxpYyBTdHJpbmcgc2V0Q29uZmlnMShAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisKKwkJbG9nLmRlYnVnKCJ7fSIsIGNvbmZpZ3VyYXRpb24pOworCisJCXJldHVybiAib2siOworCisJfQorCisJQFBPU1QKKwlAUGF0aCgiL3NldDIiKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJcHVibGljIHZvaWQgc2V0Q29uZmlnMihAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisKKwkJbG9nLmRlYnVnKCJ7fSIsIGNvbmZpZ3VyYXRpb24pOworCisJfQorCisJQFBVVAorCUBQYXRoKCIvc2V0cHV0MSIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlwdWJsaWMgU3RyaW5nIHNldENvbmZpZzMoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworCisJCWxvZy5kZWJ1Zygie30iLCBjb25maWd1cmF0aW9uKTsKKworCQlyZXR1cm4gIm9rIjsKKworCX0KKworCUBQVVQKKwlAUGF0aCgiL3NldHB1dDIiKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJcHVibGljIHZvaWQgc2V0Q29uZmlnNChAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisKKwkJbG9nLmRlYnVnKCJ7fSIsIGNvbmZpZ3VyYXRpb24pOworCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ29uZmlnU2VydmxldC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0NvbmZpZ1NlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNhODdkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0NvbmZpZ1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5zZXJ2bGV0cy5CYXNpY1NlcnZsZXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworCisvKioKKyAqIFJvb3QgcmVzb3VyY2UgKGV4cG9zZWQgYXQgIi8iIHBhdGgpCisgKi8KK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi9jb25maWciKQorcHVibGljIGNsYXNzIENvbmZpZ1NlcnZsZXQgZXh0ZW5kcyBCYXNpY1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbmZpZ1NlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBHRVQKKwlAUGF0aCgiL2dldCIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gKENvbmZpZ3VyYXRpb25Tb3VyY2UpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5DT05GSUdVUkFUSU9OX1NPVVJDRV9BVFRSKTsKKwkJaWYgKGNvbmZpZ3VyYXRpb25Tb3VyY2UgIT0gbnVsbCkgeworCQkJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblNvdXJjZS5nZXRBbmRXYXRjaENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbi5jbGFzcywgbnVsbCk7CisKKwkJCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKKwkJCQlsb2cud2FybigiQ29uZmlndXJhdGlvbiBvZiB0eXBlIHt9IHdhcyBub3QgZm91bmQiLCBDb25maWd1cmF0aW9uLmNsYXNzKTsKKwkJCX0KKwkJCWxvZy5kZWJ1Zygie30iLCBjb25maWd1cmF0aW9uKTsKKwkJCWlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisJCQkJbG9nLmRlYnVnKCJJbmZvIGxldmVsIEVOQUJMRUQuLi4iKTsKKwkJCX0KKwkJCWxvZy5pbmZvKCJUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBnZXRDb25maWcgaXMge30iLCBjb25maWd1cmF0aW9uKTsKKworCQkJcmVzdWx0ID0gZ3Nvbi50b0pzb24oY29uZmlndXJhdGlvbik7CisKKwkJfSBlbHNlIHsKKwkJCWxvZy53YXJuKCJTb3VyY2UgQ29uZmlndXJhdGlvbiBvYmplY3Qgd2FzIG5vdCBpbml0aWFsaXplZCBpbiB0aGUgY29udGV4dC4iKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Db25zdW1lclNlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Db25zdW1lclNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjAzZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0NvbnN1bWVyU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ29uc3VtZXJCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29uc3VtZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVBhcmFtOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2U7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZXM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NvbnN1bWVycyIpCitAQXBpKHZhbHVlID0gIkNvbnN1bWVyIFNlcnZsZXQiLCBkZXNjcmlwdGlvbiA9ICJDb25zdW1lciBTZXJ2bGV0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBDb25zdW1lclNlcnZsZXQgZXh0ZW5kcyBCZUdlbmVyaWNTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25zdW1lclNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBQT1NUCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNvbnN1bWVyIGNyZWRlbnRpYWxzIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIEVDT01QIGNvbnN1bWVyIGNyZWRlbnRpYWxzIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJDb25zdW1lciBjcmVkZW50aWFscyBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZUNvbnN1bWVyKEBBcGlQYXJhbSh2YWx1ZSA9ICJDb25zdW1lciBPYmplY3QgdG8gYmUgY3JlYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCXRyeSB7CisJCQlDb25zdW1lckJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldENvbnN1bWVyQkwoY29udGV4dCk7CisKKwkJCUVpdGhlcjxDb25zdW1lckRlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0aW9uUmVzcG9uc2UgPSBjb252ZXJ0SnNvblRvT2JqZWN0KGRhdGEsIG1vZGlmaWVyLCBBdWRpdGluZ0FjdGlvbkVudW0uQUREX0VDT01QX1VTRVJfQ1JFREVOVElBTFMpOworCisJCQlpZiAoY29udmVydGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSBDb25zdW1lciIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoY29udmVydGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCUNvbnN1bWVyRGVmaW5pdGlvbiBjb25zdW1lciA9IGNvbnZlcnRpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3VsdCA9IGJ1c2luZXNzTG9naWMuY3JlYXRlQ29uc3VtZXIobW9kaWZpZXIsIGNvbnN1bWVyKTsKKworCQkJaWYgKGFjdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgQ29uc3VtZXIiKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKSwgYWN0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkNyZWF0ZSBjb25zdW1lciIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiQ3JlYXRlIGNvbnN1bWVyIik7CisJCQlsb2cuZGVidWcoImNyZWF0ZSBjb25zdW1lciBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCX0KKworCUBHRVQKKwlAUGF0aCgiL3tjb25zdW1lcklkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlJldHJpZXZlIENvbnN1bWVyIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGNvbnN1bWVyIGFjY29yZGluZyB0byBDb25zdW1lcklEIiwgcmVzcG9uc2UgPSBDb25zdW1lckRlZmluaXRpb24uY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQ29uc3VtZXIgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQ29uc3VtZXIgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0Q29uc3VtZXIoQFBhdGhQYXJhbSgiY29uc3VtZXJJZCIpIGZpbmFsIFN0cmluZyBjb25zdW1lcklkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlDb25zdW1lckJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldENvbnN1bWVyQkwoY29udGV4dCk7CisKKwkJCUVpdGhlcjxDb25zdW1lckRlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0Q29uc3VtZXIoY29uc3VtZXJJZCwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGNvbnN1bWVyIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBDb25zdW1lciIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IENvbnN1bWVyIik7CisJCQlsb2cuZGVidWcoImdldCBjb25zdW1lciBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKworCQl9CisJfQorCisJQERFTEVURQorCUBQYXRoKCIve2NvbnN1bWVySWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRGVsZXRlcyBDb25zdW1lciIsIGh0dHBNZXRob2QgPSAiREVMRVRFIiwgbm90ZXMgPSAiUmV0dXJucyBkZWxldGVkIGNvbnN1bWVyIGFjY29yZGluZyB0byBDb25zdW1lcklEIiwgcmVzcG9uc2UgPSBDb25zdW1lckRlZmluaXRpb24uY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDQsIG1lc3NhZ2UgPSAiQ29uc3VtZXIgZGVsZXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJDb25zdW1lciBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBkZWxldGVDb25zdW1lcihAUGF0aFBhcmFtKCJjb25zdW1lcklkIikgZmluYWwgU3RyaW5nIGNvbnN1bWVySWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUNvbnN1bWVyQnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0Q29uc3VtZXJCTChjb250ZXh0KTsKKworCQkJRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy5kZWxldGVDb25zdW1lcihjb25zdW1lcklkLCBtb2RpZmllcik7CisKKwkJCWlmIChhY3Rpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBkZWxldGUgY29uc3VtZXIiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IENvbnN1bWVyIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgQ29uc3VtZXIiKTsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlIGNvbnN1bWVyIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCisJCX0KKwl9CisKKwlwcml2YXRlIENvbnN1bWVyQnVzaW5lc3NMb2dpYyBnZXRDb25zdW1lckJMKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCUNvbnN1bWVyQnVzaW5lc3NMb2dpYyBjb25zdW1lckJMID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oQ29uc3VtZXJCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKworCQlyZXR1cm4gY29uc3VtZXJCTDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNvbnZlcnRKc29uVG9PYmplY3QoU3RyaW5nIGRhdGEsIFVzZXIgdXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0pIHsKKwkJQ29uc3VtZXJEZWZpbml0aW9uIGNvbnN1bWVyID0gbnVsbDsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJdHJ5IHsKKwkJCWxvZy50cmFjZSgiY29udmVydCBqc29uIHRvIG9iamVjdC4ganNvbj1cbnt9IiwgZGF0YSk7CisJCQljb25zdW1lciA9IGdzb24uZnJvbUpzb24oZGF0YSwgQ29uc3VtZXJEZWZpbml0aW9uLmNsYXNzKTsKKwkJCWlmIChjb25zdW1lciA9PSBudWxsKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlSW52YWxpZEpzb25JbnB1dCwgImNvbnZlcnRKc29uVG9PYmplY3QiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVJbnZhbGlkSnNvbklucHV0KCJjb252ZXJ0SnNvblRvT2JqZWN0Iik7CisJCQkJbG9nLmRlYnVnKCJvYmplY3QgaXMgbnVsbCBhZnRlciBjb252ZXJ0aW5nIGZyb20ganNvbiIpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0SW52YWxpZENvbnRlbnRFcnJvckFuZEF1ZGl0KHVzZXIsIGFjdGlvbkVudW0pOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gSU5WQUxJRCBKU09OCisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVJbnZhbGlkSnNvbklucHV0LCAiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiY29udmVydEpzb25Ub09iamVjdCIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY29udmVydCBmcm9tIGpzb24ge30iLCBkYXRhLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0SW52YWxpZENvbnRlbnRFcnJvckFuZEF1ZGl0KHVzZXIsIGFjdGlvbkVudW0pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnN1bWVyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Dc2FyQnVpbGRTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ3NhckJ1aWxkU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTZiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQ3NhckJ1aWxkU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmJ1aWxkZXJzLnRvc2NhLmFwaS5Ub3BvbG9neVNlcnZpY2U7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5wYXJzZXJzLlBhcnNlck1vZGU7CisKK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi9zZXJ2aWNlcyIpCitwdWJsaWMgY2xhc3MgQ3NhckJ1aWxkU2VydmxldCBleHRlbmRzIFRvc2NhRGFvU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3NhckJ1aWxkU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQEdFVAorCUBQYXRoKCIve3NlcnZpY2VOYW1lfS97c2VydmljZVZlcnNpb259IikKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0RGVmYXVsdFRlbXBsYXRlKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBAUGF0aFBhcmFtKCJzZXJ2aWNlTmFtZSIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSwgQFBhdGhQYXJhbSgic2VydmljZVZlcnNpb24iKSBmaW5hbCBTdHJpbmcgc2VydmljZVZlcnNpb24pIHsKKworCQlyZXR1cm4gbnVsbDsvLyBidWlsZFRvc2NhQ3NhcihyZXF1ZXN0LCBzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24pOworCisJfQorCisJQEdFVAorCUBQYXRoKCIve3NlcnZpY2VOYW1lfS97c2VydmljZVZlcnNpb259L2NzYXIiKQorCXB1YmxpYyBSZXNwb25zZSBnZXRUb3NjYUNzYXJUZW1wbGF0ZShAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQFBhdGhQYXJhbSgic2VydmljZU5hbWUiKSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIEBQYXRoUGFyYW0oInNlcnZpY2VWZXJzaW9uIikgZmluYWwgU3RyaW5nIHNlcnZpY2VWZXJzaW9uKSB7CisKKwkJcmV0dXJuIG51bGw7IC8vIGJ1aWxkVG9zY2FDc2FyKHJlcXVlc3QsIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbik7CisKKwl9CisKKwkvKgorCSAqIHByaXZhdGUgUmVzcG9uc2UgYnVpbGRUb3NjYUNzYXIoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHNlcnZpY2VWZXJzaW9uKSB7IGxvZy5kZWJ1ZygiQnVpbGRpbmcgQ1NBUiBmb3Igc2VydmljZTp7fSAsIHZlcnNpb246e30iLCBzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24pOyBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0KKwkgKiByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOyBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShieXRlQXJyYXlPdXRwdXRTdHJlYW0pOyBTdHJpbmcgZmlsZU5hbWUgPQorCSAqIHNlcnZpY2VOYW1lKyJfIitzZXJ2aWNlVmVyc2lvbisiLnppcCI7CisJICogCisJICogSVJlc291cmNlVXBsb2FkZXIgcmVzb3VyY2VVcGxvYWRlciA9IGdldFJlc291cmNlVXBsb2FkZXIoY29udGV4dCk7IFRvcG9sb2d5U2VydmljZSB0b3BvbG9neVNlcnZpY2UgPSBnZXRUb3NjYVlhbWxCdWlsZGVyKGNvbnRleHQpLmdldFNlcnZpY2VZYW1sKHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgUGFyc2VyTW9kZS5DU0FSLCAiU2NyaXB0cyIpOyB0cnkgeworCSAqIAorCSAqIAorCSAqIC8vQWRkIFNlcnZpY2UgeW1sIHRvIFppcCBhZGRaaXBFbnRyeSh6aXBPdXRwdXRTdHJlYW0sICJEZWZpbml0aW9ucy8iK3NlcnZpY2VOYW1lKyIueWFtbCIsIHRvcG9sb2d5U2VydmljZS5nZXRUb3BvbG9neVNlcnZpY2VZYW1sKCkpOworCSAqIAorCSAqIC8vQWRkIFJlc291cmNlcyB0byBaaXAgYWRkUmVzb3VyY2VzVG9aaXAoemlwT3V0cHV0U3RyZWFtLCB0b3BvbG9neVNlcnZpY2UpOworCSAqIAorCSAqIC8vQWRkIEFydGlmYWN0cyB0byBaaXAgYWRkQXJ0aWZhY3RzVG9aaXAoc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCB6aXBPdXRwdXRTdHJlYW0sIHJlc291cmNlVXBsb2FkZXIpOworCSAqIAorCSAqIC8vUHJlcGFyZSBUb3NjYSBtZXRhZGF0YSBhZGRUb3NjYU1ldGFUb1ppcCh6aXBPdXRwdXRTdHJlYW0sIHRvcG9sb2d5U2VydmljZSwgcmVzb3VyY2VVcGxvYWRlcik7CisJICogCisJICogfQorCSAqIAorCSAqIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IGxvZy5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBDU0FSIGZpbGUiLCBlKTsgcmV0dXJuIG51bGw7IH0gZmluYWxseXsgdHJ5IHsgYnl0ZUFycmF5T3V0cHV0U3RyZWFtLmNsb3NlKCk7IHppcE91dHB1dFN0cmVhbS5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IGxvZy5lcnJvcigiRmFpbGVkIHRvIGNsb3NlIG91dHB1dCBzcnJlYW0iLCBlKTsgfQorCSAqIAorCSAqIH0gcmV0dXJuIGJ1aWxkUmVzcG9uc2UoZmlsZU5hbWUsIGJ5dGVBcnJheU91dHB1dFN0cmVhbSk7CisJICogCisJICogCisJICogfQorCSAqLworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9TQ0FfTUVUQV9QQVRIID0gIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEiOworCS8vIHByb3RlY3RlZCB2b2lkIGFkZFRvc2NhTWV0YVRvWmlwKFppcE91dHB1dFN0cmVhbSB6aXBPdXRwdXRTdHJlYW0sCisJLy8gVG9wb2xvZ3lTZXJ2aWNlIHRvcFNlcnZpY2UsIElSZXNvdXJjZVVwbG9hZGVyIHJlc1VwbG9hZGVyKSB0aHJvd3MKKwkvLyBJT0V4Y2VwdGlvbiB7CisJLy8gU3RyaW5nIHNlcnZpY2VWZXJzaW9uID0gdG9wU2VydmljZS5nZXRUb3BvbG9neVZlcnNpb24oKTsKKwkvLyBTdHJpbmcgc2VydmljZU5hbWUgPSB0b3BTZXJ2aWNlLmdldFRvcG9sb2d5TmFtZSgpOworCS8vIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCS8vCisJLy8gU3RyaW5nW10gc2VydmljZVRvc2NhTWV0YSA9IHByZXBhcmVUb3NjYU1ldGFIZWFkZXIoc2VydmljZU5hbWUpOworCS8vCisJLy8gZm9yKCBTdHJpbmcgdG9BcHBlbmQgOiBzZXJ2aWNlVG9zY2FNZXRhKXsKKwkvLyBidWZmLmFwcGVuZCh0b0FwcGVuZCk7CisJLy8gfQorCS8vCisJLy8gTGlzdDxTdHJpbmc+IHRvc2NhTWV0YUNvbXBvbmVudHMgPQorCS8vIHByZXBhcmVUb3NjYU1ldGFDb21wb25lbnRzKHRvcFNlcnZpY2UuZ2V0RGVwZW5kZW5jaWVzWWFtbHMoKS5rZXlTZXQoKSk7CisJLy8gZm9yKCBTdHJpbmcgdG9BcHBlbmQgOiB0b3NjYU1ldGFDb21wb25lbnRzICl7CisJLy8gYnVmZi5hcHBlbmQodG9BcHBlbmQpOworCS8vIH0KKwkvLworCS8vIEVpdGhlcjxTZXJ2aWNlQXJ0aWZhY3RzRGF0YUNvbGxlY3Rpb24sIFJlc291cmNlVXBsb2FkU3RhdHVzPgorCS8vIGdldFNlcnZpY2VBcnRpZmFjdHNDb2xsZWN0aW9uU3RhdHVzID0KKwkvLyBFaXRoZXIucmlnaHQoUmVzb3VyY2VVcGxvYWRTdGF0dXMuRVJST1IpOy8vcmVzVXBsb2FkZXIuZ2V0U2VydmljZUFydGlmYWN0c0NvbGxlY3Rpb24oc2VydmljZU5hbWUsCisJLy8gc2VydmljZVZlcnNpb24pOworCS8vIGlmKGdldFNlcnZpY2VBcnRpZmFjdHNDb2xsZWN0aW9uU3RhdHVzLmlzTGVmdCgpKXsKKwkvLyBMaXN0PFN0cmluZz4gdG9zY2FNZXRhQXJ0aWZhY3RzID0KKwkvLyBwcmVwYXJlVG9zY2FNZXRhQXJ0aWZhY3RzKGdldFNlcnZpY2VBcnRpZmFjdHNDb2xsZWN0aW9uU3RhdHVzLmxlZnQoKS52YWx1ZSgpKTsKKwkvLyBmb3IoIFN0cmluZyB0b0FwcGVuZCA6IHRvc2NhTWV0YUFydGlmYWN0cyApeworCS8vIGJ1ZmYuYXBwZW5kKHRvQXBwZW5kKTsKKwkvLyB9CisJLy8gfQorCS8vCisJLy8gYWRkWmlwRW50cnkoemlwT3V0cHV0U3RyZWFtLCBUT1NDQV9NRVRBX1BBVEgsIGJ1ZmYudG9TdHJpbmcoKSk7CisJLy8gfQorCisJLy8gcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBwcmVwYXJlVG9zY2FNZXRhQXJ0aWZhY3RzKAorCS8vIFNlcnZpY2VBcnRpZmFjdHNEYXRhQ29sbGVjdGlvbiBzZXJ2aWNlQXJ0aWZhY3RzRGF0YUNvbGxlY3Rpb24pIHsKKwkvLyBMaXN0PFN0cmluZz4gYXJ0aWZhY3RzRm9yVG9zY2FNZXRhID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJLy8gSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGF0YT4+PiBub2RlVGVtcGxhdGVBcnRpZmFjdHNJdHIgPQorCS8vIHNlcnZpY2VBcnRpZmFjdHNEYXRhQ29sbGVjdGlvbi5nZXRTZXJ2aWNlQXJ0aWZhY3REYXRhTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCS8vIHdoaWxlKCBub2RlVGVtcGxhdGVBcnRpZmFjdHNJdHIuaGFzTmV4dCgpICl7CisJLy8gRW50cnk8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGF0YT4+IG5vZGVOYW1lQXJ0aWZhY3RzID0KKwkvLyBub2RlVGVtcGxhdGVBcnRpZmFjdHNJdHIubmV4dCgpOworCS8vIFN0cmluZyBub2RlTmFtZSA9IG5vZGVOYW1lQXJ0aWZhY3RzLmdldEtleSgpOworCS8vIEl0ZXJhdG9yPEFydGlmYWN0RGF0YT4gYXJ0aWZhY3REYXRhSXRyID0KKwkvLyBub2RlTmFtZUFydGlmYWN0cy5nZXRWYWx1ZSgpLml0ZXJhdG9yKCk7CisJLy8gd2hpbGUoIGFydGlmYWN0RGF0YUl0ci5oYXNOZXh0KCkgKXsKKwkvLyBBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gYXJ0aWZhY3REYXRhSXRyLm5leHQoKTsKKwkvLyBhcnRpZmFjdHNGb3JUb3NjYU1ldGEuYWRkKCJcbiIpOworCS8vIGFydGlmYWN0c0ZvclRvc2NhTWV0YS5hZGQoIk5hbWU6ICIrZ2V0QXJ0aWZhY3RQYXRoKG5vZGVOYW1lLAorCS8vIGFydGlmYWN0RGF0YSkrIlxuIik7CisJLy8gYXJ0aWZhY3RzRm9yVG9zY2FNZXRhLmFkZCgiQ29udGVudC1UeXBlOgorCS8vIGFwcGxpY2F0aW9uLyIrZ2V0QXBwbGlhY3Rpb25NaW1lKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdE5hbWUoKSkrIlxuIik7CisJLy8gfQorCS8vIH0KKwkvLyByZXR1cm4gYXJ0aWZhY3RzRm9yVG9zY2FNZXRhOworCS8vIH0KKworCS8vIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gcHJlcGFyZVRvc2NhTWV0YUNvbXBvbmVudHMoU2V0PFN0cmluZz4gY29tcG9uZW50cykKKwkvLyB7CisJLy8gSXRlcmF0b3I8U3RyaW5nPiByZXNvdXJjZU5hbWVJdHIgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7CisJLy8gTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNGb3JUb3NjYU1ldGEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkvLyB3aGlsZSggcmVzb3VyY2VOYW1lSXRyLmhhc05leHQoKSApeworCS8vIFN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWVJdHIubmV4dCgpOworCS8vIGNvbXBvbmVudHNGb3JUb3NjYU1ldGEuYWRkKCJcbiIpOworCS8vIGNvbXBvbmVudHNGb3JUb3NjYU1ldGEuYWRkKCJOYW1lOiAiK2dldFJlc291cmNlUGF0aChyZXNvdXJjZU5hbWUpKyJcbiIpOworCS8vIGNvbXBvbmVudHNGb3JUb3NjYU1ldGEuYWRkKCJDb250ZW50LVR5cGU6CisJLy8gYXBwbGljYXRpb24vdm5kLm9hc2lzLnRvc2NhLmRlZmluaXRpb25zLnlhbWxcbiIpOworCS8vCisJLy8gfQorCS8vIHJldHVybiBjb21wb25lbnRzRm9yVG9zY2FNZXRhOworCS8vIH0KKworCXByb3RlY3RlZCBTdHJpbmdbXSBwcmVwYXJlVG9zY2FNZXRhSGVhZGVyKFN0cmluZyBzZXJ2aWNlTmFtZSkgeworCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIlRPU0NBLU1ldGEtRmlsZS1WZXJzaW9uOiAxLjBcbiIsICJDU0FSLVZlcnNpb246IDEuMVxuIiwgIkNyZWF0ZWQtQnk6IElOVEVSV0lTRVxuIiwgIlxuIiwgIkVudHJ5LURlZmluaXRpb25zOiBEZWZpbml0aW9ucy8iICsgc2VydmljZU5hbWUgKyAiLnlhbWxcbiIsICJcbiIsICJOYW1lOiBEZWZpbml0aW9ucy8iICsgc2VydmljZU5hbWUgKyAiLnlhbWxcbiIsCisJCQkJIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vdm5kLm9hc2lzLnRvc2NhLmRlZmluaXRpb25zLnlhbWxcbiIgfTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFwcGxpYWN0aW9uTWltZShTdHJpbmcgZmlsZU5hbWUpIHsKKwkJU3RyaW5nIG1pbWVUeXBlOworCQlpZiAoZmlsZU5hbWUuY29udGFpbnMoIi5zaCIpKSB7CisJCQltaW1lVHlwZSA9ICJ4LXNoIjsKKwkJfSBlbHNlIGlmIChmaWxlTmFtZS5jb250YWlucygiLnlhbmciKSkgeworCQkJbWltZVR5cGUgPSAieWFuZyI7CisJCX0KKworCQllbHNlIGlmIChmaWxlTmFtZS5jb250YWlucygiLnJhciIpKSB7CisJCQltaW1lVHlwZSA9ICJ4LXJhci1jb21wcmVzc2VkIjsKKwkJfQorCisJCWVsc2UgaWYgKGZpbGVOYW1lLmNvbnRhaW5zKCIuemlwIikpIHsKKwkJCW1pbWVUeXBlID0gInppcCI7CisJCX0KKworCQllbHNlIGlmIChmaWxlTmFtZS5jb250YWlucygiLnRhciIpKSB7CisJCQltaW1lVHlwZSA9ICJ4LXRhciI7CisJCX0KKworCQllbHNlIGlmIChmaWxlTmFtZS5jb250YWlucygiLjd6IikpIHsKKwkJCW1pbWVUeXBlID0gIngtN3otY29tcHJlc3NlZCI7CisJCX0KKworCQllbHNlIHsKKwkJCS8vIFVuZGVmaW5lZAorCQkJbWltZVR5cGUgPSAidW5kZWZpbmVkIjsKKwkJfQorCQlyZXR1cm4gbWltZVR5cGU7CisJfQorCisJLy8gcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VzVG9aaXAoWmlwT3V0cHV0U3RyZWFtIHppcE91dHB1dFN0cmVhbSwKKwkvLyBUb3BvbG9neVNlcnZpY2UgdG9wU2VydmljZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvLyBJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIFN0cmluZz4+IHJlc291cmNlTmFtZURhdGFJdHIgPQorCS8vIHRvcFNlcnZpY2UuZ2V0RGVwZW5kZW5jaWVzWWFtbHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJLy8gd2hpbGUoIHJlc291cmNlTmFtZURhdGFJdHIuaGFzTmV4dCgpICl7CisJLy8gRW50cnk8U3RyaW5nLCBTdHJpbmc+IHJlc291cmNlTmFtZURhdGEgPSByZXNvdXJjZU5hbWVEYXRhSXRyLm5leHQoKTsKKwkvLyBhZGRaaXBFbnRyeSh6aXBPdXRwdXRTdHJlYW0sIGdldFJlc291cmNlUGF0aChyZXNvdXJjZU5hbWVEYXRhLmdldEtleSgpKSwKKwkvLyByZXNvdXJjZU5hbWVEYXRhLmdldFZhbHVlKCkpOworCS8vIH0KKwkvLyB9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFydGlmYWN0UGF0aChTdHJpbmcgbm9kZVRhbXBsYXRlTmFtZSwgRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhKSB7CisJCS8vIHJldHVybiAiU2NyaXB0cy8iK25vZGVUYW1wbGF0ZU5hbWUrIi8iKworCQkvLyBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3ROYW1lKCk7CisJCXJldHVybiAiU2NyaXB0cy8iICsgbm9kZVRhbXBsYXRlTmFtZSArICIvIiArIGFydGlmYWN0RGF0YS5nZXRJZCgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VQYXRoKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKwkJcmV0dXJuICJEZWZpbml0aW9ucy8iICsgcmVzb3VyY2VOYW1lICsgIi55YW1sIjsKKwl9CisKKwkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRBcnRpZmFjdHNUb1ppcChTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZworCS8vIHNlcnZpY2VWZXJzaW9uLCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtLCBJUmVzb3VyY2VVcGxvYWRlcgorCS8vIHJlc291cmNlVXBsb2FkZXIpCisJLy8gdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvLyAvL0FkZCBBcnRpZmFjdHMgdG8gWmlwCisJLy8gRWl0aGVyPFNlcnZpY2VBcnRpZmFjdHNEYXRhQ29sbGVjdGlvbiwgUmVzb3VyY2VVcGxvYWRTdGF0dXM+CisJLy8gZ2V0U2VydmljZUFydGlmYWN0c0NvbGxlY3Rpb25TdGF0dXMgPQorCS8vIEVpdGhlci5yaWdodChSZXNvdXJjZVVwbG9hZFN0YXR1cy5FUlJPUik7Ly9yZXNvdXJjZVVwbG9hZGVyLmdldFNlcnZpY2VBcnRpZmFjdHNDb2xsZWN0aW9uKHNlcnZpY2VOYW1lLAorCS8vIHNlcnZpY2VWZXJzaW9uKTsKKwkvLyBpZihnZXRTZXJ2aWNlQXJ0aWZhY3RzQ29sbGVjdGlvblN0YXR1cy5pc0xlZnQoKSl7CisJLy8gSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBMaXN0PEFydGlmYWN0RGF0YT4+PiBub2RlVGVtcGxhdGVBcnRpZmFjdHNJdHIKKwkvLyA9Z2V0U2VydmljZUFydGlmYWN0c0NvbGxlY3Rpb25TdGF0dXMubGVmdCgpLnZhbHVlKCkuZ2V0U2VydmljZUFydGlmYWN0RGF0YU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkvLyB3aGlsZSggbm9kZVRlbXBsYXRlQXJ0aWZhY3RzSXRyLmhhc05leHQoKSApeworCS8vIEVudHJ5PFN0cmluZywgTGlzdDxBcnRpZmFjdERhdGE+PiBub2RlVGVtcGxhdGVBcnRpZmFjdHMgPQorCS8vIG5vZGVUZW1wbGF0ZUFydGlmYWN0c0l0ci5uZXh0KCk7CisJLy8gU3RyaW5nIG5vZGVUYW1wbGF0ZU5hbWUgPSBub2RlVGVtcGxhdGVBcnRpZmFjdHMuZ2V0S2V5KCk7CisJLy8gTGlzdDxBcnRpZmFjdERhdGE+IGFydGlmYWN0cyA9IG5vZGVUZW1wbGF0ZUFydGlmYWN0cy5nZXRWYWx1ZSgpOworCS8vIGZvcihBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhIDogYXJ0aWZhY3RzICl7CisJLy8gYWRkWmlwRW50cnkoemlwT3V0cHV0U3RyZWFtLAorCS8vIGdldEFydGlmYWN0UGF0aChub2RlVGFtcGxhdGVOYW1lLGFydGlmYWN0RGF0YSksIGFydGlmYWN0RGF0YS5nZXREYXRhKCkpOworCS8vIH0KKwkvLworCS8vIH0KKwkvLyB9CisJLy8gfQorCisJLy8gcHJpdmF0ZSBSZXNwb25zZSBidWlsZFJlc3BvbnNlKFN0cmluZyBmaWxlTmFtZSwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtCisJLy8gZmlsZU91dHB1dFN0cmVhbSkgeworCS8vIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3CisJLy8gQnl0ZUFycmF5SW5wdXRTdHJlYW0oZmlsZU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKwkvLworCS8vIFN0cmVhbWluZ091dHB1dCBzdHJlYW0gPSBuZXcgU3RyZWFtaW5nT3V0cHV0KCkgeworCS8vIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisJLy8gdHJ5IHsKKwkvLyBJT1V0aWxzLmNvcHkoaW5wdXRTdHJlYW0sIG91dHB1dCk7CisJLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkvLyB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oZSk7CisJLy8gfQorCS8vIH0KKwkvLyB9OworCS8vCisJLy8gcmV0dXJuCisJLy8gUmVzcG9uc2Uub2soc3RyZWFtKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkuaGVhZGVyKCJjb250ZW50LWRpc3Bvc2l0aW9uIiwiYXR0YWNobWVudDsKKwkvLyBmaWxlbmFtZSA9ICIrZmlsZU5hbWUpLmJ1aWxkKCk7CisJLy8gfQorCisJLy8gcHJvdGVjdGVkIHZvaWQgYWRkWmlwRW50cnkoWmlwT3V0cHV0U3RyZWFtIHppcE91dHB1dFN0cmVhbSwgU3RyaW5nCisJLy8gZmlsZVBhdGgsIFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCS8vIGFkZFppcEVudHJ5KHppcE91dHB1dFN0cmVhbSwgZmlsZVBhdGgsIGVuY29kZVN0cmluZyhkYXRhKSk7CisJLy8gfQorCisJcHJpdmF0ZSBieXRlW10gZW5jb2RlU3RyaW5nKFN0cmluZyBkYXRhKSB0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKKwkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOworCQlDaGFyc2V0RW5jb2RlciBlbmNvZGVyID0gY2hhcnNldC5uZXdFbmNvZGVyKCk7CisJCUJ5dGVCdWZmZXIgYmIgPSBlbmNvZGVyLmVuY29kZShDaGFyQnVmZmVyLndyYXAoZGF0YS50b0NoYXJBcnJheSgpKSk7CisJCWJ5dGVbXSBiYSA9IG5ldyBieXRlW2JiLmxpbWl0KCldOworCQliYi5nZXQoYmEpOworCQlyZXR1cm4gYmE7CisJfQorCisJLy8gcHJpdmF0ZSB2b2lkIGFkZFppcEVudHJ5KFppcE91dHB1dFN0cmVhbSB6aXBPdXRwdXRTdHJlYW0sIFN0cmluZworCS8vIGZpbGVQYXRoLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvLyBsb2cuZGVidWcoIkFkZGluZyB0byBDU0FSIHppcCA6e30iLCBmaWxlUGF0aCk7CisJLy8gWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoZmlsZVBhdGgpOworCS8vIHppcE91dHB1dFN0cmVhbS5wdXROZXh0RW50cnkoZW50cnkpOworCS8vIHppcE91dHB1dFN0cmVhbS53cml0ZShkYXRhKTsKKwkvLyB6aXBPdXRwdXRTdHJlYW0uY2xvc2VFbnRyeSgpOworCS8vIH0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgeworCQlyZXR1cm4gbG9nOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0Rpc3RyaWJ1dGlvblNlcnZpY2VTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvRGlzdHJpYnV0aW9uU2VydmljZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmEzMjFmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0Rpc3RyaWJ1dGlvblNlcnZpY2VTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkRpc3RyaWJ1dGlvbk1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5EaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5EaXN0cmlidXRpb25TdGF0dXNPZlNlcnZpY2VMaXN0UmVzcG9uY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2U7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZXM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworLyoqCisgKiBSb290IHJlc291cmNlIChleHBvc2VkIGF0ICIvIiBwYXRoKQorICovCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvY2F0YWxvZyIpCitAQXBpKHZhbHVlID0gIkRpc3RyaWJ1dGlvbiBTZXJ2aWNlIFNlcnZsZXQiLCBkZXNjcmlwdGlvbiA9ICJEaXN0cmlidXRpb24gU2VydmljZSBTZXJ2bGV0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25TZXJ2aWNlU2VydmxldCBleHRlbmRzIEJlR2VuZXJpY1NlcnZsZXQgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEaXN0cmlidXRpb25TZXJ2aWNlU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBEaXN0cmlidXRpb25Nb25pdG9yaW5nQnVzaW5lc3NMb2dpYyBkaXN0cmlidXRpb25Nb25pdG9yaW5nTG9naWM7CisKKwlAR0VUCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZVVVSUR9L2Rpc3RyaWJ1dGlvbiIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlJldHJpZXZlIERpc3RyaWJ1dGlvbnMiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgbGlzdCAgYmFzZXMgb24gdGhlICBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSAgQXVkaXRpbmcgUmVjb3JkcyBhY2NvcmRpbmcgdG8gc2VydmljZSB1dWlkIiwgcmVzcG9uc2UgPSBEaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiU2VydmljZSBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJTZXJ2aWNlIG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldFNlcnZpY2VCeUlkKEBQYXRoUGFyYW0oInNlcnZpY2VVVUlEIikgZmluYWwgU3RyaW5nIHNlcnZpY2VVVUlELCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJaW5pdChyZXF1ZXN0KTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBudWxsOworCisJCXRyeSB7CisJCQlFaXRoZXI8RGlzdHJpYnV0aW9uU3RhdHVzT2ZTZXJ2aWNlTGlzdFJlc3BvbmNlLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBkaXN0cmlidXRpb25Nb25pdG9yaW5nTG9naWMuZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU2VydmljZVN0YXR1cyhzZXJ2aWNlVVVJRCwgdXNlcklkKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCisJCQkJcmVzcG9uc2VGb3JtYXQgPSBhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKworCQkJfQorCisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgRGlzdHJpYnV0aW9uIGxpc3QgZm9yIFNlcnZpY2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBEaXN0cmlidXRpb24gbGlzdCBmb3IgU2VydmljZSIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IHNlcnZpY2UgZGlzdHJpYnV0aW9uIHN0YXR1c2VzIiwgZSk7CisJCQlyZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9CisKKwl9CisKKwlAR0VUCisJQFBhdGgoIi9zZXJ2aWNlcy9kaXN0cmlidXRpb24ve2RpZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJSZXRyaWV2ZSBEaXN0cmlidXRpb25zIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm4gIHRoZSAgbGlzdCAgb2YgIGRpc3RyaWJ1dGlvbiBzdGF0dXMgb2JqZWN0cyIsIHJlc3BvbnNlID0gRGlzdHJpYnV0aW9uU3RhdHVzTGlzdFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlNlcnZpY2UgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiU3RhdHVzIG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldExpc3RPZkRpc3RyaWJ1dGlvblN0YXR1c2VzKEBQYXRoUGFyYW0oImRpZCIpIGZpbmFsIFN0cmluZyBkaWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlpbml0KHJlcXVlc3QpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCUVpdGhlcjxEaXN0cmlidXRpb25TdGF0dXNMaXN0UmVzcG9uc2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGRpc3RyaWJ1dGlvbk1vbml0b3JpbmdMb2dpYy5nZXRMaXN0T2ZEaXN0cmlidXRpb25TdGF0dXMoZGlkLCB1c2VySWQpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBmb3VudCBzdGF0dXNlcyBmb3IgZGlkIHt9IHt9IiwgZGlkLCByZXNwb25zZUZvcm1hdCk7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfSBlbHNlIHsKKworCQkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJCQlsb2cuZGVidWcoInN1Y2Nlc3MgdG8gZm91bnQgc3RhdHVzZXMgZm9yIGRpZCB7fSB7fSIsIGRpZCwgYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCX0KKworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IERpc3RyaWJ1dGlvbiBTdGF0dXMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBEaXN0cmlidXRpb24gU3RhdHVzIik7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgZGlzdHJpYnV0aW9uIHN0YXR1cyAiLCBlKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBpbml0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCWlmIChkaXN0cmlidXRpb25Nb25pdG9yaW5nTG9naWMgPT0gbnVsbCkgeworCQkJZGlzdHJpYnV0aW9uTW9uaXRvcmluZ0xvZ2ljID0gZ2V0RGlzdHJpYnV0aW9uQkwocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIERpc3RyaWJ1dGlvbk1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljIGdldERpc3RyaWJ1dGlvbkJMKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCURpc3RyaWJ1dGlvbk1vbml0b3JpbmdCdXNpbmVzc0xvZ2ljIGRpc3RyaWJ1dGlvbkJsID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oRGlzdHJpYnV0aW9uTW9uaXRvcmluZ0J1c2luZXNzTG9naWMuY2xhc3MpOworCQlyZXR1cm4gZGlzdHJpYnV0aW9uQmw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvRWxlbWVudFNlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9FbGVtZW50U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2ExYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvRWxlbWVudFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDYxMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5jbGVhbi5Db21wb25lbnRzQ2xlYW5CdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5FbGVtZW50QnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5BcnRpZmFjdFR5cGVzSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdFR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5U2NvcGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVGFnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5Lkdyb3VwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGk7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BQYXRoKCIvdjEvIikKKworLyoqKioKKyAqIAorICogVUkgb3JpZW50ZWQgc2VydmxldCAtIHRvIHJldHVybiBlbGVtZW50cyBpbiBzcGVjaWZpYyBmb3JtYXQgVUkgbmVlZHMKKyAqIAorICoKKyAqLworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAQXBpKHZhbHVlID0gIkVsZW1lbnQgU2VydmxldCIsIGRlc2NyaXB0aW9uID0gIkVsZW1lbnQgU2VydmxldCIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgRWxlbWVudFNlcnZsZXQgZXh0ZW5kcyBCZUdlbmVyaWNTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFbGVtZW50U2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogTkVXIENBVEVHT1JJRVMgY2F0ZWdvcnkgLyBcIHN1YmNhdGVnb3J5IHN1YmNhdGVnb3J5IC8gZ3JvdXBpbmcKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyoKKwkgKgorCSAqIAorCSAqIENBVEVHT1JJRVMKKwkgKi8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHJldHJpZXZlIGFsbCBjb21wb25lbnQgY2F0ZWdvcmllcworCUBHRVQKKwlAUGF0aCgiL2NhdGVnb3JpZXMve2NvbXBvbmVudFR5cGV9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiUmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdCBjYXRlZ29yaWVzL3N1Yi1jYXRlZ29yaWVzL2dyb3VwaW5ncyIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdCBjYXRlZ29yaWVzL3N1Yi1jYXRlZ29yaWVzL2dyb3VwaW5ncy4iLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgY2F0ZWdvcmllcyBPayIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJNaXNzaW5nIGluZm9ybWF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29tcG9uZW50IHR5cGUiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldENvbXBvbmVudENhdGVnb3JpZXMoQEFwaVBhcmFtKHZhbHVlID0gImFsbG93ZWQgdmFsdWVzIGFyZSByZXNvdXJjZXMgLyBzZXJ2aWNlcy8gcHJvZHVjdHMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FICsgIiwiCisJCQkrIENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1RfUEFSQU1fTkFNRSwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKHZhbHVlID0gImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCXRyeSB7CisJCQlFbGVtZW50QnVzaW5lc3NMb2dpYyBlbGVtZW50QkwgPSBnZXRFbGVtZW50QkwocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCQlFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gZWxlbWVudEJMLmdldEFsbENhdGVnb3JpZXMoY29tcG9uZW50VHlwZSwgdXNlcklkKTsKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJObyBjYXRlZ29yaWVzIHdlcmUgZm91bmQgZm9yIHR5cGUge30iLCBjb21wb25lbnRUeXBlKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IENvbXBvbmVudCBDYXRlZ29yaWVzIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgQ29tcG9uZW50IENhdGVnb3JpZXMiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0Q29tcG9uZW50Q2F0ZWdvcmllcyBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBQT1NUCisJQFBhdGgoIi9jYXRlZ29yeS97Y29tcG9uZW50VHlwZX0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgbmV3IGNvbXBvbmVudCBjYXRlZ29yeSIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIkNyZWF0ZSBuZXcgY29tcG9uZW50IGNhdGVnb3J5IikKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJDYXRlZ29yeSBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY2F0ZWdvcnkgZGF0YSIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJVU0VSX0lEIGhlYWRlciBpcyBtaXNzaW5nIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJDYXRlZ29yeSBhbHJlYWR5IGV4aXN0cyAvIFVzZXIgbm90IHBlcm1pdHRlZCB0byBwZXJmb3JtIHRoZSBhY3Rpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA1MDAsIG1lc3NhZ2UgPSAiR2VuZXJhbCBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZUNvbXBvbmVudENhdGVnb3J5KAorCQkJQEFwaVBhcmFtKHZhbHVlID0gImFsbG93ZWQgdmFsdWVzIGFyZSByZXNvdXJjZXMgL3NlcnZpY2VzIC8gcHJvZHVjdHMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiICsgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FICsgIiwiCisJCQkJCSsgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVF9QQVJBTV9OQU1FLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0odmFsdWUgPSAiY29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRUeXBlLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gIkNhdGVnb3J5IHRvIGJlIGNyZWF0ZWQiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisJCXRyeSB7CisJCQlFbGVtZW50QnVzaW5lc3NMb2dpYyBlbGVtZW50QkwgPSBnZXRFbGVtZW50QkwocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnkgPSBSZXByZXNlbnRhdGlvblV0aWxzLmZyb21SZXByZXNlbnRhdGlvbihkYXRhLCBDYXRlZ29yeURlZmluaXRpb24uY2xhc3MpOworCisJCQlFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2VDYXRlZ29yeSA9IGVsZW1lbnRCTC5jcmVhdGVDYXRlZ29yeShjYXRlZ29yeSwgY29tcG9uZW50VHlwZSwgdXNlcklkKTsKKwkJCWlmIChjcmVhdGVSZXNvdXJjZUNhdGVnb3J5LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoY3JlYXRlUmVzb3VyY2VDYXRlZ29yeS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGNyZWF0ZVJlc291cmNlQ2F0ZWdvcnkubGVmdCgpLnZhbHVlKCkpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiQ3JlYXRlIHJlc291cmNlIGNhdGVnb3J5Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJDcmVhdGUgcmVzb3VyY2UgY2F0ZWdvcnkiKTsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlUmVzb3VyY2VDYXRlZ29yeSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKworCQl9CisJfQorCisJQERFTEVURQorCUBQYXRoKCIvY2F0ZWdvcnkve2NvbXBvbmVudFR5cGV9L3tjYXRlZ29yeVVuaXF1ZUlkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRlbGV0ZSBjb21wb25lbnQgY2F0ZWdvcnkiLCBodHRwTWV0aG9kID0gIkRFTEVURSIsIG5vdGVzID0gIkRlbGV0ZSBjb21wb25lbnQgY2F0ZWdvcnkiLCByZXNwb25zZSA9IENhdGVnb3J5LmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjA0LCBtZXNzYWdlID0gIkNhdGVnb3J5IGRlbGV0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiVVNFUl9JRCBoZWFkZXIgaXMgbWlzc2luZyIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJVc2VyIG5vdCBwZXJtaXR0ZWQgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJDYXRlZ29yeSBub3QgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA1MDAsIG1lc3NhZ2UgPSAiR2VuZXJhbCBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRlbGV0ZUNvbXBvbmVudENhdGVnb3J5KEBQYXRoUGFyYW0odmFsdWUgPSAiY2F0ZWdvcnlVbmlxdWVJZCIpIGZpbmFsIFN0cmluZyBjYXRlZ29yeVVuaXF1ZUlkLCBAUGF0aFBhcmFtKHZhbHVlID0gImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQl0cnkgeworCQkJRWxlbWVudEJ1c2luZXNzTG9naWMgZWxlbWVudEJMID0gZ2V0RWxlbWVudEJMKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlQ2F0ZWdvcnkgPSBlbGVtZW50QkwuZGVsZXRlQ2F0ZWdvcnkoY2F0ZWdvcnlVbmlxdWVJZCwgY29tcG9uZW50VHlwZSwgdXNlcklkKTsKKworCQkJaWYgKGNyZWF0ZVJlc291cmNlQ2F0ZWdvcnkuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShjcmVhdGVSZXNvdXJjZUNhdGVnb3J5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIG51bGwpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiQ3JlYXRlIHJlc291cmNlIGNhdGVnb3J5Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJDcmVhdGUgcmVzb3VyY2UgY2F0ZWdvcnkiKTsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlUmVzb3VyY2VDYXRlZ29yeSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKworCQl9CisJfQorCisJLyoKKwkgKiAKKwkgKiAKKwkgKiBTVUJDQVRFR09SSUVTCisJICogCisJICovCisKKwlAUE9TVAorCUBQYXRoKCIvY2F0ZWdvcnkve2NvbXBvbmVudFR5cGV9L3tjYXRlZ29yeUlkfS9zdWJDYXRlZ29yeSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBuZXcgY29tcG9uZW50IHN1Yi1jYXRlZ29yeSIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIkNyZWF0ZSBuZXcgY29tcG9uZW50IHN1Yi1jYXRlZ29yeSBmb3IgZXhpc3RpbmcgY2F0ZWdvcnkiKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlN1YmNhdGVnb3J5IGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBzdWJjYXRlZ29yeSBkYXRhIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlVTRVJfSUQgaGVhZGVyIGlzIG1pc3NpbmciKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlBhcmVudCBjYXRlZ29yeSB3YXNuJ3QgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiU3ViY2F0ZWdvcnkgYWxyZWFkeSBleGlzdHMgLyBVc2VyIG5vdCBwZXJtaXR0ZWQgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkdlbmVyYWwgRXJyb3IiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBjcmVhdGVDb21wb25lbnRTdWJDYXRlZ29yeSgKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJhbGxvd2VkIHZhbHVlcyBhcmUgcmVzb3VyY2VzIC8gcHJvZHVjdHMiLCBhbGxvd2FibGVWYWx1ZXMgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRV9QQVJBTV9OQU1FICsgIiwiCisJCQkJCSsgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVF9QQVJBTV9OQU1FLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0odmFsdWUgPSAiY29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRUeXBlLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gIlBhcmVudCBjYXRlZ29yeSB1bmlxdWUgSUQiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0odmFsdWUgPSAiY2F0ZWdvcnlJZCIpIGZpbmFsIFN0cmluZyBjYXRlZ29yeUlkLCBAQXBpUGFyYW0odmFsdWUgPSAiU3ViY2F0ZWdvcnkgdG8gYmUgY3JlYXRlZC4gXG5lLmcuIHtcIm5hbWVcIjpcIlJlc291cmNlLXN1YmNhdFwifSIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJdHJ5IHsKKwkJCUVsZW1lbnRCdXNpbmVzc0xvZ2ljIGVsZW1lbnRCTCA9IGdldEVsZW1lbnRCTChyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeSA9IFJlcHJlc2VudGF0aW9uVXRpbHMuZnJvbVJlcHJlc2VudGF0aW9uKGRhdGEsIFN1YkNhdGVnb3J5RGVmaW5pdGlvbi5jbGFzcyk7CisKKwkJCUVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVTdWJjYXRlZ29yeSA9IGVsZW1lbnRCTC5jcmVhdGVTdWJDYXRlZ29yeShzdWJDYXRlZ29yeSwgY29tcG9uZW50VHlwZSwgY2F0ZWdvcnlJZCwgdXNlcklkKTsKKwkJCWlmIChjcmVhdGVTdWJjYXRlZ29yeS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGNyZWF0ZVN1YmNhdGVnb3J5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGNyZWF0ZVN1YmNhdGVnb3J5LmxlZnQoKS52YWx1ZSgpKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkNyZWF0ZSBzdWItY2F0ZWdvcnkiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkNyZWF0ZSBzdWItY2F0ZWdvcnkiKTsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlQ29tcG9uZW50U3ViQ2F0ZWdvcnkgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisKKwkJfQorCX0KKworCUBERUxFVEUKKwlAUGF0aCgiL2NhdGVnb3J5L3tjb21wb25lbnRUeXBlfS97Y2F0ZWdvcnlVbmlxdWVJZH0vc3ViQ2F0ZWdvcnkve3N1YkNhdGVnb3J5VW5pcXVlSWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRGVsZXRlIGNvbXBvbmVudCBjYXRlZ29yeSIsIGh0dHBNZXRob2QgPSAiREVMRVRFIiwgbm90ZXMgPSAiRGVsZXRlIGNvbXBvbmVudCBjYXRlZ29yeSIsIHJlc3BvbnNlID0gQ2F0ZWdvcnkuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDQsIG1lc3NhZ2UgPSAiQ2F0ZWdvcnkgZGVsZXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJVU0VSX0lEIGhlYWRlciBpcyBtaXNzaW5nIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIlVzZXIgbm90IHBlcm1pdHRlZCB0byBwZXJmb3JtIHRoZSBhY3Rpb24iKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIkNhdGVnb3J5IG5vdCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJHZW5lcmFsIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlQ29tcG9uZW50U3ViQ2F0ZWdvcnkoQFBhdGhQYXJhbSh2YWx1ZSA9ICJjYXRlZ29yeVVuaXF1ZUlkIikgZmluYWwgU3RyaW5nIGNhdGVnb3J5VW5pcXVlSWQsIEBQYXRoUGFyYW0odmFsdWUgPSAic3ViQ2F0ZWdvcnlVbmlxdWVJZCIpIGZpbmFsIFN0cmluZyBzdWJDYXRlZ29yeVVuaXF1ZUlkLAorCQkJQFBhdGhQYXJhbSh2YWx1ZSA9ICJjb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudFR5cGUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQl0cnkgeworCQkJRWxlbWVudEJ1c2luZXNzTG9naWMgZWxlbWVudEJMID0gZ2V0RWxlbWVudEJMKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZVN1YlJlc291cmNlQ2F0ZWdvcnkgPSBlbGVtZW50QkwuZGVsZXRlU3ViQ2F0ZWdvcnkoY2F0ZWdvcnlVbmlxdWVJZCwgc3ViQ2F0ZWdvcnlVbmlxdWVJZCwgY29tcG9uZW50VHlwZSwgdXNlcklkKTsKKwkJCWlmIChkZWxldGVTdWJSZXNvdXJjZUNhdGVnb3J5LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZGVsZXRlU3ViUmVzb3VyY2VDYXRlZ29yeS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBudWxsKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkRlbGV0ZSBjb21wb25lbnQgY2F0ZWdvcnkiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkRlbGV0ZSBjb21wb25lbnQgY2F0ZWdvcnkiKTsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlQ29tcG9uZW50U3ViQ2F0ZWdvcnkgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisKKwkJfQorCX0KKworCS8qCisJICogR1JPVVBJTkdTCisJICovCisJQFBPU1QKKwlAUGF0aCgiL2NhdGVnb3J5L3tjb21wb25lbnRUeXBlfS97Y2F0ZWdvcnlJZH0vc3ViQ2F0ZWdvcnkve3N1YkNhdGVnb3J5SWR9L2dyb3VwaW5nIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIG5ldyBjb21wb25lbnQgZ3JvdXBpbmciLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJDcmVhdGUgbmV3IGNvbXBvbmVudCBncm91cGluZyBmb3IgZXhpc3Rpbmcgc3ViLWNhdGVnb3J5IikKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJHcm91cGluZyBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgZ3JvdXBpbmcgZGF0YSIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJVU0VSX0lEIGhlYWRlciBpcyBtaXNzaW5nIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJQYXJlbnQgY2F0ZWdvcnkgb3Igc3ViY2F0ZWdvcnkgd2VyZSBub3QgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiR3JvdXBpbmcgYWxyZWFkeSBleGlzdHMgLyBVc2VyIG5vdCBwZXJtaXR0ZWQgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJHZW5lcmFsIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgY3JlYXRlQ29tcG9uZW50R3JvdXBpbmcoQEFwaVBhcmFtKHZhbHVlID0gImFsbG93ZWQgdmFsdWVzIGFyZSBwcm9kdWN0cyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1RfUEFSQU1fTkFNRSwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKHZhbHVlID0gImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJQYXJlbnQgY2F0ZWdvcnkgdW5pcXVlIElEIiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKHZhbHVlID0gImNhdGVnb3J5SWQiKSBmaW5hbCBTdHJpbmcgZ3JhbmRQYXJlbnRDYXRlZ29yeUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gIlBhcmVudCBzdWItY2F0ZWdvcnkgdW5pcXVlIElEIiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKHZhbHVlID0gInN1YkNhdGVnb3J5SWQiKSBmaW5hbCBTdHJpbmcgcGFyZW50U3ViQ2F0ZWdvcnlJZCwgQEFwaVBhcmFtKHZhbHVlID0gIlN1YmNhdGVnb3J5IHRvIGJlIGNyZWF0ZWQiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLAorCQkJQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCQl0cnkgeworCQkJRWxlbWVudEJ1c2luZXNzTG9naWMgZWxlbWVudEJMID0gZ2V0RWxlbWVudEJMKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nID0gUmVwcmVzZW50YXRpb25VdGlscy5mcm9tUmVwcmVzZW50YXRpb24oZGF0YSwgR3JvdXBpbmdEZWZpbml0aW9uLmNsYXNzKTsKKworCQkJRWl0aGVyPEdyb3VwaW5nRGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUdyb3VwaW5nID0gZWxlbWVudEJMLmNyZWF0ZUdyb3VwaW5nKGdyb3VwaW5nLCBjb21wb25lbnRUeXBlLCBncmFuZFBhcmVudENhdGVnb3J5SWQsIHBhcmVudFN1YkNhdGVnb3J5SWQsIHVzZXJJZCk7CisJCQlpZiAoY3JlYXRlR3JvdXBpbmcuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShjcmVhdGVHcm91cGluZy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ1JFQVRFRCk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBjcmVhdGVHcm91cGluZy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJDcmVhdGUgZ3JvdXBpbmciKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkNyZWF0ZSBncm91cGluZyIpOworCQkJbG9nLmRlYnVnKCJjcmVhdGVDb21wb25lbnRHcm91cGluZyBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKworCQl9CisJfQorCisJQERFTEVURQorCUBQYXRoKCIvY2F0ZWdvcnkve2NvbXBvbmVudFR5cGV9L3tjYXRlZ29yeVVuaXF1ZUlkfS9zdWJDYXRlZ29yeS97c3ViQ2F0ZWdvcnlVbmlxdWVJZH0vZ3JvdXBpbmcve2dyb3VwaW5nVW5pcXVlSWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiRGVsZXRlIGNvbXBvbmVudCBjYXRlZ29yeSIsIGh0dHBNZXRob2QgPSAiREVMRVRFIiwgbm90ZXMgPSAiRGVsZXRlIGNvbXBvbmVudCBjYXRlZ29yeSIsIHJlc3BvbnNlID0gQ2F0ZWdvcnkuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDQsIG1lc3NhZ2UgPSAiQ2F0ZWdvcnkgZGVsZXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJVU0VSX0lEIGhlYWRlciBpcyBtaXNzaW5nIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIlVzZXIgbm90IHBlcm1pdHRlZCB0byBwZXJmb3JtIHRoZSBhY3Rpb24iKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIkNhdGVnb3J5IG5vdCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJHZW5lcmFsIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlQ29tcG9uZW50R3JvdXBpbmcoQFBhdGhQYXJhbSh2YWx1ZSA9ICJjYXRlZ29yeVVuaXF1ZUlkIikgZmluYWwgU3RyaW5nIGdyYW5kUGFyZW50Q2F0ZWdvcnlVbmlxdWVJZCwgQFBhdGhQYXJhbSh2YWx1ZSA9ICJzdWJDYXRlZ29yeVVuaXF1ZUlkIikgZmluYWwgU3RyaW5nIHBhcmVudFN1YkNhdGVnb3J5VW5pcXVlSWQsCisJCQlAUGF0aFBhcmFtKHZhbHVlID0gImdyb3VwaW5nVW5pcXVlSWQiKSBmaW5hbCBTdHJpbmcgZ3JvdXBpbmdVbmlxdWVJZCwgQFBhdGhQYXJhbSh2YWx1ZSA9ICJjb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudFR5cGUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJdHJ5IHsKKwkJCUVsZW1lbnRCdXNpbmVzc0xvZ2ljIGVsZW1lbnRCTCA9IGdldEVsZW1lbnRCTChyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKwkJCUVpdGhlcjxHcm91cGluZ0RlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVHcm91cGluZyA9IGVsZW1lbnRCTC5kZWxldGVHcm91cGluZyhncmFuZFBhcmVudENhdGVnb3J5VW5pcXVlSWQsIHBhcmVudFN1YkNhdGVnb3J5VW5pcXVlSWQsIGdyb3VwaW5nVW5pcXVlSWQsIGNvbXBvbmVudFR5cGUsIHVzZXJJZCk7CisJCQlpZiAoZGVsZXRlR3JvdXBpbmcuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShkZWxldGVHcm91cGluZy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKHJlc3BvbnNlRm9ybWF0LCBudWxsKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkRlbGV0ZSBjb21wb25lbnQgZ3JvdXBpbmciKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkRlbGV0ZSBjb21wb25lbnQgZ3JvdXBpbmciKTsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlR3JvdXBpbmcgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisKKwkJfQorCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gcmV0cmlldmUgYWxsIHRhZ3MKKwlAR0VUCisJQFBhdGgoIi90YWdzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiUmV0cmlldmUgYWxsIHRhZ3MiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHJpZXZlIGFsbCB0YWdzIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgdGFncyBPayIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJObyB0YWdzIHdlcmUgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA1MDAsIG1lc3NhZ2UgPSAiSW50ZXJuYWwgU2VydmVyIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0VGFncyhAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldFRhZ3MpIFN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQl0cnkgeworCQkJRWxlbWVudEJ1c2luZXNzTG9naWMgZWxlbWVudEJMID0gZ2V0RWxlbWVudEJMKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJRWl0aGVyPExpc3Q8VGFnPiwgQWN0aW9uU3RhdHVzPiBlaXRoZXIgPSBlbGVtZW50QkwuZ2V0QWxsVGFncyh1c2VySWQpOworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkgfHwgZWl0aGVyLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIk5vIHRhZ3Mgd2VyZSBmb3VuZCIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PX0NPTlRFTlQpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBlaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBBbGwgVGFncyIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IEFsbCBUYWdzIik7CisJCQlsb2cuZGVidWcoImdldEFsbFRhZ3MgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHJldHJpZXZlIGFsbCBwcm9wZXJ0eSBzY29wZXMKKwlAR0VUCisJQFBhdGgoIi9wcm9wZXJ0eVNjb3BlcyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlJldHJpZXZlIGFsbCBwcm9wZXJ0eVNjb3BlcyIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0cmlldmUgYWxsIHByb3BlcnR5U2NvcGVzIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgcHJvcGVydHlTY29wZXMgT2siKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiTm8gcHJvcGVydHlTY29wZXMgd2VyZSBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRQcm9wZXJ0eVNjb3BlcyhAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldFByb3BlcnR5U2NvcGVzKSBTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJdHJ5IHsKKwkJCUVsZW1lbnRCdXNpbmVzc0xvZ2ljIGVsZW1lbnRCTCA9IGdldEVsZW1lbnRCTChyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKwkJCUVpdGhlcjxMaXN0PFByb3BlcnR5U2NvcGU+LCBBY3Rpb25TdGF0dXM+IGVpdGhlciA9IGVsZW1lbnRCTC5nZXRBbGxQcm9wZXJ0eVNjb3Blcyh1c2VySWQpOworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkgfHwgZWl0aGVyLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIk5vIHByb3BlcnR5IHNjb3BlcyB3ZXJlIGZvdW5kIik7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IFByb3BlcnR5IFNjb3BlcyBDYXRlZ29yaWVzIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgUHJvcGVydHkgU2NvcGVzIENhdGVnb3JpZXMiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0UHJvcGVydHlTY29wZXMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHJldHJpZXZlIGFsbCBhcnRpZmFjdCB0eXBlcworCUBHRVQKKwlAUGF0aCgiL2FydGlmYWN0VHlwZXMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJSZXRyaWV2ZSBhbGwgYXJ0aWZhY3RUeXBlcyIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0cmlldmUgYWxsIGFydGlmYWN0VHlwZXMiLCByZXNwb25zZSA9IFVzZXIuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUmV0dXJucyBhcnRpZmFjdFR5cGVzIE9rIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIk5vIGFydGlmYWN0VHlwZXMgd2VyZSBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRBcnRpZmFjdFR5cGVzKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCIoZ2V0QXJ0aWZhY3RUeXBlcykgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCXRyeSB7CisJCQlFbGVtZW50QnVzaW5lc3NMb2dpYyBlbGVtZW50QkwgPSBnZXRFbGVtZW50QkwocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCQlFaXRoZXI8TGlzdDxBcnRpZmFjdFR5cGU+LCBBY3Rpb25TdGF0dXM+IGVpdGhlciA9IGVsZW1lbnRCTC5nZXRBbGxBcnRpZmFjdFR5cGVzKHVzZXJJZCk7CisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSB8fCBlaXRoZXIubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiTm8gYXJ0aWZhY3QgdHlwZXMgd2VyZSBmb3VuZCIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PX0NPTlRFTlQpKTsKKwkJCX0gZWxzZSB7CisKKwkJCQlJbnRlZ2VyIGRlZmF1bHRIZWF0VGltZW91dCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldERlZmF1bHRIZWF0QXJ0aWZhY3RUaW1lb3V0TWludXRlcygpOworCQkJCUFydGlmYWN0VHlwZXNJbmZvIHR5cGVzUmVzcG9uc2UgPSBuZXcgQXJ0aWZhY3RUeXBlc0luZm8oKTsKKwkJCQl0eXBlc1Jlc3BvbnNlLnNldEFydGlmYWN0VHlwZXMoZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl0eXBlc1Jlc3BvbnNlLnNldEhlYXREZWZhdWx0VGltZW91dChkZWZhdWx0SGVhdFRpbWVvdXQpOworCisJCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCB0eXBlc1Jlc3BvbnNlKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgQXJ0aWZhY3QgVHlwZXMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBBcnRpZmFjdCBUeXBlcyIpOworCQkJbG9nLmRlYnVnKCJnZXRBcnRpZmFjdFR5cGVzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyByZXRyaWV2ZSBhbGwgYXJ0aWZhY3QgdHlwZXMKKwlAR0VUCisJQFBhdGgoIi9jb25maWd1cmF0aW9uL3VpIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiUmV0cmlldmUgYWxsIGFydGlmYWN0VHlwZXMiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHJpZXZlIGFsbCBhcnRpZmFjdFR5cGVzIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgYXJ0aWZhY3RUeXBlcyBPayIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJObyBhcnRpZmFjdFR5cGVzIHdlcmUgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA1MDAsIG1lc3NhZ2UgPSAiSW50ZXJuYWwgU2VydmVyIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0Q29uZmlndXJhdGlvbihAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldENvbmZpZ3VyYXRpb24pIFN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQl0cnkgeworCQkJRWxlbWVudEJ1c2luZXNzTG9naWMgZWxlbWVudEJMID0gZ2V0RWxlbWVudEJMKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJRWl0aGVyPExpc3Q8QXJ0aWZhY3RUeXBlPiwgQWN0aW9uU3RhdHVzPiBvdGhlckVpdGhlciA9IGVsZW1lbnRCTC5nZXRBbGxBcnRpZmFjdFR5cGVzKHVzZXJJZCk7CisJCQlFaXRoZXI8SW50ZWdlciwgQWN0aW9uU3RhdHVzPiBkZWZhdWx0SGVhdFRpbWVvdXQgPSBlbGVtZW50QkwuZ2V0RGVmYXVsdEhlYXRUaW1lb3V0KCk7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgT2JqZWN0PiwgQWN0aW9uU3RhdHVzPiBkZXBsb3ltZW50RWl0aGVyID0gZWxlbWVudEJMLmdldEFsbERlcGxveW1lbnRBcnRpZmFjdFR5cGVzKCk7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgU3RyaW5nPiwgQWN0aW9uU3RhdHVzPiByZXNvdXJjZVR5cGVzTWFwID0gZWxlbWVudEJMLmdldFJlc291cmNlVHlwZXNNYXAoKTsKKworCQkJaWYgKG90aGVyRWl0aGVyLmlzUmlnaHQoKSB8fCBvdGhlckVpdGhlci5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJObyBvdGhlciBhcnRpZmFjdCB0eXBlcyB3ZXJlIGZvdW5kIik7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCkpOworCQkJfSBlbHNlIGlmIChkZXBsb3ltZW50RWl0aGVyLmlzUmlnaHQoKSB8fCBkZXBsb3ltZW50RWl0aGVyLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIk5vIGRlcGxveW1lbnQgYXJ0aWZhY3QgdHlwZXMgd2VyZSBmb3VuZCIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PX0NPTlRFTlQpKTsKKwkJCX0gZWxzZSBpZiAoZGVmYXVsdEhlYXRUaW1lb3V0LmlzUmlnaHQoKSB8fCBkZWZhdWx0SGVhdFRpbWVvdXQubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiaGVhdCBkZWZhdWx0IHRpbWVvdXQgd2FzIG5vdCBmb3VuZCIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PX0NPTlRFTlQpKTsKKwkJCX0gZWxzZSBpZiAocmVzb3VyY2VUeXBlc01hcC5pc1JpZ2h0KCkgfHwgcmVzb3VyY2VUeXBlc01hcC5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJObyByZXNvdXJjZSB0eXBlcyB3ZXJlIGZvdW5kIik7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTk9fQ09OVEVOVCkpOworCQkJfSBlbHNlIHsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFydGlmYWN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gY29uZmlndXJhdGlvbiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCQkJYXJ0aWZhY3RzLnB1dCgib3RoZXIiLCBvdGhlckVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCQkJYXJ0aWZhY3RzLnB1dCgiZGVwbG95bWVudCIsIGRlcGxveW1lbnRFaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJCWNvbmZpZ3VyYXRpb24ucHV0KCJhcnRpZmFjdHMiLCBhcnRpZmFjdHMpOworCQkJCWNvbmZpZ3VyYXRpb24ucHV0KCJkZWZhdWx0SGVhdFRpbWVvdXQiLCBkZWZhdWx0SGVhdFRpbWVvdXQubGVmdCgpLnZhbHVlKCkpOworCQkJCWNvbmZpZ3VyYXRpb24ucHV0KCJjb21wb25lbnRUeXBlcyIsIGVsZW1lbnRCTC5nZXRBbGxDb21wb25lbnRUeXBlc1BhcmFtTmFtZXMoKSk7CisJCQkJY29uZmlndXJhdGlvbi5wdXQoInJvbGVzIiwgZWxlbWVudEJMLmdldEFsbFN1cHBvcnRlZFJvbGVzKCkpOworCQkJCWNvbmZpZ3VyYXRpb24ucHV0KCJyZXNvdXJjZVR5cGVzIiwgcmVzb3VyY2VUeXBlc01hcC5sZWZ0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBjb25maWd1cmF0aW9uKTsKKwkJCX0KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBBcnRpZmFjdCBUeXBlcyIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IEFydGlmYWN0IFR5cGVzIik7CisJCQlsb2cuZGVidWcoImdldEFydGlmYWN0VHlwZXMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHJldHJpZXZlIGFsbCBmb2xsb3dlZCByZXNvdXJjZXMgYW5kIHNlcnZpY2VzCisJQEdFVAorCUBQYXRoKCIvZm9sbG93ZWQiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJSZXRyaWV2ZSBhbGwgZm9sbG93ZWQiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHJpZXZlIGFsbCBmb2xsb3dlZCIsIHJlc3BvbnNlID0gVXNlci5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXR1cm5zIGZvbGxvd2VkIE9rIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIk5vIGZvbGxvd2VkIHdlcmUgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiVXNlciBub3QgZm91bmQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldEZvbGxvd2VkUmVzb3VyY2VzU2VydmljZXMoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVJlc3BvbnNlIHJlcyA9IG51bGw7CisJCVVzZXIgdXNlckRhdGEgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQkJVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluTWFuYWdlciA9IGdldFVzZXJBZG1pbk1hbmFnZXIocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisKKwkJCS8vIEdldHRpbmcgdGhlIHVzZXIKKwkJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlciA9IHVzZXJBZG1pbk1hbmFnZXIuZ2V0VXNlcih1c2VySWQsIGZhbHNlKTsKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJLy8gQ291bGRuJ3QgZmluZCBvciBvdGhlcndpc2UgZmV0Y2ggdGhlIHVzZXIKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0QnlVc2VySWQoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSwgdXNlcklkKSk7CisJCQl9CisKKwkJCWlmIChlaXRoZXIubGVmdCgpLnZhbHVlKCkgIT0gbnVsbCkgeworCQkJCXVzZXJEYXRhID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PD8gZXh0ZW5kcyBDb21wb25lbnQ+PiwgUmVzcG9uc2VGb3JtYXQ+IGZvbGxvd2VkUmVzb3VyY2VzU2VydmljZXMgPSBnZXRFbGVtZW50QkwocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSkuZ2V0Rm9sbG93ZWQodXNlckRhdGEpOworCQkJCS8vIHJlcyA9CisJCQkJLy8gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksCisJCQkJLy8gZm9sbG93ZWRSZXNvdXJjZXNTZXJ2aWNlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJaWYgKGZvbGxvd2VkUmVzb3VyY2VzU2VydmljZXMuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBmb2xsb3dlZCByZXNvdXJjZXMgc2VydmljZXMgIik7CisJCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZm9sbG93ZWRSZXNvdXJjZXNTZXJ2aWNlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlPYmplY3QgZGF0YSA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihmb2xsb3dlZFJlc291cmNlc1NlcnZpY2VzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQlyZXMgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgZGF0YSk7CisJCQl9IGVsc2UgeworCQkJCXJlcyA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBGb2xsb3dlZCBSZXNvdXJjZXMgLyBTZXJ2aWNlcyBDYXRlZ29yaWVzIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgRm9sbG93ZWQgUmVzb3VyY2VzIC8gU2VydmljZXMgQ2F0ZWdvcmllcyIpOworCQkJbG9nLmRlYnVnKCJHZXR0aW5nIGZvbGxvd2VkIHJlc291cmNlcy9zZXJ2aWNlcyBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlcyA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyByZXRyaWV2ZSBhbGwgY2VydGlmaWVkIHJlc291cmNlcyBhbmQgc2VydmljZXMgYW5kIHRoZWlyIGxhc3QgdmVyc2lvbgorCUBHRVQKKwlAUGF0aCgiL3NjcmVlbiIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlJldHJpZXZlIGNhdGFsb2cgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcyIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0cmlldmUgY2F0YWxvZyByZXNvdXJjZXMgYW5kIHNlcnZpY2VzIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcyBPayIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJObyByZXNvdXJjZXMgYW5kIHNlcnZpY2VzIHdlcmUgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiVXNlciBub3QgZm91bmQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldENhdGFsb2dDb21wb25lbnRzKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlSZXNwb25zZSByZXMgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgQ29tcG9uZW50Pj4sIFJlc3BvbnNlRm9ybWF0PiBjYXRhbG9nRGF0YSA9IGdldEVsZW1lbnRCTChyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKS5nZXRDYXRhbG9nQ29tcG9uZW50cyh1c2VySWQpOworCisJCQlpZiAoY2F0YWxvZ0RhdGEuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGNhdGFsb2cgZGF0YSIpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoY2F0YWxvZ0RhdGEucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCU9iamVjdCBkYXRhID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGNhdGFsb2dEYXRhLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJlcyA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBkYXRhKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBDYXRhbG9nIENvbXBvbmVudHMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBDYXRhbG9nIENvbXBvbmVudHMiKTsKKwkJCWxvZy5kZWJ1ZygiR2V0dGluZyBjYXRhbG9nIGNvbXBvbmVudHMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXMgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworCUBERUxFVEUKKwlAUGF0aCgiL2luYWN0aXZlQ29tcG9uZW50cy97Y29tcG9uZW50VHlwZX0iKQorCXB1YmxpYyBSZXNwb25zZSBkZWxldGVNYXJrZWRSZXNvdXJjZXMoQFBhdGhQYXJhbSgiY29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRUeXBlLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCS8vIGdldCBtb2RpZmllciBpZAorCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLmdldEJ5TmFtZUlnbm9yZUNhc2UoY29tcG9uZW50VHlwZSk7CisJCWlmIChub2RlVHlwZSA9PSBudWxsKSB7CisJCQlsb2cuaW5mbygiY29tcG9uZW50VHlwZSBpcyBub3QgdmFsaWQ6IHt9IiwgY29tcG9uZW50VHlwZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpKTsKKwkJfQorCisJCUxpc3Q8Tm9kZVR5cGVFbnVtPiBjb21wb25lbnRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Tm9kZVR5cGVFbnVtPigpOworCQljb21wb25lbnRzTGlzdC5hZGQobm9kZVR5cGUpOworCQl0cnkgeworCQkJQ29tcG9uZW50c0NsZWFuQnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0Q29tcG9uZW50Q2xlYW5lckJMKGNvbnRleHQpOworCQkJTWFwPE5vZGVUeXBlRW51bSwgRWl0aGVyPExpc3Q8U3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+PiBjbGVhbkNvbXBvbmVudHNSZXN1bHQgPSBidXNpbmVzc0xvZ2ljLmNsZWFuQ29tcG9uZW50cyhjb21wb25lbnRzTGlzdCk7CisJCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gY2xlYW5SZXN1bHQgPSBjbGVhbkNvbXBvbmVudHNSZXN1bHQuZ2V0KG5vZGVUeXBlKTsKKworCQkJaWYgKGNsZWFuUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSBtYXJrZWQgY29tcG9uZW50cyBvZiB0eXBlIHt9Iiwgbm9kZVR5cGUpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGNsZWFuUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgY2xlYW5SZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiRGVsZXRlIE1hcmtlZCBDb21wb25lbnRzIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJEZWxldGUgTWFya2VkIENvbXBvbmVudHMiKTsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlIG1hcmtlZCBjb21wb25lbnRzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIvZWNvbXBQb3J0YWxNZW51IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiUmV0cmlldmUgZWNvbXAgcG9ydGFsIG1lbnUgLSBNT0MiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHJpZXZlIGVjb21wIHBvcnRhbCBtZW51IiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHJpZXZlIGVjb21wIHBvcnRhbCBtZW51IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0TGlzdE9mQ3NhcnMoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLAorCQkJCSJbe1wibWVudUlkXCI6MSxcImNvbHVtblwiOjIsXCJ0ZXh0XCI6XCJEZXNpZ25cIixcInBhcmVudE1lbnVJZFwiOm51bGwsXCJ1cmxcIjpcIlwiLFwiYXBwaWRcIjpudWxsLFwicm9sZXNcIjpudWxsLFwiY2hpbGRyZW5cIjpbe1wibWVudUlkXCI6MTEsXCJjb2x1bW5cIjoxLFwidGV4dFwiOlwiUHJvZHVjdERlc2lnblwiLFwicGFyZW50TWVudUlkXCI6MSxcInVybFwiOlwiXCIsXCJhcHBpZFwiOm51bGwsXCJyb2xlc1wiOm51bGx9LHtcIm1lbnVJZFwiOjEyLFwiY29sdW1uXCI6MixcInRleHRcIjpcIlNlcnZpY2VcIixcInBhcmVudE1lbnVJZFwiOjEsXCJ1cmxcIjpcIlwiLFwiYXBwaWRcIjpudWxsLFwicm9sZXNcIjpudWxsLFwiY2hpbGRyZW5cIjpbe1wibWVudUlkXCI6MjEsXCJjb2x1bW5cIjoxLFwidGV4dFwiOlwiVmlld1BvbGljaWVzXCIsXCJwYXJlbnRNZW51SWRcIjoxMixcInVybFwiOlwiXCIsXCJhcHBpZFwiOm51bGwsXCJyb2xlc1wiOm51bGwsXCJjaGlsZHJlblwiOlt7XCJtZW51SWRcIjo5MCxcImNvbHVtblwiOjEsXCJ0ZXh0XCI6XCI0dGhMZXZlbEFwcDFhUjE2XCIsXCJwYXJlbnRNZW51SWRcIjoyMSxcInVybFwiOlwiaHR0cDovL2dvb2dsZS5jb21cIixcImFwcGlkXCI6bnVsbCxcInJvbGVzXCI6bnVsbH1dfSx7XCJtZW51SWRcIjoyMixcImNvbHVtblwiOjIsXCJ0ZXh0XCI6XCJVcGRhdGVQb2xpY2llc1wiLFwicGFyZW50TWVudUlkXCI6MTIsXCJ1cmxcIjpcIlwiLFwiYXBwaWRcIjpudWxsLFwicm9sZXNcIjpudWxsLFwiY2hpbGRyZW5cIjpbe1wibWVudUlkXCI6OTEsXCJjb2x1bW5cIjoxLFwidGV4dFwiOlwiNHRoTGV2ZWxBcHAxYlIxNlwiLFwicGFyZW50TWVudUlkXCI6MjIsXCJ1cmxcIjpcImh0dHA6Ly9qc29ubGludC5jb20vXCIsXCJhcHBpZFwiOm51bGwsXCJyb2xlc1wiOm51bGx9XX0se1wibWVudUlkXCI6MjMsXCJjb2x1bW5cIjozLFwidGV4dFwiOlwiVXBkYXRlUnVsZXNcIixcInBhcmVudE1lbnVJZFwiOjEyLFwidXJsXCI6XCJcIixcImFwcGlkXCI6bnVsbCxcInJvbGVzXCI6bnVsbH0se1wibWVudUlkXCI6MjQsXCJjb2x1bW5cIjo0LFwidGV4dFwiOlwiQ3JlYXRlU2lnbmF0dXJlcz9cIixcInBhcmVudE1lbnVJZFwiOjEyLFwidXJsXCI6XCJcIixcImFwcGlkXCI6bnVsbCxcInJvbGVzXCI6bnVsbH0se1wibWVudUlkXCI6MjUsXCJjb2x1bW5cIjo1LFwidGV4dFwiOlwiRGVmaW5lZGF0YVwiLFwicGFyZW50TWVudUlkXCI6MTIsXCJ1cmxcIjpcIlwiLFwiYXBwaWRcIjpudWxsLFwicm9sZXNcIjpudWxsfV19XX1dIik7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvR3JvdXBTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvR3JvdXBTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlOGY5MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Hcm91cFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Hcm91cEJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm8uR3JvdXBEZWZpbml0aW9uSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUGFyYW07CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKioKKyAqIFJvb3QgcmVzb3VyY2UgKGV4cG9zZWQgYXQgIi8iIHBhdGgpCisgKi8KK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi92MS9jYXRhbG9nIikKK0BBcGkodmFsdWUgPSAiUmVzb3VyY2UgR3JvdXAgU2VydmxldCIsIGRlc2NyaXB0aW9uID0gIlJlc291cmNlIEdyb3VwIFNlcnZsZXQiKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEdyb3VwU2VydmxldCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbnNTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihHcm91cFNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCUBHRVQKKwlAUGF0aCgiL3tjb250YWluZXJDb21wb25lbnRUeXBlfS97Y29tcG9uZW50SWR9L2dyb3Vwcy97Z3JvdXBJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJHZXQgZ3JvdXAgYXJ0aWZhY3RzICIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyBhcnRpZmFjdHMgbWV0YWRhdGEgYWNjb3JkaW5nIHRvIGdyb3VwSWQiLCByZXNwb25zZSA9IFJlc291cmNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gImdyb3VwIGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIkdyb3VwIG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldEdyb3VwQXJ0aWZhY3RCeUlkKEBQYXRoUGFyYW0oImNvbnRhaW5lckNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50VHlwZSwgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBQYXRoUGFyYW0oImdyb3VwSWQiKSBmaW5hbCBTdHJpbmcgZ3JvdXBJZCwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldCkgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJR3JvdXBCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSB0aGlzLmdldEdyb3VwQkwoY29udGV4dCk7CisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb250YWluZXJDb21wb25lbnRUeXBlKTsKKwkJCUVpdGhlcjxHcm91cERlZmluaXRpb25JbmZvLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmdldEdyb3VwV2l0aEFydGlmYWN0c0J5SWQoY29tcG9uZW50VHlwZUVudW0sIGNvbXBvbmVudElkLCBncm91cElkLCB1c2VySWQsIGZhbHNlKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBhbGwgbm9uIGFic3RyYWN0IHt9IiwgY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImdldEdyb3VwQXJ0aWZhY3RCeUlkIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJnZXRHcm91cEFydGlmYWN0QnlJZCIpOworCQkJbG9nLmRlYnVnKCJnZXRHcm91cEFydGlmYWN0QnlJZCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisKKwl9CisKKwlAUFVUCisJQFBhdGgoIi97Y29udGFpbmVyQ29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9ncm91cHMve2dyb3VwVW5pcXVlSWR9L21ldGFkYXRhIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIEdyb3VwIE1ldGFkYXRhIiwgaHR0cE1ldGhvZCA9ICJQVVQiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgZ3JvdXAgZGVmaW5pdGlvbiIsIHJlc3BvbnNlID0gR3JvdXBEZWZpbml0aW9uLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkdyb3VwIFVwZGF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlR3JvdXBNZXRhZGF0YShAUGF0aFBhcmFtKCJjb250YWluZXJDb21wb25lbnRUeXBlIikgZmluYWwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudFR5cGUsIEBQYXRoUGFyYW0oImNvbXBvbmVudElkIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudElkLCBAUGF0aFBhcmFtKCJncm91cFVuaXF1ZUlkIikgZmluYWwgU3RyaW5nIGdyb3VwVW5pcXVlSWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAiU2VydmljZSBvYmplY3QgdG8gYmUgVXBkYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlHcm91cEJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldEdyb3VwQkwoY29udGV4dCk7CisKKwkJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0UmVzcG9uc2UgPSBwYXJzZVRvR3JvdXAoZGF0YSk7CisJCQlpZiAoY29udmVydFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHBhcnNlIGdyb3VwIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoY29udmVydFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJR3JvdXBEZWZpbml0aW9uIHVwZGF0ZWRHcm91cCA9IGNvbnZlcnRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJLy8gVXBkYXRlIEdyb3VwRGVmaW5pdGlvbgorCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29udGFpbmVyQ29tcG9uZW50VHlwZSk7CisJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLnVwZGF0ZUdyb3VwTWV0YWRhdGEoY29tcG9uZW50SWQsIHVzZXIsIGdyb3VwVW5pcXVlSWQsIGNvbXBvbmVudFR5cGVFbnVtLCB1cGRhdGVkR3JvdXAsIHRydWUpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIEdyb3VwRGVmaW5pdGlvbiIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCisJCQlHcm91cERlZmluaXRpb24gZ3JvdXAgPSBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCU9iamVjdCByZXN1bHQgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oZ3JvdXApOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVXBkYXRlIEdyb3VwIE1ldGFkYXRhIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJVcGRhdGUgR3JvdXAgTWV0YWRhdGEiKTsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlIGdyb3VwIG1ldGFkYXRhIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJLyoqCisJICogQ29udmVydCBkYXRhIHRvIEdyb3VwRGVmaW5pdGlvbiBvYmplY3QKKwkgKiAKKwkgKiBAcGFyYW0gZ3JvdXBKc29uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBSZXNwb25zZUZvcm1hdD4gcGFyc2VUb0dyb3VwKFN0cmluZyBncm91cEpzb24pIHsKKwkJdHJ5IHsKKwkJCUdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCQlHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uID0gZ3Nvbi5mcm9tSnNvbihncm91cEpzb24sIEdyb3VwRGVmaW5pdGlvbi5jbGFzcyk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZ3JvdXBEZWZpbml0aW9uKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHBhcnNlIGpzb24gKGdyb3VwIGRhdGEpIHRvIEdyb3VwRGVmaW5pdGlvbiBvYmplY3QiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9JbnB1dHNTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvSW5wdXRzU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzVjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvSW5wdXRzU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMzIwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLklucHV0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdElucHV0c01hcDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUlucHV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW5wdXREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVBhcmFtOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2U7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZXM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NhdGFsb2ciKQorQEFwaSh2YWx1ZSA9ICJJbnB1dCBDYXRhbG9nIiwgZGVzY3JpcHRpb24gPSAiSW5wdXQgU2VydmxldCIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgSW5wdXRzU2VydmxldCBleHRlbmRzIEJlR2VuZXJpY1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2R1Y3RTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlAR0VUCisJQFBhdGgoIi9zZXJ2aWNlcy97Y29tcG9uZW50SWR9L2lucHV0cyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkdldCBJbnB1dHMgb25seSIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyBJbnB1dHMgbGlzdCIsIHJlc3BvbnNlID0gUmVzb3VyY2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQ29tcG9uZW50IGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIkNvbXBvbmVudCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRDb21wb25lbnRJbnB1dHMoQFBhdGhQYXJhbSgiY29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRUeXBlLCBAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBRdWVyeVBhcmFtKCJmcm9tSWQiKSBTdHJpbmcgZnJvbU5hbWUsCisJCQlAUXVlcnlQYXJhbSgiYW1vdW50IikgaW50IGFtb3VudCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldCkgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJSW5wdXRzQnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0SW5wdXRCTChjb250ZXh0KTsKKworCQkJRWl0aGVyPExpc3Q8SW5wdXREZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGlucHV0c1Jlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy5nZXRJbnB1dHModXNlcklkLCBjb21wb25lbnRJZCwgZnJvbU5hbWUsIGFtb3VudCk7CisJCQlpZiAoaW5wdXRzUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGlucHV0cyB7fSIsIGNvbXBvbmVudFR5cGUpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoaW5wdXRzUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCU9iamVjdCBpbnB1dHMgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oaW5wdXRzUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBpbnB1dHMpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IENvbXBvbmVudCBJbnN0YW5jZSBJbnB1dHMiICsgY29tcG9uZW50VHlwZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgSW5wdXRzIiArIGNvbXBvbmVudFR5cGUpOworCQkJbG9nLmRlYnVnKCJnZXRJbnB1dHMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9jb21wb25lbnRJbnN0YW5jZXMve2luc3RhbmNlSWR9L3tvcmlnaW5Db21vbmVudFVpZH0vaW5wdXRzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiR2V0IElucHV0cyBvbmx5IiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIElucHV0cyBsaXN0IiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJDb21wb25lbnQgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQ29tcG9uZW50IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzKEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBQYXRoUGFyYW0oImluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgaW5zdGFuY2VJZCwKKwkJCUBQYXRoUGFyYW0oIm9yaWdpbkNvbW9uZW50VWlkIikgZmluYWwgU3RyaW5nIG9yaWdpbkNvbW9uZW50VWlkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQFF1ZXJ5UGFyYW0oImZyb21OYW1lIikgU3RyaW5nIGZyb21OYW1lLCBAUXVlcnlQYXJhbSgiYW1vdW50IikgaW50IGFtb3VudCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIihnZXQpIFN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlJbnB1dHNCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRJbnB1dEJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gaW5wdXRzUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmdldElucHV0cyh1c2VySWQsIG9yaWdpbkNvbW9uZW50VWlkLCBmcm9tTmFtZSwgYW1vdW50KTsKKwkJCWlmIChpbnB1dHNSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgY29tcG9uZW50IGluc3RhbmNlIGlucHV0cyB7fSIsIGNvbXBvbmVudFR5cGUpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoaW5wdXRzUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCU9iamVjdCBpbnB1dHMgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oaW5wdXRzUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBpbnB1dHMpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IENvbXBvbmVudCBJbnN0YW5jZSBJbnB1dHMiICsgY29tcG9uZW50VHlwZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgSW5wdXRzIiArIGNvbXBvbmVudFR5cGUpOworCQkJbG9nLmRlYnVnKCJnZXRJbnB1dHMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9jb21wb25lbnRJbnN0YW5jZXMve2luc3RhbmNlSWR9L3tpbnB1dElkfS9wcm9wZXJ0aWVzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiR2V0IHByb3BlcnRpZXMiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgcHJvcGVydGllcyBsaXN0IiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJDb21wb25lbnQgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQ29tcG9uZW50IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldElucHV0UHJvcGVydGllc0ZvckNvbXBvbmVudEluc3RhbmNlKEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBQYXRoUGFyYW0oImluc3RhbmNlSWQiKSBmaW5hbCBTdHJpbmcgaW5zdGFuY2VJZCwKKwkJCUBQYXRoUGFyYW0oImlucHV0SWQiKSBmaW5hbCBTdHJpbmcgaW5wdXRJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIihnZXQpIFN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlJbnB1dHNCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRJbnB1dEJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgUmVzcG9uc2VGb3JtYXQ+IGlucHV0UHJvcGVydGllc1JlcyA9IGJ1c2luZXNzTG9naWMuZ2V0Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0aWVzQnlJbnB1dElkKHVzZXJJZCwgaW5zdGFuY2VJZCwgaW5wdXRJZCk7CisJCQlpZiAoaW5wdXRQcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0OiB7fSwgd2l0aCBpbnN0YW5jZSBpZDoge30iLCBpbnB1dElkLCBpbnN0YW5jZUlkKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGlucHV0UHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJT2JqZWN0IHByb3BlcnRpZXMgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oaW5wdXRQcm9wZXJ0aWVzUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcHJvcGVydGllcyk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgcHJvcGVydGllcyBieSBpbnB1dCBpZCB7fSwgZm9yIGNvbXBvbmVudCBpbnN0YW5jZSB7fSAiLCBpbnB1dElkLCBpbnN0YW5jZUlkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBQcm9wZXJpdGVzIGJ5IGlucHV0IGlkOiAiICsgaW5wdXRJZCArICIgZm9yIGluc3RhbmNlIHdpdGggaWQ6ICIgKyBpbnN0YW5jZUlkKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0SW5wdXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50SW5zdGFuY2UgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9pbnB1dHMve2lucHV0SWR9L2lucHV0cyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkdldCBpbnB1dHMiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgaW5wdXRzIGxpc3QiLCByZXNwb25zZSA9IFJlc291cmNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIkNvbXBvbmVudCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJDb21wb25lbnQgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0SW5wdXRzRm9yQ29tcG9uZW50SW5wdXQoQFBhdGhQYXJhbSgiY29tcG9uZW50VHlwZSIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRUeXBlLCBAUGF0aFBhcmFtKCJjb21wb25lbnRJZCIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRJZCwgQFBhdGhQYXJhbSgiaW5wdXRJZCIpIGZpbmFsIFN0cmluZyBpbnB1dElkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIihnZXQpIFN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlJbnB1dHNCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRJbnB1dEJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgUmVzcG9uc2VGb3JtYXQ+IGlucHV0c1JlcyA9IGJ1c2luZXNzTG9naWMuZ2V0SW5wdXRzRm9yQ29tcG9uZW50SW5wdXQodXNlcklkLCBjb21wb25lbnRJZCwgaW5wdXRJZCk7CisJCQlpZiAoaW5wdXRzUmVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBpbnB1dHMgb2YgaW5wdXQ6IHt9LCB3aXRoIGluc3RhbmNlIGlkOiB7fSIsIGlucHV0SWQsIGNvbXBvbmVudElkKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGlucHV0c1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJT2JqZWN0IHByb3BlcnRpZXMgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oaW5wdXRzUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcHJvcGVydGllcyk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgaW5wdXRzIGJ5IGlucHV0IGlkIHt9LCBmb3IgY29tcG9uZW50IHt9ICIsIGlucHV0SWQsIGNvbXBvbmVudElkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBpbnB1dHMgYnkgaW5wdXQgaWQ6ICIgKyBpbnB1dElkICsgIiBmb3IgY29tcG9uZW50IHdpdGggaWQ6ICIgKyBjb21wb25lbnRJZCk7CisJCQlsb2cuZGVidWcoImdldElucHV0c0ZvckNvbXBvbmVudElucHV0IGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0SW5wdXRzTWFwLCBSZXNwb25zZUZvcm1hdD4gcGFyc2VUb0NvbXBvbmVudEluc3RhbmNlTWFwKFN0cmluZyBzZXJ2aWNlSnNvbiwgVXNlciB1c2VyKSB7CisJCXJldHVybiBnZXRDb21wb25lbnRzVXRpbHMoKS5jb252ZXJ0SnNvblRvT2JqZWN0VXNpbmdPYmplY3RNYXBwZXIoc2VydmljZUpzb24sIHVzZXIsIENvbXBvbmVudEluc3RJbnB1dHNNYXAuY2xhc3MsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCX0KKworCUBQT1NUCisJQFBhdGgoIi97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudElkfS9jcmVhdGUvaW5wdXRzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIGlucHV0cyBvbiBzZXJ2aWNlIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJuIGlucHV0cyBsaXN0IiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJDb21wb25lbnQgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiQ29tcG9uZW50IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZU11bHRpcGxlSW5wdXRzKEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQFBhdGhQYXJhbSgiY29tcG9uZW50SWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50SWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkLCBAQXBpUGFyYW0odmFsdWUgPSAiQ29tcG9uZW50SW5zIElucHV0cyBPYmplY3QgdG8gYmUgY3JlYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGNvbXBvbmVudEluc3RJbnB1dHNNYXBPYmopIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCIoZ2V0KSBTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCQkJSW5wdXRzQnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0SW5wdXRCTChjb250ZXh0KTsKKworCQkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0SW5wdXRzTWFwLCBSZXNwb25zZUZvcm1hdD4gY29tcG9uZW50SW5zdElucHV0c01hcFJlcyA9IHBhcnNlVG9Db21wb25lbnRJbnN0YW5jZU1hcChjb21wb25lbnRJbnN0SW5wdXRzTWFwT2JqLCBtb2RpZmllcik7CisJCQlpZiAoY29tcG9uZW50SW5zdElucHV0c01hcFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBwYXJzZSBjb21wb25lbnRJbnN0SW5wdXRzTWFwIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoY29tcG9uZW50SW5zdElucHV0c01hcFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKworCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBDb21wb25lbnRUeXBlRW51bS5maW5kQnlQYXJhbU5hbWUoY29tcG9uZW50VHlwZSk7CisJCQlDb21wb25lbnRJbnN0SW5wdXRzTWFwIGNvbXBvbmVudEluc3RJbnB1dHNNYXAgPSBjb21wb25lbnRJbnN0SW5wdXRzTWFwUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gaW5wdXRQcm9wZXJ0aWVzUmVzID0gYnVzaW5lc3NMb2dpYy5jcmVhdGVNdWx0aXBsZUlucHV0cyh1c2VySWQsIGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlRW51bSwgY29tcG9uZW50SW5zdElucHV0c01hcCwgdHJ1ZSwgZmFsc2UpOworCQkJaWYgKGlucHV0UHJvcGVydGllc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjcmVhdGUgaW5wdXRzICBmb3Igc2VydmljZToge30iLCBjb21wb25lbnRJZCk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShpbnB1dFByb3BlcnRpZXNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCU9iamVjdCBwcm9wZXJ0aWVzID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGlucHV0UHJvcGVydGllc1Jlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHByb3BlcnRpZXMpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiQ3JlYXRlIGlucHV0cyBmb3Igc2VydmljZSB3aXRoIGlkOiB7fSIsIGNvbXBvbmVudElkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkNyZWF0ZSBpbnB1dHMgZm9yIHNlcnZpY2Ugd2l0aCBpZDogIiArIGNvbXBvbmVudElkKTsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlTXVsdGlwbGVJbnB1dHMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisJCisJQERFTEVURQorCUBQYXRoKCIve2NvbXBvbmVudFR5cGV9L3tjb21wb25lbnRJZH0vZGVsZXRlL3tpbnB1dElkfS9pbnB1dCIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRlbGV0ZSBpbnB1dCBmcm9tIHNlcnZpY2UiLCBodHRwTWV0aG9kID0gIkRFTEVURSIsIG5vdGVzID0gIkRlbGV0ZSBzZXJ2aWNlIGlucHV0IiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJJbnB1dCBkZWxldGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIklucHV0IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRlbGV0ZUlucHV0ICgKKwkJCUBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwKKwkJCUBQYXRoUGFyYW0oImNvbXBvbmVudElkIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudElkLAorCQkJQFBhdGhQYXJhbSgiaW5wdXRJZCIpIGZpbmFsIFN0cmluZyBpbnB1dElkLAorICAgICAgICAgICAgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsCisgICAgICAgICAgICBAQXBpUGFyYW0odmFsdWUgPSAiU2VydmljZSBJbnB1dCB0byBiZSBkZWxldGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgY29tcG9uZW50SW5zdElucHV0c01hcE9iaikgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIihnZXQpIFN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlJbnB1dHNCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRJbnB1dEJMKGNvbnRleHQpOworCQkJRWl0aGVyPElucHV0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZUlucHV0ID0gYnVzaW5lc3NMb2dpYy5kZWxldGVJbnB1dChjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCwgdXNlcklkLCBpbnB1dElkLCB0cnVlKTsKKwkJCWlmIChkZWxldGVJbnB1dC5pc1JpZ2h0KCkpeworCQkJCVJlc3BvbnNlRm9ybWF0IGRlbGV0ZVJlc3BvbnNlRm9ybWF0ID0gZGVsZXRlSW5wdXQucmlnaHQoKS52YWx1ZSgpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGRlbGV0ZVJlc3BvbnNlRm9ybWF0KTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CQkKKwkJCUlucHV0RGVmaW5pdGlvbiBpbnB1dERlZmluaXRpb24gPSBkZWxldGVJbnB1dC5sZWZ0KCkudmFsdWUoKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgaW5wdXREZWZpbml0aW9uKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkRlbGV0ZSBpbnB1dCBmb3Igc2VydmljZSB7fSB3aXRoIGlkOiB7fSIsIGNvbXBvbmVudElkLCBpbnB1dElkKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkRlbGV0ZSBpbnB1dCBmb3Igc2VydmljZSArICIgKyBjb21wb25lbnRJZCArICIgKyB3aXRoIGlkOiAiICsgaW5wdXRJZCk7CisJCQlsb2cuZGVidWcoIkRlbGV0ZSBpbnB1dCBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfQorCX0KKworCXByb3RlY3RlZCBJbnB1dHNCdXNpbmVzc0xvZ2ljIGdldElucHV0QkwoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlJbnB1dHNCdXNpbmVzc0xvZ2ljIGlucHV0c0J1c2luZXNzTG9naWMgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihJbnB1dHNCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwkJcmV0dXJuIGlucHV0c0J1c2luZXNzTG9naWM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvTGlmZWN5Y2xlU2VydmxldC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0xpZmVjeWNsZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhiZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0xpZmVjeWNsZVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZS5MaWZlY3ljbGVDaGFuZ2VJbmZvQmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZS5MaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUGFyYW07CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvY2F0YWxvZyIpCitAQXBpKHZhbHVlID0gIkxpZmVjeWNsZSBBY3Rpb25zIFNlcnZsZXQiLCBkZXNjcmlwdGlvbiA9ICJMaWZlY3ljbGUgQWN0aW9ucyBTZXJ2bGV0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVTZXJ2bGV0IGV4dGVuZHMgQmVHZW5lcmljU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGlmZWN5Y2xlU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQFBPU1QKKwlAUGF0aCgiL3tjb21wb25lbnRDb2xsZWN0aW9ufS97Y29tcG9uZW50SWR9L2xpZmVjeWNsZVN0YXRlL3tsaWZlY3ljbGVPcGVyYXRpb259IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ2hhbmdlIFJlc291cmNlIGxpZmVjeWNsZSBTdGF0ZSIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUmVzb3VyY2Ugc3RhdGUgY2hhbmdlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJSZXNvdXJjZSBhbHJlYWR5IGV4aXN0IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgY2hhbmdlUmVzb3VyY2VTdGF0ZShAQXBpUGFyYW0odmFsdWUgPSAiTGlmZWN5Y2xlQ2hhbmdlSW5mbyAtIHJlbGV2YW50IGZvciBjaGVja2luLCBmYWlsQ2VydGlmaWNhdGlvbiwgY2FuY2VsQ2VydGlmaWNhdGlvbiIsIHJlcXVpcmVkID0gZmFsc2UpIFN0cmluZyBqc29uQ2hhbmdlSW5mbywKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZFZhbHVlczogcmVzb3VyY2VzIC8gc2VydmljZXMgLyBwcm9kdWN0cyIsIGFsbG93YWJsZVZhbHVlcyA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFX1BBUkFNX05BTUUgKyAiLCIgKyBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFX1BBUkFNX05BTUUgKyAiLCIKKwkJCQkJKyBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUX1BBUkFNX05BTUUpIEBQYXRoUGFyYW0odmFsdWUgPSAiY29tcG9uZW50Q29sbGVjdGlvbiIpIGZpbmFsIFN0cmluZyBjb21wb25lbnRDb2xsZWN0aW9uLAorCQkJQEFwaVBhcmFtKGFsbG93YWJsZVZhbHVlcyA9ICJjaGVja291dCwgdW5kb0NoZWNrb3V0LCBjaGVja2luLCBjZXJ0aWZpY2F0aW9uUmVxdWVzdCwgc3RhcnRDZXJ0aWZpY2F0aW9uLCBmYWlsQ2VydGlmaWNhdGlvbiwgIGNhbmNlbENlcnRpZmljYXRpb24sIGNlcnRpZnkiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0odmFsdWUgPSAibGlmZWN5Y2xlT3BlcmF0aW9uIikgZmluYWwgU3RyaW5nIGxpZmVjeWNsZVRyYW5zaXRpb24sCisJCQlAQXBpUGFyYW0odmFsdWUgPSAiaWQgb2YgY29tcG9uZW50IHRvIGJlIGNoYW5nZWQiKSBAUGF0aFBhcmFtKHZhbHVlID0gImNvbXBvbmVudElkIikgZmluYWwgU3RyaW5nIGNvbXBvbmVudElkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJpZCBvZiB1c2VyIGluaXRpYXRpbmcgdGhlIG9wZXJhdGlvbiIpIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlMaWZlY3ljbGVCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRMaWZlY3ljbGVCTChjb250ZXh0KTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJLy8gZ2V0IG1vZGlmaWVyIGZyb20gZ3JhcGgKKwkJbG9nLmRlYnVnKCJnZXQgbW9kaWZpZXIgcHJvcGVydGllcyIpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2U+IGVpdGhlckdldFVzZXIgPSBnZXRVc2VyKHJlcXVlc3QsIHVzZXJJZCk7CisJCWlmIChlaXRoZXJHZXRVc2VyLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGVpdGhlckdldFVzZXIucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCVVzZXIgdXNlciA9IGVpdGhlckdldFVzZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJU3RyaW5nIHJlc291cmNlSWRMb3dlciA9IGNvbXBvbmVudElkLnRvTG93ZXJDYXNlKCk7CisJCWxvZy5kZWJ1ZygicGVyZm9ybSB7fSBvcGVyYXRpb24gdG8gcmVzb3VyY2Ugd2l0aCBpZCB7fSAiLCBsaWZlY3ljbGVUcmFuc2l0aW9uLCByZXNvdXJjZUlkTG93ZXIpOworCQlFaXRoZXI8TGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0sIFJlc3BvbnNlPiB2YWxpZGF0ZUVudW0gPSB2YWxpZGF0ZVRyYW5zaXRpb25FbnVtKGxpZmVjeWNsZVRyYW5zaXRpb24sIHVzZXIpOworCQlpZiAodmFsaWRhdGVFbnVtLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIHZhbGlkYXRlRW51bS5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbiBjaGFuZ2VJbmZvID0gbmV3IExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uKCk7CisKKwkJdHJ5IHsKKwkJCWlmIChqc29uQ2hhbmdlSW5mbyAhPSBudWxsICYmICFqc29uQ2hhbmdlSW5mby5pc0VtcHR5KCkpIHsKKwkJCQkvLyBFaXRoZXI8TGlmZWN5Y2xlQ2hhbmdlSW5mbywgUmVzcG9uc2VGb3JtYXQgPiBjaGFuZ2VJbmZvUmVzdWx0CisJCQkJLy8gPQorCQkJCS8vIGdldENvbXBvbmVudHNVdGlscygpLmNvbnZlcnRKc29uVG9PYmplY3RVc2luZ09iamVjdE1hcHBlcihqc29uQ2hhbmdlSW5mbywKKwkJCQkvLyB1c2VyLCBMaWZlY3ljbGVDaGFuZ2VJbmZvLmNsYXNzLAorCQkJCS8vIEF1ZGl0aW5nQWN0aW9uRW51bS5DSEVDS09VVF9SRVNPVVJDRSwgbnVsbCk7CisJCQkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJCQljaGFuZ2VJbmZvID0gbmV3IExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uKG1hcHBlci5yZWFkVmFsdWUoanNvbkNoYW5nZUluZm8sIExpZmVjeWNsZUNoYW5nZUluZm9CYXNlLmNsYXNzKS5nZXRVc2VyUmVtYXJrcygpKTsKKwkJCX0KKwkJfQorCisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlSW52YWxpZEpzb25JbnB1dCwgImNvbnZlcnRKc29uVG9PYmplY3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRKc29uSW5wdXQoImNvbnZlcnRKc29uVG9PYmplY3QiKTsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNvbnZlcnQgZnJvbSBqc29uIHt9IiwganNvbkNoYW5nZUluZm8sIGUpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRJbnZhbGlkQ29udGVudEVycm9yQW5kQXVkaXQodXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtLkNIRUNLT1VUX1JFU09VUkNFKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJdHJ5IHsKKwkJCUxpZmVDeWNsZVRyYW5zaXRpb25FbnVtIHRyYW5zaXRpb25FbnVtID0gdmFsaWRhdGVFbnVtLmxlZnQoKS52YWx1ZSgpOworCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVBhcmFtTmFtZShjb21wb25lbnRDb2xsZWN0aW9uKTsKKwkJCS8vIGlmIChjb21wb25lbnRUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKXsKKwkJCS8vIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0KKwkJCS8vIGJ1c2luZXNzTG9naWMuY2hhbmdlU3RhdGUocmVzb3VyY2VJZExvd2VyLCB1c2VyLCB0cmFuc2l0aW9uRW51bSwKKwkJCS8vIGNoYW5nZUluZm8sIGZhbHNlKTsKKwkJCS8vCisJCQkvLyBpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKXsKKwkJCS8vIGxvZy5pbmZvKCJmYWlsZWQgdG8gY2hhbmdlIHJlc291cmNlIHN0YXRlIik7CisJCQkvLyByZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJLy8gcmV0dXJuIHJlc3BvbnNlOworCQkJLy8gfQorCQkJLy8KKwkJCS8vIGxvZy5kZWJ1ZygiY2hhbmdlIHN0YXRlIHN1Y2Nlc3NmdWwgISEhIik7CisJCQkvLyBPYmplY3QgcmVzb3VyY2UgPQorCQkJLy8gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCS8vIHJlc3BvbnNlID0KKwkJCS8vIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLAorCQkJLy8gcmVzb3VyY2UpOworCQkJLy8gcmV0dXJuIHJlc3BvbnNlOworCQkJLy8KKwkJCS8vIH0gZWxzZSBpZiAoY29tcG9uZW50VHlwZSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFIHx8CisJCQkvLyBjb21wb25lbnRUeXBlID09IENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QpeworCQkJaWYgKGNvbXBvbmVudFR5cGUgIT0gbnVsbCkgeworCQkJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmNoYW5nZUNvbXBvbmVudFN0YXRlKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkLCB1c2VyLCB0cmFuc2l0aW9uRW51bSwgY2hhbmdlSW5mbywgZmFsc2UsIHRydWUpOworCisJCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuaW5mbygiZmFpbGVkIHRvIGNoYW5nZSByZXNvdXJjZSBzdGF0ZSIpOworCQkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQkJfQorCisJCQkJbG9nLmRlYnVnKCJjaGFuZ2Ugc3RhdGUgc3VjY2Vzc2Z1bCAhISEiKTsKKwkJCQlPYmplY3QgdmFsdWUgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHZhbHVlKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9IGVsc2UgeworCQkJCWxvZy5pbmZvKCJjb21wb25lbnRDb2xsZWN0aW9uIFwie31cIiBpcyBub3QgdmFsaWQuIFN1cHBvcnRlZCBjb21wb25lbnRDb2xsZWN0aW9uIHZhbHVlcyBhcmUgXCJ7fVwiLCBcInt9XCIgb3IgXCJ7fVwiIiwgY29tcG9uZW50Q29sbGVjdGlvbiwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0VfUEFSQU1fTkFNRSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRV9QQVJBTV9OQU1FLAorCQkJCQkJQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVF9QQVJBTV9OQU1FKTsKKwkJCQlSZXNwb25zZUZvcm1hdCBlcnJvciA9IGdldENvbXBvbmVudHNVdGlscygpLmdldEludmFsaWRDb250ZW50RXJyb3JBbmRBdWRpdCh1c2VyLCBBdWRpdGluZ0FjdGlvbkVudW0uQ0hFQ0tPVVRfUkVTT1VSQ0UpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZXJyb3IpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkNoYW5nZSBMaWZlY3ljbGUgU3RhdGUiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkNoYW5nZSBMaWZlY3ljbGUgU3RhdGUiKTsKKwkJCWxvZy5kZWJ1ZygiY2hhbmdlIGxpZmVjeWNsZSBzdGF0ZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLCBSZXNwb25zZT4gdmFsaWRhdGVUcmFuc2l0aW9uRW51bShmaW5hbCBTdHJpbmcgbGlmZWN5Y2xlVHJhbnNpdGlvbiwgVXNlciB1c2VyKSB7CisJCUxpZmVDeWNsZVRyYW5zaXRpb25FbnVtIHRyYW5zaXRpb25FbnVtID0gTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0hFQ0tPVVQ7CisJCXRyeSB7CisJCQl0cmFuc2l0aW9uRW51bSA9IExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLmdldEZyb21EaXNwbGF5TmFtZShsaWZlY3ljbGVUcmFuc2l0aW9uKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5pbmZvKCJzdGF0ZSBvcGVyYXRpb24gaXMgbm90IHZhbGlkLiBvcGVyYXRpb25zIGFsbG93ZWQgYXJlOiB7fSIsIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLnZhbHVlc0FzU3RyaW5nKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRJbnZhbGlkQ29udGVudEVycm9yQW5kQXVkaXQodXNlciwgQXVkaXRpbmdBY3Rpb25FbnVtLkNIRUNLT1VUX1JFU09VUkNFKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoYnVpbGRFcnJvclJlc3BvbnNlKGVycm9yKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRyYW5zaXRpb25FbnVtKTsKKwl9CisKKwlwcml2YXRlIExpZmVjeWNsZUJ1c2luZXNzTG9naWMgZ2V0TGlmZWN5Y2xlQkwoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID0gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKwkJV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChjb250ZXh0KTsKKwkJTGlmZWN5Y2xlQnVzaW5lc3NMb2dpYyByZXNvdXJjZUJsID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oTGlmZWN5Y2xlQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJCXJldHVybiByZXNvdXJjZUJsOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8VXNlciwgUmVzcG9uc2U+IGdldFVzZXIoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdG9yID0gZ2V0VXNlckFkbWluTWFuYWdlcihyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKS5nZXRVc2VyKHVzZXJJZCwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5pbmZvKCJjcmVhdGVSZXNvdXJjZSBtZXRob2QgLSB1c2VyIGlzIG5vdCBsaXN0ZWQuIHVzZXJJZD17fSIsIHVzZXJJZCk7CisJCQlSZXNwb25zZUZvcm1hdCBlcnJvclJlc3BvbnNlID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk1JU1NJTkdfSU5GT1JNQVRJT04pOworCQkJVXNlciB1c2VyID0gbmV3IFVzZXIoIiIsICIiLCB1c2VySWQsICIiLCBudWxsLCBudWxsKTsKKworCQkJZ2V0Q29tcG9uZW50c1V0aWxzKCkuYXVkaXRSZXNvdXJjZShlcnJvclJlc3BvbnNlLCB1c2VyLCBudWxsLCAiIiwgIiIsIEF1ZGl0aW5nQWN0aW9uRW51bS5DSEVDS09VVF9SRVNPVVJDRSwgbnVsbCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGJ1aWxkRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCkpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1Byb2R1Y3RTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUHJvZHVjdFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGFjOTIxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1Byb2R1Y3RTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzMTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlByb2R1Y3RCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5TZXJ2aWNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUGFyYW07CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvY2F0YWxvZyIpCitAQXBpKHZhbHVlID0gIlByb2R1Y3QgQ2F0YWxvZyIsIGRlc2NyaXB0aW9uID0gIlByb2R1Y3QgU2VydmxldCIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgUHJvZHVjdFNlcnZsZXQgZXh0ZW5kcyBCZUdlbmVyaWNTZXJ2bGV0IHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvZHVjdFNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBQT1NUCisJQFBhdGgoIi9wcm9kdWN0cyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBwcm9kdWN0IiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIHByb2R1Y3QiLCByZXNwb25zZSA9IFByb2R1Y3QuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiUHJvZHVjdCBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIC8gRW1wdHkgVVNFUl9JRCBoZWFkZXIiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZC9taXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIlByb2R1Y3QgYWxyZWFkeSBleGlzdHMgLyBVc2VyIG5vdCBmb3VuZCAvIFdyb25nIHVzZXIgcm9sZSIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZVByb2R1Y3QoQEFwaVBhcmFtKHZhbHVlID0gIlByb2R1Y3Qgb2JqZWN0IHRvIGJlIGNyZWF0ZWQiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyBkYXRhLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgQEFwaVBhcmFtKHZhbHVlID0gIlVTRVJfSUQgb2YgcHJvZHVjdCBzdHJhdGVnaXN0IHVzZXIiLCByZXF1aXJlZCA9IHRydWUpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlQcm9kdWN0QnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0UHJvZHVjdEJMKGNvbnRleHQpOworCQkJUHJvZHVjdCBwcm9kdWN0ID0gUmVwcmVzZW50YXRpb25VdGlscy5mcm9tUmVwcmVzZW50YXRpb24oZGF0YSwgUHJvZHVjdC5jbGFzcyk7CisJCQlFaXRoZXI8UHJvZHVjdCwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy5jcmVhdGVQcm9kdWN0KHByb2R1Y3QsIG1vZGlmaWVyKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBwcm9kdWN0Iik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisKKwkJCU9iamVjdCByZXN1bHQgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNSRUFURUQpLCByZXN1bHQpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiQ3JlYXRlIFByb2R1Y3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkNyZWF0ZSBQcm9kdWN0Iik7CisJCQlsb2cuZGVidWcoImNyZWF0ZSBwcm9kdWN0IGZhaWxlZCB3aXRoIGVycm9yICIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKwkJfQorCX0KKworCUBHRVQKKwlAUGF0aCgiL3Byb2R1Y3RzL3twcm9kdWN0SWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiUmV0cmlldmUgcHJvZHVjdCIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyBwcm9kdWN0IGFjY29yZGluZyB0byBwcm9kdWN0SWQiLCByZXNwb25zZSA9IFByb2R1Y3QuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUHJvZHVjdCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJNaXNzaW5nIGluZm9ybWF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiUHJvZHVjdCBub3QgZm91bmQiKSwgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0UHJvZHVjdEJ5SWQoQFBhdGhQYXJhbSgicHJvZHVjdElkIikgZmluYWwgU3RyaW5nIHByb2R1Y3RJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCQkJUHJvZHVjdEJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFByb2R1Y3RCTChjb250ZXh0KTsKKwkJCWxvZy50cmFjZSgiZ2V0IHByb2R1Y3Qgd2l0aCBpZCB7fSIsIHByb2R1Y3RJZCk7CisJCQlFaXRoZXI8UHJvZHVjdCwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy5nZXRQcm9kdWN0KHByb2R1Y3RJZCwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHByb2R1Y3QiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKworCQkJT2JqZWN0IHByb2R1Y3QgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBwcm9kdWN0KTsKKworCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBQcm9kdWN0Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJHZXQgUHJvZHVjdCIpOworCQkJbG9nLmRlYnVnKCJnZXQgcHJvZHVjdCBmYWlsZWQgd2l0aCBlcnJvciAiLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi9wcm9kdWN0cy9wcm9kdWN0TmFtZS97cHJvZHVjdE5hbWV9L3Byb2R1Y3RWZXJzaW9uL3twcm9kdWN0VmVyc2lvbn0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJSZXRyaWV2ZSBTZXJ2aWNlIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIHByb2R1Y3QgYWNjb3JkaW5nIHRvIG5hbWUgYW5kIHZlcnNpb24iLCByZXNwb25zZSA9IFByb2R1Y3QuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUHJvZHVjdCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJQcm9kdWN0IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKEBQYXRoUGFyYW0oInByb2R1Y3ROYW1lIikgZmluYWwgU3RyaW5nIHByb2R1Y3ROYW1lLCBAUGF0aFBhcmFtKCJwcm9kdWN0VmVyc2lvbiIpIGZpbmFsIFN0cmluZyBwcm9kdWN0VmVyc2lvbiwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQl0cnkgeworCQkJUHJvZHVjdEJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFByb2R1Y3RCTChjb250ZXh0KTsKKwkJCUVpdGhlcjxQcm9kdWN0LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmdldFByb2R1Y3RCeU5hbWVBbmRWZXJzaW9uKHByb2R1Y3ROYW1lLCBwcm9kdWN0VmVyc2lvbiwgdXNlcklkKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCisJCQlQcm9kdWN0IHByb2R1Y3QgPSBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCU9iamVjdCByZXN1bHQgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24ocHJvZHVjdCk7CisKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVzdWx0KTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBwcm9kdWN0IGJ5IG5hbWUgYW5kIHZlcnNpb24iKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBwcm9kdWN0IGJ5IG5hbWUgYW5kIHZlcnNpb24iKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0IHByb2R1Y3QgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisKKwkJfQorCX0KKworCUBERUxFVEUKKwlAUGF0aCgiL3Byb2R1Y3RzL3twcm9kdWN0SWR9IikKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlUHJvZHVjdChAUGF0aFBhcmFtKCJwcm9kdWN0SWQiKSBmaW5hbCBTdHJpbmcgcHJvZHVjdElkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCS8vIGdldCBtb2RpZmllciBpZAorCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCVByb2R1Y3RCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRQcm9kdWN0QkwoY29udGV4dCk7CisJCQlsb2cudHJhY2UoImRlbGV0ZSBwcm9kdWN0IHdpdGggaWQge30iLCBwcm9kdWN0SWQpOworCQkJRWl0aGVyPFByb2R1Y3QsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZGVsZXRlUHJvZHVjdChwcm9kdWN0SWQsIG1vZGlmaWVyKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBwcm9kdWN0Iik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisKKwkJCU9iamVjdCBwcm9kdWN0ID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHByb2R1Y3QpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiRGVsZXRlIFJlc291cmNlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJEZWxldGUgUmVzb3VyY2UiKTsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlIHJlc291cmNlIGZhaWxlZCB3aXRoIGVycm9yICIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJQFBVVAorCUBQYXRoKCIvcHJvZHVjdHMve3Byb2R1Y3RJZH0vbWV0YWRhdGEiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJVcGRhdGUgUHJvZHVjdCBNZXRhZGF0YSIsIGh0dHBNZXRob2QgPSAiUFVUIiwgbm90ZXMgPSAiUmV0dXJucyB1cGRhdGVkIHByb2R1Y3QiLCByZXNwb25zZSA9IFByb2R1Y3QuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUHJvZHVjdCBVcGRhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVByb2R1Y3RNZXRhZGF0YShAUGF0aFBhcmFtKCJwcm9kdWN0SWQiKSBmaW5hbCBTdHJpbmcgcHJvZHVjdElkLCBAQXBpUGFyYW0odmFsdWUgPSAiUHJvZHVjdCBvYmplY3QgdG8gYmUgVXBkYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCQkJU3RyaW5nIHByb2R1Y3RJZExvd2VyID0gcHJvZHVjdElkLnRvTG93ZXJDYXNlKCk7CisJCQlQcm9kdWN0QnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0UHJvZHVjdEJMKGNvbnRleHQpOworCQkJUHJvZHVjdCB1cGRhdGVkUHJvZHVjdCA9IFJlcHJlc2VudGF0aW9uVXRpbHMuZnJvbVJlcHJlc2VudGF0aW9uKGRhdGEsIFByb2R1Y3QuY2xhc3MpOworCQkJRWl0aGVyPFByb2R1Y3QsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMudXBkYXRlUHJvZHVjdE1ldGFkYXRhKHByb2R1Y3RJZExvd2VyLCB1cGRhdGVkUHJvZHVjdCwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIHByb2R1Y3QiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKworCQkJUHJvZHVjdCBwcm9kdWN0ID0gYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCQlPYmplY3QgcmVzdWx0ID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKHByb2R1Y3QpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVXBkYXRlIFByb2R1Y3QgTWV0YWRhdGEiKTsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlIHByb2R1Y3QgbWV0YWRhdGEgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIvcHJvZHVjdHMvdmFsaWRhdGUtbmFtZS97cHJvZHVjdE5hbWV9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAidmFsaWRhdGUgcHJvZHVjdCBuYW1lIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJjaGVja3MgaWYgdGhlIGNob3NlbiBwcm9kdWN0IG5hbWUgaXMgYXZhaWxhYmxlICIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiU2VydmljZSBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpIH0pCisJcHVibGljIFJlc3BvbnNlIHZhbGlkYXRlU2VydmljZU5hbWUoQFBhdGhQYXJhbSgicHJvZHVjdE5hbWUiKSBmaW5hbCBTdHJpbmcgcHJvZHVjdE5hbWUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVByb2R1Y3RCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRQcm9kdWN0QkwoY29udGV4dCk7CisKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBCb29sZWFuPiwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy52YWxpZGF0ZVByb2R1Y3ROYW1lRXhpc3RzKHByb2R1Y3ROYW1lLCB1c2VySWQpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IHZhbGlkYXRlIHNlcnZpY2UgbmFtZSIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVmFsaWRhdGUgU2VydmljZSBOYW1lIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJWYWxpZGF0ZSBQcm9kdWN0IE5hbWUiKTsKKwkJCWxvZy5kZWJ1ZygidmFsaWRhdGUgcHJvZHVjdCBuYW1lIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUHJvcGVydHlTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUHJvcGVydHlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2OTNjNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Qcm9wZXJ0eVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDU2MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLnBhcnNlci5KU09OUGFyc2VyOworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5wYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlByb3BlcnR5QnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbi5Qcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlByb3BlcnR5T3BlcmF0aW9uLlByb3BlcnR5Q29uc3RyYWludFNlcmlhbGlzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRW50cnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUGFyYW07CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvY2F0YWxvZyIpCitAQXBpKHZhbHVlID0gIlJlc291cmNlIFByb3BlcnR5IFNlcnZsZXQiLCBkZXNjcmlwdGlvbiA9ICJSZXNvdXJjZSBQcm9wZXJ0eSBTZXJ2bGV0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVNlcnZsZXQgZXh0ZW5kcyBCZUdlbmVyaWNTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9wZXJ0eVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBQT1NUCisJQFBhdGgoInJlc291cmNlcy97cmVzb3VyY2VJZH0vcHJvcGVydGllcyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBSZXNvdXJjZSBQcm9wZXJ0eSIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgY3JlYXRlZCByZXNvdXJjZSBwcm9wZXJ0eSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgcHJvcGVydHkgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIlJlc291cmNlIHByb3BlcnR5IGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBjcmVhdGVQcm9wZXJ0eShAQXBpUGFyYW0odmFsdWUgPSAicmVzb3VyY2UgaWQgdG8gdXBkYXRlIHdpdGggbmV3IHByb3BlcnR5IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJyZXNvdXJjZUlkIikgZmluYWwgU3RyaW5nIHJlc291cmNlSWQsIEBBcGlQYXJhbSh2YWx1ZSA9ICJSZXNvdXJjZSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygiZGF0YSBpcyB7fSIsIGRhdGEpOworCisJCXRyeSB7CisJCQkvLyBjb252ZXJ0IGpzb24gdG8gUHJvcGVydHlEZWZpbml0aW9uCisJCQlFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBlaXRoZXIgPSBnZXRQcm9wZXJ0eU1vZGVsKGRhdGEpOworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLnNpemUoKSAhPSAxKSB7CisJCQkJbG9nLmluZm8oIlByb3BlcnR5IGNvbmV0bnQgaXMgaW52YWxpZCAtIHt9IiwgZGF0YSk7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCUVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBlbnRyeSA9IHByb3BlcnRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKwkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCVByb3BlcnR5RGVmaW5pdGlvbiBuZXdQcm9wZXJ0eURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkvLyBjcmVhdGUgdGhlIG5ldyBwcm9wZXJ0eQorCQkJUHJvcGVydHlCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRQcm9wZXJ0eUJMKGNvbnRleHQpOworCQkJRWl0aGVyPEVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBzdGF0dXMgPSBidXNpbmVzc0xvZ2ljLmNyZWF0ZVByb3BlcnR5KHJlc291cmNlSWQsIHByb3BlcnR5TmFtZSwgbmV3UHJvcGVydHlEZWZpbml0aW9uLCB1c2VySWQpOworCQkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuaW5mbygiRmFpbGVkIHRvIGNyZWF0ZSBQcm9wZXJ0eS4gUmVhc29uIC0gIiwgc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShzdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCUVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydHkgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgbmFtZSA9IHByb3BlcnR5LmdldEtleSgpOworCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IHByb3BlcnR5LmdldFZhbHVlKCk7CisKKwkJCWxvZy5kZWJ1ZygiUHJvcGVydHkge30gY3JlYXRlZCBzdWNjZXNzZnVsbHkgd2l0aCBpZCB7fSIsIG5hbWUsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNSRUFURUQpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgcHJvcGVydHlUb0pzb24ocHJvcGVydHkpKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkNyZWF0ZSBQcm9wZXJ0eSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiQ3JlYXRlIFByb3BlcnR5Iik7CisJCQlsb2cuZGVidWcoImNyZWF0ZSBwcm9wZXJ0eSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCX0KKworCUBHRVQKKwlAUGF0aCgicmVzb3VyY2VzL3tyZXNvdXJjZUlkfS9wcm9wZXJ0aWVzL3twcm9wZXJ0eUlkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBSZXNvdXJjZSBQcm9wZXJ0eSIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyBwcm9wZXJ0eSBvZiByZXNvdXJjZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAicHJvcGVydHkiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJSZXNvdXJjZSBwcm9wZXJ0eSBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRQcm9wZXJ0eShAQXBpUGFyYW0odmFsdWUgPSAicmVzb3VyY2UgaWQgb2YgcHJvcGVydHkiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwgQEFwaVBhcmFtKHZhbHVlID0gInByb2VydHkgaWQgdG8gZ2V0IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJwcm9wZXJ0eUlkIikgZmluYWwgU3RyaW5nIHByb3BlcnR5SWQsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCXRyeSB7CisKKwkJCS8vCisJCQlQcm9wZXJ0eUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFByb3BlcnR5QkwoY29udGV4dCk7CisJCQlFaXRoZXI8RW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gc3RhdHVzID0gYnVzaW5lc3NMb2dpYy5nZXRQcm9wZXJ0eShyZXNvdXJjZUlkLCBwcm9wZXJ0eUlkLCB1c2VySWQpOworCisJCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gZ2V0IFByb3BlcnR5LiBSZWFzb24gLSAiLCBzdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnR5ID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgcHJvcGVydHlUb0pzb24ocHJvcGVydHkpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgUHJvcGVydHkiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBQcm9wZXJ0eSIpOworCQkJbG9nLmRlYnVnKCJnZXQgcHJvcGVydHkgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCisJCX0KKwl9CisKKwlAREVMRVRFCisJQFBhdGgoInJlc291cmNlcy97cmVzb3VyY2VJZH0vcHJvcGVydGllcy97cHJvcGVydHlJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgUmVzb3VyY2UgUHJvcGVydHkiLCBodHRwTWV0aG9kID0gIkRFTEVURSIsIG5vdGVzID0gIlJldHVybnMgZGVsZXRlZCBwcm9wZXJ0eSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDQsIG1lc3NhZ2UgPSAiZGVsZXRlZCBwcm9wZXJ0eSIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlJlc291cmNlIHByb3BlcnR5IG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRlbGV0ZVByb3BlcnR5KEBBcGlQYXJhbSh2YWx1ZSA9ICJyZXNvdXJjZSBpZCBvZiBwcm9wZXJ0eSIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gIlByb3BlcnR5IGlkIHRvIGRlbGV0ZSIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgicHJvcGVydHlJZCIpIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUlkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCXRyeSB7CisKKwkJCS8vIGRlbGV0ZSB0aGUgcHJvcGVydHkKKwkJCVByb3BlcnR5QnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0UHJvcGVydHlCTChjb250ZXh0KTsKKwkJCUVpdGhlcjxFbnRyeURhdGE8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gc3RhdHVzID0gYnVzaW5lc3NMb2dpYy5kZWxldGVQcm9wZXJ0eShyZXNvdXJjZUlkLCBwcm9wZXJ0eUlkLCB1c2VySWQpOworCQkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgUHJvcGVydHkuIFJlYXNvbiAtICIsIHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2Uoc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlFbnRyeURhdGE8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnR5ID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5nZXRLZXkoKTsKKwkJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOworCisJCQlsb2cuZGVidWcoIlByb3BlcnR5IHt9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5IHdpdGggaWQge30iLCBuYW1lLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKTsKKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIHByb3BlcnR5VG9Kc29uKHByb3BlcnR5KSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJEZWxldGUgUHJvcGVydHkiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkRlbGV0ZSBQcm9wZXJ0eSIpOworCQkJbG9nLmRlYnVnKCJkZWxldGUgcHJvcGVydHkgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCisJCX0KKwl9CisKKwlAUFVUCisJQFBhdGgoInJlc291cmNlcy97cmVzb3VyY2VJZH0vcHJvcGVydGllcy97cHJvcGVydHlJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJVcGRhdGUgUmVzb3VyY2UgUHJvcGVydHkiLCBodHRwTWV0aG9kID0gIlBVVCIsIG5vdGVzID0gIlJldHVybnMgdXBkYXRlZCBwcm9wZXJ0eSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgcHJvcGVydHkgdXBkYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVQcm9wZXJ0eShAQXBpUGFyYW0odmFsdWUgPSAicmVzb3VyY2UgaWQgdG8gdXBkYXRlIHdpdGggbmV3IHByb3BlcnR5IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJyZXNvdXJjZUlkIikgZmluYWwgU3RyaW5nIHJlc291cmNlSWQsCisJCQlAQXBpUGFyYW0odmFsdWUgPSAicHJvZXJ0eSBpZCB0byB1cGRhdGUiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInByb3BlcnR5SWQiKSBmaW5hbCBTdHJpbmcgcHJvcGVydHlJZCwgQEFwaVBhcmFtKHZhbHVlID0gIlJlc291cmNlIHByb3BlcnR5IHRvIHVwZGF0ZSIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJdHJ5IHsKKwkJCS8vIGNvbnZlcnQganNvbiB0byBQcm9wZXJ0eURlZmluaXRpb24KKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGVpdGhlciA9IGdldFByb3BlcnR5TW9kZWwoZGF0YSk7CisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuc2l6ZSgpICE9IDEpIHsKKwkJCQlsb2cuaW5mbygiUHJvcGVydHkgY29uZXRudCBpcyBpbnZhbGlkIC0ge30iLCBkYXRhKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGVudHJ5ID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQkJUHJvcGVydHlEZWZpbml0aW9uIG5ld1Byb3BlcnR5RGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCS8vIHVwZGF0ZSBwcm9wZXJ0eQorCQkJUHJvcGVydHlCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRQcm9wZXJ0eUJMKGNvbnRleHQpOworCQkJRWl0aGVyPEVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBzdGF0dXMgPSBidXNpbmVzc0xvZ2ljLnVwZGF0ZVByb3BlcnR5KHJlc291cmNlSWQsIHByb3BlcnR5SWQsIG5ld1Byb3BlcnR5RGVmaW5pdGlvbiwgdXNlcklkKTsKKwkJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmluZm8oIkZhaWxlZCB0byB1cGRhdGUgUHJvcGVydHkuIFJlYXNvbiAtICIsIHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2Uoc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlFbnRyeURhdGE8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnR5ID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IHByb3BlcnR5LmdldFZhbHVlKCk7CisKKwkJCWxvZy5kZWJ1ZygiUHJvcGVydHkgaWQge30gdXBkYXRlZCBzdWNjZXNzZnVsbHkgIiwgcHJvcGVydHlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShyZXNwb25zZUZvcm1hdCwgcHJvcGVydHlUb0pzb24ocHJvcGVydHkpKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIlVwZGF0ZSBQcm9wZXJ0eSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiVXBkYXRlIFByb3BlcnR5Iik7CisJCQlsb2cuZGVidWcoInVwZGF0ZSBwcm9wZXJ0eSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisKKwkJfQorCX0KKworCS8vIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5VG9Kc29uVWkoTWFwLkVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPgorCS8vIHByb3BlcnR5KSB7CisJLy8gU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5nZXRLZXkoKTsKKwkvLyBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKKwkvLyBKU09OT2JqZWN0IHJvb3QgPSBuZXcgSlNPTk9iamVjdCgpOworCS8vIHJvb3QucHV0KCJ0eXBlIiwgcHJvcGVydHlEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJLy8gcm9vdC5wdXQoInNvdXJjZSIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7CisJLy8gcm9vdC5wdXQoIm5hbWUiLCBuYW1lKTsKKwkvLyByb290LnB1dCgiZGVzY3JpcHRpb24iLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisJLy8gcm9vdC5wdXQoInVuaXF1ZUlkIiwgcHJvcGVydHlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCS8vIHJldHVybiByb290LnRvU3RyaW5nKCk7CisJLy8KKwkvLyB9CisJLy8KKworCS8vIHByaXZhdGUgRWl0aGVyPFN0cmluZyAsQWN0aW9uU3RhdHVzPiBnZXRKc29uTW9kZWwoU3RyaW5nIGRhdGEpeworCS8vIEVpdGhlcjxVaVByb3BlcnR5LEFjdGlvblN0YXR1cz4gdWlQcm9wZXJ0eUVpdGhlciA9IGdldFVpUHJvcGVydHkoZGF0YSk7CisJLy8gaWYgKHVpUHJvcGVydHlFaXRoZXIuaXNSaWdodCgpKXsKKwkvLyBsb2cuZXJyb3IoIlByb3BlcnR5IGNvbmV0bnQgaXMgaW52YWxpZCAtIHt9IixkYXRhKTsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCS8vIH0KKwkvLyBVaVByb3BlcnR5IHVpUHJvcGVydHkgPSB1aVByb3BlcnR5RWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCS8vIFN0cmluZyBqc29uID0gY29udmVydFVpUHJvcGVydHlUb0pzb25Nb2RlbCh1aVByb3BlcnR5KTsKKwkvLyByZXR1cm4gRWl0aGVyLmxlZnQoanNvbik7CisJLy8gfQorCS8vCisKKwkvLyBwcml2YXRlIFN0cmluZyBjb252ZXJ0VWlQcm9wZXJ0eVRvSnNvbk1vZGVsKFVpUHJvcGVydHkgdWlQcm9wZXJ0eSkgeworCS8vIEpTT05PYmplY3Qgcm9vdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJLy8gSlNPTk9iamVjdCBwcm9wZXJ0eUQgPSBuZXcgSlNPTk9iamVjdCgpOworCS8vIHByb3BlcnR5RC5wdXQoInR5cGUiLHVpUHJvcGVydHkuZ2V0VHlwZSgpKTsKKwkvLyBwcm9wZXJ0eUQucHV0KCJyZXF1aXJlZCIsZmFsc2UpOworCS8vIHByb3BlcnR5RC5wdXQoImRlc2NyaXB0aW9uIix1aVByb3BlcnR5LmdldERlc2NyaXB0aW9uKCkpOworCS8vIHByb3BlcnR5RC5wdXQoImlzUGFzc3dvcmQiLGZhbHNlKTsKKwkvLyBwcm9wZXJ0eUQucHV0KCJkZWZhdWx0VmFsdWUiLHVpUHJvcGVydHkuZ2V0U291cmNlKCkpOworCS8vIEpTT05BcnJheSBqc29uQXJyID0gbmV3IEpTT05BcnJheSgpOworCS8vIEpTT05BcnJheSBqc29uUiA9IG5ldyBKU09OQXJyYXkoKTsKKwkvLyBqc29uUi5hZGQoMTAwKTsKKwkvLyBqc29uUi5hZGQoNTAwKTsKKwkvLyBKU09OT2JqZWN0IG8gPSBuZXcgSlNPTk9iamVjdCgpOworCS8vIG8ucHV0KCJpblJhbmdlIiwganNvblIpOworCS8vIGpzb25BcnIuYWRkKG8pOworCS8vIHByb3BlcnR5RC5wdXQoImNvbnN0cmFpbnRzIixqc29uQXJyKTsKKwkvLyByb290LnB1dCh1aVByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHlEKTsKKwkvLyByZXR1cm4gcm9vdC50b1N0cmluZygpOworCS8vIH0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gZ2V0UHJvcGVydHlNb2RlbChTdHJpbmcgZGF0YSkgeworCQlKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7CisJCUpTT05PYmplY3Qgcm9vdDsKKwkJdHJ5IHsKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPigpOworCQkJcm9vdCA9IChKU09OT2JqZWN0KSBwYXJzZXIucGFyc2UoZGF0YSk7CisKKwkJCVNldCBlbnRyeVNldCA9IHJvb3QuZW50cnlTZXQoKTsKKwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlFbnRyeSBuZXh0ID0gKEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7CisJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIG5leHQuZ2V0S2V5KCk7CisJCQkJSlNPTk9iamVjdCB2YWx1ZSA9IChKU09OT2JqZWN0KSBuZXh0LmdldFZhbHVlKCk7CisJCQkJU3RyaW5nIGpzb25TdHJpbmcgPSB2YWx1ZS50b0pTT05TdHJpbmcoKTsKKwkJCQlFaXRoZXI8UHJvcGVydHlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNvbnZlcnRKc29uVG9PYmplY3QgPSBjb252ZXJ0SnNvblRvT2JqZWN0KGpzb25TdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbi5jbGFzcyk7CisJCQkJaWYgKGNvbnZlcnRKc29uVG9PYmplY3QuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29udmVydEpzb25Ub09iamVjdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gY29udmVydEpzb25Ub09iamVjdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQkvLyBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0KKwkJCQkvLyBnc29uLmZyb21Kc29uKGpzb25TdHJpbmcgLCBQcm9wZXJ0eURlZmluaXRpb24uY2xhc3MpOworCQkJCVN0cmluZyB1bmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFByb3BlcnR5VW5pcXVlSWQoInJlc291cmNlSWQiLCAoU3RyaW5nKSBwcm9wZXJ0eU5hbWUpOworCQkJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCQkJcHJvcGVydGllcy5wdXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eURlZmluaXRpb24pOworCQkJfQorCisJCQkvLyBTZXQga2V5U2V0ID0gcm9vdC5rZXlTZXQoKTsKKwkJCS8vIGZvciAoT2JqZWN0IHByb3BlcnR5TmFtZSA6IGtleVNldCl7CisJCQkvLyBKU09OT2JqZWN0IHZhbCA9IChKU09OT2JqZWN0KSByb290LmdldChwcm9wZXJ0eU5hbWUpOworCQkJLy8gU3RyaW5nIGpzb25TdHJpbmcgPSB2YWwudG9KU09OU3RyaW5nKCk7CisJCQkvLyBFaXRoZXI8UHJvcGVydHlEZWZpbml0aW9uLEFjdGlvblN0YXR1cz4gY29udmVydEpzb25Ub09iamVjdCA9CisJCQkvLyBjb252ZXJ0SnNvblRvT2JqZWN0KGpzb25TdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbi5jbGFzcyk7CisJCQkvLyBpZiAoY29udmVydEpzb25Ub09iamVjdC5pc1JpZ2h0KCkpeworCQkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChjb252ZXJ0SnNvblRvT2JqZWN0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkvLyB9CisJCQkvLyBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0KKwkJCS8vIGNvbnZlcnRKc29uVG9PYmplY3QubGVmdCgpLnZhbHVlKCk7CisJCQkvLyAvL1Byb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPQorCQkJLy8gZ3Nvbi5mcm9tSnNvbihqc29uU3RyaW5nICwgUHJvcGVydHlEZWZpbml0aW9uLmNsYXNzKTsKKwkJCS8vIFN0cmluZyB1bmlxdWVJZCA9CisJCQkvLyBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKCJyZXNvdXJjZUlkIiwKKwkJCS8vIChTdHJpbmcpcHJvcGVydHlOYW1lKTsKKwkJCS8vIHByb3BlcnR5RGVmaW5pdGlvbi5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCQkvLyBwcm9wZXJ0aWVzLnB1dCgoU3RyaW5nKXByb3BlcnR5TmFtZSxwcm9wZXJ0eURlZmluaXRpb24pOworCQkJLy8gfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHByb3BlcnRpZXMpOworCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuaW5mbygiUHJvcGVydHkgY29uZXRudCBpcyBpbnZhbGlkIC0ge30iLCBkYXRhKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCX0KKwl9CisKKwkvLyBwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLFByb3BlcnR5RGVmaW5pdGlvbj4sQWN0aW9uU3RhdHVzPgorCS8vIGdldFByb3BlcnR5KFN0cmluZyBkYXRhKXsKKwkvLyBUeXBlIGNvbnN0cmFpbnRUeXBlID0gbmV3IFR5cGVUb2tlbjxQcm9wZXJ0eUNvbnN0cmFpbnQ+KCkge30uZ2V0VHlwZSgpOworCS8vIFByb3BlcnR5Q29uc3RyYWludERlc2VyaWFsaXNlciBwcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXIgPSBuZXcKKwkvLyBQcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXIoKTsKKwkvLyBHc29uIGdzb24gPSBuZXcKKwkvLyBHc29uQnVpbGRlcigpLnJlZ2lzdGVyVHlwZUFkYXB0ZXIoY29uc3RyYWludFR5cGUscHJvcGVydHlDb25zdHJhaW50RGVzZXJpYWxpc2VyKS5jcmVhdGUoKTsKKwkvLyBKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7CisJLy8gSlNPTk9iamVjdCByb290OworCS8vIHRyeSB7CisJLy8gTWFwPFN0cmluZyxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBuZXcKKwkvLyBIYXNoTWFwPFN0cmluZyxQcm9wZXJ0eURlZmluaXRpb24+KCk7CisJLy8gcm9vdCA9IChKU09OT2JqZWN0KSBwYXJzZXIucGFyc2UoZGF0YSk7CisJLy8gU2V0IGtleVNldCA9IHJvb3Qua2V5U2V0KCk7CisJLy8gZm9yIChPYmplY3QgcHJvcGVydHlOYW1lIDoga2V5U2V0KXsKKwkvLyBKU09OT2JqZWN0IHZhbCA9IChKU09OT2JqZWN0KSByb290LmdldChwcm9wZXJ0eU5hbWUpOworCS8vIFN0cmluZyBqc29uU3RyaW5nID0gdmFsLnRvSlNPTlN0cmluZygpOworCS8vIFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBnc29uLmZyb21Kc29uKGpzb25TdHJpbmcgLAorCS8vIFByb3BlcnR5RGVmaW5pdGlvbi5jbGFzcyk7CisJLy8gU3RyaW5nIHVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZCgicmVzb3VyY2VJZCIsCisJLy8gKFN0cmluZylwcm9wZXJ0eU5hbWUpOworCS8vIHByb3BlcnR5RGVmaW5pdGlvbi5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJLy8gcHJvcGVydGllcy5wdXQoKFN0cmluZylwcm9wZXJ0eU5hbWUscHJvcGVydHlEZWZpbml0aW9uKTsKKwkvLyB9CisJLy8gcmV0dXJuIEVpdGhlci5sZWZ0KHByb3BlcnRpZXMpOworCS8vIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkvLyBsb2cuZXJyb3IoIlByb3BlcnR5IGNvbmV0bnQgaXMgaW52YWxpZCAtIHt9IixkYXRhKTsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCS8vIH0KKwkvLyB9CisJLy8KKwkvLyBwcml2YXRlIEVpdGhlcjxVaVByb3BlcnR5LCBBY3Rpb25TdGF0dXM+IGdldFVpUHJvcGVydHkoU3RyaW5nIGRhdGEpIHsKKwkvLyB0cnl7CisJLy8gR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkvLyBVaVByb3BlcnR5IHVpUHJvcGVydHkgPSBnc29uLmZyb21Kc29uKGRhdGEsIFVpUHJvcGVydHkuY2xhc3MpOworCS8vIHJldHVybiBFaXRoZXIubGVmdCh1aVByb3BlcnR5KTsKKwkvLyB9Y2F0Y2goSnNvblN5bnRheEV4Y2VwdGlvbiBlKXsKKwkvLyBsb2cud2FybigiUHJvYmxlbSBjcmVhdGUgVWlQcm9wZXJ0eSBmcm9tIHt9IixkYXRhKTsKKwkvLyBsb2cuZGVidWcoIlByb2JsZW0gY3JlYXRlIFVpUHJvcGVydHkgZnJvbSB7fSIsZGF0YSxlKTsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCS8vIH0KKwkvLyB9CisKKwlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eVRvSnNvbihNYXAuRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnR5KSB7CisJCS8vIFR5cGUgY29uc3RyYWludFR5cGUgPSBuZXcgVHlwZVRva2VuPFByb3BlcnR5Q29uc3RyYWludD4oKQorCQkvLyB7fS5nZXRUeXBlKCk7CisJCS8vIEdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnJlZ2lzdGVyVHlwZUFkYXB0ZXIoY29uc3RyYWludFR5cGUsIG5ldworCQkvLyBQcm9wZXJ0eUNvbnN0cmFpbnREZXNlcmlhbGlzZXIoKSkuY3JlYXRlKCk7CisJCUpTT05PYmplY3Qgcm9vdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5nZXRLZXkoKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IHByb3BlcnR5LmdldFZhbHVlKCk7CisJCS8vIFN0cmluZyBqc29uUHJvcGVydHlEZWZpbml0aW9uID0gZ3Nvbi50b0pzb24ocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJLy8gcm9vdC5wdXQocHJvcGVydHlOYW1lLCBqc29uUHJvcGVydHlEZWZpbml0aW9uKTsKKwkJSlNPTk9iamVjdCBwcm9wZXJ0eURlZmluaXRpb25PID0gZ2V0UHJvcGVydHlEZWZpbml0aW9uSlNPTk9iamVjdChwcm9wZXJ0eURlZmluaXRpb24pOworCQlyb290LnB1dChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5RGVmaW5pdGlvbk8pOworCQlwcm9wZXJ0eURlZmluaXRpb24uZ2V0VHlwZSgpOworCQlyZXR1cm4gcm9vdC50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgSlNPTk9iamVjdCBnZXRQcm9wZXJ0eURlZmluaXRpb25KU09OT2JqZWN0KFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24pIHsKKworCQlFaXRoZXI8U3RyaW5nLCBBY3Rpb25TdGF0dXM+IGVpdGhlciA9IGNvbnZlcnRPYmplY3RUb0pzb24ocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBuZXcgSlNPTk9iamVjdCgpOworCQl9CisJCVN0cmluZyB2YWx1ZSA9IGVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJdHJ5IHsKKwkJCUpTT05PYmplY3Qgcm9vdCA9IChKU09OT2JqZWN0KSBuZXcgSlNPTlBhcnNlcigpLnBhcnNlKHZhbHVlKTsKKwkJCXJldHVybiByb290OworCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuaW5mbygiZmFpbGVkIHRvIGNvbnZlcnQgaW5wdXQgdG8ganNvbiIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY29udmVydCB0byBqc29uIiwgZSk7CisJCQlyZXR1cm4gbmV3IEpTT05PYmplY3QoKTsKKwkJfQorCisJfQorCisJLy8gcHJpdmF0ZSBKU09OT2JqZWN0IGdldFByb3BlcnR5RGVmaW5pdGlvbkpTT05PYmplY3QoUHJvcGVydHlEZWZpbml0aW9uCisJLy8gcHJvcGVydHlEZWZpbml0aW9uKSB7CisJLy8gSlNPTk9iamVjdCByb290ID0gbmV3IEpTT05PYmplY3QoKTsKKwkvLyByb290LnB1dCgidHlwZSIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCS8vIHJvb3QucHV0KCJyZXF1aXJlZCIsIHByb3BlcnR5RGVmaW5pdGlvbi5pc1JlcXVpcmVkKCkpOworCS8vIHJvb3QucHV0KCJkZWZhdWx0VmFsdWUiLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOworCS8vIHJvb3QucHV0KCJkZXNjcmlwdGlvbiIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKwkvLyByb290LnB1dCgiaXNQYXNzd29yZCIsIHByb3BlcnR5RGVmaW5pdGlvbi5pc1Bhc3N3b3JkKCkpOworCS8vIExpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb25zdHJhaW50cyA9CisJLy8gcHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCk7CisJLy8gZm9yIChQcm9wZXJ0eUNvbnN0cmFpbnQgcCA6IGNvbnN0cmFpbnRzKXsKKwkvLyBwLnRvU3RyaW5nKCk7CisJLy8gfQorCS8vIHJvb3QucHV0KCJjb25zdHJhaW50cyIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDb25zdHJhaW50cygpKTsKKwkvLyByZXR1cm4gcm9vdDsKKwkvLyB9CisKKwlwcml2YXRlIDxUPiBFaXRoZXI8VCwgQWN0aW9uU3RhdHVzPiBjb252ZXJ0SnNvblRvT2JqZWN0KFN0cmluZyBkYXRhLCBDbGFzczxUPiBjbGF6eikgeworCQlUIHQgPSBudWxsOworCQlUeXBlIGNvbnN0cmFpbnRUeXBlID0gbmV3IFR5cGVUb2tlbjxQcm9wZXJ0eUNvbnN0cmFpbnQ+KCkgeworCQl9LmdldFR5cGUoKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkucmVnaXN0ZXJUeXBlQWRhcHRlcihjb25zdHJhaW50VHlwZSwgbmV3IFByb3BlcnR5Q29uc3RyYWludERlc2VyaWFsaXNlcigpKS5jcmVhdGUoKTsKKwkJdHJ5IHsKKwkJCWxvZy50cmFjZSgiY29udmVydCBqc29uIHRvIG9iamVjdC4ganNvbj1cbnt9IiwgZGF0YSk7CisJCQl0ID0gZ3Nvbi5mcm9tSnNvbihkYXRhLCBjbGF6eik7CisJCQlpZiAodCA9PSBudWxsKSB7CisJCQkJbG9nLmluZm8oIm9iamVjdCBpcyBudWxsIGFmdGVyIGNvbnZlcnRpbmcgZnJvbSBqc29uIik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElOVkFMSUQgSlNPTgorCQkJbG9nLmluZm8oImZhaWxlZCB0byBjb252ZXJ0IGZyb20ganNvbiIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY29udmVydCBmcm9tIGpzb24iLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHQpOworCX0KKworCXByaXZhdGUgPFQ+IEVpdGhlcjxTdHJpbmcsIEFjdGlvblN0YXR1cz4gY29udmVydE9iamVjdFRvSnNvbihQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uKSB7CisJCVR5cGUgY29uc3RyYWludFR5cGUgPSBuZXcgVHlwZVRva2VuPFByb3BlcnR5Q29uc3RyYWludD4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5yZWdpc3RlclR5cGVBZGFwdGVyKGNvbnN0cmFpbnRUeXBlLCBuZXcgUHJvcGVydHlDb25zdHJhaW50U2VyaWFsaXNlcigpKS5jcmVhdGUoKTsKKwkJdHJ5IHsKKwkJCWxvZy50cmFjZSgiY29udmVydCBvYmplY3QgdG8ganNvbi4gcHJvcGVydHlEZWZpbml0aW9uPXt9IiwgcHJvcGVydHlEZWZpbml0aW9uLnRvU3RyaW5nKCkpOworCQkJU3RyaW5nIGpzb24gPSBnc29uLnRvSnNvbihwcm9wZXJ0eURlZmluaXRpb24pOworCQkJaWYgKGpzb24gPT0gbnVsbCkgeworCQkJCWxvZy5pbmZvKCJvYmplY3QgaXMgbnVsbCBhZnRlciBjb252ZXJ0aW5nIHRvIGpzb24iKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGpzb24pOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gSU5WQUxJRCBKU09OCisJCQlsb2cuaW5mbygiZmFpbGVkIHRvIGNvbnZlcnQgdG8ganNvbiIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY29udmVydCBmdG8ganNvbiIsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUJ1c2luZXNzTG9naWMgZ2V0UHJvcGVydHlCTChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlQcm9wZXJ0eUJ1c2luZXNzTG9naWMgcHJvcGVydHl0QmwgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihQcm9wZXJ0eUJ1c2luZXNzTG9naWMuY2xhc3MpOworCQlyZXR1cm4gcHJvcGVydHl0Qmw7CisJfQorCisJLy8gcHJpdmF0ZSBjbGFzcyBVaVByb3BlcnR5eworCS8vIFN0cmluZyB0eXBlOworCS8vIFN0cmluZyBzb3VyY2U7CisJLy8gU3RyaW5nIG5hbWU7CisJLy8gU3RyaW5nIGRlc2NyaXB0aW9uOworCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkvLyByZXR1cm4gdHlwZTsKKwkvLyB9CisJLy8gcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCS8vIHRoaXMudHlwZSA9IHR5cGU7CisJLy8gfQorCS8vIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgeworCS8vIHJldHVybiBzb3VyY2U7CisJLy8gfQorCS8vIHB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB7CisJLy8gdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisJLy8gfQorCS8vIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkvLyByZXR1cm4gbmFtZTsKKwkvLyB9CisJLy8gcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCS8vIHRoaXMubmFtZSA9IG5hbWU7CisJLy8gfQorCS8vIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJLy8gcmV0dXJuIGRlc2NyaXB0aW9uOworCS8vIH0KKwkvLyBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkvLyB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJLy8gfQorCS8vCisJLy8gfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUmVwcmVzZW50YXRpb25VdGlscy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1JlcHJlc2VudGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU5MTFlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1JlcHJlc2VudGF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLkpzb25HZW5lcmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5EZXNlcmlhbGl6YXRpb25Db25maWc7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLkpzb25NYXBwaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLlNlcmlhbGl6YXRpb25Db25maWcuRmVhdHVyZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuYW5ub3RhdGUuSnNvblNlcmlhbGl6ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OworCitwdWJsaWMgY2xhc3MgUmVwcmVzZW50YXRpb25VdGlscyB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVwcmVzZW50YXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVJlcCB7CisKKwl9CisKKwkvKioKKwkgKiBCdWlsZCBSZXByZXNlbnRhdGlvbiBvZiBnaXZlbiBPYmplY3QKKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudFRvUmVwcmVzZW50CisJICogQHJldHVybgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIEpzb25HZW5lcmF0aW9uRXhjZXB0aW9uCisJICogQHRocm93cyBKc29uTWFwcGluZ0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IE9iamVjdCB0b1JlcHJlc2VudGF0aW9uKFQgZWxlbWVudFRvUmVwcmVzZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIEpzb25HZW5lcmF0aW9uRXhjZXB0aW9uLCBKc29uTWFwcGluZ0V4Y2VwdGlvbiB7CisKKwkJLy8gcmV0dXJuIHRoZVJlc291cmNlOworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQltYXBwZXIuY29uZmlndXJlKEZlYXR1cmUuRkFJTF9PTl9FTVBUWV9CRUFOUywgZmFsc2UpOworCQltYXBwZXIuc2V0U2VyaWFsaXphdGlvbkluY2x1c2lvbihKc29uU2VyaWFsaXplLkluY2x1c2lvbi5OT05fTlVMTCk7CisJCXJldHVybiBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGVsZW1lbnRUb1JlcHJlc2VudCk7CisJfQorCisJcHVibGljIHN0YXRpYyA8VD4gVCBmcm9tUmVwcmVzZW50YXRpb24oU3RyaW5nIGpzb24sIENsYXNzPFQ+IGNsYXp6KSB7CisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJCVQgb2JqZWN0ID0gbnVsbDsKKwkJbWFwcGVyLmNvbmZpZ3VyZShEZXNlcmlhbGl6YXRpb25Db25maWcuRmVhdHVyZS5GQUlMX09OX1VOS05PV05fUFJPUEVSVElFUywgZmFsc2UpOworCQltYXBwZXIuY29uZmlndXJlKEZlYXR1cmUuRkFJTF9PTl9FTVBUWV9CRUFOUywgZmFsc2UpOworCQltYXBwZXIuc2V0U2VyaWFsaXphdGlvbkluY2x1c2lvbihKc29uU2VyaWFsaXplLkluY2x1c2lvbi5OT05fTlVMTCk7CisJCXRyeSB7CisJCQlvYmplY3QgPSBtYXBwZXIucmVhZFZhbHVlKGpzb24sIGNsYXp6KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiRXJyb3Igd2hlbiBwYXJzaW5nIEpTT04gb2Ygb2JqZWN0IG9mIHR5cGUge30iLCBjbGF6ei5nZXRTaW1wbGVOYW1lKCksIGUpOworCQl9IC8vIHJldHVybiBudWxsIGluIGNhc2Ugb2YgZXhjZXB0aW9uCisKKwkJcmV0dXJuIG9iamVjdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEFydGlmYWN0RGVmaW5pdGlvbiBjb252ZXJ0SnNvblRvQXJ0aWZhY3REZWZpbml0aW9uKFN0cmluZyBjb250ZW50LCBDbGFzczxBcnRpZmFjdERlZmluaXRpb24+IGNsYXp6KSB7CisKKwkJSnNvbk9iamVjdCBqc29uRWxlbWVudCA9IG5ldyBKc29uT2JqZWN0KCk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiByZXNvdXJjZUluZm8gPSBudWxsOworCQl0cnkgeworCQkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJCWpzb25FbGVtZW50ID0gZ3Nvbi5mcm9tSnNvbihjb250ZW50LCBqc29uRWxlbWVudC5nZXRDbGFzcygpKTsKKwkJCUpzb25FbGVtZW50IGFydGlmYWN0R3JvdXBWYWx1ZSA9IGpzb25FbGVtZW50LmdldChDb25zdGFudHMuQVJUSUZBQ1RfR1JPVVBfVFlQRV9GSUVMRCk7CisJCQlpZiAoYXJ0aWZhY3RHcm91cFZhbHVlICE9IG51bGwgJiYgIWFydGlmYWN0R3JvdXBWYWx1ZS5pc0pzb25OdWxsKCkpIHsKKwkJCQlTdHJpbmcgZ3JvdXBWYWx1ZVVwcGVyID0gYXJ0aWZhY3RHcm91cFZhbHVlLmdldEFzU3RyaW5nKCkudG9VcHBlckNhc2UoKTsKKwkJCQlpZiAoIUFydGlmYWN0R3JvdXBUeXBlRW51bS5nZXRBbGxUeXBlcygpLmNvbnRhaW5zKGdyb3VwVmFsdWVVcHBlcikpIHsKKwkJCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogQXJ0aWZhY3RHcm91cFR5cGVFbnVtLmdldEFsbFR5cGVzKCkpIHsKKwkJCQkJCXNiLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCIsICIpOworCQkJCQl9CisJCQkJCWxvZy5kZWJ1ZygiYXJ0aWZhY3RHcm91cFR5cGUgaXMge30uIHZhbGlkIHZhbHVlcyBhcmU6IHt9IiwgZ3JvdXBWYWx1ZVVwcGVyLCBzYi50b1N0cmluZygpKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJanNvbkVsZW1lbnQucmVtb3ZlKENvbnN0YW50cy5BUlRJRkFDVF9HUk9VUF9UWVBFX0ZJRUxEKTsKKwkJCQkJanNvbkVsZW1lbnQuYWRkUHJvcGVydHkoQ29uc3RhbnRzLkFSVElGQUNUX0dST1VQX1RZUEVfRklFTEQsIGdyb3VwVmFsdWVVcHBlcik7CisJCQkJfQorCQkJfQorCQkJU3RyaW5nIHBheWxvYWQgPSBudWxsOworCQkJSnNvbkVsZW1lbnQgYXJ0aWZhY3RQYXlsb2FkID0ganNvbkVsZW1lbnQuZ2V0KENvbnN0YW50cy5BUlRJRkFDVF9QQVlMT0FEX0RBVEEpOworCQkJaWYgKGFydGlmYWN0UGF5bG9hZCAhPSBudWxsICYmICFhcnRpZmFjdFBheWxvYWQuaXNKc29uTnVsbCgpKSB7CisJCQkJcGF5bG9hZCA9IGFydGlmYWN0UGF5bG9hZC5nZXRBc1N0cmluZygpOworCQkJfQorCQkJanNvbkVsZW1lbnQucmVtb3ZlKENvbnN0YW50cy5BUlRJRkFDVF9QQVlMT0FEX0RBVEEpOworCQkJcmVzb3VyY2VJbmZvID0gZ3Nvbi5mcm9tSnNvbihqc29uRWxlbWVudCwgY2xhenopOworCQkJcmVzb3VyY2VJbmZvLnNldFBheWxvYWREYXRhKHBheWxvYWQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVBcnRpZmFjdEluZm9ybWF0aW9uSW52YWxpZEVycm9yLCAiQXJ0aWZhY3QgVXBsb2FkIC8gVXBkYXRlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVBcnRpZmFjdEluZm9ybWF0aW9uSW52YWxpZEVycm9yKCJBcnRpZmFjdCBVcGxvYWQgLyBVcGRhdGUiKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNvbnZlcnQgdGhlIGNvbnRlbnQge30gdG8gb2JqZWN0LiB7fSIsIGNvbnRlbnQuc3Vic3RyaW5nKDAsIE1hdGgubWluKDUwLCBjb250ZW50Lmxlbmd0aCgpKSksIGUpOworCQl9CisKKwkJcmV0dXJuIHJlc291cmNlSW5mbzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXF1aXJlbWVudHNTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUmVxdWlyZW1lbnRzU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTNlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUmVxdWlyZW1lbnRzU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVBhcmFtOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2U7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZXM7CisKK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorcHVibGljIGNsYXNzIFJlcXVpcmVtZW50c1NlcnZsZXQgZXh0ZW5kcyBCZUdlbmVyaWNTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZXF1aXJlbWVudHNTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlAUFVUCisJQFBhdGgoInJlc291cmNlcy97cmVzb3VyY2VJZH0vcmVxdWlyZW1lbnRzL3tyZXF1aXJlbWVudElkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlVwZGF0ZSBSZXNvdXJjZSBSZXF1aXJlbWVudCIsIGh0dHBNZXRob2QgPSAiUFVUIiwgbm90ZXMgPSAiUmV0dXJucyB1cGRhdGVkIHJlcXVpcmVtZW50IiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXNvdXJjZSByZXF1aXJlbWVudCB1cGRhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVJlcXVpcmVtZW50KEBBcGlQYXJhbSh2YWx1ZSA9ICJyZXNvdXJjZSBpZCB0byB1cGRhdGUgd2l0aCBuZXcgcmVxdWlyZW1lbnQiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJyZXF1aXJlbWVudCBpZCB0byB1cGRhdGUiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInJlcXVpcmVtZW50SWQiKSBmaW5hbCBTdHJpbmcgcmVxdWlyZW1lbnRJZCwgQEFwaVBhcmFtKHZhbHVlID0gIlJlc291cmNlIHByb3BlcnR5IHRvIHVwZGF0ZSIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIHJlcXVpcmVtZW50RGF0YSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQkvLyBDb252ZXJ0IFJlcXVpcmVtZW50RGVmaW5pdGlvbiBmcm9tIEpTT04KKwkJLy8gVE9ETzogaXQncyBnb2luZyB0byBiZSBhbm90aGVyIG9iamVjdCwgcHJvYmFibHkuIFRoaXMgaXMgcGxhY2Vob2xkZXIKKwkJLy8gZm9yIHNha2Ugb2YgSlNPTiB2YWxpZGF0aW9uCisJCS8vIFJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZmluaXRpb247CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCQl0cnkgeworCQkJLy8gcmVxdWlyZW1lbnREZWZpbml0aW9uID0gZ3Nvbi5mcm9tSnNvbihyZXF1aXJlbWVudERhdGEsCisJCQkvLyBSZXF1aXJlbWVudERlZmluaXRpb24uY2xhc3MpOworCQkJLy8gLi4uLi4KKworCQkJLy8gVE9ETyBwYXNzIHJlYWwgZW50aXR5CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIG51bGwpOworCQl9IGNhdGNoIChKc29uU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCS8vIElOVkFMSUQgSlNPTgorCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJVbmV4cGVjdGVkIGVycm9yOiB7fSIsIGUpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZUFydGlmYWN0RG93bmxvYWRTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUmVzb3VyY2VBcnRpZmFjdERvd25sb2FkU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzE4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvUmVzb3VyY2VBcnRpZmFjdERvd25sb2FkU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuUmVzb3VyY2VVcGxvYWRTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Eb3dubG9hZEFydGlmYWN0TG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW5mby5BcnRpZmFjdEFjY2Vzc0luZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmFwaS5JUmVzb3VyY2VVcGxvYWRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NhdGFsb2cvcmVzb3VyY2VzL2F2YWlsYWJsZSIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VBcnRpZmFjdERvd25sb2FkU2VydmxldCBleHRlbmRzIFRvc2NhRGFvU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzb3VyY2VBcnRpZmFjdERvd25sb2FkU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCisJLy8gQEdFVAorCS8vIEBQYXRoKCIve3Jlc291cmNlTmFtZX0ve3Jlc291cmNlVmVyc2lvbn0vYXJ0aWZhY3RzIikKKwkvLyBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJLy8gcHVibGljIFJlc3BvbnNlIGdldFJlc291cmNlQXJ0aWZhY3RMaXN0KEBQYXRoUGFyYW0oInJlc291cmNlTmFtZSIpIGZpbmFsCisJLy8gU3RyaW5nIHJlc291cmNlTmFtZSwKKwkvLyBAUGF0aFBhcmFtKCJyZXNvdXJjZVZlcnNpb24iKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLAorCS8vIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KXsKKwkvLworCS8vCisJLy8gU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkvLyBsb2cuaW5mbygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCS8vCisJLy8gUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCS8vCisJLy8gLy8gZ2V0IGFydGlmYWN0IGxpc3QgZnJvbSBkYW8KKwkvLyBJUmVzb3VyY2VVcGxvYWRlciByZXNvdXJjZURhbyA9CisJLy8gZ2V0UmVzb3VyY2VVcGxvYWRlcihyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKwkvLyBpZiAocmVzb3VyY2VEYW8gPT0gbnVsbCl7CisJLy8gbG9nLmVycm9yKCJyZXNvdXJjZSBkYW8gY2Fubm90IGJlIGZvdW5kIik7CisJLy8gcmVzcG9uc2UgPSBidWlsZFJlc3BvbnNlKEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorCS8vICJSZXNvdXJjZSBkYW8gY2Fubm90IGJlIGZvdW5kIik7CisJLy8gcmV0dXJuIHJlc3BvbnNlOworCS8vIH0KKwkvLyBFaXRoZXI8TGlzdDxFU0FydGlmYWN0RGF0YT4sIFJlc291cmNlVXBsb2FkU3RhdHVzPiBnZXRBcnRpZmFjdHNTdGF0dXMgPQorCS8vIHJlc291cmNlRGFvLmdldEFydGlmYWN0cyhyZXNvdXJjZU5hbWUsIHJlc291cmNlVmVyc2lvbik7CisJLy8KKwkvLyByZXNwb25zZSA9CisJLy8gZ2V0TG9naWMocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSkuY3JlYXRlQXJ0aWZhY3RMaXN0UmVzcG9uc2UocmVzb3VyY2VOYW1lLAorCS8vIGdldEFydGlmYWN0c1N0YXR1cywgZ2V0U2VydmxldFBhdGgocmVxdWVzdCkpOworCS8vCisJLy8gbG9nLmluZm8oIkZpbmlzaCBoYW5kbGUgcmVxdWVzdCBvZiB7fSB8IHJlc3VsdCA9IHt9IiwgdXJsLCByZXNwb25zZS5nZXRTdGF0dXMoKSApOworCS8vIHJldHVybiByZXNwb25zZTsKKwkvLworCS8vIH0KKworCUBHRVQKKwlAUGF0aCgiL3tyZXNvdXJjZU5hbWV9L3tyZXNvdXJjZVZlcnNpb259L2FydGlmYWN0cy97YXJ0aWZhY3ROYW1lfSIpCisJLy8gQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU0pCisJcHVibGljIFJlc3BvbnNlIGdldFJlc291cmNlQXJ0aWZhY3RCeU5hbWUoQFBhdGhQYXJhbSgicmVzb3VyY2VOYW1lIikgZmluYWwgU3RyaW5nIHJlc291cmNlTmFtZSwgQFBhdGhQYXJhbSgicmVzb3VyY2VWZXJzaW9uIikgZmluYWwgU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgQFBhdGhQYXJhbSgiYXJ0aWZhY3ROYW1lIikgZmluYWwgU3RyaW5nIGFydGlmYWN0TmFtZSwKKwkJCUBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCS8vIGdldCB0aGUgYXJ0aWZhY3QgZGF0YQorCQkJU3RyaW5nIGFydGlmYWN0SWQgPSBTdHJpbmcuZm9ybWF0KENvbnN0YW50cy5BUlRJRkFDVF9JRF9GT1JNQVQsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uLCBhcnRpZmFjdE5hbWUpOworCisJCQlJUmVzb3VyY2VVcGxvYWRlciByZXNvdWNlVXBsb2FkZXIgPSBnZXRSZXNvdXJjZVVwbG9hZGVyKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJaWYgKHJlc291Y2VVcGxvYWRlciA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGJ1aWxkUmVzcG9uc2UoSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsICIiKTsKKworCQkJfQorCQkJRWl0aGVyPEVTQXJ0aWZhY3REYXRhLCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZ2V0QXJ0aWZhY3RTdGF0dXMgPSByZXNvdWNlVXBsb2FkZXIuZ2V0QXJ0aWZhY3QoYXJ0aWZhY3RJZCk7CisKKwkJCURvd25sb2FkQXJ0aWZhY3RMb2dpYyBsb2dpYyA9IGdldExvZ2ljKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCQkJaWYgKGxvZ2ljID09IG51bGwpIHsKKwkJCQlyZXR1cm4gYnVpbGRSZXNwb25zZShIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgIiIpOworCisJCQl9CisJCQlyZXNwb25zZSA9IGxvZ2ljLmRvd25sb2FkQXJ0aWZhY3QocmVzb3VyY2VOYW1lLCByZXNvdXJjZVZlcnNpb24sIGFydGlmYWN0TmFtZSwgZ2V0QXJ0aWZhY3RTdGF0dXMsIGFydGlmYWN0SWQpOworCisJCQlsb2cuaW5mbygiRmluaXNoIGhhbmRsZSByZXF1ZXN0IG9mICB7fSB8IHJlc3VsdCA9IHt9IiwgdXJsLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgUmVzb3VyY2UgQXJ0aWZhY3QgQnkgTmFtZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFJlc291cmNlIEFydGlmYWN0IEJ5IE5hbWUiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0UmVzb3VyY2VBcnRpZmFjdEJ5TmFtZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi97cmVzb3VyY2VOYW1lfS97cmVzb3VyY2VWZXJzaW9ufS9hcnRpZmFjdHMve2FydGlmYWN0TmFtZX0vbWV0YWRhdGEiKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0UmVzb3VyY2VBcnRpZmFjdE1ldGFkYXRhKEBQYXRoUGFyYW0oInJlc291cmNlTmFtZSIpIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUsIEBQYXRoUGFyYW0oInJlc291cmNlVmVyc2lvbiIpIGZpbmFsIFN0cmluZyByZXNvdXJjZVZlcnNpb24sIEBQYXRoUGFyYW0oImFydGlmYWN0TmFtZSIpIGZpbmFsIFN0cmluZyBhcnRpZmFjdE5hbWUsCisJCQlAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUlSZXNvdXJjZVVwbG9hZGVyIHJlc291cmNlRGFvID0gZ2V0UmVzb3VyY2VVcGxvYWRlcihyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKwkJCWlmIChyZXNvdXJjZURhbyA9PSBudWxsKSB7CisJCQkJbG9nLmVycm9yKCJyZXNvdXJjZSBkYW8gY2Fubm90IGJlIGZvdW5kIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZFJlc3BvbnNlKEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAiUmVzb3VyY2UgZGFvIGNhbm5vdCBiZSBmb3VuZCIpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKworCQkJU3RyaW5nIGFydGlmYWN0SWQgPSBTdHJpbmcuZm9ybWF0KENvbnN0YW50cy5BUlRJRkFDVF9JRF9GT1JNQVQsIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uLCBhcnRpZmFjdE5hbWUpOworCQkJRWl0aGVyPEVTQXJ0aWZhY3REYXRhLCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZ2V0QXJ0aWZhY3RTdGF0dXMgPSByZXNvdXJjZURhby5nZXRBcnRpZmFjdChhcnRpZmFjdElkKTsKKworCQkJaWYgKGdldEFydGlmYWN0U3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCVJlc291cmNlVXBsb2FkU3RhdHVzIHN0YXR1cyA9IGdldEFydGlmYWN0U3RhdHVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzID09IFJlc291cmNlVXBsb2FkU3RhdHVzLkNPTVBPTkVOVF9OT1RfRVhJU1QpIHsKKwkJCQkJcmVzcG9uc2UgPSBSZXNwb25zZS5zdGF0dXMoSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQpLmJ1aWxkKCk7CisJCQkJCWxvZy5kZWJ1ZygiQ291bGQgbm90IGZpbmQgYXJ0aWZhY3QgZm9yIHdpdGggaWQ6IHt9IiwgYXJ0aWZhY3RJZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzcG9uc2UgPSBSZXNwb25zZS5zdGF0dXMoSHR0cFN0YXR1cy5TQ19OT19DT05URU5UKS5idWlsZCgpOworCQkJCQlsb2cuZGVidWcoIkNvdWxkIG5vdCBmaW5kIGFydGlmYWN0IGZvciB3aXRoIGlkOiB7fSIsIGFydGlmYWN0SWQpOworCQkJCX0KKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9IGVsc2UgeworCQkJCUVTQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IGdldEFydGlmYWN0U3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiZm91bmQgYXJ0aWZhY3Qgd2l0aCBpZDoge30iLCBhcnRpZmFjdElkKTsKKwkJCQlBcnRpZmFjdEFjY2Vzc0luZm8gYXJ0aWZhY3RJbmZvID0gbmV3IEFydGlmYWN0QWNjZXNzSW5mbyhhcnRpZmFjdERhdGEpOworCQkJCVN0cmluZyBhcnRpZmFjdERhdGFKc29uID0gZ3Nvbi50b0pzb24oYXJ0aWZhY3RJbmZvKTsKKwkJCQlyZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cyhIdHRwU3RhdHVzLlNDX09LKS5lbnRpdHkoYXJ0aWZhY3REYXRhSnNvbikudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5idWlsZCgpOworCisJCQkJbG9nLmluZm8oIkZpbmlzaCBoYW5kbGUgcmVxdWVzdCBvZiB7fSB8IHJlc3VsdCA9IHt9IiwgdXJsLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBSZXNvdXJjZSBBcnRpZmFjdCBNZXRhZGF0YSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFJlc291cmNlIEFydGlmYWN0IE1ldGFkYXRhIik7CisJCQlsb2cuZGVidWcoImdldFJlc291cmNlQXJ0aWZhY3RNZXRhZGF0YSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgeworCQlyZXR1cm4gbG9nOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZVVwbG9hZFNlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZVVwbG9hZFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q3NjVhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1Jlc291cmNlVXBsb2FkU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc291cmNlSW1wb3J0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVwbG9hZFJlc291cmNlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGk7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCisvKioKKyAqIFJvb3QgcmVzb3VyY2UgKGV4cG9zZWQgYXQgIi8iIHBhdGgpCisgKi8KK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi92MS9jYXRhbG9nL3VwbG9hZCIpCitAQXBpKHZhbHVlID0gIlJlc291cmNlcyBDYXRhbG9nIFVwbG9hZCIsIGRlc2NyaXB0aW9uID0gIlVwbG9hZCByZXNvdXJjZSB5YW1sIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVVwbG9hZFNlcnZsZXQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25zU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzb3VyY2VVcGxvYWRTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFUSVZFX1RZUEVfUkVTT1VSQ0UgPSAibXVsdGlwYXJ0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RZUEVfUkVTT1VSQ0UgPSAidXNlci1yZXNvdXJjZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9UWVBFX1JFU09VUkNFX1VJX0lNUE9SVCA9ICJ1c2VyLXJlc291cmNlLXVpLWltcG9ydCI7CisKKwlwdWJsaWMgZW51bSBSZXNvdXJjZUF1dGhvcml0eVR5cGVFbnVtIHsKKwkJTk9STUFUSVZFX1RZUEVfQkUoTk9STUFUSVZFX1RZUEVfUkVTT1VSQ0UsIHRydWUsIGZhbHNlKSwgVVNFUl9UWVBFX0JFKFVTRVJfVFlQRV9SRVNPVVJDRSwgdHJ1ZSwgdHJ1ZSksIFVTRVJfVFlQRV9VSShVU0VSX1RZUEVfUkVTT1VSQ0VfVUlfSU1QT1JULCBmYWxzZSwgdHJ1ZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdXJsUGF0aDsKKwkJcHJpdmF0ZSBib29sZWFuIGlzQmFja0VuZEltcG9ydCwgaXNVc2VyVHlwZVJlc291cmNlOworCisJCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VBdXRob3JpdHlUeXBlRW51bSBmaW5kQnlVcmxQYXRoKFN0cmluZyB1cmxQYXRoKSB7CisJCQlSZXNvdXJjZUF1dGhvcml0eVR5cGVFbnVtIGZvdW5kID0gbnVsbDsKKwkJCWZvciAoUmVzb3VyY2VBdXRob3JpdHlUeXBlRW51bSBjdXJyIDogUmVzb3VyY2VBdXRob3JpdHlUeXBlRW51bS52YWx1ZXMoKSkgeworCQkJCWlmIChjdXJyLmdldFVybFBhdGgoKS5lcXVhbHModXJsUGF0aCkpIHsKKwkJCQkJZm91bmQgPSBjdXJyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZm91bmQ7CisJCX0KKworCQlwcml2YXRlIFJlc291cmNlQXV0aG9yaXR5VHlwZUVudW0oU3RyaW5nIHVybFBhdGgsIGJvb2xlYW4gaXNCYWNrRW5kSW1wb3J0LCBib29sZWFuIGlzVXNlclR5cGVSZXNvdXJjZSkgeworCQkJdGhpcy51cmxQYXRoID0gdXJsUGF0aDsKKwkJCXRoaXMuaXNCYWNrRW5kSW1wb3J0ID0gaXNCYWNrRW5kSW1wb3J0OworCQkJdGhpcy5pc1VzZXJUeXBlUmVzb3VyY2UgPSBpc1VzZXJUeXBlUmVzb3VyY2U7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFVybFBhdGgoKSB7CisJCQlyZXR1cm4gdXJsUGF0aDsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzQmFja0VuZEltcG9ydCgpIHsKKwkJCXJldHVybiBpc0JhY2tFbmRJbXBvcnQ7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc1VzZXJUeXBlUmVzb3VyY2UoKSB7CisJCQlyZXR1cm4gaXNVc2VyVHlwZVJlc291cmNlOworCQl9CisJfQorCisJQFJlc291cmNlCisJcHJpdmF0ZSBSZXNvdXJjZUltcG9ydE1hbmFnZXIgcmVzb3VyY2VJbXBvcnRNYW5hZ2VyOworCisJQFBPU1QKKwlAUGF0aCgiL3tyZXNvdXJjZUF1dGhvcml0eX0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgUmVzb3VyY2UgZnJvbSB5YW1sIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIHJlc291cmNlIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJSZXNvdXJjZSBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiUmVzb3VyY2UgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwbG9hZE11bHRpcGFydCgKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJ2YWxpZFZhbHVlczogbm9ybWF0aXZlLXJlc291cmNlIC8gdXNlci1yZXNvdXJjZSIsIGFsbG93YWJsZVZhbHVlcyA9IE5PUk1BVElWRV9UWVBFX1JFU09VUkNFICsgIiwiICsgVVNFUl9UWVBFX1JFU09VUkNFICsgIiwiCisJCQkJCSsgVVNFUl9UWVBFX1JFU09VUkNFX1VJX0lNUE9SVCkgQFBhdGhQYXJhbSh2YWx1ZSA9ICJyZXNvdXJjZUF1dGhvcml0eSIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUF1dGhvcml0eSwKKwkJCUBBcGlQYXJhbSgiRmlsZUlucHV0U3RyZWFtIikgQEZvcm1EYXRhUGFyYW0oInJlc291cmNlWmlwIikgRmlsZSBmaWxlLCBAQXBpUGFyYW0oIkNvbnRlbnREaXNwb3NpdGlvbiIpIEBGb3JtRGF0YVBhcmFtKCJyZXNvdXJjZVppcCIpIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciwKKwkJCUBBcGlQYXJhbSgicmVzb3VyY2VNZXRhZGF0YSIpIEBGb3JtRGF0YVBhcmFtKCJyZXNvdXJjZU1ldGFkYXRhIikgU3RyaW5nIHJlc291cmNlSW5mb0pzb25TdHJpbmcsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsCisJCQkvLyB1cGRhdGVSZXNvdXJzZSBRdWVyeSBQYXJhbWV0ZXIgaWYgZmFsc2UgY2hlY2tzIGlmIGFscmVhZHkgZXhpc3QKKwkJCUBEZWZhdWx0VmFsdWUoInRydWUiKSBAUXVlcnlQYXJhbSgiY3JlYXRlTmV3VmVyc2lvbiIpIGJvb2xlYW4gY3JlYXRlTmV3VmVyc2lvbikgeworCisJCWluaXQocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSk7CisJCXRyeSB7CisKKwkJCVdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJCVdyYXBwZXI8VXNlcj4gdXNlcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCQlXcmFwcGVyPFVwbG9hZFJlc291cmNlSW5mbz4gdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJCVdyYXBwZXI8U3RyaW5nPiB5YW1sU3RyaW5nV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKworCQkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCQkvLyBXaGVuIHdlIGdldCBhbiBlcnJvclJlc3BvbnNlIGl0IHdpbGwgYmUgZmlsbGVkIGludG8gdGhlCisJCQkvLyByZXNwb25zZVdyYXBwZXIKKwkJCXZhbGlkYXRlQXV0aG9yaXR5VHlwZShyZXNwb25zZVdyYXBwZXIsIHJlc291cmNlQXV0aG9yaXR5KTsKKworCQkJUmVzb3VyY2VBdXRob3JpdHlUeXBlRW51bSByZXNvdXJjZUF1dGhvcml0eUVudW0gPSBSZXNvdXJjZUF1dGhvcml0eVR5cGVFbnVtLmZpbmRCeVVybFBhdGgocmVzb3VyY2VBdXRob3JpdHkpOworCisJCQljb21tb25HZW5lcmFsVmFsaWRhdGlvbnMocmVzcG9uc2VXcmFwcGVyLCB1c2VyV3JhcHBlciwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlciwgcmVzb3VyY2VBdXRob3JpdHlFbnVtLCB1c2VySWQsIHJlc291cmNlSW5mb0pzb25TdHJpbmcpOworCisJCQlmaWxsUGF5bG9hZChyZXNwb25zZVdyYXBwZXIsIHVwbG9hZFJlc291cmNlSW5mb1dyYXBwZXIsIHlhbWxTdHJpbmdXcmFwcGVyLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgcmVzb3VyY2VJbmZvSnNvblN0cmluZywgcmVzb3VyY2VBdXRob3JpdHlFbnVtLCBmaWxlKTsKKworCQkJLy8gUGF5TG9hZCBWYWxpZGF0aW9ucworCQkJY29tbW9uUGF5bG9hZFZhbGlkYXRpb25zKHJlc3BvbnNlV3JhcHBlciwgeWFtbFN0cmluZ1dyYXBwZXIsIHVzZXJXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKworCQkJc3BlY2lmaWNSZXNvdXJjZUF1dGhvcml0eVZhbGlkYXRpb25zKHJlc3BvbnNlV3JhcHBlciwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlciwgeWFtbFN0cmluZ1dyYXBwZXIsIHVzZXJXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCByZXF1ZXN0LCByZXNvdXJjZUluZm9Kc29uU3RyaW5nLCByZXNvdXJjZUF1dGhvcml0eUVudW0pOworCisJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCWhhbmRsZUltcG9ydChyZXNwb25zZVdyYXBwZXIsIHVzZXJXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCB5YW1sU3RyaW5nV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgcmVzb3VyY2VBdXRob3JpdHlFbnVtLCBjcmVhdGVOZXdWZXJzaW9uLCBudWxsKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIlVwbG9hZCBSZXNvdXJjZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiVXBsb2FkIFJlc291cmNlIik7CisJCQlsb2cuZGVidWcoInVwbG9hZCByZXNvdXJjZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCXByaXZhdGUgdm9pZCBpbml0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJaW5pdChsb2cpOworCQlXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID0gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKwkJV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChjb250ZXh0KTsKKwkJcmVzb3VyY2VJbXBvcnRNYW5hZ2VyID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oUmVzb3VyY2VJbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwkJcmVzb3VyY2VJbXBvcnRNYW5hZ2VyLmluaXQoY29udGV4dCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1Jlc291cmNlc1NlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZXNTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkMzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZXNTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw2OTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ3NhclZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW1wb3J0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc291cmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwuYXBpLkhpZ2hlc3RGaWx0ZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLlJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlTWV0YWRhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVwbG9hZFJlc291cmNlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0cy5SZXNvdXJjZVVwbG9hZFNlcnZsZXQuUmVzb3VyY2VBdXRob3JpdHlUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVBhcmFtOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2U7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZXM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLkRFQlVHLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL3YxL2NhdGFsb2ciKQorQEFwaSh2YWx1ZSA9ICJSZXNvdXJjZXMgQ2F0YWxvZyIsIGRlc2NyaXB0aW9uID0gIlJlc291cmNlcyBTZXJ2bGV0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNTZXJ2bGV0IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uc1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc291cmNlc1NlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBQT1NUCisJQFBhdGgoIi9yZXNvdXJjZXMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgUmVzb3VyY2UiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgcmVzb3VyY2UiLCByZXNwb25zZSA9IFJlc291cmNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIlJlc291cmNlIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJSZXNvdXJjZSBhbHJlYWR5IGV4aXN0IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgY3JlYXRlUmVzb3VyY2UoQEFwaVBhcmFtKHZhbHVlID0gIlJlc291cmNlIG9iamVjdCB0byBiZSBjcmVhdGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCXVzZXJJZCA9ICh1c2VySWQgIT0gbnVsbCkgPyB1c2VySWQgOiByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCQlpbml0KGxvZyk7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQl0cnkgeworCisJCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCQkvLyBVSSBJbXBvcnQKKwkJCWlmIChpc1VJSW1wb3J0KGRhdGEpKSB7CisJCQkJcGVyZm9ybVVJSW1wb3J0KHJlc3BvbnNlV3JhcHBlciwgZGF0YSwgcmVxdWVzdCwgdXNlcklkLCBudWxsKTsKKwkJCX0KKwkJCS8vIFVJIENyZWF0ZQorCQkJZWxzZSB7CisKKwkJCQlSZXNvdXJjZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoY29udGV4dCk7CisKKwkJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0UmVzcG9uc2UgPSBwYXJzZVRvUmVzb3VyY2UoZGF0YSwgbW9kaWZpZXIpOworCQkJCWlmIChjb252ZXJ0UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHBhcnNlIHJlc291cmNlIik7CisJCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGNvbnZlcnRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQkJfQorCisJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb252ZXJ0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCQkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmNyZWF0ZVJlc291cmNlKHJlc291cmNlLCBtb2RpZmllciwgbnVsbCwgbnVsbCk7CisKKwkJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSByZXNvdXJjZSIpOworCQkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCU9iamVjdCByZXByZXNlbnRhdGlvbiA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKSwgcmVwcmVzZW50YXRpb24pOworCQkJCX0KKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKworCQkJLy8gcmV0dXJuIHJlc3BvbnNlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkNyZWF0ZSBSZXNvdXJjZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiQ3JlYXRlIFJlc291cmNlIik7CisJCQlsb2cuZGVidWcoImNyZWF0ZSByZXNvdXJjZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1VJSW1wb3J0KFN0cmluZyBkYXRhKSB7CisJCWJvb2xlYW4gaXNVSUltcG9ydDsKKwkJdHJ5IHsKKwkJCUpTT05PYmplY3QganNvbiA9IG5ldyBKU09OT2JqZWN0KGRhdGEpOworCQkJU3RyaW5nIHBheWxvYWROYW1lID0ganNvbi5nZXRTdHJpbmcoSW1wb3J0VXRpbHMuQ29uc3RhbnRzLlVJX0pTT05fUEFZTE9BRF9OQU1FKTsKKwkJCWlzVUlJbXBvcnQgPSBwYXlsb2FkTmFtZSAhPSBudWxsICYmICFwYXlsb2FkTmFtZS5pc0VtcHR5KCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBwYXJzZSBqc29uIHNlbnQgZnJvbSBjbGllbnQsIGpzb246e30iLCBkYXRhKTsKKwkJCWlzVUlJbXBvcnQgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gaXNVSUltcG9ydDsKKwl9CisKKwlwcml2YXRlIHZvaWQgcGVyZm9ybVVJSW1wb3J0KFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgU3RyaW5nIGRhdGEsIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgcmVzb3VyY2VVbmlxdWVJZCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwkJV3JhcHBlcjxVc2VyPiB1c2VyV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJV3JhcHBlcjxVcGxvYWRSZXNvdXJjZUluZm8+IHVwbG9hZFJlc291cmNlSW5mb1dyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVdyYXBwZXI8U3RyaW5nPiB5YW1sU3RyaW5nV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJU3RyaW5nIHJlc291cmNlSW5mb0pzb25TdHJpbmcgPSBkYXRhOworCisJCVJlc291cmNlQXV0aG9yaXR5VHlwZUVudW0gcmVzb3VyY2VBdXRob3JpdHlFbnVtID0gUmVzb3VyY2VBdXRob3JpdHlUeXBlRW51bS5VU0VSX1RZUEVfVUk7CisKKwkJY29tbW9uR2VuZXJhbFZhbGlkYXRpb25zKHJlc3BvbnNlV3JhcHBlciwgdXNlcldyYXBwZXIsIHVwbG9hZFJlc291cmNlSW5mb1dyYXBwZXIsIHJlc291cmNlQXV0aG9yaXR5RW51bSwgdXNlcklkLCByZXNvdXJjZUluZm9Kc29uU3RyaW5nKTsKKworCQkvLyBUT0RPIHN1c3BlY3QgbmV4dCBsaW5lIGlzIHVubmVjZXNzYXJ5CisJCXVzZXJXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQlpZiAoIUNzYXJWYWxpZGF0aW9uVXRpbHMuaXNDc2FyUGF5bG9hZE5hbWUodXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKS5nZXRQYXlsb2FkTmFtZSgpKSkgeworCQkJZmlsbFBheWxvYWQocmVzcG9uc2VXcmFwcGVyLCB1cGxvYWRSZXNvdXJjZUluZm9XcmFwcGVyLCB5YW1sU3RyaW5nV3JhcHBlciwgdXNlcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHJlc291cmNlSW5mb0pzb25TdHJpbmcsIHJlc291cmNlQXV0aG9yaXR5RW51bSwgbnVsbCk7CisKKwkJCS8vIFBheUxvYWQgVmFsaWRhdGlvbnMKKwkJCWNvbW1vblBheWxvYWRWYWxpZGF0aW9ucyhyZXNwb25zZVdyYXBwZXIsIHlhbWxTdHJpbmdXcmFwcGVyLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJc3BlY2lmaWNSZXNvdXJjZUF1dGhvcml0eVZhbGlkYXRpb25zKHJlc3BvbnNlV3JhcHBlciwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlciwgeWFtbFN0cmluZ1dyYXBwZXIsIHVzZXJXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCByZXF1ZXN0LCByZXNvdXJjZUluZm9Kc29uU3RyaW5nLCByZXNvdXJjZUF1dGhvcml0eUVudW0pOworCisJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQloYW5kbGVJbXBvcnQocmVzcG9uc2VXcmFwcGVyLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgdXBsb2FkUmVzb3VyY2VJbmZvV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgeWFtbFN0cmluZ1dyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHJlc291cmNlQXV0aG9yaXR5RW51bSwgdHJ1ZSwgcmVzb3VyY2VVbmlxdWVJZCk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gcGFyc2VUb1Jlc291cmNlKFN0cmluZyByZXNvdXJjZUpzb24sIFVzZXIgdXNlcikgeworCQlyZXR1cm4gZ2V0Q29tcG9uZW50c1V0aWxzKCkuY29udmVydEpzb25Ub09iamVjdFVzaW5nT2JqZWN0TWFwcGVyKHJlc291cmNlSnNvbiwgdXNlciwgUmVzb3VyY2UuY2xhc3MsIEF1ZGl0aW5nQWN0aW9uRW51bS5DUkVBVEVfUkVTT1VSQ0UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gcGFyc2VUb0xpZ2h0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlSnNvbiwgVXNlciB1c2VyKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IHJldCA9IGdldENvbXBvbmVudHNVdGlscygpLmNvbnZlcnRKc29uVG9PYmplY3RVc2luZ09iamVjdE1hcHBlcihyZXNvdXJjZUpzb24sIHVzZXIsIFJlc291cmNlLmNsYXNzLCBBdWRpdGluZ0FjdGlvbkVudW0uVVBEQVRFX1JFU09VUkNFX01FVEFEQVRBLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWlmIChyZXQuaXNMZWZ0KCkpIHsvLyBkcm9wIHVud2FudGVkIGRhdGEgKHNlbnQgZnJvbSBVSSBpbiB1cGRhdGUgZmxvdykKKwkJCXJldC5sZWZ0KCkudmFsdWUoKS5zZXRSZXF1aXJlbWVudHMobnVsbCk7CisJCQlyZXQubGVmdCgpLnZhbHVlKCkuc2V0Q2FwYWJpbGl0aWVzKG51bGwpOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJQERFTEVURQorCUBQYXRoKCIvcmVzb3VyY2VzL3tyZXNvdXJjZUlkfSIpCisJcHVibGljIFJlc3BvbnNlIGRlbGV0ZVJlc291cmNlKEBQYXRoUGFyYW0oInJlc291cmNlSWQiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQkvLyBnZXQgbW9kaWZpZXIgaWQKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlTdHJpbmcgcmVzb3VyY2VJZExvd2VyID0gcmVzb3VyY2VJZC50b0xvd2VyQ2FzZSgpOworCQkJUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRSZXNvdXJjZUJMKGNvbnRleHQpOworCQkJUmVzcG9uc2VGb3JtYXQgYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmRlbGV0ZVJlc291cmNlKHJlc291cmNlSWRMb3dlciwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gSHR0cFN0YXR1cy5TQ19OT19DT05URU5UKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIHJlc291cmNlIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKSwgbnVsbCk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJEZWxldGUgUmVzb3VyY2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkRlbGV0ZSBSZXNvdXJjZSIpOworCQkJbG9nLmRlYnVnKCJkZWxldGUgcmVzb3VyY2UgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwlAREVMRVRFCisJQFBhdGgoIi9yZXNvdXJjZXMve3Jlc291cmNlTmFtZX0ve3ZlcnNpb259IikKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKEBQYXRoUGFyYW0oInJlc291cmNlTmFtZSIpIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUsIEBQYXRoUGFyYW0oInZlcnNpb24iKSBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQkvLyBnZXQgbW9kaWZpZXIgaWQKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlSZXNvdXJjZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoY29udGV4dCk7CisJCQlSZXNwb25zZUZvcm1hdCBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZGVsZXRlUmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHJlc291cmNlTmFtZSwgdmVyc2lvbiwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gSHR0cFN0YXR1cy5TQ19OT19DT05URU5UKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIHJlc291cmNlIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKSwgbnVsbCk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJEZWxldGUgUmVzb3VyY2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkRlbGV0ZSBSZXNvdXJjZSIpOworCQkJbG9nLmRlYnVnKCJkZWxldGUgcmVzb3VyY2UgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi9yZXNvdXJjZXMve3Jlc291cmNlSWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiUmV0cmlldmUgUmVzb3VyY2UiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgcmVzb3VyY2UgYWNjb3JkaW5nIHRvIHJlc291cmNlSWQiLCByZXNwb25zZSA9IFJlc291cmNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJlc291cmNlIGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlJlc291cmNlIG5vdCBmb3VuZCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldFJlc291cmNlQnlJZChAUGF0aFBhcmFtKCJyZXNvdXJjZUlkIikgZmluYWwgU3RyaW5nIHJlc291cmNlSWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQkvLyBnZXQgbW9kaWZpZXIgaWQKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCVN0cmluZyByZXNvdXJjZUlkTG93ZXIgPSByZXNvdXJjZUlkLnRvTG93ZXJDYXNlKCk7CisJCQlSZXNvdXJjZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoY29udGV4dCk7CisJCQlsb2cudHJhY2UoImdldCByZXNvdXJjZSB3aXRoIGlkIHt9IiwgcmVzb3VyY2VJZCk7CisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0UmVzb3VyY2UocmVzb3VyY2VJZExvd2VyLCBtb2RpZmllcik7CisKKwkJCWlmIChhY3Rpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgcmVzb3VyY2UiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCU9iamVjdCByZXNvdXJjZSA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlc291cmNlKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBSZXNvdXJjZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFJlc291cmNlIik7CisJCQlsb2cuZGVidWcoImdldCByZXNvdXJjZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIvcmVzb3VyY2VzL3Jlc291cmNlTmFtZS97cmVzb3VyY2VOYW1lfS9yZXNvdXJjZVZlcnNpb24ve3Jlc291cmNlVmVyc2lvbn0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJSZXRyaWV2ZSBSZXNvdXJjZSBieSBuYW1lIGFuZCB2ZXJzaW9uIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIHJlc291cmNlIGFjY29yZGluZyB0byByZXNvdXJjZUlkIiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXNvdXJjZSBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJSZXNvdXJjZSBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24oQFBhdGhQYXJhbSgicmVzb3VyY2VOYW1lIikgZmluYWwgU3RyaW5nIHJlc291cmNlTmFtZSwgQFBhdGhQYXJhbSgicmVzb3VyY2VWZXJzaW9uIikgZmluYWwgU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVJlc291cmNlQnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0UmVzb3VyY2VCTChjb250ZXh0KTsKKwkJCUVpdGhlcjxMaXN0PFJlc291cmNlPiwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy5nZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24ocmVzb3VyY2VOYW1lLCByZXNvdXJjZVZlcnNpb24sIHVzZXJJZCk7CisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCQlPYmplY3QgcmVzb3VyY2UgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXNvdXJjZSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgUmVzb3VyY2UgYnkgbmFtZSBhbmQgdmVyc2lvbiIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFJlc291cmNlIGJ5IG5hbWUgYW5kIHZlcnNpb24iKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0IHJlc291cmNlIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi9yZXNvdXJjZXMvdmFsaWRhdGUtbmFtZS97cmVzb3VyY2VOYW1lfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gInZhbGlkYXRlIHJlc291cmNlIG5hbWUiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gImNoZWNrcyBpZiB0aGUgY2hvc2VuIHJlc291cmNlIG5hbWUgaXMgYXZhaWxhYmxlICIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSB9KQorCXB1YmxpYyBSZXNwb25zZSB2YWxpZGF0ZVJlc291cmNlTmFtZShAUGF0aFBhcmFtKCJyZXNvdXJjZU5hbWUiKSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lLCBAUXVlcnlQYXJhbSgic3VidHlwZSIpIFN0cmluZyByZXNvdXJjZVR5cGUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCS8vIGdldCBtb2RpZmllciBpZAorCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlSZXNvdXJjZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoY29udGV4dCk7CisKKwkJCWlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCAmJiAhUmVzb3VyY2VUeXBlRW51bS5jb250YWlucyhyZXNvdXJjZVR5cGUpKSB7CisJCQkJbG9nLmRlYnVnKCJpbnZhbGlkIHJlc291cmNlIHR5cGUgcmVjZWl2ZWQiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCQl9CisJCQlSZXNvdXJjZVR5cGVFbnVtIHR5cGVFbnVtID0gbnVsbDsKKwkJCWlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgeworCQkJCXR5cGVFbnVtID0gUmVzb3VyY2VUeXBlRW51bS52YWx1ZU9mKHJlc291cmNlVHlwZSk7CisJCQl9CisJCQlFaXRoZXI8TWFwPFN0cmluZywgQm9vbGVhbj4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMudmFsaWRhdGVSZXNvdXJjZU5hbWVFeGlzdHMocmVzb3VyY2VOYW1lLCB0eXBlRW51bSwgdXNlcklkKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHZhbGlkYXRlIHJlc291cmNlIG5hbWUiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIlZhbGlkYXRlIFJlc291cmNlIE5hbWUiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIlZhbGlkYXRlIFJlc291cmNlIE5hbWUiKTsKKwkJCWxvZy5kZWJ1ZygidmFsaWRhdGUgcmVzb3VyY2UgbmFtZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBHRVQKKwlAUGF0aCgiL3Jlc291cmNlcy9jZXJ0aWZpZWQvYWJzdHJhY3QiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJcHVibGljIFJlc3BvbnNlIGdldENlcnRpZmllZEFic3RyYWN0UmVzb3VyY2VzKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQkvLyBUT0RPOiBhbnkgdmFsaWRhdGlvbnM/Pz8KKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCIoZ2V0KSBTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRSZXNvdXJjZUJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0QWxsQ2VydGlmaWVkUmVzb3VyY2VzKHRydWUsIEhpZ2hlc3RGaWx0ZXJFbnVtLkhJR0hFU1RfT05MWSwgdXNlcklkKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBhbGwgYWJzdHJhY3QgcmVzb3VyY2VzIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCQlPYmplY3QgcmVzb3VyY2VzID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlc291cmNlcyk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgQ2VydGlmaWVkIEFic3RyYWN0IFJlc291cmNlcyIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IENlcnRpZmllZCBBYnN0cmFjdCBSZXNvdXJjZXMiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0Q2VydGlmaWVkQWJzdHJhY3RSZXNvdXJjZXMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi9yZXNvdXJjZXMvY2VydGlmaWVkL25vdGFic3RyYWN0IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCXB1YmxpYyBSZXNwb25zZSBnZXRDZXJ0aWZpZWROb3RBYnN0cmFjdFJlc291cmNlcyhAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisJCS8vIFRPRE86IGFueSB2bGlkYXRpb25zPz8/CisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldCkgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRSZXNvdXJjZUJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0QWxsQ2VydGlmaWVkUmVzb3VyY2VzKGZhbHNlLCBIaWdoZXN0RmlsdGVyRW51bS5BTEwsIHVzZXJJZCk7CisKKwkJCWlmIChhY3Rpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgYWxsIG5vbiBhYnN0cmFjdCByZXNvdXJjZXMiKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlPYmplY3QgcmVzb3VyY2VzID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlc291cmNlcyk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgQ2VydGlmaWVkIE5vbiBBYnN0cmFjdCBSZXNvdXJjZXMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBDZXJ0aWZpZWQgTm9uIEFic3RyYWN0IFJlc291cmNlcyIpOworCQkJbG9nLmRlYnVnKCJnZXRDZXJ0aWZpZWROb3RBYnN0cmFjdFJlc291cmNlcyBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfQorCisJfQorCisJQFBVVAorCUBQYXRoKCIvcmVzb3VyY2VzL3tyZXNvdXJjZUlkfS9tZXRhZGF0YSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlVwZGF0ZSBSZXNvdXJjZSBNZXRhZGF0YSIsIGh0dHBNZXRob2QgPSAiUFVUIiwgbm90ZXMgPSAiUmV0dXJucyB1cGRhdGVkIHJlc291cmNlIG1ldGFkYXRhIiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXNvdXJjZSBtZXRhZGF0YSB1cGRhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlTWV0YWRhdGEoQFBhdGhQYXJhbSgicmVzb3VyY2VJZCIpIGZpbmFsIFN0cmluZyByZXNvdXJjZUlkLCBAQXBpUGFyYW0odmFsdWUgPSAiUmVzb3VyY2UgbWV0YWRhdGEgdG8gYmUgdXBkYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlSZXNvdXJjZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoY29udGV4dCk7CisJCQlTdHJpbmcgcmVzb3VyY2VJZExvd2VyID0gcmVzb3VyY2VJZC50b0xvd2VyQ2FzZSgpOworCQkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlSW5mb1Jlc291cmNlID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuY29udmVydEpzb25Ub09iamVjdFVzaW5nT2JqZWN0TWFwcGVyKGRhdGEsIG1vZGlmaWVyLCBSZXNvdXJjZS5jbGFzcywgQXVkaXRpbmdBY3Rpb25FbnVtLlVQREFURV9SRVNPVVJDRV9NRVRBREFUQSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQkJaWYgKHVwZGF0ZUluZm9SZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBwYXJzZSByZXNvdXJjZSBtZXRhZGF0YSIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHVwZGF0ZUluZm9SZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlSWRMb3dlciwKKwkJCQkJdXBkYXRlSW5mb1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpLCBudWxsLCBtb2RpZmllciwgZmFsc2UpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIHJlc291cmNlIG1ldGFkYXRhIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCQlPYmplY3QgcmVzb3VyY2UgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVzb3VyY2UpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVXBkYXRlIFJlc291cmNlIE1ldGFkYXRhIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJVcGRhdGUgUmVzb3VyY2UgTWV0YWRhdGEiKTsKKwkJCWxvZy5kZWJ1ZygiVXBkYXRlIFJlc291cmNlIE1ldGFkYXRhIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJQFBVVAorCUBQYXRoKCIvcmVzb3VyY2VzL3tyZXNvdXJjZUlkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlVwZGF0ZSBSZXNvdXJjZSIsIGh0dHBNZXRob2QgPSAiUFVUIiwgbm90ZXMgPSAiUmV0dXJucyB1cGRhdGVkIHJlc291cmNlIiwgcmVzcG9uc2UgPSBSZXNvdXJjZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXNvdXJjZSB1cGRhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiUmVzb3VyY2UgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlKEBBcGlQYXJhbSh2YWx1ZSA9ICJSZXNvdXJjZSBvYmplY3QgdG8gYmUgdXBkYXRlZCIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQsCisJCQlAUGF0aFBhcmFtKHZhbHVlID0gInJlc291cmNlSWQiKSBTdHJpbmcgcmVzb3VyY2VJZCkgeworCisJCXVzZXJJZCA9ICh1c2VySWQgIT0gbnVsbCkgPyB1c2VySWQgOiByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCQlpbml0KGxvZyk7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQl0cnkgeworCisJCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCQkvLyBVSSBJbXBvcnQKKwkJCWlmIChpc1VJSW1wb3J0KGRhdGEpKSB7CisJCQkJcGVyZm9ybVVJSW1wb3J0KHJlc3BvbnNlV3JhcHBlciwgZGF0YSwgcmVxdWVzdCwgdXNlcklkLCByZXNvdXJjZUlkKTsKKwkJCX0gZWxzZSB7CisKKwkJCQlSZXNvdXJjZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoY29udGV4dCk7CisKKwkJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0UmVzcG9uc2UgPSBwYXJzZVRvTGlnaHRSZXNvdXJjZShkYXRhLCBtb2RpZmllcik7CisJCQkJaWYgKGNvbnZlcnRSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gcGFyc2UgcmVzb3VyY2UiKTsKKwkJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoY29udmVydFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiByZXNwb25zZTsKKwkJCQl9CisKKwkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnZlcnRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMudmFsaWRhdGVBbmRVcGRhdGVSZXNvdXJjZUZyb21Dc2FyKHJlc291cmNlLCBtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzb3VyY2VJZCk7CisKKwkJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSByZXNvdXJjZSIpOworCQkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCU9iamVjdCByZXByZXNlbnRhdGlvbiA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlcHJlc2VudGF0aW9uKTsKKwkJCQl9CisJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZSk7CisJCQl9CisKKwkJCXJldHVybiByZXNwb25zZVdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJVcGRhdGUgUmVzb3VyY2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIlVwZGF0ZSBSZXNvdXJjZSIpOworCQkJbG9nLmRlYnVnKCJ1cGRhdGUgcmVzb3VyY2UgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwkvKgorCSAqIEBHRVQKKwkgKiAKKwkgKiBAUGF0aCgiL3Jlc291cmNlcy9sYXRlc3R2ZXJzaW9uL25vdGFic3RyYWN0IikKKwkgKiAKKwkgKiBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJICogCisJICogQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKSBwdWJsaWMgUmVzcG9uc2UgZ2V0TGF0ZXN0VmVyc2lvbk5vdEFic3RyYWN0UmVzb3VyY2VzKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7IC8vVE9ETzogYW55IHZsaWRhdGlvbnM/Pz8gU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJICogCisJICogU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsgbG9nLmRlYnVnKCIoZ2V0KSBTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7IFJlc3BvbnNlIHJlc3BvbnNlPW51bGw7CisJICogCisJICogdHJ5IHsKKwkgKiAKKwkgKiBSZXNvdXJjZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFJlc291cmNlQkwoY29udGV4dCk7CisJICogCisJICogRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBSZXNwb25zZUZvcm1hdD4gYWN0aW9uUmVzcG9uc2UgPSBidXNpbmVzc0xvZ2ljLmdldExhdGVzdFZlcnNpb25SZXNvdXJjZXMoZmFsc2UsIEhpZ2hlc3RGaWx0ZXJFbnVtLkhJR0hFU1RfT05MWSk7CisJICogCisJICogCisJICogaWYgKGFjdGlvblJlc3BvbnNlLmlzUmlnaHQoKSl7IGxvZy5kZWJ1ZyggImZhaWxlZCB0byBnZXQgYWxsIG5vbiBhYnN0cmFjdCByZXNvdXJjZXMiKTsgcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOyB9IHJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwKKwkgKiBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJICogCisJICogfSBjYXRjaCAoRXhjZXB0aW9uIGUpeyBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuIEJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBDZXJ0aWZpZWQgTm9uIEFic3RyYWN0IFJlc291cmNlcyIpOyBsb2cuZGVidWcoImdldENlcnRpZmllZE5vdEFic3RyYWN0UmVzb3VyY2VzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOyByZXNwb25zZSA9CisJICogYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy4gR0VORVJBTF9FUlJPUikpOyByZXR1cm4gcmVzcG9uc2U7CisJICogCisJICogfSB9CisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gY29udmVydE1hcFRvTGlzdChNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7CisJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXROYW1lKG5hbWUpOworCQkJZGVmaW5pdGlvbnMuYWRkKHByb3BlcnR5RGVmaW5pdGlvbik7CisJCX0KKworCQlyZXR1cm4gZGVmaW5pdGlvbnM7CisJfQorCisJQEdFVAorCUBQYXRoKCIvcmVzb3VyY2VzL2NzYXIve2NzYXJ1dWlkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBSZXNvdXJjZSIsIGh0dHBNZXRob2QgPSAiUE9TVCIsIG5vdGVzID0gIlJldHVybnMgcmVzb3VyY2UgY3JlYXRlZCBmcm9tIGNzYXIgdXVpZCIsIHJlc3BvbnNlID0gUmVzb3VyY2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiUmVzb3VyY2UgcmV0cmllY2VkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldFJlc291cmNlRnJvbUNzYXIoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCwgQFBhdGhQYXJhbSh2YWx1ZSA9ICJjc2FydXVpZCIpIFN0cmluZyBjc2FyVVVJRCkgeworCisJCWluaXQobG9nKTsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQkvLyByZXRyaWV2ZSB1c2VyIGRldGFpbHMKKwkJdXNlcklkID0gKHVzZXJJZCAhPSBudWxsKSA/IHVzZXJJZCA6IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisJCVVzZXIgdXNlciA9IG5ldyBVc2VyKCk7CisJCXVzZXIuc2V0VXNlcklkKHVzZXJJZCk7CisKKwkJbG9nLmRlYnVnKCJ1c2VyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRSZXNvdXJjZUJMKGNvbnRleHQpOworCisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXNvdXJjZSA9IGJ1c2luZXNzTG9naWMuZ2V0TGF0ZXN0UmVzb3VyY2VGcm9tQ3NhclV1aWQoY3NhclVVSUQsIHVzZXIpOworCisJCQkvLyB2YWxpZGF0ZSByZXNwb25zZQorCQkJaWYgKGVpdGhlclJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCByZXNvdXJjZSBmcm9tIGNzYXJVdWlkIDoge30iLCBjc2FyVVVJRCk7CisJCQkJLy8gcmVzcG9uc2UgPQorCQkJCS8vIGJ1aWxkRXJyb3JSZXNwb25zZShlaXRoZXJSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGVpdGhlclJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9IGVsc2UgeworCQkJCU9iamVjdCByZXByZXNlbnRhdGlvbiA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihlaXRoZXJSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgcmVwcmVzZW50YXRpb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiZ2V0IHJlc291cmNlIGJ5IGNzYXIgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1NlcnZpY2VTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvU2VydmljZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTcwNjhmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1NlcnZpY2VTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw3MjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuU2VydmljZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EaXN0cmlidXRpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5XcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmpjYWJpLmFzcGVjdHMuTG9nZ2FibGU7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGk7CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi92MS9jYXRhbG9nIikKK0BBcGkodmFsdWUgPSAiU2VydmljZSBDYXRhbG9nIiwgZGVzY3JpcHRpb24gPSAiU2VydmljZSBTZXJ2bGV0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlU2VydmxldCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbnNTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTZXJ2aWNlU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQFBPU1QKKwlAUGF0aCgiL3NlcnZpY2VzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIFNlcnZpY2UiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgc2VydmljZSIsIHJlc3BvbnNlID0gU2VydmljZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJTZXJ2aWNlIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJTZXJ2aWNlIGFscmVhZHkgZXhpc3QiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBjcmVhdGVTZXJ2aWNlKEBBcGlQYXJhbSh2YWx1ZSA9ICJTZXJ2aWNlIG9iamVjdCB0byBiZSBjcmVhdGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVNlcnZpY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCk7CisJCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNvbnZlcnRSZXNwb25zZSA9IHBhcnNlVG9TZXJ2aWNlKGRhdGEsIG1vZGlmaWVyKTsKKwkJCWlmIChjb252ZXJ0UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gcGFyc2Ugc2VydmljZSIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGNvbnZlcnRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKworCQkJU2VydmljZSBzZXJ2aWNlID0gY29udmVydFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuY3JlYXRlU2VydmljZShzZXJ2aWNlLCBtb2RpZmllcik7CisKKwkJCWlmIChhY3Rpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgc2VydmljZSIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCisJCQlPYmplY3QgcmVzdWx0ID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKSwgcmVzdWx0KTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkNyZWF0ZSBTZXJ2aWNlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJDcmVhdGUgU2VydmljZSIpOworCQkJbG9nLmRlYnVnKCJjcmVhdGUgc2VydmljZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBwYXJzZVRvU2VydmljZShTdHJpbmcgc2VydmljZUpzb24sIFVzZXIgdXNlcikgeworCQlyZXR1cm4gZ2V0Q29tcG9uZW50c1V0aWxzKCkuY29udmVydEpzb25Ub09iamVjdFVzaW5nT2JqZWN0TWFwcGVyKHNlcnZpY2VKc29uLCB1c2VyLCBTZXJ2aWNlLmNsYXNzLCBBdWRpdGluZ0FjdGlvbkVudW0uQ1JFQVRFX1JFU09VUkNFLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwl9CisKKwlAR0VUCisJQFBhdGgoIi9zZXJ2aWNlcy92YWxpZGF0ZS1uYW1lL3tzZXJ2aWNlTmFtZX0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJ2YWxpZGF0ZSBzZXJ2aWNlIG5hbWUiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gImNoZWNrcyBpZiB0aGUgY2hvc2VuIHNlcnZpY2UgbmFtZSBpcyBhdmFpbGFibGUgIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJTZXJ2aWNlIGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdmFsaWRhdGVTZXJ2aWNlTmFtZShAUGF0aFBhcmFtKCJzZXJ2aWNlTmFtZSIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVNlcnZpY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCk7CisKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBCb29sZWFuPiwgUmVzcG9uc2VGb3JtYXQ+IGFjdGlvblJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy52YWxpZGF0ZVNlcnZpY2VOYW1lRXhpc3RzKHNlcnZpY2VOYW1lLCB1c2VySWQpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IHZhbGlkYXRlIHNlcnZpY2UgbmFtZSIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGFjdGlvblJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBhY3Rpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVmFsaWRhdGUgU2VydmljZSBOYW1lIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJWYWxpZGF0ZSBTZXJ2aWNlIE5hbWUiKTsKKwkJCWxvZy5kZWJ1ZygidmFsaWRhdGUgc2VydmljZSBuYW1lIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIvYXVkaXQtcmVjb3Jkcy97Y29tcG9uZW50VHlwZX0ve2NvbXBvbmVudFVuaXF1ZUlkfSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gImdldCBjb21wb25lbnQgYXVkaXQgcmVjb3JkcyIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiZ2V0IGF1ZGl0IHJlY29yZHMgZm9yIGEgc2VydmljZSBvciBhIHJlc291cmNlIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJTZXJ2aWNlIGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0Q29tcG9uZW50QXVkaXRSZWNvcmRzKEBQYXRoUGFyYW0oImNvbXBvbmVudFR5cGUiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VHlwZSwgQFBhdGhQYXJhbSgiY29tcG9uZW50VW5pcXVlSWQiKSBmaW5hbCBTdHJpbmcgY29tcG9uZW50VW5pcXVlSWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQkJQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisJCWluaXQobG9nKTsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisJCVdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciA9IG5ldyBXcmFwcGVyPFJlc3BvbnNlPigpOworCQlXcmFwcGVyPFN0cmluZz4gdXVpZFdyYXBwZXIgPSBuZXcgV3JhcHBlcjxTdHJpbmc+KCk7CisJCVdyYXBwZXI8U3RyaW5nPiB2ZXJzaW9uV3JhcHBlciA9IG5ldyBXcmFwcGVyPFN0cmluZz4oKTsKKwkJV3JhcHBlcjxVc2VyPiB1c2VyV3JhcHBlciA9IG5ldyBXcmFwcGVyPFVzZXI+KCk7CisJCVdyYXBwZXI8Q29tcG9uZW50VHlwZUVudW0+IGNvbXBvbmVudFdyYXBwZXIgPSBuZXcgV3JhcHBlcjxDb21wb25lbnRUeXBlRW51bT4oKTsKKwkJdHJ5IHsKKwkJCXZhbGlkYXRlVXNlckV4aXN0KHJlc3BvbnNlV3JhcHBlciwgdXNlcldyYXBwZXIsIHVzZXJJZCk7CisKKwkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJdmFsaWRhdGVDb21wb25lbnRUeXBlKHJlc3BvbnNlV3JhcHBlciwgY29tcG9uZW50V3JhcHBlciwgY29tcG9uZW50VHlwZSk7CisJCQl9CisKKwkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJZmlsbFVVSURBbmRWZXJzaW9uKHJlc3BvbnNlV3JhcHBlciwgdXVpZFdyYXBwZXIsIHZlcnNpb25XcmFwcGVyLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgY29tcG9uZW50V3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgY29tcG9uZW50VW5pcXVlSWQsIGNvbnRleHQpOworCQkJfQorCisJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCUVpdGhlcjxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyU2VydmljZUF1ZGl0ID0gZ2V0U2VydmljZUJMKGNvbnRleHQpLmdldENvbXBvbmVudEF1ZGl0UmVjb3Jkcyh2ZXJzaW9uV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgdXVpZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHVzZXJJZCk7CisKKwkJCQlpZiAoZWl0aGVyU2VydmljZUF1ZGl0LmlzUmlnaHQoKSkgeworCQkJCQlSZXNwb25zZSBlcnJvclJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGVpdGhlclNlcnZpY2VBdWRpdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVycm9yUmVzcG9uc2UpOworCQkJCX0gZWxzZSB7CisJCQkJCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gYXVkaXRSZWNvcmRzID0gZWl0aGVyU2VydmljZUF1ZGl0LmxlZnQoKS52YWx1ZSgpOworCQkJCQlSZXNwb25zZSBva1Jlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGF1ZGl0UmVjb3Jkcyk7CisJCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQob2tSZXNwb25zZSk7CisKKwkJCQl9CisJCQl9CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJWYWxpZGF0ZSBTZXJ2aWNlIE5hbWUiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIlZhbGlkYXRlIFNlcnZpY2UgTmFtZSIpOworCQkJbG9nLmRlYnVnKCJnZXQgU2VydmljZSBBdWRpdCBSZWNvcmRzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKwkJfQorCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCX0KKworCXByaXZhdGUgdm9pZCBmaWxsVVVJREFuZFZlcnNpb24oV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBXcmFwcGVyPFN0cmluZz4gdXVpZFdyYXBwZXIsIFdyYXBwZXI8U3RyaW5nPiB2ZXJzaW9uV3JhcHBlciwgVXNlciB1c2VyLCBmaW5hbCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgZmluYWwgU3RyaW5nIGNvbXBvbmVudFVuaXF1ZUlkLCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisKKwkJaWYgKGNvbXBvbmVudFR5cGVFbnVtID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSB7CisJCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXJSZXNvdXJjZSA9IGdldFJlc291cmNlQkwoY29udGV4dCkuZ2V0UmVzb3VyY2UoY29tcG9uZW50VW5pcXVlSWQsIHVzZXIpOworCQkJaWYgKGVpdGhlclJlc291cmNlLmlzTGVmdCgpKSB7CisJCQkJdXVpZFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVpdGhlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldFVVSUQoKSk7CisJCQkJdmVyc2lvbldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVpdGhlclJlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldFZlcnNpb24oKSk7CisJCQl9IGVsc2UgeworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYnVpbGRFcnJvclJlc3BvbnNlKGVpdGhlclJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclNlcnZpY2UgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCkuZ2V0U2VydmljZShjb21wb25lbnRVbmlxdWVJZCwgdXNlcik7CisJCQlpZiAoZWl0aGVyU2VydmljZS5pc0xlZnQoKSkgeworCQkJCXV1aWRXcmFwcGVyLnNldElubmVyRWxlbWVudChlaXRoZXJTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmdldFVVSUQoKSk7CisJCQkJdmVyc2lvbldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGVpdGhlclNlcnZpY2UubGVmdCgpLnZhbHVlKCkuZ2V0VmVyc2lvbigpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChidWlsZEVycm9yUmVzcG9uc2UoZWl0aGVyU2VydmljZS5yaWdodCgpLnZhbHVlKCkpKTsKKworCQkJfQorCQl9CisJfQorCisJQERFTEVURQorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VJZH0iKQorCXB1YmxpYyBSZXNwb25zZSBkZWxldGVTZXJ2aWNlKEBQYXRoUGFyYW0oInNlcnZpY2VJZCIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlSWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQkvLyBnZXQgbW9kaWZpZXIgaWQKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5VU0VSX0lEX0hFQURFUik7CisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCXRyeSB7CisJCQlTdHJpbmcgc2VydmljZUlkTG93ZXIgPSBzZXJ2aWNlSWQudG9Mb3dlckNhc2UoKTsKKwkJCVNlcnZpY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCk7CisJCQlSZXNwb25zZUZvcm1hdCBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZGVsZXRlU2VydmljZShzZXJ2aWNlSWRMb3dlciwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gSHR0cFN0YXR1cy5TQ19OT19DT05URU5UKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIHNlcnZpY2UiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk5PX0NPTlRFTlQpLCBudWxsKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkRlbGV0ZSBTZXJ2aWNlIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJEZWxldGUgU2VydmljZSIpOworCQkJbG9nLmRlYnVnKCJkZWxldGUgc2VydmljZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfQorCX0KKworCUBERUxFVEUKKwlAUGF0aCgiL3NlcnZpY2VzL3tzZXJ2aWNlTmFtZX0ve3ZlcnNpb259IikKKwlwdWJsaWMgUmVzcG9uc2UgZGVsZXRlU2VydmljZUJ5TmFtZUFuZFZlcnNpb24oQFBhdGhQYXJhbSgic2VydmljZU5hbWUiKSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIEBQYXRoUGFyYW0oInZlcnNpb24iKSBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCS8vIGdldCBtb2RpZmllciBpZAorCQlTdHJpbmcgdXNlcklkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKTsKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCVNlcnZpY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCk7CisJCQlSZXNwb25zZUZvcm1hdCBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZGVsZXRlU2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2VydmljZU5hbWUsIHZlcnNpb24sIG1vZGlmaWVyKTsKKworCQkJaWYgKGFjdGlvblJlc3BvbnNlLmdldFN0YXR1cygpICE9IEh0dHBTdGF0dXMuU0NfTk9fQ09OVEVOVCkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSBzZXJ2aWNlIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCXJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5OT19DT05URU5UKSwgbnVsbCk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJEZWxldGUgU2VydmljZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiRGVsZXRlIFNlcnZpY2UiKTsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlIHNlcnZpY2UgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0KKwl9CisKKwlAUFVUCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZUlkfS9tZXRhZGF0YSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlVwZGF0ZSBTZXJ2aWNlIE1ldGFkYXRhIiwgaHR0cE1ldGhvZCA9ICJQVVQiLCBub3RlcyA9ICJSZXR1cm5zIHVwZGF0ZWQgc2VydmljZSIsIHJlc3BvbnNlID0gU2VydmljZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJTZXJ2aWNlIFVwZGF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBkYXRlU2VydmljZU1ldGFkYXRhKEBQYXRoUGFyYW0oInNlcnZpY2VJZCIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlSWQsIEBBcGlQYXJhbSh2YWx1ZSA9ICJTZXJ2aWNlIG9iamVjdCB0byBiZSBVcGRhdGVkIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgZGF0YSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQlASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCVN0cmluZyBzZXJ2aWNlSWRMb3dlciA9IHNlcnZpY2VJZC50b0xvd2VyQ2FzZSgpOworCQkJU2VydmljZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFNlcnZpY2VCTChjb250ZXh0KTsKKworCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjb252ZXJ0UmVzcG9uc2UgPSBwYXJzZVRvU2VydmljZShkYXRhLCBtb2RpZmllcik7CisJCQlpZiAoY29udmVydFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHBhcnNlIHNlcnZpY2UiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShjb252ZXJ0UmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCQlTZXJ2aWNlIHVwZGF0ZWRTZXJ2aWNlID0gY29udmVydFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMudXBkYXRlU2VydmljZU1ldGFkYXRhKHNlcnZpY2VJZExvd2VyLCB1cGRhdGVkU2VydmljZSwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIHNlcnZpY2UiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKworCQkJU2VydmljZSBzZXJ2aWNlID0gYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCQlPYmplY3QgcmVzdWx0ID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKHNlcnZpY2UpOworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVXBkYXRlIFNlcnZpY2UgTWV0YWRhdGEiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIlVwZGF0ZSBTZXJ2aWNlIE1ldGFkYXRhIik7CisJCQlsb2cuZGVidWcoInVwZGF0ZSBzZXJ2aWNlIG1ldGFkYXRhIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJSZXRyaWV2ZSBTZXJ2aWNlIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIHNlcnZpY2UgYWNjb3JkaW5nIHRvIHNlcnZpY2VJZCIsIHJlc3BvbnNlID0gU2VydmljZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJTZXJ2aWNlIGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlNlcnZpY2Ugbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0U2VydmljZUJ5SWQoQFBhdGhQYXJhbSgic2VydmljZUlkIikgZmluYWwgU3RyaW5nIHNlcnZpY2VJZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQkvLyBnZXQgbW9kaWZpZXIgaWQKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgc2VydmljZUlkTG93ZXIgPSBzZXJ2aWNlSWQudG9Mb3dlckNhc2UoKTsKKwkJCVNlcnZpY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCk7CisJCQlsb2cuZGVidWcoImdldCBzZXJ2aWNlIHdpdGggaWQge30iLCBzZXJ2aWNlSWQpOworCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0U2VydmljZShzZXJ2aWNlSWRMb3dlciwgbW9kaWZpZXIpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IHNlcnZpY2UiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKworCQkJU2VydmljZSBzZXJ2aWNlID0gYWN0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCQlPYmplY3QgcmVzdWx0ID0gUmVwcmVzZW50YXRpb25VdGlscy50b1JlcHJlc2VudGF0aW9uKHNlcnZpY2UpOworCisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlc3VsdCk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgU2VydmljZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFNlcnZpY2UiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0IHNlcnZpY2UgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisKKwkJfQorCX0KKworCUBHRVQKKwlAUGF0aCgiL3NlcnZpY2VzL3NlcnZpY2VOYW1lL3tzZXJ2aWNlTmFtZX0vc2VydmljZVZlcnNpb24ve3NlcnZpY2VWZXJzaW9ufSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIlJldHJpZXZlIFNlcnZpY2UiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgc2VydmljZSBhY2NvcmRpbmcgdG8gbmFtZSBhbmQgdmVyc2lvbiIsIHJlc3BvbnNlID0gU2VydmljZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJTZXJ2aWNlIGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlNlcnZpY2Ugbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oQFBhdGhQYXJhbSgic2VydmljZU5hbWUiKSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIEBQYXRoUGFyYW0oInNlcnZpY2VWZXJzaW9uIikgZmluYWwgU3RyaW5nIHNlcnZpY2VWZXJzaW9uLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQkvLyBnZXQgbW9kaWZpZXIgaWQKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlTZXJ2aWNlQnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0U2VydmljZUJMKGNvbnRleHQpOworCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCB1c2VySWQpOworCisJCQlpZiAoYWN0aW9uUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYWN0aW9uUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisKKwkJCVNlcnZpY2Ugc2VydmljZSA9IGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQkJT2JqZWN0IHJlc3VsdCA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihzZXJ2aWNlKTsKKworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IFNlcnZpY2UgYnkgbmFtZSBhbmQgdmVyc2lvbiIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFNlcnZpY2UgYnkgbmFtZSBhbmQgdmVyc2lvbiIpOworCQkJbG9nLmRlYnVnKCJnZXQgc2VydmljZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKworCQl9CisJfQorCisJQFBPU1QKKwlAUGF0aCgiL3NlcnZpY2VzL3tzZXJ2aWNlSWR9L2Rpc3RyaWJ1dGlvbi1zdGF0ZS97c3RhdGV9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiVXBkYXRlIFNlcnZpY2UgRGlzdHJpYnV0aW9uIFN0YXRlIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAic2VydmljZSB3aXRoIHRoZSBjaGFuZ2VkIGRpc3RyaWJ1dGlvbiBzdGF0dXMiKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlNlcnZpY2UgZGlzdHJpYnV0aW9uIHN0YXRlIGNoYW5nZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiU2VydmljZSBpcyBub3QgYXZhaWxhYmxlIGZvciBkaXN0cmlidXRpb24iKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJSZXF1ZXN0ZWQgc2VydmljZSB3YXMgbm90IGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvci4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4iKSB9KQorCXB1YmxpYyBSZXNwb25zZSB1cGRhdGVTZXJ2aWNlRGlzdHJpYnV0aW9uU3RhdGUoQEFwaVBhcmFtKHZhbHVlID0gIkRpc3RyaWJ1dGlvbkNoYW5nZUluZm8gLSBnZXQgY29tbWVudCBvdXQgb2YgYm9keSIsIHJlcXVpcmVkID0gdHJ1ZSkgTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24ganNvbkNoYW5nZUluZm8sIEBQYXRoUGFyYW0oInNlcnZpY2VJZCIpIGZpbmFsIFN0cmluZyBzZXJ2aWNlSWQsCisJCQlAQXBpUGFyYW0oYWxsb3dhYmxlVmFsdWVzID0gImFwcHJvdmUsIHJlamVjdCIsIHJlcXVpcmVkID0gdHJ1ZSkgQFBhdGhQYXJhbSgic3RhdGUiKSBmaW5hbCBTdHJpbmcgc3RhdGUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlTZXJ2aWNlQnVzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0U2VydmljZUJMKGNvbnRleHQpOworCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBhY3Rpb25SZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuY2hhbmdlU2VydmljZURpc3RyaWJ1dGlvblN0YXRlKHNlcnZpY2VJZCwgc3RhdGUsIGpzb25DaGFuZ2VJbmZvLCBtb2RpZmllcik7CisKKwkJCWlmIChhY3Rpb25SZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBVcGRhdGUgU2VydmljZSBEaXN0cmlidXRpb24gU3RhdGUiKTsKKwkJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhY3Rpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCVNlcnZpY2Ugc2VydmljZSA9IGFjdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQkJT2JqZWN0IHJlc3VsdCA9IFJlcHJlc2VudGF0aW9uVXRpbHMudG9SZXByZXNlbnRhdGlvbihzZXJ2aWNlKTsKKworCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCByZXN1bHQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIlVwZGF0ZSBTZXJ2aWNlIERpc3RyaWJ1dGlvbiBTdGF0ZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiVXBkYXRlIFNlcnZpY2UgRGlzdHJpYnV0aW9uIFN0YXRlIik7CisJCQlsb2cuZGVidWcoInVwZGF0ZVNlcnZpY2VEaXN0cmlidXRpb25TdGF0ZSBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisJCX0KKwl9CisKKwlAUE9TVAorCUBQYXRoKCIvc2VydmljZXMve3NlcnZpY2VJZH0vZGlzdHJpYnV0aW9uL3tlbnZ9L2FjdGl2YXRlIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQWN0aXZhdGUgZGlzdHJpYnV0aW9uIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiYWN0aXZhdGUgZGlzdHJpYnV0aW9uIikKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJPSyIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJTZXJ2aWNlIGNhbm5vdCBiZSBkaXN0cmlidXRlZCBkdWUgdG8gbWlzc2luZyBkZXBsb3ltZW50IGFydGlmYWN0cyIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJSZXF1ZXN0ZWQgc2VydmljZSB3YXMgbm90IGZvdW5kIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgYWN0aXZhdGVEaXN0cmlidXRpb24oQFBhdGhQYXJhbSgic2VydmljZUlkIikgZmluYWwgU3RyaW5nIHNlcnZpY2VJZCwgQFBhdGhQYXJhbSgiZW52IikgZmluYWwgU3RyaW5nIGVudiwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVNlcnZpY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCk7CisJCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGRpc3RSZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuYWN0aXZhdGVEaXN0cmlidXRpb24oc2VydmljZUlkLCBlbnYsIG1vZGlmaWVyLCByZXF1ZXN0KTsKKworCQkJaWYgKGRpc3RSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBhY3RpdmF0ZSBzZXJ2aWNlIGRpc3RyaWJ1dGlvbiIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGRpc3RSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCVNlcnZpY2Ugc2VydmljZSA9IGRpc3RSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCU9iamVjdCByZXN1bHQgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oc2VydmljZSk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlc3VsdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiQWN0aXZhdGUgRGlzdHJpYnV0aW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJBY3RpdmF0ZSBEaXN0cmlidXRpb24iKTsKKwkJCWxvZy5kZWJ1ZygiYWN0aXZhdGUgZGlzdHJpYnV0aW9uIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKwkJfQorCX0KKworCUBQT1NUCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZUlkfS9kaXN0cmlidXRpb24ve2RpZH0vbWFya0RlcGxveWVkIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiTWFyayBkaXN0cmlidXRpb24gYXMgZGVwbG95ZWQiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJyZWxldmFudCBhdWRpdCByZWNvcmQgd2lsbCBiZSBjcmVhdGVkIikKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJTZXJ2aWNlIHdhcyBtYXJrZWQgYXMgZGVwbG95ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiU2VydmljZSBpcyBub3QgYXZhaWxhYmxlIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiUmVxdWVzdGVkIHNlcnZpY2Ugd2FzIG5vdCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgbWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWQoQFBhdGhQYXJhbSgic2VydmljZUlkIikgZmluYWwgU3RyaW5nIHNlcnZpY2VJZCwgQFBhdGhQYXJhbSgiZGlkIikgZmluYWwgU3RyaW5nIGRpZCwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCkgeworCisJCVNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVNlcnZpY2VCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRTZXJ2aWNlQkwoY29udGV4dCk7CisJCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGRpc3RSZXNwb25zZSA9IGJ1c2luZXNzTG9naWMubWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWQoc2VydmljZUlkLCBkaWQsIG1vZGlmaWVyKTsKKworCQkJaWYgKGRpc3RSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBtYXJrIGRpc3RyaWJ1dGlvbiBhcyBkZXBsb3llZCIpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGRpc3RSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXNwb25zZTsKKwkJCX0KKwkJCVNlcnZpY2Ugc2VydmljZSA9IGRpc3RSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCU9iamVjdCByZXN1bHQgPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oc2VydmljZSk7CisJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJlc3VsdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiTWFyayBEaXN0cmlidXRpb24gQXMgRGVwbG95ZWQiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIk1hcmsgRGlzdHJpYnV0aW9uIEFzIERlcGxveWVkIik7CisJCQlsb2cuZGVidWcoIm1hcmsgZGlzdHJpYnV0aW9uIGFzIGRlcGxveWVkIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKwkJfQorCX0KKworCUBQT1NUCisJQFBhdGgoIi9zZXJ2aWNlcy97c2VydmljZUlkfS90ZW1wVXJsVG9CZURlbGV0ZWQiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiT0siKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA1MDAsIG1lc3NhZ2UgPSAiSW50ZXJuYWwgU2VydmVyIEVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIpIH0pCisJcHVibGljIFJlc3BvbnNlIHRlbXBVcmxUb0JlRGVsZXRlZChAUGF0aFBhcmFtKCJzZXJ2aWNlSWQiKSBmaW5hbCBTdHJpbmcgc2VydmljZUlkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQodXNlcklkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIHVzZXJJZCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQl0cnkgeworCQkJU2VydmljZUJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFNlcnZpY2VCTChjb250ZXh0KTsKKwkJCVNlcnZpY2Ugc2VydmljZSA9IChidXNpbmVzc0xvZ2ljLmdldFNlcnZpY2Uoc2VydmljZUlkLCBtb2RpZmllcikpLmxlZnQoKS52YWx1ZSgpOworCQkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiByZXMgPSAoYnVzaW5lc3NMb2dpYy51cGRhdGVEaXN0cmlidXRpb25TdGF0dXNGb3JBY3RpdmF0aW9uKHNlcnZpY2UsIG1vZGlmaWVyLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVEVEKSk7CisKKwkJCWlmIChyZXMuaXNSaWdodCgpKSB7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCX0KKwkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgbnVsbCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAidGVtcFVybFRvQmVEZWxldGVkIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJ0ZW1wVXJsVG9CZURlbGV0ZWQiKTsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCQl9CisJfQorCisJQEdFVAorCUBQYXRoKCIvc2VydmljZXMvdG9zY2F0b2hlYXQve2FydGlmYWN0TmFtZX0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkRvd25sb2FkIHNlcnZpY2UgYXJ0aWZhY3QiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgZG93bmxvYWRlZCBhcnRpZmFjdCIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiQXJ0aWZhY3QgZG93bmxvYWRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMSwgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uIHJlcXVpcmVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJBcnRpZmFjdCBub3QgZm91bmQiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdChAUGF0aFBhcmFtKCJhcnRpZmFjdE5hbWUiKSBmaW5hbCBTdHJpbmcgYXJ0aWZhY3ROYW1lLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCVN0cmluZyBpbnN0YW5jZUlkSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSKTsKKwkJU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJhcnRpZmFjdCBuYW1lID0ge30iLCBhcnRpZmFjdE5hbWUpOworCQkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJCUVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBleGVjdXRlQ29tbWFuZCA9IGV4ZWN1dGVDb21tYW5kKGFydGlmYWN0TmFtZSk7CisKKwkJCWlmIChleGVjdXRlQ29tbWFuZC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjb252ZXJ0IHRvc2NhIHt9IHRvIGhlYXQiLCBhcnRpZmFjdE5hbWUpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZXhlY3V0ZUNvbW1hbmQucmlnaHQoKS52YWx1ZSgpOworCQkJCXJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJTdWNjZWVkIHRvIGNvbnZlcnQgdG9zY2Ege30gdG8gaGVhdCIsIGFydGlmYWN0TmFtZSk7CisJCQkJYnl0ZVtdIHZhbHVlID0gZXhlY3V0ZUNvbW1hbmQubGVmdCgpLnZhbHVlKCk7CisJCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsdWUpOworCisJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQkJCVN0cmluZyBoZWF0RmlsZU5hbWUgPSBudWxsOworCQkJCWlmIChhcnRpZmFjdE5hbWUuaW5kZXhPZigiLiIpID4gLTEpIHsKKwkJCQkJaGVhdEZpbGVOYW1lID0gYXJ0aWZhY3ROYW1lLnN1YnN0cmluZygwLCBhcnRpZmFjdE5hbWUuaW5kZXhPZigiLiIpKSArICIuaGVhdCI7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGVhdEZpbGVOYW1lID0gYXJ0aWZhY3ROYW1lICsgIi5oZWF0IjsKKwkJCQl9CisJCQkJaGVhZGVycy5wdXQoQ29uc3RhbnRzLkNPTlRFTlRfRElTUE9TSVRJT05fSEVBREVSLCBnZXRDb250ZW50RGlzcG9zaXRpb25WYWx1ZShoZWF0RmlsZU5hbWUpKTsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UocmVzcG9uc2VGb3JtYXQsIGlzLCBoZWFkZXJzKTsKKwkJCX0KKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgImRvd25sb2FkIGhlYXQgYXJ0aWZhY3QiKTsKKwkJCWxvZy5lcnJvcigiZG93bmxvYWQgYXJ0aWZhY3QgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBleGVjdXRlQ29tbWFuZChTdHJpbmcgYXJ0aWZhY3ROYW1lKSB7CisKKwkJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCk7CisJCVN0cmluZyB0b3NjYUZpbGVzRGlyID0gY29uZmlndXJhdGlvbi5nZXRUb3NjYUZpbGVzRGlyKCk7CisJCWlmICh0b3NjYUZpbGVzRGlyID09IG51bGwpIHsKKwkJCXRvc2NhRmlsZXNEaXIgPSAiL2FwcHMvamV0dHkvYmFzZS9iZS9jb25maWcvdG9zY2EiOworCQl9CisJCVN0cmluZyBoZWF0VHJhbnNsYXRvciA9IGNvbmZpZ3VyYXRpb24uZ2V0SGVhdFRyYW5zbGF0b3JQYXRoKCk7CisJCWlmIChoZWF0VHJhbnNsYXRvciA9PSBudWxsKSB7CisJCQloZWF0VHJhbnNsYXRvciA9ICIvaG9tZS9tOTg4MzUvaGVhdC10cmFuc2xhdG9yLTAuMy4wL2hlYXRfdHJhbnNsYXRvci5weSI7CisJCX0KKworCQlsb2cuZGVidWcoInRvc2NhRmlsZXNEaXI9e30iLCB0b3NjYUZpbGVzRGlyKTsKKwkJbG9nLmRlYnVnKCJoZWF0VHJhbnNsYXRvcj17fSIsIGhlYXRUcmFuc2xhdG9yKTsKKworCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJCVN0cmluZyBoZWF0SGVhZGVyID0gY29uZmlndXJhdGlvbi5nZXRIZWF0RW52QXJ0aWZhY3RIZWFkZXIoKTsKKwkJU3RyaW5nIGhlYXRGb290ZXIgPSBjb25maWd1cmF0aW9uLmdldEhlYXRFbnZBcnRpZmFjdEZvb3RlcigpOworCisJCW91dHB1dC5hcHBlbmQoaGVhdEhlYWRlciArICJcbiIpOworCisJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgicHl0aG9uIHswfSAtLXRlbXBsYXRlLWZpbGU9ezF9L3syfSAtLXRlbXBsYXRlLXR5cGU9dG9zY2EiKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW5nIG1lc3NhZ2UgZm9ybWF0Iik7CisKKwkJT2JqZWN0W10gb2JqQXJyYXkgPSB7IGhlYXRUcmFuc2xhdG9yLCB0b3NjYUZpbGVzRGlyLCBhcnRpZmFjdE5hbWUgfTsKKwkJU3RyaW5nIGNvbW1hbmQgPSBudWxsOworCQl0cnkgeworCQkJY29tbWFuZCA9IG1mLmZvcm1hdChvYmpBcnJheSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjb252ZXJ0IG1lc3NhZ2UgZm9ybWF0IiwgZSk7CisJCX0KKworCQlsb2cuZGVidWcoIkdvaW5nIHRvIHJ1biBjb21tYW5kIHt9IiwgY29tbWFuZCk7CisKKwkJUHJvY2VzcyBwOworCQl0cnkgeworCQkJcCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCk7CisJCQlpbnQgd2FpdEZvciA9IHAud2FpdEZvcigpOworCQkJbG9nLmRlYnVnKCJ3YWl0Rm9yID0ge30iLCB3YWl0Rm9yKTsKKworCQkJaWYgKHdhaXRGb3IgIT0gMCkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHJ1bm5pbmcgdGhlIGNvbW1hbmQge30iLCBjb21tYW5kKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQsIGFydGlmYWN0TmFtZSkpOworCQkJfQorCisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHAuZ2V0SW5wdXRTdHJlYW0oKSkpOworCisJCQlTdHJpbmcgbGluZSA9ICIiOworCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlvdXRwdXQuYXBwZW5kKGxpbmUgKyAiXG4iKTsKKwkJCX0KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgcnVubmluZyB0aGUgY29tbWFuZCB7fSB7fSIsIGNvbW1hbmQsIGUpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCisJCW91dHB1dC5hcHBlbmQoaGVhdEZvb3Rlcik7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG91dHB1dC50b1N0cmluZygpLmdldEJ5dGVzKCkpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvVG9zY2FEYW9TZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvVG9zY2FEYW9TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhMmJmZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Ub3NjYURhb1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkRvd25sb2FkQXJ0aWZhY3RMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmluZm8uU2VydmxldEpzb25SZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuYXBpLklSZXNvdXJjZVVwbG9hZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFRvc2NhRGFvU2VydmxldCBleHRlbmRzIEJlR2VuZXJpY1NlcnZsZXQgeworCXB1YmxpYyBhYnN0cmFjdCBMb2dnZXIgZ2V0TG9nZ2VyKCk7CisKKwlwcm90ZWN0ZWQgSVJlc291cmNlVXBsb2FkZXIgZ2V0UmVzb3VyY2VVcGxvYWRlcihTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCisJCWlmICh3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID09IG51bGwpIHsKKwkJCWdldExvZ2dlcigpLmVycm9yKCJGYWlsZWQgdG8gZ2V0IHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IGZyb20gY29udGV4dC4iKTsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChjb250ZXh0KTsKKworCQlyZXR1cm4gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oSVJlc291cmNlVXBsb2FkZXIuY2xhc3MpOworCisJfQorCisJLy8gcHJvdGVjdGVkIElUb3NjYVlhbWxCdWlsZGVyIGdldFRvc2NhWWFtbEJ1aWxkZXIoU2VydmxldENvbnRleHQgY29udGV4dCl7CisJLy8gV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9CisJLy8gKFdlYkFwcENvbnRleHRXcmFwcGVyKSBjb250ZXh0CisJLy8gLmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKTsKKwkvLworCS8vIGlmICh3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyID09IG51bGwpIHsKKwkvLyBnZXRMb2dnZXIoKS5lcnJvcigiRmFpbGVkIHRvIGdldCB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBmcm9tIGNvbnRleHQuIik7CisJLy8gcmV0dXJuIG51bGw7CisJLy8gfQorCS8vCisJLy8gV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9CisJLy8gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlcgorCS8vIC5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCS8vCisJLy8gcmV0dXJuIHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKElUb3NjYVlhbWxCdWlsZGVyLmNsYXNzKTsKKwkvLworCS8vIH0KKworCXByb3RlY3RlZCBEb3dubG9hZEFydGlmYWN0TG9naWMgZ2V0TG9naWMoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQlEb3dubG9hZEFydGlmYWN0TG9naWMgZG93bmxvYWRMb2dpYyA9IChEb3dubG9hZEFydGlmYWN0TG9naWMpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5ET1dOTE9BRF9BUlRJRkFDVF9MT0dJQ19BVFRSKTsKKworCQlpZiAoZG93bmxvYWRMb2dpYyA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVJbml0aWFsaXphdGlvbkVycm9yLCAiRG93bmxvYWRBcnRpZmFjdExvZ2ljIGZyb20gY29udGV4dCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW5pdGlhbGl6YXRpb25FcnJvcigiRG93bmxvYWRBcnRpZmFjdExvZ2ljIGZyb20gY29udGV4dCIpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGRvd25sb2FkTG9naWM7CisJfQorCisJcHJvdGVjdGVkIFJlc3BvbnNlIGJ1aWxkUmVzcG9uc2UoaW50IHN0YXR1cywgU3RyaW5nIGVycm9yTWVzc2FnZSkgeworCisJCVNlcnZsZXRKc29uUmVzcG9uc2UganNvblJlc3BvbnNlID0gbmV3IFNlcnZsZXRKc29uUmVzcG9uc2UoKTsKKwkJanNvblJlc3BvbnNlLnNldERlc2NyaXB0aW9uKGVycm9yTWVzc2FnZSk7CisJCWpzb25SZXNwb25zZS5zZXRTb3VyY2UoQ29uc3RhbnRzLkNBVEFMT0dfQkUpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykuZW50aXR5KGpzb25SZXNwb25zZSkuYnVpbGQoKTsKKworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1R5cGVzRmV0Y2hTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvVHlwZXNGZXRjaFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODI1YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1R5cGVzRmV0Y2hTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Qcm9wZXJ0eUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU9wZXJhdGlvbjsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUmVzcG9uc2VzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BMb2dnYWJsZShwcmVwZW5kID0gdHJ1ZSwgdmFsdWUgPSBMb2dnYWJsZS5ERUJVRywgdHJpbSA9IGZhbHNlKQorQFBhdGgoIi92MS9jYXRhbG9nIikKK0BBcGkodmFsdWUgPSAiVHlwZXMgRmV0Y2ggU2VydmxldCIsIGRlc2NyaXB0aW9uID0gIlR5cGVzIEZldGNoIFNlcnZsZXQiKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFR5cGVzRmV0Y2hTZXJ2bGV0IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uc1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFR5cGVzRmV0Y2hTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisKKwlAR0VUCisJQFBhdGgoImRhdGFUeXBlcyIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkdldCBkYXRhIHR5cGVzIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIGRhdGEgdHlwZXMiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gImRhdGF0eXBlcyIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIkRhdGEgdHlwZXMgbm90IGZvdW5kIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0QWxsRGF0YVR5cGVzU2VydmxldChAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKHZhbHVlID0gQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBTdHJpbmcgdXNlcklkKSB7CisKKwkJV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXI8UmVzcG9uc2U+KCk7CisJCVdyYXBwZXI8VXNlcj4gdXNlcldyYXBwZXIgPSBuZXcgV3JhcHBlcjxVc2VyPigpOworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQl0cnkgeworCQkJaW5pdChsb2cpOworCQkJdmFsaWRhdGVVc2VyRXhpc3QocmVzcG9uc2VXcmFwcGVyLCB1c2VyV3JhcHBlciwgdXNlcklkKTsKKworCQkJaWYgKHJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCQkJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCQkJUHJvcGVydHlCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBnZXRQcm9wZXJ0eUJMKGNvbnRleHQpOworCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gYWxsRGF0YVR5cGVzID0gYnVzaW5lc3NMb2dpYy5nZXRBbGxEYXRhVHlwZXMoKTsKKworCQkJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5pbmZvKCJGYWlsZWQgdG8gZ2V0IGFsbCBkYXJhIHR5cGVzLiBSZWFzb24gLSAiLCBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChlcnJvclJlc3BvbnNlKTsKKworCQkJCQkvLyByZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGFsbERhdGFUeXBlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzID0gYWxsRGF0YVR5cGVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQlSZXNwb25zZSBva1Jlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGRhdGFUeXBlcyk7CisJCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQob2tSZXNwb25zZSk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBhbGwgZGF0YSB0eXBlcyIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFByb3BlcnR5Iik7CisJCQlsb2cuZGVidWcoImdldCBhbGwgZGF0YSB0eXBlcyBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShyZXNwb25zZUZvcm1hdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIFByb3BlcnR5QnVzaW5lc3NMb2dpYyBnZXRQcm9wZXJ0eUJMKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlciA9IChXZWJBcHBDb250ZXh0V3JhcHBlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUik7CisJCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSB3ZWJBcHBsaWNhdGlvbkNvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoY29udGV4dCk7CisJCVByb3BlcnR5QnVzaW5lc3NMb2dpYyBwcm9wZXJ0eXRCbCA9IHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKFByb3BlcnR5QnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJCXJldHVybiBwcm9wZXJ0eXRCbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9UeXBlc1VwbG9hZFNlcnZsZXQuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9UeXBlc1VwbG9hZFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmE4YzUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1R5cGVzVXBsb2FkU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ2F0ZWdvcmllc0ltcG9ydE1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkRhdGFUeXBlSW1wb3J0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuR3JvdXBUeXBlSW1wb3J0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlBvbGljeVR5cGVJbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qb2xpY3lUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXMuQ29uc3VtZXJUd29QYXJhbTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUGFyYW07CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvY2F0YWxvZy91cGxvYWRUeXBlIikKK0BBcGkodmFsdWUgPSAiQ2F0YWxvZyBUeXBlcyBVcGxvYWQiLCBkZXNjcmlwdGlvbiA9ICJVcGxvYWQgVHlwZSBmcm9tIHlhbWwiKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFR5cGVzVXBsb2FkU2VydmxldCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbnNTZXJ2bGV0IHsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIENhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlciBjYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXI7CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIEludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyIGludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBDYXRlZ29yaWVzSW1wb3J0TWFuYWdlciBjYXRlZ29yaWVzSW1wb3J0TWFuYWdlcjsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgRGF0YVR5cGVJbXBvcnRNYW5hZ2VyIGRhdGFUeXBlSW1wb3J0TWFuYWdlcjsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgR3JvdXBUeXBlSW1wb3J0TWFuYWdlciBncm91cFR5cGVJbXBvcnRNYW5hZ2VyOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBQb2xpY3lUeXBlSW1wb3J0TWFuYWdlciBwb2xpY3lUeXBlSW1wb3J0TWFuYWdlcjsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUeXBlc1VwbG9hZFNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBQT1NUCisJQFBhdGgoIi9jYXBhYmlsaXR5IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIENhcGFiaWxpdHkgVHlwZSBmcm9tIHlhbWwiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgQ2FwYWJpbGl0eSBUeXBlIiwgcmVzcG9uc2UgPSBSZXNwb25zZS5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMSwgbWVzc2FnZSA9ICJDYXBhYmlsaXR5IFR5cGUgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkNhcGFiaWxpdHkgVHlwZSBhbHJlYWR5IGV4aXN0IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBsb2FkQ2FwYWJpbGl0eVR5cGUoQEFwaVBhcmFtKCJGaWxlSW5wdXRTdHJlYW0iKSBARm9ybURhdGFQYXJhbSgiY2FwYWJpbGl0eVR5cGVaaXAiKSBGaWxlIGZpbGUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0oIlVTRVJfSUQiKSBTdHJpbmcgY3JlYXRvcikgeworCisJCWNhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlciA9IGluaXRFbGVtZW50VHlwZUltcG9ydE1hbmFnZXIocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSwgKCkgLT4gQ2FwYWJpbGl0eVR5cGVJbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwkJQ29uc3VtZXJUd29QYXJhbTxXcmFwcGVyPFJlc3BvbnNlPiwgU3RyaW5nPiBjcmVhdGVFbGVtZW50c01ldGhvZCA9IChyZXNwb25zZVdyYXBwZXIsIHltbFBheWxvYWQpIC0+IGNyZWF0ZUVsZW1lbnRzVHlwZShyZXNwb25zZVdyYXBwZXIsICgpIC0+IGNhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlci5jcmVhdGVDYXBhYmlsaXR5VHlwZXMoeW1sUGF5bG9hZCkpOworCQlyZXR1cm4gdXBsb2FkRWxlbWVudFR5cGVTZXJ2bGV0TG9naWMoY3JlYXRlRWxlbWVudHNNZXRob2QsIGZpbGUsIHJlcXVlc3QsIGNyZWF0b3IsIE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5VHlwZS5uYW1lKCkpOworCisJfQorCisJQFBPU1QKKwlAUGF0aCgiL2ludGVyZmFjZUxpZmVjeWNsZSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gIkNyZWF0ZSBJbnRlcmZhY2UgTHlmZWN5Y2xlIFR5cGUgZnJvbSB5YW1sIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIEludGVyZmFjZSBMaWZlY3ljbGUgVHlwZSIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiSW50ZXJmYWNlIExpZmVjeWNsZSBUeXBlIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJJbnRlcmZhY2UgTGlmZWN5Y2xlIFR5cGUgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwbG9hZEludGVyZmFjZUxpZmVjeWNsZVR5cGUoQEFwaVBhcmFtKCJGaWxlSW5wdXRTdHJlYW0iKSBARm9ybURhdGFQYXJhbSgiaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZVppcCIpIEZpbGUgZmlsZSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSgiVVNFUl9JRCIpIFN0cmluZyBjcmVhdG9yKSB7CisKKwkJaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXIgPSBpbml0RWxlbWVudFR5cGVJbXBvcnRNYW5hZ2VyKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCksICgpIC0+IEludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwkJQ29uc3VtZXJUd29QYXJhbTxXcmFwcGVyPFJlc3BvbnNlPiwgU3RyaW5nPiBjcmVhdGVFbGVtZW50c01ldGhvZCA9IChyZXNwb25zZVdyYXBwZXIsIHltbFBheWxvYWQpIC0+IGNyZWF0ZUVsZW1lbnRzVHlwZShyZXNwb25zZVdyYXBwZXIsICgpIC0+IGludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyLmNyZWF0ZUxpZmVjeWNsZVR5cGVzKHltbFBheWxvYWQpKTsKKwkJcmV0dXJuIHVwbG9hZEVsZW1lbnRUeXBlU2VydmxldExvZ2ljKGNyZWF0ZUVsZW1lbnRzTWV0aG9kLCBmaWxlLCByZXF1ZXN0LCBjcmVhdG9yLCAiSW50ZXJmYWNlIFR5cGVzIik7CisJfQorCisJQFBPU1QKKwlAUGF0aCgiL2NhdGVnb3JpZXMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgQ2F0ZWdvcmllcyBmcm9tIHlhbWwiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgY2F0ZWdvcmllcyIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiQ2F0ZWdvcmllcyBjcmVhdGVkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgY29udGVudCAvIE1pc3NpbmcgY29udGVudCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiQ2F0ZWdvcnkgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwbG9hZENhdGVnb3JpZXMoQEFwaVBhcmFtKCJGaWxlSW5wdXRTdHJlYW0iKSBARm9ybURhdGFQYXJhbSgiY2F0ZWdvcmllc1ppcCIpIEZpbGUgZmlsZSwgQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSgiVVNFUl9JRCIpIFN0cmluZyBjcmVhdG9yKSB7CisKKwkJY2F0ZWdvcmllc0ltcG9ydE1hbmFnZXIgPSBpbml0RWxlbWVudFR5cGVJbXBvcnRNYW5hZ2VyKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCksICgpIC0+IENhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwkJQ29uc3VtZXJUd29QYXJhbTxXcmFwcGVyPFJlc3BvbnNlPiwgU3RyaW5nPiBjcmVhdGVFbGVtZW50c01ldGhvZCA9IChyZXNwb25zZVdyYXBwZXIsIHltbFBheWxvYWQpIC0+IGNyZWF0ZUVsZW1lbnRzVHlwZShyZXNwb25zZVdyYXBwZXIsICgpIC0+IGNhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyLmNyZWF0ZUNhdGVnb3JpZXMoeW1sUGF5bG9hZCkpOworCQlyZXR1cm4gdXBsb2FkRWxlbWVudFR5cGVTZXJ2bGV0TG9naWMoY3JlYXRlRWxlbWVudHNNZXRob2QsIGZpbGUsIHJlcXVlc3QsIGNyZWF0b3IsICJjYXRlZ29yaWVzIik7CisKKwl9CisKKwlAUE9TVAorCUBQYXRoKCIvZGF0YXR5cGVzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiQ3JlYXRlIENhdGVnb3JpZXMgZnJvbSB5YW1sIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIGRhdGEgdHlwZXMiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gIkRhdGEgdHlwZXMgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIG9wZXJhdGlvbiIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIGNvbnRlbnQgLyBNaXNzaW5nIGNvbnRlbnQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIkRhdGEgdHlwZXMgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwbG9hZERhdGFUeXBlcyhAQXBpUGFyYW0oIkZpbGVJbnB1dFN0cmVhbSIpIEBGb3JtRGF0YVBhcmFtKCJkYXRhVHlwZXNaaXAiKSBGaWxlIGZpbGUsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0oIlVTRVJfSUQiKSBTdHJpbmcgY3JlYXRvcikgeworCisJCWRhdGFUeXBlSW1wb3J0TWFuYWdlciA9IGluaXRFbGVtZW50VHlwZUltcG9ydE1hbmFnZXIocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSwgKCkgLT4gRGF0YVR5cGVJbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwkJQ29uc3VtZXJUd29QYXJhbTxXcmFwcGVyPFJlc3BvbnNlPiwgU3RyaW5nPiBjcmVhdGVFbGVtZW50c01ldGhvZCA9IChyZXNwb25zZVdyYXBwZXIsIHltbFBheWxvYWQpIC0+IGNyZWF0ZURhdGFUeXBlcyhyZXNwb25zZVdyYXBwZXIsIHltbFBheWxvYWQpOworCQlyZXR1cm4gdXBsb2FkRWxlbWVudFR5cGVTZXJ2bGV0TG9naWMoY3JlYXRlRWxlbWVudHNNZXRob2QsIGZpbGUsIHJlcXVlc3QsIGNyZWF0b3IsIE5vZGVUeXBlRW51bS5EYXRhVHlwZS5nZXROYW1lKCkpOworCisJfQorCisJQFBPU1QKKwlAUGF0aCgiL2dyb3VwdHlwZXMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgR3JvdXBUeXBlcyBmcm9tIHlhbWwiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJSZXR1cm5zIGNyZWF0ZWQgZ3JvdXAgdHlwZXMiLCByZXNwb25zZSA9IFJlc3BvbnNlLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAxLCBtZXNzYWdlID0gImdyb3VwIHR5cGVzIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJncm91cCB0eXBlcyBhbHJlYWR5IGV4aXN0IikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgdXBsb2FkR3JvdXBUeXBlcyhAQXBpUGFyYW0oIkZpbGVJbnB1dFN0cmVhbSIpIEBGb3JtRGF0YVBhcmFtKCJncm91cFR5cGVzWmlwIikgRmlsZSBmaWxlLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKCJVU0VSX0lEIikgU3RyaW5nIGNyZWF0b3IpIHsKKworCQlncm91cFR5cGVJbXBvcnRNYW5hZ2VyID0gaW5pdEVsZW1lbnRUeXBlSW1wb3J0TWFuYWdlcihyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpLCAoKSAtPiBHcm91cFR5cGVJbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwkJQ29uc3VtZXJUd29QYXJhbTxXcmFwcGVyPFJlc3BvbnNlPiwgU3RyaW5nPiBjcmVhdGVFbGVtZW50c01ldGhvZCA9IChyZXNwb25zZVdyYXBwZXIsIHltbFBheWxvYWQpIC0+IGNyZWF0ZUdyb3VwVHlwZXMocmVzcG9uc2VXcmFwcGVyLCB5bWxQYXlsb2FkKTsKKworCQlyZXR1cm4gdXBsb2FkRWxlbWVudFR5cGVTZXJ2bGV0TG9naWMoY3JlYXRlRWxlbWVudHNNZXRob2QsIGZpbGUsIHJlcXVlc3QsIGNyZWF0b3IsIE5vZGVUeXBlRW51bS5Hcm91cFR5cGUuZ2V0TmFtZSgpKTsKKwl9CisKKwlAUE9TVAorCUBQYXRoKCIvcG9saWN5dHlwZXMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJDcmVhdGUgUG9saWN5VHlwZXMgZnJvbSB5YW1sIiwgaHR0cE1ldGhvZCA9ICJQT1NUIiwgbm90ZXMgPSAiUmV0dXJucyBjcmVhdGVkIHBvbGljeSB0eXBlcyIsIHJlc3BvbnNlID0gUmVzcG9uc2UuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAicG9saWN5IHR5cGVzIGNyZWF0ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiSW52YWxpZCBjb250ZW50IC8gTWlzc2luZyBjb250ZW50IiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJwb2xpY3kgdHlwZXMgYWxyZWFkeSBleGlzdCIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwbG9hZFBvbGljeVR5cGVzKEBBcGlQYXJhbSgiRmlsZUlucHV0U3RyZWFtIikgQEZvcm1EYXRhUGFyYW0oInBvbGljeVR5cGVzWmlwIikgRmlsZSBmaWxlLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEhlYWRlclBhcmFtKCJVU0VSX0lEIikgU3RyaW5nIGNyZWF0b3IpIHsKKworCQlwb2xpY3lUeXBlSW1wb3J0TWFuYWdlciA9IGluaXRFbGVtZW50VHlwZUltcG9ydE1hbmFnZXIocmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKSwgKCkgLT4gUG9saWN5VHlwZUltcG9ydE1hbmFnZXIuY2xhc3MpOworCQlDb25zdW1lclR3b1BhcmFtPFdyYXBwZXI8UmVzcG9uc2U+LCBTdHJpbmc+IGNyZWF0ZUVsZW1lbnRzTWV0aG9kID0gKHJlc3BvbnNlV3JhcHBlciwgeW1sUGF5bG9hZCkgLT4gY3JlYXRlUG9saWN5VHlwZXMocmVzcG9uc2VXcmFwcGVyLCB5bWxQYXlsb2FkKTsKKworCQlyZXR1cm4gdXBsb2FkRWxlbWVudFR5cGVTZXJ2bGV0TG9naWMoY3JlYXRlRWxlbWVudHNNZXRob2QsIGZpbGUsIHJlcXVlc3QsIGNyZWF0b3IsIE5vZGVUeXBlRW51bS5Qb2xpY3lUeXBlLmdldE5hbWUoKSk7CisKKwl9CisKKwlwcml2YXRlIFJlc3BvbnNlIHVwbG9hZEVsZW1lbnRUeXBlU2VydmxldExvZ2ljKENvbnN1bWVyVHdvUGFyYW08V3JhcHBlcjxSZXNwb25zZT4sIFN0cmluZz4gY3JlYXRlRWxlbWVudHNNZXRob2QsIEZpbGUgZmlsZSwgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBjcmVhdG9yLCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lKSB7CisJCWluaXQobG9nKTsKKwkJU3RyaW5nIHVzZXJJZCA9IGluaXRIZWFkZXJQYXJhbShjcmVhdG9yLCByZXF1ZXN0LCBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCQl0cnkgeworCQkJV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQkJV3JhcHBlcjxVc2VyPiB1c2VyV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJCVdyYXBwZXI8U3RyaW5nPiB5YW1sU3RyaW5nV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKworCQkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJCWxvZy5kZWJ1ZygiU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCQl2YWxpZGF0ZVVzZXJFeGlzdChyZXNwb25zZVdyYXBwZXIsIHVzZXJXcmFwcGVyLCB1c2VySWQpOworCisJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCXZhbGlkYXRlVXNlclJvbGUocmVzcG9uc2VXcmFwcGVyLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCQl9CisKKwkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJdmFsaWRhdGVEYXRhTm90TnVsbChyZXNwb25zZVdyYXBwZXIsIGZpbGUpOworCQkJfQorCisJCQlpZiAocmVzcG9uc2VXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJCWZpbGxaaXBDb250ZW50cyh5YW1sU3RyaW5nV3JhcHBlciwgZmlsZSk7CisJCQl9CisKKwkJCWlmIChyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJY3JlYXRlRWxlbWVudHNNZXRob2QuYWNjZXB0KHJlc3BvbnNlV3JhcHBlciwgeWFtbFN0cmluZ1dyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJfQorCisJCQlyZXR1cm4gcmVzcG9uc2VXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImNyZWF0ZSB7fSBmYWlsZWQgd2l0aCBleGNlcHRpb246IHt9IiwgZWxlbWVudFR5cGVOYW1lLCBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkNyZWF0ZSAiICsgZWxlbWVudFR5cGVOYW1lKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCXByaXZhdGUgPFQ+IHZvaWQgY3JlYXRlRWxlbWVudHNUeXBlKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgU3VwcGxpZXI8RWl0aGVyPFQsIFJlc3BvbnNlRm9ybWF0Pj4gZWxlbWVudHNDcmVhdGVyKSB7CisJCUVpdGhlcjxULCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyUmVzdWx0ID0gZWxlbWVudHNDcmVhdGVyLmdldCgpOworCQlpZiAoZWl0aGVyUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZWl0aGVyUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlKTsKKwkJfSBlbHNlIHsKKwkJCVJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKSwgZWl0aGVyUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzcG9uc2UpOworCQl9CisJfQorCisJLy8gZGF0YSB0eXBlcworCXByaXZhdGUgdm9pZCBjcmVhdGVEYXRhVHlwZXMoV3JhcHBlcjxSZXNwb25zZT4gcmVzcG9uc2VXcmFwcGVyLCBTdHJpbmcgZGF0YVR5cGVzWW1sKSB7CisJCWZpbmFsIFN1cHBsaWVyPEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RGF0YVR5cGVEZWZpbml0aW9uLCBCb29sZWFuPj4sIFJlc3BvbnNlRm9ybWF0Pj4gZ2VuZXJhdGVFbGVtZW50VHlwZUZyb21ZbWwgPSAoKSAtPiBkYXRhVHlwZUltcG9ydE1hbmFnZXIuY3JlYXRlRGF0YVR5cGVzKGRhdGFUeXBlc1ltbCk7CisJCWJ1aWxkU3RhdHVzRm9yRWxlbWVudFR5cGVDcmVhdGUocmVzcG9uc2VXcmFwcGVyLCBnZW5lcmF0ZUVsZW1lbnRUeXBlRnJvbVltbCwgQWN0aW9uU3RhdHVzLkRBVEFfVFlQRV9BTFJFQURZX0VYSVNULCBOb2RlVHlwZUVudW0uRGF0YVR5cGUubmFtZSgpKTsKKwl9CisKKwkvLyBncm91cCB0eXBlcworCXByaXZhdGUgdm9pZCBjcmVhdGVHcm91cFR5cGVzKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgU3RyaW5nIGdyb3VwVHlwZXNZbWwpIHsKKwkJZmluYWwgU3VwcGxpZXI8RWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxHcm91cFR5cGVEZWZpbml0aW9uLCBCb29sZWFuPj4sIFJlc3BvbnNlRm9ybWF0Pj4gZ2VuZXJhdGVFbGVtZW50VHlwZUZyb21ZbWwgPSAoKSAtPiBncm91cFR5cGVJbXBvcnRNYW5hZ2VyLmNyZWF0ZUdyb3VwVHlwZXMoZ3JvdXBUeXBlc1ltbCk7CisJCWJ1aWxkU3RhdHVzRm9yRWxlbWVudFR5cGVDcmVhdGUocmVzcG9uc2VXcmFwcGVyLCBnZW5lcmF0ZUVsZW1lbnRUeXBlRnJvbVltbCwgQWN0aW9uU3RhdHVzLkdST1VQX1RZUEVfQUxSRUFEWV9FWElTVCwgTm9kZVR5cGVFbnVtLkdyb3VwVHlwZS5uYW1lKCkpOworCisJfQorCisJLy8gcG9saWN5IHR5cGVzCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVBvbGljeVR5cGVzKFdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciwgU3RyaW5nIHBvbGljeVR5cGVzWW1sKSB7CisJCWZpbmFsIFN1cHBsaWVyPEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UG9saWN5VHlwZURlZmluaXRpb24sIEJvb2xlYW4+PiwgUmVzcG9uc2VGb3JtYXQ+PiBnZW5lcmF0ZUVsZW1lbnRUeXBlRnJvbVltbCA9ICgpIC0+IHBvbGljeVR5cGVJbXBvcnRNYW5hZ2VyLmNyZWF0ZVBvbGljeVR5cGVzKHBvbGljeVR5cGVzWW1sKTsKKwkJYnVpbGRTdGF0dXNGb3JFbGVtZW50VHlwZUNyZWF0ZShyZXNwb25zZVdyYXBwZXIsIGdlbmVyYXRlRWxlbWVudFR5cGVGcm9tWW1sLCBBY3Rpb25TdGF0dXMuUE9MSUNZX1RZUEVfQUxSRUFEWV9FWElTVCwgTm9kZVR5cGVFbnVtLlBvbGljeVR5cGUubmFtZSgpKTsKKworCX0KKworCS8vIGRhdGEgdHlwZXMKKwlwcml2YXRlIDxFbGVtZW50VHlwZURlZmluaXRpb24+IHZvaWQgYnVpbGRTdGF0dXNGb3JFbGVtZW50VHlwZUNyZWF0ZShXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIsIFN1cHBsaWVyPEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RWxlbWVudFR5cGVEZWZpbml0aW9uLCBCb29sZWFuPj4sIFJlc3BvbnNlRm9ybWF0Pj4gZ2VuZXJhdGVFbGVtZW50VHlwZUZyb21ZbWwsCisJCQlBY3Rpb25TdGF0dXMgYWxyZWFkeUV4aXN0U3RhdHVzLCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lKSB7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxFbGVtZW50VHlwZURlZmluaXRpb24sIEJvb2xlYW4+PiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclJlc3VsdCA9IGdlbmVyYXRlRWxlbWVudFR5cGVGcm9tWW1sLmdldCgpOworCisJCWlmIChlaXRoZXJSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkRXJyb3JSZXNwb25zZShlaXRoZXJSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzcG9uc2UpOworCQl9IGVsc2UgeworCQkJT2JqZWN0IHJlcHJlc2VudGF0aW9uOworCQkJdHJ5IHsKKwkJCQlMaXN0PEltbXV0YWJsZVBhaXI8RWxlbWVudFR5cGVEZWZpbml0aW9uLCBCb29sZWFuPj4gbGlzdCA9IGVpdGhlclJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlBY3Rpb25TdGF0dXMgc3RhdHVzID0gQWN0aW9uU3RhdHVzLk9LOworCQkJCWlmIChsaXN0ICE9IG51bGwpIHsKKworCQkJCQkvLyBHcm91cCByZXN1bHQgYnkgdGhlIHJpZ2h0IHZhbHVlIC0gdHJ1ZSBvciBmYWxzZS4KKwkJCQkJLy8gSS5lLiwgZ2V0IHRoZSBudW1iZXIgb2YgZGF0YSB0eXBlcyB3aGljaCBhcmUgbmV3IGFuZAorCQkJCQkvLyB3aGljaCBhcmUgb2xkLgorCQkJCQlNYXA8Qm9vbGVhbiwgTGlzdDxJbW11dGFibGVQYWlyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgQm9vbGVhbj4+PiBjb2xsZWN0ID0gbGlzdC5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShJbW11dGFibGVQYWlyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgQm9vbGVhbj46OmdldFJpZ2h0KSk7CisJCQkJCWlmIChjb2xsZWN0ICE9IG51bGwpIHsKKwkJCQkJCVNldDxCb29sZWFuPiBrZXlTZXQgPSBjb2xsZWN0LmtleVNldCgpOworCQkJCQkJaWYgKGtleVNldC5zaXplKCkgPT0gMSkgeworCQkJCQkJCUJvb2xlYW4gaXNOZXcgPSBrZXlTZXQuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJCQkJaWYgKGlzTmV3LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKKwkJCQkJCQkJLy8gYWxsIGRhdGEgdHlwZXMgY3JlYXRlZCBhdCB0aGUgZmlyc3QgdGltZQorCQkJCQkJCQlzdGF0dXMgPSBBY3Rpb25TdGF0dXMuQ1JFQVRFRDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBBbGwgZGF0YSB0eXBlcyBhbHJlYWR5IGV4aXN0cworCisJCQkJCQkJCXN0YXR1cyA9IGFscmVhZHlFeGlzdFN0YXR1czsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmVwcmVzZW50YXRpb24gPSBSZXByZXNlbnRhdGlvblV0aWxzLnRvUmVwcmVzZW50YXRpb24oZWl0aGVyUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KHN0YXR1cyksIHJlcHJlc2VudGF0aW9uKTsKKwkJCQlyZXNwb25zZVdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3BvbnNlKTsKKworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkNyZWF0ZSAiICsgZWxlbWVudFR5cGVOYW1lKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjb252ZXJ0IHt9IHRvIGpzb24iLCBlbGVtZW50VHlwZU5hbWUsIGUpOworCQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJcmVzcG9uc2VXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXNwb25zZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIDxUPiBUIGluaXRFbGVtZW50VHlwZUltcG9ydE1hbmFnZXIoU2VydmxldENvbnRleHQgY29udGV4dCwgU3VwcGxpZXI8Q2xhc3M8VD4+IGNsYXNzR2V0dGVyKSB7CisJCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcGxpY2F0aW9uQ29udGV4dFdyYXBwZXIgPSAoV2ViQXBwQ29udGV4dFdyYXBwZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpOworCQlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gd2ViQXBwbGljYXRpb25Db250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KGNvbnRleHQpOworCQlUIGVsZW1lbnRUeXBlSW1vcnRNYW5hZ2VyID0gd2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oY2xhc3NHZXR0ZXIuZ2V0KCkpOworCQlyZXR1cm4gZWxlbWVudFR5cGVJbW9ydE1hbmFnZXI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvVXNlckFkbWluU2VydmxldC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1VzZXJBZG1pblNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzAwYzMxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1VzZXJBZG1pblNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDUxNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRnVuY3Rpb25hbE1lbnVJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpT3BlcmF0aW9uOworaW1wb3J0IGNvbS53b3JkbmlrLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpUGFyYW07CitpbXBvcnQgY29tLndvcmRuaWsuc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlSZXNwb25zZTsKK2ltcG9ydCBjb20ud29yZG5pay5zd2FnZ2VyLmFubm90YXRpb25zLkFwaVJlc3BvbnNlczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuREVCVUcsIHRyaW0gPSBmYWxzZSkKK0BQYXRoKCIvdjEvdXNlciIpCitAQXBpKHZhbHVlID0gIlVzZXIgQWRtaW5pc3RyYXRpb24iLCBkZXNjcmlwdGlvbiA9ICJVc2VyIGFkbWluaW5zdGFyYXRvciBvcGVyYXRpb25zIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBVc2VyQWRtaW5TZXJ2bGV0IGV4dGVuZHMgQmVHZW5lcmljU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERUxJTUlURVIgPSAiLCI7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFVzZXJBZG1pblNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBBUEkgc3RhcnQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIFVzZXIgYnkgdXNlcklkIENSVUQgc3RhcnQgKi8KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gcmV0cmlldmUgYWxsIHVzZXIgZGV0YWlscworCUBHRVQKKwlAUGF0aCgiL3t1c2VySWR9IikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAicmV0cmlldmUgdXNlciBkZXRhaWxzIiwgaHR0cE1ldGhvZCA9ICJHRVQiLCBub3RlcyA9ICJSZXR1cm5zIHVzZXIgZGV0YWlscyBhY2NvcmRpbmcgdG8gdXNlcklkIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgdXNlciBPayIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNCwgbWVzc2FnZSA9ICJVc2VyIG5vdCBmb3VuZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNSwgbWVzc2FnZSA9ICJNZXRob2QgTm90IEFsbG93ZWQiKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldChAQXBpUGFyYW0odmFsdWUgPSAidXNlcklkIG9mIHVzZXIgdG8gZ2V0IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJ1c2VySWQiKSBmaW5hbCBTdHJpbmcgdXNlcklkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldCkgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVVzZXJCdXNpbmVzc0xvZ2ljIHVzZXJBZG1pbk1hbmFnZXIgPSBnZXRVc2VyQWRtaW5NYW5hZ2VyKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCisJCXRyeSB7CisJCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXIgPSB1c2VyQWRtaW5NYW5hZ2VyLmdldFVzZXIodXNlcklkLCBmYWxzZSk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdEJ5VXNlcklkKGVpdGhlci5yaWdodCgpLnZhbHVlKCksIHVzZXJJZCkpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZWl0aGVyLmxlZnQoKS52YWx1ZSgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBlaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IFVzZXIiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBVc2VyIik7CisJCQlsb2cuZGVidWcoImdldCB1c2VyIGZhaWxlZCB3aXRoIHVuZXhwZWN0ZWQgZXJyb3I6IHt9IiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHVwZGF0ZSB1c2VyIC0gaW50ZXJuYWwgQVBJCisJLyoKKwkgKiBAUE9TVAorCSAqIAorCSAqIEBQYXRoKCIve3VzZXJJZH0iKQorCSAqIAorCSAqIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwkgKiAKKwkgKiBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJICogCisJICogQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJ1cGRhdGUgdXNlcgktIGludGVybmFsIEFQSSIsIG5vdGVzID0gIlVwZGF0ZSB1c2VyIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCSAqIAorCSAqIEBBcGlSZXNwb25zZXModmFsdWUgPSB7CisJICogCisJICogQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiVXBkYXRlIHVzZXIgT0siKSwKKwkgKiAKKwkgKiBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIENvbnRlbnQuIiksCisJICogCisJICogQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiTWlzc2luZyBpbmZvcm1hdGlvbi9SZXN0cmljdGVkIG9wZXJhdGlvbiIpLAorCSAqIAorCSAqIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlVzZXIgbm90IGZvdW5kIiksCisJICogCisJICogQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDUsIG1lc3NhZ2UgPSAiTWV0aG9kIE5vdCBBbGxvd2VkIiksCisJICogCisJICogQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDksIG1lc3NhZ2UgPSAiVXNlciBhbHJlYWR5IGV4aXN0cyIpLAorCSAqIAorCSAqIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pIHB1YmxpYyBSZXNwb25zZSB1cGRhdGVVc2VyKEBBcGlQYXJhbSh2YWx1ZT0idXNlcklkIG9mIHVzZXIgdG8gZ2V0IiwgcmVxdWlyZWQ9dHJ1ZSkgQFBhdGhQYXJhbSgidXNlcklkIikgZmluYWwgU3RyaW5nIFVzZXJJZFVwZGF0ZVVzZXIsCisJICogCisJICogQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJICogCisJICogQEFwaVBhcmFtKHZhbHVlPSJqc29uIGRlc2NyaWJlIHRoZSB1cGRhdGUgdXNlciIsIHJlcXVpcmVkPXRydWUpIFN0cmluZyBkYXRhLAorCSAqIAorCSAqIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIG1vZGlmaWVyQXR0SWQpIHsKKwkgKiAKKwkgKiBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkgKiAKKwkgKiBTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOyBsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKwkgKiAKKwkgKiAvLyBnZXQgbW9kaWZpZXIgaWQgVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7IG1vZGlmaWVyLnNldFVzZXJJZChtb2RpZmllckF0dElkKTsgbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIG1vZGlmaWVyQXR0SWQpOworCSAqIAorCSAqIFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkgKiAKKwkgKiB0cnkgeyBVc2VyQWRtaW5CdWlzaW5lc3NMb2dpYyBidXNpbmVzc0xvZ2ljID0gZ2V0VXNlckFkbWluTWFuYWdlcihjb250ZXh0KTsgVXNlciB1cGRhdGVJbmZvVXNlciA9IGdldENvbXBvbmVudHNVdGlscygpLmNvbnZlcnRKc29uVG9PYmplY3QoZGF0YSwgbW9kaWZpZXIsIFVzZXIuY2xhc3MsIEF1ZGl0aW5nQWN0aW9uRW51bS5VUERBVEVfVVNFUikubGVmdCgpLnZhbHVlKCk7IEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4KKwkgKiB1cGRhdGVVc2VyUmVzcG9uc2UgPSBudWxsOy8vIGJ1c2luZXNzTG9naWMudXBkYXRlVXNlcihtb2RpZmllciwgVXNlcklkVXBkYXRlVXNlciwgdXBkYXRlSW5mb1VzZXIpOworCSAqIAorCSAqIGlmICh1cGRhdGVVc2VyUmVzcG9uc2UuaXNSaWdodCgpKSB7IGxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSB1c2VyIG1ldGFkYXRhIik7IHJlc3BvbnNlID0gYnVpbGRFcnJvclJlc3BvbnNlKHVwZGF0ZVVzZXJSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOyByZXR1cm4gcmVzcG9uc2U7IH0gcmVzcG9uc2UgPQorCSAqIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCB1cGRhdGVVc2VyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOyByZXR1cm4gcmVzcG9uc2U7CisJICogCisJICogfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLiBCZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJVcGRhdGUgVXNlciBNZXRhZGF0YSIpOyBsb2cuZGVidWcoIlVwZGF0ZSBVc2VyIE1ldGFkYXRhIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOyByZXNwb25zZSA9CisJICogYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy4gR0VORVJBTF9FUlJPUikpOyByZXR1cm4gcmVzcG9uc2U7CisJICogCisJICogfSB9CisJICogCisJICovCisJLyogVXNlciB1c2VySWQgQ1JVRCBlbmQgKi8KKworCS8qIFVzZXIgcm9sZSBDUlVEIHN0YXJ0ICovCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyByZXRyaWV2ZSB1c2VyIHJvbGUKKwlAR0VUCisJQFBhdGgoIi97dXNlcklkfS9yb2xlIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAicmV0cmlldmUgdXNlciByb2xlIiwgbm90ZXMgPSAiUmV0dXJucyB1c2VyIHJvbGUgYWNjb3JkaW5nIHRvIHVzZXJJZCIsIHJlc3BvbnNlID0gU3RyaW5nLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgdXNlciByb2xlIE9rIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlVzZXIgbm90IGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA1LCBtZXNzYWdlID0gIk1ldGhvZCBOb3QgQWxsb3dlZCIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA1MDAsIG1lc3NhZ2UgPSAiSW50ZXJuYWwgU2VydmVyIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0Um9sZShAQXBpUGFyYW0odmFsdWUgPSAidXNlcklkIG9mIHVzZXIgdG8gZ2V0IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJ1c2VySWQiKSBmaW5hbCBTdHJpbmcgdXNlcklkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldFJvbGUpIFN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQlVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW5NYW5hZ2VyID0gZ2V0VXNlckFkbWluTWFuYWdlcihyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKworCQl0cnkgeworCQkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyID0gdXNlckFkbWluTWFuYWdlci5nZXRVc2VyKHVzZXJJZCwgZmFsc2UpOworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0QnlVc2VySWQoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSwgdXNlcklkKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChlaXRoZXIubGVmdCgpLnZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgcm9sZUpzb24gPSAoInsgXCJyb2xlXCIgOiBcIiIgKyBlaXRoZXIubGVmdCgpLnZhbHVlKCkuZ2V0Um9sZSgpLnRvU3RyaW5nKCkgKyAiXCIgfSIpOworCQkJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIHJvbGVKc29uKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBVc2VyIFJvbGUiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBVc2VyIFJvbGUiKTsKKwkJCWxvZy5kZWJ1ZygiR2V0IHVzZXIgcm9sZSBmYWlsZWQgd2l0aCB1bmV4cGVjdGVkIGVycm9yOiB7fSIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyB1cGRhdGUgdXNlciByb2xlCisJQFBPU1QKKwlAUGF0aCgiL3t1c2VySWR9L3JvbGUiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJ1cGRhdGUgdXNlciByb2xlIiwgbm90ZXMgPSAiVXBkYXRlIHVzZXIgcm9sZSIsIHJlc3BvbnNlID0gVXNlci5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJVcGRhdGUgdXNlciBPSyIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIENvbnRlbnQuIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIk1pc3NpbmcgaW5mb3JtYXRpb24vUmVzdHJpY3RlZCBvcGVyYXRpb24iKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIlVzZXIgbm90IGZvdW5kIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA1LCBtZXNzYWdlID0gIk1ldGhvZCBOb3QgQWxsb3dlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJVc2VyIGFscmVhZHkgZXhpc3RzIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIHVwZGF0ZVVzZXJSb2xlKEBBcGlQYXJhbSh2YWx1ZSA9ICJ1c2VySWQgb2YgdXNlciB0byBnZXQiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInVzZXJJZCIpIGZpbmFsIFN0cmluZyBVc2VySWRVcGRhdGVVc2VyLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCUBBcGlQYXJhbSh2YWx1ZSA9ICJqc29uIGRlc2NyaWJlIHRoZSB1cGRhdGUgcm9sZSIsIHJlcXVpcmVkID0gdHJ1ZSkgU3RyaW5nIGRhdGEsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIG1vZGlmaWVyVXNlcklkKSB7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJLy8gZ2V0IG1vZGlmaWVyIGlkCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQobW9kaWZpZXJVc2VySWQpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgbW9kaWZpZXJVc2VySWQpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCQkJVXNlckJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFVzZXJBZG1pbk1hbmFnZXIoY29udGV4dCk7CisJCQlVc2VyIHVwZGF0ZUluZm9Vc2VyID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuY29udmVydEpzb25Ub09iamVjdChkYXRhLCBtb2RpZmllciwgVXNlci5jbGFzcywgQXVkaXRpbmdBY3Rpb25FbnVtLlVQREFURV9VU0VSKS5sZWZ0KCkudmFsdWUoKTsKKwkJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gdXBkYXRlVXNlclJlc3BvbnNlID0gYnVzaW5lc3NMb2dpYy51cGRhdGVVc2VyUm9sZShtb2RpZmllciwgVXNlcklkVXBkYXRlVXNlciwgdXBkYXRlSW5mb1VzZXIuZ2V0Um9sZSgpKTsKKworCQkJaWYgKHVwZGF0ZVVzZXJSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgdXNlciByb2xlIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UodXBkYXRlVXNlclJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgdXBkYXRlVXNlclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIlVwZGF0ZSBVc2VyIE1ldGFkYXRhIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKCJVcGRhdGUgVXNlciBNZXRhZGF0YSIpOworCQkJbG9nLmRlYnVnKCJVcGRhdGUgVXNlciBSb2xlIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJLyogVXNlciByb2xlIENSVUQgZW5kICovCisKKwkvKiBOZXcgdXNlciBDUlVEIHN0YXJ0ICovCisJQFBPU1QKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiYWRkIHVzZXIiLCBodHRwTWV0aG9kID0gIlBPU1QiLCBub3RlcyA9ICJQcm92aXNpb24gbmV3IHVzZXIiLCByZXNwb25zZSA9IFVzZXIuY2xhc3MpCisJQEFwaVJlc3BvbnNlcyh2YWx1ZSA9IHsgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDEsIG1lc3NhZ2UgPSAiTmV3IHVzZXIgY3JlYXRlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJJbnZhbGlkIENvbnRlbnQuIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAzLCBtZXNzYWdlID0gIk1pc3NpbmcgaW5mb3JtYXRpb24iKSwKKwkJCUBBcGlSZXNwb25zZShjb2RlID0gNDA1LCBtZXNzYWdlID0gIk1ldGhvZCBOb3QgQWxsb3dlZCIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwOSwgbWVzc2FnZSA9ICJVc2VyIGFscmVhZHkgZXhpc3RzIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGNyZWF0ZVVzZXIoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBBcGlQYXJhbSh2YWx1ZSA9ICJqc29uIGRlc2NyaWJlIHRoZSB1c2VyIiwgcmVxdWlyZWQgPSB0cnVlKSBTdHJpbmcgbmV3VXNlckRhdGEsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIG1vZGlmaWVyQXR0SWQpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlTdHJpbmcgdXJsID0gcmVxdWVzdC5nZXRNZXRob2QoKSArICIgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlsb2cuZGVidWcoIlN0YXJ0IGhhbmRsZSByZXF1ZXN0IG9mIHt9IiwgdXJsKTsKKworCQkvLyBnZXQgbW9kaWZpZXIgaWQKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZChtb2RpZmllckF0dElkKTsKKwkJbG9nLmRlYnVnKCJtb2RpZmllciBpZCBpcyB7fSIsIG1vZGlmaWVyQXR0SWQpOworCisJCVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCQkJVXNlckJ1c2luZXNzTG9naWMgYnVzaW5lc3NMb2dpYyA9IGdldFVzZXJBZG1pbk1hbmFnZXIoY29udGV4dCk7CisJCQlVc2VyIG5ld1VzZXJJbmZvID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuY29udmVydEpzb25Ub09iamVjdChuZXdVc2VyRGF0YSwgbW9kaWZpZXIsIFVzZXIuY2xhc3MsIEF1ZGl0aW5nQWN0aW9uRW51bS5BRERfVVNFUikubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVVzZXJSZXNwb25zZSA9IGJ1c2luZXNzTG9naWMuY3JlYXRlVXNlcihtb2RpZmllciwgbmV3VXNlckluZm8pOworCisJCQlpZiAoY3JlYXRlVXNlclJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSB1c2VyIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoY3JlYXRlVXNlclJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNSRUFURUQpLCBjcmVhdGVVc2VyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3BvbnNlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiVXBkYXRlIFVzZXIgTWV0YWRhdGEiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIlVwZGF0ZSBVc2VyIE1ldGFkYXRhIik7CisJCQlsb2cuZGVidWcoIkNyZWF0ZSBVc2VyIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiIsIGUpOworCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9CisJfQorCisJLyogTmV3IHVzZXIgQ1JVRCBlbmQgKi8KKworCS8qIFVzZXIgYXV0aG9yaXphdGlvbiBzdGFydCAqLworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBVc2VyIEF1dGhvcml6YXRpb24KKwlAR0VUCisJQFBhdGgoIi9hdXRob3JpemUiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gImF1dGhvcml6ZSIsIG5vdGVzID0gImF1dGhvcml6ZSB1c2VyIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgdXNlciBPayIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIEFjY2VzcyIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBhdXRob3JpemUoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBIZWFkZXJQYXJhbSh2YWx1ZSA9IENvbnN0YW50cy5VU0VSX0lEX0hFQURFUikgU3RyaW5nIHVzZXJJZCwgQEhlYWRlclBhcmFtKCJIVFRQX0NTUF9GSVJTVE5BTUUiKSBTdHJpbmcgZmlyc3ROYW1lLCBASGVhZGVyUGFyYW0oIkhUVFBfQ1NQX0xBU1ROQU1FIikgU3RyaW5nIGxhc3ROYW1lLAorCQkJQEhlYWRlclBhcmFtKCJIVFRQX0NTUF9FTUFJTCIpIFN0cmluZyBlbWFpbCkgeworCisJCXRyeSB7CisJCQl1c2VySWQgPSAodXNlcklkICE9IG51bGwgPyBVUkxEZWNvZGVyLmRlY29kZSh1c2VySWQsICJVVEYtOCIpIDogbnVsbCk7CisJCQlmaXJzdE5hbWUgPSAoZmlyc3ROYW1lICE9IG51bGwgPyBVUkxEZWNvZGVyLmRlY29kZShmaXJzdE5hbWUsICJVVEYtOCIpIDogbnVsbCk7CisJCQlsYXN0TmFtZSA9IChsYXN0TmFtZSAhPSBudWxsID8gVVJMRGVjb2Rlci5kZWNvZGUobGFzdE5hbWUsICJVVEYtOCIpIDogbnVsbCk7CisJCQllbWFpbCA9IChlbWFpbCAhPSBudWxsID8gVVJMRGVjb2Rlci5kZWNvZGUoZW1haWwsICJVVEYtOCIpIDogbnVsbCk7CisJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkF1dGhvcml6ZSBVc2VyIC0gZGVjb2RlIGhlYWRlcnMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkF1dGhvcml6ZSBVc2VyIC0gZGVjb2RlIGhlYWRlcnMiKTsKKwkJCVJlc3BvbnNlRm9ybWF0IGVycm9yUmVzcG9uc2VXcmFwcGVyID0gZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShlcnJvclJlc3BvbnNlV3JhcHBlcik7CisJCX0KKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJVXNlciBhdXRoVXNlciA9IG5ldyBVc2VyKCk7CisJCWF1dGhVc2VyLnNldFVzZXJJZCh1c2VySWQpOworCQlhdXRoVXNlci5zZXRGaXJzdE5hbWUoZmlyc3ROYW1lKTsKKwkJYXV0aFVzZXIuc2V0TGFzdE5hbWUobGFzdE5hbWUpOworCQlhdXRoVXNlci5zZXRFbWFpbChlbWFpbCk7CisJCWxvZy5kZWJ1ZygiYXV0aCB1c2VyIGlkIGlzIHt9IiwgdXNlcklkKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW5NYW5hZ2VyID0gZ2V0VXNlckFkbWluTWFuYWdlcihjb250ZXh0KTsKKwkJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gYXV0aG9yaXplID0gdXNlckFkbWluTWFuYWdlci5hdXRob3JpemUoYXV0aFVzZXIpOworCisJCQlpZiAoYXV0aG9yaXplLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiYXV0aG9yaXplIHVzZXIgZmFpbGVkIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoYXV0aG9yaXplLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3BvbnNlOworCQkJfQorCQkJcmVzcG9uc2UgPSBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgYXV0aG9yaXplLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXNwb25zZTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBBU0RDIHVzZXJzIik7CisJCQlsb2cuZGVidWcoImF1dGhvcml6ZSB1c2VyIGZhaWxlZCB3aXRoIHVuZXhwZWN0ZWQgZXJyb3I6IHt9IiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwkvKiBVc2VyIGF1dGhvcml6YXRpb24gZW5kICovCisKKwlAR0VUCisJQFBhdGgoIi9hZG1pbnMiKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJyZXRyaWV2ZSBhbGwgYWRtaW5pc3RyYXRvcnMiLCBodHRwTWV0aG9kID0gIkdFVCIsIG5vdGVzID0gIlJldHVybnMgYWxsIGFkbWluaXN0cmF0b3JzIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgdXNlciBPayIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwNSwgbWVzc2FnZSA9ICJNZXRob2QgTm90IEFsbG93ZWQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA1MDAsIG1lc3NhZ2UgPSAiSW50ZXJuYWwgU2VydmVyIEVycm9yIikgfSkKKwlwdWJsaWMgUmVzcG9uc2UgZ2V0QWRtaW5zVXNlcihAUGF0aFBhcmFtKCJ1c2VySWQiKSBmaW5hbCBTdHJpbmcgdXNlcklkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldCkgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVVzZXJCdXNpbmVzc0xvZ2ljIHVzZXJBZG1pbk1hbmFnZXIgPSBnZXRVc2VyQWRtaW5NYW5hZ2VyKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCisJCXRyeSB7CisJCQlFaXRoZXI8TGlzdDxVc2VyPiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlciA9IHVzZXJBZG1pbk1hbmFnZXIuZ2V0QWxsQWRtaW5Vc2VycyhyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgYWxsIGFkbWluIHVzZXJzIik7CisJCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShlaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGVpdGhlci5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBidWlsZE9rUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKSwgZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlUmVzdEFwaUdlbmVyYWxFcnJvciwgIkdldCBBbGwgQWRtaW5pc3RyYXRvcnMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBBbGwgQWRtaW5pc3RyYXRvcnMiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0IGFsbCBhZG1pbnMgZmFpbGVkIHdpdGggdW5leHBlY3RlZCBlcnJvcjoge30iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworCUBHRVQKKwlAUGF0aCgiL3VzZXJzIikKKwlAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBBcGlPcGVyYXRpb24odmFsdWUgPSAiUmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsIGFjdGl2ZSBBU0RDIHVzZXJzIG9yIG9ubHkgZ3JvdXAgb2YgdXNlcnMgaGF2aW5nIHNwZWNpZmljIHJvbGVzLiIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyBsaXN0IG9mIHVzZXJzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlcywgb3IgYWxsIG9mIHVzZXJzIGluIHRoZSBjYXNlIG9mIGVtcHR5ICdyb2xlcycgaGVhZGVyIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlJldHVybnMgdXNlcnMgT2siKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDQsIG1lc3NhZ2UgPSAiTm8gcHJvdmlzaW9uZWQgQVNEQyB1c2VycyBvZiByZXF1ZXN0ZWQgcm9sZSIpLCBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMywgbWVzc2FnZSA9ICJSZXN0cmljdGVkIEFjY2VzcyIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDAsIG1lc3NhZ2UgPSAiTWlzc2luZyBjb250ZW50IiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGdldFVzZXJzTGlzdChAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQEFwaVBhcmFtKHZhbHVlID0gIkFueSBhY3RpdmUgdXNlcidzIFVTRVJfSUQiKSBASGVhZGVyUGFyYW0oQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSBmaW5hbCBTdHJpbmcgdXNlcklkLAorCQkJQEFwaVBhcmFtKHZhbHVlID0gIlRFU1RFUixERVNJR05FUixQUk9EVUNUX1NUUkFURUdJU1QsT1BTLFBST0RVQ1RfTUFOQUdFUixHT1ZFUk5PUiwgQURNSU4gT1IgYWxsIHVzZXJzIGJ5IG5vdCB0eXBpbmcgYW55dGhpbmciKSBAUXVlcnlQYXJhbSgicm9sZXMiKSBmaW5hbCBTdHJpbmcgcm9sZXMpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisJCWxvZy5kZWJ1ZygibW9kaWZpZXIgaWQgaXMge30iLCB1c2VySWQpOworCisJCUxpc3Q8U3RyaW5nPiByb2xlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLnRyaW0oKS5pc0VtcHR5KCkpIHsKKwkJCVN0cmluZ1tdIHJvbGVzQXJyID0gcm9sZXMuc3BsaXQoUk9MRV9ERUxJTUlURVIpOworCQkJZm9yIChTdHJpbmcgcm9sZSA6IHJvbGVzQXJyKSB7CisJCQkJcm9sZXNMaXN0LmFkZChyb2xlLnRyaW0oKSk7CisJCQl9CisJCX0KKworCQl0cnkgeworCQkJVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluTWFuYWdlciA9IGdldFVzZXJBZG1pbk1hbmFnZXIoY29udGV4dCk7CisJCQlFaXRoZXI8TGlzdDxVc2VyPiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlciA9IHVzZXJBZG1pbk1hbmFnZXIuZ2V0VXNlcnNMaXN0KHVzZXJJZCwgcm9sZXNMaXN0LCByb2xlcyk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IEFTREMgdXNlcnMiKTsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gYnVpbGRPa1Jlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyksIGVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVSZXN0QXBpR2VuZXJhbEVycm9yLCAiR2V0IEFTREMgdXNlcnMiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVJlc3RBcGlHZW5lcmFsRXJyb3IoIkdldCBBU0RDIHVzZXJzIik7CisJCQlsb2cuZGVidWcoImdldCB1c2VycyBmYWlsZWQgd2l0aCB1bmV4cGVjdGVkIGVycm9yOiB7fSIsIGUpOworCQkJcmV0dXJuIGJ1aWxkRXJyb3JSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQl9CisKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIGRlbGV0ZSB1c2VyCisJQERFTEVURQorCUBQYXRoKCIve3VzZXJJZH0iKQorCUBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICJkZWxldGUgdXNlciIsIG5vdGVzID0gIkRlbGV0ZSB1c2VyIiwgcmVzcG9uc2UgPSBVc2VyLmNsYXNzKQorCUBBcGlSZXNwb25zZXModmFsdWUgPSB7IEBBcGlSZXNwb25zZShjb2RlID0gMjAwLCBtZXNzYWdlID0gIlVwZGF0ZSBkZWxldGVkIE9LIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDAwLCBtZXNzYWdlID0gIkludmFsaWQgQ29udGVudC4iKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDMsIG1lc3NhZ2UgPSAiTWlzc2luZyBpbmZvcm1hdGlvbiIpLAorCQkJQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiVXNlciBub3QgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDUsIG1lc3NhZ2UgPSAiTWV0aG9kIE5vdCBBbGxvd2VkIiksIEBBcGlSZXNwb25zZShjb2RlID0gNDA5LCBtZXNzYWdlID0gIlJlc3RyaWN0ZWQgb3BlcmF0aW9uIiksIEBBcGlSZXNwb25zZShjb2RlID0gNTAwLCBtZXNzYWdlID0gIkludGVybmFsIFNlcnZlciBFcnJvciIpIH0pCisJcHVibGljIFJlc3BvbnNlIGRlQWN0aXZhdGVVc2VyKEBBcGlQYXJhbSh2YWx1ZSA9ICJ1c2VySWQgb2YgdXNlciB0byBnZXQiLCByZXF1aXJlZCA9IHRydWUpIEBQYXRoUGFyYW0oInVzZXJJZCIpIGZpbmFsIFN0cmluZyB1c2VySWQsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBASGVhZGVyUGFyYW0odmFsdWUgPSBDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpIFN0cmluZyB1c2VySWRIZWFkZXIpIHsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKwkJU3RyaW5nIHVybCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKwkJbG9nLmRlYnVnKCJTdGFydCBoYW5kbGUgcmVxdWVzdCBvZiB7fSIsIHVybCk7CisKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCh1c2VySWRIZWFkZXIpOworCQlsb2cuZGVidWcoIm1vZGlmaWVyIGlkIGlzIHt9IiwgdXNlcklkSGVhZGVyKTsKKworCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisJCXRyeSB7CisJCQlVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW5NYW5hZ2VyID0gZ2V0VXNlckFkbWluTWFuYWdlcihjb250ZXh0KTsKKwkJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gZGVhY3RpdmVVc2VyUmVzcG9uc2UgPSB1c2VyQWRtaW5NYW5hZ2VyLmRlQWN0aXZhdGVVc2VyKG1vZGlmaWVyLCB1c2VySWQpOworCisJCQlpZiAoZGVhY3RpdmVVc2VyUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVhY3RpdmF0ZSB1c2VyIik7CisJCQkJcmVzcG9uc2UgPSBidWlsZEVycm9yUmVzcG9uc2UoZGVhY3RpdmVVc2VyUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzcG9uc2U7CisJCQl9CisJCQlyZXNwb25zZSA9IGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBkZWFjdGl2ZVVzZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzcG9uc2U7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVJlc3RBcGlHZW5lcmFsRXJyb3IsICJHZXQgQVNEQyB1c2VycyIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IEFTREMgdXNlcnMiKTsKKwkJCWxvZy5kZWJ1ZygiZGVhY3RpdmF0ZSB1c2VyIGZhaWxlZCB3aXRoIHVuZXhwZWN0ZWQgZXJyb3I6IHt9IiwgZSk7CisJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCX0KKwl9CisKKwlAR0VUCisJQFBhdGgoIi97dXNlcklkfS9mdW5jdGlvbmFsbWVudSIpCisJQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCUBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKwlAQXBpT3BlcmF0aW9uKHZhbHVlID0gInJldHJpZXZlIHVzZXIgZGV0YWlscyIsIGh0dHBNZXRob2QgPSAiR0VUIiwgbm90ZXMgPSAiUmV0dXJucyB1c2VyIGRldGFpbHMgYWNjb3JkaW5nIHRvIHVzZXJJZCIsIHJlc3BvbnNlID0gVXNlci5jbGFzcykKKwlAQXBpUmVzcG9uc2VzKHZhbHVlID0geyBAQXBpUmVzcG9uc2UoY29kZSA9IDIwMCwgbWVzc2FnZSA9ICJSZXR1cm5zIHVzZXIgT2siKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDQsIG1lc3NhZ2UgPSAiVXNlciBub3QgZm91bmQiKSwgQEFwaVJlc3BvbnNlKGNvZGUgPSA0MDUsIG1lc3NhZ2UgPSAiTWV0aG9kIE5vdCBBbGxvd2VkIiksCisJCQlAQXBpUmVzcG9uc2UoY29kZSA9IDUwMCwgbWVzc2FnZSA9ICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKSB9KQorCXB1YmxpYyBSZXNwb25zZSBnZXRGdW5jdGlvbmFsTWVudShAQXBpUGFyYW0odmFsdWUgPSAidXNlcklkIG9mIHVzZXIgdG8gZ2V0IiwgcmVxdWlyZWQgPSB0cnVlKSBAUGF0aFBhcmFtKCJ1c2VySWQiKSBmaW5hbCBTdHJpbmcgdXNlcklkLCBAQ29udGV4dCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyB1cmwgPSByZXF1ZXN0LmdldE1ldGhvZCgpICsgIiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisJCWxvZy5kZWJ1ZygiKGdldCkgU3RhcnQgaGFuZGxlIHJlcXVlc3Qgb2Yge30iLCB1cmwpOworCisJCVVzZXJCdXNpbmVzc0xvZ2ljIHVzZXJBZG1pbk1hbmFnZXIgPSBnZXRVc2VyQWRtaW5NYW5hZ2VyKHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkpOworCisJCXRyeSB7CisJCQlFaXRoZXI8RnVuY3Rpb25hbE1lbnVJbmZvLCBBY3Rpb25TdGF0dXM+IGZ1bmN0aW9uYWxNZW51UmVzcCA9IHVzZXJBZG1pbk1hbmFnZXIuZ2V0RnVuY3Rpb25hbE1lbnUodXNlcklkKTsKKworCQkJaWYgKGZ1bmN0aW9uYWxNZW51UmVzcC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0QnlVc2VySWQoZnVuY3Rpb25hbE1lbnVSZXNwLnJpZ2h0KCkudmFsdWUoKSwgdXNlcklkKSk7CisJCQl9IGVsc2UgeworCQkJCUZ1bmN0aW9uYWxNZW51SW5mbyBmdW5jdGlvbmFsTWVudUluZm8gPSBmdW5jdGlvbmFsTWVudVJlc3AubGVmdCgpLnZhbHVlKCk7CisJCQkJaWYgKGZ1bmN0aW9uYWxNZW51SW5mbyAhPSBudWxsICYmIGZ1bmN0aW9uYWxNZW51SW5mby5nZXRGdW5jdGlvbmFsTWVudSgpICE9IG51bGwpIHsKKwkJCQkJbG9nLmRlYnVnKCJGdW5jdGlvbmFsIG1lbnUgZmV0Y2hlZCBpcyB7fSIsIGZ1bmN0aW9uYWxNZW51SW5mby5nZXRGdW5jdGlvbmFsTWVudSgpKTsKKwkJCQkJcmV0dXJuIGJ1aWxkT2tSZXNwb25zZShnZXRDb21wb25lbnRzVXRpbHMoKS5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spLCBmdW5jdGlvbmFsTWVudUluZm8uZ2V0RnVuY3Rpb25hbE1lbnUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJGdW5jdGlvbmFsIG1lbnUgaXMgbnVsbCIpOworCQkJCQlyZXR1cm4gYnVpbGRFcnJvclJlc3BvbnNlKGdldENvbXBvbmVudHNVdGlscygpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlUmVzdEFwaUdlbmVyYWxFcnJvcigiR2V0IFVzZXIiKTsKKwkJCWxvZy5kZWJ1ZygiZ2V0IHVzZXIgZmFpbGVkIHdpdGggdW5leHBlY3RlZCBlcnJvcjoge30iLCBlKTsKKwkJCXJldHVybiBidWlsZEVycm9yUmVzcG9uc2UoZ2V0Q29tcG9uZW50c1V0aWxzKCkuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3N3aXRjaG92ZXIvZGV0ZWN0b3IvU3dpdGNob3ZlckRldGVjdG9yLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc3dpdGNob3Zlci9kZXRlY3Rvci9Td2l0Y2hvdmVyRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI3MTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3N3aXRjaG92ZXIvZGV0ZWN0b3IvU3dpdGNob3ZlckRldGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zd2l0Y2hvdmVyLmRldGVjdG9yOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLlN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ucmVzdC5IdHRwUmVzdENsaWVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQoInN3aXRjaG92ZXItZGV0ZWN0b3IiKQorcHVibGljIGNsYXNzIFN3aXRjaG92ZXJEZXRlY3RvciB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBTV0lUQ0hPVkVSX0RFVEVDVE9SX0xPR19DT05URVhUID0gInN3aXRjaG92ZXIuZGV0ZWN0b3IiOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIHN3aXRjaG92ZXJMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTV0lUQ0hPVkVSX0RFVEVDVE9SX0xPR19DT05URVhUKTsKKworCXByaXZhdGUgU3dpdGNob3ZlckRldGVjdG9yQ29uZmlnIHN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZzsKKworCXByaXZhdGUgUHJvcGVydGllcyBhdXRoSGVhZGVyID0gbnVsbDsKKworCXByaXZhdGUgbG9uZyBkZXRlY3RvckludGVydmFsID0gNjA7CisKKwlwcml2YXRlIGludCBtYXhCZVF1ZXJ5QXR0ZW1wdHMgPSAzOworCisJcHJpdmF0ZSBpbnQgbWF4RmVRdWVyeUF0dGVtcHRzID0gMzsKKworCXByaXZhdGUgQm9vbGVhbiBiZU1hdGNoID0gbnVsbDsKKworCXByaXZhdGUgQm9vbGVhbiBmZU1hdGNoID0gbnVsbDsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTd2l0Y2hvdmVyRGV0ZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIHNpdGVNb2RlID0gU3dpdGNob3ZlckRldGVjdG9yU3RhdGUuVU5LTk9XTi5nZXRTdGF0ZSgpOworCisJcHJpdmF0ZSBTY2hlZHVsZWRGdXR1cmU8Pz4gc2NoZWR1bGVkRnV0dXJlID0gbnVsbDsKKworCVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzd2l0Y2hvdmVyRGV0ZWN0b3JTY2hlZHVsZXIgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkU2NoZWR1bGVkRXhlY3V0b3IobmV3IFRocmVhZEZhY3RvcnkoKSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7CisJCQlyZXR1cm4gbmV3IFRocmVhZChyLCAiU3dpdGNob3Zlci1EZXRlY3Rvci1UYXNrIik7CisJCX0KKwl9KTsKKworCVN3aXRjaG92ZXJEZXRlY3RvclNjaGVkdWxlZFRhc2sgc3dpdGNob3ZlckRldGVjdG9yU2NoZWR1bGVkVGFzayA9IG51bGw7CisKKwlwdWJsaWMgZW51bSBTd2l0Y2hvdmVyRGV0ZWN0b3JTdGF0ZSB7CisKKwkJVU5LTk9XTigidW5rbm93biIpLCBBQ1RJVkUoImFjdGl2ZSIpLCBTVEFOREJZKCJzdGFuZGJ5Iik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgc3RhdGU7CisKKwkJU3dpdGNob3ZlckRldGVjdG9yU3RhdGUoU3RyaW5nIHN0YXRlKSB7CisJCQl0aGlzLnN0YXRlID0gc3RhdGU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgeworCQkJcmV0dXJuIHN0YXRlOworCQl9CisJfQorCisJcHVibGljIGVudW0gU3dpdGNob3ZlckRldGVjdG9yR3JvdXAgeworCisJCUJFX1NFVCgiYmVTZXQiKSwgRkVfU0VUKCJmZVNldCIpOworCisJCXByaXZhdGUgU3RyaW5nIGdyb3VwOworCisJCVN3aXRjaG92ZXJEZXRlY3Rvckdyb3VwKFN0cmluZyBncm91cCkgeworCQkJdGhpcy5ncm91cCA9IGdyb3VwOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKKwkJCXJldHVybiBncm91cDsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2l0ZU1vZGUoKSB7CisJCXJldHVybiBzaXRlTW9kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTaXRlTW9kZShTdHJpbmcgbW9kZSkgeworCQl0aGlzLnNpdGVNb2RlID0gbW9kZTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gcXVlcnlCZSgpIHsKKwkJcmV0dXJuIHF1ZXJ5R3NzKHN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZy5nZXRnQmVGcWRuKCksIHN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZy5nZXRCZVZpcCgpLCBtYXhCZVF1ZXJ5QXR0ZW1wdHMpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBxdWVyeUZlKCkgeworCQlyZXR1cm4gcXVlcnlHc3Moc3dpdGNob3ZlckRldGVjdG9yQ29uZmlnLmdldGdGZUZxZG4oKSwgc3dpdGNob3ZlckRldGVjdG9yQ29uZmlnLmdldEZlVmlwKCksIG1heEZlUXVlcnlBdHRlbXB0cyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEF1dGhvcml6YXRpb25Qcm9wZXJ0aWVzKCkgeworCQlTdHJpbmcgdXNlckluZm8gPSBzd2l0Y2hvdmVyRGV0ZWN0b3JDb25maWcuZ2V0Q2hhbmdlUHJpb3JpdHlVc2VyKCkgKyAiOiIgKyBzd2l0Y2hvdmVyRGV0ZWN0b3JDb25maWcuZ2V0Q2hhbmdlUHJpb3JpdHlQYXNzd29yZCgpOworCQlTdHJpbmcgYXV0aCA9ICJCYXNpYyAiICsgbmV3IFN0cmluZyhuZXcgQmFzZTY0KCkuZW5jb2RlKHVzZXJJbmZvLmdldEJ5dGVzKCkpKTsKKwkJYXV0aEhlYWRlciA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCWF1dGhIZWFkZXIucHV0KCJBdXRob3JpemF0aW9uIiwgYXV0aCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTaXRlTW9kZSgpIHsKKwkJd2hpbGUgKHNpdGVNb2RlID09IFN3aXRjaG92ZXJEZXRlY3RvclN0YXRlLlVOS05PV04uZ2V0U3RhdGUoKSkgeworCisJCQliZU1hdGNoID0gcXVlcnlCZSgpOworCQkJZmVNYXRjaCA9IHF1ZXJ5RmUoKTsKKworCQkJaWYgKGJlTWF0Y2ggPT0gZmVNYXRjaCAmJiBiZU1hdGNoICE9IG51bGwpIHsKKwkJCQlpZiAoYmVNYXRjaCkgeworCQkJCQlzZXRTaXRlTW9kZShTd2l0Y2hvdmVyRGV0ZWN0b3JTdGF0ZS5BQ1RJVkUuZ2V0U3RhdGUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2V0U2l0ZU1vZGUoU3dpdGNob3ZlckRldGVjdG9yU3RhdGUuU1RBTkRCWS5nZXRTdGF0ZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gcXVlcnlHc3MoU3RyaW5nIGZxZG4sIFN0cmluZyB2aXAsIGludCBtYXhBdHRlbXB0cykgeworCisJCUJvb2xlYW4gcmVzdWx0ID0gbnVsbDsKKwkJaW50IGF0dGVtcHRzID0gMDsKKworCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgKCsrYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykpIHsKKwkJCXRyeSB7CisJCQkJSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZnFkbik7CisJCQkJcmVzdWx0ID0gaW5ldEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKS5lcXVhbHModmlwKTsKKworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOworCQkJCWlmIChtZXNzYWdlID09IG51bGwpIHsKKwkJCQkJbWVzc2FnZSA9IGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisJCQkJfQorCQkJCXN3aXRjaG92ZXJMb2dnZXIuZGVidWcoIkVycm9yIG9jY3VyZWQgZHVyaW5nIHN3aXRjaG92ZXIgZGV0ZWN0b3IgcXVlcnksIFJlc3VsdCBpcyB7fSIsIG1lc3NhZ2UpOworCQkJfQorCQl9CisJCWlmIChudWxsID09IHJlc3VsdCkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ZxZG5SZXNvbHZlRXJyb3IoU1dJVENIT1ZFUl9ERVRFQ1RPUl9MT0dfQ09OVEVYVCwgImhvc3QgIiArIGZxZG4gKyAiIG5vdCByZXNvbHZlZCBhZnRlciAiICsgYXR0ZW1wdHMgKyAiIGF0dGVtcHRzIik7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgY2xhc3MgU3dpdGNob3ZlckRldGVjdG9yU2NoZWR1bGVkVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworCQlwdWJsaWMgU3dpdGNob3ZlckRldGVjdG9yU2NoZWR1bGVkVGFzaygpIHsKKworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCXN3aXRjaG92ZXJMb2dnZXIudHJhY2UoIkV4ZWN1dGluZyBTd2l0Y2hvdmVyIERldGVjdG9yIFRhc2sgLSBTdGFydCIpOworCisJCQlpbml0aWFsaXplU2l0ZU1vZGUoKTsKKworCQkJQm9vbGVhbiBiZVJlcyA9IHF1ZXJ5QmUoKTsKKwkJCUJvb2xlYW4gZmVSZXMgPSBxdWVyeUZlKCk7CisKKwkJCUJvb2xlYW4gdXBkYXRlUmVxdWlyZWQgPSBzaXRlTW9kZSA9PSBTd2l0Y2hvdmVyRGV0ZWN0b3JTdGF0ZS5TVEFOREJZLmdldFN0YXRlKCkgJiYgKGJlUmVzIHx8IGZlUmVzKTsKKworCQkJdXBkYXRlU2l0ZU1vZGVBbmRQcmlvcml0eShiZVJlcyAmJiBmZVJlcywgc2l0ZU1vZGUgPT0gU3dpdGNob3ZlckRldGVjdG9yU3RhdGUuU1RBTkRCWS5nZXRTdGF0ZSgpLCB1cGRhdGVSZXF1aXJlZCk7CisKKwkJCWJlTWF0Y2ggPSBiZVJlczsKKwkJCWZlTWF0Y2ggPSBmZVJlczsKKwkJfQorCisJCUV4ZWN1dG9yU2VydmljZSBzd2l0Y2hvdmVyRGV0ZWN0b3JFeGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgeworCQkJCXJldHVybiBuZXcgVGhyZWFkKHIsICJTd2l0Y2hvdmVyLURldGVjdG9yLVRocmVhZCIpOworCQkJfQorCQl9KTsKKworCQlwcml2YXRlIHZvaWQgdXBkYXRlU2l0ZU1vZGVBbmRQcmlvcml0eShCb29sZWFuIGJvdGhNYXRjaCwgQm9vbGVhbiBwcmV2aW91c01vZGVTdGFuZGJ5LCBCb29sZWFuIHVwZGF0ZVJlcXVpcmVkKSB7CisJCQlpZiAoYm90aE1hdGNoICYmIHByZXZpb3VzTW9kZVN0YW5kYnkpIHsKKwkJCQlsb2dnZXIudHJhY2UoIlNpdGUgc3dpdGNoIG92ZXIgd2FzIGRvbmUuIFNpdGUgaXMgbm93IGluIGFjdGl2ZSBtb2RlIik7CisJCQkJc2V0U2l0ZU1vZGUoU3dpdGNob3ZlckRldGVjdG9yU3RhdGUuQUNUSVZFLmdldFN0YXRlKCkpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dTaXRlU3dpdGNob3ZlckluZm8oU1dJVENIT1ZFUl9ERVRFQ1RPUl9MT0dfQ09OVEVYVCwgc2l0ZU1vZGUpOworCQkJfSBlbHNlIGlmICghYm90aE1hdGNoICYmICFwcmV2aW91c01vZGVTdGFuZGJ5KSB7CisJCQkJbG9nZ2VyLnRyYWNlKCJTaXRlIHN3aXRjaCBvdmVyIHdhcyBkb25lLiBTaXRlIGlzIG5vdyBpbiBzdGFuZC1ieSBtb2RlIik7CisJCQkJc2V0U2l0ZU1vZGUoU3dpdGNob3ZlckRldGVjdG9yU3RhdGUuU1RBTkRCWS5nZXRTdGF0ZSgpKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nU2l0ZVN3aXRjaG92ZXJJbmZvKFNXSVRDSE9WRVJfREVURUNUT1JfTE9HX0NPTlRFWFQsIHNpdGVNb2RlKTsKKwkJCX0KKwkJCWlmICh1cGRhdGVSZXF1aXJlZCkgeworCQkJCWNoYW5nZVNpdGVQcmlvcml0eShTd2l0Y2hvdmVyRGV0ZWN0b3JHcm91cC5CRV9TRVQuZ2V0R3JvdXAoKSk7CisJCQkJY2hhbmdlU2l0ZVByaW9yaXR5KFN3aXRjaG92ZXJEZXRlY3Rvckdyb3VwLkZFX1NFVC5nZXRHcm91cCgpKTsKKwkJCQlwdWJsaXNoTmV0d29yaygpOworCQkJfQorCQl9CisKKwkJcHJpdmF0ZSB2b2lkIGNoYW5nZVNpdGVQcmlvcml0eShTdHJpbmcgZ3JvdXBUb1NldCkgeworCisJCQlTdHJpbmcgdXJsID0gc3dpdGNob3ZlckRldGVjdG9yQ29uZmlnLmdldEdyb3VwcygpLmdldChncm91cFRvU2V0KS5nZXRDaGFuZ2VQcmlvcml0eVVybCgpOworCQkJU3RyaW5nIGJvZHkgPSBzd2l0Y2hvdmVyRGV0ZWN0b3JDb25maWcuZ2V0R3JvdXBzKCkuZ2V0KGdyb3VwVG9TZXQpLmdldENoYW5nZVByaW9yaXR5Qm9keSgpOworCisJCQlIdHRwUmVzdENsaWVudCBodHRwUmVzdENsaWVudCA9IG5ldyBIdHRwUmVzdENsaWVudCgpOworCisJCQl0cnkgeworCQkJCWh0dHBSZXN0Q2xpZW50LmRvUFVUKHVybCwgYXV0aEhlYWRlciwgYm9keSk7CisKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKKwkJCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7CisJCQkJCW1lc3NhZ2UgPSBlLmdldENsYXNzKCkuZ2V0TmFtZSgpOworCQkJCX0KKwkJCQlzd2l0Y2hvdmVyTG9nZ2VyLmVycm9yKCJFcnJvciBvY2N1cmVkIGR1cmluZyBjaGFuZ2Ugc2l0ZSBwcmlvcml0eSByZXF1ZXN0LCBSZXN1bHQgaXMge30iLCBtZXNzYWdlKTsKKwkJCX0KKworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIHB1Ymxpc2hOZXR3b3JrKCkgeworCisJCQlTdHJpbmcgdXJsID0gc3dpdGNob3ZlckRldGVjdG9yQ29uZmlnLmdldFB1Ymxpc2hOZXR3b3JrVXJsKCk7CisJCQlTdHJpbmcgYm9keSA9IHN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZy5nZXRQdWJsaXNoTmV0d29ya0JvZHkoKTsKKworCQkJSHR0cFJlc3RDbGllbnQgaHR0cFJlc3RDbGllbnQgPSBuZXcgSHR0cFJlc3RDbGllbnQoKTsKKworCQkJdHJ5IHsKKwkJCQlodHRwUmVzdENsaWVudC5kb1BPU1QodXJsLCBhdXRoSGVhZGVyLCBib2R5KTsKKworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOworCQkJCWlmIChtZXNzYWdlID09IG51bGwpIHsKKwkJCQkJbWVzc2FnZSA9IGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisJCQkJfQorCQkJCXN3aXRjaG92ZXJMb2dnZXIuZXJyb3IoIkVycm9yIG9jY3VyZWQgZHVyaW5nIHB1Ymxpc2ggbmV0d29yayByZXF1ZXN0LCBSZXN1bHQgaXMge30iLCBtZXNzYWdlKTsKKwkJCX0KKwkJfQorCisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwcml2YXRlIHZvaWQgaW5pdCgpIHsKKwkJbG9nZ2VyLmluZm8oIkVudGVyIGluaXQgbWV0aG9kIG9mIFN3aXRjaG92ZXJEZXRlY3RvciIpOworCisJCXN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFN3aXRjaG92ZXJEZXRlY3RvcigpOworCisJCWlmICghc3dpdGNob3ZlckRldGVjdG9yQ29uZmlnLmdldEVuYWJsZWQoKSkgeworCQkJbG9nZ2VyLmluZm8oInN3aXRjaG92ZXIgZGV0ZWN0b3Igc2VydmljZSBpcyBkaXNhYmxlZCIpOworCQkJcmV0dXJuOworCQl9CisKKwkJTG9uZyBkZXRlY3RvckludGVydmFsQ29uZmlnID0gc3dpdGNob3ZlckRldGVjdG9yQ29uZmlnLmdldEludGVydmFsKCk7CisJCWlmIChkZXRlY3RvckludGVydmFsQ29uZmlnICE9IG51bGwpIHsKKwkJCWRldGVjdG9ySW50ZXJ2YWwgPSBkZXRlY3RvckludGVydmFsQ29uZmlnLmxvbmdWYWx1ZSgpOworCQl9CisKKwkJSW50ZWdlciBtYXhBdHRlbXB0cyA9IHN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZy5nZXRCZVJlc29sdmVBdHRlbXB0cygpOworCQlpZiAobWF4QXR0ZW1wdHMgIT0gbnVsbCkgeworCQkJbWF4QmVRdWVyeUF0dGVtcHRzID0gbWF4QXR0ZW1wdHMuaW50VmFsdWUoKTsKKwkJfQorCQltYXhBdHRlbXB0cyA9IHN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZy5nZXRGZVJlc29sdmVBdHRlbXB0cygpOworCQlpZiAobWF4QXR0ZW1wdHMgIT0gbnVsbCkgeworCQkJbWF4RmVRdWVyeUF0dGVtcHRzID0gbWF4QXR0ZW1wdHMuaW50VmFsdWUoKTsKKwkJfQorCisJCXNldEF1dGhvcml6YXRpb25Qcm9wZXJ0aWVzKCk7CisJCWxvZ2dlci5pbmZvKCJzd2l0Y2hvdmVyIGRldGVjdG9yIHNlcnZpY2UgaXMgZW5hYmxlZCwgaW50ZXJ2YWwgaXMge30gc2Vjb25kcyIsIGRldGVjdG9ySW50ZXJ2YWwpOworCisJCXRoaXMuc3dpdGNob3ZlckRldGVjdG9yU2NoZWR1bGVkVGFzayA9IG5ldyBTd2l0Y2hvdmVyRGV0ZWN0b3JTY2hlZHVsZWRUYXNrKCk7CisJCXN0YXJ0U3dpdGNob3ZlckRldGVjdG9yVGFzaygpOworCQlsb2dnZXIudHJhY2UoIkV4aXQgaW5pdCBtZXRob2Qgb2YgU3dpdGNob3ZlckRldGVjdG9yIik7CisKKwl9CisKKwlAUHJlRGVzdHJveQorCXByaXZhdGUgdm9pZCBkZXN0cm95KCkgeworCisJCWlmIChzY2hlZHVsZWRGdXR1cmUgIT0gbnVsbCkgeworCQkJc2NoZWR1bGVkRnV0dXJlLmNhbmNlbCh0cnVlKTsKKwkJCXNjaGVkdWxlZEZ1dHVyZSA9IG51bGw7CisJCX0KKworCQlpZiAoc3dpdGNob3ZlckRldGVjdG9yU2NoZWR1bGVyICE9IG51bGwpIHsKKwkJCXN3aXRjaG92ZXJEZXRlY3RvclNjaGVkdWxlci5zaHV0ZG93bigpOworCQl9CisKKwl9CisKKwlwdWJsaWMgdm9pZCBzdGFydFN3aXRjaG92ZXJEZXRlY3RvclRhc2soKSB7CisJCWlmICh0aGlzLnNjaGVkdWxlZEZ1dHVyZSA9PSBudWxsKSB7CisJCQl0aGlzLnNjaGVkdWxlZEZ1dHVyZSA9IHRoaXMuc3dpdGNob3ZlckRldGVjdG9yU2NoZWR1bGVyLnNjaGVkdWxlQXRGaXhlZFJhdGUoc3dpdGNob3ZlckRldGVjdG9yU2NoZWR1bGVkVGFzaywgMCwgZGV0ZWN0b3JJbnRlcnZhbCwgVGltZVVuaXQuU0VDT05EUyk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9BcnRpZmFjdFR5cGVzLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvQXJ0aWZhY3RUeXBlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjQ0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvQXJ0aWZhY3RUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZ2VuZXJhdG9yLmRhdGEuQXJ0aWZhY3RUeXBlOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RUeXBlcyB7CisJcHJpdmF0ZSBMaXN0PEFydGlmYWN0VHlwZT4gYXJ0aWZhY3RUeXBlczsKKworCXB1YmxpYyBMaXN0PEFydGlmYWN0VHlwZT4gZ2V0QXJ0aWZhY3RUeXBlcygpIHsKKwkJcmV0dXJuIGFydGlmYWN0VHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RUeXBlcyhMaXN0PEFydGlmYWN0VHlwZT4gYXJ0aWZhY3RUeXBlcykgeworCQl0aGlzLmFydGlmYWN0VHlwZXMgPSBhcnRpZmFjdFR5cGVzOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9DU0FSVG9vbC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL0NTQVJUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlY2NlZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9DU0FSVG9vbC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKKworcHVibGljIGNsYXNzIENTQVJUb29sIHsKKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBjcmVhdGVDc2FyKENvbXBvbmVudCBjb21wb25lbnQpIHsKKworCQlmaW5hbCBTdHJpbmcgVE9TQ0FfTUVUQV9WRVJTSU9OID0gIjEuMCI7CisJCWZpbmFsIFN0cmluZyBDU0FSX1ZFUlNJT04gPSBjb21wb25lbnQuZ2V0Q3NhclZlcnNpb24oKTsKKwkJZmluYWwgU3RyaW5nIENSRUFURURfQlkgPSBjb21wb25lbnQuZ2V0Q3JlYXRvckZ1bGxOYW1lKCk7CisJCWZpbmFsIFN0cmluZyBFTlRSWV9ERUZJTklUSU9OUyA9IGNvbXBvbmVudC5nZXROb3JtYWxpemVkTmFtZSgpOworCisJCS8qCisJCSAqIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7IHRyeSggRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oInRlc3QuemlwIik7IFppcE91dHB1dFN0cmVhbSB6aXAgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmKSk7ICl7IH0KKwkJICovCisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVG9zY2FCbG9jazAoU3RyaW5nIG1ldGFGaWxlVmVyc2lvbiwgU3RyaW5nIGNzYXJWZXJzaW9uLCBTdHJpbmcgY3JlYXRlZEJ5LCBTdHJpbmcgZW50cnlEZWYpIHsKKwkJZmluYWwgU3RyaW5nIEJMT0NLXzBfVEVNUExBVEUgPSAiVE9TQ0EtTWV0YS1GaWxlLVZlcnNpb246ICVzIjsKKworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvQ2FwYWJpbHR5UmVxdWlyZW1lbnRDb252ZXJ0b3IuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9DYXBhYmlsdHlSZXF1aXJlbWVudENvbnZlcnRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjI1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvQ2FwYWJpbHR5UmVxdWlyZW1lbnRDb252ZXJ0b3IuamF2YQpAQCAtMCwwICsxLDI2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVxdWlyZW1lbnREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlN1YnN0aXR1dGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWwuVG9zY2FDYXBhYmlsaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlRvc2NhTm9kZVRlbXBsYXRlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlRvc2NhTm9kZVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWwuVG9zY2FQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbC5Ub3NjYVJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIENhcGFiaWx0eVJlcXVpcmVtZW50Q29udmVydG9yIHsKKwlwcml2YXRlIHN0YXRpYyBDYXBhYmlsdHlSZXF1aXJlbWVudENvbnZlcnRvciBpbnN0YW5jZTsKKworCXByb3RlY3RlZCBDYXBhYmlsdHlSZXF1aXJlbWVudENvbnZlcnRvcigpIHsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENhcGFiaWx0eVJlcXVpcmVtZW50Q29udmVydG9yIGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworCQkJaW5zdGFuY2UgPSBuZXcgQ2FwYWJpbHR5UmVxdWlyZW1lbnRDb252ZXJ0b3IoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENhcGFiaWx0eVJlcXVpcmVtZW50Q29udmVydG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgRWl0aGVyPFRvc2NhTm9kZVRlbXBsYXRlLCBUb3NjYUVycm9yPiBjb252ZXJ0Q29tcG9uZW50SW5zdGFuY2VDYXBhYmlsdGllcyhDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMsIFRvc2NhTm9kZVRlbXBsYXRlIG5vZGVUZW1wbGF0ZSkgeworCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXNJbnN0ID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWlmIChjYXBhYmlsaXRpZXNJbnN0ICE9IG51bGwgJiYgIWNhcGFiaWxpdGllc0luc3QuaXNFbXB0eSgpKSB7CisJCQlNYXA8U3RyaW5nLCBUb3NjYVRlbXBsYXRlQ2FwYWJpbGl0eT4gY2FwYWJpbHRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQljYXBhYmlsaXRpZXNJbnN0LmVudHJ5U2V0KCkuZm9yRWFjaChlIC0+IHsKKwkJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBMaXN0ID0gZS5nZXRWYWx1ZSgpOworCQkJCWlmIChjYXBMaXN0ICE9IG51bGwgJiYgIWNhcExpc3QuaXNFbXB0eSgpKSB7CisJCQkJCWNhcExpc3QuZm9yRWFjaChjIC0+IHsKKwkJCQkJCWNvbnZlcnRPdmVycmlkZW5Qcm9wZXJ0aWVzKGNvbXBvbmVudEluc3RhbmNlLCBkYXRhVHlwZXMsIGNhcGFiaWx0aWVzLCBjKTsKKwkJCQkJfSk7CisJCQkJfQorCQkJfSk7CisJCQlpZiAoY2FwYWJpbHRpZXMgIT0gbnVsbCAmJiAhY2FwYWJpbHRpZXMuaXNFbXB0eSgpKSB7CisJCQkJbm9kZVRlbXBsYXRlLnNldENhcGFiaWxpdGllcyhjYXBhYmlsdGllcyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG5vZGVUZW1wbGF0ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbnZlcnRPdmVycmlkZW5Qcm9wZXJ0aWVzKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcywgTWFwPFN0cmluZywgVG9zY2FUZW1wbGF0ZUNhcGFiaWxpdHk+IGNhcGFiaWx0aWVzLCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjKSB7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllcyA9IGMuZ2V0UHJvcGVydGllcygpOworCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgeworCQkJcHJvcGVydGllcy5zdHJlYW0oKS5maWx0ZXIocCAtPiAocC5nZXRWYWx1ZVVuaXF1ZVVpZCgpICE9IG51bGwpKS5mb3JFYWNoKHAgLT4geworCQkJCWNvbnZlcnRPdmVycmlkZW5Qcm9wZXJ0eShjb21wb25lbnRJbnN0YW5jZSwgZGF0YVR5cGVzLCBjYXBhYmlsdGllcywgYywgcCk7CisJCQl9KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb252ZXJ0T3ZlcnJpZGVuUHJvcGVydHkoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzLCBNYXA8U3RyaW5nLCBUb3NjYVRlbXBsYXRlQ2FwYWJpbGl0eT4gY2FwYWJpbHRpZXMsIENhcGFiaWxpdHlEZWZpbml0aW9uIGMsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcCkgeworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCWxvZy5kZWJ1ZygiRXhpc3Qgb3ZlcnJpZGVuIHByb3BlcnR5IHt9IGZvciBjYXBhYml0eSB7fSB3aXRoIHZhbHVlIHt9IiwgcC5nZXROYW1lKCksIGMuZ2V0TmFtZSgpLCBwLmdldFZhbHVlKCkpOworCQl9CisJCVRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5IHRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5ID0gY2FwYWJpbHRpZXMuZ2V0KGMuZ2V0TmFtZSgpKTsKKwkJaWYgKHRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5ID09IG51bGwpIHsKKwkJCXRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5ID0gbmV3IFRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5KCk7CisJCQljYXBhYmlsdGllcy5wdXQoYy5nZXROYW1lKCksIHRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5KTsKKwkJfQorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhQ2FwUHJvcCA9IHRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5LmdldFByb3BlcnRpZXMoKTsKKwkJaWYgKHRvc2NhQ2FwUHJvcCA9PSBudWxsKSB7CisJCQl0b3NjYUNhcFByb3AgPSBuZXcgSGFzaE1hcDw+KCk7CisJCX0KKwkJT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gY29udmVydEluc3RhbmNlUHJvcGVydHkoZGF0YVR5cGVzLCBjb21wb25lbnRJbnN0YW5jZSwgcCk7CisJCXRvc2NhQ2FwUHJvcC5wdXQocC5nZXROYW1lKCksIGNvbnZlcnRlZFZhbHVlKTsKKwkJdG9zY2FUZW1wbGF0ZUNhcGFiaWxpdHkuc2V0UHJvcGVydGllcyh0b3NjYUNhcFByb3ApOworCX0KKworCXByaXZhdGUgT2JqZWN0IGNvbnZlcnRJbnN0YW5jZVByb3BlcnR5KE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzLCBDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wKSB7CisJCWxvZy5kZWJ1ZygiQ29udmVydCBwcm9wZXJ0eSB7fSBmb3IgaW5zdGFuY2Uge30iLCBwcm9wLmdldE5hbWUoKSwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wLmdldFR5cGUoKTsKKwkJU3RyaW5nIGlubmVyVHlwZSA9IG51bGw7CisJCWlmIChwcm9wLmdldFNjaGVtYSgpICE9IG51bGwgJiYgcHJvcC5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpICE9IG51bGwpIHsKKwkJCWlubmVyVHlwZSA9IHByb3AuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCk7CisJCX0KKwkJT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gUHJvcGVydHlDb252ZXJ0b3IuZ2V0SW5zdGFuY2UoKS5jb252ZXJ0VG9Ub3NjYU9iamVjdChwcm9wZXJ0eVR5cGUsIHByb3AuZ2V0VmFsdWUoKSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQlyZXR1cm4gY29udmVydGVkVmFsdWU7CisJfQorCisJcHVibGljIEVpdGhlcjxUb3NjYU5vZGVUeXBlLCBUb3NjYUVycm9yPiBjb252ZXJ0UmVxdWlyZW1lbnRzKENvbXBvbmVudCBjb21wb25lbnQsIFRvc2NhTm9kZVR5cGUgbm9kZVR5cGUpIHsKKwkJTGlzdDxNYXA8U3RyaW5nLCBUb3NjYVJlcXVpcmVtZW50Pj4gdG9zY2FSZXF1aXJlbWVudHMgPSBjb252ZXJ0UmVxdWlyZW1lbnRzQXNMaXN0KGNvbXBvbmVudCk7CisJCWlmICghdG9zY2FSZXF1aXJlbWVudHMuaXNFbXB0eSgpKSB7CisJCQlub2RlVHlwZS5zZXRSZXF1aXJlbWVudHModG9zY2FSZXF1aXJlbWVudHMpOworCQl9CisJCWxvZy5kZWJ1ZygiRmluaXNoIGNvbnZlcnQgUmVxdWlyZW1lbnRzIGZvciBub2RlIHR5cGUiKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQobm9kZVR5cGUpOworCX0KKworCXB1YmxpYyBFaXRoZXI8U3Vic3RpdHV0aW9uTWFwcGluZywgVG9zY2FFcnJvcj4gY29udmVydFJlcXVpcmVtZW50cyhDb21wb25lbnQgY29tcG9uZW50LCBTdWJzdGl0dXRpb25NYXBwaW5nIHN1YnN0aXR1dGlvbk1hcHBpbmcpIHsKKwkJTWFwPFN0cmluZywgVG9zY2FSZXF1aXJlbWVudD4gdG9zY2FSZXF1aXJlbWVudHMgPSBjb252ZXJ0UmVxdWlyZW1lbnRzQXNNYXAoY29tcG9uZW50KTsKKwkJaWYgKCF0b3NjYVJlcXVpcmVtZW50cy5pc0VtcHR5KCkpIHsKKwkJCXN1YnN0aXR1dGlvbk1hcHBpbmcuc2V0UmVxdWlyZW1lbnRzKHRvc2NhUmVxdWlyZW1lbnRzKTsKKwkJfQorCQlsb2cuZGVidWcoIkZpbmlzaCBjb252ZXJ0IFJlcXVpcmVtZW50cyBmb3Igbm9kZSB0eXBlIik7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHN1YnN0aXR1dGlvbk1hcHBpbmcpOworCX0KKworCXByaXZhdGUgTGlzdDxNYXA8U3RyaW5nLCBUb3NjYVJlcXVpcmVtZW50Pj4gY29udmVydFJlcXVpcmVtZW50c0FzTGlzdChDb21wb25lbnQgY29tcG9uZW50KSB7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzID0gY29tcG9uZW50LmdldFJlcXVpcmVtZW50cygpOworCQlMaXN0PE1hcDxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+PiB0b3NjYVJlcXVpcmVtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAocmVxdWlyZW1lbnRzICE9IG51bGwpIHsKKwkJCWJvb2xlYW4gaXNOb2RlVHlwZSA9IFRvc2NhVXRpbHMuaXNOb2RlVHlwZShjb21wb25lbnQpOworCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IGVudHJ5IDogcmVxdWlyZW1lbnRzLmVudHJ5U2V0KCkpIHsKKwkJCQllbnRyeS5nZXRWYWx1ZSgpLnN0cmVhbSgpLmZpbHRlcihyIC0+ICghaXNOb2RlVHlwZSB8fCAoaXNOb2RlVHlwZSAmJiBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoci5nZXRPd25lcklkKCkpKSkpLmZvckVhY2gociAtPiB7CisJCQkJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBUb3NjYVJlcXVpcmVtZW50PiBwYWlyID0gY29udmVydFJlcXVpcmVtZW50KGNvbXBvbmVudCwgaXNOb2RlVHlwZSwgcik7CisJCQkJCU1hcDxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+IHJlcXVpcmVtZW50ID0gbmV3IEhhc2hNYXA8PigpOworCisJCQkJCXJlcXVpcmVtZW50LnB1dChwYWlyLmxlZnQsIHBhaXIucmlnaHQpOworCQkJCQl0b3NjYVJlcXVpcmVtZW50cy5hZGQocmVxdWlyZW1lbnQpOworCQkJCX0pOworCisJCQkJbG9nLmRlYnVnKCJGaW5pc2ggY29udmVydCBSZXF1aXJlbWVudHMgZm9yIG5vZGUgdHlwZSIpOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJObyBSZXF1aXJlbWVudHMgZm9yIG5vZGUgdHlwZSIpOworCQl9CisJCXJldHVybiB0b3NjYVJlcXVpcmVtZW50czsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+IGNvbnZlcnRSZXF1aXJlbWVudHNBc01hcChDb21wb25lbnQgY29tcG9uZW50KSB7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzID0gY29tcG9uZW50LmdldFJlcXVpcmVtZW50cygpOworCQlNYXA8U3RyaW5nLCBUb3NjYVJlcXVpcmVtZW50PiB0b3NjYVJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJaWYgKHJlcXVpcmVtZW50cyAhPSBudWxsKSB7CisJCQlib29sZWFuIGlzTm9kZVR5cGUgPSBUb3NjYVV0aWxzLmlzTm9kZVR5cGUoY29tcG9uZW50KTsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBlbnRyeSA6IHJlcXVpcmVtZW50cy5lbnRyeVNldCgpKSB7CisJCQkJZW50cnkuZ2V0VmFsdWUoKS5zdHJlYW0oKS5maWx0ZXIociAtPiAoIWlzTm9kZVR5cGUgfHwgKGlzTm9kZVR5cGUgJiYgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkuZXF1YWxzKHIuZ2V0T3duZXJJZCgpKSkpKS5mb3JFYWNoKHIgLT4geworCQkJCQlJbW11dGFibGVQYWlyPFN0cmluZywgVG9zY2FSZXF1aXJlbWVudD4gcGFpciA9IGNvbnZlcnRSZXF1aXJlbWVudChjb21wb25lbnQsIGlzTm9kZVR5cGUsIHIpOworCQkJCQl0b3NjYVJlcXVpcmVtZW50cy5wdXQocGFpci5sZWZ0LCBwYWlyLnJpZ2h0KTsKKwkJCQl9KTsKKworCQkJCWxvZy5kZWJ1ZygiRmluaXNoIGNvbnZlcnQgUmVxdWlyZW1lbnRzIGZvciBub2RlIHR5cGUiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiTm8gUmVxdWlyZW1lbnRzIGZvciBub2RlIHR5cGUiKTsKKwkJfQorCQlyZXR1cm4gdG9zY2FSZXF1aXJlbWVudHM7CisJfQorCisJcHJpdmF0ZSBJbW11dGFibGVQYWlyPFN0cmluZywgVG9zY2FSZXF1aXJlbWVudD4gY29udmVydFJlcXVpcmVtZW50KENvbXBvbmVudCBjb21wb25lbnQsIGJvb2xlYW4gaXNOb2RlVHlwZSwgUmVxdWlyZW1lbnREZWZpbml0aW9uIHIpIHsKKwkJU3RyaW5nIG5hbWUgPSByLmdldE5hbWUoKTsKKwkJaWYgKCFpc05vZGVUeXBlKSB7CisJCQluYW1lID0gci5nZXRPd25lck5hbWUoKSArICIuIiArIG5hbWU7CisJCX0KKwkJbG9nLmRlYnVnKCJ0aGUgcmVxdWlyZW1lbnQge30gYmVsb25ncyB0byByZXNvdXJjZSB7fSAiLCBuYW1lLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCVRvc2NhUmVxdWlyZW1lbnQgdG9zY2FSZXF1aXJlbWVudCA9IG5ldyBUb3NjYVJlcXVpcmVtZW50KCk7CisKKwkJTGlzdDxPYmplY3Q+IG9jY3VyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJb2NjdXJlbmNlcy5hZGQoSW50ZWdlci52YWx1ZU9mKHIuZ2V0TWluT2NjdXJyZW5jZXMoKSkpOworCQlpZiAoci5nZXRNYXhPY2N1cnJlbmNlcygpLmVxdWFscyhSZXF1aXJlbWVudERhdGEuTUFYX09DQ1VSUkVOQ0VTKSkgeworCQkJb2NjdXJlbmNlcy5hZGQoci5nZXRNYXhPY2N1cnJlbmNlcygpKTsKKwkJfSBlbHNlIHsKKwkJCW9jY3VyZW5jZXMuYWRkKEludGVnZXIudmFsdWVPZihyLmdldE1heE9jY3VycmVuY2VzKCkpKTsKKwkJfQorCQl0b3NjYVJlcXVpcmVtZW50LnNldE9jY3VycmVuY2VzKG9jY3VyZW5jZXMpOworCQkvLyB0b3NjYVJlcXVpcmVtZW50LnNldE9jY3VycmVuY2VzKGNyZWF0ZU9jdXJyZW5jZXNSYW5nZShyZXF1aXJlbWVudERlZmluaXRpb24uZ2V0TWluT2NjdXJyZW5jZXMoKSwKKwkJLy8gcmVxdWlyZW1lbnREZWZpbml0aW9uLmdldE1heE9jY3VycmVuY2VzKCkpKTsKKwkJdG9zY2FSZXF1aXJlbWVudC5zZXROb2RlKHIuZ2V0Tm9kZSgpKTsKKwkJdG9zY2FSZXF1aXJlbWVudC5zZXRDYXBhYmlsaXR5KHIuZ2V0Q2FwYWJpbGl0eSgpKTsKKwkJdG9zY2FSZXF1aXJlbWVudC5zZXRSZWxhdGlvbnNoaXAoci5nZXRSZWxhdGlvbnNoaXAoKSk7CisKKwkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+IHBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+KG5hbWUsIHRvc2NhUmVxdWlyZW1lbnQpOworCQlyZXR1cm4gcGFpcjsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgVG9zY2FDYXBhYmlsaXR5PiBjb252ZXJ0Q2FwYWJpbGl0aWVzKENvbXBvbmVudCBjb21wb25lbnQsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXMgPSBjb21wb25lbnQuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCU1hcDxTdHJpbmcsIFRvc2NhQ2FwYWJpbGl0eT4gdG9zY2FDYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCkgeworCQkJYm9vbGVhbiBpc05vZGVUeXBlID0gVG9zY2FVdGlscy5pc05vZGVUeXBlKGNvbXBvbmVudCk7CisJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBlbnRyeSA6IGNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisJCQkJZW50cnkuZ2V0VmFsdWUoKS5zdHJlYW0oKS5maWx0ZXIoYyAtPiAoIWlzTm9kZVR5cGUgfHwgKGlzTm9kZVR5cGUgJiYgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkuZXF1YWxzKGMuZ2V0T3duZXJJZCgpKSkpKS5mb3JFYWNoKGMgLT4geworCQkJCQljb252ZXJ0Q2FwYWJpbHR5KGNvbXBvbmVudCwgdG9zY2FDYXBhYmlsaXRpZXMsIGlzTm9kZVR5cGUsIGMsIGRhdGFUeXBlcyk7CisKKwkJCQl9KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiTm8gQ2FwYWJpbGl0aWVzIGZvciBub2RlIHR5cGUiKTsKKwkJfQorCisJCXJldHVybiB0b3NjYUNhcGFiaWxpdGllczsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29udmVydENhcGFiaWx0eShDb21wb25lbnQgY29tcG9uZW50LCBNYXA8U3RyaW5nLCBUb3NjYUNhcGFiaWxpdHk+IHRvc2NhQ2FwYWJpbGl0aWVzLCBib29sZWFuIGlzTm9kZVR5cGUsIENhcGFiaWxpdHlEZWZpbml0aW9uIGMsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCVN0cmluZyBuYW1lID0gYy5nZXROYW1lKCk7CisJCWlmICghaXNOb2RlVHlwZSkgeworCQkJbmFtZSA9IGMuZ2V0T3duZXJOYW1lKCkgKyAiLiIgKyBuYW1lOworCQl9CisJCWxvZy5kZWJ1ZygidGhlIGNhcGFiaWx0eSB7fSBiZWxvbmdzIHRvIHJlc291cmNlIHt9ICIsIG5hbWUsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKwkJVG9zY2FDYXBhYmlsaXR5IHRvc2NhQ2FwYWJpbGl0eSA9IG5ldyBUb3NjYUNhcGFiaWxpdHkoKTsKKwkJdG9zY2FDYXBhYmlsaXR5LnNldERlc2NyaXB0aW9uKGMuZ2V0RGVzY3JpcHRpb24oKSk7CisJCXRvc2NhQ2FwYWJpbGl0eS5zZXRUeXBlKGMuZ2V0VHlwZSgpKTsKKworCQlMaXN0PE9iamVjdD4gb2NjdXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlvY2N1cmVuY2VzLmFkZChJbnRlZ2VyLnZhbHVlT2YoYy5nZXRNaW5PY2N1cnJlbmNlcygpKSk7CisJCWlmIChjLmdldE1heE9jY3VycmVuY2VzKCkuZXF1YWxzKENhcGFiaWxpdHlEYXRhLk1BWF9PQ0NVUlJFTkNFUykpIHsKKwkJCW9jY3VyZW5jZXMuYWRkKGMuZ2V0TWF4T2NjdXJyZW5jZXMoKSk7CisJCX0gZWxzZSB7CisJCQlvY2N1cmVuY2VzLmFkZChJbnRlZ2VyLnZhbHVlT2YoYy5nZXRNYXhPY2N1cnJlbmNlcygpKSk7CisJCX0KKwkJdG9zY2FDYXBhYmlsaXR5LnNldE9jY3VycmVuY2VzKG9jY3VyZW5jZXMpOworCisJCXRvc2NhQ2FwYWJpbGl0eS5zZXRWYWxpZF9zb3VyY2VfdHlwZXMoYy5nZXRWYWxpZFNvdXJjZVR5cGVzKCkpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnRpZXMgPSBjLmdldFByb3BlcnRpZXMoKTsKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCU1hcDxTdHJpbmcsIFRvc2NhUHJvcGVydHk+IHRvc2NhUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5IDogcHJvcGVydGllcykgeworCQkJCVRvc2NhUHJvcGVydHkgdG9zY2FQcm9wZXJ0eSA9IFByb3BlcnR5Q29udmVydG9yLmdldEluc3RhbmNlKCkuY29udmVydFByb3BlcnR5KGRhdGFUeXBlcywgcHJvcGVydHksIHRydWUpOworCQkJCXRvc2NhUHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0TmFtZSgpLCB0b3NjYVByb3BlcnR5KTsKKwkJCX0KKwkJCXRvc2NhQ2FwYWJpbGl0eS5zZXRQcm9wZXJ0aWVzKHRvc2NhUHJvcGVydGllcyk7CisJCX0KKwkJdG9zY2FDYXBhYmlsaXRpZXMucHV0KG5hbWUsIHRvc2NhQ2FwYWJpbGl0eSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvQ3NhclV0aWxzLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvQ3NhclV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhYTE4OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9Dc2FyVXRpbHMuamF2YQpAQCAtMCwwICsxLDY0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuZGlnZXN0LkRpZ2VzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5UcmlwbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWMuQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlNlcnZpY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuQXJ0aWZhY3RDYXNzYW5kcmFEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5DYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuRGFvU3RhdHVzQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5TZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlRvc2NhVGVtcGxhdGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR2VuZXJhbFV0aWxpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmdlbmVyYXRvci5kYXRhLkFydGlmYWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmdlbmVyYXRvci5kYXRhLkFydGlmYWN0VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5nZW5lcmF0b3IuZGF0YS5HZW5lcmF0aW9uRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5nZW5lcmF0b3IuaW1wbC5BcnRpZmFjdEdlbmVyYXRpb25TZXJ2aWNlSW1wbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKioKKyAqIEBhdXRob3IgdGc4NTF4CisgKgorICovCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgiY3Nhci11dGlscyIpCitwdWJsaWMgY2xhc3MgQ3NhclV0aWxzIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVG9zY2FFeHBvcnRIYW5kbGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBBcnRpZmFjdENhc3NhbmRyYURhbyBhcnRpZmFjdENhc3NhbmRyYURhbzsKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFRvc2NhRXhwb3J0SGFuZGxlciB0b3NjYUV4cG9ydFV0aWxzOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIEFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzQnVzaW5lc3NMb2dpYzsKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIFNlcnZpY2VPcGVyYXRpb24gc2VydmljZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBTZXJ2aWNlQnVzaW5lc3NMb2dpYyBzZXJ2aWNlQnVzaW5lc3NMb2dpYzsKKworCXByaXZhdGUgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OU19QQVRIID0gIkRlZmluaXRpb25zLyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUU19QQVRIID0gIkFydGlmYWN0cy8iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT1NDQV9NRVRBX1BBVEhfRklMRV9OQU1FID0gIlRPU0NBLU1ldGFkYXRhL1RPU0NBLm1ldGEiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT1NDQV9NRVRBX1ZFUlNJT04gPSAiMS4wIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NBUl9WRVJTSU9OID0gIjEuMSI7CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQHBhcmFtIGdldEZyb21DUworCSAqIEBwYXJhbSBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QKKwkgKiBAcGFyYW0gc2hvdWxkTG9jaworCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Ynl0ZVtdLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ3NhcihDb21wb25lbnQgY29tcG9uZW50LCBib29sZWFuIGdldEZyb21DUywgYm9vbGVhbiBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBjcmVhdGVDc2FyKGNvbXBvbmVudCwgZ2V0RnJvbUNTLCBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIGZhbHNlLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVDc2FyKENvbXBvbmVudCBjb21wb25lbnQsIGJvb2xlYW4gZ2V0RnJvbUNTLCBib29sZWFuIGlzSW5DZXJ0aWZpY2F0aW9uUmVxdWVzdCwgYm9vbGVhbiBtb2NrR2VuZXJhdG9yLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlmaW5hbCBTdHJpbmcgQ1JFQVRFRF9CWSA9IGNvbXBvbmVudC5nZXRDcmVhdG9yRnVsbE5hbWUoKTsKKworCQlTdHJpbmcgZmlsZU5hbWU7CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gdG9zY2FBcnRpZmFjdHMgPSBjb21wb25lbnQuZ2V0VG9zY2FBcnRpZmFjdHMoKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IHRvc2NhQXJ0aWZhY3RzLmdldChUb3NjYUV4cG9ydEhhbmRsZXIuQVNTRVRfVE9TQ0FfVEVNUExBVEUpOworCQlmaWxlTmFtZSA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKTsKKworCQlTdHJpbmcgdG9zY2FCbG9jazAgPSBjcmVhdGVUb3NjYUJsb2NrMChUT1NDQV9NRVRBX1ZFUlNJT04sIENTQVJfVkVSU0lPTiwgQ1JFQVRFRF9CWSwgZmlsZU5hbWUpOworCisJCWJ5dGVbXSB0b3NjYUJsb2NrMEJ5dGUgPSB0b3NjYUJsb2NrMC5nZXRCeXRlcygpOworCisJCUVpdGhlcjxieXRlW10sIFJlc3BvbnNlRm9ybWF0PiBnZW5lcmF0ZUNzYXJaaXBSZXNwb25zZSA9IGdlbmVyYXRlQ3NhclppcCh0b3NjYUJsb2NrMEJ5dGUsIGNvbXBvbmVudCwgZ2V0RnJvbUNTLCBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIG1vY2tHZW5lcmF0b3IsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCisJCWlmIChnZW5lcmF0ZUNzYXJaaXBSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ2VuZXJhdGVDc2FyWmlwUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChnZW5lcmF0ZUNzYXJaaXBSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Ynl0ZVtdLCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdGVDc2FyWmlwKGJ5dGVbXSB0b3NjYUJsb2NrMEJ5dGUsIENvbXBvbmVudCBjb21wb25lbnQsIGJvb2xlYW4gZ2V0RnJvbUNTLCBib29sZWFuIGlzSW5DZXJ0aWZpY2F0aW9uUmVxdWVzdCwgYm9vbGVhbiBtb2NrR2VuZXJhdG9yLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCVppcE91dHB1dFN0cmVhbSB6aXAgPSBudWxsOworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXppcCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0ob3V0KTsKKworCQkJemlwLnB1dE5leHRFbnRyeShuZXcgWmlwRW50cnkoVE9TQ0FfTUVUQV9QQVRIX0ZJTEVfTkFNRSkpOworCQkJemlwLndyaXRlKHRvc2NhQmxvY2swQnl0ZSk7CisJCQlFaXRoZXI8WmlwT3V0cHV0U3RyZWFtLCBSZXNwb25zZUZvcm1hdD4gcG9wdWxhdGVaaXAgPSBwb3B1bGF0ZVppcChjb21wb25lbnQsIGdldEZyb21DUywgemlwLCBpc0luQ2VydGlmaWNhdGlvblJlcXVlc3QsIG1vY2tHZW5lcmF0b3IsIHNob3VsZExvY2ssIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHBvcHVsYXRlWmlwLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHBvcHVsYXRlIENTQVIgemlwIGZpbGUge30iLCBwb3B1bGF0ZVppcC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocG9wdWxhdGVaaXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXppcCA9IHBvcHVsYXRlWmlwLmxlZnQoKS52YWx1ZSgpOworCisJCQl6aXAuZmluaXNoKCk7CisJCQlieXRlW10gYnl0ZUFycmF5ID0gb3V0LnRvQnl0ZUFycmF5KCk7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChieXRlQXJyYXkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImNyZWF0ZUNzYXIgZmFpbGVkIElPZXhjZXB0aW9uIiwgZSk7CisKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlpZiAoemlwICE9IG51bGwpIHsKKwkJCQkJemlwLmNsb3NlKCk7CisJCQkJfQorCQkJCWlmIChvdXQgIT0gbnVsbCkgeworCQkJCQlvdXQuY2xvc2UoKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNsb3NlIHJlc291cmNlcyAiLCBlKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPFppcE91dHB1dFN0cmVhbSwgUmVzcG9uc2VGb3JtYXQ+IHBvcHVsYXRlWmlwKENvbXBvbmVudCBjb21wb25lbnQsIGJvb2xlYW4gZ2V0RnJvbUNTLCBaaXBPdXRwdXRTdHJlYW0gemlwLCBib29sZWFuIGlzSW5DZXJ0aWZpY2F0aW9uUmVxdWVzdCwgYm9vbGVhbiBtb2NrR2VuZXJhdG9yLCBib29sZWFuIHNob3VsZExvY2ssIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUxpZmVjeWNsZVN0YXRlRW51bSBsaWZlY3ljbGVTdGF0ZSA9IGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpOworCQlTdHJpbmcgY29tcG9uZW50WWFtbCA9IG51bGw7CisJCUVpdGhlcjxUb3NjYVJlcHJlc2VudGF0aW9uLCBUb3NjYUVycm9yPiBleHBvcnRDb21wb25lbnQgPSBudWxsOworCQlieXRlW10gbWFpbllhbWwgPSBudWxsOworCQkvLyA8ZmlsZSBuYW1lLCBlc2lkLCBjb21wb25lbnQ+CisJCUxpc3Q8VHJpcGxlPFN0cmluZywgU3RyaW5nLCBDb21wb25lbnQ+PiBkZXBlbmRlbmNpZXMgPSBudWxsOworCQlMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBieXRlW10+PiBnZW5lcmF0b3JJbnB1dHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKwkJU3RyaW5nIGZpbGVOYW1lOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IHRvc2NhQXJ0aWZhY3RzID0gY29tcG9uZW50LmdldFRvc2NhQXJ0aWZhY3RzKCk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSB0b3NjYUFydGlmYWN0cy5nZXQoVG9zY2FFeHBvcnRIYW5kbGVyLkFTU0VUX1RPU0NBX1RFTVBMQVRFKTsKKwkJZmlsZU5hbWUgPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCk7CisKKwkJaWYgKGdldEZyb21DUyB8fCAhKGxpZmVjeWNsZVN0YXRlID09IExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4gfHwgbGlmZWN5Y2xlU3RhdGUgPT0gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpKSB7CisJCQlTdHJpbmcgZXNJZCA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCk7CisJCQlFaXRoZXI8Ynl0ZVtdLCBBY3Rpb25TdGF0dXM+IGZyb21DYXNzYW5kcmEgPSBnZXRGcm9tQ2Fzc2FuZHJhKGVzSWQpOworCQkJaWYgKGZyb21DYXNzYW5kcmEuaXNSaWdodCgpKSB7CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoZnJvbUNhc3NhbmRyYS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJbWFpbllhbWwgPSBmcm9tQ2Fzc2FuZHJhLmxlZnQoKS52YWx1ZSgpOworCisJCX0gZWxzZSB7CisJCQlleHBvcnRDb21wb25lbnQgPSB0b3NjYUV4cG9ydFV0aWxzLmV4cG9ydENvbXBvbmVudChjb21wb25lbnQpOworCQkJaWYgKGV4cG9ydENvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImV4cG9ydENvbXBvbmVudCBmYWlsZWQiLCBleHBvcnRDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlBY3Rpb25TdGF0dXMgY29udmVydGVkRnJvbVRvc2NhRXJyb3IgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21Ub3NjYUVycm9yKGV4cG9ydENvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbnZlcnRlZEZyb21Ub3NjYUVycm9yKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJCVRvc2NhUmVwcmVzZW50YXRpb24gZXhwb3J0UmVzdWx0ID0gZXhwb3J0Q29tcG9uZW50LmxlZnQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50WWFtbCA9IGV4cG9ydFJlc3VsdC5nZXRNYWluWWFtbCgpOworCQkJbWFpbllhbWwgPSBjb21wb25lbnRZYW1sLmdldEJ5dGVzKCk7CisJCQlkZXBlbmRlbmNpZXMgPSBleHBvcnRSZXN1bHQuZ2V0RGVwZW5kZW5jaWVzKCk7CisJCX0KKworCQl0cnkgeworCQkJemlwLnB1dE5leHRFbnRyeShuZXcgWmlwRW50cnkoREVGSU5JVElPTlNfUEFUSCArIGZpbGVOYW1lKSk7CisJCQl6aXAud3JpdGUobWFpbllhbWwpOworCisJCQlnZW5lcmF0b3JJbnB1dHMuYWRkKG5ldyBJbW11dGFibGVQYWlyPENvbXBvbmVudCwgYnl0ZVtdPihjb21wb25lbnQsIG1haW5ZYW1sKSk7CisKKwkJCWlmIChkZXBlbmRlbmNpZXMgPT0gbnVsbCkgeworCQkJCUVpdGhlcjxUb3NjYVRlbXBsYXRlLCBUb3NjYUVycm9yPiBkZXBlbmRlbmNpZXNSZXMgPSB0b3NjYUV4cG9ydFV0aWxzLmdldERlcGVuZGVuY2llcyhjb21wb25lbnQpOworCQkJCWlmIChkZXBlbmRlbmNpZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGRlcGVuZGVuY2llcyBmb3IgY29tcG9uZW50IHt9LCBlcnJvciB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBkZXBlbmRlbmNpZXNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJQWN0aW9uU3RhdHVzIGNvbnZlcnRGcm9tVG9zY2FFcnJvciA9IGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVRvc2NhRXJyb3IoZGVwZW5kZW5jaWVzUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbnZlcnRGcm9tVG9zY2FFcnJvcik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJCX0KKwkJCQlkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXNSZXMubGVmdCgpLnZhbHVlKCkuZ2V0RGVwZW5kZW5jaWVzKCk7CisJCQl9CisJCQlpZiAoZGVwZW5kZW5jaWVzICE9IG51bGwgJiYgIWRlcGVuZGVuY2llcy5pc0VtcHR5KCkpIHsKKwkJCQlmb3IgKFRyaXBsZTxTdHJpbmcsIFN0cmluZywgQ29tcG9uZW50PiBkIDogZGVwZW5kZW5jaWVzKSB7CisJCQkJCVN0cmluZyBlc0lkID0gZC5nZXRNaWRkbGUoKTsKKwkJCQkJQ29tcG9uZW50IGNoaWxkQ29tcG9uZW50ID0gZC5nZXRSaWdodCgpOworCQkJCQlmaWxlTmFtZSA9IGQuZ2V0TGVmdCgpOworCQkJCQlFaXRoZXI8Ynl0ZVtdLCBBY3Rpb25TdGF0dXM+IGVudHJ5RGF0YSA9IGdldEVudHJ5RGF0YShlc0lkLCBjaGlsZENvbXBvbmVudCk7CisKKwkJCQkJaWYgKGVudHJ5RGF0YS5pc1JpZ2h0KCkpIHsKKwkJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGVudHJ5RGF0YS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQkJCX0KKworCQkJCQlieXRlW10gY29udGVudCA9IGVudHJ5RGF0YS5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJemlwLnB1dE5leHRFbnRyeShuZXcgWmlwRW50cnkoREVGSU5JVElPTlNfUEFUSCArIGZpbGVOYW1lKSk7CisJCQkJCXppcC53cml0ZShjb250ZW50KTsKKworCQkJCQlnZW5lcmF0b3JJbnB1dHMuYWRkKG5ldyBJbW11dGFibGVQYWlyPENvbXBvbmVudCwgYnl0ZVtdPihjaGlsZENvbXBvbmVudCwgY29udGVudCkpOworCQkJCX0KKwkJCX0KKworCQkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFpaUFydGlmYWN0TGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKwkJCS8vIEFydGlmYWN0IEdlbmVyYXRpb24KKwkJCWlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpID09IENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UgJiYgKGxpZmVjeWNsZVN0YXRlID09IExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4gfHwgbGlmZWN5Y2xlU3RhdGUgPT0gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpKSB7CisJCQkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZUFBSUFydGlmYWN0cyA9IGhhbmRsZUFBSUFydGlmYWN0cyhjb21wb25lbnQsIHppcCwgbW9ja0dlbmVyYXRvciwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbiwgZ2VuZXJhdG9ySW5wdXRzKTsKKworCQkJCWlmIChoYW5kbGVBQUlBcnRpZmFjdHMuaXNMZWZ0KCkpIHsKKwkJCQkJYWlpQXJ0aWZhY3RMaXN0ID0gaGFuZGxlQUFJQXJ0aWZhY3RzLmxlZnQoKS52YWx1ZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiQUFJIEFydGlmYWN0cyBoYW5kbGluZyBmYWlsZWQiKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChoYW5kbGVBQUlBcnRpZmFjdHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisKKwkJCQlpZiAoaXNJbkNlcnRpZmljYXRpb25SZXF1ZXN0KSB7CisJCQkJCUVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVBbGxBQUlBcnRpZmFjdHNJbkRhdGFNb2RlbCA9IGhhbmRsZUFsbEFBSUFydGlmYWN0c0luRGF0YU1vZGVsKGNvbXBvbmVudCwgYWlpQXJ0aWZhY3RMaXN0LCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKworCQkJCQlpZiAoaGFuZGxlQWxsQUFJQXJ0aWZhY3RzSW5EYXRhTW9kZWwuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZGVidWcoIkFBSSBBcnRpZmFjdHMgaGFuZGxpbmcgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpIGZhaWxlZCIpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChoYW5kbGVBbGxBQUlBcnRpZmFjdHNJbkRhdGFNb2RlbC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJfQorCisJCQl9CisKKwkJCS8vIENvbGxlY3RpbmcgQWxsIERlcGxveW1lbnQgQXJ0aWZhY3RzCisJCQlFaXRoZXI8WmlwT3V0cHV0U3RyZWFtLCBBY3Rpb25TdGF0dXM+IGNvbGxlY3RBbmRXcml0ZVRvU2NhckRlcGxveW1lbnRBcnRpZmFjdHMgPSBjb2xsZWN0QW5kV3JpdGVUb1NjYXJEZXBsb3ltZW50QXJ0aWZhY3RzKHppcCwgY29tcG9uZW50LCBhaWlBcnRpZmFjdExpc3QpOworCisJCQlpZiAoY29sbGVjdEFuZFdyaXRlVG9TY2FyRGVwbG95bWVudEFydGlmYWN0cy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgQ1NBUiB6aXAgZm9yIGNvbXBvbmVudCB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBlKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdCh6aXApOworCX0KKworCXByaXZhdGUgRWl0aGVyPFppcE91dHB1dFN0cmVhbSwgQWN0aW9uU3RhdHVzPiBjb2xsZWN0QW5kV3JpdGVUb1NjYXJEZXBsb3ltZW50QXJ0aWZhY3RzKFppcE91dHB1dFN0cmVhbSB6aXAsIENvbXBvbmVudCBjb21wb25lbnQsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhaWlBcnRpZmFjdExpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJQ29sbGVjdGlvbjxBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHNUb0FkZCA9IG51bGw7CisJCUNvbGxlY3Rpb248QXJ0aWZhY3REZWZpbml0aW9uPiBhbGxBcnRpZmFjdHNUb0FkZCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworCQlpZiAoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSB7CisJCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZVJlc3BvbnNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKworCQkJaWYgKGdldFNlcnZpY2VSZXNwb25zZS5pc0xlZnQoKSkgeworCQkJCVNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2VSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCWlmICghYWlpQXJ0aWZhY3RMaXN0LmlzRW1wdHkoKSkgeworCQkJCQlkZXBsb3ltZW50QXJ0aWZhY3RzVG9BZGQgPSBzZXJ2aWNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIoZSAtPiBlLmdldEdlbmVyYXRlZCgpID09IG51bGwgfHwgIWUuZ2V0R2VuZXJhdGVkKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkJCWFsbEFydGlmYWN0c1RvQWRkLmFkZEFsbChhaWlBcnRpZmFjdExpc3QpOworCQkJCQlhbGxBcnRpZmFjdHNUb0FkZC5hZGRBbGwoZGVwbG95bWVudEFydGlmYWN0c1RvQWRkKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhbGxBcnRpZmFjdHNUb0FkZC5hZGRBbGwoc2VydmljZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkudmFsdWVzKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghYWxsQXJ0aWZhY3RzVG9BZGQuaXNFbXB0eSgpKSB7CisKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGRlcGxveW1lbnRBcnRpZmFjdERlZmluaXRpb24gOiBhbGxBcnRpZmFjdHNUb0FkZCkgeworCQkJCVN0cmluZyBhcnRpZmFjdEZpbGVOYW1lID0gZGVwbG95bWVudEFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdE5hbWUoKTsKKwkJCQlieXRlW10gcGF5bG9hZERhdGEgPSBkZXBsb3ltZW50QXJ0aWZhY3REZWZpbml0aW9uLmdldFBheWxvYWREYXRhKCk7CisKKwkJCQlpZiAocGF5bG9hZERhdGEgPT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZXNJZCA9IGRlcGxveW1lbnRBcnRpZmFjdERlZmluaXRpb24uZ2V0RXNJZCgpOworCQkJCQlpZiAoZXNJZCAhPSBudWxsKSB7CisJCQkJCQlFaXRoZXI8Ynl0ZVtdLCBBY3Rpb25TdGF0dXM+IGZyb21DYXNzYW5kcmEgPSBnZXRGcm9tQ2Fzc2FuZHJhKGVzSWQpOworCisJCQkJCQlpZiAoZnJvbUNhc3NhbmRyYS5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZyb21DYXNzYW5kcmEucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCX0KKwkJCQkJCXBheWxvYWREYXRhID0gZnJvbUNhc3NhbmRyYS5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxvZy5kZWJ1ZygiQXJ0aWZhY3Qge30gcGF5bG9hZCBub3Qgc3VwcGxpZWQgaW4gQXJ0aWZhY3REZWZpbml0aW9uIGFuZCBub3QgZm91bmQgaW4gREIiLCBhcnRpZmFjdEZpbGVOYW1lKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCisJCQkJYnl0ZVtdIGRlY29kZWRQYXlsb2FkID0gbnVsbDsKKworCQkJCWlmIChCYXNlNjQuaXNCYXNlNjQocGF5bG9hZERhdGEpKSB7CisJCQkJCS8vIGRlY29kZWRQYXlsb2FkID0gQmFzZTY0LmdldERlY29kZXIoKS5kZWNvZGUocGF5bG9hZERhdGEpOworCQkJCQlkZWNvZGVkUGF5bG9hZCA9IEJhc2U2NC5kZWNvZGVCYXNlNjQocGF5bG9hZERhdGEpOworCQkJCX0gZWxzZSB7CisJCQkJCWRlY29kZWRQYXlsb2FkID0gcGF5bG9hZERhdGE7CisJCQkJfQorCisJCQkJemlwLnB1dE5leHRFbnRyeShuZXcgWmlwRW50cnkoQVJUSUZBQ1RTX1BBVEggKyBhcnRpZmFjdEZpbGVOYW1lKSk7CisJCQkJemlwLndyaXRlKGRlY29kZWRQYXlsb2FkKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdCh6aXApOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZUFBSUFydGlmYWN0cyhDb21wb25lbnQgY29tcG9uZW50LCBaaXBPdXRwdXRTdHJlYW0gemlwLCBib29sZWFuIG1vY2tHZW5lcmF0b3IsIGJvb2xlYW4gc2hvdWxkTG9jaywgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBieXRlW10+PiBnZW5lcmF0b3JJbnB1dHMpIHsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJTGlzdDxBcnRpZmFjdD4gZ2VuZXJhdGVkQXJ0aWZhY3RzID0gbnVsbDsKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFhaUFydGlmYWN0cyA9IG51bGw7CisKKwkJaWYgKGNvbXBvbmVudFR5cGUgPT0gQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSAmJiAhZ2VuZXJhdG9ySW5wdXRzLmlzRW1wdHkoKSkgeworCQkJTGlzdDxBcnRpZmFjdD4gY29udmVydGVkR2VuZXJhdG9ySW5wdXRzID0gY29udmVydFRvR2VuZXJhdG9yQXJ0aWZhY3RzSW5wdXQoZ2VuZXJhdG9ySW5wdXRzKTsKKworCQkJRWl0aGVyPExpc3Q8QXJ0aWZhY3Q+LCBSZXNwb25zZUZvcm1hdD4gZ2VuZXJhdG9yUmVzcG9uc2U7CisKKwkJCWlmIChtb2NrR2VuZXJhdG9yKSB7CisJCQkJZ2VuZXJhdG9yUmVzcG9uc2UgPSBhcnRpZmFjdEdlbmVyYXRvcihjb252ZXJ0ZWRHZW5lcmF0b3JJbnB1dHMsIEFydGlmYWN0VHlwZS5PVEhFUiwgY29tcG9uZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJZ2VuZXJhdG9yUmVzcG9uc2UgPSBhcnRpZmFjdEdlbmVyYXRvcihjb252ZXJ0ZWRHZW5lcmF0b3JJbnB1dHMsIEFydGlmYWN0VHlwZS5BQUksIGNvbXBvbmVudCk7CisJCQl9CisKKwkJCWlmIChnZW5lcmF0b3JSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQUFJX0FSVElGQUNUX0dFTkVSQVRJT05fRkFJTEVELCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZhbHVlKCksIGNvbXBvbmVudC5nZXROYW1lKCksIGdlbmVyYXRvclJlc3BvbnNlLnRvU3RyaW5nKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCisJCQlnZW5lcmF0ZWRBcnRpZmFjdHMgPSBnZW5lcmF0b3JSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJYWFpQXJ0aWZhY3RzID0gY29udmVydFRvQXJ0aWZhY3REZWZpbml0aW9uRnJvbUFydGlmYWN0R2VuZXJhdGVkRGF0YShnZW5lcmF0ZWRBcnRpZmFjdHMpOworCisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoYWFpQXJ0aWZhY3RzKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBoYW5kbGVBbGxBQUlBcnRpZmFjdHNJbkRhdGFNb2RlbChDb21wb25lbnQgY29tcG9uZW50LCBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzRnJvbUFBSSwgYm9vbGVhbiBzaG91bGRMb2NrLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8QWN0aW9uU3RhdHVzLCBSZXNwb25zZUZvcm1hdD4gaGFuZGxlQUFJQXJ0aWZhY3RzUmVzcG9uc2UgPSBudWxsOworCQlVc2VyIGxhc3RDb21wb25lbnRVcGRhdGVyID0gbnVsbDsKKworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYWFpQXJ0aWZhdGNzVG9DcmVhdGUgPSBnZXRBQUlBcnRpZmF0Y3NGb3JDcmVhdGUoYXJ0aWZhY3RzRnJvbUFBSSwgY29tcG9uZW50KTsKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFhaUFydGlmYXRjc1RvRGVsZXRlID0gZ2V0QUFJQXJ0aWZhdGNzRm9yRGVsZXRlKGFydGlmYWN0c0Zyb21BQUksIGNvbXBvbmVudCk7CisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhYWlBcnRpZmF0Y3NUb1VwZGF0ZSA9IGdldEFBSUFydGlmYXRjc0ZvclVwZGF0ZShhcnRpZmFjdHNGcm9tQUFJLCBjb21wb25lbnQpOworCisJCVN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCA9IGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlVXNlckV4aXN0cyA9IGFydGlmYWN0c0J1c2luZXNzTG9naWMudmFsaWRhdGVVc2VyRXhpc3RzKGxhc3RVcGRhdGVyVXNlcklkLCAiQ1NBUiBjcmVhdGlvbiB1dGlsIiwgdHJ1ZSk7CisKKwkJaWYgKHZhbGlkYXRlVXNlckV4aXN0cy5pc1JpZ2h0KCkpIHsKKwkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BQUlfQVJUSUZBQ1RfR0VORVJBVElPTl9GQUlMRUQsIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkuZ2V0VmFsdWUoKSwgY29tcG9uZW50LmdldE5hbWUoKSwgIlVzZXIgbm90IGZvdW5kIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCWxhc3RDb21wb25lbnRVcGRhdGVyID0gdmFsaWRhdGVVc2VyRXhpc3RzLmxlZnQoKS52YWx1ZSgpOworCisJCWhhbmRsZUFBSUFydGlmYWN0c1Jlc3BvbnNlID0gaGFuZGxlQUFJQXJ0aWZhY3RzSW5EYXRhTW9kZWxCeU9wZXJhdGlvblR5cGUoY29tcG9uZW50LCBhYWlBcnRpZmF0Y3NUb0RlbGV0ZSwgQXJ0aWZhY3RPcGVyYXRpb24uRGVsZXRlLCBsYXN0Q29tcG9uZW50VXBkYXRlciwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKGhhbmRsZUFBSUFydGlmYWN0c1Jlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGhhbmRsZUFBSUFydGlmYWN0c1Jlc3BvbnNlOworCQl9CisKKwkJaGFuZGxlQUFJQXJ0aWZhY3RzUmVzcG9uc2UgPSBoYW5kbGVBQUlBcnRpZmFjdHNJbkRhdGFNb2RlbEJ5T3BlcmF0aW9uVHlwZShjb21wb25lbnQsIGFhaUFydGlmYXRjc1RvQ3JlYXRlLCBBcnRpZmFjdE9wZXJhdGlvbi5DcmVhdGUsIGxhc3RDb21wb25lbnRVcGRhdGVyLCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKworCQlpZiAoaGFuZGxlQUFJQXJ0aWZhY3RzUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gaGFuZGxlQUFJQXJ0aWZhY3RzUmVzcG9uc2U7CisJCX0KKworCQlyZXR1cm4gaGFuZGxlQUFJQXJ0aWZhY3RzSW5EYXRhTW9kZWxCeU9wZXJhdGlvblR5cGUoY29tcG9uZW50LCBhYWlBcnRpZmF0Y3NUb1VwZGF0ZSwgQXJ0aWZhY3RPcGVyYXRpb24uVXBkYXRlLCBsYXN0Q29tcG9uZW50VXBkYXRlciwgc2hvdWxkTG9jaywgaW5UcmFuc2FjdGlvbik7CisJfQorCisJcHJpdmF0ZSBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gZ2V0QUFJQXJ0aWZhdGNzRm9yVXBkYXRlKExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHNGcm9tQUFJLCBDb21wb25lbnQgY29tcG9uZW50KSB7CisKKwkJU2V0PFN0cmluZz4gY29tcG9uZXREZXBsb3ltZW50QXJ0aWZhY3RMYWJsZXMgPSBjb21wb25lbnQuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmtleVNldCgpOworCQlTZXQ8U3RyaW5nPiBjb21wb25ldEluZm9ybWF0aW9uYWxBcnRpZmFjdExhYmxlcyA9IGNvbXBvbmVudC5nZXRBcnRpZmFjdHMoKS5rZXlTZXQoKTsKKworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzQWFpVXBkYXRlID0gYXJ0aWZhY3RzRnJvbUFBSS5zdHJlYW0oKS5maWx0ZXIoZSAtPiAoY29tcG9uZXREZXBsb3ltZW50QXJ0aWZhY3RMYWJsZXMuY29udGFpbnMoZS5nZXRBcnRpZmFjdExhYmVsKCkpIHx8IGNvbXBvbmV0SW5mb3JtYXRpb25hbEFydGlmYWN0TGFibGVzLmNvbnRhaW5zKGUuZ2V0QXJ0aWZhY3RMYWJlbCgpKSkpCisJCQkJLmZpbHRlcihlIC0+IGNoZWNrQWFpRm9yVXBkYXRlKGNvbXBvbmVudCwgZSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJcmV0dXJuIGFydGlmYWN0c0FhaVVwZGF0ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tBYWlGb3JVcGRhdGUoQ29tcG9uZW50IGNvbXBvbmVudCwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbikgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uQ29tcCA9IGNvbXBvbmVudC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkuZ2V0KGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdExhYmVsKCkpOworCisJCWlmIChhcnRpZmFjdERlZmluaXRpb25Db21wID09IG51bGwpIHsKKwkJCWxvZy53YXJuKCJGYWlsZWQgdG8gZ2V0IHt9IGFydGlmYWN0IiwgYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBPbGQgQXJ0aWZhY3RzIGJlZm9yZSB0aGUgZ2VuZXJhdGVkIGZsYWcgaW50cm9kdWN0aW9uIGlmIGNvbnRhaW5zICJhYWkiIGlnbm9yZSBjYXNlIHByZWZpeCB1cGRhdGVkCisJCWlmIChhcnRpZmFjdERlZmluaXRpb25Db21wLmdldEdlbmVyYXRlZCgpID09IG51bGwpIHsKKwkJCWlmIChhcnRpZmFjdERlZmluaXRpb25Db21wLmdldEFydGlmYWN0TGFiZWwoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImFhaSIpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeworCQkJCWxvZy53YXJuKCJUaGUgYXJ0aWZhY3Qge30gZmxhZyBpcyBudWxsIGJ1dCBBQUkgcHJlZml4IGlzIGFic3NlbnQgTm90IHVwZGF0ZWQiLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0R2VuZXJhdGVkKCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLndhcm4oIkdlbmVyYXRlZCBhcnRpZmFjdCB7fSB3YXMgYWxyZWFkeSB1cGxvYWRlZCBtYW51YWxseSIsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdExhYmVsKCkpOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBnZXRBQUlBcnRpZmF0Y3NGb3JEZWxldGUoTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c0Zyb21BQUksIENvbXBvbmVudCBjb21wb25lbnQpIHsKKworCQlTZXQ8U3RyaW5nPiBhYWlMYWJlbHMgPSBhcnRpZmFjdHNGcm9tQUFJLnN0cmVhbSgpLm1hcChlIC0+IGUuZ2V0QXJ0aWZhY3RMYWJlbCgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c0ZvckRlbGV0ZURlcGxveW1lbnQgPSBjb21wb25lbnQuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLnZhbHVlcygpLnN0cmVhbSgpLgorCQkvLyBGaWx0ZXIgT3V0IEFydGlmYWN0cyB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIGFydGlmYWN0cyByZXR1cm5lZAorCQkvLyBmcm9tIEFBSSBBUEkKKwkJCQlmaWx0ZXIoZSAtPiAhYWFpTGFiZWxzLmNvbnRhaW5zKGUuZ2V0QXJ0aWZhY3RMYWJlbCgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzRm9yRGVsZXRlSW5mb3JtYXRpb25hbCA9IGNvbXBvbmVudC5nZXRBcnRpZmFjdHMoKS52YWx1ZXMoKS5zdHJlYW0oKS4KKwkJLy8gRmlsdGVyIE91dCBBcnRpZmFjdHMgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiBhcnRpZmFjdHMgcmV0dXJuZWQKKwkJLy8gZnJvbSBBQUkgQVBJCisJCQkJZmlsdGVyKGUgLT4gIWFhaUxhYmVscy5jb250YWlucyhlLmdldEFydGlmYWN0TGFiZWwoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJYXJ0aWZhY3RzRm9yRGVsZXRlRGVwbG95bWVudC5hZGRBbGwoYXJ0aWZhY3RzRm9yRGVsZXRlSW5mb3JtYXRpb25hbCk7CisKKwkJcmV0dXJuIGFydGlmYWN0c0ZvckRlbGV0ZURlcGxveW1lbnQuc3RyZWFtKCkuZmlsdGVyKGUgLT4gKGUuZ2V0R2VuZXJhdGVkKCkgIT0gbnVsbCAmJiBlLmdldEdlbmVyYXRlZCgpLmVxdWFscyhCb29sZWFuLlRSVUUpKSB8fCAoZS5nZXRHZW5lcmF0ZWQoKSA9PSBudWxsICYmIGUuZ2V0QXJ0aWZhY3RMYWJlbCgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYWFpIikpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCXByaXZhdGUgTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGdldEFBSUFydGlmYXRjc0ZvckNyZWF0ZShMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzRnJvbUFBSSwgQ29tcG9uZW50IGNvbXBvbmVudCkgeworCisJCVNldDxTdHJpbmc+IGNvbXBvbmVudERlcGxveW1lbnRMYWJlbHMgPSBjb21wb25lbnQuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLmtleVNldCgpOworCQlTZXQ8U3RyaW5nPiBjb21wb25lbnRJbmZvTGFiZWxzID0gY29tcG9uZW50LmdldEFydGlmYWN0cygpLmtleVNldCgpOworCisJCS8vIElmIHRoZSBhcnRpZmFjdCBsYWJlbCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc2VydmljZSAtCisJCS8vIHN0b3JlIHRoZSBhcnRpZmFjdCAoZ2VuZXJhdGUgdXVpZCBhbmQgdmVyc2lvbiwgImdlbmVyYXRlZCIgZmxhZyBpcyBUUlVFKQorCQlyZXR1cm4gYXJ0aWZhY3RzRnJvbUFBSS5zdHJlYW0oKS5maWx0ZXIoZSAtPiAhY29tcG9uZW50RGVwbG95bWVudExhYmVscy5jb250YWlucyhlLmdldEFydGlmYWN0TGFiZWwoKSkgJiYgIWNvbXBvbmVudEluZm9MYWJlbHMuY29udGFpbnMoZS5nZXRBcnRpZmFjdExhYmVsKCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEFjdGlvblN0YXR1cywgUmVzcG9uc2VGb3JtYXQ+IGhhbmRsZUFBSUFydGlmYWN0c0luRGF0YU1vZGVsQnlPcGVyYXRpb25UeXBlKENvbXBvbmVudCBjb21wb25lbnQsIExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBnZW5lcmF0ZWRBcnRpZmFjdHNEZWZpbml0aW9ucywgQXJ0aWZhY3RPcGVyYXRpb24gb3BlcmF0aW9uVHlwZSwgVXNlciB1c2VyLCBib29sZWFuIHNob3VsZExvY2ssCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlTdHJpbmcgY29tcG9uZW50VW5pcXVlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisKKwkJZm9yIChBcnRpZmFjdERlZmluaXRpb24gYXJ0RGVmIDogZ2VuZXJhdGVkQXJ0aWZhY3RzRGVmaW5pdGlvbnMpIHsKKwkJCVN0cmluZyBkYXRhID0gZ3Nvbi50b0pzb24oYXJ0RGVmKTsKKwkJCVN0cmluZyBkYXRhTUQ1ID0gR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlTdHJpbmcoZGF0YSk7CisJCQlTdHJpbmcgYXJ0aWZhY3RVbmlxdWVJZCA9IG51bGw7CisKKwkJCWlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhBcnRpZmFjdE9wZXJhdGlvbi5VcGRhdGUpIHx8IG9wZXJhdGlvblR5cGUuZXF1YWxzKEFydGlmYWN0T3BlcmF0aW9uLkRlbGV0ZSkpIHsKKwkJCQlTdHJpbmcgYXJ0aWZhY3RMYWJlbCA9IGFydERlZi5nZXRBcnRpZmFjdExhYmVsKCk7CisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkuZ2V0KGFydGlmYWN0TGFiZWwpOworCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24gIT0gbnVsbCkgeworCQkJCQlhcnRpZmFjdFVuaXF1ZUlkID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCk7CisJCQkJfQorCQkJfQorCisJCQlFaXRoZXI8RWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgT3BlcmF0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQW5kSGFuZGxlQXJ0aWZhY3QgPSBhcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLnZhbGlkYXRlQW5kSGFuZGxlQXJ0aWZhY3QoY29tcG9uZW50VW5pcXVlSWQsIGNvbXBvbmVudFR5cGUsIG9wZXJhdGlvblR5cGUsIGFydGlmYWN0VW5pcXVlSWQsIGFydERlZiwgZGF0YU1ENSwgZGF0YSwgbnVsbCwKKwkJCQkJbnVsbCwgbnVsbCwgdXNlciwgY29tcG9uZW50LCBzaG91bGRMb2NrLCBpblRyYW5zYWN0aW9uKTsKKworCQkJaWYgKHZhbGlkYXRlQW5kSGFuZGxlQXJ0aWZhY3QuaXNSaWdodCgpKSB7CisJCQkJaWYgKEFydGlmYWN0T3BlcmF0aW9uLkNyZWF0ZSA9PSBvcGVyYXRpb25UeXBlIHx8IEFydGlmYWN0T3BlcmF0aW9uLlVwZGF0ZSA9PSBvcGVyYXRpb25UeXBlKSB7CisJCQkJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5BQUlfQVJUSUZBQ1RfR0VORVJBVElPTl9GQUlMRUQsIGNvbXBvbmVudFR5cGUuZ2V0VmFsdWUoKSwgY29tcG9uZW50LmdldE5hbWUoKSwgdmFsaWRhdGVBbmRIYW5kbGVBcnRpZmFjdC5yaWdodCgpLnZhbHVlKCkudG9TdHJpbmcoKSk7CisKKwkJCQkJRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cud2FybigiR2VuZXJhdGVkIGFydGlmYWN0IHt9IGNvdWxkIG5vdCBiZSBkZWxldGVkIiwgYXJ0RGVmLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KEFjdGlvblN0YXR1cy5PSyk7CisJfQorCisJcHJpdmF0ZSBMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gY29udmVydFRvQXJ0aWZhY3REZWZpbml0aW9uRnJvbUFydGlmYWN0R2VuZXJhdGVkRGF0YShMaXN0PEFydGlmYWN0PiBnZW5lcmF0b3JPdXRwdXQpIHsKKwkJTGlzdDxBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0RGVmTGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworCQlmb3IgKEFydGlmYWN0IGFydGlmYWN0IDogZ2VuZXJhdG9yT3V0cHV0KSB7CisJCQlBcnRpZmFjdERlZmluaXRpb24gbmV3RW50cnkgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJCQluZXdFbnRyeS5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3QuZ2V0TmFtZSgpKTsKKwkJCW5ld0VudHJ5LnNldEFydGlmYWN0VHlwZShhcnRpZmFjdC5nZXRUeXBlKCkpOworCQkJbmV3RW50cnkuc2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLmZpbmRUeXBlKGFydGlmYWN0LmdldEdyb3VwVHlwZSgpKSk7CisJCQluZXdFbnRyeS5zZXREZXNjcmlwdGlvbihhcnRpZmFjdC5nZXREZXNjcmlwdGlvbigpKTsKKworCQkJLy8gTm9ybWFsaXppbmcgdGhlIGFydGlmYWN0IGxhYmVsIHRvIG1hdGNoIHRob3NlIHN0b3JlZCBpbiBEQgorCQkJU3RyaW5nIG5vcm1hbGl6ZUFydGlmYWN0TGFiZWwgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQXJ0aWZhY3RMYWJlbChhcnRpZmFjdC5nZXRMYWJlbCgpKTsKKwkJCW5ld0VudHJ5LnNldEFydGlmYWN0TGFiZWwobm9ybWFsaXplQXJ0aWZhY3RMYWJlbCk7CisJCQluZXdFbnRyeS5zZXRQYXlsb2FkKGFydGlmYWN0LmdldFBheWxvYWQoKSk7CisJCQluZXdFbnRyeS5zZXRBcnRpZmFjdENoZWNrc3VtKGFydGlmYWN0LmdldENoZWNrc3VtKCkpOworCQkJLy8gRmxhZyB0aGF0IHNldCB0byB0cnVlIGluIGNhc2UgdGhhdCB0aGUgYXJ0aWZhY3QgaXMgZ2VuZXJhdGVkIGJ5IEFJJkkgZ2VuZXJhdG9yCisJCQluZXdFbnRyeS5zZXRHZW5lcmF0ZWQoQm9vbGVhbi5UUlVFKTsKKworCQkJYXJ0aWZhY3REZWZMaXN0LmFkZChuZXdFbnRyeSk7CisJCX0KKworCQlyZXR1cm4gYXJ0aWZhY3REZWZMaXN0OworCX0KKworCS8vIExpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnQsIGJ5dGVbXSBhcnRpZmFjdEJ5dGVzPj4KKwkvLyBhcnRpZmFjdCBzdG9yZWQgYnkgbGFiZWwKKwlwcml2YXRlIExpc3Q8QXJ0aWZhY3Q+IGNvbnZlcnRUb0dlbmVyYXRvckFydGlmYWN0c0lucHV0KExpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnQsIGJ5dGVbXT4+IGlucHV0cykgeworCQlMaXN0PEFydGlmYWN0PiBsaXN0T2ZBcnRpZmFjdHNJbnB1dCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKwkJZm9yIChJbW11dGFibGVQYWlyPENvbXBvbmVudCwgYnl0ZVtdPiB0cmlwbGUgOiBpbnB1dHMpIHsKKwkJCUNvbXBvbmVudCBjb21wb25lbnQgPSB0cmlwbGUuZ2V0TGVmdCgpOworCisJCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IHRvc2NhQXJ0aWZhY3RzID0gY29tcG9uZW50LmdldFRvc2NhQXJ0aWZhY3RzKCk7CisJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gdG9zY2FBcnRpZmFjdHMuZ2V0KFRvc2NhRXhwb3J0SGFuZGxlci5BU1NFVF9UT1NDQV9URU1QTEFURSk7CisKKwkJCVN0cmluZyBhcnRpZmFjdE5hbWUgPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3ROYW1lKCk7CisJCQlTdHJpbmcgYXJ0aWZhY3RUeXBlID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VHlwZSgpOworCQkJU3RyaW5nIGFydGlmYWN0R3JvdXBUeXBlID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0R3JvdXBUeXBlKCkuZ2V0VHlwZSgpOworCQkJU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb24gPSBhcnRpZmFjdERlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKTsKKwkJCVN0cmluZyBhcnRpZmFjdExhYmVsID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKTsKKwkJCWJ5dGVbXSByaWdodCA9IHRyaXBsZS5nZXRSaWdodCgpOworCQkJLy8gVGhlIG1kNSBjYWxjdWxhdGVkIG9uIHRoZSB1bmNvZGVkIGRhdGEKKwkJCVN0cmluZyBtZDVIZXggPSBEaWdlc3RVdGlscy5tZDVIZXgocmlnaHQpOworCQkJLy8gYnl0ZVtdIHBheWxvYWQgPSBCYXNlNjQuZ2V0RW5jb2RlcigpLmVuY29kZShyaWdodCk7CisJCQlieXRlW10gcGF5bG9hZCA9IEJhc2U2NC5lbmNvZGVCYXNlNjQocmlnaHQpOworCQkJU3RyaW5nIGFydGlmYWN0VmVyc2lvbiA9IGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdFZlcnNpb24oKTsKKworCQkJQXJ0aWZhY3QgY29udmVydGVkQXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3QoYXJ0aWZhY3RUeXBlLCBhcnRpZmFjdEdyb3VwVHlwZSwgbWQ1SGV4LCBwYXlsb2FkKTsKKwkJCWNvbnZlcnRlZEFydGlmYWN0LnNldE5hbWUoYXJ0aWZhY3ROYW1lKTsKKwkJCWNvbnZlcnRlZEFydGlmYWN0LnNldERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOworCQkJY29udmVydGVkQXJ0aWZhY3Quc2V0TGFiZWwoYXJ0aWZhY3RMYWJlbCk7CisJCQljb252ZXJ0ZWRBcnRpZmFjdC5zZXRWZXJzaW9uKGFydGlmYWN0VmVyc2lvbik7CisKKwkJCWxpc3RPZkFydGlmYWN0c0lucHV0LmFkZChjb252ZXJ0ZWRBcnRpZmFjdCk7CisJCX0KKworCQlyZXR1cm4gbGlzdE9mQXJ0aWZhY3RzSW5wdXQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Ynl0ZVtdLCBBY3Rpb25TdGF0dXM+IGdldEVudHJ5RGF0YShTdHJpbmcgZXNJZCwgQ29tcG9uZW50IGNoaWxkQ29tcG9uZW50KSB7CisJCWJ5dGVbXSBjb250ZW50OworCQlpZiAoZXNJZCA9PSBudWxsIHx8IGVzSWQuaXNFbXB0eSgpKSB7CisJCQlFaXRoZXI8VG9zY2FSZXByZXNlbnRhdGlvbiwgVG9zY2FFcnJvcj4gZXhwb3J0UmVzID0gdG9zY2FFeHBvcnRVdGlscy5leHBvcnRDb21wb25lbnQoY2hpbGRDb21wb25lbnQpOworCQkJaWYgKGV4cG9ydFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBleHBvcnQgdG9zY2EgdGVtcGxhdGUgZm9yIGNoaWxkIGNvbXBvbmVudCB7fSBlcnJvciB7fSIsIGNoaWxkQ29tcG9uZW50LmdldFVuaXF1ZUlkKCksIGV4cG9ydFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tVG9zY2FFcnJvcihleHBvcnRSZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisJCQljb250ZW50ID0gZXhwb3J0UmVzLmxlZnQoKS52YWx1ZSgpLmdldE1haW5ZYW1sKCkuZ2V0Qnl0ZXMoKTsKKwkJfSBlbHNlIHsKKwkJCUVpdGhlcjxieXRlW10sIEFjdGlvblN0YXR1cz4gZnJvbUNhc3NhbmRyYSA9IGdldEZyb21DYXNzYW5kcmEoZXNJZCk7CisJCQlpZiAoZnJvbUNhc3NhbmRyYS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZyb21DYXNzYW5kcmEucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJY29udGVudCA9IGZyb21DYXNzYW5kcmEubGVmdCgpLnZhbHVlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnRlbnQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPGJ5dGVbXSwgQWN0aW9uU3RhdHVzPiBnZXRGcm9tQ2Fzc2FuZHJhKFN0cmluZyBlc0lkKSB7CisJCUVpdGhlcjxFU0FydGlmYWN0RGF0YSwgQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdFJlc3BvbnNlID0gYXJ0aWZhY3RDYXNzYW5kcmFEYW8uZ2V0QXJ0aWZhY3QoZXNJZCk7CisKKwkJaWYgKGFydGlmYWN0UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkluIGNyZWF0ZUNzYXIgZmV0Y2hpbmcgb2YgYXJ0aWZhY3QgZnJvbSBDUyBmYWlsZWQiKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGZyb20gQ2Fzc2FuZHJhIGJ5IGlkIHt9IGVycm9yIHt9ICIsIGVzSWQsIGFydGlmYWN0UmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlU3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRDYXNzYW5kcmFTdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYXJ0aWZhY3RSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJQWN0aW9uU3RhdHVzIGNvbnZlcnRlZEZyb21TdG9yYWdlUmVzcG9uc2UgPSBjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2Uoc3RvcmFnZVN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbnZlcnRlZEZyb21TdG9yYWdlUmVzcG9uc2UpOworCQl9IGVsc2UgeworCQkJRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gYXJ0aWZhY3RSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdERhdGEuZ2V0RGF0YUFzQXJyYXkoKSk7CisKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGNyZWF0ZVRvc2NhQmxvY2swKFN0cmluZyBtZXRhRmlsZVZlcnNpb24sIFN0cmluZyBjc2FyVmVyc2lvbiwgU3RyaW5nIGNyZWF0ZWRCeSwgU3RyaW5nIGVudHJ5RGVmKSB7CisJCWZpbmFsIFN0cmluZyBCTE9DS18wX1RFTVBMQVRFID0gIlRPU0NBLU1ldGEtRmlsZS1WZXJzaW9uOiAlc1xuQ1NBUi1WZXJzaW9uOiAlc1xuQ3JlYXRlZC1CeTogJXNcbkVudHJ5LURlZmluaXRpb25zOiBEZWZpbml0aW9ucy8lc1xuIjsKKwkJU3RyaW5nIHJlYWR5QmxvY2sgPSBTdHJpbmcuZm9ybWF0KEJMT0NLXzBfVEVNUExBVEUsIG1ldGFGaWxlVmVyc2lvbiwgY3NhclZlcnNpb24sIGNyZWF0ZWRCeSwgZW50cnlEZWYpOworCQlyZXR1cm4gcmVhZHlCbG9jazsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PEFydGlmYWN0PiwgUmVzcG9uc2VGb3JtYXQ+IGFydGlmYWN0R2VuZXJhdG9yKExpc3Q8QXJ0aWZhY3Q+IGFydGlmYWN0TGlzdCwgQXJ0aWZhY3RUeXBlIHR5cGUsIENvbXBvbmVudCBjb21wb25lbnQpIHsKKworCQlBcnRpZmFjdEdlbmVyYXRpb25TZXJ2aWNlSW1wbCBhcnRpZmFjdEdlbmVyYXRpb25TZXJ2aWNlSW1wbCA9IG5ldyBBcnRpZmFjdEdlbmVyYXRpb25TZXJ2aWNlSW1wbCgpOworCQlBcnRpZmFjdFR5cGVzIGFydGlmYWN0VHlwZXMgPSBuZXcgQXJ0aWZhY3RUeXBlcygpOworCQlMaXN0PEFydGlmYWN0VHlwZT4gYXJ0aWZhY3RUeXBlc0xpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisJCUFydGlmYWN0VHlwZSBvdGhlclR5cGU7CisKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJb3RoZXJUeXBlID0gQXJ0aWZhY3RUeXBlLk9USEVSOworCQl9IGVsc2UgeworCQkJb3RoZXJUeXBlID0gdHlwZTsKKwkJfQorCisJCWFydGlmYWN0VHlwZXNMaXN0LmFkZChvdGhlclR5cGUpOworCQlhcnRpZmFjdFR5cGVzLnNldEFydGlmYWN0VHlwZXMoYXJ0aWZhY3RUeXBlc0xpc3QpOworCisJCVN0cmluZyBjb25maWdKc29uID0gZ3Nvbi50b0pzb24oYXJ0aWZhY3RUeXBlcyk7CisJCUdlbmVyYXRpb25EYXRhIGdlbmVyYXRlZEFydGlmYWN0cyA9IGFydGlmYWN0R2VuZXJhdGlvblNlcnZpY2VJbXBsLmdlbmVyYXRlQXJ0aWZhY3QoYXJ0aWZhY3RMaXN0LCBjb25maWdKc29uKTsKKworCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVycm9yRGF0YSA9IGdlbmVyYXRlZEFydGlmYWN0cy5nZXRFcnJvckRhdGEoKTsKKworCQlpZiAoIWVycm9yRGF0YS5pc0VtcHR5KCkpIHsKKwkJCVNldDxTdHJpbmc+IGtleVNldCA9IGVycm9yRGF0YS5rZXlTZXQoKTsKKworCQkJZm9yIChTdHJpbmcga2V5IDoga2V5U2V0KSB7CisJCQkJTGlzdDxTdHJpbmc+IGVycm9yTGlzdCA9IGVycm9yRGF0YS5nZXQoa2V5KTsKKwkJCQlsb2cuZGVidWcoIlRoZSBBcnRpZmFjdCBHZW5lcmF0b3IgRmFpbGVkIC0ge30gd2l0aCBmb2xsb3dpbmc6IHt9Iiwga2V5LCBlcnJvckxpc3QpOworCQkJfQorCisJCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQUFJX0FSVElGQUNUX0dFTkVSQVRJT05fRkFJTEVELCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZhbHVlKCksIGNvbXBvbmVudC5nZXROYW1lKCksIGVycm9yRGF0YS50b1N0cmluZygpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGdlbmVyYXRlZEFydGlmYWN0cy5nZXRSZXN1bHREYXRhKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL1Byb3BlcnR5Q29udmVydG9yLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvUHJvcGVydHlDb252ZXJ0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRiODUzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL1Byb3BlcnR5Q29udmVydG9yLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYTsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVByb3BlcnR5VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlRvc2NhTWFwVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVycy5Ub3NjYVZhbHVlQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLkVudHJ5U2NoZW1hOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlRvc2NhTm9kZVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWwuVG9zY2FQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvblJlYWRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlDb252ZXJ0b3IgeworCXByaXZhdGUgc3RhdGljIFByb3BlcnR5Q29udmVydG9yIGluc3RhbmNlOworCXByaXZhdGUgSnNvblBhcnNlciBqc29uUGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvcGVydHlDb252ZXJ0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByb3RlY3RlZCBQcm9wZXJ0eUNvbnZlcnRvcigpIHsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFByb3BlcnR5Q29udmVydG9yIGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworCQkJaW5zdGFuY2UgPSBuZXcgUHJvcGVydHlDb252ZXJ0b3IoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJcHVibGljIEVpdGhlcjxUb3NjYU5vZGVUeXBlLCBUb3NjYUVycm9yPiBjb252ZXJ0UHJvcGVydGllcyhDb21wb25lbnQgY29tcG9uZW50LCBUb3NjYU5vZGVUeXBlIHRvc2NhTm9kZVR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisKKwkJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY29tcG9uZW50OworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BzID0gcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpOworCQkJaWYgKHByb3BzICE9IG51bGwpIHsKKwkJCQlNYXA8U3RyaW5nLCBUb3NjYVByb3BlcnR5PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCisJCQkJLy8gdGFrZSBvbmx5IHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgcmVzb3VyY2UKKwkJCQlwcm9wcy5zdHJlYW0oKS5maWx0ZXIocCAtPiBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKS5lcXVhbHMocC5nZXRQYXJlbnRVbmlxdWVJZCgpKSkuZm9yRWFjaChwcm9wZXJ0eSAtPiB7CisJCQkJCVRvc2NhUHJvcGVydHkgcHJvcCA9IGNvbnZlcnRQcm9wZXJ0eShkYXRhVHlwZXMsIHByb3BlcnR5LCBmYWxzZSk7CisKKwkJCQkJcHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wKTsKKworCQkJCX0pOworCQkJCWlmICghcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCQkJdG9zY2FOb2RlVHlwZS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQodG9zY2FOb2RlVHlwZSk7CisJfQorCisJcHVibGljIFRvc2NhUHJvcGVydHkgY29udmVydFByb3BlcnR5KE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzLCBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHksIGJvb2xlYW4gaXNDYXBhYmlsdHlQcm9wZXJ0eSkgeworCQlUb3NjYVByb3BlcnR5IHByb3AgPSBuZXcgVG9zY2FQcm9wZXJ0eSgpOworCisJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYSA9IHByb3BlcnR5LmdldFNjaGVtYSgpOworCQlpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmdldFByb3BlcnR5KCkgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCkgIT0gbnVsbCAmJiAhc2NoZW1hLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpLmlzRW1wdHkoKSkgeworCQkJaW5uZXJUeXBlID0gc2NoZW1hLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpOworCQkJRW50cnlTY2hlbWEgZXNjaGVtYSA9IG5ldyBFbnRyeVNjaGVtYSgpOworCQkJZXNjaGVtYS5zZXRUeXBlKGlubmVyVHlwZSk7CisJCQllc2NoZW1hLnNldERlc2NyaXB0aW9uKHNjaGVtYS5nZXRQcm9wZXJ0eSgpLmdldERlc2NyaXB0aW9uKCkpOworCQkJcHJvcC5zZXRFbnRyeV9zY2hlbWEoZXNjaGVtYSk7CisJCX0KKwkJbG9nLmRlYnVnKCJ0cnkgdG8gY29udmVydCBwcm9wZXJ0eSB7fSBmcm9tIHR5cGUge30gd2l0aCBkZWZhdWx0IHZhbHVlIHt9IiwgcHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXRUeXBlKCksIHByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJcHJvcC5zZXREZWZhdWx0cChjb252ZXJ0VG9Ub3NjYU9iamVjdChwcm9wZXJ0eS5nZXRUeXBlKCksIHByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpLCBpbm5lclR5cGUsIGRhdGFUeXBlcykpOworCQlwcm9wLnNldFR5cGUocHJvcGVydHkuZ2V0VHlwZSgpKTsKKwkJcHJvcC5zZXREZXNjcmlwdGlvbihwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpKTsKKwkJaWYgKGlzQ2FwYWJpbHR5UHJvcGVydHkpIHsKKwkJCXByb3Auc2V0U3RhdHVzKHByb3BlcnR5LmdldFN0YXR1cygpKTsKKwkJCXByb3Auc2V0UmVxdWlyZWQocHJvcGVydHkuaXNSZXF1aXJlZCgpKTsKKwkJfQorCQlyZXR1cm4gcHJvcDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUb1Rvc2NhT2JqZWN0KFN0cmluZyBwcm9wZXJ0eVR5cGUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJbG9nLmRlYnVnKCJ0cnkgdG8gY29udmVydCBwcm9wZXJ0eVR5cGUge30gLCB2YWx1ZSB7fSwgaW5uZXJUeXBlIHt9IiwgcHJvcGVydHlUeXBlLCB2YWx1ZSwgaW5uZXJUeXBlKTsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCVRvc2NhTWFwVmFsdWVDb252ZXJ0ZXIgbWFwQ29udmVydGVySW5zdCA9IFRvc2NhTWFwVmFsdWVDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKTsKKwkJVG9zY2FWYWx1ZUNvbnZlcnRlciBpbm5lckNvbnZlcnRlciA9IG51bGw7CisJCUJvb2xlYW4gaXNTY2FsYXIgPSB0cnVlOworCisJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZShwcm9wZXJ0eVR5cGUpOworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoImlzbid0IHByZWRlcmZpbmVkIHR5cGUsIGdldCBmcm9tIGFsbCBkYXRhIHR5cGVzIik7CisJCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YVR5cGVzLmdldChwcm9wZXJ0eVR5cGUpOworCQkJaWYgKGlubmVyVHlwZSA9PSBudWxsKSB7CisJCQkJaW5uZXJUeXBlID0gcHJvcGVydHlUeXBlOworCQkJfQorCisJCQlpZiAoKHR5cGUgPSBtYXBDb252ZXJ0ZXJJbnN0LmlzU2NhbGFyVHlwZShkYXRhVHlwZURlZmluaXRpb24pKSAhPSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJUaGlzIGlzIHNjYWxhciB0eXBlLiBnZXQgc3VpdGFibGUgY29udmVydGVyIGZvciB0eXBlIHt9IiwgdHlwZSk7CisJCQkJaW5uZXJDb252ZXJ0ZXIgPSB0eXBlLmdldFZhbHVlQ29udmVydGVyKCk7CisJCQl9IGVsc2UgeworCQkJCWlzU2NhbGFyID0gZmFsc2U7CisJCQl9CisJCX0gZWxzZSB7CisJCQlUb3NjYVByb3BlcnR5VHlwZSB0eXBlSWZTY2FsYXIgPSBUb3NjYVByb3BlcnR5VHlwZS5nZXRUeXBlSWZTY2FsYXIodHlwZS5nZXRUeXBlKCkpOworCQkJaWYgKHR5cGVJZlNjYWxhciA9PSBudWxsKSB7CisJCQkJaXNTY2FsYXIgPSBmYWxzZTsKKwkJCX0KKworCQkJaW5uZXJDb252ZXJ0ZXIgPSB0eXBlLmdldFZhbHVlQ29udmVydGVyKCk7CisJCQlpZiAoVG9zY2FQcm9wZXJ0eVR5cGUuU1RSSU5HLmVxdWFscyh0eXBlKSAmJiB2YWx1ZS5zdGFydHNXaXRoKCIvIikpIHsKKwkJCQlyZXR1cm4gaW5uZXJDb252ZXJ0ZXIuY29udmVydFRvVG9zY2FWYWx1ZSh2YWx1ZSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQkJfQorCQl9CisJCUpzb25FbGVtZW50IGpzb25FbGVtZW50ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHZhbHVlKTsKKwkJCUpzb25SZWFkZXIganNvblJlYWRlciA9IG5ldyBKc29uUmVhZGVyKHJlYWRlcik7CisJCQlqc29uUmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisKKwkJCWpzb25FbGVtZW50ID0ganNvblBhcnNlci5wYXJzZShqc29uUmVhZGVyKTsKKworCQkJaWYgKHZhbHVlLmVxdWFscygiIikpIHsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisKKwkJCWlmIChqc29uRWxlbWVudC5pc0pzb25QcmltaXRpdmUoKSAmJiBpc1NjYWxhcikgeworCQkJCWxvZy5kZWJ1ZygiSXQncyB3ZWxsIGRlZmluZWQgdHlwZS4gY29udmVydCBpdCIpOworCQkJCVRvc2NhVmFsdWVDb252ZXJ0ZXIgY29udmVydGVyID0gdHlwZS5nZXRWYWx1ZUNvbnZlcnRlcigpOworCQkJCXJldHVybiBjb252ZXJ0ZXIuY29udmVydFRvVG9zY2FWYWx1ZSh2YWx1ZSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkl0J3MgZGF0YSB0eXBlIG9yIGlucHV0cyBpbiBwcmltaXRpdmUgdHlwZS4gY29udmVydCBhcyBtYXAiKTsKKwkJCQlPYmplY3QgY29udmVydGVkVmFsdWU7CisJCQkJaWYgKGlubmVyQ29udmVydGVyICE9IG51bGwgJiYgKFRvc2NhUHJvcGVydHlUeXBlLk1BUC5lcXVhbHModHlwZSkgfHwgVG9zY2FQcm9wZXJ0eVR5cGUuTElTVC5lcXVhbHModHlwZSkpKSB7CisJCQkJCWNvbnZlcnRlZFZhbHVlID0gaW5uZXJDb252ZXJ0ZXIuY29udmVydFRvVG9zY2FWYWx1ZSh2YWx1ZSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChpc1NjYWxhcikgeworCQkJCQkJLy8gY29tcGxleCBqc29uIGZvciBzY2FsYXIgdHlwZQorCQkJCQkJY29udmVydGVkVmFsdWUgPSBtYXBDb252ZXJ0ZXJJbnN0LmhhbmRsZUNvbXBsZXhKc29uVmFsdWUoanNvbkVsZW1lbnQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGlubmVyQ29udmVydGVyICE9IG51bGwpIHsKKwkJCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGlubmVyQ29udmVydGVyLmNvbnZlcnRUb1Rvc2NhVmFsdWUodmFsdWUsIGlubmVyVHlwZSwgZGF0YVR5cGVzKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY29udmVydGVkVmFsdWUgPSBtYXBDb252ZXJ0ZXJJbnN0LmNvbnZlcnREYXRhVHlwZVRvVG9zY2FNYXAoaW5uZXJUeXBlLCBkYXRhVHlwZXMsIGlubmVyQ29udmVydGVyLCBpc1NjYWxhciwganNvbkVsZW1lbnQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKKwkJCX0KKworCQl9IGNhdGNoIChKc29uU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiY29udmVydFRvVG9zY2FWYWx1ZSBmYWlsZWQgdG8gcGFyc2UganNvbiB2YWx1ZSA6IiwgZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvVG9zY2FFcnJvci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL1Rvc2NhRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRkNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL1Rvc2NhRXJyb3IuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2E7CisKK3B1YmxpYyBlbnVtIFRvc2NhRXJyb3IgeworCisJTk9ERV9UWVBFX0NBUEFCSUxJVFlfRVJST1IsIE5PVF9TVVBQT1JURURfVE9TQ0FfVFlQRSwgTk9ERV9UWVBFX1JFUVVJUkVNRU5UX0VSUk9SLCBHRU5FUkFMX0VSUk9SCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvVG9zY2FFeHBvcnRIYW5kbGVyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvVG9zY2FFeHBvcnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmOTQwZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9Ub3NjYUV4cG9ydEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYyOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhOworCitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlVHJpcGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5UcmlwbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhbW9kZWwudXRpbHMuQXJ0aWZhY3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JbnB1dERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbC5JVG9zY2FNZXRhZGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbC5TdWJzdGl0dXRpb25NYXBwaW5nOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlRvc2NhQ2FwYWJpbGl0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbC5Ub3NjYUdyb3VwVGVtcGxhdGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWwuVG9zY2FNZXRhZGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbC5Ub3NjYU5vZGVUZW1wbGF0ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbC5Ub3NjYU5vZGVUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsLlRvc2NhUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWwuVG9zY2FUZW1wbGF0ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbC5Ub3NjYVRlbXBsYXRlUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWwuVG9zY2FUb3BvbGd5VGVtcGxhdGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWwuVmZNb2R1bGVUb3NjYU1ldGFkYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuRHVtcGVyT3B0aW9uczsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuRHVtcGVyT3B0aW9ucy5GbG93U3R5bGU7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLmludHJvc3BlY3Rvci5CZWFuQWNjZXNzOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5pbnRyb3NwZWN0b3IuUHJvcGVydHk7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLmludHJvc3BlY3Rvci5Qcm9wZXJ0eVV0aWxzOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ub2Rlcy5NYXBwaW5nTm9kZTsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwubm9kZXMuTm9kZTsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwubm9kZXMuTm9kZVR1cGxlOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ub2Rlcy5UYWc7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLnJlcHJlc2VudGVyLlJlcHJlc2VudDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwucmVwcmVzZW50ZXIuUmVwcmVzZW50ZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQoInRvc2NhLWV4cG9ydC1oYW5kbGVyIikKK3B1YmxpYyBjbGFzcyBUb3NjYUV4cG9ydEhhbmRsZXIgeworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIGRhdGFUeXBlQ2FjaGU7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlwcml2YXRlIENhcGFiaWx0eVJlcXVpcmVtZW50Q29udmVydG9yIGNhcGFiaWx0eVJlcXVpcmVtZW50Q29udmVydG9yID0gQ2FwYWJpbHR5UmVxdWlyZW1lbnRDb252ZXJ0b3IuZ2V0SW5zdGFuY2UoKTsKKwlwcml2YXRlIFByb3BlcnR5Q29udmVydG9yIHByb3BlcnR5Q29udmVydG9yID0gUHJvcGVydHlDb252ZXJ0b3IuZ2V0SW5zdGFuY2UoKTsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUb3NjYUV4cG9ydEhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPU0NBX1ZFUlNJT04gPSAidG9zY2Ffc2ltcGxlX3lhbWxfMV8wIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05PREVfVFlQRV9QUkVGSVggPSAib3JnLm9wZW5lY29tcC5zZXJ2aWNlLiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUU19GSUxFX0tFWSA9ICJmaWxlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1NDQV9URU1QTEFURV9OQU1FID0gIi10ZW1wbGF0ZS55bWwiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VUX1RPU0NBX1RFTVBMQVRFID0gImFzc2V0dG9zY2F0ZW1wbGF0ZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkZfTU9EVUxFX1RZUEVfS0VZID0gInZmX21vZHVsZV90eXBlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRl9NT0RVTEVfREVTQ19LRVkgPSAidmZfbW9kdWxlX2Rlc2NyaXB0aW9uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0xVTUVfR1JPVVBfS0VZID0gInZvbHVtZV9ncm91cCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkZfTU9EVUxFX1RZUEVfQkFTRSA9ICJCYXNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRl9NT0RVTEVfVFlQRV9FWFBBTlNJT04gPSAiRXhwYW5zaW9uIjsKKworCXB1YmxpYyBFaXRoZXI8VG9zY2FSZXByZXNlbnRhdGlvbiwgVG9zY2FFcnJvcj4gZXhwb3J0Q29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQpIHsKKworCQlFaXRoZXI8VG9zY2FUZW1wbGF0ZSwgVG9zY2FFcnJvcj4gdG9zY2FUZW1wbGF0ZVJlcyA9IGNvbnZlcnRUb1Rvc2NhVGVtcGxhdGUoY29tcG9uZW50KTsKKwkJaWYgKHRvc2NhVGVtcGxhdGVSZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHRvc2NhVGVtcGxhdGVSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUN1c3RvbVJlcHJlc2VudGVyIHJlcHJlc2VudGVyID0gbmV3IEN1c3RvbVJlcHJlc2VudGVyKCk7CisJCUR1bXBlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBEdW1wZXJPcHRpb25zKCk7CisJCW9wdGlvbnMuc2V0QWxsb3dSZWFkT25seVByb3BlcnRpZXMoZmFsc2UpOworCQlvcHRpb25zLnNldFByZXR0eUZsb3codHJ1ZSk7CisKKwkJb3B0aW9ucy5zZXREZWZhdWx0Rmxvd1N0eWxlKEZsb3dTdHlsZS5GTE9XKTsKKwkJb3B0aW9ucy5zZXRDYW5vbmljYWwoZmFsc2UpOworCisJCVRvc2NhVGVtcGxhdGUgdG9zY2FUZW1wbGF0ZSA9IHRvc2NhVGVtcGxhdGVSZXMubGVmdCgpLnZhbHVlKCk7CisJCXJlcHJlc2VudGVyLmFkZENsYXNzVGFnKHRvc2NhVGVtcGxhdGUuZ2V0Q2xhc3MoKSwgVGFnLk1BUCk7CisKKwkJcmVwcmVzZW50ZXIuc2V0UHJvcGVydHlVdGlscyhuZXcgVW5zb3J0ZWRQcm9wZXJ0eVV0aWxzKCkpOworCQlZYW1sIHlhbWwgPSBuZXcgWWFtbChyZXByZXNlbnRlciwgb3B0aW9ucyk7CisKKwkJU3RyaW5nIHlhbWxBc1N0cmluZyA9IHlhbWwuZHVtcEFzTWFwKHRvc2NhVGVtcGxhdGUpOworCisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlzYi5hcHBlbmQoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0SGVhdEVudkFydGlmYWN0SGVhZGVyKCkpOworCQlzYi5hcHBlbmQoeWFtbEFzU3RyaW5nKTsKKwkJc2IuYXBwZW5kKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldEhlYXRFbnZBcnRpZmFjdEZvb3RlcigpKTsKKworCQlUb3NjYVJlcHJlc2VudGF0aW9uIHRvc2NhUmVwcmVzZW50YXRpb24gPSBuZXcgVG9zY2FSZXByZXNlbnRhdGlvbigpOworCQl0b3NjYVJlcHJlc2VudGF0aW9uLnNldE1haW5ZYW1sKHNiLnRvU3RyaW5nKCkpOworCQl0b3NjYVJlcHJlc2VudGF0aW9uLnNldERlcGVuZGVuY2llcyh0b3NjYVRlbXBsYXRlLmdldERlcGVuZGVuY2llcygpKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodG9zY2FSZXByZXNlbnRhdGlvbik7CisJfQorCisJcHVibGljIEVpdGhlcjxUb3NjYVRlbXBsYXRlLCBUb3NjYUVycm9yPiBnZXREZXBlbmRlbmNpZXMoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlUb3NjYVRlbXBsYXRlIHRvc2NhVGVtcGxhdGUgPSBuZXcgVG9zY2FUZW1wbGF0ZShudWxsKTsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8VG9zY2FUZW1wbGF0ZSwgTWFwPFN0cmluZywgQ29tcG9uZW50Pj4sIFRvc2NhRXJyb3I+IGZpbGxJbXBvcnRzID0gZmlsbEltcG9ydHMoY29tcG9uZW50LCB0b3NjYVRlbXBsYXRlKTsKKwkJaWYgKGZpbGxJbXBvcnRzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmaWxsSW1wb3J0cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChmaWxsSW1wb3J0cy5sZWZ0KCkudmFsdWUoKS5sZWZ0KTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxUb3NjYVRlbXBsYXRlLCBUb3NjYUVycm9yPiBjb252ZXJ0VG9Ub3NjYVRlbXBsYXRlKENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJbG9nLmRlYnVnKCJzdGFydCB0b3NjYSBleHBvcnQgZm9yIHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlUb3NjYVRlbXBsYXRlIHRvc2NhVGVtcGxhdGUgPSBuZXcgVG9zY2FUZW1wbGF0ZShUT1NDQV9WRVJTSU9OKTsKKworCQl0b3NjYVRlbXBsYXRlLnNldE1ldGFkYXRhKGNvbnZlcnRNZXRhZGF0YShjb21wb25lbnQsIGZhbHNlKSk7CisKKwkJTWFwPFN0cmluZywgVG9zY2FOb2RlVHlwZT4gbm9kZV90eXBlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJaWYgKFRvc2NhVXRpbHMuaXNOb2RlVHlwZShjb21wb25lbnQpKSB7CisJCQlsb2cuZGVidWcoImNvbnZlcnQgY29tcG9uZW50IGFzIG5vZGUgdHlwZSIpOworCQkJcmV0dXJuIGNvbnZlcnROb2RlVHlwZShjb21wb25lbnQsIHRvc2NhVGVtcGxhdGUsIG5vZGVfdHlwZXMpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJjb252ZXJ0IGNvbXBvbmVudCBhcyB0b3BvbG9neSB0ZW1wbGF0ZSIpOworCQkJcmV0dXJuIGNvbnZlcnRUb3NjYVRlbXBsYXRlKGNvbXBvbmVudCwgdG9zY2FUZW1wbGF0ZSk7CisJCX0KKworCX0KKworCXByaXZhdGUgRWl0aGVyPFRvc2NhVGVtcGxhdGUsIFRvc2NhRXJyb3I+IGNvbnZlcnRUb3NjYVRlbXBsYXRlKENvbXBvbmVudCBjb21wb25lbnQsIFRvc2NhVGVtcGxhdGUgdG9zY2FOb2RlKSB7CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8VG9zY2FUZW1wbGF0ZSwgTWFwPFN0cmluZywgQ29tcG9uZW50Pj4sIFRvc2NhRXJyb3I+IGltcG9ydHNSZXMgPSBmaWxsSW1wb3J0cyhjb21wb25lbnQsIHRvc2NhTm9kZSk7CisJCWlmIChpbXBvcnRzUmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChpbXBvcnRzUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJdG9zY2FOb2RlID0gaW1wb3J0c1Jlcy5sZWZ0KCkudmFsdWUoKS5sZWZ0OworCisJCU1hcDxTdHJpbmcsIENvbXBvbmVudD4gY29tcG9uZW50Q2FjaGUgPSBpbXBvcnRzUmVzLmxlZnQoKS52YWx1ZSgpLnJpZ2h0OworCQlFaXRoZXI8TWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRhdGFUeXBlc0VpdGhlciA9IGRhdGFUeXBlQ2FjaGUuZ2V0QWxsKCk7CisJCWlmIChkYXRhVHlwZXNFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBhbGwgZGF0YSB0eXBlcyB7fSIsIGRhdGFUeXBlc0VpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUb3NjYUVycm9yLkdFTkVSQUxfRVJST1IpOworCQl9CisJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzID0gZGF0YVR5cGVzRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCisJCVRvc2NhVG9wb2xneVRlbXBsYXRlIHRvcG9sb2d5X3RlbXBsYXRlID0gbmV3IFRvc2NhVG9wb2xneVRlbXBsYXRlKCk7CisKKwkJRWl0aGVyPFRvc2NhVG9wb2xneVRlbXBsYXRlLCBUb3NjYUVycm9yPiBpbnB1dHMgPSBmaWxsSW5wdXRzKGNvbXBvbmVudCwgdG9wb2xvZ3lfdGVtcGxhdGUsIGRhdGFUeXBlcyk7CisJCWlmIChpbnB1dHMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGlucHV0cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXRvcG9sb2d5X3RlbXBsYXRlID0gaW5wdXRzLmxlZnQoKS52YWx1ZSgpOworCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKCk7CisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHMgPSBjb21wb25lbnQuZ2V0R3JvdXBzKCk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXMgIT0gbnVsbCAmJiAhY29tcG9uZW50SW5zdGFuY2VzLmlzRW1wdHkoKSkgeworCisJCQlFaXRoZXI8TWFwPFN0cmluZywgVG9zY2FOb2RlVGVtcGxhdGU+LCBUb3NjYUVycm9yPiBub2RlX3RlbXBsYXRlcyA9IGNvbnZlcnROb2RlVGVtcGxhdGVzKGNvbXBvbmVudCwgY29tcG9uZW50SW5zdGFuY2VzLCBjb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzLCBjb21wb25lbnRDYWNoZSwgZGF0YVR5cGVzKTsKKwkJCWlmIChub2RlX3RlbXBsYXRlcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG5vZGVfdGVtcGxhdGVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlsb2cuZGVidWcoIm5vZGUgdGVtcGxhdGVzIGNvbnZlcnRlZCIpOworCisJCQl0b3BvbG9neV90ZW1wbGF0ZS5zZXROb2RlX3RlbXBsYXRlcyhub2RlX3RlbXBsYXRlcy5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJaWYgKGdyb3VwcyAhPSBudWxsICYmICFncm91cHMuaXNFbXB0eSgpKSB7CisJCQlNYXA8U3RyaW5nLCBUb3NjYUdyb3VwVGVtcGxhdGU+IGdyb3Vwc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVG9zY2FHcm91cFRlbXBsYXRlPigpOworCQkJZm9yIChHcm91cERlZmluaXRpb24gZ3JvdXAgOiBncm91cHMpIHsKKwkJCQlUb3NjYUdyb3VwVGVtcGxhdGUgdG9zY2FHcm91cCA9IGNvbnZlcnRHcm91cChncm91cCwgY29tcG9uZW50KTsKKwkJCQlncm91cHNNYXAucHV0KGdyb3VwLmdldE5hbWUoKSwgdG9zY2FHcm91cCk7CisKKwkJCX0KKwkJCXRvcG9sb2d5X3RlbXBsYXRlLnNldEdyb3Vwcyhncm91cHNNYXApOworCQkJbG9nLmRlYnVnKCJncm91cHMgY29udmVydGVkIik7CisKKwkJfQorCisJCVN1YnN0aXR1dGlvbk1hcHBpbmcgc3Vic3RpdHV0aW9uTWFwcGluZyA9IG5ldyBTdWJzdGl0dXRpb25NYXBwaW5nKCk7CisJCVN0cmluZyB0b3NjYVJlc291cmNlTmFtZSA9IG51bGw7CisJCXN3aXRjaCAoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkgeworCQljYXNlIFJFU09VUkNFOgorCQkJdG9zY2FSZXNvdXJjZU5hbWUgPSAoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgY29tcG9uZW50LmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKTsKKwkJCWJyZWFrOworCQljYXNlIFNFUlZJQ0U6CisJCQl0b3NjYVJlc291cmNlTmFtZSA9IFNFUlZJQ0VfTk9ERV9UWVBFX1BSRUZJWCArIGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3lzdGVtTmFtZSgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsb2cuZGVidWcoIk5vdCBzdXBwb3J0ZWQgY29tcG9uZW50IHR5cGUge30iLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVG9zY2FFcnJvci5OT1RfU1VQUE9SVEVEX1RPU0NBX1RZUEUpOworCQl9CisJCXN1YnN0aXR1dGlvbk1hcHBpbmcuc2V0Tm9kZV90eXBlKHRvc2NhUmVzb3VyY2VOYW1lKTsKKworCQlFaXRoZXI8U3Vic3RpdHV0aW9uTWFwcGluZywgVG9zY2FFcnJvcj4gY2FwYWJpbGl0aWVzID0gY29udmVydENhcGFiaWxpdGllcyhjb21wb25lbnQsIHN1YnN0aXR1dGlvbk1hcHBpbmcsIGRhdGFUeXBlcyk7CisJCWlmIChjYXBhYmlsaXRpZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNhcGFiaWxpdGllcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXN1YnN0aXR1dGlvbk1hcHBpbmcgPSBjYXBhYmlsaXRpZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPFN1YnN0aXR1dGlvbk1hcHBpbmcsIFRvc2NhRXJyb3I+IHJlcXVpcmVtZW50cyA9IGNhcGFiaWx0eVJlcXVpcmVtZW50Q29udmVydG9yLmNvbnZlcnRSZXF1aXJlbWVudHMoY29tcG9uZW50LCBzdWJzdGl0dXRpb25NYXBwaW5nKTsKKwkJaWYgKHJlcXVpcmVtZW50cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVxdWlyZW1lbnRzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJc3Vic3RpdHV0aW9uTWFwcGluZyA9IHJlcXVpcmVtZW50cy5sZWZ0KCkudmFsdWUoKTsKKworCQl0b3BvbG9neV90ZW1wbGF0ZS5zZXRTdWJzdGl0dXRpb25fbWFwcGluZ3Moc3Vic3RpdHV0aW9uTWFwcGluZyk7CisKKwkJdG9zY2FOb2RlLnNldFRvcG9sb2d5X3RlbXBsYXRlKHRvcG9sb2d5X3RlbXBsYXRlKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRvc2NhTm9kZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VG9zY2FUb3BvbGd5VGVtcGxhdGUsIFRvc2NhRXJyb3I+IGZpbGxJbnB1dHMoQ29tcG9uZW50IGNvbXBvbmVudCwgVG9zY2FUb3BvbGd5VGVtcGxhdGUgdG9wb2xvZ3lfdGVtcGxhdGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiZmlsbElucHV0cyBmb3IgY29tcG9uZW50IHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXREZWYgPSBjb21wb25lbnQuZ2V0SW5wdXRzKCk7CisJCU1hcDxTdHJpbmcsIFRvc2NhUHJvcGVydHk+IGlucHV0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlpZiAoaW5wdXREZWYgIT0gbnVsbCkgeworCQkJaW5wdXREZWYuZm9yRWFjaChpIC0+IHsKKwkJCQlUb3NjYVByb3BlcnR5IHByb3BlcnR5ID0gcHJvcGVydHlDb252ZXJ0b3IuY29udmVydFByb3BlcnR5KGRhdGFUeXBlcywgaSwgZmFsc2UpOworCQkJCWlucHV0cy5wdXQoaS5nZXROYW1lKCksIHByb3BlcnR5KTsKKwkJCX0pOworCQkJaWYgKGlucHV0cyAhPSBudWxsICYmICFpbnB1dHMuaXNFbXB0eSgpKSB7CisJCQkJdG9wb2xvZ3lfdGVtcGxhdGUuc2V0SW5wdXRzKGlucHV0cyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRvcG9sb2d5X3RlbXBsYXRlKTsKKwl9CisKKwlwcml2YXRlIFRvc2NhTWV0YWRhdGEgY29udmVydE1ldGFkYXRhKENvbXBvbmVudCBjb21wb25lbnQsIGJvb2xlYW4gaXNJbnN0YW5jZSkgeworCQlUb3NjYU1ldGFkYXRhIHRvc2NhTWV0YWRhdGEgPSBuZXcgVG9zY2FNZXRhZGF0YSgpOworCQl0b3NjYU1ldGFkYXRhLnNldE5hbWUoY29tcG9uZW50LmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQl0b3NjYU1ldGFkYXRhLnNldEludmFyaWFudFVVSUQoY29tcG9uZW50LmdldEludmFyaWFudFVVSUQoKSk7CisJCXRvc2NhTWV0YWRhdGEuc2V0VVVJRChjb21wb25lbnQuZ2V0VVVJRCgpKTsKKwkJdG9zY2FNZXRhZGF0YS5zZXREZXNjcmlwdGlvbihjb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBjb21wb25lbnQuZ2V0Q2F0ZWdvcmllcygpOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uID0gY2F0ZWdvcmllcy5nZXQoMCk7CisJCXRvc2NhTWV0YWRhdGEuc2V0Q2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLmdldE5hbWUoKSk7CisKKwkJaWYgKGlzSW5zdGFuY2UpIHsKKwkJCXRvc2NhTWV0YWRhdGEuc2V0VmVyc2lvbihjb21wb25lbnQuZ2V0VmVyc2lvbigpKTsKKwkJfQorCQlzd2l0Y2ggKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpIHsKKwkJY2FzZSBSRVNPVVJDRToKKwkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBjb21wb25lbnQ7CisJCQl0b3NjYU1ldGFkYXRhLnNldFR5cGUocmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkubmFtZSgpKTsKKwkJCXRvc2NhTWV0YWRhdGEuc2V0U3ViY2F0ZWdvcnkoY2F0ZWdvcnlEZWZpbml0aW9uLmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJCWlmICghaXNJbnN0YW5jZSkgeworCQkJCXRvc2NhTWV0YWRhdGEuc2V0UmVzb3VyY2VWZW5kb3IocmVzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpKTsKKwkJCQl0b3NjYU1ldGFkYXRhLnNldFJlc291cmNlVmVuZG9yUmVsZWFzZShyZXNvdXJjZS5nZXRWZW5kb3JSZWxlYXNlKCkpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0VSVklDRToKKwkJCXRvc2NhTWV0YWRhdGEuc2V0VHlwZShjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZhbHVlKCkpOworCQkJaWYgKCFpc0luc3RhbmNlKSB7CisJCQkJdG9zY2FNZXRhZGF0YS5zZXRTZXJ2aWNlRWNvbXBOYW1pbmcoZmFsc2UpOworCQkJCXRvc2NhTWV0YWRhdGEuc2V0U2VydmljZUhvbWluZyhmYWxzZSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZy5kZWJ1ZygiTm90IHN1cHBvcnRlZCBjb21wb25lbnQgdHlwZSB7fSIsIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCQl9CisJCXJldHVybiB0b3NjYU1ldGFkYXRhOworCX0KKworCXByaXZhdGUgRWl0aGVyPEltbXV0YWJsZVBhaXI8VG9zY2FUZW1wbGF0ZSwgTWFwPFN0cmluZywgQ29tcG9uZW50Pj4sIFRvc2NhRXJyb3I+IGZpbGxJbXBvcnRzKENvbXBvbmVudCBjb21wb25lbnQsIFRvc2NhVGVtcGxhdGUgdG9zY2FUZW1wbGF0ZSkgeworCQlNYXA8U3RyaW5nLCBDb21wb25lbnQ+IGNvbXBvbmVudENhY2hlID0gbmV3IEhhc2hNYXA8PigpOworCQlpZiAoIVRvc2NhVXRpbHMuaXNOb2RlVHlwZShjb21wb25lbnQpKSB7CisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzICE9IG51bGwgJiYgIWNvbXBvbmVudEluc3RhbmNlcy5pc0VtcHR5KCkpIHsKKwkJCQlMaXN0PE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+PiBpbXBvcnRzID0gbmV3IExpbmtlZExpc3Q8TWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4+KCk7CisJCQkJTGlzdDxUcmlwbGU8U3RyaW5nLCBTdHJpbmcsIENvbXBvbmVudD4+IGRlcGVuZGVjaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJCQljb21wb25lbnRJbnN0YW5jZXMuZm9yRWFjaChjaSAtPiB7CisJCQkJCWNyZWF0ZURlcGVuZGVuY3koY29tcG9uZW50Q2FjaGUsIGltcG9ydHMsIGRlcGVuZGVjaWVzLCBjaSk7CisJCQkJfSk7CisJCQkJdG9zY2FUZW1wbGF0ZS5zZXRJbXBvcnRzKGltcG9ydHMpOworCQkJCXRvc2NhVGVtcGxhdGUuc2V0RGVwZW5kZW5jaWVzKGRlcGVuZGVjaWVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiY3VycmVudGx5IGltcG9ydHMgc3VwcG9ydGVkIGZvciBWRiBhbmQgc2VydmljZSBvbmx5Iik7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ldyBJbW11dGFibGVQYWlyPFRvc2NhVGVtcGxhdGUsIE1hcDxTdHJpbmcsIENvbXBvbmVudD4+KHRvc2NhVGVtcGxhdGUsIGNvbXBvbmVudENhY2hlKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZURlcGVuZGVuY3koTWFwPFN0cmluZywgQ29tcG9uZW50PiBjb21wb25lbnRDYWNoZSwgTGlzdDxNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+Pj4gaW1wb3J0cywgTGlzdDxUcmlwbGU8U3RyaW5nLCBTdHJpbmcsIENvbXBvbmVudD4+IGRlcGVuZGVjaWVzLCBDb21wb25lbnRJbnN0YW5jZSBjaSkgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVzID0gbmV3IEhhc2hNYXA8PigpOworCQlNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiBpbXBvcnRzTGlzdE1lbWJlciA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlDb21wb25lbnQgY29tcG9uZW50UkkgPSBjb21wb25lbnRDYWNoZS5nZXQoY2kuZ2V0Q29tcG9uZW50VWlkKCkpOworCQlpZiAoY29tcG9uZW50UkkgPT0gbnVsbCkgeworCQkJLy8gYWxsIHJlc291cmNlIG11c3QgYmUgb25seSBvbmNlIQorCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKGNpLmdldENvbXBvbmVudFVpZCgpLCB0cnVlKTsKKwkJCWlmIChyZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCByZXNvdXJjZSB3aXRoIGlkIHt9IGZvciBpbnN0YW5jZSB7fSIpOworCQkJfQorCQkJUmVzb3VyY2UgZmV0Y2hlZENvbXBvbmVudCA9IHJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50Q2FjaGUucHV0KGZldGNoZWRDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgZmV0Y2hlZENvbXBvbmVudCk7CisJCQljb21wb25lbnRSSSA9IGZldGNoZWRDb21wb25lbnQ7CisKKwkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gdG9zY2FBcnRpZmFjdHMgPSBjb21wb25lbnRSSS5nZXRUb3NjYUFydGlmYWN0cygpOworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IHRvc2NhQXJ0aWZhY3RzLmdldChBU1NFVF9UT1NDQV9URU1QTEFURSk7CisJCQlpZiAoYXJ0aWZhY3REZWZpbml0aW9uICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TmFtZSgpOworCQkJCWZpbGVzLnB1dChJTVBPUlRTX0ZJTEVfS0VZLCBhcnRpZmFjdE5hbWUpOworCQkJCWltcG9ydHNMaXN0TWVtYmVyLnB1dChjaS5nZXRDb21wb25lbnROYW1lKCksIGZpbGVzKTsKKwkJCQlkZXBlbmRlY2llcy5hZGQobmV3IEltbXV0YWJsZVRyaXBsZTxTdHJpbmcsIFN0cmluZywgQ29tcG9uZW50PihhcnRpZmFjdE5hbWUsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRFc0lkKCksIGZldGNoZWRDb21wb25lbnQpKTsKKwkJCX0KKwkJfQorCQlpZiAoIWltcG9ydHNMaXN0TWVtYmVyLmlzRW1wdHkoKSkgeworCQkJaW1wb3J0cy5hZGQoaW1wb3J0c0xpc3RNZW1iZXIpOworCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VG9zY2FUZW1wbGF0ZSwgVG9zY2FFcnJvcj4gY29udmVydE5vZGVUeXBlKENvbXBvbmVudCBjb21wb25lbnQsIFRvc2NhVGVtcGxhdGUgdG9zY2FOb2RlLCBNYXA8U3RyaW5nLCBUb3NjYU5vZGVUeXBlPiBub2RlX3R5cGVzKSB7CisJCWxvZy5kZWJ1Zygic3RhcnQgY29udmVydCBub2RlIHR5cGUgZm9yIHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlUb3NjYU5vZGVUeXBlIHRvc2NhTm9kZVR5cGUgPSBjcmVhdGVOb2RlVHlwZShjb21wb25lbnQpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGF0YVR5cGVzRWl0aGVyID0gZGF0YVR5cGVDYWNoZS5nZXRBbGwoKTsKKwkJaWYgKGRhdGFUeXBlc0VpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGFsbCBkYXRhIHR5cGVzIDoiLCBkYXRhVHlwZXNFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVG9zY2FFcnJvci5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzID0gZGF0YVR5cGVzRWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8VG9zY2FOb2RlVHlwZSwgVG9zY2FFcnJvcj4gcHJvcGVydGllcyA9IHByb3BlcnR5Q29udmVydG9yLmNvbnZlcnRQcm9wZXJ0aWVzKGNvbXBvbmVudCwgdG9zY2FOb2RlVHlwZSwgZGF0YVR5cGVzKTsKKwkJaWYgKHByb3BlcnRpZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHByb3BlcnRpZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl0b3NjYU5vZGVUeXBlID0gcHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJbG9nLmRlYnVnKCJQcm9wZXJ0aWVzIGNvbnZlcnRlZCBmb3Ige30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisKKwkJRWl0aGVyPFRvc2NhTm9kZVR5cGUsIFRvc2NhRXJyb3I+IGNhcGFiaWxpdGllcyA9IGNvbnZlcnRDYXBhYmlsaXRpZXMoY29tcG9uZW50LCB0b3NjYU5vZGVUeXBlLCBkYXRhVHlwZXMpOworCQlpZiAoY2FwYWJpbGl0aWVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjYXBhYmlsaXRpZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQl0b3NjYU5vZGVUeXBlID0gY2FwYWJpbGl0aWVzLmxlZnQoKS52YWx1ZSgpOworCQlsb2cuZGVidWcoIkNhcGFiaWxpdGllcyBjb252ZXJ0ZWQgZm9yIHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCisJCUVpdGhlcjxUb3NjYU5vZGVUeXBlLCBUb3NjYUVycm9yPiByZXF1aXJlbWVudHMgPSBjYXBhYmlsdHlSZXF1aXJlbWVudENvbnZlcnRvci5jb252ZXJ0UmVxdWlyZW1lbnRzKGNvbXBvbmVudCwgdG9zY2FOb2RlVHlwZSk7CisJCWlmIChyZXF1aXJlbWVudHMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlcXVpcmVtZW50cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXRvc2NhTm9kZVR5cGUgPSByZXF1aXJlbWVudHMubGVmdCgpLnZhbHVlKCk7CisJCWxvZy5kZWJ1ZygiUmVxdWlyZW1lbnRzIGNvbnZlcnRlZCBmb3Ige30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisKKwkJU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lID0gKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpLmdldFRvc2NhUmVzb3VyY2VOYW1lKCk7CisJCW5vZGVfdHlwZXMucHV0KHRvc2NhUmVzb3VyY2VOYW1lLCB0b3NjYU5vZGVUeXBlKTsKKwkJdG9zY2FOb2RlLnNldE5vZGVfdHlwZXMobm9kZV90eXBlcyk7CisJCWxvZy5kZWJ1ZygiZmluaXNoIGNvbnZlcnQgbm9kZSB0eXBlIGZvciB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRvc2NhTm9kZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgVG9zY2FOb2RlVGVtcGxhdGU+LCBUb3NjYUVycm9yPiBjb252ZXJ0Tm9kZVRlbXBsYXRlcyhDb21wb25lbnQgY29tcG9uZW50LCBMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0YW5jZXMsIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4+IGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMsCisJCQlNYXA8U3RyaW5nLCBDb21wb25lbnQ+IGNvbXBvbmVudENhY2hlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlsb2cuZGVidWcoInN0YXJ0IGNvbnZlcnQgdG9wb2xvZ3kgdGVtcGxhdGUgZm9yIHt9IGZvciB0eXBlIHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCQlNYXA8U3RyaW5nLCBUb3NjYU5vZGVUZW1wbGF0ZT4gbm9kZV90ZW1wbGF0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSA6IGNvbXBvbmVudEluc3RhbmNlcykgeworCQkJVG9zY2FOb2RlVGVtcGxhdGUgbm9kZVRlbXBsYXRlID0gbmV3IFRvc2NhTm9kZVRlbXBsYXRlKCk7CisJCQlub2RlVGVtcGxhdGUuc2V0VHlwZShjb21wb25lbnRJbnN0YW5jZS5nZXRUb3NjYUNvbXBvbmVudE5hbWUoKSk7CisKKwkJCUVpdGhlcjxUb3NjYU5vZGVUZW1wbGF0ZSwgVG9zY2FFcnJvcj4gcmVxdWlyZW1lbnRzID0gY29udmVydENvbXBvbmVudEluc3RhbmNlUmVxdWlyZW1lbnRzKGNvbXBvbmVudCwgY29tcG9uZW50SW5zdGFuY2UsIGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKSwgbm9kZVRlbXBsYXRlKTsKKwkJCWlmIChyZXF1aXJlbWVudHMuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXF1aXJlbWVudHMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IGluc3RhbmNlIFJlcXVpcmVtZW50cyBjb252ZXJ0ZWQgZm9yIGluc3RhbmNlIHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCW5vZGVUZW1wbGF0ZSA9IHJlcXVpcmVtZW50cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJQ29tcG9uZW50IGNvbXBvbmVudE9mSW5zdGFuY2UgPSBjb21wb25lbnRDYWNoZS5nZXQoY29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCkpOworCQkJbm9kZVRlbXBsYXRlLnNldE1ldGFkYXRhKGNvbnZlcnRNZXRhZGF0YShjb21wb25lbnRPZkluc3RhbmNlLCB0cnVlKSk7CisKKwkJCUVpdGhlcjxUb3NjYU5vZGVUZW1wbGF0ZSwgVG9zY2FFcnJvcj4gY2FwYWJpbHRpZXMgPSBjYXBhYmlsdHlSZXF1aXJlbWVudENvbnZlcnRvci5jb252ZXJ0Q29tcG9uZW50SW5zdGFuY2VDYXBhYmlsdGllcyhjb21wb25lbnRJbnN0YW5jZSwgZGF0YVR5cGVzLCBub2RlVGVtcGxhdGUpOworCQkJaWYgKGNhcGFiaWx0aWVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVxdWlyZW1lbnRzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlsb2cuZGVidWcoIkNvbXBvbmVudCBpbnN0YW5jZSBDYXBhYmlsdGllcyBjb252ZXJ0ZWQgZm9yIGluc3RhbmNlIHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCW5vZGVUZW1wbGF0ZSA9IGNhcGFiaWx0aWVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcy5jb250YWluc0tleShjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKSkgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBudWxsOworCQkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcExpc3QgPSBjb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzLmdldChjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGNvbGxlY3QgPSBwcm9wTGlzdC5zdHJlYW0oKS5maWx0ZXIoZSAtPiBlLmdldFZhbHVlVW5pcXVlVWlkKCkgIT0gbnVsbCAmJiAhZS5nZXRWYWx1ZVVuaXF1ZVVpZCgpLmlzRW1wdHkoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCQlpZiAoY29sbGVjdCAhPSBudWxsICYmICFjb2xsZWN0LmlzRW1wdHkoKSkgeworCQkJCQlwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcHJvcCA6IGNvbGxlY3QpIHsKKwkJCQkJCU9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRJbnN0YW5jZVByb3BlcnR5KGRhdGFUeXBlcywgY29tcG9uZW50SW5zdGFuY2UsIHByb3ApOworCQkJCQkJcHJvcHMucHV0KHByb3AuZ2V0TmFtZSgpLCBjb252ZXJ0ZWRWYWx1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHByb3BzICE9IG51bGwgJiYgIXByb3BzLmlzRW1wdHkoKSkgeworCQkJCQlub2RlVGVtcGxhdGUuc2V0UHJvcGVydGllcyhwcm9wcyk7CisJCQkJfQorCQkJfQorCQkJbm9kZV90ZW1wbGF0ZXMucHV0KGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSwgbm9kZVRlbXBsYXRlKTsKKwkJfQorCQlsb2cuZGVidWcoImZpbmlzaCBjb252ZXJ0IHRvcG9sb2d5IHRlbXBsYXRlIGZvciB7fSBmb3IgdHlwZSB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG5vZGVfdGVtcGxhdGVzKTsKKwl9CisKKwlwcml2YXRlIE9iamVjdCBjb252ZXJ0SW5zdGFuY2VQcm9wZXJ0eShNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcywgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcHJvcCkgeworCQlsb2cuZGVidWcoIkNvbnZlcnQgcHJvcGVydHkge30gZm9yIGluc3RhbmNlIHt9IiwgcHJvcC5nZXROYW1lKCksIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcC5nZXRUeXBlKCk7CisJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQlpZiAocHJvcC5nZXRTY2hlbWEoKSAhPSBudWxsICYmIHByb3AuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKSAhPSBudWxsKSB7CisJCQlpbm5lclR5cGUgPSBwcm9wLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpOworCQl9CisJCU9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IHByb3BlcnR5Q29udmVydG9yLmNvbnZlcnRUb1Rvc2NhT2JqZWN0KHByb3BlcnR5VHlwZSwgcHJvcC5nZXRWYWx1ZSgpLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisJCXJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKKwl9CisKKwlwcml2YXRlIFRvc2NhR3JvdXBUZW1wbGF0ZSBjb252ZXJ0R3JvdXAoR3JvdXBEZWZpbml0aW9uIGdyb3VwLCBDb21wb25lbnQgY29tcG9uZW50KSB7CisJCVRvc2NhR3JvdXBUZW1wbGF0ZSB0b3NjYUdyb3VwID0gbmV3IFRvc2NhR3JvdXBUZW1wbGF0ZSgpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMgPSBncm91cC5nZXRNZW1iZXJzKCk7CisJCXRvc2NhR3JvdXAuc2V0VHlwZShncm91cC5nZXRUeXBlKCkpOworCQlpZiAobWVtYmVycyAhPSBudWxsKQorCQkJdG9zY2FHcm91cC5zZXRNZW1iZXJzKG5ldyBBcnJheUxpc3QobWVtYmVycy5rZXlTZXQoKSkpOworCisJCWJvb2xlYW4gaXNWZk1vZHVsZSA9IGdyb3VwLmdldFR5cGUoKS5lcXVhbHMoQ29uc3RhbnRzLkRFRkFVTFRfR1JPVVBfVkZfTU9EVUxFKSA/IHRydWUgOiBmYWxzZTsKKwkJSVRvc2NhTWV0YWRhdGEgdG9zY2FNZXRhZGF0YTsKKwkJaWYgKCFpc1ZmTW9kdWxlKSB7CisJCQl0b3NjYU1ldGFkYXRhID0gbmV3IFRvc2NhTWV0YWRhdGEoKTsKKwkJfSBlbHNlIHsKKwkJCXRvc2NhTWV0YWRhdGEgPSBuZXcgVmZNb2R1bGVUb3NjYU1ldGFkYXRhKCk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJCWZvciAoR3JvdXBQcm9wZXJ0eSBncCA6IGdyb3VwLmdldFByb3BlcnRpZXMoKSkgeworCQkJCWlmIChncC5nZXROYW1lKCkuZXF1YWxzKENvbnN0YW50cy5JU19CQVNFKSkgeworCQkJCQlCb29sZWFuIGlzQmFzZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGdwLmdldFZhbHVlKCkpOworCQkJCQlTdHJpbmcgdHlwZSA9IGlzQmFzZSA/IFZGX01PRFVMRV9UWVBFX0JBU0UgOiBWRl9NT0RVTEVfVFlQRV9FWFBBTlNJT047CisJCQkJCXByb3BlcnRpZXMucHV0KFZGX01PRFVMRV9UWVBFX0tFWSwgdHlwZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXByb3BlcnRpZXMucHV0KFZGX01PRFVMRV9ERVNDX0tFWSwgZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQlib29sZWFuIGlzVm9sdW1lID0gZmFsc2U7CisJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzTGlzdCA9IGdyb3VwLmdldEFydGlmYWN0cygpOworCQkJaWYgKGFydGlmYWN0c0xpc3QgIT0gbnVsbCAmJiAhYXJ0aWZhY3RzTGlzdC5pc0VtcHR5KCkpIHsKKworCQkJCWZvciAoU3RyaW5nIGFydGlmYWN0SWQgOiBhcnRpZmFjdHNMaXN0KSB7CisJCQkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IGNvbXBvbmVudC5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCQkJCU9wdGlvbmFsPEFydGlmYWN0RGVmaW5pdGlvbj4gZmluZEZpcnN0ID0gZGVwbG95bWVudEFydGlmYWN0cy52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGFydGlmYWN0SWQpKS5maW5kRmlyc3QoKTsKKwkJCQkJaWYgKGZpbmRGaXJzdC5pc1ByZXNlbnQoKSkgeworCQkJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGZpbmRGaXJzdC5nZXQoKTsKKwkJCQkJCWlmIChhcnRpZmFjdERlZmluaXRpb24uZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShBcnRpZmFjdFR5cGVFbnVtLkhFQVRfVk9MLmdldFR5cGUoKSkpIHsKKwkJCQkJCQlpc1ZvbHVtZSA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlwcm9wZXJ0aWVzLnB1dChWT0xVTUVfR1JPVVBfS0VZLCBpc1ZvbHVtZSk7CisJCQl0b3NjYUdyb3VwLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisJCX0KKwkJdG9zY2FNZXRhZGF0YS5zZXROYW1lKGdyb3VwLmdldE5hbWUoKSk7CisJCXRvc2NhTWV0YWRhdGEuc2V0SW52YXJpYW50VVVJRChncm91cC5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQl0b3NjYU1ldGFkYXRhLnNldFVVSUQoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpOworCQl0b3NjYU1ldGFkYXRhLnNldFZlcnNpb24oZ3JvdXAuZ2V0VmVyc2lvbigpKTsKKwkJdG9zY2FHcm91cC5zZXRNZXRhZGF0YSh0b3NjYU1ldGFkYXRhKTsKKwkJcmV0dXJuIHRvc2NhR3JvdXA7CisJfQorCisJcHJpdmF0ZSBUb3NjYU5vZGVUeXBlIGNyZWF0ZU5vZGVUeXBlKENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJVG9zY2FOb2RlVHlwZSB0b3NjYU5vZGVUeXBlID0gbmV3IFRvc2NhTm9kZVR5cGUoKTsKKwkJaWYgKFRvc2NhVXRpbHMuaXNOb2RlVHlwZShjb21wb25lbnQpICYmICgoUmVzb3VyY2UpIGNvbXBvbmVudCkuZ2V0RGVyaXZlZEZyb20oKSAhPSBudWxsKSB7CisJCQl0b3NjYU5vZGVUeXBlLnNldERlcml2ZWRfZnJvbSgoKFJlc291cmNlKSBjb21wb25lbnQpLmdldERlcml2ZWRGcm9tKCkuZ2V0KDApKTsKKwkJfQorCQl0b3NjYU5vZGVUeXBlLnNldERlc2NyaXB0aW9uKGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpKTsgLy8gb3IgbmFtZT8/CisJCXJldHVybiB0b3NjYU5vZGVUeXBlOworCX0KKworCXByaXZhdGUgRWl0aGVyPFRvc2NhTm9kZVRlbXBsYXRlLCBUb3NjYUVycm9yPiBjb252ZXJ0Q29tcG9uZW50SW5zdGFuY2VSZXF1aXJlbWVudHMoQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiByZWxhdGlvbnMsIFRvc2NhTm9kZVRlbXBsYXRlIG5vZGVUeXBlVGVtcGxhdGUpIHsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBpbnN0YW5jZXNMaXN0ID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlMaXN0PE1hcDxTdHJpbmcsIFRvc2NhVGVtcGxhdGVSZXF1aXJlbWVudD4+IHRvc2NhUmVxdWlyZW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxTWFwID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0UmVxdWlyZW1lbnRzKCk7CisKKwkJcmVsYXRpb25zLnN0cmVhbSgpLmZpbHRlcihwIC0+IGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCkuZXF1YWxzKHAuZ2V0RnJvbU5vZGUoKSkpLmZvckVhY2gocmVxIC0+IHsKKwkJCUNvbXBvbmVudEluc3RhbmNlIHRvQ29tcG9uZW50SW5zdGFuY2UgPSBpbnN0YW5jZXNMaXN0LnN0cmVhbSgpLmZpbHRlcihpIC0+IHJlcS5nZXRUb05vZGUoKS5lcXVhbHMoaS5nZXRVbmlxdWVJZCgpKSkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOworCQkJaWYgKHRvQ29tcG9uZW50SW5zdGFuY2UgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGQgdG8gY3JlYXRlIHJlbGF0aW9uIGJldHdlZW4gbm9kZSB7fSB0byBub2RlIHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpLCByZXEuZ2V0VG9Ob2RlKCkpOworCQkJCXJldHVybjsKKworCQkJfQorCQkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlcUFuZFJlbGF0aW9uc2hvcFBhaXIgPSByZXEuZ2V0UmVsYXRpb25zaGlwcygpLmdldCgwKTsKKwkJCVRvc2NhVGVtcGxhdGVSZXF1aXJlbWVudCB0b3NjYVJlcXVpcmVtZW50ID0gbmV3IFRvc2NhVGVtcGxhdGVSZXF1aXJlbWVudCgpOworCQkJdG9zY2FSZXF1aXJlbWVudC5zZXRSZWxhdGlvbnNoaXAocmVxQW5kUmVsYXRpb25zaG9wUGFpci5nZXRSZWxhdGlvbnNoaXAoKS5nZXRUeXBlKCkpOworCQkJdG9zY2FSZXF1aXJlbWVudC5zZXROb2RlKHRvQ29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKwkJCU9wdGlvbmFsPFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gZmluZEFueSA9IHJlcU1hcC52YWx1ZXMoKS5zdHJlYW0oKS5mbGF0TWFwKGUgLT4gZS5zdHJlYW0oKSkuZmlsdGVyKGUgLT4gZS5nZXROYW1lKCkuZXF1YWxzKHJlcUFuZFJlbGF0aW9uc2hvcFBhaXIuZ2V0UmVxdWlyZW1lbnQoKSkpLmZpbmRBbnkoKTsKKwkJCWlmIChmaW5kQW55LmlzUHJlc2VudCgpKSB7CisJCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlZ0RlZmluaXRpb24gPSBmaW5kQW55LmdldCgpOworCQkJCXRvc2NhUmVxdWlyZW1lbnQuc2V0Q2FwYWJpbGl0eShyZWdEZWZpbml0aW9uLmdldENhcGFiaWxpdHkoKSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGQgdG8gZmluZCByZWxhdGlvbiBiZXR3ZWVuIG5vZGUge30gdG8gbm9kZSB7fSIsIGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSwgcmVxLmdldFRvTm9kZSgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlNYXA8U3RyaW5nLCBUb3NjYVRlbXBsYXRlUmVxdWlyZW1lbnQ+IHJlcW1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVG9zY2FUZW1wbGF0ZVJlcXVpcmVtZW50PigpOworCQkJcmVxbWFwLnB1dChyZXFBbmRSZWxhdGlvbnNob3BQYWlyLmdldFJlcXVpcmVtZW50KCksIHRvc2NhUmVxdWlyZW1lbnQpOworCQkJdG9zY2FSZXF1aXJlbWVudHMuYWRkKHJlcW1hcCk7CisKKwkJfSk7CisKKwkJaWYgKCF0b3NjYVJlcXVpcmVtZW50cy5pc0VtcHR5KCkpIHsKKwkJCW5vZGVUeXBlVGVtcGxhdGUuc2V0UmVxdWlyZW1lbnRzKHRvc2NhUmVxdWlyZW1lbnRzKTsKKwkJfQorCQlsb2cuZGVidWcoIkZpbmlzaCBjb252ZXJ0IFJlcXVpcmVtZW50cyBmb3Igbm9kZSB0eXBlIik7CisJCXJldHVybiBFaXRoZXIubGVmdChub2RlVHlwZVRlbXBsYXRlKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTdWJzdGl0dXRpb25NYXBwaW5nLCBUb3NjYUVycm9yPiBjb252ZXJ0Q2FwYWJpbGl0aWVzKENvbXBvbmVudCBjb21wb25lbnQsIFN1YnN0aXR1dGlvbk1hcHBpbmcgc3Vic3RpdHV0aW9uTWFwcGluZywgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJTWFwPFN0cmluZywgVG9zY2FDYXBhYmlsaXR5PiB0b3NjYUNhcGFiaWxpdGllcyA9IGNhcGFiaWx0eVJlcXVpcmVtZW50Q29udmVydG9yLmNvbnZlcnRDYXBhYmlsaXRpZXMoY29tcG9uZW50LCBkYXRhVHlwZXMpOworCQlpZiAoIXRvc2NhQ2FwYWJpbGl0aWVzLmlzRW1wdHkoKSkgeworCQkJc3Vic3RpdHV0aW9uTWFwcGluZy5zZXRDYXBhYmlsaXRpZXModG9zY2FDYXBhYmlsaXRpZXMpOworCQl9CisJCWxvZy5kZWJ1ZygiRmluaXNoIGNvbnZlcnQgQ2FwYWJpbGl0aWVzIGZvciBub2RlIHR5cGUiKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoc3Vic3RpdHV0aW9uTWFwcGluZyk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VG9zY2FOb2RlVHlwZSwgVG9zY2FFcnJvcj4gY29udmVydENhcGFiaWxpdGllcyhDb21wb25lbnQgY29tcG9uZW50LCBUb3NjYU5vZGVUeXBlIG5vZGVUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlNYXA8U3RyaW5nLCBUb3NjYUNhcGFiaWxpdHk+IHRvc2NhQ2FwYWJpbGl0aWVzID0gY2FwYWJpbHR5UmVxdWlyZW1lbnRDb252ZXJ0b3IuY29udmVydENhcGFiaWxpdGllcyhjb21wb25lbnQsIGRhdGFUeXBlcyk7CisJCWlmICghdG9zY2FDYXBhYmlsaXRpZXMuaXNFbXB0eSgpKSB7CisJCQlub2RlVHlwZS5zZXRDYXBhYmlsaXRpZXModG9zY2FDYXBhYmlsaXRpZXMpOworCQl9CisJCWxvZy5kZWJ1ZygiRmluaXNoIGNvbnZlcnQgQ2FwYWJpbGl0aWVzIGZvciBub2RlIHR5cGUiKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQobm9kZVR5cGUpOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbVJlcHJlc2VudGVyIGV4dGVuZHMgUmVwcmVzZW50ZXIgeworCQlwdWJsaWMgQ3VzdG9tUmVwcmVzZW50ZXIoKSB7CisJCQlzdXBlcigpOworCQkJLy8gbnVsbCByZXByZXNlbnRlciBpcyBleGNlcHRpb25hbCBhbmQgaXQgaXMgc3RvcmVkIGFzIGFuIGluc3RhbmNlCisJCQkvLyB2YXJpYWJsZS4KKwkJCXRoaXMubnVsbFJlcHJlc2VudGVyID0gbmV3IFJlcHJlc2VudE51bGwoKTsKKworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBOb2RlVHVwbGUgcmVwcmVzZW50SmF2YUJlYW5Qcm9wZXJ0eShPYmplY3QgamF2YUJlYW4sIFByb3BlcnR5IHByb3BlcnR5LCBPYmplY3QgcHJvcGVydHlWYWx1ZSwgVGFnIGN1c3RvbVRhZykgeworCQkJaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfSBlbHNlIHsKKwkJCQkvLyBza2lwIG5vdCByZWxldmFudCBmb3IgVG9zY2EgcHJvcGVydHkKKwkJCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpLmVxdWFscygiZGVwZW5kZW5jaWVzIikpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCU5vZGVUdXBsZSBkZWZhdWx0Tm9kZSA9IHN1cGVyLnJlcHJlc2VudEphdmFCZWFuUHJvcGVydHkoamF2YUJlYW4sIHByb3BlcnR5LCBwcm9wZXJ0eVZhbHVlLCBjdXN0b21UYWcpOworCisJCQkJcmV0dXJuIHByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMoIl9kZWZhdWx0cF8iKSA/IG5ldyBOb2RlVHVwbGUocmVwcmVzZW50RGF0YSgiZGVmYXVsdCIpLCBkZWZhdWx0Tm9kZS5nZXRWYWx1ZU5vZGUoKSkgOiBkZWZhdWx0Tm9kZTsKKwkJCX0KKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgTWFwcGluZ05vZGUgcmVwcmVzZW50SmF2YUJlYW4oU2V0PFByb3BlcnR5PiBwcm9wZXJ0aWVzLCBPYmplY3QgamF2YUJlYW4pIHsKKwkJCS8vIHJlbW92ZSB0aGUgYmVhbiB0eXBlIGZyb20gdGhlIG91dHB1dCB5YW1sICghISAuLi4pCisJCQlpZiAoIWNsYXNzVGFncy5jb250YWluc0tleShqYXZhQmVhbi5nZXRDbGFzcygpKSkKKwkJCQlhZGRDbGFzc1RhZyhqYXZhQmVhbi5nZXRDbGFzcygpLCBUYWcuTUFQKTsKKworCQkJcmV0dXJuIHN1cGVyLnJlcHJlc2VudEphdmFCZWFuKHByb3BlcnRpZXMsIGphdmFCZWFuKTsKKwkJfQorCisJCXByaXZhdGUgY2xhc3MgUmVwcmVzZW50TnVsbCBpbXBsZW1lbnRzIFJlcHJlc2VudCB7CisJCQlwdWJsaWMgTm9kZSByZXByZXNlbnREYXRhKE9iamVjdCBkYXRhKSB7CisJCQkJLy8gcG9zc2libGUgdmFsdWVzIGFyZSBoZXJlIGh0dHA6Ly95YW1sLm9yZy90eXBlL251bGwuaHRtbAorCQkJCXJldHVybiByZXByZXNlbnRTY2FsYXIoVGFnLk5VTEwsICIiKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFVuc29ydGVkUHJvcGVydHlVdGlscyBleHRlbmRzIFByb3BlcnR5VXRpbHMgeworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFNldDxQcm9wZXJ0eT4gY3JlYXRlUHJvcGVydHlTZXQoQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4gdHlwZSwgQmVhbkFjY2VzcyBiQWNjZXNzKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7CisJCQlDb2xsZWN0aW9uPFByb3BlcnR5PiBmaWVsZHMgPSBnZXRQcm9wZXJ0aWVzTWFwKHR5cGUsIEJlYW5BY2Nlc3MuRklFTEQpLnZhbHVlcygpOworCQkJU2V0PFByb3BlcnR5PiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaFNldDxQcm9wZXJ0eT4oZmllbGRzKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9Ub3NjYVJlcHJlc2VudGF0aW9uLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvVG9zY2FSZXByZXNlbnRhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTg5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvVG9zY2FSZXByZXNlbnRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLlRyaXBsZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CisKK3B1YmxpYyBjbGFzcyBUb3NjYVJlcHJlc2VudGF0aW9uIHsKKworCXByaXZhdGUgU3RyaW5nIG1haW5ZYW1sOworCXByaXZhdGUgTGlzdDxUcmlwbGU8U3RyaW5nLCBTdHJpbmcsIENvbXBvbmVudD4+IGRlcGVuZGVuY2llczsKKworCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbllhbWwoKSB7CisJCXJldHVybiBtYWluWWFtbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNYWluWWFtbChTdHJpbmcgbWFpbllhbWwpIHsKKwkJdGhpcy5tYWluWWFtbCA9IG1haW5ZYW1sOworCX0KKworCXB1YmxpYyBMaXN0PFRyaXBsZTxTdHJpbmcsIFN0cmluZywgQ29tcG9uZW50Pj4gZ2V0RGVwZW5kZW5jaWVzKCkgeworCQlyZXR1cm4gZGVwZW5kZW5jaWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcGVuZGVuY2llcyhMaXN0PFRyaXBsZTxTdHJpbmcsIFN0cmluZywgQ29tcG9uZW50Pj4gZGVwZW5kYW5jaWVzKSB7CisJCXRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kYW5jaWVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL1Rvc2NhVXRpbHMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9Ub3NjYVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwM2FkMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9Ub3NjYVV0aWxzLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKKworcHVibGljIGNsYXNzIFRvc2NhVXRpbHMgeworCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTm9kZVR5cGUoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKKwkJaWYgKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmVxdWFscyhjb21wb25lbnRUeXBlKSkgeworCQkJUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUgPSAoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgY29tcG9uZW50LmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuZ2V0UmVzb3VyY2VUeXBlKCk7CisJCQlpZiAoUmVzb3VyY2VUeXBlRW51bS5DUC5lcXVhbHMocmVzb3VyY2VUeXBlKSB8fCBSZXNvdXJjZVR5cGVFbnVtLlZMLmVxdWFscyhyZXNvdXJjZVR5cGUpIHx8IFJlc291cmNlVHlwZUVudW0uVkZDLmVxdWFscyhyZXNvdXJjZVR5cGUpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBvYmplY3RUb01hcChPYmplY3Qgb2JqZWN0VG9Db252ZXJ0LCBDbGFzcyBjbGF6eikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlMaXN0PEZpZWxkPiBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlmaWVsZHMgPSBnZXRBbGxGaWVsZHMoZmllbGRzLCBjbGF6eik7CisKKwkJZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKwkJCW1hcC5wdXQoZmllbGQuZ2V0TmFtZSgpLCBmaWVsZC5nZXQob2JqZWN0VG9Db252ZXJ0KSk7CisJCX0KKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8RmllbGQ+IGdldEFsbEZpZWxkcyhMaXN0PEZpZWxkPiBmaWVsZHMsIENsYXNzPD8+IHR5cGUpIHsKKwkJZmllbGRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RGVjbGFyZWRGaWVsZHMoKSkpOworCisJCWlmICh0eXBlLmdldFN1cGVyY2xhc3MoKSAhPSBudWxsKSB7CisJCQlmaWVsZHMgPSBnZXRBbGxGaWVsZHMoZmllbGRzLCB0eXBlLmdldFN1cGVyY2xhc3MoKSk7CisJCX0KKwkJcmV0dXJuIGZpZWxkczsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvRW50cnlTY2hlbWEuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9FbnRyeVNjaGVtYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTg2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvRW50cnlTY2hlbWEuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWw7CisKK3B1YmxpYyBjbGFzcyBFbnRyeVNjaGVtYSB7CisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL0lUb3NjYU1ldGFkYXRhLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvSVRvc2NhTWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY0ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL0lUb3NjYU1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsOworCitwdWJsaWMgaW50ZXJmYWNlIElUb3NjYU1ldGFkYXRhIHsKKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOworCisJcHVibGljIHZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCk7CisKKwlwdWJsaWMgdm9pZCBzZXRVVUlEKFN0cmluZyB1VUlEKTsKKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvU3Vic3RpdHV0aW9uTWFwcGluZy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1N1YnN0aXR1dGlvbk1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQ5ZGFlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1N1YnN0aXR1dGlvbk1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgU3Vic3RpdHV0aW9uTWFwcGluZyB7CisJcHJpdmF0ZSBTdHJpbmcgbm9kZV90eXBlOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBUb3NjYUNhcGFiaWxpdHk+IGNhcGFiaWxpdGllczsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+IHJlcXVpcmVtZW50czsKKworCXB1YmxpYyBTdWJzdGl0dXRpb25NYXBwaW5nKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vZGVfdHlwZSgpIHsKKwkJcmV0dXJuIG5vZGVfdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb2RlX3R5cGUoU3RyaW5nIG5vZGVfdHlwZSkgeworCQl0aGlzLm5vZGVfdHlwZSA9IG5vZGVfdHlwZTsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgVG9zY2FDYXBhYmlsaXR5PiBnZXRDYXBhYmlsaXRpZXMoKSB7CisJCXJldHVybiBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0aWVzKE1hcDxTdHJpbmcsIFRvc2NhQ2FwYWJpbGl0eT4gY2FwYWJpbGl0aWVzKSB7CisJCXRoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBUb3NjYVJlcXVpcmVtZW50PiBnZXRSZXF1aXJlbWVudHMoKSB7CisJCXJldHVybiByZXF1aXJlbWVudHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRzKE1hcDxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+IHJlcXVpcmVtZW50cykgeworCQl0aGlzLnJlcXVpcmVtZW50cyA9IHJlcXVpcmVtZW50czsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYUNhcGFiaWxpdHkuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYUNhcGFiaWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg4ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhQ2FwYWJpbGl0eS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUb3NjYUNhcGFiaWxpdHkgeworCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXByaXZhdGUgTGlzdDxPYmplY3Q+IG9jY3VycmVuY2VzOworCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gdmFsaWRfc291cmNlX3R5cGVzOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBUb3NjYVByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWxpZF9zb3VyY2VfdHlwZXMoKSB7CisJCXJldHVybiB2YWxpZF9zb3VyY2VfdHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsaWRfc291cmNlX3R5cGVzKExpc3Q8U3RyaW5nPiB2YWxpZF9zb3VyY2VfdHlwZXMpIHsKKwkJdGhpcy52YWxpZF9zb3VyY2VfdHlwZXMgPSB2YWxpZF9zb3VyY2VfdHlwZXM7CisJfQorCisJcHVibGljIFRvc2NhQ2FwYWJpbGl0eSgpIHsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgTGlzdDxPYmplY3Q+IGdldE9jY3VycmVuY2VzKCkgeworCQlyZXR1cm4gb2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZXMoTGlzdDxPYmplY3Q+IG9jY3VycmVuY2VzKSB7CisJCXRoaXMub2NjdXJyZW5jZXMgPSBvY2N1cnJlbmNlczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgVG9zY2FQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBUb3NjYVByb3BlcnR5PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FHcm91cFRlbXBsYXRlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FHcm91cFRlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxY2ZmYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYUdyb3VwVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgVG9zY2FHcm91cFRlbXBsYXRlIHsKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCUxpc3Q8U3RyaW5nPiBtZW1iZXJzOworCXByaXZhdGUgSVRvc2NhTWV0YWRhdGEgbWV0YWRhdGE7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisKKwlwdWJsaWMgVG9zY2FHcm91cFRlbXBsYXRlKCkgeworCQlzdXBlcigpOworCisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNZW1iZXJzKCkgeworCQlyZXR1cm4gbWVtYmVyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKExpc3Q8U3RyaW5nPiBtZW1iZXJzKSB7CisJCXRoaXMubWVtYmVycyA9IG1lbWJlcnM7CisJfQorCisJcHVibGljIElUb3NjYU1ldGFkYXRhIGdldE1ldGFkYXRhKCkgeworCQlyZXR1cm4gbWV0YWRhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWV0YWRhdGEoSVRvc2NhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKwkJdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FNZXRhZGF0YS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhTWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGNkMDAyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhTWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsOworCitwdWJsaWMgY2xhc3MgVG9zY2FNZXRhZGF0YSBpbXBsZW1lbnRzIElUb3NjYU1ldGFkYXRhIHsKKwlwcml2YXRlIFN0cmluZyBpbnZhcmlhbnRVVUlEOworCXByaXZhdGUgU3RyaW5nIFVVSUQ7CisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisJcHJpdmF0ZSBTdHJpbmcgY2F0ZWdvcnk7CisJcHJpdmF0ZSBTdHJpbmcgc3ViY2F0ZWdvcnk7CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VWZW5kb3I7CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VWZW5kb3JSZWxlYXNlOworCXByaXZhdGUgQm9vbGVhbiBzZXJ2aWNlRWNvbXBOYW1pbmc7CisJcHJpdmF0ZSBCb29sZWFuIHNlcnZpY2VIb21pbmc7CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEludmFyaWFudFVVSUQoKSB7CisJCXJldHVybiBpbnZhcmlhbnRVVUlEOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEludmFyaWFudFVVSUQoU3RyaW5nIGludmFyaWFudFVVSUQpIHsKKwkJdGhpcy5pbnZhcmlhbnRVVUlEID0gaW52YXJpYW50VVVJRDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVVSUQoKSB7CisJCXJldHVybiBVVUlEOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVVSUQoU3RyaW5nIHVVSUQpIHsKKwkJVVVJRCA9IHVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdWJjYXRlZ29yeSgpIHsKKwkJcmV0dXJuIHN1YmNhdGVnb3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFN1YmNhdGVnb3J5KFN0cmluZyBzdWJjYXRlZ29yeSkgeworCQl0aGlzLnN1YmNhdGVnb3J5ID0gc3ViY2F0ZWdvcnk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVZlbmRvcigpIHsKKwkJcmV0dXJuIHJlc291cmNlVmVuZG9yOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVmVuZG9yKFN0cmluZyByZXNvdXJjZVZlbmRvcikgeworCQl0aGlzLnJlc291cmNlVmVuZG9yID0gcmVzb3VyY2VWZW5kb3I7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVZlbmRvclJlbGVhc2UoKSB7CisJCXJldHVybiByZXNvdXJjZVZlbmRvclJlbGVhc2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VWZW5kb3JSZWxlYXNlKFN0cmluZyByZXNvdXJjZVZlbmRvclJlbGVhc2UpIHsKKwkJdGhpcy5yZXNvdXJjZVZlbmRvclJlbGVhc2UgPSByZXNvdXJjZVZlbmRvclJlbGVhc2U7CisJfQorCisJcHVibGljIEJvb2xlYW4gaXNTZXJ2aWNlRWNvbXBOYW1pbmcoKSB7CisJCXJldHVybiBzZXJ2aWNlRWNvbXBOYW1pbmc7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZUVjb21wTmFtaW5nKEJvb2xlYW4gc2VydmljZUVjb21wTmFtaW5nKSB7CisJCXRoaXMuc2VydmljZUVjb21wTmFtaW5nID0gc2VydmljZUVjb21wTmFtaW5nOworCX0KKworCXB1YmxpYyBCb29sZWFuIGlzU2VydmljZUhvbWluZygpIHsKKwkJcmV0dXJuIHNlcnZpY2VIb21pbmc7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZUhvbWluZyhCb29sZWFuIHNlcnZpY2VIb21pbmcpIHsKKwkJdGhpcy5zZXJ2aWNlSG9taW5nID0gc2VydmljZUhvbWluZzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYU5vZGVUZW1wbGF0ZS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhTm9kZVRlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkN2VmNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYU5vZGVUZW1wbGF0ZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUb3NjYU5vZGVUZW1wbGF0ZSB7CisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKwlwcml2YXRlIFRvc2NhTWV0YWRhdGEgbWV0YWRhdGE7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisJcHJpdmF0ZSBMaXN0PE1hcDxTdHJpbmcsIFRvc2NhVGVtcGxhdGVSZXF1aXJlbWVudD4+IHJlcXVpcmVtZW50czsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5PiBjYXBhYmlsaXRpZXM7CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBMaXN0PE1hcDxTdHJpbmcsIFRvc2NhVGVtcGxhdGVSZXF1aXJlbWVudD4+IGdldFJlcXVpcmVtZW50cygpIHsKKwkJcmV0dXJuIHJlcXVpcmVtZW50czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlbWVudHMoTGlzdDxNYXA8U3RyaW5nLCBUb3NjYVRlbXBsYXRlUmVxdWlyZW1lbnQ+PiByZXF1aXJlbWVudHMpIHsKKwkJdGhpcy5yZXF1aXJlbWVudHMgPSByZXF1aXJlbWVudHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIFRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5PiBnZXRDYXBhYmlsaXRpZXMoKSB7CisJCXJldHVybiBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0aWVzKE1hcDxTdHJpbmcsIFRvc2NhVGVtcGxhdGVDYXBhYmlsaXR5PiBjYXBhYmlsaXRpZXMpIHsKKwkJdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIFRvc2NhTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7CisJCXJldHVybiBtZXRhZGF0YTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YShUb3NjYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisJCXRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYU5vZGVUeXBlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FOb2RlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTA3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FOb2RlVHlwZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUb3NjYU5vZGVUeXBlIHsKKwlwdWJsaWMgVG9zY2FOb2RlVHlwZSgpIHsKKwl9CisKKwlwcml2YXRlIFRvc2NhTWV0YWRhdGEgbWV0YWRhdGE7CisJcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZF9mcm9tOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBUb3NjYVByb3BlcnR5PiBwcm9wZXJ0aWVzOworCXByaXZhdGUgTWFwPFN0cmluZywgVG9zY2FDYXBhYmlsaXR5PiBjYXBhYmlsaXRpZXM7CisKKwlwcml2YXRlIExpc3Q8TWFwPFN0cmluZywgVG9zY2FSZXF1aXJlbWVudD4+IHJlcXVpcmVtZW50czsKKworCXB1YmxpYyBNYXA8U3RyaW5nLCBUb3NjYVByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFRvc2NhUHJvcGVydHk+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgVG9zY2FDYXBhYmlsaXR5PiBnZXRDYXBhYmlsaXRpZXMoKSB7CisJCXJldHVybiBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0aWVzKE1hcDxTdHJpbmcsIFRvc2NhQ2FwYWJpbGl0eT4gY2FwYWJpbGl0aWVzKSB7CisJCXRoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCX0KKworCXB1YmxpYyBMaXN0PE1hcDxTdHJpbmcsIFRvc2NhUmVxdWlyZW1lbnQ+PiBnZXRSZXF1aXJlbWVudHMoKSB7CisJCXJldHVybiByZXF1aXJlbWVudHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRzKExpc3Q8TWFwPFN0cmluZywgVG9zY2FSZXF1aXJlbWVudD4+IHJlcXVpcmVtZW50cykgeworCQl0aGlzLnJlcXVpcmVtZW50cyA9IHJlcXVpcmVtZW50czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlcml2ZWRfZnJvbSgpIHsKKwkJcmV0dXJuIGRlcml2ZWRfZnJvbTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXJpdmVkX2Zyb20oU3RyaW5nIGRlcml2ZWRfZnJvbSkgeworCQl0aGlzLmRlcml2ZWRfZnJvbSA9IGRlcml2ZWRfZnJvbTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgVG9zY2FNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKKwkJcmV0dXJuIG1ldGFkYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKFRvc2NhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKwkJdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhUHJvcGVydHkuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYVByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1YzYwYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYVByb3BlcnR5LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsOworCitwdWJsaWMgY2xhc3MgVG9zY2FQcm9wZXJ0eSB7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCXByaXZhdGUgT2JqZWN0IF9kZWZhdWx0cF87CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisJcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVkOworCXByaXZhdGUgRW50cnlTY2hlbWEgZW50cnlfc2NoZW1hOworCXByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworCXB1YmxpYyBFbnRyeVNjaGVtYSBnZXRFbnRyeV9zY2hlbWEoKSB7CisJCXJldHVybiBlbnRyeV9zY2hlbWE7CisJfQorCisJcHVibGljIHZvaWQgc2V0RW50cnlfc2NoZW1hKEVudHJ5U2NoZW1hIGVudHJ5X3NjaGVtYSkgeworCQl0aGlzLmVudHJ5X3NjaGVtYSA9IGVudHJ5X3NjaGVtYTsKKwl9CisKKwlwdWJsaWMgVG9zY2FQcm9wZXJ0eSgpIHsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRwKCkgeworCQlyZXR1cm4gX2RlZmF1bHRwXzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cChPYmplY3QgZGVmYXVsdHApIHsKKwkJdGhpcy5fZGVmYXVsdHBfID0gZGVmYXVsdHA7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0UmVxdWlyZWQoKSB7CisJCXJldHVybiByZXF1aXJlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKSB7CisJCXRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYVJlcXVpcmVtZW50LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FSZXF1aXJlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmRjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FSZXF1aXJlbWVudC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUb3NjYVJlcXVpcmVtZW50IGV4dGVuZHMgVG9zY2FUZW1wbGF0ZVJlcXVpcmVtZW50IHsKKworCXByaXZhdGUgTGlzdDxPYmplY3Q+IG9jY3VycmVuY2VzOworCisJcHVibGljIFRvc2NhUmVxdWlyZW1lbnQoKSB7CisJfQorCisJcHVibGljIExpc3Q8T2JqZWN0PiBnZXRPY2N1cnJlbmNlcygpIHsKKwkJcmV0dXJuIG9jY3VycmVuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2VzKExpc3Q8T2JqZWN0PiBvY2N1cnJlbmNlcykgeworCQl0aGlzLm9jY3VycmVuY2VzID0gb2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9NYXAoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHN1cGVyLnRvTWFwKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FUZW1wbGF0ZS5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBkNTIxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLlRyaXBsZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CisKK3B1YmxpYyBjbGFzcyBUb3NjYVRlbXBsYXRlIHsKKwlwcml2YXRlIFN0cmluZyB0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOworCXByaXZhdGUgVG9zY2FNZXRhZGF0YSBtZXRhZGF0YTsKKwlwcml2YXRlIExpc3Q8TWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4+IGltcG9ydHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBUb3NjYU5vZGVUeXBlPiBub2RlX3R5cGVzOworCXByaXZhdGUgVG9zY2FUb3BvbGd5VGVtcGxhdGUgdG9wb2xvZ3lfdGVtcGxhdGU7CisKKwlwcml2YXRlIExpc3Q8VHJpcGxlPFN0cmluZywgU3RyaW5nLCBDb21wb25lbnQ+PiBkZXBlbmRlbmNpZXM7CisKKwlwdWJsaWMgVG9zY2FUZW1wbGF0ZShTdHJpbmcgdG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbikgeworCQl0aGlzLnRvc2NhX2RlZmluaXRpb25zX3ZlcnNpb24gPSB0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBUb3NjYU5vZGVUeXBlPiBnZXROb2RlX3R5cGVzKCkgeworCQlyZXR1cm4gbm9kZV90eXBlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb2RlX3R5cGVzKE1hcDxTdHJpbmcsIFRvc2NhTm9kZVR5cGU+IG5vZGVfdHlwZXMpIHsKKwkJdGhpcy5ub2RlX3R5cGVzID0gbm9kZV90eXBlczsKKwl9CisKKwlwdWJsaWMgTGlzdDxNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+Pj4gZ2V0SW1wb3J0cygpIHsKKwkJcmV0dXJuIGltcG9ydHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW1wb3J0cyhMaXN0PE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+PiBpbXBvcnRzKSB7CisJCXRoaXMuaW1wb3J0cyA9IGltcG9ydHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3NjYV9kZWZpbml0aW9uc192ZXJzaW9uKCkgeworCQlyZXR1cm4gdG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYV9kZWZpbml0aW9uc192ZXJzaW9uKFN0cmluZyB0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uKSB7CisJCXRoaXMudG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbiA9IHRvc2NhX2RlZmluaXRpb25zX3ZlcnNpb247CisJfQorCisJcHVibGljIFRvc2NhTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7CisJCXJldHVybiBtZXRhZGF0YTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YShUb3NjYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisJCXRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKwl9CisKKwlwdWJsaWMgVG9zY2FUb3BvbGd5VGVtcGxhdGUgZ2V0VG9wb2xvZ3lfdGVtcGxhdGUoKSB7CisJCXJldHVybiB0b3BvbG9neV90ZW1wbGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3BvbG9neV90ZW1wbGF0ZShUb3NjYVRvcG9sZ3lUZW1wbGF0ZSB0b3BvbG9neV90ZW1wbGF0ZSkgeworCQl0aGlzLnRvcG9sb2d5X3RlbXBsYXRlID0gdG9wb2xvZ3lfdGVtcGxhdGU7CisJfQorCisJcHVibGljIExpc3Q8VHJpcGxlPFN0cmluZywgU3RyaW5nLCBDb21wb25lbnQ+PiBnZXREZXBlbmRlbmNpZXMoKSB7CisJCXJldHVybiBkZXBlbmRlbmNpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVwZW5kZW5jaWVzKExpc3Q8VHJpcGxlPFN0cmluZywgU3RyaW5nLCBDb21wb25lbnQ+PiBkZXBlbmRlbmNpZXMpIHsKKwkJdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FUZW1wbGF0ZUNhcGFiaWxpdHkuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYVRlbXBsYXRlQ2FwYWJpbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZGI5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FUZW1wbGF0ZUNhcGFiaWxpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgVG9zY2FUZW1wbGF0ZUNhcGFiaWxpdHkgeworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkX3NvdXJjZV90eXBlczsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsaWRfc291cmNlX3R5cGVzKCkgeworCQlyZXR1cm4gdmFsaWRfc291cmNlX3R5cGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbGlkX3NvdXJjZV90eXBlcyhMaXN0PFN0cmluZz4gdmFsaWRfc291cmNlX3R5cGVzKSB7CisJCXRoaXMudmFsaWRfc291cmNlX3R5cGVzID0gdmFsaWRfc291cmNlX3R5cGVzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FUZW1wbGF0ZVJlcXVpcmVtZW50LmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FUZW1wbGF0ZVJlcXVpcmVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiYWU4MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9Ub3NjYVRlbXBsYXRlUmVxdWlyZW1lbnQuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgVG9zY2FUZW1wbGF0ZVJlcXVpcmVtZW50IHsKKwlwcml2YXRlIFN0cmluZyBjYXBhYmlsaXR5OworCXByaXZhdGUgU3RyaW5nIG5vZGU7CisJcHJpdmF0ZSBTdHJpbmcgcmVsYXRpb25zaGlwOworCisJcHVibGljIFRvc2NhVGVtcGxhdGVSZXF1aXJlbWVudCgpIHsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWxpdHkoKSB7CisJCXJldHVybiBjYXBhYmlsaXR5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHkoU3RyaW5nIGNhcGFiaWxpdHkpIHsKKwkJdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vZGUoKSB7CisJCXJldHVybiBub2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGUoU3RyaW5nIG5vZGUpIHsKKwkJdGhpcy5ub2RlID0gbm9kZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aW9uc2hpcCgpIHsKKwkJcmV0dXJuIHJlbGF0aW9uc2hpcDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXAoU3RyaW5nIHJlbGF0aW9uc2hpcCkgeworCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b01hcCgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJRmllbGRbXSBmaWVsZHMgPSB0aGlzLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKwkJZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKwkJCW1hcC5wdXQoZmllbGQuZ2V0TmFtZSgpLCBmaWVsZC5nZXQodGhpcykpOworCQl9CisJCXJldHVybiBtYXA7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhVG9wb2xneVRlbXBsYXRlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdG9zY2EvbW9kZWwvVG9zY2FUb3BvbGd5VGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODA0YmY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1Rvc2NhVG9wb2xneVRlbXBsYXRlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFRvc2NhVG9wb2xneVRlbXBsYXRlIHsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFRvc2NhUHJvcGVydHk+IGlucHV0czsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFRvc2NhTm9kZVRlbXBsYXRlPiBub2RlX3RlbXBsYXRlczsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFRvc2NhR3JvdXBUZW1wbGF0ZT4gZ3JvdXBzOworCXByaXZhdGUgU3Vic3RpdHV0aW9uTWFwcGluZyBzdWJzdGl0dXRpb25fbWFwcGluZ3M7CisKKwlwdWJsaWMgTWFwPFN0cmluZywgVG9zY2FOb2RlVGVtcGxhdGU+IGdldE5vZGVfdGVtcGxhdGVzKCkgeworCQlyZXR1cm4gbm9kZV90ZW1wbGF0ZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9kZV90ZW1wbGF0ZXMoTWFwPFN0cmluZywgVG9zY2FOb2RlVGVtcGxhdGU+IG5vZGVfdGVtcGxhdGVzKSB7CisJCXRoaXMubm9kZV90ZW1wbGF0ZXMgPSBub2RlX3RlbXBsYXRlczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgVG9zY2FHcm91cFRlbXBsYXRlPiBnZXRHcm91cHMoKSB7CisJCXJldHVybiBncm91cHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JvdXBzKE1hcDxTdHJpbmcsIFRvc2NhR3JvdXBUZW1wbGF0ZT4gZ3JvdXBzKSB7CisJCXRoaXMuZ3JvdXBzID0gZ3JvdXBzOworCX0KKworCXB1YmxpYyBTdWJzdGl0dXRpb25NYXBwaW5nIGdldFN1YnN0aXR1dGlvbl9tYXBwaW5ncygpIHsKKwkJcmV0dXJuIHN1YnN0aXR1dGlvbl9tYXBwaW5nczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdWJzdGl0dXRpb25fbWFwcGluZ3MoU3Vic3RpdHV0aW9uTWFwcGluZyBzdWJzdGl0dXRpb25fbWFwcGluZykgeworCQl0aGlzLnN1YnN0aXR1dGlvbl9tYXBwaW5ncyA9IHN1YnN0aXR1dGlvbl9tYXBwaW5nOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBUb3NjYVByb3BlcnR5PiBnZXRJbnB1dHMoKSB7CisJCXJldHVybiBpbnB1dHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5wdXRzKE1hcDxTdHJpbmcsIFRvc2NhUHJvcGVydHk+IGlucHV0cykgeworCQl0aGlzLmlucHV0cyA9IGlucHV0czsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9WZk1vZHVsZVRvc2NhTWV0YWRhdGEuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS90b3NjYS9tb2RlbC9WZk1vZHVsZVRvc2NhTWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk3ODIyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Rvc2NhL21vZGVsL1ZmTW9kdWxlVG9zY2FNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5tb2RlbDsKKworcHVibGljIGNsYXNzIFZmTW9kdWxlVG9zY2FNZXRhZGF0YSBpbXBsZW1lbnRzIElUb3NjYU1ldGFkYXRhIHsKKworCXByaXZhdGUgU3RyaW5nIHZmTW9kdWxlTW9kZWxOYW1lOworCXByaXZhdGUgU3RyaW5nIHZmTW9kdWxlTW9kZWxJbnZhcmlhbnRVVUlEOworCXByaXZhdGUgU3RyaW5nIHZmTW9kdWxlTW9kZWxVVUlEOworCXByaXZhdGUgU3RyaW5nIHZmTW9kdWxlTW9kZWxWZXJzaW9uOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl2Zk1vZHVsZU1vZGVsTmFtZSA9IG5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCkgeworCQl2Zk1vZHVsZU1vZGVsSW52YXJpYW50VVVJRCA9IGludmFyaWFudFVVSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VVVJRChTdHJpbmcgdVVJRCkgeworCQl2Zk1vZHVsZU1vZGVsVVVJRCA9IHVVSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQl2Zk1vZHVsZU1vZGVsVmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZk1vZHVsZU1vZGVsTmFtZSgpIHsKKwkJcmV0dXJuIHZmTW9kdWxlTW9kZWxOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmZNb2R1bGVNb2RlbEludmFyaWFudFVVSUQoKSB7CisJCXJldHVybiB2Zk1vZHVsZU1vZGVsSW52YXJpYW50VVVJRDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZmTW9kdWxlTW9kZWxVVUlEKCkgeworCQlyZXR1cm4gdmZNb2R1bGVNb2RlbFVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZk1vZHVsZU1vZGVsVmVyc2lvbigpIHsKKwkJcmV0dXJuIHZmTW9kdWxlTW9kZWxWZXJzaW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3VzZXIvSVVzZXJCdXNpbmVzc0xvZ2ljLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9JVXNlckJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ZhNGExCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3VzZXIvSVVzZXJCdXNpbmVzc0xvZ2ljLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5GdW5jdGlvbmFsTWVudUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJVXNlckJ1c2luZXNzTG9naWMgeworCXB1YmxpYyBFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyKFN0cmluZyB1c2VySWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVVc2VyKFVzZXIgbW9kaWZpZXIsIFVzZXIgbmV3VXNlcik7CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVVc2VyUm9sZShVc2VyIG1vZGlmaWVyLCBTdHJpbmcgdXNlcklkVG9VcGRhdGUsIFN0cmluZyB1c2VyUm9sZSk7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8VXNlcj4sIFJlc3BvbnNlRm9ybWF0PiBnZXRBbGxBZG1pblVzZXJzKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpOworCisJcHVibGljIEVpdGhlcjxMaXN0PFVzZXI+LCBSZXNwb25zZUZvcm1hdD4gZ2V0VXNlcnNMaXN0KFN0cmluZyB1c2VySWQsIExpc3Q8U3RyaW5nPiByb2xlcywgU3RyaW5nIHJvbGVzU3RyKTsKKworCXB1YmxpYyBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGRlQWN0aXZhdGVVc2VyKFVzZXIgbW9kaWZpZXIsIFN0cmluZyB1c2VyVW5pdXFlSWRUb0RlYWN0aXZlKTsKKworCXB1YmxpYyBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IGF1dGhvcml6ZShVc2VyIGF1dGhVc2VyKTsKKworCXB1YmxpYyBFaXRoZXI8RnVuY3Rpb25hbE1lbnVJbmZvLCBBY3Rpb25TdGF0dXM+IGdldEZ1bmN0aW9uYWxNZW51KFN0cmluZyB1c2VySWQpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9Sb2xlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9Sb2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1OGVhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS91c2VyL1JvbGUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlcjsKKworLyoKKyAqIFdhcm5pbmcgY2hhbmdpbmcgdGhlIG9yZGVyIG9mIHRoZSBFbnVtIHZhcmlhYmxlcyBjaGFuZ2VzIHRoZSBvcmRpYW5sKCkgZnVuY3Rpb24gb3V0cHV0CisgKiB3aGljaCBtYXkgcmVzdWx0IGluIGVjb21wUm9sZSBpZCBjaGFuZ2UKKyAqLworcHVibGljIGVudW0gUm9sZSB7CisJQURNSU4sIFRFU1RFUiwgREVTSUdORVIsIEdPVkVSTk9SLCBPUFMsIFBST0RVQ1RfTUFOQUdFUiwgUFJPRFVDVF9TVFJBVEVHSVNUCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9Vc2VyQWRtaW5BY3Rpb24uamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS91c2VyL1VzZXJBZG1pbkFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzVlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9Vc2VyQWRtaW5BY3Rpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlcjsKKworcHVibGljIGVudW0gVXNlckFkbWluQWN0aW9uIHsKKworCUFERF9VU0VSLCBVUERBVEVfVVNFUiwgREVMRVRfVVNFUgorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9Vc2VyQWRtaW5WYWxpZGF0b3IuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS91c2VyL1VzZXJBZG1pblZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzM2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9Vc2VyQWRtaW5WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlcjsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitwdWJsaWMgY2xhc3MgVXNlckFkbWluVmFsaWRhdG9yIHsKKworCXByaXZhdGUgUGF0dGVybiBlbWFpbFBhdDsKKwlwcml2YXRlIFBhdHRlcm4gdXNlcklkUGF0OworCXByaXZhdGUgTWF0Y2hlciBtYXRjaGVyOworCisJcHJpdmF0ZSBzdGF0aWMgVXNlckFkbWluVmFsaWRhdG9yIHVzZXJBZG1pblZhbGlkYXRvciA9IG51bGw7CisKKwlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBVc2VyQWRtaW5WYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKSB7CisJCWlmICh1c2VyQWRtaW5WYWxpZGF0b3IgPT0gbnVsbCkgeworCQkJdXNlckFkbWluVmFsaWRhdG9yID0gbmV3IFVzZXJBZG1pblZhbGlkYXRvcigpOworCQl9CisJCXJldHVybiB1c2VyQWRtaW5WYWxpZGF0b3I7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMX1BBVFRFUk4gPSAiXltfQS1aYS16MC05LVxcK10rKFxcLltfQS1aYS16MC05LV0rKSpAIiArICJbQS1aYS16MC05LV0rKFxcLltBLVphLXowLTldKykqKFxcLltBLVphLXpdezIsfSkkIjsKKworCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSURfUEFUVEVSTiA9ICJbbU1dezF9WzAtOV17NX18W2EtekEtWl17Mn1bMC05XXs0fXxbYS16QS1aXXsyfVswLTldezR9fFthLXpBLVpdezJ9WzAtOV17M31bYS16QS1aXXsxfSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSURfUEFUVEVSTiA9ICJeW1xcc1xcd18uLV17MSw1MH0kIjsKKworCXByaXZhdGUgVXNlckFkbWluVmFsaWRhdG9yKCkgeworCQllbWFpbFBhdCA9IFBhdHRlcm4uY29tcGlsZShFTUFJTF9QQVRURVJOKTsKKwkJdXNlcklkUGF0ID0gUGF0dGVybi5jb21waWxlKFVTRVJfSURfUEFUVEVSTik7CisJfQorCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbWFpbChmaW5hbCBTdHJpbmcgaGV4KSB7CisJCW1hdGNoZXIgPSBlbWFpbFBhdC5tYXRjaGVyKGhleCk7CisJCXJldHVybiBtYXRjaGVyLm1hdGNoZXMoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVzZXJJZChTdHJpbmcgdXNlcklkKSB7CisJCW1hdGNoZXIgPSB1c2VySWRQYXQubWF0Y2hlcih1c2VySWQpOworCQlyZXR1cm4gbWF0Y2hlci5tYXRjaGVzKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xlKFN0cmluZyByb2xlKSB7CisJCWZvciAoUm9sZSByIDogUm9sZS52YWx1ZXMoKSkgeworCQkJaWYgKHIubmFtZSgpLmVxdWFscyhyb2xlKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXNlci9Vc2VyQnVzaW5lc3NMb2dpYy5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3VzZXIvVXNlckJ1c2luZXNzTG9naWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTkxMGZjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3VzZXIvVXNlckJ1c2luZXNzTG9naWMuamF2YQpAQCAtMCwwICsxLDcxNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAucG9ydGFsc2RrLmNvcmUub25ib2FyZGluZy51ZWIuRnVuY3Rpb25hbE1lbnU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5wb3J0YWxzZGsuY29yZS5vbmJvYXJkaW5nLnVlYi5VZWJFeGNlcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5Vc2VyU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5GdW5jdGlvbmFsTWVudUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVVzZXJBZG1pbk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5rcGkuYXBpLkFTRENLcGlBcGk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgidXNlckJ1c2luZXNzTG9naWMiKQorcHVibGljIGNsYXNzIFVzZXJCdXNpbmVzc0xvZ2ljIGltcGxlbWVudHMgSVVzZXJCdXNpbmVzc0xvZ2ljIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVc2VyQnVzaW5lc3NMb2dpYy5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIFVzZXJBZG1pblZhbGlkYXRvciB1c2VyQWRtaW5WYWxpZGF0b3IgPSBVc2VyQWRtaW5WYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgSVVzZXJBZG1pbk9wZXJhdGlvbiB1c2VyQWRtaW5PcGVyYXRpb247CisJQFJlc291cmNlCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkRhbzsKKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyKFN0cmluZyB1c2VySWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gdXNlckFkbWluT3BlcmF0aW9uLmdldFVzZXJEYXRhKHVzZXJJZCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlVXNlcihVc2VyIG1vZGlmaWVyLCBVc2VyIG5ld1VzZXIpIHsKKworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJU3RyaW5nIG1vZGlmaWVyVXNlcklkID0gbW9kaWZpZXIuZ2V0VXNlcklkKCk7CisKKwkJaWYgKG1vZGlmaWVyVXNlcklkID09IG51bGwpIHsKKwkJCW1vZGlmaWVyLnNldFVzZXJJZCgiVU5LTk9XTiIpOworCQkJbG9nLmRlYnVnKCJjcmVhdGVVc2VyIG1ldGhvZCAtICB1c2VyIGhlYWRlciBpcyBtaXNzaW5nIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTik7CisJCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5BRERfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlckNyZWF0b3IgPSBnZXRVc2VyKG1vZGlmaWVyVXNlcklkLCBmYWxzZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSB8fCBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlVXNlciBtZXRob2QgLSB1c2VyIGlzIG5vdCBsaXN0ZWQuIHVzZXJJZD17fSIsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5BRERfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCW1vZGlmaWVyID0gZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKCFtb2RpZmllci5nZXRSb2xlKCkuZXF1YWxzKFVzZXJSb2xlRW51bS5BRE1JTi5nZXROYW1lKCkpKSB7CisJCQlsb2cuZGVidWcoImNyZWF0ZVVzZXIgbWV0aG9kIC0gdXNlciBpcyBub3QgYWRtaW49e30iLCBtb2RpZmllci5nZXRVc2VySWQoKSk7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJaGFuZGxlQXVkaXRpbmcobW9kaWZpZXIsIG51bGwsIG51bGwsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uQUREX1VTRVIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQkvLyB2ZXJpZnkgdXNlciBub3QgZXhpc3QKKwkJVXNlciB1c2VyRnJvbURiID0gbmV3IFVzZXIoKTsKKwkJLy8gYm9vbGVhbiBpc1VzZXJBbHJlYWR5RXhpc3QgPSBmYWxzZTsKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyVXNlckluREIgPSBnZXRVc2VyKG5ld1VzZXIuZ2V0VXNlcklkKCksIGZhbHNlKTsKKwkJaWYgKGVpdGhlclVzZXJJbkRCLmlzUmlnaHQoKSkgeworCQkJQWN0aW9uU3RhdHVzIHN0YXR1cyA9IGVpdGhlclVzZXJJbkRCLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmICghQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5ELmVxdWFscyhzdGF0dXMpICYmICFBY3Rpb25TdGF0dXMuVVNFUl9JTkFDVElWRS5lcXVhbHMoc3RhdHVzKSkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGVpdGhlclVzZXJJbkRCLnJpZ2h0KCkudmFsdWUoKSwgbmV3VXNlci5nZXRVc2VySWQoKSk7CisJCQkJaGFuZGxlQXVkaXRpbmcobW9kaWZpZXIsIG51bGwsIG51bGwsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uQUREX1VTRVIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9IGVsc2Ugey8vIFVzZXIgZXhpc3QgaW4gREIKKwkJCXVzZXJGcm9tRGIgPSBlaXRoZXJVc2VySW5EQi5sZWZ0KCkudmFsdWUoKTsKKwkJCS8vIGlzVXNlckFscmVhZHlFeGlzdCA9IHRydWU7CisJCQlpZiAodXNlckZyb21EYi5nZXRTdGF0dXMoKSA9PSBVc2VyU3RhdHVzRW51bS5BQ1RJVkUpIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdEJ5VXNlcklkKEFjdGlvblN0YXR1cy5VU0VSX0FMUkVBRFlfRVhJU1QsIG5ld1VzZXIuZ2V0VXNlcklkKCkpOworCQkJCWxvZy5kZWJ1ZygiY3JlYXRlVXNlciBtZXRob2QgLSB1c2VyIGFscmVhZHkgZXhpc3Qgd2l0aCBpZDoge30iLCBtb2RpZmllci5nZXRVc2VySWQoKSwgdXNlckZyb21EYi5nZXRVc2VySWQoKSk7CisJCQkJaGFuZGxlQXVkaXRpbmcobW9kaWZpZXIsIG51bGwsIG51bGwsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uQUREX1VTRVIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQl9CisKKwkJbmV3VXNlci5zZXRTdGF0dXMoVXNlclN0YXR1c0VudW0uQUNUSVZFKTsKKworCQkvLyB2YWxpZGF0ZSBFbWFpbAorCQlpZiAobmV3VXNlci5nZXRFbWFpbCgpICE9IG51bGwgJiYgIXVzZXJBZG1pblZhbGlkYXRvci52YWxpZGF0ZUVtYWlsKG5ld1VzZXIuZ2V0RW1haWwoKSkpIHsKKwkJCWxvZy5kZWJ1ZygiY3JlYXRlVXNlciBtZXRob2QgLSB1c2VyIGhhcyBpbnZhbGlkIGVtYWlsPXt9IiwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfRU1BSUxfQUREUkVTUywgbmV3VXNlci5nZXRFbWFpbCgpKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9VU0VSKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJLy8gdmFsaWRhdGUgUm9sZQorCQlpZiAobmV3VXNlci5nZXRSb2xlKCkgPT0gbnVsbCB8fCBuZXdVc2VyLmdldFJvbGUoKS5sZW5ndGgoKSA9PSAwKSB7CisJCQluZXdVc2VyLnNldFJvbGUoUm9sZS5ERVNJR05FUi5uYW1lKCkpOworCQl9IGVsc2UgeworCQkJaWYgKCF1c2VyQWRtaW5WYWxpZGF0b3IudmFsaWRhdGVSb2xlKG5ld1VzZXIuZ2V0Um9sZSgpKSkgeworCQkJCWxvZy5kZWJ1ZygiY3JlYXRlVXNlciBtZXRob2QgLSB1c2VyIGhhcyBpbnZhbGlkIHJvbGU9e30iLCBtb2RpZmllci5nZXRVc2VySWQoKSk7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfUk9MRSwgbmV3VXNlci5nZXRSb2xlKCkpOworCQkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkFERF9VU0VSKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJfQorCisJCS8vIGhhbmRsZSBsYXN0IGxvZ2luIGlmIHVzZXIgaXMgaW1wb3J0CisJCWlmIChuZXdVc2VyLmdldExhc3RMb2dpblRpbWUoKSA9PSBudWxsKSB7CisJCQluZXdVc2VyLnNldExhc3RMb2dpblRpbWUoMEwpOworCQl9CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZE9yVXBkYXRlVXNlclJlcTsKKworCQlpZiAoQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUuZXF1YWxzKGVpdGhlclVzZXJJbkRCLnJpZ2h0KCkudmFsdWUoKSkpIHsgLy8gdXNlcgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZXhpc3QKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdpdGgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluYWN0aXZlCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzdGF0ZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdXBkYXRlCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB1c2VyCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkYXRhCisJCQluZXdVc2VyLnNldExhc3RMb2dpblRpbWUoMEwpOworCQkJYWRkT3JVcGRhdGVVc2VyUmVxID0gdXNlckFkbWluT3BlcmF0aW9uLnVwZGF0ZVVzZXJEYXRhKG5ld1VzZXIpOworCisJCX0gZWxzZSB7IC8vIHVzZXIgbm90IGV4aXN0IC0gY3JlYXRlIG5ldyB1c2VyCisJCQlpZiAobmV3VXNlci5nZXRVc2VySWQoKSAhPSBudWxsICYmICF1c2VyQWRtaW5WYWxpZGF0b3IudmFsaWRhdGVVc2VySWQobmV3VXNlci5nZXRVc2VySWQoKSkpIHsKKwkJCQlsb2cuZGVidWcoImNyZWF0ZVVzZXIgbWV0aG9kIC0gdXNlciBoYXMgaW52YWxpZCB1c2VySWQ9e30iLCBtb2RpZmllci5nZXRVc2VySWQoKSk7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLklOVkFMSURfVVNFUl9JRCwgbmV3VXNlci5nZXRVc2VySWQoKSk7CisJCQkJaGFuZGxlQXVkaXRpbmcobW9kaWZpZXIsIG51bGwsIG51bGwsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uQUREX1VTRVIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQkJfQorCQkJYWRkT3JVcGRhdGVVc2VyUmVxID0gdXNlckFkbWluT3BlcmF0aW9uLnNhdmVVc2VyRGF0YShuZXdVc2VyKTsKKwkJfQorCisJCWlmIChhZGRPclVwZGF0ZVVzZXJSZXEuaXNSaWdodCgpIHx8IGFkZE9yVXBkYXRlVXNlclJlcS5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoImNyZWF0ZVVzZXIgbWV0aG9kIC0gZmFpbGVkIHRvIGNyZWF0ZSB1c2VyIik7CisJCQlFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShhZGRPclVwZGF0ZVVzZXJSZXEucmlnaHQoKS52YWx1ZSgpKSkpOworCQl9CisJCWxvZy5kZWJ1ZygiY3JlYXRlVXNlciBtZXRob2QgLSB1c2VyIGNyZWF0ZWQiKTsKKwkJVXNlciBjcmVhdGVkVXNlciA9IGFkZE9yVXBkYXRlVXNlclJlcS5sZWZ0KCkudmFsdWUoKTsKKwkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLkNSRUFURUQpOworCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgY3JlYXRlZFVzZXIsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uQUREX1VTRVIpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlZFVzZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVVzZXJSb2xlKFVzZXIgbW9kaWZpZXIsIFN0cmluZyB1c2VySWRUb1VwZGF0ZSwgU3RyaW5nIHVzZXJSb2xlKSB7CisKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQ7CisJCVN0cmluZyBtb2RpZmllclVzZXJJZCA9IG1vZGlmaWVyLmdldFVzZXJJZCgpOworCisJCWlmIChtb2RpZmllclVzZXJJZCA9PSBudWxsKSB7CisJCQltb2RpZmllci5zZXRVc2VySWQoIlVOS05PV04iKTsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlVXNlclJvbGUgbWV0aG9kIC0gIHVzZXIgaGVhZGVyIGlzIG1pc3NpbmciKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLlVQREFURV9VU0VSKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyQ3JlYXRvciA9IGdldFVzZXIobW9kaWZpZXJVc2VySWQsIGZhbHNlKTsKKwkJaWYgKGVpdGhlckNyZWF0b3IuaXNSaWdodCgpIHx8IGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVVc2VyUm9sZSBtZXRob2QgLSB1c2VyIGlzIG5vdCBsaXN0ZWQuIHVzZXJJZD17fSIsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTik7CisJCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5VUERBVEVfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCW1vZGlmaWVyID0gZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKCFtb2RpZmllci5nZXRSb2xlKCkuZXF1YWxzKFVzZXJSb2xlRW51bS5BRE1JTi5nZXROYW1lKCkpKSB7CisJCQlsb2cuZGVidWcoInVwZGF0ZVVzZXJSb2xlIG1ldGhvZCAtIHVzZXIgaXMgbm90IGFkbWluLiB1c2VySWQ9e30iLCBtb2RpZmllci5nZXRVc2VySWQoKSk7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJaGFuZGxlQXVkaXRpbmcobW9kaWZpZXIsIG51bGwsIG51bGwsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uVVBEQVRFX1VTRVIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAobW9kaWZpZXIuZ2V0VXNlcklkKCkuZXF1YWxzKHVzZXJJZFRvVXBkYXRlKSkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVVc2VyUm9sZSBtZXRob2QgLSBhZG1pbiByb2xlIGNhbiBvbmx5IGJlIHVwZGF0ZWQgYnkgb3RoZXIgYWRtaW4uIHVzZXJJZD17fSIsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VUERBVEVfVVNFUl9BRE1JTl9DT05GTElDVCk7CisJCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5VUERBVEVfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IHVzZXJUb1VwZGF0ZVJlcSA9IGdldFVzZXIodXNlcklkVG9VcGRhdGUsIGZhbHNlKTsKKwkJaWYgKHVzZXJUb1VwZGF0ZVJlcS5pc1JpZ2h0KCkgfHwgdXNlclRvVXBkYXRlUmVxLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlVXNlclJvbGUgbWV0aG9kIC0gdXNlciBub3QgZm91bmQuIHVzZXJJZD17fSIsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCwgdXNlcklkVG9VcGRhdGUpOworCQkJaGFuZGxlQXVkaXRpbmcobW9kaWZpZXIsIG51bGwsIG51bGwsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uVVBEQVRFX1VTRVIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKworCQlpZiAoIXVzZXJBZG1pblZhbGlkYXRvci52YWxpZGF0ZVJvbGUodXNlclJvbGUpKSB7CisJCQlsb2cuZGVidWcoInVwZGF0ZVVzZXJSb2xlIG1ldGhvZCAtIHVzZXIgaGFzIGludmFsaWQgcm9sZT17fSIsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1JPTEUsIHVzZXJSb2xlKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLlVQREFURV9VU0VSKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJVXNlciBuZXdVc2VyID0gbmV3IFVzZXIoKTsKKwkJbmV3VXNlci5zZXRSb2xlKHVzZXJSb2xlKTsKKwkJbmV3VXNlci5zZXRVc2VySWQodXNlcklkVG9VcGRhdGUpOworCQlVc2VyIHVzZXJUb1VwZGF0ZSA9IHVzZXJUb1VwZGF0ZVJlcS5sZWZ0KCkudmFsdWUoKTsKKwkJLy8gaWYoIXVzZXJSb2xlLmVxdWFscyhVc2VyUm9sZUVudW0uQURNSU4uZ2V0TmFtZSgpKSl7IC8vdGhpcyBpcyBpbgorCQkvLyBjb21tZW50IHVudGlsIGFkbWluIHdpbGwgYmUgYWJsZSB0byBkbyBkbyBjaGVjay1pbi9jaGVjay1vdXQgZnJvbSB0aGUKKwkJLy8gVUkKKworCQlFaXRoZXI8TGlzdDxFZGdlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXNlclBlbmRpbmdUYXNrc1JlcSA9IGdldFBhbmRpbmdVc2VyUGFuZGluZ1Rhc2tzV2l0aENvbW1pdCh1c2VyVG9VcGRhdGUpOworCQlpZiAodXNlclBlbmRpbmdUYXNrc1JlcS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlVXNlclJvbGUgbWV0aG9kIC0gZmFpbGVkIHRvIGdldCB1c2VyIHBlbmRpbmcgdGFza3MgbGlzdCIsIHVzZXJJZFRvVXBkYXRlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZSh1c2VyUGVuZGluZ1Rhc2tzUmVxLnJpZ2h0KCkudmFsdWUoKSkpKTsKKwkJfQorCisJCUxpc3Q8RWRnZT4gdXNlclBlbmRpbmdUYXNrcyA9IHVzZXJQZW5kaW5nVGFza3NSZXEubGVmdCgpLnZhbHVlKCk7CisJCWlmICh1c2VyUGVuZGluZ1Rhc2tzLnNpemUoKSA+IDApIHsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlVXNlclJvbGUgbWV0aG9kIC0gVXNlciBjYW5vdCBiZSB1cGRhdGVkLCB1c2VyIGhhdmUgcGFuZGluZyBwcm9qZWN0cyIsIHVzZXJJZFRvVXBkYXRlKTsKKwkJCVN0cmluZyB1c2VyVGFza3NTdGF0dXNGb3JFcnJvck1lc3NhZ2UgPSBnZXRVc2VyUGFuZGluZ1Rhc2tTdGF0dXNCeVJvbGUoVXNlclJvbGVFbnVtLnZhbHVlT2YodXNlclRvVXBkYXRlLmdldFJvbGUoKSkpOworCQkJU3RyaW5nIHVzZXJJbmZvID0gdXNlclRvVXBkYXRlLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXNlclRvVXBkYXRlLmdldExhc3ROYW1lKCkgKyAnKCcgKyB1c2VyVG9VcGRhdGUuZ2V0VXNlcklkKCkgKyAnKSc7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ0FOTk9UX1VQREFURV9VU0VSX1dJVEhfQUNUSVZFX0VMRU1FTlRTLCB1c2VySW5mbywgdXNlclRhc2tzU3RhdHVzRm9yRXJyb3JNZXNzYWdlKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCB1c2VyVG9VcGRhdGUsIHVzZXJUb1VwZGF0ZSwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5VUERBVEVfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQkvLyB9CisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVVc2VyUmVxID0gdXNlckFkbWluT3BlcmF0aW9uLnVwZGF0ZVVzZXJEYXRhKG5ld1VzZXIpOworCisJCWlmICh1cGRhdGVVc2VyUmVxLmlzUmlnaHQoKSB8fCB1cGRhdGVVc2VyUmVxLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygidXBkYXRlVXNlciBtZXRob2QgLSBmYWlsZWQgdG8gdXBkYXRlIHVzZXIgZGF0YS4gdXNlcklkPXt9IiwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoY29tcG9uZW50c1V0aWxzLmNvbnZlcnRGcm9tU3RvcmFnZVJlc3BvbnNlKHVwZGF0ZVVzZXJSZXEucmlnaHQoKS52YWx1ZSgpKSkpOworCQl9CisKKwkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJVXNlciB1cGRhdGVkVXNlciA9IHVwZGF0ZVVzZXJSZXEubGVmdCgpLnZhbHVlKCk7CisJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCB1c2VyVG9VcGRhdGUsIHVwZGF0ZWRVc2VyLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLlVQREFURV9VU0VSKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHVwZGF0ZWRVc2VyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8VXNlcj4sIFJlc3BvbnNlRm9ybWF0PiBnZXRBbGxBZG1pblVzZXJzKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJRWl0aGVyPExpc3Q8VXNlcj4sIEFjdGlvblN0YXR1cz4gcmVzcG9uc2UgPSB1c2VyQWRtaW5PcGVyYXRpb24uZ2V0QWxsVXNlcnNXaXRoUm9sZShSb2xlLkFETUlOLm5hbWUoKSwgbnVsbCk7CisKKwkJaWYgKHJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQocmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFVzZXI+LCBSZXNwb25zZUZvcm1hdD4gZ2V0VXNlcnNMaXN0KFN0cmluZyBtb2RpZmllckF0dElkLCBMaXN0PFN0cmluZz4gcm9sZXMsIFN0cmluZyByb2xlc1N0cikgeworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJaWYgKG1vZGlmaWVyQXR0SWQgPT0gbnVsbCkgeworCQkJdXNlci5zZXRVc2VySWQoIlVOS05PV04iKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OKTsKKwkJCWhhbmRsZUdldFVzZXJzTGlzdEF1ZGl0aW5nKHVzZXIsIHJlc3BvbnNlRm9ybWF0LCByb2xlc1N0cik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiB1c2VyUmVzdWx0ID0gZ2V0VXNlcihtb2RpZmllckF0dElkLCBmYWxzZSk7CisJCWlmICh1c2VyUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJdXNlci5zZXRVc2VySWQobW9kaWZpZXJBdHRJZCk7CisJCQlpZiAodXNlclJlc3VsdC5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKEFjdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCkpIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCQkJfSBlbHNlIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdCh1c2VyUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVVc2VyTWlzc2luZ0Vycm9yLCAiR2V0IHVzZXJzIHBlciByb2xlcyIsIG1vZGlmaWVyQXR0SWQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlVXNlck1pc3NpbmdFcnJvcigiR2V0IHVzZXJzIHBlciByb2xlcyIsIG1vZGlmaWVyQXR0SWQpOworCisJCQloYW5kbGVHZXRVc2Vyc0xpc3RBdWRpdGluZyh1c2VyLCByZXNwb25zZUZvcm1hdCwgcm9sZXNTdHIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCX0KKwkJdXNlciA9IHVzZXJSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxMaXN0PFVzZXI+LCBSZXNwb25zZUZvcm1hdD4gZ2V0UmVzcG9uc2UgPSBudWxsOworCQlMaXN0PFVzZXI+IHJlc3VsdExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKSkgeworCQkJZm9yIChTdHJpbmcgcm9sZSA6IHJvbGVzKSB7CisJCQkJaWYgKCF1c2VyQWRtaW5WYWxpZGF0b3IudmFsaWRhdGVSb2xlKHJvbGUpKSB7CisJCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1JPTEUsIHJvbGUpOworCQkJCQloYW5kbGVHZXRVc2Vyc0xpc3RBdWRpdGluZyh1c2VyLCByZXNwb25zZUZvcm1hdCwgcm9sZXNTdHIpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCQl9CisJCQkJZ2V0UmVzcG9uc2UgPSBnZXRVc2Vyc1BlclJvbGUocm9sZSwgdXNlciwgcm9sZXNTdHIpOworCQkJCXJlc3VsdExpc3QuYWRkQWxsKGdldFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJvbGVzU3RyID0gIkFsbCI7CisJCQlnZXRSZXNwb25zZSA9IGdldFVzZXJzUGVyUm9sZShudWxsLCB1c2VyLCByb2xlc1N0cik7CisJCQlyZXN1bHRMaXN0LmFkZEFsbChnZXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJaGFuZGxlR2V0VXNlcnNMaXN0QXVkaXRpbmcodXNlciwgcmVzcG9uc2VGb3JtYXQsIHJvbGVzU3RyKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdExpc3QpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8VXNlcj4sIFJlc3BvbnNlRm9ybWF0PiBnZXRVc2Vyc1BlclJvbGUoU3RyaW5nIHJvbGUsIFVzZXIgdXNlciwgU3RyaW5nIHJvbGVzU3RyKSB7CisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCQlFaXRoZXI8TGlzdDxVc2VyPiwgQWN0aW9uU3RhdHVzPiByZXNwb25zZSA9IHVzZXJBZG1pbk9wZXJhdGlvbi5nZXRBbGxVc2Vyc1dpdGhSb2xlKHJvbGUsIFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQlpZiAocmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChyZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJaGFuZGxlR2V0VXNlcnNMaXN0QXVkaXRpbmcodXNlciwgcmVzcG9uc2VGb3JtYXQsIHJvbGVzU3RyKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXNwb25zZS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUdldFVzZXJzTGlzdEF1ZGl0aW5nKFVzZXIgdXNlciwgUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQsIFN0cmluZyBkZXRhaWxzKSB7CisJCWNvbXBvbmVudHNVdGlscy5hdWRpdEdldFVzZXJzTGlzdChBdWRpdGluZ0FjdGlvbkVudW0uR0VUX1VTRVJTX0xJU1QsIHVzZXIsIGRldGFpbHMsIHJlc3BvbnNlRm9ybWF0KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlQXVkaXRpbmcoVXNlciBtb2RpZmllciwgVXNlciB1c2VyQmVmb3IsIFVzZXIgdXNlckFmdGVyLCBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbk5hbWUpIHsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0QWRtaW5Vc2VyQWN0aW9uKGFjdGlvbk5hbWUsIG1vZGlmaWVyLCB1c2VyQmVmb3IsIHVzZXJBZnRlciwgcmVzcG9uc2VGb3JtYXQpOworCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVVc2VyQWNjZXNzQXVkaXRpbmcoVXNlciB1c2VyLCBSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbk5hbWUpIHsKKwkJY29tcG9uZW50c1V0aWxzLmF1ZGl0VXNlckFjY2VzcyhhY3Rpb25OYW1lLCB1c2VyLCByZXNwb25zZUZvcm1hdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gZGVBY3RpdmF0ZVVzZXIoVXNlciBtb2RpZmllciwgU3RyaW5nIHVzZXJVbml1cWVJZFRvRGVhY3RpdmUpIHsKKworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKwkJU3RyaW5nIHVzZXJJZCA9IG1vZGlmaWVyLmdldFVzZXJJZCgpOworCisJCWlmICh1c2VySWQgPT0gbnVsbCkgeworCQkJbW9kaWZpZXIuc2V0VXNlcklkKCJVTktOT1dOIik7CisJCQlsb2cuZGVidWcoImRlQWN0aXZhdGVVc2VyIG1ldGhvZCAtICB1c2VyIGhlYWRlciBpcyBtaXNzaW5nIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTik7CisJCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5ERUxFVEVfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlckNyZWF0b3IgPSBnZXRVc2VyKHVzZXJJZCwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkgfHwgZWl0aGVyQ3JlYXRvci5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoImRlQWN0aXZhdGVVc2VyIG1ldGhvZCAtIHVzZXIgaXMgbm90IGxpc3RlZC4gdXNlcklkPXt9IiwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkRFTEVURV9VU0VSKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJbW9kaWZpZXIgPSBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpOworCisJCWlmICghbW9kaWZpZXIuZ2V0Um9sZSgpLmVxdWFscyhVc2VyUm9sZUVudW0uQURNSU4uZ2V0TmFtZSgpKSkgeworCQkJbG9nLmRlYnVnKCJkZUFjdGl2YXRlVXNlciBtZXRob2QgLSB1c2VyIGlzIG5vdCBhZG1pbi4gdXNlcklkPXt9IiwgbW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfT1BFUkFUSU9OKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkRFTEVURV9VU0VSKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJaWYgKG1vZGlmaWVyLmdldFVzZXJJZCgpLmVxdWFscyh1c2VyVW5pdXFlSWRUb0RlYWN0aXZlKSkgeworCQkJbG9nLmRlYnVnKCJkZUFjdGl2YXRlVXNlciBkZUFjdGl2YXRlVXNlciAtIGFkbWluIGNhbiBvbmx5IGJlIGRlYWN0aXZhdGUgYnkgb3RoZXIgYWRtaW4uIHVzZXJJZD17fSIsIG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5ERUxFVEVfVVNFUl9BRE1JTl9DT05GTElDVCk7CisJCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5ERUxFVEVfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGdldFVzZXJUb0RlbGV0ZVJlc3BvbnNlID0gZ2V0VXNlcih1c2VyVW5pdXFlSWRUb0RlYWN0aXZlLCBmYWxzZSk7CisJCWlmIChnZXRVc2VyVG9EZWxldGVSZXNwb25zZS5pc1JpZ2h0KCkgfHwgZ2V0VXNlclRvRGVsZXRlUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJkZUFjdGl2YXRlVXNlciBtZXRob2QgLSBmYWlsZWQgdG8gZ2V0IHVzZXIgYnkgaWQge30iLCB1c2VyVW5pdXFlSWRUb0RlYWN0aXZlKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCwgdXNlclVuaXVxZUlkVG9EZWFjdGl2ZSk7CisJCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgbnVsbCwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5ERUxFVEVfVVNFUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChnZXRVc2VyVG9EZWxldGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCksIHVzZXJVbml1cWVJZFRvRGVhY3RpdmUpKTsKKwkJfQorCisJCVVzZXIgdXNlclRvRGVhY3RpdmF0ZSA9IGdldFVzZXJUb0RlbGV0ZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlpZiAodXNlclRvRGVhY3RpdmF0ZS5nZXRTdGF0dXMoKS5lcXVhbHMoVXNlclN0YXR1c0VudW0uSU5BQ1RJVkUpKSB7CisJCQlsb2cuZGVidWcoImRlQWN0aXZhdGVVc2VyIG1ldGhvZCAtIFVzZXIgYWxyZWFkeSBpbmFjdGl2ZSIsIHVzZXJVbml1cWVJZFRvRGVhY3RpdmUpOworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5ELCB1c2VyVW5pdXFlSWRUb0RlYWN0aXZlKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCBudWxsLCBudWxsLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkRFTEVURV9VU0VSKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPExpc3Q8RWRnZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVzZXJQZW5kaW5nVGFza3NSZXEgPSBnZXRQYW5kaW5nVXNlclBhbmRpbmdUYXNrc1dpdGhDb21taXQodXNlclRvRGVhY3RpdmF0ZSk7CisJCWlmICh1c2VyUGVuZGluZ1Rhc2tzUmVxLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJkZUFjdGl2YXRlVXNlciBtZXRob2QgLSBmYWlsZWQgdG8gZ2V0IHVzZXIgcGVuZGluZyB0YXNrcyBsaXN0IiwgdXNlclVuaXVxZUlkVG9EZWFjdGl2ZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChjb21wb25lbnRzVXRpbHMuY29udmVydEZyb21TdG9yYWdlUmVzcG9uc2UodXNlclBlbmRpbmdUYXNrc1JlcS5yaWdodCgpLnZhbHVlKCkpKSk7CisJCX0KKworCQlMaXN0PEVkZ2U+IHVzZXJQZW5kaW5nVGFza3MgPSB1c2VyUGVuZGluZ1Rhc2tzUmVxLmxlZnQoKS52YWx1ZSgpOworCQlpZiAodXNlclBlbmRpbmdUYXNrcy5zaXplKCkgPiAwKSB7CisJCQlsb2cuZGVidWcoImRlQWN0aXZhdGVVc2VyIG1ldGhvZCAtIFVzZXIgY2Fub3QgYmUgZGVsZXRlZCwgdXNlciBoYXZlIHBhbmRpbmcgcHJvamVjdHMiLCB1c2VyVW5pdXFlSWRUb0RlYWN0aXZlKTsKKworCQkJU3RyaW5nIHVzZXJUYXNrc1N0YXR1c0ZvckVycm9yTWVzc2FnZSA9IGdldFVzZXJQYW5kaW5nVGFza1N0YXR1c0J5Um9sZShVc2VyUm9sZUVudW0udmFsdWVPZih1c2VyVG9EZWFjdGl2YXRlLmdldFJvbGUoKSkpOworCQkJU3RyaW5nIHVzZXJJbmZvID0gdXNlclRvRGVhY3RpdmF0ZS5nZXRGaXJzdE5hbWUoKSArICIgIiArIHVzZXJUb0RlYWN0aXZhdGUuZ2V0TGFzdE5hbWUoKSArICcoJyArIHVzZXJUb0RlYWN0aXZhdGUuZ2V0VXNlcklkKCkgKyAnKSc7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuQ0FOTk9UX0RFTEVURV9VU0VSX1dJVEhfQUNUSVZFX0VMRU1FTlRTLCB1c2VySW5mbywgdXNlclRhc2tzU3RhdHVzRm9yRXJyb3JNZXNzYWdlKTsKKwkJCWhhbmRsZUF1ZGl0aW5nKG1vZGlmaWVyLCB1c2VyVG9EZWFjdGl2YXRlLCB1c2VyVG9EZWFjdGl2YXRlLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLkRFTEVURV9VU0VSKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlYWN0aXZhdGVVc2VyUmVxID0gdXNlckFkbWluT3BlcmF0aW9uLmRlQWN0aXZhdGVVc2VyKHVzZXJUb0RlYWN0aXZhdGUpOworCQlpZiAoZGVhY3RpdmF0ZVVzZXJSZXEuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImRlQWN0aXZhdGVVc2VyIG1ldGhvZCAtIGZhaWxlZCB0byBkZWFjdGl2YXRlIHVzZXIiLCB1c2VyVW5pdXFlSWRUb0RlYWN0aXZlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KGNvbXBvbmVudHNVdGlscy5jb252ZXJ0RnJvbVN0b3JhZ2VSZXNwb25zZShkZWFjdGl2YXRlVXNlclJlcS5yaWdodCgpLnZhbHVlKCkpKSk7CisJCX0KKwkJVXNlciBkZWFjdGl2YXRlVXNlciA9IGRlYWN0aXZhdGVVc2VyUmVxLmxlZnQoKS52YWx1ZSgpOworCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQloYW5kbGVBdWRpdGluZyhtb2RpZmllciwgdXNlclRvRGVhY3RpdmF0ZSwgbnVsbCwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5ERUxFVEVfVVNFUik7CisJCXJldHVybiBFaXRoZXIubGVmdChkZWFjdGl2YXRlVXNlcik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gYXV0aG9yaXplKFVzZXIgYXV0aFVzZXIpIHsKKworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdDsKKworCQlTdHJpbmcgdXNlcklkID0gYXV0aFVzZXIuZ2V0VXNlcklkKCk7CisKKwkJaWYgKHVzZXJJZCA9PSBudWxsKSB7CisJCQlhdXRoVXNlci5zZXRVc2VySWQoIlVOS05PV04iKTsKKwkJCWxvZy5kZWJ1ZygiZGVBY3RpdmF0ZVVzZXIgbWV0aG9kIC0gIHVzZXIgaGVhZGVyIGlzIG1pc3NpbmciKTsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5NSVNTSU5HX0lORk9STUFUSU9OKTsKKwkJCWhhbmRsZVVzZXJBY2Nlc3NBdWRpdGluZyhhdXRoVXNlciwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5VU0VSX0FDQ0VTUyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJfQorCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlckNyZWF0b3IgPSBnZXRVc2VyKHVzZXJJZCwgZmFsc2UpOworCQlpZiAoZWl0aGVyQ3JlYXRvci5pc1JpZ2h0KCkpIHsKKwkJCWlmIChlaXRoZXJDcmVhdG9yLnJpZ2h0KCkudmFsdWUoKSA9PSBBY3Rpb25TdGF0dXMuVVNFUl9OT1RfRk9VTkQgfHwgZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCkgPT0gQWN0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUpIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9BQ0NFU1MpOworCQkJCWhhbmRsZVVzZXJBY2Nlc3NBdWRpdGluZyhhdXRoVXNlciwgcmVzcG9uc2VGb3JtYXQsIEF1ZGl0aW5nQWN0aW9uRW51bS5VU0VSX0FDQ0VTUyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlVc2VyKGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpLCBhdXRoVXNlcikpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0KKwkJfQorCisJCVVzZXIgdXNlciA9IGVpdGhlckNyZWF0b3IubGVmdCgpLnZhbHVlKCk7CisKKwkJU3RyaW5nIGZpcnN0TmFtZSA9IGF1dGhVc2VyLmdldEZpcnN0TmFtZSgpOworCQlpZiAoZmlyc3ROYW1lICE9IG51bGwgJiYgZmlyc3ROYW1lLmlzRW1wdHkoKSA9PSBmYWxzZSAmJiAhZmlyc3ROYW1lLmVxdWFscyh1c2VyLmdldEZpcnN0TmFtZSgpKSkgeworCQkJdXNlci5zZXRGaXJzdE5hbWUoZmlyc3ROYW1lKTsKKwkJfQorCisJCVN0cmluZyBsYXN0TmFtZSA9IGF1dGhVc2VyLmdldExhc3ROYW1lKCk7CisJCWlmIChsYXN0TmFtZSAhPSBudWxsICYmIGxhc3ROYW1lLmlzRW1wdHkoKSA9PSBmYWxzZSAmJiAhbGFzdE5hbWUuZXF1YWxzKHVzZXIuZ2V0TGFzdE5hbWUoKSkpIHsKKwkJCXVzZXIuc2V0TGFzdE5hbWUobGFzdE5hbWUpOworCQl9CisKKwkJU3RyaW5nIGVtYWlsID0gYXV0aFVzZXIuZ2V0RW1haWwoKTsKKwkJaWYgKGVtYWlsICE9IG51bGwgJiYgZmFsc2UgPT0gZW1haWwuaXNFbXB0eSgpICYmICFlbWFpbC5lcXVhbHModXNlci5nZXRFbWFpbCgpKSkgeworCQkJdXNlci5zZXRFbWFpbChlbWFpbCk7CisJCX0KKworCQkvLyBsYXN0IGxvZ2luIHRpbWUgc3RhbXAgaGFuZGxlCisJCXVzZXIuc2V0TGFzdExvZ2luVGltZSgpOworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVVc2VyUmVxID0gdXNlckFkbWluT3BlcmF0aW9uLnVwZGF0ZVVzZXJEYXRhKHVzZXIpOworCisJCWlmICh1cGRhdGVVc2VyUmVxLmlzUmlnaHQoKSkgeworCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVVzZXIoZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCksIHVzZXIpOworCQkJaGFuZGxlVXNlckFjY2Vzc0F1ZGl0aW5nKHVzZXIsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uVVNFUl9BQ0NFU1MpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVVzZXIoZWl0aGVyQ3JlYXRvci5yaWdodCgpLnZhbHVlKCksIHVzZXIpKTsKKwkJfQorCisJCVVzZXIgdXBkYXRlZFVzZXIgPSB1cGRhdGVVc2VyUmVxLmxlZnQoKS52YWx1ZSgpOworCisJCUxvbmcgbGFzdExvZ2luVGltZSA9IHVzZXIuZ2V0TGFzdExvZ2luVGltZSgpOworCQlpZiAobGFzdExvZ2luVGltZSAhPSBudWxsKSB7CisJCQl1cGRhdGVkVXNlci5zZXRMYXN0TG9naW5UaW1lKGxhc3RMb2dpblRpbWUpOworCQl9IGVsc2UgeworCQkJdXBkYXRlZFVzZXIuc2V0TGFzdExvZ2luVGltZShuZXcgTG9uZygwKSk7CisJCX0KKworCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQloYW5kbGVVc2VyQWNjZXNzQXVkaXRpbmcodXBkYXRlZFVzZXIsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uVVNFUl9BQ0NFU1MpOworCQlBU0RDS3BpQXBpLmNvdW50VXNlcnNBdXRob3JpemF0aW9ucygpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQodXBkYXRlZFVzZXIpOworCX0KKworCS8qCisJICogVGhlIG1ldGhvZCB1cGRhdGVzIHVzZXIgY3JlZGVudGlhbHMgb25seSwgdGhlIHJvbGUgaXMgbmVnbGVjdGVkIFRoZSByb2xlIHVwZGF0ZWQgdGhyb3VnaCB1cGRhdGVSb2xlIG1ldGhvZAorCSAqLworCXB1YmxpYyBFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IHVwZGF0ZVVzZXJDcmVkZW50aWFscyhVc2VyIHVwZGF0ZWRVc2VyQ3JlZCkgeworCisJCVJlc3BvbnNlRm9ybWF0IHJlc3BvbnNlRm9ybWF0OworCisJCVN0cmluZyB1c2VySWQgPSB1cGRhdGVkVXNlckNyZWQuZ2V0VXNlcklkKCk7CisKKwkJaWYgKHVzZXJJZCA9PSBudWxsKSB7CisJCQl1cGRhdGVkVXNlckNyZWQuc2V0VXNlcklkKCJVTktOT1dOIik7CisJCQlsb2cuZGVidWcoInVwZGF0ZVVzZXJDcmVkZW50aWFscyBtZXRob2QgLSB1c2VyIGhlYWRlciBpcyBtaXNzaW5nIik7CisJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTik7CisJCQloYW5kbGVVc2VyQWNjZXNzQXVkaXRpbmcodXBkYXRlZFVzZXJDcmVkLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLlVTRVJfQUNDRVNTKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VGb3JtYXQpOworCQl9CisKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyQ3JlYXRvciA9IGdldFVzZXIodXNlcklkLCBmYWxzZSk7CisJCWlmIChlaXRoZXJDcmVhdG9yLmlzUmlnaHQoKSkgeworCQkJQWN0aW9uU3RhdHVzIHN0YXR1cyA9IGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBBY3Rpb25TdGF0dXMuVVNFUl9OT1RfRk9VTkQgfHwgc3RhdHVzID09IEFjdGlvblN0YXR1cy5VU0VSX0lOQUNUSVZFKSB7CisJCQkJcmVzcG9uc2VGb3JtYXQgPSBjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXQoQWN0aW9uU3RhdHVzLlJFU1RSSUNURURfQUNDRVNTKTsKKwkJCQloYW5kbGVVc2VyQWNjZXNzQXVkaXRpbmcodXBkYXRlZFVzZXJDcmVkLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLlVTRVJfQUNDRVNTKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3BvbnNlRm9ybWF0KTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzVXRpbHMuZ2V0UmVzcG9uc2VGb3JtYXRCeVVzZXIoc3RhdHVzLCB1cGRhdGVkVXNlckNyZWQpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpID09IG51bGwpIHsKKwkJCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNwb25zZUZvcm1hdCk7CisJCQl9CisJCX0KKworCQlVc2VyIHVzZXIgPSBlaXRoZXJDcmVhdG9yLmxlZnQoKS52YWx1ZSgpOworCisJCVN0cmluZyBmaXJzdE5hbWUgPSB1cGRhdGVkVXNlckNyZWQuZ2V0Rmlyc3ROYW1lKCk7CisJCWlmIChmaXJzdE5hbWUgIT0gbnVsbCAmJiBmaXJzdE5hbWUuaXNFbXB0eSgpID09IGZhbHNlICYmICFmaXJzdE5hbWUuZXF1YWxzKHVzZXIuZ2V0Rmlyc3ROYW1lKCkpKSB7CisJCQl1c2VyLnNldEZpcnN0TmFtZShmaXJzdE5hbWUpOworCQl9CisKKwkJU3RyaW5nIGxhc3ROYW1lID0gdXBkYXRlZFVzZXJDcmVkLmdldExhc3ROYW1lKCk7CisJCWlmIChsYXN0TmFtZSAhPSBudWxsICYmIGxhc3ROYW1lLmlzRW1wdHkoKSA9PSBmYWxzZSAmJiAhbGFzdE5hbWUuZXF1YWxzKHVzZXIuZ2V0TGFzdE5hbWUoKSkpIHsKKwkJCXVzZXIuc2V0TGFzdE5hbWUobGFzdE5hbWUpOworCQl9CisKKwkJU3RyaW5nIGVtYWlsID0gdXBkYXRlZFVzZXJDcmVkLmdldEVtYWlsKCk7CisJCWlmIChlbWFpbCAhPSBudWxsICYmIGZhbHNlID09IGVtYWlsLmlzRW1wdHkoKSAmJiAhZW1haWwuZXF1YWxzKHVzZXIuZ2V0RW1haWwoKSkpIHsKKwkJCXVzZXIuc2V0RW1haWwoZW1haWwpOworCQl9CisKKwkJaWYgKHVwZGF0ZWRVc2VyQ3JlZC5nZXRMYXN0TG9naW5UaW1lKCkgIT0gbnVsbCAmJiB1c2VyLmdldExhc3RMb2dpblRpbWUoKSAhPSBudWxsKSB7CisJCQlpZiAodXBkYXRlZFVzZXJDcmVkLmdldExhc3RMb2dpblRpbWUoKSA+IHVzZXIuZ2V0TGFzdExvZ2luVGltZSgpKSB7CisJCQkJdXNlci5zZXRMYXN0TG9naW5UaW1lKHVwZGF0ZWRVc2VyQ3JlZC5nZXRMYXN0TG9naW5UaW1lKCkpOworCQkJfQorCQl9IGVsc2UgaWYgKHVwZGF0ZWRVc2VyQ3JlZC5nZXRMYXN0TG9naW5UaW1lKCkgIT0gbnVsbCAmJiB1c2VyLmdldExhc3RMb2dpblRpbWUoKSA9PSBudWxsKSB7CisJCQl1c2VyLnNldExhc3RMb2dpblRpbWUodXBkYXRlZFVzZXJDcmVkLmdldExhc3RMb2dpblRpbWUoKSk7CisJCX0KKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlVXNlclJlcSA9IHVzZXJBZG1pbk9wZXJhdGlvbi51cGRhdGVVc2VyRGF0YSh1c2VyKTsKKworCQlpZiAodXBkYXRlVXNlclJlcS5pc1JpZ2h0KCkpIHsKKwkJCXJlc3BvbnNlRm9ybWF0ID0gY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlVc2VyKGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpLCB1c2VyKTsKKwkJCWhhbmRsZVVzZXJBY2Nlc3NBdWRpdGluZyh1c2VyLCByZXNwb25zZUZvcm1hdCwgQXVkaXRpbmdBY3Rpb25FbnVtLlVTRVJfQUNDRVNTKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0QnlVc2VyKGVpdGhlckNyZWF0b3IucmlnaHQoKS52YWx1ZSgpLCB1c2VyKSk7CisJCX0KKworCQlVc2VyIHVwZGF0ZWRVc2VyID0gdXBkYXRlVXNlclJlcS5sZWZ0KCkudmFsdWUoKTsKKworCQlyZXNwb25zZUZvcm1hdCA9IGNvbXBvbmVudHNVdGlscy5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuT0spOworCQloYW5kbGVVc2VyQWNjZXNzQXVkaXRpbmcodXBkYXRlZFVzZXIsIHJlc3BvbnNlRm9ybWF0LCBBdWRpdGluZ0FjdGlvbkVudW0uVVNFUl9BQ0NFU1MpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQodXBkYXRlZFVzZXIpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8RWRnZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFBhbmRpbmdVc2VyUGFuZGluZ1Rhc2tzV2l0aENvbW1pdChVc2VyIHVzZXIpIHsKKworCQlFaXRoZXI8TGlzdDxFZGdlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJVXNlclJvbGVFbnVtIHVzZXJSb2xlID0gVXNlclJvbGVFbnVtLnZhbHVlT2YodXNlci5nZXRSb2xlKCkpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlzd2l0Y2ggKHVzZXJSb2xlKSB7CisJCQljYXNlIERFU0lHTkVSOgorCQkJY2FzZSBQUk9EVUNUX1NUUkFURUdJU1Q6CisJCQljYXNlIFBST0RVQ1RfTUFOQUdFUjoKKwkJCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULm5hbWUoKSk7CisJCQkJcmV0dXJuIHVzZXJBZG1pbk9wZXJhdGlvbi5nZXRVc2VyUGFuZGluZ1Rhc2tzTGlzdCh1c2VyLCBwcm9wZXJ0aWVzKTsKKwkJCWNhc2UgVEVTVEVSOgorCQkJCXByb3BlcnRpZXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MubmFtZSgpKTsKKwkJCQlyZXR1cm4gdXNlckFkbWluT3BlcmF0aW9uLmdldFVzZXJQYW5kaW5nVGFza3NMaXN0KHVzZXIsIHByb3BlcnRpZXMpOworCQkJY2FzZSBBRE1JTjoKKwkJCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTLm5hbWUoKSk7CisJCQkJcHJvcGVydGllcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpOworCQkJCXJldHVybiB1c2VyQWRtaW5PcGVyYXRpb24uZ2V0VXNlclBhbmRpbmdUYXNrc0xpc3QodXNlciwgcHJvcGVydGllcyk7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgQXJyYXlMaXN0PD4oKSk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQkvLyBjb21taXQgd2lsbCBiZSBwZXJmb3JtIG91dHNpZGUhISEKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJnZXRVc2VyUGFuZGluZ1Rhc2tzTGlzdCBmYWlsZWQgdG8gcGVyZm9ybSBmZXRjaGluZyIpOworCQkJCXRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlclBhbmRpbmdUYXNrU3RhdHVzQnlSb2xlKFVzZXJSb2xlRW51bSByb2xlKSB7CisKKwkJc3dpdGNoIChyb2xlKSB7CisJCWNhc2UgREVTSUdORVI6CisJCWNhc2UgUFJPRFVDVF9TVFJBVEVHSVNUOgorCQljYXNlIFBST0RVQ1RfTUFOQUdFUjoKKwkJCXJldHVybiAiY2hlY2tlZC1vdXQiOworCisJCWNhc2UgVEVTVEVSOgorCQkJcmV0dXJuICJpbi1jZXJ0aWZpY2F0aW9uIjsKKwkJY2FzZSBBRE1JTjoKKwkJCXJldHVybiAiaW4tY2VydGlmaWNhdGlvbi9jaGVja2VkLW91dCI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIiI7CisJCX0KKwl9CisKKwkvKioKKwkgKiByZXR1cm4gdGhlIGZ1bmN0aW9uYWwgbWVudSBvZiBhIGdpdmVuIHVzZXIKKwkgKiAKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxGdW5jdGlvbmFsTWVudUluZm8sIEFjdGlvblN0YXR1cz4gZ2V0RnVuY3Rpb25hbE1lbnUoU3RyaW5nIHVzZXJJZCkgeworCisJCWJvb2xlYW4gdG9Db21taXQgPSBmYWxzZTsKKworCQlGdW5jdGlvbmFsTWVudUluZm8gZnVuY3Rpb25hbE1lbnVJbmZvID0gbmV3IEZ1bmN0aW9uYWxNZW51SW5mbygpOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPFVzZXIsIEZ1bmN0aW9uYWxNZW51SW5mbz4sIEFjdGlvblN0YXR1cz4gdXNlclJlc3VsdCA9IHVzZXJBZG1pbk9wZXJhdGlvbi5nZXRVc2VyRGF0YVdpdGhGdW5jdGlvbmFsTWVudSh1c2VySWQpOworCQkJaWYgKHVzZXJSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJQWN0aW9uU3RhdHVzIGFjdGlvblN0YXR1cyA9IHVzZXJSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChhY3Rpb25TdGF0dXMgPT0gQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKSB7CisJCQkJCWFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5JTlZBTElEX1VTRVJfSUQ7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYWN0aW9uU3RhdHVzKTsKKwkJCX0KKworCQkJSW1tdXRhYmxlUGFpcjxVc2VyLCBGdW5jdGlvbmFsTWVudUluZm8+IGltbXV0YWJsZVBhaXIgPSB1c2VyUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJRnVuY3Rpb25hbE1lbnVJbmZvIGN1cnJlbnRGdW5jdGlvbmFsTWVudSA9IGltbXV0YWJsZVBhaXIucmlnaHQ7CisJCQlTdHJpbmcgY3VycmVudE1lbnVTdHIgPSBjdXJyZW50RnVuY3Rpb25hbE1lbnUgIT0gbnVsbCA/IGN1cnJlbnRGdW5jdGlvbmFsTWVudS5nZXRGdW5jdGlvbmFsTWVudSgpIDogbnVsbDsKKworCQkJU3RyaW5nIGZ1bmN0aW9uYWxNZW51ID0gZ2V0RnVuY3Rpb25hbE1lbnVGcm9tVWViKHVzZXJJZCk7CisKKwkJCS8vIGZ1bmN0aW9uYWxNZW51IGNhbiBiZSBudWxsIG9yIHNpbmNlIHdlIGNhdGNoIFVlYkV4Y2VwdGlvbgorCQkJaWYgKGZ1bmN0aW9uYWxNZW51ICE9IG51bGwgJiYgZmFsc2UgPT0gZnVuY3Rpb25hbE1lbnUuaXNFbXB0eSgpKSB7CisJCQkJZnVuY3Rpb25hbE1lbnVJbmZvLnNldEZ1bmN0aW9uYWxNZW51KGZ1bmN0aW9uYWxNZW51KTsKKwkJCQlpZiAoZmFsc2UgPT0gZnVuY3Rpb25hbE1lbnUuZXF1YWxzKGN1cnJlbnRNZW51U3RyKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIHVwZGF0ZSBmdW5jdGlvbmFsIG1lbnUgb2YgdXNlciB7fS4gRnVuY3Rpb25hbCBtZW51IGlzIHt9IiwgdXNlcklkLCBmdW5jdGlvbmFsTWVudSk7CisJCQkJCXVzZXJBZG1pbk9wZXJhdGlvbi5jcmVhdGVPclVwZGF0ZUZ1bmN0aW9uYWxNZW51KHVzZXJJZCwgZnVuY3Rpb25hbE1lbnUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJU3RyaW5nIG1lbnUgPSBjdXJyZW50TWVudVN0cjsKKwkJCQlpZiAobWVudSA9PSBudWxsKSB7CisJCQkJCW1lbnUgPSAiW10iOworCQkJCX0KKwkJCQlsb2cuZGVidWcoIkZldGNoIGZ1bmN0aW9uYWwgbWVudSBmcm9tIG9sZCByZXF1ZXN0LiBGdW5jdGlvbmFsIG1lbnUgaXMge30iLCBtZW51KTsKKwkJCQlmdW5jdGlvbmFsTWVudUluZm8uc2V0RnVuY3Rpb25hbE1lbnUobWVudSk7CisJCQl9CisKKwkJCXRvQ29tbWl0ID0gdHJ1ZTsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKHRvQ29tbWl0KSB7CisJCQkJdGl0YW5EYW8uY29tbWl0KCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoZnVuY3Rpb25hbE1lbnVJbmZvKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRGdW5jdGlvbmFsTWVudUZyb21VZWIoU3RyaW5nIHVzZXJJZCkgeworCQlTdHJpbmcgZnVuY3Rpb25hbE1lbnUgPSBudWxsOworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJCZWZvcmUgY2FsbGluZyB0byBGdW5jdGlvbmFsTWVudSBtZXRob2QgZm9yIHVzZXIge30iLCB1c2VySWQpOworCQkJZnVuY3Rpb25hbE1lbnUgPSBGdW5jdGlvbmFsTWVudS5nZXQodXNlcklkKTsKKwkJCWxvZy5kZWJ1ZygiRnVuY3Rpb25hbCBtZW51IGZldGNoZWQgaXMge30iLCBmdW5jdGlvbmFsTWVudSk7CisKKwkJfSBjYXRjaCAoVWViRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoICdmdW5jdGlvbmFsIG1lbnUnIG9mIHVzZXIge30gZnJvbSBlY29tcCBwb3J0YWwodmlhIFVFQikuIHt9IiwgdXNlcklkLCBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiRmV0Y2hGdW5jdGlvbmFsTWVudSIsICJGYWlsZWQgdG8gZmV0Y2ggJ2Z1bmN0aW9uYWwgbWVudSciLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJfQorCQlyZXR1cm4gZnVuY3Rpb25hbE1lbnU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9hcGkvSUNvbW1pdEhhbmRsZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lDb21taXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwYjMzYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lDb21taXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuREJBY3Rpb25Db2RlRW51bTsKKworcHVibGljIGludGVyZmFjZSBJQ29tbWl0SGFuZGxlciBleHRlbmRzIElEQlR5cGUgeworCURCQWN0aW9uQ29kZUVudW0gZG9Db21taXQoKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lEQkFjdGlvbi5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9hcGkvSURCQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2ZTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lEQkFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpOworCitwdWJsaWMgaW50ZXJmYWNlIElEQkFjdGlvbiB7CisJPFQ+IFQgZG9BY3Rpb24oKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lEQlR5cGUuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lEQlR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE5ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9hcGkvSURCVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkRCVHlwZUVudW07CisKK3B1YmxpYyBpbnRlcmZhY2UgSURCVHlwZSB7CisJREJUeXBlRW51bSBnZXREQlR5cGUoKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lUcmFuc2FjdGlvblNkbmMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL0lUcmFuc2FjdGlvblNkbmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTEwZTkwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9hcGkvSVRyYW5zYWN0aW9uU2RuYy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRVNBcnRpZmFjdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkRCQWN0aW9uQ29kZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkRCVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkVTQWN0aW9uVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLlRyYW5zYWN0aW9uQ29kZUVudW07CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJVHJhbnNhY3Rpb25TZG5jIHsKKwlUcmFuc2FjdGlvbkNvZGVFbnVtIGZpbmlzaFRyYW5zYWN0aW9uKCk7CisKKwlFaXRoZXI8REJBY3Rpb25Db2RlRW51bSwgVHJhbnNhY3Rpb25Db2RlRW51bT4gaW52b2tlRVNBY3Rpb24oYm9vbGVhbiBpc0xhc3RBY3Rpb24sIEVTQWN0aW9uVHlwZUVudW0gZXNBY3Rpb250eXBlLCBFU0FydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEpOworCisJPFQ+IEVpdGhlcjxULCBUcmFuc2FjdGlvbkNvZGVFbnVtPiBpbnZva2VHZW5lcmFsREJBY3Rpb24oYm9vbGVhbiBpc0xhc3RBY3Rpb24sIERCVHlwZUVudW0gZGJUeXBlLCBJREJBY3Rpb24gZGJBY3Rpb24sIElEQkFjdGlvbiBkYlJvbGxiYWNrQWN0aW9uKTsKKworCTxUPiBFaXRoZXI8VCwgVHJhbnNhY3Rpb25Db2RlRW51bT4gaW52b2tlVGl0YW5BY3Rpb24oYm9vbGVhbiBpc0xhc3RBY3Rpb24sIElEQkFjdGlvbiBkYkFjdGlvbik7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL1JvbGxiYWNrSGFuZGxlci5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9hcGkvUm9sbGJhY2tIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhODA4MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL1JvbGxiYWNrSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5EQkFjdGlvbkNvZGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5Mb2dNZXNzYWdlczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5NZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUm9sbGJhY2tIYW5kbGVyIGltcGxlbWVudHMgSURCVHlwZSB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJvbGxiYWNrSGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgU3RhY2s8SURCQWN0aW9uPiBkYkFjdGlvblJvbGxiYWNrczsKKworCXByaXZhdGUgSW50ZWdlciB0cmFuc2FjdGlvbklkOworCXByaXZhdGUgU3RyaW5nIHVzZXJJZCwgYWN0aW9uVHlwZTsKKworCXByb3RlY3RlZCBSb2xsYmFja0hhbmRsZXIoSW50ZWdlciB0cmFuc2FjdGlvbklkLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgYWN0aW9uVHlwZSkgeworCQlpZiAoaXNSb2xsYmFja0ZvclBlcnNpc3RlbmNlRGF0YSgpKSB7CisJCQlkYkFjdGlvblJvbGxiYWNrcyA9IG5ldyBTdGFjazw+KCk7CisJCX0KKwkJdGhpcy50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJCXRoaXMuYWN0aW9uVHlwZSA9IGFjdGlvblR5cGU7CisJfQorCisJcHVibGljIE1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtIGFkZFJvbGxiYWNrQWN0aW9uKElEQkFjdGlvbiByb2xsYmFja0FjdGlvbikgeworCQlNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bSByZXN1bHQgPSBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bS5TVUNDRVNTOworCQlpZiAoaXNSb2xsYmFja0ZvclBlcnNpc3RlbmNlRGF0YSgpKSB7CisJCQlkYkFjdGlvblJvbGxiYWNrcy5wdXNoKHJvbGxiYWNrQWN0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IE1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtLk5PVF9BTExPV0VEOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIERCQWN0aW9uQ29kZUVudW0gZG9Sb2xsYmFjaygpIHsKKwkJREJBY3Rpb25Db2RlRW51bSByZXN1bHQ7CisKKwkJdHJ5IHsKKwkJCWlmIChpc1JvbGxiYWNrRm9yUGVyc2lzdGVuY2VEYXRhKCkpIHsKKwkJCQlyZXN1bHQgPSBkb1BlcnNpc3RlbmNlRGF0YVJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZyhMb2dNZXNzYWdlcy5ST0xMQkFDS19OT05fUEVSU0lTVEVOVF9BQ1RJT04sIGdldERCVHlwZSgpLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCQlsb2cuZGVidWcoVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX05PTl9QRVJTSVNURU5UX0FDVElPTiwgZ2V0REJUeXBlKCkubmFtZSgpLCB0cmFuc2FjdGlvbklkLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQkJCXJlc3VsdCA9IGRvTm9uUGVyc2lzdGVuY2VEYXRhUm9sbGJhY2soKTsKKwkJCX0KKwkJCWlmIChyZXN1bHQgIT0gREJBY3Rpb25Db2RlRW51bS5TVUNDRVNTKSB7CisJCQkJbG9nLmVycm9yKExvZ01lc3NhZ2VzLlJPTExCQUNLX0ZBSUxFRF9PTl9EQiwgdHJhbnNhY3Rpb25JZCwgZ2V0REJUeXBlKCkubmFtZSgpLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQkJCWxvZy5lcnJvcihUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuUk9MTEJBQ0tfRkFJTEVEX09OX0RCLCB0cmFuc2FjdGlvbklkLCBnZXREQlR5cGUoKS5uYW1lKCksIHVzZXJJZCwgYWN0aW9uVHlwZSk7CisJCQl9CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uRkFJTF9HRU5FUkFMOworCQkJbG9nLmVycm9yKExvZ01lc3NhZ2VzLlJPTExCQUNLX0ZBSUxFRF9PTl9EQl9XSVRIX0VYQ0VQVElPTiwgdHJhbnNhY3Rpb25JZCwgZ2V0REJUeXBlKCkubmFtZSgpLCBlLmdldE1lc3NhZ2UoKSwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCWxvZy5kZWJ1ZyhMb2dNZXNzYWdlcy5ST0xMQkFDS19GQUlMRURfT05fREJfV0lUSF9FWENFUFRJT04sIHRyYW5zYWN0aW9uSWQsIGdldERCVHlwZSgpLm5hbWUoKSwgZS5nZXRNZXNzYWdlKCksIHVzZXJJZCwgYWN0aW9uVHlwZSwgZSk7CisJCQlsb2cuZXJyb3IoVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX0ZBSUxFRF9PTl9EQl9XSVRIX0VYQ0VQVElPTiwgdHJhbnNhY3Rpb25JZCwgZ2V0REJUeXBlKCkubmFtZSgpLCBlLmdldE1lc3NhZ2UoKSwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSA8VD4gREJBY3Rpb25Db2RlRW51bSBkb1BlcnNpc3RlbmNlRGF0YVJvbGxiYWNrKCkgeworCQlEQkFjdGlvbkNvZGVFbnVtIHJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uU1VDQ0VTUzsKKwkJd2hpbGUgKCFkYkFjdGlvblJvbGxiYWNrcy5lbXB0eSgpKSB7CisJCQlsb2cuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIGdldERCVHlwZSgpLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCWxvZy5kZWJ1ZyhUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIGdldERCVHlwZSgpLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCUlEQkFjdGlvbiByb2xsYmFja0FjdGlvbiA9IGRiQWN0aW9uUm9sbGJhY2tzLnBvcCgpOworCQkJVCByb2xsYmFja1Jlc3VsdCA9IHJvbGxiYWNrQWN0aW9uLmRvQWN0aW9uKCk7CisJCQlpZiAoIWlzUm9sbGJhY2tSZXN1bHRWYWxpZChyb2xsYmFja1Jlc3VsdCkpIHsKKwkJCQlyZXN1bHQgPSBEQkFjdGlvbkNvZGVFbnVtLkZBSUxfR0VORVJBTDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIE92ZXJyaWRlIGZvciBzcGVjaWZpYyBsb2dpYworCSAqIAorCSAqIEBwYXJhbSA8VD4KKwkgKi8KKwlwdWJsaWMgPFQ+IGJvb2xlYW4gaXNSb2xsYmFja1Jlc3VsdFZhbGlkKFQgcm9sbGJhY2tSZXN1bHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogT3ZlcnJpZGUgZm9yIHNwZWNpZmljIGxvZ2ljCisJICovCisJcHVibGljIERCQWN0aW9uQ29kZUVudW0gZG9Ob25QZXJzaXN0ZW5jZURhdGFSb2xsYmFjaygpIHsKKwkJcmV0dXJuIERCQWN0aW9uQ29kZUVudW0uU1VDQ0VTUzsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1JvbGxiYWNrRm9yUGVyc2lzdGVuY2VEYXRhKCk7CisKKwkvKioKKwkgKiBPbmx5IFVzZWQgZm9yIFVuaXQgVGVzdHMgIQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2coTG9nZ2VyIGxvZykgeworCQlSb2xsYmFja0hhbmRsZXIubG9nID0gbG9nOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL1RyYW5zYWN0aW9uVXRpbHMuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vYXBpL1RyYW5zYWN0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTBiOTYxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9hcGkvVHJhbnNhY3Rpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpOworCitpbXBvcnQgb3JnLnNsZjRqLk1hcmtlcjsKK2ltcG9ydCBvcmcuc2xmNGouTWFya2VyRmFjdG9yeTsKKworcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zYWN0aW9uVXRpbHMgeworCisJcHJpdmF0ZSBUcmFuc2FjdGlvblV0aWxzKCkgeworCisJfQorCisJcHVibGljIGVudW0gREJUeXBlRW51bSB7CisJCUVMQVNUSUNfU0VBUkNILCBUSVRBTiwgTVlTVEVSWSwgU1dJRlQKKwl9CisKKwlwdWJsaWMgZW51bSBUcmFuc2FjdGlvbkNvZGVFbnVtIHsKKwkJUk9MTEJBQ0tfU1VDQ0VTUywgUk9MTEJBQ0tfRkFJTEVELCBTVUNDRVNTLCBDT01NSVRfRkFJTEVELCBNVUxUSVBMRV9MQVNUX0FDVElPTiwgSU5URVJOQUxfRVJST1IsIFVOQUxMT1dFRF9NRVRIT0RfVVNBR0UsIFBSRVBBUkVfUk9MTEJBQ0tfRkFJTEVELCBUUkFOU0FDVElPTl9DTE9TRUQKKwl9CisKKwlwdWJsaWMgZW51bSBUcmFuc2FjdGlvblN0YXR1c0VudW0geworCQlPUEVOLCBDTE9TRUQsIEZBSUxFRF9ST0xMQkFDSworCX0KKworCXB1YmxpYyBlbnVtIERCQWN0aW9uQ29kZUVudW0geworCQlTVUNDRVNTLCBGQUlMX0dFTkVSQUwsIEZBSUxfTVVMVElQTEVfTEFTVF9BQ1RJT04KKwl9CisKKwlwdWJsaWMgZW51bSBFU0FjdGlvblR5cGVFbnVtIHsKKwkJQUREX0FSVElGQUNULCBVUERBVEVfQVJUSUZBQ1QsIFJFTU9WRV9BUlRJRkFDVAorCX0KKworCXB1YmxpYyBlbnVtIEFjdGlvblR5cGVFbnVtIHsKKwkJQUREX0FSVElGQUNULCBSRU1PVkVfQVJUSUZBQ1QsIFVQREFURV9BUlRJRkFDVCwgQ1JFQVRFX1JFU09VUkNFLCBVUERBVEVfUkVTT1VSQ0UsIERFTEVURV9SRVNPVVJDRQorCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TSVpFX1RSQU5TQUNUSU9OX0xJU1QgPSAxMDAwOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fSURfUkVTRVRfTElNSVQgPSBNQVhfU0laRV9UUkFOU0FDVElPTl9MSVNUICogMTA7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTl9NQVJLRVJfU1RSID0gIlRSQU5TQUNUSU9OX01BUktFUiI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9VU0VSID0gInVkdW1teSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcmtlciBUUkFOU0FDVElPTl9NQVJLRVIgPSBNYXJrZXJGYWN0b3J5LmdldE1hcmtlcihUUkFOU0FDVElPTl9NQVJLRVJfU1RSKTsKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTG9nTWVzc2FnZXMgeworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfSU5WT0tFX0FDVElPTiA9ICJBYm91dCB0byBhZGQgQWN0aW9uIHRvIFNkbmNUcmFuc2FjdGlvbiBJRDp7fSBmb3IgREI6e30sIHVzZXI6e30sIGFjdGlvbjp7fSI7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVk9LRV9BQ1RJT04gPSAiaW52b2tpbmcgQWN0aW9uIGluIFNkbmNUcmFuc2FjdGlvbklEOnt9LCBvbiBEQjp7fSwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUlUX0FDVElPTl9BTExfREIgPSAiU3RhcnRpbmcgQ29tbWl0IGZvciBTZG5jVHJhbnNhY3Rpb25JRDp7fSBmb3IgYWxsIERCcywgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUlUX0FDVElPTl9TUEVDSUZJQ19EQiA9ICJTdGFydGluZyBDb21taXQgZm9yIFNkbmNUcmFuc2FjdGlvbklEOnt9IG9uIERCOnt9LCB1c2VyOnt9LCBhY3Rpb246e30iOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NSVRfT05fQ0xPU0VEX1RSQU5TQUNUSU9OID0gIkNvbW1pdCBmYWlsZWQgZm9yIFNkbmNUcmFuc2FjdGlvbklEOnt9IFRyYW5zYWN0aW9uIGlzIGluIHN0YXR1czp7fSwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX09OX0NMT1NFRF9UUkFOU0FDVElPTiA9ICJBY3Rpb24gZmFpbGVkIGZvciBTZG5jVHJhbnNhY3Rpb25JRDp7fSBUcmFuc2FjdGlvbiBpcyBhbHJlYWR5IGNsb3NlZCwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX0ZJTklTSF9GTEFHX0FDVElPTiA9ICJUcmFuc2FjdGlvbiB3aXRoIFNkbmNUcmFuc2FjdGlvbklEOnt9IG9uIERCOnt9IHdhcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBsYXN0IGFjdGlvbiBmbGFnLCB1c2VyOnt9LCBhY3Rpb246e30iOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9BQ1RJT05fRkFJTEVEX1dJVEhfRVhDRVBUSU9OID0gIkFjdGlvbiBvbiBEQjp7fSBoYXMgZmFpbGVkIGZvciBTZG5jVHJhbnNhY3Rpb25JRDp7fSwgbWVzc2FnZTp7fSwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MTEJBQ0tfU1VDQ0VFREVEX0dFTkVSQUwgPSAiVHJhbnNhY3Rpb24gcm9sbGJhY2sgc3VjY2VlZGVkIGZvciBTZG5jVHJhbnNhY3Rpb25JRDp7fSwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MTEJBQ0tfRkFJTEVEX0dFTkVSQUwgPSAiVHJhbnNhY3Rpb24gcm9sbGJhY2sgZmFpbGVkIGZvciBTZG5jVHJhbnNhY3Rpb25JRDp7fSwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MTEJBQ0tfRkFJTEVEX09OX0RCID0gIlRyYW5zYWN0aW9uIHJvbGxiYWNrIGZhaWxlZCBmb3IgU2RuY1RyYW5zYWN0aW9uSUQ6e30gb24gREI6e30sIHVzZXI6e30sIGFjdGlvbjp7fSI7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTExCQUNLX0ZBSUxFRF9PTl9EQl9XSVRIX0VYQ0VQVElPTiA9ICJUcmFuc2FjdGlvbiByb2xsYmFjayBmYWlsZWQgZm9yIFNkbmNUcmFuc2FjdGlvbklEOnt9IG9uIERCOnt9LCBleGNlcHRpb24gbWVzc2FnZTp7fSwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04gPSAiQWJvdXQgVG8gUm9sbGJhY2sgQWN0aW9uIG9uIERCe30gZm9yIFRyYW5zYWN0aW9uSUQ6e30gLi4uIHVzZXI6e30sIGFjdGlvbjp7fSI7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTExCQUNLX05PTl9QRVJTSVNURU5UX0FDVElPTiA9ICJBYm91dCBUbyBSb2xsYmFjayBBY3Rpb25zIG9uIERCe30gZm9yIFRyYW5zYWN0aW9uSUQ6e30gLi4uICB1c2VyOnt9LCBhY3Rpb246e30iOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUk9MTEJBQ0tfSEFORExFUiA9ICJjcmVhdGluZyBuZXcgUm9sbGJhY2sgSGFuZGxlciBGb3IgREI6e30gaW4gU2RuY1RyYW5zYWN0aW9uIElEOnt9LCB1c2VyOnt9LCBhY3Rpb246e30iOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMRURfQ1JFQVRFX1JPTExCQUNLID0gImZhaWxlZCB0byBjcmVhdGUgbmV3IFJvbGxiYWNrIGFjdGlvbiBGb3IgREI6e30gd2l0aCBTZG5jVHJhbnNhY3Rpb25JRDp7fSwgdXNlcjp7fSwgYWN0aW9uOnt9IjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vaW1wbC9FU0FjdGlvbi5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9pbXBsL0VTQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhOGQxMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vaW1wbC9FU0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uaW1wbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsLkVTQ2F0YWxvZ0RBTzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZXhjZXB0aW9uLlJlc291cmNlREFPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuSURCQWN0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5EQkFjdGlvbkNvZGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5FU0FjdGlvblR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgRVNBY3Rpb24gaW1wbGVtZW50cyBJREJBY3Rpb24geworCisJcHJpdmF0ZSBFU0NhdGFsb2dEQU8gZXNDYXRhbG9nRGFvOworCXByaXZhdGUgRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhOworCXByaXZhdGUgRVNBY3Rpb25UeXBlRW51bSBlc0FjdGlvblR5cGU7CisKKwlwdWJsaWMgRVNBY3Rpb24oRVNDYXRhbG9nREFPIGVzQ2F0YWxvZ0RhbywgRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhLCBFU0FjdGlvblR5cGVFbnVtIGVzQWN0aW9udHlwZSkgeworCQl0aGlzLmVzQ2F0YWxvZ0RhbyA9IGVzQ2F0YWxvZ0RhbzsKKwkJdGhpcy5hcnRpZmFjdERhdGEgPSBhcnRpZmFjdERhdGE7CisJCXRoaXMuZXNBY3Rpb25UeXBlID0gZXNBY3Rpb250eXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEQkFjdGlvbkNvZGVFbnVtIGRvQWN0aW9uKCkgeworCQlEQkFjdGlvbkNvZGVFbnVtIHJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uU1VDQ0VTUzsKKwkJdHJ5IHsKKwkJCWlmIChlc0FjdGlvblR5cGUgPT0gRVNBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QgfHwgZXNBY3Rpb25UeXBlID09IEVTQWN0aW9uVHlwZUVudW0uVVBEQVRFX0FSVElGQUNUKSB7CisJCQkJZXNDYXRhbG9nRGFvLndyaXRlQXJ0aWZhY3QoYXJ0aWZhY3REYXRhKTsKKwkJCX0gZWxzZSBpZiAoZXNBY3Rpb25UeXBlID09IEVTQWN0aW9uVHlwZUVudW0uUkVNT1ZFX0FSVElGQUNUKSB7CisJCQkJZXNDYXRhbG9nRGFvLmRlbGV0ZUFydGlmYWN0KGFydGlmYWN0RGF0YS5nZXRJZCgpKTsKKwkJCX0KKworCQl9IGNhdGNoIChSZXNvdXJjZURBT0V4Y2VwdGlvbiBkYW9FeGNlcHRpb24pIHsKKwkJCXJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uRkFJTF9HRU5FUkFMOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL2ltcGwvRVNSb2xsYmFja0hhbmRsZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vaW1wbC9FU1JvbGxiYWNrSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZmIwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL2ltcGwvRVNSb2xsYmFja0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLlJlc291cmNlVXBsb2FkU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsLkVTQ2F0YWxvZ0RBTzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlJvbGxiYWNrSGFuZGxlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuREJBY3Rpb25Db2RlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuREJUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuRVNBY3Rpb25UeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5NZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgRVNSb2xsYmFja0hhbmRsZXIgZXh0ZW5kcyBSb2xsYmFja0hhbmRsZXIgeworCisJcHVibGljIEVTUm9sbGJhY2tIYW5kbGVyKEludGVnZXIgdHJhbnNhY3Rpb25JZCwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGFjdGlvblR5cGUpIHsKKwkJc3VwZXIodHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwl9CisKKwlwdWJsaWMgREJUeXBlRW51bSBnZXREQlR5cGUoKSB7CisJCXJldHVybiBEQlR5cGVFbnVtLkVMQVNUSUNfU0VBUkNIOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzUm9sbGJhY2tGb3JQZXJzaXN0ZW5jZURhdGEoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUm9sbGJhY2tSZXN1bHRWYWxpZChEQkFjdGlvbkNvZGVFbnVtIHJvbGxiYWNrUmVzdWx0KSB7CisJCXJldHVybiByb2xsYmFja1Jlc3VsdCA9PSBEQkFjdGlvbkNvZGVFbnVtLlNVQ0NFU1M7CisJfQorCisJcHVibGljIEVpdGhlcjxFU0FjdGlvbiwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IGJ1aWxkRXNSb2xsYmFja0FjdGlvbihFU0NhdGFsb2dEQU8gZXNDYXRhbG9nRGFvLCBFU0FydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEsIEVTQWN0aW9uVHlwZUVudW0gZXNBY3Rpb250eXBlKSB7CisJCUVpdGhlcjxFU0FjdGlvbiwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IHJlc3VsdDsKKworCQl0cnkgeworCQkJRVNBY3Rpb24gZXNSb2xsYmFja0FjdGlvbiA9IG51bGw7CisJCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPiBlaXRoZXIgPSBlc0NhdGFsb2dEYW8uZ2V0QXJ0aWZhY3QoYXJ0aWZhY3REYXRhLmdldElkKCkpOworCisJCQlzd2l0Y2ggKGVzQWN0aW9udHlwZSkgeworCQkJY2FzZSBBRERfQVJUSUZBQ1Q6CisKKwkJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSAmJiBlaXRoZXIucmlnaHQoKS52YWx1ZSgpID09IFJlc291cmNlVXBsb2FkU3RhdHVzLk5PVF9FWElTVCkgeworCQkJCQllc1JvbGxiYWNrQWN0aW9uID0gbmV3IEVTQWN0aW9uKGVzQ2F0YWxvZ0RhbywgYXJ0aWZhY3REYXRhLCBFU0FjdGlvblR5cGVFbnVtLlJFTU9WRV9BUlRJRkFDVCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBSRU1PVkVfQVJUSUZBQ1Q6CisJCQkJaWYgKGVpdGhlci5pc0xlZnQoKSkgeworCQkJCQllc1JvbGxiYWNrQWN0aW9uID0gbmV3IEVTQWN0aW9uKGVzQ2F0YWxvZ0RhbywgYXJ0aWZhY3REYXRhLCBFU0FjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBVUERBVEVfQVJUSUZBQ1Q6CisKKwkJCQlpZiAoZWl0aGVyLmlzTGVmdCgpKSB7CisJCQkJCUVTQXJ0aWZhY3REYXRhIG9yaWdpbmFsQXJ0aWZhY3REYXRhID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJCQllc1JvbGxiYWNrQWN0aW9uID0gbmV3IEVTQWN0aW9uKGVzQ2F0YWxvZ0Rhbywgb3JpZ2luYWxBcnRpZmFjdERhdGEsIEVTQWN0aW9uVHlwZUVudW0uVVBEQVRFX0FSVElGQUNUKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJCWlmIChlc1JvbGxiYWNrQWN0aW9uICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChlc1JvbGxiYWNrQWN0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KE1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtLkZBSUxFRCk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0uRkFJTEVEKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL2ltcGwvVGl0YW5Db21taXRIYW5kbGVyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL2ltcGwvVGl0YW5Db21taXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyZWMzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vaW1wbC9UaXRhbkNvbW1pdEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLklDb21taXRIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5EQkFjdGlvbkNvZGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5EQlR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgVGl0YW5Db21taXRIYW5kbGVyIGltcGxlbWVudHMgSUNvbW1pdEhhbmRsZXIgeworCisJcHJpdmF0ZSBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCisJcHVibGljIFRpdGFuQ29tbWl0SGFuZGxlcihUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEQkFjdGlvbkNvZGVFbnVtIGRvQ29tbWl0KCkgeworCQlEQkFjdGlvbkNvZGVFbnVtIHJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uU1VDQ0VTUzsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5TdGF0dXMgPSB0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCWlmICh0aXRhblN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmVzdWx0ID0gREJBY3Rpb25Db2RlRW51bS5GQUlMX0dFTkVSQUw7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgREJUeXBlRW51bSBnZXREQlR5cGUoKSB7CisJCXJldHVybiBEQlR5cGVFbnVtLlRJVEFOOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9pbXBsL1RpdGFuUm9sbGJhY2tIYW5kbGVyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL2ltcGwvVGl0YW5Sb2xsYmFja0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM2ODY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9pbXBsL1RpdGFuUm9sbGJhY2tIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5pbXBsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5Sb2xsYmFja0hhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkRCQWN0aW9uQ29kZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkRCVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBUaXRhblJvbGxiYWNrSGFuZGxlciBleHRlbmRzIFJvbGxiYWNrSGFuZGxlciB7CisKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlwdWJsaWMgVGl0YW5Sb2xsYmFja0hhbmRsZXIoSW50ZWdlciB0cmFuc2FjdGlvbklkLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgYWN0aW9uVHlwZSwgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbykgeworCQlzdXBlcih0cmFuc2FjdGlvbklkLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQl0aGlzLnRpdGFuR2VuZXJpY0RhbyA9IHRpdGFuR2VuZXJpY0RhbzsKKwl9CisKKwlwdWJsaWMgREJUeXBlRW51bSBnZXREQlR5cGUoKSB7CisJCXJldHVybiBEQlR5cGVFbnVtLlRJVEFOOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzUm9sbGJhY2tGb3JQZXJzaXN0ZW5jZURhdGEoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgREJBY3Rpb25Db2RlRW51bSBkb05vblBlcnNpc3RlbmNlRGF0YVJvbGxiYWNrKCkgeworCQlEQkFjdGlvbkNvZGVFbnVtIHJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uU1VDQ0VTUzsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5TdGF0dXMgPSB0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJaWYgKHRpdGFuU3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXN1bHQgPSBEQkFjdGlvbkNvZGVFbnVtLkZBSUxfR0VORVJBTDsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9tbmdyL0NvbW1pdE1hbmFnZXIuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9Db21taXRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwMmU1OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9Db21taXRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5tbmdyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuSUNvbW1pdEhhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5EQkFjdGlvbkNvZGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5Mb2dNZXNzYWdlczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgQ29tbWl0TWFuYWdlciB7CisJcHJpdmF0ZSBMaXN0PElDb21taXRIYW5kbGVyPiBjb21taXRIYW5kbGVyczsKKwlwcml2YXRlIEludGVnZXIgdHJhbnNhY3Rpb25JZDsKKwlwcml2YXRlIFN0cmluZyB1c2VySWQsIGFjdGlvblR5cGU7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbW1pdE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUNvbW1pdE1hbmFnZXIoSW50ZWdlciB0cmFuc2FjdGlvbklkLCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgYWN0aW9uVHlwZSwgTGlzdDxJQ29tbWl0SGFuZGxlcj4gY29tbWl0SGFuZGxlcnMpIHsKKwkJdGhpcy5jb21taXRIYW5kbGVycyA9IGNvbW1pdEhhbmRsZXJzOworCQl0aGlzLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworCQl0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKwkJdGhpcy5hY3Rpb25UeXBlID0gYWN0aW9uVHlwZTsKKworCX0KKworCXB1YmxpYyBEQkFjdGlvbkNvZGVFbnVtIHRyYW5zYWN0aW9uQ29tbWl0KCkgeworCQlsb2cuZGVidWcoTG9nTWVzc2FnZXMuQ09NTUlUX0FDVElPTl9BTExfREIsIHRyYW5zYWN0aW9uSWQsIHVzZXJJZCwgYWN0aW9uVHlwZSk7CisJCURCQWN0aW9uQ29kZUVudW0gY29tbWl0UmVzdWx0ID0gREJBY3Rpb25Db2RlRW51bS5TVUNDRVNTOworCQlJQ29tbWl0SGFuZGxlciBsYXN0SGFuZGxlciA9IG51bGw7CisJCXRyeSB7CisJCQlmb3IgKElDb21taXRIYW5kbGVyIGhhbmRsZXIgOiBjb21taXRIYW5kbGVycykgeworCQkJCWxhc3RIYW5kbGVyID0gaGFuZGxlcjsKKwkJCQlsb2cuZGVidWcoTG9nTWVzc2FnZXMuQ09NTUlUX0FDVElPTl9TUEVDSUZJQ19EQiwgdHJhbnNhY3Rpb25JZCwgaGFuZGxlci5nZXREQlR5cGUoKS5uYW1lKCksIHVzZXJJZCwgYWN0aW9uVHlwZSk7CisJCQkJREJBY3Rpb25Db2RlRW51bSBjb21taXRDb2RlID0gaGFuZGxlci5kb0NvbW1pdCgpOworCQkJCWlmIChjb21taXRDb2RlID09IERCQWN0aW9uQ29kZUVudW0uRkFJTF9HRU5FUkFMKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAidHJhbnNhY3Rpb25Db21taXQgb24gREIgIiArIGhhbmRsZXIuZ2V0REJUeXBlKCkubmFtZSgpKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoInRyYW5zYWN0aW9uQ29tbWl0IG9uIERCICIgKyBoYW5kbGVyLmdldERCVHlwZSgpLm5hbWUoKSk7CisJCQkJCWxvZy5kZWJ1ZygiQ29tbWl0IGZhaWxlZCBmb3IgU2RuY1RyYW5zYWN0aW9uSUQ6e30gb24gREI6e30iLCB0cmFuc2FjdGlvbklkLCBoYW5kbGVyLmdldERCVHlwZSgpLm5hbWUoKSk7CisJCQkJCWNvbW1pdFJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uRkFJTF9HRU5FUkFMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbG9nLmRlYnVnKCJDb21taXQgc3VjY2VlZGVkIGZvciBTZG5jVHJhbnNhY3Rpb25JRDp7fSBvbiBEQjp7fSIsIHRyYW5zYWN0aW9uSWQsIGhhbmRsZXIuZ2V0REJUeXBlKCkubmFtZSgpKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAidHJhbnNhY3Rpb25Db21taXQgLSBvbiBEQiAiICsgZ2V0REJOYW1lKGxhc3RIYW5kbGVyKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigidHJhbnNhY3Rpb25Db21taXQgLSBvbiBEQiAiICsgZ2V0REJOYW1lKGxhc3RIYW5kbGVyKSk7CisJCQlsb2cuZGVidWcoIkNvbW1pdCBmYWlsZWQgZm9yIFNkbmNUcmFuc2FjdGlvbklEOnt9IG9uIERCOnt9LCBFeGNlcHRpb24gbWVzc2FnZTp7fSIsIHRyYW5zYWN0aW9uSWQsIGdldERCTmFtZShsYXN0SGFuZGxlciksIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCWxvZy5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCAiQ29tbWl0IGZhaWxlZCBmb3IgU2RuY1RyYW5zYWN0aW9uSUQ6e30gb24gREI6e30iLCB0cmFuc2FjdGlvbklkLCBnZXREQk5hbWUobGFzdEhhbmRsZXIpKTsKKwkJCWNvbW1pdFJlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uRkFJTF9HRU5FUkFMOworCQl9CisJCXJldHVybiBjb21taXRSZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0REJOYW1lKElDb21taXRIYW5kbGVyIGxhc3RIYW5kbGVyKSB7CisJCVN0cmluZyBkYk5hbWUgPSAiVW5rbm93biI7CisJCWlmIChsYXN0SGFuZGxlciAhPSBudWxsKSB7CisJCQlkYk5hbWUgPSBsYXN0SGFuZGxlci5nZXREQlR5cGUoKS5uYW1lKCk7CisJCX0KKwkJcmV0dXJuIGRiTmFtZTsKKwl9CisKKwlzdGF0aWMgdm9pZCBzZXRMb2coTG9nZ2VyIGxvZykgeworCQlDb21taXRNYW5hZ2VyLmxvZyA9IGxvZzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL21uZ3IvUm9sbGJhY2tNYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL21uZ3IvUm9sbGJhY2tNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0MTUyNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9Sb2xsYmFja01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5tbmdyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlJvbGxiYWNrSGFuZGxlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuREJBY3Rpb25Db2RlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuREJUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5NZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgUm9sbGJhY2tNYW5hZ2VyIHsKKwlwcml2YXRlIE1hcDxEQlR5cGVFbnVtLCBSb2xsYmFja0hhbmRsZXI+IHJvbGxCYWNrSGFuZGxlcnNNYXA7CisJcHJpdmF0ZSBJbnRlZ2VyIHRyYW5zYWN0aW9uSWQ7CisJcHJpdmF0ZSBTdHJpbmcgdXNlcklkLCBhY3Rpb25UeXBlOworCisJUm9sbGJhY2tNYW5hZ2VyKEludGVnZXIgdHJhbnNhY3Rpb25JZCwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGFjdGlvblR5cGUsIExpc3Q8Um9sbGJhY2tIYW5kbGVyPiByb2xlQmFja0hhbmRsZXJzKSB7CisJCXRoaXMudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCQl0aGlzLmFjdGlvblR5cGUgPSBhY3Rpb25UeXBlOworCQlyb2xsQmFja0hhbmRsZXJzTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKFJvbGxiYWNrSGFuZGxlciBoYW5kbGVyIDogcm9sZUJhY2tIYW5kbGVycykgeworCQkJcm9sbEJhY2tIYW5kbGVyc01hcC5wdXQoaGFuZGxlci5nZXREQlR5cGUoKSwgaGFuZGxlcik7CisJCX0KKworCX0KKworCXB1YmxpYyBEQkFjdGlvbkNvZGVFbnVtIHRyYW5zYWN0aW9uUm9sbGJhY2soKSB7CisJCURCQWN0aW9uQ29kZUVudW0gcm9sbGJhY2tSZXN1bHQgPSBEQkFjdGlvbkNvZGVFbnVtLlNVQ0NFU1M7CisJCUl0ZXJhdG9yPFJvbGxiYWNrSGFuZGxlcj4gaGFuZGxlcnNJdHIgPSByb2xsQmFja0hhbmRsZXJzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChoYW5kbGVyc0l0ci5oYXNOZXh0KCkpIHsKKwkJCVJvbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaGFuZGxlcnNJdHIubmV4dCgpOworCQkJREJBY3Rpb25Db2RlRW51bSByb2xsYmFja0NvZGUgPSBoYW5kbGVyLmRvUm9sbGJhY2soKTsKKwkJCWlmIChyb2xsYmFja0NvZGUgPT0gREJBY3Rpb25Db2RlRW51bS5GQUlMX0dFTkVSQUwpIHsKKwkJCQlyb2xsYmFja1Jlc3VsdCA9IERCQWN0aW9uQ29kZUVudW0uRkFJTF9HRU5FUkFMOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJvbGxiYWNrUmVzdWx0OworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Um9sbGJhY2tIYW5kbGVyLCBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bT4gYWRkUm9sbGJhY2tIYW5kbGVyKFJvbGxiYWNrSGFuZGxlciByb2xsYmFja0hhbmRsZXIpIHsKKwkJRWl0aGVyPFJvbGxiYWNrSGFuZGxlciwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IHJlc3VsdDsKKwkJaWYgKHJvbGxCYWNrSGFuZGxlcnNNYXAuY29udGFpbnNLZXkocm9sbGJhY2tIYW5kbGVyLmdldERCVHlwZSgpKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KE1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtLk5PVF9BTExPV0VEKTsKKwkJfSBlbHNlIHsKKwkJCXJvbGxCYWNrSGFuZGxlcnNNYXAucHV0KHJvbGxiYWNrSGFuZGxlci5nZXREQlR5cGUoKSwgcm9sbGJhY2tIYW5kbGVyKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHJvbGxiYWNrSGFuZGxlcik7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Um9sbGJhY2tIYW5kbGVyLCBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bT4gY3JlYXRlUm9sbGJhY2tIYW5kbGVyKERCVHlwZUVudW0gZGJUeXBlKSB7CisKKwkJZmluYWwgREJUeXBlRW51bSBkYlR5cGVGaW5hbCA9IGRiVHlwZTsKKwkJUm9sbGJhY2tIYW5kbGVyIHJvbGxiYWNrSGFuZGxlciA9IG5ldyBSb2xsYmFja0hhbmRsZXIodHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIERCVHlwZUVudW0gZ2V0REJUeXBlKCkgeworCQkJCXJldHVybiBkYlR5cGVGaW5hbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JvbGxiYWNrRm9yUGVyc2lzdGVuY2VEYXRhKCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCQlFaXRoZXI8Um9sbGJhY2tIYW5kbGVyLCBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bT4gcmVzdWx0ID0gYWRkUm9sbGJhY2tIYW5kbGVyKHJvbGxiYWNrSGFuZGxlcik7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPFJvbGxiYWNrSGFuZGxlciwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IGdldFJvbGxiYWNrSGFuZGxlcihEQlR5cGVFbnVtIGRiVHlwZSkgeworCQlFaXRoZXI8Um9sbGJhY2tIYW5kbGVyLCBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bT4gcmVzdWx0OworCQlpZiAocm9sbEJhY2tIYW5kbGVyc01hcC5jb250YWluc0tleShkYlR5cGUpKSB7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChyb2xsQmFja0hhbmRsZXJzTWFwLmdldChkYlR5cGUpKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bS5OT1RfRk9VTkQpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL21uZ3IvVHJhbnNhY3Rpb25NYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3RyYW5zYWN0aW9uL21uZ3IvVHJhbnNhY3Rpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMTU4NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9UcmFuc2FjdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLm1uZ3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uaW1wbC5FU0NhdGFsb2dEQU87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5DYXBMaXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuSVRyYW5zYWN0aW9uU2RuYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkFjdGlvblR5cGVFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworQENvbXBvbmVudCgidHJhbnNhY3Rpb25NYW5hZ2VyIikKK3B1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbk1hbmFnZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYW5zYWN0aW9uTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIHRyYW5zYWN0aW9uSURDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKwlwcml2YXRlIExpc3Q8SVRyYW5zYWN0aW9uU2RuYz4gdHJhbnNhY3Rpb25zOworCUBSZXNvdXJjZQorCXByaXZhdGUgRVNDYXRhbG9nREFPIGVzQ2F0YWxvZ0RhbzsKKwlAUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwkvKioKKwkgKiB1c2VySWQgYW5kIGFjdGlvblR5cGUgcGFyYW1ldGVycyBhcmUgdXNlZCBvbmx5IGZvciBsb2dnaW5nIHB1cnBvc2VzLgorCSAqLworCXB1YmxpYyBJVHJhbnNhY3Rpb25TZG5jIGdldFRyYW5zYWN0aW9uKFN0cmluZyB1c2VySWQsIEFjdGlvblR5cGVFbnVtIGFjdGlvblR5cGUpIHsKKwkJaWYgKHRyYW5zYWN0aW9ucyA9PSBudWxsKSB7CisJCQlpbml0KCk7CisJCX0KKwkJbG9nLmRlYnVnKCJUcmFuc2FjdGlvbk1hbmFnZXIgY3JlYXRpbmcgbmV3IFNkbmNUcmFuc2FjdGlvbiIpOworCQlJVHJhbnNhY3Rpb25TZG5jIHR4ID0gbmV3IFRyYW5zYWN0aW9uU2RuY0ltcGwoZ2VuZXJhdGVUcmFuc2FjdGlvbklEKCksIHVzZXJJZCwgYWN0aW9uVHlwZSwgZXNDYXRhbG9nRGFvLCB0aXRhbkdlbmVyaWNEYW8pOworCQl0cmFuc2FjdGlvbnMuYWRkKHR4KTsKKworCQlyZXR1cm4gdHg7CisKKwl9CisKKwlwcml2YXRlIEludGVnZXIgZ2VuZXJhdGVUcmFuc2FjdGlvbklEKCkgeworCQlib29sZWFuIGdlbmVyYXRlZFN1Y2Nlc3NmdWxseSA9IGZhbHNlOworCQlpbnQgbmV4dElkID0gMDsKKworCQl3aGlsZSAoIWdlbmVyYXRlZFN1Y2Nlc3NmdWxseSkgeworCQkJaW50IHByZXZJZCA9IHRyYW5zYWN0aW9uSURDb3VudGVyLmdldCgpOworCQkJaWYgKHByZXZJZCA+IFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fSURfUkVTRVRfTElNSVQpIHsKKwkJCQlyZXNldFRyYW5zYWN0aW9uSWQoKTsKKwkJCX0KKwkJCW5leHRJZCA9IHByZXZJZCArIDE7CisJCQlnZW5lcmF0ZWRTdWNjZXNzZnVsbHkgPSB0cmFuc2FjdGlvbklEQ291bnRlci5jb21wYXJlQW5kU2V0KHByZXZJZCwgbmV4dElkKTsKKwkJfQorCQlyZXR1cm4gbmV4dElkOworCX0KKworCXByaXZhdGUgdm9pZCByZXNldFRyYW5zYWN0aW9uSWQoKSB7CisKKwkJYm9vbGVhbiByZXNldFN1Y2Nlc3NmdWxseSA9IGZhbHNlOworCQl3aGlsZSAoIXJlc2V0U3VjY2Vzc2Z1bGx5KSB7CisJCQlpbnQgcHJldklkID0gdHJhbnNhY3Rpb25JRENvdW50ZXIuZ2V0KCk7CisJCQlyZXNldFN1Y2Nlc3NmdWxseSA9IHRyYW5zYWN0aW9uSURDb3VudGVyLmNvbXBhcmVBbmRTZXQocHJldklkLCAwKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0KCkgeworCQlpZiAodHJhbnNhY3Rpb25zID09IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJUcmFuc2FjdGlvbk1hbmFnZXIgSW5pdGlhbGl6ZWQiKTsKKwkJCXRyYW5zYWN0aW9ucyA9IG5ldyBDYXBMaXN0PD4oVHJhbnNhY3Rpb25VdGlscy5NQVhfU0laRV9UUkFOU0FDVElPTl9MSVNUKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9tbmdyL1RyYW5zYWN0aW9uU2RuY0ltcGwuamF2YSBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9UcmFuc2FjdGlvblNkbmNJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlZmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9UcmFuc2FjdGlvblNkbmNJbXBsLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24ubW5ncjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uaW1wbC5FU0NhdGFsb2dEQU87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuSUNvbW1pdEhhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5JREJBY3Rpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5JVHJhbnNhY3Rpb25TZG5jOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuUm9sbGJhY2tIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuQWN0aW9uVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkRCQWN0aW9uQ29kZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkRCVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkVTQWN0aW9uVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkxvZ01lc3NhZ2VzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5UcmFuc2FjdGlvbkNvZGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5UcmFuc2FjdGlvblN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmltcGwuRVNBY3Rpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmltcGwuRVNSb2xsYmFja0hhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmltcGwuVGl0YW5Db21taXRIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5pbXBsLlRpdGFuUm9sbGJhY2tIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLk1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uU2RuY0ltcGwgaW1wbGVtZW50cyBJVHJhbnNhY3Rpb25TZG5jIHsKKwlwcml2YXRlIGJvb2xlYW4gbGFzdEFjdGlvbkFscmVhZHlDYWxsZWQ7CisJcHJpdmF0ZSBSb2xsYmFja01hbmFnZXIgcm9sbGJhY2tNYW5hZ2VyOworCXByaXZhdGUgQ29tbWl0TWFuYWdlciBjb21taXRNYW5hZ2VyOworCXByaXZhdGUgRVNDYXRhbG9nREFPIGVzQ2F0YWxvZ0RhbzsKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisJcHJpdmF0ZSBJbnRlZ2VyIHRyYW5zYWN0aW9uSWQ7CisJcHJpdmF0ZSBUcmFuc2FjdGlvblN0YXR1c0VudW0gc3RhdHVzOworCXByaXZhdGUgU3RyaW5nIHVzZXJJZCwgYWN0aW9uVHlwZTsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhbnNhY3Rpb25TZG5jSW1wbC5jbGFzcy5nZXROYW1lKCkpOworCisJVHJhbnNhY3Rpb25TZG5jSW1wbChJbnRlZ2VyIHRyYW5zYWN0aW9uSWQsIFN0cmluZyB1c2VySWQsIEFjdGlvblR5cGVFbnVtIGFjdGlvblR5cGVFbnVtLCBFU0NhdGFsb2dEQU8gZXNDYXRhbG9nRGFvLCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMuZXNDYXRhbG9nRGFvID0gZXNDYXRhbG9nRGFvOworCQl0aGlzLnRpdGFuR2VuZXJpY0RhbyA9IHRpdGFuR2VuZXJpY0RhbzsKKwkJdGhpcy50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJCWFjdGlvblR5cGUgPSBhY3Rpb25UeXBlRW51bS5uYW1lKCk7CisJCXJvbGxiYWNrTWFuYWdlciA9IG5ldyBSb2xsYmFja01hbmFnZXIodHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlLCBpbml0Um9sbGJhY2tIYW5kbGVycygpKTsKKwkJY29tbWl0TWFuYWdlciA9IG5ldyBDb21taXRNYW5hZ2VyKHRyYW5zYWN0aW9uSWQsIHVzZXJJZCwgYWN0aW9uVHlwZSwgaW5pdENvbW1pdEhhbmRsZXJzKCkpOworCQlzdGF0dXMgPSBUcmFuc2FjdGlvblN0YXR1c0VudW0uT1BFTjsKKworCX0KKworCXByaXZhdGUgTGlzdDxJQ29tbWl0SGFuZGxlcj4gaW5pdENvbW1pdEhhbmRsZXJzKCkgeworCQlMaXN0PElDb21taXRIYW5kbGVyPiBjb21taXRIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljb21taXRIYW5kbGVycy5hZGQobmV3IFRpdGFuQ29tbWl0SGFuZGxlcih0aXRhbkdlbmVyaWNEYW8pKTsKKwkJcmV0dXJuIGNvbW1pdEhhbmRsZXJzOworCX0KKworCXByaXZhdGUgTGlzdDxSb2xsYmFja0hhbmRsZXI+IGluaXRSb2xsYmFja0hhbmRsZXJzKCkgeworCQlMaXN0PFJvbGxiYWNrSGFuZGxlcj4gcm9sZWJhY2tIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlyb2xlYmFja0hhbmRsZXJzLmFkZChuZXcgVGl0YW5Sb2xsYmFja0hhbmRsZXIodHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlLCB0aXRhbkdlbmVyaWNEYW8pKTsKKwkJcm9sZWJhY2tIYW5kbGVycy5hZGQobmV3IEVTUm9sbGJhY2tIYW5kbGVyKHRyYW5zYWN0aW9uSWQsIHVzZXJJZCwgYWN0aW9uVHlwZSkpOworCQlyZXR1cm4gcm9sZWJhY2tIYW5kbGVyczsKKwl9CisKKwlwcml2YXRlIDxUPiBFaXRoZXI8VCwgVHJhbnNhY3Rpb25Db2RlRW51bT4gaW52b2tlQWN0aW9uKGJvb2xlYW4gaXNMYXN0QWN0aW9uLCBJREJBY3Rpb24gZGJBY3Rpb24sIERCVHlwZUVudW0gZGJUeXBlKSB7CisKKwkJRWl0aGVyPFQsIERCQWN0aW9uQ29kZUVudW0+IGFjdGlvblJlc3VsdDsKKwkJbG9nLmRlYnVnKExvZ01lc3NhZ2VzLklOVk9LRV9BQ1RJT04sIHRyYW5zYWN0aW9uSWQsIGRiVHlwZS5uYW1lKCksIHVzZXJJZCwgYWN0aW9uVHlwZSk7CisJCWlmIChpc0xhc3RBY3Rpb24pIHsKKwkJCWFjdGlvblJlc3VsdCA9IGdldExhc3RBY3Rpb25SZXN1bHQoZGJBY3Rpb24sIGRiVHlwZSk7CisJCX0gZWxzZSB7CisJCQlhY3Rpb25SZXN1bHQgPSBnZXRBY3Rpb25SZXN1bHQoZGJBY3Rpb24sIGRiVHlwZSk7CisJCX0KKworCQlFaXRoZXI8VCwgVHJhbnNhY3Rpb25Db2RlRW51bT4gcmVzdWx0OworCQlib29sZWFuIGlzUm9sbGJhY2tOZWRkZWQgPSBhY3Rpb25SZXN1bHQuaXNSaWdodCgpOworCQlpZiAoaXNSb2xsYmFja05lZGRlZCkgeworCQkJVHJhbnNhY3Rpb25Db2RlRW51bSB0cmFuc2FjdGlvbkNvZGUgPSB0cmFuc2FjdGlvblJvbGxiYWNrKCk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodHJhbnNhY3Rpb25Db2RlKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGFjdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFRyYW5zYWN0aW9uQ29kZUVudW0gdHJhbnNhY3Rpb25Sb2xsYmFjaygpIHsKKworCQlUcmFuc2FjdGlvbkNvZGVFbnVtIHJlc3VsdDsKKwkJREJBY3Rpb25Db2RlRW51bSB0cmFuc2FjdGlvblJvbGxiYWNrID0gcm9sbGJhY2tNYW5hZ2VyLnRyYW5zYWN0aW9uUm9sbGJhY2soKTsKKwkJaWYgKHRyYW5zYWN0aW9uUm9sbGJhY2sgPT0gREJBY3Rpb25Db2RlRW51bS5TVUNDRVNTKSB7CisJCQlyZXN1bHQgPSBUcmFuc2FjdGlvbkNvZGVFbnVtLlJPTExCQUNLX1NVQ0NFU1M7CisJCQlsb2cuaW5mbyhMb2dNZXNzYWdlcy5ST0xMQkFDS19TVUNDRUVERURfR0VORVJBTCwgdHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCWxvZy5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5ST0xMQkFDS19TVUNDRUVERURfR0VORVJBTCwgdHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gVHJhbnNhY3Rpb25Db2RlRW51bS5ST0xMQkFDS19GQUlMRUQ7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgInRyYW5zYWN0aW9uQ29tbWl0IGZvciB0cmFuc2FjdGlvbiAiICsgdHJhbnNhY3Rpb25JZCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigidHJhbnNhY3Rpb25Db21taXQgZm9yIHRyYW5zYWN0aW9uICIgKyB0cmFuc2FjdGlvbklkKTsKKworCQkJbG9nLmluZm8oTG9nTWVzc2FnZXMuUk9MTEJBQ0tfRkFJTEVEX0dFTkVSQUwsIHRyYW5zYWN0aW9uSWQsIHVzZXJJZCwgYWN0aW9uVHlwZSk7CisJCQlsb2cuZGVidWcoVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX0ZBSUxFRF9HRU5FUkFMLCB0cmFuc2FjdGlvbklkLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIDxUPiBFaXRoZXI8VCwgVHJhbnNhY3Rpb25Db2RlRW51bT4gaW52b2tlVGl0YW5BY3Rpb24oYm9vbGVhbiBpc0xhc3RBY3Rpb24sIElEQkFjdGlvbiBkYkFjdGlvbikgeworCQlFaXRoZXI8VCwgVHJhbnNhY3Rpb25Db2RlRW51bT4gcmVzdWx0OworCQlpZiAoc3RhdHVzID09IFRyYW5zYWN0aW9uU3RhdHVzRW51bS5PUEVOKSB7CisJCQlyZXN1bHQgPSBpbnZva2VBY3Rpb24oaXNMYXN0QWN0aW9uLCBkYkFjdGlvbiwgREJUeXBlRW51bS5USVRBTik7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBoYW5kbGVBY3Rpb25PbkNsb3NlZFRyYW5zYWN0aW9uKCk7CisJCX0KKwkJdXBkYXRlVHJhbnNhY3Rpb25TdGF0dXMocmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBUcmFuc2FjdGlvbkNvZGVFbnVtPiBpbnZva2VHZW5lcmFsREJBY3Rpb24oYm9vbGVhbiBpc0xhc3RBY3Rpb24sIERCVHlwZUVudW0gZGJUeXBlLCBJREJBY3Rpb24gZGJBY3Rpb24sIElEQkFjdGlvbiBkYlJvbGxiYWNrQWN0aW9uKSB7CisKKwkJRWl0aGVyPFQsIFRyYW5zYWN0aW9uQ29kZUVudW0+IHJlc3VsdDsKKwkJTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0gYWRkaW5nSGFuZGxlclJlc3VsdDsKKwkJaWYgKHN0YXR1cyA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uT1BFTikgeworCQkJbG9nLmRlYnVnKExvZ01lc3NhZ2VzLlBSRV9JTlZPS0VfQUNUSU9OLCB0cmFuc2FjdGlvbklkLCBkYlR5cGUubmFtZSgpLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQkJRWl0aGVyPFJvbGxiYWNrSGFuZGxlciwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IGVpdGhlclJvbGxiYWNrSGFuZGxlciA9IHJvbGxiYWNrTWFuYWdlci5nZXRSb2xsYmFja0hhbmRsZXIoZGJUeXBlKTsKKworCQkJaWYgKGVpdGhlclJvbGxiYWNrSGFuZGxlci5pc0xlZnQoKSkgeworCQkJCVJvbGxiYWNrSGFuZGxlciByb2xsYmFja0hhbmRsZXIgPSBlaXRoZXJSb2xsYmFja0hhbmRsZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJYWRkaW5nSGFuZGxlclJlc3VsdCA9IHJvbGxiYWNrSGFuZGxlci5hZGRSb2xsYmFja0FjdGlvbihkYlJvbGxiYWNrQWN0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJYWRkaW5nSGFuZGxlclJlc3VsdCA9IGFkZFRvTmV3Um9sbGJhY2tIYW5kbGVyKGRiVHlwZSwgZGJSb2xsYmFja0FjdGlvbik7CisJCQl9CisKKwkJCWlmIChhZGRpbmdIYW5kbGVyUmVzdWx0ID09IE1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtLlNVQ0NFU1MpIHsKKwkJCQlyZXN1bHQgPSBpbnZva2VBY3Rpb24oaXNMYXN0QWN0aW9uLCBkYkFjdGlvbiwgZGJUeXBlKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFRyYW5zYWN0aW9uQ29kZUVudW0uUFJFUEFSRV9ST0xMQkFDS19GQUlMRUQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gaGFuZGxlQWN0aW9uT25DbG9zZWRUcmFuc2FjdGlvbigpOworCQl9CisJCXVwZGF0ZVRyYW5zYWN0aW9uU3RhdHVzKHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bSBhZGRUb05ld1JvbGxiYWNrSGFuZGxlcihEQlR5cGVFbnVtIGRiVHlwZSwgSURCQWN0aW9uIGRiUm9sbGJhY2tBY3Rpb24pIHsKKwkJbG9nLmRlYnVnKExvZ01lc3NhZ2VzLkNSRUFURV9ST0xMQkFDS19IQU5ETEVSLCBkYlR5cGUubmFtZSgpLCB0cmFuc2FjdGlvbklkLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQlNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bSByZXN1bHQ7CisKKwkJRWl0aGVyPFJvbGxiYWNrSGFuZGxlciwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IGVpdGhlclJvbGxiYWNrSGFuZGxlciA9IHJvbGxiYWNrTWFuYWdlci5jcmVhdGVSb2xsYmFja0hhbmRsZXIoZGJUeXBlKTsKKwkJaWYgKGVpdGhlclJvbGxiYWNrSGFuZGxlci5pc1JpZ2h0KCkpIHsKKwkJCXJlc3VsdCA9IGVpdGhlclJvbGxiYWNrSGFuZGxlci5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIlRyYW5zYWN0aW9uTWFuYWdlciAtICBhZGRUb05ld1JvbGxiYWNrSGFuZGxlciIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIlRyYW5zYWN0aW9uTWFuYWdlciAtICBhZGRUb05ld1JvbGxiYWNrSGFuZGxlciIpOworCQkJbG9nLmluZm8oTG9nTWVzc2FnZXMuRkFJTEVEX0NSRUFURV9ST0xMQkFDSywgZGJUeXBlLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCWxvZy5kZWJ1ZyhUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuRkFJTEVEX0NSRUFURV9ST0xMQkFDSywgZGJUeXBlLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJfSBlbHNlIHsKKwkJCVJvbGxiYWNrSGFuZGxlciByb2xsYmFja0hhbmRsZXIgPSBlaXRoZXJSb2xsYmFja0hhbmRsZXIubGVmdCgpLnZhbHVlKCk7CisJCQlyb2xsYmFja0hhbmRsZXIuYWRkUm9sbGJhY2tBY3Rpb24oZGJSb2xsYmFja0FjdGlvbik7CisJCQlyZXN1bHQgPSBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bS5TVUNDRVNTOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPERCQWN0aW9uQ29kZUVudW0sIFRyYW5zYWN0aW9uQ29kZUVudW0+IGludm9rZUVTQWN0aW9uKGJvb2xlYW4gaXNMYXN0QWN0aW9uLCBFU0FjdGlvblR5cGVFbnVtIGVzQWN0aW9udHlwZSwgRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhKSB7CisKKwkJRWl0aGVyPERCQWN0aW9uQ29kZUVudW0sIFRyYW5zYWN0aW9uQ29kZUVudW0+IHJlc3VsdDsKKwkJaWYgKHN0YXR1cyA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uT1BFTikgeworCQkJRWl0aGVyPFJvbGxiYWNrSGFuZGxlciwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IGVpdGhlckVzSGFuZGxlciA9IHJvbGxiYWNrTWFuYWdlci5nZXRSb2xsYmFja0hhbmRsZXIoREJUeXBlRW51bS5FTEFTVElDX1NFQVJDSCk7CisJCQlpZiAoZWl0aGVyRXNIYW5kbGVyLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChUcmFuc2FjdGlvbkNvZGVFbnVtLklOVEVSTkFMX0VSUk9SKTsKKwkJCX0gZWxzZSB7CisJCQkJRVNSb2xsYmFja0hhbmRsZXIgZXNIYW5kbGVyID0gKEVTUm9sbGJhY2tIYW5kbGVyKSBlaXRoZXJFc0hhbmRsZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlFaXRoZXI8RVNBY3Rpb24sIE1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtPiBlaXRoZXJFc1JvbGxiYWNrQWN0aW9uID0gZXNIYW5kbGVyLmJ1aWxkRXNSb2xsYmFja0FjdGlvbihlc0NhdGFsb2dEYW8sIGFydGlmYWN0RGF0YSwgZXNBY3Rpb250eXBlKTsKKwkJCQlpZiAoZWl0aGVyRXNSb2xsYmFja0FjdGlvbi5pc0xlZnQoKSkgeworCQkJCQllc0hhbmRsZXIuYWRkUm9sbGJhY2tBY3Rpb24oZWl0aGVyRXNSb2xsYmFja0FjdGlvbi5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCXJlc3VsdCA9IGludm9rZUFjdGlvbihpc0xhc3RBY3Rpb24sIG5ldyBFU0FjdGlvbihlc0NhdGFsb2dEYW8sIGFydGlmYWN0RGF0YSwgZXNBY3Rpb250eXBlKSwgREJUeXBlRW51bS5FTEFTVElDX1NFQVJDSCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFRyYW5zYWN0aW9uQ29kZUVudW0uUFJFUEFSRV9ST0xMQkFDS19GQUlMRUQpOworCQkJCX0KKworCQkJfQorCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gaGFuZGxlQWN0aW9uT25DbG9zZWRUcmFuc2FjdGlvbigpOworCQl9CisJCXVwZGF0ZVRyYW5zYWN0aW9uU3RhdHVzKHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSA8VD4gdm9pZCB1cGRhdGVUcmFuc2FjdGlvblN0YXR1cyhFaXRoZXI8VCwgVHJhbnNhY3Rpb25Db2RlRW51bT4gcmVzdWx0KSB7CisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQl1cGRhdGVUcmFuc2FjdGlvblN0YXR1cyhyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSA8VD4gRWl0aGVyPFQsIFRyYW5zYWN0aW9uQ29kZUVudW0+IGhhbmRsZUFjdGlvbk9uQ2xvc2VkVHJhbnNhY3Rpb24oKSB7CisJCUVpdGhlcjxULCBUcmFuc2FjdGlvbkNvZGVFbnVtPiByZXN1bHQgPSBFaXRoZXIucmlnaHQoVHJhbnNhY3Rpb25Db2RlRW51bS5UUkFOU0FDVElPTl9DTE9TRUQpOworCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIlRyYW5zYWN0aW9uTWFuYWdlciAtIGhhbmRsZUFjdGlvbk9uQ2xvc2VkVHJhbnNhY3Rpb24iKTsKKwkJbG9nLmRlYnVnKExvZ01lc3NhZ2VzLkFDVElPTl9PTl9DTE9TRURfVFJBTlNBQ1RJT04sIHRyYW5zYWN0aW9uSWQsIHVzZXJJZCwgYWN0aW9uVHlwZSk7CisJCWxvZy5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5BQ1RJT05fT05fQ0xPU0VEX1RSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbklkLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgPFQ+IEVpdGhlcjxULCBEQkFjdGlvbkNvZGVFbnVtPiBnZXRMYXN0QWN0aW9uUmVzdWx0KElEQkFjdGlvbiBkYXRhQmFzZUFjdGlvbiwgREJUeXBlRW51bSBkYlR5cGUpIHsKKwkJRWl0aGVyPFQsIERCQWN0aW9uQ29kZUVudW0+IHJlc3VsdDsKKwkJaWYgKGlzTGFzdEFjdGlvbkFscmVhZHlDYWxsZWQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERCQWN0aW9uQ29kZUVudW0uRkFJTF9NVUxUSVBMRV9MQVNUX0FDVElPTik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVTeXN0ZW1FcnJvciwgIlRyYW5zYWN0aW9uTWFuYWdlciAtIGdldExhc3RBY3Rpb25SZXN1bHQiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJUcmFuc2FjdGlvbk1hbmFnZXIgLSBnZXRMYXN0QWN0aW9uUmVzdWx0Iik7CisJCQlsb2cuZGVidWcoTG9nTWVzc2FnZXMuRE9VQkxFX0ZJTklTSF9GTEFHX0FDVElPTiwgdHJhbnNhY3Rpb25JZCwgZGJUeXBlLm5hbWUoKSwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCWxvZy5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5ET1VCTEVfRklOSVNIX0ZMQUdfQUNUSU9OLCB0cmFuc2FjdGlvbklkLCBkYlR5cGUubmFtZSgpLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQl9IGVsc2UgeworCQkJc2V0TGFzdEFjdGlvbkFscmVhZHlDYWxsZWQodHJ1ZSk7CisJCQlyZXN1bHQgPSBnZXRBY3Rpb25SZXN1bHQoZGF0YUJhc2VBY3Rpb24sIGRiVHlwZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIDxUPiBFaXRoZXI8VCwgREJBY3Rpb25Db2RlRW51bT4gZ2V0QWN0aW9uUmVzdWx0KElEQkFjdGlvbiBkYXRhQmFzZUFjdGlvbiwgREJUeXBlRW51bSBkYlR5cGUpIHsKKwkJRWl0aGVyPFQsIERCQWN0aW9uQ29kZUVudW0+IHJlc3VsdDsKKwkJdHJ5IHsKKwkJCVQgZG9BY3Rpb24gPSBkYXRhQmFzZUFjdGlvbi5kb0FjdGlvbigpOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZG9BY3Rpb24pOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJUcmFuc2FjdGlvbk1hbmFnZXIgLSBnZXRBY3Rpb25SZXN1bHQiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZVN5c3RlbUVycm9yKCJUcmFuc2FjdGlvbk1hbmFnZXIgLSBnZXRBY3Rpb25SZXN1bHQiKTsKKwkJCWxvZy5kZWJ1ZyhMb2dNZXNzYWdlcy5EQl9BQ1RJT05fRkFJTEVEX1dJVEhfRVhDRVBUSU9OLCBkYlR5cGUubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBlLmdldE1lc3NhZ2UoKSwgdXNlcklkLCBhY3Rpb25UeXBlLCBlKTsKKwkJCWxvZy5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5EQl9BQ1RJT05fRkFJTEVEX1dJVEhfRVhDRVBUSU9OLCBkYlR5cGUubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBlLmdldE1lc3NhZ2UoKSwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERCQWN0aW9uQ29kZUVudW0uRkFJTF9HRU5FUkFMKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBUcmFuc2FjdGlvbkNvZGVFbnVtIGZpbmlzaFRyYW5zYWN0aW9uKCkgeworCQlUcmFuc2FjdGlvbkNvZGVFbnVtIHJlc3VsdDsKKwkJaWYgKHN0YXR1cyA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uT1BFTikgeworCQkJREJBY3Rpb25Db2RlRW51bSB0cmFuc2FjdGlvbkNvbW1pdCA9IGNvbW1pdE1hbmFnZXIudHJhbnNhY3Rpb25Db21taXQoKTsKKwkJCWlmICh0cmFuc2FjdGlvbkNvbW1pdCA9PSBEQkFjdGlvbkNvZGVFbnVtLlNVQ0NFU1MpIHsKKwkJCQlyZXN1bHQgPSBUcmFuc2FjdGlvbkNvZGVFbnVtLlNVQ0NFU1M7CisJCQkJc3RhdHVzID0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLkNMT1NFRDsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0ID0gdHJhbnNhY3Rpb25Sb2xsYmFjaygpOworCQkJfQorCQl9IGVsc2UgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlU3lzdGVtRXJyb3IsICJUcmFuc2FjdGlvbk1hbmFnZXIgLSBmaW5pc2hUcmFuc2FjdGlvbiIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlU3lzdGVtRXJyb3IoIlRyYW5zYWN0aW9uTWFuYWdlciAtIGZpbmlzaFRyYW5zYWN0aW9uIik7CisJCQlsb2cuZGVidWcoTG9nTWVzc2FnZXMuQ09NTUlUX09OX0NMT1NFRF9UUkFOU0FDVElPTiwgdHJhbnNhY3Rpb25JZCwgc3RhdHVzLm5hbWUoKSwgdXNlcklkLCBhY3Rpb25UeXBlKTsKKwkJCWxvZy5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5DT01NSVRfT05fQ0xPU0VEX1RSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbklkLCBzdGF0dXMubmFtZSgpLCB1c2VySWQsIGFjdGlvblR5cGUpOworCQkJcmVzdWx0ID0gVHJhbnNhY3Rpb25Db2RlRW51bS5UUkFOU0FDVElPTl9DTE9TRUQ7CisJCX0KKwkJdXBkYXRlVHJhbnNhY3Rpb25TdGF0dXMocmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVHJhbnNhY3Rpb25TdGF0dXMoVHJhbnNhY3Rpb25Db2RlRW51bSByZXN1bHQpIHsKKwkJc3dpdGNoIChyZXN1bHQpIHsKKwkJY2FzZSBTVUNDRVNTOgorCQkJc3RhdHVzID0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLkNMT1NFRDsKKwkJCWJyZWFrOworCQljYXNlIFJPTExCQUNLX1NVQ0NFU1M6CisJCQlzdGF0dXMgPSBUcmFuc2FjdGlvblN0YXR1c0VudW0uQ0xPU0VEOworCQkJYnJlYWs7CisJCWNhc2UgUk9MTEJBQ0tfRkFJTEVEOgorCQkJc3RhdHVzID0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLkZBSUxFRF9ST0xMQkFDSzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0xhc3RBY3Rpb25BbHJlYWR5Q2FsbGVkKCkgeworCQlyZXR1cm4gbGFzdEFjdGlvbkFscmVhZHlDYWxsZWQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldExhc3RBY3Rpb25BbHJlYWR5Q2FsbGVkKGJvb2xlYW4gbGFzdEFjdGlvbikgeworCQl0aGlzLmxhc3RBY3Rpb25BbHJlYWR5Q2FsbGVkID0gbGFzdEFjdGlvbjsKKwl9CisKKwlzdGF0aWMgdm9pZCBzZXRMb2coTG9nZ2VyIGxvZykgeworCQlUcmFuc2FjdGlvblNkbmNJbXBsLmxvZyA9IGxvZzsKKwl9CisKKwlUcmFuc2FjdGlvblN0YXR1c0VudW0gZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWNvbnRleHQueG1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwYTQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWNvbnRleHQueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmNvbnRleHQ9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dCIKKyAgeG1sbnM6YW9wPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2FvcCIgeG1sbnM6dXRpbD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsIgorICB4c2k6c2NoZW1hTG9jYXRpb249IgorICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTMuMS54c2QKKyAgICAgICAgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9jb250ZXh0IGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dC9zcHJpbmctY29udGV4dC0zLjEueHNkCisgICAgICAgIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYW9wIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYW9wL3NwcmluZy1hb3AtMy4wLnhzZAorICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3V0aWwgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsL3NwcmluZy11dGlsLTMuMC54c2QiPgorCisgIDxjb250ZXh0OmFubm90YXRpb24tY29uZmlnIC8+CisgIDxhb3A6YXNwZWN0ai1hdXRvcHJveHkgcHJveHktdGFyZ2V0LWNsYXNzPSJ0cnVlIiAvPgorCisgIDxjb250ZXh0OmNvbXBvbmVudC1zY2FuCisgICAgYmFzZS1wYWNrYWdlPSJvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uaW1wbCwJICAgCisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5lcywKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmltcGwsCQkJCisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80aiwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLAorCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZSwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLAorCQlvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLCAKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbCwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuaW1wbCwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLAorCQlvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUsCisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbiwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5jbGVhbiwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYSwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuc3dpdGNob3Zlci5kZXRlY3RvciwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUudG9zY2EsCisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLmV4dGVybmFsYXBpLnNlcnZsZXQKKwkJIj4KKwkJCisgICA8L2NvbnRleHQ6Y29tcG9uZW50LXNjYW4+CisKKyAgPGJlYW4gaWQ9InJlc291cmNlSW1wb3J0TWFuYWdlciIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5SZXNvdXJjZUltcG9ydE1hbmFnZXIiIC8+CisgIDxiZWFuIGlkPSJjYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXIiIGNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ2FwYWJpbGl0eVR5cGVJbXBvcnRNYW5hZ2VyIiAvPgorICA8YmVhbiBpZD0ic2VydmxldFV0aWxzIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5TZXJ2bGV0VXRpbHMiIC8+CisgIDxiZWFuIGlkPSJyZXNvdXJjZUJ1c2luZXNzTG9naWMiIGNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIiAvPgorICA8YmVhbiBpZD0ic2VydmljZUJ1c2luZXNzTG9naWMiIGNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuU2VydmljZUJ1c2luZXNzTG9naWMiIC8+CisgIDxiZWFuIGlkPSJwcm9kdWN0QnVzaW5lc3NMb2dpYyIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Qcm9kdWN0QnVzaW5lc3NMb2dpYyIgLz4KKyAgPGJlYW4gaWQ9ImFydGlmYWN0QnVzaW5lc3NMb2dpYyIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5BcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIiAvPgorICA8YmVhbiBpZD0ibGlmZWN5Y2xlQnVzaW5lc3NMb2dpYyIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZUJ1c2luZXNzTG9naWMiIC8+CisgIDxiZWFuIGlkPSJzZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlNlcnZpY2VDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMiIC8+CisgIDxiZWFuIGlkPSJwcm9kdWN0Q29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlByb2R1Y3RDb21wb25lbnRJbnN0YW5jZUJ1c2luZXNzTG9naWMiIC8+CisgIDxiZWFuIGlkPSJ2ZkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5WRkNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyIgLz4KKyAgPGJlYW4gaWQ9InRyYW5zYWN0aW9uTWFuYWdlciIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5tbmdyLlRyYW5zYWN0aW9uTWFuYWdlciIgLz4KKyAgPGJlYW4gaWQ9InVzZXJCdXNpbmVzc0xvZ2ljIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYyIgLz4KKyAgPGJlYW4gaWQ9ImVsZW1lbnRzQnVzaW5lc3NMb2dpYyIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5FbGVtZW50QnVzaW5lc3NMb2dpYyIgLz4KKyAgPGJlYW4gaWQ9InByb3BlcnR5QnVzaW5lc3NMb2dpYyIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Qcm9wZXJ0eUJ1c2luZXNzTG9naWMiIC8+CisgIDxiZWFuIGlkPSJhdWRpdGluZ01hbmFnZXIiIGNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5iZS5hdWRpdGluZy5pbXBsLkF1ZGl0aW5nTWFuYWdlciIgLz4KKyAgPGJlYW4gaWQ9ImRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMiIGNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYyIgLz4KKyAgPGJlYW4gaWQ9ImludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyIiAvPgorICA8YmVhbiBpZD0iZGlzdHJpYnV0aW9uTW9uaXRvcmluZ0J1c2luZXNzTG9naWMiIGNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuRGlzdHJpYnV0aW9uTW9uaXRvcmluZ0J1c2luZXNzTG9naWMiIC8+CisgIDxiZWFuIGlkPSJhZGRpdGlvbmFsSW5mb3JtYXRpb25CdXNpbmVzc0xvZ2ljIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFkZGl0aW9uYWxJbmZvcm1hdGlvbkJ1c2luZXNzTG9naWMiIC8+CisgIDxiZWFuIGlkPSJkaXN0cmlidXRpb24tZW5naW5lLWNsdXN0ZXItaGVhbHRoIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLkRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGgiIC8+CisgIDxiZWFuIGlkPSJjYXRlZ29yaWVzSW1wb3J0TWFuYWdlciIgY2xhc3M9Im9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5DYXRlZ29yaWVzSW1wb3J0TWFuYWdlciIgLz4KKyAgPGJlYW4gaWQ9ImFzc2V0LW1ldGFkYXRhLXV0aWxzIiBjbGFzcz0ib3JnLm9wZW5lY29tcC5zZGMuYmUuZXh0ZXJuYWxhcGkuc2VydmxldC5Bc3NldE1ldGFkYXRhQ29udmVydGVyIiAvPgorICAKKyAgCisgIAorICA8dXRpbDpwcm9wZXJ0aWVzIGlkPSJlbGFzdGljc2VhcmNoQ29uZmlnIiBsb2NhdGlvbj0iZmlsZToke2NvbmZpZy5ob21lfS9lbGFzdGljc2VhcmNoLnltbCIgLz4KKyAgCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZ3VyYXRpb24ueWFtbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlODBkYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSw0NzggQEAKK2lkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOgorICAgLSBIVFRQX0lWX1VTRVIKKyAgIC0gSFRUUF9DU1BfRklSU1ROQU1FCisgICAtIEhUVFBfQ1NQX0xBU1ROQU1FCisgICAtIEhUVFBfSVZfUkVNT1RFX0FERFJFU1MKKyAgIC0gSFRUUF9DU1BfV1NUWVBFCisKKworCisjIGNhdGFsb2cgYmFja2VuZCBob3N0bmFtZQorYmVGcWRuOiBsb2NhbGhvc3QKKworIyBjYXRhbG9nIGJhY2tlbmQgaHR0cCBwb3J0CitiZUh0dHBQb3J0OiA4MDgwCisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgY29udGV4dAorYmVDb250ZXh0OiAvc2RjL3Jlc3QvY29uZmlnL2dldAorCisjIGNhdGFsb2cgYmFja2VuZCBwcm90b2NvbAorYmVQcm90b2NvbDogaHR0cAorCisjIGNhdGFsb2cgYmFja2VuZCBzc2wgcG9ydAorYmVTc2xQb3J0OiA4NDQzCisKK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKwordGl0YW5DZmdGaWxlOiAvaG9tZS92YWdyYW50L2NhdGFsb2ctYmUvY29uZmlnL2NhdGFsb2ctYmUvdGl0YW4ucHJvcGVydGllcwordGl0YW5Jbk1lbW9yeUdyYXBoOiBmYWxzZQordGl0YW5Mb2NrVGltZW91dDogMTgwMAordGl0YW5SZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczogMwordGl0YW5IZWFsdGhDaGVja1JlYWRUaW1lb3V0OiAxCitlc1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOiAzCit1ZWJIZWFsdGhDaGVja1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOiAxNQordWViSGVhbHRoQ2hlY2tSZWFkVGltZW91dDogNAorCisjIFByb3RvY29scworcHJvdG9jb2xzOgorICAgLSBodHRwCisgICAtIGh0dHBzCisKKyMgVXNlcnMKK3VzZXJzOgorICAgIHRvbTogcGFzc3dkCisgICAgYm9iOiBwYXNzd2QKKyAgICAKK25lbzRqOgorICAgIGhvc3Q6IG5lbzRqaG9zdAorICAgIHBvcnQ6IDc0NzQKKyAgICB1c2VyOiBuZW80agorICAgIHBhc3N3b3JkOiAiMTIzNDUiCisgICAgCisKKyNBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZXR0aW5ncyBvZiBFUworZWxhc3RpY1NlYXJjaDoKKyAgICAjIE1hcHBpbmcgb2YgaW5kZXggcHJlZml4IHRvIHRpbWUtYmFzZWQgZnJhbWUuIEZvciBleGFtcGxlLCBpZiBiZWxvdyBpcyBjb25maWd1cmVkOgorICAgICMKKyAgICAjIC0gaW5kZXhQcmVmaXg6IGF1ZGl0aW5nZXZlbnRzCisgICAgIyAgICBjcmVhdGlvblBlcmlvZDogbWludXRlCisgICAgIworICAgICMgdGhlbiBFUyBvYmplY3Qgb2YgdHlwZSB3aGljaCBpcyBtYXBwZWQgdG8gImF1ZGl0aW5nZXZlbnRzLSoiIHRlbXBsYXRlLCBhbmQgY3JlYXRlZCBvbiAyMDE1LTEyLTIzIDEzOjI0OjU0LCB3aWxsIGVudGVyICJhdWRpdGluZ2V2ZW50cy0yMDE1LTEyLTIzLTEzLTI0IiBpbmRleC4KKyAgICAjIEFub3RoZXIgb2JqZWN0IGNyZWF0ZWQgb24gMjAxNS0xMi0yMyAxMzoyNTo1NCwgd2lsbCBlbnRlciAiYXVkaXRpbmdldmVudHMtMjAxNS0xMi0yMy0xMy0yNSIgaW5kZXguCisgICAgIyBJZiBjcmVhdGlvblBlcmlvZDogbW9udGgsIGJvdGggb2YgdGhlIGFib3ZlIHdpbGwgZW50ZXIgImF1ZGl0aW5nZXZlbnRzLTIwMTUtMTIiIGluZGV4LgorICAgICMKKyAgICAjIFBMRUFTRSBOT1RFOiB0aGUgdGltZXN0YW1wcyBhcmUgY3JlYXRlZCBpbiBVVEMvR01UIHRpbWV6b25lISBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IHRpbWVzdGFtcHMgd2lsbCBiZSBjb3JyZWN0bHkgcHJlc2VudGVkIGluIEtpYmFuYS4KKyAgICAjCisgICAgIyBMZWdhbCB2YWx1ZXMgZm9yIGNyZWF0aW9uUGVyaW9kIC0geWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBub25lIChtZWFuaW5nIG5vIHRpbWUtYmFzZWQgYmVoYXZpb3VyKS4KKyAgICAjCisgICAgIyBJZiBubyBjcmVhdGlvblBlcmlvZCBpcyBjb25maWd1cmVkIGZvciBpbmRleFByZWZpeCwgZGVmYXVsdCBiZWhhdm91ciBpcyBjcmVhdGlvblBlcmlvZDogbW9udGguCisKKyAgICBpbmRpY2VzVGltZUZyZXF1ZW5jeToKKyAgICAgIC0gaW5kZXhQcmVmaXg6IGF1ZGl0aW5nZXZlbnRzCisgICAgICAgIGNyZWF0aW9uUGVyaW9kOiBtb250aAorICAgICAgLSBpbmRleFByZWZpeDogbW9uaXRvcmluZ19ldmVudHMKKyAgICAgICAgY3JlYXRpb25QZXJpb2Q6IG1vbnRoCisKK2FydGlmYWN0VHlwZXM6CisgICAtIENIRUYKKyAgIC0gUFVQUEVUCisgICAtIFNIRUxMCisgICAtIFlBTkcKKyAgIC0gWUFOR19YTUwKKyAgIC0gSEVBVAorICAgLSBCUEVMCisgICAtIERHX1hNTAorICAgLSBNVVJBTk9fUEtHCisgICAtIFdPUktGTE9XCisgICAtIE5FVFdPUktfQ0FMTF9GTE9XCisgICAtIFRPU0NBX1RFTVBMQVRFCisgICAtIFRPU0NBX0NTQVIKKyAgIC0gQUFJX1NFUlZJQ0VfTU9ERUwKKyAgIC0gQUFJX1ZGX01PREVMCisgICAtIEFBSV9WRl9NT0RVTEVfTU9ERUwKKyAgIC0gQUFJX1ZGX0lOU1RBTkNFX01PREVMCisgICAtIE9USEVSCisKK2xpY2Vuc2VUeXBlczoKKyAgIC0gVXNlcgorICAgLSBJbnN0YWxsYXRpb24KKyAgIC0gQ1BVCisKKyNEZXBsb3ltZW50IGFydGlmYWN0cyBwbGFjZUhvbGRlcgorcmVzb3VyY2VUeXBlczogJmFsbFJlc291cmNlVHlwZXMKKyAgLSBWRkMKKyAgLSBDUAorICAtIFZMCisgIC0gVkYKKyAKKyMgdmFsaWRGb3JSZXNvdXJjZVR5cGVzIHVzYWdlCisjICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisjICAgICAgICAtIFZGCisjICAgICAgICAtIFZMCitkZXBsb3ltZW50UmVzb3VyY2VBcnRpZmFjdHM6CisjICBoZWF0OgorIyAgICAgIGRpc3BsYXlOYW1lOiAiQmFzZSBIRUFUIFRlbXBsYXRlIgorIyAgICAgIHR5cGU6IEhFQVQKKyMgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisjICBoZWF0Vm9sOgorIyAgICAgIGRpc3BsYXlOYW1lOiAiVm9sdW1lIEhFQVQgVGVtcGxhdGUiCisjICAgICAgdHlwZTogSEVBVF9WT0wKKyMgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisjICBoZWF0TmV0OgorIyAgICAgIGRpc3BsYXlOYW1lOiAiTmV0d29yayBIRUFUIFRlbXBsYXRlIgorIyAgICAgIHR5cGU6IEhFQVRfTkVUCisjICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAKK2RlcGxveW1lbnRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzOgorICBoZWF0RW52OgorICAgICAgZGlzcGxheU5hbWU6ICJIRUFUIEVOViIKKyAgICAgIHR5cGU6IEhFQVRfRU5WCisgICAgICBkZXNjcmlwdGlvbjogIkF1dG8tZ2VuZXJhdGVkIEhFQVQgRW52aXJvbm1lbnQgZGVwbG95bWVudCBhcnRpZmFjdCIKKyAgICAgIGZpbGVFeHRlbnNpb246ICJlbnYiCisKKyN0b3NjYSBhcnRpZmFjdHMgcGxhY2Vob2xkZXJzCit0b3NjYUFydGlmYWN0czoKKyAgYXNzZXRUb3NjYVRlbXBsYXRlOgorICAgICAgYXJ0aWZhY3ROYW1lOiAtdGVtcGxhdGUueW1sCisgICAgICBkaXNwbGF5TmFtZTogVG9zY2EgVGVtcGxhdGUKKyAgICAgIHR5cGU6IFRPU0NBX1RFTVBMQVRFCisgICAgICBkZXNjcmlwdGlvbjogVE9TQ0EgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFzc2V0CisgIGFzc2V0VG9zY2FDc2FyOgorICAgICAgYXJ0aWZhY3ROYW1lOiAtY3Nhci5jc2FyCisgICAgICBkaXNwbGF5TmFtZTogVG9zY2EgTW9kZWwKKyAgICAgIHR5cGU6IFRPU0NBX0NTQVIKKyAgICAgIGRlc2NyaXB0aW9uOiBUT1NDQSBkZWZpbml0aW9uIHBhY2thZ2Ugb2YgdGhlIGFzc2V0CisKKworI0luZm9ybWF0aW9uYWwgYXJ0aWZhY3RzIHBsYWNlSG9sZGVyCitleGNsdWRlUmVzb3VyY2VDYXRlZ29yeToKKyAgLSBHZW5lcmljCitpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHM6CisgIGZlYXR1cmVzOgorICAgICAgZGlzcGxheU5hbWU6IEZlYXR1cmVzCisgICAgICB0eXBlOiBPVEhFUgorICBjYXBhY2l0eToKKyAgICAgIGRpc3BsYXlOYW1lOiBDYXBhY2l0eQorICAgICAgdHlwZTogT1RIRVIKKyAgdmVuZG9yVGVzdFJlc3VsdDoKKyAgICAgIGRpc3BsYXlOYW1lOiBWZW5kb3IgVGVzdCBSZXN1bHQKKyAgICAgIHR5cGU6IE9USEVSCisgIHRlc3RTY3JpcHRzOgorICAgICAgZGlzcGxheU5hbWU6IFRlc3QgU2NyaXB0cworICAgICAgdHlwZTogT1RIRVIKKyAgY2xvdWRRdWVzdGlvbm5haXJlOgorICAgICAgZGlzcGxheU5hbWU6IENsb3VkIFF1ZXN0aW9ubmFpcmUgKGNvbXBsZXRlZCkKKyAgICAgIHR5cGU6IE9USEVSCisgIEhFQVRUZW1wbGF0ZUZyb21WZW5kb3I6CisgICAgICBkaXNwbGF5TmFtZTogSEVBVCBUZW1wbGF0ZSBmcm9tIFZlbmRvcgorICAgICAgdHlwZTogSEVBVAorICByZXNvdXJjZVNlY3VyaXR5VGVtcGxhdGU6CisgICAgICBkaXNwbGF5TmFtZTogUmVzb3VyY2UgU2VjdXJpdHkgVGVtcGxhdGUKKyAgICAgIHR5cGU6IE9USEVSCisgICAgICAgICAgICAKK2V4Y2x1ZGVTZXJ2aWNlQ2F0ZWdvcnk6CisKK2luZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzOgorICBzZXJ2aWNlQXJ0aWZhY3RQbGFuOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2UgQXJ0aWZhY3QgUGxhbgorICAgICAgdHlwZTogT1RIRVIKKyAgc3VtbWFyeU9mSW1wYWN0c1RvRUNPTVBFbGVtZW50czoKKyAgICAgIGRpc3BsYXlOYW1lOiBTdW1tYXJ5IG9mIGltcGFjdHMgdG8gRUNPTVAgZWxlbWVudHMsT1NTcywgQlNTcworICAgICAgdHlwZTogT1RIRVIKKyAgY29udHJvbExvb3BGdW5jdGlvbnM6CisgICAgICBkaXNwbGF5TmFtZTogQ29udHJvbCBMb29wIEZ1bmN0aW9ucworICAgICAgdHlwZTogT1RIRVIKKyAgZGltZW5zaW9uaW5nSW5mbzoKKyAgICAgIGRpc3BsYXlOYW1lOiBEaW1lbnNpb25pbmcgSW5mbworICAgICAgdHlwZTogT1RIRVIKKyAgYWZmaW5pdHlSdWxlczoKKyAgICAgIGRpc3BsYXlOYW1lOiBBZmZpbml0eSBSdWxlcworICAgICAgdHlwZTogT1RIRVIKKyAgb3BlcmF0aW9uYWxQb2xpY2llczoKKyAgICAgIGRpc3BsYXlOYW1lOiBPcGVyYXRpb25hbCBQb2xpY2llcworICAgICAgdHlwZTogT1RIRVIKKyAgc2VydmljZVNwZWNpZmljUG9saWNpZXM6CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZS1zcGVjaWZpYyBQb2xpY2llcworICAgICAgdHlwZTogT1RIRVIKKyAgZW5naW5lZXJpbmdSdWxlczoKKyAgICAgIGRpc3BsYXlOYW1lOiBFbmdpbmVlcmluZyBSdWxlcyAoRVJEKQorICAgICAgdHlwZTogT1RIRVIKKyAgZGlzdHJpYnV0aW9uSW5zdHJ1Y3Rpb25zOgorICAgICAgZGlzcGxheU5hbWU6IERpc3RyaWJ1dGlvbiBJbnN0cnVjdGlvbnMKKyAgICAgIHR5cGU6IE9USEVSCisgIGNlcnRpZmljYXRpb25UZXN0UmVzdWx0czoKKyAgICAgIGRpc3BsYXlOYW1lOiBURCBDZXJ0aWZpY2F0aW9uIFRlc3QgUmVzdWx0cworICAgICAgdHlwZTogT1RIRVIKKyAgZGVwbG95bWVudFZvdGluZ1JlY29yZDoKKyAgICAgIGRpc3BsYXlOYW1lOiBEZXBsb3ltZW50IFZvdGluZyBSZWNvcmQKKyAgICAgIHR5cGU6IE9USEVSCisgIHNlcnZpY2VRdWVzdGlvbm5haXJlOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2UgUXVlc3Rpb25uYWlyZQorICAgICAgdHlwZTogT1RIRVIKKyAgc2VydmljZVNlY3VyaXR5VGVtcGxhdGU6CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZSBTZWN1cml0eSBUZW1wbGF0ZQorICAgICAgdHlwZTogT1RIRVIKKyAgICAgIAorc2VydmljZUFwaUFydGlmYWN0czoKKyAgY29uZmlndXJhdGlvbjoKKyAgICAgIGRpc3BsYXlOYW1lOiBDb25maWd1cmF0aW9uCisgICAgICB0eXBlOiBPVEhFUgorICBpbnN0YW50aWF0aW9uOgorICAgICAgZGlzcGxheU5hbWU6IEluc3RhbnRpYXRpb24KKyAgICAgIHR5cGU6IE9USEVSCisgIG1vbml0b3Jpbmc6CisgICAgICBkaXNwbGF5TmFtZTogTW9uaXRvcmluZworICAgICAgdHlwZTogT1RIRVIKKyAgcmVwb3J0aW5nOgorICAgICAgZGlzcGxheU5hbWU6IFJlcG9ydGluZworICAgICAgdHlwZTogT1RIRVIKKyAgbG9nZ2luZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBMb2dnaW5nCisgICAgICB0eXBlOiBPVEhFUgorICB0ZXN0aW5nOgorICAgICAgZGlzcGxheU5hbWU6IFRlc3RpbmcKKyAgICAgIHR5cGU6IE9USEVSCisKKworYWRkaXRpb25hbEluZm9ybWF0aW9uTWF4TnVtYmVyT2ZLZXlzOiA1MAorCitzeXN0ZW1Nb25pdG9yaW5nOgorICAgIGVuYWJsZWQ6IGZhbHNlCisgICAgaXNQcm94eTogZmFsc2UKKyAgICBwcm9iZUludGVydmFsSW5TZWNvbmRzOiAxNQorCitkZWZhdWx0SGVhdEFydGlmYWN0VGltZW91dE1pbnV0ZXM6IDYwCisKK3NlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3RzOgorICAgIFlBTkdfWE1MOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBWTkZfQ0FUQUxPRzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEU6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIE1PREVMX1FVRVJZX1NQRUM6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorI0FBSSBBcnRpZmFjdHMKKyAgICBBQUlfU0VSVklDRV9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgQUFJX1ZGX01PRFVMRV9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgQUFJX1ZGX0lOU1RBTkNFX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwgCisgICAgT1RIRVI6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisKK3Jlc291cmNlRGVwbG95bWVudEFydGlmYWN0czoKKyAgICBIRUFUOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5YW1sCisgICAgICAgICAgICAtIHltbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgSEVBVF9WT0w6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHlhbWwKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBIRUFUX05FU1RFRDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEhFQVRfQVJUSUZBQ1Q6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBIRUFUX05FVDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIFlBTkdfWE1MOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIFZORl9DQVRBTE9HOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIFZGX0xJQ0VOU0U6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgVkVORE9SX0xJQ0VOU0U6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEU6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgTU9ERUxfUVVFUllfU1BFQzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICAjQVBQQyBBcnRpZmF0Y3MKKyAgICBBUFBDX0NPTkZJRzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgICNEQ0FFIEFydGlmYWN0cworICAgIERDQUVfVE9TQ0E6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHltbAorICAgICAgICAgICAgLSB5YW1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyAgICBEQ0FFX0pTT046CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIGpzb24KKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIERDQUVfUE9MSUNZOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBlbWYKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIERDQUVfRE9DOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGICAgICAgICAKKyAgICBEQ0FFX0VWRU5UOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisjQUFJIEFydGlmYWN0cworICAgIEFBSV9WRl9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyAgICBBQUlfVkZfTU9EVUxFX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIE9USEVSOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisKK3Jlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzOgorICAgIEhFQVRfRU5WOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBlbnYKKyAgICBWRl9NT0RVTEVTX01FVEFEQVRBOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBqc29uCisjRENBRV9WRiBJbnN0YW5jZSBBcnRpZmFjdHMKKyAgICBEQ0FFX0lOVkVOVE9SWV9UT1NDQToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgICAgICAtIHlhbWwKKyAgICBEQ0FFX0lOVkVOVE9SWV9KU09OOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBqc29uCisgICAgRENBRV9JTlZFTlRPUllfUE9MSUNZOgorICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0gZW1mCisgICAgRENBRV9JTlZFTlRPUllfRE9DOgorICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICBEQ0FFX0lOVkVOVE9SWV9CTFVFUFJJTlQ6CisgICAgICBhY2NlcHRlZFR5cGVzOgorICAgIERDQUVfSU5WRU5UT1JZX0VWRU5UOgorICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgIAorICAgICAgCityZXNvdXJjZUluZm9ybWF0aW9uYWxEZXBsb3llZEFydGlmYWN0czoKKworCityZXF1aXJlbWVudHNUb0Z1bGZpbGxCZWZvcmVDZXJ0OgorCitjYXBhYmlsaXRpZXNUb0NvbnN1bWVCZWZvcmVDZXJ0OgorICAgICAgICAgICAgCit1bkxvZ2dlZFVybHM6CisgICAtIC9zZGMyL3Jlc3QvaGVhbHRoQ2hlY2sKKworY2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbjoKKyAgICBjbGVhbkludGVydmFsSW5NaW51dGVzOiAxNDQwCisgICAgY29tcG9uZW50c1RvQ2xlYW46CisgICAgICAgLSBSZXNvdXJjZQorICAgICAgIC0gU2VydmljZQorCithcnRpZmFjdHNJbmRleDogcmVzb3VyY2VzCisKK2Nhc3NhbmRyYUNvbmZpZzoKKyAgICBjYXNzYW5kcmFIb3N0czogWydsb2NhbGhvc3QnXQorICAgIGxvY2FsRGF0YUNlbnRlcjoKKyAgICByZWNvbm5lY3RUaW1lb3V0IDogMzAwMDAKKyAgICBhdXRoZW50aWNhdGU6IGZhbHNlCisgICAgdXNlcm5hbWU6IGtva28KKyAgICBwYXNzd29yZDogYm9ibworICAgIHNzbDogZmFsc2UKKyAgICB0cnVzdHN0b3JlUGF0aCA6IC9wYXRoL3BhdGgKKyAgICB0cnVzdHN0b3JlUGFzc3dvcmQgOiAxMjMxMjMKKyAgICBrZXlTcGFjZXM6CisgICAgICAgIC0geyBuYW1lOiBzZGNhdWRpdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgIC0geyBuYW1lOiBzZGNhcnRpZmFjdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgIC0geyBuYW1lOiBzZGNjb21wb25lbnQsIHJlcGxpY2F0aW9uU3RyYXRlZ3k6IFNpbXBsZVN0cmF0ZWd5LCByZXBsaWNhdGlvbkluZm86IFsnMSddfQorICAgICAgICAKKyAgICAgICAKK3N3aXRjaG92ZXJEZXRlY3RvcjoKKyAgICBnQmVGcWRuOiAKKyAgICBnRmVGcWRuOiAKKyAgICBiZVZpcDogMS4yLjMuNAorICAgIGZlVmlwOiAxLjIuMy40CisgICAgYmVSZXNvbHZlQXR0ZW1wdHM6IDMKKyAgICBmZVJlc29sdmVBdHRlbXB0czogMworICAgIGVuYWJsZWQ6IGZhbHNlCisgICAgaW50ZXJ2YWw6IDYwCisgICAgY2hhbmdlUHJpb3JpdHlVc2VyOiBlY29tcGFzZGMKKyAgICBjaGFuZ2VQcmlvcml0eVBhc3N3b3JkOiBlY29tcGFzZGMxMjMKKyAgICBwdWJsaXNoTmV0d29ya1VybDogImh0dHA6Ly9sb2NhbGhvc3QvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy91cGRhdGVfbmV0d29yaz91c2VyPXJvb3QiCisgICAgcHVibGlzaE5ldHdvcmtCb2R5OiAneyJub3RlIjoicHVibGlzaCBuZXR3b3JrIn0nCisgICAgZ3JvdXBzOgorICAgICAgYmVTZXQ6IHsgY2hhbmdlUHJpb3JpdHlVcmw6ICJodHRwOi8vbG9jYWxob3N0L2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvc2l0ZXMvQUlPLUJFLmVjb21wLmlkbnMuY2lwP3VzZXI9cm9vdCIsCisgICAgICAgICAgICAgICBjaGFuZ2VQcmlvcml0eUJvZHk6ICd7Im5hbWUiOiJBSU8tQkUuZWNvbXAuaWRucy5jaXAiLCJ1cmkiOiIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tQkUuZWNvbXAuaWRucy5jaXAiLCJub19hZF9yZWRpcmVjdGlvbiI6ZmFsc2UsInY0Z3JvdXBzIjp7ImZhaWxvdmVyX2dyb3VwcyI6WyIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfbWdfYmUiLCIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfYnNfYmUiXSwiZmFpbG92ZXJfcG9saWN5IjpbIkZBSUxBTEwiXX0sImNvbW1lbnQiOiJBSU8gQkUgRy1mcWRuIiwiaW50ZW5kZWRfYXBwX3Byb3RvIjoiRE5TIn0nfQorICAgICAgZmVTZXQ6IHsgY2hhbmdlUHJpb3JpdHlVcmw6ICJodHRwOi8vY29yYS53ZWIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tRkUuZWNvbXAuaWRucy5jaXA/dXNlcj1yb290IiwKKyAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5Qm9keTogJ3siY29tbWVudCI6IkFJTyBHLWZxZG4iLCJuYW1lIjoiQUlPLUZFLmVjb21wLmlkbnMuY2lwIiwidjRncm91cHMiOnsiZmFpbG92ZXJfZ3JvdXBzIjpbIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9tZ19mZSIsIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9ic19mZSJdLCJmYWlsb3Zlcl9wb2xpY3kiOlsiRkFJTEFMTCJdfSwibm9fYWRfcmVkaXJlY3Rpb24iOmZhbHNlLCJpbnRlbmRlZF9hcHBfcHJvdG8iOiJETlMiLCJ1cmkiOiIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tRkUuZWNvbXAuaWRucy5jaXAifSd9CisgICAgCisgICAgICAgCitoZWF0RW52QXJ0aWZhY3RIZWFkZXI6CisgICAgIiIKK2hlYXRFbnZBcnRpZmFjdEZvb3RlcjoKKyAgICAiIgorCitvbmJvYXJkaW5nOgorICAgIHByb3RvY29sOiBodHRwCisgICAgaG9zdDogbG9jYWxob3N0CisgICAgcG9ydDogODA4MAorICAgIGRvd25sb2FkQ3NhclVyaTogIi9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cy9wYWNrYWdlcyIKKyAgICAjZG93bmxvYWRDc2FyVXJpOiAiL29uYm9hcmRpbmdjaS9vbmJyZXN0L29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLXNvZnR3YXJlLXByb2R1Y3RzL3BhY2thZ2VzIgorICAgCithcHBsaWNhdGlvbkwxQ2FjaGU6CisgICAgZGF0YXR5cGVzOgorICAgICAgICBlbmFibGVkOiB0cnVlCisgICAgICAgIGZpcnN0UnVuRGVsYXk6IDEwCisgICAgICAgIHBvbGxJbnRlcnZhbEluU2VjOiA2MAorCithcHBsaWNhdGlvbkwyQ2FjaGU6CisgICAgZW5hYmxlZDogdHJ1ZQorICAgIGNhdGFsb2dMMUNhY2hlOgorICAgICAgICBlbmFibGVkOiB0cnVlCisgICAgICAgIHJlc291cmNlc1NpemVJbkNhY2hlOiAzMDAKKyAgICAgICAgc2VydmljZXNTaXplSW5DYWNoZTogMjAwCisgICAgICAgIHByb2R1Y3RzU2l6ZUluQ2FjaGU6IDEwMAorICAgIHF1ZXVlOgorICAgICAgICBzeW5jSW50ZXJ2YWxJblNlY29uZGVzOiA0MzIwMAorICAgICAgICB3YWl0T25TaHV0RG93bkluTWludXRlczogMTAKKyAgICAgICAgbnVtYmVyT2ZDYWNoZVdvcmtlcnM6IDQKKwordG9zY2FWYWxpZGF0b3JzOgorICAgIHN0cmluZ01heExlbmd0aDogNjU1MzYKK2Rpc2FibGVBdWRpdDogZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvZGlzdHJpYnV0aW9uLWVuZ2luZS1jb25maWd1cmF0aW9uLnlhbWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvZGlzdHJpYnV0aW9uLWVuZ2luZS1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NmEyNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9kaXN0cmlidXRpb24tZW5naW5lLWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDQ2IEBACit1ZWJTZXJ2ZXJzOgorICAgLSB1ZWJzYjkxc2ZkYy5pdC5hdHQuY29tOjM5MDQKKyAgIC0gdWVic2I5MnNmZGMuaXQuYXR0LmNvbTozOTA0CisgICAtIHVlYnNiOTNzZmRjLml0LmF0dC5jb206MzkwNAorCisjIHByZXYgS2Fuc2FzIENpdHkgU2FuZGJveCB1ZWJQdWJsaWNLZXk6IDhGM01EQXRNU0J3d3BTTXkgCit1ZWJQdWJsaWNLZXk6IHNTSmM1cWlCbkt5MnFybGMKKworIyBwcmV2IEthbnNhcyBDaXR5IFNhbmRib3ggdWViU2VjcmV0S2V5OiBnekZtc1R4U0N0TzVSUWZBY2NNNlBxcVgKK3VlYlNlY3JldEtleTogNFpSUHpOSmZFVUswc1NOQnZjY2QybTdYCisKK2Rpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lOiBBU0RDLURJU1RSLU5PVElGLVRPUElDCitkaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWU6IEFTREMtRElTVFItU1RBVFVTLVRPUElDCisKK2luaXRSZXRyeUludGVydmFsU2VjOiA1Citpbml0TWF4SW50ZXJ2YWxTZWM6IDYwCisKK2Rpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzOgorICBpbmZvOgorICAgICAgLSBNVVJBTk8tUEtHCisKK2Rpc3RyaWJOb3RpZlJlc291cmNlQXJ0aWZhY3RUeXBlczoKKyAgbGlmZWN5Y2xlOgorICAgICAgLSBIRUFUCisgICAgICAtIERHLVhNTAorCitlbnZpcm9ubWVudHM6CisgICAtIFBST0QKKworZGlzdHJpYnV0aW9uU3RhdHVzVG9waWM6CisgICBwb2xsaW5nSW50ZXJ2YWxTZWM6IDYwCisgICBmZXRjaFRpbWVTZWM6IDE1CisgICBjb25zdW1lckdyb3VwOiBhc2RjCisgICBjb25zdW1lcklkOiBhc2RjLWlkCisKK2Rpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblRvcGljOgorICAgbWluVGhyZWFkUG9vbFNpemU6IDAKKyAgIG1heFRocmVhZFBvb2xTaXplOiAxMAorICAgbWF4V2FpdGluZ0FmdGVyU2VuZGluZ1NlY29uZHM6IDUKKworCitjcmVhdGVUb3BpYzoKKyAgIHBhcnRpdGlvbkNvdW50OiAxCisgICByZXBsaWNhdGlvbkNvdW50OiAxCisKK3N0YXJ0RGlzdHJpYnV0aW9uRW5naW5lOiB0cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3Y2Q3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSwzODMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm90ZSB0aGUgY29udmVudGlvbnMgb2YgdGhlIGZpZWxkIHZhbHVlczoKKyMgdHlwZSBjYW4gYmUgb25lIG9mOiBDT05GSUdfRVJST1IsIFNZU1RFTV9FUlJPUiwgREFUQV9FUlJPUiwgQ09OTkVDVElPTl9QUk9CTEVNLCBBVVRIRU5USUNBVElPTl9QUk9CTEVNCisjIHNldmVyaXR5IGNhbiBiZSBvbmUgb2Y6IFdBUk4sIEVSUk9SLCBGQVRBTAorIyBhbGFybVNldmVyaXR5IGNhbiBiZSBvbmUgb2Y6IENSSVRJQ0FMLE1BSk9SLE1JTk9SLElORk9STUFUSU9OQUwsTk9ORQorIyBjb2RlIGlzIGEgdW5pcXVlIGludGVnZXIgaW4gcmFuZ2Ugb2YgMzAwMy05OTk5ICgzMDAwLTMwMDIgYXJlIG9jY3VwaWVkIGZvciBpbnRlcm5hbCB1c2FnZSkKKyMgVGhlIGFib3ZlIGVudW1lcmF0aW9uIHZhbHVlcyBhcmUgb3V0LW9mLXRoZS1ib3ggYW5kIGNhbiBiZSBjaGFuZ2VkIGluIGNvZGUuIAorIyBJbiBjYXNlIG9mIGNvbmZpZyBhbmQgY29kZSBtaXNtYXRjaCwgdGhlIGFwcHJvcHJpYXRlIGVycm9yIHdpbGwgYmUgcHJpbnRlZCB0byBsb2cKKyMKKyMjIFJhbmdlIG9mIEJFIGNvZGVzIC0gMzAxMC03OTk5CisKK2Vycm9yczoKKworICAgIEJlUmVzdEFwaUdlbmVyYWxFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwMCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIEJFIFJFU1QgQVBJIGV4ZWN1dGlvbiIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorCisgICAgQmVIZWFsdGhDaGVja0Vycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDEwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3IgZHVyaW5nIEJFIEhlYWx0aCBDaGVjayIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlSW5pdGlhbGl6YXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNhdGFsb2ctQkUgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorCisgICAgQmVSZXNvdXJjZU1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIk1hbmRhdG9yeSByZXNvdXJjZSAlcyBjYW5ub3QgYmUgZm91bmQgaW4gcmVwb3NpdG9yeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlU2VydmljZU1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIk1hbmRhdG9yeSBzZXJ2aWNlICVzIGNhbm5vdCBiZSBmb3VuZCBpbiByZXBvc2l0b3J5IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRBZGRpbmdSZXNvdXJjZUluc3RhbmNlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTMsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gYWRkIHJlc291cmNlIGluc3RhbmNlIG9mIHJlc291cmNlICVzIHRvIHNlcnZpY2UgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUluY29ycmVjdFNlcnZpY2VFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIlNlcnZpY2UgJXMgaXMgbm90IHZhbGlkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgIAorICAgIEJlUmVwb3NpdG9yeURlbGV0ZUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDE1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGRlbGV0ZSBvYmplY3QgJXMgZnJvbSByZXBvc2l0b3J5IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVSZXBvc2l0b3J5UXVlcnlFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxNiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBmZXRjaCBmcm9tIHJlcG9zaXRvcnkgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUludmFsaWRDb25maWd1cmF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09ORklHX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTcsCisgICAgICAgIHNldmVyaXR5OiBGQVRBTCwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlciAlcyBpcyBpbnZhbGlkLiBWYWx1ZSBjb25maWd1cmVkIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAKKyAgICBCZVVlYkNvbm5lY3Rpb25FcnJvcjogeworICAgICAgICB0eXBlOiBDT05ORUNUSU9OX1BST0JMRU0sCisgICAgICAgIGNvZGU6IEFTRENfNDAwMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbm5lY3Rpb24gcHJvYmxlbSB0b3dhcmRzIFUtRUIgc2VydmVyLiBSZWFzb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVZWJTeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIG9jY3VyZWQgZHVyaW5nIGFjY2VzcyB0byBVLUVCIFNlcnZlci4gT3BlcmF0aW9uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVWViT2JqZWN0Tm90Rm91bmRFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDUsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBvY2N1cmVkIGR1cmluZyBhY2Nlc3MgdG8gVS1FQiBTZXJ2ZXIuIERhdGEgbm90IGZvdW5kOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorCisgICAgQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAyMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIG9jY3VyZWQgaW4gRGlzdHJpYnV0aW9uIEVuZ2luZS4gRmFpbGVkIG9wZXJhdGlvbjogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVlYkF1dGhlbnRpY2F0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQVVUSEVOVElDQVRJT05fUFJPQkxFTSwKKyAgICAgICAgY29kZTogQVNEQ180MDAzLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQXV0aGVudGljYXRpb24gcHJvYmxlbSB0b3dhcmRzIFUtRUIgc2VydmVyLiBSZWFzb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVZWJVbmtvd25Ib3N0RXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09OTkVDVElPTl9QUk9CTEVNLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25uZWN0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gQ2Fubm90IHJlYWNoIGhvc3QgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZURpc3RyaWJ1dGlvbkVuZ2luZUludmFsaWRBcnRpZmFjdFR5cGU6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDA2LAorICAgICAgICBzZXZlcml0eTogV0FSTiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJUaGUgYXJ0aWZhY3QgdHlwZSAlcyBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgdmFsaWQgYXJ0aWZhY3RzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgQmVJbnZhbGlkVHlwZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwOCwKKyAgICAgICAgc2V2ZXJpdHk6IFdBUk4sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhlIHR5cGUgJXMgb2YgJXMgaXMgaW52YWxpZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlSW52YWxpZFZhbHVlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDI4LAorICAgICAgICBzZXZlcml0eTogV0FSTiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJUaGUgdmFsdWUgJXMgb2YgJXMgZnJvbSB0eXBlICVzIGlzIGludmFsaWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0gCisgICAgCisgICAgQmVGYWlsZWREZWxldGluZ1Jlc291cmNlSW5zdGFuY2VFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAyOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBkZWxldGUgcmVzb3VyY2UgaW5zdGFuY2UgJXMgZnJvbSBzZXJ2aWNlICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTkZJR19FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDMwLAorICAgICAgICBzZXZlcml0eTogRkFUQUwsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlQ29uZmlndXJhdGlvbkludmFsaWRMaXN0U2l6ZUVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTkZJR19FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDMxLAorICAgICAgICBzZXZlcml0eTogRkFUQUwsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJXMgaXMgaW52YWxpZC4gQXQgbGVhc3QgJXMgdmFsdWVzIHNoYWxsIGJlIGNvbmZpZ3VyZWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBFcnJvckNvbmZpZ0ZpbGVGb3JtYXQ6IHsKKyAgICAgICAgdHlwZTogQ09ORklHX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMzIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBlbGVtZW50IG5vdCBmb3VuZCBpbiBZQU1MIG5hbWU6ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVNaXNzaW5nQXJ0aWZhY3RJbmZvcm1hdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxMCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkFydGlmYWN0IHVwbG9hZGVkIGhhcyBtaXNzaW5nIGluZm9ybWF0aW9uLiBNaXNzaW5nICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVBcnRpZmFjdE1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJBcnRpZmFjdCAlcyByZXF1ZXN0ZWQgaXMgbm90IGZvdW5kIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVBcnRpZmFjdFBheWxvYWRJbnZhbGlkOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIlBheWxvYWQgb2YgYXJ0aWZhY3QgdXBsb2FkZWQgaXMgaW52YWxpZCAoaW52YWxpZCBNRDUgb3IgZW5jcnlwdGlvbikiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVzZXJNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDA5LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVXNlciAlcyByZXF1ZXN0ZWQgaXMgbm90IGZvdW5kIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVBcnRpZmFjdEluZm9ybWF0aW9uSW52YWxpZEVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxMywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIklucHV0IGZvciBhcnRpZmFjdCBtZXRhZGF0YSBpcyBpbnZhbGlkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgQmVGYWlsZWRBZGRpbmdDYXBhYmlsaXR5VHlwZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxNSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCBhZGRpbmcgY2FwYWJpbGl0eSB0eXBlIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVDYXBhYmlsaXR5VHlwZU1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTYsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDYXBhYmlsaXR5IFR5cGUgJXMgbm90IGZvdW5kIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVJbnRlcmZhY2VNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDIwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiSW50ZXJmYWNlICVzIHJlcXVpcmVkIGlzIG1pc3NpbmciLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZURhb1N5c3RlbUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE0LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiT3BlcmF0aW9uIHRvd2FyZHMgZGF0YWJhc2UgZmFpbGVkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVTeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxNywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG9wZXJhdGlvbiIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkTG9ja09iamVjdEVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDA3LAorICAgICAgICBzZXZlcml0eTogV0FSTiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gbG9jayBvYmplY3QgZm9yIHVwZGF0ZSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlSW52YWxpZEpzb25JbnB1dDogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxOCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBjb252ZXJ0IGpzb24gaW5wdXQgdG8gb2JqZWN0IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVEaXN0cmlidXRpb25NaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDIxLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRGlzdHJpYnV0aW9uICVzIHJlcXVpcmVkIGlzIG1pc3NpbmciLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUhlYWx0aENoZWNrUmVjb3Zlcnk6IHsKKyAgICAgICAgdHlwZTogUkVDT1ZFUlksCisgICAgICAgIGNvZGU6IEFTRENfNDAyMiwKKyAgICAgICAgc2V2ZXJpdHk6IElORk8sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQkUgSGVhbHRoIENoZWNrIFJlY292ZXJ5IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogSU5GT1JNQVRJT05BTAorICAgIH0KKyAgICBCZUZhaWxlZENyZWF0ZU5vZGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gY3JlYXRlIG5vZGUgJXMgb24gZ3JhcGguIHN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlRmFpbGVkVXBkYXRlTm9kZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byB1cGRhdGUgbm9kZSAlcyBvbiBncmFwaC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWREZWxldGVOb2RlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDAyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGRlbGV0ZSBub2RlICVzIG9uIGdyYXBoLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwMywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byByZXRyaWV2ZSBub2RlICVzIGZyb20gZ3JhcGguIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRXhlY3V0ZVJvbGxiYWNrRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA0LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZEZpbmRQYXJlbnRFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDUsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZmluZCBwYXJlbnQgbm9kZSAlcyBvbiBncmFwaC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRGaW5kQWxsTm9kZXNFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDYsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZmV0Y2ggYWxsIG5vZGVzIHdpdGggdHlwZSAlcyBvZiBwYXJlbnQgbm9kZSAlcyAuIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkRmluZEFzc29jaWF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA3LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ2Fubm90IGZpbmQgbm9kZSB3aXRoIHR5cGUgJXMgYXNzb2NpYXRlZCB3aXRoIG5vZGUgJXMgLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZEZpbmRBc3NvY2lhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwOCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNhbm5vdCBmaW5kIG5vZGUgd2l0aCB0eXBlICVzIGFzc29jaWF0ZWQgd2l0aCBub2RlICVzIC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgQmVDb21wb25lbnRDbGVhbmVyU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBvY2N1cmVkIGluIENvbXBvbmVudCBDbGVhbmVyIFRhc2suIEZhaWxlZCBvcGVyYXRpb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1NGNlMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSwxNjk0IEBACisjIEVycm9ycworZXJyb3JzOgorICAgIE9LOiB7CisgICAgICAgIGNvZGU6IDIwMCwKKyAgICAgICAgbWVzc2FnZTogIk9LIgorICAgIH0KKyAgICBDUkVBVEVEOiB7CisgICAgICAgIGNvZGU6IDIwMSwKKyAgICAgICAgbWVzc2FnZTogIk9LIgorICAgIH0KKyAgICBOT19DT05URU5UOiB7CisgICAgICAgIGNvZGU6IDIwNCwKKyAgICAgICAgbWVzc2FnZTogIk5vIENvbnRlbnQiCisgICAgfQorIy0tLS0tLS0tUE9MNDA1MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBOT1RfQUxMT1dFRDogeworICAgICAgICBjb2RlOiA0MDUsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWV0aG9kIG5vdCBhbGxvd2VkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDQwNTAiCisgICAgfQorIy0tLS0tLS0tUE9MNTAwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBHRU5FUkFMX0VSUk9SOiB7CisgICAgICAgIGNvZGU6IDUwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMCIKKyAgICB9CisjLS0tLS0tLS0tUE9MNTAwMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgTUlTU0lOR19YX0VDT01QX0lOU1RBTkNFX0lEOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgJ1gtRUNPTVAtSW5zdGFuY2VJRCcgSFRUUCBoZWFkZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMSIKKyAgICB9CisjLS0tLS0tLS0tUE9MNTAwMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgQVVUSF9SRVFVSVJFRDogeworICAgICAgICBjb2RlOiA0MDEgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEFQSS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w1MDAyIgorICAgIH0KKyMtLS0tLS0tLS1QT0w1MDAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBBVVRIX0ZBSUxFRDogeworICAgICAgICBjb2RlOiA0MDMgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBOb3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIEFQSS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w1MDAzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9DT05URU5UOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwMCIKKyAgICB9Iy0tLS0tLS0tLVNWQzQwMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX0NPTlRFTlQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTU0lOR19JTkZPUk1BVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBpbmZvcm1hdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDAyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgVVNFUl9JRCAgICAgCisgICAgVVNFUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIGVtYWlsIGFkZHJlc3MgICAgIAorICAgIElOVkFMSURfRU1BSUxfQUREUkVTUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBlbWFpbCBhZGRyZXNzICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSByb2xlCisgICAgSU5WQUxJRF9ST0xFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJvbGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgVVNFUl9JRCAgICAgCisgICAgVVNFUl9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIHdpdGggJyUxJyBJRCBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIERFTEVURV9VU0VSX0FETUlOX0NPTkZMSUNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBbiBhZG1pbmlzdHJhdG9yIGNhbiBvbmx5IGJlIGRlbGV0ZWQgYnkgYW5vdGhlciBhZG1pbmlzdHJhdG9yLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDciCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIHVzZXJJZCAgICAgCisgICAgSU5WQUxJRF9VU0VSX0lEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHVzZXJJZCAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyAlMSBjb250YWN0IGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNDkiCisgICAgfSAKKyMtLS0tLS0tLS1TVkM0MDUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZS9BZGRpdGlvbmFsIHBhcmFtZXRlcgorIyAlMiAtIHNlcnZpY2UvcmVzb3VyY2UvbGFiZWwgbmFtZQorICAgIENPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIHdpdGggbmFtZSAnJTInIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gcmVzb3VyY2Uvc2VydmljZSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19DQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTEiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19UQUdTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEF0IGxlYXN0IG9uZSB0YWcgaGFzIHRvIGJlIHNwZWNpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDUyIgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9NSVNTSU5HX0RFU0NSSVBUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgJTEgZGVzY3JpcHRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gcmVzb3VyY2Uvc2VydmljZQorICAgIENPTVBPTkVOVF9JTlZBTElEX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEludmFsaWQgJTEgY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX1ZFTkRPUl9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgdmVuZG9yIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX1ZFTkRPUl9SRUxFQVNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgdmVuZG9yIHJlbGVhc2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NiIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDU3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBNSVNTSU5HX0RFUklWRURfRlJPTV9URU1QTEFURTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIGRlcml2ZWQgZnJvbSB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTciCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX01JU1NJTkdfSUNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGljb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1OCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX0lOVkFMSURfSUNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBJbnZhbGlkICUxIGljb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgUEFSRU5UX1JFU09VUkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBEZXJpdmVkIGZyb20gcmVzb3VyY2UgdGVtcGxhdGUgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDYwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDYxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBNVUxUSVBMRV9QQVJFTlRfUkVTT1VSQ0VfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTXVsdGlwbGUgZGVyaXZlZCBmcm9tIHJlc291cmNlIHRlbXBsYXRlIGlzIG5vdCBhbGxvd2VkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjEiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA2Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgTUlTU0lOR19DT01QT05FTlRfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgIyUxwqAgLcKgIHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyAgICBSRVNPVVJDRV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHJlc291cmNlIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDY0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyAgICBDT01QT05FTlRfSU5WQUxJRF9ERVNDUklQVElPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBkZXNjcmlwdGlvbiBjb250YWlucyBub24tZW5nbGlzaCBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorIyAlMiAtIG1heCByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgbGVuZ3RoIAorICAgIENPTVBPTkVOVF9ERVNDUklQVElPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGRlc2NyaXB0aW9uIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDY2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIG1heCBsZW5ndGggICAKKyAgICBDT01QT05FTlRfVEFHU19FWENFRURfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGFncyBvdmVyYWxsIGxlbmd0aCBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIG1heCBsZW5ndGggIAorICAgIFZFTkRPUl9OQU1FX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVmVuZG9yIG5hbWUgZXhjZWVkcyBsaW1pdCBvZiAlMSBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtYXggbGVuZ3RoICAKKyAgICBWRU5ET1JfUkVMRUFTRV9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciByZWxlYXNlIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY4IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZS9Qcm9kdWN0CisgICAgQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVF9JRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBjb250YWN0IGlkIHNob3VsZCBiZSBpbiBmb3JtYXQgJ21ubm5ubm4nIG9yICdhYW5ubmEnIG9yICdhYW5ubm4nLCB3aGVyZSBtPW0gLGE9YS16QS1aIGFuZCBuPTAtOSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorICAgIElOVkFMSURfQ09NUE9ORU5UX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgbmFtZSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGNoYXJhY3RlcnMgbGlrZSA8PjoiXC98PyogYW5kIHNwYWNlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiByZWd1bGFyIHNwYWNlLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNzAiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA3MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1ZFTkRPUl9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciBuYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA3Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1ZFTkRPUl9SRUxFQVNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciByZWxlYXNlIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA3My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gbWF4ICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgIAorICAgIENPTVBPTkVOVF9OQU1FX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgbmFtZSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA4MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUQgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfSU5fQ0hFQ0tPVVRfU1RBVEU6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIGxvY2tlZCBmb3IgbW9kaWZpY2F0aW9uIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDgxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEwqBvZsKgbGFzdCBtb2RpZmllcgorICAgIENPTVBPTkVOVF9JTl9DRVJUX0lOX1BST0dSRVNTX1NUQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiBpcyBsb2NrZWQgZm9yIGNlcnRpZmljYXRpb24gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODEiCisgICAgfQorCisjLS0tLS0tLS0tLS1TVkM0MDgyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfU0VOVF9GT1JfQ0VSVElGSUNBVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgc2VudCBmb3IgY2VydGlmaWNhdGlvbiBieSAlMyAlNCglNSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4MiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MDgzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ09NUE9ORU5UX1ZFUlNJT05fQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVmVyc2lvbiBvZiB0aGlzICUxIHdhcyBhbHJlYWR5IHByb21vdGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODMiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfQUxSRUFEWV9DSEVDS0VEX0lOOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mICclMScgJTIgd2FzIGFscmVhZHkgY2hlY2tlZC1pbiBieSAlMyAlNCglNSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4NCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MDg1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlL3Byb2R1Y3TCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0CisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEwqBvZsKgbGFzdCBtb2RpZmllcgorICAgIENPTVBPTkVOVF9DSEVDS09VVF9CWV9BTk9USEVSX1VTRVI6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICUyIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBvdXQgYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODUiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgIC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoCAtIHJlc291cmNlL3NlcnZpY2UKKyAgICBDT01QT05FTlRfSU5fVVNFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiBpcyBpbiB1c2UgYnkgYW5vdGhlciB1c2VyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODYiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLSBjb21wb25lbnTCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0CisgICAgQ09NUE9ORU5UX0hBU19ORVdFUl9WRVJTSU9OOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBDaGVja2luZyBvdXQgb2YgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIG9mIHRoZSAnJTEnICUyIGlzIG5vdCBhbGxvd2VkIGFzIGEgbmV3ZXIgdmVyc2lvbiBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4NyIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MDg4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0FMUkVBRFlfQ0VSVElGSUVEOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJTEgJTIgaGFzIGFscmVhZHkgYmVlbiBjZXJ0aWZpZWQgYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisgICAgQ09NUE9ORU5UX05PVF9SRUFEWV9GT1JfQ0VSVElGSUNBVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgbm90IHJlYWR5IGZvciBjZXJ0aWZpY2F0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODkiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxwqAtwqBwcm9wZXJ0ecKgbmFtZQorICAgIFBST1BFUlRZX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcHJvcGVydHkgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTAwIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBQUk9QRVJUWV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBQcm9wZXJ0eSB3aXRoICclMScgbmFtZSBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTAxIgorICAgIH0KKworIy0tLS0tLS0tLS0tU1ZDNDEwMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgY2FwYWJpbGl0eSB0eXBlIG5hbWUgCisgICAgQ0FQQUJJTElUWV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IENhcGFiaWxpdHkgVHlwZSB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTAyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBVVRIX0ZBSUxFRF9JTlZBTElERV9IRUFERVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQXV0aG9yaXphdGlvbiBoZWFkZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDExNCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTE1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBjYXBhYmlsaXR5IHR5cGUgbmFtZSAKKyAgICBNSVNTSU5HX0NBUEFCSUxJVFlfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIENhcGFiaWxpdHkgVHlwZSAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTUiCisgICAgfQorICAgIFJFU09VUkNFX0lOU1RBTkNFX0JBRF9SRVFVRVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDExNiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTE3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqByZXNvdXJjZSBpbnN0YW5jZSBuYW1lCisjICUywqAtwqByZXNvdXJjZSBpbnN0YW5jZSBuYW1lCisjICUzwqAtwqByZXF1aXJlbWVudCBuYW1lCisgICAgUkVTT1VSQ0VfSU5TVEFOQ0VfTUFUQ0hfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNYXRjaCBub3QgZm91bmQgYmV0d2VlbiByZXNvdXJjZSBpbnN0YW5jZSAnJTEnIGFuZCByZXNvdXJjZSBpbnN0YW5jZSAnJTInIGZvciByZXF1aXJlbWVudCAnJTMnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTciCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlMsKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlM8KgLcKgcmVxdWlyZW1lbnQgbmFtZQorICAgIFJFU09VUkNFX0lOU1RBTkNFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc291cmNlIGluc3RhbmNlcyAnJTEnIGFuZCAnJTInIGFyZSBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCByZXF1aXJlbWVudCAnJTMnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlMsKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlM8KgLcKgcmVxdWlyZW1lbnQgbmFtZQorICAgIFJFU09VUkNFX0lOU1RBTkNFX1JFTEFUSU9OX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTm8gcmVsYXRpb24gZm91bmQgYmV0d2VlbiByZXNvdXJjZSBpbnN0YW5jZXMgJyUxJyBhbmQgJyUyJyBmb3IgcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoFVzZXIncyBVU0VSX0lECisgICAgVVNFUl9JTkFDVElWRTogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXNlciAlMSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjAiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgVXNlcidzIFVTRVJfSUQKKyAgICBVU0VSX0hBU19BQ1RJVkVfRUxFTUVOVFM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgd2l0aCAlMSBJRCBjYW4gbm90IGJlIGRlbGV0ZWQgc2luY2UgaXQgaGFzIGFjdGl2ZSBlbGVtZW50cyhyZXNvdXJjZXMvc2VydmljZXMvYXJ0aWZhY3RzKS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIxIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoGFydGlmYWN0IHR5cGUKKyAgICBBUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgYXJ0aWZhY3QgdHlwZSAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFSVElGQUNUX0xPR0lDQUxfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgbG9naWNhbCBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjMiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfQVJUSUZBQ1RfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBhcnRpZmFjdCB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMS1hcnRpZmFjdCBuYW1lCisgICAgQVJUSUZBQ1RfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICclMScgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEyNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDEyNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0Ly4uLgorIyAlMsKgLSBmaWVsZCAodGFnLCB2ZW5kb3IgbmFtZS4uLikKKyAgICBJTlZBTElEX0ZJRUxEX0ZPUk1BVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogIEludmFsaWQgJTEgJTIgZm9ybWF0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjYiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFSVElGQUNUX0lOVkFMSURfTUQ1OiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGFydGlmYWN0IGNoZWNrc3VtLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjciCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfQVJUSUZBQ1RfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBNaXNzaW5nIGFydGlmYWN0IG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEyOCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTI5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTUlTU0lOR19QUk9KRUNUX0NPREU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBQUk9KRUNUX0NPREUgbnVtYmVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjkiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElOVkFMSURfUFJPSkVDVF9DT0RFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFBST0pFQ1RfQ09ERSBudW1iZXIgbXVzdCBiZSBudW1lcmljIGZyb20gNSB1cCB0byAxMCBkaWdpdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzMCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTMxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxLXJlc291cmNlL3NlcnZpY2UKKyMgJTItc3J0aWZhY3QvYXJ0aWZhY3RzCisjICUzLXNlbWljb2xvbW4gc2VwYXJhdGVkIGxpc3Qgb2YgYXJ0aWZhY3QgCisgICAgQ09NUE9ORU5UX01JU1NJTkdfTUFOREFUT1JZX0FSVElGQUNUUzogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBtYW5kYXRvcnkgaW5mb3JtYXRpb25hbCAlMSAlMjogWyUzXS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTMxIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBsaWZlY3ljbGUgIHR5cGUgbmFtZQorICAgIExJRkVDWUNMRV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IExpZmVjeWNsZSBUeXBlIHdpdGggbmFtZSAnJTEnIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHNlcnZpY2UgdmVyc2lvbgorIyAlMiAtIHNlcnZpY2UgbmFtZQorICAgIFNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBWZXJzaW9uICUxIG9mICclMicgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIGZvciBkaXN0cmlidXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzMyIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTM0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTUlTU0lOR19MSUZFQ1lDTEVfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIGludGVyZmFjZSBsaWZlLWN5Y2xlIHR5cGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDEzNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTZXJ2aWNlIGNhdGVnb3J5IGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHNlcnZpY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gZGlzdHJpYnV0aW9uIGVudmlyb25tZW50IG5hbWUgICAgCisgICAgRElTVFJJQlVUSU9OX0VOVklST05NRU5UX05PVF9BVkFJTEFCTEU6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gZW52aXJvbm1lbnQgJyUxJyBpcyBub3QgYXZhaWxhYmxlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gZGlzdHJpYnV0aW9uIGVudmlyb25tZW50IG5hbWUgICAgCisgICAgRElTVFJJQlVUSU9OX0VOVklST05NRU5UX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCAnJTEnIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDEzOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgRElTVFJJQlVUSU9OX0VOVklST05NRU5UX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgZGlzdHJpYnV0aW9uIGVudmlyb25tZW50LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorIyAlMSAtIHNlcnZpY2UgbmFtZQorICAgIERJU1RSSUJVVElPTl9BUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFNlcnZpY2UgJyUxJyBjYW5ub3QgYmUgZGlzdHJpYnV0ZWQgZHVlIHRvIG1pc3NpbmcgZGVwbG95bWVudCBhcnRpZmFjdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDIwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gbWF4IGljb24gbmFtZSBsZW5ndGggICAKKyAgICBDT01QT05FTlRfSUNPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGljb24gbmFtZSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDIwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDMwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNUUklDVEVEX0FDQ0VTUzogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzdHJpY3RlZCBhY2Nlc3MuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDMwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDMwMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNUUklDVEVEX09QRVJBVElPTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzdHJpY3RlZCBvcGVyYXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDMwMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgTUlTU0lOR19CT0RZOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgcmVxdWVzdCBib2R5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX1BVQkxJQ19LRVk6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgJ2FwaVB1YmxpY0tleScuIiAsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZfRE9FU19OT1RfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAgQm9keSAgOiBNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgJ2Rpc3RyRW52TmFtZScuIiAsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDUwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHNlcnZpY2UgbmFtZQorICAgIFNFUlZJQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyBzZXJ2aWNlIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwMyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTA0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyMgJTIgLSBzZXJ2aWNlL3Jlc291cmNlIHZlcnNpb24KKyAgICBDT01QT05FTlRfVkVSU0lPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIHZlcnNpb24gJTIgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA0IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ1MDUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjJTEtYXJ0aWZhY3QgbmFtZQorIAorICAgIEFSVElGQUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTU0lOR19FTlZfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlciAnZGlzdHJFbnZOYW1lJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTA3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIENPTVBPTkVOVF9JTlZBTElEX1RBR1NfTk9fQ09NUF9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE9uZSBvZiB0aGUgdGFncyBzaG91bGQgYmUgdGhlIGNvbXBvbmVudCBuYW1lLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDciCisgICAgfQorIAorIy0tLS0tLS0tLVNWQzQ1MDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTZXJ2aWNlIG5hbWUgY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgc2VydmljZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwOCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTA5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFNFUlZJQ0VfSUNPTl9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSWNvbiBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSBzZXJ2aWNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTEwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGljb24gbmFtZSBtYXggbGVuZ3RoCisgICAgU0VSVklDRV9JQ09OX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gSWNvbiBuYW1lIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTEwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTExLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIERJU1RSSUJVVElPTl9SRVFVRVNURURfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBEaXN0cmlidXRpb24gSUQKKyAgICBESVNUUklCVVRJT05fUkVRVUVTVEVEX0ZBSUxFRDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiAnJTEnIGZhaWxlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTEyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSBjYXRlZ29yeSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lDT05fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEljb24gY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgcmVzb3VyY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfVkVORE9SX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZlbmRvciBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0RFUklWRURfRlJPTV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRGVyaXZlZCBmcm9tIHJlc291cmNlIHRlbXBsYXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIG1heCBsZW5ndGggCisgICAgQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFNpbmdsZSB0YWcgZXhjZWVkcyBsaW1pdCBvZiAlMSBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9ERUZBVUxUX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBtaXNtYXRjaCBpbiBkYXRhLXR5cGUgb2NjdXJyZWQgZm9yIHByb3BlcnR5ICUxLiBkYXRhIHR5cGUgaXMgJTIgYW5kIGRlZmF1bHQgdmFsdWUgZm91bmQgaXMgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlIG9yIHJlc291cmNlIAorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fTUFYX05VTUJFUl9SRUFDSEVEOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNYXhpbWFsIG51bWJlciBvZiBhZGRpdGlvbmFsICUxIHBhcmFtZXRlcnMgd2FzIHJlYWNoZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fRU1QVFlfU1RSSU5HX05PVF9BTExPV0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxhYmVsIGFuZCB2YWx1ZSBjYW5ub3QgYmUgZW1wdHkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBsYWJlbC92YWx1ZQorIyAlMiAtIE1heGltYWwgbGVuZ3RoIG9mICUxCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gJTEgZXhjZWVkcyBsaW1pdCBvZiAlMiBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX0tFWV9OT1RfQUxMT1dFRF9DSEFSQUNURVJTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGFiZWwgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBjaGFyYWN0ZXJzIGxpa2UgPD46IlwvfD8qIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gcmVndWxhciBzcGFjZS4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTIzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX1ZBTFVFX05PVF9BTExPV0VEX0NIQVJBQ1RFUlM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgQ29udGVudC4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBjb250YWlucyBub24tZW5nbGlzaCBjaGFyYWN0ZXJzLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyByZXNvdXJjZSBpbnN0YW5jZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgQVNEQ19WRVJTSU9OX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA1MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogQVNEQyB2ZXJzaW9uIGNhbm5vdCBiZSBkaXNwbGF5ZWQuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEtYXJ0aWZhY3QgdXJsL2FydGlmYWN0IGxhYmVsL2FydGlmYWN0IGRlc2NyaXB0aW9uL1ZORiBTZXJ2aWNlIEluZGljYXRvcgorICAgIE1JU1NJTkdfREFUQTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBNaXNzaW5nICUxLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxLWFydGlmYWN0IHVybC9hcnRpZmFjdCBsYWJlbC9hcnRpZmFjdCBkZXNjcmlwdGlvbi9hcnRpZmFjdCBuYW1lCisjICUyIC0gTWF4aW1hbCBsZW5ndGggb2YgJTEKKyAgICBFWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTMwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEFSVElGQUNUX0lOVkFMSURfVElNRU9VVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBcnRpZmFjdCBUaW1lb3V0IHNob3VsZCBiZSBzZXQgdG8gdmFsaWQgcG9zaXRpdmUgbm9uLXplcm8gbnVtYmVyIG9mIG1pbnV0ZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0lTX1ZORl9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVk5GIEluZGljYXRvciBjYW5ub3QgYmUgdXBkYXRlZCBmb3IgY2VydGlmaWVkIHNlcnZpY2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzMSIKKyAgICB9CisgIy0tLS0tLS0tLVNWQzQ1MzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EX09OX1NFUlZJQ0U6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHJlc291cmNlIGluc3RhbmNlIHdhcyBub3QgZm91bmQgb24gdGhlIHNlcnZpY2UgJyUyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzIiCisgICAgfQorICMtLS0tLS0tLS1TVkM0NTMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICMgJTEgLSAgIkhFQVQiLyJIRUFUX0VOViIvIk1VUkFOT19QS0ciLyJZQU5HX1hNTCIgCisgICAgV1JPTkdfQVJUSUZBQ1RfRklMRV9FWFRFTlNJT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgZmlsZSBleHRlbnNpb24gZm9yICUxIGFydGlmYWN0IHR5cGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzMyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTM0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSEVBVCIvIkhFQVRfRU5WIiAgICAgICAgICAgICAKKyAgICBJTlZBTElEX1lBTUw6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVwbG9hZGVkIFlBTUwgZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTM0IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQ1MzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gICJIRUFUIiAgICAgICAgICAgICAKKyAgICBJTlZBTElEX0RFUExPWU1FTlRfQVJUSUZBQ1RfSEVBVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSBhcnRpZmFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisjICUyIC0gIHJlc291cmNlL3NlcnZpY2UgbmFtZSAKKyMgJTMgLSAgIkhFQVQiLyJIRUFUX0VOViIvIk1VUkFOT19QS0ciIAorIyAlNCAtICAiSEVBVCIvIkhFQVRfRU5WIi8iTVVSQU5PX1BLRworICAgIERFUExPWU1FTlRfQVJUSUZBQ1RfT0ZfVFlQRV9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgJyUyJyBhbHJlYWR5IGhhcyBhIGRlcGxveW1lbnQgYXJ0aWZhY3Qgb2YgJTMgdHlwZSAuUGxlYXNlIGRlbGV0ZSBvciB1cGRhdGUgYW4gZXhpc3RpbmcgJTQgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNiIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTM3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfSEVBVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBIRUFUIGFydGlmYWN0LiBIRUFUX0VOViBhcnRpZmFjdCBjYW5ub3QgYmUgdXBsb2FkZWQgd2l0aG91dCBjb3JyZXNwb25kaW5nIEhFQVQgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNNQVRDSF9IRUFUX1ZTX0hFQVRfRU5WOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGFydGlmYWN0IGNvbnRlbnQuIFBhcmFtZXRlcidzIHNldCBpbiBIRUFUX0VOViAnJTEnIGFydGlmYWN0IGRvZXNuJ3QgbWF0Y2ggdGhlIHBhcmFtZXRlcnMgaW4gSEVBVCAnJTInIGFydGlmYWN0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9SRVNPVVJDRV9QQVlMT0FEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJlc291cmNlIHBheWxvYWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1RPU0NBX0ZJTEVfRVhURU5TSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGZvciBUT1NDQSB0ZW1wbGF0ZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfWUFNTF9GSUxFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIFlBTUwgZmlsZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfVE9TQ0FfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgVE9TQ0EgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBOT1RfUkVTT1VSQ0VfVE9TQ0FfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEltcG9ydGVkIFNlcnZpY2UgVE9TQ0EgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBOT1RfU0lOR0xFX1JFU09VUkNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBUT1NDQSB0ZW1wbGF0ZSBzaG91bGQgY29udGFpbiBvbmUgcmVzb3VyY2UgZGVmaW5pdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQ0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQ1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfUkVTT1VSQ0VfTkFNRVNQQUNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJlc291cmNlIG5hbWVzcGFjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQ1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTQ2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBpbiBBU0RDIENhdGFsb2cuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1JFU09VUkNFX0NIRUNLU1VNOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJlc291cmNlIGNoZWNrc3VtLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgIyUxwqAgLcKgIENvbnN1bWVyIHNhbHQKKyAgICBJTlZBTElEX0xFTkdUSDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSBsZW5ndGguIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1MCIKKyAgICB9CisgICAgIy0tLS0tLS0tLVNWQzQ1NTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgICMlMcKgIC3CoCBFQ09NUCBVc2VyIG5hbWUKKyAgICBFQ09NUF9VU0VSX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRUNPTVAgVXNlciAnJTEnIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENPTlNVTUVSX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBFQ09NUCBVc2VyIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMlMcKgIC3CoCBDb25zdW1lciBuYW1lIC8gQ29uc3VtZXIgcGFzc3dvcmQvIENvbnN1bWVyIHNhbHQgCisgICAgSU5WQUxJRF9DT05URU5UX1BBUkFNOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBpcyBpbnZhbGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTMiCisgICAgfQorICAgICMtLS0tLS0tLS1TVkM0NTU0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisgICAgQ09NUE9ORU5UX0FSVElGQUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGFydGlmYWN0IGRvZXNuJ3QgYmVsb25nIHRvIHNwZWNpZmllZCAlMS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gIlNlcnZpY2UgbmFtZSIKKyAgICBTRVJWSUNFX0RFUExPWU1FTlRfQVJUSUZBQ1RfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyBzZXJ2aWNlIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4gU2VydmljZSBoYXMgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgZGVwbG95bWVudCBhcnRpZmFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyUxIC0gIlJlc291cmNlIi8iU2VydmljZSIvIlByb2R1Y3QiCisjJTIgLSAiY2F0ZWdvcnkiCisgICAgQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0xFTkdUSDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSAlMiBuYW1lIGxlbmd0aC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyUxIC0gIlJlc291cmNlIi8iU2VydmljZSIvIlByb2R1Y3QiCisjJTIgLSAiY2F0ZWdvcnkiCisgICAgQ09NUE9ORU5UX0VMRU1FTlRfSU5WQUxJRF9OQU1FX0ZPUk1BVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSAlMiBuYW1lIGZvcm1hdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyUxIC0gIlJlc291cmNlIi8iU2VydmljZSIvIlByb2R1Y3QiCisjJTIgLSAiY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfQ0FURUdPUllfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGNhdGVnb3J5IG5hbWUgJyUyJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBWQUxJREFURURfUkVTT1VSQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTdWJtaXQgZm9yIFRlc3RpbmcgaXMgbm90IHBlcm1pdHRlZCBhcyB5b3VyICclMScgaW5jbHVkZXMgbm9uLXZhbGlkYXRlZCAnJTInIHJlc291cmNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAic2VydmljZSIvIlZGIgorIyAlMiAtICJSZXNvdXJjZSBuYW1lIgorICAgIEZPVU5EX0FMUkVBRFlfVkFMSURBVEVEX1JFU09VUkNFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTdWJtaXQgZm9yIFRlc3RpbmcgaXMgbm90IHBlcm1pdHRlZCBhcyB5b3VyICclMScgaW5jbHVkZXMgbm9uLXZhbGlkYXRlZCAnJTInIHJlc291cmNlLiBQbGVhc2UgdXNlIGFscmVhZHkgYXZhaWxhYmxlIHZhbGlkYXRlZCByZXNvdXJjZSB2ZXJzaW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAic2VydmljZSIvIlZGIgorIyAlMiAtICJSZXNvdXJjZSBuYW1lIgorICAgIEZPVU5EX0xJU1RfVkFMSURBVEVEX1JFU09VUkNFUzogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4gUGxlYXNlIHVzZSBvbmUgb2YgYXZhaWxhYmxlIHZhbGlkYXRlZCByZXNvdXJjZSB2ZXJzaW9ucy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTYwIgorICAgIH0gIAorIy0tLS0tLS0tLVNWQzQ1NjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAicmVzb3VyY2UiLyJwcm9kdWN0IgorIyAlMiAtICJjYXRlZ29yeSIKKyMgJTMgLSAiY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJTEgJTIgJyUzJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiUmVzb3VyY2UiLyJQcm9kdWN0IgorIyAlMiAtICJzdWItY2F0ZWdvcnkgbmFtZSIKKyMgJTMgLSAiY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfU1VCX0NBVEVHT1JZX0VYSVNUU19GT1JfQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIHN1Yi1jYXRlZ29yeSAnJTInIGFscmVhZHkgZXhpc3RzIHVuZGVyICclMycgY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJQcm9kdWN0IgorIyAlMiAtICJncm91cGluZyBuYW1lIgorIyAlMyAtICJzdWItY2F0ZWdvcnkgbmFtZSIKKyAgICBDT01QT05FTlRfR1JPVVBJTkdfRVhJU1RTX0ZPUl9TVUJfQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGdyb3VwaW5nICclMicgYWxyZWFkeSBleGlzdHMgdW5kZXIgJyUzJyBzdWItY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gcHJvZHVjdMKgbmFtZQorICAgIFBST0RVQ1RfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyBwcm9kdWN0IHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiSEVBVCIgICAKKyMgJTIgIC0gcGFyYW1ldGVyIHR5cGUgKCJzdHJpbmciICwgImJvb2xlYW4iICwgIm51bWJlciIpIAorIyAlMyAtICBwYXJhbWV0ZXIgbmFtZQorICAgIElOVkFMSURfSEVBVF9QQVJBTUVURVJfVkFMVUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgYXJ0aWZhY3QuIEludmFsaWQgJTIgdmFsdWUgc2V0IGZvciAnJTMnIHBhcmFtZXRlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJIRUFUIiAgIAorIyAlMiAgLSBwYXJhbWV0ZXIgdHlwZSAoInN0cmluZyIgLCAiYm9vbGVhbiIgLCAibnVtYmVyIikgCisgICAgSU5WQUxJRF9IRUFUX1BBUkFNRVRFUl9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkICUxIGFydGlmYWN0LiBVbnN1cHBvcnRlZCAnJTInIHBhcmFtZXRlciB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gICJZQU5HX1hNTCIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9YTUw6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVwbG9hZGVkIFhNTCBmaWxlIGZvciAlMSBhcnRpZmFjdCBpcyBpbnZhbGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIlVzZXIgTmFtZSBhbmQgdXNlcklkIiAgIAorIyAlMiAgLSJjaGVja2VkLW91dCIvImluLWNlcnRpZmljYXRpb24iCisgICAgQ0FOTk9UX0RFTEVURV9VU0VSX1dJVEhfQUNUSVZFX0VMRU1FTlRTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIGNhbm5vdCBiZSBkZWxldGVkLiBVc2VyICclMScgaGFzICUyIHByb2plY3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIlVzZXIgTmFtZSBhbmQgdXNlcklkIiAgIAorIyAlMiAgLSJjaGVja2VkLW91dCIvImluLWNlcnRpZmljYXRpb24iCisgICAgQ0FOTk9UX1VQREFURV9VU0VSX1dJVEhfQUNUSVZFX0VMRU1FTlRTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSb2xlIGNhbm5vdCBiZSBjaGFuZ2VkLiBVc2VyICclMScgaGFzICUyIHByb2plY3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgVVBEQVRFX1VTRVJfQURNSU5fQ09ORkxJQ1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFuIGFkbWluaXN0cmF0b3IgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGhpcy9oZXIgcm9sZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFNFUlZJQ0VfQ0FOTk9UX0NPTlRBSU5fU1VCQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFN1YiBjYXRlZ29yeSBjYW5ub3QgYmUgZGVmaW5lZCBmb3Igc2VydmljZSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIlJlc291cmNlIi8iU2VydmljZSIKKyAgICBDT01QT05FTlRfVE9PX01VQ0hfQ0FURUdPUklFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgbXVzdCBoYXZlIG9ubHkgMSBjYXRlZ29yeSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NzQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfVE9PX01VQ0hfU1VCQ0FURUdPUklFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgbXVzdCBoYXZlIG9ubHkgMSBzdWIgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIENPTVBPTkVOVF9NSVNTSU5HX1NVQkNBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nIHN1YiBjYXRlZ29yeSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzUiCisgICAgfQorICMtLS0tLS0tLS1TVkM0NTc2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJjb21wb25lbnQgdHlwZSIKKyAgICBVTlNVUFBPUlRFRF9FUlJPUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvciA6IFJlcXVlc3RlZCBjb21wb25lbnQgdHlwZSAlMSBpcyB1bnN1cHBvcnRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc2IgorICAgIH0KKyAgICAjLS0tLS0tLS0tU1ZDNDU3Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAicmVzb3VyY2UgdHlwZSIKKyAgICBSRVNPVVJDRV9DQU5OT1RfQ09OVEFJTl9SRVNPVVJDRV9JTlNUQU5DRVM6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgOiBSZXNvdXJjZSBvZiB0eXBlICUxIGNhbm5vdCBjb250YWluIHJlc291cmNlIGluc3RhbmNlcy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisjICUyIC0gIHJlc291cmNlL3NlcnZpY2UgbmFtZSAKKyMgJTMgLSAgImFydGlmYWN0IG5hbWUiIAorICAgIERFUExPWU1FTlRfQVJUSUZBQ1RfTkFNRV9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgJyUyJyBhbHJlYWR5IGhhcyBhIGRlcGxveW1lbnQgYXJ0aWZhY3QgbmFtZWQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJDYXRlZ29yeSIvIlN1Yi1DYXRlZ29yeSIvIkdyb3VwIgorIyAlMiAtICBjYXRlZ29yeS9zdWItY2F0ZWdvcnkvZ3JvdXBpbmcgbmFtZS4KKyAgICBJTlZBTElEX0dST1VQX0FTU09DSUFUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGdyb3VwIGFzc29jaWF0aW9uLiAlMSAnJTInIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBFTVBUWV9QUk9EVUNUX0NPTlRBQ1RTX0xJU1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gQXQgbGVhc3Qgb25lIFByb2R1Y3QgQ29udGFjdCBoYXMgdG8gYmUgc3BlY2lmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gdXNlcklkCisgICAgSU5WQUxJRF9QUk9EVUNUX0NPTlRBQ1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gVXNlciAnJTEnIGNhbm5vdCBiZSBzZXQgYXMgUHJvZHVjdCBDb250YWN0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gUHJvZHVjdAorIyAlMiAtICJhYmJyZXZpYXRlZCIvImZ1bGwiCisgICAgTUlTU0lOR19PTkVfT0ZfQ09NUE9ORU5UX05BTUVTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIE1pc3NpbmcgJTEgJTIgbmFtZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgyIgorICAgIH0gICAgCisjLS0tLS0tLS0tU1ZDNDU4My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJJY29uIgorIyAlMiAtICJyZXNvdXJjZSIvInNlcnZpY2UiLyJwcm9kdWN0IgorICAgIENPTVBPTkVOVF9QQVJBTUVURVJfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlICUyIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxICAtIHNlcnZpY2UvVkYgbmFtZSAKKyMgJTIgLSAic2VydmljZSIgLyJWRiIKKyMgJTMgLSAgcmVzb3VyY2UgaW5zdGFuY2Ugb3JpZ2luIHR5cGUKKyMgJTQgLSAgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZSAKKyMgJTUgLSAgcmVxdWlyZW1lbnQvY2FwYWJpbGl0eQorIyAlNiAtICByZXF1aXJlbWVudC9jYXBhYmlsaXR5IG5hbWUKKyMgJTcgLSAgImZ1bGZpbGxlZCIgKGZvciByZXEpLyJjb25zdW1lZCAoZm9yIGNhcCkiCisgICAgUkVRX0NBUF9OT1RfU0FUSVNGSUVEX0JFRk9SRV9DRVJUSUZJQ0FUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAgUmVxdWVzdGVkICclMScgJTIgaXMgbm90IHJlYWR5IGZvciBjZXJ0aWZpY2F0aW9uLiAgJTMgJyU0JyBoYXMgdG8gaGF2ZSAlNSAnJTYnICU3LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9PQ0NVUlJFTkNFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBvY2N1cnJlbmNlcyBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMtLS0tLS0tLS1TVkM0NTg2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfU0VSVklDRV9BUElfVVJMOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIFNlcnZpY2UgQVBJIFVSTC4gUGxlYXNlIGNoZWNrIHdoZXRoZXIgeW91ciBVUkwgaGFzIGEgdmFsaWQgZG9tYWluIGV4dGVuc2lvbiBhbmQgZG9lcyBub3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgLSAjPyZAJSs7LD0kPD5+XmBcW117fXwiKiEnLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogRGF0YSB0eXBlICUxIGFscmVhZHkgZXhpc3RzLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lIAorICAgIERBVEFfVFlQRV9OT1JfUFJPUEVSVElFU19ORUlUSEVSX0RFUklWRURfRlJPTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBEYXRhIHR5cGUgJTEuIERhdGEgdHlwZSBtdXN0IGhhdmUgZWl0aGVyIGEgdmFsaWQgZGVyaXZlZCBmcm9tIGRlY2xhcmF0aW9uIG9yIGF0IGxlYXN0IG9uZSB2YWxpZCBwcm9wZXJ0eScsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lIAorICAgIERBVEFfVFlQRV9QUk9QRVJUSUVTX0NBTk5PVF9CRV9FTVBUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBEYXRhIHR5cGUgJTEuICdwcm9wZXJ0aWVzJyBwYXJhbWV0ZXIgY2Fubm90IGJlIGVtcHR5IGlmIHByb3ZpZGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIFByb3BlcnR5IHR5cGUgbmFtZSAKKyMgJTIgIC0gUHJvcGVydHkgbmFtZQorICAgIElOVkFMSURfUFJPUEVSVFlfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBQcm9wZXJ0eSB0eXBlICUxIGluIHByb3BlcnR5ICUyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIFByb3BlcnR5IGlubmVyIHR5cGUKKyMgJTIgIC0gUHJvcGVydHkgbmFtZSAKKyAgICBJTlZBTElEX1BST1BFUlRZX0lOTkVSX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgcHJvcGVydHkgaW5uZXIgdHlwZSAlMSwgaW4gcHJvcGVydHkgJTIiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTkxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBjb21wb25lbnQgaW5zdGFuY2UgbmFtZQorIyAlMiAgLSAicmVzb3VyY2UgaW5zdGFuY2UiLyJzZXJ2aWNlIGluc3RhbmNlIgorICAgIENPTVBPTkVOVF9JTlNUQU5DRV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBjb21wb25lbnQgaW5zdGFuY2UgbmFtZQorIyAlMiAtICJyZXNvdXJjZSBpbnN0YW5jZSIvInNlcnZpY2UgaW5zdGFuY2UiCisjICUzIC0gInJlc291cmNlLyJzZXJ2aWNlIi8icHJvZHVjdCIKKyMgJTQgLSBjb250YWluZXIgbmFtZSAKKyAgICBDT01QT05FTlRfSU5TVEFOQ0VfTk9UX0ZPVU5EX09OX0NPTlRBSU5FUjogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgd2FzIG5vdCBmb3VuZCBvbiB0aGUgJTMgJyU0Jy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTkzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTEgLSByZXF1aXJlbWVudCAvIGNhcGFiaWxpdHkKKyMlMiAtIHJlcXVpcmVtZW50IG5hbWUKKyAgICBJTVBPUlRfRFVQTElDQVRFX1JFUV9DQVBfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgVE9TQ0EgdGVtcGxhdGUgY29udGFpbnMgbW9yZSB0aGFuIG9uZSAlMSBuYW1lZCAnJTInLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMSAtIHJlcXVpcmVtZW50IC8gY2FwYWJpbGl0eQorIyUyIC0gcmVxdWlyZW1lbnQgbmFtZQorIyUzIC0gcGFyZW50IGNvbnRhaW5pbmcgdGhlIHJlcXVpcmVtZW50IAorICAgIElNUE9SVF9SRVFfQ0FQX05BTUVfRVhJU1RTX0lOX0RFUklWRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEltcG9ydGVkIFRPU0NBIHRlbXBsYXRlIGNvbnRhaW5zICUxICclMicgdGhhdCBpcyBhbHJlYWR5IGRlZmluZWQgYnkgZGVyaXZlZCB0ZW1wbGF0ZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZQorICAgIERBVEFfVFlQRV9ERVJJVkVEX0lTX01JU1NJTkc6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGFuY2VzdG9yIGRhdGEgdHlwZSAlMSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHN5c3RlbS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZQorIyAlMiAgLSBQcm9wZXJ0eSBuYW1lcworICAgIERBVEFfVFlQRV9QUk9QRVJUWV9BTFJFQURZX0RFRklORURfSU5fQU5DRVNUT1I6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGRhdGEgdHlwZSAlMSBjb250YWlucyBwcm9wZXJ0aWVzIG5hbWVkICUyIHdoaWNoIGFyZSBhbHJlYWR5IGRlZmluZWQgaW4gb25lIG9mIGl0cyBhbmNlc3RvcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfRFVQTElDQVRFX1BST1BFUlRZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgZHVwbGljYXRlIHByb3BlcnR5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisjICUyICAtIFByb3BlcnR5IG5hbWVzCisgICAgREFUQV9UWVBFX1BST0VQUlRZX0NBTk5PVF9IQVZFX1NBTUVfVFlQRV9PRl9EQVRBX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGRhdGEgdHlwZSAlMSBjb250YWlucyBwcm9wZXJ0aWVzICUyIHdoaWNoIHRoZWlyIHR5cGUgaXMgdGhpcyBkYXRhIHR5cGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfQ0FOTk9UX0hBVkVfUFJPUEVSVElFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZGF0YSB0eXBlICUxIGNhbm5vdCBoYXZlIHByb3BlcnRpZXMgc2luY2UgaXQgaXMgb2YgdHlwZSBzY2FsYXIiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVE9TQ0EgeWFtbCBmaWxlICUxIGNhbm5vdCBiZSBtb2RlbGVkIHRvIFZGIGFzIGl0IGRvZXMgbm90IGNvbnRhaW4gJ3RvcG9sb2d5X3RlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHlhbWwgZmlsZSBuYW1lCisjICUyIC0gbm9kZV90ZW1wbGF0ZSBsYWJlbAorIyAlMyAtIG5vZGVfdGVtcGxhdGUgdHlwZQorICAgIElOVkFMSURfTk9ERV9URU1QTEFURTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVE9TQ0EgeWFtbCBmaWxlICclMScgY29udGFpbnMgbm9kZV90ZW1wbGF0ZSAnJTInIG9mIHR5cGUgJyUzJyB0aGF0IGRvZXMgbm90IHJlcHJlc2VudCBleGlzdGluZyBWRkMvQ1AvVkwiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjAyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGNvbXBvbmVudCB0eXBlCisjICUywqAtIGNvbXBvbmVudMKgbmFtZQorIyAlM8KgLSBzdGF0ZQorICAgIElMTEVHQUxfQ09NUE9ORU5UX1NUQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBDb21wb25lbnQgaW5zdGFuY2Ugb2YgJTEgY2FuIG5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgdGhlIGNvbXBvbmVudCAnJTInIGlzIGluIGFuIGlsbGVnYWwgc3RhdGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIENTQVJfSU5WQUxJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVE9TQ0EgQ1NBUiAnJTEnIGlzIGludmFsaWQuICdUT1NDQS1NZXRhZGF0YS9Ub3NjYS5tZXRhJyBmaWxlIG11c3QgYmUgcHJvdmlkZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIENTQVJfSU5WQUxJRF9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIENTQVIgJyUxJyBpcyBpbnZhbGlkLiBJbnZhbGlkICdUT1NDQS1NZXRhZGF0YS9Ub3NjYS5tZXRhJyBmaWxlIGZvcm1hdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHByb3BlcnR5IG5hbWUKKyMgJTLCoC0gcHJvcGVydHkgdHlwZQorIyAlMyAtIHByb3BlcnR5IGlubmVyVHlwZQorIyAlNMKgLSBkZWZhdWx0IHZhbHVlIGlzCisgICAgSU5WQUxJRF9DT01QTEVYX0RFRkFVTFRfVkFMVUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgZGVmYXVsdCB2YWx1ZSBvZiBwcm9wZXJ0eSAlMS4gRGF0YSB0eXBlIGlzICUyIHdpdGggaW5uZXIgdHlwZSAlMyBhbmQgZGVmYXVsdCB2YWx1ZSBmb3VuZCBpcyAlNC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjA3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGNzYXIgZmlsZSBuYW1lCisgICAgQ1NBUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIENTQVIgJyUxJyBpcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBhcnRpZmFjdCBuYW1lCisjICUywqAtIGNvbXBvbmVudCB0eXBlCisjICUzIC0gYWN0dWFsIGNvbXBvbmVudCB0eXBlCisgICAgTUlTTUFUQ0hfQkVUV0VFTl9BUlRJRkFDVF9UWVBFX0FORF9DT01QT05FTlRfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgJTEgaXMgb25seSBjb21wYXRpYmxlIHdpdGggY29tcG9uZW50IG9mIHR5cGUgJTIsIGJ1dCBjb21wb25lbnQgdHlwZSBpcyAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA4IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQ2MDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gICJJTlZBTElEX0pTT04iICAgICAgICAgICAgIAorICAgIElOVkFMSURfSlNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXBsb2FkZWQgSlNPTiBmaWxlIGZvciAlMSBhcnRpZmFjdCBpcyBpbnZhbGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyMgJTLCoC3CoG1pc3NpbmcgZmlsZSBuYW1lCisgICAgWUFNTF9OT1RfRk9VTkRfSU5fQ1NBUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvciAtIFRPU0NBIENTQVIgJTEgaXMgaW52YWxpZC4gVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YSByZWZlcnMgdG8gZmlsZSAlMiB0aGF0IGlzIG5vdCBwcm92aWRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjEwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjExLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTEgLSBncm91cCBuYW1lCisgICAgR1JPVVBfTUVNQkVSX0VNUFRZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEdyb3VwICUxIG1lbWJlciBsaXN0IHdhcyBwcm92aWRlZCBidXQgZG9lcyBub3QgaGF2ZSB2YWx1ZXMiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjExIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjEyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBncm91cCBuYW1lIAorICAgIEdST1VQX1RZUEVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogR3JvdXAgdHlwZSAlMSBhbHJlYWR5IGV4aXN0cy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjEyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGdyb3VwIG5hbWUKKyMgJTLCoC0gVkYgbmFtZShjb21wb25lbnQgbmFtZSkKKyMgJTMgLSBhY3R1YWwgY29tcG9uZW50IHR5cGUgW1ZGXQorICAgIEdST1VQX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEdyb3VwIHdpdGggbmFtZSAnJTEnIGFscmVhZHkgZXhpc3RzIGluICUyICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTMiCisgICAgfSAgIAorIy0tLS0tLS0tLVNWQzQ2MTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXAgdHlwZQorICAgIEdST1VQX1RZUEVfSVNfSU5WQUxJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBHcm91cCB0eXBlICUxIGRvZXMgbm90IGV4aXN0IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cCBuYW1lCisgICAgR1JPVVBfTUlTU0lOR19HUk9VUF9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgR3JvdXAgVHlwZSBmb3IgZ3JvdXAgJyUxJyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtZW1iZXIgbmFtZQorIyAlMiAtIGdyb3VwIG5hbWUKKyMgJTMgLSBWRiBuYW1lCisjICU0IC0gY29tcG9uZW50IHR5cGUgW1ZGIF0KKyAgICBHUk9VUF9JTlZBTElEX0NPTVBPTkVOVF9JTlNUQU5DRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWVtYmVyICclMScgbGlzdGVkIGluIGdyb3VwICclMicgaXMgbm90IHBhcnQgb2YgJyUzJyAlNC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE2IgorICAgIH0gICAgICAgICAgICAgICAgIAorIy0tLS0tLS0tLVNWQzQ2MTctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtZW1iZXIgbmFtZQorIyAlMiAtIGdyb3VwIG5hbWUKKyMgJTMgLSBncm91cCB0eXBlCisgICAgR1JPVVBfSU5WQUxJRF9UT1NDQV9OQU1FX09GX0NPTVBPTkVOVF9JTlNUQU5DRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogbWVtYmVyICUxIGxpc3RlZCBpbiBncm91cCAlMiBpcyBub3QgcGFydCBvZiBhbGxvd2VkIG1lbWJlcnMgb2YgZ3JvdXAgdHlwZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjE4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMcKgLcKgbWlzc2luZyBmaWxlIG5hbWUKKyMgJTLCoC3CoGNzYXIgZmlsZSBuYW1lCisgICAgQVJUSUZBQ1RfTk9UX0ZPVU5EX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGlzIGRlZmluZWQgaW4gQ1NBUiAlMiBtYW5pZmVzdCBidXQgaXMgbm90IHByb3ZpZGVkIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxOCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLcKgYXJ0aWZhY3QgdHlwZQorIyAlMyAtIGV4aXN0aW5nIGFydGlmYWN0IHR5cGUKKyAgICBBUlRJRkFDVF9BTFJBRFlfRVhJU1RfSU5fRElGRkVSRU5UX1RZUEVfSU5fQ1NBUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogYXJ0aWZhY3QgJTEgaW4gdHlwZSAlMiBhbHJlYWR5IGV4aXN0cyBpbiB0eXBlICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgRkFJTEVEX1JFVFJJVkVfQVJUSUZBQ1RTX1RZUEVTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBGYWlsZWQgdG8gcmV0cmlldmUgbGlzdCBvZiBzdXBvcnRlZCBhcnRpZmFjdCB0eXBlcy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjIwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjIxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMcKgLSBhcnRpZmFjdCBuYW1lCisjICUywqAtIG1hc3RlciAKKyAgICBBUlRJRkFDVF9BTFJBRFlfRVhJU1RfSU5fTUFTVEVSX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGFscmVhZHkgZXhpc3RzIGluIG1hc3RlciAlMiAuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBhcnRpZmFjdCB0eXBlIAorIyAlM8KgLSBtYXN0ZXIgbmFtZQorIyAlNCAtIG1hc3RlciB0eXBlCisgICAgQVJUSUZBQ1RfTk9UX1ZBTElEX0lOX01BU1RFUjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogYXJ0aWZhY3QgJTEgaW4gdHlwZSAlMiBjYW4gbm90IGJlIGV4aXN0cyB1bmRlciBtYXN0ZXIgJTMgaW4gdHlwZSAlNC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjIyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMcKgLSBhcnRpZmFjdCBuYW1lCisjICUywqAtIGFydGlmYWN0IHR5cGUgCisjICUzwqAtIGVudiBuYW1lCisjICU0IC0gZXhpc3RpbmcgZW52CisgICAgQVJUSUZBQ1RfTk9UX1ZBTElEX0VOVjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXJ0aWZhY3QgJTEgaW4gdHlwZSAlMiB3aXRoIGVudiAlMyBhbHJlYWR5IGV4aXN0cyB3aXRoIGFub3RoZXIgZW52ICU0IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cHMgbmFtZXMKKyMgJTIgLSBWRiBuYW1lCisjICUzIC0gY29tcG9uZW50IHR5cGUgW1ZGIF0KKyAgICBHUk9VUF9JU19NSVNTSU5HOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBncm91cHMgJyUxJyBjYW5ub3QgYmUgZm91bmQgdW5kZXIgJTIgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cHMgbmFtZQorICAgIEdST1VQX0FSVElGQUNUX0FMUkVBRFlfQVNTT0NJQVRFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBcnRpZmFjdCBhbHJlYWR5IGFzc29jaWF0ZWQgdG8gZ3JvdXAgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjI2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGdyb3VwcyBuYW1lCisgICAgR1JPVVBfQVJUSUZBQ1RfQUxSRUFEWV9ESVNTT0NJQVRFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBcnRpZmFjdCBhbHJlYWR5IGRpc3NvY2lhdGVkIGZyb20gZ3JvdXAgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjI3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gcHJvcGVydHkgbmFtZQorIyAlMiAtIGdyb3VwIG5hbWUKKyMgJTMgLSBncm91cCB0eXBlIG5hbWUKKyAgICBHUk9VUF9QUk9QRVJUWV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IHByb3BlcnR5ICUxIGxpc3RlZCBpbiBncm91cCAlMiBpcyBub3QgZXhpc3QgaW4gZ3JvdXAgdHlwZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjI4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTEgLSBjc2FyVVVJRAorIyAlMiAtIFZGIG5hbWUKKyAgICBWU1BfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRoZSBWU1Agd2l0aCBVVUlEICUxIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZvciBWRiAlMi4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIG9yIHVwZGF0ZSB0aGUgZXhpc3RpbmcgVkYuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyOCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gVkYgbmFtZQorICAgIE1JU1NJTkdfQ1NBUl9VVUlEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgQ3NhciBVVUlEIG9yIHBheWxvYWQgbmFtZSBpcyBtaXNzaW5nIGZvciBWRiAlMS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjI5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjMwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTEgLSBWRiBuYW1lCisjICUyIC0gbmV3IGNzYXJVVUlECisjICUzIC0gb2xkIGNzYXJVVUlECisgICAgUkVTT1VSQ0VfTElOS0VEX1RPX0RJRkZFUkVOVF9WU1A6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc291cmNlICUxIGNhbm5vdCBiZSB1cGRhdGVkIHVzaW5nIENzYXJVVUlEICUyIHNpbmNlIHRoZSByZXNvdXJjZSBpcyBsaW5rZWQgdG8gYSBkaWZmZXJlbnQgVlNQIHdpdGggY3NhclVVSUQgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gcG9saWN5IG5hbWUgCisgICAgUE9MSUNZX1RZUEVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUG9saWN5IHR5cGUgJTEgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHRhcmdldCBuYW1lCisjICUyIC0gcG9saWN5IHR5cGUgbmFtZQorICAgIFRBUkdFVFNfTk9OX1ZBTElEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiB0YXJnZXQgJTEgbGlzdGVkIGluIHBvbGljeSB0eXBlICUyIGlzIG5vdCBhIGdyb3VwIG9yIHJlc291cmNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBwb2xpY3kgbmFtZQorICAgIFRBUkdFVFNfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gUG9saWN5ICUxIHRhcmdldCBsaXN0IHdhcyBwcm92aWRlZCBidXQgZG9lcyBub3QgaGF2ZSB2YWx1ZXMiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjMzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjM0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgREFUQV9UWVBFX0NBTk5PVF9CRV9FTVBUWTogeworICAgICAgICBjb2RlOiA1MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRGF0YSB0eXBlcyBhcmUgZW1wdHkuIFBsZWFzZSBpbXBvcnQgdGhlIGRhdGEgdHlwZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIGNzYXIgdXVpZAorICAgIFJFU09VUkNFX0ZST01fQ1NBUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IHJlc291cmNlIGZyb20gY3NhciB1dWlkICUxIG5vdCBmb3VuZCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBEYXRhIHR5cGUgbmFtZQorICAgIERBVEFfVFlQRV9DQU5OT1RfQkVfVVBEQVRFRF9CQURfUkVRVUVTVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogRGF0YSB0eXBlICUxIGNhbm5vdCBiZSB1cGdyYWRlZC4gVGhlIG5ldyBkYXRhIHR5cGUgZG9lcyBub3QgY29udGFpbiBvbGQgcHJvcGVydGllcyBvciB0aGUgdHlwZSBvZiBvbmUgb2YgdGhlIHByb3BlcnRpZXMgaGFzIGJlZW4gY2hhbmdlZC4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjM2IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ2MzctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgYXR0cmlidXRlwqBuYW1lCisgICAgQVRUUklCVVRFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgYXR0cmlidXRlIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzNyIKKyAgICB9ICAgIAorIy0tLS0tLS0tLS0tU1ZDNDYzOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxwqAtwqBhdHRyaWJ1dGXCoG5hbWUKKyAgICBBVFRSSUJVVEVfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXR0cmlidXRlIHdpdGggJyUxJyBuYW1lIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDYzOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxwqAtwqBwcm9wZXJ0ecKgbmFtZQorICAgIFBST1BFUlRZX05BTUVfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFByb3BlcnR5IHdpdGggJyUxJyBuYW1lIGFuZCBkaWZmZXJlbnQgdHlwZSBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjM5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ2NDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBJTlZBTElEX1BST1BFUlRZOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHByb3BlcnR5IHJlY2VpdmVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2NDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxwqAtwqBpbnZhbGlkIGZpbHRlcgorIyUywqAtwqB2YWxpZCBmaWx0ZXJzCisgICAgSU5WQUxJRF9GSUxURVJfS0VZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgZmlsdGVyICUxIGlzIG5vdCBhcHBsaWNhYmxlLiBQbGVhc2UgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZpbHRlcnM6ICUyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoGFzc2V0IHR5cGUKKyMlMsKgLcKgZmlsdGVyCisgICAgTk9fQVNTRVRTX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIk5vICUxIHdlcmUgZm91bmQgdG8gbWF0Y2ggY3JpdGVyaWEgJTIiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjQyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjQzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gIlJlc291cmNlIi8iUHJvZHVjdCIKKyMgJTIgLSAic3ViLWNhdGVnb3J5IG5hbWUiCisjICUzIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9OT1RfRk9VTkRfRk9SX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBzdWItY2F0ZWdvcnkgJyUyJyBub3QgZm91bmQgdW5kZXIgY2F0ZWdvcnkgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjQzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjQ0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gRm9ybWF0CisgICAgQ09SUlVQVEVEX0ZPUk1BVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgZm9ybWF0IGlzIGNvcnJ1cHRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjQ0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjQ1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gImdyb3VwVHlwZSIKKyAgICBJTlZBTElEX1ZGX01PRFVMRV9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGdyb3VwIHR5cGUgJyUxJyAoc2hvdWxkIGJlIFZmTW9kdWxlKS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjQ1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjQ2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gImdyb3VwTmFtZSIKKyAgICBJTlZBTElEX1ZGX01PRFVMRV9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZGIE1vZHVsZSBuYW1lICclMScgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0NiIKKyAgICB9CisgICAgCisjLS0tLS0tLS0tU1ZDNDY0Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJtb2RpZmllZE5hbWUiCisgICAgSU5WQUxJRF9WRl9NT0RVTEVfTkFNRV9NT0RJRklDQVRJT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgVkYgTW9kdWxlIG5hbWUgbW9kaWZpY2F0aW9uLCBjYW4gbm90IG1vZGlmeSAnJTEnIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJpbnB1dElkIgorIyAlMiAtICJjb21wb25lbnRJZCIKKyAgICBJTlBVVF9JU19OT1RfQ0hJTERfT0ZfQ09NUE9ORU5UOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnB1dCBpZDogJyUxJyBpcyBub3QgY2hpbGQgb2YgY29tcG9uZW50IGlkOiAnJTInIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0OCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJncm91cE5hbWUiCisgICAgR1JPVVBfSEFTX0NZQ0xJQ19ERVBFTkRFTkNZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgZ3JvdXAgJyUxJyBoYXMgY3ljbGljIGRlcGVuZGVuY3kiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjQ5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gIkNvbXBvbmVudCBUeXBlIgorIyAlMiAtIDxTZXJ2aWNlTmFtZT4KKyMgJTMgLSBlcnJvciBkZXNjcmlwdGlvbgorICAgIEFBSV9BUlRJRkFDVF9HRU5FUkFUSU9OX0ZBSUxFRDogeworICAgICAgICBjb2RlOiA1MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgJTIgYXV0b21hdGljIGdlbmVyYXRpb24gb2YgYXJ0aWZhY3RzIGZhaWxlZC4gRGVzY3JpcHRpb246ICUzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY1MCIKKyAgICB9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvbG9nYmFjay54bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvbG9nYmFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1ZTRjNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9sb2diYWNrLnhtbApAQCAtMCwwICsxLDIyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjb25maWd1cmF0aW9uIHNjYW49InRydWUiIHNjYW5QZXJpb2Q9IjUgc2Vjb25kcyI+CisKKwk8cHJvcGVydHkgc2NvcGU9InN5c3RlbSIgbmFtZT0iRUNPTVAtY29tcG9uZW50LW5hbWUiIHZhbHVlPSJBU0RDIiAvPgorCTxwcm9wZXJ0eSBzY29wZT0ic3lzdGVtIiBuYW1lPSJFQ09NUC1zdWJjb21wb25lbnQtbmFtZSIgdmFsdWU9IkFTREMtQkUiIC8+CisJPHByb3BlcnR5IGZpbGU9IiR7Y29uZmlnLmhvbWV9L2NhdGFsb2ctYmUvY29uZmlndXJhdGlvbi55YW1sIiAvPgorCTxwcm9wZXJ0eSBzY29wZT0iY29udGV4dCIgbmFtZT0iZW5hYmxlLWFsbC1sb2ciIHZhbHVlPSJmYWxzZSIgLz4KKworCTwhLS0gdmFsdWUgdXNlZCBieSBwYXR0ZXJuIGZpZWxkIGxpc3QgKHwgLSBpcyBpbnRlci1maWVsZCBzZXBhcmF0b3IsIHx8IC0gdW5hdmFpbGFibGUgb3Igbm90IGFwcGxpY2FibGUgZmllbGQgdmFsdWUpIChtIC0gbWFuZGF0b3J5LCBvLSBvcHRpb25hbCktLT4KKwk8IS0tdGltZXN0YW1wKG0pfCByZXF1ZXN0SUQobSl8IHNlcnZpY2VJbnN0YW5jZUlEKG8pfCB0aHJlYWRJRChtKXwgcGh5c2ljYWxTZXJ2ZXJOYW1lKG8pfCBzZXJ2aWNlTmFtZShtKXwgdXNlcklEKG0pfCBsb2dMZXZlbChtKXwgc2V2ZXJpdHkobyl8IHNlcnZlcklwQWRkcmVzcyhtKXwgc2VydmVyTmFtZShtKXwgY2xpZW50SXBBZGRyZXNzKG8pfCBjbGFzc05hbWUobSl8IHRpbWVyKG8pfCBkZXRhaWxlZE1lc3NhZ2UobyktLT4KKwk8cHJvcGVydHkgbmFtZT0iZGVmYXVsdC1sb2ctcGF0dGVybiIKKwkJdmFsdWU9IiVke3l5eXktTU0tZGQnVCdISDptbTpzcy5TU1NYWFh9fCVYe3V1aWR9fCVYe3NlcnZpY2VJbnN0YW5jZUlEfXwldGhyZWFkfHwke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfXwlWHt1c2VySWR9fCVsZXZlbHwlWHthbGFybVNldmVyaXR5fXwlWHtsb2NhbEFkZHJ9fCR7YmVGcWRufXwlWHtyZW1vdGVBZGRyfXwlbG9nZ2VyezM1fXwlWHt0aW1lcn18QWN0aXZpdHlUeXBlPSZsdDslTSZndDssIERlc2M9Jmx0OyVtc2cmZ3Q7JW4iIC8+CisKKwk8IS0tIEFsbCBsb2cgLS0+CisJPGlmIGNvbmRpdGlvbj0ncHJvcGVydHkoImVuYWJsZS1hbGwtbG9nIikuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpJz4KKwkJPHRoZW4+CisJCQk8YXBwZW5kZXIgbmFtZT0iQUxMX1JPTExJTkciCisJCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKwkJCQk8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9hbGwubG9nCisJCQkJPC9maWxlPgorCisJCQkJPHJvbGxpbmdQb2xpY3kKKwkJCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorCQkJCQk8ZmlsZU5hbWVQYXR0ZXJuPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2FsbC5sb2cuJWkKKwkJCQkJPC9maWxlTmFtZVBhdHRlcm4+CisJCQkJCTxtaW5JbmRleD4xPC9taW5JbmRleD4KKwkJCQkJPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKwkJCQk8L3JvbGxpbmdQb2xpY3k+CisKKwkJCQk8dHJpZ2dlcmluZ1BvbGljeQorCQkJCQljbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVCYXNlZFRyaWdnZXJpbmdQb2xpY3kiPgorCQkJCQk8bWF4RmlsZVNpemU+MjBNQjwvbWF4RmlsZVNpemU+CisJCQkJPC90cmlnZ2VyaW5nUG9saWN5PgorCQkJCTxlbmNvZGVyPgorCQkJCQk8cGF0dGVybj4ke2RlZmF1bHQtbG9nLXBhdHRlcm59PC9wYXR0ZXJuPgorCQkJCTwvZW5jb2Rlcj4KKwkJCTwvYXBwZW5kZXI+CisJCQkKKwkJCTxhcHBlbmRlciBuYW1lPSJBU1lOQ19BTEwiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgorCQkJCTxhcHBlbmRlci1yZWYgcmVmPSJBTExfUk9MTElORyIgLz4KKwkJCTwvYXBwZW5kZXI+CisJCTwvdGhlbj4KKwk8L2lmPgorCisJPCEtLSBFcnJvciBsb2cgLS0+CisJPGFwcGVuZGVyIG5hbWU9IkVSUk9SX1JPTExJTkciCisJCWNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+CisJCTxmaWxlPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2Vycm9yLmxvZworCQk8L2ZpbGU+CisKKwkJPCEtLSBBdWRpdCBtZXNzYWdlcyBmaWx0ZXIgLSBkZW55IGF1ZGl0IG1lc3NhZ2VzIC0tPgorCQk8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorCQkJPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorCQkJCTxtYXJrZXI+QVVESVRfTUFSS0VSPC9tYXJrZXI+CisJCQk8L2V2YWx1YXRvcj4KKwkJCTxvbk1pc21hdGNoPk5FVVRSQUw8L29uTWlzbWF0Y2g+CisJCQk8b25NYXRjaD5ERU5ZPC9vbk1hdGNoPgorCQk8L2ZpbHRlcj4KKworCQk8IS0tIFRyYW5zYWN0aW9uIG1lc3NhZ2VzIGZpbHRlciAtIGRlbnkgVHJhbnNhY3Rpb24gbWVzc2FnZXMgLS0+CisJCTxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+CisJCQk8ZXZhbHVhdG9yIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmJvb2xleC5Pbk1hcmtlckV2YWx1YXRvciI+CisJCQkJPG1hcmtlcj5UUkFOU0FDVElPTl9NQVJLRVI8L21hcmtlcj4KKwkJCTwvZXZhbHVhdG9yPgorCQkJPG9uTWlzbWF0Y2g+TkVVVFJBTDwvb25NaXNtYXRjaD4KKwkJCTxvbk1hdGNoPkRFTlk8L29uTWF0Y2g+CisJCTwvZmlsdGVyPgorCisJCTwhLS0gZGVueSBhbGwgZXZlbnRzIHdpdGggYSBsZXZlbCBiZWxvdyBJTkZPLCB0aGF0IGlzIFRSQUNFIGFuZCBERUJVRyAtLT4KKwkJPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKwkJCTxsZXZlbD5JTkZPPC9sZXZlbD4KKwkJPC9maWx0ZXI+CisKKwkJPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorCQkJPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9lcnJvci5sb2cuJWkKKwkJCTwvZmlsZU5hbWVQYXR0ZXJuPgorCQkJPG1pbkluZGV4PjE8L21pbkluZGV4PgorCQkJPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKwkJPC9yb2xsaW5nUG9saWN5PgorCisJCTx0cmlnZ2VyaW5nUG9saWN5CisJCQljbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVCYXNlZFRyaWdnZXJpbmdQb2xpY3kiPgorCQkJPG1heEZpbGVTaXplPjIwTUI8L21heEZpbGVTaXplPgorCQk8L3RyaWdnZXJpbmdQb2xpY3k+CisJCTxlbmNvZGVyPgorCQkJPHBhdHRlcm4+JHtkZWZhdWx0LWxvZy1wYXR0ZXJufTwvcGF0dGVybj4KKwkJPC9lbmNvZGVyPgorCTwvYXBwZW5kZXI+CisKKwk8IS0tIERlYnVnIGxvZyAtLT4KKwk8YXBwZW5kZXIgbmFtZT0iREVCVUdfUk9MTElORyIKKwkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKwkJPGZpbGU+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nCisJCTwvZmlsZT4KKworCQk8IS0tIE5vIG5lZWQgdG8gZGVueSBhdWRpdCBtZXNzYWdlcyAtIHRoZXkgYXJlIElORk8gb25seSwgd2lsbCBiZSBkZW5pZWQgCisJCQlhbnl3YXkgLS0+CisJCTwhLS0gVHJhbnNhY3Rpb24gbWVzc2FnZXMgZmlsdGVyIC0gZGVueSBUcmFuc2FjdGlvbiBtZXNzYWdlcywgdGhlcmUgYXJlIAorCQkJc29tZSBERUJVRyBsZXZlbCBtZXNzYWdlcyBhbW9uZyB0aGVtIC0tPgorCQk8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorCQkJPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorCQkJCTxtYXJrZXI+VFJBTlNBQ1RJT05fTUFSS0VSPC9tYXJrZXI+CisJCQk8L2V2YWx1YXRvcj4KKwkJCTxvbk1pc21hdGNoPk5FVVRSQUw8L29uTWlzbWF0Y2g+CisJCQk8b25NYXRjaD5ERU5ZPC9vbk1hdGNoPgorCQk8L2ZpbHRlcj4KKworCQk8IS0tIGFjY2VwdCBERUJVRyBhbmQgVFJBQ0UgbGV2ZWwgLS0+CisJCTxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+CisJCQk8ZXZhbHVhdG9yIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmJvb2xleC5HRXZlbnRFdmFsdWF0b3IiPgorCQkJCTxleHByZXNzaW9uPgorCQkJCQllLmxldmVsLnRvSW50KCkgJmx0Oz0gREVCVUcudG9JbnQoKQorCQkJCTwvZXhwcmVzc2lvbj4KKwkJCTwvZXZhbHVhdG9yPgorCQkJPE9uTWlzbWF0Y2g+REVOWTwvT25NaXNtYXRjaD4KKwkJCTxPbk1hdGNoPk5FVVRSQUw8L09uTWF0Y2g+CisJCTwvZmlsdGVyPgorCisJCTxyb2xsaW5nUG9saWN5IGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuRml4ZWRXaW5kb3dSb2xsaW5nUG9saWN5Ij4KKwkJCTxmaWxlTmFtZVBhdHRlcm4+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nLiVpCisJCQk8L2ZpbGVOYW1lUGF0dGVybj4KKwkJCTxtaW5JbmRleD4xPC9taW5JbmRleD4KKwkJCTxtYXhJbmRleD4xMDwvbWF4SW5kZXg+CisJCTwvcm9sbGluZ1BvbGljeT4KKworCQk8dHJpZ2dlcmluZ1BvbGljeQorCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKwkJCTxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKwkJPC90cmlnZ2VyaW5nUG9saWN5PgorCQk8ZW5jb2Rlcj4KKwkJCTxwYXR0ZXJuPiR7ZGVmYXVsdC1sb2ctcGF0dGVybn08L3BhdHRlcm4+CisJCTwvZW5jb2Rlcj4KKwk8L2FwcGVuZGVyPgorCisJPCEtLSBBdWRpdCBsb2cgLS0+CisJPGFwcGVuZGVyIG5hbWU9IkFVRElUX1JPTExJTkciCisJCWNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+CisKKwkJPGZpbGU+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vYXVkaXQubG9nCisJCTwvZmlsZT4KKworCQk8IS0tIEF1ZGl0IG1lc3NhZ2VzIGZpbHRlciAtIGFjY2VwdCBhdWRpdCBtZXNzYWdlcyAtLT4KKwkJPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5maWx0ZXIuRXZhbHVhdG9yRmlsdGVyIj4KKwkJCTxldmFsdWF0b3IgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuYm9vbGV4Lk9uTWFya2VyRXZhbHVhdG9yIj4KKwkJCQk8bWFya2VyPkFVRElUX01BUktFUjwvbWFya2VyPgorCQkJPC9ldmFsdWF0b3I+CisJCQk8b25NaXNtYXRjaD5ERU5ZPC9vbk1pc21hdGNoPgorCQkJPG9uTWF0Y2g+QUNDRVBUPC9vbk1hdGNoPgorCQk8L2ZpbHRlcj4KKworCQk8cm9sbGluZ1BvbGljeSBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLkZpeGVkV2luZG93Um9sbGluZ1BvbGljeSI+CisJCQk8ZmlsZU5hbWVQYXR0ZXJuPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2F1ZGl0LmxvZy4laQorCQkJPC9maWxlTmFtZVBhdHRlcm4+CisJCQk8bWluSW5kZXg+MTwvbWluSW5kZXg+CisJCQk8bWF4SW5kZXg+MTA8L21heEluZGV4PgorCQk8L3JvbGxpbmdQb2xpY3k+CisKKwkJPHRyaWdnZXJpbmdQb2xpY3kKKwkJCWNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuU2l6ZUJhc2VkVHJpZ2dlcmluZ1BvbGljeSI+CisJCQk8bWF4RmlsZVNpemU+MjBNQjwvbWF4RmlsZVNpemU+CisJCTwvdHJpZ2dlcmluZ1BvbGljeT4KKwkJPGVuY29kZXI+CisJCQk8cGF0dGVybj4ke2RlZmF1bHQtbG9nLXBhdHRlcm59PC9wYXR0ZXJuPgorCQk8L2VuY29kZXI+CisJPC9hcHBlbmRlcj4KKworCTwhLS0gU2RuY1RyYW5zYWN0aW9uIGxvZyAtLT4KKwk8YXBwZW5kZXIgbmFtZT0iVFJBTlNBQ1RJT05fUk9MTElORyIKKwkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKworCQk8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS90cmFuc2FjdGlvbi5sb2cKKwkJPC9maWxlPgorCisJCTwhLS0gVHJhbnNhY3Rpb24gbWVzc2FnZXMgZmlsdGVyIC0gYWNjZXB0IGF1ZGl0IG1lc3NhZ2VzIC0tPgorCQk8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorCQkJPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorCQkJCTxtYXJrZXI+VFJBTlNBQ1RJT05fTUFSS0VSPC9tYXJrZXI+CisJCQk8L2V2YWx1YXRvcj4KKwkJCTxvbk1pc21hdGNoPkRFTlk8L29uTWlzbWF0Y2g+CisJCQk8b25NYXRjaD5BQ0NFUFQ8L29uTWF0Y2g+CisJCTwvZmlsdGVyPgorCisJCTxyb2xsaW5nUG9saWN5IGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuRml4ZWRXaW5kb3dSb2xsaW5nUG9saWN5Ij4KKwkJCTxmaWxlTmFtZVBhdHRlcm4+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vdHJhbnNhY3Rpb24ubG9nLiVpCisJCQk8L2ZpbGVOYW1lUGF0dGVybj4KKwkJCTxtaW5JbmRleD4xPC9taW5JbmRleD4KKwkJCTxtYXhJbmRleD4xMDwvbWF4SW5kZXg+CisJCTwvcm9sbGluZ1BvbGljeT4KKworCQk8dHJpZ2dlcmluZ1BvbGljeQorCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKwkJCTxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKwkJPC90cmlnZ2VyaW5nUG9saWN5PgorCQk8ZW5jb2Rlcj4KKwkJCTxwYXR0ZXJuPiR7ZGVmYXVsdC1sb2ctcGF0dGVybn08L3BhdHRlcm4+CisJCTwvZW5jb2Rlcj4KKwk8L2FwcGVuZGVyPgorCQorCTwhLS0gQXN5bmNocm9uaWNpdHkgQ29uZmlndXJhdGlvbnMgLS0+CisJPGFwcGVuZGVyIG5hbWU9IkFTWU5DX0RFQlVHIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5Bc3luY0FwcGVuZGVyIj4KKwkgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iREVCVUdfUk9MTElORyIgLz4KKwk8L2FwcGVuZGVyPgorCisJPGFwcGVuZGVyIG5hbWU9IkFTWU5DX1RSQU5TQUNUSU9OIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5Bc3luY0FwcGVuZGVyIj4KKwkgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iVFJBTlNBQ1RJT05fUk9MTElORyIgLz4KKwk8L2FwcGVuZGVyPgorCQorCTxhcHBlbmRlciBuYW1lPSJBU1lOQ19FUlJPUiIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisJICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkVSUk9SX1JPTExJTkciIC8+CisJPC9hcHBlbmRlcj4KKworCisJPHJvb3QgbGV2ZWw9IklORk8iPgorCQk8YXBwZW5kZXItcmVmIHJlZj0iQVNZTkNfRVJST1IiIC8+CisJCTxhcHBlbmRlci1yZWYgcmVmPSJBU1lOQ19ERUJVRyIgLz4KKwkJPGFwcGVuZGVyLXJlZiByZWY9IkFVRElUX1JPTExJTkciIC8+CisJCTxhcHBlbmRlci1yZWYgcmVmPSJBU1lOQ19UUkFOU0FDVElPTiIgLz4KKwkJPGlmIGNvbmRpdGlvbj0ncHJvcGVydHkoImVuYWJsZS1hbGwtbG9nIikuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpJz4KKwkJCTx0aGVuPgorCQkJCTxhcHBlbmRlci1yZWYgcmVmPSJBTExfUk9MTElORyIgLz4KKwkJCTwvdGhlbj4KKwkJPC9pZj4KKwk8L3Jvb3Q+CisKKwk8bG9nZ2VyIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjIiBsZXZlbD0iSU5GTyIgLz4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvbmVvNGotZXJyb3JzLWNvbmZpZ3VyYXRpb24ueWFtbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9uZW80ai1lcnJvcnMtY29uZmlndXJhdGlvbi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGQ2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvbmVvNGotZXJyb3JzLWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDYwIEBACisjIEVycm9ycworZXJyb3JzOgorICAgIE5lb19DbGllbnRFcnJvcl9HZW5lcmFsX1JlYWRPbmx5OiAiVGhpcyBpcyBhIHJlYWQgb25seSBkYXRhYmFzZSwgd3JpdGluZyBvciBtb2RpZnlpbmcgdGhlIGRhdGFiYXNlIGlzIG5vdCBhbGxvd2VkLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfTGVnYWN5SW5kZXhfTm9TdWNoSW5kZXg6ICJUaGUgcmVxdWVzdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgcmVmZXJyZWQgdG8gYSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfUmVxdWVzdF9JbnZhbGlkOiAiVGhlIGNsaWVudCBwcm92aWRlZCBhbiBpbnZhbGlkIFJlcXVlc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9SZXF1ZXN0X0ludmFsaWRGb3JtYXQ6ICJUaGUgY2xpZW50IHByb3ZpZGVkIGEgcmVxdWVzdCB0aGF0IHdhcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcywgb3IgaGFkIHZhbHVlcyB0aGF0IGFyZSBub3QgYWxsb3dlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9Db25zdHJhaW50QWxyZWFkeUV4aXN0czogIlVuYWJsZSB0byBwZXJmb3JtIG9wZXJhdGlvbiBiZWNhdXNlIGl0IHdvdWxkIGNsYXNoIHdpdGggYSBwcmUtZXhpc3RpbmcgY29uc3RyYWludC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9Db25zdHJhaW50VmVyaWZpY2F0aW9uRmFpbHVyZTogIlVuYWJsZSB0byBjcmVhdGUgY29uc3RyYWludCBiZWNhdXNlIGRhdGEgdGhhdCBleGlzdHMgaW4gdGhlIGRhdGFiYXNlIHZpb2xhdGVzIGl0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0NvbnN0cmFpbnRWaW9sYXRpb246ICJBIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGUgZGF0YWJhc2Ugd2FzIHZpb2xhdGVkLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0lsbGVnYWxUb2tlbk5hbWU6ICJBIHRva2VuIG5hbWUsIHN1Y2ggYXMgYSBsYWJlbCwgcmVsYXRpb25zaGlwIHR5cGUgb3IgcHJvcGVydHkga2V5LCB1c2VkIGlzIG5vdCB2YWxpZC4gVG9rZW5zIGNhbm5vdCBiZSBlbXB0eSBzdHJpbmdzIGFuZCBjYW5ub3QgYmUgbnVsbC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9JbmRleEFscmVhZHlFeGlzdHM6ICJVbmFibGUgdG8gcGVyZm9ybSBvcGVyYXRpb24gYmVjYXVzZSBpdCB3b3VsZCBjbGFzaCB3aXRoIGEgcHJlLWV4aXN0aW5nIGluZGV4LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0luZGV4QmVsb25nc1RvQ29uc3RyYWludDogIkEgcmVxdWVzdGVkIG9wZXJhdGlvbiBjYW4gbm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgc3BlY2lmaWVkIGluZGV4IGJlY2F1c2UgdGhlIGluZGV4IGlzIHBhcnQgb2YgYSBjb25zdHJhaW50LiBJZiB5b3Ugd2FudCB0byBkcm9wIHRoZSBpbmRleCwgZm9yIGluc3RhbmNlLCB5b3UgbXVzdCBkcm9wIHRoZSBjb25zdHJhaW50LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0luZGV4TGltaXRSZWFjaGVkOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGV4IGVudHJpZXMgc3VwcG9ydGVkIGhhcyBiZWVuIHJlYWNoZWQsIG5vIG1vcmUgZW50aXRpZXMgY2FuIGJlIGluZGV4ZWQuIgorICAgIE5lb19DbGllbnRFcnJvcl9TY2hlbWFfTGFiZWxMaW1pdFJlYWNoZWQ6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgbGFiZWxzIHN1cHBvcnRlZCBoYXMgYmVlbiByZWFjaGVkLCBubyBtb3JlIGxhYmVscyBjYW4gYmUgY3JlYXRlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9Ob1N1Y2hDb25zdHJhaW50OiAiVGhlIHJlcXVlc3QgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHJlZmVycmVkIHRvIGEgY29uc3RyYWludCB0aGF0IGRvZXMgbm90IGV4aXN0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX05vU3VjaEluZGV4OiAiVGhlIHJlcXVlc3QgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHJlZmVycmVkIHRvIGFuIGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9TZWN1cml0eV9BdXRoZW50aWNhdGlvbkZhaWxlZDogIlRoZSBjbGllbnQgcHJvdmlkZWQgYW4gaW5jb3JyZWN0IHVzZXJuYW1lIGFuZC9vciBwYXNzd29yZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NlY3VyaXR5X0F1dGhlbnRpY2F0aW9uUmF0ZUxpbWl0OiAiVGhlIGNsaWVudCBoYXMgcHJvdmlkZWQgaW5jb3JyZWN0IGF1dGhlbnRpY2F0aW9uIGRldGFpbHMgdG9vIG1hbnkgdGltZXMgaW4gYSByb3cuIgorICAgIE5lb19DbGllbnRFcnJvcl9TZWN1cml0eV9BdXRob3JpemF0aW9uRmFpbGVkOiAiVGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIHByaXZpbGVnZXMgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9Bcml0aG1ldGljRXJyb3I6ICJJbnZhbGlkIHVzZSBvZiBhcml0aG1ldGljLCBzdWNoIGFzIGRpdmlkaW5nIGJ5IHplcm8uIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfQ29uc3RyYWludFZpb2xhdGlvbjogIkEgY29uc3RyYWludCBpbXBvc2VkIGJ5IHRoZSBzdGF0ZW1lbnQgaXMgdmlvbGF0ZWQgYnkgdGhlIGRhdGEgaW4gdGhlIGRhdGFiYXNlLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU3RhdGVtZW50X0VudGl0eU5vdEZvdW5kOiAiVGhlIHN0YXRlbWVudCBpcyBkaXJlY3RseSByZWZlcnJpbmcgdG8gYW4gZW50aXR5IHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfSW52YWxpZEFyZ3VtZW50czogIlRoZSBzdGF0ZW1lbnQgaXMgYXR0ZW1wdGluZyB0byBwZXJmb3JtIG9wZXJhdGlvbnMgdXNpbmcgaW52YWxpZCBhcmd1bWVudHMiCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9JbnZhbGlkU2VtYW50aWNzOiAiVGhlIHN0YXRlbWVudCBpcyBzeW50YWN0aWNhbGx5IHZhbGlkLCBidXQgZXhwcmVzc2VzIHNvbWV0aGluZyB0aGF0IHRoZSBkYXRhYmFzZSBjYW5ub3QgZG8uIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfSW52YWxpZFN5bnRheDogIlRoZSBzdGF0ZW1lbnQgY29udGFpbnMgaW52YWxpZCBvciB1bnN1cHBvcnRlZCBzeW50YXguIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfSW52YWxpZFR5cGU6ICJUaGUgc3RhdGVtZW50IGlzIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIHZhbHVlcyB3aXRoIHR5cGVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG9wZXJhdGlvbi4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9Ob1N1Y2hMYWJlbDogIlRoZSBzdGF0ZW1lbnQgaXMgcmVmZXJyaW5nIHRvIGEgbGFiZWwgdGhhdCBkb2VzIG5vdCBleGlzdC4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9Ob1N1Y2hQcm9wZXJ0eTogIlRoZSBzdGF0ZW1lbnQgaXMgcmVmZXJyaW5nIHRvIGEgcHJvcGVydHkgdGhhdCBkb2VzIG5vdCBleGlzdC4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9QYXJhbWV0ZXJNaXNzaW5nOiAiVGhlIHN0YXRlbWVudCBpcyByZWZlcnJpbmcgdG8gYSBwYXJhbWV0ZXIgdGhhdCB3YXMgbm90IHByb3ZpZGVkIGluIHRoZSBSZXF1ZXN0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfVHJhbnNhY3Rpb25fQ29uY3VycmVudFJlcXVlc3Q6ICJUaGVyZSB3ZXJlIGNvbmN1cnJlbnQgcmVxdWVzdHMgYWNjZXNzaW5nIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1RyYW5zYWN0aW9uX0V2ZW50SGFuZGxlclRocmV3RXhjZXB0aW9uOiAiQSB0cmFuc2FjdGlvbiBldmVudCBoYW5kbGVyIHRocmV3IGFuIGV4Y2VwdGlvbi4gVGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgcm9sbGVkIGJhY2suIgorICAgIE5lb19DbGllbnRFcnJvcl9UcmFuc2FjdGlvbl9Ib29rRmFpbGVkOiAiVHJhbnNhY3Rpb24gaG9vayBmYWlsdXJlLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfVHJhbnNhY3Rpb25fSW52YWxpZFR5cGU6ICJUaGUgdHJhbnNhY3Rpb24gaXMgb2YgdGhlIHdyb25nIHR5cGUgdG8gc2VydmljZSB0aGUgUmVxdWVzdF8gRm9yIGluc3RhbmNlLCBhIHRyYW5zYWN0aW9uIHRoYXQgaGFzIGhhZCBzY2hlbWEgbW9kaWZpY2F0aW9ucyBwZXJmb3JtZWQgaW4gaXQgY2Fubm90IGJlIHVzZWQgdG8gc3Vic2VxdWVudGx5IHBlcmZvcm0gZGF0YSBvcGVyYXRpb25zLCBhbmQgdmljZSB2ZXJzYS4iCisgICAgTmVvX0NsaWVudEVycm9yX1RyYW5zYWN0aW9uX01hcmtlZEFzRmFpbGVkOiAiVHJhbnNhY3Rpb24gd2FzIG1hcmtlZCBhcyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZC4gRmFpbHVyZSB0YWtlcyBwcmVjZWRlbmNlIGFuZCBzbyB0aGlzIHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjayBhbHRob3VnaCBpdCBtYXkgaGF2ZSBsb29rZWQgbGlrZSBpdCB3YXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIgorICAgIE5lb19DbGllbnRFcnJvcl9UcmFuc2FjdGlvbl9Vbmtub3duSWQ6ICJUaGUgcmVxdWVzdCByZWZlcnJlZCB0byBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9UcmFuc2FjdGlvbl9WYWxpZGF0aW9uRmFpbGVkOiAiVHJhbnNhY3Rpb24gY2hhbmdlcyBkaWQgbm90IHBhc3MgdmFsaWRhdGlvbiBjaGVja3MiCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfR2VuZXJhbF9Db3JydXB0U2NoZW1hUnVsZTogIkEgbWFsZm9ybWVkIHNjaGVtYSBydWxlIHdhcyBlbmNvdW50ZXJlZC4gUGxlYXNlIGNvbnRhY3QgeW91ciBzdXBwb3J0IHJlcHJlc2VudGF0aXZlLiIKKyAgICBOZW9fRGF0YWJhc2VFcnJvcl9HZW5lcmFsX0ZhaWxlZEluZGV4OiAiVGhlIHJlcXVlc3QgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHJlZmVycmVkIHRvIGFuIGluZGV4IHRoYXQgaXMgaW4gYSBmYWlsZWQgc3RhdGUuIFRoZSBpbmRleCBuZWVkcyB0byBiZSBkcm9wcGVkIGFuZCByZWNyZWF0ZWQgbWFudWFsbHkuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX0dlbmVyYWxfVW5rbm93bkZhaWx1cmU6ICJBbiB1bmtub3duIGZhaWx1cmUgb2NjdXJyZWQuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Db25zdHJhaW50Q3JlYXRpb25GYWlsdXJlOiAiQ3JlYXRpbmcgYSByZXF1ZXN0ZWQgY29uc3RyYWludCBmYWlsZWQuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Db25zdHJhaW50RHJvcEZhaWx1cmU6ICJUaGUgZGF0YWJhc2UgZmFpbGVkIHRvIGRyb3AgYSByZXF1ZXN0ZWQgY29uc3RyYWludC4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfU2NoZW1hX0luZGV4Q3JlYXRpb25GYWlsdXJlOiAiRmFpbGVkIHRvIGNyZWF0ZSBhbiBpbmRleC4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfU2NoZW1hX0luZGV4RHJvcEZhaWx1cmU6ICJUaGUgZGF0YWJhc2UgZmFpbGVkIHRvIGRyb3AgYSByZXF1ZXN0ZWQgaW5kZXguIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Ob1N1Y2hMYWJlbDogIlRoZSByZXF1ZXN0IGFjY2Vzc2VkIGEgbGFiZWwgdGhhdCBkaWQgbm90IGV4aXN0LiIKKyAgICBOZW9fRGF0YWJhc2VFcnJvcl9TY2hlbWFfTm9TdWNoUHJvcGVydHlLZXk6ICJUaGUgcmVxdWVzdCBhY2Nlc3NlZCBhIHByb3BlcnR5IHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Ob1N1Y2hSZWxhdGlvbnNoaXBUeXBlOiAiVGhlIHJlcXVlc3QgYWNjZXNzZWQgYSByZWxhdGlvbnNoaXAgdHlwZSB0aGF0IGRvZXMgbm90IGV4aXN0LiIKKyAgICBOZW9fRGF0YWJhc2VFcnJvcl9TY2hlbWFfTm9TdWNoU2NoZW1hUnVsZTogIlRoZSByZXF1ZXN0IHJlZmVycmVkIHRvIGEgc2NoZW1hIHJ1bGUgdGhhdCBkb2VzIG5vdCBleGlzdC4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfU3RhdGVtZW50X0V4ZWN1dGlvbkZhaWx1cmU6ICJUaGUgZGF0YWJhc2Ugd2FzIHVuYWJsZSB0byBleGVjdXRlIHRoZSBTdGF0ZW1lbnQuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1RyYW5zYWN0aW9uX0NvdWxkTm90QmVnaW46ICJUaGUgZGF0YWJhc2Ugd2FzIHVuYWJsZSB0byBzdGFydCB0aGUgVHJhbnNhY3Rpb24uIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1RyYW5zYWN0aW9uX0NvdWxkTm90Q29tbWl0OiAiVGhlIGRhdGFiYXNlIHdhcyB1bmFibGUgdG8gY29tbWl0IHRoZSBUcmFuc2FjdGlvbi4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfVHJhbnNhY3Rpb25fQ291bGROb3RSb2xsYmFjazogIlRoZSBkYXRhYmFzZSB3YXMgdW5hYmxlIHRvIHJvbGwgYmFjayB0aGUgVHJhbnNhY3Rpb24uIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1RyYW5zYWN0aW9uX0NvdWxkTm90V3JpdGVUb0xvZzogIlRoZSBkYXRhYmFzZSB3YXMgdW5hYmxlIHRvIHdyaXRlIHRyYW5zYWN0aW9uIHRvIGxvZy4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfVHJhbnNhY3Rpb25fUmVsZWFzZUxvY2tzRmFpbGVkOiAiVGhlIHRyYW5zYWN0aW9uIHdhcyB1bmFibGUgdG8gcmVsZWFzZSBvbmUgb3IgbW9yZSBvZiBpdHMgbG9ja3MuIgorICAgIE5lb19UcmFuc2llbnRFcnJvcl9HZW5lcmFsX0RhdGFiYXNlVW5hdmFpbGFibGU6ICJUaGUgZGF0YWJhc2UgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgdG8gc2VydmUgeW91ciByZXF1ZXN0LCByZWZlciB0byB0aGUgZGF0YWJhc2UgbG9ncyBmb3IgbW9yZSBkZXRhaWxzLiBSZXRyeWluZyB5b3VyIHJlcXVlc3QgYXQgYSBsYXRlciB0aW1lIG1heSBzdWNjZWVkLiIKKyAgICBOZW9fVHJhbnNpZW50RXJyb3JfTmV0d29ya19Vbmtub3duRmFpbHVyZTogIkFuIHVua25vd24gbmV0d29yayBmYWlsdXJlIG9jY3VycmVkLCBhIHJldHJ5IG1heSByZXNvbHZlIHRoZSBpc3N1ZS4iCisgICAgTmVvX1RyYW5zaWVudEVycm9yX1NjaGVtYV9Nb2RpZmllZENvbmN1cnJlbnRseTogIlRoZSBkYXRhYmFzZSBzY2hlbWEgd2FzIG1vZGlmaWVkIHdoaWxlIHRoaXMgdHJhbnNhY3Rpb24gd2FzIHJ1bm5pbmcsIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcmV0cmllZC4iCisgICAgTmVvX1RyYW5zaWVudEVycm9yX1NlY3VyaXR5X01vZGlmaWVkQ29uY3VycmVudGx5OiAiVGhlIHVzZXIgd2FzIG1vZGlmaWVkIGNvbmN1cnJlbnRseSB0byB0aGlzIFJlcXVlc3QuIgorICAgIE5lb19UcmFuc2llbnRFcnJvcl9TdGF0ZW1lbnRfRXh0ZXJuYWxSZXNvdXJjZUZhaWx1cmU6ICJUaGUgZXh0ZXJuYWwgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZSIKKyAgICBOZW9fVHJhbnNpZW50RXJyb3JfVHJhbnNhY3Rpb25fQWNxdWlyZUxvY2tUaW1lb3V0OiAiVGhlIHRyYW5zYWN0aW9uIHdhcyB1bmFibGUgdG8gYWNxdWlyZSBhIGxvY2ssIGZvciBpbnN0YW5jZSBkdWUgdG8gYSB0aW1lb3V0IG9yIHRoZSB0cmFuc2FjdGlvbiB0aHJlYWQgYmVpbmcgaW50ZXJydXB0ZWQuIgorICAgIE5lb19UcmFuc2llbnRFcnJvcl9UcmFuc2FjdGlvbl9EZWFkbG9ja0RldGVjdGVkOiAiVGhpcyB0cmFuc2FjdGlvbiwgYW5kIGF0IGxlYXN0IG9uZSBtb3JlIHRyYW5zYWN0aW9uLCBoYXMgYWNxdWlyZWQgbG9ja3MgaW4gYSB3YXkgdGhhdCBpdCB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5LCBhbmQgdGhlIGRhdGFiYXNlIGhhcyBhYm9ydGVkIGl0LiBSZXRyeWluZyB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgbW9zdCBsaWtlbHkgYmUgc3VjY2Vzc2Z1bC4iClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL3RpdGFuLnByb3BlcnRpZXMgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvdGl0YW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI1NzIzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL3RpdGFuLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorc3RvcmFnZS5iYWNrZW5kPWNhc3NhbmRyYQorc3RvcmFnZS5ob3N0bmFtZT1sb2NhbGhvc3QKK3N0b3JhZ2UucG9ydD05MTYwCisKK2NhY2hlLmRiLWNhY2hlID0gZmFsc2UKK2NhY2hlLmRiLWNhY2hlLWNsZWFuLXdhaXQgPSAyMAorY2FjaGUuZGItY2FjaGUtdGltZSA9IDE4MDAwMAorY2FjaGUuZGItY2FjaGUtc2l6ZSA9IDAuNQorCitjYWNoZS50eC1jYWNoZS1zaXplID0gNTAwMDAwCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9lbGFzdGljc2VhcmNoLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2VsYXN0aWNzZWFyY2gueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NjM0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9lbGFzdGljc2VhcmNoLnltbApAQCAtMCwwICsxLDM5MyBAQAorCitjbHVzdGVyLm5hbWU6IGVsYXN0aWNzZWFyY2hfMV81XzIKKyAgCitkaXNjb3ZlcnkuemVuLnBpbmcudW5pY2FzdC5ob3N0czogZWxhc3RpY3NlYXJjaF9ob3N0CisKK2h0dHAuY29ycy5lbmFibGVkOiB0cnVlCisjcGx1Z2luLnR5cGVzOiAiRGVsZXRlQnlRdWVyeVBsdWdpbiIKKyNwYXRoLmhvbWU6ICIvaG9tZS92YWdyYW50L2NhdGFsb2ctYmUvY29uZmlnIgorCitlbGFzdGljU2VhcmNoLnRyYW5zcG9ydGNsaWVudDogdHJ1ZQorCit0cmFuc3BvcnQuY2xpZW50LmluaXRpYWxfbm9kZXM6CisgICAtIGVsYXN0aWNzZWFyY2hfaG9zdDo5MzAwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFbGFzdGljc2VhcmNoIENvbmZpZ3VyYXRpb24gRXhhbXBsZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGlzIGZpbGUgY29udGFpbnMgYW4gb3ZlcnZpZXcgb2YgdmFyaW91cyBjb25maWd1cmF0aW9uIHNldHRpbmdzLAorIyB0YXJnZXRlZCBhdCBvcGVyYXRpb25zIHN0YWZmLiBBcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHNob3VsZAorIyBjb25zdWx0IHRoZSBndWlkZSBhdCA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlPi4KKyMKKyMgVGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgaXMgY292ZXJlZCBhdAorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAuaHRtbD4uCisjCisjIEVsYXN0aWNzZWFyY2ggY29tZXMgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBtb3N0IHNldHRpbmdzLAorIyBzbyB5b3UgY2FuIHRyeSBpdCBvdXQgd2l0aG91dCBib3RoZXJpbmcgd2l0aCBjb25maWd1cmF0aW9uLgorIworIyBNb3N0IG9mIHRoZSB0aW1lLCB0aGVzZSBkZWZhdWx0cyBhcmUganVzdCBmaW5lIGZvciBydW5uaW5nIGEgcHJvZHVjdGlvbgorIyBjbHVzdGVyLiBJZiB5b3UncmUgZmluZS10dW5pbmcgeW91ciBjbHVzdGVyLCBvciB3b25kZXJpbmcgYWJvdXQgdGhlCisjIGVmZmVjdCBvZiBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBwbGVhc2UgX2RvIGFza18gb24gdGhlCisjIG1haWxpbmcgbGlzdCBvciBJUkMgY2hhbm5lbCBbaHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2NvbW11bml0eV0uCisKKyMgQW55IGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHJlcGxhY2VkIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzCisjIGJ5IHBsYWNpbmcgdGhlbSBpbiAkey4uLn0gbm90YXRpb24uIEZvciBleGFtcGxlOgorIworIyBub2RlLnJhY2s6ICR7UkFDS19FTlZfVkFSfQorCisjIEZvciBpbmZvcm1hdGlvbiBvbiBzdXBwb3J0ZWQgZm9ybWF0cyBhbmQgc3ludGF4IGZvciB0aGUgY29uZmlnIGZpbGUsIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAtY29uZmlndXJhdGlvbi5odG1sPgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENsdXN0ZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDbHVzdGVyIG5hbWUgaWRlbnRpZmllcyB5b3VyIGNsdXN0ZXIgZm9yIGF1dG8tZGlzY292ZXJ5LiBJZiB5b3UncmUgcnVubmluZworIyBtdWx0aXBsZSBjbHVzdGVycyBvbiB0aGUgc2FtZSBuZXR3b3JrLCBtYWtlIHN1cmUgeW91J3JlIHVzaW5nIHVuaXF1ZSBuYW1lcy4KKyMKKyMgY2x1c3Rlci5uYW1lOiBlbGFzdGljc2VhcmNoCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vZGUgbmFtZXMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBvbiBzdGFydHVwLCBzbyB5b3UncmUgcmVsaWV2ZWQKKyMgZnJvbSBjb25maWd1cmluZyB0aGVtIG1hbnVhbGx5LiBZb3UgY2FuIHRpZSB0aGlzIG5vZGUgdG8gYSBzcGVjaWZpYyBuYW1lOgorIworIyBub2RlLm5hbWU6ICJGcmFueiBLYWZrYSIKKworIyBFdmVyeSBub2RlIGNhbiBiZSBjb25maWd1cmVkIHRvIGFsbG93IG9yIGRlbnkgYmVpbmcgZWxpZ2libGUgYXMgdGhlIG1hc3RlciwKKyMgYW5kIHRvIGFsbG93IG9yIGRlbnkgdG8gc3RvcmUgdGhlIGRhdGEuCisjCisjIEFsbG93IHRoaXMgbm9kZSB0byBiZSBlbGlnaWJsZSBhcyBhIG1hc3RlciBub2RlIChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBub2RlLm1hc3RlcjogdHJ1ZQorIworIyBBbGxvdyB0aGlzIG5vZGUgdG8gc3RvcmUgZGF0YSAoZW5hYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgbm9kZS5kYXRhOiB0cnVlCisKKyMgWW91IGNhbiBleHBsb2l0IHRoZXNlIHNldHRpbmdzIHRvIGRlc2lnbiBhZHZhbmNlZCBjbHVzdGVyIHRvcG9sb2dpZXMuCisjCisjIDEuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBuZXZlciBiZWNvbWUgYSBtYXN0ZXIgbm9kZSwgb25seSB0byBob2xkIGRhdGEuCisjICAgIFRoaXMgd2lsbCBiZSB0aGUgIndvcmtob3JzZSIgb2YgeW91ciBjbHVzdGVyLgorIworIyBub2RlLm1hc3RlcjogZmFsc2UKKyMgbm9kZS5kYXRhOiB0cnVlCisjCisjIDIuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBvbmx5IHNlcnZlIGFzIGEgbWFzdGVyOiB0byBub3Qgc3RvcmUgYW55IGRhdGEgYW5kCisjICAgIHRvIGhhdmUgZnJlZSByZXNvdXJjZXMuIFRoaXMgd2lsbCBiZSB0aGUgImNvb3JkaW5hdG9yIiBvZiB5b3VyIGNsdXN0ZXIuCisjCisjIG5vZGUubWFzdGVyOiB0cnVlCisjIG5vZGUuZGF0YTogZmFsc2UKKyMKKyMgMy4gWW91IHdhbnQgdGhpcyBub2RlIHRvIGJlIG5laXRoZXIgbWFzdGVyIG5vciBkYXRhIG5vZGUsIGJ1dAorIyAgICB0byBhY3QgYXMgYSAic2VhcmNoIGxvYWQgYmFsYW5jZXIiIChmZXRjaGluZyBkYXRhIGZyb20gbm9kZXMsCisjICAgIGFnZ3JlZ2F0aW5nIHJlc3VsdHMsIGV0Yy4pCisjCisjIG5vZGUubWFzdGVyOiBmYWxzZQorIyBub2RlLmRhdGE6IGZhbHNlCisKKyMgVXNlIHRoZSBDbHVzdGVyIEhlYWx0aCBBUEkgW2h0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fY2x1c3Rlci9oZWFsdGhdLCB0aGUKKyMgTm9kZSBJbmZvIEFQSSBbaHR0cDovL2xvY2FsaG9zdDo5MjAwL19ub2Rlc10gb3IgR1VJIHRvb2xzCisjIHN1Y2ggYXMgPGh0dHA6Ly93d3cuZWxhc3RpY3NlYXJjaC5vcmcvb3ZlcnZpZXcvbWFydmVsLz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9rYXJtaS9lbGFzdGljc2VhcmNoLXBhcmFtZWRpYz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9sdWthcy12bGNlay9iaWdkZXNrPiBhbmQKKyMgPGh0dHA6Ly9tb2J6LmdpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC1oZWFkPiB0byBpbnNwZWN0IHRoZSBjbHVzdGVyIHN0YXRlLgorCisjIEEgbm9kZSBjYW4gaGF2ZSBnZW5lcmljIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCB3aGljaCBjYW4gbGF0ZXIgYmUgdXNlZAorIyBmb3IgY3VzdG9taXplZCBzaGFyZCBhbGxvY2F0aW9uIGZpbHRlcmluZywgb3IgYWxsb2NhdGlvbiBhd2FyZW5lc3MuIEFuIGF0dHJpYnV0ZQorIyBpcyBhIHNpbXBsZSBrZXkgdmFsdWUgcGFpciwgc2ltaWxhciB0byBub2RlLmtleTogdmFsdWUsIGhlcmUgaXMgYW4gZXhhbXBsZToKKyMKKyMgbm9kZS5yYWNrOiByYWNrMzE0CisKKyMgQnkgZGVmYXVsdCwgbXVsdGlwbGUgbm9kZXMgYXJlIGFsbG93ZWQgdG8gc3RhcnQgZnJvbSB0aGUgc2FtZSBpbnN0YWxsYXRpb24gbG9jYXRpb24KKyMgdG8gZGlzYWJsZSBpdCwgc2V0IHRoZSBmb2xsb3dpbmc6CisjIG5vZGUubWF4X2xvY2FsX3N0b3JhZ2Vfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSW5kZXggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgWW91IGNhbiBzZXQgYSBudW1iZXIgb2Ygb3B0aW9ucyAoc3VjaCBhcyBzaGFyZC9yZXBsaWNhIG9wdGlvbnMsIG1hcHBpbmcKKyMgb3IgYW5hbHl6ZXIgZGVmaW5pdGlvbnMsIHRyYW5zbG9nIHNldHRpbmdzLCAuLi4pIGZvciBpbmRpY2VzIGdsb2JhbGx5LAorIyBpbiB0aGlzIGZpbGUuCisjCisjIE5vdGUsIHRoYXQgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBjb25maWd1cmUgaW5kZXggc2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvcgorIyBhIGNlcnRhaW4gaW5kZXgsIGVpdGhlciB3aGVuIGNyZWF0aW5nIGl0IG9yIGJ5IHVzaW5nIHRoZSBpbmRleCB0ZW1wbGF0ZXMgQVBJLgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L2luZGV4LW1vZHVsZXMuaHRtbD4gYW5kCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9pbmRpY2VzLWNyZWF0ZS1pbmRleC5odG1sPgorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBTZXQgdGhlIG51bWJlciBvZiBzaGFyZHMgKHNwbGl0cykgb2YgYW4gaW5kZXggKDUgYnkgZGVmYXVsdCk6CisjCisjIGluZGV4Lm51bWJlcl9vZl9zaGFyZHM6IDUKKworIyBTZXQgdGhlIG51bWJlciBvZiByZXBsaWNhcyAoYWRkaXRpb25hbCBjb3BpZXMpIG9mIGFuIGluZGV4ICgxIGJ5IGRlZmF1bHQpOgorIworIyBpbmRleC5udW1iZXJfb2ZfcmVwbGljYXM6IDEKKworIyBOb3RlLCB0aGF0IGZvciBkZXZlbG9wbWVudCBvbiBhIGxvY2FsIG1hY2hpbmUsIHdpdGggc21hbGwgaW5kaWNlcywgaXQgdXN1YWxseQorIyBtYWtlcyBzZW5zZSB0byAiZGlzYWJsZSIgdGhlIGRpc3RyaWJ1dGVkIGZlYXR1cmVzOgorIworaW5kZXgubnVtYmVyX29mX3NoYXJkczogMQoraW5kZXgubnVtYmVyX29mX3JlcGxpY2FzOiAwCisKKyMgVGhlc2Ugc2V0dGluZ3MgZGlyZWN0bHkgYWZmZWN0IHRoZSBwZXJmb3JtYW5jZSBvZiBpbmRleCBhbmQgc2VhcmNoIG9wZXJhdGlvbnMKKyMgaW4geW91ciBjbHVzdGVyLiBBc3N1bWluZyB5b3UgaGF2ZSBlbm91Z2ggbWFjaGluZXMgdG8gaG9sZCBzaGFyZHMgYW5kCisjIHJlcGxpY2FzLCB0aGUgcnVsZSBvZiB0aHVtYiBpczoKKyMKKyMgMS4gSGF2aW5nIG1vcmUgKnNoYXJkcyogZW5oYW5jZXMgdGhlIF9pbmRleGluZ18gcGVyZm9ybWFuY2UgYW5kIGFsbG93cyB0bworIyAgICBfZGlzdHJpYnV0ZV8gYSBiaWcgaW5kZXggYWNyb3NzIG1hY2hpbmVzLgorIyAyLiBIYXZpbmcgbW9yZSAqcmVwbGljYXMqIGVuaGFuY2VzIHRoZSBfc2VhcmNoXyBwZXJmb3JtYW5jZSBhbmQgaW1wcm92ZXMgdGhlCisjICAgIGNsdXN0ZXIgX2F2YWlsYWJpbGl0eV8uCisjCisjIFRoZSAibnVtYmVyX29mX3NoYXJkcyIgaXMgYSBvbmUtdGltZSBzZXR0aW5nIGZvciBhbiBpbmRleC4KKyMKKyMgVGhlICJudW1iZXJfb2ZfcmVwbGljYXMiIGNhbiBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGFueXRpbWUsCisjIGJ5IHVzaW5nIHRoZSBJbmRleCBVcGRhdGUgU2V0dGluZ3MgQVBJLgorIworIyBFbGFzdGljc2VhcmNoIHRha2VzIGNhcmUgYWJvdXQgbG9hZCBiYWxhbmNpbmcsIHJlbG9jYXRpbmcsIGdhdGhlcmluZyB0aGUKKyMgcmVzdWx0cyBmcm9tIG5vZGVzLCBldGMuIEV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgdG8gZmluZS10dW5lCisjIHlvdXIgc2V0dXAuCisKKyMgVXNlIHRoZSBJbmRleCBTdGF0dXMgQVBJICg8aHR0cDovL2xvY2FsaG9zdDo5MjAwL0EvX3N0YXR1cz4pIHRvIGluc3BlY3QKKyMgdGhlIGluZGV4IHN0YXR1cy4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUGF0aHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgUGF0aCB0byBkaXJlY3RvcnkgY29udGFpbmluZyBjb25maWd1cmF0aW9uICh0aGlzIGZpbGUgYW5kIGxvZ2dpbmcueW1sKToKKyMKK3BhdGguY29uZjogL3NyYy90ZXN0L3Jlc291cmNlcworI3BhdGguaG9tZTogL3NyYy90ZXN0L3Jlc291cmNlcworCisjIFBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGluZGV4IGRhdGEgYWxsb2NhdGVkIGZvciB0aGlzIG5vZGUuCisjCitwYXRoLmRhdGE6IHRhcmdldC9lc2RhdGEKKyMKKyMgQ2FuIG9wdGlvbmFsbHkgaW5jbHVkZSBtb3JlIHRoYW4gb25lIGxvY2F0aW9uLCBjYXVzaW5nIGRhdGEgdG8gYmUgc3RyaXBlZCBhY3Jvc3MKKyMgdGhlIGxvY2F0aW9ucyAoYSBsYSBSQUlEIDApIG9uIGEgZmlsZSBsZXZlbCwgZmF2b3VyaW5nIGxvY2F0aW9ucyB3aXRoIG1vc3QgZnJlZQorIyBzcGFjZSBvbiBjcmVhdGlvbi4gRm9yIGV4YW1wbGU6CisjCisjIHBhdGguZGF0YTogL3BhdGgvdG8vZGF0YTEsL3BhdGgvdG8vZGF0YTIKKworIyBQYXRoIHRvIHRlbXBvcmFyeSBmaWxlczoKKyMKK3BhdGgud29yazogL3RhcmdldC9lc3dvcmsKKworIyBQYXRoIHRvIGxvZyBmaWxlczoKKyMKK3BhdGgubG9nczogL3RhcmdldC9lc2xvZ3MKKworIyBQYXRoIHRvIHdoZXJlIHBsdWdpbnMgYXJlIGluc3RhbGxlZDoKKyMKKyMgcGF0aC5wbHVnaW5zOiAvcGF0aC90by9wbHVnaW5zCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBsdWdpbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIElmIGEgcGx1Z2luIGxpc3RlZCBoZXJlIGlzIG5vdCBpbnN0YWxsZWQgZm9yIGN1cnJlbnQgbm9kZSwgdGhlIG5vZGUgd2lsbCBub3Qgc3RhcnQuCisjCisjIHBsdWdpbi5tYW5kYXRvcnk6IG1hcHBlci1hdHRhY2htZW50cyxsYW5nLWdyb292eQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1lbW9yeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoIHBlcmZvcm1zIHBvb3JseSB3aGVuIEpWTSBzdGFydHMgc3dhcHBpbmc6IHlvdSBzaG91bGQgZW5zdXJlIHRoYXQKKyMgaXQgX25ldmVyXyBzd2Fwcy4KKyMKKyMgU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBsb2NrIHRoZSBtZW1vcnk6CisjCisjIGJvb3RzdHJhcC5tbG9ja2FsbDogdHJ1ZQorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBFU19NSU5fTUVNIGFuZCBFU19NQVhfTUVNIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CisjIHRvIHRoZSBzYW1lIHZhbHVlLCBhbmQgdGhhdCB0aGUgbWFjaGluZSBoYXMgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZQorIyBmb3IgRWxhc3RpY3NlYXJjaCwgbGVhdmluZyBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpdHNlbGYuCisjCisjIFlvdSBzaG91bGQgYWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgRWxhc3RpY3NlYXJjaCBwcm9jZXNzIGlzIGFsbG93ZWQgdG8gbG9jaworIyB0aGUgbWVtb3J5LCBlZy4gYnkgdXNpbmcgYHVsaW1pdCAtbCB1bmxpbWl0ZWRgLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOZXR3b3JrIEFuZCBIVFRQICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoLCBieSBkZWZhdWx0LCBiaW5kcyBpdHNlbGYgdG8gdGhlIDAuMC4wLjAgYWRkcmVzcywgYW5kIGxpc3RlbnMKKyMgb24gcG9ydCBbOTIwMC05MzAwXSBmb3IgSFRUUCB0cmFmZmljIGFuZCBvbiBwb3J0IFs5MzAwLTk0MDBdIGZvciBub2RlLXRvLW5vZGUKKyMgY29tbXVuaWNhdGlvbi4gKHRoZSByYW5nZSBtZWFucyB0aGF0IGlmIHRoZSBwb3J0IGlzIGJ1c3ksIGl0IHdpbGwgYXV0b21hdGljYWxseQorIyB0cnkgdGhlIG5leHQgcG9ydCkuCisKKyMgU2V0IHRoZSBiaW5kIGFkZHJlc3Mgc3BlY2lmaWNhbGx5IChJUHY0IG9yIElQdjYpOgorIworIyBuZXR3b3JrLmJpbmRfaG9zdDogMTkyLjE2OC4wLjEKKworIyBTZXQgdGhlIGFkZHJlc3Mgb3RoZXIgbm9kZXMgd2lsbCB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzIG5vZGUuIElmIG5vdAorIyBzZXQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZGVyaXZlZC4gSXQgbXVzdCBwb2ludCB0byBhbiBhY3R1YWwgSVAgYWRkcmVzcy4KKyMKKyMgbmV0d29yay5wdWJsaXNoX2hvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGJvdGggJ2JpbmRfaG9zdCcgYW5kICdwdWJsaXNoX2hvc3QnOgorIworIyBuZXR3b3JrLmhvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGEgY3VzdG9tIHBvcnQgZm9yIHRoZSBub2RlIHRvIG5vZGUgY29tbXVuaWNhdGlvbiAoOTMwMCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5wb3J0OiA5MzAwCisKKyMgRW5hYmxlIGNvbXByZXNzaW9uIGZvciBhbGwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG5vZGVzIChkaXNhYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5jb21wcmVzczogdHJ1ZQorCisjIFNldCBhIGN1c3RvbSBwb3J0IHRvIGxpc3RlbiBmb3IgSFRUUCB0cmFmZmljOgorIworIyBodHRwLnBvcnQ6IDkyMDAKKworIyBTZXQgYSBjdXN0b20gYWxsb3dlZCBjb250ZW50IGxlbmd0aDoKKyMKKyMgaHR0cC5tYXhfY29udGVudF9sZW5ndGg6IDEwMG1iCisKKyMgRGlzYWJsZSBIVFRQIGNvbXBsZXRlbHk6CisjCisjIGh0dHAuZW5hYmxlZDogZmFsc2UKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHYXRld2F5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlIGdhdGV3YXkgYWxsb3dzIGZvciBwZXJzaXN0aW5nIHRoZSBjbHVzdGVyIHN0YXRlIGJldHdlZW4gZnVsbCBjbHVzdGVyCisjIHJlc3RhcnRzLiBFdmVyeSBjaGFuZ2UgdG8gdGhlIHN0YXRlIChzdWNoIGFzIGFkZGluZyBhbiBpbmRleCkgd2lsbCBiZSBzdG9yZWQKKyMgaW4gdGhlIGdhdGV3YXksIGFuZCB3aGVuIHRoZSBjbHVzdGVyIHN0YXJ0cyB1cCBmb3IgdGhlIGZpcnN0IHRpbWUsCisjIGl0IHdpbGwgcmVhZCBpdHMgc3RhdGUgZnJvbSB0aGUgZ2F0ZXdheS4KKworIyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiBnYXRld2F5IGltcGxlbWVudGF0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy1nYXRld2F5Lmh0bWw+LgorCisjIFRoZSBkZWZhdWx0IGdhdGV3YXkgdHlwZSBpcyB0aGUgImxvY2FsIiBnYXRld2F5IChyZWNvbW1lbmRlZCk6CisjCisjIGdhdGV3YXkudHlwZTogbG9jYWwKKworIyBTZXR0aW5ncyBiZWxvdyBjb250cm9sIGhvdyBhbmQgd2hlbiB0byBzdGFydCB0aGUgaW5pdGlhbCByZWNvdmVyeSBwcm9jZXNzIG9uCisjIGEgZnVsbCBjbHVzdGVyIHJlc3RhcnQgKHRvIHJldXNlIGFzIG11Y2ggbG9jYWwgZGF0YSBhcyBwb3NzaWJsZSB3aGVuIHVzaW5nIHNoYXJlZAorIyBnYXRld2F5KS4KKworIyBBbGxvdyByZWNvdmVyeSBwcm9jZXNzIGFmdGVyIE4gbm9kZXMgaW4gYSBjbHVzdGVyIGFyZSB1cDoKKyMKK2dhdGV3YXkucmVjb3Zlcl9hZnRlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZW91dCB0byBpbml0aWF0ZSB0aGUgcmVjb3ZlcnkgcHJvY2Vzcywgb25jZSB0aGUgTiBub2RlcworIyBmcm9tIHByZXZpb3VzIHNldHRpbmcgYXJlIHVwIChhY2NlcHRzIHRpbWUgdmFsdWUpOgorIworIyBnYXRld2F5LnJlY292ZXJfYWZ0ZXJfdGltZTogNW0KKworIyBTZXQgaG93IG1hbnkgbm9kZXMgYXJlIGV4cGVjdGVkIGluIHRoaXMgY2x1c3Rlci4gT25jZSB0aGVzZSBOIG5vZGVzCisjIGFyZSB1cCAoYW5kIHJlY292ZXJfYWZ0ZXJfbm9kZXMgaXMgbWV0KSwgYmVnaW4gcmVjb3ZlcnkgcHJvY2VzcyBpbW1lZGlhdGVseQorIyAod2l0aG91dCB3YWl0aW5nIGZvciByZWNvdmVyX2FmdGVyX3RpbWUgdG8gZXhwaXJlKToKKyMKK2dhdGV3YXkuZXhwZWN0ZWRfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSZWNvdmVyeSBUaHJvdHRsaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlc2Ugc2V0dGluZ3MgYWxsb3cgdG8gY29udHJvbCB0aGUgcHJvY2VzcyBvZiBzaGFyZHMgYWxsb2NhdGlvbiBiZXR3ZWVuCisjIG5vZGVzIGR1cmluZyBpbml0aWFsIHJlY292ZXJ5LCByZXBsaWNhIGFsbG9jYXRpb24sIHJlYmFsYW5jaW5nLAorIyBvciB3aGVuIGFkZGluZyBhbmQgcmVtb3Zpbmcgbm9kZXMuCisKKyMgU2V0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCByZWNvdmVyaWVzIGhhcHBlbmluZyBvbiBhIG5vZGU6CisjCisjIDEuIER1cmluZyB0aGUgaW5pdGlhbCByZWNvdmVyeQorIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2luaXRpYWxfcHJpbWFyaWVzX3JlY292ZXJpZXM6IDQKKyMKKyMgMi4gRHVyaW5nIGFkZGluZy9yZW1vdmluZyBub2RlcywgcmViYWxhbmNpbmcsIGV0YworIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2NvbmN1cnJlbnRfcmVjb3ZlcmllczogMgorCisjIFNldCB0byB0aHJvdHRsZSB0aHJvdWdocHV0IHdoZW4gcmVjb3ZlcmluZyAoZWcuIDEwMG1iLCBieSBkZWZhdWx0IDIwbWIpOgorIworIyBpbmRpY2VzLnJlY292ZXJ5Lm1heF9ieXRlc19wZXJfc2VjOiAyMG1iCisKKyMgU2V0IHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3BlbiBjb25jdXJyZW50IHN0cmVhbXMgd2hlbgorIyByZWNvdmVyaW5nIGEgc2hhcmQgZnJvbSBhIHBlZXI6CisjCisjIGluZGljZXMucmVjb3ZlcnkuY29uY3VycmVudF9zdHJlYW1zOiA1CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEaXNjb3ZlcnkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpc2NvdmVyeSBpbmZyYXN0cnVjdHVyZSBlbnN1cmVzIG5vZGVzIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBjbHVzdGVyCisjIGFuZCBtYXN0ZXIgbm9kZSBpcyBlbGVjdGVkLiBNdWx0aWNhc3QgZGlzY292ZXJ5IGlzIHRoZSBkZWZhdWx0LgorCisjIFNldCB0byBlbnN1cmUgYSBub2RlIHNlZXMgTiBvdGhlciBtYXN0ZXIgZWxpZ2libGUgbm9kZXMgdG8gYmUgY29uc2lkZXJlZAorIyBvcGVyYXRpb25hbCB3aXRoaW4gdGhlIGNsdXN0ZXIuIEl0cyByZWNvbW1lbmRlZCB0byBzZXQgaXQgdG8gYSBoaWdoZXIgdmFsdWUKKyMgdGhhbiAxIHdoZW4gcnVubmluZyBtb3JlIHRoYW4gMiBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyMKKyMgZGlzY292ZXJ5Lnplbi5taW5pbXVtX21hc3Rlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZSB0byB3YWl0IGZvciBwaW5nIHJlc3BvbnNlcyBmcm9tIG90aGVyIG5vZGVzIHdoZW4gZGlzY292ZXJpbmcuCisjIFNldCB0aGlzIG9wdGlvbiB0byBhIGhpZ2hlciB2YWx1ZSBvbiBhIHNsb3cgb3IgY29uZ2VzdGVkIG5ldHdvcmsKKyMgdG8gbWluaW1pemUgZGlzY292ZXJ5IGZhaWx1cmVzOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcudGltZW91dDogM3MKKworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzLWRpc2NvdmVyeS16ZW4uaHRtbD4KKworIyBVbmljYXN0IGRpc2NvdmVyeSBhbGxvd3MgdG8gZXhwbGljaXRseSBjb250cm9sIHdoaWNoIG5vZGVzIHdpbGwgYmUgdXNlZAorIyB0byBkaXNjb3ZlciB0aGUgY2x1c3Rlci4gSXQgY2FuIGJlIHVzZWQgd2hlbiBtdWx0aWNhc3QgaXMgbm90IHByZXNlbnQsCisjIG9yIHRvIHJlc3RyaWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24td2lzZS4KKyMKKyMgMS4gRGlzYWJsZSBtdWx0aWNhc3QgZGlzY292ZXJ5IChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcubXVsdGljYXN0LmVuYWJsZWQ6IGZhbHNlCisjCisjIDIuIENvbmZpZ3VyZSBhbiBpbml0aWFsIGxpc3Qgb2YgbWFzdGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisjICAgIHRvIHBlcmZvcm0gZGlzY292ZXJ5IHdoZW4gbmV3IG5vZGVzIChtYXN0ZXIgb3IgZGF0YSkgYXJlIHN0YXJ0ZWQ6CisjCisjIGRpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0Lmhvc3RzOiBbImhvc3QxIiwgImhvc3QyOnBvcnQiXQorCisjIEVDMiBkaXNjb3ZlcnkgYWxsb3dzIHRvIHVzZSBBV1MgRUMyIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGRpc2NvdmVyeS4KKyMKKyMgWW91IGhhdmUgdG8gaW5zdGFsbCB0aGUgY2xvdWQtYXdzIHBsdWdpbiBmb3IgZW5hYmxpbmcgdGhlIEVDMiBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMtZGlzY292ZXJ5LWVjMi5odG1sPgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy90dXRvcmlhbHMvZWxhc3RpY3NlYXJjaC1vbi1lYzIvPgorIyBmb3IgYSBzdGVwLWJ5LXN0ZXAgdHV0b3JpYWwuCisKKyMgR0NFIGRpc2NvdmVyeSBhbGxvd3MgdG8gdXNlIEdvb2dsZSBDb21wdXRlIEVuZ2luZSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBkaXNjb3ZlcnkuCisjCisjIFlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGNsb3VkLWdjZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBHQ0UgZGlzY292ZXJ5LgorIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxodHRwczovL2dpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC9lbGFzdGljc2VhcmNoLWNsb3VkLWdjZT4uCisKKyMgQXp1cmUgZGlzY292ZXJ5IGFsbG93cyB0byB1c2UgQXp1cmUgQVBJIGluIG9yZGVyIHRvIHBlcmZvcm0gZGlzY292ZXJ5LgorIworIyBZb3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBjbG91ZC1henVyZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBBenVyZSBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9lbGFzdGljc2VhcmNoL2VsYXN0aWNzZWFyY2gtY2xvdWQtYXp1cmU+LgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNsb3cgTG9nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTaGFyZCBsZXZlbCBxdWVyeSBhbmQgZmV0Y2ggdGhyZXNob2xkIGxvZ2dpbmcuCisKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQucXVlcnkud2FybjogMTBzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmluZm86IDVzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmRlYnVnOiAycworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5xdWVyeS50cmFjZTogNTAwbXMKKworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC53YXJuOiAxcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5pbmZvOiA4MDBtcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5kZWJ1ZzogNTAwbXMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQuZmV0Y2gudHJhY2U6IDIwMG1zCisKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC53YXJuOiAxMHMKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC5pbmZvOiA1cworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LmRlYnVnOiAycworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LnRyYWNlOiA1MDBtcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdDIExvZ2dpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI21vbml0b3IuanZtLmdjLnlvdW5nLndhcm46IDEwMDBtcworI21vbml0b3IuanZtLmdjLnlvdW5nLmluZm86IDcwMG1zCisjbW9uaXRvci5qdm0uZ2MueW91bmcuZGVidWc6IDQwMG1zCisKKyNtb25pdG9yLmp2bS5nYy5vbGQud2FybjogMTBzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmluZm86IDVzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmRlYnVnOiAycworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvY2FwYWJpbGl0eS10eXBlcy9jYXBhYmlsaXR5VHlwZXMueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2NhcGFiaWxpdHktdHlwZXMvY2FwYWJpbGl0eVR5cGVzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ5ZjIwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2NhcGFiaWxpdHktdHlwZXMvY2FwYWJpbGl0eVR5cGVzLnltbApAQCAtMCwwICsxLDIwNCBAQAordG9zY2EuY2FwYWJpbGl0aWVzLlJvb3Q6IAorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIHJvb3QgQ2FwYWJpbGl0eSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIENhcGFiaWxpdHkgVHlwZXMgZGVyaXZlIGZyb20KK3Rvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290Cit0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAordG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIG51bV9jcHVzOiAKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMQorICAgIGNwdV9mcmVxdWVuY3k6CisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5mcmVxdWVuY3kKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gZ3JlYXRlcl9vcl9lcXVhbDogMC4xIEdIegorICAgIGRpc2tfc2l6ZTogCisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAgTUIKKyAgICBtZW1fc2l6ZTogCisgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAgTUIKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHByb3RvY29sOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZWZhdWx0OiB0Y3AKKyAgICBwb3J0OgorICAgICAgdHlwZTogUG9ydERlZgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgc2VjdXJlOgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICB1cmxfcGF0aDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHBvcnRfbmFtZTogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIG5ldHdvcmtfbmFtZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgICAgZGVmYXVsdDogUFJJVkFURQorICAgIGluaXRpYXRvcjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVmYXVsdDogc291cmNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgc291cmNlLCB0YXJnZXQsIHBlZXIgXQorICAgIHBvcnRzOgorICAgICAgdHlwZTogbWFwCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIG1pbl9sZW5ndGg6IDEKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogUG9ydFNwZWMKKyAgYXR0cmlidXRlczoKKyAgICBpcF9hZGRyZXNzOgorICAgICAgdHlwZTogc3RyaW5nCit0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5QdWJsaWM6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgIHByb3BlcnRpZXM6CisgICAgIyBDaGFuZ2UgdGhlIGRlZmF1bHQgbmV0d29ya19uYW1lIHRvIHVzZSB0aGUgZmlyc3QgcHVibGljIG5ldHdvcmsgZm91bmQKKyAgICBuZXR3b3JrX25hbWU6IFBVQkxJQworICAgIGZsb2F0aW5nOgorICAgICAgZGVzY3JpcHRpb246ID4gCisgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBwdWJsaWMgYWRkcmVzcyBzaG91bGQgYmUgYWxsb2NhdGVkIGZyb20gYSBwb29sIG9mIGZsb2F0aW5nIElQcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldHdvcmsuCisgICAgICB0eXBlOiBib29sZWFuCisgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgc3RhdHVzOiBleHBlcmltZW50YWwKKyAgICBkbnNfbmFtZToKKyAgICAgIGRlc2NyaXB0aW9uOiBUaGUgb3B0aW9uYWwgbmFtZSB0byByZWdpc3RlciB3aXRoIEROUyAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlICAgIAorICAgICAgc3RhdHVzOiBleHBlcmltZW50YWwKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgIyBDaGFuZ2UgRW5kcG9pbnQgc2VjdXJlIGluZGljYXRvciB0byB0cnVlIGZyb20gaXRzIGRlZmF1bHQgb2YgZmFsc2UKKyAgcHJvcGVydGllczoKKyAgICBzZWN1cmU6IHRydWUKK3Rvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5EYXRhYmFzZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQgCit0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisgIHByb3BlcnRpZXM6CisgICAgYXJjaGl0ZWN0dXJlOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UgCisgICAgdHlwZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgZGlzdHJpYnV0aW9uOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICB2ZXJzaW9uOgorICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCit0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBtaW5faW5zdGFuY2VzOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgZGVmYXVsdDogMQorICAgIG1heF9pbnN0YW5jZXM6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBkZWZhdWx0OiAxCisgICAgZGVmYXVsdF9pbnN0YW5jZXM6CisgICAgICB0eXBlOiBpbnRlZ2VyCit0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorCisKK3Rvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIuRG9ja2VyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgcHJvcGVydGllczoKKyAgICB2ZXJzaW9uOgorICAgICAgdHlwZTogbGlzdAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBlbnRyeV9zY2hlbWE6IHZlcnNpb24KKyAgICBwdWJsaXNoX2FsbDoKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBwdWJsaXNoX3BvcnRzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOiBQb3J0U3BlYworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgZXhwb3NlX3BvcnRzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOiBQb3J0U3BlYworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdm9sdW1lczoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKK3Rvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290Cit0b3NjYS5jYXBhYmlsaXRpZXMubmZ2Lk1ldHJpYzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKK29yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLk1ldHJpYzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMubmZ2Lk1ldHJpYworICBkZXNjcmlwdGlvbjogQSBub2RlIHR5cGUgdGhhdCBpbmNsdWRlcyB0aGUgTWV0cmljIGNhcGFiaWxpdHkgaW5kaWNhdGVzIHRoYXQgaXQgY2FuIGJlIG1vbml0b3JlZC4KKyAgcHJvcGVydGllczoKKyAgICB1bml0OgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogVW5pdCBvZiB0aGUgbWV0cmljIHZhbHVlCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICBkZXNjcmlwdGlvbjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IERlc2NyaXB0aW9uIG9mIHRoZSBtZXRyaWMKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICB0eXBlOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogVHlwZSBvZiB0aGUgbWV0cmljIHZhbHVlLCBmb3IgYW4gZXhhbXBsZSwgQ3VtdWxhdGl2ZSwgRGVsdGEsIEdhdWdlIGFuZCBldGMuCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICBjYXRlZ29yeToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IENhdGVnb3J5IG9mIHRoZSBtZXRyaWMsIGZvciBhbiBleGFtcGxlLCBjb21wdXRlLCBkaXNrLCBuZXR3b3JrLCBzdG9yYWdlIGFuZCBldGMuCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgIGF0dHJpYnV0ZXM6CisgICAgdmFsdWU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBSdW50aW1lIG1vbml0b3JlZCB2YWx1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm1ldHJpYy5DZWlsb21ldGVyOgorICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLk1ldHJpYworICBkZXNjcmlwdGlvbjogQSBub2RlIHR5cGUgdGhhdCBpbmNsdWRlcyB0aGUgTWV0cmljIGNhcGFiaWxpdHkgaW5kaWNhdGVzIHRoYXQgaXQgY2FuIGJlIG1vbml0b3JlZCB1c2luZyBjZWlsb21ldGVyLgorICBwcm9wZXJ0aWVzOgorICAgIG5hbWU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBDZWlsb21ldGVyIG1ldHJpYyB0eXBlIG5hbWUgdG8gbW9uaXRvci4gKFRoZSBuYW1lIGNlaWxvbWV0ZXIgaXMgdXNpbmcpCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm1ldHJpYy5Tbm1wUG9sbGluZzoKKyAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5NZXRyaWMKKyAgZGVzY3JpcHRpb246IEEgbm9kZSB0eXBlIHRoYXQgaW5jbHVkZXMgdGhlIE1ldHJpYyBjYXBhYmlsaXR5IGluZGljYXRlcyB0aGF0IGl0IGNhbiBiZSBtb25pdG9yZWQgdXNpbmcgc25tcCBwb2xsaW5nLgorICBwcm9wZXJ0aWVzOgorICAgIG9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IE9iamVjdCBJZCBvZiB0aGUgbWV0cmljCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuY2FwYWJpbGl0aWVzLm1ldHJpYy5Tbm1wVHJhcDoKKyAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLmNhcGFiaWxpdGllcy5NZXRyaWMKKyAgZGVzY3JpcHRpb246IEEgbm9kZSB0eXBlIHRoYXQgaW5jbHVkZXMgdGhlIE1ldHJpYyBjYXBhYmlsaXR5IGluZGljYXRlcyB0aGF0IGl0IGNhbiBiZSBtb25pdG9yZWQgdXNpbmcgc25tcCB0cmFwLgorICBwcm9wZXJ0aWVzOgorICAgIG9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IE9iamVjdCBJZCBvZiB0aGUgbWV0cmljCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9jYXBhYmlsaXR5LXR5cGVzL2NhcGFiaWxpdHlUeXBlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvY2FwYWJpbGl0eS10eXBlcy9jYXBhYmlsaXR5VHlwZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDNhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvY2FwYWJpbGl0eS10eXBlcy9jYXBhYmlsaXR5VHlwZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9jYXRlZ29yaWVzL2NhdGVnb3J5VHlwZXMueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2NhdGVnb3JpZXMvY2F0ZWdvcnlUeXBlcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkY2U0NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9jYXRlZ29yaWVzL2NhdGVnb3J5VHlwZXMueW1sCkBAIC0wLDAgKzEsMTE2IEBACitzZXJ2aWNlczoKKyAgICBNb2JpbGl0eToKKyAgICAgIG5hbWU6ICJNb2JpbGl0eSIKKyAgICAgIGljb25zOiBbJ21vYmlsaXR5J10KKyAgICBOZXR3b3JrX0wxXzM6CisgICAgICBuYW1lOiAiTmV0d29yayBMMS0zIgorICAgICAgaWNvbnM6IFsnbmV0d29ya19sXzEtMyddCisgICAgTmV0d29ya19MNDoKKyAgICAgIG5hbWU6ICJOZXR3b3JrIEw0KyIKKyAgICAgIGljb25zOiBbJ25ldHdvcmtfbF80J10KKyAgICBWb0lQX0NhbGxfQ29udHJvbDoKKyAgICAgIG5hbWU6ICJWb0lQIENhbGwgQ29udHJvbCIKKyAgICAgIGljb25zOiBbJ2NhbGxfY29udHJvbGwnXQorcmVzb3VyY2VzOgorICBOZXR3b3JrTGF5ZXIyMzoKKyAgICBuYW1lOiAiTmV0d29yayBMMi0zIgorICAgIHN1YmNhdGVnb3JpZXM6IAorICAgICAgUm91dGVyOgorICAgICAgICAgIG5hbWU6ICJSb3V0ZXIiCisgICAgICAgICAgaWNvbnM6IFsncm91dGVyJywndlJvdXRlciddCisgICAgICBHYXRld2F5OgorICAgICAgICAgIG5hbWU6ICJHYXRld2F5IgorICAgICAgICAgIGljb25zOiBbJ2dhdGV3YXknXQorICAgICAgV0FOX0Nvbm5lY3RvcnM6CisgICAgICAgICAgbmFtZTogIldBTiBDb25uZWN0b3JzIgorICAgICAgICAgIGljb25zOiBbJ25ldHdvcmsnLCdjb25uZWN0b3InLCdwb3J0J10KKyAgICAgIExBTl9Db25uZWN0b3JzOgorICAgICAgICAgIG5hbWU6ICJMQU4gQ29ubmVjdG9ycyIKKyAgICAgICAgICBpY29uczogWyduZXR3b3JrJywnY29ubmVjdG9yJywncG9ydCddCisgICAgICBJbmZyYXN0cnVjdHVyZToKKyAgICAgICAgICAgICAgICBuYW1lOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICAgICAgICAgICAgaWNvbnM6IFsndWNwZSddCisgIE5ldHdvcmtMYXllcjQ6CisgICAgbmFtZTogIk5ldHdvcmsgTDQrIgorICAgIHN1YmNhdGVnb3JpZXM6IAorICAgICAgQ29tbW9uX05ldHdvcmtfUmVzb3VyY2VzOgorICAgICAgICAgIG5hbWU6ICJDb21tb24gTmV0d29yayBSZXNvdXJjZXMiCisgICAgICAgICAgaWNvbnM6IFsnbmV0d29yayddCisgIEFwcGxpY2F0aW9uTGF5ZXI0OgorICAgIG5hbWU6ICJBcHBsaWNhdGlvbiBMNCsiCisgICAgc3ViY2F0ZWdvcmllczogCisgICAgICBCb3JkZXJfRWxlbWVudDoKKyAgICAgICAgICBuYW1lOiAiQm9yZGVyIEVsZW1lbnQiCisgICAgICAgICAgaWNvbnM6IFsnYm9yZGVyRWxlbWVudCddCisgICAgICBBcHBsaWNhdGlvbl9TZXJ2ZXI6CisgICAgICAgICAgbmFtZTogIkFwcGxpY2F0aW9uIFNlcnZlciIKKyAgICAgICAgICBpY29uczogWydhcHBsaWNhdGlvblNlcnZlciddCisgICAgICBXZWJfU2VydmVyOgorICAgICAgICAgIG5hbWU6ICJXZWIgU2VydmVyIgorICAgICAgICAgIGljb25zOiBbJ2FwcGxpY2F0aW9uU2VydmVyJ10KKyAgICAgIENhbGxfQ29udHJvbDoKKyAgICAgICAgICBuYW1lOiAiQ2FsbCBDb250cm9sIgorICAgICAgICAgIGljb25zOiBbJ2NhbGxfY29udHJvbGwnXQorICAgICAgTWVkaWFfU2VydmVyczoKKyAgICAgICAgICBuYW1lOiAiTWVkaWEgU2VydmVycyIKKyAgICAgICAgICBpY29uczogWydhcHBsaWNhdGlvblNlcnZlciddCisgICAgICBMb2FkX0JhbGFuY2VyOgorICAgICAgICAgIG5hbWU6ICJMb2FkIEJhbGFuY2VyIgorICAgICAgICAgIGljb25zOiBbJ2xvYWRCYWxhbmNlciddCisgICAgICBEYXRhYmFzZToKKyAgICAgICAgICBuYW1lOiAiRGF0YWJhc2UiCisgICAgICAgICAgaWNvbnM6IFsnZGF0YWJhc2UnXQorICAgICAgRmlyZXdhbGw6CisgICAgICAgICAgbmFtZTogIkZpcmV3YWxsIgorICAgICAgICAgIGljb25zOiBbJ2ZpcmV3YWxsJ10KKyAgR2VuZXJpYzoKKyAgICBuYW1lOiAiR2VuZXJpYyIKKyAgICBzdWJjYXRlZ29yaWVzOiAKKyAgICAgIEluZnJhc3RydWN0dXJlOgorICAgICAgICAgIG5hbWU6ICJJbmZyYXN0cnVjdHVyZSIKKyAgICAgICAgICBpY29uczogWydjb25uZWN0b3InXQorICAgICAgQWJzdHJhY3Q6CisgICAgICAgICAgbmFtZTogIkFic3RyYWN0IgorICAgICAgICAgIGljb25zOiBbJ29iamVjdFN0b3JhZ2UnLCAnY29tcHV0ZSddCisgICAgICBOZXR3b3JrX0VsZW1lbnRzOgorICAgICAgICAgIG5hbWU6ICJOZXR3b3JrIEVsZW1lbnRzIgorICAgICAgICAgIGljb25zOiBbJ25ldHdvcmsnLCAnY29ubmVjdG9yJ10KKyAgICAgIERhdGFiYXNlOgorICAgICAgICAgIG5hbWU6ICJEYXRhYmFzZSIKKyAgICAgICAgICBpY29uczogWydkYXRhYmFzZSddCisgICAgICBSdWxlczoKKyAgICAgICAgICBuYW1lOiAiUnVsZXMiCisgICAgICAgICAgaWNvbnM6IFsnbmV0d29ya3J1bGVzJywnc2VjdXJpdHlydWxlcyddCisgIE5ldHdvcmtDb25uZWN0aXZpdHk6CisgICAgbmFtZTogIk5ldHdvcmsgQ29ubmVjdGl2aXR5IgorICAgIHN1YmNhdGVnb3JpZXM6CisgICAgICBDb25uZWN0aW9uUG9pbnRzOgorICAgICAgICAgIG5hbWU6ICJDb25uZWN0aW9uIFBvaW50cyIKKyAgICAgICAgICBpY29uczogWydjcCddCisgICAgICBWaXJ0dWFsTGlua3M6CisgICAgICAgICAgbmFtZTogIlZpcnR1YWwgTGlua3MiCisgICAgICAgICAgaWNvbnM6IFsndmwnXQorICBEY2FlQ29tcG9uZW50OgorICAgIG5hbWU6ICJEQ0FFIENvbXBvbmVudCIKKyAgICBzdWJjYXRlZ29yaWVzOgorICAgICAgU291cmNlOgorICAgICAgICAgIG5hbWU6ICJTb3VyY2UiCisgICAgICAgICAgaWNvbnM6IFsnZGNhZV9zb3VyY2UnXQorICAgICAgQ29sbGVjdG9yOgorICAgICAgICAgIG5hbWU6ICJDb2xsZWN0b3IiCisgICAgICAgICAgaWNvbnM6IFsnZGNhZV9jb2xsZWN0b3InXQorICAgICAgVXRpbGl0eToKKyAgICAgICAgICBuYW1lOiAiVXRpbGl0eSIKKyAgICAgICAgICBpY29uczogWydkY2FlX3V0aWx0eSddCisgICAgICBNaWNyb3NlcnZpY2U6CisgICAgICAgICAgbmFtZTogIk1pY3Jvc2VydmljZSIKKyAgICAgICAgICBpY29uczogWydkY2FlX21pY3Jvc2VydmljZSddCisgICAgICBBbmFseXRpY3M6CisgICAgICAgICAgbmFtZTogIkFuYWx5dGljcyIKKyAgICAgICAgICBpY29uczogWydkY2FlX2FuYWx5dGljcyddCisgICAgICBEYXRhYmFzZToKKyAgICAgICAgICBuYW1lOiAiRGF0YWJhc2UiCisgICAgICAgICAgaWNvbnM6IFsnZGNhZV9kYXRhYmFzZSddCisgICAgICBQb2xpY3k6CisgICAgICAgICAgbmFtZTogIlBvbGljeSIKKyAgICAgICAgICBpY29uczogWydkY2FlX3BvbGljeSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2NhdGVnb3JpZXMvY2F0ZWdvcnlUeXBlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvY2F0ZWdvcmllcy9jYXRlZ29yeVR5cGVzLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDRhMmZhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2NhdGVnb3JpZXMvY2F0ZWdvcnlUeXBlcy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2RhdGEtdHlwZXMvZGF0YVR5cGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9kYXRhLXR5cGVzL2RhdGFUeXBlcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkYzNhMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9kYXRhLXR5cGVzL2RhdGFUeXBlcy55bWwKQEAgLTAsMCArMSw4MjEgQEAKK3Rvc2NhLmRhdGF0eXBlcy5Sb290OgorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIHJvb3QgRGF0YSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIERhdGEgVHlwZXMgZGVyaXZlIGZyb20KKworaW50ZWdlcjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCitzdHJpbmc6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKworYm9vbGVhbjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCitmbG9hdDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCitqc29uOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290ICAKKworbGlzdDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCittYXA6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKwordG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWw6IAorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIHByb3BlcnRpZXM6IAorICAgIHByb3RvY29sOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdG9rZW5fdHlwZTogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlZmF1bHQ6IHBhc3N3b3JkCisgICAgdG9rZW46IAorICAgICAgdHlwZTogc3RyaW5nCisgICAga2V5czoKKyAgICAgIHR5cGU6IG1hcAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHVzZXI6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorCit0b3NjYS5kYXRhdHlwZXMuVGltZUludGVydmFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIHN0YXJ0X3RpbWU6IAorICAgICAgdHlwZTogdGltZXN0YW1wCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgIGVuZF90aW1lOiAKKyAgICAgIHR5cGU6IHRpbWVzdGFtcAorICAgICAgcmVxdWlyZWQ6IHRydWUKKwordG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm86CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogIAorICAgIG5ldHdvcmtfbmFtZTogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICBuZXR3b3JrX2lkOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgIGFkZHJlc3NlczoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogc3RyaW5nCisKK3Rvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAgCisgICAgcG9ydF9uYW1lOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgIHBvcnRfaWQ6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgbmV0d29ya19pZDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICBtYWNfYWRkcmVzczogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICBhZGRyZXNzZXM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IHN0cmluZworCit0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0RGVmOgorICBkZXJpdmVkX2Zyb206IGludGVnZXIKKyAgY29uc3RyYWludHM6IAorICAgIC0gaW5fcmFuZ2U6IFsgMSwgNjU1MzUgXQorCit0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0U3BlYzogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogIAorICAgIHByb3RvY29sOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgIGRlZmF1bHQ6IHRjcAorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbIHVkcCwgdGNwLCBpZ21wIF0KKyAgICB0YXJnZXQ6ICAKKyAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnREZWYKKyAgICB0YXJnZXRfcmFuZ2U6CisgICAgICB0eXBlOiByYW5nZSAKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGluX3JhbmdlOiBbIDEsIDY1NTM1IF0KKyAgICBzb3VyY2U6CisgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0RGVmCisgICAgc291cmNlX3JhbmdlOgorICAgICAgdHlwZTogcmFuZ2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGluX3JhbmdlOiBbIDEsIDY1NTM1IF0KKworCisKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5BZGRyZXNzUGFpcjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBkZXNjcmlwdGlvbjogTUFDL0lQIGFkZHJlc3MgcGFpcnMKKyAgcHJvcGVydGllczoKKyAgICBtYWNfYWRkcmVzczoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IE1BQyBhZGRyZXNzCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgaXBfYWRkcmVzczoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IElQIGFkZHJlc3MKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5zdWJuZXQuSG9zdFJvdXRlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIGRlc2NyaXB0aW9uOiBIb3N0IHJvdXRlIGluZm8gZm9yIHRoZSBzdWJuZXQKKyAgcHJvcGVydGllczoKKyAgICBkZXN0aW5hdGlvbjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFRoZSBkZXN0aW5hdGlvbiBmb3Igc3RhdGljIHJvdXRlCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgbmV4dGhvcDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFRoZSBuZXh0IGhvcCBmb3IgdGhlIGRlc3RpbmF0aW9uCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5BbGxvY2F0aW9uUG9vbDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBkZXNjcmlwdGlvbjogVGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzc2VzIGZvciB0aGUgYWxsb2NhdGlvbiBwb29sCisgIHByb3BlcnRpZXM6CisgICAgc3RhcnQ6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBTdGFydCBhZGRyZXNzIGZvciB0aGUgYWxsb2NhdGlvbiBwb29sCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgZW5kOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogRW5kIGFkZHJlc3MgZm9yIHRoZSBhbGxvY2F0aW9uIHBvb2wKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKworb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLm5ldXRyb24uU3VibmV0OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIGRlc2NyaXB0aW9uOiBBIHN1Ym5ldCByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYmxvY2sgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYXNzaWduaW5nIElQIGFkZHJlc3NlcyB0byB2aXJ0dWFsIGluc3RhbmNlcworICBwcm9wZXJ0aWVzOgorICAgIHRlbmFudF9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFRoZSBJRCBvZiB0aGUgdGVuYW50IHdobyBvd25zIHRoZSBuZXR3b3JrCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgZW5hYmxlX2RoY3A6CisgICAgICB0eXBlOiBib29sZWFuCisgICAgICBkZXNjcmlwdGlvbjogU2V0IHRvIHRydWUgaWYgREhDUCBpcyBlbmFibGVkIGFuZCBmYWxzZSBpZiBESENQIGlzIGRpc2FibGVkCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgaXB2Nl9hZGRyZXNzX21vZGU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBJUHY2IGFkZHJlc3MgbW9kZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgY29uc3RyYWludHM6CisgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgLSBkaGNwdjYtc3RhdGVmdWwKKyAgICAgICAgLSBkaGNwdjYtc3RhdGVsZXNzCisgICAgICAgIC0gc2xhYWMKKyAgICBpcHY2X3JhX21vZGU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBJUHY2IFJBIChSb3V0ZXIgQWR2ZXJ0aXNlbWVudCkgbW9kZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgY29uc3RyYWludHM6CisgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgLSBkaGNwdjYtc3RhdGVmdWwKKyAgICAgICAgLSBkaGNwdjYtc3RhdGVsZXNzCisgICAgICAgIC0gc2xhYWMKKyAgICB2YWx1ZV9zcGVjczoKKyAgICAgIHR5cGU6IG1hcAorICAgICAgZGVzY3JpcHRpb246IEV4dHJhIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIH0KKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgIGFsbG9jYXRpb25fcG9vbHM6CisgICAgICAgdHlwZTogbGlzdAorICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgZm9yIHRoZSBhbGxvY2F0aW9uIHBvb2xzCisgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5ldHdvcmsuQWxsb2NhdGlvblBvb2wKKyAgICBzdWJuZXRwb29sOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb3IgSUQgb2YgdGhlIHN1Ym5ldCBwb29sCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgZG5zX25hbWVzZXJ2ZXJzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZGVzY3JpcHRpb246IEEgc3BlY2lmaWVkIHNldCBvZiBETlMgbmFtZSBzZXJ2ZXJzIHRvIGJlIHVzZWQKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZGVmYXVsdDogWworICAgICAgICBdCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICB0eXBlOiBzdHJpbmcgICAgIAorICAgIGhvc3Rfcm91dGVzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZGVzY3JpcHRpb246IFRoZSBnYXRld2F5IElQIGFkZHJlc3MKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLnN1Ym5ldC5Ib3N0Um91dGUKKyAgICBpcF92ZXJzaW9uOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgZGVzY3JpcHRpb246IFRoZSBnYXRld2F5IElQIGFkZHJlc3MKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZGVmYXVsdDogNAorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgIC0gJzQnCisgICAgICAgIC0gJzYnCisgICAgbmFtZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFRoZSBuYW1lIG9mIHRoZSBzdWJuZXQKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICBwcmVmaXhsZW46CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBkZXNjcmlwdGlvbjogUHJlZml4IGxlbmd0aCBmb3Igc3VibmV0IGFsbG9jYXRpb24gZnJvbSBzdWJuZXQgcG9vbAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgY29uc3RyYWludHM6CisgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAKKyAgICBjaWRyOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogVGhlIENJRFIKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICBnYXRld2F5X2lwOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogVGhlIGdhdGV3YXkgSVAgYWRkcmVzcworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorCitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5vdmFTZXJ2ZXIubmV0d29yay5Qb3J0RXh0cmFQcm9wZXJ0aWVzOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIGRlc2NyaXB0aW9uOiBOb3ZhIHNlcnZlciBuZXR3b3JrIGV4cGFuZCBwcm9wZXJ0aWVzIGZvciBwb3J0CisgIHByb3BlcnRpZXM6CisgICAgcG9ydF9zZWN1cml0eV9lbmFibGVkOgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVzY3JpcHRpb246IEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgcG9ydCBzZWN1cml0eSBvbiB0aGUgcG9ydAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgIG1hY19hZGRyZXNzOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogTUFDIGFkZHJlc3MgdG8gZ2l2ZSB0byB0aGlzIHBvcnQKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICBhZG1pbl9zdGF0ZV91cDoKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlc2NyaXB0aW9uOiBUaGUgYWRtaW5pc3RyYXRpdmUgc3RhdGUgb2YgdGhpcyBwb3J0CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgcW9zX3BvbGljeToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFRoZSBuYW1lIG9yIElEIG9mIFFvUyBwb2xpY3kgdG8gYXR0YWNoIHRvIHRoaXMgcG9ydAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgIGFsbG93ZWRfYWRkcmVzc19wYWlyczoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGRlc2NyaXB0aW9uOiBBZGRpdGlvbmFsIE1BQy9JUCBhZGRyZXNzIHBhaXJzIGFsbG93ZWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBwb3J0CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5BZGRyZXNzUGFpcgorICAgIGJpbmRpbmc6dm5pY190eXBlOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogVGhlIHZuaWMgdHlwZSB0byBiZSBib3VuZCBvbiB0aGUgbmV1dHJvbiBwb3J0CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBjb25zdHJhaW50czoKKyAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAtIG1hY3Z0YXAKKyAgICAgICAgLSBkaXJlY3QKKyAgICAgICAgLSBub3JtYWwKKyAgICB2YWx1ZV9zcGVjczoKKyAgICAgIHR5cGU6IG1hcAorICAgICAgZGVzY3JpcHRpb246IEV4dHJhIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIH0KKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IHN0cmluZworb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5ub3ZhU2VydmVyLm5ldHdvcmsuQWRkcmVzc0luZm86CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgZGVzY3JpcHRpb246IE5ldHdvcmsgYWRkcmVzc2VzIHdpdGggY29ycmVzcG9uZGluZyBwb3J0IGlkCisgIHByb3BlcnRpZXM6CisgICAgcG9ydF9pZDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFBvcnQgaWQKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV1dHJvbi5wb3J0LkZpeGVkSXBzOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIGRlc2NyaXB0aW9uOiBzdWJuZXQvaXBfYWRkcmVzcworICBwcm9wZXJ0aWVzOgorICAgIHN1Ym5ldDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFN1Ym5ldCBpbiB3aGljaCB0byBhbGxvY2F0ZSB0aGUgSVAgYWRkcmVzcyBmb3IgdGhpcyBwb3J0CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgaXBfYWRkcmVzczoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IElQIGFkZHJlc3MgZGVzaXJlZCBpbiB0aGUgc3VibmV0IGZvciB0aGlzIHBvcnQKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuRmlsZUluZm86CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgZGVzY3JpcHRpb246IEhlYXQgRmlsZSBJbmZvCisgIHByb3BlcnRpZXM6CisgICAgZmlsZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFRoZSByZXF1aXJlZCBVUkkgc3RyaW5nIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICBmaWxlX3R5cGU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBUaGUgdHlwZSBvZiB0aGUgZmlsZQorICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBjb25zdHJhaW50czoKKyAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAtIGJhc2UKKyAgICAgICAgLSBlbnYKKyAgICAgICAgLSB2b2x1bWUKKyAgICAgICAgLSBuZXR3b3JrCitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsLm5ldHdvcmsucnVsZS5Qb3J0UGFpcnM6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvcnQgcGFpcnMKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgc3RhcnRfcG9ydDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFydCBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgZW5kX3BvcnQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogRW5kIHBvcnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsLm5ldHdvcmsucnVsZS5SdWxlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogcG9saWN5IHJ1bGUKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgc3JjX3BvcnRzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBTb3VyY2UgcG9ydHMKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsLm5ldHdvcmsucnVsZS5Qb3J0UGFpcnMKKyAgICAgIHByb3RvY29sOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFByb3RvY29sCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgZHN0X2FkZHJlc3NlczoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogRGVzdGluYXRpb24gYWRkcmVzc2VzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbC5uZXR3b3JrLnJ1bGUuVmlydHVhbE5ldHdvcmsKKyAgICAgIGFwcGx5X3NlcnZpY2U6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogU2VydmljZSB0byBhcHBseQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGRzdF9wb3J0czoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogRGVzdGluYXRpb24gcG9ydHMKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsLm5ldHdvcmsucnVsZS5Qb3J0UGFpcnMKKyAgICAgIHNyY19hZGRyZXNzZXM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IFNvdXJjZSBhZGRyZXNzZXMKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsLm5ldHdvcmsucnVsZS5WaXJ0dWFsTmV0d29yaworICAgICAgZGlyZWN0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IERpcmVjdGlvbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWwubmV0d29yay5ydWxlLlJ1bGVMaXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogbGlzdCBvZiBwb2xpY3kgcnVsZXMKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWN5X3J1bGU6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IENvbnRyYWlsIG5ldHdvcmsgcnVsZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IGNvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsLm5ldHdvcmsucnVsZS5SdWxlCitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsLm5ldHdvcmsucnVsZS5WaXJ0dWFsTmV0d29yazoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzCisgICAgcHJvcGVydGllczoKKyAgICAgIHZpcnR1YWxfbmV0d29yazoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBWaXJ0dWFsIG5ldHdvcmsKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5uZXV0cm9uLlNlY3VyaXR5UnVsZXMuUnVsZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IFJ1bGVzIFBhaXJzCisgICAgcHJvcGVydGllczoKKyAgICAgIHJlbW90ZV9ncm91cF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcmVtb3RlIGdyb3VwIElEIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlY3VyaXR5IGdyb3VwIHJ1bGUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBwcm90b2NvbDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcHJvdG9jb2wgdGhhdCBpcyBtYXRjaGVkIGJ5IHRoZSBzZWN1cml0eSBncm91cCBydWxlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgLSB0Y3AKKyAgICAgICAgICAtIHVkcAorICAgICAgICAgIC0gaWNtcAorICAgICAgZXRoZXJ0eXBlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IEV0aGVydHlwZSBvZiB0aGUgdHJhZmZpYworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogSVB2NAorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgLSBJUHY0CisgICAgICAgICAgLSBJUHY2CisgICAgICBwb3J0X3JhbmdlX21heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBtYXhpbXVtIHBvcnQgbnVtYmVyIGluIHRoZSByYW5nZSB0aGF0IGlzIG1hdGNoZWQgYnkgdGhlCisgICAgICAgICAgc2VjdXJpdHkgZ3JvdXAgcnVsZS4gJworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gaW5fcmFuZ2U6CisgICAgICAgICAgLSAwCisgICAgICAgICAgLSA2NTUzNQorICAgICAgcmVtb3RlX2lwX3ByZWZpeDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcmVtb3RlIElQIHByZWZpeCAoQ0lEUikgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VjdXJpdHkgZ3JvdXAgcnVsZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHJlbW90ZV9tb2RlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFdoZXRoZXIgdG8gc3BlY2lmeSBhIHJlbW90ZSBncm91cCBvciBhIHJlbW90ZSBJUCBwcmVmaXgKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHJlbW90ZV9pcF9wcmVmaXgKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gcmVtb3RlX2lwX3ByZWZpeAorICAgICAgICAgIC0gcmVtb3RlX2dyb3VwX2lkCisgICAgICBkaXJlY3Rpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgc2VjdXJpdHkgZ3JvdXAgcnVsZSBpcyBhcHBsaWVkCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBpbmdyZXNzCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAtIGVncmVzcworICAgICAgICAgIC0gaW5ncmVzcworICAgICAgcG9ydF9yYW5nZV9taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBtaW5pbXVtIHBvcnQgbnVtYmVyIGluIHRoZSByYW5nZSB0aGF0IGlzIG1hdGNoZWQgYnkgdGhlIHNlY3VyaXR5IGdyb3VwIHJ1bGUuCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBpbl9yYW5nZToKKyAgICAgICAgICAtIDAKKyAgICAgICAgICAtIDY1NTM1Citvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LnN1YnN0aXR1dGlvbi5TdWJzdGl0dXRpb25GaWx0ZXJpbmc6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBTdWJzdGl0dXRpb24gRmlsdGVyCisgICAgcHJvcGVydGllczoKKyAgICAgIHN1YnN0aXR1dGVfc2VydmljZV90ZW1wbGF0ZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTdWJzdGl0dXRlIFNlcnZpY2UgVGVtcGxhdGUKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGluZGV4X3ZhbHVlOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbmRleCB2YWx1ZSBvZiB0aGUgc3Vic3RpdHV0aW9uIHNlcnZpY2UgdGVtcGxhdGUgcnVudGltZSBpbnN0YW5jZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogMAorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwCisgICAgICBjb3VudDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBDb3VudAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogMQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2NhbGluZ19lbmFibGVkOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbmRpY2F0ZXMgd2hldGhlciBzZXJ2aWNlIHNjYWxpbmcgaXMgZW5hYmxlZAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogdHJ1ZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbWFuZGF0b3J5OgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlc2NyaXB0aW9uOiBNYW5kYXRvcnkKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi52aXJ0dWFsLm5ldHdvcmsucnVsZS5SZWZEYXRhU2VxdWVuY2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBuZXR3b3JrIHBvbGljeSByZWZzIGRhdGEgc2VxdWVuY2UKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19wb2xpY3lfcmVmc19kYXRhX3NlcXVlbmNlX21ham9yOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIFBvbGljeSByZWYgZGF0YSBzZXF1ZW5jZSBNYWpvcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG5ldHdvcmtfcG9saWN5X3JlZnNfZGF0YV9zZXF1ZW5jZV9taW5vcjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogTmV0d29yayBQb2xpY3kgcmVmIGRhdGEgc2VxdWVuY2UgTWlub3IKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsVjIudmlydHVhbC5uZXR3b3JrLnJ1bGUuUmVmRGF0YToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IG5ldHdvcmsgcG9saWN5IHJlZnMgZGF0YQorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX3BvbGljeV9yZWZzX2RhdGFfc2VxdWVuY2U6CisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi52aXJ0dWFsLm5ldHdvcmsucnVsZS5SZWZEYXRhU2VxdWVuY2UKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgUG9saWN5IHJlZiBkYXRhIHNlcXVlbmNlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLnZpcnR1YWwubmV0d29yay5ydWxlLnJlZi5kYXRhLklwYW1TdWJuZXQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIElwYW0gUmVmIERhdGEgU3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaXBhbV9yZWZzX2RhdGFfaXBhbV9zdWJuZXRzX3N1Ym5ldF9pcF9wcmVmaXhfbGVuOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgaXBhbSByZWZzIGRhdGEgaXBhbSBzdWJuZXRzIGlwIHByZWZpeCBsZW4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBuZXR3b3JrX2lwYW1fcmVmc19kYXRhX2lwYW1fc3VibmV0c19zdWJuZXRfaXBfcHJlZml4OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgaXBhbSByZWZzIGRhdGEgaXBhbSBzdWJuZXRzIGlwIHByZWZpeAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi52aXJ0dWFsLm5ldHdvcmsucnVsZS5yZWYuZGF0YS5JcGFtU3VibmV0TGlzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgSXBhbSBSZWYgRGF0YSBTdWJuZXQgTGlzdAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lwYW1fcmVmc19kYXRhX2lwYW1fc3VibmV0c19zdWJuZXQ6CisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi52aXJ0dWFsLm5ldHdvcmsucnVsZS5yZWYuZGF0YS5JcGFtU3VibmV0CisgICAgICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIGlwYW0gcmVmcyBkYXRhIGlwYW0gc3VibmV0cworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG5ldHdvcmtfaXBhbV9yZWZzX2RhdGFfaXBhbV9zdWJuZXRzX2FkZHJfZnJvbV9zdGFydDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIGlwYW0gcmVmcyBkYXRhIGlwYW0gc3VibmV0cyBhZGRyIGZyb20gc3RhcnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsVjIudmlydHVhbC5uZXR3b3JrLnJ1bGUuSXBhbVJlZkRhdGE6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIElwYW0gUmVmIERhdGEKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pcGFtX3JlZnNfZGF0YV9pcGFtX3N1Ym5ldHM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgaXBhbSByZWZzIGRhdGEgaXBhbSBzdWJuZXRzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLnZpcnR1YWwubmV0d29yay5ydWxlLnJlZi5kYXRhLklwYW1TdWJuZXRMaXN0Citvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsVjIubmV0d29yay5ydWxlLlNyY1ZpcnR1YWxOZXR3b3JrOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogc291cmNlIGFkZHJlc3NlcworICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX3BvbGljeV9lbnRyaWVzX3BvbGljeV9ydWxlX3NyY19hZGRyZXNzZXNfdmlydHVhbF9uZXR3b3JrOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFNvdXJjZSBhZGRyZXNzZXMgVmlydHVhbCBuZXR3b3JrCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLm5ldHdvcmsucnVsZS5Ec3RWaXJ0dWFsTmV0d29yazoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IGRlc3RpbmF0aW9uIGFkZHJlc3NlcworICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX3BvbGljeV9lbnRyaWVzX3BvbGljeV9ydWxlX2RzdF9hZGRyZXNzZXNfdmlydHVhbF9uZXR3b3JrOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IERlc3RpbmF0aW9uIGFkZHJlc3NlcyBWaXJ0dWFsIG5ldHdvcmsKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsVjIubmV0d29yay5ydWxlLkRzdFBvcnRQYWlyczoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IGRlc3RpbmF0aW9uIHBvcnQgcGFpcnMKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19wb2xpY3lfZW50cmllc19wb2xpY3lfcnVsZV9kc3RfcG9ydHNfc3RhcnRfcG9ydDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFydCBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbmV0d29ya19wb2xpY3lfZW50cmllc19wb2xpY3lfcnVsZV9kc3RfcG9ydHNfZW5kX3BvcnQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogRW5kIHBvcnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsVjIubmV0d29yay5ydWxlLlNyY1BvcnRQYWlyczoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IHNvdXJjZSBwb3J0IHBhaXJzCisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfcG9saWN5X2VudHJpZXNfcG9saWN5X3J1bGVfc3JjX3BvcnRzX3N0YXJ0X3BvcnQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogU3RhcnQgcG9ydAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG5ldHdvcmtfcG9saWN5X2VudHJpZXNfcG9saWN5X3J1bGVfc3JjX3BvcnRzX2VuZF9wb3J0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IEVuZCBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLm5ldHdvcmsucnVsZS5BY3Rpb25MaXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogQWN0aW9uIExpc3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19wb2xpY3lfZW50cmllc19wb2xpY3lfcnVsZV9hY3Rpb25fbGlzdF9zaW1wbGVfYWN0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFNpbXBsZSBBY3Rpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBuZXR3b3JrX3BvbGljeV9lbnRyaWVzX3BvbGljeV9ydWxlX2FjdGlvbl9saXN0X2FwcGx5X3NlcnZpY2U6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IEFwcGx5IFNlcnZpY2UKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi5uZXR3b3JrLnJ1bGUuQWN0aW9uTGlzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IEFjdGlvbiBMaXN0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfcG9saWN5X2VudHJpZXNfcG9saWN5X3J1bGVfYWN0aW9uX2xpc3Rfc2ltcGxlX2FjdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTaW1wbGUgQWN0aW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbmV0d29ya19wb2xpY3lfZW50cmllc19wb2xpY3lfcnVsZV9hY3Rpb25fbGlzdF9hcHBseV9zZXJ2aWNlOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBBcHBseSBTZXJ2aWNlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsVjIubmV0d29yay5ydWxlLlJ1bGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBwb2xpY3kgcnVsZQorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX3BvbGljeV9lbnRyaWVzX3BvbGljeV9ydWxlX2RzdF9hZGRyZXNzZXM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IERlc3RpbmF0aW9uIGFkZHJlc3NlcworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi5uZXR3b3JrLnJ1bGUuRHN0VmlydHVhbE5ldHdvcmsKKyAgICAgIG5ldHdvcmtfcG9saWN5X2VudHJpZXNfcG9saWN5X3J1bGVfZHN0X3BvcnRzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBEZXN0aW5hdGlvbiBwb3J0cworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi5uZXR3b3JrLnJ1bGUuRHN0UG9ydFBhaXJzCisgICAgICBuZXR3b3JrX3BvbGljeV9lbnRyaWVzX3BvbGljeV9ydWxlX3Byb3RvY29sOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFByb3RvY29sCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbmV0d29ya19wb2xpY3lfZW50cmllc19wb2xpY3lfcnVsZV9zcmNfYWRkcmVzc2VzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBTb3VyY2UgYWRkcmVzc2VzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLm5ldHdvcmsucnVsZS5TcmNWaXJ0dWFsTmV0d29yaworICAgICAgbmV0d29ya19wb2xpY3lfZW50cmllc19wb2xpY3lfcnVsZV9kaXJlY3Rpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogRGlyZWN0aW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbmV0d29ya19wb2xpY3lfZW50cmllc19wb2xpY3lfcnVsZV9zcmNfcG9ydHM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IFNvdXJjZSBwb3J0cworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi5uZXR3b3JrLnJ1bGUuU3JjUG9ydFBhaXJzCisgICAgICBuZXR3b3JrX3BvbGljeV9lbnRyaWVzX3BvbGljeV9ydWxlX2FjdGlvbl9saXN0OgorICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LmNvbnRyYWlsVjIubmV0d29yay5ydWxlLkFjdGlvbkxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IEFjdGlvbiBsaXN0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLm5ldHdvcmsucnVsZS5SdWxlTGlzdDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IGxpc3Qgb2YgcG9saWN5IHJ1bGVzCisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfcG9saWN5X2VudHJpZXNfcG9saWN5X3J1bGU6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IENvbnRyYWlsIG5ldHdvcmsgcnVsZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi5uZXR3b3JrLnJ1bGUuUnVsZQorb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLnBvcnQuU3RhdGljUm91dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBzdGF0aWMgcm91dGUKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcHJlZml4OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFJvdXRlIHByZWZpeAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG5leHRfaG9wOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE5leHQgaG9wCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbmV4dF9ob3BfdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBOZXh0IGhvcCB0eXBlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLkFkZHJlc3NQYWlyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogQWRkcmVzcyBQYWlyCisgICAgcHJvcGVydGllczoKKyAgICAgIGFkZHJlc3NfbW9kZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBZGRyZXNzIG1vZGUgYWN0aXZlLWFjdGl2ZSBvciBhY3RpdmUtc3RhbmR5CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgLSBhY3RpdmUtYWN0aXZlCisgICAgICAgICAgLSBhY3RpdmUtc3RhbmRieQorICAgICAgcHJlZml4OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElQIGFkZHJlc3MgcHJlZml4CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbWFjX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogTWFjIGFkZHJlc3MKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECitvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5ldHdvcmsuY29udHJhaWwuSW50ZXJmYWNlRGF0YToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgICAgZGVzY3JpcHRpb246IEludGVyZmFjZSBEYXRhCisgICAgcHJvcGVydGllczoKKyAgICAgIHN0YXRpY19yb3V0ZXM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IEFuIG9yZGVyZWQgbGlzdCBvZiBzdGF0aWMgcm91dGVzIHRvIGJlIGFkZGVkIHRvIHRoaXMgaW50ZXJmYWNlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLnBvcnQuU3RhdGljUm91dGUKKyAgICAgIHZpcnR1YWxfbmV0d29yazoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBWaXJ0dWFsIE5ldHdvcmsgZm9yIHRoaXMgaW50ZXJmYWNlCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBhbGxvd2VkX2FkZHJlc3NfcGFpcnM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IExpc3Qgb2YgYWxsb3dlZCBhZGRyZXNzIHBhaXIgZm9yIHRoaXMgaW50ZXJmYWNlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLkFkZHJlc3NQYWlyCisgICAgICBpcF9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElQIGZvciB0aGlzIGludGVyZmFjZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK29yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi52aXJ0dWFsLm1hY2hpbmUuaW50ZXJmYWNlLlByb3BlcnRpZXM6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBWaXJ0dWFsIE1hY2hpbmUgSW50ZXJmYWNlIFByb3BlcnRpZXMuCisgICAgcHJvcGVydGllczoKKyAgICAgIHZpcnR1YWxfbWFjaGluZV9pbnRlcmZhY2VfcHJvcGVydGllc19zZXJ2aWNlX2ludGVyZmFjZV90eXBlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFNlcnZpY2UgSW50ZXJmYWNlIFR5cGUuCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9kYXRhLXR5cGVzL2RhdGFUeXBlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvZGF0YS10eXBlcy9kYXRhVHlwZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDlhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvZGF0YS10eXBlcy9kYXRhVHlwZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ncm91cC10eXBlcy9ncm91cFR5cGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ncm91cC10eXBlcy9ncm91cFR5cGVzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGYyY2JkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2dyb3VwLXR5cGVzL2dyb3VwVHlwZXMueW1sCkBAIC0wLDAgKzEsMzAgQEAKK29yZy5vcGVuZWNvbXAuZ3JvdXBzLmhlYXQuSGVhdFN0YWNrOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmdyb3Vwcy5Sb290CisgIGRlc2NyaXB0aW9uOiBHcm91cGVkIGFsbCBoZWF0IHJlc291cmNlcyB3aGljaCBhcmUgaW4gdGhlIHNhbWUgaGVhdCBzdGFjaworICBwcm9wZXJ0aWVzOgorICAgIGhlYXRfZmlsZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IEhlYXQgZmlsZSB3aGljaCBhc3NvY2lhdGUgdG8gdGhpcyBncm91cC9oZWF0IHN0YWNrCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICBkZXNjcmlwdGlvbjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IGdyb3VwIGRlc2NyaXB0aW9uCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgc3RhdHVzOiBTVVBQT1JURUQgICAgICAKK29yZy5vcGVuZWNvbXAuZ3JvdXBzLlZmTW9kdWxlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmdyb3Vwcy5Sb290CisgIGRlc2NyaXB0aW9uOiBHcm91cGVkIGFsbCBoZWF0IHJlc291cmNlcyB3aGljaCBhcmUgaW4gdGhlIHNhbWUgVkYgTW9kdWxlCisgIHByb3BlcnRpZXM6CisgICAgaXNCYXNlOgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVzY3JpcHRpb246IFdoZXRoZXIgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGRlcGxveWVkIGJlZm9yZSBvdGhlciBtb2R1bGVzCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECit0b3NjYS5ncm91cHMuUm9vdDoKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBHcm91cCBUeXBlIGFsbCBvdGhlciBUT1NDQSBHcm91cCBUeXBlcyBkZXJpdmUgZnJvbQorICBpbnRlcmZhY2VzOiAKKyAgICBTdGFuZGFyZDoKKyAgICAgIHR5cGU6IHRvc2NhLmludGVyZmFjZXMubm9kZS5saWZlY3ljbGUuU3RhbmRhcmQKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2dyb3VwLXR5cGVzL2dyb3VwVHlwZXMuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2dyb3VwLXR5cGVzL2dyb3VwVHlwZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODY1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvZ3JvdXAtdHlwZXMvZ3JvdXBUeXBlcy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvYWJzdHJhY3RTdWJzdGl0dXRlL2Fic3RyYWN0U3Vic3RpdHV0ZS5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvYWJzdHJhY3RTdWJzdGl0dXRlL2Fic3RyYWN0U3Vic3RpdHV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjk2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9hYnN0cmFjdFN1YnN0aXR1dGUvYWJzdHJhY3RTdWJzdGl0dXRlLmpzb24KQEAgLTAsMCArMSwyMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiYWJzdHJhY3RTdWJzdGl0dXRlLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiQWJzdHJhY3RTdWJzdGl0dXRlIiwKKyAgImRlc2NyaXB0aW9uIjogIkFic3RyYWN0IG5vZGUgdG8gYmUgZGVyaXZlZCBieSBuZXN0ZWQgZWxlbWVudHMuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAicmVzb3VyY2VUeXBlIjogIlZGQyIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFic3RyYWN0IgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIkFic3RyYWN0U3Vic3RpdHV0ZSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2Fic3RyYWN0U3Vic3RpdHV0ZS9hYnN0cmFjdFN1YnN0aXR1dGUueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvYWJzdHJhY3RTdWJzdGl0dXRlL2Fic3RyYWN0U3Vic3RpdHV0ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkYjJiNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2Fic3RyYWN0U3Vic3RpdHV0ZS9hYnN0cmFjdFN1YnN0aXR1dGUueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCittZXRhZGF0YToKKyAgdGVtcGxhdGVfbmFtZTogQWJzdHJhY3RTdWJzdGl0dXRlR2xvYmFsVHlwZXMKKyAgdGVtcGxhdGVfdmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBBYnN0cmFjdCBTdWJzdGl0dXRlIEdsb2JhbCBUeXBlcworaW1wb3J0czoKKyAgY29tbW9uX2RlZmluaXRpb25zOgorICAgIGZpbGU6IENvbW1vbkdsb2JhbFR5cGVzU2VydmljZVRlbXBsYXRlLnlhbWwKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuYWJzdHJhY3Qubm9kZXMuQWJzdHJhY3RTdWJzdGl0dXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBzZXJ2aWNlX3RlbXBsYXRlX2ZpbHRlcjoKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5zdWJzdGl0dXRpb24uU3Vic3RpdHV0aW9uRmlsdGVyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTdWJzdGl0dXRpb24gRmlsdGVyCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9hYnN0cmFjdFN1YnN0aXR1dGUvYWJzdHJhY3RTdWJzdGl0dXRlLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2Fic3RyYWN0U3Vic3RpdHV0ZS9hYnN0cmFjdFN1YnN0aXR1dGUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTQ5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9hYnN0cmFjdFN1YnN0aXR1dGUvYWJzdHJhY3RTdWJzdGl0dXRlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jaW5kZXJWb2x1bWUvY2luZGVyVm9sdW1lLmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jaW5kZXJWb2x1bWUvY2luZGVyVm9sdW1lLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5ZWUwZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NpbmRlclZvbHVtZS9jaW5kZXJWb2x1bWUuanNvbgpAQCAtMCwwICsxLDIwIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJjaW5kZXJWb2x1bWUueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJDaW5kZXJWb2x1bWUiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNlcnZlci1sb2NhbCBibG9jayBzdG9yYWdlIGRldmljZSB0aGF0IHByb3ZpZGVzIHBlcnNpc3RlbnQgc3RvcmFnZSB0byBndWVzdCB2aXJ0dWFsIG1hY2hpbmVzLiAiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJvYmplY3RTdG9yYWdlIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidGFncyI6IFsKKyAgICAiQ2luZGVyVm9sdW1lIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY2luZGVyVm9sdW1lL2NpbmRlclZvbHVtZS55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jaW5kZXJWb2x1bWUvY2luZGVyVm9sdW1lLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmIyMjdkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY2luZGVyVm9sdW1lL2NpbmRlclZvbHVtZS55bWwKQEAgLTAsMCArMSwxNzcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCittZXRhZGF0YToKKyAgdGVtcGxhdGVfbmFtZTogQ2luZGVyVm9sdW1lR2xvYmFsVHlwZXMKKyAgdGVtcGxhdGVfdmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBDaW5kZXIgVm9sdW1lIFRPU0NBIEdsb2JhbCBUeXBlcworcmVsYXRpb25zaGlwX3R5cGVzOgorICAgb3JnLm9wZW5lY29tcC5yZWxhdGlvbnNoaXBzLmNpbmRlci5Wb2x1bWVBdHRhY2hlc1RvOgorICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICBkZXNjcmlwdGlvbjogVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gYXR0YWNobWVudCByZWxhdGlvbnNoaXAgZm9yIGFzc29jaWF0aW5nIHZvbHVtZQorICAgICBwcm9wZXJ0aWVzOgorICAgICAgIHZvbHVtZV9pZDoKKyAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBJRCBvZiB0aGUgdm9sdW1lIHRvIGJlIGF0dGFjaGVkCisgICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICBsb2NhdGlvbjoKKyAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgdm9sdW1lIGlzIGV4cG9zZWQgb24gdGhlIGluc3RhbmNlLCBtb3VudHBvaW50CisgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgaW5zdGFuY2VfdXVpZDoKKyAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBJRCBvZiB0aGUgc2VydmVyIHRvIHdoaWNoIHRoZSB2b2x1bWUgYXR0YWNoZXMKKyAgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICBhdHRyaWJ1dGVzOgorICAgICAgIHNob3c6CisgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgIGRlc2NyaXB0aW9uOiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCByZXNvdXJjZQorICAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmZjLm5vZGVzLmhlYXQuY2luZGVyLlZvbHVtZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgIHByb3BlcnRpZXM6CisgICAgICBhdmFpbGFiaWxpdHlfem9uZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgYXZhaWxhYmlsaXR5IHpvbmUgaW4gd2hpY2ggdGhlIHZvbHVtZSB3aWxsIGJlIGNyZWF0ZWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBpbWFnZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJZiBzcGVjaWZpZWQsIHRoZSBuYW1lIG9yIElEIG9mIHRoZSBpbWFnZSB0byBjcmVhdGUgdGhlIHZvbHVtZSBmcm9tCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBkZXNjcmlwdGlvbjogS2V5L3ZhbHVlIHBhaXJzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB2b2x1bWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZvbHVtZV90eXBlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElmIHNwZWNpZmllZCwgdGhlIHR5cGUgb2Ygdm9sdW1lIHRvIHVzZSwgbWFwcGluZyB0byBhIHNwZWNpZmljIGJhY2tlbmQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBkZXNjcmlwdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB2b2x1bWUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBkZXZpY2VfdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBEZXZpY2UgdHlwZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gY2Ryb20KKyAgICAgICAgICAtIGRpc2sKKyAgICAgIGRpc2tfYnVzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246ICdCdXMgb2YgdGhlIGRldmljZTogaHlwZXJ2aXNvciBkcml2ZXIgY2hvb3NlcyBhIHN1aXRhYmxlIGRlZmF1bHQgaWYgb21pdHRlZCcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAtIGlkZQorICAgICAgICAgIC0gbGFtZV9idXMKKyAgICAgICAgICAtIHNjc2kKKyAgICAgICAgICAtIHVzYgorICAgICAgICAgIC0gdmlydGlvCisgICAgICBiYWNrdXBfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSWYgc3BlY2lmaWVkLCB0aGUgYmFja3VwIHRvIGNyZWF0ZSB0aGUgdm9sdW1lIGZyb20KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzb3VyY2Vfdm9saWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSWYgc3BlY2lmaWVkLCB0aGUgdm9sdW1lIHRvIHVzZSBhcyBzb3VyY2UKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBib290X2luZGV4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnRlZ2VyIHVzZWQgZm9yIG9yZGVyaW5nIHRoZSBib290IGRpc2tzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2l6ZToKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHJlcXVlc3RlZCBzdG9yYWdlIHNpemUgKGRlZmF1bHQgdW5pdCBpcyBNQikKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEgR0IKKyAgICAgIHJlYWRfb25seToKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZXNjcmlwdGlvbjogRW5hYmxlcyBvciBkaXNhYmxlcyByZWFkLW9ubHkgYWNjZXNzIG1vZGUgb2Ygdm9sdW1lCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBIG5hbWUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgdm9sdW1lCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2NoZWR1bGVyX2hpbnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IEFyYml0cmFyeSBrZXktdmFsdWUgcGFpcnMgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQgdG8gaGVscCB0aGUgQ2luZGVyIHNjaGVkdWxlciBjcmVhdGluZyBhIHZvbHVtZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc3dhcF9zaXplOgorICAgICAgICB0eXBlOiBzY2FsYXItdW5pdC5zaXplCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgc2l6ZSBvZiB0aGUgc3dhcCwgaW4gTUIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBkZWxldGVfb25fdGVybWluYXRpb246CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IEluZGljYXRlIHdoZXRoZXIgdGhlIHZvbHVtZSBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgdGVybWluYXRlZAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG11bHRpYXR0YWNoOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlc2NyaXB0aW9uOiBXaGV0aGVyIGFsbG93IHRoZSB2b2x1bWUgdG8gYmUgYXR0YWNoZWQgbW9yZSB0aGFuIG9uY2UKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgYXR0cmlidXRlczoKKyAgICAgIGRpc3BsYXlfZGVzY3JpcHRpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gb2YgdGhlIHZvbHVtZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYXR0YWNobWVudHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxpc3Qgb2YgYXR0YWNobWVudHMgb2YgdGhlIHZvbHVtZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBlbmNyeXB0ZWQ6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgdm9sdW1lIGlzIGVuY3J5cHRlZCBvciBub3QKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNob3c6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogRGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgcmVzb3VyY2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGNyZWF0ZWRfYXQ6CisgICAgICAgIHR5cGU6IHRpbWVzdGFtcAorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHRpbWVzdGFtcCBpbmRpY2F0aW5nIHZvbHVtZSBjcmVhdGlvbgorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgZGlzcGxheV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE5hbWUgb2YgdGhlIHZvbHVtZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbWV0YWRhdGFfdmFsdWVzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IEtleS92YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggdGhlIHZvbHVtZSBpbiByYXcgZGljdCBmb3JtCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGJvb3RhYmxlOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlc2NyaXB0aW9uOiBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHZvbHVtZSBjYW4gYmUgYm9vdGVkIG9yIG5vdAorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc3RhdHVzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdm9sdW1lCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jaW5kZXJWb2x1bWUvY2luZGVyVm9sdW1lLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NpbmRlclZvbHVtZS9jaW5kZXJWb2x1bWUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTA2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jaW5kZXJWb2x1bWUvY2luZGVyVm9sdW1lLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbEFic3RyYWN0U3Vic3RpdHV0ZS9jb250cmFpbEFic3RyYWN0U3Vic3RpdHV0ZS5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUvY29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQyNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUvY29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUuanNvbgpAQCAtMCwwICsxLDE3IEBACit7CisJInBheWxvYWROYW1lIjogImNvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlLnltbCIsCisJImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorCSJuYW1lIjogIkNvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlIiwKKwkiZGVzY3JpcHRpb24iOiAiQWJzdHJhY3Qgbm9kZSB0byBiZSBkZXJpdmVkIGJ5IGNvbnRyYWlsIG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIENvbnRyYWlsIFNlcnZpY2UgSW5zdGFuY2UiLAorCSJyZXNvdXJjZUljb25QYXRoIjogImRlZmF1bHRpY29uIiwKKwkicmVzb3VyY2VUeXBlIjogIlZGQyIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKyAgICAgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgICAgfQorICAgIF0KKwl9XSwKKwkidGFncyI6IFsiQ29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUiXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlL2NvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlL2NvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRlZTkzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUvY29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUueW1sCkBAIC0wLDAgKzEsMTM3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbWV0YWRhdGE6CisgIHRlbXBsYXRlX25hbWU6IENvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlR2xvYmFsVHlwZXMKKyAgdGVtcGxhdGVfdmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBDb250cmFpbCBBYnN0cmFjdCBTdWJzdGl0dXRlIEdsb2JhbCBUeXBlcworaW1wb3J0czoKKyAgY29tbW9uX2RlZmluaXRpb25zOgorICAgIGZpbGU6IENvbW1vbkdsb2JhbFR5cGVzU2VydmljZVRlbXBsYXRlLnlhbWwKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuYWJzdHJhY3Qubm9kZXMuY29udHJhaWwuQWJzdHJhY3RTdWJzdGl0dXRlOgorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5hYnN0cmFjdC5ub2Rlcy5BYnN0cmFjdFN1YnN0aXR1dGUKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogQXZhaWxhYmlsaXR5IHpvbmUgdG8gY3JlYXRlIHNlcnZlcnMgaW4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzdGF0aWNfcm91dGVzX2xpc3Q6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IFN0YXRpYyByb3V0ZXMgZW5hYmxlZAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGF2YWlsYWJpbGl0eV96b25lX2VuYWJsZToKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZXNjcmlwdGlvbjogSW5kaWNhdGVzIGF2YWlsYWJpbGl0eSB6b25lIGlzIGVuYWJsZWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzZXJ2aWNlX3RlbXBsYXRlX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogU2VydmljZSB0ZW1wbGF0ZSBuYW1lCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgb3JkZXJlZF9pbnRlcmZhY2VzOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbmRpY2F0ZXMgaWYgc2VydmljZSBpbnRlcmZhY2UgYXJlIG9yZGVyZWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBmbGF2b3I6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogZmxhdm9yCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgaW1hZ2VfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbWFnZSBuYW1lCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzZXJ2aWNlX3R5cGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogU2VydmljZSB0eXBlCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAtIGZpcmV3YWxsCisgICAgICAgICAgLSBhbmFseXplcgorICAgICAgICAgIC0gc291cmNlLW5hdAorICAgICAgICAgIC0gbG9hZGJhbGFuY2VyCisgICAgICBzZXJ2aWNlX2ludGVyZmFjZV90eXBlX2xpc3Q6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IExpc3Qgb2YgaW50ZXJmYWNlIHR5cGVzCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAgIC0gbWFuYWdlbWVudAorICAgICAgICAgICAgLSBsZWZ0CisgICAgICAgICAgICAtIHJpZ2h0CisgICAgICAgICAgICAtIG90aGVyCisgICAgICBzZXJ2aWNlX2luc3RhbmNlX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogU2VydmljZSBpbnN0YW5jZSBuYW1lCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBpbnRlcmZhY2VfbGlzdDoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogTGlzdCBvZiBpbnRlcmZhY2VzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLkludGVyZmFjZURhdGEKKyAgICAgIHNlcnZpY2VfbW9kZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTZXJ2aWNlIG1vZGUKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gdHJhbnNwYXJlbnQKKyAgICAgICAgICAtIGluLW5ldHdvcmsKKyAgICAgICAgICAtIGluLW5ldHdvcmstbmF0CisgICAgICBzaGFyZWRfaXBfbGlzdDoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogU2hhcmVkIGlwcyBlbmFibGVkCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgIGF0dHJpYnV0ZXM6CisgICAgICB0ZW5hbnRfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGVuYW50IGlkIG9mIHRoZSBTZXJ2aWNlIEluc3RhbmNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBmcV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBGUSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGluc3RhbmNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzZXJ2aWNlX3RlbXBsYXRlX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogU2VydmljZSBUZW1wbGF0ZSBvZiB0aGUgU2VydmljZSBJbnN0YW5jZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2hvdzoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBbGwgYXR0cmlidXRlcworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYWN0aXZlX3ZtczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBOdW1iZXIgb2Ygc2VydmljZSBWTXMgYWN0aXZlIGZvciB0aGlzIFNlcnZpY2UgSW5zdGFuY2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNlcnZpY2VfaW5zdGFuY2VfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBpbnN0YW5jZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgdmlydHVhbF9tYWNoaW5lczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTZXJ2aWNlIFZNcyBmb3IgdGhlIFNlcnZpY2UgSW5zdGFuY2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHN0YXR1czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTdGF0dXMgb2YgdGhlIHNlcnZpY2UgaW5zdGFuY2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbEFic3RyYWN0U3Vic3RpdHV0ZS9jb250cmFpbEFic3RyYWN0U3Vic3RpdHV0ZS56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbEFic3RyYWN0U3Vic3RpdHV0ZS9jb250cmFpbEFic3RyYWN0U3Vic3RpdHV0ZS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyMDk0YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlL2NvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbENvbXB1dGUvY29udHJhaWxDb21wdXRlLmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbENvbXB1dGUvY29udHJhaWxDb21wdXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0MTM2YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsQ29tcHV0ZS9jb250cmFpbENvbXB1dGUuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisJInBheWxvYWROYW1lIjogImNvbnRyYWlsQ29tcHV0ZS55bWwiLAorCSJjb250YWN0SWQiOiAiamgwMDAzIiwKKwkibmFtZSI6ICJDb250cmFpbENvbXB1dGUiLAorCSJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgdmlydHVhbCBtYWNoaW5lIGZvciBjb250cmFpbCBzZXJ2aWNlIHRlbXBsYXRlLiBUaGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIFZNIHRoYXQgbWF0Y2hlcyBjaGFyYWN0ZXJpc3RpY3MuIiwKKwkicmVzb3VyY2VJY29uUGF0aCI6ICJjb21wdXRlIiwKKwkicmVzb3VyY2VUeXBlIjogIlZGQyIsCisJImNhdGVnb3JpZXMiOiBbeworCQkibmFtZSI6ICJHZW5lcmljIiwKKwkJInN1YmNhdGVnb3JpZXMiOiBbeworCQkJIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisJCX1dCisJfV0sCisJInRhZ3MiOiBbIkNvbnRyYWlsQ29tcHV0ZSJdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxDb21wdXRlL2NvbnRyYWlsQ29tcHV0ZS55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbENvbXB1dGUvY29udHJhaWxDb21wdXRlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFkNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxDb21wdXRlL2NvbnRyYWlsQ29tcHV0ZS55bWwKQEAgLTAsMCArMSw4OSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK21ldGFkYXRhOgorICB0ZW1wbGF0ZV9uYW1lOiBDb250cmFpbENvbXB1dGVHbG9iYWxUeXBlcworICB0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IENvbnRyYWlsIENvbXB1dGUgVE9TQ0EgR2xvYmFsIFR5cGVzCitpbXBvcnRzOgorICBjb21tb25fZGVmaW5pdGlvbnM6CisgICAgZmlsZTogQ29tbW9uR2xvYmFsVHlwZXNTZXJ2aWNlVGVtcGxhdGUueWFtbAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMubm9kZXMuaGVhdC5jb250cmFpbC5Db21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgIHByb3BlcnRpZXM6CisgICAgICBmbGF2b3I6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogZmxhdm9yCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgaW1hZ2VfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbWFnZSBuYW1lCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBhdmFpbGFiaWxpdHlfem9uZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBdmFpbGFiaWxpdHkgem9uZSB0byBjcmVhdGUgc2VydmVycyBpbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNlcnZpY2VfdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTZXJ2aWNlIHR5cGUKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gZmlyZXdhbGwKKyAgICAgICAgICAtIGFuYWx5emVyCisgICAgICAgICAgLSBzb3VyY2UtbmF0CisgICAgICAgICAgLSBsb2FkYmFsYW5jZXIKKyAgICAgIGF2YWlsYWJpbGl0eV96b25lX2VuYWJsZToKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZXNjcmlwdGlvbjogSW5kaWNhdGVzIGF2YWlsYWJpbGl0eSB6b25lIGlzIGVuYWJsZWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzZXJ2aWNlX3RlbXBsYXRlX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogU2VydmljZSB0ZW1wbGF0ZSBuYW1lCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2VydmljZV9pbnN0YW5jZV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFNlcnZpY2UgaW5zdGFuY2UgbmFtZQorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2VydmljZV9tb2RlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFNlcnZpY2UgbW9kZQorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgLSB0cmFuc3BhcmVudAorICAgICAgICAgIC0gaW4tbmV0d29yaworICAgICAgICAgIC0gaW4tbmV0d29yay1uYXQKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgdGVuYW50X2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRlbmFudCBpZCBvZiB0aGUgVk0KKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGZxX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogZnFfbmFtZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2hvdzoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBbGwgYXR0cmlidXRlcworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYWN0aXZlX3ZtczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBOdW1iZXIgb2YgYWN0aXZlIFZNcworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgdmlydHVhbF9tYWNoaW5lczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBWTXMgb2YgdGhpcyBjb21wdXRlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzdGF0dXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogc3RhdHVzIG9mIHRoZSBjb21wdXRlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxDb21wdXRlL2NvbnRyYWlsQ29tcHV0ZS56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbENvbXB1dGUvY29udHJhaWxDb21wdXRlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWUzYzhhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxDb21wdXRlL2NvbnRyYWlsQ29tcHV0ZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxOZXR3b3JrUnVsZXMvY29udHJhaWxOZXR3b3JrUnVsZXMuanNvbiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5ODdiOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzLmpzb24KQEAgLTAsMCArMSwyMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAiY29udHJhaWxOZXR3b3JrUnVsZXMueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJDb250cmFpbE5ldHdvcmtSdWxlcyIsCisgICJkZXNjcmlwdGlvbiI6ICJDb25maWd1cmF0aW9uIG9mIHBvbGljeSBydWxlcyB0byBiZSBhcHBsaWVkIG92ZXIgdGhlIG5ldHdvcmsuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29ya3J1bGVzIiwKKyAgInJlc291cmNlVHlwZSI6ICJWRkMiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJSdWxlcyIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJDb250cmFpbE5ldHdvcmtSdWxlcyIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ2MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxOZXR3b3JrUnVsZXMvY29udHJhaWxOZXR3b3JrUnVsZXMueW1sCkBAIC0wLDAgKzEsNDkgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCittZXRhZGF0YToKKyAgdGVtcGxhdGVfbmFtZTogQ29udHJhaWxOZXR3b3JrUnVsZUdsb2JhbFR5cGUKKyAgdGVtcGxhdGVfdmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBDb250cmFpbCBOZXR3b3JrIFJ1bGUgR2xvYmFsIFR5cGVzCitpbXBvcnRzOgorICBjb21tb25fZGVmaW5pdGlvbnM6CisgICAgZmlsZTogQ29tbW9uR2xvYmFsVHlwZXNTZXJ2aWNlVGVtcGxhdGUueWFtbAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMucnVsZXMubm9kZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLk5ldHdvcmtSdWxlczoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgZW50cmllczoKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbC5uZXR3b3JrLnJ1bGUuUnVsZUxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IEEgc3ltYm9saWMgbmFtZSBmb3IgdGhpcyBjb250cmFpbCBuZXR3b3JrIHJ1bGUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBuYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IEEgc3ltYm9saWMgbmFtZSBmb3IgdGhpcyBjb250cmFpbCBuZXR3b3JrIHJ1bGUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgYXR0cmlidXRlczoKKyAgICAgIHRlbmFudF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiB0ZW5hbnRfaWQKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGZxX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogZnFfbmFtZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2hvdzoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBbGwgYXR0cmlidXRlcy4KKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHJ1bGVzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBMaXN0IG9mIHJ1bGVzCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICByZXF1aXJlbWVudHM6CisgICAgLSBuZXR3b3JrOgorICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5uZXR3b3JrLk5ldHdvcmsKKyAgICAgICAgcmVsYXRpb25zaGlwOiBvcmcub3BlbmVjb21wLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICBvY2N1cnJlbmNlczoKKyAgICAgICAgLSAwCisgICAgICAgIC0gVU5CT1VOREVECmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbE5ldHdvcmtSdWxlcy9jb250cmFpbE5ldHdvcmtSdWxlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbE5ldHdvcmtSdWxlcy9jb250cmFpbE5ldHdvcmtSdWxlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NzYxNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzL2NvbnRyYWlsTmV0d29ya1J1bGVzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFBvcnQvY29udHJhaWxQb3J0Lmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFBvcnQvY29udHJhaWxQb3J0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkYzcwOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsUG9ydC9jb250cmFpbFBvcnQuanNvbgpAQCAtMCwwICsxLDIxIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJjb250cmFpbFBvcnQueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJDb250cmFpbFBvcnQiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgYXNzb2NpYXRlcyBiZXR3ZWVuIENvbXB1dGUgYW5kIE5ldHdvcmsgbm9ybWF0aXZlIHR5cGVzIGZvciBjb250cmFpbC4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJwb3J0IiwKKyAgInJlc291cmNlVHlwZSI6ICJDUCIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIk5ldHdvcmsgRWxlbWVudHMiCisgICAgICB9CisgICAgXQorICB9CitdLCAgCisgInRhZ3MiOiBbCisgICAgIkNvbnRyYWlsUG9ydCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsUG9ydC9jb250cmFpbFBvcnQueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxQb3J0L2NvbnRyYWlsUG9ydC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlNDNhMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsUG9ydC9jb250cmFpbFBvcnQueW1sCkBAIC0wLDAgKzEsNjQgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCittZXRhZGF0YToKKyAgdGVtcGxhdGVfbmFtZTogQ29udHJhaWxQb3J0R2xvYmFsVHlwZXMKKyAgdGVtcGxhdGVfdmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBDb250cmFpbCBQb3J0IFRPU0NBIEdsb2JhbCBUeXBlcworaW1wb3J0czoKKyAgY29tbW9uX2RlZmluaXRpb25zOgorICAgIGZpbGU6IENvbW1vbkdsb2JhbFR5cGVzU2VydmljZVRlbXBsYXRlLnlhbWwKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3Aubm9kZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLlBvcnQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5uZXR3b3JrLlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgc3RhdGljX3JvdXRlczoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogQW4gb3JkZXJlZCBsaXN0IG9mIHN0YXRpYyByb3V0ZXMgdG8gYmUgYWRkZWQgdG8gdGhpcyBpbnRlcmZhY2UKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5ldHdvcmsuY29udHJhaWwucG9ydC5TdGF0aWNSb3V0ZQorICAgICAgdmlydHVhbF9uZXR3b3JrOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFZpcnR1YWwgTmV0d29yayBmb3IgdGhpcyBpbnRlcmZhY2UKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHN0YXRpY19yb3V0ZToKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZXNjcmlwdGlvbjogU3RhdGljIHJvdXRlIGVuYWJsZWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBhbGxvd2VkX2FkZHJlc3NfcGFpcnM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IExpc3Qgb2YgYWxsb3dlZCBhZGRyZXNzIHBhaXIgZm9yIHRoaXMgaW50ZXJmYWNlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLkFkZHJlc3NQYWlyCisgICAgICBzaGFyZWRfaXA6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IFNoYXJlZCBpcCBlbmFibGVkCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgaXBfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJUCBmb3IgdGhpcyBpbnRlcmZhY2UKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBpbnRlcmZhY2VfdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJbnRlcmZhY2UgdHlwZQorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgLSBtYW5hZ2VtZW50CisgICAgICAgICAgLSBsZWZ0CisgICAgICAgICAgLSByaWdodAorICAgICAgICAgIC0gb3RoZXIKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgZnFfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBmcV9uYW1lCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFBvcnQvY29udHJhaWxQb3J0LnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsUG9ydC9jb250cmFpbFBvcnQuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTVjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFBvcnQvY29udHJhaWxQb3J0LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyTmV0d29ya1J1bGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMuanNvbiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMvY29udHJhaWxWMk5ldHdvcmtSdWxlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzE3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyTmV0d29ya1J1bGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMuanNvbgpAQCAtMCwwICsxLDIxIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJjb250cmFpbFYyTmV0d29ya1J1bGVzLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiQ29udHJhaWxWMk5ldHdvcmtSdWxlcyIsCisgICJkZXNjcmlwdGlvbiI6ICJDb25maWd1cmF0aW9uIG9mIHBvbGljeSBydWxlcyB0byBiZSBhcHBsaWVkIG92ZXIgdGhlIG5ldHdvcmsgZm9yIGNvbnRyYWlsIFYyLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIm5ldHdvcmtydWxlcyIsCisgICJyZXNvdXJjZVR5cGUiOiAiVkZDIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiUnVsZXMiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidGFncyI6IFsKKyAgICAiQ29udHJhaWxWMk5ldHdvcmtSdWxlcyIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMvY29udHJhaWxWMk5ldHdvcmtSdWxlcy55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyTmV0d29ya1J1bGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzZkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyTmV0d29ya1J1bGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCittZXRhZGF0YToKKyAgdGVtcGxhdGVfbmFtZTogQ29udHJhaWxWMk5ldHdvcmtSdWxlR2xvYmFsVHlwZQorICB0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IENvbnRyYWlsIFYyIE5ldHdvcmsgUnVsZSBHbG9iYWwgVHlwZXMKK2ltcG9ydHM6CisgIGNvbW1vbl9kZWZpbml0aW9uczoKKyAgICBmaWxlOiBDb21tb25HbG9iYWxUeXBlc1NlcnZpY2VUZW1wbGF0ZS55YW1sCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy5ydWxlcy5ub2Rlcy5oZWF0Lm5ldHdvcmsuY29udHJhaWxWMi5OZXR3b3JrUnVsZXM6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogQSBzeW1ib2xpYyBuYW1lIGZvciB0aGlzIGNvbnRyYWlsIHYyIG5ldHdvcmsgcnVsZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG5ldHdvcmtfcG9saWN5X2VudHJpZXM6CisgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi5uZXR3b3JrLnJ1bGUuUnVsZUxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IEEgc3ltYm9saWMgbmFtZSBmb3IgdGhpcyBjb250cmFpbCB2MiBuZXR3b3JrIHJ1bGUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgYXR0cmlidXRlczoKKyAgICAgIGZxX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogZnFfbmFtZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgIHJlcXVpcmVtZW50czoKKyAgICAtIG5ldHdvcms6CisgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLm5ldHdvcmsuTmV0d29yaworICAgICAgICByZWxhdGlvbnNoaXA6IG9yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgIG9jY3VycmVuY2VzOgorICAgICAgICAtIDAKKyAgICAgICAgLSBVTkJPVU5ERUQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMvY29udHJhaWxWMk5ldHdvcmtSdWxlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyTmV0d29ya1J1bGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzk5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyTmV0d29ya1J1bGVzL2NvbnRyYWlsVjJOZXR3b3JrUnVsZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS9jb250cmFpbFYyVmlydHVhbE1hY2hpbmVJbnRlcmZhY2UuanNvbiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS9jb250cmFpbFYyVmlydHVhbE1hY2hpbmVJbnRlcmZhY2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdhNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxWMlZpcnR1YWxNYWNoaW5lSW50ZXJmYWNlL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS5qc29uCkBAIC0wLDAgKzEsMTUgQEAKK3sKKwkicGF5bG9hZE5hbWUiOiAiY29udHJhaWxWMlZpcnR1YWxNYWNoaW5lSW50ZXJmYWNlLnltbCIsCisJImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorCSJuYW1lIjogIkNvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZSIsCisJImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBuZXR3b3JrIGludGVyZmFjZS4gVGhlIGludGVyZmFjZXMgYXJlIGRlZmluZWQgd2l0aCBzcGVjaWZpYyBNQUMgYWRkcmVzc2VzIGFuZCBwb3J0cy4iLAorCSJyZXNvdXJjZUljb25QYXRoIjogIm5ldHdvcmsiLAorCSJyZXNvdXJjZVR5cGUiOiAiVkZDIiwKKwkiY2F0ZWdvcmllcyI6IFt7CisJCSJuYW1lIjogIkdlbmVyaWMiLAorCQkic3ViY2F0ZWdvcmllcyI6IFt7CisJCQkibmFtZSI6ICJOZXR3b3JrIEVsZW1lbnRzIgorCQl9XQorCX1dLAorCSJ0YWdzIjogWyJDb250cmFpbFYyVmlydHVhbE1hY2hpbmVJbnRlcmZhY2UiXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS9jb250cmFpbFYyVmlydHVhbE1hY2hpbmVJbnRlcmZhY2UueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxWMlZpcnR1YWxNYWNoaW5lSW50ZXJmYWNlL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzMjRjZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS9jb250cmFpbFYyVmlydHVhbE1hY2hpbmVJbnRlcmZhY2UueW1sCkBAIC0wLDAgKzEsNTkgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCittZXRhZGF0YToKKyAgdGVtcGxhdGVfbmFtZTogQ29udHJhaWxWMlZpcnR1YWxNYWNoaW5lSW50ZXJmYWNlR2xvYmFsVHlwZQorICB0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IENvbnRyYWlsIFZpcnR1YWwgTWFjaGluZSBJbnRlcmZhY2UgVE9TQ0EgR2xvYmFsIFR5cGVzCitpbXBvcnRzOgorICBjb21tb25fZGVmaW5pdGlvbnM6CisgICAgZmlsZTogQ29tbW9uR2xvYmFsVHlwZXNTZXJ2aWNlVGVtcGxhdGUueWFtbAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5ub2Rlcy5oZWF0LmNvbnRyYWlsVjIuVmlydHVhbE1hY2hpbmVJbnRlcmZhY2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5uZXR3b3JrLlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdmlydHVhbF9tYWNoaW5lX2ludGVmcmFjZV9tYWNfYWRkcmVzc2VzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBMaXN0IG9mIG1hYyBhZGRyZXNzZXMuCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFZpcnR1YWwgTWFjaGluZSBJbnRlcmZhY2UgbmFtZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNlY3VyaXR5X2dyb3VwX3JlZnM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IExpc3Qgb2Ygc2VjdXJpdHkgZ3JvdXBzLgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmlydHVhbF9uZXR3b3JrX3JlZnM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IExpc3Qgb2YgdmlydHVhbCBuZXR3b3Jrcy4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZpcnR1YWxfbWFjaGluZV9pbnRlcmZhY2VfcHJvcGVydGllczoKKyAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLnZpcnR1YWwubWFjaGluZS5pbnRlcmZhY2UuUHJvcGVydGllcworICAgICAgICBkZXNjcmlwdGlvbjogdmlydHVhbCBtYWNoaW5lIGludGVyZmFjZSBwcm9wZXJ0aWVzLgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHBvcnRfdHVwbGVfcmVmczoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogTGlzdCBvZiBwb3J0IHR1cGxlcy4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgZnFfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgRlEgbmFtZSBvZiB0aGUgVmlydHVhbCBOZXR3b3JrLgorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc2hvdzoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBbGwgYXR0cmlidXRlcy4KKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS9jb250cmFpbFYyVmlydHVhbE1hY2hpbmVJbnRlcmZhY2UuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxWMlZpcnR1YWxNYWNoaW5lSW50ZXJmYWNlL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0OGE2OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZS9jb250cmFpbFYyVmlydHVhbE1hY2hpbmVJbnRlcmZhY2UuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTmV0d29yay9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsuanNvbiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTmV0d29yay9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgwMmQyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxWMlZpcnR1YWxOZXR3b3JrL2NvbnRyYWlsVjJWaXJ0dWFsTmV0d29yay5qc29uCkBAIC0wLDAgKzEsMjEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImNvbnRyYWlsVjJWaXJ0dWFsTmV0d29yay55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIkNvbnRyYWlsVjJWaXJ0dWFsTmV0d29yayIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgbmV0d29yayBzZXJ2aWNlIHdpdGggb3B0aW9uYWwgc3VibmV0cyBhbmQgYWR2YW5jZWQgY29uZmlndXJhdGlvbnMgZm9yIGNvbnRyYWlsIFYyLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIm5ldHdvcmsiLAorICAicmVzb3VyY2VUeXBlIjogIlZMIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiTmV0d29yayBFbGVtZW50cyIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJDb250cmFpbFYyVmlydHVhbE5ldHdvcmsiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsvY29udHJhaWxWMlZpcnR1YWxOZXR3b3JrLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTmV0d29yay9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjE0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsvY29udHJhaWxWMlZpcnR1YWxOZXR3b3JrLnltbApAQCAtMCwwICsxLDc2IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbWV0YWRhdGE6CisgIHRlbXBsYXRlX25hbWU6IENvbnRyYWlsVjJWaXJ0dWFsTmV0d29ya0dsb2JhbFR5cGUKKyAgdGVtcGxhdGVfdmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBDb250cmFpbCBWMiBWaXJ0dWFsIE5ldHdvcmsgR2xvYmFsIFR5cGVzCitpbXBvcnRzOgorICBjb21tb25fZGVmaW5pdGlvbnM6CisgICAgZmlsZTogQ29tbW9uR2xvYmFsVHlwZXNTZXJ2aWNlVGVtcGxhdGUueWFtbAorbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5ub2Rlcy5oZWF0Lm5ldHdvcmsuY29udHJhaWxWMi5WaXJ0dWFsTmV0d29yazoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLm5ldHdvcmsuTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lwYW1fcmVmc19kYXRhOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBJUEFNIHJlZmVyZW5jZXMgRGF0YQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWxWMi52aXJ0dWFsLm5ldHdvcmsucnVsZS5JcGFtUmVmRGF0YQorICAgICAgbmV0d29ya19wb2xpY3lfcmVmc19kYXRhOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBQb2xpY3kgcmVmZXJlbmNlcyBkYXRhCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5jb250cmFpbFYyLnZpcnR1YWwubmV0d29yay5ydWxlLlJlZkRhdGEKKyAgICAgIG5ldHdvcmtfaXBhbV9yZWZzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBJUEFNIHJlZmVyZW5jZXMKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtfcG9saWN5X3JlZnM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IFBvbGljeSByZWZlcmVuY2VzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdWJuZXRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgcmVsYXRlZCBzdWJuZXRzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLm5ldXRyb24uU3VibmV0CisgICAgYXR0cmlidXRlczoKKyAgICAgIGZxX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogZnFfbmFtZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgc3VibmV0c19uYW1lOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBTdWJuZXRzIG5hbWUgb2YgdGhpcyBuZXR3b3JrCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN1Ym5ldHNfc2hvdzoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGRlc2NyaXB0aW9uOiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHN1Ym5ldAorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdWJuZXRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgcmVsYXRlZCBzdWJuZXRzCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5ldHdvcmsubmV1dHJvbi5TdWJuZXQKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhdHRhY2htZW50OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICBvY2N1cnJlbmNlczoKKyAgICAgICAgLSAxCisgICAgICAgIC0gVU5CT1VOREVECmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsvY29udHJhaWxWMlZpcnR1YWxOZXR3b3JrLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVjJWaXJ0dWFsTmV0d29yay9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2U3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFYyVmlydHVhbE5ldHdvcmsvY29udHJhaWxWMlZpcnR1YWxOZXR3b3JrLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFZpcnR1YWxOZXR3b3JrL2NvbnRyYWlsVmlydHVhbE5ldHdvcmsuanNvbiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVmlydHVhbE5ldHdvcmsvY29udHJhaWxWaXJ0dWFsTmV0d29yay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzMxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFZpcnR1YWxOZXR3b3JrL2NvbnRyYWlsVmlydHVhbE5ldHdvcmsuanNvbgpAQCAtMCwwICsxLDIxIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJjb250cmFpbFZpcnR1YWxOZXR3b3JrLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiQ29udHJhaWxWaXJ0dWFsTmV0d29yayIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgbmV0d29yayBzZXJ2aWNlIHdpdGggb3B0aW9uYWwgc3VibmV0cyBhbmQgYWR2YW5jZWQgY29uZmlndXJhdGlvbnMuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29yayIsCisgICJyZXNvdXJjZVR5cGUiOiAiVkwiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJOZXR3b3JrIEVsZW1lbnRzIgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIkNvbnRyYWlsVmlydHVhbE5ldHdvcmsiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFZpcnR1YWxOZXR3b3JrL2NvbnRyYWlsVmlydHVhbE5ldHdvcmsueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxWaXJ0dWFsTmV0d29yay9jb250cmFpbFZpcnR1YWxOZXR3b3JrLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQyNGMzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvY29udHJhaWxWaXJ0dWFsTmV0d29yay9jb250cmFpbFZpcnR1YWxOZXR3b3JrLnltbApAQCAtMCwwICsxLDg0IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbWV0YWRhdGE6CisgIHRlbXBsYXRlX25hbWU6IENvbnRyYWlsVmlydHVhbE5ldHdvcmtHbG9iYWxUeXBlCisgIHRlbXBsYXRlX3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQ29udHJhaWwgVmlydHVhbCBOZXR3b3JrIEdsb2JhbCBUeXBlcworaW1wb3J0czoKKyAgY29tbW9uX2RlZmluaXRpb25zOgorICAgIGZpbGU6IENvbW1vbkdsb2JhbFR5cGVzU2VydmljZVRlbXBsYXRlLnlhbWwKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2Uudmwubm9kZXMuaGVhdC5uZXR3b3JrLmNvbnRyYWlsLlZpcnR1YWxOZXR3b3JrOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMubmV0d29yay5OZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIHNoYXJlZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBJcyB2aXJ0dWFsIG5ldHdvcmsgc2hhcmVkCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgZm9yd2FyZGluZ19tb2RlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IGZvcndhcmRpbmcgbW9kZSBvZiB0aGUgdmlydHVhbCBuZXR3b3JrCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgZXh0ZXJuYWw6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSXMgdmlydHVhbCBuZXR3b3JrIGV4dGVybmFsCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYWxsb3dfdHJhbnNpdDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBXaGV0aGVyIHRoaXMgbmV0d29yayBzaG91bGQgYmUgdHJhbnNpdGl2ZS4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBmbG9vZF91bmtub3duX3VuaWNhc3Q6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogZmxvb2QgTDIgcGFja2V0cyBvbiBuZXR3b3JrCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgcm91dGVfdGFyZ2V0czoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogcm91dGUgdGFyZ2V0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpcnR1YWwgbmV0d29yaworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc3VibmV0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIHJlbGF0ZWQgc3VibmV0cworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5uZXV0cm9uLlN1Ym5ldAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBmcV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IGZxX25hbWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNob3c6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogQWxsIGF0dHJpYnV0ZXMuCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzdWJuZXRzX25hbWU6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IFN1Ym5ldHMgbmFtZSBvZiB0aGlzIG5ldHdvcmsKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc3VibmV0c19zaG93OgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IERldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc3VibmV0CisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHN1Ym5ldHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBkZXNjcmlwdGlvbjogTmV0d29yayByZWxhdGVkIHN1Ym5ldHMKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5uZXV0cm9uLlN1Ym5ldAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgIG9jY3VycmVuY2VzOgorICAgICAgICAtIDEKKyAgICAgICAgLSBVTkJPVU5ERUQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2NvbnRyYWlsVmlydHVhbE5ldHdvcmsvY29udHJhaWxWaXJ0dWFsTmV0d29yay56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFZpcnR1YWxOZXR3b3JrL2NvbnRyYWlsVmlydHVhbE5ldHdvcmsuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjMyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9jb250cmFpbFZpcnR1YWxOZXR3b3JrL2NvbnRyYWlsVmlydHVhbE5ldHdvcmsuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2VsaW5lL2VsaW5lLmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9lbGluZS9lbGluZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjBlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9lbGluZS9lbGluZS5qc29uCkBAIC0wLDAgKzEsMjEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImVsaW5lLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiVkwgRUxJTkUiLAorICAiZGVzY3JpcHRpb24iOiAiVGhlwqBub2RlIHJlcHJlc2VudHMgYW4gRS1MaW5lIHZpcnR1YWwgbGluayBlbnRpdHkuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAibmV0d29yayIsCisgICJyZXNvdXJjZVR5cGUiOiAiVkwiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIk5ldHdvcmsgQ29ubmVjdGl2aXR5IiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiVmlydHVhbCBMaW5rcyIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJWTCBFTElORSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2VsaW5lL2VsaW5lLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2VsaW5lL2VsaW5lLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI0MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvZWxpbmUvZWxpbmUueW1sCkBAIC0wLDAgKzEsOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5FTGluZToKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuVkwKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICB2aXJ0dWFsX2xpbmthYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQorICAgICAgICBvY2N1cnJlbmNlczogWzAsMl0KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2VsaW5lL2VsaW5lLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL2VsaW5lL2VsaW5lLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzJjNWVlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvZWxpbmUvZWxpbmUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25OZXQvbmV1dHJvbk5ldC5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvbmV1dHJvbk5ldC9uZXV0cm9uTmV0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczZTkzNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25OZXQvbmV1dHJvbk5ldC5qc29uCkBAIC0wLDAgKzEsMjEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5ldXRyb25OZXQueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJOZXV0cm9uTmV0IiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBuZXR3b3JrIHNlcnZpY2Ugd2l0aCBvcHRpb25hbCBzdWJuZXRzIGFuZCBhZHZhbmNlZCBjb25maWd1cmF0aW9ucy4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJuZXR3b3JrIiwKKyAgInJlc291cmNlVHlwZSI6ICJWTCIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIk5ldHdvcmsgRWxlbWVudHMiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidGFncyI6IFsKKyAgICAiTmV1dHJvbk5ldCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25OZXQvbmV1dHJvbk5ldC55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uTmV0L25ldXRyb25OZXQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGUyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uTmV0L25ldXRyb25OZXQueW1sCkBAIC0wLDAgKzEsOTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCittZXRhZGF0YToKKyAgdGVtcGxhdGVfbmFtZTogTmV1dHJvbk5ldEdsb2JhbFR5cGVzCisgIHRlbXBsYXRlX3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogTmV1dHJvbiBOZXR3b3JrIFRPU0NBIEdsb2JhbCBUeXBlcworaW1wb3J0czoKKyAgY29tbW9uX2RlZmluaXRpb25zOgorICAgIGZpbGU6IENvbW1vbkdsb2JhbFR5cGVzU2VydmljZVRlbXBsYXRlLnlhbWwKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2Uudmwubm9kZXMuaGVhdC5uZXR3b3JrLm5ldXRyb24uTmV0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMubmV0d29yay5OZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIGRoY3BfYWdlbnRfaWRzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgSURzIG9mIHRoZSBESENQIGFnZW50IHRvIHNjaGVkdWxlIHRoZSBuZXR3b3JrCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB0ZW5hbnRfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIElEIG9mIHRoZSB0ZW5hbnQgd2hpY2ggd2lsbCBvd24gdGhlIG5ldHdvcmsKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBwb3J0X3NlY3VyaXR5X2VuYWJsZWQ6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgcG9ydCBzZWN1cml0eSBvbiB0aGUgbmV0d29yaworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNoYXJlZDoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZXNjcmlwdGlvbjogV2hldGhlciB0aGlzIG5ldHdvcmsgc2hvdWxkIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIHRlbmFudHMKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBhZG1pbl9zdGF0ZV91cDoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZXNjcmlwdGlvbjogQSBib29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGFkbWluaXN0cmF0aXZlIHN0YXR1cyBvZiB0aGUgbmV0d29yaworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogdHJ1ZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgcW9zX3BvbGljeToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgbmFtZSBvciBJRCBvZiBRb1MgcG9saWN5IHRvIGF0dGFjaCB0byB0aGlzIG5ldHdvcmsKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzdWJuZXRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgcmVsYXRlZCBzdWJuZXRzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLm5ldXRyb24uU3VibmV0CisgICAgICB2YWx1ZV9zcGVjczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGRlc2NyaXB0aW9uOiBFeHRyYSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICB9CisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcW9zX3BvbGljeV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgUW9TIHBvbGljeSBJRCBhdHRhY2hlZCB0byB0aGlzIG5ldHdvcmsKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNob3c6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogRGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgcmVzb3VyY2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHN1Ym5ldHNfbmFtZToKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogU3VibmV0cyBuYW1lIG9mIHRoaXMgbmV0d29yaworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdWJuZXRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgcmVsYXRlZCBzdWJuZXRzCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5ldHdvcmsubmV1dHJvbi5TdWJuZXQKKyAgICAgIG10dToKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXQgc2l6ZShpbiBieXRlcykgZm9yIHRoZSBuZXR3b3JrCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzdGF0dXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHN0YXR1cyBvZiB0aGUgbmV0d29yaworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgIG9jY3VycmVuY2VzOgorICAgICAgICAtIDEKKyAgICAgICAgLSBVTkJPVU5ERUQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25OZXQvbmV1dHJvbk5ldC56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uTmV0L25ldXRyb25OZXQuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWZlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uTmV0L25ldXRyb25OZXQuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25Qb3J0L25ldXRyb25Qb3J0Lmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uUG9ydC9uZXV0cm9uUG9ydC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzgyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uUG9ydC9uZXV0cm9uUG9ydC5qc29uCkBAIC0wLDAgKzEsMjEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5ldXRyb25Qb3J0LnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiTmV1dHJvblBvcnQiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgYXNzb2NpYXRlcyBiZXR3ZWVuIENvbXB1dGUgYW5kIE5ldHdvcmsgbm9ybWF0aXZlIHR5cGVzLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogInBvcnQiLAorICAicmVzb3VyY2VUeXBlIjogIkNQIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiTmV0d29yayBFbGVtZW50cyIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sICAKKyAidGFncyI6IFsKKyAgICAiTmV1dHJvblBvcnQiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uUG9ydC9uZXV0cm9uUG9ydC55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9uZXV0cm9uUG9ydC9uZXV0cm9uUG9ydC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4NjE1YwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25Qb3J0L25ldXRyb25Qb3J0LnltbApAQCAtMCwwICsxLDEzNiBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK21ldGFkYXRhOgorICB0ZW1wbGF0ZV9uYW1lOiBOZXV0cm9uUG9ydEdsb2JhbFR5cGVzCisgIHRlbXBsYXRlX3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogTmV1dHJvbiBQb3J0IFRPU0NBIEdsb2JhbCBUeXBlcworaW1wb3J0czoKKyAgY29tbW9uX2RlZmluaXRpb25zOgorICAgIGZpbGU6IENvbW1vbkdsb2JhbFR5cGVzU2VydmljZVRlbXBsYXRlLnlhbWwKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3Aubm9kZXMuaGVhdC5uZXR3b3JrLm5ldXRyb24uUG9ydDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLm5ldHdvcmsuUG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb3J0X3NlY3VyaXR5X2VuYWJsZWQ6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgcG9ydCBzZWN1cml0eSBvbiB0aGUgbmV0d29yaworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGRldmljZV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBEZXZpY2UgSUQgb2YgdGhpcyBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgcW9zX3BvbGljeToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgbmFtZSBvciBJRCBvZiBRb1MgcG9saWN5IHRvIGF0dGFjaCB0byB0aGlzIG5ldHdvcmsKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBhbGxvd2VkX2FkZHJlc3NfcGFpcnM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IEFkZGl0aW9uYWwgTUFDL0lQIGFkZHJlc3MgcGFpcnMgYWxsb3dlZCB0byBwYXNzIHRocm91Z2ggdGhlIHBvcnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5ldHdvcmsuQWRkcmVzc1BhaXIKKyAgICAgIGJpbmRpbmc6dm5pY190eXBlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSB2bmljIHR5cGUgdG8gYmUgYm91bmQgb24gdGhlIG5ldXRyb24gcG9ydAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gbWFjdnRhcAorICAgICAgICAgIC0gZGlyZWN0CisgICAgICAgICAgLSBub3JtYWwKKyAgICAgIHZhbHVlX3NwZWNzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IEV4dHJhIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgIH0KKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGV2aWNlX293bmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE5hbWUgb2YgdGhlIG5ldHdvcmsgb3duaW5nIHRoZSBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgbmV0d29yazoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIHRoaXMgcG9ydCBiZWxvbmdzIHRvCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgcmVwbGFjZW1lbnRfcG9saWN5OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFBvbGljeSBvbiBob3cgdG8gcmVzcG9uZCB0byBhIHN0YWNrLXVwZGF0ZSBmb3IgdGhpcyByZXNvdXJjZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogQVVUTworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgLSBSRVBMQUNFX0FMV0FZUworICAgICAgICAgIC0gQVVUTworICAgICAgc2VjdXJpdHlfZ3JvdXBzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBMaXN0IG9mIHNlY3VyaXR5IGdyb3VwIG5hbWVzIG9yIElEcworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgZml4ZWRfaXBzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBEZXNpcmVkIElQcyBmb3IgdGhpcyBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXV0cm9uLnBvcnQuRml4ZWRJcHMKKyAgICAgIG1hY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE1BQyBhZGRyZXNzIHRvIGdpdmUgdG8gdGhpcyBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYWRtaW5fc3RhdGVfdXA6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IEEgYm9vbGVhbiB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBhZG1pbmlzdHJhdGl2ZSBzdGF0dXMgb2YgdGhlIG5ldHdvcmsKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogQSBzeW1ib2xpYyBuYW1lIGZvciB0aGlzIHBvcnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgYXR0cmlidXRlczoKKyAgICAgIHRlbmFudF9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUZW5hbnQgb3duaW5nIHRoZSBwb3J0CisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBuZXR3b3JrX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbmV0d29yayBvd25pbmcgdGhlIHBvcnQKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHFvc19wb2xpY3lfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIFFvUyBwb2xpY3kgSUQgYXR0YWNoZWQgdG8gdGhpcyBuZXR3b3JrCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzaG93OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IERldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHJlc291cmNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzdWJuZXRzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBTdWJuZXRzIG9mIHRoaXMgbmV0d29yaworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdGF0dXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHN0YXR1cyBvZiB0aGUgbmV0d29yaworICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGF0dGFjaG1lbnQ6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgIG9jY3VycmVuY2VzOgorICAgICAgICAtIDEKKyAgICAgICAgLSBVTkJPVU5ERUQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25Qb3J0L25ldXRyb25Qb3J0LnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25ldXRyb25Qb3J0L25ldXRyb25Qb3J0LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTIwYWZiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvbmV1dHJvblBvcnQvbmV1dHJvblBvcnQuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25vdmFTZXJ2ZXIvbm92YVNlcnZlci5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvbm92YVNlcnZlci9ub3ZhU2VydmVyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MTA2YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25vdmFTZXJ2ZXIvbm92YVNlcnZlci5qc29uCkBAIC0wLDAgKzEsMjQgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIm5vdmFTZXJ2ZXIueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJOb3ZhU2VydmVyIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSByZWFsIG9yIHZpcnR1YWwgbWFjaGluZSBvciBzZXJ2ZXIuIEluZm9ybWF0aW9uIHNwZWNpZmllZCBvbiB0aGUgQ29tcHV0ZQorICAgICAgbm9kZSB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgbWFjaGluZSB0aGF0IGZpdHMgdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBpbiB0aGUgY2xvdWQKKyAgICAgIGF2YWlsYWJsZSBtYWNoaW5lcy4gSWYgbm8gc2l6aW5nIGluZm9ybWF0aW9uIGFyZSBzcGVjaWZpZWQgdGhlIGNsb3VkIHByb3ZpZGVyIGRlZmF1bHQKKyAgICAgIG1hY2hpbmUgd2lsbCBiZSB1c2VkLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzcGVjaWZ5IHRoZSByZXF1aXJlZCAgQ1BVcyBhbmQgbWVtb3J5CisgICAgICBhdCBsZWFzdC4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIk5vdmFTZXJ2ZXIiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9ub3ZhU2VydmVyL25vdmFTZXJ2ZXIueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvbm92YVNlcnZlci9ub3ZhU2VydmVyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWM3OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvbm92YVNlcnZlci9ub3ZhU2VydmVyLnltbApAQCAtMCwwICsxLDI0OSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK21ldGFkYXRhOgorICB0ZW1wbGF0ZV9uYW1lOiBOb3ZhU2VydmVyR2xvYmFsVHlwZXMKKyAgdGVtcGxhdGVfdmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBOb3ZhIFNlcnZlciBUT1NDQSBHbG9iYWwgVHlwZXMKK2ltcG9ydHM6CisgIGNvbW1vbl9kZWZpbml0aW9uczoKKyAgICBmaWxlOiBDb21tb25HbG9iYWxUeXBlc1NlcnZpY2VUZW1wbGF0ZS55YW1sCitkYXRhX3R5cGVzOgorICBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5vdmFTZXJ2ZXIubmV0d29yay5Qb3J0RXh0cmFQcm9wZXJ0aWVzOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogTm92YSBzZXJ2ZXIgbmV0d29yayBleHBhbmQgcHJvcGVydGllcyBmb3IgcG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb3J0X3NlY3VyaXR5X2VuYWJsZWQ6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgcG9ydCBzZWN1cml0eSBvbiB0aGUgcG9ydAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG1hY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IE1BQyBhZGRyZXNzIHRvIGdpdmUgdG8gdGhpcyBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYWRtaW5fc3RhdGVfdXA6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSBvZiB0aGlzIHBvcnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHFvc19wb2xpY3k6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb3IgSUQgb2YgUW9TIHBvbGljeSB0byBhdHRhY2ggdG8gdGhpcyBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYWxsb3dlZF9hZGRyZXNzX3BhaXJzOgorICAgICAgICB0eXBlOiBsaXN0CisgICAgICAgIGRlc2NyaXB0aW9uOiBBZGRpdGlvbmFsIE1BQy9JUCBhZGRyZXNzIHBhaXJzIGFsbG93ZWQgdG8gcGFzcyB0aHJvdWdoIHRoZSBwb3J0CisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5uZXR3b3JrLkFkZHJlc3NQYWlyCisgICAgICBiaW5kaW5nOnZuaWNfdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgdm5pYyB0eXBlIHRvIGJlIGJvdW5kIG9uIHRoZSBuZXV0cm9uIHBvcnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAtIG1hY3Z0YXAKKyAgICAgICAgICAtIGRpcmVjdAorICAgICAgICAgIC0gbm9ybWFsCisgICAgICB2YWx1ZV9zcGVjczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGRlc2NyaXB0aW9uOiBFeHRyYSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICB9CisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgb3JnLm9wZW5lY29tcC5kYXRhdHlwZXMuaGVhdC5ub3ZhU2VydmVyLm5ldHdvcmsuQWRkcmVzc0luZm86CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIGFkZHJlc3NlcyB3aXRoIGNvcnJlc3BvbmRpbmcgcG9ydCBpZAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb3J0X2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFBvcnQgaWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy5ub2Rlcy5oZWF0Lm5vdmEuU2VydmVyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgIHByb3BlcnRpZXM6CisgICAgICBhZG1pbl9wYXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBhZG1pbmlzdHJhdG9yIHBhc3N3b3JkIGZvciB0aGUgc2VydmVyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogQXZhaWxhYmlsaXR5IHpvbmUgdG8gY3JlYXRlIHNlcnZlcnMgaW4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBpbWFnZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgSUQgb3IgbmFtZSBvZiB0aGUgaW1hZ2UgdG8gYm9vdCB3aXRoCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgaW1hZ2VfdXBkYXRlX3BvbGljeToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBQb2xpY3kgb24gaG93IHRvIGFwcGx5IGFuIGltYWdlLWlkIHVwZGF0ZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogUkVCVUlMRAorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgLSBSRUJVSUxEX1BSRVNFUlZFX0VQSEVNRVJBTAorICAgICAgICAgIC0gUkVQTEFDRQorICAgICAgICAgIC0gUkVCVUlMRAorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHR5cGU6IGpzb24KKyAgICAgICAgZGVzY3JpcHRpb246IEFyYml0cmFyeSBKU09OIG1ldGFkYXRhIHRvIHN0b3JlIGZvciB0aGlzIHNlcnZlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGNvbnRyYWlsX3NlcnZpY2VfaW5zdGFuY2VfaW5kOgorICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGRlc2NyaXB0aW9uOiBOb3ZhIHNlcnZlciByZWxhdGVkIHRvIHNlcnZpY2UgaW5zdGFuY2UgaW5kaWNhdG9yCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgdXNlcl9kYXRhX3VwZGF0ZV9wb2xpY3k6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogUG9saWN5IG9uIGhvdyB0byBhcHBseSBhIHVzZXJfZGF0YSB1cGRhdGUKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IFJFUExBQ0UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gUkVQTEFDRQorICAgICAgICAgIC0gSUdOT1JFCisgICAgICBmbGF2b3JfdXBkYXRlX3BvbGljeToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBQb2xpY3kgb24gaG93IHRvIGFwcGx5IGEgZmxhdm9yIHVwZGF0ZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogUkVTSVpFCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAtIFJFU0laRQorICAgICAgICAgIC0gUkVQTEFDRQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFVzZXIgZGF0YSBzY3JpcHQgdG8gYmUgZXhlY3V0ZWQgYnkgY2xvdWQtaW5pdAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVmYXVsdDogJycKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGZsYXZvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgSUQgb3IgbmFtZSBvZiB0aGUgZmxhdm9yIHRvIGJvb3Qgb250bworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAga2V5X25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogTmFtZSBvZiBrZXlwYWlyIHRvIGluamVjdCBpbnRvIHRoZSBzZXJ2ZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICByZXNlcnZhdGlvbl9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBBIFVVSUQgZm9yIHRoZSBzZXQgb2Ygc2VydmVycyBiZWluZyByZXF1ZXN0ZWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzZWN1cml0eV9ncm91cHM6CisgICAgICAgIHR5cGU6IGxpc3QKKyAgICAgICAgZGVzY3JpcHRpb246IExpc3Qgb2Ygc2VjdXJpdHkgZ3JvdXAgbmFtZXMgb3IgSURzCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgXQorICAgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBjb25maWdfZHJpdmU6CisgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgZGVzY3JpcHRpb246IGVuYWJsZSBjb25maWcgZHJpdmUgb24gdGhlIHNlcnZlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHBlcnNvbmFsaXR5OgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZGVzY3JpcHRpb246IEEgbWFwIG9mIGZpbGVzIHRvIGNyZWF0ZS9vdmVyd3JpdGUgb24gdGhlIHNlcnZlciB1cG9uIGJvb3QKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICB9CisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNvZnR3YXJlX2NvbmZpZ190cmFuc3BvcnQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogSG93IHRoZSBzZXJ2ZXIgc2hvdWxkIHJlY2VpdmUgdGhlIG1ldGFkYXRhIHJlcXVpcmVkIGZvciBzb2Z0d2FyZSBjb25maWd1cmF0aW9uCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiBQT0xMX1NFUlZFUl9DRk4KKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gUE9MTF9TRVJWRVJfQ0ZOCisgICAgICAgICAgLSBQT0xMX1NFUlZFUl9IRUFUCisgICAgICAgICAgLSBQT0xMX1RFTVBfVVJMCisgICAgICAgICAgLSBaQVFBUl9NRVNTQUdFCisgICAgICB1c2VyX2RhdGFfZm9ybWF0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IEhvdyB0aGUgdXNlcl9kYXRhIHNob3VsZCBiZSBmb3JtYXR0ZWQgZm9yIHRoZSBzZXJ2ZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlZmF1bHQ6IEhFQVRfQ0ZOVE9PTFMKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAgIC0gU09GVFdBUkVfQ09ORklHCisgICAgICAgICAgLSBSQVcKKyAgICAgICAgICAtIEhFQVRfQ0ZOVE9PTFMKKyAgICAgIGRpc2tDb25maWc6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogQ29udHJvbCBob3cgdGhlIGRpc2sgaXMgcGFydGl0aW9uZWQgd2hlbiB0aGUgc2VydmVyIGlzIGNyZWF0ZWQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAtIEFVVE8KKyAgICAgICAgICAtIE1BTlVBTAorICAgICAgbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBTZXJ2ZXIgbmFtZQorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIHNjaGVkdWxlcl9oaW50czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGRlc2NyaXB0aW9uOiBBcmJpdHJhcnkga2V5LXZhbHVlIHBhaXJzIHNwZWNpZmllZCBieSB0aGUgY2xpZW50IHRvIGhlbHAgYm9vdCBhIHNlcnZlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgIGF0dHJpYnV0ZXM6CisgICAgICBhY2Nlc3NJUHY0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBtYW51YWxseSBhc3NpZ25lZCBhbHRlcm5hdGl2ZSBwdWJsaWMgSVB2NCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGFkZHJlc3NlczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGRlc2NyaXB0aW9uOiBBIGRpY3Qgb2YgYWxsIG5ldHdvcmsgYWRkcmVzc2VzIHdpdGggY29ycmVzcG9uZGluZyBwb3J0X2lkCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiBvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0Lm5vdmFTZXJ2ZXIubmV0d29yay5BZGRyZXNzSW5mbworICAgICAgYWNjZXNzSVB2NjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgbWFudWFsbHkgYXNzaWduZWQgYWx0ZXJuYXRpdmUgcHVibGljIElQdjYgYWRkcmVzcyBvZiB0aGUgc2VydmVyCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBpbnN0YW5jZV9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IEFXUyBjb21wYXRpYmxlIGluc3RhbmNlIG5hbWUKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIG5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogTmFtZSBvZiB0aGUgc2VydmVyCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBzaG93OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IERldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHJlc291cmNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBjb25zb2xlX3VybHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVVJMcyBvZiBzZXJ2ZXJzIGNvbnNvbGVzCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvbm92YVNlcnZlci9ub3ZhU2VydmVyLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25vdmFTZXJ2ZXIvbm92YVNlcnZlci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmZWZiYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL25vdmFTZXJ2ZXIvbm92YVNlcnZlci56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvc2VjdXJpdHlSdWxlcy9zZWN1cml0eVJ1bGVzLmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9zZWN1cml0eVJ1bGVzL3NlY3VyaXR5UnVsZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQyNWEwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvc2VjdXJpdHlSdWxlcy9zZWN1cml0eVJ1bGVzLmpzb24KQEAgLTAsMCArMSwyMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAic2VjdXJpdHlSdWxlcy55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIlNlY3VyaXR5UnVsZXMiLAorICAiZGVzY3JpcHRpb24iOiAiQ29uZmlndXJhdGlvbiBvZiBwb2xpY3kgcnVsZXMgdG8gYmUgYXBwbGllZCBvbiBwb3J0cy4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJzZWN1cml0eXJ1bGVzIiwKKyAgInJlc291cmNlVHlwZSI6ICJWRkMiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJSdWxlcyIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJTZWN1cml0eVJ1bGVzIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2hlYXQtdHlwZXMvc2VjdXJpdHlSdWxlcy9zZWN1cml0eVJ1bGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL3NlY3VyaXR5UnVsZXMvc2VjdXJpdHlSdWxlcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllODdlMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL3NlY3VyaXR5UnVsZXMvc2VjdXJpdHlSdWxlcy55bWwKQEAgLTAsMCArMSw0MiBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK21ldGFkYXRhOgorICB0ZW1wbGF0ZV9uYW1lOiBOZXV0cm9uU2VjdXJpdHlSdWxlc0dsb2JhbFR5cGVzCisgIHRlbXBsYXRlX3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogTmV1dHJvbiBTZWN1cml0eSBSdWxlcyBUT1NDQSBHbG9iYWwgVHlwZXMKK2ltcG9ydHM6CisgIGNvbW1vbl9kZWZpbml0aW9uczoKKyAgICBmaWxlOiBDb21tb25HbG9iYWxUeXBlc1NlcnZpY2VUZW1wbGF0ZS55YW1sCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy5ydWxlcy5ub2Rlcy5oZWF0Lm5ldHdvcmsubmV1dHJvbi5TZWN1cml0eVJ1bGVzOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBkZXNjcmlwdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiBEZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgZ3JvdXAKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBuYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IEEgc3ltYm9saWMgbmFtZSBmb3IgdGhpcyBzZWN1cml0eSBncm91cCwgd2hpY2ggaXMgbm90IHJlcXVpcmVkIHRvIGJlIHVuaXF1ZS4KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBydWxlczoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogTGlzdCBvZiBzZWN1cml0eSBncm91cCBydWxlcworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQubmV0d29yay5uZXV0cm9uLlNlY3VyaXR5UnVsZXMuUnVsZQorICAgIGF0dHJpYnV0ZXM6CisgICAgICBzaG93OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IERldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHJlc291cmNlCisgICAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgcmVxdWlyZW1lbnRzOgorICAgIC0gcG9ydDoKKyAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgbm9kZTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5ub2Rlcy5oZWF0Lm5ldHdvcmsubmV1dHJvbi5Qb3J0CisgICAgICAgIHJlbGF0aW9uc2hpcDogY29yZy5vcGVuZWNvbXAucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgIG9jY3VycmVuY2VzOgorICAgICAgICAtIDAKKyAgICAgICAgLSBVTkJPVU5ERUQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL3NlY3VyaXR5UnVsZXMvc2VjdXJpdHlSdWxlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9zZWN1cml0eVJ1bGVzL3NlY3VyaXR5UnVsZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTI0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy9zZWN1cml0eVJ1bGVzL3NlY3VyaXR5UnVsZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL3ZsL3ZsLmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy92bC92bC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDI2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy92bC92bC5qc29uCkBAIC0wLDAgKzEsMjEgQEAKK3sKKyAgInBheWxvYWROYW1lIjogInZsLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiVkwiLAorICAiZGVzY3JpcHRpb24iOiAiIFZpcnR1YWwgbGluayAoVkwpIGRlc2NyaWJlcyB0aGUgYmFzaWMgdG9wb2xvZ3kgb2YgdGhlIGNvbm5lY3Rpdml0eSBhcyB3ZWxsIGFzIG90aGVyIHJlcXVpcmVkIHBhcmFtZXRlcnMgKGUuZy4gYmFuZHdpZHRoIGFuZCBRb1MgY2xhc3MpLiAiLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJuZXR3b3JrIiwKKyAgInJlc291cmNlVHlwZSI6ICJWTCIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiTmV0d29yayBDb25uZWN0aXZpdHkiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICB7CisgICAgICAgICJuYW1lIjogIlZpcnR1YWwgTGlua3MiCisgICAgICB9CisgICAgXQorICB9CitdLCAgCisgInRhZ3MiOiBbCisgICAgIlZMIgorICBdCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy92bC92bC55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy92bC92bC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwNDJmNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL3ZsL3ZsLnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZsLlZMOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMubmV0d29yay5OZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIHZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgdmxfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgIHZpcnR1YWxfbGlua2FibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgZW5kX3BvaW50OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy92bC92bC56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaGVhdC10eXBlcy92bC92bC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4ODlhOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzL3ZsL3ZsLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaW50ZXJmYWNlLWxpZmVjeWNsZS10eXBlcy9pbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvaW50ZXJmYWNlLWxpZmVjeWNsZS10eXBlcy9pbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2NzExOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9pbnRlcmZhY2UtbGlmZWN5Y2xlLXR5cGVzL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnltbApAQCAtMCwwICsxLDExIEBACit0b3NjYS5pbnRlcmZhY2VzLm5vZGUubGlmZWN5Y2xlLlN0YW5kYXJkOgorICBjcmVhdGU6CisgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBjcmVhdGUgb3BlcmF0aW9uLgorICBjb25maWd1cmU6CisgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBjb25maWd1cmUgb3BlcmF0aW9uLgorICBzdGFydDoKKyAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIHN0YXJ0IG9wZXJhdGlvbi4KKyAgc3RvcDoKKyAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIHN0b3Agb3BlcmF0aW9uLgorICBkZWxldGU6CisgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBkZWxldGUgb3BlcmF0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9pbnRlcmZhY2UtbGlmZWN5Y2xlLXR5cGVzL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9pbnRlcmZhY2UtbGlmZWN5Y2xlLXR5cGVzL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNmOTNhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL2ludGVyZmFjZS1saWZlY3ljbGUtdHlwZXMvaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvREJNUy9EQk1TLmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL0RCTVMvREJNUy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGVmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL0RCTVMvREJNUy5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIkRCTVMueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJEQk1TIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSB0eXBpY2FsIHJlbGF0aW9uYWwsIFNRTCBEYXRhYmFzZSBNYW5hZ2VtZW50IFN5c3RlbSBzb2Z0d2FyZSBjb21wb25lbnQgb3Igc2VydmljZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFic3RyYWN0IgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIkRCTVMiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL0RCTVMvREJNUy55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL0RCTVMvREJNUy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5MTlkMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvREJNUy9EQk1TLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkRCTVM6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudAorICAgIHByb3BlcnRpZXM6CisgICAgICByb290X3Bhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cyAKKyAgICBjYXBhYmlsaXRpZXM6ICAgIAorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLkRhdGFiYXNlIF0KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvREJNUy9EQk1TLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvREJNUy9EQk1TLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjg4YjNiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9EQk1TL0RCTVMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvYmxvY2tTdG9yYWdlL2Jsb2NrU3RvcmFnZS5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9ibG9ja1N0b3JhZ2UvYmxvY2tTdG9yYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlM2Q3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvYmxvY2tTdG9yYWdlL2Jsb2NrU3RvcmFnZS5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogImJsb2NrU3RvcmFnZS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIkJsb2NrU3RvcmFnZSIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2VydmVyLWxvY2FsIGJsb2NrIHN0b3JhZ2UgZGV2aWNlIChpLmUuLCBub3Qgc2hhcmVkKSBvZmZlcmluZyBldmVubHkgc2l6ZWQgYmxvY2tzIG9mIGRhdGEgZnJvbSB3aGljaCByYXcgc3RvcmFnZSB2b2x1bWVzIGNhbiBiZSBjcmVhdGVkLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIm9iamVjdFN0b3JhZ2UiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJJbmZyYXN0cnVjdHVyZSIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJCbG9ja1N0b3JhZ2UiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2Jsb2NrU3RvcmFnZS9ibG9ja1N0b3JhZ2UueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9ibG9ja1N0b3JhZ2UvYmxvY2tTdG9yYWdlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI5NjUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9ibG9ja1N0b3JhZ2UvYmxvY2tTdG9yYWdlLnltbApAQCAtMCwwICsxLDE4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgc2l6ZTogCisgICAgICAgIHR5cGU6IHNjYWxhci11bml0LnNpemUKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxIE1CCisgICAgICB2b2x1bWVfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHNuYXBzaG90X2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYXR0YWNobWVudDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2Jsb2NrU3RvcmFnZS9ibG9ja1N0b3JhZ2UuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9ibG9ja1N0b3JhZ2UvYmxvY2tTdG9yYWdlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjZmOWUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9ibG9ja1N0b3JhZ2UvYmxvY2tTdG9yYWdlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbXB1dGUvY29tcHV0ZS5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb21wdXRlL2NvbXB1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJiMjdiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb21wdXRlL2NvbXB1dGUuanNvbgpAQCAtMCwwICsxLDI0IEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJjb21wdXRlLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiQ29tcHV0ZSIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgcmVhbCBvciB2aXJ0dWFsIG1hY2hpbmUgb3Igc2VydmVyLiBJbmZvcm1hdGlvbiBzcGVjaWZpZWQgb24gdGhlIENvbXB1dGUKKyAgICAgIG5vZGUgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIG1hY2hpbmUgdGhhdCBmaXRzIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgaW4gdGhlIGNsb3VkCisgICAgICBhdmFpbGFibGUgbWFjaGluZXMuIElmIG5vIHNpemluZyBpbmZvcm1hdGlvbiBhcmUgc3BlY2lmaWVkIHRoZSBjbG91ZCBwcm92aWRlciBkZWZhdWx0CisgICAgICBtYWNoaW5lIHdpbGwgYmUgdXNlZC4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gc3BlY2lmeSB0aGUgcmVxdWlyZWQgIENQVXMgYW5kIG1lbW9yeQorICAgICAgYXQgbGVhc3QuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiY29tcHV0ZSIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIkNvbXB1dGUiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbXB1dGUvY29tcHV0ZS55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbXB1dGUvY29tcHV0ZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiMDdmYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvY29tcHV0ZS9jb21wdXRlLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb21wdXRlL2NvbXB1dGUuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb21wdXRlL2NvbXB1dGUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMDA4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbXB1dGUvY29tcHV0ZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJBcHBsaWNhdGlvbi9jb250YWluZXJBcHBsaWNhdGlvbi5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJBcHBsaWNhdGlvbi9jb250YWluZXJBcHBsaWNhdGlvbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMGExMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbnRhaW5lckFwcGxpY2F0aW9uL2NvbnRhaW5lckFwcGxpY2F0aW9uLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAiY29udGFpbmVyQXBwbGljYXRpb24ueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJBcHBsaWNhdGlvbiIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGFuIGFwcGxpY2F0aW9uIHRoYXQgcmVxdWlyZXMgQ29udGFpbmVyLWxldmVsIHZpcnR1YWxpemF0aW9uIHRlY2hub2xvZ3kuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJBcHBsaWNhdGlvbiIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvY29udGFpbmVyQXBwbGljYXRpb24vY29udGFpbmVyQXBwbGljYXRpb24ueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJBcHBsaWNhdGlvbi9jb250YWluZXJBcHBsaWNhdGlvbi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxM2YyNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvY29udGFpbmVyQXBwbGljYXRpb24vY29udGFpbmVyQXBwbGljYXRpb24ueW1sCkBAIC0wLDAgKzEsOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5Db250YWluZXIuQXBwbGljYXRpb246CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbnRhaW5lckFwcGxpY2F0aW9uL2NvbnRhaW5lckFwcGxpY2F0aW9uLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvY29udGFpbmVyQXBwbGljYXRpb24vY29udGFpbmVyQXBwbGljYXRpb24uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzNlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbnRhaW5lckFwcGxpY2F0aW9uL2NvbnRhaW5lckFwcGxpY2F0aW9uLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbnRhaW5lclJ1bnRpbWUvY29udGFpbmVyUnVudGltZS5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJSdW50aW1lL2NvbnRhaW5lclJ1bnRpbWUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWEwYzYzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJSdW50aW1lL2NvbnRhaW5lclJ1bnRpbWUuanNvbgpAQCAtMCwwICsxLDIwIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJjb250YWluZXJSdW50aW1lLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiUnVudGltZSIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIG9wZXJhdGluZyBzeXN0ZW0tbGV2ZWwgdmlydHVhbGl6YXRpb24gdGVjaG5vbG9neSB1c2VkIHRvIHJ1biBtdWx0aXBsZSBhcHBsaWNhdGlvbiBzZXJ2aWNlcyBvbiBhIHNpbmdsZSBDb21wdXRlIGhvc3QuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJSdW50aW1lIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJSdW50aW1lL2NvbnRhaW5lclJ1bnRpbWUueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJSdW50aW1lL2NvbnRhaW5lclJ1bnRpbWUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTEwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbnRhaW5lclJ1bnRpbWUvY29udGFpbmVyUnVudGltZS55bWwKQEAgLTAsMCArMSw5IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkNvbnRhaW5lci5SdW50aW1lOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJSdW50aW1lL2NvbnRhaW5lclJ1bnRpbWUuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9jb250YWluZXJSdW50aW1lL2NvbnRhaW5lclJ1bnRpbWUuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGFmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2NvbnRhaW5lclJ1bnRpbWUvY29udGFpbmVyUnVudGltZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9kYXRhYmFzZS9kYXRhYmFzZS5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9kYXRhYmFzZS9kYXRhYmFzZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2YwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2RhdGFiYXNlL2RhdGFiYXNlLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAiZGF0YWJhc2UueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJEYXRhYmFzZSIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgbG9naWNhbCBkYXRhYmFzZSB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBob3N0ZWQgYnkgYSBEQk1TIG5vZGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJEYXRhYmFzZSIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJEYXRhYmFzZSIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvZGF0YWJhc2UvZGF0YWJhc2UueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9kYXRhYmFzZS9kYXRhYmFzZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2NjE1MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvZGF0YWJhc2UvZGF0YWJhc2UueW1sCkBAIC0wLDAgKzEsMjcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuRGF0YWJhc2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogdGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZm9yIGRhdGEKKyAgICAgIHVzZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHVzZXIgYWNjb3VudCBuYW1lIGZvciBEQiBhZG1pbmlzdHJhdGlvbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHBhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBvcHRpb25hbCBwYXNzd29yZCBmb3IgdGhlIERCIHVzZXIgYWNjb3VudAorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkRCTVMKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBkYXRhYmFzZV9lbmRwb2ludDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5EYXRhYmFzZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9kYXRhYmFzZS9kYXRhYmFzZS56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2RhdGFiYXNlL2RhdGFiYXNlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODllN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9kYXRhYmFzZS9kYXRhYmFzZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9sb2FkQmFsYW5jZXIvbG9hZEJhbGFuY2VyLmpzb24gYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA4ZWUxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9sb2FkQmFsYW5jZXIvbG9hZEJhbGFuY2VyLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAibG9hZEJhbGFuY2VyLnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiTG9hZEJhbGFuY2VyIiwKKyAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgbG9naWNhbCBmdW5jdGlvbiB0aGF0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIEZsb2F0aW5nIEFkZHJlc3MgdG8gZGlzdHJpYnV0ZSBhbiBhcHBsaWNhdGlvbuKAmXMgdHJhZmZpYyAobG9hZCkgYWNyb3NzIGEgbnVtYmVyIG9mIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gKGUuZy4sIGZvciBhIGNsdXN0ZXJlZCBvciBzY2FsZWQgYXBwbGljYXRpb24pLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogImxvYWRCYWxhbmNlciIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkluZnJhc3RydWN0dXJlIgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIkxvYWRCYWxhbmNlciIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvbG9hZEJhbGFuY2VyL2xvYWRCYWxhbmNlci55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NzdhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL2xvYWRCYWxhbmNlci9sb2FkQmFsYW5jZXIueW1sCkBAIC0wLDAgKzEsMjAgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuTG9hZEJhbGFuY2VyOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdCAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgIyBUQkQKKyAgICAgIGFsZ29yaXRobSA6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhdHVzOiBleHBlcmltZW50YWwKKyAgICBjYXBhYmlsaXRpZXMgOgorICAgICAgY2xpZW50OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LlB1YmxpYworICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0KKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBGbG9hdGluZyAoSVApIGNsaWVudOKAmXMgb24gdGhlIHB1YmxpYyBuZXR3b3JrIGNhbiBjb25uZWN0IHRvCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gYXBwbGljYXRpb246IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Sb3V0ZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9sb2FkQmFsYW5jZXIvbG9hZEJhbGFuY2VyLnppcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvbG9hZEJhbGFuY2VyL2xvYWRCYWxhbmNlci56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E4NDdjNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvbG9hZEJhbGFuY2VyL2xvYWRCYWxhbmNlci56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9uZXR3b3JrL25ldHdvcmsuanNvbiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvbmV0d29yay9uZXR3b3JrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhODMxMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvbmV0d29yay9uZXR3b3JrLmpzb24KQEAgLTAsMCArMSwyMSBAQAoreworICAicGF5bG9hZE5hbWUiOiAibmV0d29yay55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIk5ldHdvcmsiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHNpbXBsZSAsIGxvZ2ljYWwgbmV0d29yayBzZXJ2aWNlLiIsCisgICJyZXNvdXJjZUljb25QYXRoIjogIm5ldHdvcmsiLAorICAicmVzb3VyY2VUeXBlIjogIlZMIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLAorICAidGFncyI6IFsKKyAgICAiTmV0d29yayIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvbmV0d29yay9uZXR3b3JrLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvbmV0d29yay9uZXR3b3JrLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTcxZTgwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9uZXR3b3JrL25ldHdvcmsueW1sCkBAIC0wLDAgKzEsNDUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMubmV0d29yay5OZXR3b3JrOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBpcF92ZXJzaW9uOgorICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgICBkZWZhdWx0OiA0CisgICAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyA0LCA2IF0KKyAgICAgICAgY2lkcjoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc3RhcnRfaXA6CisgICAgICAgICAgdHlwZTogc3RyaW5nIAorICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBlbmRfaXA6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGdhdGV3YXlfaXA6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIG5ldHdvcmtfbmFtZToKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgbmV0d29ya19pZDoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgc2VnbWVudGF0aW9uX2lkOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSAKKyAgICAgICAgbmV0d29ya190eXBlOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSAKKyAgICAgICAgcGh5c2ljYWxfbmV0d29yazoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UgCisgICAgICAgIGRoY3BfZW5hYmxlZDoKKyAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgICAgICAgIGRlZmF1bHQ6IHRydWUKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9uZXR3b3JrL25ldHdvcmsuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9uZXR3b3JrL25ldHdvcmsuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzg4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL25ldHdvcmsvbmV0d29yay56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9vYmplY3RTdG9yYWdlL29iamVjdFN0b3JhZ2UuanNvbiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvb2JqZWN0U3RvcmFnZS9vYmplY3RTdG9yYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNWE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvb2JqZWN0U3RvcmFnZS9vYmplY3RTdG9yYWdlLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAib2JqZWN0U3RvcmFnZS55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIk9iamVjdFN0b3JhZ2UiLAorICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBzdG9yYWdlIHRoYXQgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gc3RvcmUgZGF0YSBhcyBvYmplY3RzIChvciBCTE9CcyBvZiBkYXRhKSB3aXRob3V0IGNvbnNpZGVyYXRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gb3IgZGV2aWNlcy4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJvYmplY3RTdG9yYWdlIiwKKyAgImNhdGVnb3JpZXMiOiBbCisgIHsKKyAgICAibmFtZSI6ICJHZW5lcmljIiwKKyAgICAic3ViY2F0ZWdvcmllcyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICB9CisgICAgXQorICB9CitdLAorICJ0YWdzIjogWworICAgICJPYmplY3RTdG9yYWdlIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9vYmplY3RTdG9yYWdlL29iamVjdFN0b3JhZ2UueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9vYmplY3RTdG9yYWdlL29iamVjdFN0b3JhZ2UueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzM4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL29iamVjdFN0b3JhZ2Uvb2JqZWN0U3RvcmFnZS55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5PYmplY3RTdG9yYWdlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzaXplOiAKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAgR0IKKyAgICAgIG1heHNpemU6CisgICAgICAgIHR5cGU6IHNjYWxhci11bml0LnNpemUKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwIEdCCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgc3RvcmFnZV9lbmRwb2ludDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL29iamVjdFN0b3JhZ2Uvb2JqZWN0U3RvcmFnZS56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL29iamVjdFN0b3JhZ2Uvb2JqZWN0U3RvcmFnZS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxNTM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvb2JqZWN0U3RvcmFnZS9vYmplY3RTdG9yYWdlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3BvcnQvcG9ydC5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9wb3J0L3BvcnQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDc1YmVmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9wb3J0L3BvcnQuanNvbgpAQCAtMCwwICsxLDIxIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJwb3J0LnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiUG9ydCIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgbG9naWNhbCBlbnRpdHkgdGhhdCBhc3NvY2lhdGVzIGJldHdlZW4gQ29tcHV0ZSBhbmQgTmV0d29yayBub3JtYXRpdmUgdHlwZXMuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAicG9ydCIsCisgICJyZXNvdXJjZVR5cGUiOiAiQ1AiLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJOZXR3b3JrIEVsZW1lbnRzIgorICAgICAgfQorICAgIF0KKyAgfQorXSwgIAorICJ0YWdzIjogWworICAgICJQb3J0IgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9wb3J0L3BvcnQueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9wb3J0L3BvcnQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTU0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3BvcnQvcG9ydC55bWwKQEAgLTAsMCArMSwzMSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5uZXR3b3JrLlBvcnQ6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIGlwX2FkZHJlc3M6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIG9yZGVyOgorICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICAgIGRlZmF1bHQ6IDAgCisgICAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAKKyAgICAgICAgaXNfZGVmYXVsdDoKKyAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgICAgaXBfcmFuZ2Vfc3RhcnQ6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGlwX3JhbmdlX2VuZDoKKyAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgICByZXF1aXJlZDogZmFsc2UgIAorICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgIC0gbGluazogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5MaW5rc1RvIAorICAgICAgIC0gYmluZGluZzoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkJpbmRzVG8gCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3BvcnQvcG9ydC56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3BvcnQvcG9ydC56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmOTczMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvcG9ydC9wb3J0LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3Jvb3Qvcm9vdC5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9yb290L3Jvb3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg0NmJjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9yb290L3Jvb3QuanNvbgpAQCAtMCwwICsxLDIwIEBACit7CisgICJwYXlsb2FkTmFtZSI6ICJyb290LnltbCIsCisgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgIm5hbWUiOiAiUm9vdCIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJSb290IgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9yb290L3Jvb3QueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9yb290L3Jvb3QueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjFkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3Jvb3Qvcm9vdC55bWwKQEAgLTAsMCArMSwyMyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5Sb290OgorICAgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0EgTm9kZSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIE5vZGUgVHlwZXMgZGVyaXZlIGZyb20KKyAgICBhdHRyaWJ1dGVzOgorICAgICAgdG9zY2FfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdG9zY2FfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdGF0ZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgZmVhdHVyZTogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBkZXBlbmRlbmN5IDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLlJvb3QgCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbgorICAgICAgICAgIG9jY3VycmVuY2VzOiBbIDAsIFVOQk9VTkRFRCBdCisgICAgaW50ZXJmYWNlczogCisgICAgICBTdGFuZGFyZDoKKyAgICAgICAgdHlwZTogdG9zY2EuaW50ZXJmYWNlcy5ub2RlLmxpZmVjeWNsZS5TdGFuZGFyZApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9yb290L3Jvb3QuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9yb290L3Jvb3QuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzZhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3Jvb3Qvcm9vdC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGVkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3NvZnR3YXJlQ29tcG9uZW50L3NvZnR3YXJlQ29tcG9uZW50Lmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAic29mdHdhcmVDb21wb25lbnQueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJTb2Z0d2FyZUNvbXBvbmVudCIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJTb2Z0d2FyZUNvbXBvbmVudCIKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvc29mdHdhcmVDb21wb25lbnQvc29mdHdhcmVDb21wb25lbnQueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1NDYzMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvc29mdHdhcmVDb21wb25lbnQvc29mdHdhcmVDb21wb25lbnQueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgICMgZG9tYWluLXNwZWNpZmljIHNvZnR3YXJlIGNvbXBvbmVudCB2ZXJzaW9uCisgICAgICBjb21wb25lbnRfdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC56aXAgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3NvZnR3YXJlQ29tcG9uZW50L3NvZnR3YXJlQ29tcG9uZW50LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc4MTZiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy9zb2Z0d2FyZUNvbXBvbmVudC9zb2Z0d2FyZUNvbXBvbmVudC56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJBcHBsaWNhdGlvbi93ZWJBcHBsaWNhdGlvbi5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJBcHBsaWNhdGlvbi93ZWJBcHBsaWNhdGlvbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzI5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3dlYkFwcGxpY2F0aW9uL3dlYkFwcGxpY2F0aW9uLmpzb24KQEAgLTAsMCArMSwyMCBAQAoreworICAicGF5bG9hZE5hbWUiOiAid2ViQXBwbGljYXRpb24ueW1sIiwKKyAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAibmFtZSI6ICJXZWJBcHBsaWNhdGlvbiIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc29mdHdhcmUgYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgV2ViIFNlcnZlciBub2RlLiAgU3BlY2lmaWMgdHlwZXMgb2Ygd2ViIGFwcGxpY2F0aW9ucyBzdWNoIGFzIEphdmEsIGV0Yy4gY291bGQgYmUgZGVyaXZlZCBmcm9tIHRoaXMgdHlwZS4iLAorICAicmVzb3VyY2VJY29uUGF0aCI6ICJkZWZhdWx0aWNvbiIsCisgICJjYXRlZ29yaWVzIjogWworICB7CisgICAgIm5hbWUiOiAiR2VuZXJpYyIsCisgICAgInN1YmNhdGVnb3JpZXMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFic3RyYWN0IgorICAgICAgfQorICAgIF0KKyAgfQorXSwKKyAgInRhZ3MiOiBbCisgICAgIldlYkFwcGxpY2F0aW9uIgorICBdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJBcHBsaWNhdGlvbi93ZWJBcHBsaWNhdGlvbi55bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3dlYkFwcGxpY2F0aW9uL3dlYkFwcGxpY2F0aW9uLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjlhNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJBcHBsaWNhdGlvbi93ZWJBcHBsaWNhdGlvbi55bWwKQEAgLTAsMCArMSwxNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgY29udGV4dF9yb290OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhcHBfZW5kcG9pbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvd2ViQXBwbGljYXRpb24vd2ViQXBwbGljYXRpb24uemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJBcHBsaWNhdGlvbi93ZWJBcHBsaWNhdGlvbi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxODg5YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvd2ViQXBwbGljYXRpb24vd2ViQXBwbGljYXRpb24uemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvd2ViU2VydmVyL3dlYlNlcnZlci5qc29uIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJTZXJ2ZXIvd2ViU2VydmVyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4YWY5NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9ub3JtYXRpdmUtdHlwZXMvd2ViU2VydmVyL3dlYlNlcnZlci5qc29uCkBAIC0wLDAgKzEsMjAgQEAKK3sKKyAgInBheWxvYWROYW1lIjogIndlYlNlcnZlci55bWwiLAorICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICJuYW1lIjogIldlYlNlcnZlciIsCisgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGFuIGFic3RyYWN0IHNvZnR3YXJlIGNvbXBvbmVudCBvciBzZXJ2aWNlIHRoYXQgaXMgY2FwYWJsZSBvZiBob3N0aW5nIGFuZCBwcm92aWRpbmcgbWFuYWdlbWVudCBvcGVyYXRpb25zIGZvciBvbmUgb3IgbW9yZSBXZWIgQXBwbGljYXRpb24gbm9kZXMuIiwKKyAgInJlc291cmNlSWNvblBhdGgiOiAiZGVmYXVsdGljb24iLAorICAiY2F0ZWdvcmllcyI6IFsKKyAgeworICAgICJuYW1lIjogIkdlbmVyaWMiLAorICAgICJzdWJjYXRlZ29yaWVzIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJBYnN0cmFjdCIKKyAgICAgIH0KKyAgICBdCisgIH0KK10sCisgICJ0YWdzIjogWworICAgICJXZWJTZXJ2ZXIiCisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3dlYlNlcnZlci93ZWJTZXJ2ZXIueW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJTZXJ2ZXIvd2ViU2VydmVyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk1N2I1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJTZXJ2ZXIvd2ViU2VydmVyLnltbApAQCAtMCwwICsxLDExIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLldlYlNlcnZlcjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgIyBQcml2YXRlLCBsYXllciA0IGVuZHBvaW50cyAKKyAgICAgIGRhdGFfZW5kcG9pbnQ6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgYWRtaW5fZW5kcG9pbnQ6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzL3dlYlNlcnZlci93ZWJTZXJ2ZXIuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJTZXJ2ZXIvd2ViU2VydmVyLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJlZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL25vcm1hdGl2ZS10eXBlcy93ZWJTZXJ2ZXIvd2ViU2VydmVyLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvcG9saWN5LXR5cGVzL3BvbGljeVR5cGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9wb2xpY3ktdHlwZXMvcG9saWN5VHlwZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjIyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9pbXBvcnQvdG9zY2EvcG9saWN5LXR5cGVzL3BvbGljeVR5cGVzLnltbApAQCAtMCwwICsxLDk0IEBACit0b3NjYS5wb2xpY2llcy5Sb290OgorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIFBvbGljeSBUeXBlIGFsbCBvdGhlciBUT1NDQSBQb2xpY3kgVHlwZXMgZGVyaXZlIGZyb20KK3Rvc2NhLnBvbGljaWVzLlBsYWNlbWVudDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5wb2xpY2llcy5Sb290CisgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0EgUG9saWN5IFR5cGUgZGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gZ292ZXJuIHBsYWNlbWVudCBvZiBUT1NDQSBub2RlcyBvciBncm91cHMgb2Ygbm9kZXMuCit0b3NjYS5wb2xpY2llcy5TY2FsaW5nOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLnBvbGljaWVzLlJvb3QKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBQb2xpY3kgVHlwZSBkZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBnb3Zlcm4gc2NhbGluZyBvZiBUT1NDQSBub2RlcyBvciBncm91cHMgb2Ygbm9kZXMuCit0b3NjYS5wb2xpY2llcy5VcGRhdGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EucG9saWNpZXMuUm9vdAorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIFBvbGljeSBUeXBlIGRlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIGdvdmVybiB1cGRhdGUgb2YgVE9TQ0Egbm9kZXMgb3IgZ3JvdXBzIG9mIG5vZGVzLgordG9zY2EucG9saWNpZXMuUGVyZm9ybWFuY2U6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EucG9saWNpZXMuUm9vdAorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIFBvbGljeSBUeXBlIGRlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIGRlY2xhcmUgcGVyZm9ybWFuY2UgcmVxdWlyZW1lbnRzIGZvciBUT1NDQSBub2RlcyBvciBncm91cHMgb2Ygbm9kZXMuCitvcmcub3BlbmVjb21wLnBvbGljaWVzLnBsYWNlbWVudC5BbnRpbG9jYXRlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLnBvbGljeS5wbGFjZW1lbnQKKyAgZGVzY3JpcHRpb246IE15IHBsYWNlbWVudCBwb2xpY3kgZm9yIHNlcGFyYXRpb24gYmFzZWQgdXBvbiBjb250YWluZXIgdHlwZSB2YWx1ZQorICBwcm9wZXJ0aWVzOgorICAgIG5hbWU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBUaGUgbmFtZSBvZiB0aGUgcG9saWN5CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgY29udGFpbmVyX3R5cGU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBjb250YWluZXIgdHlwZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgY29uc3RyYWludHM6CisgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgLSBob3N0CisgICAgICAgIC0gcmVnaW9uCisgICAgICAgIC0gY29tcHV0ZQorb3JnLm9wZW5lY29tcC5wb2xpY2llcy5wbGFjZW1lbnQuQ29sb2NhdGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EucG9saWN5LnBsYWNlbWVudAorICBkZXNjcmlwdGlvbjogS2VlcCBhc3NvY2lhdGVkIG5vZGVzIChncm91cHMgb2Ygbm9kZXMpIGJhc2VkIHVwb24gYWZmaW5pdHkgdmFsdWUKKyAgcHJvcGVydGllczoKKyAgICBuYW1lOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIHBvbGljeQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgIGFmZmluaXR5OgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogYWZmaW5pdHkKKyAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgY29uc3RyYWludHM6CisgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgLSBob3N0CisgICAgICAgIC0gcmVnaW9uCisgICAgICAgIC0gY29tcHV0ZQorb3JnLm9wZW5lY29tcC5wb2xpY2llcy5wbGFjZW1lbnQudmFsZXQuRGl2ZXJzaXR5OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLnBvbGljeS5wbGFjZW1lbnQKKyAgZGVzY3JpcHRpb246IFZhbGV0IERpdmVyc2l0eQorICBwcm9wZXJ0aWVzOgorICAgIGxldmVsOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogZGl2ZXJzaXR5CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGRlZmF1bHQ6IGhvc3QKKyAgICAgIHN0YXR1czogU1VQUE9SVEVECisgICAgICBjb25zdHJhaW50czoKKyAgICAgIC0gdmFsaWRfdmFsdWVzOgorICAgICAgICAtIGhvc3QKKyAgICAgICAgLSByYWNrCitvcmcub3BlbmVjb21wLnBvbGljaWVzLnBsYWNlbWVudC52YWxldC5FeGNsdXNpdml0eToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5wb2xpY3kucGxhY2VtZW50CisgIGRlc2NyaXB0aW9uOiBWYWxldCBFeGNsdXNpdml0eQorICBwcm9wZXJ0aWVzOgorICAgIGxldmVsOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZXNjcmlwdGlvbjogZXhjbHVzaXZpdHkKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZGVmYXVsdDogaG9zdAorICAgICAgc3RhdHVzOiBTVVBQT1JURUQKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgLSB2YWxpZF92YWx1ZXM6CisgICAgICAgIC0gaG9zdAorICAgICAgICAtIHJhY2sKK29yZy5vcGVuZWNvbXAucG9saWNpZXMucGxhY2VtZW50LnZhbGV0LkFmZmluaXR5OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLnBvbGljeS5wbGFjZW1lbnQKKyAgZGVzY3JpcHRpb246IFZhbGV0IEFmZmluaXR5CisgIHByb3BlcnRpZXM6CisgICAgbGV2ZWw6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBhZmZpbml0eQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBkZWZhdWx0OiBob3N0CisgICAgICBzdGF0dXM6IFNVUFBPUlRFRAorICAgICAgY29uc3RyYWludHM6CisgICAgICAtIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgLSBob3N0CisgICAgICAgIC0gcmFjawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9wb2xpY3ktdHlwZXMvcG9saWN5VHlwZXMuemlwIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL3BvbGljeS10eXBlcy9wb2xpY3lUeXBlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMzhlZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9wb2xpY3ktdHlwZXMvcG9saWN5VHlwZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS91c2Vycy9pbXBvcnRVc2Vycy55YW1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1wb3J0L3Rvc2NhL3VzZXJzL2ltcG9ydFVzZXJzLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4YTJiMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS91c2Vycy9pbXBvcnRVc2Vycy55YW1sCkBAIC0wLDAgKzEsMTMgQEAKKy0tLSAKK3VzZXJzOiAKKyAgamgwMDAzOiAKKyAgICBmaXJzdE5hbWU6IEppbW15CisgICAgbGFzdE5hbWU6IEhlbmRyaXgKKyAgICByb2xlOiBBRE1JTgorICAgIGVtYWlsOiBhZG1pbkBhdHQuY29tCisgIGpoMDAwNjogCisgICAgZmlyc3ROYW1lOiBKaW1teQorICAgIGxhc3ROYW1lOiBIZW5kcml4CisgICAgcm9sZTogREVTSUdORVIxIAorICAgIGVtYWlsOiBhZG1pbkBhdHQuY29tCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2pldHR5LXNzbC54bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9qZXR0eS1zc2wueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzc1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9qZXR0eS1zc2wueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIENvbmZpZ3VyZSBQVUJMSUMgIi0vL0pldHR5Ly9Db25maWd1cmUvL0VOIiAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZXR0eS9jb25maWd1cmVfOV8wLmR0ZCI+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gQ29uZmlndXJlIGEgVExTIChTU0wpIENvbnRleHQgRmFjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gVGhpcyBjb25maWd1cmF0aW9uIG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGpldHR5LnhtbCAtLT4KKzwhLS0gYW5kIGVpdGhlciBqZXR0eS1odHRwcy54bWwgb3IgamV0dHktc3BkeS54bWwgKGJ1dCBub3QgYm90aCkgICAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzxDb25maWd1cmUgaWQ9InNzbENvbnRleHRGYWN0b3J5IiBjbGFzcz0ib3JnLmVjbGlwc2UuamV0dHkudXRpbC5zc2wuU3NsQ29udGV4dEZhY3RvcnkiPgorICA8U2V0IG5hbWU9IktleVN0b3JlUGF0aCI+PFByb3BlcnR5IG5hbWU9ImpldHR5LmJhc2UiIGRlZmF1bHQ9Ii4iIC8+LzxQcm9wZXJ0eSBuYW1lPSJqZXR0eS5rZXlzdG9yZSIgZGVmYXVsdD0iZXRjL2tleXN0b3JlIi8+PC9TZXQ+CisgIDxTZXQgbmFtZT0iS2V5U3RvcmVQYXNzd29yZCI+PFByb3BlcnR5IG5hbWU9ImpldHR5LmtleXN0b3JlLnBhc3N3b3JkIiBkZWZhdWx0PSJPQkY6MXZueTF6bG8xeDhlMXZudzF2bjYxeDhnMXpsdTF2bjQiLz48L1NldD4KKyAgPFNldCBuYW1lPSJLZXlNYW5hZ2VyUGFzc3dvcmQiPjxQcm9wZXJ0eSBuYW1lPSJqZXR0eS5rZXltYW5hZ2VyLnBhc3N3b3JkIiBkZWZhdWx0PSJPQkY6MXUydTF3bWwxejdzMXo3YTF3bmwxdTJnIi8+PC9TZXQ+CisgIDxTZXQgbmFtZT0iVHJ1c3RTdG9yZVBhdGgiPjxQcm9wZXJ0eSBuYW1lPSJqZXR0eS5iYXNlIiBkZWZhdWx0PSIuIiAvPi88UHJvcGVydHkgbmFtZT0iamV0dHkudHJ1c3RzdG9yZSIgZGVmYXVsdD0iZXRjL2tleXN0b3JlIi8+PC9TZXQ+CisgIDxTZXQgbmFtZT0iVHJ1c3RTdG9yZVBhc3N3b3JkIj48UHJvcGVydHkgbmFtZT0iamV0dHkudHJ1c3RzdG9yZS5wYXNzd29yZCIgZGVmYXVsdD0iT0JGOjF2bnkxemxvMXg4ZTF2bncxdm42MXg4ZzF6bHUxdm40Ii8+PC9TZXQ+CisgIDxTZXQgbmFtZT0iRW5kcG9pbnRJZGVudGlmaWNhdGlvbkFsZ29yaXRobSI+PC9TZXQ+CisgIDxTZXQgbmFtZT0iTmVlZENsaWVudEF1dGgiPjxQcm9wZXJ0eSBuYW1lPSJqZXR0eS5zc2wubmVlZENsaWVudEF1dGgiIGRlZmF1bHQ9ImZhbHNlIi8+PC9TZXQ+CisgIDxTZXQgbmFtZT0iV2FudENsaWVudEF1dGgiPjxQcm9wZXJ0eSBuYW1lPSJqZXR0eS5zc2wud2FudENsaWVudEF1dGgiIGRlZmF1bHQ9ImZhbHNlIi8+PC9TZXQ+CisgIDxTZXQgbmFtZT0iRXhjbHVkZUNpcGhlclN1aXRlcyI+CisgICAgPEFycmF5IHR5cGU9IlN0cmluZyI+CisgICAgICA8SXRlbT5TU0xfUlNBX1dJVEhfREVTX0NCQ19TSEE8L0l0ZW0+CisgICAgICA8SXRlbT5TU0xfREhFX1JTQV9XSVRIX0RFU19DQkNfU0hBPC9JdGVtPgorICAgICAgPEl0ZW0+U1NMX0RIRV9EU1NfV0lUSF9ERVNfQ0JDX1NIQTwvSXRlbT4KKyAgICAgIDxJdGVtPlNTTF9SU0FfRVhQT1JUX1dJVEhfUkM0XzQwX01ENTwvSXRlbT4KKyAgICAgIDxJdGVtPlNTTF9SU0FfRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQTwvSXRlbT4KKyAgICAgIDxJdGVtPlNTTF9ESEVfUlNBX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEE8L0l0ZW0+CisgICAgICA8SXRlbT5TU0xfREhFX0RTU19FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBPC9JdGVtPgorICAgIDwvQXJyYXk+CisgIDwvU2V0PgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gQ3JlYXRlIGEgVExTIHNwZWNpZmljIEh0dHBDb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSAgICAgICAgLS0+CisgIDwhLS0gY29tbW9uIEh0dHBDb25maWd1cmF0aW9uIGRlZmluZWQgaW4gamV0dHkueG1sICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gQWRkIGEgU2VjdXJlUmVxdWVzdEN1c3RvbWl6ZXIgdG8gZXh0cmFjdCBjZXJ0aWZpY2F0ZSBhbmQgICAgLS0+CisgIDwhLS0gc2Vzc2lvbiBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxOZXcgaWQ9InNzbEh0dHBDb25maWciIGNsYXNzPSJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuSHR0cENvbmZpZ3VyYXRpb24iPgorICAgIDxBcmc+PFJlZiByZWZpZD0iaHR0cENvbmZpZyIvPjwvQXJnPgorICAgIDxDYWxsIG5hbWU9ImFkZEN1c3RvbWl6ZXIiPgorICAgICAgPEFyZz48TmV3IGNsYXNzPSJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuU2VjdXJlUmVxdWVzdEN1c3RvbWl6ZXIiLz48L0FyZz4KKyAgICA8L0NhbGw+CisgIDwvTmV3PgorCisgIDxTZXQgbmFtZT0iRXhjbHVkZVByb3RvY29scyI+CisgICAgICAgIDxBcnJheSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgICAgPEl0ZW0+U1NMdjM8L0l0ZW0+CisgICAgICAgIDxJdGVtPlNTTHYyPC9JdGVtPgorICAgICAgICA8L0FycmF5PgorICA8L1NldD4KKwkKKworPC9Db25maWd1cmU+CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9rZXlzdG9yZS9SRUFETUUudHh0IGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMva2V5c3RvcmUvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmJiZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMva2V5c3RvcmUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDE2IEBACitrZXl0b29sIC1nZW5rZXlwYWlyIC1rZXlzdG9yZSBjYXRhbG9nYmUuamtzIC1hbGlhcyBjYXRhbG9nYmUgLWtleXBhc3MgQWExMjM0NTYgLXN0b3JlcGFzcyBBYTEyMzQ1NiAgLWtleWFsZyBSU0EgLWtleXNpemUgMjA0OCAgLXZhbGlkaXR5IDM2NTAgLWRuYW1lICJDTj1DYXRhbG9nIEJFLCBPVT1EZXZlbG9wbWVudCwgTz1BVCZULCBMPVRMViwgQz1JTCIKKworCiszNjUwIOKAkyAxMCB5ZWFycyB2YWxpZGl0eQorRXlhbCBTb2ZlciDigJMgY3JlYXRvciAKK0RldmVsb3BtZW50IOKAkyBPcmdhbml6YXRpb24gdW5pdAorQVQmVCDigJMgT3JnYW5pemF0aW9uCitUTFYtIENpdHkKK0lMIOKAkyBDb3VudHJ5IGNvZGUKKworCitjYXRhbG9nYmUuamtzIOKAkyBuYW1lIG9mIGtleXN0b3JlCitBYTEyMzQ1NiAtIHBhc3N3b3JkCisKKyNJbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgcGFzc3dvcmQgT0JGOi4uLiwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKK2phdmEgLWNwIC4uL2pldHR5LWRpc3RyaWJ1dGlvbi05LjIuNy52MjAxNTAxMTYvbGliL2pldHR5LWh0dHAtOS4yLjcudjIwMTUwMTE2LmphcjouLi9qZXR0eS1kaXN0cmlidXRpb24tOS4yLjcudjIwMTUwMTE2L2xpYi9qZXR0eS11dGlsLTkuMi43LnYyMDE1MDExNi5qYXIgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eS5QYXNzd29yZCBBYTEyMzQ1NgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2tleXN0b3JlL2NhdGFsb2diZS5qa3MgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9rZXlzdG9yZS9jYXRhbG9nYmUuamtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTNhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9rZXlzdG9yZS9jYXRhbG9nYmUuamtzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2tleXN0b3JlL2NhdGFsb2diZS5qa3MucHdkIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMva2V5c3RvcmUvY2F0YWxvZ2JlLmprcy5wd2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExM2Q3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2tleXN0b3JlL2NhdGFsb2diZS5qa3MucHdkCkBAIC0wLDAgKzEgQEAKK09CRjoxY3A2MWl1ajE5NHMxOTR1MTk0dzE5NHkxaXMzMWNvawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3BvcnRhbC5wcm9wZXJ0aWVzIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9ydGFsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhZTBkYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3BvcnRhbC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjUgQEAKKyMgUG9ydGFsIFJFU1QgVVJMLCBlbmRzICIvYXV4YXBpIgorZWNvbXBfcmVzdF91cmwgPSBodHRwczovL2xvY2FsaG9zdC9lY29tcHBvcnRhbC9hdXhhcGkKKyAKKyMgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UKK3BvcnRhbC5hcGkuaW1wbC5jbGFzcyA9IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmVjb21wLkVjb21wSW50SW1wbAorCisjIENTUC1TU08gVVJMCitlY29tcF9yZWRpcmVjdF91cmwgPSBodHRwczovL2xvY2FsaG9zdC9lY29tcF9wb3J0YWxfaXN0L2Vjb21wcG9ydGFsL3Byb2Nlc3NfY3NwIAorIyBDb29raWUgc2V0IGJ5IENTUC1TU08KK2NzcF9jb29raWVfbmFtZSA9IGF0dEVTU2VjCisjIENTUCBzZXR0aW5nLCBtb3N0IHVzZSBQUk9EOyBERVYgYWxzbyByZWNvZ25pemVkCitjc3BfZ2F0ZV9rZWVwZXJfcHJvZF9rZXkgPSBQUk9ECisKKyMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVUVCIHNlcnZlciBuYW1lcwordWViX3VybF9saXN0ID0gCisjIFVFQiB0b3BpYyB3aGVyZSBQb3J0YWwgbGlzdGVucworZWNvbXBfcG9ydGFsX2luYm94X25hbWUgPSBFQ09NUC1QT1JUQUwtSU5CT1gtVEVTVAorIyBVRUIga2V5IGdlbmVyYXRlZCB3aGlsZSBvbi1ib2FyZGluZwordWViX2FwcF9rZXkgPSBhcHBfa2V5X2hlcmUKKyMgVUVCIHNlY3JldCBnZW5lcmF0ZWQgd2hpbGUgb24tYm9hcmRpbmcKK3VlYl9hcHBfc2VjcmV0ID0gYXBwX3NlY3JldF9oZXJlCisjIFVFQiB0b3BpYyB3aGVyZSBBcHAgbGlzdGVucwordWViX2FwcF9tYWlsYm94X25hbWUgPSBhcHBfdG9waWNfbmFtZV9oZXJlCisjIENvbnN1bWVyIGdyb3VwIG5hbWU7IG1vc3QgQXBwcyBzaG91bGQgdXNlIHtVVUlEfQordWViX2FwcF9jb25zdW1lcl9ncm91cF9uYW1lID0ge1VVSUR9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0Q2F0ZWdvcnlUeXBlcy5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydENhdGVnb3J5VHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydENhdGVnb3J5VHlwZXMucHkKQEAgLTAsMCArMSw3NCBAQAoraW1wb3J0IHB5Y3VybAoraW1wb3J0IHN5cywgZ2V0b3B0Citmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IGpzb24KK2ltcG9ydCBjb3B5Citmcm9tIGltcG9ydE5vcm1hdGl2ZUVsZW1lbnRzIGltcG9ydCBjcmVhdGVOb3JtYXRpdmVFbGVtZW50CisKK2Zyb20gaW1wb3J0Q29tbW9uIGltcG9ydCAqCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIEltcG9ydCBhbGwgdXNlcnMgZnJvbSBhIGdpdmVuIGZpbGUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQkKKyMgYWN0aXZhdGlvbiA6CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCisjICAgICAgIHB5dGhvbiBpbXBvcnRVc2Vycy5weSBbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0gICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAJICAgIwkJCQorIyBzaG9ydGVzdCBhY3RpdmF0aW9uIChiZSBob3N0ID0gbG9jYWxob3N0LCBiZSBwb3J0ID0gODA4MCk6IAkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkJCQkJCQkJCQkJCQkJCQkgICAgICAgIworIwkJcHl0aG9uIGltcG9ydFVzZXJzLnB5IFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdCQkJCQkJCQkJCQkJIAkJCQkgICAgICAgICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIHVzYWdlKCk6CisJcHJpbnQgc3lzLmFyZ3ZbMF0sICdbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy11IDx1c2VyIHVzZXJJZD4gfCAtLXVzZXI9PHVzZXIgdXNlcklkPiBdJworCisKK2RlZiBpbXBvcnRDYXRlZ29yaWVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGV4aXRPblN1Y2Nlc3MsIGZpbGVEaXIpOgorCXJlc3VsdCA9IGNyZWF0ZU5vcm1hdGl2ZUVsZW1lbnQoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZURpciwgIi9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2NhdGVnb3JpZXMiLCAiY2F0ZWdvcnlUeXBlcyIsICJjYXRlZ29yaWVzWmlwIikKKworCXByaW50RnJhbWVMaW5lKCkKKyAgICAgICAgcHJpbnROYW1lQW5kUmV0dXJuQ29kZShyZXN1bHRbMF0sIHJlc3VsdFsxXSkKKyAgICAgICAgcHJpbnRGcmFtZUxpbmUoKQorCisgICAgICAgIGlmICggcmVzdWx0WzFdID09IE5vbmUgb3IgcmVzdWx0WzFdIG5vdCBpbiBbMjAwLCAyMDEsIDQwOV0gKToKKyAgICAgICAgICAgICAgICBlcnJvckFuZEV4aXQoMSwgTm9uZSkKKyAgICAgICAgZWxzZToKKwkJaWYgKGV4aXRPblN1Y2Nlc3MgPT0gVHJ1ZSk6CisgICAgICAgICAgICAgICAgCWVycm9yQW5kRXhpdCgwLCBOb25lKQorCitkZWYgbWFpbihhcmd2KToKKwlwcmludCAnTnVtYmVyIG9mIGFyZ3VtZW50czonLCBsZW4oc3lzLmFyZ3YpLCAnYXJndW1lbnRzLicKKworCWJlSG9zdCA9ICdsb2NhbGhvc3QnIAorCWJlUG9ydCA9ICc4MDgwJworCWFkbWluVXNlciA9ICdqaDAwMDMnCisKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDp1Omg6IixbImlwPSIsInBvcnQ9IiwidXNlcj0iXSkKKwlleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorCQl1c2FnZSgpCisJCWVycm9yQW5kRXhpdCgyLCAnSW52YWxpZCBpbnB1dCcpCisJCSAKKwlmb3Igb3B0LCBhcmcgaW4gb3B0czoKKwkjcHJpbnQgb3B0LCBhcmcKKwkJaWYgb3B0ID09ICctaCc6CisJCQl1c2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzeXMuZXhpdCgzKQorCQllbGlmIG9wdCBpbiAoIi1pIiwgIi0taXAiKToKKwkJCWJlSG9zdCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1wIiwgIi0tcG9ydCIpOgorCQkJYmVQb3J0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXUiLCAiLS11c2VyIik6CisJCQlhZG1pblVzZXIgPSBhcmcKKworCXByaW50ICdiZSBob3N0ID0nLGJlSG9zdCwnLCBiZSBwb3J0ID0nLCBiZVBvcnQsJywgdXNlciA9JywgYWRtaW5Vc2VyCisJCisJaWYgKCBiZUhvc3QgPT0gTm9uZSApOgorCQl1c2FnZSgpCisJCXN5cy5leGl0KDMpCisKKwlpbXBvcnRDYXRlZ29yaWVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIFRydWUsICIuLi8uLi8uLi9pbXBvcnQvdG9zY2EvY2F0ZWdvcmllcy8iKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRDb21tb24ucHkgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRDb21tb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkYjA2NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydENvbW1vbi5weQpAQCAtMCwwICsxLDQzIEBACitpbXBvcnQgcHljdXJsCitpbXBvcnQgc3lzLCBnZXRvcHQKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQganNvbgoraW1wb3J0IGNvcHkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVidWdGbGFnID0gVHJ1ZQorCitkZWYgam9pbl9zdHJpbmdzKGxzdCk6CisgICAgY29uY2F0ID0gIiIKKyAgICBmb3Igc3RyaW5nIGluIGxzdDoKKwlpZiAoc3RyaW5nICE9IE5vbmUpOgorCQlpZiAodHlwZShzdHJpbmcpID09IGludCk6CisJCQlzdHJpbmcgPSBzdHIoc3RyaW5nKQorICAgICAgICAJY29uY2F0ICs9IChzdHJpbmcgKyAiICIpCisgICAgcmV0dXJuIGNvbmNhdAorCitkZWYgZGVidWcoZGVzYywgKmFyZ3MpOgorCSdwcmludCBvbmx5IGlmIGRlYnVnIGVuYWJsZWQnCisJaWYgKGRlYnVnRmxhZyA9PSBUcnVlKTogCisJCXByaW50IGRlc2MsIGpvaW5fc3RyaW5ncyhhcmdzKSAgCisKK2RlZiBsb2coZGVzYywgYXJnPU5vbmUpOgorCSdwcmludCBsb2cgaW5mbycKKwlwcmludCBkZXNjLCBhcmcgIAorCitkZWYgZXJyb3JBbmRFeGl0KGVycm9yQ29kZSwgZXJyb3JEZXNjKToKKwlpZiAoIGVycm9yQ29kZSA+IDAgKToKKwkJcHJpbnQgInN0YXR1cz17MH0uIHsxfSIuZm9ybWF0KGVycm9yQ29kZSwgJycgaWYgZXJyb3JEZXNjID09IE5vbmUgZWxzZSBlcnJvckRlc2MpIAorCWVsc2U6CisJCXByaW50ICJzdGF0dXM9ezB9Ii5mb3JtYXQoZXJyb3JDb2RlKQorCXN5cy5leGl0KGVycm9yQ29kZSkKKworZGVmIHByaW50TmFtZUFuZFJldHVybkNvZGUobmFtZSwgY29kZSk6CisJcHJpbnQgInswOjMwfSB8IHsxOjZ9Ii5mb3JtYXQobmFtZSwgY29kZSkJCisKK2RlZiBwcmludEZyYW1lTGluZSgpOgorCXByaW50ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgkKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydERhdGFUeXBlcy5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydERhdGFUeXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdmNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0RGF0YVR5cGVzLnB5CkBAIC0wLDAgKzEsNzQgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorZnJvbSBpbXBvcnROb3JtYXRpdmVFbGVtZW50cyBpbXBvcnQgY3JlYXRlTm9ybWF0aXZlRWxlbWVudAorCitmcm9tIGltcG9ydENvbW1vbiBpbXBvcnQgKgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyBJbXBvcnQgdG9zY2EgZGF0YSB0eXBlcwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIworIyAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQorIyBhY3RpdmF0aW9uIDoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgICAgICAgcHl0aG9uIGltcG9ydERhdGFUeXBlcy5weSBbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0gICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAJICAgIwkJCQorIyBzaG9ydGVzdCBhY3RpdmF0aW9uIChiZSBob3N0ID0gbG9jYWxob3N0LCBiZSBwb3J0ID0gODA4MCk6IAkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkJCQkJCQkJCQkJCQkJCQkgICAgICAgIworIwkJcHl0aG9uIGltcG9ydERhdGFUeXBlcy5weSBbLWYgPGlucHV0IGZpbGU+IHwgLS1pZmlsZT08aW5wdXQgZmlsZT4gXQkJCQkJCQkJCQkJCSAJCQkJICAgICAgICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiB1c2FnZSgpOgorCXByaW50IHN5cy5hcmd2WzBdLCAnWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstdSA8dXNlciB1c2VySWQ+IHwgLS11c2VyPTx1c2VyIHVzZXJJZD4gXScKKworCitkZWYgaW1wb3J0RGF0YVR5cGVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGV4aXRPblN1Y2Nlc3MsIGZpbGVEaXIpOgorCXJlc3VsdCA9IGNyZWF0ZU5vcm1hdGl2ZUVsZW1lbnQoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZURpciwgIi9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2RhdGF0eXBlcyIsICJkYXRhVHlwZXMiLCAiZGF0YVR5cGVzWmlwIikKKworCXByaW50RnJhbWVMaW5lKCkKKyAgICAgICAgcHJpbnROYW1lQW5kUmV0dXJuQ29kZShyZXN1bHRbMF0sIHJlc3VsdFsxXSkKKyAgICAgICAgcHJpbnRGcmFtZUxpbmUoKQorCisgICAgICAgIGlmICggcmVzdWx0WzFdID09IE5vbmUgb3IgcmVzdWx0WzFdIG5vdCBpbiBbMjAwLCAyMDEsIDQwOV0gKToKKyAgICAgICAgICAgICAgICBlcnJvckFuZEV4aXQoMSwgTm9uZSkKKyAgICAgICAgZWxzZToKKwkJaWYgKGV4aXRPblN1Y2Nlc3MgPT0gVHJ1ZSk6CisgICAgICAgICAgICAgICAgCWVycm9yQW5kRXhpdCgwLCBOb25lKQorCitkZWYgbWFpbihhcmd2KToKKwlwcmludCAnTnVtYmVyIG9mIGFyZ3VtZW50czonLCBsZW4oc3lzLmFyZ3YpLCAnYXJndW1lbnRzLicKKworCWJlSG9zdCA9ICdsb2NhbGhvc3QnIAorCWJlUG9ydCA9ICc4MDgwJworCWFkbWluVXNlciA9ICdqaDAwMDMnCisKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDp1Omg6IixbImlwPSIsInBvcnQ9IiwidXNlcj0iXSkKKwlleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorCQl1c2FnZSgpCisJCWVycm9yQW5kRXhpdCgyLCAnSW52YWxpZCBpbnB1dCcpCisJCSAKKwlmb3Igb3B0LCBhcmcgaW4gb3B0czoKKwkjcHJpbnQgb3B0LCBhcmcKKwkJaWYgb3B0ID09ICctaCc6CisJCQl1c2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzeXMuZXhpdCgzKQorCQllbGlmIG9wdCBpbiAoIi1pIiwgIi0taXAiKToKKwkJCWJlSG9zdCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1wIiwgIi0tcG9ydCIpOgorCQkJYmVQb3J0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXUiLCAiLS11c2VyIik6CisJCQlhZG1pblVzZXIgPSBhcmcKKworCXByaW50ICdiZSBob3N0ID0nLGJlSG9zdCwnLCBiZSBwb3J0ID0nLCBiZVBvcnQsJywgdXNlciA9JywgYWRtaW5Vc2VyCisJCisJaWYgKCBiZUhvc3QgPT0gTm9uZSApOgorCQl1c2FnZSgpCisJCXN5cy5leGl0KDMpCisKKwlpbXBvcnREYXRhVHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgVHJ1ZSwgIi4uLy4uLy4uL2ltcG9ydC90b3NjYS9kYXRhLXR5cGVzLyIpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgbWFpbihzeXMuYXJndlsxOl0pCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydEdyb3VwVHlwZXMucHkgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRHcm91cFR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmE1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRHcm91cFR5cGVzLnB5CkBAIC0wLDAgKzEsNzQgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorZnJvbSBpbXBvcnROb3JtYXRpdmVFbGVtZW50cyBpbXBvcnQgY3JlYXRlTm9ybWF0aXZlRWxlbWVudAorCitmcm9tIGltcG9ydENvbW1vbiBpbXBvcnQgKgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyBJbXBvcnQgdG9zY2EgZGF0YSB0eXBlcwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIworIyAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQorIyBhY3RpdmF0aW9uIDoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgICAgICAgcHl0aG9uIGltcG9ydEdyb3VwVHlwZXMucHkgWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgCSAgICMJCQkKKyMgc2hvcnRlc3QgYWN0aXZhdGlvbiAoYmUgaG9zdCA9IGxvY2FsaG9zdCwgYmUgcG9ydCA9IDgwODApOiAJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQkJCQkJCQkJCQkJCQkJICAgICAgICMKKyMJCXB5dGhvbiBpbXBvcnRHcm91cFR5cGVzLnB5IFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdCQkJCQkJCQkJCQkJIAkJCQkgICAgICAgICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIHVzYWdlKCk6CisJcHJpbnQgc3lzLmFyZ3ZbMF0sICdbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy11IDx1c2VyIHVzZXJJZD4gfCAtLXVzZXI9PHVzZXIgdXNlcklkPiBdJworCisKK2RlZiBpbXBvcnRHcm91cFR5cGVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGV4aXRPblN1Y2Nlc3MsIGZpbGVEaXIpOgorCXJlc3VsdCA9IGNyZWF0ZU5vcm1hdGl2ZUVsZW1lbnQoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZURpciwgIi9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2dyb3VwdHlwZXMiLCAiZ3JvdXBUeXBlcyIsICJncm91cFR5cGVzWmlwIikKKworCXByaW50RnJhbWVMaW5lKCkKKyAgICAgICAgcHJpbnROYW1lQW5kUmV0dXJuQ29kZShyZXN1bHRbMF0sIHJlc3VsdFsxXSkKKyAgICAgICAgcHJpbnRGcmFtZUxpbmUoKQorCisgICAgICAgIGlmICggcmVzdWx0WzFdID09IE5vbmUgb3IgcmVzdWx0WzFdIG5vdCBpbiBbMjAwLCAyMDEsIDQwOV0gKToKKyAgICAgICAgICAgICAgICBlcnJvckFuZEV4aXQoMSwgTm9uZSkKKyAgICAgICAgZWxzZToKKwkJaWYgKGV4aXRPblN1Y2Nlc3MgPT0gVHJ1ZSk6CisgICAgICAgICAgICAgICAgCWVycm9yQW5kRXhpdCgwLCBOb25lKQorCitkZWYgbWFpbihhcmd2KToKKwlwcmludCAnTnVtYmVyIG9mIGFyZ3VtZW50czonLCBsZW4oc3lzLmFyZ3YpLCAnYXJndW1lbnRzLicKKworCWJlSG9zdCA9ICdsb2NhbGhvc3QnIAorCWJlUG9ydCA9ICc4MDgwJworCWFkbWluVXNlciA9ICdqaDAwMDMnCisKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDp1Omg6IixbImlwPSIsInBvcnQ9IiwidXNlcj0iXSkKKwlleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorCQl1c2FnZSgpCisJCWVycm9yQW5kRXhpdCgyLCAnSW52YWxpZCBpbnB1dCcpCisJCSAKKwlmb3Igb3B0LCBhcmcgaW4gb3B0czoKKwkjcHJpbnQgb3B0LCBhcmcKKwkJaWYgb3B0ID09ICctaCc6CisJCQl1c2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzeXMuZXhpdCgzKQorCQllbGlmIG9wdCBpbiAoIi1pIiwgIi0taXAiKToKKwkJCWJlSG9zdCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1wIiwgIi0tcG9ydCIpOgorCQkJYmVQb3J0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXUiLCAiLS11c2VyIik6CisJCQlhZG1pblVzZXIgPSBhcmcKKworCXByaW50ICdiZSBob3N0ID0nLGJlSG9zdCwnLCBiZSBwb3J0ID0nLCBiZVBvcnQsJywgdXNlciA9JywgYWRtaW5Vc2VyCisJCisJaWYgKCBiZUhvc3QgPT0gTm9uZSApOgorCQl1c2FnZSgpCisJCXN5cy5leGl0KDMpCisKKwlpbXBvcnRHcm91cFR5cGVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIFRydWUsICIuLi8uLi8uLi9pbXBvcnQvdG9zY2EvZ3JvdXAtdHlwZXMvIikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICAgICBtYWluKHN5cy5hcmd2WzE6XSkKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0SGVhdFR5cGVzLnB5IGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0SGVhdFR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWFjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRIZWF0VHlwZXMucHkKQEAgLTAsMCArMSwxMTMgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorZnJvbSBpbXBvcnRDb21tb24gaW1wb3J0ICoKK2Zyb20gaW1wb3J0Tm9ybWF0aXZlVHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBpbXBvcnRDb21tb24KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyBJbXBvcnQgYWxsIHVzZXJzIGZyb20gYSBnaXZlbiBmaWxlCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCisjIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkJCisjIGFjdGl2YXRpb24gOgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIworIyAgICAgICBweXRob24gaW1wb3J0VXNlcnMucHkgWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgCSAgICMJCQkKKyMgc2hvcnRlc3QgYWN0aXZhdGlvbiAoYmUgaG9zdCA9IGxvY2FsaG9zdCwgYmUgcG9ydCA9IDgwODApOiAJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMJCXB5dGhvbiBpbXBvcnRVc2Vycy5weSBbLWYgPGlucHV0IGZpbGU+IHwgLS1pZmlsZT08aW5wdXQgZmlsZT4gXQkJCQkJCQkJCQkJCSAJCQkJICAgICAgICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBpbXBvcnRIZWF0VHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZURpciwgdXBkYXRldmVyc2lvbik6CisJCisJaGVhdFR5cGVzID0gWyAiY2luZGVyVm9sdW1lIiwKKyMJCQkJICAiY29udHJhaWxWaXJ0dWFsTmV0d29yayIsCisJCQkJICAibmV1dHJvbk5ldCIsCisJCQkJICAibmV1dHJvblBvcnQiLAorCQkJCSAgIm5vdmFTZXJ2ZXIiLAorCQkJCSAgInZsIiwKKwkJCQkgICJlbGluZSIsCisJCQkJICAiYWJzdHJhY3RTdWJzdGl0dXRlIiwKKyMJCQkJICAiY29udHJhaWxOZXR3b3JrUnVsZXMiLAorIwkJCQkgICJjb250cmFpbFBvcnQiLAorIwkJCQkgICJjb250cmFpbFYyTmV0d29ya1J1bGVzIiwKKyMJCQkJICAiY29udHJhaWxWMlZpcnR1YWxOZXR3b3JrIiwKKwkJCQkgICJzZWN1cml0eVJ1bGVzIgorIwkJCQkgICJjb250cmFpbEFic3RyYWN0U3Vic3RpdHV0ZSIsCisjCQkJCSAgImNvbnRyYWlsQ29tcHV0ZSIsCisjCQkJCSAgImNvbnRyYWlsVjJWaXJ0dWFsTWFjaGluZUludGVyZmFjZSIKKwkJCQkgIF0KKwkJCisJcmVzcG9uc2VDb2RlcyA9IFsyMDAsIDIwMV0KKwkJCisJaWYodXBkYXRldmVyc2lvbiA9PSAnZmFsc2UnKToKKwkJcmVzcG9uc2VDb2RlcyA9IFsyMDAsIDIwMSwgNDA5XQorCQkKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciBoZWF0VHlwZSBpbiBoZWF0VHlwZXM6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlRGlyLCBoZWF0VHlwZSwgdXBkYXRldmVyc2lvbikKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQpCisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHRbMV0gPT0gTm9uZSBvciByZXN1bHRbMV0gbm90IGluIHJlc3BvbnNlQ29kZXMpIDoKKwkJCXByaW50ICJGYWlsZWQgY3JlYXRpbmcgaGVhdCB0eXBlICIgKyBoZWF0VHlwZSArICIuICIgKyBzdHIocmVzdWx0WzFdKSAJCQkJCisJcmV0dXJuIHJlc3VsdHMJCisKKworZGVmIG1haW4oYXJndik6CisJcHJpbnQgJ051bWJlciBvZiBhcmd1bWVudHM6JywgbGVuKHN5cy5hcmd2KSwgJ2FyZ3VtZW50cy4nCisKKwliZUhvc3QgPSAnbG9jYWxob3N0JyAKKwliZVBvcnQgPSAnODA4MCcKKwlhZG1pblVzZXIgPSAnamgwMDAzJworCXVwZGF0ZXZlcnNpb24gPSAndHJ1ZScKKwkKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDp1OnY6aDoiLFsiaXA9IiwicG9ydD0iLCJ1c2VyPSIsInVwZGF0ZXZlcnNpb249Il0pCisJZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKwkJdXNhZ2UoKQorCQllcnJvckFuZEV4aXQoMiwgJ0ludmFsaWQgaW5wdXQnKQorCQkgCisJZm9yIG9wdCwgYXJnIGluIG9wdHM6CisJI3ByaW50IG9wdCwgYXJnCisJCWlmIG9wdCA9PSAnLWgnOgorCQkJdXNhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc3lzLmV4aXQoMykKKwkJZWxpZiBvcHQgaW4gKCItaSIsICItLWlwIik6CisJCQliZUhvc3QgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItcCIsICItLXBvcnQiKToKKwkJCWJlUG9ydCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi11IiwgIi0tdXNlciIpOgorCQkJYWRtaW5Vc2VyID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXYiLCAiLS11cGRhdGV2ZXJzaW9uIik6CisJCQlpZiAoYXJnLmxvd2VyKCkgPT0gImZhbHNlIiBvciBhcmcubG93ZXIoKSA9PSAibm8iKToKKwkJCQl1cGRhdGV2ZXJzaW9uID0gJ2ZhbHNlJworCisJcHJpbnQgJ2JlIGhvc3QgPScsYmVIb3N0LCcsIGJlIHBvcnQgPScsIGJlUG9ydCwnLCB1c2VyID0nLCBhZG1pblVzZXIKKwkKKwlpZiAoIGJlSG9zdCA9PSBOb25lICk6CisJCXVzYWdlKCkKKwkJc3lzLmV4aXQoMykKKworCXJlc3VsdHMgPSBpbXBvcnRIZWF0VHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgIi4uLy4uLy4uL2ltcG9ydC90b3NjYS9oZWF0LXR5cGVzLyIsIHVwZGF0ZXZlcnNpb24pCisKKwlwcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJZm9yIHJlc3VsdCBpbiByZXN1bHRzOgorCQlwcmludCAiezA6MjB9IHwgezE6Nn0iLmZvcm1hdChyZXN1bHRbMF0sIHJlc3VsdFsxXSkKKwlwcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCisJcmVzcG9uc2VDb2RlcyA9IFsyMDAsIDIwMV0KKwkKKwlpZih1cGRhdGV2ZXJzaW9uID09ICdmYWxzZScpOgorCQlyZXNwb25zZUNvZGVzID0gWzIwMCwgMjAxLCA0MDldCisJCisJZmFpbGVkTm9ybWF0aXZlcyA9IGZpbHRlcihsYW1iZGEgeDogeFsxXSA9PSBOb25lIG9yIHhbMV0gbm90IGluIHJlc3BvbnNlQ29kZXMsIHJlc3VsdHMpCisJaWYgKGxlbihmYWlsZWROb3JtYXRpdmVzKSA+IDApOgorCQllcnJvckFuZEV4aXQoMSwgTm9uZSkKKwllbHNlOgorCQllcnJvckFuZEV4aXQoMCwgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICAgICBtYWluKHN5cy5hcmd2WzE6XSkKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnROb2RlVHlwZS5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vZGVUeXBlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNWNjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnROb2RlVHlwZS5weQpAQCAtMCwwICsxLDE1NiBAQAoraW1wb3J0IHB5Y3VybAoraW1wb3J0IHN5cywgZ2V0b3B0LCBvcworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorZnJvbSBpbXBvcnRDb21tb24gaW1wb3J0ICoKK2ltcG9ydCBpbXBvcnRDb21tb24KK2ltcG9ydCB6aXBmaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIGNyZWF0ZVppcEZyb21ZbWwoeW1sRmlsZSwgemlwRmlsZSk6CisJemlwID0gemlwZmlsZS5aaXBGaWxlKHppcEZpbGUsICd3JywgemlwZmlsZS5aSVBfREVGTEFURUQpCisJCisgICAgCXppcC53cml0ZSh5bWxGaWxlLCBvcy5wYXRoLmJhc2VuYW1lKHltbEZpbGUpKSAKKwl6aXAuY2xvc2UoKQorCitkZWYgY3JlYXRlVXNlck5vcm1hdGl2ZVR5cGUoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZURpciwgRUxFTUVOVF9OQU1FKToKKwkKKwl0cnk6CisJCWxvZygiaW4gY3JlYXRlIG5vcm1hdGl2ZSB0eXBlICIsIEVMRU1FTlRfTkFNRSkKKwkJZGVidWcoInVzZXJJZCIsIGFkbWluVXNlcikKKwkJZGVidWcoImZpbGVEaXIiLCBmaWxlRGlyKQorCQkKKwkJYnVmZmVyID0gU3RyaW5nSU8oKQorCQljID0gcHljdXJsLkN1cmwoKQorCisJCXVybCA9ICdodHRwOi8vJyArIGJlSG9zdCArICc6JyArIGJlUG9ydCArICcvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL211bHRpcGFydCcKKwkJYy5zZXRvcHQoYy5VUkwsIHVybCkKKwkJYy5zZXRvcHQoYy5QT1NULCAxKQkJCisKKwkJYWRtaW5IZWFkZXIgPSAnVVNFUl9JRDogJyArIGFkbWluVXNlcgorCQkjYy5zZXRvcHQocHljdXJsLkhUVFBIRUFERVIsIFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJywgJ0FjY2VwdDogYXBwbGljYXRpb24vanNvbicsIGFkbWluSGVhZGVyXSkKKwkJYy5zZXRvcHQocHljdXJsLkhUVFBIRUFERVIsIFthZG1pbkhlYWRlcl0pCisKKwkJeW1sRmlsZSA9IGZpbGVEaXIgKyBFTEVNRU5UX05BTUUgKyAiL25vcm1hdGl2ZS10eXBlcy1uZXctIiArIEVMRU1FTlRfTkFNRSArICIueW1sIgorCQl6aXBGaWxlID0gZmlsZURpciArIEVMRU1FTlRfTkFNRSArICIvbm9ybWF0aXZlLXR5cGVzLW5ldy0iICsgRUxFTUVOVF9OQU1FICsgIi56aXAiCisJCWRlYnVnKHltbEZpbGUpCisJCWRlYnVnKHppcEZpbGUpCisJCXBhdGggPSB6aXBGaWxlIAorCQlkZWJ1ZygicGF0aD0iICsgcGF0aCkKKyAgICAgICAgCUNVUlJFTlRfSlNPTl9GSUxFPWZpbGVEaXIgKyBFTEVNRU5UX05BTUUgKyAiLyIgKyBFTEVNRU5UX05BTUUgKyAiLmpzb24iCisJCWRlYnVnKENVUlJFTlRfSlNPTl9GSUxFKQorCQlqc29uRmlsZSA9IG9wZW4oQ1VSUkVOVF9KU09OX0ZJTEUpCisJCQorCQlkZWJ1ZygiYmVmb3JlIGxvYWQganNvbiIpCisJCWpzb25fZGF0YSA9IGpzb24ubG9hZChqc29uRmlsZSwgc3RyaWN0PUZhbHNlKQorCQlkZWJ1Zyhqc29uX2RhdGEpCisJCisJCWpzb25Bc1N0ciA9IGpzb24uZHVtcHMoanNvbl9kYXRhKQorCQlkZWJ1ZyhwYXRoKQorCQlzZW5kID0gWygncmVzb3VyY2VNZXRhZGF0YScsIGpzb25Bc1N0ciksICgncmVzb3VyY2VaaXAnLCAocHljdXJsLkZPUk1fRklMRSwgcGF0aCkpXQorCQlkZWJ1ZyhzZW5kKQorCQljLnNldG9wdChweWN1cmwuSFRUUFBPU1QsIHNlbmQpCQkKKworCQljLnNldG9wdChjLldSSVRFRlVOQ1RJT04sIGJ1ZmZlci53cml0ZSkKKwkJcmVzID0gYy5wZXJmb3JtKCkKKwkKKwkJI3ByaW50KCJCZWZvcmUgZ2V0IHJlc3BvbnNlIGNvZGUiKQkKKwkJaHR0cFJlcyA9IGMuZ2V0aW5mbyhjLlJFU1BPTlNFX0NPREUpCisJCWlmIChodHRwUmVzICE9IE5vbmUpOgorCQkJZGVidWcoImh0dHAgcmVzcG9uc2U9IiwgaHR0cFJlcykKKwkJI3ByaW50KCdTdGF0dXM6ICcgKyBzdHIocmVzcG9uc2VDb2RlKSkKKwkJZGVidWcoYnVmZmVyLmdldHZhbHVlKCkpCisJCWMuY2xvc2UoKQorCisJCXJldHVybiAoRUxFTUVOVF9OQU1FLCBodHRwUmVzLCBidWZmZXIuZ2V0dmFsdWUoKSkKKworCWV4Y2VwdCBFeGNlcHRpb24gYXMgaW5zdDoKKwkJcHJpbnQoIkVSUk9SPSIgKyBzdHIoaW5zdCkpCisJCXJldHVybiAoRUxFTUVOVF9OQU1FLCBOb25lLCBOb25lKQkJCQkKKworCitkZWYgdXNhZ2UoKToKKwlwcmludCBzeXMuYXJndlswXSwgJ1staSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLXUgPHVzZXIgdXNlcklkPiB8IC0tdXNlcj08dXNlciB1c2VySWQ+IF0gWy1sIDxkaXJlY3RvcnkgYmFzZSBsb2NhdGlvbj4gfCAtLWxvY2F0aW9uPTxkaXJlY3RvcnkgYmFzZSBsb2NhdGlvbj5dIFstZSA8ZWxlbWVudCBuYW1lPiB8IC0tZWxlbWVudD08ZWxlbWVudCBuYW1lPl0nCisJcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tIEV4YW1wbGUgLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlwcmludCAicHl0aG9uIGltcG9ydE5vZGVUeXBlLnB5IC1kIGZhbHNlIC1sICAvaG9tZS92YWdyYW50L2NhdGFsb2ctYmUtMTYwNC4wLjIuMTUuNi1TTkFQU0hPVC9zY3JpcHRzL2ltcG9ydC90b3NjYS8uLi8uLi8uLi9pbXBvcnQvdG9zY2EvdXNlci1ub3JtYXRpdmUtdHlwZXMvIC1lIHJvb3QxIgorCitkZWYgbWFpbihhcmd2KToKKwlwcmludCAnTnVtYmVyIG9mIGFyZ3VtZW50czonLCBsZW4oc3lzLmFyZ3YpLCAnYXJndW1lbnRzLicKKworCWJlSG9zdCA9ICdsb2NhbGhvc3QnIAorCWJlUG9ydCA9ICc4MDgwJworCWFkbWluVXNlciA9ICdqaDAwMDMnCisJZGVidWdmID0gTm9uZQorCWxvY2F0aW9uID0gTm9uZQorCWVsZW1lbnQgPSBOb25lCisKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDp1OmQ6bDplOmgiLFsiaXA9IiwicG9ydD0iLCJ1c2VyPSIsImxvY2F0aW9uPSIsImVsZW1lbnQ9IiwgImRlYnVnPSJdKQorCWV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisJCXVzYWdlKCkKKwkJZXJyb3JBbmRFeGl0KDIsICdJbnZhbGlkIGlucHV0JykKKwkJIAorCWZvciBvcHQsIGFyZyBpbiBvcHRzOgorCSNwcmludCBvcHQsIGFyZworCQlpZiBvcHQgPT0gJy1oJzoKKwkJCXVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXN5cy5leGl0KDMpCisJCWVsaWYgb3B0IGluICgiLWkiLCAiLS1pcCIpOgorCQkJYmVIb3N0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXAiLCAiLS1wb3J0Iik6CisJCQliZVBvcnQgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItdSIsICItLXVzZXIiKToKKwkJCWFkbWluVXNlciA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1sIiwgIi0tbG9jYXRpb24iKToKKwkJCWxvY2F0aW9uID0gYXJnCisJCWVsaWYgb3B0IGluICgiLWUiLCAiLS1lbGVtZW50Iik6CisJCQllbGVtZW50ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLWQiLCAiLS1kZWJ1ZyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgYXJnCisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2YgPSBib29sKGFyZy5sb3dlcigpID09ICJ0cnVlIiBvciBhcmcubG93ZXIoKSA9PSAieWVzIikKKworCXByaW50ICdiZSBob3N0ID0nLGJlSG9zdCwnLCBiZSBwb3J0ID0nLCBiZVBvcnQsJywgdXNlciA9JywgYWRtaW5Vc2VyCisJCisJaWYgKCBiZUhvc3QgPT0gTm9uZSApOgorCQl1c2FnZSgpCisJCXN5cy5leGl0KDMpCisKKwlpZiAoZGVidWdmICE9IE5vbmUpOgorCQlwcmludCAnc2V0IGRlYnVnIG1vZGUgdG8gJyArIHN0cihkZWJ1Z2YpCisJCWltcG9ydENvbW1vbi5kZWJ1Z0ZsYWcgPSBkZWJ1Z2YKKworCWlmIChsb2NhdGlvbiA9PSBOb25lKToKKwkJcHJpbnQgJ01pc3NpbmcgZmlsZSBsb2NhdGlvbicKKwkJdXNhZ2UoKQorCQlzeXMuZXhpdCgzKQorCQkKKwlpZiAoZWxlbWVudCA9PSBOb25lKToKKwkJcHJpbnQgJ01pc3NpbmcgZWxlbWVudCBuYW1lLiBFLmcuIHJvb3QsIGNvbXB1dGUsIC4uLicKKwkJdXNhZ2UoKQorCQlzeXMuZXhpdCgzKQorCisJI3BhdGhkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChzeXMuYXJndlswXSkpCisKKwkjYmFzZUZpbGVMb2NhdGlvbiA9IHBhdGhkaXIgKyAiLy4uLy4uLy4uL2ltcG9ydC90b3NjYS8iCisgICAgICAgICNmaWxlRGlyID0gYmFzZUZpbGVMb2NhdGlvbiArICJ1c2VyLW5vcm1hdGl2ZS10eXBlcy8iCisJCisJI25vcm1hdGl2ZVR5cGUgPSAicm9vdDEiCQorCisJcmVzdWx0ID0gY3JlYXRlVXNlck5vcm1hdGl2ZVR5cGUoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgbG9jYXRpb24sIGVsZW1lbnQpCisJI3Jlc3VsdCA9IGNyZWF0ZVVzZXJOb3JtYXRpdmVUeXBlKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGZpbGVEaXIsIG5vcm1hdGl2ZVR5cGUpCisJcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlwcmludCAiezA6MzB9IHwgezE6Nn0iLmZvcm1hdChyZXN1bHRbMF0sIHJlc3VsdFsxXSkKKwlwcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCisJaWYgKCByZXN1bHRbMV0gPT0gTm9uZSBvciByZXN1bHRbMV0gbm90IGluIFsyMDAsIDIwMV0gKSA6CisJCXByaW50ICJGYWlsZWQgY3JlYXRpbmcgbm9ybWF0aXZlIHR5cGUgIiArIGVsZW1lbnQgKyAiLiAiICsgc3RyKHJlc3VsdFsxXSkgCQkJCQorCQllcnJvckFuZEV4aXQoMSwgTm9uZSkKKworCWVycm9yQW5kRXhpdCgwLCBOb25lKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICAgICBtYWluKHN5cy5hcmd2WzE6XSkKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0Tm9ybWF0aXZlQWxsLnB5IGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0Tm9ybWF0aXZlQWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWU5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnROb3JtYXRpdmVBbGwucHkKQEAgLTAsMCArMSwxMzUgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdCwgb3MKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQganNvbgoraW1wb3J0IGNvcHkKK2ltcG9ydCB0aW1lCisjZnJvbSBpbXBvcnROb3JtYXRpdmVFbGVtZW50cyBpbXBvcnQgY3JlYXRlTm9ybWF0aXZlRWxlbWVudAorZnJvbSBpbXBvcnROb3JtYXRpdmVFbGVtZW50cyBpbXBvcnQgKiAKK2Zyb20gaW1wb3J0Tm9ybWF0aXZlVHlwZXMgaW1wb3J0IGltcG9ydE5vcm1hdGl2ZVR5cGVzCitmcm9tIGltcG9ydEhlYXRUeXBlcyBpbXBvcnQgaW1wb3J0SGVhdFR5cGVzCitmcm9tIGltcG9ydE5vcm1hdGl2ZUNhcGFiaWxpdGllcyBpbXBvcnQgaW1wb3J0Tm9ybWF0aXZlQ2FwYWJpbGl0aWVzCitmcm9tIGltcG9ydENhdGVnb3J5VHlwZXMgaW1wb3J0IGltcG9ydENhdGVnb3JpZXMKK2Zyb20gaW1wb3J0Tm9ybWF0aXZlSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMgaW1wb3J0IGltcG9ydE5vcm1hdGl2ZUludGVyZmFjZUxpZmVjeWNsZVR5cGUKK2Zyb20gaW1wb3J0RGF0YVR5cGVzIGltcG9ydCBpbXBvcnREYXRhVHlwZXMKK2Zyb20gaW1wb3J0R3JvdXBUeXBlcyBpbXBvcnQgaW1wb3J0R3JvdXBUeXBlcworZnJvbSBpbXBvcnRQb2xpY3lUeXBlcyBpbXBvcnQgaW1wb3J0UG9saWN5VHlwZXMKK2Zyb20gaW1wb3J0Q29tbW9uIGltcG9ydCAqCitpbXBvcnQgaW1wb3J0Q29tbW9uCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgIAkJCQkJCQkJCQkJCQkjCQorIyBJbXBvcnQgYWxsIHVzZXJzIGZyb20gYSBnaXZlbiBmaWxlCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAJCQkJCQkJCQkJCQkJIworIyAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIAkJCQkJCQkJCQkJCQkjCQkKKyMgYWN0aXZhdGlvbiA6CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAJCQkJCQkJCQkJCQkJIworIyAgICAgICBweXRob24gaW1wb3J0Tm9ybWF0aXZlQWxsLnB5IFstaSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLXUgPHVzZXIgdXNlcklkPiB8IC0tdXNlcj08dXNlciB1c2VySWQ+IF0gWy1kIDx0cnVlfGZhbHNlPiB8IC0tZGVidWc9PHRydWV8ZmFsc2U+XSAJIworIwkJCQkJCQkJCSBbLXYgPHRydWV8ZmFsc2U+IHwgLS11cGRhdGV2ZXJzaW9uPTx0cnVlfGZhbHNlPl0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgCSAgIAkJCQkJCQkJCQkJCQkjCQkJCisjIHNob3J0ZXN0IGFjdGl2YXRpb24gKGJlIGhvc3QgPSBsb2NhbGhvc3QsIGJlIHBvcnQgPSA4MDgwLCB1c2VyID0gamgwMDAzKTogCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAJCQkJCQkJCQkjCSMJCQkJCQkJCQkJCQkgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkjCisjCQlweXRob24gaW1wb3J0Tm9ybWF0aXZlQWxsLnB5CQkJCQkJCQkJCQkgCQkJCSAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgIAkJCQkJCQkJCQkJCQkjCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgdXNhZ2UoKToKKwlwcmludCBzeXMuYXJndlswXSwgJ1staSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLXUgPHVzZXIgdXNlcklkPiB8IC0tdXNlcj08dXNlciB1c2VySWQ+IF0gWy1kIDx0cnVlfGZhbHNlPiB8IC0tZGVidWc9PHRydWV8ZmFsc2U+XSBbLXYgPHRydWV8ZmFsc2U+IHwgLS11cGRhdGV2ZXJzaW9uPTx0cnVlfGZhbHNlPl0nCisKK2RlZiBoYW5kbGVSZXN1bHRzKHJlc3VsdHMsIHVwZGF0ZXZlcnNpb24pOgorCXByaW50RnJhbWVMaW5lKCkKKwlmb3IgcmVzdWx0IGluIHJlc3VsdHM6CisJCXByaW50TmFtZUFuZFJldHVybkNvZGUocmVzdWx0WzBdLCByZXN1bHRbMV0pCisJcHJpbnRGcmFtZUxpbmUoKQorCQorCXJlc3BvbnNlQ29kZXMgPSBbMjAwLCAyMDFdCisJCisJaWYodXBkYXRldmVyc2lvbiA9PSAnZmFsc2UnKToKKwkJcmVzcG9uc2VDb2RlcyA9IFsyMDAsIDIwMSwgNDA5XQorCQorCWZhaWxlZFJlc3VsdHMgPSBmaWx0ZXIobGFtYmRhIHg6IHhbMV0gPT0gTm9uZSBvciB4WzFdIG5vdCBpbiByZXNwb25zZUNvZGVzLCByZXN1bHRzKQorCWlmIChsZW4oZmFpbGVkUmVzdWx0cykgPiAwKToKKwkJZXJyb3JBbmRFeGl0KDEsIE5vbmUpCisKK2RlZiBtYWluKGFyZ3YpOgorCXByaW50ICdOdW1iZXIgb2YgYXJndW1lbnRzOicsIGxlbihzeXMuYXJndiksICdhcmd1bWVudHMuJworCisJYmVIb3N0ID0gJ2xvY2FsaG9zdCcgCisJYmVQb3J0ID0gJzgwODAnCisJYWRtaW5Vc2VyID0gJ2poMDAwMycKKwlkZWJ1Z2YgPSBOb25lCisJdXBkYXRldmVyc2lvbiA9ICd0cnVlJworCWltcG9ydENvbW1vbi5kZWJ1Z0ZsYWcgPSBGYWxzZSAKKworCXRyeToKKwkJb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJndiwiaTpwOnU6ZDp2OmgiLFsiaXA9IiwicG9ydD0iLCJ1c2VyPSIsImRlYnVnPSIsInVwZGF0ZXZlcnNpb249Il0pCisJZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKwkJdXNhZ2UoKQorCQllcnJvckFuZEV4aXQoMiwgJ0ludmFsaWQgaW5wdXQnKQorCQorCWZvciBvcHQsIGFyZyBpbiBvcHRzOgorCSNwcmludCBvcHQsIGFyZworCQlpZiBvcHQgPT0gJy1oJzoKKwkJCXVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXN5cy5leGl0KDMpCisJCWVsaWYgb3B0IGluICgiLWkiLCAiLS1pcCIpOgorCQkJYmVIb3N0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXAiLCAiLS1wb3J0Iik6CisJCQliZVBvcnQgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItdSIsICItLXVzZXIiKToKKwkJCWFkbWluVXNlciA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1kIiwgIi0tZGVidWciKToKKwkJCXByaW50IGFyZworCQkJZGVidWdmID0gYm9vbChhcmcubG93ZXIoKSA9PSAidHJ1ZSIgb3IgYXJnLmxvd2VyKCkgPT0gInllcyIpCisJCWVsaWYgb3B0IGluICgiLXYiLCAiLS11cGRhdGV2ZXJzaW9uIik6CisJCQlwcmludCBhcmcKKwkJCWlmIChhcmcubG93ZXIoKSA9PSAiZmFsc2UiIG9yIGFyZy5sb3dlcigpID09ICJubyIpOgorCQkJCXVwZGF0ZXZlcnNpb24gPSAnZmFsc2UnCQkJCisKKwlwcmludCAnYmUgaG9zdCA9JyxiZUhvc3QsJywgYmUgcG9ydCA9JywgYmVQb3J0LCcsIHVzZXIgPScsIGFkbWluVXNlciwgJywgZGVidWcgPScsIGRlYnVnZiwgJywgdXBkYXRldmVyc2lvbiA9JywgdXBkYXRldmVyc2lvbgorCisJaWYgKGRlYnVnZiAhPSBOb25lKToKKwkJcHJpbnQgJ3NldCBkZWJ1ZyBtb2RlIHRvICcgKyBzdHIoZGVidWdmKQorCQlpbXBvcnRDb21tb24uZGVidWdGbGFnID0gZGVidWdmCisJCisJaWYgKCBiZUhvc3QgPT0gTm9uZSApOgorCQl1c2FnZSgpCisJCXN5cy5leGl0KDMpCisKKwlwcmludCBzeXMuYXJndlswXQorCXBhdGhkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChzeXMuYXJndlswXSkpICAgICAgCisJZGVidWcoInBhdGggZGlyID0iICsgcGF0aGRpcikKKworCWJhc2VGaWxlTG9jYXRpb24gPSBwYXRoZGlyICsgIi8uLi8uLi8uLi9pbXBvcnQvdG9zY2EvIgorCisJZmlsZUxvY2F0aW9uID0gYmFzZUZpbGVMb2NhdGlvbiArICJkYXRhLXR5cGVzLyIKKwlpbXBvcnREYXRhVHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgRmFsc2UsIGZpbGVMb2NhdGlvbikKKworCXByaW50ICdzbGVlcCB1bnRpbCBkYXRhIHR5cGUgY2FjaGUgaXMgdXBkYXRlZCcKKwl0aW1lLnNsZWVwKCA3MCApCisJCisJZmlsZUxvY2F0aW9uID0gYmFzZUZpbGVMb2NhdGlvbiArICJjYXBhYmlsaXR5LXR5cGVzLyIKKwlpbXBvcnROb3JtYXRpdmVDYXBhYmlsaXRpZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgRmFsc2UsIGZpbGVMb2NhdGlvbikKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaW50ZXJmYWNlLWxpZmVjeWNsZS10eXBlcy8iCisJaW1wb3J0Tm9ybWF0aXZlSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBGYWxzZSwgZmlsZUxvY2F0aW9uKQkKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiY2F0ZWdvcmllcy8iCisJaW1wb3J0Q2F0ZWdvcmllcyhiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBGYWxzZSwgZmlsZUxvY2F0aW9uKQorCQorCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAibm9ybWF0aXZlLXR5cGVzLyIKKwlyZXN1bHRzID0gaW1wb3J0Tm9ybWF0aXZlVHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZUxvY2F0aW9uLCB1cGRhdGV2ZXJzaW9uKQorCWhhbmRsZVJlc3VsdHMocmVzdWx0cywgdXBkYXRldmVyc2lvbikKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaGVhdC10eXBlcy8iCisJcmVzdWx0c0hlYXQgPSBpbXBvcnRIZWF0VHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZUxvY2F0aW9uLCB1cGRhdGV2ZXJzaW9uKQorCWhhbmRsZVJlc3VsdHMocmVzdWx0c0hlYXQsIHVwZGF0ZXZlcnNpb24pCisgIAorCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiZ3JvdXAtdHlwZXMvIgorCWltcG9ydEdyb3VwVHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgRmFsc2UsIGZpbGVMb2NhdGlvbikKKwkKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgInBvbGljeS10eXBlcy8iCisJaW1wb3J0UG9saWN5VHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgRmFsc2UsIGZpbGVMb2NhdGlvbikKKworCWVycm9yQW5kRXhpdCgwLCBOb25lKQkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgbWFpbihzeXMuYXJndlsxOl0pCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vcm1hdGl2ZUNhcGFiaWxpdGllcy5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vcm1hdGl2ZUNhcGFiaWxpdGllcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGEwMmRkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0Tm9ybWF0aXZlQ2FwYWJpbGl0aWVzLnB5CkBAIC0wLDAgKzEsNzcgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorZnJvbSBpbXBvcnROb3JtYXRpdmVFbGVtZW50cyBpbXBvcnQgY3JlYXRlTm9ybWF0aXZlRWxlbWVudAorZnJvbSBpbXBvcnRDb21tb24gaW1wb3J0ICoKK2ltcG9ydCBpbXBvcnRDb21tb24gCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgICAgIwkKKyMgSW1wb3J0IGFsbCB1c2VycyBmcm9tIGEgZ2l2ZW4gZmlsZQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIworIyAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQorIyBhY3RpdmF0aW9uIDoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgICAgICAgcHl0aG9uIGltcG9ydFVzZXJzLnB5IFstaSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLWYgPGlucHV0IGZpbGU+IHwgLS1pZmlsZT08aW5wdXQgZmlsZT4gXSAgICAgIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIAkgICAjCQkJCisjIHNob3J0ZXN0IGFjdGl2YXRpb24gKGJlIGhvc3QgPSBsb2NhbGhvc3QsIGJlIHBvcnQgPSA4MDgwKTogCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCisjCQlweXRob24gaW1wb3J0VXNlcnMucHkgWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0JCQkJCQkJCQkJCQkgCQkJCSAgICAgICAgICAgIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgICAgIwkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisJCitkZWYgdXNhZ2UoKToKKwlwcmludCBzeXMuYXJndlswXSwgJ1staSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLXUgPHVzZXIgdXNlcklkPiB8IC0tdXNlcj08dXNlciB1c2VySWQ+IF0nCisKKworZGVmIGltcG9ydE5vcm1hdGl2ZUNhcGFiaWxpdGllcyhiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBleGl0T25TdWNjZXNzLCBmaWxlRGlyKToKKwlyZXN1bHQgPSBjcmVhdGVOb3JtYXRpdmVFbGVtZW50KGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGZpbGVEaXIsICIvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkVHlwZS9jYXBhYmlsaXR5IiwgImNhcGFiaWxpdHlUeXBlcyIsICJjYXBhYmlsaXR5VHlwZVppcCIpCisJCisJcHJpbnRGcmFtZUxpbmUoKQorICAgICAgICBwcmludE5hbWVBbmRSZXR1cm5Db2RlKHJlc3VsdFswXSwgcmVzdWx0WzFdKQorICAgICAgICBwcmludEZyYW1lTGluZSgpCisKKyAgICAgICAgaWYgKCByZXN1bHRbMV0gPT0gTm9uZSBvciByZXN1bHRbMV0gbm90IGluIFsyMDAsIDIwMSwgNDA5XSApOgorICAgICAgICAgICAgICAgIGltcG9ydENvbW1vbi5lcnJvckFuZEV4aXQoMSwgTm9uZSkKKyAgICAgICAgZWxzZToKKwkJaWYgKGV4aXRPblN1Y2Nlc3MgPT0gVHJ1ZSk6CisgICAgICAgICAgICAgICAgCWltcG9ydENvbW1vbi5lcnJvckFuZEV4aXQoMCwgTm9uZSkKKworCitkZWYgbWFpbihhcmd2KToKKwlwcmludCAnTnVtYmVyIG9mIGFyZ3VtZW50czonLCBsZW4oc3lzLmFyZ3YpLCAnYXJndW1lbnRzLicKKworCWJlSG9zdCA9ICdsb2NhbGhvc3QnIAorCWJlUG9ydCA9ICc4MDgwJworCWFkbWluVXNlciA9ICdqaDAwMDMnCisKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDp1Omg6IixbImlwPSIsInBvcnQ9IiwidXNlcj0iXSkKKwlleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorCQl1c2FnZSgpCisJCWltcG9ydENvbW1vbi5lcnJvckFuZEV4aXQoMiwgJ0ludmFsaWQgaW5wdXQnKQorCQkgCisJZm9yIG9wdCwgYXJnIGluIG9wdHM6CisJI3ByaW50IG9wdCwgYXJnCisJCWlmIG9wdCA9PSAnLWgnOgorCQkJdXNhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc3lzLmV4aXQoMykKKwkJZWxpZiBvcHQgaW4gKCItaSIsICItLWlwIik6CisJCQliZUhvc3QgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItcCIsICItLXBvcnQiKToKKwkJCWJlUG9ydCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi11IiwgIi0tdXNlciIpOgorCQkJYWRtaW5Vc2VyID0gYXJnCisKKwlwcmludCAnYmUgaG9zdCA9JyxiZUhvc3QsJywgYmUgcG9ydCA9JywgYmVQb3J0LCcsIHVzZXIgPScsIGFkbWluVXNlcgorCQorCWlmICggYmVIb3N0ID09IE5vbmUgKToKKwkJdXNhZ2UoKQorCQlzeXMuZXhpdCgzKQorCisJaW1wb3J0Tm9ybWF0aXZlQ2FwYWJpbGl0aWVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIFRydWUsICIuLi8uLi8uLi9pbXBvcnQvdG9zY2EvY2FwYWJpbGl0eS10eXBlcy8iKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnROb3JtYXRpdmVFbGVtZW50cy5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vcm1hdGl2ZUVsZW1lbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjQzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnROb3JtYXRpdmVFbGVtZW50cy5weQpAQCAtMCwwICsxLDY1IEBACitpbXBvcnQgcHljdXJsCitpbXBvcnQgc3lzLCBnZXRvcHQKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQganNvbgoraW1wb3J0IGNvcHkKK2Zyb20gaW1wb3J0Q29tbW9uIGltcG9ydCAqCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIEltcG9ydCBhbGwgdXNlcnMgZnJvbSBhIGdpdmVuIGZpbGUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQkKKyMgYWN0aXZhdGlvbiA6CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCisjICAgICAgIHB5dGhvbiBpbXBvcnRVc2Vycy5weSBbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0gICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAJICAgIwkJCQorIyBzaG9ydGVzdCBhY3RpdmF0aW9uIChiZSBob3N0ID0gbG9jYWxob3N0LCBiZSBwb3J0ID0gODA4MCk6IAkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkJCQkJCQkJCQkJCQkJCQkgICAgICAgIworIwkJcHl0aG9uIGltcG9ydFVzZXJzLnB5IFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdCQkJCQkJCQkJCQkJIAkJCQkgICAgICAgICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIGNyZWF0ZU5vcm1hdGl2ZUVsZW1lbnQoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZURpciwgdXJsU3VmZml4LCBFTEVNRU5UX05BTUUsIGVsZW1lbnRGb3JtTmFtZSk6CisJCisJdHJ5OgorCQlsb2coImluIGNyZWF0ZSBub3JtYXRpdmUgZWxlbWVudCAiLCBFTEVNRU5UX05BTUUpCisKKwkJYnVmZmVyID0gU3RyaW5nSU8oKQorCQljID0gcHljdXJsLkN1cmwoKQorCisJCXVybCA9ICdodHRwOi8vJyArIGJlSG9zdCArICc6JyArIGJlUG9ydCArIHVybFN1ZmZpeAorCQljLnNldG9wdChjLlVSTCwgdXJsKQorCQljLnNldG9wdChjLlBPU1QsIDEpCQkKKworCQlhZG1pbkhlYWRlciA9ICdVU0VSX0lEOiAnICsgYWRtaW5Vc2VyCisJCSNjLnNldG9wdChweWN1cmwuSFRUUEhFQURFUiwgWydDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nLCAnQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJywgYWRtaW5IZWFkZXJdKQorCQljLnNldG9wdChweWN1cmwuSFRUUEhFQURFUiwgW2FkbWluSGVhZGVyXSkKKworCQkJCisJCXBhdGggPSBmaWxlRGlyICsgIi8iICsgRUxFTUVOVF9OQU1FICsgIi56aXAiCisJCWRlYnVnKHBhdGgpCisKKwkJc2VuZCA9IFsoZWxlbWVudEZvcm1OYW1lLCAocHljdXJsLkZPUk1fRklMRSwgcGF0aCkpXQorCQlkZWJ1ZyhzZW5kKQorCQljLnNldG9wdChweWN1cmwuSFRUUFBPU1QsIHNlbmQpCQkKKworCQkjZGF0YSA9IGpzb24uZHVtcHModXNlcikKKwkJI2Muc2V0b3B0KGMuUE9TVEZJRUxEUywgZGF0YSkJCisKKwkJI2Muc2V0b3B0KGMuV1JJVEVGVU5DVElPTiwgbGFtYmRhIHg6IE5vbmUpCisJCWMuc2V0b3B0KGMuV1JJVEVGVU5DVElPTiwgYnVmZmVyLndyaXRlKQorCQkjcHJpbnQoImJlZm9yZSBwZXJmb3JtIikJCisJCXJlcyA9IGMucGVyZm9ybSgpCisJCisJCSNwcmludCgiQmVmb3JlIGdldCByZXNwb25zZSBjb2RlIikJCisJCWh0dHBSZXMgPSBjLmdldGluZm8oYy5SRVNQT05TRV9DT0RFKQorCQlpZiAoaHR0cFJlcyAhPSBOb25lKToKKwkJCWRlYnVnKCJodHRwIHJlc3BvbnNlPSIsIGh0dHBSZXMpCisJCSNwcmludCgnU3RhdHVzOiAnICsgc3RyKHJlc3BvbnNlQ29kZSkpCisJCWRlYnVnKCJyZXNwb25zZSBidWZmZXIiLCBidWZmZXIuZ2V0dmFsdWUoKSkKKwkJYy5jbG9zZSgpCisKKwkJcmV0dXJuIChFTEVNRU5UX05BTUUsIGh0dHBSZXMsIGJ1ZmZlci5nZXR2YWx1ZSgpKQorCisJZXhjZXB0IEV4Y2VwdGlvbiBhcyBpbnN0OgorCQlwcmludCgiRVJST1I9IiArIHN0cihpbnN0KSkKKwkJcmV0dXJuIChFTEVNRU5UX05BTUUsIE5vbmUsIE5vbmUpCQkJCQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vcm1hdGl2ZUludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnB5IGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0Tm9ybWF0aXZlSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vcm1hdGl2ZUludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnB5CkBAIC0wLDAgKzEsNzUgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorZnJvbSBpbXBvcnROb3JtYXRpdmVFbGVtZW50cyBpbXBvcnQgY3JlYXRlTm9ybWF0aXZlRWxlbWVudAorZnJvbSBpbXBvcnRDb21tb24gaW1wb3J0ICoKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyBJbXBvcnQgYWxsIHVzZXJzIGZyb20gYSBnaXZlbiBmaWxlCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCisjIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkJCisjIGFjdGl2YXRpb24gOgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIworIyAgICAgICBweXRob24gaW1wb3J0VXNlcnMucHkgWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgCSAgICMJCQkKKyMgc2hvcnRlc3QgYWN0aXZhdGlvbiAoYmUgaG9zdCA9IGxvY2FsaG9zdCwgYmUgcG9ydCA9IDgwODApOiAJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQkJCQkJCQkJCQkJCQkJICAgICAgICMKKyMJCXB5dGhvbiBpbXBvcnRVc2Vycy5weSBbLWYgPGlucHV0IGZpbGU+IHwgLS1pZmlsZT08aW5wdXQgZmlsZT4gXQkJCQkJCQkJCQkJCSAJCQkJICAgICAgICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiB1c2FnZSgpOgorCXByaW50IHN5cy5hcmd2WzBdLCAnWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstdSA8dXNlciB1c2VySWQ+IHwgLS11c2VyPTx1c2VyIHVzZXJJZD4gXScKKworCitkZWYgaW1wb3J0Tm9ybWF0aXZlSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBleGl0T25TdWNjZXNzLCBmaWxlRGlyKToKKwlyZXN1bHQgPSBjcmVhdGVOb3JtYXRpdmVFbGVtZW50KGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGZpbGVEaXIsICIvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkVHlwZS9pbnRlcmZhY2VMaWZlY3ljbGUiLCAiaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMiLCAiaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZVppcCIpCisKKyAgICAgICAgcHJpbnRGcmFtZUxpbmUoKQorICAgICAgICBwcmludE5hbWVBbmRSZXR1cm5Db2RlKHJlc3VsdFswXSwgcmVzdWx0WzFdKQorICAgICAgICBwcmludEZyYW1lTGluZSgpCisKKyAgICAgICAgaWYgKCByZXN1bHRbMV0gPT0gTm9uZSBvciByZXN1bHRbMV0gbm90IGluIFsyMDAsIDIwMSwgNDA5XSApOgorICAgICAgICAgICAgICAgIGVycm9yQW5kRXhpdCgxLCBOb25lKQorICAgICAgICBlbHNlOgorCQlpZiAoZXhpdE9uU3VjY2VzcyA9PSBUcnVlKToKKyAgICAgICAgICAgICAgICAJZXJyb3JBbmRFeGl0KDAsIE5vbmUpCisKKworZGVmIG1haW4oYXJndik6CisJcHJpbnQgJ051bWJlciBvZiBhcmd1bWVudHM6JywgbGVuKHN5cy5hcmd2KSwgJ2FyZ3VtZW50cy4nCisKKwliZUhvc3QgPSAnbG9jYWxob3N0JyAKKwliZVBvcnQgPSAnODA4MCcKKwlhZG1pblVzZXIgPSAnamgwMDAzJworCisJdHJ5OgorCQlvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmd2LCJpOnA6dTpoOiIsWyJpcD0iLCJwb3J0PSIsInVzZXI9Il0pCisJZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKwkJdXNhZ2UoKQorCQllcnJvckFuZEV4aXQoMiwgJ0ludmFsaWQgaW5wdXQnKQorCQkgCisJZm9yIG9wdCwgYXJnIGluIG9wdHM6CisJI3ByaW50IG9wdCwgYXJnCisJCWlmIG9wdCA9PSAnLWgnOgorCQkJdXNhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc3lzLmV4aXQoMykKKwkJZWxpZiBvcHQgaW4gKCItaSIsICItLWlwIik6CisJCQliZUhvc3QgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItcCIsICItLXBvcnQiKToKKwkJCWJlUG9ydCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi11IiwgIi0tdXNlciIpOgorCQkJYWRtaW5Vc2VyID0gYXJnCisKKwlwcmludCAnYmUgaG9zdCA9JyxiZUhvc3QsJywgYmUgcG9ydCA9JywgYmVQb3J0LCcsIHVzZXIgPScsIGFkbWluVXNlcgorCQorCWlmICggYmVIb3N0ID09IE5vbmUgKToKKwkJdXNhZ2UoKQorCQlzeXMuZXhpdCgzKQorCisJaW1wb3J0Tm9ybWF0aXZlSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBUcnVlLCAiLi4vLi4vLi4vaW1wb3J0L3Rvc2NhL2ludGVyZmFjZS1saWZlY3ljbGUtdHlwZXMvLyIpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgbWFpbihzeXMuYXJndlsxOl0pCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vcm1hdGl2ZVR5cGVzLnB5IGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0Tm9ybWF0aXZlVHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiYWU2OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydE5vcm1hdGl2ZVR5cGVzLnB5CkBAIC0wLDAgKzEsMTU5IEBACitpbXBvcnQgcHljdXJsCitpbXBvcnQgc3lzLCBnZXRvcHQKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQganNvbgoraW1wb3J0IGNvcHkKK2Zyb20gaW1wb3J0Q29tbW9uIGltcG9ydCAqCitpbXBvcnQgaW1wb3J0Q29tbW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIEltcG9ydCBhbGwgdXNlcnMgZnJvbSBhIGdpdmVuIGZpbGUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQkKKyMgYWN0aXZhdGlvbiA6CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCisjICAgICAgIHB5dGhvbiBpbXBvcnRVc2Vycy5weSBbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0gICAgICMKKyMJCQkJCQkJICBbLXYgPHRydWV8ZmFsc2U+IHwgLS11cGRhdGV2ZXJzaW9uPTx0cnVlfGZhbHNlPl0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIAkgICAjCQkJCisjIHNob3J0ZXN0IGFjdGl2YXRpb24gKGJlIGhvc3QgPSBsb2NhbGhvc3QsIGJlIHBvcnQgPSA4MDgwKTogCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCisjCQlweXRob24gaW1wb3J0VXNlcnMucHkgWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0JCQkJCQkJCQkJCQkgCQkJCSAgICAgICAgICAgIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgICAgIwkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlRGlyLCBFTEVNRU5UX05BTUUsIHVwZGF0ZXZlcnNpb24pOgorCQorCXRyeToKKwkJbG9nKCJpbiBjcmVhdGUgbm9ybWF0aXZlIHR5cGUgIiwgRUxFTUVOVF9OQU1FKQorCQlkZWJ1ZygidXNlcklkIiwgYWRtaW5Vc2VyKQorCQlkZWJ1ZygiZmlsZURpciIsIGZpbGVEaXIpCisJCQorCQlidWZmZXIgPSBTdHJpbmdJTygpCisJCWMgPSBweWN1cmwuQ3VybCgpCisKKwkJdXJsID0gJ2h0dHA6Ly8nICsgYmVIb3N0ICsgJzonICsgYmVQb3J0ICsgJy9zZGMyL3Jlc3QvdjEvY2F0YWxvZy91cGxvYWQvbXVsdGlwYXJ0JworCQlpZiB1cGRhdGV2ZXJzaW9uICE9IE5vbmU6CisJCQl1cmwgKz0gJz9jcmVhdGVOZXdWZXJzaW9uPScgKyB1cGRhdGV2ZXJzaW9uCisJCWMuc2V0b3B0KGMuVVJMLCB1cmwpCisJCWMuc2V0b3B0KGMuUE9TVCwgMSkJCQorCisJCWFkbWluSGVhZGVyID0gJ1VTRVJfSUQ6ICcgKyBhZG1pblVzZXIKKwkJI2Muc2V0b3B0KHB5Y3VybC5IVFRQSEVBREVSLCBbJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nLCBhZG1pbkhlYWRlcl0pCisJCWMuc2V0b3B0KHB5Y3VybC5IVFRQSEVBREVSLCBbYWRtaW5IZWFkZXJdKQorCisKKwkJcGF0aCA9IGZpbGVEaXIgKyBFTEVNRU5UX05BTUUgKyAiLyIgKyBFTEVNRU5UX05BTUUgKyAiLnppcCIKKwkJZGVidWcocGF0aCkKKyAgICAgICAgCUNVUlJFTlRfSlNPTl9GSUxFPWZpbGVEaXIgKyBFTEVNRU5UX05BTUUgKyAiLyIgKyBFTEVNRU5UX05BTUUgKyAiLmpzb24iCisgICAgICAgIAkjc2VkIC1pICdzLyJ1c2VySWQiOiAiLioiLC8idXNlcklkIjogIicke0FUVF9VSUR9JyIsLycgJHtDVVJSRU5UX0pTT05fRklMRX0KKworCQlqc29uRmlsZSA9IG9wZW4oQ1VSUkVOVF9KU09OX0ZJTEUpCisJCQorCQlkZWJ1ZygiYmVmb3JlIGxvYWQganNvbiIpCisJCWpzb25fZGF0YSA9IGpzb24ubG9hZChqc29uRmlsZSwgc3RyaWN0PUZhbHNlKQorCQlkZWJ1Zyhqc29uX2RhdGEpCisJCisJCWpzb25Bc1N0ciA9IGpzb24uZHVtcHMoanNvbl9kYXRhKQorCisJCXNlbmQgPSBbKCdyZXNvdXJjZU1ldGFkYXRhJywganNvbkFzU3RyKSwgKCdyZXNvdXJjZVppcCcsIChweWN1cmwuRk9STV9GSUxFLCBwYXRoKSldCisJCWRlYnVnKHNlbmQpCisJCWMuc2V0b3B0KHB5Y3VybC5IVFRQUE9TVCwgc2VuZCkJCQorCisJCSNkYXRhID0ganNvbi5kdW1wcyh1c2VyKQorCQkjYy5zZXRvcHQoYy5QT1NURklFTERTLCBkYXRhKQkKKworCQkjYy5zZXRvcHQoYy5XUklURUZVTkNUSU9OLCBsYW1iZGEgeDogTm9uZSkKKwkJYy5zZXRvcHQoYy5XUklURUZVTkNUSU9OLCBidWZmZXIud3JpdGUpCisJCSNwcmludCgiYmVmb3JlIHBlcmZvcm0iKQkKKwkJcmVzID0gYy5wZXJmb3JtKCkKKwkKKwkJI3ByaW50KCJCZWZvcmUgZ2V0IHJlc3BvbnNlIGNvZGUiKQkKKwkJaHR0cFJlcyA9IGMuZ2V0aW5mbyhjLlJFU1BPTlNFX0NPREUpCisJCWlmIChodHRwUmVzICE9IE5vbmUpOgorCQkJZGVidWcoImh0dHAgcmVzcG9uc2U9IiwgaHR0cFJlcykKKwkJI3ByaW50KCdTdGF0dXM6ICcgKyBzdHIocmVzcG9uc2VDb2RlKSkKKwkJZGVidWcoYnVmZmVyLmdldHZhbHVlKCkpCisJCWMuY2xvc2UoKQorCisJCXJldHVybiAoRUxFTUVOVF9OQU1FLCBodHRwUmVzLCBidWZmZXIuZ2V0dmFsdWUoKSkKKworCWV4Y2VwdCBFeGNlcHRpb24gYXMgaW5zdDoKKwkJcHJpbnQoIkVSUk9SPSIgKyBzdHIoaW5zdCkpCisJCXJldHVybiAoRUxFTUVOVF9OQU1FLCBOb25lLCBOb25lKQkJCQkKKworCitkZWYgdXNhZ2UoKToKKwlwcmludCBzeXMuYXJndlswXSwgJ1staSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLXUgPHVzZXIgdXNlcklkPiB8IC0tdXNlcj08dXNlciB1c2VySWQ+IF0gWy12IDx0cnVlfGZhbHNlPiB8IC0tdXBkYXRldmVyc2lvbj08dHJ1ZXxmYWxzZT5dJworCisKK2RlZiBpbXBvcnROb3JtYXRpdmVUeXBlcyhiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlRGlyLCB1cGRhdGV2ZXJzaW9uKToKKwkKKwlub3JtYXRpdmVUeXBlcyA9IFsgInJvb3QiLCAiY29tcHV0ZSIsICJzb2Z0d2FyZUNvbXBvbmVudCIsICJ3ZWJTZXJ2ZXIiLCAid2ViQXBwbGljYXRpb24iLCAiREJNUyIsICJkYXRhYmFzZSIsICJvYmplY3RTdG9yYWdlIiwgImJsb2NrU3RvcmFnZSIsICJjb250YWluZXJSdW50aW1lIiwgImNvbnRhaW5lckFwcGxpY2F0aW9uIiwgImxvYWRCYWxhbmNlciIsICJwb3J0IiwgIm5ldHdvcmsiXQorCSNub3JtYXRpdmVUeXBlcyA9IFsgInJvb3QiIF0KKwlyZXNwb25zZUNvZGVzID0gWzIwMCwgMjAxXQorCQorCWlmKHVwZGF0ZXZlcnNpb24gPT0gJ2ZhbHNlJyk6CisJCXJlc3BvbnNlQ29kZXMgPSBbMjAwLCAyMDEsIDQwOV0KKwkKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciBub3JtYXRpdmVUeXBlIGluIG5vcm1hdGl2ZVR5cGVzOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZU5vcm1hdGl2ZVR5cGUoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZURpciwgbm9ybWF0aXZlVHlwZSwgdXBkYXRldmVyc2lvbikKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQpCisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHRbMV0gPT0gTm9uZSBvciByZXN1bHRbMV0gbm90IGluIHJlc3BvbnNlQ29kZXMgKToKKwkJCXByaW50ICJGYWlsZWQgY3JlYXRpbmcgbm9ybWF0aXZlIHR5cGUgIiArIG5vcm1hdGl2ZVR5cGUgKyAiLiAiICsgc3RyKHJlc3VsdFsxXSkgCQkJCQorCXJldHVybiByZXN1bHRzCisKKworZGVmIG1haW4oYXJndik6CisJcHJpbnQgJ051bWJlciBvZiBhcmd1bWVudHM6JywgbGVuKHN5cy5hcmd2KSwgJ2FyZ3VtZW50cy4nCisKKwliZUhvc3QgPSAnbG9jYWxob3N0JyAKKwliZVBvcnQgPSAnODA4MCcKKwlhZG1pblVzZXIgPSAnamgwMDAzJworCXVwZGF0ZXZlcnNpb24gPSAndHJ1ZScKKworCXRyeToKKwkJb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJndiwiaTpwOnU6djpoOiIsWyJpcD0iLCJwb3J0PSIsInVzZXI9IiwidXBkYXRldmVyc2lvbj0iXSkKKwlleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorCQl1c2FnZSgpCisJCWVycm9yQW5kRXhpdCgyLCAnSW52YWxpZCBpbnB1dCcpCisJCSAKKwlmb3Igb3B0LCBhcmcgaW4gb3B0czoKKwkjcHJpbnQgb3B0LCBhcmcKKwkJaWYgb3B0ID09ICctaCc6CisJCQl1c2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzeXMuZXhpdCgzKQorCQllbGlmIG9wdCBpbiAoIi1pIiwgIi0taXAiKToKKwkJCWJlSG9zdCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1wIiwgIi0tcG9ydCIpOgorCQkJYmVQb3J0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXUiLCAiLS11c2VyIik6CisJCQlhZG1pblVzZXIgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItdiIsICItLXVwZGF0ZXZlcnNpb24iKToKKwkJCWlmIChhcmcubG93ZXIoKSA9PSAiZmFsc2UiIG9yIGFyZy5sb3dlcigpID09ICJubyIpOgorCQkJCXVwZGF0ZXZlcnNpb24gPSAnZmFsc2UnCisKKwlwcmludCAnYmUgaG9zdCA9JyxiZUhvc3QsJywgYmUgcG9ydCA9JywgYmVQb3J0LCcsIHVzZXIgPScsIGFkbWluVXNlciwgJywgdXBkYXRldmVyc2lvbiA9JywgdXBkYXRldmVyc2lvbgorCQorCWlmICggYmVIb3N0ID09IE5vbmUgKToKKwkJdXNhZ2UoKQorCQlzeXMuZXhpdCgzKQorCisJcmVzdWx0cyA9IGltcG9ydE5vcm1hdGl2ZVR5cGVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsICIuLi8uLi8uLi9pbXBvcnQvdG9zY2Evbm9ybWF0aXZlLXR5cGVzLyIsIHVwZGF0ZXZlcnNpb24pCisKKwlwcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJZm9yIHJlc3VsdCBpbiByZXN1bHRzOgorCQlwcmludCAiezA6MjB9IHwgezE6Nn0iLmZvcm1hdChyZXN1bHRbMF0sIHJlc3VsdFsxXSkKKwlwcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCisJcmVzcG9uc2VDb2RlcyA9IFsyMDAsIDIwMV0KKwkKKwlpZih1cGRhdGV2ZXJzaW9uID09ICdmYWxzZScpOgorCQlyZXNwb25zZUNvZGVzID0gWzIwMCwgMjAxLCA0MDldCisJCisJZmFpbGVkTm9ybWF0aXZlcyA9IGZpbHRlcihsYW1iZGEgeDogeFsxXSA9PSBOb25lIG9yIHhbMV0gbm90IGluIHJlc3BvbnNlQ29kZXMsIHJlc3VsdHMpCisJaWYgKGxlbihmYWlsZWROb3JtYXRpdmVzKSA+IDApOgorCQllcnJvckFuZEV4aXQoMSwgTm9uZSkKKwllbHNlOgorCQllcnJvckFuZEV4aXQoMCwgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICAgICBtYWluKHN5cy5hcmd2WzE6XSkKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0UG9saWN5VHlwZXMucHkgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRQb2xpY3lUeXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDFlMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvaW1wb3J0UG9saWN5VHlwZXMucHkKQEAgLTAsMCArMSw3NCBAQAoraW1wb3J0IHB5Y3VybAoraW1wb3J0IHN5cywgZ2V0b3B0Citmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IGpzb24KK2ltcG9ydCBjb3B5Citmcm9tIGltcG9ydE5vcm1hdGl2ZUVsZW1lbnRzIGltcG9ydCBjcmVhdGVOb3JtYXRpdmVFbGVtZW50CisKK2Zyb20gaW1wb3J0Q29tbW9uIGltcG9ydCAqCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIEltcG9ydCB0b3NjYSBkYXRhIHR5cGVzCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCisjIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkJCisjIGFjdGl2YXRpb24gOgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIworIyAgICAgICBweXRob24gaW1wb3J0UG9saWN5VHlwZXMucHkgWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgCSAgICMJCQkKKyMgc2hvcnRlc3QgYWN0aXZhdGlvbiAoYmUgaG9zdCA9IGxvY2FsaG9zdCwgYmUgcG9ydCA9IDgwODApOiAJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQkJCQkJCQkJCQkJCQkJICAgICAgICMKKyMJCXB5dGhvbiBpbXBvcnRQb2xpY3lUeXBlcy5weSBbLWYgPGlucHV0IGZpbGU+IHwgLS1pZmlsZT08aW5wdXQgZmlsZT4gXQkJCQkJCQkJCQkJCSAJCQkJICAgICAgICAgICAjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAjCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiB1c2FnZSgpOgorCXByaW50IHN5cy5hcmd2WzBdLCAnWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstdSA8dXNlciB1c2VySWQ+IHwgLS11c2VyPTx1c2VyIHVzZXJJZD4gXScKKworCitkZWYgaW1wb3J0UG9saWN5VHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZXhpdE9uU3VjY2VzcywgZmlsZURpcik6CisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlRWxlbWVudChiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlRGlyLCAiL3NkYzIvcmVzdC92MS9jYXRhbG9nL3VwbG9hZFR5cGUvcG9saWN5dHlwZXMiLCAicG9saWN5VHlwZXMiLCAicG9saWN5VHlwZXNaaXAiKQorCisJcHJpbnRGcmFtZUxpbmUoKQorICAgICAgICBwcmludE5hbWVBbmRSZXR1cm5Db2RlKHJlc3VsdFswXSwgcmVzdWx0WzFdKQorICAgICAgICBwcmludEZyYW1lTGluZSgpCisKKyAgICAgICAgaWYgKCByZXN1bHRbMV0gPT0gTm9uZSBvciByZXN1bHRbMV0gbm90IGluIFsyMDAsIDIwMSwgNDA5XSApOgorICAgICAgICAgICAgICAgIGVycm9yQW5kRXhpdCgxLCBOb25lKQorICAgICAgICBlbHNlOgorCQlpZiAoZXhpdE9uU3VjY2VzcyA9PSBUcnVlKToKKyAgICAgICAgICAgICAgICAJZXJyb3JBbmRFeGl0KDAsIE5vbmUpCisKK2RlZiBtYWluKGFyZ3YpOgorCXByaW50ICdOdW1iZXIgb2YgYXJndW1lbnRzOicsIGxlbihzeXMuYXJndiksICdhcmd1bWVudHMuJworCisJYmVIb3N0ID0gJ2xvY2FsaG9zdCcgCisJYmVQb3J0ID0gJzgwODAnCisJYWRtaW5Vc2VyID0gJ2poMDAwMycKKworCXRyeToKKwkJb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJndiwiaTpwOnU6aDoiLFsiaXA9IiwicG9ydD0iLCJ1c2VyPSJdKQorCWV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisJCXVzYWdlKCkKKwkJZXJyb3JBbmRFeGl0KDIsICdJbnZhbGlkIGlucHV0JykKKwkJIAorCWZvciBvcHQsIGFyZyBpbiBvcHRzOgorCSNwcmludCBvcHQsIGFyZworCQlpZiBvcHQgPT0gJy1oJzoKKwkJCXVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXN5cy5leGl0KDMpCisJCWVsaWYgb3B0IGluICgiLWkiLCAiLS1pcCIpOgorCQkJYmVIb3N0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXAiLCAiLS1wb3J0Iik6CisJCQliZVBvcnQgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItdSIsICItLXVzZXIiKToKKwkJCWFkbWluVXNlciA9IGFyZworCisJcHJpbnQgJ2JlIGhvc3QgPScsYmVIb3N0LCcsIGJlIHBvcnQgPScsIGJlUG9ydCwnLCB1c2VyID0nLCBhZG1pblVzZXIKKwkKKwlpZiAoIGJlSG9zdCA9PSBOb25lICk6CisJCXVzYWdlKCkKKwkJc3lzLmV4aXQoMykKKworCWltcG9ydFBvbGljeVR5cGVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIFRydWUsICIuLi8uLi8uLi9pbXBvcnQvdG9zY2EvcG9saWN5LXR5cGVzLyIpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgbWFpbihzeXMuYXJndlsxOl0pCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL2ltcG9ydFVzZXJzRnJvbVlhbWwucHkgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRVc2Vyc0Zyb21ZYW1sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDk4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS9pbXBvcnRVc2Vyc0Zyb21ZYW1sLnB5CkBAIC0wLDAgKzEsMjIxIEBACitpbXBvcnQgcHljdXJsCitpbXBvcnQgc3lzLCBnZXRvcHQKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQganNvbgoraW1wb3J0IGNvcHkKK2ltcG9ydCB5YW1sCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICMJCisjIEltcG9ydCBhbGwgdXNlcnMgZnJvbSBhIGdpdmVuIFlBTUwgZmlsZQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMKKyMgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQorIyBhY3RpdmF0aW9uIDoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIworIyAgICAgICBweXRob24gaW1wb3J0VXNlcnNGcm9tWWFtbC5weSBbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy1mIDxpbnB1dCBmaWxlPiB8IC0taWZpbGU9PGlucHV0IGZpbGU+IF0gICAgICMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIAkgICAjCQkJCisjIHNob3J0ZXN0IGFjdGl2YXRpb24gKGJlIGhvc3QgPSBsb2NhbGhvc3QsIGJlIHBvcnQgPSA4MDgwKTogCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICMJCQkJCQkJCQkJCQkJCQkJICAgICAgICMKKyMJCXB5dGhvbiBpbXBvcnRVc2Vyc0Zyb21ZYW1sLnB5IFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdCQkJCQkJCQkJCQkJIAkJCQkgICAgICAgICAgICMKKyMJCQkJCQkJCQkgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgIwkKKyMgICBQeVlBTUwgbW9kdWxlIHNoYWxsIGJlIGFkZGVkIHRvIHB5dGhvbi4JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAjCQorIyAgIHBpcCBpbnN0YWxsIFB5WUFNTD49My4xLjAgLS1wcm94eT1odHRwOi8vb25lLnByb3h5LmF0dC5jb206ODA4MAkJCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2RlZiBpbXBvcnRVc2VycyhiZUhvc3QsIGJlUG9ydCwgdXNlcnMsIGFkbWluVXNlcik6CisJCisJcmVzdWx0ID0gW10JCisKKwlmb3IgdXNlciBpbiB1c2VyczoKKwkJCQorCQkjcHJpbnQoIkdvaW5nIHRvIGFkZCB1c2VyICIgKyB1c2VyWyd1c2VySWQnXSkKKwkKKwkJZ2V0UmVzID0gZ2V0VXNlcihiZUhvc3QsIGJlUG9ydCwgdXNlcikJCisJCXVzZXJJZCA9IGdldFJlc1swXQorCQllcnJvciA9IGdldFJlc1sxXQorCQkjcHJpbnQgZXJyb3IKKwkJaWYgKCBlcnJvciAhPSBOb25lIGFuZCBlcnJvciA9PSA0MDQgKToKKwkJCXJlcyA9IGNyZWF0ZVVzZXIoYmVIb3N0LCBiZVBvcnQsIHVzZXIgLGFkbWluVXNlcikJCQkKKwkJCXJlc3VsdC5hcHBlbmQocmVzKQkJCQorCQllbHNlOgorCQkJaWYgKCBlcnJvciA9PSAyMDAgKToKKwkJCQljdXJSZXN1bHQgPSAodXNlcklkLCA0MDkpCisJCQkJcmVzdWx0LmFwcGVuZChjdXJSZXN1bHQpCQorCQkJZWxzZToKKwkJCQlyZXN1bHQuYXBwZW5kKGdldFJlcykKKworCXJldHVybiByZXN1bHQJCQkJCisKKworZGVmIGdldFVzZXIoYmVIb3N0LCBiZVBvcnQsIHVzZXIpOgorCisJaWYgKHVzZXIuZ2V0KCd1c2VySWQnKSA9PSBOb25lKToKKyAgICAgICAgICAgICAgICBwcmludCAiSWdub3JpbmcgcmVjb3JkIiwgdXNlcgorICAgICAgICAgICAgICAgIHJldHVybiAoJ05vdEV4aXN0JywgMjAwKQorCXVzZXJJZCA9IHVzZXJbJ3VzZXJJZCddCisJdHJ5OgorCQlidWZmZXIgPSBTdHJpbmdJTygpCisJCWMgPSBweWN1cmwuQ3VybCgpCisKKwkJI3ByaW50IHR5cGUodXNlcklkKQorCQl1cmwgPSAnaHR0cDovLycgKyBiZUhvc3QgKyAnOicgKyBiZVBvcnQgKyAnL3NkYzIvcmVzdC92MS91c2VyLycgKyBzdHIodXNlcklkKQorCQljLnNldG9wdChjLlVSTCwgdXJsKQorCisJCSNhZG1pbkhlYWRlciA9ICdVU0VSX0lEOiAnICsgYWRtaW5Vc2VyCisJCWMuc2V0b3B0KHB5Y3VybC5IVFRQSEVBREVSLCBbJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nXSkKKwkJYy5zZXRvcHQoYy5XUklURUZVTkNUSU9OLCBsYW1iZGEgeDogTm9uZSkKKwkJcmVzID0gYy5wZXJmb3JtKCkKKwkJCQkJCisJCSNwcmludCgiQmVmb3JlIGdldCByZXNwb25zZSBjb2RlIikJCisJCWh0dHBSZXMgPSBjLmdldGluZm8oYy5SRVNQT05TRV9DT0RFKQorCQkjcHJpbnQoIkFmdGVyIGdldCByZXNwb25zZSBjb2RlIikJCisJCXJlc3BvbnNlQ29kZSA9IGMuZ2V0aW5mbyhjLlJFU1BPTlNFX0NPREUpCisJCQorCQkjcHJpbnQoJ1N0YXR1czogJyArIHN0cihyZXNwb25zZUNvZGUpKQorCisJCWMuY2xvc2UoKQorCisJCXJldHVybiAodXNlcklkLCBodHRwUmVzKQorCisJZXhjZXB0IEV4Y2VwdGlvbiBhcyBpbnN0OgorCQlwcmludChpbnN0KQorCQlyZXR1cm4gKHVzZXJJZCwgTm9uZSkJCQkJCisKKwkJCisKK2RlZiBjcmVhdGVVc2VyKGJlSG9zdCwgYmVQb3J0LCB1c2VyLCBhZG1pblVzZXIpOgorCQorCWlmICh1c2VyLmdldCgndXNlcklkJykgPT0gTm9uZSk6CisJCXByaW50ICJJZ25vcmluZyByZWNvcmQiLCB1c2VyCisJCXJldHVybiAoJ05vdEV4aXN0JywgMjAwKQorCQorCXVzZXJJZCA9IHVzZXJbJ3VzZXJJZCddCisJdHJ5OgorCQlidWZmZXIgPSBTdHJpbmdJTygpCisJCWMgPSBweWN1cmwuQ3VybCgpCisKKwkJdXJsID0gJ2h0dHA6Ly8nICsgYmVIb3N0ICsgJzonICsgYmVQb3J0ICsgJy9zZGMyL3Jlc3QvdjEvdXNlcicKKwkJYy5zZXRvcHQoYy5VUkwsIHVybCkKKwkJYy5zZXRvcHQoYy5QT1NULCAxKQkJCisKKwkJYWRtaW5IZWFkZXIgPSAnVVNFUl9JRDogJyArIGFkbWluVXNlcgorCQljLnNldG9wdChweWN1cmwuSFRUUEhFQURFUiwgWydDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nLCAnQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJywgYWRtaW5IZWFkZXJdKQorCisJCWRhdGEgPSBqc29uLmR1bXBzKHVzZXIpCisJCWMuc2V0b3B0KGMuUE9TVEZJRUxEUywgZGF0YSkJCisKKwkJYy5zZXRvcHQoYy5XUklURUZVTkNUSU9OLCBsYW1iZGEgeDogTm9uZSkKKwkJI3ByaW50KCJiZWZvcmUgcGVyZm9ybSIpCQorCQlyZXMgPSBjLnBlcmZvcm0oKQorICAgICAgICAjcHJpbnQocmVzKQorCQorCQkjcHJpbnQoIkJlZm9yZSBnZXQgcmVzcG9uc2UgY29kZSIpCQorCQlodHRwUmVzID0gYy5nZXRpbmZvKGMuUkVTUE9OU0VfQ09ERSkKKwkJI3ByaW50KCJBZnRlciBnZXQgcmVzcG9uc2UgY29kZSIpCQorCQlyZXNwb25zZUNvZGUgPSBjLmdldGluZm8oYy5SRVNQT05TRV9DT0RFKQorCQkKKwkJI3ByaW50KCdTdGF0dXM6ICcgKyBzdHIocmVzcG9uc2VDb2RlKSkKKworCQljLmNsb3NlKCkKKworCQlyZXR1cm4gKHVzZXJJZCwgaHR0cFJlcykKKworCWV4Y2VwdCBFeGNlcHRpb24gYXMgaW5zdDoKKwkJcHJpbnQoaW5zdCkKKwkJcmV0dXJuICh1c2VySWQsIE5vbmUpCQkJCQorCisKK2RlZiBlcnJvckFuZEV4aXQoZXJyb3JDb2RlLCBlcnJvckRlc2MpOgorCWlmICggZXJyb3JDb2RlID4gMCApOgorCQlwcmludCgic3RhdHVzPSIgKyBzdHIoZXJyb3JDb2RlKSArICIuICIgKyBlcnJvckRlc2MpIAorCWVsc2U6CisJCXByaW50KCJzdGF0dXM9IiArIHN0cihlcnJvckNvZGUpKQorCXN5cy5leGl0KGVycm9yQ29kZSkKKwkKK2RlZiB1c2FnZSgpOgorCXByaW50IHN5cy5hcmd2WzBdLCAnWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstZiA8aW5wdXQgZmlsZT4gfCAtLWlmaWxlPTxpbnB1dCBmaWxlPiBdJworCitkZWYgbWFpbihhcmd2KToKKwlwcmludCAnTnVtYmVyIG9mIGFyZ3VtZW50czonLCBsZW4oc3lzLmFyZ3YpLCAnYXJndW1lbnRzLicKKworCWJlSG9zdCA9ICdsb2NhbGhvc3QnIAorCWJlUG9ydCA9ICc4MDgwJworCWlucHV0ZmlsZSA9IE5vbmUgCisKKwlhZG1pblVzZXIgPSAnamgwMDAzJworCisJdHJ5OgorCQlvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmd2LCJpOnA6ZjpoOiIsWyJpcD0iLCJwb3J0PSIsImlmaWxlPSJdKQorCWV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisJCXVzYWdlKCkKKwkJZXJyb3JBbmRFeGl0KDIsICdJbnZhbGlkIGlucHV0JykKKwkJIAorCWZvciBvcHQsIGFyZyBpbiBvcHRzOgorCSNwcmludCBvcHQsIGFyZworCQlpZiBvcHQgPT0gJy1oJzoKKwkJCXVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXN5cy5leGl0KDMpCisJCWVsaWYgb3B0IGluICgiLWkiLCAiLS1pcCIpOgorCQkJYmVIb3N0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXAiLCAiLS1wb3J0Iik6CisJCQliZVBvcnQgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItZiIsICItLWlmaWxlIik6CisJCQlpbnB1dGZpbGUgPSBhcmcKKworCXByaW50ICdiZSBob3N0ID0nLGJlSG9zdCwnLCBiZSBwb3J0ID0nLCBiZVBvcnQsJywgdXNlcnMgZmlsZSA9JyxpbnB1dGZpbGUKKwkKKwlpZiAoIGlucHV0ZmlsZSA9PSBOb25lICk6CisJCXVzYWdlKCkKKwkJc3lzLmV4aXQoMykKKworCXByaW50ICdJbnB1dCBmaWxlIGlzICcsIGlucHV0ZmlsZQorCisJCisJdXNlcnNBc1lhbWxGaWxlID0gb3BlbihpbnB1dGZpbGUsICdyJykKKyAgICAJdXNlcnNEb2MgPSB5YW1sLmxvYWQodXNlcnNBc1lhbWxGaWxlKQkKKwlwcmludCB1c2Vyc0RvYyAKKworCWNsb25lVXNlcnMgPSBbXSAKKwlmb3IgdXNlcnMgaW4gdXNlcnNEb2MudmFsdWVzKCk6CisJCWZvciB4LHkgaW4gdXNlcnMuaXRlbXMoKToJCQorCQkJY29waWVkVXNlciA9IHkKKwkJCWNvcGllZFVzZXJbJ3VzZXJJZCddID0geAorCQkJI3ByaW50IGNvcGllZFVzZXIgCisJCQljbG9uZVVzZXJzLmFwcGVuZChjb3BpZWRVc2VyKQorCQorCXByaW50IGNsb25lVXNlcnMKKworCXVzZXJzQXNZYW1sRmlsZS5jbG9zZSgpCisKKwkjYWN0aXZlVXNlcnMgPSBmaWx0ZXIobGFtYmRhIHg6IHguZ2V0KCdzdGF0dXMnKSA9PSBOb25lIG9yIHhbJ3N0YXR1cyddID09ICdBQ1RJVkUnLCBjbG9uZVVzZXJzKQorCisJcmVzdWx0VGFibGUgPSBpbXBvcnRVc2VycyhiZUhvc3QsIGJlUG9ydCwgY2xvbmVVc2VycywgYWRtaW5Vc2VyKQorCisJZyA9IGxhbWJkYSB4OiB4WzFdICE9IDIwMSBhbmQgeFsxXSAhPSA0MDkKKworCXJlc3VsdCA9IGZpbHRlcihnLCByZXN1bHRUYWJsZSkKKworCWlmICggbGVuKHJlc3VsdCkgPiAwICk6CisJCSNwcmludCgiRVJST1I6IEZhaWxlZCB0byBsb2FkIHRoZSB1c2VycyAiICsgJywgJy5qb2luKG1hcChsYW1iZGEgeDogeFswXSxyZXN1bHQpKSkKKwkJZXJyb3JBbmRFeGl0KDMsICJGYWlsZWQgdG8gbG9hZCB0aGUgdXNlcnMgIiArICcsICcuam9pbihtYXAobGFtYmRhIHg6IHhbMF0scmVzdWx0KSkpCQorCisJZyA9IGxhbWJkYSB4OiB4WzFdID09IDQwOQorCXJlc3VsdCA9IGZpbHRlcihnLCByZXN1bHRUYWJsZSkKKworCXByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKKwlwcmludCgiRXhpc3RpbmcgdXNlcnM6ICIgKyAnLCAnLmpvaW4obWFwKGxhbWJkYSB4OiB4WzBdLHJlc3VsdCkpKQorCisJcmVzdWx0ID0gZmlsdGVyKGxhbWJkYSB4OiB4WzFdID09IDIwMSwgcmVzdWx0VGFibGUpCisJaWYgKCBsZW4ocmVzdWx0KSA9PSAwICk6CisJCXByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKKwkJcHJpbnQoIk5vIE5FVyB1c2VyIHdhcyBsb2FkZWQuIEFsbCB1c2VycyBhcmUgYWxyZWFkeSBleGlzdCIpCisJCXByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKKwllbHNlOgorCQlwcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCisJCXByaW50KCJMb2FkZWQgdXNlcnM6ICIgKyAnLCAnLmpvaW4obWFwKGxhbWJkYSB4OiB4WzBdLHJlc3VsdCkpKQorCQlwcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCisKKwllcnJvckFuZEV4aXQoMCwgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICAgICBtYWluKHN5cy5hcmd2WzE6XSkKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvdXBncmFkZU5vcm1hdGl2ZS5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL3VwZ3JhZGVOb3JtYXRpdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiYjYyMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL3VwZ3JhZGVOb3JtYXRpdmUucHkKQEAgLTAsMCArMSwxMTQgQEAKK2ltcG9ydCBweWN1cmwKK2ltcG9ydCBzeXMsIGdldG9wdCwgb3MKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQganNvbgoraW1wb3J0IGNvcHkKK2ltcG9ydCB0aW1lCitmcm9tIGltcG9ydENhdGVnb3J5VHlwZXMgaW1wb3J0IGltcG9ydENhdGVnb3JpZXMKK2Zyb20gaW1wb3J0SGVhdFR5cGVzIGltcG9ydCBpbXBvcnRIZWF0VHlwZXMKK2Zyb20gaW1wb3J0Tm9ybWF0aXZlQ2FwYWJpbGl0aWVzIGltcG9ydCBpbXBvcnROb3JtYXRpdmVDYXBhYmlsaXRpZXMKK2Zyb20gaW1wb3J0RGF0YVR5cGVzIGltcG9ydCBpbXBvcnREYXRhVHlwZXMKK2Zyb20gaW1wb3J0R3JvdXBUeXBlcyBpbXBvcnQgaW1wb3J0R3JvdXBUeXBlcworZnJvbSBpbXBvcnRQb2xpY3lUeXBlcyBpbXBvcnQgaW1wb3J0UG9saWN5VHlwZXMKK2Zyb20gaW1wb3J0Q29tbW9uIGltcG9ydCAqCitpbXBvcnQgaW1wb3J0Q29tbW9uCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgIAkJCQkJCQkJCQkJCQkjCQorIyBVcGdyYWRlcyB0aGUgbm9ybWF0aXZlIHR5cGVzCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAJCQkJCQkJCQkJCQkJCQkjCisjIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgCQkJCQkJCQkJCQkJCSMJCQorIyBhY3RpdmF0aW9uIDoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIAkJCQkJCQkJCQkJCQkjCisjICAgICAgIHB5dGhvbiB1cGdyYWRlTm9ybWF0aXZlLnB5IFstaSA8YmUgaG9zdD4gfCAtLWlwPTxiZSBob3N0Pl0gWy1wIDxiZSBwb3J0PiB8IC0tcG9ydD08YmUgcG9ydD4gXSBbLXUgPHVzZXIgdXNlcklkPiB8IC0tdXNlcj08dXNlciB1c2VySWQ+IF0gWy1kIDx0cnVlfGZhbHNlPiB8IC0tZGVidWc9PHRydWV8ZmFsc2U+XSAJCSMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgCSAgIAkJCQkJCQkJCQkJCQkjCQkJCisjIHNob3J0ZXN0IGFjdGl2YXRpb24gKGJlIGhvc3QgPSBsb2NhbGhvc3QsIGJlIHBvcnQgPSA4MDgwLCB1c2VyID0gamgwMDAzKTogCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAJCQkJCQkJCQkjCSMJCQkJCQkJCQkJCQkgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkjCisjCQlweXRob24gdXBncmFkZU5vcm1hdGl2ZS5weQkJCQkJCQkJCQkJCSAJCQkJICAgICAgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgICAgCQkJCQkJCQkJCQkJCSMJCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiB1c2FnZSgpOgorCXByaW50IHN5cy5hcmd2WzBdLCAnWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstdSA8dXNlciB1c2VySWQ+IHwgLS11c2VyPTx1c2VyIHVzZXJJZD4gXSBbLWQgPHRydWV8ZmFsc2U+IHwgLS1kZWJ1Zz08dHJ1ZXxmYWxzZT5dJworCitkZWYgaGFuZGxlUmVzdWx0cyhyZXN1bHRzLCB1cGRhdGV2ZXJzaW9uKToKKwlwcmludEZyYW1lTGluZSgpCisJZm9yIHJlc3VsdCBpbiByZXN1bHRzOgorCQlwcmludE5hbWVBbmRSZXR1cm5Db2RlKHJlc3VsdFswXSwgcmVzdWx0WzFdKQorCXByaW50RnJhbWVMaW5lKCkKKwkKKwlmYWlsZWRSZXN1bHRzID0gZmlsdGVyKGxhbWJkYSB4OiB4WzFdID09IE5vbmUgb3IgeFsxXSBub3QgaW4gWzIwMCwgMjAxLCA0MDldLCByZXN1bHRzKQorCWlmIChsZW4oZmFpbGVkUmVzdWx0cykgPiAwKToKKwkJZXJyb3JBbmRFeGl0KDEsIE5vbmUpCisKK2RlZiBtYWluKGFyZ3YpOgorCXByaW50ICdOdW1iZXIgb2YgYXJndW1lbnRzOicsIGxlbihzeXMuYXJndiksICdhcmd1bWVudHMuJworCisJYmVIb3N0ID0gJ2xvY2FsaG9zdCcgCisJYmVQb3J0ID0gJzgwODAnCisJYWRtaW5Vc2VyID0gJ2poMDAwMycKKwlkZWJ1Z2YgPSBOb25lCisJdXBkYXRldmVyc2lvbiA9ICdmYWxzZScKKwlpbXBvcnRDb21tb24uZGVidWdGbGFnID0gRmFsc2UgCisKKwl0cnk6CisJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3YsImk6cDp1OmQ6aCIsWyJpcD0iLCJwb3J0PSIsInVzZXI9IiwiZGVidWc9Il0pCisJZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKwkJdXNhZ2UoKQorCQllcnJvckFuZEV4aXQoMiwgJ0ludmFsaWQgaW5wdXQnKQorCQorCWZvciBvcHQsIGFyZyBpbiBvcHRzOgorCSNwcmludCBvcHQsIGFyZworCQlpZiBvcHQgPT0gJy1oJzoKKwkJCXVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXN5cy5leGl0KDMpCisJCWVsaWYgb3B0IGluICgiLWkiLCAiLS1pcCIpOgorCQkJYmVIb3N0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXAiLCAiLS1wb3J0Iik6CisJCQliZVBvcnQgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItdSIsICItLXVzZXIiKToKKwkJCWFkbWluVXNlciA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1kIiwgIi0tZGVidWciKToKKwkJCXByaW50IGFyZworCQkJZGVidWdmID0gYm9vbChhcmcubG93ZXIoKSA9PSAidHJ1ZSIgb3IgYXJnLmxvd2VyKCkgPT0gInllcyIpCisKKwlwcmludCAnYmUgaG9zdCA9JyxiZUhvc3QsJywgYmUgcG9ydCA9JywgYmVQb3J0LCcsIHVzZXIgPScsIGFkbWluVXNlciwgJywgZGVidWcgPScsIGRlYnVnZgorCisJaWYgKGRlYnVnZiAhPSBOb25lKToKKwkJcHJpbnQgJ3NldCBkZWJ1ZyBtb2RlIHRvICcgKyBzdHIoZGVidWdmKQorCQlpbXBvcnRDb21tb24uZGVidWdGbGFnID0gZGVidWdmCisJCisJaWYgKCBiZUhvc3QgPT0gTm9uZSApOgorCQl1c2FnZSgpCisJCXN5cy5leGl0KDMpCisKKwlwcmludCBzeXMuYXJndlswXQorCXBhdGhkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChzeXMuYXJndlswXSkpICAgICAgCisJZGVidWcoInBhdGggZGlyID0iICsgcGF0aGRpcikKKworCWJhc2VGaWxlTG9jYXRpb24gPSBwYXRoZGlyICsgIi8uLi8uLi8uLi9pbXBvcnQvdG9zY2EvIgorCisJZmlsZUxvY2F0aW9uID0gYmFzZUZpbGVMb2NhdGlvbiArICJjYXRlZ29yaWVzLyIKKwlpbXBvcnRDYXRlZ29yaWVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIEZhbHNlLCBmaWxlTG9jYXRpb24pCisKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgImRhdGEtdHlwZXMvIgorCWltcG9ydERhdGFUeXBlcyhiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBGYWxzZSwgZmlsZUxvY2F0aW9uKQorCisJcHJpbnQgJ3NsZWVwIHVudGlsIGRhdGEgdHlwZSBjYWNoZSBpcyB1cGRhdGVkJworCXRpbWUuc2xlZXAoIDcwICkKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgImNhcGFiaWxpdHktdHlwZXMvIgorCWltcG9ydE5vcm1hdGl2ZUNhcGFiaWxpdGllcyhiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBGYWxzZSwgZmlsZUxvY2F0aW9uKQorICAKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgImdyb3VwLXR5cGVzLyIKKwlpbXBvcnRHcm91cFR5cGVzKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIEZhbHNlLCBmaWxlTG9jYXRpb24pCisKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgInBvbGljeS10eXBlcy8iCisJaW1wb3J0UG9saWN5VHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgRmFsc2UsIGZpbGVMb2NhdGlvbikKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaGVhdC10eXBlcy8iCisJcmVzdWx0c0hlYXQgPSBpbXBvcnRIZWF0VHlwZXMoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZUxvY2F0aW9uLCB1cGRhdGV2ZXJzaW9uKQorCWhhbmRsZVJlc3VsdHMocmVzdWx0c0hlYXQsICdmYWxzZScpCisKKwllcnJvckFuZEV4aXQoMCwgTm9uZSkJCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS91cGdyYWRlTm9ybWF0aXZlVmVyc2lvbi5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL3VwZ3JhZGVOb3JtYXRpdmVWZXJzaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzAxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS91cGdyYWRlTm9ybWF0aXZlVmVyc2lvbi5weQpAQCAtMCwwICsxLDE0MyBAQAoraW1wb3J0IHB5Y3VybAoraW1wb3J0IHN5cywgZ2V0b3B0LCBvcworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBqc29uCitpbXBvcnQgY29weQorZnJvbSBpbXBvcnRDb21tb24gaW1wb3J0ICoKK2Zyb20gaW1wb3J0Tm9ybWF0aXZlVHlwZXMgaW1wb3J0IGNyZWF0ZU5vcm1hdGl2ZVR5cGUKK2ltcG9ydCBpbXBvcnRDb21tb24KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgICAgCQkJCQkJCQkJCQkJCSMJCisjIFVwZ3JhZGVzIHRoZSBub3JtYXRpdmUgdHlwZXMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIAkJCQkJCQkJCQkJCQkJCSMKKyMgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAJCQkJCQkJCQkJCQkJIwkJCisjIGFjdGl2YXRpb24gOgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgCQkJCQkJCQkJCQkJCSMKKyMgICAgICAgcHl0aG9uIHVwZ3JhZGVOb3JtYXRpdmUucHkgWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstdSA8dXNlciB1c2VySWQ+IHwgLS11c2VyPTx1c2VyIHVzZXJJZD4gXSBbLWQgPHRydWV8ZmFsc2U+IHwgLS1kZWJ1Zz08dHJ1ZXxmYWxzZT5dIAkJIworIwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSMKKyMJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAJICAgCQkJCQkJCQkJCQkJCSMJCQkKKyMgc2hvcnRlc3QgYWN0aXZhdGlvbiAoYmUgaG9zdCA9IGxvY2FsaG9zdCwgYmUgcG9ydCA9IDgwODAsIHVzZXIgPSBqaDAwMDMpOiAJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIAkJCQkJCQkJCSMJIwkJCQkJCQkJCQkJCSAgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSMKKyMJCXB5dGhvbiB1cGdyYWRlTm9ybWF0aXZlLnB5CQkJCQkJCQkJCQkJIAkJCQkgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkjCisjCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAJCQkJCQkJCQkJCQkJIwkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIHVzYWdlKCk6CisJcHJpbnQgc3lzLmFyZ3ZbMF0sICdbLWkgPGJlIGhvc3Q+IHwgLS1pcD08YmUgaG9zdD5dIFstcCA8YmUgcG9ydD4gfCAtLXBvcnQ9PGJlIHBvcnQ+IF0gWy11IDx1c2VyIHVzZXJJZD4gfCAtLXVzZXI9PHVzZXIgdXNlcklkPiBdIFstZCA8dHJ1ZXxmYWxzZT4gfCAtLWRlYnVnPTx0cnVlfGZhbHNlPl0nCisKK2RlZiBoYW5kbGVSZXN1bHRzKHJlc3VsdHMsIHVwZGF0ZXZlcnNpb24pOgorCXByaW50RnJhbWVMaW5lKCkKKwlmb3IgcmVzdWx0IGluIHJlc3VsdHM6CisJCXByaW50TmFtZUFuZFJldHVybkNvZGUocmVzdWx0WzBdLCByZXN1bHRbMV0pCisJcHJpbnRGcmFtZUxpbmUoKQorCQorCWZhaWxlZFJlc3VsdHMgPSBmaWx0ZXIobGFtYmRhIHg6IHhbMV0gPT0gTm9uZSBvciB4WzFdIG5vdCBpbiBbMjAwLCAyMDEsIDQwOV0sIHJlc3VsdHMpCisJaWYgKGxlbihmYWlsZWRSZXN1bHRzKSA+IDApOgorCQllcnJvckFuZEV4aXQoMSwgTm9uZSkKKworZGVmIG1haW4oYXJndik6CisJcHJpbnQgJ051bWJlciBvZiBhcmd1bWVudHM6JywgbGVuKHN5cy5hcmd2KSwgJ2FyZ3VtZW50cy4nCisKKwliZUhvc3QgPSAnbG9jYWxob3N0JyAKKwliZVBvcnQgPSAnODA4MCcKKwlhZG1pblVzZXIgPSAnamgwMDAzJworCWRlYnVnZiA9IE5vbmUKKwl1cGRhdGV2ZXJzaW9uID0gJ3RydWUnCisJaW1wb3J0Q29tbW9uLmRlYnVnRmxhZyA9IEZhbHNlIAorCisJdHJ5OgorCQlvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmd2LCJpOnA6dTpkOmgiLFsiaXA9IiwicG9ydD0iLCJ1c2VyPSIsImRlYnVnPSJdKQorCWV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisJCXVzYWdlKCkKKwkJZXJyb3JBbmRFeGl0KDIsICdJbnZhbGlkIGlucHV0JykKKwkKKwlmb3Igb3B0LCBhcmcgaW4gb3B0czoKKwkjcHJpbnQgb3B0LCBhcmcKKwkJaWYgb3B0ID09ICctaCc6CisJCQl1c2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzeXMuZXhpdCgzKQorCQllbGlmIG9wdCBpbiAoIi1pIiwgIi0taXAiKToKKwkJCWJlSG9zdCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi1wIiwgIi0tcG9ydCIpOgorCQkJYmVQb3J0ID0gYXJnCisJCWVsaWYgb3B0IGluICgiLXUiLCAiLS11c2VyIik6CisJCQlhZG1pblVzZXIgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItZCIsICItLWRlYnVnIik6CisJCQlwcmludCBhcmcKKwkJCWRlYnVnZiA9IGJvb2woYXJnLmxvd2VyKCkgPT0gInRydWUiIG9yIGFyZy5sb3dlcigpID09ICJ5ZXMiKQorCisJcHJpbnQgJ2JlIGhvc3QgPScsYmVIb3N0LCcsIGJlIHBvcnQgPScsIGJlUG9ydCwnLCB1c2VyID0nLCBhZG1pblVzZXIsICcsIGRlYnVnID0nLCBkZWJ1Z2YKKworCWlmIChkZWJ1Z2YgIT0gTm9uZSk6CisJCXByaW50ICdzZXQgZGVidWcgbW9kZSB0byAnICsgc3RyKGRlYnVnZikKKwkJaW1wb3J0Q29tbW9uLmRlYnVnRmxhZyA9IGRlYnVnZgorCQorCWlmICggYmVIb3N0ID09IE5vbmUgKToKKwkJdXNhZ2UoKQorCQlzeXMuZXhpdCgzKQorCisJcHJpbnQgc3lzLmFyZ3ZbMF0KKwlwYXRoZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoc3lzLmFyZ3ZbMF0pKSAgICAgIAorCWRlYnVnKCJwYXRoIGRpciA9IiArIHBhdGhkaXIpCisKKwliYXNlRmlsZUxvY2F0aW9uID0gcGF0aGRpciArICIvLi4vLi4vLi4vaW1wb3J0L3Rvc2NhLyIKKwlyZXN1bHRzID0gW10KKworCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tZm9yIHJlbGVhc2UgMTYxMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgIm5vcm1hdGl2ZS10eXBlcy8iCisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sICJjb21wdXRlIiwgdXBkYXRldmVyc2lvbikKKwlyZXN1bHRzLmFwcGVuZChyZXN1bHQpCisKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgIm5vcm1hdGl2ZS10eXBlcy8iCisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sICJuZXR3b3JrIiwgdXBkYXRldmVyc2lvbikKKwlyZXN1bHRzLmFwcGVuZChyZXN1bHQpCisKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgImhlYXQtdHlwZXMvIgorCXJlc3VsdCA9IGNyZWF0ZU5vcm1hdGl2ZVR5cGUoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZUxvY2F0aW9uLCAiYWJzdHJhY3RTdWJzdGl0dXRlIiwgdXBkYXRldmVyc2lvbikKKwlyZXN1bHRzLmFwcGVuZChyZXN1bHQpCisKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgImhlYXQtdHlwZXMvIgorCXJlc3VsdCA9IGNyZWF0ZU5vcm1hdGl2ZVR5cGUoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZUxvY2F0aW9uLCAiY29udHJhaWxBYnN0cmFjdFN1YnN0aXR1dGUiLCB1cGRhdGV2ZXJzaW9uKQorCXJlc3VsdHMuYXBwZW5kKHJlc3VsdCkKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaGVhdC10eXBlcy8iCisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sICJjb250cmFpbE5ldHdvcmtSdWxlcyIsIHVwZGF0ZXZlcnNpb24pCisJcmVzdWx0cy5hcHBlbmQocmVzdWx0KQorCisJZmlsZUxvY2F0aW9uID0gYmFzZUZpbGVMb2NhdGlvbiArICJoZWF0LXR5cGVzLyIKKwlyZXN1bHQgPSBjcmVhdGVOb3JtYXRpdmVUeXBlKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGZpbGVMb2NhdGlvbiwgIm5vdmFTZXJ2ZXIiLCB1cGRhdGV2ZXJzaW9uKQorCXJlc3VsdHMuYXBwZW5kKHJlc3VsdCkKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaGVhdC10eXBlcy8iCisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sICJuZXV0cm9uUG9ydCIsIHVwZGF0ZXZlcnNpb24pCisJcmVzdWx0cy5hcHBlbmQocmVzdWx0KQorCisJZmlsZUxvY2F0aW9uID0gYmFzZUZpbGVMb2NhdGlvbiArICJoZWF0LXR5cGVzLyIKKwlyZXN1bHQgPSBjcmVhdGVOb3JtYXRpdmVUeXBlKGJlSG9zdCwgYmVQb3J0LCBhZG1pblVzZXIsIGZpbGVMb2NhdGlvbiwgImNvbnRyYWlsVmlydHVhbE5ldHdvcmsiLCB1cGRhdGV2ZXJzaW9uKQorCXJlc3VsdHMuYXBwZW5kKHJlc3VsdCkKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaGVhdC10eXBlcy8iCisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sICJuZXV0cm9uTmV0IiwgdXBkYXRldmVyc2lvbikKKwlyZXN1bHRzLmFwcGVuZChyZXN1bHQpCisKKwlmaWxlTG9jYXRpb24gPSBiYXNlRmlsZUxvY2F0aW9uICsgImhlYXQtdHlwZXMvIgorCXJlc3VsdCA9IGNyZWF0ZU5vcm1hdGl2ZVR5cGUoYmVIb3N0LCBiZVBvcnQsIGFkbWluVXNlciwgZmlsZUxvY2F0aW9uLCAidmwiLCB1cGRhdGV2ZXJzaW9uKQorCXJlc3VsdHMuYXBwZW5kKHJlc3VsdCkKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaGVhdC10eXBlcy8iCisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sICJjb250cmFpbFYyVmlydHVhbE5ldHdvcmsiLCB1cGRhdGV2ZXJzaW9uKQorCXJlc3VsdHMuYXBwZW5kKHJlc3VsdCkKKworCWZpbGVMb2NhdGlvbiA9IGJhc2VGaWxlTG9jYXRpb24gKyAiaGVhdC10eXBlcy8iCisJcmVzdWx0ID0gY3JlYXRlTm9ybWF0aXZlVHlwZShiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sICJzZWN1cml0eVJ1bGVzIiwgdXBkYXRldmVyc2lvbikKKwlyZXN1bHRzLmFwcGVuZChyZXN1bHQpCisKKwloYW5kbGVSZXN1bHRzKHJlc3VsdHMsICdmYWxzZScpCisKKwllcnJvckFuZEV4aXQoMCwgTm9uZSkJCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS91cGdyYWRlTm9ybWF0aXZlVmVyc2lvbkFsbC5weSBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhL3VwZ3JhZGVOb3JtYXRpdmVWZXJzaW9uQWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTk4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2ltcG9ydC90b3NjYS91cGdyYWRlTm9ybWF0aXZlVmVyc2lvbkFsbC5weQpAQCAtMCwwICsxLDkzIEBACitpbXBvcnQgcHljdXJsCitpbXBvcnQgc3lzLCBnZXRvcHQsIG9zCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IGpzb24KK2ltcG9ydCBjb3B5CitpbXBvcnQgdGltZQorZnJvbSBpbXBvcnROb3JtYXRpdmVUeXBlcyBpbXBvcnQgaW1wb3J0Tm9ybWF0aXZlVHlwZXMKK2Zyb20gaW1wb3J0SGVhdFR5cGVzIGltcG9ydCBpbXBvcnRIZWF0VHlwZXMKK2Zyb20gaW1wb3J0Q29tbW9uIGltcG9ydCAqCitpbXBvcnQgaW1wb3J0Q29tbW9uCisKK2RlZiB1c2FnZSgpOgorCXByaW50IHN5cy5hcmd2WzBdLCAnWy1pIDxiZSBob3N0PiB8IC0taXA9PGJlIGhvc3Q+XSBbLXAgPGJlIHBvcnQ+IHwgLS1wb3J0PTxiZSBwb3J0PiBdIFstdSA8dXNlciB1c2VySWQ+IHwgLS11c2VyPTx1c2VyIHVzZXJJZD4gXSBbLWQgPHRydWV8ZmFsc2U+IHwgLS1kZWJ1Zz08dHJ1ZXxmYWxzZT5dIFstdiA8dHJ1ZXxmYWxzZT4gfCAtLXVwZGF0ZXZlcnNpb249PHRydWV8ZmFsc2U+XScKKworZGVmIGhhbmRsZVJlc3VsdHMocmVzdWx0cywgdXBkYXRldmVyc2lvbik6CisJcHJpbnRGcmFtZUxpbmUoKQorCWZvciByZXN1bHQgaW4gcmVzdWx0czoKKwkJcHJpbnROYW1lQW5kUmV0dXJuQ29kZShyZXN1bHRbMF0sIHJlc3VsdFsxXSkKKwlwcmludEZyYW1lTGluZSgpCisJCisJcmVzcG9uc2VDb2RlcyA9IFsyMDAsIDIwMV0KKwkKKwlpZih1cGRhdGV2ZXJzaW9uID09ICdmYWxzZScpOgorCQlyZXNwb25zZUNvZGVzID0gWzIwMCwgMjAxLCA0MDldCisJCisJZmFpbGVkUmVzdWx0cyA9IGZpbHRlcihsYW1iZGEgeDogeFsxXSA9PSBOb25lIG9yIHhbMV0gbm90IGluIHJlc3BvbnNlQ29kZXMsIHJlc3VsdHMpCisJaWYgKGxlbihmYWlsZWRSZXN1bHRzKSA+IDApOgorCQllcnJvckFuZEV4aXQoMSwgTm9uZSkKKworZGVmIG1haW4oYXJndik6CisJcHJpbnQgJ051bWJlciBvZiBhcmd1bWVudHM6JywgbGVuKHN5cy5hcmd2KSwgJ2FyZ3VtZW50cy4nCisKKwliZUhvc3QgPSAnbG9jYWxob3N0JyAKKwliZVBvcnQgPSAnODA4MCcKKwlhZG1pblVzZXIgPSAnamgwMDAzJworCWRlYnVnZiA9IE5vbmUKKwl1cGRhdGV2ZXJzaW9uID0gJ3RydWUnCisJaW1wb3J0Q29tbW9uLmRlYnVnRmxhZyA9IEZhbHNlIAorCisJdHJ5OgorCQlvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmd2LCJpOnA6dTpkOnY6aCIsWyJpcD0iLCJwb3J0PSIsInVzZXI9IiwiZGVidWc9IiwidXBkYXRldmVyc2lvbj0iXSkKKwlleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgorCQl1c2FnZSgpCisJCWVycm9yQW5kRXhpdCgyLCAnSW52YWxpZCBpbnB1dCcpCisJCisJZm9yIG9wdCwgYXJnIGluIG9wdHM6CisJI3ByaW50IG9wdCwgYXJnCisJCWlmIG9wdCA9PSAnLWgnOgorCQkJdXNhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc3lzLmV4aXQoMykKKwkJZWxpZiBvcHQgaW4gKCItaSIsICItLWlwIik6CisJCQliZUhvc3QgPSBhcmcKKwkJZWxpZiBvcHQgaW4gKCItcCIsICItLXBvcnQiKToKKwkJCWJlUG9ydCA9IGFyZworCQllbGlmIG9wdCBpbiAoIi11IiwgIi0tdXNlciIpOgorCQkJYWRtaW5Vc2VyID0gYXJnCisJCWVsaWYgb3B0IGluICgiLWQiLCAiLS1kZWJ1ZyIpOgorCQkJcHJpbnQgYXJnCisJCQlkZWJ1Z2YgPSBib29sKGFyZy5sb3dlcigpID09ICJ0cnVlIiBvciBhcmcubG93ZXIoKSA9PSAieWVzIikKKwkJZWxpZiBvcHQgaW4gKCItdiIsICItLXVwZGF0ZXZlcnNpb24iKToKKwkJCXByaW50IGFyZworCQkJaWYgKGFyZy5sb3dlcigpID09ICJmYWxzZSIgb3IgYXJnLmxvd2VyKCkgPT0gIm5vIik6CisJCQkJdXBkYXRldmVyc2lvbiA9ICdmYWxzZScJCQkKKworCXByaW50ICdiZSBob3N0ID0nLGJlSG9zdCwnLCBiZSBwb3J0ID0nLCBiZVBvcnQsJywgdXNlciA9JywgYWRtaW5Vc2VyLCAnLCBkZWJ1ZyA9JywgZGVidWdmLCAnLCB1cGRhdGV2ZXJzaW9uID0nLCB1cGRhdGV2ZXJzaW9uCisKKwlpZiAoZGVidWdmICE9IE5vbmUpOgorCQlwcmludCAnc2V0IGRlYnVnIG1vZGUgdG8gJyArIHN0cihkZWJ1Z2YpCisJCWltcG9ydENvbW1vbi5kZWJ1Z0ZsYWcgPSBkZWJ1Z2YKKwkKKwlpZiAoIGJlSG9zdCA9PSBOb25lICk6CisJCXVzYWdlKCkKKwkJc3lzLmV4aXQoMykKKworCXByaW50IHN5cy5hcmd2WzBdCisJcGF0aGRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKHN5cy5hcmd2WzBdKSkgICAgICAKKwlkZWJ1ZygicGF0aCBkaXIgPSIgKyBwYXRoZGlyKQorCisJYmFzZUZpbGVMb2NhdGlvbiA9IHBhdGhkaXIgKyAiLy4uLy4uLy4uL2ltcG9ydC90b3NjYS8iCisJCisJZmlsZUxvY2F0aW9uID0gYmFzZUZpbGVMb2NhdGlvbiArICJub3JtYXRpdmUtdHlwZXMvIgorCXJlc3VsdHMgPSBpbXBvcnROb3JtYXRpdmVUeXBlcyhiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sIHVwZGF0ZXZlcnNpb24pCisJaGFuZGxlUmVzdWx0cyhyZXN1bHRzLCB1cGRhdGV2ZXJzaW9uKQorCisJZmlsZUxvY2F0aW9uID0gYmFzZUZpbGVMb2NhdGlvbiArICJoZWF0LXR5cGVzLyIKKwlyZXN1bHRzSGVhdCA9IGltcG9ydEhlYXRUeXBlcyhiZUhvc3QsIGJlUG9ydCwgYWRtaW5Vc2VyLCBmaWxlTG9jYXRpb24sIHVwZGF0ZXZlcnNpb24pCisJaGFuZGxlUmVzdWx0cyhyZXN1bHRzSGVhdCwgdXBkYXRldmVyc2lvbikKKworCWVycm9yQW5kRXhpdCgwLCBOb25lKQkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgbWFpbihzeXMuYXJndlsxOl0pCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvY3NzL3ByaW50LmNzcyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvY3NzL3ByaW50LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZjMTgwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9jc3MvcHJpbnQuY3NzCkBAIC0wLDAgKzEsMTE1NSBAQAorLyogT3JpZ2luYWwgc3R5bGUgZnJvbSBzb2Z0d2FyZW1hbmlhY3Mub3JnIChjKSBJdmFuIFNhZ2FsYWV2IDxNYW5pYWNAU29mdHdhcmVNYW5pYWNzLk9yZz4gKi8KKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIGNvZGUgeworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZzogMC41ZW07CisgIGJhY2tncm91bmQ6ICNGMEYwRjA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSBjb2RlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnN1YnN0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnRhZyAudGl0bGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubGlzcCAudGl0bGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY2xvanVyZSAuYnVpbHRfaW4sCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubmdpbnggLnRpdGxlIHsKKyAgY29sb3I6IGJsYWNrOworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnN0cmluZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5jb25zdGFudCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5wYXJlbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAudGFnIC52YWx1ZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5ydWxlcyAudmFsdWUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAucnVsZXMgLnZhbHVlIC5udW1iZXIsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAucHJlcHJvY2Vzc29yLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnJ1YnkgLnN5bWJvbCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5ydWJ5IC5zeW1ib2wgLnN0cmluZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hZ2dyZWdhdGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAudGVtcGxhdGVfdGFnLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmRqYW5nbyAudmFyaWFibGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuc21hbGx0YWxrIC5jbGFzcywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hZGRpdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5mbG93LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnN0cmVhbSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5iYXNoIC52YXJpYWJsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hcGFjaGUgLnRhZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hcGFjaGUgLmNicmFja2V0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnRleCAuY29tbWFuZCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZXggLnNwZWNpYWwsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZXJsYW5nX3JlcGwgLmZ1bmN0aW9uX29yX2F0b20sCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubWFya2Rvd24gLmhlYWRlciB7CisgIGNvbG9yOiAjODAwOworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmNvbW1lbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuYW5ub3RhdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZW1wbGF0ZV9jb21tZW50LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmRpZmYgLmhlYWRlciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5jaHVuaywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5tYXJrZG93biAuYmxvY2txdW90ZSB7CisgIGNvbG9yOiAjODg4OworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm51bWJlciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5kYXRlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnJlZ2V4cCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5saXRlcmFsLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnNtYWxsdGFsayAuc3ltYm9sLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnNtYWxsdGFsayAuY2hhciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5nbyAuY29uc3RhbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY2hhbmdlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm1hcmtkb3duIC5idWxsZXQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubWFya2Rvd24gLmxpbmtfdXJsIHsKKyAgY29sb3I6ICMwODA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSAubGFiZWwsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuamF2YWRvYywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5ydWJ5IC5zdHJpbmcsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZGVjb3JhdG9yLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmZpbHRlciAuYXJndW1lbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubG9jYWx2YXJzLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmFycmF5LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmF0dHJfc2VsZWN0b3IsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuaW1wb3J0YW50LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnBzZXVkbywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5waSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5kb2N0eXBlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmRlbGV0aW9uLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmVudnZhciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5zaGViYW5nLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmFwYWNoZSAuc3FicmFja2V0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm5naW54IC5idWlsdF9pbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZXggLmZvcm11bGEsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZXJsYW5nX3JlcGwgLnJlc2VydmVkLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnByb21wdCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5tYXJrZG93biAubGlua19sYWJlbCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC52aGRsIC5hdHRyaWJ1dGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY2xvanVyZSAuYXR0cmlidXRlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmNvZmZlZXNjcmlwdCAucHJvcGVydHkgeworICBjb2xvcjogIzg4ODhmZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5rZXl3b3JkLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmlkLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnBocGRvYywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5idWlsdF9pbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hZ2dyZWdhdGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY3NzIC50YWcsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuamF2YWRvY3RhZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5waHBkb2MsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueWFyZG9jdGFnLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnNtYWxsdGFsayAuY2xhc3MsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAud2ludXRpbHMsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuYmFzaCAudmFyaWFibGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuYXBhY2hlIC50YWcsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZ28gLnR5cGVuYW1lLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnRleCAuY29tbWFuZCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5tYXJrZG93biAuc3Ryb25nLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnJlcXVlc3QsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuc3RhdHVzIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSAubWFya2Rvd24gLmVtcGhhc2lzIHsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm5naW54IC5idWlsdF9pbiB7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY29mZmVlc2NyaXB0IC5qYXZhc2NyaXB0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmphdmFzY3JpcHQgLnhtbCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZXggLmZvcm11bGEsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueG1sIC5qYXZhc2NyaXB0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnhtbCAudmJzY3JpcHQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueG1sIC5jc3MsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueG1sIC5jZGF0YSB7CisgIG9wYWNpdHk6IDAuNTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB7CisgIGxpbmUtaGVpZ2h0OiAxOworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBtYXgtd2lkdGg6IDk2MHB4OworICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgbWFyZ2luLXJpZ2h0OiBhdXRvOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgc3Ryb25nIHsKKyAgZm9udC1mYW1pbHk6ICJEcm9pZCBTYW5zIiwgc2Fucy1zZXJpZjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgcSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBibG9ja3F1b3RlIHsKKyAgcXVvdGVzOiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHAgeworICBsaW5lLWhlaWdodDogMS40ZW07CisgIHBhZGRpbmc6IDAgMCAxMHB4OworICBjb2xvcjogIzMzMzMzMzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBxOmJlZm9yZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBxOmFmdGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGJsb2NrcXVvdGU6YmVmb3JlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGJsb2NrcXVvdGU6YWZ0ZXIgeworICBjb250ZW50OiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5oZWFkaW5nX3dpdGhfbWVudSBoMSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaGVhZGluZ193aXRoX21lbnUgaDIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmhlYWRpbmdfd2l0aF9tZW51IGgzLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5oZWFkaW5nX3dpdGhfbWVudSBoNCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaGVhZGluZ193aXRoX21lbnUgaDUsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmhlYWRpbmdfd2l0aF9tZW51IGg2IHsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBub25lOworICBmbG9hdDogbGVmdDsKKyAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICB3aWR0aDogNjAlOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRhYmxlIHsKKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgYm9yZGVyLXNwYWNpbmc6IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdGFibGUgdGhlYWQgdHIgdGggeworICBwYWRkaW5nOiA1cHg7CisgIGZvbnQtc2l6ZTogMC45ZW07CisgIGNvbG9yOiAjNjY2NjY2OworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTk5OTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB0YWJsZSB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkIHsKKyAgYm9yZGVyLWJvdHRvbTogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB0YWJsZSB0Ym9keSB0ci5vZmZzZXQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRhYmxlIHRib2R5IHRyIHRkIHsKKyAgcGFkZGluZzogNnB4OworICBmb250LXNpemU6IDAuOWVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjY2NjYzsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgbGluZS1oZWlnaHQ6IDEuM2VtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIG9sIHsKKyAgbWFyZ2luOiAwcHggMCAxMHB4OworICBwYWRkaW5nOiAwIDAgMCAxOHB4OworICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgb2wgbGkgeworICBwYWRkaW5nOiA1cHggMHB4OworICBmb250LXNpemU6IDAuOWVtOworICBjb2xvcjogIzMzMzMzMzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBvbCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCB7CisgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDEgYSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMiBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGgzIGEsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDQgYSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoNSBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGg2IGEgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDEgYTpob3ZlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMiBhOmhvdmVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGgzIGE6aG92ZXIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDQgYTpob3ZlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoNSBhOmhvdmVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGg2IGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMSBzcGFuLmRpdmlkZXIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgc3Bhbi5kaXZpZGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGgzIHNwYW4uZGl2aWRlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoNCBzcGFuLmRpdmlkZXIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDUgc3Bhbi5kaXZpZGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGg2IHNwYW4uZGl2aWRlciB7CisgIGNvbG9yOiAjYWFhYWFhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGEgeworICBjb2xvcjogIzU0N2YwMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBhIGltZyB7CisgIGJvcmRlcjogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBhcnRpY2xlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGFzaWRlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGRldGFpbHMsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZmlnY2FwdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmaWd1cmUsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9vdGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGhlYWRlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoZ3JvdXAsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgbWVudSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBuYXYsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgc2VjdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBzdW1tYXJ5IHsKKyAgZGlzcGxheTogYmxvY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgcHJlIHsKKyAgZm9udC1mYW1pbHk6ICJBbm9ueW1vdXMgUHJvIiwgIk1lbmxvIiwgIkNvbnNvbGFzIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjZkYjsKKyAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTBjNjsKKyAgcGFkZGluZzogMTBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBwcmUgY29kZSB7CisgIGxpbmUtaGVpZ2h0OiAxLjZlbTsKKyAgYmFja2dyb3VuZDogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuY29udGVudCA+IC5jb250ZW50LXR5cGUgPiBkaXYgPiBsYWJlbCB7CisgIGNsZWFyOiBib3RoOworICBkaXNwbGF5OiBibG9jazsKKyAgY29sb3I6ICMwRjZBQjQ7CisgIGZvbnQtc2l6ZTogMS4xZW07CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMTVweCAwIDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuY29udGVudCBwcmUgeworICBmb250LXNpemU6IDEycHg7CisgIG1hcmdpbi10b3A6IDVweDsKKyAgcGFkZGluZzogNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5pY29uLWJ0biB7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaW5mb190aXRsZSB7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1zaXplOiAyNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHAuYmlnLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGRpdi5iaWcgcCB7CisgIGZvbnQtc2l6ZTogMWVtOworICBtYXJnaW4tYm90dG9tOiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZnVsbHdpZHRoIG9sIGxpLnN0cmluZyBpbnB1dCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZ1bGx3aWR0aCBvbCBsaS51cmwgaW5wdXQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mdWxsd2lkdGggb2wgbGkudGV4dCB0ZXh0YXJlYSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZ1bGx3aWR0aCBvbCBsaS5udW1lcmljIGlucHV0IHsKKyAgd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fbGljZW5zZSB7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fdG9zIHsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWVzc2FnZS1mYWlsIHsKKyAgY29sb3I6ICNjYzAwMDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fdXJsIHsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaW5mb19lbWFpbCB7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fbmFtZSB7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fZGVzY3JpcHRpb24geworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKKyAgZm9udC1zaXplOiAxNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tYXJrZG93biBvbCBsaSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWFya2Rvd24gdWwgbGkgeworICBwYWRkaW5nOiAzcHggMHB4OworICBsaW5lLWhlaWdodDogMS40ZW07CisgIGNvbG9yOiAjMzMzMzMzOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkuc3RyaW5nIGlucHV0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkudXJsIGlucHV0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkubnVtZXJpYyBpbnB1dCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nOiA0cHg7CisgIHdpZHRoOiBhdXRvOworICBjbGVhcjogYm90aDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpLnN0cmluZyBpbnB1dC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpLnVybCBpbnB1dC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpLm51bWVyaWMgaW5wdXQudGl0bGUgeworICBmb250LXNpemU6IDEuM2VtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRhYmxlLmZ1bGx3aWR0aCB7CisgIHdpZHRoOiAxMDAlOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgeworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDFlbTsKKyAgbGluZS1oZWlnaHQ6IDEuNWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnNpZ25hdHVyZS1uYXYgYSB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgY29sb3I6ICNBQUE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSAuc2lnbmF0dXJlLW5hdiBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5zaWduYXR1cmUtbmF2IC5zZWxlY3RlZCB7CisgIGNvbG9yOiBibGFjazsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnByb3BUeXBlIHsKKyAgY29sb3I6ICM1NTU1YWE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSBwcmU6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmRkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgcHJlIHsKKyAgZm9udC1zaXplOiAuODVlbTsKKyAgbGluZS1oZWlnaHQ6IDEuMmVtOworICBvdmVyZmxvdzogYXV0bzsKKyAgbWF4LWhlaWdodDogMjAwcHg7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIHVsLnNpZ25hdHVyZS1uYXYgeworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgdWwuc2lnbmF0dXJlLW5hdiBsaTpsYXN0LWNoaWxkIHsKKyAgcGFkZGluZy1yaWdodDogMDsKKyAgYm9yZGVyLXJpZ2h0OiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgdWwuc2lnbmF0dXJlLW5hdiBsaSB7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW46IDAgNXB4IDVweCAwOworICBwYWRkaW5nOiAycHggNXB4IDJweCAwOworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnByb3BPcHQgeworICBjb2xvcjogIzU1NTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5zbmlwcGV0IHNtYWxsIHsKKyAgZm9udC1zaXplOiAwLjc1ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSAucHJvcE9wdEtleSB7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5kZXNjcmlwdGlvbiAuc3Ryb25nIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGNvbG9yOiAjMDAwOworICBmb250LXNpemU6IC45ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSAuZGVzY3JpcHRpb24gZGl2IHsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgbGluZS1oZWlnaHQ6IDEuNWVtOworICBtYXJnaW4tbGVmdDogMWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLmRlc2NyaXB0aW9uIC5zdHJvbmdlciB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBjb2xvcjogIzAwMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5kZXNjcmlwdGlvbiAucHJvcFdyYXAgLm9wdGlvbnNXcmFwcGVyIHsKKyAgYm9yZGVyLXNwYWNpbmc6IDA7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyOiAxcHggc29saWQgI2JiYmJiYjsKKyAgZGlzcGxheTogbm9uZTsKKyAgZm9udC1zaXplOiAxMXB4OworICBtYXgtd2lkdGg6IDQwMHB4OworICBsaW5lLWhlaWdodDogMzBweDsKKyAgY29sb3I6IGJsYWNrOworICBwYWRkaW5nOiA1cHg7CisgIG1hcmdpbi1sZWZ0OiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLmRlc2NyaXB0aW9uIC5wcm9wV3JhcCAub3B0aW9uc1dyYXBwZXIgdGggeworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNiYmJiYmI7CisgIGZvbnQtc2l6ZTogMTFweDsKKyAgY29sb3I6ICM2NjY2NjY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBwYWRkaW5nOiA1cHg7CisgIGxpbmUtaGVpZ2h0OiAxNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLmRlc2NyaXB0aW9uIC5wcm9wV3JhcCAub3B0aW9uc1dyYXBwZXIgLm9wdGlvbk5hbWUgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5wcm9wTmFtZSB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnNpZ25hdHVyZS1jb250YWluZXIgeworICBjbGVhcjogYm90aDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuYm9keS10ZXh0YXJlYSB7CisgIHdpZHRoOiAzMDBweDsKKyAgaGVpZ2h0OiAxMDBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWFya2Rvd24gcCBjb2RlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tYXJrZG93biBsaSBjb2RlIHsKKyAgZm9udC1mYW1pbHk6ICJBbm9ueW1vdXMgUHJvIiwgIk1lbmxvIiwgIkNvbnNvbGFzIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKKyAgY29sb3I6IGJsYWNrOworICBwYWRkaW5nOiAxcHggM3B4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5yZXF1aXJlZCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGlucHV0LnBhcmFtZXRlciB7CisgIHdpZHRoOiAzMDBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMSB7CisgIGNvbG9yOiBibGFjazsKKyAgZm9udC1zaXplOiAxLjVlbTsKKyAgbGluZS1oZWlnaHQ6IDEuM2VtOworICBwYWRkaW5nOiAxMHB4IDAgMTBweCAwOworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXdlaWdodDogYm9sZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaGVhZGluZ193aXRoX21lbnUgeworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5oZWFkaW5nX3dpdGhfbWVudSB1bCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IHJpZ2h0OworICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgLW1zLWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgeworICBjb2xvcjogYmxhY2s7CisgIGZvbnQtc2l6ZTogMS4zZW07CisgIHBhZGRpbmc6IDEwcHggMCAxMHB4IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgYSB7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMiBzcGFuLnN1YiB7CisgIGZvbnQtc2l6ZTogMC43ZW07CisgIGNvbG9yOiAjOTk5OTk5OworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgc3Bhbi5zdWIgYSB7CisgIGNvbG9yOiAjNzc3Nzc3OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHNwYW4ud2VhayB7CisgIGNvbG9yOiAjNjY2NjY2OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tZXNzYWdlLXN1Y2Nlc3MgeworICBjb2xvcjogIzg5QkYwNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBjYXB0aW9uLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRoLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRkIHsKKyAgdGV4dC1hbGlnbjogbGVmdDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuY29kZSB7CisgIGZvbnQtZmFtaWx5OiAiQW5vbnltb3VzIFBybyIsICJNZW5sbyIsICJDb25zb2xhcyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaS50ZXh0IHRleHRhcmVhIHsKKyAgZm9udC1mYW1pbHk6ICJEcm9pZCBTYW5zIiwgc2Fucy1zZXJpZjsKKyAgaGVpZ2h0OiAyNTBweDsKKyAgcGFkZGluZzogNHB4OworICBkaXNwbGF5OiBibG9jazsKKyAgY2xlYXI6IGJvdGg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaS5zZWxlY3Qgc2VsZWN0IHsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBib3RoOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkuYm9vbGVhbiB7CisgIGZsb2F0OiBub25lOworICBjbGVhcjogYm90aDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgZGlzcGxheTogYmxvY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaS5ib29sZWFuIGxhYmVsIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIGZsb2F0OiBsZWZ0OworICBjbGVhcjogbm9uZTsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkuYm9vbGVhbiBpbnB1dCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBmbG9hdDogbGVmdDsKKyAgY2xlYXI6IG5vbmU7CisgIG1hcmdpbjogMCA1cHggMCAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkucmVxdWlyZWQgbGFiZWwgeworICBjb2xvcjogYmxhY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaSBsYWJlbCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogYm90aDsKKyAgd2lkdGg6IGF1dG87CisgIHBhZGRpbmc6IDAgMCAzcHg7CisgIGNvbG9yOiAjNjY2NjY2OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkgbGFiZWwgYWJiciB7CisgIHBhZGRpbmctbGVmdDogM3B4OworICBjb2xvcjogIzg4ODg4ODsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpIHAuaW5saW5lLWhpbnRzIHsKKyAgbWFyZ2luLWxlZnQ6IDA7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgbWFyZ2luOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5idXR0b25zIHsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHNwYW4uYmxhbmssCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgc3Bhbi5lbXB0eSB7CisgIGNvbG9yOiAjODg4ODg4OworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIGgzIHsKKyAgY29sb3I6ICM1NDdmMDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIGg0IHsKKyAgY29sb3I6ICM2NjY2NjY7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIHByZSB7CisgIGZvbnQtZmFtaWx5OiAiQW5vbnltb3VzIFBybyIsICJNZW5sbyIsICJDb25zb2xhcyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7CisgIGJhY2tncm91bmQtY29sb3I6ICNmY2Y2ZGI7CisgIGJvcmRlcjogMXB4IHNvbGlkICNlNWUwYzY7CisgIHBhZGRpbmc6IDEwcHg7CisgIG1hcmdpbjogMCAwIDEwcHggMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWFya2Rvd24gcHJlIGNvZGUgeworICBsaW5lLWhlaWdodDogMS42ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZGl2Lmdpc3QgeworICBtYXJnaW46IDIwcHggMCAyNXB4IDAgIWltcG9ydGFudDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgeworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDAuOWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZTpob3ZlciBkaXYuaGVhZGluZyBoMiBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZS5hY3RpdmUgZGl2LmhlYWRpbmcgaDIgYSB7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2U6aG92ZXIgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZS5hY3RpdmUgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICM1NTU1NTU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlOmxhc3QtY2hpbGQgeworICBib3JkZXItYm90dG9tOiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB7CisgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIHsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcGFkZGluZzogMDsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBub25lOworICBmbG9hdDogcmlnaHQ7CisgIG1hcmdpbjogMTRweCAxMHB4IDAgMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSB7CisgIGZsb2F0OiBsZWZ0OworICBjbGVhcjogbm9uZTsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAycHggMTBweDsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgY29sb3I6ICM2NjY2NjY7CisgIGZvbnQtc2l6ZTogMC45ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgYSB7CisgIGNvbG9yOiAjYWFhYWFhOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgYTpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICBjb2xvcjogYmxhY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgYTpob3ZlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhOmFjdGl2ZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhLmFjdGl2ZSB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmZpcnN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpLmZpcnN0IHsKKyAgcGFkZGluZy1sZWZ0OiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkubGFzdCB7CisgIHBhZGRpbmctcmlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9uczpmaXJzdC1jaGlsZCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucy5maXJzdCB7CisgIHBhZGRpbmctbGVmdDogMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgaDIgeworICBjb2xvcjogIzk5OTk5OTsKKyAgcGFkZGluZy1sZWZ0OiAwOworICBkaXNwbGF5OiBibG9jazsKKyAgY2xlYXI6IG5vbmU7CisgIGZsb2F0OiBsZWZ0OworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXdlaWdodDogYm9sZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgaDIgYSB7CisgIGNvbG9yOiAjOTk5OTk5OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyBoMiBhOmhvdmVyIHsKKyAgY29sb3I6IGJsYWNrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24geworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXJnaW46IDAgMCAxMHB4OworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgeworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyBoMyB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiBhdXRvOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7CisgIGxpbmUtaGVpZ2h0OiAxLjFlbTsKKyAgY29sb3I6IGJsYWNrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgaDMgc3Bhbi5wYXRoIHsKKyAgcGFkZGluZy1sZWZ0OiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgaDMgc3Bhbi5wYXRoIGEgeworICBjb2xvcjogYmxhY2s7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5oZWFkaW5nIGgzIHNwYW4ucGF0aCBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyBoMyBzcGFuLmh0dHBfbWV0aG9kIGEgeworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIGNvbG9yOiB3aGl0ZTsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICB3aWR0aDogNTBweDsKKyAgZm9udC1zaXplOiAwLjdlbTsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBwYWRkaW5nOiA3cHggMCA0cHg7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDsKKyAgLW8tYm9yZGVyLXJhZGl1czogMnB4OworICAtbXMtYm9yZGVyLXJhZGl1czogMnB4OworICAta2h0bWwtYm9yZGVyLXJhZGl1czogMnB4OworICBib3JkZXItcmFkaXVzOiAycHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyBoMyBzcGFuIHsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgdWwub3B0aW9ucyB7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDA7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IHJpZ2h0OworICBtYXJnaW46IDZweCAxMHB4IDAgMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBmbG9hdDogbGVmdDsKKyAgY2xlYXI6IG5vbmU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMnB4IDEwcHg7CisgIGZvbnQtc2l6ZTogMC45ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpLmFjY2VzcyB7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5jb250ZW50IHsKKyAgYm9yZGVyLXRvcDogbm9uZTsKKyAgcGFkZGluZzogMTBweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDZweDsKKyAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA2cHg7CisgIC1vLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDZweDsKKyAgLW1zLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDZweDsKKyAgLWtodG1sLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDZweDsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNnB4OworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDZweDsKKyAgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNnB4OworICAtby1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNnB4OworICAtbXMtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDZweDsKKyAgLWtodG1sLWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA2cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA2cHg7CisgIG1hcmdpbjogMCAwIDIwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBoNCB7CisgIGZvbnQtc2l6ZTogMS4xZW07CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMTVweCAwIDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5jb250ZW50IGRpdi5zYW5kYm94X2hlYWRlciB7CisgIGZsb2F0OiBub25lOworICBjbGVhcjogYm90aDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgZGlzcGxheTogYmxvY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIHBhZGRpbmc6IDRweCAwIDAgMTBweDsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBmb250LXNpemU6IDAuOWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGlucHV0LnN1Ym1pdCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IGxlZnQ7CisgIHBhZGRpbmc6IDZweCA4cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgc3Bhbi5yZXNwb25zZV90aHJvYmJlciB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL3Rocm9iYmVyLmdpZicpOworICB3aWR0aDogMTI4cHg7CisgIGhlaWdodDogMTZweDsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBub25lOworICBmbG9hdDogcmlnaHQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBmb3JtIGlucHV0W3R5cGU9J3RleHQnXS5lcnJvciB7CisgIG91dGxpbmU6IDJweCBzb2xpZCBibGFjazsKKyAgb3V0bGluZS1jb2xvcjogI2NjMDAwMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5jb250ZW50IGRpdi5yZXNwb25zZSBkaXYuYmxvY2sgcHJlIHsKKyAgZm9udC1mYW1pbHk6ICJBbm9ueW1vdXMgUHJvIiwgIk1lbmxvIiwgIkNvbnNvbGFzIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKKyAgcGFkZGluZzogMTBweDsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgbWF4LWhlaWdodDogNDAwcHg7CisgIG92ZXJmbG93LXk6IGF1dG87Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmMmU5OworICBib3JkZXI6IDFweCBzb2xpZCAjZjBlMGNhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucHV0IGRpdi5oZWFkaW5nIGgzIHNwYW4uaHR0cF9tZXRob2QgYSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSB7CisgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGRkZGQ7CisgIGJvcmRlci1yaWdodC1jb2xvcjogI2YwZTBjYTsKKyAgY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmNvbnRlbnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmNWVlOworICBib3JkZXI6IDFweCBzb2xpZCAjZjBlMGNhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucHV0IGRpdi5jb250ZW50IGg0IHsKKyAgY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGEgeworICBjb2xvcjogI2RjYjY3ZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmhlYWRpbmcgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmZmNkOworICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKKyAgYm9yZGVyLWNvbG9yOiAjZmZkMjBmOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uaGVhZCBkaXYuaGVhZGluZyBoMyBzcGFuLmh0dHBfbWV0aG9kIGEgeworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZkMjBmOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uaGVhZCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIHsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZmZkMjBmOworICBjb2xvcjogI2ZmZDIwZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICNmZmQyMGY7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5oZWFkIGRpdi5jb250ZW50IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmZjZDsKKyAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisgIGJvcmRlci1jb2xvcjogI2ZmZDIwZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmNvbnRlbnQgaDQgeworICBjb2xvcjogI2ZmZDIwZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGEgeworICBjb2xvcjogIzZmYzk5MjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmNWU4ZTg7CisgIGJvcmRlcjogMXB4IHNvbGlkICNlOGM2Yzc7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5kZWxldGUgZGl2LmhlYWRpbmcgaDMgc3Bhbi5odHRwX21ldGhvZCBhIHsKKyAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIHsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZThjNmM3OworICBjb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuY29udGVudCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmN2VkZWQ7CisgIGJvcmRlcjogMXB4IHNvbGlkICNlOGM2Yzc7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5kZWxldGUgZGl2LmNvbnRlbnQgaDQgeworICBjb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjYzg3ODdhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlN2Y2ZWM7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2U4ZDE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wb3N0IGRpdi5oZWFkaW5nIGgzIHNwYW4uaHR0cF9tZXRob2QgYSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMxMGE1NGE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wb3N0IGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkZGRkOworICBib3JkZXItcmlnaHQtY29sb3I6ICNjM2U4ZDE7CisgIGNvbG9yOiAjMTBhNTRhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogIzEwYTU0YTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnBvc3QgZGl2LmNvbnRlbnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJmN2YwOworICBib3JkZXI6IDFweCBzb2xpZCAjYzNlOGQxOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuY29udGVudCBoNCB7CisgIGNvbG9yOiAjMTBhNTRhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjNmZjOTkyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkNFOUUzOworICBib3JkZXI6IDFweCBzb2xpZCAjRjVENUMzOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgaDMgc3Bhbi5odHRwX21ldGhvZCBhIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0QzODA0MjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnBhdGNoIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkZGRkOworICBib3JkZXItcmlnaHQtY29sb3I6ICNmMGNlY2I7CisgIGNvbG9yOiAjRDM4MDQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICNEMzgwNDI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuY29udGVudCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYWYwZWY7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmMGNlY2I7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuY29udGVudCBoNCB7CisgIGNvbG9yOiAjRDM4MDQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGEgeworICBjb2xvcjogI2RjYjY3ZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlN2YwZjc7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2Q5ZWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5nZXQgZGl2LmhlYWRpbmcgaDMgc3Bhbi5odHRwX21ldGhvZCBhIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIHsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjYzNkOWVjOworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuY29udGVudCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlYmYzZjk7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2Q5ZWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5nZXQgZGl2LmNvbnRlbnQgaDQgeworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjNmZhNWQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlN2YwZjc7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2Q5ZWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5vcHRpb25zIGRpdi5oZWFkaW5nIGgzIHNwYW4uaHR0cF9tZXRob2QgYSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMwZjZhYjQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5vcHRpb25zIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkZGRkOworICBib3JkZXItcmlnaHQtY29sb3I6ICNjM2Q5ZWM7CisgIGNvbG9yOiAjMGY2YWI0OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLm9wdGlvbnMgZGl2LmNvbnRlbnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJmM2Y5OworICBib3JkZXI6IDFweCBzb2xpZCAjYzNkOWVjOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuY29udGVudCBoNCB7CisgIGNvbG9yOiAjMGY2YWI0OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjNmZhNWQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uZ2V0IGRpdi5jb250ZW50LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuY29udGVudCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmNvbnRlbnQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmNvbnRlbnQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuY29udGVudCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuY29udGVudCB7CisgIGJvcmRlci10b3A6IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5nZXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaTpsYXN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5oZWFkIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGk6bGFzdC1jaGlsZCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnB1dCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5kZWxldGUgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaTpsYXN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uZ2V0IGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkubGFzdCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnBvc3QgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaS5sYXN0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uaGVhZCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpLmxhc3QsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaS5sYXN0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaS5sYXN0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uZGVsZXRlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkubGFzdCB7CisgIHBhZGRpbmctcmlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgdWwub3B0aW9ucyBsaSBhOmhvdmVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyB1bC5vcHRpb25zIGxpIGE6YWN0aXZlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyB1bC5vcHRpb25zIGxpIGEuYWN0aXZlIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIHVsLm9wdGlvbnMgbGk6Zmlyc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIHVsLm9wdGlvbnMgbGkuZmlyc3QgeworICBwYWRkaW5nLWxlZnQ6IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zOmZpcnN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucy5maXJzdCB7CisgIHBhZGRpbmctbGVmdDogMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBwI2NvbG9waG9uIHsKKyAgbWFyZ2luOiAwIDE1cHggNDBweCAxNXB4OworICBwYWRkaW5nOiAxMHB4IDA7CisgIGZvbnQtc2l6ZTogMC44ZW07CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkZGRkOworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBjb2xvcjogIzk5OTk5OTsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHAjY29sb3Bob24gYSB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgY29sb3I6ICM1NDdmMDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDMgeworICBjb2xvcjogYmxhY2s7CisgIGZvbnQtc2l6ZTogMS4xZW07CisgIHBhZGRpbmc6IDEwcHggMCAxMHB4IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIG9sLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tYXJrZG93biB1bCB7CisgIGZvbnQtZmFtaWx5OiAiRHJvaWQgU2FucyIsIHNhbnMtc2VyaWY7CisgIG1hcmdpbjogNXB4IDAgMTBweDsKKyAgcGFkZGluZzogMCAwIDAgMThweDsKKyAgbGlzdC1zdHlsZS10eXBlOiBkaXNjOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJmM2Y5OworICBib3JkZXI6IDFweCBzb2xpZCAjYzNkOWVjOworICBwYWRkaW5nOiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggbGFiZWwgeworICBjb2xvcjogIzBmNmFiNCAhaW1wb3J0YW50OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggaW5wdXRbdHlwZT1zdWJtaXRdIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmc6IDEwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtX2JveCBwLndlYWsgeworICBmb250LXNpemU6IDAuOGVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggcCB7CisgIGZvbnQtc2l6ZTogMC45ZW07CisgIHBhZGRpbmc6IDAgMCAxNXB4OworICBjb2xvcjogIzdlN2I2ZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm1fYm94IHAgYSB7CisgIGNvbG9yOiAjNjQ2MjU3OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggcCBzdHJvbmcgeworICBjb2xvcjogYmxhY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC50aXRsZSB7CisgIGZvbnQtc3R5bGU6IGJvbGQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zZWNvbmRhcnlfZm9ybSB7CisgIGRpc3BsYXk6IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5tYWluX2ltYWdlIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiBhdXRvOworICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5vYXV0aF9ib2R5IHsKKyAgbWFyZ2luLWxlZnQ6IDEwMHB4OworICBtYXJnaW4tcmlnaHQ6IDEwMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAub2F1dGhfc3VibWl0IHsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWRpYWxvZyB7CisgIHotaW5kZXg6IDEwMDAwOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHdpZHRoOiA1MDBweDsKKyAgYmFja2dyb3VuZDogI0ZGRjsKKyAgcGFkZGluZzogMjBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKyAgYm9yZGVyLXJhZGl1czogNXB4OworICBkaXNwbGF5OiBub25lOworICBmb250LXNpemU6IDEzcHg7CisgIGNvbG9yOiAjNzc3OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWRpYWxvZyAuYXBpLXBvcHVwLXRpdGxlIHsKKyAgZm9udC1zaXplOiAyNHB4OworICBwYWRkaW5nOiAxMHB4IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5hcGktcG9wdXAtZGlhbG9nIC5hcGktcG9wdXAtdGl0bGUgeworICBmb250LXNpemU6IDI0cHg7CisgIHBhZGRpbmc6IDEwcHggMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1kaWFsb2cgcC5lcnJvci1tc2cgeworICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1kaWFsb2cgYnV0dG9uLmFwaS1wb3B1cC1hdXRoYnRuIHsKKyAgaGVpZ2h0OiAzMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWRpYWxvZyBidXR0b24uYXBpLXBvcHVwLWNhbmNlbCB7CisgIGhlaWdodDogMzBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1zY29wZXMgeworICBwYWRkaW5nOiAxMHB4IDIwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5hcGktcG9wdXAtc2NvcGVzIGxpIHsKKyAgcGFkZGluZzogNXB4IDA7CisgIGxpbmUtaGVpZ2h0OiAyMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLXNjb3BlcyAuYXBpLXNjb3BlLWRlc2MgeworICBwYWRkaW5nLWxlZnQ6IDIwcHg7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1zY29wZXMgbGkgaW5wdXQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogMnB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWFjdGlvbnMgeworICBwYWRkaW5nLXRvcDogMTBweDsKK30KKyNoZWFkZXIgeworICBkaXNwbGF5OiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgcHJlIHsKKyAgbWF4LWhlaWdodDogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuYm9keS10ZXh0YXJlYSB7CisgIHdpZHRoOiAxMDBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBpbnB1dC5wYXJhbWV0ZXIgeworICB3aWR0aDogMTAwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgeworICBkaXNwbGF5OiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgeworICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQgeworICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9jc3MvcmVzZXQuY3NzIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9jc3MvcmVzZXQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjA3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2Nzcy9yZXNldC5jc3MKQEAgLTAsMCArMSwxMjUgQEAKKy8qIGh0dHA6Ly9tZXllcndlYi5jb20vZXJpYy90b29scy9jc3MvcmVzZXQvIHYyLjAgfCAyMDExMDEyNiAqLworaHRtbCwKK2JvZHksCitkaXYsCitzcGFuLAorYXBwbGV0LAorb2JqZWN0LAoraWZyYW1lLAoraDEsCitoMiwKK2gzLAoraDQsCitoNSwKK2g2LAorcCwKK2Jsb2NrcXVvdGUsCitwcmUsCithLAorYWJiciwKK2Fjcm9ueW0sCithZGRyZXNzLAorYmlnLAorY2l0ZSwKK2NvZGUsCitkZWwsCitkZm4sCitlbSwKK2ltZywKK2lucywKK2tiZCwKK3EsCitzLAorc2FtcCwKK3NtYWxsLAorc3RyaWtlLAorc3Ryb25nLAorc3ViLAorc3VwLAordHQsCit2YXIsCitiLAordSwKK2ksCitjZW50ZXIsCitkbCwKK2R0LAorZGQsCitvbCwKK3VsLAorbGksCitmaWVsZHNldCwKK2Zvcm0sCitsYWJlbCwKK2xlZ2VuZCwKK3RhYmxlLAorY2FwdGlvbiwKK3Rib2R5LAordGZvb3QsCit0aGVhZCwKK3RyLAordGgsCit0ZCwKK2FydGljbGUsCithc2lkZSwKK2NhbnZhcywKK2RldGFpbHMsCitlbWJlZCwKK2ZpZ3VyZSwKK2ZpZ2NhcHRpb24sCitmb290ZXIsCitoZWFkZXIsCitoZ3JvdXAsCittZW51LAorbmF2LAorb3V0cHV0LAorcnVieSwKK3NlY3Rpb24sCitzdW1tYXJ5LAordGltZSwKK21hcmssCithdWRpbywKK3ZpZGVvIHsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworICBib3JkZXI6IDA7CisgIGZvbnQtc2l6ZTogMTAwJTsKKyAgZm9udDogaW5oZXJpdDsKKyAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworfQorLyogSFRNTDUgZGlzcGxheS1yb2xlIHJlc2V0IGZvciBvbGRlciBicm93c2VycyAqLworYXJ0aWNsZSwKK2FzaWRlLAorZGV0YWlscywKK2ZpZ2NhcHRpb24sCitmaWd1cmUsCitmb290ZXIsCitoZWFkZXIsCitoZ3JvdXAsCittZW51LAorbmF2LAorc2VjdGlvbiB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorYm9keSB7CisgIGxpbmUtaGVpZ2h0OiAxOworfQorb2wsCit1bCB7CisgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CitibG9ja3F1b3RlLAorcSB7CisgIHF1b3Rlczogbm9uZTsKK30KK2Jsb2NrcXVvdGU6YmVmb3JlLAorYmxvY2txdW90ZTphZnRlciwKK3E6YmVmb3JlLAorcTphZnRlciB7CisgIGNvbnRlbnQ6ICcnOworICBjb250ZW50OiBub25lOworfQordGFibGUgeworICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICBib3JkZXItc3BhY2luZzogMDsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvY3NzL3NjcmVlbi5jc3MgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2Nzcy9zY3JlZW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjE5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2Nzcy9zY3JlZW4uY3NzCkBAIC0wLDAgKzEsMTI1NiBAQAorLyogT3JpZ2luYWwgc3R5bGUgZnJvbSBzb2Z0d2FyZW1hbmlhY3Mub3JnIChjKSBJdmFuIFNhZ2FsYWV2IDxNYW5pYWNAU29mdHdhcmVNYW5pYWNzLk9yZz4gKi8KKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIGNvZGUgeworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZzogMC41ZW07CisgIGJhY2tncm91bmQ6ICNGMEYwRjA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSBjb2RlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnN1YnN0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnRhZyAudGl0bGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubGlzcCAudGl0bGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY2xvanVyZSAuYnVpbHRfaW4sCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubmdpbnggLnRpdGxlIHsKKyAgY29sb3I6IGJsYWNrOworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnN0cmluZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5jb25zdGFudCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5wYXJlbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAudGFnIC52YWx1ZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5ydWxlcyAudmFsdWUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAucnVsZXMgLnZhbHVlIC5udW1iZXIsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAucHJlcHJvY2Vzc29yLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnJ1YnkgLnN5bWJvbCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5ydWJ5IC5zeW1ib2wgLnN0cmluZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hZ2dyZWdhdGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAudGVtcGxhdGVfdGFnLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmRqYW5nbyAudmFyaWFibGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuc21hbGx0YWxrIC5jbGFzcywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hZGRpdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5mbG93LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnN0cmVhbSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5iYXNoIC52YXJpYWJsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hcGFjaGUgLnRhZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hcGFjaGUgLmNicmFja2V0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnRleCAuY29tbWFuZCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZXggLnNwZWNpYWwsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZXJsYW5nX3JlcGwgLmZ1bmN0aW9uX29yX2F0b20sCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubWFya2Rvd24gLmhlYWRlciB7CisgIGNvbG9yOiAjODAwOworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmNvbW1lbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuYW5ub3RhdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZW1wbGF0ZV9jb21tZW50LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmRpZmYgLmhlYWRlciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5jaHVuaywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5tYXJrZG93biAuYmxvY2txdW90ZSB7CisgIGNvbG9yOiAjODg4OworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm51bWJlciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5kYXRlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnJlZ2V4cCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5saXRlcmFsLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnNtYWxsdGFsayAuc3ltYm9sLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnNtYWxsdGFsayAuY2hhciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5nbyAuY29uc3RhbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY2hhbmdlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm1hcmtkb3duIC5idWxsZXQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubWFya2Rvd24gLmxpbmtfdXJsIHsKKyAgY29sb3I6ICMwODA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSAubGFiZWwsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuamF2YWRvYywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5ydWJ5IC5zdHJpbmcsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZGVjb3JhdG9yLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmZpbHRlciAuYXJndW1lbnQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAubG9jYWx2YXJzLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmFycmF5LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmF0dHJfc2VsZWN0b3IsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuaW1wb3J0YW50LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnBzZXVkbywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5waSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5kb2N0eXBlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmRlbGV0aW9uLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmVudnZhciwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5zaGViYW5nLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmFwYWNoZSAuc3FicmFja2V0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm5naW54IC5idWlsdF9pbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZXggLmZvcm11bGEsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZXJsYW5nX3JlcGwgLnJlc2VydmVkLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnByb21wdCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5tYXJrZG93biAubGlua19sYWJlbCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC52aGRsIC5hdHRyaWJ1dGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY2xvanVyZSAuYXR0cmlidXRlLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmNvZmZlZXNjcmlwdCAucHJvcGVydHkgeworICBjb2xvcjogIzg4ODhmZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5rZXl3b3JkLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmlkLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnBocGRvYywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5idWlsdF9pbiwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5hZ2dyZWdhdGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY3NzIC50YWcsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuamF2YWRvY3RhZywKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5waHBkb2MsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueWFyZG9jdGFnLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnNtYWxsdGFsayAuY2xhc3MsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAud2ludXRpbHMsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuYmFzaCAudmFyaWFibGUsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuYXBhY2hlIC50YWcsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuZ28gLnR5cGVuYW1lLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnRleCAuY29tbWFuZCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC5tYXJrZG93biAuc3Ryb25nLAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnJlcXVlc3QsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAuc3RhdHVzIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSAubWFya2Rvd24gLmVtcGhhc2lzIHsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorLnN3YWdnZXItc2VjdGlvbiBwcmUgLm5naW54IC5idWlsdF9pbiB7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIHByZSAuY29mZmVlc2NyaXB0IC5qYXZhc2NyaXB0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLmphdmFzY3JpcHQgLnhtbCwKKy5zd2FnZ2VyLXNlY3Rpb24gcHJlIC50ZXggLmZvcm11bGEsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueG1sIC5qYXZhc2NyaXB0LAorLnN3YWdnZXItc2VjdGlvbiBwcmUgLnhtbCAudmJzY3JpcHQsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueG1sIC5jc3MsCisuc3dhZ2dlci1zZWN0aW9uIHByZSAueG1sIC5jZGF0YSB7CisgIG9wYWNpdHk6IDAuNTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB7CisgIGxpbmUtaGVpZ2h0OiAxOworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBtYXgtd2lkdGg6IDk2MHB4OworICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgbWFyZ2luLXJpZ2h0OiBhdXRvOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgc3Ryb25nIHsKKyAgZm9udC1mYW1pbHk6ICJEcm9pZCBTYW5zIiwgc2Fucy1zZXJpZjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgcSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBibG9ja3F1b3RlIHsKKyAgcXVvdGVzOiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHAgeworICBsaW5lLWhlaWdodDogMS40ZW07CisgIHBhZGRpbmc6IDAgMCAxMHB4OworICBjb2xvcjogIzMzMzMzMzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBxOmJlZm9yZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBxOmFmdGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGJsb2NrcXVvdGU6YmVmb3JlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGJsb2NrcXVvdGU6YWZ0ZXIgeworICBjb250ZW50OiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5oZWFkaW5nX3dpdGhfbWVudSBoMSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaGVhZGluZ193aXRoX21lbnUgaDIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmhlYWRpbmdfd2l0aF9tZW51IGgzLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5oZWFkaW5nX3dpdGhfbWVudSBoNCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaGVhZGluZ193aXRoX21lbnUgaDUsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmhlYWRpbmdfd2l0aF9tZW51IGg2IHsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBub25lOworICBmbG9hdDogbGVmdDsKKyAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICB3aWR0aDogNjAlOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRhYmxlIHsKKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgYm9yZGVyLXNwYWNpbmc6IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdGFibGUgdGhlYWQgdHIgdGggeworICBwYWRkaW5nOiA1cHg7CisgIGZvbnQtc2l6ZTogMC45ZW07CisgIGNvbG9yOiAjNjY2NjY2OworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTk5OTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB0YWJsZSB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkIHsKKyAgYm9yZGVyLWJvdHRvbTogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB0YWJsZSB0Ym9keSB0ci5vZmZzZXQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRhYmxlIHRib2R5IHRyIHRkIHsKKyAgcGFkZGluZzogNnB4OworICBmb250LXNpemU6IDAuOWVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjY2NjYzsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgbGluZS1oZWlnaHQ6IDEuM2VtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIG9sIHsKKyAgbWFyZ2luOiAwcHggMCAxMHB4OworICBwYWRkaW5nOiAwIDAgMCAxOHB4OworICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgb2wgbGkgeworICBwYWRkaW5nOiA1cHggMHB4OworICBmb250LXNpemU6IDAuOWVtOworICBjb2xvcjogIzMzMzMzMzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBvbCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCB7CisgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDEgYSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMiBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGgzIGEsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDQgYSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoNSBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGg2IGEgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDEgYTpob3ZlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMiBhOmhvdmVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGgzIGE6aG92ZXIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDQgYTpob3ZlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoNSBhOmhvdmVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGg2IGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMSBzcGFuLmRpdmlkZXIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgc3Bhbi5kaXZpZGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGgzIHNwYW4uZGl2aWRlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoNCBzcGFuLmRpdmlkZXIsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDUgc3Bhbi5kaXZpZGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGg2IHNwYW4uZGl2aWRlciB7CisgIGNvbG9yOiAjYWFhYWFhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGEgeworICBjb2xvcjogIzU0N2YwMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBhIGltZyB7CisgIGJvcmRlcjogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBhcnRpY2xlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGFzaWRlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGRldGFpbHMsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZmlnY2FwdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmaWd1cmUsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9vdGVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGhlYWRlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoZ3JvdXAsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgbWVudSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBuYXYsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgc2VjdGlvbiwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBzdW1tYXJ5IHsKKyAgZGlzcGxheTogYmxvY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgcHJlIHsKKyAgZm9udC1mYW1pbHk6ICJBbm9ueW1vdXMgUHJvIiwgIk1lbmxvIiwgIkNvbnNvbGFzIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjZkYjsKKyAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTBjNjsKKyAgcGFkZGluZzogMTBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBwcmUgY29kZSB7CisgIGxpbmUtaGVpZ2h0OiAxLjZlbTsKKyAgYmFja2dyb3VuZDogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuY29udGVudCA+IC5jb250ZW50LXR5cGUgPiBkaXYgPiBsYWJlbCB7CisgIGNsZWFyOiBib3RoOworICBkaXNwbGF5OiBibG9jazsKKyAgY29sb3I6ICMwRjZBQjQ7CisgIGZvbnQtc2l6ZTogMS4xZW07CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMTVweCAwIDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuY29udGVudCBwcmUgeworICBmb250LXNpemU6IDEycHg7CisgIG1hcmdpbi10b3A6IDVweDsKKyAgcGFkZGluZzogNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5pY29uLWJ0biB7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaW5mb190aXRsZSB7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1zaXplOiAyNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHAuYmlnLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGRpdi5iaWcgcCB7CisgIGZvbnQtc2l6ZTogMWVtOworICBtYXJnaW4tYm90dG9tOiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZnVsbHdpZHRoIG9sIGxpLnN0cmluZyBpbnB1dCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZ1bGx3aWR0aCBvbCBsaS51cmwgaW5wdXQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mdWxsd2lkdGggb2wgbGkudGV4dCB0ZXh0YXJlYSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZ1bGx3aWR0aCBvbCBsaS5udW1lcmljIGlucHV0IHsKKyAgd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fbGljZW5zZSB7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fdG9zIHsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWVzc2FnZS1mYWlsIHsKKyAgY29sb3I6ICNjYzAwMDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fdXJsIHsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaW5mb19lbWFpbCB7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fbmFtZSB7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLmluZm9fZGVzY3JpcHRpb24geworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKKyAgZm9udC1zaXplOiAxNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tYXJrZG93biBvbCBsaSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWFya2Rvd24gdWwgbGkgeworICBwYWRkaW5nOiAzcHggMHB4OworICBsaW5lLWhlaWdodDogMS40ZW07CisgIGNvbG9yOiAjMzMzMzMzOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkuc3RyaW5nIGlucHV0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkudXJsIGlucHV0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkubnVtZXJpYyBpbnB1dCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nOiA0cHg7CisgIHdpZHRoOiBhdXRvOworICBjbGVhcjogYm90aDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpLnN0cmluZyBpbnB1dC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpLnVybCBpbnB1dC50aXRsZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpLm51bWVyaWMgaW5wdXQudGl0bGUgeworICBmb250LXNpemU6IDEuM2VtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRhYmxlLmZ1bGx3aWR0aCB7CisgIHdpZHRoOiAxMDAlOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgeworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDFlbTsKKyAgbGluZS1oZWlnaHQ6IDEuNWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnNpZ25hdHVyZS1uYXYgYSB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgY29sb3I6ICNBQUE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSAuc2lnbmF0dXJlLW5hdiBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5zaWduYXR1cmUtbmF2IC5zZWxlY3RlZCB7CisgIGNvbG9yOiBibGFjazsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnByb3BUeXBlIHsKKyAgY29sb3I6ICM1NTU1YWE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSBwcmU6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmRkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgcHJlIHsKKyAgZm9udC1zaXplOiAuODVlbTsKKyAgbGluZS1oZWlnaHQ6IDEuMmVtOworICBvdmVyZmxvdzogYXV0bzsKKyAgbWF4LWhlaWdodDogMjAwcHg7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIHVsLnNpZ25hdHVyZS1uYXYgeworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgdWwuc2lnbmF0dXJlLW5hdiBsaTpsYXN0LWNoaWxkIHsKKyAgcGFkZGluZy1yaWdodDogMDsKKyAgYm9yZGVyLXJpZ2h0OiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgdWwuc2lnbmF0dXJlLW5hdiBsaSB7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW46IDAgNXB4IDVweCAwOworICBwYWRkaW5nOiAycHggNXB4IDJweCAwOworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnByb3BPcHQgeworICBjb2xvcjogIzU1NTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5zbmlwcGV0IHNtYWxsIHsKKyAgZm9udC1zaXplOiAwLjc1ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSAucHJvcE9wdEtleSB7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5kZXNjcmlwdGlvbiAuc3Ryb25nIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGNvbG9yOiAjMDAwOworICBmb250LXNpemU6IC45ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1vZGVsLXNpZ25hdHVyZSAuZGVzY3JpcHRpb24gZGl2IHsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgbGluZS1oZWlnaHQ6IDEuNWVtOworICBtYXJnaW4tbGVmdDogMWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLmRlc2NyaXB0aW9uIC5zdHJvbmdlciB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBjb2xvcjogIzAwMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5kZXNjcmlwdGlvbiAucHJvcFdyYXAgLm9wdGlvbnNXcmFwcGVyIHsKKyAgYm9yZGVyLXNwYWNpbmc6IDA7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyOiAxcHggc29saWQgI2JiYmJiYjsKKyAgZGlzcGxheTogbm9uZTsKKyAgZm9udC1zaXplOiAxMXB4OworICBtYXgtd2lkdGg6IDQwMHB4OworICBsaW5lLWhlaWdodDogMzBweDsKKyAgY29sb3I6IGJsYWNrOworICBwYWRkaW5nOiA1cHg7CisgIG1hcmdpbi1sZWZ0OiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLmRlc2NyaXB0aW9uIC5wcm9wV3JhcCAub3B0aW9uc1dyYXBwZXIgdGggeworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNiYmJiYmI7CisgIGZvbnQtc2l6ZTogMTFweDsKKyAgY29sb3I6ICM2NjY2NjY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBwYWRkaW5nOiA1cHg7CisgIGxpbmUtaGVpZ2h0OiAxNXB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLmRlc2NyaXB0aW9uIC5wcm9wV3JhcCAub3B0aW9uc1dyYXBwZXIgLm9wdGlvbk5hbWUgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubW9kZWwtc2lnbmF0dXJlIC5wcm9wTmFtZSB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tb2RlbC1zaWduYXR1cmUgLnNpZ25hdHVyZS1jb250YWluZXIgeworICBjbGVhcjogYm90aDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuYm9keS10ZXh0YXJlYSB7CisgIHdpZHRoOiAzMDBweDsKKyAgaGVpZ2h0OiAxMDBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWFya2Rvd24gcCBjb2RlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tYXJrZG93biBsaSBjb2RlIHsKKyAgZm9udC1mYW1pbHk6ICJBbm9ueW1vdXMgUHJvIiwgIk1lbmxvIiwgIkNvbnNvbGFzIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKKyAgY29sb3I6IGJsYWNrOworICBwYWRkaW5nOiAxcHggM3B4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5yZXF1aXJlZCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGlucHV0LnBhcmFtZXRlciB7CisgIHdpZHRoOiAzMDBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMSB7CisgIGNvbG9yOiBibGFjazsKKyAgZm9udC1zaXplOiAxLjVlbTsKKyAgbGluZS1oZWlnaHQ6IDEuM2VtOworICBwYWRkaW5nOiAxMHB4IDAgMTBweCAwOworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXdlaWdodDogYm9sZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuaGVhZGluZ193aXRoX21lbnUgeworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5oZWFkaW5nX3dpdGhfbWVudSB1bCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IHJpZ2h0OworICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgLW1zLWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgeworICBjb2xvcjogYmxhY2s7CisgIGZvbnQtc2l6ZTogMS4zZW07CisgIHBhZGRpbmc6IDEwcHggMCAxMHB4IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgYSB7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBoMiBzcGFuLnN1YiB7CisgIGZvbnQtc2l6ZTogMC43ZW07CisgIGNvbG9yOiAjOTk5OTk5OworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDIgc3Bhbi5zdWIgYSB7CisgIGNvbG9yOiAjNzc3Nzc3OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHNwYW4ud2VhayB7CisgIGNvbG9yOiAjNjY2NjY2OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tZXNzYWdlLXN1Y2Nlc3MgeworICBjb2xvcjogIzg5QkYwNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBjYXB0aW9uLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRoLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHRkIHsKKyAgdGV4dC1hbGlnbjogbGVmdDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAuY29kZSB7CisgIGZvbnQtZmFtaWx5OiAiQW5vbnltb3VzIFBybyIsICJNZW5sbyIsICJDb25zb2xhcyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaS50ZXh0IHRleHRhcmVhIHsKKyAgZm9udC1mYW1pbHk6ICJEcm9pZCBTYW5zIiwgc2Fucy1zZXJpZjsKKyAgaGVpZ2h0OiAyNTBweDsKKyAgcGFkZGluZzogNHB4OworICBkaXNwbGF5OiBibG9jazsKKyAgY2xlYXI6IGJvdGg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaS5zZWxlY3Qgc2VsZWN0IHsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBib3RoOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkuYm9vbGVhbiB7CisgIGZsb2F0OiBub25lOworICBjbGVhcjogYm90aDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgZGlzcGxheTogYmxvY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaS5ib29sZWFuIGxhYmVsIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIGZsb2F0OiBsZWZ0OworICBjbGVhcjogbm9uZTsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkuYm9vbGVhbiBpbnB1dCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBmbG9hdDogbGVmdDsKKyAgY2xlYXI6IG5vbmU7CisgIG1hcmdpbjogMCA1cHggMCAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkucmVxdWlyZWQgbGFiZWwgeworICBjb2xvcjogYmxhY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtdGFzdGljIGZpZWxkc2V0LmlucHV0cyBvbCBsaSBsYWJlbCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogYm90aDsKKyAgd2lkdGg6IGF1dG87CisgIHBhZGRpbmc6IDAgMCAzcHg7CisgIGNvbG9yOiAjNjY2NjY2OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5pbnB1dHMgb2wgbGkgbGFiZWwgYWJiciB7CisgIHBhZGRpbmctbGVmdDogM3B4OworICBjb2xvcjogIzg4ODg4ODsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm10YXN0aWMgZmllbGRzZXQuaW5wdXRzIG9sIGxpIHAuaW5saW5lLWhpbnRzIHsKKyAgbWFyZ2luLWxlZnQ6IDA7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgbWFyZ2luOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybXRhc3RpYyBmaWVsZHNldC5idXR0b25zIHsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHNwYW4uYmxhbmssCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgc3Bhbi5lbXB0eSB7CisgIGNvbG9yOiAjODg4ODg4OworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIGgzIHsKKyAgY29sb3I6ICM1NDdmMDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIGg0IHsKKyAgY29sb3I6ICM2NjY2NjY7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIHByZSB7CisgIGZvbnQtZmFtaWx5OiAiQW5vbnltb3VzIFBybyIsICJNZW5sbyIsICJDb25zb2xhcyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCAiQ291cmllciBOZXciLCBtb25vc3BhY2U7CisgIGJhY2tncm91bmQtY29sb3I6ICNmY2Y2ZGI7CisgIGJvcmRlcjogMXB4IHNvbGlkICNlNWUwYzY7CisgIHBhZGRpbmc6IDEwcHg7CisgIG1hcmdpbjogMCAwIDEwcHggMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCAubWFya2Rvd24gcHJlIGNvZGUgeworICBsaW5lLWhlaWdodDogMS42ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZGl2Lmdpc3QgeworICBtYXJnaW46IDIwcHggMCAyNXB4IDAgIWltcG9ydGFudDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgeworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDAuOWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZTpob3ZlciBkaXYuaGVhZGluZyBoMiBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZS5hY3RpdmUgZGl2LmhlYWRpbmcgaDIgYSB7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2U6aG92ZXIgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZS5hY3RpdmUgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICM1NTU1NTU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlOmxhc3QtY2hpbGQgeworICBib3JkZXItYm90dG9tOiBub25lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB7CisgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIHsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcGFkZGluZzogMDsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBub25lOworICBmbG9hdDogcmlnaHQ7CisgIG1hcmdpbjogMTRweCAxMHB4IDAgMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSB7CisgIGZsb2F0OiBsZWZ0OworICBjbGVhcjogbm9uZTsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAycHggMTBweDsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgY29sb3I6ICM2NjY2NjY7CisgIGZvbnQtc2l6ZTogMC45ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgYSB7CisgIGNvbG9yOiAjYWFhYWFhOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgYTpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICBjb2xvcjogYmxhY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgYTpob3ZlciwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhOmFjdGl2ZSwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhLmFjdGl2ZSB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmZpcnN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpLmZpcnN0IHsKKyAgcGFkZGluZy1sZWZ0OiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkubGFzdCB7CisgIHBhZGRpbmctcmlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9uczpmaXJzdC1jaGlsZCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgdWwub3B0aW9ucy5maXJzdCB7CisgIHBhZGRpbmctbGVmdDogMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgaDIgeworICBjb2xvcjogIzk5OTk5OTsKKyAgcGFkZGluZy1sZWZ0OiAwOworICBkaXNwbGF5OiBibG9jazsKKyAgY2xlYXI6IG5vbmU7CisgIGZsb2F0OiBsZWZ0OworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBmb250LXdlaWdodDogYm9sZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgZGl2LmhlYWRpbmcgaDIgYSB7CisgIGNvbG9yOiAjOTk5OTk5OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSBkaXYuaGVhZGluZyBoMiBhOmhvdmVyIHsKKyAgY29sb3I6IGJsYWNrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24geworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXJnaW46IDAgMCAxMHB4OworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgeworICBmbG9hdDogbm9uZTsKKyAgY2xlYXI6IGJvdGg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyBoMyB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiBhdXRvOworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7CisgIGxpbmUtaGVpZ2h0OiAxLjFlbTsKKyAgY29sb3I6IGJsYWNrOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgaDMgc3Bhbi5wYXRoIHsKKyAgcGFkZGluZy1sZWZ0OiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgaDMgc3Bhbi5wYXRoIGEgeworICBjb2xvcjogYmxhY2s7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5oZWFkaW5nIGgzIHNwYW4ucGF0aCBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyBoMyBzcGFuLmh0dHBfbWV0aG9kIGEgeworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIGNvbG9yOiB3aGl0ZTsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICB3aWR0aDogNTBweDsKKyAgZm9udC1zaXplOiAwLjdlbTsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBwYWRkaW5nOiA3cHggMCA0cHg7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDsKKyAgLW8tYm9yZGVyLXJhZGl1czogMnB4OworICAtbXMtYm9yZGVyLXJhZGl1czogMnB4OworICAta2h0bWwtYm9yZGVyLXJhZGl1czogMnB4OworICBib3JkZXItcmFkaXVzOiAycHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyBoMyBzcGFuIHsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmhlYWRpbmcgdWwub3B0aW9ucyB7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDA7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IHJpZ2h0OworICBtYXJnaW46IDZweCAxMHB4IDAgMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBmbG9hdDogbGVmdDsKKyAgY2xlYXI6IG5vbmU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMnB4IDEwcHg7CisgIGZvbnQtc2l6ZTogMC45ZW07Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpLmFjY2VzcyB7CisgIGNvbG9yOiBibGFjazsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5jb250ZW50IHsKKyAgYm9yZGVyLXRvcDogbm9uZTsKKyAgcGFkZGluZzogMTBweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDZweDsKKyAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA2cHg7CisgIC1vLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDZweDsKKyAgLW1zLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDZweDsKKyAgLWtodG1sLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDZweDsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNnB4OworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDZweDsKKyAgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNnB4OworICAtby1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNnB4OworICAtbXMtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDZweDsKKyAgLWtodG1sLWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA2cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA2cHg7CisgIG1hcmdpbjogMCAwIDIwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBoNCB7CisgIGZvbnQtc2l6ZTogMS4xZW07CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMTVweCAwIDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5jb250ZW50IGRpdi5zYW5kYm94X2hlYWRlciB7CisgIGZsb2F0OiBub25lOworICBjbGVhcjogYm90aDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgZGlzcGxheTogYmxvY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIHBhZGRpbmc6IDRweCAwIDAgMTBweDsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBmb250LXNpemU6IDAuOWVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGlucHV0LnN1Ym1pdCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBjbGVhcjogbm9uZTsKKyAgZmxvYXQ6IGxlZnQ7CisgIHBhZGRpbmc6IDZweCA4cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgc3Bhbi5yZXNwb25zZV90aHJvYmJlciB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL3Rocm9iYmVyLmdpZicpOworICB3aWR0aDogMTI4cHg7CisgIGhlaWdodDogMTZweDsKKyAgZGlzcGxheTogYmxvY2s7CisgIGNsZWFyOiBub25lOworICBmbG9hdDogcmlnaHQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCBmb3JtIGlucHV0W3R5cGU9J3RleHQnXS5lcnJvciB7CisgIG91dGxpbmU6IDJweCBzb2xpZCBibGFjazsKKyAgb3V0bGluZS1jb2xvcjogI2NjMDAwMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uIGRpdi5jb250ZW50IGRpdi5yZXNwb25zZSBkaXYuYmxvY2sgcHJlIHsKKyAgZm9udC1mYW1pbHk6ICJBbm9ueW1vdXMgUHJvIiwgIk1lbmxvIiwgIkNvbnNvbGFzIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKKyAgcGFkZGluZzogMTBweDsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgbWF4LWhlaWdodDogNDAwcHg7CisgIG92ZXJmbG93LXk6IGF1dG87Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmMmU5OworICBib3JkZXI6IDFweCBzb2xpZCAjZjBlMGNhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucHV0IGRpdi5oZWFkaW5nIGgzIHNwYW4uaHR0cF9tZXRob2QgYSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSB7CisgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGRkZGQ7CisgIGJvcmRlci1yaWdodC1jb2xvcjogI2YwZTBjYTsKKyAgY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmNvbnRlbnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmNWVlOworICBib3JkZXI6IDFweCBzb2xpZCAjZjBlMGNhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucHV0IGRpdi5jb250ZW50IGg0IHsKKyAgY29sb3I6ICNjNTg2MmI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGEgeworICBjb2xvcjogI2RjYjY3ZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmhlYWRpbmcgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmZmNkOworICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKKyAgYm9yZGVyLWNvbG9yOiAjZmZkMjBmOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uaGVhZCBkaXYuaGVhZGluZyBoMyBzcGFuLmh0dHBfbWV0aG9kIGEgeworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZkMjBmOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uaGVhZCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIHsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZmZkMjBmOworICBjb2xvcjogI2ZmZDIwZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICNmZmQyMGY7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5oZWFkIGRpdi5jb250ZW50IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmZjZDsKKyAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisgIGJvcmRlci1jb2xvcjogI2ZmZDIwZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmNvbnRlbnQgaDQgeworICBjb2xvcjogI2ZmZDIwZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGEgeworICBjb2xvcjogIzZmYzk5MjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmNWU4ZTg7CisgIGJvcmRlcjogMXB4IHNvbGlkICNlOGM2Yzc7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5kZWxldGUgZGl2LmhlYWRpbmcgaDMgc3Bhbi5odHRwX21ldGhvZCBhIHsKKyAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIHsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZThjNmM3OworICBjb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuY29udGVudCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmN2VkZWQ7CisgIGJvcmRlcjogMXB4IHNvbGlkICNlOGM2Yzc7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5kZWxldGUgZGl2LmNvbnRlbnQgaDQgeworICBjb2xvcjogI2E0MWUyMjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjYzg3ODdhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlN2Y2ZWM7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2U4ZDE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wb3N0IGRpdi5oZWFkaW5nIGgzIHNwYW4uaHR0cF9tZXRob2QgYSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMxMGE1NGE7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wb3N0IGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkZGRkOworICBib3JkZXItcmlnaHQtY29sb3I6ICNjM2U4ZDE7CisgIGNvbG9yOiAjMTBhNTRhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogIzEwYTU0YTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnBvc3QgZGl2LmNvbnRlbnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJmN2YwOworICBib3JkZXI6IDFweCBzb2xpZCAjYzNlOGQxOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuY29udGVudCBoNCB7CisgIGNvbG9yOiAjMTBhNTRhOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjNmZjOTkyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkNFOUUzOworICBib3JkZXI6IDFweCBzb2xpZCAjRjVENUMzOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgaDMgc3Bhbi5odHRwX21ldGhvZCBhIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0QzODA0MjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnBhdGNoIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkZGRkOworICBib3JkZXItcmlnaHQtY29sb3I6ICNmMGNlY2I7CisgIGNvbG9yOiAjRDM4MDQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaSBhIHsKKyAgY29sb3I6ICNEMzgwNDI7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuY29udGVudCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYWYwZWY7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmMGNlY2I7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuY29udGVudCBoNCB7CisgIGNvbG9yOiAjRDM4MDQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmNvbnRlbnQgZGl2LnNhbmRib3hfaGVhZGVyIGEgeworICBjb2xvcjogI2RjYjY3ZjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlN2YwZjc7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2Q5ZWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5nZXQgZGl2LmhlYWRpbmcgaDMgc3Bhbi5odHRwX21ldGhvZCBhIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIHsKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZGRkZDsKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjYzNkOWVjOworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuY29udGVudCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlYmYzZjk7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2Q5ZWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5nZXQgZGl2LmNvbnRlbnQgaDQgeworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmdldCBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjNmZhNWQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuaGVhZGluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlN2YwZjc7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjM2Q5ZWM7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5vcHRpb25zIGRpdi5oZWFkaW5nIGgzIHNwYW4uaHR0cF9tZXRob2QgYSB7CisgIGJhY2tncm91bmQtY29sb3I6ICMwZjZhYjQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5vcHRpb25zIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkgeworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkZGRkOworICBib3JkZXItcmlnaHQtY29sb3I6ICNjM2Q5ZWM7CisgIGNvbG9yOiAjMGY2YWI0OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpIGEgeworICBjb2xvcjogIzBmNmFiNDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLm9wdGlvbnMgZGl2LmNvbnRlbnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJmM2Y5OworICBib3JkZXI6IDFweCBzb2xpZCAjYzNkOWVjOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuY29udGVudCBoNCB7CisgIGNvbG9yOiAjMGY2YWI0OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ub3B0aW9ucyBkaXYuY29udGVudCBkaXYuc2FuZGJveF9oZWFkZXIgYSB7CisgIGNvbG9yOiAjNmZhNWQyOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uZ2V0IGRpdi5jb250ZW50LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuY29udGVudCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmhlYWQgZGl2LmNvbnRlbnQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmNvbnRlbnQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuY29udGVudCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLmRlbGV0ZSBkaXYuY29udGVudCB7CisgIGJvcmRlci10b3A6IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5nZXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaTpsYXN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucG9zdCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5oZWFkIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGk6bGFzdC1jaGlsZCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnB1dCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wYXRjaCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpOmxhc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5kZWxldGUgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaTpsYXN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uZ2V0IGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkubGFzdCwKKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgbGkub3BlcmF0aW9uLnBvc3QgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaS5sYXN0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uaGVhZCBkaXYuaGVhZGluZyB1bC5vcHRpb25zIGxpLmxhc3QsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIGxpLm9wZXJhdGlvbi5wdXQgZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaS5sYXN0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24ucGF0Y2ggZGl2LmhlYWRpbmcgdWwub3B0aW9ucyBsaS5sYXN0LAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyBsaS5vcGVyYXRpb24uZGVsZXRlIGRpdi5oZWFkaW5nIHVsLm9wdGlvbnMgbGkubGFzdCB7CisgIHBhZGRpbmctcmlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCB1bCNyZXNvdXJjZXMgbGkucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLmVuZHBvaW50IHVsLm9wZXJhdGlvbnMgdWwub3B0aW9ucyBsaSBhOmhvdmVyLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyB1bC5vcHRpb25zIGxpIGE6YWN0aXZlLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucyB1bC5vcHRpb25zIGxpIGEuYWN0aXZlIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIHVsLm9wdGlvbnMgbGk6Zmlyc3QtY2hpbGQsCisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zIHVsLm9wdGlvbnMgbGkuZmlyc3QgeworICBwYWRkaW5nLWxlZnQ6IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgdWwjcmVzb3VyY2VzIGxpLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5lbmRwb2ludCB1bC5vcGVyYXRpb25zOmZpcnN0LWNoaWxkLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHVsI3Jlc291cmNlcyBsaS5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkuZW5kcG9pbnQgdWwub3BlcmF0aW9ucy5maXJzdCB7CisgIHBhZGRpbmctbGVmdDogMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBwI2NvbG9waG9uIHsKKyAgbWFyZ2luOiAwIDE1cHggNDBweCAxNXB4OworICBwYWRkaW5nOiAxMHB4IDA7CisgIGZvbnQtc2l6ZTogMC44ZW07CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkZGRkOworICBmb250LWZhbWlseTogIkRyb2lkIFNhbnMiLCBzYW5zLXNlcmlmOworICBjb2xvcjogIzk5OTk5OTsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIHAjY29sb3Bob24gYSB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgY29sb3I6ICM1NDdmMDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgaDMgeworICBjb2xvcjogYmxhY2s7CisgIGZvbnQtc2l6ZTogMS4xZW07CisgIHBhZGRpbmc6IDEwcHggMCAxMHB4IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgLm1hcmtkb3duIG9sLAorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIC5tYXJrZG93biB1bCB7CisgIGZvbnQtZmFtaWx5OiAiRHJvaWQgU2FucyIsIHNhbnMtc2VyaWY7CisgIG1hcmdpbjogNXB4IDAgMTBweDsKKyAgcGFkZGluZzogMCAwIDAgMThweDsKKyAgbGlzdC1zdHlsZS10eXBlOiBkaXNjOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWJmM2Y5OworICBib3JkZXI6IDFweCBzb2xpZCAjYzNkOWVjOworICBwYWRkaW5nOiAxMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggbGFiZWwgeworICBjb2xvcjogIzBmNmFiNCAhaW1wb3J0YW50OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggaW5wdXRbdHlwZT1zdWJtaXRdIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmc6IDEwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zd2FnZ2VyLXVpLXdyYXAgZm9ybS5mb3JtX2JveCBwLndlYWsgeworICBmb250LXNpemU6IDAuOGVtOworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggcCB7CisgIGZvbnQtc2l6ZTogMC45ZW07CisgIHBhZGRpbmc6IDAgMCAxNXB4OworICBjb2xvcjogIzdlN2I2ZDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLnN3YWdnZXItdWktd3JhcCBmb3JtLmZvcm1fYm94IHAgYSB7CisgIGNvbG9yOiAjNjQ2MjU3OworfQorLnN3YWdnZXItc2VjdGlvbiAuc3dhZ2dlci11aS13cmFwIGZvcm0uZm9ybV9ib3ggcCBzdHJvbmcgeworICBjb2xvcjogYmxhY2s7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC50aXRsZSB7CisgIGZvbnQtc3R5bGU6IGJvbGQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5zZWNvbmRhcnlfZm9ybSB7CisgIGRpc3BsYXk6IG5vbmU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5tYWluX2ltYWdlIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiBhdXRvOworICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5vYXV0aF9ib2R5IHsKKyAgbWFyZ2luLWxlZnQ6IDEwMHB4OworICBtYXJnaW4tcmlnaHQ6IDEwMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAub2F1dGhfc3VibWl0IHsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWRpYWxvZyB7CisgIHotaW5kZXg6IDEwMDAwOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHdpZHRoOiA1MDBweDsKKyAgYmFja2dyb3VuZDogI0ZGRjsKKyAgcGFkZGluZzogMjBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKyAgYm9yZGVyLXJhZGl1czogNXB4OworICBkaXNwbGF5OiBub25lOworICBmb250LXNpemU6IDEzcHg7CisgIGNvbG9yOiAjNzc3OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWRpYWxvZyAuYXBpLXBvcHVwLXRpdGxlIHsKKyAgZm9udC1zaXplOiAyNHB4OworICBwYWRkaW5nOiAxMHB4IDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5hcGktcG9wdXAtZGlhbG9nIC5hcGktcG9wdXAtdGl0bGUgeworICBmb250LXNpemU6IDI0cHg7CisgIHBhZGRpbmc6IDEwcHggMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1kaWFsb2cgcC5lcnJvci1tc2cgeworICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1kaWFsb2cgYnV0dG9uLmFwaS1wb3B1cC1hdXRoYnRuIHsKKyAgaGVpZ2h0OiAzMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWRpYWxvZyBidXR0b24uYXBpLXBvcHVwLWNhbmNlbCB7CisgIGhlaWdodDogMzBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1zY29wZXMgeworICBwYWRkaW5nOiAxMHB4IDIwcHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5hcGktcG9wdXAtc2NvcGVzIGxpIHsKKyAgcGFkZGluZzogNXB4IDA7CisgIGxpbmUtaGVpZ2h0OiAyMHB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLXNjb3BlcyAuYXBpLXNjb3BlLWRlc2MgeworICBwYWRkaW5nLWxlZnQ6IDIwcHg7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFwaS1wb3B1cC1zY29wZXMgbGkgaW5wdXQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogMnB4OworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLXBvcHVwLWFjdGlvbnMgeworICBwYWRkaW5nLXRvcDogMTBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmFjY2VzcyB7CisgIGZsb2F0OiByaWdodDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmF1dGggeworICBmbG9hdDogcmlnaHQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uICNhcGlfaW5mb3JtYXRpb25fcGFuZWwgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGJhY2tncm91bmQ6ICNGRkY7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CisgIGJvcmRlci1yYWRpdXM6IDVweDsKKyAgZGlzcGxheTogbm9uZTsKKyAgZm9udC1zaXplOiAxM3B4OworICBtYXgtd2lkdGg6IDMwMHB4OworICBsaW5lLWhlaWdodDogMzBweDsKKyAgY29sb3I6IGJsYWNrOworICBwYWRkaW5nOiA1cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uICNhcGlfaW5mb3JtYXRpb25fcGFuZWwgcCAuYXBpLW1zZy1lbmFibGVkIHsKKyAgY29sb3I6IGdyZWVuOworfQorLnN3YWdnZXItc2VjdGlvbiAjYXBpX2luZm9ybWF0aW9uX3BhbmVsIHAgLmFwaS1tc2ctZGlzYWJsZWQgeworICBjb2xvcjogcmVkOworfQorLnN3YWdnZXItc2VjdGlvbiAuYXBpLWljIHsKKyAgaGVpZ2h0OiAxOHB4OworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvZXhwbG9yZXJfaWNvbnMucG5nKSBuby1yZXBlYXQ7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5pYy1pbmZvIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOworICB3aWR0aDogMThweDsKKyAgbWFyZ2luLXRvcDogLTdweDsKKyAgbWFyZ2luLWxlZnQ6IDRweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmljLXdhcm5pbmcgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjBweCAwOworICB3aWR0aDogMThweDsKKyAgbWFyZ2luLXRvcDogLTdweDsKKyAgbWFyZ2luLWxlZnQ6IDRweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gLmljLWVycm9yIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMwcHggMDsKKyAgd2lkdGg6IDE4cHg7CisgIG1hcmdpbi10b3A6IC03cHg7CisgIG1hcmdpbi1sZWZ0OiA0cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uIC5pYy1vZmYgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTBweCAwOworICB3aWR0aDogNThweDsKKyAgbWFyZ2luLXRvcDogLTRweDsKKyAgY3Vyc29yOiBwb2ludGVyOworfQorLnN3YWdnZXItc2VjdGlvbiAuaWMtb24geworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggMDsKKyAgd2lkdGg6IDU4cHg7CisgIG1hcmdpbi10b3A6IC00cHg7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gI2hlYWRlciB7CisgIGJhY2tncm91bmQtY29sb3I6ICM4OWJmMDQ7CisgIHBhZGRpbmc6IDE0cHg7Cit9Cisuc3dhZ2dlci1zZWN0aW9uICNoZWFkZXIgYSNsb2dvIHsKKyAgZm9udC1zaXplOiAxLjVlbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9sb2dvX3NtYWxsLnBuZykgbm8tcmVwZWF0IGxlZnQgY2VudGVyOworICBwYWRkaW5nOiAyMHB4IDAgMjBweCA0MHB4OworICBjb2xvcjogd2hpdGU7Cit9Cisuc3dhZ2dlci1zZWN0aW9uICNoZWFkZXIgZm9ybSNhcGlfc2VsZWN0b3IgeworICBkaXNwbGF5OiBibG9jazsKKyAgY2xlYXI6IG5vbmU7CisgIGZsb2F0OiByaWdodDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gI2hlYWRlciBmb3JtI2FwaV9zZWxlY3RvciAuaW5wdXQgeworICBkaXNwbGF5OiBibG9jazsKKyAgY2xlYXI6IG5vbmU7CisgIGZsb2F0OiBsZWZ0OworICBtYXJnaW46IDAgMTBweCAwIDA7Cit9Cisuc3dhZ2dlci1zZWN0aW9uICNoZWFkZXIgZm9ybSNhcGlfc2VsZWN0b3IgLmlucHV0IGlucHV0I2lucHV0X2FwaUtleSB7CisgIHdpZHRoOiAyMDBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gI2hlYWRlciBmb3JtI2FwaV9zZWxlY3RvciAuaW5wdXQgaW5wdXQjaW5wdXRfYmFzZVVybCB7CisgIHdpZHRoOiA0MDBweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gI2hlYWRlciBmb3JtI2FwaV9zZWxlY3RvciAuaW5wdXQgYSNleHBsb3JlIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHBhZGRpbmc6IDZweCA4cHg7CisgIGZvbnQtc2l6ZTogMC45ZW07CisgIGNvbG9yOiB3aGl0ZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzU0N2YwMDsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OworICAtby1ib3JkZXItcmFkaXVzOiA0cHg7CisgIC1tcy1ib3JkZXItcmFkaXVzOiA0cHg7CisgIC1raHRtbC1ib3JkZXItcmFkaXVzOiA0cHg7CisgIGJvcmRlci1yYWRpdXM6IDRweDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gI2hlYWRlciBmb3JtI2FwaV9zZWxlY3RvciAuaW5wdXQgYSNleHBsb3JlOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzU0N2YwMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gI2hlYWRlciBmb3JtI2FwaV9zZWxlY3RvciAuaW5wdXQgaW5wdXQgeworICBmb250LXNpemU6IDAuOWVtOworICBwYWRkaW5nOiAzcHg7CisgIG1hcmdpbjogMDsKK30KKy5zd2FnZ2VyLXNlY3Rpb24gI2NvbnRlbnRfbWVzc2FnZSB7CisgIG1hcmdpbjogMTBweCAxNXB4OworICBmb250LXN0eWxlOiBpdGFsaWM7CisgIGNvbG9yOiAjOTk5OTk5OworfQorLnN3YWdnZXItc2VjdGlvbiAjbWVzc2FnZS1iYXIgeworICBtaW4taGVpZ2h0OiAzMHB4OworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIHBhZGRpbmctdG9wOiAxMHB4OworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9jc3MvdHlwb2dyYXBoeS5jc3MgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2Nzcy90eXBvZ3JhcGh5LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2MzNzUxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9jc3MvdHlwb2dyYXBoeS5jc3MKQEAgLTAsMCArMSwyNiBAQAorLyogZHJvaWQtc2Fucy1yZWd1bGFyIC0gbGF0aW4gKi8KK0Bmb250LWZhY2UgeworICBmb250LWZhbWlseTogJ0Ryb2lkIFNhbnMnOworICBmb250LXN0eWxlOiBub3JtYWw7CisgIGZvbnQtd2VpZ2h0OiA0MDA7CisgIHNyYzogdXJsKCcuLi9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLXJlZ3VsYXIuZW90Jyk7IC8qIElFOSBDb21wYXQgTW9kZXMgKi8KKyAgc3JjOiBsb2NhbCgnRHJvaWQgU2FucycpLCBsb2NhbCgnRHJvaWRTYW5zJyksCisgICAgICAgdXJsKCcuLi9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLXJlZ3VsYXIuZW90PyNpZWZpeCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwgLyogSUU2LUlFOCAqLworICAgICAgIHVybCgnLi4vZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLndvZmYyJykgZm9ybWF0KCd3b2ZmMicpLCAvKiBTdXBlciBNb2Rlcm4gQnJvd3NlcnMgKi8KKyAgICAgICB1cmwoJy4uL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tcmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIC8qIE1vZGVybiBCcm93c2VycyAqLworICAgICAgIHVybCgnLi4vZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLnR0ZicpIGZvcm1hdCgndHJ1ZXR5cGUnKSwgLyogU2FmYXJpLCBBbmRyb2lkLCBpT1MgKi8KKyAgICAgICB1cmwoJy4uL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tcmVndWxhci5zdmcjRHJvaWRTYW5zJykgZm9ybWF0KCdzdmcnKTsgLyogTGVnYWN5IGlPUyAqLworfQorLyogZHJvaWQtc2Fucy03MDAgLSBsYXRpbiAqLworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiAnRHJvaWQgU2Fucyc7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgZm9udC13ZWlnaHQ6IDcwMDsKKyAgc3JjOiB1cmwoJy4uL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLmVvdCcpOyAvKiBJRTkgQ29tcGF0IE1vZGVzICovCisgIHNyYzogbG9jYWwoJ0Ryb2lkIFNhbnMgQm9sZCcpLCBsb2NhbCgnRHJvaWRTYW5zLUJvbGQnKSwKKyAgICAgICB1cmwoJy4uL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksIC8qIElFNi1JRTggKi8KKyAgICAgICB1cmwoJy4uL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLndvZmYyJykgZm9ybWF0KCd3b2ZmMicpLCAvKiBTdXBlciBNb2Rlcm4gQnJvd3NlcnMgKi8KKyAgICAgICB1cmwoJy4uL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgLyogTW9kZXJuIEJyb3dzZXJzICovCisgICAgICAgdXJsKCcuLi9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyksIC8qIFNhZmFyaSwgQW5kcm9pZCwgaU9TICovCisgICAgICAgdXJsKCcuLi9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC5zdmcjRHJvaWRTYW5zJykgZm9ybWF0KCdzdmcnKTsgLyogTGVnYWN5IGlPUyAqLworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC5lb3QgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLmVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODUyNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC5lb3QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC5zdmcgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRiYmJiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC5zdmcKQEAgLTAsMCArMSw0MTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Cis8ZGVmcyA+Cis8Zm9udCBpZD0iRHJvaWRTYW5zIiBob3Jpei1hZHYteD0iMTEyMyIgPjxmb250LWZhY2UKKyAgICBmb250LWZhbWlseT0iRHJvaWQgU2FucyIKKyAgICB1bml0cy1wZXItZW09IjIwNDgiCisgICAgcGFub3NlLTE9IjIgMTEgOCA2IDMgOCA0IDIgMiA0IgorICAgIGFzY2VudD0iMTkwNyIKKyAgICBkZXNjZW50PSItNDkyIgorICAgIGFscGhhYmV0aWM9IjAiIC8+Cis8Z2x5cGggdW5pY29kZT0iICIgZ2x5cGgtbmFtZT0ic3BhY2UiIGhvcml6LWFkdi14PSI1MzIiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgZ2x5cGgtbmFtZT0iZXhjbGFtIiBob3Jpei1hZHYteD0iNTg2IiBkPSJNNDE2IDQ4NUgxNzJMMTIxIDE0NjJINDY3TDQxNiA0ODVaTTExNyAxNDNRMTE3IDE5MCAxMzAgMjIyVDE2OCAyNzVUMjI0IDMwNFQyOTMgMzEzUTMyOCAzMTMgMzU5IDMwNFQ0MTUgMjc1VDQ1MyAyMjNUNDY3IDE0M1E0NjcgOTggNDUzIDY2VDQxNSAxM1QzNjAgLTE3VDI5MyAtMjdRMjU2IC0yNyAyMjQgLTE4VDE2OCAxM1QxMzEKKzY2VDExNyAxNDNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiZxdW90OyIgZ2x5cGgtbmFtZT0icXVvdGVkYmwiIGhvcml6LWFkdi14PSI5NjciIGQ9Ik00MTIgMTQ2MkwzNzEgOTM0SDE3NEwxMzMgMTQ2Mkg0MTJaTTgzNCAxNDYyTDc5MyA5MzRINTk2TDU1NSAxNDYySDgzNFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgZ2x5cGgtbmFtZT0ibnVtYmVyc2lnbiIgaG9yaXotYWR2LXg9IjEzMjMiIGQ9Ik05OTkgODQ0TDk1MiA2MTJIMTIxMFY0MDZIOTEzTDgzNiAwSDYxNkw2OTQgNDA2SDUwMEw0MjQgMEgyMDlMMjgzIDQwNkg0NVY2MTJIMzIyTDM2OSA4NDRIMTE3VjEwNTNINDA2TDQ4MyAxNDYwSDcwMkw2MjUgMTA1M0g4MjNMOTAxIDE0NjBIMTExNkwxMDM4IDEwNTNIMTI3OFY4NDRIOTk5Wk01MzkgNjEySDczNUw3ODIKKzg0NEg1ODZMNTM5IDYxMloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJCIgZ2x5cGgtbmFtZT0iZG9sbGFyIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTEwNjEgNDU3UTEwNjEgMzgyIDEwMzUgMzE4VDk1NiAyMDZUODI1IDEyN1Q2NDUgODZWLTExOUg1MDhWODJRNDQyIDg0IDM4NiA5MFQyODEgMTA3VDE4OCAxMzNUMTAwIDE2OFY0MzJRMTQyIDQxMSAxOTEgMzkyVDI5NCAzNThUNDAxIDMzMVQ1MDggMzE3VjYzNVE1MDAgNjM4IDQ5MSA2NDJRNDgzIDY0NSA0NzUgNjQ4VDQ2MQorNjUzUTM3MCA2ODggMzAyIDcyNlQxODkgODExVDEyMSA5MTVUOTggMTA0NFE5OCAxMTE5IDEyNiAxMTgwVDIwOCAxMjg3VDMzNyAxMzYxVDUwOCAxMzk5VjE1NTZINjQ1VjE0MDVRNzMyIDE0MDAgODIzIDEzODBUMTAxNCAxMzE3TDkxMyAxMDgzUTg0OCAxMTA5IDc3OCAxMTI5VDY0NSAxMTU1Vjg2Mkw2ODQgODQ4UTc3OSA4MTMgODUwIDc3NlQ5NjggNjkzVDEwMzggNTkwVDEwNjEgNDU3Wk03NjAgNDUxUTc2MCA0NzUgNzU0Cis0OTNUNzMzIDUyNlQ2OTggNTUzVDY0NSA1ODBWMzI4UTcwNCAzMzcgNzMyIDM2N1Q3NjAgNDUxWk0zOTkgMTA1MVEzOTkgMTAwNCA0MjUgOTczVDUwOCA5MjBWMTE1M1E0NTQgMTE0NyA0MjcgMTEyM1QzOTkgMTA1MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJSIgZ2x5cGgtbmFtZT0icGVyY2VudCIgaG9yaXotYWR2LXg9IjE4MDQiIGQ9Ik0zMTUgMTAyNFEzMTUgODk3IDMzNyA4MzVUNDEwIDc3MlE0NTkgNzcyIDQ4MiA4MzRUNTA2IDEwMjRRNTA2IDEyNzQgNDEwIDEyNzRRMzYwIDEyNzQgMzM4IDEyMTNUMzE1IDEwMjRaTTc1OCAxMDI2UTc1OCA5MTggNzM4IDgzMlQ2NzQgNjg3VDU2NSA1OTdUNDA4IDU2NVEzMjMgNTY1IDI1OSA1OTZUMTUxIDY4N1Q4NQorODMyVDYzIDEwMjZRNjMgMTEzNCA4MyAxMjE5VDE0NSAxMzYyVDI1MyAxNDUyVDQwOCAxNDgzUTQ5NCAxNDgzIDU1OSAxNDUyVDY2OSAxMzYzVDczNSAxMjE5VDc1OCAxMDI2Wk0xNDI1IDE0NjJMNjE0IDBIMzc1TDExODYgMTQ2MkgxNDI1Wk0xMjk4IDQ0MFExMjk4IDMxMyAxMzIwIDI1MVQxMzkzIDE4OFExNDQyIDE4OCAxNDY1IDI1MFQxNDg5IDQ0MFExNDg5IDY5MCAxMzkzIDY5MFExMzQzIDY5MCAxMzIxIDYyOVQxMjk4Cis0NDBaTTE3NDEgNDQyUTE3NDEgMzM0IDE3MjEgMjQ5VDE2NTcgMTA0VDE1NDggMTRUMTM5MSAtMThRMTMwNiAtMTggMTI0MiAxM1QxMTM1IDEwNFQxMDY5IDI0OFQxMDQ3IDQ0MlExMDQ3IDU1MCAxMDY3IDYzNVQxMTI5IDc3OFQxMjM2IDg2OFQxMzkxIDg5OVExNDc3IDg5OSAxNTQyIDg2OFQxNjUyIDc3OVQxNzE4IDYzNVQxNzQxIDQ0MloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFtcDsiIGdseXBoLW5hbWU9ImFtcGVyc2FuZCIgaG9yaXotYWR2LXg9IjE0NzkiIGQ9Ik0xNDc1IDBIMTA5OEwxMDAxIDEwMFE5MjEgNDUgODI1IDEzVDYxMiAtMjBRNDkyIC0yMCAzOTUgMTBUMjI4IDk0VDEyMCAyMjVUODIgMzk1UTgyIDQ3MiAxMDAgNTMyVDE1MyA2NDJUMjM1IDczMVQzNDQgODA3UTMwNiA4NTMgMjgwIDg5NVQyMzcgOTc5VDIxNCAxMDYyVDIwNyAxMTQ5UTIwNyAxMjI3IDIzNworMTI4OFQzMjIgMTM5M1Q0NTIgMTQ2MFQ2MTggMTQ4M1E3MDQgMTQ4MyA3NzYgMTQ2MlQ5MDEgMTQwMVQ5ODQgMTMwMVQxMDE0IDExNjVRMTAxNCAxMDk2IDk5MiAxMDM5VDkzMSA5MzJUODQyIDg0MlQ3MzEgNzY2TDk5MSA0OThRMTAyNiA1NjQgMTA1MiA2MzdUMTA5OCA3ODRIMTQxNVExNDAwIDcyNyAxMzgwIDY2NFQxMzMyIDUzOFQxMjcwIDQxMVQxMTkyIDI5MUwxNDc1IDBaTTQwMyA0MjRRNDAzIDM4MCA0MTkgMzQ1VDQ2MworMjg2VDUzMCAyNDlUNjE0IDIzNlE2NzQgMjM2IDcyNSAyNTFUODE5IDI5NUw1MTAgNjI1UTQ1OSA1ODMgNDMxIDUzNVQ0MDMgNDI0Wk03MzEgMTEyNFE3MzEgMTE1NSA3MjEgMTE3NlQ2OTUgMTIxMlQ2NTggMTIzMlQ2MTYgMTIzOVE1OTQgMTIzOSA1NzIgMTIzM1Q1MzEgMTIxNFQ1MDEgMTE3OFQ0ODkgMTEyMlE0ODkgMTA3MCA1MTIgMTAyNFQ1NzUgOTMyUTY1MiA5NzYgNjkxIDEwMjBUNzMxIDExMjRaIiAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgZ2x5cGgtbmFtZT0icXVvdGVzaW5nbGUiIGhvcml6LWFkdi14PSI1NDUiIGQ9Ik00MTIgMTQ2MkwzNzEgOTM0SDE3NEwxMzMgMTQ2Mkg0MTJaIiAvPgorPGdseXBoIHVuaWNvZGU9IigiIGdseXBoLW5hbWU9InBhcmVubGVmdCIgaG9yaXotYWR2LXg9IjY5NCIgZD0iTTgyIDU2MVE4MiA2ODYgMTAwIDgwN1QxNTUgMTA0M1QyNDggMTI2M1QzODMgMTQ2Mkg2MzNRNDkyIDEyNjkgNDIwIDEwMzhUMzQ4IDU2M1EzNDggNDQ0IDM2NiAzMjZUNDIwIDk1VDUwOSAtMTI0VDYzMSAtMzI0SDM4M1EzMDUgLTIzNCAyNDkgLTEzMVQxNTUgODRUMTAwIDMxN1Q4MiA1NjFaIiAvPgorPGdseXBoIHVuaWNvZGU9IikiIGdseXBoLW5hbWU9InBhcmVucmlnaHQiIGhvcml6LWFkdi14PSI2OTQiIGQ9Ik02MTIgNTYxUTYxMiA0MzcgNTk0IDMxN1Q1MzkgODVUNDQ2IC0xMzFUMzExIC0zMjRINjNRMTMyIC0yMzAgMTg1IC0xMjRUMjc0IDk1VDMyOCAzMjZUMzQ2IDU2M1EzNDYgODA3IDI3NCAxMDM4VDYxIDE0NjJIMzExUTM4OSAxMzY5IDQ0NSAxMjY0VDUzOSAxMDQ0VDU5NCA4MDhUNjEyIDU2MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iKiIgZ2x5cGgtbmFtZT0iYXN0ZXJpc2siIGhvcml6LWFkdi14PSIxMTE2IiBkPSJNNjg4IDE1NTZMNjQ3IDExODhMMTAyMCAxMjkyTDEwNTMgMTA0MEw3MTMgMTAxNkw5MzYgNzE5TDcwOSA1OThMNTUzIDkxMUw0MTYgNjAwTDE4MCA3MTlMNDAxIDEwMTZMNjMgMTA0MkwxMDIgMTI5Mkw0NjcgMTE4OEw0MjYgMTU1Nkg2ODhaIiAvPgorPGdseXBoIHVuaWNvZGU9IisiIGdseXBoLW5hbWU9InBsdXMiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNDU1IDYxMkg4OFY4MzFINDU1VjEyMDBINjc0VjgzMUgxMDQwVjYxMkg2NzRWMjQ4SDQ1NVY2MTJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiwiIGdseXBoLW5hbWU9ImNvbW1hIiBob3Jpei1hZHYteD0iNTk0IiBkPSJNNDU5IDIxNVE0NDUgMTYxIDQyNiAxMDBUMzgzIC0yM1QzMzQgLTE0NlQyODMgLTI2NEg2M1E3OCAtMjAzIDkyIC0xMzdUMTIwIC02VDE0NSAxMjJUMTY0IDIzOEg0NDRMNDU5IDIxNVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgZ2x5cGgtbmFtZT0iaHlwaGVuIiBob3Jpei1hZHYteD0iNjU5IiBkPSJNNjEgNDI0VjY3NEg1OThWNDI0SDYxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBnbHlwaC1uYW1lPSJwZXJpb2QiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0xMTcgMTQzUTExNyAxOTAgMTMwIDIyMlQxNjggMjc1VDIyNCAzMDRUMjkzIDMxM1EzMjggMzEzIDM1OSAzMDRUNDE1IDI3NVQ0NTMgMjIzVDQ2NyAxNDNRNDY3IDk4IDQ1MyA2NlQ0MTUgMTNUMzYwIC0xN1QyOTMgLTI3UTI1NiAtMjcgMjI0IC0xOFQxNjggMTNUMTMxIDY2VDExNyAxNDNaIiAvPgorPGdseXBoIHVuaWNvZGU9Ii8iIGdseXBoLW5hbWU9InNsYXNoIiBob3Jpei1hZHYteD0iODQ2IiBkPSJNODM2IDE0NjJMMjkxIDBIMTRMNTU5IDE0NjJIODM2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSIwIiBnbHlwaC1uYW1lPSJ6ZXJvIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTEwNjUgNzMxUTEwNjUgNTU0IDEwMzggNDE1VDk1MCAxNzlUNzk0IDMxVDU2MyAtMjBRNDM2IC0yMCAzNDIgMzFUMTg2IDE3OVQ5NCA0MTVUNjMgNzMxUTYzIDkwOCA5MCAxMDQ4VDE3OCAxMjg1VDMzMyAxNDMzVDU2MyAxNDg1UTY4OSAxNDg1IDc4MyAxNDM0VDk0MCAxMjg2VDEwMzQgMTA0OVQxMDY1IDczMVpNMzcxIDczMVEzNzEKKzQ4MSA0MTQgMzU1VDU2MyAyMjlRNjY3IDIyOSA3MTIgMzU0VDc1OCA3MzFRNzU4IDk4MiA3MTMgMTEwOFQ1NjMgMTIzNVE1MTAgMTIzNSA0NzQgMTIwM1Q0MTQgMTEwOFQzODEgOTUxVDM3MSA3MzFaIiAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGdseXBoLW5hbWU9Im9uZSIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik04MTcgMEg1MDhWODQ2UTUwOCA4NzIgNTA4IDkwOFQ1MTAgOTg0VDUxMyAxMDY0VDUxNiAxMTM3UTUxMSAxMTMxIDQ5OSAxMTE5VDQ3MiAxMDkzVDQ0MSAxMDYzVDQxMCAxMDM2TDI0MiA5MDFMOTIgMTA4N0w1NjMgMTQ2Mkg4MTdWMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iMiIgZ2x5cGgtbmFtZT0idHdvIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTEwNjMgMEg4MlYyMTVMNDI2IDU4NlE0OTEgNjU2IDU0NCA3MTVUNjM1IDgzMFQ2OTQgOTQ0VDcxNSAxMDY5UTcxNSAxMTQzIDY3MSAxMTg0VDU1MSAxMjI1UTQ3MiAxMjI1IDM5OSAxMTg2VDI0NiAxMDc1TDc4IDEyNzRRMTIzIDEzMTUgMTcyIDEzNTJUMjgwIDE0MTlUNDEwIDE0NjVUNTY5IDE0ODNRNjc0IDE0ODMgNzU3CisxNDU0VDkwMCAxMzcyVDk5MCAxMjQyVDEwMjIgMTA3MVExMDIyIDk4NSA5OTIgOTA3VDkxMCA3NTNUNzkwIDYwM1Q2NDMgNDUxTDQ2NyAyNzRWMjYwSDEwNjNWMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iMyIgZ2x5cGgtbmFtZT0idGhyZWUiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTAwNiAxMTM1UTEwMDYgMTA1OSA5ODIgOTk5VDkxNSA4OTNUODE1IDgxN1Q2OTAgNzcwVjc2NFE4NjcgNzQyIDk1OCA2NTdUMTA0OSA0MjZRMTA0OSAzMzAgMTAxNSAyNDlUOTA5IDEwN1Q3MjkgMTRUNDczIC0yMFEzNTUgLTIwIDI1MSAtMVQ1NyA1OVYzMjJRMTAyIDI5OCAxNTIgMjgwVDI1MiAyNTBUMzUwIDIzMVQ0NDIKKzIyNVE1MjggMjI1IDU4NSAyNDFUNjc2IDI4NlQ3MjQgMzU1VDczOSA0NDRRNzM5IDQ4OSA3MjEgNTI1VDY2MSA1ODdUNTUyIDYyN1QzODcgNjQxSDI4M1Y4NThIMzg1UTQ3NyA4NTggNTM4IDg3NFQ2MzUgOTE5VDY4NyA5ODZUNzAyIDEwNjdRNzAyIDExNDUgNjU0IDExODlUNTAwIDEyMzNRNDUyIDEyMzMgNDExIDEyMjRUMzM0IDEyMDBUMjY5IDExNjhUMjE1IDExMzNMNTkgMTMzOVExMDEgMTM3MCAxNTAgMTM5NlQyNTggMTQ0MVQzODMKKzE0NzJUNTI2IDE0ODNRNjM0IDE0ODMgNzIyIDE0NjBUODc0IDEzOTJUOTcxIDEyODNUMTAwNiAxMTM1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSI0IiBnbHlwaC1uYW1lPSJmb3VyIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTEwODUgMzAzSDkwOVYwSDYwOFYzMDNINFY1MThMNjI1IDE0NjJIOTA5VjU0M0gxMDg1VjMwM1pNNjA4IDU0M1Y3OTFRNjA4IDgwNCA2MDggODI4VDYxMCA4ODRUNjEyIDk0OFQ2MTUgMTAxMVQ2MTggMTA2M1Q2MjEgMTA5Nkg2MTJRNTk0IDEwNTQgNTcyIDEwMDdUNTIwIDkxM0wyNzYgNTQzSDYwOFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iNSIgZ2x5cGgtbmFtZT0iZml2ZSIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik01OTggOTM0UTY5MiA5MzQgNzczIDkwNVQ5MTQgODIwVDEwMDggNjgxVDEwNDIgNDg5UTEwNDIgMzcwIDEwMDUgMjc2VDg5NiAxMTZUNzE4IDE1VDQ3MyAtMjBRNDE4IC0yMCAzNjQgLTE1VDI2MSAtMVQxNjcgMjRUODYgNTlWMzI2UTEyMSAzMDYgMTY3IDI4OVQyNjIgMjU5VDM2MiAyMzlUNDU3IDIzMVE1OTEgMjMxIDY2MQorMjg2VDczMSA0NjNRNzMxIDU3MSA2NjMgNjI3VDQ1MSA2ODRRNDI1IDY4NCAzOTYgNjgxVDMzOCA2NzNUMjgzIDY2M1QyMzggNjUxTDExNSA3MTdMMTcwIDE0NjJIOTQyVjEyMDBINDM4TDQxNCA5MTNRNDQ2IDkyMCA0ODggOTI3VDU5OCA5MzRaIiAvPgorPGdseXBoIHVuaWNvZGU9IjYiIGdseXBoLW5hbWU9InNpeCIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik03NiA2MjFRNzYgNzI2IDg3IDgzMFQxMjggMTAyOVQyMDggMTIwN1QzMzYgMTM0OVQ1MjIgMTQ0NFQ3NzYgMTQ3OVE3OTcgMTQ3OSA4MjIgMTQ3OFQ4NzIgMTQ3NlQ5MjIgMTQ3MVQ5NjUgMTQ2NFYxMjE3UTkyNyAxMjI2IDg4NSAxMjMxVDc5OSAxMjM3UTY2NCAxMjM3IDU3NyAxMjA0VDQzOSAxMTEwVDM2NyA5NjZUMzQwCis3ODBIMzUyUTM3MiA4MTYgNDAwIDg0N1Q0NjcgOTAxVDU1MiA5MzdUNjU5IDk1MFE3NTQgOTUwIDgzMCA5MTlUOTU4IDgyOVQxMDM5IDY4NFQxMDY3IDQ4N1ExMDY3IDM2OCAxMDM0IDI3NFQ5MzggMTE1VDc4OCAxNVQ1OTAgLTIwUTQ4MiAtMjAgMzg4IDE4VDIyNSAxMzZUMTE2IDMzNVQ3NiA2MjFaTTU4NCAyMjdRNjI1IDIyNyA2NTggMjQyVDcxNiAyODlUNzU0IDM2OVQ3NjggNDgzUTc2OCA1OTAgNzI0IDY1MVQ1ODggNzEzUTU0MgorNzEzIDUwNCA2OTVUNDM5IDY0OFQzOTggNTgzVDM4MyA1MTBRMzgzIDQ1OSAzOTUgNDA5VDQzMyAzMThUNDk2IDI1MlQ1ODQgMjI3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSI3IiBnbHlwaC1uYW1lPSJzZXZlbiIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik0yMDcgMEw3MjcgMTIwMEg1NVYxNDYwSDEwNjNWMTI2Nkw1MzAgMEgyMDdaIiAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGdseXBoLW5hbWU9ImVpZ2h0IiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTU2NSAxNDgxUTY1NiAxNDgxIDczNyAxNDU5VDg3OSAxMzkzVDk3NiAxMjgzVDEwMTIgMTEyOFExMDEyIDEwNjIgOTkyIDEwMDlUOTM3IDkxMlQ4NTQgODM0VDc1MCA3NzJRODA4IDc0MSA4NjMgNzAzVDk2MiA2MThUMTAzMSA1MTFUMTA1NyAzNzlRMTA1NyAyODggMTAyMSAyMTRUOTIwIDg4VDc2NSA4VDU2NSAtMjBRNDQ3CistMjAgMzU1IDdUMjAwIDg0VDEwNSAyMDdUNzIgMzcxUTcyIDQ0NiA5NCA1MDZUMTU0IDYxNFQyNDMgNjk5VDM1MiA3NjRRMzAzIDc5NSAyNjAgODMxVDE4NiA5MTJUMTM2IDEwMTFUMTE3IDExMzBRMTE3IDEyMTcgMTUzIDEyODJUMjUyIDEzOTJUMzk1IDE0NTlUNTY1IDE0ODFaTTM1OCAzODlRMzU4IDM0OSAzNzEgMzE2VDQwOSAyNThUNDczIDIyMVQ1NjEgMjA3UTY2NiAyMDcgNzE4IDI1NlQ3NzAgMzg3UTc3MCA0MjkgNzUzCis0NjJUNzA4IDUyNFQ2NDUgNTc3VDU3NSA2MjNMNTUzIDYzN1E1MDkgNjE1IDQ3MyA1OTBUNDEyIDUzNFQzNzIgNDY3VDM1OCAzODlaTTU2MyAxMjU1UTUzMCAxMjU1IDUwMiAxMjQ1VDQ1MyAxMjE2VDQyMCAxMTY5VDQwOCAxMTA2UTQwOCAxMDY0IDQyMCAxMDM0VDQ1NCA5ODBUNTA0IDkzOFQ1NjUgOTAxUTU5NiA5MTcgNjI0IDkzNlQ2NzMgOTc5VDcwOCAxMDM1VDcyMSAxMTA2UTcyMSAxMTQxIDcwOSAxMTY5VDY3NiAxMjE2VDYyNgorMTI0NVQ1NjMgMTI1NVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iOSIgZ2x5cGgtbmFtZT0ibmluZSIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik0xMDU1IDgzOFExMDU1IDczMyAxMDQ0IDYyOVQxMDAzIDQyOVQ5MjMgMjUyVDc5NSAxMDlUNjA5IDE1VDM1NCAtMjBRMzMzIC0yMCAzMDggLTE5VDI1OCAtMTdUMjA4IC0xM1QxNjYgLTZWMjQyUTIwMyAyMzIgMjQ1IDIyN1QzMzIgMjIxUTQ2NyAyMjEgNTU0IDI1NFQ2OTIgMzQ4VDc2NCA0OTNUNzkxIDY3OEg3NzhRNzU4Cis2NDIgNzMwIDYxMVQ2NjQgNTU3VDU3OCA1MjFUNDcxIDUwOFEzNzYgNTA4IDMwMCA1MzlUMTcyIDYyOVQ5MSA3NzRUNjMgOTcxUTYzIDEwOTAgOTYgMTE4NFQxOTIgMTM0M1QzNDIgMTQ0NFQ1NDEgMTQ3OVE2NDkgMTQ3OSA3NDMgMTQ0MVQ5MDYgMTMyM1QxMDE1IDExMjNUMTA1NSA4MzhaTTU0NyAxMjMxUTUwNiAxMjMxIDQ3MiAxMjE2VDQxNCAxMTcwVDM3NiAxMDkwVDM2MiA5NzVRMzYyIDg2OSA0MDcgODA3VDU0MyA3NDVRNTg5Cis3NDUgNjI3IDc2M1Q2OTIgODEwVDczMyA4NzVUNzQ4IDk0OFE3NDggOTk5IDczNiAxMDQ5VDY5OCAxMTQwVDYzNSAxMjA2VDU0NyAxMjMxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSI6IiBnbHlwaC1uYW1lPSJjb2xvbiIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTExNyAxNDNRMTE3IDE5MCAxMzAgMjIyVDE2OCAyNzVUMjI0IDMwNFQyOTMgMzEzUTMyOCAzMTMgMzU5IDMwNFQ0MTUgMjc1VDQ1MyAyMjNUNDY3IDE0M1E0NjcgOTggNDUzIDY2VDQxNSAxM1QzNjAgLTE3VDI5MyAtMjdRMjU2IC0yNyAyMjQgLTE4VDE2OCAxM1QxMzEgNjZUMTE3IDE0M1pNMTE3IDk2OVExMTcgMTAxNgorMTMwIDEwNDhUMTY4IDExMDFUMjI0IDExMzBUMjkzIDExMzlRMzI4IDExMzkgMzU5IDExMzBUNDE1IDExMDFUNDUzIDEwNDlUNDY3IDk2OVE0NjcgOTI0IDQ1MyA4OTJUNDE1IDgzOVQzNjAgODA5VDI5MyA3OTlRMjU2IDc5OSAyMjQgODA4VDE2OCA4MzhUMTMxIDg5MVQxMTcgOTY5WiIgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBnbHlwaC1uYW1lPSJzZW1pY29sb24iIGhvcml6LWFkdi14PSI1OTQiIGQ9Ik00NDQgMjM4TDQ1OSAyMTVRNDQ1IDE2MSA0MjYgMTAwVDM4MyAtMjNUMzM0IC0xNDZUMjgzIC0yNjRINjNRNzggLTIwMyA5MiAtMTM3VDEyMCAtNlQxNDUgMTIyVDE2NCAyMzhINDQ0Wk0xMTcgOTY5UTExNyAxMDE2IDEzMCAxMDQ4VDE2OCAxMTAxVDIyNCAxMTMwVDI5MyAxMTM5UTMyOCAxMTM5IDM1OSAxMTMwVDQxNQorMTEwMVQ0NTMgMTA0OVQ0NjcgOTY5UTQ2NyA5MjQgNDUzIDg5MlQ0MTUgODM5VDM2MCA4MDlUMjkzIDc5OVEyNTYgNzk5IDIyNCA4MDhUMTY4IDgzOFQxMzEgODkxVDExNyA5NjlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiZsdDsiIGdseXBoLW5hbWU9Imxlc3MiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTA0MCAyMDNMODggNjQxVjc4NEwxMDQwIDEyODBWMTA0MEwzOTcgNzIzTDEwNDAgNDQyVjIwM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iPSIgZ2x5cGgtbmFtZT0iZXF1YWwiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNODggODA3VjEwMjRIMTA0MFY4MDdIODhaTTg4IDQxOFY2MzdIMTA0MFY0MThIODhaIiAvPgorPGdseXBoIHVuaWNvZGU9IiZndDsiIGdseXBoLW5hbWU9ImdyZWF0ZXIiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNODggNDQyTDczMSA3MjNMODggMTA0MFYxMjgwTDEwNDAgNzg0VjY0MUw4OCAyMDNWNDQyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSI/IiBnbHlwaC1uYW1lPSJxdWVzdGlvbiIgaG9yaXotYWR2LXg9Ijk0MCIgZD0iTTI2NCA0ODVWNTU5UTI2NCA2MTAgMjc0IDY1MVQzMDYgNzMwVDM2MiA4MDNUNDQ0IDg3N1E0ODYgOTEwIDUxNSA5MzZUNTYyIDk4N1Q1ODggMTA0MVQ1OTYgMTEwNlE1OTYgMTE2MyA1NTggMTIwMFQ0NDAgMTIzN1EzNzEgMTIzNyAyOTIgMTIwOFQxMjcgMTEzN0wyNSAxMzU4UTY4IDEzODMgMTE4IDE0MDVUMjIzIDE0NDVUMzM0CisxNDczVDQ0NCAxNDgzUTU0NiAxNDgzIDYyOCAxNDU5VDc2NyAxMzg3VDg1NCAxMjczVDg4NSAxMTIwUTg4NSAxMDU3IDg3MSAxMDA4VDgzMCA5MTZUNzYxIDgzNFQ2NjQgNzUwUTYyMiA3MTcgNTk2IDY5M1Q1NTQgNjQ2VDUzNCA2MDFUNTI4IDU0NVY0ODVIMjY0Wk0yMzEgMTQzUTIzMSAxOTAgMjQ0IDIyMlQyODIgMjc1VDMzOCAzMDRUNDA4IDMxM1E0NDMgMzEzIDQ3NCAzMDRUNTMwIDI3NVQ1NjggMjIzVDU4MiAxNDNRNTgyCis5OCA1NjggNjZUNTMwIDEzVDQ3NSAtMTdUNDA4IC0yN1EzNzEgLTI3IDMzOSAtMThUMjgyIDEzVDI0NSA2NlQyMzEgMTQzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJAIiBnbHlwaC1uYW1lPSJhdCIgaG9yaXotYWR2LXg9IjE3NzQiIGQ9Ik0xNjczIDc1MlExNjczIDY1NyAxNjUxIDU2NFQxNTgyIDM5OFQxNDY3IDI3OVQxMzAzIDIzM1ExMjY1IDIzMyAxMjMyIDI0MlQxMTcwIDI2OVQxMTIyIDMxMFQxMDkwIDM2MkgxMDc1UTEwNTYgMzM3IDEwMzEgMzE0VDk3NSAyNzJUOTA3IDI0NFQ4MjUgMjMzUTc0MiAyMzMgNjc4IDI2MVQ1NjkgMzQyVDUwMiA0NjhUNDc5IDYzMVE0NzkKKzczNCA1MTAgODIwVDU5OSA5NjhUNzQwIDEwNjVUOTI2IDExMDBROTcxIDExMDAgMTAxOSAxMDk1VDExMTEgMTA4MlQxMTk1IDEwNjRUMTI2MiAxMDQ0TDEyNDEgNjI1UTEyMzkgNjAzIDEyMzkgNTgyVDEyMzkgNTU1UTEyMzkgNTEzIDEyNDUgNDg2VDEyNjIgNDQ0VDEyODYgNDIyVDEzMTUgNDE2UTEzNTAgNDE2IDEzNzYgNDQzVDE0MTkgNTE2VDE0NDUgNjIzVDE0NTQgNzU0UTE0NTQgODgyIDE0MTYgOTgyVDEzMTEgMTE1MVQxMTUwCisxMjU2VDk0OCAxMjkyUTc5NSAxMjkyIDY3OSAxMjQxVDQ4NCAxMDk5VDM2NSA4ODJUMzI0IDYwOFEzMjQgNDcwIDM1OSAzNjRUNDYzIDE4NVQ2MzMgNzVUODY2IDM3UTkyMiAzNyA5ODEgNDRUMTA5OCA2M1QxMjEzIDkyVDEzMjEgMTI5Vi02M1ExMjI3IC0xMDUgMTExMyAtMTI5VDg2OCAtMTU0UTY4NyAtMTU0IDU0NSAtMTAzVDMwNCA0NlQxNTQgMjgzVDEwMiA2MDJRMTAyIDcyNiAxMjkgODM5VDIwNyAxMDUwVDMzMSAxMjI3VDQ5OQorMTM2M1Q3MDYgMTQ1MFQ5NDggMTQ4MVExMTA2IDE0ODEgMTIzOSAxNDMxVDE0NjggMTI4NlQxNjE5IDEwNTZUMTY3MyA3NTJaTTcxMSA2MjdRNzExIDUxNSA3NDkgNDY2VDg1MCA0MTZRODkyIDQxNiA5MjIgNDM1VDk3MiA0OTBUMTAwMiA1NzVUMTAxNiA2ODZMMTAyOCA5MDdRMTAwOCA5MTIgOTgxIDkxNVQ5MjYgOTE4UTg2NyA5MTggODI2IDg5M1Q3NjAgODI3VDcyMyA3MzRUNzExIDYyN1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iQSIgZ2x5cGgtbmFtZT0iQSIgaG9yaXotYWR2LXg9IjEzMzEiIGQ9Ik0xMDE4IDBMOTE4IDM0OEg0MTRMMzEzIDBIMEw0NzUgMTQ2OEg4NTRMMTMzMSAwSDEwMThaTTg0NiA2MDhMNzUyIDkyOFE3NDYgOTQ2IDczNCA5ODdUNzA5IDEwNzdUNjgzIDExNzdUNjY2IDEyNjJRNjYyIDEyNDAgNjU2IDEyMTBUNjQxIDExNDdUNjIzIDEwNzlUNjA2IDEwMTVUNTkyIDk2MlQ1ODIgOTI4TDQ4OSA2MDhIODQ2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJCIiBnbHlwaC1uYW1lPSJCIiBob3Jpei1hZHYteD0iMTMxNSIgZD0iTTE4NCAxNDYySDYxMlE3NTAgMTQ2MiA4NTQgMTQ0M1QxMDI4IDEzODBUMTEzMyAxMjY2VDExNjkgMTA5MlExMTY5IDEwMzAgMTE1NCA5NzZUMTExMCA4ODFUMTA0MCA4MTNUOTQ0IDc3NlY3NjZROTk5IDc1NCAxMDQ2IDczMlQxMTI5IDY3MFQxMTg1IDU3MFQxMjA2IDQyNFExMjA2IDMyNCAxMTcxIDI0NlQxMDcxIDExM1Q5MTIKKzI5VDcwMCAwSDE4NFYxNDYyWk00OTQgODgzSDY1NVE3MTMgODgzIDc1MiA4OTNUODE1IDkyNVQ4NDkgOTc3VDg2MCAxMDUxUTg2MCAxMTM1IDgwOCAxMTcxVDY0MSAxMjA4SDQ5NFY4ODNaTTQ5NCA2MzdWMjU2SDY3NlE3MzcgMjU2IDc3OCAyNzBUODQ1IDMxMFQ4ODIgMzczVDg5MyA0NTVRODkzIDQ5NiA4ODIgNTI5VDg0NSA1ODdUNzc1IDYyNFQ2NjggNjM3SDQ5NFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgZ2x5cGgtbmFtZT0iQyIgaG9yaXotYWR2LXg9IjEzMDUiIGQ9Ik04MDUgMTIyNVE3MTYgMTIyNSA2NDggMTE5MVQ1MzMgMTA5MlQ0NjIgOTM1VDQzOCA3MjdRNDM4IDYxMCA0NTkgNTE5VDUyNSAzNjZUNjM5IDI3MVQ4MDUgMjM4UTg5NCAyMzggOTgzIDI1OFQxMTc4IDMxNVY1NVExMTMwIDM1IDEwODMgMjFUOTg3IC0yVDg4NyAtMTVUNzc2IC0yMFE2MDcgLTIwIDQ4MyAzNFQyNzggMTg2VDE1OAorNDIyVDExOSA3MjlRMTE5IDg5NSAxNjQgMTAzM1QyOTYgMTI3MlQ1MTEgMTQyN1Q4MDUgMTQ4M1E5MTQgMTQ4MyAxMDIzIDE0NTZUMTIzMyAxMzgwTDExMzMgMTEyOFExMDUxIDExNjcgOTY4IDExOTZUODA1IDEyMjVaIiAvPgorPGdseXBoIHVuaWNvZGU9IkQiIGdseXBoLW5hbWU9IkQiIGhvcml6LWFkdi14PSIxNDM0IiBkPSJNMTMxNSA3NDVRMTMxNSA1NjAgMTI2NSA0MjFUMTExOSAxODhUODg1IDQ3VDU2OSAwSDE4NFYxNDYySDYxMlE3NzMgMTQ2MiA5MDIgMTQxNlQxMTI0IDEyODBUMTI2NSAxMDU1VDEzMTUgNzQ1Wk0xMDAxIDczN1ExMDAxIDg1OSA5NzcgOTQ3VDkwNiAxMDk0VDc5MiAxMTgwVDYzNyAxMjA4SDQ5NFYyNTZINjA4UTgwNCAyNTYgOTAyCiszNzZUMTAwMSA3MzdaIiAvPgorPGdseXBoIHVuaWNvZGU9IkUiIGdseXBoLW5hbWU9IkUiIGhvcml6LWFkdi14PSIxMTQ3IiBkPSJNMTAyNiAwSDE4NFYxNDYySDEwMjZWMTIwOEg0OTRWODg3SDk4OVY2MzNINDk0VjI1NkgxMDI2VjBaIiAvPgorPGdseXBoIHVuaWNvZGU9IkYiIGdseXBoLW5hbWU9IkYiIGhvcml6LWFkdi14PSIxMTI0IiBkPSJNNDg5IDBIMTg0VjE0NjJIMTAyMlYxMjA4SDQ4OVY4MzFIOTg1VjU3OEg0ODlWMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iRyIgZ2x5cGgtbmFtZT0iRyIgaG9yaXotYWR2LXg9IjE0ODMiIGQ9Ik03MzkgODIxSDEzMTlWNjNRMTI2MSA0NCAxMjAyIDI5VDEwODAgM1Q5NDcgLTE0VDc5OSAtMjBRNjM1IC0yMCA1MDkgMjhUMjk2IDE3MlQxNjQgNDA4VDExOSA3MzNRMTE5IDkwNSAxNjkgMTA0NFQzMTYgMTI4MFQ1NTYgMTQzMFQ4ODMgMTQ4M1ExMDAwIDE0ODMgMTExMiAxNDU4VDEzMTcgMTM5M0wxMjE0IDExNDVRMTE0NiAxMTc5CisxMDYxIDEyMDJUODgxIDEyMjVRNzc5IDEyMjUgNjk4IDExOTBUNTU4IDEwODlUNDY5IDkzMlQ0MzggNzI3UTQzOCA2MTkgNDU5IDUzMFQ1MjcgMzc1VDY0NSAyNzRUODE5IDIzOFE4ODUgMjM4IDkzMCAyNDRUMTAxNiAyNThWNTYzSDczOVY4MjFaIiAvPgorPGdseXBoIHVuaWNvZGU9IkgiIGdseXBoLW5hbWU9IkgiIGhvcml6LWFkdi14PSIxNDg1IiBkPSJNMTMwMCAwSDk5MVY2MzFINDk0VjBIMTg0VjE0NjJINDk0Vjg4OUg5OTFWMTQ2MkgxMzAwVjBaIiAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGdseXBoLW5hbWU9IkkiIGhvcml6LWFkdi14PSI3OTciIGQ9Ik03MzEgMEg2NlYxNzZMMjQ0IDI1OFYxMjA0TDY2IDEyODZWMTQ2Mkg3MzFWMTI4Nkw1NTMgMTIwNFYyNThMNzMxIDE3NlYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJKIiBnbHlwaC1uYW1lPSJKIiBob3Jpei1hZHYteD0iNjc4IiBkPSJNLTIgLTQzMFEtNjcgLTQzMCAtMTE2IC00MjRULTE5OSAtNDA4Vi0xNTBRLTE2MiAtMTU4IC0xMjIgLTE2NFQtMzMgLTE3MFExMyAtMTcwIDUyIC0xNjBUMTIxIC0xMjZUMTY3IC02MFQxODQgNDNWMTQ2Mkg0OTRWNTNRNDk0IC03MyA0NTggLTE2NFQzNTYgLTMxNFQxOTkgLTQwMlQtMiAtNDMwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJLIiBnbHlwaC1uYW1lPSJLIiBob3Jpei1hZHYteD0iMTI5OCIgZD0iTTEyOTggMEg5NDZMNjEwIDYwOEw0OTQgNTIyVjBIMTg0VjE0NjJINDk0Vjc1OEw2MTYgOTY1TDk1MCAxNDYySDEyOTRMODI3IDgwM0wxMjk4IDBaIiAvPgorPGdseXBoIHVuaWNvZGU9IkwiIGdseXBoLW5hbWU9IkwiIGhvcml6LWFkdi14PSIxMDk2IiBkPSJNMTg0IDBWMTQ2Mkg0OTRWMjU2SDEwMjZWMEgxODRaIiAvPgorPGdseXBoIHVuaWNvZGU9Ik0iIGdseXBoLW5hbWU9Ik0iIGhvcml6LWFkdi14PSIxODcwIiBkPSJNNzcyIDBMNDUxIDExNDdINDQyUTQ0OCAxMDU1IDQ1MiA5NjlRNDU0IDkzMiA0NTUgODkzVDQ1OCA4MTZUNDYwIDc0M1Q0NjEgNjgwVjBIMTg0VjE0NjJINjA2TDkyMiAzNDRIOTI4TDEyNjQgMTQ2MkgxNjg2VjBIMTM5N1Y2OTJRMTM5NyA3MTggMTM5NyA3NTFUMTM5OSA4MjFUMTQwMSA4OTZUMTQwNCA5NzBRMTQwOCAxMDU0CisxNDExIDExNDVIMTQwM0wxMDU3IDBINzcyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBnbHlwaC1uYW1lPSJOIiBob3Jpei1hZHYteD0iMTYwNCIgZD0iTTE0MTkgMEgxMDI2TDQ1MSAxMTA2SDQ0MlE0NDggMTAyOSA0NTIgOTUzUTQ1NiA4ODggNDU4IDgxN1Q0NjEgNjg4VjBIMTg0VjE0NjJINTc1TDExNDkgMzY3SDExNTVRMTE1MiA0NDMgMTE0OCA1MTdRMTE0NyA1NDkgMTE0NiA1ODJUMTE0MyA2NDlUMTE0MiA3MTRUMTE0MSA3NzBWMTQ2MkgxNDE5VjBaIiAvPgorPGdseXBoIHVuaWNvZGU9Ik8iIGdseXBoLW5hbWU9Ik8iIGhvcml6LWFkdi14PSIxNTQ4IiBkPSJNMTQzMCA3MzNRMTQzMCA1NjQgMTM5MSA0MjVUMTI3MCAxODdUMTA2NiAzNFQ3NzQgLTIwUTYwNiAtMjAgNDgzIDM0VDI3OSAxODdUMTU5IDQyNVQxMTkgNzM1UTExOSA5MDUgMTU4IDEwNDNUMjc5IDEyODBUNDgzIDE0MzFUNzc2IDE0ODVROTQ0IDE0ODUgMTA2NyAxNDMyVDEyNzAgMTI4MFQxMzkwIDEwNDNUMTQzMCA3MzNaTTQzOAorNzMzUTQzOCA2MTggNDU4IDUyN1Q1MTkgMzcyVDYyNCAyNzRUNzc0IDI0MFE4NjMgMjQwIDkyNiAyNzRUMTAzMCAzNzFUMTA5MCA1MjZUMTExMCA3MzNRMTExMCA4NDggMTA5MSA5MzlUMTAzMSAxMDk1VDkyNyAxMTkzVDc3NiAxMjI3UTY4OSAxMjI3IDYyNSAxMTkzVDUyMCAxMDk1VDQ1OCA5NDBUNDM4IDczM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iUCIgZ2x5cGgtbmFtZT0iUCIgaG9yaXotYWR2LXg9IjEyMjUiIGQ9Ik00OTQgNzc0SDU1NVE2ODYgNzc0IDc1MiA4MjZUODE5IDk5NVE4MTkgMTEwNCA3NjAgMTE1NlQ1NzMgMTIwOEg0OTRWNzc0Wk0xMTMzIDEwMDZRMTEzMyA5MTAgMTEwNCA4MjJUMTAwOSA2NjdUODM0IDU2MFQ1NjUgNTIwSDQ5NFYwSDE4NFYxNDYySDU5MFE3MzEgMTQ2MiA4MzMgMTQzMVQxMDAyIDEzNDFUMTEwMSAxMTk4VDExMzMgMTAwNloiIC8+Cis8Z2x5cGggdW5pY29kZT0iUSIgZ2x5cGgtbmFtZT0iUSIgaG9yaXotYWR2LXg9IjE1NDgiIGQ9Ik0xNDMwIDczM1ExNDMwIDYxNCAxNDExIDUxMFQxMzUyIDMxOVQxMjUzIDE2NlQxMTEyIDU1TDE0NzMgLTM0OEgxMDc1TDgwNyAtMThRODAwIC0xOCA3OTQgLTE5UTc4OSAtMjAgNzg0IC0yMFQ3NzQgLTIwUTYwNiAtMjAgNDgzIDM0VDI3OSAxODdUMTU5IDQyNVQxMTkgNzM1UTExOSA5MDUgMTU4IDEwNDNUMjc5IDEyODBUNDgzCisxNDMxVDc3NiAxNDg1UTk0NCAxNDg1IDEwNjcgMTQzMlQxMjcwIDEyODBUMTM5MCAxMDQzVDE0MzAgNzMzWk00MzggNzMzUTQzOCA2MTggNDU4IDUyN1Q1MTkgMzcyVDYyNCAyNzRUNzc0IDI0MFE4NjMgMjQwIDkyNiAyNzRUMTAzMCAzNzFUMTA5MCA1MjZUMTExMCA3MzNRMTExMCA4NDggMTA5MSA5MzlUMTAzMSAxMDk1VDkyNyAxMTkzVDc3NiAxMjI3UTY4OSAxMjI3IDYyNSAxMTkzVDUyMCAxMDk1VDQ1OCA5NDBUNDM4IDczM1oiCisvPgorPGdseXBoIHVuaWNvZGU9IlIiIGdseXBoLW5hbWU9IlIiIGhvcml6LWFkdi14PSIxMjkwIiBkPSJNNDk0IDgxM0g1NzhRNzA3IDgxMyA3NjMgODY0VDgxOSAxMDE2UTgxOSAxMTIwIDc1OSAxMTY0VDU3MyAxMjA4SDQ5NFY4MTNaTTQ5NCA1NjFWMEgxODRWMTQ2Mkg1ODRRODY1IDE0NjIgOTk5IDEzNTRUMTEzMyAxMDI0UTExMzMgOTQ5IDExMTMgODg4VDEwNjAgNzgwVDk4MyA2OTdUODkxIDYzN1ExMDAyIDQ1OSAxMDkwIDMxOVExMTI4CisyNTkgMTE2MyAyMDJUMTIyNyAxMDBUMTI3MyAyOEwxMjkwIDBIOTQ2TDYyOSA1NjFINDk0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBnbHlwaC1uYW1lPSJTIiBob3Jpei1hZHYteD0iMTA3MyIgZD0iTTk4NSA0MDZROTg1IDMwOCA5NTIgMjMwVDg1NCA5NlQ2OTYgMTBUNDgxIC0yMFEzNzUgLTIwIDI3NyAyVDk0IDY4VjM1NlExNDIgMzMzIDE5MSAzMTJUMjkwIDI3M1QzOTEgMjQ2VDQ5MiAyMzZRNTQzIDIzNiA1NzkgMjQ3VDYzOCAyNzlUNjcxIDMyOFQ2ODIgMzkxUTY4MiA0MzIgNjY1IDQ2M1Q2MTYgNTIyVDU0MCA1NzZUNDQwCis2MzFRMzk0IDY1NSAzMzcgNjg5VDIzMCA3NzNUMTQ1IDg5NVQxMTEgMTA2N1ExMTEgMTE2NSAxNDMgMTI0MlQyMzYgMTM3M1QzODEgMTQ1NVQ1NzMgMTQ4M1E2MjYgMTQ4MyA2NzYgMTQ3NlQ3NzYgMTQ1NlQ4NzYgMTQyNFQ5NzkgMTM4MEw4NzkgMTEzOVE4MzQgMTE2MCA3OTUgMTE3NlQ3MTkgMTIwM1Q2NDcgMTIxOVQ1NzUgMTIyNVE0OTcgMTIyNSA0NTYgMTE4NFQ0MTQgMTA3M1E0MTQgMTAzNiA0MjYgMTAwOFQ0NjYgOTU0VDUzNworOTAzVDY0MyA4NDRRNzE4IDgwNCA3ODEgNzYzVDg4OSA2NzFUOTYwIDU1NlQ5ODUgNDA2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJUIiBnbHlwaC1uYW1lPSJUIiBob3Jpei1hZHYteD0iMTEyNCIgZD0iTTcxNyAwSDQwOFYxMjA0SDQxVjE0NjJIMTA4M1YxMjA0SDcxN1YwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJVIiBnbHlwaC1uYW1lPSJVIiBob3Jpei1hZHYteD0iMTQ2NiIgZD0iTTEyOTIgMTQ2MlY1MTZRMTI5MiA0MDIgMTI1OCAzMDRUMTE1MyAxMzRUOTc2IDIxVDcyNyAtMjBRNTkyIC0yMCA0ODkgMThUMzE2IDEyOFQyMTAgMjk4VDE3NCA1MjBWMTQ2Mkg0ODNWNTQzUTQ4MyA0NjIgNDk5IDQwNVQ1NDYgMzExVDYyNSAyNTdUNzM1IDI0MFE4NjYgMjQwIDkyNCAzMTZUOTgzIDU0NVYxNDYySDEyOTJaIiAvPgorPGdseXBoIHVuaWNvZGU9IlYiIGdseXBoLW5hbWU9IlYiIGhvcml6LWFkdi14PSIxMjQ5IiBkPSJNOTM2IDE0NjJIMTI0OUw3OTMgMEg0NTVMMCAxNDYySDMxM0w1NjEgNTgyUTU2NiA1NjUgNTc0IDUyNVQ1OTIgNDM3VDYxMSAzNDFUNjI1IDI2MFE2MzAgMjkzIDYzOSAzNDFUNjU4IDQzNlQ2NzcgNTI0VDY5MiA1ODJMOTM2IDE0NjJaIiAvPgorPGdseXBoIHVuaWNvZGU9IlciIGdseXBoLW5hbWU9IlciIGhvcml6LWFkdi14PSIxODk4IiBkPSJNMTU0NiAwSDExOTRMMTAxNCA3MjFRMTAxMCA3MzYgMTAwNSA3NjNUOTkyIDgyNFQ5NzggODk1VDk2NSA5NjdUOTU1IDEwMzFUOTQ4IDEwNzlROTQ2IDEwNjEgOTQyIDEwMzJUOTMxIDk2OFQ5MTkgODk2VDkwNiA4MjVUODkzIDc2M1Q4ODMgNzE5TDcwNSAwSDM1MkwwIDE0NjJIMzA1TDQ3MSA2NjRRNDc0IDY0OCA0NzkgNjE4VDQ5MgorNTQ5VDUwNiA0NjlUNTIxIDM4N1Q1MzQgMzEzVDU0MyAyNTZRNTQ2IDI3OCA1NTEgMzEyVDU2MyAzODRUNTc2IDQ2NFQ1OTAgNTQwVDYwMSA2MDNUNjEwIDY0M0w4MTMgMTQ2MkgxMDg1TDEyODggNjQzUTEyOTEgNjMxIDEyOTYgNjA0VDEzMDggNTQxVDEzMjIgNDY0VDEzMzUgMzg1VDEzNDcgMzEyVDEzNTYgMjU2UTEzNTkgMjc4IDEzNjQgMzEyVDEzNzcgMzg3VDEzOTEgNDY5VDE0MDYgNTQ5VDE0MTggNjE3VDE0MjcgNjY0TDE1OTMKKzE0NjJIMTg5OEwxNTQ2IDBaIiAvPgorPGdseXBoIHVuaWNvZGU9IlgiIGdseXBoLW5hbWU9IlgiIGhvcml6LWFkdi14PSIxMjg0IiBkPSJNMTI4NCAwSDkzMEw2MzEgNTUzTDMzMiAwSDBMNDQ0IDc1NEwzMSAxNDYySDM3M0w2NDcgOTM2TDkxNSAxNDYySDEyNDlMODMxIDczN0wxMjg0IDBaIiAvPgorPGdseXBoIHVuaWNvZGU9IlkiIGdseXBoLW5hbWU9IlkiIGhvcml6LWFkdi14PSIxMTk2IiBkPSJNNTk4IDg2MEw4NjIgMTQ2MkgxMTk2TDc1MiA1NjlWMEg0NDRWNTU5TDAgMTQ2MkgzMzZMNTk4IDg2MFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iWiIgZ2x5cGgtbmFtZT0iWiIgaG9yaXotYWR2LXg9IjExMDQiIGQ9Ik0xMDU1IDBINDlWMjAxTDY2OCAxMjA2SDY4VjE0NjJIMTAzNlYxMjYyTDQxOCAyNTZIMTA1NVYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJbIiBnbHlwaC1uYW1lPSJicmFja2V0bGVmdCIgaG9yaXotYWR2LXg9IjY3OCIgZD0iTTYyNyAtMzI0SDE0M1YxNDYySDYyN1YxMjUxSDQwM1YtMTEzSDYyN1YtMzI0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJcIiBnbHlwaC1uYW1lPSJiYWNrc2xhc2giIGhvcml6LWFkdi14PSI4NDYiIGQ9Ik0yODkgMTQ2Mkw4MzQgMEg1NTdMMTIgMTQ2MkgyODlaIiAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGdseXBoLW5hbWU9ImJyYWNrZXRyaWdodCIgaG9yaXotYWR2LXg9IjY3OCIgZD0iTTUxIC0xMTNIMjc0VjEyNTFINTFWMTQ2Mkg1MzVWLTMyNEg1MVYtMTEzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJeIiBnbHlwaC1uYW1lPSJhc2NpaWNpcmN1bSIgaG9yaXotYWR2LXg9IjEwOTAiIGQ9Ik04IDUyMEw0NDYgMTQ3MEg1OTBMMTA4NSA1MjBIODQ2TDUyNCAxMTYzUTQ1NSAxMDAyIDM4NCA4MzlUMjQ0IDUyMEg4WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJfIiBnbHlwaC1uYW1lPSJ1bmRlcnNjb3JlIiBob3Jpei1hZHYteD0iODQyIiBkPSJNODQ2IC0zMjRILTRWLTE4NEg4NDZWLTMyNFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgZ2x5cGgtbmFtZT0iZ3JhdmUiIGhvcml6LWFkdi14PSIxMTgyIiBkPSJNNjQ1IDEyNDFRNjExIDEyNjkgNTY0IDEzMTBUNDcwIDEzOTZUMzg2IDE0ODBUMzMyIDE1NDhWMTU2OUg2NzRRNjkwIDE1MzUgNzExIDE0OTVUNzU2IDE0MTRUODAzIDEzMzVUODQ4IDEyNjhWMTI0MUg2NDVaIiAvPgorPGdseXBoIHVuaWNvZGU9ImEiIGdseXBoLW5hbWU9ImEiIGhvcml6LWFkdi14PSIxMTc2IiBkPSJNODA5IDBMNzUwIDE1Mkg3NDFRNzA4IDEwNyA2NzUgNzVUNjAzIDIxVDUxNiAtMTBUNDAzIC0yMFEzMzUgLTIwIDI3NyAxVDE3NyA2NlQxMTAgMTc2VDg2IDMzNFE4NiA1MTIgMjAwIDU5NlQ1NDEgNjkwTDcxOSA2OTZWNzgwUTcxOSA4NDkgNjc5IDg4MlQ1NjcgOTE1UTQ5NSA5MTUgNDI3IDg5NFQyODkgODM4TDE5MCAxMDQwUTI3NAorMTA4NyAzNzYgMTExNFQ1OTAgMTE0MVE3OTkgMTE0MSA5MTAgMTA0M1QxMDIyIDc0NVYwSDgwOVpNNzE5IDUxOEw2MTggNTE0UTU1NyA1MTIgNTE1IDQ5OFQ0NDggNDYxVDQxMSA0MDVUMzk5IDMzMlEzOTkgMjYyIDQzMyAyMzNUNTIyIDIwM1E1NjQgMjAzIDYwMCAyMTdUNjYyIDI2MFQ3MDQgMzMwVDcxOSA0MjZWNTE4WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBnbHlwaC1uYW1lPSJiIiBob3Jpei1hZHYteD0iMTI0NSIgZD0iTTc1NiAxMTM5UTg0MiAxMTM5IDkxMyAxMTAyVDEwMzUgOTkyVDExMTQgODExVDExNDMgNTYxUTExNDMgNDE3IDExMTUgMzA5VDEwMzQgMTI3VDkwOSAxN1Q3NDggLTIwUTY5MiAtMjAgNjQ5IC04VDU3MSAyNFQ1MTIgNjlUNDY1IDEyM0g0NDRMMzkzIDBIMTYwVjE1NTZINDY1VjExOTRRNDY1IDExNjEgNDYzIDExMjNUNDU5IDEwNTFRNDU2CisxMDEyIDQ1MyA5NzNINDY1UTQ4NiAxMDA4IDUxMyAxMDM4VDU3NSAxMDkwVDY1NiAxMTI2VDc1NiAxMTM5Wk02NTMgODk1UTYwMiA4OTUgNTY3IDg3N1Q1MDkgODIxVDQ3NyA3MjhUNDY1IDU5NlY1NjNRNDY1IDQ4MiA0NzQgNDE5VDUwNiAzMTRUNTY0IDI0OVQ2NTUgMjI3UTc0NiAyMjcgNzg4IDMxM1Q4MzEgNTY1UTgzMSA3MzAgNzg5IDgxMlQ2NTMgODk1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJjIiBnbHlwaC1uYW1lPSJjIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTYyNSAtMjBRNTA1IC0yMCA0MDkgMTNUMjQ0IDExNVQxMzkgMjkzVDEwMiA1NTNRMTAyIDcyMCAxMzkgODMyVDI0NSAxMDEzVDQxMCAxMTEwVDYyNSAxMTM5UTcxMSAxMTM5IDc5NiAxMTE4VDk1NiAxMDU5TDg2OCA4MjdRODAyIDg1NiA3NDEgODc0VDYyNSA4OTNRNTE0IDg5MyA0NjQgODA5VDQxNCA1NTVRNDE0IDM4NyA0NjQKKzMwN1Q2MjEgMjI3UTcwOCAyMjcgNzc5IDI0OVQ5MjQgMzA3VjUzUTg4NyAzNSA4NTIgMjFUNzgyIC0yVDcwOCAtMTVUNjI1IC0yMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iZCIgZ2x5cGgtbmFtZT0iZCIgaG9yaXotYWR2LXg9IjEyNDUiIGQ9Ik00ODkgLTIwUTQwMyAtMjAgMzMyIDE3VDIxMCAxMjZUMTMxIDMwN1QxMDIgNTU3UTEwMiA3MDEgMTMwIDgwOVQyMTEgOTkxVDMzNyAxMTAyVDQ5OCAxMTM5UTU1MiAxMTM5IDU5NyAxMTI3VDY3OCAxMDkyVDc0MiAxMDQwVDc5MyA5NzVIODAzUTc5NyAxMDE0IDc5MiAxMDU0UTc4NyAxMDg4IDc4NCAxMTI2VDc4MCAxMTk4VjE1NTZIMTA4NVYwSDg1Mkw3OTMKKzE0NUg3ODBRNzU5IDExMSA3MzIgODFUNjcwIDI4VDU5MCAtN1Q0ODkgLTIwWk02MDAgMjIzUTY1NCAyMjMgNjkyIDI0MVQ3NTMgMjk3VDc4OCAzOTFUODAxIDUyMlY1NTVRODAxIDYzNiA3OTEgNjk5VDc1OCA4MDRUNjk2IDg2OVQ1OTggODkxUTUwMiA4OTEgNDU3IDgwNVQ0MTIgNTUzUTQxMiAzODggNDU3IDMwNlQ2MDAgMjIzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJlIiBnbHlwaC1uYW1lPSJlIiBob3Jpei1hZHYteD0iMTE5MCIgZD0iTTYxMiA5MjJRNTMxIDkyMiA0NzggODY1VDQxNiA2ODZIODA1UTgwNCA3MzcgNzkyIDc4MFQ3NTYgODU0VDY5NiA5MDRUNjEyIDkyMlpNNjUxIC0yMFE1MzEgLTIwIDQzMCAxNVQyNTYgMTIwVDE0MyAyOThUMTAyIDU1MVExMDIgNjk4IDEzOSA4MDhUMjQyIDk5MVQ0MDIgMTEwMlQ2MTAgMTEzOVE3MjEgMTEzOSA4MTAgMTEwNlQ5NjIKKzEwMDdUMTA1OCA4NDhUMTA5MiA2MzFWNDgzSDQxMFE0MTIgNDE5IDQzMCAzNjhUNDgyIDI4MVQ1NjMgMjI2VDY3MiAyMDdRNzIzIDIwNyA3NjggMjEyVDg1NyAyMjlUOTQyIDI1NlQxMDI4IDI5NVY1OVE5ODggMzggOTQ4IDI0VDg2MiAtMVQ3NjUgLTE1VDY1MSAtMjBaIiAvPgorPGdseXBoIHVuaWNvZGU9ImYiIGdseXBoLW5hbWU9ImYiIGhvcml6LWFkdi14PSI3OTMiIGQ9Ik03NDEgODg5SDUxNFYwSDIwOVY4ODlINDFWMTAzNkwyMDkgMTExOFYxMjAwUTIwOSAxMzA3IDIzNSAxMzc3VDMwOSAxNDkwVDQyNSAxNTQ5VDU3OCAxNTY3UTY3MCAxNTY3IDczMyAxNTUzVDg0MCAxNTIwTDc2OCAxMjk2UTczNyAxMzA3IDcwMyAxMzE2VDYyMyAxMzI1UTU2MyAxMzI1IDUzOSAxMjg3VDUxNCAxMTg4VjExMThINzQxVjg4OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iZyIgZ2x5cGgtbmFtZT0iZyIgaG9yaXotYWR2LXg9IjExMzAiIGQ9Ik0xMDg1IDExMTZWOTUwTDkyMiA4OTlROTQyIDg2NSA5NTAgODI5VDk1OCA3NTBROTU4IDY2NSA5MzEgNTk1VDg1MSA0NzRUNzE4IDM5N1Q1MzIgMzY5UTUwOSAzNjkgNDgyIDM3MVQ0NDIgMzc3UTQyMiAzNjAgNDExIDM0MlQzOTkgMjk3UTM5OSAyNzYgNDEyIDI2NFQ0NDYgMjQ0VDQ5NSAyMzRUNTUzIDIzMUg3MjdRODA4IDIzMQorODcyIDIxM1Q5ODAgMTU2VDEwNDkgNjBUMTA3MyAtODBRMTA3MyAtMTc1IDEwMzUgLTI1MVQ5MjIgLTM4MVQ3MzQgLTQ2M1Q0NzUgLTQ5MlEzNjEgLTQ5MiAyNzYgLTQ3MVQxMzQgLTQwOVQ0OSAtMzExVDIwIC0xODJRMjAgLTEyMSA0MSAtNzZUOTcgMVQxNzYgNTNUMjY4IDg0UTI0NyA5MyAyMjcgMTA5VDE5MCAxNDZUMTYzIDE5MlQxNTIgMjQ2UTE1MiAyNzggMTYxIDMwNFQxODkgMzUyVDIzNCAzOTVUMjk1IDQzNlEyMDcgNDc0CisxNTYgNTU4VDEwNCA3NTZRMTA0IDg0NiAxMzIgOTE3VDIxNCAxMDM3VDM0OCAxMTEzVDUzMiAxMTM5UTU1MiAxMTM5IDU3NyAxMTM3VDYyNiAxMTMxVDY3MiAxMTIzVDcwNSAxMTE2SDEwODVaTTI4NSAtMTU4UTI4NSAtMTgzIDI5NSAtMjA2VDMzMCAtMjQ4VDM5MyAtMjc2VDQ4OSAtMjg3UTY0NSAtMjg3IDcyNCAtMjQzVDgwMyAtMTI1UTgwMyAtNjIgNzU0IC00MVQ2MDIgLTIwSDQ2MVE0MzQgLTIwIDQwMyAtMjZUMzQ2IC00OVQzMDMKKy05MVQyODUgLTE1OFpNMzk1IDc1MlEzOTUgNjYxIDQyOSA2MTFUNTMyIDU2MVE2MDQgNTYxIDYzNiA2MTFUNjY4IDc1MlE2NjggODQyIDYzNyA4OTVUNTMyIDk0OFEzOTUgOTQ4IDM5NSA3NTJaIiAvPgorPGdseXBoIHVuaWNvZGU9ImgiIGdseXBoLW5hbWU9ImgiIGhvcml6LWFkdi14PSIxMjg0IiBkPSJNMTEzMCAwSDgyNVY2NTNRODI1IDc3NCA3ODggODM0VDY3MiA4OTVRNjEzIDg5NSA1NzMgODcxVDUwOSA4MDBUNDc1IDY4NFQ0NjUgNTI2VjBIMTYwVjE1NTZINDY1VjEyMzlRNDY1IDExOTcgNDYzIDExNTFUNDU4IDEwNjVRNDU0IDEwMTkgNDUxIDk3NUg0NjdRNTE2IDEwNjIgNTkyIDExMDBUNzY0IDExMzlRODQ3IDExMzkgOTE0CisxMTE2VDEwMzAgMTA0MlQxMTA0IDkxNVQxMTMwIDcyOVYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJpIiBnbHlwaC1uYW1lPSJpIiBob3Jpei1hZHYteD0iNjI1IiBkPSJNMTQ3IDE0MDdRMTQ3IDE0NTAgMTYwIDE0NzhUMTk1IDE1MjRUMjQ4IDE1NDlUMzEzIDE1NTZRMzQ3IDE1NTYgMzc3IDE1NDlUNDI5IDE1MjVUNDY1IDE0NzlUNDc5IDE0MDdRNDc5IDEzNjUgNDY2IDEzMzZUNDMwIDEyOTBUMzc3IDEyNjVUMzEzIDEyNTdRMjc5IDEyNTcgMjQ5IDEyNjRUMTk2IDEyODlUMTYwIDEzMzZUMTQ3IDE0MDdaTTQ2NQorMEgxNjBWMTExOEg0NjVWMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iaiIgZ2x5cGgtbmFtZT0iaiIgaG9yaXotYWR2LXg9IjYyNSIgZD0iTTEwMiAtNDkyUTU0IC00OTIgMyAtNDg1VC04MiAtNDY3Vi0yMjdRLTUxIC0yMzcgLTI0IC0yNDFUMzcgLTI0NlE2MiAtMjQ2IDg0IC0yMzlUMTIzIC0yMTJUMTUwIC0xNjBUMTYwIC03NlYxMTE4SDQ2NVYtMTIxUTQ2NSAtMTk4IDQ0NiAtMjY1VDM4MyAtMzgzVDI3MCAtNDYzVDEwMiAtNDkyWk0xNDcgMTQwN1ExNDcgMTQ1MCAxNjAKKzE0NzhUMTk1IDE1MjRUMjQ4IDE1NDlUMzEzIDE1NTZRMzQ3IDE1NTYgMzc3IDE1NDlUNDI5IDE1MjVUNDY1IDE0NzlUNDc5IDE0MDdRNDc5IDEzNjUgNDY2IDEzMzZUNDMwIDEyOTBUMzc3IDEyNjVUMzEzIDEyNTdRMjc5IDEyNTcgMjQ5IDEyNjRUMTk2IDEyODlUMTYwIDEzMzZUMTQ3IDE0MDdaIiAvPgorPGdseXBoIHVuaWNvZGU9ImsiIGdseXBoLW5hbWU9ImsiIGhvcml6LWFkdi14PSIxMjA4IiBkPSJNNDUzIDYwOEw1NjUgNzc4TDgzOCAxMTE4SDExODJMNzc4IDYzM0wxMjA4IDBIODU2TDU4NCA0MzBMNDY1IDM0OFYwSDE2MFYxNTU2SDQ2NVY4NjJMNDQ5IDYwOEg0NTNaIiAvPgorPGdseXBoIHVuaWNvZGU9ImwiIGdseXBoLW5hbWU9ImwiIGhvcml6LWFkdi14PSI2MjUiIGQ9Ik00NjUgMEgxNjBWMTU1Nkg0NjVWMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgZ2x5cGgtbmFtZT0ibSIgaG9yaXotYWR2LXg9IjE5MjkiIGQ9Ik0xMTIwIDBIODE1VjY1M1E4MTUgNzc0IDc3OSA4MzRUNjY2IDg5NVE2MDggODk1IDU3MCA4NzFUNTA4IDgwMFQ0NzUgNjg0VDQ2NSA1MjZWMEgxNjBWMTExOEgzOTNMNDM0IDk3NUg0NTFRNDc1IDEwMTggNTA4IDEwNDlUNTgyIDExMDBUNjY3IDExMjlUNzU4IDExMzlRODczIDExMzkgOTUzIDExMDBUMTA3NyA5NzVIMTEwMlExMTI2CisxMDE4IDExNjAgMTA0OVQxMjM1IDExMDBUMTMyMSAxMTI5VDE0MTMgMTEzOVExNTkzIDExMzkgMTY4NCAxMDQyVDE3NzYgNzI5VjBIMTQ3MFY2NTNRMTQ3MCA3NzQgMTQzNCA4MzRUMTMyMSA4OTVRMTIxMiA4OTUgMTE2NiA4MDlUMTEyMCA1NjFWMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgZ2x5cGgtbmFtZT0ibiIgaG9yaXotYWR2LXg9IjEyODQiIGQ9Ik0xMTMwIDBIODI1VjY1M1E4MjUgNzc0IDc4OSA4MzRUNjcyIDg5NVE2MTIgODk1IDU3MiA4NzFUNTA5IDgwMFQ0NzUgNjg0VDQ2NSA1MjZWMEgxNjBWMTExOEgzOTNMNDM0IDk3NUg0NTFRNDc1IDEwMTggNTA5IDEwNDlUNTg1IDExMDBUNjcyIDExMjlUNzY2IDExMzlRODQ4IDExMzkgOTE1IDExMTZUMTAzMCAxMDQyVDExMDQKKzkxNVQxMTMwIDcyOVYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJvIiBnbHlwaC1uYW1lPSJvIiBob3Jpei1hZHYteD0iMTIyNyIgZD0iTTQxNCA1NjFRNDE0IDM5NCA0NjEgMzEwVDYxNCAyMjVRNzE5IDIyNSA3NjYgMzEwVDgxMyA1NjFRODEzIDcyOCA3NjYgODEwVDYxMiA4OTNRNTA3IDg5MyA0NjEgODExVDQxNCA1NjFaTTExMjQgNTYxUTExMjQgNDIxIDEwODkgMzEzVDk4NyAxMzFUODI1IDE5VDYxMCAtMjBRNDk5IC0yMCA0MDYgMThUMjQ2IDEzMVQxNDAgMzEzVDEwMgorNTYxUTEwMiA3MDAgMTM3IDgwOFQyMzkgOTg5VDQwMSAxMTAxVDYxNiAxMTM5UTcyNyAxMTM5IDgyMCAxMTAxVDk4MCA5OTBUMTA4NiA4MDhUMTEyNCA1NjFaIiAvPgorPGdseXBoIHVuaWNvZGU9InAiIGdseXBoLW5hbWU9InAiIGhvcml6LWFkdi14PSIxMjQ1IiBkPSJNNzQ4IC0yMFE2OTMgLTIwIDY1MCAtOFQ1NzIgMjRUNTEyIDY5VDQ2NSAxMjNINDQ5UTQ1MyA4OCA0NTcgNTdRNDYwIDMxIDQ2MiA0VDQ2NSAtMzlWLTQ5MkgxNjBWMTExOEg0MDhMNDUxIDk3M0g0NjVRNDg2IDEwMDcgNTEzIDEwMzdUNTc1IDEwODlUNjU2IDExMjVUNzU2IDExMzlRODQzIDExMzkgOTE0IDExMDJUMTAzNiA5OTJUMTExNQorODExVDExNDMgNTYxUTExNDMgNDE4IDExMTQgMzEwVDEwMzMgMTI4VDkwOCAxN1Q3NDggLTIwWk02NTMgODk1UTYwMiA4OTUgNTY3IDg3N1Q1MDkgODIxVDQ3NyA3MjhUNDY1IDU5NlY1NjNRNDY1IDQ4MiA0NzQgNDE5VDUwNiAzMTRUNTY0IDI0OVQ2NTUgMjI3UTc0NiAyMjcgNzg4IDMxM1Q4MzEgNTY1UTgzMSA3MzAgNzg5IDgxMlQ2NTMgODk1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJxIiBnbHlwaC1uYW1lPSJxIiBob3Jpei1hZHYteD0iMTI0NSIgZD0iTTYwMiAyMTlRNjU3IDIxOSA2OTQgMjM3VDc1NSAyOTNUNzg5IDM4NlQ4MDEgNTE4VjU1NVE4MDEgNjM2IDc5MiA2OTlUNzU5IDgwNFQ2OTcgODY5VDYwMCA4OTFRNTA0IDg5MSA0NTkgODA1VDQxNCA1NTNRNDE0IDM4NSA0NTkgMzAyVDYwMiAyMTlaTTQ4OSAtMjBRNDAyIC0yMCAzMzEgMTdUMjA5IDEyNlQxMzAgMzA3VDEwMgorNTU3UTEwMiA3MDAgMTMwIDgwOFQyMTEgOTkwVDMzNyAxMTAxVDQ5OCAxMTM5UTU1NCAxMTM5IDU5OSAxMTI3VDY4MCAxMDkyVDc0NSAxMDQwVDc5NSA5NzVIODAzTDgyNyAxMTE4SDEwODVWLTQ5Mkg3ODBWLTIzUTc4MCAtNCA3ODIgMjRUNzg3IDgwUTc5MCAxMTIgNzkzIDE0NUg3ODBRNzYwIDExMSA3MzMgODFUNjcxIDI4VDU5MCAtN1Q0ODkgLTIwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJyIiBnbHlwaC1uYW1lPSJyIiBob3Jpei1hZHYteD0iODg5IiBkPSJNNzQzIDExMzlRNzU1IDExMzkgNzY5IDExMzlUNzk3IDExMzdUODIyIDExMzRUODQwIDExMzBWODQ0UTgzMiA4NDYgODE4IDg0OFQ3ODkgODUxVDc1OCA4NTNUNzMzIDg1NFE2NzQgODU0IDYyNSA4MzlUNTQwIDc5MVQ0ODUgNzAzVDQ2NSA1NjlWMEgxNjBWMTExOEgzOTFMNDM2IDk1MEg0NTFRNDc1IDk5MyA1MDMgMTAyOFQ1NjUKKzEwODdUNjQzIDExMjVUNzQzIDExMzlaIiAvPgorPGdseXBoIHVuaWNvZGU9InMiIGdseXBoLW5hbWU9InMiIGhvcml6LWFkdi14PSI5ODUiIGQ9Ik05MDUgMzMyUTkwNSAyNDQgODczIDE3OFQ3ODIgNjhUNjM5IDJUNDUxIC0yMFEzOTYgLTIwIDM0OSAtMTdUMjYwIC01VDE3OSAxNVQxMDAgNDVWMjk3UTE0MiAyNzYgMTg4IDI1OVQyODEgMjMwVDM3MCAyMTBUNDUxIDIwM1E0OTIgMjAzIDUyMSAyMTBUNTY4IDIzMVQ1OTUgMjYzVDYwNCAzMDNRNjA0IDMyNCA1OTggMzQwVDU2OAorMzc1VDUwMSA0MTdUMzgxIDQ3NVEzMDggNTA4IDI1NSA1NDBUMTY3IDYxM1QxMTUgNzA0VDk4IDgyN1E5OCA5MDUgMTI4IDk2M1QyMTMgMTA2MVQzNDUgMTExOVQ1MTggMTEzOVE2MTggMTEzOSA3MDggMTExNlQ4OTMgMTA0N0w4MDEgODMxUTcyNSA4NjcgNjU2IDg5MFQ1MTggOTEzUTQ1NiA5MTMgNDI5IDg5MVQ0MDEgODMxUTQwMSA4MTEgNDA4IDc5NlQ0MzYgNzY0VDQ5NSA3MjhUNTk0IDY4MFE2NjUgNjQ5IDcyMiA2MTlUODIwCis1NDlUODgzIDQ1OFQ5MDUgMzMyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ0IiBnbHlwaC1uYW1lPSJ0IiBob3Jpei1hZHYteD0iODQ4IiBkPSJNNjE0IDIyM1E2NTkgMjIzIDY5OSAyMzNUNzgyIDI1OFYzMVE3MzkgOSA2NzYgLTVUNTM3IC0yMFE0NjQgLTIwIDQwMSAtM1QyOTIgNTZUMjIwIDE3MFQxOTMgMzUwVjg4OUg0N1YxMDE4TDIxNSAxMTIwTDMwMyAxMzU2SDQ5OFYxMTE4SDc3MFY4ODlINDk4VjM1MFE0OTggMjg1IDUzMCAyNTRUNjE0IDIyM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0idSIgZ2x5cGgtbmFtZT0idSIgaG9yaXotYWR2LXg9IjEyODQiIGQ9Ik04OTEgMEw4NTAgMTQzSDgzNFE4MDkgMTAwIDc3NSA3MFQ2OTkgMTlUNjEyIC0xMFQ1MTggLTIwUTQzNiAtMjAgMzY5IDNUMjU0IDc3VDE4MCAyMDRUMTU0IDM4OVYxMTE4SDQ1OVY0NjVRNDU5IDM0NCA0OTUgMjg0VDYxMiAyMjNRNjcyIDIyMyA3MTIgMjQ3VDc3NSAzMThUODA5IDQzNFQ4MTkgNTkyVjExMThIMTEyNFYwSDg5MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0idiIgZ2x5cGgtbmFtZT0idiIgaG9yaXotYWR2LXg9IjExMDQiIGQ9Ik0zOTUgMEwwIDExMThIMzE5TDUwNCA0ODFRNTIxIDQyNCA1MzMgMzYzVDU0OSAyNTJINTU1UTU1OCAzMDUgNTcwIDM2NFQ2MDAgNDgxTDc4NCAxMTE4SDExMDRMNzA5IDBIMzk1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ3IiBnbHlwaC1uYW1lPSJ3IiBob3Jpei1hZHYteD0iMTY1MSIgZD0iTTEwMTQgMEw5MjggMzkxUTkyNCA0MDggOTE4IDQzOVQ5MDMgNTEwVDg4NyA1OTRUODY5IDY4M1E4NDkgNzg2IDgyNSA5MDVIODE5UTc5NiA3ODYgNzc3IDY4MlE3NjkgNjM4IDc2MSA1OTNUNzQ0IDUwOVQ3MzAgNDM3VDcxOSAzODdMNjI5IDBIMzAxTDAgMTExOEgzMDNMNDE2IDYyM1E0MjUgNTg0IDQzNCA1MzBUNDUyIDQyMFQ0NjgKKzMxNVQ0NzkgMjM2SDQ4NVE0ODYgMjU1IDQ4OSAyODVUNDk4IDM1MVQ1MDggNDIyVDUxOSA0OTFUNTI5IDU0N1Q1MzcgNTgyTDY1OSAxMTE4SDk5NUwxMTEyIDU4MlExMTE3IDU2MCAxMTI1IDUxNFQxMTQxIDQxNlQxMTU2IDMxNFQxMTYzIDIzNkgxMTY5UTExNzIgMjYxIDExNzkgMzEwVDExOTYgNDE1VDEyMTUgNTI4VDEyMzUgNjIzTDEzNTIgMTExOEgxNjUxTDEzNDYgMEgxMDE0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ4IiBnbHlwaC1uYW1lPSJ4IiBob3Jpei1hZHYteD0iMTEyMiIgZD0iTTM4OSA1NzFMMjkgMTExOEgzNzVMNTYxIDc4Mkw3NTAgMTExOEgxMDk2TDczMSA1NzFMMTExMiAwSDc2Nkw1NjEgMzYyTDM1NiAwSDEwTDM4OSA1NzFaIiAvPgorPGdseXBoIHVuaWNvZGU9InkiIGdseXBoLW5hbWU9InkiIGhvcml6LWFkdi14PSIxMTA0IiBkPSJNMCAxMTE4SDMzNEw1MTQgNDg5UTUzMCA0MzcgNTM3IDM3OFQ1NDcgMjcySDU1M1E1NTUgMjk1IDU1OCAzMjNUNTY3IDM4MFQ1NzggNDM3VDU5MiA0ODlMNzY4IDExMThIMTEwNEw2NjIgLTE0M1E2MDAgLTMyMCA0OTMgLTQwNlQyMjUgLTQ5MlExNzMgLTQ5MiAxMzUgLTQ4N1Q3MCAtNDc1Vi0yMzNROTEgLTIzOCAxMjMgLTI0MlQxOTAKKy0yNDZRMjM4IC0yNDYgMjcyIC0yMzNUMzMwIC0xOTdUMzcyIC0xNDBUNDAzIC02Nkw0MjIgLTEwTDAgMTExOFoiIC8+Cis8Z2x5cGggdW5pY29kZT0ieiIgZ2x5cGgtbmFtZT0ieiIgaG9yaXotYWR2LXg9IjkzNiIgZD0iTTg3NyAwSDU1VjE4MEw1MTIgODg1SDg2VjExMThIODU4VjkyMEw0MTYgMjMzSDg3N1YwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ7IiBnbHlwaC1uYW1lPSJicmFjZWxlZnQiIGhvcml6LWFkdi14PSI3NDUiIGQ9Ik0yODcgMzY3VDIyMiA0MDhUMzEgNDQ5VjY4OFE5MyA2ODggMTQxIDY5N1QyMjMgNzI4VDI3MiA3ODRUMjg3IDg2NlYxMTg0UTI4NyAxMjU4IDMwNiAxMzEwVDM3NCAxMzk2VDUwOSAxNDQ2VDcyNSAxNDYyVjEyMzdRNjg1IDEyMzYgNjUzIDEyMzBUNTk4IDEyMDlUNTYzIDExNjZUNTUxIDEwOTZWNzk3UTU0NSA2MTAKKzMxNyA1NzVWNTYzUTQzMiA1NDYgNDkzIDQ5MVQ1NTEgMzQyVjQzUTU1MSAwIDU2MyAtMjdUNTk3IC02OVQ2NTIgLTkxVDcyNSAtOThWLTMyNFE1OTQgLTMyNCA1MDkgLTMwOFQzNzUgLTI1OVQzMDYgLTE3MlQyODcgLTQ1VjI3MFEyODcgMzY3IDIyMiA0MDhaIiAvPgorPGdseXBoIHVuaWNvZGU9InwiIGdseXBoLW5hbWU9ImJhciIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik00NTUgMTU1MEg2NzRWLTQ2NUg0NTVWMTU1MFoiIC8+Cis8Z2x5cGggdW5pY29kZT0ifSIgZ2x5cGgtbmFtZT0iYnJhY2VyaWdodCIgaG9yaXotYWR2LXg9Ijc0NSIgZD0iTTQ2OSAtNDVRNDY5IC0xMTkgNDUwIC0xNzJUMzgyIC0yNThUMjQ3IC0zMDhUMzEgLTMyNFYtOThRNzEgLTk3IDEwMyAtOTFUMTU3IC03MFQxOTIgLTI3VDIwNSA0M1YzNDJRMjAyIDQzNiAyNjMgNDkxVDQzOCA1NjNWNTc1UTIxMSA2MTAgMjA1IDc5N1YxMDk2UTIwNSAxMTM5IDE5MyAxMTY2VDE1OCAxMjA4VDEwMworMTIzMFQzMSAxMjM3VjE0NjJRMTYyIDE0NjIgMjQ3IDE0NDZUMzgxIDEzOTdUNDUwIDEzMTFUNDY5IDExODRWODY2UTQ2OCA4MTggNDg0IDc4NFQ1MzMgNzI5VDYxNCA2OThUNzI1IDY4OFY0NDlRNjAwIDQ0OSA1MzUgNDA4VDQ2OSAyNzBWLTQ1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBnbHlwaC1uYW1lPSJhc2NpaXRpbGRlIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTUyOCA2MTZRNDkxIDYzMiA0NjMgNjQzVDQxMSA2NjBUMzY2IDY2OVQzMjIgNjcyUTI5MyA2NzIgMjYyIDY2M1QyMDEgNjM3VDE0MyA1OThUODggNTUxVjc4MlExMzkgODM2IDIwMiA4NjNUMzQ0IDg5MVEzNzQgODkxIDM5OSA4ODlUNDUzIDg3OVQ1MTcgODYwVDYwMCA4MjdRNjM4IDgxMSA2NjYgODAxVDcxOQorNzg0VDc2NCA3NzVUODA3IDc3MlE4MzYgNzcyIDg2NyA3ODFUOTI4IDgwN1Q5ODYgODQ1VDEwNDAgODkzVjY2MlE5MzkgNTUzIDc4NCA1NTNRNzU0IDU1MyA3MjkgNTU1VDY3NSA1NjRUNjExIDU4M1Q1MjggNjE2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhMDsiIGdseXBoLW5hbWU9Im5ic3BhY2UiIGhvcml6LWFkdi14PSI1MzIiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTE7IiBnbHlwaC1uYW1lPSJleGNsYW1kb3duIiBob3Jpei1hZHYteD0iNTg2IiBkPSJNMTY4IDYwNkg0MTJMNDYzIC0zNjlIMTE3TDE2OCA2MDZaTTQ2NyA5NDhRNDY3IDkwMSA0NTQgODY5VDQxNiA4MTZUMzYwIDc4N1QyOTEgNzc4UTI1NiA3NzggMjI1IDc4N1QxNjkgODE2VDEzMSA4NjhUMTE3IDk0OFExMTcgOTkzIDEzMSAxMDI1VDE2OSAxMDc4VDIyNCAxMTA4VDI5MSAxMTE4UTMyOCAxMTE4CiszNjAgMTEwOVQ0MTYgMTA3OVQ0NTMgMTAyNlQ0NjcgOTQ4WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhMjsiIGdseXBoLW5hbWU9ImNlbnQiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNTQzIC0yMFYxODZRNDUxIDE5OSAzNzcgMjM2VDI1MSAzNDBUMTcxIDUwNlQxNDMgNzQzUTE0MyA4ODQgMTcxIDk4NVQyNTEgMTE1NVQzNzggMTI2MFQ1NDMgMTMxMVYxNDgzSDcyMVYxMzE5UTc1OSAxMzE4IDc5NyAxMzEzVDg3MCAxMjk5VDkzNyAxMjgxVDk5MyAxMjYwTDkwNyAxMDM0UTg4NiAxMDQ0IDg2MAorMTA1M1Q4MDUgMTA3MFQ3NTAgMTA4MlQ2OTggMTA4N1E2MzIgMTA4NyA1ODYgMTA2N1Q1MTEgMTAwNlQ0NjggOTAxVDQ1NSA3NTBRNDU1IDU3OSA1MTIgNTAwVDY5OCA0MjBRNzc0IDQyMCA4NDQgNDM4VDk2NSA0ODFWMjQyUTkxNCAyMTMgODUyIDE5OFQ3MjEgMTgwVi0yMEg1NDNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGEzOyIgZ2x5cGgtbmFtZT0ic3RlcmxpbmciIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNjgwIDE0ODNRNzkwIDE0ODMgODc5IDE0NTlUMTA0OSAxNDAxTDk1NiAxMTcxUTg4NSAxMjAwIDgyNyAxMjE3VDcwNSAxMjM1UTYzOCAxMjM1IDYwMSAxMTk3VDU2MyAxMDYzVjg3MEg4OTdWNjUxSDU2M1Y1MDhRNTYzIDQ1MyA1NTAgNDEzVDUxNCAzNDNUNDY2IDI5NFQ0MTIgMjYwSDEwOTBWMEg4MlYyNDhRMTI0CisyNjYgMTU3IDI4N1QyMTQgMzM3VDI1MCA0MDdUMjYyIDUwNlY2NTFIODRWODcwSDI2MlYxMDY1UTI2MiAxMTc4IDI5MyAxMjU3VDM4MCAxMzg3VDUxMiAxNDYwVDY4MCAxNDgzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhNDsiIGdseXBoLW5hbWU9ImN1cnJlbmN5IiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTE2OCA3MjNRMTY4IDc3NyAxODIgODI2VDIyMSA5MjBMOTIgMTA0N0wyNDAgMTE5NEwzNjcgMTA2N1E0MTAgMTA5MiA0NjEgMTEwNlQ1NjMgMTEyMFE2MTcgMTEyMCA2NjUgMTEwN1Q3NjAgMTA2NUw4ODcgMTE5NEwxMDM2IDEwNTFMOTA3IDkyMlE5MzIgODgwIDk0NiA4MjlUOTYxIDcyM1E5NjEgNjY3IDk0NworNjE4VDkwNyA1MjRMMTAzMiAzOTlMODg3IDI1NEw3NjAgMzc5UTcxNiAzNTYgNjY3IDM0MlQ1NjMgMzI4UTUwNyAzMjggNDU4IDM0MFQzNjUgMzc5TDI0MCAyNTZMOTQgNDAxTDIyMSA1MjZRMTY4IDYxNyAxNjggNzIzWk0zNzUgNzIzUTM3NSA2ODQgMzkwIDY1MFQ0MzAgNTkwVDQ5MCA1NTBUNTYzIDUzNVE2MDMgNTM1IDYzOCA1NDlUNjk5IDU4OVQ3NDEgNjQ5VDc1NiA3MjNRNzU2IDc2MyA3NDEgNzk3VDcwMCA4NTdUNjM4Cis4OThUNTYzIDkxM1E1MjQgOTEzIDQ5MCA4OThUNDMxIDg1OFQzOTAgNzk4VDM3NSA3MjNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGE1OyIgZ2x5cGgtbmFtZT0ieWVuIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTU2NSA4NjBMODA5IDE0NjJIMTEyMkw3NjAgNzE1SDk1NFY1MzdINzA5VjM5OUg5NTRWMjIxSDcwOVYwSDQyMlYyMjFIMTc0VjM5OUg0MjJWNTM3SDE3NFY3MTVIMzY1TDggMTQ2MkgzMjRMNTY1IDg2MFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTY7IiBnbHlwaC1uYW1lPSJicm9rZW5iYXIiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNDU1IDE1NTBINjc0VjczNUg0NTVWMTU1MFpNNDU1IDM1MEg2NzRWLTQ2NUg0NTVWMzUwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhNzsiIGdseXBoLW5hbWU9InNlY3Rpb24iIGhvcml6LWFkdi14PSI5OTUiIGQ9Ik0xMjEgODA1UTEyMSA4NDkgMTMxIDg4NlQxNjAgOTU1VDIwMyAxMDEyVDI1NCAxMDU1UTE5MSAxMDk1IDE1NiAxMTU0VDEyMSAxMjg4UTEyMSAxMzUzIDE1MCAxNDA2VDIzMiAxNDk4VDM2MCAxNTU2VDUyNiAxNTc3UTYyOCAxNTc3IDcxNiAxNTU0VDg4OSAxNDkzTDgwNyAxMzAzUTczOSAxMzM1IDY2OSAxMzYwVDUyMAorMTM4NlE0MzkgMTM4NiA0MDIgMTM2M1QzNjUgMTI5MlEzNjUgMTI2NyAzNzcgMTI0NlQ0MTUgMTIwNlQ0ODEgMTE2N1Q1NzggMTEyNFE2NDkgMTA5NiA3MDcgMTA2MlQ4MDcgOTg3VDg3MiA4OTVUODk1IDc4MlE4OTUgNjgyIDg2MSA2MjFUNzcwIDUyMlE4MzIgNDgyIDg2MyA0MzBUODk1IDMwM1E4OTUgMjI5IDg2NCAxNzBUNzc2IDY4VDYzOCAzVDQ1NSAtMjBRMzQ1IC0yMCAyNjEgMFQxMDYgNTlWMjY2UTE0NSAyNDYgMTkwCisyMjlUMjgxIDE5OFQzNzEgMTc2VDQ1NSAxNjhRNTExIDE2OCA1NDggMTc3VDYwNyAyMDJUNjM5IDIzOVQ2NDkgMjg1UTY0OSAzMTAgNjQyIDMyOVQ2MTIgMzY4VDU0OSA0MDhUNDQyIDQ1N1EzNjYgNDg5IDMwNiA1MjFUMjA1IDU5M1QxNDMgNjg1VDEyMSA4MDVaTTM0NCA4MjdRMzQ0IDc2NCA0MDAgNzE2VDU3NSA2MTZMNTkwIDYxMFE2MDUgNjIxIDYxOSA2MzVUNjQ0IDY2OFQ2NjEgNzA4VDY2OCA3NTZRNjY4IDc4OCA2NTgKKzgxNVQ2MjEgODY3VDU1MCA5MTdUNDM0IDk2N1E0MTYgOTYwIDQwMCA5NDdUMzcyIDkxNVQzNTIgODc1VDM0NCA4MjdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGE4OyIgZ2x5cGgtbmFtZT0iZGllcmVzaXMiIGhvcml6LWFkdi14PSIxMTgyIiBkPSJNMjQ4IDE0MDVRMjQ4IDE0NDAgMjU5IDE0NjVUMjg4IDE1MDdUMzMyIDE1MzJUMzg3IDE1NDBRNDE2IDE1NDAgNDQxIDE1MzJUNDg2IDE1MDhUNTE2IDE0NjZUNTI4IDE0MDVRNTI4IDEzNzEgNTE3IDEzNDZUNDg2IDEzMDVUNDQyIDEyODBUMzg3IDEyNzJRMzU4IDEyNzIgMzMzIDEyODBUMjg5IDEzMDRUMjU5CisxMzQ2VDI0OCAxNDA1Wk02NTEgMTQwNVE2NTEgMTQ0MCA2NjIgMTQ2NVQ2OTIgMTUwN1Q3MzcgMTUzMlQ3OTMgMTU0MFE4MjEgMTU0MCA4NDYgMTUzMlQ4OTEgMTUwOFQ5MjIgMTQ2NlQ5MzQgMTQwNVE5MzQgMTM3MSA5MjMgMTM0NlQ4OTIgMTMwNVQ4NDcgMTI4MFQ3OTMgMTI3MlE3MzMgMTI3MiA2OTIgMTMwNVQ2NTEgMTQwNVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTk7IiBnbHlwaC1uYW1lPSJjb3B5cmlnaHQiIGhvcml6LWFkdi14PSIxNzA0IiBkPSJNODk1IDEwMTBRNzk4IDEwMTAgNzQ1IDkzNlQ2OTIgNzMxUTY5MiA1OTYgNzQwIDUyNFQ4OTUgNDUxUTk1MiA0NTEgMTAxOCA0NjZUMTE0MSA1MTBWMzE5UTEwODQgMjkyIDEwMjUgMjc3VDg4OSAyNjJRNzgyIDI2MiA3MDIgMjk2VDU2OSAzOTJUNDg4IDU0MFQ0NjEgNzMzUTQ2MSA4MzYgNDg3IDkyMVQ1NjUKKzEwNjhUNjk3IDExNjRUODgxIDExOThROTY0IDExOTggMTA0MSAxMTc2VDExODYgMTEyMEwxMTEyIDk1MlE5OTkgMTAxMCA4OTUgMTAxMFpNMTAwIDczMVExMDAgODM1IDEyNyA5MzFUMjAyIDExMTBUMzIwIDEyNjNUNDcyIDEzODBUNjUyIDE0NTZUODUyIDE0ODNROTU2IDE0ODMgMTA1MiAxNDU2VDEyMzEgMTM4MVQxMzg0IDEyNjNUMTUwMSAxMTExVDE1NzcgOTMxVDE2MDQgNzMxUTE2MDQgNjI3IDE1NzcgNTMxVDE1MDIgMzUyVDEzODQKKzIwMFQxMjMyIDgyVDEwNTIgN1Q4NTIgLTIwUTc0OCAtMjAgNjUyIDZUNDczIDgyVDMyMCAxOTlUMjAzIDM1MVQxMjcgNTMxVDEwMCA3MzFaTTI0MiA3MzFRMjQyIDYwNCAyOTAgNDkzVDQyMCAzMDBUNjE0IDE2OVQ4NTIgMTIxUTk3OSAxMjEgMTA5MCAxNjlUMTI4MyAyOTlUMTQxNCA0OTNUMTQ2MiA3MzFRMTQ2MiA4NTggMTQxNCA5NjlUMTI4NCAxMTYyVDEwOTAgMTI5M1Q4NTIgMTM0MVE3MjUgMTM0MSA2MTQgMTI5M1Q0MjEKKzExNjNUMjkwIDk2OVQyNDIgNzMxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhYTsiIGdseXBoLW5hbWU9Im9yZGZlbWluaW5lIiBob3Jpei1hZHYteD0iNzQzIiBkPSJNNTIwIDc2NEw0ODkgODc0UTQ0OSA4MTYgMzkzIDc4NFQyNjggNzUyUTIxOCA3NTIgMTc4IDc2NVQxMDggODA2VDYzIDg3NlQ0NyA5NzVRNDcgMTAzNSA2OCAxMDc2VDEzMCAxMTQ0VDIzMCAxMTg0VDM2NSAxMjAyTDQ1NSAxMjA2UTQ1NSAxMjY5IDQyNiAxMjk2VDM0MiAxMzIzUTMwMiAxMzIzIDI1MworMTMwNlQxNTIgMTI2Mkw4NiAxMzk3UTE0OCAxNDI5IDIyMiAxNDU0VDM4NyAxNDc5UTQ1NSAxNDc5IDUwNSAxNDYwVDU4OSAxNDA1VDYzOCAxMzE5VDY1NSAxMjA2Vjc2NEg1MjBaTTM3MyAxMDgxUTMzNSAxMDc4IDMxMiAxMDY4VDI3NSAxMDQ0VDI1NyAxMDEyVDI1MiA5NzdRMjUyIDkzOSAyNzEgOTIxVDMxNyA5MDNRMzQ5IDkwMyAzNzQgOTE0VDQxOCA5NDRUNDQ1IDk5MVQ0NTUgMTA1MVYxMDg3TDM3MyAxMDgxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhYjsiIGdseXBoLW5hbWU9Imd1aWxsZW1vdGxlZnQiIGhvcml6LWFkdi14PSIxMTk4IiBkPSJNODIgNTczTDM5MSAxMDI4TDYxMCA5MDlMMzkzIDU2MUw2MTAgMjEzTDM5MSA5NEw4MiA1NDdWNTczWk01ODggNTczTDg5NyAxMDI4TDExMTYgOTA5TDg5OSA1NjFMMTExNiAyMTNMODk3IDk0TDU4OCA1NDdWNTczWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhYzsiIGdseXBoLW5hbWU9ImxvZ2ljYWxub3QiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTA0MCAyNDhIODIxVjYxMkg4OFY4MzFIMTA0MFYyNDhaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGFkOyIgZ2x5cGgtbmFtZT0idW5pMDBBRCIgaG9yaXotYWR2LXg9IjY1OSIgZD0iTTYxIDQyNFY2NzRINTk4VjQyNEg2MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YWU7IiBnbHlwaC1uYW1lPSJyZWdpc3RlcmVkIiBob3Jpei1hZHYteD0iMTcwNCIgZD0iTTExNTcgOTA1UTExNTcgODExIDExMTkgNzU2VDEwMTQgNjcyTDEyNTEgMjcySDk5N0w4MTkgNjEwSDc3MlYyNzJINTQzVjExODhIODA3UTk4OSAxMTg4IDEwNzMgMTExOFQxMTU3IDkwNVpNNzcyIDc3OEg4MDNRODY5IDc3OCA4OTcgODA2VDkyNiA5MDFROTI2IDkzNiA5MTkgOTU5VDg5NiA5OTVUODU3CisxMDE0VDgwMSAxMDIwSDc3MlY3NzhaTTEwMCA3MzFRMTAwIDgzNSAxMjcgOTMxVDIwMiAxMTEwVDMyMCAxMjYzVDQ3MiAxMzgwVDY1MiAxNDU2VDg1MiAxNDgzUTk1NiAxNDgzIDEwNTIgMTQ1NlQxMjMxIDEzODFUMTM4NCAxMjYzVDE1MDEgMTExMVQxNTc3IDkzMVQxNjA0IDczMVExNjA0IDYyNyAxNTc3IDUzMVQxNTAyIDM1MlQxMzg0IDIwMFQxMjMyIDgyVDEwNTIgN1Q4NTIgLTIwUTc0OCAtMjAgNjUyIDZUNDczIDgyVDMyMAorMTk5VDIwMyAzNTFUMTI3IDUzMVQxMDAgNzMxWk0yNDIgNzMxUTI0MiA2MDQgMjkwIDQ5M1Q0MjAgMzAwVDYxNCAxNjlUODUyIDEyMVE5NzkgMTIxIDEwOTAgMTY5VDEyODMgMjk5VDE0MTQgNDkzVDE0NjIgNzMxUTE0NjIgODU4IDE0MTQgOTY5VDEyODQgMTE2MlQxMDkwIDEyOTNUODUyIDEzNDFRNzI1IDEzNDEgNjE0IDEyOTNUNDIxIDExNjNUMjkwIDk2OVQyNDIgNzMxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhZjsiIGdseXBoLW5hbWU9Im92ZXJzY29yZSIgaG9yaXotYWR2LXg9IjEwMjQiIGQ9Ik0xMDMwIDE1NTZILTZWMTc1N0gxMDMwVjE1NTZaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGIwOyIgZ2x5cGgtbmFtZT0iZGVncmVlIiBob3Jpei1hZHYteD0iODc3IiBkPSJNOTIgMTEzN1E5MiAxMjA4IDExOSAxMjcxVDE5MyAxMzgxVDMwMyAxNDU1VDQzOCAxNDgzUTUxMCAxNDgzIDU3MyAxNDU2VDY4MyAxMzgxVDc1NyAxMjcxVDc4NCAxMTM3UTc4NCAxMDY1IDc1NyAxMDAyVDY4NCA4OTNUNTc0IDgyMFQ0MzggNzkzUTM2NiA3OTMgMzAzIDgxOVQxOTMgODkyVDExOSAxMDAyVDkyCisxMTM3Wk0yODMgMTEzN1EyODMgMTEwNiAyOTUgMTA3OFQzMjggMTAyOVQzNzcgOTk2VDQzOCA5ODNRNDcwIDk4MyA0OTggOTk1VDU0OCAxMDI5VDU4MSAxMDc4VDU5NCAxMTM3UTU5NCAxMTY5IDU4MiAxMTk3VDU0OCAxMjQ3VDQ5OSAxMjgxVDQzOCAxMjk0UTQwNiAxMjk0IDM3OCAxMjgyVDMyOCAxMjQ4VDI5NSAxMTk4VDI4MyAxMTM3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiMTsiIGdseXBoLW5hbWU9InBsdXNtaW51cyIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik00NTUgNjc0SDg4Vjg5M0g0NTVWMTI2Mkg2NzRWODkzSDEwNDBWNjc0SDY3NFYzMDlINDU1VjY3NFpNODggMFYyMTlIMTA0MFYwSDg4WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiMjsiIGdseXBoLW5hbWU9InR3b3N1cGVyaW9yIiBob3Jpei1hZHYteD0iNzc2IiBkPSJNNzAyIDU4Nkg1NVY3NTRMMjc5IDk3M1EzMjUgMTAxOCAzNTUgMTA1MVQ0MDQgMTExMVQ0MzAgMTE2MVQ0MzggMTIxMlE0MzggMTI1MCA0MTQgMTI3MFQzNTAgMTI5MFEzMTAgMTI5MCAyNjcgMTI3MFQxNzAgMTIwMkw0NyAxMzU0UTExMiAxNDExIDE5MyAxNDQ3VDM4MyAxNDgzUTQ0OSAxNDgzIDUwMworMTQ2N1Q1OTYgMTQxOVQ2NTYgMTM0MVQ2NzggMTIzM1E2NzggMTE4NyA2NjYgMTE0N1Q2MjYgMTA2NVQ1NTcgOTgwVDQ1NSA4ODFMMzUwIDc4Nkg3MDJWNTg2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiMzsiIGdseXBoLW5hbWU9InRocmVlc3VwZXJpb3IiIGhvcml6LWFkdi14PSI3NzYiIGQ9Ik02NjYgMTI0OVE2NjYgMTE4MCA2MjYgMTEzMFQ0OTYgMTA1MVYxMDM4UTU0NyAxMDI4IDU4NCAxMDA3VDY0NSA5NTlUNjgyIDg5OFQ2OTQgODI5UTY5NCA3MDggNjA2IDYzOVQzMzIgNTY5UTI1NiA1NjkgMTkwIDU4NlQ1OSA2MzlWODI5UTEyNSA3ODkgMTkxIDc2NFQzMzAgNzM5UTQwNCA3MzkgNDM4Cis3NjZUNDczIDg0NlE0NzMgODY3IDQ2NSA4ODZUNDM4IDkxOVQzODcgOTQzVDMwNyA5NTJIMTk1VjExMTJIMjg3UTMzOSAxMTEyIDM3MSAxMTIxVDQyMSAxMTQ1VDQ0NSAxMTgwVDQ1MSAxMjIxUTQ1MSAxMjU5IDQyNiAxMjg0VDM1MCAxMzA5UTMwMyAxMzA5IDI2MSAxMjkwVDE2MiAxMjMxTDYxIDEzNzJRMTIzIDE0MTkgMTk4IDE0NTBUMzc3IDE0ODFRNDM5IDE0ODEgNDkyIDE0NjVUNTgzIDE0MThUNjQ0IDEzNDVUNjY2IDEyNDlaIgorLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiNDsiIGdseXBoLW5hbWU9ImFjdXRlIiBob3Jpei1hZHYteD0iMTE4MiIgZD0iTTMzMiAxMjQxVjEyNjhRMzUzIDEyOTcgMzc3IDEzMzVUNDI0IDE0MTNUNDY5IDE0OTRUNTA2IDE1NjlIODQ4VjE1NDhRODM3IDE1MzAgODE2IDE1MDZUNzY4IDE0NTNUNzEwIDEzOTZUNjQ4IDEzMzhUNTg3IDEyODVUNTM1IDEyNDFIMzMyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiNTsiIGdseXBoLW5hbWU9Im11IiBob3Jpei1hZHYteD0iMTI5MCIgZD0iTTQ2NSA0NjVRNDY1IDM0NCA1MDIgMjg0VDYyMSAyMjNRNjc5IDIyMyA3MTggMjQ3VDc4MSAzMThUODE1IDQzNFQ4MjUgNTkyVjExMThIMTEzMFYwSDg5N0w4NTQgMTUwSDg0MlE4MDcgNjUgNzU1IDIzVDYyNyAtMjBRNTczIC0yMCA1MjggM1Q0NTUgNzBRNDU3IDI4IDQ2MCAtMTVRNDYyIC01MiA0NjMgLTk0VDQ2NQorLTE3MlYtNDkySDE2MFYxMTE4SDQ2NVY0NjVaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGI2OyIgZ2x5cGgtbmFtZT0icGFyYWdyYXBoIiBob3Jpei1hZHYteD0iMTM0MSIgZD0iTTExNjcgLTI2MEgxMDA2VjEzNTZIODQwVi0yNjBINjc4VjU1OVE2MTcgNTQxIDUzMiA1NDFRNDM3IDU0MSAzNjAgNTY2VDIyOCA2NTFUMTQzIDgwNlQxMTMgMTA0MlExMTMgMTE4OSAxNDUgMTI4N1QyMzcgMTQ0NlQzODAgMTUzMVQ1NjMgMTU1NkgxMTY3Vi0yNjBaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGI3OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMTE3IDcyM1ExMTcgNzcwIDEzMCA4MDJUMTY4IDg1NVQyMjQgODg0VDI5MyA4OTNRMzI4IDg5MyAzNTkgODg0VDQxNSA4NTVUNDUzIDgwM1Q0NjcgNzIzUTQ2NyA2NzggNDUzIDY0NlQ0MTUgNTkzVDM2MCA1NjNUMjkzIDU1M1EyNTYgNTUzIDIyNCA1NjJUMTY4IDU5MlQxMzEgNjQ1VDExNyA3MjNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGI4OyIgZ2x5cGgtbmFtZT0iY2VkaWxsYSIgaG9yaXotYWR2LXg9IjQyMCIgZD0iTTQxOCAtMjUwUTQxOCAtMzA3IDQwMyAtMzUyVDM1MSAtNDI4VDI1NiAtNDc1VDEwOSAtNDkyUTY0IC00OTIgMjggLTQ4NlQtMzcgLTQ3MVYtMzAzUS0yMiAtMzA3IC00IC0zMTBUMzQgLTMxN1Q3MiAtMzIyVDEwNiAtMzI0UTEzNSAtMzI0IDE1NiAtMzExVDE3OCAtMjYyUTE3OCAtMjI1IDE0MSAtMTk3VDEyCistMTU0TDkwIDBIMjgzTDI1NiAtNjFRMjg3IC03MSAzMTYgLTg4VDM2NyAtMTI4VDQwNCAtMTgyVDQxOCAtMjUwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiOTsiIGdseXBoLW5hbWU9Im9uZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iNzc2IiBkPSJNNTg0IDU4NkgzNDZWMTAzMlEzNDYgMTA1MiAzNDYgMTA4MlQzNDggMTE0NFQzNTEgMTIwMVQzNTQgMTIzOVEzNDggMTIzMSAzMzkgMTIyMVQzMTkgMTE5OVQyOTggMTE3OFQyNzkgMTE2MUwyMDEgMTEwMEw5MiAxMjI3TDM5MyAxNDYySDU4NFY1ODZaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGJhOyIgZ2x5cGgtbmFtZT0ib3JkbWFzY3VsaW5lIiBob3Jpei1hZHYteD0iNzU0IiBkPSJNNjk2IDExMTZRNjk2IDEwMjkgNjc0IDk2MlQ2MDkgODQ4VDUwOCA3NzdUMzc1IDc1MlEzMDYgNzUyIDI0OCA3NzZUMTQ3IDg0N1Q4MSA5NjFUNTcgMTExNlE1NyAxMjAzIDc5IDEyNzBUMTQzIDEzODRUMjQ0IDE0NTVUMzc5IDE0NzlRNDQ3IDE0NzkgNTA0IDE0NTVUNjA1IDEzODVUNjcyIDEyNzFUNjk2CisxMTE2Wk0yNjAgMTExNlEyNjAgMTAxNiAyODcgOTY2VDM3NyA5MTVRNDM3IDkxNSA0NjQgOTY1VDQ5MiAxMTE2UTQ5MiAxMjE2IDQ2NSAxMjY1VDM3NyAxMzE1UTMxNSAxMzE1IDI4OCAxMjY2VDI2MCAxMTE2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiYjsiIGdseXBoLW5hbWU9Imd1aWxsZW1vdHJpZ2h0IiBob3Jpei1hZHYteD0iMTE5OCIgZD0iTTExMTggNTQ3TDgwOSA5NEw1OTAgMjEzTDgwNyA1NjFMNTkwIDkwOUw4MDkgMTAyOEwxMTE4IDU3M1Y1NDdaTTYxMiA1NDdMMzAzIDk0TDg0IDIxM0wzMDEgNTYxTDg0IDkwOUwzMDMgMTAyOEw2MTIgNTczVjU0N1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YmM7IiBnbHlwaC1uYW1lPSJvbmVxdWFydGVyIiBob3Jpei1hZHYteD0iMTgwNCIgZD0iTTEzNzAgMTQ2Mkw1NTkgMEgzMjBMMTEzMSAxNDYySDEzNzBaTTc5NCA1ODZINTU2VjEwMzJRNTU2IDEwNTIgNTU2IDEwODJUNTU4IDExNDRUNTYxIDEyMDFUNTY0IDEyMzlRNTU4IDEyMzEgNTQ5IDEyMjFUNTI5IDExOTlUNTA4IDExNzhUNDg5IDExNjFMNDExIDExMDBMMzAyIDEyMjdMNjAzIDE0NjJINzk0VjU4NlpNMTY4MgorMTUySDE1NTdWMUgxMzE5VjE1Mkg5MzZWMzA2TDEzMjEgODgzSDE1NTdWMzIwSDE2ODJWMTUyWk0xMzE5IDMyMFY0ODRRMTMxOSA1MjYgMTMyMCA1NzJUMTMyNSA2NjhRMTMyMCA2NTUgMTMxMSA2MzRUMTI5MCA1OTBUMTI2OCA1NDZUMTI0OCA1MTFMMTEyMSAzMjBIMTMxOVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YmQ7IiBnbHlwaC1uYW1lPSJvbmVoYWxmIiBob3Jpei1hZHYteD0iMTgwNCIgZD0iTTEzNzAgMTQ2Mkw1NTkgMEgzMjBMMTEzMSAxNDYySDEzNzBaTTc5NCA1ODZINTU2VjEwMzJRNTU2IDEwNTIgNTU2IDEwODJUNTU4IDExNDRUNTYxIDEyMDFUNTY0IDEyMzlRNTU4IDEyMzEgNTQ5IDEyMjFUNTI5IDExOTlUNTA4IDExNzhUNDg5IDExNjFMNDExIDExMDBMMzAyIDEyMjdMNjAzIDE0NjJINzk0VjU4NlpNMTcxNgorMUgxMDY5VjE2OUwxMjkzIDM4OFExMzM5IDQzMyAxMzY5IDQ2NlQxNDE4IDUyNlQxNDQ0IDU3NlQxNDUyIDYyN1ExNDUyIDY2NSAxNDI4IDY4NVQxMzY0IDcwNVExMzI0IDcwNSAxMjgxIDY4NVQxMTg0IDYxN0wxMDYxIDc2OVExMTI2IDgyNiAxMjA3IDg2MlQxMzk3IDg5OFExNDYzIDg5OCAxNTE3IDg4MlQxNjEwIDgzNFQxNjcwIDc1NlQxNjkyIDY0OFExNjkyIDYwMiAxNjgwIDU2MlQxNjQwIDQ4MFQxNTcxIDM5NVQxNDY5CisyOTZMMTM2NCAyMDFIMTcxNlYxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiZTsiIGdseXBoLW5hbWU9InRocmVlcXVhcnRlcnMiIGhvcml6LWFkdi14PSIxODA0IiBkPSJNMTQ0MSAxNDYyTDYzMCAwSDM5MUwxMjAyIDE0NjJIMTQ0MVpNMTcxMiAxNTJIMTU4N1YxSDEzNDlWMTUySDk2NlYzMDZMMTM1MSA4ODNIMTU4N1YzMjBIMTcxMlYxNTJaTTEzNDkgMzIwVjQ4NFExMzQ5IDUyNiAxMzUwIDU3MlQxMzU1IDY2OFExMzUwIDY1NSAxMzQxIDYzNFQxMzIwIDU5MFQxMjk4Cis1NDZUMTI3OCA1MTFMMTE1MSAzMjBIMTM0OVpNNjk3IDEyNDlRNjk3IDExODAgNjU3IDExMzBUNTI3IDEwNTFWMTAzOFE1NzggMTAyOCA2MTUgMTAwN1Q2NzYgOTU5VDcxMyA4OThUNzI1IDgyOVE3MjUgNzA4IDYzNyA2MzlUMzYzIDU2OVEyODcgNTY5IDIyMSA1ODZUOTAgNjM5VjgyOVExNTYgNzg5IDIyMiA3NjRUMzYxIDczOVE0MzUgNzM5IDQ2OSA3NjZUNTA0IDg0NlE1MDQgODY3IDQ5NiA4ODZUNDY5IDkxOVQ0MTggOTQzVDMzOAorOTUySDIyNlYxMTEySDMxOFEzNzAgMTExMiA0MDIgMTEyMVQ0NTIgMTE0NVQ0NzYgMTE4MFQ0ODIgMTIyMVE0ODIgMTI1OSA0NTcgMTI4NFQzODEgMTMwOVEzMzQgMTMwOSAyOTIgMTI5MFQxOTMgMTIzMUw5MiAxMzcyUTE1NCAxNDE5IDIyOSAxNDUwVDQwOCAxNDgxUTQ3MCAxNDgxIDUyMyAxNDY1VDYxNCAxNDE4VDY3NSAxMzQ1VDY5NyAxMjQ5WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiZjsiIGdseXBoLW5hbWU9InF1ZXN0aW9uZG93biIgaG9yaXotYWR2LXg9Ijk0MCIgZD0iTTY4NiA2MDZWNTMyUTY4NiA0ODEgNjc2IDQ0MFQ2NDQgMzYxVDU4OCAyODhUNTA2IDIxNVE0NjQgMTgyIDQzNSAxNTZUMzg4IDEwNVQzNjIgNTFUMzU0IC0xNFEzNTQgLTcxIDM5MyAtMTA4VDUxMCAtMTQ1UTU3OSAtMTQ1IDY1OSAtMTE2VDgyMyAtNDVMOTI2IC0yNjZRODgzIC0yOTIgODMyIC0zMTRUNzI3CistMzU0VDYxNiAtMzgxVDUwNiAtMzkxUTQwNCAtMzkxIDMyMyAtMzY3VDE4NCAtMjk2VDk3IC0xODJUNjYgLTI5UTY2IDM0IDc5IDgzVDEyMSAxNzVUMTkwIDI1OFQyODcgMzQyUTMyOCAzNzUgMzU0IDM5OVQzOTYgNDQ2VDQxNiA0OTJUNDIyIDU0N1Y2MDZINjg2Wk03MTkgOTQ4UTcxOSA5MDEgNzA2IDg2OVQ2NjggODE2VDYxMiA3ODdUNTQzIDc3OFE1MDggNzc4IDQ3NyA3ODdUNDIxIDgxNlQzODMgODY4VDM2OSA5NDhRMzY5Cis5OTMgMzgzIDEwMjVUNDIxIDEwNzhUNDc2IDExMDhUNTQzIDExMThRNTgwIDExMTggNjEyIDExMDlUNjY4IDEwNzlUNzA1IDEwMjZUNzE5IDk0OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YzA7IiBnbHlwaC1uYW1lPSJBZ3JhdmUiIGhvcml6LWFkdi14PSIxMzMxIiBkPSJNMTAxOCAwTDkxOCAzNDhINDE0TDMxMyAwSDBMNDc1IDE0NjhIODU0TDEzMzEgMEgxMDE4Wk04NDYgNjA4TDc1MiA5MjhRNzQ2IDk0NiA3MzQgOTg3VDcwOSAxMDc3VDY4MyAxMTc3VDY2NiAxMjYyUTY2MiAxMjQwIDY1NiAxMjEwVDY0MSAxMTQ3VDYyMyAxMDc5VDYwNiAxMDE1VDU5MiA5NjJUNTgyIDkyOEw0ODkKKzYwOEg4NDZaTTYzMiAxNTc5UTU5OCAxNjA3IDU1MSAxNjQ4VDQ1NyAxNzM0VDM3MyAxODE4VDMxOSAxODg2VjE5MDdINjYxUTY3NyAxODczIDY5OCAxODMzVDc0MyAxNzUyVDc5MCAxNjczVDgzNSAxNjA2VjE1NzlINjMyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjMTsiIGdseXBoLW5hbWU9IkFhY3V0ZSIgaG9yaXotYWR2LXg9IjEzMzEiIGQ9Ik0xMDE4IDBMOTE4IDM0OEg0MTRMMzEzIDBIMEw0NzUgMTQ2OEg4NTRMMTMzMSAwSDEwMThaTTg0NiA2MDhMNzUyIDkyOFE3NDYgOTQ2IDczNCA5ODdUNzA5IDEwNzdUNjgzIDExNzdUNjY2IDEyNjJRNjYyIDEyNDAgNjU2IDEyMTBUNjQxIDExNDdUNjIzIDEwNzlUNjA2IDEwMTVUNTkyIDk2MlQ1ODIgOTI4TDQ4OQorNjA4SDg0NlpNNDk0IDE1NzlWMTYwNlE1MTUgMTYzNSA1MzkgMTY3M1Q1ODYgMTc1MVQ2MzEgMTgzMlQ2NjggMTkwN0gxMDEwVjE4ODZROTk5IDE4NjggOTc4IDE4NDRUOTMwIDE3OTFUODcyIDE3MzRUODEwIDE2NzZUNzQ5IDE2MjNUNjk3IDE1NzlINDk0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjMjsiIGdseXBoLW5hbWU9IkFjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMTMzMSIgZD0iTTEwMTggMEw5MTggMzQ4SDQxNEwzMTMgMEgwTDQ3NSAxNDY4SDg1NEwxMzMxIDBIMTAxOFpNODQ2IDYwOEw3NTIgOTI4UTc0NiA5NDYgNzM0IDk4N1Q3MDkgMTA3N1Q2ODMgMTE3N1Q2NjYgMTI2MlE2NjIgMTI0MCA2NTYgMTIxMFQ2NDEgMTE0N1Q2MjMgMTA3OVQ2MDYgMTAxNVQ1OTIgOTYyVDU4MgorOTI4TDQ4OSA2MDhIODQ2Wk04NzkgMTU3OVE4MjggMTYxMyA3NzMgMTY1NlQ2NjYgMTc1NVE2MTIgMTY5OSA1NjAgMTY1NlQ0NTcgMTU3OUgyNTRWMTYwNlEyODAgMTYzNSAzMTEgMTY3M1QzNzUgMTc1MVQ0MzggMTgzMlQ0OTAgMTkwN0g4NDZRODY3IDE4NzMgODk3IDE4MzNUOTU5IDE3NTJUMTAyNCAxNjczVDEwODIgMTYwNlYxNTc5SDg3OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YzM7IiBnbHlwaC1uYW1lPSJBdGlsZGUiIGhvcml6LWFkdi14PSIxMzMxIiBkPSJNMTAxOCAwTDkxOCAzNDhINDE0TDMxMyAwSDBMNDc1IDE0NjhIODU0TDEzMzEgMEgxMDE4Wk04NDYgNjA4TDc1MiA5MjhRNzQ2IDk0NiA3MzQgOTg3VDcwOSAxMDc3VDY4MyAxMTc3VDY2NiAxMjYyUTY2MiAxMjQwIDY1NiAxMjEwVDY0MSAxMTQ3VDYyMyAxMDc5VDYwNiAxMDE1VDU5MiA5NjJUNTgyIDkyOEw0ODkKKzYwOEg4NDZaTTUwNCAxNjg0UTQ3MyAxNjg0IDQ1NSAxNjU4VDQyNCAxNTc3SDI3NVEyODEgMTY1NyAzMDEgMTcxNVQzNTMgMTgxMVQ0MzAgMTg2N1Q1MjcgMTg4NlE1NjggMTg4NiA2MDcgMTg3MFQ2ODQgMTgzNVQ3NjAgMTc5OVQ4MzQgMTc4MlE4NjUgMTc4MiA4ODMgMTgwOFQ5MTQgMTg4OEgxMDYzUTEwNTcgMTgwOSAxMDM3IDE3NTFUOTgzIDE2NTVUOTA3IDE1OThUODExIDE1NzlRNzcxIDE1NzkgNzMxIDE1OTVUNjUzIDE2MzFUNTc4CisxNjY3VDUwNCAxNjg0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjNDsiIGdseXBoLW5hbWU9IkFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjEzMzEiIGQ9Ik0xMDE4IDBMOTE4IDM0OEg0MTRMMzEzIDBIMEw0NzUgMTQ2OEg4NTRMMTMzMSAwSDEwMThaTTg0NiA2MDhMNzUyIDkyOFE3NDYgOTQ2IDczNCA5ODdUNzA5IDEwNzdUNjgzIDExNzdUNjY2IDEyNjJRNjYyIDEyNDAgNjU2IDEyMTBUNjQxIDExNDdUNjIzIDEwNzlUNjA2IDEwMTVUNTkyIDk2MlQ1ODIgOTI4TDQ4OQorNjA4SDg0NlpNMzI0IDE3NDNRMzI0IDE3NzggMzM1IDE4MDNUMzY0IDE4NDVUNDA4IDE4NzBUNDYzIDE4NzhRNDkyIDE4NzggNTE3IDE4NzBUNTYyIDE4NDZUNTkyIDE4MDRUNjA0IDE3NDNRNjA0IDE3MDkgNTkzIDE2ODRUNTYyIDE2NDNUNTE4IDE2MThUNDYzIDE2MTBRNDM0IDE2MTAgNDA5IDE2MThUMzY1IDE2NDJUMzM1IDE2ODRUMzI0IDE3NDNaTTcyNyAxNzQzUTcyNyAxNzc4IDczOCAxODAzVDc2OCAxODQ1VDgxMyAxODcwVDg2OQorMTg3OFE4OTcgMTg3OCA5MjIgMTg3MFQ5NjcgMTg0NlQ5OTggMTgwNFQxMDEwIDE3NDNRMTAxMCAxNzA5IDk5OSAxNjg0VDk2OCAxNjQzVDkyMyAxNjE4VDg2OSAxNjEwUTgwOSAxNjEwIDc2OCAxNjQzVDcyNyAxNzQzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjNTsiIGdseXBoLW5hbWU9IkFyaW5nIiBob3Jpei1hZHYteD0iMTMzMSIgZD0iTTEwMTggMEw5MTggMzQ4SDQxNEwzMTMgMEgwTDQ3NSAxNDY4SDg1NEwxMzMxIDBIMTAxOFpNODQ2IDYwOEw3NTIgOTI4UTc0NiA5NDYgNzM0IDk4N1Q3MDkgMTA3N1Q2ODMgMTE3N1Q2NjYgMTI2MlE2NjIgMTI0MCA2NTYgMTIxMFQ2NDEgMTE0N1Q2MjMgMTA3OVQ2MDYgMTAxNVQ1OTIgOTYyVDU4MiA5MjhMNDg5Cis2MDhIODQ2Wk05MTggMTU2N1E5MTggMTUxMSA4OTkgMTQ2N1Q4NDUgMTM5MVQ3NjQgMTM0NFQ2NjQgMTMyN1E2MDkgMTMyNyA1NjMgMTM0M1Q0ODUgMTM5MFQ0MzQgMTQ2NVQ0MTYgMTU2NVE0MTYgMTYyMCA0MzQgMTY2NFQ0ODQgMTczOFQ1NjMgMTc4NVQ2NjQgMTgwMlE3MTcgMTgwMiA3NjMgMTc4NlQ4NDMgMTczOVQ4OTggMTY2NVQ5MTggMTU2N1pNNzYwIDE1NjVRNzYwIDE2MTAgNzMzIDE2MzVUNjY0IDE2NjFRNjIyIDE2NjEKKzU5NSAxNjM2VDU2OCAxNTY1UTU2OCAxNTIwIDU5MiAxNDk0VDY2NCAxNDY4UTcwNiAxNDY4IDczMyAxNDk0VDc2MCAxNTY1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjNjsiIGdseXBoLW5hbWU9IkFFIiBob3Jpei1hZHYteD0iMTg4OCIgZD0iTTE3NjcgMEg5MjZWMzQ4SDQ2NUwzMTUgMEgwTDY1NSAxNDYySDE3NjdWMTIwOEgxMjM1Vjg4N0gxNzMxVjYzM0gxMjM1VjI1NkgxNzY3VjBaTTU3OCA2MDhIOTI2VjExOThIODI5TDU3OCA2MDhaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGM3OyIgZ2x5cGgtbmFtZT0iQ2NlZGlsbGEiIGhvcml6LWFkdi14PSIxMzA1IiBkPSJNODA1IDEyMjVRNzE2IDEyMjUgNjQ4IDExOTFUNTMzIDEwOTJUNDYyIDkzNVQ0MzggNzI3UTQzOCA2MTAgNDU5IDUxOVQ1MjUgMzY2VDYzOSAyNzFUODA1IDIzOFE4OTQgMjM4IDk4MyAyNThUMTE3OCAzMTVWNTVRMTEzMCAzNSAxMDgzIDIxVDk4NyAtMlQ4ODcgLTE1VDc3NiAtMjBRNjA3IC0yMCA0ODMgMzRUMjc4CisxODZUMTU4IDQyMlQxMTkgNzI5UTExOSA4OTUgMTY0IDEwMzNUMjk2IDEyNzJUNTExIDE0MjdUODA1IDE0ODNROTE0IDE0ODMgMTAyMyAxNDU2VDEyMzMgMTM4MEwxMTMzIDExMjhRMTA1MSAxMTY3IDk2OCAxMTk2VDgwNSAxMjI1Wk05MjYgLTI1MFE5MjYgLTMwNyA5MTEgLTM1MlQ4NTkgLTQyOFQ3NjQgLTQ3NVQ2MTcgLTQ5MlE1NzIgLTQ5MiA1MzYgLTQ4NlQ0NzEgLTQ3MVYtMzAzUTQ4NiAtMzA3IDUwNCAtMzEwVDU0MiAtMzE3VDU4MAorLTMyMlQ2MTQgLTMyNFE2NDMgLTMyNCA2NjQgLTMxMVQ2ODYgLTI2MlE2ODYgLTIyNSA2NDkgLTE5N1Q1MjAgLTE1NEw1OTggMEg3OTFMNzY0IC02MVE3OTUgLTcxIDgyNCAtODhUODc1IC0xMjhUOTEyIC0xODJUOTI2IC0yNTBaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGM4OyIgZ2x5cGgtbmFtZT0iRWdyYXZlIiBob3Jpei1hZHYteD0iMTE0NyIgZD0iTTEwMjYgMEgxODRWMTQ2MkgxMDI2VjEyMDhINDk0Vjg4N0g5ODlWNjMzSDQ5NFYyNTZIMTAyNlYwWk01NzIgMTU3OVE1MzggMTYwNyA0OTEgMTY0OFQzOTcgMTczNFQzMTMgMTgxOFQyNTkgMTg4NlYxOTA3SDYwMVE2MTcgMTg3MyA2MzggMTgzM1Q2ODMgMTc1MlQ3MzAgMTY3M1Q3NzUgMTYwNlYxNTc5SDU3MloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Yzk7IiBnbHlwaC1uYW1lPSJFYWN1dGUiIGhvcml6LWFkdi14PSIxMTQ3IiBkPSJNMTAyNiAwSDE4NFYxNDYySDEwMjZWMTIwOEg0OTRWODg3SDk4OVY2MzNINDk0VjI1NkgxMDI2VjBaTTQyNCAxNTc5VjE2MDZRNDQ1IDE2MzUgNDY5IDE2NzNUNTE2IDE3NTFUNTYxIDE4MzJUNTk4IDE5MDdIOTQwVjE4ODZROTI5IDE4NjggOTA4IDE4NDRUODYwIDE3OTFUODAyIDE3MzRUNzQwIDE2NzZUNjc5CisxNjIzVDYyNyAxNTc5SDQyNFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Y2E7IiBnbHlwaC1uYW1lPSJFY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjExNDciIGQ9Ik0xMDI2IDBIMTg0VjE0NjJIMTAyNlYxMjA4SDQ5NFY4ODdIOTg5VjYzM0g0OTRWMjU2SDEwMjZWMFpNODMyIDE1NzlRNzgxIDE2MTMgNzI2IDE2NTZUNjE5IDE3NTVRNTY1IDE2OTkgNTEzIDE2NTZUNDEwIDE1NzlIMjA3VjE2MDZRMjMzIDE2MzUgMjY0IDE2NzNUMzI4IDE3NTFUMzkxIDE4MzJUNDQzCisxOTA3SDc5OVE4MjAgMTg3MyA4NTAgMTgzM1Q5MTIgMTc1MlQ5NzcgMTY3M1QxMDM1IDE2MDZWMTU3OUg4MzJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGNiOyIgZ2x5cGgtbmFtZT0iRWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMTE0NyIgZD0iTTEwMjYgMEgxODRWMTQ2MkgxMDI2VjEyMDhINDk0Vjg4N0g5ODlWNjMzSDQ5NFYyNTZIMTAyNlYwWk0yNzMgMTc0M1EyNzMgMTc3OCAyODQgMTgwM1QzMTMgMTg0NVQzNTcgMTg3MFQ0MTIgMTg3OFE0NDEgMTg3OCA0NjYgMTg3MFQ1MTEgMTg0NlQ1NDEgMTgwNFQ1NTMgMTc0M1E1NTMgMTcwOSA1NDIgMTY4NFQ1MTEKKzE2NDNUNDY3IDE2MThUNDEyIDE2MTBRMzgzIDE2MTAgMzU4IDE2MThUMzE0IDE2NDJUMjg0IDE2ODRUMjczIDE3NDNaTTY3NiAxNzQzUTY3NiAxNzc4IDY4NyAxODAzVDcxNyAxODQ1VDc2MiAxODcwVDgxOCAxODc4UTg0NiAxODc4IDg3MSAxODcwVDkxNiAxODQ2VDk0NyAxODA0VDk1OSAxNzQzUTk1OSAxNzA5IDk0OCAxNjg0VDkxNyAxNjQzVDg3MiAxNjE4VDgxOCAxNjEwUTc1OCAxNjEwIDcxNyAxNjQzVDY3NiAxNzQzWiIKKy8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Y2M7IiBnbHlwaC1uYW1lPSJJZ3JhdmUiIGhvcml6LWFkdi14PSI3OTciIGQ9Ik03MzEgMEg2NlYxNzZMMjQ0IDI1OFYxMjA0TDY2IDEyODZWMTQ2Mkg3MzFWMTI4Nkw1NTMgMTIwNFYyNThMNzMxIDE3NlYwWk0zNTUgMTU3OVEzMjEgMTYwNyAyNzQgMTY0OFQxODAgMTczNFQ5NiAxODE4VDQyIDE4ODZWMTkwN0gzODRRNDAwIDE4NzMgNDIxIDE4MzNUNDY2IDE3NTJUNTEzIDE2NzNUNTU4IDE2MDZWMTU3OUgzNTVaIgorLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjZDsiIGdseXBoLW5hbWU9IklhY3V0ZSIgaG9yaXotYWR2LXg9Ijc5NyIgZD0iTTczMSAwSDY2VjE3NkwyNDQgMjU4VjEyMDRMNjYgMTI4NlYxNDYySDczMVYxMjg2TDU1MyAxMjA0VjI1OEw3MzEgMTc2VjBaTTIzNyAxNTc5VjE2MDZRMjU4IDE2MzUgMjgyIDE2NzNUMzI5IDE3NTFUMzc0IDE4MzJUNDExIDE5MDdINzUzVjE4ODZRNzQyIDE4NjggNzIxIDE4NDRUNjczIDE3OTFUNjE1IDE3MzRUNTUzCisxNjc2VDQ5MiAxNjIzVDQ0MCAxNTc5SDIzN1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Y2U7IiBnbHlwaC1uYW1lPSJJY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9Ijc5NyIgZD0iTTczMSAwSDY2VjE3NkwyNDQgMjU4VjEyMDRMNjYgMTI4NlYxNDYySDczMVYxMjg2TDU1MyAxMjA0VjI1OEw3MzEgMTc2VjBaTTYwOSAxNTc5UTU1OCAxNjEzIDUwMyAxNjU2VDM5NiAxNzU1UTM0MiAxNjk5IDI5MCAxNjU2VDE4NyAxNTc5SC0xNlYxNjA2UTEwIDE2MzUgNDEgMTY3M1QxMDUgMTc1MVQxNjgKKzE4MzJUMjIwIDE5MDdINTc2UTU5NyAxODczIDYyNyAxODMzVDY4OSAxNzUyVDc1NCAxNjczVDgxMiAxNjA2VjE1NzlINjA5WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjZjsiIGdseXBoLW5hbWU9IklkaWVyZXNpcyIgaG9yaXotYWR2LXg9Ijc5NyIgZD0iTTczMSAwSDY2VjE3NkwyNDQgMjU4VjEyMDRMNjYgMTI4NlYxNDYySDczMVYxMjg2TDU1MyAxMjA0VjI1OEw3MzEgMTc2VjBaTTU0IDE3NDNRNTQgMTc3OCA2NSAxODAzVDk0IDE4NDVUMTM4IDE4NzBUMTkzIDE4NzhRMjIyIDE4NzggMjQ3IDE4NzBUMjkyIDE4NDZUMzIyIDE4MDRUMzM0IDE3NDNRMzM0IDE3MDkKKzMyMyAxNjg0VDI5MiAxNjQzVDI0OCAxNjE4VDE5MyAxNjEwUTE2NCAxNjEwIDEzOSAxNjE4VDk1IDE2NDJUNjUgMTY4NFQ1NCAxNzQzWk00NTcgMTc0M1E0NTcgMTc3OCA0NjggMTgwM1Q0OTggMTg0NVQ1NDMgMTg3MFQ1OTkgMTg3OFE2MjcgMTg3OCA2NTIgMTg3MFQ2OTcgMTg0NlQ3MjggMTgwNFQ3NDAgMTc0M1E3NDAgMTcwOSA3MjkgMTY4NFQ2OTggMTY0M1Q2NTMgMTYxOFQ1OTkgMTYxMFE1MzkgMTYxMCA0OTggMTY0M1Q0NTcKKzE3NDNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGQwOyIgZ2x5cGgtbmFtZT0iRXRoIiBob3Jpei1hZHYteD0iMTQzNCIgZD0iTTQ3IDg1MEgxODRWMTQ2Mkg2MTJRNzczIDE0NjIgOTAyIDE0MTZUMTEyNCAxMjgwVDEyNjUgMTA1NVQxMzE1IDc0NVExMzE1IDU2MCAxMjY1IDQyMVQxMTE5IDE4OFQ4ODUgNDdUNTY5IDBIMTg0VjU5Nkg0N1Y4NTBaTTEwMDEgNzM3UTEwMDEgODU5IDk3NyA5NDdUOTA2IDEwOTRUNzkyIDExODBUNjM3IDEyMDhINDk0Vjg1MEg3MzFWNTk2SDQ5NFYyNTZINjA4UTgwNAorMjU2IDkwMiAzNzZUMTAwMSA3MzdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGQxOyIgZ2x5cGgtbmFtZT0iTnRpbGRlIiBob3Jpei1hZHYteD0iMTYwNCIgZD0iTTE0MTkgMEgxMDI2TDQ1MSAxMTA2SDQ0MlE0NDggMTAyOSA0NTIgOTUzUTQ1NiA4ODggNDU4IDgxN1Q0NjEgNjg4VjBIMTg0VjE0NjJINTc1TDExNDkgMzY3SDExNTVRMTE1MiA0NDMgMTE0OCA1MTdRMTE0NyA1NDkgMTE0NiA1ODJUMTE0MyA2NDlUMTE0MiA3MTRUMTE0MSA3NzBWMTQ2MkgxNDE5VjBaTTYyMworMTY4NFE1OTIgMTY4NCA1NzQgMTY1OFQ1NDMgMTU3N0gzOTRRNDAwIDE2NTcgNDIwIDE3MTVUNDcyIDE4MTFUNTQ5IDE4NjdUNjQ2IDE4ODZRNjg3IDE4ODYgNzI2IDE4NzBUODAzIDE4MzVUODc5IDE3OTlUOTUzIDE3ODJROTg0IDE3ODIgMTAwMiAxODA4VDEwMzMgMTg4OEgxMTgyUTExNzYgMTgwOSAxMTU2IDE3NTFUMTEwMiAxNjU1VDEwMjYgMTU5OFQ5MzAgMTU3OVE4OTAgMTU3OSA4NTAgMTU5NVQ3NzIgMTYzMVQ2OTcgMTY2N1Q2MjMKKzE2ODRaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGQyOyIgZ2x5cGgtbmFtZT0iT2dyYXZlIiBob3Jpei1hZHYteD0iMTU0OCIgZD0iTTE0MzAgNzMzUTE0MzAgNTY0IDEzOTEgNDI1VDEyNzAgMTg3VDEwNjYgMzRUNzc0IC0yMFE2MDYgLTIwIDQ4MyAzNFQyNzkgMTg3VDE1OSA0MjVUMTE5IDczNVExMTkgOTA1IDE1OCAxMDQzVDI3OSAxMjgwVDQ4MyAxNDMxVDc3NiAxNDg1UTk0NCAxNDg1IDEwNjcgMTQzMlQxMjcwIDEyODBUMTM5MCAxMDQzVDE0MzAKKzczM1pNNDM4IDczM1E0MzggNjE4IDQ1OCA1MjdUNTE5IDM3MlQ2MjQgMjc0VDc3NCAyNDBRODYzIDI0MCA5MjYgMjc0VDEwMzAgMzcxVDEwOTAgNTI2VDExMTAgNzMzUTExMTAgODQ4IDEwOTEgOTM5VDEwMzEgMTA5NVQ5MjcgMTE5M1Q3NzYgMTIyN1E2ODkgMTIyNyA2MjUgMTE5M1Q1MjAgMTA5NVQ0NTggOTQwVDQzOCA3MzNaTTcyOSAxNTc5UTY5NSAxNjA3IDY0OCAxNjQ4VDU1NCAxNzM0VDQ3MCAxODE4VDQxNiAxODg2VjE5MDdINzU4UTc3NAorMTg3MyA3OTUgMTgzM1Q4NDAgMTc1MlQ4ODcgMTY3M1Q5MzIgMTYwNlYxNTc5SDcyOVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDM7IiBnbHlwaC1uYW1lPSJPYWN1dGUiIGhvcml6LWFkdi14PSIxNTQ4IiBkPSJNMTQzMCA3MzNRMTQzMCA1NjQgMTM5MSA0MjVUMTI3MCAxODdUMTA2NiAzNFQ3NzQgLTIwUTYwNiAtMjAgNDgzIDM0VDI3OSAxODdUMTU5IDQyNVQxMTkgNzM1UTExOSA5MDUgMTU4IDEwNDNUMjc5IDEyODBUNDgzIDE0MzFUNzc2IDE0ODVROTQ0IDE0ODUgMTA2NyAxNDMyVDEyNzAgMTI4MFQxMzkwIDEwNDNUMTQzMAorNzMzWk00MzggNzMzUTQzOCA2MTggNDU4IDUyN1Q1MTkgMzcyVDYyNCAyNzRUNzc0IDI0MFE4NjMgMjQwIDkyNiAyNzRUMTAzMCAzNzFUMTA5MCA1MjZUMTExMCA3MzNRMTExMCA4NDggMTA5MSA5MzlUMTAzMSAxMDk1VDkyNyAxMTkzVDc3NiAxMjI3UTY4OSAxMjI3IDYyNSAxMTkzVDUyMCAxMDk1VDQ1OCA5NDBUNDM4IDczM1pNNTkwIDE1NzlWMTYwNlE2MTEgMTYzNSA2MzUgMTY3M1Q2ODIgMTc1MVQ3MjcgMTgzMlQ3NjQgMTkwN0gxMTA2VjE4ODZRMTA5NQorMTg2OCAxMDc0IDE4NDRUMTAyNiAxNzkxVDk2OCAxNzM0VDkwNiAxNjc2VDg0NSAxNjIzVDc5MyAxNTc5SDU5MFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDQ7IiBnbHlwaC1uYW1lPSJPY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjE1NDgiIGQ9Ik0xNDMwIDczM1ExNDMwIDU2NCAxMzkxIDQyNVQxMjcwIDE4N1QxMDY2IDM0VDc3NCAtMjBRNjA2IC0yMCA0ODMgMzRUMjc5IDE4N1QxNTkgNDI1VDExOSA3MzVRMTE5IDkwNSAxNTggMTA0M1QyNzkgMTI4MFQ0ODMgMTQzMVQ3NzYgMTQ4NVE5NDQgMTQ4NSAxMDY3IDE0MzJUMTI3MCAxMjgwVDEzOTAKKzEwNDNUMTQzMCA3MzNaTTQzOCA3MzNRNDM4IDYxOCA0NTggNTI3VDUxOSAzNzJUNjI0IDI3NFQ3NzQgMjQwUTg2MyAyNDAgOTI2IDI3NFQxMDMwIDM3MVQxMDkwIDUyNlQxMTEwIDczM1ExMTEwIDg0OCAxMDkxIDkzOVQxMDMxIDEwOTVUOTI3IDExOTNUNzc2IDEyMjdRNjg5IDEyMjcgNjI1IDExOTNUNTIwIDEwOTVUNDU4IDk0MFQ0MzggNzMzWk05NzUgMTU3OVE5MjQgMTYxMyA4NjkgMTY1NlQ3NjIgMTc1NVE3MDggMTY5OQorNjU2IDE2NTZUNTUzIDE1NzlIMzUwVjE2MDZRMzc2IDE2MzUgNDA3IDE2NzNUNDcxIDE3NTFUNTM0IDE4MzJUNTg2IDE5MDdIOTQyUTk2MyAxODczIDk5MyAxODMzVDEwNTUgMTc1MlQxMTIwIDE2NzNUMTE3OCAxNjA2VjE1NzlIOTc1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkNTsiIGdseXBoLW5hbWU9Ik90aWxkZSIgaG9yaXotYWR2LXg9IjE1NDgiIGQ9Ik0xNDMwIDczM1ExNDMwIDU2NCAxMzkxIDQyNVQxMjcwIDE4N1QxMDY2IDM0VDc3NCAtMjBRNjA2IC0yMCA0ODMgMzRUMjc5IDE4N1QxNTkgNDI1VDExOSA3MzVRMTE5IDkwNSAxNTggMTA0M1QyNzkgMTI4MFQ0ODMgMTQzMVQ3NzYgMTQ4NVE5NDQgMTQ4NSAxMDY3IDE0MzJUMTI3MCAxMjgwVDEzOTAgMTA0M1QxNDMwCis3MzNaTTQzOCA3MzNRNDM4IDYxOCA0NTggNTI3VDUxOSAzNzJUNjI0IDI3NFQ3NzQgMjQwUTg2MyAyNDAgOTI2IDI3NFQxMDMwIDM3MVQxMDkwIDUyNlQxMTEwIDczM1ExMTEwIDg0OCAxMDkxIDkzOVQxMDMxIDEwOTVUOTI3IDExOTNUNzc2IDEyMjdRNjg5IDEyMjcgNjI1IDExOTNUNTIwIDEwOTVUNDU4IDk0MFQ0MzggNzMzWk02MTIgMTY4NFE1ODEgMTY4NCA1NjMgMTY1OFQ1MzIgMTU3N0gzODNRMzg5IDE2NTcgNDA5IDE3MTVUNDYxCisxODExVDUzOCAxODY3VDYzNSAxODg2UTY3NiAxODg2IDcxNSAxODcwVDc5MiAxODM1VDg2OCAxNzk5VDk0MiAxNzgyUTk3MyAxNzgyIDk5MSAxODA4VDEwMjIgMTg4OEgxMTcxUTExNjUgMTgwOSAxMTQ1IDE3NTFUMTA5MSAxNjU1VDEwMTUgMTU5OFQ5MTkgMTU3OVE4NzkgMTU3OSA4MzkgMTU5NVQ3NjEgMTYzMVQ2ODYgMTY2N1Q2MTIgMTY4NFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDY7IiBnbHlwaC1uYW1lPSJPZGllcmVzaXMiIGhvcml6LWFkdi14PSIxNTQ4IiBkPSJNMTQzMCA3MzNRMTQzMCA1NjQgMTM5MSA0MjVUMTI3MCAxODdUMTA2NiAzNFQ3NzQgLTIwUTYwNiAtMjAgNDgzIDM0VDI3OSAxODdUMTU5IDQyNVQxMTkgNzM1UTExOSA5MDUgMTU4IDEwNDNUMjc5IDEyODBUNDgzIDE0MzFUNzc2IDE0ODVROTQ0IDE0ODUgMTA2NyAxNDMyVDEyNzAgMTI4MFQxMzkwIDEwNDNUMTQzMAorNzMzWk00MzggNzMzUTQzOCA2MTggNDU4IDUyN1Q1MTkgMzcyVDYyNCAyNzRUNzc0IDI0MFE4NjMgMjQwIDkyNiAyNzRUMTAzMCAzNzFUMTA5MCA1MjZUMTExMCA3MzNRMTExMCA4NDggMTA5MSA5MzlUMTAzMSAxMDk1VDkyNyAxMTkzVDc3NiAxMjI3UTY4OSAxMjI3IDYyNSAxMTkzVDUyMCAxMDk1VDQ1OCA5NDBUNDM4IDczM1pNNDI4IDE3NDNRNDI4IDE3NzggNDM5IDE4MDNUNDY4IDE4NDVUNTEyIDE4NzBUNTY3IDE4NzhRNTk2CisxODc4IDYyMSAxODcwVDY2NiAxODQ2VDY5NiAxODA0VDcwOCAxNzQzUTcwOCAxNzA5IDY5NyAxNjg0VDY2NiAxNjQzVDYyMiAxNjE4VDU2NyAxNjEwUTUzOCAxNjEwIDUxMyAxNjE4VDQ2OSAxNjQyVDQzOSAxNjg0VDQyOCAxNzQzWk04MzEgMTc0M1E4MzEgMTc3OCA4NDIgMTgwM1Q4NzIgMTg0NVQ5MTcgMTg3MFQ5NzMgMTg3OFExMDAxIDE4NzggMTAyNiAxODcwVDEwNzEgMTg0NlQxMTAyIDE4MDRUMTExNCAxNzQzUTExMTQKKzE3MDkgMTEwMyAxNjg0VDEwNzIgMTY0M1QxMDI3IDE2MThUOTczIDE2MTBROTEzIDE2MTAgODcyIDE2NDNUODMxIDE3NDNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGQ3OyIgZ2x5cGgtbmFtZT0ibXVsdGlwbHkiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNDA4IDcyM0wxMDkgMTAyNEwyNjAgMTE3OEw1NjEgODc5TDg2NiAxMTc4TDEwMjAgMTAyOEw3MTUgNzIzTDEwMTYgNDIwTDg2NiAyNjhMNTYxIDU2OUwyNjAgMjcwTDExMSA0MjJMNDA4IDcyM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDg7IiBnbHlwaC1uYW1lPSJPc2xhc2giIGhvcml6LWFkdi14PSIxNTQ4IiBkPSJNMTQzMCA3MzNRMTQzMCA1NjQgMTM5MSA0MjVUMTI3MCAxODdUMTA2NiAzNFQ3NzQgLTIwUTU5NSAtMjAgNDY3IDQxTDM5NSAtNzZMMjI3IDE4TDMwOSAxNTJRMjEyIDI1MiAxNjYgNDAwVDExOSA3MzVRMTE5IDkwNSAxNTggMTA0M1QyNzkgMTI4MFQ0ODMgMTQzMVQ3NzYgMTQ4NVE4NjcgMTQ4NSA5NDQgMTQ2OVQxMDg3CisxNDIxTDExNTcgMTUzMkwxMzIzIDE0MzZMMTI0MyAxMzA3UTEzMzcgMTIwOCAxMzgzIDEwNjNUMTQzMCA3MzNaTTQzOCA3MzNRNDM4IDU1MyA0ODUgNDM4TDk0MiAxMTg0UTg3MyAxMjI3IDc3NiAxMjI3UTY4OSAxMjI3IDYyNSAxMTkzVDUyMCAxMDk1VDQ1OCA5NDBUNDM4IDczM1pNMTExMCA3MzNRMTExMCA5MDQgMTA2NyAxMDIwTDYxMiAyNzlRNjQ2IDI2MCA2ODYgMjUwVDc3NCAyNDBRODYzIDI0MCA5MjYgMjc0VDEwMzAKKzM3MVQxMDkwIDUyNlQxMTEwIDczM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDk7IiBnbHlwaC1uYW1lPSJVZ3JhdmUiIGhvcml6LWFkdi14PSIxNDY2IiBkPSJNMTI5MiAxNDYyVjUxNlExMjkyIDQwMiAxMjU4IDMwNFQxMTUzIDEzNFQ5NzYgMjFUNzI3IC0yMFE1OTIgLTIwIDQ4OSAxOFQzMTYgMTI4VDIxMCAyOThUMTc0IDUyMFYxNDYySDQ4M1Y1NDNRNDgzIDQ2MiA0OTkgNDA1VDU0NiAzMTFUNjI1IDI1N1Q3MzUgMjQwUTg2NiAyNDAgOTI0IDMxNlQ5ODMgNTQ1VjE0NjJIMTI5MlpNNzA2CisxNTc5UTY3MiAxNjA3IDYyNSAxNjQ4VDUzMSAxNzM0VDQ0NyAxODE4VDM5MyAxODg2VjE5MDdINzM1UTc1MSAxODczIDc3MiAxODMzVDgxNyAxNzUyVDg2NCAxNjczVDkwOSAxNjA2VjE1NzlINzA2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkYTsiIGdseXBoLW5hbWU9IlVhY3V0ZSIgaG9yaXotYWR2LXg9IjE0NjYiIGQ9Ik0xMjkyIDE0NjJWNTE2UTEyOTIgNDAyIDEyNTggMzA0VDExNTMgMTM0VDk3NiAyMVQ3MjcgLTIwUTU5MiAtMjAgNDg5IDE4VDMxNiAxMjhUMjEwIDI5OFQxNzQgNTIwVjE0NjJINDgzVjU0M1E0ODMgNDYyIDQ5OSA0MDVUNTQ2IDMxMVQ2MjUgMjU3VDczNSAyNDBRODY2IDI0MCA5MjQgMzE2VDk4MyA1NDVWMTQ2MkgxMjkyWk01NzAKKzE1NzlWMTYwNlE1OTEgMTYzNSA2MTUgMTY3M1Q2NjIgMTc1MVQ3MDcgMTgzMlQ3NDQgMTkwN0gxMDg2VjE4ODZRMTA3NSAxODY4IDEwNTQgMTg0NFQxMDA2IDE3OTFUOTQ4IDE3MzRUODg2IDE2NzZUODI1IDE2MjNUNzczIDE1NzlINTcwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkYjsiIGdseXBoLW5hbWU9IlVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMTQ2NiIgZD0iTTEyOTIgMTQ2MlY1MTZRMTI5MiA0MDIgMTI1OCAzMDRUMTE1MyAxMzRUOTc2IDIxVDcyNyAtMjBRNTkyIC0yMCA0ODkgMThUMzE2IDEyOFQyMTAgMjk4VDE3NCA1MjBWMTQ2Mkg0ODNWNTQzUTQ4MyA0NjIgNDk5IDQwNVQ1NDYgMzExVDYyNSAyNTdUNzM1IDI0MFE4NjYgMjQwIDkyNCAzMTZUOTgzIDU0NVYxNDYySDEyOTJaTTk0MgorMTU3OVE4OTEgMTYxMyA4MzYgMTY1NlQ3MjkgMTc1NVE2NzUgMTY5OSA2MjMgMTY1NlQ1MjAgMTU3OUgzMTdWMTYwNlEzNDMgMTYzNSAzNzQgMTY3M1Q0MzggMTc1MVQ1MDEgMTgzMlQ1NTMgMTkwN0g5MDlROTMwIDE4NzMgOTYwIDE4MzNUMTAyMiAxNzUyVDEwODcgMTY3M1QxMTQ1IDE2MDZWMTU3OUg5NDJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGRjOyIgZ2x5cGgtbmFtZT0iVWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMTQ2NiIgZD0iTTEyOTIgMTQ2MlY1MTZRMTI5MiA0MDIgMTI1OCAzMDRUMTE1MyAxMzRUOTc2IDIxVDcyNyAtMjBRNTkyIC0yMCA0ODkgMThUMzE2IDEyOFQyMTAgMjk4VDE3NCA1MjBWMTQ2Mkg0ODNWNTQzUTQ4MyA0NjIgNDk5IDQwNVQ1NDYgMzExVDYyNSAyNTdUNzM1IDI0MFE4NjYgMjQwIDkyNCAzMTZUOTgzIDU0NVYxNDYySDEyOTJaTTM5MworMTc0M1EzOTMgMTc3OCA0MDQgMTgwM1Q0MzMgMTg0NVQ0NzcgMTg3MFQ1MzIgMTg3OFE1NjEgMTg3OCA1ODYgMTg3MFQ2MzEgMTg0NlQ2NjEgMTgwNFQ2NzMgMTc0M1E2NzMgMTcwOSA2NjIgMTY4NFQ2MzEgMTY0M1Q1ODcgMTYxOFQ1MzIgMTYxMFE1MDMgMTYxMCA0NzggMTYxOFQ0MzQgMTY0MlQ0MDQgMTY4NFQzOTMgMTc0M1pNNzk2IDE3NDNRNzk2IDE3NzggODA3IDE4MDNUODM3IDE4NDVUODgyIDE4NzBUOTM4IDE4NzhROTY2CisxODc4IDk5MSAxODcwVDEwMzYgMTg0NlQxMDY3IDE4MDRUMTA3OSAxNzQzUTEwNzkgMTcwOSAxMDY4IDE2ODRUMTAzNyAxNjQzVDk5MiAxNjE4VDkzOCAxNjEwUTg3OCAxNjEwIDgzNyAxNjQzVDc5NiAxNzQzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkZDsiIGdseXBoLW5hbWU9IllhY3V0ZSIgaG9yaXotYWR2LXg9IjExOTYiIGQ9Ik01OTggODYwTDg2MiAxNDYySDExOTZMNzUyIDU2OVYwSDQ0NFY1NTlMMCAxNDYySDMzNkw1OTggODYwWk00MjIgMTU3OVYxNjA2UTQ0MyAxNjM1IDQ2NyAxNjczVDUxNCAxNzUxVDU1OSAxODMyVDU5NiAxOTA3SDkzOFYxODg2UTkyNyAxODY4IDkwNiAxODQ0VDg1OCAxNzkxVDgwMCAxNzM0VDczOCAxNjc2VDY3NworMTYyM1Q2MjUgMTU3OUg0MjJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGRlOyIgZ2x5cGgtbmFtZT0iVGhvcm4iIGhvcml6LWFkdi14PSIxMjI1IiBkPSJNMTEzMyA3NzBRMTEzMyA2NzYgMTEwOCA1OTBUMTAyNCA0MzhUODcwIDMzM1Q2MzMgMjkzSDQ5NFYwSDE4NFYxNDYySDQ5NFYxMjMzSDY1NVE3NzkgMTIzMyA4NjkgMTIwMFQxMDE3IDExMDdUMTEwNCA5NjFUMTEzMyA3NzBaTTQ5NCA1NDNINTc4UTY5OSA1NDMgNzU5IDU5NVQ4MTkgNzcwUTgxOSA4NzggNzY2Cis5MjlUNTk4IDk4MUg0OTRWNTQzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkZjsiIGdseXBoLW5hbWU9Imdlcm1hbmRibHMiIGhvcml6LWFkdi14PSIxMzk1IiBkPSJNMTE4OCAxMjQxUTExODggMTE3NyAxMTY3IDExMjlUMTExNCAxMDQyVDEwNDUgOTc1VDk3NiA5MjJUOTIzIDg3N1Q5MDEgODM0UTkwMSA4MTQgOTEzIDc5N1Q5NTIgNzYwVDEwMjAgNzE1VDExMTggNjUxUTExNjcgNjIwIDEyMDUgNTg4VDEyNjkgNTE3VDEzMDkgNDMyVDEzMjMgMzI2UTEzMjMgMTU0IDEyMDYKKzY3VDg2MiAtMjBRNzY0IC0yMCA2OTIgLTZUNTU5IDQzVjI4NVE1ODMgMjY5IDYxNyAyNTRUNjkwIDIyNlQ3NjggMjA3VDg0MiAxOTlROTIyIDE5OSA5NjYgMjI5VDEwMTAgMzIyUTEwMTAgMzQ5IDEwMDMgMzcwVDk3NiA0MTJUOTE4IDQ1N1Q4MjEgNTE2UTc1OCA1NTIgNzE2IDU4NFQ2NDcgNjQ3VDYwOSA3MTNUNTk4IDc4OFE1OTggODQxIDYxOCA4ODBUNjcwIDk1MFQ3MzcgMTAwN1Q4MDUgMTA1OVQ4NTYgMTExN1Q4NzcgMTE4OFE4NzcKKzEyNTEgODI3IDEyOTBUNjgwIDEzMjlRNTcyIDEzMjkgNTE5IDEyODFUNDY1IDExMjhWMEgxNjBWMTEzOVExNjAgMTI0OCAxOTcgMTMyOFQzMDIgMTQ2MlQ0NjcgMTU0MVQ2ODAgMTU2N1E3OTUgMTU2NyA4ODkgMTU0NlQxMDQ5IDE0ODNUMTE1MiAxMzgwVDExODggMTI0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA7IiBnbHlwaC1uYW1lPSJhZ3JhdmUiIGhvcml6LWFkdi14PSIxMTc2IiBkPSJNODA5IDBMNzUwIDE1Mkg3NDFRNzA4IDEwNyA2NzUgNzVUNjAzIDIxVDUxNiAtMTBUNDAzIC0yMFEzMzUgLTIwIDI3NyAxVDE3NyA2NlQxMTAgMTc2VDg2IDMzNFE4NiA1MTIgMjAwIDU5NlQ1NDEgNjkwTDcxOSA2OTZWNzgwUTcxOSA4NDkgNjc5IDg4MlQ1NjcgOTE1UTQ5NSA5MTUgNDI3IDg5NFQyODkgODM4TDE5MAorMTA0MFEyNzQgMTA4NyAzNzYgMTExNFQ1OTAgMTE0MVE3OTkgMTE0MSA5MTAgMTA0M1QxMDIyIDc0NVYwSDgwOVpNNzE5IDUxOEw2MTggNTE0UTU1NyA1MTIgNTE1IDQ5OFQ0NDggNDYxVDQxMSA0MDVUMzk5IDMzMlEzOTkgMjYyIDQzMyAyMzNUNTIyIDIwM1E1NjQgMjAzIDYwMCAyMTdUNjYyIDI2MFQ3MDQgMzMwVDcxOSA0MjZWNTE4Wk04MDggMTI0MVE3NzQgMTI2OSA3MjcgMTMxMFQ2MzMgMTM5NlQ1NDkgMTQ4MFQ0OTUgMTU0OFYxNTY5SDgzN1E4NTMKKzE1MzUgODc0IDE0OTVUOTE5IDE0MTRUOTY2IDEzMzVUMTAxMSAxMjY4VjEyNDFIODA4WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTsiIGdseXBoLW5hbWU9ImFhY3V0ZSIgaG9yaXotYWR2LXg9IjExNzYiIGQ9Ik04MDkgMEw3NTAgMTUySDc0MVE3MDggMTA3IDY3NSA3NVQ2MDMgMjFUNTE2IC0xMFQ0MDMgLTIwUTMzNSAtMjAgMjc3IDFUMTc3IDY2VDExMCAxNzZUODYgMzM0UTg2IDUxMiAyMDAgNTk2VDU0MSA2OTBMNzE5IDY5NlY3ODBRNzE5IDg0OSA2NzkgODgyVDU2NyA5MTVRNDk1IDkxNSA0MjcgODk0VDI4OSA4MzhMMTkwCisxMDQwUTI3NCAxMDg3IDM3NiAxMTE0VDU5MCAxMTQxUTc5OSAxMTQxIDkxMCAxMDQzVDEwMjIgNzQ1VjBIODA5Wk03MTkgNTE4TDYxOCA1MTRRNTU3IDUxMiA1MTUgNDk4VDQ0OCA0NjFUNDExIDQwNVQzOTkgMzMyUTM5OSAyNjIgNDMzIDIzM1Q1MjIgMjAzUTU2NCAyMDMgNjAwIDIxN1Q2NjIgMjYwVDcwNCAzMzBUNzE5IDQyNlY1MThaTTQ0MSAxMjQxVjEyNjhRNDYyIDEyOTcgNDg2IDEzMzVUNTMzIDE0MTNUNTc4IDE0OTRUNjE1CisxNTY5SDk1N1YxNTQ4UTk0NiAxNTMwIDkyNSAxNTA2VDg3NyAxNDUzVDgxOSAxMzk2VDc1NyAxMzM4VDY5NiAxMjg1VDY0NCAxMjQxSDQ0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTI7IiBnbHlwaC1uYW1lPSJhY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjExNzYiIGQ9Ik04MDkgMEw3NTAgMTUySDc0MVE3MDggMTA3IDY3NSA3NVQ2MDMgMjFUNTE2IC0xMFQ0MDMgLTIwUTMzNSAtMjAgMjc3IDFUMTc3IDY2VDExMCAxNzZUODYgMzM0UTg2IDUxMiAyMDAgNTk2VDU0MSA2OTBMNzE5IDY5NlY3ODBRNzE5IDg0OSA2NzkgODgyVDU2NyA5MTVRNDk1IDkxNSA0MjcgODk0VDI4OQorODM4TDE5MCAxMDQwUTI3NCAxMDg3IDM3NiAxMTE0VDU5MCAxMTQxUTc5OSAxMTQxIDkxMCAxMDQzVDEwMjIgNzQ1VjBIODA5Wk03MTkgNTE4TDYxOCA1MTRRNTU3IDUxMiA1MTUgNDk4VDQ0OCA0NjFUNDExIDQwNVQzOTkgMzMyUTM5OSAyNjIgNDMzIDIzM1Q1MjIgMjAzUTU2NCAyMDMgNjAwIDIxN1Q2NjIgMjYwVDcwNCAzMzBUNzE5IDQyNlY1MThaTTgwMSAxNDk2UTc1MCAxNTMwIDY5NSAxNTczVDU4OCAxNjcyUTUzNCAxNjE2Cis0ODIgMTU3M1QzNzkgMTQ5NkgxNzZWMTUyM1EyMDIgMTU1MiAyMzMgMTU5MFQyOTcgMTY2OFQzNjAgMTc0OVQ0MTIgMTgyNEg3NjhRNzg5IDE3OTAgODE5IDE3NTBUODgxIDE2NjlUOTQ2IDE1OTBUMTAwNCAxNTIzVjE0OTZIODAxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMzsiIGdseXBoLW5hbWU9ImF0aWxkZSIgaG9yaXotYWR2LXg9IjExNzYiIGQ9Ik04MDkgMEw3NTAgMTUySDc0MVE3MDggMTA3IDY3NSA3NVQ2MDMgMjFUNTE2IC0xMFQ0MDMgLTIwUTMzNSAtMjAgMjc3IDFUMTc3IDY2VDExMCAxNzZUODYgMzM0UTg2IDUxMiAyMDAgNTk2VDU0MSA2OTBMNzE5IDY5NlY3ODBRNzE5IDg0OSA2NzkgODgyVDU2NyA5MTVRNDk1IDkxNSA0MjcgODk0VDI4OSA4MzhMMTkwCisxMDQwUTI3NCAxMDg3IDM3NiAxMTE0VDU5MCAxMTQxUTc5OSAxMTQxIDkxMCAxMDQzVDEwMjIgNzQ1VjBIODA5Wk03MTkgNTE4TDYxOCA1MTRRNTU3IDUxMiA1MTUgNDk4VDQ0OCA0NjFUNDExIDQwNVQzOTkgMzMyUTM5OSAyNjIgNDMzIDIzM1Q1MjIgMjAzUTU2NCAyMDMgNjAwIDIxN1Q2NjIgMjYwVDcwNCAzMzBUNzE5IDQyNlY1MThaTTY4MSAxMzQ2UTY1MCAxMzQ2IDYzMiAxMzIwVDYwMSAxMjM5SDQ1MlE0NTggMTMxOSA0NzgKKzEzNzdUNTMwIDE0NzNUNjA3IDE1MjlUNzA0IDE1NDhRNzQ1IDE1NDggNzg0IDE1MzJUODYxIDE0OTdUOTM3IDE0NjFUMTAxMSAxNDQ0UTEwNDIgMTQ0NCAxMDYwIDE0NzBUMTA5MSAxNTUwSDEyNDBRMTIzNCAxNDcxIDEyMTQgMTQxM1QxMTYwIDEzMTdUMTA4NCAxMjYwVDk4OCAxMjQxUTk0OCAxMjQxIDkwOCAxMjU3VDgzMCAxMjkzVDc1NSAxMzI5VDY4MSAxMzQ2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlNDsiIGdseXBoLW5hbWU9ImFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjExNzYiIGQ9Ik04MDkgMEw3NTAgMTUySDc0MVE3MDggMTA3IDY3NSA3NVQ2MDMgMjFUNTE2IC0xMFQ0MDMgLTIwUTMzNSAtMjAgMjc3IDFUMTc3IDY2VDExMCAxNzZUODYgMzM0UTg2IDUxMiAyMDAgNTk2VDU0MSA2OTBMNzE5IDY5NlY3ODBRNzE5IDg0OSA2NzkgODgyVDU2NyA5MTVRNDk1IDkxNSA0MjcgODk0VDI4OQorODM4TDE5MCAxMDQwUTI3NCAxMDg3IDM3NiAxMTE0VDU5MCAxMTQxUTc5OSAxMTQxIDkxMCAxMDQzVDEwMjIgNzQ1VjBIODA5Wk03MTkgNTE4TDYxOCA1MTRRNTU3IDUxMiA1MTUgNDk4VDQ0OCA0NjFUNDExIDQwNVQzOTkgMzMyUTM5OSAyNjIgNDMzIDIzM1Q1MjIgMjAzUTU2NCAyMDMgNjAwIDIxN1Q2NjIgMjYwVDcwNCAzMzBUNzE5IDQyNlY1MThaTTI1NCAxNDA1UTI1NCAxNDQwIDI2NSAxNDY1VDI5NCAxNTA3VDMzOCAxNTMyVDM5MworMTU0MFE0MjIgMTU0MCA0NDcgMTUzMlQ0OTIgMTUwOFQ1MjIgMTQ2NlQ1MzQgMTQwNVE1MzQgMTM3MSA1MjMgMTM0NlQ0OTIgMTMwNVQ0NDggMTI4MFQzOTMgMTI3MlEzNjQgMTI3MiAzMzkgMTI4MFQyOTUgMTMwNFQyNjUgMTM0NlQyNTQgMTQwNVpNNjU3IDE0MDVRNjU3IDE0NDAgNjY4IDE0NjVUNjk4IDE1MDdUNzQzIDE1MzJUNzk5IDE1NDBRODI3IDE1NDAgODUyIDE1MzJUODk3IDE1MDhUOTI4IDE0NjZUOTQwIDE0MDVROTQwCisxMzcxIDkyOSAxMzQ2VDg5OCAxMzA1VDg1MyAxMjgwVDc5OSAxMjcyUTczOSAxMjcyIDY5OCAxMzA1VDY1NyAxNDA1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlNTsiIGdseXBoLW5hbWU9ImFyaW5nIiBob3Jpei1hZHYteD0iMTE3NiIgZD0iTTgwOSAwTDc1MCAxNTJINzQxUTcwOCAxMDcgNjc1IDc1VDYwMyAyMVQ1MTYgLTEwVDQwMyAtMjBRMzM1IC0yMCAyNzcgMVQxNzcgNjZUMTEwIDE3NlQ4NiAzMzRRODYgNTEyIDIwMCA1OTZUNTQxIDY5MEw3MTkgNjk2Vjc4MFE3MTkgODQ5IDY3OSA4ODJUNTY3IDkxNVE0OTUgOTE1IDQyNyA4OTRUMjg5IDgzOEwxOTAKKzEwNDBRMjc0IDEwODcgMzc2IDExMTRUNTkwIDExNDFRNzk5IDExNDEgOTEwIDEwNDNUMTAyMiA3NDVWMEg4MDlaTTcxOSA1MThMNjE4IDUxNFE1NTcgNTEyIDUxNSA0OThUNDQ4IDQ2MVQ0MTEgNDA1VDM5OSAzMzJRMzk5IDI2MiA0MzMgMjMzVDUyMiAyMDNRNTY0IDIwMyA2MDAgMjE3VDY2MiAyNjBUNzA0IDMzMFQ3MTkgNDI2VjUxOFpNODQyIDE0NzlRODQyIDE0MjMgODIzIDEzNzlUNzY5IDEzMDNUNjg4IDEyNTZUNTg4IDEyMzlRNTMzCisxMjM5IDQ4NyAxMjU1VDQwOSAxMzAyVDM1OCAxMzc3VDM0MCAxNDc3UTM0MCAxNTMyIDM1OCAxNTc2VDQwOCAxNjUwVDQ4NyAxNjk3VDU4OCAxNzE0UTY0MSAxNzE0IDY4NyAxNjk4VDc2NyAxNjUxVDgyMiAxNTc3VDg0MiAxNDc5Wk02ODQgMTQ3N1E2ODQgMTUyMiA2NTcgMTU0N1Q1ODggMTU3M1E1NDYgMTU3MyA1MTkgMTU0OFQ0OTIgMTQ3N1E0OTIgMTQzMiA1MTYgMTQwNlQ1ODggMTM4MFE2MzAgMTM4MCA2NTcgMTQwNlQ2ODQKKzE0NzdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGU2OyIgZ2x5cGgtbmFtZT0iYWUiIGhvcml6LWFkdi14PSIxODA2IiBkPSJNMTI2OCAtMjBRMTEzNyAtMjAgMTAzMCAzMFQ4NTQgMTg2UTgxMSAxMzIgNzY5IDk0VDY3OCAzMFQ1NjggLThUNDI0IC0yMFEzNTYgLTIwIDI5NSAxVDE4NyA2NlQxMTMgMTc2VDg2IDMzNFE4NiA1MTIgMjAwIDU5NlQ1NDEgNjkwTDcxOSA2OTZWNzgwUTcxOSA4NDkgNjc5IDg4MlQ1NjcgOTE1UTQ5NSA5MTUgNDI3Cis4OTRUMjg5IDgzOEwxOTAgMTA0MFEyNzQgMTA4NyAzNzYgMTExNFQ1OTAgMTE0MVE4MDQgMTE0MSA5MTMgMTAxMFExMDM5IDExMzkgMTIyNyAxMTM5UTEzMzggMTEzOSAxNDI3IDExMDZUMTU3OSAxMDA3VDE2NzQgODQ4VDE3MDggNjMxVjQ4M0gxMDI2UTEwMjggNDE5IDEwNDYgMzY4VDEwOTggMjgxVDExNzkgMjI2VDEyODggMjA3UTEzODIgMjA3IDE0NjkgMjI4VDE2NDUgMjk1VjU5UTE2MDUgMzggMTU2NSAyNFQxNDc5IC0xVDEzODIKKy0xNVQxMjY4IC0yMFpNNzE5IDUxOEw2MTggNTE0UTU1NyA1MTIgNTE1IDQ5OFQ0NDggNDYxVDQxMSA0MDVUMzk5IDMzMlEzOTkgMjYyIDQzMyAyMzNUNTIyIDIwM1E1NjQgMjAzIDYwMCAyMTdUNjYyIDI2MFQ3MDQgMzMwVDcxOSA0MjZWNTE4Wk0xMjI5IDkyMlExMTQ3IDkyMiAxMDk0IDg2NVQxMDMyIDY4NkgxNDIxUTE0MjAgNzM3IDE0MDggNzgwVDEzNzMgODU0VDEzMTMgOTA0VDEyMjkgOTIyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlNzsiIGdseXBoLW5hbWU9ImNjZWRpbGxhIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTYyNSAtMjBRNTA1IC0yMCA0MDkgMTNUMjQ0IDExNVQxMzkgMjkzVDEwMiA1NTNRMTAyIDcyMCAxMzkgODMyVDI0NSAxMDEzVDQxMCAxMTEwVDYyNSAxMTM5UTcxMSAxMTM5IDc5NiAxMTE4VDk1NiAxMDU5TDg2OCA4MjdRODAyIDg1NiA3NDEgODc0VDYyNSA4OTNRNTE0IDg5MyA0NjQgODA5VDQxNCA1NTVRNDE0CiszODcgNDY0IDMwN1Q2MjEgMjI3UTcwOCAyMjcgNzc5IDI0OVQ5MjQgMzA3VjUzUTg4NyAzNSA4NTIgMjFUNzgyIC0yVDcwOCAtMTVUNjI1IC0yMFpNNzc4IC0yNTBRNzc4IC0zMDcgNzYzIC0zNTJUNzExIC00MjhUNjE2IC00NzVUNDY5IC00OTJRNDI0IC00OTIgMzg4IC00ODZUMzIzIC00NzFWLTMwM1EzMzggLTMwNyAzNTYgLTMxMFQzOTQgLTMxN1Q0MzIgLTMyMlQ0NjYgLTMyNFE0OTUgLTMyNCA1MTYgLTMxMVQ1MzggLTI2MlE1MzgKKy0yMjUgNTAxIC0xOTdUMzcyIC0xNTRMNDUwIDBINjQzTDYxNiAtNjFRNjQ3IC03MSA2NzYgLTg4VDcyNyAtMTI4VDc2NCAtMTgyVDc3OCAtMjUwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlODsiIGdseXBoLW5hbWU9ImVncmF2ZSIgaG9yaXotYWR2LXg9IjExOTAiIGQ9Ik02MTIgOTIyUTUzMSA5MjIgNDc4IDg2NVQ0MTYgNjg2SDgwNVE4MDQgNzM3IDc5MiA3ODBUNzU2IDg1NFQ2OTYgOTA0VDYxMiA5MjJaTTY1MSAtMjBRNTMxIC0yMCA0MzAgMTVUMjU2IDEyMFQxNDMgMjk4VDEwMiA1NTFRMTAyIDY5OCAxMzkgODA4VDI0MiA5OTFUNDAyIDExMDJUNjEwIDExMzlRNzIxIDExMzkKKzgxMCAxMTA2VDk2MiAxMDA3VDEwNTggODQ4VDEwOTIgNjMxVjQ4M0g0MTBRNDEyIDQxOSA0MzAgMzY4VDQ4MiAyODFUNTYzIDIyNlQ2NzIgMjA3UTcyMyAyMDcgNzY4IDIxMlQ4NTcgMjI5VDk0MiAyNTZUMTAyOCAyOTVWNTlROTg4IDM4IDk0OCAyNFQ4NjIgLTFUNzY1IC0xNVQ2NTEgLTIwWk04MzQgMTI0MVE4MDAgMTI2OSA3NTMgMTMxMFQ2NTkgMTM5NlQ1NzUgMTQ4MFQ1MjEgMTU0OFYxNTY5SDg2M1E4NzkgMTUzNSA5MDAKKzE0OTVUOTQ1IDE0MTRUOTkyIDEzMzVUMTAzNyAxMjY4VjEyNDFIODM0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlOTsiIGdseXBoLW5hbWU9ImVhY3V0ZSIgaG9yaXotYWR2LXg9IjExOTAiIGQ9Ik02MTIgOTIyUTUzMSA5MjIgNDc4IDg2NVQ0MTYgNjg2SDgwNVE4MDQgNzM3IDc5MiA3ODBUNzU2IDg1NFQ2OTYgOTA0VDYxMiA5MjJaTTY1MSAtMjBRNTMxIC0yMCA0MzAgMTVUMjU2IDEyMFQxNDMgMjk4VDEwMiA1NTFRMTAyIDY5OCAxMzkgODA4VDI0MiA5OTFUNDAyIDExMDJUNjEwIDExMzlRNzIxIDExMzkKKzgxMCAxMTA2VDk2MiAxMDA3VDEwNTggODQ4VDEwOTIgNjMxVjQ4M0g0MTBRNDEyIDQxOSA0MzAgMzY4VDQ4MiAyODFUNTYzIDIyNlQ2NzIgMjA3UTcyMyAyMDcgNzY4IDIxMlQ4NTcgMjI5VDk0MiAyNTZUMTAyOCAyOTVWNTlROTg4IDM4IDk0OCAyNFQ4NjIgLTFUNzY1IC0xNVQ2NTEgLTIwWk00NDcgMTI0MVYxMjY4UTQ2OCAxMjk3IDQ5MiAxMzM1VDUzOSAxNDEzVDU4NCAxNDk0VDYyMSAxNTY5SDk2M1YxNTQ4UTk1MiAxNTMwCis5MzEgMTUwNlQ4ODMgMTQ1M1Q4MjUgMTM5NlQ3NjMgMTMzOFQ3MDIgMTI4NVQ2NTAgMTI0MUg0NDdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGVhOyIgZ2x5cGgtbmFtZT0iZWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIxMTkwIiBkPSJNNjEyIDkyMlE1MzEgOTIyIDQ3OCA4NjVUNDE2IDY4Nkg4MDVRODA0IDczNyA3OTIgNzgwVDc1NiA4NTRUNjk2IDkwNFQ2MTIgOTIyWk02NTEgLTIwUTUzMSAtMjAgNDMwIDE1VDI1NiAxMjBUMTQzIDI5OFQxMDIgNTUxUTEwMiA2OTggMTM5IDgwOFQyNDIgOTkxVDQwMiAxMTAyVDYxMCAxMTM5UTcyMQorMTEzOSA4MTAgMTEwNlQ5NjIgMTAwN1QxMDU4IDg0OFQxMDkyIDYzMVY0ODNINDEwUTQxMiA0MTkgNDMwIDM2OFQ0ODIgMjgxVDU2MyAyMjZUNjcyIDIwN1E3MjMgMjA3IDc2OCAyMTJUODU3IDIyOVQ5NDIgMjU2VDEwMjggMjk1VjU5UTk4OCAzOCA5NDggMjRUODYyIC0xVDc2NSAtMTVUNjUxIC0yMFpNODE5IDEyNDFRNzY4IDEyNzUgNzEzIDEzMThUNjA2IDE0MTdRNTUyIDEzNjEgNTAwIDEzMThUMzk3IDEyNDFIMTk0VjEyNjhRMjIwCisxMjk3IDI1MSAxMzM1VDMxNSAxNDEzVDM3OCAxNDk0VDQzMCAxNTY5SDc4NlE4MDcgMTUzNSA4MzcgMTQ5NVQ4OTkgMTQxNFQ5NjQgMTMzNVQxMDIyIDEyNjhWMTI0MUg4MTlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGViOyIgZ2x5cGgtbmFtZT0iZWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMTE5MCIgZD0iTTYxMiA5MjJRNTMxIDkyMiA0NzggODY1VDQxNiA2ODZIODA1UTgwNCA3MzcgNzkyIDc4MFQ3NTYgODU0VDY5NiA5MDRUNjEyIDkyMlpNNjUxIC0yMFE1MzEgLTIwIDQzMCAxNVQyNTYgMTIwVDE0MyAyOThUMTAyIDU1MVExMDIgNjk4IDEzOSA4MDhUMjQyIDk5MVQ0MDIgMTEwMlQ2MTAgMTEzOVE3MjEgMTEzOQorODEwIDExMDZUOTYyIDEwMDdUMTA1OCA4NDhUMTA5MiA2MzFWNDgzSDQxMFE0MTIgNDE5IDQzMCAzNjhUNDgyIDI4MVQ1NjMgMjI2VDY3MiAyMDdRNzIzIDIwNyA3NjggMjEyVDg1NyAyMjlUOTQyIDI1NlQxMDI4IDI5NVY1OVE5ODggMzggOTQ4IDI0VDg2MiAtMVQ3NjUgLTE1VDY1MSAtMjBaTTI2NiAxNDA1UTI2NiAxNDQwIDI3NyAxNDY1VDMwNiAxNTA3VDM1MCAxNTMyVDQwNSAxNTQwUTQzNCAxNTQwIDQ1OSAxNTMyVDUwNAorMTUwOFQ1MzQgMTQ2NlQ1NDYgMTQwNVE1NDYgMTM3MSA1MzUgMTM0NlQ1MDQgMTMwNVQ0NjAgMTI4MFQ0MDUgMTI3MlEzNzYgMTI3MiAzNTEgMTI4MFQzMDcgMTMwNFQyNzcgMTM0NlQyNjYgMTQwNVpNNjY5IDE0MDVRNjY5IDE0NDAgNjgwIDE0NjVUNzEwIDE1MDdUNzU1IDE1MzJUODExIDE1NDBRODM5IDE1NDAgODY0IDE1MzJUOTA5IDE1MDhUOTQwIDE0NjZUOTUyIDE0MDVROTUyIDEzNzEgOTQxIDEzNDZUOTEwIDEzMDVUODY1CisxMjgwVDgxMSAxMjcyUTc1MSAxMjcyIDcxMCAxMzA1VDY2OSAxNDA1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlYzsiIGdseXBoLW5hbWU9ImlncmF2ZSIgaG9yaXotYWR2LXg9IjYyNSIgZD0iTTQ2NSAwSDE2MFYxMTE4SDQ2NVYwWk0yNjkgMTI0MVEyMzUgMTI2OSAxODggMTMxMFQ5NCAxMzk2VDEwIDE0ODBULTQ0IDE1NDhWMTU2OUgyOThRMzE0IDE1MzUgMzM1IDE0OTVUMzgwIDE0MTRUNDI3IDEzMzVUNDcyIDEyNjhWMTI0MUgyNjlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGVkOyIgZ2x5cGgtbmFtZT0iaWFjdXRlIiBob3Jpei1hZHYteD0iNjI1IiBkPSJNNDY1IDBIMTYwVjExMThINDY1VjBaTTE0NSAxMjQxVjEyNjhRMTY2IDEyOTcgMTkwIDEzMzVUMjM3IDE0MTNUMjgyIDE0OTRUMzE5IDE1NjlINjYxVjE1NDhRNjUwIDE1MzAgNjI5IDE1MDZUNTgxIDE0NTNUNTIzIDEzOTZUNDYxIDEzMzhUNDAwIDEyODVUMzQ4IDEyNDFIMTQ1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlZTsiIGdseXBoLW5hbWU9ImljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjI1IiBkPSJNNDY1IDBIMTYwVjExMThINDY1VjBaTTUyMSAxMjQxUTQ3MCAxMjc1IDQxNSAxMzE4VDMwOCAxNDE3UTI1NCAxMzYxIDIwMiAxMzE4VDk5IDEyNDFILTEwNFYxMjY4US03OCAxMjk3IC00NyAxMzM1VDE3IDE0MTNUODAgMTQ5NFQxMzIgMTU2OUg0ODhRNTA5IDE1MzUgNTM5IDE0OTVUNjAxIDE0MTRUNjY2CisxMzM1VDcyNCAxMjY4VjEyNDFINTIxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlZjsiIGdseXBoLW5hbWU9ImlkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjYyNSIgZD0iTTQ2NSAwSDE2MFYxMTE4SDQ2NVYwWk0tMzIgMTQwNVEtMzIgMTQ0MCAtMjEgMTQ2NVQ4IDE1MDdUNTIgMTUzMlQxMDcgMTU0MFExMzYgMTU0MCAxNjEgMTUzMlQyMDYgMTUwOFQyMzYgMTQ2NlQyNDggMTQwNVEyNDggMTM3MSAyMzcgMTM0NlQyMDYgMTMwNVQxNjIgMTI4MFQxMDcgMTI3MlE3OCAxMjcyIDUzCisxMjgwVDkgMTMwNFQtMjEgMTM0NlQtMzIgMTQwNVpNMzcxIDE0MDVRMzcxIDE0NDAgMzgyIDE0NjVUNDEyIDE1MDdUNDU3IDE1MzJUNTEzIDE1NDBRNTQxIDE1NDAgNTY2IDE1MzJUNjExIDE1MDhUNjQyIDE0NjZUNjU0IDE0MDVRNjU0IDEzNzEgNjQzIDEzNDZUNjEyIDEzMDVUNTY3IDEyODBUNTEzIDEyNzJRNDUzIDEyNzIgNDEyIDEzMDVUMzcxIDE0MDVaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwOyIgZ2x5cGgtbmFtZT0iZXRoIiBob3Jpei1hZHYteD0iMTE4MiIgZD0iTTQ1NyAxMzA5UTQyMyAxMzMwIDM4NCAxMzU0VDMwMyAxNDAxTDM5OSAxNTcxUTQ3MiAxNTM3IDUzNiAxNTAzVDY1NyAxNDMwTDg4MyAxNTY5TDk4MyAxNDE1TDgwOSAxMzA5UTg4MSAxMjQwIDkzNSAxMTYyVDEwMjQgOTkzVDEwNzggNzk4VDEwOTYgNTczUTEwOTYgNDMxIDEwNjAgMzIxVDk1NyAxMzVUNzk1IDIwVDU4MgorLTIwUTQ3MSAtMjAgMzc4IDE0VDIxOCAxMTNUMTEyIDI3MlQ3NCA0ODlRNzQgNjExIDEwNiA3MDVUMTk3IDg2M1QzMzcgOTYxVDUxNiA5OTVRNjEyIDk5NSA2ODAgOTY0VDc4MCA4ODNMODAxIDg4NVE3NzMgOTczIDcyMyAxMDUwVDYwNiAxMTg0TDM3NSAxMDQwTDI3NCAxMTk2TDQ1NyAxMzA5Wk03ODQgNTMyUTc4NCA1NzkgNzczIDYyMlQ3MzcgNjk4VDY3NSA3NTBUNTg2IDc3MFE0NzggNzcwIDQzMiA3MDBUMzg1IDQ4N1EzODUKKzQyNCAzOTYgMzcyVDQzMiAyODNUNDk1IDIyNlQ1ODYgMjA1UTY5MiAyMDUgNzM4IDI4NlQ3ODQgNTMyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTsiIGdseXBoLW5hbWU9Im50aWxkZSIgaG9yaXotYWR2LXg9IjEyODQiIGQ9Ik0xMTMwIDBIODI1VjY1M1E4MjUgNzc0IDc4OSA4MzRUNjcyIDg5NVE2MTIgODk1IDU3MiA4NzFUNTA5IDgwMFQ0NzUgNjg0VDQ2NSA1MjZWMEgxNjBWMTExOEgzOTNMNDM0IDk3NUg0NTFRNDc1IDEwMTggNTA5IDEwNDlUNTg1IDExMDBUNjcyIDExMjlUNzY2IDExMzlRODQ4IDExMzkgOTE1IDExMTZUMTAzMAorMTA0MlQxMTA0IDkxNVQxMTMwIDcyOVYwWk00NzcgMTM0NlE0NDYgMTM0NiA0MjggMTMyMFQzOTcgMTIzOUgyNDhRMjU0IDEzMTkgMjc0IDEzNzdUMzI2IDE0NzNUNDAzIDE1MjlUNTAwIDE1NDhRNTQxIDE1NDggNTgwIDE1MzJUNjU3IDE0OTdUNzMzIDE0NjFUODA3IDE0NDRRODM4IDE0NDQgODU2IDE0NzBUODg3IDE1NTBIMTAzNlExMDMwIDE0NzEgMTAxMCAxNDEzVDk1NiAxMzE3VDg4MCAxMjYwVDc4NCAxMjQxUTc0NCAxMjQxCis3MDQgMTI1N1Q2MjYgMTI5M1Q1NTEgMTMyOVQ0NzcgMTM0NloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjI7IiBnbHlwaC1uYW1lPSJvZ3JhdmUiIGhvcml6LWFkdi14PSIxMjI3IiBkPSJNNDE0IDU2MVE0MTQgMzk0IDQ2MSAzMTBUNjE0IDIyNVE3MTkgMjI1IDc2NiAzMTBUODEzIDU2MVE4MTMgNzI4IDc2NiA4MTBUNjEyIDg5M1E1MDcgODkzIDQ2MSA4MTFUNDE0IDU2MVpNMTEyNCA1NjFRMTEyNCA0MjEgMTA4OSAzMTNUOTg3IDEzMVQ4MjUgMTlUNjEwIC0yMFE0OTkgLTIwIDQwNiAxOFQyNDYKKzEzMVQxNDAgMzEzVDEwMiA1NjFRMTAyIDcwMCAxMzcgODA4VDIzOSA5ODlUNDAxIDExMDFUNjE2IDExMzlRNzI3IDExMzkgODIwIDExMDFUOTgwIDk5MFQxMDg2IDgwOFQxMTI0IDU2MVpNODQxIDEyNDFRODA3IDEyNjkgNzYwIDEzMTBUNjY2IDEzOTZUNTgyIDE0ODBUNTI4IDE1NDhWMTU2OUg4NzBRODg2IDE1MzUgOTA3IDE0OTVUOTUyIDE0MTRUOTk5IDEzMzVUMTA0NCAxMjY4VjEyNDFIODQxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMzsiIGdseXBoLW5hbWU9Im9hY3V0ZSIgaG9yaXotYWR2LXg9IjEyMjciIGQ9Ik00MTQgNTYxUTQxNCAzOTQgNDYxIDMxMFQ2MTQgMjI1UTcxOSAyMjUgNzY2IDMxMFQ4MTMgNTYxUTgxMyA3MjggNzY2IDgxMFQ2MTIgODkzUTUwNyA4OTMgNDYxIDgxMVQ0MTQgNTYxWk0xMTI0IDU2MVExMTI0IDQyMSAxMDg5IDMxM1Q5ODcgMTMxVDgyNSAxOVQ2MTAgLTIwUTQ5OSAtMjAgNDA2IDE4VDI0NgorMTMxVDE0MCAzMTNUMTAyIDU2MVExMDIgNzAwIDEzNyA4MDhUMjM5IDk4OVQ0MDEgMTEwMVQ2MTYgMTEzOVE3MjcgMTEzOSA4MjAgMTEwMVQ5ODAgOTkwVDEwODYgODA4VDExMjQgNTYxWk00MzQgMTI0MVYxMjY4UTQ1NSAxMjk3IDQ3OSAxMzM1VDUyNiAxNDEzVDU3MSAxNDk0VDYwOCAxNTY5SDk1MFYxNTQ4UTkzOSAxNTMwIDkxOCAxNTA2VDg3MCAxNDUzVDgxMiAxMzk2VDc1MCAxMzM4VDY4OSAxMjg1VDYzNyAxMjQxSDQzNFoiCisvPgorPGdseXBoIHVuaWNvZGU9IiYjeGY0OyIgZ2x5cGgtbmFtZT0ib2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIxMjI3IiBkPSJNNDE0IDU2MVE0MTQgMzk0IDQ2MSAzMTBUNjE0IDIyNVE3MTkgMjI1IDc2NiAzMTBUODEzIDU2MVE4MTMgNzI4IDc2NiA4MTBUNjEyIDg5M1E1MDcgODkzIDQ2MSA4MTFUNDE0IDU2MVpNMTEyNCA1NjFRMTEyNCA0MjEgMTA4OSAzMTNUOTg3IDEzMVQ4MjUgMTlUNjEwIC0yMFE0OTkgLTIwIDQwNiAxOFQyNDYKKzEzMVQxNDAgMzEzVDEwMiA1NjFRMTAyIDcwMCAxMzcgODA4VDIzOSA5ODlUNDAxIDExMDFUNjE2IDExMzlRNzI3IDExMzkgODIwIDExMDFUOTgwIDk5MFQxMDg2IDgwOFQxMTI0IDU2MVpNODIxIDEyNDFRNzcwIDEyNzUgNzE1IDEzMThUNjA4IDE0MTdRNTU0IDEzNjEgNTAyIDEzMThUMzk5IDEyNDFIMTk2VjEyNjhRMjIyIDEyOTcgMjUzIDEzMzVUMzE3IDE0MTNUMzgwIDE0OTRUNDMyIDE1NjlINzg4UTgwOSAxNTM1IDgzOQorMTQ5NVQ5MDEgMTQxNFQ5NjYgMTMzNVQxMDI0IDEyNjhWMTI0MUg4MjFaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGY1OyIgZ2x5cGgtbmFtZT0ib3RpbGRlIiBob3Jpei1hZHYteD0iMTIyNyIgZD0iTTQxNCA1NjFRNDE0IDM5NCA0NjEgMzEwVDYxNCAyMjVRNzE5IDIyNSA3NjYgMzEwVDgxMyA1NjFRODEzIDcyOCA3NjYgODEwVDYxMiA4OTNRNTA3IDg5MyA0NjEgODExVDQxNCA1NjFaTTExMjQgNTYxUTExMjQgNDIxIDEwODkgMzEzVDk4NyAxMzFUODI1IDE5VDYxMCAtMjBRNDk5IC0yMCA0MDYgMThUMjQ2CisxMzFUMTQwIDMxM1QxMDIgNTYxUTEwMiA3MDAgMTM3IDgwOFQyMzkgOTg5VDQwMSAxMTAxVDYxNiAxMTM5UTcyNyAxMTM5IDgyMCAxMTAxVDk4MCA5OTBUMTA4NiA4MDhUMTEyNCA1NjFaTTQ0NCAxMzQ2UTQxMyAxMzQ2IDM5NSAxMzIwVDM2NCAxMjM5SDIxNVEyMjEgMTMxOSAyNDEgMTM3N1QyOTMgMTQ3M1QzNzAgMTUyOVQ0NjcgMTU0OFE1MDggMTU0OCA1NDcgMTUzMlQ2MjQgMTQ5N1Q3MDAgMTQ2MVQ3NzQgMTQ0NFE4MDUKKzE0NDQgODIzIDE0NzBUODU0IDE1NTBIMTAwM1E5OTcgMTQ3MSA5NzcgMTQxM1Q5MjMgMTMxN1Q4NDcgMTI2MFQ3NTEgMTI0MVE3MTEgMTI0MSA2NzEgMTI1N1Q1OTMgMTI5M1Q1MTggMTMyOVQ0NDQgMTM0NloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjY7IiBnbHlwaC1uYW1lPSJvZGllcmVzaXMiIGhvcml6LWFkdi14PSIxMjI3IiBkPSJNNDE0IDU2MVE0MTQgMzk0IDQ2MSAzMTBUNjE0IDIyNVE3MTkgMjI1IDc2NiAzMTBUODEzIDU2MVE4MTMgNzI4IDc2NiA4MTBUNjEyIDg5M1E1MDcgODkzIDQ2MSA4MTFUNDE0IDU2MVpNMTEyNCA1NjFRMTEyNCA0MjEgMTA4OSAzMTNUOTg3IDEzMVQ4MjUgMTlUNjEwIC0yMFE0OTkgLTIwIDQwNiAxOFQyNDYKKzEzMVQxNDAgMzEzVDEwMiA1NjFRMTAyIDcwMCAxMzcgODA4VDIzOSA5ODlUNDAxIDExMDFUNjE2IDExMzlRNzI3IDExMzkgODIwIDExMDFUOTgwIDk5MFQxMDg2IDgwOFQxMTI0IDU2MVpNMjY2IDE0MDVRMjY2IDE0NDAgMjc3IDE0NjVUMzA2IDE1MDdUMzUwIDE1MzJUNDA1IDE1NDBRNDM0IDE1NDAgNDU5IDE1MzJUNTA0IDE1MDhUNTM0IDE0NjZUNTQ2IDE0MDVRNTQ2IDEzNzEgNTM1IDEzNDZUNTA0IDEzMDVUNDYwIDEyODBUNDA1CisxMjcyUTM3NiAxMjcyIDM1MSAxMjgwVDMwNyAxMzA0VDI3NyAxMzQ2VDI2NiAxNDA1Wk02NjkgMTQwNVE2NjkgMTQ0MCA2ODAgMTQ2NVQ3MTAgMTUwN1Q3NTUgMTUzMlQ4MTEgMTU0MFE4MzkgMTU0MCA4NjQgMTUzMlQ5MDkgMTUwOFQ5NDAgMTQ2NlQ5NTIgMTQwNVE5NTIgMTM3MSA5NDEgMTM0NlQ5MTAgMTMwNVQ4NjUgMTI4MFQ4MTEgMTI3MlE3NTEgMTI3MiA3MTAgMTMwNVQ2NjkgMTQwNVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Zjc7IiBnbHlwaC1uYW1lPSJkaXZpZGUiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNODggNjEyVjgzMUgxMDQwVjYxMkg4OFpNNDI0IDM3M1E0MjQgNDE1IDQzNSA0NDRUNDY1IDQ5MFQ1MDkgNTE2VDU2MyA1MjRRNTkxIDUyNCA2MTYgNTE2VDY2MCA0OTFUNjkwIDQ0NFQ3MDIgMzczUTcwMiAzMzMgNjkxIDMwNFQ2NjAgMjU3VDYxNiAyMzBUNTYzIDIyMVE1MzUgMjIxIDUxMCAyMjlUNDY1IDI1NlQ0MzUKKzMwNFQ0MjQgMzczWk00MjQgMTA3MVE0MjQgMTExMyA0MzUgMTE0MlQ0NjUgMTE4OVQ1MDkgMTIxNVQ1NjMgMTIyM1E1OTEgMTIyMyA2MTYgMTIxNVQ2NjAgMTE4OVQ2OTAgMTE0MlQ3MDIgMTA3MVE3MDIgMTAzMSA2OTEgMTAwM1Q2NjAgOTU2VDYxNiA5MjlUNTYzIDkyMFE1MzUgOTIwIDUxMCA5MjhUNDY1IDk1NVQ0MzUgMTAwMlQ0MjQgMTA3MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Zjg7IiBnbHlwaC1uYW1lPSJvc2xhc2giIGhvcml6LWFkdi14PSIxMjI3IiBkPSJNMTEyNCA1NjFRMTEyNCA0MjEgMTA4OSAzMTNUOTg3IDEzMVQ4MjUgMTlUNjEwIC0yMFE1NTMgLTIwIDUwMSAtMTBUNDAxIDE4TDM0NCAtNzZMMTgyIDE0TDI1MCAxMjVRMTgxIDE5OSAxNDIgMzA4VDEwMiA1NjFRMTAyIDcwMCAxMzcgODA4VDIzOSA5ODlUNDAxIDExMDFUNjE2IDExMzlRNjc4IDExMzkgNzM1CisxMTI2VDg0NCAxMDkwTDg5MyAxMTY5TDEwNTMgMTA3M0w5OTEgOTc1UTEwNTQgOTAzIDEwODkgNzk5VDExMjQgNTYxWk00MTQgNTYxUTQxNCA0NzUgNDI2IDQxMEw3MDkgODY4UTY2OSA4OTMgNjEyIDg5M1E1MDcgODkzIDQ2MSA4MTFUNDE0IDU2MVpNODEzIDU2MVE4MTMgNjI1IDgwNyA2NzRMNTM5IDI0MFE1NTYgMjMyIDU3NCAyMjlUNjE0IDIyNVE3MTkgMjI1IDc2NiAzMTBUODEzIDU2MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Zjk7IiBnbHlwaC1uYW1lPSJ1Z3JhdmUiIGhvcml6LWFkdi14PSIxMjg0IiBkPSJNODkxIDBMODUwIDE0M0g4MzRRODA5IDEwMCA3NzUgNzBUNjk5IDE5VDYxMiAtMTBUNTE4IC0yMFE0MzYgLTIwIDM2OSAzVDI1NCA3N1QxODAgMjA0VDE1NCAzODlWMTExOEg0NTlWNDY1UTQ1OSAzNDQgNDk1IDI4NFQ2MTIgMjIzUTY3MiAyMjMgNzEyIDI0N1Q3NzUgMzE4VDgwOSA0MzRUODE5IDU5MlYxMTE4SDExMjRWMEg4OTFaTTgzOQorMTI0MVE4MDUgMTI2OSA3NTggMTMxMFQ2NjQgMTM5NlQ1ODAgMTQ4MFQ1MjYgMTU0OFYxNTY5SDg2OFE4ODQgMTUzNSA5MDUgMTQ5NVQ5NTAgMTQxNFQ5OTcgMTMzNVQxMDQyIDEyNjhWMTI0MUg4MzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGZhOyIgZ2x5cGgtbmFtZT0idWFjdXRlIiBob3Jpei1hZHYteD0iMTI4NCIgZD0iTTg5MSAwTDg1MCAxNDNIODM0UTgwOSAxMDAgNzc1IDcwVDY5OSAxOVQ2MTIgLTEwVDUxOCAtMjBRNDM2IC0yMCAzNjkgM1QyNTQgNzdUMTgwIDIwNFQxNTQgMzg5VjExMThINDU5VjQ2NVE0NTkgMzQ0IDQ5NSAyODRUNjEyIDIyM1E2NzIgMjIzIDcxMiAyNDdUNzc1IDMxOFQ4MDkgNDM0VDgxOSA1OTJWMTExOEgxMTI0VjBIODkxWk00NjEKKzEyNDFWMTI2OFE0ODIgMTI5NyA1MDYgMTMzNVQ1NTMgMTQxM1Q1OTggMTQ5NFQ2MzUgMTU2OUg5NzdWMTU0OFE5NjYgMTUzMCA5NDUgMTUwNlQ4OTcgMTQ1M1Q4MzkgMTM5NlQ3NzcgMTMzOFQ3MTYgMTI4NVQ2NjQgMTI0MUg0NjFaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGZiOyIgZ2x5cGgtbmFtZT0idWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIxMjg0IiBkPSJNODkxIDBMODUwIDE0M0g4MzRRODA5IDEwMCA3NzUgNzBUNjk5IDE5VDYxMiAtMTBUNTE4IC0yMFE0MzYgLTIwIDM2OSAzVDI1NCA3N1QxODAgMjA0VDE1NCAzODlWMTExOEg0NTlWNDY1UTQ1OSAzNDQgNDk1IDI4NFQ2MTIgMjIzUTY3MiAyMjMgNzEyIDI0N1Q3NzUgMzE4VDgwOSA0MzRUODE5IDU5MlYxMTE4SDExMjRWMEg4OTFaTTg0MgorMTI0MVE3OTEgMTI3NSA3MzYgMTMxOFQ2MjkgMTQxN1E1NzUgMTM2MSA1MjMgMTMxOFQ0MjAgMTI0MUgyMTdWMTI2OFEyNDMgMTI5NyAyNzQgMTMzNVQzMzggMTQxM1Q0MDEgMTQ5NFQ0NTMgMTU2OUg4MDlRODMwIDE1MzUgODYwIDE0OTVUOTIyIDE0MTRUOTg3IDEzMzVUMTA0NSAxMjY4VjEyNDFIODQyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmYzsiIGdseXBoLW5hbWU9InVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjEyODQiIGQ9Ik04OTEgMEw4NTAgMTQzSDgzNFE4MDkgMTAwIDc3NSA3MFQ2OTkgMTlUNjEyIC0xMFQ1MTggLTIwUTQzNiAtMjAgMzY5IDNUMjU0IDc3VDE4MCAyMDRUMTU0IDM4OVYxMTE4SDQ1OVY0NjVRNDU5IDM0NCA0OTUgMjg0VDYxMiAyMjNRNjcyIDIyMyA3MTIgMjQ3VDc3NSAzMThUODA5IDQzNFQ4MTkgNTkyVjExMThIMTEyNFYwSDg5MVpNMjk1CisxNDA1UTI5NSAxNDQwIDMwNiAxNDY1VDMzNSAxNTA3VDM3OSAxNTMyVDQzNCAxNTQwUTQ2MyAxNTQwIDQ4OCAxNTMyVDUzMyAxNTA4VDU2MyAxNDY2VDU3NSAxNDA1UTU3NSAxMzcxIDU2NCAxMzQ2VDUzMyAxMzA1VDQ4OSAxMjgwVDQzNCAxMjcyUTQwNSAxMjcyIDM4MCAxMjgwVDMzNiAxMzA0VDMwNiAxMzQ2VDI5NSAxNDA1Wk02OTggMTQwNVE2OTggMTQ0MCA3MDkgMTQ2NVQ3MzkgMTUwN1Q3ODQgMTUzMlQ4NDAgMTU0MFE4NjgKKzE1NDAgODkzIDE1MzJUOTM4IDE1MDhUOTY5IDE0NjZUOTgxIDE0MDVROTgxIDEzNzEgOTcwIDEzNDZUOTM5IDEzMDVUODk0IDEyODBUODQwIDEyNzJRNzgwIDEyNzIgNzM5IDEzMDVUNjk4IDE0MDVaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGZkOyIgZ2x5cGgtbmFtZT0ieWFjdXRlIiBob3Jpei1hZHYteD0iMTEwNCIgZD0iTTAgMTExOEgzMzRMNTE0IDQ4OVE1MzAgNDM3IDUzNyAzNzhUNTQ3IDI3Mkg1NTNRNTU1IDI5NSA1NTggMzIzVDU2NyAzODBUNTc4IDQzN1Q1OTIgNDg5TDc2OCAxMTE4SDExMDRMNjYyIC0xNDNRNjAwIC0zMjAgNDkzIC00MDZUMjI1IC00OTJRMTczIC00OTIgMTM1IC00ODdUNzAgLTQ3NVYtMjMzUTkxIC0yMzgKKzEyMyAtMjQyVDE5MCAtMjQ2UTIzOCAtMjQ2IDI3MiAtMjMzVDMzMCAtMTk3VDM3MiAtMTQwVDQwMyAtNjZMNDIyIC0xMEwwIDExMThaTTM5MyAxMjQxVjEyNjhRNDE0IDEyOTcgNDM4IDEzMzVUNDg1IDE0MTNUNTMwIDE0OTRUNTY3IDE1NjlIOTA5VjE1NDhRODk4IDE1MzAgODc3IDE1MDZUODI5IDE0NTNUNzcxIDEzOTZUNzA5IDEzMzhUNjQ4IDEyODVUNTk2IDEyNDFIMzkzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmZTsiIGdseXBoLW5hbWU9InRob3JuIiBob3Jpei1hZHYteD0iMTI0NSIgZD0iTTQ2NSA5NzNRNDg1IDEwMDggNTEyIDEwMzhUNTc2IDEwOTBUNjU2IDExMjZUNzU2IDExMzlRODQyIDExMzkgOTEzIDExMDJUMTAzNSA5OTJUMTExNCA4MTFUMTE0MyA1NjFRMTE0MyA0MTggMTExNSAzMTBUMTAzNiAxMjhUOTE0IDE3VDc1NiAtMjBRNzAxIC0yMCA2NTYgLTEwVDU3NiAyMFQ1MTMgNjRUNDY1IDExN0g0NTFRNDU0Cis4NSA0NTggNTVRNDYxIDI5IDQ2MyAzVDQ2NSAtMzlWLTQ5MkgxNjBWMTU1Nkg0NjVWMTE2NVE0NjUgMTE0MSA0NjMgMTEwOFQ0NTggMTA0NVE0NTQgMTAxMCA0NTEgOTczSDQ2NVpNNjUzIDg5NVE2MDIgODk1IDU2NyA4NzdUNTA5IDgyMVQ0NzcgNzI4VDQ2NSA1OTZWNTYzUTQ2NSA0ODIgNDc0IDQxOVQ1MDYgMzE0VDU2NCAyNDlUNjU1IDIyN1E3NDYgMjI3IDc4OCAzMTNUODMxIDU2NVE4MzEgNzMwIDc4OSA4MTJUNjUzIDg5NVoiCisvPgorPGdseXBoIHVuaWNvZGU9IiYjeGZmOyIgZ2x5cGgtbmFtZT0ieWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMTEwNCIgZD0iTTAgMTExOEgzMzRMNTE0IDQ4OVE1MzAgNDM3IDUzNyAzNzhUNTQ3IDI3Mkg1NTNRNTU1IDI5NSA1NTggMzIzVDU2NyAzODBUNTc4IDQzN1Q1OTIgNDg5TDc2OCAxMTE4SDExMDRMNjYyIC0xNDNRNjAwIC0zMjAgNDkzIC00MDZUMjI1IC00OTJRMTczIC00OTIgMTM1IC00ODdUNzAgLTQ3NVYtMjMzUTkxCistMjM4IDEyMyAtMjQyVDE5MCAtMjQ2UTIzOCAtMjQ2IDI3MiAtMjMzVDMzMCAtMTk3VDM3MiAtMTQwVDQwMyAtNjZMNDIyIC0xMEwwIDExMThaTTQ2NiAxNDA1UTQ2NiAxNDQwIDQ3NyAxNDY1VDUwNiAxNTA3VDU1MCAxNTMyVDYwNSAxNTQwUTYzNCAxNTQwIDY1OSAxNTMyVDcwNCAxNTA4VDczNCAxNDY2VDc0NiAxNDA1UTc0NiAxMzcxIDczNSAxMzQ2VDcwNCAxMzA1VDY2MCAxMjgwVDYwNSAxMjcyUTU3NiAxMjcyIDU1MSAxMjgwVDUwNworMTMwNFQ0NzcgMTM0NlQ0NjYgMTQwNVpNODY5IDE0MDVRODY5IDE0NDAgODgwIDE0NjVUOTEwIDE1MDdUOTU1IDE1MzJUMTAxMSAxNTQwUTEwMzkgMTU0MCAxMDY0IDE1MzJUMTEwOSAxNTA4VDExNDAgMTQ2NlQxMTUyIDE0MDVRMTE1MiAxMzcxIDExNDEgMTM0NlQxMTEwIDEzMDVUMTA2NSAxMjgwVDEwMTEgMTI3MlE5NTEgMTI3MiA5MTAgMTMwNVQ4NjkgMTQwNVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxMzsiIGdseXBoLW5hbWU9ImVuZGFzaCIgaG9yaXotYWR2LXg9IjEwMjQiIGQ9Ik04MiA0MzZWNjY2SDk0MlY0MzZIODJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTQ7IiBnbHlwaC1uYW1lPSJlbWRhc2giIGhvcml6LWFkdi14PSIyMDQ4IiBkPSJNODIgNDM2VjY2NkgxOTY2VjQzNkg4MloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGdseXBoLW5hbWU9InF1b3RlbGVmdCIgaG9yaXotYWR2LXg9IjQ0MCIgZD0iTTM3IDk2MUwyMyA5ODNRMzcgMTAzNyA1NiAxMDk4VDk5IDEyMjFUMTQ4IDEzNDRUMTk5IDE0NjJINDE4UTQwMyAxNDAxIDM4OSAxMzM1VDM2MSAxMjA0VDMzNiAxMDc2VDMxNyA5NjFIMzdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBnbHlwaC1uYW1lPSJxdW90ZXJpZ2h0IiBob3Jpei1hZHYteD0iNDQwIiBkPSJNNDAzIDE0NjJMNDE4IDE0NDBRNDA0IDEzODUgMzg1IDEzMjVUMzQyIDEyMDJUMjkzIDEwNzhUMjQyIDk2MUgyM1EzNyAxMDIxIDUxIDEwODdUNzkgMTIxOVQxMDQgMTM0N1QxMjMgMTQ2Mkg0MDNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMWE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjU5NCIgZD0iTTQ1OSAyMTVRNDQ1IDE2MSA0MjYgMTAwVDM4MyAtMjNUMzM0IC0xNDZUMjgzIC0yNjRINjNRNzggLTIwMyA5MiAtMTM3VDEyMCAtNlQxNDUgMTIyVDE2NCAyMzhINDQ0TDQ1OSAyMTVaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMWM7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGxlZnQiIGhvcml6LWFkdi14PSI5MDciIGQ9Ik00ODkgOTgzUTUwMyAxMDM3IDUyMyAxMDk4VDU2NiAxMjIxVDYxNSAxMzQ0VDY2NiAxNDYySDg4NVE4NzAgMTQwMSA4NTYgMTMzNVQ4MjggMTIwNFQ4MDMgMTA3NlQ3ODQgOTYxSDUwNEw0ODkgOTgzWk0yMyA5ODNRMzcgMTAzNyA1NiAxMDk4VDk5IDEyMjFUMTQ4IDEzNDRUMTk5IDE0NjJINDE4UTQwMworMTQwMSAzODkgMTMzNVQzNjEgMTIwNFQzMzYgMTA3NlQzMTcgOTYxSDM3TDIzIDk4M1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxZDsiIGdseXBoLW5hbWU9InF1b3RlZGJscmlnaHQiIGhvcml6LWFkdi14PSI5MDciIGQ9Ik00MTggMTQ0MFE0MDQgMTM4NSAzODUgMTMyNVQzNDIgMTIwMlQyOTMgMTA3OFQyNDIgOTYxSDIzUTM3IDEwMjEgNTEgMTA4N1Q3OSAxMjE5VDEwNCAxMzQ3VDEyMyAxNDYySDQwM0w0MTggMTQ0MFpNODg1IDE0NDBRODcxIDEzODUgODUyIDEzMjVUODA5IDEyMDJUNzYwIDEwNzhUNzA5IDk2MUg0ODlRNTA0CisxMDIxIDUxOCAxMDg3VDU0NiAxMjE5VDU3MSAxMzQ3VDU5MCAxNDYySDg3MEw4ODUgMTQ0MFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxZTsiIGdseXBoLW5hbWU9InF1b3RlZGJsYmFzZSIgaG9yaXotYWR2LXg9IjEwNjEiIGQ9Ik00NTkgMjE1UTQ0NSAxNjEgNDI2IDEwMFQzODMgLTIzVDMzNCAtMTQ2VDI4MyAtMjY0SDYzUTc4IC0yMDMgOTIgLTEzN1QxMjAgLTZUMTQ1IDEyMlQxNjQgMjM4SDQ0NEw0NTkgMjE1Wk05MjYgMjE1UTkxMiAxNjEgODkzIDEwMFQ4NTAgLTIzVDgwMSAtMTQ2VDc1MCAtMjY0SDUzMFE1NDUgLTIwMworNTU5IC0xMzdUNTg3IC02VDYxMiAxMjJUNjMxIDIzOEg5MTFMOTI2IDIxNVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGdseXBoLW5hbWU9ImJ1bGxldCIgaG9yaXotYWR2LXg9Ijc3MCIgZD0iTTk4IDc0OFE5OCA4MzQgMTIwIDg5NFQxODAgOTkyVDI3MSAxMDQ3VDM4NSAxMDY1UTQ0NCAxMDY1IDQ5NiAxMDQ4VDU4OCA5OTJUNjQ5IDg5NFQ2NzIgNzQ4UTY3MiA2NjMgNjUwIDYwM1Q1ODggNTA1VDQ5NyA0NDhUMzg1IDQzMFEzMjQgNDMwIDI3MiA0NDhUMTgxIDUwNFQxMjAgNjAzVDk4IDc0OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbGxlZnQiIGhvcml6LWFkdi14PSI2OTIiIGQ9Ik04MiA1NzNMMzkxIDEwMjhMNjEwIDkwOUwzOTMgNTYxTDYxMCAyMTNMMzkxIDk0TDgyIDU0N1Y1NzNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwM2E7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xyaWdodCIgaG9yaXotYWR2LXg9IjY5MiIgZD0iTTYxMCA1NDdMMzAxIDk0TDgyIDIxM0wyOTkgNTYxTDgyIDkwOUwzMDEgMTAyOEw2MTAgNTczVjU0N1oiIC8+Cis8L2ZvbnQ+Cis8L2RlZnM+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi03MDAudHRmIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4OTZjNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi03MDAudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi03MDAud29mZiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi03MDAud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2UzZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLTcwMC53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi03MDAud29mZjIgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLndvZmYyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzI2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tNzAwLndvZmYyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLmVvdCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLmVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI2OThlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLXJlZ3VsYXIuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLnN2ZyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWYyYTIxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLXJlZ3VsYXIuc3ZnCkBAIC0wLDAgKzEsNDAzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgorPGRlZnMgPgorPGZvbnQgaWQ9IkRyb2lkU2FucyIgaG9yaXotYWR2LXg9IjEwNjIiID48Zm9udC1mYWNlCisgICAgZm9udC1mYW1pbHk9IkRyb2lkIFNhbnMiCisgICAgdW5pdHMtcGVyLWVtPSIyMDQ4IgorICAgIHBhbm9zZS0xPSIyIDExIDYgNiAzIDggNCAyIDIgNCIKKyAgICBhc2NlbnQ9IjE5MDciCisgICAgZGVzY2VudD0iLTQ5MiIKKyAgICBhbHBoYWJldGljPSIwIiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGdseXBoLW5hbWU9InNwYWNlIiBob3Jpei1hZHYteD0iNTMyIiAvPgorPGdseXBoIHVuaWNvZGU9IiEiIGdseXBoLW5hbWU9ImV4Y2xhbSIgaG9yaXotYWR2LXg9IjU1MSIgZD0iTTMzNiA0MTRIMjE1TDE2NCAxNDYySDM4N0wzMzYgNDE0Wk0xNDcgMTExUTE0NyAxNDkgMTU3IDE3NVQxODQgMjE4VDIyNCAyNDJUMjc0IDI1MFEzMDAgMjUwIDMyMyAyNDNUMzY0IDIxOVQzOTEgMTc2VDQwMSAxMTFRNDAxIDc0IDM5MSA0OFQzNjQgNFQzMjQgLTIxVDI3NCAtMjlRMjQ3IC0yOSAyMjQgLTIxVDE4NCA0VDE1NworNDdUMTQ3IDExMVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJnF1b3Q7IiBnbHlwaC1uYW1lPSJxdW90ZWRibCIgaG9yaXotYWR2LXg9IjgyMyIgZD0iTTMzMCAxNDYyTDI4OSA5MzRIMTc0TDEzMyAxNDYySDMzMFpNNjkwIDE0NjJMNjQ5IDkzNEg1MzVMNDk0IDE0NjJINjkwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIjIiBnbHlwaC1uYW1lPSJudW1iZXJzaWduIiBob3Jpei1hZHYteD0iMTMyMyIgZD0iTTk4MyA4OTNMOTIwIDU2NUgxMjAwVjQyOEg4OTNMODExIDBINjY0TDc0OCA0MjhINDU3TDM3NSAwSDIzMUwzMDkgNDI4SDUxVjU2NUgzMzZMNDAxIDg5M0gxMjdWMTAzMEg0MjZMNTA4IDE0NjJINjU1TDU3MyAxMDMwSDg2Nkw5NTAgMTQ2MkgxMDk0TDEwMTAgMTAzMEgxMjcyVjg5M0g5ODNaTTQ4MyA1NjVINzc0TDgzOAorODkzSDU0N0w0ODMgNTY1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSIkIiBnbHlwaC1uYW1lPSJkb2xsYXIiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNOTg1IDQ0NlE5ODUgMzc2IDk2MCAzMTlUODg5IDIyMFQ3NzYgMTUxVDYyNSAxMTFWLTExOUg0ODdWMTAyUTQzNyAxMDIgMzg2IDEwNlQyODcgMTIwVDE5NyAxNDJUMTIzIDE3MlYzNDRRMTU2IDMyOCAxOTkgMzEyVDI5MSAyODJUMzg5IDI2MVQ0ODcgMjUyVjY4NlEzOTggNzE2IDMzMyA3NDlUMjI0IDgyNFQxNjAgOTIyVDEzOQorMTA1MVExMzkgMTExOCAxNjMgMTE3M1QyMzMgMTI3MFQzNDMgMTMzOFQ0ODcgMTM3NFYxNTU0SDYyNVYxMzc4UTcyNSAxMzczIDgwOSAxMzUyVDk2MSAxMzAwTDg5NSAxMTU1UTgzOSAxMTgwIDc2OSAxMjAwVDYyNSAxMjI3VjgwNVE3MTMgNzc0IDc4MCA3NDFUODkzIDY2N1Q5NjIgNTcyVDk4NSA0NDZaTTgwOSA0NDZRODA5IDQ3OSA3OTkgNTA2VDc2OCA1NTZUNzExIDU5OFQ2MjUgNjM1VjI2MlE3MTggMjc2IDc2MyAzMjVUODA5Cis0NDZaTTMxNSAxMDQ5UTMxNSAxMDEzIDMyMyA5ODVUMzUyIDkzM1Q0MDUgODkwVDQ4NyA4NTRWMTIyM1EzOTggMTIwNyAzNTcgMTE2M1QzMTUgMTA0OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJSIgZ2x5cGgtbmFtZT0icGVyY2VudCIgaG9yaXotYWR2LXg9IjE2OTAiIGQ9Ik0yNTAgMTAyNlEyNTAgODYxIDI4NSA3NzlUNDAxIDY5NlE1NTcgNjk2IDU1NyAxMDI2UTU1NyAxMzU0IDQwMSAxMzU0UTMyMSAxMzU0IDI4NiAxMjczVDI1MCAxMDI2Wk03MDUgMTAyNlE3MDUgOTE4IDY4NyA4MzJUNjMyIDY4N1Q1MzggNTk3VDQwMSA1NjVRMzI4IDU2NSAyNzIgNTk2VDE3OCA2ODdUMTIxIDgzMlQxMDIKKzEwMjZRMTAyIDExMzQgMTE5IDEyMTlUMTczIDEzNjJUMjY2IDE0NTJUNDAxIDE0ODNRNDc2IDE0ODMgNTMyIDE0NTJUNjI3IDEzNjNUNjg1IDEyMTlUNzA1IDEwMjZaTTExMzMgNDQwUTExMzMgMjc1IDExNjggMTkzVDEyODQgMTExUTE0NDAgMTExIDE0NDAgNDQwUTE0NDAgNzY4IDEyODQgNzY4UTEyMDQgNzY4IDExNjkgNjg3VDExMzMgNDQwWk0xNTg3IDQ0MFExNTg3IDMzMiAxNTcwIDI0N1QxNTE1IDEwMlQxNDIxIDEyVDEyODQKKy0yMFExMjEwIC0yMCAxMTU0IDExVDEwNjEgMTAyVDEwMDQgMjQ2VDk4NSA0NDBROTg1IDU0OCAxMDAyIDYzM1QxMDU2IDc3NlQxMTQ5IDg2NlQxMjg0IDg5N1ExMzU5IDg5NyAxNDE1IDg2NlQxNTEwIDc3N1QxNTY3IDYzM1QxNTg3IDQ0MFpNMTMzMSAxNDYyTDUyMCAwSDM2MkwxMTc0IDE0NjJIMTMzMVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFtcDsiIGdseXBoLW5hbWU9ImFtcGVyc2FuZCIgaG9yaXotYWR2LXg9IjE0MzgiIGQ9Ik00MjIgMTE2NVE0MjIgMTEzMSA0MzAgMTA5OVQ0NTQgMTAzNFQ0OTcgOTY4VDU1OSA4OTdRNjE4IDkzMiA2NjEgOTYzVDczMiAxMDI2VDc3NCAxMDkzVDc4OCAxMTY5UTc4OCAxMjA1IDc3NiAxMjM1VDc0MCAxMjg4VDY4MyAxMzIyVDYwOCAxMzM1UTUyMiAxMzM1IDQ3MiAxMjkxVDQyMiAxMTY1Wk01NTcKKzE0MVE2MTUgMTQxIDY2NCAxNTJUNzU1IDE4NFQ4MzMgMjMxVDkwMSAyODlMNTE0IDY5NlE0NjIgNjYzIDQyMiA2MzJUMzU1IDU2NFQzMTMgNDg2VDI5OSAzODdRMjk5IDMzMyAzMTYgMjg4VDM2NyAyMTBUNDQ4IDE1OVQ1NTcgMTQxWk0xMDkgMzgxUTEwOSA0NTkgMTI5IDUyMFQxODcgNjMxVDI4MSA3MjRUNDA4IDgwOVEzNzcgODQ1IDM0NyA4ODNUMjk1IDk2NVQyNTggMTA1OFQyNDQgMTE2NVEyNDQgMTI0MCAyNjkgMTI5OVQzNDEKKzE0MDBUNDU3IDE0NjNUNjE0IDE0ODVRNjk3IDE0ODUgNzYyIDE0NjRUODczIDE0MDFUOTQzIDEzMDBUOTY3IDExNjVROTY3IDExMDEgOTQyIDEwNDdUODc1IDk0NlQ3NzkgODYwVDY2NCA3ODRMMTAxNiA0MTJRMTA0MyA0NDEgMTA2NCA0NzFUMTEwMyA1MzVUMTEzMyA2MDhUMTE1NyA2OTRIMTM0MVExMzI2IDYyOCAxMzA2IDU3M1QxMjU5IDQ2OFQxMjAwIDM3N1QxMTI4IDI5M0wxNDA1IDBIMTE4MEwxMDEyIDE3MlE5NjMgMTI3Cis5MTUgOTJUODEzIDMyVDY5NyAtNlQ1NTcgLTIwUTQ1MiAtMjAgMzY5IDZUMjI4IDg0VDE0MCAyMTBUMTA5IDM4MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFwb3M7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsZSIgaG9yaXotYWR2LXg9IjQ2MyIgZD0iTTMzMCAxNDYyTDI4OSA5MzRIMTc0TDEzMyAxNDYySDMzMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iKCIgZ2x5cGgtbmFtZT0icGFyZW5sZWZ0IiBob3Jpei1hZHYteD0iNjE2IiBkPSJNODIgNTYxUTgyIDY4NiAxMDAgODA3VDE1NSAxMDQzVDI0OCAxMjYzVDM4MyAxNDYySDU1NVE0MTUgMTI2OSAzNDMgMTAzOFQyNzAgNTYzUTI3MCA0NDQgMjg4IDMyNlQzNDIgOTVUNDMxIC0xMjRUNTUzIC0zMjRIMzgzUTMwNSAtMjM0IDI0OSAtMTMxVDE1NSA4NFQxMDAgMzE3VDgyIDU2MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iKSIgZ2x5cGgtbmFtZT0icGFyZW5yaWdodCIgaG9yaXotYWR2LXg9IjYxNiIgZD0iTTUzNSA1NjFRNTM1IDQzNyA1MTcgMzE3VDQ2MiA4NVQzNjggLTEzMVQyMzMgLTMyNEg2M1ExMzIgLTIzMCAxODUgLTEyNFQyNzQgOTVUMzI4IDMyNlQzNDYgNTYzUTM0NiA4MDcgMjc0IDEwMzhUNjEgMTQ2MkgyMzNRMzExIDEzNjkgMzY3IDEyNjRUNDYxIDEwNDRUNTE3IDgwOFQ1MzUgNTYxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBnbHlwaC1uYW1lPSJhc3RlcmlzayIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik02NjQgMTU1Nkw2MjEgMTE2M0wxMDE4IDEyNzRMMTA0NCAxMDgxTDY2NiAxMDUzTDkxMSA3MjdMNzMzIDYzMUw1NTcgOTg5TDM5OSA2MzFMMjE1IDcyN0w0NTcgMTA1M0w4MiAxMDgxTDExMSAxMjc0TDUwMiAxMTYzTDQ1OSAxNTU2SDY2NFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iKyIgZ2x5cGgtbmFtZT0icGx1cyIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik00ODkgNjQ3SDEwMlY3OTdINDg5VjExODZINjM5Vjc5N0gxMDI2VjY0N0g2MzlWMjYySDQ4OVY2NDdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiwiIGdseXBoLW5hbWU9ImNvbW1hIiBob3Jpei1hZHYteD0iNTEyIiBkPSJNMzYyIDIzOEwzNzcgMjE1UTM2MyAxNjEgMzQ0IDEwMFQzMDEgLTIzVDI1MiAtMTQ2VDIwMSAtMjY0SDYzUTc4IC0yMDMgOTIgLTEzN1QxMjAgLTZUMTQ1IDEyMlQxNjQgMjM4SDM2MloiIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgZ2x5cGgtbmFtZT0iaHlwaGVuIiBob3Jpei1hZHYteD0iNjU5IiBkPSJNODIgNDY1VjYzM0g1NzhWNDY1SDgyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBnbHlwaC1uYW1lPSJwZXJpb2QiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0xNDcgMTExUTE0NyAxNDkgMTU3IDE3NVQxODQgMjE4VDIyNCAyNDJUMjc0IDI1MFEzMDAgMjUwIDMyMyAyNDNUMzY0IDIxOVQzOTEgMTc2VDQwMSAxMTFRNDAxIDc0IDM5MSA0OFQzNjQgNFQzMjQgLTIxVDI3NCAtMjlRMjQ3IC0yOSAyMjQgLTIxVDE4NCA0VDE1NyA0N1QxNDcgMTExWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIvIiBnbHlwaC1uYW1lPSJzbGFzaCIgaG9yaXotYWR2LXg9Ijc2NCIgZD0iTTc0MyAxNDYyTDE5OSAwSDIwTDU2NSAxNDYySDc0M1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgZ2x5cGgtbmFtZT0iemVybyIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik0xMDMyIDczM1ExMDMyIDU1NiAxMDA3IDQxNlQ5MjUgMTc5VDc3OSAzMVQ1NjMgLTIwUTQ0NSAtMjAgMzU4IDMxVDIxMyAxNzlUMTI3IDQxNlQ5OCA3MzNROTggOTEwIDEyMyAxMDUwVDIwNCAxMjg2VDM0OCAxNDM0VDU2MyAxNDg1UTY4MiAxNDg1IDc3MCAxNDM1VDkxNiAxMjg4VDEwMDMgMTA1MVQxMDMyIDczM1pNMjgzCis3MzNRMjgzIDU4MyAyOTggNDcxVDM0NiAyODVUNDMyIDE3M1Q1NjMgMTM1UTY0MCAxMzUgNjk0IDE3MlQ3ODIgMjgzVDgzMiA0NjlUODQ4IDczM1E4NDggODgzIDgzMyA5OTVUNzgzIDExODFUNjk0IDEyOTJUNTYzIDEzMjlRNDg2IDEzMjkgNDMzIDEyOTJUMzQ2IDExODFUMjk4IDk5NVQyODMgNzMzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIxIiBnbHlwaC1uYW1lPSJvbmUiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNzExIDBINTM1VjkxM1E1MzUgOTU2IDUzNSAxMDA1VDUzNyAxMTAyVDU0MCAxMTk1VDU0MyAxMjc0UTUyNiAxMjU2IDUxMyAxMjQzVDQ4NyAxMjE4VDQ1OCAxMTkzVDQyMiAxMTYxTDI3NCAxMDQwTDE3OCAxMTYzTDU2MSAxNDYySDcxMVYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIyIiBnbHlwaC1uYW1lPSJ0d28iIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTAwOCAwSDk2VjE1Nkw0NDYgNTM3UTUyMSA2MTggNTgwIDY4NVQ2ODAgODE2VDc0NCA5NDRUNzY2IDEwODVRNzY2IDExNDQgNzQ5IDExODlUNzAxIDEyNjVUNjI2IDEzMTNUNTMwIDEzMjlRNDM1IDEzMjkgMzU5IDEyOTFUMjEzIDExOTJMMTExIDEzMTFRMTUxIDEzNDcgMTk3IDEzNzhUMjk2IDE0MzNUNDA4IDE0NjlUNTMyCisxNDgzUTYyOCAxNDgzIDcwNSAxNDU2VDgzNyAxMzc5VDkyMCAxMjU2VDk1MCAxMDkyUTk1MCAxMDA3IDkyNCA5MzBUODUxIDc3OVQ3NDAgNjI5VDYwMCA0NzNMMzE5IDE3NFYxNjZIMTAwOFYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBnbHlwaC1uYW1lPSJ0aHJlZSIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik05NjEgMTEyMFE5NjEgMTA0NyA5MzggOTg3VDg3NCA4ODNUNzc0IDgxMVQ2NDUgNzcwVjc2NFE4MjIgNzQyIDkxNCA2NTJUMTAwNiA0MTZRMTAwNiAzMjAgOTc0IDI0MFQ4NzUgMTAyVDcwOCAxMlQ0NjkgLTIwUTM2MCAtMjAgMjY0IC0zVDgyIDU5VjIyOVExNjkgMTgzIDI3MCAxNThUNDY1IDEzM1E1NTcgMTMzIDYyNAorMTUzVDczNCAyMTBUNzk4IDMwMVQ4MTkgNDIyUTgxOSA0OTAgNzkzIDUzOFQ3MTcgNjE4VDU5OCA2NjVUNDM4IDY4MEgzMDVWODMxSDQzOFE1MTkgODMxIDU4MiA4NTFUNjg3IDkwOFQ3NTIgOTk2VDc3NCAxMTA4UTc3NCAxMTYwIDc1NiAxMjAxVDcwNSAxMjcwVDYyNiAxMzE0VDUyNCAxMzI5UTQxNyAxMzI5IDMzNiAxMjk2VDE4MCAxMjA4TDg4IDEzMzNRMTI2IDEzNjQgMTcyIDEzOTFUMjc0IDE0MzhUMzkxIDE0NzFUNTI0CisxNDgzUTYzMiAxNDgzIDcxMyAxNDU2VDg1MCAxMzgxVDkzMyAxMjY2VDk2MSAxMTIwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSI0IiBnbHlwaC1uYW1lPSJmb3VyIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTEwODcgMzI4SDg3NFYwSDY5OFYzMjhIMjNWNDg3TDY4NiAxNDcwSDg3NFY0OTRIMTA4N1YzMjhaTTY5OCA0OTRWODUwUTY5OCA5MDYgNjk5IDk2N1Q3MDMgMTA4N1Q3MDcgMTE5N1Q3MTEgMTI4Mkg3MDJRNjk1IDEyNjIgNjg1IDEyMzhUNjYyIDExODlUNjM2IDExNDFUNjEyIDExMDJMMjAxIDQ5NEg2OThaIiAvPgorPGdseXBoIHVuaWNvZGU9IjUiIGdseXBoLW5hbWU9ImZpdmUiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNTQ1IDg5N1E2NDQgODk3IDcyOSA4NzBUODc4IDc4OFQ5NzggNjU0VDEwMTQgNDY5UTEwMTQgMzU1IDk4MCAyNjRUODc5IDExMFQ3MTQgMTRUNDg3IC0yMFE0MzYgLTIwIDM4NyAtMTVUMjkyIC0xVDIwNSAyNFQxMzEgNTlWMjMxUTE2NCAyMDggMjA4IDE5MFQzMDIgMTYwVDQwMCAxNDJUNDkyIDEzNVE1NzEgMTM1IDYzMworMTUzVDczOCAyMTFUODA0IDMwOVQ4MjcgNDQ5UTgyNyA1OTIgNzM5IDY2N1Q0ODMgNzQzUTQ1NiA3NDMgNDI1IDc0MVQzNjIgNzM0VDMwMiA3MjZUMjUyIDcxN0wxNjIgNzc0TDIxNyAxNDYySDkwN1YxMjk2SDM3NUwzMzYgODc3UTM2OCA4ODMgNDIwIDg5MFQ1NDUgODk3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSI2IiBnbHlwaC1uYW1lPSJzaXgiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTEzIDYyNVExMTMgNzMwIDEyMyA4MzRUMTYwIDEwMzNUMjMzIDEyMTFUMzUwIDEzNTNUNTIwIDE0NDhUNzUyIDE0ODNRNzcxIDE0ODMgNzk0IDE0ODJUODQwIDE0NzlUODg1IDE0NzNUOTI0IDE0NjRWMTMwOVE4ODkgMTMyMSA4NDUgMTMyN1Q3NTggMTMzM1E2NjggMTMzMyA2MDAgMTMxMlQ0ODEgMTI1MVQzOTggMTE1OFQzNDMKKzEwMzlUMzEyIDg5OVQyOTkgNzQ1SDMxMVEzMzEgNzgxIDM1OSA4MTJUNDI2IDg2NlQ1MTEgOTAyVDYxOCA5MTVRNzEzIDkxNSA3OTAgODg2VDkyMSA3OTlUMTAwNCA2NjBUMTAzNCA0NzFRMTAzNCAzNTcgMTAwMyAyNjZUOTE0IDExMlQ3NzQgMTRUNTkwIC0yMFE0OTAgLTIwIDQwMyAxOVQyNTEgMTM4VDE1MCAzMzlUMTEzIDYyNVpNNTg4IDEzM1E2NDggMTMzIDY5NyAxNTNUNzgzIDIxNVQ4MzggMzIwVDg1OCA0NzFRODU4IDU0MQorODQyIDU5NlQ3OTIgNjkxVDcxMCA3NTFUNTk0IDc3MlE1MjcgNzcyIDQ3MiA3NDlUMzc3IDY4OFQzMTcgNjAyVDI5NSA1MDZRMjk1IDQzOSAzMTMgMzczVDM2OCAyNTNUNDYwIDE2N1Q1ODggMTMzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSI3IiBnbHlwaC1uYW1lPSJzZXZlbiIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik0yODEgMEw4NDQgMTI5Nkg5MFYxNDYySDEwMzBWMTMxN0w0NzUgMEgyODFaIiAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGdseXBoLW5hbWU9ImVpZ2h0IiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTU2NSAxNDg1UTY0OSAxNDg1IDcyMyAxNDYzVDg1NCAxMzk3VDk0NCAxMjg3VDk3NyAxMTMzUTk3NyAxMDY2IDk1NyAxMDEyVDkwMiA5MTVUODE5IDgzN1Q3MTUgNzc0UTc3MyA3NDMgODI4IDcwNVQ5MjcgNjIwVDk5NyA1MTNUMTAyNCAzODFRMTAyNCAyODkgOTkxIDIxNVQ4OTcgODhUNzUyIDhUNTY1IC0yMFE0NTUgLTIwCiszNzAgN1QyMjYgODRUMTM3IDIwOFQxMDYgMzczUTEwNiA0NDggMTI4IDUwOFQxODkgNjE2VDI3OSA3MDFUMzg5IDc2NlEzNDAgNzk3IDI5NyA4MzNUMjIzIDkxNVQxNzMgMTAxNFQxNTQgMTEzNVExNTQgMTIyMiAxODcgMTI4N1QyNzggMTM5N1Q0MDkgMTQ2M1Q1NjUgMTQ4NVpNMjg1IDM3MVEyODUgMzE4IDMwMSAyNzRUMzUxIDE5OFQ0MzcgMTQ5VDU2MSAxMzFRNjMxIDEzMSA2ODQgMTQ4VDc3NCAxOThUODI4IDI3N1Q4NDYKKzM3OVE4NDYgNDMxIDgyNyA0NzNUNzcxIDU1MVQ2ODMgNjE5VDU2OSA2ODJMNTM5IDY5NlE0MTMgNjM2IDM0OSA1NTlUMjg1IDM3MVpNNTYzIDEzMzNRNDU3IDEzMzMgMzk1IDEyODBUMzMyIDExMjZRMzMyIDEwNjkgMzQ5IDEwMjhUMzk4IDk1NVQ0NzIgODk4VDU2NyA4NDhRNjE1IDg3MCA2NTcgODk2VDczMSA5NTVUNzgxIDEwMzBUNzk5IDExMjZRNzk5IDEyMjcgNzM2IDEyODBUNTYzIDEzMzNaIiAvPgorPGdseXBoIHVuaWNvZGU9IjkiIGdseXBoLW5hbWU9Im5pbmUiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTAyOCA4MzhRMTAyOCA3MzMgMTAxOCA2MjlUOTgxIDQyOVQ5MDggMjUyVDc5MSAxMDlUNjIxIDE1VDM4OSAtMjBRMzcwIC0yMCAzNDcgLTE5VDMwMSAtMTZUMjU2IC0xMFQyMTcgLTJWMTU0UTI1MiAxNDEgMjk2IDEzNVQzODMgMTI5UTUxOCAxMjkgNjA1IDE3NlQ3NDMgMzAzVDgxNSA0OTFUODQyIDcxN0g4MjlRODA5Cis2ODEgNzgxIDY1MFQ3MTUgNTk2VDYyOSA1NjBUNTIyIDU0N1E0MjcgNTQ3IDM1MCA1NzZUMjE5IDY2M1QxMzYgODAyVDEwNiA5OTFRMTA2IDExMDUgMTM3IDExOTZUMjI2IDEzNTFUMzY2IDE0NDlUNTUxIDE0ODNRNjUyIDE0ODMgNzM5IDE0NDRUODkwIDEzMjVUOTkxIDExMjRUMTAyOCA4MzhaTTU1MyAxMzI5UTQ5MyAxMzI5IDQ0NCAxMzA5VDM1OCAxMjQ3VDMwMyAxMTQyVDI4MyA5OTFRMjgzIDkyMSAyOTkgODY2VDM0OSA3NzFUNDMxCis3MTFUNTQ3IDY5MFE2MTUgNjkwIDY3MCA3MTNUNzY0IDc3NFQ4MjQgODYwVDg0NiA5NTZRODQ2IDEwMjMgODI4IDEwODlUNzczIDEyMDlUNjgxIDEyOTZUNTUzIDEzMjlaIiAvPgorPGdseXBoIHVuaWNvZGU9IjoiIGdseXBoLW5hbWU9ImNvbG9uIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMTQ3IDExMVExNDcgMTQ5IDE1NyAxNzVUMTg0IDIxOFQyMjQgMjQyVDI3NCAyNTBRMzAwIDI1MCAzMjMgMjQzVDM2NCAyMTlUMzkxIDE3NlQ0MDEgMTExUTQwMSA3NCAzOTEgNDhUMzY0IDRUMzI0IC0yMVQyNzQgLTI5UTI0NyAtMjkgMjI0IC0yMVQxODQgNFQxNTcgNDdUMTQ3IDExMVpNMTQ3IDk4N1ExNDcgMTAyNiAxNTcKKzEwNTJUMTg0IDEwOTVUMjI0IDExMTlUMjc0IDExMjZRMzAwIDExMjYgMzIzIDExMTlUMzY0IDEwOTZUMzkxIDEwNTNUNDAxIDk4N1E0MDEgOTUwIDM5MSA5MjRUMzY0IDg4MVQzMjQgODU2VDI3NCA4NDhRMjQ3IDg0OCAyMjQgODU2VDE4NCA4ODFUMTU3IDkyNFQxNDcgOTg3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBnbHlwaC1uYW1lPSJzZW1pY29sb24iIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0zNjIgMjM4TDM3NyAyMTVRMzYzIDE2MSAzNDQgMTAwVDMwMSAtMjNUMjUyIC0xNDZUMjAxIC0yNjRINjNRNzggLTIwMyA5MiAtMTM3VDEyMCAtNlQxNDUgMTIyVDE2NCAyMzhIMzYyWk0xNDcgOTg3UTE0NyAxMDI2IDE1NyAxMDUyVDE4NCAxMDk1VDIyNCAxMTE5VDI3NCAxMTI2UTMwMCAxMTI2IDMyMyAxMTE5VDM2NAorMTA5NlQzOTEgMTA1M1Q0MDEgOTg3UTQwMSA5NTAgMzkxIDkyNFQzNjQgODgxVDMyNCA4NTZUMjc0IDg0OFEyNDcgODQ4IDIyNCA4NTZUMTg0IDg4MVQxNTcgOTI0VDE0NyA5ODdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiZsdDsiIGdseXBoLW5hbWU9Imxlc3MiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTAyNiAyMzhMMTAyIDY2MlY3NjRMMTAyNiAxMjQ1VjEwODVMMjkxIDcyMUwxMDI2IDM5OVYyMzhaIiAvPgorPGdseXBoIHVuaWNvZGU9Ij0iIGdseXBoLW5hbWU9ImVxdWFsIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTEwMiA4NTJWMTAwMUgxMDI2Vjg1MkgxMDJaTTEwMiA0NDJWNTkySDEwMjZWNDQySDEwMloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJmd0OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlciIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik0xMDIgMzk5TDgzOCA3MjFMMTAyIDEwODVWMTI0NUwxMDI2IDc2NFY2NjJMMTAyIDIzOFYzOTlaIiAvPgorPGdseXBoIHVuaWNvZGU9Ij8iIGdseXBoLW5hbWU9InF1ZXN0aW9uIiBob3Jpei1hZHYteD0iODcyIiBkPSJNMjgxIDQxNFY0NTFRMjgxIDUwOCAyODggNTU0VDMxNSA2NDBUMzY4IDcxOFQ0NTEgNzk5UTQ5OSA4NDAgNTMzIDg3M1Q1ODggOTQxVDYyMCAxMDE1VDYzMSAxMTA4UTYzMSAxMTU2IDYxNiAxMTk1VDU3MyAxMjYzVDUwMiAxMzA3VDQwMyAxMzIzUTMyMCAxMzIzIDI0NSAxMjk3VDEwMCAxMjM3TDM3IDEzODJRMTE4CisxNDI0IDIxMiAxNDUzVDQwMyAxNDgzUTQ5NiAxNDgzIDU3MCAxNDU4VDY5NyAxMzg0VDc3NyAxMjY3VDgwNSAxMTEwUTgwNSAxMDQzIDc5MiA5OTFUNzUxIDg5M1Q2ODQgODA2VDU5MCA3MTdRNTM4IDY3MiA1MDUgNjM5VDQ1MyA1NzRUNDI3IDUwOVQ0MjAgNDMyVjQxNEgyODFaTTIzMyAxMTFRMjMzIDE0OSAyNDMgMTc1VDI3MCAyMThUMzEwIDI0MlQzNjAgMjUwUTM4NiAyNTAgNDA5IDI0M1Q0NTAgMjE5VDQ3NyAxNzZUNDg3CisxMTFRNDg3IDc0IDQ3NyA0OFQ0NTAgNFQ0MTAgLTIxVDM2MCAtMjlRMzMzIC0yOSAzMTAgLTIxVDI3MCA0VDI0MyA0N1QyMzMgMTExWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJAIiBnbHlwaC1uYW1lPSJhdCIgaG9yaXotYWR2LXg9IjE3NzQiIGQ9Ik0xNjY1IDczMVExNjY1IDY2OSAxNjU2IDYwN1QxNjI4IDQ4OFQxNTgxIDM4M1QxNTE0IDI5OFQxNDI4IDI0MlQxMzIxIDIyMVExMjc2IDIyMSAxMjQwIDIzNlQxMTc3IDI3NlQxMTM1IDMzM1QxMTEyIDQwMUgxMTA4UTEwOTAgMzY0IDEwNjMgMzMxVDEwMDEgMjc0VDkyMSAyMzVUODIzIDIyMVE3NDYgMjIxIDY4NyAyNDlUNTg2CiszMjdUNTI0IDQ0OVQ1MDIgNjA2UTUwMiA3MDcgNTMxIDc5MVQ2MTYgOTM2VDc1MSAxMDMxVDkyOCAxMDY1UTk3MyAxMDY1IDEwMTggMTA2MVQxMTA0IDEwNTBUMTE3OSAxMDM1VDEyMzcgMTAxOEwxMjE0IDYwMlExMjEzIDU4MCAxMjEzIDU2N1QxMjEyIDU0NVQxMjEyIDUzM1QxMjEyIDUyNlExMjEyIDQ3MyAxMjIyIDQzOVQxMjUwIDM4NVQxMjg4IDM1OFQxMzMzIDM1MFExMzc5IDM1MCAxNDE0IDM4MFQxNDcyIDQ2M1QxNTA4Cis1ODVUMTUyMCA3MzNRMTUyMCA4NzUgMTQ3NyA5ODVUMTM1OCAxMTcyVDExNzggMTI4N1Q5NTAgMTMyN1E3ODEgMTMyNyA2NTIgMTI3MlQ0MzYgMTExN1QzMDMgODgxVDI1OCA1ODJRMjU4IDQzMSAyOTcgMzE0VDQxMyAxMTdUNjAzIC00VDg2NCAtNDVROTI1IC00NSA5ODQgLTM4VDEwOTkgLTE5VDEyMDUgOFQxMjk4IDQxVi0xMDBRMTIxMiAtMTM4IDExMDQgLTE2MFQ4NjYgLTE4MlE2ODcgLTE4MiA1NDcgLTEzMVQzMDkgMTdUMTYwCisyNTVUMTA5IDU3NVExMDkgNzYzIDE2OCA5MjVUMzM2IDEyMDdUNjAxIDEzOTRUOTUwIDE0NjJRMTEwNiAxNDYyIDEyMzcgMTQxMlQxNDYzIDEyNjdUMTYxMiAxMDM3VDE2NjUgNzMxWk02NjIgNjAyUTY2MiA0NjkgNzEyIDQxMFQ4NDggMzUwUTkwMyAzNTAgOTQyIDM3MlQxMDA2IDQzNlQxMDQ0IDUzNVQxMDYxIDY2MkwxMDc1IDkxNVExMDQ3IDkyMyAxMDA5IDkyOVQ5MjggOTM2UTg1NCA5MzYgODA0IDkwN1Q3MjIgODMxVDY3NgorNzI0VDY2MiA2MDJaIiAvPgorPGdseXBoIHVuaWNvZGU9IkEiIGdseXBoLW5hbWU9IkEiIGhvcml6LWFkdi14PSIxMjQ1IiBkPSJNMTA1NSAwTDg5NSA0NTNIMzUwTDE4OCAwSDBMNTM3IDE0NjhINzA3TDEyNDUgMEgxMDU1Wk04MzYgNjE4TDY4OCAxMDQyUTY4MiAxMDYwIDY3NCAxMDg2VDY1NiAxMTQyVDYzOCAxMjA0VDYyMSAxMjY4UTYxNCAxMjM3IDYwNSAxMjA0VDU4NyAxMTQxVDU3MCAxMDg1VDU1NSAxMDQyTDQxMCA2MThIODM2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJCIiBnbHlwaC1uYW1lPSJCIiBob3Jpei1hZHYteD0iMTI3MiIgZD0iTTE5OSAxNDYySDU5OFE3MjYgMTQ2MiA4MjMgMTQ0M1Q5ODYgMTM4MFQxMDg1IDEyNjZUMTExOCAxMDkyUTExMTggMTAzMCAxMDk5IDk3NlQxMDQyIDg4MVQ5NTEgODEzVDgyNyA3NzZWNzY2UTg5NiA3NTQgOTU2IDczMlQxMDYyIDY3MFQxMTMzIDU3MFQxMTU5IDQyNFExMTU5IDMyNCAxMTI3IDI0NlQxMDMzIDExM1Q4ODMgMjlUNjg0CiswSDE5OVYxNDYyWk0zODUgODQySDYyOVE3MTMgODQyIDc3MCA4NTdUODYyIDkwMVQ5MTIgOTc1VDkyOCAxMDc5UTkyOCAxMTk5IDg1MSAxMjUxVDYwOCAxMzAzSDM4NVY4NDJaTTM4NSA2ODZWMTU4SDY1MVE3MzkgMTU4IDc5OCAxNzhUODk0IDIzNFQ5NDcgMzIwVDk2MyA0MzJROTYzIDQ4OCA5NDcgNTM1VDg5MyA2MTVUNzkzIDY2N1Q2MzkgNjg2SDM4NVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgZ2x5cGgtbmFtZT0iQyIgaG9yaXotYWR2LXg9IjEyMzUiIGQ9Ik03OTMgMTMxOVE2ODYgMTMxOSA1OTkgMTI3OVQ0NTEgMTE2MlQzNTYgOTc3VDMyMiA3MzFRMzIyIDU5MCAzNTEgNDgxVDQ0MCAyOTZUNTg3IDE4MlQ3OTMgMTQzUTg4MiAxNDMgOTYyIDE2MFQxMTIwIDIwMVYzOVExMDgxIDI0IDEwNDIgMTNUOTYxIC02VDg3MCAtMTZUNzYyIC0yMFE1OTggLTIwIDQ3OCAzNFQyODAgMTg3VDE2MworNDI1VDEyNSA3MzNRMTI1IDg5OSAxNjggMTAzN1QyOTYgMTI3NFQ1MDYgMTQyOFQ3OTMgMTQ4M1E5MDEgMTQ4MyA5OTkgMTQ2MVQxMTc2IDEzOTdMMTA5OCAxMjQxUTEwMzUgMTI3MyA5NjEgMTI5NlQ3OTMgMTMxOVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iRCIgZ2x5cGgtbmFtZT0iRCIgaG9yaXotYWR2LXg9IjE0MDEiIGQ9Ik0xMjc2IDc0NVExMjc2IDU2MCAxMjI4IDQyMVQxMDg5IDE4OFQ4NjYgNDdUNTY1IDBIMTk5VjE0NjJINjA2UTc1OSAxNDYyIDg4MyAxNDE2VDEwOTQgMTI4MFQxMjI4IDEwNTVUMTI3NiA3NDVaTTEwNzkgNzM5UTEwNzkgODg1IDEwNDYgOTkxVDk1MCAxMTY3VDc5NSAxMjY5VDU4NiAxMzAzSDM4NVYxNjBINTQ3UTgxMSAxNjAKKzk0NSAzMDZUMTA3OSA3MzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IkUiIGdseXBoLW5hbWU9IkUiIGhvcml6LWFkdi14PSIxMDgxIiBkPSJNOTU4IDBIMTk5VjE0NjJIOTU4VjEyOThIMzg1Vjg0Nkg5MjBWNjg0SDM4NVYxNjRIOTU4VjBaIiAvPgorPGdseXBoIHVuaWNvZGU9IkYiIGdseXBoLW5hbWU9IkYiIGhvcml6LWFkdi14PSIxMDA2IiBkPSJNMzg1IDBIMTk5VjE0NjJIOTU4VjEyOThIMzg1Vjc4Mkg5MjBWNjE4SDM4NVYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJHIiBnbHlwaC1uYW1lPSJHIiBob3Jpei1hZHYteD0iMTQxMyIgZD0iTTc4MiA3NzJIMTI2NlY1NVExMjExIDM3IDExNTUgMjNUMTA0MCAwVDkxNiAtMTVUNzc2IC0yMFE2MTkgLTIwIDQ5OCAzMlQyOTQgMTgyVDE2OCA0MTlUMTI1IDczM1ExMjUgOTA1IDE3MiAxMDQ0VDMxMSAxMjgwVDUzNSAxNDMwVDg0MCAxNDgzUTk1MSAxNDgzIDEwNTMgMTQ2MVQxMjQzIDEzOTdMMTE3MSAxMjM1UTExMzUgMTI1MgorMTA5NCAxMjY3VDEwMDggMTI5M1Q5MTggMTMxMlQ4MjUgMTMxOVE3MDMgMTMxOSA2MDkgMTI3OVQ0NTIgMTE2MlQzNTUgOTc3VDMyMiA3MzFRMzIyIDYwMSAzNDkgNDkzVDQzNyAzMDdUNTkyIDE4NlQ4MjEgMTQzUTg2NSAxNDMgOTAxIDE0NVQ5NjkgMTUyVDEwMjcgMTYxVDEwODEgMTcyVjYwOEg3ODJWNzcyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBnbHlwaC1uYW1lPSJIIiBob3Jpei1hZHYteD0iMTQzNiIgZD0iTTEyMzcgMEgxMDUxVjY4MkgzODVWMEgxOTlWMTQ2MkgzODVWODQ2SDEwNTFWMTQ2MkgxMjM3VjBaIiAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGdseXBoLW5hbWU9IkkiIGhvcml6LWFkdi14PSI2OTQiIGQ9Ik02MTIgMEg4MlYxMDJMMjU0IDE0M1YxMzE5TDgyIDEzNjBWMTQ2Mkg2MTJWMTM2MEw0NDAgMTMxOVYxNDNMNjEyIDEwMlYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJKIiBnbHlwaC1uYW1lPSJKIiBob3Jpei1hZHYteD0iNTU1IiBkPSJNLTI5IC0zODlRLTgwIC0zODkgLTExOCAtMzgzVC0xODQgLTM2NVYtMjA1US0xNTAgLTIxNCAtMTExIC0yMTlULTI3IC0yMjVRMTAgLTIyNSA0NyAtMjE2VDExNSAtMTgxVDE2NSAtMTEyVDE4NCAwVjE0NjJIMzcxVjIwUTM3MSAtODUgMzQyIC0xNjJUMjYwIC0yODlUMTM0IC0zNjRULTI5IC0zODlaIiAvPgorPGdseXBoIHVuaWNvZGU9IksiIGdseXBoLW5hbWU9IksiIGhvcml6LWFkdi14PSIxMTg2IiBkPSJNMTE4NiAwSDk3NUw1MjQgNjk4TDM4NSA1ODRWMEgxOTlWMTQ2MkgzODVWNzMxTDUwNiA4OTlMOTU4IDE0NjJIMTE2N0w2NDcgODI1TDExODYgMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iTCIgZ2x5cGgtbmFtZT0iTCIgaG9yaXotYWR2LXg9IjEwMDYiIGQ9Ik0xOTkgMFYxNDYySDM4NVYxNjZIOTU4VjBIMTk5WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJNIiBnbHlwaC1uYW1lPSJNIiBob3Jpei1hZHYteD0iMTc4MiIgZD0iTTgwMyAwTDM2MCAxMjgwSDM1MlEzNTggMTIwNiAzNjIgMTEzM1EzNjYgMTA3MCAzNjggMTAwMVQzNzEgODc0VjBIMTk5VjE0NjJINDc1TDg4NyAyNzBIODkzTDEzMDcgMTQ2MkgxNTgzVjBIMTM5N1Y4ODdRMTM5NyA5MzkgMTM5OSAxMDA2VDE0MDQgMTEzNFExNDA4IDEyMDUgMTQxMSAxMjc4SDE0MDNMOTU2IDBIODAzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBnbHlwaC1uYW1lPSJOIiBob3Jpei1hZHYteD0iMTQ5MyIgZD0iTTEyOTQgMEgxMDc5TDM2MCAxMjEwSDM1MlEzNTggMTEzMyAzNjIgMTA1N1EzNjYgOTkyIDM2OCA5MjFUMzcxIDc5M1YwSDE5OVYxNDYySDQxMkwxMTI4IDI1OEgxMTM1UTExMzIgMzM0IDExMjggNDA4UTExMjcgNDQwIDExMjYgNDczVDExMjMgNTQwVDExMjEgNjA1VDExMjAgNjYyVjE0NjJIMTI5NFYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJPIiBnbHlwaC1uYW1lPSJPIiBob3Jpei1hZHYteD0iMTUyMCIgZD0iTTEzOTMgNzMzUTEzOTMgNTY0IDEzNTMgNDI1VDEyMzIgMTg3VDEwMzQgMzRUNzYwIC0yMFE1OTcgLTIwIDQ3OCAzNFQyODAgMTg3VDE2MyA0MjVUMTI1IDczNVExMjUgOTA1IDE2MyAxMDQzVDI4MCAxMjgwVDQ3OSAxNDMxVDc2MiAxNDg1UTkxNyAxNDg1IDEwMzQgMTQzMlQxMjMyIDEyODBUMTM1MiAxMDQzVDEzOTMgNzMzWk0zMjIKKzczM1EzMjIgNTk2IDM0OCA0ODdUNDI3IDMwMVQ1NjMgMTg0VDc2MCAxNDNRODc0IDE0MyA5NTYgMTgzVDEwOTIgMzAwVDExNzEgNDg2VDExOTYgNzMzUTExOTYgODcxIDExNzEgOTgwVDEwOTMgMTE2NFQ5NTggMTI4MFQ3NjIgMTMyMVE2NDggMTMyMSA1NjUgMTI4MVQ0MjggMTE2NVQzNDggOTgwVDMyMiA3MzNaIiAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGdseXBoLW5hbWU9IlAiIGhvcml6LWFkdi14PSIxMTgwIiBkPSJNMTA3NSAxMDM0UTEwNzUgOTQzIDEwNDggODU5VDk1NyA3MTFUNzkxIDYwOFQ1MzUgNTY5SDM4NVYwSDE5OVYxNDYySDU2MVE2OTUgMTQ2MiA3OTIgMTQzNFQ5NTIgMTM1MVQxMDQ1IDEyMTZUMTA3NSAxMDM0Wk0zODUgNzI3SDUxNFE2MDcgNzI3IDY3NiA3NDNUNzkxIDc5NFQ4NjAgODg2VDg4MyAxMDI0UTg4MyAxMTY2IDgwMQorMTIzNFQ1NDUgMTMwM0gzODVWNzI3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJRIiBnbHlwaC1uYW1lPSJRIiBob3Jpei1hZHYteD0iMTUxOCIgZD0iTTEzOTMgNzMzUTEzOTMgNjAyIDEzNjkgNDg5VDEyOTcgMjg2VDExNzggMTI5VDEwMTQgMjVRMTA1NyAtNjkgMTEyNSAtMTQwVDEyODQgLTI3MkwxMTYzIC00MTRRMTA2MCAtMzQxIDk3NCAtMjQyVDgzNiAtMTZRODE5IC0xOCA3OTkgLTE5VDc2MCAtMjBRNTk3IC0yMCA0NzggMzRUMjgwIDE4N1QxNjMgNDI1VDEyNSA3MzVRMTI1Cis5MDUgMTYzIDEwNDNUMjgwIDEyODBUNDc5IDE0MzFUNzYyIDE0ODVROTE3IDE0ODUgMTAzNCAxNDMyVDEyMzIgMTI4MFQxMzUyIDEwNDNUMTM5MyA3MzNaTTMyMiA3MzNRMzIyIDU5NiAzNDggNDg3VDQyNyAzMDFUNTYzIDE4NFQ3NjAgMTQzUTg3NCAxNDMgOTU2IDE4M1QxMDkyIDMwMFQxMTcxIDQ4NlQxMTk2IDczM1ExMTk2IDg3MSAxMTcxIDk4MFQxMDkzIDExNjRUOTU4IDEyODBUNzYyIDEzMjFRNjQ4IDEzMjEgNTY1IDEyODFUNDI4CisxMTY1VDM0OCA5ODBUMzIyIDczM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgZ2x5cGgtbmFtZT0iUiIgaG9yaXotYWR2LXg9IjEyMDgiIGQ9Ik0zODUgNjA0VjBIMTk5VjE0NjJINTU1UTgyMSAxNDYyIDk0OCAxMzU5VDEwNzUgMTA0N1ExMDc1IDk2MCAxMDUxIDg5NVQ5ODYgNzg0VDg5MyA3MDZUNzg2IDY1NUwxMTg0IDBIOTY1TDYxNCA2MDRIMzg1Wk0zODUgNzYySDU0OVE2MzkgNzYyIDcwMiA3NzlUODA1IDgzMVQ4NjQgOTE3VDg4MyAxMDM4UTg4MyAxMTEwIDg2MyAxMTYwVDgwMQorMTI0MlQ2OTYgMTI4OFQ1NDUgMTMwM0gzODVWNzYyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBnbHlwaC1uYW1lPSJTIiBob3Jpei1hZHYteD0iMTA2MyIgZD0iTTk2OSAzOTFROTY5IDI5NCA5MzUgMjE4VDgzNiA4OFQ2ODAgOFQ0NzMgLTIwUTM2MiAtMjAgMjY2IC0zVDEwNCA0OVYyMjdRMTM4IDIxMSAxODEgMTk2VDI3MyAxNjhUMzcyIDE0OVQ0NzMgMTQxUTYzMyAxNDEgNzA5IDIwMVQ3ODYgMzczUTc4NiA0MjcgNzcyIDQ2N1Q3MjEgNTQwVDYyMyA2MDVUNDY5IDY3NFEzODAgNzA5IDMxNQorNzUwVDIwNyA4NDRUMTQ0IDk2MlQxMjMgMTExMlExMjMgMTIwMCAxNTUgMTI2OVQyNDUgMTM4NVQzODMgMTQ1OFQ1NjEgMTQ4M1E2ODAgMTQ4MyA3NzUgMTQ2MVQ5NDQgMTQwM0w4NzcgMTI0N1E4MTIgMTI3NiA3MzAgMTI5N1Q1NTkgMTMxOVE0MzcgMTMxOSAzNzAgMTI2M1QzMDMgMTExMFEzMDMgMTA1MyAzMTggMTAxMlQzNjggOTM3VDQ2MCA4NzRUNjAyIDgxMVE2OTMgNzc1IDc2MSA3MzdUODc2IDY1MVQ5NDUgNTQwVDk2OQorMzkxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJUIiBnbHlwaC1uYW1lPSJUIiBob3Jpei1hZHYteD0iMTA2MyIgZD0iTTYyNSAwSDQzOFYxMjk4SDIwVjE0NjJIMTA0MlYxMjk4SDYyNVYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJVIiBnbHlwaC1uYW1lPSJVIiBob3Jpei1hZHYteD0iMTQzMCIgZD0iTTEyNDUgMTQ2NFY1MTZRMTI0NSA0MDIgMTIxMiAzMDRUMTExMyAxMzRUOTQ2IDIxVDcwOSAtMjBRNTgxIC0yMCA0ODMgMThUMzE5IDEyOFQyMTggMjk4VDE4NCA1MjBWMTQ2MkgzNzFWNTEwUTM3MSAzMzUgNDU3IDIzOVQ3MTkgMTQzUTgwOCAxNDMgODcyIDE3MFQ5NzcgMjQ2VDEwMzggMzYzVDEwNTkgNTEyVjE0NjRIMTI0NVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iViIgZ2x5cGgtbmFtZT0iViIgaG9yaXotYWR2LXg9IjExNjMiIGQ9Ik05NjUgMTQ2MkgxMTYzTDY3NCAwSDQ4N0wwIDE0NjJIMTk3TDQ5MiA1MzVRNTIxIDQ0NCA1NDIgMzYwVDU4MCAyMDFRNTk1IDI3NSA2MTggMzU5VDY3MiA1NDFMOTY1IDE0NjJaIiAvPgorPGdseXBoIHVuaWNvZGU9IlciIGdseXBoLW5hbWU9IlciIGhvcml6LWFkdi14PSIxODEwIiBkPSJNODA5IDE0NjJIMTAwNkwxMjM1IDYwNlExMjUwIDU1MCAxMjY0IDQ5NFQxMjkxIDM4NlQxMzEzIDI4NlQxMzI5IDIwMVExMzMzIDIzOSAxMzM5IDI4NFQxMzUzIDM3OFQxMzcwIDQ3OVQxMzkxIDU4MEwxNTkxIDE0NjJIMTc5MEwxNDIzIDBIMTIzNUw5ODEgOTM4UTk2NyA5ODkgOTU0IDEwNDNUOTMwIDExNDRROTE4IDExOTkgOTA3CisxMjUxUTg5NiAxMjAwIDg4NSAxMTQ1UTg3NSAxMDk4IDg2MyAxMDQyVDgzNiA5MzJMNTk0IDBINDA2TDIwIDE0NjJIMjE3TDQ0MCA1NzNRNDUyIDUyNyA0NjIgNDc4VDQ4MCAzNzlUNDk2IDI4NVQ1MDggMjAxUTUxMyAyMzggNTIwIDI4N1Q1MzggMzkwVDU1OSA0OTlUNTg0IDYwNEw4MDkgMTQ2MloiIC8+Cis8Z2x5cGggdW5pY29kZT0iWCIgZ2x5cGgtbmFtZT0iWCIgaG9yaXotYWR2LXg9IjExMjAiIGQ9Ik0xMTIwIDBIOTA5TDU1NSA2MzVMMTg4IDBIMEw0NTMgNzY0TDMxIDE0NjJIMjI5TDU2MSA5MDNMODk1IDE0NjJIMTA4NUw2NjQgNzcwTDExMjAgMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iWSIgZ2x5cGgtbmFtZT0iWSIgaG9yaXotYWR2LXg9IjEwNzkiIGQ9Ik01MzkgNzIzTDg3OSAxNDYySDEwNzlMNjMzIDU2OVYwSDQ0NlY1NTlMMCAxNDYySDIwM0w1MzkgNzIzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJaIiBnbHlwaC1uYW1lPSJaIiBob3Jpei1hZHYteD0iMTEwNCIgZD0iTTEwMjIgMEg4MlYxNDVMNzkzIDEyOTZIMTAyVjE0NjJIMTAwMVYxMzE3TDI5MSAxNjZIMTAyMlYwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJbIiBnbHlwaC1uYW1lPSJicmFja2V0bGVmdCIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTU2OSAtMzI0SDE2NFYxNDYySDU2OVYxMzEzSDM0NlYtMTc0SDU2OVYtMzI0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJcIiBnbHlwaC1uYW1lPSJiYWNrc2xhc2giIGhvcml6LWFkdi14PSI3NjQiIGQ9Ik0yMDEgMTQ2Mkw3NDUgMEg1NjdMMjMgMTQ2MkgyMDFaIiAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGdseXBoLW5hbWU9ImJyYWNrZXRyaWdodCIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTUxIC0xNzRIMjc0VjEzMTNINTFWMTQ2Mkg0NTdWLTMyNEg1MVYtMTc0WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJeIiBnbHlwaC1uYW1lPSJhc2NpaWNpcmN1bSIgaG9yaXotYWR2LXg9IjEwOTAiIGQ9Ik00MSA1NDlMNTAwIDE0NzNINjAyTDEwNDkgNTQ5SDg4OEw1NTEgMTI4NEwyMDIgNTQ5SDQxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJfIiBnbHlwaC1uYW1lPSJ1bmRlcnNjb3JlIiBob3Jpei1hZHYteD0iODQyIiBkPSJNODQ2IC0zMjRILTRWLTE4NEg4NDZWLTMyNFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgZ2x5cGgtbmFtZT0iZ3JhdmUiIGhvcml6LWFkdi14PSIxMTgyIiBkPSJNNzg2IDEyNDFINjY2UTYzMSAxMjY5IDU5MCAxMzEwVDUxMSAxMzk2VDQ0MSAxNDgwVDM5MyAxNTQ4VjE1NjlINjEyUTYyOCAxNTM1IDY0OSAxNDk1VDY5NCAxNDE0VDc0MSAxMzM1VDc4NiAxMjY4VjEyNDFaIiAvPgorPGdseXBoIHVuaWNvZGU9ImEiIGdseXBoLW5hbWU9ImEiIGhvcml6LWFkdi14PSIxMDg3IiBkPSJNNzkzIDBMNzU2IDE1Mkg3NDhRNzE1IDEwNyA2ODIgNzVUNjEwIDIxVDUyMyAtMTBUNDEyIC0yMFEzNDMgLTIwIDI4NSAtMVQxODUgNTlUMTE4IDE2MVQ5NCAzMDdROTQgNDcxIDIwOSA1NTlUNTYxIDY1NUw3NDUgNjYyVjczMVE3NDUgNzk4IDczMSA4NDNUNjg5IDkxNVQ2MjEgOTU1VDUyOCA5NjdRNDQ1IDk2NyAzNzQgOTQzVDIzNgorODg1TDE3MiAxMDIyUTI0NiAxMDYyIDMzNyAxMDkwVDUyOCAxMTE4UTYzMCAxMTE4IDcwNCAxMDk4VDgyNyAxMDMzVDkwMCA5MTlUOTI0IDc1MlYwSDc5M1pNNDU5IDEyN1E1MjAgMTI3IDU3MiAxNDZUNjYyIDIwM1Q3MjEgMzAwVDc0MyA0MzhWNTM3TDYwMCA1MzBRNTEwIDUyNiA0NDkgNTEwVDM1MiA0NjZUMjk5IDM5N1QyODMgMzA1UTI4MyAyMTMgMzMxIDE3MFQ0NTkgMTI3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBnbHlwaC1uYW1lPSJiIiBob3Jpei1hZHYteD0iMTIwMCIgZD0iTTY3MCAxMTE4UTc2NCAxMTE4IDg0MSAxMDgyVDk3MiA5NzVUMTA1NyA3OTdUMTA4NyA1NTFRMTA4NyA0MTAgMTA1NyAzMDRUOTczIDEyNVQ4NDEgMTdUNjcwIC0yMFE2MTEgLTIwIDU2MyAtN1Q0NzcgMjdUNDA5IDc4VDM1NiAxMzlIMzQ0TDMwNyAwSDE3NFYxNTU2SDM1NlYxMTgwUTM1NiAxMTQ1IDM1NSAxMTA2VDM1MiAxMDMyUTM1MAorOTkyIDM0OCA5NTRIMzU2UTM3OSA5ODkgNDA4IDEwMTlUNDc1IDEwNzFUNTYyIDExMDVUNjcwIDExMThaTTYzNSA5NjdRNTU1IDk2NyA1MDIgOTQyVDQxNiA4NjRUMzcwIDczNFQzNTYgNTUxUTM1NiA0NTAgMzY5IDM3MlQ0MTUgMjQwVDUwMiAxNTlUNjM3IDEzMVE3NzIgMTMxIDgzNSAyNDBUODk5IDU1M1E4OTkgNzYxIDgzNiA4NjRUNjM1IDk2N1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgZ2x5cGgtbmFtZT0iYyIgaG9yaXotYWR2LXg9Ijk0OCIgZD0iTTU5NCAtMjBRNDkzIC0yMCA0MDUgMTFUMjUyIDExMVQxNTAgMjg2VDExMyA1NDNRMTEzIDcwMCAxNTEgODA5VDI1NSA5ODdUNDExIDEwODdUNjAyIDExMThRNjgwIDExMTggNzU0IDExMDFUODc5IDEwNTlMODI1IDkwNVE4MDIgOTE1IDc3NCA5MjRUNzE2IDk0MVQ2NTcgOTUzVDYwMiA5NThRNDQ1IDk1OCAzNzMgODU4VDMwMSA1NDVRMzAxCiszMzQgMzczIDIzN1Q1OTQgMTM5UTY3NSAxMzkgNzQwIDE1N1Q4NjAgMjAxVjM5UTgwNiAxMCA3NDUgLTVUNTk0IC0yMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iZCIgZ2x5cGgtbmFtZT0iZCIgaG9yaXotYWR2LXg9IjEyMDAiIGQ9Ik04NTIgMTQ3SDg0NFE4MjIgMTEzIDc5MyA4M1Q3MjUgMjlUNjM4IC03VDUzMCAtMjBRNDM3IC0yMCAzNjAgMTZUMjI4IDEyM1QxNDMgMzAxVDExMyA1NDdRMTEzIDY4OCAxNDMgNzk0VDIyOCA5NzNUMzYwIDEwODFUNTMwIDExMThRNTg5IDExMTggNjM3IDExMDVUNzIzIDEwNzBUNzkyIDEwMTlUODQ0IDk1OEg4NTZRODUzIDk5MgorODUwIDEwMjNRODQ4IDEwNDkgODQ2IDEwNzZUODQ0IDExMjBWMTU1NkgxMDI2VjBIODc5TDg1MiAxNDdaTTU2NSAxMzFRNjQxIDEzMSA2OTMgMTU0VDc3OCAyMjRUODI2IDM0MVQ4NDQgNTA2VjU0N1E4NDQgNjQ4IDgzMSA3MjZUNzg1IDg1OFQ2OTggOTM5VDU2MyA5NjdRNDI4IDk2NyAzNjUgODU4VDMwMSA1NDVRMzAxIDMzNiAzNjQgMjM0VDU2NSAxMzFaIiAvPgorPGdseXBoIHVuaWNvZGU9ImUiIGdseXBoLW5hbWU9ImUiIGhvcml6LWFkdi14PSIxMDk2IiBkPSJNNjA4IC0yMFE0OTggLTIwIDQwNyAxN1QyNTEgMTI1VDE0OSAzMDFUMTEzIDU0MVExMTMgNjc3IDE0NiA3ODRUMjM5IDk2NVQzODIgMTA3OVQ1NjcgMTExOFE2NjYgMTExOCA3NDUgMTA4M1Q4NzkgOTgzVDk2MyA4MjhUOTkzIDYyN1Y1MTRIMzAxUTMwNiAzMjEgMzgyIDIzMFQ2MTAgMTM5UTY2MSAxMzkgNzA0IDE0NFQ3ODggMTU4VDg2NworMTgyVDk0NCAyMTVWNTNROTA0IDM0IDg2NiAyMFQ3ODcgLTNUNzAzIC0xNlQ2MDggLTIwWk01NjMgOTY3UTQ0OSA5NjcgMzgzIDg4OVQzMDUgNjYySDc5N1E3OTcgNzMwIDc4NCA3ODZUNzQyIDg4M1Q2NjkgOTQ1VDU2MyA5NjdaIiAvPgorPGdseXBoIHVuaWNvZGU9ImYiIGdseXBoLW5hbWU9ImYiIGhvcml6LWFkdi14PSI2NzQiIGQ9Ik02NTEgOTYxSDQwNlYwSDIyM1Y5NjFIMjlWMTAzNkwyMjMgMTEwNFYxMjAwUTIyMyAxMzA3IDI0NSAxMzc3VDMxMCAxNDkwVDQxNSAxNTQ5VDU1NSAxNTY3UTYxNCAxNTY3IDY2MyAxNTU2VDc1MiAxNTMwTDcwNSAxMzg5UTY3NCAxNDAwIDYzOCAxNDA4VDU2MSAxNDE3UTUyMSAxNDE3IDQ5MiAxNDA4VDQ0NCAxMzc0VDQxNiAxMzA5VDQwNgorMTIwMlYxMDk4SDY1MVY5NjFaIiAvPgorPGdseXBoIHVuaWNvZGU9ImciIGdseXBoLW5hbWU9ImciIGhvcml6LWFkdi14PSIxMDYxIiBkPSJNMTAyMCAxMDk4Vjk4NUw4MjMgOTU4UTg1MSA5MjMgODcwIDg2OVQ4ODkgNzQ1UTg4OSA2NjkgODY2IDYwNVQ3OTUgNDkzVDY3NyA0MjBUNTE0IDM5M1E0OTIgMzkzIDQ3MCAzOTNUNDM0IDM5N1E0MTcgMzg3IDQwMSAzNzVUMzcxIDM0NlQzNDkgMzEwVDM0MCAyNjZRMzQwIDIzOSAzNTIgMjIzVDM4NCAxOTdUNDMzIDE4NVQ0OTIKKzE4Mkg2NjhRNzYxIDE4MiA4MjUgMTU5VDkyOSA5NVQ5ODggMVQxMDA2IC0xMTVRMTAwNiAtMjAzIDk3NCAtMjczVDg3NCAtMzkxVDcwNSAtNDY2VDQ2MyAtNDkyUTM1NiAtNDkyIDI3NiAtNDcxVDE0MyAtNDEwVDY0IC0zMTRUMzcgLTE4NlEzNyAtMTI2IDU2IC04MVQxMDkgLTJUMTg1IDUyVDI3NiA4NFEyMzQgMTAzIDIwNyAxNDRUMTgwIDIzOFExODAgMjk5IDIxMiAzNDNUMzEzIDQzMFEyNzAgNDQ4IDIzNSA0NzlUMTc1IDU1MVQxMzcKKzY0MFQxMjMgNzM5UTEyMyA4MjggMTQ4IDg5OFQyMjIgMTAxN1QzNDQgMTA5MlQ1MTQgMTExOFE1NTEgMTExOCA1OTAgMTExM1Q2NTcgMTA5OEgxMDIwWk0yMDkgLTE4MFEyMDkgLTIxNyAyMjIgLTI0OVQyNjQgLTMwNFQzNDIgLTM0MFQ0NjMgLTM1NFE2NDkgLTM1NCA3NDEgLTI5N1Q4MzQgLTEzMVE4MzQgLTg1IDgyMiAtNTZUNzgzIC0xMVQ3MTAgMTJUNjAwIDE4SDQyNFEzODkgMTggMzUxIDEwVDI4MiAtMjBUMjMwIC04MFQyMDkKKy0xODBaTTMwMSA3NDVRMzAxIDYzMCAzNTUgNTc0VDUwOCA1MThRNjA4IDUxOCA2NTkgNTczVDcxMSA3NDhRNzExIDg3MSA2NTkgOTI5VDUwNiA5ODdRNDA3IDk4NyAzNTQgOTI3VDMwMSA3NDVaIiAvPgorPGdseXBoIHVuaWNvZGU9ImgiIGdseXBoLW5hbWU9ImgiIGhvcml6LWFkdi14PSIxMjA2IiBkPSJNODYwIDBWNzA3UTg2MCA4MzcgODA4IDkwMlQ2NDMgOTY3UTU2MiA5NjcgNTA3IDk0MVQ0MTkgODY0VDM3MSA3MzlUMzU2IDU2OVYwSDE3NFYxNTU2SDM1NlYxMDk0TDM0OCA5NTBIMzU4UTM4MyA5OTMgNDE3IDEwMjRUNDkzIDEwNzdUNTgwIDExMDhUNjc0IDExMThRODU3IDExMTggOTQ5IDEwMjNUMTA0MiA3MTdWMEg4NjBaIiAvPgorPGdseXBoIHVuaWNvZGU9ImkiIGdseXBoLW5hbWU9ImkiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0zNTYgMEgxNzRWMTA5OEgzNTZWMFpNMTYwIDEzOTVRMTYwIDE0NTUgMTkwIDE0ODJUMjY2IDE1MDlRMjg4IDE1MDkgMzA3IDE1MDNUMzQxIDE0ODJUMzY0IDE0NDdUMzczIDEzOTVRMzczIDEzMzcgMzQyIDEzMDlUMjY2IDEyODBRMjIxIDEyODAgMTkxIDEzMDhUMTYwIDEzOTVaIiAvPgorPGdseXBoIHVuaWNvZGU9ImoiIGdseXBoLW5hbWU9ImoiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik02NiAtNDkyUTE4IC00OTIgLTEzIC00ODVULTY4IC00NjdWLTMxOVEtNDIgLTMyOSAtMTUgLTMzNFQ0NyAtMzQwUTc0IC0zNDAgOTcgLTMzM1QxMzcgLTMwNlQxNjQgLTI1NFQxNzQgLTE3MFYxMDk4SDM1NlYtMTU4UTM1NiAtMjM1IDMzOSAtMjk2VDI4NiAtNDAxVDE5NiAtNDY4VDY2IC00OTJaTTE2MCAxMzk1UTE2MCAxNDU1CisxOTAgMTQ4MlQyNjYgMTUwOVEyODggMTUwOSAzMDcgMTUwM1QzNDEgMTQ4MlQzNjQgMTQ0N1QzNzMgMTM5NVEzNzMgMTMzNyAzNDIgMTMwOVQyNjYgMTI4MFEyMjEgMTI4MCAxOTEgMTMwOFQxNjAgMTM5NVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iayIgZ2x5cGgtbmFtZT0iayIgaG9yaXotYWR2LXg9IjEwMTYiIGQ9Ik0zNDIgNTY3TDQ3NyA3MzdMNzcwIDEwOThIOTgxTDU4MCA2MjNMMTAwOCAwSDc5OUw0NjMgNTA0TDM1NCA0MjJWMEgxNzRWMTU1NkgzNTRWODQyTDMzOCA1NjdIMzQyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJsIiBnbHlwaC1uYW1lPSJsIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMzU2IDBIMTc0VjE1NTZIMzU2VjBaIiAvPgorPGdseXBoIHVuaWNvZGU9Im0iIGdseXBoLW5hbWU9Im0iIGhvcml6LWFkdi14PSIxODM1IiBkPSJNMTQ4OSAwVjcwN1ExNDg5IDgzNyAxNDM5IDkwMlQxMjg0IDk2N1ExMjExIDk2NyAxMTYwIDk0NFQxMDc3IDg3NVQxMDI5IDc2MlQxMDE0IDYwNlYwSDgzMVY3MDdRODMxIDgzNyA3ODIgOTAyVDYyNyA5NjdRNTUwIDk2NyA0OTggOTQxVDQxNSA4NjRUMzcwIDczOVQzNTYgNTY5VjBIMTc0VjEwOThIMzIyTDM0OCA5NTBIMzU4UTM4MgorOTkzIDQxNSAxMDI0VDQ4NyAxMDc3VDU3MSAxMTA4VDY2MiAxMTE4UTc4MiAxMTE4IDg2MSAxMDc0VDk3OSA5MzZIOTg3UTEwMTMgOTgzIDEwNDkgMTAxN1QxMTI5IDEwNzNUMTIyMSAxMTA3VDEzMTkgMTExOFExNDk0IDExMTggMTU4MiAxMDIzVDE2NzEgNzE3VjBIMTQ4OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgZ2x5cGgtbmFtZT0ibiIgaG9yaXotYWR2LXg9IjEyMDYiIGQ9Ik04NjAgMFY3MDdRODYwIDgzNyA4MDggOTAyVDY0MyA5NjdRNTYyIDk2NyA1MDcgOTQxVDQxOSA4NjRUMzcxIDczOVQzNTYgNTY5VjBIMTc0VjEwOThIMzIyTDM0OCA5NTBIMzU4UTM4MyA5OTMgNDE3IDEwMjRUNDkzIDEwNzdUNTgwIDExMDhUNjc0IDExMThRODU3IDExMTggOTQ5IDEwMjNUMTA0MiA3MTdWMEg4NjBaIiAvPgorPGdseXBoIHVuaWNvZGU9Im8iIGdseXBoLW5hbWU9Im8iIGhvcml6LWFkdi14PSIxMTgyIiBkPSJNMTA2OSA1NTFRMTA2OSA0MTQgMTAzNiAzMDhUOTQwIDEyOVQ3ODggMThUNTg4IC0yMFE0ODUgLTIwIDM5OCAxOFQyNDggMTI4VDE0OSAzMDdUMTEzIDU1MVExMTMgNjg3IDE0NiA3OTJUMjQyIDk3MFQzOTMgMTA4MFQ1OTQgMTExOFE2OTcgMTExOCA3ODQgMTA4MVQ5MzQgOTcxVDEwMzMgNzkzVDEwNjkgNTUxWk0zMDEgNTUxUTMwMQorMzQyIDM2OSAyMzdUNTkyIDEzMVE3NDYgMTMxIDgxMyAyMzZUODgxIDU1MVE4ODEgNzYwIDgxMyA4NjNUNTkwIDk2N1E0MzYgOTY3IDM2OSA4NjRUMzAxIDU1MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0icCIgZ2x5cGgtbmFtZT0icCIgaG9yaXotYWR2LXg9IjEyMDAiIGQ9Ik02NzAgLTIwUTYxMSAtMjAgNTYzIC03VDQ3NyAyN1Q0MDkgNzhUMzU2IDEzOUgzNDRRMzQ3IDEwNSAzNTAgNzRRMzUyIDQ4IDM1NCAyMVQzNTYgLTIzVi00OTJIMTc0VjEwOThIMzIyTDM0OCA5NTBIMzU2UTM3OSA5ODUgNDA4IDEwMTVUNDc1IDEwNjhUNTYyIDExMDRUNjcwIDExMThRNzY0IDExMTggODQxIDEwODJUOTcyIDk3NVQxMDU3Cis3OTdUMTA4NyA1NTFRMTA4NyA0MTAgMTA1NyAzMDRUOTczIDEyNVQ4NDEgMTdUNjcwIC0yMFpNNjM1IDk2N1E1NTkgOTY3IDUwNyA5NDRUNDIyIDg3NFQzNzQgNzU3VDM1NiA1OTJWNTUxUTM1NiA0NTAgMzY5IDM3MlQ0MTUgMjQwVDUwMiAxNTlUNjM3IDEzMVE3NzIgMTMxIDgzNSAyNDBUODk5IDU1M1E4OTkgNzYxIDgzNiA4NjRUNjM1IDk2N1oiIC8+Cis8Z2x5cGggdW5pY29kZT0icSIgZ2x5cGgtbmFtZT0icSIgaG9yaXotYWR2LXg9IjEyMDAiIGQ9Ik01NjUgMTMxUTY0MSAxMzEgNjkzIDE1NFQ3NzggMjI0VDgyNiAzNDFUODQ0IDUwNlY1NDdRODQ0IDY0OCA4MzEgNzI2VDc4NSA4NThUNjk4IDkzOVQ1NjMgOTY3UTQyOCA5NjcgMzY1IDg1OFQzMDEgNTQ1UTMwMSAzMzYgMzY0IDIzNFQ1NjUgMTMxWk01MzAgLTIwUTQzNyAtMjAgMzYwIDE2VDIyOCAxMjNUMTQzIDMwMVQxMTMKKzU0N1ExMTMgNjg4IDE0MyA3OTRUMjI4IDk3M1QzNjAgMTA4MVQ1MzAgMTExOFE1ODkgMTExOCA2MzcgMTEwNVQ3MjMgMTA2OVQ3OTEgMTAxNlQ4NDQgOTUwSDg1Mkw4NzkgMTA5OEgxMDI2Vi00OTJIODQ0Vi0yM1E4NDQgLTQgODQ2IDI1VDg1MCA4MVE4NTMgMTEzIDg1NiAxNDdIODQ0UTgyMiAxMTMgNzkzIDgzVDcyNSAyOVQ2MzggLTdUNTMwIC0yMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iciIgZ2x5cGgtbmFtZT0iciIgaG9yaXotYWR2LXg9IjgxNyIgZD0iTTY0OSAxMTE4UTY3OCAxMTE4IDcxNCAxMTE2VDc3NiAxMTA4TDc1MiA5NDBRNzI0IDk0NSA2OTUgOTQ4VDYzOSA5NTJRNTc2IDk1MiA1MjQgOTI3VDQzNSA4NTRUMzc3IDc0MFQzNTYgNTkyVjBIMTc0VjEwOThIMzIyTDM0NCA4OTdIMzUyUTM3NyA5NDAgNDA1IDk4MFQ0NjkgMTA1MFQ1NDkgMTA5OVQ2NDkgMTExOFoiIC8+Cis8Z2x5cGggdW5pY29kZT0icyIgZ2x5cGgtbmFtZT0icyIgaG9yaXotYWR2LXg9IjkyNCIgZD0iTTgzMSAzMDFRODMxIDIyMSA4MDIgMTYxVDcxOSA2MVQ1ODcgMFQ0MTQgLTIwUTMwNSAtMjAgMjI3IC0zVDkwIDQ5VjIxNVExMjEgMTk5IDE1OSAxODRUMjM5IDE1NlQzMjUgMTM3VDQxNCAxMjlRNDc5IDEyOSA1MjQgMTQwVDU5OCAxNzFUNjQwIDIyMVQ2NTMgMjg3UTY1MyAzMTggNjQzIDM0M1Q2MDcgMzkyVDUzNCA0NDJUNDE2Cis0OThRMzQ0IDUyOSAyODcgNTU5VDE4OSA2MjZUMTI4IDcxMVQxMDYgODI3UTEwNiA4OTcgMTMzIDk1MVQyMTEgMTA0M1QzMzEgMTA5OVQ0ODcgMTExOFE1ODQgMTExOCA2NjQgMTA5N1Q4MTcgMTA0Mkw3NTQgODk1UTY4OSA5MjQgNjIxIDk0NVQ0ODEgOTY3UTM3OSA5NjcgMzMwIDkzNFQyODEgODM4UTI4MSA4MDMgMjkyIDc3N1QzMzIgNzI4VDQwNyA2ODJUNTI0IDYyOVE1OTYgNTk5IDY1MiA1NjlUNzQ5IDUwMlQ4MTAgNDE2VDgzMQorMzAxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ0IiBnbHlwaC1uYW1lPSJ0IiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNTA2IDEyOVE1MjQgMTI5IDU0NiAxMzFUNTkwIDEzNlQ2MjggMTQzVDY1NSAxNTBWMTJRNjQyIDYgNjIyIDBUNTc4IC0xMFQ1MjggLTE3VDQ3NyAtMjBRNDE1IC0yMCAzNjIgLTRUMjcxIDUxVDIxMCAxNTZUMTg4IDMyNFY5NjFIMzNWMTA0MkwxODggMTEyMEwyNjYgMTM1MEgzNzFWMTA5OEg2NDdWOTYxSDM3MVYzMjRRMzcxIDIyNworNDAyIDE3OFQ1MDYgMTI5WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ1IiBnbHlwaC1uYW1lPSJ1IiBob3Jpei1hZHYteD0iMTIwNiIgZD0iTTg4NSAwTDg1OCAxNDdIODQ4UTgyMyAxMDQgNzg5IDczVDcxMyAyMVQ2MjYgLTEwVDUzMiAtMjBRNDQxIC0yMCAzNzIgM1QyNTcgNzVUMTg4IDIwMFQxNjQgMzgxVjEwOThIMzQ2VjM5MVEzNDYgMjYxIDM5OSAxOTZUNTYzIDEzMVE2NDQgMTMxIDY5OSAxNTdUNzg3IDIzM1Q4MzUgMzU4VDg1MCA1MjhWMTA5OEgxMDMyVjBIODg1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ2IiBnbHlwaC1uYW1lPSJ2IiBob3Jpei1hZHYteD0iOTgxIiBkPSJNMzc1IDBMMCAxMDk4SDE4OEwzODcgNDg3UTM5OCA0NTQgNDEzIDQwMlQ0NDMgMjk2VDQ3MCAxOTRUNDg3IDEyMUg0OTRRNDk5IDE0NiA1MTEgMTk0VDUzOCAyOTZUNTY4IDQwMlQ1OTQgNDg3TDc5MyAxMDk4SDk4MUw2MDYgMEgzNzVaIiAvPgorPGdseXBoIHVuaWNvZGU9InciIGdseXBoLW5hbWU9InciIGhvcml6LWFkdi14PSIxNTI4IiBkPSJNMTAwOCAwTDg0MCA2MTZRODM2IDYzNCA4MzAgNjU2VDgxOCA3MDRUODA2IDc1NVQ3OTMgODA2UTc3OSA4NjQgNzY0IDkyNkg3NThRNzQ0IDg2MyA3MzEgODA1UTcyMCA3NTUgNzA4IDcwMlQ2ODQgNjEyTDUxMiAwSDMwMUwyMCAxMDk4SDIxMUwzNDIgNTE0UTM1MiA0NjkgMzYyIDQxN1QzODEgMzEzVDM5NyAyMTZUNDA4IDE0MUg0MTRRNDE5CisxNjcgNDI3IDIxMFQ0NDYgMzAyVDQ2OCAzOThUNDg5IDQ3OUw2NjggMTA5OEg4NjRMMTAzNiA0NzlRMTA0NSA0NDUgMTA1NiAzOTlUMTA3OSAzMDZUMTA5OSAyMTRUMTExMiAxNDFIMTExOFExMTIxIDE2NyAxMTI3IDIxMFQxMTQzIDMwNlQxMTYyIDQxMlQxMTg0IDUxNEwxMzIxIDEwOThIMTUwN0wxMjIzIDBIMTAwOFoiIC8+Cis8Z2x5cGggdW5pY29kZT0ieCIgZ2x5cGgtbmFtZT0ieCIgaG9yaXotYWR2LXg9IjEwMjQiIGQ9Ik00MDggNTYzTDU1IDEwOThIMjYyTDUxMiA2ODhMNzYyIDEwOThIOTY5TDYxNCA1NjNMOTg3IDBINzgwTDUxMiA0MzZMMjQyIDBIMzVMNDA4IDU2M1oiIC8+Cis8Z2x5cGggdW5pY29kZT0ieSIgZ2x5cGgtbmFtZT0ieSIgaG9yaXotYWR2LXg9IjEwMDEiIGQ9Ik0xMCAxMDk4SDE5OUw0MTQgNDg1UTQyOCA0NDUgNDQyIDQwMVQ0NjkgMzEzVDQ5MSAyMjhUNTA0IDE1Mkg1MTBRNTE1IDE3NyA1MjYgMjIwVDU1MCAzMTFUNTc4IDQwN1Q2MDQgNDg3TDgwMyAxMDk4SDk5MUw1NTcgLTE0M1E1MjkgLTIyNCA0OTcgLTI4OFQ0MjEgLTM5OFQzMjAgLTQ2N1QxODIgLTQ5MlExMzAgLTQ5MiA5MiAtNDg3VDI3CistNDc1Vi0zMzBRNDggLTMzNSA4MCAtMzM4VDE0NyAtMzQyUTE5NSAtMzQyIDIzMCAtMzMxVDI5MSAtMjk3VDMzNSAtMjQzVDM2OSAtMTcwTDQyNiAtMTBMMTAgMTA5OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0ieiIgZ2x5cGgtbmFtZT0ieiIgaG9yaXotYWR2LXg9IjkwMyIgZD0iTTgyMSAwSDgyVjEyNUw2MTggOTYxSDExNVYxMDk4SDgwM1Y5NTJMMjc5IDEzN0g4MjFWMFoiIC8+Cis8Z2x5cGggdW5pY29kZT0ieyIgZ2x5cGgtbmFtZT0iYnJhY2VsZWZ0IiBob3Jpei1hZHYteD0iNzI1IiBkPSJNNTAwIC0xNlE1MDAgLTY0IDUxMiAtOTRUNTQ2IC0xNDJUNjAxIC0xNjZUNjc0IC0xNzRWLTMyNFE1OTcgLTMyMyA1MzIgLTMwN1Q0MTkgLTI1NVQzNDQgLTE2NFQzMTcgLTMxVjMwM1EzMTcgNDA2IDI1MiA0NDlUNjEgNDkyVjY0N1ExODYgNjQ3IDI1MSA2OTBUMzE3IDgzNlYxMTY5UTMxNyAxMjQ3IDM0NCAxMzAyVDQxOAorMTM5MlQ1MzEgMTQ0NFQ2NzQgMTQ2MlYxMzEzUTYzNCAxMzEyIDYwMiAxMzA2VDU0NyAxMjgyVDUxMiAxMjM0VDUwMCAxMTU1VjgyM1E1MDAgNzE4IDQ0MSA2NTdUMjY2IDU3NVY1NjNRMzgxIDU0MyA0NDAgNDgyVDUwMCAzMTVWLTE2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSJ8IiBnbHlwaC1uYW1lPSJiYXIiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNDg5IDE1NTZINjM5Vi00OTJINDg5VjE1NTZaIiAvPgorPGdseXBoIHVuaWNvZGU9In0iIGdseXBoLW5hbWU9ImJyYWNlcmlnaHQiIGhvcml6LWFkdi14PSI3MjUiIGQ9Ik0yMjUgMzE1UTIyNSA0MjEgMjg0IDQ4MlQ0NTkgNTYzVjU3NVEzNDQgNTk1IDI4NSA2NTZUMjI1IDgyM1YxMTU1UTIyNSAxMjAzIDIxMyAxMjMzVDE3OSAxMjgxVDEyNCAxMzA1VDUxIDEzMTNWMTQ2MlExMjggMTQ2MSAxOTMgMTQ0NVQzMDYgMTM5M1QzODEgMTMwMlQ0MDggMTE2OVY4MzZRNDA4IDc4NCA0MjQgNzQ4VDQ3MworNjkwVDU1NCA2NTdUNjY0IDY0N1Y0OTJRNTM5IDQ5MiA0NzQgNDQ5VDQwOCAzMDNWLTMxUTQwOCAtMTA5IDM4MSAtMTY0VDMwNyAtMjU0VDE5NCAtMzA2VDUxIC0zMjRWLTE3NFE5MSAtMTczIDEyMyAtMTY3VDE3OCAtMTQzVDIxMyAtOTVUMjI1IC0xNlYzMTVaIiAvPgorPGdseXBoIHVuaWNvZGU9In4iIGdseXBoLW5hbWU9ImFzY2lpdGlsZGUiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNNTMwIDY1MVE0OTMgNjY3IDQ2NiA2NzhUNDE2IDY5NVQzNzMgNzA0VDMzMCA3MDdRMzAyIDcwNyAyNzIgNjk4VDIxMyA2NzJUMTU1IDYzM1QxMDIgNTg2Vjc0OFEyMDIgODU2IDM1MCA4NTZRMzc5IDg1NiA0MDQgODU0VDQ1NiA4NDVUNTE3IDgyNlQ1OTggNzkzUTYzNSA3NzcgNjYyIDc2NlQ3MTMgNzQ5VDc1NworNzQwVDc5OSA3MzdRODI3IDczNyA4NTcgNzQ2VDkxNiA3NzJUOTc0IDgxMVQxMDI2IDg1OFY2OTZROTI3IDU4OCA3NzggNTg4UTc0OSA1ODggNzI0IDU5MFQ2NzIgNTk5VDYxMSA2MThUNTMwIDY1MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiBnbHlwaC1uYW1lPSJuYnNwYWNlIiBob3Jpei1hZHYteD0iNTMyIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGExOyIgZ2x5cGgtbmFtZT0iZXhjbGFtZG93biIgaG9yaXotYWR2LXg9IjU1MSIgZD0iTTIxMyA2NzZIMzM0TDM4NSAtMzczSDE2MkwyMTMgNjc2Wk00MDEgOTc5UTQwMSA5NDEgMzkyIDkxNVQzNjUgODcyVDMyNCA4NDhUMjc0IDg0MFEyNDggODQwIDIyNSA4NDdUMTg1IDg3MVQxNTcgOTE0VDE0NyA5NzlRMTQ3IDEwMTYgMTU3IDEwNDJUMTg0IDEwODVUMjI1IDExMTBUMjc0IDExMThRMzAxCisxMTE4IDMyNCAxMTEwVDM2NCAxMDg1VDM5MSAxMDQyVDQwMSA5NzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGEyOyIgZ2x5cGgtbmFtZT0iY2VudCIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik04ODYgMjEyVDgzMSAxOTdUNzAwIDE4MFYtMjBINTYzVjE4NlE0NzYgMTk5IDQwNyAyMzZUMjg5IDM0MFQyMTQgNTA2VDE4OCA3NDNRMTg4IDg4NCAyMTQgOTg1VDI4OSAxMTU1VDQwNyAxMjYwVDU2MyAxMzExVjE0ODNINzAwVjEzMTlRNzcyIDEzMTYgODQwIDEzMDBUOTU0IDEyNjBMOTAxIDExMDZRODc4IDExMTYKKzg1MCAxMTI1VDc5MiAxMTQyVDczMyAxMTU0VDY3OCAxMTU5UTUyMSAxMTU5IDQ0OSAxMDU4VDM3NyA3NDVRMzc3IDUzNSA0NDkgNDM4VDY3MCAzNDBRNzUxIDM0MCA4MTYgMzU4VDkzNiA0MDFWMjQwUTg4NiAyMTIgODMxIDE5N1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTM7IiBnbHlwaC1uYW1lPSJzdGVybGluZyIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik02NjYgMTQ4MVE3NzIgMTQ4MSA4NTkgMTQ1OVQxMDEyIDE0MDFMOTQ2IDEyNTdRODkwIDEyODYgODIwIDEzMDdUNjc0IDEzMjlRNjI2IDEzMjkgNTg1IDEzMTZUNTE0IDEyNzNUNDY4IDExOTZUNDUxIDEwODNWNzg4SDgyN1Y2NTFINDUxVjQ0MFE0NTEgMzc4IDQ0MCAzMzRUNDA5IDI1N1QzNjQgMjA0VDMxMQorMTY2SDEwNTlWMEg2OFYxNTRRMTEyIDE2NSAxNDggMTg1VDIxMSAyNDBUMjUzIDMyMlQyNjggNDM4VjY1MUg3MFY3ODhIMjY4VjExMTJRMjY4IDExOTkgMjk3IDEyNjdUMzc5IDEzODNUNTA1IDE0NTZUNjY2IDE0ODFaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGE0OyIgZ2x5cGgtbmFtZT0iY3VycmVuY3kiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTg2IDcyM1ExODYgNzgyIDIwMyA4MzVUMjUyIDkzNkwxMjMgMTA2NUwyMjEgMTE2M0wzNDggMTAzNFEzOTUgMTA2NiA0NDkgMTA4NFQ1NjMgMTEwMlE2MjMgMTEwMiA2NzYgMTA4NFQ3NzYgMTAzNEw5MDUgMTE2M0wxMDA0IDEwNjdMODc0IDkzOFE5MDUgODkyIDkyMyA4MzhUOTQyIDcyM1E5NDIgNjYzCis5MjUgNjA4VDg3NCA1MDhMMTAwMSAzODFMOTA1IDI4NUw3NzYgNDEyUTczMCAzODEgNjc3IDM2NFQ1NjMgMzQ2UTUwMyAzNDYgNDQ4IDM2NFQzNDggNDE0TDIyMSAyODdMMTI1IDM4M0wyNTIgNTEwUTIyMSA1NTUgMjA0IDYwOVQxODYgNzIzWk0zMjQgNzIzUTMyNCA2NzMgMzQyIDYzMFQzOTMgNTU0VDQ2OSA1MDJUNTYzIDQ4M1E2MTQgNDgzIDY1OCA1MDJUNzM2IDU1M1Q3ODggNjI5VDgwNyA3MjNRODA3IDc3NCA3ODggODE4VDczNgorODk2VDY1OSA5NDhUNTYzIDk2N1E1MTMgOTY3IDQ3MCA5NDhUMzk0IDg5NlQzNDMgODE5VDMyNCA3MjNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGE1OyIgZ2x5cGgtbmFtZT0ieWVuIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTU2MyA3MjNMOTA5IDE0NjJIMTEwMEw3MTUgNjk0SDk1NFY1NTdINjUzVjM5OUg5NTRWMjYySDY1M1YwSDQ3NVYyNjJIMTc0VjM5OUg0NzVWNTU3SDE3NFY2OTRINDA4TDI5IDE0NjJIMjIxTDU2MyA3MjNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGE2OyIgZ2x5cGgtbmFtZT0iYnJva2VuYmFyIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTQ4OSAxNTU2SDYzOVY3NzZINDg5VjE1NTZaTTQ4OSAyODlINjM5Vi00OTJINDg5VjI4OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTc7IiBnbHlwaC1uYW1lPSJzZWN0aW9uIiBob3Jpei1hZHYteD0iOTk1IiBkPSJNMTM3IDgwOVExMzcgODYwIDE1MCA5MDFUMTg1IDk3NVQyMzcgMTAyOVQyOTcgMTA2N1EyMjIgMTEwNSAxODAgMTE2MlQxMzcgMTMwM1ExMzcgMTM2NCAxNjQgMTQxM1QyNDIgMTQ5NlQzNjIgMTU0OFQ1MTggMTU2N1E2MTUgMTU2NyA2OTMgMTU0N1Q4NDQgMTQ5NUw3ODggMTM1NlE3MjMgMTM4NCA2NTMgMTQwM1Q1MTIKKzE0MjNRNDEzIDE0MjMgMzYyIDEzOTRUMzExIDEzMDdRMzExIDEyODAgMzIzIDEyNTdUMzYzIDEyMTJUNDM5IDExNjdUNTU3IDExMTRRNjI5IDEwODYgNjg1IDEwNTRUNzgxIDk4MlQ4NDEgODk1VDg2MiA3ODRRODYyIDczMiA4NTAgNjkwVDgxOCA2MTNUNzcxIDU1NVQ3MTcgNTE0UTc4NiA0NzYgODI0IDQyMlQ4NjIgMjg5UTg2MiAyMTggODMzIDE2M1Q3NDkgNjlUNjE4IDEwVDQ0NCAtMTBRMzM2IC0xMCAyNTggNlQxMjEgNTVWMjEzUTE1MgorMTk4IDE5MCAxODNUMjcwIDE1N1QzNTYgMTM4VDQ0NCAxMzFRNTEzIDEzMSA1NTkgMTQzVDYzMyAxNzRUNjcyIDIxOVQ2ODQgMjcyUTY4NCAzMDEgNjc2IDMyM1Q2NDIgMzY4VDU2OSA0MTVUNDQ2IDQ3MVEzNzMgNTAyIDMxNiA1MzNUMjE4IDYwM1QxNTggNjkyVDEzNyA4MDlaTTI5MSA4MzFRMjkxIDc5NCAzMDUgNzYzVDM1MCA3MDJUNDMyIDY0NlQ1NTUgNTg4TDU5MCA1NzNRNjEwIDU4NiA2MzAgNjA0VDY2NyA2NDVUNjk0Cis2OTZUNzA1IDc1OFE3MDUgNzk2IDY5MiA4MjhUNjQ3IDg4OVQ1NjAgOTQ3VDQyNCAxMDA2UTM5OSA5OTggMzc2IDk4M1QzMzMgOTQ1VDMwMyA4OTNUMjkxIDgzMVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTg7IiBnbHlwaC1uYW1lPSJkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjExODIiIGQ9Ik0zMDcgMTM5NVEzMDcgMTQ0OSAzMzUgMTQ3M1Q0MDMgMTQ5N1E0NDIgMTQ5NyA0NzEgMTQ3M1Q1MDAgMTM5NVE1MDAgMTM0MiA0NzEgMTMxN1Q0MDMgMTI5MlEzNjMgMTI5MiAzMzUgMTMxN1QzMDcgMTM5NVpNNjgyIDEzOTVRNjgyIDE0NDkgNzEwIDE0NzNUNzc4IDE0OTdRNzk3IDE0OTcgODE0IDE0OTFUODQ1CisxNDczVDg2NiAxNDQxVDg3NCAxMzk1UTg3NCAxMzQyIDg0NSAxMzE3VDc3OCAxMjkyUTczOCAxMjkyIDcxMCAxMzE3VDY4MiAxMzk1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhOTsiIGdseXBoLW5hbWU9ImNvcHlyaWdodCIgaG9yaXotYWR2LXg9IjE3MDQiIGQ9Ik04OTEgMTA1M1E4MzAgMTA1MyA3ODMgMTAzMVQ3MDQgOTY4VDY1NiA4NjZUNjM5IDczMVE2MzkgNjUzIDY1MyA1OTNUNjk4IDQ5MlQ3NzYgNDMwVDg5MSA0MDhROTE0IDQwOCA5NDEgNDExVDk5NiA0MjFUMTA1MyA0MzVUMTEwNiA0NTNWMzIyUTEwODIgMzExIDEwNTggMzAyVDEwMDcgMjg2VDk1MCAyNzZUODg1CisyNzJRNzgzIDI3MiA3MDcgMzA1VDU4MSAzOTlUNTA1IDU0NVQ0NzkgNzMzUTQ3OSA4MzQgNTA2IDkxN1Q1ODUgMTA2MVQ3MTQgMTE1NFQ4OTEgMTE4OFE5NTQgMTE4OCAxMDIwIDExNzJUMTE0NSAxMTI2TDEwODMgOTk5UTEwMzEgMTAyNSA5ODMgMTAzOVQ4OTEgMTA1M1pNMTAwIDczMVExMDAgODM1IDEyNyA5MzFUMjAyIDExMTBUMzIwIDEyNjNUNDcyIDEzODBUNjUyIDE0NTZUODUyIDE0ODNROTU2IDE0ODMgMTA1MiAxNDU2VDEyMzEKKzEzODFUMTM4NCAxMjYzVDE1MDEgMTExMVQxNTc3IDkzMVQxNjA0IDczMVExNjA0IDYyNyAxNTc3IDUzMVQxNTAyIDM1MlQxMzg0IDIwMFQxMjMyIDgyVDEwNTIgN1Q4NTIgLTIwUTc0OCAtMjAgNjUyIDZUNDczIDgyVDMyMCAxOTlUMjAzIDM1MVQxMjcgNTMxVDEwMCA3MzFaTTIwOSA3MzFRMjA5IDU5OCAyNTkgNDgxVDM5NyAyNzdUNjAyIDEzOVQ4NTIgODhROTg1IDg4IDExMDIgMTM4VDEzMDYgMjc2VDE0NDQgNDgxVDE0OTUKKzczMVExNDk1IDg2NCAxNDQ1IDk4MVQxMzA3IDExODVUMTEwMiAxMzIzVDg1MiAxMzc0UTcxOSAxMzc0IDYwMiAxMzI0VDM5OCAxMTg2VDI2MCA5ODFUMjA5IDczMVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YWE7IiBnbHlwaC1uYW1lPSJvcmRmZW1pbmluZSIgaG9yaXotYWR2LXg9IjY3OCIgZD0iTTQ4NyA3OTdMNDU5IDg3OVE0NDEgODU3IDQyMiA4NDBUMzc5IDgxMFQzMjcgNzkxVDI2NCA3ODRRMjIxIDc4NCAxODUgNzk3VDEyMyA4MzVUODMgODk5VDY4IDk4OVE2OCAxMDkxIDEzOCAxMTQ1VDM1MiAxMjA0TDQ1MSAxMjA4VjEyMzlRNDUxIDEzMTEgNDIxIDEzMzlUMzM0IDEzNjhRMjg2IDEzNjgKKzI0MSAxMzU0VDE1NCAxMzE3TDEwNiAxNDE3UTE1NyAxNDQzIDIxNSAxNDYxVDMzNCAxNDc5UTQ1OSAxNDc5IDUxOCAxNDI2VDU3OCAxMjUxVjc5N0g0ODdaTTM3NyAxMTEwUTMyNiAxMTA3IDI5MiAxMDk4VDIzOCAxMDc0VDIwOCAxMDM4VDE5OSA5ODdRMTk5IDkzNiAyMjQgOTE0VDI5MSA4OTFRMzI1IDg5MSAzNTQgOTAxVDQwNCA5MzRUNDM4IDk4OFQ0NTEgMTA2NVYxMTE0TDM3NyAxMTEwWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhYjsiIGdseXBoLW5hbWU9Imd1aWxsZW1vdGxlZnQiIGhvcml6LWFkdi14PSI5OTciIGQ9Ik04MiA1NTNMMzkxIDk2N0w1MDggODg5TDI3MCA1NDFMNTA4IDE5M0wzOTEgMTE1TDgyIDUyNlY1NTNaTTQ4OSA1NTNMNzk5IDk2N0w5MTUgODg5TDY3OCA1NDFMOTE1IDE5M0w3OTkgMTE1TDQ4OSA1MjZWNTUzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhYzsiIGdseXBoLW5hbWU9ImxvZ2ljYWxub3QiIGhvcml6LWFkdi14PSIxMTI4IiBkPSJNMTAyNiA3OTdWMjYySDg3N1Y2NDdIMTAyVjc5N0gxMDI2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhZDsiIGdseXBoLW5hbWU9InVuaTAwQUQiIGhvcml6LWFkdi14PSI2NTkiIGQ9Ik04MiA0NjVWNjMzSDU3OFY0NjVIODJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGFlOyIgZ2x5cGgtbmFtZT0icmVnaXN0ZXJlZCIgaG9yaXotYWR2LXg9IjE3MDQiIGQ9Ik03NDMgNzY4SDgxNVE5MDYgNzY4IDk0NSA4MDRUOTg1IDkwOVE5ODUgOTgzIDk0NCAxMDEyVDgxMyAxMDQySDc0M1Y3NjhaTTExNDUgOTEzUTExNDUgODY1IDExMzIgODI4VDEwOTYgNzYyVDEwNDUgNzEzVDk4NSA2ODBRMTA1MiA1NzAgMTEwNSA0ODNRMTEyOCA0NDYgMTE0OSA0MTFUMTE4NiAzNDdUMTIxMworMzAyTDEyMjMgMjg1SDEwNDRMODM4IDYzN0g3NDNWMjg1SDU4NlYxMTc4SDgxOVE5ODcgMTE3OCAxMDY2IDExMTNUMTE0NSA5MTNaTTEwMCA3MzFRMTAwIDgzNSAxMjcgOTMxVDIwMiAxMTEwVDMyMCAxMjYzVDQ3MiAxMzgwVDY1MiAxNDU2VDg1MiAxNDgzUTk1NiAxNDgzIDEwNTIgMTQ1NlQxMjMxIDEzODFUMTM4NCAxMjYzVDE1MDEgMTExMVQxNTc3IDkzMVQxNjA0IDczMVExNjA0IDYyNyAxNTc3IDUzMVQxNTAyIDM1MlQxMzg0CisyMDBUMTIzMiA4MlQxMDUyIDdUODUyIC0yMFE3NDggLTIwIDY1MiA2VDQ3MyA4MlQzMjAgMTk5VDIwMyAzNTFUMTI3IDUzMVQxMDAgNzMxWk0yMDkgNzMxUTIwOSA1OTggMjU5IDQ4MVQzOTcgMjc3VDYwMiAxMzlUODUyIDg4UTk4NSA4OCAxMTAyIDEzOFQxMzA2IDI3NlQxNDQ0IDQ4MVQxNDk1IDczMVExNDk1IDg2NCAxNDQ1IDk4MVQxMzA3IDExODVUMTEwMiAxMzIzVDg1MiAxMzc0UTcxOSAxMzc0IDYwMiAxMzI0VDM5OCAxMTg2VDI2MAorOTgxVDIwOSA3MzFaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGFmOyIgZ2x5cGgtbmFtZT0ib3ZlcnNjb3JlIiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTEwMzAgMTU1NkgtNlYxNjk2SDEwMzBWMTU1NloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YjA7IiBnbHlwaC1uYW1lPSJkZWdyZWUiIGhvcml6LWFkdi14PSI4NzciIGQ9Ik0xMjMgMTE2N1ExMjMgMTIzMiAxNDggMTI4OVQyMTUgMTM5MFQzMTUgMTQ1OFQ0MzggMTQ4M1E1MDMgMTQ4MyA1NjAgMTQ1OFQ2NjEgMTM5MFQ3MjkgMTI5MFQ3NTQgMTE2N1E3NTQgMTEwMiA3MjkgMTA0NVQ2NjEgOTQ2VDU2MSA4NzlUNDM4IDg1NFEzNzMgODU0IDMxNiA4NzhUMjE2IDk0NVQxNDggMTA0NVQxMjMKKzExNjdaTTI0NiAxMTY3UTI0NiAxMTI4IDI2MSAxMDk0VDMwMiAxMDMzVDM2MyA5OTJUNDM4IDk3N1E0NzggOTc3IDUxMyA5OTJUNTc0IDEwMzNUNjE2IDEwOTNUNjMxIDExNjdRNjMxIDEyMDcgNjE2IDEyNDJUNTc1IDEzMDRUNTEzIDEzNDZUNDM4IDEzNjJRMzk4IDEzNjIgMzYzIDEzNDdUMzAyIDEzMDVUMjYxIDEyNDNUMjQ2IDExNjdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGIxOyIgZ2x5cGgtbmFtZT0icGx1c21pbnVzIiBob3Jpei1hZHYteD0iMTEyOCIgZD0iTTQ4OSA2NDdIMTAyVjc5N0g0ODlWMTE4Nkg2MzlWNzk3SDEwMjZWNjQ3SDYzOVYyNjJINDg5VjY0N1pNMTAyIDBWMTUwSDEwMjZWMEgxMDJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGIyOyIgZ2x5cGgtbmFtZT0idHdvc3VwZXJpb3IiIGhvcml6LWFkdi14PSI2NzgiIGQ9Ik02MjEgNTg2SDQ5VjY5OEwyNTggOTI2UTMxNSA5ODggMzUxIDEwMzBUNDA3IDExMDZUNDM0IDExNjlUNDQyIDEyMzNRNDQyIDEyOTggNDA5IDEzMzBUMzIyIDEzNjJRMjcxIDEzNjIgMjI1IDEzMzdUMTMzIDEyNzRMNTUgMTM2OFExMDkgMTQxNiAxNzUgMTQ0OFQzMjQgMTQ4MVEzODQgMTQ4MSA0MzIgMTQ2NVQ1MTUKKzE0MTdUNTY3IDEzNDBUNTg2IDEyMzdRNTg2IDExODcgNTcyIDExNDRUNTMwIDEwNTlUNDY0IDk3MVQzNzMgODcwTDIyNSA3MTNINjIxVjU4NloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YjM7IiBnbHlwaC1uYW1lPSJ0aHJlZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iNjc4IiBkPSJNNTkwIDEyNTVRNTkwIDExNzcgNTUwIDExMjRUNDQwIDEwNDdRNTI4IDEwMjQgNTcyIDk3MVQ2MTYgODQwUTYxNiA3ODAgNTk2IDczMFQ1MzUgNjQ1VDQzMCA1ODlUMjgxIDU2OVEyMTEgNTY5IDE1MCA1ODFUMzEgNjI1Vjc1OFE5NCA3MjQgMTYwIDcwNVQyNzkgNjg2UTM3NyA2ODYgNDIxIDcyN1Q0NjUKKzg0MlE0NjUgOTE2IDQxMiA5NDlUMjYyIDk4M0gxNjRWMTA5NkgyNjJRMzU0IDEwOTYgMzk2IDExMzVUNDM4IDEyMzlRNDM4IDEyNzEgNDI4IDEyOTRUNDAxIDEzMzNUMzYwIDEzNTVUMzA5IDEzNjJRMjUwIDEzNjIgMjAyIDEzNDJUMTAyIDEyODRMMzMgMTM4MFE2MiAxNDAzIDkyIDE0MjFUMTU3IDE0NTNUMjI5IDE0NzNUMzExIDE0ODFRMzgwIDE0ODEgNDMyIDE0NjRUNTIwIDE0MTdUNTcyIDEzNDZUNTkwIDEyNTVaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGI0OyIgZ2x5cGgtbmFtZT0iYWN1dGUiIGhvcml6LWFkdi14PSIxMTgyIiBkPSJNMzkzIDEyNjhRNDE1IDEyOTcgNDM4IDEzMzVUNDg1IDE0MTNUNTMwIDE0OTRUNTY3IDE1NjlINzg2VjE1NDhRNzcwIDE1MjEgNzM5IDE0ODFUNjY5IDEzOTZUNTkwIDEzMTFUNTE0IDEyNDFIMzkzVjEyNjhaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGI1OyIgZ2x5cGgtbmFtZT0ibXUiIGhvcml6LWFkdi14PSIxMjE3IiBkPSJNMzU2IDM5MVEzNTYgMjYxIDQwOSAxOTZUNTczIDEzMVE2NTUgMTMxIDcxMCAxNTdUNzk4IDIzM1Q4NDYgMzU4VDg2MCA1MjhWMTA5OEgxMDQyVjBIODk1TDg2OCAxNDdIODU4UTgxMCA2NCA3MzggMjJUNTYzIC0yMFE0OTEgLTIwIDQzOCAzVDM1MCA2OFEzNTEgMzAgMzUzIC0xMFEzNTUgLTQ1IDM1NSAtODdUMzU2CistMTcyVi00OTJIMTc0VjEwOThIMzU2VjM5MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YjY7IiBnbHlwaC1uYW1lPSJwYXJhZ3JhcGgiIGhvcml6LWFkdi14PSIxMzQxIiBkPSJNMTEyNiAtMjYwSDEwMDZWMTM5N0g3OTlWLTI2MEg2NzhWNTU5UTYxNyA1NDEgNTMyIDU0MVE0MzcgNTQxIDM2MCA1NjZUMjI4IDY1MVQxNDMgODA2VDExMyAxMDQyUTExMyAxMTg5IDE0NSAxMjg3VDIzNyAxNDQ2VDM4MCAxNTMxVDU2MyAxNTU2SDExMjZWLTI2MFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Yjc7IiBnbHlwaC1uYW1lPSJtaWRkb3QiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0xNDcgNzIzUTE0NyA3NjEgMTU3IDc4N1QxODQgODMwVDIyNCA4NTRUMjc0IDg2MlEzMDAgODYyIDMyMyA4NTVUMzY0IDgzMVQzOTEgNzg4VDQwMSA3MjNRNDAxIDY4NiAzOTEgNjYwVDM2NCA2MTdUMzI0IDU5MlQyNzQgNTg0UTI0NyA1ODQgMjI0IDU5MlQxODQgNjE3VDE1NyA2NjBUMTQ3IDcyM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Yjg7IiBnbHlwaC1uYW1lPSJjZWRpbGxhIiBob3Jpei1hZHYteD0iNDIwIiBkPSJNNDA4IC0yODdRNDA4IC0zODQgMzM4IC00MzhUMTE3IC00OTJROTUgLTQ5MiA3MyAtNDg5VDM1IC00ODNWLTM3NVE1MCAtMzc4IDc0IC0zNzlUMTE1IC0zODFRMTg2IC0zODEgMjI2IC0zNjBUMjY2IC0yODlRMjY2IC0yNjUgMjUzIC0yNDhUMjE3IC0yMTdUMTYzIC0xOTVUOTQgLTE3NkwxODQgMEgzMDVMMjQ4CistMTE1UTI4MiAtMTIzIDMxMSAtMTM2VDM2MSAtMTY5VDM5NSAtMjE5VDQwOCAtMjg3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiOTsiIGdseXBoLW5hbWU9Im9uZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iNjc4IiBkPSJNMzA3IDE0NjJINDQyVjU4NkgyOTdWMTEwMlEyOTcgMTEyNyAyOTcgMTE1N1QyOTkgMTIxN1QzMDIgMTI3NVQzMDUgMTMyNVEyOTEgMTMwOCAyNzIgMTI4OFQyMzEgMTI1MUwxMzcgMTE3OEw2MyAxMjc0TDMwNyAxNDYyWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiYTsiIGdseXBoLW5hbWU9Im9yZG1hc2N1bGluZSIgaG9yaXotYWR2LXg9IjcxNyIgZD0iTTY1MSAxMTMzUTY1MSAxMDUwIDYzMSA5ODVUNTcyIDg3NlQ0NzkgODA4VDM1NiA3ODRRMjkzIDc4NCAyNDAgODA3VDE0OCA4NzVUODggOTg1VDY2IDExMzNRNjYgMTIxNiA4NiAxMjgwVDE0NSAxMzg5VDIzNyAxNDU2VDM2MCAxNDc5UTQyMiAxNDc5IDQ3NSAxNDU2VDU2OCAxMzg5VDYyOSAxMjgxVDY1MQorMTEzM1pNMTk3IDExMzNRMTk3IDEwMTQgMjM0IDk1NFQzNTggODkzUTQ0MyA4OTMgNDgwIDk1M1Q1MTggMTEzM1E1MTggMTI1MyA0ODEgMTMxMFQzNTggMTM2OFEyNzIgMTM2OCAyMzUgMTMxMVQxOTcgMTEzM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YmI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RyaWdodCIgaG9yaXotYWR2LXg9Ijk5NyIgZD0iTTkxOCA1MjZMNjA4IDExNUw0OTIgMTkzTDcyOSA1NDFMNDkyIDg4OUw2MDggOTY3TDkxOCA1NTNWNTI2Wk01MTAgNTI2TDIwMSAxMTVMODQgMTkzTDMyMiA1NDFMODQgODg5TDIwMSA5NjdMNTEwIDU1M1Y1MjZaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGJjOyIgZ2x5cGgtbmFtZT0ib25lcXVhcnRlciIgaG9yaXotYWR2LXg9IjE1MDkiIGQ9Ik0zMDcgMTQ2Mkg0NDJWNTg2SDI5N1YxMTAyUTI5NyAxMTI3IDI5NyAxMTU3VDI5OSAxMjE3VDMwMiAxMjc1VDMwNSAxMzI1UTI5MSAxMzA4IDI3MiAxMjg4VDIzMSAxMjUxTDEzNyAxMTc4TDYzIDEyNzRMMzA3IDE0NjJaTTEyMDIgMTQ2MkwzOTEgMEgyMzRMMTA0NSAxNDYySDEyMDJaTTE0MTkgMTkzSDEyOTRWMUgxMTUxVjE5M0g3NzZWMzA0TDExNTMKKzg4M0gxMjk0VjMyMEgxNDE5VjE5M1pNMTE1MSAzMjBWNTE1UTExNTEgNTU3IDExNTIgNjA2VDExNTcgNzA1UTExNTIgNjk0IDExNDIgNjc2VDExMjEgNjM2VDEwOTggNTk1VDEwNzcgNTYwTDkyMiAzMjBIMTE1MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YmQ7IiBnbHlwaC1uYW1lPSJvbmVoYWxmIiBob3Jpei1hZHYteD0iMTUwOSIgZD0iTTU0NCAxNDYySDY3OVY1ODZINTM0VjExMDJRNTM0IDExMjcgNTM0IDExNTdUNTM2IDEyMTdUNTM5IDEyNzVUNTQyIDEzMjVRNTI4IDEzMDggNTA5IDEyODhUNDY4IDEyNTFMMzc0IDExNzhMMzAwIDEyNzRMNTQ0IDE0NjJaTTExODEgMTQ2MkwzNzAgMEgyMTNMMTAyNCAxNDYySDExODFaTTE0NDAgMUg4NjhWMTEzTDEwNzcKKzM0MVExMTM0IDQwMyAxMTcwIDQ0NVQxMjI2IDUyMVQxMjUzIDU4NFQxMjYxIDY0OFExMjYxIDcxMyAxMjI4IDc0NVQxMTQxIDc3N1ExMDkwIDc3NyAxMDQ0IDc1MlQ5NTIgNjg5TDg3NCA3ODNROTI4IDgzMSA5OTQgODYzVDExNDMgODk2UTEyMDMgODk2IDEyNTEgODgwVDEzMzQgODMyVDEzODYgNzU1VDE0MDUgNjUyUTE0MDUgNjAyIDEzOTEgNTU5VDEzNDkgNDc0VDEyODMgMzg2VDExOTIgMjg1TDEwNDQgMTI4SDE0NDBWMVoiCisvPgorPGdseXBoIHVuaWNvZGU9IiYjeGJlOyIgZ2x5cGgtbmFtZT0idGhyZWVxdWFydGVycyIgaG9yaXotYWR2LXg9IjE1MDkiIGQ9Ik01OTAgMTI1NVE1OTAgMTE3NyA1NTAgMTEyNFQ0NDAgMTA0N1E1MjggMTAyNCA1NzIgOTcxVDYxNiA4NDBRNjE2IDc4MCA1OTYgNzMwVDUzNSA2NDVUNDMwIDU4OVQyODEgNTY5UTIxMSA1NjkgMTUwIDU4MVQzMSA2MjVWNzU4UTk0IDcyNCAxNjAgNzA1VDI3OSA2ODZRMzc3IDY4NiA0MjEgNzI3VDQ2NQorODQyUTQ2NSA5MTYgNDEyIDk0OVQyNjIgOTgzSDE2NFYxMDk2SDI2MlEzNTQgMTA5NiAzOTYgMTEzNVQ0MzggMTIzOVE0MzggMTI3MSA0MjggMTI5NFQ0MDEgMTMzM1QzNjAgMTM1NVQzMDkgMTM2MlEyNTAgMTM2MiAyMDIgMTM0MlQxMDIgMTI4NEwzMyAxMzgwUTYyIDE0MDMgOTIgMTQyMVQxNTcgMTQ1M1QyMjkgMTQ3M1QzMTEgMTQ4MVEzODAgMTQ4MSA0MzIgMTQ2NFQ1MjAgMTQxN1Q1NzIgMTM0NlQ1OTAgMTI1NVpNMTI5NgorMTQ2Mkw0ODUgMEgzMjhMMTEzOSAxNDYySDEyOTZaTTE0ODYgMTkzSDEzNjFWMUgxMjE4VjE5M0g4NDNWMzA0TDEyMjAgODgzSDEzNjFWMzIwSDE0ODZWMTkzWk0xMjE4IDMyMFY1MTVRMTIxOCA1NTcgMTIxOSA2MDZUMTIyNCA3MDVRMTIxOSA2OTQgMTIwOSA2NzZUMTE4OCA2MzZUMTE2NSA1OTVUMTE0NCA1NjBMOTg5IDMyMEgxMjE4WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiZjsiIGdseXBoLW5hbWU9InF1ZXN0aW9uZG93biIgaG9yaXotYWR2LXg9Ijg3MiIgZD0iTTU5MiA2NzZWNjM5UTU5MiA1ODEgNTg0IDUzNlQ1NTcgNDUwVDUwNSAzNzFUNDIyIDI5MVEzNzQgMjUwIDM0MCAyMTdUMjg1IDE0OVQyNTMgNzVUMjQyIC0xOFEyNDIgLTY2IDI1NyAtMTA1VDMwMCAtMTczVDM3MSAtMjE3VDQ2OSAtMjMzUTU1MyAtMjMzIDYyOCAtMjA4VDc3MiAtMTQ3TDgzNiAtMjkzUTc1NAorLTMzNSA2NjAgLTM2NFQ0NjkgLTM5M1EzNzYgLTM5MyAzMDIgLTM2OFQxNzYgLTI5NFQ5NiAtMTc3VDY4IC0yMFE2OCA0OCA4MSAxMDBUMTIxIDE5N1QxODggMjg0VDI4MyAzNzNRMzM1IDQxOCAzNjggNDUxVDQyMCA1MTZUNDQ2IDU4MFQ0NTMgNjU3VjY3Nkg1OTJaTTYzOSA5NzlRNjM5IDk0MSA2MzAgOTE1VDYwMyA4NzJUNTYyIDg0OFQ1MTIgODQwUTQ4NiA4NDAgNDYzIDg0N1Q0MjMgODcxVDM5NSA5MTRUMzg1IDk3OVEzODUKKzEwMTYgMzk1IDEwNDJUNDIyIDEwODVUNDYzIDExMTBUNTEyIDExMThRNTM5IDExMTggNTYyIDExMTBUNjAyIDEwODVUNjI5IDEwNDJUNjM5IDk3OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YzA7IiBnbHlwaC1uYW1lPSJBZ3JhdmUiIGhvcml6LWFkdi14PSIxMjQ1IiBkPSJNMTA1NSAwTDg5NSA0NTNIMzUwTDE4OCAwSDBMNTM3IDE0NjhINzA3TDEyNDUgMEgxMDU1Wk04MzYgNjE4TDY4OCAxMDQyUTY4MiAxMDYwIDY3NCAxMDg2VDY1NiAxMTQyVDYzOCAxMjA0VDYyMSAxMjY4UTYxNCAxMjM3IDYwNSAxMjA0VDU4NyAxMTQxVDU3MCAxMDg1VDU1NSAxMDQyTDQxMCA2MThIODM2Wk03MTkKKzE1NzlINTk5UTU2NCAxNjA3IDUyMyAxNjQ4VDQ0NCAxNzM0VDM3NCAxODE4VDMyNiAxODg2VjE5MDdINTQ1UTU2MSAxODczIDU4MiAxODMzVDYyNyAxNzUyVDY3NCAxNjczVDcxOSAxNjA2VjE1NzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGMxOyIgZ2x5cGgtbmFtZT0iQWFjdXRlIiBob3Jpei1hZHYteD0iMTI0NSIgZD0iTTEwNTUgMEw4OTUgNDUzSDM1MEwxODggMEgwTDUzNyAxNDY4SDcwN0wxMjQ1IDBIMTA1NVpNODM2IDYxOEw2ODggMTA0MlE2ODIgMTA2MCA2NzQgMTA4NlQ2NTYgMTE0MlQ2MzggMTIwNFQ2MjEgMTI2OFE2MTQgMTIzNyA2MDUgMTIwNFQ1ODcgMTE0MVQ1NzAgMTA4NVQ1NTUgMTA0Mkw0MTAgNjE4SDgzNlpNNTM0CisxNjA2UTU1NiAxNjM1IDU3OSAxNjczVDYyNiAxNzUxVDY3MSAxODMyVDcwOCAxOTA3SDkyN1YxODg2UTkxMSAxODU5IDg4MCAxODE5VDgxMCAxNzM0VDczMSAxNjQ5VDY1NSAxNTc5SDUzNFYxNjA2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjMjsiIGdseXBoLW5hbWU9IkFjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMTI0NSIgZD0iTTEwNTUgMEw4OTUgNDUzSDM1MEwxODggMEgwTDUzNyAxNDY4SDcwN0wxMjQ1IDBIMTA1NVpNODM2IDYxOEw2ODggMTA0MlE2ODIgMTA2MCA2NzQgMTA4NlQ2NTYgMTE0MlQ2MzggMTIwNFQ2MjEgMTI2OFE2MTQgMTIzNyA2MDUgMTIwNFQ1ODcgMTE0MVQ1NzAgMTA4NVQ1NTUgMTA0Mkw0MTAgNjE4SDgzNlpNOTUzCisxNTc5SDgzMlE3ODEgMTYxMyA3MjcgMTY2MVQ2MjEgMTc2NVE1NjcgMTcxMCA1MTQgMTY2MlQ0MTAgMTU3OUgyODlWMTYwNlEzMTUgMTYzNSAzNDkgMTY3M1Q0MTYgMTc1MVQ0NzkgMTgzMlQ1MjUgMTkwN0g3MTdRNzMzIDE4NzMgNzYyIDE4MzNUODI1IDE3NTJUODkzIDE2NzNUOTUzIDE2MDZWMTU3OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YzM7IiBnbHlwaC1uYW1lPSJBdGlsZGUiIGhvcml6LWFkdi14PSIxMjQ1IiBkPSJNMTA1NSAwTDg5NSA0NTNIMzUwTDE4OCAwSDBMNTM3IDE0NjhINzA3TDEyNDUgMEgxMDU1Wk04MzYgNjE4TDY4OCAxMDQyUTY4MiAxMDYwIDY3NCAxMDg2VDY1NiAxMTQyVDYzOCAxMjA0VDYyMSAxMjY4UTYxNCAxMjM3IDYwNSAxMjA0VDU4NyAxMTQxVDU3MCAxMDg1VDU1NSAxMDQyTDQxMCA2MThIODM2Wk03NzIKKzE1ODFRNzMyIDE1ODEgNjkzIDE1OThUNjE1IDE2MzdUNTQyIDE2NzZUNDc1IDE2OTRRNDMwIDE2OTQgNDA2IDE2NjhUMzY4IDE1NzlIMjY0UTI2OSAxNjM5IDI4NSAxNjg4VDMyOCAxNzcxVDM5MiAxODI0VDQ3NSAxODQzUTUxNyAxODQzIDU1NyAxODI2VDYzNiAxNzg3VDcwOCAxNzQ5VDc3MiAxNzMxUTgxNyAxNzMxIDg0MCAxNzU3VDg3OCAxODQ1SDk4M1E5NzggMTc4NSA5NjIgMTczN1Q5MTkgMTY1NFQ4NTUgMTYwMFQ3NzIKKzE1ODFaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGM0OyIgZ2x5cGgtbmFtZT0iQWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMTI0NSIgZD0iTTEwNTUgMEw4OTUgNDUzSDM1MEwxODggMEgwTDUzNyAxNDY4SDcwN0wxMjQ1IDBIMTA1NVpNODM2IDYxOEw2ODggMTA0MlE2ODIgMTA2MCA2NzQgMTA4NlQ2NTYgMTE0MlQ2MzggMTIwNFQ2MjEgMTI2OFE2MTQgMTIzNyA2MDUgMTIwNFQ1ODcgMTE0MVQ1NzAgMTA4NVQ1NTUgMTA0Mkw0MTAgNjE4SDgzNlpNMzQwCisxNzMzUTM0MCAxNzg3IDM2OCAxODExVDQzNiAxODM1UTQ3NSAxODM1IDUwNCAxODExVDUzMyAxNzMzUTUzMyAxNjgwIDUwNCAxNjU1VDQzNiAxNjMwUTM5NiAxNjMwIDM2OCAxNjU1VDM0MCAxNzMzWk03MTUgMTczM1E3MTUgMTc4NyA3NDMgMTgxMVQ4MTEgMTgzNVE4MzAgMTgzNSA4NDcgMTgyOVQ4NzggMTgxMVQ4OTkgMTc3OVQ5MDcgMTczM1E5MDcgMTY4MCA4NzggMTY1NVQ4MTEgMTYzMFE3NzEgMTYzMCA3NDMgMTY1NVQ3MTUKKzE3MzNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGM1OyIgZ2x5cGgtbmFtZT0iQXJpbmciIGhvcml6LWFkdi14PSIxMjQ1IiBkPSJNMTA1NSAwTDg5NSA0NTNIMzUwTDE4OCAwSDBMNTM3IDE0NjhINzA3TDEyNDUgMEgxMDU1Wk04MzYgNjE4TDY4OCAxMDQyUTY4MiAxMDYwIDY3NCAxMDg2VDY1NiAxMTQyVDYzOCAxMjA0VDYyMSAxMjY4UTYxNCAxMjM3IDYwNSAxMjA0VDU4NyAxMTQxVDU3MCAxMDg1VDU1NSAxMDQyTDQxMCA2MThIODM2Wk04NDgKKzE1ODNRODQ4IDE1MzIgODMxIDE0OTJUNzgzIDE0MjNUNzEwIDEzODFUNjE5IDEzNjZRNTY5IDEzNjYgNTI4IDEzODBUNDU4IDE0MjNUNDEyIDE0OTBUMzk2IDE1ODFRMzk2IDE2MzIgNDEyIDE2NzFUNDU3IDE3MzlUNTI4IDE3ODFUNjE5IDE3OTZRNjY3IDE3OTYgNzA5IDE3ODJUNzgyIDE3NDBUODMwIDE2NzNUODQ4IDE1ODNaTTczMSAxNTgxUTczMSAxNjM0IDcwMCAxNjY0VDYxOSAxNjk0UTU2OSAxNjk0IDUzOCAxNjY0VDUwNgorMTU4MVE1MDYgMTUyOCA1MzQgMTQ5OFQ2MTkgMTQ2OFE2NjggMTQ2OCA2OTkgMTQ5OFQ3MzEgMTU4MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YzY7IiBnbHlwaC1uYW1lPSJBRSIgaG9yaXotYWR2LXg9IjE3NDUiIGQ9Ik0xNjIyIDBIODYyVjQ1M0gzODdMMTg0IDBILTJMNjUzIDE0NjJIMTYyMlYxMjk4SDEwNDlWODQ2SDE1ODNWNjg0SDEwNDlWMTY0SDE2MjJWMFpNNDU5IDYxOEg4NjJWMTI5OEg3NTRMNDU5IDYxOFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Yzc7IiBnbHlwaC1uYW1lPSJDY2VkaWxsYSIgaG9yaXotYWR2LXg9IjEyMzUiIGQ9Ik03OTMgMTMxOVE2ODYgMTMxOSA1OTkgMTI3OVQ0NTEgMTE2MlQzNTYgOTc3VDMyMiA3MzFRMzIyIDU5MCAzNTEgNDgxVDQ0MCAyOTZUNTg3IDE4MlQ3OTMgMTQzUTg4MiAxNDMgOTYyIDE2MFQxMTIwIDIwMVYzOVExMDgxIDI0IDEwNDIgMTNUOTYxIC02VDg3MCAtMTZUNzYyIC0yMFE1OTggLTIwIDQ3OCAzNFQyODAKKzE4N1QxNjMgNDI1VDEyNSA3MzNRMTI1IDg5OSAxNjggMTAzN1QyOTYgMTI3NFQ1MDYgMTQyOFQ3OTMgMTQ4M1E5MDEgMTQ4MyA5OTkgMTQ2MVQxMTc2IDEzOTdMMTA5OCAxMjQxUTEwMzUgMTI3MyA5NjEgMTI5NlQ3OTMgMTMxOVpNOTE2IC0yODdROTE2IC0zODQgODQ2IC00MzhUNjI1IC00OTJRNjAzIC00OTIgNTgxIC00ODlUNTQzIC00ODNWLTM3NVE1NTggLTM3OCA1ODIgLTM3OVQ2MjMgLTM4MVE2OTQgLTM4MSA3MzQgLTM2MFQ3NzQKKy0yODlRNzc0IC0yNjUgNzYxIC0yNDhUNzI1IC0yMTdUNjcxIC0xOTVUNjAyIC0xNzZMNjkyIDBIODEzTDc1NiAtMTE1UTc5MCAtMTIzIDgxOSAtMTM2VDg2OSAtMTY5VDkwMyAtMjE5VDkxNiAtMjg3WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjODsiIGdseXBoLW5hbWU9IkVncmF2ZSIgaG9yaXotYWR2LXg9IjEwODEiIGQ9Ik05NTggMEgxOTlWMTQ2Mkg5NThWMTI5OEgzODVWODQ2SDkyMFY2ODRIMzg1VjE2NEg5NThWMFpNNzEzIDE1NzlINTkzUTU1OCAxNjA3IDUxNyAxNjQ4VDQzOCAxNzM0VDM2OCAxODE4VDMyMCAxODg2VjE5MDdINTM5UTU1NSAxODczIDU3NiAxODMzVDYyMSAxNzUyVDY2OCAxNjczVDcxMyAxNjA2VjE1NzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGM5OyIgZ2x5cGgtbmFtZT0iRWFjdXRlIiBob3Jpei1hZHYteD0iMTA4MSIgZD0iTTk1OCAwSDE5OVYxNDYySDk1OFYxMjk4SDM4NVY4NDZIOTIwVjY4NEgzODVWMTY0SDk1OFYwWk00NTYgMTYwNlE0NzggMTYzNSA1MDEgMTY3M1Q1NDggMTc1MVQ1OTMgMTgzMlQ2MzAgMTkwN0g4NDlWMTg4NlE4MzMgMTg1OSA4MDIgMTgxOVQ3MzIgMTczNFQ2NTMgMTY0OVQ1NzcgMTU3OUg0NTZWMTYwNloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Y2E7IiBnbHlwaC1uYW1lPSJFY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjEwODEiIGQ9Ik05NTggMEgxOTlWMTQ2Mkg5NThWMTI5OEgzODVWODQ2SDkyMFY2ODRIMzg1VjE2NEg5NThWMFpNOTA3IDE1NzlINzg2UTczNSAxNjEzIDY4MSAxNjYxVDU3NSAxNzY1UTUyMSAxNzEwIDQ2OCAxNjYyVDM2NCAxNTc5SDI0M1YxNjA2UTI2OSAxNjM1IDMwMyAxNjczVDM3MCAxNzUxVDQzMyAxODMyVDQ3OQorMTkwN0g2NzFRNjg3IDE4NzMgNzE2IDE4MzNUNzc5IDE3NTJUODQ3IDE2NzNUOTA3IDE2MDZWMTU3OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Y2I7IiBnbHlwaC1uYW1lPSJFZGllcmVzaXMiIGhvcml6LWFkdi14PSIxMDgxIiBkPSJNOTU4IDBIMTk5VjE0NjJIOTU4VjEyOThIMzg1Vjg0Nkg5MjBWNjg0SDM4NVYxNjRIOTU4VjBaTTI5NiAxNzMzUTI5NiAxNzg3IDMyNCAxODExVDM5MiAxODM1UTQzMSAxODM1IDQ2MCAxODExVDQ4OSAxNzMzUTQ4OSAxNjgwIDQ2MCAxNjU1VDM5MiAxNjMwUTM1MiAxNjMwIDMyNCAxNjU1VDI5NiAxNzMzWk02NzEKKzE3MzNRNjcxIDE3ODcgNjk5IDE4MTFUNzY3IDE4MzVRNzg2IDE4MzUgODAzIDE4MjlUODM0IDE4MTFUODU1IDE3NzlUODYzIDE3MzNRODYzIDE2ODAgODM0IDE2NTVUNzY3IDE2MzBRNzI3IDE2MzAgNjk5IDE2NTVUNjcxIDE3MzNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGNjOyIgZ2x5cGgtbmFtZT0iSWdyYXZlIiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNjEyIDBIODJWMTAyTDI1NCAxNDNWMTMxOUw4MiAxMzYwVjE0NjJINjEyVjEzNjBMNDQwIDEzMTlWMTQzTDYxMiAxMDJWMFpNNDU1IDE1NzlIMzM1UTMwMCAxNjA3IDI1OSAxNjQ4VDE4MCAxNzM0VDExMCAxODE4VDYyIDE4ODZWMTkwN0gyODFRMjk3IDE4NzMgMzE4IDE4MzNUMzYzIDE3NTJUNDEwIDE2NzNUNDU1CisxNjA2VjE1NzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGNkOyIgZ2x5cGgtbmFtZT0iSWFjdXRlIiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNjEyIDBIODJWMTAyTDI1NCAxNDNWMTMxOUw4MiAxMzYwVjE0NjJINjEyVjEzNjBMNDQwIDEzMTlWMTQzTDYxMiAxMDJWMFpNMjU3IDE2MDZRMjc5IDE2MzUgMzAyIDE2NzNUMzQ5IDE3NTFUMzk0IDE4MzJUNDMxIDE5MDdINjUwVjE4ODZRNjM0IDE4NTkgNjAzIDE4MTlUNTMzIDE3MzRUNDU0IDE2NDlUMzc4CisxNTc5SDI1N1YxNjA2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hjZTsiIGdseXBoLW5hbWU9IkljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNjEyIDBIODJWMTAyTDI1NCAxNDNWMTMxOUw4MiAxMzYwVjE0NjJINjEyVjEzNjBMNDQwIDEzMTlWMTQzTDYxMiAxMDJWMFpNNjgxIDE1NzlINTYwUTUwOSAxNjEzIDQ1NSAxNjYxVDM0OSAxNzY1UTI5NSAxNzEwIDI0MiAxNjYyVDEzOCAxNTc5SDE3VjE2MDZRNDMgMTYzNSA3NyAxNjczVDE0NCAxNzUxVDIwNworMTgzMlQyNTMgMTkwN0g0NDVRNDYxIDE4NzMgNDkwIDE4MzNUNTUzIDE3NTJUNjIxIDE2NzNUNjgxIDE2MDZWMTU3OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Y2Y7IiBnbHlwaC1uYW1lPSJJZGllcmVzaXMiIGhvcml6LWFkdi14PSI2OTQiIGQ9Ik02MTIgMEg4MlYxMDJMMjU0IDE0M1YxMzE5TDgyIDEzNjBWMTQ2Mkg2MTJWMTM2MEw0NDAgMTMxOVYxNDNMNjEyIDEwMlYwWk02NCAxNzMzUTY0IDE3ODcgOTIgMTgxMVQxNjAgMTgzNVExOTkgMTgzNSAyMjggMTgxMVQyNTcgMTczM1EyNTcgMTY4MCAyMjggMTY1NVQxNjAgMTYzMFExMjAgMTYzMCA5MiAxNjU1VDY0CisxNzMzWk00MzkgMTczM1E0MzkgMTc4NyA0NjcgMTgxMVQ1MzUgMTgzNVE1NTQgMTgzNSA1NzEgMTgyOVQ2MDIgMTgxMVQ2MjMgMTc3OVQ2MzEgMTczM1E2MzEgMTY4MCA2MDIgMTY1NVQ1MzUgMTYzMFE0OTUgMTYzMCA0NjcgMTY1NVQ0MzkgMTczM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDA7IiBnbHlwaC1uYW1lPSJFdGgiIGhvcml6LWFkdi14PSIxNDAxIiBkPSJNNDcgODA1SDE5OVYxNDYySDYwNlE3NTkgMTQ2MiA4ODMgMTQxNlQxMDk0IDEyODBUMTIyOCAxMDU1VDEyNzYgNzQ1UTEyNzYgNTYwIDEyMjggNDIxVDEwODkgMTg4VDg2NiA0N1Q1NjUgMEgxOTlWNjQzSDQ3VjgwNVpNMTA3OSA3MzlRMTA3OSA4ODUgMTA0NiA5OTFUOTUwIDExNjdUNzk1IDEyNjlUNTg2IDEzMDNIMzg1VjgwNUg3MjFWNjQzSDM4NVYxNjBINTQ3UTgxMQorMTYwIDk0NSAzMDZUMTA3OSA3MzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGQxOyIgZ2x5cGgtbmFtZT0iTnRpbGRlIiBob3Jpei1hZHYteD0iMTQ5MyIgZD0iTTEyOTQgMEgxMDc5TDM2MCAxMjEwSDM1MlEzNTggMTEzMyAzNjIgMTA1N1EzNjYgOTkyIDM2OCA5MjFUMzcxIDc5M1YwSDE5OVYxNDYySDQxMkwxMTI4IDI1OEgxMTM1UTExMzIgMzM0IDExMjggNDA4UTExMjcgNDQwIDExMjYgNDczVDExMjMgNTQwVDExMjEgNjA1VDExMjAgNjYyVjE0NjJIMTI5NFYwWk05MDUKKzE1ODFRODY1IDE1ODEgODI2IDE1OThUNzQ4IDE2MzdUNjc1IDE2NzZUNjA4IDE2OTRRNTYzIDE2OTQgNTM5IDE2NjhUNTAxIDE1NzlIMzk3UTQwMiAxNjM5IDQxOCAxNjg4VDQ2MSAxNzcxVDUyNSAxODI0VDYwOCAxODQzUTY1MCAxODQzIDY5MCAxODI2VDc2OSAxNzg3VDg0MSAxNzQ5VDkwNSAxNzMxUTk1MCAxNzMxIDk3MyAxNzU3VDEwMTEgMTg0NUgxMTE2UTExMTEgMTc4NSAxMDk1IDE3MzdUMTA1MiAxNjU0VDk4OCAxNjAwVDkwNQorMTU4MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDI7IiBnbHlwaC1uYW1lPSJPZ3JhdmUiIGhvcml6LWFkdi14PSIxNTIwIiBkPSJNMTM5MyA3MzNRMTM5MyA1NjQgMTM1MyA0MjVUMTIzMiAxODdUMTAzNCAzNFQ3NjAgLTIwUTU5NyAtMjAgNDc4IDM0VDI4MCAxODdUMTYzIDQyNVQxMjUgNzM1UTEyNSA5MDUgMTYzIDEwNDNUMjgwIDEyODBUNDc5IDE0MzFUNzYyIDE0ODVROTE3IDE0ODUgMTAzNCAxNDMyVDEyMzIgMTI4MFQxMzUyIDEwNDNUMTM5MworNzMzWk0zMjIgNzMzUTMyMiA1OTYgMzQ4IDQ4N1Q0MjcgMzAxVDU2MyAxODRUNzYwIDE0M1E4NzQgMTQzIDk1NiAxODNUMTA5MiAzMDBUMTE3MSA0ODZUMTE5NiA3MzNRMTE5NiA4NzEgMTE3MSA5ODBUMTA5MyAxMTY0VDk1OCAxMjgwVDc2MiAxMzIxUTY0OCAxMzIxIDU2NSAxMjgxVDQyOCAxMTY1VDM0OCA5ODBUMzIyIDczM1pNODcwIDE1NzlINzUwUTcxNSAxNjA3IDY3NCAxNjQ4VDU5NSAxNzM0VDUyNSAxODE4VDQ3NyAxODg2VjE5MDdINjk2UTcxMgorMTg3MyA3MzMgMTgzM1Q3NzggMTc1MlQ4MjUgMTY3M1Q4NzAgMTYwNlYxNTc5WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkMzsiIGdseXBoLW5hbWU9Ik9hY3V0ZSIgaG9yaXotYWR2LXg9IjE1MjAiIGQ9Ik0xMzkzIDczM1ExMzkzIDU2NCAxMzUzIDQyNVQxMjMyIDE4N1QxMDM0IDM0VDc2MCAtMjBRNTk3IC0yMCA0NzggMzRUMjgwIDE4N1QxNjMgNDI1VDEyNSA3MzVRMTI1IDkwNSAxNjMgMTA0M1QyODAgMTI4MFQ0NzkgMTQzMVQ3NjIgMTQ4NVE5MTcgMTQ4NSAxMDM0IDE0MzJUMTIzMiAxMjgwVDEzNTIgMTA0M1QxMzkzCis3MzNaTTMyMiA3MzNRMzIyIDU5NiAzNDggNDg3VDQyNyAzMDFUNTYzIDE4NFQ3NjAgMTQzUTg3NCAxNDMgOTU2IDE4M1QxMDkyIDMwMFQxMTcxIDQ4NlQxMTk2IDczM1ExMTk2IDg3MSAxMTcxIDk4MFQxMDkzIDExNjRUOTU4IDEyODBUNzYyIDEzMjFRNjQ4IDEzMjEgNTY1IDEyODFUNDI4IDExNjVUMzQ4IDk4MFQzMjIgNzMzWk02NTEgMTYwNlE2NzMgMTYzNSA2OTYgMTY3M1Q3NDMgMTc1MVQ3ODggMTgzMlQ4MjUgMTkwN0gxMDQ0VjE4ODZRMTAyOAorMTg1OSA5OTcgMTgxOVQ5MjcgMTczNFQ4NDggMTY0OVQ3NzIgMTU3OUg2NTFWMTYwNloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDQ7IiBnbHlwaC1uYW1lPSJPY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjE1MjAiIGQ9Ik0xMzkzIDczM1ExMzkzIDU2NCAxMzUzIDQyNVQxMjMyIDE4N1QxMDM0IDM0VDc2MCAtMjBRNTk3IC0yMCA0NzggMzRUMjgwIDE4N1QxNjMgNDI1VDEyNSA3MzVRMTI1IDkwNSAxNjMgMTA0M1QyODAgMTI4MFQ0NzkgMTQzMVQ3NjIgMTQ4NVE5MTcgMTQ4NSAxMDM0IDE0MzJUMTIzMiAxMjgwVDEzNTIKKzEwNDNUMTM5MyA3MzNaTTMyMiA3MzNRMzIyIDU5NiAzNDggNDg3VDQyNyAzMDFUNTYzIDE4NFQ3NjAgMTQzUTg3NCAxNDMgOTU2IDE4M1QxMDkyIDMwMFQxMTcxIDQ4NlQxMTk2IDczM1ExMTk2IDg3MSAxMTcxIDk4MFQxMDkzIDExNjRUOTU4IDEyODBUNzYyIDEzMjFRNjQ4IDEzMjEgNTY1IDEyODFUNDI4IDExNjVUMzQ4IDk4MFQzMjIgNzMzWk0xMDk2IDE1NzlIOTc1UTkyNCAxNjEzIDg3MCAxNjYxVDc2NCAxNzY1UTcxMAorMTcxMCA2NTcgMTY2MlQ1NTMgMTU3OUg0MzJWMTYwNlE0NTggMTYzNSA0OTIgMTY3M1Q1NTkgMTc1MVQ2MjIgMTgzMlQ2NjggMTkwN0g4NjBRODc2IDE4NzMgOTA1IDE4MzNUOTY4IDE3NTJUMTAzNiAxNjczVDEwOTYgMTYwNlYxNTc5WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkNTsiIGdseXBoLW5hbWU9Ik90aWxkZSIgaG9yaXotYWR2LXg9IjE1MjAiIGQ9Ik0xMzkzIDczM1ExMzkzIDU2NCAxMzUzIDQyNVQxMjMyIDE4N1QxMDM0IDM0VDc2MCAtMjBRNTk3IC0yMCA0NzggMzRUMjgwIDE4N1QxNjMgNDI1VDEyNSA3MzVRMTI1IDkwNSAxNjMgMTA0M1QyODAgMTI4MFQ0NzkgMTQzMVQ3NjIgMTQ4NVE5MTcgMTQ4NSAxMDM0IDE0MzJUMTIzMiAxMjgwVDEzNTIgMTA0M1QxMzkzCis3MzNaTTMyMiA3MzNRMzIyIDU5NiAzNDggNDg3VDQyNyAzMDFUNTYzIDE4NFQ3NjAgMTQzUTg3NCAxNDMgOTU2IDE4M1QxMDkyIDMwMFQxMTcxIDQ4NlQxMTk2IDczM1ExMTk2IDg3MSAxMTcxIDk4MFQxMDkzIDExNjRUOTU4IDEyODBUNzYyIDEzMjFRNjQ4IDEzMjEgNTY1IDEyODFUNDI4IDExNjVUMzQ4IDk4MFQzMjIgNzMzWk04OTEgMTU4MVE4NTEgMTU4MSA4MTIgMTU5OFQ3MzQgMTYzN1Q2NjEgMTY3NlQ1OTQgMTY5NFE1NDkKKzE2OTQgNTI1IDE2NjhUNDg3IDE1NzlIMzgzUTM4OCAxNjM5IDQwNCAxNjg4VDQ0NyAxNzcxVDUxMSAxODI0VDU5NCAxODQzUTYzNiAxODQzIDY3NiAxODI2VDc1NSAxNzg3VDgyNyAxNzQ5VDg5MSAxNzMxUTkzNiAxNzMxIDk1OSAxNzU3VDk5NyAxODQ1SDExMDJRMTA5NyAxNzg1IDEwODEgMTczN1QxMDM4IDE2NTRUOTc0IDE2MDBUODkxIDE1ODFaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGQ2OyIgZ2x5cGgtbmFtZT0iT2RpZXJlc2lzIiBob3Jpei1hZHYteD0iMTUyMCIgZD0iTTEzOTMgNzMzUTEzOTMgNTY0IDEzNTMgNDI1VDEyMzIgMTg3VDEwMzQgMzRUNzYwIC0yMFE1OTcgLTIwIDQ3OCAzNFQyODAgMTg3VDE2MyA0MjVUMTI1IDczNVExMjUgOTA1IDE2MyAxMDQzVDI4MCAxMjgwVDQ3OSAxNDMxVDc2MiAxNDg1UTkxNyAxNDg1IDEwMzQgMTQzMlQxMjMyIDEyODBUMTM1MiAxMDQzVDEzOTMKKzczM1pNMzIyIDczM1EzMjIgNTk2IDM0OCA0ODdUNDI3IDMwMVQ1NjMgMTg0VDc2MCAxNDNRODc0IDE0MyA5NTYgMTgzVDEwOTIgMzAwVDExNzEgNDg2VDExOTYgNzMzUTExOTYgODcxIDExNzEgOTgwVDEwOTMgMTE2NFQ5NTggMTI4MFQ3NjIgMTMyMVE2NDggMTMyMSA1NjUgMTI4MVQ0MjggMTE2NVQzNDggOTgwVDMyMiA3MzNaTTQ3NyAxNzMzUTQ3NyAxNzg3IDUwNSAxODExVDU3MyAxODM1UTYxMiAxODM1IDY0MSAxODExVDY3MAorMTczM1E2NzAgMTY4MCA2NDEgMTY1NVQ1NzMgMTYzMFE1MzMgMTYzMCA1MDUgMTY1NVQ0NzcgMTczM1pNODUyIDE3MzNRODUyIDE3ODcgODgwIDE4MTFUOTQ4IDE4MzVROTY3IDE4MzUgOTg0IDE4MjlUMTAxNSAxODExVDEwMzYgMTc3OVQxMDQ0IDE3MzNRMTA0NCAxNjgwIDEwMTUgMTY1NVQ5NDggMTYzMFE5MDggMTYzMCA4ODAgMTY1NVQ4NTIgMTczM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDc7IiBnbHlwaC1uYW1lPSJtdWx0aXBseSIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik00NTkgNzIzTDE0MSAxMDQyTDI0NiAxMTQ3TDU2MyA4MjlMODg1IDExNDdMOTg5IDEwNDRMNjY4IDcyM0w5ODcgNDAzTDg4NSAzMDFMNTYzIDYxOEwyNDYgMzAzTDE0MyA0MDZMNDU5IDcyM1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZDg7IiBnbHlwaC1uYW1lPSJPc2xhc2giIGhvcml6LWFkdi14PSIxNTIwIiBkPSJNMTMwMCAxNDU0TDEyMDggMTMwNVExMjk5IDEyMDYgMTM0NiAxMDYxVDEzOTMgNzMzUTEzOTMgNTY0IDEzNTMgNDI1VDEyMzIgMTg3VDEwMzQgMzRUNzYwIC0yMFE1NzEgLTIwIDQzOCA1MUwzNjAgLTc2TDIyMyAyTDMxMyAxNDdRMjE2IDI0NyAxNzEgMzk2VDEyNSA3MzVRMTI1IDkwNSAxNjMgMTA0M1QyODAKKzEyODBUNDc5IDE0MzFUNzYyIDE0ODVRODU2IDE0ODUgOTM2IDE0NjRUMTA4MyAxNDA1TDExNjMgMTUzMkwxMzAwIDE0NTRaTTMyMiA3MzNRMzIyIDYwMiAzNDUgNDk4VDQxNiAzMTVMOTk1IDEyNjBROTQ3IDEyODkgODkwIDEzMDVUNzYyIDEzMjFRNjQ4IDEzMjEgNTY1IDEyODFUNDI4IDExNjVUMzQ4IDk4MFQzMjIgNzMzWk0xMTk2IDczM1ExMTk2IDk5MCAxMTA4IDExNDFMNTMwIDIwMVE1NzcgMTczIDYzNCAxNThUNzYwIDE0M1E4NzQKKzE0MyA5NTYgMTgzVDEwOTIgMzAwVDExNzEgNDg2VDExOTYgNzMzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkOTsiIGdseXBoLW5hbWU9IlVncmF2ZSIgaG9yaXotYWR2LXg9IjE0MzAiIGQ9Ik0xMjQ1IDE0NjRWNTE2UTEyNDUgNDAyIDEyMTIgMzA0VDExMTMgMTM0VDk0NiAyMVQ3MDkgLTIwUTU4MSAtMjAgNDgzIDE4VDMxOSAxMjhUMjE4IDI5OFQxODQgNTIwVjE0NjJIMzcxVjUxMFEzNzEgMzM1IDQ1NyAyMzlUNzE5IDE0M1E4MDggMTQzIDg3MiAxNzBUOTc3IDI0NlQxMDM4IDM2M1QxMDU5IDUxMlYxNDY0SDEyNDVaTTg0NworMTU3OUg3MjdRNjkyIDE2MDcgNjUxIDE2NDhUNTcyIDE3MzRUNTAyIDE4MThUNDU0IDE4ODZWMTkwN0g2NzNRNjg5IDE4NzMgNzEwIDE4MzNUNzU1IDE3NTJUODAyIDE2NzNUODQ3IDE2MDZWMTU3OVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZGE7IiBnbHlwaC1uYW1lPSJVYWN1dGUiIGhvcml6LWFkdi14PSIxNDMwIiBkPSJNMTI0NSAxNDY0VjUxNlExMjQ1IDQwMiAxMjEyIDMwNFQxMTEzIDEzNFQ5NDYgMjFUNzA5IC0yMFE1ODEgLTIwIDQ4MyAxOFQzMTkgMTI4VDIxOCAyOThUMTg0IDUyMFYxNDYySDM3MVY1MTBRMzcxIDMzNSA0NTcgMjM5VDcxOSAxNDNRODA4IDE0MyA4NzIgMTcwVDk3NyAyNDZUMTAzOCAzNjNUMTA1OSA1MTJWMTQ2NEgxMjQ1Wk01OTAKKzE2MDZRNjEyIDE2MzUgNjM1IDE2NzNUNjgyIDE3NTFUNzI3IDE4MzJUNzY0IDE5MDdIOTgzVjE4ODZROTY3IDE4NTkgOTM2IDE4MTlUODY2IDE3MzRUNzg3IDE2NDlUNzExIDE1NzlINTkwVjE2MDZaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGRiOyIgZ2x5cGgtbmFtZT0iVWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIxNDMwIiBkPSJNMTI0NSAxNDY0VjUxNlExMjQ1IDQwMiAxMjEyIDMwNFQxMTEzIDEzNFQ5NDYgMjFUNzA5IC0yMFE1ODEgLTIwIDQ4MyAxOFQzMTkgMTI4VDIxOCAyOThUMTg0IDUyMFYxNDYySDM3MVY1MTBRMzcxIDMzNSA0NTcgMjM5VDcxOSAxNDNRODA4IDE0MyA4NzIgMTcwVDk3NyAyNDZUMTAzOCAzNjNUMTA1OQorNTEyVjE0NjRIMTI0NVpNMTA0MyAxNTc5SDkyMlE4NzEgMTYxMyA4MTcgMTY2MVQ3MTEgMTc2NVE2NTcgMTcxMCA2MDQgMTY2MlQ1MDAgMTU3OUgzNzlWMTYwNlE0MDUgMTYzNSA0MzkgMTY3M1Q1MDYgMTc1MVQ1NjkgMTgzMlQ2MTUgMTkwN0g4MDdRODIzIDE4NzMgODUyIDE4MzNUOTE1IDE3NTJUOTgzIDE2NzNUMTA0MyAxNjA2VjE1NzlaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGRjOyIgZ2x5cGgtbmFtZT0iVWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMTQzMCIgZD0iTTEyNDUgMTQ2NFY1MTZRMTI0NSA0MDIgMTIxMiAzMDRUMTExMyAxMzRUOTQ2IDIxVDcwOSAtMjBRNTgxIC0yMCA0ODMgMThUMzE5IDEyOFQyMTggMjk4VDE4NCA1MjBWMTQ2MkgzNzFWNTEwUTM3MSAzMzUgNDU3IDIzOVQ3MTkgMTQzUTgwOCAxNDMgODcyIDE3MFQ5NzcgMjQ2VDEwMzggMzYzVDEwNTkgNTEyVjE0NjRIMTI0NVpNNDMyCisxNzMzUTQzMiAxNzg3IDQ2MCAxODExVDUyOCAxODM1UTU2NyAxODM1IDU5NiAxODExVDYyNSAxNzMzUTYyNSAxNjgwIDU5NiAxNjU1VDUyOCAxNjMwUTQ4OCAxNjMwIDQ2MCAxNjU1VDQzMiAxNzMzWk04MDcgMTczM1E4MDcgMTc4NyA4MzUgMTgxMVQ5MDMgMTgzNVE5MjIgMTgzNSA5MzkgMTgyOVQ5NzAgMTgxMVQ5OTEgMTc3OVQ5OTkgMTczM1E5OTkgMTY4MCA5NzAgMTY1NVQ5MDMgMTYzMFE4NjMgMTYzMCA4MzUgMTY1NVQ4MDcKKzE3MzNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGRkOyIgZ2x5cGgtbmFtZT0iWWFjdXRlIiBob3Jpei1hZHYteD0iMTA3OSIgZD0iTTUzOSA3MjNMODc5IDE0NjJIMTA3OUw2MzMgNTY5VjBINDQ2VjU1OUwwIDE0NjJIMjAzTDUzOSA3MjNaTTQ0MiAxNjA2UTQ2NCAxNjM1IDQ4NyAxNjczVDUzNCAxNzUxVDU3OSAxODMyVDYxNiAxOTA3SDgzNVYxODg2UTgxOSAxODU5IDc4OCAxODE5VDcxOCAxNzM0VDYzOSAxNjQ5VDU2MyAxNTc5SDQ0MlYxNjA2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hkZTsiIGdseXBoLW5hbWU9IlRob3JuIiBob3Jpei1hZHYteD0iMTE4MCIgZD0iTTEwNzUgNzgyUTEwNzUgNjkxIDEwNDggNjA3VDk1NyA0NTlUNzkxIDM1NlQ1MzUgMzE3SDM4NVYwSDE5OVYxNDYySDM4NVYxMjEwSDU2MVE2OTUgMTIxMCA3OTIgMTE4MlQ5NTIgMTA5OVQxMDQ1IDk2NFQxMDc1IDc4MlpNMzg1IDQ3NUg1MTRRNjA3IDQ3NSA2NzYgNDkxVDc5MSA1NDJUODYwIDYzNFQ4ODMgNzcyUTg4MworOTE1IDgwMSA5ODNUNTQ1IDEwNTFIMzg1VjQ3NVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZGY7IiBnbHlwaC1uYW1lPSJnZXJtYW5kYmxzIiBob3Jpei1hZHYteD0iMTIzMyIgZD0iTTEwMTAgMTI2MFExMDEwIDEyMDMgOTg5IDExNTlUOTM2IDEwNzhUODY3IDEwMTFUNzk4IDk1NFQ3NDUgODk5VDcyMyA4NDJRNzIzIDgyMSA3MzAgODA1VDc1NiA3NjlUODExIDcyNVQ5MDMgNjYyUTk1OSA2MjUgMTAwMyA1ODlUMTA3NyA1MTJUMTEyNCA0MjNUMTE0MSAzMTNRMTE0MSAyMjYgMTExMyAxNjNUMTAzNQorNjBUOTE0IDBUNzU4IC0yMFE2NjEgLTIwIDU5MiAtM1Q0NjkgNDlWMjE1UTQ5NSAxOTkgNTI3IDE4NFQ1OTYgMTU2VDY3MCAxMzdUNzQ1IDEyOVE4MDEgMTI5IDg0MSAxNDFUOTA4IDE3NlQ5NDYgMjMxVDk1OCAzMDNROTU4IDMzOSA5NTAgMzY4VDkyMCA0MjZUODYyIDQ4M1Q3NzAgNTQ3UTcwNyA1ODcgNjY1IDYyMVQ1OTYgNjg4VDU1OCA3NTdUNTQ3IDgzNFE1NDcgODg4IDU2NyA5MjdUNjE5IDk5OFQ2ODYgMTA1N1Q3NTMgMTExM1Q4MDQKKzExNzVUODI1IDEyNTNRODI1IDEyOTUgODA5IDEzMjZUNzYyIDEzNzdUNjkxIDE0MDdUNTk4IDE0MTdRNTQ5IDE0MTcgNTA1IDE0MDhUNDI4IDEzNzRUMzc2IDEzMDlUMzU2IDEyMDJWMEgxNzRWMTIwMFExNzQgMTMwNCAyMDUgMTM3NFQyOTMgMTQ4N1Q0MjggMTU0OFQ1OTggMTU2N1E2OTAgMTU2NyA3NjYgMTU0OFQ4OTYgMTQ5MVQ5ODAgMTM5NVQxMDEwIDEyNjBaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwOyIgZ2x5cGgtbmFtZT0iYWdyYXZlIiBob3Jpei1hZHYteD0iMTA4NyIgZD0iTTc5MyAwTDc1NiAxNTJINzQ4UTcxNSAxMDcgNjgyIDc1VDYxMCAyMVQ1MjMgLTEwVDQxMiAtMjBRMzQzIC0yMCAyODUgLTFUMTg1IDU5VDExOCAxNjFUOTQgMzA3UTk0IDQ3MSAyMDkgNTU5VDU2MSA2NTVMNzQ1IDY2MlY3MzFRNzQ1IDc5OCA3MzEgODQzVDY4OSA5MTVUNjIxIDk1NVQ1MjggOTY3UTQ0NSA5NjcKKzM3NCA5NDNUMjM2IDg4NUwxNzIgMTAyMlEyNDYgMTA2MiAzMzcgMTA5MFQ1MjggMTExOFE2MzAgMTExOCA3MDQgMTA5OFQ4MjcgMTAzM1Q5MDAgOTE5VDkyNCA3NTJWMEg3OTNaTTQ1OSAxMjdRNTIwIDEyNyA1NzIgMTQ2VDY2MiAyMDNUNzIxIDMwMFQ3NDMgNDM4VjUzN0w2MDAgNTMwUTUxMCA1MjYgNDQ5IDUxMFQzNTIgNDY2VDI5OSAzOTdUMjgzIDMwNVEyODMgMjEzIDMzMSAxNzBUNDU5IDEyN1pNOTM0IDEyNDFIODE0UTc3OQorMTI2OSA3MzggMTMxMFQ2NTkgMTM5NlQ1ODkgMTQ4MFQ1NDEgMTU0OFYxNTY5SDc2MFE3NzYgMTUzNSA3OTcgMTQ5NVQ4NDIgMTQxNFQ4ODkgMTMzNVQ5MzQgMTI2OFYxMjQxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTsiIGdseXBoLW5hbWU9ImFhY3V0ZSIgaG9yaXotYWR2LXg9IjEwODciIGQ9Ik03OTMgMEw3NTYgMTUySDc0OFE3MTUgMTA3IDY4MiA3NVQ2MTAgMjFUNTIzIC0xMFQ0MTIgLTIwUTM0MyAtMjAgMjg1IC0xVDE4NSA1OVQxMTggMTYxVDk0IDMwN1E5NCA0NzEgMjA5IDU1OVQ1NjEgNjU1TDc0NSA2NjJWNzMxUTc0NSA3OTggNzMxIDg0M1Q2ODkgOTE1VDYyMSA5NTVUNTI4IDk2N1E0NDUgOTY3CiszNzQgOTQzVDIzNiA4ODVMMTcyIDEwMjJRMjQ2IDEwNjIgMzM3IDEwOTBUNTI4IDExMThRNjMwIDExMTggNzA0IDEwOThUODI3IDEwMzNUOTAwIDkxOVQ5MjQgNzUyVjBINzkzWk00NTkgMTI3UTUyMCAxMjcgNTcyIDE0NlQ2NjIgMjAzVDcyMSAzMDBUNzQzIDQzOFY1MzdMNjAwIDUzMFE1MTAgNTI2IDQ0OSA1MTBUMzUyIDQ2NlQyOTkgMzk3VDI4MyAzMDVRMjgzIDIxMyAzMzEgMTcwVDQ1OSAxMjdaTTQ0NiAxMjY4UTQ2OCAxMjk3Cis0OTEgMTMzNVQ1MzggMTQxM1Q1ODMgMTQ5NFQ2MjAgMTU2OUg4MzlWMTU0OFE4MjMgMTUyMSA3OTIgMTQ4MVQ3MjIgMTM5NlQ2NDMgMTMxMVQ1NjcgMTI0MUg0NDZWMTI2OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTI7IiBnbHlwaC1uYW1lPSJhY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjEwODciIGQ9Ik03OTMgMEw3NTYgMTUySDc0OFE3MTUgMTA3IDY4MiA3NVQ2MTAgMjFUNTIzIC0xMFQ0MTIgLTIwUTM0MyAtMjAgMjg1IC0xVDE4NSA1OVQxMTggMTYxVDk0IDMwN1E5NCA0NzEgMjA5IDU1OVQ1NjEgNjU1TDc0NSA2NjJWNzMxUTc0NSA3OTggNzMxIDg0M1Q2ODkgOTE1VDYyMSA5NTVUNTI4IDk2N1E0NDUKKzk2NyAzNzQgOTQzVDIzNiA4ODVMMTcyIDEwMjJRMjQ2IDEwNjIgMzM3IDEwOTBUNTI4IDExMThRNjMwIDExMTggNzA0IDEwOThUODI3IDEwMzNUOTAwIDkxOVQ5MjQgNzUyVjBINzkzWk00NTkgMTI3UTUyMCAxMjcgNTcyIDE0NlQ2NjIgMjAzVDcyMSAzMDBUNzQzIDQzOFY1MzdMNjAwIDUzMFE1MTAgNTI2IDQ0OSA1MTBUMzUyIDQ2NlQyOTkgMzk3VDI4MyAzMDVRMjgzIDIxMyAzMzEgMTcwVDQ1OSAxMjdaTTExNDggMTI0MUgxMDI3UTk3NgorMTI3NSA5MjIgMTMyM1Q4MTYgMTQyN1E3NjIgMTM3MiA3MDkgMTMyNFQ2MDUgMTI0MUg0ODRWMTI2OFE1MTAgMTI5NyA1NDQgMTMzNVQ2MTEgMTQxM1Q2NzQgMTQ5NFQ3MjAgMTU2OUg5MTJROTI4IDE1MzUgOTU3IDE0OTVUMTAyMCAxNDE0VDEwODggMTMzNVQxMTQ4IDEyNjhWMTI0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTM7IiBnbHlwaC1uYW1lPSJhdGlsZGUiIGhvcml6LWFkdi14PSIxMDg3IiBkPSJNNzkzIDBMNzU2IDE1Mkg3NDhRNzE1IDEwNyA2ODIgNzVUNjEwIDIxVDUyMyAtMTBUNDEyIC0yMFEzNDMgLTIwIDI4NSAtMVQxODUgNTlUMTE4IDE2MVQ5NCAzMDdROTQgNDcxIDIwOSA1NTlUNTYxIDY1NUw3NDUgNjYyVjczMVE3NDUgNzk4IDczMSA4NDNUNjg5IDkxNVQ2MjEgOTU1VDUyOCA5NjdRNDQ1IDk2NworMzc0IDk0M1QyMzYgODg1TDE3MiAxMDIyUTI0NiAxMDYyIDMzNyAxMDkwVDUyOCAxMTE4UTYzMCAxMTE4IDcwNCAxMDk4VDgyNyAxMDMzVDkwMCA5MTlUOTI0IDc1MlYwSDc5M1pNNDU5IDEyN1E1MjAgMTI3IDU3MiAxNDZUNjYyIDIwM1Q3MjEgMzAwVDc0MyA0MzhWNTM3TDYwMCA1MzBRNTEwIDUyNiA0NDkgNTEwVDM1MiA0NjZUMjk5IDM5N1QyODMgMzA1UTI4MyAyMTMgMzMxIDE3MFQ0NTkgMTI3Wk05NTUgMTI0M1E5MTUgMTI0MworODc2IDEyNjBUNzk4IDEyOTlUNzI1IDEzMzhUNjU4IDEzNTZRNjEzIDEzNTYgNTg5IDEzMzBUNTUxIDEyNDFINDQ3UTQ1MiAxMzAxIDQ2OCAxMzUwVDUxMSAxNDMzVDU3NSAxNDg2VDY1OCAxNTA1UTcwMCAxNTA1IDc0MCAxNDg4VDgxOSAxNDQ5VDg5MSAxNDExVDk1NSAxMzkzUTEwMDAgMTM5MyAxMDIzIDE0MTlUMTA2MSAxNTA3SDExNjZRMTE2MSAxNDQ3IDExNDUgMTM5OVQxMTAyIDEzMTZUMTAzOCAxMjYyVDk1NSAxMjQzWiIKKy8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTQ7IiBnbHlwaC1uYW1lPSJhZGllcmVzaXMiIGhvcml6LWFkdi14PSIxMDg3IiBkPSJNNzkzIDBMNzU2IDE1Mkg3NDhRNzE1IDEwNyA2ODIgNzVUNjEwIDIxVDUyMyAtMTBUNDEyIC0yMFEzNDMgLTIwIDI4NSAtMVQxODUgNTlUMTE4IDE2MVQ5NCAzMDdROTQgNDcxIDIwOSA1NTlUNTYxIDY1NUw3NDUgNjYyVjczMVE3NDUgNzk4IDczMSA4NDNUNjg5IDkxNVQ2MjEgOTU1VDUyOCA5NjdRNDQ1Cis5NjcgMzc0IDk0M1QyMzYgODg1TDE3MiAxMDIyUTI0NiAxMDYyIDMzNyAxMDkwVDUyOCAxMTE4UTYzMCAxMTE4IDcwNCAxMDk4VDgyNyAxMDMzVDkwMCA5MTlUOTI0IDc1MlYwSDc5M1pNNDU5IDEyN1E1MjAgMTI3IDU3MiAxNDZUNjYyIDIwM1Q3MjEgMzAwVDc0MyA0MzhWNTM3TDYwMCA1MzBRNTEwIDUyNiA0NDkgNTEwVDM1MiA0NjZUMjk5IDM5N1QyODMgMzA1UTI4MyAyMTMgMzMxIDE3MFQ0NTkgMTI3Wk01MjkgMTM5NVE1MjkKKzE0NDkgNTU3IDE0NzNUNjI1IDE0OTdRNjY0IDE0OTcgNjkzIDE0NzNUNzIyIDEzOTVRNzIyIDEzNDIgNjkzIDEzMTdUNjI1IDEyOTJRNTg1IDEyOTIgNTU3IDEzMTdUNTI5IDEzOTVaTTkwNCAxMzk1UTkwNCAxNDQ5IDkzMiAxNDczVDEwMDAgMTQ5N1ExMDE5IDE0OTcgMTAzNiAxNDkxVDEwNjcgMTQ3M1QxMDg4IDE0NDFUMTA5NiAxMzk1UTEwOTYgMTM0MiAxMDY3IDEzMTdUMTAwMCAxMjkyUTk2MCAxMjkyIDkzMiAxMzE3VDkwNAorMTM5NVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTU7IiBnbHlwaC1uYW1lPSJhcmluZyIgaG9yaXotYWR2LXg9IjEwODciIGQ9Ik03OTMgMEw3NTYgMTUySDc0OFE3MTUgMTA3IDY4MiA3NVQ2MTAgMjFUNTIzIC0xMFQ0MTIgLTIwUTM0MyAtMjAgMjg1IC0xVDE4NSA1OVQxMTggMTYxVDk0IDMwN1E5NCA0NzEgMjA5IDU1OVQ1NjEgNjU1TDc0NSA2NjJWNzMxUTc0NSA3OTggNzMxIDg0M1Q2ODkgOTE1VDYyMSA5NTVUNTI4IDk2N1E0NDUgOTY3CiszNzQgOTQzVDIzNiA4ODVMMTcyIDEwMjJRMjQ2IDEwNjIgMzM3IDEwOTBUNTI4IDExMThRNjMwIDExMTggNzA0IDEwOThUODI3IDEwMzNUOTAwIDkxOVQ5MjQgNzUyVjBINzkzWk00NTkgMTI3UTUyMCAxMjcgNTcyIDE0NlQ2NjIgMjAzVDcyMSAzMDBUNzQzIDQzOFY1MzdMNjAwIDUzMFE1MTAgNTI2IDQ0OSA1MTBUMzUyIDQ2NlQyOTkgMzk3VDI4MyAzMDVRMjgzIDIxMyAzMzEgMTcwVDQ1OSAxMjdaTTEwMzkgMTQ1OFExMDM5CisxNDA3IDEwMjIgMTM2N1Q5NzQgMTI5OFQ5MDEgMTI1NlQ4MTAgMTI0MVE3NjAgMTI0MSA3MTkgMTI1NVQ2NDkgMTI5OFQ2MDMgMTM2NVQ1ODcgMTQ1NlE1ODcgMTUwNyA2MDMgMTU0NlQ2NDggMTYxNFQ3MTkgMTY1NlQ4MTAgMTY3MVE4NTggMTY3MSA5MDAgMTY1N1Q5NzMgMTYxNVQxMDIxIDE1NDhUMTAzOSAxNDU4Wk05MjIgMTQ1NlE5MjIgMTUwOSA4OTEgMTUzOVQ4MTAgMTU2OVE3NjAgMTU2OSA3MjkgMTUzOVQ2OTcgMTQ1NlE2OTcKKzE0MDMgNzI1IDEzNzNUODEwIDEzNDNRODU5IDEzNDMgODkwIDEzNzNUOTIyIDE0NTZaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGU2OyIgZ2x5cGgtbmFtZT0iYWUiIGhvcml6LWFkdi14PSIxNzA2IiBkPSJNOTQgMzA3UTk0IDQ3MSAyMDkgNTU5VDU2MSA2NTVMNzQ1IDY2MlY3MzFRNzQ1IDc5OCA3MzEgODQzVDY4OSA5MTVUNjIxIDk1NVQ1MjggOTY3UTQ0NSA5NjcgMzc0IDk0M1QyMzYgODg1TDE3MiAxMDIyUTI0NiAxMDYyIDMzNyAxMDkwVDUyOCAxMTE4UTY1OSAxMTE4IDc0MiAxMDc2VDg2OCA5NDBROTE5IDEwMjUgMTAwMgorMTA3MVQxMTg4IDExMThRMTI4NSAxMTE4IDEzNjIgMTA4M1QxNDkzIDk4M1QxNTc1IDgyOFQxNjA0IDYyN1Y1MTRIOTMyUTkzNyAzMjEgMTAxMCAyMzBUMTIzMSAxMzlRMTI4MCAxMzkgMTMyMiAxNDRUMTQwNCAxNThUMTQ4MCAxODJUMTU1NCAyMTVWNTNRMTUxNSAzNCAxNDc4IDIwVDE0MDEgLTNUMTMxOSAtMTZUMTIyNyAtMjBRMTA4OSAtMjAgOTg4IDM3VDgyNSAyMDlRNzkxIDE1NSA3NTMgMTEzVDY2OCA0MVQ1NjIgLTRUNDMwCistMjBRMzU5IC0yMCAyOTggLTFUMTkxIDU5VDEyMCAxNjFUOTQgMzA3Wk0yODMgMzA1UTI4MyAyMTMgMzMxIDE3MFQ0NTkgMTI3UTUyMCAxMjcgNTcyIDE0NlQ2NjIgMjAzVDcyMSAzMDBUNzQzIDQzOFY1MzdMNjAwIDUzMFE1MTAgNTI2IDQ0OSA1MTBUMzUyIDQ2NlQyOTkgMzk3VDI4MyAzMDVaTTExODQgOTY3UTEwNzQgOTY3IDEwMTEgODg5VDkzNiA2NjJIMTQwN1ExNDA3IDczMCAxMzk0IDc4NlQxMzU0IDg4M1QxMjg0IDk0NVQxMTg0Cis5NjdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGU3OyIgZ2x5cGgtbmFtZT0iY2NlZGlsbGEiIGhvcml6LWFkdi14PSI5NDgiIGQ9Ik01OTQgLTIwUTQ5MyAtMjAgNDA1IDExVDI1MiAxMTFUMTUwIDI4NlQxMTMgNTQzUTExMyA3MDAgMTUxIDgwOVQyNTUgOTg3VDQxMSAxMDg3VDYwMiAxMTE4UTY4MCAxMTE4IDc1NCAxMTAxVDg3OSAxMDU5TDgyNSA5MDVRODAyIDkxNSA3NzQgOTI0VDcxNiA5NDFUNjU3IDk1M1Q2MDIgOTU4UTQ0NSA5NTggMzczCis4NThUMzAxIDU0NVEzMDEgMzM0IDM3MyAyMzdUNTk0IDEzOVE2NzUgMTM5IDc0MCAxNTdUODYwIDIwMVYzOVE4MDYgMTAgNzQ1IC01VDU5NCAtMjBaTTczMCAtMjg3UTczMCAtMzg0IDY2MCAtNDM4VDQzOSAtNDkyUTQxNyAtNDkyIDM5NSAtNDg5VDM1NyAtNDgzVi0zNzVRMzcyIC0zNzggMzk2IC0zNzlUNDM3IC0zODFRNTA4IC0zODEgNTQ4IC0zNjBUNTg4IC0yODlRNTg4IC0yNjUgNTc1IC0yNDhUNTM5IC0yMTdUNDg1IC0xOTVUNDE2CistMTc2TDUwNiAwSDYyN0w1NzAgLTExNVE2MDQgLTEyMyA2MzMgLTEzNlQ2ODMgLTE2OVQ3MTcgLTIxOVQ3MzAgLTI4N1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTg7IiBnbHlwaC1uYW1lPSJlZ3JhdmUiIGhvcml6LWFkdi14PSIxMDk2IiBkPSJNNjA4IC0yMFE0OTggLTIwIDQwNyAxN1QyNTEgMTI1VDE0OSAzMDFUMTEzIDU0MVExMTMgNjc3IDE0NiA3ODRUMjM5IDk2NVQzODIgMTA3OVQ1NjcgMTExOFE2NjYgMTExOCA3NDUgMTA4M1Q4NzkgOTgzVDk2MyA4MjhUOTkzIDYyN1Y1MTRIMzAxUTMwNiAzMjEgMzgyIDIzMFQ2MTAgMTM5UTY2MSAxMzkgNzA0CisxNDRUNzg4IDE1OFQ4NjcgMTgyVDk0NCAyMTVWNTNROTA0IDM0IDg2NiAyMFQ3ODcgLTNUNzAzIC0xNlQ2MDggLTIwWk01NjMgOTY3UTQ0OSA5NjcgMzgzIDg4OVQzMDUgNjYySDc5N1E3OTcgNzMwIDc4NCA3ODZUNzQyIDg4M1Q2NjkgOTQ1VDU2MyA5NjdaTTkzNCAxMjQxSDgxNFE3NzkgMTI2OSA3MzggMTMxMFQ2NTkgMTM5NlQ1ODkgMTQ4MFQ1NDEgMTU0OFYxNTY5SDc2MFE3NzYgMTUzNSA3OTcgMTQ5NVQ4NDIgMTQxNFQ4ODkKKzEzMzVUOTM0IDEyNjhWMTI0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTk7IiBnbHlwaC1uYW1lPSJlYWN1dGUiIGhvcml6LWFkdi14PSIxMDk2IiBkPSJNNjA4IC0yMFE0OTggLTIwIDQwNyAxN1QyNTEgMTI1VDE0OSAzMDFUMTEzIDU0MVExMTMgNjc3IDE0NiA3ODRUMjM5IDk2NVQzODIgMTA3OVQ1NjcgMTExOFE2NjYgMTExOCA3NDUgMTA4M1Q4NzkgOTgzVDk2MyA4MjhUOTkzIDYyN1Y1MTRIMzAxUTMwNiAzMjEgMzgyIDIzMFQ2MTAgMTM5UTY2MSAxMzkgNzA0CisxNDRUNzg4IDE1OFQ4NjcgMTgyVDk0NCAyMTVWNTNROTA0IDM0IDg2NiAyMFQ3ODcgLTNUNzAzIC0xNlQ2MDggLTIwWk01NjMgOTY3UTQ0OSA5NjcgMzgzIDg4OVQzMDUgNjYySDc5N1E3OTcgNzMwIDc4NCA3ODZUNzQyIDg4M1Q2NjkgOTQ1VDU2MyA5NjdaTTQ3NSAxMjY4UTQ5NyAxMjk3IDUyMCAxMzM1VDU2NyAxNDEzVDYxMiAxNDk0VDY0OSAxNTY5SDg2OFYxNTQ4UTg1MiAxNTIxIDgyMSAxNDgxVDc1MSAxMzk2VDY3MiAxMzExVDU5NgorMTI0MUg0NzVWMTI2OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZWE7IiBnbHlwaC1uYW1lPSJlY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjEwOTYiIGQ9Ik02MDggLTIwUTQ5OCAtMjAgNDA3IDE3VDI1MSAxMjVUMTQ5IDMwMVQxMTMgNTQxUTExMyA2NzcgMTQ2IDc4NFQyMzkgOTY1VDM4MiAxMDc5VDU2NyAxMTE4UTY2NiAxMTE4IDc0NSAxMDgzVDg3OSA5ODNUOTYzIDgyOFQ5OTMgNjI3VjUxNEgzMDFRMzA2IDMyMSAzODIgMjMwVDYxMCAxMzlRNjYxIDEzOQorNzA0IDE0NFQ3ODggMTU4VDg2NyAxODJUOTQ0IDIxNVY1M1E5MDQgMzQgODY2IDIwVDc4NyAtM1Q3MDMgLTE2VDYwOCAtMjBaTTU2MyA5NjdRNDQ5IDk2NyAzODMgODg5VDMwNSA2NjJINzk3UTc5NyA3MzAgNzg0IDc4NlQ3NDIgODgzVDY2OSA5NDVUNTYzIDk2N1pNMTE0NCAxMjQxSDEwMjNROTcyIDEyNzUgOTE4IDEzMjNUODEyIDE0MjdRNzU4IDEzNzIgNzA1IDEzMjRUNjAxIDEyNDFINDgwVjEyNjhRNTA2IDEyOTcgNTQwCisxMzM1VDYwNyAxNDEzVDY3MCAxNDk0VDcxNiAxNTY5SDkwOFE5MjQgMTUzNSA5NTMgMTQ5NVQxMDE2IDE0MTRUMTA4NCAxMzM1VDExNDQgMTI2OFYxMjQxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlYjsiIGdseXBoLW5hbWU9ImVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjEwOTYiIGQ9Ik02MDggLTIwUTQ5OCAtMjAgNDA3IDE3VDI1MSAxMjVUMTQ5IDMwMVQxMTMgNTQxUTExMyA2NzcgMTQ2IDc4NFQyMzkgOTY1VDM4MiAxMDc5VDU2NyAxMTE4UTY2NiAxMTE4IDc0NSAxMDgzVDg3OSA5ODNUOTYzIDgyOFQ5OTMgNjI3VjUxNEgzMDFRMzA2IDMyMSAzODIgMjMwVDYxMCAxMzlRNjYxIDEzOQorNzA0IDE0NFQ3ODggMTU4VDg2NyAxODJUOTQ0IDIxNVY1M1E5MDQgMzQgODY2IDIwVDc4NyAtM1Q3MDMgLTE2VDYwOCAtMjBaTTU2MyA5NjdRNDQ5IDk2NyAzODMgODg5VDMwNSA2NjJINzk3UTc5NyA3MzAgNzg0IDc4NlQ3NDIgODgzVDY2OSA5NDVUNTYzIDk2N1pNNTI1IDEzOTVRNTI1IDE0NDkgNTUzIDE0NzNUNjIxIDE0OTdRNjYwIDE0OTcgNjg5IDE0NzNUNzE4IDEzOTVRNzE4IDEzNDIgNjg5IDEzMTdUNjIxIDEyOTJRNTgxCisxMjkyIDU1MyAxMzE3VDUyNSAxMzk1Wk05MDAgMTM5NVE5MDAgMTQ0OSA5MjggMTQ3M1Q5OTYgMTQ5N1ExMDE1IDE0OTcgMTAzMiAxNDkxVDEwNjMgMTQ3M1QxMDg0IDE0NDFUMTA5MiAxMzk1UTEwOTIgMTM0MiAxMDYzIDEzMTdUOTk2IDEyOTJROTU2IDEyOTIgOTI4IDEzMTdUOTAwIDEzOTVaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGVjOyIgZ2x5cGgtbmFtZT0iaWdyYXZlIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMzU2IDBIMTc0VjEwOThIMzU2VjBaTTM1OSAxMjQxSDIzOVEyMDQgMTI2OSAxNjMgMTMxMFQ4NCAxMzk2VDE0IDE0ODBULTM0IDE1NDhWMTU2OUgxODVRMjAxIDE1MzUgMjIyIDE0OTVUMjY3IDE0MTRUMzE0IDEzMzVUMzU5IDEyNjhWMTI0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZWQ7IiBnbHlwaC1uYW1lPSJpYWN1dGUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0zNTYgMEgxNzRWMTA5OEgzNTZWMFpNMTg1IDEyNjhRMjA3IDEyOTcgMjMwIDEzMzVUMjc3IDE0MTNUMzIyIDE0OTRUMzU5IDE1NjlINTc4VjE1NDhRNTYyIDE1MjEgNTMxIDE0ODFUNDYxIDEzOTZUMzgyIDEzMTFUMzA2IDEyNDFIMTg1VjEyNjhaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGVlOyIgZ2x5cGgtbmFtZT0iaWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0zNTYgMEgxNzRWMTA5OEgzNTZWMFpNNTk3IDEyNDFINDc2UTQyNSAxMjc1IDM3MSAxMzIzVDI2NSAxNDI3UTIxMSAxMzcyIDE1OCAxMzI0VDU0IDEyNDFILTY3VjEyNjhRLTQxIDEyOTcgLTcgMTMzNVQ2MCAxNDEzVDEyMyAxNDk0VDE2OSAxNTY5SDM2MVEzNzcgMTUzNSA0MDYgMTQ5NVQ0NjkgMTQxNFQ1MzcKKzEzMzVUNTk3IDEyNjhWMTI0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZWY7IiBnbHlwaC1uYW1lPSJpZGllcmVzaXMiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0zNTYgMEgxNzRWMTA5OEgzNTZWMFpNLTE4IDEzOTVRLTE4IDE0NDkgMTAgMTQ3M1Q3OCAxNDk3UTExNyAxNDk3IDE0NiAxNDczVDE3NSAxMzk1UTE3NSAxMzQyIDE0NiAxMzE3VDc4IDEyOTJRMzggMTI5MiAxMCAxMzE3VC0xOCAxMzk1Wk0zNTcgMTM5NVEzNTcgMTQ0OSAzODUgMTQ3M1Q0NTMgMTQ5N1E0NzIKKzE0OTcgNDg5IDE0OTFUNTIwIDE0NzNUNTQxIDE0NDFUNTQ5IDEzOTVRNTQ5IDEzNDIgNTIwIDEzMTdUNDUzIDEyOTJRNDEzIDEyOTIgMzg1IDEzMTdUMzU3IDEzOTVaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwOyIgZ2x5cGgtbmFtZT0iZXRoIiBob3Jpei1hZHYteD0iMTE4MiIgZD0iTTEwNjkgNTczUTEwNjkgNDMxIDEwMzYgMzIxVDk0MCAxMzVUNzg4IDIwVDU4OCAtMjBRNDg0IC0yMCAzOTcgMTNUMjQ2IDEwOVQxNDcgMjY1VDExMSA0NzdRMTExIDU5NiAxNDIgNjg4VDIzMyA4NDNUMzc2IDkzOFQ1NjUgOTcxUTY2NyA5NzEgNzQ0IDk0MlQ4NjQgODUyTDg3MiA4NTZRODQxIDk3NCA3ODEgMTA3MFQ2MzEKKzEyNDdMMzc1IDEwOTRMMzAxIDEyMDhMNTE4IDEzMzlRNDc4IDEzNjcgNDM2IDEzOTRUMzQ2IDE0NDhMNDE2IDE1NzFRNDgxIDE1MzkgNTQyIDE1MDNUNjYyIDE0MjNMODg5IDE1NjFMOTYzIDE0NDhMNzY4IDEzMzFRODM1IDEyNjYgODkwIDExODhUOTg1IDEwMTdUMTA0NyA4MTNUMTA2OSA1NzNaTTg4MSA1MjZRODgxIDU4MiA4NjQgNjM1VDgxMiA3MzBUNzIyIDc5NlQ1OTIgODIxUTUxNSA4MjEgNDYxIDc5OFQzNzEgNzMxVDMyMAorNjIyVDMwMyA0NzFRMzAzIDM5NSAzMTkgMzMzVDM3MSAyMjVUNDYxIDE1NlQ1OTIgMTMxUTc0NiAxMzEgODEzIDIzMFQ4ODEgNTI2WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTsiIGdseXBoLW5hbWU9Im50aWxkZSIgaG9yaXotYWR2LXg9IjEyMDYiIGQ9Ik04NjAgMFY3MDdRODYwIDgzNyA4MDggOTAyVDY0MyA5NjdRNTYyIDk2NyA1MDcgOTQxVDQxOSA4NjRUMzcxIDczOVQzNTYgNTY5VjBIMTc0VjEwOThIMzIyTDM0OCA5NTBIMzU4UTM4MyA5OTMgNDE3IDEwMjRUNDkzIDEwNzdUNTgwIDExMDhUNjc0IDExMThRODU3IDExMTggOTQ5IDEwMjNUMTA0MiA3MTdWMEg4NjBaTTEwMTUKKzEyNDNROTc1IDEyNDMgOTM2IDEyNjBUODU4IDEyOTlUNzg1IDEzMzhUNzE4IDEzNTZRNjczIDEzNTYgNjQ5IDEzMzBUNjExIDEyNDFINTA3UTUxMiAxMzAxIDUyOCAxMzUwVDU3MSAxNDMzVDYzNSAxNDg2VDcxOCAxNTA1UTc2MCAxNTA1IDgwMCAxNDg4VDg3OSAxNDQ5VDk1MSAxNDExVDEwMTUgMTM5M1ExMDYwIDEzOTMgMTA4MyAxNDE5VDExMjEgMTUwN0gxMjI2UTEyMjEgMTQ0NyAxMjA1IDEzOTlUMTE2MiAxMzE2VDEwOTgKKzEyNjJUMTAxNSAxMjQzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMjsiIGdseXBoLW5hbWU9Im9ncmF2ZSIgaG9yaXotYWR2LXg9IjExODIiIGQ9Ik0xMDY5IDU1MVExMDY5IDQxNCAxMDM2IDMwOFQ5NDAgMTI5VDc4OCAxOFQ1ODggLTIwUTQ4NSAtMjAgMzk4IDE4VDI0OCAxMjhUMTQ5IDMwN1QxMTMgNTUxUTExMyA2ODcgMTQ2IDc5MlQyNDIgOTcwVDM5MyAxMDgwVDU5NCAxMTE4UTY5NyAxMTE4IDc4NCAxMDgxVDkzNCA5NzFUMTAzMyA3OTNUMTA2OSA1NTFaTTMwMQorNTUxUTMwMSAzNDIgMzY5IDIzN1Q1OTIgMTMxUTc0NiAxMzEgODEzIDIzNlQ4ODEgNTUxUTg4MSA3NjAgODEzIDg2M1Q1OTAgOTY3UTQzNiA5NjcgMzY5IDg2NFQzMDEgNTUxWk0xMDAyIDEyNDFIODgyUTg0NyAxMjY5IDgwNiAxMzEwVDcyNyAxMzk2VDY1NyAxNDgwVDYwOSAxNTQ4VjE1NjlIODI4UTg0NCAxNTM1IDg2NSAxNDk1VDkxMCAxNDE0VDk1NyAxMzM1VDEwMDIgMTI2OFYxMjQxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMzsiIGdseXBoLW5hbWU9Im9hY3V0ZSIgaG9yaXotYWR2LXg9IjExODIiIGQ9Ik0xMDY5IDU1MVExMDY5IDQxNCAxMDM2IDMwOFQ5NDAgMTI5VDc4OCAxOFQ1ODggLTIwUTQ4NSAtMjAgMzk4IDE4VDI0OCAxMjhUMTQ5IDMwN1QxMTMgNTUxUTExMyA2ODcgMTQ2IDc5MlQyNDIgOTcwVDM5MyAxMDgwVDU5NCAxMTE4UTY5NyAxMTE4IDc4NCAxMDgxVDkzNCA5NzFUMTAzMyA3OTNUMTA2OSA1NTFaTTMwMQorNTUxUTMwMSAzNDIgMzY5IDIzN1Q1OTIgMTMxUTc0NiAxMzEgODEzIDIzNlQ4ODEgNTUxUTg4MSA3NjAgODEzIDg2M1Q1OTAgOTY3UTQzNiA5NjcgMzY5IDg2NFQzMDEgNTUxWk00NzMgMTI2OFE0OTUgMTI5NyA1MTggMTMzNVQ1NjUgMTQxM1Q2MTAgMTQ5NFQ2NDcgMTU2OUg4NjZWMTU0OFE4NTAgMTUyMSA4MTkgMTQ4MVQ3NDkgMTM5NlQ2NzAgMTMxMVQ1OTQgMTI0MUg0NzNWMTI2OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjQ7IiBnbHlwaC1uYW1lPSJvY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjExODIiIGQ9Ik0xMDY5IDU1MVExMDY5IDQxNCAxMDM2IDMwOFQ5NDAgMTI5VDc4OCAxOFQ1ODggLTIwUTQ4NSAtMjAgMzk4IDE4VDI0OCAxMjhUMTQ5IDMwN1QxMTMgNTUxUTExMyA2ODcgMTQ2IDc5MlQyNDIgOTcwVDM5MyAxMDgwVDU5NCAxMTE4UTY5NyAxMTE4IDc4NCAxMDgxVDkzNCA5NzFUMTAzMyA3OTNUMTA2OQorNTUxWk0zMDEgNTUxUTMwMSAzNDIgMzY5IDIzN1Q1OTIgMTMxUTc0NiAxMzEgODEzIDIzNlQ4ODEgNTUxUTg4MSA3NjAgODEzIDg2M1Q1OTAgOTY3UTQzNiA5NjcgMzY5IDg2NFQzMDEgNTUxWk0xMTczIDEyNDFIMTA1MlExMDAxIDEyNzUgOTQ3IDEzMjNUODQxIDE0MjdRNzg3IDEzNzIgNzM0IDEzMjRUNjMwIDEyNDFINTA5VjEyNjhRNTM1IDEyOTcgNTY5IDEzMzVUNjM2IDE0MTNUNjk5IDE0OTRUNzQ1IDE1NjlIOTM3UTk1MworMTUzNSA5ODIgMTQ5NVQxMDQ1IDE0MTRUMTExMyAxMzM1VDExNzMgMTI2OFYxMjQxWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmNTsiIGdseXBoLW5hbWU9Im90aWxkZSIgaG9yaXotYWR2LXg9IjExODIiIGQ9Ik0xMDY5IDU1MVExMDY5IDQxNCAxMDM2IDMwOFQ5NDAgMTI5VDc4OCAxOFQ1ODggLTIwUTQ4NSAtMjAgMzk4IDE4VDI0OCAxMjhUMTQ5IDMwN1QxMTMgNTUxUTExMyA2ODcgMTQ2IDc5MlQyNDIgOTcwVDM5MyAxMDgwVDU5NCAxMTE4UTY5NyAxMTE4IDc4NCAxMDgxVDkzNCA5NzFUMTAzMyA3OTNUMTA2OSA1NTFaTTMwMQorNTUxUTMwMSAzNDIgMzY5IDIzN1Q1OTIgMTMxUTc0NiAxMzEgODEzIDIzNlQ4ODEgNTUxUTg4MSA3NjAgODEzIDg2M1Q1OTAgOTY3UTQzNiA5NjcgMzY5IDg2NFQzMDEgNTUxWk05OTIgMTI0M1E5NTIgMTI0MyA5MTMgMTI2MFQ4MzUgMTI5OVQ3NjIgMTMzOFQ2OTUgMTM1NlE2NTAgMTM1NiA2MjYgMTMzMFQ1ODggMTI0MUg0ODRRNDg5IDEzMDEgNTA1IDEzNTBUNTQ4IDE0MzNUNjEyIDE0ODZUNjk1IDE1MDVRNzM3IDE1MDUgNzc3CisxNDg4VDg1NiAxNDQ5VDkyOCAxNDExVDk5MiAxMzkzUTEwMzcgMTM5MyAxMDYwIDE0MTlUMTA5OCAxNTA3SDEyMDNRMTE5OCAxNDQ3IDExODIgMTM5OVQxMTM5IDEzMTZUMTA3NSAxMjYyVDk5MiAxMjQzWiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmNjsiIGdseXBoLW5hbWU9Im9kaWVyZXNpcyIgaG9yaXotYWR2LXg9IjExODIiIGQ9Ik0xMDY5IDU1MVExMDY5IDQxNCAxMDM2IDMwOFQ5NDAgMTI5VDc4OCAxOFQ1ODggLTIwUTQ4NSAtMjAgMzk4IDE4VDI0OCAxMjhUMTQ5IDMwN1QxMTMgNTUxUTExMyA2ODcgMTQ2IDc5MlQyNDIgOTcwVDM5MyAxMDgwVDU5NCAxMTE4UTY5NyAxMTE4IDc4NCAxMDgxVDkzNCA5NzFUMTAzMyA3OTNUMTA2OQorNTUxWk0zMDEgNTUxUTMwMSAzNDIgMzY5IDIzN1Q1OTIgMTMxUTc0NiAxMzEgODEzIDIzNlQ4ODEgNTUxUTg4MSA3NjAgODEzIDg2M1Q1OTAgOTY3UTQzNiA5NjcgMzY5IDg2NFQzMDEgNTUxWk01NTYgMTM5NVE1NTYgMTQ0OSA1ODQgMTQ3M1Q2NTIgMTQ5N1E2OTEgMTQ5NyA3MjAgMTQ3M1Q3NDkgMTM5NVE3NDkgMTM0MiA3MjAgMTMxN1Q2NTIgMTI5MlE2MTIgMTI5MiA1ODQgMTMxN1Q1NTYgMTM5NVpNOTMxIDEzOTVROTMxCisxNDQ5IDk1OSAxNDczVDEwMjcgMTQ5N1ExMDQ2IDE0OTcgMTA2MyAxNDkxVDEwOTQgMTQ3M1QxMTE1IDE0NDFUMTEyMyAxMzk1UTExMjMgMTM0MiAxMDk0IDEzMTdUMTAyNyAxMjkyUTk4NyAxMjkyIDk1OSAxMzE3VDkzMSAxMzk1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmNzsiIGdseXBoLW5hbWU9ImRpdmlkZSIgaG9yaXotYWR2LXg9IjExMjgiIGQ9Ik0xMDIgNjQ3Vjc5N0gxMDI2VjY0N0gxMDJaTTQ0OSAzNzNRNDQ5IDQwOCA0NTggNDMxVDQ4MiA0NzBUNTE4IDQ5MVQ1NjMgNDk4UTU4NiA0OTggNjA3IDQ5MlQ2NDQgNDcwVDY2OSA0MzJUNjc4IDM3M1E2NzggMzQwIDY2OSAzMTdUNjQ0IDI3OFQ2MDcgMjU1VDU2MyAyNDhRNTM5IDI0OCA1MTkgMjU1VDQ4MworMjc3VDQ1OCAzMTZUNDQ5IDM3M1pNNDQ5IDEwNzFRNDQ5IDExMDYgNDU4IDExMjlUNDgyIDExNjhUNTE4IDExODlUNTYzIDExOTZRNTg2IDExOTYgNjA3IDExOTBUNjQ0IDExNjhUNjY5IDExMzBUNjc4IDEwNzFRNjc4IDEwMzggNjY5IDEwMTVUNjQ0IDk3NlQ2MDcgOTUzVDU2MyA5NDZRNTM5IDk0NiA1MTkgOTUzVDQ4MyA5NzVUNDU4IDEwMTRUNDQ5IDEwNzFaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGY4OyIgZ2x5cGgtbmFtZT0ib3NsYXNoIiBob3Jpei1hZHYteD0iMTE4MiIgZD0iTTEwNzEgNTUxUTEwNzEgNDE0IDEwMzggMzA4VDk0MiAxMjlUNzkwIDE4VDU5MCAtMjBRNDY1IC0yMCAzNjcgMzNMMjk5IC03NkwxNjggLTJMMjQ4IDEyOVExODUgMjAxIDE1MCAzMDdUMTE1IDU1MVExMTUgNjg3IDE0OCA3OTJUMjQ0IDk3MFQzOTUgMTA4MFQ1OTYgMTExOFE2NTkgMTExOCA3MTUgMTEwNFQ4MjEKKzEwNjFMODg5IDExNjlMMTAyMCAxMDk2TDk0MCA5NjdRMTAwMiA4OTQgMTAzNiA3OTBUMTA3MSA1NTFaTTMwMyA1NTFRMzAzIDQ2NyAzMTIgNDAyVDM0NCAyODVMNzQxIDkzMlE3MTIgOTQ5IDY3NSA5NThUNTkyIDk2N1E0MzggOTY3IDM3MSA4NjRUMzAzIDU1MVpNODgzIDU1MVE4ODMgNzEwIDg0NCA4MDlMNDQ2IDE2NFE0NzcgMTQ3IDUxMyAxMzlUNTk0IDEzMVE3NDggMTMxIDgxNSAyMzZUODgzIDU1MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Zjk7IiBnbHlwaC1uYW1lPSJ1Z3JhdmUiIGhvcml6LWFkdi14PSIxMjA2IiBkPSJNODg1IDBMODU4IDE0N0g4NDhRODIzIDEwNCA3ODkgNzNUNzEzIDIxVDYyNiAtMTBUNTMyIC0yMFE0NDEgLTIwIDM3MiAzVDI1NyA3NVQxODggMjAwVDE2NCAzODFWMTA5OEgzNDZWMzkxUTM0NiAyNjEgMzk5IDE5NlQ1NjMgMTMxUTY0NCAxMzEgNjk5IDE1N1Q3ODcgMjMzVDgzNSAzNThUODUwIDUyOFYxMDk4SDEwMzJWMEg4ODVaTTk0OQorMTI0MUg4MjlRNzk0IDEyNjkgNzUzIDEzMTBUNjc0IDEzOTZUNjA0IDE0ODBUNTU2IDE1NDhWMTU2OUg3NzVRNzkxIDE1MzUgODEyIDE0OTVUODU3IDE0MTRUOTA0IDEzMzVUOTQ5IDEyNjhWMTI0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZmE7IiBnbHlwaC1uYW1lPSJ1YWN1dGUiIGhvcml6LWFkdi14PSIxMjA2IiBkPSJNODg1IDBMODU4IDE0N0g4NDhRODIzIDEwNCA3ODkgNzNUNzEzIDIxVDYyNiAtMTBUNTMyIC0yMFE0NDEgLTIwIDM3MiAzVDI1NyA3NVQxODggMjAwVDE2NCAzODFWMTA5OEgzNDZWMzkxUTM0NiAyNjEgMzk5IDE5NlQ1NjMgMTMxUTY0NCAxMzEgNjk5IDE1N1Q3ODcgMjMzVDgzNSAzNThUODUwIDUyOFYxMDk4SDEwMzJWMEg4ODVaTTQ4OQorMTI2OFE1MTEgMTI5NyA1MzQgMTMzNVQ1ODEgMTQxM1Q2MjYgMTQ5NFQ2NjMgMTU2OUg4ODJWMTU0OFE4NjYgMTUyMSA4MzUgMTQ4MVQ3NjUgMTM5NlQ2ODYgMTMxMVQ2MTAgMTI0MUg0ODlWMTI2OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZmI7IiBnbHlwaC1uYW1lPSJ1Y2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjEyMDYiIGQ9Ik04ODUgMEw4NTggMTQ3SDg0OFE4MjMgMTA0IDc4OSA3M1Q3MTMgMjFUNjI2IC0xMFQ1MzIgLTIwUTQ0MSAtMjAgMzcyIDNUMjU3IDc1VDE4OCAyMDBUMTY0IDM4MVYxMDk4SDM0NlYzOTFRMzQ2IDI2MSAzOTkgMTk2VDU2MyAxMzFRNjQ0IDEzMSA2OTkgMTU3VDc4NyAyMzNUODM1IDM1OFQ4NTAgNTI4VjEwOThIMTAzMlYwSDg4NVpNOTMwCisxMjQxSDgwOVE3NTggMTI3NSA3MDQgMTMyM1Q1OTggMTQyN1E1NDQgMTM3MiA0OTEgMTMyNFQzODcgMTI0MUgyNjZWMTI2OFEyOTIgMTI5NyAzMjYgMTMzNVQzOTMgMTQxM1Q0NTYgMTQ5NFQ1MDIgMTU2OUg2OTRRNzEwIDE1MzUgNzM5IDE0OTVUODAyIDE0MTRUODcwIDEzMzVUOTMwIDEyNjhWMTI0MVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZmM7IiBnbHlwaC1uYW1lPSJ1ZGllcmVzaXMiIGhvcml6LWFkdi14PSIxMjA2IiBkPSJNODg1IDBMODU4IDE0N0g4NDhRODIzIDEwNCA3ODkgNzNUNzEzIDIxVDYyNiAtMTBUNTMyIC0yMFE0NDEgLTIwIDM3MiAzVDI1NyA3NVQxODggMjAwVDE2NCAzODFWMTA5OEgzNDZWMzkxUTM0NiAyNjEgMzk5IDE5NlQ1NjMgMTMxUTY0NCAxMzEgNjk5IDE1N1Q3ODcgMjMzVDgzNSAzNThUODUwIDUyOFYxMDk4SDEwMzJWMEg4ODVaTTMwOQorMTM5NVEzMDkgMTQ0OSAzMzcgMTQ3M1Q0MDUgMTQ5N1E0NDQgMTQ5NyA0NzMgMTQ3M1Q1MDIgMTM5NVE1MDIgMTM0MiA0NzMgMTMxN1Q0MDUgMTI5MlEzNjUgMTI5MiAzMzcgMTMxN1QzMDkgMTM5NVpNNjg0IDEzOTVRNjg0IDE0NDkgNzEyIDE0NzNUNzgwIDE0OTdRNzk5IDE0OTcgODE2IDE0OTFUODQ3IDE0NzNUODY4IDE0NDFUODc2IDEzOTVRODc2IDEzNDIgODQ3IDEzMTdUNzgwIDEyOTJRNzQwIDEyOTIgNzEyIDEzMTdUNjg0CisxMzk1WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmZDsiIGdseXBoLW5hbWU9InlhY3V0ZSIgaG9yaXotYWR2LXg9IjEwMDEiIGQ9Ik0xMCAxMDk4SDE5OUw0MTQgNDg1UTQyOCA0NDUgNDQyIDQwMVQ0NjkgMzEzVDQ5MSAyMjhUNTA0IDE1Mkg1MTBRNTE1IDE3NyA1MjYgMjIwVDU1MCAzMTFUNTc4IDQwN1Q2MDQgNDg3TDgwMyAxMDk4SDk5MUw1NTcgLTE0M1E1MjkgLTIyNCA0OTcgLTI4OFQ0MjEgLTM5OFQzMjAgLTQ2N1QxODIgLTQ5MlExMzAKKy00OTIgOTIgLTQ4N1QyNyAtNDc1Vi0zMzBRNDggLTMzNSA4MCAtMzM4VDE0NyAtMzQyUTE5NSAtMzQyIDIzMCAtMzMxVDI5MSAtMjk3VDMzNSAtMjQzVDM2OSAtMTcwTDQyNiAtMTBMMTAgMTA5OFpNNDA3IDEyNjhRNDI5IDEyOTcgNDUyIDEzMzVUNDk5IDE0MTNUNTQ0IDE0OTRUNTgxIDE1NjlIODAwVjE1NDhRNzg0IDE1MjEgNzUzIDE0ODFUNjgzIDEzOTZUNjA0IDEzMTFUNTI4IDEyNDFINDA3VjEyNjhaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGZlOyIgZ2x5cGgtbmFtZT0idGhvcm4iIGhvcml6LWFkdi14PSIxMjAwIiBkPSJNMzU2IDk1MFEzNzkgOTg1IDQwOCAxMDE1VDQ3NSAxMDY4VDU2MiAxMTA0VDY3MCAxMTE4UTc2NCAxMTE4IDg0MSAxMDgyVDk3MiA5NzVUMTA1NyA3OTdUMTA4NyA1NTFRMTA4NyA0MTAgMTA1NyAzMDRUOTczIDEyNVQ4NDEgMTdUNjcwIC0yMFE2MTEgLTIwIDU2MyAtN1Q0NzcgMjdUNDA5IDc4VDM1NiAxMzlIMzQ0UTM0NworMTA1IDM1MCA3NFEzNTIgNDggMzU0IDIxVDM1NiAtMjNWLTQ5MkgxNzRWMTU1NkgzNTZWMTA5OEwzNDggOTUwSDM1NlpNNjM1IDk2N1E1NTkgOTY3IDUwNyA5NDRUNDIyIDg3NFQzNzQgNzU3VDM1NiA1OTJWNTUxUTM1NiA0NTAgMzY5IDM3MlQ0MTUgMjQwVDUwMiAxNTlUNjM3IDEzMVE3NzIgMTMxIDgzNSAyNDBUODk5IDU1M1E4OTkgNzYxIDgzNiA4NjRUNjM1IDk2N1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZmY7IiBnbHlwaC1uYW1lPSJ5ZGllcmVzaXMiIGhvcml6LWFkdi14PSIxMDAxIiBkPSJNMTAgMTA5OEgxOTlMNDE0IDQ4NVE0MjggNDQ1IDQ0MiA0MDFUNDY5IDMxM1Q0OTEgMjI4VDUwNCAxNTJINTEwUTUxNSAxNzcgNTI2IDIyMFQ1NTAgMzExVDU3OCA0MDdUNjA0IDQ4N0w4MDMgMTA5OEg5OTFMNTU3IC0xNDNRNTI5IC0yMjQgNDk3IC0yODhUNDIxIC0zOThUMzIwIC00NjdUMTgyIC00OTJRMTMwCistNDkyIDkyIC00ODdUMjcgLTQ3NVYtMzMwUTQ4IC0zMzUgODAgLTMzOFQxNDcgLTM0MlExOTUgLTM0MiAyMzAgLTMzMVQyOTEgLTI5N1QzMzUgLTI0M1QzNjkgLTE3MEw0MjYgLTEwTDEwIDEwOThaTTQ4NCAxMzk1UTQ4NCAxNDQ5IDUxMiAxNDczVDU4MCAxNDk3UTYxOSAxNDk3IDY0OCAxNDczVDY3NyAxMzk1UTY3NyAxMzQyIDY0OCAxMzE3VDU4MCAxMjkyUTU0MCAxMjkyIDUxMiAxMzE3VDQ4NCAxMzk1Wk04NTkgMTM5NVE4NTkKKzE0NDkgODg3IDE0NzNUOTU1IDE0OTdROTc0IDE0OTcgOTkxIDE0OTFUMTAyMiAxNDczVDEwNDMgMTQ0MVQxMDUxIDEzOTVRMTA1MSAxMzQyIDEwMjIgMTMxN1Q5NTUgMTI5MlE5MTUgMTI5MiA4ODcgMTMxN1Q4NTkgMTM5NVoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxMzsiIGdseXBoLW5hbWU9ImVuZGFzaCIgaG9yaXotYWR2LXg9IjEwMjQiIGQ9Ik04MiA0NjVWNjMzSDk0MlY0NjVIODJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTQ7IiBnbHlwaC1uYW1lPSJlbWRhc2giIGhvcml6LWFkdi14PSIyMDQ4IiBkPSJNODIgNDY1VjYzM0gxOTY2VjQ2NUg4MloiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGdseXBoLW5hbWU9InF1b3RlbGVmdCIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTM3IDk2MUwyMyA5ODNRMzcgMTAzNyA1NiAxMDk4VDk5IDEyMjFUMTQ4IDEzNDRUMTk5IDE0NjJIMzM2UTMyMSAxNDAxIDMwNyAxMzM1VDI3OSAxMjA0VDI1NSAxMDc2VDIzNiA5NjFIMzdaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBnbHlwaC1uYW1lPSJxdW90ZXJpZ2h0IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMzIyIDE0NjJMMzM2IDE0NDBRMzIyIDEzODUgMzAzIDEzMjVUMjYwIDEyMDJUMjExIDEwNzhUMTYwIDk2MUgyM1EzNyAxMDIxIDUxIDEwODdUNzkgMTIxOVQxMDQgMTM0N1QxMjMgMTQ2MkgzMjJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMWE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjUxMiIgZD0iTTM2MiAyMzhMMzc3IDIxNVEzNjMgMTYxIDM0NCAxMDBUMzAxIC0yM1QyNTIgLTE0NlQyMDEgLTI2NEg2M1E3OCAtMjAzIDkyIC0xMzdUMTIwIC02VDE0NSAxMjJUMTY0IDIzOEgzNjJaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMWM7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGxlZnQiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik00MjIgOTYxTDQwOCA5ODNRNDIyIDEwMzcgNDQxIDEwOThUNDg0IDEyMjFUNTMzIDEzNDRUNTg0IDE0NjJINzIxUTcwNiAxNDAxIDY5MiAxMzM1VDY2NCAxMjA0VDY0MCAxMDc2VDYyMSA5NjFINDIyWk0zNyA5NjFMMjMgOTgzUTM3IDEwMzcgNTYgMTA5OFQ5OSAxMjIxVDE0OCAxMzQ0VDE5OSAxNDYySDMzNlEzMjEKKzE0MDEgMzA3IDEzMzVUMjc5IDEyMDRUMjU1IDEwNzZUMjM2IDk2MUgzN1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxZDsiIGdseXBoLW5hbWU9InF1b3RlZGJscmlnaHQiIGhvcml6LWFkdi14PSI3NDMiIGQ9Ik0zMjIgMTQ2MkwzMzYgMTQ0MFEzMjIgMTM4NSAzMDMgMTMyNVQyNjAgMTIwMlQyMTEgMTA3OFQxNjAgOTYxSDIzUTM3IDEwMjEgNTEgMTA4N1Q3OSAxMjE5VDEwNCAxMzQ3VDEyMyAxNDYySDMyMlpNNzA3IDE0NjJMNzIxIDE0NDBRNzA3IDEzODUgNjg4IDEzMjVUNjQ1IDEyMDJUNTk2IDEwNzhUNTQ1Cis5NjFINDA4UTQyMiAxMDIxIDQzNiAxMDg3VDQ2NCAxMjE5VDQ4OSAxMzQ3VDUwOCAxNDYySDcwN1oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxZTsiIGdseXBoLW5hbWU9InF1b3RlZGJsYmFzZSIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTM2MiAyMzhMMzc3IDIxNVEzNjMgMTYxIDM0NCAxMDBUMzAxIC0yM1QyNTIgLTE0NlQyMDEgLTI2NEg2M1E3OCAtMjAzIDkyIC0xMzdUMTIwIC02VDE0NSAxMjJUMTY0IDIzOEgzNjJaTTc0OCAyMzhMNzYyIDIxNVE3NDggMTYxIDcyOSAxMDBUNjg2IC0yM1Q2MzcgLTE0NlQ1ODYgLTI2NEg0NDlRNDYzCistMjAzIDQ3NyAtMTM3VDUwNSAtNlQ1MzAgMTIyVDU0OSAyMzhINzQ4WiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIyOyIgZ2x5cGgtbmFtZT0iYnVsbGV0IiBob3Jpei1hZHYteD0iNzcwIiBkPSJNMTUwIDc0OFExNTAgODE5IDE2OCA4NjlUMjE3IDk1MFQyOTIgOTk2VDM4NSAxMDEwUTQzNCAxMDEwIDQ3NyA5OTZUNTUyIDk1MVQ2MDIgODY5VDYyMSA3NDhRNjIxIDY3OCA2MDMgNjI4VDU1MiA1NDdUNDc3IDUwMFQzODUgNDg1UTMzNSA0ODUgMjkyIDUwMFQyMTggNTQ2VDE2OCA2MjhUMTUwIDc0OFoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbGxlZnQiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik04MiA1NTNMMzkxIDk2N0w1MDggODg5TDI3MCA1NDFMNTA4IDE5M0wzOTEgMTE1TDgyIDUyNlY1NTNaIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwM2E7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xyaWdodCIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTUwOCA1MjZMMTk5IDExNUw4MiAxOTNMMzE5IDU0MUw4MiA4ODlMMTk5IDk2N0w1MDggNTUzVjUyNloiIC8+Cis8L2ZvbnQ+Cis8L2RlZnM+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLnR0ZiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhjZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLXJlZ3VsYXIudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLndvZmYgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tcmVndWxhci53b2ZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjE5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2ZvbnRzL2Ryb2lkLXNhbnMtdjYtbGF0aW4tcmVndWxhci53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLndvZmYyIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9mb250cy9kcm9pZC1zYW5zLXY2LWxhdGluLXJlZ3VsYXIud29mZjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5M2Y3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvZm9udHMvZHJvaWQtc2Fucy12Ni1sYXRpbi1yZWd1bGFyLndvZmYyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2V4cGxvcmVyX2ljb25zLnBuZyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2V4cGxvcmVyX2ljb25zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlkMmZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvZXhwbG9yZXJfaWNvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2Zhdmljb24tMTZ4MTYucG5nIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvZmF2aWNvbi0xNngxNi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiMWE1YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2Zhdmljb24tMTZ4MTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2Zhdmljb24tMzJ4MzIucG5nIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvZmF2aWNvbi0zMngzMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMzE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2Zhdmljb24tMzJ4MzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2Zhdmljb24uaWNvIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2MGJjZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2Zhdmljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2xvZ29fc21hbGwucG5nIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvbG9nb19zbWFsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5NmE2NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL2xvZ29fc21hbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL3BldF9zdG9yZV9hcGkucG5nIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvcGV0X3N0b3JlX2FwaS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmOWNkNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL3BldF9zdG9yZV9hcGkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL3Rocm9iYmVyLmdpZiBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL3Rocm9iYmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM5Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvdGhyb2JiZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL3dvcmRuaWtfYXBpLnBuZyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW1hZ2VzL3dvcmRuaWtfYXBpLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E0ZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbWFnZXMvd29yZG5pa19hcGkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW5kZXguaHRtbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTlhOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTIzIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgIDx0aXRsZT5Td2FnZ2VyIFVJPC90aXRsZT4KKyAgPGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS9wbmciIGhyZWY9ImltYWdlcy9mYXZpY29uLTMyeDMyLnBuZyIgc2l6ZXM9IjMyeDMyIiAvPgorICA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iaW1hZ2VzL2Zhdmljb24tMTZ4MTYucG5nIiBzaXplcz0iMTZ4MTYiIC8+CisgIDxsaW5rIGhyZWY9J2Nzcy90eXBvZ3JhcGh5LmNzcycgbWVkaWE9J3NjcmVlbicgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycvPgorICA8bGluayBocmVmPSdjc3MvcmVzZXQuY3NzJyBtZWRpYT0nc2NyZWVuJyByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJy8+CisgIDxsaW5rIGhyZWY9J2Nzcy9zY3JlZW4uY3NzJyBtZWRpYT0nc2NyZWVuJyByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJy8+CisgIDxsaW5rIGhyZWY9J2Nzcy9yZXNldC5jc3MnIG1lZGlhPSdwcmludCcgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycvPgorICA8bGluayBocmVmPSdjc3MvcHJpbnQuY3NzJyBtZWRpYT0ncHJpbnQnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnLz4KKyAgPHNjcmlwdCBzcmM9J2xpYi9qcXVlcnktMS44LjAubWluLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0nbGliL2pxdWVyeS5zbGlkZXRvLm1pbi5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9J2xpYi9qcXVlcnkud2lnZ2xlLm1pbi5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9J2xpYi9qcXVlcnkuYmEtYmJxLm1pbi5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9J2xpYi9oYW5kbGViYXJzLTIuMC4wLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0nbGliL3VuZGVyc2NvcmUtbWluLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0nbGliL2JhY2tib25lLW1pbi5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9J3N3YWdnZXItdWkuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCc+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSdsaWIvaGlnaGxpZ2h0LjcuMy5wYWNrLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0nbGliL21hcmtlZC5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48L3NjcmlwdD4KKworICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgJChmdW5jdGlvbiAoKSB7CisgICAgIC8qICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvdXJsPShbXiZdKykvKTsKKyAgICAgIGlmICh1cmwgJiYgdXJsLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybFsxXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB1cmwgPSAiaHR0cDovL3BldHN0b3JlLnN3YWdnZXIuaW8vdjIvc3dhZ2dlci5qc29uIjsKKyAgICAgIH0gKi8KKyAgICAgIHZhciBob3N0RGF0YT0ge307CisgICAgICB2YXIgY29uZiA9IGdldENvbmZpZ3VyYXRpb24oaG9zdERhdGEpOworICAgICAgdmFyIHVybCA9ICJodHRwOi8vIiArIGhvc3REYXRhLmJlRnFkbiArICIvc2RjMi9yZXN0L3N3YWdnZXIuanNvbiI7CisgICAgICB3aW5kb3cuc3dhZ2dlclVpID0gbmV3IFN3YWdnZXJVaSh7CisgICAgICAgIHVybDogdXJsLAorICAgICAgICBkb21faWQ6ICJzd2FnZ2VyLXVpLWNvbnRhaW5lciIsCisgICAgICAgIHN1cHBvcnRlZFN1Ym1pdE1ldGhvZHM6IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddLAorICAgICAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbihzd2FnZ2VyQXBpLCBzd2FnZ2VyVWkpeworICAgICAgICAgIGlmKHR5cGVvZiBpbml0T0F1dGggPT0gImZ1bmN0aW9uIikgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIGluaXRPQXV0aCh7CisgICAgICAgICAgICAgIGNsaWVudElkOiAieW91ci1jbGllbnQtaWQiLAorICAgICAgICAgICAgICByZWFsbTogInlvdXItcmVhbG1zIiwKKyAgICAgICAgICAgICAgYXBwTmFtZTogInlvdXItYXBwLW5hbWUiCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgfQorICAgICAgICAgICQoJ3ByZSBjb2RlJykuZWFjaChmdW5jdGlvbihpLCBlKSB7CisgICAgICAgICAgICBobGpzLmhpZ2hsaWdodEJsb2NrKGUpCisgICAgICAgICAgfSk7CisgICAgICAgIH0sCisgICAgICAgIG9uRmFpbHVyZTogZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgIGxvZygiVW5hYmxlIHRvIExvYWQgU3dhZ2dlclVJIik7CisgICAgICAgIH0sCisgICAgICAgIGRvY0V4cGFuc2lvbjogIm5vbmUiLAorICAgICAgICBzb3J0ZXIgOiAiYWxwaGEiCisgICAgICB9KTsKKworICAgICAgZnVuY3Rpb24gYWRkQXBpS2V5QXV0aG9yaXphdGlvbigpIHsKKyAgICAgICAgdmFyIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudCgkKCcjaW5wdXRfYXBpS2V5JylbMF0udmFsdWUpOworICAgICAgICBsb2coImtleTogIiArIGtleSk7CisgICAgICAgIGlmKGtleSAmJiBrZXkudHJpbSgpICE9ICIiKSB7CisgICAgICAgICAgICB2YXIgYXBpS2V5QXV0aCA9IG5ldyBTd2FnZ2VyQ2xpZW50LkFwaUtleUF1dGhvcml6YXRpb24oImFwaV9rZXkiLCBrZXksICJxdWVyeSIpOworICAgICAgICAgICAgd2luZG93LnN3YWdnZXJVaS5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMuYWRkKCJhcGlfa2V5IiwgYXBpS2V5QXV0aCk7CisgICAgICAgICAgICBsb2coImFkZGVkIGtleSAiICsga2V5KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAkKCcjaW5wdXRfYXBpS2V5JykuY2hhbmdlKGFkZEFwaUtleUF1dGhvcml6YXRpb24pOworCisgICAgICAvLyBpZiB5b3UgaGF2ZSBhbiBhcGlLZXkgeW91IHdvdWxkIGxpa2UgdG8gcHJlLXBvcHVsYXRlIG9uIHRoZSBwYWdlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzLi4uCisgICAgICAvKgorICAgICAgICB2YXIgYXBpS2V5ID0gIm15QXBpS2V5WFhYWDEyMzQ1Njc4OSI7CisgICAgICAgICQoJyNpbnB1dF9hcGlLZXknKS52YWwoYXBpS2V5KTsKKyAgICAgICAgYWRkQXBpS2V5QXV0aG9yaXphdGlvbigpOworICAgICAgKi8KKworICAgICAgd2luZG93LnN3YWdnZXJVaS5sb2FkKCk7CisKKyAgICAgIGZ1bmN0aW9uIGxvZygpIHsKKyAgICAgICAgaWYgKCdjb25zb2xlJyBpbiB3aW5kb3cpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGZ1bmN0aW9uIGdldENvbmZpZ3VyYXRpb24oaG9zdERhdGEpeworICAgICAgICAgICQuYWpheCh7CisgICAgICAgICAgICAgIHVybDogIi9zZGMyL3Jlc3QvY29uZmlnbWdyL2dldCIsCisgICAgICAgICAgICAgIHR5cGU6ICJHRVQiLAorICAgICAgICAgICAgICBhc3luYzogZmFsc2UsCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgICAgICAgaWYoIGRhdGEuc3RhdHVzID09IDIwMCApeworICAgICAgICAgICAgICAgIAkgIHZhciBqc29uQ29uZiA9IEpTT04ucGFyc2UoZGF0YS5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgICAgICAgICAgIGhvc3REYXRhLmJlRnFkbiA9IGpzb25Db25mLmJlRnFkbjsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgCSAgaG9zdERhdGEuYmVGcWRuID0gImxvY2FsaG9zdDo4MDgwIjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgfQorICB9KTsKKyAgPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5IGNsYXNzPSJzd2FnZ2VyLXNlY3Rpb24iPgorPGRpdiBpZD0naGVhZGVyJz4KKyAgPGRpdiBjbGFzcz0ic3dhZ2dlci11aS13cmFwIj4KKyAgICA8YSBpZD0ibG9nbyIgaHJlZj0iaHR0cDovL3N3YWdnZXIuaW8iPnN3YWdnZXI8L2E+CisgICAgPGZvcm0gaWQ9J2FwaV9zZWxlY3Rvcic+CisgICAgICA8ZGl2IGNsYXNzPSdpbnB1dCc+PGlucHV0IHBsYWNlaG9sZGVyPSJodHRwOi8vZXhhbXBsZS5jb20vYXBpIiBpZD0iaW5wdXRfYmFzZVVybCIgbmFtZT0iYmFzZVVybCIgdHlwZT0idGV4dCIvPjwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0naW5wdXQnPjxpbnB1dCBwbGFjZWhvbGRlcj0iYXBpX2tleSIgaWQ9ImlucHV0X2FwaUtleSIgbmFtZT0iYXBpS2V5IiB0eXBlPSJ0ZXh0Ii8+PC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSdpbnB1dCc+PGEgaWQ9ImV4cGxvcmUiIGhyZWY9IiMiPkV4cGxvcmU8L2E+PC9kaXY+CisgICAgPC9mb3JtPgorICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGlkPSJtZXNzYWdlLWJhciIgY2xhc3M9InN3YWdnZXItdWktd3JhcCI+Jm5ic3A7PC9kaXY+Cis8ZGl2IGlkPSJzd2FnZ2VyLXVpLWNvbnRhaW5lciIgY2xhc3M9InN3YWdnZXItdWktd3JhcCI+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi9iYWNrYm9uZS1taW4uanMgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi9iYWNrYm9uZS1taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4MmZjZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2JhY2tib25lLW1pbi5qcwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8vIEJhY2tib25lLmpzIDEuMS4yCisKKyhmdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoWyJ1bmRlcnNjb3JlIiwianF1ZXJ5IiwiZXhwb3J0cyJdLGZ1bmN0aW9uKGkscixzKXt0LkJhY2tib25lPWUodCxzLGkscil9KX1lbHNlIGlmKHR5cGVvZiBleHBvcnRzIT09InVuZGVmaW5lZCIpe3ZhciBpPXJlcXVpcmUoInVuZGVyc2NvcmUiKTtlKHQsZXhwb3J0cyxpKX1lbHNle3QuQmFja2JvbmU9ZSh0LHt9LHQuXyx0LmpRdWVyeXx8dC5aZXB0b3x8dC5lbmRlcnx8dC4kKX19KSh0aGlzLGZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzPXQuQmFja2JvbmU7dmFyIG49W107dmFyIGE9bi5wdXNoO3ZhciBvPW4uc2xpY2U7dmFyIGg9bi5zcGxpY2U7ZS5WRVJTSU9OPSIxLjEuMiI7ZS4kPXI7ZS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7dC5CYWNrYm9uZT1zO3JldHVybiB0aGlzfTtlLmVtdWxhdGVIVFRQPWZhbHNlO2UuZW11bGF0ZUpTT049ZmFsc2U7dmFyIHU9ZS5FdmVudHM9e29uOmZ1bmN0aW9uKHQsZSxpKXtpZighYyh0aGlzLCJvbiIsdCxbZSxpXSl8fCFlKXJldHVybiB0aGlzO3RoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSk7dmFyIHI9dGhpcy5fZXZlbnRzW3RdfHwodGhpcy5fZXZlbnRzW3RdPVtdKTtyLnB1c2goe2NhbGxiYWNrOmUsY29udGV4dDppLGN0eDppfHx0aGlzfSk7cmV0dXJuIHRoaXN9LG9uY2U6ZnVuY3Rpb24odCxlLHIpe2lmKCFjKHRoaXMsIm9uY2UiLHQsW2Uscl0pfHwhZSlyZXR1cm4gdGhpczt2YXIgcz10aGlzO3ZhciBuPWkub25jZShmdW5jdGlvbigpe3Mub2ZmKHQsbik7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTtuLl9jYWxsYmFjaz1lO3JldHVybiB0aGlzLm9uKHQsbixyKX0sb2ZmOmZ1bmN0aW9uKHQsZSxyKXt2YXIgcyxuLGEsbyxoLHUsbCxmO2lmKCF0aGlzLl9ldmVudHN8fCFjKHRoaXMsIm9mZiIsdCxbZSxyXSkpcmV0dXJuIHRoaXM7aWYoIXQmJiFlJiYhcil7dGhpcy5fZXZlbnRzPXZvaWQgMDtyZXR1cm4gdGhpc31vPXQ/W3RdOmkua2V5cyh0aGlzLl9ldmVudHMpO2ZvcihoPTAsdT1vLmxlbmd0aDtoPHU7aCsrKXt0PW9baF07aWYoYT10aGlzLl9ldmVudHNbdF0pe3RoaXMuX2V2ZW50c1t0XT1zPVtdO2lmKGV8fHIpe2ZvcihsPTAsZj1hLmxlbmd0aDtsPGY7bCsrKXtuPWFbbF07aWYoZSYmZSE9PW4uY2FsbGJhY2smJmUhPT1uLmNhbGxiYWNrLl9jYWxsYmFja3x8ciYmciE9PW4uY29udGV4dCl7cy5wdXNoKG4pfX19aWYoIXMubGVuZ3RoKWRlbGV0ZSB0aGlzLl9ldmVudHNbdF19fXJldHVybiB0aGlzfSx0cmlnZ2VyOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuIHRoaXM7dmFyIGU9by5jYWxsKGFyZ3VtZW50cywxKTtpZighYyh0aGlzLCJ0cmlnZ2VyIix0LGUpKXJldHVybiB0aGlzO3ZhciBpPXRoaXMuX2V2ZW50c1t0XTt2YXIgcj10aGlzLl9ldmVudHMuYWxsO2lmKGkpZihpLGUpO2lmKHIpZihyLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LHN0b3BMaXN0ZW5pbmc6ZnVuY3Rpb24odCxlLHIpe3ZhciBzPXRoaXMuX2xpc3RlbmluZ1RvO2lmKCFzKXJldHVybiB0aGlzO3ZhciBuPSFlJiYhcjtpZighciYmdHlwZW9mIGU9PT0ib2JqZWN0IilyPXRoaXM7aWYodCkocz17fSlbdC5fbGlzdGVuSWRdPXQ7Zm9yKHZhciBhIGluIHMpe3Q9c1thXTt0Lm9mZihlLHIsdGhpcyk7aWYobnx8aS5pc0VtcHR5KHQuX2V2ZW50cykpZGVsZXRlIHRoaXMuX2xpc3RlbmluZ1RvW2FdfXJldHVybiB0aGlzfX07dmFyIGw9L1xzKy87dmFyIGM9ZnVuY3Rpb24odCxlLGkscil7aWYoIWkpcmV0dXJuIHRydWU7aWYodHlwZW9mIGk9PT0ib2JqZWN0Iil7Zm9yKHZhciBzIGluIGkpe3RbZV0uYXBwbHkodCxbcyxpW3NdXS5jb25jYXQocikpfXJldHVybiBmYWxzZX1pZihsLnRlc3QoaSkpe3ZhciBuPWkuc3BsaXQobCk7Zm9yKHZhciBhPTAsbz1uLmxlbmd0aDthPG87YSsrKXt0W2VdLmFwcGx5KHQsW25bYV1dLmNvbmNhdChyKSl9cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfTt2YXIgZj1mdW5jdGlvbih0LGUpe3ZhciBpLHI9LTEscz10Lmxlbmd0aCxuPWVbMF0sYT1lWzFdLG89ZVsyXTtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDp3aGlsZSgrK3I8cykoaT10W3JdKS5jYWxsYmFjay5jYWxsKGkuY3R4KTtyZXR1cm47Y2FzZSAxOndoaWxlKCsrcjxzKShpPXRbcl0pLmNhbGxiYWNrLmNhbGwoaS5jdHgsbik7cmV0dXJuO2Nhc2UgMjp3aGlsZSgrK3I8cykoaT10W3JdKS5jYWxsYmFjay5jYWxsKGkuY3R4LG4sYSk7cmV0dXJuO2Nhc2UgMzp3aGlsZSgrK3I8cykoaT10W3JdKS5jYWxsYmFjay5jYWxsKGkuY3R4LG4sYSxvKTtyZXR1cm47ZGVmYXVsdDp3aGlsZSgrK3I8cykoaT10W3JdKS5jYWxsYmFjay5hcHBseShpLmN0eCxlKTtyZXR1cm59fTt2YXIgZD17bGlzdGVuVG86Im9uIixsaXN0ZW5Ub09uY2U6Im9uY2UifTtpLmVhY2goZCxmdW5jdGlvbih0LGUpe3VbZV09ZnVuY3Rpb24oZSxyLHMpe3ZhciBuPXRoaXMuX2xpc3RlbmluZ1RvfHwodGhpcy5fbGlzdGVuaW5nVG89e30pO3ZhciBhPWUuX2xpc3RlbklkfHwoZS5fbGlzdGVuSWQ9aS51bmlxdWVJZCgibCIpKTtuW2FdPWU7aWYoIXMmJnR5cGVvZiByPT09Im9iamVjdCIpcz10aGlzO2VbdF0ocixzLHRoaXMpO3JldHVybiB0aGlzfX0pO3UuYmluZD11Lm9uO3UudW5iaW5kPXUub2ZmO2kuZXh0ZW5kKGUsdSk7dmFyIHA9ZS5Nb2RlbD1mdW5jdGlvbih0LGUpe3ZhciByPXR8fHt9O2V8fChlPXt9KTt0aGlzLmNpZD1pLnVuaXF1ZUlkKCJjIik7dGhpcy5hdHRyaWJ1dGVzPXt9O2lmKGUuY29sbGVjdGlvbil0aGlzLmNvbGxlY3Rpb249ZS5jb2xsZWN0aW9uO2lmKGUucGFyc2Upcj10aGlzLnBhcnNlKHIsZSl8fHt9O3I9aS5kZWZhdWx0cyh7fSxyLGkucmVzdWx0KHRoaXMsImRlZmF1bHRzIikpO3RoaXMuc2V0KHIsZSk7dGhpcy5jaGFuZ2VkPXt9O3RoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2kuZXh0ZW5kKHAucHJvdG90eXBlLHUse2NoYW5nZWQ6bnVsbCx2YWxpZGF0aW9uRXJyb3I6bnVsbCxpZEF0dHJpYnV0ZToiaWQiLGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHRvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gaS5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpfSxzeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGUuc3luYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdfSxlc2NhcGU6ZnVuY3Rpb24odCl7cmV0dXJuIGkuZXNjYXBlKHRoaXMuZ2V0KHQpKX0saGFzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldCh0KSE9bnVsbH0sc2V0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgcyxuLGEsbyxoLHUsbCxjO2lmKHQ9PW51bGwpcmV0dXJuIHRoaXM7aWYodHlwZW9mIHQ9PT0ib2JqZWN0Iil7bj10O3I9ZX1lbHNleyhuPXt9KVt0XT1lfXJ8fChyPXt9KTtpZighdGhpcy5fdmFsaWRhdGUobixyKSlyZXR1cm4gZmFsc2U7YT1yLnVuc2V0O2g9ci5zaWxlbnQ7bz1bXTt1PXRoaXMuX2NoYW5naW5nO3RoaXMuX2NoYW5naW5nPXRydWU7aWYoIXUpe3RoaXMuX3ByZXZpb3VzQXR0cmlidXRlcz1pLmNsb25lKHRoaXMuYXR0cmlidXRlcyk7dGhpcy5jaGFuZ2VkPXt9fWM9dGhpcy5hdHRyaWJ1dGVzLGw9dGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzO2lmKHRoaXMuaWRBdHRyaWJ1dGUgaW4gbil0aGlzLmlkPW5bdGhpcy5pZEF0dHJpYnV0ZV07Zm9yKHMgaW4gbil7ZT1uW3NdO2lmKCFpLmlzRXF1YWwoY1tzXSxlKSlvLnB1c2gocyk7aWYoIWkuaXNFcXVhbChsW3NdLGUpKXt0aGlzLmNoYW5nZWRbc109ZX1lbHNle2RlbGV0ZSB0aGlzLmNoYW5nZWRbc119YT9kZWxldGUgY1tzXTpjW3NdPWV9aWYoIWgpe2lmKG8ubGVuZ3RoKXRoaXMuX3BlbmRpbmc9cjtmb3IodmFyIGY9MCxkPW8ubGVuZ3RoO2Y8ZDtmKyspe3RoaXMudHJpZ2dlcigiY2hhbmdlOiIrb1tmXSx0aGlzLGNbb1tmXV0scil9fWlmKHUpcmV0dXJuIHRoaXM7aWYoIWgpe3doaWxlKHRoaXMuX3BlbmRpbmcpe3I9dGhpcy5fcGVuZGluZzt0aGlzLl9wZW5kaW5nPWZhbHNlO3RoaXMudHJpZ2dlcigiY2hhbmdlIix0aGlzLHIpfX10aGlzLl9wZW5kaW5nPWZhbHNlO3RoaXMuX2NoYW5naW5nPWZhbHNlO3JldHVybiB0aGlzfSx1bnNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNldCh0LHZvaWQgMCxpLmV4dGVuZCh7fSxlLHt1bnNldDp0cnVlfSkpfSxjbGVhcjpmdW5jdGlvbih0KXt2YXIgZT17fTtmb3IodmFyIHIgaW4gdGhpcy5hdHRyaWJ1dGVzKWVbcl09dm9pZCAwO3JldHVybiB0aGlzLnNldChlLGkuZXh0ZW5kKHt9LHQse3Vuc2V0OnRydWV9KSl9LGhhc0NoYW5nZWQ6ZnVuY3Rpb24odCl7aWYodD09bnVsbClyZXR1cm4haS5pc0VtcHR5KHRoaXMuY2hhbmdlZCk7cmV0dXJuIGkuaGFzKHRoaXMuY2hhbmdlZCx0KX0sY2hhbmdlZEF0dHJpYnV0ZXM6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIHRoaXMuaGFzQ2hhbmdlZCgpP2kuY2xvbmUodGhpcy5jaGFuZ2VkKTpmYWxzZTt2YXIgZSxyPWZhbHNlO3ZhciBzPXRoaXMuX2NoYW5naW5nP3RoaXMuX3ByZXZpb3VzQXR0cmlidXRlczp0aGlzLmF0dHJpYnV0ZXM7Zm9yKHZhciBuIGluIHQpe2lmKGkuaXNFcXVhbChzW25dLGU9dFtuXSkpY29udGludWU7KHJ8fChyPXt9KSlbbl09ZX1yZXR1cm4gcn0scHJldmlvdXM6ZnVuY3Rpb24odCl7aWYodD09bnVsbHx8IXRoaXMuX3ByZXZpb3VzQXR0cmlidXRlcylyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzW3RdfSxwcmV2aW91c0F0dHJpYnV0ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5jbG9uZSh0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMpfSxmZXRjaDpmdW5jdGlvbih0KXt0PXQ/aS5jbG9uZSh0KTp7fTtpZih0LnBhcnNlPT09dm9pZCAwKXQucGFyc2U9dHJ1ZTt2YXIgZT10aGlzO3ZhciByPXQuc3VjY2Vzczt0LnN1Y2Nlc3M9ZnVuY3Rpb24oaSl7aWYoIWUuc2V0KGUucGFyc2UoaSx0KSx0KSlyZXR1cm4gZmFsc2U7aWYocilyKGUsaSx0KTtlLnRyaWdnZXIoInN5bmMiLGUsaSx0KX07cSh0aGlzLHQpO3JldHVybiB0aGlzLnN5bmMoInJlYWQiLHRoaXMsdCl9LHNhdmU6ZnVuY3Rpb24odCxlLHIpe3ZhciBzLG4sYSxvPXRoaXMuYXR0cmlidXRlcztpZih0PT1udWxsfHx0eXBlb2YgdD09PSJvYmplY3QiKXtzPXQ7cj1lfWVsc2V7KHM9e30pW3RdPWV9cj1pLmV4dGVuZCh7dmFsaWRhdGU6dHJ1ZX0scik7aWYocyYmIXIud2FpdCl7aWYoIXRoaXMuc2V0KHMscikpcmV0dXJuIGZhbHNlfWVsc2V7aWYoIXRoaXMuX3ZhbGlkYXRlKHMscikpcmV0dXJuIGZhbHNlfWlmKHMmJnIud2FpdCl7dGhpcy5hdHRyaWJ1dGVzPWkuZXh0ZW5kKHt9LG8scyl9aWYoci5wYXJzZT09PXZvaWQgMClyLnBhcnNlPXRydWU7dmFyIGg9dGhpczt2YXIgdT1yLnN1Y2Nlc3M7ci5zdWNjZXNzPWZ1bmN0aW9uKHQpe2guYXR0cmlidXRlcz1vO3ZhciBlPWgucGFyc2UodCxyKTtpZihyLndhaXQpZT1pLmV4dGVuZChzfHx7fSxlKTtpZihpLmlzT2JqZWN0KGUpJiYhaC5zZXQoZSxyKSl7cmV0dXJuIGZhbHNlfWlmKHUpdShoLHQscik7aC50cmlnZ2VyKCJzeW5jIixoLHQscil9O3EodGhpcyxyKTtuPXRoaXMuaXNOZXcoKT8iY3JlYXRlIjpyLnBhdGNoPyJwYXRjaCI6InVwZGF0ZSI7aWYobj09PSJwYXRjaCIpci5hdHRycz1zO2E9dGhpcy5zeW5jKG4sdGhpcyxyKTtpZihzJiZyLndhaXQpdGhpcy5hdHRyaWJ1dGVzPW87cmV0dXJuIGF9LGRlc3Ryb3k6ZnVuY3Rpb24odCl7dD10P2kuY2xvbmUodCk6e307dmFyIGU9dGhpczt2YXIgcj10LnN1Y2Nlc3M7dmFyIHM9ZnVuY3Rpb24oKXtlLnRyaWdnZXIoImRlc3Ryb3kiLGUsZS5jb2xsZWN0aW9uLHQpfTt0LnN1Y2Nlc3M9ZnVuY3Rpb24oaSl7aWYodC53YWl0fHxlLmlzTmV3KCkpcygpO2lmKHIpcihlLGksdCk7aWYoIWUuaXNOZXcoKSllLnRyaWdnZXIoInN5bmMiLGUsaSx0KX07aWYodGhpcy5pc05ldygpKXt0LnN1Y2Nlc3MoKTtyZXR1cm4gZmFsc2V9cSh0aGlzLHQpO3ZhciBuPXRoaXMuc3luYygiZGVsZXRlIix0aGlzLHQpO2lmKCF0LndhaXQpcygpO3JldHVybiBufSx1cmw6ZnVuY3Rpb24oKXt2YXIgdD1pLnJlc3VsdCh0aGlzLCJ1cmxSb290Iil8fGkucmVzdWx0KHRoaXMuY29sbGVjdGlvbiwidXJsIil8fE0oKTtpZih0aGlzLmlzTmV3KCkpcmV0dXJuIHQ7cmV0dXJuIHQucmVwbGFjZSgvKFteXC9dKSQvLCIkMS8iKStlbmNvZGVVUklDb21wb25lbnQodGhpcy5pZCl9LHBhcnNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXR0cmlidXRlcyl9LGlzTmV3OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaGFzKHRoaXMuaWRBdHRyaWJ1dGUpfSxpc1ZhbGlkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl92YWxpZGF0ZSh7fSxpLmV4dGVuZCh0fHx7fSx7dmFsaWRhdGU6dHJ1ZX0pKX0sX3ZhbGlkYXRlOmZ1bmN0aW9uKHQsZSl7aWYoIWUudmFsaWRhdGV8fCF0aGlzLnZhbGlkYXRlKXJldHVybiB0cnVlO3Q9aS5leHRlbmQoe30sdGhpcy5hdHRyaWJ1dGVzLHQpO3ZhciByPXRoaXMudmFsaWRhdGlvbkVycm9yPXRoaXMudmFsaWRhdGUodCxlKXx8bnVsbDtpZighcilyZXR1cm4gdHJ1ZTt0aGlzLnRyaWdnZXIoImludmFsaWQiLHRoaXMscixpLmV4dGVuZChlLHt2YWxpZGF0aW9uRXJyb3I6cn0pKTtyZXR1cm4gZmFsc2V9fSk7dmFyIHY9WyJrZXlzIiwidmFsdWVzIiwicGFpcnMiLCJpbnZlcnQiLCJwaWNrIiwib21pdCJdO2kuZWFjaCh2LGZ1bmN0aW9uKHQpe3AucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIGU9by5jYWxsKGFyZ3VtZW50cyk7ZS51bnNoaWZ0KHRoaXMuYXR0cmlidXRlcyk7cmV0dXJuIGlbdF0uYXBwbHkoaSxlKX19KTt2YXIgZz1lLkNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXtlfHwoZT17fSk7aWYoZS5tb2RlbCl0aGlzLm1vZGVsPWUubW9kZWw7aWYoZS5jb21wYXJhdG9yIT09dm9pZCAwKXRoaXMuY29tcGFyYXRvcj1lLmNvbXBhcmF0b3I7dGhpcy5fcmVzZXQoKTt0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHQpdGhpcy5yZXNldCh0LGkuZXh0ZW5kKHtzaWxlbnQ6dHJ1ZX0sZSkpfTt2YXIgbT17YWRkOnRydWUscmVtb3ZlOnRydWUsbWVyZ2U6dHJ1ZX07dmFyIHk9e2FkZDp0cnVlLHJlbW92ZTpmYWxzZX07aS5leHRlbmQoZy5wcm90b3R5cGUsdSx7bW9kZWw6cCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSx0b0pTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvSlNPTih0KX0pfSxzeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGUuc3luYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNldCh0LGkuZXh0ZW5kKHttZXJnZTpmYWxzZX0sZSx5KSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3ZhciByPSFpLmlzQXJyYXkodCk7dD1yP1t0XTppLmNsb25lKHQpO2V8fChlPXt9KTt2YXIgcyxuLGEsbztmb3Iocz0wLG49dC5sZW5ndGg7czxuO3MrKyl7bz10W3NdPXRoaXMuZ2V0KHRbc10pO2lmKCFvKWNvbnRpbnVlO2RlbGV0ZSB0aGlzLl9ieUlkW28uaWRdO2RlbGV0ZSB0aGlzLl9ieUlkW28uY2lkXTthPXRoaXMuaW5kZXhPZihvKTt0aGlzLm1vZGVscy5zcGxpY2UoYSwxKTt0aGlzLmxlbmd0aC0tO2lmKCFlLnNpbGVudCl7ZS5pbmRleD1hO28udHJpZ2dlcigicmVtb3ZlIixvLHRoaXMsZSl9dGhpcy5fcmVtb3ZlUmVmZXJlbmNlKG8sZSl9cmV0dXJuIHI/dFswXTp0fSxzZXQ6ZnVuY3Rpb24odCxlKXtlPWkuZGVmYXVsdHMoe30sZSxtKTtpZihlLnBhcnNlKXQ9dGhpcy5wYXJzZSh0LGUpO3ZhciByPSFpLmlzQXJyYXkodCk7dD1yP3Q/W3RdOltdOmkuY2xvbmUodCk7dmFyIHMsbixhLG8saCx1LGw7dmFyIGM9ZS5hdDt2YXIgZj10aGlzLm1vZGVsO3ZhciBkPXRoaXMuY29tcGFyYXRvciYmYz09bnVsbCYmZS5zb3J0IT09ZmFsc2U7dmFyIHY9aS5pc1N0cmluZyh0aGlzLmNvbXBhcmF0b3IpP3RoaXMuY29tcGFyYXRvcjpudWxsO3ZhciBnPVtdLHk9W10sXz17fTt2YXIgYj1lLmFkZCx3PWUubWVyZ2UseD1lLnJlbW92ZTt2YXIgRT0hZCYmYiYmeD9bXTpmYWxzZTtmb3Iocz0wLG49dC5sZW5ndGg7czxuO3MrKyl7aD10W3NdfHx7fTtpZihoIGluc3RhbmNlb2YgcCl7YT1vPWh9ZWxzZXthPWhbZi5wcm90b3R5cGUuaWRBdHRyaWJ1dGV8fCJpZCJdfWlmKHU9dGhpcy5nZXQoYSkpe2lmKHgpX1t1LmNpZF09dHJ1ZTtpZih3KXtoPWg9PT1vP28uYXR0cmlidXRlczpoO2lmKGUucGFyc2UpaD11LnBhcnNlKGgsZSk7dS5zZXQoaCxlKTtpZihkJiYhbCYmdS5oYXNDaGFuZ2VkKHYpKWw9dHJ1ZX10W3NdPXV9ZWxzZSBpZihiKXtvPXRbc109dGhpcy5fcHJlcGFyZU1vZGVsKGgsZSk7aWYoIW8pY29udGludWU7Zy5wdXNoKG8pO3RoaXMuX2FkZFJlZmVyZW5jZShvLGUpfW89dXx8bztpZihFJiYoby5pc05ldygpfHwhX1tvLmlkXSkpRS5wdXNoKG8pO19bby5pZF09dHJ1ZX1pZih4KXtmb3Iocz0wLG49dGhpcy5sZW5ndGg7czxuOysrcyl7aWYoIV9bKG89dGhpcy5tb2RlbHNbc10pLmNpZF0peS5wdXNoKG8pfWlmKHkubGVuZ3RoKXRoaXMucmVtb3ZlKHksZSl9aWYoZy5sZW5ndGh8fEUmJkUubGVuZ3RoKXtpZihkKWw9dHJ1ZTt0aGlzLmxlbmd0aCs9Zy5sZW5ndGg7aWYoYyE9bnVsbCl7Zm9yKHM9MCxuPWcubGVuZ3RoO3M8bjtzKyspe3RoaXMubW9kZWxzLnNwbGljZShjK3MsMCxnW3NdKX19ZWxzZXtpZihFKXRoaXMubW9kZWxzLmxlbmd0aD0wO3ZhciBrPUV8fGc7Zm9yKHM9MCxuPWsubGVuZ3RoO3M8bjtzKyspe3RoaXMubW9kZWxzLnB1c2goa1tzXSl9fX1pZihsKXRoaXMuc29ydCh7c2lsZW50OnRydWV9KTtpZighZS5zaWxlbnQpe2ZvcihzPTAsbj1nLmxlbmd0aDtzPG47cysrKXsobz1nW3NdKS50cmlnZ2VyKCJhZGQiLG8sdGhpcyxlKX1pZihsfHxFJiZFLmxlbmd0aCl0aGlzLnRyaWdnZXIoInNvcnQiLHRoaXMsZSl9cmV0dXJuIHI/dFswXTp0fSxyZXNldDpmdW5jdGlvbih0LGUpe2V8fChlPXt9KTtmb3IodmFyIHI9MCxzPXRoaXMubW9kZWxzLmxlbmd0aDtyPHM7cisrKXt0aGlzLl9yZW1vdmVSZWZlcmVuY2UodGhpcy5tb2RlbHNbcl0sZSl9ZS5wcmV2aW91c01vZGVscz10aGlzLm1vZGVsczt0aGlzLl9yZXNldCgpO3Q9dGhpcy5hZGQodCxpLmV4dGVuZCh7c2lsZW50OnRydWV9LGUpKTtpZighZS5zaWxlbnQpdGhpcy50cmlnZ2VyKCJyZXNldCIsdGhpcyxlKTtyZXR1cm4gdH0scHVzaDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZCh0LGkuZXh0ZW5kKHthdDp0aGlzLmxlbmd0aH0sZSkpfSxwb3A6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdCh0aGlzLmxlbmd0aC0xKTt0aGlzLnJlbW92ZShlLHQpO3JldHVybiBlfSx1bnNoaWZ0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKHQsaS5leHRlbmQoe2F0OjB9LGUpKX0sc2hpZnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdCgwKTt0aGlzLnJlbW92ZShlLHQpO3JldHVybiBlfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiBvLmFwcGx5KHRoaXMubW9kZWxzLGFyZ3VtZW50cyl9LGdldDpmdW5jdGlvbih0KXtpZih0PT1udWxsKXJldHVybiB2b2lkIDA7cmV0dXJuIHRoaXMuX2J5SWRbdF18fHRoaXMuX2J5SWRbdC5pZF18fHRoaXMuX2J5SWRbdC5jaWRdfSxhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tb2RlbHNbdF19LHdoZXJlOmZ1bmN0aW9uKHQsZSl7aWYoaS5pc0VtcHR5KHQpKXJldHVybiBlP3ZvaWQgMDpbXTtyZXR1cm4gdGhpc1tlPyJmaW5kIjoiZmlsdGVyIl0oZnVuY3Rpb24oZSl7Zm9yKHZhciBpIGluIHQpe2lmKHRbaV0hPT1lLmdldChpKSlyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9KX0sZmluZFdoZXJlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLndoZXJlKHQsdHJ1ZSl9LHNvcnQ6ZnVuY3Rpb24odCl7aWYoIXRoaXMuY29tcGFyYXRvcil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzb3J0IGEgc2V0IHdpdGhvdXQgYSBjb21wYXJhdG9yIik7dHx8KHQ9e30pO2lmKGkuaXNTdHJpbmcodGhpcy5jb21wYXJhdG9yKXx8dGhpcy5jb21wYXJhdG9yLmxlbmd0aD09PTEpe3RoaXMubW9kZWxzPXRoaXMuc29ydEJ5KHRoaXMuY29tcGFyYXRvcix0aGlzKX1lbHNle3RoaXMubW9kZWxzLnNvcnQoaS5iaW5kKHRoaXMuY29tcGFyYXRvcix0aGlzKSl9aWYoIXQuc2lsZW50KXRoaXMudHJpZ2dlcigic29ydCIsdGhpcyx0KTtyZXR1cm4gdGhpc30scGx1Y2s6ZnVuY3Rpb24odCl7cmV0dXJuIGkuaW52b2tlKHRoaXMubW9kZWxzLCJnZXQiLHQpfSxmZXRjaDpmdW5jdGlvbih0KXt0PXQ/aS5jbG9uZSh0KTp7fTtpZih0LnBhcnNlPT09dm9pZCAwKXQucGFyc2U9dHJ1ZTt2YXIgZT10LnN1Y2Nlc3M7dmFyIHI9dGhpczt0LnN1Y2Nlc3M9ZnVuY3Rpb24oaSl7dmFyIHM9dC5yZXNldD8icmVzZXQiOiJzZXQiO3Jbc10oaSx0KTtpZihlKWUocixpLHQpO3IudHJpZ2dlcigic3luYyIscixpLHQpfTtxKHRoaXMsdCk7cmV0dXJuIHRoaXMuc3luYygicmVhZCIsdGhpcyx0KX0sY3JlYXRlOmZ1bmN0aW9uKHQsZSl7ZT1lP2kuY2xvbmUoZSk6e307aWYoISh0PXRoaXMuX3ByZXBhcmVNb2RlbCh0LGUpKSlyZXR1cm4gZmFsc2U7aWYoIWUud2FpdCl0aGlzLmFkZCh0LGUpO3ZhciByPXRoaXM7dmFyIHM9ZS5zdWNjZXNzO2Uuc3VjY2Vzcz1mdW5jdGlvbih0LGkpe2lmKGUud2FpdClyLmFkZCh0LGUpO2lmKHMpcyh0LGksZSl9O3Quc2F2ZShudWxsLGUpO3JldHVybiB0fSxwYXJzZTpmdW5jdGlvbih0LGUpe3JldHVybiB0fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm1vZGVscyl9LF9yZXNldDpmdW5jdGlvbigpe3RoaXMubGVuZ3RoPTA7dGhpcy5tb2RlbHM9W107dGhpcy5fYnlJZD17fX0sX3ByZXBhcmVNb2RlbDpmdW5jdGlvbih0LGUpe2lmKHQgaW5zdGFuY2VvZiBwKXJldHVybiB0O2U9ZT9pLmNsb25lKGUpOnt9O2UuY29sbGVjdGlvbj10aGlzO3ZhciByPW5ldyB0aGlzLm1vZGVsKHQsZSk7aWYoIXIudmFsaWRhdGlvbkVycm9yKXJldHVybiByO3RoaXMudHJpZ2dlcigiaW52YWxpZCIsdGhpcyxyLnZhbGlkYXRpb25FcnJvcixlKTtyZXR1cm4gZmFsc2V9LF9hZGRSZWZlcmVuY2U6ZnVuY3Rpb24odCxlKXt0aGlzLl9ieUlkW3QuY2lkXT10O2lmKHQuaWQhPW51bGwpdGhpcy5fYnlJZFt0LmlkXT10O2lmKCF0LmNvbGxlY3Rpb24pdC5jb2xsZWN0aW9uPXRoaXM7dC5vbigiYWxsIix0aGlzLl9vbk1vZGVsRXZlbnQsdGhpcyl9LF9yZW1vdmVSZWZlcmVuY2U6ZnVuY3Rpb24odCxlKXtpZih0aGlzPT09dC5jb2xsZWN0aW9uKWRlbGV0ZSB0LmNvbGxlY3Rpb247dC5vZmYoImFsbCIsdGhpcy5fb25Nb2RlbEV2ZW50LHRoaXMpfSxfb25Nb2RlbEV2ZW50OmZ1bmN0aW9uKHQsZSxpLHIpe2lmKCh0PT09ImFkZCJ8fHQ9PT0icmVtb3ZlIikmJmkhPT10aGlzKXJldHVybjtpZih0PT09ImRlc3Ryb3kiKXRoaXMucmVtb3ZlKGUscik7aWYoZSYmdD09PSJjaGFuZ2U6IitlLmlkQXR0cmlidXRlKXtkZWxldGUgdGhpcy5fYnlJZFtlLnByZXZpb3VzKGUuaWRBdHRyaWJ1dGUpXTtpZihlLmlkIT1udWxsKXRoaXMuX2J5SWRbZS5pZF09ZX10aGlzLnRyaWdnZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pO3ZhciBfPVsiZm9yRWFjaCIsImVhY2giLCJtYXAiLCJjb2xsZWN0IiwicmVkdWNlIiwiZm9sZGwiLCJpbmplY3QiLCJyZWR1Y2VSaWdodCIsImZvbGRyIiwiZmluZCIsImRldGVjdCIsImZpbHRlciIsInNlbGVjdCIsInJlamVjdCIsImV2ZXJ5IiwiYWxsIiwic29tZSIsImFueSIsImluY2x1ZGUiLCJjb250YWlucyIsImludm9rZSIsIm1heCIsIm1pbiIsInRvQXJyYXkiLCJzaXplIiwiZmlyc3QiLCJoZWFkIiwidGFrZSIsImluaXRpYWwiLCJyZXN0IiwidGFpbCIsImRyb3AiLCJsYXN0Iiwid2l0aG91dCIsImRpZmZlcmVuY2UiLCJpbmRleE9mIiwic2h1ZmZsZSIsImxhc3RJbmRleE9mIiwiaXNFbXB0eSIsImNoYWluIiwic2FtcGxlIl07aS5lYWNoKF8sZnVuY3Rpb24odCl7Zy5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgZT1vLmNhbGwoYXJndW1lbnRzKTtlLnVuc2hpZnQodGhpcy5tb2RlbHMpO3JldHVybiBpW3RdLmFwcGx5KGksZSl9fSk7dmFyIGI9WyJncm91cEJ5IiwiY291bnRCeSIsInNvcnRCeSIsImluZGV4QnkiXTtpLmVhY2goYixmdW5jdGlvbih0KXtnLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLHIpe3ZhciBzPWkuaXNGdW5jdGlvbihlKT9lOmZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChlKX07cmV0dXJuIGlbdF0odGhpcy5tb2RlbHMscyxyKX19KTt2YXIgdz1lLlZpZXc9ZnVuY3Rpb24odCl7dGhpcy5jaWQ9aS51bmlxdWVJZCgidmlldyIpO3R8fCh0PXt9KTtpLmV4dGVuZCh0aGlzLGkucGljayh0LEUpKTt0aGlzLl9lbnN1cmVFbGVtZW50KCk7dGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmRlbGVnYXRlRXZlbnRzKCl9O3ZhciB4PS9eKFxTKylccyooLiopJC87dmFyIEU9WyJtb2RlbCIsImNvbGxlY3Rpb24iLCJlbCIsImlkIiwiYXR0cmlidXRlcyIsImNsYXNzTmFtZSIsInRhZ05hbWUiLCJldmVudHMiXTtpLmV4dGVuZCh3LnByb3RvdHlwZSx1LHt0YWdOYW1lOiJkaXYiLCQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuJGVsLmZpbmQodCl9LGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHJlbmRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLiRlbC5yZW1vdmUoKTt0aGlzLnN0b3BMaXN0ZW5pbmcoKTtyZXR1cm4gdGhpc30sc2V0RWxlbWVudDpmdW5jdGlvbih0LGkpe2lmKHRoaXMuJGVsKXRoaXMudW5kZWxlZ2F0ZUV2ZW50cygpO3RoaXMuJGVsPXQgaW5zdGFuY2VvZiBlLiQ/dDplLiQodCk7dGhpcy5lbD10aGlzLiRlbFswXTtpZihpIT09ZmFsc2UpdGhpcy5kZWxlZ2F0ZUV2ZW50cygpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZUV2ZW50czpmdW5jdGlvbih0KXtpZighKHR8fCh0PWkucmVzdWx0KHRoaXMsImV2ZW50cyIpKSkpcmV0dXJuIHRoaXM7dGhpcy51bmRlbGVnYXRlRXZlbnRzKCk7Zm9yKHZhciBlIGluIHQpe3ZhciByPXRbZV07aWYoIWkuaXNGdW5jdGlvbihyKSlyPXRoaXNbdFtlXV07aWYoIXIpY29udGludWU7dmFyIHM9ZS5tYXRjaCh4KTt2YXIgbj1zWzFdLGE9c1syXTtyPWkuYmluZChyLHRoaXMpO24rPSIuZGVsZWdhdGVFdmVudHMiK3RoaXMuY2lkO2lmKGE9PT0iIil7dGhpcy4kZWwub24obixyKX1lbHNle3RoaXMuJGVsLm9uKG4sYSxyKX19cmV0dXJuIHRoaXN9LHVuZGVsZWdhdGVFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLiRlbC5vZmYoIi5kZWxlZ2F0ZUV2ZW50cyIrdGhpcy5jaWQpO3JldHVybiB0aGlzfSxfZW5zdXJlRWxlbWVudDpmdW5jdGlvbigpe2lmKCF0aGlzLmVsKXt2YXIgdD1pLmV4dGVuZCh7fSxpLnJlc3VsdCh0aGlzLCJhdHRyaWJ1dGVzIikpO2lmKHRoaXMuaWQpdC5pZD1pLnJlc3VsdCh0aGlzLCJpZCIpO2lmKHRoaXMuY2xhc3NOYW1lKXRbImNsYXNzIl09aS5yZXN1bHQodGhpcywiY2xhc3NOYW1lIik7dmFyIHI9ZS4kKCI8IitpLnJlc3VsdCh0aGlzLCJ0YWdOYW1lIikrIj4iKS5hdHRyKHQpO3RoaXMuc2V0RWxlbWVudChyLGZhbHNlKX1lbHNle3RoaXMuc2V0RWxlbWVudChpLnJlc3VsdCh0aGlzLCJlbCIpLGZhbHNlKX19fSk7ZS5zeW5jPWZ1bmN0aW9uKHQscixzKXt2YXIgbj1UW3RdO2kuZGVmYXVsdHMoc3x8KHM9e30pLHtlbXVsYXRlSFRUUDplLmVtdWxhdGVIVFRQLGVtdWxhdGVKU09OOmUuZW11bGF0ZUpTT059KTt2YXIgYT17dHlwZTpuLGRhdGFUeXBlOiJqc29uIn07aWYoIXMudXJsKXthLnVybD1pLnJlc3VsdChyLCJ1cmwiKXx8TSgpfWlmKHMuZGF0YT09bnVsbCYmciYmKHQ9PT0iY3JlYXRlInx8dD09PSJ1cGRhdGUifHx0PT09InBhdGNoIikpe2EuY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24iO2EuZGF0YT1KU09OLnN0cmluZ2lmeShzLmF0dHJzfHxyLnRvSlNPTihzKSl9aWYocy5lbXVsYXRlSlNPTil7YS5jb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjthLmRhdGE9YS5kYXRhP3ttb2RlbDphLmRhdGF9Ont9fWlmKHMuZW11bGF0ZUhUVFAmJihuPT09IlBVVCJ8fG49PT0iREVMRVRFInx8bj09PSJQQVRDSCIpKXthLnR5cGU9IlBPU1QiO2lmKHMuZW11bGF0ZUpTT04pYS5kYXRhLl9tZXRob2Q9bjt2YXIgbz1zLmJlZm9yZVNlbmQ7cy5iZWZvcmVTZW5kPWZ1bmN0aW9uKHQpe3Quc2V0UmVxdWVzdEhlYWRlcigiWC1IVFRQLU1ldGhvZC1PdmVycmlkZSIsbik7aWYobylyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWlmKGEudHlwZSE9PSJHRVQiJiYhcy5lbXVsYXRlSlNPTil7YS5wcm9jZXNzRGF0YT1mYWxzZX1pZihhLnR5cGU9PT0iUEFUQ0giJiZrKXthLnhocj1mdW5jdGlvbigpe3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX19dmFyIGg9cy54aHI9ZS5hamF4KGkuZXh0ZW5kKGEscykpO3IudHJpZ2dlcigicmVxdWVzdCIscixoLHMpO3JldHVybiBofTt2YXIgaz10eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCImJiEhd2luZG93LkFjdGl2ZVhPYmplY3QmJiEod2luZG93LlhNTEh0dHBSZXF1ZXN0JiYobmV3IFhNTEh0dHBSZXF1ZXN0KS5kaXNwYXRjaEV2ZW50KTt2YXIgVD17Y3JlYXRlOiJQT1NUIix1cGRhdGU6IlBVVCIscGF0Y2g6IlBBVENIIiwiZGVsZXRlIjoiREVMRVRFIixyZWFkOiJHRVQifTtlLmFqYXg9ZnVuY3Rpb24oKXtyZXR1cm4gZS4kLmFqYXguYXBwbHkoZS4kLGFyZ3VtZW50cyl9O3ZhciAkPWUuUm91dGVyPWZ1bmN0aW9uKHQpe3R8fCh0PXt9KTtpZih0LnJvdXRlcyl0aGlzLnJvdXRlcz10LnJvdXRlczt0aGlzLl9iaW5kUm91dGVzKCk7dGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dmFyIFM9L1woKC4qPylcKS9nO3ZhciBIPS8oXChcPyk/Olx3Ky9nO3ZhciBBPS9cKlx3Ky9nO3ZhciBJPS9bXC17fVxbXF0rPy4sXFxcXiR8I1xzXS9nO2kuZXh0ZW5kKCQucHJvdG90eXBlLHUse2luaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHJvdXRlOmZ1bmN0aW9uKHQscixzKXtpZighaS5pc1JlZ0V4cCh0KSl0PXRoaXMuX3JvdXRlVG9SZWdFeHAodCk7aWYoaS5pc0Z1bmN0aW9uKHIpKXtzPXI7cj0iIn1pZighcylzPXRoaXNbcl07dmFyIG49dGhpcztlLmhpc3Rvcnkucm91dGUodCxmdW5jdGlvbihpKXt2YXIgYT1uLl9leHRyYWN0UGFyYW1ldGVycyh0LGkpO24uZXhlY3V0ZShzLGEpO24udHJpZ2dlci5hcHBseShuLFsicm91dGU6IityXS5jb25jYXQoYSkpO24udHJpZ2dlcigicm91dGUiLHIsYSk7ZS5oaXN0b3J5LnRyaWdnZXIoInJvdXRlIixuLHIsYSl9KTtyZXR1cm4gdGhpc30sZXhlY3V0ZTpmdW5jdGlvbih0LGUpe2lmKHQpdC5hcHBseSh0aGlzLGUpfSxuYXZpZ2F0ZTpmdW5jdGlvbih0LGkpe2UuaGlzdG9yeS5uYXZpZ2F0ZSh0LGkpO3JldHVybiB0aGlzfSxfYmluZFJvdXRlczpmdW5jdGlvbigpe2lmKCF0aGlzLnJvdXRlcylyZXR1cm47dGhpcy5yb3V0ZXM9aS5yZXN1bHQodGhpcywicm91dGVzIik7dmFyIHQsZT1pLmtleXModGhpcy5yb3V0ZXMpO3doaWxlKCh0PWUucG9wKCkpIT1udWxsKXt0aGlzLnJvdXRlKHQsdGhpcy5yb3V0ZXNbdF0pfX0sX3JvdXRlVG9SZWdFeHA6ZnVuY3Rpb24odCl7dD10LnJlcGxhY2UoSSwiXFwkJiIpLnJlcGxhY2UoUywiKD86JDEpPyIpLnJlcGxhY2UoSCxmdW5jdGlvbih0LGUpe3JldHVybiBlP3Q6IihbXi8/XSspIn0pLnJlcGxhY2UoQSwiKFteP10qPykiKTtyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrdCsiKD86XFw/KFtcXHNcXFNdKikpPyQiKX0sX2V4dHJhY3RQYXJhbWV0ZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5leGVjKGUpLnNsaWNlKDEpO3JldHVybiBpLm1hcChyLGZ1bmN0aW9uKHQsZSl7aWYoZT09PXIubGVuZ3RoLTEpcmV0dXJuIHR8fG51bGw7cmV0dXJuIHQ/ZGVjb2RlVVJJQ29tcG9uZW50KHQpOm51bGx9KX19KTt2YXIgTj1lLkhpc3Rvcnk9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXJzPVtdO2kuYmluZEFsbCh0aGlzLCJjaGVja1VybCIpO2lmKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIil7dGhpcy5sb2NhdGlvbj13aW5kb3cubG9jYXRpb247dGhpcy5oaXN0b3J5PXdpbmRvdy5oaXN0b3J5fX07dmFyIFI9L15bI1wvXXxccyskL2c7dmFyIE89L15cLyt8XC8rJC9nO3ZhciBQPS9tc2llIFtcdy5dKy87dmFyIEM9L1wvJC87dmFyIGo9LyMuKiQvO04uc3RhcnRlZD1mYWxzZTtpLmV4dGVuZChOLnByb3RvdHlwZSx1LHtpbnRlcnZhbDo1MCxhdFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9bXlwvXSQvLCIkJi8iKT09PXRoaXMucm9vdH0sZ2V0SGFzaDpmdW5jdGlvbih0KXt2YXIgZT0odHx8dGhpcykubG9jYXRpb24uaHJlZi5tYXRjaCgvIyguKikkLyk7cmV0dXJuIGU/ZVsxXToiIn0sZ2V0RnJhZ21lbnQ6ZnVuY3Rpb24odCxlKXtpZih0PT1udWxsKXtpZih0aGlzLl9oYXNQdXNoU3RhdGV8fCF0aGlzLl93YW50c0hhc2hDaGFuZ2V8fGUpe3Q9ZGVjb2RlVVJJKHRoaXMubG9jYXRpb24ucGF0aG5hbWUrdGhpcy5sb2NhdGlvbi5zZWFyY2gpO3ZhciBpPXRoaXMucm9vdC5yZXBsYWNlKEMsIiIpO2lmKCF0LmluZGV4T2YoaSkpdD10LnNsaWNlKGkubGVuZ3RoKX1lbHNle3Q9dGhpcy5nZXRIYXNoKCl9fXJldHVybiB0LnJlcGxhY2UoUiwiIil9LHN0YXJ0OmZ1bmN0aW9uKHQpe2lmKE4uc3RhcnRlZCl0aHJvdyBuZXcgRXJyb3IoIkJhY2tib25lLmhpc3RvcnkgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIik7Ti5zdGFydGVkPXRydWU7dGhpcy5vcHRpb25zPWkuZXh0ZW5kKHtyb290OiIvIn0sdGhpcy5vcHRpb25zLHQpO3RoaXMucm9vdD10aGlzLm9wdGlvbnMucm9vdDt0aGlzLl93YW50c0hhc2hDaGFuZ2U9dGhpcy5vcHRpb25zLmhhc2hDaGFuZ2UhPT1mYWxzZTt0aGlzLl93YW50c1B1c2hTdGF0ZT0hIXRoaXMub3B0aW9ucy5wdXNoU3RhdGU7dGhpcy5faGFzUHVzaFN0YXRlPSEhKHRoaXMub3B0aW9ucy5wdXNoU3RhdGUmJnRoaXMuaGlzdG9yeSYmdGhpcy5oaXN0b3J5LnB1c2hTdGF0ZSk7dmFyIHI9dGhpcy5nZXRGcmFnbWVudCgpO3ZhciBzPWRvY3VtZW50LmRvY3VtZW50TW9kZTt2YXIgbj1QLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSYmKCFzfHxzPD03KTt0aGlzLnJvb3Q9KCIvIit0aGlzLnJvb3QrIi8iKS5yZXBsYWNlKE8sIi8iKTtpZihuJiZ0aGlzLl93YW50c0hhc2hDaGFuZ2Upe3ZhciBhPWUuJCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6MCIgdGFiaW5kZXg9Ii0xIj4nKTt0aGlzLmlmcmFtZT1hLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpWzBdLmNvbnRlbnRXaW5kb3c7dGhpcy5uYXZpZ2F0ZShyKX1pZih0aGlzLl9oYXNQdXNoU3RhdGUpe2UuJCh3aW5kb3cpLm9uKCJwb3BzdGF0ZSIsdGhpcy5jaGVja1VybCl9ZWxzZSBpZih0aGlzLl93YW50c0hhc2hDaGFuZ2UmJiJvbmhhc2hjaGFuZ2UiaW4gd2luZG93JiYhbil7ZS4kKHdpbmRvdykub24oImhhc2hjaGFuZ2UiLHRoaXMuY2hlY2tVcmwpfWVsc2UgaWYodGhpcy5fd2FudHNIYXNoQ2hhbmdlKXt0aGlzLl9jaGVja1VybEludGVydmFsPXNldEludGVydmFsKHRoaXMuY2hlY2tVcmwsdGhpcy5pbnRlcnZhbCl9dGhpcy5mcmFnbWVudD1yO3ZhciBvPXRoaXMubG9jYXRpb247aWYodGhpcy5fd2FudHNIYXNoQ2hhbmdlJiZ0aGlzLl93YW50c1B1c2hTdGF0ZSl7aWYoIXRoaXMuX2hhc1B1c2hTdGF0ZSYmIXRoaXMuYXRSb290KCkpe3RoaXMuZnJhZ21lbnQ9dGhpcy5nZXRGcmFnbWVudChudWxsLHRydWUpO3RoaXMubG9jYXRpb24ucmVwbGFjZSh0aGlzLnJvb3QrIiMiK3RoaXMuZnJhZ21lbnQpO3JldHVybiB0cnVlfWVsc2UgaWYodGhpcy5faGFzUHVzaFN0YXRlJiZ0aGlzLmF0Um9vdCgpJiZvLmhhc2gpe3RoaXMuZnJhZ21lbnQ9dGhpcy5nZXRIYXNoKCkucmVwbGFjZShSLCIiKTt0aGlzLmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLHRoaXMucm9vdCt0aGlzLmZyYWdtZW50KX19aWYoIXRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIHRoaXMubG9hZFVybCgpfSxzdG9wOmZ1bmN0aW9uKCl7ZS4kKHdpbmRvdykub2ZmKCJwb3BzdGF0ZSIsdGhpcy5jaGVja1VybCkub2ZmKCJoYXNoY2hhbmdlIix0aGlzLmNoZWNrVXJsKTtpZih0aGlzLl9jaGVja1VybEludGVydmFsKWNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tVcmxJbnRlcnZhbCk7Ti5zdGFydGVkPWZhbHNlfSxyb3V0ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFuZGxlcnMudW5zaGlmdCh7cm91dGU6dCxjYWxsYmFjazplfSl9LGNoZWNrVXJsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RnJhZ21lbnQoKTtpZihlPT09dGhpcy5mcmFnbWVudCYmdGhpcy5pZnJhbWUpe2U9dGhpcy5nZXRGcmFnbWVudCh0aGlzLmdldEhhc2godGhpcy5pZnJhbWUpKX1pZihlPT09dGhpcy5mcmFnbWVudClyZXR1cm4gZmFsc2U7aWYodGhpcy5pZnJhbWUpdGhpcy5uYXZpZ2F0ZShlKTt0aGlzLmxvYWRVcmwoKX0sbG9hZFVybDpmdW5jdGlvbih0KXt0PXRoaXMuZnJhZ21lbnQ9dGhpcy5nZXRGcmFnbWVudCh0KTtyZXR1cm4gaS5hbnkodGhpcy5oYW5kbGVycyxmdW5jdGlvbihlKXtpZihlLnJvdXRlLnRlc3QodCkpe2UuY2FsbGJhY2sodCk7cmV0dXJuIHRydWV9fSl9LG5hdmlnYXRlOmZ1bmN0aW9uKHQsZSl7aWYoIU4uc3RhcnRlZClyZXR1cm4gZmFsc2U7aWYoIWV8fGU9PT10cnVlKWU9e3RyaWdnZXI6ISFlfTt2YXIgaT10aGlzLnJvb3QrKHQ9dGhpcy5nZXRGcmFnbWVudCh0fHwiIikpO3Q9dC5yZXBsYWNlKGosIiIpO2lmKHRoaXMuZnJhZ21lbnQ9PT10KXJldHVybjt0aGlzLmZyYWdtZW50PXQ7aWYodD09PSIiJiZpIT09Ii8iKWk9aS5zbGljZSgwLC0xKTtpZih0aGlzLl9oYXNQdXNoU3RhdGUpe3RoaXMuaGlzdG9yeVtlLnJlcGxhY2U/InJlcGxhY2VTdGF0ZSI6InB1c2hTdGF0ZSJdKHt9LGRvY3VtZW50LnRpdGxlLGkpfWVsc2UgaWYodGhpcy5fd2FudHNIYXNoQ2hhbmdlKXt0aGlzLl91cGRhdGVIYXNoKHRoaXMubG9jYXRpb24sdCxlLnJlcGxhY2UpO2lmKHRoaXMuaWZyYW1lJiZ0IT09dGhpcy5nZXRGcmFnbWVudCh0aGlzLmdldEhhc2godGhpcy5pZnJhbWUpKSl7aWYoIWUucmVwbGFjZSl0aGlzLmlmcmFtZS5kb2N1bWVudC5vcGVuKCkuY2xvc2UoKTt0aGlzLl91cGRhdGVIYXNoKHRoaXMuaWZyYW1lLmxvY2F0aW9uLHQsZS5yZXBsYWNlKX19ZWxzZXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5hc3NpZ24oaSl9aWYoZS50cmlnZ2VyKXJldHVybiB0aGlzLmxvYWRVcmwodCl9LF91cGRhdGVIYXNoOmZ1bmN0aW9uKHQsZSxpKXtpZihpKXt2YXIgcj10LmhyZWYucmVwbGFjZSgvKGphdmFzY3JpcHQ6fCMpLiokLywiIik7dC5yZXBsYWNlKHIrIiMiK2UpfWVsc2V7dC5oYXNoPSIjIitlfX19KTtlLmhpc3Rvcnk9bmV3IE47dmFyIFU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO3ZhciBzO2lmKHQmJmkuaGFzKHQsImNvbnN0cnVjdG9yIikpe3M9dC5jb25zdHJ1Y3Rvcn1lbHNle3M9ZnVuY3Rpb24oKXtyZXR1cm4gci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWkuZXh0ZW5kKHMscixlKTt2YXIgbj1mdW5jdGlvbigpe3RoaXMuY29uc3RydWN0b3I9c307bi5wcm90b3R5cGU9ci5wcm90b3R5cGU7cy5wcm90b3R5cGU9bmV3IG47aWYodClpLmV4dGVuZChzLnByb3RvdHlwZSx0KTtzLl9fc3VwZXJfXz1yLnByb3RvdHlwZTtyZXR1cm4gc307cC5leHRlbmQ9Zy5leHRlbmQ9JC5leHRlbmQ9dy5leHRlbmQ9Ti5leHRlbmQ9VTt2YXIgTT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcignQSAidXJsIiBwcm9wZXJ0eSBvciBmdW5jdGlvbiBtdXN0IGJlIHNwZWNpZmllZCcpfTt2YXIgcT1mdW5jdGlvbih0LGUpe3ZhciBpPWUuZXJyb3I7ZS5lcnJvcj1mdW5jdGlvbihyKXtpZihpKWkodCxyLGUpO3QudHJpZ2dlcigiZXJyb3IiLHQscixlKX19O3JldHVybiBlfSk7CisKKy8vIEZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTk0MzE1NTIKKy8vIENvbXBhdGliaWxpdHkgb3ZlcnJpZGUgLSBCYWNrYm9uZSAxLjEgZ290IHJpZCBvZiB0aGUgJ29wdGlvbnMnIGJpbmRpbmcKKy8vIGF1dG9tYXRpY2FsbHkgdG8gdmlld3MgaW4gdGhlIGNvbnN0cnVjdG9yIC0gd2UgbmVlZCB0byBrZWVwIHRoYXQuCitCYWNrYm9uZS5WaWV3ID0gKGZ1bmN0aW9uKFZpZXcpIHsKKyAgIHJldHVybiBWaWV3LmV4dGVuZCh7CisgICAgICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICAgICAgICAgICAgVmlldy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgfSk7Cit9KShCYWNrYm9uZS5WaWV3KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2hhbmRsZWJhcnMtMi4wLjAuanMgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi9oYW5kbGViYXJzLTIuMC4wLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYmQ3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi9oYW5kbGViYXJzLTIuMC4wLmpzCkBAIC0wLDAgKzEsNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyohCisKKyBoYW5kbGViYXJzIHYyLjAuMAorCitDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBieSBZZWh1ZGEgS2F0egorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworQGxpY2Vuc2UKKyovCishZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxiKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YigpOmEuSGFuZGxlYmFycz1hLkhhbmRsZWJhcnN8fGIoKX0odGhpcyxmdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoYSl7dGhpcy5zdHJpbmc9YX12YXIgYjtyZXR1cm4gYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLnN0cmluZ30sYj1hfSgpLGI9ZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGIoYSl7cmV0dXJuIGlbYV19ZnVuY3Rpb24gYyhhKXtmb3IodmFyIGI9MTtiPGFyZ3VtZW50cy5sZW5ndGg7YisrKWZvcih2YXIgYyBpbiBhcmd1bWVudHNbYl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3VtZW50c1tiXSxjKSYmKGFbY109YXJndW1lbnRzW2JdW2NdKTtyZXR1cm4gYX1mdW5jdGlvbiBkKGEpe3JldHVybiBhIGluc3RhbmNlb2YgaD9hLnRvU3RyaW5nKCk6bnVsbD09YT8iIjphPyhhPSIiK2Esay50ZXN0KGEpP2EucmVwbGFjZShqLGIpOmEpOmErIiJ9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYXx8MD09PWE/bihhKSYmMD09PWEubGVuZ3RoPyEwOiExOiEwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm4oYT9hKyIuIjoiIikrYn12YXIgZz17fSxoPWEsaT17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjeDI3OyIsImAiOiImI3g2MDsifSxqPS9bJjw+IidgXS9nLGs9L1smPD4iJ2BdLztnLmV4dGVuZD1jO3ZhciBsPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Zy50b1N0cmluZz1sO3ZhciBtPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBhfTttKC94LykmJihtPWZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYiW29iamVjdCBGdW5jdGlvbl0iPT09bC5jYWxsKGEpfSk7dmFyIG07Zy5pc0Z1bmN0aW9uPW07dmFyIG49QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYT8iW29iamVjdCBBcnJheV0iPT09bC5jYWxsKGEpOiExfTtyZXR1cm4gZy5pc0FycmF5PW4sZy5lc2NhcGVFeHByZXNzaW9uPWQsZy5pc0VtcHR5PWUsZy5hcHBlbmRDb250ZXh0UGF0aD1mLGd9KGEpLGM9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYShhLGIpe3ZhciBkO2ImJmIuZmlyc3RMaW5lJiYoZD1iLmZpcnN0TGluZSxhKz0iIC0gIitkKyI6IitiLmZpcnN0Q29sdW1uKTtmb3IodmFyIGU9RXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKSxmPTA7ZjxjLmxlbmd0aDtmKyspdGhpc1tjW2ZdXT1lW2NbZl1dO2QmJih0aGlzLmxpbmVOdW1iZXI9ZCx0aGlzLmNvbHVtbj1iLmZpcnN0Q29sdW1uKX12YXIgYixjPVsiZGVzY3JpcHRpb24iLCJmaWxlTmFtZSIsImxpbmVOdW1iZXIiLCJtZXNzYWdlIiwibmFtZSIsIm51bWJlciIsInN0YWNrIl07cmV0dXJuIGEucHJvdG90eXBlPW5ldyBFcnJvcixiPWF9KCksZD1mdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBjKGEsYil7dGhpcy5oZWxwZXJzPWF8fHt9LHRoaXMucGFydGlhbHM9Ynx8e30sZCh0aGlzKX1mdW5jdGlvbiBkKGEpe2EucmVnaXN0ZXJIZWxwZXIoImhlbHBlck1pc3NpbmciLGZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMDt0aHJvdyBuZXcgZygiTWlzc2luZyBoZWxwZXI6ICciK2FyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLm5hbWUrIiciKX0pLGEucmVnaXN0ZXJIZWxwZXIoImJsb2NrSGVscGVyTWlzc2luZyIsZnVuY3Rpb24oYixjKXt2YXIgZD1jLmludmVyc2UsZT1jLmZuO2lmKGI9PT0hMClyZXR1cm4gZSh0aGlzKTtpZihiPT09ITF8fG51bGw9PWIpcmV0dXJuIGQodGhpcyk7aWYoayhiKSlyZXR1cm4gYi5sZW5ndGg+MD8oYy5pZHMmJihjLmlkcz1bYy5uYW1lXSksYS5oZWxwZXJzLmVhY2goYixjKSk6ZCh0aGlzKTtpZihjLmRhdGEmJmMuaWRzKXt2YXIgZz1xKGMuZGF0YSk7Zy5jb250ZXh0UGF0aD1mLmFwcGVuZENvbnRleHRQYXRoKGMuZGF0YS5jb250ZXh0UGF0aCxjLm5hbWUpLGM9e2RhdGE6Z319cmV0dXJuIGUoYixjKX0pLGEucmVnaXN0ZXJIZWxwZXIoImVhY2giLGZ1bmN0aW9uKGEsYil7aWYoIWIpdGhyb3cgbmV3IGcoIk11c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCIpO3ZhciBjLGQsZT1iLmZuLGg9Yi5pbnZlcnNlLGk9MCxqPSIiO2lmKGIuZGF0YSYmYi5pZHMmJihkPWYuYXBwZW5kQ29udGV4dFBhdGgoYi5kYXRhLmNvbnRleHRQYXRoLGIuaWRzWzBdKSsiLiIpLGwoYSkmJihhPWEuY2FsbCh0aGlzKSksYi5kYXRhJiYoYz1xKGIuZGF0YSkpLGEmJiJvYmplY3QiPT10eXBlb2YgYSlpZihrKGEpKWZvcih2YXIgbT1hLmxlbmd0aDttPmk7aSsrKWMmJihjLmluZGV4PWksYy5maXJzdD0wPT09aSxjLmxhc3Q9aT09PWEubGVuZ3RoLTEsZCYmKGMuY29udGV4dFBhdGg9ZCtpKSksais9ZShhW2ldLHtkYXRhOmN9KTtlbHNlIGZvcih2YXIgbiBpbiBhKWEuaGFzT3duUHJvcGVydHkobikmJihjJiYoYy5rZXk9bixjLmluZGV4PWksYy5maXJzdD0wPT09aSxkJiYoYy5jb250ZXh0UGF0aD1kK24pKSxqKz1lKGFbbl0se2RhdGE6Y30pLGkrKyk7cmV0dXJuIDA9PT1pJiYoaj1oKHRoaXMpKSxqfSksYS5yZWdpc3RlckhlbHBlcigiaWYiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGwoYSkmJihhPWEuY2FsbCh0aGlzKSksIWIuaGFzaC5pbmNsdWRlWmVybyYmIWF8fGYuaXNFbXB0eShhKT9iLmludmVyc2UodGhpcyk6Yi5mbih0aGlzKX0pLGEucmVnaXN0ZXJIZWxwZXIoInVubGVzcyIsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5oZWxwZXJzWyJpZiJdLmNhbGwodGhpcyxiLHtmbjpjLmludmVyc2UsaW52ZXJzZTpjLmZuLGhhc2g6Yy5oYXNofSl9KSxhLnJlZ2lzdGVySGVscGVyKCJ3aXRoIixmdW5jdGlvbihhLGIpe2woYSkmJihhPWEuY2FsbCh0aGlzKSk7dmFyIGM9Yi5mbjtpZihmLmlzRW1wdHkoYSkpcmV0dXJuIGIuaW52ZXJzZSh0aGlzKTtpZihiLmRhdGEmJmIuaWRzKXt2YXIgZD1xKGIuZGF0YSk7ZC5jb250ZXh0UGF0aD1mLmFwcGVuZENvbnRleHRQYXRoKGIuZGF0YS5jb250ZXh0UGF0aCxiLmlkc1swXSksYj17ZGF0YTpkfX1yZXR1cm4gYyhhLGIpfSksYS5yZWdpc3RlckhlbHBlcigibG9nIixmdW5jdGlvbihiLGMpe3ZhciBkPWMuZGF0YSYmbnVsbCE9Yy5kYXRhLmxldmVsP3BhcnNlSW50KGMuZGF0YS5sZXZlbCwxMCk6MTthLmxvZyhkLGIpfSksYS5yZWdpc3RlckhlbHBlcigibG9va3VwIixmdW5jdGlvbihhLGIpe3JldHVybiBhJiZhW2JdfSl9dmFyIGU9e30sZj1hLGc9YixoPSIyLjAuMCI7ZS5WRVJTSU9OPWg7dmFyIGk9NjtlLkNPTVBJTEVSX1JFVklTSU9OPWk7dmFyIGo9ezE6Ijw9IDEuMC5yYy4yIiwyOiI9PSAxLjAuMC1yYy4zIiwzOiI9PSAxLjAuMC1yYy40Iiw0OiI9PSAxLngueCIsNToiPT0gMi4wLjAtYWxwaGEueCIsNjoiPj0gMi4wLjAtYmV0YS4xIn07ZS5SRVZJU0lPTl9DSEFOR0VTPWo7dmFyIGs9Zi5pc0FycmF5LGw9Zi5pc0Z1bmN0aW9uLG09Zi50b1N0cmluZyxuPSJbb2JqZWN0IE9iamVjdF0iO2UuSGFuZGxlYmFyc0Vudmlyb25tZW50PWMsYy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmMsbG9nZ2VyOm8sbG9nOnAscmVnaXN0ZXJIZWxwZXI6ZnVuY3Rpb24oYSxiKXtpZihtLmNhbGwoYSk9PT1uKXtpZihiKXRocm93IG5ldyBnKCJBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMiKTtmLmV4dGVuZCh0aGlzLmhlbHBlcnMsYSl9ZWxzZSB0aGlzLmhlbHBlcnNbYV09Yn0sdW5yZWdpc3RlckhlbHBlcjpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5oZWxwZXJzW2FdfSxyZWdpc3RlclBhcnRpYWw6ZnVuY3Rpb24oYSxiKXttLmNhbGwoYSk9PT1uP2YuZXh0ZW5kKHRoaXMucGFydGlhbHMsYSk6dGhpcy5wYXJ0aWFsc1thXT1ifSx1bnJlZ2lzdGVyUGFydGlhbDpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5wYXJ0aWFsc1thXX19O3ZhciBvPXttZXRob2RNYXA6ezA6ImRlYnVnIiwxOiJpbmZvIiwyOiJ3YXJuIiwzOiJlcnJvciJ9LERFQlVHOjAsSU5GTzoxLFdBUk46MixFUlJPUjozLGxldmVsOjMsbG9nOmZ1bmN0aW9uKGEsYil7aWYoby5sZXZlbDw9YSl7dmFyIGM9by5tZXRob2RNYXBbYV07InVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlW2NdJiZjb25zb2xlW2NdLmNhbGwoY29uc29sZSxiKX19fTtlLmxvZ2dlcj1vO3ZhciBwPW8ubG9nO2UubG9nPXA7dmFyIHE9ZnVuY3Rpb24oYSl7dmFyIGI9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGIuX3BhcmVudD1hLGJ9O3JldHVybiBlLmNyZWF0ZUZyYW1lPXEsZX0oYixjKSxlPWZ1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXt2YXIgYj1hJiZhWzBdfHwxLGM9bTtpZihiIT09Yyl7aWYoYz5iKXt2YXIgZD1uW2NdLGU9bltiXTt0aHJvdyBuZXcgbCgiVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoIitkKyIpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoIitlKyIpLiIpfXRocm93IG5ldyBsKCJUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuIFBsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoIithWzFdKyIpLiIpfX1mdW5jdGlvbiBlKGEsYil7aWYoIWIpdGhyb3cgbmV3IGwoIk5vIGVudmlyb25tZW50IHBhc3NlZCB0byB0ZW1wbGF0ZSIpO2lmKCFhfHwhYS5tYWluKXRocm93IG5ldyBsKCJVbmtub3duIHRlbXBsYXRlIG9iamVjdDogIit0eXBlb2YgYSk7Yi5WTS5jaGVja1JldmlzaW9uKGEuY29tcGlsZXIpO3ZhciBjPWZ1bmN0aW9uKGMsZCxlLGYsZyxoLGksaixtKXtnJiYoZj1rLmV4dGVuZCh7fSxmLGcpKTt2YXIgbj1iLlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLGMsZSxmLGgsaSxqLG0pO2lmKG51bGw9PW4mJmIuY29tcGlsZSl7dmFyIG89e2hlbHBlcnM6aCxwYXJ0aWFsczppLGRhdGE6aixkZXB0aHM6bX07aVtlXT1iLmNvbXBpbGUoYyx7ZGF0YTp2b2lkIDAhPT1qLGNvbXBhdDphLmNvbXBhdH0sYiksbj1pW2VdKGYsbyl9aWYobnVsbCE9bil7aWYoZCl7Zm9yKHZhciBwPW4uc3BsaXQoIlxuIikscT0wLHI9cC5sZW5ndGg7cj5xJiYocFtxXXx8cSsxIT09cik7cSsrKXBbcV09ZCtwW3FdO249cC5qb2luKCJcbiIpfXJldHVybiBufXRocm93IG5ldyBsKCJUaGUgcGFydGlhbCAiK2UrIiBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlIil9LGQ9e2xvb2t1cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aCxkPTA7Yz5kO2QrKylpZihhW2RdJiZudWxsIT1hW2RdW2JdKXJldHVybiBhW2RdW2JdfSxsYW1iZGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgYT9hLmNhbGwoYik6YX0sZXNjYXBlRXhwcmVzc2lvbjprLmVzY2FwZUV4cHJlc3Npb24saW52b2tlUGFydGlhbDpjLGZuOmZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfSxwcm9ncmFtczpbXSxwcm9ncmFtOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLnByb2dyYW1zW2FdLGU9dGhpcy5mbihhKTtyZXR1cm4gYnx8Yz9kPWYodGhpcyxhLGUsYixjKTpkfHwoZD10aGlzLnByb2dyYW1zW2FdPWYodGhpcyxhLGUpKSxkfSxkYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKDthJiZiLS07KWE9YS5fcGFyZW50O3JldHVybiBhfSxtZXJnZTpmdW5jdGlvbihhLGIpe3ZhciBjPWF8fGI7cmV0dXJuIGEmJmImJmEhPT1iJiYoYz1rLmV4dGVuZCh7fSxiLGEpKSxjfSxub29wOmIuVk0ubm9vcCxjb21waWxlckluZm86YS5jb21waWxlcn0sZT1mdW5jdGlvbihiLGMpe2M9Y3x8e307dmFyIGY9Yy5kYXRhO2UuX3NldHVwKGMpLCFjLnBhcnRpYWwmJmEudXNlRGF0YSYmKGY9aShiLGYpKTt2YXIgZztyZXR1cm4gYS51c2VEZXB0aHMmJihnPWMuZGVwdGhzP1tiXS5jb25jYXQoYy5kZXB0aHMpOltiXSksYS5tYWluLmNhbGwoZCxiLGQuaGVscGVycyxkLnBhcnRpYWxzLGYsZyl9O3JldHVybiBlLmlzVG9wPSEwLGUuX3NldHVwPWZ1bmN0aW9uKGMpe2MucGFydGlhbD8oZC5oZWxwZXJzPWMuaGVscGVycyxkLnBhcnRpYWxzPWMucGFydGlhbHMpOihkLmhlbHBlcnM9ZC5tZXJnZShjLmhlbHBlcnMsYi5oZWxwZXJzKSxhLnVzZVBhcnRpYWwmJihkLnBhcnRpYWxzPWQubWVyZ2UoYy5wYXJ0aWFscyxiLnBhcnRpYWxzKSkpfSxlLl9jaGlsZD1mdW5jdGlvbihiLGMsZSl7aWYoYS51c2VEZXB0aHMmJiFlKXRocm93IG5ldyBsKCJtdXN0IHBhc3MgcGFyZW50IGRlcHRocyIpO3JldHVybiBmKGQsYixhW2JdLGMsZSl9LGV9ZnVuY3Rpb24gZihhLGIsYyxkLGUpe3ZhciBmPWZ1bmN0aW9uKGIsZil7cmV0dXJuIGY9Znx8e30sYy5jYWxsKGEsYixhLmhlbHBlcnMsYS5wYXJ0aWFscyxmLmRhdGF8fGQsZSYmW2JdLmNvbmNhdChlKSl9O3JldHVybiBmLnByb2dyYW09YixmLmRlcHRoPWU/ZS5sZW5ndGg6MCxmfWZ1bmN0aW9uIGcoYSxiLGMsZCxlLGYsZyl7dmFyIGg9e3BhcnRpYWw6ITAsaGVscGVyczpkLHBhcnRpYWxzOmUsZGF0YTpmLGRlcHRoczpnfTtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBsKCJUaGUgcGFydGlhbCAiK2IrIiBjb3VsZCBub3QgYmUgZm91bmQiKTtyZXR1cm4gYSBpbnN0YW5jZW9mIEZ1bmN0aW9uP2EoYyxoKTp2b2lkIDB9ZnVuY3Rpb24gaCgpe3JldHVybiIifWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gYiYmInJvb3QiaW4gYnx8KGI9Yj9vKGIpOnt9LGIucm9vdD1hKSxifXZhciBqPXt9LGs9YSxsPWIsbT1jLkNPTVBJTEVSX1JFVklTSU9OLG49Yy5SRVZJU0lPTl9DSEFOR0VTLG89Yy5jcmVhdGVGcmFtZTtyZXR1cm4gai5jaGVja1JldmlzaW9uPWQsai50ZW1wbGF0ZT1lLGoucHJvZ3JhbT1mLGouaW52b2tlUGFydGlhbD1nLGoubm9vcD1oLGp9KGIsYyxkKSxmPWZ1bmN0aW9uKGEsYixjLGQsZSl7InVzZSBzdHJpY3QiO3ZhciBmLGc9YSxoPWIsaT1jLGo9ZCxrPWUsbD1mdW5jdGlvbigpe3ZhciBhPW5ldyBnLkhhbmRsZWJhcnNFbnZpcm9ubWVudDtyZXR1cm4gai5leHRlbmQoYSxnKSxhLlNhZmVTdHJpbmc9aCxhLkV4Y2VwdGlvbj1pLGEuVXRpbHM9aixhLmVzY2FwZUV4cHJlc3Npb249ai5lc2NhcGVFeHByZXNzaW9uLGEuVk09ayxhLnRlbXBsYXRlPWZ1bmN0aW9uKGIpe3JldHVybiBrLnRlbXBsYXRlKGIsYSl9LGF9LG09bCgpO3JldHVybiBtLmNyZWF0ZT1sLG1bImRlZmF1bHQiXT1tLGY9bX0oZCxhLGMsYixlKSxnPWZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGEpe2E9YXx8e30sdGhpcy5maXJzdExpbmU9YS5maXJzdF9saW5lLHRoaXMuZmlyc3RDb2x1bW49YS5maXJzdF9jb2x1bW4sdGhpcy5sYXN0Q29sdW1uPWEubGFzdF9jb2x1bW4sdGhpcy5sYXN0TGluZT1hLmxhc3RfbGluZX12YXIgYyxkPWEsZT17UHJvZ3JhbU5vZGU6ZnVuY3Rpb24oYSxjLGQpe2IuY2FsbCh0aGlzLGQpLHRoaXMudHlwZT0icHJvZ3JhbSIsdGhpcy5zdGF0ZW1lbnRzPWEsdGhpcy5zdHJpcD1jfSxNdXN0YWNoZU5vZGU6ZnVuY3Rpb24oYSxjLGQsZixnKXtpZihiLmNhbGwodGhpcyxnKSx0aGlzLnR5cGU9Im11c3RhY2hlIix0aGlzLnN0cmlwPWYsbnVsbCE9ZCYmZC5jaGFyQXQpe3ZhciBoPWQuY2hhckF0KDMpfHxkLmNoYXJBdCgyKTt0aGlzLmVzY2FwZWQ9InsiIT09aCYmIiYiIT09aH1lbHNlIHRoaXMuZXNjYXBlZD0hIWQ7dGhpcy5zZXhwcj1hIGluc3RhbmNlb2YgZS5TZXhwck5vZGU/YTpuZXcgZS5TZXhwck5vZGUoYSxjKSx0aGlzLmlkPXRoaXMuc2V4cHIuaWQsdGhpcy5wYXJhbXM9dGhpcy5zZXhwci5wYXJhbXMsdGhpcy5oYXNoPXRoaXMuc2V4cHIuaGFzaCx0aGlzLmVsaWdpYmxlSGVscGVyPXRoaXMuc2V4cHIuZWxpZ2libGVIZWxwZXIsdGhpcy5pc0hlbHBlcj10aGlzLnNleHByLmlzSGVscGVyfSxTZXhwck5vZGU6ZnVuY3Rpb24oYSxjLGQpe2IuY2FsbCh0aGlzLGQpLHRoaXMudHlwZT0ic2V4cHIiLHRoaXMuaGFzaD1jO3ZhciBlPXRoaXMuaWQ9YVswXSxmPXRoaXMucGFyYW1zPWEuc2xpY2UoMSk7dGhpcy5pc0hlbHBlcj0hKCFmLmxlbmd0aCYmIWMpLHRoaXMuZWxpZ2libGVIZWxwZXI9dGhpcy5pc0hlbHBlcnx8ZS5pc1NpbXBsZX0sUGFydGlhbE5vZGU6ZnVuY3Rpb24oYSxjLGQsZSxmKXtiLmNhbGwodGhpcyxmKSx0aGlzLnR5cGU9InBhcnRpYWwiLHRoaXMucGFydGlhbE5hbWU9YSx0aGlzLmNvbnRleHQ9Yyx0aGlzLmhhc2g9ZCx0aGlzLnN0cmlwPWUsdGhpcy5zdHJpcC5pbmxpbmVTdGFuZGFsb25lPSEwfSxCbG9ja05vZGU6ZnVuY3Rpb24oYSxjLGQsZSxmKXtiLmNhbGwodGhpcyxmKSx0aGlzLnR5cGU9ImJsb2NrIix0aGlzLm11c3RhY2hlPWEsdGhpcy5wcm9ncmFtPWMsdGhpcy5pbnZlcnNlPWQsdGhpcy5zdHJpcD1lLGQmJiFjJiYodGhpcy5pc0ludmVyc2U9ITApfSxSYXdCbG9ja05vZGU6ZnVuY3Rpb24oYSxjLGYsZyl7aWYoYi5jYWxsKHRoaXMsZyksYS5zZXhwci5pZC5vcmlnaW5hbCE9PWYpdGhyb3cgbmV3IGQoYS5zZXhwci5pZC5vcmlnaW5hbCsiIGRvZXNuJ3QgbWF0Y2ggIitmLHRoaXMpO2M9bmV3IGUuQ29udGVudE5vZGUoYyxnKSx0aGlzLnR5cGU9ImJsb2NrIix0aGlzLm11c3RhY2hlPWEsdGhpcy5wcm9ncmFtPW5ldyBlLlByb2dyYW1Ob2RlKFtjXSx7fSxnKX0sQ29udGVudE5vZGU6ZnVuY3Rpb24oYSxjKXtiLmNhbGwodGhpcyxjKSx0aGlzLnR5cGU9ImNvbnRlbnQiLHRoaXMub3JpZ2luYWw9dGhpcy5zdHJpbmc9YX0sSGFzaE5vZGU6ZnVuY3Rpb24oYSxjKXtiLmNhbGwodGhpcyxjKSx0aGlzLnR5cGU9Imhhc2giLHRoaXMucGFpcnM9YX0sSWROb2RlOmZ1bmN0aW9uKGEsYyl7Yi5jYWxsKHRoaXMsYyksdGhpcy50eXBlPSJJRCI7Zm9yKHZhciBlPSIiLGY9W10sZz0wLGg9IiIsaT0wLGo9YS5sZW5ndGg7aj5pO2krKyl7dmFyIGs9YVtpXS5wYXJ0O2lmKGUrPShhW2ldLnNlcGFyYXRvcnx8IiIpK2ssIi4uIj09PWt8fCIuIj09PWt8fCJ0aGlzIj09PWspe2lmKGYubGVuZ3RoPjApdGhyb3cgbmV3IGQoIkludmFsaWQgcGF0aDogIitlLHRoaXMpOyIuLiI9PT1rPyhnKyssaCs9Ii4uLyIpOnRoaXMuaXNTY29wZWQ9ITB9ZWxzZSBmLnB1c2goayl9dGhpcy5vcmlnaW5hbD1lLHRoaXMucGFydHM9Zix0aGlzLnN0cmluZz1mLmpvaW4oIi4iKSx0aGlzLmRlcHRoPWcsdGhpcy5pZE5hbWU9aCt0aGlzLnN0cmluZyx0aGlzLmlzU2ltcGxlPTE9PT1hLmxlbmd0aCYmIXRoaXMuaXNTY29wZWQmJjA9PT1nLHRoaXMuc3RyaW5nTW9kZVZhbHVlPXRoaXMuc3RyaW5nfSxQYXJ0aWFsTmFtZU5vZGU6ZnVuY3Rpb24oYSxjKXtiLmNhbGwodGhpcyxjKSx0aGlzLnR5cGU9IlBBUlRJQUxfTkFNRSIsdGhpcy5uYW1lPWEub3JpZ2luYWx9LERhdGFOb2RlOmZ1bmN0aW9uKGEsYyl7Yi5jYWxsKHRoaXMsYyksdGhpcy50eXBlPSJEQVRBIix0aGlzLmlkPWEsdGhpcy5zdHJpbmdNb2RlVmFsdWU9YS5zdHJpbmdNb2RlVmFsdWUsdGhpcy5pZE5hbWU9IkAiK2Euc3RyaW5nTW9kZVZhbHVlfSxTdHJpbmdOb2RlOmZ1bmN0aW9uKGEsYyl7Yi5jYWxsKHRoaXMsYyksdGhpcy50eXBlPSJTVFJJTkciLHRoaXMub3JpZ2luYWw9dGhpcy5zdHJpbmc9dGhpcy5zdHJpbmdNb2RlVmFsdWU9YX0sTnVtYmVyTm9kZTpmdW5jdGlvbihhLGMpe2IuY2FsbCh0aGlzLGMpLHRoaXMudHlwZT0iTlVNQkVSIix0aGlzLm9yaWdpbmFsPXRoaXMubnVtYmVyPWEsdGhpcy5zdHJpbmdNb2RlVmFsdWU9TnVtYmVyKGEpfSxCb29sZWFuTm9kZTpmdW5jdGlvbihhLGMpe2IuY2FsbCh0aGlzLGMpLHRoaXMudHlwZT0iQk9PTEVBTiIsdGhpcy5ib29sPWEsdGhpcy5zdHJpbmdNb2RlVmFsdWU9InRydWUiPT09YX0sQ29tbWVudE5vZGU6ZnVuY3Rpb24oYSxjKXtiLmNhbGwodGhpcyxjKSx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMuY29tbWVudD1hLHRoaXMuc3RyaXA9e2lubGluZVN0YW5kYWxvbmU6ITB9fX07cmV0dXJuIGM9ZX0oYyksaD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgYSxiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMueXk9e319dmFyIGI9e3RyYWNlOmZ1bmN0aW9uKCl7fSx5eTp7fSxzeW1ib2xzXzp7ZXJyb3I6Mixyb290OjMscHJvZ3JhbTo0LEVPRjo1LHByb2dyYW1fcmVwZXRpdGlvbjA6NixzdGF0ZW1lbnQ6NyxtdXN0YWNoZTo4LGJsb2NrOjkscmF3QmxvY2s6MTAscGFydGlhbDoxMSxDT05URU5UOjEyLENPTU1FTlQ6MTMsb3BlblJhd0Jsb2NrOjE0LEVORF9SQVdfQkxPQ0s6MTUsT1BFTl9SQVdfQkxPQ0s6MTYsc2V4cHI6MTcsQ0xPU0VfUkFXX0JMT0NLOjE4LG9wZW5CbG9jazoxOSxibG9ja19vcHRpb24wOjIwLGNsb3NlQmxvY2s6MjEsb3BlbkludmVyc2U6MjIsYmxvY2tfb3B0aW9uMToyMyxPUEVOX0JMT0NLOjI0LENMT1NFOjI1LE9QRU5fSU5WRVJTRToyNixpbnZlcnNlQW5kUHJvZ3JhbToyNyxJTlZFUlNFOjI4LE9QRU5fRU5EQkxPQ0s6MjkscGF0aDozMCxPUEVOOjMxLE9QRU5fVU5FU0NBUEVEOjMyLENMT1NFX1VORVNDQVBFRDozMyxPUEVOX1BBUlRJQUw6MzQscGFydGlhbE5hbWU6MzUscGFyYW06MzYscGFydGlhbF9vcHRpb24wOjM3LHBhcnRpYWxfb3B0aW9uMTozOCxzZXhwcl9yZXBldGl0aW9uMDozOSxzZXhwcl9vcHRpb24wOjQwLGRhdGFOYW1lOjQxLFNUUklORzo0MixOVU1CRVI6NDMsQk9PTEVBTjo0NCxPUEVOX1NFWFBSOjQ1LENMT1NFX1NFWFBSOjQ2LGhhc2g6NDcsaGFzaF9yZXBldGl0aW9uX3BsdXMwOjQ4LGhhc2hTZWdtZW50OjQ5LElEOjUwLEVRVUFMUzo1MSxEQVRBOjUyLHBhdGhTZWdtZW50czo1MyxTRVA6NTQsJGFjY2VwdDowLCRlbmQ6MX0sdGVybWluYWxzXzp7MjoiZXJyb3IiLDU6IkVPRiIsMTI6IkNPTlRFTlQiLDEzOiJDT01NRU5UIiwxNToiRU5EX1JBV19CTE9DSyIsMTY6Ik9QRU5fUkFXX0JMT0NLIiwxODoiQ0xPU0VfUkFXX0JMT0NLIiwyNDoiT1BFTl9CTE9DSyIsMjU6IkNMT1NFIiwyNjoiT1BFTl9JTlZFUlNFIiwyODoiSU5WRVJTRSIsMjk6Ik9QRU5fRU5EQkxPQ0siLDMxOiJPUEVOIiwzMjoiT1BFTl9VTkVTQ0FQRUQiLDMzOiJDTE9TRV9VTkVTQ0FQRUQiLDM0OiJPUEVOX1BBUlRJQUwiLDQyOiJTVFJJTkciLDQzOiJOVU1CRVIiLDQ0OiJCT09MRUFOIiw0NToiT1BFTl9TRVhQUiIsNDY6IkNMT1NFX1NFWFBSIiw1MDoiSUQiLDUxOiJFUVVBTFMiLDUyOiJEQVRBIiw1NDoiU0VQIn0scHJvZHVjdGlvbnNfOlswLFszLDJdLFs0LDFdLFs3LDFdLFs3LDFdLFs3LDFdLFs3LDFdLFs3LDFdLFs3LDFdLFsxMCwzXSxbMTQsM10sWzksNF0sWzksNF0sWzE5LDNdLFsyMiwzXSxbMjcsMl0sWzIxLDNdLFs4LDNdLFs4LDNdLFsxMSw1XSxbMTEsNF0sWzE3LDNdLFsxNywxXSxbMzYsMV0sWzM2LDFdLFszNiwxXSxbMzYsMV0sWzM2LDFdLFszNiwzXSxbNDcsMV0sWzQ5LDNdLFszNSwxXSxbMzUsMV0sWzM1LDFdLFs0MSwyXSxbMzAsMV0sWzUzLDNdLFs1MywxXSxbNiwwXSxbNiwyXSxbMjAsMF0sWzIwLDFdLFsyMywwXSxbMjMsMV0sWzM3LDBdLFszNywxXSxbMzgsMF0sWzM4LDFdLFszOSwwXSxbMzksMl0sWzQwLDBdLFs0MCwxXSxbNDgsMV0sWzQ4LDJdXSxwZXJmb3JtQWN0aW9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1mLmxlbmd0aC0xO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQucHJlcGFyZVByb2dyYW0oZltnLTFdLnN0YXRlbWVudHMsITApLGZbZy0xXTtjYXNlIDI6dGhpcy4kPW5ldyBkLlByb2dyYW1Ob2RlKGQucHJlcGFyZVByb2dyYW0oZltnXSkse30sdGhpcy5fJCk7YnJlYWs7Y2FzZSAzOnRoaXMuJD1mW2ddO2JyZWFrO2Nhc2UgNDp0aGlzLiQ9ZltnXTticmVhaztjYXNlIDU6dGhpcy4kPWZbZ107YnJlYWs7Y2FzZSA2OnRoaXMuJD1mW2ddO2JyZWFrO2Nhc2UgNzp0aGlzLiQ9bmV3IGQuQ29udGVudE5vZGUoZltnXSx0aGlzLl8kKTticmVhaztjYXNlIDg6dGhpcy4kPW5ldyBkLkNvbW1lbnROb2RlKGZbZ10sdGhpcy5fJCk7YnJlYWs7Y2FzZSA5OnRoaXMuJD1uZXcgZC5SYXdCbG9ja05vZGUoZltnLTJdLGZbZy0xXSxmW2ddLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMTA6dGhpcy4kPW5ldyBkLk11c3RhY2hlTm9kZShmW2ctMV0sbnVsbCwiIiwiIix0aGlzLl8kKTticmVhaztjYXNlIDExOnRoaXMuJD1kLnByZXBhcmVCbG9jayhmW2ctM10sZltnLTJdLGZbZy0xXSxmW2ddLCExLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMTI6dGhpcy4kPWQucHJlcGFyZUJsb2NrKGZbZy0zXSxmW2ctMl0sZltnLTFdLGZbZ10sITAsdGhpcy5fJCk7YnJlYWs7Y2FzZSAxMzp0aGlzLiQ9bmV3IGQuTXVzdGFjaGVOb2RlKGZbZy0xXSxudWxsLGZbZy0yXSxkLnN0cmlwRmxhZ3MoZltnLTJdLGZbZ10pLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMTQ6dGhpcy4kPW5ldyBkLk11c3RhY2hlTm9kZShmW2ctMV0sbnVsbCxmW2ctMl0sZC5zdHJpcEZsYWdzKGZbZy0yXSxmW2ddKSx0aGlzLl8kKTticmVhaztjYXNlIDE1OnRoaXMuJD17c3RyaXA6ZC5zdHJpcEZsYWdzKGZbZy0xXSxmW2ctMV0pLHByb2dyYW06ZltnXX07YnJlYWs7Y2FzZSAxNjp0aGlzLiQ9e3BhdGg6ZltnLTFdLHN0cmlwOmQuc3RyaXBGbGFncyhmW2ctMl0sZltnXSl9O2JyZWFrO2Nhc2UgMTc6dGhpcy4kPW5ldyBkLk11c3RhY2hlTm9kZShmW2ctMV0sbnVsbCxmW2ctMl0sZC5zdHJpcEZsYWdzKGZbZy0yXSxmW2ddKSx0aGlzLl8kKTticmVhaztjYXNlIDE4OnRoaXMuJD1uZXcgZC5NdXN0YWNoZU5vZGUoZltnLTFdLG51bGwsZltnLTJdLGQuc3RyaXBGbGFncyhmW2ctMl0sZltnXSksdGhpcy5fJCk7YnJlYWs7Y2FzZSAxOTp0aGlzLiQ9bmV3IGQuUGFydGlhbE5vZGUoZltnLTNdLGZbZy0yXSxmW2ctMV0sZC5zdHJpcEZsYWdzKGZbZy00XSxmW2ddKSx0aGlzLl8kKTticmVhaztjYXNlIDIwOnRoaXMuJD1uZXcgZC5QYXJ0aWFsTm9kZShmW2ctMl0sdm9pZCAwLGZbZy0xXSxkLnN0cmlwRmxhZ3MoZltnLTNdLGZbZ10pLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMjE6dGhpcy4kPW5ldyBkLlNleHByTm9kZShbZltnLTJdXS5jb25jYXQoZltnLTFdKSxmW2ddLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMjI6dGhpcy4kPW5ldyBkLlNleHByTm9kZShbZltnXV0sbnVsbCx0aGlzLl8kKTticmVhaztjYXNlIDIzOnRoaXMuJD1mW2ddO2JyZWFrO2Nhc2UgMjQ6dGhpcy4kPW5ldyBkLlN0cmluZ05vZGUoZltnXSx0aGlzLl8kKTticmVhaztjYXNlIDI1OnRoaXMuJD1uZXcgZC5OdW1iZXJOb2RlKGZbZ10sdGhpcy5fJCk7YnJlYWs7Y2FzZSAyNjp0aGlzLiQ9bmV3IGQuQm9vbGVhbk5vZGUoZltnXSx0aGlzLl8kKTticmVhaztjYXNlIDI3OnRoaXMuJD1mW2ddO2JyZWFrO2Nhc2UgMjg6ZltnLTFdLmlzSGVscGVyPSEwLHRoaXMuJD1mW2ctMV07YnJlYWs7Y2FzZSAyOTp0aGlzLiQ9bmV3IGQuSGFzaE5vZGUoZltnXSx0aGlzLl8kKTticmVhaztjYXNlIDMwOnRoaXMuJD1bZltnLTJdLGZbZ11dO2JyZWFrO2Nhc2UgMzE6dGhpcy4kPW5ldyBkLlBhcnRpYWxOYW1lTm9kZShmW2ddLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMzI6dGhpcy4kPW5ldyBkLlBhcnRpYWxOYW1lTm9kZShuZXcgZC5TdHJpbmdOb2RlKGZbZ10sdGhpcy5fJCksdGhpcy5fJCk7YnJlYWs7Y2FzZSAzMzp0aGlzLiQ9bmV3IGQuUGFydGlhbE5hbWVOb2RlKG5ldyBkLk51bWJlck5vZGUoZltnXSx0aGlzLl8kKSk7YnJlYWs7Y2FzZSAzNDp0aGlzLiQ9bmV3IGQuRGF0YU5vZGUoZltnXSx0aGlzLl8kKTticmVhaztjYXNlIDM1OnRoaXMuJD1uZXcgZC5JZE5vZGUoZltnXSx0aGlzLl8kKTticmVhaztjYXNlIDM2OmZbZy0yXS5wdXNoKHtwYXJ0OmZbZ10sc2VwYXJhdG9yOmZbZy0xXX0pLHRoaXMuJD1mW2ctMl07YnJlYWs7Y2FzZSAzNzp0aGlzLiQ9W3twYXJ0OmZbZ119XTticmVhaztjYXNlIDM4OnRoaXMuJD1bXTticmVhaztjYXNlIDM5OmZbZy0xXS5wdXNoKGZbZ10pO2JyZWFrO2Nhc2UgNDg6dGhpcy4kPVtdO2JyZWFrO2Nhc2UgNDk6ZltnLTFdLnB1c2goZltnXSk7YnJlYWs7Y2FzZSA1Mjp0aGlzLiQ9W2ZbZ11dO2JyZWFrO2Nhc2UgNTM6ZltnLTFdLnB1c2goZltnXSl9fSx0YWJsZTpbezM6MSw0OjIsNTpbMiwzOF0sNjozLDEyOlsyLDM4XSwxMzpbMiwzOF0sMTY6WzIsMzhdLDI0OlsyLDM4XSwyNjpbMiwzOF0sMzE6WzIsMzhdLDMyOlsyLDM4XSwzNDpbMiwzOF19LHsxOlszXX0sezU6WzEsNF19LHs1OlsyLDJdLDc6NSw4OjYsOTo3LDEwOjgsMTE6OSwxMjpbMSwxMF0sMTM6WzEsMTFdLDE0OjE2LDE2OlsxLDIwXSwxOToxNCwyMjoxNSwyNDpbMSwxOF0sMjY6WzEsMTldLDI4OlsyLDJdLDI5OlsyLDJdLDMxOlsxLDEyXSwzMjpbMSwxM10sMzQ6WzEsMTddfSx7MTpbMiwxXX0sezU6WzIsMzldLDEyOlsyLDM5XSwxMzpbMiwzOV0sMTY6WzIsMzldLDI0OlsyLDM5XSwyNjpbMiwzOV0sMjg6WzIsMzldLDI5OlsyLDM5XSwzMTpbMiwzOV0sMzI6WzIsMzldLDM0OlsyLDM5XX0sezU6WzIsM10sMTI6WzIsM10sMTM6WzIsM10sMTY6WzIsM10sMjQ6WzIsM10sMjY6WzIsM10sMjg6WzIsM10sMjk6WzIsM10sMzE6WzIsM10sMzI6WzIsM10sMzQ6WzIsM119LHs1OlsyLDRdLDEyOlsyLDRdLDEzOlsyLDRdLDE2OlsyLDRdLDI0OlsyLDRdLDI2OlsyLDRdLDI4OlsyLDRdLDI5OlsyLDRdLDMxOlsyLDRdLDMyOlsyLDRdLDM0OlsyLDRdfSx7NTpbMiw1XSwxMjpbMiw1XSwxMzpbMiw1XSwxNjpbMiw1XSwyNDpbMiw1XSwyNjpbMiw1XSwyODpbMiw1XSwyOTpbMiw1XSwzMTpbMiw1XSwzMjpbMiw1XSwzNDpbMiw1XX0sezU6WzIsNl0sMTI6WzIsNl0sMTM6WzIsNl0sMTY6WzIsNl0sMjQ6WzIsNl0sMjY6WzIsNl0sMjg6WzIsNl0sMjk6WzIsNl0sMzE6WzIsNl0sMzI6WzIsNl0sMzQ6WzIsNl19LHs1OlsyLDddLDEyOlsyLDddLDEzOlsyLDddLDE2OlsyLDddLDI0OlsyLDddLDI2OlsyLDddLDI4OlsyLDddLDI5OlsyLDddLDMxOlsyLDddLDMyOlsyLDddLDM0OlsyLDddfSx7NTpbMiw4XSwxMjpbMiw4XSwxMzpbMiw4XSwxNjpbMiw4XSwyNDpbMiw4XSwyNjpbMiw4XSwyODpbMiw4XSwyOTpbMiw4XSwzMTpbMiw4XSwzMjpbMiw4XSwzNDpbMiw4XX0sezE3OjIxLDMwOjIyLDQxOjIzLDUwOlsxLDI2XSw1MjpbMSwyNV0sNTM6MjR9LHsxNzoyNywzMDoyMiw0MToyMyw1MDpbMSwyNl0sNTI6WzEsMjVdLDUzOjI0fSx7NDoyOCw2OjMsMTI6WzIsMzhdLDEzOlsyLDM4XSwxNjpbMiwzOF0sMjQ6WzIsMzhdLDI2OlsyLDM4XSwyODpbMiwzOF0sMjk6WzIsMzhdLDMxOlsyLDM4XSwzMjpbMiwzOF0sMzQ6WzIsMzhdfSx7NDoyOSw2OjMsMTI6WzIsMzhdLDEzOlsyLDM4XSwxNjpbMiwzOF0sMjQ6WzIsMzhdLDI2OlsyLDM4XSwyODpbMiwzOF0sMjk6WzIsMzhdLDMxOlsyLDM4XSwzMjpbMiwzOF0sMzQ6WzIsMzhdfSx7MTI6WzEsMzBdfSx7MzA6MzIsMzU6MzEsNDI6WzEsMzNdLDQzOlsxLDM0XSw1MDpbMSwyNl0sNTM6MjR9LHsxNzozNSwzMDoyMiw0MToyMyw1MDpbMSwyNl0sNTI6WzEsMjVdLDUzOjI0fSx7MTc6MzYsMzA6MjIsNDE6MjMsNTA6WzEsMjZdLDUyOlsxLDI1XSw1MzoyNH0sezE3OjM3LDMwOjIyLDQxOjIzLDUwOlsxLDI2XSw1MjpbMSwyNV0sNTM6MjR9LHsyNTpbMSwzOF19LHsxODpbMiw0OF0sMjU6WzIsNDhdLDMzOlsyLDQ4XSwzOTozOSw0MjpbMiw0OF0sNDM6WzIsNDhdLDQ0OlsyLDQ4XSw0NTpbMiw0OF0sNDY6WzIsNDhdLDUwOlsyLDQ4XSw1MjpbMiw0OF19LHsxODpbMiwyMl0sMjU6WzIsMjJdLDMzOlsyLDIyXSw0NjpbMiwyMl19LHsxODpbMiwzNV0sMjU6WzIsMzVdLDMzOlsyLDM1XSw0MjpbMiwzNV0sNDM6WzIsMzVdLDQ0OlsyLDM1XSw0NTpbMiwzNV0sNDY6WzIsMzVdLDUwOlsyLDM1XSw1MjpbMiwzNV0sNTQ6WzEsNDBdfSx7MzA6NDEsNTA6WzEsMjZdLDUzOjI0fSx7MTg6WzIsMzddLDI1OlsyLDM3XSwzMzpbMiwzN10sNDI6WzIsMzddLDQzOlsyLDM3XSw0NDpbMiwzN10sNDU6WzIsMzddLDQ2OlsyLDM3XSw1MDpbMiwzN10sNTI6WzIsMzddLDU0OlsyLDM3XX0sezMzOlsxLDQyXX0sezIwOjQzLDI3OjQ0LDI4OlsxLDQ1XSwyOTpbMiw0MF19LHsyMzo0NiwyNzo0NywyODpbMSw0NV0sMjk6WzIsNDJdfSx7MTU6WzEsNDhdfSx7MjU6WzIsNDZdLDMwOjUxLDM2OjQ5LDM4OjUwLDQxOjU1LDQyOlsxLDUyXSw0MzpbMSw1M10sNDQ6WzEsNTRdLDQ1OlsxLDU2XSw0Nzo1Nyw0ODo1OCw0OTo2MCw1MDpbMSw1OV0sNTI6WzEsMjVdLDUzOjI0fSx7MjU6WzIsMzFdLDQyOlsyLDMxXSw0MzpbMiwzMV0sNDQ6WzIsMzFdLDQ1OlsyLDMxXSw1MDpbMiwzMV0sNTI6WzIsMzFdfSx7MjU6WzIsMzJdLDQyOlsyLDMyXSw0MzpbMiwzMl0sNDQ6WzIsMzJdLDQ1OlsyLDMyXSw1MDpbMiwzMl0sNTI6WzIsMzJdfSx7MjU6WzIsMzNdLDQyOlsyLDMzXSw0MzpbMiwzM10sNDQ6WzIsMzNdLDQ1OlsyLDMzXSw1MDpbMiwzM10sNTI6WzIsMzNdfSx7MjU6WzEsNjFdfSx7MjU6WzEsNjJdfSx7MTg6WzEsNjNdfSx7NTpbMiwxN10sMTI6WzIsMTddLDEzOlsyLDE3XSwxNjpbMiwxN10sMjQ6WzIsMTddLDI2OlsyLDE3XSwyODpbMiwxN10sMjk6WzIsMTddLDMxOlsyLDE3XSwzMjpbMiwxN10sMzQ6WzIsMTddfSx7MTg6WzIsNTBdLDI1OlsyLDUwXSwzMDo1MSwzMzpbMiw1MF0sMzY6NjUsNDA6NjQsNDE6NTUsNDI6WzEsNTJdLDQzOlsxLDUzXSw0NDpbMSw1NF0sNDU6WzEsNTZdLDQ2OlsyLDUwXSw0Nzo2Niw0ODo1OCw0OTo2MCw1MDpbMSw1OV0sNTI6WzEsMjVdLDUzOjI0fSx7NTA6WzEsNjddfSx7MTg6WzIsMzRdLDI1OlsyLDM0XSwzMzpbMiwzNF0sNDI6WzIsMzRdLDQzOlsyLDM0XSw0NDpbMiwzNF0sNDU6WzIsMzRdLDQ2OlsyLDM0XSw1MDpbMiwzNF0sNTI6WzIsMzRdfSx7NTpbMiwxOF0sMTI6WzIsMThdLDEzOlsyLDE4XSwxNjpbMiwxOF0sMjQ6WzIsMThdLDI2OlsyLDE4XSwyODpbMiwxOF0sMjk6WzIsMThdLDMxOlsyLDE4XSwzMjpbMiwxOF0sMzQ6WzIsMThdfSx7MjE6NjgsMjk6WzEsNjldfSx7Mjk6WzIsNDFdfSx7NDo3MCw2OjMsMTI6WzIsMzhdLDEzOlsyLDM4XSwxNjpbMiwzOF0sMjQ6WzIsMzhdLDI2OlsyLDM4XSwyOTpbMiwzOF0sMzE6WzIsMzhdLDMyOlsyLDM4XSwzNDpbMiwzOF19LHsyMTo3MSwyOTpbMSw2OV19LHsyOTpbMiw0M119LHs1OlsyLDldLDEyOlsyLDldLDEzOlsyLDldLDE2OlsyLDldLDI0OlsyLDldLDI2OlsyLDldLDI4OlsyLDldLDI5OlsyLDldLDMxOlsyLDldLDMyOlsyLDldLDM0OlsyLDldfSx7MjU6WzIsNDRdLDM3OjcyLDQ3OjczLDQ4OjU4LDQ5OjYwLDUwOlsxLDc0XX0sezI1OlsxLDc1XX0sezE4OlsyLDIzXSwyNTpbMiwyM10sMzM6WzIsMjNdLDQyOlsyLDIzXSw0MzpbMiwyM10sNDQ6WzIsMjNdLDQ1OlsyLDIzXSw0NjpbMiwyM10sNTA6WzIsMjNdLDUyOlsyLDIzXX0sezE4OlsyLDI0XSwyNTpbMiwyNF0sMzM6WzIsMjRdLDQyOlsyLDI0XSw0MzpbMiwyNF0sNDQ6WzIsMjRdLDQ1OlsyLDI0XSw0NjpbMiwyNF0sNTA6WzIsMjRdLDUyOlsyLDI0XX0sezE4OlsyLDI1XSwyNTpbMiwyNV0sMzM6WzIsMjVdLDQyOlsyLDI1XSw0MzpbMiwyNV0sNDQ6WzIsMjVdLDQ1OlsyLDI1XSw0NjpbMiwyNV0sNTA6WzIsMjVdLDUyOlsyLDI1XX0sezE4OlsyLDI2XSwyNTpbMiwyNl0sMzM6WzIsMjZdLDQyOlsyLDI2XSw0MzpbMiwyNl0sNDQ6WzIsMjZdLDQ1OlsyLDI2XSw0NjpbMiwyNl0sNTA6WzIsMjZdLDUyOlsyLDI2XX0sezE4OlsyLDI3XSwyNTpbMiwyN10sMzM6WzIsMjddLDQyOlsyLDI3XSw0MzpbMiwyN10sNDQ6WzIsMjddLDQ1OlsyLDI3XSw0NjpbMiwyN10sNTA6WzIsMjddLDUyOlsyLDI3XX0sezE3Ojc2LDMwOjIyLDQxOjIzLDUwOlsxLDI2XSw1MjpbMSwyNV0sNTM6MjR9LHsyNTpbMiw0N119LHsxODpbMiwyOV0sMjU6WzIsMjldLDMzOlsyLDI5XSw0NjpbMiwyOV0sNDk6NzcsNTA6WzEsNzRdfSx7MTg6WzIsMzddLDI1OlsyLDM3XSwzMzpbMiwzN10sNDI6WzIsMzddLDQzOlsyLDM3XSw0NDpbMiwzN10sNDU6WzIsMzddLDQ2OlsyLDM3XSw1MDpbMiwzN10sNTE6WzEsNzhdLDUyOlsyLDM3XSw1NDpbMiwzN119LHsxODpbMiw1Ml0sMjU6WzIsNTJdLDMzOlsyLDUyXSw0NjpbMiw1Ml0sNTA6WzIsNTJdfSx7MTI6WzIsMTNdLDEzOlsyLDEzXSwxNjpbMiwxM10sMjQ6WzIsMTNdLDI2OlsyLDEzXSwyODpbMiwxM10sMjk6WzIsMTNdLDMxOlsyLDEzXSwzMjpbMiwxM10sMzQ6WzIsMTNdfSx7MTI6WzIsMTRdLDEzOlsyLDE0XSwxNjpbMiwxNF0sMjQ6WzIsMTRdLDI2OlsyLDE0XSwyODpbMiwxNF0sMjk6WzIsMTRdLDMxOlsyLDE0XSwzMjpbMiwxNF0sMzQ6WzIsMTRdfSx7MTI6WzIsMTBdfSx7MTg6WzIsMjFdLDI1OlsyLDIxXSwzMzpbMiwyMV0sNDY6WzIsMjFdfSx7MTg6WzIsNDldLDI1OlsyLDQ5XSwzMzpbMiw0OV0sNDI6WzIsNDldLDQzOlsyLDQ5XSw0NDpbMiw0OV0sNDU6WzIsNDldLDQ2OlsyLDQ5XSw1MDpbMiw0OV0sNTI6WzIsNDldfSx7MTg6WzIsNTFdLDI1OlsyLDUxXSwzMzpbMiw1MV0sNDY6WzIsNTFdfSx7MTg6WzIsMzZdLDI1OlsyLDM2XSwzMzpbMiwzNl0sNDI6WzIsMzZdLDQzOlsyLDM2XSw0NDpbMiwzNl0sNDU6WzIsMzZdLDQ2OlsyLDM2XSw1MDpbMiwzNl0sNTI6WzIsMzZdLDU0OlsyLDM2XX0sezU6WzIsMTFdLDEyOlsyLDExXSwxMzpbMiwxMV0sMTY6WzIsMTFdLDI0OlsyLDExXSwyNjpbMiwxMV0sMjg6WzIsMTFdLDI5OlsyLDExXSwzMTpbMiwxMV0sMzI6WzIsMTFdLDM0OlsyLDExXX0sezMwOjc5LDUwOlsxLDI2XSw1MzoyNH0sezI5OlsyLDE1XX0sezU6WzIsMTJdLDEyOlsyLDEyXSwxMzpbMiwxMl0sMTY6WzIsMTJdLDI0OlsyLDEyXSwyNjpbMiwxMl0sMjg6WzIsMTJdLDI5OlsyLDEyXSwzMTpbMiwxMl0sMzI6WzIsMTJdLDM0OlsyLDEyXX0sezI1OlsxLDgwXX0sezI1OlsyLDQ1XX0sezUxOlsxLDc4XX0sezU6WzIsMjBdLDEyOlsyLDIwXSwxMzpbMiwyMF0sMTY6WzIsMjBdLDI0OlsyLDIwXSwyNjpbMiwyMF0sMjg6WzIsMjBdLDI5OlsyLDIwXSwzMTpbMiwyMF0sMzI6WzIsMjBdLDM0OlsyLDIwXX0sezQ2OlsxLDgxXX0sezE4OlsyLDUzXSwyNTpbMiw1M10sMzM6WzIsNTNdLDQ2OlsyLDUzXSw1MDpbMiw1M119LHszMDo1MSwzNjo4Miw0MTo1NSw0MjpbMSw1Ml0sNDM6WzEsNTNdLDQ0OlsxLDU0XSw0NTpbMSw1Nl0sNTA6WzEsMjZdLDUyOlsxLDI1XSw1MzoyNH0sezI1OlsxLDgzXX0sezU6WzIsMTldLDEyOlsyLDE5XSwxMzpbMiwxOV0sMTY6WzIsMTldLDI0OlsyLDE5XSwyNjpbMiwxOV0sMjg6WzIsMTldLDI5OlsyLDE5XSwzMTpbMiwxOV0sMzI6WzIsMTldLDM0OlsyLDE5XX0sezE4OlsyLDI4XSwyNTpbMiwyOF0sMzM6WzIsMjhdLDQyOlsyLDI4XSw0MzpbMiwyOF0sNDQ6WzIsMjhdLDQ1OlsyLDI4XSw0NjpbMiwyOF0sNTA6WzIsMjhdLDUyOlsyLDI4XX0sezE4OlsyLDMwXSwyNTpbMiwzMF0sMzM6WzIsMzBdLDQ2OlsyLDMwXSw1MDpbMiwzMF19LHs1OlsyLDE2XSwxMjpbMiwxNl0sMTM6WzIsMTZdLDE2OlsyLDE2XSwyNDpbMiwxNl0sMjY6WzIsMTZdLDI4OlsyLDE2XSwyOTpbMiwxNl0sMzE6WzIsMTZdLDMyOlsyLDE2XSwzNDpbMiwxNl19XSxkZWZhdWx0QWN0aW9uczp7NDpbMiwxXSw0NDpbMiw0MV0sNDc6WzIsNDNdLDU3OlsyLDQ3XSw2MzpbMiwxMF0sNzA6WzIsMTVdLDczOlsyLDQ1XX0scGFyc2VFcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYTtyZXR1cm4gYT1jLmxleGVyLmxleCgpfHwxLCJudW1iZXIiIT10eXBlb2YgYSYmKGE9Yy5zeW1ib2xzX1thXXx8YSksYX12YXIgYz10aGlzLGQ9WzBdLGU9W251bGxdLGY9W10sZz10aGlzLnRhYmxlLGg9IiIsaT0wLGo9MCxrPTA7dGhpcy5sZXhlci5zZXRJbnB1dChhKSx0aGlzLmxleGVyLnl5PXRoaXMueXksdGhpcy55eS5sZXhlcj10aGlzLmxleGVyLHRoaXMueXkucGFyc2VyPXRoaXMsInVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLmxleGVyLnl5bGxvYyYmKHRoaXMubGV4ZXIueXlsbG9jPXt9KTt2YXIgbD10aGlzLmxleGVyLnl5bGxvYztmLnB1c2gobCk7dmFyIG09dGhpcy5sZXhlci5vcHRpb25zJiZ0aGlzLmxleGVyLm9wdGlvbnMucmFuZ2VzOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3ImJih0aGlzLnBhcnNlRXJyb3I9dGhpcy55eS5wYXJzZUVycm9yKTtmb3IodmFyIG4sbyxwLHEscixzLHQsdSx2LHc9e307Oyl7aWYocD1kW2QubGVuZ3RoLTFdLHRoaXMuZGVmYXVsdEFjdGlvbnNbcF0/cT10aGlzLmRlZmF1bHRBY3Rpb25zW3BdOigobnVsbD09PW58fCJ1bmRlZmluZWQiPT10eXBlb2YgbikmJihuPWIoKSkscT1nW3BdJiZnW3BdW25dKSwidW5kZWZpbmVkIj09dHlwZW9mIHF8fCFxLmxlbmd0aHx8IXFbMF0pe3ZhciB4PSIiO2lmKCFrKXt2PVtdO2ZvcihzIGluIGdbcF0pdGhpcy50ZXJtaW5hbHNfW3NdJiZzPjImJnYucHVzaCgiJyIrdGhpcy50ZXJtaW5hbHNfW3NdKyInIik7eD10aGlzLmxleGVyLnNob3dQb3NpdGlvbj8iUGFyc2UgZXJyb3Igb24gbGluZSAiKyhpKzEpKyI6XG4iK3RoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkrIlxuRXhwZWN0aW5nICIrdi5qb2luKCIsICIpKyIsIGdvdCAnIisodGhpcy50ZXJtaW5hbHNfW25dfHxuKSsiJyI6IlBhcnNlIGVycm9yIG9uIGxpbmUgIisoaSsxKSsiOiBVbmV4cGVjdGVkICIrKDE9PW4/ImVuZCBvZiBpbnB1dCI6IiciKyh0aGlzLnRlcm1pbmFsc19bbl18fG4pKyInIiksdGhpcy5wYXJzZUVycm9yKHgse3RleHQ6dGhpcy5sZXhlci5tYXRjaCx0b2tlbjp0aGlzLnRlcm1pbmFsc19bbl18fG4sbGluZTp0aGlzLmxleGVyLnl5bGluZW5vLGxvYzpsLGV4cGVjdGVkOnZ9KX19aWYocVswXWluc3RhbmNlb2YgQXJyYXkmJnEubGVuZ3RoPjEpdGhyb3cgbmV3IEVycm9yKCJQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogIitwKyIsIHRva2VuOiAiK24pO3N3aXRjaChxWzBdKXtjYXNlIDE6ZC5wdXNoKG4pLGUucHVzaCh0aGlzLmxleGVyLnl5dGV4dCksZi5wdXNoKHRoaXMubGV4ZXIueXlsbG9jKSxkLnB1c2gocVsxXSksbj1udWxsLG8/KG49byxvPW51bGwpOihqPXRoaXMubGV4ZXIueXlsZW5nLGg9dGhpcy5sZXhlci55eXRleHQsaT10aGlzLmxleGVyLnl5bGluZW5vLGw9dGhpcy5sZXhlci55eWxsb2Msaz4wJiZrLS0pO2JyZWFrO2Nhc2UgMjppZih0PXRoaXMucHJvZHVjdGlvbnNfW3FbMV1dWzFdLHcuJD1lW2UubGVuZ3RoLXRdLHcuXyQ9e2ZpcnN0X2xpbmU6ZltmLmxlbmd0aC0odHx8MSldLmZpcnN0X2xpbmUsbGFzdF9saW5lOmZbZi5sZW5ndGgtMV0ubGFzdF9saW5lLGZpcnN0X2NvbHVtbjpmW2YubGVuZ3RoLSh0fHwxKV0uZmlyc3RfY29sdW1uLGxhc3RfY29sdW1uOmZbZi5sZW5ndGgtMV0ubGFzdF9jb2x1bW59LG0mJih3Ll8kLnJhbmdlPVtmW2YubGVuZ3RoLSh0fHwxKV0ucmFuZ2VbMF0sZltmLmxlbmd0aC0xXS5yYW5nZVsxXV0pLHI9dGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwodyxoLGosaSx0aGlzLnl5LHFbMV0sZSxmKSwidW5kZWZpbmVkIiE9dHlwZW9mIHIpcmV0dXJuIHI7dCYmKGQ9ZC5zbGljZSgwLC0xKnQqMiksZT1lLnNsaWNlKDAsLTEqdCksZj1mLnNsaWNlKDAsLTEqdCkpLGQucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1txWzFdXVswXSksZS5wdXNoKHcuJCksZi5wdXNoKHcuXyQpLHU9Z1tkW2QubGVuZ3RoLTJdXVtkW2QubGVuZ3RoLTFdXSxkLnB1c2godSk7YnJlYWs7Y2FzZSAzOnJldHVybiEwfX1yZXR1cm4hMH19LGM9ZnVuY3Rpb24oKXt2YXIgYT17RU9GOjEscGFyc2VFcnJvcjpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLnl5LnBhcnNlcil0aHJvdyBuZXcgRXJyb3IoYSk7dGhpcy55eS5wYXJzZXIucGFyc2VFcnJvcihhLGIpfSxzZXRJbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faW5wdXQ9YSx0aGlzLl9tb3JlPXRoaXMuX2xlc3M9dGhpcy5kb25lPSExLHRoaXMueXlsaW5lbm89dGhpcy55eWxlbmc9MCx0aGlzLnl5dGV4dD10aGlzLm1hdGNoZWQ9dGhpcy5tYXRjaD0iIix0aGlzLmNvbmRpdGlvblN0YWNrPVsiSU5JVElBTCJdLHRoaXMueXlsbG9jPXtmaXJzdF9saW5lOjEsZmlyc3RfY29sdW1uOjAsbGFzdF9saW5lOjEsbGFzdF9jb2x1bW46MH0sdGhpcy5vcHRpb25zLnJhbmdlcyYmKHRoaXMueXlsbG9jLnJhbmdlPVswLDBdKSx0aGlzLm9mZnNldD0wLHRoaXN9LGlucHV0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5faW5wdXRbMF07dGhpcy55eXRleHQrPWEsdGhpcy55eWxlbmcrKyx0aGlzLm9mZnNldCsrLHRoaXMubWF0Y2grPWEsdGhpcy5tYXRjaGVkKz1hO3ZhciBiPWEubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpO3JldHVybiBiPyh0aGlzLnl5bGluZW5vKyssdGhpcy55eWxsb2MubGFzdF9saW5lKyspOnRoaXMueXlsbG9jLmxhc3RfY29sdW1uKyssdGhpcy5vcHRpb25zLnJhbmdlcyYmdGhpcy55eWxsb2MucmFuZ2VbMV0rKyx0aGlzLl9pbnB1dD10aGlzLl9pbnB1dC5zbGljZSgxKSxhfSx1bnB1dDpmdW5jdGlvbihhKXt2YXIgYj1hLmxlbmd0aCxjPWEuc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTt0aGlzLl9pbnB1dD1hK3RoaXMuX2lucHV0LHRoaXMueXl0ZXh0PXRoaXMueXl0ZXh0LnN1YnN0cigwLHRoaXMueXl0ZXh0Lmxlbmd0aC1iLTEpLHRoaXMub2Zmc2V0LT1iO3ZhciBkPXRoaXMubWF0Y2guc3BsaXQoLyg/OlxyXG4/fFxuKS9nKTt0aGlzLm1hdGNoPXRoaXMubWF0Y2guc3Vic3RyKDAsdGhpcy5tYXRjaC5sZW5ndGgtMSksdGhpcy5tYXRjaGVkPXRoaXMubWF0Y2hlZC5zdWJzdHIoMCx0aGlzLm1hdGNoZWQubGVuZ3RoLTEpLGMubGVuZ3RoLTEmJih0aGlzLnl5bGluZW5vLT1jLmxlbmd0aC0xKTt2YXIgZT10aGlzLnl5bGxvYy5yYW5nZTtyZXR1cm4gdGhpcy55eWxsb2M9e2ZpcnN0X2xpbmU6dGhpcy55eWxsb2MuZmlyc3RfbGluZSxsYXN0X2xpbmU6dGhpcy55eWxpbmVubysxLGZpcnN0X2NvbHVtbjp0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sbGFzdF9jb2x1bW46Yz8oYy5sZW5ndGg9PT1kLmxlbmd0aD90aGlzLnl5bGxvYy5maXJzdF9jb2x1bW46MCkrZFtkLmxlbmd0aC1jLmxlbmd0aF0ubGVuZ3RoLWNbMF0ubGVuZ3RoOnRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbi1ifSx0aGlzLm9wdGlvbnMucmFuZ2VzJiYodGhpcy55eWxsb2MucmFuZ2U9W2VbMF0sZVswXSt0aGlzLnl5bGVuZy1iXSksdGhpc30sbW9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb3JlPSEwLHRoaXN9LGxlc3M6ZnVuY3Rpb24oYSl7dGhpcy51bnB1dCh0aGlzLm1hdGNoLnNsaWNlKGEpKX0scGFzdElucHV0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tYXRjaGVkLnN1YnN0cigwLHRoaXMubWF0Y2hlZC5sZW5ndGgtdGhpcy5tYXRjaC5sZW5ndGgpO3JldHVybihhLmxlbmd0aD4yMD8iLi4uIjoiIikrYS5zdWJzdHIoLTIwKS5yZXBsYWNlKC9cbi9nLCIiKX0sdXBjb21pbmdJbnB1dDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWF0Y2g7cmV0dXJuIGEubGVuZ3RoPDIwJiYoYSs9dGhpcy5faW5wdXQuc3Vic3RyKDAsMjAtYS5sZW5ndGgpKSwoYS5zdWJzdHIoMCwyMCkrKGEubGVuZ3RoPjIwPyIuLi4iOiIiKSkucmVwbGFjZSgvXG4vZywiIil9LHNob3dQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGFzdElucHV0KCksYj1uZXcgQXJyYXkoYS5sZW5ndGgrMSkuam9pbigiLSIpO3JldHVybiBhK3RoaXMudXBjb21pbmdJbnB1dCgpKyJcbiIrYisiXiJ9LG5leHQ6ZnVuY3Rpb24oKXtpZih0aGlzLmRvbmUpcmV0dXJuIHRoaXMuRU9GO3RoaXMuX2lucHV0fHwodGhpcy5kb25lPSEwKTt2YXIgYSxiLGMsZCxlO3RoaXMuX21vcmV8fCh0aGlzLnl5dGV4dD0iIix0aGlzLm1hdGNoPSIiKTtmb3IodmFyIGY9dGhpcy5fY3VycmVudFJ1bGVzKCksZz0wO2c8Zi5sZW5ndGgmJihjPXRoaXMuX2lucHV0Lm1hdGNoKHRoaXMucnVsZXNbZltnXV0pLCFjfHxiJiYhKGNbMF0ubGVuZ3RoPmJbMF0ubGVuZ3RoKXx8KGI9YyxkPWcsdGhpcy5vcHRpb25zLmZsZXgpKTtnKyspO3JldHVybiBiPyhlPWJbMF0ubWF0Y2goLyg/OlxyXG4/fFxuKS4qL2cpLGUmJih0aGlzLnl5bGluZW5vKz1lLmxlbmd0aCksdGhpcy55eWxsb2M9e2ZpcnN0X2xpbmU6dGhpcy55eWxsb2MubGFzdF9saW5lLGxhc3RfbGluZTp0aGlzLnl5bGluZW5vKzEsZmlyc3RfY29sdW1uOnRoaXMueXlsbG9jLmxhc3RfY29sdW1uLGxhc3RfY29sdW1uOmU/ZVtlLmxlbmd0aC0xXS5sZW5ndGgtZVtlLmxlbmd0aC0xXS5tYXRjaCgvXHI/XG4/LylbMF0ubGVuZ3RoOnRoaXMueXlsbG9jLmxhc3RfY29sdW1uK2JbMF0ubGVuZ3RofSx0aGlzLnl5dGV4dCs9YlswXSx0aGlzLm1hdGNoKz1iWzBdLHRoaXMubWF0Y2hlcz1iLHRoaXMueXlsZW5nPXRoaXMueXl0ZXh0Lmxlbmd0aCx0aGlzLm9wdGlvbnMucmFuZ2VzJiYodGhpcy55eWxsb2MucmFuZ2U9W3RoaXMub2Zmc2V0LHRoaXMub2Zmc2V0Kz10aGlzLnl5bGVuZ10pLHRoaXMuX21vcmU9ITEsdGhpcy5faW5wdXQ9dGhpcy5faW5wdXQuc2xpY2UoYlswXS5sZW5ndGgpLHRoaXMubWF0Y2hlZCs9YlswXSxhPXRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHRoaXMsdGhpcy55eSx0aGlzLGZbZF0sdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXSksdGhpcy5kb25lJiZ0aGlzLl9pbnB1dCYmKHRoaXMuZG9uZT0hMSksYT9hOnZvaWQgMCk6IiI9PT10aGlzLl9pbnB1dD90aGlzLkVPRjp0aGlzLnBhcnNlRXJyb3IoIkxleGljYWwgZXJyb3Igb24gbGluZSAiKyh0aGlzLnl5bGluZW5vKzEpKyIuIFVucmVjb2duaXplZCB0ZXh0LlxuIit0aGlzLnNob3dQb3NpdGlvbigpLHt0ZXh0OiIiLHRva2VuOm51bGwsbGluZTp0aGlzLnl5bGluZW5vfSl9LGxleDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmV4dCgpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYT9hOnRoaXMubGV4KCl9LGJlZ2luOmZ1bmN0aW9uKGEpe3RoaXMuY29uZGl0aW9uU3RhY2sucHVzaChhKX0scG9wU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKX0sX2N1cnJlbnRSdWxlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXV0ucnVsZXN9LHRvcFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgtMl19LHB1c2hTdGF0ZTpmdW5jdGlvbihhKXt0aGlzLmJlZ2luKGEpfX07cmV0dXJuIGEub3B0aW9ucz17fSxhLnBlcmZvcm1BY3Rpb249ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShhLGMpe3JldHVybiBiLnl5dGV4dD1iLnl5dGV4dC5zdWJzdHIoYSxiLnl5bGVuZy1jKX1zd2l0Y2goYyl7Y2FzZSAwOmlmKCJcXFxcIj09PWIueXl0ZXh0LnNsaWNlKC0yKT8oZSgwLDEpLHRoaXMuYmVnaW4oIm11IikpOiJcXCI9PT1iLnl5dGV4dC5zbGljZSgtMSk/KGUoMCwxKSx0aGlzLmJlZ2luKCJlbXUiKSk6dGhpcy5iZWdpbigibXUiKSxiLnl5dGV4dClyZXR1cm4gMTI7YnJlYWs7Y2FzZSAxOnJldHVybiAxMjtjYXNlIDI6cmV0dXJuIHRoaXMucG9wU3RhdGUoKSwxMjtjYXNlIDM6cmV0dXJuIGIueXl0ZXh0PWIueXl0ZXh0LnN1YnN0cig1LGIueXlsZW5nLTkpLHRoaXMucG9wU3RhdGUoKSwxNTtjYXNlIDQ6cmV0dXJuIDEyO2Nhc2UgNTpyZXR1cm4gZSgwLDQpLHRoaXMucG9wU3RhdGUoKSwxMztjYXNlIDY6cmV0dXJuIDQ1O2Nhc2UgNzpyZXR1cm4gNDY7Y2FzZSA4OnJldHVybiAxNjtjYXNlIDk6cmV0dXJuIHRoaXMucG9wU3RhdGUoKSx0aGlzLmJlZ2luKCJyYXciKSwxODtjYXNlIDEwOnJldHVybiAzNDtjYXNlIDExOnJldHVybiAyNDtjYXNlIDEyOnJldHVybiAyOTtjYXNlIDEzOnJldHVybiB0aGlzLnBvcFN0YXRlKCksMjg7Y2FzZSAxNDpyZXR1cm4gdGhpcy5wb3BTdGF0ZSgpLDI4O2Nhc2UgMTU6cmV0dXJuIDI2O2Nhc2UgMTY6cmV0dXJuIDI2O2Nhc2UgMTc6cmV0dXJuIDMyO2Nhc2UgMTg6cmV0dXJuIDMxO2Nhc2UgMTk6dGhpcy5wb3BTdGF0ZSgpLHRoaXMuYmVnaW4oImNvbSIpO2JyZWFrO2Nhc2UgMjA6cmV0dXJuIGUoMyw1KSx0aGlzLnBvcFN0YXRlKCksMTM7Y2FzZSAyMTpyZXR1cm4gMzE7Y2FzZSAyMjpyZXR1cm4gNTE7Y2FzZSAyMzpyZXR1cm4gNTA7Y2FzZSAyNDpyZXR1cm4gNTA7Y2FzZSAyNTpyZXR1cm4gNTQ7Y2FzZSAyNjpicmVhaztjYXNlIDI3OnJldHVybiB0aGlzLnBvcFN0YXRlKCksMzM7Y2FzZSAyODpyZXR1cm4gdGhpcy5wb3BTdGF0ZSgpLDI1O2Nhc2UgMjk6cmV0dXJuIGIueXl0ZXh0PWUoMSwyKS5yZXBsYWNlKC9cXCIvZywnIicpLDQyO2Nhc2UgMzA6cmV0dXJuIGIueXl0ZXh0PWUoMSwyKS5yZXBsYWNlKC9cXCcvZywiJyIpLDQyO2Nhc2UgMzE6cmV0dXJuIDUyO2Nhc2UgMzI6cmV0dXJuIDQ0O2Nhc2UgMzM6cmV0dXJuIDQ0O2Nhc2UgMzQ6cmV0dXJuIDQzO2Nhc2UgMzU6cmV0dXJuIDUwO2Nhc2UgMzY6cmV0dXJuIGIueXl0ZXh0PWUoMSwyKSw1MDtjYXNlIDM3OnJldHVybiJJTlZBTElEIjtjYXNlIDM4OnJldHVybiA1fX0sYS5ydWxlcz1bL14oPzpbXlx4MDBdKj8oPz0oXHtceykpKS8sL14oPzpbXlx4MDBdKykvLC9eKD86W15ceDAwXXsyLH0/KD89KFx7XHt8XFxce1x7fFxcXFxce1x7fCQpKSkvLC9eKD86XHtce1x7XHtcL1teXHMhIiMlLSxcLlwvOy0+QFxbLVxeYFx7LX5dKyg/PVs9fVxzXC8uXSlcfVx9XH1cfSkvLC9eKD86W15ceDAwXSo/KD89KFx7XHtce1x7XC8pKSkvLC9eKD86W1xzXFNdKj8tLVx9XH0pLywvXig/OlwoKS8sL14oPzpcKSkvLC9eKD86XHtce1x7XHspLywvXig/Olx9XH1cfVx9KS8sL14oPzpce1x7KH4pPz4pLywvXig/Olx7XHsofik/IykvLC9eKD86XHtceyh+KT9cLykvLC9eKD86XHtceyh+KT9cXlxzKih+KT9cfVx9KS8sL14oPzpce1x7KH4pP1xzKmVsc2Vccyoofik/XH1cfSkvLC9eKD86XHtceyh+KT9cXikvLC9eKD86XHtceyh+KT9ccyplbHNlXGIpLywvXig/Olx7XHsofik/XHspLywvXig/Olx7XHsofik/JikvLC9eKD86XHtceyEtLSkvLC9eKD86XHtceyFbXHNcU10qP1x9XH0pLywvXig/Olx7XHsofik/KS8sL14oPzo9KS8sL14oPzpcLlwuKS8sL14oPzpcLig/PShbPX59XHNcLy4pXSkpKS8sL14oPzpbXC8uXSkvLC9eKD86XHMrKS8sL14oPzpcfSh+KT9cfVx9KS8sL14oPzoofik/XH1cfSkvLC9eKD86IihcXFsiXXxbXiJdKSoiKS8sL14oPzonKFxcWyddfFteJ10pKicpLywvXig/OkApLywvXig/OnRydWUoPz0oW359XHMpXSkpKS8sL14oPzpmYWxzZSg/PShbfn1ccyldKSkpLywvXig/Oi0/WzAtOV0rKD86XC5bMC05XSspPyg/PShbfn1ccyldKSkpLywvXig/OihbXlxzISIjJS0sXC5cLzstPkBcWy1cXmBcey1+XSsoPz0oWz1+fVxzXC8uKV0pKSkpLywvXig/OlxbW15cXV0qXF0pLywvXig/Oi4pLywvXig/OiQpL10sYS5jb25kaXRpb25zPXttdTp7cnVsZXM6WzYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzhdLGluY2x1c2l2ZTohMX0sZW11OntydWxlczpbMl0saW5jbHVzaXZlOiExfSxjb206e3J1bGVzOls1XSxpbmNsdXNpdmU6ITF9LHJhdzp7cnVsZXM6WzMsNF0saW5jbHVzaXZlOiExfSxJTklUSUFMOntydWxlczpbMCwxLDM4XSxpbmNsdXNpdmU6ITB9fSxhfSgpO3JldHVybiBiLmxleGVyPWMsYS5wcm90b3R5cGU9YixiLlBhcnNlcj1hLG5ldyBhfSgpO3JldHVybiBhPWJ9KCksaT1mdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihhLGIpe3JldHVybntsZWZ0OiJ+Ij09PWEuY2hhckF0KDIpLHJpZ2h0OiJ+Ij09PWIuY2hhckF0KGIubGVuZ3RoLTMpfX1mdW5jdGlvbiBjKGEsYixjLGQsaSxrKXtpZihhLnNleHByLmlkLm9yaWdpbmFsIT09ZC5wYXRoLm9yaWdpbmFsKXRocm93IG5ldyBqKGEuc2V4cHIuaWQub3JpZ2luYWwrIiBkb2Vzbid0IG1hdGNoICIrZC5wYXRoLm9yaWdpbmFsLGEpO3ZhciBsPWMmJmMucHJvZ3JhbSxtPXtsZWZ0OmEuc3RyaXAubGVmdCxyaWdodDpkLnN0cmlwLnJpZ2h0LG9wZW5TdGFuZGFsb25lOmYoYi5zdGF0ZW1lbnRzKSxjbG9zZVN0YW5kYWxvbmU6ZSgobHx8Yikuc3RhdGVtZW50cyl9O2lmKGEuc3RyaXAucmlnaHQmJmcoYi5zdGF0ZW1lbnRzLG51bGwsITApLGwpe3ZhciBuPWMuc3RyaXA7bi5sZWZ0JiZoKGIuc3RhdGVtZW50cyxudWxsLCEwKSxuLnJpZ2h0JiZnKGwuc3RhdGVtZW50cyxudWxsLCEwKSxkLnN0cmlwLmxlZnQmJmgobC5zdGF0ZW1lbnRzLG51bGwsITApLGUoYi5zdGF0ZW1lbnRzKSYmZihsLnN0YXRlbWVudHMpJiYoaChiLnN0YXRlbWVudHMpLGcobC5zdGF0ZW1lbnRzKSl9ZWxzZSBkLnN0cmlwLmxlZnQmJmgoYi5zdGF0ZW1lbnRzLG51bGwsITApO3JldHVybiBpP25ldyB0aGlzLkJsb2NrTm9kZShhLGwsYixtLGspOm5ldyB0aGlzLkJsb2NrTm9kZShhLGIsbCxtLGspfWZ1bmN0aW9uIGQoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspe3ZhciBpPWFbY10saj1pLnN0cmlwO2lmKGope3ZhciBrPWUoYSxjLGIsInBhcnRpYWwiPT09aS50eXBlKSxsPWYoYSxjLGIpLG09ai5vcGVuU3RhbmRhbG9uZSYmayxuPWouY2xvc2VTdGFuZGFsb25lJiZsLG89ai5pbmxpbmVTdGFuZGFsb25lJiZrJiZsO2oucmlnaHQmJmcoYSxjLCEwKSxqLmxlZnQmJmgoYSxjLCEwKSxvJiYoZyhhLGMpLGgoYSxjKSYmInBhcnRpYWwiPT09aS50eXBlJiYoaS5pbmRlbnQ9LyhbIFx0XSskKS8uZXhlYyhhW2MtMV0ub3JpZ2luYWwpP1JlZ0V4cC4kMToiIikpLG0mJihnKChpLnByb2dyYW18fGkuaW52ZXJzZSkuc3RhdGVtZW50cyksaChhLGMpKSxuJiYoZyhhLGMpLGgoKGkuaW52ZXJzZXx8aS5wcm9ncmFtKS5zdGF0ZW1lbnRzKSl9fXJldHVybiBhfWZ1bmN0aW9uIGUoYSxiLGMpe3ZvaWQgMD09PWImJihiPWEubGVuZ3RoKTt2YXIgZD1hW2ItMV0sZT1hW2ItMl07cmV0dXJuIGQ/ImNvbnRlbnQiPT09ZC50eXBlPyhlfHwhYz8vXHI/XG5ccyo/JC86LyhefFxyP1xuKVxzKj8kLykudGVzdChkLm9yaWdpbmFsKTp2b2lkIDA6Y31mdW5jdGlvbiBmKGEsYixjKXt2b2lkIDA9PT1iJiYoYj0tMSk7dmFyIGQ9YVtiKzFdLGU9YVtiKzJdO3JldHVybiBkPyJjb250ZW50Ij09PWQudHlwZT8oZXx8IWM/L15ccyo/XHI/XG4vOi9eXHMqPyhccj9cbnwkKS8pLnRlc3QoZC5vcmlnaW5hbCk6dm9pZCAwOmN9ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGQ9YVtudWxsPT1iPzA6YisxXTtpZihkJiYiY29udGVudCI9PT1kLnR5cGUmJihjfHwhZC5yaWdodFN0cmlwcGVkKSl7dmFyIGU9ZC5zdHJpbmc7ZC5zdHJpbmc9ZC5zdHJpbmcucmVwbGFjZShjPy9eXHMrLzovXlsgXHRdKlxyP1xuPy8sIiIpLGQucmlnaHRTdHJpcHBlZD1kLnN0cmluZyE9PWV9fWZ1bmN0aW9uIGgoYSxiLGMpe3ZhciBkPWFbbnVsbD09Yj9hLmxlbmd0aC0xOmItMV07aWYoZCYmImNvbnRlbnQiPT09ZC50eXBlJiYoY3x8IWQubGVmdFN0cmlwcGVkKSl7dmFyIGU9ZC5zdHJpbmc7cmV0dXJuIGQuc3RyaW5nPWQuc3RyaW5nLnJlcGxhY2UoYz8vXHMrJC86L1sgXHRdKyQvLCIiKSxkLmxlZnRTdHJpcHBlZD1kLnN0cmluZyE9PWUsZC5sZWZ0U3RyaXBwZWR9fXZhciBpPXt9LGo9YTtyZXR1cm4gaS5zdHJpcEZsYWdzPWIsaS5wcmVwYXJlQmxvY2s9YyxpLnByZXBhcmVQcm9ncmFtPWQsaX0oYyksaj1mdW5jdGlvbihhLGIsYyxkKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShhKXtyZXR1cm4gYS5jb25zdHJ1Y3Rvcj09PWguUHJvZ3JhbU5vZGU/YTooZy55eT1rLGcucGFyc2UoYSkpfXZhciBmPXt9LGc9YSxoPWIsaT1jLGo9ZC5leHRlbmQ7Zi5wYXJzZXI9Zzt2YXIgaz17fTtyZXR1cm4gaihrLGksaCksZi5wYXJzZT1lLGZ9KGgsZyxpLGIpLGs9ZnVuY3Rpb24oYSxiKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYygpe31mdW5jdGlvbiBkKGEsYixjKXtpZihudWxsPT1hfHwic3RyaW5nIiE9dHlwZW9mIGEmJmEuY29uc3RydWN0b3IhPT1jLkFTVC5Qcm9ncmFtTm9kZSl0aHJvdyBuZXcgaCgiWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLnByZWNvbXBpbGUuIFlvdSBwYXNzZWQgIithKTtiPWJ8fHt9LCJkYXRhImluIGJ8fChiLmRhdGE9ITApLGIuY29tcGF0JiYoYi51c2VEZXB0aHM9ITApO3ZhciBkPWMucGFyc2UoYSksZT0obmV3IGMuQ29tcGlsZXIpLmNvbXBpbGUoZCxiKTtyZXR1cm4obmV3IGMuSmF2YVNjcmlwdENvbXBpbGVyKS5jb21waWxlKGUsYil9ZnVuY3Rpb24gZShhLGIsYyl7ZnVuY3Rpb24gZCgpe3ZhciBkPWMucGFyc2UoYSksZT0obmV3IGMuQ29tcGlsZXIpLmNvbXBpbGUoZCxiKSxmPShuZXcgYy5KYXZhU2NyaXB0Q29tcGlsZXIpLmNvbXBpbGUoZSxiLHZvaWQgMCwhMCk7cmV0dXJuIGMudGVtcGxhdGUoZil9aWYobnVsbD09YXx8InN0cmluZyIhPXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yIT09Yy5BU1QuUHJvZ3JhbU5vZGUpdGhyb3cgbmV3IGgoIllvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFycy5jb21waWxlLiBZb3UgcGFzc2VkICIrYSk7Yj1ifHx7fSwiZGF0YSJpbiBifHwoYi5kYXRhPSEwKSxiLmNvbXBhdCYmKGIudXNlRGVwdGhzPSEwKTt2YXIgZSxmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGV8fChlPWQoKSksZS5jYWxsKHRoaXMsYSxiKX07cmV0dXJuIGYuX3NldHVwPWZ1bmN0aW9uKGEpe3JldHVybiBlfHwoZT1kKCkpLGUuX3NldHVwKGEpfSxmLl9jaGlsZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGV8fChlPWQoKSksZS5fY2hpbGQoYSxiLGMpfSxmfWZ1bmN0aW9uIGYoYSxiKXtpZihhPT09YilyZXR1cm4hMDtpZihpKGEpJiZpKGIpJiZhLmxlbmd0aD09PWIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZighZihhW2NdLGJbY10pKXJldHVybiExO3JldHVybiEwfX12YXIgZz17fSxoPWEsaT1iLmlzQXJyYXksaj1bXS5zbGljZTtyZXR1cm4gZy5Db21waWxlcj1jLGMucHJvdG90eXBlPXtjb21waWxlcjpjLGVxdWFsczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wY29kZXMubGVuZ3RoO2lmKGEub3Bjb2Rlcy5sZW5ndGghPT1iKXJldHVybiExO2Zvcih2YXIgYz0wO2I+YztjKyspe3ZhciBkPXRoaXMub3Bjb2Rlc1tjXSxlPWEub3Bjb2Rlc1tjXTtpZihkLm9wY29kZSE9PWUub3Bjb2RlfHwhZihkLmFyZ3MsZS5hcmdzKSlyZXR1cm4hMX1mb3IoYj10aGlzLmNoaWxkcmVuLmxlbmd0aCxjPTA7Yj5jO2MrKylpZighdGhpcy5jaGlsZHJlbltjXS5lcXVhbHMoYS5jaGlsZHJlbltjXSkpcmV0dXJuITE7cmV0dXJuITB9LGd1aWQ6MCxjb21waWxlOmZ1bmN0aW9uKGEsYil7dGhpcy5vcGNvZGVzPVtdLHRoaXMuY2hpbGRyZW49W10sdGhpcy5kZXB0aHM9e2xpc3Q6W119LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RyaW5nUGFyYW1zPWIuc3RyaW5nUGFyYW1zLHRoaXMudHJhY2tJZHM9Yi50cmFja0lkczt2YXIgYz10aGlzLm9wdGlvbnMua25vd25IZWxwZXJzO2lmKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnM9e2hlbHBlck1pc3Npbmc6ITAsYmxvY2tIZWxwZXJNaXNzaW5nOiEwLGVhY2g6ITAsImlmIjohMCx1bmxlc3M6ITAsIndpdGgiOiEwLGxvZzohMCxsb29rdXA6ITB9LGMpZm9yKHZhciBkIGluIGMpdGhpcy5vcHRpb25zLmtub3duSGVscGVyc1tkXT1jW2RdO3JldHVybiB0aGlzLmFjY2VwdChhKX0sYWNjZXB0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2EudHlwZV0oYSl9LHByb2dyYW06ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWEuc3RhdGVtZW50cyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKXRoaXMuYWNjZXB0KGJbY10pO3JldHVybiB0aGlzLmlzU2ltcGxlPTE9PT1kLHRoaXMuZGVwdGhzLmxpc3Q9dGhpcy5kZXB0aHMubGlzdC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEtYn0pLHRoaXN9LGNvbXBpbGVQcm9ncmFtOmZ1bmN0aW9uKGEpe3ZhciBiLGM9KG5ldyB0aGlzLmNvbXBpbGVyKS5jb21waWxlKGEsdGhpcy5vcHRpb25zKSxkPXRoaXMuZ3VpZCsrOwordGhpcy51c2VQYXJ0aWFsPXRoaXMudXNlUGFydGlhbHx8Yy51c2VQYXJ0aWFsLHRoaXMuY2hpbGRyZW5bZF09Yztmb3IodmFyIGU9MCxmPWMuZGVwdGhzLmxpc3QubGVuZ3RoO2Y+ZTtlKyspYj1jLmRlcHRocy5saXN0W2VdLDI+Ynx8dGhpcy5hZGREZXB0aChiLTEpO3JldHVybiBkfSxibG9jazpmdW5jdGlvbihhKXt2YXIgYj1hLm11c3RhY2hlLGM9YS5wcm9ncmFtLGQ9YS5pbnZlcnNlO2MmJihjPXRoaXMuY29tcGlsZVByb2dyYW0oYykpLGQmJihkPXRoaXMuY29tcGlsZVByb2dyYW0oZCkpO3ZhciBlPWIuc2V4cHIsZj10aGlzLmNsYXNzaWZ5U2V4cHIoZSk7ImhlbHBlciI9PT1mP3RoaXMuaGVscGVyU2V4cHIoZSxjLGQpOiJzaW1wbGUiPT09Zj8odGhpcy5zaW1wbGVTZXhwcihlKSx0aGlzLm9wY29kZSgicHVzaFByb2dyYW0iLGMpLHRoaXMub3Bjb2RlKCJwdXNoUHJvZ3JhbSIsZCksdGhpcy5vcGNvZGUoImVtcHR5SGFzaCIpLHRoaXMub3Bjb2RlKCJibG9ja1ZhbHVlIixlLmlkLm9yaWdpbmFsKSk6KHRoaXMuYW1iaWd1b3VzU2V4cHIoZSxjLGQpLHRoaXMub3Bjb2RlKCJwdXNoUHJvZ3JhbSIsYyksdGhpcy5vcGNvZGUoInB1c2hQcm9ncmFtIixkKSx0aGlzLm9wY29kZSgiZW1wdHlIYXNoIiksdGhpcy5vcGNvZGUoImFtYmlndW91c0Jsb2NrVmFsdWUiKSksdGhpcy5vcGNvZGUoImFwcGVuZCIpfSxoYXNoOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1hLnBhaXJzO2Zvcih0aGlzLm9wY29kZSgicHVzaEhhc2giKSxiPTAsYz1kLmxlbmd0aDtjPmI7YisrKXRoaXMucHVzaFBhcmFtKGRbYl1bMV0pO2Zvcig7Yi0tOyl0aGlzLm9wY29kZSgiYXNzaWduVG9IYXNoIixkW2JdWzBdKTt0aGlzLm9wY29kZSgicG9wSGFzaCIpfSxwYXJ0aWFsOmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFydGlhbE5hbWU7dGhpcy51c2VQYXJ0aWFsPSEwLGEuaGFzaD90aGlzLmFjY2VwdChhLmhhc2gpOnRoaXMub3Bjb2RlKCJwdXNoIiwidW5kZWZpbmVkIiksYS5jb250ZXh0P3RoaXMuYWNjZXB0KGEuY29udGV4dCk6KHRoaXMub3Bjb2RlKCJnZXRDb250ZXh0IiwwKSx0aGlzLm9wY29kZSgicHVzaENvbnRleHQiKSksdGhpcy5vcGNvZGUoImludm9rZVBhcnRpYWwiLGIubmFtZSxhLmluZGVudHx8IiIpLHRoaXMub3Bjb2RlKCJhcHBlbmQiKX0sY29udGVudDpmdW5jdGlvbihhKXthLnN0cmluZyYmdGhpcy5vcGNvZGUoImFwcGVuZENvbnRlbnQiLGEuc3RyaW5nKX0sbXVzdGFjaGU6ZnVuY3Rpb24oYSl7dGhpcy5zZXhwcihhLnNleHByKSxhLmVzY2FwZWQmJiF0aGlzLm9wdGlvbnMubm9Fc2NhcGU/dGhpcy5vcGNvZGUoImFwcGVuZEVzY2FwZWQiKTp0aGlzLm9wY29kZSgiYXBwZW5kIil9LGFtYmlndW91c1NleHByOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmlkLGU9ZC5wYXJ0c1swXSxmPW51bGwhPWJ8fG51bGwhPWM7dGhpcy5vcGNvZGUoImdldENvbnRleHQiLGQuZGVwdGgpLHRoaXMub3Bjb2RlKCJwdXNoUHJvZ3JhbSIsYiksdGhpcy5vcGNvZGUoInB1c2hQcm9ncmFtIixjKSx0aGlzLklEKGQpLHRoaXMub3Bjb2RlKCJpbnZva2VBbWJpZ3VvdXMiLGUsZil9LHNpbXBsZVNleHByOmZ1bmN0aW9uKGEpe3ZhciBiPWEuaWQ7IkRBVEEiPT09Yi50eXBlP3RoaXMuREFUQShiKTpiLnBhcnRzLmxlbmd0aD90aGlzLklEKGIpOih0aGlzLmFkZERlcHRoKGIuZGVwdGgpLHRoaXMub3Bjb2RlKCJnZXRDb250ZXh0IixiLmRlcHRoKSx0aGlzLm9wY29kZSgicHVzaENvbnRleHQiKSksdGhpcy5vcGNvZGUoInJlc29sdmVQb3NzaWJsZUxhbWJkYSIpfSxoZWxwZXJTZXhwcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhhLGIsYyksZT1hLmlkLGY9ZS5wYXJ0c1swXTtpZih0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW2ZdKXRoaXMub3Bjb2RlKCJpbnZva2VLbm93bkhlbHBlciIsZC5sZW5ndGgsZik7ZWxzZXtpZih0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzT25seSl0aHJvdyBuZXcgaCgiWW91IHNwZWNpZmllZCBrbm93bkhlbHBlcnNPbmx5LCBidXQgdXNlZCB0aGUgdW5rbm93biBoZWxwZXIgIitmLGEpO2UuZmFsc3k9ITAsdGhpcy5JRChlKSx0aGlzLm9wY29kZSgiaW52b2tlSGVscGVyIixkLmxlbmd0aCxlLm9yaWdpbmFsLGUuaXNTaW1wbGUpfX0sc2V4cHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jbGFzc2lmeVNleHByKGEpOyJzaW1wbGUiPT09Yj90aGlzLnNpbXBsZVNleHByKGEpOiJoZWxwZXIiPT09Yj90aGlzLmhlbHBlclNleHByKGEpOnRoaXMuYW1iaWd1b3VzU2V4cHIoYSl9LElEOmZ1bmN0aW9uKGEpe3RoaXMuYWRkRGVwdGgoYS5kZXB0aCksdGhpcy5vcGNvZGUoImdldENvbnRleHQiLGEuZGVwdGgpO3ZhciBiPWEucGFydHNbMF07Yj90aGlzLm9wY29kZSgibG9va3VwT25Db250ZXh0IixhLnBhcnRzLGEuZmFsc3ksYS5pc1Njb3BlZCk6dGhpcy5vcGNvZGUoInB1c2hDb250ZXh0Iil9LERBVEE6ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zLmRhdGE9ITAsdGhpcy5vcGNvZGUoImxvb2t1cERhdGEiLGEuaWQuZGVwdGgsYS5pZC5wYXJ0cyl9LFNUUklORzpmdW5jdGlvbihhKXt0aGlzLm9wY29kZSgicHVzaFN0cmluZyIsYS5zdHJpbmcpfSxOVU1CRVI6ZnVuY3Rpb24oYSl7dGhpcy5vcGNvZGUoInB1c2hMaXRlcmFsIixhLm51bWJlcil9LEJPT0xFQU46ZnVuY3Rpb24oYSl7dGhpcy5vcGNvZGUoInB1c2hMaXRlcmFsIixhLmJvb2wpfSxjb21tZW50OmZ1bmN0aW9uKCl7fSxvcGNvZGU6ZnVuY3Rpb24oYSl7dGhpcy5vcGNvZGVzLnB1c2goe29wY29kZTphLGFyZ3M6ai5jYWxsKGFyZ3VtZW50cywxKX0pfSxhZGREZXB0aDpmdW5jdGlvbihhKXswIT09YSYmKHRoaXMuZGVwdGhzW2FdfHwodGhpcy5kZXB0aHNbYV09ITAsdGhpcy5kZXB0aHMubGlzdC5wdXNoKGEpKSl9LGNsYXNzaWZ5U2V4cHI6ZnVuY3Rpb24oYSl7dmFyIGI9YS5pc0hlbHBlcixjPWEuZWxpZ2libGVIZWxwZXIsZD10aGlzLm9wdGlvbnM7aWYoYyYmIWIpe3ZhciBlPWEuaWQucGFydHNbMF07ZC5rbm93bkhlbHBlcnNbZV0/Yj0hMDpkLmtub3duSGVscGVyc09ubHkmJihjPSExKX1yZXR1cm4gYj8iaGVscGVyIjpjPyJhbWJpZ3VvdXMiOiJzaW1wbGUifSxwdXNoUGFyYW1zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9YS5sZW5ndGg7Yz5iO2IrKyl0aGlzLnB1c2hQYXJhbShhW2JdKX0scHVzaFBhcmFtOmZ1bmN0aW9uKGEpe3RoaXMuc3RyaW5nUGFyYW1zPyhhLmRlcHRoJiZ0aGlzLmFkZERlcHRoKGEuZGVwdGgpLHRoaXMub3Bjb2RlKCJnZXRDb250ZXh0IixhLmRlcHRofHwwKSx0aGlzLm9wY29kZSgicHVzaFN0cmluZ1BhcmFtIixhLnN0cmluZ01vZGVWYWx1ZSxhLnR5cGUpLCJzZXhwciI9PT1hLnR5cGUmJnRoaXMuc2V4cHIoYSkpOih0aGlzLnRyYWNrSWRzJiZ0aGlzLm9wY29kZSgicHVzaElkIixhLnR5cGUsYS5pZE5hbWV8fGEuc3RyaW5nTW9kZVZhbHVlKSx0aGlzLmFjY2VwdChhKSl9LHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnBhcmFtcztyZXR1cm4gdGhpcy5wdXNoUGFyYW1zKGQpLHRoaXMub3Bjb2RlKCJwdXNoUHJvZ3JhbSIsYiksdGhpcy5vcGNvZGUoInB1c2hQcm9ncmFtIixjKSxhLmhhc2g/dGhpcy5oYXNoKGEuaGFzaCk6dGhpcy5vcGNvZGUoImVtcHR5SGFzaCIpLGR9fSxnLnByZWNvbXBpbGU9ZCxnLmNvbXBpbGU9ZSxnfShjLGIpLGw9ZnVuY3Rpb24oYSxiKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYyhhKXt0aGlzLnZhbHVlPWF9ZnVuY3Rpb24gZCgpe312YXIgZSxmPWEuQ09NUElMRVJfUkVWSVNJT04sZz1hLlJFVklTSU9OX0NIQU5HRVMsaD1iO2QucHJvdG90eXBlPXtuYW1lTG9va3VwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWUoYik/YSsiLiIrYjphKyJbJyIrYisiJ10ifSxkZXB0aGVkTG9va3VwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFsaWFzZXMubG9va3VwPSJ0aGlzLmxvb2t1cCIsJ2xvb2t1cChkZXB0aHMsICInK2ErJyIpJ30sY29tcGlsZXJJbmZvOmZ1bmN0aW9uKCl7dmFyIGE9ZixiPWdbYV07cmV0dXJuW2EsYl19LGFwcGVuZFRvQnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlPyJyZXR1cm4gIithKyI7Ijp7YXBwZW5kVG9CdWZmZXI6ITAsY29udGVudDphLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuImJ1ZmZlciArPSAiK2ErIjsifX19LGluaXRpYWxpemVCdWZmZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdW90ZWRTdHJpbmcoIiIpfSxuYW1lc3BhY2U6IkhhbmRsZWJhcnMiLGNvbXBpbGU6ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5lbnZpcm9ubWVudD1hLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RyaW5nUGFyYW1zPXRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXMsdGhpcy50cmFja0lkcz10aGlzLm9wdGlvbnMudHJhY2tJZHMsdGhpcy5wcmVjb21waWxlPSFkLHRoaXMubmFtZT10aGlzLmVudmlyb25tZW50Lm5hbWUsdGhpcy5pc0NoaWxkPSEhYyx0aGlzLmNvbnRleHQ9Y3x8e3Byb2dyYW1zOltdLGVudmlyb25tZW50czpbXX0sdGhpcy5wcmVhbWJsZSgpLHRoaXMuc3RhY2tTbG90PTAsdGhpcy5zdGFja1ZhcnM9W10sdGhpcy5hbGlhc2VzPXt9LHRoaXMucmVnaXN0ZXJzPXtsaXN0OltdfSx0aGlzLmhhc2hlcz1bXSx0aGlzLmNvbXBpbGVTdGFjaz1bXSx0aGlzLmlubGluZVN0YWNrPVtdLHRoaXMuY29tcGlsZUNoaWxkcmVuKGEsYiksdGhpcy51c2VEZXB0aHM9dGhpcy51c2VEZXB0aHN8fGEuZGVwdGhzLmxpc3QubGVuZ3RofHx0aGlzLm9wdGlvbnMuY29tcGF0O3ZhciBlLGYsZyxpPWEub3Bjb2Rlcztmb3IoZj0wLGc9aS5sZW5ndGg7Zz5mO2YrKyllPWlbZl0sdGhpc1tlLm9wY29kZV0uYXBwbHkodGhpcyxlLmFyZ3MpO2lmKHRoaXMucHVzaFNvdXJjZSgiIiksdGhpcy5zdGFja1Nsb3R8fHRoaXMuaW5saW5lU3RhY2subGVuZ3RofHx0aGlzLmNvbXBpbGVTdGFjay5sZW5ndGgpdGhyb3cgbmV3IGgoIkNvbXBpbGUgY29tcGxldGVkIHdpdGggY29udGVudCBsZWZ0IG9uIHN0YWNrIik7dmFyIGo9dGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoZCk7aWYodGhpcy5pc0NoaWxkKXJldHVybiBqO3ZhciBrPXtjb21waWxlcjp0aGlzLmNvbXBpbGVySW5mbygpLG1haW46an0sbD10aGlzLmNvbnRleHQucHJvZ3JhbXM7Zm9yKGY9MCxnPWwubGVuZ3RoO2c+ZjtmKyspbFtmXSYmKGtbZl09bFtmXSk7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQudXNlUGFydGlhbCYmKGsudXNlUGFydGlhbD0hMCksdGhpcy5vcHRpb25zLmRhdGEmJihrLnVzZURhdGE9ITApLHRoaXMudXNlRGVwdGhzJiYoay51c2VEZXB0aHM9ITApLHRoaXMub3B0aW9ucy5jb21wYXQmJihrLmNvbXBhdD0hMCksZHx8KGsuY29tcGlsZXI9SlNPTi5zdHJpbmdpZnkoay5jb21waWxlciksaz10aGlzLm9iamVjdExpdGVyYWwoaykpLGt9LHByZWFtYmxlOmZ1bmN0aW9uKCl7dGhpcy5sYXN0Q29udGV4dD0wLHRoaXMuc291cmNlPVtdfSxjcmVhdGVGdW5jdGlvbkNvbnRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz10aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7Yy5sZW5ndGg+MCYmKGIrPSIsICIrYy5qb2luKCIsICIpKTtmb3IodmFyIGQgaW4gdGhpcy5hbGlhc2VzKXRoaXMuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShkKSYmKGIrPSIsICIrZCsiPSIrdGhpcy5hbGlhc2VzW2RdKTt2YXIgZT1bImRlcHRoMCIsImhlbHBlcnMiLCJwYXJ0aWFscyIsImRhdGEiXTt0aGlzLnVzZURlcHRocyYmZS5wdXNoKCJkZXB0aHMiKTt2YXIgZj10aGlzLm1lcmdlU291cmNlKGIpO3JldHVybiBhPyhlLnB1c2goZiksRnVuY3Rpb24uYXBwbHkodGhpcyxlKSk6ImZ1bmN0aW9uKCIrZS5qb2luKCIsIikrIikge1xuICAiK2YrIn0ifSxtZXJnZVNvdXJjZTpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPSIiLGU9IXRoaXMuZm9yY2VCdWZmZXIsZj0wLGc9dGhpcy5zb3VyY2UubGVuZ3RoO2c+ZjtmKyspe3ZhciBoPXRoaXMuc291cmNlW2ZdO2guYXBwZW5kVG9CdWZmZXI/Yj1iP2IrIlxuICAgICsgIitoLmNvbnRlbnQ6aC5jb250ZW50OihiJiYoZD9kKz0iYnVmZmVyICs9ICIrYisiO1xuICAiOihjPSEwLGQ9YisiO1xuICAiKSxiPXZvaWQgMCksZCs9aCsiXG4gICIsdGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZXx8KGU9ITEpKX1yZXR1cm4gZT8oYnx8IWQpJiYoZCs9InJldHVybiAiKyhifHwnIiInKSsiO1xuIik6KGErPSIsIGJ1ZmZlciA9ICIrKGM/IiI6dGhpcy5pbml0aWFsaXplQnVmZmVyKCkpLGQrPWI/InJldHVybiBidWZmZXIgKyAiK2IrIjtcbiI6InJldHVybiBidWZmZXI7XG4iKSxhJiYoZD0idmFyICIrYS5zdWJzdHJpbmcoMikrKGM/IiI6IjtcbiAgIikrZCksZH0sYmxvY2tWYWx1ZTpmdW5jdGlvbihhKXt0aGlzLmFsaWFzZXMuYmxvY2tIZWxwZXJNaXNzaW5nPSJoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZyI7dmFyIGI9W3RoaXMuY29udGV4dE5hbWUoMCldO3RoaXMuc2V0dXBQYXJhbXMoYSwwLGIpO3ZhciBjPXRoaXMucG9wU3RhY2soKTtiLnNwbGljZSgxLDAsYyksdGhpcy5wdXNoKCJibG9ja0hlbHBlck1pc3NpbmcuY2FsbCgiK2Iuam9pbigiLCAiKSsiKSIpfSxhbWJpZ3VvdXNCbG9ja1ZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5hbGlhc2VzLmJsb2NrSGVscGVyTWlzc2luZz0iaGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmciO3ZhciBhPVt0aGlzLmNvbnRleHROYW1lKDApXTt0aGlzLnNldHVwUGFyYW1zKCIiLDAsYSwhMCksdGhpcy5mbHVzaElubGluZSgpO3ZhciBiPXRoaXMudG9wU3RhY2soKTthLnNwbGljZSgxLDAsYiksdGhpcy5wdXNoU291cmNlKCJpZiAoISIrdGhpcy5sYXN0SGVscGVyKyIpIHsgIitiKyIgPSBibG9ja0hlbHBlck1pc3NpbmcuY2FsbCgiK2Euam9pbigiLCAiKSsiKTsgfSIpfSxhcHBlbmRDb250ZW50OmZ1bmN0aW9uKGEpe3RoaXMucGVuZGluZ0NvbnRlbnQmJihhPXRoaXMucGVuZGluZ0NvbnRlbnQrYSksdGhpcy5wZW5kaW5nQ29udGVudD1hfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLmZsdXNoSW5saW5lKCk7dmFyIGE9dGhpcy5wb3BTdGFjaygpO3RoaXMucHVzaFNvdXJjZSgiaWYgKCIrYSsiICE9IG51bGwpIHsgIit0aGlzLmFwcGVuZFRvQnVmZmVyKGEpKyIgfSIpLHRoaXMuZW52aXJvbm1lbnQuaXNTaW1wbGUmJnRoaXMucHVzaFNvdXJjZSgiZWxzZSB7ICIrdGhpcy5hcHBlbmRUb0J1ZmZlcigiJyciKSsiIH0iKX0sYXBwZW5kRXNjYXBlZDpmdW5jdGlvbigpe3RoaXMuYWxpYXNlcy5lc2NhcGVFeHByZXNzaW9uPSJ0aGlzLmVzY2FwZUV4cHJlc3Npb24iLHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKCJlc2NhcGVFeHByZXNzaW9uKCIrdGhpcy5wb3BTdGFjaygpKyIpIikpfSxnZXRDb250ZXh0OmZ1bmN0aW9uKGEpe3RoaXMubGFzdENvbnRleHQ9YX0scHVzaENvbnRleHQ6ZnVuY3Rpb24oKXt0aGlzLnB1c2hTdGFja0xpdGVyYWwodGhpcy5jb250ZXh0TmFtZSh0aGlzLmxhc3RDb250ZXh0KSl9LGxvb2t1cE9uQ29udGV4dDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPWEubGVuZ3RoO2ZvcihjfHwhdGhpcy5vcHRpb25zLmNvbXBhdHx8dGhpcy5sYXN0Q29udGV4dD90aGlzLnB1c2hDb250ZXh0KCk6dGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChhW2QrK10pKTtlPmQ7ZCsrKXRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKGMpe3ZhciBlPXRoaXMubmFtZUxvb2t1cChjLGFbZF0sImNvbnRleHQiKTtyZXR1cm4gYj8iICYmICIrZToiICE9IG51bGwgPyAiK2UrIiA6ICIrY30pfSxsb29rdXBEYXRhOmZ1bmN0aW9uKGEsYil7YT90aGlzLnB1c2hTdGFja0xpdGVyYWwoInRoaXMuZGF0YShkYXRhLCAiK2ErIikiKTp0aGlzLnB1c2hTdGFja0xpdGVyYWwoImRhdGEiKTtmb3IodmFyIGM9Yi5sZW5ndGgsZD0wO2M+ZDtkKyspdGhpcy5yZXBsYWNlU3RhY2soZnVuY3Rpb24oYSl7cmV0dXJuIiAmJiAiK3RoaXMubmFtZUxvb2t1cChhLGJbZF0sImRhdGEiKX0pfSxyZXNvbHZlUG9zc2libGVMYW1iZGE6ZnVuY3Rpb24oKXt0aGlzLmFsaWFzZXMubGFtYmRhPSJ0aGlzLmxhbWJkYSIsdGhpcy5wdXNoKCJsYW1iZGEoIit0aGlzLnBvcFN0YWNrKCkrIiwgIit0aGlzLmNvbnRleHROYW1lKDApKyIpIil9LHB1c2hTdHJpbmdQYXJhbTpmdW5jdGlvbihhLGIpe3RoaXMucHVzaENvbnRleHQoKSx0aGlzLnB1c2hTdHJpbmcoYiksInNleHByIiE9PWImJigic3RyaW5nIj09dHlwZW9mIGE/dGhpcy5wdXNoU3RyaW5nKGEpOnRoaXMucHVzaFN0YWNrTGl0ZXJhbChhKSl9LGVtcHR5SGFzaDpmdW5jdGlvbigpe3RoaXMucHVzaFN0YWNrTGl0ZXJhbCgie30iKSx0aGlzLnRyYWNrSWRzJiZ0aGlzLnB1c2goInt9IiksdGhpcy5zdHJpbmdQYXJhbXMmJih0aGlzLnB1c2goInt9IiksdGhpcy5wdXNoKCJ7fSIpKX0scHVzaEhhc2g6ZnVuY3Rpb24oKXt0aGlzLmhhc2gmJnRoaXMuaGFzaGVzLnB1c2godGhpcy5oYXNoKSx0aGlzLmhhc2g9e3ZhbHVlczpbXSx0eXBlczpbXSxjb250ZXh0czpbXSxpZHM6W119fSxwb3BIYXNoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5oYXNoO3RoaXMuaGFzaD10aGlzLmhhc2hlcy5wb3AoKSx0aGlzLnRyYWNrSWRzJiZ0aGlzLnB1c2goInsiK2EuaWRzLmpvaW4oIiwiKSsifSIpLHRoaXMuc3RyaW5nUGFyYW1zJiYodGhpcy5wdXNoKCJ7IithLmNvbnRleHRzLmpvaW4oIiwiKSsifSIpLHRoaXMucHVzaCgieyIrYS50eXBlcy5qb2luKCIsIikrIn0iKSksdGhpcy5wdXNoKCJ7XG4gICAgIithLnZhbHVlcy5qb2luKCIsXG4gICAgIikrIlxuICB9Iil9LHB1c2hTdHJpbmc6ZnVuY3Rpb24oYSl7dGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKGEpKX0scHVzaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pbmxpbmVTdGFjay5wdXNoKGEpLGF9LHB1c2hMaXRlcmFsOmZ1bmN0aW9uKGEpe3RoaXMucHVzaFN0YWNrTGl0ZXJhbChhKX0scHVzaFByb2dyYW06ZnVuY3Rpb24oYSl7bnVsbCE9YT90aGlzLnB1c2hTdGFja0xpdGVyYWwodGhpcy5wcm9ncmFtRXhwcmVzc2lvbihhKSk6dGhpcy5wdXNoU3RhY2tMaXRlcmFsKG51bGwpfSxpbnZva2VIZWxwZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWxpYXNlcy5oZWxwZXJNaXNzaW5nPSJoZWxwZXJzLmhlbHBlck1pc3NpbmciO3ZhciBkPXRoaXMucG9wU3RhY2soKSxlPXRoaXMuc2V0dXBIZWxwZXIoYSxiKSxmPShjP2UubmFtZSsiIHx8ICI6IiIpK2QrIiB8fCBoZWxwZXJNaXNzaW5nIjt0aGlzLnB1c2goIigoIitmKyIpLmNhbGwoIitlLmNhbGxQYXJhbXMrIikpIil9LGludm9rZUtub3duSGVscGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5zZXR1cEhlbHBlcihhLGIpO3RoaXMucHVzaChjLm5hbWUrIi5jYWxsKCIrYy5jYWxsUGFyYW1zKyIpIil9LGludm9rZUFtYmlndW91czpmdW5jdGlvbihhLGIpe3RoaXMuYWxpYXNlcy5mdW5jdGlvblR5cGU9JyJmdW5jdGlvbiInLHRoaXMuYWxpYXNlcy5oZWxwZXJNaXNzaW5nPSJoZWxwZXJzLmhlbHBlck1pc3NpbmciLHRoaXMudXNlUmVnaXN0ZXIoImhlbHBlciIpO3ZhciBjPXRoaXMucG9wU3RhY2soKTt0aGlzLmVtcHR5SGFzaCgpO3ZhciBkPXRoaXMuc2V0dXBIZWxwZXIoMCxhLGIpLGU9dGhpcy5sYXN0SGVscGVyPXRoaXMubmFtZUxvb2t1cCgiaGVscGVycyIsYSwiaGVscGVyIik7dGhpcy5wdXNoKCIoKGhlbHBlciA9IChoZWxwZXIgPSAiK2UrIiB8fCAiK2MrIikgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmciKyhkLnBhcmFtc0luaXQ/IiksKCIrZC5wYXJhbXNJbml0OiIiKSsiKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoIitkLmNhbGxQYXJhbXMrIikgOiBoZWxwZXIpKSIpfSxpbnZva2VQYXJ0aWFsOmZ1bmN0aW9uKGEsYil7dmFyIGM9W3RoaXMubmFtZUxvb2t1cCgicGFydGlhbHMiLGEsInBhcnRpYWwiKSwiJyIrYisiJyIsIiciK2ErIiciLHRoaXMucG9wU3RhY2soKSx0aGlzLnBvcFN0YWNrKCksImhlbHBlcnMiLCJwYXJ0aWFscyJdO3RoaXMub3B0aW9ucy5kYXRhP2MucHVzaCgiZGF0YSIpOnRoaXMub3B0aW9ucy5jb21wYXQmJmMucHVzaCgidW5kZWZpbmVkIiksdGhpcy5vcHRpb25zLmNvbXBhdCYmYy5wdXNoKCJkZXB0aHMiKSx0aGlzLnB1c2goInRoaXMuaW52b2tlUGFydGlhbCgiK2Muam9pbigiLCAiKSsiKSIpfSxhc3NpZ25Ub0hhc2g6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpcy5wb3BTdGFjaygpO3RoaXMudHJhY2tJZHMmJihkPXRoaXMucG9wU3RhY2soKSksdGhpcy5zdHJpbmdQYXJhbXMmJihjPXRoaXMucG9wU3RhY2soKSxiPXRoaXMucG9wU3RhY2soKSk7dmFyIGY9dGhpcy5oYXNoO2ImJmYuY29udGV4dHMucHVzaCgiJyIrYSsiJzogIitiKSxjJiZmLnR5cGVzLnB1c2goIiciK2ErIic6ICIrYyksZCYmZi5pZHMucHVzaCgiJyIrYSsiJzogIitkKSxmLnZhbHVlcy5wdXNoKCInIithKyInOiAoIitlKyIpIil9LHB1c2hJZDpmdW5jdGlvbihhLGIpeyJJRCI9PT1hfHwiREFUQSI9PT1hP3RoaXMucHVzaFN0cmluZyhiKToic2V4cHIiPT09YT90aGlzLnB1c2hTdGFja0xpdGVyYWwoInRydWUiKTp0aGlzLnB1c2hTdGFja0xpdGVyYWwoIm51bGwiKX0sY29tcGlsZXI6ZCxjb21waWxlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZCxlPWEuY2hpbGRyZW4sZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKyl7Yz1lW2ZdLGQ9bmV3IHRoaXMuY29tcGlsZXI7dmFyIGg9dGhpcy5tYXRjaEV4aXN0aW5nUHJvZ3JhbShjKTtudWxsPT1oPyh0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgiIiksaD10aGlzLmNvbnRleHQucHJvZ3JhbXMubGVuZ3RoLGMuaW5kZXg9aCxjLm5hbWU9InByb2dyYW0iK2gsdGhpcy5jb250ZXh0LnByb2dyYW1zW2hdPWQuY29tcGlsZShjLGIsdGhpcy5jb250ZXh0LCF0aGlzLnByZWNvbXBpbGUpLHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaF09Yyx0aGlzLnVzZURlcHRocz10aGlzLnVzZURlcHRoc3x8ZC51c2VEZXB0aHMpOihjLmluZGV4PWgsYy5uYW1lPSJwcm9ncmFtIitoKX19LG1hdGNoRXhpc3RpbmdQcm9ncmFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7Yz5iO2IrKyl7dmFyIGQ9dGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tiXTtpZihkJiZkLmVxdWFscyhhKSlyZXR1cm4gYn19LHByb2dyYW1FeHByZXNzaW9uOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZW52aXJvbm1lbnQuY2hpbGRyZW5bYV0sYz0oYi5kZXB0aHMubGlzdCx0aGlzLnVzZURlcHRocyksZD1bYi5pbmRleCwiZGF0YSJdO3JldHVybiBjJiZkLnB1c2goImRlcHRocyIpLCJ0aGlzLnByb2dyYW0oIitkLmpvaW4oIiwgIikrIikifSx1c2VSZWdpc3RlcjpmdW5jdGlvbihhKXt0aGlzLnJlZ2lzdGVyc1thXXx8KHRoaXMucmVnaXN0ZXJzW2FdPSEwLHRoaXMucmVnaXN0ZXJzLmxpc3QucHVzaChhKSl9LHB1c2hTdGFja0xpdGVyYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaChuZXcgYyhhKSl9LHB1c2hTb3VyY2U6ZnVuY3Rpb24oYSl7dGhpcy5wZW5kaW5nQ29udGVudCYmKHRoaXMuc291cmNlLnB1c2godGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnF1b3RlZFN0cmluZyh0aGlzLnBlbmRpbmdDb250ZW50KSkpLHRoaXMucGVuZGluZ0NvbnRlbnQ9dm9pZCAwKSxhJiZ0aGlzLnNvdXJjZS5wdXNoKGEpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dGhpcy5mbHVzaElubGluZSgpO3ZhciBiPXRoaXMuaW5jclN0YWNrKCk7cmV0dXJuIHRoaXMucHVzaFNvdXJjZShiKyIgPSAiK2ErIjsiKSx0aGlzLmNvbXBpbGVTdGFjay5wdXNoKGIpLGJ9LHJlcGxhY2VTdGFjazpmdW5jdGlvbihhKXt7dmFyIGIsZCxlLGY9IiI7dGhpcy5pc0lubGluZSgpfWlmKCF0aGlzLmlzSW5saW5lKCkpdGhyb3cgbmV3IGgoInJlcGxhY2VTdGFjayBvbiBub24taW5saW5lIik7dmFyIGc9dGhpcy5wb3BTdGFjayghMCk7aWYoZyBpbnN0YW5jZW9mIGMpZj1iPWcudmFsdWUsZT0hMDtlbHNle2Q9IXRoaXMuc3RhY2tTbG90O3ZhciBpPWQ/dGhpcy5pbmNyU3RhY2soKTp0aGlzLnRvcFN0YWNrTmFtZSgpO2Y9IigiK3RoaXMucHVzaChpKSsiID0gIitnKyIpIixiPXRoaXMudG9wU3RhY2soKX12YXIgaj1hLmNhbGwodGhpcyxiKTtlfHx0aGlzLnBvcFN0YWNrKCksZCYmdGhpcy5zdGFja1Nsb3QtLSx0aGlzLnB1c2goIigiK2YraisiKSIpfSxpbmNyU3RhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFja1Nsb3QrKyx0aGlzLnN0YWNrU2xvdD50aGlzLnN0YWNrVmFycy5sZW5ndGgmJnRoaXMuc3RhY2tWYXJzLnB1c2goInN0YWNrIit0aGlzLnN0YWNrU2xvdCksdGhpcy50b3BTdGFja05hbWUoKX0sdG9wU3RhY2tOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuInN0YWNrIit0aGlzLnN0YWNrU2xvdH0sZmx1c2hJbmxpbmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmlubGluZVN0YWNrO2lmKGEubGVuZ3RoKXt0aGlzLmlubGluZVN0YWNrPVtdO2Zvcih2YXIgYj0wLGQ9YS5sZW5ndGg7ZD5iO2IrKyl7dmFyIGU9YVtiXTtlIGluc3RhbmNlb2YgYz90aGlzLmNvbXBpbGVTdGFjay5wdXNoKGUpOnRoaXMucHVzaFN0YWNrKGUpfX19LGlzSW5saW5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5saW5lU3RhY2subGVuZ3RofSxwb3BTdGFjazpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlzSW5saW5lKCksZD0oYj90aGlzLmlubGluZVN0YWNrOnRoaXMuY29tcGlsZVN0YWNrKS5wb3AoKTtpZighYSYmZCBpbnN0YW5jZW9mIGMpcmV0dXJuIGQudmFsdWU7aWYoIWIpe2lmKCF0aGlzLnN0YWNrU2xvdCl0aHJvdyBuZXcgaCgiSW52YWxpZCBzdGFjayBwb3AiKTt0aGlzLnN0YWNrU2xvdC0tfXJldHVybiBkfSx0b3BTdGFjazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaXNJbmxpbmUoKT90aGlzLmlubGluZVN0YWNrOnRoaXMuY29tcGlsZVN0YWNrLGI9YVthLmxlbmd0aC0xXTtyZXR1cm4gYiBpbnN0YW5jZW9mIGM/Yi52YWx1ZTpifSxjb250ZXh0TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51c2VEZXB0aHMmJmE/ImRlcHRoc1siK2ErIl0iOiJkZXB0aCIrYX0scXVvdGVkU3RyaW5nOmZ1bmN0aW9uKGEpe3JldHVybiciJythLnJlcGxhY2UoL1xcL2csIlxcXFwiKS5yZXBsYWNlKC8iL2csJ1xcIicpLnJlcGxhY2UoL1xuL2csIlxcbiIpLnJlcGxhY2UoL1xyL2csIlxcciIpLnJlcGxhY2UoL1x1MjAyOC9nLCJcXHUyMDI4IikucmVwbGFjZSgvXHUyMDI5L2csIlxcdTIwMjkiKSsnIid9LG9iamVjdExpdGVyYWw6ZnVuY3Rpb24oYSl7dmFyIGI9W107Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5wdXNoKHRoaXMucXVvdGVkU3RyaW5nKGMpKyI6IithW2NdKTtyZXR1cm4ieyIrYi5qb2luKCIsIikrIn0ifSxzZXR1cEhlbHBlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT10aGlzLnNldHVwUGFyYW1zKGIsYSxkLGMpLGY9dGhpcy5uYW1lTG9va3VwKCJoZWxwZXJzIixiLCJoZWxwZXIiKTtyZXR1cm57cGFyYW1zOmQscGFyYW1zSW5pdDplLG5hbWU6ZixjYWxsUGFyYW1zOlt0aGlzLmNvbnRleHROYW1lKDApXS5jb25jYXQoZCkuam9pbigiLCAiKX19LHNldHVwT3B0aW9uczpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGc9e30saD1bXSxpPVtdLGo9W107Zy5uYW1lPXRoaXMucXVvdGVkU3RyaW5nKGEpLGcuaGFzaD10aGlzLnBvcFN0YWNrKCksdGhpcy50cmFja0lkcyYmKGcuaGFzaElkcz10aGlzLnBvcFN0YWNrKCkpLHRoaXMuc3RyaW5nUGFyYW1zJiYoZy5oYXNoVHlwZXM9dGhpcy5wb3BTdGFjaygpLGcuaGFzaENvbnRleHRzPXRoaXMucG9wU3RhY2soKSksZT10aGlzLnBvcFN0YWNrKCksZj10aGlzLnBvcFN0YWNrKCksKGZ8fGUpJiYoZnx8KGY9InRoaXMubm9vcCIpLGV8fChlPSJ0aGlzLm5vb3AiKSxnLmZuPWYsZy5pbnZlcnNlPWUpO2Zvcih2YXIgaz1iO2stLTspZD10aGlzLnBvcFN0YWNrKCksY1trXT1kLHRoaXMudHJhY2tJZHMmJihqW2tdPXRoaXMucG9wU3RhY2soKSksdGhpcy5zdHJpbmdQYXJhbXMmJihpW2tdPXRoaXMucG9wU3RhY2soKSxoW2tdPXRoaXMucG9wU3RhY2soKSk7cmV0dXJuIHRoaXMudHJhY2tJZHMmJihnLmlkcz0iWyIrai5qb2luKCIsIikrIl0iKSx0aGlzLnN0cmluZ1BhcmFtcyYmKGcudHlwZXM9IlsiK2kuam9pbigiLCIpKyJdIixnLmNvbnRleHRzPSJbIitoLmpvaW4oIiwiKSsiXSIpLHRoaXMub3B0aW9ucy5kYXRhJiYoZy5kYXRhPSJkYXRhIiksZ30sc2V0dXBQYXJhbXM6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy5vYmplY3RMaXRlcmFsKHRoaXMuc2V0dXBPcHRpb25zKGEsYixjKSk7cmV0dXJuIGQ/KHRoaXMudXNlUmVnaXN0ZXIoIm9wdGlvbnMiKSxjLnB1c2goIm9wdGlvbnMiKSwib3B0aW9ucz0iK2UpOihjLnB1c2goZSksIiIpfX07Zm9yKHZhciBpPSJicmVhayBlbHNlIG5ldyB2YXIgY2FzZSBmaW5hbGx5IHJldHVybiB2b2lkIGNhdGNoIGZvciBzd2l0Y2ggd2hpbGUgY29udGludWUgZnVuY3Rpb24gdGhpcyB3aXRoIGRlZmF1bHQgaWYgdGhyb3cgZGVsZXRlIGluIHRyeSBkbyBpbnN0YW5jZW9mIHR5cGVvZiBhYnN0cmFjdCBlbnVtIGludCBzaG9ydCBib29sZWFuIGV4cG9ydCBpbnRlcmZhY2Ugc3RhdGljIGJ5dGUgZXh0ZW5kcyBsb25nIHN1cGVyIGNoYXIgZmluYWwgbmF0aXZlIHN5bmNocm9uaXplZCBjbGFzcyBmbG9hdCBwYWNrYWdlIHRocm93cyBjb25zdCBnb3RvIHByaXZhdGUgdHJhbnNpZW50IGRlYnVnZ2VyIGltcGxlbWVudHMgcHJvdGVjdGVkIHZvbGF0aWxlIGRvdWJsZSBpbXBvcnQgcHVibGljIGxldCB5aWVsZCIuc3BsaXQoIiAiKSxqPWQuUkVTRVJWRURfV09SRFM9e30saz0wLGw9aS5sZW5ndGg7bD5rO2srKylqW2lba11dPSEwO3JldHVybiBkLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiFkLlJFU0VSVkVEX1dPUkRTW2FdJiYvXlthLXpBLVpfJF1bMC05YS16QS1aXyRdKiQvLnRlc3QoYSl9LGU9ZH0oZCxjKSxtPWZ1bmN0aW9uKGEsYixjLGQsZSl7InVzZSBzdHJpY3QiO3ZhciBmLGc9YSxoPWIsaT1jLnBhcnNlcixqPWMucGFyc2Usaz1kLkNvbXBpbGVyLGw9ZC5jb21waWxlLG09ZC5wcmVjb21waWxlLG49ZSxvPWcuY3JlYXRlLHA9ZnVuY3Rpb24oKXt2YXIgYT1vKCk7cmV0dXJuIGEuY29tcGlsZT1mdW5jdGlvbihiLGMpe3JldHVybiBsKGIsYyxhKX0sYS5wcmVjb21waWxlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIG0oYixjLGEpfSxhLkFTVD1oLGEuQ29tcGlsZXI9ayxhLkphdmFTY3JpcHRDb21waWxlcj1uLGEuUGFyc2VyPWksYS5wYXJzZT1qLGF9O3JldHVybiBnPXAoKSxnLmNyZWF0ZT1wLGdbImRlZmF1bHQiXT1nLGY9Z30oZixnLGosayxsKTtyZXR1cm4gbX0pOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvaGlnaGxpZ2h0LjcuMy5wYWNrLmpzIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvaGlnaGxpZ2h0LjcuMy5wYWNrLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWFkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi9oaWdobGlnaHQuNy4zLnBhY2suanMKQEAgLTAsMCArMSwyMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCit2YXIgaGxqcz1uZXcgZnVuY3Rpb24oKXtmdW5jdGlvbiBsKG8pe3JldHVybiBvLnJlcGxhY2UoLyYvZ20sIiZhbXA7IikucmVwbGFjZSgvPC9nbSwiJmx0OyIpLnJlcGxhY2UoLz4vZ20sIiZndDsiKX1mdW5jdGlvbiBiKHApe2Zvcih2YXIgbz1wLmZpcnN0Q2hpbGQ7bztvPW8ubmV4dFNpYmxpbmcpe2lmKG8ubm9kZU5hbWU9PSJDT0RFIil7cmV0dXJuIG99aWYoIShvLm5vZGVUeXBlPT0zJiZvLm5vZGVWYWx1ZS5tYXRjaCgvXHMrLykpKXticmVha319fWZ1bmN0aW9uIGgocCxvKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHAuY2hpbGROb2RlcyxmdW5jdGlvbihxKXtpZihxLm5vZGVUeXBlPT0zKXtyZXR1cm4gbz9xLm5vZGVWYWx1ZS5yZXBsYWNlKC9cbi9nLCIiKTpxLm5vZGVWYWx1ZX1pZihxLm5vZGVOYW1lPT0iQlIiKXtyZXR1cm4iXG4ifXJldHVybiBoKHEsbyl9KS5qb2luKCIiKX1mdW5jdGlvbiBhKHEpe3ZhciBwPShxLmNsYXNzTmFtZSsiICIrcS5wYXJlbnROb2RlLmNsYXNzTmFtZSkuc3BsaXQoL1xzKy8pO3A9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIucmVwbGFjZSgvXmxhbmd1YWdlLS8sIiIpfSk7Zm9yKHZhciBvPTA7bzxwLmxlbmd0aDtvKyspe2lmKGVbcFtvXV18fHBbb109PSJuby1oaWdobGlnaHQiKXtyZXR1cm4gcFtvXX19fWZ1bmN0aW9uIGMocSl7dmFyIG89W107KGZ1bmN0aW9uIHAocixzKXtmb3IodmFyIHQ9ci5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKXtpZih0Lm5vZGVUeXBlPT0zKXtzKz10Lm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtpZih0Lm5vZGVOYW1lPT0iQlIiKXtzKz0xfWVsc2V7aWYodC5ub2RlVHlwZT09MSl7by5wdXNoKHtldmVudDoic3RhcnQiLG9mZnNldDpzLG5vZGU6dH0pO3M9cCh0LHMpO28ucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDpzLG5vZGU6dH0pfX19fXJldHVybiBzfSkocSwwKTtyZXR1cm4gb31mdW5jdGlvbiBqKHgsdix3KXt2YXIgcD0wO3ZhciB5PSIiO3ZhciByPVtdO2Z1bmN0aW9uIHQoKXtpZih4Lmxlbmd0aCYmdi5sZW5ndGgpe2lmKHhbMF0ub2Zmc2V0IT12WzBdLm9mZnNldCl7cmV0dXJuKHhbMF0ub2Zmc2V0PHZbMF0ub2Zmc2V0KT94OnZ9ZWxzZXtyZXR1cm4gdlswXS5ldmVudD09InN0YXJ0Ij94OnZ9fWVsc2V7cmV0dXJuIHgubGVuZ3RoP3g6dn19ZnVuY3Rpb24gcyhBKXtmdW5jdGlvbiB6KEIpe3JldHVybiIgIitCLm5vZGVOYW1lKyc9IicrbChCLnZhbHVlKSsnIid9cmV0dXJuIjwiK0Eubm9kZU5hbWUrQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKEEuYXR0cmlidXRlcyx6KS5qb2luKCIiKSsiPiJ9d2hpbGUoeC5sZW5ndGh8fHYubGVuZ3RoKXt2YXIgdT10KCkuc3BsaWNlKDAsMSlbMF07eSs9bCh3LnN1YnN0cihwLHUub2Zmc2V0LXApKTtwPXUub2Zmc2V0O2lmKHUuZXZlbnQ9PSJzdGFydCIpe3krPXModS5ub2RlKTtyLnB1c2godS5ub2RlKX1lbHNle2lmKHUuZXZlbnQ9PSJzdG9wIil7dmFyIG8scT1yLmxlbmd0aDtkb3txLS07bz1yW3FdO3krPSgiPC8iK28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSsiPiIpfXdoaWxlKG8hPXUubm9kZSk7ci5zcGxpY2UocSwxKTt3aGlsZShxPHIubGVuZ3RoKXt5Kz1zKHJbcV0pO3ErK319fX1yZXR1cm4geStsKHcuc3Vic3RyKHApKX1mdW5jdGlvbiBmKHEpe2Z1bmN0aW9uIG8ocyxyKXtyZXR1cm4gUmVnRXhwKHMsIm0iKyhxLmNJPyJpIjoiIikrKHI/ImciOiIiKSl9ZnVuY3Rpb24gcCh5LHcpe2lmKHkuY29tcGlsZWQpe3JldHVybn15LmNvbXBpbGVkPXRydWU7dmFyIHM9W107aWYoeS5rKXt2YXIgcj17fTtmdW5jdGlvbiB6KEEsdCl7dC5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEM9Qi5zcGxpdCgifCIpO3JbQ1swXV09W0EsQ1sxXT9OdW1iZXIoQ1sxXSk6MV07cy5wdXNoKENbMF0pfSl9eS5sUj1vKHkubHx8aGxqcy5JUix0cnVlKTtpZih0eXBlb2YgeS5rPT0ic3RyaW5nIil7eigia2V5d29yZCIseS5rKX1lbHNle2Zvcih2YXIgeCBpbiB5Lmspe2lmKCF5LmsuaGFzT3duUHJvcGVydHkoeCkpe2NvbnRpbnVlfXooeCx5LmtbeF0pfX15Lms9cn1pZih3KXtpZih5LmJXSyl7eS5iPSJcXGIoIitzLmpvaW4oInwiKSsiKVxccyJ9eS5iUj1vKHkuYj95LmI6IlxcQnxcXGIiKTtpZigheS5lJiYheS5lVyl7eS5lPSJcXEJ8XFxiIn1pZih5LmUpe3kuZVI9byh5LmUpfXkudEU9eS5lfHwiIjtpZih5LmVXJiZ3LnRFKXt5LnRFKz0oeS5lPyJ8IjoiIikrdy50RX19aWYoeS5pKXt5LmlSPW8oeS5pKX1pZih5LnI9PT11bmRlZmluZWQpe3kucj0xfWlmKCF5LmMpe3kuYz1bXX1mb3IodmFyIHY9MDt2PHkuYy5sZW5ndGg7disrKXtpZih5LmNbdl09PSJzZWxmIil7eS5jW3ZdPXl9cCh5LmNbdl0seSl9aWYoeS5zdGFydHMpe3AoeS5zdGFydHMsdyl9dmFyIHU9W107Zm9yKHZhciB2PTA7djx5LmMubGVuZ3RoO3YrKyl7dS5wdXNoKHkuY1t2XS5iKX1pZih5LnRFKXt1LnB1c2goeS50RSl9aWYoeS5pKXt1LnB1c2goeS5pKX15LnQ9dS5sZW5ndGg/byh1LmpvaW4oInwiKSx0cnVlKTp7ZXhlYzpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbH19fXAocSl9ZnVuY3Rpb24gZChELEUpe2Z1bmN0aW9uIG8ocixNKXtmb3IodmFyIEw9MDtMPE0uYy5sZW5ndGg7TCsrKXt2YXIgSz1NLmNbTF0uYlIuZXhlYyhyKTtpZihLJiZLLmluZGV4PT0wKXtyZXR1cm4gTS5jW0xdfX19ZnVuY3Rpb24gcyhLLHIpe2lmKEsuZSYmSy5lUi50ZXN0KHIpKXtyZXR1cm4gS31pZihLLmVXKXtyZXR1cm4gcyhLLnBhcmVudCxyKX19ZnVuY3Rpb24gdChyLEspe3JldHVybiBLLmkmJksuaVIudGVzdChyKX1mdW5jdGlvbiB5KEwscil7dmFyIEs9Ri5jST9yWzBdLnRvTG93ZXJDYXNlKCk6clswXTtyZXR1cm4gTC5rLmhhc093blByb3BlcnR5KEspJiZMLmtbS119ZnVuY3Rpb24gRygpe3ZhciBLPWwodyk7aWYoIUEuayl7cmV0dXJuIEt9dmFyIHI9IiI7dmFyIE49MDtBLmxSLmxhc3RJbmRleD0wO3ZhciBMPUEubFIuZXhlYyhLKTt3aGlsZShMKXtyKz1LLnN1YnN0cihOLEwuaW5kZXgtTik7dmFyIE09eShBLEwpO2lmKE0pe3YrPU1bMV07cis9JzxzcGFuIGNsYXNzPSInK01bMF0rJyI+JytMWzBdKyI8L3NwYW4+In1lbHNle3IrPUxbMF19Tj1BLmxSLmxhc3RJbmRleDtMPUEubFIuZXhlYyhLKX1yZXR1cm4gcitLLnN1YnN0cihOKX1mdW5jdGlvbiB6KCl7aWYoQS5zTCYmIWVbQS5zTF0pe3JldHVybiBsKHcpfXZhciByPUEuc0w/ZChBLnNMLHcpOmcodyk7aWYoQS5yPjApe3YrPXIua2V5d29yZF9jb3VudDtCKz1yLnJ9cmV0dXJuJzxzcGFuIGNsYXNzPSInK3IubGFuZ3VhZ2UrJyI+JytyLnZhbHVlKyI8L3NwYW4+In1mdW5jdGlvbiBKKCl7cmV0dXJuIEEuc0whPT11bmRlZmluZWQ/eigpOkcoKX1mdW5jdGlvbiBJKEwscil7dmFyIEs9TC5jTj8nPHNwYW4gY2xhc3M9IicrTC5jTisnIj4nOiIiO2lmKEwuckIpe3grPUs7dz0iIn1lbHNle2lmKEwuZUIpe3grPWwocikrSzt3PSIifWVsc2V7eCs9Szt3PXJ9fUE9T2JqZWN0LmNyZWF0ZShMLHtwYXJlbnQ6e3ZhbHVlOkF9fSk7Qis9TC5yfWZ1bmN0aW9uIEMoSyxyKXt3Kz1LO2lmKHI9PT11bmRlZmluZWQpe3grPUooKTtyZXR1cm4gMH12YXIgTD1vKHIsQSk7aWYoTCl7eCs9SigpO0koTCxyKTtyZXR1cm4gTC5yQj8wOnIubGVuZ3RofXZhciBNPXMoQSxyKTtpZihNKXtpZighKE0uckV8fE0uZUUpKXt3Kz1yfXgrPUooKTtkb3tpZihBLmNOKXt4Kz0iPC9zcGFuPiJ9QT1BLnBhcmVudH13aGlsZShBIT1NLnBhcmVudCk7aWYoTS5lRSl7eCs9bChyKX13PSIiO2lmKE0uc3RhcnRzKXtJKE0uc3RhcnRzLCIiKX1yZXR1cm4gTS5yRT8wOnIubGVuZ3RofWlmKHQocixBKSl7dGhyb3ciSWxsZWdhbCJ9dys9cjtyZXR1cm4gci5sZW5ndGh8fDF9dmFyIEY9ZVtEXTtmKEYpO3ZhciBBPUY7dmFyIHc9IiI7dmFyIEI9MDt2YXIgdj0wO3ZhciB4PSIiO3RyeXt2YXIgdSxxLHA9MDt3aGlsZSh0cnVlKXtBLnQubGFzdEluZGV4PXA7dT1BLnQuZXhlYyhFKTtpZighdSl7YnJlYWt9cT1DKEUuc3Vic3RyKHAsdS5pbmRleC1wKSx1WzBdKTtwPXUuaW5kZXgrcX1DKEUuc3Vic3RyKHApKTtyZXR1cm57cjpCLGtleXdvcmRfY291bnQ6dix2YWx1ZTp4LGxhbmd1YWdlOkR9fWNhdGNoKEgpe2lmKEg9PSJJbGxlZ2FsIil7cmV0dXJue3I6MCxrZXl3b3JkX2NvdW50OjAsdmFsdWU6bChFKX19ZWxzZXt0aHJvdyBIfX19ZnVuY3Rpb24gZyhzKXt2YXIgbz17a2V5d29yZF9jb3VudDowLHI6MCx2YWx1ZTpsKHMpfTt2YXIgcT1vO2Zvcih2YXIgcCBpbiBlKXtpZighZS5oYXNPd25Qcm9wZXJ0eShwKSl7Y29udGludWV9dmFyIHI9ZChwLHMpO3IubGFuZ3VhZ2U9cDtpZihyLmtleXdvcmRfY291bnQrci5yPnEua2V5d29yZF9jb3VudCtxLnIpe3E9cn1pZihyLmtleXdvcmRfY291bnQrci5yPm8ua2V5d29yZF9jb3VudCtvLnIpe3E9bztvPXJ9fWlmKHEubGFuZ3VhZ2Upe28uc2Vjb25kX2Jlc3Q9cX1yZXR1cm4gb31mdW5jdGlvbiBpKHEscCxvKXtpZihwKXtxPXEucmVwbGFjZSgvXigoPFtePl0rPnxcdCkrKS9nbSxmdW5jdGlvbihyLHYsdSx0KXtyZXR1cm4gdi5yZXBsYWNlKC9cdC9nLHApfSl9aWYobyl7cT1xLnJlcGxhY2UoL1xuL2csIjxicj4iKX1yZXR1cm4gcX1mdW5jdGlvbiBtKHIsdSxwKXt2YXIgdj1oKHIscCk7dmFyIHQ9YShyKTtpZih0PT0ibm8taGlnaGxpZ2h0Iil7cmV0dXJufXZhciB3PXQ/ZCh0LHYpOmcodik7dD13Lmxhbmd1YWdlO3ZhciBvPWMocik7aWYoby5sZW5ndGgpe3ZhciBxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO3EuaW5uZXJIVE1MPXcudmFsdWU7dy52YWx1ZT1qKG8sYyhxKSx2KX13LnZhbHVlPWkody52YWx1ZSx1LHApO3ZhciBzPXIuY2xhc3NOYW1lO2lmKCFzLm1hdGNoKCIoXFxzfF4pKGxhbmd1YWdlLSk/Iit0KyIoXFxzfCQpIikpe3M9cz8ocysiICIrdCk6dH1yLmlubmVySFRNTD13LnZhbHVlO3IuY2xhc3NOYW1lPXM7ci5yZXN1bHQ9e2xhbmd1YWdlOnQsa3c6dy5rZXl3b3JkX2NvdW50LHJlOncucn07aWYody5zZWNvbmRfYmVzdCl7ci5zZWNvbmRfYmVzdD17bGFuZ3VhZ2U6dy5zZWNvbmRfYmVzdC5sYW5ndWFnZSxrdzp3LnNlY29uZF9iZXN0LmtleXdvcmRfY291bnQscmU6dy5zZWNvbmRfYmVzdC5yfX19ZnVuY3Rpb24gbigpe2lmKG4uY2FsbGVkKXtyZXR1cm59bi5jYWxsZWQ9dHJ1ZTtBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpLGIpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe20obyxobGpzLnRhYlJlcGxhY2UpfSl9ZnVuY3Rpb24gaygpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixuLGZhbHNlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbixmYWxzZSl9dmFyIGU9e307dGhpcy5MQU5HVUFHRVM9ZTt0aGlzLmhpZ2hsaWdodD1kO3RoaXMuaGlnaGxpZ2h0QXV0bz1nO3RoaXMuZml4TWFya3VwPWk7dGhpcy5oaWdobGlnaHRCbG9jaz1tO3RoaXMuaW5pdEhpZ2hsaWdodGluZz1uO3RoaXMuaW5pdEhpZ2hsaWdodGluZ09uTG9hZD1rO3RoaXMuSVI9IlthLXpBLVpdW2EtekEtWjAtOV9dKiI7dGhpcy5VSVI9IlthLXpBLVpfXVthLXpBLVowLTlfXSoiO3RoaXMuTlI9IlxcYlxcZCsoXFwuXFxkKyk/Ijt0aGlzLkNOUj0iKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIjt0aGlzLkJOUj0iXFxiKDBiWzAxXSspIjt0aGlzLlJTUj0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8XFwufC18LT18L3wvPXw6fDt8PHw8PHw8PD18PD18PXw9PXw9PT18Pnw+PXw+Pnw+Pj18Pj4+fD4+Pj18XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+Ijt0aGlzLkJFPXtiOiJcXFxcW1xcc1xcU10iLHI6MH07dGhpcy5BU009e2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGk6IlxcbiIsYzpbdGhpcy5CRV0scjowfTt0aGlzLlFTTT17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuQ0xDTT17Y046ImNvbW1lbnQiLGI6Ii8vIixlOiIkIn07dGhpcy5DQkxDTE09e2NOOiJjb21tZW50IixiOiIvXFwqIixlOiJcXCovIn07dGhpcy5IQ009e2NOOiJjb21tZW50IixiOiIjIixlOiIkIn07dGhpcy5OTT17Y046Im51bWJlciIsYjp0aGlzLk5SLHI6MH07dGhpcy5DTk09e2NOOiJudW1iZXIiLGI6dGhpcy5DTlIscjowfTt0aGlzLkJOTT17Y046Im51bWJlciIsYjp0aGlzLkJOUixyOjB9O3RoaXMuaW5oZXJpdD1mdW5jdGlvbihxLHIpe3ZhciBvPXt9O2Zvcih2YXIgcCBpbiBxKXtvW3BdPXFbcF19aWYocil7Zm9yKHZhciBwIGluIHIpe29bcF09cltwXX19cmV0dXJuIG99fSgpO2hsanMuTEFOR1VBR0VTLnhtbD1mdW5jdGlvbihhKXt2YXIgYz0iW0EtWmEtejAtOVxcLl86LV0rIjt2YXIgYj17ZVc6dHJ1ZSxjOlt7Y046ImF0dHJpYnV0ZSIsYjpjLHI6MH0se2I6Jz0iJyxyQjp0cnVlLGU6JyInLGM6W3tjTjoidmFsdWUiLGI6JyInLGVXOnRydWV9XX0se2I6Ij0nIixyQjp0cnVlLGU6IiciLGM6W3tjTjoidmFsdWUiLGI6IiciLGVXOnRydWV9XX0se2I6Ij0iLGM6W3tjTjoidmFsdWUiLGI6IlteXFxzLz5dKyJ9XX1dfTtyZXR1cm57Y0k6dHJ1ZSxjOlt7Y046InBpIixiOiI8XFw/IixlOiJcXD8+IixyOjEwfSx7Y046ImRvY3R5cGUiLGI6IjwhRE9DVFlQRSIsZToiPiIscjoxMCxjOlt7YjoiXFxbIixlOiJcXF0ifV19LHtjTjoiY29tbWVudCIsYjoiPCEtLSIsZToiLS0+IixyOjEwfSx7Y046ImNkYXRhIixiOiI8XFwhXFxbQ0RBVEFcXFsiLGU6IlxcXVxcXT4iLHI6MTB9LHtjTjoidGFnIixiOiI8c3R5bGUoPz1cXHN8PnwkKSIsZToiPiIsazp7dGl0bGU6InN0eWxlIn0sYzpbYl0sc3RhcnRzOntlOiI8L3N0eWxlPiIsckU6dHJ1ZSxzTDoiY3NzIn19LHtjTjoidGFnIixiOiI8c2NyaXB0KD89XFxzfD58JCkiLGU6Ij4iLGs6e3RpdGxlOiJzY3JpcHQifSxjOltiXSxzdGFydHM6e2U6IjxcL3NjcmlwdD4iLHJFOnRydWUsc0w6ImphdmFzY3JpcHQifX0se2I6IjwlIixlOiIlPiIsc0w6InZic2NyaXB0In0se2NOOiJ0YWciLGI6IjwvPyIsZToiLz8+IixjOlt7Y046InRpdGxlIixiOiJbXiAvPl0rIn0sYl19XX19KGhsanMpO2hsanMuTEFOR1VBR0VTLmpzb249ZnVuY3Rpb24oYSl7dmFyIGU9e2xpdGVyYWw6InRydWUgZmFsc2UgbnVsbCJ9O3ZhciBkPVthLlFTTSxhLkNOTV07dmFyIGM9e2NOOiJ2YWx1ZSIsZToiLCIsZVc6dHJ1ZSxlRTp0cnVlLGM6ZCxrOmV9O3ZhciBiPXtiOiJ7IixlOiJ9IixjOlt7Y046ImF0dHJpYnV0ZSIsYjonXFxzKiInLGU6JyJcXHMqOlxccyonLGVCOnRydWUsZUU6dHJ1ZSxjOlthLkJFXSxpOiJcXG4iLHN0YXJ0czpjfV0saToiXFxTIn07dmFyIGY9e2I6IlxcWyIsZToiXFxdIixjOlthLmluaGVyaXQoYyx7Y046bnVsbH0pXSxpOiJcXFMifTtkLnNwbGljZShkLmxlbmd0aCwwLGIsZik7cmV0dXJue2M6ZCxrOmUsaToiXFxTIn19KGhsanMpOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvanF1ZXJ5LTEuOC4wLm1pbi5qcyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS0xLjguMC5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViYzc5MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS0xLjguMC5taW4uanMKQEAgLTAsMCArMSwyMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiEgalF1ZXJ5IHZAMS44LjAganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLworKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBwLmVhY2goYS5zcGxpdChzKSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifWZ1bmN0aW9uIEooYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoSSwiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6K2QrIiI9PT1kPytkOkgudGVzdChkKT9wLnBhcnNlSlNPTihkKTpkfWNhdGNoKGYpe31wLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIEsoYSl7dmFyIGI7Zm9yKGIgaW4gYSl7aWYoYj09PSJkYXRhIiYmcC5pc0VtcHR5T2JqZWN0KGFbYl0pKWNvbnRpbnVlO2lmKGIhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGJiKCl7cmV0dXJuITB9ZnVuY3Rpb24gYmgoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fGEucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIGJpKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJmEubm9kZVR5cGUhPT0xKTtyZXR1cm4gYX1mdW5jdGlvbiBiaihhLGIsYyl7Yj1ifHwwO2lmKHAuaXNGdW5jdGlvbihiKSlyZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1wLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihiZS50ZXN0KGIpKXJldHVybiBwLmZpbHRlcihiLGQsIWMpO2I9cC5maWx0ZXIoYixkKX1yZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gcC5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gYmsoYSl7dmFyIGI9Ymwuc3BsaXQoInwiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gYkMoYSxiKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChiKSl9ZnVuY3Rpb24gYkQoYSxiKXtpZihiLm5vZGVUeXBlIT09MXx8IXAuaGFzRGF0YShhKSlyZXR1cm47dmFyIGMsZCxlLGY9cC5fZGF0YShhKSxnPXAuX2RhdGEoYixmKSxoPWYuZXZlbnRzO2lmKGgpe2RlbGV0ZSBnLmhhbmRsZSxnLmV2ZW50cz17fTtmb3IoYyBpbiBoKWZvcihkPTAsZT1oW2NdLmxlbmd0aDtkPGU7ZCsrKXAuZXZlbnQuYWRkKGIsYyxoW2NdW2RdKX1nLmRhdGEmJihnLmRhdGE9cC5leHRlbmQoe30sZy5kYXRhKSl9ZnVuY3Rpb24gYkUoYSxiKXt2YXIgYztpZihiLm5vZGVUeXBlIT09MSlyZXR1cm47Yi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGM9PT0ib2JqZWN0Ij8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLHAuc3VwcG9ydC5odG1sNUNsb25lJiZhLmlubmVySFRNTCYmIXAudHJpbShiLmlubmVySFRNTCkmJihiLmlubmVySFRNTD1hLmlubmVySFRNTCkpOmM9PT0iaW5wdXQiJiZidi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOmM9PT0ib3B0aW9uIj9iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOmM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIj9iLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZTpjPT09InNjcmlwdCImJmIudGV4dCE9PWEudGV4dCYmKGIudGV4dD1hLnRleHQpLGIucmVtb3ZlQXR0cmlidXRlKHAuZXhwYW5kbyl9ZnVuY3Rpb24gYkYoYSl7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYkcoYSl7YnYudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGJYKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1iVi5sZW5ndGg7d2hpbGUoZS0tKXtiPWJWW2VdK2M7aWYoYiBpbiBhKXJldHVybiBifXJldHVybiBkfWZ1bmN0aW9uIGJZKGEsYil7cmV0dXJuIGE9Ynx8YSxwLmNzcyhhLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCFwLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX1mdW5jdGlvbiBiWihhLGIpe3ZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmb3IoO2Y8ZztmKyspe2M9YVtmXTtpZighYy5zdHlsZSljb250aW51ZTtlW2ZdPXAuX2RhdGEoYywib2xkZGlzcGxheSIpLGI/KCFlW2ZdJiZjLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSImJihjLnN0eWxlLmRpc3BsYXk9IiIpLGMuc3R5bGUuZGlzcGxheT09PSIiJiZiWShjKSYmKGVbZl09cC5fZGF0YShjLCJvbGRkaXNwbGF5IixjYihjLm5vZGVOYW1lKSkpKTooZD1iSChjLCJkaXNwbGF5IiksIWVbZl0mJmQhPT0ibm9uZSImJnAuX2RhdGEoYywib2xkZGlzcGxheSIsZCkpfWZvcihmPTA7ZjxnO2YrKyl7Yz1hW2ZdO2lmKCFjLnN0eWxlKWNvbnRpbnVlO2lmKCFifHxjLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fGMuc3R5bGUuZGlzcGxheT09PSIiKWMuc3R5bGUuZGlzcGxheT1iP2VbZl18fCIiOiJub25lIn1yZXR1cm4gYX1mdW5jdGlvbiBiJChhLGIsYyl7dmFyIGQ9Yk8uZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMV0tKGN8fDApKSsoZFsyXXx8InB4Iik6Yn1mdW5jdGlvbiBiXyhhLGIsYyxkKXt2YXIgZT1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OmI9PT0id2lkdGgiPzE6MCxmPTA7Zm9yKDtlPDQ7ZSs9MiljPT09Im1hcmdpbiImJihmKz1wLmNzcyhhLGMrYlVbZV0sITApKSxkPyhjPT09ImNvbnRlbnQiJiYoZi09cGFyc2VGbG9hdChiSChhLCJwYWRkaW5nIitiVVtlXSkpfHwwKSxjIT09Im1hcmdpbiImJihmLT1wYXJzZUZsb2F0KGJIKGEsImJvcmRlciIrYlVbZV0rIldpZHRoIikpfHwwKSk6KGYrPXBhcnNlRmxvYXQoYkgoYSwicGFkZGluZyIrYlVbZV0pKXx8MCxjIT09InBhZGRpbmciJiYoZis9cGFyc2VGbG9hdChiSChhLCJib3JkZXIiK2JVW2VdKyJXaWR0aCIpKXx8MCkpO3JldHVybiBmfWZ1bmN0aW9uIGNhKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9ITAsZj1wLnN1cHBvcnQuYm94U2l6aW5nJiZwLmNzcyhhLCJib3hTaXppbmciKT09PSJib3JkZXItYm94IjtpZihkPD0wKXtkPWJIKGEsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXTtpZihiUC50ZXN0KGQpKXJldHVybiBkO2U9ZiYmKHAuc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8ZD09PWEuc3R5bGVbYl0pLGQ9cGFyc2VGbG9hdChkKXx8MH1yZXR1cm4gZCtiXyhhLGIsY3x8KGY/ImJvcmRlciI6ImNvbnRlbnQiKSxlKSsicHgifWZ1bmN0aW9uIGNiKGEpe2lmKGJSW2FdKXJldHVybiBiUlthXTt2YXIgYj1wKCI8IithKyI+IikuYXBwZW5kVG8oZS5ib2R5KSxjPWIuY3NzKCJkaXNwbGF5Iik7Yi5yZW1vdmUoKTtpZihjPT09Im5vbmUifHxjPT09IiIpe2JJPWUuYm9keS5hcHBlbmRDaGlsZChiSXx8cC5leHRlbmQoZS5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSx7ZnJhbWVCb3JkZXI6MCx3aWR0aDowLGhlaWdodDowfSkpO2lmKCFiSnx8IWJJLmNyZWF0ZUVsZW1lbnQpYko9KGJJLmNvbnRlbnRXaW5kb3d8fGJJLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYkoud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLGJKLmNsb3NlKCk7Yj1iSi5ib2R5LmFwcGVuZENoaWxkKGJKLmNyZWF0ZUVsZW1lbnQoYSkpLGM9YkgoYiwiZGlzcGxheSIpLGUuYm9keS5yZW1vdmVDaGlsZChiSSl9cmV0dXJuIGJSW2FdPWMsY31mdW5jdGlvbiBjaChhLGIsYyxkKXt2YXIgZTtpZihwLmlzQXJyYXkoYikpcC5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxjZC50ZXN0KGEpP2QoYSxlKTpjaChhKyJbIisodHlwZW9mIGU9PSJvYmplY3QiP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZwLnR5cGUoYik9PT0ib2JqZWN0Iilmb3IoZSBpbiBiKWNoKGErIlsiK2UrIl0iLGJbZV0sYyxkKTtlbHNlIGQoYSxiKX1mdW5jdGlvbiBjeShhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt0eXBlb2YgYiE9InN0cmluZyImJihjPWIsYj0iKiIpO3ZhciBkLGUsZixnPWIudG9Mb3dlckNhc2UoKS5zcGxpdChzKSxoPTAsaT1nLmxlbmd0aDtpZihwLmlzRnVuY3Rpb24oYykpZm9yKDtoPGk7aCsrKWQ9Z1toXSxmPS9eXCsvLnRlc3QoZCksZiYmKGQ9ZC5zdWJzdHIoMSl8fCIqIiksZT1hW2RdPWFbZF18fFtdLGVbZj8idW5zaGlmdCI6InB1c2giXShjKX19ZnVuY3Rpb24gY3ooYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoLGk9YVtmXSxqPTAsaz1pP2kubGVuZ3RoOjAsbD1hPT09Y3U7Zm9yKDtqPGsmJihsfHwhaCk7aisrKWg9aVtqXShjLGQsZSksdHlwZW9mIGg9PSJzdHJpbmciJiYoIWx8fGdbaF0/aD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGgpLGg9Y3ooYSxjLGQsZSxoLGcpKSk7cmV0dXJuKGx8fCFoKSYmIWdbIioiXSYmKGg9Y3ooYSxjLGQsZSwiKiIsZykpLGh9ZnVuY3Rpb24gY0EoYSxjKXt2YXIgZCxlLGY9cC5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZltkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmcC5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBjQihhLGMsZCl7dmFyIGUsZixnLGgsaT1hLmNvbnRlbnRzLGo9YS5kYXRhVHlwZXMsaz1hLnJlc3BvbnNlRmllbGRzO2ZvcihmIGluIGspZiBpbiBkJiYoY1trW2ZdXT1kW2ZdKTt3aGlsZShqWzBdPT09IioiKWouc2hpZnQoKSxlPT09YiYmKGU9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGUpZm9yKGYgaW4gaSlpZihpW2ZdJiZpW2ZdLnRlc3QoZSkpe2oudW5zaGlmdChmKTticmVha31pZihqWzBdaW4gZClnPWpbMF07ZWxzZXtmb3IoZiBpbiBkKXtpZighalswXXx8YS5jb252ZXJ0ZXJzW2YrIiAiK2pbMF1dKXtnPWY7YnJlYWt9aHx8KGg9Zil9Zz1nfHxofWlmKGcpcmV0dXJuIGchPT1qWzBdJiZqLnVuc2hpZnQoZyksZFtnXX1mdW5jdGlvbiBjQyhhLGIpe3ZhciBjLGQsZSxmLGc9YS5kYXRhVHlwZXMuc2xpY2UoKSxoPWdbMF0saT17fSxqPTA7YS5kYXRhRmlsdGVyJiYoYj1hLmRhdGFGaWx0ZXIoYixhLmRhdGFUeXBlKSk7aWYoZ1sxXSlmb3IoYyBpbiBhLmNvbnZlcnRlcnMpaVtjLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tjXTtmb3IoO2U9Z1srK2pdOylpZihlIT09IioiKXtpZihoIT09IioiJiZoIT09ZSl7Yz1pW2grIiAiK2VdfHxpWyIqICIrZV07aWYoIWMpZm9yKGQgaW4gaSl7Zj1kLnNwbGl0KCIgIik7aWYoZlsxXT09PWUpe2M9aVtoKyIgIitmWzBdXXx8aVsiKiAiK2ZbMF1dO2lmKGMpe2M9PT0hMD9jPWlbZF06aVtkXSE9PSEwJiYoZT1mWzBdLGcuc3BsaWNlKGotLSwwLGUpKTticmVha319fWlmKGMhPT0hMClpZihjJiZhWyJ0aHJvd3MiXSliPWMoYik7ZWxzZSB0cnl7Yj1jKGIpfWNhdGNoKGspe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmM/azoiTm8gY29udmVyc2lvbiBmcm9tICIraCsiIHRvICIrZX19fWg9ZX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6Yn19ZnVuY3Rpb24gY0soKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY0woKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjVCgpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y009Yn0sMCksY009cC5ub3coKX1mdW5jdGlvbiBjVShhLGIpe3AuZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9KGNTW2JdfHxbXSkuY29uY2F0KGNTWyIqIl0pLGU9MCxmPWQubGVuZ3RoO2Zvcig7ZTxmO2UrKylpZihkW2VdLmNhbGwoYSxiLGMpKXJldHVybn0pfWZ1bmN0aW9uIGNWKGEsYixjKXt2YXIgZCxlPTAsZj0wLGc9Y1IubGVuZ3RoLGg9cC5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7dmFyIGI9Y018fGNUKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD0xLShjL2ouZHVyYXRpb258fDApLGU9MCxmPWoudHdlZW5zLmxlbmd0aDtmb3IoO2U8ZjtlKyspai50d2VlbnNbZV0ucnVuKGQpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixkLGNdKSxkPDEmJmY/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOnAuZXh0ZW5kKHt9LGIpLG9wdHM6cC5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTpjTXx8Y1QoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMsZCl7dmFyIGU9cC5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGUpLGV9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7Zm9yKDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj9oLnJlc29sdmVXaXRoKGEsW2osYl0pOmgucmVqZWN0V2l0aChhLFtqLGJdKSx0aGlzfX0pLGs9ai5wcm9wcztjVyhrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmb3IoO2U8ZztlKyspe2Q9Y1JbZV0uY2FsbChqLGEsayxqLm9wdHMpO2lmKGQpcmV0dXJuIGR9cmV0dXJuIGNVKGosaykscC5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaikscC5meC50aW1lcihwLmV4dGVuZChpLHthbmltOmoscXVldWU6ai5vcHRzLnF1ZXVlLGVsZW06YX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBjVyhhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSl7ZD1wLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLHAuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9cC5jc3NIb29rc1tkXTtpZihnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX19ZnVuY3Rpb24gY1goYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD10aGlzLG09YS5zdHlsZSxuPXt9LG89W10scT1hLm5vZGVUeXBlJiZiWShhKTtjLnF1ZXVlfHwoaj1wLl9xdWV1ZUhvb2tzKGEsImZ4Iiksai51bnF1ZXVlZD09bnVsbCYmKGoudW5xdWV1ZWQ9MCxrPWouZW1wdHkuZmlyZSxqLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtqLnVucXVldWVkfHxrKCl9KSxqLnVucXVldWVkKyssbC5hbHdheXMoZnVuY3Rpb24oKXtsLmFsd2F5cyhmdW5jdGlvbigpe2oudW5xdWV1ZWQtLSxwLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxqLmVtcHR5LmZpcmUoKX0pfSkpLGEubm9kZVR5cGU9PT0xJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVttLm92ZXJmbG93LG0ub3ZlcmZsb3dYLG0ub3ZlcmZsb3dZXSxwLmNzcyhhLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmcC5jc3MoYSwiZmxvYXQiKT09PSJub25lIiYmKCFwLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y2IoYS5ub2RlTmFtZSk9PT0iaW5saW5lIj9tLmRpc3BsYXk9ImlubGluZS1ibG9jayI6bS56b29tPTEpKSxjLm92ZXJmbG93JiYobS5vdmVyZmxvdz0iaGlkZGVuIixwLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrc3x8bC5kb25lKGZ1bmN0aW9uKCl7bS5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLG0ub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0sbS5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKXtmPWJbZF07aWYoY08uZXhlYyhmKSl7ZGVsZXRlIGJbZF07aWYoZj09PShxPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO28ucHVzaChkKX19Zz1vLmxlbmd0aDtpZihnKXtoPXAuX2RhdGEoYSwiZnhzaG93Iil8fHAuX2RhdGEoYSwiZnhzaG93Iix7fSkscT9wKGEpLnNob3coKTpsLmRvbmUoZnVuY3Rpb24oKXtwKGEpLmhpZGUoKX0pLGwuZG9uZShmdW5jdGlvbigpe3ZhciBiO3AucmVtb3ZlRGF0YShhLCJmeHNob3ciLCEwKTtmb3IoYiBpbiBuKXAuc3R5bGUoYSxiLG5bYl0pfSk7Zm9yKGQ9MDtkPGc7ZCsrKWU9b1tkXSxpPWwuY3JlYXRlVHdlZW4oZSxxP2hbZV06MCksbltlXT1oW2VdfHxwLnN0eWxlKGEsZSksZSBpbiBofHwoaFtlXT1pLnN0YXJ0LHEmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9ZT09PSJ3aWR0aCJ8fGU9PT0iaGVpZ2h0Ij8xOjApKX19ZnVuY3Rpb24gY1koYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGNZLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9ZnVuY3Rpb24gY1ooYSxiKXt2YXIgYyxkPXtoZWlnaHQ6YX0sZT0wO2Zvcig7ZTw0O2UrPTItYiljPWJVW2VdLGRbIm1hcmdpbiIrY109ZFsicGFkZGluZyIrY109YTtyZXR1cm4gYiYmKGQub3BhY2l0eT1kLndpZHRoPWEpLGR9ZnVuY3Rpb24gY18oYSl7cmV0dXJuIHAuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX12YXIgYyxkLGU9YS5kb2N1bWVudCxmPWEubG9jYXRpb24sZz1hLm5hdmlnYXRvcixoPWEualF1ZXJ5LGk9YS4kLGo9QXJyYXkucHJvdG90eXBlLnB1c2gsaz1BcnJheS5wcm90b3R5cGUuc2xpY2UsbD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LG89U3RyaW5nLnByb3RvdHlwZS50cmltLHA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IHAuZm4uaW5pdChhLGIsYyl9LHE9L1tcLStdPyg/OlxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvLnNvdXJjZSxyPS9cUy8scz0vXHMrLyx0PXIudGVzdCgiwqAiKT8vXltcc1x4QTBdK3xbXHNceEEwXSskL2c6L15ccyt8XHMrJC9nLHU9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLHY9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx3PS9eW1xdLDp7fVxzXSokLyx4PS8oPzpefDp8LCkoPzpccypcWykrL2cseT0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csej0vIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvZyxBPS9eLW1zLS8sQj0vLShbXGRhLXpdKS9naSxDPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LEQ9ZnVuY3Rpb24oKXtlLmFkZEV2ZW50TGlzdGVuZXI/KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsRCwhMSkscC5yZWFkeSgpKTplLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoZS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixEKSxwLnJlYWR5KCkpfSxFPXt9O3AuZm49cC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnAsaW5pdDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoLGk7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYodHlwZW9mIGE9PSJzdHJpbmciKXthLmNoYXJBdCgwKT09PSI8IiYmYS5jaGFyQXQoYS5sZW5ndGgtMSk9PT0iPiImJmEubGVuZ3RoPj0zP2Y9W251bGwsYSxudWxsXTpmPXUuZXhlYyhhKTtpZihmJiYoZlsxXXx8IWMpKXtpZihmWzFdKXJldHVybiBjPWMgaW5zdGFuY2VvZiBwP2NbMF06YyxpPWMmJmMubm9kZVR5cGU/Yy5vd25lckRvY3VtZW50fHxjOmUsYT1wLnBhcnNlSFRNTChmWzFdLGksITApLHYudGVzdChmWzFdKSYmcC5pc1BsYWluT2JqZWN0KGMpJiZ0aGlzLmF0dHIuY2FsbChhLGMsITApLHAubWVyZ2UodGhpcyxhKTtnPWUuZ2V0RWxlbWVudEJ5SWQoZlsyXSk7aWYoZyYmZy5wYXJlbnROb2RlKXtpZihnLmlkIT09ZlsyXSlyZXR1cm4gZC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1nfXJldHVybiB0aGlzLmNvbnRleHQ9ZSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4hY3x8Yy5qcXVlcnk/KGN8fGQpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihjKS5maW5kKGEpfXJldHVybiBwLmlzRnVuY3Rpb24oYSk/ZC5yZWFkeShhKTooYS5zZWxlY3RvciE9PWImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCkscC5tYWtlQXJyYXkoYSx0aGlzKSl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS44LjAiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gay5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1wLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpLGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcC5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHAucmVhZHkucHJvbWlzZSgpLmRvbmUoYSksdGhpc30sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9K2EsYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLGErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGsuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsay5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6aixzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0scC5mbi5pbml0LnByb3RvdHlwZT1wLmZuLHAuZXh0ZW5kPXAuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGUsZixnLGg9YXJndW1lbnRzWzBdfHx7fSxpPTEsaj1hcmd1bWVudHMubGVuZ3RoLGs9ITE7dHlwZW9mIGg9PSJib29sZWFuIiYmKGs9aCxoPWFyZ3VtZW50c1sxXXx8e30saT0yKSx0eXBlb2YgaCE9Im9iamVjdCImJiFwLmlzRnVuY3Rpb24oaCkmJihoPXt9KSxqPT09aSYmKGg9dGhpcywtLWkpO2Zvcig7aTxqO2krKylpZigoYT1hcmd1bWVudHNbaV0pIT1udWxsKWZvcihjIGluIGEpe2Q9aFtjXSxlPWFbY107aWYoaD09PWUpY29udGludWU7ayYmZSYmKHAuaXNQbGFpbk9iamVjdChlKXx8KGY9cC5pc0FycmF5KGUpKSk/KGY/KGY9ITEsZz1kJiZwLmlzQXJyYXkoZCk/ZDpbXSk6Zz1kJiZwLmlzUGxhaW5PYmplY3QoZCk/ZDp7fSxoW2NdPXAuZXh0ZW5kKGssZyxlKSk6ZSE9PWImJihoW2NdPWUpfXJldHVybiBofSxwLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09cCYmKGEuJD1pKSxiJiZhLmpRdWVyeT09PXAmJihhLmpRdWVyeT1oKSxwfSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP3AucmVhZHlXYWl0Kys6cC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8tLXAucmVhZHlXYWl0OnAuaXNSZWFkeSlyZXR1cm47aWYoIWUuYm9keSlyZXR1cm4gc2V0VGltZW91dChwLnJlYWR5LDEpO3AuaXNSZWFkeT0hMDtpZihhIT09ITAmJi0tcC5yZWFkeVdhaXQ+MClyZXR1cm47ZC5yZXNvbHZlV2l0aChlLFtwXSkscC5mbi50cmlnZ2VyJiZwKGUpLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBwLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBwLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSkmJmlzRmluaXRlKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpFW20uY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxwLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8cC5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIW4uY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhbi5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxuLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LHBhcnNlSFRNTDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIWF8fHR5cGVvZiBhIT0ic3RyaW5nIj9udWxsOih0eXBlb2YgYj09ImJvb2xlYW4iJiYoYz1iLGI9MCksYj1ifHxlLChkPXYuZXhlYyhhKSk/W2IuY3JlYXRlRWxlbWVudChkWzFdKV06KGQ9cC5idWlsZEZyYWdtZW50KFthXSxiLGM/bnVsbDpbXSkscC5tZXJnZShbXSwoZC5jYWNoZWFibGU/cC5jbG9uZShkLmZyYWdtZW50KTpkLmZyYWdtZW50KS5jaGlsZE5vZGVzKSkpfSxwYXJzZUpTT046ZnVuY3Rpb24oYil7aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbDtiPXAudHJpbShiKTtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIpO2lmKHcudGVzdChiLnJlcGxhY2UoeSwiQCIpLnJlcGxhY2UoeiwiXSIpLnJlcGxhY2UoeCwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IpKSgpO3AuZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0scGFyc2VYTUw6ZnVuY3Rpb24oYyl7dmFyIGQsZTtpZighY3x8dHlwZW9mIGMhPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZT1uZXcgRE9NUGFyc2VyLGQ9ZS5wYXJzZUZyb21TdHJpbmcoYywidGV4dC94bWwiKSk6KGQ9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxkLmFzeW5jPSJmYWxzZSIsZC5sb2FkWE1MKGMpKX1jYXRjaChmKXtkPWJ9cmV0dXJuKCFkfHwhZC5kb2N1bWVudEVsZW1lbnR8fGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmcC5lcnJvcigiSW52YWxpZCBYTUw6ICIrYyksZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZyLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoQSwibXMtIikucmVwbGFjZShCLEMpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGY9MCxnPWEubGVuZ3RoLGg9Zz09PWJ8fHAuaXNGdW5jdGlvbihhKTtpZihkKXtpZihoKXtmb3IoZSBpbiBhKWlmKGMuYXBwbHkoYVtlXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtmPGc7KWlmKGMuYXBwbHkoYVtmKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihoKXtmb3IoZSBpbiBhKWlmKGMuY2FsbChhW2VdLGUsYVtlXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZjxnOylpZihjLmNhbGwoYVtmXSxmLGFbZisrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpvP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOm8uY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YS50b1N0cmluZygpLnJlcGxhY2UodCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9Ynx8W107cmV0dXJuIGEhPW51bGwmJihjPXAudHlwZShhKSxhLmxlbmd0aD09bnVsbHx8Yz09PSJzdHJpbmcifHxjPT09ImZ1bmN0aW9uInx8Yz09PSJyZWdleHAifHxwLmlzV2luZG93KGEpP2ouY2FsbChkLGEpOnAubWVyZ2UoZCxhKSksZH0saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYobClyZXR1cm4gbC5jYWxsKGIsYSxjKTtkPWIubGVuZ3RoLGM9Yz9jPDA/TWF0aC5tYXgoMCxkK2MpOmM6MDtmb3IoO2M8ZDtjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLmxlbmd0aCxlPWEubGVuZ3RoLGY9MDtpZih0eXBlb2YgZD09Im51bWJlciIpZm9yKDtmPGQ7ZisrKWFbZSsrXT1jW2ZdO2Vsc2Ugd2hpbGUoY1tmXSE9PWIpYVtlKytdPWNbZisrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoO2M9ISFjO2Zvcig7ZjxnO2YrKylkPSEhYihhW2ZdLGYpLGMhPT1kJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9YSBpbnN0YW5jZW9mIHB8fGkhPT1iJiZ0eXBlb2YgaT09Im51bWJlciImJihpPjAmJmFbMF0mJmFbaS0xXXx8aT09PTB8fHAuaXNBcnJheShhKSk7aWYoailmb3IoO2g8aTtoKyspZT1jKGFbaF0saCxkKSxlIT1udWxsJiYoZ1tnLmxlbmd0aF09ZSk7ZWxzZSBmb3IoZiBpbiBhKWU9YyhhW2ZdLGYsZCksZSE9bnVsbCYmKGdbZy5sZW5ndGhdPWUpO3JldHVybiBnLmNvbmNhdC5hcHBseShbXSxnKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxmO3JldHVybiB0eXBlb2YgYz09InN0cmluZyImJihkPWFbY10sYz1hLGE9ZCkscC5pc0Z1bmN0aW9uKGEpPyhlPWsuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsZS5jb25jYXQoay5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fGYuZ3VpZHx8cC5ndWlkKyssZik6Yn0sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGUsZixnLGgpe3ZhciBpLGo9ZD09bnVsbCxrPTAsbD1hLmxlbmd0aDtpZihkJiZ0eXBlb2YgZD09Im9iamVjdCIpe2ZvcihrIGluIGQpcC5hY2Nlc3MoYSxjLGssZFtrXSwxLGcsZSk7Zj0xfWVsc2UgaWYoZSE9PWIpe2k9aD09PWImJnAuaXNGdW5jdGlvbihlKSxqJiYoaT8oaT1jLGM9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBpLmNhbGwocChhKSxjKX0pOihjLmNhbGwoYSxlKSxjPW51bGwpKTtpZihjKWZvcig7azxsO2srKyljKGFba10sZCxpP2UuY2FsbChhW2tdLGssYyhhW2tdLGQpKTplLGgpO2Y9MX1yZXR1cm4gZj9hOmo/Yy5jYWxsKGEpOmw/YyhhWzBdLGQpOmd9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfX0pLHAucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighZCl7ZD1wLkRlZmVycmVkKCk7aWYoZS5yZWFkeVN0YXRlPT09ImNvbXBsZXRlInx8ZS5yZWFkeVN0YXRlIT09ImxvYWRpbmciJiZlLmFkZEV2ZW50TGlzdGVuZXIpc2V0VGltZW91dChwLnJlYWR5LDEpO2Vsc2UgaWYoZS5hZGRFdmVudExpc3RlbmVyKWUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsRCwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixwLnJlYWR5LCExKTtlbHNle2UuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsRCksYS5hdHRhY2hFdmVudCgib25sb2FkIixwLnJlYWR5KTt2YXIgYz0hMTt0cnl7Yz1hLmZyYW1lRWxlbWVudD09bnVsbCYmZS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZil7fWMmJmMuZG9TY3JvbGwmJmZ1bmN0aW9uIGcoKXtpZighcC5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGcsNTApfXAucmVhZHkoKX19KCl9fXJldHVybiBkLnByb21pc2UoYil9LHAuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0VbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksYz1wKGUpO3ZhciBGPXt9O3AuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9dHlwZW9mIGE9PSJzdHJpbmciP0ZbYV18fEcoYSk6cC5leHRlbmQoe30sYSk7dmFyIGMsZCxlLGYsZyxoLGk9W10saj0hYS5vbmNlJiZbXSxrPWZ1bmN0aW9uKGIpe2M9YS5tZW1vcnkmJmIsZD0hMCxoPWZ8fDAsZj0wLGc9aS5sZW5ndGgsZT0hMDtmb3IoO2kmJmg8ZztoKyspaWYoaVtoXS5hcHBseShiWzBdLGJbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9ZT0hMSxpJiYoaj9qLmxlbmd0aCYmayhqLnNoaWZ0KCkpOmM/aT1bXTpsLmRpc2FibGUoKSl9LGw9e2FkZDpmdW5jdGlvbigpe2lmKGkpe3ZhciBiPWkubGVuZ3RoOyhmdW5jdGlvbiBkKGIpe3AuZWFjaChiLGZ1bmN0aW9uKGIsYyl7cC5pc0Z1bmN0aW9uKGMpJiYoIWEudW5pcXVlfHwhbC5oYXMoYykpP2kucHVzaChjKTpjJiZjLmxlbmd0aCYmZChjKX0pfSkoYXJndW1lbnRzKSxlP2c9aS5sZW5ndGg6YyYmKGY9YixrKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGkmJnAuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1wLmluQXJyYXkoYixpLGMpKT4tMSlpLnNwbGljZShjLDEpLGUmJihjPD1nJiZnLS0sYzw9aCYmaC0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gcC5pbkFycmF5KGEsaSk+LTF9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGk9W10sdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBpPWo9Yz1iLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWl9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gaj1iLGN8fGwuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFqfSxmaXJlV2l0aDpmdW5jdGlvbihhLGIpe3JldHVybiBiPWJ8fFtdLGI9W2EsYi5zbGljZT9iLnNsaWNlKCk6Yl0saSYmKCFkfHxqKSYmKGU/ai5wdXNoKGIpOmsoYikpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gbC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWR9fTtyZXR1cm4gbH0scC5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPVtbInJlc29sdmUiLCJkb25lIixwLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHAuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHAuQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLGM9InBlbmRpbmciLGQ9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBlLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gcC5EZWZlcnJlZChmdW5jdGlvbihjKXtwLmVhY2goYixmdW5jdGlvbihiLGQpe3ZhciBmPWRbMF0sZz1hW2JdO2VbZFsxXV0ocC5pc0Z1bmN0aW9uKGcpP2Z1bmN0aW9uKCl7dmFyIGE9Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YSYmcC5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YS5wcm9taXNlKCkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpLnByb2dyZXNzKGMubm90aWZ5KTpjW2YrIldpdGgiXSh0aGlzPT09ZT9jOnRoaXMsW2FdKX06Y1tmXSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ib2JqZWN0Ij9wLmV4dGVuZChhLGQpOmR9fSxlPXt9O3JldHVybiBkLnBpcGU9ZC50aGVuLHAuZWFjaChiLGZ1bmN0aW9uKGEsZil7dmFyIGc9ZlsyXSxoPWZbM107ZFtmWzFdXT1nLmFkZCxoJiZnLmFkZChmdW5jdGlvbigpe2M9aH0sYlthXjFdWzJdLmRpc2FibGUsYlsyXVsyXS5sb2NrKSxlW2ZbMF1dPWcuZmlyZSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWsuY2FsbChhcmd1bWVudHMpLGQ9Yy5sZW5ndGgsZT1kIT09MXx8YSYmcC5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZDowLGY9ZT09PTE/YTpwLkRlZmVycmVkKCksZz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9rLmNhbGwoYXJndW1lbnRzKTpkLGM9PT1oP2Yubm90aWZ5V2l0aChiLGMpOi0tZXx8Zi5yZXNvbHZlV2l0aChiLGMpfX0saCxpLGo7aWYoZD4xKXtoPW5ldyBBcnJheShkKSxpPW5ldyBBcnJheShkKSxqPW5ldyBBcnJheShkKTtmb3IoO2I8ZDtiKyspY1tiXSYmcC5pc0Z1bmN0aW9uKGNbYl0ucHJvbWlzZSk/Y1tiXS5wcm9taXNlKCkuZG9uZShnKGIsaixjKSkuZmFpbChmLnJlamVjdCkucHJvZ3Jlc3MoZyhiLGksaCkpOi0tZX1yZXR1cm4gZXx8Zi5yZXNvbHZlV2l0aChqLGMpLGYucHJvbWlzZSgpfX0pLHAuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBiLGMsZCxmLGcsaCxpLGosayxsLG0sbj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0Iiksbi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsYz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZD1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sZC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNSI7aWYoIWN8fCFjLmxlbmd0aHx8IWQpcmV0dXJue307Zj1lLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGc9Zi5hcHBlbmRDaGlsZChlLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxoPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6bi5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNS8udGVzdChkLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZC5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmgudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmcuc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOm4uY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFlLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6ZS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+Iixib3hNb2RlbDplLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwLGJveFNpemluZ1JlbGlhYmxlOiEwLHBpeGVsUG9zaXRpb246ITF9LGguY2hlY2tlZD0hMCxiLm5vQ2xvbmVDaGVja2VkPWguY2xvbmVOb2RlKCEwKS5jaGVja2VkLGYuZGlzYWJsZWQ9ITAsYi5vcHREaXNhYmxlZD0hZy5kaXNhYmxlZDt0cnl7ZGVsZXRlIG4udGVzdH1jYXRjaChvKXtiLmRlbGV0ZUV4cGFuZG89ITF9IW4uYWRkRXZlbnRMaXN0ZW5lciYmbi5hdHRhY2hFdmVudCYmbi5maXJlRXZlbnQmJihuLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixtPWZ1bmN0aW9uKCl7Yi5ub0Nsb25lRXZlbnQ9ITF9KSxuLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIiksbi5kZXRhY2hFdmVudCgib25jbGljayIsbSkpLGg9ZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGgudmFsdWU9InQiLGguc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxiLnJhZGlvVmFsdWU9aC52YWx1ZT09PSJ0IixoLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxoLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxuLmFwcGVuZENoaWxkKGgpLGk9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksaS5hcHBlbmRDaGlsZChuLmxhc3RDaGlsZCksYi5jaGVja0Nsb25lPWkuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuYXBwZW5kQ2hlY2tlZD1oLmNoZWNrZWQsaS5yZW1vdmVDaGlsZChoKSxpLmFwcGVuZENoaWxkKG4pO2lmKG4uYXR0YWNoRXZlbnQpZm9yKGsgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSlqPSJvbiIrayxsPWogaW4gbixsfHwobi5zZXRBdHRyaWJ1dGUoaiwicmV0dXJuOyIpLGw9dHlwZW9mIG5bal09PSJmdW5jdGlvbiIpLGJbaysiQnViYmxlcyJdPWw7cmV0dXJuIHAoZnVuY3Rpb24oKXt2YXIgYyxkLGYsZyxoPSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47IixpPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTtpZighaSlyZXR1cm47Yz1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGMuc3R5bGUuY3NzVGV4dD0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoxcHgiLGkuaW5zZXJ0QmVmb3JlKGMsaS5maXJzdENoaWxkKSxkPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5hcHBlbmRDaGlsZChkKSxkLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGZbMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIsbD1mWzBdLm9mZnNldEhlaWdodD09PTAsZlswXS5zdHlsZS5kaXNwbGF5PSIiLGZbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsYi5yZWxpYWJsZUhpZGRlbk9mZnNldHM9bCYmZlswXS5vZmZzZXRIZWlnaHQ9PT0wLGQuaW5uZXJIVE1MPSIiLGQuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7IixiLmJveFNpemluZz1kLm9mZnNldFdpZHRoPT09NCxiLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWkub2Zmc2V0VG9wIT09MSxhLmdldENvbXB1dGVkU3R5bGUmJihiLnBpeGVsUG9zaXRpb249KGEuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7fSkudG9wIT09IjElIixiLmJveFNpemluZ1JlbGlhYmxlPShhLmdldENvbXB1dGVkU3R5bGUoZCxudWxsKXx8e3dpZHRoOiI0cHgifSkud2lkdGg9PT0iNHB4IixnPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksZy5zdHlsZS5jc3NUZXh0PWQuc3R5bGUuY3NzVGV4dD1oLGcuc3R5bGUubWFyZ2luUmlnaHQ9Zy5zdHlsZS53aWR0aD0iMCIsZC5zdHlsZS53aWR0aD0iMXB4IixkLmFwcGVuZENoaWxkKGcpLGIucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGcsbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLHR5cGVvZiBkLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYoZC5pbm5lckhUTUw9IiIsZC5zdHlsZS5jc3NUZXh0PWgrIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiLGIuaW5saW5lQmxvY2tOZWVkc0xheW91dD1kLm9mZnNldFdpZHRoPT09MyxkLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixkLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLGQuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4IixiLnNocmlua1dyYXBCbG9ja3M9ZC5vZmZzZXRXaWR0aCE9PTMsYy5zdHlsZS56b29tPTEpLGkucmVtb3ZlQ2hpbGQoYyksYz1kPWY9Zz1udWxsfSksaS5yZW1vdmVDaGlsZChuKSxjPWQ9Zj1nPWg9aT1uPW51bGwsYn0oKTt2YXIgSD0vXig/Olx7LipcfXxcWy4qXF0pJC8sST0vKFtBLVpdKS9nO3AuZXh0ZW5kKHtjYWNoZTp7fSxkZWxldGVkSWRzOltdLHV1aWQ6MCxleHBhbmRvOiJqUXVlcnkiKyhwLmZuLmpxdWVyeStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5ub2RlVHlwZT9wLmNhY2hlW2FbcC5leHBhbmRvXV06YVtwLmV4cGFuZG9dLCEhYSYmIUsoYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoIXAuYWNjZXB0RGF0YShhKSlyZXR1cm47dmFyIGYsZyxoPXAuZXhwYW5kbyxpPXR5cGVvZiBjPT0ic3RyaW5nIixqPWEubm9kZVR5cGUsaz1qP3AuY2FjaGU6YSxsPWo/YVtoXTphW2hdJiZoO2lmKCghbHx8IWtbbF18fCFlJiYha1tsXS5kYXRhKSYmaSYmZD09PWIpcmV0dXJuO2x8fChqP2FbaF09bD1wLmRlbGV0ZWRJZHMucG9wKCl8fCsrcC51dWlkOmw9aCksa1tsXXx8KGtbbF09e30sanx8KGtbbF0udG9KU09OPXAubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9rW2xdPXAuZXh0ZW5kKGtbbF0sYyk6a1tsXS5kYXRhPXAuZXh0ZW5kKGtbbF0uZGF0YSxjKTtyZXR1cm4gZj1rW2xdLGV8fChmLmRhdGF8fChmLmRhdGE9e30pLGY9Zi5kYXRhKSxkIT09YiYmKGZbcC5jYW1lbENhc2UoYyldPWQpLGk/KGc9ZltjXSxnPT1udWxsJiYoZz1mW3AuY2FtZWxDYXNlKGMpXSkpOmc9ZixnfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYixjKXtpZighcC5hY2NlcHREYXRhKGEpKXJldHVybjt2YXIgZCxlLGYsZz1hLm5vZGVUeXBlLGg9Zz9wLmNhY2hlOmEsaT1nP2FbcC5leHBhbmRvXTpwLmV4cGFuZG87aWYoIWhbaV0pcmV0dXJuO2lmKGIpe2Q9Yz9oW2ldOmhbaV0uZGF0YTtpZihkKXtwLmlzQXJyYXkoYil8fChiIGluIGQ/Yj1bYl06KGI9cC5jYW1lbENhc2UoYiksYiBpbiBkP2I9W2JdOmI9Yi5zcGxpdCgiICIpKSk7Zm9yKGU9MCxmPWIubGVuZ3RoO2U8ZjtlKyspZGVsZXRlIGRbYltlXV07aWYoIShjP0s6cC5pc0VtcHR5T2JqZWN0KShkKSlyZXR1cm59fWlmKCFjKXtkZWxldGUgaFtpXS5kYXRhO2lmKCFLKGhbaV0pKXJldHVybn1nP3AuY2xlYW5EYXRhKFthXSwhMCk6cC5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fGghPWgud2luZG93P2RlbGV0ZSBoW2ldOmhbaV09bnVsbH0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBwLmRhdGEoYSxiLGMsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUmJnAubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIWJ8fGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9fSkscC5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGYsZyxoLGk9dGhpc1swXSxqPTAsaz1udWxsO2lmKGE9PT1iKXtpZih0aGlzLmxlbmd0aCl7az1wLmRhdGEoaSk7aWYoaS5ub2RlVHlwZT09PTEmJiFwLl9kYXRhKGksInBhcnNlZEF0dHJzIikpe2Y9aS5hdHRyaWJ1dGVzO2ZvcihoPWYubGVuZ3RoO2o8aDtqKyspZz1mW2pdLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9cC5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLEooaSxnLGtbZ10pKTtwLl9kYXRhKGksInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBrfXJldHVybiB0eXBlb2YgYT09Im9iamVjdCI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7cC5kYXRhKHRoaXMsYSl9KTooZD1hLnNwbGl0KCIuIiwyKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiIsZT1kWzFdKyIhIixwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMpe2lmKGM9PT1iKXJldHVybiBrPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2UsW2RbMF1dKSxrPT09YiYmaSYmKGs9cC5kYXRhKGksYSksaz1KKGksYSxrKSksaz09PWImJmRbMV0/dGhpcy5kYXRhKGRbMF0pOms7ZFsxXT1jLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXAodGhpcyk7Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIrZSxkKSxwLmRhdGEodGhpcyxhLGMpLGIudHJpZ2dlckhhbmRsZXIoImNoYW5nZURhdGEiK2UsZCl9KX0sbnVsbCxjLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCExKSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3AucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSkscC5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXJldHVybiBiPShifHwiZngiKSsicXVldWUiLGQ9cC5fZGF0YShhLGIpLGMmJighZHx8cC5pc0FycmF5KGMpP2Q9cC5fZGF0YShhLGIscC5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W119LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9cC5xdWV1ZShhLGIpLGQ9Yy5zaGlmdCgpLGU9cC5fcXVldWVIb29rcyhhLGIpLGY9ZnVuY3Rpb24oKXtwLmRlcXVldWUoYSxiKX07ZD09PSJpbnByb2dyZXNzIiYmKGQ9Yy5zaGlmdCgpKSxkJiYoYj09PSJmeCImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBlLnN0b3AsZC5jYWxsKGEsZixlKSksIWMubGVuZ3RoJiZlJiZlLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gcC5fZGF0YShhLGMpfHxwLl9kYXRhKGEsYyx7ZW1wdHk6cC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7cC5yZW1vdmVEYXRhKGEsYisicXVldWUiLCEwKSxwLnJlbW92ZURhdGEoYSxjLCEwKX0pfSl9fSkscC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9MjtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9ImZ4IixkLS0pLGFyZ3VtZW50cy5sZW5ndGg8ZD9wLnF1ZXVlKHRoaXNbMF0sYSk6Yz09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1wLnF1ZXVlKHRoaXMsYSxjKTtwLl9xdWV1ZUhvb2tzKHRoaXMsYSksYT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJnAuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3AuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9cC5meD9wLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT0xLGY9cC5EZWZlcnJlZCgpLGc9dGhpcyxoPXRoaXMubGVuZ3RoLGk9ZnVuY3Rpb24oKXstLWV8fGYucmVzb2x2ZVdpdGgoZyxbZ10pfTt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7d2hpbGUoaC0tKShkPXAuX2RhdGEoZ1toXSxhKyJxdWV1ZUhvb2tzIikpJiZkLmVtcHR5JiYoZSsrLGQuZW1wdHkuYWRkKGkpKTtyZXR1cm4gaSgpLGYucHJvbWlzZShjKX19KTt2YXIgTCxNLE4sTz0vW1x0XHJcbl0vZyxQPS9cci9nLFE9L14oPzpidXR0b258aW5wdXQpJC9pLFI9L14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksUz0vXmEoPzpyZWF8KSQvaSxUPS9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLFU9cC5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZTtwLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBwLmFjY2Vzcyh0aGlzLHAuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cC5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBwLmFjY2Vzcyh0aGlzLHAucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1wLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoO2lmKHAuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocyk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zj0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKX5mLmluZGV4T2YoIiAiK2JbZ10rIiAiKXx8KGYrPWJbZ10rIiAiKTtlLmNsYXNzTmFtZT1wLnRyaW0oZil9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGYsZyxoLGk7aWYocC5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7cCh0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocyk7Zm9yKGg9MCxpPXRoaXMubGVuZ3RoO2g8aTtoKyspe2U9dGhpc1toXTtpZihlLm5vZGVUeXBlPT09MSYmZS5jbGFzc05hbWUpe2Q9KCIgIitlLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoTywiICIpO2ZvcihmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKXdoaWxlKGQuaW5kZXhPZigiICIrY1tmXSsiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitjW2ZdKyIgIiwiICIpO2UuY2xhc3NOYW1lPWE/cC50cmltKGQpOiIifX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO3JldHVybiBwLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3AodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGM9PT0ic3RyaW5nIil7dmFyIGUsZj0wLGc9cCh0aGlzKSxoPWIsaT1hLnNwbGl0KHMpO3doaWxlKGU9aVtmKytdKWg9ZD9oOiFnLmhhc0NsYXNzKGUpLGdbaD8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoYz09PSJ1bmRlZmluZWQifHxjPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NOYW1lJiZwLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOnAuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7Zm9yKDtjPGQ7YysrKWlmKHRoaXNbY10ubm9kZVR5cGU9PT0xJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShPLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxmPXRoaXNbMF07aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2lmKGYpcmV0dXJuIGM9cC52YWxIb29rc1tmLnR5cGVdfHxwLnZhbEhvb2tzW2Yubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYyYmImdldCJpbiBjJiYoZD1jLmdldChmLCJ2YWx1ZSIpKSE9PWI/ZDooZD1mLnZhbHVlLHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UoUCwiIik6ZD09bnVsbD8iIjpkKTtyZXR1cm59cmV0dXJuIGU9cC5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZixnPXAodGhpcyk7aWYodGhpcy5ub2RlVHlwZSE9PTEpcmV0dXJuO2U/Zj1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmY9YSxmPT1udWxsP2Y9IiI6dHlwZW9mIGY9PSJudW1iZXIiP2YrPSIiOnAuaXNBcnJheShmKSYmKGY9cC5tYXAoZixmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9cC52YWxIb29rc1t0aGlzLnR5cGVdfHxwLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxmLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWZ9KX19KSxwLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmPWEuc2VsZWN0ZWRJbmRleCxnPVtdLGg9YS5vcHRpb25zLGk9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGY8MClyZXR1cm4gbnVsbDtjPWk/ZjowLGQ9aT9mKzE6aC5sZW5ndGg7Zm9yKDtjPGQ7YysrKXtlPWhbY107aWYoZS5zZWxlY3RlZCYmKHAuc3VwcG9ydC5vcHREaXNhYmxlZD8hZS5kaXNhYmxlZDplLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWUucGFyZW50Tm9kZS5kaXNhYmxlZHx8IXAubm9kZU5hbWUoZS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1wKGUpLnZhbCgpO2lmKGkpcmV0dXJuIGI7Zy5wdXNoKGIpfX1yZXR1cm4gaSYmIWcubGVuZ3RoJiZoLmxlbmd0aD9wKGhbZl0pLnZhbCgpOmd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPXAubWFrZUFycmF5KGIpO3JldHVybiBwKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPXAuaW5BcnJheShwKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGN9fX0sYXR0ckZuOnt9LGF0dHI6ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGk9YS5ub2RlVHlwZTtpZighYXx8aT09PTN8fGk9PT04fHxpPT09MilyZXR1cm47aWYoZSYmcC5pc0Z1bmN0aW9uKHAuZm5bY10pKXJldHVybiBwKGEpW2NdKGQpO2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIHAucHJvcChhLGMsZCk7aD1pIT09MXx8IXAuaXNYTUxEb2MoYSksaCYmKGM9Yy50b0xvd2VyQ2FzZSgpLGc9cC5hdHRySG9va3NbY118fChULnRlc3QoYyk/TTpMKSk7aWYoZCE9PWIpe2lmKGQ9PT1udWxsKXtwLnJlbW92ZUF0dHIoYSxjKTtyZXR1cm59cmV0dXJuIGcmJiJzZXQiaW4gZyYmaCYmKGY9Zy5zZXQoYSxkLGMpKSE9PWI/ZjooYS5zZXRBdHRyaWJ1dGUoYywiIitkKSxkKX1yZXR1cm4gZyYmImdldCJpbiBnJiZoJiYoZj1nLmdldChhLGMpKSE9PW51bGw/ZjooZj1hLmdldEF0dHJpYnV0ZShjKSxmPT09bnVsbD9iOmYpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz0wO2lmKGImJmEubm9kZVR5cGU9PT0xKXtkPWIuc3BsaXQocyk7Zm9yKDtnPGQubGVuZ3RoO2crKyllPWRbZ10sZSYmKGM9cC5wcm9wRml4W2VdfHxlLGY9VC50ZXN0KGUpLGZ8fHAuYXR0cihhLGUsIiIpLGEucmVtb3ZlQXR0cmlidXRlKFU/ZTpjKSxmJiZjIGluIGEmJihhW2NdPSExKSl9fSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKFEudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlKXAuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIXAuc3VwcG9ydC5yYWRpb1ZhbHVlJiZiPT09InJhZGlvIiYmcC5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO3JldHVybiBhLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9YyksYn19fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEwmJnAubm9kZU5hbWUoYSwiYnV0dG9uIik/TC5nZXQoYSxiKTpiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKEwmJnAubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIEwuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmLGcsaD1hLm5vZGVUeXBlO2lmKCFhfHxoPT09M3x8aD09PTh8fGg9PT0yKXJldHVybjtyZXR1cm4gZz1oIT09MXx8IXAuaXNYTUxEb2MoYSksZyYmKGM9cC5wcm9wRml4W2NdfHxjLGY9cC5wcm9wSG9va3NbY10pLGQhPT1iP2YmJiJzZXQiaW4gZiYmKGU9Zi5zZXQoYSxkLGMpKSE9PWI/ZTphW2NdPWQ6ZiYmImdldCJpbiBmJiYoZT1mLmdldChhLGMpKSE9PW51bGw/ZTphW2NdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9wYXJzZUludChjLnZhbHVlLDEwKTpSLnRlc3QoYS5ub2RlTmFtZSl8fFMudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6Yn19fX0pLE09e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkLGU9cC5wcm9wKGEsYyk7cmV0dXJuIGU9PT0hMHx8dHlwZW9mIGUhPSJib29sZWFuIiYmKGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpKSYmZC5ub2RlVmFsdWUhPT0hMT9jLnRvTG93ZXJDYXNlKCk6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYj09PSExP3AucmVtb3ZlQXR0cihhLGMpOihkPXAucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpLGN9fSxVfHwoTj17bmFtZTohMCxpZDohMCxjb29yZHM6ITB9LEw9cC52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO3JldHVybiBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSxkJiYoTltjXT9kLnZhbHVlIT09IiI6ZC5zcGVjaWZpZWQpP2QudmFsdWU6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGR8fChkPWUuY3JlYXRlQXR0cmlidXRlKGMpLGEuc2V0QXR0cmlidXRlTm9kZShkKSksZC52YWx1ZT1iKyIifX0scC5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe3AuYXR0ckhvb2tzW2JdPXAuZXh0ZW5kKHAuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpcmV0dXJuIGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjfX0pfSkscC5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6TC5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLEwuc2V0KGEsYixjKX19KSxwLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fHAuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7cC5hdHRySG9va3NbY109cC5leHRlbmQocC5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxwLnN1cHBvcnQuc3R5bGV8fChwLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLHAuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KHAucHJvcEhvb2tzLnNlbGVjdGVkPXAuZXh0ZW5kKHAucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSkpLHAuc3VwcG9ydC5lbmN0eXBlfHwocC5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIikscC5zdXBwb3J0LmNoZWNrT258fHAuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe3AudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSkscC5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7cC52YWxIb29rc1t0aGlzXT1wLmV4dGVuZChwLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihwLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1wLmluQXJyYXkocChhKS52YWwoKSxiKT49MH19KX0pO3ZhciBWPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxXPS9eKFteXC5dKnwpKD86XC4oLispfCkkLyxYPS8oPzpefFxzKWhvdmVyKFwuXFMrfClcYi8sWT0vXmtleS8sWj0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sJD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXz1mdW5jdGlvbihhKXtyZXR1cm4gcC5ldmVudC5zcGVjaWFsLmhvdmVyP2E6YS5yZXBsYWNlKFgsIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07cC5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZil7dmFyIGcsaCxpLGosayxsLG0sbixvLHEscjtpZihhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTh8fCFjfHwhZHx8IShnPXAuX2RhdGEoYSkpKXJldHVybjtkLmhhbmRsZXImJihvPWQsZD1vLmhhbmRsZXIsZj1vLnNlbGVjdG9yKSxkLmd1aWR8fChkLmd1aWQ9cC5ndWlkKyspLGk9Zy5ldmVudHMsaXx8KGcuZXZlbnRzPWk9e30pLGg9Zy5oYW5kbGUsaHx8KGcuaGFuZGxlPWg9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBwIT0idW5kZWZpbmVkIiYmKCFhfHxwLmV2ZW50LnRyaWdnZXJlZCE9PWEudHlwZSk/cC5ldmVudC5kaXNwYXRjaC5hcHBseShoLmVsZW0sYXJndW1lbnRzKTpifSxoLmVsZW09YSksYz1wLnRyaW0oXyhjKSkuc3BsaXQoIiAiKTtmb3Ioaj0wO2o8Yy5sZW5ndGg7aisrKXtrPVcuZXhlYyhjW2pdKXx8W10sbD1rWzFdLG09KGtbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxyPXAuZXZlbnQuc3BlY2lhbFtsXXx8e30sbD0oZj9yLmRlbGVnYXRlVHlwZTpyLmJpbmRUeXBlKXx8bCxyPXAuZXZlbnQuc3BlY2lhbFtsXXx8e30sbj1wLmV4dGVuZCh7dHlwZTpsLG9yaWdUeXBlOmtbMV0sZGF0YTplLGhhbmRsZXI6ZCxndWlkOmQuZ3VpZCxzZWxlY3RvcjpmLG5hbWVzcGFjZTptLmpvaW4oIi4iKX0sbykscT1pW2xdO2lmKCFxKXtxPWlbbF09W10scS5kZWxlZ2F0ZUNvdW50PTA7aWYoIXIuc2V0dXB8fHIuc2V0dXAuY2FsbChhLGUsbSxoKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobCxoLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxoKX1yLmFkZCYmKHIuYWRkLmNhbGwoYSxuKSxuLmhhbmRsZXIuZ3VpZHx8KG4uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGY/cS5zcGxpY2UocS5kZWxlZ2F0ZUNvdW50KyssMCxuKTpxLnB1c2gobikscC5ldmVudC5nbG9iYWxbbF09ITB9YT1udWxsfSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxuLG8scSxyPXAuaGFzRGF0YShhKSYmcC5fZGF0YShhKTtpZighcnx8IShtPXIuZXZlbnRzKSlyZXR1cm47Yj1wLnRyaW0oXyhifHwiIikpLnNwbGl0KCIgIik7Zm9yKGY9MDtmPGIubGVuZ3RoO2YrKyl7Zz1XLmV4ZWMoYltmXSl8fFtdLGg9aT1nWzFdLGo9Z1syXTtpZighaCl7Zm9yKGggaW4gbSlwLmV2ZW50LnJlbW92ZShhLGgrYltmXSxjLGQsITApO2NvbnRpbnVlfW49cC5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShkP24uZGVsZWdhdGVUeXBlOm4uYmluZFR5cGUpfHxoLG89bVtoXXx8W10saz1vLmxlbmd0aCxqPWo/bmV3IFJlZ0V4cCgiKF58XFwuKSIrai5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsO2ZvcihsPTA7bDxvLmxlbmd0aDtsKyspcT1vW2xdLChlfHxpPT09cS5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cS5ndWlkKSYmKCFqfHxqLnRlc3QocS5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cS5zZWxlY3Rvcnx8ZD09PSIqKiImJnEuc2VsZWN0b3IpJiYoby5zcGxpY2UobC0tLDEpLHEuc2VsZWN0b3ImJm8uZGVsZWdhdGVDb3VudC0tLG4ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEscSkpO28ubGVuZ3RoPT09MCYmayE9PW8ubGVuZ3RoJiYoKCFuLnRlYXJkb3dufHxuLnRlYXJkb3duLmNhbGwoYSxqLHIuaGFuZGxlKT09PSExKSYmcC5yZW1vdmVFdmVudChhLGgsci5oYW5kbGUpLGRlbGV0ZSBtW2hdKX1wLmlzRW1wdHlPYmplY3QobSkmJihkZWxldGUgci5oYW5kbGUscC5yZW1vdmVEYXRhKGEsImV2ZW50cyIsITApKX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxmLGcpe2lmKCFmfHxmLm5vZGVUeXBlIT09MyYmZi5ub2RlVHlwZSE9PTgpe3ZhciBoLGksaixrLGwsbSxuLG8scSxyLHM9Yy50eXBlfHxjLHQ9W107aWYoJC50ZXN0KHMrcC5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtzLmluZGV4T2YoIiEiKT49MCYmKHM9cy5zbGljZSgwLC0xKSxpPSEwKSxzLmluZGV4T2YoIi4iKT49MCYmKHQ9cy5zcGxpdCgiLiIpLHM9dC5zaGlmdCgpLHQuc29ydCgpKTtpZigoIWZ8fHAuZXZlbnQuY3VzdG9tRXZlbnRbc10pJiYhcC5ldmVudC5nbG9iYWxbc10pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbcC5leHBhbmRvXT9jOm5ldyBwLkV2ZW50KHMsYyk6bmV3IHAuRXZlbnQocyksYy50eXBlPXMsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9aSxjLm5hbWVzcGFjZT10LmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit0LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsbT1zLmluZGV4T2YoIjoiKTwwPyJvbiIrczoiIjtpZighZil7aD1wLmNhY2hlO2ZvcihqIGluIGgpaFtqXS5ldmVudHMmJmhbal0uZXZlbnRzW3NdJiZwLmV2ZW50LnRyaWdnZXIoYyxkLGhbal0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZiksZD1kIT1udWxsP3AubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxuPXAuZXZlbnQuc3BlY2lhbFtzXXx8e307aWYobi50cmlnZ2VyJiZuLnRyaWdnZXIuYXBwbHkoZixkKT09PSExKXJldHVybjtxPVtbZixuLmJpbmRUeXBlfHxzXV07aWYoIWcmJiFuLm5vQnViYmxlJiYhcC5pc1dpbmRvdyhmKSl7cj1uLmRlbGVnYXRlVHlwZXx8cyxrPSQudGVzdChyK3MpP2Y6Zi5wYXJlbnROb2RlO2ZvcihsPWY7aztrPWsucGFyZW50Tm9kZSlxLnB1c2goW2sscl0pLGw9aztsPT09KGYub3duZXJEb2N1bWVudHx8ZSkmJnEucHVzaChbbC5kZWZhdWx0Vmlld3x8bC5wYXJlbnRXaW5kb3d8fGEscl0pfWZvcihqPTA7ajxxLmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtqKyspaz1xW2pdWzBdLGMudHlwZT1xW2pdWzFdLG89KHAuX2RhdGEoaywiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZwLl9kYXRhKGssImhhbmRsZSIpLG8mJm8uYXBwbHkoayxkKSxvPW0mJmtbbV0sbyYmcC5hY2NlcHREYXRhKGspJiZvLmFwcGx5KGssZCk9PT0hMSYmYy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBjLnR5cGU9cywhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighbi5fZGVmYXVsdHx8bi5fZGVmYXVsdC5hcHBseShmLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihzIT09ImNsaWNrInx8IXAubm9kZU5hbWUoZiwiYSIpKSYmcC5hY2NlcHREYXRhKGYpJiZtJiZmW3NdJiYocyE9PSJmb2N1cyImJnMhPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFwLmlzV2luZG93KGYpJiYobD1mW21dLGwmJihmW21dPW51bGwpLHAuZXZlbnQudHJpZ2dlcmVkPXMsZltzXSgpLHAuZXZlbnQudHJpZ2dlcmVkPWIsbCYmKGZbbV09bCkpLGMucmVzdWx0fXJldHVybn0sZGlzcGF0Y2g6ZnVuY3Rpb24oYyl7Yz1wLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZCxlLGYsZyxoLGksaixrLGwsbSxuLG89KHAuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxxPW8uZGVsZWdhdGVDb3VudCxyPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxzPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLHQ9cC5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9LHU9W107clswXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZih0LnByZURpc3BhdGNoJiZ0LnByZURpc3BhdGNoLmNhbGwodGhpcyxjKT09PSExKXJldHVybjtpZihxJiYoIWMuYnV0dG9ufHxjLnR5cGUhPT0iY2xpY2siKSl7Zz1wKHRoaXMpLGcuY29udGV4dD10aGlzO2ZvcihmPWMudGFyZ2V0O2YhPXRoaXM7Zj1mLnBhcmVudE5vZGV8fHRoaXMpaWYoZi5kaXNhYmxlZCE9PSEwfHxjLnR5cGUhPT0iY2xpY2siKXtpPXt9LGs9W10sZ1swXT1mO2ZvcihkPTA7ZDxxO2QrKylsPW9bZF0sbT1sLnNlbGVjdG9yLGlbbV09PT1iJiYoaVttXT1nLmlzKG0pKSxpW21dJiZrLnB1c2gobCk7ay5sZW5ndGgmJnUucHVzaCh7ZWxlbTpmLG1hdGNoZXM6a30pfX1vLmxlbmd0aD5xJiZ1LnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOm8uc2xpY2UocSl9KTtmb3IoZD0wO2Q8dS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7ZCsrKXtqPXVbZF0sYy5jdXJyZW50VGFyZ2V0PWouZWxlbTtmb3IoZT0wO2U8ai5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtlKyspe2w9ai5tYXRjaGVzW2VdO2lmKHN8fCFjLm5hbWVzcGFjZSYmIWwubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChsLm5hbWVzcGFjZSkpYy5kYXRhPWwuZGF0YSxjLmhhbmRsZU9iaj1sLGg9KChwLmV2ZW50LnNwZWNpYWxbbC5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGwuaGFuZGxlcikuYXBwbHkoai5lbGVtLHIpLGghPT1iJiYoYy5yZXN1bHQ9aCxoPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gdC5wb3N0RGlzcGF0Y2gmJnQucG9zdERpc3BhdGNoLmNhbGwodGhpcyxjKSxjLnJlc3VsdH0scHJvcHM6ImF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCBhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3JldHVybiBhLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKSxhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxjKXt2YXIgZCxmLGcsaD1jLmJ1dHRvbixpPWMuZnJvbUVsZW1lbnQ7cmV0dXJuIGEucGFnZVg9PW51bGwmJmMuY2xpZW50WCE9bnVsbCYmKGQ9YS50YXJnZXQub3duZXJEb2N1bWVudHx8ZSxmPWQuZG9jdW1lbnRFbGVtZW50LGc9ZC5ib2R5LGEucGFnZVg9Yy5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWMuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/Yy50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKSxhfX0sZml4OmZ1bmN0aW9uKGEpe2lmKGFbcC5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGQ9YSxmPXAuZXZlbnQuZml4SG9va3NbYS50eXBlXXx8e30sZz1mLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGYucHJvcHMpOnRoaXMucHJvcHM7YT1wLkV2ZW50KGQpO2ZvcihiPWcubGVuZ3RoO2I7KWM9Z1stLWJdLGFbY109ZFtjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1kLnNyY0VsZW1lbnR8fGUpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxmLmZpbHRlcj9mLmZpbHRlcihhLGQpOmF9LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpwLmJpbmRSZWFkeX0sbG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7cC5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXAuZXh0ZW5kKG5ldyBwLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9wLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOnAuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LHAuZXZlbnQuaGFuZGxlPXAuZXZlbnQuZGlzcGF0Y2gscC5yZW1vdmVFdmVudD1lLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT0idW5kZWZpbmVkIiYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0scC5FdmVudD1mdW5jdGlvbihhLGIpe2lmKHRoaXMgaW5zdGFuY2VvZiBwLkV2ZW50KWEmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP2JiOmJhKTp0aGlzLnR5cGU9YSxiJiZwLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxwLm5vdygpLHRoaXNbcC5leHBhbmRvXT0hMDtlbHNlIHJldHVybiBuZXcgcC5FdmVudChhLGIpfSxwLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1iYjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7aWYoIWEpcmV0dXJuO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YmI7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFhKXJldHVybjthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1iYix0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6YmEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6YmEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6YmF9LHAuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7cC5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iaixnPWYuc2VsZWN0b3I7aWYoIWV8fGUhPT1kJiYhcC5jb250YWlucyhkLGUpKWEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YjtyZXR1cm4gY319fSkscC5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChwLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKHAubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO3AuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1wLm5vZGVOYW1lKGMsImlucHV0Iil8fHAubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIXAuX2RhdGEoZCwiX3N1Ym1pdF9hdHRhY2hlZCIpJiYocC5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxwLl9kYXRhKGQsIl9zdWJtaXRfYXR0YWNoZWQiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFhLmlzVHJpZ2dlciYmcC5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKHAubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO3AuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSkscC5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChwLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKFYudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilwLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLHAuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExKSxwLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCl9KTtyZXR1cm4hMX1wLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtWLnRlc3QoYi5ub2RlTmFtZSkmJiFwLl9kYXRhKGIsIl9jaGFuZ2VfYXR0YWNoZWQiKSYmKHAuZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJiFhLmlzU2ltdWxhdGVkJiYhYS5pc1RyaWdnZXImJnAuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSkscC5fZGF0YShiLCJfY2hhbmdlX2F0dGFjaGVkIiwhMCkpfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBwLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLFYudGVzdCh0aGlzLm5vZGVOYW1lKX19KSxwLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fHAuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9ZnVuY3Rpb24oYSl7cC5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LHAuZXZlbnQuZml4KGEpLCEwKX07cC5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2MrKz09PTAmJmUuYWRkRXZlbnRMaXN0ZW5lcihhLGQsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tYz09PTAmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGQsITApfX19KSxwLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxjLGQsZSxmKXt2YXIgZyxoO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7dHlwZW9mIGMhPSJzdHJpbmciJiYoZD1kfHxjLGM9Yik7Zm9yKGggaW4gYSl0aGlzLm9uKGgsYyxkLGFbaF0sZik7cmV0dXJuIHRoaXN9ZD09bnVsbCYmZT09bnVsbD8oZT1jLGQ9Yz1iKTplPT1udWxsJiYodHlwZW9mIGM9PSJzdHJpbmciPyhlPWQsZD1iKTooZT1kLGQ9YyxjPWIpKTtpZihlPT09ITEpZT1iYTtlbHNlIGlmKCFlKXJldHVybiB0aGlzO3JldHVybiBmPT09MSYmKGc9ZSxlPWZ1bmN0aW9uKGEpe3JldHVybiBwKCkub2ZmKGEpLGcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9Zy5ndWlkfHwoZy5ndWlkPXAuZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cC5ldmVudC5hZGQodGhpcyxhLGUsZCxjKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmO2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXJldHVybiBlPWEuaGFuZGxlT2JqLHAoYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGUubmFtZXNwYWNlP2Uub3JpZ1R5cGUrIi4iK2UubmFtZXNwYWNlOmUub3JpZ1R5cGUsZS5zZWxlY3RvcixlLmhhbmRsZXIpLHRoaXM7aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IoZiBpbiBhKXRoaXMub2ZmKGYsYyxhW2ZdKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7cmV0dXJuIGQ9PT0hMSYmKGQ9YmEpLHRoaXMuZWFjaChmdW5jdGlvbigpe3AuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gcCh0aGlzLmNvbnRleHQpLm9uKGEsdGhpcy5zZWxlY3RvcixiLGMpLHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe3JldHVybiBwKHRoaXMuY29udGV4dCkub2ZmKGEsdGhpcy5zZWxlY3Rvcnx8IioqIixiKSx0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cC5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIHAuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fHAuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShwLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7cmV0dXJuIHAuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGUrMSksYy5wcmV2ZW50RGVmYXVsdCgpLGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxwLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtwLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM9PW51bGwmJihjPWEsYT1udWxsKSxhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LFkudGVzdChiKSYmKHAuZXZlbnQuZml4SG9va3NbYl09cC5ldmVudC5rZXlIb29rcyksWi50ZXN0KGIpJiYocC5ldmVudC5maXhIb29rc1tiXT1wLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBiZChhLGIsYyxkKXt2YXIgZT0wLGY9Yi5sZW5ndGg7Zm9yKDtlPGY7ZSsrKVooYSxiW2VdLGMsZCl9ZnVuY3Rpb24gYmUoYSxiLGMsZCxlLGYpe3ZhciBnLGg9JC5zZXRGaWx0ZXJzW2IudG9Mb3dlckNhc2UoKV07cmV0dXJuIGh8fFouZXJyb3IoYiksKGF8fCEoZz1lKSkmJmJkKGF8fCIqIixkLGc9W10sZSksZy5sZW5ndGg+MD9oKGcsYyxmKTpbXX1mdW5jdGlvbiBiZihhLGMsZCxlLGYpe3ZhciBnLGgsaSxqLGssbCxtLG4scD0wLHE9Zi5sZW5ndGgscz1MLlBPUyx0PW5ldyBSZWdFeHAoIl4iK3Muc291cmNlKyIoPyEiK3IrIikiLCJpIiksdT1mdW5jdGlvbigpe3ZhciBhPTEsYz1hcmd1bWVudHMubGVuZ3RoLTI7Zm9yKDthPGM7YSsrKWFyZ3VtZW50c1thXT09PWImJihnW2FdPWIpfTtmb3IoO3A8cTtwKyspe3MuZXhlYygiIiksYT1mW3BdLGo9W10saT0wLGs9ZTt3aGlsZShnPXMuZXhlYyhhKSl7bj1zLmxhc3RJbmRleD1nLmluZGV4K2dbMF0ubGVuZ3RoO2lmKG4+aSl7bT1hLnNsaWNlKGksZy5pbmRleCksaT1uLGw9W2NdLEIudGVzdChtKSYmKGsmJihsPWspLGs9ZSk7aWYoaD1ILnRlc3QobSkpbT1tLnNsaWNlKDAsLTUpLnJlcGxhY2UoQiwiJCYqIik7Zy5sZW5ndGg+MSYmZ1swXS5yZXBsYWNlKHQsdSksaz1iZShtLGdbMV0sZ1syXSxsLGssaCl9fWs/KGo9ai5jb25jYXQoayksKG09YS5zbGljZShpKSkmJm0hPT0iKSI/Qi50ZXN0KG0pP2JkKG0saixkLGUpOloobSxjLGQsZT9lLmNvbmNhdChrKTprKTpvLmFwcGx5KGQsaikpOlooYSxjLGQsZSl9cmV0dXJuIHE9PT0xP2Q6Wi51bmlxdWVTb3J0KGQpfWZ1bmN0aW9uIGJnKGEsYixjKXt2YXIgZCxlLGYsZz1bXSxpPTAsaj1ELmV4ZWMoYSksaz0hai5wb3AoKSYmIWoucG9wKCksbD1rJiZhLm1hdGNoKEMpfHxbIiJdLG09JC5wcmVGaWx0ZXIsbj0kLmZpbHRlcixvPSFjJiZiIT09aDtmb3IoOyhlPWxbaV0pIT1udWxsJiZrO2krKyl7Zy5wdXNoKGQ9W10pLG8mJihlPSIgIitlKTt3aGlsZShlKXtrPSExO2lmKGo9Qi5leGVjKGUpKWU9ZS5zbGljZShqWzBdLmxlbmd0aCksaz1kLnB1c2goe3BhcnQ6ai5wb3AoKS5yZXBsYWNlKEEsIiAiKSxjYXB0dXJlczpqfSk7Zm9yKGYgaW4gbikoaj1MW2ZdLmV4ZWMoZSkpJiYoIW1bZl18fChqPW1bZl0oaixiLGMpKSkmJihlPWUuc2xpY2Uoai5zaGlmdCgpLmxlbmd0aCksaz1kLnB1c2goe3BhcnQ6ZixjYXB0dXJlczpqfSkpO2lmKCFrKWJyZWFrfX1yZXR1cm4ga3x8Wi5lcnJvcihhKSxnfWZ1bmN0aW9uIGJoKGEsYixlKXt2YXIgZj1iLmRpcixnPW0rKztyZXR1cm4gYXx8KGE9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1lfSksYi5maXJzdD9mdW5jdGlvbihiLGMpe3doaWxlKGI9YltmXSlpZihiLm5vZGVUeXBlPT09MSlyZXR1cm4gYShiLGMpJiZifTpmdW5jdGlvbihiLGUpe3ZhciBoLGk9ZysiLiIrZCxqPWkrIi4iK2M7d2hpbGUoYj1iW2ZdKWlmKGIubm9kZVR5cGU9PT0xKXtpZigoaD1iW3FdKT09PWopcmV0dXJuIGIuc2l6c2V0O2lmKHR5cGVvZiBoPT0ic3RyaW5nIiYmaC5pbmRleE9mKGkpPT09MCl7aWYoYi5zaXpzZXQpcmV0dXJuIGJ9ZWxzZXtiW3FdPWo7aWYoYShiLGUpKXJldHVybiBiLnNpenNldD0hMCxiO2Iuc2l6c2V0PSExfX19fWZ1bmN0aW9uIGJpKGEsYil7cmV0dXJuIGE/ZnVuY3Rpb24oYyxkKXt2YXIgZT1iKGMsZCk7cmV0dXJuIGUmJmEoZT09PSEwP2M6ZSxkKX06Yn1mdW5jdGlvbiBiaihhLGIsYyl7dmFyIGQsZSxmPTA7Zm9yKDtkPWFbZl07ZisrKSQucmVsYXRpdmVbZC5wYXJ0XT9lPWJoKGUsJC5yZWxhdGl2ZVtkLnBhcnRdLGIpOihkLmNhcHR1cmVzLnB1c2goYixjKSxlPWJpKGUsJC5maWx0ZXJbZC5wYXJ0XS5hcHBseShudWxsLGQuY2FwdHVyZXMpKSk7cmV0dXJuIGV9ZnVuY3Rpb24gYmsoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dmFyIGQsZT0wO2Zvcig7ZD1hW2VdO2UrKylpZihkKGIsYykpcmV0dXJuITA7cmV0dXJuITF9fXZhciBjLGQsZSxmLGcsaD1hLmRvY3VtZW50LGk9aC5kb2N1bWVudEVsZW1lbnQsaj0idW5kZWZpbmVkIixrPSExLGw9ITAsbT0wLG49W10uc2xpY2Usbz1bXS5wdXNoLHE9KCJzaXpjYWNoZSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgiLiIsIiIpLHI9IltcXHgyMFxcdFxcclxcblxcZl0iLHM9Iig/OlxcXFwufFstXFx3XXxbXlxceDAwLVxceGEwXSkrIix0PXMucmVwbGFjZSgidyIsIncjIiksdT0iKFsqXiR8IX5dPz0pIix2PSJcXFsiK3IrIiooIitzKyIpIityKyIqKD86Iit1K3IrIiooPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiK3QrIil8KXwpIityKyIqXFxdIix3PSI6KCIrcysiKSg/OlxcKCg/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDJ8KCg/OlteLF18XFxcXCx8KD86LCg/PVteXFxbXSpcXF0pKXwoPzosKD89W15cXChdKlxcKSkpKSopKVxcKXwpIix4PSI6KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlxcKChcXGQqKVxcKXwpKD89W14tXXwkKSIseT1yKyIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIityKyIqIix6PSIoPz1bXlxceDIwXFx0XFxyXFxuXFxmXSkoPzpcXFxcLnwiK3YrInwiK3cucmVwbGFjZSgyLDcpKyJ8W15cXFxcKCksXSkrIixBPW5ldyBSZWdFeHAoIl4iK3IrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrcisiKyQiLCJnIiksQj1uZXcgUmVnRXhwKCJeIit5KSxDPW5ldyBSZWdFeHAoeisiPyg/PSIrcisiKix8JCkiLCJnIiksRD1uZXcgUmVnRXhwKCJeKD86KD8hLCkoPzooPzpefCwpIityKyIqIit6KyIpKj98IityKyIqKC4qPykpKFxcKXwkKSIpLEU9bmV3IFJlZ0V4cCh6LnNsaWNlKDE5LC02KSsiXFx4MjBcXHRcXHJcXG5cXGY+K35dKSt8Iit5LCJnIiksRj0vXig/OiMoW1x3XC1dKyl8KFx3Kyl8XC4oW1x3XC1dKykpJC8sRz0vW1x4MjBcdFxyXG5cZl0qWyt+XS8sSD0vOm5vdFwoJC8sST0vaFxkL2ksSj0vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLEs9L1xcKD8hXFwpL2csTD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitzKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK3MrIikiKSxOQU1FOm5ldyBSZWdFeHAoIl5cXFtuYW1lPVsnXCJdPygiK3MrIilbJ1wiXT9cXF0iKSxUQUc6bmV3IFJlZ0V4cCgiXigiK3MucmVwbGFjZSgiWy0iLCJbLVxcKiIpKyIpIiksQVRUUjpuZXcgUmVnRXhwKCJeIit2KSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrdyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcXCgiK3IrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK3IrIiooPzooWystXXwpIityKyIqKFxcZCspfCkpIityKyIqXFwpfCkiLCJpIiksUE9TOm5ldyBSZWdFeHAoeCwiaWciKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrcisiKls+K35dfCIreCwiaSIpfSxNPXt9LE49W10sTz17fSxQPVtdLFE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2l6emxlRmlsdGVyPSEwLGF9LFI9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiZiLnR5cGU9PT1hfX0sUz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihjPT09ImlucHV0Inx8Yz09PSJidXR0b24iKSYmYi50eXBlPT09YX19LFQ9ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1oLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtiPWEoYyl9Y2F0Y2goZCl7fXJldHVybiBjPW51bGwsYn0sVT1UKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSI8c2VsZWN0Pjwvc2VsZWN0PiI7dmFyIGI9dHlwZW9mIGEubGFzdENoaWxkLmdldEF0dHJpYnV0ZSgibXVsdGlwbGUiKTtyZXR1cm4gYiE9PSJib29sZWFuIiYmYiE9PSJzdHJpbmcifSksVj1UKGZ1bmN0aW9uKGEpe2EuaWQ9cSswLGEuaW5uZXJIVE1MPSI8YSBuYW1lPSciK3ErIic+PC9hPjxkaXYgbmFtZT0nIitxKyInPjwvZGl2PiIsaS5pbnNlcnRCZWZvcmUoYSxpLmZpcnN0Q2hpbGQpO3ZhciBiPWguZ2V0RWxlbWVudHNCeU5hbWUmJmguZ2V0RWxlbWVudHNCeU5hbWUocSkubGVuZ3RoPT09MitoLmdldEVsZW1lbnRzQnlOYW1lKHErMCkubGVuZ3RoO3JldHVybiBnPSFoLmdldEVsZW1lbnRCeUlkKHEpLGkucmVtb3ZlQ2hpbGQoYSksYn0pLFc9VChmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChoLmNyZWF0ZUNvbW1lbnQoIiIpKSxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoPT09MH0pLFg9VChmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT1qJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iIyJ9KSxZPVQoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj4iLCFhLmdldEVsZW1lbnRzQnlDbGFzc05hbWV8fGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTA/ITE6KGEubGFzdENoaWxkLmNsYXNzTmFtZT0iZSIsYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MSl9KSxaPWZ1bmN0aW9uKGEsYixjLGQpe2M9Y3x8W10sYj1ifHxoO3ZhciBlLGYsZyxpLGo9Yi5ub2RlVHlwZTtpZihqIT09MSYmaiE9PTkpcmV0dXJuW107aWYoIWF8fHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gYztnPWJhKGIpO2lmKCFnJiYhZClpZihlPUYuZXhlYyhhKSlpZihpPWVbMV0pe2lmKGo9PT05KXtmPWIuZ2V0RWxlbWVudEJ5SWQoaSk7aWYoIWZ8fCFmLnBhcmVudE5vZGUpcmV0dXJuIGM7aWYoZi5pZD09PWkpcmV0dXJuIGMucHVzaChmKSxjfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoZj1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkpJiZiYihiLGYpJiZmLmlkPT09aSlyZXR1cm4gYy5wdXNoKGYpLGN9ZWxzZXtpZihlWzJdKXJldHVybiBvLmFwcGx5KGMsbi5jYWxsKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSksMCkpLGM7aWYoKGk9ZVszXSkmJlkmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gby5hcHBseShjLG4uY2FsbChiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSksMCkpLGN9cmV0dXJuIGJtKGEsYixjLGQsZyl9LCQ9Wi5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLG1hdGNoOkwsb3JkZXI6WyJJRCIsIlRBRyJdLGF0dHJIYW5kbGU6e30sY3JlYXRlUHNldWRvOlEsZmluZDp7SUQ6Zz9mdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPT1qJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19OmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9PWomJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBlP2UuaWQ9PT1hfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT09aiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLnZhbHVlPT09YT9bZV06YjpbXX19LFRBRzpXP2Z1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1qKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoYT09PSIqIil7dmFyIGQsZT1bXSxmPTA7Zm9yKDtkPWNbZl07ZisrKWQubm9kZVR5cGU9PT0xJiZlLnB1c2goZCk7cmV0dXJuIGV9cmV0dXJuIGN9fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoSywiIiksYVszXT0oYVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoSywiIiksYVsyXT09PSJ+PSImJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksYVsxXT09PSJudGgiPyhhWzJdfHxaLmVycm9yKGFbMF0pLGFbM109KyhhWzNdP2FbNF0rKGFbNV18fDEpOjIqKGFbMl09PT0iZXZlbiJ8fGFbMl09PT0ib2RkIikpLGFbNF09KyhhWzZdK2FbN118fGFbMl09PT0ib2RkIikpOmFbMl0mJlouZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9YVs0XTtyZXR1cm4gTC5DSElMRC50ZXN0KGFbMF0pP251bGw6KGMmJihiPUQuZXhlYyhjKSkmJmIucG9wKCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiWzBdLmxlbmd0aC1jLmxlbmd0aC0xKSxjPWJbMF0uc2xpY2UoMCwtMSkpLGEuc3BsaWNlKDIsMyxjfHxhWzNdKSxhKX19LGZpbHRlcjp7SUQ6Zz9mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoSywiIiksZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QXR0cmlidXRlKCJpZCIpPT09YX19OmZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShLLCIiKSxmdW5jdGlvbihiKXt2YXIgYz10eXBlb2YgYi5nZXRBdHRyaWJ1dGVOb2RlIT09aiYmYi5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09YX19LFRBRzpmdW5jdGlvbihhKXtyZXR1cm4gYT09PSIqIj9mdW5jdGlvbigpe3JldHVybiEwfTooYT1hLnJlcGxhY2UoSywiIikudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXtyZXR1cm4gYi5ub2RlTmFtZSYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09YX0pfSxDTEFTUzpmdW5jdGlvbihhKXt2YXIgYj1NW2FdO3JldHVybiBifHwoYj1NW2FdPW5ldyBSZWdFeHAoIihefCIrcisiKSIrYSsiKCIrcisifCQpIiksTi5wdXNoKGEpLE4ubGVuZ3RoPiQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBNW04uc2hpZnQoKV0pLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoYS5jbGFzc05hbWV8fHR5cGVvZiBhLmdldEF0dHJpYnV0ZSE9PWomJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9fSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj9mdW5jdGlvbihkKXt2YXIgZT1aLmF0dHIoZCxhKSxmPWUrIiI7aWYoZT09bnVsbClyZXR1cm4gYj09PSIhPSI7c3dpdGNoKGIpe2Nhc2UiPSI6cmV0dXJuIGY9PT1jO2Nhc2UiIT0iOnJldHVybiBmIT09YztjYXNlIl49IjpyZXR1cm4gYyYmZi5pbmRleE9mKGMpPT09MDtjYXNlIio9IjpyZXR1cm4gYyYmZi5pbmRleE9mKGMpPi0xO2Nhc2UiJD0iOnJldHVybiBjJiZmLnN1YnN0cihmLmxlbmd0aC1jLmxlbmd0aCk9PT1jO2Nhc2Uifj0iOnJldHVybigiICIrZisiICIpLmluZGV4T2YoYyk+LTE7Y2FzZSJ8PSI6cmV0dXJuIGY9PT1jfHxmLnN1YnN0cigwLGMubGVuZ3RoKzEpPT09YysiLSJ9fTpmdW5jdGlvbihiKXtyZXR1cm4gWi5hdHRyKGIsYSkhPW51bGx9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkKXtpZihhPT09Im50aCIpe3ZhciBlPW0rKztyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGIsZixnPTAsaD1hO2lmKGM9PT0xJiZkPT09MClyZXR1cm4hMDtiPWEucGFyZW50Tm9kZTtpZihiJiYoYltxXSE9PWV8fCFhLnNpenNldCkpe2ZvcihoPWIuZmlyc3RDaGlsZDtoO2g9aC5uZXh0U2libGluZylpZihoLm5vZGVUeXBlPT09MSl7aC5zaXpzZXQ9KytnO2lmKGg9PT1hKWJyZWFrfWJbcV09ZX1yZXR1cm4gZj1hLnNpenNldC1kLGM9PT0wP2Y9PT0wOmYlYz09PTAmJmYvYz49MH19cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWI7c3dpdGNoKGEpe2Nhc2Uib25seSI6Y2FzZSJmaXJzdCI6d2hpbGUoYz1jLnByZXZpb3VzU2libGluZylpZihjLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtpZihhPT09ImZpcnN0IilyZXR1cm4hMDtjPWI7Y2FzZSJsYXN0Ijp3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYy5ub2RlVHlwZT09PTEpcmV0dXJuITE7cmV0dXJuITB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSQucHNldWRvc1thXXx8JC5wc2V1ZG9zW2EudG9Mb3dlckNhc2UoKV07cmV0dXJuIGV8fFouZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKSxlLnNpenpsZUZpbHRlcj9lKGIsYyxkKTplfX0scHNldWRvczp7bm90OlEoZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJsKGEucmVwbGFjZShBLCIkMSIpLGIsYyk7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiFkKGEpfX0pLGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT0iaW5wdXQiJiYhIWEuY2hlY2tlZHx8Yj09PSJvcHRpb24iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiEkLnBzZXVkb3MuZW1wdHkoYSl9LGVtcHR5OmZ1bmN0aW9uKGEpe3ZhciBiO2E9YS5maXJzdENoaWxkO3doaWxlKGEpe2lmKGEubm9kZU5hbWU+IkAifHwoYj1hLm5vZGVUeXBlKT09PTN8fGI9PT00KXJldHVybiExO2E9YS5uZXh0U2libGluZ31yZXR1cm4hMH0sY29udGFpbnM6UShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxiYyhiKSkuaW5kZXhPZihhKT4tMX19KSxoYXM6UShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIFooYSxiKS5sZW5ndGg+MH19KSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIEkudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYoYj1hLnR5cGUpPT09InRleHQiJiYoKGM9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fGMudG9Mb3dlckNhc2UoKT09PWIpfSxyYWRpbzpSKCJyYWRpbyIpLGNoZWNrYm94OlIoImNoZWNrYm94IiksZmlsZTpSKCJmaWxlIikscGFzc3dvcmQ6UigicGFzc3dvcmQiKSxpbWFnZTpSKCJpbWFnZSIpLHN1Ym1pdDpTKCJzdWJtaXQiKSxyZXNldDpTKCJyZXNldCIpLGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT0iaW5wdXQiJiZhLnR5cGU9PT0iYnV0dG9uInx8Yj09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gSi50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXt2YXIgYj1hLm93bmVyRG9jdW1lbnQ7cmV0dXJuIGE9PT1iLmFjdGl2ZUVsZW1lbnQmJighYi5oYXNGb2N1c3x8Yi5oYXNGb2N1cygpKSYmKCEhYS50eXBlfHwhIWEuaHJlZil9LGFjdGl2ZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP2Euc2xpY2UoMSk6W2FbMF1dfSxsYXN0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnBvcCgpO3JldHVybiBjP2E6W2RdfSxldmVuOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWM/MTowLGY9YS5sZW5ndGg7Zm9yKDtlPGY7ZT1lKzIpZC5wdXNoKGFbZV0pO3JldHVybiBkfSxvZGQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9Yz8wOjEsZj1hLmxlbmd0aDtmb3IoO2U8ZjtlPWUrMilkLnB1c2goYVtlXSk7cmV0dXJuIGR9LGx0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz9hLnNsaWNlKCtiKTphLnNsaWNlKDAsK2IpfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/YS5zbGljZSgwLCtiKzEpOmEuc2xpY2UoK2IrMSl9LGVxOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnNwbGljZSgrYiwxKTtyZXR1cm4gYz9hOmR9fX07JC5zZXRGaWx0ZXJzLm50aD0kLnNldEZpbHRlcnMuZXEsJC5maWx0ZXJzPSQucHNldWRvcyxYfHwoJC5hdHRySGFuZGxlPXtocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSksViYmKCQub3JkZXIucHVzaCgiTkFNRSIpLCQuZmluZC5OQU1FPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeU5hbWUhPT1qKXJldHVybiBiLmdldEVsZW1lbnRzQnlOYW1lKGEpfSksWSYmKCQub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSwkLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1qJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpfSk7dHJ5e24uY2FsbChpLmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2goXyl7bj1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2Zvcig7Yj10aGlzW2FdO2ErKyljLnB1c2goYik7cmV0dXJuIGN9fXZhciBiYT1aLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfSxiYj1aLmNvbnRhaW5zPWkuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KX06aS5jb250YWlucz9mdW5jdGlvbihhLGIpe3ZhciBjPWEubm9kZVR5cGU9PT05P2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhIShkJiZkLm5vZGVUeXBlPT09MSYmYy5jb250YWlucyYmYy5jb250YWlucyhkKSl9OmZ1bmN0aW9uKGEsYil7d2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LGJjPVouZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjPSIiLGQ9MCxlPWEubm9kZVR5cGU7aWYoZSl7aWYoZT09PTF8fGU9PT05fHxlPT09MTEpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpYys9YmMoYSl9ZWxzZSBpZihlPT09M3x8ZT09PTQpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2UgZm9yKDtiPWFbZF07ZCsrKWMrPWJjKGIpO3JldHVybiBjfTtaLmF0dHI9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWJhKGEpO3JldHVybiBkfHwoYj1iLnRvTG93ZXJDYXNlKCkpLCQuYXR0ckhhbmRsZVtiXT8kLmF0dHJIYW5kbGVbYl0oYSk6VXx8ZD9hLmdldEF0dHJpYnV0ZShiKTooYz1hLmdldEF0dHJpYnV0ZU5vZGUoYiksYz90eXBlb2YgYVtiXT09ImJvb2xlYW4iP2FbYl0/YjpudWxsOmMuc3BlY2lmaWVkP2MudmFsdWU6bnVsbDpudWxsKX0sWi5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LFswLDBdLnNvcnQoZnVuY3Rpb24oKXtyZXR1cm4gbD0wfSksaS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9lPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iPyhrPSEwLDApOighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjQpPy0xOjF9OihlPWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGs9ITAsMDtpZihhLnNvdXJjZUluZGV4JiZiLnNvdXJjZUluZGV4KXJldHVybiBhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7dmFyIGMsZCxlPVtdLGc9W10saD1hLnBhcmVudE5vZGUsaT1iLnBhcmVudE5vZGUsaj1oO2lmKGg9PT1pKXJldHVybiBmKGEsYik7aWYoIWgpcmV0dXJuLTE7aWYoIWkpcmV0dXJuIDE7d2hpbGUoaillLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7aj1pO3doaWxlKGopZy51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2M9ZS5sZW5ndGgsZD1nLmxlbmd0aDtmb3IodmFyIGw9MDtsPGMmJmw8ZDtsKyspaWYoZVtsXSE9PWdbbF0pcmV0dXJuIGYoZVtsXSxnW2xdKTtyZXR1cm4gbD09PWM/ZihhLGdbbF0sLTEpOmYoZVtsXSxiLDEpfSxmPWZ1bmN0aW9uKGEsYixjKXtpZihhPT09YilyZXR1cm4gYzt2YXIgZD1hLm5leHRTaWJsaW5nO3doaWxlKGQpe2lmKGQ9PT1iKXJldHVybi0xO2Q9ZC5uZXh0U2libGluZ31yZXR1cm4gMX0pLFoudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixjPTE7aWYoZSl7az1sLGEuc29ydChlKTtpZihrKWZvcig7Yj1hW2NdO2MrKyliPT09YVtjLTFdJiZhLnNwbGljZShjLS0sMSl9cmV0dXJuIGF9O3ZhciBibD1aLmNvbXBpbGU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPU9bYV07aWYoZyYmZy5jb250ZXh0PT09YilyZXR1cm4gZztlPWJnKGEsYixjKTtmb3IoZj0wO2Q9ZVtmXTtmKyspZVtmXT1iaihkLGIsYyk7cmV0dXJuIGc9T1thXT1iayhlKSxnLmNvbnRleHQ9YixnLnJ1bnM9Zy5kaXJydW5zPTAsUC5wdXNoKGEpLFAubGVuZ3RoPiQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBPW1Auc2hpZnQoKV0sZ307Wi5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFooYSxudWxsLG51bGwsYil9LFoubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFooYixudWxsLG51bGwsW2FdKS5sZW5ndGg+MH07dmFyIGJtPWZ1bmN0aW9uKGEsYixlLGYsZyl7YT1hLnJlcGxhY2UoQSwiJDEiKTt2YXIgaCxpLGosayxsLG0scCxxLHIscz1hLm1hdGNoKEMpLHQ9YS5tYXRjaChFKSx1PWIubm9kZVR5cGU7aWYoTC5QT1MudGVzdChhKSlyZXR1cm4gYmYoYSxiLGUsZixzKTtpZihmKWg9bi5jYWxsKGYsMCk7ZWxzZSBpZihzJiZzLmxlbmd0aD09PTEpe2lmKHQubGVuZ3RoPjEmJnU9PT05JiYhZyYmKHM9TC5JRC5leGVjKHRbMF0pKSl7Yj0kLmZpbmQuSUQoc1sxXSxiLGcpWzBdO2lmKCFiKXJldHVybiBlO2E9YS5zbGljZSh0LnNoaWZ0KCkubGVuZ3RoKX1xPShzPUcuZXhlYyh0WzBdKSkmJiFzLmluZGV4JiZiLnBhcmVudE5vZGV8fGIscj10LnBvcCgpLG09ci5zcGxpdCgiOm5vdCIpWzBdO2ZvcihqPTAsaz0kLm9yZGVyLmxlbmd0aDtqPGs7aisrKXtwPSQub3JkZXJbal07aWYocz1MW3BdLmV4ZWMobSkpe2g9JC5maW5kW3BdKChzWzFdfHwiIikucmVwbGFjZShLLCIiKSxxLGcpO2lmKGg9PW51bGwpY29udGludWU7bT09PXImJihhPWEuc2xpY2UoMCxhLmxlbmd0aC1yLmxlbmd0aCkrbS5yZXBsYWNlKExbcF0sIiIpLGF8fG8uYXBwbHkoZSxuLmNhbGwoaCwwKSkpO2JyZWFrfX19aWYoYSl7aT1ibChhLGIsZyksZD1pLmRpcnJ1bnMrKyxoPT1udWxsJiYoaD0kLmZpbmQuVEFHKCIqIixHLnRlc3QoYSkmJmIucGFyZW50Tm9kZXx8YikpO2ZvcihqPTA7bD1oW2pdO2orKyljPWkucnVucysrLGkobCxiKSYmZS5wdXNoKGwpfXJldHVybiBlfTtoLnF1ZXJ5U2VsZWN0b3JBbGwmJmZ1bmN0aW9uKCl7dmFyIGEsYj1ibSxjPS8nfFxcL2csZD0vXD1bXHgyMFx0XHJcblxmXSooW14nIlxdXSopW1x4MjBcdFxyXG5cZl0qXF0vZyxlPVtdLGY9WyI6YWN0aXZlIl0sZz1pLm1hdGNoZXNTZWxlY3Rvcnx8aS5tb3pNYXRjaGVzU2VsZWN0b3J8fGkud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxpLm9NYXRjaGVzU2VsZWN0b3J8fGkubXNNYXRjaGVzU2VsZWN0b3I7VChmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxlLnB1c2goIlxcWyIrcisiKig/OmNoZWNrZWR8ZGlzYWJsZWR8aXNtYXB8bXVsdGlwbGV8cmVhZG9ubHl8c2VsZWN0ZWR8dmFsdWUpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8ZS5wdXNoKCI6Y2hlY2tlZCIpfSksVChmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHAgdGVzdD0nJz48L3A+IixhLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0ZXN0Xj0nJ10iKS5sZW5ndGgmJmUucHVzaCgiWypeJF09IityKyIqKD86XCJcInwnJykiKSxhLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J2hpZGRlbic+IixhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxlLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIil9KSxlPWUubGVuZ3RoJiZuZXcgUmVnRXhwKGUuam9pbigifCIpKSxibT1mdW5jdGlvbihhLGQsZixnLGgpe2lmKCFnJiYhaCYmKCFlfHwhZS50ZXN0KGEpKSlpZihkLm5vZGVUeXBlPT09OSl0cnl7cmV0dXJuIG8uYXBwbHkoZixuLmNhbGwoZC5xdWVyeVNlbGVjdG9yQWxsKGEpLDApKSxmfWNhdGNoKGkpe31lbHNlIGlmKGQubm9kZVR5cGU9PT0xJiZkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7dmFyIGo9ZC5nZXRBdHRyaWJ1dGUoImlkIiksaz1qfHxxLGw9Ry50ZXN0KGEpJiZkLnBhcmVudE5vZGV8fGQ7aj9rPWsucmVwbGFjZShjLCJcXCQmIik6ZC5zZXRBdHRyaWJ1dGUoImlkIixrKTt0cnl7cmV0dXJuIG8uYXBwbHkoZixuLmNhbGwobC5xdWVyeVNlbGVjdG9yQWxsKGEucmVwbGFjZShDLCJbaWQ9JyIraysiJ10gJCYiKSksMCkpLGZ9Y2F0Y2goaSl7fWZpbmFsbHl7anx8ZC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXJldHVybiBiKGEsZCxmLGcsaCl9LGcmJihUKGZ1bmN0aW9uKGIpe2E9Zy5jYWxsKGIsImRpdiIpO3RyeXtnLmNhbGwoYiwiW3Rlc3QhPScnXTpzaXp6bGUiKSxmLnB1c2goJC5tYXRjaC5QU0VVRE8pfWNhdGNoKGMpe319KSxmPW5ldyBSZWdFeHAoZi5qb2luKCJ8IikpLFoubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGIsYyl7Yz1jLnJlcGxhY2UoZCwiPSckMSddIik7aWYoIWJhKGIpJiYhZi50ZXN0KGMpJiYoIWV8fCFlLnRlc3QoYykpKXRyeXt2YXIgaD1nLmNhbGwoYixjKTtpZihofHxhfHxiLmRvY3VtZW50JiZiLmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpcmV0dXJuIGh9Y2F0Y2goaSl7fXJldHVybiBaKGMsbnVsbCxudWxsLFtiXSkubGVuZ3RoPjB9KX0oKSxaLmF0dHI9cC5hdHRyLHAuZmluZD1aLHAuZXhwcj1aLnNlbGVjdG9ycyxwLmV4cHJbIjoiXT1wLmV4cHIucHNldWRvcyxwLnVuaXF1ZT1aLnVuaXF1ZVNvcnQscC50ZXh0PVouZ2V0VGV4dCxwLmlzWE1MRG9jPVouaXNYTUwscC5jb250YWlucz1aLmNvbnRhaW5zfShhKTt2YXIgYmM9L1VudGlsJC8sYmQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sYmU9L14uW146I1xbXC4sXSokLyxiZj1wLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGJnPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3AuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPXRoaXM7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBwKGEpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTAsYz1oLmxlbmd0aDtiPGM7YisrKWlmKHAuY29udGFpbnMoaFtiXSx0aGlzKSlyZXR1cm4hMH0pO2c9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpO2ZvcihiPTAsYz10aGlzLmxlbmd0aDtiPGM7YisrKXtkPWcubGVuZ3RoLHAuZmluZChhLHRoaXNbYl0sZyk7aWYoYj4wKWZvcihlPWQ7ZTxnLmxlbmd0aDtlKyspZm9yKGY9MDtmPGQ7ZisrKWlmKGdbZl09PT1nW2VdKXtnLnNwbGljZShlLS0sMSk7YnJlYWt9fXJldHVybiBnfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1wKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYocC5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYmoodGhpcyxhLCExKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhiaih0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/YmYudGVzdChhKT9wKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpwLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MCxlPXRoaXMubGVuZ3RoLGY9W10sZz1iZi50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/cChhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoO2Q8ZTtkKyspe2M9dGhpc1tkXTt3aGlsZShjJiZjLm93bmVyRG9jdW1lbnQmJmMhPT1iJiZjLm5vZGVUeXBlIT09MTEpe2lmKGc/Zy5pbmRleChjKT4tMTpwLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGMsYSkpe2YucHVzaChjKTticmVha31jPWMucGFyZW50Tm9kZX19cmV0dXJuIGY9Zi5sZW5ndGg+MT9wLnVuaXF1ZShmKTpmLHRoaXMucHVzaFN0YWNrKGYsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT90eXBlb2YgYT09InN0cmluZyI/cC5pbkFycmF5KHRoaXNbMF0scChhKSk6cC5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/cChhLGIpOnAubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9cC5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhiaChjWzBdKXx8YmgoZFswXSk/ZDpwLnVuaXF1ZShkKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKGE9PW51bGw/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pLHAuZm4uYW5kU2VsZj1wLmZuLmFkZEJhY2sscC5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBwLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBiaShhLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBiaShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gcC5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gcC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gcC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHAuc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHAuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gcC5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OnAubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7cC5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXAubWFwKHRoaXMsYixjKTtyZXR1cm4gYmMudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1wLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFiZ1thXT9wLnVuaXF1ZShlKTplLHRoaXMubGVuZ3RoPjEmJmJkLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlLGEsay5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxwLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksYi5sZW5ndGg9PT0xP3AuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106cC5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxmPWFbY107d2hpbGUoZiYmZi5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zi5ub2RlVHlwZSE9PTF8fCFwKGYpLmlzKGQpKSlmLm5vZGVUeXBlPT09MSYmZS5wdXNoKGYpLGY9ZltjXTtyZXR1cm4gZX0sc2libGluZzpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcig7YTthPWEubmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PTEmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSk7dmFyIGJsPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixibT0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLGJuPS9eXHMrLyxibz0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGJwPS88KFtcdzpdKykvLGJxPS88dGJvZHkvaSxicj0vPHwmIz9cdys7Lyxicz0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGJ0PS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksYnU9bmV3IFJlZ0V4cCgiPCg/OiIrYmwrIilbXFxzLz5dIiwiaSIpLGJ2PS9eKD86Y2hlY2tib3h8cmFkaW8pJC8sYnc9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYng9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxieT0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pfFtcXVwtXXsyfT5ccyokL2csYno9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYkE9YmsoZSksYkI9YkEuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7Ynoub3B0Z3JvdXA9Ynoub3B0aW9uLGJ6LnRib2R5PWJ6LnRmb290PWJ6LmNvbGdyb3VwPWJ6LmNhcHRpb249YnoudGhlYWQsYnoudGg9YnoudGQscC5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fChiei5fZGVmYXVsdD1bMSwiWDxkaXY+IiwiPC9kaXY+Il0pLHAuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yj9wLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxlKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihwLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtwKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9cChhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmYS5maXJzdENoaWxkLm5vZGVUeXBlPT09MSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBwLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXAodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9cC5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cCh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe3Aubm9kZU5hbWUodGhpcywiYm9keSIpfHxwKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKCFiaCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9cC5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1lcmdlKGEsdGhpcyksImJlZm9yZSIsdGhpcy5zZWxlY3Rvcil9fSxhZnRlcjpmdW5jdGlvbigpe2lmKCFiaCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9cC5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1lcmdlKHRoaXMsYSksImFmdGVyIix0aGlzLnNlbGVjdG9yKX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtmb3IoOyhjPXRoaXNbZF0pIT1udWxsO2QrKylpZighYXx8cC5maWx0ZXIoYSxbY10pLmxlbmd0aCkhYiYmYy5ub2RlVHlwZT09PTEmJihwLmNsZWFuRGF0YShjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHAuY2xlYW5EYXRhKFtjXSkpLGMucGFyZW50Tm9kZSYmYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBhLGI9MDtmb3IoOyhhPXRoaXNbYl0pIT1udWxsO2IrKyl7YS5ub2RlVHlwZT09PTEmJnAuY2xlYW5EYXRhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYS5maXJzdENoaWxkKWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBwLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBjPXRoaXNbMF18fHt9LGQ9MCxlPXRoaXMubGVuZ3RoO2lmKGE9PT1iKXJldHVybiBjLm5vZGVUeXBlPT09MT9jLmlubmVySFRNTC5yZXBsYWNlKGJtLCIiKTpiO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJzLnRlc3QoYSkmJihwLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8IWJ1LnRlc3QoYSkpJiYocC5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhYm4udGVzdChhKSkmJiFielsoYnAuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKGJvLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPGU7ZCsrKWM9dGhpc1tkXXx8e30sYy5ub2RlVHlwZT09PTEmJihwLmNsZWFuRGF0YShjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGMuaW5uZXJIVE1MPWEpO2M9MH1jYXRjaChmKXt9fWMmJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGJoKHRoaXNbMF0pP3RoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKHAocC5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXM6cC5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1wKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pOih0eXBlb2YgYSE9InN0cmluZyImJihhPXAoYSkuZGV0YWNoKCkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7cCh0aGlzKS5yZW1vdmUoKSxiP3AoYikuYmVmb3JlKGEpOnAoYykuYXBwZW5kKGEpfSkpfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7YT1bXS5jb25jYXQuYXBwbHkoW10sYSk7dmFyIGUsZixnLGgsaT0wLGo9YVswXSxrPVtdLGw9dGhpcy5sZW5ndGg7aWYoIXAuc3VwcG9ydC5jaGVja0Nsb25lJiZsPjEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYncudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cCh0aGlzKS5kb21NYW5pcChhLGMsZCl9KTtpZihwLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1wKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2YuaHRtbCgpOmIpLGYuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7ZT1wLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGc9ZS5mcmFnbWVudCxmPWcuZmlyc3RDaGlsZCxnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmKGc9Zik7aWYoZil7Yz1jJiZwLm5vZGVOYW1lKGYsInRyIik7Zm9yKGg9ZS5jYWNoZWFibGV8fGwtMTtpPGw7aSsrKWQuY2FsbChjJiZwLm5vZGVOYW1lKHRoaXNbaV0sInRhYmxlIik/YkModGhpc1tpXSwidGJvZHkiKTp0aGlzW2ldLGk9PT1oP2c6cC5jbG9uZShnLCEwLCEwKSl9Zz1mPW51bGwsay5sZW5ndGgmJnAuZWFjaChrLGZ1bmN0aW9uKGEsYil7Yi5zcmM/cC5hamF4P3AuYWpheCh7dXJsOmIuc3JjLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6cC5lcnJvcigibm8gYWpheCIpOnAuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYnksIiIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX0pfXJldHVybiB0aGlzfX0pLHAuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoLGk9YVswXTtyZXR1cm4gYz1jfHxlLGM9KGNbMF18fGMpLm93bmVyRG9jdW1lbnR8fGNbMF18fGMsdHlwZW9mIGMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD09InVuZGVmaW5lZCImJihjPWUpLGEubGVuZ3RoPT09MSYmdHlwZW9mIGk9PSJzdHJpbmciJiZpLmxlbmd0aDw1MTImJmM9PT1lJiZpLmNoYXJBdCgwKT09PSI8IiYmIWJ0LnRlc3QoaSkmJihwLnN1cHBvcnQuY2hlY2tDbG9uZXx8IWJ3LnRlc3QoaSkpJiYocC5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFidS50ZXN0KGkpKSYmKGc9ITAsZj1wLmZyYWdtZW50c1tpXSxoPWYhPT1iKSxmfHwoZj1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwLmNsZWFuKGEsYyxmLGQpLGcmJihwLmZyYWdtZW50c1tpXT1oJiZmKSkse2ZyYWdtZW50OmYsY2FjaGVhYmxlOmd9fSxwLmZyYWdtZW50cz17fSxwLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe3AuZm5bYV09ZnVuY3Rpb24oYyl7dmFyIGQsZT0wLGY9W10sZz1wKGMpLGg9Zy5sZW5ndGgsaT10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZigoaT09bnVsbHx8aSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09MSkmJmg9PT0xKXJldHVybiBnW2JdKHRoaXNbMF0pLHRoaXM7Zm9yKDtlPGg7ZSsrKWQ9KGU+MD90aGlzLmNsb25lKCEwKTp0aGlzKS5nZXQoKSxwKGdbZV0pW2JdKGQpLGY9Zi5jb25jYXQoZCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYsYSxnLnNlbGVjdG9yKX19KSxwLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnO3Auc3VwcG9ydC5odG1sNUNsb25lfHxwLmlzWE1MRG9jKGEpfHwhYnUudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2c9YS5jbG9uZU5vZGUoITApOihiQi5pbm5lckhUTUw9YS5vdXRlckhUTUwsYkIucmVtb3ZlQ2hpbGQoZz1iQi5maXJzdENoaWxkKSk7aWYoKCFwLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhcC5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhcC5pc1hNTERvYyhhKSl7YkUoYSxnKSxkPWJGKGEpLGU9YkYoZyk7Zm9yKGY9MDtkW2ZdOysrZillW2ZdJiZiRShkW2ZdLGVbZl0pfWlmKGIpe2JEKGEsZyk7aWYoYyl7ZD1iRihhKSxlPWJGKGcpO2ZvcihmPTA7ZFtmXTsrK2YpYkQoZFtmXSxlW2ZdKX19cmV0dXJuIGQ9ZT1udWxsLGd9LGNsZWFuOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBmLGcsaCxpLGosayxsLG0sbixvLHEscixzPTAsdD1bXTtpZighYnx8dHlwZW9mIGIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD09InVuZGVmaW5lZCIpYj1lO2ZvcihnPWI9PT1lJiZiQTsoaD1hW3NdKSE9bnVsbDtzKyspe3R5cGVvZiBoPT0ibnVtYmVyIiYmKGgrPSIiKTtpZighaCljb250aW51ZTtpZih0eXBlb2YgaD09InN0cmluZyIpaWYoIWJyLnRlc3QoaCkpaD1iLmNyZWF0ZVRleHROb2RlKGgpO2Vsc2V7Zz1nfHxiayhiKSxsPWx8fGcuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaD1oLnJlcGxhY2UoYm8sIjwkMT48LyQyPiIpLGk9KGJwLmV4ZWMoaCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksaj1ieltpXXx8YnouX2RlZmF1bHQsaz1qWzBdLGwuaW5uZXJIVE1MPWpbMV0raCtqWzJdO3doaWxlKGstLSlsPWwubGFzdENoaWxkO2lmKCFwLnN1cHBvcnQudGJvZHkpe209YnEudGVzdChoKSxuPWk9PT0idGFibGUiJiYhbT9sLmZpcnN0Q2hpbGQmJmwuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOmpbMV09PT0iPHRhYmxlPiImJiFtP2wuY2hpbGROb2RlczpbXTtmb3IoZj1uLmxlbmd0aC0xO2Y+PTA7LS1mKXAubm9kZU5hbWUobltmXSwidGJvZHkiKSYmIW5bZl0uY2hpbGROb2Rlcy5sZW5ndGgmJm5bZl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuW2ZdKX0hcC5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZibi50ZXN0KGgpJiZsLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKGJuLmV4ZWMoaClbMF0pLGwuZmlyc3RDaGlsZCksaD1sLmNoaWxkTm9kZXMsbD1nLmxhc3RDaGlsZH1oLm5vZGVUeXBlP3QucHVzaChoKTp0PXAubWVyZ2UodCxoKX1sJiYoZy5yZW1vdmVDaGlsZChsKSxoPWw9Zz1udWxsKTtpZighcC5zdXBwb3J0LmFwcGVuZENoZWNrZWQpZm9yKHM9MDsoaD10W3NdKSE9bnVsbDtzKyspcC5ub2RlTmFtZShoLCJpbnB1dCIpP2JHKGgpOnR5cGVvZiBoLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIiYmcC5ncmVwKGguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksYkcpO2lmKGMpe3E9ZnVuY3Rpb24oYSl7aWYoIWEudHlwZXx8YngudGVzdChhLnR5cGUpKXJldHVybiBkP2QucHVzaChhLnBhcmVudE5vZGU/YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpOmEpOmMuYXBwZW5kQ2hpbGQoYSl9O2ZvcihzPTA7KGg9dFtzXSkhPW51bGw7cysrKWlmKCFwLm5vZGVOYW1lKGgsInNjcmlwdCIpfHwhcShoKSljLmFwcGVuZENoaWxkKGgpLHR5cGVvZiBoLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIiYmKHI9cC5ncmVwKHAubWVyZ2UoW10saC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpLHEpLHQuc3BsaWNlLmFwcGx5KHQsW3MrMSwwXS5jb25jYXQocikpLHMrPXIubGVuZ3RoKX1yZXR1cm4gdH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz0wLGg9cC5leHBhbmRvLGk9cC5jYWNoZSxqPXAuc3VwcG9ydC5kZWxldGVFeHBhbmRvLGs9cC5ldmVudC5zcGVjaWFsO2Zvcig7KGU9YVtnXSkhPW51bGw7ZysrKWlmKGJ8fHAuYWNjZXB0RGF0YShlKSl7ZD1lW2hdLGM9ZCYmaVtkXTtpZihjKXtpZihjLmV2ZW50cylmb3IoZiBpbiBjLmV2ZW50cylrW2ZdP3AuZXZlbnQucmVtb3ZlKGUsZik6cC5yZW1vdmVFdmVudChlLGYsYy5oYW5kbGUpO2lbZF0mJihkZWxldGUgaVtkXSxqP2RlbGV0ZSBlW2hdOmUucmVtb3ZlQXR0cmlidXRlP2UucmVtb3ZlQXR0cmlidXRlKGgpOmVbaF09bnVsbCxwLmRlbGV0ZWRJZHMucHVzaChkKSl9fX19KSxmdW5jdGlvbigpe3ZhciBhLGI7cC51YU1hdGNoPWZ1bmN0aW9uKGEpe2E9YS50b0xvd2VyQ2FzZSgpO3ZhciBiPS8oY2hyb21lKVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8od2Via2l0KVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8ob3BlcmEpKD86Lip2ZXJzaW9ufClbIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKG1zaWUpIChbXHcuXSspLy5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiYvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspfCkvLmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sYT1wLnVhTWF0Y2goZy51c2VyQWdlbnQpLGI9e30sYS5icm93c2VyJiYoYlthLmJyb3dzZXJdPSEwLGIudmVyc2lvbj1hLnZlcnNpb24pLGIud2Via2l0JiYoYi5zYWZhcmk9ITApLHAuYnJvd3Nlcj1iLHAuc3ViPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9cC5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uIGMoYyxkKXtyZXR1cm4gZCYmZCBpbnN0YW5jZW9mIHAmJiEoZCBpbnN0YW5jZW9mIGEpJiYoZD1hKGQpKSxwLmZuLmluaXQuY2FsbCh0aGlzLGMsZCxiKX0sYS5mbi5pbml0LnByb3RvdHlwZT1hLmZuO3ZhciBiPWEoZSk7cmV0dXJuIGF9fSgpO3ZhciBiSCxiSSxiSixiSz0vYWxwaGFcKFteKV0qXCkvaSxiTD0vb3BhY2l0eT0oW14pXSopLyxiTT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC8sYk49L15tYXJnaW4vLGJPPW5ldyBSZWdFeHAoIl4oIitxKyIpKC4qKSQiLCJpIiksYlA9bmV3IFJlZ0V4cCgiXigiK3ErIikoPyFweClbYS16JV0rJCIsImkiKSxiUT1uZXcgUmVnRXhwKCJeKFstK10pPSgiK3ErIikiLCJpIiksYlI9e30sYlM9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJUPXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDAsbGluZUhlaWdodDoxfSxiVT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGJWPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sYlc9cC5mbi50b2dnbGU7cC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGMpe3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gZCE9PWI/cC5zdHlsZShhLGMsZCk6cC5jc3MoYSxjKX0sYSxjLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gYloodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gYloodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhPT0iYm9vbGVhbiI7cmV0dXJuIHAuaXNGdW5jdGlvbihhKSYmcC5pc0Z1bmN0aW9uKGIpP2JXLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmVhY2goZnVuY3Rpb24oKXsoYz9hOmJZKHRoaXMpKT9wKHRoaXMpLnNob3coKTpwKHRoaXMpLmhpZGUoKX0pfX0pLHAuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YkgoYSwib3BhY2l0eSIpO3JldHVybiBjPT09IiI/IjEiOmN9fX19LGNzc051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOnAuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoIWF8fGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWEuc3R5bGUpcmV0dXJuO3ZhciBmLGcsaCxpPXAuY2FtZWxDYXNlKGMpLGo9YS5zdHlsZTtjPXAuY3NzUHJvcHNbaV18fChwLmNzc1Byb3BzW2ldPWJYKGosaSkpLGg9cC5jc3NIb29rc1tjXXx8cC5jc3NIb29rc1tpXTtpZihkPT09YilyZXR1cm4gaCYmImdldCJpbiBoJiYoZj1oLmdldChhLCExLGUpKSE9PWI/ZjpqW2NdO2c9dHlwZW9mIGQsZz09PSJzdHJpbmciJiYoZj1iUS5leGVjKGQpKSYmKGQ9KGZbMV0rMSkqZlsyXStwYXJzZUZsb2F0KHAuY3NzKGEsYykpLGc9Im51bWJlciIpO2lmKGQ9PW51bGx8fGc9PT0ibnVtYmVyIiYmaXNOYU4oZCkpcmV0dXJuO2c9PT0ibnVtYmVyIiYmIXAuY3NzTnVtYmVyW2ldJiYoZCs9InB4Iik7aWYoIWh8fCEoInNldCJpbiBoKXx8KGQ9aC5zZXQoYSxkLGUpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChrKXt9fSxjc3M6ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGk9cC5jYW1lbENhc2UoYyk7cmV0dXJuIGM9cC5jc3NQcm9wc1tpXXx8KHAuY3NzUHJvcHNbaV09YlgoYS5zdHlsZSxpKSksaD1wLmNzc0hvb2tzW2NdfHxwLmNzc0hvb2tzW2ldLGgmJiJnZXQiaW4gaCYmKGY9aC5nZXQoYSwhMCxlKSksZj09PWImJihmPWJIKGEsYykpLGY9PT0ibm9ybWFsIiYmYyBpbiBiVCYmKGY9YlRbY10pLGR8fGUhPT1iPyhnPXBhcnNlRmxvYXQoZiksZHx8cC5pc051bWVyaWMoZyk/Z3x8MDpmKTpmfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e307Zm9yKGUgaW4gYilmW2VdPWEuc3R5bGVbZV0sYS5zdHlsZVtlXT1iW2VdO2Q9Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1mW2VdO3JldHVybiBkfX0pLGEuZ2V0Q29tcHV0ZWRTdHlsZT9iSD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9Z2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpLGg9YS5zdHlsZTtyZXR1cm4gZyYmKGM9Z1tiXSxjPT09IiImJiFwLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkmJihjPXAuc3R5bGUoYSxiKSksYlAudGVzdChjKSYmYk4udGVzdChiKSYmKGQ9aC53aWR0aCxlPWgubWluV2lkdGgsZj1oLm1heFdpZHRoLGgubWluV2lkdGg9aC5tYXhXaWR0aD1oLndpZHRoPWMsYz1nLndpZHRoLGgud2lkdGg9ZCxoLm1pbldpZHRoPWUsaC5tYXhXaWR0aD1mKSksY306ZS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoYkg9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGY9YS5zdHlsZTtyZXR1cm4gZT09bnVsbCYmZiYmZltiXSYmKGU9ZltiXSksYlAudGVzdChlKSYmIWJNLnRlc3QoYikmJihjPWYubGVmdCxkPWEucnVudGltZVN0eWxlJiZhLnJ1bnRpbWVTdHlsZS5sZWZ0LGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGYubGVmdD1iPT09ImZvbnRTaXplIj8iMWVtIjplLGU9Zi5waXhlbExlZnQrInB4IixmLmxlZnQ9YyxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1kKSksZT09PSIiPyJhdXRvIjplfSkscC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe3AuY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7aWYoYylyZXR1cm4gYS5vZmZzZXRXaWR0aCE9PTB8fGJIKGEsImRpc3BsYXkiKSE9PSJub25lIj9jYShhLGIsZCk6cC5zd2FwKGEsYlMsZnVuY3Rpb24oKXtyZXR1cm4gY2EoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGIkKGEsYyxkP2JfKGEsYixkLHAuc3VwcG9ydC5ib3hTaXppbmcmJnAuY3NzKGEsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giKTowKX19fSkscC5zdXBwb3J0Lm9wYWNpdHl8fChwLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBiTC50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9cC5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZj1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJnAudHJpbShmLnJlcGxhY2UoYkssIiIpKT09PSIiJiZjLnJlbW92ZUF0dHJpYnV0ZSl7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9YksudGVzdChmKT9mLnJlcGxhY2UoYkssZSk6ZisiICIrZX19KSxwKGZ1bmN0aW9uKCl7cC5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChwLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcC5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7aWYoYilyZXR1cm4gYkgoYSwibWFyZ2luUmlnaHQiKX0pfX0pLCFwLnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmcC5mbi5wb3NpdGlvbiYmcC5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7cC5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyl7aWYoYyl7dmFyIGQ9YkgoYSxiKTtyZXR1cm4gYlAudGVzdChkKT9wKGEpLnBvc2l0aW9uKClbYl0rInB4IjpkfX19fSl9KSxwLmV4cHImJnAuZXhwci5maWx0ZXJzJiYocC5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBhLm9mZnNldFdpZHRoPT09MCYmYS5vZmZzZXRIZWlnaHQ9PT0wfHwhcC5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8YkgoYSwiZGlzcGxheSIpKT09PSJub25lIn0scC5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hcC5leHByLmZpbHRlcnMuaGlkZGVuKGEpfSkscC5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtwLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXt2YXIgZCxlPXR5cGVvZiBjPT0ic3RyaW5nIj9jLnNwbGl0KCIgIik6W2NdLGY9e307Zm9yKGQ9MDtkPDQ7ZCsrKWZbYStiVVtkXStiXT1lW2RdfHxlW2QtMl18fGVbMF07cmV0dXJuIGZ9fSxiTi50ZXN0KGEpfHwocC5jc3NIb29rc1thK2JdLnNldD1iJCl9KTt2YXIgY2M9LyUyMC9nLGNkPS9cW1xdJC8sY2U9L1xyP1xuL2csY2Y9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGNnPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pO3AuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP3AubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Y2cudGVzdCh0aGlzLm5vZGVOYW1lKXx8Y2YudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPXAodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpwLmlzQXJyYXkoYyk/cC5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoY2UsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGNlLCJcclxuIil9fSkuZ2V0KCl9fSkscC5wYXJhbT1mdW5jdGlvbihhLGMpe3ZhciBkLGU9W10sZj1mdW5jdGlvbihhLGIpe2I9cC5pc0Z1bmN0aW9uKGIpP2IoKTpiPT1udWxsPyIiOmIsZVtlLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1wLmFqYXhTZXR0aW5ncyYmcC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKHAuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFwLmlzUGxhaW5PYmplY3QoYSkpcC5lYWNoKGEsZnVuY3Rpb24oKXtmKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGQgaW4gYSljaChkLGFbZF0sYyxmKTtyZXR1cm4gZS5qb2luKCImIikucmVwbGFjZShjYywiKyIpfTt2YXIgY2ksY2osY2s9LyMuKiQvLGNsPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsY209L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxjbj0vXig/OkdFVHxIRUFEKSQvLGNvPS9eXC9cLy8sY3A9L1w/LyxjcT0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxjcj0vKFs/Jl0pXz1bXiZdKi8sY3M9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLGN0PXAuZm4ubG9hZCxjdT17fSxjdj17fSxjdz1bIiovIl0rWyIqIl07dHJ5e2NpPWYuaHJlZn1jYXRjaChjeCl7Y2k9ZS5jcmVhdGVFbGVtZW50KCJhIiksY2kuaHJlZj0iIixjaT1jaS5ocmVmfWNqPWNzLmV4ZWMoY2kudG9Mb3dlckNhc2UoKSl8fFtdLHAuZm4ubG9hZD1mdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZjdClyZXR1cm4gY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZSxmLGcsaD10aGlzLGk9YS5pbmRleE9mKCIgIik7cmV0dXJuIGk+PTAmJihlPWEuc2xpY2UoaSxhLmxlbmd0aCksYT1hLnNsaWNlKDAsaSkpLHAuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoZj0iUE9TVCIpLHAuYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmMsY29tcGxldGU6ZnVuY3Rpb24oYSxiKXtkJiZoLmVhY2goZCxnfHxbYS5yZXNwb25zZVRleHQsYixhXSl9fSkuZG9uZShmdW5jdGlvbihhKXtnPWFyZ3VtZW50cyxoLmh0bWwoZT9wKCI8ZGl2PiIpLmFwcGVuZChhLnJlcGxhY2UoY3EsIiIpKS5maW5kKGUpOmEpfSksdGhpc30scC5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3AuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxwLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtwW2NdPWZ1bmN0aW9uKGEsZCxlLGYpe3JldHVybiBwLmlzRnVuY3Rpb24oZCkmJihmPWZ8fGUsZT1kLGQ9YikscC5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpmfSl9fSkscC5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBwLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBwLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9jQShhLHAuYWpheFNldHRpbmdzKTooYj1hLGE9cC5hamF4U2V0dGluZ3MpLGNBKGEsYiksYX0sYWpheFNldHRpbmdzOnt1cmw6Y2ksaXNMb2NhbDpjbS50ZXN0KGNqWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Y3d9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpwLnBhcnNlSlNPTiwidGV4dCB4bWwiOnAucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Y3koY3UpLGFqYXhUcmFuc3BvcnQ6Y3koY3YpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB5KGEsYyxmLGkpe3ZhciBrLHMsdCx1LHcseT1jO2lmKHY9PT0yKXJldHVybjt2PTIsaCYmY2xlYXJUaW1lb3V0KGgpLGc9YixlPWl8fCIiLHgucmVhZHlTdGF0ZT1hPjA/NDowLGYmJih1PWNCKGwseCxmKSk7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNClsLmlmTW9kaWZpZWQmJih3PXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYocC5sYXN0TW9kaWZpZWRbZF09dyksdz14LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIiksdyYmKHAuZXRhZ1tkXT13KSksYT09PTMwND8oeT0ibm90bW9kaWZpZWQiLGs9ITApOihrPWNDKGwsdSkseT1rLnN0YXRlLHM9ay5kYXRhLHQ9ay5lcnJvcixrPSF0KTtlbHNle3Q9eTtpZigheXx8YSl5PSJlcnJvciIsYTwwJiYoYT0wKX14LnN0YXR1cz1hLHguc3RhdHVzVGV4dD0iIisoY3x8eSksaz9vLnJlc29sdmVXaXRoKG0sW3MseSx4XSk6by5yZWplY3RXaXRoKG0sW3gseSx0XSkseC5zdGF0dXNDb2RlKHIpLHI9YixqJiZuLnRyaWdnZXIoImFqYXgiKyhrPyJTdWNjZXNzIjoiRXJyb3IiKSxbeCxsLGs/czp0XSkscS5maXJlV2l0aChtLFt4LHldKSxqJiYobi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LGxdKSwtLXAuYWN0aXZlfHxwLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfXR5cGVvZiBhPT0ib2JqZWN0IiYmKGM9YSxhPWIpLGM9Y3x8e307dmFyIGQsZSxmLGcsaCxpLGosayxsPXAuYWpheFNldHVwKHt9LGMpLG09bC5jb250ZXh0fHxsLG49bSE9PWwmJihtLm5vZGVUeXBlfHxtIGluc3RhbmNlb2YgcCk/cChtKTpwLmV2ZW50LG89cC5EZWZlcnJlZCgpLHE9cC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHQ9e30sdT17fSx2PTAsdz0iY2FuY2VsZWQiLHg9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXYpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPXVbY109dVtjXXx8YSx0W2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiB2PT09Mj9lOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHY9PT0yKXtpZighZil7Zj17fTt3aGlsZShjPWNsLmV4ZWMoZSkpZltjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1mW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdnx8KGwubWltZVR5cGU9YSksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YXx8dyxnJiZnLmFib3J0KGEpLHkoMCxhKSx0aGlzfX07by5wcm9taXNlKHgpLHguc3VjY2Vzcz14LmRvbmUseC5lcnJvcj14LmZhaWwseC5jb21wbGV0ZT1xLmFkZCx4LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYodjwyKWZvcihiIGluIGEpcltiXT1bcltiXSxhW2JdXTtlbHNlIGI9YVt4LnN0YXR1c10seC5hbHdheXMoYil9cmV0dXJuIHRoaXN9LGwudXJsPSgoYXx8bC51cmwpKyIiKS5yZXBsYWNlKGNrLCIiKS5yZXBsYWNlKGNvLGNqWzFdKyIvLyIpLGwuZGF0YVR5cGVzPXAudHJpbShsLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQocyksbC5jcm9zc0RvbWFpbj09bnVsbCYmKGk9Y3MuZXhlYyhsLnVybC50b0xvd2VyQ2FzZSgpKSxsLmNyb3NzRG9tYWluPSEoIWl8fGlbMV09PWNqWzFdJiZpWzJdPT1jalsyXSYmKGlbM118fChpWzFdPT09Imh0dHA6Ij84MDo0NDMpKT09KGNqWzNdfHwoY2pbMV09PT0iaHR0cDoiPzgwOjQ0MykpKSksbC5kYXRhJiZsLnByb2Nlc3NEYXRhJiZ0eXBlb2YgbC5kYXRhIT0ic3RyaW5nIiYmKGwuZGF0YT1wLnBhcmFtKGwuZGF0YSxsLnRyYWRpdGlvbmFsKSksY3ooY3UsbCxjLHgpO2lmKHY9PT0yKXJldHVybiB4O2o9bC5nbG9iYWwsbC50eXBlPWwudHlwZS50b1VwcGVyQ2FzZSgpLGwuaGFzQ29udGVudD0hY24udGVzdChsLnR5cGUpLGomJnAuYWN0aXZlKys9PT0wJiZwLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFsLmhhc0NvbnRlbnQpe2wuZGF0YSYmKGwudXJsKz0oY3AudGVzdChsLnVybCk/IiYiOiI/IikrbC5kYXRhLGRlbGV0ZSBsLmRhdGEpLGQ9bC51cmw7aWYobC5jYWNoZT09PSExKXt2YXIgej1wLm5vdygpLEE9bC51cmwucmVwbGFjZShjciwiJDFfPSIreik7bC51cmw9QSsoQT09PWwudXJsPyhjcC50ZXN0KGwudXJsKT8iJiI6Ij8iKSsiXz0iK3o6IiIpfX0obC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnguc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSxsLmlmTW9kaWZpZWQmJihkPWR8fGwudXJsLHAubGFzdE1vZGlmaWVkW2RdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixwLmxhc3RNb2RpZmllZFtkXSkscC5ldGFnW2RdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLHAuZXRhZ1tkXSkpLHguc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixsLmRhdGFUeXBlc1swXSYmbC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXT9sLmFjY2VwdHNbbC5kYXRhVHlwZXNbMF1dKyhsLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK2N3KyI7IHE9MC4wMSI6IiIpOmwuYWNjZXB0c1siKiJdKTtmb3IoayBpbiBsLmhlYWRlcnMpeC5zZXRSZXF1ZXN0SGVhZGVyKGssbC5oZWFkZXJzW2tdKTtpZighbC5iZWZvcmVTZW5kfHxsLmJlZm9yZVNlbmQuY2FsbChtLHgsbCkhPT0hMSYmdiE9PTIpe3c9ImFib3J0Ijtmb3IoayBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl4W2tdKGxba10pO2c9Y3ooY3YsbCxjLHgpO2lmKCFnKXkoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7eC5yZWFkeVN0YXRlPTEsaiYmbi50cmlnZ2VyKCJhamF4U2VuZCIsW3gsbF0pLGwuYXN5bmMmJmwudGltZW91dD4wJiYoaD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eC5hYm9ydCgidGltZW91dCIpfSxsLnRpbWVvdXQpKTt0cnl7dj0xLGcuc2VuZCh0LHkpfWNhdGNoKEIpe2lmKHY8Mil5KC0xLEIpO2Vsc2UgdGhyb3cgQn19cmV0dXJuIHh9cmV0dXJuIHguYWJvcnQoKX0sYWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY0Q9W10sY0U9L1w/LyxjRj0vKD0pXD8oPz0mfCQpfFw/XD8vLGNHPXAubm93KCk7cC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPWNELnBvcCgpfHxwLmV4cGFuZG8rIl8iK2NHKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxwLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGMsZCxlKXt2YXIgZixnLGgsaT1jLmRhdGEsaj1jLnVybCxrPWMuanNvbnAhPT0hMSxsPWsmJmNGLnRlc3QoaiksbT1rJiYhbCYmdHlwZW9mIGk9PSJzdHJpbmciJiYhKGMuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmY0YudGVzdChpKTtpZihjLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGx8fG0pcmV0dXJuIGY9Yy5qc29ucENhbGxiYWNrPXAuaXNGdW5jdGlvbihjLmpzb25wQ2FsbGJhY2spP2MuanNvbnBDYWxsYmFjaygpOmMuanNvbnBDYWxsYmFjayxnPWFbZl0sbD9jLnVybD1qLnJlcGxhY2UoY0YsIiQxIitmKTptP2MuZGF0YT1pLnJlcGxhY2UoY0YsIiQxIitmKTprJiYoYy51cmwrPShjRS50ZXN0KGopPyImIjoiPyIpK2MuanNvbnArIj0iK2YpLGMuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBofHxwLmVycm9yKGYrIiB3YXMgbm90IGNhbGxlZCIpLGhbMF19LGMuZGF0YVR5cGVzWzBdPSJqc29uIixhW2ZdPWZ1bmN0aW9uKCl7aD1hcmd1bWVudHN9LGUuYWx3YXlzKGZ1bmN0aW9uKCl7YVtmXT1nLGNbZl0mJihjLmpzb25wQ2FsbGJhY2s9ZC5qc29ucENhbGxiYWNrLGNELnB1c2goZikpLGgmJnAuaXNGdW5jdGlvbihnKSYmZyhoWzBdKSxoPWc9Yn0pLCJzY3JpcHQifSkscC5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBwLmdsb2JhbEV2YWwoYSksYX19fSkscC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxwLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGMsZD1lLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtjPWUuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYy5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGMuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGMuc3JjPWEudXJsLGMub25sb2FkPWMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsZSl7aWYoZXx8IWMucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChjLnJlYWR5U3RhdGUpKWMub25sb2FkPWMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZCYmYy5wYXJlbnROb2RlJiZkLnJlbW92ZUNoaWxkKGMpLGM9YixlfHxnKDIwMCwic3VjY2VzcyIpfSxkLmluc2VydEJlZm9yZShjLGQuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7YyYmYy5vbmxvYWQoMCwxKX19fX0pO3ZhciBjSCxjST1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY0gpY0hbYV0oMCwxKX06ITEsY0o9MDtwLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY0soKXx8Y0woKX06Y0ssZnVuY3Rpb24oYSl7cC5leHRlbmQocC5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KHAuYWpheFNldHRpbmdzLnhocigpKSxwLnN1cHBvcnQuYWpheCYmcC5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxwLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXt2YXIgZyxoLGk9Yy54aHIoKTtjLnVzZXJuYW1lP2kub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmkub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGggaW4gYy54aHJGaWVsZHMpaVtoXT1jLnhockZpZWxkc1toXTtjLm1pbWVUeXBlJiZpLm92ZXJyaWRlTWltZVR5cGUmJmkub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGggaW4gZSlpLnNldFJlcXVlc3RIZWFkZXIoaCxlW2hdKX1jYXRjaChqKXt9aS5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGgsaixrLGwsbTt0cnl7aWYoZCYmKGV8fGkucmVhZHlTdGF0ZT09PTQpKXtkPWIsZyYmKGkub25yZWFkeXN0YXRlY2hhbmdlPXAubm9vcCxjSSYmZGVsZXRlIGNIW2ddKTtpZihlKWkucmVhZHlTdGF0ZSE9PTQmJmkuYWJvcnQoKTtlbHNle2g9aS5zdGF0dXMsaz1pLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGw9e30sbT1pLnJlc3BvbnNlWE1MLG0mJm0uZG9jdW1lbnRFbGVtZW50JiYobC54bWw9bSk7dHJ5e2wudGV4dD1pLnJlc3BvbnNlVGV4dH1jYXRjaChhKXt9dHJ5e2o9aS5zdGF0dXNUZXh0fWNhdGNoKG4pe2o9IiJ9IWgmJmMuaXNMb2NhbCYmIWMuY3Jvc3NEb21haW4/aD1sLnRleHQ/MjAwOjQwNDpoPT09MTIyMyYmKGg9MjA0KX19fWNhdGNoKG8pe2V8fGYoLTEsbyl9bCYmZihoLGosbCxrKX0sYy5hc3luYz9pLnJlYWR5U3RhdGU9PT00P3NldFRpbWVvdXQoZCwwKTooZz0rK2NKLGNJJiYoY0h8fChjSD17fSxwKGEpLnVubG9hZChjSSkpLGNIW2ddPWQpLGkub25yZWFkeXN0YXRlY2hhbmdlPWQpOmQoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY00sY04sY089L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNQPW5ldyBSZWdFeHAoIl4oPzooWy0rXSk9fCkoIitxKyIpKFthLXolXSopJCIsImkiKSxjUT0vcXVldWVIb29rcyQvLGNSPVtjWF0sY1M9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZz1jUC5leGVjKGIpLGg9Zi5jdXIoKSxpPStofHwwLGo9MTtpZihnKXtjPStnWzJdLGQ9Z1szXXx8KHAuY3NzTnVtYmVyW2FdPyIiOiJweCIpO2lmKGQhPT0icHgiJiZpKXtpPXAuY3NzKGYuZWxlbSxhLCEwKXx8Y3x8MTtkbyBlPWo9anx8Ii41IixpPWkvaixwLnN0eWxlKGYuZWxlbSxhLGkrZCksaj1mLmN1cigpL2g7d2hpbGUoaiE9PTEmJmohPT1lKX1mLnVuaXQ9ZCxmLnN0YXJ0PWksZi5lbmQ9Z1sxXT9pKyhnWzFdKzEpKmM6Y31yZXR1cm4gZn1dfTtwLkFuaW1hdGlvbj1wLmV4dGVuZChjVix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe3AuaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO3ZhciBjLGQ9MCxlPWEubGVuZ3RoO2Zvcig7ZDxlO2QrKyljPWFbZF0sY1NbY109Y1NbY118fFtdLGNTW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/Y1IudW5zaGlmdChhKTpjUi5wdXNoKGEpfX0pLHAuVHdlZW49Y1ksY1kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjWSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwocC5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWNZLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpjWS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1jWS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9Yj1wLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpjWS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxjWS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9Y1kucHJvdG90eXBlLGNZLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYS5lbGVtW2EucHJvcF09PW51bGx8fCEhYS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD8oYj1wLmNzcyhhLmVsZW0sYS5wcm9wLCExLCIiKSwhYnx8Yj09PSJhdXRvIj8wOmIpOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7cC5meC5zdGVwW2EucHJvcF0/cC5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYoYS5lbGVtLnN0eWxlW3AuY3NzUHJvcHNbYS5wcm9wXV0hPW51bGx8fHAuY3NzSG9va3NbYS5wcm9wXSk/cC5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sY1kucHJvcEhvb2tzLnNjcm9sbFRvcD1jWS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxwLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9cC5mbltiXTtwLmZuW2JdPWZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gZD09bnVsbHx8dHlwZW9mIGQ9PSJib29sZWFuInx8IWEmJnAuaXNGdW5jdGlvbihkKSYmcC5pc0Z1bmN0aW9uKGUpP2MuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShjWihiLCEwKSxkLGUsZil9fSkscC5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoYlkpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXAuaXNFbXB0eU9iamVjdChhKSxmPXAuc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1jVih0aGlzLHAuZXh0ZW5kKHt9LGEpLGYpO2UmJmIuc3RvcCghMCl9O3JldHVybiBlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihkKX07cmV0dXJuIHR5cGVvZiBhIT0ic3RyaW5nIiYmKGQ9YyxjPWEsYT1iKSxjJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsYz1hIT1udWxsJiZhKyJxdWV1ZUhvb2tzIixmPXAudGltZXJzLGc9cC5fZGF0YSh0aGlzKTtpZihjKWdbY10mJmdbY10uc3RvcCYmZShnW2NdKTtlbHNlIGZvcihjIGluIGcpZ1tjXSYmZ1tjXS5zdG9wJiZjUS50ZXN0KGMpJiZlKGdbY10pO2ZvcihjPWYubGVuZ3RoO2MtLTspZltjXS5lbGVtPT09dGhpcyYmKGE9PW51bGx8fGZbY10ucXVldWU9PT1hKSYmKGZbY10uYW5pbS5zdG9wKGQpLGI9ITEsZi5zcGxpY2UoYywxKSk7KGJ8fCFkKSYmcC5kZXF1ZXVlKHRoaXMsYSl9KX19KSxwLmVhY2goe3NsaWRlRG93bjpjWigic2hvdyIpLHNsaWRlVXA6Y1ooImhpZGUiKSxzbGlkZVRvZ2dsZTpjWigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe3AuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSkscC5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP3AuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8cC5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFwLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249cC5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIHAuZnguc3BlZWRzP3AuZnguc3BlZWRzW2QuZHVyYXRpb25dOnAuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7cmV0dXJuIGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe3AuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmcC5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LHAuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi41LU1hdGguY29zKGEqTWF0aC5QSSkvMn19LHAudGltZXJzPVtdLHAuZng9Y1kucHJvdG90eXBlLmluaXQscC5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1wLnRpbWVycyxjPTA7Zm9yKDtjPGIubGVuZ3RoO2MrKylhPWJbY10sIWEoKSYmYltjXT09PWEmJmIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8cC5meC5zdG9wKCl9LHAuZngudGltZXI9ZnVuY3Rpb24oYSl7YSgpJiZwLnRpbWVycy5wdXNoKGEpJiYhY04mJihjTj1zZXRJbnRlcnZhbChwLmZ4LnRpY2sscC5meC5pbnRlcnZhbCkpfSxwLmZ4LmludGVydmFsPTEzLHAuZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY04pLGNOPW51bGx9LHAuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHAuZnguc3RlcD17fSxwLmV4cHImJnAuZXhwci5maWx0ZXJzJiYocC5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHAuZ3JlcChwLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBjJD0vXig/OmJvZHl8aHRtbCkkL2k7cC5mbi5vZmZzZXQ9ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYT09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oYil7cC5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO3ZhciBjLGQsZSxmLGcsaCxpLGosayxsLG09dGhpc1swXSxuPW0mJm0ub3duZXJEb2N1bWVudDtpZighbilyZXR1cm47cmV0dXJuKGU9bi5ib2R5KT09PW0/cC5vZmZzZXQuYm9keU9mZnNldChtKTooZD1uLmRvY3VtZW50RWxlbWVudCxwLmNvbnRhaW5zKGQsbSk/KGM9bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPWNfKG4pLGc9ZC5jbGllbnRUb3B8fGUuY2xpZW50VG9wfHwwLGg9ZC5jbGllbnRMZWZ0fHxlLmNsaWVudExlZnR8fDAsaT1mLnBhZ2VZT2Zmc2V0fHxkLnNjcm9sbFRvcCxqPWYucGFnZVhPZmZzZXR8fGQuc2Nyb2xsTGVmdCxrPWMudG9wK2ktZyxsPWMubGVmdCtqLWgse3RvcDprLGxlZnQ6bH0pOnt0b3A6MCxsZWZ0OjB9KX0scC5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRUb3AsYz1hLm9mZnNldExlZnQ7cmV0dXJuIHAuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCkse3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9cC5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPXAoYSksZj1lLm9mZnNldCgpLGc9cC5jc3MoYSwidG9wIiksaD1wLmNzcyhhLCJsZWZ0IiksaT0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmcC5pbkFycmF5KCJhdXRvIixbZyxoXSk+LTEsaj17fSxrPXt9LGwsbTtpPyhrPWUucG9zaXRpb24oKSxsPWsudG9wLG09ay5sZWZ0KToobD1wYXJzZUZsb2F0KGcpfHwwLG09cGFyc2VGbG9hdChoKXx8MCkscC5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGYpKSxiLnRvcCE9bnVsbCYmKGoudG9wPWIudG9wLWYudG9wK2wpLGIubGVmdCE9bnVsbCYmKGoubGVmdD1iLmxlZnQtZi5sZWZ0K20pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGopOmUuY3NzKGopfX0scC5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWMkLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtyZXR1cm4gYy50b3AtPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMubGVmdC09cGFyc2VGbG9hdChwLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwLGQudG9wKz1wYXJzZUZsb2F0KHAuY3NzKGJbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLGQubGVmdCs9cGFyc2VGbG9hdChwLmNzcyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDAse3RvcDpjLnRvcC1kLnRvcCxsZWZ0OmMubGVmdC1kLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8ZS5ib2R5O3doaWxlKGEmJiFjJC50ZXN0KGEubm9kZU5hbWUpJiZwLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyIpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8ZS5ib2R5fSl9fSkscC5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L1kvLnRlc3QoYyk7cC5mblthXT1mdW5jdGlvbihlKXtyZXR1cm4gcC5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGUsZil7dmFyIGc9Y18oYSk7aWYoZj09PWIpcmV0dXJuIGc/YyBpbiBnP2dbY106Zy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV06YVtlXTtnP2cuc2Nyb2xsVG8oZD9wKGcpLnNjcm9sbExlZnQoKTpmLGQ/ZjpwKGcpLnNjcm9sbFRvcCgpKTphW2VdPWZ9LGEsZSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLHAuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEsYyl7cC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OmMsIiI6Im91dGVyIithfSxmdW5jdGlvbihkLGUpe3AuZm5bZV09ZnVuY3Rpb24oZSxmKXt2YXIgZz1hcmd1bWVudHMubGVuZ3RoJiYoZHx8dHlwZW9mIGUhPSJib29sZWFuIiksaD1kfHwoZT09PSEwfHxmPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMsZCxlKXt2YXIgZjtyZXR1cm4gcC5pc1dpbmRvdyhjKT9jLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTpjLm5vZGVUeXBlPT09OT8oZj1jLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChjLmJvZHlbInNjcm9sbCIrYV0sZlsic2Nyb2xsIithXSxjLmJvZHlbIm9mZnNldCIrYV0sZlsib2Zmc2V0IithXSxmWyJjbGllbnQiK2FdKSk6ZT09PWI/cC5jc3MoYyxkLGUsaCk6cC5zdHlsZShjLGQsZSxoKX0sYyxnP2U6YixnKX19KX0pLGEualF1ZXJ5PWEuJD1wLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZS5hbWQualF1ZXJ5JiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gcH0pfSkod2luZG93KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS5iYS1iYnEubWluLmpzIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvanF1ZXJ5LmJhLWJicS5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjZGI2NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS5iYS1iYnEubWluLmpzCkBAIC0wLDAgKzEsMzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIGpRdWVyeSBCQlE6IEJhY2sgQnV0dG9uICYgUXVlcnkgTGlicmFyeSAtIHYxLjIuMSAtIDIvMTcvMjAxMAorICogaHR0cDovL2JlbmFsbWFuLmNvbS9wcm9qZWN0cy9qcXVlcnktYmJxLXBsdWdpbi8KKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDEwICJDb3dib3kiIEJlbiBBbG1hbgorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCisgKiBodHRwOi8vYmVuYWxtYW4uY29tL2Fib3V0L2xpY2Vuc2UvCisgKi8KKyhmdW5jdGlvbigkLHApe3ZhciBpLG09QXJyYXkucHJvdG90eXBlLnNsaWNlLHI9ZGVjb2RlVVJJQ29tcG9uZW50LGE9JC5wYXJhbSxjLGwsdixiPSQuYmJxPSQuYmJxfHx7fSxxLHUsaixlPSQuZXZlbnQuc3BlY2lhbCxkPSJoYXNoY2hhbmdlIixBPSJxdWVyeXN0cmluZyIsRD0iZnJhZ21lbnQiLHk9ImVsZW1VcmxBdHRyIixnPSJsb2NhdGlvbiIsaz0iaHJlZiIsdD0ic3JjIix4PS9eLipcP3wjLiokL2csdz0vXi4qXCMvLGgsQz17fTtmdW5jdGlvbiBFKEYpe3JldHVybiB0eXBlb2YgRj09PSJzdHJpbmcifWZ1bmN0aW9uIEIoRyl7dmFyIEY9bS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRy5hcHBseSh0aGlzLEYuY29uY2F0KG0uY2FsbChhcmd1bWVudHMpKSl9fWZ1bmN0aW9uIG4oRil7cmV0dXJuIEYucmVwbGFjZSgvXlteI10qIz8oLiopJC8sIiQxIil9ZnVuY3Rpb24gbyhGKXtyZXR1cm4gRi5yZXBsYWNlKC8oPzpeW14/I10qXD8oW14jXSopLiokKT8uKi8sIiQxIil9ZnVuY3Rpb24gZihILE0sRixJLEcpe3ZhciBPLEwsSyxOLEo7aWYoSSE9PWkpe0s9Ri5tYXRjaChIPy9eKFteI10qKVwjPyguKikkLzovXihbXiM/XSopXD8/KFteI10qKSgjPy4qKS8pO0o9S1szXXx8IiI7aWYoRz09PTImJkUoSSkpe0w9SS5yZXBsYWNlKEg/dzp4LCIiKX1lbHNle049bChLWzJdKTtJPUUoSSk/bFtIP0Q6QV0oSSk6STtMPUc9PT0yP0k6Rz09PTE/JC5leHRlbmQoe30sSSxOKTokLmV4dGVuZCh7fSxOLEkpO0w9YShMKTtpZihIKXtMPUwucmVwbGFjZShoLHIpfX1PPUtbMV0rKEg/IiMiOkx8fCFLWzFdPyI/IjoiIikrTCtKfWVsc2V7Tz1NKEYhPT1pP0Y6cFtnXVtrXSl9cmV0dXJuIE99YVtBXT1CKGYsMCxvKTthW0RdPWM9QihmLDEsbik7Yy5ub0VzY2FwZT1mdW5jdGlvbihHKXtHPUd8fCIiO3ZhciBGPSQubWFwKEcuc3BsaXQoIiIpLGVuY29kZVVSSUNvbXBvbmVudCk7aD1uZXcgUmVnRXhwKEYuam9pbigifCIpLCJnIil9O2Mubm9Fc2NhcGUoIiwvIik7JC5kZXBhcmFtPWw9ZnVuY3Rpb24oSSxGKXt2YXIgSD17fSxHPXsidHJ1ZSI6ITAsImZhbHNlIjohMSwibnVsbCI6bnVsbH07JC5lYWNoKEkucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCImIiksZnVuY3Rpb24oTCxRKXt2YXIgSz1RLnNwbGl0KCI9IiksUD1yKEtbMF0pLEosTz1ILE09MCxSPVAuc3BsaXQoIl1bIiksTj1SLmxlbmd0aC0xO2lmKC9cWy8udGVzdChSWzBdKSYmL1xdJC8udGVzdChSW05dKSl7UltOXT1SW05dLnJlcGxhY2UoL1xdJC8sIiIpO1I9Ui5zaGlmdCgpLnNwbGl0KCJbIikuY29uY2F0KFIpO049Ui5sZW5ndGgtMX1lbHNle049MH1pZihLLmxlbmd0aD09PTIpe0o9cihLWzFdKTtpZihGKXtKPUomJiFpc05hTihKKT8rSjpKPT09InVuZGVmaW5lZCI/aTpHW0pdIT09aT9HW0pdOkp9aWYoTil7Zm9yKDtNPD1OO00rKyl7UD1SW01dPT09IiI/Ty5sZW5ndGg6UltNXTtPPU9bUF09TTxOP09bUF18fChSW00rMV0mJmlzTmFOKFJbTSsxXSk/e306W10pOkp9fWVsc2V7aWYoJC5pc0FycmF5KEhbUF0pKXtIW1BdLnB1c2goSil9ZWxzZXtpZihIW1BdIT09aSl7SFtQXT1bSFtQXSxKXX1lbHNle0hbUF09Sn19fX1lbHNle2lmKFApe0hbUF09Rj9pOiIifX19KTtyZXR1cm4gSH07ZnVuY3Rpb24geihILEYsRyl7aWYoRj09PWl8fHR5cGVvZiBGPT09ImJvb2xlYW4iKXtHPUY7Rj1hW0g/RDpBXSgpfWVsc2V7Rj1FKEYpP0YucmVwbGFjZShIP3c6eCwiIik6Rn1yZXR1cm4gbChGLEcpfWxbQV09Qih6LDApO2xbRF09dj1CKHosMSk7JFt5XXx8KCRbeV09ZnVuY3Rpb24oRil7cmV0dXJuICQuZXh0ZW5kKEMsRil9KSh7YTprLGJhc2U6ayxpZnJhbWU6dCxpbWc6dCxpbnB1dDp0LGZvcm06ImFjdGlvbiIsbGluazprLHNjcmlwdDp0fSk7aj0kW3ldO2Z1bmN0aW9uIHMoSSxHLEgsRil7aWYoIUUoSCkmJnR5cGVvZiBIIT09Im9iamVjdCIpe0Y9SDtIPUc7Rz1pfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgTD0kKHRoaXMpLEo9R3x8aigpWyh0aGlzLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKV18fCIiLEs9SiYmTC5hdHRyKEopfHwiIjtMLmF0dHIoSixhW0ldKEssSCxGKSl9KX0kLmZuW0FdPUIocyxBKTskLmZuW0RdPUIocyxEKTtiLnB1c2hTdGF0ZT1xPWZ1bmN0aW9uKEksRil7aWYoRShJKSYmL14jLy50ZXN0KEkpJiZGPT09aSl7Rj0yfXZhciBIPUkhPT1pLEc9YyhwW2ddW2tdLEg/STp7fSxIP0Y6Mik7cFtnXVtrXT1HKygvIy8udGVzdChHKT8iIjoiIyIpfTtiLmdldFN0YXRlPXU9ZnVuY3Rpb24oRixHKXtyZXR1cm4gRj09PWl8fHR5cGVvZiBGPT09ImJvb2xlYW4iP3YoRik6dihHKVtGXX07Yi5yZW1vdmVTdGF0ZT1mdW5jdGlvbihGKXt2YXIgRz17fTtpZihGIT09aSl7Rz11KCk7JC5lYWNoKCQuaXNBcnJheShGKT9GOmFyZ3VtZW50cyxmdW5jdGlvbihJLEgpe2RlbGV0ZSBHW0hdfSl9cShHLDIpfTtlW2RdPSQuZXh0ZW5kKGVbZF0se2FkZDpmdW5jdGlvbihGKXt2YXIgSDtmdW5jdGlvbiBHKEope3ZhciBJPUpbRF09YygpO0ouZ2V0U3RhdGU9ZnVuY3Rpb24oSyxMKXtyZXR1cm4gSz09PWl8fHR5cGVvZiBLPT09ImJvb2xlYW4iP2woSSxLKTpsKEksTClbS119O0guYXBwbHkodGhpcyxhcmd1bWVudHMpfWlmKCQuaXNGdW5jdGlvbihGKSl7SD1GO3JldHVybiBHfWVsc2V7SD1GLmhhbmRsZXI7Ri5oYW5kbGVyPUd9fX0pfSkoalF1ZXJ5LHRoaXMpOworLyoKKyAqIGpRdWVyeSBoYXNoY2hhbmdlIGV2ZW50IC0gdjEuMiAtIDIvMTEvMjAxMAorICogaHR0cDovL2JlbmFsbWFuLmNvbS9wcm9qZWN0cy9qcXVlcnktaGFzaGNoYW5nZS1wbHVnaW4vCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAxMCAiQ293Ym95IiBCZW4gQWxtYW4KKyAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLgorICogaHR0cDovL2JlbmFsbWFuLmNvbS9hYm91dC9saWNlbnNlLworICovCisoZnVuY3Rpb24oJCxpLGIpe3ZhciBqLGs9JC5ldmVudC5zcGVjaWFsLGM9ImxvY2F0aW9uIixkPSJoYXNoY2hhbmdlIixsPSJocmVmIixmPSQuYnJvd3NlcixnPWRvY3VtZW50LmRvY3VtZW50TW9kZSxoPWYubXNpZSYmKGc9PT1ifHxnPDgpLGU9Im9uIitkIGluIGkmJiFoO2Z1bmN0aW9uIGEobSl7bT1tfHxpW2NdW2xdO3JldHVybiBtLnJlcGxhY2UoL15bXiNdKiM/KC4qKSQvLCIkMSIpfSRbZCsiRGVsYXkiXT0xMDA7a1tkXT0kLmV4dGVuZChrW2RdLHtzZXR1cDpmdW5jdGlvbigpe2lmKGUpe3JldHVybiBmYWxzZX0kKGouc3RhcnQpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGUpe3JldHVybiBmYWxzZX0kKGouc3RvcCl9fSk7aj0oZnVuY3Rpb24oKXt2YXIgbT17fSxyLG4sbyxxO2Z1bmN0aW9uIHAoKXtvPXE9ZnVuY3Rpb24ocyl7cmV0dXJuIHN9O2lmKGgpe249JCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6MCIvPicpLmhpZGUoKS5pbnNlcnRBZnRlcigiYm9keSIpWzBdLmNvbnRlbnRXaW5kb3c7cT1mdW5jdGlvbigpe3JldHVybiBhKG4uZG9jdW1lbnRbY11bbF0pfTtvPWZ1bmN0aW9uKHUscyl7aWYodSE9PXMpe3ZhciB0PW4uZG9jdW1lbnQ7dC5vcGVuKCkuY2xvc2UoKTt0W2NdLmhhc2g9IiMiK3V9fTtvKGEoKSl9fW0uc3RhcnQ9ZnVuY3Rpb24oKXtpZihyKXtyZXR1cm59dmFyIHQ9YSgpO298fHAoKTsoZnVuY3Rpb24gcygpe3ZhciB2PWEoKSx1PXEodCk7aWYodiE9PXQpe28odD12LHUpOyQoaSkudHJpZ2dlcihkKX1lbHNle2lmKHUhPT10KXtpW2NdW2xdPWlbY11bbF0ucmVwbGFjZSgvIy4qLywiIikrIiMiK3V9fXI9c2V0VGltZW91dChzLCRbZCsiRGVsYXkiXSl9KSgpfTttLnN0b3A9ZnVuY3Rpb24oKXtpZighbil7ciYmY2xlYXJUaW1lb3V0KHIpO3I9MH19O3JldHVybiBtfSkoKX0pKGpRdWVyeSx0aGlzKTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS5zbGlkZXRvLm1pbi5qcyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS5zbGlkZXRvLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjgwYzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvanF1ZXJ5LnNsaWRldG8ubWluLmpzCkBAIC0wLDAgKzEsMjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworKGZ1bmN0aW9uKGIpe2IuZm4uc2xpZGV0bz1mdW5jdGlvbihhKXthPWIuZXh0ZW5kKHtzbGlkZV9kdXJhdGlvbjoic2xvdyIsaGlnaGxpZ2h0X2R1cmF0aW9uOjNFMyxoaWdobGlnaHQ6dHJ1ZSxoaWdobGlnaHRfY29sb3I6IiNGRkZGOTkifSxhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7b2JqPWIodGhpcyk7YigiYm9keSIpLmFuaW1hdGUoe3Njcm9sbFRvcDpvYmoub2Zmc2V0KCkudG9wfSxhLnNsaWRlX2R1cmF0aW9uLGZ1bmN0aW9uKCl7YS5oaWdobGlnaHQmJmIudWkudmVyc2lvbiYmb2JqLmVmZmVjdCgiaGlnaGxpZ2h0Iix7Y29sb3I6YS5oaWdobGlnaHRfY29sb3J9LGEuaGlnaGxpZ2h0X2R1cmF0aW9uKX0pfSl9fSkoalF1ZXJ5KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS53aWdnbGUubWluLmpzIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvanF1ZXJ5LndpZ2dsZS5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkYjJiMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL2pxdWVyeS53aWdnbGUubWluLmpzCkBAIC0wLDAgKzEsMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKK2pRdWVyeSBXaWdnbGUKK0F1dGhvcjogV29uZGVyR3JvdXAsIEpvcmRhbiBUaG9tYXMKK1VSTDogaHR0cDovL2xhYnMud29uZGVyZ3JvdXAuY29tL2RlbW9zL21pbmktdWkvaW5kZXguaHRtbAorTGljZW5zZTogTUlUIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlKQorKi8KK2pRdWVyeS5mbi53aWdnbGU9ZnVuY3Rpb24obyl7dmFyIGQ9e3NwZWVkOjUwLHdpZ2dsZXM6Myx0cmF2ZWw6NSxjYWxsYmFjazpudWxsfTt2YXIgbz1qUXVlcnkuZXh0ZW5kKGQsbyk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjYWNoZT10aGlzO3ZhciB3cmFwPWpRdWVyeSh0aGlzKS53cmFwKCc8ZGl2IGNsYXNzPSJ3aWdnbGUtd3JhcCI+PC9kaXY+JykuY3NzKCJwb3NpdGlvbiIsInJlbGF0aXZlIik7dmFyIGNhbGxzPTA7Zm9yKGk9MTtpPD1vLndpZ2dsZXM7aSsrKXtqUXVlcnkodGhpcykuYW5pbWF0ZSh7bGVmdDoiLT0iK28udHJhdmVsfSxvLnNwZWVkKS5hbmltYXRlKHtsZWZ0OiIrPSIrby50cmF2ZWwqMn0sby5zcGVlZCoyKS5hbmltYXRlKHtsZWZ0OiItPSIrby50cmF2ZWx9LG8uc3BlZWQsZnVuY3Rpb24oKXtjYWxscysrO2lmKGpRdWVyeShjYWNoZSkucGFyZW50KCkuaGFzQ2xhc3MoJ3dpZ2dsZS13cmFwJykpe2pRdWVyeShjYWNoZSkucGFyZW50KCkucmVwbGFjZVdpdGgoY2FjaGUpO30KK2lmKGNhbGxzPT1vLndpZ2dsZXMmJmpRdWVyeS5pc0Z1bmN0aW9uKG8uY2FsbGJhY2spKXtvLmNhbGxiYWNrKCk7fX0pO319KTt9OwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvbWFya2VkLmpzIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvbWFya2VkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTE4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi9tYXJrZWQuanMKQEAgLTAsMCArMSwxMjkyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qKgorICogbWFya2VkIC0gYSBtYXJrZG93biBwYXJzZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCBDaHJpc3RvcGhlciBKZWZmcmV5LiAoTUlUIExpY2Vuc2VkKQorICogaHR0cHM6Ly9naXRodWIuY29tL2NoamovbWFya2VkCisgKi8KKworOyhmdW5jdGlvbigpIHsKKworLyoqCisgKiBCbG9jay1MZXZlbCBHcmFtbWFyCisgKi8KKwordmFyIGJsb2NrID0geworICBuZXdsaW5lOiAvXlxuKy8sCisgIGNvZGU6IC9eKCB7NH1bXlxuXStcbiopKy8sCisgIGZlbmNlczogbm9vcCwKKyAgaHI6IC9eKCAqWy0qX10pezMsfSAqKD86XG4rfCQpLywKKyAgaGVhZGluZzogL14gKigjezEsNn0pICooW15cbl0rPykgKiMqICooPzpcbit8JCkvLAorICBucHRhYmxlOiBub29wLAorICBsaGVhZGluZzogL14oW15cbl0rKVxuICooPXwtKXsyLH0gKig/OlxuK3wkKS8sCisgIGJsb2NrcXVvdGU6IC9eKCAqPlteXG5dKyhcbig/IWRlZilbXlxuXSspKlxuKikrLywKKyAgbGlzdDogL14oICopKGJ1bGwpIFtcc1xTXSs/KD86aHJ8ZGVmfFxuezIsfSg/ISApKD8hXDFidWxsIClcbip8XHMqJCkvLAorICBodG1sOiAvXiAqKD86Y29tbWVudCAqKD86XG58XHMqJCl8Y2xvc2VkICooPzpcbnsyLH18XHMqJCl8Y2xvc2luZyAqKD86XG57Mix9fFxzKiQpKS8sCisgIGRlZjogL14gKlxbKFteXF1dKylcXTogKjw/KFteXHM+XSspPj8oPzogK1siKF0oW15cbl0rKVsiKV0pPyAqKD86XG4rfCQpLywKKyAgdGFibGU6IG5vb3AsCisgIHBhcmFncmFwaDogL14oKD86W15cbl0rXG4/KD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfHRhZ3xkZWYpKSspXG4qLywKKyAgdGV4dDogL15bXlxuXSsvCit9OworCitibG9jay5idWxsZXQgPSAvKD86WyorLV18XGQrXC4pLzsKK2Jsb2NrLml0ZW0gPSAvXiggKikoYnVsbCkgW15cbl0qKD86XG4oPyFcMWJ1bGwgKVteXG5dKikqLzsKK2Jsb2NrLml0ZW0gPSByZXBsYWNlKGJsb2NrLml0ZW0sICdnbScpCisgICgvYnVsbC9nLCBibG9jay5idWxsZXQpCisgICgpOworCitibG9jay5saXN0ID0gcmVwbGFjZShibG9jay5saXN0KQorICAoL2J1bGwvZywgYmxvY2suYnVsbGV0KQorICAoJ2hyJywgJ1xcbisoPz1cXDE/KD86Wy0qX10gKil7Myx9KD86XFxuK3wkKSknKQorICAoJ2RlZicsICdcXG4rKD89JyArIGJsb2NrLmRlZi5zb3VyY2UgKyAnKScpCisgICgpOworCitibG9jay5ibG9ja3F1b3RlID0gcmVwbGFjZShibG9jay5ibG9ja3F1b3RlKQorICAoJ2RlZicsIGJsb2NrLmRlZikKKyAgKCk7CisKK2Jsb2NrLl90YWcgPSAnKD8hKD86JworICArICdhfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZScKKyAgKyAnfHZhcnxzYW1wfGtiZHxzdWJ8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvJworICArICd8c3Bhbnxicnx3YnJ8aW5zfGRlbHxpbWcpXFxiKVxcdysoPyE6L3xbXlxcd1xcc0BdKkApXFxiJzsKKworYmxvY2suaHRtbCA9IHJlcGxhY2UoYmxvY2suaHRtbCkKKyAgKCdjb21tZW50JywgLzwhLS1bXHNcU10qPy0tPi8pCisgICgnY2xvc2VkJywgLzwodGFnKVtcc1xTXSs/PFwvXDE+LykKKyAgKCdjbG9zaW5nJywgLzx0YWcoPzoiW14iXSoifCdbXiddKid8W14nIj5dKSo/Pi8pCisgICgvdGFnL2csIGJsb2NrLl90YWcpCisgICgpOworCitibG9jay5wYXJhZ3JhcGggPSByZXBsYWNlKGJsb2NrLnBhcmFncmFwaCkKKyAgKCdocicsIGJsb2NrLmhyKQorICAoJ2hlYWRpbmcnLCBibG9jay5oZWFkaW5nKQorICAoJ2xoZWFkaW5nJywgYmxvY2subGhlYWRpbmcpCisgICgnYmxvY2txdW90ZScsIGJsb2NrLmJsb2NrcXVvdGUpCisgICgndGFnJywgJzwnICsgYmxvY2suX3RhZykKKyAgKCdkZWYnLCBibG9jay5kZWYpCisgICgpOworCisvKioKKyAqIE5vcm1hbCBCbG9jayBHcmFtbWFyCisgKi8KKworYmxvY2subm9ybWFsID0gbWVyZ2Uoe30sIGJsb2NrKTsKKworLyoqCisgKiBHRk0gQmxvY2sgR3JhbW1hcgorICovCisKK2Jsb2NrLmdmbSA9IG1lcmdlKHt9LCBibG9jay5ub3JtYWwsIHsKKyAgZmVuY2VzOiAvXiAqKGB7Myx9fH57Myx9KSAqKFxTKyk/ICpcbihbXHNcU10rPylccypcMSAqKD86XG4rfCQpLywKKyAgcGFyYWdyYXBoOiAvXi8KK30pOworCitibG9jay5nZm0ucGFyYWdyYXBoID0gcmVwbGFjZShibG9jay5wYXJhZ3JhcGgpCisgICgnKD8hJywgJyg/IScKKyAgICArIGJsb2NrLmdmbS5mZW5jZXMuc291cmNlLnJlcGxhY2UoJ1xcMScsICdcXDInKSArICd8JworICAgICsgYmxvY2subGlzdC5zb3VyY2UucmVwbGFjZSgnXFwxJywgJ1xcMycpICsgJ3wnKQorICAoKTsKKworLyoqCisgKiBHRk0gKyBUYWJsZXMgQmxvY2sgR3JhbW1hcgorICovCisKK2Jsb2NrLnRhYmxlcyA9IG1lcmdlKHt9LCBibG9jay5nZm0sIHsKKyAgbnB0YWJsZTogL14gKihcUy4qXHwuKilcbiAqKFstOl0rICpcfFstfCA6XSopXG4oKD86LipcfC4qKD86XG58JCkpKilcbiovLAorICB0YWJsZTogL14gKlx8KC4rKVxuICpcfCggKlstOl0rWy18IDpdKilcbigoPzogKlx8LiooPzpcbnwkKSkqKVxuKi8KK30pOworCisvKioKKyAqIEJsb2NrIExleGVyCisgKi8KKworZnVuY3Rpb24gTGV4ZXIob3B0aW9ucykgeworICB0aGlzLnRva2VucyA9IFtdOworICB0aGlzLnRva2Vucy5saW5rcyA9IHt9OworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IG1hcmtlZC5kZWZhdWx0czsKKyAgdGhpcy5ydWxlcyA9IGJsb2NrLm5vcm1hbDsKKworICBpZiAodGhpcy5vcHRpb25zLmdmbSkgeworICAgIGlmICh0aGlzLm9wdGlvbnMudGFibGVzKSB7CisgICAgICB0aGlzLnJ1bGVzID0gYmxvY2sudGFibGVzOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnJ1bGVzID0gYmxvY2suZ2ZtOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEV4cG9zZSBCbG9jayBSdWxlcworICovCisKK0xleGVyLnJ1bGVzID0gYmxvY2s7CisKKy8qKgorICogU3RhdGljIExleCBNZXRob2QKKyAqLworCitMZXhlci5sZXggPSBmdW5jdGlvbihzcmMsIG9wdGlvbnMpIHsKKyAgdmFyIGxleGVyID0gbmV3IExleGVyKG9wdGlvbnMpOworICByZXR1cm4gbGV4ZXIubGV4KHNyYyk7Cit9OworCisvKioKKyAqIFByZXByb2Nlc3NpbmcKKyAqLworCitMZXhlci5wcm90b3R5cGUubGV4ID0gZnVuY3Rpb24oc3JjKSB7CisgIHNyYyA9IHNyYworICAgIC5yZXBsYWNlKC9cclxufFxyL2csICdcbicpCisgICAgLnJlcGxhY2UoL1x0L2csICcgICAgJykKKyAgICAucmVwbGFjZSgvXHUwMGEwL2csICcgJykKKyAgICAucmVwbGFjZSgvXHUyNDI0L2csICdcbicpOworCisgIHJldHVybiB0aGlzLnRva2VuKHNyYywgdHJ1ZSk7Cit9OworCisvKioKKyAqIExleGluZworICovCisKK0xleGVyLnByb3RvdHlwZS50b2tlbiA9IGZ1bmN0aW9uKHNyYywgdG9wLCBicSkgeworICB2YXIgc3JjID0gc3JjLnJlcGxhY2UoL14gKyQvZ20sICcnKQorICAgICwgbmV4dAorICAgICwgbG9vc2UKKyAgICAsIGNhcAorICAgICwgYnVsbAorICAgICwgYgorICAgICwgaXRlbQorICAgICwgc3BhY2UKKyAgICAsIGkKKyAgICAsIGw7CisKKyAgd2hpbGUgKHNyYykgeworICAgIC8vIG5ld2xpbmUKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5uZXdsaW5lLmV4ZWMoc3JjKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIGlmIChjYXBbMF0ubGVuZ3RoID4gMSkgeworICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHsKKyAgICAgICAgICB0eXBlOiAnc3BhY2UnCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvZGUKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5jb2RlLmV4ZWMoc3JjKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIGNhcCA9IGNhcFswXS5yZXBsYWNlKC9eIHs0fS9nbSwgJycpOworICAgICAgdGhpcy50b2tlbnMucHVzaCh7CisgICAgICAgIHR5cGU6ICdjb2RlJywKKyAgICAgICAgdGV4dDogIXRoaXMub3B0aW9ucy5wZWRhbnRpYworICAgICAgICAgID8gY2FwLnJlcGxhY2UoL1xuKyQvLCAnJykKKyAgICAgICAgICA6IGNhcAorICAgICAgfSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBmZW5jZXMgKGdmbSkKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5mZW5jZXMuZXhlYyhzcmMpKSB7CisgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpOworICAgICAgdGhpcy50b2tlbnMucHVzaCh7CisgICAgICAgIHR5cGU6ICdjb2RlJywKKyAgICAgICAgbGFuZzogY2FwWzJdLAorICAgICAgICB0ZXh0OiBjYXBbM10KKyAgICAgIH0pOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gaGVhZGluZworICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLmhlYWRpbmcuZXhlYyhzcmMpKSB7CisgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpOworICAgICAgdGhpcy50b2tlbnMucHVzaCh7CisgICAgICAgIHR5cGU6ICdoZWFkaW5nJywKKyAgICAgICAgZGVwdGg6IGNhcFsxXS5sZW5ndGgsCisgICAgICAgIHRleHQ6IGNhcFsyXQorICAgICAgfSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyB0YWJsZSBubyBsZWFkaW5nIHBpcGUgKGdmbSkKKyAgICBpZiAodG9wICYmIChjYXAgPSB0aGlzLnJ1bGVzLm5wdGFibGUuZXhlYyhzcmMpKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKworICAgICAgaXRlbSA9IHsKKyAgICAgICAgdHlwZTogJ3RhYmxlJywKKyAgICAgICAgaGVhZGVyOiBjYXBbMV0ucmVwbGFjZSgvXiAqfCAqXHwgKiQvZywgJycpLnNwbGl0KC8gKlx8ICovKSwKKyAgICAgICAgYWxpZ246IGNhcFsyXS5yZXBsYWNlKC9eICp8XHwgKiQvZywgJycpLnNwbGl0KC8gKlx8ICovKSwKKyAgICAgICAgY2VsbHM6IGNhcFszXS5yZXBsYWNlKC9cbiQvLCAnJykuc3BsaXQoJ1xuJykKKyAgICAgIH07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtLmFsaWduLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmICgvXiAqLSs6ICokLy50ZXN0KGl0ZW0uYWxpZ25baV0pKSB7CisgICAgICAgICAgaXRlbS5hbGlnbltpXSA9ICdyaWdodCc7CisgICAgICAgIH0gZWxzZSBpZiAoL14gKjotKzogKiQvLnRlc3QoaXRlbS5hbGlnbltpXSkpIHsKKyAgICAgICAgICBpdGVtLmFsaWduW2ldID0gJ2NlbnRlcic7CisgICAgICAgIH0gZWxzZSBpZiAoL14gKjotKyAqJC8udGVzdChpdGVtLmFsaWduW2ldKSkgeworICAgICAgICAgIGl0ZW0uYWxpZ25baV0gPSAnbGVmdCc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaXRlbS5hbGlnbltpXSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW0uY2VsbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaXRlbS5jZWxsc1tpXSA9IGl0ZW0uY2VsbHNbaV0uc3BsaXQoLyAqXHwgKi8pOworICAgICAgfQorCisgICAgICB0aGlzLnRva2Vucy5wdXNoKGl0ZW0pOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBsaGVhZGluZworICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLmxoZWFkaW5nLmV4ZWMoc3JjKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIHRoaXMudG9rZW5zLnB1c2goeworICAgICAgICB0eXBlOiAnaGVhZGluZycsCisgICAgICAgIGRlcHRoOiBjYXBbMl0gPT09ICc9JyA/IDEgOiAyLAorICAgICAgICB0ZXh0OiBjYXBbMV0KKyAgICAgIH0pOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gaHIKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5oci5leGVjKHNyYykpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICB0aGlzLnRva2Vucy5wdXNoKHsKKyAgICAgICAgdHlwZTogJ2hyJworICAgICAgfSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBibG9ja3F1b3RlCisgICAgaWYgKGNhcCA9IHRoaXMucnVsZXMuYmxvY2txdW90ZS5leGVjKHNyYykpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisKKyAgICAgIHRoaXMudG9rZW5zLnB1c2goeworICAgICAgICB0eXBlOiAnYmxvY2txdW90ZV9zdGFydCcKKyAgICAgIH0pOworCisgICAgICBjYXAgPSBjYXBbMF0ucmVwbGFjZSgvXiAqPiA/L2dtLCAnJyk7CisKKyAgICAgIC8vIFBhc3MgYHRvcGAgdG8ga2VlcCB0aGUgY3VycmVudAorICAgICAgLy8gInRvcGxldmVsIiBzdGF0ZS4gVGhpcyBpcyBleGFjdGx5CisgICAgICAvLyBob3cgbWFya2Rvd24ucGwgd29ya3MuCisgICAgICB0aGlzLnRva2VuKGNhcCwgdG9wLCB0cnVlKTsKKworICAgICAgdGhpcy50b2tlbnMucHVzaCh7CisgICAgICAgIHR5cGU6ICdibG9ja3F1b3RlX2VuZCcKKyAgICAgIH0pOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBsaXN0CisgICAgaWYgKGNhcCA9IHRoaXMucnVsZXMubGlzdC5leGVjKHNyYykpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICBidWxsID0gY2FwWzJdOworCisgICAgICB0aGlzLnRva2Vucy5wdXNoKHsKKyAgICAgICAgdHlwZTogJ2xpc3Rfc3RhcnQnLAorICAgICAgICBvcmRlcmVkOiBidWxsLmxlbmd0aCA+IDEKKyAgICAgIH0pOworCisgICAgICAvLyBHZXQgZWFjaCB0b3AtbGV2ZWwgaXRlbS4KKyAgICAgIGNhcCA9IGNhcFswXS5tYXRjaCh0aGlzLnJ1bGVzLml0ZW0pOworCisgICAgICBuZXh0ID0gZmFsc2U7CisgICAgICBsID0gY2FwLmxlbmd0aDsKKyAgICAgIGkgPSAwOworCisgICAgICBmb3IgKDsgaSA8IGw7IGkrKykgeworICAgICAgICBpdGVtID0gY2FwW2ldOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGlzdCBpdGVtJ3MgYnVsbGV0CisgICAgICAgIC8vIHNvIGl0IGlzIHNlZW4gYXMgdGhlIG5leHQgdG9rZW4uCisgICAgICAgIHNwYWNlID0gaXRlbS5sZW5ndGg7CisgICAgICAgIGl0ZW0gPSBpdGVtLnJlcGxhY2UoL14gKihbKistXXxcZCtcLikgKy8sICcnKTsKKworICAgICAgICAvLyBPdXRkZW50IHdoYXRldmVyIHRoZQorICAgICAgICAvLyBsaXN0IGl0ZW0gY29udGFpbnMuIEhhY2t5LgorICAgICAgICBpZiAofml0ZW0uaW5kZXhPZignXG4gJykpIHsKKyAgICAgICAgICBzcGFjZSAtPSBpdGVtLmxlbmd0aDsKKyAgICAgICAgICBpdGVtID0gIXRoaXMub3B0aW9ucy5wZWRhbnRpYworICAgICAgICAgICAgPyBpdGVtLnJlcGxhY2UobmV3IFJlZ0V4cCgnXiB7MSwnICsgc3BhY2UgKyAnfScsICdnbScpLCAnJykKKyAgICAgICAgICAgIDogaXRlbS5yZXBsYWNlKC9eIHsxLDR9L2dtLCAnJyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgbmV4dCBsaXN0IGl0ZW0gYmVsb25ncyBoZXJlLgorICAgICAgICAvLyBCYWNrcGVkYWwgaWYgaXQgZG9lcyBub3QgYmVsb25nIGluIHRoaXMgbGlzdC4KKyAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zbWFydExpc3RzICYmIGkgIT09IGwgLSAxKSB7CisgICAgICAgICAgYiA9IGJsb2NrLmJ1bGxldC5leGVjKGNhcFtpICsgMV0pWzBdOworICAgICAgICAgIGlmIChidWxsICE9PSBiICYmICEoYnVsbC5sZW5ndGggPiAxICYmIGIubGVuZ3RoID4gMSkpIHsKKyAgICAgICAgICAgIHNyYyA9IGNhcC5zbGljZShpICsgMSkuam9pbignXG4nKSArIHNyYzsKKyAgICAgICAgICAgIGkgPSBsIC0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciBpdGVtIGlzIGxvb3NlIG9yIG5vdC4KKyAgICAgICAgLy8gVXNlOiAvKF58XG4pKD8hIClbXlxuXStcblxuKD8hXHMqJCkvCisgICAgICAgIC8vIGZvciBkaXNjb3VudCBiZWhhdmlvci4KKyAgICAgICAgbG9vc2UgPSBuZXh0IHx8IC9cblxuKD8hXHMqJCkvLnRlc3QoaXRlbSk7CisgICAgICAgIGlmIChpICE9PSBsIC0gMSkgeworICAgICAgICAgIG5leHQgPSBpdGVtLmNoYXJBdChpdGVtLmxlbmd0aCAtIDEpID09PSAnXG4nOworICAgICAgICAgIGlmICghbG9vc2UpIGxvb3NlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudG9rZW5zLnB1c2goeworICAgICAgICAgIHR5cGU6IGxvb3NlCisgICAgICAgICAgICA/ICdsb29zZV9pdGVtX3N0YXJ0JworICAgICAgICAgICAgOiAnbGlzdF9pdGVtX3N0YXJ0JworICAgICAgICB9KTsKKworICAgICAgICAvLyBSZWN1cnNlLgorICAgICAgICB0aGlzLnRva2VuKGl0ZW0sIGZhbHNlLCBicSk7CisKKyAgICAgICAgdGhpcy50b2tlbnMucHVzaCh7CisgICAgICAgICAgdHlwZTogJ2xpc3RfaXRlbV9lbmQnCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLnRva2Vucy5wdXNoKHsKKyAgICAgICAgdHlwZTogJ2xpc3RfZW5kJworICAgICAgfSk7CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIGh0bWwKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5odG1sLmV4ZWMoc3JjKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIHRoaXMudG9rZW5zLnB1c2goeworICAgICAgICB0eXBlOiB0aGlzLm9wdGlvbnMuc2FuaXRpemUKKyAgICAgICAgICA/ICdwYXJhZ3JhcGgnCisgICAgICAgICAgOiAnaHRtbCcsCisgICAgICAgIHByZTogY2FwWzFdID09PSAncHJlJyB8fCBjYXBbMV0gPT09ICdzY3JpcHQnIHx8IGNhcFsxXSA9PT0gJ3N0eWxlJywKKyAgICAgICAgdGV4dDogY2FwWzBdCisgICAgICB9KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIGRlZgorICAgIGlmICgoIWJxICYmIHRvcCkgJiYgKGNhcCA9IHRoaXMucnVsZXMuZGVmLmV4ZWMoc3JjKSkpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICB0aGlzLnRva2Vucy5saW5rc1tjYXBbMV0udG9Mb3dlckNhc2UoKV0gPSB7CisgICAgICAgIGhyZWY6IGNhcFsyXSwKKyAgICAgICAgdGl0bGU6IGNhcFszXQorICAgICAgfTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIHRhYmxlIChnZm0pCisgICAgaWYgKHRvcCAmJiAoY2FwID0gdGhpcy5ydWxlcy50YWJsZS5leGVjKHNyYykpKSB7CisgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpOworCisgICAgICBpdGVtID0geworICAgICAgICB0eXBlOiAndGFibGUnLAorICAgICAgICBoZWFkZXI6IGNhcFsxXS5yZXBsYWNlKC9eICp8ICpcfCAqJC9nLCAnJykuc3BsaXQoLyAqXHwgKi8pLAorICAgICAgICBhbGlnbjogY2FwWzJdLnJlcGxhY2UoL14gKnxcfCAqJC9nLCAnJykuc3BsaXQoLyAqXHwgKi8pLAorICAgICAgICBjZWxsczogY2FwWzNdLnJlcGxhY2UoLyg/OiAqXHwgKik/XG4kLywgJycpLnNwbGl0KCdcbicpCisgICAgICB9OworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbS5hbGlnbi5sZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoL14gKi0rOiAqJC8udGVzdChpdGVtLmFsaWduW2ldKSkgeworICAgICAgICAgIGl0ZW0uYWxpZ25baV0gPSAncmlnaHQnOworICAgICAgICB9IGVsc2UgaWYgKC9eICo6LSs6ICokLy50ZXN0KGl0ZW0uYWxpZ25baV0pKSB7CisgICAgICAgICAgaXRlbS5hbGlnbltpXSA9ICdjZW50ZXInOworICAgICAgICB9IGVsc2UgaWYgKC9eICo6LSsgKiQvLnRlc3QoaXRlbS5hbGlnbltpXSkpIHsKKyAgICAgICAgICBpdGVtLmFsaWduW2ldID0gJ2xlZnQnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGl0ZW0uYWxpZ25baV0gPSBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtLmNlbGxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGl0ZW0uY2VsbHNbaV0gPSBpdGVtLmNlbGxzW2ldCisgICAgICAgICAgLnJlcGxhY2UoL14gKlx8ICp8ICpcfCAqJC9nLCAnJykKKyAgICAgICAgICAuc3BsaXQoLyAqXHwgKi8pOworICAgICAgfQorCisgICAgICB0aGlzLnRva2Vucy5wdXNoKGl0ZW0pOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyB0b3AtbGV2ZWwgcGFyYWdyYXBoCisgICAgaWYgKHRvcCAmJiAoY2FwID0gdGhpcy5ydWxlcy5wYXJhZ3JhcGguZXhlYyhzcmMpKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIHRoaXMudG9rZW5zLnB1c2goeworICAgICAgICB0eXBlOiAncGFyYWdyYXBoJywKKyAgICAgICAgdGV4dDogY2FwWzFdLmNoYXJBdChjYXBbMV0ubGVuZ3RoIC0gMSkgPT09ICdcbicKKyAgICAgICAgICA/IGNhcFsxXS5zbGljZSgwLCAtMSkKKyAgICAgICAgICA6IGNhcFsxXQorICAgICAgfSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyB0ZXh0CisgICAgaWYgKGNhcCA9IHRoaXMucnVsZXMudGV4dC5leGVjKHNyYykpIHsKKyAgICAgIC8vIFRvcC1sZXZlbCBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4KKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICB0aGlzLnRva2Vucy5wdXNoKHsKKyAgICAgICAgdHlwZTogJ3RleHQnLAorICAgICAgICB0ZXh0OiBjYXBbMF0KKyAgICAgIH0pOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHNyYykgeworICAgICAgdGhyb3cgbmV3CisgICAgICAgIEVycm9yKCdJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICcgKyBzcmMuY2hhckNvZGVBdCgwKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRoaXMudG9rZW5zOworfTsKKworLyoqCisgKiBJbmxpbmUtTGV2ZWwgR3JhbW1hcgorICovCisKK3ZhciBpbmxpbmUgPSB7CisgIGVzY2FwZTogL15cXChbXFxgKnt9XFtcXSgpIytcLS4hXz5dKS8sCisgIGF1dG9saW5rOiAvXjwoW14gPl0rKEB8OlwvKVteID5dKyk+LywKKyAgdXJsOiBub29wLAorICB0YWc6IC9ePCEtLVtcc1xTXSo/LS0+fF48XC8/XHcrKD86IlteIl0qInwnW14nXSonfFteJyI+XSkqPz4vLAorICBsaW5rOiAvXiE/XFsoaW5zaWRlKVxdXChocmVmXCkvLAorICByZWZsaW5rOiAvXiE/XFsoaW5zaWRlKVxdXHMqXFsoW15cXV0qKVxdLywKKyAgbm9saW5rOiAvXiE/XFsoKD86XFtbXlxdXSpcXXxbXlxbXF1dKSopXF0vLAorICBzdHJvbmc6IC9eX18oW1xzXFNdKz8pX18oPyFfKXxeXCpcKihbXHNcU10rPylcKlwqKD8hXCopLywKKyAgZW06IC9eXGJfKCg/Ol9ffFtcc1xTXSkrPylfXGJ8XlwqKCg/OlwqXCp8W1xzXFNdKSs/KVwqKD8hXCopLywKKyAgY29kZTogL14oYCspXHMqKFtcc1xTXSo/W15gXSlccypcMSg/IWApLywKKyAgYnI6IC9eIHsyLH1cbig/IVxzKiQpLywKKyAgZGVsOiBub29wLAorICB0ZXh0OiAvXltcc1xTXSs/KD89W1xcPCFcW18qYF18IHsyLH1cbnwkKS8KK307CisKK2lubGluZS5faW5zaWRlID0gLyg/OlxbW15cXV0qXF18W15cW1xdXXxcXSg/PVteXFtdKlxdKSkqLzsKK2lubGluZS5faHJlZiA9IC9ccyo8PyhbXHNcU10qPyk+Pyg/OlxzK1snIl0oW1xzXFNdKj8pWyciXSk/XHMqLzsKKworaW5saW5lLmxpbmsgPSByZXBsYWNlKGlubGluZS5saW5rKQorICAoJ2luc2lkZScsIGlubGluZS5faW5zaWRlKQorICAoJ2hyZWYnLCBpbmxpbmUuX2hyZWYpCisgICgpOworCitpbmxpbmUucmVmbGluayA9IHJlcGxhY2UoaW5saW5lLnJlZmxpbmspCisgICgnaW5zaWRlJywgaW5saW5lLl9pbnNpZGUpCisgICgpOworCisvKioKKyAqIE5vcm1hbCBJbmxpbmUgR3JhbW1hcgorICovCisKK2lubGluZS5ub3JtYWwgPSBtZXJnZSh7fSwgaW5saW5lKTsKKworLyoqCisgKiBQZWRhbnRpYyBJbmxpbmUgR3JhbW1hcgorICovCisKK2lubGluZS5wZWRhbnRpYyA9IG1lcmdlKHt9LCBpbmxpbmUubm9ybWFsLCB7CisgIHN0cm9uZzogL15fXyg/PVxTKShbXHNcU10qP1xTKV9fKD8hXyl8XlwqXCooPz1cUykoW1xzXFNdKj9cUylcKlwqKD8hXCopLywKKyAgZW06IC9eXyg/PVxTKShbXHNcU10qP1xTKV8oPyFfKXxeXCooPz1cUykoW1xzXFNdKj9cUylcKig/IVwqKS8KK30pOworCisvKioKKyAqIEdGTSBJbmxpbmUgR3JhbW1hcgorICovCisKK2lubGluZS5nZm0gPSBtZXJnZSh7fSwgaW5saW5lLm5vcm1hbCwgeworICBlc2NhcGU6IHJlcGxhY2UoaW5saW5lLmVzY2FwZSkoJ10pJywgJ358XSknKSgpLAorICB1cmw6IC9eKGh0dHBzPzpcL1wvW15cczxdK1tePC4sOjsiJylcXVxzXSkvLAorICBkZWw6IC9efn4oPz1cUykoW1xzXFNdKj9cUyl+fi8sCisgIHRleHQ6IHJlcGxhY2UoaW5saW5lLnRleHQpCisgICAgKCddfCcsICd+XXwnKQorICAgICgnfCcsICd8aHR0cHM/Oi8vfCcpCisgICAgKCkKK30pOworCisvKioKKyAqIEdGTSArIExpbmUgQnJlYWtzIElubGluZSBHcmFtbWFyCisgKi8KKworaW5saW5lLmJyZWFrcyA9IG1lcmdlKHt9LCBpbmxpbmUuZ2ZtLCB7CisgIGJyOiByZXBsYWNlKGlubGluZS5icikoJ3syLH0nLCAnKicpKCksCisgIHRleHQ6IHJlcGxhY2UoaW5saW5lLmdmbS50ZXh0KSgnezIsfScsICcqJykoKQorfSk7CisKKy8qKgorICogSW5saW5lIExleGVyICYgQ29tcGlsZXIKKyAqLworCitmdW5jdGlvbiBJbmxpbmVMZXhlcihsaW5rcywgb3B0aW9ucykgeworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IG1hcmtlZC5kZWZhdWx0czsKKyAgdGhpcy5saW5rcyA9IGxpbmtzOworICB0aGlzLnJ1bGVzID0gaW5saW5lLm5vcm1hbDsKKyAgdGhpcy5yZW5kZXJlciA9IHRoaXMub3B0aW9ucy5yZW5kZXJlciB8fCBuZXcgUmVuZGVyZXI7CisgIHRoaXMucmVuZGVyZXIub3B0aW9ucyA9IHRoaXMub3B0aW9uczsKKworICBpZiAoIXRoaXMubGlua3MpIHsKKyAgICB0aHJvdyBuZXcKKyAgICAgIEVycm9yKCdUb2tlbnMgYXJyYXkgcmVxdWlyZXMgYSBgbGlua3NgIHByb3BlcnR5LicpOworICB9CisKKyAgaWYgKHRoaXMub3B0aW9ucy5nZm0pIHsKKyAgICBpZiAodGhpcy5vcHRpb25zLmJyZWFrcykgeworICAgICAgdGhpcy5ydWxlcyA9IGlubGluZS5icmVha3M7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMucnVsZXMgPSBpbmxpbmUuZ2ZtOworICAgIH0KKyAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHsKKyAgICB0aGlzLnJ1bGVzID0gaW5saW5lLnBlZGFudGljOworICB9Cit9CisKKy8qKgorICogRXhwb3NlIElubGluZSBSdWxlcworICovCisKK0lubGluZUxleGVyLnJ1bGVzID0gaW5saW5lOworCisvKioKKyAqIFN0YXRpYyBMZXhpbmcvQ29tcGlsaW5nIE1ldGhvZAorICovCisKK0lubGluZUxleGVyLm91dHB1dCA9IGZ1bmN0aW9uKHNyYywgbGlua3MsIG9wdGlvbnMpIHsKKyAgdmFyIGlubGluZSA9IG5ldyBJbmxpbmVMZXhlcihsaW5rcywgb3B0aW9ucyk7CisgIHJldHVybiBpbmxpbmUub3V0cHV0KHNyYyk7Cit9OworCisvKioKKyAqIExleGluZy9Db21waWxpbmcKKyAqLworCitJbmxpbmVMZXhlci5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24oc3JjKSB7CisgIHZhciBvdXQgPSAnJworICAgICwgbGluaworICAgICwgdGV4dAorICAgICwgaHJlZgorICAgICwgY2FwOworCisgIHdoaWxlIChzcmMpIHsKKyAgICAvLyBlc2NhcGUKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5lc2NhcGUuZXhlYyhzcmMpKSB7CisgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpOworICAgICAgb3V0ICs9IGNhcFsxXTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIGF1dG9saW5rCisgICAgaWYgKGNhcCA9IHRoaXMucnVsZXMuYXV0b2xpbmsuZXhlYyhzcmMpKSB7CisgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpOworICAgICAgaWYgKGNhcFsyXSA9PT0gJ0AnKSB7CisgICAgICAgIHRleHQgPSBjYXBbMV0uY2hhckF0KDYpID09PSAnOicKKyAgICAgICAgICA/IHRoaXMubWFuZ2xlKGNhcFsxXS5zdWJzdHJpbmcoNykpCisgICAgICAgICAgOiB0aGlzLm1hbmdsZShjYXBbMV0pOworICAgICAgICBocmVmID0gdGhpcy5tYW5nbGUoJ21haWx0bzonKSArIHRleHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXh0ID0gZXNjYXBlKGNhcFsxXSk7CisgICAgICAgIGhyZWYgPSB0ZXh0OworICAgICAgfQorICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIubGluayhocmVmLCBudWxsLCB0ZXh0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIHVybCAoZ2ZtKQorICAgIGlmICghdGhpcy5pbkxpbmsgJiYgKGNhcCA9IHRoaXMucnVsZXMudXJsLmV4ZWMoc3JjKSkpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICB0ZXh0ID0gZXNjYXBlKGNhcFsxXSk7CisgICAgICBocmVmID0gdGV4dDsKKyAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmxpbmsoaHJlZiwgbnVsbCwgdGV4dCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyB0YWcKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy50YWcuZXhlYyhzcmMpKSB7CisgICAgICBpZiAoIXRoaXMuaW5MaW5rICYmIC9ePGEgL2kudGVzdChjYXBbMF0pKSB7CisgICAgICAgIHRoaXMuaW5MaW5rID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5pbkxpbmsgJiYgL148XC9hPi9pLnRlc3QoY2FwWzBdKSkgeworICAgICAgICB0aGlzLmluTGluayA9IGZhbHNlOworICAgICAgfQorICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIG91dCArPSB0aGlzLm9wdGlvbnMuc2FuaXRpemUKKyAgICAgICAgPyBlc2NhcGUoY2FwWzBdKQorICAgICAgICA6IGNhcFswXTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIGxpbmsKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5saW5rLmV4ZWMoc3JjKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIHRoaXMuaW5MaW5rID0gdHJ1ZTsKKyAgICAgIG91dCArPSB0aGlzLm91dHB1dExpbmsoY2FwLCB7CisgICAgICAgIGhyZWY6IGNhcFsyXSwKKyAgICAgICAgdGl0bGU6IGNhcFszXQorICAgICAgfSk7CisgICAgICB0aGlzLmluTGluayA9IGZhbHNlOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gcmVmbGluaywgbm9saW5rCisgICAgaWYgKChjYXAgPSB0aGlzLnJ1bGVzLnJlZmxpbmsuZXhlYyhzcmMpKQorICAgICAgICB8fCAoY2FwID0gdGhpcy5ydWxlcy5ub2xpbmsuZXhlYyhzcmMpKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIGxpbmsgPSAoY2FwWzJdIHx8IGNhcFsxXSkucmVwbGFjZSgvXHMrL2csICcgJyk7CisgICAgICBsaW5rID0gdGhpcy5saW5rc1tsaW5rLnRvTG93ZXJDYXNlKCldOworICAgICAgaWYgKCFsaW5rIHx8ICFsaW5rLmhyZWYpIHsKKyAgICAgICAgb3V0ICs9IGNhcFswXS5jaGFyQXQoMCk7CisgICAgICAgIHNyYyA9IGNhcFswXS5zdWJzdHJpbmcoMSkgKyBzcmM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdGhpcy5pbkxpbmsgPSB0cnVlOworICAgICAgb3V0ICs9IHRoaXMub3V0cHV0TGluayhjYXAsIGxpbmspOworICAgICAgdGhpcy5pbkxpbmsgPSBmYWxzZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIHN0cm9uZworICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLnN0cm9uZy5leGVjKHNyYykpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5zdHJvbmcodGhpcy5vdXRwdXQoY2FwWzJdIHx8IGNhcFsxXSkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gZW0KKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5lbS5leGVjKHNyYykpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5lbSh0aGlzLm91dHB1dChjYXBbMl0gfHwgY2FwWzFdKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBjb2RlCisgICAgaWYgKGNhcCA9IHRoaXMucnVsZXMuY29kZS5leGVjKHNyYykpIHsKKyAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7CisgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jb2Rlc3Bhbihlc2NhcGUoY2FwWzJdLCB0cnVlKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBicgorICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLmJyLmV4ZWMoc3JjKSkgeworICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTsKKyAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmJyKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBkZWwgKGdmbSkKKyAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5kZWwuZXhlYyhzcmMpKSB7CisgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpOworICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuZGVsKHRoaXMub3V0cHV0KGNhcFsxXSkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gdGV4dAorICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLnRleHQuZXhlYyhzcmMpKSB7CisgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpOworICAgICAgb3V0ICs9IGVzY2FwZSh0aGlzLnNtYXJ0eXBhbnRzKGNhcFswXSkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHNyYykgeworICAgICAgdGhyb3cgbmV3CisgICAgICAgIEVycm9yKCdJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICcgKyBzcmMuY2hhckNvZGVBdCgwKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dDsKK307CisKKy8qKgorICogQ29tcGlsZSBMaW5rCisgKi8KKworSW5saW5lTGV4ZXIucHJvdG90eXBlLm91dHB1dExpbmsgPSBmdW5jdGlvbihjYXAsIGxpbmspIHsKKyAgdmFyIGhyZWYgPSBlc2NhcGUobGluay5ocmVmKQorICAgICwgdGl0bGUgPSBsaW5rLnRpdGxlID8gZXNjYXBlKGxpbmsudGl0bGUpIDogbnVsbDsKKworICByZXR1cm4gY2FwWzBdLmNoYXJBdCgwKSAhPT0gJyEnCisgICAgPyB0aGlzLnJlbmRlcmVyLmxpbmsoaHJlZiwgdGl0bGUsIHRoaXMub3V0cHV0KGNhcFsxXSkpCisgICAgOiB0aGlzLnJlbmRlcmVyLmltYWdlKGhyZWYsIHRpdGxlLCBlc2NhcGUoY2FwWzFdKSk7Cit9OworCisvKioKKyAqIFNtYXJ0eXBhbnRzIFRyYW5zZm9ybWF0aW9ucworICovCisKK0lubGluZUxleGVyLnByb3RvdHlwZS5zbWFydHlwYW50cyA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgaWYgKCF0aGlzLm9wdGlvbnMuc21hcnR5cGFudHMpIHJldHVybiB0ZXh0OworICByZXR1cm4gdGV4dAorICAgIC8vIGVtLWRhc2hlcworICAgIC5yZXBsYWNlKC8tLS9nLCAnXHUyMDE0JykKKyAgICAvLyBvcGVuaW5nIHNpbmdsZXMKKyAgICAucmVwbGFjZSgvKF58Wy1cdTIwMTQvKFxbeyJcc10pJy9nLCAnJDFcdTIwMTgnKQorICAgIC8vIGNsb3Npbmcgc2luZ2xlcyAmIGFwb3N0cm9waGVzCisgICAgLnJlcGxhY2UoLycvZywgJ1x1MjAxOScpCisgICAgLy8gb3BlbmluZyBkb3VibGVzCisgICAgLnJlcGxhY2UoLyhefFstXHUyMDE0LyhcW3tcdTIwMThcc10pIi9nLCAnJDFcdTIwMWMnKQorICAgIC8vIGNsb3NpbmcgZG91YmxlcworICAgIC5yZXBsYWNlKC8iL2csICdcdTIwMWQnKQorICAgIC8vIGVsbGlwc2VzCisgICAgLnJlcGxhY2UoL1wuezN9L2csICdcdTIwMjYnKTsKK307CisKKy8qKgorICogTWFuZ2xlIExpbmtzCisgKi8KKworSW5saW5lTGV4ZXIucHJvdG90eXBlLm1hbmdsZSA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgdmFyIG91dCA9ICcnCisgICAgLCBsID0gdGV4dC5sZW5ndGgKKyAgICAsIGkgPSAwCisgICAgLCBjaDsKKworICBmb3IgKDsgaSA8IGw7IGkrKykgeworICAgIGNoID0gdGV4dC5jaGFyQ29kZUF0KGkpOworICAgIGlmIChNYXRoLnJhbmRvbSgpID4gMC41KSB7CisgICAgICBjaCA9ICd4JyArIGNoLnRvU3RyaW5nKDE2KTsKKyAgICB9CisgICAgb3V0ICs9ICcmIycgKyBjaCArICc7JzsKKyAgfQorCisgIHJldHVybiBvdXQ7Cit9OworCisvKioKKyAqIFJlbmRlcmVyCisgKi8KKworZnVuY3Rpb24gUmVuZGVyZXIob3B0aW9ucykgeworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworfQorCitSZW5kZXJlci5wcm90b3R5cGUuY29kZSA9IGZ1bmN0aW9uKGNvZGUsIGxhbmcsIGVzY2FwZWQpIHsKKyAgaWYgKHRoaXMub3B0aW9ucy5oaWdobGlnaHQpIHsKKyAgICB2YXIgb3V0ID0gdGhpcy5vcHRpb25zLmhpZ2hsaWdodChjb2RlLCBsYW5nKTsKKyAgICBpZiAob3V0ICE9IG51bGwgJiYgb3V0ICE9PSBjb2RlKSB7CisgICAgICBlc2NhcGVkID0gdHJ1ZTsKKyAgICAgIGNvZGUgPSBvdXQ7CisgICAgfQorICB9CisKKyAgaWYgKCFsYW5nKSB7CisgICAgcmV0dXJuICc8cHJlPjxjb2RlPicKKyAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlKGNvZGUsIHRydWUpKQorICAgICAgKyAnXG48L2NvZGU+PC9wcmU+JzsKKyAgfQorCisgIHJldHVybiAnPHByZT48Y29kZSBjbGFzcz0iJworICAgICsgdGhpcy5vcHRpb25zLmxhbmdQcmVmaXgKKyAgICArIGVzY2FwZShsYW5nLCB0cnVlKQorICAgICsgJyI+JworICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlKGNvZGUsIHRydWUpKQorICAgICsgJ1xuPC9jb2RlPjwvcHJlPlxuJzsKK307CisKK1JlbmRlcmVyLnByb3RvdHlwZS5ibG9ja3F1b3RlID0gZnVuY3Rpb24ocXVvdGUpIHsKKyAgcmV0dXJuICc8YmxvY2txdW90ZT5cbicgKyBxdW90ZSArICc8L2Jsb2NrcXVvdGU+XG4nOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLmh0bWwgPSBmdW5jdGlvbihodG1sKSB7CisgIHJldHVybiBodG1sOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLmhlYWRpbmcgPSBmdW5jdGlvbih0ZXh0LCBsZXZlbCwgcmF3KSB7CisgIHJldHVybiAnPGgnCisgICAgKyBsZXZlbAorICAgICsgJyBpZD0iJworICAgICsgdGhpcy5vcHRpb25zLmhlYWRlclByZWZpeAorICAgICsgcmF3LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15cd10rL2csICctJykKKyAgICArICciPicKKyAgICArIHRleHQKKyAgICArICc8L2gnCisgICAgKyBsZXZlbAorICAgICsgJz5cbic7Cit9OworCitSZW5kZXJlci5wcm90b3R5cGUuaHIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMub3B0aW9ucy54aHRtbCA/ICc8aHIvPlxuJyA6ICc8aHI+XG4nOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLmxpc3QgPSBmdW5jdGlvbihib2R5LCBvcmRlcmVkKSB7CisgIHZhciB0eXBlID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnOworICByZXR1cm4gJzwnICsgdHlwZSArICc+XG4nICsgYm9keSArICc8LycgKyB0eXBlICsgJz5cbic7Cit9OworCitSZW5kZXJlci5wcm90b3R5cGUubGlzdGl0ZW0gPSBmdW5jdGlvbih0ZXh0KSB7CisgIHJldHVybiAnPGxpPicgKyB0ZXh0ICsgJzwvbGk+XG4nOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLnBhcmFncmFwaCA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgcmV0dXJuICc8cD4nICsgdGV4dCArICc8L3A+XG4nOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLnRhYmxlID0gZnVuY3Rpb24oaGVhZGVyLCBib2R5KSB7CisgIHJldHVybiAnPHRhYmxlPlxuJworICAgICsgJzx0aGVhZD5cbicKKyAgICArIGhlYWRlcgorICAgICsgJzwvdGhlYWQ+XG4nCisgICAgKyAnPHRib2R5PlxuJworICAgICsgYm9keQorICAgICsgJzwvdGJvZHk+XG4nCisgICAgKyAnPC90YWJsZT5cbic7Cit9OworCitSZW5kZXJlci5wcm90b3R5cGUudGFibGVyb3cgPSBmdW5jdGlvbihjb250ZW50KSB7CisgIHJldHVybiAnPHRyPlxuJyArIGNvbnRlbnQgKyAnPC90cj5cbic7Cit9OworCitSZW5kZXJlci5wcm90b3R5cGUudGFibGVjZWxsID0gZnVuY3Rpb24oY29udGVudCwgZmxhZ3MpIHsKKyAgdmFyIHR5cGUgPSBmbGFncy5oZWFkZXIgPyAndGgnIDogJ3RkJzsKKyAgdmFyIHRhZyA9IGZsYWdzLmFsaWduCisgICAgPyAnPCcgKyB0eXBlICsgJyBzdHlsZT0idGV4dC1hbGlnbjonICsgZmxhZ3MuYWxpZ24gKyAnIj4nCisgICAgOiAnPCcgKyB0eXBlICsgJz4nOworICByZXR1cm4gdGFnICsgY29udGVudCArICc8LycgKyB0eXBlICsgJz5cbic7Cit9OworCisvLyBzcGFuIGxldmVsIHJlbmRlcmVyCitSZW5kZXJlci5wcm90b3R5cGUuc3Ryb25nID0gZnVuY3Rpb24odGV4dCkgeworICByZXR1cm4gJzxzdHJvbmc+JyArIHRleHQgKyAnPC9zdHJvbmc+JzsKK307CisKK1JlbmRlcmVyLnByb3RvdHlwZS5lbSA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgcmV0dXJuICc8ZW0+JyArIHRleHQgKyAnPC9lbT4nOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLmNvZGVzcGFuID0gZnVuY3Rpb24odGV4dCkgeworICByZXR1cm4gJzxjb2RlPicgKyB0ZXh0ICsgJzwvY29kZT4nOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLmJyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLm9wdGlvbnMueGh0bWwgPyAnPGJyLz4nIDogJzxicj4nOworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLmRlbCA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgcmV0dXJuICc8ZGVsPicgKyB0ZXh0ICsgJzwvZGVsPic7Cit9OworCitSZW5kZXJlci5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uKGhyZWYsIHRpdGxlLCB0ZXh0KSB7CisgIGlmICh0aGlzLm9wdGlvbnMuc2FuaXRpemUpIHsKKyAgICB0cnkgeworICAgICAgdmFyIHByb3QgPSBkZWNvZGVVUklDb21wb25lbnQodW5lc2NhcGUoaHJlZikpCisgICAgICAgIC5yZXBsYWNlKC9bXlx3Ol0vZywgJycpCisgICAgICAgIC50b0xvd2VyQ2FzZSgpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHJldHVybiAnJzsKKyAgICB9CisgICAgaWYgKHByb3QuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkgeworICAgICAgcmV0dXJuICcnOworICAgIH0KKyAgfQorICB2YXIgb3V0ID0gJzxhIGhyZWY9IicgKyBocmVmICsgJyInOworICBpZiAodGl0bGUpIHsKKyAgICBvdXQgKz0gJyB0aXRsZT0iJyArIHRpdGxlICsgJyInOworICB9CisgIG91dCArPSAnPicgKyB0ZXh0ICsgJzwvYT4nOworICByZXR1cm4gb3V0OworfTsKKworUmVuZGVyZXIucHJvdG90eXBlLmltYWdlID0gZnVuY3Rpb24oaHJlZiwgdGl0bGUsIHRleHQpIHsKKyAgdmFyIG91dCA9ICc8aW1nIHNyYz0iJyArIGhyZWYgKyAnIiBhbHQ9IicgKyB0ZXh0ICsgJyInOworICBpZiAodGl0bGUpIHsKKyAgICBvdXQgKz0gJyB0aXRsZT0iJyArIHRpdGxlICsgJyInOworICB9CisgIG91dCArPSB0aGlzLm9wdGlvbnMueGh0bWwgPyAnLz4nIDogJz4nOworICByZXR1cm4gb3V0OworfTsKKworLyoqCisgKiBQYXJzaW5nICYgQ29tcGlsaW5nCisgKi8KKworZnVuY3Rpb24gUGFyc2VyKG9wdGlvbnMpIHsKKyAgdGhpcy50b2tlbnMgPSBbXTsKKyAgdGhpcy50b2tlbiA9IG51bGw7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgbWFya2VkLmRlZmF1bHRzOworICB0aGlzLm9wdGlvbnMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXIgfHwgbmV3IFJlbmRlcmVyOworICB0aGlzLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyOworICB0aGlzLnJlbmRlcmVyLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7Cit9CisKKy8qKgorICogU3RhdGljIFBhcnNlIE1ldGhvZAorICovCisKK1BhcnNlci5wYXJzZSA9IGZ1bmN0aW9uKHNyYywgb3B0aW9ucywgcmVuZGVyZXIpIHsKKyAgdmFyIHBhcnNlciA9IG5ldyBQYXJzZXIob3B0aW9ucywgcmVuZGVyZXIpOworICByZXR1cm4gcGFyc2VyLnBhcnNlKHNyYyk7Cit9OworCisvKioKKyAqIFBhcnNlIExvb3AKKyAqLworCitQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oc3JjKSB7CisgIHRoaXMuaW5saW5lID0gbmV3IElubGluZUxleGVyKHNyYy5saW5rcywgdGhpcy5vcHRpb25zLCB0aGlzLnJlbmRlcmVyKTsKKyAgdGhpcy50b2tlbnMgPSBzcmMucmV2ZXJzZSgpOworCisgIHZhciBvdXQgPSAnJzsKKyAgd2hpbGUgKHRoaXMubmV4dCgpKSB7CisgICAgb3V0ICs9IHRoaXMudG9rKCk7CisgIH0KKworICByZXR1cm4gb3V0OworfTsKKworLyoqCisgKiBOZXh0IFRva2VuCisgKi8KKworUGFyc2VyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRva2VuID0gdGhpcy50b2tlbnMucG9wKCk7Cit9OworCisvKioKKyAqIFByZXZpZXcgTmV4dCBUb2tlbgorICovCisKK1BhcnNlci5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy50b2tlbnMubGVuZ3RoIC0gMV0gfHwgMDsKK307CisKKy8qKgorICogUGFyc2UgVGV4dCBUb2tlbnMKKyAqLworCitQYXJzZXIucHJvdG90eXBlLnBhcnNlVGV4dCA9IGZ1bmN0aW9uKCkgeworICB2YXIgYm9keSA9IHRoaXMudG9rZW4udGV4dDsKKworICB3aGlsZSAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ3RleHQnKSB7CisgICAgYm9keSArPSAnXG4nICsgdGhpcy5uZXh0KCkudGV4dDsKKyAgfQorCisgIHJldHVybiB0aGlzLmlubGluZS5vdXRwdXQoYm9keSk7Cit9OworCisvKioKKyAqIFBhcnNlIEN1cnJlbnQgVG9rZW4KKyAqLworCitQYXJzZXIucHJvdG90eXBlLnRvayA9IGZ1bmN0aW9uKCkgeworICBzd2l0Y2ggKHRoaXMudG9rZW4udHlwZSkgeworICAgIGNhc2UgJ3NwYWNlJzogeworICAgICAgcmV0dXJuICcnOworICAgIH0KKyAgICBjYXNlICdocic6IHsKKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmhyKCk7CisgICAgfQorICAgIGNhc2UgJ2hlYWRpbmcnOiB7CisgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5oZWFkaW5nKAorICAgICAgICB0aGlzLmlubGluZS5vdXRwdXQodGhpcy50b2tlbi50ZXh0KSwKKyAgICAgICAgdGhpcy50b2tlbi5kZXB0aCwKKyAgICAgICAgdGhpcy50b2tlbi50ZXh0KTsKKyAgICB9CisgICAgY2FzZSAnY29kZSc6IHsKKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmNvZGUodGhpcy50b2tlbi50ZXh0LAorICAgICAgICB0aGlzLnRva2VuLmxhbmcsCisgICAgICAgIHRoaXMudG9rZW4uZXNjYXBlZCk7CisgICAgfQorICAgIGNhc2UgJ3RhYmxlJzogeworICAgICAgdmFyIGhlYWRlciA9ICcnCisgICAgICAgICwgYm9keSA9ICcnCisgICAgICAgICwgaQorICAgICAgICAsIHJvdworICAgICAgICAsIGNlbGwKKyAgICAgICAgLCBmbGFncworICAgICAgICAsIGo7CisKKyAgICAgIC8vIGhlYWRlcgorICAgICAgY2VsbCA9ICcnOworICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMudG9rZW4uaGVhZGVyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZsYWdzID0geyBoZWFkZXI6IHRydWUsIGFsaWduOiB0aGlzLnRva2VuLmFsaWduW2ldIH07CisgICAgICAgIGNlbGwgKz0gdGhpcy5yZW5kZXJlci50YWJsZWNlbGwoCisgICAgICAgICAgdGhpcy5pbmxpbmUub3V0cHV0KHRoaXMudG9rZW4uaGVhZGVyW2ldKSwKKyAgICAgICAgICB7IGhlYWRlcjogdHJ1ZSwgYWxpZ246IHRoaXMudG9rZW4uYWxpZ25baV0gfQorICAgICAgICApOworICAgICAgfQorICAgICAgaGVhZGVyICs9IHRoaXMucmVuZGVyZXIudGFibGVyb3coY2VsbCk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnRva2VuLmNlbGxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHJvdyA9IHRoaXMudG9rZW4uY2VsbHNbaV07CisKKyAgICAgICAgY2VsbCA9ICcnOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcm93Lmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgY2VsbCArPSB0aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCgKKyAgICAgICAgICAgIHRoaXMuaW5saW5lLm91dHB1dChyb3dbal0pLAorICAgICAgICAgICAgeyBoZWFkZXI6IGZhbHNlLCBhbGlnbjogdGhpcy50b2tlbi5hbGlnbltqXSB9CisgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvZHkgKz0gdGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnRhYmxlKGhlYWRlciwgYm9keSk7CisgICAgfQorICAgIGNhc2UgJ2Jsb2NrcXVvdGVfc3RhcnQnOiB7CisgICAgICB2YXIgYm9keSA9ICcnOworCisgICAgICB3aGlsZSAodGhpcy5uZXh0KCkudHlwZSAhPT0gJ2Jsb2NrcXVvdGVfZW5kJykgeworICAgICAgICBib2R5ICs9IHRoaXMudG9rKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUoYm9keSk7CisgICAgfQorICAgIGNhc2UgJ2xpc3Rfc3RhcnQnOiB7CisgICAgICB2YXIgYm9keSA9ICcnCisgICAgICAgICwgb3JkZXJlZCA9IHRoaXMudG9rZW4ub3JkZXJlZDsKKworICAgICAgd2hpbGUgKHRoaXMubmV4dCgpLnR5cGUgIT09ICdsaXN0X2VuZCcpIHsKKyAgICAgICAgYm9keSArPSB0aGlzLnRvaygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5saXN0KGJvZHksIG9yZGVyZWQpOworICAgIH0KKyAgICBjYXNlICdsaXN0X2l0ZW1fc3RhcnQnOiB7CisgICAgICB2YXIgYm9keSA9ICcnOworCisgICAgICB3aGlsZSAodGhpcy5uZXh0KCkudHlwZSAhPT0gJ2xpc3RfaXRlbV9lbmQnKSB7CisgICAgICAgIGJvZHkgKz0gdGhpcy50b2tlbi50eXBlID09PSAndGV4dCcKKyAgICAgICAgICA/IHRoaXMucGFyc2VUZXh0KCkKKyAgICAgICAgICA6IHRoaXMudG9rKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGJvZHkpOworICAgIH0KKyAgICBjYXNlICdsb29zZV9pdGVtX3N0YXJ0JzogeworICAgICAgdmFyIGJvZHkgPSAnJzsKKworICAgICAgd2hpbGUgKHRoaXMubmV4dCgpLnR5cGUgIT09ICdsaXN0X2l0ZW1fZW5kJykgeworICAgICAgICBib2R5ICs9IHRoaXMudG9rKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGJvZHkpOworICAgIH0KKyAgICBjYXNlICdodG1sJzogeworICAgICAgdmFyIGh0bWwgPSAhdGhpcy50b2tlbi5wcmUgJiYgIXRoaXMub3B0aW9ucy5wZWRhbnRpYworICAgICAgICA/IHRoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpCisgICAgICAgIDogdGhpcy50b2tlbi50ZXh0OworICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuaHRtbChodG1sKTsKKyAgICB9CisgICAgY2FzZSAncGFyYWdyYXBoJzogeworICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpKTsKKyAgICB9CisgICAgY2FzZSAndGV4dCc6IHsKKyAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnBhcmFncmFwaCh0aGlzLnBhcnNlVGV4dCgpKTsKKyAgICB9CisgIH0KK307CisKKy8qKgorICogSGVscGVycworICovCisKK2Z1bmN0aW9uIGVzY2FwZShodG1sLCBlbmNvZGUpIHsKKyAgcmV0dXJuIGh0bWwKKyAgICAucmVwbGFjZSghZW5jb2RlID8gLyYoPyEjP1x3KzspL2cgOiAvJi9nLCAnJmFtcDsnKQorICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JykKKyAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpCisgICAgLnJlcGxhY2UoLyIvZywgJyZxdW90OycpCisgICAgLnJlcGxhY2UoLycvZywgJyYjMzk7Jyk7Cit9CisKK2Z1bmN0aW9uIHVuZXNjYXBlKGh0bWwpIHsKKyAgcmV0dXJuIGh0bWwucmVwbGFjZSgvJihbI1x3XSspOy9nLCBmdW5jdGlvbihfLCBuKSB7CisgICAgbiA9IG4udG9Mb3dlckNhc2UoKTsKKyAgICBpZiAobiA9PT0gJ2NvbG9uJykgcmV0dXJuICc6JzsKKyAgICBpZiAobi5jaGFyQXQoMCkgPT09ICcjJykgeworICAgICAgcmV0dXJuIG4uY2hhckF0KDEpID09PSAneCcKKyAgICAgICAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4uc3Vic3RyaW5nKDIpLCAxNikpCisgICAgICAgIDogU3RyaW5nLmZyb21DaGFyQ29kZSgrbi5zdWJzdHJpbmcoMSkpOworICAgIH0KKyAgICByZXR1cm4gJyc7CisgIH0pOworfQorCitmdW5jdGlvbiByZXBsYWNlKHJlZ2V4LCBvcHQpIHsKKyAgcmVnZXggPSByZWdleC5zb3VyY2U7CisgIG9wdCA9IG9wdCB8fCAnJzsKKyAgcmV0dXJuIGZ1bmN0aW9uIHNlbGYobmFtZSwgdmFsKSB7CisgICAgaWYgKCFuYW1lKSByZXR1cm4gbmV3IFJlZ0V4cChyZWdleCwgb3B0KTsKKyAgICB2YWwgPSB2YWwuc291cmNlIHx8IHZhbDsKKyAgICB2YWwgPSB2YWwucmVwbGFjZSgvKF58W15cW10pXF4vZywgJyQxJyk7CisgICAgcmVnZXggPSByZWdleC5yZXBsYWNlKG5hbWUsIHZhbCk7CisgICAgcmV0dXJuIHNlbGY7CisgIH07Cit9CisKK2Z1bmN0aW9uIG5vb3AoKSB7fQorbm9vcC5leGVjID0gbm9vcDsKKworZnVuY3Rpb24gbWVyZ2Uob2JqKSB7CisgIHZhciBpID0gMQorICAgICwgdGFyZ2V0CisgICAgLCBrZXk7CisKKyAgZm9yICg7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICB0YXJnZXQgPSBhcmd1bWVudHNbaV07CisgICAgZm9yIChrZXkgaW4gdGFyZ2V0KSB7CisgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwga2V5KSkgeworICAgICAgICBvYmpba2V5XSA9IHRhcmdldFtrZXldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBvYmo7Cit9CisKKworLyoqCisgKiBNYXJrZWQKKyAqLworCitmdW5jdGlvbiBtYXJrZWQoc3JjLCBvcHQsIGNhbGxiYWNrKSB7CisgIGlmIChjYWxsYmFjayB8fCB0eXBlb2Ygb3B0ID09PSAnZnVuY3Rpb24nKSB7CisgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgY2FsbGJhY2sgPSBvcHQ7CisgICAgICBvcHQgPSBudWxsOworICAgIH0KKworICAgIG9wdCA9IG1lcmdlKHt9LCBtYXJrZWQuZGVmYXVsdHMsIG9wdCB8fCB7fSk7CisKKyAgICB2YXIgaGlnaGxpZ2h0ID0gb3B0LmhpZ2hsaWdodAorICAgICAgLCB0b2tlbnMKKyAgICAgICwgcGVuZGluZworICAgICAgLCBpID0gMDsKKworICAgIHRyeSB7CisgICAgICB0b2tlbnMgPSBMZXhlci5sZXgoc3JjLCBvcHQpCisgICAgfSBjYXRjaCAoZSkgeworICAgICAgcmV0dXJuIGNhbGxiYWNrKGUpOworICAgIH0KKworICAgIHBlbmRpbmcgPSB0b2tlbnMubGVuZ3RoOworCisgICAgdmFyIGRvbmUgPSBmdW5jdGlvbihlcnIpIHsKKyAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgb3B0LmhpZ2hsaWdodCA9IGhpZ2hsaWdodDsKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7CisgICAgICB9CisKKyAgICAgIHZhciBvdXQ7CisKKyAgICAgIHRyeSB7CisgICAgICAgIG91dCA9IFBhcnNlci5wYXJzZSh0b2tlbnMsIG9wdCk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGVyciA9IGU7CisgICAgICB9CisKKyAgICAgIG9wdC5oaWdobGlnaHQgPSBoaWdobGlnaHQ7CisKKyAgICAgIHJldHVybiBlcnIKKyAgICAgICAgPyBjYWxsYmFjayhlcnIpCisgICAgICAgIDogY2FsbGJhY2sobnVsbCwgb3V0KTsKKyAgICB9OworCisgICAgaWYgKCFoaWdobGlnaHQgfHwgaGlnaGxpZ2h0Lmxlbmd0aCA8IDMpIHsKKyAgICAgIHJldHVybiBkb25lKCk7CisgICAgfQorCisgICAgZGVsZXRlIG9wdC5oaWdobGlnaHQ7CisKKyAgICBpZiAoIXBlbmRpbmcpIHJldHVybiBkb25lKCk7CisKKyAgICBmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworICAgICAgKGZ1bmN0aW9uKHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSAnY29kZScpIHsKKyAgICAgICAgICByZXR1cm4gLS1wZW5kaW5nIHx8IGRvbmUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGlnaGxpZ2h0KHRva2VuLnRleHQsIHRva2VuLmxhbmcsIGZ1bmN0aW9uKGVyciwgY29kZSkgeworICAgICAgICAgIGlmIChlcnIpIHJldHVybiBkb25lKGVycik7CisgICAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCB8fCBjb2RlID09PSB0b2tlbi50ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gLS1wZW5kaW5nIHx8IGRvbmUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdG9rZW4udGV4dCA9IGNvZGU7CisgICAgICAgICAgdG9rZW4uZXNjYXBlZCA9IHRydWU7CisgICAgICAgICAgLS1wZW5kaW5nIHx8IGRvbmUoKTsKKyAgICAgICAgfSk7CisgICAgICB9KSh0b2tlbnNbaV0pOworICAgIH0KKworICAgIHJldHVybjsKKyAgfQorICB0cnkgeworICAgIGlmIChvcHQpIG9wdCA9IG1lcmdlKHt9LCBtYXJrZWQuZGVmYXVsdHMsIG9wdCk7CisgICAgcmV0dXJuIFBhcnNlci5wYXJzZShMZXhlci5sZXgoc3JjLCBvcHQpLCBvcHQpOworICB9IGNhdGNoIChlKSB7CisgICAgZS5tZXNzYWdlICs9ICdcblBsZWFzZSByZXBvcnQgdGhpcyB0byBodHRwczovL2dpdGh1Yi5jb20vY2hqai9tYXJrZWQuJzsKKyAgICBpZiAoKG9wdCB8fCBtYXJrZWQuZGVmYXVsdHMpLnNpbGVudCkgeworICAgICAgcmV0dXJuICc8cD5BbiBlcnJvciBvY2N1cmVkOjwvcD48cHJlPicKKyAgICAgICAgKyBlc2NhcGUoZS5tZXNzYWdlICsgJycsIHRydWUpCisgICAgICAgICsgJzwvcHJlPic7CisgICAgfQorICAgIHRocm93IGU7CisgIH0KK30KKworLyoqCisgKiBPcHRpb25zCisgKi8KKworbWFya2VkLm9wdGlvbnMgPQorbWFya2VkLnNldE9wdGlvbnMgPSBmdW5jdGlvbihvcHQpIHsKKyAgbWVyZ2UobWFya2VkLmRlZmF1bHRzLCBvcHQpOworICByZXR1cm4gbWFya2VkOworfTsKKworbWFya2VkLmRlZmF1bHRzID0geworICBnZm06IHRydWUsCisgIHRhYmxlczogdHJ1ZSwKKyAgYnJlYWtzOiBmYWxzZSwKKyAgcGVkYW50aWM6IGZhbHNlLAorICBzYW5pdGl6ZTogZmFsc2UsCisgIHNtYXJ0TGlzdHM6IGZhbHNlLAorICBzaWxlbnQ6IGZhbHNlLAorICBoaWdobGlnaHQ6IG51bGwsCisgIGxhbmdQcmVmaXg6ICdsYW5nLScsCisgIHNtYXJ0eXBhbnRzOiBmYWxzZSwKKyAgaGVhZGVyUHJlZml4OiAnJywKKyAgcmVuZGVyZXI6IG5ldyBSZW5kZXJlciwKKyAgeGh0bWw6IGZhbHNlCit9OworCisvKioKKyAqIEV4cG9zZQorICovCisKK21hcmtlZC5QYXJzZXIgPSBQYXJzZXI7CittYXJrZWQucGFyc2VyID0gUGFyc2VyLnBhcnNlOworCittYXJrZWQuUmVuZGVyZXIgPSBSZW5kZXJlcjsKKworbWFya2VkLkxleGVyID0gTGV4ZXI7CittYXJrZWQubGV4ZXIgPSBMZXhlci5sZXg7CisKK21hcmtlZC5JbmxpbmVMZXhlciA9IElubGluZUxleGVyOworbWFya2VkLmlubGluZUxleGVyID0gSW5saW5lTGV4ZXIub3V0cHV0OworCittYXJrZWQucGFyc2UgPSBtYXJrZWQ7CisKK2lmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKKyAgbW9kdWxlLmV4cG9ydHMgPSBtYXJrZWQ7Cit9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgeworICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBtYXJrZWQ7IH0pOworfSBlbHNlIHsKKyAgdGhpcy5tYXJrZWQgPSBtYXJrZWQ7Cit9CisKK30pLmNhbGwoZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzIHx8ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCk7Cit9KCkpOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvc3dhZ2dlci1vYXV0aC5qcyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL3N3YWdnZXItb2F1dGguanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0YmRmOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL3N3YWdnZXItb2F1dGguanMKQEAgLTAsMCArMSwzMDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordmFyIGFwcE5hbWU7Cit2YXIgcG9wdXBNYXNrOwordmFyIHBvcHVwRGlhbG9nOwordmFyIGNsaWVudElkOwordmFyIHJlYWxtOwordmFyIG9hdXRoMktleU5hbWU7Cit2YXIgcmVkaXJlY3RfdXJpOworCitmdW5jdGlvbiBoYW5kbGVMb2dpbigpIHsKKyAgdmFyIHNjb3BlcyA9IFtdOworCisgIHZhciBhdXRocyA9IHdpbmRvdy5zd2FnZ2VyVWkuYXBpLmF1dGhTY2hlbWVzIHx8IHdpbmRvdy5zd2FnZ2VyVWkuYXBpLnNlY3VyaXR5RGVmaW5pdGlvbnM7CisgIGlmKGF1dGhzKSB7CisgICAgdmFyIGtleTsKKyAgICB2YXIgZGVmcyA9IGF1dGhzOworICAgIGZvcihrZXkgaW4gZGVmcykgeworICAgICAgdmFyIGF1dGggPSBkZWZzW2tleV07CisgICAgICBpZihhdXRoLnR5cGUgPT09ICdvYXV0aDInICYmIGF1dGguc2NvcGVzKSB7CisgICAgICAgIG9hdXRoMktleU5hbWUgPSBrZXk7CisgICAgICAgIHZhciBzY29wZTsKKyAgICAgICAgaWYoQXJyYXkuaXNBcnJheShhdXRoLnNjb3BlcykpIHsKKyAgICAgICAgICAvLyAxLjIgc3VwcG9ydAorICAgICAgICAgIHZhciBpOworICAgICAgICAgIGZvcihpID0gMDsgaSA8IGF1dGguc2NvcGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzY29wZXMucHVzaChhdXRoLnNjb3Blc1tpXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIDIuMCBzdXBwb3J0CisgICAgICAgICAgZm9yKHNjb3BlIGluIGF1dGguc2NvcGVzKSB7CisgICAgICAgICAgICBzY29wZXMucHVzaCh7c2NvcGU6IHNjb3BlLCBkZXNjcmlwdGlvbjogYXV0aC5zY29wZXNbc2NvcGVdfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYod2luZG93LnN3YWdnZXJVaS5hcGkKKyAgICAmJiB3aW5kb3cuc3dhZ2dlclVpLmFwaS5pbmZvKSB7CisgICAgYXBwTmFtZSA9IHdpbmRvdy5zd2FnZ2VyVWkuYXBpLmluZm8udGl0bGU7CisgIH0KKworICBwb3B1cERpYWxvZyA9ICQoCisgICAgWworICAgICAgJzxkaXYgY2xhc3M9ImFwaS1wb3B1cC1kaWFsb2ciPicsCisgICAgICAnPGRpdiBjbGFzcz0iYXBpLXBvcHVwLXRpdGxlIj5TZWxlY3QgT0F1dGgyLjAgU2NvcGVzPC9kaXY+JywKKyAgICAgICc8ZGl2IGNsYXNzPSJhcGktcG9wdXAtY29udGVudCI+JywKKyAgICAgICAgJzxwPlNjb3BlcyBhcmUgdXNlZCB0byBncmFudCBhbiBhcHBsaWNhdGlvbiBkaWZmZXJlbnQgbGV2ZWxzIG9mIGFjY2VzcyB0byBkYXRhIG9uIGJlaGFsZiBvZiB0aGUgZW5kIHVzZXIuIEVhY2ggQVBJIG1heSBkZWNsYXJlIG9uZSBvciBtb3JlIHNjb3Blcy4nLAorICAgICAgICAgICc8YSBocmVmPSIjIj5MZWFybiBob3cgdG8gdXNlPC9hPicsCisgICAgICAgICc8L3A+JywKKyAgICAgICAgJzxwPjxzdHJvbmc+JyArIGFwcE5hbWUgKyAnPC9zdHJvbmc+IEFQSSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHNjb3Blcy4gU2VsZWN0IHdoaWNoIG9uZXMgeW91IHdhbnQgdG8gZ3JhbnQgdG8gU3dhZ2dlciBVSS48L3A+JywKKyAgICAgICAgJzx1bCBjbGFzcz0iYXBpLXBvcHVwLXNjb3BlcyI+JywKKyAgICAgICAgJzwvdWw+JywKKyAgICAgICAgJzxwIGNsYXNzPSJlcnJvci1tc2ciPjwvcD4nLAorICAgICAgICAnPGRpdiBjbGFzcz0iYXBpLXBvcHVwLWFjdGlvbnMiPjxidXR0b24gY2xhc3M9ImFwaS1wb3B1cC1hdXRoYnRuIGFwaS1idXR0b24gZ3JlZW4iIHR5cGU9ImJ1dHRvbiI+QXV0aG9yaXplPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iYXBpLXBvcHVwLWNhbmNlbCBhcGktYnV0dG9uIGdyYXkiIHR5cGU9ImJ1dHRvbiI+Q2FuY2VsPC9idXR0b24+PC9kaXY+JywKKyAgICAgICc8L2Rpdj4nLAorICAgICAgJzwvZGl2PiddLmpvaW4oJycpKTsKKyAgJChkb2N1bWVudC5ib2R5KS5hcHBlbmQocG9wdXBEaWFsb2cpOworCisgIHBvcHVwID0gcG9wdXBEaWFsb2cuZmluZCgndWwuYXBpLXBvcHVwLXNjb3BlcycpLmVtcHR5KCk7CisgIGZvciAoaSA9IDA7IGkgPCBzY29wZXMubGVuZ3RoOyBpICsrKSB7CisgICAgc2NvcGUgPSBzY29wZXNbaV07CisgICAgc3RyID0gJzxsaT48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJzY29wZV8nICsgaSArICciIHNjb3BlPSInICsgc2NvcGUuc2NvcGUgKyAnIi8+JyArICc8bGFiZWwgZm9yPSJzY29wZV8nICsgaSArICciPicgKyBzY29wZS5zY29wZTsKKyAgICBpZiAoc2NvcGUuZGVzY3JpcHRpb24pIHsKKyAgICAgIHN0ciArPSAnPGJyLz48c3BhbiBjbGFzcz0iYXBpLXNjb3BlLWRlc2MiPicgKyBzY29wZS5kZXNjcmlwdGlvbiArICc8L3NwYW4+JzsKKyAgICB9CisgICAgc3RyICs9ICc8L2xhYmVsPjwvbGk+JzsKKyAgICBwb3B1cC5hcHBlbmQoc3RyKTsKKyAgfQorCisgIHZhciAkd2luID0gJCh3aW5kb3cpLAorICAgIGR3ID0gJHdpbi53aWR0aCgpLAorICAgIGRoID0gJHdpbi5oZWlnaHQoKSwKKyAgICBzdCA9ICR3aW4uc2Nyb2xsVG9wKCksCisgICAgZGxnV2QgPSBwb3B1cERpYWxvZy5vdXRlcldpZHRoKCksCisgICAgZGxnSHQgPSBwb3B1cERpYWxvZy5vdXRlckhlaWdodCgpLAorICAgIHRvcCA9IChkaCAtZGxnSHQpLzIgKyBzdCwKKyAgICBsZWZ0ID0gKGR3IC0gZGxnV2QpLzI7CisKKyAgcG9wdXBEaWFsb2cuY3NzKHsKKyAgICB0b3A6ICh0b3AgPCAwPyAwIDogdG9wKSArICdweCcsCisgICAgbGVmdDogKGxlZnQgPCAwPyAwIDogbGVmdCkgKyAncHgnCisgIH0pOworCisgIHBvcHVwRGlhbG9nLmZpbmQoJ2J1dHRvbi5hcGktcG9wdXAtY2FuY2VsJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgcG9wdXBNYXNrLmhpZGUoKTsKKyAgICBwb3B1cERpYWxvZy5oaWRlKCk7CisgICAgcG9wdXBEaWFsb2cuZW1wdHkoKTsKKyAgICBwb3B1cERpYWxvZyA9IFtdOworICB9KTsKKworICAkKCdidXR0b24uYXBpLXBvcHVwLWF1dGhidG4nKS51bmJpbmQoKTsKKyAgcG9wdXBEaWFsb2cuZmluZCgnYnV0dG9uLmFwaS1wb3B1cC1hdXRoYnRuJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgcG9wdXBNYXNrLmhpZGUoKTsKKyAgICBwb3B1cERpYWxvZy5oaWRlKCk7CisKKyAgICB2YXIgYXV0aFNjaGVtZXMgPSB3aW5kb3cuc3dhZ2dlclVpLmFwaS5hdXRoU2NoZW1lczsKKyAgICB2YXIgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICB2YXIgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZS5zdWJzdHJpbmcoMCwgbG9jYXRpb24ucGF0aG5hbWUubGFzdEluZGV4T2YoIi8iKSk7CisgICAgdmFyIGRlZmF1bHRSZWRpcmVjdFVybCA9IGhvc3QucHJvdG9jb2wgKyAnLy8nICsgaG9zdC5ob3N0ICsgcGF0aG5hbWUgKyAnL28yYy5odG1sJzsKKyAgICB2YXIgcmVkaXJlY3RVcmwgPSB3aW5kb3cub0F1dGhSZWRpcmVjdFVybCB8fCBkZWZhdWx0UmVkaXJlY3RVcmw7CisgICAgdmFyIHVybCA9IG51bGw7CisKKyAgICBmb3IgKHZhciBrZXkgaW4gYXV0aFNjaGVtZXMpIHsKKyAgICAgIGlmIChhdXRoU2NoZW1lcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgIHZhciBmbG93ID0gYXV0aFNjaGVtZXNba2V5XS5mbG93OworCisgICAgICAgIGlmKGF1dGhTY2hlbWVzW2tleV0udHlwZSA9PT0gJ29hdXRoMicgJiYgZmxvdyAmJiAoZmxvdyA9PT0gJ2ltcGxpY2l0JyB8fCBmbG93ID09PSAnYWNjZXNzQ29kZScpKSB7CisgICAgICAgICAgdmFyIGRldHMgPSBhdXRoU2NoZW1lc1trZXldOworICAgICAgICAgIHVybCA9IGRldHMuYXV0aG9yaXphdGlvblVybCArICc/cmVzcG9uc2VfdHlwZT0nICsgKGZsb3cgPT09ICdpbXBsaWNpdCcgPyAndG9rZW4nIDogJ2NvZGUnKTsKKyAgICAgICAgICB3aW5kb3cuc3dhZ2dlclVpLnRva2VuTmFtZSA9IGRldHMudG9rZW5OYW1lIHx8ICdhY2Nlc3NfdG9rZW4nOworICAgICAgICAgIHdpbmRvdy5zd2FnZ2VyVWkudG9rZW5VcmwgPSAoZmxvdyA9PT0gJ2FjY2Vzc0NvZGUnID8gZGV0cy50b2tlblVybCA6IG51bGwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoYXV0aFNjaGVtZXNba2V5XS5ncmFudFR5cGVzKSB7CisgICAgICAgICAgLy8gMS4yIHN1cHBvcnQKKyAgICAgICAgICB2YXIgbyA9IGF1dGhTY2hlbWVzW2tleV0uZ3JhbnRUeXBlczsKKyAgICAgICAgICBmb3IodmFyIHQgaW4gbykgeworICAgICAgICAgICAgaWYoby5oYXNPd25Qcm9wZXJ0eSh0KSAmJiB0ID09PSAnaW1wbGljaXQnKSB7CisgICAgICAgICAgICAgIHZhciBkZXRzID0gb1t0XTsKKyAgICAgICAgICAgICAgdmFyIGVwID0gZGV0cy5sb2dpbkVuZHBvaW50LnVybDsKKyAgICAgICAgICAgICAgdXJsID0gZGV0cy5sb2dpbkVuZHBvaW50LnVybCArICc/cmVzcG9uc2VfdHlwZT10b2tlbic7CisgICAgICAgICAgICAgIHdpbmRvdy5zd2FnZ2VyVWkudG9rZW5OYW1lID0gZGV0cy50b2tlbk5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvLmhhc093blByb3BlcnR5KHQpICYmIHQgPT09ICdhY2Nlc3NDb2RlJykgeworICAgICAgICAgICAgICB2YXIgZGV0cyA9IG9bdF07CisgICAgICAgICAgICAgIHZhciBlcCA9IGRldHMudG9rZW5SZXF1ZXN0RW5kcG9pbnQudXJsOworICAgICAgICAgICAgICB1cmwgPSBkZXRzLnRva2VuUmVxdWVzdEVuZHBvaW50LnVybCArICc/cmVzcG9uc2VfdHlwZT1jb2RlJzsKKyAgICAgICAgICAgICAgd2luZG93LnN3YWdnZXJVaS50b2tlbk5hbWUgPSBkZXRzLnRva2VuTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgdmFyIHNjb3BlcyA9IFtdCisgICAgdmFyIG8gPSAkKCcuYXBpLXBvcHVwLXNjb3BlcycpLmZpbmQoJ2lucHV0OmNoZWNrZWQnKTsKKworICAgIGZvcihrID0wOyBrIDwgby5sZW5ndGg7IGsrKykgeworICAgICAgdmFyIHNjb3BlID0gJChvW2tdKS5hdHRyKCdzY29wZScpOworCisgICAgICBpZiAoc2NvcGVzLmluZGV4T2Yoc2NvcGUpID09PSAtMSkKKyAgICAgICAgc2NvcGVzLnB1c2goc2NvcGUpOworICAgIH0KKworICAgIC8vIEltcGxpY2l0IGF1dGggcmVjb21tZW5kcyBhIHN0YXRlIHBhcmFtZXRlci4KKyAgICB2YXIgc3RhdGUgPSBNYXRoLnJhbmRvbSAoKTsKKworICAgIHdpbmRvdy5lbmFibGVkU2NvcGVzPXNjb3BlczsKKworICAgIHJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0VXJsOworCisgICAgdXJsICs9ICcmcmVkaXJlY3RfdXJpPScgKyBlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RVcmwpOworICAgIHVybCArPSAnJnJlYWxtPScgKyBlbmNvZGVVUklDb21wb25lbnQocmVhbG0pOworICAgIHVybCArPSAnJmNsaWVudF9pZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGNsaWVudElkKTsKKyAgICB1cmwgKz0gJyZzY29wZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNjb3Blcy5qb2luKCcgJykpOworICAgIHVybCArPSAnJnN0YXRlPScgKyBlbmNvZGVVUklDb21wb25lbnQoc3RhdGUpOworCisgICAgd2luZG93Lm9wZW4odXJsKTsKKyAgfSk7CisKKyAgcG9wdXBNYXNrLnNob3coKTsKKyAgcG9wdXBEaWFsb2cuc2hvdygpOworICByZXR1cm47Cit9CisKKworZnVuY3Rpb24gaGFuZGxlTG9nb3V0KCkgeworICBmb3Ioa2V5IGluIHdpbmRvdy5hdXRob3JpemF0aW9ucy5hdXRoeil7CisgICAgd2luZG93LmF1dGhvcml6YXRpb25zLnJlbW92ZShrZXkpCisgIH0KKyAgd2luZG93LmVuYWJsZWRTY29wZXMgPSBudWxsOworICAkKCcuYXBpLWljLmljLW9uJykuYWRkQ2xhc3MoJ2ljLW9mZicpOworICAkKCcuYXBpLWljLmljLW9uJykucmVtb3ZlQ2xhc3MoJ2ljLW9uJyk7CisKKyAgLy8gc2V0IHRoZSBpbmZvIGJveAorICAkKCcuYXBpLWljLmljLXdhcm5pbmcnKS5hZGRDbGFzcygnaWMtZXJyb3InKTsKKyAgJCgnLmFwaS1pYy5pYy13YXJuaW5nJykucmVtb3ZlQ2xhc3MoJ2ljLXdhcm5pbmcnKTsKK30KKworZnVuY3Rpb24gaW5pdE9BdXRoKG9wdHMpIHsKKyAgdmFyIG8gPSAob3B0c3x8e30pOworICB2YXIgZXJyb3JzID0gW107CisKKyAgYXBwTmFtZSA9IChvLmFwcE5hbWV8fGVycm9ycy5wdXNoKCdtaXNzaW5nIGFwcE5hbWUnKSk7CisgIHBvcHVwTWFzayA9IChvLnBvcHVwTWFza3x8JCgnI2FwaS1jb21tb24tbWFzaycpKTsKKyAgcG9wdXBEaWFsb2cgPSAoby5wb3B1cERpYWxvZ3x8JCgnLmFwaS1wb3B1cC1kaWFsb2cnKSk7CisgIGNsaWVudElkID0gKG8uY2xpZW50SWR8fGVycm9ycy5wdXNoKCdtaXNzaW5nIGNsaWVudCBpZCcpKTsKKyAgcmVhbG0gPSAoby5yZWFsbXx8ZXJyb3JzLnB1c2goJ21pc3NpbmcgcmVhbG0nKSk7CisKKyAgaWYoZXJyb3JzLmxlbmd0aCA+IDApeworICAgIGxvZygnYXV0aCB1bmFibGUgaW5pdGlhbGl6ZSBvYXV0aDogJyArIGVycm9ycyk7CisgICAgcmV0dXJuOworICB9CisKKyAgJCgncHJlIGNvZGUnKS5lYWNoKGZ1bmN0aW9uKGksIGUpIHtobGpzLmhpZ2hsaWdodEJsb2NrKGUpfSk7CisgICQoJy5hcGktaWMnKS51bmJpbmQoKTsKKyAgJCgnLmFwaS1pYycpLmNsaWNrKGZ1bmN0aW9uKHMpIHsKKyAgICBpZigkKHMudGFyZ2V0KS5oYXNDbGFzcygnaWMtb2ZmJykpCisgICAgICBoYW5kbGVMb2dpbigpOworICAgIGVsc2UgeworICAgICAgaGFuZGxlTG9nb3V0KCk7CisgICAgfQorICAgIGZhbHNlOworICB9KTsKK30KKword2luZG93LnByb2Nlc3NPQXV0aENvZGUgPSBmdW5jdGlvbiBwcm9jZXNzT0F1dGhDb2RlKGRhdGEpIHsKKyAgdmFyIHBhcmFtcyA9IHsKKyAgICAnY2xpZW50X2lkJzogY2xpZW50SWQsCisgICAgJ2NvZGUnOiBkYXRhLmNvZGUsCisgICAgJ2dyYW50X3R5cGUnOiAnYXV0aG9yaXphdGlvbl9jb2RlJywKKyAgICAncmVkaXJlY3RfdXJpJzogcmVkaXJlY3RfdXJpCisgIH0KKyAgJC5hamF4KAorICB7CisgICAgdXJsIDogd2luZG93LnN3YWdnZXJVaS50b2tlblVybCwKKyAgICB0eXBlOiAiUE9TVCIsCisgICAgZGF0YTogcGFyYW1zLAorICAgIHN1Y2Nlc3M6ZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywganFYSFIpCisgICAgeworICAgICAgb25PQXV0aENvbXBsZXRlKGRhdGEpOworICAgIH0sCisgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikKKyAgICB7CisgICAgICBvbk9BdXRoQ29tcGxldGUoIiIpOworICAgIH0KKyAgfSk7Cit9CisKK3dpbmRvdy5vbk9BdXRoQ29tcGxldGUgPSBmdW5jdGlvbiBvbk9BdXRoQ29tcGxldGUodG9rZW4pIHsKKyAgaWYodG9rZW4pIHsKKyAgICBpZih0b2tlbi5lcnJvcikgeworICAgICAgdmFyIGNoZWNrYm94ID0gJCgnaW5wdXRbdHlwZT1jaGVja2JveF0sLnNlY3VyZWQnKQorICAgICAgY2hlY2tib3guZWFjaChmdW5jdGlvbihwb3MpeworICAgICAgICBjaGVja2JveFtwb3NdLmNoZWNrZWQgPSBmYWxzZTsKKyAgICAgIH0pOworICAgICAgYWxlcnQodG9rZW4uZXJyb3IpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHZhciBiID0gdG9rZW5bd2luZG93LnN3YWdnZXJVaS50b2tlbk5hbWVdOworICAgICAgaWYoYil7CisgICAgICAgIC8vIGlmIGFsbCByb2xlcyBhcmUgc2F0aXNmaWVkCisgICAgICAgIHZhciBvID0gbnVsbDsKKyAgICAgICAgJC5lYWNoKCQoJy5hdXRoICNhcGlfaW5mb3JtYXRpb25fcGFuZWwnKSwgZnVuY3Rpb24oaywgdikgeworICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHY7CisgICAgICAgICAgaWYoY2hpbGRyZW4gJiYgY2hpbGRyZW4uY2hpbGROb2RlcykgeworICAgICAgICAgICAgdmFyIHJlcXVpcmVkU2NvcGVzID0gW107CisgICAgICAgICAgICAkLmVhY2goKGNoaWxkcmVuLmNoaWxkTm9kZXMpLCBmdW5jdGlvbiAoazEsIHYxKXsKKyAgICAgICAgICAgICAgdmFyIGlubmVyID0gdjEuaW5uZXJIVE1MOworICAgICAgICAgICAgICBpZihpbm5lcikKKyAgICAgICAgICAgICAgICByZXF1aXJlZFNjb3Blcy5wdXNoKGlubmVyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdmFyIGRpZmYgPSBbXTsKKyAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgcmVxdWlyZWRTY29wZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgdmFyIHMgPSByZXF1aXJlZFNjb3Blc1tpXTsKKyAgICAgICAgICAgICAgaWYod2luZG93LmVuYWJsZWRTY29wZXMgJiYgd2luZG93LmVuYWJsZWRTY29wZXMuaW5kZXhPZihzKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGRpZmYucHVzaChzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoZGlmZi5sZW5ndGggPiAwKXsKKyAgICAgICAgICAgICAgbyA9IHYucGFyZW50Tm9kZTsKKyAgICAgICAgICAgICAgJChvLnBhcmVudE5vZGUpLmZpbmQoJy5hcGktaWMuaWMtb24nKS5hZGRDbGFzcygnaWMtb2ZmJyk7CisgICAgICAgICAgICAgICQoby5wYXJlbnROb2RlKS5maW5kKCcuYXBpLWljLmljLW9uJykucmVtb3ZlQ2xhc3MoJ2ljLW9uJyk7CisKKyAgICAgICAgICAgICAgLy8gc29ycnksIG5vdCBhbGwgc2NvcGVzIGFyZSBzYXRpc2ZpZWQKKyAgICAgICAgICAgICAgJChvKS5maW5kKCcuYXBpLWljJykuYWRkQ2xhc3MoJ2ljLXdhcm5pbmcnKTsKKyAgICAgICAgICAgICAgJChvKS5maW5kKCcuYXBpLWljJykucmVtb3ZlQ2xhc3MoJ2ljLWVycm9yJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgbyA9IHYucGFyZW50Tm9kZTsKKyAgICAgICAgICAgICAgJChvLnBhcmVudE5vZGUpLmZpbmQoJy5hcGktaWMuaWMtb2ZmJykuYWRkQ2xhc3MoJ2ljLW9uJyk7CisgICAgICAgICAgICAgICQoby5wYXJlbnROb2RlKS5maW5kKCcuYXBpLWljLmljLW9mZicpLnJlbW92ZUNsYXNzKCdpYy1vZmYnKTsKKworICAgICAgICAgICAgICAvLyBhbGwgc2NvcGVzIGFyZSBzYXRpc2ZpZWQKKyAgICAgICAgICAgICAgJChvKS5maW5kKCcuYXBpLWljJykuYWRkQ2xhc3MoJ2ljLWluZm8nKTsKKyAgICAgICAgICAgICAgJChvKS5maW5kKCcuYXBpLWljJykucmVtb3ZlQ2xhc3MoJ2ljLXdhcm5pbmcnKTsKKyAgICAgICAgICAgICAgJChvKS5maW5kKCcuYXBpLWljJykucmVtb3ZlQ2xhc3MoJ2ljLWVycm9yJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgd2luZG93LmF1dGhvcml6YXRpb25zLmFkZChvYXV0aDJLZXlOYW1lLCBuZXcgQXBpS2V5QXV0aG9yaXphdGlvbignQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGIsICdoZWFkZXInKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi91bmRlcnNjb3JlLW1pbi5qcyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL3VuZGVyc2NvcmUtbWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2Y3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL2xpYi91bmRlcnNjb3JlLW1pbi5qcwpAQCAtMCwwICsxLDI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8vICAgICBVbmRlcnNjb3JlLmpzIDEuNy4wCisvLyAgICAgaHR0cDovL3VuZGVyc2NvcmVqcy5vcmcKKy8vICAgICAoYykgMjAwOS0yMDE0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCisvLyAgICAgVW5kZXJzY29yZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KKyhmdW5jdGlvbigpe3ZhciBuPXRoaXMsdD1uLl8scj1BcnJheS5wcm90b3R5cGUsZT1PYmplY3QucHJvdG90eXBlLHU9RnVuY3Rpb24ucHJvdG90eXBlLGk9ci5wdXNoLGE9ci5zbGljZSxvPXIuY29uY2F0LGw9ZS50b1N0cmluZyxjPWUuaGFzT3duUHJvcGVydHksZj1BcnJheS5pc0FycmF5LHM9T2JqZWN0LmtleXMscD11LmJpbmQsaD1mdW5jdGlvbihuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIGg/bjp0aGlzIGluc3RhbmNlb2YgaD92b2lkKHRoaXMuX3dyYXBwZWQ9bik6bmV3IGgobil9OyJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz8oInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYoZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1oKSxleHBvcnRzLl89aCk6bi5fPWgsaC5WRVJTSU9OPSIxLjcuMCI7dmFyIGc9ZnVuY3Rpb24obix0LHIpe2lmKHQ9PT12b2lkIDApcmV0dXJuIG47c3dpdGNoKG51bGw9PXI/MzpyKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBuLmNhbGwodCxyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLGUpe3JldHVybiBuLmNhbGwodCxyLGUpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsZSx1KXtyZXR1cm4gbi5jYWxsKHQscixlLHUpfTtjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKHIsZSx1LGkpe3JldHVybiBuLmNhbGwodCxyLGUsdSxpKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodCxhcmd1bWVudHMpfX07aC5pdGVyYXRlZT1mdW5jdGlvbihuLHQscil7cmV0dXJuIG51bGw9PW4/aC5pZGVudGl0eTpoLmlzRnVuY3Rpb24obik/ZyhuLHQscik6aC5pc09iamVjdChuKT9oLm1hdGNoZXMobik6aC5wcm9wZXJ0eShuKX0saC5lYWNoPWguZm9yRWFjaD1mdW5jdGlvbihuLHQscil7aWYobnVsbD09bilyZXR1cm4gbjt0PWcodCxyKTt2YXIgZSx1PW4ubGVuZ3RoO2lmKHU9PT0rdSlmb3IoZT0wO3U+ZTtlKyspdChuW2VdLGUsbik7ZWxzZXt2YXIgaT1oLmtleXMobik7Zm9yKGU9MCx1PWkubGVuZ3RoO3U+ZTtlKyspdChuW2lbZV1dLGlbZV0sbil9cmV0dXJuIG59LGgubWFwPWguY29sbGVjdD1mdW5jdGlvbihuLHQscil7aWYobnVsbD09bilyZXR1cm5bXTt0PWguaXRlcmF0ZWUodCxyKTtmb3IodmFyIGUsdT1uLmxlbmd0aCE9PStuLmxlbmd0aCYmaC5rZXlzKG4pLGk9KHV8fG4pLmxlbmd0aCxhPUFycmF5KGkpLG89MDtpPm87bysrKWU9dT91W29dOm8sYVtvXT10KG5bZV0sZSxuKTtyZXR1cm4gYX07dmFyIHY9IlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiO2gucmVkdWNlPWguZm9sZGw9aC5pbmplY3Q9ZnVuY3Rpb24obix0LHIsZSl7bnVsbD09biYmKG49W10pLHQ9Zyh0LGUsNCk7dmFyIHUsaT1uLmxlbmd0aCE9PStuLmxlbmd0aCYmaC5rZXlzKG4pLGE9KGl8fG4pLmxlbmd0aCxvPTA7aWYoYXJndW1lbnRzLmxlbmd0aDwzKXtpZighYSl0aHJvdyBuZXcgVHlwZUVycm9yKHYpO3I9bltpP2lbbysrXTpvKytdfWZvcig7YT5vO28rKyl1PWk/aVtvXTpvLHI9dChyLG5bdV0sdSxuKTtyZXR1cm4gcn0saC5yZWR1Y2VSaWdodD1oLmZvbGRyPWZ1bmN0aW9uKG4sdCxyLGUpe251bGw9PW4mJihuPVtdKSx0PWcodCxlLDQpO3ZhciB1LGk9bi5sZW5ndGghPT0rbi5sZW5ndGgmJmgua2V5cyhuKSxhPShpfHxuKS5sZW5ndGg7aWYoYXJndW1lbnRzLmxlbmd0aDwzKXtpZighYSl0aHJvdyBuZXcgVHlwZUVycm9yKHYpO3I9bltpP2lbLS1hXTotLWFdfWZvcig7YS0tOyl1PWk/aVthXTphLHI9dChyLG5bdV0sdSxuKTtyZXR1cm4gcn0saC5maW5kPWguZGV0ZWN0PWZ1bmN0aW9uKG4sdCxyKXt2YXIgZTtyZXR1cm4gdD1oLml0ZXJhdGVlKHQsciksaC5zb21lKG4sZnVuY3Rpb24obixyLHUpe3JldHVybiB0KG4scix1KT8oZT1uLCEwKTp2b2lkIDB9KSxlfSxoLmZpbHRlcj1oLnNlbGVjdD1mdW5jdGlvbihuLHQscil7dmFyIGU9W107cmV0dXJuIG51bGw9PW4/ZToodD1oLml0ZXJhdGVlKHQsciksaC5lYWNoKG4sZnVuY3Rpb24obixyLHUpe3QobixyLHUpJiZlLnB1c2gobil9KSxlKX0saC5yZWplY3Q9ZnVuY3Rpb24obix0LHIpe3JldHVybiBoLmZpbHRlcihuLGgubmVnYXRlKGguaXRlcmF0ZWUodCkpLHIpfSxoLmV2ZXJ5PWguYWxsPWZ1bmN0aW9uKG4sdCxyKXtpZihudWxsPT1uKXJldHVybiEwO3Q9aC5pdGVyYXRlZSh0LHIpO3ZhciBlLHUsaT1uLmxlbmd0aCE9PStuLmxlbmd0aCYmaC5rZXlzKG4pLGE9KGl8fG4pLmxlbmd0aDtmb3IoZT0wO2E+ZTtlKyspaWYodT1pP2lbZV06ZSwhdChuW3VdLHUsbikpcmV0dXJuITE7cmV0dXJuITB9LGguc29tZT1oLmFueT1mdW5jdGlvbihuLHQscil7aWYobnVsbD09bilyZXR1cm4hMTt0PWguaXRlcmF0ZWUodCxyKTt2YXIgZSx1LGk9bi5sZW5ndGghPT0rbi5sZW5ndGgmJmgua2V5cyhuKSxhPShpfHxuKS5sZW5ndGg7Zm9yKGU9MDthPmU7ZSsrKWlmKHU9aT9pW2VdOmUsdChuW3VdLHUsbikpcmV0dXJuITA7cmV0dXJuITF9LGguY29udGFpbnM9aC5pbmNsdWRlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGw9PW4/ITE6KG4ubGVuZ3RoIT09K24ubGVuZ3RoJiYobj1oLnZhbHVlcyhuKSksaC5pbmRleE9mKG4sdCk+PTApfSxoLmludm9rZT1mdW5jdGlvbihuLHQpe3ZhciByPWEuY2FsbChhcmd1bWVudHMsMiksZT1oLmlzRnVuY3Rpb24odCk7cmV0dXJuIGgubWFwKG4sZnVuY3Rpb24obil7cmV0dXJuKGU/dDpuW3RdKS5hcHBseShuLHIpfSl9LGgucGx1Y2s9ZnVuY3Rpb24obix0KXtyZXR1cm4gaC5tYXAobixoLnByb3BlcnR5KHQpKX0saC53aGVyZT1mdW5jdGlvbihuLHQpe3JldHVybiBoLmZpbHRlcihuLGgubWF0Y2hlcyh0KSl9LGguZmluZFdoZXJlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGguZmluZChuLGgubWF0Y2hlcyh0KSl9LGgubWF4PWZ1bmN0aW9uKG4sdCxyKXt2YXIgZSx1LGk9LTEvMCxhPS0xLzA7aWYobnVsbD09dCYmbnVsbCE9bil7bj1uLmxlbmd0aD09PStuLmxlbmd0aD9uOmgudmFsdWVzKG4pO2Zvcih2YXIgbz0wLGw9bi5sZW5ndGg7bD5vO28rKyllPW5bb10sZT5pJiYoaT1lKX1lbHNlIHQ9aC5pdGVyYXRlZSh0LHIpLGguZWFjaChuLGZ1bmN0aW9uKG4scixlKXt1PXQobixyLGUpLCh1PmF8fHU9PT0tMS8wJiZpPT09LTEvMCkmJihpPW4sYT11KX0pO3JldHVybiBpfSxoLm1pbj1mdW5jdGlvbihuLHQscil7dmFyIGUsdSxpPTEvMCxhPTEvMDtpZihudWxsPT10JiZudWxsIT1uKXtuPW4ubGVuZ3RoPT09K24ubGVuZ3RoP246aC52YWx1ZXMobik7Zm9yKHZhciBvPTAsbD1uLmxlbmd0aDtsPm87bysrKWU9bltvXSxpPmUmJihpPWUpfWVsc2UgdD1oLml0ZXJhdGVlKHQsciksaC5lYWNoKG4sZnVuY3Rpb24obixyLGUpe3U9dChuLHIsZSksKGE+dXx8MS8wPT09dSYmMS8wPT09aSkmJihpPW4sYT11KX0pO3JldHVybiBpfSxoLnNodWZmbGU9ZnVuY3Rpb24obil7Zm9yKHZhciB0LHI9biYmbi5sZW5ndGg9PT0rbi5sZW5ndGg/bjpoLnZhbHVlcyhuKSxlPXIubGVuZ3RoLHU9QXJyYXkoZSksaT0wO2U+aTtpKyspdD1oLnJhbmRvbSgwLGkpLHQhPT1pJiYodVtpXT11W3RdKSx1W3RdPXJbaV07cmV0dXJuIHV9LGguc2FtcGxlPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbnVsbD09dHx8cj8obi5sZW5ndGghPT0rbi5sZW5ndGgmJihuPWgudmFsdWVzKG4pKSxuW2gucmFuZG9tKG4ubGVuZ3RoLTEpXSk6aC5zaHVmZmxlKG4pLnNsaWNlKDAsTWF0aC5tYXgoMCx0KSl9LGguc29ydEJ5PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gdD1oLml0ZXJhdGVlKHQsciksaC5wbHVjayhoLm1hcChuLGZ1bmN0aW9uKG4scixlKXtyZXR1cm57dmFsdWU6bixpbmRleDpyLGNyaXRlcmlhOnQobixyLGUpfX0pLnNvcnQoZnVuY3Rpb24obix0KXt2YXIgcj1uLmNyaXRlcmlhLGU9dC5jcml0ZXJpYTtpZihyIT09ZSl7aWYocj5lfHxyPT09dm9pZCAwKXJldHVybiAxO2lmKGU+cnx8ZT09PXZvaWQgMClyZXR1cm4tMX1yZXR1cm4gbi5pbmRleC10LmluZGV4fSksInZhbHVlIil9O3ZhciBtPWZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbih0LHIsZSl7dmFyIHU9e307cmV0dXJuIHI9aC5pdGVyYXRlZShyLGUpLGguZWFjaCh0LGZ1bmN0aW9uKGUsaSl7dmFyIGE9cihlLGksdCk7bih1LGUsYSl9KSx1fX07aC5ncm91cEJ5PW0oZnVuY3Rpb24obix0LHIpe2guaGFzKG4scik/bltyXS5wdXNoKHQpOm5bcl09W3RdfSksaC5pbmRleEJ5PW0oZnVuY3Rpb24obix0LHIpe25bcl09dH0pLGguY291bnRCeT1tKGZ1bmN0aW9uKG4sdCxyKXtoLmhhcyhuLHIpP25bcl0rKzpuW3JdPTF9KSxoLnNvcnRlZEluZGV4PWZ1bmN0aW9uKG4sdCxyLGUpe3I9aC5pdGVyYXRlZShyLGUsMSk7Zm9yKHZhciB1PXIodCksaT0wLGE9bi5sZW5ndGg7YT5pOyl7dmFyIG89aSthPj4+MTtyKG5bb10pPHU/aT1vKzE6YT1vfXJldHVybiBpfSxoLnRvQXJyYXk9ZnVuY3Rpb24obil7cmV0dXJuIG4/aC5pc0FycmF5KG4pP2EuY2FsbChuKTpuLmxlbmd0aD09PStuLmxlbmd0aD9oLm1hcChuLGguaWRlbnRpdHkpOmgudmFsdWVzKG4pOltdfSxoLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW4/MDpuLmxlbmd0aD09PStuLmxlbmd0aD9uLmxlbmd0aDpoLmtleXMobikubGVuZ3RofSxoLnBhcnRpdGlvbj1mdW5jdGlvbihuLHQscil7dD1oLml0ZXJhdGVlKHQscik7dmFyIGU9W10sdT1bXTtyZXR1cm4gaC5lYWNoKG4sZnVuY3Rpb24obixyLGkpeyh0KG4scixpKT9lOnUpLnB1c2gobil9KSxbZSx1XX0saC5maXJzdD1oLmhlYWQ9aC50YWtlPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbnVsbD09bj92b2lkIDA6bnVsbD09dHx8cj9uWzBdOjA+dD9bXTphLmNhbGwobiwwLHQpfSxoLmluaXRpYWw9ZnVuY3Rpb24obix0LHIpe3JldHVybiBhLmNhbGwobiwwLE1hdGgubWF4KDAsbi5sZW5ndGgtKG51bGw9PXR8fHI/MTp0KSkpfSxoLmxhc3Q9ZnVuY3Rpb24obix0LHIpe3JldHVybiBudWxsPT1uP3ZvaWQgMDpudWxsPT10fHxyP25bbi5sZW5ndGgtMV06YS5jYWxsKG4sTWF0aC5tYXgobi5sZW5ndGgtdCwwKSl9LGgucmVzdD1oLnRhaWw9aC5kcm9wPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gYS5jYWxsKG4sbnVsbD09dHx8cj8xOnQpfSxoLmNvbXBhY3Q9ZnVuY3Rpb24obil7cmV0dXJuIGguZmlsdGVyKG4saC5pZGVudGl0eSl9O3ZhciB5PWZ1bmN0aW9uKG4sdCxyLGUpe2lmKHQmJmguZXZlcnkobixoLmlzQXJyYXkpKXJldHVybiBvLmFwcGx5KGUsbik7Zm9yKHZhciB1PTAsYT1uLmxlbmd0aDthPnU7dSsrKXt2YXIgbD1uW3VdO2guaXNBcnJheShsKXx8aC5pc0FyZ3VtZW50cyhsKT90P2kuYXBwbHkoZSxsKTp5KGwsdCxyLGUpOnJ8fGUucHVzaChsKX1yZXR1cm4gZX07aC5mbGF0dGVuPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHkobix0LCExLFtdKX0saC53aXRob3V0PWZ1bmN0aW9uKG4pe3JldHVybiBoLmRpZmZlcmVuY2UobixhLmNhbGwoYXJndW1lbnRzLDEpKX0saC51bmlxPWgudW5pcXVlPWZ1bmN0aW9uKG4sdCxyLGUpe2lmKG51bGw9PW4pcmV0dXJuW107aC5pc0Jvb2xlYW4odCl8fChlPXIscj10LHQ9ITEpLG51bGwhPXImJihyPWguaXRlcmF0ZWUocixlKSk7Zm9yKHZhciB1PVtdLGk9W10sYT0wLG89bi5sZW5ndGg7bz5hO2ErKyl7dmFyIGw9blthXTtpZih0KWEmJmk9PT1sfHx1LnB1c2gobCksaT1sO2Vsc2UgaWYocil7dmFyIGM9cihsLGEsbik7aC5pbmRleE9mKGksYyk8MCYmKGkucHVzaChjKSx1LnB1c2gobCkpfWVsc2UgaC5pbmRleE9mKHUsbCk8MCYmdS5wdXNoKGwpfXJldHVybiB1fSxoLnVuaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGgudW5pcSh5KGFyZ3VtZW50cywhMCwhMCxbXSkpfSxoLmludGVyc2VjdGlvbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybltdO2Zvcih2YXIgdD1bXSxyPWFyZ3VtZW50cy5sZW5ndGgsZT0wLHU9bi5sZW5ndGg7dT5lO2UrKyl7dmFyIGk9bltlXTtpZighaC5jb250YWlucyh0LGkpKXtmb3IodmFyIGE9MTtyPmEmJmguY29udGFpbnMoYXJndW1lbnRzW2FdLGkpO2ErKyk7YT09PXImJnQucHVzaChpKX19cmV0dXJuIHR9LGguZGlmZmVyZW5jZT1mdW5jdGlvbihuKXt2YXIgdD15KGEuY2FsbChhcmd1bWVudHMsMSksITAsITAsW10pO3JldHVybiBoLmZpbHRlcihuLGZ1bmN0aW9uKG4pe3JldHVybiFoLmNvbnRhaW5zKHQsbil9KX0saC56aXA9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm5bXTtmb3IodmFyIHQ9aC5tYXgoYXJndW1lbnRzLCJsZW5ndGgiKS5sZW5ndGgscj1BcnJheSh0KSxlPTA7dD5lO2UrKylyW2VdPWgucGx1Y2soYXJndW1lbnRzLGUpO3JldHVybiByfSxoLm9iamVjdD1mdW5jdGlvbihuLHQpe2lmKG51bGw9PW4pcmV0dXJue307Zm9yKHZhciByPXt9LGU9MCx1PW4ubGVuZ3RoO3U+ZTtlKyspdD9yW25bZV1dPXRbZV06cltuW2VdWzBdXT1uW2VdWzFdO3JldHVybiByfSxoLmluZGV4T2Y9ZnVuY3Rpb24obix0LHIpe2lmKG51bGw9PW4pcmV0dXJuLTE7dmFyIGU9MCx1PW4ubGVuZ3RoO2lmKHIpe2lmKCJudW1iZXIiIT10eXBlb2YgcilyZXR1cm4gZT1oLnNvcnRlZEluZGV4KG4sdCksbltlXT09PXQ/ZTotMTtlPTA+cj9NYXRoLm1heCgwLHUrcik6cn1mb3IoO3U+ZTtlKyspaWYobltlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LGgubGFzdEluZGV4T2Y9ZnVuY3Rpb24obix0LHIpe2lmKG51bGw9PW4pcmV0dXJuLTE7dmFyIGU9bi5sZW5ndGg7Zm9yKCJudW1iZXIiPT10eXBlb2YgciYmKGU9MD5yP2UrcisxOk1hdGgubWluKGUscisxKSk7LS1lPj0wOylpZihuW2VdPT09dClyZXR1cm4gZTtyZXR1cm4tMX0saC5yYW5nZT1mdW5jdGlvbihuLHQscil7YXJndW1lbnRzLmxlbmd0aDw9MSYmKHQ9bnx8MCxuPTApLHI9cnx8MTtmb3IodmFyIGU9TWF0aC5tYXgoTWF0aC5jZWlsKCh0LW4pL3IpLDApLHU9QXJyYXkoZSksaT0wO2U+aTtpKyssbis9cil1W2ldPW47cmV0dXJuIHV9O3ZhciBkPWZ1bmN0aW9uKCl7fTtoLmJpbmQ9ZnVuY3Rpb24obix0KXt2YXIgcixlO2lmKHAmJm4uYmluZD09PXApcmV0dXJuIHAuYXBwbHkobixhLmNhbGwoYXJndW1lbnRzLDEpKTtpZighaC5pc0Z1bmN0aW9uKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIkJpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbiIpO3JldHVybiByPWEuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGUpKXJldHVybiBuLmFwcGx5KHQsci5jb25jYXQoYS5jYWxsKGFyZ3VtZW50cykpKTtkLnByb3RvdHlwZT1uLnByb3RvdHlwZTt2YXIgdT1uZXcgZDtkLnByb3RvdHlwZT1udWxsO3ZhciBpPW4uYXBwbHkodSxyLmNvbmNhdChhLmNhbGwoYXJndW1lbnRzKSkpO3JldHVybiBoLmlzT2JqZWN0KGkpP2k6dX19LGgucGFydGlhbD1mdW5jdGlvbihuKXt2YXIgdD1hLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgcj0wLGU9dC5zbGljZSgpLHU9MCxpPWUubGVuZ3RoO2k+dTt1KyspZVt1XT09PWgmJihlW3VdPWFyZ3VtZW50c1tyKytdKTtmb3IoO3I8YXJndW1lbnRzLmxlbmd0aDspZS5wdXNoKGFyZ3VtZW50c1tyKytdKTtyZXR1cm4gbi5hcHBseSh0aGlzLGUpfX0saC5iaW5kQWxsPWZ1bmN0aW9uKG4pe3ZhciB0LHIsZT1hcmd1bWVudHMubGVuZ3RoO2lmKDE+PWUpdGhyb3cgbmV3IEVycm9yKCJiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzIik7Zm9yKHQ9MTtlPnQ7dCsrKXI9YXJndW1lbnRzW3RdLG5bcl09aC5iaW5kKG5bcl0sbik7cmV0dXJuIG59LGgubWVtb2l6ZT1mdW5jdGlvbihuLHQpe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB1PXIuY2FjaGUsaT10P3QuYXBwbHkodGhpcyxhcmd1bWVudHMpOmU7cmV0dXJuIGguaGFzKHUsaSl8fCh1W2ldPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx1W2ldfTtyZXR1cm4gci5jYWNoZT17fSxyfSxoLmRlbGF5PWZ1bmN0aW9uKG4sdCl7dmFyIHI9YS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBuLmFwcGx5KG51bGwscil9LHQpfSxoLmRlZmVyPWZ1bmN0aW9uKG4pe3JldHVybiBoLmRlbGF5LmFwcGx5KGgsW24sMV0uY29uY2F0KGEuY2FsbChhcmd1bWVudHMsMSkpKX0saC50aHJvdHRsZT1mdW5jdGlvbihuLHQscil7dmFyIGUsdSxpLGE9bnVsbCxvPTA7cnx8KHI9e30pO3ZhciBsPWZ1bmN0aW9uKCl7bz1yLmxlYWRpbmc9PT0hMT8wOmgubm93KCksYT1udWxsLGk9bi5hcHBseShlLHUpLGF8fChlPXU9bnVsbCl9O3JldHVybiBmdW5jdGlvbigpe3ZhciBjPWgubm93KCk7b3x8ci5sZWFkaW5nIT09ITF8fChvPWMpO3ZhciBmPXQtKGMtbyk7cmV0dXJuIGU9dGhpcyx1PWFyZ3VtZW50cywwPj1mfHxmPnQ/KGNsZWFyVGltZW91dChhKSxhPW51bGwsbz1jLGk9bi5hcHBseShlLHUpLGF8fChlPXU9bnVsbCkpOmF8fHIudHJhaWxpbmc9PT0hMXx8KGE9c2V0VGltZW91dChsLGYpKSxpfX0saC5kZWJvdW5jZT1mdW5jdGlvbihuLHQscil7dmFyIGUsdSxpLGEsbyxsPWZ1bmN0aW9uKCl7dmFyIGM9aC5ub3coKS1hO3Q+YyYmYz4wP2U9c2V0VGltZW91dChsLHQtYyk6KGU9bnVsbCxyfHwobz1uLmFwcGx5KGksdSksZXx8KGk9dT1udWxsKSkpfTtyZXR1cm4gZnVuY3Rpb24oKXtpPXRoaXMsdT1hcmd1bWVudHMsYT1oLm5vdygpO3ZhciBjPXImJiFlO3JldHVybiBlfHwoZT1zZXRUaW1lb3V0KGwsdCkpLGMmJihvPW4uYXBwbHkoaSx1KSxpPXU9bnVsbCksb319LGgud3JhcD1mdW5jdGlvbihuLHQpe3JldHVybiBoLnBhcnRpYWwodCxuKX0saC5uZWdhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0saC5jb21wb3NlPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLHQ9bi5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHI9dCxlPW5bdF0uYXBwbHkodGhpcyxhcmd1bWVudHMpO3ItLTspZT1uW3JdLmNhbGwodGhpcyxlKTtyZXR1cm4gZX19LGguYWZ0ZXI9ZnVuY3Rpb24obix0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tLW48MT90LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp2b2lkIDB9fSxoLmJlZm9yZT1mdW5jdGlvbihuLHQpe3ZhciByO3JldHVybiBmdW5jdGlvbigpe3JldHVybi0tbj4wP3I9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dD1udWxsLHJ9fSxoLm9uY2U9aC5wYXJ0aWFsKGguYmVmb3JlLDIpLGgua2V5cz1mdW5jdGlvbihuKXtpZighaC5pc09iamVjdChuKSlyZXR1cm5bXTtpZihzKXJldHVybiBzKG4pO3ZhciB0PVtdO2Zvcih2YXIgciBpbiBuKWguaGFzKG4scikmJnQucHVzaChyKTtyZXR1cm4gdH0saC52YWx1ZXM9ZnVuY3Rpb24obil7Zm9yKHZhciB0PWgua2V5cyhuKSxyPXQubGVuZ3RoLGU9QXJyYXkociksdT0wO3I+dTt1KyspZVt1XT1uW3RbdV1dO3JldHVybiBlfSxoLnBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1oLmtleXMobikscj10Lmxlbmd0aCxlPUFycmF5KHIpLHU9MDtyPnU7dSsrKWVbdV09W3RbdV0sblt0W3VdXV07cmV0dXJuIGV9LGguaW52ZXJ0PWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD17fSxyPWgua2V5cyhuKSxlPTAsdT1yLmxlbmd0aDt1PmU7ZSsrKXRbbltyW2VdXV09cltlXTtyZXR1cm4gdH0saC5mdW5jdGlvbnM9aC5tZXRob2RzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgciBpbiBuKWguaXNGdW5jdGlvbihuW3JdKSYmdC5wdXNoKHIpO3JldHVybiB0LnNvcnQoKX0saC5leHRlbmQ9ZnVuY3Rpb24obil7aWYoIWguaXNPYmplY3QobikpcmV0dXJuIG47Zm9yKHZhciB0LHIsZT0xLHU9YXJndW1lbnRzLmxlbmd0aDt1PmU7ZSsrKXt0PWFyZ3VtZW50c1tlXTtmb3IociBpbiB0KWMuY2FsbCh0LHIpJiYobltyXT10W3JdKX1yZXR1cm4gbn0saC5waWNrPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZSx1PXt9O2lmKG51bGw9PW4pcmV0dXJuIHU7aWYoaC5pc0Z1bmN0aW9uKHQpKXt0PWcodCxyKTtmb3IoZSBpbiBuKXt2YXIgaT1uW2VdO3QoaSxlLG4pJiYodVtlXT1pKX19ZWxzZXt2YXIgbD1vLmFwcGx5KFtdLGEuY2FsbChhcmd1bWVudHMsMSkpO249bmV3IE9iamVjdChuKTtmb3IodmFyIGM9MCxmPWwubGVuZ3RoO2Y+YztjKyspZT1sW2NdLGUgaW4gbiYmKHVbZV09bltlXSl9cmV0dXJuIHV9LGgub21pdD1mdW5jdGlvbihuLHQscil7aWYoaC5pc0Z1bmN0aW9uKHQpKXQ9aC5uZWdhdGUodCk7ZWxzZXt2YXIgZT1oLm1hcChvLmFwcGx5KFtdLGEuY2FsbChhcmd1bWVudHMsMSkpLFN0cmluZyk7dD1mdW5jdGlvbihuLHQpe3JldHVybiFoLmNvbnRhaW5zKGUsdCl9fXJldHVybiBoLnBpY2sobix0LHIpfSxoLmRlZmF1bHRzPWZ1bmN0aW9uKG4pe2lmKCFoLmlzT2JqZWN0KG4pKXJldHVybiBuO2Zvcih2YXIgdD0xLHI9YXJndW1lbnRzLmxlbmd0aDtyPnQ7dCsrKXt2YXIgZT1hcmd1bWVudHNbdF07Zm9yKHZhciB1IGluIGUpblt1XT09PXZvaWQgMCYmKG5bdV09ZVt1XSl9cmV0dXJuIG59LGguY2xvbmU9ZnVuY3Rpb24obil7cmV0dXJuIGguaXNPYmplY3Qobik/aC5pc0FycmF5KG4pP24uc2xpY2UoKTpoLmV4dGVuZCh7fSxuKTpufSxoLnRhcD1mdW5jdGlvbihuLHQpe3JldHVybiB0KG4pLG59O3ZhciBiPWZ1bmN0aW9uKG4sdCxyLGUpe2lmKG49PT10KXJldHVybiAwIT09bnx8MS9uPT09MS90O2lmKG51bGw9PW58fG51bGw9PXQpcmV0dXJuIG49PT10O24gaW5zdGFuY2VvZiBoJiYobj1uLl93cmFwcGVkKSx0IGluc3RhbmNlb2YgaCYmKHQ9dC5fd3JhcHBlZCk7dmFyIHU9bC5jYWxsKG4pO2lmKHUhPT1sLmNhbGwodCkpcmV0dXJuITE7c3dpdGNoKHUpe2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIiIrbj09IiIrdDtjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuK24hPT0rbj8rdCE9PSt0OjA9PT0rbj8xLytuPT09MS90OituPT09K3Q7Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybituPT09K3R9aWYoIm9iamVjdCIhPXR5cGVvZiBufHwib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuITE7Zm9yKHZhciBpPXIubGVuZ3RoO2ktLTspaWYocltpXT09PW4pcmV0dXJuIGVbaV09PT10O3ZhciBhPW4uY29uc3RydWN0b3Isbz10LmNvbnN0cnVjdG9yO2lmKGEhPT1vJiYiY29uc3RydWN0b3IiaW4gbiYmImNvbnN0cnVjdG9yImluIHQmJiEoaC5pc0Z1bmN0aW9uKGEpJiZhIGluc3RhbmNlb2YgYSYmaC5pc0Z1bmN0aW9uKG8pJiZvIGluc3RhbmNlb2YgbykpcmV0dXJuITE7ci5wdXNoKG4pLGUucHVzaCh0KTt2YXIgYyxmO2lmKCJbb2JqZWN0IEFycmF5XSI9PT11KXtpZihjPW4ubGVuZ3RoLGY9Yz09PXQubGVuZ3RoKWZvcig7Yy0tJiYoZj1iKG5bY10sdFtjXSxyLGUpKTspO31lbHNle3ZhciBzLHA9aC5rZXlzKG4pO2lmKGM9cC5sZW5ndGgsZj1oLmtleXModCkubGVuZ3RoPT09Yylmb3IoO2MtLSYmKHM9cFtjXSxmPWguaGFzKHQscykmJmIobltzXSx0W3NdLHIsZSkpOyk7fXJldHVybiByLnBvcCgpLGUucG9wKCksZn07aC5pc0VxdWFsPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGIobix0LFtdLFtdKX0saC5pc0VtcHR5PWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuITA7aWYoaC5pc0FycmF5KG4pfHxoLmlzU3RyaW5nKG4pfHxoLmlzQXJndW1lbnRzKG4pKXJldHVybiAwPT09bi5sZW5ndGg7Zm9yKHZhciB0IGluIG4paWYoaC5oYXMobix0KSlyZXR1cm4hMTtyZXR1cm4hMH0saC5pc0VsZW1lbnQ9ZnVuY3Rpb24obil7cmV0dXJuISghbnx8MSE9PW4ubm9kZVR5cGUpfSxoLmlzQXJyYXk9Znx8ZnVuY3Rpb24obil7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PWwuY2FsbChuKX0saC5pc09iamVjdD1mdW5jdGlvbihuKXt2YXIgdD10eXBlb2YgbjtyZXR1cm4iZnVuY3Rpb24iPT09dHx8Im9iamVjdCI9PT10JiYhIW59LGguZWFjaChbIkFyZ3VtZW50cyIsIkZ1bmN0aW9uIiwiU3RyaW5nIiwiTnVtYmVyIiwiRGF0ZSIsIlJlZ0V4cCJdLGZ1bmN0aW9uKG4pe2hbImlzIituXT1mdW5jdGlvbih0KXtyZXR1cm4gbC5jYWxsKHQpPT09IltvYmplY3QgIituKyJdIn19KSxoLmlzQXJndW1lbnRzKGFyZ3VtZW50cyl8fChoLmlzQXJndW1lbnRzPWZ1bmN0aW9uKG4pe3JldHVybiBoLmhhcyhuLCJjYWxsZWUiKX0pLCJmdW5jdGlvbiIhPXR5cGVvZi8uLyYmKGguaXNGdW5jdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbnx8ITF9KSxoLmlzRmluaXRlPWZ1bmN0aW9uKG4pe3JldHVybiBpc0Zpbml0ZShuKSYmIWlzTmFOKHBhcnNlRmxvYXQobikpfSxoLmlzTmFOPWZ1bmN0aW9uKG4pe3JldHVybiBoLmlzTnVtYmVyKG4pJiZuIT09K259LGguaXNCb29sZWFuPWZ1bmN0aW9uKG4pe3JldHVybiBuPT09ITB8fG49PT0hMXx8IltvYmplY3QgQm9vbGVhbl0iPT09bC5jYWxsKG4pfSxoLmlzTnVsbD1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09PW59LGguaXNVbmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIG49PT12b2lkIDB9LGguaGFzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGwhPW4mJmMuY2FsbChuLHQpfSxoLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbi5fPXQsdGhpc30saC5pZGVudGl0eT1mdW5jdGlvbihuKXtyZXR1cm4gbn0saC5jb25zdGFudD1mdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbn19LGgubm9vcD1mdW5jdGlvbigpe30saC5wcm9wZXJ0eT1mdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRbbl19fSxoLm1hdGNoZXM9ZnVuY3Rpb24obil7dmFyIHQ9aC5wYWlycyhuKSxyPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiFyO249bmV3IE9iamVjdChuKTtmb3IodmFyIGU9MDtyPmU7ZSsrKXt2YXIgdT10W2VdLGk9dVswXTtpZih1WzFdIT09bltpXXx8IShpIGluIG4pKXJldHVybiExfXJldHVybiEwfX0saC50aW1lcz1mdW5jdGlvbihuLHQscil7dmFyIGU9QXJyYXkoTWF0aC5tYXgoMCxuKSk7dD1nKHQsciwxKTtmb3IodmFyIHU9MDtuPnU7dSsrKWVbdV09dCh1KTtyZXR1cm4gZX0saC5yYW5kb209ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbD09dCYmKHQ9bixuPTApLG4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKih0LW4rMSkpfSxoLm5vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIF89eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNzsiLCJgIjoiJiN4NjA7In0sdz1oLmludmVydChfKSxqPWZ1bmN0aW9uKG4pe3ZhciB0PWZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfSxyPSIoPzoiK2gua2V5cyhuKS5qb2luKCJ8IikrIikiLGU9UmVnRXhwKHIpLHU9UmVnRXhwKHIsImciKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG49bnVsbD09bj8iIjoiIituLGUudGVzdChuKT9uLnJlcGxhY2UodSx0KTpufX07aC5lc2NhcGU9aihfKSxoLnVuZXNjYXBlPWoodyksaC5yZXN1bHQ9ZnVuY3Rpb24obix0KXtpZihudWxsPT1uKXJldHVybiB2b2lkIDA7dmFyIHI9blt0XTtyZXR1cm4gaC5pc0Z1bmN0aW9uKHIpP25bdF0oKTpyfTt2YXIgeD0wO2gudW5pcXVlSWQ9ZnVuY3Rpb24obil7dmFyIHQ9Kyt4KyIiO3JldHVybiBuP24rdDp0fSxoLnRlbXBsYXRlU2V0dGluZ3M9e2V2YWx1YXRlOi88JShbXHNcU10rPyklPi9nLGludGVycG9sYXRlOi88JT0oW1xzXFNdKz8pJT4vZyxlc2NhcGU6LzwlLShbXHNcU10rPyklPi9nfTt2YXIgQT0vKC4pXi8saz17IiciOiInIiwiXFwiOiJcXCIsIlxyIjoiciIsIlxuIjoibiIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxPPS9cXHwnfFxyfFxufFx1MjAyOHxcdTIwMjkvZyxGPWZ1bmN0aW9uKG4pe3JldHVybiJcXCIra1tuXX07aC50ZW1wbGF0ZT1mdW5jdGlvbihuLHQscil7IXQmJnImJih0PXIpLHQ9aC5kZWZhdWx0cyh7fSx0LGgudGVtcGxhdGVTZXR0aW5ncyk7dmFyIGU9UmVnRXhwKFsodC5lc2NhcGV8fEEpLnNvdXJjZSwodC5pbnRlcnBvbGF0ZXx8QSkuc291cmNlLCh0LmV2YWx1YXRlfHxBKS5zb3VyY2VdLmpvaW4oInwiKSsifCQiLCJnIiksdT0wLGk9Il9fcCs9JyI7bi5yZXBsYWNlKGUsZnVuY3Rpb24odCxyLGUsYSxvKXtyZXR1cm4gaSs9bi5zbGljZSh1LG8pLnJlcGxhY2UoTyxGKSx1PW8rdC5sZW5ndGgscj9pKz0iJytcbigoX190PSgiK3IrIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xuJyI6ZT9pKz0iJytcbigoX190PSgiK2UrIikpPT1udWxsPycnOl9fdCkrXG4nIjphJiYoaSs9Iic7XG4iK2ErIlxuX19wKz0nIiksdH0pLGkrPSInO1xuIix0LnZhcmlhYmxlfHwoaT0id2l0aChvYmp8fHt9KXtcbiIraSsifVxuIiksaT0idmFyIF9fdCxfX3A9JycsX19qPUFycmF5LnByb3RvdHlwZS5qb2luLCIrInByaW50PWZ1bmN0aW9uKCl7X19wKz1fX2ouY2FsbChhcmd1bWVudHMsJycpO307XG4iK2krInJldHVybiBfX3A7XG4iO3RyeXt2YXIgYT1uZXcgRnVuY3Rpb24odC52YXJpYWJsZXx8Im9iaiIsIl8iLGkpfWNhdGNoKG8pe3Rocm93IG8uc291cmNlPWksb312YXIgbD1mdW5jdGlvbihuKXtyZXR1cm4gYS5jYWxsKHRoaXMsbixoKX0sYz10LnZhcmlhYmxlfHwib2JqIjtyZXR1cm4gbC5zb3VyY2U9ImZ1bmN0aW9uKCIrYysiKXtcbiIraSsifSIsbH0saC5jaGFpbj1mdW5jdGlvbihuKXt2YXIgdD1oKG4pO3JldHVybiB0Ll9jaGFpbj0hMCx0fTt2YXIgRT1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fY2hhaW4/aChuKS5jaGFpbigpOm59O2gubWl4aW49ZnVuY3Rpb24obil7aC5lYWNoKGguZnVuY3Rpb25zKG4pLGZ1bmN0aW9uKHQpe3ZhciByPWhbdF09blt0XTtoLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciBuPVt0aGlzLl93cmFwcGVkXTtyZXR1cm4gaS5hcHBseShuLGFyZ3VtZW50cyksRS5jYWxsKHRoaXMsci5hcHBseShoLG4pKX19KX0saC5taXhpbihoKSxoLmVhY2goWyJwb3AiLCJwdXNoIiwicmV2ZXJzZSIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihuKXt2YXIgdD1yW25dO2gucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5fd3JhcHBlZDtyZXR1cm4gdC5hcHBseShyLGFyZ3VtZW50cyksInNoaWZ0IiE9PW4mJiJzcGxpY2UiIT09bnx8MCE9PXIubGVuZ3RofHxkZWxldGUgclswXSxFLmNhbGwodGhpcyxyKX19KSxoLmVhY2goWyJjb25jYXQiLCJqb2luIiwic2xpY2UiXSxmdW5jdGlvbihuKXt2YXIgdD1yW25dO2gucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7cmV0dXJuIEUuY2FsbCh0aGlzLHQuYXBwbHkodGhpcy5fd3JhcHBlZCxhcmd1bWVudHMpKX19KSxoLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93cmFwcGVkfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoInVuZGVyc2NvcmUiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KX0pLmNhbGwodGhpcyk7CisvLyMgc291cmNlTWFwcGluZ1VSTD11bmRlcnNjb3JlLW1pbi5tYXAKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL3VuZGVyc2NvcmUtbWluLm1hcCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbGliL3VuZGVyc2NvcmUtbWluLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFlNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9saWIvdW5kZXJzY29yZS1taW4ubWFwCkBAIC0wLDAgKzEgQEAKK3sidmVyc2lvbiI6MywiZmlsZSI6InVuZGVyc2NvcmUtbWluLmpzIiwic291cmNlcyI6WyJ1bmRlcnNjb3JlLmpzIl0sIm5hbWVzIjpbImNyZWF0ZVJlZHVjZSIsImRpciIsIml0ZXJhdG9yIiwib2JqIiwiaXRlcmF0ZWUiLCJtZW1vIiwia2V5cyIsImluZGV4IiwibGVuZ3RoIiwiY3VycmVudEtleSIsImNvbnRleHQiLCJvcHRpbWl6ZUNiIiwiaXNBcnJheUxpa2UiLCJfIiwiYXJndW1lbnRzIiwiY3JlYXRlSW5kZXhGaW5kZXIiLCJhcnJheSIsInByZWRpY2F0ZSIsImNiIiwiY29sbGVjdE5vbkVudW1Qcm9wcyIsIm5vbkVudW1JZHgiLCJub25FbnVtZXJhYmxlUHJvcHMiLCJjb25zdHJ1Y3RvciIsInByb3RvIiwiaXNGdW5jdGlvbiIsInByb3RvdHlwZSIsIk9ialByb3RvIiwicHJvcCIsImhhcyIsImNvbnRhaW5zIiwicHVzaCIsInJvb3QiLCJ0aGlzIiwicHJldmlvdXNVbmRlcnNjb3JlIiwiQXJyYXlQcm90byIsIkFycmF5IiwiT2JqZWN0IiwiRnVuY1Byb3RvIiwiRnVuY3Rpb24iLCJzbGljZSIsInRvU3RyaW5nIiwiaGFzT3duUHJvcGVydHkiLCJuYXRpdmVJc0FycmF5IiwiaXNBcnJheSIsIm5hdGl2ZUtleXMiLCJuYXRpdmVCaW5kIiwiYmluZCIsIm5hdGl2ZUNyZWF0ZSIsImNyZWF0ZSIsIkN0b3IiLCJfd3JhcHBlZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJWRVJTSU9OIiwiZnVuYyIsImFyZ0NvdW50IiwidmFsdWUiLCJjYWxsIiwib3RoZXIiLCJjb2xsZWN0aW9uIiwiYWNjdW11bGF0b3IiLCJhcHBseSIsImlkZW50aXR5IiwiaXNPYmplY3QiLCJtYXRjaGVyIiwicHJvcGVydHkiLCJJbmZpbml0eSIsImNyZWF0ZUFzc2lnbmVyIiwia2V5c0Z1bmMiLCJ1bmRlZmluZWRPbmx5Iiwic291cmNlIiwibCIsImkiLCJrZXkiLCJiYXNlQ3JlYXRlIiwicmVzdWx0IiwiTUFYX0FSUkFZX0lOREVYIiwiTWF0aCIsInBvdyIsImVhY2giLCJmb3JFYWNoIiwibWFwIiwiY29sbGVjdCIsInJlc3VsdHMiLCJyZWR1Y2UiLCJmb2xkbCIsImluamVjdCIsInJlZHVjZVJpZ2h0IiwiZm9sZHIiLCJmaW5kIiwiZGV0ZWN0IiwiZmluZEluZGV4IiwiZmluZEtleSIsImZpbHRlciIsInNlbGVjdCIsImxpc3QiLCJyZWplY3QiLCJuZWdhdGUiLCJldmVyeSIsImFsbCIsInNvbWUiLCJhbnkiLCJpbmNsdWRlcyIsImluY2x1ZGUiLCJ0YXJnZXQiLCJmcm9tSW5kZXgiLCJ2YWx1ZXMiLCJpbmRleE9mIiwiaW52b2tlIiwibWV0aG9kIiwiYXJncyIsImlzRnVuYyIsInBsdWNrIiwid2hlcmUiLCJhdHRycyIsImZpbmRXaGVyZSIsIm1heCIsImNvbXB1dGVkIiwibGFzdENvbXB1dGVkIiwibWluIiwic2h1ZmZsZSIsInJhbmQiLCJzZXQiLCJzaHVmZmxlZCIsInJhbmRvbSIsInNhbXBsZSIsIm4iLCJndWFyZCIsInNvcnRCeSIsImNyaXRlcmlhIiwic29ydCIsImxlZnQiLCJyaWdodCIsImEiLCJiIiwiZ3JvdXAiLCJiZWhhdmlvciIsImdyb3VwQnkiLCJpbmRleEJ5IiwiY291bnRCeSIsInRvQXJyYXkiLCJzaXplIiwicGFydGl0aW9uIiwicGFzcyIsImZhaWwiLCJmaXJzdCIsImhlYWQiLCJ0YWtlIiwiaW5pdGlhbCIsImxhc3QiLCJyZXN0IiwidGFpbCIsImRyb3AiLCJjb21wYWN0IiwiZmxhdHRlbiIsImlucHV0Iiwic2hhbGxvdyIsInN0cmljdCIsInN0YXJ0SW5kZXgiLCJvdXRwdXQiLCJpZHgiLCJpc0FyZ3VtZW50cyIsImoiLCJsZW4iLCJ3aXRob3V0IiwiZGlmZmVyZW5jZSIsInVuaXEiLCJ1bmlxdWUiLCJpc1NvcnRlZCIsImlzQm9vbGVhbiIsInNlZW4iLCJ1bmlvbiIsImludGVyc2VjdGlvbiIsImFyZ3NMZW5ndGgiLCJpdGVtIiwiemlwIiwidW56aXAiLCJvYmplY3QiLCJzb3J0ZWRJbmRleCIsImlzTmFOIiwibGFzdEluZGV4T2YiLCJmcm9tIiwiZmluZExhc3RJbmRleCIsImxvdyIsImhpZ2giLCJtaWQiLCJmbG9vciIsInJhbmdlIiwic3RhcnQiLCJzdG9wIiwic3RlcCIsImNlaWwiLCJleGVjdXRlQm91bmQiLCJzb3VyY2VGdW5jIiwiYm91bmRGdW5jIiwiY2FsbGluZ0NvbnRleHQiLCJzZWxmIiwiVHlwZUVycm9yIiwiYm91bmQiLCJjb25jYXQiLCJwYXJ0aWFsIiwiYm91bmRBcmdzIiwicG9zaXRpb24iLCJiaW5kQWxsIiwiRXJyb3IiLCJtZW1vaXplIiwiaGFzaGVyIiwiY2FjaGUiLCJhZGRyZXNzIiwiZGVsYXkiLCJ3YWl0Iiwic2V0VGltZW91dCIsImRlZmVyIiwidGhyb3R0bGUiLCJvcHRpb25zIiwidGltZW91dCIsInByZXZpb3VzIiwibGF0ZXIiLCJsZWFkaW5nIiwibm93IiwicmVtYWluaW5nIiwiY2xlYXJUaW1lb3V0IiwidHJhaWxpbmciLCJkZWJvdW5jZSIsImltbWVkaWF0ZSIsInRpbWVzdGFtcCIsImNhbGxOb3ciLCJ3cmFwIiwid3JhcHBlciIsImNvbXBvc2UiLCJhZnRlciIsInRpbWVzIiwiYmVmb3JlIiwib25jZSIsImhhc0VudW1CdWciLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImFsbEtleXMiLCJtYXBPYmplY3QiLCJwYWlycyIsImludmVydCIsImZ1bmN0aW9ucyIsIm1ldGhvZHMiLCJuYW1lcyIsImV4dGVuZCIsImV4dGVuZE93biIsImFzc2lnbiIsInBpY2siLCJvaXRlcmF0ZWUiLCJvbWl0IiwiU3RyaW5nIiwiZGVmYXVsdHMiLCJjbG9uZSIsInRhcCIsImludGVyY2VwdG9yIiwiaXNNYXRjaCIsImVxIiwiYVN0YWNrIiwiYlN0YWNrIiwiY2xhc3NOYW1lIiwiYXJlQXJyYXlzIiwiYUN0b3IiLCJiQ3RvciIsInBvcCIsImlzRXF1YWwiLCJpc0VtcHR5IiwiaXNTdHJpbmciLCJpc0VsZW1lbnQiLCJub2RlVHlwZSIsInR5cGUiLCJuYW1lIiwiSW50OEFycmF5IiwiaXNGaW5pdGUiLCJwYXJzZUZsb2F0IiwiaXNOdW1iZXIiLCJpc051bGwiLCJpc1VuZGVmaW5lZCIsIm5vQ29uZmxpY3QiLCJjb25zdGFudCIsIm5vb3AiLCJwcm9wZXJ0eU9mIiwibWF0Y2hlcyIsImFjY3VtIiwiRGF0ZSIsImdldFRpbWUiLCJlc2NhcGVNYXAiLCImIiwiPCIsIj4iLCJcIiIsIiciLCJgIiwidW5lc2NhcGVNYXAiLCJjcmVhdGVFc2NhcGVyIiwiZXNjYXBlciIsIm1hdGNoIiwiam9pbiIsInRlc3RSZWdleHAiLCJSZWdFeHAiLCJyZXBsYWNlUmVnZXhwIiwic3RyaW5nIiwidGVzdCIsInJlcGxhY2UiLCJlc2NhcGUiLCJ1bmVzY2FwZSIsImZhbGxiYWNrIiwiaWRDb3VudGVyIiwidW5pcXVlSWQiLCJwcmVmaXgiLCJpZCIsInRlbXBsYXRlU2V0dGluZ3MiLCJldmFsdWF0ZSIsImludGVycG9sYXRlIiwibm9NYXRjaCIsImVzY2FwZXMiLCJcXCIsIlxyIiwiXG4iLCLigKgiLCLigKkiLCJlc2NhcGVDaGFyIiwidGVtcGxhdGUiLCJ0ZXh0Iiwic2V0dGluZ3MiLCJvbGRTZXR0aW5ncyIsIm9mZnNldCIsInZhcmlhYmxlIiwicmVuZGVyIiwiZSIsImRhdGEiLCJhcmd1bWVudCIsImNoYWluIiwiaW5zdGFuY2UiLCJfY2hhaW4iLCJtaXhpbiIsInZhbHVlT2YiLCJ0b0pTT04iLCJkZWZpbmUiLCJhbWQiXSwibWFwcGluZ3MiOiI7Ozs7Q0FLQyxXQW9LQyxRQUFTQSxHQUFhQyxHQUdwQixRQUFTQyxHQUFTQyxFQUFLQyxFQUFVQyxFQUFNQyxFQUFNQyxFQUFPQyxHQUNsRCxLQUFPRCxHQUFTLEdBQWFDLEVBQVJELEVBQWdCQSxHQUFTTixFQUFLLENBQ2pELEdBQUlRLEdBQWFILEVBQU9BLEVBQUtDLEdBQVNBLENBQ3RDRixHQUFPRCxFQUFTQyxFQUFNRixFQUFJTSxHQUFhQSxFQUFZTixHQUVyRCxNQUFPRSxHQUdULE1BQU8sVUFBU0YsRUFBS0MsRUFBVUMsRUFBTUssR0FDbkNOLEVBQVdPLEVBQVdQLEVBQVVNLEVBQVMsRUFDekMsSUFBSUosSUFBUU0sRUFBWVQsSUFBUVUsRUFBRVAsS0FBS0gsR0FDbkNLLEdBQVVGLEdBQVFILEdBQUtLLE9BQ3ZCRCxFQUFRTixFQUFNLEVBQUksRUFBSU8sRUFBUyxDQU1uQyxPQUpJTSxXQUFVTixPQUFTLElBQ3JCSCxFQUFPRixFQUFJRyxFQUFPQSxFQUFLQyxHQUFTQSxHQUNoQ0EsR0FBU04sR0FFSkMsRUFBU0MsRUFBS0MsRUFBVUMsRUFBTUMsRUFBTUMsRUFBT0MsSUErYnRELFFBQVNPLEdBQWtCZCxHQUN6QixNQUFPLFVBQVNlLEVBQU9DLEVBQVdQLEdBQ2hDTyxFQUFZQyxFQUFHRCxFQUFXUCxFQUcxQixLQUZBLEdBQUlGLEdBQWtCLE1BQVRRLEdBQWlCQSxFQUFNUixPQUNoQ0QsRUFBUU4sRUFBTSxFQUFJLEVBQUlPLEVBQVMsRUFDNUJELEdBQVMsR0FBYUMsRUFBUkQsRUFBZ0JBLEdBQVNOLEVBQzVDLEdBQUlnQixFQUFVRCxFQUFNVCxHQUFRQSxFQUFPUyxHQUFRLE1BQU9ULEVBRXBELFFBQVEsR0FnUVosUUFBU1ksR0FBb0JoQixFQUFLRyxHQUNoQyxHQUFJYyxHQUFhQyxFQUFtQmIsT0FDaENjLEVBQWNuQixFQUFJbUIsWUFDbEJDLEVBQVNWLEVBQUVXLFdBQVdGLElBQWdCQSxFQUFZRyxXQUFjQyxFQUdoRUMsRUFBTyxhQUdYLEtBRklkLEVBQUVlLElBQUl6QixFQUFLd0IsS0FBVWQsRUFBRWdCLFNBQVN2QixFQUFNcUIsSUFBT3JCLEVBQUt3QixLQUFLSCxHQUVwRFAsS0FDTE8sRUFBT04sRUFBbUJELEdBQ3RCTyxJQUFReEIsSUFBT0EsRUFBSXdCLEtBQVVKLEVBQU1JLEtBQVVkLEVBQUVnQixTQUFTdkIsRUFBTXFCLElBQ2hFckIsRUFBS3dCLEtBQUtILEdBdDRCaEIsR0FBSUksR0FBT0MsS0FHUEMsRUFBcUJGLEVBQUtsQixFQUcxQnFCLEVBQWFDLE1BQU1WLFVBQVdDLEVBQVdVLE9BQU9YLFVBQVdZLEVBQVlDLFNBQVNiLFVBSWxGSyxFQUFtQkksRUFBV0osS0FDOUJTLEVBQW1CTCxFQUFXSyxNQUM5QkMsRUFBbUJkLEVBQVNjLFNBQzVCQyxFQUFtQmYsRUFBU2UsZUFLNUJDLEVBQXFCUCxNQUFNUSxRQUMzQkMsRUFBcUJSLE9BQU85QixLQUM1QnVDLEVBQXFCUixFQUFVUyxLQUMvQkMsRUFBcUJYLE9BQU9ZLE9BRzFCQyxFQUFPLGFBR1BwQyxFQUFJLFNBQVNWLEdBQ2YsTUFBSUEsYUFBZVUsR0FBVVYsRUFDdkI2QixlQUFnQm5CLFFBQ3RCbUIsS0FBS2tCLFNBQVcvQyxHQURpQixHQUFJVSxHQUFFVixHQU9sQixvQkFBWmdELFVBQ2EsbUJBQVhDLFNBQTBCQSxPQUFPRCxVQUMxQ0EsUUFBVUMsT0FBT0QsUUFBVXRDLEdBRTdCc0MsUUFBUXRDLEVBQUlBLEdBRVprQixFQUFLbEIsRUFBSUEsRUFJWEEsRUFBRXdDLFFBQVUsT0FLWixJQUFJMUMsR0FBYSxTQUFTMkMsRUFBTTVDLEVBQVM2QyxHQUN2QyxHQUFJN0MsUUFBaUIsR0FBRyxNQUFPNEMsRUFDL0IsUUFBb0IsTUFBWkMsRUFBbUIsRUFBSUEsR0FDN0IsSUFBSyxHQUFHLE1BQU8sVUFBU0MsR0FDdEIsTUFBT0YsR0FBS0csS0FBSy9DLEVBQVM4QyxHQUU1QixLQUFLLEdBQUcsTUFBTyxVQUFTQSxFQUFPRSxHQUM3QixNQUFPSixHQUFLRyxLQUFLL0MsRUFBUzhDLEVBQU9FLEdBRW5DLEtBQUssR0FBRyxNQUFPLFVBQVNGLEVBQU9qRCxFQUFPb0QsR0FDcEMsTUFBT0wsR0FBS0csS0FBSy9DLEVBQVM4QyxFQUFPakQsRUFBT29ELEdBRTFDLEtBQUssR0FBRyxNQUFPLFVBQVNDLEVBQWFKLEVBQU9qRCxFQUFPb0QsR0FDakQsTUFBT0wsR0FBS0csS0FBSy9DLEVBQVNrRCxFQUFhSixFQUFPakQsRUFBT29ELElBR3pELE1BQU8sWUFDTCxNQUFPTCxHQUFLTyxNQUFNbkQsRUFBU0ksYUFPM0JJLEVBQUssU0FBU3NDLEVBQU85QyxFQUFTNkMsR0FDaEMsTUFBYSxPQUFUQyxFQUFzQjNDLEVBQUVpRCxTQUN4QmpELEVBQUVXLFdBQVdnQyxHQUFlN0MsRUFBVzZDLEVBQU85QyxFQUFTNkMsR0FDdkQxQyxFQUFFa0QsU0FBU1AsR0FBZTNDLEVBQUVtRCxRQUFRUixHQUNqQzNDLEVBQUVvRCxTQUFTVCxHQUVwQjNDLEdBQUVULFNBQVcsU0FBU29ELEVBQU85QyxHQUMzQixNQUFPUSxHQUFHc0MsRUFBTzlDLEVBQVN3RCxLQUk1QixJQUFJQyxHQUFpQixTQUFTQyxFQUFVQyxHQUN0QyxNQUFPLFVBQVNsRSxHQUNkLEdBQUlLLEdBQVNNLFVBQVVOLE1BQ3ZCLElBQWEsRUFBVEEsR0FBcUIsTUFBUEwsRUFBYSxNQUFPQSxFQUN0QyxLQUFLLEdBQUlJLEdBQVEsRUFBV0MsRUFBUkQsRUFBZ0JBLElBSWxDLElBQUssR0FIRCtELEdBQVN4RCxVQUFVUCxHQUNuQkQsRUFBTzhELEVBQVNFLEdBQ2hCQyxFQUFJakUsRUFBS0UsT0FDSmdFLEVBQUksRUFBT0QsRUFBSkMsRUFBT0EsSUFBSyxDQUMxQixHQUFJQyxHQUFNbkUsRUFBS2tFLEVBQ1ZILElBQWlCbEUsRUFBSXNFLFNBQWMsS0FBR3RFLEVBQUlzRSxHQUFPSCxFQUFPRyxJQUdqRSxNQUFPdEUsS0FLUHVFLEVBQWEsU0FBU2pELEdBQ3hCLElBQUtaLEVBQUVrRCxTQUFTdEMsR0FBWSxRQUM1QixJQUFJc0IsRUFBYyxNQUFPQSxHQUFhdEIsRUFDdEN3QixHQUFLeEIsVUFBWUEsQ0FDakIsSUFBSWtELEdBQVMsR0FBSTFCLEVBRWpCLE9BREFBLEdBQUt4QixVQUFZLEtBQ1ZrRCxHQU1MQyxFQUFrQkMsS0FBS0MsSUFBSSxFQUFHLElBQU0sRUFDcENsRSxFQUFjLFNBQVMrQyxHQUN6QixHQUFJbkQsR0FBU21ELEdBQWNBLEVBQVduRCxNQUN0QyxPQUF3QixnQkFBVkEsSUFBc0JBLEdBQVUsR0FBZW9FLEdBQVZwRSxFQVNyREssR0FBRWtFLEtBQU9sRSxFQUFFbUUsUUFBVSxTQUFTN0UsRUFBS0MsRUFBVU0sR0FDM0NOLEVBQVdPLEVBQVdQLEVBQVVNLEVBQ2hDLElBQUk4RCxHQUFHaEUsQ0FDUCxJQUFJSSxFQUFZVCxHQUNkLElBQUtxRSxFQUFJLEVBQUdoRSxFQUFTTCxFQUFJSyxPQUFZQSxFQUFKZ0UsRUFBWUEsSUFDM0NwRSxFQUFTRCxFQUFJcUUsR0FBSUEsRUFBR3JFLE9BRWpCLENBQ0wsR0FBSUcsR0FBT08sRUFBRVAsS0FBS0gsRUFDbEIsS0FBS3FFLEVBQUksRUFBR2hFLEVBQVNGLEVBQUtFLE9BQVlBLEVBQUpnRSxFQUFZQSxJQUM1Q3BFLEVBQVNELEVBQUlHLEVBQUtrRSxJQUFLbEUsRUFBS2tFLEdBQUlyRSxHQUdwQyxNQUFPQSxJQUlUVSxFQUFFb0UsSUFBTXBFLEVBQUVxRSxRQUFVLFNBQVMvRSxFQUFLQyxFQUFVTSxHQUMxQ04sRUFBV2MsRUFBR2QsRUFBVU0sRUFJeEIsS0FBSyxHQUhESixJQUFRTSxFQUFZVCxJQUFRVSxFQUFFUCxLQUFLSCxHQUNuQ0ssR0FBVUYsR0FBUUgsR0FBS0ssT0FDdkIyRSxFQUFVaEQsTUFBTTNCLEdBQ1hELEVBQVEsRUFBV0MsRUFBUkQsRUFBZ0JBLElBQVMsQ0FDM0MsR0FBSUUsR0FBYUgsRUFBT0EsRUFBS0MsR0FBU0EsQ0FDdEM0RSxHQUFRNUUsR0FBU0gsRUFBU0QsRUFBSU0sR0FBYUEsRUFBWU4sR0FFekQsTUFBT2dGLElBK0JUdEUsRUFBRXVFLE9BQVN2RSxFQUFFd0UsTUFBUXhFLEVBQUV5RSxPQUFTdEYsRUFBYSxHQUc3Q2EsRUFBRTBFLFlBQWMxRSxFQUFFMkUsTUFBUXhGLEdBQWMsR0FHeENhLEVBQUU0RSxLQUFPNUUsRUFBRTZFLE9BQVMsU0FBU3ZGLEVBQUtjLEVBQVdQLEdBQzNDLEdBQUkrRCxFQU1KLE9BSkVBLEdBREU3RCxFQUFZVCxHQUNSVSxFQUFFOEUsVUFBVXhGLEVBQUtjLEVBQVdQLEdBRTVCRyxFQUFFK0UsUUFBUXpGLEVBQUtjLEVBQVdQLEdBRTlCK0QsUUFBYSxJQUFLQSxLQUFTLEVBQVV0RSxFQUFJc0UsR0FBN0MsUUFLRjVELEVBQUVnRixPQUFTaEYsRUFBRWlGLE9BQVMsU0FBUzNGLEVBQUtjLEVBQVdQLEdBQzdDLEdBQUl5RSxLQUtKLE9BSkFsRSxHQUFZQyxFQUFHRCxFQUFXUCxHQUMxQkcsRUFBRWtFLEtBQUs1RSxFQUFLLFNBQVNxRCxFQUFPakQsRUFBT3dGLEdBQzdCOUUsRUFBVXVDLEVBQU9qRCxFQUFPd0YsSUFBT1osRUFBUXJELEtBQUswQixLQUUzQzJCLEdBSVR0RSxFQUFFbUYsT0FBUyxTQUFTN0YsRUFBS2MsRUFBV1AsR0FDbEMsTUFBT0csR0FBRWdGLE9BQU8xRixFQUFLVSxFQUFFb0YsT0FBTy9FLEVBQUdELElBQWFQLElBS2hERyxFQUFFcUYsTUFBUXJGLEVBQUVzRixJQUFNLFNBQVNoRyxFQUFLYyxFQUFXUCxHQUN6Q08sRUFBWUMsRUFBR0QsRUFBV1AsRUFHMUIsS0FBSyxHQUZESixJQUFRTSxFQUFZVCxJQUFRVSxFQUFFUCxLQUFLSCxHQUNuQ0ssR0FBVUYsR0FBUUgsR0FBS0ssT0FDbEJELEVBQVEsRUFBV0MsRUFBUkQsRUFBZ0JBLElBQVMsQ0FDM0MsR0FBSUUsR0FBYUgsRUFBT0EsRUFBS0MsR0FBU0EsQ0FDdEMsS0FBS1UsRUFBVWQsRUFBSU0sR0FBYUEsRUFBWU4sR0FBTSxPQUFPLEVBRTNELE9BQU8sR0FLVFUsRUFBRXVGLEtBQU92RixFQUFFd0YsSUFBTSxTQUFTbEcsRUFBS2MsRUFBV1AsR0FDeENPLEVBQVlDLEVBQUdELEVBQVdQLEVBRzFCLEtBQUssR0FGREosSUFBUU0sRUFBWVQsSUFBUVUsRUFBRVAsS0FBS0gsR0FDbkNLLEdBQVVGLEdBQVFILEdBQUtLLE9BQ2xCRCxFQUFRLEVBQVdDLEVBQVJELEVBQWdCQSxJQUFTLENBQzNDLEdBQUlFLEdBQWFILEVBQU9BLEVBQUtDLEdBQVNBLENBQ3RDLElBQUlVLEVBQVVkLEVBQUlNLEdBQWFBLEVBQVlOLEdBQU0sT0FBTyxFQUUxRCxPQUFPLEdBS1RVLEVBQUVnQixTQUFXaEIsRUFBRXlGLFNBQVd6RixFQUFFMEYsUUFBVSxTQUFTcEcsRUFBS3FHLEVBQVFDLEdBRTFELE1BREs3RixHQUFZVCxLQUFNQSxFQUFNVSxFQUFFNkYsT0FBT3ZHLElBQy9CVSxFQUFFOEYsUUFBUXhHLEVBQUtxRyxFQUE0QixnQkFBYkMsSUFBeUJBLElBQWMsR0FJOUU1RixFQUFFK0YsT0FBUyxTQUFTekcsRUFBSzBHLEdBQ3ZCLEdBQUlDLEdBQU92RSxFQUFNa0IsS0FBSzNDLFVBQVcsR0FDN0JpRyxFQUFTbEcsRUFBRVcsV0FBV3FGLEVBQzFCLE9BQU9oRyxHQUFFb0UsSUFBSTlFLEVBQUssU0FBU3FELEdBQ3pCLEdBQUlGLEdBQU95RCxFQUFTRixFQUFTckQsRUFBTXFELEVBQ25DLE9BQWUsT0FBUnZELEVBQWVBLEVBQU9BLEVBQUtPLE1BQU1MLEVBQU9zRCxNQUtuRGpHLEVBQUVtRyxNQUFRLFNBQVM3RyxFQUFLc0UsR0FDdEIsTUFBTzVELEdBQUVvRSxJQUFJOUUsRUFBS1UsRUFBRW9ELFNBQVNRLEtBSy9CNUQsRUFBRW9HLE1BQVEsU0FBUzlHLEVBQUsrRyxHQUN0QixNQUFPckcsR0FBRWdGLE9BQU8xRixFQUFLVSxFQUFFbUQsUUFBUWtELEtBS2pDckcsRUFBRXNHLFVBQVksU0FBU2hILEVBQUsrRyxHQUMxQixNQUFPckcsR0FBRTRFLEtBQUt0RixFQUFLVSxFQUFFbUQsUUFBUWtELEtBSS9CckcsRUFBRXVHLElBQU0sU0FBU2pILEVBQUtDLEVBQVVNLEdBQzlCLEdBQ0k4QyxHQUFPNkQsRUFEUDFDLEdBQVVULElBQVVvRCxHQUFnQnBELEdBRXhDLElBQWdCLE1BQVo5RCxHQUEyQixNQUFQRCxFQUFhLENBQ25DQSxFQUFNUyxFQUFZVCxHQUFPQSxFQUFNVSxFQUFFNkYsT0FBT3ZHLEVBQ3hDLEtBQUssR0FBSXFFLEdBQUksRUFBR2hFLEVBQVNMLEVBQUlLLE9BQVlBLEVBQUpnRSxFQUFZQSxJQUMvQ2hCLEVBQVFyRCxFQUFJcUUsR0FDUmhCLEVBQVFtQixJQUNWQSxFQUFTbkIsT0FJYnBELEdBQVdjLEVBQUdkLEVBQVVNLEdBQ3hCRyxFQUFFa0UsS0FBSzVFLEVBQUssU0FBU3FELEVBQU9qRCxFQUFPd0YsR0FDakNzQixFQUFXakgsRUFBU29ELEVBQU9qRCxFQUFPd0YsSUFDOUJzQixFQUFXQyxHQUFnQkQsS0FBY25ELEtBQVlTLEtBQVlULE9BQ25FUyxFQUFTbkIsRUFDVDhELEVBQWVELElBSXJCLE9BQU8xQyxJQUlUOUQsRUFBRTBHLElBQU0sU0FBU3BILEVBQUtDLEVBQVVNLEdBQzlCLEdBQ0k4QyxHQUFPNkQsRUFEUDFDLEVBQVNULElBQVVvRCxFQUFlcEQsR0FFdEMsSUFBZ0IsTUFBWjlELEdBQTJCLE1BQVBELEVBQWEsQ0FDbkNBLEVBQU1TLEVBQVlULEdBQU9BLEVBQU1VLEVBQUU2RixPQUFPdkcsRUFDeEMsS0FBSyxHQUFJcUUsR0FBSSxFQUFHaEUsRUFBU0wsRUFBSUssT0FBWUEsRUFBSmdFLEVBQVlBLElBQy9DaEIsRUFBUXJELEVBQUlxRSxHQUNBRyxFQUFSbkIsSUFDRm1CLEVBQVNuQixPQUlicEQsR0FBV2MsRUFBR2QsRUFBVU0sR0FDeEJHLEVBQUVrRSxLQUFLNUUsRUFBSyxTQUFTcUQsRUFBT2pELEVBQU93RixHQUNqQ3NCLEVBQVdqSCxFQUFTb0QsRUFBT2pELEVBQU93RixJQUNuQnVCLEVBQVhELEdBQXdDbkQsTUFBYm1ELEdBQW9DbkQsTUFBWFMsS0FDdERBLEVBQVNuQixFQUNUOEQsRUFBZUQsSUFJckIsT0FBTzFDLElBS1Q5RCxFQUFFMkcsUUFBVSxTQUFTckgsR0FJbkIsSUFBSyxHQUFlc0gsR0FIaEJDLEVBQU05RyxFQUFZVCxHQUFPQSxFQUFNVSxFQUFFNkYsT0FBT3ZHLEdBQ3hDSyxFQUFTa0gsRUFBSWxILE9BQ2JtSCxFQUFXeEYsTUFBTTNCLEdBQ1pELEVBQVEsRUFBaUJDLEVBQVJELEVBQWdCQSxJQUN4Q2tILEVBQU81RyxFQUFFK0csT0FBTyxFQUFHckgsR0FDZmtILElBQVNsSCxJQUFPb0gsRUFBU3BILEdBQVNvSCxFQUFTRixJQUMvQ0UsRUFBU0YsR0FBUUMsRUFBSW5ILEVBRXZCLE9BQU9vSCxJQU1UOUcsRUFBRWdILE9BQVMsU0FBUzFILEVBQUsySCxFQUFHQyxHQUMxQixNQUFTLE9BQUxELEdBQWFDLEdBQ1ZuSCxFQUFZVCxLQUFNQSxFQUFNVSxFQUFFNkYsT0FBT3ZHLElBQy9CQSxFQUFJVSxFQUFFK0csT0FBT3pILEVBQUlLLE9BQVMsS0FFNUJLLEVBQUUyRyxRQUFRckgsR0FBS29DLE1BQU0sRUFBR3NDLEtBQUt1QyxJQUFJLEVBQUdVLEtBSTdDakgsRUFBRW1ILE9BQVMsU0FBUzdILEVBQUtDLEVBQVVNLEdBRWpDLE1BREFOLEdBQVdjLEVBQUdkLEVBQVVNLEdBQ2pCRyxFQUFFbUcsTUFBTW5HLEVBQUVvRSxJQUFJOUUsRUFBSyxTQUFTcUQsRUFBT2pELEVBQU93RixHQUMvQyxPQUNFdkMsTUFBT0EsRUFDUGpELE1BQU9BLEVBQ1AwSCxTQUFVN0gsRUFBU29ELEVBQU9qRCxFQUFPd0YsTUFFbENtQyxLQUFLLFNBQVNDLEVBQU1DLEdBQ3JCLEdBQUlDLEdBQUlGLEVBQUtGLFNBQ1RLLEVBQUlGLEVBQU1ILFFBQ2QsSUFBSUksSUFBTUMsRUFBRyxDQUNYLEdBQUlELEVBQUlDLEdBQUtELFFBQVcsR0FBRyxNQUFPLEVBQ2xDLElBQVFDLEVBQUpELEdBQVNDLFFBQVcsR0FBRyxPQUFRLEVBRXJDLE1BQU9ILEdBQUs1SCxNQUFRNkgsRUFBTTdILFFBQ3hCLFNBSU4sSUFBSWdJLEdBQVEsU0FBU0MsR0FDbkIsTUFBTyxVQUFTckksRUFBS0MsRUFBVU0sR0FDN0IsR0FBSWlFLEtBTUosT0FMQXZFLEdBQVdjLEVBQUdkLEVBQVVNLEdBQ3hCRyxFQUFFa0UsS0FBSzVFLEVBQUssU0FBU3FELEVBQU9qRCxHQUMxQixHQUFJa0UsR0FBTXJFLEVBQVNvRCxFQUFPakQsRUFBT0osRUFDakNxSSxHQUFTN0QsRUFBUW5CLEVBQU9pQixLQUVuQkUsR0FNWDlELEdBQUU0SCxRQUFVRixFQUFNLFNBQVM1RCxFQUFRbkIsRUFBT2lCLEdBQ3BDNUQsRUFBRWUsSUFBSStDLEVBQVFGLEdBQU1FLEVBQU9GLEdBQUszQyxLQUFLMEIsR0FBYW1CLEVBQU9GLElBQVFqQixLQUt2RTNDLEVBQUU2SCxRQUFVSCxFQUFNLFNBQVM1RCxFQUFRbkIsRUFBT2lCLEdBQ3hDRSxFQUFPRixHQUFPakIsSUFNaEIzQyxFQUFFOEgsUUFBVUosRUFBTSxTQUFTNUQsRUFBUW5CLEVBQU9pQixHQUNwQzVELEVBQUVlLElBQUkrQyxFQUFRRixHQUFNRSxFQUFPRixLQUFhRSxFQUFPRixHQUFPLElBSTVENUQsRUFBRStILFFBQVUsU0FBU3pJLEdBQ25CLE1BQUtBLEdBQ0RVLEVBQUU4QixRQUFReEMsR0FBYW9DLEVBQU1rQixLQUFLdEQsR0FDbENTLEVBQVlULEdBQWFVLEVBQUVvRSxJQUFJOUUsRUFBS1UsRUFBRWlELFVBQ25DakQsRUFBRTZGLE9BQU92RyxPQUlsQlUsRUFBRWdJLEtBQU8sU0FBUzFJLEdBQ2hCLE1BQVcsT0FBUEEsRUFBb0IsRUFDakJTLEVBQVlULEdBQU9BLEVBQUlLLE9BQVNLLEVBQUVQLEtBQUtILEdBQUtLLFFBS3JESyxFQUFFaUksVUFBWSxTQUFTM0ksRUFBS2MsRUFBV1AsR0FDckNPLEVBQVlDLEVBQUdELEVBQVdQLEVBQzFCLElBQUlxSSxNQUFXQyxJQUlmLE9BSEFuSSxHQUFFa0UsS0FBSzVFLEVBQUssU0FBU3FELEVBQU9pQixFQUFLdEUsSUFDOUJjLEVBQVV1QyxFQUFPaUIsRUFBS3RFLEdBQU80SSxFQUFPQyxHQUFNbEgsS0FBSzBCLE1BRTFDdUYsRUFBTUMsSUFTaEJuSSxFQUFFb0ksTUFBUXBJLEVBQUVxSSxLQUFPckksRUFBRXNJLEtBQU8sU0FBU25JLEVBQU84RyxFQUFHQyxHQUM3QyxNQUFhLE9BQVQvRyxNQUEyQixHQUN0QixNQUFMOEcsR0FBYUMsRUFBYy9HLEVBQU0sR0FDOUJILEVBQUV1SSxRQUFRcEksRUFBT0EsRUFBTVIsT0FBU3NILElBTXpDakgsRUFBRXVJLFFBQVUsU0FBU3BJLEVBQU84RyxFQUFHQyxHQUM3QixNQUFPeEYsR0FBTWtCLEtBQUt6QyxFQUFPLEVBQUc2RCxLQUFLdUMsSUFBSSxFQUFHcEcsRUFBTVIsUUFBZSxNQUFMc0gsR0FBYUMsRUFBUSxFQUFJRCxNQUtuRmpILEVBQUV3SSxLQUFPLFNBQVNySSxFQUFPOEcsRUFBR0MsR0FDMUIsTUFBYSxPQUFUL0csTUFBMkIsR0FDdEIsTUFBTDhHLEdBQWFDLEVBQWMvRyxFQUFNQSxFQUFNUixPQUFTLEdBQzdDSyxFQUFFeUksS0FBS3RJLEVBQU82RCxLQUFLdUMsSUFBSSxFQUFHcEcsRUFBTVIsT0FBU3NILEtBTWxEakgsRUFBRXlJLEtBQU96SSxFQUFFMEksS0FBTzFJLEVBQUUySSxLQUFPLFNBQVN4SSxFQUFPOEcsRUFBR0MsR0FDNUMsTUFBT3hGLEdBQU1rQixLQUFLekMsRUFBWSxNQUFMOEcsR0FBYUMsRUFBUSxFQUFJRCxJQUlwRGpILEVBQUU0SSxRQUFVLFNBQVN6SSxHQUNuQixNQUFPSCxHQUFFZ0YsT0FBTzdFLEVBQU9ILEVBQUVpRCxVQUkzQixJQUFJNEYsR0FBVSxTQUFTQyxFQUFPQyxFQUFTQyxFQUFRQyxHQUU3QyxJQUFLLEdBRERDLE1BQWFDLEVBQU0sRUFDZHhGLEVBQUlzRixHQUFjLEVBQUd0SixFQUFTbUosR0FBU0EsRUFBTW5KLE9BQVlBLEVBQUpnRSxFQUFZQSxJQUFLLENBQzdFLEdBQUloQixHQUFRbUcsRUFBTW5GLEVBQ2xCLElBQUk1RCxFQUFZNEMsS0FBVzNDLEVBQUU4QixRQUFRYSxJQUFVM0MsRUFBRW9KLFlBQVl6RyxJQUFTLENBRS9Eb0csSUFBU3BHLEVBQVFrRyxFQUFRbEcsRUFBT29HLEVBQVNDLEdBQzlDLElBQUlLLEdBQUksRUFBR0MsRUFBTTNHLEVBQU1oRCxNQUV2QixLQURBdUosRUFBT3ZKLFFBQVUySixFQUNOQSxFQUFKRCxHQUNMSCxFQUFPQyxLQUFTeEcsRUFBTTBHLFNBRWRMLEtBQ1ZFLEVBQU9DLEtBQVN4RyxHQUdwQixNQUFPdUcsR0FJVGxKLEdBQUU2SSxRQUFVLFNBQVMxSSxFQUFPNEksR0FDMUIsTUFBT0YsR0FBUTFJLEVBQU80SSxHQUFTLElBSWpDL0ksRUFBRXVKLFFBQVUsU0FBU3BKLEdBQ25CLE1BQU9ILEdBQUV3SixXQUFXckosRUFBT3VCLEVBQU1rQixLQUFLM0MsVUFBVyxLQU1uREQsRUFBRXlKLEtBQU96SixFQUFFMEosT0FBUyxTQUFTdkosRUFBT3dKLEVBQVVwSyxFQUFVTSxHQUN0RCxHQUFhLE1BQVRNLEVBQWUsUUFDZEgsR0FBRTRKLFVBQVVELEtBQ2Y5SixFQUFVTixFQUNWQSxFQUFXb0ssRUFDWEEsR0FBVyxHQUVHLE1BQVpwSyxJQUFrQkEsRUFBV2MsRUFBR2QsRUFBVU0sR0FHOUMsS0FBSyxHQUZEaUUsTUFDQStGLEtBQ0tsRyxFQUFJLEVBQUdoRSxFQUFTUSxFQUFNUixPQUFZQSxFQUFKZ0UsRUFBWUEsSUFBSyxDQUN0RCxHQUFJaEIsR0FBUXhDLEVBQU13RCxHQUNkNkMsRUFBV2pILEVBQVdBLEVBQVNvRCxFQUFPZ0IsRUFBR3hELEdBQVN3QyxDQUNsRGdILElBQ0doRyxHQUFLa0csSUFBU3JELEdBQVUxQyxFQUFPN0MsS0FBSzBCLEdBQ3pDa0gsRUFBT3JELEdBQ0VqSCxFQUNKUyxFQUFFZ0IsU0FBUzZJLEVBQU1yRCxLQUNwQnFELEVBQUs1SSxLQUFLdUYsR0FDVjFDLEVBQU83QyxLQUFLMEIsSUFFSjNDLEVBQUVnQixTQUFTOEMsRUFBUW5CLElBQzdCbUIsRUFBTzdDLEtBQUswQixHQUdoQixNQUFPbUIsSUFLVDlELEVBQUU4SixNQUFRLFdBQ1IsTUFBTzlKLEdBQUV5SixLQUFLWixFQUFRNUksV0FBVyxHQUFNLEtBS3pDRCxFQUFFK0osYUFBZSxTQUFTNUosR0FDeEIsR0FBYSxNQUFUQSxFQUFlLFFBR25CLEtBQUssR0FGRDJELE1BQ0FrRyxFQUFhL0osVUFBVU4sT0FDbEJnRSxFQUFJLEVBQUdoRSxFQUFTUSxFQUFNUixPQUFZQSxFQUFKZ0UsRUFBWUEsSUFBSyxDQUN0RCxHQUFJc0csR0FBTzlKLEVBQU13RCxFQUNqQixLQUFJM0QsRUFBRWdCLFNBQVM4QyxFQUFRbUcsR0FBdkIsQ0FDQSxJQUFLLEdBQUlaLEdBQUksRUFBT1csRUFBSlgsR0FDVHJKLEVBQUVnQixTQUFTZixVQUFVb0osR0FBSVksR0FEQVosS0FHNUJBLElBQU1XLEdBQVlsRyxFQUFPN0MsS0FBS2dKLElBRXBDLE1BQU9uRyxJQUtUOUQsRUFBRXdKLFdBQWEsU0FBU3JKLEdBQ3RCLEdBQUlzSSxHQUFPSSxFQUFRNUksV0FBVyxHQUFNLEVBQU0sRUFDMUMsT0FBT0QsR0FBRWdGLE9BQU83RSxFQUFPLFNBQVN3QyxHQUM5QixPQUFRM0MsRUFBRWdCLFNBQVN5SCxFQUFNOUYsTUFNN0IzQyxFQUFFa0ssSUFBTSxXQUNOLE1BQU9sSyxHQUFFbUssTUFBTWxLLFlBS2pCRCxFQUFFbUssTUFBUSxTQUFTaEssR0FJakIsSUFBSyxHQUhEUixHQUFTUSxHQUFTSCxFQUFFdUcsSUFBSXBHLEVBQU8sVUFBVVIsUUFBVSxFQUNuRG1FLEVBQVN4QyxNQUFNM0IsR0FFVkQsRUFBUSxFQUFXQyxFQUFSRCxFQUFnQkEsSUFDbENvRSxFQUFPcEUsR0FBU00sRUFBRW1HLE1BQU1oRyxFQUFPVCxFQUVqQyxPQUFPb0UsSUFNVDlELEVBQUVvSyxPQUFTLFNBQVNsRixFQUFNVyxHQUV4QixJQUFLLEdBREQvQixNQUNLSCxFQUFJLEVBQUdoRSxFQUFTdUYsR0FBUUEsRUFBS3ZGLE9BQVlBLEVBQUpnRSxFQUFZQSxJQUNwRGtDLEVBQ0YvQixFQUFPb0IsRUFBS3ZCLElBQU1rQyxFQUFPbEMsR0FFekJHLEVBQU9vQixFQUFLdkIsR0FBRyxJQUFNdUIsRUFBS3ZCLEdBQUcsRUFHakMsT0FBT0csSUFPVDlELEVBQUU4RixRQUFVLFNBQVMzRixFQUFPOEosRUFBTU4sR0FDaEMsR0FBSWhHLEdBQUksRUFBR2hFLEVBQVNRLEdBQVNBLEVBQU1SLE1BQ25DLElBQXVCLGdCQUFaZ0ssR0FDVGhHLEVBQWUsRUFBWGdHLEVBQWUzRixLQUFLdUMsSUFBSSxFQUFHNUcsRUFBU2dLLEdBQVlBLE1BQy9DLElBQUlBLEdBQVloSyxFQUVyQixNQURBZ0UsR0FBSTNELEVBQUVxSyxZQUFZbEssRUFBTzhKLEdBQ2xCOUosRUFBTXdELEtBQU9zRyxFQUFPdEcsR0FBSyxDQUVsQyxJQUFJc0csSUFBU0EsRUFDWCxNQUFPakssR0FBRThFLFVBQVVwRCxFQUFNa0IsS0FBS3pDLEVBQU93RCxHQUFJM0QsRUFBRXNLLE1BRTdDLE1BQVczSyxFQUFKZ0UsRUFBWUEsSUFBSyxHQUFJeEQsRUFBTXdELEtBQU9zRyxFQUFNLE1BQU90RyxFQUN0RCxRQUFRLEdBR1YzRCxFQUFFdUssWUFBYyxTQUFTcEssRUFBTzhKLEVBQU1PLEdBQ3BDLEdBQUlyQixHQUFNaEosRUFBUUEsRUFBTVIsT0FBUyxDQUlqQyxJQUhtQixnQkFBUjZLLEtBQ1RyQixFQUFhLEVBQVBxQixFQUFXckIsRUFBTXFCLEVBQU8sRUFBSXhHLEtBQUswQyxJQUFJeUMsRUFBS3FCLEVBQU8sSUFFckRQLElBQVNBLEVBQ1gsTUFBT2pLLEdBQUV5SyxjQUFjL0ksRUFBTWtCLEtBQUt6QyxFQUFPLEVBQUdnSixHQUFNbkosRUFBRXNLLE1BRXRELFFBQVNuQixHQUFPLEdBQUcsR0FBSWhKLEVBQU1nSixLQUFTYyxFQUFNLE1BQU9kLEVBQ25ELFFBQVEsR0FpQlZuSixFQUFFOEUsVUFBWTVFLEVBQWtCLEdBRWhDRixFQUFFeUssY0FBZ0J2SyxHQUFtQixHQUlyQ0YsRUFBRXFLLFlBQWMsU0FBU2xLLEVBQU9iLEVBQUtDLEVBQVVNLEdBQzdDTixFQUFXYyxFQUFHZCxFQUFVTSxFQUFTLEVBR2pDLEtBRkEsR0FBSThDLEdBQVFwRCxFQUFTRCxHQUNqQm9MLEVBQU0sRUFBR0MsRUFBT3hLLEVBQU1SLE9BQ2JnTCxFQUFORCxHQUFZLENBQ2pCLEdBQUlFLEdBQU01RyxLQUFLNkcsT0FBT0gsRUFBTUMsR0FBUSxFQUNoQ3BMLEdBQVNZLEVBQU15SyxJQUFRakksRUFBTytILEVBQU1FLEVBQU0sRUFBUUQsRUFBT0MsRUFFL0QsTUFBT0YsSUFNVDFLLEVBQUU4SyxNQUFRLFNBQVNDLEVBQU9DLEVBQU1DLEdBQzFCaEwsVUFBVU4sUUFBVSxJQUN0QnFMLEVBQU9ELEdBQVMsRUFDaEJBLEVBQVEsR0FFVkUsRUFBT0EsR0FBUSxDQUtmLEtBQUssR0FIRHRMLEdBQVNxRSxLQUFLdUMsSUFBSXZDLEtBQUtrSCxNQUFNRixFQUFPRCxHQUFTRSxHQUFPLEdBQ3BESCxFQUFReEosTUFBTTNCLEdBRVR3SixFQUFNLEVBQVN4SixFQUFOd0osRUFBY0EsSUFBTzRCLEdBQVNFLEVBQzlDSCxFQUFNM0IsR0FBTzRCLENBR2YsT0FBT0QsR0FRVCxJQUFJSyxHQUFlLFNBQVNDLEVBQVlDLEVBQVd4TCxFQUFTeUwsRUFBZ0JyRixHQUMxRSxLQUFNcUYsWUFBMEJELElBQVksTUFBT0QsR0FBV3BJLE1BQU1uRCxFQUFTb0csRUFDN0UsSUFBSXNGLEdBQU8xSCxFQUFXdUgsRUFBV3hLLFdBQzdCa0QsRUFBU3NILEVBQVdwSSxNQUFNdUksRUFBTXRGLEVBQ3BDLE9BQUlqRyxHQUFFa0QsU0FBU1ksR0FBZ0JBLEVBQ3hCeUgsRUFNVHZMLEdBQUVpQyxLQUFPLFNBQVNRLEVBQU01QyxHQUN0QixHQUFJbUMsR0FBY1MsRUFBS1IsT0FBU0QsRUFBWSxNQUFPQSxHQUFXZ0IsTUFBTVAsRUFBTWYsRUFBTWtCLEtBQUszQyxVQUFXLEdBQ2hHLEtBQUtELEVBQUVXLFdBQVc4QixHQUFPLEtBQU0sSUFBSStJLFdBQVUsb0NBQzdDLElBQUl2RixHQUFPdkUsRUFBTWtCLEtBQUszQyxVQUFXLEdBQzdCd0wsRUFBUSxXQUNWLE1BQU9OLEdBQWExSSxFQUFNZ0osRUFBTzVMLEVBQVNzQixLQUFNOEUsRUFBS3lGLE9BQU9oSyxFQUFNa0IsS0FBSzNDLGFBRXpFLE9BQU93TCxJQU1UekwsRUFBRTJMLFFBQVUsU0FBU2xKLEdBQ25CLEdBQUltSixHQUFZbEssRUFBTWtCLEtBQUszQyxVQUFXLEdBQ2xDd0wsRUFBUSxXQUdWLElBQUssR0FGREksR0FBVyxFQUFHbE0sRUFBU2lNLEVBQVVqTSxPQUNqQ3NHLEVBQU8zRSxNQUFNM0IsR0FDUmdFLEVBQUksRUFBT2hFLEVBQUpnRSxFQUFZQSxJQUMxQnNDLEVBQUt0QyxHQUFLaUksRUFBVWpJLEtBQU8zRCxFQUFJQyxVQUFVNEwsS0FBY0QsRUFBVWpJLEVBRW5FLE1BQU9rSSxFQUFXNUwsVUFBVU4sUUFBUXNHLEVBQUtoRixLQUFLaEIsVUFBVTRMLEtBQ3hELE9BQU9WLEdBQWExSSxFQUFNZ0osRUFBT3RLLEtBQU1BLEtBQU04RSxHQUUvQyxPQUFPd0YsSUFNVHpMLEVBQUU4TCxRQUFVLFNBQVN4TSxHQUNuQixHQUFJcUUsR0FBOEJDLEVBQTNCakUsRUFBU00sVUFBVU4sTUFDMUIsSUFBYyxHQUFWQSxFQUFhLEtBQU0sSUFBSW9NLE9BQU0sd0NBQ2pDLEtBQUtwSSxFQUFJLEVBQU9oRSxFQUFKZ0UsRUFBWUEsSUFDdEJDLEVBQU0zRCxVQUFVMEQsR0FDaEJyRSxFQUFJc0UsR0FBTzVELEVBQUVpQyxLQUFLM0MsRUFBSXNFLEdBQU10RSxFQUU5QixPQUFPQSxJQUlUVSxFQUFFZ00sUUFBVSxTQUFTdkosRUFBTXdKLEdBQ3pCLEdBQUlELEdBQVUsU0FBU3BJLEdBQ3JCLEdBQUlzSSxHQUFRRixFQUFRRSxNQUNoQkMsRUFBVSxJQUFNRixFQUFTQSxFQUFPakosTUFBTTdCLEtBQU1sQixXQUFhMkQsRUFFN0QsT0FESzVELEdBQUVlLElBQUltTCxFQUFPQyxLQUFVRCxFQUFNQyxHQUFXMUosRUFBS08sTUFBTTdCLEtBQU1sQixZQUN2RGlNLEVBQU1DLEdBR2YsT0FEQUgsR0FBUUUsU0FDREYsR0FLVGhNLEVBQUVvTSxNQUFRLFNBQVMzSixFQUFNNEosR0FDdkIsR0FBSXBHLEdBQU92RSxFQUFNa0IsS0FBSzNDLFVBQVcsRUFDakMsT0FBT3FNLFlBQVcsV0FDaEIsTUFBTzdKLEdBQUtPLE1BQU0sS0FBTWlELElBQ3ZCb0csSUFLTHJNLEVBQUV1TSxNQUFRdk0sRUFBRTJMLFFBQVEzTCxFQUFFb00sTUFBT3BNLEVBQUcsR0FPaENBLEVBQUV3TSxTQUFXLFNBQVMvSixFQUFNNEosRUFBTUksR0FDaEMsR0FBSTVNLEdBQVNvRyxFQUFNbkMsRUFDZjRJLEVBQVUsS0FDVkMsRUFBVyxDQUNWRixLQUFTQSxLQUNkLElBQUlHLEdBQVEsV0FDVkQsRUFBV0YsRUFBUUksV0FBWSxFQUFRLEVBQUk3TSxFQUFFOE0sTUFDN0NKLEVBQVUsS0FDVjVJLEVBQVNyQixFQUFLTyxNQUFNbkQsRUFBU29HLEdBQ3hCeUcsSUFBUzdNLEVBQVVvRyxFQUFPLE1BRWpDLE9BQU8sWUFDTCxHQUFJNkcsR0FBTTlNLEVBQUU4TSxLQUNQSCxJQUFZRixFQUFRSSxXQUFZLElBQU9GLEVBQVdHLEVBQ3ZELElBQUlDLEdBQVlWLEdBQVFTLEVBQU1ILEVBYzlCLE9BYkE5TSxHQUFVc0IsS0FDVjhFLEVBQU9oRyxVQUNVLEdBQWI4TSxHQUFrQkEsRUFBWVYsR0FDNUJLLElBQ0ZNLGFBQWFOLEdBQ2JBLEVBQVUsTUFFWkMsRUFBV0csRUFDWGhKLEVBQVNyQixFQUFLTyxNQUFNbkQsRUFBU29HLEdBQ3hCeUcsSUFBUzdNLEVBQVVvRyxFQUFPLE9BQ3JCeUcsR0FBV0QsRUFBUVEsWUFBYSxJQUMxQ1AsRUFBVUosV0FBV00sRUFBT0csSUFFdkJqSixJQVFYOUQsRUFBRWtOLFNBQVcsU0FBU3pLLEVBQU00SixFQUFNYyxHQUNoQyxHQUFJVCxHQUFTekcsRUFBTXBHLEVBQVN1TixFQUFXdEosRUFFbkM4SSxFQUFRLFdBQ1YsR0FBSXBFLEdBQU94SSxFQUFFOE0sTUFBUU0sQ0FFVmYsR0FBUDdELEdBQWVBLEdBQVEsRUFDekJrRSxFQUFVSixXQUFXTSxFQUFPUCxFQUFPN0QsSUFFbkNrRSxFQUFVLEtBQ0xTLElBQ0hySixFQUFTckIsRUFBS08sTUFBTW5ELEVBQVNvRyxHQUN4QnlHLElBQVM3TSxFQUFVb0csRUFBTyxRQUtyQyxPQUFPLFlBQ0xwRyxFQUFVc0IsS0FDVjhFLEVBQU9oRyxVQUNQbU4sRUFBWXBOLEVBQUU4TSxLQUNkLElBQUlPLEdBQVVGLElBQWNULENBTzVCLE9BTktBLEtBQVNBLEVBQVVKLFdBQVdNLEVBQU9QLElBQ3RDZ0IsSUFDRnZKLEVBQVNyQixFQUFLTyxNQUFNbkQsRUFBU29HLEdBQzdCcEcsRUFBVW9HLEVBQU8sTUFHWm5DLElBT1g5RCxFQUFFc04sS0FBTyxTQUFTN0ssRUFBTThLLEdBQ3RCLE1BQU92TixHQUFFMkwsUUFBUTRCLEVBQVM5SyxJQUk1QnpDLEVBQUVvRixPQUFTLFNBQVNoRixHQUNsQixNQUFPLFlBQ0wsT0FBUUEsRUFBVTRDLE1BQU03QixLQUFNbEIsYUFNbENELEVBQUV3TixRQUFVLFdBQ1YsR0FBSXZILEdBQU9oRyxVQUNQOEssRUFBUTlFLEVBQUt0RyxPQUFTLENBQzFCLE9BQU8sWUFHTCxJQUZBLEdBQUlnRSxHQUFJb0gsRUFDSmpILEVBQVNtQyxFQUFLOEUsR0FBTy9ILE1BQU03QixLQUFNbEIsV0FDOUIwRCxLQUFLRyxFQUFTbUMsRUFBS3RDLEdBQUdmLEtBQUt6QixLQUFNMkMsRUFDeEMsT0FBT0EsS0FLWDlELEVBQUV5TixNQUFRLFNBQVNDLEVBQU9qTCxHQUN4QixNQUFPLFlBQ0wsUUFBTWlMLEVBQVEsRUFDTGpMLEVBQUtPLE1BQU03QixLQUFNbEIsV0FEMUIsU0FPSkQsRUFBRTJOLE9BQVMsU0FBU0QsRUFBT2pMLEdBQ3pCLEdBQUlqRCxFQUNKLE9BQU8sWUFLTCxRQUpNa08sRUFBUSxJQUNabE8sRUFBT2lELEVBQUtPLE1BQU03QixLQUFNbEIsWUFFYixHQUFUeU4sSUFBWWpMLEVBQU8sTUFDaEJqRCxJQU1YUSxFQUFFNE4sS0FBTzVOLEVBQUUyTCxRQUFRM0wsRUFBRTJOLE9BQVEsRUFNN0IsSUFBSUUsS0FBZWxNLFNBQVUsTUFBTW1NLHFCQUFxQixZQUNwRHROLEdBQXNCLFVBQVcsZ0JBQWlCLFdBQ2xDLHVCQUF3QixpQkFBa0IsaUJBcUI5RFIsR0FBRVAsS0FBTyxTQUFTSCxHQUNoQixJQUFLVSxFQUFFa0QsU0FBUzVELEdBQU0sUUFDdEIsSUFBSXlDLEVBQVksTUFBT0EsR0FBV3pDLEVBQ2xDLElBQUlHLEtBQ0osS0FBSyxHQUFJbUUsS0FBT3RFLEdBQVNVLEVBQUVlLElBQUl6QixFQUFLc0UsSUFBTW5FLEVBQUt3QixLQUFLMkMsRUFHcEQsT0FESWlLLElBQVl2TixFQUFvQmhCLEVBQUtHLEdBQ2xDQSxHQUlUTyxFQUFFK04sUUFBVSxTQUFTek8sR0FDbkIsSUFBS1UsRUFBRWtELFNBQVM1RCxHQUFNLFFBQ3RCLElBQUlHLEtBQ0osS0FBSyxHQUFJbUUsS0FBT3RFLEdBQUtHLEVBQUt3QixLQUFLMkMsRUFHL0IsT0FESWlLLElBQVl2TixFQUFvQmhCLEVBQUtHLEdBQ2xDQSxHQUlUTyxFQUFFNkYsT0FBUyxTQUFTdkcsR0FJbEIsSUFBSyxHQUhERyxHQUFPTyxFQUFFUCxLQUFLSCxHQUNkSyxFQUFTRixFQUFLRSxPQUNka0csRUFBU3ZFLE1BQU0zQixHQUNWZ0UsRUFBSSxFQUFPaEUsRUFBSmdFLEVBQVlBLElBQzFCa0MsRUFBT2xDLEdBQUtyRSxFQUFJRyxFQUFLa0UsR0FFdkIsT0FBT2tDLElBS1Q3RixFQUFFZ08sVUFBWSxTQUFTMU8sRUFBS0MsRUFBVU0sR0FDcENOLEVBQVdjLEVBQUdkLEVBQVVNLEVBS3RCLEtBQUssR0FEREQsR0FIRkgsRUFBUU8sRUFBRVAsS0FBS0gsR0FDYkssRUFBU0YsRUFBS0UsT0FDZDJFLEtBRUs1RSxFQUFRLEVBQVdDLEVBQVJELEVBQWdCQSxJQUNsQ0UsRUFBYUgsRUFBS0MsR0FDbEI0RSxFQUFRMUUsR0FBY0wsRUFBU0QsRUFBSU0sR0FBYUEsRUFBWU4sRUFFOUQsT0FBT2dGLElBSVh0RSxFQUFFaU8sTUFBUSxTQUFTM08sR0FJakIsSUFBSyxHQUhERyxHQUFPTyxFQUFFUCxLQUFLSCxHQUNkSyxFQUFTRixFQUFLRSxPQUNkc08sRUFBUTNNLE1BQU0zQixHQUNUZ0UsRUFBSSxFQUFPaEUsRUFBSmdFLEVBQVlBLElBQzFCc0ssRUFBTXRLLElBQU1sRSxFQUFLa0UsR0FBSXJFLEVBQUlHLEVBQUtrRSxJQUVoQyxPQUFPc0ssSUFJVGpPLEVBQUVrTyxPQUFTLFNBQVM1TyxHQUdsQixJQUFLLEdBRkR3RSxNQUNBckUsRUFBT08sRUFBRVAsS0FBS0gsR0FDVHFFLEVBQUksRUFBR2hFLEVBQVNGLEVBQUtFLE9BQVlBLEVBQUpnRSxFQUFZQSxJQUNoREcsRUFBT3hFLEVBQUlHLEVBQUtrRSxLQUFPbEUsRUFBS2tFLEVBRTlCLE9BQU9HLElBS1Q5RCxFQUFFbU8sVUFBWW5PLEVBQUVvTyxRQUFVLFNBQVM5TyxHQUNqQyxHQUFJK08sS0FDSixLQUFLLEdBQUl6SyxLQUFPdEUsR0FDVlUsRUFBRVcsV0FBV3JCLEVBQUlzRSxLQUFPeUssRUFBTXBOLEtBQUsyQyxFQUV6QyxPQUFPeUssR0FBTWhILFFBSWZySCxFQUFFc08sT0FBU2hMLEVBQWV0RCxFQUFFK04sU0FJNUIvTixFQUFFdU8sVUFBWXZPLEVBQUV3TyxPQUFTbEwsRUFBZXRELEVBQUVQLE1BRzFDTyxFQUFFK0UsUUFBVSxTQUFTekYsRUFBS2MsRUFBV1AsR0FDbkNPLEVBQVlDLEVBQUdELEVBQVdQLEVBRTFCLEtBQUssR0FEbUIrRCxHQUFwQm5FLEVBQU9PLEVBQUVQLEtBQUtILEdBQ1RxRSxFQUFJLEVBQUdoRSxFQUFTRixFQUFLRSxPQUFZQSxFQUFKZ0UsRUFBWUEsSUFFaEQsR0FEQUMsRUFBTW5FLEVBQUtrRSxHQUNQdkQsRUFBVWQsRUFBSXNFLEdBQU1BLEVBQUt0RSxHQUFNLE1BQU9zRSxJQUs5QzVELEVBQUV5TyxLQUFPLFNBQVNyRSxFQUFRc0UsRUFBVzdPLEdBQ25DLEdBQStCTixHQUFVRSxFQUFyQ3FFLEtBQWF4RSxFQUFNOEssQ0FDdkIsSUFBVyxNQUFQOUssRUFBYSxNQUFPd0UsRUFDcEI5RCxHQUFFVyxXQUFXK04sSUFDZmpQLEVBQU9PLEVBQUUrTixRQUFRek8sR0FDakJDLEVBQVdPLEVBQVc0TyxFQUFXN08sS0FFakNKLEVBQU9vSixFQUFRNUksV0FBVyxHQUFPLEVBQU8sR0FDeENWLEVBQVcsU0FBU29ELEVBQU9pQixFQUFLdEUsR0FBTyxNQUFPc0UsS0FBT3RFLElBQ3JEQSxFQUFNaUMsT0FBT2pDLEdBRWYsS0FBSyxHQUFJcUUsR0FBSSxFQUFHaEUsRUFBU0YsRUFBS0UsT0FBWUEsRUFBSmdFLEVBQVlBLElBQUssQ0FDckQsR0FBSUMsR0FBTW5FLEVBQUtrRSxHQUNYaEIsRUFBUXJELEVBQUlzRSxFQUNackUsR0FBU29ELEVBQU9pQixFQUFLdEUsS0FBTXdFLEVBQU9GLEdBQU9qQixHQUUvQyxNQUFPbUIsSUFJVDlELEVBQUUyTyxLQUFPLFNBQVNyUCxFQUFLQyxFQUFVTSxHQUMvQixHQUFJRyxFQUFFVyxXQUFXcEIsR0FDZkEsRUFBV1MsRUFBRW9GLE9BQU83RixPQUNmLENBQ0wsR0FBSUUsR0FBT08sRUFBRW9FLElBQUl5RSxFQUFRNUksV0FBVyxHQUFPLEVBQU8sR0FBSTJPLE9BQ3REclAsR0FBVyxTQUFTb0QsRUFBT2lCLEdBQ3pCLE9BQVE1RCxFQUFFZ0IsU0FBU3ZCLEVBQU1tRSxJQUc3QixNQUFPNUQsR0FBRXlPLEtBQUtuUCxFQUFLQyxFQUFVTSxJQUkvQkcsRUFBRTZPLFNBQVd2TCxFQUFldEQsRUFBRStOLFNBQVMsR0FHdkMvTixFQUFFOE8sTUFBUSxTQUFTeFAsR0FDakIsTUFBS1UsR0FBRWtELFNBQVM1RCxHQUNUVSxFQUFFOEIsUUFBUXhDLEdBQU9BLEVBQUlvQyxRQUFVMUIsRUFBRXNPLFVBQVdoUCxHQUR0QkEsR0FPL0JVLEVBQUUrTyxJQUFNLFNBQVN6UCxFQUFLMFAsR0FFcEIsTUFEQUEsR0FBWTFQLEdBQ0xBLEdBSVRVLEVBQUVpUCxRQUFVLFNBQVM3RSxFQUFRL0QsR0FDM0IsR0FBSTVHLEdBQU9PLEVBQUVQLEtBQUs0RyxHQUFRMUcsRUFBU0YsRUFBS0UsTUFDeEMsSUFBYyxNQUFWeUssRUFBZ0IsT0FBUXpLLENBRTVCLEtBQUssR0FEREwsR0FBTWlDLE9BQU82SSxHQUNSekcsRUFBSSxFQUFPaEUsRUFBSmdFLEVBQVlBLElBQUssQ0FDL0IsR0FBSUMsR0FBTW5FLEVBQUtrRSxFQUNmLElBQUkwQyxFQUFNekMsS0FBU3RFLEVBQUlzRSxNQUFVQSxJQUFPdEUsSUFBTSxPQUFPLEVBRXZELE9BQU8sRUFLVCxJQUFJNFAsR0FBSyxTQUFTMUgsRUFBR0MsRUFBRzBILEVBQVFDLEdBRzlCLEdBQUk1SCxJQUFNQyxFQUFHLE1BQWEsS0FBTkQsR0FBVyxFQUFJQSxJQUFNLEVBQUlDLENBRTdDLElBQVMsTUFBTEQsR0FBa0IsTUFBTEMsRUFBVyxNQUFPRCxLQUFNQyxDQUVyQ0QsYUFBYXhILEtBQUd3SCxFQUFJQSxFQUFFbkYsVUFDdEJvRixZQUFhekgsS0FBR3lILEVBQUlBLEVBQUVwRixTQUUxQixJQUFJZ04sR0FBWTFOLEVBQVNpQixLQUFLNEUsRUFDOUIsSUFBSTZILElBQWMxTixFQUFTaUIsS0FBSzZFLEdBQUksT0FBTyxDQUMzQyxRQUFRNEgsR0FFTixJQUFLLGtCQUVMLElBQUssa0JBR0gsTUFBTyxHQUFLN0gsR0FBTSxHQUFLQyxDQUN6QixLQUFLLGtCQUdILE9BQUtELEtBQU9BLEdBQVdDLEtBQU9BLEVBRWhCLEtBQU5ELEVBQVUsR0FBS0EsSUFBTSxFQUFJQyxHQUFLRCxLQUFPQyxDQUMvQyxLQUFLLGdCQUNMLElBQUssbUJBSUgsT0FBUUQsS0FBT0MsRUFHbkIsR0FBSTZILEdBQTBCLG1CQUFkRCxDQUNoQixLQUFLQyxFQUFXLENBQ2QsR0FBZ0IsZ0JBQUw5SCxJQUE2QixnQkFBTEMsR0FBZSxPQUFPLENBSXpELElBQUk4SCxHQUFRL0gsRUFBRS9HLFlBQWErTyxFQUFRL0gsRUFBRWhILFdBQ3JDLElBQUk4TyxJQUFVQyxLQUFXeFAsRUFBRVcsV0FBVzRPLElBQVVBLFlBQWlCQSxJQUN4Q3ZQLEVBQUVXLFdBQVc2TyxJQUFVQSxZQUFpQkEsS0FDekMsZUFBaUJoSSxJQUFLLGVBQWlCQyxHQUM3RCxPQUFPLEVBUVgwSCxFQUFTQSxNQUNUQyxFQUFTQSxLQUVULEtBREEsR0FBSXpQLEdBQVN3UCxFQUFPeFAsT0FDYkEsS0FHTCxHQUFJd1AsRUFBT3hQLEtBQVk2SCxFQUFHLE1BQU80SCxHQUFPelAsS0FBWThILENBUXRELElBSkEwSCxFQUFPbE8sS0FBS3VHLEdBQ1o0SCxFQUFPbk8sS0FBS3dHLEdBR1I2SCxFQUFXLENBR2IsR0FEQTNQLEVBQVM2SCxFQUFFN0gsT0FDUEEsSUFBVzhILEVBQUU5SCxPQUFRLE9BQU8sQ0FFaEMsTUFBT0EsS0FDTCxJQUFLdVAsRUFBRzFILEVBQUU3SCxHQUFTOEgsRUFBRTlILEdBQVN3UCxFQUFRQyxHQUFTLE9BQU8sTUFFbkQsQ0FFTCxHQUFzQnhMLEdBQWxCbkUsRUFBT08sRUFBRVAsS0FBSytILEVBR2xCLElBRkE3SCxFQUFTRixFQUFLRSxPQUVWSyxFQUFFUCxLQUFLZ0ksR0FBRzlILFNBQVdBLEVBQVEsT0FBTyxDQUN4QyxNQUFPQSxLQUdMLEdBREFpRSxFQUFNbkUsRUFBS0UsSUFDTEssRUFBRWUsSUFBSTBHLEVBQUc3RCxLQUFRc0wsRUFBRzFILEVBQUU1RCxHQUFNNkQsRUFBRTdELEdBQU11TCxFQUFRQyxHQUFVLE9BQU8sRUFNdkUsTUFGQUQsR0FBT00sTUFDUEwsRUFBT0ssT0FDQSxFQUlUelAsR0FBRTBQLFFBQVUsU0FBU2xJLEVBQUdDLEdBQ3RCLE1BQU95SCxHQUFHMUgsRUFBR0MsSUFLZnpILEVBQUUyUCxRQUFVLFNBQVNyUSxHQUNuQixNQUFXLE9BQVBBLEdBQW9CLEVBQ3BCUyxFQUFZVCxLQUFTVSxFQUFFOEIsUUFBUXhDLElBQVFVLEVBQUU0UCxTQUFTdFEsSUFBUVUsRUFBRW9KLFlBQVk5SixJQUE2QixJQUFmQSxFQUFJSyxPQUNoRSxJQUF2QkssRUFBRVAsS0FBS0gsR0FBS0ssUUFJckJLLEVBQUU2UCxVQUFZLFNBQVN2USxHQUNyQixTQUFVQSxHQUF3QixJQUFqQkEsRUFBSXdRLFdBS3ZCOVAsRUFBRThCLFFBQVVELEdBQWlCLFNBQVN2QyxHQUNwQyxNQUE4QixtQkFBdkJxQyxFQUFTaUIsS0FBS3RELElBSXZCVSxFQUFFa0QsU0FBVyxTQUFTNUQsR0FDcEIsR0FBSXlRLFNBQWN6USxFQUNsQixPQUFnQixhQUFUeVEsR0FBZ0MsV0FBVEEsS0FBdUJ6USxHQUl2RFUsRUFBRWtFLE1BQU0sWUFBYSxXQUFZLFNBQVUsU0FBVSxPQUFRLFNBQVUsU0FBVSxTQUFTOEwsR0FDeEZoUSxFQUFFLEtBQU9nUSxHQUFRLFNBQVMxUSxHQUN4QixNQUFPcUMsR0FBU2lCLEtBQUt0RCxLQUFTLFdBQWEwUSxFQUFPLE9BTWpEaFEsRUFBRW9KLFlBQVluSixhQUNqQkQsRUFBRW9KLFlBQWMsU0FBUzlKLEdBQ3ZCLE1BQU9VLEdBQUVlLElBQUl6QixFQUFLLFlBTUosa0JBQVAsS0FBeUMsZ0JBQWIyUSxhQUNyQ2pRLEVBQUVXLFdBQWEsU0FBU3JCLEdBQ3RCLE1BQXFCLGtCQUFQQSxLQUFxQixJQUt2Q1UsRUFBRWtRLFNBQVcsU0FBUzVRLEdBQ3BCLE1BQU80USxVQUFTNVEsS0FBU2dMLE1BQU02RixXQUFXN1EsS0FJNUNVLEVBQUVzSyxNQUFRLFNBQVNoTCxHQUNqQixNQUFPVSxHQUFFb1EsU0FBUzlRLElBQVFBLEtBQVNBLEdBSXJDVSxFQUFFNEosVUFBWSxTQUFTdEssR0FDckIsTUFBT0EsTUFBUSxHQUFRQSxLQUFRLEdBQWdDLHFCQUF2QnFDLEVBQVNpQixLQUFLdEQsSUFJeERVLEVBQUVxUSxPQUFTLFNBQVMvUSxHQUNsQixNQUFlLFFBQVJBLEdBSVRVLEVBQUVzUSxZQUFjLFNBQVNoUixHQUN2QixNQUFPQSxTQUFhLElBS3RCVSxFQUFFZSxJQUFNLFNBQVN6QixFQUFLc0UsR0FDcEIsTUFBYyxPQUFQdEUsR0FBZXNDLEVBQWVnQixLQUFLdEQsRUFBS3NFLElBUWpENUQsRUFBRXVRLFdBQWEsV0FFYixNQURBclAsR0FBS2xCLEVBQUlvQixFQUNGRCxNQUlUbkIsRUFBRWlELFNBQVcsU0FBU04sR0FDcEIsTUFBT0EsSUFJVDNDLEVBQUV3USxTQUFXLFNBQVM3TixHQUNwQixNQUFPLFlBQ0wsTUFBT0EsS0FJWDNDLEVBQUV5USxLQUFPLGFBRVR6USxFQUFFb0QsU0FBVyxTQUFTUSxHQUNwQixNQUFPLFVBQVN0RSxHQUNkLE1BQWMsT0FBUEEsTUFBbUIsR0FBSUEsRUFBSXNFLEtBS3RDNUQsRUFBRTBRLFdBQWEsU0FBU3BSLEdBQ3RCLE1BQWMsT0FBUEEsRUFBYyxhQUFlLFNBQVNzRSxHQUMzQyxNQUFPdEUsR0FBSXNFLEtBTWY1RCxFQUFFbUQsUUFBVW5ELEVBQUUyUSxRQUFVLFNBQVN0SyxHQUUvQixNQURBQSxHQUFRckcsRUFBRXVPLGFBQWNsSSxHQUNqQixTQUFTL0csR0FDZCxNQUFPVSxHQUFFaVAsUUFBUTNQLEVBQUsrRyxLQUsxQnJHLEVBQUUwTixNQUFRLFNBQVN6RyxFQUFHMUgsRUFBVU0sR0FDOUIsR0FBSStRLEdBQVF0UCxNQUFNMEMsS0FBS3VDLElBQUksRUFBR1UsR0FDOUIxSCxHQUFXTyxFQUFXUCxFQUFVTSxFQUFTLEVBQ3pDLEtBQUssR0FBSThELEdBQUksRUFBT3NELEVBQUp0RCxFQUFPQSxJQUFLaU4sRUFBTWpOLEdBQUtwRSxFQUFTb0UsRUFDaEQsT0FBT2lOLElBSVQ1USxFQUFFK0csT0FBUyxTQUFTTCxFQUFLSCxHQUt2QixNQUpXLE9BQVBBLElBQ0ZBLEVBQU1HLEVBQ05BLEVBQU0sR0FFREEsRUFBTTFDLEtBQUs2RyxNQUFNN0csS0FBSytDLFVBQVlSLEVBQU1HLEVBQU0sS0FJdkQxRyxFQUFFOE0sSUFBTStELEtBQUsvRCxLQUFPLFdBQ2xCLE9BQU8sR0FBSStELE9BQU9DLFVBSXBCLElBQUlDLElBQ0ZDLElBQUssUUFDTEMsSUFBSyxPQUNMQyxJQUFLLE9BQ0xDLElBQUssU0FDTEMsSUFBSyxTQUNMQyxJQUFLLFVBRUhDLEVBQWN0UixFQUFFa08sT0FBTzZDLEdBR3ZCUSxFQUFnQixTQUFTbk4sR0FDM0IsR0FBSW9OLEdBQVUsU0FBU0MsR0FDckIsTUFBT3JOLEdBQUlxTixJQUdUaE8sRUFBUyxNQUFRekQsRUFBRVAsS0FBSzJFLEdBQUtzTixLQUFLLEtBQU8sSUFDekNDLEVBQWFDLE9BQU9uTyxHQUNwQm9PLEVBQWdCRCxPQUFPbk8sRUFBUSxJQUNuQyxPQUFPLFVBQVNxTyxHQUVkLE1BREFBLEdBQW1CLE1BQVZBLEVBQWlCLEdBQUssR0FBS0EsRUFDN0JILEVBQVdJLEtBQUtELEdBQVVBLEVBQU9FLFFBQVFILEVBQWVMLEdBQVdNLEdBRzlFOVIsR0FBRWlTLE9BQVNWLEVBQWNSLEdBQ3pCL1EsRUFBRWtTLFNBQVdYLEVBQWNELEdBSTNCdFIsRUFBRThELE9BQVMsU0FBU3NHLEVBQVFoSCxFQUFVK08sR0FDcEMsR0FBSXhQLEdBQWtCLE1BQVZ5SCxNQUFzQixHQUFJQSxFQUFPaEgsRUFJN0MsT0FISVQsU0FBZSxLQUNqQkEsRUFBUXdQLEdBRUhuUyxFQUFFVyxXQUFXZ0MsR0FBU0EsRUFBTUMsS0FBS3dILEdBQVV6SCxFQUtwRCxJQUFJeVAsR0FBWSxDQUNoQnBTLEdBQUVxUyxTQUFXLFNBQVNDLEdBQ3BCLEdBQUlDLEtBQU9ILEVBQVksRUFDdkIsT0FBT0UsR0FBU0EsRUFBU0MsRUFBS0EsR0FLaEN2UyxFQUFFd1Msa0JBQ0FDLFNBQWMsa0JBQ2RDLFlBQWMsbUJBQ2RULE9BQWMsbUJBTWhCLElBQUlVLEdBQVUsT0FJVkMsR0FDRnhCLElBQVUsSUFDVnlCLEtBQVUsS0FDVkMsS0FBVSxJQUNWQyxLQUFVLElBQ1ZDLFNBQVUsUUFDVkMsU0FBVSxTQUdSekIsRUFBVSw0QkFFVjBCLEVBQWEsU0FBU3pCLEdBQ3hCLE1BQU8sS0FBT21CLEVBQVFuQixHQU94QnpSLEdBQUVtVCxTQUFXLFNBQVNDLEVBQU1DLEVBQVVDLElBQy9CRCxHQUFZQyxJQUFhRCxFQUFXQyxHQUN6Q0QsRUFBV3JULEVBQUU2TyxZQUFhd0UsRUFBVXJULEVBQUV3UyxpQkFHdEMsSUFBSXJQLEdBQVV5TyxTQUNYeUIsRUFBU3BCLFFBQVVVLEdBQVNsUCxRQUM1QjRQLEVBQVNYLGFBQWVDLEdBQVNsUCxRQUNqQzRQLEVBQVNaLFVBQVlFLEdBQVNsUCxRQUMvQmlPLEtBQUssS0FBTyxLQUFNLEtBR2hCaFMsRUFBUSxFQUNSK0QsRUFBUyxRQUNiMlAsR0FBS3BCLFFBQVE3TyxFQUFTLFNBQVNzTyxFQUFPUSxFQUFRUyxFQUFhRCxFQUFVYyxHQWFuRSxNQVpBOVAsSUFBVTJQLEVBQUsxUixNQUFNaEMsRUFBTzZULEdBQVF2QixRQUFRUixFQUFTMEIsR0FDckR4VCxFQUFRNlQsRUFBUzlCLEVBQU05UixPQUVuQnNTLEVBQ0Z4TyxHQUFVLGNBQWdCd08sRUFBUyxpQ0FDMUJTLEVBQ1RqUCxHQUFVLGNBQWdCaVAsRUFBYyx1QkFDL0JELElBQ1RoUCxHQUFVLE9BQVNnUCxFQUFXLFlBSXpCaEIsSUFFVGhPLEdBQVUsT0FHTDRQLEVBQVNHLFdBQVUvUCxFQUFTLG1CQUFxQkEsRUFBUyxPQUUvREEsRUFBUywyQ0FDUCxvREFDQUEsRUFBUyxlQUVYLEtBQ0UsR0FBSWdRLEdBQVMsR0FBSWhTLFVBQVM0UixFQUFTRyxVQUFZLE1BQU8sSUFBSy9QLEdBQzNELE1BQU9pUSxHQUVQLEtBREFBLEdBQUVqUSxPQUFTQSxFQUNMaVEsRUFHUixHQUFJUCxHQUFXLFNBQVNRLEdBQ3RCLE1BQU9GLEdBQU83USxLQUFLekIsS0FBTXdTLEVBQU0zVCxJQUk3QjRULEVBQVdQLEVBQVNHLFVBQVksS0FHcEMsT0FGQUwsR0FBUzFQLE9BQVMsWUFBY21RLEVBQVcsT0FBU25RLEVBQVMsSUFFdEQwUCxHQUlUblQsRUFBRTZULE1BQVEsU0FBU3ZVLEdBQ2pCLEdBQUl3VSxHQUFXOVQsRUFBRVYsRUFFakIsT0FEQXdVLEdBQVNDLFFBQVMsRUFDWEQsRUFVVCxJQUFJaFEsR0FBUyxTQUFTZ1EsRUFBVXhVLEdBQzlCLE1BQU93VSxHQUFTQyxPQUFTL1QsRUFBRVYsR0FBS3VVLFFBQVV2VSxFQUk1Q1UsR0FBRWdVLE1BQVEsU0FBUzFVLEdBQ2pCVSxFQUFFa0UsS0FBS2xFLEVBQUVtTyxVQUFVN08sR0FBTSxTQUFTMFEsR0FDaEMsR0FBSXZOLEdBQU96QyxFQUFFZ1EsR0FBUTFRLEVBQUkwUSxFQUN6QmhRLEdBQUVZLFVBQVVvUCxHQUFRLFdBQ2xCLEdBQUkvSixJQUFROUUsS0FBS2tCLFNBRWpCLE9BREFwQixHQUFLK0IsTUFBTWlELEVBQU1oRyxXQUNWNkQsRUFBTzNDLEtBQU1zQixFQUFLTyxNQUFNaEQsRUFBR2lHLFFBTXhDakcsRUFBRWdVLE1BQU1oVSxHQUdSQSxFQUFFa0UsTUFBTSxNQUFPLE9BQVEsVUFBVyxRQUFTLE9BQVEsU0FBVSxXQUFZLFNBQVM4TCxHQUNoRixHQUFJaEssR0FBUzNFLEVBQVcyTyxFQUN4QmhRLEdBQUVZLFVBQVVvUCxHQUFRLFdBQ2xCLEdBQUkxUSxHQUFNNkIsS0FBS2tCLFFBR2YsT0FGQTJELEdBQU9oRCxNQUFNMUQsRUFBS1csV0FDSixVQUFUK1AsR0FBNkIsV0FBVEEsR0FBcUMsSUFBZjFRLEVBQUlLLGNBQXFCTCxHQUFJLEdBQ3JFd0UsRUFBTzNDLEtBQU03QixNQUt4QlUsRUFBRWtFLE1BQU0sU0FBVSxPQUFRLFNBQVUsU0FBUzhMLEdBQzNDLEdBQUloSyxHQUFTM0UsRUFBVzJPLEVBQ3hCaFEsR0FBRVksVUFBVW9QLEdBQVEsV0FDbEIsTUFBT2xNLEdBQU8zQyxLQUFNNkUsRUFBT2hELE1BQU03QixLQUFLa0IsU0FBVXBDLGVBS3BERCxFQUFFWSxVQUFVK0IsTUFBUSxXQUNsQixNQUFPeEIsTUFBS2tCLFVBS2RyQyxFQUFFWSxVQUFVcVQsUUFBVWpVLEVBQUVZLFVBQVVzVCxPQUFTbFUsRUFBRVksVUFBVStCLE1BRXZEM0MsRUFBRVksVUFBVWUsU0FBVyxXQUNyQixNQUFPLEdBQUtSLEtBQUtrQixVQVVHLGtCQUFYOFIsU0FBeUJBLE9BQU9DLEtBQ3pDRCxPQUFPLGdCQUFrQixXQUN2QixNQUFPblUsT0FHWDRDLEtBQUt6QiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9vMmMuaHRtbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbzJjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlOGJmMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvbzJjLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPHNjcmlwdD4KK3ZhciBxcCA9IG51bGw7CitpZih3aW5kb3cubG9jYXRpb24uaGFzaCkgeworICBxcCA9IGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpOworfQorZWxzZSB7CisgIHFwID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKTsKK30KK3FwID0gcXAgPyBKU09OLnBhcnNlKCd7IicgKyBxcC5yZXBsYWNlKC8mL2csICciLCInKS5yZXBsYWNlKC89L2csJyI6IicpICsgJyJ9JywKKyAgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgIHJldHVybiBrZXk9PT0iIj92YWx1ZTpkZWNvZGVVUklDb21wb25lbnQodmFsdWUpIH0KKyAgKTp7fQorCitpZiAod2luZG93Lm9wZW5lci5zd2FnZ2VyVWkudG9rZW5VcmwpCisgICAgd2luZG93Lm9wZW5lci5wcm9jZXNzT0F1dGhDb2RlKHFwKTsKK2Vsc2UKKyAgICB3aW5kb3cub3BlbmVyLm9uT0F1dGhDb21wbGV0ZShxcCk7CisKK3dpbmRvdy5jbG9zZSgpOworPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9zd2FnZ2VyLXVpLmpzIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9zd2FnZ2VyLXVpLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjZlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9zd2FnZ2VyL3N3YWdnZXItdWkuanMKQEAgLTAsMCArMSwyMTczOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKioKKyAqIHN3YWdnZXItdWkgLSBTd2FnZ2VyIFVJIGlzIGEgZGVwZW5kZW5jeS1mcmVlIGNvbGxlY3Rpb24gb2YgSFRNTCwgSmF2YVNjcmlwdCwgYW5kIENTUyBhc3NldHMgdGhhdCBkeW5hbWljYWxseSBnZW5lcmF0ZSBiZWF1dGlmdWwgZG9jdW1lbnRhdGlvbiBmcm9tIGEgU3dhZ2dlci1jb21wbGlhbnQgQVBJCisgKiBAdmVyc2lvbiB2Mi4xLjAtTTIKKyAqIEBsaW5rIGh0dHA6Ly9zd2FnZ2VyLmlvCisgKiBAbGljZW5zZSBBcGFjaGUgMi4wCisgKi8KKyhmdW5jdGlvbigpe3RoaXNbIkhhbmRsZWJhcnMiXSA9IHRoaXNbIkhhbmRsZWJhcnMiXSB8fCB7fTsKK3RoaXNbIkhhbmRsZWJhcnMiXVsidGVtcGxhdGVzIl0gPSB0aGlzWyJIYW5kbGViYXJzIl1bInRlbXBsYXRlcyJdIHx8IHt9OwordGhpc1siSGFuZGxlYmFycyJdWyJ0ZW1wbGF0ZXMiXVsiYXBpa2V5X2J1dHRvbl92aWV3Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls2LCI+PSAyLjAuMC1iZXRhLjEiXSwibWFpbiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIjwhLS1kaXYgY2xhc3M9J2F1dGhfYnV0dG9uJyBpZD0nYXBpa2V5X2J1dHRvbic+PGltZyBjbGFzcz0nYXV0aF9pY29uJyBhbHQ9J2FwcGx5IGFwaSBrZXknIHNyYz0naW1hZ2VzL2FwaWtleS5qcGVnJz48L2Rpdi0tPlxuPGRpdiBjbGFzcz0nYXV0aF9jb250YWluZXInIGlkPSdhcGlrZXlfY29udGFpbmVyJz5cbiAgPGRpdiBjbGFzcz0na2V5X2lucHV0X2NvbnRhaW5lcic+XG4gICAgPGRpdiBjbGFzcz0nYXV0aF9sYWJlbCc+IgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleU5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmtleU5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoia2V5TmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICI8L2Rpdj5cbiAgICA8aW5wdXQgcGxhY2Vob2xkZXI9XCJhcGlfa2V5XCIgY2xhc3M9XCJhdXRoX2lucHV0XCIgaWQ9XCJpbnB1dF9hcGlLZXlfZW50cnlcIiBuYW1lPVwiYXBpS2V5XCIgdHlwZT1cInRleHRcIi8+XG4gICAgPGRpdiBjbGFzcz0nYXV0aF9zdWJtaXQnPjxhIGNsYXNzPSdhdXRoX3N1Ym1pdF9idXR0b24nIGlkPVwiYXBwbHlfYXBpX2tleVwiIGhyZWY9XCIjXCI+YXBwbHk8L2E+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiI7Cit9LCJ1c2VEYXRhIjp0cnVlfSk7Cit0aGlzWyJIYW5kbGViYXJzIl1bInRlbXBsYXRlcyJdWyJiYXNpY19hdXRoX2J1dHRvbl92aWV3Il0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls2LCI+PSAyLjAuMC1iZXRhLjEiXSwibWFpbiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIjxkaXYgY2xhc3M9J2F1dGhfYnV0dG9uJyBpZD0nYmFzaWNfYXV0aF9idXR0b24nPjxpbWcgY2xhc3M9J2F1dGhfaWNvbicgc3JjPSdpbWFnZXMvcGFzc3dvcmQuanBlZyc+PC9kaXY+XG48ZGl2IGNsYXNzPSdhdXRoX2NvbnRhaW5lcicgaWQ9J2Jhc2ljX2F1dGhfY29udGFpbmVyJz5cbiAgPGRpdiBjbGFzcz0na2V5X2lucHV0X2NvbnRhaW5lcic+XG4gICAgPGRpdiBjbGFzcz1cImF1dGhfbGFiZWxcIj5Vc2VybmFtZTwvZGl2PlxuICAgIDxpbnB1dCBwbGFjZWhvbGRlcj1cInVzZXJuYW1lXCIgY2xhc3M9XCJhdXRoX2lucHV0XCIgaWQ9XCJpbnB1dF91c2VybmFtZVwiIG5hbWU9XCJ1c2VybmFtZVwiIHR5cGU9XCJ0ZXh0XCIvPlxuICAgIDxkaXYgY2xhc3M9XCJhdXRoX2xhYmVsXCI+UGFzc3dvcmQ8L2Rpdj5cbiAgICA8aW5wdXQgcGxhY2Vob2xkZXI9XCJwYXNzd29yZFwiIGNsYXNzPVwiYXV0aF9pbnB1dFwiIGlkPVwiaW5wdXRfcGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiB0eXBlPVwicGFzc3dvcmRcIi8+XG4gICAgPGRpdiBjbGFzcz0nYXV0aF9zdWJtaXQnPjxhIGNsYXNzPSdhdXRoX3N1Ym1pdF9idXR0b24nIGlkPVwiYXBwbHlfYmFzaWNfYXV0aFwiIGhyZWY9XCIjXCI+YXBwbHk8L2E+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiI7CisgIH0sInVzZURhdGEiOnRydWV9KTsKK3RoaXNbIkhhbmRsZWJhcnMiXVsidGVtcGxhdGVzIl1bImNvbnRlbnRfdHlwZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgYnVmZmVyID0gIiI7CisgIHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnByb2R1Y2VzIDogZGVwdGgwKSwgeyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDIsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlcjsKK30sIjIiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgbGFtYmRhPXRoaXMubGFtYmRhLCBidWZmZXIgPSAiCTxvcHRpb24gdmFsdWU9XCIiOworICBzdGFjazEgPSBsYW1iZGEoZGVwdGgwLCBkZXB0aDApOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlwiPiI7CisgIHN0YWNrMSA9IGxhbWJkYShkZXB0aDAsIGRlcHRoMCk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXIgKyAiPC9vcHRpb24+XG4iOworfSwiNCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgPG9wdGlvbiB2YWx1ZT1cImFwcGxpY2F0aW9uL2pzb25cIj5hcHBsaWNhdGlvbi9qc29uPC9vcHRpb24+XG4iOworICB9LCJjb21waWxlciI6WzYsIj49IDIuMC4wLWJldGEuMSJdLCJtYWluIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICI8bGFiZWwgZm9yPVwiY29udGVudFR5cGVcIj48L2xhYmVsPlxuPHNlbGVjdCBuYW1lPVwiY29udGVudFR5cGVcIj5cbiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wcm9kdWNlcyA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMSwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg0LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyICsgIjwvc2VsZWN0PlxuIjsKK30sInVzZURhdGEiOnRydWV9KTsKKyd1c2Ugc3RyaWN0JzsKKworCiskKGZ1bmN0aW9uKCkgeworCisJLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB2ZXJ0aWNhbGx5IGFsaWduaW5nIERPTSBlbGVtZW50cworCS8vIGh0dHA6Ly93d3cuc2VvZGVudmVyLmNvbS9zaW1wbGUtdmVydGljYWwtYWxpZ24tcGx1Z2luLWZvci1qcXVlcnkvCisJJC5mbi52QWxpZ24gPSBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJdmFyIGFoID0gJCh0aGlzKS5oZWlnaHQoKTsKKwkJCXZhciBwaCA9ICQodGhpcykucGFyZW50KCkuaGVpZ2h0KCk7CisJCQl2YXIgbWggPSAocGggLSBhaCkgLyAyOworCQkJJCh0aGlzKS5jc3MoJ21hcmdpbi10b3AnLCBtaCk7CisJCX0pOworCX07CisKKwkkLmZuLnN0cmV0Y2hGb3JtdGFzdGljSW5wdXRXaWR0aFRvUGFyZW50ID0gZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCXZhciBwX3dpZHRoID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuaW5uZXJXaWR0aCgpOworCQkJdmFyIHBfcGFkZGluZyA9IHBhcnNlSW50KCQodGhpcykuY2xvc2VzdCgiZm9ybSIpLmNzcygncGFkZGluZy1sZWZ0JykgLDEwKSArIHBhcnNlSW50KCQodGhpcykuY2xvc2VzdCgnZm9ybScpLmNzcygncGFkZGluZy1yaWdodCcpLCAxMCk7CisJCQl2YXIgdGhpc19wYWRkaW5nID0gcGFyc2VJbnQoJCh0aGlzKS5jc3MoJ3BhZGRpbmctbGVmdCcpLCAxMCkgKyBwYXJzZUludCgkKHRoaXMpLmNzcygncGFkZGluZy1yaWdodCcpLCAxMCk7CisJCQkkKHRoaXMpLmNzcygnd2lkdGgnLCBwX3dpZHRoIC0gcF9wYWRkaW5nIC0gdGhpc19wYWRkaW5nKTsKKwkJfSk7CisJfTsKKworCSQoJ2Zvcm0uZm9ybXRhc3RpYyBsaS5zdHJpbmcgaW5wdXQsIGZvcm0uZm9ybXRhc3RpYyB0ZXh0YXJlYScpLnN0cmV0Y2hGb3JtdGFzdGljSW5wdXRXaWR0aFRvUGFyZW50KCk7CisKKwkvLyBWZXJ0aWNhbGx5IGNlbnRlciB0aGVzZSBwYXJhZ3JhcGhzCisJLy8gUGFyZW50IG1heSBuZWVkIGEgbWluLWhlaWdodCBmb3IgdGhpcyB0byB3b3JrLi4KKwkkKCd1bC5kb3ducGxheWVkIGxpIGRpdi5jb250ZW50IHAnKS52QWxpZ24oKTsKKworCS8vIFdoZW4gYSBzYW5kYm94IGZvcm0gaXMgc3VibWl0dGVkLi4KKwkkKCJmb3JtLnNhbmRib3giKS5zdWJtaXQoZnVuY3Rpb24oKXsKKworCQl2YXIgZXJyb3JfZnJlZSA9IHRydWU7CisKKwkJLy8gQ3ljbGUgdGhyb3VnaCB0aGUgZm9ybXMgcmVxdWlyZWQgaW5wdXRzCisgCQkkKHRoaXMpLmZpbmQoImlucHV0LnJlcXVpcmVkIikuZWFjaChmdW5jdGlvbigpIHsKKworCQkJLy8gUmVtb3ZlIGFueSBleGlzdGluZyBlcnJvciBzdHlsZXMgZnJvbSB0aGUgaW5wdXQKKwkJCSQodGhpcykucmVtb3ZlQ2xhc3MoJ2Vycm9yJyk7CisKKwkJCS8vIFRhY2sgdGhlIGVycm9yIHN0eWxlIG9uIGlmIHRoZSBpbnB1dCBpcyBlbXB0eS4uCisJCQlpZiAoJCh0aGlzKS52YWwoKSA9PT0gJycpIHsKKwkJCQkkKHRoaXMpLmFkZENsYXNzKCdlcnJvcicpOworCQkJCSQodGhpcykud2lnZ2xlKCk7CisJCQkJZXJyb3JfZnJlZSA9IGZhbHNlOworCQkJfQorCisJCX0pOworCisJCXJldHVybiBlcnJvcl9mcmVlOworCX0pOworCit9KTsKKworZnVuY3Rpb24gY2xpcHB5Q29waWVkQ2FsbGJhY2soKSB7CisgICQoJyNhcGlfa2V5X2NvcGllZCcpLmZhZGVJbigpLmRlbGF5KDEwMDApLmZhZGVPdXQoKTsKKworICAvLyB2YXIgYiA9ICQoIiNjbGlwcHlfdG9vbHRpcF8iICsgYSk7CisgIC8vIGIubGVuZ3RoICE9IDAgJiYgKGIuYXR0cigidGl0bGUiLCAiY29waWVkISIpLnRyaWdnZXIoInRpcHN5LnJlbG9hZCIpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAvLyAgIGIuYXR0cigidGl0bGUiLCAiY29weSB0byBjbGlwYm9hcmQiKQorICAvLyB9LAorICAvLyA1MDApKQorfQorCisvLyBMb2dnaW5nIGZ1bmN0aW9uIHRoYXQgYWNjb3VudHMgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3QgaGF2ZSB3aW5kb3cuY29uc29sZQorZnVuY3Rpb24gbG9nKCl7CisgIGxvZy5oaXN0b3J5ID0gbG9nLmhpc3RvcnkgfHwgW107CisgIGxvZy5oaXN0b3J5LnB1c2goYXJndW1lbnRzKTsKKyAgaWYodGhpcy5jb25zb2xlKXsKKyAgICBjb25zb2xlLmxvZyggQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKVswXSApOworICB9Cit9CisKKy8vIEhhbmRsZSBicm93c2VycyB0aGF0IGRvIGNvbnNvbGUgaW5jb3JyZWN0bHkgKElFOSBhbmQgYmVsb3csIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS81NTM5Mzc4Lzc5MTMpCitpZiAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgJiYgY29uc29sZSAmJiB0eXBlb2YgY29uc29sZS5sb2cgPT09ICJvYmplY3QiKSB7CisgICAgWworICAgICAgImxvZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiLCJhc3NlcnQiLCJkaXIiLCJjbGVhciIsInByb2ZpbGUiLCJwcm9maWxlRW5kIgorICAgIF0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7CisgICAgICAgIGNvbnNvbGVbbWV0aG9kXSA9IHRoaXMuYmluZChjb25zb2xlW21ldGhvZF0sIGNvbnNvbGUpOworICAgIH0sIEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKTsKK30KKword2luZG93LkRvY3MgPSB7CisKKwlzaGViYW5nOiBmdW5jdGlvbigpIHsKKworCQkvLyBJZiBzaGViYW5nIGhhcyBhbiBvcGVyYXRpb24gbmlja25hbWUgaW4gaXQuLgorCQkvLyBlLmcuIC9kb2NzLyMhL3dvcmRzL2dldF9zZWFyY2gKKwkJdmFyIGZyYWdtZW50cyA9ICQucGFyYW0uZnJhZ21lbnQoKS5zcGxpdCgnLycpOworCQlmcmFnbWVudHMuc2hpZnQoKTsgLy8gZ2V0IHJpZCBvZiB0aGUgYmFuZworCisJCXN3aXRjaCAoZnJhZ21lbnRzLmxlbmd0aCkgeworCQkJY2FzZSAxOgorCQkJCS8vIEV4cGFuZCBhbGwgb3BlcmF0aW9ucyBmb3IgdGhlIHJlc291cmNlIGFuZCBzY3JvbGwgdG8gaXQKKwkJCQl2YXIgZG9tX2lkID0gJ3Jlc291cmNlXycgKyBmcmFnbWVudHNbMF07CisKKwkJCQlEb2NzLmV4cGFuZEVuZHBvaW50TGlzdEZvclJlc291cmNlKGZyYWdtZW50c1swXSk7CisJCQkJJCgiIyIrZG9tX2lkKS5zbGlkZXRvKHtoaWdobGlnaHQ6IGZhbHNlfSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJLy8gUmVmZXIgdG8gdGhlIGVuZHBvaW50IERPTSBlbGVtZW50LCBlLmcuICN3b3Jkc19nZXRfc2VhcmNoCisKKyAgICAgICAgLy8gRXhwYW5kIFJlc291cmNlCisgICAgICAgIERvY3MuZXhwYW5kRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UoZnJhZ21lbnRzWzBdKTsKKyAgICAgICAgJCgiIyIrZG9tX2lkKS5zbGlkZXRvKHtoaWdobGlnaHQ6IGZhbHNlfSk7CisKKyAgICAgICAgLy8gRXhwYW5kIG9wZXJhdGlvbgorCQkJCXZhciBsaV9kb21faWQgPSBmcmFnbWVudHMuam9pbignXycpOworCQkJCXZhciBsaV9jb250ZW50X2RvbV9pZCA9IGxpX2RvbV9pZCArICJfY29udGVudCI7CisKKworCQkJCURvY3MuZXhwYW5kT3BlcmF0aW9uKCQoJyMnK2xpX2NvbnRlbnRfZG9tX2lkKSk7CisJCQkJJCgnIycrbGlfZG9tX2lkKS5zbGlkZXRvKHtoaWdobGlnaHQ6IGZhbHNlfSk7CisJCQkJYnJlYWs7CisJCX0KKworCX0sCisKKwl0b2dnbGVFbmRwb2ludExpc3RGb3JSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UpIHsKKwkJdmFyIGVsZW0gPSAkKCdsaSNyZXNvdXJjZV8nICsgRG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUocmVzb3VyY2UpICsgJyB1bC5lbmRwb2ludHMnKTsKKwkJaWYgKGVsZW0uaXMoJzp2aXNpYmxlJykpIHsKKwkJCURvY3MuY29sbGFwc2VFbmRwb2ludExpc3RGb3JSZXNvdXJjZShyZXNvdXJjZSk7CisJCX0gZWxzZSB7CisJCQlEb2NzLmV4cGFuZEVuZHBvaW50TGlzdEZvclJlc291cmNlKHJlc291cmNlKTsKKwkJfQorCX0sCisKKwkvLyBFeHBhbmQgcmVzb3VyY2UKKwlleHBhbmRFbmRwb2ludExpc3RGb3JSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UpIHsKKwkJdmFyIHJlc291cmNlID0gRG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUocmVzb3VyY2UpOworCQlpZiAocmVzb3VyY2UgPT0gJycpIHsKKwkJCSQoJy5yZXNvdXJjZSB1bC5lbmRwb2ludHMnKS5zbGlkZURvd24oKTsKKwkJCXJldHVybjsKKwkJfQorCisJCSQoJ2xpI3Jlc291cmNlXycgKyByZXNvdXJjZSkuYWRkQ2xhc3MoJ2FjdGl2ZScpOworCisJCXZhciBlbGVtID0gJCgnbGkjcmVzb3VyY2VfJyArIHJlc291cmNlICsgJyB1bC5lbmRwb2ludHMnKTsKKwkJZWxlbS5zbGlkZURvd24oKTsKKwl9LAorCisJLy8gQ29sbGFwc2UgcmVzb3VyY2UgYW5kIG1hcmsgYXMgZXhwbGljaXRseSBjbG9zZWQKKwljb2xsYXBzZUVuZHBvaW50TGlzdEZvclJlc291cmNlOiBmdW5jdGlvbihyZXNvdXJjZSkgeworCQl2YXIgcmVzb3VyY2UgPSBEb2NzLmVzY2FwZVJlc291cmNlTmFtZShyZXNvdXJjZSk7CisJCWlmIChyZXNvdXJjZSA9PSAnJykgeworCQkJJCgnLnJlc291cmNlIHVsLmVuZHBvaW50cycpLnNsaWRlVXAoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCSQoJ2xpI3Jlc291cmNlXycgKyByZXNvdXJjZSkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOworCisJCXZhciBlbGVtID0gJCgnbGkjcmVzb3VyY2VfJyArIHJlc291cmNlICsgJyB1bC5lbmRwb2ludHMnKTsKKwkJZWxlbS5zbGlkZVVwKCk7CisJfSwKKworCWV4cGFuZE9wZXJhdGlvbnNGb3JSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UpIHsKKwkJLy8gTWFrZSBzdXJlIHRoZSByZXNvdXJjZSBjb250YWluZXIgaXMgb3Blbi4uCisJCURvY3MuZXhwYW5kRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UocmVzb3VyY2UpOworCisJCWlmIChyZXNvdXJjZSA9PSAnJykgeworCQkJJCgnLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQnKS5zbGlkZURvd24oKTsKKwkJCXJldHVybjsKKwkJfQorCisJCSQoJ2xpI3Jlc291cmNlXycgKyBEb2NzLmVzY2FwZVJlc291cmNlTmFtZShyZXNvdXJjZSkgKyAnIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCcpLmVhY2goZnVuY3Rpb24oKSB7CisJCQlEb2NzLmV4cGFuZE9wZXJhdGlvbigkKHRoaXMpKTsKKwkJfSk7CisJfSwKKworCWNvbGxhcHNlT3BlcmF0aW9uc0ZvclJlc291cmNlOiBmdW5jdGlvbihyZXNvdXJjZSkgeworCQkvLyBNYWtlIHN1cmUgdGhlIHJlc291cmNlIGNvbnRhaW5lciBpcyBvcGVuLi4KKwkJRG9jcy5leHBhbmRFbmRwb2ludExpc3RGb3JSZXNvdXJjZShyZXNvdXJjZSk7CisKKwkJaWYgKHJlc291cmNlID09ICcnKSB7CisJCQkkKCcucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCcpLnNsaWRlVXAoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCSQoJ2xpI3Jlc291cmNlXycgKyBEb2NzLmVzY2FwZVJlc291cmNlTmFtZShyZXNvdXJjZSkgKyAnIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCcpLmVhY2goZnVuY3Rpb24oKSB7CisJCQlEb2NzLmNvbGxhcHNlT3BlcmF0aW9uKCQodGhpcykpOworCQl9KTsKKwl9LAorCisJZXNjYXBlUmVzb3VyY2VOYW1lOiBmdW5jdGlvbihyZXNvdXJjZSkgeworCQlyZXR1cm4gcmVzb3VyY2UucmVwbGFjZSgvWyEiIyQlJicoKSorLC5cLzo7PD0+P0BcW1xcXF1cXmB7fH1+XS9nLCAiXFwkJiIpOworCX0sCisKKwlleHBhbmRPcGVyYXRpb246IGZ1bmN0aW9uKGVsZW0pIHsKKwkJZWxlbS5zbGlkZURvd24oKTsKKwl9LAorCisJY29sbGFwc2VPcGVyYXRpb246IGZ1bmN0aW9uKGVsZW0pIHsKKwkJZWxlbS5zbGlkZVVwKCk7CisJfQorfTsKKworJ3VzZSBzdHJpY3QnOworCitIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdzYW5pdGl6ZScsIGZ1bmN0aW9uKGh0bWwpIHsKKyAgICAvLyBTdHJpcCB0aGUgc2NyaXB0IHRhZ3MgZnJvbSB0aGUgaHRtbCwgYW5kIHJldHVybiBpdCBhcyBhIEhhbmRsZWJhcnMuU2FmZVN0cmluZworICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksICcnKTsKKyAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyhodG1sKTsKK30pOwordGhpc1siSGFuZGxlYmFycyJdWyJ0ZW1wbGF0ZXMiXVsibWFpbiJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgbGFtYmRhPXRoaXMubGFtYmRhLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbiwgYnVmZmVyID0gIiAgPGRpdiBjbGFzcz1cImluZm9fdGl0bGVcIj4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKGxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50aXRsZSA6IHN0YWNrMSksIGRlcHRoMCkpCisgICAgKyAiPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJpbmZvX2Rlc2NyaXB0aW9uIG1hcmtkb3duXCI+IjsKKyAgc3RhY2sxID0gbGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRlc2NyaXB0aW9uIDogc3RhY2sxKSwgZGVwdGgwKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgYnVmZmVyICs9ICI8L2Rpdj5cbiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5leHRlcm5hbERvY3MgOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDIsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgYnVmZmVyICs9ICIgICI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRlcm1zT2ZTZXJ2aWNlVXJsIDogc3RhY2sxKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSg0LCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiXG4gICI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsICgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29udGFjdCA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oNiwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlxuICAiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbnRhY3QgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oOCwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlxuICAiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbnRhY3QgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmVtYWlsIDogc3RhY2sxKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxMCwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlxuICAiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5saWNlbnNlIDogc3RhY2sxKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxMiwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyICsgIlxuIjsKK30sIjIiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgbGFtYmRhPXRoaXMubGFtYmRhLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIgIDxoNT5Nb3JlIGRvY3VtZW50YXRpb25zPC9oNT5cbiAgPHA+IgorICAgICsgZXNjYXBlRXhwcmVzc2lvbihsYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZXh0ZXJuYWxEb2NzIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kZXNjcmlwdGlvbiA6IHN0YWNrMSksIGRlcHRoMCkpCisgICAgKyAiPC9wPlxuICA8YSBocmVmPVwiIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbihsYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZXh0ZXJuYWxEb2NzIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQorICAgICsgIlwiIHRhcmdldD1cIl9ibGFua1wiPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24obGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmV4dGVybmFsRG9jcyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSwgZGVwdGgwKSkKKyAgICArICI8L2E+XG4iOworfSwiNCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBsYW1iZGE9dGhpcy5sYW1iZGEsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIjxkaXYgY2xhc3M9XCJpbmZvX3Rvc1wiPjxhIGhyZWY9XCIiCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKGxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS50ZXJtc09mU2VydmljZVVybCA6IHN0YWNrMSksIGRlcHRoMCkpCisgICAgKyAiXCI+VGVybXMgb2Ygc2VydmljZTwvYT48L2Rpdj4iOworfSwiNiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBsYW1iZGE9dGhpcy5sYW1iZGEsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIjxkaXYgY2xhc3M9J2luZm9fbmFtZSc+Q3JlYXRlZCBieSAiCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKGxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbnRhY3QgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQorICAgICsgIjwvZGl2PiI7Cit9LCI4IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGxhbWJkYT10aGlzLmxhbWJkYSwgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiPGRpdiBjbGFzcz0naW5mb191cmwnPlNlZSBtb3JlIGF0IDxhIGhyZWY9XCIiCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKGxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbnRhY3QgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCisgICAgKyAiXCI+IgorICAgICsgZXNjYXBlRXhwcmVzc2lvbihsYW1iZGEoKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb250YWN0IDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLCBkZXB0aDApKQorICAgICsgIjwvYT48L2Rpdj4iOworfSwiMTAiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgbGFtYmRhPXRoaXMubGFtYmRhLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICI8ZGl2IGNsYXNzPSdpbmZvX2VtYWlsJz48YSBocmVmPVwibWFpbHRvOiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24obGFtYmRhKCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29udGFjdCA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuZW1haWwgOiBzdGFjazEpLCBkZXB0aDApKQorICAgICsgIj9zdWJqZWN0PSIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24obGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRpdGxlIDogc3RhY2sxKSwgZGVwdGgwKSkKKyAgICArICJcIj5Db250YWN0IHRoZSBkZXZlbG9wZXI8L2E+PC9kaXY+IjsKK30sIjEyIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGxhbWJkYT10aGlzLmxhbWJkYSwgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiPGRpdiBjbGFzcz0naW5mb19saWNlbnNlJz48YSBocmVmPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKGxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxpY2Vuc2UgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSksIGRlcHRoMCkpCisgICAgKyAiJz4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKGxhbWJkYSgoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxpY2Vuc2UgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLCBkZXB0aDApKQorICAgICsgIjwvYT48L2Rpdj4iOworfSwiMTQiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgbGFtYmRhPXRoaXMubGFtYmRhLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIgICAgLCA8c3BhbiBzdHlsZT1cImZvbnQtdmFyaWFudDogc21hbGwtY2Fwc1wiPmFwaSB2ZXJzaW9uPC9zcGFuPjogIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbihsYW1iZGEoKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudmVyc2lvbiA6IHN0YWNrMSksIGRlcHRoMCkpCisgICAgKyAiXG4gICAgIjsKK30sIjE2IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiICAgIDxzcGFuIHN0eWxlPVwiZmxvYXQ6cmlnaHRcIj48YSBocmVmPVwiIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbGlkYXRvclVybCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsaWRhdG9yVXJsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InZhbGlkYXRvclVybCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICIvZGVidWc/dXJsPSIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy51cmwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnVybCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJ1cmwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiXCI+PGltZyBpZD1cInZhbGlkYXRvclwiIHNyYz1cIiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWxpZGF0b3JVcmwgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbGlkYXRvclVybCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJ2YWxpZGF0b3JVcmwiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiP3VybD0iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudXJsIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC51cmwgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoidXJsIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIlwiPjwvYT5cbiAgICA8L3NwYW4+XG4iOworfSwiY29tcGlsZXIiOls2LCI+PSAyLjAuMC1iZXRhLjEiXSwibWFpbiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb24sIGJ1ZmZlciA9ICI8ZGl2IGNsYXNzPSdpbmZvJyBpZD0nYXBpX2luZm8nPlxuIjsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDEsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgYnVmZmVyICs9ICI8L2Rpdj5cbjxkaXYgY2xhc3M9J2NvbnRhaW5lcicgaWQ9J3Jlc291cmNlc19jb250YWluZXInPlxuICA8dWwgaWQ9J3Jlc291cmNlcyc+PC91bD5cblxuICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgPGJyPlxuICAgIDxicj5cbiAgICA8aDQgc3R5bGU9XCJjb2xvcjogIzk5OVwiPlsgPHNwYW4gc3R5bGU9XCJmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHNcIj5iYXNlIHVybDwvc3Bhbj46ICIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5iYXNlUGF0aCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYmFzZVBhdGggOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiYmFzZVBhdGgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiXG4iOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS52ZXJzaW9uIDogc3RhY2sxKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxNCwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIl1cbiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWxpZGF0b3JVcmwgOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDE2LCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXIgKyAiICAgIDwvaDQ+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiI7Cit9LCJ1c2VEYXRhIjp0cnVlfSk7Cit0aGlzWyJIYW5kbGViYXJzIl1bInRlbXBsYXRlcyJdWyJvcGVyYXRpb24iXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHJldHVybiAiZGVwcmVjYXRlZCI7CisgIH0sIjMiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgcmV0dXJuICIgICAgICAgICAgICA8aDQ+V2FybmluZzogRGVwcmVjYXRlZDwvaDQ+XG4iOworICB9LCI1IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBidWZmZXIgPSAiICAgICAgICA8aDQ+SW1wbGVtZW50YXRpb24gTm90ZXM8L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFya2Rvd25cIj4iOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRlc2NyaXB0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlciArICI8L2Rpdj5cbiI7Cit9LCI3IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHJldHVybiAiICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0aFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImFwaS1pYyBpYy1lcnJvclwiPjwvc3Bhbj4iOworICB9LCI5IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICIgICAgICAgICAgPGRpdiBpZD1cImFwaV9pbmZvcm1hdGlvbl9wYW5lbFwiIHN0eWxlPVwidG9wOiA1MjZweDsgbGVmdDogNzc2cHg7IGRpc3BsYXk6IG5vbmU7XCI+XG4iOworICBzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAsIGRlcHRoMCwgeyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDEwLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXIgKyAiICAgICAgICAgIDwvZGl2PlxuIjsKK30sIjEwIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGxhbWJkYT10aGlzLmxhbWJkYSwgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb24sIGJ1ZmZlciA9ICIgICAgICAgICAgICA8ZGl2IHRpdGxlPSciOworICBzdGFjazEgPSBsYW1iZGEoKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSwgZGVwdGgwKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlciArICInPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24obGFtYmRhKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zY29wZSA6IGRlcHRoMCksIGRlcHRoMCkpCisgICAgKyAiPC9kaXY+XG4iOworfSwiMTIiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgcmV0dXJuICI8L2Rpdj4iOworICB9LCIxNCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgICAgICAgPGRpdiBjbGFzcz0nYWNjZXNzJz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwaS1pYyBpYy1vZmZcIiB0aXRsZT1cImNsaWNrIHRvIGF1dGhlbnRpY2F0ZVwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4iOworICB9LCIxNiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIiAgICAgICAgICA8aDQ+UmVzcG9uc2UgQ2xhc3MgKFN0YXR1cyAiCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc3VjY2Vzc0NvZGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN1Y2Nlc3NDb2RlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InN1Y2Nlc3NDb2RlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIik8L2g0PlxuICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPVwibW9kZWwtc2lnbmF0dXJlXCIgLz48L3A+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzcG9uc2UtY29udGVudC10eXBlXCIgLz5cbiI7Cit9LCIxOCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgICAgICAgICA8aDQ+UGFyYW1ldGVyczwvaDQ+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPSdmdWxsd2lkdGgnPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMDBweDsgbWF4LXdpZHRoOiAxMDBweFwiPlBhcmFtZXRlcjwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzEwcHg7IG1heC13aWR0aDogMzEwcHhcIj5WYWx1ZTwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMjAwcHg7IG1heC13aWR0aDogMjAwcHhcIj5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAwcHg7IG1heC13aWR0aDogMTAwcHhcIj5QYXJhbWV0ZXIgVHlwZTwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMjIwcHg7IG1heC13aWR0aDogMjMwcHhcIj5EYXRhIFR5cGU8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keSBjbGFzcz1cIm9wZXJhdGlvbi1wYXJhbXNcIj5cblxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiI7CisgIH0sIjIwIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHJldHVybiAiICAgICAgICAgIDxkaXYgc3R5bGU9J21hcmdpbjowO3BhZGRpbmc6MDtkaXNwbGF5OmlubGluZSc+PC9kaXY+XG4gICAgICAgICAgPGg0PlJlc3BvbnNlIE1lc3NhZ2VzPC9oND5cbiAgICAgICAgICA8dGFibGUgY2xhc3M9J2Z1bGx3aWR0aCc+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aD5IVFRQIFN0YXR1cyBDb2RlPC90aD5cbiAgICAgICAgICAgICAgPHRoPlJlYXNvbjwvdGg+XG4gICAgICAgICAgICAgIDx0aD5SZXNwb25zZSBNb2RlbDwvdGg+XG4gICAgICAgICAgICAgIDx0aD5IZWFkZXJzPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwib3BlcmF0aW9uLXN0YXR1c1wiPlxuXG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4iOworICB9LCIyMiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiI7Cit9LCIyNCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgICAgICAgICA8ZGl2IGNsYXNzPSdzYW5kYm94X2hlYWRlcic+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9J3N1Ym1pdCcgbmFtZT0nY29tbWl0JyB0eXBlPSdidXR0b24nIHZhbHVlPSdUcnkgaXQgb3V0IScgLz5cbiAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdyZXNwb25zZV9oaWRlcicgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+SGlkZSBSZXNwb25zZTwvYT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdyZXNwb25zZV90aHJvYmJlcicgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuIjsKKyAgfSwiY29tcGlsZXIiOls2LCI+PSAyLjAuMC1iZXRhLjEiXSwibWFpbiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBoZWxwZXIsIG9wdGlvbnMsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb24sIGJsb2NrSGVscGVyTWlzc2luZz1oZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZywgYnVmZmVyID0gIlxuICA8dWwgY2xhc3M9J29wZXJhdGlvbnMnID5cbiAgICA8bGkgY2xhc3M9JyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5tZXRob2QgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1ldGhvZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJtZXRob2QiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiIG9wZXJhdGlvbicgaWQ9JyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5wYXJlbnRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50SWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoicGFyZW50SWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiXyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uaWNrbmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmlja25hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmlja25hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiJz5cbiAgICAgIDxkaXYgY2xhc3M9J2hlYWRpbmcnPlxuICAgICAgICA8aDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9J2h0dHBfbWV0aG9kJz5cbiAgICAgICAgICA8YSBocmVmPScjIS8iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuZW5jb2RlZFBhcmVudElkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5lbmNvZGVkUGFyZW50SWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiZW5jb2RlZFBhcmVudElkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIi8iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmlja25hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5pY2tuYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6Im5pY2tuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIicgY2xhc3M9XCJ0b2dnbGVPcGVyYXRpb25cIj4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWV0aG9kIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXRob2QgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibWV0aG9kIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIjwvYT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9J3BhdGgnPlxuICAgICAgICAgIDxhIGhyZWY9JyMhLyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5lbmNvZGVkUGFyZW50SWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmVuY29kZWRQYXJlbnRJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJlbmNvZGVkUGFyZW50SWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiLyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uaWNrbmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmlja25hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmlja25hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiJyBjbGFzcz1cInRvZ2dsZU9wZXJhdGlvbiAiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVwcmVjYXRlZCA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMSwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlwiPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5wYXRoIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wYXRoIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InBhdGgiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiPC9hPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9oMz5cbiAgICAgICAgPHVsIGNsYXNzPSdvcHRpb25zJz5cbiAgICAgICAgICA8bGk+XG4gICAgICAgICAgPGEgaHJlZj0nIyEvIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmVuY29kZWRQYXJlbnRJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZW5jb2RlZFBhcmVudElkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImVuY29kZWRQYXJlbnRJZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICIvIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5pY2tuYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uaWNrbmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuaWNrbmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInIGNsYXNzPVwidG9nZ2xlT3BlcmF0aW9uXCI+IjsKKyAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdW1tYXJ5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdW1tYXJ5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InN1bW1hcnkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC9hPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9J2NvbnRlbnQnIGlkPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyZW50SWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnBhcmVudElkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InBhcmVudElkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIl8iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmlja25hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5pY2tuYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6Im5pY2tuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIl9jb250ZW50JyBzdHlsZT0nZGlzcGxheTpub25lJz5cbiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXByZWNhdGVkIDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgzLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oNSwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm9hdXRoIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vYXV0aCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJvYXV0aCIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDcsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCBvcHRpb25zKSA6IGhlbHBlcikpOworICBpZiAoIWhlbHBlcnMub2F1dGgpIHsgc3RhY2sxID0gYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLCBzdGFjazEsIG9wdGlvbnMpOyB9CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiXG4iOworICBzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vYXV0aCA6IGRlcHRoMCksIHsibmFtZSI6ImVhY2giLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSg5LCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiICAgICAgICAiOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm9hdXRoIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5vYXV0aCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwob3B0aW9ucz17Im5hbWUiOiJvYXV0aCIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDEyLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgb3B0aW9ucykgOiBoZWxwZXIpKTsKKyAgaWYgKCFoZWxwZXJzLm9hdXRoKSB7IHN0YWNrMSA9IGJsb2NrSGVscGVyTWlzc2luZy5jYWxsKGRlcHRoMCwgc3RhY2sxLCBvcHRpb25zKTsgfQorICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlxuIjsKKyAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5vYXV0aCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAub2F1dGggOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoib2F1dGgiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxNCwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIG9wdGlvbnMpIDogaGVscGVyKSk7CisgIGlmICghaGVscGVycy5vYXV0aCkgeyBzdGFjazEgPSBibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsIHN0YWNrMSwgb3B0aW9ucyk7IH0KKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnR5cGUgOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDE2LCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiICAgICAgICA8Zm9ybSBhY2NlcHQtY2hhcnNldD0nVVRGLTgnIGNsYXNzPSdzYW5kYm94Jz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPSdtYXJnaW46MDtwYWRkaW5nOjA7ZGlzcGxheTppbmxpbmUnPjwvZGl2PlxuIjsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnBhcmFtZXRlcnMgOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDE4LCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5yZXNwb25zZU1lc3NhZ2VzIDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgyMCwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNSZWFkT25seSA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMjIsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLnByb2dyYW0oMjQsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXIgKyAiICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDxkaXYgY2xhc3M9J3Jlc3BvbnNlJyBzdHlsZT0nZGlzcGxheTpub25lJz5cbiAgICAgICAgICA8aDQ+UmVxdWVzdCBVUkw8L2g0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9J2Jsb2NrIHJlcXVlc3RfdXJsJz48L2Rpdj5cbiAgICAgICAgICA8aDQ+UmVzcG9uc2UgQm9keTwvaDQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nYmxvY2sgcmVzcG9uc2VfYm9keSc+PC9kaXY+XG4gICAgICAgICAgPGg0PlJlc3BvbnNlIENvZGU8L2g0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9J2Jsb2NrIHJlc3BvbnNlX2NvZGUnPjwvZGl2PlxuICAgICAgICAgIDxoND5SZXNwb25zZSBIZWFkZXJzPC9oND5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdibG9jayByZXNwb25zZV9oZWFkZXJzJz48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2xpPlxuICA8L3VsPlxuIjsKK30sInVzZURhdGEiOnRydWV9KTsKK3RoaXNbIkhhbmRsZWJhcnMiXVsidGVtcGxhdGVzIl1bInBhcmFtX2xpc3QiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiPHRkIGNsYXNzPSdjb2RlIHJlcXVpcmVkJz4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIjwvdGQ+XG4iOworfSwiMyI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiBtdWx0aXBsZT0nbXVsdGlwbGUnIjsKKyAgfSwiNSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiI7Cit9LCI3IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICIiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbJ2RlZmF1bHQnXSA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oNSwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg4LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiOCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYnVmZmVyID0gIiI7CisgIHN0YWNrMSA9ICgoaGVscGVycy5pc0FycmF5IHx8IChkZXB0aDAgJiYgZGVwdGgwLmlzQXJyYXkpIHx8IGhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwLCBkZXB0aDAsIHsibmFtZSI6ImlzQXJyYXkiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSg1LCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDksIGRhdGEpLCJkYXRhIjpkYXRhfSkpOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiOSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkPVwiXCIgdmFsdWU9Jyc+PC9vcHRpb24+XG4iOworICB9LCIxMSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBidWZmZXIgPSAiIjsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVmYXVsdCA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMTIsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLnByb2dyYW0oMTQsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXI7Cit9LCIxMiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIiAgICAgICAgPG9wdGlvbiBzZWxlY3RlZD1cIlwiIHZhbHVlPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIic+IgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnZhbHVlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJ2YWx1ZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICIgKGRlZmF1bHQpPC9vcHRpb24+XG4iOworfSwiMTQiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIgICAgICAgIDxvcHRpb24gdmFsdWU9JyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy52YWx1ZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoidmFsdWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiJz4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudmFsdWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InZhbHVlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIjwvb3B0aW9uPlxuIjsKK30sImNvbXBpbGVyIjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sIm1haW4iOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uLCBidWZmZXIgPSAiIjsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJlcXVpcmVkIDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPHRkIGNsYXNzPSdjb2RlJz4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIjwvdGQ+XG48dGQ+XG4gIDxzZWxlY3QgIjsKKyAgc3RhY2sxID0gKChoZWxwZXJzLmlzQXJyYXkgfHwgKGRlcHRoMCAmJiBkZXB0aDAuaXNBcnJheSkgfHwgaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAsIGRlcHRoMCwgeyJuYW1lIjoiaXNBcnJheSIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDMsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiIGNsYXNzPSdwYXJhbWV0ZXInIG5hbWU9JyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiJz5cbiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5yZXF1aXJlZCA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oNSwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg3LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAsICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFsbG93YWJsZVZhbHVlcyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuZGVzY3JpcHRpdmVWYWx1ZXMgOiBzdGFjazEpLCB7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMTEsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgYnVmZmVyICs9ICIgIDwvc2VsZWN0PlxuPC90ZD5cbjx0ZCBjbGFzcz1cIm1hcmtkb3duXCI+IjsKKyAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiZGVzY3JpcHRpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC90ZD5cbjx0ZD4iOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnBhcmFtVHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyYW1UeXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InBhcmFtVHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlciArICI8L3RkPlxuPHRkPjxzcGFuIGNsYXNzPVwibW9kZWwtc2lnbmF0dXJlXCI+PC9zcGFuPjwvdGQ+IjsKK30sInVzZURhdGEiOnRydWV9KTsKK3RoaXNbIkhhbmRsZWJhcnMiXVsidGVtcGxhdGVzIl1bInBhcmFtX3JlYWRvbmx5X3JlcXVpcmVkIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIiAgICAgICAgPHRleHRhcmVhIGNsYXNzPSdib2R5LXRleHRhcmVhJyAgcmVhZG9ubHk9J3JlYWRvbmx5JyBwbGFjZWhvbGRlcj0nKHJlcXVpcmVkKScgbmFtZT0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVyc1snZGVmYXVsdCddIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFsnZGVmYXVsdCddIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImRlZmF1bHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiPC90ZXh0YXJlYT5cbiI7Cit9LCIzIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICIiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbJ2RlZmF1bHQnXSA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oNCwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg2LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiNCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIiAgICAgICAgICAgICIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVyc1snZGVmYXVsdCddIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFsnZGVmYXVsdCddIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImRlZmF1bHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiXG4iOworfSwiNiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgICAgICAgICAgIChlbXB0eSlcbiI7CisgIH0sImNvbXBpbGVyIjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sIm1haW4iOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uLCBidWZmZXIgPSAiPHRkIGNsYXNzPSdjb2RlIHJlcXVpcmVkJz4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIjwvdGQ+XG48dGQ+XG4iOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNCb2R5IDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDMsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC90ZD5cbjx0ZCBjbGFzcz1cIm1hcmtkb3duXCI+IjsKKyAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiZGVzY3JpcHRpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC90ZD5cbjx0ZD4iOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnBhcmFtVHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyYW1UeXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InBhcmFtVHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlciArICI8L3RkPlxuPHRkPjxzcGFuIGNsYXNzPVwibW9kZWwtc2lnbmF0dXJlXCI+PC9zcGFuPjwvdGQ+XG4iOworfSwidXNlRGF0YSI6dHJ1ZX0pOwordGhpc1siSGFuZGxlYmFycyJdWyJ0ZW1wbGF0ZXMiXVsicGFyYW1fcmVhZG9ubHkiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiICAgICAgICA8dGV4dGFyZWEgY2xhc3M9J2JvZHktdGV4dGFyZWEnIHJlYWRvbmx5PSdyZWFkb25seScgbmFtZT0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVyc1snZGVmYXVsdCddIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFsnZGVmYXVsdCddIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImRlZmF1bHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiPC90ZXh0YXJlYT5cbiI7Cit9LCIzIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICIiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbJ2RlZmF1bHQnXSA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oNCwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg2LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiNCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIiAgICAgICAgICAgICIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVyc1snZGVmYXVsdCddIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFsnZGVmYXVsdCddIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImRlZmF1bHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiXG4iOworfSwiNiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgICAgICAgICAgIChlbXB0eSlcbiI7CisgIH0sImNvbXBpbGVyIjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sIm1haW4iOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uLCBidWZmZXIgPSAiPHRkIGNsYXNzPSdjb2RlJz4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIjwvdGQ+XG48dGQ+XG4iOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNCb2R5IDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDMsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC90ZD5cbjx0ZCBjbGFzcz1cIm1hcmtkb3duXCI+IjsKKyAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiZGVzY3JpcHRpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC90ZD5cbjx0ZD4iOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnBhcmFtVHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyYW1UeXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InBhcmFtVHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlciArICI8L3RkPlxuPHRkPjxzcGFuIGNsYXNzPVwibW9kZWwtc2lnbmF0dXJlXCI+PC9zcGFuPjwvdGQ+XG4iOworfSwidXNlRGF0YSI6dHJ1ZX0pOwordGhpc1siSGFuZGxlYmFycyJdWyJ0ZW1wbGF0ZXMiXVsicGFyYW1fcmVxdWlyZWQiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoeyIxIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICIiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNGaWxlIDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgyLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDQsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXI7Cit9LCIyIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiCQkJPGlucHV0IHR5cGU9XCJmaWxlXCIgbmFtZT0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInLz5cbiI7Cit9LCI0IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICIiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbJ2RlZmF1bHQnXSA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oNSwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg3LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiNSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIgkJCQk8dGV4dGFyZWEgY2xhc3M9J2JvZHktdGV4dGFyZWEgcmVxdWlyZWQnIHBsYWNlaG9sZGVyPScocmVxdWlyZWQpJyBuYW1lPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIic+IgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzWydkZWZhdWx0J10gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwWydkZWZhdWx0J10gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiZGVmYXVsdCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICI8L3RleHRhcmVhPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhcmFtZXRlci1jb250ZW50LXR5cGVcIiAvPlxuIjsKK30sIjciOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIJCQkJPHRleHRhcmVhIGNsYXNzPSdib2R5LXRleHRhcmVhIHJlcXVpcmVkJyBwbGFjZWhvbGRlcj0nKHJlcXVpcmVkKScgbmFtZT0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInPjwvdGV4dGFyZWE+XG4JCQkJPGJyIC8+XG4JCQkJPGRpdiBjbGFzcz1cInBhcmFtZXRlci1jb250ZW50LXR5cGVcIiAvPlxuIjsKK30sIjkiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgYnVmZmVyID0gIiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0ZpbGUgOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDEwLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDEyLCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiMTAiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIJCQk8aW5wdXQgY2xhc3M9J3BhcmFtZXRlcicgY2xhc3M9J3JlcXVpcmVkJyB0eXBlPSdmaWxlJyBuYW1lPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIicvPlxuIjsKK30sIjEyIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICIiOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbJ2RlZmF1bHQnXSA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMTMsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLnByb2dyYW0oMTUsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXI7Cit9LCIxMyI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uOworICByZXR1cm4gIgkJCQk8aW5wdXQgY2xhc3M9J3BhcmFtZXRlciByZXF1aXJlZCcgbWlubGVuZ3RoPScxJyBuYW1lPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIicgcGxhY2Vob2xkZXI9JyhyZXF1aXJlZCknIHR5cGU9J3RleHQnIHZhbHVlPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnNbJ2RlZmF1bHQnXSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbJ2RlZmF1bHQnXSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJkZWZhdWx0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIicvPlxuIjsKK30sIjE1IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiCQkJCTxpbnB1dCBjbGFzcz0ncGFyYW1ldGVyIHJlcXVpcmVkJyBtaW5sZW5ndGg9JzEnIG5hbWU9JyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiJyBwbGFjZWhvbGRlcj0nKHJlcXVpcmVkKScgdHlwZT0ndGV4dCcgdmFsdWU9JycvPlxuIjsKK30sImNvbXBpbGVyIjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sIm1haW4iOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgaGVscGVyLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uLCBidWZmZXIgPSAiPHRkIGNsYXNzPSdjb2RlIHJlcXVpcmVkJz4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIjwvdGQ+XG48dGQ+XG4iOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNCb2R5IDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDksIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC90ZD5cbjx0ZD5cbgk8c3Ryb25nPjxzcGFuIGNsYXNzPVwibWFya2Rvd25cIj4iOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRlc2NyaXB0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJkZXNjcmlwdGlvbiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgYnVmZmVyICs9ICI8L3NwYW4+PC9zdHJvbmc+XG48L3RkPlxuPHRkPiI7CisgIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyYW1UeXBlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wYXJhbVR5cGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoicGFyYW1UeXBlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyICsgIjwvdGQ+XG48dGQ+PHNwYW4gY2xhc3M9XCJtb2RlbC1zaWduYXR1cmVcIj48L3NwYW4+PC90ZD5cbiI7Cit9LCJ1c2VEYXRhIjp0cnVlfSk7Cit0aGlzWyJIYW5kbGViYXJzIl1bInRlbXBsYXRlcyJdWyJwYXJhbSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgYnVmZmVyID0gIiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0ZpbGUgOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDIsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLnByb2dyYW0oNCwgZGF0YSksImRhdGEiOmRhdGF9KTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlcjsKK30sIjIiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIJCQk8aW5wdXQgdHlwZT1cImZpbGVcIiBuYW1lPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubmFtZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJuYW1lIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIicvPlxuCQkJPGRpdiBjbGFzcz1cInBhcmFtZXRlci1jb250ZW50LXR5cGVcIiAvPlxuIjsKK30sIjQiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgYnVmZmVyID0gIiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFsnZGVmYXVsdCddIDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSg1LCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDcsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXI7Cit9LCI1IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiCQkJCTx0ZXh0YXJlYSBjbGFzcz0nYm9keS10ZXh0YXJlYScgbmFtZT0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVyc1snZGVmYXVsdCddIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFsnZGVmYXVsdCddIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImRlZmF1bHQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiPC90ZXh0YXJlYT5cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbWV0ZXItY29udGVudC10eXBlXCIgLz5cbiI7Cit9LCI3IjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiCQkJCTx0ZXh0YXJlYSBjbGFzcz0nYm9keS10ZXh0YXJlYScgbmFtZT0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInPjwvdGV4dGFyZWE+XG4JCQkJPGJyIC8+XG4JCQkJPGRpdiBjbGFzcz1cInBhcmFtZXRlci1jb250ZW50LXR5cGVcIiAvPlxuIjsKK30sIjkiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgYnVmZmVyID0gIiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0ZpbGUgOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDIsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLnByb2dyYW0oMTAsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXI7Cit9LCIxMCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBidWZmZXIgPSAiIjsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwWydkZWZhdWx0J10gOiBkZXB0aDApLCB7Im5hbWUiOiJpZiIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDExLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDEzLCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiMTEiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIJCQkJPGlucHV0IGNsYXNzPSdwYXJhbWV0ZXInIG1pbmxlbmd0aD0nMCcgbmFtZT0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLm5hbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoibmFtZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInIHBsYWNlaG9sZGVyPScnIHR5cGU9J3RleHQnIHZhbHVlPSciCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnNbJ2RlZmF1bHQnXSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbJ2RlZmF1bHQnXSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJkZWZhdWx0IiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIicvPlxuIjsKK30sIjEzIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb247CisgIHJldHVybiAiCQkJCTxpbnB1dCBjbGFzcz0ncGFyYW1ldGVyJyBtaW5sZW5ndGg9JzAnIG5hbWU9JyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiJyBwbGFjZWhvbGRlcj0nJyB0eXBlPSd0ZXh0JyB2YWx1ZT0nJy8+XG4iOworfSwiY29tcGlsZXIiOls2LCI+PSAyLjAuMC1iZXRhLjEiXSwibWFpbiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb24sIGJ1ZmZlciA9ICI8dGQgY2xhc3M9J2NvZGUnPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiPC90ZD5cbjx0ZD5cblxuIjsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzQm9keSA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMSwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg5LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlxuPC90ZD5cbjx0ZCBjbGFzcz1cIm1hcmtkb3duXCI+IjsKKyAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5kZXNjcmlwdGlvbiB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiZGVzY3JpcHRpb24iLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiPC90ZD5cbjx0ZD4iOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnBhcmFtVHlwZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyYW1UeXBlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InBhcmFtVHlwZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlciArICI8L3RkPlxuPHRkPlxuCTxzcGFuIGNsYXNzPVwibW9kZWwtc2lnbmF0dXJlXCI+PC9zcGFuPlxuPC90ZD5cbiI7Cit9LCJ1c2VEYXRhIjp0cnVlfSk7Cit0aGlzWyJIYW5kbGViYXJzIl1bInRlbXBsYXRlcyJdWyJwYXJhbWV0ZXJfY29udGVudF90eXBlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBidWZmZXIgPSAiIjsKKyAgc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29uc3VtZXMgOiBkZXB0aDApLCB7Im5hbWUiOiJlYWNoIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMiwgZGF0YSksImludmVyc2UiOnRoaXMubm9vcCwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyOworfSwiMiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBsYW1iZGE9dGhpcy5sYW1iZGEsIGJ1ZmZlciA9ICIgIDxvcHRpb24gdmFsdWU9XCIiOworICBzdGFjazEgPSBsYW1iZGEoZGVwdGgwLCBkZXB0aDApOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIlwiPiI7CisgIHN0YWNrMSA9IGxhbWJkYShkZXB0aDAsIGRlcHRoMCk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXIgKyAiPC9vcHRpb24+XG4iOworfSwiNCI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiAgPG9wdGlvbiB2YWx1ZT1cImFwcGxpY2F0aW9uL2pzb25cIj5hcHBsaWNhdGlvbi9qc29uPC9vcHRpb24+XG4iOworICB9LCJjb21waWxlciI6WzYsIj49IDIuMC4wLWJldGEuMSJdLCJtYWluIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGJ1ZmZlciA9ICI8bGFiZWwgZm9yPVwicGFyYW1ldGVyQ29udGVudFR5cGVcIj48L2xhYmVsPlxuPHNlbGVjdCBuYW1lPVwicGFyYW1ldGVyQ29udGVudFR5cGVcIj5cbiI7CisgIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb25zdW1lcyA6IGRlcHRoMCksIHsibmFtZSI6ImlmIiwiaGFzaCI6e30sImZuIjp0aGlzLnByb2dyYW0oMSwgZGF0YSksImludmVyc2UiOnRoaXMucHJvZ3JhbSg0LCBkYXRhKSwiZGF0YSI6ZGF0YX0pOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyICsgIjwvc2VsZWN0PlxuIjsKK30sInVzZURhdGEiOnRydWV9KTsKK3RoaXNbIkhhbmRsZWJhcnMiXVsidGVtcGxhdGVzIl1bInJlc291cmNlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICByZXR1cm4gIiA6ICI7CisgIH0sIjMiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIgICAgPGxpPlxuICAgICAgPGEgaHJlZj0nIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnVybCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudXJsIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InVybCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInPlJhdzwvYT5cbiAgICA8L2xpPlxuIjsKK30sImNvbXBpbGVyIjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sIm1haW4iOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgaGVscGVyLCBvcHRpb25zLCBmdW5jdGlvblR5cGU9ImZ1bmN0aW9uIiwgaGVscGVyTWlzc2luZz1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHByZXNzaW9uLCBibG9ja0hlbHBlck1pc3Npbmc9aGVscGVycy5ibG9ja0hlbHBlck1pc3NpbmcsIGJ1ZmZlciA9ICI8ZGl2IGNsYXNzPSdoZWFkaW5nJz5cbiAgPGgyPlxuICAgIDxhIGhyZWY9JyMhLyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiJyBjbGFzcz1cInRvZ2dsZUVuZHBvaW50TGlzdFwiIGRhdGEtaWQ9XCIiCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIlwiPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5uYW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6Im5hbWUiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiPC9hPiAiOworICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN1bW1hcnkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN1bW1hcnkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKG9wdGlvbnM9eyJuYW1lIjoic3VtbWFyeSIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDEsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCBvcHRpb25zKSA6IGhlbHBlcikpOworICBpZiAoIWhlbHBlcnMuc3VtbWFyeSkgeyBzdGFjazEgPSBibG9ja0hlbHBlck1pc3NpbmcuY2FsbChkZXB0aDAsIHN0YWNrMSwgb3B0aW9ucyk7IH0KKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgc3RhY2sxID0gKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5zdW1tYXJ5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zdW1tYXJ5IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6InN1bW1hcnkiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIGJ1ZmZlciArPSAiXG4gIDwvaDI+XG4gIDx1bCBjbGFzcz0nb3B0aW9ucyc+XG4gICAgPGxpPlxuICAgICAgPGEgaHJlZj0nIyEvIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInIGlkPSdlbmRwb2ludExpc3RUb2dnZXJfIgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJpZCIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICInIGNsYXNzPVwidG9nZ2xlRW5kcG9pbnRMaXN0XCIgZGF0YS1pZD1cIiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiXCI+U2hvdy9IaWRlPC9hPlxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgPGEgaHJlZj0nIycgY2xhc3M9XCJjb2xsYXBzZVJlc291cmNlXCIgZGF0YS1pZD1cIiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiXCI+XG4gICAgICAgIExpc3QgT3BlcmF0aW9uc1xuICAgICAgPC9hPlxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgPGEgaHJlZj0nIycgY2xhc3M9XCJleHBhbmRSZXNvdXJjZVwiIGRhdGEtaWQ9XCIiCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBmdW5jdGlvblR5cGUgPyBoZWxwZXIuY2FsbChkZXB0aDAsIHsibmFtZSI6ImlkIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpKQorICAgICsgIlwiPlxuICAgICAgICBFeHBhbmQgT3BlcmF0aW9uc1xuICAgICAgPC9hPlxuICAgIDwvbGk+XG4iOworICBzdGFjazEgPSBoZWxwZXJzWydpZiddLmNhbGwoZGVwdGgwLCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudXJsIDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgzLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5ub29wLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXIgKyAiICA8L3VsPlxuPC9kaXY+XG48dWwgY2xhc3M9J2VuZHBvaW50cycgaWQ9JyIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiaWQiLCJoYXNoIjp7fSwiZGF0YSI6ZGF0YX0pIDogaGVscGVyKSkpCisgICAgKyAiX2VuZHBvaW50X2xpc3QnIHN0eWxlPSdkaXNwbGF5Om5vbmUnPlxuXG48L3VsPlxuIjsKK30sInVzZURhdGEiOnRydWV9KTsKK3RoaXNbIkhhbmRsZWJhcnMiXVsidGVtcGxhdGVzIl1bInJlc3BvbnNlX2NvbnRlbnRfdHlwZSJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7IjEiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgYnVmZmVyID0gIiI7CisgIHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnByb2R1Y2VzIDogZGVwdGgwKSwgeyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDIsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlcjsKK30sIjIiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgdmFyIHN0YWNrMSwgbGFtYmRhPXRoaXMubGFtYmRhLCBidWZmZXIgPSAiICA8b3B0aW9uIHZhbHVlPVwiIjsKKyAgc3RhY2sxID0gbGFtYmRhKGRlcHRoMCwgZGVwdGgwKTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgYnVmZmVyICs9ICJcIj4iOworICBzdGFjazEgPSBsYW1iZGEoZGVwdGgwLCBkZXB0aDApOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyICsgIjwvb3B0aW9uPlxuIjsKK30sIjQiOmZ1bmN0aW9uKGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHsKKyAgcmV0dXJuICIgIDxvcHRpb24gdmFsdWU9XCJhcHBsaWNhdGlvbi9qc29uXCI+YXBwbGljYXRpb24vanNvbjwvb3B0aW9uPlxuIjsKKyAgfSwiY29tcGlsZXIiOls2LCI+PSAyLjAuMC1iZXRhLjEiXSwibWFpbiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBidWZmZXIgPSAiPGxhYmVsIGZvcj1cInJlc3BvbnNlQ29udGVudFR5cGVcIj48L2xhYmVsPlxuPHNlbGVjdCBuYW1lPVwicmVzcG9uc2VDb250ZW50VHlwZVwiPlxuIjsKKyAgc3RhY2sxID0gaGVscGVyc1snaWYnXS5jYWxsKGRlcHRoMCwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnByb2R1Y2VzIDogZGVwdGgwKSwgeyJuYW1lIjoiaWYiLCJoYXNoIjp7fSwiZm4iOnRoaXMucHJvZ3JhbSgxLCBkYXRhKSwiaW52ZXJzZSI6dGhpcy5wcm9ncmFtKDQsIGRhdGEpLCJkYXRhIjpkYXRhfSk7CisgIGlmIChzdGFjazEgIT0gbnVsbCkgeyBidWZmZXIgKz0gc3RhY2sxOyB9CisgIHJldHVybiBidWZmZXIgKyAiPC9zZWxlY3Q+XG4iOworfSwidXNlRGF0YSI6dHJ1ZX0pOwordGhpc1siSGFuZGxlYmFycyJdWyJ0ZW1wbGF0ZXMiXVsic2lnbmF0dXJlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiY29tcGlsZXIiOls2LCI+PSAyLjAuMC1iZXRhLjEiXSwibWFpbiI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgc3RhY2sxLCBoZWxwZXIsIGZ1bmN0aW9uVHlwZT0iZnVuY3Rpb24iLCBoZWxwZXJNaXNzaW5nPWhlbHBlcnMuaGVscGVyTWlzc2luZywgZXNjYXBlRXhwcmVzc2lvbj10aGlzLmVzY2FwZUV4cHJlc3Npb24sIGJ1ZmZlciA9ICI8ZGl2PlxuPHVsIGNsYXNzPVwic2lnbmF0dXJlLW5hdlwiPlxuICA8bGk+PGEgY2xhc3M9XCJkZXNjcmlwdGlvbi1saW5rXCIgaHJlZj1cIiNcIj5Nb2RlbDwvYT48L2xpPlxuICA8bGk+PGEgY2xhc3M9XCJzbmlwcGV0LWxpbmtcIiBocmVmPVwiI1wiPk1vZGVsIFNjaGVtYTwvYT48L2xpPlxuPC91bD5cbjxkaXY+XG5cbjxkaXYgY2xhc3M9XCJzaWduYXR1cmUtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPlxuICAgICI7CisgIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuc2lnbmF0dXJlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaWduYXR1cmUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoic2lnbmF0dXJlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICByZXR1cm4gYnVmZmVyICsgIlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic25pcHBldFwiPlxuICAgIDxwcmU+PGNvZGU+IgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnNhbXBsZUpTT04gfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNhbXBsZUpTT04gOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoic2FtcGxlSlNPTiIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICI8L2NvZGU+PC9wcmU+XG4gICAgPHNtYWxsIGNsYXNzPVwibm90aWNlXCI+PC9zbWFsbD5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIjsKK30sInVzZURhdGEiOnRydWV9KTsKK3RoaXNbIkhhbmRsZWJhcnMiXVsidGVtcGxhdGVzIl1bInN0YXR1c19jb2RlIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHsiMSI6ZnVuY3Rpb24oZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkgeworICB2YXIgbGFtYmRhPXRoaXMubGFtYmRhLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjsKKyAgcmV0dXJuICIgICAgICA8dHI+XG4gICAgICAgIDx0ZD4iCisgICAgKyBlc2NhcGVFeHByZXNzaW9uKGxhbWJkYSgoZGF0YSAmJiBkYXRhLmtleSksIGRlcHRoMCkpCisgICAgKyAiPC90ZD5cbiAgICAgICAgPHRkPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24obGFtYmRhKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCksIGRlcHRoMCkpCisgICAgKyAiPC90ZD5cbiAgICAgICAgPHRkPiIKKyAgICArIGVzY2FwZUV4cHJlc3Npb24obGFtYmRhKChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50eXBlIDogZGVwdGgwKSwgZGVwdGgwKSkKKyAgICArICI8L3RkPlxuICAgICAgPC90cj5cbiI7Cit9LCJjb21waWxlciI6WzYsIj49IDIuMC4wLWJldGEuMSJdLCJtYWluIjpmdW5jdGlvbihkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7CisgIHZhciBzdGFjazEsIGhlbHBlciwgZnVuY3Rpb25UeXBlPSJmdW5jdGlvbiIsIGhlbHBlck1pc3Npbmc9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBlc2NhcGVFeHByZXNzaW9uPXRoaXMuZXNjYXBlRXhwcmVzc2lvbiwgYnVmZmVyID0gIjx0ZCB3aWR0aD0nMTUlJyBjbGFzcz0nY29kZSc+IgorICAgICsgZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmNvZGUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvZGUgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IGZ1bmN0aW9uVHlwZSA/IGhlbHBlci5jYWxsKGRlcHRoMCwgeyJuYW1lIjoiY29kZSIsImhhc2giOnt9LCJkYXRhIjpkYXRhfSkgOiBoZWxwZXIpKSkKKyAgICArICI8L3RkPlxuPHRkPiI7CisgIHN0YWNrMSA9ICgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubWVzc2FnZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWVzc2FnZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gZnVuY3Rpb25UeXBlID8gaGVscGVyLmNhbGwoZGVwdGgwLCB7Im5hbWUiOiJtZXNzYWdlIiwiaGFzaCI6e30sImRhdGEiOmRhdGF9KSA6IGhlbHBlcikpOworICBpZiAoc3RhY2sxICE9IG51bGwpIHsgYnVmZmVyICs9IHN0YWNrMTsgfQorICBidWZmZXIgKz0gIjwvdGQ+XG48dGQgd2lkdGg9JzUwJSc+PHNwYW4gY2xhc3M9XCJtb2RlbC1zaWduYXR1cmVcIiAvPjwvdGQ+XG48dGQgY2xhc3M9XCJoZWFkZXJzXCI+XG4gIDx0YWJsZT5cbiAgICA8dGJvZHk+XG4iOworICBzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAsIChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oZWFkZXJzIDogZGVwdGgwKSwgeyJuYW1lIjoiZWFjaCIsImhhc2giOnt9LCJmbiI6dGhpcy5wcm9ncmFtKDEsIGRhdGEpLCJpbnZlcnNlIjp0aGlzLm5vb3AsImRhdGEiOmRhdGF9KTsKKyAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH0KKyAgcmV0dXJuIGJ1ZmZlciArICIgICAgPC90Ym9keT5cbiAgPC90YWJsZT5cbjwvdGQ+IjsKK30sInVzZURhdGEiOnRydWV9KTsKKy8qKgorICogc3dhZ2dlci1jbGllbnQgLSBzd2FnZ2VyLWNsaWVudCBpcyBhIGphdmFzY3JpcHQgY2xpZW50IGZvciB1c2Ugd2l0aCBzd2FnZ2VyaW5nIEFQSXMuCisgKiBAdmVyc2lvbiB2Mi4xLjAKKyAqIEBsaW5rIGh0dHA6Ly9zd2FnZ2VyLmlvCisgKiBAbGljZW5zZSBhcGFjaGUgMi4wCisgKi8KKyhmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLlN3YWdnZXJDbGllbnQgPSBmKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiAoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3RyaWN0JzsKKwordmFyIGF1dGggPSByZXF1aXJlKCcuL2xpYi9hdXRoJyk7Cit2YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vbGliL2hlbHBlcnMnKTsKK3ZhciBTd2FnZ2VyQ2xpZW50ID0gcmVxdWlyZSgnLi9saWIvY2xpZW50Jyk7Cit2YXIgZGVwcmVjYXRpb25XcmFwcGVyID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykgeworICBoZWxwZXJzLmxvZygnVGhpcyBpcyBkZXByZWNhdGVkLCB1c2UgIm5ldyBTd2FnZ2VyQ2xpZW50IiBpbnN0ZWFkLicpOworCisgIHJldHVybiBuZXcgU3dhZ2dlckNsaWVudCh1cmwsIG9wdGlvbnMpOworfTsKKworLyogSGVyZSBmb3IgSUU4IFN1cHBvcnQgKi8KK2lmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHsKKyAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbihvYmosIHN0YXJ0KSB7CisgICAgZm9yICh2YXIgaSA9IChzdGFydCB8fCAwKSwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7CisgICAgICBpZiAodGhpc1tpXSA9PT0gb2JqKSB7IHJldHVybiBpOyB9CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfTsKK307CisKKy8qIEhlcmUgZm9yIG5vZGUgMTAueCBzdXBwb3J0ICovCitpZiAoIVN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgpIHsKKyAgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCA9IGZ1bmN0aW9uKHN1ZmZpeCkgeworICAgIHJldHVybiB0aGlzLmluZGV4T2Yoc3VmZml4LCB0aGlzLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICE9PSAtMTsKKyAgfTsKK307CisKK21vZHVsZS5leHBvcnRzID0gU3dhZ2dlckNsaWVudDsKKworU3dhZ2dlckNsaWVudC5BcGlLZXlBdXRob3JpemF0aW9uID0gYXV0aC5BcGlLZXlBdXRob3JpemF0aW9uOworU3dhZ2dlckNsaWVudC5QYXNzd29yZEF1dGhvcml6YXRpb24gPSBhdXRoLlBhc3N3b3JkQXV0aG9yaXphdGlvbjsKK1N3YWdnZXJDbGllbnQuQ29va2llQXV0aG9yaXphdGlvbiA9IGF1dGguQ29va2llQXV0aG9yaXphdGlvbjsKK1N3YWdnZXJDbGllbnQuU3dhZ2dlckFwaSA9IGRlcHJlY2F0aW9uV3JhcHBlcjsKK1N3YWdnZXJDbGllbnQuU3dhZ2dlckNsaWVudCA9IGRlcHJlY2F0aW9uV3JhcHBlcjsKKworfSx7Ii4vbGliL2F1dGgiOjIsIi4vbGliL2NsaWVudCI6MywiLi9saWIvaGVscGVycyI6NH1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworCit2YXIgYnRvYSA9IHJlcXVpcmUoJ2J0b2EnKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lCit2YXIgQ29va2llSmFyID0gcmVxdWlyZSgnY29va2llamFyJyk7CisKKy8qKgorICogU3dhZ2dlckF1dGhvcml6YXRpb25zIGFwcGx5cyB0aGUgY29ycmVjdCBhdXRob3JpemF0aW9uIHRvIGFuIG9wZXJhdGlvbiBiZWluZyBleGVjdXRlZAorICovCit2YXIgU3dhZ2dlckF1dGhvcml6YXRpb25zID0gbW9kdWxlLmV4cG9ydHMuU3dhZ2dlckF1dGhvcml6YXRpb25zID0gZnVuY3Rpb24gKCkgeworICB0aGlzLmF1dGh6ID0ge307Cit9OworCitTd2FnZ2VyQXV0aG9yaXphdGlvbnMucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuYW1lLCBhdXRoKSB7CisgIHRoaXMuYXV0aHpbbmFtZV0gPSBhdXRoOworCisgIHJldHVybiBhdXRoOworfTsKKworU3dhZ2dlckF1dGhvcml6YXRpb25zLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobmFtZSkgeworICByZXR1cm4gZGVsZXRlIHRoaXMuYXV0aHpbbmFtZV07Cit9OworCitTd2FnZ2VyQXV0aG9yaXphdGlvbnMucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24gKG9iaiwgYXV0aG9yaXphdGlvbnMpIHsKKyAgdmFyIHN0YXR1cyA9IG51bGw7CisgIHZhciBrZXksIG5hbWUsIHZhbHVlLCByZXN1bHQ7CisKKyAgLy8gaWYgdGhlICdhdXRob3JpemF0aW9ucycga2V5IGlzIHVuZGVmaW5lZCwgb3IgaGFzIGFuIGVtcHR5IGFycmF5LCBhZGQgYWxsIGtleXMKKyAgaWYgKHR5cGVvZiBhdXRob3JpemF0aW9ucyA9PT0gJ3VuZGVmaW5lZCcgfHwgT2JqZWN0LmtleXMoYXV0aG9yaXphdGlvbnMpLmxlbmd0aCA9PT0gMCkgeworICAgIGZvciAoa2V5IGluIHRoaXMuYXV0aHopIHsKKyAgICAgIHZhbHVlID0gdGhpcy5hdXRoeltrZXldOworICAgICAgcmVzdWx0ID0gdmFsdWUuYXBwbHkob2JqLCBhdXRob3JpemF0aW9ucyk7CisKKyAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKKyAgICAgICAgc3RhdHVzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gMi4wIHN1cHBvcnQKKyAgICBpZiAoQXJyYXkuaXNBcnJheShhdXRob3JpemF0aW9ucykpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXV0aG9yaXphdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGF1dGggPSBhdXRob3JpemF0aW9uc1tpXTsKKworICAgICAgICBmb3IgKG5hbWUgaW4gYXV0aCkgeworICAgICAgICAgIGZvciAoa2V5IGluIHRoaXMuYXV0aHopIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT09IG5hbWUpIHsKKyAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmF1dGh6W2tleV07CisgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlLmFwcGx5KG9iaiwgYXV0aG9yaXphdGlvbnMpOworCisgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIDEuMiBzdXBwb3J0CisgICAgICBmb3IgKG5hbWUgaW4gYXV0aG9yaXphdGlvbnMpIHsKKyAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5hdXRoeikgeworICAgICAgICAgIGlmIChrZXkgPT09IG5hbWUpIHsKKyAgICAgICAgICAgIHZhbHVlID0gdGhpcy5hdXRoeltrZXldOworICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUuYXBwbHkob2JqLCBhdXRob3JpemF0aW9ucyk7CisKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfTsKKworLyoqCisgKiBBcGlLZXlBdXRob3JpemF0aW9uIGFsbG93cyBhIHF1ZXJ5IHBhcmFtIG9yIGhlYWRlciB0byBiZSBpbmplY3RlZAorICovCit2YXIgQXBpS2V5QXV0aG9yaXphdGlvbiA9IG1vZHVsZS5leHBvcnRzLkFwaUtleUF1dGhvcml6YXRpb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHR5cGUpIHsKKyAgdGhpcy5uYW1lID0gbmFtZTsKKyAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB0aGlzLnR5cGUgPSB0eXBlOworfTsKKworQXBpS2V5QXV0aG9yaXphdGlvbi5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbiAob2JqKSB7CisgIGlmICh0aGlzLnR5cGUgPT09ICdxdWVyeScpIHsKKyAgICBpZiAob2JqLnVybC5pbmRleE9mKCc/JykgPiAwKSB7CisgICAgICBvYmoudXJsID0gb2JqLnVybCArICcmJyArIHRoaXMubmFtZSArICc9JyArIHRoaXMudmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG9iai51cmwgPSBvYmoudXJsICsgJz8nICsgdGhpcy5uYW1lICsgJz0nICsgdGhpcy52YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdoZWFkZXInKSB7CisgICAgb2JqLmhlYWRlcnNbdGhpcy5uYW1lXSA9IHRoaXMudmFsdWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordmFyIENvb2tpZUF1dGhvcml6YXRpb24gPSBtb2R1bGUuZXhwb3J0cy5Db29raWVBdXRob3JpemF0aW9uID0gZnVuY3Rpb24gKGNvb2tpZSkgeworICB0aGlzLmNvb2tpZSA9IGNvb2tpZTsKK307CisKK0Nvb2tpZUF1dGhvcml6YXRpb24ucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24gKG9iaikgeworICBvYmouY29va2llSmFyID0gb2JqLmNvb2tpZUphciB8fCBuZXcgQ29va2llSmFyKCk7CisgIG9iai5jb29raWVKYXIuc2V0Q29va2llKHRoaXMuY29va2llKTsKKworICByZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogUGFzc3dvcmQgQXV0aG9yaXphdGlvbiBpcyBhIGJhc2ljIGF1dGggaW1wbGVtZW50YXRpb24KKyAqLwordmFyIFBhc3N3b3JkQXV0aG9yaXphdGlvbiA9IG1vZHVsZS5leHBvcnRzLlBhc3N3b3JkQXV0aG9yaXphdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCB1c2VybmFtZSwgcGFzc3dvcmQpIHsKKyAgdGhpcy5uYW1lID0gbmFtZTsKKyAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Cit9OworCitQYXNzd29yZEF1dGhvcml6YXRpb24ucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24gKG9iaikgeworICBvYmouaGVhZGVycy5BdXRob3JpemF0aW9uID0gJ0Jhc2ljICcgKyBidG9hKHRoaXMudXNlcm5hbWUgKyAnOicgKyB0aGlzLnBhc3N3b3JkKTsKKworICByZXR1cm4gdHJ1ZTsKK307CisKK30seyJidG9hIjoxNiwiY29va2llamFyIjoxN31dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworCit2YXIgXyA9IHsKKyAgYmluZDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9mdW5jdGlvbi9iaW5kJyksCisgIGNsb25lRGVlcDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2Nsb25lRGVlcCcpLAorICBmaW5kOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vZmluZCcpLAorICBmb3JFYWNoOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vZm9yRWFjaCcpLAorICBpbmRleE9mOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2FycmF5L2luZGV4T2YnKSwKKyAgaXNBcnJheTogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzQXJyYXknKSwKKyAgaXNGdW5jdGlvbjogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzRnVuY3Rpb24nKSwKKyAgaXNQbGFpbk9iamVjdDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzUGxhaW5PYmplY3QnKSwKKyAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc1VuZGVmaW5lZCcpCit9OwordmFyIGF1dGggPSByZXF1aXJlKCcuL2F1dGgnKTsKK3ZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7Cit2YXIgTW9kZWwgPSByZXF1aXJlKCcuL3R5cGVzL21vZGVsJyk7Cit2YXIgT3BlcmF0aW9uID0gcmVxdWlyZSgnLi90eXBlcy9vcGVyYXRpb24nKTsKK3ZhciBPcGVyYXRpb25Hcm91cCA9IHJlcXVpcmUoJy4vdHlwZXMvb3BlcmF0aW9uR3JvdXAnKTsKK3ZhciBSZXNvbHZlciA9IHJlcXVpcmUoJy4vcmVzb2x2ZXInKTsKK3ZhciBTd2FnZ2VySHR0cCA9IHJlcXVpcmUoJy4vaHR0cCcpOwordmFyIFN3YWdnZXJTcGVjQ29udmVydGVyID0gcmVxdWlyZSgnLi9zcGVjLWNvbnZlcnRlcicpOworCisvLyBXZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGZ1bmN0aW9uL3Byb3BlcnR5IG5hbWVzIHRvIGF2b2lkIGNvbGxpc2lvbnMgZm9yIHRhZyBuYW1lcyB3aGljaCBhcmUgdXNlZCB0byBhbGxvdyB0aGUKKy8vIGZvbGxvd2luZyB1c2FnZTogJ2NsaWVudC57dGFnTmFtZX0nCit2YXIgcmVzZXJ2ZWRDbGllbnRUYWdzID0gWworICAnYXV0aG9yaXphdGlvblNjaGVtZScsCisgICdhdXRob3JpemF0aW9ucycsCisgICdiYXNlUGF0aCcsCisgICdidWlsZCcsCisgICdidWlsZEZyb20xXzFTcGVjJywKKyAgJ2J1aWxkRnJvbTFfMlNwZWMnLAorICAnYnVpbGRGcm9tU3BlYycsCisgICdjbGllbnRBdXRob3JpemF0aW9ucycsCisgICdjb252ZXJ0SW5mbycsCisgICdkZWJ1ZycsCisgICdkZWZhdWx0RXJyb3JDYWxsYmFjaycsCisgICdkZWZhdWx0U3VjY2Vzc0NhbGxiYWNrJywKKyAgJ2ZhaWwnLAorICAnZmFpbHVyZScsCisgICdmaW5pc2gnLAorICAnaGVscCcsCisgICdpZEZyb21PcCcsCisgICdpbmZvJywKKyAgJ2luaXRpYWxpemUnLAorICAnaXNCdWlsdCcsCisgICdpc1ZhbGlkJywKKyAgJ21vZGVscycsCisgICdtb2RlbHNBcnJheScsCisgICdvcHRpb25zJywKKyAgJ3BhcnNlVXJpJywKKyAgJ3Byb2dyZXNzJywKKyAgJ3Jlc291cmNlQ291bnQnLAorICAnc2FtcGxlTW9kZWxzJywKKyAgJ3NlbGZSZWZsZWN0JywKKyAgJ3NldENvbnNvbGlkYXRlZE1vZGVscycsCisgICdzcGVjJywKKyAgJ3N1cHBvcnRlZFN1Ym1pdE1ldGhvZHMnLAorICAnc3dhZ2dlclJlcXVlc3RIZWFkZXJzJywKKyAgJ3RhZ0Zyb21MYWJlbCcsCisgICd1cmwnLAorICAndXNlSlF1ZXJ5JworXTsKKy8vIFdlIGhhdmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgZnVuY3Rpb24vcHJvcGVydHkgbmFtZXMgdG8gYXZvaWQgY29sbGlzaW9ucyBmb3IgdGFnIG5hbWVzIHdoaWNoIGFyZSB1c2VkIHRvIGFsbG93IHRoZQorLy8gZm9sbG93aW5nIHVzYWdlOiAnY2xpZW50LmFwaXMue3RhZ05hbWV9JwordmFyIHJlc2VydmVkQXBpVGFncyA9IFsKKyAgJ2FwaXMnLAorICAnYXNDdXJsJywKKyAgJ2Rlc2NyaXB0aW9uJywKKyAgJ2V4dGVybmFsRG9jcycsCisgICdoZWxwJywKKyAgJ2xhYmVsJywKKyAgJ25hbWUnLAorICAnb3BlcmF0aW9uJywKKyAgJ29wZXJhdGlvbnMnLAorICAnb3BlcmF0aW9uc0FycmF5JywKKyAgJ3BhdGgnLAorICAndGFnJworXTsKK3ZhciBzdXBwb3J0ZWRPcGVyYXRpb25NZXRob2RzID0gWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucycsICdwYXRjaCcsICdwb3N0JywgJ3B1dCddOwordmFyIFN3YWdnZXJDbGllbnQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHsKKyAgdGhpcy5hdXRob3JpemF0aW9uU2NoZW1lID0gbnVsbDsKKyAgdGhpcy5hdXRob3JpemF0aW9ucyA9IG51bGw7CisgIHRoaXMuYmFzZVBhdGggPSBudWxsOworICB0aGlzLmRlYnVnID0gZmFsc2U7CisgIHRoaXMuaW5mbyA9IG51bGw7CisgIHRoaXMuaXNCdWlsdCA9IGZhbHNlOworICB0aGlzLmlzVmFsaWQgPSBmYWxzZTsKKyAgdGhpcy5tb2RlbHNBcnJheSA9IFtdOworICB0aGlzLnJlc291cmNlQ291bnQgPSAwOworICB0aGlzLnVybCA9IG51bGw7CisgIHRoaXMudXNlSlF1ZXJ5ID0gZmFsc2U7CisKKyAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7CisgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSh1cmwsIG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIHJldHVybiB0aGlzOworICB9Cit9OworCitTd2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykgeworICB0aGlzLm1vZGVscyA9IHt9OworICB0aGlzLnNhbXBsZU1vZGVscyA9IHt9OworCisgIG9wdGlvbnMgPSAob3B0aW9ucyB8fCB7fSk7CisKKyAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy51cmwgPSB1cmw7CisgIH0gZWxzZSBpZiAodHlwZW9mIHVybCA9PT0gJ29iamVjdCcpIHsKKyAgICBvcHRpb25zID0gdXJsOworICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmw7CisgIH0KKworICB0aGlzLnN3YWdnZXJSZXF1ZXN0SGVhZGVycyA9IG9wdGlvbnMuc3dhZ2dlclJlcXVlc3RIZWFkZXJzIHx8ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgsKi8qJzsKKyAgdGhpcy5kZWZhdWx0U3VjY2Vzc0NhbGxiYWNrID0gb3B0aW9ucy5kZWZhdWx0U3VjY2Vzc0NhbGxiYWNrIHx8IG51bGw7CisgIHRoaXMuZGVmYXVsdEVycm9yQ2FsbGJhY2sgPSBvcHRpb25zLmRlZmF1bHRFcnJvckNhbGxiYWNrIHx8IG51bGw7CisKKyAgaWYgKHR5cGVvZiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHsKKyAgICB0aGlzLnN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7CisgIH0KKworICBpZiAob3B0aW9ucy51c2VKUXVlcnkpIHsKKyAgICB0aGlzLnVzZUpRdWVyeSA9IG9wdGlvbnMudXNlSlF1ZXJ5OworICB9CisKKyAgaWYgKG9wdGlvbnMuYXV0aG9yaXphdGlvbnMpIHsKKyAgICB0aGlzLmNsaWVudEF1dGhvcml6YXRpb25zID0gb3B0aW9ucy5hdXRob3JpemF0aW9uczsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLmNsaWVudEF1dGhvcml6YXRpb25zID0gbmV3IGF1dGguU3dhZ2dlckF1dGhvcml6YXRpb25zKCk7CisgIH0KKworICB0aGlzLnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHMgPSBvcHRpb25zLnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHMgfHwgW107CisgIHRoaXMuZmFpbHVyZSA9IG9wdGlvbnMuZmFpbHVyZSB8fCBmdW5jdGlvbiAoKSB7fTsKKyAgdGhpcy5wcm9ncmVzcyA9IG9wdGlvbnMucHJvZ3Jlc3MgfHwgZnVuY3Rpb24gKCkge307CisgIHRoaXMuc3BlYyA9IF8uY2xvbmVEZWVwKG9wdGlvbnMuc3BlYyk7IC8vIENsb25lIHNvIHdlIGRvIG5vdCBhbHRlciB0aGUgcHJvdmlkZWQgZG9jdW1lbnQKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKworICBpZiAodHlwZW9mIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykgeworICAgIHRoaXMucmVhZHkgPSB0cnVlOworICAgIHRoaXMuYnVpbGQoKTsKKyAgfQorfTsKKworU3dhZ2dlckNsaWVudC5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAobW9jaykgeworICBpZiAodGhpcy5pc0J1aWx0KSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICB2YXIgc2VsZiA9IHRoaXM7CisKKyAgdGhpcy5wcm9ncmVzcygnZmV0Y2hpbmcgcmVzb3VyY2UgbGlzdDogJyArIHRoaXMudXJsKTsKKworICB2YXIgb2JqID0geworICAgIHVzZUpRdWVyeTogdGhpcy51c2VKUXVlcnksCisgICAgdXJsOiB0aGlzLnVybCwKKyAgICBtZXRob2Q6ICdnZXQnLAorICAgIGhlYWRlcnM6IHsKKyAgICAgIGFjY2VwdDogdGhpcy5zd2FnZ2VyUmVxdWVzdEhlYWRlcnMKKyAgICB9LAorICAgIG9uOiB7CisgICAgICBlcnJvcjogZnVuY3Rpb24gKHJlc3BvbnNlKSB7CisgICAgICAgIGlmIChzZWxmLnVybC5zdWJzdHJpbmcoMCwgNCkgIT09ICdodHRwJykgeworICAgICAgICAgIHJldHVybiBzZWxmLmZhaWwoJ1BsZWFzZSBzcGVjaWZ5IHRoZSBwcm90b2NvbCBmb3IgJyArIHNlbGYudXJsKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDApIHsKKyAgICAgICAgICByZXR1cm4gc2VsZi5mYWlsKCdDYW5cJ3QgcmVhZCBmcm9tIHNlcnZlci4gIEl0IG1heSBub3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzLWNvbnRyb2wtb3JpZ2luIHNldHRpbmdzLicpOworICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7CisgICAgICAgICAgcmV0dXJuIHNlbGYuZmFpbCgnQ2FuXCd0IHJlYWQgc3dhZ2dlciBKU09OIGZyb20gJyArIHNlbGYudXJsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gc2VsZi5mYWlsKHJlc3BvbnNlLnN0YXR1cyArICcgOiAnICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCArICcgJyArIHNlbGYudXJsKTsKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcCkgeworICAgICAgICB2YXIgcmVzcG9uc2VPYmogPSByZXNwLm9iaiB8fCBKU09OLnBhcnNlKHJlc3AuZGF0YSk7CisgICAgICAgIHNlbGYuc3dhZ2dlclZlcnNpb24gPSByZXNwb25zZU9iai5zd2FnZ2VyVmVyc2lvbjsKKworICAgICAgICBpZiAocmVzcG9uc2VPYmouc3dhZ2dlciAmJiBwYXJzZUludChyZXNwb25zZU9iai5zd2FnZ2VyKSA9PT0gMikgeworICAgICAgICAgIHNlbGYuc3dhZ2dlclZlcnNpb24gPSByZXNwb25zZU9iai5zd2FnZ2VyOworCisgICAgICAgICAgbmV3IFJlc29sdmVyKCkucmVzb2x2ZShyZXNwb25zZU9iaiwgc2VsZi5idWlsZEZyb21TcGVjLCBzZWxmKTsKKworICAgICAgICAgIHNlbGYuaXNWYWxpZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIGNvbnZlcnRlciA9IG5ldyBTd2FnZ2VyU3BlY0NvbnZlcnRlcigpOworICAgICAgICAgIGNvbnZlcnRlci5zZXREb2N1bWVudGF0aW9uTG9jYXRpb24oc2VsZi51cmwpOworICAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KHJlc3BvbnNlT2JqLCBmdW5jdGlvbihzcGVjKSB7CisgICAgICAgICAgICBuZXcgUmVzb2x2ZXIoKS5yZXNvbHZlKHNwZWMsIHNlbGYuYnVpbGRGcm9tU3BlYywgc2VsZik7CisgICAgICAgICAgICBzZWxmLmlzVmFsaWQgPSB0cnVlOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIGlmICh0aGlzLnNwZWMpIHsKKyAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgIG5ldyBSZXNvbHZlcigpLnJlc29sdmUoc2VsZi5zcGVjLCBzZWxmLmJ1aWxkRnJvbVNwZWMsIHNlbGYpOworICAgfSwgMTApOworICB9IGVsc2UgeworICAgIHRoaXMuY2xpZW50QXV0aG9yaXphdGlvbnMuYXBwbHkob2JqKTsKKworICAgIGlmIChtb2NrKSB7CisgICAgICByZXR1cm4gb2JqOworICAgIH0KKworICAgIG5ldyBTd2FnZ2VySHR0cCgpLmV4ZWN1dGUob2JqKTsKKyAgfQorCisgIHJldHVybiB0aGlzOworfTsKKworU3dhZ2dlckNsaWVudC5wcm90b3R5cGUuYnVpbGRGcm9tU3BlYyA9IGZ1bmN0aW9uIChyZXNwb25zZSkgeworICBpZiAodGhpcy5pc0J1aWx0KSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICB0aGlzLmFwaXMgPSB7fTsKKyAgdGhpcy5hcGlzQXJyYXkgPSBbXTsKKyAgdGhpcy5iYXNlUGF0aCA9IHJlc3BvbnNlLmJhc2VQYXRoIHx8ICcnOworICB0aGlzLmNvbnN1bWVzID0gcmVzcG9uc2UuY29uc3VtZXM7CisgIHRoaXMuaG9zdCA9IHJlc3BvbnNlLmhvc3QgfHwgJyc7CisgIHRoaXMuaW5mbyA9IHJlc3BvbnNlLmluZm8gfHwge307CisgIHRoaXMucHJvZHVjZXMgPSByZXNwb25zZS5wcm9kdWNlczsKKyAgdGhpcy5zY2hlbWVzID0gcmVzcG9uc2Uuc2NoZW1lcyB8fCBbXTsKKyAgdGhpcy5zZWN1cml0eURlZmluaXRpb25zID0gcmVzcG9uc2Uuc2VjdXJpdHlEZWZpbml0aW9uczsKKyAgdGhpcy50aXRsZSA9IHJlc3BvbnNlLnRpdGxlIHx8ICcnOworCisgIGlmIChyZXNwb25zZS5leHRlcm5hbERvY3MpIHsKKyAgICB0aGlzLmV4dGVybmFsRG9jcyA9IHJlc3BvbnNlLmV4dGVybmFsRG9jczsKKyAgfQorCisgIC8vIGxlZ2FjeSBzdXBwb3J0CisgIHRoaXMuYXV0aFNjaGVtZXMgPSByZXNwb25zZS5zZWN1cml0eURlZmluaXRpb25zOworCisgIHZhciBkZWZpbmVkVGFncyA9IHt9OworICB2YXIgazsKKworICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZS50YWdzKSkgeworICAgIGRlZmluZWRUYWdzID0ge307CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgcmVzcG9uc2UudGFncy5sZW5ndGg7IGsrKykgeworICAgICAgdmFyIHQgPSByZXNwb25zZS50YWdzW2tdOworCisgICAgICBkZWZpbmVkVGFnc1t0Lm5hbWVdID0gdDsKKyAgICB9CisgIH0KKworICB2YXIgbG9jYXRpb247CisKKyAgaWYgKHR5cGVvZiB0aGlzLnVybCA9PT0gJ3N0cmluZycpIHsKKyAgICBsb2NhdGlvbiA9IHRoaXMucGFyc2VVcmkodGhpcy51cmwpOworICB9CisKKyAgaWYgKHR5cGVvZiB0aGlzLnNjaGVtZXMgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMuc2NoZW1lcy5sZW5ndGggPT09IDApIHsKKyAgICB0aGlzLnNjaGVtZSA9IGxvY2F0aW9uLnNjaGVtZSB8fCAnaHR0cCc7CisgIH0gZWxzZSB7CisgICAgdGhpcy5zY2hlbWUgPSB0aGlzLnNjaGVtZXNbMF07CisgIH0KKworICBpZiAodHlwZW9mIHRoaXMuaG9zdCA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5ob3N0ID09PSAnJykgeworICAgIHRoaXMuaG9zdCA9IGxvY2F0aW9uLmhvc3Q7CisKKyAgICBpZiAobG9jYXRpb24ucG9ydCkgeworICAgICAgdGhpcy5ob3N0ID0gdGhpcy5ob3N0ICsgJzonICsgbG9jYXRpb24ucG9ydDsKKyAgICB9CisgIH0KKworICB0aGlzLmRlZmluaXRpb25zID0gcmVzcG9uc2UuZGVmaW5pdGlvbnM7CisKKyAgdmFyIGtleTsKKworICBmb3IgKGtleSBpbiB0aGlzLmRlZmluaXRpb25zKSB7CisgICAgdmFyIG1vZGVsID0gbmV3IE1vZGVsKGtleSwgdGhpcy5kZWZpbml0aW9uc1trZXldLCB0aGlzLm1vZGVscyk7CisKKyAgICBpZiAobW9kZWwpIHsKKyAgICAgIHRoaXMubW9kZWxzW2tleV0gPSBtb2RlbDsKKyAgICB9CisgIH0KKworICAvLyBnZXQgcGF0aHMsIGNyZWF0ZSBmdW5jdGlvbnMgZm9yIGVhY2ggb3BlcmF0aW9uSWQKKyAgdmFyIHNlbGYgPSB0aGlzOworCisgIC8vIEJpbmQgaGVscCB0byAnY2xpZW50LmFwaXMnCisgIHNlbGYuYXBpcy5oZWxwID0gXy5iaW5kKHNlbGYuaGVscCwgc2VsZik7CisKKyAgXy5mb3JFYWNoKHJlc3BvbnNlLnBhdGhzLCBmdW5jdGlvbiAocGF0aE9iaiwgcGF0aCkgeworICAgIC8vIE9ubHkgcHJvY2VzcyBhIHBhdGggaWYgaXQncyBhbiBvYmplY3QKKyAgICBpZiAoIV8uaXNQbGFpbk9iamVjdChwYXRoT2JqKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF8uZm9yRWFjaChzdXBwb3J0ZWRPcGVyYXRpb25NZXRob2RzLCBmdW5jdGlvbiAobWV0aG9kKSB7CisgICAgICB2YXIgb3BlcmF0aW9uID0gcGF0aE9ialttZXRob2RdOworCisgICAgICBpZiAoXy5pc1VuZGVmaW5lZChvcGVyYXRpb24pKSB7CisgICAgICAgIC8vIE9wZXJhdGlvbiBkb2VzIG5vdCBleGlzdAorICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKCFfLmlzUGxhaW5PYmplY3Qob3BlcmF0aW9uKSkgeworICAgICAgICAvLyBPcGVyYXRpb24gZXhpc3RzIGJ1dCBpdCBpcyBub3QgYW4gT3BlcmF0aW9uIE9iamVjdC4gIFNpbmNlIHRoaXMgaXMgaW52YWxpZCwgbG9nIGl0LgorICAgICAgICBoZWxwZXJzLmxvZygnVGhlIFwnJyArIG1ldGhvZCArICdcJyBvcGVyYXRpb24gZm9yIFwnJyArIHBhdGggKyAnXCcgcGF0aCBpcyBub3QgYW4gT3BlcmF0aW9uIE9iamVjdCcpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHRhZ3MgPSBvcGVyYXRpb24udGFnczsKKworICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGFncykgfHwgIV8uaXNBcnJheSh0YWdzKSB8fCB0YWdzLmxlbmd0aCA9PT0gMCkgeworICAgICAgICB0YWdzID0gb3BlcmF0aW9uLnRhZ3MgPSBbICdkZWZhdWx0JyBdOworICAgICAgfQorCisgICAgICB2YXIgb3BlcmF0aW9uSWQgPSBzZWxmLmlkRnJvbU9wKHBhdGgsIG1ldGhvZCwgb3BlcmF0aW9uKTsKKyAgICAgIHZhciBvcGVyYXRpb25PYmplY3QgPSBuZXcgT3BlcmF0aW9uKHNlbGYsIG9wZXJhdGlvbi5zY2hlbWUsIG9wZXJhdGlvbklkLCBtZXRob2QsIHBhdGgsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVmaW5pdGlvbnMsIHNlbGYubW9kZWxzLCBzZWxmLmNsaWVudEF1dGhvcml6YXRpb25zKTsKKworICAgICAgLy8gYmluZCBzZWxmIG9wZXJhdGlvbidzIGV4ZWN1dGUgY29tbWFuZCB0byB0aGUgYXBpCisgICAgICBfLmZvckVhY2godGFncywgZnVuY3Rpb24gKHRhZykgeworICAgICAgICB2YXIgY2xpZW50UHJvcGVydHkgPSBfLmluZGV4T2YocmVzZXJ2ZWRDbGllbnRUYWdzLCB0YWcpID4gLTEgPyAnXycgKyB0YWcgOiB0YWc7CisgICAgICAgIHZhciBhcGlQcm9wZXJ0eSA9IF8uaW5kZXhPZihyZXNlcnZlZEFwaVRhZ3MsIHRhZykgPiAtMSA/ICdfJyArIHRhZyA6IHRhZzsKKyAgICAgICAgdmFyIG9wZXJhdGlvbkdyb3VwID0gc2VsZltjbGllbnRQcm9wZXJ0eV07CisKKyAgICAgICAgaWYgKGNsaWVudFByb3BlcnR5ICE9PSB0YWcpIHsKKyAgICAgICAgICBoZWxwZXJzLmxvZygnVGhlIFwnJyArIHRhZyArICdcJyB0YWcgY29uZmxpY3RzIHdpdGggYSBTd2FnZ2VyQ2xpZW50IGZ1bmN0aW9uL3Byb3BlcnR5IG5hbWUuICBVc2UgXCdjbGllbnQuJyArCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UHJvcGVydHkgKyAnXCcgb3IgXCdjbGllbnQuYXBpcy4nICsgdGFnICsgJ1wnIGluc3RlYWQgb2YgXCdjbGllbnQuJyArIHRhZyArICdcJy4nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcGlQcm9wZXJ0eSAhPT0gdGFnKSB7CisgICAgICAgICAgaGVscGVycy5sb2coJ1RoZSBcJycgKyB0YWcgKyAnXCcgdGFnIGNvbmZsaWN0cyB3aXRoIGEgU3dhZ2dlckNsaWVudCBvcGVyYXRpb24gZnVuY3Rpb24vcHJvcGVydHkgbmFtZS4gIFVzZSAnICsKKyAgICAgICAgICAgICAgICAgICAgICAnXCdjbGllbnQuYXBpcy4nICsgYXBpUHJvcGVydHkgKyAnXCcgaW5zdGVhZCBvZiBcJ2NsaWVudC5hcGlzLicgKyB0YWcgKyAnXCcuJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoXy5pbmRleE9mKHJlc2VydmVkQXBpVGFncywgb3BlcmF0aW9uSWQpID4gLTEpIHsKKyAgICAgICAgICBoZWxwZXJzLmxvZygnVGhlIFwnJyArIG9wZXJhdGlvbklkICsgJ1wnIG9wZXJhdGlvbklkIGNvbmZsaWN0cyB3aXRoIGEgU3dhZ2dlckNsaWVudCBvcGVyYXRpb24gJyArCisgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uL3Byb3BlcnR5IG5hbWUuICBVc2UgXCdjbGllbnQuYXBpcy4nICsgYXBpUHJvcGVydHkgKyAnLl8nICsgb3BlcmF0aW9uSWQgKworICAgICAgICAgICAgICAgICAgICAgICdcJyBpbnN0ZWFkIG9mIFwnY2xpZW50LmFwaXMuJyArIGFwaVByb3BlcnR5ICsgJy4nICsgb3BlcmF0aW9uSWQgKyAnXCcuJyk7CisKKyAgICAgICAgICBvcGVyYXRpb25JZCA9ICdfJyArIG9wZXJhdGlvbklkOworICAgICAgICAgIG9wZXJhdGlvbk9iamVjdC5uaWNrbmFtZSA9IG9wZXJhdGlvbklkOyAvLyBTbyAnY2xpZW50LmFwaXMuW3RhZ10ub3BlcmF0aW9uSWQuaGVscCgpIHdvcmtzIHByb3Blcmx5CisgICAgICAgIH0KKworICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChvcGVyYXRpb25Hcm91cCkpIHsKKyAgICAgICAgICBvcGVyYXRpb25Hcm91cCA9IHNlbGZbY2xpZW50UHJvcGVydHldID0gc2VsZi5hcGlzW2FwaVByb3BlcnR5XSA9IHt9OworCisgICAgICAgICAgb3BlcmF0aW9uR3JvdXAub3BlcmF0aW9ucyA9IHt9OworICAgICAgICAgIG9wZXJhdGlvbkdyb3VwLmxhYmVsID0gYXBpUHJvcGVydHk7CisgICAgICAgICAgb3BlcmF0aW9uR3JvdXAuYXBpcyA9IHt9OworCisgICAgICAgICAgdmFyIHRhZ0RlZiA9IGRlZmluZWRUYWdzW3RhZ107CisKKyAgICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGFnRGVmKSkgeworICAgICAgICAgICAgb3BlcmF0aW9uR3JvdXAuZGVzY3JpcHRpb24gPSB0YWdEZWYuZGVzY3JpcHRpb247CisgICAgICAgICAgICBvcGVyYXRpb25Hcm91cC5leHRlcm5hbERvY3MgPSB0YWdEZWYuZXh0ZXJuYWxEb2NzOworICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGZbY2xpZW50UHJvcGVydHldLmhlbHAgPSBfLmJpbmQoc2VsZi5oZWxwLCBvcGVyYXRpb25Hcm91cCk7CisgICAgICAgICAgc2VsZi5hcGlzQXJyYXkucHVzaChuZXcgT3BlcmF0aW9uR3JvdXAodGFnLCBvcGVyYXRpb25Hcm91cC5kZXNjcmlwdGlvbiwgb3BlcmF0aW9uR3JvdXAuZXh0ZXJuYWxEb2NzLCBvcGVyYXRpb25PYmplY3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJpbmQgdGFnIGhlbHAKKyAgICAgICAgaWYgKCFfLmlzRnVuY3Rpb24ob3BlcmF0aW9uR3JvdXAuaGVscCkpIHsKKyAgICAgICAgICBvcGVyYXRpb25Hcm91cC5oZWxwID0gXy5iaW5kKHNlbGYuaGVscCwgb3BlcmF0aW9uR3JvdXApOworICAgICAgICB9CisKKyAgICAgICAgLy8gYmluZCB0byB0aGUgYXBpcyBvYmplY3QKKyAgICAgICAgc2VsZi5hcGlzW2FwaVByb3BlcnR5XVtvcGVyYXRpb25JZF0gPSBvcGVyYXRpb25Hcm91cFtvcGVyYXRpb25JZF09IF8uYmluZChvcGVyYXRpb25PYmplY3QuZXhlY3V0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25PYmplY3QpOworICAgICAgICBzZWxmLmFwaXNbYXBpUHJvcGVydHldW29wZXJhdGlvbklkXS5oZWxwID0gb3BlcmF0aW9uR3JvdXBbb3BlcmF0aW9uSWRdLmhlbHAgPSBfLmJpbmQob3BlcmF0aW9uT2JqZWN0LmhlbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25PYmplY3QpOworICAgICAgICBzZWxmLmFwaXNbYXBpUHJvcGVydHldW29wZXJhdGlvbklkXS5hc0N1cmwgPSBvcGVyYXRpb25Hcm91cFtvcGVyYXRpb25JZF0uYXNDdXJsID0gXy5iaW5kKG9wZXJhdGlvbk9iamVjdC5hc0N1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uT2JqZWN0KTsKKworICAgICAgICBvcGVyYXRpb25Hcm91cC5hcGlzW29wZXJhdGlvbklkXSA9IG9wZXJhdGlvbkdyb3VwLm9wZXJhdGlvbnNbb3BlcmF0aW9uSWRdID0gb3BlcmF0aW9uT2JqZWN0OworCisgICAgICAgIC8vIGxlZ2FjeSBVSSBmZWF0dXJlCisgICAgICAgIHZhciBhcGkgPSBfLmZpbmQoc2VsZi5hcGlzQXJyYXksIGZ1bmN0aW9uIChhcGkpIHsKKyAgICAgICAgICByZXR1cm4gYXBpLnRhZyA9PT0gdGFnOworICAgICAgICB9KTsKKworICAgICAgICBpZiAoYXBpKSB7CisgICAgICAgICAgYXBpLm9wZXJhdGlvbnNBcnJheS5wdXNoKG9wZXJhdGlvbk9iamVjdCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0pOworICB9KTsKKworICB0aGlzLmlzQnVpbHQgPSB0cnVlOworCisgIGlmICh0aGlzLnN1Y2Nlc3MpIHsKKyAgICB0aGlzLmlzVmFsaWQgPSB0cnVlOworICAgIHRoaXMuaXNCdWlsdCA9IHRydWU7CisgICAgdGhpcy5zdWNjZXNzKCk7CisgIH0KKworICByZXR1cm4gdGhpczsKK307CisKK1N3YWdnZXJDbGllbnQucHJvdG90eXBlLnBhcnNlVXJpID0gZnVuY3Rpb24gKHVyaSkgeworICB2YXIgdXJsUGFyc2VSRSA9IC9eKCgoKFteOlwvI1w/XSs6KT8oPzooXC9cLykoKD86KChbXjpAXC8jXD9dKykoPzpcOihbXjpAXC8jXD9dKykpPylAKT8oKFteOlwvI1w/XF1cW10rfFxbW15cL1xdQCM/XStcXSkoPzpcOihbMC05XSspKT8pKT8pPyk/KChcLz8oPzpbXlwvXD8jXStcLyspKikoW15cPyNdKikpKT8oXD9bXiNdKyk/KSgjLiopPy87CisgIHZhciBwYXJ0cyA9IHVybFBhcnNlUkUuZXhlYyh1cmkpOworCisgIHJldHVybiB7CisgICAgc2NoZW1lOiBwYXJ0c1s0XS5yZXBsYWNlKCc6JywnJyksCisgICAgaG9zdDogcGFydHNbMTFdLAorICAgIHBvcnQ6IHBhcnRzWzEyXSwKKyAgICBwYXRoOiBwYXJ0c1sxNV0KKyAgfTsKK307CisKK1N3YWdnZXJDbGllbnQucHJvdG90eXBlLmhlbHAgPSBmdW5jdGlvbiAoZG9udFByaW50KSB7CisgIHZhciBvdXRwdXQgPSAnJzsKKworICBpZiAodGhpcyBpbnN0YW5jZW9mIFN3YWdnZXJDbGllbnQpIHsKKyAgICBfLmZvckVhY2godGhpcy5hcGlzLCBmdW5jdGlvbiAoYXBpLCBuYW1lKSB7CisgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGFwaSkpIHsKKyAgICAgICAgb3V0cHV0ICs9ICdvcGVyYXRpb25zIGZvciB0aGUgXCcnICsgbmFtZSArICdcJyB0YWdcbic7CisKKyAgICAgICAgXy5mb3JFYWNoKGFwaS5vcGVyYXRpb25zLCBmdW5jdGlvbiAob3BlcmF0aW9uLCBuYW1lKSB7CisgICAgICAgICAgb3V0cHV0ICs9ICcgICogJyArIG5hbWUgKyAnOiAnICsgb3BlcmF0aW9uLnN1bW1hcnkgKyAnXG4nOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgT3BlcmF0aW9uR3JvdXAgfHwgXy5pc1BsYWluT2JqZWN0KHRoaXMpKSB7CisgICAgb3V0cHV0ICs9ICdvcGVyYXRpb25zIGZvciB0aGUgXCcnICsgdGhpcy5sYWJlbCArICdcJyB0YWdcbic7CisKKyAgICBfLmZvckVhY2godGhpcy5hcGlzLCBmdW5jdGlvbiAob3BlcmF0aW9uLCBuYW1lKSB7CisgICAgICBvdXRwdXQgKz0gJyAgKiAnICsgbmFtZSArICc6ICcgKyBvcGVyYXRpb24uc3VtbWFyeSArICdcbic7CisgICAgfSk7CisgIH0KKworICBpZiAoZG9udFByaW50KSB7CisgICAgcmV0dXJuIG91dHB1dDsKKyAgfSBlbHNlIHsKKyAgICBoZWxwZXJzLmxvZyhvdXRwdXQpOworCisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorfTsKKworU3dhZ2dlckNsaWVudC5wcm90b3R5cGUudGFnRnJvbUxhYmVsID0gZnVuY3Rpb24gKGxhYmVsKSB7CisgIHJldHVybiBsYWJlbDsKK307CisKK1N3YWdnZXJDbGllbnQucHJvdG90eXBlLmlkRnJvbU9wID0gZnVuY3Rpb24gKHBhdGgsIGh0dHBNZXRob2QsIG9wKSB7CisgIGlmKCFvcCB8fCAhb3Aub3BlcmF0aW9uSWQpIHsKKyAgICBvcCA9IG9wIHx8IHt9OworICAgIG9wLm9wZXJhdGlvbklkID0gaHR0cE1ldGhvZCArICdfJyArIHBhdGg7CisgIH0KKyAgdmFyIG9wSWQgPSBvcC5vcGVyYXRpb25JZC5yZXBsYWNlKC9bXHMhQCMkJV4mKigpXys9XFt7XF19Ozo8PnwuXC8/LFxcJyIiLV0vZywgJ18nKSB8fCAocGF0aC5zdWJzdHJpbmcoMSkgKyAnXycgKyBodHRwTWV0aG9kKTsKKworICBvcElkID0gb3BJZC5yZXBsYWNlKC8oKF8pezIsfSkvZywgJ18nKTsKKyAgb3BJZCA9IG9wSWQucmVwbGFjZSgvXihfKSovZywgJycpOworICBvcElkID0gb3BJZC5yZXBsYWNlKC8oW19dKSokL2csICcnKTsKKyAgcmV0dXJuIG9wSWQ7Cit9OworCitTd2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKyAgdGhpcy5mYWlsdXJlKG1lc3NhZ2UpOworCisgIHRocm93IG1lc3NhZ2U7Cit9OworCit9LHsiLi9hdXRoIjoyLCIuL2hlbHBlcnMiOjQsIi4vaHR0cCI6NSwiLi9yZXNvbHZlciI6NiwiLi9zcGVjLWNvbnZlcnRlciI6NywiLi90eXBlcy9tb2RlbCI6OCwiLi90eXBlcy9vcGVyYXRpb24iOjksIi4vdHlwZXMvb3BlcmF0aW9uR3JvdXAiOjEwLCJsb2Rhc2gtY29tcGF0L2FycmF5L2luZGV4T2YiOjE5LCJsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vZmluZCI6MjEsImxvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9mb3JFYWNoIjoyMiwibG9kYXNoLWNvbXBhdC9mdW5jdGlvbi9iaW5kIjoyNSwibG9kYXNoLWNvbXBhdC9sYW5nL2Nsb25lRGVlcCI6OTQsImxvZGFzaC1jb21wYXQvbGFuZy9pc0FycmF5Ijo5NiwibG9kYXNoLWNvbXBhdC9sYW5nL2lzRnVuY3Rpb24iOjk3LCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNQbGFpbk9iamVjdCI6MTAwLCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNVbmRlZmluZWQiOjEwM31dLDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworKGZ1bmN0aW9uIChwcm9jZXNzKXsKKyd1c2Ugc3RyaWN0JzsKKworbW9kdWxlLmV4cG9ydHMuX19iaW5kID0gZnVuY3Rpb24gKGZuLCBtZSkgeworICByZXR1cm4gZnVuY3Rpb24oKXsKKyAgICByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7CisgIH07Cit9OworCit2YXIgbG9nID0gbW9kdWxlLmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7CisgIGxvZy5oaXN0b3J5ID0gbG9nLmhpc3RvcnkgfHwgW107CisgIGxvZy5oaXN0b3J5LnB1c2goYXJndW1lbnRzKTsKKworICAvLyBPbmx5IGxvZyBpZiBhdmFpbGFibGUgYW5kIHdlJ3JlIG5vdCB0ZXN0aW5nCisgIGlmIChjb25zb2xlICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcpIHsKKyAgICBjb25zb2xlLmxvZyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpWzBdKTsKKyAgfQorfTsKKworbW9kdWxlLmV4cG9ydHMuZmFpbCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7CisgIGxvZyhtZXNzYWdlKTsKK307CisKK21vZHVsZS5leHBvcnRzLm9wdGlvbkh0bWwgPSBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7CisgIHJldHVybiAnPHRyPjx0ZCBjbGFzcz0ib3B0aW9uTmFtZSI+JyArIGxhYmVsICsgJzo8L3RkPjx0ZD4nICsgdmFsdWUgKyAnPC90ZD48L3RyPic7Cit9OworCittb2R1bGUuZXhwb3J0cy50eXBlRnJvbUpzb25TY2hlbWEgPSBmdW5jdGlvbiAodHlwZSwgZm9ybWF0KSB7CisgIHZhciBzdHI7CisKKyAgaWYgKHR5cGUgPT09ICdpbnRlZ2VyJyAmJiBmb3JtYXQgPT09ICdpbnQzMicpIHsKKyAgICBzdHIgPSAnaW50ZWdlcic7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludGVnZXInICYmIGZvcm1hdCA9PT0gJ2ludDY0JykgeworICAgIHN0ciA9ICdsb25nJzsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZWdlcicgJiYgdHlwZW9mIGZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICBzdHIgPSAnbG9uZyc7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgZm9ybWF0ID09PSAnZGF0ZS10aW1lJykgeworICAgIHN0ciA9ICdkYXRlLXRpbWUnOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIGZvcm1hdCA9PT0gJ2RhdGUnKSB7CisgICAgc3RyID0gJ2RhdGUnOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGZvcm1hdCA9PT0gJ2Zsb2F0JykgeworICAgIHN0ciA9ICdmbG9hdCc7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgZm9ybWF0ID09PSAnZG91YmxlJykgeworICAgIHN0ciA9ICdkb3VibGUnOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBmb3JtYXQgPT09ICd1bmRlZmluZWQnKSB7CisgICAgc3RyID0gJ2RvdWJsZSc7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgc3RyID0gJ2Jvb2xlYW4nOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgc3RyID0gJ3N0cmluZyc7CisgIH0KKworICByZXR1cm4gc3RyOworfTsKKwordmFyIHNpbXBsZVJlZiA9IG1vZHVsZS5leHBvcnRzLnNpbXBsZVJlZiA9IGZ1bmN0aW9uIChuYW1lKSB7CisgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGlmIChuYW1lLmluZGV4T2YoJyMvZGVmaW5pdGlvbnMvJykgPT09IDApIHsKKyAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoJyMvZGVmaW5pdGlvbnMvJy5sZW5ndGgpOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9OworCit2YXIgZ2V0U3RyaW5nU2lnbmF0dXJlID0gbW9kdWxlLmV4cG9ydHMuZ2V0U3RyaW5nU2lnbmF0dXJlID0gZnVuY3Rpb24gKG9iaiwgYmFzZUNvbXBvbmVudCkgeworICB2YXIgc3RyID0gJyc7CisKKyAgaWYgKHR5cGVvZiBvYmouJHJlZiAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICBzdHIgKz0gc2ltcGxlUmVmKG9iai4kcmVmKTsKKyAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7CisgICAgc3RyICs9ICdvYmplY3QnOworICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnYXJyYXknKSB7CisgICAgaWYgKGJhc2VDb21wb25lbnQpIHsKKyAgICAgIHN0ciArPSBnZXRTdHJpbmdTaWduYXR1cmUoKG9iai5pdGVtcyB8fCBvYmouJHJlZiB8fCB7fSkpOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gJ0FycmF5Wyc7CisgICAgICBzdHIgKz0gZ2V0U3RyaW5nU2lnbmF0dXJlKChvYmouaXRlbXMgfHwgb2JqLiRyZWYgfHwge30pKTsKKyAgICAgIHN0ciArPSAnXSc7CisgICAgfQorICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnaW50ZWdlcicgJiYgb2JqLmZvcm1hdCA9PT0gJ2ludDMyJykgeworICAgIHN0ciArPSAnaW50ZWdlcic7CisgIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdpbnRlZ2VyJyAmJiBvYmouZm9ybWF0ID09PSAnaW50NjQnKSB7CisgICAgc3RyICs9ICdsb25nJzsKKyAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ2ludGVnZXInICYmIHR5cGVvZiBvYmouZm9ybWF0ID09PSAndW5kZWZpbmVkJykgeworICAgIHN0ciArPSAnbG9uZyc7CisgIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdzdHJpbmcnICYmIG9iai5mb3JtYXQgPT09ICdkYXRlLXRpbWUnKSB7CisgICAgc3RyICs9ICdkYXRlLXRpbWUnOworICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnc3RyaW5nJyAmJiBvYmouZm9ybWF0ID09PSAnZGF0ZScpIHsKKyAgICBzdHIgKz0gJ2RhdGUnOworICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb2JqLmZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICBzdHIgKz0gJ3N0cmluZyc7CisgIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdudW1iZXInICYmIG9iai5mb3JtYXQgPT09ICdmbG9hdCcpIHsKKyAgICBzdHIgKz0gJ2Zsb2F0JzsKKyAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ251bWJlcicgJiYgb2JqLmZvcm1hdCA9PT0gJ2RvdWJsZScpIHsKKyAgICBzdHIgKz0gJ2RvdWJsZSc7CisgIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBvYmouZm9ybWF0ID09PSAndW5kZWZpbmVkJykgeworICAgIHN0ciArPSAnZG91YmxlJzsKKyAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgc3RyICs9ICdib29sZWFuJzsKKyAgfSBlbHNlIGlmIChvYmouJHJlZikgeworICAgIHN0ciArPSBzaW1wbGVSZWYob2JqLiRyZWYpOworICB9IGVsc2UgeworICAgIHN0ciArPSBvYmoudHlwZTsKKyAgfQorCisgIHJldHVybiBzdHI7Cit9OworCit9KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSkKKworfSx7Il9wcm9jZXNzIjoxNX1dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworCit2YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpOwordmFyIGpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpOwordmFyIHJlcXVlc3QgPSByZXF1aXJlKCdzdXBlcmFnZW50Jyk7CisKKy8qCisgKiBKUXVlcnlIdHRwQ2xpZW50IGlzIGEgbGlnaHQtd2VpZ2h0LCBub2RlIG9yIGJyb3dzZXIgSFRUUCBjbGllbnQKKyAqLwordmFyIEpRdWVyeUh0dHBDbGllbnQgPSBmdW5jdGlvbiAoKSB7fTsKKworLyoKKyAqIFN1cGVyYWdlbnRIdHRwQ2xpZW50IGlzIGEgbGlnaHQtd2VpZ2h0LCBub2RlIG9yIGJyb3dzZXIgSFRUUCBjbGllbnQKKyAqLwordmFyIFN1cGVyYWdlbnRIdHRwQ2xpZW50ID0gZnVuY3Rpb24gKCkge307CisKKy8qKgorICogU3dhZ2dlckh0dHAgaXMgYSB3cmFwcGVyIGZvciBleGVjdXRpbmcgcmVxdWVzdHMKKyAqLwordmFyIFN3YWdnZXJIdHRwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7fTsKKworU3dhZ2dlckh0dHAucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAob2JqLCBvcHRzKSB7CisgIGlmIChvYmogJiYgKHR5cGVvZiBvYmoudXNlSlF1ZXJ5ID09PSAnYm9vbGVhbicpKSB7CisgICAgdGhpcy51c2VKUXVlcnkgPSBvYmoudXNlSlF1ZXJ5OworICB9IGVsc2UgeworICAgIHRoaXMudXNlSlF1ZXJ5ID0gdGhpcy5pc0lFOCgpOworICB9CisKKyAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqLmJvZHkgPT09ICdvYmplY3QnKSB7CisgICAgLy8gc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBmaWxlIHVwbG9hZHMgdmlhIGpxdWVyeQorICAgIGlmIChvYmouYm9keS50eXBlICYmIG9iai5ib2R5LnR5cGUgPT09ICdmb3JtRGF0YScpeworICAgICAgb2JqLmNvbnRlbnRUeXBlID0gZmFsc2U7CisgICAgICBvYmoucHJvY2Vzc0RhdGEgPSBmYWxzZTsKKworICAgICAgZGVsZXRlIG9iai5oZWFkZXJzWydDb250ZW50LVR5cGUnXTsKKyAgICB9IGVsc2UgeworICAgICAgb2JqLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvYmouYm9keSk7CisgICAgfQorICB9CisKKyAgaWYgKHRoaXMudXNlSlF1ZXJ5KSB7CisgICAgcmV0dXJuIG5ldyBKUXVlcnlIdHRwQ2xpZW50KG9wdHMpLmV4ZWN1dGUob2JqKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IFN1cGVyYWdlbnRIdHRwQ2xpZW50KG9wdHMpLmV4ZWN1dGUob2JqKTsKKyAgfQorfTsKKworU3dhZ2dlckh0dHAucHJvdG90eXBlLmlzSUU4ID0gZnVuY3Rpb24gKCkgeworICB2YXIgZGV0ZWN0ZWRJRSA9IGZhbHNlOworCisgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50KSB7CisgICAgdmFyIG5hdiA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKKworICAgIGlmIChuYXYuaW5kZXhPZignbXNpZScpICE9PSAtMSkgeworICAgICAgdmFyIHZlcnNpb24gPSBwYXJzZUludChuYXYuc3BsaXQoJ21zaWUnKVsxXSk7CisKKyAgICAgIGlmICh2ZXJzaW9uIDw9IDgpIHsKKyAgICAgICAgZGV0ZWN0ZWRJRSA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGRldGVjdGVkSUU7Cit9OworCitKUXVlcnlIdHRwQ2xpZW50LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKG9iaikgeworICB2YXIgY2IgPSBvYmoub247CisgIHZhciByZXF1ZXN0ID0gb2JqOworCisgIG9iai50eXBlID0gb2JqLm1ldGhvZDsKKyAgb2JqLmNhY2hlID0gZmFsc2U7CisgIGRlbGV0ZSBvYmoudXNlSlF1ZXJ5OworCisgIC8qCisgIG9iai5iZWZvcmVTZW5kID0gZnVuY3Rpb24gKHhocikgeworICAgIHZhciBrZXksIHJlc3VsdHM7CisgICAgaWYgKG9iai5oZWFkZXJzKSB7CisgICAgICByZXN1bHRzID0gW107CisgICAgICBmb3IgKGtleSBpbiBvYmouaGVhZGVycykgeworICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKSB7CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG9iai5jb250ZW50VHlwZSA9IG9iai5oZWFkZXJzW2tleV0pOworICAgICAgICB9IGVsc2UgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnYWNjZXB0JykgeworICAgICAgICAgIHJlc3VsdHMucHVzaChvYmouYWNjZXB0cyA9IG9iai5oZWFkZXJzW2tleV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdHMucHVzaCh4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIG9iai5oZWFkZXJzW2tleV0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorICB9OyovCisKKyAgb2JqLmRhdGEgPSBvYmouYm9keTsKKworICBkZWxldGUgb2JqLmJvZHk7CisKKyAgb2JqLmNvbXBsZXRlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7CisgICAgdmFyIGhlYWRlcnMgPSB7fTsKKyAgICB2YXIgaGVhZGVyQXJyYXkgPSByZXNwb25zZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgnXG4nKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVyQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciB0b1NwbGl0ID0gaGVhZGVyQXJyYXlbaV0udHJpbSgpOworCisgICAgICBpZiAodG9TcGxpdC5sZW5ndGggPT09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHZhciBzZXBhcmF0b3IgPSB0b1NwbGl0LmluZGV4T2YoJzonKTsKKworICAgICAgaWYgKHNlcGFyYXRvciA9PT0gLTEpIHsKKyAgICAgICAgLy8gTmFtZSBidXQgbm8gdmFsdWUgaW4gdGhlIGhlYWRlcgorICAgICAgICBoZWFkZXJzW3RvU3BsaXRdID0gbnVsbDsKKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgdmFyIG5hbWUgPSB0b1NwbGl0LnN1YnN0cmluZygwLCBzZXBhcmF0b3IpLnRyaW0oKTsKKyAgICAgIHZhciB2YWx1ZSA9IHRvU3BsaXQuc3Vic3RyaW5nKHNlcGFyYXRvciArIDEpLnRyaW0oKTsKKworICAgICAgaGVhZGVyc1tuYW1lXSA9IHZhbHVlOworICAgIH0KKworICAgIHZhciBvdXQgPSB7CisgICAgICB1cmw6IHJlcXVlc3QudXJsLAorICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCwKKyAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLAorICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKKyAgICAgIGRhdGE6IHJlc3BvbnNlLnJlc3BvbnNlVGV4dCwKKyAgICAgIGhlYWRlcnM6IGhlYWRlcnMKKyAgICB9OworCisgICAgdmFyIGNvbnRlbnRUeXBlID0gKGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIHx8IGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddIHx8IG51bGwpOworCisgICAgaWYgKGNvbnRlbnRUeXBlKSB7CisgICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID09PSAwIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJytqc29uJykgPiAwKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgb3V0Lm9iaiA9IHJlc3BvbnNlLnJlc3BvbnNlSlNPTiB8fCBKU09OLnBhcnNlKG91dC5kYXRhKSB8fCB7fTsKKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgICAvLyBkbyBub3Qgc2V0IG91dC5vYmoKKyAgICAgICAgICBoZWxwZXJzLmxvZygndW5hYmxlIHRvIHBhcnNlIEpTT04gY29udGVudCcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7CisgICAgICBjYi5yZXNwb25zZShvdXQpOworICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAwIHx8IChyZXNwb25zZS5zdGF0dXMgPj0gNDAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDU5OSkpIHsKKyAgICAgIGNiLmVycm9yKG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjYi5yZXNwb25zZShvdXQpOworICAgIH0KKyAgfTsKKworICBqUXVlcnkuc3VwcG9ydC5jb3JzID0gdHJ1ZTsKKworICByZXR1cm4galF1ZXJ5LmFqYXgob2JqKTsKK307CisKK1N1cGVyYWdlbnRIdHRwQ2xpZW50LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKG9iaikgeworICB2YXIgbWV0aG9kID0gb2JqLm1ldGhvZC50b0xvd2VyQ2FzZSgpOworCisgIGlmIChtZXRob2QgPT09ICdkZWxldGUnKSB7CisgICAgbWV0aG9kID0gJ2RlbCc7CisgIH0KKworICB2YXIgaGVhZGVycyA9IG9iai5oZWFkZXJzIHx8IHt9OworICB2YXIgciA9IHJlcXVlc3RbbWV0aG9kXShvYmoudXJsKTsKKyAgdmFyIG5hbWU7CisKKyAgZm9yIChuYW1lIGluIGhlYWRlcnMpIHsKKyAgICByLnNldChuYW1lLCBoZWFkZXJzW25hbWVdKTsKKyAgfQorCisgIGlmIChvYmouYm9keSkgeworICAgIHIuc2VuZChvYmouYm9keSk7CisgIH0KKworICByLmVuZChmdW5jdGlvbiAoZXJyLCByZXMpIHsKKyAgICByZXMgPSByZXMgfHwgeworICAgICAgc3RhdHVzOiAwLAorICAgICAgaGVhZGVyczoge2Vycm9yOiAnbm8gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInfQorICAgIH07CisgICAgdmFyIHJlc3BvbnNlID0geworICAgICAgdXJsOiBvYmoudXJsLAorICAgICAgbWV0aG9kOiBvYmoubWV0aG9kLAorICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMKKyAgICB9OworICAgIHZhciBjYjsKKworICAgIGlmICghZXJyICYmIHJlcy5lcnJvcikgeworICAgICAgZXJyID0gcmVzLmVycm9yOworICAgIH0KKworICAgIGlmIChlcnIgJiYgb2JqLm9uICYmIG9iai5vbi5lcnJvcikgeworICAgICAgcmVzcG9uc2Uub2JqID0gZXJyOworICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gcmVzID8gcmVzLnN0YXR1cyA6IDUwMDsKKyAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPSByZXMgPyByZXMudGV4dCA6IGVyci5tZXNzYWdlOworICAgICAgY2IgPSBvYmoub24uZXJyb3I7CisgICAgfSBlbHNlIGlmIChyZXMgJiYgb2JqLm9uICYmIG9iai5vbi5yZXNwb25zZSkgeworICAgICAgcmVzcG9uc2Uub2JqID0gKHR5cGVvZiByZXMuYm9keSAhPT0gJ3VuZGVmaW5lZCcpID8gcmVzLmJvZHkgOiByZXMudGV4dDsKKyAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IHJlcy5zdGF0dXM7CisgICAgICByZXNwb25zZS5zdGF0dXNUZXh0ID0gcmVzLnRleHQ7CisgICAgICBjYiA9IG9iai5vbi5yZXNwb25zZTsKKyAgICB9CisgICAgcmVzcG9uc2UuZGF0YSA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7CisKKyAgICBpZiAoY2IpIHsKKyAgICAgIGNiKHJlc3BvbnNlKTsKKyAgICB9CisgIH0pOworfTsKKworfSx7Ii4vaGVscGVycyI6NCwianF1ZXJ5IjoxOCwic3VwZXJhZ2VudCI6MTExfV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmljdCc7CisKK3ZhciBTd2FnZ2VySHR0cCA9IHJlcXVpcmUoJy4vaHR0cCcpOworCisvKiogCisgKiBSZXNvbHZlcyBhIHNwZWMncyByZW1vdGUgcmVmZXJlbmNlcworICovCit2YXIgUmVzb2x2ZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHt9OworCitSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uIChzcGVjLCBjYWxsYmFjaywgc2NvcGUpIHsKKyAgdGhpcy5zY29wZSA9IChzY29wZSB8fCB0aGlzKTsKKworICB2YXIgaG9zdCwgbmFtZSwgcGF0aCwgcHJvcGVydHksIHByb3BlcnR5TmFtZTsKKyAgdmFyIHByb2Nlc3NlZENhbGxzID0gMCwgcmVzb2x2ZWRSZWZzID0ge30sIHVucmVzb2x2ZWRSZWZzID0ge307CisgIHZhciByZXNvbHV0aW9uVGFibGUgPSB7fTsgLy8gc3RvcmUgb2JqZWN0cyBmb3IgZGVyZWZlcmVuY2luZworCisgIC8vIG1vZGVscworICBmb3IgKG5hbWUgaW4gc3BlYy5kZWZpbml0aW9ucykgeworICAgIHZhciBtb2RlbCA9IHNwZWMuZGVmaW5pdGlvbnNbbmFtZV07CisKKyAgICBmb3IgKHByb3BlcnR5TmFtZSBpbiBtb2RlbC5wcm9wZXJ0aWVzKSB7CisgICAgICBwcm9wZXJ0eSA9IG1vZGVsLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTsKKworICAgICAgdGhpcy5yZXNvbHZlVG8ocHJvcGVydHksIHJlc29sdXRpb25UYWJsZSk7CisgICAgfQorICB9CisKKyAgLy8gb3BlcmF0aW9ucworICBmb3IgKG5hbWUgaW4gc3BlYy5wYXRocykgeworICAgIHZhciBtZXRob2QsIG9wZXJhdGlvbiwgcmVzcG9uc2VDb2RlOworCisgICAgcGF0aCA9IHNwZWMucGF0aHNbbmFtZV07CisKKyAgICBmb3IgKG1ldGhvZCBpbiBwYXRoKSB7CisgICAgICBpZihtZXRob2QgPT09ICckcmVmJykgeworICAgICAgICB0aGlzLnJlc29sdmVJbmxpbmUoc3BlYywgcGF0aCwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgb3BlcmF0aW9uID0gcGF0aFttZXRob2RdOworCisgICAgICAgIHZhciBpLCBwYXJhbWV0ZXJzID0gb3BlcmF0aW9uLnBhcmFtZXRlcnM7CisKKyAgICAgICAgZm9yIChpIGluIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICB2YXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKKworICAgICAgICAgIGlmIChwYXJhbWV0ZXIuaW4gPT09ICdib2R5JyAmJiBwYXJhbWV0ZXIuc2NoZW1hKSB7CisgICAgICAgICAgICB0aGlzLnJlc29sdmVUbyhwYXJhbWV0ZXIuc2NoZW1hLCByZXNvbHV0aW9uVGFibGUpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwYXJhbWV0ZXIuJHJlZikgeworICAgICAgICAgICAgdGhpcy5yZXNvbHZlSW5saW5lKHNwZWMsIHBhcmFtZXRlciwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChyZXNwb25zZUNvZGUgaW4gb3BlcmF0aW9uLnJlc3BvbnNlcykgeworICAgICAgICAgIHZhciByZXNwb25zZSA9IG9wZXJhdGlvbi5yZXNwb25zZXNbcmVzcG9uc2VDb2RlXTsKKyAgICAgICAgICBpZih0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnKSB7CisgICAgICAgICAgICBpZihyZXNwb25zZS4kcmVmKSB7CisgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUlubGluZShzcGVjLCByZXNwb25zZSwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyZXNwb25zZS5zY2hlbWEpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvKHJlc3BvbnNlLnNjaGVtYSwgcmVzb2x1dGlvblRhYmxlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBnZXQgaG9zdHMKKyAgdmFyIG9wdHMgPSB7fSwgZXhwZWN0ZWRDYWxscyA9IDA7CisKKyAgZm9yIChuYW1lIGluIHJlc29sdXRpb25UYWJsZSkgeworICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJyMnKTsKKworICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHsKKyAgICAgIGhvc3QgPSBwYXJ0c1swXTsgcGF0aCA9IHBhcnRzWzFdOworCisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3B0c1tob3N0XSkpIHsKKyAgICAgICAgb3B0c1tob3N0XSA9IFtdOworICAgICAgICBleHBlY3RlZENhbGxzICs9IDE7CisgICAgICB9CisKKyAgICAgIG9wdHNbaG9zdF0ucHVzaChwYXRoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3B0c1tuYW1lXSkpIHsKKyAgICAgICAgb3B0c1tuYW1lXSA9IFtdOworICAgICAgICBleHBlY3RlZENhbGxzICs9IDE7CisgICAgICB9CisKKyAgICAgIG9wdHNbbmFtZV0ucHVzaChudWxsKTsKKyAgICB9CisgIH0KKworICBmb3IgKG5hbWUgaW4gb3B0cykgeworICAgIHZhciBzZWxmID0gdGhpcywgb3B0ID0gb3B0c1tuYW1lXTsKKworICAgIGhvc3QgPSBuYW1lOworCisgICAgdmFyIG9iaiA9IHsKKyAgICAgIHVzZUpRdWVyeTogZmFsc2UsICAvLyBUT0RPCisgICAgICB1cmw6IGhvc3QsCisgICAgICBtZXRob2Q6ICdnZXQnLAorICAgICAgaGVhZGVyczogeworICAgICAgICBhY2NlcHQ6IHRoaXMuc2NvcGUuc3dhZ2dlclJlcXVlc3RIZWFkZXJzIHx8ICdhcHBsaWNhdGlvbi9qc29uJworICAgICAgfSwKKyAgICAgIG9uOiB7CisgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgcHJvY2Vzc2VkQ2FsbHMgKz0gMTsKKworICAgICAgICAgIHZhciBpOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gZmFpbCBhbGwgb2YgdGhlc2UKKyAgICAgICAgICAgIHZhciByZXNvbHZlZCA9IGhvc3QgKyAnIycgKyBvcHRbaV07CisKKyAgICAgICAgICAgIHVucmVzb2x2ZWRSZWZzW3Jlc29sdmVkXSA9IG51bGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHByb2Nlc3NlZENhbGxzID09PSBleHBlY3RlZENhbGxzKSB7CisgICAgICAgICAgICBzZWxmLmZpbmlzaChzcGVjLCByZXNvbHV0aW9uVGFibGUsIHJlc29sdmVkUmVmcywgdW5yZXNvbHZlZFJlZnMsIGNhbGxiYWNrKTsKKyAgICAgICAgICB9CisgICAgICAgIH0sICAvLyBqc2hpbnQgaWdub3JlOmxpbmUKKyAgICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uIChyZXNwb25zZSkgeworCisgICAgICAgICAgdmFyIGksIGosIHN3YWdnZXIgPSByZXNwb25zZS5vYmo7CisKKyAgICAgICAgICBpZihzd2FnZ2VyID09PSBudWxsIHx8IE9iamVjdC5rZXlzKHN3YWdnZXIpLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgc3dhZ2dlciA9IEpTT04ucGFyc2UocmVzcG9uc2UuZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoZSl7CisgICAgICAgICAgICAgIHN3YWdnZXIgPSB7fTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcm9jZXNzZWRDYWxscyArPSAxOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmFyIHBhdGggPSBvcHRbaV07CisgICAgICAgICAgICBpZihwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgcmVzb2x2ZWRSZWZzW25hbWVdID0geworICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgICAgb2JqOiBzd2FnZ2VyCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gc3dhZ2dlciwgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7CisgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIHZhciBzZWdtZW50ID0gcGFydHNbal07CisgICAgICAgICAgICAgICAgaWYoc2VnbWVudC5pbmRleE9mKCd+MScpICE9PSAtMSkgeworICAgICAgICAgICAgICAgICAgc2VnbWVudCA9IHBhcnRzW2pdLnJlcGxhY2UoL34wL2csICd+JykucmVwbGFjZSgvfjEvZywgJy8nKTsKKyAgICAgICAgICAgICAgICAgIGlmKHNlZ21lbnQuY2hhckF0KDApICE9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VnbWVudCA9ICcvJyArIHNlZ21lbnQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb25bc2VnbWVudF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHZhciByZXNvbHZlZCA9IGhvc3QgKyAnIycgKyBwYXRoLCByZXNvbHZlZE5hbWUgPSBwYXJ0c1tqLTFdOworCisgICAgICAgICAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZWRSZWZzW3Jlc29sdmVkXSA9IHsKKyAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc29sdmVkTmFtZSwKKyAgICAgICAgICAgICAgICAgIG9iajogbG9jYXRpb24KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRSZWZzW3Jlc29sdmVkXSA9IG51bGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHByb2Nlc3NlZENhbGxzID09PSBleHBlY3RlZENhbGxzKSB7CisgICAgICAgICAgICBzZWxmLmZpbmlzaChzcGVjLCByZXNvbHV0aW9uVGFibGUsIHJlc29sdmVkUmVmcywgdW5yZXNvbHZlZFJlZnMsIGNhbGxiYWNrKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gLy8ganNoaW50IGlnbm9yZTpsaW5lCisgICAgfTsKKworICAgIGlmIChzY29wZSAmJiBzY29wZS5jbGllbnRBdXRob3JpemF0aW9ucykgeworICAgICAgc2NvcGUuY2xpZW50QXV0aG9yaXphdGlvbnMuYXBwbHkob2JqKTsKKyAgICB9CisKKyAgICBuZXcgU3dhZ2dlckh0dHAoKS5leGVjdXRlKG9iaik7CisgIH0KKworICBpZiAoT2JqZWN0LmtleXMob3B0cykubGVuZ3RoID09PSAwKSB7CisgICAgY2FsbGJhY2suY2FsbCh0aGlzLnNjb3BlLCBzcGVjLCB1bnJlc29sdmVkUmVmcyk7CisgIH0KK307CisKK1Jlc29sdmVyLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoc3BlYywgcmVzb2x1dGlvblRhYmxlLCByZXNvbHZlZFJlZnMsIHVucmVzb2x2ZWRSZWZzLCBjYWxsYmFjaykgeworICAvLyB3YWxrIHJlc29sdXRpb24gdGFibGUgYW5kIHJlcGxhY2Ugd2l0aCByZXNvbHZlZCByZWZzCisgIHZhciByZWY7CisKKyAgZm9yIChyZWYgaW4gcmVzb2x1dGlvblRhYmxlKSB7CisgICAgdmFyIGksIGxvY2F0aW9ucyA9IHJlc29sdXRpb25UYWJsZVtyZWZdOworCisgICAgZm9yIChpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIHJlc29sdmVkVG8gPSByZXNvbHZlZFJlZnNbbG9jYXRpb25zW2ldLm9iai4kcmVmXTsKKworICAgICAgaWYgKHJlc29sdmVkVG8pIHsKKyAgICAgICAgaWYgKCFzcGVjLmRlZmluaXRpb25zKSB7CisgICAgICAgICAgc3BlYy5kZWZpbml0aW9ucyA9IHt9OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2F0aW9uc1tpXS5yZXNvbHZlQXMgPT09ICckcmVmJykgeworICAgICAgICAgIHNwZWMuZGVmaW5pdGlvbnNbcmVzb2x2ZWRUby5uYW1lXSA9IHJlc29sdmVkVG8ub2JqOworICAgICAgICAgIGxvY2F0aW9uc1tpXS5vYmouJHJlZiA9ICcjL2RlZmluaXRpb25zLycgKyByZXNvbHZlZFRvLm5hbWU7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb25zW2ldLnJlc29sdmVBcyA9PT0gJ2lubGluZScpIHsKKyAgICAgICAgICB2YXIgdGFyZ2V0T2JqID0gbG9jYXRpb25zW2ldLm9iajsKKyAgICAgICAgICB2YXIga2V5OworCisgICAgICAgICAgZGVsZXRlIHRhcmdldE9iai4kcmVmOworCisgICAgICAgICAgZm9yIChrZXkgaW4gcmVzb2x2ZWRUby5vYmopIHsKKyAgICAgICAgICAgIHRhcmdldE9ialtrZXldID0gcmVzb2x2ZWRUby5vYmpba2V5XTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjYWxsYmFjay5jYWxsKHRoaXMuc2NvcGUsIHNwZWMsIHVucmVzb2x2ZWRSZWZzKTsKK307CisKKy8qKgorICogaW1tZWRpYXRlbHkgaW4tbGluZXMgbG9jYWwgcmVmcywgcXVldWVzIHJlbW90ZSByZWZzCisgKiBmb3IgaW5saW5lIHJlc29sdXRpb24KKyAqLworUmVzb2x2ZXIucHJvdG90eXBlLnJlc29sdmVJbmxpbmUgPSBmdW5jdGlvbiAoc3BlYywgcHJvcGVydHksIG9ianMsIHVucmVzb2x2ZWRSZWZzKSB7CisgIHZhciByZWYgPSBwcm9wZXJ0eS4kcmVmOworCisgIGlmIChyZWYpIHsKKyAgICBpZiAocmVmLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCkgeworICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2Jqc1tyZWZdKSkgeworICAgICAgICBvYmpzW3JlZl0ucHVzaCh7b2JqOiBwcm9wZXJ0eSwgcmVzb2x2ZUFzOiAnaW5saW5lJ30pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2Jqc1tyZWZdID0gW3tvYmo6IHByb3BlcnR5LCByZXNvbHZlQXM6ICdpbmxpbmUnfV07CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZWYuaW5kZXhPZignIycpID09PSAwKSB7CisgICAgICAvLyBsb2NhbCByZXNvbHZlCisgICAgICB2YXIgc2hvcnRlbmVkUmVmID0gcmVmLnN1YnN0cmluZygxKTsKKyAgICAgIHZhciBpLCBwYXJ0cyA9IHNob3J0ZW5lZFJlZi5zcGxpdCgnLycpLCBsb2NhdGlvbiA9IHNwZWM7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOworCisgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uW3BhcnRdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChsb2NhdGlvbikgeworICAgICAgICBkZWxldGUgcHJvcGVydHkuJHJlZjsKKworICAgICAgICB2YXIga2V5OworCisgICAgICAgIGZvciAoa2V5IGluIGxvY2F0aW9uKSB7CisgICAgICAgICAgcHJvcGVydHlba2V5XSA9IGxvY2F0aW9uW2tleV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVucmVzb2x2ZWRSZWZzW3JlZl0gPSBudWxsOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChwcm9wZXJ0eS50eXBlID09PSAnYXJyYXknKSB7CisgICAgdGhpcy5yZXNvbHZlVG8ocHJvcGVydHkuaXRlbXMsIG9ianMpOworICB9Cit9OworCitSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZVRvID0gZnVuY3Rpb24gKHByb3BlcnR5LCBvYmpzKSB7CisgIHZhciByZWYgPSBwcm9wZXJ0eS4kcmVmOworCisgIGlmIChyZWYpIHsKKyAgICBpZiAocmVmLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCkgeworICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2Jqc1tyZWZdKSkgeworICAgICAgICBvYmpzW3JlZl0ucHVzaCh7b2JqOiBwcm9wZXJ0eSwgcmVzb2x2ZUFzOiAnJHJlZid9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9ianNbcmVmXSA9IFt7b2JqOiBwcm9wZXJ0eSwgcmVzb2x2ZUFzOiAnJHJlZid9XTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAocHJvcGVydHkudHlwZSA9PT0gJ2FycmF5JykgeworICAgIHZhciBpdGVtcyA9IHByb3BlcnR5Lml0ZW1zOworCisgICAgdGhpcy5yZXNvbHZlVG8oaXRlbXMsIG9ianMpOworICB9Cit9OworCit9LHsiLi9odHRwIjo1fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisndXNlIHN0cmljdCc7CisKK3ZhciBTd2FnZ2VyQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKTsKK3ZhciBTd2FnZ2VySHR0cCA9IHJlcXVpcmUoJy4vaHR0cCcpOworCit2YXIgU3dhZ2dlclNwZWNDb252ZXJ0ZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5lcnJvcnMgPSBbXTsKKyAgdGhpcy53YXJuaW5ncyA9IFtdOworICB0aGlzLm1vZGVsTWFwID0ge307Cit9OworCitTd2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuc2V0RG9jdW1lbnRhdGlvbkxvY2F0aW9uID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7CisgIHRoaXMuZG9jTG9jYXRpb24gPSBsb2NhdGlvbjsKK307CisKKy8qKgorICogY29udmVydHMgYSByZXNvdXJjZSBsaXN0aW5nIE9SIGFwaSBkZWNsYXJhdGlvbgorICoqLworU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLmNvbnZlcnQgPSBmdW5jdGlvbiAob2JqLCBjYWxsYmFjaykgeworICAvLyBub3QgYSB2YWxpZCBzcGVjCisgIGlmKCFvYmogfHwgIUFycmF5LmlzQXJyYXkob2JqLmFwaXMpKSB7CisgICAgcmV0dXJuIHRoaXMuZmluaXNoKGNhbGxiYWNrLCBudWxsKTsKKyAgfQorCisgIC8vIGNyZWF0ZSBhIG5ldyBzd2FnZ2VyIG9iamVjdCB0byByZXR1cm4KKyAgdmFyIHN3YWdnZXIgPSB7IHN3YWdnZXI6ICcyLjAnIH07CisKKyAgc3dhZ2dlci5vcmlnaW5hbFZlcnNpb24gPSBvYmouc3dhZ2dlclZlcnNpb247CisKKyAgLy8gYWRkIHRoZSBpbmZvCisgIHRoaXMuYXBpSW5mbyhvYmosIHN3YWdnZXIpOworCisgIC8vIGFkZCBzZWN1cml0eSBkZWZpbml0aW9ucworICB0aGlzLnNlY3VyaXR5RGVmaW5pdGlvbnMob2JqLCBzd2FnZ2VyKTsKKworICAvLyBzZWUgaWYgdGhpcyBpcyBhIHNpbmdsZS1maWxlIHN3YWdnZXIgZGVmaW5pdGlvbgorICB2YXIgaXNTaW5nbGVGaWxlU3dhZ2dlciA9IGZhbHNlOworICB2YXIgaTsKKyAgZm9yKGkgPSAwOyBpIDwgb2JqLmFwaXMubGVuZ3RoOyBpKyspIHsKKyAgICB2YXIgYXBpID0gb2JqLmFwaXNbaV07CisgICAgaWYoQXJyYXkuaXNBcnJheShhcGkub3BlcmF0aW9ucykpIHsKKyAgICAgIGlzU2luZ2xlRmlsZVN3YWdnZXIgPSB0cnVlOworICAgIH0KKyAgfQorICBpZihpc1NpbmdsZUZpbGVTd2FnZ2VyKSB7CisgICAgdGhpcy5kZWNsYXJhdGlvbihvYmosIHN3YWdnZXIpOworICAgIHRoaXMuZmluaXNoKGNhbGxiYWNrLCBzd2FnZ2VyKTsKKyAgfQorICBlbHNlIHsKKyAgICB0aGlzLnJlc291cmNlTGlzdGluZyhvYmosIHN3YWdnZXIsIGNhbGxiYWNrKTsKKyAgfQorfTsKKworU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLmRlY2xhcmF0aW9uID0gZnVuY3Rpb24ob2JqLCBzd2FnZ2VyKSB7CisgIHZhciBuYW1lLCBpOworICBpZighb2JqLmFwaXMpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YXIgYmFzZVBhdGggPSBvYmouYmFzZVBhdGg7CisgIGlmKG9iai5iYXNlUGF0aC5pbmRleE9mKCdodHRwOi8vJykgPT09IDApIHsKKyAgICB2YXIgcCA9IG9iai5iYXNlUGF0aC5zdWJzdHJpbmcoJ2h0dHA6Ly8nLmxlbmd0aCk7CisgICAgdmFyIHBvcyA9IHAuaW5kZXhPZignLycpOworICAgIGlmKHBvcyA+IDApIHsKKyAgICAgIHN3YWdnZXIuaG9zdCA9IHAuc3Vic3RyaW5nKDAsIHBvcyk7CisgICAgICBzd2FnZ2VyLmJhc2VQYXRoID0gcC5zdWJzdHJpbmcocG9zKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgIHN3YWdnZXIuaG9zdCA9IHA7CisgICAgICBzd2FnZ2VyLmJhc2VQYXRoID0gJy8nOworICAgIH0KKyAgfQorICB2YXIgcmVzb3VyY2VMZXZlbEF1dGg7CisgIGlmKG9iai5hdXRob3JpemF0aW9ucykgeworICAgIHJlc291cmNlTGV2ZWxBdXRoID0gb2JqLmF1dGhvcml6YXRpb25zOworICB9CisgIGlmKG9iai5jb25zdW1lcykgeworICAgIHN3YWdnZXIuY29uc3VtZXMgPSBvYmouY29uc3VtZXM7CisgIH0KKyAgaWYob2JqLnByb2R1Y2VzKSB7CisgICAgc3dhZ2dlci5wcm9kdWNlcyA9IG9iai5wcm9kdWNlczsKKyAgfQorCisgIC8vIGJ1aWxkIGEgbWFwcGluZyBvZiBpZCB0byBuYW1lIGZvciAxLjAgbW9kZWwgcmVzb2x1dGlvbnMKKyAgaWYodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHsKKyAgICBmb3IobmFtZSBpbiBvYmoubW9kZWxzKSB7CisgICAgICB2YXIgZXhpc3RpbmdNb2RlbCA9IG9iai5tb2RlbHNbbmFtZV07CisgICAgICB2YXIga2V5ID0gKGV4aXN0aW5nTW9kZWwuaWQgfHwgbmFtZSk7CisgICAgICB0aGlzLm1vZGVsTWFwW2tleV0gPSBuYW1lOworICAgIH0KKyAgfQorCisgIGZvcihpID0gMDsgaSA8IG9iai5hcGlzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIGFwaSA9IG9iai5hcGlzW2ldOworICAgIHZhciBwYXRoID0gYXBpLnBhdGg7CisgICAgdmFyIG9wZXJhdGlvbnMgPSBhcGkub3BlcmF0aW9uczsKKyAgICB0aGlzLm9wZXJhdGlvbnMocGF0aCwgb2JqLnJlc291cmNlUGF0aCwgb3BlcmF0aW9ucywgcmVzb3VyY2VMZXZlbEF1dGgsIHN3YWdnZXIpOworICB9CisKKyAgdmFyIG1vZGVscyA9IG9iai5tb2RlbHM7CisgIHRoaXMubW9kZWxzKG1vZGVscywgc3dhZ2dlcik7Cit9OworCitTd2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUubW9kZWxzID0gZnVuY3Rpb24ob2JqLCBzd2FnZ2VyKSB7CisgIGlmKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhciBuYW1lOworCisgIHN3YWdnZXIuZGVmaW5pdGlvbnMgPSBzd2FnZ2VyLmRlZmluaXRpb25zIHx8IHt9OworICBmb3IobmFtZSBpbiBvYmopIHsKKyAgICB2YXIgZXhpc3RpbmdNb2RlbCA9IG9ialtuYW1lXTsKKyAgICB2YXIgX2VudW0gPSBbXTsKKyAgICB2YXIgc2NoZW1hID0geyBwcm9wZXJ0aWVzOiB7fX07CisgICAgdmFyIHByb3BlcnR5TmFtZTsKKyAgICBmb3IocHJvcGVydHlOYW1lIGluIGV4aXN0aW5nTW9kZWwucHJvcGVydGllcykgeworICAgICAgdmFyIGV4aXN0aW5nUHJvcGVydHkgPSBleGlzdGluZ01vZGVsLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTsKKyAgICAgIHZhciBwcm9wZXJ0eSA9IHt9OworICAgICAgdGhpcy5kYXRhVHlwZShleGlzdGluZ1Byb3BlcnR5LCBwcm9wZXJ0eSk7CisgICAgICBpZihleGlzdGluZ1Byb3BlcnR5LmRlc2NyaXB0aW9uKSB7CisgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uID0gZXhpc3RpbmdQcm9wZXJ0eS5kZXNjcmlwdGlvbjsKKyAgICAgIH0KKyAgICAgIGlmKGV4aXN0aW5nUHJvcGVydHlbJ2VudW0nXSkgeworICAgICAgICBwcm9wZXJ0eVsnZW51bSddID0gZXhpc3RpbmdQcm9wZXJ0eVsnZW51bSddOworICAgICAgfQorICAgICAgaWYodHlwZW9mIGV4aXN0aW5nUHJvcGVydHkucmVxdWlyZWQgPT09ICdib29sZWFuJyAmJiBleGlzdGluZ1Byb3BlcnR5LnJlcXVpcmVkID09PSB0cnVlKSB7CisgICAgICAgIF9lbnVtLnB1c2gocHJvcGVydHlOYW1lKTsKKyAgICAgIH0KKyAgICAgIGlmKHR5cGVvZiBleGlzdGluZ1Byb3BlcnR5LnJlcXVpcmVkID09PSAnc3RyaW5nJyAmJiBleGlzdGluZ1Byb3BlcnR5LnJlcXVpcmVkID09PSAndHJ1ZScpIHsKKyAgICAgICAgX2VudW0ucHVzaChwcm9wZXJ0eU5hbWUpOworICAgICAgfQorICAgICAgc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5OworICAgIH0KKyAgICBpZihfZW51bS5sZW5ndGggPiAwKSB7CisgICAgICBzY2hlbWFbJ2VudW0nXSA9IF9lbnVtOworICAgIH0KKyAgICBzd2FnZ2VyLmRlZmluaXRpb25zW25hbWVdID0gc2NoZW1hOworICB9Cit9OworCitTd2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuZXh0cmFjdFRhZyA9IGZ1bmN0aW9uKHJlc291cmNlUGF0aCkgeworICB2YXIgcGF0aFN0cmluZyA9IHJlc291cmNlUGF0aCB8fCAnZGVmYXVsdCc7CisgIGlmKHBhdGhTdHJpbmcuaW5kZXhPZignaHR0cDonKSA9PT0gMCB8fCBwYXRoU3RyaW5nLmluZGV4T2YoJ2h0dHBzOicpID09PSAwKSB7CisgICAgcGF0aFN0cmluZyA9IHBhdGhTdHJpbmcuc3BsaXQoWycvJ10pOworICAgIHBhdGhTdHJpbmcgPSBwYXRoU3RyaW5nW3BhdGhTdHJpbmcubGVuZ3RoIC0xXS5zdWJzdHJpbmcoKTsKKyAgfQorICByZXR1cm4gcGF0aFN0cmluZy5yZXBsYWNlKCcvJywnJyk7Cit9CisKK1N3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5vcGVyYXRpb25zID0gZnVuY3Rpb24ocGF0aCwgcmVzb3VyY2VQYXRoLCBvYmosIHJlc291cmNlTGV2ZWxBdXRoLCBzd2FnZ2VyKSB7CisgIGlmKCFBcnJheS5pc0FycmF5KG9iaikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFyIGk7CisKKyAgaWYoIXN3YWdnZXIucGF0aHMpIHsKKyAgICBzd2FnZ2VyLnBhdGhzID0ge307CisgIH0KKworICB2YXIgcGF0aE9iaiA9IHN3YWdnZXIucGF0aHNbcGF0aF0gfHwge307CisgIHZhciB0YWcgPSB0aGlzLmV4dHJhY3RUYWcocmVzb3VyY2VQYXRoKTsKKyAgc3dhZ2dlci50YWdzID0gc3dhZ2dlci50YWdzIHx8IFtdOworICB2YXIgbWF0Y2hlZCA9IGZhbHNlOworICBmb3IoaSA9IDA7IGkgPCBzd2FnZ2VyLnRhZ3MubGVuZ3RoOyBpKyspIHsKKyAgICB2YXIgdGFnT2JqZWN0ID0gc3dhZ2dlci50YWdzW2ldOworICAgIGlmKHRhZ09iamVjdC5uYW1lID09PSB0YWcpIHsKKyAgICAgIG1hdGNoZWQgPSB0cnVlOworICAgIH0KKyAgfQorICBpZighbWF0Y2hlZCkgeworICAgIHN3YWdnZXIudGFncy5wdXNoKHtuYW1lOiB0YWd9KTsKKyAgfQorCisgIGZvcihpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykgeworICAgIHZhciBleGlzdGluZ09wZXJhdGlvbiA9IG9ialtpXTsKKyAgICB2YXIgbWV0aG9kID0gKGV4aXN0aW5nT3BlcmF0aW9uLm1ldGhvZCB8fCBleGlzdGluZ09wZXJhdGlvbi5odHRwTWV0aG9kKS50b0xvd2VyQ2FzZSgpOworICAgIHZhciBvcGVyYXRpb24gPSB7dGFnczogW3RhZ119OworICAgIHZhciBleGlzdGluZ0F1dGhvcml6YXRpb25zID0gZXhpc3RpbmdPcGVyYXRpb24uYXV0aG9yaXphdGlvbnM7CisKKyAgICBpZihleGlzdGluZ0F1dGhvcml6YXRpb25zICYmIE9iamVjdC5rZXlzKGV4aXN0aW5nQXV0aG9yaXphdGlvbnMpLmxlbmd0aCA9PT0gMCkgeworICAgICAgZXhpc3RpbmdBdXRob3JpemF0aW9ucyA9IHJlc291cmNlTGV2ZWxBdXRoOworICAgIH0KKworICAgIGlmKHR5cGVvZiBleGlzdGluZ0F1dGhvcml6YXRpb25zICE9PSAndW5kZWZpbmVkJykgeworICAgICAgZm9yKHZhciBrZXkgaW4gZXhpc3RpbmdBdXRob3JpemF0aW9ucykgeworICAgICAgICBvcGVyYXRpb24uc2VjdXJpdHkgPSBvcGVyYXRpb24uc2VjdXJpdHkgfHwgW107CisgICAgICAgIHZhciBzY29wZXMgPSBleGlzdGluZ0F1dGhvcml6YXRpb25zW2tleV07CisgICAgICAgIGlmKHNjb3BlcykgeworICAgICAgICAgIHZhciBzZWN1cml0eVNjb3BlcyA9IFtdOworICAgICAgICAgIGZvcih2YXIgaiBpbiBzY29wZXMpIHsKKyAgICAgICAgICAgIHNlY3VyaXR5U2NvcGVzLnB1c2goc2NvcGVzW2pdLnNjb3BlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIHNjb3Blc09iamVjdCA9IHt9OworICAgICAgICAgIHNjb3Blc09iamVjdFtrZXldID0gc2VjdXJpdHlTY29wZXM7CisgICAgICAgICAgb3BlcmF0aW9uLnNlY3VyaXR5LnB1c2goc2NvcGVzT2JqZWN0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICB2YXIgc2NvcGVzT2JqZWN0ID0ge307CisgICAgICAgICAgc2NvcGVzT2JqZWN0W2tleV0gPSBbXTsKKyAgICAgICAgICBvcGVyYXRpb24uc2VjdXJpdHkucHVzaChzY29wZXNPYmplY3QpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYoZXhpc3RpbmdPcGVyYXRpb24uY29uc3VtZXMpIHsKKyAgICAgIG9wZXJhdGlvbi5jb25zdW1lcyA9IGV4aXN0aW5nT3BlcmF0aW9uLmNvbnN1bWVzOworICAgIH0KKyAgICBlbHNlIGlmKHN3YWdnZXIuY29uc3VtZXMpIHsKKyAgICAgIG9wZXJhdGlvbi5jb25zdW1lcyA9IHN3YWdnZXIuY29uc3VtZXM7CisgICAgfQorICAgIGlmKGV4aXN0aW5nT3BlcmF0aW9uLnByb2R1Y2VzKSB7CisgICAgICBvcGVyYXRpb24ucHJvZHVjZXMgPSBleGlzdGluZ09wZXJhdGlvbi5wcm9kdWNlczsKKyAgICB9CisgICAgZWxzZSBpZihzd2FnZ2VyLnByb2R1Y2VzKSB7CisgICAgICBvcGVyYXRpb24ucHJvZHVjZXMgPSBzd2FnZ2VyLnByb2R1Y2VzOworICAgIH0KKyAgICBpZihleGlzdGluZ09wZXJhdGlvbi5zdW1tYXJ5KSB7CisgICAgICBvcGVyYXRpb24uc3VtbWFyeSA9IGV4aXN0aW5nT3BlcmF0aW9uLnN1bW1hcnk7CisgICAgfQorICAgIGlmKGV4aXN0aW5nT3BlcmF0aW9uLm5vdGVzKSB7CisgICAgICBvcGVyYXRpb24uZGVzY3JpcHRpb24gPSBleGlzdGluZ09wZXJhdGlvbi5ub3RlczsKKyAgICB9CisgICAgaWYoZXhpc3RpbmdPcGVyYXRpb24ubmlja25hbWUpIHsKKyAgICAgIG9wZXJhdGlvbi5vcGVyYXRpb25JZCA9IGV4aXN0aW5nT3BlcmF0aW9uLm5pY2tuYW1lOworICAgIH0KKyAgICBpZihleGlzdGluZ09wZXJhdGlvbi5kZXByZWNhdGVkKSB7CisgICAgICBvcGVyYXRpb24uZGVwcmVjYXRlZCA9IGV4aXN0aW5nT3BlcmF0aW9uLmRlcHJlY2F0ZWQ7CisgICAgfQorCisgICAgdGhpcy5hdXRob3JpemF0aW9ucyhleGlzdGluZ0F1dGhvcml6YXRpb25zLCBzd2FnZ2VyKTsKKyAgICB0aGlzLnBhcmFtZXRlcnMob3BlcmF0aW9uLCBleGlzdGluZ09wZXJhdGlvbi5wYXJhbWV0ZXJzLCBzd2FnZ2VyKTsKKyAgICB0aGlzLnJlc3BvbnNlTWVzc2FnZXMob3BlcmF0aW9uLCBleGlzdGluZ09wZXJhdGlvbiwgc3dhZ2dlcik7CisKKyAgICBwYXRoT2JqW21ldGhvZF0gPSBvcGVyYXRpb247CisgIH0KKworICBzd2FnZ2VyLnBhdGhzW3BhdGhdID0gcGF0aE9iajsKK307CisKK1N3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5yZXNwb25zZU1lc3NhZ2VzID0gZnVuY3Rpb24ob3BlcmF0aW9uLCBleGlzdGluZ09wZXJhdGlvbiwgc3dhZ2dlcikgeworICBpZih0eXBlb2YgZXhpc3RpbmdPcGVyYXRpb24gIT09ICdvYmplY3QnKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vIGJ1aWxkIGRlZmF1bHQgcmVzcG9uc2UgZnJvbSB0aGUgb3BlcmF0aW9uICgxLngpCisgIHZhciBkZWZhdWx0UmVzcG9uc2UgPSB7fTsKKyAgdGhpcy5kYXRhVHlwZShleGlzdGluZ09wZXJhdGlvbiwgZGVmYXVsdFJlc3BvbnNlKTsKKyAgaWYoIWRlZmF1bHRSZXNwb25zZS5zY2hlbWEpIHsKKyAgICBkZWZhdWx0UmVzcG9uc2UgPSB7c2NoZW1hOiBkZWZhdWx0UmVzcG9uc2V9OworICB9CisKKyAgb3BlcmF0aW9uLnJlc3BvbnNlcyA9IG9wZXJhdGlvbi5yZXNwb25zZXMgfHwge307CisKKyAgLy8gZ3JhYiBmcm9tIHJlc3BvbnNlTWVzc2FnZXMgKDEuMikKKyAgdmFyIGhhczIwMCA9IGZhbHNlOworICBpZihBcnJheS5pc0FycmF5KGV4aXN0aW5nT3BlcmF0aW9uLnJlc3BvbnNlTWVzc2FnZXMpKSB7CisgICAgdmFyIGk7CisgICAgdmFyIGV4aXN0aW5nUmVzcG9uc2VzID0gZXhpc3RpbmdPcGVyYXRpb24ucmVzcG9uc2VNZXNzYWdlczsKKyAgICBmb3IoaSA9IDA7IGkgPCBleGlzdGluZ1Jlc3BvbnNlcy5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIGV4aXN0aW5nUmVzcG9uc2UgPSBleGlzdGluZ1Jlc3BvbnNlc1tpXTsKKyAgICAgIHZhciByZXNwb25zZSA9IHsgZGVzY3JpcHRpb246IGV4aXN0aW5nUmVzcG9uc2UubWVzc2FnZSB9OworICAgICAgaWYoZXhpc3RpbmdSZXNwb25zZS5jb2RlID09PSAyMDApIHsKKyAgICAgICAgaGFzMjAwID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIG9wZXJhdGlvbi5yZXNwb25zZXNbJycgKyBleGlzdGluZ1Jlc3BvbnNlLmNvZGVdID0gcmVzcG9uc2U7CisgICAgICAvLyBUT0RPOiBzY2hlbWEKKyAgICB9CisgIH0KKworICBpZihoYXMyMDApIHsKKyAgICBvcGVyYXRpb24ucmVzcG9uc2VzWydkZWZhdWx0J10gPSBkZWZhdWx0UmVzcG9uc2U7CisgIH0KKyAgZWxzZSB7CisgICAgb3BlcmF0aW9uLnJlc3BvbnNlc1snMjAwJ10gPSBkZWZhdWx0UmVzcG9uc2U7CisgIH0KK307CisKK1N3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5hdXRob3JpemF0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgc3dhZ2dlcikgeworICAvLyBUT0RPCisgIGlmKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7CisgICAgcmV0dXJuOworICB9Cit9OworCitTd2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUucGFyYW1ldGVycyA9IGZ1bmN0aW9uKG9wZXJhdGlvbiwgb2JqLCBzd2FnZ2VyKSB7CisgIGlmKCFBcnJheS5pc0FycmF5KG9iaikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFyIGk7CisgIGZvcihpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykgeworICAgIHZhciBleGlzdGluZ1BhcmFtZXRlciA9IG9ialtpXTsKKyAgICB2YXIgcGFyYW1ldGVyID0ge307CisgICAgcGFyYW1ldGVyLm5hbWUgPSBleGlzdGluZ1BhcmFtZXRlci5uYW1lOworICAgIHBhcmFtZXRlci5kZXNjcmlwdGlvbiA9IGV4aXN0aW5nUGFyYW1ldGVyLmRlc2NyaXB0aW9uOworICAgIHBhcmFtZXRlci5yZXF1aXJlZCA9IGV4aXN0aW5nUGFyYW1ldGVyLnJlcXVpcmVkOworICAgIHBhcmFtZXRlci5pbiA9IGV4aXN0aW5nUGFyYW1ldGVyLnBhcmFtVHlwZTsKKworICAgIC8vIHBlciAjMTY4CisgICAgaWYocGFyYW1ldGVyLmluID09PSAnYm9keScpIHsKKyAgICAgIHBhcmFtZXRlci5uYW1lID0gJ2JvZHknOworICAgIH0KKyAgICBpZihwYXJhbWV0ZXIuaW4gPT09ICdmb3JtJykgeworICAgICAgcGFyYW1ldGVyLmluID0gJ2Zvcm1EYXRhJzsKKyAgICB9CisKKyAgICBpZihleGlzdGluZ1BhcmFtZXRlci5hbGxvd011bHRpcGxlID09PSB0cnVlIHx8IGV4aXN0aW5nUGFyYW1ldGVyLmFsbG93TXVsdGlwbGUgPT09ICd0cnVlJykgeworICAgICAgdmFyIGlubmVyVHlwZSA9IHt9OworICAgICAgdGhpcy5kYXRhVHlwZShleGlzdGluZ1BhcmFtZXRlciwgaW5uZXJUeXBlKTsKKyAgICAgIHBhcmFtZXRlci50eXBlID0gJ2FycmF5JzsKKyAgICAgIHBhcmFtZXRlci5pdGVtcyA9IGlubmVyVHlwZTsKKworICAgICAgaWYoZXhpc3RpbmdQYXJhbWV0ZXIuYWxsb3dhYmxlVmFsdWVzKSB7CisgICAgICAgIHZhciBhdiA9IGV4aXN0aW5nUGFyYW1ldGVyLmFsbG93YWJsZVZhbHVlczsKKyAgICAgICAgaWYoYXYudmFsdWVUeXBlID09PSAnTElTVCcpIHsKKyAgICAgICAgICBwYXJhbWV0ZXJbJ2VudW0nXSA9IGF2LnZhbHVlczsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRoaXMuZGF0YVR5cGUoZXhpc3RpbmdQYXJhbWV0ZXIsIHBhcmFtZXRlcik7CisgICAgfQorCisgICAgb3BlcmF0aW9uLnBhcmFtZXRlcnMgPSBvcGVyYXRpb24ucGFyYW1ldGVycyB8fCBbXTsKKyAgICBvcGVyYXRpb24ucGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcik7CisgIH0KK307CisKK1N3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5kYXRhVHlwZSA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KSB7CisgIGlmKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoc291cmNlLm1pbmltdW0pIHsKKyAgICB0YXJnZXQubWluaW11bSA9IHNvdXJjZS5taW5pbXVtOworICB9CisgIGlmKHNvdXJjZS5tYXhpbXVtKSB7CisgICAgdGFyZ2V0Lm1heGltdW0gPSBzb3VyY2UubWF4aW11bTsKKyAgfQorICBpZihzb3VyY2UuZGVmYXVsdFZhbHVlKSB7CisgICAgdGFyZ2V0LmRlZmF1bHQgPSBzb3VyY2UuZGVmYXVsdFZhbHVlOworICB9CisKKyAgdmFyIGpzb25TY2hlbWFUeXBlID0gdGhpcy50b0pzb25TY2hlbWEoc291cmNlKTsKKyAgaWYoanNvblNjaGVtYVR5cGUpIHsKKyAgICB0YXJnZXQgPSB0YXJnZXQgfHwge307CisgICAgaWYoanNvblNjaGVtYVR5cGUudHlwZSkgeworICAgICAgdGFyZ2V0LnR5cGUgPSBqc29uU2NoZW1hVHlwZS50eXBlOworICAgIH0KKyAgICBpZihqc29uU2NoZW1hVHlwZS5mb3JtYXQpIHsKKyAgICAgIHRhcmdldC5mb3JtYXQgPSBqc29uU2NoZW1hVHlwZS5mb3JtYXQ7CisgICAgfQorICAgIGlmKGpzb25TY2hlbWFUeXBlLiRyZWYpIHsKKyAgICAgIHRhcmdldC5zY2hlbWEgPSB7JHJlZjoganNvblNjaGVtYVR5cGUuJHJlZn07CisgICAgfQorICAgIGlmKGpzb25TY2hlbWFUeXBlLml0ZW1zKSB7CisgICAgICB0YXJnZXQuaXRlbXMgPSBqc29uU2NoZW1hVHlwZS5pdGVtczsKKyAgICB9CisgIH0KK307CisKK1N3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS50b0pzb25TY2hlbWEgPSBmdW5jdGlvbihzb3VyY2UpIHsKKyAgaWYoIXNvdXJjZSkgeworICAgIHJldHVybiAnb2JqZWN0JzsKKyAgfQorICB2YXIgZGV0ZWN0ZWRUeXBlID0gKHNvdXJjZS50eXBlIHx8IHNvdXJjZS5kYXRhVHlwZSB8fCBzb3VyY2UucmVzcG9uc2VDbGFzcyB8fCAnJyk7CisgIHZhciBsY1R5cGUgPSBkZXRlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKKyAgdmFyIGZvcm1hdCA9IChzb3VyY2UuZm9ybWF0IHx8ICcnKS50b0xvd2VyQ2FzZSgpOworCisgIGlmKGxjVHlwZS5pbmRleE9mKCdsaXN0WycpID09PSAwKSB7CisgICAgdmFyIGlubmVyVHlwZSA9IGRldGVjdGVkVHlwZS5zdWJzdHJpbmcoNSwgZGV0ZWN0ZWRUeXBlLmxlbmd0aCAtIDEpOworICAgIHZhciBqc29uVHlwZSA9IHRoaXMudG9Kc29uU2NoZW1hKHt0eXBlOiBpbm5lclR5cGV9KTsKKyAgICByZXR1cm4ge3R5cGU6ICdhcnJheScsIGl0ZW1zOiBqc29uVHlwZX07CisgIH0KKyAgZWxzZSBpZihsY1R5cGUgPT09ICdpbnQnIHx8IChsY1R5cGUgPT09ICdpbnRlZ2VyJyAmJiBmb3JtYXQgPT09ICdpbnQzMicpKQorICAgIHtyZXR1cm4ge3R5cGU6ICdpbnRlZ2VyJywgZm9ybWF0OiAnaW50MzInfTt9CisgIGVsc2UgaWYobGNUeXBlID09PSAnbG9uZycgfHwgKGxjVHlwZSA9PT0gJ2ludGVnZXInICYmIGZvcm1hdCA9PT0gJ2ludDY0JykpCisgICAge3JldHVybiB7dHlwZTogJ2ludGVnZXInLCBmb3JtYXQ6ICdpbnQ2NCd9O30KKyAgZWxzZSBpZihsY1R5cGUgPT09ICdpbnRlZ2VyJykKKyAgICB7cmV0dXJuIHt0eXBlOiAnaW50ZWdlcicsIGZvcm1hdDogJ2ludDY0J307fQorICBlbHNlIGlmKGxjVHlwZSA9PT0gJ2Zsb2F0JyB8fCAobGNUeXBlID09PSAnbnVtYmVyJyAmJiBmb3JtYXQgPT09ICdmbG9hdCcpKQorICAgIHtyZXR1cm4ge3R5cGU6ICdudW1iZXInLCBmb3JtYXQ6ICdmbG9hdCd9O30KKyAgZWxzZSBpZihsY1R5cGUgPT09ICdkb3VibGUnIHx8IChsY1R5cGUgPT09ICdudW1iZXInICYmIGZvcm1hdCA9PT0gJ2RvdWJsZScpKQorICAgIHtyZXR1cm4ge3R5cGU6ICdudW1iZXInLCBmb3JtYXQ6ICdkb3VibGUnfTt9CisgIGVsc2UgaWYoKGxjVHlwZSA9PT0gJ3N0cmluZycgJiYgZm9ybWF0ID09PSAnZGF0ZS10aW1lJykgfHwgKGxjVHlwZSA9PT0gJ2RhdGUnKSkKKyAgICB7cmV0dXJuIHt0eXBlOiAnc3RyaW5nJywgZm9ybWF0OiAnZGF0ZS10aW1lJ307fQorICBlbHNlIGlmKGxjVHlwZSA9PT0gJ3N0cmluZycpCisgICAge3JldHVybiB7dHlwZTogJ3N0cmluZyd9O30KKyAgZWxzZSBpZihsY1R5cGUgPT09ICdmaWxlJykKKyAgICB7cmV0dXJuIHt0eXBlOiAnZmlsZSd9O30KKyAgZWxzZSBpZihsY1R5cGUgPT09ICdib29sZWFuJykKKyAgICB7cmV0dXJuIHt0eXBlOiAnYm9vbGVhbid9O30KKyAgZWxzZSBpZihsY1R5cGUgPT09ICdhcnJheScgfHwgbGNUeXBlID09PSAnbGlzdCcpIHsKKyAgICBpZihzb3VyY2UuaXRlbXMpIHsKKyAgICAgIHZhciBpdCA9IHRoaXMudG9Kc29uU2NoZW1hKHNvdXJjZS5pdGVtcyk7CisgICAgICByZXR1cm4ge3R5cGU6ICdhcnJheScsIGl0ZW1zOiBpdH07CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIHt0eXBlOiAnYXJyYXknLCBpdGVtczoge3R5cGU6ICdvYmplY3QnfX07CisgICAgfQorICB9CisgIGVsc2UgaWYoc291cmNlLiRyZWYpIHsKKyAgICByZXR1cm4geyRyZWY6ICcjL2RlZmluaXRpb25zLycgKyB0aGlzLm1vZGVsTWFwW3NvdXJjZS4kcmVmXSB8fCBzb3VyY2UuJHJlZn07CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIHskcmVmOiAnIy9kZWZpbml0aW9ucy8nICsgdGhpcy5tb2RlbE1hcFtzb3VyY2UudHlwZV0gfHwgc291cmNlLnR5cGV9OworICB9Cit9OworCitTd2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUucmVzb3VyY2VMaXN0aW5nID0gZnVuY3Rpb24ob2JqLCBzd2FnZ2VyLCBjYWxsYmFjaykgeworICB2YXIgaSwgcHJvY2Vzc2VkQ291bnQgPSAwOworICB2YXIgc2VsZiA9IHRoaXM7CisgIHZhciBleHBlY3RlZENvdW50ID0gb2JqLmFwaXMubGVuZ3RoOworICB2YXIgX3N3YWdnZXIgPSBzd2FnZ2VyOworCisgIGlmKGV4cGVjdGVkQ291bnQgPT09IDApIHsKKyAgICB0aGlzLmZpbmlzaChjYWxsYmFjaywgc3dhZ2dlcik7CisgIH0KKworICBmb3IoaSA9IDA7IGkgPCBleHBlY3RlZENvdW50OyBpKyspIHsKKyAgICB2YXIgYXBpID0gb2JqLmFwaXNbaV07CisgICAgdmFyIHBhdGggPSBhcGkucGF0aDsKKyAgICB2YXIgYWJzb2x1dGVQYXRoID0gdGhpcy5nZXRBYnNvbHV0ZVBhdGgob2JqLnN3YWdnZXJWZXJzaW9uLCB0aGlzLmRvY0xvY2F0aW9uLCBwYXRoKTsKKworICAgIGlmKGFwaS5kZXNjcmlwdGlvbikgeworICAgICAgc3dhZ2dlci50YWdzID0gc3dhZ2dlci50YWdzIHx8IFtdOworICAgICAgc3dhZ2dlci50YWdzLnB1c2goeworICAgICAgICBuYW1lIDogdGhpcy5leHRyYWN0VGFnKGFwaS5wYXRoKSwKKyAgICAgICAgZGVzY3JpcHRpb24gOiBhcGkuZGVzY3JpcHRpb24gfHwgJycKKyAgICAgIH0pOworICAgIH07CisgICAgdmFyIGh0dHAgPSB7CisgICAgICB1cmw6IGFic29sdXRlUGF0aCwKKyAgICAgIGhlYWRlcnM6IHthY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJ30sCisgICAgICBvbjoge30sCisgICAgICBtZXRob2Q6ICdnZXQnCisgICAgfTsKKyAgICBodHRwLm9uLnJlc3BvbnNlID0gZnVuY3Rpb24oZGF0YSkgeworICAgICAgcHJvY2Vzc2VkQ291bnQgKz0gMTsKKyAgICAgIGlmKGRhdGEub2JqKSB7CisgICAgICAgIHNlbGYuZGVjbGFyYXRpb24oZGF0YS5vYmosIF9zd2FnZ2VyKTsKKyAgICAgIH0KKyAgICAgIGlmKHByb2Nlc3NlZENvdW50ID09PSBleHBlY3RlZENvdW50KSB7CisgICAgICAgIHNlbGYuZmluaXNoKGNhbGxiYWNrLCBfc3dhZ2dlcik7CisgICAgICB9CisgICAgfTsKKyAgICBodHRwLm9uLmVycm9yID0gZnVuY3Rpb24oZGF0YSkgeworICAgICAgY29uc29sZS5lcnJvcihkYXRhKTsKKyAgICAgIHByb2Nlc3NlZENvdW50ICs9IDE7CisgICAgICBpZihwcm9jZXNzZWRDb3VudCA9PT0gZXhwZWN0ZWRDb3VudCkgeworICAgICAgICBzZWxmLmZpbmlzaChjYWxsYmFjaywgX3N3YWdnZXIpOworICAgICAgfQorICAgIH07CisgICAgbmV3IFN3YWdnZXJIdHRwKCkuZXhlY3V0ZShodHRwKTsKKyAgfQorfTsKKworU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLmdldEFic29sdXRlUGF0aCA9IGZ1bmN0aW9uKHZlcnNpb24sIGRvY0xvY2F0aW9uLCBwYXRoKSAgeworICBpZih2ZXJzaW9uID09PSAnMS4wJykgeworICAgIGlmKGRvY0xvY2F0aW9uLmVuZHNXaXRoKCcuanNvbicpKSB7CisgICAgICAvLyBnZXQgcm9vdCBwYXRoCisgICAgICB2YXIgcG9zID0gZG9jTG9jYXRpb24ubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgIGlmKHBvcyA+IDApIHsKKyAgICAgICAgZG9jTG9jYXRpb24gPSBkb2NMb2NhdGlvbi5zdWJzdHJpbmcoMCwgcG9zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2YXIgbG9jYXRpb24gPSBkb2NMb2NhdGlvbjsKKyAgaWYocGF0aC5pbmRleE9mKCdodHRwOi8vJykgPT09IDAgfHwgcGF0aC5pbmRleE9mKCdodHRwczovLycpID09PSAwKSB7CisgICAgbG9jYXRpb24gPSBwYXRoOworICB9CisgIGVsc2UgeworICAgIGlmKGRvY0xvY2F0aW9uLmVuZHNXaXRoKCcvJykpIHsKKyAgICAgIGxvY2F0aW9uID0gZG9jTG9jYXRpb24uc3Vic3RyaW5nKDAsIGRvY0xvY2F0aW9uLmxlbmd0aCAtIDEpOworICAgIH0KKyAgICBsb2NhdGlvbiArPSBwYXRoOworICB9CisgIGxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgne2Zvcm1hdH0nLCAnanNvbicpOworICByZXR1cm4gbG9jYXRpb247Cit9OworCitTd2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuc2VjdXJpdHlEZWZpbml0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgc3dhZ2dlcikgeworICBpZihvYmouYXV0aG9yaXphdGlvbnMpIHsKKyAgICB2YXIgbmFtZTsKKyAgICBmb3IobmFtZSBpbiBvYmouYXV0aG9yaXphdGlvbnMpIHsKKyAgICAgIHZhciBpc1ZhbGlkID0gZmFsc2U7CisgICAgICB2YXIgc2VjdXJpdHlEZWZpbml0aW9uID0ge307CisgICAgICB2YXIgZGVmaW5pdGlvbiA9IG9iai5hdXRob3JpemF0aW9uc1tuYW1lXTsKKyAgICAgIGlmKGRlZmluaXRpb24udHlwZSA9PT0gJ2FwaUtleScpIHsKKyAgICAgICAgc2VjdXJpdHlEZWZpbml0aW9uLnR5cGUgPSAnYXBpS2V5JzsKKyAgICAgICAgc2VjdXJpdHlEZWZpbml0aW9uLmluID0gZGVmaW5pdGlvbi5wYXNzQXM7CisgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi5uYW1lID0gZGVmaW5pdGlvbi5rZXluYW1lIHx8IG5hbWU7CisgICAgICAgIGlzVmFsaWQgPSB0cnVlOworICAgICAgfQorICAgICAgZWxzZSBpZihkZWZpbml0aW9uLnR5cGUgPT09ICdvYXV0aDInKSB7CisgICAgICAgIHZhciBleGlzdGluZ1Njb3BlcyA9IGRlZmluaXRpb24uc2NvcGVzIHx8IFtdOworICAgICAgICB2YXIgc2NvcGVzID0ge307CisgICAgICAgIHZhciBpOworICAgICAgICBmb3IoaSBpbiBleGlzdGluZ1Njb3BlcykgeworICAgICAgICAgIHZhciBzY29wZSA9IGV4aXN0aW5nU2NvcGVzW2ldOworICAgICAgICAgIHNjb3Blc1tzY29wZS5zY29wZV0gPSBzY29wZS5kZXNjcmlwdGlvbjsKKyAgICAgICAgfQorICAgICAgICBzZWN1cml0eURlZmluaXRpb24udHlwZSA9ICdvYXV0aDInOworICAgICAgICBpZihpID4gMCkgeworICAgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi5zY29wZXMgPSBzY29wZXM7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBpZihkZWZpbml0aW9uLmdyYW50VHlwZXMpIHsKKyAgICAgICAgICBpZihkZWZpbml0aW9uLmdyYW50VHlwZXMuaW1wbGljaXQpIHsKKyAgICAgICAgICAgIHZhciBpbXBsaWNpdCA9IGRlZmluaXRpb24uZ3JhbnRUeXBlcy5pbXBsaWNpdDsKKyAgICAgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi5mbG93ID0gJ2ltcGxpY2l0JzsKKyAgICAgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi5hdXRob3JpemF0aW9uVXJsID0gaW1wbGljaXQubG9naW5FbmRwb2ludDsKKyAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihkZWZpbml0aW9uLmdyYW50VHlwZXMuYXV0aG9yaXphdGlvbl9jb2RlKSB7CisgICAgICAgICAgICBpZighc2VjdXJpdHlEZWZpbml0aW9uLmZsb3cpIHsKKyAgICAgICAgICAgICAgLy8gY2Fubm90IHNldCBpZiBmbG93IGlzIGFscmVhZHkgZGVmaW5lZAorICAgICAgICAgICAgICB2YXIgYXV0aENvZGUgPSBkZWZpbml0aW9uLmdyYW50VHlwZXMuYXV0aG9yaXphdGlvbl9jb2RlOworICAgICAgICAgICAgICBzZWN1cml0eURlZmluaXRpb24uZmxvdyA9ICdhY2Nlc3NDb2RlJzsKKyAgICAgICAgICAgICAgc2VjdXJpdHlEZWZpbml0aW9uLmF1dGhvcml6YXRpb25VcmwgPSBhdXRoQ29kZS50b2tlblJlcXVlc3RFbmRwb2ludC51cmw7CisgICAgICAgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi50b2tlblVybCA9IGF1dGhDb2RlLnRva2VuRW5kcG9pbnQudXJsOworICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmKGlzVmFsaWQpIHsKKyAgICAgICAgc3dhZ2dlci5zZWN1cml0eURlZmluaXRpb25zID0gc3dhZ2dlci5zZWN1cml0eURlZmluaXRpb25zIHx8IHt9OworICAgICAgICBzd2FnZ2VyLnNlY3VyaXR5RGVmaW5pdGlvbnNbbmFtZV0gPSBzZWN1cml0eURlZmluaXRpb247CisgICAgICB9CisgICAgfQorICB9Cit9OworCitTd2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuYXBpSW5mbyA9IGZ1bmN0aW9uKG9iaiwgc3dhZ2dlcikgeworICAvLyBpbmZvIHNlY3Rpb24KKyAgaWYob2JqLmluZm8pIHsKKyAgICB2YXIgaW5mbyA9IG9iai5pbmZvOworICAgIHN3YWdnZXIuaW5mbyA9IHt9OworCisgICAgaWYoaW5mby5jb250YWN0KSB7CisgICAgICBzd2FnZ2VyLmluZm8uY29udGFjdCA9IHt9OworICAgICAgc3dhZ2dlci5pbmZvLmNvbnRhY3QuZW1haWwgPSBpbmZvLmNvbnRhY3Q7CisgICAgfQorICAgIGlmKGluZm8uZGVzY3JpcHRpb24pIHsKKyAgICAgIHN3YWdnZXIuaW5mby5kZXNjcmlwdGlvbiA9IGluZm8uZGVzY3JpcHRpb247CisgICAgfQorICAgIGlmKGluZm8udGl0bGUpIHsKKyAgICAgIHN3YWdnZXIuaW5mby50aXRsZSA9IGluZm8udGl0bGU7CisgICAgfQorICAgIGlmKGluZm8udGVybXNPZlNlcnZpY2VVcmwpIHsKKyAgICAgIHN3YWdnZXIuaW5mby50ZXJtc09mU2VydmljZSA9IGluZm8udGVybXNPZlNlcnZpY2VVcmw7CisgICAgfQorICAgIGlmKGluZm8ubGljZW5zZSB8fCBpbmZvLmxpY2Vuc2VVcmwpIHsKKyAgICAgIHN3YWdnZXIubGljZW5zZSA9IHt9OworICAgICAgaWYoaW5mby5saWNlbnNlKSB7CisgICAgICAgIHN3YWdnZXIubGljZW5zZS5uYW1lID0gaW5mby5saWNlbnNlOworICAgICAgfQorICAgICAgaWYoaW5mby5saWNlbnNlVXJsKSB7CisgICAgICAgIHN3YWdnZXIubGljZW5zZS51cmwgPSBpbmZvLmxpY2Vuc2VVcmw7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgeworICAgIHRoaXMud2FybmluZ3MucHVzaCgnbWlzc2luZyBpbmZvIHNlY3Rpb24nKTsKKyAgfQorfTsKKworU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgb2JqKSB7CisgIGNhbGxiYWNrKG9iaik7Cit9OworfSx7Ii4vY2xpZW50IjozLCIuL2h0dHAiOjV9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3RyaWN0JzsKKwordmFyIF8gPSB7CisgIGZvckVhY2g6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9mb3JFYWNoJyksCisgIGluZGV4T2Y6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvYXJyYXkvaW5kZXhPZicpLAorICBpc0FycmF5OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNBcnJheScpLAorICBpc1BsYWluT2JqZWN0OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNQbGFpbk9iamVjdCcpLAorICBpc1N0cmluZzogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzU3RyaW5nJyksCisgIGlzVW5kZWZpbmVkOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNVbmRlZmluZWQnKSwKKyAga2V5czogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9vYmplY3Qva2V5cycpLAorICBtYXA6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9tYXAnKQorfTsKK3ZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi4vaGVscGVycycpOworCisKKy8qKgorICogYWxsb3dzIG92ZXJyaWRlIG9mIHRoZSBkZWZhdWx0IHZhbHVlIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgYmVpbmcKKyAqIHN1cHBsaWVkCisgKiovCit2YXIgYXBwbHlQYXJhbWV0ZXJNYWNybyA9IGZ1bmN0aW9uIChvcGVyYXRpb24sIHBhcmFtZXRlcikgeworICAvLyBUT0RPIHRoZSByZWZlcmVuY2UgdG8gb3BlcmF0aW9uLmFwaSBpcyBub3QgYXZhaWxhYmxlCisgIGlmIChvcGVyYXRpb24uYXBpICYmIG9wZXJhdGlvbi5hcGkucGFyYW1ldGVyTWFjcm8pIHsKKyAgICByZXR1cm4gb3BlcmF0aW9uLmFwaS5wYXJhbWV0ZXJNYWNybyhvcGVyYXRpb24sIHBhcmFtZXRlcik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBhcmFtZXRlci5kZWZhdWx0VmFsdWU7CisgIH0KK307CisKKy8qKgorICogYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gbW9kZWwgcHJvcGVydHkKKyAqKi8KK3ZhciBhcHBseU1vZGVsUHJvcGVydHlNYWNybyA9IGZ1bmN0aW9uIChtb2RlbCwgcHJvcGVydHkpIHsKKyAgLy8gVE9ETyB0aGUgcmVmZXJlbmNlIHRvIG1vZGVsLmFwaSBpcyBub3QgYXZhaWxhYmxlCisgIGlmIChtb2RlbC5hcGkgJiYgbW9kZWwuYXBpLm1vZGVsUHJvcGVydHlNYWNybykgeworICAgIHJldHVybiBtb2RlbC5hcGkubW9kZWxQcm9wZXJ0eU1hY3JvKG1vZGVsLCBwcm9wZXJ0eSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHByb3BlcnR5LmRlZmF1bHQ7CisgIH0KK307CisKK3ZhciBNb2RlbCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUsIGRlZmluaXRpb24sIG1vZGVscykgeworICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IHt9OworICB0aGlzLmlzQXJyYXkgPSBkZWZpbml0aW9uLnR5cGUgPT09ICdhcnJheSc7CisgIHRoaXMubW9kZWxzID0gbW9kZWxzIHx8IHt9OworICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdJbmxpbmUgTW9kZWwnOworCisgIHJldHVybiB0aGlzOworfTsKKwordmFyIHNjaGVtYVRvSFRNTCA9IGZ1bmN0aW9uIChuYW1lLCBzY2hlbWEsIG1vZGVscykgeworICB2YXIgc3Ryb25nT3BlbiA9ICc8c3BhbiBjbGFzcz0ic3Ryb25nIj4nOworICB2YXIgc3Ryb25nQ2xvc2UgPSAnPC9zcGFuPic7CisgIHZhciByZWZlcmVuY2VzID0ge307CisgIHZhciBzZWVuTW9kZWxzID0gW107CisgIHZhciBpbmxpbmVNb2RlbHMgPSAwOworICB2YXIgYWRkUmVmZXJlbmNlID0gZnVuY3Rpb24gKHNjaGVtYSwgbmFtZSwgc2tpcFJlZikgeworICAgIHZhciBtb2RlbE5hbWUgPSBuYW1lOworICAgIHZhciBtb2RlbDsKKworICAgIGlmIChzY2hlbWEuJHJlZikgeworICAgICAgbW9kZWxOYW1lID0gaGVscGVycy5zaW1wbGVSZWYoc2NoZW1hLiRyZWYpOworICAgICAgbW9kZWwgPSBtb2RlbHNbbW9kZWxOYW1lXTsKKyAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQobmFtZSkpIHsKKyAgICAgIG1vZGVsTmFtZSA9ICdJbmxpbmUgTW9kZWwgJyArICgrK2lubGluZU1vZGVscyk7CisgICAgICBtb2RlbCA9IG5ldyBNb2RlbChtb2RlbE5hbWUsIHNjaGVtYSwgbW9kZWxzKTsKKyAgICB9CisKKyAgICBpZiAoc2tpcFJlZiAhPT0gdHJ1ZSkgeworICAgICAgcmVmZXJlbmNlc1ttb2RlbE5hbWVdID0gXy5pc1VuZGVmaW5lZChtb2RlbCkgPyB7fSA6IG1vZGVsLmRlZmluaXRpb247CisgICAgfQorCisgICAgcmV0dXJuIG1vZGVsTmFtZTsKKyAgfTsKKyAgdmFyIHByaW1pdGl2ZVRvSFRNTCA9IGZ1bmN0aW9uIChzY2hlbWEpIHsKKyAgICB2YXIgaHRtbCA9ICc8c3BhbiBjbGFzcz0icHJvcFR5cGUiPic7CisgICAgdmFyIHR5cGUgPSBzY2hlbWEudHlwZSB8fCAnb2JqZWN0JzsKKworICAgIGlmIChzY2hlbWEuJHJlZikgeworICAgICAgaHRtbCArPSBhZGRSZWZlcmVuY2Uoc2NoZW1hLCBoZWxwZXJzLnNpbXBsZVJlZihzY2hlbWEuJHJlZikpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHsKKyAgICAgIGlmICghXy5pc1VuZGVmaW5lZChzY2hlbWEucHJvcGVydGllcykpIHsKKyAgICAgICAgaHRtbCArPSBhZGRSZWZlcmVuY2Uoc2NoZW1hKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh0bWwgKz0gJ29iamVjdCc7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyYXknKSB7CisgICAgICBodG1sICs9ICdBcnJheVsnOworCisgICAgICBpZiAoXy5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHsKKyAgICAgICAgaHRtbCArPSBfLm1hcChzY2hlbWEuaXRlbXMsIGFkZFJlZmVyZW5jZSkuam9pbignLCcpOworICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hLml0ZW1zKSkgeworICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMuJHJlZikpIHsKKyAgICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zLnR5cGUpICYmIF8uaW5kZXhPZihbJ2FycmF5JywgJ29iamVjdCddLCBzY2hlbWEuaXRlbXMudHlwZSkgPT09IC0xKSB7CisgICAgICAgICAgICBodG1sICs9IHNjaGVtYS5pdGVtcy50eXBlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBodG1sICs9IGFkZFJlZmVyZW5jZShzY2hlbWEuaXRlbXMpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBodG1sICs9IGFkZFJlZmVyZW5jZShzY2hlbWEuaXRlbXMsIGhlbHBlcnMuc2ltcGxlUmVmKHNjaGVtYS5pdGVtcy4kcmVmKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhlbHBlcnMubG9nKCdBcnJheSB0eXBlXCdzIFwnaXRlbXNcJyBzY2hlbWEgaXMgbm90IGFuIGFycmF5IG9yIGFuIG9iamVjdCwgY2Fubm90IHByb2Nlc3MnKTsKKyAgICAgICAgaHRtbCArPSAnb2JqZWN0JzsKKyAgICAgIH0KKworICAgICAgaHRtbCArPSAnXSc7CisgICAgfSBlbHNlIHsKKyAgICAgIGh0bWwgKz0gc2NoZW1hLnR5cGU7CisgICAgfQorCisgICAgaHRtbCArPSAnPC9zcGFuPic7CisKKyAgICByZXR1cm4gaHRtbDsKKyAgfTsKKyAgdmFyIHByaW1pdGl2ZVRvT3B0aW9uc0hUTUwgPSBmdW5jdGlvbiAoc2NoZW1hLCBodG1sKSB7CisgICAgdmFyIG9wdGlvbnMgPSAnJzsKKyAgICB2YXIgdHlwZSA9IHNjaGVtYS50eXBlIHx8ICdvYmplY3QnOworICAgIHZhciBpc0FycmF5ID0gdHlwZSA9PT0gJ2FycmF5JzsKKworICAgIGlmIChpc0FycmF5KSB7CisgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5pdGVtcykgJiYgIV8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zLnR5cGUpKSB7CisgICAgICAgIHR5cGUgPSBzY2hlbWEuaXRlbXMudHlwZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAnb2JqZWN0JzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2NoZW1hLmRlZmF1bHQpIHsKKyAgICAgIG9wdGlvbnMgKz0gaGVscGVycy5vcHRpb25IdG1sKCdEZWZhdWx0Jywgc2NoZW1hLmRlZmF1bHQpOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICBpZiAoc2NoZW1hLm1pbkxlbmd0aCkgeworICAgICAgICBvcHRpb25zICs9IGhlbHBlcnMub3B0aW9uSHRtbCgnTWluLiBMZW5ndGgnLCBzY2hlbWEubWluTGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNjaGVtYS5tYXhMZW5ndGgpIHsKKyAgICAgICAgb3B0aW9ucyArPSBoZWxwZXJzLm9wdGlvbkh0bWwoJ01heC4gTGVuZ3RoJywgc2NoZW1hLm1heExlbmd0aCk7CisgICAgICB9CisKKyAgICAgIGlmIChzY2hlbWEucGF0dGVybikgeworICAgICAgICBvcHRpb25zICs9IGhlbHBlcnMub3B0aW9uSHRtbCgnUmVnLiBFeHAuJywgc2NoZW1hLnBhdHRlcm4pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnaW50ZWdlcic6CisgICAgY2FzZSAnbnVtYmVyJzoKKyAgICAgIGlmIChzY2hlbWEubWluaW11bSkgeworICAgICAgICBvcHRpb25zICs9IGhlbHBlcnMub3B0aW9uSHRtbCgnTWluLiBWYWx1ZScsIHNjaGVtYS5taW5pbXVtKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7CisgICAgICAgIG9wdGlvbnMgKz0gaGVscGVycy5vcHRpb25IdG1sKCdFeGNsdXNpdmUgTWluLicsICd0cnVlJyk7CisgICAgICB9CisKKyAgICAgIGlmIChzY2hlbWEubWF4aW11bSkgeworICAgICAgICBvcHRpb25zICs9IGhlbHBlcnMub3B0aW9uSHRtbCgnTWF4LiBWYWx1ZScsIHNjaGVtYS5tYXhpbXVtKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKSB7CisgICAgICAgIG9wdGlvbnMgKz0gaGVscGVycy5vcHRpb25IdG1sKCdFeGNsdXNpdmUgTWF4LicsICd0cnVlJyk7CisgICAgICB9CisKKyAgICAgIGlmIChzY2hlbWEubXVsdGlwbGVPZikgeworICAgICAgICBvcHRpb25zICs9IGhlbHBlcnMub3B0aW9uSHRtbCgnTXVsdGlwbGUgT2YnLCBzY2hlbWEubXVsdGlwbGVPZik7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc0FycmF5KSB7CisgICAgICBpZiAoc2NoZW1hLm1pbkl0ZW1zKSB7CisgICAgICAgIG9wdGlvbnMgKz0gaGVscGVycy5vcHRpb25IdG1sKCdNaW4uIEl0ZW1zJywgc2NoZW1hLm1pbkl0ZW1zKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNjaGVtYS5tYXhJdGVtcykgeworICAgICAgICBvcHRpb25zICs9IGhlbHBlcnMub3B0aW9uSHRtbCgnTWF4LiBJdGVtcycsIHNjaGVtYS5tYXhJdGVtcyk7CisgICAgICB9CisKKyAgICAgIGlmIChzY2hlbWEudW5pcXVlSXRlbXMpIHsKKyAgICAgICAgb3B0aW9ucyArPSBoZWxwZXJzLm9wdGlvbkh0bWwoJ1VuaXF1ZSBJdGVtcycsICd0cnVlJyk7CisgICAgICB9CisKKyAgICAgIGlmIChzY2hlbWEuY29sbGVjdGlvbkZvcm1hdCkgeworICAgICAgICBvcHRpb25zICs9IGhlbHBlcnMub3B0aW9uSHRtbCgnQ29sbC4gRm9ybWF0Jywgc2NoZW1hLmNvbGxlY3Rpb25Gb3JtYXQpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcykpIHsKKyAgICAgIGlmIChfLmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7CisgICAgICAgIHZhciBlbnVtU3RyaW5nOworCisgICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnaW50ZWdlcicpIHsKKyAgICAgICAgICBlbnVtU3RyaW5nID0gc2NoZW1hLmVudW0uam9pbignLCAnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbnVtU3RyaW5nID0gJyInICsgc2NoZW1hLmVudW0uam9pbignIiwgIicpICsgJyInOworICAgICAgICB9CisKKyAgICAgICAgb3B0aW9ucyArPSBoZWxwZXJzLm9wdGlvbkh0bWwoJ0VudW0nLCBlbnVtU3RyaW5nKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICBodG1sID0gJzxzcGFuIGNsYXNzPSJwcm9wV3JhcCI+JyArIGh0bWwgKyAnPHRhYmxlIGNsYXNzPSJvcHRpb25zV3JhcHBlciI+PHRyPjx0aCBjb2xzcGFuPSIyIj4nICsgdHlwZSArICc8L3RoPjwvdHI+JyArIG9wdGlvbnMgKyAnPC90YWJsZT48L3NwYW4+JzsKKyAgICB9CisKKyAgICByZXR1cm4gaHRtbDsKKyAgfTsKKyAgdmFyIHByb2Nlc3NNb2RlbCA9IGZ1bmN0aW9uIChzY2hlbWEsIG5hbWUpIHsKKyAgICB2YXIgdHlwZSA9IHNjaGVtYS50eXBlIHx8ICdvYmplY3QnOworICAgIHZhciBpc0FycmF5ID0gc2NoZW1hLnR5cGUgPT09ICdhcnJheSc7CisgICAgdmFyIGh0bWwgPSBzdHJvbmdPcGVuICsgbmFtZSArICcgJyArIChpc0FycmF5ID8gJ1snIDogJ3snKSArIHN0cm9uZ0Nsb3NlOworCisgICAgaWYgKG5hbWUpIHsKKyAgICAgIHNlZW5Nb2RlbHMucHVzaChuYW1lKTsKKyAgICB9CisKKyAgICBpZiAoaXNBcnJheSkgeworICAgICAgaWYgKF8uaXNBcnJheShzY2hlbWEuaXRlbXMpKSB7CisgICAgICAgIGh0bWwgKz0gJzxkaXY+JyArIF8ubWFwKHNjaGVtYS5pdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgICB2YXIgdHlwZSA9IGl0ZW0udHlwZSB8fCAnb2JqZWN0JzsKKworICAgICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKGl0ZW0uJHJlZikpIHsKKyAgICAgICAgICAgIGlmIChfLmluZGV4T2YoWydhcnJheScsICdvYmplY3QnXSwgdHlwZSkgPiAtMSkgeworICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgXy5pc1VuZGVmaW5lZChpdGVtLnByb3BlcnRpZXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICdvYmplY3QnOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBhZGRSZWZlcmVuY2UoaXRlbSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVUb09wdGlvbnNIVE1MKGl0ZW0sIHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYWRkUmVmZXJlbmNlKGl0ZW0sIGhlbHBlcnMuc2ltcGxlUmVmKGl0ZW0uJHJlZikpOworICAgICAgICAgIH0KKyAgICAgICAgfSkuam9pbignLDwvZGl2PjxkaXY+Jyk7CisgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChzY2hlbWEuaXRlbXMpKSB7CisgICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcy4kcmVmKSkgeworICAgICAgICAgIGlmIChfLmluZGV4T2YoWydhcnJheScsICdvYmplY3QnXSwgc2NoZW1hLml0ZW1zLnR5cGUgfHwgJ29iamVjdCcpID4gLTEpIHsKKyAgICAgICAgICAgIGlmICgoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMudHlwZSkgfHwgc2NoZW1hLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSAmJiBfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKSkgeworICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2Pm9iamVjdDwvZGl2Pic7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBhZGRSZWZlcmVuY2Uoc2NoZW1hLml0ZW1zKSArICc8L2Rpdj4nOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBwcmltaXRpdmVUb09wdGlvbnNIVE1MKHNjaGVtYS5pdGVtcywgc2NoZW1hLml0ZW1zLnR5cGUpICsgJzwvZGl2Pic7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGh0bWwgKz0gJzxkaXY+JyArIGFkZFJlZmVyZW5jZShzY2hlbWEuaXRlbXMsIGhlbHBlcnMuc2ltcGxlUmVmKHNjaGVtYS5pdGVtcy4kcmVmKSkgKyAnPC9kaXY+JzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaGVscGVycy5sb2coJ0FycmF5IHR5cGVcJ3MgXCdpdGVtc1wnIHByb3BlcnR5IGlzIG5vdCBhbiBhcnJheSBvciBhbiBvYmplY3QsIGNhbm5vdCBwcm9jZXNzJyk7CisgICAgICAgIGh0bWwgKz0gJzxkaXY+b2JqZWN0PC9kaXY+JzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNjaGVtYS4kcmVmKSB7CisgICAgICAgIGh0bWwgKz0gJzxkaXY+JyArIGFkZFJlZmVyZW5jZShzY2hlbWEsIG5hbWUpICsgJzwvZGl2Pic7CisgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7CisgICAgICAgIGh0bWwgKz0gJzxkaXY+JzsKKworICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5wcm9wZXJ0aWVzKSkgeworICAgICAgICAgIGh0bWwgKz0gXy5tYXAoc2NoZW1hLnByb3BlcnRpZXMsIGZ1bmN0aW9uIChwcm9wZXJ0eSwgbmFtZSkgeworICAgICAgICAgICAgdmFyIHJlcXVpcmVkID0gXy5pbmRleE9mKHNjaGVtYS5yZXF1aXJlZCB8fCBbXSwgbmFtZSkgPiAtMTsKKyAgICAgICAgICAgIHZhciBodG1sID0gJzxzcGFuIGNsYXNzPSJwcm9wTmFtZSAnICsgcmVxdWlyZWQgKyAnIj4nICsgbmFtZSArICc8L3NwYW4+ICgnOworCisgICAgICAgICAgICBodG1sICs9IHByaW1pdGl2ZVRvSFRNTChwcm9wZXJ0eSk7CisKKyAgICAgICAgICAgIGlmICghcmVxdWlyZWQpIHsKKyAgICAgICAgICAgICAgaHRtbCArPSAnLCA8c3BhbiBjbGFzcz0icHJvcE9wdEtleSI+b3B0aW9uYWw8L3NwYW4+JzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHRtbCArPSAnKSc7CisKKyAgICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChwcm9wZXJ0eS5kZXNjcmlwdGlvbikpIHsKKyAgICAgICAgICAgICAgaHRtbCArPSAnOiAnICsgcHJvcGVydHkuZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lbnVtKSB7CisgICAgICAgICAgICAgIGh0bWwgKz0gJyA9IDxzcGFuIGNsYXNzPSJwcm9wVmFscyI+W1wnJyArIHByb3BlcnR5LmVudW0uam9pbignXCcgb3IgXCcnKSArICdcJ108L3NwYW4+JzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVRvT3B0aW9uc0hUTUwocHJvcGVydHksIGh0bWwpOworICAgICAgICAgIH0pLmpvaW4oJyw8L2Rpdj48ZGl2PicpOworICAgICAgICB9CisKKyAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh0bWwgPSAnPGRpdj4nICsgcHJpbWl0aXZlVG9PcHRpb25zSFRNTChzY2hlbWEsIHR5cGUpICsgJzwvZGl2Pic7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGh0bWwgKyBzdHJvbmdPcGVuICsgKGlzQXJyYXkgPyAnXScgOiAnfScpICsgc3Ryb25nQ2xvc2U7CisgIH07CisKKyAgCisgIC8vIEdlbmVyYXRlIGN1cnJlbnQgSFRNTAorICB2YXIgaHRtbCA9IHByb2Nlc3NNb2RlbChzY2hlbWEsIG5hbWUpOworICAKKyAgLy8gR2VuZXJhdGUgcmVmZXJlbmNlcyBIVE1MCisgIHdoaWxlIChfLmtleXMocmVmZXJlbmNlcykubGVuZ3RoID4gMCkgeworICAgIF8uZm9yRWFjaChyZWZlcmVuY2VzLCBmdW5jdGlvbiAoc2NoZW1hLCBuYW1lKSB7CisgICAgICB2YXIgc2Vlbk1vZGVsID0gXy5pbmRleE9mKHNlZW5Nb2RlbHMsIG5hbWUpID4gLTE7CisKKyAgICAgIGRlbGV0ZSByZWZlcmVuY2VzW25hbWVdOworCisgICAgICBpZiAoIXNlZW5Nb2RlbCkgeworICAgICAgICBzZWVuTW9kZWxzLnB1c2gobmFtZSk7CisKKyAgICAgICAgaHRtbCArPSAnPGJyIC8+JyArIHByb2Nlc3NNb2RlbChzY2hlbWEsIG5hbWUpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcmV0dXJuIGh0bWw7Cit9OworCit2YXIgc2NoZW1hVG9KU09OID0gZnVuY3Rpb24gKHNjaGVtYSwgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSkgeworICB2YXIgdHlwZSA9IHNjaGVtYS50eXBlIHx8ICdvYmplY3QnOworICB2YXIgbW9kZWw7CisgIHZhciBvdXRwdXQ7CisKKyAgaWYgKHNjaGVtYS5leGFtcGxlKSB7CisgICAgb3V0cHV0ID0gc2NoZW1hLmV4YW1wbGU7CisgIH0gZWxzZSBpZiAoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMpICYmIF8uaXNBcnJheShzY2hlbWEuZW51bSkpIHsKKyAgICBvdXRwdXQgPSBzY2hlbWEuZW51bVswXTsKKyAgfQorCisgIGlmIChfLmlzVW5kZWZpbmVkKG91dHB1dCkpIHsKKyAgICBpZiAoc2NoZW1hLiRyZWYpIHsKKyAgICAgIG1vZGVsID0gbW9kZWxzW2hlbHBlcnMuc2ltcGxlUmVmKHNjaGVtYS4kcmVmKV07CisKKyAgICAgIGlmICghXy5pc1VuZGVmaW5lZChtb2RlbCkpIHsKKyAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQobW9kZWxzVG9JZ25vcmVbbW9kZWwubmFtZV0pKSB7CisgICAgICAgICAgbW9kZWxzVG9JZ25vcmVbbW9kZWwubmFtZV0gPSBtb2RlbDsKKyAgICAgICAgICBvdXRwdXQgPSBzY2hlbWFUb0pTT04obW9kZWwuZGVmaW5pdGlvbiwgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSk7CisgICAgICAgICAgZGVsZXRlIG1vZGVsc1RvSWdub3JlW21vZGVsLm5hbWVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChtb2RlbC50eXBlID09PSAnYXJyYXknKSB7CisgICAgICAgICAgICBvdXRwdXQgPSBbXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0cHV0ID0ge307CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzY2hlbWEuZGVmYXVsdCkgeworICAgICAgb3V0cHV0ID0gc2NoZW1hLmRlZmF1bHQ7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGF0ZS10aW1lJykgeworICAgICAgb3V0cHV0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RhdGUnKSB7CisgICAgICBvdXRwdXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgICBvdXRwdXQgPSAnc3RyaW5nJzsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlZ2VyJykgeworICAgICAgb3V0cHV0ID0gMDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdsb25nJykgeworICAgICAgb3V0cHV0ID0gMDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmbG9hdCcpIHsKKyAgICAgIG91dHB1dCA9IDAuMDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkb3VibGUnKSB7CisgICAgICBvdXRwdXQgPSAwLjA7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHsKKyAgICAgIG91dHB1dCA9IHRydWU7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JykgeworICAgICAgb3V0cHV0ID0ge307CisKKyAgICAgIF8uZm9yRWFjaChzY2hlbWEucHJvcGVydGllcywgZnVuY3Rpb24gKHByb3BlcnR5LCBuYW1lKSB7CisgICAgICAgIG91dHB1dFtuYW1lXSA9IHNjaGVtYVRvSlNPTihwcm9wZXJ0eSwgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSk7CisgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJheScpIHsKKyAgICAgIG91dHB1dCA9IFtdOworCisgICAgICBpZiAoXy5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHsKKyAgICAgICAgXy5mb3JFYWNoKHNjaGVtYS5pdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgICBvdXRwdXQucHVzaChzY2hlbWFUb0pTT04oaXRlbSwgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSkpOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5pdGVtcykpIHsKKyAgICAgICAgb3V0cHV0LnB1c2goc2NoZW1hVG9KU09OKHNjaGVtYS5pdGVtcywgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSkpOworICAgICAgfSBlbHNlIGlmIChfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcykpIHsKKyAgICAgICAgb3V0cHV0LnB1c2goe30pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaGVscGVycy5sb2coJ0FycmF5IHR5cGVcJ3MgXCdpdGVtc1wnIHByb3BlcnR5IGlzIG5vdCBhbiBhcnJheSBvciBhbiBvYmplY3QsIGNhbm5vdCBwcm9jZXNzJyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dHB1dDsKK307CisKK01vZGVsLnByb3RvdHlwZS5jcmVhdGVKU09OU2FtcGxlID0gTW9kZWwucHJvdG90eXBlLmdldFNhbXBsZVZhbHVlID0gZnVuY3Rpb24gKG1vZGVsc1RvSWdub3JlKSB7CisgIG1vZGVsc1RvSWdub3JlID0gbW9kZWxzVG9JZ25vcmUgfHwge307CisKKyAgbW9kZWxzVG9JZ25vcmVbdGhpcy5uYW1lXSA9IHRoaXM7CisKKyAgLy8gUmVzcG9uc2Ugc3VwcG9ydAorICBpZiAodGhpcy5leGFtcGxlcyAmJiBfLmlzUGxhaW5PYmplY3QodGhpcy5leGFtcGxlcykgJiYgdGhpcy5leGFtcGxlc1snYXBwbGljYXRpb24vanNvbiddKSB7CisgICAgdGhpcy5kZWZpbml0aW9uLmV4YW1wbGUgPSB0aGlzLmV4YW1wbGVzWydhcHBsaWNhdGlvbi9qc29uJ107CisKKyAgICBpZiAoXy5pc1N0cmluZyh0aGlzLmRlZmluaXRpb24uZXhhbXBsZSkpIHsKKyAgICAgIHRoaXMuZGVmaW5pdGlvbi5leGFtcGxlID0gSlNPTi5wYXJzZSh0aGlzLmRlZmluaXRpb24uZXhhbXBsZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHRoaXMuZGVmaW5pdGlvbi5leGFtcGxlID0gdGhpcy5leGFtcGxlczsKKyAgfQorCisgIAorICByZXR1cm4gc2NoZW1hVG9KU09OKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5tb2RlbHMsIG1vZGVsc1RvSWdub3JlKTsKK307CisKK01vZGVsLnByb3RvdHlwZS5nZXRNb2NrU2lnbmF0dXJlID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gc2NoZW1hVG9IVE1MKHRoaXMubmFtZSwgdGhpcy5kZWZpbml0aW9uLCB0aGlzLm1vZGVscyk7Cit9OworCit9LHsiLi4vaGVscGVycyI6NCwibG9kYXNoLWNvbXBhdC9hcnJheS9pbmRleE9mIjoxOSwibG9kYXNoLWNvbXBhdC9jb2xsZWN0aW9uL2ZvckVhY2giOjIyLCJsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vbWFwIjoyMywibG9kYXNoLWNvbXBhdC9sYW5nL2lzQXJyYXkiOjk2LCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNQbGFpbk9iamVjdCI6MTAwLCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNTdHJpbmciOjEwMSwibG9kYXNoLWNvbXBhdC9sYW5nL2lzVW5kZWZpbmVkIjoxMDMsImxvZGFzaC1jb21wYXQvb2JqZWN0L2tleXMiOjEwNH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworJ3VzZSBzdHJpY3QnOworCit2YXIgXyA9IHsKKyAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc1VuZGVmaW5lZCcpCit9OwordmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuLi9oZWxwZXJzJyk7Cit2YXIgTW9kZWwgPSByZXF1aXJlKCcuL21vZGVsJyk7Cit2YXIgU3dhZ2dlckh0dHAgPSByZXF1aXJlKCcuLi9odHRwJyk7CisKK3ZhciBPcGVyYXRpb24gPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXJlbnQsIHNjaGVtZSwgb3BlcmF0aW9uSWQsIGh0dHBNZXRob2QsIHBhdGgsIGFyZ3MsIGRlZmluaXRpb25zLCBtb2RlbHMsIGNsaWVudEF1dGhvcml6YXRpb25zKSB7CisgIHZhciBlcnJvcnMgPSBbXTsKKworICBwYXJlbnQgPSBwYXJlbnQgfHwge307CisgIGFyZ3MgPSBhcmdzIHx8IHt9OworCisgIHRoaXMuYXV0aG9yaXphdGlvbnMgPSBhcmdzLnNlY3VyaXR5OworICB0aGlzLmJhc2VQYXRoID0gcGFyZW50LmJhc2VQYXRoIHx8ICcvJzsKKyAgdGhpcy5jbGllbnRBdXRob3JpemF0aW9ucyA9IGNsaWVudEF1dGhvcml6YXRpb25zOworICB0aGlzLmNvbnN1bWVzID0gYXJncy5jb25zdW1lczsKKyAgdGhpcy5kZXByZWNhdGVkID0gYXJncy5kZXByZWNhdGVkOworICB0aGlzLmRlc2NyaXB0aW9uID0gYXJncy5kZXNjcmlwdGlvbjsKKyAgdGhpcy5ob3N0ID0gcGFyZW50Lmhvc3QgfHwgJ2xvY2FsaG9zdCc7CisgIHRoaXMubWV0aG9kID0gKGh0dHBNZXRob2QgfHwgZXJyb3JzLnB1c2goJ09wZXJhdGlvbiAnICsgb3BlcmF0aW9uSWQgKyAnIGlzIG1pc3NpbmcgbWV0aG9kLicpKTsKKyAgdGhpcy5tb2RlbHMgPSBtb2RlbHMgfHwge307CisgIHRoaXMubmlja25hbWUgPSAob3BlcmF0aW9uSWQgfHwgZXJyb3JzLnB1c2goJ09wZXJhdGlvbnMgbXVzdCBoYXZlIGEgbmlja25hbWUuJykpOworICB0aGlzLm9wZXJhdGlvbiA9IGFyZ3M7CisgIHRoaXMub3BlcmF0aW9ucyA9IHt9OworICB0aGlzLnBhcmFtZXRlcnMgPSBhcmdzICE9PSBudWxsID8gKGFyZ3MucGFyYW1ldGVycyB8fCBbXSkgOiB7fTsKKyAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgIHRoaXMucGF0aCA9IChwYXRoIHx8IGVycm9ycy5wdXNoKCdPcGVyYXRpb24gJyArIHRoaXMubmlja25hbWUgKyAnIGlzIG1pc3NpbmcgcGF0aC4nKSk7CisgIHRoaXMucHJvZHVjZXMgPSBhcmdzLnByb2R1Y2VzOworICB0aGlzLnJlc3BvbnNlcyA9IChhcmdzLnJlc3BvbnNlcyB8fCB7fSk7CisgIHRoaXMuc2NoZW1lID0gc2NoZW1lIHx8IHBhcmVudC5zY2hlbWUgfHwgJ2h0dHAnOworICB0aGlzLnNjaGVtZXMgPSBwYXJlbnQuc2NoZW1lczsKKyAgdGhpcy5zZWN1cml0eSA9IGFyZ3Muc2VjdXJpdHk7CisgIHRoaXMuc3VtbWFyeSA9IGFyZ3Muc3VtbWFyeSB8fCAnJzsKKyAgdGhpcy50eXBlID0gbnVsbDsKKyAgdGhpcy51c2VKUXVlcnkgPSBwYXJlbnQudXNlSlF1ZXJ5OworCisgIGlmICh0eXBlb2YgdGhpcy5kZXByZWNhdGVkID09PSAnc3RyaW5nJykgeworICAgIHN3aXRjaCh0aGlzLmRlcHJlY2F0ZWQudG9Mb3dlckNhc2UoKSkgeworICAgICAgY2FzZSAndHJ1ZSc6IGNhc2UgJ3llcyc6IGNhc2UgJzEnOiB7CisgICAgICAgIHRoaXMuZGVwcmVjYXRlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlICdmYWxzZSc6IGNhc2UgJ25vJzogY2FzZSAnMCc6IGNhc2UgbnVsbDogeworICAgICAgICB0aGlzLmRlcHJlY2F0ZWQgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHRoaXMuZGVwcmVjYXRlZCA9IEJvb2xlYW4odGhpcy5kZXByZWNhdGVkKTsKKyAgICB9CisgIH0KKworICB2YXIgaSwgbW9kZWw7CisKKyAgaWYgKGRlZmluaXRpb25zKSB7CisgICAgLy8gYWRkIHRvIGdsb2JhbCBtb2RlbHMKKyAgICB2YXIga2V5OworCisgICAgZm9yIChrZXkgaW4gdGhpcy5kZWZpbml0aW9ucykgeworICAgICAgbW9kZWwgPSBuZXcgTW9kZWwoa2V5LCBkZWZpbml0aW9uc1trZXldLCB0aGlzLm1vZGVscyk7CisKKyAgICAgIGlmIChtb2RlbCkgeworICAgICAgICB0aGlzLm1vZGVsc1trZXldID0gbW9kZWw7CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtZXRlcnNbaV07CisKKyAgICBpZiAocGFyYW0udHlwZSA9PT0gJ2FycmF5JykgeworICAgICAgcGFyYW0uaXNMaXN0ID0gdHJ1ZTsKKyAgICAgIHBhcmFtLmFsbG93TXVsdGlwbGUgPSB0cnVlOworICAgIH0KKworICAgIHZhciBpbm5lclR5cGUgPSB0aGlzLmdldFR5cGUocGFyYW0pOworCisgICAgaWYgKGlubmVyVHlwZSAmJiBpbm5lclR5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAnYm9vbGVhbicpIHsKKyAgICAgIHBhcmFtLmFsbG93YWJsZVZhbHVlcyA9IHt9OworICAgICAgcGFyYW0uaXNMaXN0ID0gdHJ1ZTsKKyAgICAgIHBhcmFtWydlbnVtJ10gPSBbJ3RydWUnLCAnZmFsc2UnXTsKKyAgICB9CisKKyAgICBpZiAodHlwZW9mIHBhcmFtWydlbnVtJ10gIT09ICd1bmRlZmluZWQnKSB7CisgICAgICB2YXIgaWQ7CisKKyAgICAgIHBhcmFtLmFsbG93YWJsZVZhbHVlcyA9IHt9OworICAgICAgcGFyYW0uYWxsb3dhYmxlVmFsdWVzLnZhbHVlcyA9IFtdOworICAgICAgcGFyYW0uYWxsb3dhYmxlVmFsdWVzLmRlc2NyaXB0aXZlVmFsdWVzID0gW107CisKKyAgICAgIGZvciAoaWQgPSAwOyBpZCA8IHBhcmFtWydlbnVtJ10ubGVuZ3RoOyBpZCsrKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IHBhcmFtWydlbnVtJ11baWRdOworICAgICAgICB2YXIgaXNEZWZhdWx0ID0gKHZhbHVlID09PSBwYXJhbS5kZWZhdWx0KSA/IHRydWUgOiBmYWxzZTsKKworICAgICAgICBwYXJhbS5hbGxvd2FibGVWYWx1ZXMudmFsdWVzLnB1c2godmFsdWUpOworICAgICAgICBwYXJhbS5hbGxvd2FibGVWYWx1ZXMuZGVzY3JpcHRpdmVWYWx1ZXMucHVzaCh7dmFsdWUgOiB2YWx1ZSwgaXNEZWZhdWx0OiBpc0RlZmF1bHR9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyYW0udHlwZSA9PT0gJ2FycmF5JykgeworICAgICAgaW5uZXJUeXBlID0gW2lubmVyVHlwZV07CisKKyAgICAgIGlmICh0eXBlb2YgcGFyYW0uYWxsb3dhYmxlVmFsdWVzID09PSAndW5kZWZpbmVkJykgeworICAgICAgICAvLyBjYW4ndCBzaG93IGFzIGEgbGlzdCBpZiBubyB2YWx1ZXMgdG8gc2VsZWN0IGZyb20KKyAgICAgICAgZGVsZXRlIHBhcmFtLmlzTGlzdDsKKyAgICAgICAgZGVsZXRlIHBhcmFtLmFsbG93TXVsdGlwbGU7CisgICAgICB9CisgICAgfQorCisgICAgcGFyYW0uc2lnbmF0dXJlID0gdGhpcy5nZXRNb2RlbFNpZ25hdHVyZShpbm5lclR5cGUsIHRoaXMubW9kZWxzKS50b1N0cmluZygpOworICAgIHBhcmFtLnNhbXBsZUpTT04gPSB0aGlzLmdldE1vZGVsU2FtcGxlSlNPTihpbm5lclR5cGUsIHRoaXMubW9kZWxzKTsKKyAgICBwYXJhbS5yZXNwb25zZUNsYXNzU2lnbmF0dXJlID0gcGFyYW0uc2lnbmF0dXJlOworICB9CisKKyAgdmFyIGRlZmF1bHRSZXNwb25zZUNvZGUsIHJlc3BvbnNlLCByZXNwb25zZXMgPSB0aGlzLnJlc3BvbnNlczsKKworICBpZiAocmVzcG9uc2VzWycyMDAnXSkgeworICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWycyMDAnXTsKKyAgICBkZWZhdWx0UmVzcG9uc2VDb2RlID0gJzIwMCc7CisgIH0gZWxzZSBpZiAocmVzcG9uc2VzWycyMDEnXSkgeworICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWycyMDEnXTsKKyAgICBkZWZhdWx0UmVzcG9uc2VDb2RlID0gJzIwMSc7CisgIH0gZWxzZSBpZiAocmVzcG9uc2VzWycyMDInXSkgeworICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWycyMDInXTsKKyAgICBkZWZhdWx0UmVzcG9uc2VDb2RlID0gJzIwMic7CisgIH0gZWxzZSBpZiAocmVzcG9uc2VzWycyMDMnXSkgeworICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWycyMDMnXTsKKyAgICBkZWZhdWx0UmVzcG9uc2VDb2RlID0gJzIwMyc7CisgIH0gZWxzZSBpZiAocmVzcG9uc2VzWycyMDQnXSkgeworICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWycyMDQnXTsKKyAgICBkZWZhdWx0UmVzcG9uc2VDb2RlID0gJzIwNCc7CisgIH0gZWxzZSBpZiAocmVzcG9uc2VzWycyMDUnXSkgeworICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWycyMDUnXTsKKyAgICBkZWZhdWx0UmVzcG9uc2VDb2RlID0gJzIwNSc7CisgIH0gZWxzZSBpZiAocmVzcG9uc2VzWycyMDYnXSkgeworICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWycyMDYnXTsKKyAgICBkZWZhdWx0UmVzcG9uc2VDb2RlID0gJzIwNic7CisgIH0gZWxzZSBpZiAocmVzcG9uc2VzWydkZWZhdWx0J10pIHsKKyAgICByZXNwb25zZSA9IHJlc3BvbnNlc1snZGVmYXVsdCddOworICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnZGVmYXVsdCc7CisgIH0KKyAgCisgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zY2hlbWEpIHsKKyAgICB2YXIgcmVzb2x2ZWRNb2RlbCA9IHRoaXMucmVzb2x2ZU1vZGVsKHJlc3BvbnNlLnNjaGVtYSwgZGVmaW5pdGlvbnMpOworICAgIHZhciBzdWNjZXNzUmVzcG9uc2U7CisKKyAgICBkZWxldGUgcmVzcG9uc2VzW2RlZmF1bHRSZXNwb25zZUNvZGVdOworCisgICAgaWYgKHJlc29sdmVkTW9kZWwpIHsKKyAgICAgIHRoaXMuc3VjY2Vzc1Jlc3BvbnNlID0ge307CisgICAgICBzdWNjZXNzUmVzcG9uc2UgPSB0aGlzLnN1Y2Nlc3NSZXNwb25zZVtkZWZhdWx0UmVzcG9uc2VDb2RlXSA9IHJlc29sdmVkTW9kZWw7IAorICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlLnNjaGVtYS50eXBlIHx8IHJlc3BvbnNlLnNjaGVtYS50eXBlID09PSAnb2JqZWN0JyB8fCByZXNwb25zZS5zY2hlbWEudHlwZSA9PT0gJ2FycmF5JykgeworICAgICAgLy8gSW5saW5lIG1vZGVsCisgICAgICB0aGlzLnN1Y2Nlc3NSZXNwb25zZSA9IHt9OworICAgICAgc3VjY2Vzc1Jlc3BvbnNlID0gdGhpcy5zdWNjZXNzUmVzcG9uc2VbZGVmYXVsdFJlc3BvbnNlQ29kZV0gPSBuZXcgTW9kZWwodW5kZWZpbmVkLCByZXNwb25zZS5zY2hlbWEgfHwge30sIHRoaXMubW9kZWxzKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gUHJpbWl0aXZlCisgICAgICB0aGlzLnN1Y2Nlc3NSZXNwb25zZSA9IHt9OworICAgICAgc3VjY2Vzc1Jlc3BvbnNlID0gdGhpcy5zdWNjZXNzUmVzcG9uc2VbZGVmYXVsdFJlc3BvbnNlQ29kZV0gPSByZXNwb25zZS5zY2hlbWE7CisgICAgfQorCisgICAgaWYgKHN1Y2Nlc3NSZXNwb25zZSkgeworICAgICAgLy8gQXR0YWNoIHJlc3BvbnNlIHByb3BlcnRpZXMKKyAgICAgIGlmIChyZXNwb25zZS5kZXNjcmlwdGlvbikgeworICAgICAgICBzdWNjZXNzUmVzcG9uc2UuZGVzY3JpcHRpb24gPSByZXNwb25zZS5kZXNjcmlwdGlvbjsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc3BvbnNlLmV4YW1wbGVzKSB7CisgICAgICAgIHN1Y2Nlc3NSZXNwb25zZS5leGFtcGxlcyA9IHJlc3BvbnNlLmV4YW1wbGVzOworICAgICAgfQorCisgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycykgeworICAgICAgICBzdWNjZXNzUmVzcG9uc2UuaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy50eXBlID0gcmVzcG9uc2U7CisgIH0KKworICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHsKKyAgICBpZiAodGhpcy5yZXNvdXJjZSAmJiB0aGlzLnJlc291cmNlLmFwaSAmJiB0aGlzLnJlc291cmNlLmFwaS5mYWlsKSB7CisgICAgICB0aGlzLnJlc291cmNlLmFwaS5mYWlsKGVycm9ycyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRoaXM7Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLmdldFR5cGUgPSBmdW5jdGlvbiAocGFyYW0pIHsKKyAgdmFyIHR5cGUgPSBwYXJhbS50eXBlOworICB2YXIgZm9ybWF0ID0gcGFyYW0uZm9ybWF0OworICB2YXIgaXNBcnJheSA9IGZhbHNlOworICB2YXIgc3RyOworCisgIGlmICh0eXBlID09PSAnaW50ZWdlcicgJiYgZm9ybWF0ID09PSAnaW50MzInKSB7CisgICAgc3RyID0gJ2ludGVnZXInOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlZ2VyJyAmJiBmb3JtYXQgPT09ICdpbnQ2NCcpIHsKKyAgICBzdHIgPSAnbG9uZyc7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludGVnZXInKSB7CisgICAgc3RyID0gJ2ludGVnZXInOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtdGltZScpIHsKKyAgICAgIHN0ciA9ICdkYXRlLXRpbWUnOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGF0ZScpIHsKKyAgICAgIHN0ciA9ICdkYXRlJzsKKyAgICB9IGVsc2UgeworICAgICAgc3RyID0gJ3N0cmluZyc7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGZvcm1hdCA9PT0gJ2Zsb2F0JykgeworICAgIHN0ciA9ICdmbG9hdCc7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgZm9ybWF0ID09PSAnZG91YmxlJykgeworICAgIHN0ciA9ICdkb3VibGUnOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7CisgICAgc3RyID0gJ2RvdWJsZSc7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKSB7CisgICAgc3RyID0gJ2Jvb2xlYW4nOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJheScpIHsKKyAgICBpc0FycmF5ID0gdHJ1ZTsKKworICAgIGlmIChwYXJhbS5pdGVtcykgeworICAgICAgc3RyID0gdGhpcy5nZXRUeXBlKHBhcmFtLml0ZW1zKTsKKyAgICB9CisgIH0KKworICBpZiAocGFyYW0uJHJlZikgeworICAgIHN0ciA9IHBhcmFtLiRyZWY7CisgIH0KKworICB2YXIgc2NoZW1hID0gcGFyYW0uc2NoZW1hOworCisgIGlmIChzY2hlbWEpIHsKKyAgICB2YXIgcmVmID0gc2NoZW1hLiRyZWY7CisKKyAgICBpZiAocmVmKSB7CisgICAgICByZWYgPSBoZWxwZXJzLnNpbXBsZVJlZihyZWYpOworCisgICAgICBpZiAoaXNBcnJheSkgeworICAgICAgICByZXR1cm4gWyByZWYgXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZWY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0aGlzLmdldFR5cGUoc2NoZW1hKTsKKyAgICB9CisgIH0KKyAgaWYgKGlzQXJyYXkpIHsKKyAgICByZXR1cm4gWyBzdHIgXTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RyOworICB9Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLnJlc29sdmVNb2RlbCA9IGZ1bmN0aW9uIChzY2hlbWEsIGRlZmluaXRpb25zKSB7CisgIGlmICh0eXBlb2Ygc2NoZW1hLiRyZWYgIT09ICd1bmRlZmluZWQnKSB7CisgICAgdmFyIHJlZiA9IHNjaGVtYS4kcmVmOworCisgICAgaWYgKHJlZi5pbmRleE9mKCcjL2RlZmluaXRpb25zLycpID09PSAwKSB7CisgICAgICByZWYgPSByZWYuc3Vic3RyaW5nKCcjL2RlZmluaXRpb25zLycubGVuZ3RoKTsKKyAgICB9CisKKyAgICBpZiAoZGVmaW5pdGlvbnNbcmVmXSkgeworICAgICAgcmV0dXJuIG5ldyBNb2RlbChyZWYsIGRlZmluaXRpb25zW3JlZl0sIHRoaXMubW9kZWxzKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc2NoZW1hLnR5cGUgPT09ICdvYmplY3QnIHx8IF8uaXNVbmRlZmluZWQoc2NoZW1hLnR5cGUpKSB7CisgICAgcmV0dXJuIG5ldyBNb2RlbCh1bmRlZmluZWQsIHNjaGVtYSwgdGhpcy5tb2RlbHMpOworICB9CisKKyAgcmV0dXJuIG51bGw7Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLmhlbHAgPSBmdW5jdGlvbiAoZG9udFByaW50KSB7CisgIHZhciBvdXQgPSB0aGlzLm5pY2tuYW1lICsgJzogJyArIHRoaXMuc3VtbWFyeSArICdcbic7CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtZXRlcnNbaV07CisgICAgdmFyIHR5cGVJbmZvID0gcGFyYW0uc2lnbmF0dXJlOworCisgICAgb3V0ICs9ICdcbiAgKiAnICsgcGFyYW0ubmFtZSArICcgKCcgKyB0eXBlSW5mbyArICcpOiAnICsgcGFyYW0uZGVzY3JpcHRpb247CisgIH0KKworICBpZiAodHlwZW9mIGRvbnRQcmludCA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICBoZWxwZXJzLmxvZyhvdXQpOworICB9CisKKyAgcmV0dXJuIG91dDsKK307CisKK09wZXJhdGlvbi5wcm90b3R5cGUuZ2V0TW9kZWxTaWduYXR1cmUgPSBmdW5jdGlvbiAodHlwZSwgZGVmaW5pdGlvbnMpIHsKKyAgdmFyIGlzUHJpbWl0aXZlLCBsaXN0VHlwZTsKKworICBpZiAodHlwZSBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgbGlzdFR5cGUgPSB0cnVlOworICAgIHR5cGUgPSB0eXBlWzBdOworICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJykgeworICAgIHR5cGUgPSAndW5kZWZpbmVkJzsKKyAgfQorCisgIGlmICh0eXBlID09PSAnc3RyaW5nJykgeworICAgIGlzUHJpbWl0aXZlID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBpc1ByaW1pdGl2ZSA9IChsaXN0VHlwZSAmJiBkZWZpbml0aW9uc1tsaXN0VHlwZV0pIHx8IChkZWZpbml0aW9uc1t0eXBlXSkgPyBmYWxzZSA6IHRydWU7CisgIH0KKworICBpZiAoaXNQcmltaXRpdmUpIHsKKyAgICBpZiAobGlzdFR5cGUpIHsKKyAgICAgIHJldHVybiAnQXJyYXlbJyArIHR5cGUgKyAnXSc7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlLnRvU3RyaW5nKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChsaXN0VHlwZSkgeworICAgICAgcmV0dXJuICdBcnJheVsnICsgZGVmaW5pdGlvbnNbdHlwZV0uZ2V0TW9ja1NpZ25hdHVyZSgpICsgJ10nOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZGVmaW5pdGlvbnNbdHlwZV0uZ2V0TW9ja1NpZ25hdHVyZSgpOworICAgIH0KKyAgfQorfTsKKworT3BlcmF0aW9uLnByb3RvdHlwZS5zdXBwb3J0SGVhZGVyUGFyYW1zID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKK09wZXJhdGlvbi5wcm90b3R5cGUuc3VwcG9ydGVkU3VibWl0TWV0aG9kcyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRoaXMucGFyZW50LnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHM7Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLmdldEhlYWRlclBhcmFtcyA9IGZ1bmN0aW9uIChhcmdzKSB7CisgIHZhciBoZWFkZXJzID0gdGhpcy5zZXRDb250ZW50VHlwZXMoYXJncywge30pOworCisgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzW2ldOworCisgICAgaWYgKHR5cGVvZiBhcmdzW3BhcmFtLm5hbWVdICE9PSAndW5kZWZpbmVkJykgeworICAgICAgaWYgKHBhcmFtLmluID09PSAnaGVhZGVyJykgeworICAgICAgICB2YXIgdmFsdWUgPSBhcmdzW3BhcmFtLm5hbWVdOworCisgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgeworICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlcnNbcGFyYW0ubmFtZV0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gaGVhZGVyczsKK307CisKK09wZXJhdGlvbi5wcm90b3R5cGUudXJsaWZ5ID0gZnVuY3Rpb24gKGFyZ3MpIHsKKyAgdmFyIGZvcm1QYXJhbXMgPSB7fTsKKyAgdmFyIHJlcXVlc3RVcmwgPSB0aGlzLnBhdGg7CisgIHZhciBxdWVyeXN0cmluZyA9ICcnOyAvLyBncmFiIHBhcmFtcyBmcm9tIHRoZSBhcmdzLCBidWlsZCB0aGUgcXVlcnlzdHJpbmcgYWxvbmcgdGhlIHdheQorCisgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzW2ldOworCisgICAgaWYgKHR5cGVvZiBhcmdzW3BhcmFtLm5hbWVdICE9PSAndW5kZWZpbmVkJykgeworICAgICAgaWYgKHBhcmFtLmluID09PSAncGF0aCcpIHsKKyAgICAgICAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoJ1x7JyArIHBhcmFtLm5hbWUgKyAnXH0nLCAnZ2knKTsKKyAgICAgICAgdmFyIHZhbHVlID0gYXJnc1twYXJhbS5uYW1lXTsKKworICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgICB2YWx1ZSA9IHRoaXMuZW5jb2RlUGF0aENvbGxlY3Rpb24ocGFyYW0uY29sbGVjdGlvbkZvcm1hdCwgcGFyYW0ubmFtZSwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhbHVlID0gdGhpcy5lbmNvZGVQYXRoUGFyYW0odmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdFVybCA9IHJlcXVlc3RVcmwucmVwbGFjZShyZWcsIHZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAocGFyYW0uaW4gPT09ICdxdWVyeScgJiYgdHlwZW9mIGFyZ3NbcGFyYW0ubmFtZV0gIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIGlmIChxdWVyeXN0cmluZyA9PT0gJycpIHsKKyAgICAgICAgICBxdWVyeXN0cmluZyArPSAnPyc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcXVlcnlzdHJpbmcgKz0gJyYnOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGVvZiBwYXJhbS5jb2xsZWN0aW9uRm9ybWF0ICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIHZhciBxcCA9IGFyZ3NbcGFyYW0ubmFtZV07CisKKyAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxcCkpIHsKKyAgICAgICAgICAgIHF1ZXJ5c3RyaW5nICs9IHRoaXMuZW5jb2RlUXVlcnlDb2xsZWN0aW9uKHBhcmFtLmNvbGxlY3Rpb25Gb3JtYXQsIHBhcmFtLm5hbWUsIHFwKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVlcnlzdHJpbmcgKz0gdGhpcy5lbmNvZGVRdWVyeVBhcmFtKHBhcmFtLm5hbWUpICsgJz0nICsgdGhpcy5lbmNvZGVRdWVyeVBhcmFtKGFyZ3NbcGFyYW0ubmFtZV0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBxdWVyeXN0cmluZyArPSB0aGlzLmVuY29kZVF1ZXJ5UGFyYW0ocGFyYW0ubmFtZSkgKyAnPScgKyB0aGlzLmVuY29kZVF1ZXJ5UGFyYW0oYXJnc1twYXJhbS5uYW1lXSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocGFyYW0uaW4gPT09ICdmb3JtRGF0YScpIHsKKyAgICAgICAgZm9ybVBhcmFtc1twYXJhbS5uYW1lXSA9IGFyZ3NbcGFyYW0ubmFtZV07CisgICAgICB9CisgICAgfQorICB9CisgIHZhciB1cmwgPSB0aGlzLnNjaGVtZSArICc6Ly8nICsgdGhpcy5ob3N0OworCisgIGlmICh0aGlzLmJhc2VQYXRoICE9PSAnLycpIHsKKyAgICB1cmwgKz0gdGhpcy5iYXNlUGF0aDsKKyAgfQorICByZXR1cm4gdXJsICsgcmVxdWVzdFVybCArIHF1ZXJ5c3RyaW5nOworfTsKKworT3BlcmF0aW9uLnByb3RvdHlwZS5nZXRNaXNzaW5nUGFyYW1zID0gZnVuY3Rpb24gKGFyZ3MpIHsKKyAgdmFyIG1pc3NpbmdQYXJhbXMgPSBbXTsgLy8gY2hlY2sgcmVxdWlyZWQgcGFyYW1zLCB0cmFjayB0aGUgb25lcyB0aGF0IGFyZSBtaXNzaW5nCisgIHZhciBpOworCisgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtZXRlcnNbaV07CisKKyAgICBpZiAocGFyYW0ucmVxdWlyZWQgPT09IHRydWUpIHsKKyAgICAgIGlmICh0eXBlb2YgYXJnc1twYXJhbS5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgbWlzc2luZ1BhcmFtcyA9IHBhcmFtLm5hbWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1pc3NpbmdQYXJhbXM7Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLmdldEJvZHkgPSBmdW5jdGlvbiAoaGVhZGVycywgYXJncywgb3B0cykgeworICB2YXIgZm9ybVBhcmFtcyA9IHt9LCBib2R5LCBrZXksIHZhbHVlOworCisgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzW2ldOworCisgICAgaWYgKHR5cGVvZiBhcmdzW3BhcmFtLm5hbWVdICE9PSAndW5kZWZpbmVkJykgeworICAgICAgaWYgKHBhcmFtLmluID09PSAnYm9keScpIHsKKyAgICAgICAgYm9keSA9IGFyZ3NbcGFyYW0ubmFtZV07CisgICAgICB9IGVsc2UgaWYgKHBhcmFtLmluID09PSAnZm9ybURhdGEnKSB7CisgICAgICAgIGZvcm1QYXJhbXNbcGFyYW0ubmFtZV0gPSBhcmdzW3BhcmFtLm5hbWVdOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGhhbmRsZSBmb3JtIHBhcmFtcworICBpZiAoaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7CisgICAgdmFyIGVuY29kZWQgPSAnJzsKKworICAgIGZvciAoa2V5IGluIGZvcm1QYXJhbXMpIHsKKyAgICAgIHZhbHVlID0gZm9ybVBhcmFtc1trZXldOworCisgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICBpZiAoZW5jb2RlZCAhPT0gJycpIHsKKyAgICAgICAgICBlbmNvZGVkICs9ICcmJzsKKyAgICAgICAgfQorCisgICAgICAgIGVuY29kZWQgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIGJvZHkgPSBlbmNvZGVkOworICB9IGVsc2UgaWYgKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddICYmIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+PSAwKSB7CisgICAgaWYgKG9wdHMudXNlSlF1ZXJ5KSB7CisgICAgICB2YXIgYm9keVBhcmFtID0gbmV3IEZvcm1EYXRhKCk7CisKKyAgICAgIGJvZHlQYXJhbS50eXBlID0gJ2Zvcm1EYXRhJzsKKworICAgICAgZm9yIChrZXkgaW4gZm9ybVBhcmFtcykgeworICAgICAgICB2YWx1ZSA9IGFyZ3Nba2V5XTsKKworICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgIC8vIHJlcXVpcmVkIGZvciBqcXVlcnkgZmlsZSB1cGxvYWQKKyAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2ZpbGUnICYmIHZhbHVlLnZhbHVlKSB7CisgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1snQ29udGVudC1UeXBlJ107CisKKyAgICAgICAgICAgIGJvZHlQYXJhbS5hcHBlbmQoa2V5LCB2YWx1ZS52YWx1ZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvZHlQYXJhbS5hcHBlbmQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJvZHkgPSBib2R5UGFyYW07CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJvZHk7Cit9OworCisvKioKKyAqIGdldHMgc2FtcGxlIHJlc3BvbnNlIGZvciBhIHNpbmdsZSBvcGVyYXRpb24KKyAqKi8KK09wZXJhdGlvbi5wcm90b3R5cGUuZ2V0TW9kZWxTYW1wbGVKU09OID0gZnVuY3Rpb24gKHR5cGUsIG1vZGVscykgeworICB2YXIgaXNQcmltaXRpdmUsIGxpc3RUeXBlLCBzYW1wbGVKc29uOworCisgIGxpc3RUeXBlID0gKHR5cGUgaW5zdGFuY2VvZiBBcnJheSk7CisgIGlzUHJpbWl0aXZlID0gbW9kZWxzW3R5cGVdID8gZmFsc2UgOiB0cnVlOworICBzYW1wbGVKc29uID0gaXNQcmltaXRpdmUgPyB2b2lkIDAgOiBtb2RlbHNbdHlwZV0uY3JlYXRlSlNPTlNhbXBsZSgpOworCisgIGlmIChzYW1wbGVKc29uKSB7CisgICAgc2FtcGxlSnNvbiA9IGxpc3RUeXBlID8gW3NhbXBsZUpzb25dIDogc2FtcGxlSnNvbjsKKworICAgIGlmICh0eXBlb2Ygc2FtcGxlSnNvbiA9PT0gJ3N0cmluZycpIHsKKyAgICAgIHJldHVybiBzYW1wbGVKc29uOworICAgIH0gZWxzZSBpZiAodHlwZW9mIHNhbXBsZUpzb24gPT09ICdvYmplY3QnKSB7CisgICAgICB2YXIgdCA9IHNhbXBsZUpzb247CisKKyAgICAgIGlmIChzYW1wbGVKc29uIGluc3RhbmNlb2YgQXJyYXkgJiYgc2FtcGxlSnNvbi5sZW5ndGggPiAwKSB7CisgICAgICAgIHQgPSBzYW1wbGVKc29uWzBdOworICAgICAgfQorCisgICAgICBpZiAodC5ub2RlTmFtZSkgeworICAgICAgICB2YXIgeG1sU3RyaW5nID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0KTsKKworICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRYbWwoeG1sU3RyaW5nKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzYW1wbGVKc29uLCBudWxsLCAyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHNhbXBsZUpzb247CisgICAgfQorICB9Cit9OworCisvKioKKyAqIGxlZ2FjeSBiaW5kaW5nCisgKiovCitPcGVyYXRpb24ucHJvdG90eXBlLmRvID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMsIGNhbGxiYWNrLCBlcnJvciwgcGFyZW50KSB7CisgIHJldHVybiB0aGlzLmV4ZWN1dGUoYXJncywgb3B0cywgY2FsbGJhY2ssIGVycm9yLCBwYXJlbnQpOworfTsKKworLyoqCisgKiBleGVjdXRlcyBhbiBvcGVyYXRpb24KKyAqKi8KK09wZXJhdGlvbi5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uIChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBwYXJlbnQpIHsKKyAgdmFyIGFyZ3MgPSBhcmcxIHx8IHt9OworICB2YXIgb3B0cyA9IHt9LCBzdWNjZXNzLCBlcnJvcjsKKworICBpZiAodHlwZW9mIGFyZzIgPT09ICdvYmplY3QnKSB7CisgICAgb3B0cyA9IGFyZzI7CisgICAgc3VjY2VzcyA9IGFyZzM7CisgICAgZXJyb3IgPSBhcmc0OworICB9CisKKyAgaWYgKHR5cGVvZiBhcmcyID09PSAnZnVuY3Rpb24nKSB7CisgICAgc3VjY2VzcyA9IGFyZzI7CisgICAgZXJyb3IgPSBhcmczOworICB9CisKKyAgc3VjY2VzcyA9IChzdWNjZXNzIHx8IGhlbHBlcnMubG9nKTsKKyAgZXJyb3IgPSAoZXJyb3IgfHwgaGVscGVycy5sb2cpOworCisgIGlmIChvcHRzLnVzZUpRdWVyeSkgeworICAgIHRoaXMudXNlSlF1ZXJ5ID0gb3B0cy51c2VKUXVlcnk7CisgIH0KKworICB2YXIgbWlzc2luZ1BhcmFtcyA9IHRoaXMuZ2V0TWlzc2luZ1BhcmFtcyhhcmdzKTsKKworICBpZiAobWlzc2luZ1BhcmFtcy5sZW5ndGggPiAwKSB7CisgICAgdmFyIG1lc3NhZ2UgPSAnbWlzc2luZyByZXF1aXJlZCBwYXJhbXM6ICcgKyBtaXNzaW5nUGFyYW1zOworCisgICAgaGVscGVycy5mYWlsKG1lc3NhZ2UpOworCisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIGFsbEhlYWRlcnMgPSB0aGlzLmdldEhlYWRlclBhcmFtcyhhcmdzKTsKKyAgdmFyIGNvbnRlbnRUeXBlSGVhZGVycyA9IHRoaXMuc2V0Q29udGVudFR5cGVzKGFyZ3MsIG9wdHMpOworICB2YXIgaGVhZGVycyA9IHt9LCBhdHRybmFtZTsKKworICBmb3IgKGF0dHJuYW1lIGluIGFsbEhlYWRlcnMpIHsgaGVhZGVyc1thdHRybmFtZV0gPSBhbGxIZWFkZXJzW2F0dHJuYW1lXTsgfQorICBmb3IgKGF0dHJuYW1lIGluIGNvbnRlbnRUeXBlSGVhZGVycykgeyBoZWFkZXJzW2F0dHJuYW1lXSA9IGNvbnRlbnRUeXBlSGVhZGVyc1thdHRybmFtZV07IH0KKworICB2YXIgYm9keSA9IHRoaXMuZ2V0Qm9keShoZWFkZXJzLCBhcmdzLCBvcHRzKTsKKyAgdmFyIHVybCA9IHRoaXMudXJsaWZ5KGFyZ3MpOworCisgIGlmKHVybC5pbmRleE9mKCcue2Zvcm1hdH0nKSA+IDApIHsKKyAgICBpZihoZWFkZXJzKSB7CisgICAgICB2YXIgZm9ybWF0ID0gaGVhZGVycy5BY2NlcHQgfHwgaGVhZGVycy5hY2NlcHQ7CisgICAgICBpZihmb3JtYXQgJiYgZm9ybWF0LmluZGV4T2YoJ2pzb24nKSA+IDApIHsKKyAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJy57Zm9ybWF0fScsICcuanNvbicpOworICAgICAgfQorICAgICAgZWxzZSBpZihmb3JtYXQgJiYgZm9ybWF0LmluZGV4T2YoJ3htbCcpID4gMCkgeworICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnLntmb3JtYXR9JywgJy54bWwnKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2YXIgb2JqID0geworICAgIHVybDogdXJsLAorICAgIG1ldGhvZDogdGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSwKKyAgICBib2R5OiBib2R5LAorICAgIHVzZUpRdWVyeTogdGhpcy51c2VKUXVlcnksCisgICAgaGVhZGVyczogaGVhZGVycywKKyAgICBvbjogeworICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uIChyZXNwb25zZSkgeworICAgICAgICByZXR1cm4gc3VjY2VzcyhyZXNwb25zZSwgcGFyZW50KTsKKyAgICAgIH0sCisgICAgICBlcnJvcjogZnVuY3Rpb24gKHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiBlcnJvcihyZXNwb25zZSwgcGFyZW50KTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgdGhpcy5jbGllbnRBdXRob3JpemF0aW9ucy5hcHBseShvYmosIHRoaXMub3BlcmF0aW9uLnNlY3VyaXR5KTsKKyAgaWYgKG9wdHMubW9jayA9PT0gdHJ1ZSkgeworICAgIHJldHVybiBvYmo7CisgIH0gZWxzZSB7CisgICAgbmV3IFN3YWdnZXJIdHRwKCkuZXhlY3V0ZShvYmosIG9wdHMpOworICB9Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLnNldENvbnRlbnRUeXBlcyA9IGZ1bmN0aW9uIChhcmdzLCBvcHRzKSB7CisgIC8vIGRlZmF1bHQgdHlwZQorICB2YXIgYWNjZXB0cyA9ICdhcHBsaWNhdGlvbi9qc29uJzsKKyAgdmFyIGFsbERlZmluZWRQYXJhbXMgPSB0aGlzLnBhcmFtZXRlcnM7CisgIHZhciBib2R5OworICB2YXIgY29uc3VtZXMgPSBhcmdzLnBhcmFtZXRlckNvbnRlbnRUeXBlIHx8ICdhcHBsaWNhdGlvbi9qc29uJzsKKyAgdmFyIGRlZmluZWRGaWxlUGFyYW1zID0gW107CisgIHZhciBkZWZpbmVkRm9ybVBhcmFtcyA9IFtdOworICB2YXIgaGVhZGVycyA9IHt9OworICB2YXIgaTsKKworICAvLyBnZXQgcGFyYW1zIGZyb20gdGhlIG9wZXJhdGlvbiBhbmQgc2V0IHRoZW0gaW4gZGVmaW5lZEZpbGVQYXJhbXMsIGRlZmluZWRGb3JtUGFyYW1zLCBoZWFkZXJzCisgIGZvciAoaSA9IDA7IGkgPCBhbGxEZWZpbmVkUGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIHBhcmFtID0gYWxsRGVmaW5lZFBhcmFtc1tpXTsKKworICAgIGlmIChwYXJhbS5pbiA9PT0gJ2Zvcm1EYXRhJykgeworICAgICAgaWYgKHBhcmFtLnR5cGUgPT09ICdmaWxlJykgeworICAgICAgICBkZWZpbmVkRmlsZVBhcmFtcy5wdXNoKHBhcmFtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlZmluZWRGb3JtUGFyYW1zLnB1c2gocGFyYW0pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocGFyYW0uaW4gPT09ICdoZWFkZXInICYmIG9wdHMpIHsKKyAgICAgIHZhciBrZXkgPSBwYXJhbS5uYW1lOworICAgICAgdmFyIGhlYWRlclZhbHVlID0gb3B0c1twYXJhbS5uYW1lXTsKKworICAgICAgaWYgKHR5cGVvZiBvcHRzW3BhcmFtLm5hbWVdICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICBoZWFkZXJzW2tleV0gPSBoZWFkZXJWYWx1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBhcmFtLmluID09PSAnYm9keScgJiYgdHlwZW9mIGFyZ3NbcGFyYW0ubmFtZV0gIT09ICd1bmRlZmluZWQnKSB7CisgICAgICBib2R5ID0gYXJnc1twYXJhbS5uYW1lXTsKKyAgICB9CisgIH0KKworICAvLyBpZiB0aGVyZSdzIGEgYm9keSwgbmVlZCB0byBzZXQgdGhlIGNvbnN1bWVzIGhlYWRlciB2aWEgcmVxdWVzdENvbnRlbnRUeXBlCisgIGlmIChib2R5ICYmICh0aGlzLm1ldGhvZCA9PT0gJ3Bvc3QnIHx8IHRoaXMubWV0aG9kID09PSAncHV0JyB8fCB0aGlzLm1ldGhvZCA9PT0gJ3BhdGNoJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ2RlbGV0ZScpKSB7CisgICAgaWYgKG9wdHMucmVxdWVzdENvbnRlbnRUeXBlKSB7CisgICAgICBjb25zdW1lcyA9IG9wdHMucmVxdWVzdENvbnRlbnRUeXBlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBpZiBhbnkgZm9ybSBwYXJhbXMsIGNvbnRlbnQgdHlwZSBtdXN0IGJlIHNldAorICAgIGlmIChkZWZpbmVkRm9ybVBhcmFtcy5sZW5ndGggPiAwKSB7CisgICAgICBpZiAob3B0cy5yZXF1ZXN0Q29udGVudFR5cGUpIHsgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaWYgc2V0CisgICAgICAgIGNvbnN1bWVzID0gb3B0cy5yZXF1ZXN0Q29udGVudFR5cGU7CisgICAgICB9IGVsc2UgaWYgKGRlZmluZWRGaWxlUGFyYW1zLmxlbmd0aCA+IDApIHsgLy8gaWYgYSBmaWxlLCBtdXN0IGJlIG11bHRpcGFydC9mb3JtLWRhdGEKKyAgICAgICAgY29uc3VtZXMgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc7CisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byB4LXd3dy1mcm9tLXVybGVuY29kZWQKKyAgICAgICAgY29uc3VtZXMgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0RFTEVURScpIHsKKyAgICAgIGJvZHkgPSAne30nOworICAgIH0gZWxzZSBpZiAodGhpcy50eXBlICE9PSAnREVMRVRFJykgeworICAgICAgY29uc3VtZXMgPSBudWxsOworICAgIH0KKyAgfQorCisgIGlmIChjb25zdW1lcyAmJiB0aGlzLmNvbnN1bWVzKSB7CisgICAgaWYgKHRoaXMuY29uc3VtZXMuaW5kZXhPZihjb25zdW1lcykgPT09IC0xKSB7CisgICAgICBoZWxwZXJzLmxvZygnc2VydmVyIGRvZXNuXCd0IGNvbnN1bWUgJyArIGNvbnN1bWVzICsgJywgdHJ5ICcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbnN1bWVzKSk7CisgICAgfQorICB9CisKKyAgaWYgKG9wdHMucmVzcG9uc2VDb250ZW50VHlwZSkgeworICAgIGFjY2VwdHMgPSBvcHRzLnJlc3BvbnNlQ29udGVudFR5cGU7CisgIH0gZWxzZSB7CisgICAgYWNjZXB0cyA9ICdhcHBsaWNhdGlvbi9qc29uJzsKKyAgfQorCisgIGlmIChhY2NlcHRzICYmIHRoaXMucHJvZHVjZXMpIHsKKyAgICBpZiAodGhpcy5wcm9kdWNlcy5pbmRleE9mKGFjY2VwdHMpID09PSAtMSkgeworICAgICAgaGVscGVycy5sb2coJ3NlcnZlciBjYW5cJ3QgcHJvZHVjZSAnICsgYWNjZXB0cyk7CisgICAgfQorICB9CisKKyAgaWYgKChjb25zdW1lcyAmJiBib2R5ICE9PSAnJykgfHwgKGNvbnN1bWVzID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykpIHsKKyAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnN1bWVzOworICB9CisKKyAgaWYgKGFjY2VwdHMpIHsKKyAgICBoZWFkZXJzLkFjY2VwdCA9IGFjY2VwdHM7CisgIH0KKworICByZXR1cm4gaGVhZGVyczsKK307CisKK09wZXJhdGlvbi5wcm90b3R5cGUuYXNDdXJsID0gZnVuY3Rpb24gKGFyZ3MpIHsKKyAgdmFyIG9iaiA9IHRoaXMuZXhlY3V0ZShhcmdzLCB7bW9jazogdHJ1ZX0pOworCisgIHRoaXMuY2xpZW50QXV0aG9yaXphdGlvbnMuYXBwbHkob2JqKTsKKworICB2YXIgcmVzdWx0cyA9IFtdOworCisgIHJlc3VsdHMucHVzaCgnLVggJyArIHRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCkpOworCisgIGlmIChvYmouaGVhZGVycykgeworICAgIHZhciBrZXk7CisKKyAgICBmb3IgKGtleSBpbiBvYmouaGVhZGVycykgeworICAgICAgcmVzdWx0cy5wdXNoKCctLWhlYWRlciAiJyArIGtleSArICc6ICcgKyBvYmouaGVhZGVyc1trZXldICsgJyInKTsKKyAgICB9CisgIH0KKworICBpZiAob2JqLmJvZHkpIHsKKyAgICB2YXIgYm9keTsKKworICAgIGlmICh0eXBlb2Ygb2JqLmJvZHkgPT09ICdvYmplY3QnKSB7CisgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkob2JqLmJvZHkpOworICAgIH0gZWxzZSB7CisgICAgICBib2R5ID0gb2JqLmJvZHk7CisgICAgfQorCisgICAgcmVzdWx0cy5wdXNoKCctZCAiJyArIGJvZHkucmVwbGFjZSgvIi9nLCAnXFwiJykgKyAnIicpOworICB9CisKKyAgcmV0dXJuICdjdXJsICcgKyAocmVzdWx0cy5qb2luKCcgJykpICsgJyAiJyArIG9iai51cmwgKyAnIic7Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLmVuY29kZVBhdGhDb2xsZWN0aW9uID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHZhbHVlKSB7CisgIHZhciBlbmNvZGVkID0gJyc7CisgIHZhciBpOworICB2YXIgc2VwYXJhdG9yID0gJyc7CisKKyAgaWYgKHR5cGUgPT09ICdzc3YnKSB7CisgICAgc2VwYXJhdG9yID0gJyUyMCc7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RzdicpIHsKKyAgICBzZXBhcmF0b3IgPSAnXFx0JzsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAncGlwZXMnKSB7CisgICAgc2VwYXJhdG9yID0gJ3wnOworICB9IGVsc2UgeworICAgIHNlcGFyYXRvciA9ICcsJzsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgeworICAgIGlmIChpID09PSAwKSB7CisgICAgICBlbmNvZGVkID0gdGhpcy5lbmNvZGVRdWVyeVBhcmFtKHZhbHVlW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgZW5jb2RlZCArPSBzZXBhcmF0b3IgKyB0aGlzLmVuY29kZVF1ZXJ5UGFyYW0odmFsdWVbaV0pOworICAgIH0KKyAgfQorCisgIHJldHVybiBlbmNvZGVkOworfTsKKworT3BlcmF0aW9uLnByb3RvdHlwZS5lbmNvZGVRdWVyeUNvbGxlY3Rpb24gPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgdmFsdWUpIHsKKyAgdmFyIGVuY29kZWQgPSAnJzsKKyAgdmFyIGk7CisKKyAgaWYgKHR5cGUgPT09ICdkZWZhdWx0JyB8fCB0eXBlID09PSAnbXVsdGknKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoaSA+IDApIHtlbmNvZGVkICs9ICcmJzt9CisKKyAgICAgIGVuY29kZWQgKz0gdGhpcy5lbmNvZGVRdWVyeVBhcmFtKG5hbWUpICsgJz0nICsgdGhpcy5lbmNvZGVRdWVyeVBhcmFtKHZhbHVlW2ldKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdmFyIHNlcGFyYXRvciA9ICcnOworCisgICAgaWYgKHR5cGUgPT09ICdjc3YnKSB7CisgICAgICBzZXBhcmF0b3IgPSAnLCc7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3N2JykgeworICAgICAgc2VwYXJhdG9yID0gJyUyMCc7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAndHN2JykgeworICAgICAgc2VwYXJhdG9yID0gJ1xcdCc7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAncGlwZXMnKSB7CisgICAgICBzZXBhcmF0b3IgPSAnfCc7CisgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYnJhY2tldHMnKSB7IAorICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChpICE9PSAwKSB7CisgICAgICAgICAgZW5jb2RlZCArPSAnJic7CisgICAgICAgIH0KKworICAgICAgICBlbmNvZGVkICs9IHRoaXMuZW5jb2RlUXVlcnlQYXJhbShuYW1lKSArICdbXT0nICsgdGhpcy5lbmNvZGVRdWVyeVBhcmFtKHZhbHVlW2ldKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2VwYXJhdG9yICE9PSAnJykgeworICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChpID09PSAwKSB7CisgICAgICAgICAgZW5jb2RlZCA9IHRoaXMuZW5jb2RlUXVlcnlQYXJhbShuYW1lKSArICc9JyArIHRoaXMuZW5jb2RlUXVlcnlQYXJhbSh2YWx1ZVtpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZW5jb2RlZCArPSBzZXBhcmF0b3IgKyB0aGlzLmVuY29kZVF1ZXJ5UGFyYW0odmFsdWVbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVuY29kZWQ7Cit9OworCitPcGVyYXRpb24ucHJvdG90eXBlLmVuY29kZVF1ZXJ5UGFyYW0gPSBmdW5jdGlvbiAoYXJnKSB7CisgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYXJnKTsKK307CisKKy8qKgorICogVE9ETyByZXZpc2l0LCBtaWdodCBub3Qgd2FudCB0byBsZWF2ZSAnLycKKyAqKi8KK09wZXJhdGlvbi5wcm90b3R5cGUuZW5jb2RlUGF0aFBhcmFtID0gZnVuY3Rpb24gKHBhdGhQYXJhbSkgeworICB2YXIgZW5jUGFydHMsIHBhcnRzLCBpLCBsZW47CisKKyAgcGF0aFBhcmFtID0gcGF0aFBhcmFtLnRvU3RyaW5nKCk7CisKKyAgaWYgKHBhdGhQYXJhbS5pbmRleE9mKCcvJykgPT09IC0xKSB7CisgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChwYXRoUGFyYW0pOworICB9IGVsc2UgeworICAgIHBhcnRzID0gcGF0aFBhcmFtLnNwbGl0KCcvJyk7CisgICAgZW5jUGFydHMgPSBbXTsKKworICAgIGZvciAoaSA9IDAsIGxlbiA9IHBhcnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBlbmNQYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChwYXJ0c1tpXSkpOworICAgIH0KKworICAgIHJldHVybiBlbmNQYXJ0cy5qb2luKCcvJyk7CisgIH0KK307CisKK30seyIuLi9oZWxwZXJzIjo0LCIuLi9odHRwIjo1LCIuL21vZGVsIjo4LCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNVbmRlZmluZWQiOjEwM31dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKyd1c2Ugc3RyaWN0JzsKKwordmFyIE9wZXJhdGlvbkdyb3VwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFnLCBkZXNjcmlwdGlvbiwgZXh0ZXJuYWxEb2NzLCBvcGVyYXRpb24pIHsKKyAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICB0aGlzLmV4dGVybmFsRG9jcyA9IGV4dGVybmFsRG9jczsKKyAgdGhpcy5uYW1lID0gdGFnOworICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKyAgdGhpcy5vcGVyYXRpb25zQXJyYXkgPSBbXTsKKyAgdGhpcy5wYXRoID0gdGFnOworICB0aGlzLnRhZyA9IHRhZzsKK307CisKK09wZXJhdGlvbkdyb3VwLnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gKCkgeworCit9OworCisKK30se31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qIQorICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuCisgKgorICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+CisgKiBAbGljZW5zZSAgTUlUCisgKi8KKwordmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpCit2YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKQordmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpcy1hcnJheScpCisKK2V4cG9ydHMuQnVmZmVyID0gQnVmZmVyCitleHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyCitleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTAKK0J1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorCit2YXIga01heExlbmd0aCA9IDB4M2ZmZmZmZmYKK3ZhciByb290UGFyZW50ID0ge30KKworLyoqCisgKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOgorICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdCkKKyAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNikKKyAqCisgKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssCisgKiBPcGVyYSAxMS42KywgaU9TIDQuMisuCisgKgorICogTm90ZToKKyAqCisgKiAtIEltcGxlbWVudGF0aW9uIG11c3Qgc3VwcG9ydCBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcy4KKyAqICAgRmlyZWZveCA0LTI5IGxhY2tlZCBzdXBwb3J0LCBmaXhlZCBpbiBGaXJlZm94IDMwKy4KKyAqICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguCisgKgorICogIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi4KKyAqCisgKiAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mCisgKiAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy4KKyAqCisgKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleSB3aWxsCisgKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCB3aWxsIHdvcmsgY29ycmVjdGx5LgorICovCitCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IChmdW5jdGlvbiAoKSB7CisgIHRyeSB7CisgICAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcigwKQorICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShidWYpCisgICAgYXJyLmZvbyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0KKyAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZAorICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YAorICAgICAgICBuZXcgVWludDhBcnJheSgxKS5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgCisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1cm4gZmFsc2UKKyAgfQorfSkoKQorCisvKioKKyAqIENsYXNzOiBCdWZmZXIKKyAqID09PT09PT09PT09PT0KKyAqCisgKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGFyZSBhdWdtZW50ZWQKKyAqIHdpdGggZnVuY3Rpb24gcHJvcGVydGllcyBmb3IgYWxsIHRoZSBub2RlIGBCdWZmZXJgIEFQSSBmdW5jdGlvbnMuIFdlIHVzZQorICogYFVpbnQ4QXJyYXlgIHNvIHRoYXQgc3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXQgcmV0dXJucworICogYSBzaW5nbGUgb2N0ZXQuCisgKgorICogQnkgYXVnbWVudGluZyB0aGUgaW5zdGFuY2VzLCB3ZSBjYW4gYXZvaWQgbW9kaWZ5aW5nIHRoZSBgVWludDhBcnJheWAKKyAqIHByb3RvdHlwZS4KKyAqLworZnVuY3Rpb24gQnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykgeworICB2YXIgc2VsZiA9IHRoaXMKKyAgaWYgKCEoc2VsZiBpbnN0YW5jZW9mIEJ1ZmZlcikpIHJldHVybiBuZXcgQnVmZmVyKHN1YmplY3QsIGVuY29kaW5nKQorCisgIHZhciB0eXBlID0gdHlwZW9mIHN1YmplY3QKKyAgdmFyIGxlbmd0aAorCisgIGlmICh0eXBlID09PSAnbnVtYmVyJykgeworICAgIGxlbmd0aCA9ICtzdWJqZWN0CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHsKKyAgICBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzdWJqZWN0LCBlbmNvZGluZykKKyAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiBzdWJqZWN0ICE9PSBudWxsKSB7CisgICAgLy8gYXNzdW1lIG9iamVjdCBpcyBhcnJheS1saWtlCisgICAgaWYgKHN1YmplY3QudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShzdWJqZWN0LmRhdGEpKSBzdWJqZWN0ID0gc3ViamVjdC5kYXRhCisgICAgbGVuZ3RoID0gK3N1YmplY3QubGVuZ3RoCisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBzdGFydCB3aXRoIG51bWJlciwgYnVmZmVyLCBhcnJheSBvciBzdHJpbmcnKQorICB9CisKKyAgaWYgKGxlbmd0aCA+IGtNYXhMZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCcgKworICAgICAga01heExlbmd0aC50b1N0cmluZygxNikgKyAnIGJ5dGVzJykKKyAgfQorCisgIGlmIChsZW5ndGggPCAwKSBsZW5ndGggPSAwCisgIGVsc2UgbGVuZ3RoID4+Pj0gMCAvLyBjb2VyY2UgdG8gdWludDMyCisKKyAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7CisgICAgLy8gUHJlZmVycmVkOiBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSBmb3IgYmVzdCBwZXJmb3JtYW5jZQorICAgIHNlbGYgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXRoaXMKKyAgfSBlbHNlIHsKKyAgICAvLyBGYWxsYmFjazogUmV0dXJuIFRISVMgaW5zdGFuY2Ugb2YgQnVmZmVyIChjcmVhdGVkIGJ5IGBuZXdgKQorICAgIHNlbGYubGVuZ3RoID0gbGVuZ3RoCisgICAgc2VsZi5faXNCdWZmZXIgPSB0cnVlCisgIH0KKworICB2YXIgaQorICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIHN1YmplY3QuYnl0ZUxlbmd0aCA9PT0gJ251bWJlcicpIHsKKyAgICAvLyBTcGVlZCBvcHRpbWl6YXRpb24gLS0gdXNlIHNldCBpZiB3ZSdyZSBjb3B5aW5nIGZyb20gYSB0eXBlZCBhcnJheQorICAgIHNlbGYuX3NldChzdWJqZWN0KQorICB9IGVsc2UgaWYgKGlzQXJyYXlpc2goc3ViamVjdCkpIHsKKyAgICAvLyBUcmVhdCBhcnJheS1pc2ggb2JqZWN0cyBhcyBhIGJ5dGUgYXJyYXkKKyAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN1YmplY3QpKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc2VsZltpXSA9IHN1YmplY3QucmVhZFVJbnQ4KGkpCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBzZWxmW2ldID0gKChzdWJqZWN0W2ldICUgMjU2KSArIDI1NikgJSAyNTYKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHsKKyAgICBzZWxmLndyaXRlKHN1YmplY3QsIDAsIGVuY29kaW5nKQorICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgc2VsZltpXSA9IDAKKyAgICB9CisgIH0KKworICBpZiAobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gQnVmZmVyLnBvb2xTaXplKSBzZWxmLnBhcmVudCA9IHJvb3RQYXJlbnQKKworICByZXR1cm4gc2VsZgorfQorCitmdW5jdGlvbiBTbG93QnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykgeworICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2xvd0J1ZmZlcikpIHJldHVybiBuZXcgU2xvd0J1ZmZlcihzdWJqZWN0LCBlbmNvZGluZykKKworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdWJqZWN0LCBlbmNvZGluZykKKyAgZGVsZXRlIGJ1Zi5wYXJlbnQKKyAgcmV0dXJuIGJ1ZgorfQorCitCdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikgeworICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKQorfQorCitCdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHsKKyAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKQorICB9CisKKyAgaWYgKGEgPT09IGIpIHJldHVybiAwCisKKyAgdmFyIHggPSBhLmxlbmd0aAorICB2YXIgeSA9IGIubGVuZ3RoCisgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbiAmJiBhW2ldID09PSBiW2ldOyBpKyspIHt9CisgIGlmIChpICE9PSBsZW4pIHsKKyAgICB4ID0gYVtpXQorICAgIHkgPSBiW2ldCisgIH0KKyAgaWYgKHggPCB5KSByZXR1cm4gLTEKKyAgaWYgKHkgPCB4KSByZXR1cm4gMQorICByZXR1cm4gMAorfQorCitCdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7CisgIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7CisgICAgY2FzZSAnaGV4JzoKKyAgICBjYXNlICd1dGY4JzoKKyAgICBjYXNlICd1dGYtOCc6CisgICAgY2FzZSAnYXNjaWknOgorICAgIGNhc2UgJ2JpbmFyeSc6CisgICAgY2FzZSAnYmFzZTY0JzoKKyAgICBjYXNlICdyYXcnOgorICAgIGNhc2UgJ3VjczInOgorICAgIGNhc2UgJ3Vjcy0yJzoKKyAgICBjYXNlICd1dGYxNmxlJzoKKyAgICBjYXNlICd1dGYtMTZsZSc6CisgICAgICByZXR1cm4gdHJ1ZQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2UKKyAgfQorfQorCitCdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCB0b3RhbExlbmd0aCkgeworICBpZiAoIWlzQXJyYXkobGlzdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzLicpCisKKyAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCkKKyAgfSBlbHNlIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkgeworICAgIHJldHVybiBsaXN0WzBdCisgIH0KKworICB2YXIgaQorICBpZiAodG90YWxMZW5ndGggPT09IHVuZGVmaW5lZCkgeworICAgIHRvdGFsTGVuZ3RoID0gMAorICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICB0b3RhbExlbmd0aCArPSBsaXN0W2ldLmxlbmd0aAorICAgIH0KKyAgfQorCisgIHZhciBidWYgPSBuZXcgQnVmZmVyKHRvdGFsTGVuZ3RoKQorICB2YXIgcG9zID0gMAorICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgIHZhciBpdGVtID0gbGlzdFtpXQorICAgIGl0ZW0uY29weShidWYsIHBvcykKKyAgICBwb3MgKz0gaXRlbS5sZW5ndGgKKyAgfQorICByZXR1cm4gYnVmCit9CisKK0J1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyLCBlbmNvZGluZykgeworICB2YXIgcmV0CisgIHN0ciA9IHN0ciArICcnCisgIHN3aXRjaCAoZW5jb2RpbmcgfHwgJ3V0ZjgnKSB7CisgICAgY2FzZSAnYXNjaWknOgorICAgIGNhc2UgJ2JpbmFyeSc6CisgICAgY2FzZSAncmF3JzoKKyAgICAgIHJldCA9IHN0ci5sZW5ndGgKKyAgICAgIGJyZWFrCisgICAgY2FzZSAndWNzMic6CisgICAgY2FzZSAndWNzLTInOgorICAgIGNhc2UgJ3V0ZjE2bGUnOgorICAgIGNhc2UgJ3V0Zi0xNmxlJzoKKyAgICAgIHJldCA9IHN0ci5sZW5ndGggKiAyCisgICAgICBicmVhaworICAgIGNhc2UgJ2hleCc6CisgICAgICByZXQgPSBzdHIubGVuZ3RoID4+PiAxCisgICAgICBicmVhaworICAgIGNhc2UgJ3V0ZjgnOgorICAgIGNhc2UgJ3V0Zi04JzoKKyAgICAgIHJldCA9IHV0ZjhUb0J5dGVzKHN0cikubGVuZ3RoCisgICAgICBicmVhaworICAgIGNhc2UgJ2Jhc2U2NCc6CisgICAgICByZXQgPSBiYXNlNjRUb0J5dGVzKHN0cikubGVuZ3RoCisgICAgICBicmVhaworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBzdHIubGVuZ3RoCisgIH0KKyAgcmV0dXJuIHJldAorfQorCisvLyBwcmUtc2V0IGZvciB2YWx1ZXMgdGhhdCBtYXkgZXhpc3QgaW4gdGhlIGZ1dHVyZQorQnVmZmVyLnByb3RvdHlwZS5sZW5ndGggPSB1bmRlZmluZWQKK0J1ZmZlci5wcm90b3R5cGUucGFyZW50ID0gdW5kZWZpbmVkCisKKy8vIHRvU3RyaW5nKGVuY29kaW5nLCBzdGFydD0wLCBlbmQ9YnVmZmVyLmxlbmd0aCkKK0J1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHsKKyAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2UKKworICBzdGFydCA9IHN0YXJ0ID4+PiAwCisgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gSW5maW5pdHkgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMAorCisgIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnCisgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMAorICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoCisgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiAnJworCisgIHdoaWxlICh0cnVlKSB7CisgICAgc3dpdGNoIChlbmNvZGluZykgeworICAgICAgY2FzZSAnaGV4JzoKKyAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpCisKKyAgICAgIGNhc2UgJ3V0ZjgnOgorICAgICAgY2FzZSAndXRmLTgnOgorICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpCisKKyAgICAgIGNhc2UgJ2FzY2lpJzoKKyAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZCkKKworICAgICAgY2FzZSAnYmluYXJ5JzoKKyAgICAgICAgcmV0dXJuIGJpbmFyeVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpCisKKyAgICAgIGNhc2UgJ2Jhc2U2NCc6CisgICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKQorCisgICAgICBjYXNlICd1Y3MyJzoKKyAgICAgIGNhc2UgJ3Vjcy0yJzoKKyAgICAgIGNhc2UgJ3V0ZjE2bGUnOgorICAgICAgY2FzZSAndXRmLTE2bGUnOgorICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKQorICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpCisgICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZQorICAgIH0KKyAgfQorfQorCitCdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikgeworICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpCisgIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZQorICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDAKK30KKworQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7CisgIHZhciBzdHIgPSAnJworICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUworICBpZiAodGhpcy5sZW5ndGggPiAwKSB7CisgICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJykKKyAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnCisgIH0KKyAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPicKK30KKworQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYikgeworICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpCisgIGlmICh0aGlzID09PSBiKSByZXR1cm4gMAorICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikKK30KKworQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0KSB7CisgIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmYKKyAgZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDAKKyAgYnl0ZU9mZnNldCA+Pj0gMAorCisgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xCisgIGlmIChieXRlT2Zmc2V0ID49IHRoaXMubGVuZ3RoKSByZXR1cm4gLTEKKworICAvLyBOZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyCisgIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoICsgYnl0ZU9mZnNldCwgMCkKKworICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHsKKyAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xIC8vIHNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nIGFsd2F5cyBmYWlscworICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpCisgIH0KKyAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7CisgICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpCisgIH0KKyAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7CisgICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KQorICAgIH0KKyAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIFsgdmFsIF0sIGJ5dGVPZmZzZXQpCisgIH0KKworICBmdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0KSB7CisgICAgdmFyIGZvdW5kSW5kZXggPSAtMQorICAgIGZvciAodmFyIGkgPSAwOyBieXRlT2Zmc2V0ICsgaSA8IGFyci5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGFycltieXRlT2Zmc2V0ICsgaV0gPT09IHZhbFtmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleF0pIHsKKyAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaQorICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWwubGVuZ3RoKSByZXR1cm4gYnl0ZU9mZnNldCArIGZvdW5kSW5kZXgKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvdW5kSW5kZXggPSAtMQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTEKKyAgfQorCisgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpCit9CisKKy8vIGBnZXRgIHdpbGwgYmUgcmVtb3ZlZCBpbiBOb2RlIDAuMTMrCitCdWZmZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAob2Zmc2V0KSB7CisgIGNvbnNvbGUubG9nKCcuZ2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKQorICByZXR1cm4gdGhpcy5yZWFkVUludDgob2Zmc2V0KQorfQorCisvLyBgc2V0YCB3aWxsIGJlIHJlbW92ZWQgaW4gTm9kZSAwLjEzKworQnVmZmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKHYsIG9mZnNldCkgeworICBjb25zb2xlLmxvZygnLnNldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJykKKyAgcmV0dXJuIHRoaXMud3JpdGVVSW50OCh2LCBvZmZzZXQpCit9CisKK2Z1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKKyAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMAorICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldAorICBpZiAoIWxlbmd0aCkgeworICAgIGxlbmd0aCA9IHJlbWFpbmluZworICB9IGVsc2UgeworICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpCisgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykgeworICAgICAgbGVuZ3RoID0gcmVtYWluaW5nCisgICAgfQorICB9CisKKyAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHMKKyAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGgKKyAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJykKKworICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikgeworICAgIGxlbmd0aCA9IHN0ckxlbiAvIDIKKyAgfQorICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNikKKyAgICBpZiAoaXNOYU4ocGFyc2VkKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKQorICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZAorICB9CisgIHJldHVybiBpCit9CisKK2Z1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7CisgIHZhciBjaGFyc1dyaXR0ZW4gPSBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpCisgIHJldHVybiBjaGFyc1dyaXR0ZW4KK30KKworZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7CisgIHZhciBjaGFyc1dyaXR0ZW4gPSBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKQorICByZXR1cm4gY2hhcnNXcml0dGVuCit9CisKK2Z1bmN0aW9uIGJpbmFyeVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHsKKyAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKQorfQorCitmdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7CisgIHZhciBjaGFyc1dyaXR0ZW4gPSBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aCkKKyAgcmV0dXJuIGNoYXJzV3JpdHRlbgorfQorCitmdW5jdGlvbiB1dGYxNmxlV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkgeworICB2YXIgY2hhcnNXcml0dGVuID0gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKQorICByZXR1cm4gY2hhcnNXcml0dGVuCit9CisKK0J1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHsKKyAgLy8gU3VwcG9ydCBib3RoIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykKKyAgLy8gYW5kIHRoZSBsZWdhY3kgKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKQorICBpZiAoaXNGaW5pdGUob2Zmc2V0KSkgeworICAgIGlmICghaXNGaW5pdGUobGVuZ3RoKSkgeworICAgICAgZW5jb2RpbmcgPSBsZW5ndGgKKyAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZAorICAgIH0KKyAgfSBlbHNlIHsgIC8vIGxlZ2FjeQorICAgIHZhciBzd2FwID0gZW5jb2RpbmcKKyAgICBlbmNvZGluZyA9IG9mZnNldAorICAgIG9mZnNldCA9IGxlbmd0aAorICAgIGxlbmd0aCA9IHN3YXAKKyAgfQorCisgIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDAKKworICBpZiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7CisgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJykKKyAgfQorCisgIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldAorICBpZiAoIWxlbmd0aCkgeworICAgIGxlbmd0aCA9IHJlbWFpbmluZworICB9IGVsc2UgeworICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpCisgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykgeworICAgICAgbGVuZ3RoID0gcmVtYWluaW5nCisgICAgfQorICB9CisgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKQorCisgIHZhciByZXQKKyAgc3dpdGNoIChlbmNvZGluZykgeworICAgIGNhc2UgJ2hleCc6CisgICAgICByZXQgPSBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKQorICAgICAgYnJlYWsKKyAgICBjYXNlICd1dGY4JzoKKyAgICBjYXNlICd1dGYtOCc6CisgICAgICByZXQgPSB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkKKyAgICAgIGJyZWFrCisgICAgY2FzZSAnYXNjaWknOgorICAgICAgcmV0ID0gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKQorICAgICAgYnJlYWsKKyAgICBjYXNlICdiaW5hcnknOgorICAgICAgcmV0ID0gYmluYXJ5V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkKKyAgICAgIGJyZWFrCisgICAgY2FzZSAnYmFzZTY0JzoKKyAgICAgIHJldCA9IGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpCisgICAgICBicmVhaworICAgIGNhc2UgJ3VjczInOgorICAgIGNhc2UgJ3Vjcy0yJzoKKyAgICBjYXNlICd1dGYxNmxlJzoKKyAgICBjYXNlICd1dGYtMTZsZSc6CisgICAgICByZXQgPSB1dGYxNmxlV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkKKyAgICAgIGJyZWFrCisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZykKKyAgfQorICByZXR1cm4gcmV0Cit9CisKK0J1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHsKKyAgcmV0dXJuIHsKKyAgICB0eXBlOiAnQnVmZmVyJywKKyAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMCkKKyAgfQorfQorCitmdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7CisgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHsKKyAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKQorICB9IGVsc2UgeworICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpCisgIH0KK30KKworZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHsKKyAgdmFyIHJlcyA9ICcnCisgIHZhciB0bXAgPSAnJworICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpCisKKyAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICBpZiAoYnVmW2ldIDw9IDB4N0YpIHsKKyAgICAgIHJlcyArPSBkZWNvZGVVdGY4Q2hhcih0bXApICsgU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pCisgICAgICB0bXAgPSAnJworICAgIH0gZWxzZSB7CisgICAgICB0bXAgKz0gJyUnICsgYnVmW2ldLnRvU3RyaW5nKDE2KQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXMgKyBkZWNvZGVVdGY4Q2hhcih0bXApCit9CisKK2Z1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkgeworICB2YXIgcmV0ID0gJycKKyAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKQorCisgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RikKKyAgfQorICByZXR1cm4gcmV0Cit9CisKK2Z1bmN0aW9uIGJpbmFyeVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHsKKyAgdmFyIHJldCA9ICcnCisgIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCkKKworICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSkKKyAgfQorICByZXR1cm4gcmV0Cit9CisKK2Z1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHsKKyAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGgKKworICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwCisgIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW4KKworICB2YXIgb3V0ID0gJycKKyAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKQorICB9CisgIHJldHVybiBvdXQKK30KKworZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHsKKyAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpCisgIHZhciByZXMgPSAnJworICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7CisgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpCisgIH0KKyAgcmV0dXJuIHJlcworfQorCitCdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHsKKyAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoCisgIHN0YXJ0ID0gfn5zdGFydAorICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kCisKKyAgaWYgKHN0YXJ0IDwgMCkgeworICAgIHN0YXJ0ICs9IGxlbgorICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMAorICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7CisgICAgc3RhcnQgPSBsZW4KKyAgfQorCisgIGlmIChlbmQgPCAwKSB7CisgICAgZW5kICs9IGxlbgorICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwCisgIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7CisgICAgZW5kID0gbGVuCisgIH0KKworICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0CisKKyAgdmFyIG5ld0J1ZgorICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHsKKyAgICBuZXdCdWYgPSBCdWZmZXIuX2F1Z21lbnQodGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSkKKyAgfSBlbHNlIHsKKyAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydAorICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZCkKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyBpKyspIHsKKyAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XQorICAgIH0KKyAgfQorCisgIGlmIChuZXdCdWYubGVuZ3RoKSBuZXdCdWYucGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpcworCisgIHJldHVybiBuZXdCdWYKK30KKworLyoKKyAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLgorICovCitmdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkgeworICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKQorICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpCit9CisKK0J1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHsKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpCisKKyAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XQorICB2YXIgbXVsID0gMQorICB2YXIgaSA9IDAKKyAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHsKKyAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bAorICB9CisKKyAgcmV0dXJuIHZhbAorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7CisgIG9mZnNldCA9IG9mZnNldCA+Pj4gMAorICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMAorICBpZiAoIW5vQXNzZXJ0KSB7CisgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCkKKyAgfQorCisgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0KKyAgdmFyIG11bCA9IDEKKyAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7CisgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bAorICB9CisKKyAgcmV0dXJuIHZhbAorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkgeworICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKQorICByZXR1cm4gdGhpc1tvZmZzZXRdCit9CisKK0J1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7CisgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpCisgIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KQorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkgeworICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKQorICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV0KK30KKworQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCkKKworICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHwKKyAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHwKKyAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgKworICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApCit9CisKK0J1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7CisgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpCisKKyAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICsKKyAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHwKKyAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8CisgICAgdGhpc1tvZmZzZXQgKyAzXSkKK30KKworQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHsKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpCisKKyAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XQorICB2YXIgbXVsID0gMQorICB2YXIgaSA9IDAKKyAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHsKKyAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bAorICB9CisgIG11bCAqPSAweDgwCisKKyAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkKKworICByZXR1cm4gdmFsCit9CisKK0J1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7CisgIG9mZnNldCA9IG9mZnNldCA+Pj4gMAorICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMAorICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKQorCisgIHZhciBpID0gYnl0ZUxlbmd0aAorICB2YXIgbXVsID0gMQorICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldCisgIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkgeworICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWwKKyAgfQorICBtdWwgKj0gMHg4MAorCisgIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpCisKKyAgcmV0dXJuIHZhbAorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCkKKyAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKQorICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSkKK30KKworQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7CisgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpCisgIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KQorICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsCit9CisKK0J1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkgeworICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKQorICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOCkKKyAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbAorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCkKKworICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfAorICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHwKKyAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfAorICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KQorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCkKKworICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfAorICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8CisgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfAorICAgICh0aGlzW29mZnNldCArIDNdKQorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCkKKyAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KQorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCkKKyAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNCkKK30KKworQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aCkKKyAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KQorfQorCitCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkgeworICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKQorICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KQorfQorCitmdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7CisgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J1ZmZlciBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJykKKyAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpCisgIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJykKK30KKworQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkgeworICB2YWx1ZSA9ICt2YWx1ZQorICBvZmZzZXQgPSBvZmZzZXQgPj4+IDAKKyAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDAKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpLCAwKQorCisgIHZhciBtdWwgPSAxCisgIHZhciBpID0gMAorICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkYKKyAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHsKKyAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSA+Pj4gMCAmIDB4RkYKKyAgfQorCisgIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoCit9CisKK0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHsKKyAgdmFsdWUgPSArdmFsdWUKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMCkKKworICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxCisgIHZhciBtdWwgPSAxCisgIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkYKKyAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7CisgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgPj4+IDAgJiAweEZGCisgIH0KKworICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aAorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgeworICB2YWx1ZSA9ICt2YWx1ZQorICBvZmZzZXQgPSBvZmZzZXQgPj4+IDAKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMCkKKyAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKQorICB0aGlzW29mZnNldF0gPSB2YWx1ZQorICByZXR1cm4gb2Zmc2V0ICsgMQorfQorCitmdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHsKKyAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDEKKyAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7IGkrKykgeworICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+CisgICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDgKKyAgfQorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgeworICB2YWx1ZSA9ICt2YWx1ZQorICBvZmZzZXQgPSBvZmZzZXQgPj4+IDAKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKQorICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHsKKyAgICB0aGlzW29mZnNldF0gPSB2YWx1ZQorICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpCisgIH0gZWxzZSB7CisgICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSkKKyAgfQorICByZXR1cm4gb2Zmc2V0ICsgMgorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgeworICB2YWx1ZSA9ICt2YWx1ZQorICBvZmZzZXQgPSBvZmZzZXQgPj4+IDAKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKQorICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHsKKyAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpCisgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlCisgIH0gZWxzZSB7CisgICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpCisgIH0KKyAgcmV0dXJuIG9mZnNldCArIDIKK30KKworZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7CisgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMQorICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgaSsrKSB7CisgICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZgorICB9Cit9CisKK0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CisgIHZhbHVlID0gK3ZhbHVlCisgIG9mZnNldCA9IG9mZnNldCA+Pj4gMAorICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKQorICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHsKKyAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNCkKKyAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNikKKyAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KQorICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlCisgIH0gZWxzZSB7CisgICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSkKKyAgfQorICByZXR1cm4gb2Zmc2V0ICsgNAorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgeworICB2YWx1ZSA9ICt2YWx1ZQorICBvZmZzZXQgPSBvZmZzZXQgPj4+IDAKKyAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMCkKKyAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7CisgICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNCkKKyAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNikKKyAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KQorICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZQorICB9IGVsc2UgeworICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKQorICB9CisgIHJldHVybiBvZmZzZXQgKyA0Cit9CisKK0J1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7CisgIHZhbHVlID0gK3ZhbHVlCisgIG9mZnNldCA9IG9mZnNldCA+Pj4gMAorICBpZiAoIW5vQXNzZXJ0KSB7CisgICAgY2hlY2tJbnQoCisgICAgICB0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLAorICAgICAgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKSAtIDEsCisgICAgICAtTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKQorICAgICkKKyAgfQorCisgIHZhciBpID0gMAorICB2YXIgbXVsID0gMQorICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDAKKyAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGCisgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7CisgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRgorICB9CisKKyAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGgKK30KKworQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHsKKyAgdmFsdWUgPSArdmFsdWUKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIHsKKyAgICBjaGVja0ludCgKKyAgICAgIHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsCisgICAgICBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpIC0gMSwKKyAgICAgIC1NYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpCisgICAgKQorICB9CisKKyAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMQorICB2YXIgbXVsID0gMQorICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDAKKyAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRgorICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHsKKyAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGCisgIH0KKworICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aAorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgdmFsdWUgPSArdmFsdWUKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKQorICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpCisgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMQorICB0aGlzW29mZnNldF0gPSB2YWx1ZQorICByZXR1cm4gb2Zmc2V0ICsgMQorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgdmFsdWUgPSArdmFsdWUKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMCkKKyAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7CisgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUKKyAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KQorICB9IGVsc2UgeworICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpCisgIH0KKyAgcmV0dXJuIG9mZnNldCArIDIKK30KKworQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CisgIHZhbHVlID0gK3ZhbHVlCisgIG9mZnNldCA9IG9mZnNldCA+Pj4gMAorICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApCisgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgeworICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOCkKKyAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUKKyAgfSBlbHNlIHsKKyAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSkKKyAgfQorICByZXR1cm4gb2Zmc2V0ICsgMgorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgdmFsdWUgPSArdmFsdWUKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKQorICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHsKKyAgICB0aGlzW29mZnNldF0gPSB2YWx1ZQorICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpCisgICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpCisgICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpCisgIH0gZWxzZSB7CisgICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSkKKyAgfQorICByZXR1cm4gb2Zmc2V0ICsgNAorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgdmFsdWUgPSArdmFsdWUKKyAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwCisgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKQorICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDEKKyAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7CisgICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNCkKKyAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNikKKyAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KQorICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZQorICB9IGVsc2UgeworICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKQorICB9CisgIHJldHVybiBvZmZzZXQgKyA0Cit9CisKK2Z1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7CisgIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKQorICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpCisgIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJykKK30KKworZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7CisgIGlmICghbm9Bc3NlcnQpIHsKKyAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOCkKKyAgfQorICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNCkKKyAgcmV0dXJuIG9mZnNldCArIDQKK30KKworQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CisgIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KQorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHsKKyAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KQorfQorCitmdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7CisgIGlmICghbm9Bc3NlcnQpIHsKKyAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KQorICB9CisgIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KQorICByZXR1cm4gb2Zmc2V0ICsgOAorfQorCitCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkgeworICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpCit9CisKK0J1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7CisgIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpCit9CisKKy8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aCkKK0J1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0X3N0YXJ0LCBzdGFydCwgZW5kKSB7CisgIGlmICghc3RhcnQpIHN0YXJ0ID0gMAorICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoCisgIGlmICh0YXJnZXRfc3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0X3N0YXJ0ID0gdGFyZ2V0Lmxlbmd0aAorICBpZiAoIXRhcmdldF9zdGFydCkgdGFyZ2V0X3N0YXJ0ID0gMAorICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQKKworICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmUKKyAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwCisgIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMAorCisgIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnMKKyAgaWYgKHRhcmdldF9zdGFydCA8IDApIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpCisgIH0KKyAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKQorICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJykKKworICAvLyBBcmUgd2Ugb29iPworICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoCisgIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0X3N0YXJ0IDwgZW5kIC0gc3RhcnQpIHsKKyAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0X3N0YXJ0ICsgc3RhcnQKKyAgfQorCisgIHZhciBsZW4gPSBlbmQgLSBzdGFydAorCisgIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIHRhcmdldFtpICsgdGFyZ2V0X3N0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0YXJnZXQuX3NldCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksIHRhcmdldF9zdGFydCkKKyAgfQorCisgIHJldHVybiBsZW4KK30KKworLy8gZmlsbCh2YWx1ZSwgc3RhcnQ9MCwgZW5kPWJ1ZmZlci5sZW5ndGgpCitCdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWx1ZSwgc3RhcnQsIGVuZCkgeworICBpZiAoIXZhbHVlKSB2YWx1ZSA9IDAKKyAgaWYgKCFzdGFydCkgc3RhcnQgPSAwCisgIGlmICghZW5kKSBlbmQgPSB0aGlzLmxlbmd0aAorCisgIGlmIChlbmQgPCBzdGFydCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCA8IHN0YXJ0JykKKworICAvLyBGaWxsIDAgYnl0ZXM7IHdlJ3JlIGRvbmUKKyAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybgorICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybgorCisgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdGFydCBvdXQgb2YgYm91bmRzJykKKyAgaWYgKGVuZCA8IDAgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgb3V0IG9mIGJvdW5kcycpCisKKyAgdmFyIGkKKyAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICB0aGlzW2ldID0gdmFsdWUKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdmFyIGJ5dGVzID0gdXRmOFRvQnl0ZXModmFsdWUudG9TdHJpbmcoKSkKKyAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgdGhpc1tpXSA9IGJ5dGVzW2kgJSBsZW5dCisgICAgfQorICB9CisKKyAgcmV0dXJuIHRoaXMKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGBBcnJheUJ1ZmZlcmAgd2l0aCB0aGUgKmNvcGllZCogbWVtb3J5IG9mIHRoZSBidWZmZXIgaW5zdGFuY2UuCisgKiBBZGRlZCBpbiBOb2RlIDAuMTIuIE9ubHkgYXZhaWxhYmxlIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBBcnJheUJ1ZmZlci4KKyAqLworQnVmZmVyLnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24gdG9BcnJheUJ1ZmZlciAoKSB7CisgIGlmICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHsKKyAgICAgIHJldHVybiAobmV3IEJ1ZmZlcih0aGlzKSkuYnVmZmVyCisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aCkKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKKyAgICAgICAgYnVmW2ldID0gdGhpc1tpXQorICAgICAgfQorICAgICAgcmV0dXJuIGJ1Zi5idWZmZXIKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQnVmZmVyLnRvQXJyYXlCdWZmZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKQorICB9Cit9CisKKy8vIEhFTFBFUiBGVU5DVElPTlMKKy8vID09PT09PT09PT09PT09PT0KKwordmFyIEJQID0gQnVmZmVyLnByb3RvdHlwZQorCisvKioKKyAqIEF1Z21lbnQgYSBVaW50OEFycmF5ICppbnN0YW5jZSogKG5vdCB0aGUgVWludDhBcnJheSBjbGFzcyEpIHdpdGggQnVmZmVyIG1ldGhvZHMKKyAqLworQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gX2F1Z21lbnQgKGFycikgeworICBhcnIuY29uc3RydWN0b3IgPSBCdWZmZXIKKyAgYXJyLl9pc0J1ZmZlciA9IHRydWUKKworICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBVaW50OEFycmF5IHNldCBtZXRob2QgYmVmb3JlIG92ZXJ3cml0aW5nCisgIGFyci5fc2V0ID0gYXJyLnNldAorCisgIC8vIGRlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiBub2RlIDAuMTMrCisgIGFyci5nZXQgPSBCUC5nZXQKKyAgYXJyLnNldCA9IEJQLnNldAorCisgIGFyci53cml0ZSA9IEJQLndyaXRlCisgIGFyci50b1N0cmluZyA9IEJQLnRvU3RyaW5nCisgIGFyci50b0xvY2FsZVN0cmluZyA9IEJQLnRvU3RyaW5nCisgIGFyci50b0pTT04gPSBCUC50b0pTT04KKyAgYXJyLmVxdWFscyA9IEJQLmVxdWFscworICBhcnIuY29tcGFyZSA9IEJQLmNvbXBhcmUKKyAgYXJyLmluZGV4T2YgPSBCUC5pbmRleE9mCisgIGFyci5jb3B5ID0gQlAuY29weQorICBhcnIuc2xpY2UgPSBCUC5zbGljZQorICBhcnIucmVhZFVJbnRMRSA9IEJQLnJlYWRVSW50TEUKKyAgYXJyLnJlYWRVSW50QkUgPSBCUC5yZWFkVUludEJFCisgIGFyci5yZWFkVUludDggPSBCUC5yZWFkVUludDgKKyAgYXJyLnJlYWRVSW50MTZMRSA9IEJQLnJlYWRVSW50MTZMRQorICBhcnIucmVhZFVJbnQxNkJFID0gQlAucmVhZFVJbnQxNkJFCisgIGFyci5yZWFkVUludDMyTEUgPSBCUC5yZWFkVUludDMyTEUKKyAgYXJyLnJlYWRVSW50MzJCRSA9IEJQLnJlYWRVSW50MzJCRQorICBhcnIucmVhZEludExFID0gQlAucmVhZEludExFCisgIGFyci5yZWFkSW50QkUgPSBCUC5yZWFkSW50QkUKKyAgYXJyLnJlYWRJbnQ4ID0gQlAucmVhZEludDgKKyAgYXJyLnJlYWRJbnQxNkxFID0gQlAucmVhZEludDE2TEUKKyAgYXJyLnJlYWRJbnQxNkJFID0gQlAucmVhZEludDE2QkUKKyAgYXJyLnJlYWRJbnQzMkxFID0gQlAucmVhZEludDMyTEUKKyAgYXJyLnJlYWRJbnQzMkJFID0gQlAucmVhZEludDMyQkUKKyAgYXJyLnJlYWRGbG9hdExFID0gQlAucmVhZEZsb2F0TEUKKyAgYXJyLnJlYWRGbG9hdEJFID0gQlAucmVhZEZsb2F0QkUKKyAgYXJyLnJlYWREb3VibGVMRSA9IEJQLnJlYWREb3VibGVMRQorICBhcnIucmVhZERvdWJsZUJFID0gQlAucmVhZERvdWJsZUJFCisgIGFyci53cml0ZVVJbnQ4ID0gQlAud3JpdGVVSW50OAorICBhcnIud3JpdGVVSW50TEUgPSBCUC53cml0ZVVJbnRMRQorICBhcnIud3JpdGVVSW50QkUgPSBCUC53cml0ZVVJbnRCRQorICBhcnIud3JpdGVVSW50MTZMRSA9IEJQLndyaXRlVUludDE2TEUKKyAgYXJyLndyaXRlVUludDE2QkUgPSBCUC53cml0ZVVJbnQxNkJFCisgIGFyci53cml0ZVVJbnQzMkxFID0gQlAud3JpdGVVSW50MzJMRQorICBhcnIud3JpdGVVSW50MzJCRSA9IEJQLndyaXRlVUludDMyQkUKKyAgYXJyLndyaXRlSW50TEUgPSBCUC53cml0ZUludExFCisgIGFyci53cml0ZUludEJFID0gQlAud3JpdGVJbnRCRQorICBhcnIud3JpdGVJbnQ4ID0gQlAud3JpdGVJbnQ4CisgIGFyci53cml0ZUludDE2TEUgPSBCUC53cml0ZUludDE2TEUKKyAgYXJyLndyaXRlSW50MTZCRSA9IEJQLndyaXRlSW50MTZCRQorICBhcnIud3JpdGVJbnQzMkxFID0gQlAud3JpdGVJbnQzMkxFCisgIGFyci53cml0ZUludDMyQkUgPSBCUC53cml0ZUludDMyQkUKKyAgYXJyLndyaXRlRmxvYXRMRSA9IEJQLndyaXRlRmxvYXRMRQorICBhcnIud3JpdGVGbG9hdEJFID0gQlAud3JpdGVGbG9hdEJFCisgIGFyci53cml0ZURvdWJsZUxFID0gQlAud3JpdGVEb3VibGVMRQorICBhcnIud3JpdGVEb3VibGVCRSA9IEJQLndyaXRlRG91YmxlQkUKKyAgYXJyLmZpbGwgPSBCUC5maWxsCisgIGFyci5pbnNwZWN0ID0gQlAuaW5zcGVjdAorICBhcnIudG9BcnJheUJ1ZmZlciA9IEJQLnRvQXJyYXlCdWZmZXIKKworICByZXR1cm4gYXJyCit9CisKK3ZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcLzAtOUEtelwtXS9nCisKK2Z1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHsKKyAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxuIGFuZCBcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdAorICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpCisgIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJycKKyAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJycKKyAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90CisgIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkgeworICAgIHN0ciA9IHN0ciArICc9JworICB9CisgIHJldHVybiBzdHIKK30KKworZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7CisgIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKCkKKyAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpCit9CisKK2Z1bmN0aW9uIGlzQXJyYXlpc2ggKHN1YmplY3QpIHsKKyAgcmV0dXJuIGlzQXJyYXkoc3ViamVjdCkgfHwgQnVmZmVyLmlzQnVmZmVyKHN1YmplY3QpIHx8CisgICAgICBzdWJqZWN0ICYmIHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JyAmJgorICAgICAgdHlwZW9mIHN1YmplY3QubGVuZ3RoID09PSAnbnVtYmVyJworfQorCitmdW5jdGlvbiB0b0hleCAobikgeworICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNikKKyAgcmV0dXJuIG4udG9TdHJpbmcoMTYpCit9CisKK2Z1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7CisgIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHkKKyAgdmFyIGNvZGVQb2ludAorICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aAorICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGwKKyAgdmFyIGJ5dGVzID0gW10KKyAgdmFyIGkgPSAwCisKKyAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpCisKKyAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50CisgICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHsKKyAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkCisgICAgICBpZiAobGVhZFN1cnJvZ2F0ZSkgeworICAgICAgICAvLyAyIGxlYWRzIGluIGEgcm93CisgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHsKKyAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCkKKyAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50CisgICAgICAgICAgY29udGludWUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpcgorICAgICAgICAgIGNvZGVQb2ludCA9IGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDAgfCAweDEwMDAwCisgICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGwKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm8gbGVhZCB5ZXQKKworICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7CisgICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbAorICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkgeworICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWQKKyAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCkKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIHZhbGlkIGxlYWQKKyAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50CisgICAgICAgICAgY29udGludWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkgeworICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZAorICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpCisgICAgICBsZWFkU3Vycm9nYXRlID0gbnVsbAorICAgIH0KKworICAgIC8vIGVuY29kZSB1dGY4CisgICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHsKKyAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVhaworICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpCisgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkgeworICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrCisgICAgICBieXRlcy5wdXNoKAorICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCwKKyAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODAKKyAgICAgICkKKyAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHsKKyAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVhaworICAgICAgYnl0ZXMucHVzaCgKKyAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsCisgICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCwKKyAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODAKKyAgICAgICkKKyAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MjAwMDAwKSB7CisgICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWsKKyAgICAgIGJ5dGVzLnB1c2goCisgICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCwKKyAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLAorICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsCisgICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwCisgICAgICApCisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JykKKyAgICB9CisgIH0KKworICByZXR1cm4gYnl0ZXMKK30KKworZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHsKKyAgdmFyIGJ5dGVBcnJheSA9IFtdCisgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CisgICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uCisgICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKQorICB9CisgIHJldHVybiBieXRlQXJyYXkKK30KKworZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHsKKyAgdmFyIGMsIGhpLCBsbworICB2YXIgYnl0ZUFycmF5ID0gW10KKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKKyAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWsKKworICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKQorICAgIGhpID0gYyA+PiA4CisgICAgbG8gPSBjICUgMjU2CisgICAgYnl0ZUFycmF5LnB1c2gobG8pCisgICAgYnl0ZUFycmF5LnB1c2goaGkpCisgIH0KKworICByZXR1cm4gYnl0ZUFycmF5Cit9CisKK2Z1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikgeworICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpCit9CisKK2Z1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkgeworICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVhaworICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXQorICB9CisgIHJldHVybiBpCit9CisKK2Z1bmN0aW9uIGRlY29kZVV0ZjhDaGFyIChzdHIpIHsKKyAgdHJ5IHsKKyAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cikKKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMHhGRkZEKSAvLyBVVEYgOCBpbnZhbGlkIGNoYXIKKyAgfQorfQorCit9LHsiYmFzZTY0LWpzIjoxMiwiaWVlZTc1NCI6MTMsImlzLWFycmF5IjoxNH1dLDEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBsb29rdXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CisKKzsoZnVuY3Rpb24gKGV4cG9ydHMpIHsKKwkndXNlIHN0cmljdCc7CisKKyAgdmFyIEFyciA9ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpCisgICAgPyBVaW50OEFycmF5CisgICAgOiBBcnJheQorCisJdmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApCisJdmFyIFNMQVNIICA9ICcvJy5jaGFyQ29kZUF0KDApCisJdmFyIE5VTUJFUiA9ICcwJy5jaGFyQ29kZUF0KDApCisJdmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApCisJdmFyIFVQUEVSICA9ICdBJy5jaGFyQ29kZUF0KDApCisJdmFyIFBMVVNfVVJMX1NBRkUgPSAnLScuY2hhckNvZGVBdCgwKQorCXZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApCisKKwlmdW5jdGlvbiBkZWNvZGUgKGVsdCkgeworCQl2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApCisJCWlmIChjb2RlID09PSBQTFVTIHx8CisJCSAgICBjb2RlID09PSBQTFVTX1VSTF9TQUZFKQorCQkJcmV0dXJuIDYyIC8vICcrJworCQlpZiAoY29kZSA9PT0gU0xBU0ggfHwKKwkJICAgIGNvZGUgPT09IFNMQVNIX1VSTF9TQUZFKQorCQkJcmV0dXJuIDYzIC8vICcvJworCQlpZiAoY29kZSA8IE5VTUJFUikKKwkJCXJldHVybiAtMSAvL25vIG1hdGNoCisJCWlmIChjb2RlIDwgTlVNQkVSICsgMTApCisJCQlyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjYKKwkJaWYgKGNvZGUgPCBVUFBFUiArIDI2KQorCQkJcmV0dXJuIGNvZGUgLSBVUFBFUgorCQlpZiAoY29kZSA8IExPV0VSICsgMjYpCisJCQlyZXR1cm4gY29kZSAtIExPV0VSICsgMjYKKwl9CisKKwlmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7CisJCXZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyCisKKwkJaWYgKGI2NC5sZW5ndGggJSA0ID4gMCkgeworCQkJdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JykKKwkJfQorCisJCS8vIHRoZSBudW1iZXIgb2YgZXF1YWwgc2lnbnMgKHBsYWNlIGhvbGRlcnMpCisJCS8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXQKKwkJLy8gcmVwcmVzZW50IG9uZSBieXRlCisJCS8vIGlmIHRoZXJlIGlzIG9ubHkgb25lLCB0aGVuIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIGJlZm9yZSBpdCByZXByZXNlbnQgMiBieXRlcworCQkvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlCisJCXZhciBsZW4gPSBiNjQubGVuZ3RoCisJCXBsYWNlSG9sZGVycyA9ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAyKSA/IDIgOiAnPScgPT09IGI2NC5jaGFyQXQobGVuIC0gMSkgPyAxIDogMAorCisJCS8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YQorCQlhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycykKKworCQkvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzCisJCWwgPSBwbGFjZUhvbGRlcnMgPiAwID8gYjY0Lmxlbmd0aCAtIDQgOiBiNjQubGVuZ3RoCisKKwkJdmFyIEwgPSAwCisKKwkJZnVuY3Rpb24gcHVzaCAodikgeworCQkJYXJyW0wrK10gPSB2CisJCX0KKworCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7CisJCQl0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKQorCQkJcHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KQorCQkJcHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KQorCQkJcHVzaCh0bXAgJiAweEZGKQorCQl9CisKKwkJaWYgKHBsYWNlSG9sZGVycyA9PT0gMikgeworCQkJdG1wID0gKGRlY29kZShiNjQuY2hhckF0KGkpKSA8PCAyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpID4+IDQpCisJCQlwdXNoKHRtcCAmIDB4RkYpCisJCX0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7CisJCQl0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMikKKwkJCXB1c2goKHRtcCA+PiA4KSAmIDB4RkYpCisJCQlwdXNoKHRtcCAmIDB4RkYpCisJCX0KKworCQlyZXR1cm4gYXJyCisJfQorCisJZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHsKKwkJdmFyIGksCisJCQlleHRyYUJ5dGVzID0gdWludDgubGVuZ3RoICUgMywgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXMKKwkJCW91dHB1dCA9ICIiLAorCQkJdGVtcCwgbGVuZ3RoCisKKwkJZnVuY3Rpb24gZW5jb2RlIChudW0pIHsKKwkJCXJldHVybiBsb29rdXAuY2hhckF0KG51bSkKKwkJfQorCisJCWZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7CisJCQlyZXR1cm4gZW5jb2RlKG51bSA+PiAxOCAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiAxMiAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiA2ICYgMHgzRikgKyBlbmNvZGUobnVtICYgMHgzRikKKwkJfQorCisJCS8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXIKKwkJZm9yIChpID0gMCwgbGVuZ3RoID0gdWludDgubGVuZ3RoIC0gZXh0cmFCeXRlczsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CisJCQl0ZW1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKQorCQkJb3V0cHV0ICs9IHRyaXBsZXRUb0Jhc2U2NCh0ZW1wKQorCQl9CisKKwkJLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlcworCQlzd2l0Y2ggKGV4dHJhQnl0ZXMpIHsKKwkJCWNhc2UgMToKKwkJCQl0ZW1wID0gdWludDhbdWludDgubGVuZ3RoIC0gMV0KKwkJCQlvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMikKKwkJCQlvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wIDw8IDQpICYgMHgzRikKKwkJCQlvdXRwdXQgKz0gJz09JworCQkJCWJyZWFrCisJCQljYXNlIDI6CisJCQkJdGVtcCA9ICh1aW50OFt1aW50OC5sZW5ndGggLSAyXSA8PCA4KSArICh1aW50OFt1aW50OC5sZW5ndGggLSAxXSkKKwkJCQlvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMTApCisJCQkJb3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpCisJCQkJb3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCAyKSAmIDB4M0YpCisJCQkJb3V0cHV0ICs9ICc9JworCQkJCWJyZWFrCisJCX0KKworCQlyZXR1cm4gb3V0cHV0CisJfQorCisJZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5CisJZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gdWludDhUb0Jhc2U2NAorfSh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyAodGhpcy5iYXNlNjRqcyA9IHt9KSA6IGV4cG9ydHMpKQorCit9LHt9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CitleHBvcnRzLnJlYWQgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7CisgIHZhciBlLCBtLAorICAgICAgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMSwKKyAgICAgIGVNYXggPSAoMSA8PCBlTGVuKSAtIDEsCisgICAgICBlQmlhcyA9IGVNYXggPj4gMSwKKyAgICAgIG5CaXRzID0gLTcsCisgICAgICBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDAsCisgICAgICBkID0gaXNMRSA/IC0xIDogMSwKKyAgICAgIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV07CisKKyAgaSArPSBkOworCisgIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpOworICBzID4+PSAoLW5CaXRzKTsKKyAgbkJpdHMgKz0gZUxlbjsKKyAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCk7CisKKyAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSk7CisgIGUgPj49ICgtbkJpdHMpOworICBuQml0cyArPSBtTGVuOworICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KTsKKworICBpZiAoZSA9PT0gMCkgeworICAgIGUgPSAxIC0gZUJpYXM7CisgIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkgeworICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KTsKKyAgfSBlbHNlIHsKKyAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pOworICAgIGUgPSBlIC0gZUJpYXM7CisgIH0KKyAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbik7Cit9OworCitleHBvcnRzLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHsKKyAgdmFyIGUsIG0sIGMsCisgICAgICBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxLAorICAgICAgZU1heCA9ICgxIDw8IGVMZW4pIC0gMSwKKyAgICAgIGVCaWFzID0gZU1heCA+PiAxLAorICAgICAgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApLAorICAgICAgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpLAorICAgICAgZCA9IGlzTEUgPyAxIDogLTEsCisgICAgICBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwOworCisgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpOworCisgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7CisgICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwOworICAgIGUgPSBlTWF4OworICB9IGVsc2UgeworICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKTsKKyAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7CisgICAgICBlLS07CisgICAgICBjICo9IDI7CisgICAgfQorICAgIGlmIChlICsgZUJpYXMgPj0gMSkgeworICAgICAgdmFsdWUgKz0gcnQgLyBjOworICAgIH0gZWxzZSB7CisgICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcyk7CisgICAgfQorICAgIGlmICh2YWx1ZSAqIGMgPj0gMikgeworICAgICAgZSsrOworICAgICAgYyAvPSAyOworICAgIH0KKworICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkgeworICAgICAgbSA9IDA7CisgICAgICBlID0gZU1heDsKKyAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7CisgICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7CisgICAgICBlID0gZSArIGVCaWFzOworICAgIH0gZWxzZSB7CisgICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7CisgICAgICBlID0gMDsKKyAgICB9CisgIH0KKworICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KTsKKworICBlID0gKGUgPDwgbUxlbikgfCBtOworICBlTGVuICs9IG1MZW47CisgIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCk7CisKKyAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4OworfTsKKworfSx7fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworCisvKioKKyAqIGlzQXJyYXkKKyAqLworCit2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7CisKKy8qKgorICogdG9TdHJpbmcKKyAqLworCit2YXIgc3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gYHZhbGAKKyAqIGlzIGFuIGFycmF5LgorICoKKyAqIGV4YW1wbGU6CisgKgorICogICAgICAgIGlzQXJyYXkoW10pOworICogICAgICAgIC8vID4gdHJ1ZQorICogICAgICAgIGlzQXJyYXkoYXJndW1lbnRzKTsKKyAqICAgICAgICAvLyA+IGZhbHNlCisgKiAgICAgICAgaXNBcnJheSgnJyk7CisgKiAgICAgICAgLy8gPiBmYWxzZQorICoKKyAqIEBwYXJhbSB7bWl4ZWR9IHZhbAorICogQHJldHVybiB7Ym9vbH0KKyAqLworCittb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXkgfHwgZnVuY3Rpb24gKHZhbCkgeworICByZXR1cm4gISEgdmFsICYmICdbb2JqZWN0IEFycmF5XScgPT0gc3RyLmNhbGwodmFsKTsKK307CisKK30se31dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlcgorCit2YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307Cit2YXIgcXVldWUgPSBbXTsKK3ZhciBkcmFpbmluZyA9IGZhbHNlOworCitmdW5jdGlvbiBkcmFpblF1ZXVlKCkgeworICAgIGlmIChkcmFpbmluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRyYWluaW5nID0gdHJ1ZTsKKyAgICB2YXIgY3VycmVudFF1ZXVlOworICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7CisgICAgd2hpbGUobGVuKSB7CisgICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlOworICAgICAgICBxdWV1ZSA9IFtdOworICAgICAgICB2YXIgaSA9IC0xOworICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7CisgICAgICAgICAgICBjdXJyZW50UXVldWVbaV0oKTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7CisgICAgfQorICAgIGRyYWluaW5nID0gZmFsc2U7Cit9Citwcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikgeworICAgIHF1ZXVlLnB1c2goZnVuKTsKKyAgICBpZiAoIWRyYWluaW5nKSB7CisgICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7CisgICAgfQorfTsKKworcHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJzsKK3Byb2Nlc3MuYnJvd3NlciA9IHRydWU7Citwcm9jZXNzLmVudiA9IHt9OworcHJvY2Vzcy5hcmd2ID0gW107Citwcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXMKK3Byb2Nlc3MudmVyc2lvbnMgPSB7fTsKKworZnVuY3Rpb24gbm9vcCgpIHt9CisKK3Byb2Nlc3Mub24gPSBub29wOworcHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7Citwcm9jZXNzLm9uY2UgPSBub29wOworcHJvY2Vzcy5vZmYgPSBub29wOworcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7Citwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7Citwcm9jZXNzLmVtaXQgPSBub29wOworCitwcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkgeworICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTsKK307CisKKy8vIFRPRE8oc2h0eWxtYW4pCitwcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9OworcHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpOworfTsKK3Byb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07CisKK30se31dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlvbiAoQnVmZmVyKXsKKyhmdW5jdGlvbiAoKSB7CisgICJ1c2Ugc3RyaWN0IjsKKworICBmdW5jdGlvbiBidG9hKHN0cikgeworICAgIHZhciBidWZmZXIKKyAgICAgIDsKKworICAgIGlmIChzdHIgaW5zdGFuY2VvZiBCdWZmZXIpIHsKKyAgICAgIGJ1ZmZlciA9IHN0cjsKKyAgICB9IGVsc2UgeworICAgICAgYnVmZmVyID0gbmV3IEJ1ZmZlcihzdHIudG9TdHJpbmcoKSwgJ2JpbmFyeScpOworICAgIH0KKworICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpOworICB9CisKKyAgbW9kdWxlLmV4cG9ydHMgPSBidG9hOworfSgpKTsKKworfSkuY2FsbCh0aGlzLHJlcXVpcmUoImJ1ZmZlciIpLkJ1ZmZlcikKKworfSx7ImJ1ZmZlciI6MTF9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKiBqc2hpbnQgbm9kZTogdHJ1ZSAqLworKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisKKyAgICBmdW5jdGlvbiBDb29raWVBY2Nlc3NJbmZvKGRvbWFpbiwgcGF0aCwgc2VjdXJlLCBzY3JpcHQpIHsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDb29raWVBY2Nlc3NJbmZvKSB7CisgICAgICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbiB8fCB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoIHx8ICIvIjsKKyAgICAgICAgICAgIHRoaXMuc2VjdXJlID0gISFzZWN1cmU7CisgICAgICAgICAgICB0aGlzLnNjcmlwdCA9ICEhc2NyaXB0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDb29raWVBY2Nlc3NJbmZvKGRvbWFpbiwgcGF0aCwgc2VjdXJlLCBzY3JpcHQpOworICAgIH0KKyAgICBleHBvcnRzLkNvb2tpZUFjY2Vzc0luZm8gPSBDb29raWVBY2Nlc3NJbmZvOworCisgICAgZnVuY3Rpb24gQ29va2llKGNvb2tpZXN0ciwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCkgeworICAgICAgICBpZiAoY29va2llc3RyIGluc3RhbmNlb2YgQ29va2llKSB7CisgICAgICAgICAgICByZXR1cm4gY29va2llc3RyOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQ29va2llKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBudWxsOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25fZGF0ZSA9IEluZmluaXR5OworICAgICAgICAgICAgdGhpcy5wYXRoID0gU3RyaW5nKHJlcXVlc3RfcGF0aCB8fCAiLyIpOworICAgICAgICAgICAgdGhpcy5leHBsaWNpdF9wYXRoID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmRvbWFpbiA9IHJlcXVlc3RfZG9tYWluIHx8IG51bGw7CisgICAgICAgICAgICB0aGlzLmV4cGxpY2l0X2RvbWFpbiA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5zZWN1cmUgPSBmYWxzZTsgLy9ob3cgdG8gZGVmaW5lIGRlZmF1bHQ/CisgICAgICAgICAgICB0aGlzLm5vc2NyaXB0ID0gZmFsc2U7IC8vaHR0cG9ubHkKKyAgICAgICAgICAgIGlmIChjb29raWVzdHIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnBhcnNlKGNvb2tpZXN0ciwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENvb2tpZShjb29raWVzdHIpOworICAgIH0KKyAgICBleHBvcnRzLkNvb2tpZSA9IENvb2tpZTsKKworICAgIENvb2tpZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHsKKyAgICAgICAgdmFyIHN0ciA9IFt0aGlzLm5hbWUgKyAiPSIgKyB0aGlzLnZhbHVlXTsKKyAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvbl9kYXRlICE9PSBJbmZpbml0eSkgeworICAgICAgICAgICAgc3RyLnB1c2goImV4cGlyZXM9IiArIChuZXcgRGF0ZSh0aGlzLmV4cGlyYXRpb25fZGF0ZSkpLnRvR01UU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmRvbWFpbikgeworICAgICAgICAgICAgc3RyLnB1c2goImRvbWFpbj0iICsgdGhpcy5kb21haW4pOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnBhdGgpIHsKKyAgICAgICAgICAgIHN0ci5wdXNoKCJwYXRoPSIgKyB0aGlzLnBhdGgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnNlY3VyZSkgeworICAgICAgICAgICAgc3RyLnB1c2goInNlY3VyZSIpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLm5vc2NyaXB0KSB7CisgICAgICAgICAgICBzdHIucHVzaCgiaHR0cG9ubHkiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyLmpvaW4oIjsgIik7CisgICAgfTsKKworICAgIENvb2tpZS5wcm90b3R5cGUudG9WYWx1ZVN0cmluZyA9IGZ1bmN0aW9uIHRvVmFsdWVTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPSIgKyB0aGlzLnZhbHVlOworICAgIH07CisKKyAgICB2YXIgY29va2llX3N0cl9zcGxpdHRlciA9IC9bOl0oPz1ccypbYS16QS1aMC05X1wtXStccypbPV0pL2c7CisgICAgQ29va2llLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKHN0ciwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCkgeworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENvb2tpZSkgeworICAgICAgICAgICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KCI7IikuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF2YWx1ZTsKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBwYWlyID0gcGFydHNbMF0ubWF0Y2goLyhbXj1dKyk9KFtcc1xTXSopLyksCisgICAgICAgICAgICAgICAga2V5ID0gcGFpclsxXSwKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhaXJbMl0sCisgICAgICAgICAgICAgICAgaTsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgcGFpciA9IHBhcnRzW2ldLm1hdGNoKC8oW149XSspKD86PShbXHNcU10qKSk/Lyk7CisgICAgICAgICAgICAgICAga2V5ID0gcGFpclsxXS50cmltKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhaXJbMl07CisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICJodHRwb25seSI6CisgICAgICAgICAgICAgICAgICAgIHRoaXMubm9zY3JpcHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJleHBpcmVzIjoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBpcmF0aW9uX2RhdGUgPSB2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKERhdGUucGFyc2UodmFsdWUpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5maW5pdHk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgInBhdGgiOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGggPSB2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudHJpbSgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIjsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBsaWNpdF9wYXRoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiZG9tYWluIjoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kb21haW4gPSB2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudHJpbSgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIjsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBsaWNpdF9kb21haW4gPSAhIXRoaXMuZG9tYWluOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJzZWN1cmUiOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF0aGlzLmV4cGxpY2l0X3BhdGgpIHsKKyAgICAgICAgICAgICAgIHRoaXMucGF0aCA9IHJlcXVlc3RfcGF0aCB8fCAiLyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRoaXMuZXhwbGljaXRfZG9tYWluKSB7CisgICAgICAgICAgICAgICB0aGlzLmRvbWFpbiA9IHJlcXVlc3RfZG9tYWluOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENvb2tpZSgpLnBhcnNlKHN0ciwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCk7CisgICAgfTsKKworICAgIENvb2tpZS5wcm90b3R5cGUubWF0Y2hlcyA9IGZ1bmN0aW9uIG1hdGNoZXMoYWNjZXNzX2luZm8pIHsKKyAgICAgICAgaWYgKHRoaXMubm9zY3JpcHQgJiYgYWNjZXNzX2luZm8uc2NyaXB0IHx8CisgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmUgJiYgIWFjY2Vzc19pbmZvLnNlY3VyZSB8fAorICAgICAgICAgICAgICAgICF0aGlzLmNvbGxpZGVzV2l0aChhY2Nlc3NfaW5mbykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgQ29va2llLnByb3RvdHlwZS5jb2xsaWRlc1dpdGggPSBmdW5jdGlvbiBjb2xsaWRlc1dpdGgoYWNjZXNzX2luZm8pIHsKKyAgICAgICAgaWYgKCh0aGlzLnBhdGggJiYgIWFjY2Vzc19pbmZvLnBhdGgpIHx8ICh0aGlzLmRvbWFpbiAmJiAhYWNjZXNzX2luZm8uZG9tYWluKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnBhdGggJiYgYWNjZXNzX2luZm8ucGF0aC5pbmRleE9mKHRoaXMucGF0aCkgIT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXRoaXMuZXhwbGljaXRfcGF0aCkgeworICAgICAgICAgICBpZiAodGhpcy5wYXRoICE9PSBhY2Nlc3NfaW5mby5wYXRoKSB7CisgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2YXIgYWNjZXNzX2RvbWFpbiA9IGFjY2Vzc19pbmZvLmRvbWFpbiAmJiBhY2Nlc3NfaW5mby5kb21haW4ucmVwbGFjZSgvXltcLl0vLCcnKTsKKyAgICAgICAgdmFyIGNvb2tpZV9kb21haW4gPSB0aGlzLmRvbWFpbiAmJiB0aGlzLmRvbWFpbi5yZXBsYWNlKC9eW1wuXS8sJycpOworICAgICAgICBpZiAoY29va2llX2RvbWFpbiA9PT0gYWNjZXNzX2RvbWFpbikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvb2tpZV9kb21haW4pIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5leHBsaWNpdF9kb21haW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHdlIGFscmVhZHkgY2hlY2tlZCBpZiB0aGUgZG9tYWlucyB3ZXJlIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB3aWxkY2FyZCA9IGFjY2Vzc19kb21haW4uaW5kZXhPZihjb29raWVfZG9tYWluKTsKKyAgICAgICAgICAgIGlmICh3aWxkY2FyZCA9PT0gLTEgfHwgd2lsZGNhcmQgIT09IGFjY2Vzc19kb21haW4ubGVuZ3RoIC0gY29va2llX2RvbWFpbi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgZnVuY3Rpb24gQ29va2llSmFyKCkgeworICAgICAgICB2YXIgY29va2llcywgY29va2llc19saXN0LCBjb2xsaWRhYmxlX2Nvb2tpZTsKKyAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDb29raWVKYXIpIHsKKyAgICAgICAgICAgIGNvb2tpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOyAvL25hbWU6IFtDb29raWVdCisKKyAgICAgICAgICAgIHRoaXMuc2V0Q29va2llID0gZnVuY3Rpb24gc2V0Q29va2llKGNvb2tpZSwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCkgeworICAgICAgICAgICAgICAgIHZhciByZW1vdmUsIGk7CisgICAgICAgICAgICAgICAgY29va2llID0gbmV3IENvb2tpZShjb29raWUsIHJlcXVlc3RfZG9tYWluLCByZXF1ZXN0X3BhdGgpOworICAgICAgICAgICAgICAgIC8vRGVsZXRlIHRoZSBjb29raWUgaWYgdGhlIHNldCBpcyBwYXN0IHRoZSBjdXJyZW50IHRpbWUKKyAgICAgICAgICAgICAgICByZW1vdmUgPSBjb29raWUuZXhwaXJhdGlvbl9kYXRlIDw9IERhdGUubm93KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvb2tpZXNbY29va2llLm5hbWVdICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29va2llc19saXN0ID0gY29va2llc1tjb29raWUubmFtZV07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29raWVzX2xpc3QubGVuZ3RoOyBpICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpZGFibGVfY29va2llID0gY29va2llc19saXN0W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpZGFibGVfY29va2llLmNvbGxpZGVzV2l0aChjb29raWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVzX2xpc3Quc3BsaWNlKGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llc19saXN0Lmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvb2tpZXNbY29va2llLm5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llc19saXN0W2ldID0gY29va2llOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvb2tpZXNfbGlzdC5wdXNoKGNvb2tpZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb29raWVzW2Nvb2tpZS5uYW1lXSA9IFtjb29raWVdOworICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVzW2Nvb2tpZS5uYW1lXTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvL3JldHVybnMgYSBjb29raWUKKyAgICAgICAgICAgIHRoaXMuZ2V0Q29va2llID0gZnVuY3Rpb24gZ2V0Q29va2llKGNvb2tpZV9uYW1lLCBhY2Nlc3NfaW5mbykgeworICAgICAgICAgICAgICAgIHZhciBjb29raWUsIGk7CisgICAgICAgICAgICAgICAgY29va2llc19saXN0ID0gY29va2llc1tjb29raWVfbmFtZV07CisgICAgICAgICAgICAgICAgaWYgKCFjb29raWVzX2xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29va2llc19saXN0Lmxlbmd0aDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZXNfbGlzdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5leHBpcmF0aW9uX2RhdGUgPD0gRGF0ZS5ub3coKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZXNfbGlzdC5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29va2llc1tjb29raWUubmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llLm1hdGNoZXMoYWNjZXNzX2luZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29va2llOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIC8vcmV0dXJucyBhIGxpc3Qgb2YgY29va2llcworICAgICAgICAgICAgdGhpcy5nZXRDb29raWVzID0gZnVuY3Rpb24gZ2V0Q29va2llcyhhY2Nlc3NfaW5mbykgeworICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW10sIGNvb2tpZV9uYW1lLCBjb29raWU7CisgICAgICAgICAgICAgICAgZm9yIChjb29raWVfbmFtZSBpbiBjb29raWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGNvb2tpZSA9IHRoaXMuZ2V0Q29va2llKGNvb2tpZV9uYW1lLCBhY2Nlc3NfaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb29raWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChjb29raWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hdGNoZXMudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMuam9pbigiOiIpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbWF0Y2hlcy50b1ZhbHVlU3RyaW5nID0gZnVuY3Rpb24gdG9WYWx1ZVN0cmluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMubWFwKGZ1bmN0aW9uIChjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy50b1ZhbHVlU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJzsnKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDb29raWVKYXIoKTsKKyAgICB9CisgICAgZXhwb3J0cy5Db29raWVKYXIgPSBDb29raWVKYXI7CisKKyAgICAvL3JldHVybnMgbGlzdCBvZiBjb29raWVzIHRoYXQgd2VyZSBzZXQgY29ycmVjdGx5LiBDb29raWVzIHRoYXQgYXJlIGV4cGlyZWQgYW5kIHJlbW92ZWQgYXJlIG5vdCByZXR1cm5lZC4KKyAgICBDb29raWVKYXIucHJvdG90eXBlLnNldENvb2tpZXMgPSBmdW5jdGlvbiBzZXRDb29raWVzKGNvb2tpZXMsIHJlcXVlc3RfZG9tYWluLCByZXF1ZXN0X3BhdGgpIHsKKyAgICAgICAgY29va2llcyA9IEFycmF5LmlzQXJyYXkoY29va2llcykgPworICAgICAgICAgICAgICAgIGNvb2tpZXMgOgorICAgICAgICAgICAgICAgIGNvb2tpZXMuc3BsaXQoY29va2llX3N0cl9zcGxpdHRlcik7CisgICAgICAgIHZhciBzdWNjZXNzZnVsID0gW10sCisgICAgICAgICAgICBpLAorICAgICAgICAgICAgY29va2llOworICAgICAgICBjb29raWVzID0gY29va2llcy5tYXAoQ29va2llKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpICs9IDEpIHsKKyAgICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZXNbaV07CisgICAgICAgICAgICBpZiAodGhpcy5zZXRDb29raWUoY29va2llLCByZXF1ZXN0X2RvbWFpbiwgcmVxdWVzdF9wYXRoKSkgeworICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwucHVzaChjb29raWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWNjZXNzZnVsOworICAgIH07Cit9KCkpOworCit9LHt9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKiEKKyAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjIuMS4zCisgKiBodHRwOi8vanF1ZXJ5LmNvbS8KKyAqCisgKiBJbmNsdWRlcyBTaXp6bGUuanMKKyAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCisgKgorICogQ29weXJpZ2h0IDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycworICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCisgKgorICogRGF0ZTogMjAxNC0xMi0xOFQxNToxMVoKKyAqLworCisoZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHsKKworCWlmICggdHlwZW9mIG1vZHVsZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAib2JqZWN0IiApIHsKKwkJLy8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YAorCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgorCQkvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YAorCQkvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy4KKwkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KKwkJLy8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZSgianF1ZXJ5Iikod2luZG93KTsKKwkJLy8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby4KKwkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPworCQkJZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOgorCQkJZnVuY3Rpb24oIHcgKSB7CisJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKKwkJCQkJdGhyb3cgbmV3IEVycm9yKCAialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIgKTsKKwkJCQl9CisJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKKwkJCX07CisJfSBlbHNlIHsKKwkJZmFjdG9yeSggZ2xvYmFsICk7CisJfQorCisvLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAorfSh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkgeworCisvLyBTdXBwb3J0OiBGaXJlZm94IDE4KworLy8gQ2FuJ3QgYmUgaW4gc3RyaWN0IG1vZGUsIHNldmVyYWwgbGlicyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZQorLy8gdGhlIHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmCisvLyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggInVzZSBzdHJpY3QiIGNhbGwgY2hhaW5zLiAoIzEzMzM1KQorLy8KKwordmFyIGFyciA9IFtdOworCit2YXIgc2xpY2UgPSBhcnIuc2xpY2U7CisKK3ZhciBjb25jYXQgPSBhcnIuY29uY2F0OworCit2YXIgcHVzaCA9IGFyci5wdXNoOworCit2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOworCit2YXIgY2xhc3MydHlwZSA9IHt9OworCit2YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nOworCit2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKKwordmFyIHN1cHBvcnQgPSB7fTsKKworCisKK3ZhcgorCS8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKKwlkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKKworCXZlcnNpb24gPSAiMi4xLjMiLAorCisJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKKwlqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJworCQkvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKQorCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOworCX0sCisKKwkvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMQorCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAorCXJ0cmltID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLAorCisJLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCisJcm1zUHJlZml4ID0gL14tbXMtLywKKwlyZGFzaEFscGhhID0gLy0oW1xkYS16XSkvZ2ksCisKKwkvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCisJZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHsKKwkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworCX07CisKK2pRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7CisJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZAorCWpxdWVyeTogdmVyc2lvbiwKKworCWNvbnN0cnVjdG9yOiBqUXVlcnksCisKKwkvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNlbGVjdG9yCisJc2VsZWN0b3I6ICIiLAorCisJLy8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwCisJbGVuZ3RoOiAwLAorCisJdG9BcnJheTogZnVuY3Rpb24oKSB7CisJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7CisJfSwKKworCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKwkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorCWdldDogZnVuY3Rpb24oIG51bSApIHsKKwkJcmV0dXJuIG51bSAhPSBudWxsID8KKworCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAorCQkJKCBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdICkgOgorCisJCQkvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5CisJCQlzbGljZS5jYWxsKCB0aGlzICk7CisJfSwKKworCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKKwkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKKwlwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHsKKworCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAorCQl2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7CisKKwkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKKwkJcmV0LnByZXZPYmplY3QgPSB0aGlzOworCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKKworCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAorCQlyZXR1cm4gcmV0OworCX0sCisKKwkvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LgorCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCisJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQorCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHsKKwkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKKwkJfSkpOworCX0sCisKKwlzbGljZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7CisJfSwKKworCWZpcnN0OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKKwl9LAorCisJbGFzdDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmVxKCAtMSApOworCX0sCisKKwllcTogZnVuY3Rpb24oIGkgKSB7CisJCXZhciBsZW4gPSB0aGlzLmxlbmd0aCwKKwkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbal0gXSA6IFtdICk7CisJfSwKKworCWVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKKwl9LAorCisJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgorCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgorCXB1c2g6IHB1c2gsCisJc29ydDogYXJyLnNvcnQsCisJc3BsaWNlOiBhcnIuc3BsaWNlCit9OworCitqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgeworCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKKwkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAorCQlpID0gMSwKKwkJbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwKKwkJZGVlcCA9IGZhbHNlOworCisJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgorCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgeworCQlkZWVwID0gdGFyZ2V0OworCisJCS8vIFNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKKwkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CisJCWkrKzsKKwl9CisKKwkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKKwlpZiAoIHR5cGVvZiB0YXJnZXQgIT09ICJvYmplY3QiICYmICFqUXVlcnkuaXNGdW5jdGlvbih0YXJnZXQpICkgeworCQl0YXJnZXQgPSB7fTsKKwl9CisKKwkvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWQKKwlpZiAoIGkgPT09IGxlbmd0aCApIHsKKwkJdGFyZ2V0ID0gdGhpczsKKwkJaS0tOworCX0KKworCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCisJCWlmICggKG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSkgIT0gbnVsbCApIHsKKwkJCS8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKKwkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKKwkJCQljb3B5ID0gb3B0aW9uc1sgbmFtZSBdOworCisJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAorCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKKwkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkgeworCQkJCQlpZiAoIGNvcHlJc0FycmF5ICkgeworCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKKwkJCQkJCWNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9OworCQkJCQl9CisKKwkJCQkJLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCisJCQkJCXRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTsKKworCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKKwkJCQl9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAorCXJldHVybiB0YXJnZXQ7Cit9OworCitqUXVlcnkuZXh0ZW5kKHsKKwkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKKwlleHBhbmRvOiAialF1ZXJ5IiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXEQvZywgIiIgKSwKKworCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCisJaXNSZWFkeTogdHJ1ZSwKKworCWVycm9yOiBmdW5jdGlvbiggbXNnICkgeworCQl0aHJvdyBuZXcgRXJyb3IoIG1zZyApOworCX0sCisKKwlub29wOiBmdW5jdGlvbigpIHt9LAorCisJaXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7CisJfSwKKworCWlzQXJyYXk6IEFycmF5LmlzQXJyYXksCisKKwlpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdzsKKwl9LAorCisJaXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkgeworCQkvLyBwYXJzZUZsb2F0IE5hTnMgbnVtZXJpYy1jYXN0IGZhbHNlIHBvc2l0aXZlcyAobnVsbHx0cnVlfGZhbHNlfCIiKQorCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQorCQkvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU4KKwkJLy8gYWRkaW5nIDEgY29ycmVjdHMgbG9zcyBvZiBwcmVjaXNpb24gZnJvbSBwYXJzZUZsb2F0ICgjMTUxMDApCisJCXJldHVybiAhalF1ZXJ5LmlzQXJyYXkoIG9iaiApICYmIChvYmogLSBwYXJzZUZsb2F0KCBvYmogKSArIDEpID49IDA7CisJfSwKKworCWlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7CisJCS8vIE5vdCBwbGFpbiBvYmplY3RzOgorCQkvLyAtIEFueSBvYmplY3Qgb3IgdmFsdWUgd2hvc2UgaW50ZXJuYWwgW1tDbGFzc11dIHByb3BlcnR5IGlzIG5vdCAiW29iamVjdCBPYmplY3RdIgorCQkvLyAtIERPTSBub2RlcworCQkvLyAtIHdpbmRvdworCQlpZiAoIGpRdWVyeS50eXBlKCBvYmogKSAhPT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIG9iai5jb25zdHJ1Y3RvciAmJgorCQkJCSFoYXNPd24uY2FsbCggb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiICkgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBJZiB0aGUgZnVuY3Rpb24gaGFzbid0IHJldHVybmVkIGFscmVhZHksIHdlJ3JlIGNvbmZpZGVudCB0aGF0CisJCS8vIHxvYmp8IGlzIGEgcGxhaW4gb2JqZWN0LCBjcmVhdGVkIGJ5IHt9IG9yIGNvbnN0cnVjdGVkIHdpdGggbmV3IE9iamVjdAorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKKwkJdmFyIG5hbWU7CisJCWZvciAoIG5hbWUgaW4gb2JqICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0sCisKKwl0eXBlOiBmdW5jdGlvbiggb2JqICkgeworCQlpZiAoIG9iaiA9PSBudWxsICkgeworCQkJcmV0dXJuIG9iaiArICIiOworCQl9CisJCS8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wLCBpT1M8NiAoZnVuY3Rpb25pc2ggUmVnRXhwKQorCQlyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CisJCQljbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKG9iaikgXSB8fCAib2JqZWN0IiA6CisJCQl0eXBlb2Ygb2JqOworCX0sCisKKwkvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAorCWdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkgeworCQl2YXIgc2NyaXB0LAorCQkJaW5kaXJlY3QgPSBldmFsOworCisJCWNvZGUgPSBqUXVlcnkudHJpbSggY29kZSApOworCisJCWlmICggY29kZSApIHsKKwkJCS8vIElmIHRoZSBjb2RlIGluY2x1ZGVzIGEgdmFsaWQsIHByb2xvZ3VlIHBvc2l0aW9uCisJCQkvLyBzdHJpY3QgbW9kZSBwcmFnbWEsIGV4ZWN1dGUgY29kZSBieSBpbmplY3RpbmcgYQorCQkJLy8gc2NyaXB0IHRhZyBpbnRvIHRoZSBkb2N1bWVudC4KKwkJCWlmICggY29kZS5pbmRleE9mKCJ1c2Ugc3RyaWN0IikgPT09IDEgKSB7CisJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CisJCQkJc2NyaXB0LnRleHQgPSBjb2RlOworCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJfSBlbHNlIHsKKwkJCS8vIE90aGVyd2lzZSwgYXZvaWQgdGhlIERPTSBub2RlIGNyZWF0aW9uLCBpbnNlcnRpb24KKwkJCS8vIGFuZCByZW1vdmFsIGJ5IHVzaW5nIGFuIGluZGlyZWN0IGdsb2JhbCBldmFsCisJCQkJaW5kaXJlY3QoIGNvZGUgKTsKKwkJCX0KKwkJfQorCX0sCisKKwkvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCisJLy8gU3VwcG9ydDogSUU5LTExKworCS8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3MikKKwljYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CisJCXJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKKwl9LAorCisJbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTsKKwl9LAorCisJLy8gYXJncyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrLCBhcmdzICkgeworCQl2YXIgdmFsdWUsCisJCQlpID0gMCwKKwkJCWxlbmd0aCA9IG9iai5sZW5ndGgsCisJCQlpc0FycmF5ID0gaXNBcnJheWxpa2UoIG9iaiApOworCisJCWlmICggYXJncyApIHsKKwkJCWlmICggaXNBcnJheSApIHsKKwkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJCQkJdmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTsKKworCQkJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCBpIGluIG9iaiApIHsKKwkJCQkJdmFsdWUgPSBjYWxsYmFjay5hcHBseSggb2JqWyBpIF0sIGFyZ3MgKTsKKworCQkJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCisJCX0gZWxzZSB7CisJCQlpZiAoIGlzQXJyYXkgKSB7CisJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJCXZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7CisKKwkJCQkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggaSBpbiBvYmogKSB7CisJCQkJCXZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICk7CisKKwkJCQkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBvYmo7CisJfSwKKworCS8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xCisJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CisJCXJldHVybiB0ZXh0ID09IG51bGwgPworCQkJIiIgOgorCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKKwl9LAorCisJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQorCW1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHsKKwkJdmFyIHJldCA9IHJlc3VsdHMgfHwgW107CisKKwkJaWYgKCBhcnIgIT0gbnVsbCApIHsKKwkJCWlmICggaXNBcnJheWxpa2UoIE9iamVjdChhcnIpICkgKSB7CisJCQkJalF1ZXJ5Lm1lcmdlKCByZXQsCisJCQkJCXR5cGVvZiBhcnIgPT09ICJzdHJpbmciID8KKwkJCQkJWyBhcnIgXSA6IGFycgorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7CisJCXJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTsKKwl9LAorCisJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgeworCQl2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsCisJCQlqID0gMCwKKwkJCWkgPSBmaXJzdC5sZW5ndGg7CisKKwkJZm9yICggOyBqIDwgbGVuOyBqKysgKSB7CisJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKKwkJfQorCisJCWZpcnN0Lmxlbmd0aCA9IGk7CisKKwkJcmV0dXJuIGZpcnN0OworCX0sCisKKwlncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7CisJCXZhciBjYWxsYmFja0ludmVyc2UsCisJCQltYXRjaGVzID0gW10sCisJCQlpID0gMCwKKwkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKKwkJCWNhbGxiYWNrRXhwZWN0ID0gIWludmVydDsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CisJCQlpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7CisJCQkJbWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbWF0Y2hlczsKKwl9LAorCisJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CisJCXZhciB2YWx1ZSwKKwkJCWkgPSAwLAorCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAorCQkJaXNBcnJheSA9IGlzQXJyYXlsaWtlKCBlbGVtcyApLAorCQkJcmV0ID0gW107CisKKwkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXMKKwkJaWYgKCBpc0FycmF5ICkgeworCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CisKKwkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CisJCQkJCXJldC5wdXNoKCB2YWx1ZSApOworCQkJCX0KKwkJCX0KKworCQkvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LAorCQl9IGVsc2UgeworCQkJZm9yICggaSBpbiBlbGVtcyApIHsKKwkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKKworCQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKKwkJCQkJcmV0LnB1c2goIHZhbHVlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cworCQlyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7CisJfSwKKworCS8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0cworCWd1aWQ6IDEsCisKKwkvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnkKKwkvLyBhcmd1bWVudHMuCisJcHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHsKKwkJdmFyIHRtcCwgYXJncywgcHJveHk7CisKKwkJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CisJCQl0bXAgPSBmblsgY29udGV4dCBdOworCQkJY29udGV4dCA9IGZuOworCQkJZm4gPSB0bXA7CisJCX0KKworCQkvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlYworCQkvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLgorCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKKwkJCXJldHVybiB1bmRlZmluZWQ7CisJCX0KKworCQkvLyBTaW11bGF0ZWQgYmluZAorCQlhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7CisJCXByb3h5ID0gZnVuY3Rpb24oKSB7CisJCQlyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKKwkJfTsKKworCQkvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWQKKwkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CisKKwkJcmV0dXJuIHByb3h5OworCX0sCisKKwlub3c6IERhdGUubm93LAorCisJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCisJLy8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC4KKwlzdXBwb3J0OiBzdXBwb3J0Cit9KTsKKworLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCitqUXVlcnkuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgbmFtZSkgeworCWNsYXNzMnR5cGVbICJbb2JqZWN0ICIgKyBuYW1lICsgIl0iIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7Cit9KTsKKworZnVuY3Rpb24gaXNBcnJheWxpa2UoIG9iaiApIHsKKwl2YXIgbGVuZ3RoID0gb2JqLmxlbmd0aCwKKwkJdHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTsKKworCWlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCBvYmoubm9kZVR5cGUgPT09IDEgJiYgbGVuZ3RoICkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKKwkJdHlwZW9mIGxlbmd0aCA9PT0gIm51bWJlciIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7Cit9Cit2YXIgU2l6emxlID0KKy8qIQorICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMi4wLXByZQorICogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDE0LTEyLTE2CisgKi8KKyhmdW5jdGlvbiggd2luZG93ICkgeworCit2YXIgaSwKKwlzdXBwb3J0LAorCUV4cHIsCisJZ2V0VGV4dCwKKwlpc1hNTCwKKwl0b2tlbml6ZSwKKwljb21waWxlLAorCXNlbGVjdCwKKwlvdXRlcm1vc3RDb250ZXh0LAorCXNvcnRJbnB1dCwKKwloYXNEdXBsaWNhdGUsCisKKwkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCisJc2V0RG9jdW1lbnQsCisJZG9jdW1lbnQsCisJZG9jRWxlbSwKKwlkb2N1bWVudElzSFRNTCwKKwlyYnVnZ3lRU0EsCisJcmJ1Z2d5TWF0Y2hlcywKKwltYXRjaGVzLAorCWNvbnRhaW5zLAorCisJLy8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YQorCWV4cGFuZG8gPSAic2l6emxlIiArIDEgKiBuZXcgRGF0ZSgpLAorCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKKwlkaXJydW5zID0gMCwKKwlkb25lID0gMCwKKwljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKKwl0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSwKKwljb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSwKKwlzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKKwkJaWYgKCBhID09PSBiICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9LAorCisJLy8gR2VuZXJhbC1wdXJwb3NlIGNvbnN0YW50cworCU1BWF9ORUdBVElWRSA9IDEgPDwgMzEsCisKKwkvLyBJbnN0YW5jZSBtZXRob2RzCisJaGFzT3duID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwKKwlhcnIgPSBbXSwKKwlwb3AgPSBhcnIucG9wLAorCXB1c2hfbmF0aXZlID0gYXJyLnB1c2gsCisJcHVzaCA9IGFyci5wdXNoLAorCXNsaWNlID0gYXJyLnNsaWNlLAorCS8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZQorCS8vIGh0dHA6Ly9qc3BlcmYuY29tL3Rob3ItaW5kZXhvZi12cy1mb3IvNQorCWluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHsKKwkJdmFyIGkgPSAwLAorCQkJbGVuID0gbGlzdC5sZW5ndGg7CisJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCXJldHVybiAtMTsKKwl9LAorCisJYm9vbGVhbnMgPSAiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLAorCisJLy8gUmVndWxhciBleHByZXNzaW9ucworCisJLy8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCisJd2hpdGVzcGFjZSA9ICJbXFx4MjBcXHRcXHJcXG5cXGZdIiwKKwkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXN5bnRheC8jY2hhcmFjdGVycworCWNoYXJhY3RlckVuY29kaW5nID0gIig/OlxcXFwufFtcXHctXXxbXlxceDAwLVxceGEwXSkrIiwKKworCS8vIExvb3NlbHkgbW9kZWxlZCBvbiBDU1MgaWRlbnRpZmllciBjaGFyYWN0ZXJzCisJLy8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlkZW50aWZpZXIgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnMKKwkvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXIKKwlpZGVudGlmaWVyID0gY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyMiICksCisKKwkvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnMKKwlhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikoPzoiICsgd2hpdGVzcGFjZSArCisJCS8vIE9wZXJhdG9yIChjYXB0dXJlIDIpCisJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKworCQkvLyAiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XSIKKwkJIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIiArIGlkZW50aWZpZXIgKyAiKSl8KSIgKyB3aGl0ZXNwYWNlICsKKwkJIipcXF0iLAorCisJcHNldWRvcyA9ICI6KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86XFwoKCIgKworCQkvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOgorCQkvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0IG9yIGNhcHR1cmUgNSkKKwkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCisJCS8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KQorCQkiKCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIGF0dHJpYnV0ZXMgKyAiKSopfCIgKworCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCisJCSIuKiIgKworCQkiKVxcKXwpIiwKKworCS8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXIKKwlyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyAiKyIsICJnIiApLAorCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAorCisJcmNvbW1hID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqLCIgKyB3aGl0ZXNwYWNlICsgIioiICksCisJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAorCisJcmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAoICI9IiArIHdoaXRlc3BhY2UgKyAiKihbXlxcXSdcIl0qPykiICsgd2hpdGVzcGFjZSArICIqXFxdIiwgImciICksCisKKwlycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAorCXJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAorCisJbWF0Y2hFeHByID0geworCQkiSUQiOiBuZXcgUmVnRXhwKCAiXiMoIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICksCisJCSJDTEFTUyI6IG5ldyBSZWdFeHAoICJeXFwuKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpIiApLAorCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoICJ3IiwgIncqIiApICsgIikiICksCisJCSJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLAorCQkiUFNFVURPIjogbmV3IFJlZ0V4cCggIl4iICsgcHNldWRvcyApLAorCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKworCQkJIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiICsgd2hpdGVzcGFjZSArICIqKD86KFsrLV18KSIgKyB3aGl0ZXNwYWNlICsKKwkJCSIqKFxcZCspfCkpIiArIHdoaXRlc3BhY2UgKyAiKlxcKXwpIiwgImkiICksCisJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKKwkJLy8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpCisJCS8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGAKKwkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCisJCQl3aGl0ZXNwYWNlICsgIiooKD86LVxcZCk/XFxkKikiICsgd2hpdGVzcGFjZSArICIqXFwpfCkoPz1bXi1dfCQpIiwgImkiICkKKwl9LAorCisJcmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksCisJcmhlYWRlciA9IC9eaFxkJC9pLAorCisJcm5hdGl2ZSA9IC9eW157XStce1xzKlxbbmF0aXZlIFx3LywKKworCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycworCXJxdWlja0V4cHIgPSAvXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLAorCisJcnNpYmxpbmcgPSAvWyt+XS8sCisJcmVzY2FwZSA9IC8nfFxcL2csCisKKwkvLyBDU1MgZXNjYXBlcyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzCisJcnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggIlxcXFwoW1xcZGEtZl17MSw2fSIgKyB3aGl0ZXNwYWNlICsgIj98KCIgKyB3aGl0ZXNwYWNlICsgIil8LikiLCAiaWciICksCisJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgeworCQl2YXIgaGlnaCA9ICIweCIgKyBlc2NhcGVkIC0gMHgxMDAwMDsKKwkJLy8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnQKKwkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAorCQkvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICsiMHgiCisJCXJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID8KKwkJCWVzY2FwZWQgOgorCQkJaGlnaCA8IDAgPworCQkJCS8vIEJNUCBjb2RlcG9pbnQKKwkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKKwkJCQkvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcikKKwkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTsKKwl9LAorCisJLy8gVXNlZCBmb3IgaWZyYW1lcworCS8vIFNlZSBzZXREb2N1bWVudCgpCisJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgorCS8vIGVycm9yIGluIElFCisJdW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkgeworCQlzZXREb2N1bWVudCgpOworCX07CisKKy8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApCit0cnkgeworCXB1c2guYXBwbHkoCisJCShhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSwKKwkJcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMKKwkpOworCS8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wCisJLy8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseQorCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cit9IGNhdGNoICggZSApIHsKKwlwdXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/CisKKwkJLy8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGUKKwkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgeworCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CisJCX0gOgorCisJCS8vIFN1cHBvcnQ6IElFPDkKKwkJLy8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseQorCQlmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7CisJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCisJCQkJaSA9IDA7CisJCQkvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGgKKwkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KKwkJCXRhcmdldC5sZW5ndGggPSBqIC0gMTsKKwkJfQorCX07Cit9CisKK2Z1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CisJdmFyIG1hdGNoLCBlbGVtLCBtLCBub2RlVHlwZSwKKwkJLy8gUVNBIHZhcnMKKwkJaSwgZ3JvdXBzLCBvbGQsIG5pZCwgbmV3Q29udGV4dCwgbmV3U2VsZWN0b3I7CisKKwlpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkgeworCQlzZXREb2N1bWVudCggY29udGV4dCApOworCX0KKworCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOworCW5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTsKKworCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiB8fCAhc2VsZWN0b3IgfHwKKwkJbm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDkgJiYgbm9kZVR5cGUgIT09IDExICkgeworCisJCXJldHVybiByZXN1bHRzOworCX0KKworCWlmICggIXNlZWQgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CisKKwkJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyB3aGVuIHBvc3NpYmxlIChlLmcuLCBub3QgdW5kZXIgRG9jdW1lbnRGcmFnbWVudCkKKwkJaWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHsKKwkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCisJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgeworCQkJCWlmICggbm9kZVR5cGUgPT09IDkgKSB7CisJCQkJCWVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7CisJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCisJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2MykKKwkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKKwkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zCisJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKKwkJCQkJCWlmICggZWxlbS5pZCA9PT0gbSApIHsKKwkJCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsKKwkJCQkJCQlyZXR1cm4gcmVzdWx0czsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiByZXN1bHRzOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudAorCQkJCQlpZiAoIGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxlbSA9IGNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbSApKSAmJgorCQkJCQkJY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09PSBtICkgeworCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CisJCQkJCQlyZXR1cm4gcmVzdWx0czsKKwkJCQkJfQorCQkJCX0KKworCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKKwkJCX0gZWxzZSBpZiAoIG1hdGNoWzJdICkgeworCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTsKKwkJCQlyZXR1cm4gcmVzdWx0czsKKworCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiLkNMQVNTIikKKwkJCX0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKKwkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApOworCQkJCXJldHVybiByZXN1bHRzOworCQkJfQorCQl9CisKKwkJLy8gUVNBIHBhdGgKKwkJaWYgKCBzdXBwb3J0LnFzYSAmJiAoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkgeworCQkJbmlkID0gb2xkID0gZXhwYW5kbzsKKwkJCW5ld0NvbnRleHQgPSBjb250ZXh0OworCQkJbmV3U2VsZWN0b3IgPSBub2RlVHlwZSAhPT0gMSAmJiBzZWxlY3RvcjsKKworCQkJLy8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzCisJCQkvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290CisJCQkvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSkKKwkJCS8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50cworCQkJaWYgKCBub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJvYmplY3QiICkgeworCQkJCWdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApOworCisJCQkJaWYgKCAob2xkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImlkIikpICkgeworCQkJCQluaWQgPSBvbGQucmVwbGFjZSggcmVzY2FwZSwgIlxcJCYiICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIG5pZCApOworCQkJCX0KKwkJCQluaWQgPSAiW2lkPSciICsgbmlkICsgIiddICI7CisKKwkJCQlpID0gZ3JvdXBzLmxlbmd0aDsKKwkJCQl3aGlsZSAoIGktLSApIHsKKwkJCQkJZ3JvdXBzW2ldID0gbmlkICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7CisJCQkJfQorCQkJCW5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0OworCQkJCW5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIiwiKTsKKwkJCX0KKworCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKKwkJCQl0cnkgeworCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAorCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCisJCQkJCSk7CisJCQkJCXJldHVybiByZXN1bHRzOworCQkJCX0gY2F0Y2gocXNhRXJyb3IpIHsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlpZiAoICFvbGQgKSB7CisJCQkJCQljb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vIEFsbCBvdGhlcnMKKwlyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7Cit9CisKKy8qKgorICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCisgKiBAcmV0dXJucyB7RnVuY3Rpb24oc3RyaW5nLCBPYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoCisgKglwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKQorICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQorICovCitmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHsKKwl2YXIga2V5cyA9IFtdOworCisJZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7CisJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQorCQlpZiAoIGtleXMucHVzaCgga2V5ICsgIiAiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgeworCQkJLy8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzCisJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOworCQl9CisJCXJldHVybiAoY2FjaGVbIGtleSArICIgIiBdID0gdmFsdWUpOworCX0KKwlyZXR1cm4gY2FjaGU7Cit9CisKKy8qKgorICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCisgKi8KK2Z1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7CisJZm5bIGV4cGFuZG8gXSA9IHRydWU7CisJcmV0dXJuIGZuOworfQorCisvKioKKyAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50CisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZGl2IGFuZCBleHBlY3RzIGEgYm9vbGVhbiByZXN1bHQKKyAqLworZnVuY3Rpb24gYXNzZXJ0KCBmbiApIHsKKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisKKwl0cnkgeworCQlyZXR1cm4gISFmbiggZGl2ICk7CisJfSBjYXRjaCAoZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfSBmaW5hbGx5IHsKKwkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CisJCWlmICggZGl2LnBhcmVudE5vZGUgKSB7CisJCQlkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7CisJCX0KKwkJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKKwkJZGl2ID0gbnVsbDsKKwl9Cit9CisKKy8qKgorICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRycworICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcworICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkCisgKi8KK2Z1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7CisJdmFyIGFyciA9IGF0dHJzLnNwbGl0KCJ8IiksCisJCWkgPSBhdHRycy5sZW5ndGg7CisKKwl3aGlsZSAoIGktLSApIHsKKwkJRXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7CisJfQorfQorCisvKioKKyAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKKyAqIEBwYXJhbSB7RWxlbWVudH0gYQorICogQHBhcmFtIHtFbGVtZW50fSBiCisgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKKyAqLworZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkgeworCXZhciBjdXIgPSBiICYmIGEsCisJCWRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmCisJCQkoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC0KKwkJCSggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7CisKKwkvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKKwlpZiAoIGRpZmYgKSB7CisJCXJldHVybiBkaWZmOworCX0KKworCS8vIENoZWNrIGlmIGIgZm9sbG93cyBhCisJaWYgKCBjdXIgKSB7CisJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CisJCQlpZiAoIGN1ciA9PT0gYiApIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYSA/IDEgOiAtMTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzCisgKiBAcGFyYW0ge1N0cmluZ30gdHlwZQorICovCitmdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHsKKwlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCQlyZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7CisJfTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKKyAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHsKKwlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCQlyZXR1cm4gKG5hbWUgPT09ICJpbnB1dCIgfHwgbmFtZSA9PT0gImJ1dHRvbiIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTsKKwl9OworfQorCisvKioKKyAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgcG9zaXRpb25hbHMKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkgeworCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgeworCQlhcmd1bWVudCA9ICthcmd1bWVudDsKKwkJcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKKwkJCXZhciBqLAorCQkJCW1hdGNoSW5kZXhlcyA9IGZuKCBbXSwgc2VlZC5sZW5ndGgsIGFyZ3VtZW50ICksCisJCQkJaSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7CisKKwkJCS8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlcworCQkJd2hpbGUgKCBpLS0gKSB7CisJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKKwkJCQkJc2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfSk7Cit9CisKKy8qKgorICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAorICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHQKKyAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZQorICovCitmdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHsKKwlyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgY29udGV4dDsKK30KKworLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2UKK3N1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OworCisvKioKKyAqIERldGVjdHMgWE1MIG5vZGVzCisgKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudAorICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZQorICovCitpc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkgeworCS8vIGRvY3VtZW50RWxlbWVudCBpcyB2ZXJpZmllZCBmb3IgY2FzZXMgd2hlcmUgaXQgZG9lc24ndCB5ZXQgZXhpc3QKKwkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKKwl2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDsKKwlyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKK307CisKKy8qKgorICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CisgKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudAorICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudAorICovCitzZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkgeworCXZhciBoYXNDb21wYXJlLCBwYXJlbnQsCisJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKKworCS8vIElmIG5vIGRvY3VtZW50IGFuZCBkb2N1bWVudEVsZW1lbnQgaXMgYXZhaWxhYmxlLCByZXR1cm4KKwlpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkgeworCQlyZXR1cm4gZG9jdW1lbnQ7CisJfQorCisJLy8gU2V0IG91ciBkb2N1bWVudAorCWRvY3VtZW50ID0gZG9jOworCWRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50OworCXBhcmVudCA9IGRvYy5kZWZhdWx0VmlldzsKKworCS8vIFN1cHBvcnQ6IElFPjgKKwkvLyBJZiBpZnJhbWUgZG9jdW1lbnQgaXMgYXNzaWduZWQgdG8gImRvY3VtZW50IiB2YXJpYWJsZSBhbmQgaWYgaWZyYW1lIGhhcyBiZWVuIHJlbG9hZGVkLAorCS8vIElFIHdpbGwgdGhyb3cgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvciB3aGVuIGFjY2Vzc2luZyAiZG9jdW1lbnQiIHZhcmlhYmxlLCBzZWUgalF1ZXJ5ICMxMzkzNgorCS8vIElFNi04IGRvIG5vdCBzdXBwb3J0IHRoZSBkZWZhdWx0VmlldyBwcm9wZXJ0eSBzbyBwYXJlbnQgd2lsbCBiZSB1bmRlZmluZWQKKwlpZiAoIHBhcmVudCAmJiBwYXJlbnQgIT09IHBhcmVudC50b3AgKSB7CisJCS8vIElFMTEgZG9lcyBub3QgaGF2ZSBhdHRhY2hFdmVudCwgc28gYWxsIG11c3Qgc3VmZmVyCisJCWlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisJCQlwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CisJCX0gZWxzZSBpZiAoIHBhcmVudC5hdHRhY2hFdmVudCApIHsKKwkJCXBhcmVudC5hdHRhY2hFdmVudCggIm9udW5sb2FkIiwgdW5sb2FkSGFuZGxlciApOworCQl9CisJfQorCisJLyogU3VwcG9ydCB0ZXN0cworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jICk7CisKKwkvKiBBdHRyaWJ1dGVzCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLy8gU3VwcG9ydDogSUU8OAorCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcworCS8vIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKQorCXN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgeworCQlkaXYuY2xhc3NOYW1lID0gImkiOworCQlyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpOworCX0pOworCisJLyogZ2V0RWxlbWVudChzKUJ5KgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzCisJc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgeworCQlkaXYuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVDb21tZW50KCIiKSApOworCQlyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aDsKKwl9KTsKKworCS8vIFN1cHBvcnQ6IElFPDkKKwlzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7CisKKwkvLyBTdXBwb3J0OiBJRTwxMAorCS8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZQorCS8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsCisJLy8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0CisJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJCWRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbzsKKwkJcmV0dXJuICFkb2MuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvYy5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKKwl9KTsKKworCS8vIElEIGZpbmQgYW5kIGZpbHRlcgorCWlmICggc3VwcG9ydC5nZXRCeUlkICkgeworCQlFeHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKKwkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CisJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKKwkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCisJCQkJcmV0dXJuIG0gJiYgbS5wYXJlbnROb2RlID8gWyBtIF0gOiBbXTsKKwkJCX0KKwkJfTsKKwkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CisJCQl2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKKwkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKKwkJCX07CisJCX07CisJfSBlbHNlIHsKKwkJLy8gU3VwcG9ydDogSUU2LzcKKwkJLy8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFzIGEgZmluZCBzaG9ydGN1dAorCQlkZWxldGUgRXhwci5maW5kWyJJRCJdOworCisJCUV4cHIuZmlsdGVyWyJJRCJdID0gIGZ1bmN0aW9uKCBpZCApIHsKKwkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOworCQkJCXJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDsKKwkJCX07CisJCX07CisJfQorCisJLy8gVGFnCisJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPworCQlmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CisJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOworCisJCQkvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE4KKwkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgeworCQkJCXJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApOworCQkJfQorCQl9IDoKKworCQlmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgeworCQkJdmFyIGVsZW0sCisJCQkJdG1wID0gW10sCisJCQkJaSA9IDAsCisJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbworCQkJCXJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKKworCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cworCQkJaWYgKCB0YWcgPT09ICIqIiApIHsKKwkJCQl3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHsKKwkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJdG1wLnB1c2goIGVsZW0gKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiB0bXA7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0czsKKwkJfTsKKworCS8vIENsYXNzCisJRXhwci5maW5kWyJDTEFTUyJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7CisJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CisJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTsKKwkJfQorCX07CisKKwkvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLy8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydAorCisJLy8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSkKKwlyYnVnZ3lNYXRjaGVzID0gW107CisKKwkvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKQorCS8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvcgorCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKKwkvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvcgorCS8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OAorCXJidWdneVFTQSA9IFtdOworCisJaWYgKCAoc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvYy5xdWVyeVNlbGVjdG9yQWxsICkpICkgeworCQkvLyBCdWlsZCBRU0EgcmVnZXgKKwkJLy8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaQorCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKwkJCS8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2UKKwkJCS8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseQorCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCisJCQkvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaAorCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTkKKwkJCWRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCisJCQkJIjxzZWxlY3QgaWQ9JyIgKyBleHBhbmRvICsgIi1cZl0nIG1zYWxsb3djYXB0dXJlPScnPiIgKworCQkJCSI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiI7CisKKwkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKKwkJCS8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj0KKwkJCS8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0ICJzYWZlIiBmb3IgV2luUlQKKwkJCS8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uCisJCQlpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCApIHsKKwkJCQlyYnVnZ3lRU0EucHVzaCggIlsqXiRdPSIgKyB3aGl0ZXNwYWNlICsgIiooPzonJ3xcIlwiKSIgKTsKKwkJCX0KKworCQkJLy8gU3VwcG9ydDogSUU4CisJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQorCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGggKSB7CisJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CisJCQl9CisKKwkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjIrLCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuNysKKwkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CisJCQkJcmJ1Z2d5UVNBLnB1c2goIn49Iik7CisJCQl9CisKKwkJCS8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzCisJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZAorCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKKwkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aCApIHsKKwkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKKwkJCX0KKworCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKKwkJCS8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTEKKwkJCS8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlscworCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKKwkJCQlyYnVnZ3lRU0EucHVzaCgiLiMuK1srfl0iKTsKKwkJCX0KKwkJfSk7CisKKwkJYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJCQkvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHMKKwkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAorCQkJdmFyIGlucHV0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CisJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKKwkJCWRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgIkQiICk7CisKKwkJCS8vIFN1cHBvcnQ6IElFOAorCQkJLy8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlCisJCQlpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCApIHsKKwkJCQlyYnVnZ3lRU0EucHVzaCggIm5hbWUiICsgd2hpdGVzcGFjZSArICIqWypeJHwhfl0/PSIgKTsKKwkJCX0KKworCQkJLy8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZCkKKwkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCisJCQlpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggKSB7CisJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CisJCQl9CisKKwkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCisJCQlkaXYucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpOworCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKKwkJfSk7CisJfQorCisJaWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8CisJCWRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8CisJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CisJCWRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fAorCQlkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHsKKworCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKwkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgorCQkJLy8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSkKKwkJCXN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsKKworCQkJLy8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbgorCQkJLy8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZAorCQkJbWF0Y2hlcy5jYWxsKCBkaXYsICJbcyE9JyddOngiICk7CisJCQlyYnVnZ3lNYXRjaGVzLnB1c2goICIhPSIsIHBzZXVkb3MgKTsKKwkJfSk7CisJfQorCisJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CisJcmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbigifCIpICk7CisKKwkvKiBDb250YWlucworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwloYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICk7CisKKwkvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXIKKwkvLyBQdXJwb3NlZnVsbHkgZG9lcyBub3QgaW1wbGVtZW50IGluY2x1c2l2ZSBkZXNjZW5kZW50CisJLy8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGYKKwljb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgPworCQlmdW5jdGlvbiggYSwgYiApIHsKKwkJCXZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsCisJCQkJYnVwID0gYiAmJiBiLnBhcmVudE5vZGU7CisJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKKwkJCQlhZG93bi5jb250YWlucyA/CisJCQkJCWFkb3duLmNvbnRhaW5zKCBidXAgKSA6CisJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgorCQkJKSk7CisJCX0gOgorCQlmdW5jdGlvbiggYSwgYiApIHsKKwkJCWlmICggYiApIHsKKwkJCQl3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsKKwkJCQkJaWYgKCBiID09PSBhICkgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX07CisKKwkvKiBTb3J0aW5nCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLy8gRG9jdW1lbnQgb3JkZXIgc29ydGluZworCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPworCWZ1bmN0aW9uKCBhLCBiICkgeworCisJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCisJCWlmICggYSA9PT0gYiApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KKwkJdmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uOworCQlpZiAoIGNvbXBhcmUgKSB7CisJCQlyZXR1cm4gY29tcGFyZTsKKwkJfQorCisJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKKwkJY29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID8KKwkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6CisKKwkJCS8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZAorCQkJMTsKKworCQkvLyBEaXNjb25uZWN0ZWQgbm9kZXMKKwkJaWYgKCBjb21wYXJlICYgMSB8fAorCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgeworCisJCQkvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnQKKwkJCWlmICggYSA9PT0gZG9jIHx8IGEub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYSkgKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKCBiID09PSBkb2MgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKKwkJCXJldHVybiBzb3J0SW5wdXQgPworCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKKwkJCQkwOworCQl9CisKKwkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOworCX0gOgorCWZ1bmN0aW9uKCBhLCBiICkgeworCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCisJCWlmICggYSA9PT0gYiApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXZhciBjdXIsCisJCQlpID0gMCwKKwkJCWF1cCA9IGEucGFyZW50Tm9kZSwKKwkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKKwkJCWFwID0gWyBhIF0sCisJCQlicCA9IFsgYiBdOworCisJCS8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkCisJCWlmICggIWF1cCB8fCAhYnVwICkgeworCQkJcmV0dXJuIGEgPT09IGRvYyA/IC0xIDoKKwkJCQliID09PSBkb2MgPyAxIDoKKwkJCQlhdXAgPyAtMSA6CisJCQkJYnVwID8gMSA6CisJCQkJc29ydElucHV0ID8KKwkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CisJCQkJMDsKKworCQkvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVjaworCQl9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHsKKwkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKKwkJfQorCisJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCisJCWN1ciA9IGE7CisJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKKwkJCWFwLnVuc2hpZnQoIGN1ciApOworCQl9CisJCWN1ciA9IGI7CisJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKKwkJCWJwLnVuc2hpZnQoIGN1ciApOworCQl9CisKKwkJLy8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3kKKwkJd2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7CisJCQlpKys7CisJCX0KKworCQlyZXR1cm4gaSA/CisJCQkvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3IKKwkJCXNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOgorCisJCQkvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3QKKwkJCWFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6CisJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CisJCQkwOworCX07CisKKwlyZXR1cm4gZG9jOworfTsKKworU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7CisJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKK307CisKK1NpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKKwkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKKwlpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7CisJCXNldERvY3VtZW50KCBlbGVtICk7CisJfQorCisJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCisJZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsKKworCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKKwkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgorCQkoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7CisKKwkJdHJ5IHsKKwkJCXZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTsKKworCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcworCQkJaWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fAorCQkJCQkvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudAorCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CisJCQkJCWVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfSBjYXRjaCAoZSkge30KKwl9CisKKwlyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwOworfTsKKworU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7CisJLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgeworCQlzZXREb2N1bWVudCggY29udGV4dCApOworCX0KKwlyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKK307CisKK1NpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCisJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgeworCQlzZXREb2N1bWVudCggZWxlbSApOworCX0KKworCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCisJCS8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KQorCQl2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/CisJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgorCQkJdW5kZWZpbmVkOworCisJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KKwkJdmFsIDoKKwkJc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/CisJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKKwkJCSh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgPworCQkJCXZhbC52YWx1ZSA6CisJCQkJbnVsbDsKK307CisKK1NpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7CisJdGhyb3cgbmV3IEVycm9yKCAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIG1zZyApOworfTsKKworLyoqCisgKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCisgKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0cworICovCitTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgeworCXZhciBlbGVtLAorCQlkdXBsaWNhdGVzID0gW10sCisJCWogPSAwLAorCQlpID0gMDsKKworCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKKwloYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzOworCXNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApOworCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CisKKwlpZiAoIGhhc0R1cGxpY2F0ZSApIHsKKwkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CisJCQlpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHsKKwkJCQlqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7CisJCQl9CisJCX0KKwkJd2hpbGUgKCBqLS0gKSB7CisJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CisJCX0KKwl9CisKKwkvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0cworCS8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNQorCXNvcnRJbnB1dCA9IG51bGw7CisKKwlyZXR1cm4gcmVzdWx0czsKK307CisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKKyAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbQorICovCitnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKKwl2YXIgbm9kZSwKKwkJcmV0ID0gIiIsCisJCWkgPSAwLAorCQlub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7CisKKwlpZiAoICFub2RlVHlwZSApIHsKKwkJLy8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkKKwkJd2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7CisJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcworCQkJcmV0ICs9IGdldFRleHQoIG5vZGUgKTsKKwkJfQorCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKKwkJLy8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50cworCQkvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKQorCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKKwkJCXJldHVybiBlbGVtLnRleHRDb250ZW50OworCQl9IGVsc2UgeworCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCisJCQlmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHsKKwkJCQlyZXQgKz0gZ2V0VGV4dCggZWxlbSApOworCQkJfQorCQl9CisJfSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7CisJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKKwl9CisJLy8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzCisKKwlyZXR1cm4gcmV0OworfTsKKworRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CisKKwkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKKwljYWNoZUxlbmd0aDogNTAsCisKKwljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKKworCW1hdGNoOiBtYXRjaEV4cHIsCisKKwlhdHRySGFuZGxlOiB7fSwKKworCWZpbmQ6IHt9LAorCisJcmVsYXRpdmU6IHsKKwkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAorCQkiICI6IHsgZGlyOiAicGFyZW50Tm9kZSIgfSwKKwkJIisiOiB7IGRpcjogInByZXZpb3VzU2libGluZyIsIGZpcnN0OiB0cnVlIH0sCisJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KKwl9LAorCisJcHJlRmlsdGVyOiB7CisJCSJBVFRSIjogZnVuY3Rpb24oIG1hdGNoICkgeworCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOworCisJCQkvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAorCQkJbWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8ICIiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKKworCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKKwkJCQltYXRjaFszXSA9ICIgIiArIG1hdGNoWzNdICsgIiAiOworCQkJfQorCisJCQlyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTsKKwkJfSwKKworCQkiQ0hJTEQiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCisJCQkJMSB0eXBlIChvbmx5fG50aHwuLi4pCisJCQkJMiB3aGF0IChjaGlsZHxvZi10eXBlKQorCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCisJCQkJNCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cZCpufCkKKwkJCQk1IHNpZ24gb2YgeG4tY29tcG9uZW50CisJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAorCQkJCTcgc2lnbiBvZiB5LWNvbXBvbmVudAorCQkJCTggeSBvZiB5LWNvbXBvbmVudAorCQkJKi8KKwkJCW1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKKworCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKKwkJCQkvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudAorCQkJCWlmICggIW1hdGNoWzNdICkgeworCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CisJCQkJfQorCisJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECisJCQkJLy8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMQorCQkJCW1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSAiZXZlbiIgfHwgbWF0Y2hbM10gPT09ICJvZGQiICkgKTsKKwkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOworCisJCQkvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHMKKwkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgeworCQkJCVNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsKKwkJCX0KKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCisJCSJQU0VVRE8iOiBmdW5jdGlvbiggbWF0Y2ggKSB7CisJCQl2YXIgZXhjZXNzLAorCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOworCisJCQlpZiAoIG1hdGNoRXhwclsiQ0hJTEQiXS50ZXN0KCBtYXRjaFswXSApICkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcworCQkJaWYgKCBtYXRjaFszXSApIHsKKwkJCQltYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8ICIiOworCisJCQkvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50cworCQkJfSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmCisJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKKwkJCQkoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkpICYmCisJCQkJLy8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzCisJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgeworCisJCQkJLy8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXgKKwkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKKwkJCQltYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTsKKwkJCX0KKworCQkJLy8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpCisJCQlyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTsKKwkJfQorCX0sCisKKwlmaWx0ZXI6IHsKKworCQkiVEFHIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7CisJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKKwkJCXJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSAiKiIgPworCQkJCWZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSA6CisJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7CisJCQkJfTsKKwkJfSwKKworCQkiQ0xBU1MiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkgeworCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKKworCQkJcmV0dXJuIHBhdHRlcm4gfHwKKwkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgorCQkJCWNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJCXJldHVybiBwYXR0ZXJuLnRlc3QoIHR5cGVvZiBlbGVtLmNsYXNzTmFtZSA9PT0gInN0cmluZyIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSAidW5kZWZpbmVkIiAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCAiIiApOworCQkJCX0pOworCQl9LAorCisJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKKwkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQl2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTsKKworCQkJCWlmICggcmVzdWx0ID09IG51bGwgKSB7CisJCQkJCXJldHVybiBvcGVyYXRvciA9PT0gIiE9IjsKKwkJCQl9CisJCQkJaWYgKCAhb3BlcmF0b3IgKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJCXJlc3VsdCArPSAiIjsKKworCQkJCXJldHVybiBvcGVyYXRvciA9PT0gIj0iID8gcmVzdWx0ID09PSBjaGVjayA6CisJCQkJCW9wZXJhdG9yID09PSAiIT0iID8gcmVzdWx0ICE9PSBjaGVjayA6CisJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgorCQkJCQlvcGVyYXRvciA9PT0gIio9IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOgorCQkJCQlvcGVyYXRvciA9PT0gIiQ9IiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6CisJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKKwkJCQkJb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArICItIiA6CisJCQkJCWZhbHNlOworCQkJfTsKKwkJfSwKKworCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgeworCQkJdmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gIm50aCIsCisJCQkJZm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09ICJsYXN0IiwKKwkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CisKKwkJCXJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID8KKworCQkJCS8vIFNob3J0Y3V0IGZvciA6bnRoLSoobikKKwkJCQlmdW5jdGlvbiggZWxlbSApIHsKKwkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOworCQkJCX0gOgorCisJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKKwkJCQkJdmFyIGNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBkaWZmLCBub2RlSW5kZXgsIHN0YXJ0LAorCQkJCQkJZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gIm5leHRTaWJsaW5nIiA6ICJwcmV2aW91c1NpYmxpbmciLAorCQkJCQkJcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLAorCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCisJCQkJCQl1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZTsKKworCQkJCQlpZiAoIHBhcmVudCApIHsKKworCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQorCQkJCQkJaWYgKCBzaW1wbGUgKSB7CisJCQkJCQkJd2hpbGUgKCBkaXIgKSB7CisJCQkJCQkJCW5vZGUgPSBlbGVtOworCQkJCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkgeworCQkJCQkJCQkJaWYgKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKKwkJCQkJCQkJc3RhcnQgPSBkaXIgPSB0eXBlID09PSAib25seSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCisJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOworCisJCQkJCQkvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YAorCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgeworCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAorCQkJCQkJCW91dGVyQ2FjaGUgPSBwYXJlbnRbIGV4cGFuZG8gXSB8fCAocGFyZW50WyBleHBhbmRvIF0gPSB7fSk7CisJCQkJCQkJY2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107CisJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMV07CisJCQkJCQkJZGlmZiA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzJdOworCQkJCQkJCW5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdOworCisJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKKworCQkJCQkJCQkvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKKworCQkJCQkJCQkvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVhaworCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CisJCQkJCQkJCQlvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCS8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZQorCQkJCQkJfSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKKwkJCQkJCQlkaWZmID0gY2FjaGVbMV07CisKKwkJCQkJCS8vIHhtbCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAorCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CisJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgeworCisJCQkJCQkJCWlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkgeworCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAorCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKKwkJCQkJCQkJCQkobm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgeworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQorCQkJCQkJZGlmZiAtPSBsYXN0OworCQkJCQkJcmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7CisJCQkJCX0KKwkJCQl9OworCQl9LAorCisJCSJQU0VVRE8iOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHsKKwkJCS8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQorCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcworCQkJLy8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnMKKwkJCS8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3MKKwkJCXZhciBhcmdzLAorCQkJCWZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHwKKwkJCQkJU2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7CisKKwkJCS8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXQKKwkJCS8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCisJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCisJCQlpZiAoIGZuWyBleHBhbmRvIF0gKSB7CisJCQkJcmV0dXJuIGZuKCBhcmd1bWVudCApOworCQkJfQorCisJCQkvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXMKKwkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKKwkJCQlhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgIiIsIGFyZ3VtZW50IF07CisJCQkJcmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/CisJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKKwkJCQkJCXZhciBpZHgsCisJCQkJCQkJbWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLAorCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKKwkJCQkJCXdoaWxlICggaS0tICkgeworCQkJCQkJCWlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbaV0gKTsKKwkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOworCQkJCQkJfQorCQkJCQl9KSA6CisJCQkJCWZ1bmN0aW9uKCBlbGVtICkgeworCQkJCQkJcmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7CisJCQkJCX07CisJCQl9CisKKwkJCXJldHVybiBmbjsKKwkJfQorCX0sCisKKwlwc2V1ZG9zOiB7CisJCS8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvcworCQkibm90IjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCisJCQkvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZworCQkJLy8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzCisJCQl2YXIgaW5wdXQgPSBbXSwKKwkJCQlyZXN1bHRzID0gW10sCisJCQkJbWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICkgKTsKKworCQkJcmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/CisJCQkJbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7CisJCQkJCXZhciBlbGVtLAorCQkJCQkJdW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLAorCQkJCQkJaSA9IHNlZWQubGVuZ3RoOworCisJCQkJCS8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmAKKwkJCQkJd2hpbGUgKCBpLS0gKSB7CisJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKKwkJCQkJCQlzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9KSA6CisJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKKwkJCQkJaW5wdXRbMF0gPSBlbGVtOworCQkJCQltYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7CisJCQkJCS8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpCisJCQkJCWlucHV0WzBdID0gbnVsbDsKKwkJCQkJcmV0dXJuICFyZXN1bHRzLnBvcCgpOworCQkJCX07CisJCX0pLAorCisJCSJoYXMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDsKKwkJCX07CisJCX0pLAorCisJCSJjb250YWlucyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHsKKwkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CisJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJcmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTsKKwkJCX07CisJCX0pLAorCisJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCisJCS8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlCisJCS8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsCisJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgorCQkvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS4KKwkJLy8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS4iCisJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KKwkJImxhbmciOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkgeworCQkJLy8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllcgorCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKKwkJCQlTaXp6bGUuZXJyb3IoICJ1bnN1cHBvcnRlZCBsYW5nOiAiICsgbGFuZyApOworCQkJfQorCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOworCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXZhciBlbGVtTGFuZzsKKwkJCQlkbyB7CisJCQkJCWlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgPworCQkJCQkJZWxlbS5sYW5nIDoKKwkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgeworCisJCQkJCQllbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7CisJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOworCQkJCQl9CisJCQkJfSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfTsKKwkJfSksCisKKwkJLy8gTWlzY2VsbGFuZW91cworCQkidGFyZ2V0IjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKKwkJCXJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDsKKwkJfSwKKworCQkicm9vdCI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0gPT09IGRvY0VsZW07CisJCX0sCisKKwkJImZvY3VzIjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOworCQl9LAorCisJCS8vIEJvb2xlYW4gcHJvcGVydGllcworCQkiZW5hYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlOworCQl9LAorCisJCSJkaXNhYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CisJCX0sCisKKwkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50cworCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKKwkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCXJldHVybiAobm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gIm9wdGlvbiIgJiYgISFlbGVtLnNlbGVjdGVkKTsKKwkJfSwKKworCQkic2VsZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKKwkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKKwkJCWlmICggZWxlbS5wYXJlbnROb2RlICkgeworCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCQkJfQorCisJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKKwkJfSwKKworCQkvLyBDb250ZW50cworCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvCisJCQkvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksCisJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQorCQkJLy8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlbgorCQkJZm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7CisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9LAorCisJCSJwYXJlbnQiOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiAhRXhwci5wc2V1ZG9zWyJlbXB0eSJdKCBlbGVtICk7CisJCX0sCisKKwkJLy8gRWxlbWVudC9pbnB1dCB0eXBlcworCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisJCX0sCisKKwkJImlucHV0IjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisJCX0sCisKKwkJImJ1dHRvbiI6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CisJCQlyZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09ICJidXR0b24iOworCQl9LAorCisJCSJ0ZXh0IjogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQl2YXIgYXR0cjsKKwkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKKwkJCQllbGVtLnR5cGUgPT09ICJ0ZXh0IiAmJgorCisJCQkJLy8gU3VwcG9ydDogSUU8OAorCQkJCS8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCAic2VhcmNoIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSAidGV4dCIKKwkJCQkoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09ICJ0ZXh0IiApOworCQl9LAorCisJCS8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb24KKwkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKKwkJCXJldHVybiBbIDAgXTsKKwkJfSksCisKKwkJImxhc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKKwkJCXJldHVybiBbIGxlbmd0aCAtIDEgXTsKKwkJfSksCisKKwkJImVxIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOworCQl9KSwKKworCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgeworCQkJdmFyIGkgPSAwOworCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CisJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKKwkJCX0KKwkJCXJldHVybiBtYXRjaEluZGV4ZXM7CisJCX0pLAorCisJCSJvZGQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKKwkJCXZhciBpID0gMTsKKwkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgeworCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisJCQl9CisJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOworCQl9KSwKKworCQkibHQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7CisJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CisJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKKwkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOworCQkJfQorCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKKwkJfSksCisKKwkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgeworCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OworCQkJZm9yICggOyArK2kgPCBsZW5ndGg7ICkgeworCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CisJCQl9CisJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOworCQl9KQorCX0KK307CisKK0V4cHIucHNldWRvc1sibnRoIl0gPSBFeHByLnBzZXVkb3NbImVxIl07CisKKy8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCitmb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHsKKwlFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7Cit9Citmb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkgeworCUV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7Cit9CisKKy8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVycworZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CitzZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvczsKK0V4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7CisKK3Rva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7CisJdmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsCisJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCisJCWNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CisKKwlpZiAoIGNhY2hlZCApIHsKKwkJcmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTsKKwl9CisKKwlzb0ZhciA9IHNlbGVjdG9yOworCWdyb3VwcyA9IFtdOworCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKKworCXdoaWxlICggc29GYXIgKSB7CisKKwkJLy8gQ29tbWEgYW5kIGZpcnN0IHJ1bgorCQlpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHsKKwkJCWlmICggbWF0Y2ggKSB7CisJCQkJLy8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWQKKwkJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0ZhcjsKKwkJCX0KKwkJCWdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7CisJCX0KKworCQltYXRjaGVkID0gZmFsc2U7CisKKwkJLy8gQ29tYmluYXRvcnMKKwkJaWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSkgKSB7CisJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKKwkJCXRva2Vucy5wdXNoKHsKKwkJCQl2YWx1ZTogbWF0Y2hlZCwKKwkJCQkvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2UKKwkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKKwkJCX0pOworCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTsKKwkJfQorCisJCS8vIEZpbHRlcnMKKwkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKKwkJCWlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHwKKwkJCQkobWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkpKSApIHsKKwkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKKwkJCQl0b2tlbnMucHVzaCh7CisJCQkJCXZhbHVlOiBtYXRjaGVkLAorCQkJCQl0eXBlOiB0eXBlLAorCQkJCQltYXRjaGVzOiBtYXRjaAorCQkJCX0pOworCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CisJCQl9CisJCX0KKworCQlpZiAoICFtYXRjaGVkICkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKKwkvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmcKKwkvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnMKKwlyZXR1cm4gcGFyc2VPbmx5ID8KKwkJc29GYXIubGVuZ3RoIDoKKwkJc29GYXIgPworCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKKwkJCS8vIENhY2hlIHRoZSB0b2tlbnMKKwkJCXRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApOworfTsKKworZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkgeworCXZhciBpID0gMCwKKwkJbGVuID0gdG9rZW5zLmxlbmd0aCwKKwkJc2VsZWN0b3IgPSAiIjsKKwlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJc2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlOworCX0KKwlyZXR1cm4gc2VsZWN0b3I7Cit9CisKK2Z1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7CisJdmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLAorCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBkaXIgPT09ICJwYXJlbnROb2RlIiwKKwkJZG9uZU5hbWUgPSBkb25lKys7CisKKwlyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CisJCS8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudAorCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKwkJCQkJcmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApOworCQkJCX0KKwkJCX0KKwkJfSA6CisKKwkJLy8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzCisJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisJCQl2YXIgb2xkQ2FjaGUsIG91dGVyQ2FjaGUsCisJCQkJbmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVOYW1lIF07CisKKwkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGRpciBjYWNoaW5nCisJCQlpZiAoIHhtbCApIHsKKwkJCQl3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkgeworCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHsKKwkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CisJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgeworCQkJCQkJb3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pOworCQkJCQkJaWYgKCAob2xkQ2FjaGUgPSBvdXRlckNhY2hlWyBkaXIgXSkgJiYKKwkJCQkJCQlvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkgeworCisJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKKwkJCQkJCQlyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cworCQkJCQkJCW91dGVyQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7CisKKwkJCQkJCQkvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmcKKwkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgeworCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07Cit9CisKK2Z1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHsKKwlyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CisJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CisJCQl2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDsKKwkJCXdoaWxlICggaS0tICkgeworCQkJCWlmICggIW1hdGNoZXJzW2ldKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9IDoKKwkJbWF0Y2hlcnNbMF07Cit9CisKK2Z1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsKKwl2YXIgaSA9IDAsCisJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKKwlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJU2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTsKKwl9CisJcmV0dXJuIHJlc3VsdHM7Cit9CisKK2Z1bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7CisJdmFyIGVsZW0sCisJCW5ld1VubWF0Y2hlZCA9IFtdLAorCQlpID0gMCwKKwkJbGVuID0gdW5tYXRjaGVkLmxlbmd0aCwKKwkJbWFwcGVkID0gbWFwICE9IG51bGw7CisKKwlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CisJCQlpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKwkJCQluZXdVbm1hdGNoZWQucHVzaCggZWxlbSApOworCQkJCWlmICggbWFwcGVkICkgeworCQkJCQltYXAucHVzaCggaSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBuZXdVbm1hdGNoZWQ7Cit9CisKK2Z1bmN0aW9uIHNldE1hdGNoZXIoIHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApIHsKKwlpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHsKKwkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKKwl9CisJaWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7CisJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKKwl9CisJcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgeworCQl2YXIgdGVtcCwgaSwgZWxlbSwKKwkJCXByZU1hcCA9IFtdLAorCQkJcG9zdE1hcCA9IFtdLAorCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKKworCQkJLy8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHQKKwkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCisKKwkJCS8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvbgorCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CisJCQkJY29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgorCQkJCWVsZW1zLAorCisJCQltYXRjaGVyT3V0ID0gbWF0Y2hlciA/CisJCQkJLy8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cywKKwkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CisKKwkJCQkJLy8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5CisJCQkJCVtdIDoKKworCQkJCQkvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHkKKwkJCQkJcmVzdWx0cyA6CisJCQkJbWF0Y2hlckluOworCisJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCisJCWlmICggbWF0Y2hlciApIHsKKwkJCW1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7CisJCX0KKworCQkvLyBBcHBseSBwb3N0RmlsdGVyCisJCWlmICggcG9zdEZpbHRlciApIHsKKwkJCXRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApOworCQkJcG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApOworCisJCQkvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluCisJCQlpID0gdGVtcC5sZW5ndGg7CisJCQl3aGlsZSAoIGktLSApIHsKKwkJCQlpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7CisJCQkJCW1hdGNoZXJPdXRbIHBvc3RNYXBbaV0gXSA9ICEobWF0Y2hlckluWyBwb3N0TWFwW2ldIF0gPSBlbGVtKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIHNlZWQgKSB7CisJCQlpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkgeworCQkJCWlmICggcG9zdEZpbmRlciApIHsKKwkJCQkJLy8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzCisJCQkJCXRlbXAgPSBbXTsKKwkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworCQkJCQl3aGlsZSAoIGktLSApIHsKKwkJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHsKKwkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAorCQkJCQkJCXRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApOworCQkJCX0KKworCQkJCS8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkCisJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOworCQkJCXdoaWxlICggaS0tICkgeworCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiYKKwkJCQkJCSh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHsKKworCQkJCQkJc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAorCQl9IGVsc2UgeworCQkJbWF0Y2hlck91dCA9IGNvbmRlbnNlKAorCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPworCQkJCQltYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOgorCQkJCQltYXRjaGVyT3V0CisJCQkpOworCQkJaWYgKCBwb3N0RmluZGVyICkgeworCQkJCXBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOworCQkJfSBlbHNlIHsKKwkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7CisJCQl9CisJCX0KKwl9KTsKK30KKworZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHsKKwl2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLAorCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAorCQlsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAorCQlpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAiXSwKKwkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAorCisJCS8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCisJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsKKwkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAorCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xOworCQl9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCisJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgeworCQkJdmFyIHJldCA9ICggIWxlYWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoCisJCQkJKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID8KKwkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CisJCQkJCW1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTsKKwkJCS8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KQorCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKKwkJCXJldHVybiByZXQ7CisJCX0gXTsKKworCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQlpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7CisJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKKwkJfSBlbHNlIHsKKwkJCW1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zW2ldLm1hdGNoZXMgKTsKKworCQkJLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNoZXIKKwkJCWlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkgeworCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZworCQkJCWogPSArK2k7CisJCQkJZm9yICggOyBqIDwgbGVuOyBqKysgKSB7CisJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBzZXRNYXRjaGVyKAorCQkJCQlpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwKKwkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKKwkJCQkJCS8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgCisJCQkJCQl0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSAiICIgPyAiKiIgOiAiIiB9KQorCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCisJCQkJCW1hdGNoZXIsCisJCQkJCWkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLAorCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCisJCQkJCWogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zICkKKwkJCQkpOworCQkJfQorCQkJbWF0Y2hlcnMucHVzaCggbWF0Y2hlciApOworCQl9CisJfQorCisJcmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApOworfQorCitmdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7CisJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKKwkJYnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsCisJCXN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHsKKwkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAorCQkJCW1hdGNoZWRDb3VudCA9IDAsCisJCQkJaSA9ICIwIiwKKwkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAorCQkJCXNldE1hdGNoZWQgPSBbXSwKKwkJCQljb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKKwkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CisJCQkJZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbIlRBRyJdKCAiKiIsIG91dGVybW9zdCApLAorCQkJCS8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCisJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCisJCQkJbGVuID0gZWxlbXMubGVuZ3RoOworCisJCQlpZiAoIG91dGVybW9zdCApIHsKKwkJCQlvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDsKKwkJCX0KKworCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKKwkJCS8vIEtlZXAgYGlgIGEgc3RyaW5nIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBzbyBgbWF0Y2hlZENvdW50YCB3aWxsIGJlICIwMCIgYmVsb3cKKwkJCS8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaQorCQkJLy8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6ICJsZW5ndGgiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZAorCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7CisJCQkJCWogPSAwOworCQkJCQl3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkgeworCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKKwkJCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIG91dGVybW9zdCApIHsKKwkJCQkJCWRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVycworCQkJCWlmICggYnlTZXQgKSB7CisJCQkJCS8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnMKKwkJCQkJaWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkgeworCQkJCQkJbWF0Y2hlZENvdW50LS07CisJCQkJCX0KKworCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CisJCQkJCWlmICggc2VlZCApIHsKKwkJCQkJCXVubWF0Y2hlZC5wdXNoKCBlbGVtICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cworCQkJbWF0Y2hlZENvdW50ICs9IGk7CisJCQlpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHsKKwkJCQlqID0gMDsKKwkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CisJCQkJCW1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7CisJCQkJfQorCisJCQkJaWYgKCBzZWVkICkgeworCQkJCQkvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nCisJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKKwkJCQkJCXdoaWxlICggaS0tICkgeworCQkJCQkJCWlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7CisJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzCisJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOworCQkJCX0KKworCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKKwkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7CisKKwkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKKwkJCQlpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiYKKwkJCQkJKCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7CisKKwkJCQkJU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVycworCQkJaWYgKCBvdXRlcm1vc3QgKSB7CisJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CisJCQkJb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7CisJCQl9CisKKwkJCXJldHVybiB1bm1hdGNoZWQ7CisJCX07CisKKwlyZXR1cm4gYnlTZXQgPworCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKKwkJc3VwZXJNYXRjaGVyOworfQorCitjb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgeworCXZhciBpLAorCQlzZXRNYXRjaGVycyA9IFtdLAorCQllbGVtZW50TWF0Y2hlcnMgPSBbXSwKKwkJY2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKKworCWlmICggIWNhY2hlZCApIHsKKwkJLy8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50CisJCWlmICggIW1hdGNoICkgeworCQkJbWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsKKwkJfQorCQlpID0gbWF0Y2gubGVuZ3RoOworCQl3aGlsZSAoIGktLSApIHsKKwkJCWNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFtpXSApOworCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKKwkJCQlzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTsKKwkJCX0gZWxzZSB7CisJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOworCQkJfQorCQl9CisKKwkJLy8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uCisJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApOworCisJCS8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvbgorCQljYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwl9CisJcmV0dXJuIGNhY2hlZDsKK307CisKKy8qKgorICogQSBsb3ctbGV2ZWwgc2VsZWN0aW9uIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2l0aCBTaXp6bGUncyBjb21waWxlZAorICogIHNlbGVjdG9yIGZ1bmN0aW9ucworICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHNlbGVjdG9yIEEgc2VsZWN0b3Igb3IgYSBwcmUtY29tcGlsZWQKKyAqICBzZWxlY3RvciBmdW5jdGlvbiBidWlsdCB3aXRoIFNpenpsZS5jb21waWxlCisgKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKKyAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHRzXQorICogQHBhcmFtIHtBcnJheX0gW3NlZWRdIEEgc2V0IG9mIGVsZW1lbnRzIHRvIG1hdGNoIGFnYWluc3QKKyAqLworc2VsZWN0ID0gU2l6emxlLnNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKKwl2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCwKKwkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCisJCW1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoIChzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yKSApOworCisJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CisKKwkvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBubyBzZWVkIGFuZCBvbmx5IG9uZSBncm91cAorCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgeworCisJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECisJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKKwkJaWYgKCB0b2tlbnMubGVuZ3RoID4gMiAmJiAodG9rZW4gPSB0b2tlbnNbMF0pLnR5cGUgPT09ICJJRCIgJiYKKwkJCQlzdXBwb3J0LmdldEJ5SWQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJgorCQkJCUV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7CisKKwkJCWNvbnRleHQgPSAoIEV4cHIuZmluZFsiSUQiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07CisJCQlpZiAoICFjb250ZXh0ICkgeworCQkJCXJldHVybiByZXN1bHRzOworCisJCQkvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsCisJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKKwkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlOworCQkJfQorCisJCQlzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTsKKwkJfQorCisJCS8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmcKKwkJaSA9IG1hdGNoRXhwclsibmVlZHNDb250ZXh0Il0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoOworCQl3aGlsZSAoIGktLSApIHsKKwkJCXRva2VuID0gdG9rZW5zW2ldOworCisJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCisJCQlpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7CisJCQkJLy8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzCisJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCisJCQkJCXRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSwKKwkJCQkJcnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dAorCQkJCSkpICkgeworCisJCQkJCS8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseQorCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CisJCQkJCXNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7CisJCQkJCWlmICggIXNlbGVjdG9yICkgeworCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOworCQkJCQkJcmV0dXJuIHJlc3VsdHM7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQKKwkvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlCisJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAorCQlzZWVkLAorCQljb250ZXh0LAorCQkhZG9jdW1lbnRJc0hUTUwsCisJCXJlc3VsdHMsCisJCXJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKKwkpOworCXJldHVybiByZXN1bHRzOworfTsKKworLy8gT25lLXRpbWUgYXNzaWdubWVudHMKKworLy8gU29ydCBzdGFiaWxpdHkKK3N1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIiIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oIiIpID09PSBleHBhbmRvOworCisvLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCisvLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uCitzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTsKKworLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50CitzZXREb2N1bWVudCgpOworCisvLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KQorLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqCitzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZGl2MSApIHsKKwkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKKwlyZXR1cm4gZGl2MS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikgKSAmIDE7Cit9KTsKKworLy8gU3VwcG9ydDogSUU8OAorLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgImludGVycG9sYXRpb24iCisvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4CitpZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKKwlkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOworCXJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIiMiIDsKK30pICkgeworCWFkZEhhbmRsZSggInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CisJCWlmICggIWlzWE1MICkgeworCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CisJCX0KKwl9KTsKK30KKworLy8gU3VwcG9ydDogSUU8OQorLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKK2lmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CisJZGl2LmlubmVySFRNTCA9ICI8aW5wdXQvPiI7CisJZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOworCXJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gIiI7Cit9KSApIHsKKwlhZGRIYW5kbGUoICJ2YWx1ZSIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKKwkJaWYgKCAhaXNYTUwgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICkgeworCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOworCQl9CisJfSk7Cit9CisKKy8vIFN1cHBvcnQ6IElFPDkKKy8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKK2lmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkgeworCXJldHVybiBkaXYuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpID09IG51bGw7Cit9KSApIHsKKwlhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CisJCXZhciB2YWw7CisJCWlmICggIWlzWE1MICkgeworCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CisJCQkJCSh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSkgJiYgdmFsLnNwZWNpZmllZCA/CisJCQkJCXZhbC52YWx1ZSA6CisJCQkJbnVsbDsKKwkJfQorCX0pOworfQorCityZXR1cm4gU2l6emxlOworCit9KSggd2luZG93ICk7CisKKworCitqUXVlcnkuZmluZCA9IFNpenpsZTsKK2pRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKK2pRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zOworalF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0OworalF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDsKK2pRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKK2pRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWluczsKKworCisKK3ZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0OworCit2YXIgcnNpbmdsZVRhZyA9ICgvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvKTsKKworCisKK3ZhciByaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvOworCisvLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdAorZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7CisJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CisJCXJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgeworCQkJLyoganNoaW50IC1XMDE4ICovCisJCQlyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7CisJCX0pOworCisJfQorCisJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CisJCXJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgIT09IG5vdDsKKwkJfSk7CisKKwl9CisKKwlpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgeworCQlpZiAoIHJpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHsKKwkJCXJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTsKKwkJfQorCisJCXF1YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMgKTsKKwl9CisKKwlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+PSAwICkgIT09IG5vdDsKKwl9KTsKK30KKworalF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkgeworCXZhciBlbGVtID0gZWxlbXNbIDAgXTsKKworCWlmICggbm90ICkgeworCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7CisJfQorCisJcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxID8KKwkJalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdIDoKKwkJalF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOworCQl9KSk7Cit9OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciBpLAorCQkJbGVuID0gdGhpcy5sZW5ndGgsCisJCQlyZXQgPSBbXSwKKwkJCXNlbGYgPSB0aGlzOworCisJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKKwkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pICk7CisJCX0KKworCQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOworCQl9CisKKwkJLy8gTmVlZGVkIGJlY2F1c2UgJCggc2VsZWN0b3IsIGNvbnRleHQgKSBiZWNvbWVzICQoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApCisJCXJldCA9IHRoaXMucHVzaFN0YWNrKCBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTsKKwkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyAiICIgKyBzZWxlY3RvciA6IHNlbGVjdG9yOworCQlyZXR1cm4gcmV0OworCX0sCisJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSkgKTsKKwl9LAorCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSkgKTsKKwl9LAorCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiAhIXdpbm5vdygKKwkJCXRoaXMsCisKKwkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKKwkJCS8vIHNvICQoInA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvICJwIi4KKwkJCXR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID8KKwkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgorCQkJCXNlbGVjdG9yIHx8IFtdLAorCQkJZmFsc2UKKwkJKS5sZW5ndGg7CisJfQorfSk7CisKKworLy8gSW5pdGlhbGl6ZSBhIGpRdWVyeSBvYmplY3QKKworCisvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKK3ZhciByb290alF1ZXJ5LAorCisJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3MKKwkvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpCisJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCisJcnF1aWNrRXhwciA9IC9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sCisKKwlpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCXZhciBtYXRjaCwgZWxlbTsKKworCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCisJCWlmICggIXNlbGVjdG9yICkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQkvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKwkJCWlmICggc2VsZWN0b3JbMF0gPT09ICI8IiAmJiBzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYgc2VsZWN0b3IubGVuZ3RoID49IDMgKSB7CisJCQkJLy8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2sKKwkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKKworCQkJfSBlbHNlIHsKKwkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKKwkJCX0KKworCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAorCQkJaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgeworCisJCQkJLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCisJCQkJaWYgKCBtYXRjaFsxXSApIHsKKwkJCQkJY29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WzBdIDogY29udGV4dDsKKworCQkJCQkvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXQKKwkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKKwkJCQkJalF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKAorCQkJCQkJbWF0Y2hbMV0sCisJCQkJCQljb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LAorCQkJCQkJdHJ1ZQorCQkJCQkpICk7CisKKwkJCQkJLy8gSEFORExFOiAkKGh0bWwsIHByb3BzKQorCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbMV0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkgeworCQkJCQkJZm9yICggbWF0Y2ggaW4gY29udGV4dCApIHsKKwkJCQkJCQkvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlCisJCQkJCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkgeworCQkJCQkJCQl0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7CisKKwkJCQkJCQkvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzCisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXJldHVybiB0aGlzOworCisJCQkJLy8gSEFORExFOiAkKCNpZCkKKwkJCQl9IGVsc2UgeworCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzJdICk7CisKKwkJCQkJLy8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjYKKwkJCQkJLy8gZ0VCSUQgcmV0dXJucyBub2RlcyBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICgjNjk2MykKKwkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKKwkJCQkJCS8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CisJCQkJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQkJCQl0aGlzWzBdID0gZWxlbTsKKwkJCQkJfQorCisJCQkJCXRoaXMuY29udGV4dCA9IGRvY3VtZW50OworCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0KKworCQkJLy8gSEFORExFOiAkKGV4cHIsICQoLi4uKSkKKwkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgeworCQkJCXJldHVybiAoIGNvbnRleHQgfHwgcm9vdGpRdWVyeSApLmZpbmQoIHNlbGVjdG9yICk7CisKKwkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQorCQkJLy8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpCisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKKwkJCX0KKworCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKKwkJfSBlbHNlIGlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CisJCQl0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7CisJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQlyZXR1cm4gdGhpczsKKworCQkvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCisJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQorCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKKwkJCXJldHVybiB0eXBlb2Ygcm9vdGpRdWVyeS5yZWFkeSAhPT0gInVuZGVmaW5lZCIgPworCQkJCXJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICkgOgorCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKKwkJCQlzZWxlY3RvciggalF1ZXJ5ICk7CisJCX0KKworCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7CisJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CisJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0OworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7CisJfTsKKworLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgoraW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CisKKy8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2UKK3Jvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CisKKwordmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAorCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CisJZ3VhcmFudGVlZFVuaXF1ZSA9IHsKKwkJY2hpbGRyZW46IHRydWUsCisJCWNvbnRlbnRzOiB0cnVlLAorCQluZXh0OiB0cnVlLAorCQlwcmV2OiB0cnVlCisJfTsKKworalF1ZXJ5LmV4dGVuZCh7CisJZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsKKwkJdmFyIG1hdGNoZWQgPSBbXSwKKwkJCXRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDsKKworCQl3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CisJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJaWYgKCB0cnVuY2F0ZSAmJiBqUXVlcnkoIGVsZW0gKS5pcyggdW50aWwgKSApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1hdGNoZWQucHVzaCggZWxlbSApOworCQkJfQorCQl9CisJCXJldHVybiBtYXRjaGVkOworCX0sCisKKwlzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHsKKwkJdmFyIG1hdGNoZWQgPSBbXTsKKworCQlmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgeworCQkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CisJCQkJbWF0Y2hlZC5wdXNoKCBuICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbWF0Y2hlZDsKKwl9Cit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJaGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkgeworCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCisJCQlsID0gdGFyZ2V0cy5sZW5ndGg7CisKKwkJcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkgeworCQkJdmFyIGkgPSAwOworCQkJZm9yICggOyBpIDwgbDsgaSsrICkgeworCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfSwKKworCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CisJCXZhciBjdXIsCisJCQlpID0gMCwKKwkJCWwgPSB0aGlzLmxlbmd0aCwKKwkJCW1hdGNoZWQgPSBbXSwKKwkJCXBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPworCQkJCWpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDoKKwkJCQkwOworCisJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCWZvciAoIGN1ciA9IHRoaXNbaV07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkgeworCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cworCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKHBvcyA/CisJCQkJCXBvcy5pbmRleChjdXIpID4gLTEgOgorCisJCQkJCS8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZQorCQkJCQljdXIubm9kZVR5cGUgPT09IDEgJiYKKwkJCQkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykpICkgeworCisJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggbWF0Y2hlZCApIDogbWF0Y2hlZCApOworCX0sCisKKwkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKKwlpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7CisKKwkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKKwkJaWYgKCAhZWxlbSApIHsKKwkJCXJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTsKKwkJfQorCisJCS8vIEluZGV4IGluIHNlbGVjdG9yCisJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgeworCQkJcmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApOworCQl9CisKKwkJLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50CisJCXJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsCisKKwkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorCQkJZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtCisJCSk7CisJfSwKKworCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soCisJCQlqUXVlcnkudW5pcXVlKAorCQkJCWpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApICkKKwkJCSkKKwkJKTsKKwl9LAorCisJYWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPworCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihzZWxlY3RvcikKKwkJKTsKKwl9Cit9KTsKKworZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7CisJd2hpbGUgKCAoY3VyID0gY3VyW2Rpcl0pICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9CisJcmV0dXJuIGN1cjsKK30KKworalF1ZXJ5LmVhY2goeworCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCXJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7CisJfSwKKwlwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOworCX0sCisJcGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIsIHVudGlsICk7CisJfSwKKwluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJuZXh0U2libGluZyIgKTsKKwl9LAorCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKKwl9LAorCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiApOworCX0sCisJcHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOworCX0sCisJbmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1bnRpbCApOworCX0sCisJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CisJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiwgdW50aWwgKTsKKwl9LAorCXNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTsKKwl9LAorCWNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKKwl9LAorCWNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApOworCX0KK30sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CisJCXZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7CisKKwkJaWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSAiVW50aWwiICkgeworCQkJc2VsZWN0b3IgPSB1bnRpbDsKKwkJfQorCisJCWlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKKwkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOworCQl9CisKKwkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CisJCQkvLyBSZW1vdmUgZHVwbGljYXRlcworCQkJaWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkgeworCQkJCWpRdWVyeS51bmlxdWUoIG1hdGNoZWQgKTsKKwkJCX0KKworCQkJLy8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXMKKwkJCWlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKKwkJCQltYXRjaGVkLnJldmVyc2UoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApOworCX07Cit9KTsKK3ZhciBybm90d2hpdGUgPSAoL1xTKy9nKTsKKworCisKKy8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGUKK3ZhciBvcHRpb25zQ2FjaGUgPSB7fTsKKworLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlCitmdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgeworCXZhciBvYmplY3QgPSBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSA9IHt9OworCWpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7CisJCW9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKKwl9KTsKKwlyZXR1cm4gb2JqZWN0OworfQorCisvKgorICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisgKgorICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdworICoJCQl0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0CisgKgorICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKKyAqICJmaXJlZCIgbXVsdGlwbGUgdGltZXMuCisgKgorICogUG9zc2libGUgb3B0aW9uczoKKyAqCisgKglvbmNlOgkJCXdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKKyAqCisgKgltZW1vcnk6CQkJd2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZAorICoJCQkJCWFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0ICJtZW1vcml6ZWQiCisgKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCisgKgorICoJdW5pcXVlOgkJCXdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KQorICoKKyAqCXN0b3BPbkZhbHNlOglpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2UKKyAqCisgKi8KK2pRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKKworCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKKwkvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpCisJb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiA/CisJCSggb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkgOgorCQlqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApOworCisJdmFyIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cykKKwkJbWVtb3J5LAorCQkvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZAorCQlmaXJlZCwKKwkJLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZworCQlmaXJpbmcsCisJCS8vIEZpcnN0IGNhbGxiYWNrIHRvIGZpcmUgKHVzZWQgaW50ZXJuYWxseSBieSBhZGQgYW5kIGZpcmVXaXRoKQorCQlmaXJpbmdTdGFydCwKKwkJLy8gRW5kIG9mIHRoZSBsb29wIHdoZW4gZmlyaW5nCisJCWZpcmluZ0xlbmd0aCwKKwkJLy8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgcmVtb3ZlIGlmIG5lZWRlZCkKKwkJZmlyaW5nSW5kZXgsCisJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CisJCWxpc3QgPSBbXSwKKwkJLy8gU3RhY2sgb2YgZmlyZSBjYWxscyBmb3IgcmVwZWF0YWJsZSBsaXN0cworCQlzdGFjayA9ICFvcHRpb25zLm9uY2UgJiYgW10sCisJCS8vIEZpcmUgY2FsbGJhY2tzCisJCWZpcmUgPSBmdW5jdGlvbiggZGF0YSApIHsKKwkJCW1lbW9yeSA9IG9wdGlvbnMubWVtb3J5ICYmIGRhdGE7CisJCQlmaXJlZCA9IHRydWU7CisJCQlmaXJpbmdJbmRleCA9IGZpcmluZ1N0YXJ0IHx8IDA7CisJCQlmaXJpbmdTdGFydCA9IDA7CisJCQlmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDsKKwkJCWZpcmluZyA9IHRydWU7CisJCQlmb3IgKCA7IGxpc3QgJiYgZmlyaW5nSW5kZXggPCBmaXJpbmdMZW5ndGg7IGZpcmluZ0luZGV4KysgKSB7CisJCQkJaWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBmYWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkgeworCQkJCQltZW1vcnkgPSBmYWxzZTsgLy8gVG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIHVzaW5nIGFkZAorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlmaXJpbmcgPSBmYWxzZTsKKwkJCWlmICggbGlzdCApIHsKKwkJCQlpZiAoIHN0YWNrICkgeworCQkJCQlpZiAoIHN0YWNrLmxlbmd0aCApIHsKKwkJCQkJCWZpcmUoIHN0YWNrLnNoaWZ0KCkgKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoIG1lbW9yeSApIHsKKwkJCQkJbGlzdCA9IFtdOworCQkJCX0gZWxzZSB7CisJCQkJCXNlbGYuZGlzYWJsZSgpOworCQkJCX0KKwkJCX0KKwkJfSwKKwkJLy8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3QKKwkJc2VsZiA9IHsKKwkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKKwkJCWFkZDogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBsaXN0ICkgeworCQkJCQkvLyBGaXJzdCwgd2Ugc2F2ZSB0aGUgY3VycmVudCBsZW5ndGgKKwkJCQkJdmFyIHN0YXJ0ID0gbGlzdC5sZW5ndGg7CisJCQkJCShmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7CisJCQkJCQlqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHsKKwkJCQkJCQl2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBhcmcgKTsKKwkJCQkJCQlpZiAoIHR5cGUgPT09ICJmdW5jdGlvbiIgKSB7CisJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CisJCQkJCQkJCQlsaXN0LnB1c2goIGFyZyApOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdHlwZSAhPT0gInN0cmluZyIgKSB7CisJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKKwkJCQkJCQkJYWRkKCBhcmcgKTsKKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJfSkoIGFyZ3VtZW50cyApOworCQkJCQkvLyBEbyB3ZSBuZWVkIHRvIGFkZCB0aGUgY2FsbGJhY2tzIHRvIHRoZQorCQkJCQkvLyBjdXJyZW50IGZpcmluZyBiYXRjaD8KKwkJCQkJaWYgKCBmaXJpbmcgKSB7CisJCQkJCQlmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDsKKwkJCQkJLy8gV2l0aCBtZW1vcnksIGlmIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbgorCQkJCQkvLyB3ZSBzaG91bGQgY2FsbCByaWdodCBhd2F5CisJCQkJCX0gZWxzZSBpZiAoIG1lbW9yeSApIHsKKwkJCQkJCWZpcmluZ1N0YXJ0ID0gc3RhcnQ7CisJCQkJCQlmaXJlKCBtZW1vcnkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0CisJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggbGlzdCApIHsKKwkJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKKwkJCQkJCXZhciBpbmRleDsKKwkJCQkJCXdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkgeworCQkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOworCQkJCQkJCS8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlcworCQkJCQkJCWlmICggZmlyaW5nICkgeworCQkJCQkJCQlpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHsKKwkJCQkJCQkJCWZpcmluZ0xlbmd0aC0tOworCQkJCQkJCQl9CisJCQkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CisJCQkJCQkJCQlmaXJpbmdJbmRleC0tOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9LAorCQkJLy8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC4KKwkJCS8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLgorCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CisJCQkJcmV0dXJuIGZuID8galF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6ICEhKCBsaXN0ICYmIGxpc3QubGVuZ3RoICk7CisJCQl9LAorCQkJLy8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdAorCQkJZW1wdHk6IGZ1bmN0aW9uKCkgeworCQkJCWxpc3QgPSBbXTsKKwkJCQlmaXJpbmdMZW5ndGggPSAwOworCQkJCXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlCisJCQlkaXNhYmxlOiBmdW5jdGlvbigpIHsKKwkJCQlsaXN0ID0gc3RhY2sgPSBtZW1vcnkgPSB1bmRlZmluZWQ7CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9LAorCQkJLy8gSXMgaXQgZGlzYWJsZWQ/CisJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CisJCQkJcmV0dXJuICFsaXN0OworCQkJfSwKKwkJCS8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGUKKwkJCWxvY2s6IGZ1bmN0aW9uKCkgeworCQkJCXN0YWNrID0gdW5kZWZpbmVkOworCQkJCWlmICggIW1lbW9yeSApIHsKKwkJCQkJc2VsZi5kaXNhYmxlKCk7CisJCQkJfQorCQkJCXJldHVybiB0aGlzOworCQkJfSwKKwkJCS8vIElzIGl0IGxvY2tlZD8KKwkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CisJCQkJcmV0dXJuICFzdGFjazsKKwkJCX0sCisJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCisJCQlmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7CisJCQkJaWYgKCBsaXN0ICYmICggIWZpcmVkIHx8IHN0YWNrICkgKSB7CisJCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOworCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOworCQkJCQlpZiAoIGZpcmluZyApIHsKKwkJCQkJCXN0YWNrLnB1c2goIGFyZ3MgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZpcmUoIGFyZ3MgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0sCisJCQkvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cworCQkJZmlyZTogZnVuY3Rpb24oKSB7CisJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9LAorCQkJLy8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlCisJCQlmaXJlZDogZnVuY3Rpb24oKSB7CisJCQkJcmV0dXJuICEhZmlyZWQ7CisJCQl9CisJCX07CisKKwlyZXR1cm4gc2VsZjsKK307CisKKworalF1ZXJ5LmV4dGVuZCh7CisKKwlEZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7CisJCXZhciB0dXBsZXMgPSBbCisJCQkJLy8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlCisJCQkJWyAicmVzb2x2ZSIsICJkb25lIiwgalF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgInJlc29sdmVkIiBdLAorCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgInJlamVjdGVkIiBdLAorCQkJCVsgIm5vdGlmeSIsICJwcm9ncmVzcyIsIGpRdWVyeS5DYWxsYmFja3MoIm1lbW9yeSIpIF0KKwkJCV0sCisJCQlzdGF0ZSA9ICJwZW5kaW5nIiwKKwkJCXByb21pc2UgPSB7CisJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgeworCQkJCQlyZXR1cm4gc3RhdGU7CisJCQkJfSwKKwkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgeworCQkJCQlkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTsKKwkJCQkJcmV0dXJuIHRoaXM7CisJCQkJfSwKKwkJCQl0aGVuOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CisJCQkJCXZhciBmbnMgPSBhcmd1bWVudHM7CisJCQkJCXJldHVybiBqUXVlcnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkgeworCQkJCQkJalF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgeworCQkJCQkJCXZhciBmbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBmbnNbIGkgXSApICYmIGZuc1sgaSBdOworCQkJCQkJCS8vIGRlZmVycmVkWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gZm9yIGZvcndhcmRpbmcgYWN0aW9ucyB0byBuZXdEZWZlcgorCQkJCQkJCWRlZmVycmVkWyB0dXBsZVsxXSBdKGZ1bmN0aW9uKCkgeworCQkJCQkJCQl2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHsKKwkJCQkJCQkJCXJldHVybmVkLnByb21pc2UoKQorCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKKwkJCQkJCQkJCQkuZmFpbCggbmV3RGVmZXIucmVqZWN0ICkKKwkJCQkJCQkJCQkucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJbmV3RGVmZXJbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSggdGhpcyA9PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21pc2UoKSA6IHRoaXMsIGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzICk7CisJCQkJCQkJCX0KKwkJCQkJCQl9KTsKKwkJCQkJCX0pOworCQkJCQkJZm5zID0gbnVsbDsKKwkJCQkJfSkucHJvbWlzZSgpOworCQkJCX0sCisJCQkJLy8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZAorCQkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKKwkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgeworCQkJCQlyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7CisJCQkJfQorCQkJfSwKKwkJCWRlZmVycmVkID0ge307CisKKwkJLy8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdAorCQlwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47CisKKwkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcworCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CisJCQl2YXIgbGlzdCA9IHR1cGxlWyAyIF0sCisJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgMyBdOworCisJCQkvLyBwcm9taXNlWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gPSBsaXN0LmFkZAorCQkJcHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxpc3QuYWRkOworCisJCQkvLyBIYW5kbGUgc3RhdGUKKwkJCWlmICggc3RhdGVTdHJpbmcgKSB7CisJCQkJbGlzdC5hZGQoZnVuY3Rpb24oKSB7CisJCQkJCS8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF0KKwkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKKworCQkJCS8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2sKKwkJCQl9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTsKKwkJCX0KKworCQkJLy8gZGVmZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXQorCQkJZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5jdGlvbigpIHsKKwkJCQlkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7CisJCQkJcmV0dXJuIHRoaXM7CisJCQl9OworCQkJZGVmZXJyZWRbIHR1cGxlWzBdICsgIldpdGgiIF0gPSBsaXN0LmZpcmVXaXRoOworCQl9KTsKKworCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKKwkJcHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApOworCisJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKKwkJaWYgKCBmdW5jICkgeworCQkJZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTsKKwkJfQorCisJCS8vIEFsbCBkb25lIQorCQlyZXR1cm4gZGVmZXJyZWQ7CisJfSwKKworCS8vIERlZmVycmVkIGhlbHBlcgorCXdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkgeworCQl2YXIgaSA9IDAsCisJCQlyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksCisJCQlsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCwKKworCQkJLy8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlcworCQkJcmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKKworCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZC4gSWYgcmVzb2x2ZVZhbHVlcyBjb25zaXN0IG9mIG9ubHkgYSBzaW5nbGUgRGVmZXJyZWQsIGp1c3QgdXNlIHRoYXQuCisJCQlkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksCisKKwkJCS8vIFVwZGF0ZSBmdW5jdGlvbiBmb3IgYm90aCByZXNvbHZlIGFuZCBwcm9ncmVzcyB2YWx1ZXMKKwkJCXVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHsKKwkJCQlyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkgeworCQkJCQljb250ZXh0c1sgaSBdID0gdGhpczsKKwkJCQkJdmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIDogdmFsdWU7CisJCQkJCWlmICggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHsKKwkJCQkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKKwkJCQkJfSBlbHNlIGlmICggISggLS1yZW1haW5pbmcgKSApIHsKKwkJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7CisJCQkJCX0KKwkJCQl9OworCQkJfSwKKworCQkJcHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29udGV4dHMsIHJlc29sdmVDb250ZXh0czsKKworCQkvLyBBZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkCisJCWlmICggbGVuZ3RoID4gMSApIHsKKwkJCXByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKKwkJCXByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOworCQkJcmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKKwkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCWlmICggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSApICkgeworCQkJCQlyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpCisJCQkJCQkuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKQorCQkJCQkJLmZhaWwoIGRlZmVycmVkLnJlamVjdCApCisJCQkJCQkucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTsKKwkJCQl9IGVsc2UgeworCQkJCQktLXJlbWFpbmluZzsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCisJCWlmICggIXJlbWFpbmluZyApIHsKKwkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKKwkJfQorCisJCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7CisJfQorfSk7CisKKworLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5Cit2YXIgcmVhZHlMaXN0OworCitqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CisJLy8gQWRkIHRoZSBjYWxsYmFjaworCWpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTsKKworCXJldHVybiB0aGlzOworfTsKKworalF1ZXJ5LmV4dGVuZCh7CisJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KKwlpc1JlYWR5OiBmYWxzZSwKKworCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKKwkvLyB0aGUgcmVhZHkgZXZlbnQgZmlyZXMuIFNlZSAjNjc4MQorCXJlYWR5V2FpdDogMSwKKworCS8vIEhvbGQgKG9yIHJlbGVhc2UpIHRoZSByZWFkeSBldmVudAorCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CisJCWlmICggaG9sZCApIHsKKwkJCWpRdWVyeS5yZWFkeVdhaXQrKzsKKwkJfSBlbHNlIHsKKwkJCWpRdWVyeS5yZWFkeSggdHJ1ZSApOworCQl9CisJfSwKKworCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKKwlyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CisKKwkJLy8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeQorCQlpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQorCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CisKKwkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKKwkJaWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKKworCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKKwkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlckhhbmRsZXIgKSB7CisJCQlqUXVlcnkoIGRvY3VtZW50ICkudHJpZ2dlckhhbmRsZXIoICJyZWFkeSIgKTsKKwkJCWpRdWVyeSggZG9jdW1lbnQgKS5vZmYoICJyZWFkeSIgKTsKKwkJfQorCX0KK30pOworCisvKioKKyAqIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCisgKi8KK2Z1bmN0aW9uIGNvbXBsZXRlZCgpIHsKKwlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKKwl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQsIGZhbHNlICk7CisJalF1ZXJ5LnJlYWR5KCk7Cit9CisKK2pRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKKwlpZiAoICFyZWFkeUxpc3QgKSB7CisKKwkJcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CisKKwkJLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuCisJCS8vIFdlIG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgImludGVyYWN0aXZlIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmUKKwkJLy8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNQorCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CisJCQkvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHkKKwkJCXNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOworCisJCX0gZWxzZSB7CisKKwkJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKKwkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOworCisJCQkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yaworCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICJsb2FkIiwgY29tcGxldGVkLCBmYWxzZSApOworCQl9CisJfQorCXJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7Cit9OworCisvLyBLaWNrIG9mZiB0aGUgRE9NIHJlYWR5IGNoZWNrIGV2ZW4gaWYgdGhlIHVzZXIgZG9lcyBub3QKK2pRdWVyeS5yZWFkeS5wcm9taXNlKCk7CisKKworCisKKy8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvbgorLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCit2YXIgYWNjZXNzID0galF1ZXJ5LmFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHsKKwl2YXIgaSA9IDAsCisJCWxlbiA9IGVsZW1zLmxlbmd0aCwKKwkJYnVsayA9IGtleSA9PSBudWxsOworCisJLy8gU2V0cyBtYW55IHZhbHVlcworCWlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKKwkJY2hhaW5hYmxlID0gdHJ1ZTsKKwkJZm9yICggaSBpbiBrZXkgKSB7CisJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApOworCQl9CisKKwkvLyBTZXRzIG9uZSB2YWx1ZQorCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisJCWNoYWluYWJsZSA9IHRydWU7CisKKwkJaWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisJCQlyYXcgPSB0cnVlOworCQl9CisKKwkJaWYgKCBidWxrICkgeworCQkJLy8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0CisJCQlpZiAoIHJhdyApIHsKKwkJCQlmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTsKKwkJCQlmbiA9IG51bGw7CisKKwkJCS8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1ZXMKKwkJCX0gZWxzZSB7CisJCQkJYnVsayA9IGZuOworCQkJCWZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7CisJCQkJCXJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApOworCQkJCX07CisJCQl9CisJCX0KKworCQlpZiAoIGZuICkgeworCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisJCQkJZm4oIGVsZW1zW2ldLCBrZXksIHJhdyA/IHZhbHVlIDogdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGNoYWluYWJsZSA/CisJCWVsZW1zIDoKKworCQkvLyBHZXRzCisJCWJ1bGsgPworCQkJZm4uY2FsbCggZWxlbXMgKSA6CisJCQlsZW4gPyBmbiggZWxlbXNbMF0sIGtleSApIDogZW1wdHlHZXQ7Cit9OworCisKKy8qKgorICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBjYW4gaGF2ZSBkYXRhCisgKi8KK2pRdWVyeS5hY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgeworCS8vIEFjY2VwdHMgb25seToKKwkvLyAgLSBOb2RlCisJLy8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERQorCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCisJLy8gIC0gT2JqZWN0CisJLy8gICAgLSBBbnkKKwkvKiBqc2hpbnQgLVcwMTggKi8KKwlyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cit9OworCisKK2Z1bmN0aW9uIERhdGEoKSB7CisJLy8gU3VwcG9ydDogQW5kcm9pZDw0LAorCS8vIE9sZCBXZWJLaXQgZG9lcyBub3QgaGF2ZSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMvZnJlZXplIG1ldGhvZCwKKwkvLyByZXR1cm4gbmV3IGVtcHR5IG9iamVjdCBpbnN0ZWFkIHdpdGggbm8gW1tzZXRdXSBhY2Nlc3NvcgorCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcy5jYWNoZSA9IHt9LCAwLCB7CisJCWdldDogZnVuY3Rpb24oKSB7CisJCQlyZXR1cm4ge307CisJCX0KKwl9KTsKKworCXRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKzsKK30KKworRGF0YS51aWQgPSAxOworRGF0YS5hY2NlcHRzID0galF1ZXJ5LmFjY2VwdERhdGE7CisKK0RhdGEucHJvdG90eXBlID0geworCWtleTogZnVuY3Rpb24oIG93bmVyICkgeworCQkvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2VycywKKwkJLy8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS4KKwkJLy8gQWx3YXlzIHJldHVybiB0aGUga2V5IGZvciBhIGZyb3plbiBvYmplY3QuCisJCWlmICggIURhdGEuYWNjZXB0cyggb3duZXIgKSApIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdmFyIGRlc2NyaXB0b3IgPSB7fSwKKwkJCS8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZSBrZXkKKwkJCXVubG9jayA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKKworCQkvLyBJZiBub3QsIGNyZWF0ZSBvbmUKKwkJaWYgKCAhdW5sb2NrICkgeworCQkJdW5sb2NrID0gRGF0YS51aWQrKzsKKworCQkJLy8gU2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eQorCQkJdHJ5IHsKKwkJCQlkZXNjcmlwdG9yWyB0aGlzLmV4cGFuZG8gXSA9IHsgdmFsdWU6IHVubG9jayB9OworCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBvd25lciwgZGVzY3JpcHRvciApOworCisJCQkvLyBTdXBwb3J0OiBBbmRyb2lkPDQKKwkJCS8vIEZhbGxiYWNrIHRvIGEgbGVzcyBzZWN1cmUgZGVmaW5pdGlvbgorCQkJfSBjYXRjaCAoIGUgKSB7CisJCQkJZGVzY3JpcHRvclsgdGhpcy5leHBhbmRvIF0gPSB1bmxvY2s7CisJCQkJalF1ZXJ5LmV4dGVuZCggb3duZXIsIGRlc2NyaXB0b3IgKTsKKwkJCX0KKwkJfQorCisJCS8vIEVuc3VyZSB0aGUgY2FjaGUgb2JqZWN0CisJCWlmICggIXRoaXMuY2FjaGVbIHVubG9jayBdICkgeworCQkJdGhpcy5jYWNoZVsgdW5sb2NrIF0gPSB7fTsKKwkJfQorCisJCXJldHVybiB1bmxvY2s7CisJfSwKKwlzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CisJCXZhciBwcm9wLAorCQkJLy8gVGhlcmUgbWF5IGJlIGFuIHVubG9jayBhc3NpZ25lZCB0byB0aGlzIG5vZGUsCisJCQkvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyAib3duZXIiLCBjcmVhdGUgb25lIGlubGluZQorCQkJLy8gYW5kIHNldCB0aGUgdW5sb2NrIGFzIHRob3VnaCBhbiBvd25lciBlbnRyeSBoYWQgYWx3YXlzIGV4aXN0ZWQKKwkJCXVubG9jayA9IHRoaXMua2V5KCBvd25lciApLAorCQkJY2FjaGUgPSB0aGlzLmNhY2hlWyB1bmxvY2sgXTsKKworCQkvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzCisJCWlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgeworCQkJY2FjaGVbIGRhdGEgXSA9IHZhbHVlOworCisJCS8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzCisJCX0gZWxzZSB7CisJCQkvLyBGcmVzaCBhc3NpZ25tZW50cyBieSBvYmplY3QgYXJlIHNoYWxsb3cgY29waWVkCisJCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkgeworCQkJCWpRdWVyeS5leHRlbmQoIHRoaXMuY2FjaGVbIHVubG9jayBdLCBkYXRhICk7CisJCQkvLyBPdGhlcndpc2UsIGNvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0CisJCQl9IGVsc2UgeworCQkJCWZvciAoIHByb3AgaW4gZGF0YSApIHsKKwkJCQkJY2FjaGVbIHByb3AgXSA9IGRhdGFbIHByb3AgXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGNhY2hlOworCX0sCisJZ2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKKwkJLy8gRWl0aGVyIGEgdmFsaWQgY2FjaGUgaXMgZm91bmQsIG9yIHdpbGwgYmUgY3JlYXRlZC4KKwkJLy8gTmV3IGNhY2hlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1bmxvY2sgcmV0dXJuZWQsCisJCS8vIGFsbG93aW5nIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKKwkJLy8gZW1wdHkgZGF0YSBvYmplY3QuIEEgdmFsaWQgb3duZXIgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQuCisJCXZhciBjYWNoZSA9IHRoaXMuY2FjaGVbIHRoaXMua2V5KCBvd25lciApIF07CisKKwkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KKwkJCWNhY2hlIDogY2FjaGVbIGtleSBdOworCX0sCisJYWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7CisJCXZhciBzdG9yZWQ7CisJCS8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjoKKwkJLy8KKwkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAorCQkvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWQKKwkJLy8KKwkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQorCQkvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6CisJCS8vCisJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKKwkJLy8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleQorCQkvLworCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CisJCQkJKChrZXkgJiYgdHlwZW9mIGtleSA9PT0gInN0cmluZyIpICYmIHZhbHVlID09PSB1bmRlZmluZWQpICkgeworCisJCQlzdG9yZWQgPSB0aGlzLmdldCggb3duZXIsIGtleSApOworCisJCQlyZXR1cm4gc3RvcmVkICE9PSB1bmRlZmluZWQgPworCQkJCXN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZShrZXkpICk7CisJCX0KKworCQkvLyBbKl1XaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQorCQkvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjoKKwkJLy8KKwkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcworCQkvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZQorCQkvLworCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKKworCQkvLyBTaW5jZSB0aGUgInNldCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzCisJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQorCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5OworCX0sCisJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKKwkJdmFyIGksIG5hbWUsIGNhbWVsLAorCQkJdW5sb2NrID0gdGhpcy5rZXkoIG93bmVyICksCisJCQljYWNoZSA9IHRoaXMuY2FjaGVbIHVubG9jayBdOworCisJCWlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7CisJCQl0aGlzLmNhY2hlWyB1bmxvY2sgXSA9IHt9OworCisJCX0gZWxzZSB7CisJCQkvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5cworCQkJaWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7CisJCQkJLy8gSWYgIm5hbWUiIGlzIGFuIGFycmF5IG9mIGtleXMuLi4KKwkJCQkvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoImtleSIsICJ2YWwiKSBzaWduYXR1cmUsCisJCQkJLy8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuCisJCQkJLy8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmUKKwkJCQkvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2CisJCQkJLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguCisJCQkJbmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKSApOworCQkJfSBlbHNlIHsKKwkJCQljYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApOworCQkJCS8vIFRyeSB0aGUgc3RyaW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uCisJCQkJaWYgKCBrZXkgaW4gY2FjaGUgKSB7CisJCQkJCW5hbWUgPSBbIGtleSwgY2FtZWwgXTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuCisJCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCisJCQkJCW5hbWUgPSBjYW1lbDsKKwkJCQkJbmFtZSA9IG5hbWUgaW4gY2FjaGUgPworCQkJCQkJWyBuYW1lIF0gOiAoIG5hbWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdICk7CisJCQkJfQorCQkJfQorCisJCQlpID0gbmFtZS5sZW5ndGg7CisJCQl3aGlsZSAoIGktLSApIHsKKwkJCQlkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdOworCQkJfQorCQl9CisJfSwKKwloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CisJCXJldHVybiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoCisJCQl0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXSB8fCB7fQorCQkpOworCX0sCisJZGlzY2FyZDogZnVuY3Rpb24oIG93bmVyICkgeworCQlpZiAoIG93bmVyWyB0aGlzLmV4cGFuZG8gXSApIHsKKwkJCWRlbGV0ZSB0aGlzLmNhY2hlWyBvd25lclsgdGhpcy5leHBhbmRvIF0gXTsKKwkJfQorCX0KK307Cit2YXIgZGF0YV9wcml2ID0gbmV3IERhdGEoKTsKKwordmFyIGRhdGFfdXNlciA9IG5ldyBEYXRhKCk7CisKKworCisvLwlJbXBsZW1lbnRhdGlvbiBTdW1tYXJ5CisvLworLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAorLy8JMi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlCisvLwkJcGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLgorLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgorLy8JNC4gX05ldmVyXyBleHBvc2UgInByaXZhdGUiIGRhdGEgdG8gdXNlciBjb2RlIChUT0RPOiBEcm9wIF9kYXRhLCBfcmVtb3ZlRGF0YSkKKy8vCTUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKQorLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0CisKK3ZhciByYnJhY2UgPSAvXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLAorCXJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOworCitmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgeworCXZhciBuYW1lOworCisJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQorCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQorCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJDEiICkudG9Mb3dlckNhc2UoKTsKKwkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CisKKwkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CisJCQl0cnkgeworCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKKwkJCQkJZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoKKwkJCQkJZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6CisJCQkJCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCisJCQkJCStkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6CisJCQkJCXJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOgorCQkJCQlkYXRhOworCQkJfSBjYXRjaCggZSApIHt9CisKKwkJCS8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlcgorCQkJZGF0YV91c2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7CisJCX0gZWxzZSB7CisJCQlkYXRhID0gdW5kZWZpbmVkOworCQl9CisJfQorCXJldHVybiBkYXRhOworfQorCitqUXVlcnkuZXh0ZW5kKHsKKwloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGRhdGFfdXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YV9wcml2Lmhhc0RhdGEoIGVsZW0gKTsKKwl9LAorCisJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CisJCXJldHVybiBkYXRhX3VzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7CisJfSwKKworCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlkYXRhX3VzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7CisJfSwKKworCS8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkCisJLy8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YV9wcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgorCV9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKKwkJcmV0dXJuIGRhdGFfcHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKKwl9LAorCisJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCQl2YXIgaSwgbmFtZSwgZGF0YSwKKwkJCWVsZW0gPSB0aGlzWyAwIF0sCisJCQlhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzOworCisJCS8vIEdldHMgYWxsIHZhbHVlcworCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgeworCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKKwkJCQlkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSApOworCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhX3ByaXYuZ2V0KCBlbGVtLCAiaGFzRGF0YUF0dHJzIiApICkgeworCQkJCQlpID0gYXR0cnMubGVuZ3RoOworCQkJCQl3aGlsZSAoIGktLSApIHsKKworCQkJCQkJLy8gU3VwcG9ydDogSUUxMSsKKwkJCQkJCS8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KQorCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgeworCQkJCQkJCW5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7CisJCQkJCQkJaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKKwkJCQkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTsKKwkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlkYXRhX3ByaXYuc2V0KCBlbGVtLCAiaGFzRGF0YUF0dHJzIiwgdHJ1ZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGRhdGE7CisJCX0KKworCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcworCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQlkYXRhX3VzZXIuc2V0KCB0aGlzLCBrZXkgKTsKKwkJCX0pOworCQl9CisKKwkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgeworCQkJdmFyIGRhdGEsCisJCQkJY2FtZWxLZXkgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTsKKworCQkJLy8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHkKKwkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCisJCQkvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdAorCQkJLy8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbAorCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KKwkJCWlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCQkJCS8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGUKKwkJCQkvLyB3aXRoIHRoZSBrZXkgYXMtaXMKKwkJCQlkYXRhID0gZGF0YV91c2VyLmdldCggZWxlbSwga2V5ICk7CisJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCXJldHVybiBkYXRhOworCQkJCX0KKworCQkJCS8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGUKKwkJCQkvLyB3aXRoIHRoZSBrZXkgY2FtZWxpemVkCisJCQkJZGF0YSA9IGRhdGFfdXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7CisJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCXJldHVybiBkYXRhOworCQkJCX0KKworCQkJCS8vIEF0dGVtcHQgdG8gImRpc2NvdmVyIiB0aGUgZGF0YSBpbgorCQkJCS8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnMKKwkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1bmRlZmluZWQgKTsKKwkJCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJcmV0dXJuIGRhdGE7CisJCQkJfQorCisJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgorCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gU2V0IHRoZSBkYXRhLi4uCisJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJLy8gRmlyc3QsIGF0dGVtcHQgdG8gc3RvcmUgYSBjb3B5IG9yIHJlZmVyZW5jZSBvZiBhbnkKKwkJCQkvLyBkYXRhIHRoYXQgbWlnaHQndmUgYmVlbiBzdG9yZSB3aXRoIGEgY2FtZWxDYXNlZCBrZXkuCisJCQkJdmFyIGRhdGEgPSBkYXRhX3VzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApOworCisJCQkJLy8gRm9yIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUgaW50ZXJvcCwgd2UgaGF2ZSB0bworCQkJCS8vIHN0b3JlIHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNlIGZvcm0uCisJCQkJLy8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHByb3BlcnRpZXMuLi4qCisJCQkJZGF0YV91c2VyLnNldCggdGhpcywgY2FtZWxLZXksIHZhbHVlICk7CisKKwkJCQkvLyAqLi4uIEluIHRoZSBjYXNlIG9mIHByb3BlcnRpZXMgdGhhdCBtaWdodCBfYWN0dWFsbHlfCisJCQkJLy8gaGF2ZSBkYXNoZXMsIHdlIG5lZWQgdG8gYWxzbyBzdG9yZSBhIGNvcHkgb2YgdGhhdAorCQkJCS8vIHVuY2hhbmdlZCBwcm9wZXJ0eS4KKwkJCQlpZiAoIGtleS5pbmRleE9mKCItIikgIT09IC0xICYmIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJZGF0YV91c2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApOworCQkJCX0KKwkJCX0pOworCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTsKKwl9LAorCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWRhdGFfdXNlci5yZW1vdmUoIHRoaXMsIGtleSApOworCQl9KTsKKwl9Cit9KTsKKworCitqUXVlcnkuZXh0ZW5kKHsKKwlxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7CisJCXZhciBxdWV1ZTsKKworCQlpZiAoIGVsZW0gKSB7CisJCQl0eXBlID0gKCB0eXBlIHx8ICJmeCIgKSArICJxdWV1ZSI7CisJCQlxdWV1ZSA9IGRhdGFfcHJpdi5nZXQoIGVsZW0sIHR5cGUgKTsKKworCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAorCQkJaWYgKCBkYXRhICkgeworCQkJCWlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7CisJCQkJCXF1ZXVlID0gZGF0YV9wcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOworCQkJCX0gZWxzZSB7CisJCQkJCXF1ZXVlLnB1c2goIGRhdGEgKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcXVldWUgfHwgW107CisJCX0KKwl9LAorCisJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CisJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CisKKwkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCisJCQlzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCwKKwkJCWZuID0gcXVldWUuc2hpZnQoKSwKKwkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCisJCQluZXh0ID0gZnVuY3Rpb24oKSB7CisJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKKwkJCX07CisKKwkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAorCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CisJCQlmbiA9IHF1ZXVlLnNoaWZ0KCk7CisJCQlzdGFydExlbmd0aC0tOworCQl9CisKKwkJaWYgKCBmbiApIHsKKworCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZworCQkJLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZAorCQkJaWYgKCB0eXBlID09PSAiZngiICkgeworCQkJCXF1ZXVlLnVuc2hpZnQoICJpbnByb2dyZXNzIiApOworCQkJfQorCisJCQkvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uCisJCQlkZWxldGUgaG9va3Muc3RvcDsKKwkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CisJCX0KKworCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKKwkJCWhvb2tzLmVtcHR5LmZpcmUoKTsKKwkJfQorCX0sCisKKwkvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZQorCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKKwkJdmFyIGtleSA9IHR5cGUgKyAicXVldWVIb29rcyI7CisJCXJldHVybiBkYXRhX3ByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHsKKwkJCWVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKKwkJCQlkYXRhX3ByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyAicXVldWUiLCBrZXkgXSApOworCQkJfSkKKwkJfSk7CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJdmFyIHNldHRlciA9IDI7CisKKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisJCQlkYXRhID0gdHlwZTsKKwkJCXR5cGUgPSAiZngiOworCQkJc2V0dGVyLS07CisJCX0KKworCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7CisJCQlyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWzBdLCB0eXBlICk7CisJCX0KKworCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KKwkJCXRoaXMgOgorCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOworCisJCQkJLy8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWUKKwkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTsKKworCQkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJvZ3Jlc3MiICkgeworCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQkJCX0KKwkJCX0pOworCX0sCisJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOworCQl9KTsKKwl9LAorCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgeworCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOworCX0sCisJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQorCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQorCXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CisJCXZhciB0bXAsCisJCQljb3VudCA9IDEsCisJCQlkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAorCQkJZWxlbWVudHMgPSB0aGlzLAorCQkJaSA9IHRoaXMubGVuZ3RoLAorCQkJcmVzb2x2ZSA9IGZ1bmN0aW9uKCkgeworCQkJCWlmICggISggLS1jb3VudCApICkgeworCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOworCQkJCX0KKwkJCX07CisKKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisJCQlvYmogPSB0eXBlOworCQkJdHlwZSA9IHVuZGVmaW5lZDsKKwkJfQorCQl0eXBlID0gdHlwZSB8fCAiZngiOworCisJCXdoaWxlICggaS0tICkgeworCQkJdG1wID0gZGF0YV9wcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOworCQkJaWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkgeworCQkJCWNvdW50Kys7CisJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOworCQkJfQorCQl9CisJCXJlc29sdmUoKTsKKwkJcmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApOworCX0KK30pOwordmFyIHBudW0gPSAoL1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLykuc291cmNlOworCit2YXIgY3NzRXhwYW5kID0gWyAiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0IiBdOworCit2YXIgaXNIaWRkZW4gPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CisJCS8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247CisJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAorCQllbGVtID0gZWwgfHwgZWxlbTsKKwkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSIgfHwgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7CisJfTsKKwordmFyIHJjaGVja2FibGVUeXBlID0gKC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pKTsKKworCisKKyhmdW5jdGlvbigpIHsKKwl2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCisJCWRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICksCisJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOworCisJLy8gU3VwcG9ydDogU2FmYXJpPD01LjEKKwkvLyBDaGVjayBzdGF0ZSBsb3N0IGlmIHRoZSBuYW1lIGlzIHNldCAoIzExMjE3KQorCS8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSkKKwkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKKwlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOworCWlucHV0LnNldEF0dHJpYnV0ZSggImNoZWNrZWQiLCAiY2hlY2tlZCIgKTsKKwlpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CisKKwlkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CisKKwkvLyBTdXBwb3J0OiBTYWZhcmk8PTUuMSwgQW5kcm9pZDw0LjIKKwkvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHMKKwlzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CisKKwkvLyBTdXBwb3J0OiBJRTw9MTErCisJLy8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWQKKwlkaXYuaW5uZXJIVE1MID0gIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iOworCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOworfSkoKTsKK3ZhciBzdHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkOworCisKKworc3VwcG9ydC5mb2N1c2luQnViYmxlcyA9ICJvbmZvY3VzaW4iIGluIHdpbmRvdzsKKworCit2YXIKKwlya2V5RXZlbnQgPSAvXmtleS8sCisJcm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywKKwlyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLywKKwlydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlwuKC4rKXwpJC87CisKK2Z1bmN0aW9uIHJldHVyblRydWUoKSB7CisJcmV0dXJuIHRydWU7Cit9CisKK2Z1bmN0aW9uIHJldHVybkZhbHNlKCkgeworCXJldHVybiBmYWxzZTsKK30KKworZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7CisJdHJ5IHsKKwkJcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CisJfSBjYXRjaCAoIGVyciApIHsgfQorfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgorICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisJZ2xvYmFsOiB7fSwKKworCWFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHsKKworCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCisJCQlldmVudHMsIHQsIGhhbmRsZU9iaiwKKwkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKKwkJCWVsZW1EYXRhID0gZGF0YV9wcml2LmdldCggZWxlbSApOworCisJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCisJCWlmICggIWVsZW1EYXRhICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyCisJCWlmICggaGFuZGxlci5oYW5kbGVyICkgeworCQkJaGFuZGxlT2JqSW4gPSBoYW5kbGVyOworCQkJaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7CisJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOworCQl9CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCisJCWlmICggIWhhbmRsZXIuZ3VpZCApIHsKKwkJCWhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7CisJCX0KKworCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0CisJCWlmICggIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkgeworCQkJZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307CisJCX0KKwkJaWYgKCAhKGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlKSApIHsKKwkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CisJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKKwkJCQkvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCisJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IHN0cnVuZGVmaW5lZCAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPworCQkJCQlqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGVsZW0sIGFyZ3VtZW50cyApIDogdW5kZWZpbmVkOworCQkJfTsKKwkJfQorCisJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKKwkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgIiIgXTsKKwkJdCA9IHR5cGVzLmxlbmd0aDsKKwkJd2hpbGUgKCB0LS0gKSB7CisJCQl0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdOworCQkJdHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdOworCQkJbmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8ICIiICkuc3BsaXQoICIuIiApLnNvcnQoKTsKKworCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCisJCQlpZiAoICF0eXBlICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUKKwkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OworCisJCQkvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGUKKwkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKKworCQkJLy8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZQorCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CisKKwkJCS8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzCisJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKHsKKwkJCQl0eXBlOiB0eXBlLAorCQkJCW9yaWdUeXBlOiBvcmlnVHlwZSwKKwkJCQlkYXRhOiBkYXRhLAorCQkJCWhhbmRsZXI6IGhhbmRsZXIsCisJCQkJZ3VpZDogaGFuZGxlci5ndWlkLAorCQkJCXNlbGVjdG9yOiBzZWxlY3RvciwKKwkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAorCQkJCW5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCIuIikKKwkJCX0sIGhhbmRsZU9iakluICk7CisKKwkJCS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0CisJCQlpZiAoICEoaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSkgKSB7CisJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdOworCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOworCisJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCisJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkgeworCQkJCQlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmICggc3BlY2lhbC5hZGQgKSB7CisJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CisKKwkJCQlpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkgeworCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOworCQkJCX0KKwkJCX0KKworCQkJLy8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnQKKwkJCWlmICggc2VsZWN0b3IgKSB7CisJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOworCQkJfSBlbHNlIHsKKwkJCQloYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTsKKwkJCX0KKworCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvbgorCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKKwkJfQorCisJfSwKKworCS8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudAorCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CisKKwkJdmFyIGosIG9yaWdDb3VudCwgdG1wLAorCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCisJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCisJCQllbGVtRGF0YSA9IGRhdGFfcHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YV9wcml2LmdldCggZWxlbSApOworCisJCWlmICggIWVsZW1EYXRhIHx8ICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWQKKwkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgIiIgXTsKKwkJdCA9IHR5cGVzLmxlbmd0aDsKKwkJd2hpbGUgKCB0LS0gKSB7CisJCQl0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdOworCQkJdHlwZSA9IG9yaWdUeXBlID0gdG1wWzFdOworCQkJbmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8ICIiICkuc3BsaXQoICIuIiApLnNvcnQoKTsKKworCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CisJCQlpZiAoICF0eXBlICkgeworCQkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgeworCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OworCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOworCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTsKKwkJCXRtcCA9IHRtcFsyXSAmJiBuZXcgUmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiApOworCisJCQkvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzCisJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOworCQkJd2hpbGUgKCBqLS0gKSB7CisJCQkJaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKKworCQkJCWlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiYKKwkJCQkJKCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiYKKwkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgorCQkJCQkoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAiKioiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkgeworCQkJCQloYW5kbGVycy5zcGxpY2UoIGosIDEgKTsKKworCQkJCQlpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHsKKwkJCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTsKKwkJCQkJfQorCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgeworCQkJCQkJc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKKwkJCS8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKQorCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKKwkJCQlpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8IHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkgeworCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApOworCQkJCX0KKworCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKKwkJCX0KKwkJfQorCisJCS8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCisJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkgeworCQkJZGVsZXRlIGVsZW1EYXRhLmhhbmRsZTsKKwkJCWRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sICJldmVudHMiICk7CisJCX0KKwl9LAorCisJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CisKKwkJdmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCwKKwkJCWV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLAorCQkJdHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgInR5cGUiICkgPyBldmVudC50eXBlIDogZXZlbnQsCisJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCIuIikgOiBbXTsKKworCQljdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDsKKworCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vdworCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoIHR5cGUuaW5kZXhPZigiLiIpID49IDAgKSB7CisJCQkvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCisJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOworCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKwkJCW5hbWVzcGFjZXMuc29ydCgpOworCQl9CisJCW9udHlwZSA9IHR5cGUuaW5kZXhPZigiOiIpIDwgMCAmJiAib24iICsgdHlwZTsKKworCQkvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmcKKwkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CisJCQlldmVudCA6CisJCQluZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiICYmIGV2ZW50ICk7CisKKwkJLy8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKQorCQlldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMzsKKwkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCIuIik7CisJCWV2ZW50Lm5hbWVzcGFjZV9yZSA9IGV2ZW50Lm5hbWVzcGFjZSA/CisJCQluZXcgUmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiApIDoKKwkJCW51bGw7CisKKwkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCisJCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKKwkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgeworCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKKwkJfQorCisJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKKwkJZGF0YSA9IGRhdGEgPT0gbnVsbCA/CisJCQlbIGV2ZW50IF0gOgorCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CisKKwkJLy8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lcworCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKKwkJaWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSkKKwkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKKwkJaWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKworCQkJYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7CisJCQlpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkgeworCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOworCQkJfQorCQkJZm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkgeworCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKKwkJCQl0bXAgPSBjdXI7CisJCQl9CisKKwkJCS8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKQorCQkJaWYgKCB0bXAgPT09IChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpICkgeworCQkJCWV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTsKKwkJCX0KKwkJfQorCisJCS8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGgKKwkJaSA9IDA7CisJCXdoaWxlICggKGN1ciA9IGV2ZW50UGF0aFtpKytdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKworCQkJZXZlbnQudHlwZSA9IGkgPiAxID8KKwkJCQlidWJibGVUeXBlIDoKKwkJCQlzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7CisKKwkJCS8vIGpRdWVyeSBoYW5kbGVyCisJCQloYW5kbGUgPSAoIGRhdGFfcHJpdi5nZXQoIGN1ciwgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgZGF0YV9wcml2LmdldCggY3VyLCAiaGFuZGxlIiApOworCQkJaWYgKCBoYW5kbGUgKSB7CisJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKKwkJCX0KKworCQkJLy8gTmF0aXZlIGhhbmRsZXIKKwkJCWhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOworCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSApIHsKKwkJCQlldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOworCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKKwkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZXZlbnQudHlwZSA9IHR5cGU7CisKKwkJLy8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vdworCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkgeworCisJCQlpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UpICYmCisJCQkJalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKKworCQkJCS8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRoZSBldmVudC4KKwkJCQkvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApCisJCQkJaWYgKCBvbnR5cGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKKworCQkJCQkvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kCisJCQkJCXRtcCA9IGVsZW1bIG9udHlwZSBdOworCisJCQkJCWlmICggdG1wICkgeworCQkJCQkJZWxlbVsgb250eXBlIF0gPSBudWxsOworCQkJCQl9CisKKwkJCQkJLy8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmUKKwkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CisJCQkJCWVsZW1bIHR5cGUgXSgpOworCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOworCisJCQkJCWlmICggdG1wICkgeworCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gZXZlbnQucmVzdWx0OworCX0sCisKKwlkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgeworCisJCS8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdAorCQlldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICk7CisKKwkJdmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLAorCQkJaGFuZGxlclF1ZXVlID0gW10sCisJCQlhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksCisJCQloYW5kbGVycyA9ICggZGF0YV9wcml2LmdldCggdGhpcywgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10sCisJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTsKKworCQkvLyBVc2UgdGhlIGZpeC1lZCBqUXVlcnkuRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudAorCQlhcmdzWzBdID0gZXZlbnQ7CisJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKKworCQkvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkCisJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRGV0ZXJtaW5lIGhhbmRsZXJzCisJCWhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTsKKworCQkvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1cworCQlpID0gMDsKKwkJd2hpbGUgKCAobWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0pICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkgeworCQkJZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTsKKworCQkJaiA9IDA7CisJCQl3aGlsZSAoIChoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSkgJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisKKwkJCQkvLyBUcmlnZ2VyZWQgZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9yIDIpIGhhdmUgbmFtZXNwYWNlKHMpCisJCQkJLy8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuCisJCQkJaWYgKCAhZXZlbnQubmFtZXNwYWNlX3JlIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CisKKwkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOworCQkJCQlldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7CisKKwkJCQkJcmV0ID0gKCAoalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9KS5oYW5kbGUgfHwgaGFuZGxlT2JqLmhhbmRsZXIgKQorCQkJCQkJCS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7CisKKwkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKKwkJCQkJCWlmICggKGV2ZW50LnJlc3VsdCA9IHJldCkgPT09IGZhbHNlICkgeworCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlCisJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CisJCQlzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApOworCQl9CisKKwkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKKwl9LAorCisJaGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7CisJCXZhciBpLCBtYXRjaGVzLCBzZWwsIGhhbmRsZU9iaiwKKwkJCWhhbmRsZXJRdWV1ZSA9IFtdLAorCQkJZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsCisJCQljdXIgPSBldmVudC50YXJnZXQ7CisKKwkJLy8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVycworCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKQorCQkvLyBBdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJlZm94ICgjMzg2MSkKKwkJaWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1ci5ub2RlVHlwZSAmJiAoIWV2ZW50LmJ1dHRvbiB8fCBldmVudC50eXBlICE9PSAiY2xpY2siKSApIHsKKworCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CisKKwkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKKwkJCQlpZiAoIGN1ci5kaXNhYmxlZCAhPT0gdHJ1ZSB8fCBldmVudC50eXBlICE9PSAiY2xpY2siICkgeworCQkJCQltYXRjaGVzID0gW107CisJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgeworCQkJCQkJaGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTsKKworCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKKwkJCQkJCXNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArICIgIjsKKworCQkJCQkJaWYgKCBtYXRjaGVzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgeworCQkJCQkJCW1hdGNoZXNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/CisJCQkJCQkJCWpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAgOgorCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOworCQkJCQkJfQorCQkJCQkJaWYgKCBtYXRjaGVzWyBzZWwgXSApIHsKKwkJCQkJCQltYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICggbWF0Y2hlcy5sZW5ndGggKSB7CisJCQkJCQloYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZXMgfSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzCisJCWlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHsKKwkJCWhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogdGhpcywgaGFuZGxlcnM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSk7CisJCX0KKworCQlyZXR1cm4gaGFuZGxlclF1ZXVlOworCX0sCisKKwkvLyBJbmNsdWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudAorCXByb3BzOiAiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLAorCisJZml4SG9va3M6IHt9LAorCisJa2V5SG9va3M6IHsKKwkJcHJvcHM6ICJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLAorCQlmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CisKKwkJCS8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50cworCQkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICkgeworCQkJCWV2ZW50LndoaWNoID0gb3JpZ2luYWwuY2hhckNvZGUgIT0gbnVsbCA/IG9yaWdpbmFsLmNoYXJDb2RlIDogb3JpZ2luYWwua2V5Q29kZTsKKwkJCX0KKworCQkJcmV0dXJuIGV2ZW50OworCQl9CisJfSwKKworCW1vdXNlSG9va3M6IHsKKwkJcHJvcHM6ICJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksCisJCWZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKKwkJCXZhciBldmVudERvYywgZG9jLCBib2R5LAorCQkJCWJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbjsKKworCQkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQorCQkJaWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHsKKwkJCQlldmVudERvYyA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OworCQkJCWRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDsKKwkJCQlib2R5ID0gZXZlbnREb2MuYm9keTsKKworCQkJCWV2ZW50LnBhZ2VYID0gb3JpZ2luYWwuY2xpZW50WCArICggZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDAgKTsKKwkJCQlldmVudC5wYWdlWSA9IG9yaWdpbmFsLmNsaWVudFkgKyAoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50VG9wICB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wICB8fCAwICk7CisJCQl9CisKKwkJCS8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHQKKwkJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CisJCQlpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHsKKwkJCQlldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7CisJCQl9CisKKwkJCXJldHVybiBldmVudDsKKwkJfQorCX0sCisKKwlmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKKwkJaWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHsKKwkJCXJldHVybiBldmVudDsKKwkJfQorCisJCS8vIENyZWF0ZSBhIHdyaXRhYmxlIGNvcHkgb2YgdGhlIGV2ZW50IG9iamVjdCBhbmQgbm9ybWFsaXplIHNvbWUgcHJvcGVydGllcworCQl2YXIgaSwgcHJvcCwgY29weSwKKwkJCXR5cGUgPSBldmVudC50eXBlLAorCQkJb3JpZ2luYWxFdmVudCA9IGV2ZW50LAorCQkJZml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTsKKworCQlpZiAoICFmaXhIb29rICkgeworCQkJdGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9CisJCQkJcm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDoKKwkJCQlya2V5RXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5rZXlIb29rcyA6CisJCQkJe307CisJCX0KKwkJY29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wczsKKworCQlldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKKworCQlpID0gY29weS5sZW5ndGg7CisJCXdoaWxlICggaS0tICkgeworCQkJcHJvcCA9IGNvcHlbIGkgXTsKKwkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07CisJCX0KKworCQkvLyBTdXBwb3J0OiBDb3Jkb3ZhIDIuNSAoV2ViS2l0KSAoIzEzMjU1KQorCQkvLyBBbGwgZXZlbnRzIHNob3VsZCBoYXZlIGEgdGFyZ2V0OyBDb3Jkb3ZhIGRldmljZXJlYWR5IGRvZXNuJ3QKKwkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgeworCQkJZXZlbnQudGFyZ2V0ID0gZG9jdW1lbnQ7CisJCX0KKworCQkvLyBTdXBwb3J0OiBTYWZhcmkgNi4wKywgQ2hyb21lPDI4CisJCS8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpCisJCWlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkgeworCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CisJCX0KKworCQlyZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50OworCX0sCisKKwlzcGVjaWFsOiB7CisJCWxvYWQ6IHsKKwkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKKwkJCW5vQnViYmxlOiB0cnVlCisJCX0sCisJCWZvY3VzOiB7CisJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKKwkJCXRyaWdnZXI6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkgeworCQkJCQl0aGlzLmZvY3VzKCk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9LAorCQkJZGVsZWdhdGVUeXBlOiAiZm9jdXNpbiIKKwkJfSwKKwkJYmx1cjogeworCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHsKKwkJCQkJdGhpcy5ibHVyKCk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9LAorCQkJZGVsZWdhdGVUeXBlOiAiZm9jdXNvdXQiCisJCX0sCisJCWNsaWNrOiB7CisJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAorCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgJiYgdGhpcy5jbGljayAmJiBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKKwkJCQkJdGhpcy5jbGljaygpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfSwKKworCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCisJCQlfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJCXJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CisJCQl9CisJCX0sCisKKwkJYmVmb3JldW5sb2FkOiB7CisJCQlwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHsKKworCQkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArCisJCQkJLy8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LgorCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKKwkJCQkJZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJc2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCwgYnViYmxlICkgeworCQkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCisJCS8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZQorCQkvLyBzaW11bGF0ZWQgZXZlbnQgcHJldmVudHMgZGVmYXVsdCB0aGVuIHdlIGRvIHRoZSBzYW1lIG9uIHRoZSBkb25vci4KKwkJdmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAorCQkJbmV3IGpRdWVyeS5FdmVudCgpLAorCQkJZXZlbnQsCisJCQl7CisJCQkJdHlwZTogdHlwZSwKKwkJCQlpc1NpbXVsYXRlZDogdHJ1ZSwKKwkJCQlvcmlnaW5hbEV2ZW50OiB7fQorCQkJfQorCQkpOworCQlpZiAoIGJ1YmJsZSApIHsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7CisJCX0gZWxzZSB7CisJCQlqUXVlcnkuZXZlbnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApOworCQl9CisJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKKwkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCX0KKwl9Cit9OworCitqUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgeworCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgeworCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsKKwl9Cit9OworCitqUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHsKKwkvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmQKKwlpZiAoICEodGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCkgKSB7CisJCXJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7CisJfQorCisJLy8gRXZlbnQgb2JqZWN0CisJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CisJCXRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKwkJdGhpcy50eXBlID0gc3JjLnR5cGU7CisKKwkJLy8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWQKKwkJLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCisJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKKwkJCQlzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmCisJCQkJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKKwkJCQlzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlID8KKwkJCXJldHVyblRydWUgOgorCQkJcmV0dXJuRmFsc2U7CisKKwkvLyBFdmVudCB0eXBlCisJfSBlbHNlIHsKKwkJdGhpcy50eXBlID0gc3JjOworCX0KKworCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CisJaWYgKCBwcm9wcyApIHsKKwkJalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKKwl9CisKKwkvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQorCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOworCisJLy8gTWFyayBpdCBhcyBmaXhlZAorCXRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOworfTsKKworLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CisJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKKwlpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisJaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAorCisJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKworCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7CisKKwkJaWYgKCBlICYmIGUucHJldmVudERlZmF1bHQgKSB7CisJCQllLnByZXZlbnREZWZhdWx0KCk7CisJCX0KKwl9LAorCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCisJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCisJCWlmICggZSAmJiBlLnN0b3BQcm9wYWdhdGlvbiApIHsKKwkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCX0KKwl9LAorCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCisJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCisJCWlmICggZSAmJiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiApIHsKKwkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CisJCX0KKworCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOworCX0KK307CisKKy8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcworLy8gU3VwcG9ydDogQ2hyb21lIDE1KworalF1ZXJ5LmVhY2goeworCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAorCW1vdXNlbGVhdmU6ICJtb3VzZW91dCIsCisJcG9pbnRlcmVudGVyOiAicG9pbnRlcm92ZXIiLAorCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCit9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgeworCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7CisJCWRlbGVnYXRlVHlwZTogZml4LAorCQliaW5kVHlwZTogZml4LAorCisJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgeworCQkJdmFyIHJldCwKKwkJCQl0YXJnZXQgPSB0aGlzLAorCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAorCQkJCWhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajsKKworCQkJLy8gRm9yIG1vdXNlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LgorCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKKwkJCWlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7CisJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKKwkJCQlyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCQkJZXZlbnQudHlwZSA9IGZpeDsKKwkJCX0KKwkJCXJldHVybiByZXQ7CisJCX0KKwl9OworfSk7CisKKy8vIFN1cHBvcnQ6IEZpcmVmb3gsIENocm9tZSwgU2FmYXJpCisvLyBDcmVhdGUgImJ1YmJsaW5nIiBmb2N1cyBhbmQgYmx1ciBldmVudHMKK2lmICggIXN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7CisJalF1ZXJ5LmVhY2goeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CisKKwkJLy8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQKKwkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CisJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSwgdHJ1ZSApOworCQkJfTsKKworCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CisJCQlzZXR1cDogZnVuY3Rpb24oKSB7CisJCQkJdmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLAorCQkJCQlhdHRhY2hlcyA9IGRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7CisKKwkJCQlpZiAoICFhdHRhY2hlcyApIHsKKwkJCQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKwkJCQl9CisJCQkJZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApOworCQkJfSwKKwkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKKwkJCQl2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsCisJCQkJCWF0dGFjaGVzID0gZGF0YV9wcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CisKKwkJCQlpZiAoICFhdHRhY2hlcyApIHsKKwkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKKwkJCQkJZGF0YV9wcml2LnJlbW92ZSggZG9jLCBmaXggKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCWRhdGFfcHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9KTsKK30KKworalF1ZXJ5LmZuLmV4dGVuZCh7CisKKwlvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7CisJCXZhciBvcmlnRm4sIHR5cGU7CisKKwkJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCisJCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKKwkJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCisJCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7CisJCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQorCQkJCWRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yOworCQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOworCQkJfQorCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKKwkJCQl0aGlzLm9uKCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CisJCQl9CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CisJCQkvLyAoIHR5cGVzLCBmbiApCisJCQlmbiA9IHNlbGVjdG9yOworCQkJZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkOworCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkgeworCQkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCQkJCS8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApCisJCQkJZm4gPSBkYXRhOworCQkJCWRhdGEgPSB1bmRlZmluZWQ7CisJCQl9IGVsc2UgeworCQkJCS8vICggdHlwZXMsIGRhdGEsIGZuICkKKwkJCQlmbiA9IGRhdGE7CisJCQkJZGF0YSA9IHNlbGVjdG9yOworCQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOworCQkJfQorCQl9CisJCWlmICggZm4gPT09IGZhbHNlICkgeworCQkJZm4gPSByZXR1cm5GYWxzZTsKKwkJfSBlbHNlIGlmICggIWZuICkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQlpZiAoIG9uZSA9PT0gMSApIHsKKwkJCW9yaWdGbiA9IGZuOworCQkJZm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7CisJCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCisJCQkJalF1ZXJ5KCkub2ZmKCBldmVudCApOworCQkJCXJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCQkJfTsKKwkJCS8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCisJCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKKwkJfSk7CisJfSwKKwlvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgeworCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApOworCX0sCisJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKKwkJdmFyIGhhbmRsZU9iaiwgdHlwZTsKKwkJaWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7CisJCQkvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50CisJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CisJCQlqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKAorCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPyBoYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDogaGFuZGxlT2JqLm9yaWdUeXBlLAorCQkJCWhhbmRsZU9iai5zZWxlY3RvciwKKwkJCQloYW5kbGVPYmouaGFuZGxlcgorCQkJKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKKwkJCS8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCisJCQlmb3IgKCB0eXBlIGluIHR5cGVzICkgeworCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOworCQkJfQorCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJaWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICkgeworCQkJLy8gKCB0eXBlcyBbLCBmbl0gKQorCQkJZm4gPSBzZWxlY3RvcjsKKwkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOworCQl9CisJCWlmICggZm4gPT09IGZhbHNlICkgeworCQkJZm4gPSByZXR1cm5GYWxzZTsKKwkJfQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApOworCQl9KTsKKwl9LAorCisJdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOworCQl9KTsKKwl9LAorCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJdmFyIGVsZW0gPSB0aGlzWzBdOworCQlpZiAoIGVsZW0gKSB7CisJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKKwkJfQorCX0KK30pOworCisKK3ZhcgorCXJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksCisJcnRhZ05hbWUgPSAvPChbXHc6XSspLywKKwlyaHRtbCA9IC88fCYjP1x3KzsvLAorCXJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksCisJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAorCXJjaGVja2VkID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCisJcnNjcmlwdFR5cGUgPSAvXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksCisJcnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcLyguKikvLAorCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZywKKworCS8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApCisJd3JhcE1hcCA9IHsKKworCQkvLyBTdXBwb3J0OiBJRTkKKwkJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKKworCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKKwkJY29sOiBbIDIsICI8dGFibGU+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAorCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKKwkJdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCisKKwkJX2RlZmF1bHQ6IFsgMCwgIiIsICIiIF0KKwl9OworCisvLyBTdXBwb3J0OiBJRTkKK3dyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKKword3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDsKK3dyYXBNYXAudGggPSB3cmFwTWFwLnRkOworCisvLyBTdXBwb3J0OiAxLnggY29tcGF0aWJpbGl0eQorLy8gTWFuaXB1bGF0aW5nIHRhYmxlcyByZXF1aXJlcyBhIHRib2R5CitmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CisJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRhYmxlIiApICYmCisJCWpRdWVyeS5ub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgPworCisJCWVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKKwkJCWVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpICkgOgorCQllbGVtOworfQorCisvLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uCitmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgeworCWVsZW0udHlwZSA9IChlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpICE9PSBudWxsKSArICIvIiArIGVsZW0udHlwZTsKKwlyZXR1cm4gZWxlbTsKK30KK2Z1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CisJdmFyIG1hdGNoID0gcnNjcmlwdFR5cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7CisKKwlpZiAoIG1hdGNoICkgeworCQllbGVtLnR5cGUgPSBtYXRjaFsgMSBdOworCX0gZWxzZSB7CisJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIik7CisJfQorCisJcmV0dXJuIGVsZW07Cit9CisKKy8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZAorZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkgeworCXZhciBpID0gMCwKKwkJbCA9IGVsZW1zLmxlbmd0aDsKKworCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJZGF0YV9wcml2LnNldCgKKwkJCWVsZW1zWyBpIF0sICJnbG9iYWxFdmFsIiwgIXJlZkVsZW1lbnRzIHx8IGRhdGFfcHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCisJCSk7CisJfQorfQorCitmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgeworCXZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzOworCisJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgeworCQlyZXR1cm47CisJfQorCisJLy8gMS4gQ29weSBwcml2YXRlIGRhdGE6IGV2ZW50cywgaGFuZGxlcnMsIGV0Yy4KKwlpZiAoIGRhdGFfcHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKKwkJcGRhdGFPbGQgPSBkYXRhX3ByaXYuYWNjZXNzKCBzcmMgKTsKKwkJcGRhdGFDdXIgPSBkYXRhX3ByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApOworCQlldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7CisKKwkJaWYgKCBldmVudHMgKSB7CisJCQlkZWxldGUgcGRhdGFDdXIuaGFuZGxlOworCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CisKKwkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgeworCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gMi4gQ29weSB1c2VyIGRhdGEKKwlpZiAoIGRhdGFfdXNlci5oYXNEYXRhKCBzcmMgKSApIHsKKwkJdWRhdGFPbGQgPSBkYXRhX3VzZXIuYWNjZXNzKCBzcmMgKTsKKwkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKKworCQlkYXRhX3VzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOworCX0KK30KKworZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7CisJdmFyIHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPyBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgIioiICkgOgorCQkJY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsID8gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgIioiICkgOgorCQkJW107CisKKwlyZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgPworCQlqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKSA6CisJCXJldDsKK30KKworLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzCitmdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkgeworCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKKworCS8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLgorCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKKwkJZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7CisKKwkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucworCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgeworCQlkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7CisJfQorfQorCitqUXVlcnkuZXh0ZW5kKHsKKwljbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgeworCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKKwkJCWNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSwKKwkJCWluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7CisKKwkJLy8gRml4IElFIGNsb25pbmcgaXNzdWVzCisJCWlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiYKKwkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CisKKwkJCS8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yCisJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7CisJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOworCisJCQlmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKKwkJCX0KKwkJfQorCisJCS8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKKwkJaWYgKCBkYXRhQW5kRXZlbnRzICkgeworCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKwkJCQlzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApOworCQkJCWRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7CisKKwkJCQlmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJY2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTsKKwkJCX0KKwkJfQorCisJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKKwkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgInNjcmlwdCIgKTsKKwkJaWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHsKKwkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKKwkJfQorCisJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAorCQlyZXR1cm4gY2xvbmU7CisJfSwKKworCWJ1aWxkRnJhZ21lbnQ6IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uICkgeworCQl2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLAorCQkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKKwkJCW5vZGVzID0gW10sCisJCQlpID0gMCwKKwkJCWwgPSBlbGVtcy5sZW5ndGg7CisKKwkJZm9yICggOyBpIDwgbDsgaSsrICkgeworCQkJZWxlbSA9IGVsZW1zWyBpIF07CisKKwkJCWlmICggZWxlbSB8fCBlbGVtID09PSAwICkgeworCisJCQkJLy8gQWRkIG5vZGVzIGRpcmVjdGx5CisJCQkJaWYgKCBqUXVlcnkudHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKKwkJCQkJLy8gU3VwcG9ydDogUXRXZWJLaXQsIFBoYW50b21KUworCQkJCQkvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0CisJCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKKworCQkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQorCQkJCX0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7CisJCQkJCW5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKSApOworCisJCQkJLy8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzCisJCQkJfSBlbHNlIHsKKwkJCQkJdG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7CisKKwkJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgorCQkJCQl0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbICIiLCAiIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpOworCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDsKKwkJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGVsZW0ucmVwbGFjZSggcnhodG1sVGFnLCAiPCQxPjwvJDI+IiApICsgd3JhcFsgMiBdOworCisJCQkJCS8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudAorCQkJCQlqID0gd3JhcFsgMCBdOworCQkJCQl3aGlsZSAoIGotLSApIHsKKwkJCQkJCXRtcCA9IHRtcC5sYXN0Q2hpbGQ7CisJCQkJCX0KKworCQkJCQkvLyBTdXBwb3J0OiBRdFdlYktpdCwgUGhhbnRvbUpTCisJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKKwkJCQkJalF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTsKKworCQkJCQkvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcgorCQkJCQl0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkOworCisJCQkJCS8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5MikKKwkJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAorCQlmcmFnbWVudC50ZXh0Q29udGVudCA9ICIiOworCisJCWkgPSAwOworCQl3aGlsZSAoIChlbGVtID0gbm9kZXNbIGkrKyBdKSApIHsKKworCQkJLy8gIzQwODcgLSBJZiBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSwgYW5kIHRoaXMgaXMKKwkJCS8vIHRoYXQgZWxlbWVudCwgZG8gbm90IGRvIGFueXRoaW5nCisJCQlpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgIT09IC0xICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQljb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7CisKKwkJCS8vIEFwcGVuZCB0byBmcmFnbWVudAorCQkJdG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCAic2NyaXB0IiApOworCisJCQkvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5CisJCQlpZiAoIGNvbnRhaW5zICkgeworCQkJCXNldEdsb2JhbEV2YWwoIHRtcCApOworCQkJfQorCisJCQkvLyBDYXB0dXJlIGV4ZWN1dGFibGVzCisJCQlpZiAoIHNjcmlwdHMgKSB7CisJCQkJaiA9IDA7CisJCQkJd2hpbGUgKCAoZWxlbSA9IHRtcFsgaisrIF0pICkgeworCQkJCQlpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCAiIiApICkgeworCQkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gZnJhZ21lbnQ7CisJfSwKKworCWNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkgeworCQl2YXIgZGF0YSwgZWxlbSwgdHlwZSwga2V5LAorCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAorCQkJaSA9IDA7CisKKwkJZm9yICggOyAoZWxlbSA9IGVsZW1zWyBpIF0pICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKKwkJCWlmICggalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKKwkJCQlrZXkgPSBlbGVtWyBkYXRhX3ByaXYuZXhwYW5kbyBdOworCisJCQkJaWYgKCBrZXkgJiYgKGRhdGEgPSBkYXRhX3ByaXYuY2FjaGVbIGtleSBdKSApIHsKKwkJCQkJaWYgKCBkYXRhLmV2ZW50cyApIHsKKwkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CisJCQkJCQkJaWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7CisJCQkJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTsKKworCQkJCQkJCS8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWQKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICggZGF0YV9wcml2LmNhY2hlWyBrZXkgXSApIHsKKwkJCQkJCS8vIERpc2NhcmQgYW55IHJlbWFpbmluZyBgcHJpdmF0ZWAgZGF0YQorCQkJCQkJZGVsZXRlIGRhdGFfcHJpdi5jYWNoZVsga2V5IF07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvLyBEaXNjYXJkIGFueSByZW1haW5pbmcgYHVzZXJgIGRhdGEKKwkJCWRlbGV0ZSBkYXRhX3VzZXIuY2FjaGVbIGVsZW1bIGRhdGFfdXNlci5leHBhbmRvIF0gXTsKKwkJfQorCX0KK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJCXJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KKwkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKKwkJCQl0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpIHsKKwkJCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CisJCQkJCQl0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CisJCQkJCX0KKwkJCQl9KTsKKwkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKwl9LAorCisJYXBwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKKwkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CisJCQkJdGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7CisJCQl9CisJCX0pOworCX0sCisKKwlwcmVwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKKwkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CisJCQkJdGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCWJlZm9yZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgeworCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CisJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOworCQkJfQorCQl9KTsKKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKKwkJCWlmICggdGhpcy5wYXJlbnROb2RlICkgeworCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKKwkJdmFyIGVsZW0sCisJCQllbGVtcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKSA6IHRoaXMsCisJCQlpID0gMDsKKworCQlmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCWlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtICkgKTsKKwkJCX0KKworCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CisJCQkJaWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgeworCQkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKKwkJCQl9CisJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCkgeworCQl2YXIgZWxlbSwKKwkJCWkgPSAwOworCisJCWZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisKKwkJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcworCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOworCisJCQkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKKwkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKKwkJZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50czsKKwkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOworCisJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHsKKwkJCXJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CisJCX0pOworCX0sCisKKwlodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJCXZhciBlbGVtID0gdGhpc1sgMCBdIHx8IHt9LAorCQkJCWkgPSAwLAorCQkJCWwgPSB0aGlzLmxlbmd0aDsKKworCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOworCQkJfQorCisJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCisJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmCisJCQkJIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbICIiLCAiIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7CisKKwkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKKworCQkJCXRyeSB7CisJCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CisKKwkJCQkJCS8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcworCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgeworCQkJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOworCQkJCQkJCWVsZW0uaW5uZXJIVE1MID0gdmFsdWU7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQllbGVtID0gMDsKKworCQkJCS8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZAorCQkJCX0gY2F0Y2goIGUgKSB7fQorCQkJfQorCisJCQlpZiAoIGVsZW0gKSB7CisJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKKwkJCX0KKwkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKKwl9LAorCisJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkgeworCQl2YXIgYXJnID0gYXJndW1lbnRzWyAwIF07CisKKwkJLy8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50CisJCXRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CisJCQlhcmcgPSB0aGlzLnBhcmVudE5vZGU7CisKKwkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7CisKKwkJCWlmICggYXJnICkgeworCQkJCWFyZy5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKKwkJCX0KKwkJfSk7CisKKwkJLy8gRm9yY2UgcmVtb3ZhbCBpZiB0aGVyZSB3YXMgbm8gbmV3IGNvbnRlbnQgKGUuZy4sIGZyb20gZW1wdHkgYXJndW1lbnRzKQorCQlyZXR1cm4gYXJnICYmIChhcmcubGVuZ3RoIHx8IGFyZy5ub2RlVHlwZSkgPyB0aGlzIDogdGhpcy5yZW1vdmUoKTsKKwl9LAorCisJZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKKwl9LAorCisJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCBjYWxsYmFjayApIHsKKworCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCisJCWFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7CisKKwkJdmFyIGZyYWdtZW50LCBmaXJzdCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLAorCQkJaSA9IDAsCisJCQlsID0gdGhpcy5sZW5ndGgsCisJCQlzZXQgPSB0aGlzLAorCQkJaU5vQ2xvbmUgPSBsIC0gMSwKKwkJCXZhbHVlID0gYXJnc1sgMCBdLAorCQkJaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOworCisJCS8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAorCQlpZiAoIGlzRnVuY3Rpb24gfHwKKwkJCQkoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYKKwkJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpbmRleCApIHsKKwkJCQl2YXIgc2VsZiA9IHNldC5lcSggaW5kZXggKTsKKwkJCQlpZiAoIGlzRnVuY3Rpb24gKSB7CisJCQkJCWFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApOworCQkJCX0KKwkJCQlzZWxmLmRvbU1hbmlwKCBhcmdzLCBjYWxsYmFjayApOworCQkJfSk7CisJCX0KKworCQlpZiAoIGwgKSB7CisJCQlmcmFnbWVudCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIHRoaXMgKTsKKwkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKKworCQkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKKwkJCQlmcmFnbWVudCA9IGZpcnN0OworCQkJfQorCisJCQlpZiAoIGZpcnN0ICkgeworCQkJCXNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCAic2NyaXB0IiApLCBkaXNhYmxlU2NyaXB0ICk7CisJCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOworCisJCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbSBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKKwkJCQkvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLgorCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJbm9kZSA9IGZyYWdtZW50OworCisJCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CisJCQkJCQlub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7CisKKwkJCQkJCS8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb24KKwkJCQkJCWlmICggaGFzU2NyaXB0cyApIHsKKwkJCQkJCQkvLyBTdXBwb3J0OiBRdFdlYktpdAorCQkJCQkJCS8vIGpRdWVyeS5tZXJnZSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKKwkJCQkJCQlqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgInNjcmlwdCIgKSApOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJY2FsbGJhY2suY2FsbCggdGhpc1sgaSBdLCBub2RlLCBpICk7CisJCQkJfQorCisJCQkJaWYgKCBoYXNTY3JpcHRzICkgeworCQkJCQlkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50OworCisJCQkJCS8vIFJlZW5hYmxlIHNjcmlwdHMKKwkJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOworCisJCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KKwkJCQkJZm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7CisJCQkJCQlub2RlID0gc2NyaXB0c1sgaSBdOworCQkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgorCQkJCQkJCSFkYXRhX3ByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJiBqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgeworCisJCQkJCQkJaWYgKCBub2RlLnNyYyApIHsKKwkJCQkJCQkJLy8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnQKKwkJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CisJCQkJCQkJCQlqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlqUXVlcnkuZ2xvYmFsRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICkgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9Cit9KTsKKworalF1ZXJ5LmVhY2goeworCWFwcGVuZFRvOiAiYXBwZW5kIiwKKwlwcmVwZW5kVG86ICJwcmVwZW5kIiwKKwlpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAorCWluc2VydEFmdGVyOiAiYWZ0ZXIiLAorCXJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKK30sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIGVsZW1zLAorCQkJcmV0ID0gW10sCisJCQlpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCisJCQlsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDEsCisJCQlpID0gMDsKKworCQlmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkgeworCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKKwkJCWpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTsKKworCQkJLy8gU3VwcG9ydDogUXRXZWJLaXQKKwkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3MKKwkJCXB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTsKKwkJfQorCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7CisJfTsKK30pOworCisKK3ZhciBpZnJhbWUsCisJZWxlbWRpc3BsYXkgPSB7fTsKKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50CisgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudAorICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3QKKyAqLworLy8gQ2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXkKK2Z1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyApIHsKKwl2YXIgc3R5bGUsCisJCWVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSwKKworCQkvLyBnZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSBtaWdodCBiZSByZWxpYWJseSB1c2VkIG9ubHkgb24gYXR0YWNoZWQgZWxlbWVudAorCQlkaXNwbGF5ID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlICYmICggc3R5bGUgPSB3aW5kb3cuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoIGVsZW1bIDAgXSApICkgPworCisJCQkvLyBVc2Ugb2YgdGhpcyBtZXRob2QgaXMgYSB0ZW1wb3JhcnkgZml4IChtb3JlIGxpa2Ugb3B0aW1pemF0aW9uKSB1bnRpbCBzb21ldGhpbmcgYmV0dGVyIGNvbWVzIGFsb25nLAorCQkJLy8gc2luY2UgaXQgd2FzIHJlbW92ZWQgZnJvbSBzcGVjaWZpY2F0aW9uIGFuZCBzdXBwb3J0ZWQgb25seSBpbiBGRgorCQkJc3R5bGUuZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW1bIDAgXSwgImRpc3BsYXkiICk7CisKKwkvLyBXZSBkb24ndCBoYXZlIGFueSBkYXRhIHN0b3JlZCBvbiB0aGUgZWxlbWVudCwKKwkvLyBzbyB1c2UgImRldGFjaCIgbWV0aG9kIGFzIGZhc3Qgd2F5IHRvIGdldCByaWQgb2YgdGhlIGVsZW1lbnQKKwllbGVtLmRldGFjaCgpOworCisJcmV0dXJuIGRpc3BsYXk7Cit9CisKKy8qKgorICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnQKKyAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZQorICovCitmdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CisJdmFyIGRvYyA9IGRvY3VtZW50LAorCQlkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07CisKKwlpZiAoICFkaXNwbGF5ICkgeworCQlkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApOworCisJCS8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZQorCQlpZiAoIGRpc3BsYXkgPT09ICJub25lIiB8fCAhZGlzcGxheSApIHsKKworCQkJLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlCisJCQlpZnJhbWUgPSAoaWZyYW1lIHx8IGpRdWVyeSggIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iICkpLmFwcGVuZFRvKCBkb2MuZG9jdW1lbnRFbGVtZW50ICk7CisKKwkJCS8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQorCQkJZG9jID0gaWZyYW1lWyAwIF0uY29udGVudERvY3VtZW50OworCisJCQkvLyBTdXBwb3J0OiBJRQorCQkJZG9jLndyaXRlKCk7CisJCQlkb2MuY2xvc2UoKTsKKworCQkJZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTsKKwkJCWlmcmFtZS5kZXRhY2goKTsKKwkJfQorCisJCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQorCQllbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7CisJfQorCisJcmV0dXJuIGRpc3BsYXk7Cit9Cit2YXIgcm1hcmdpbiA9ICgvXm1hcmdpbi8pOworCit2YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggIl4oIiArIHBudW0gKyAiKSg/IXB4KVthLXolXSskIiwgImkiICk7CisKK3ZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHsKKwkJLy8gU3VwcG9ydDogSUU8PTExKywgRmlyZWZveDw9MzArICgjMTUwOTgsICMxNDE1MCkKKwkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCisJCS8vIEZGIG1lYW53aGlsZSB0aHJvd3Mgb24gZnJhbWUgZWxlbWVudHMgdGhyb3VnaCAiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSIKKwkJaWYgKCBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcub3BlbmVyICkgeworCQkJcmV0dXJuIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7CisJCX0KKworCQlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKKwl9OworCisKKworZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHsKKwl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAorCQlzdHlsZSA9IGVsZW0uc3R5bGU7CisKKwljb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApOworCisJLy8gU3VwcG9ydDogSUU5CisJLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgKCMxMjUzNykKKwlpZiAoIGNvbXB1dGVkICkgeworCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKKwl9CisKKwlpZiAoIGNvbXB1dGVkICkgeworCisJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKKwkJCXJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApOworCQl9CisKKwkJLy8gU3VwcG9ydDogaU9TIDwgNgorCQkvLyBBIHRyaWJ1dGUgdG8gdGhlICJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzIgorCQkvLyBpT1MgPCA2IChhdCBsZWFzdCkgcmV0dXJucyBwZXJjZW50YWdlIGZvciBhIGxhcmdlciBzZXQgb2YgdmFsdWVzLCBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzCisJCS8vIHRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzogaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3Nzb20vI3Jlc29sdmVkLXZhbHVlcworCQlpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3QoIG5hbWUgKSApIHsKKworCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcworCQkJd2lkdGggPSBzdHlsZS53aWR0aDsKKwkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CisJCQltYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoOworCisJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CisJCQlzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7CisJCQlyZXQgPSBjb21wdXRlZC53aWR0aDsKKworCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworCQkJc3R5bGUud2lkdGggPSB3aWR0aDsKKwkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CisJCQlzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoOworCQl9CisJfQorCisJcmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID8KKwkJLy8gU3VwcG9ydDogSUUKKwkJLy8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci4KKwkJcmV0ICsgIiIgOgorCQlyZXQ7Cit9CisKKworZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkgeworCS8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuCisJcmV0dXJuIHsKKwkJZ2V0OiBmdW5jdGlvbigpIHsKKwkJCWlmICggY29uZGl0aW9uRm4oKSApIHsKKwkJCQkvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWUKKwkJCQkvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuCisJCQkJZGVsZXRlIHRoaXMuZ2V0OworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uCisJCQlyZXR1cm4gKHRoaXMuZ2V0ID0gaG9va0ZuKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCX0KKwl9OworfQorCisKKyhmdW5jdGlvbigpIHsKKwl2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsCisJCWRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCWNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICksCisJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CisKKwlpZiAoICFkaXYuc3R5bGUgKSB7CisJCXJldHVybjsKKwl9CisKKwkvLyBTdXBwb3J0OiBJRTktMTErCisJLy8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KQorCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CisJZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gIiI7CisJc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09ICJjb250ZW50LWJveCI7CisKKwljb250YWluZXIuc3R5bGUuY3NzVGV4dCA9ICJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweDsiICsKKwkJInBvc2l0aW9uOmFic29sdXRlIjsKKwljb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApOworCisJLy8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0CisJLy8gc28gdGhleSdyZSBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi4KKwlmdW5jdGlvbiBjb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCkgeworCQlkaXYuc3R5bGUuY3NzVGV4dCA9CisJCQkvLyBTdXBwb3J0OiBGaXJlZm94PDI5LCBBbmRyb2lkIDIuMworCQkJLy8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nCisJCQkiLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7IiArCisJCQkiYm94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7IiArCisJCQkiYm9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiOworCQlkaXYuaW5uZXJIVE1MID0gIiI7CisJCWRvY0VsZW0uYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApOworCisJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYsIG51bGwgKTsKKwkJcGl4ZWxQb3NpdGlvblZhbCA9IGRpdlN0eWxlLnRvcCAhPT0gIjElIjsKKwkJYm94U2l6aW5nUmVsaWFibGVWYWwgPSBkaXZTdHlsZS53aWR0aCA9PT0gIjRweCI7CisKKwkJZG9jRWxlbS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CisJfQorCisJLy8gU3VwcG9ydDogbm9kZS5qcyBqc2RvbQorCS8vIERvbid0IGFzc3VtZSB0aGF0IGdldENvbXB1dGVkU3R5bGUgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgZ2xvYmFsIG9iamVjdAorCWlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7CisJCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKKwkJCXBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkgeworCisJCQkJLy8gVGhpcyB0ZXN0IGlzIGV4ZWN1dGVkIG9ubHkgb25jZSBidXQgd2Ugc3RpbGwgZG8gbWVtb2l6aW5nCisJCQkJLy8gc2luY2Ugd2UgY2FuIHVzZSB0aGUgYm94U2l6aW5nUmVsaWFibGUgcHJlLWNvbXB1dGluZy4KKwkJCQkvLyBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZSB0ZXN0IHdhcyBhbHJlYWR5IHBlcmZvcm1lZCwgdGhvdWdoLgorCQkJCWNvbXB1dGVQaXhlbFBvc2l0aW9uQW5kQm94U2l6aW5nUmVsaWFibGUoKTsKKwkJCQlyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDsKKwkJCX0sCisJCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBib3hTaXppbmdSZWxpYWJsZVZhbCA9PSBudWxsICkgeworCQkJCQljb21wdXRlUGl4ZWxQb3NpdGlvbkFuZEJveFNpemluZ1JlbGlhYmxlKCk7CisJCQkJfQorCQkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKKwkJCX0sCisJCQlyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHsKKworCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zCisJCQkJLy8gQ2hlY2sgaWYgZGl2IHdpdGggZXhwbGljaXQgd2lkdGggYW5kIG5vIG1hcmdpbi1yaWdodCBpbmNvcnJlY3RseQorCQkJCS8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gKCMzMzMzKQorCQkJCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAorCQkJCS8vIFRoaXMgc3VwcG9ydCBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIG9uY2Ugc28gbm8gbWVtb2l6aW5nIGlzIG5lZWRlZC4KKwkJCQl2YXIgcmV0LAorCQkJCQltYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICkgKTsKKworCQkJCS8vIFJlc2V0IENTUzogYm94LXNpemluZzsgZGlzcGxheTsgbWFyZ2luOyBib3JkZXI7IHBhZGRpbmcKKwkJCQltYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID0KKwkJCQkJLy8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjMKKwkJCQkJLy8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nCisJCQkJCSItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OyIgKworCQkJCQkiYm94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCI7CisJCQkJbWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOworCQkJCWRpdi5zdHlsZS53aWR0aCA9ICIxcHgiOworCQkJCWRvY0VsZW0uYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApOworCisJCQkJcmV0ID0gIXBhcnNlRmxvYXQoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBtYXJnaW5EaXYsIG51bGwgKS5tYXJnaW5SaWdodCApOworCisJCQkJZG9jRWxlbS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CisJCQkJZGl2LnJlbW92ZUNoaWxkKCBtYXJnaW5EaXYgKTsKKworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0pOworCX0KK30pKCk7CisKKworLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucy4KK2pRdWVyeS5zd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkgeworCXZhciByZXQsIG5hbWUsCisJCW9sZCA9IHt9OworCisJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCisJZm9yICggbmFtZSBpbiBvcHRpb25zICkgeworCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKwkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOworCX0KKworCXJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7CisKKwkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKKwlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CisJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOworCX0KKworCXJldHVybiByZXQ7Cit9OworCisKK3ZhcgorCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUgZXhjZXB0ICJ0YWJsZSIsICJ0YWJsZS1jZWxsIiwgb3IgInRhYmxlLWNhcHRpb24iCisJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CisJcmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLAorCXJudW1zcGxpdCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoLiopJCIsICJpIiApLAorCXJyZWxOdW0gPSBuZXcgUmVnRXhwKCAiXihbKy1dKT0oIiArIHBudW0gKyAiKSIsICJpIiApLAorCisJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCisJY3NzTm9ybWFsVHJhbnNmb3JtID0geworCQlsZXR0ZXJTcGFjaW5nOiAiMCIsCisJCWZvbnRXZWlnaHQ6ICI0MDAiCisJfSwKKworCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk8iLCAiTW96IiwgIm1zIiBdOworCisvLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5CitmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG5hbWUgKSB7CisKKwkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAorCWlmICggbmFtZSBpbiBzdHlsZSApIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcworCXZhciBjYXBOYW1lID0gbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwKKwkJb3JpZ05hbWUgPSBuYW1lLAorCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOworCisJd2hpbGUgKCBpLS0gKSB7CisJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKKwkJaWYgKCBuYW1lIGluIHN0eWxlICkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKwl9CisKKwlyZXR1cm4gb3JpZ05hbWU7Cit9CisKK2Z1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7CisJdmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTsKKwlyZXR1cm4gbWF0Y2hlcyA/CisJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcworCQlNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMiBdIHx8ICJweCIgKSA6CisJCXZhbHVlOworfQorCitmdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7CisJdmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICkgPworCQkvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG1lYXN1cmVtZW50LCBhdm9pZCBhdWdtZW50YXRpb24KKwkJNCA6CisJCS8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXMKKwkJbmFtZSA9PT0gIndpZHRoIiA/IDEgOiAwLAorCisJCXZhbCA9IDA7CisKKwlmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7CisJCS8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXQKKwkJaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIgKSB7CisJCQl2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CisJCX0KKworCQlpZiAoIGlzQm9yZGVyQm94ICkgeworCQkJLy8gYm9yZGVyLWJveCBpbmNsdWRlcyBwYWRkaW5nLCBzbyByZW1vdmUgaXQgaWYgd2Ugd2FudCBjb250ZW50CisJCQlpZiAoIGV4dHJhID09PSAiY29udGVudCIgKSB7CisJCQkJdmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKKwkJCX0KKworCQkJLy8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXIKKwkJCWlmICggZXh0cmEgIT09ICJtYXJnaW4iICkgeworCQkJCXZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZworCQkJdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKKworCQkJLy8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlcgorCQkJaWYgKCBleHRyYSAhPT0gInBhZGRpbmciICkgeworCQkJCXZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitmdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHsKKworCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZhbHVlCisJdmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLAorCQl2YWwgPSBuYW1lID09PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0LAorCQlzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSwKKwkJaXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2UsIHN0eWxlcyApID09PSAiYm9yZGVyLWJveCI7CisKKwkvLyBTb21lIG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWQKKwkvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODUKKwkvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2NjgKKwlpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkgeworCQkvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3NhcnkKKwkJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTsKKwkJaWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkgeworCQkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdOworCQl9CisKKwkJLy8gQ29tcHV0ZWQgdW5pdCBpcyBub3QgcGl4ZWxzLiBTdG9wIGhlcmUgYW5kIHJldHVybi4KKwkJaWYgKCBybnVtbm9ucHgudGVzdCh2YWwpICkgeworCQkJcmV0dXJuIHZhbDsKKwkJfQorCisJCS8vIENoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzCisJCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKKwkJdmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmCisJCQkoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApOworCisJCS8vIE5vcm1hbGl6ZSAiIiwgYXV0bywgYW5kIHByZXBhcmUgZm9yIGV4dHJhCisJCXZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7CisJfQorCisJLy8gVXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXMKKwlyZXR1cm4gKCB2YWwgKworCQlhdWdtZW50V2lkdGhPckhlaWdodCgKKwkJCWVsZW0sCisJCQluYW1lLAorCQkJZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICksCisJCQl2YWx1ZUlzQm9yZGVyQm94LAorCQkJc3R5bGVzCisJCSkKKwkpICsgInB4IjsKK30KKworZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkgeworCXZhciBkaXNwbGF5LCBlbGVtLCBoaWRkZW4sCisJCXZhbHVlcyA9IFtdLAorCQlpbmRleCA9IDAsCisJCWxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsKKworCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CisJCWVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTsKKwkJaWYgKCAhZWxlbS5zdHlsZSApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdmFsdWVzWyBpbmRleCBdID0gZGF0YV9wcml2LmdldCggZWxlbSwgIm9sZGRpc3BsYXkiICk7CisJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CisJCWlmICggc2hvdyApIHsKKwkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKKwkJCS8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3QKKwkJCWlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSAibm9uZSIgKSB7CisJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CisJCQl9CisKKwkJCS8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUKKwkJCS8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzCisJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CisJCQlpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHsKKwkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhX3ByaXYuYWNjZXNzKCBlbGVtLCAib2xkZGlzcGxheSIsIGRlZmF1bHREaXNwbGF5KGVsZW0ubm9kZU5hbWUpICk7CisJCQl9CisJCX0gZWxzZSB7CisJCQloaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApOworCisJCQlpZiAoIGRpc3BsYXkgIT09ICJub25lIiB8fCAhaGlkZGVuICkgeworCQkJCWRhdGFfcHJpdi5zZXQoIGVsZW0sICJvbGRkaXNwbGF5IiwgaGlkZGVuID8gZGlzcGxheSA6IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCS8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cKKwlmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgeworCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CisJCWlmICggIWVsZW0uc3R5bGUgKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoICFzaG93IHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIm5vbmUiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgKSB7CisJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gdmFsdWVzWyBpbmRleCBdIHx8ICIiIDogIm5vbmUiOworCQl9CisJfQorCisJcmV0dXJuIGVsZW1lbnRzOworfQorCitqUXVlcnkuZXh0ZW5kKHsKKworCS8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdAorCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQorCWNzc0hvb2tzOiB7CisJCW9wYWNpdHk6IHsKKwkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgeworCQkJCWlmICggY29tcHV0ZWQgKSB7CisKKwkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKKwkJCQkJdmFyIHJldCA9IGN1ckNTUyggZWxlbSwgIm9wYWNpdHkiICk7CisJCQkJCXJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OworCQkJCX0KKwkJCX0KKwkJfQorCX0sCisKKwkvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCAicHgiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXMKKwljc3NOdW1iZXI6IHsKKwkJImNvbHVtbkNvdW50IjogdHJ1ZSwKKwkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKKwkJImZsZXhHcm93IjogdHJ1ZSwKKwkJImZsZXhTaHJpbmsiOiB0cnVlLAorCQkiZm9udFdlaWdodCI6IHRydWUsCisJCSJsaW5lSGVpZ2h0IjogdHJ1ZSwKKwkJIm9wYWNpdHkiOiB0cnVlLAorCQkib3JkZXIiOiB0cnVlLAorCQkib3JwaGFucyI6IHRydWUsCisJCSJ3aWRvd3MiOiB0cnVlLAorCQkiekluZGV4IjogdHJ1ZSwKKwkJInpvb20iOiB0cnVlCisJfSwKKworCS8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmUKKwkvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlCisJY3NzUHJvcHM6IHsKKwkJImZsb2F0IjogImNzc0Zsb2F0IgorCX0sCisKKwkvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZQorCXN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkgeworCisJCS8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQorCQl2YXIgcmV0LCB0eXBlLCBob29rcywKKwkJCW9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAorCQkJc3R5bGUgPSBlbGVtLnN0eWxlOworCisJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9yaWdOYW1lICkgKTsKKworCQkvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvbgorCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKKworCQkvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWUKKwkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKKworCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCisJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgeworCQkJCXZhbHVlID0gKCByZXRbMV0gKyAxICkgKiByZXRbMl0gKyBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICkgKTsKKwkJCQkvLyBGaXhlcyBidWcgIzkyMzcKKwkJCQl0eXBlID0gIm51bWJlciI7CisJCQl9CisKKwkJCS8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpCisJCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gSWYgYSBudW1iZXIsIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKQorCQkJaWYgKCB0eXBlID09PSAibnVtYmVyIiAmJiAhalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSApIHsKKwkJCQl2YWx1ZSArPSAicHgiOworCQkJfQorCisJCQkvLyBTdXBwb3J0OiBJRTktMTErCisJCQkvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzCisJCQlpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gIiIgJiYgbmFtZS5pbmRleE9mKCAiYmFja2dyb3VuZCIgKSA9PT0gMCApIHsKKwkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOworCQkJfQorCisJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKKwkJCWlmICggIWhvb2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8ICh2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJc3R5bGVbIG5hbWUgXSA9IHZhbHVlOworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKKwkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJLy8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3QKKwkJCXJldHVybiBzdHlsZVsgbmFtZSBdOworCQl9CisJfSwKKworCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7CisJCXZhciB2YWwsIG51bSwgaG9va3MsCisJCQlvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKKworCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKKwkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBlbGVtLnN0eWxlLCBvcmlnTmFtZSApICk7CisKKwkJLy8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZQorCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKKworCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQorCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICkgeworCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOworCQl9CisKKwkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKKwkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKKwkJCXZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7CisJCX0KKworCQkvLyBDb252ZXJ0ICJub3JtYWwiIHRvIGNvbXB1dGVkIHZhbHVlCisJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKKwkJCXZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdOworCQl9CisKKwkJLy8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljCisJCWlmICggZXh0cmEgPT09ICIiIHx8IGV4dHJhICkgeworCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CisJCQlyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgalF1ZXJ5LmlzTnVtZXJpYyggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKKwkJfQorCQlyZXR1cm4gdmFsOworCX0KK30pOworCitqUXVlcnkuZWFjaChbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgeworCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0geworCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7CisJCQlpZiAoIGNvbXB1dGVkICkgeworCisJCQkJLy8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtCisJCQkJLy8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXQKKwkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYgZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCA/CisJCQkJCWpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKKwkJCQkJCXJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOworCQkJCQl9KSA6CisJCQkJCWdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7CisJCQl9CisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgeworCQkJdmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApOworCQkJcmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgPworCQkJCWF1Z21lbnRXaWR0aE9ySGVpZ2h0KAorCQkJCQllbGVtLAorCQkJCQluYW1lLAorCQkJCQlleHRyYSwKKwkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gImJvcmRlci1ib3giLAorCQkJCQlzdHlsZXMKKwkJCQkpIDogMAorCQkJKTsKKwkJfQorCX07Cit9KTsKKworLy8gU3VwcG9ydDogQW5kcm9pZCAyLjMKK2pRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0LAorCWZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKwkJaWYgKCBjb21wdXRlZCApIHsKKwkJCXJldHVybiBqUXVlcnkuc3dhcCggZWxlbSwgeyAiZGlzcGxheSI6ICJpbmxpbmUtYmxvY2siIH0sCisJCQkJY3VyQ1NTLCBbIGVsZW0sICJtYXJnaW5SaWdodCIgXSApOworCQl9CisJfQorKTsKKworLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllcworalF1ZXJ5LmVhY2goeworCW1hcmdpbjogIiIsCisJcGFkZGluZzogIiIsCisJYm9yZGVyOiAiV2lkdGgiCit9LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7CisJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKKwkJZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCQl2YXIgaSA9IDAsCisJCQkJZXhwYW5kZWQgPSB7fSwKKworCQkJCS8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZworCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCIgIikgOiBbIHZhbHVlIF07CisKKwkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKKwkJCQlleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9CisJCQkJCXBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTsKKwkJCX0KKworCQkJcmV0dXJuIGV4cGFuZGVkOworCQl9CisJfTsKKworCWlmICggIXJtYXJnaW4udGVzdCggcHJlZml4ICkgKSB7CisJCWpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7CisJfQorfSk7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgeworCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCQl2YXIgc3R5bGVzLCBsZW4sCisJCQkJbWFwID0ge30sCisJCQkJaSA9IDA7CisKKwkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHsKKwkJCQlzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTsKKwkJCQlsZW4gPSBuYW1lLmxlbmd0aDsKKworCQkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQkJCQltYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7CisJCQkJfQorCisJCQkJcmV0dXJuIG1hcDsKKwkJCX0KKworCQkJcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPworCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CisJCQkJalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApOworCQl9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKwl9LAorCXNob3c6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTsKKwl9LAorCWhpZGU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTsKKwl9LAorCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgeworCQlpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gImJvb2xlYW4iICkgeworCQkJcmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTsKKwkJfQorCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkuc2hvdygpOworCQkJfSBlbHNlIHsKKwkJCQlqUXVlcnkoIHRoaXMgKS5oaWRlKCk7CisJCQl9CisJCX0pOworCX0KK30pOworCisKK2Z1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHsKKwlyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOworfQoralF1ZXJ5LlR3ZWVuID0gVHdlZW47CisKK1R3ZWVuLnByb3RvdHlwZSA9IHsKKwljb25zdHJ1Y3RvcjogVHdlZW4sCisJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgeworCQl0aGlzLmVsZW0gPSBlbGVtOworCQl0aGlzLnByb3AgPSBwcm9wOworCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCAic3dpbmciOworCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworCQl0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpOworCQl0aGlzLmVuZCA9IGVuZDsKKwkJdGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOworCX0sCisJY3VyOiBmdW5jdGlvbigpIHsKKwkJdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKKworCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KKwkJCWhvb2tzLmdldCggdGhpcyApIDoKKwkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTsKKwl9LAorCXJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7CisJCXZhciBlYXNlZCwKKwkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKKworCQlpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHsKKwkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAorCQkJCXBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvbgorCQkJKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50OworCQl9CisJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKKworCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkgeworCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOworCQl9CisKKwkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CisJCQlob29rcy5zZXQoIHRoaXMgKTsKKwkJfSBlbHNlIHsKKwkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9Cit9OworCitUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CisKK1R3ZWVuLnByb3BIb29rcyA9IHsKKwlfZGVmYXVsdDogeworCQlnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKKwkJCXZhciByZXN1bHQ7CisKKwkJCWlmICggdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYKKwkJCQkoIXR3ZWVuLmVsZW0uc3R5bGUgfHwgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwpICkgeworCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CisJCQl9CisKKwkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQorCQkJLy8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy4KKwkJCS8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyAiMTBweCIgYXJlIHBhcnNlZCB0byBGbG9hdDsKKwkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgorCQkJcmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgIiIgKTsKKwkJCS8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgImF1dG8iIGFyZSBjb252ZXJ0ZWQgdG8gMC4KKwkJCXJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gImF1dG8iID8gMCA6IHJlc3VsdDsKKwkJfSwKKwkJc2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7CisJCQkvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC4KKwkJCS8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS4KKwkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCisJCQlpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7CisJCQkJalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTsKKwkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0uc3R5bGUgJiYgKCB0d2Vlbi5lbGVtLnN0eWxlWyBqUXVlcnkuY3NzUHJvcHNbIHR3ZWVuLnByb3AgXSBdICE9IG51bGwgfHwgalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKKwkJCQlqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTsKKwkJCX0gZWxzZSB7CisJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OworCQkJfQorCQl9CisJfQorfTsKKworLy8gU3VwcG9ydDogSUU5CisvLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKK1R3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKKwlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKKwkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHsKKwkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKKwkJfQorCX0KK307CisKK2pRdWVyeS5lYXNpbmcgPSB7CisJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKKwkJcmV0dXJuIHA7CisJfSwKKwlzd2luZzogZnVuY3Rpb24oIHAgKSB7CisJCXJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7CisJfQorfTsKKworalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CisKKy8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50CitqUXVlcnkuZnguc3RlcCA9IHt9OworCisKKworCit2YXIKKwlmeE5vdywgdGltZXJJZCwKKwlyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLywKKwlyZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/OihbKy1dKT18KSgiICsgcG51bSArICIpKFthLXolXSopJCIsICJpIiApLAorCXJydW4gPSAvcXVldWVIb29rcyQvLAorCWFuaW1hdGlvblByZWZpbHRlcnMgPSBbIGRlZmF1bHRQcmVmaWx0ZXIgXSwKKwl0d2VlbmVycyA9IHsKKwkJIioiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHsKKwkJCXZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksCisJCQkJdGFyZ2V0ID0gdHdlZW4uY3VyKCksCisJCQkJcGFydHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSwKKwkJCQl1bml0ID0gcGFydHMgJiYgcGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAorCisJCQkJLy8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXMKKwkJCQlzdGFydCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09ICJweCIgJiYgK3RhcmdldCApICYmCisJCQkJCXJmeG51bS5leGVjKCBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCBwcm9wICkgKSwKKwkJCQlzY2FsZSA9IDEsCisJCQkJbWF4SXRlcmF0aW9ucyA9IDIwOworCisJCQlpZiAoIHN0YXJ0ICYmIHN0YXJ0WyAzIF0gIT09IHVuaXQgKSB7CisJCQkJLy8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzcworCQkJCXVuaXQgPSB1bml0IHx8IHN0YXJ0WyAzIF07CisKKwkJCQkvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uCisJCQkJcGFydHMgPSBwYXJ0cyB8fCBbXTsKKworCQkJCS8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50CisJCQkJc3RhcnQgPSArdGFyZ2V0IHx8IDE7CisKKwkJCQlkbyB7CisJCQkJCS8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqLgorCQkJCQkvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvdworCQkJCQlzY2FsZSA9IHNjYWxlIHx8ICIuNSI7CisKKwkJCQkJLy8gQWRqdXN0IGFuZCBhcHBseQorCQkJCQlzdGFydCA9IHN0YXJ0IC8gc2NhbGU7CisJCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7CisKKwkJCQkvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKSwKKwkJCQkvLyBicmVhayB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoCisJCQkJfSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7CisJCQl9CisKKwkJCS8vIFVwZGF0ZSB0d2VlbiBwcm9wZXJ0aWVzCisJCQlpZiAoIHBhcnRzICkgeworCQkJCXN0YXJ0ID0gdHdlZW4uc3RhcnQgPSArc3RhcnQgfHwgK3RhcmdldCB8fCAwOworCQkJCXR3ZWVuLnVuaXQgPSB1bml0OworCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgorCQkJCXR3ZWVuLmVuZCA9IHBhcnRzWyAxIF0gPworCQkJCQlzdGFydCArICggcGFydHNbIDEgXSArIDEgKSAqIHBhcnRzWyAyIF0gOgorCQkJCQkrcGFydHNbIDIgXTsKKwkJCX0KKworCQkJcmV0dXJuIHR3ZWVuOworCQl9IF0KKwl9OworCisvLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5CitmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKKwlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworCQlmeE5vdyA9IHVuZGVmaW5lZDsKKwl9KTsKKwlyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOworfQorCisvLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgorZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHsKKwl2YXIgd2hpY2gsCisJCWkgPSAwLAorCQlhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07CisKKwkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCisJLy8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHQKKwlpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDsKKwlmb3IgKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkgeworCQl3aGljaCA9IGNzc0V4cGFuZFsgaSBdOworCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOworCX0KKworCWlmICggaW5jbHVkZVdpZHRoICkgeworCQlhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlOworCX0KKworCXJldHVybiBhdHRyczsKK30KKworZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7CisJdmFyIHR3ZWVuLAorCQljb2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgIioiIF0gKSwKKwkJaW5kZXggPSAwLAorCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKKwlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgeworCQlpZiAoICh0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApKSApIHsKKworCQkJLy8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHkKKwkJCXJldHVybiB0d2VlbjsKKwkJfQorCX0KK30KKworZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7CisJLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqLworCXZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsIGRpc3BsYXksIGNoZWNrRGlzcGxheSwKKwkJYW5pbSA9IHRoaXMsCisJCW9yaWcgPSB7fSwKKwkJc3R5bGUgPSBlbGVtLnN0eWxlLAorCQloaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksCisJCWRhdGFTaG93ID0gZGF0YV9wcml2LmdldCggZWxlbSwgImZ4c2hvdyIgKTsKKworCS8vIEhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXMKKwlpZiAoICFvcHRzLnF1ZXVlICkgeworCQlob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiApOworCQlpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7CisJCQlob29rcy51bnF1ZXVlZCA9IDA7CisJCQlvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKKwkJCWhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHsKKwkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKKwkJCQkJb2xkZmlyZSgpOworCQkJCX0KKwkJCX07CisJCX0KKwkJaG9va3MudW5xdWV1ZWQrKzsKKworCQlhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKKwkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCisJCQlhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKKwkJCQlob29rcy51bnF1ZXVlZC0tOworCQkJCWlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgImZ4IiApLmxlbmd0aCApIHsKKwkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOworCQkJCX0KKwkJCX0pOworCQl9KTsKKwl9CisKKwkvLyBIZWlnaHQvd2lkdGggb3ZlcmZsb3cgcGFzcworCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoICJoZWlnaHQiIGluIHByb3BzIHx8ICJ3aWR0aCIgaW4gcHJvcHMgKSApIHsKKwkJLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CisJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUU5LTEwIGRvIG5vdAorCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKKwkJLy8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWUKKwkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CisKKwkJLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gaW5saW5lLWJsb2NrIGZvciBoZWlnaHQvd2lkdGgKKwkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZAorCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CisKKwkJLy8gVGVzdCBkZWZhdWx0IGRpc3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgIm5vbmUiCisJCWNoZWNrRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/CisJCQlkYXRhX3ByaXYuZ2V0KCBlbGVtLCAib2xkZGlzcGxheSIgKSB8fCBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheTsKKworCQlpZiAoIGNoZWNrRGlzcGxheSA9PT0gImlubGluZSIgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImZsb2F0IiApID09PSAibm9uZSIgKSB7CisJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CisJCX0KKwl9CisKKwlpZiAoIG9wdHMub3ZlcmZsb3cgKSB7CisJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisJCWFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgeworCQkJc3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07CisJCQlzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07CisJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CisJCX0pOworCX0KKworCS8vIHNob3cvaGlkZSBwYXNzCisJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKKwkJdmFsdWUgPSBwcm9wc1sgcHJvcCBdOworCQlpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7CisJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKKwkJCXRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRvZ2dsZSI7CisJCQlpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/ICJoaWRlIiA6ICJzaG93IiApICkgeworCisJCQkJLy8gSWYgdGhlcmUgaXMgZGF0YVNob3cgbGVmdCBvdmVyIGZyb20gYSBzdG9wcGVkIGhpZGUgb3Igc2hvdyBhbmQgd2UgYXJlIGdvaW5nIHRvIHByb2NlZWQgd2l0aCBzaG93LCB3ZSBzaG91bGQgcHJldGVuZCB0byBiZSBoaWRkZW4KKwkJCQlpZiAoIHZhbHVlID09PSAic2hvdyIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkgeworCQkJCQloaWRkZW4gPSB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CisKKwkJLy8gQW55IG5vbi1meCB2YWx1ZSBzdG9wcyB1cyBmcm9tIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZQorCQl9IGVsc2UgeworCQkJZGlzcGxheSA9IHVuZGVmaW5lZDsKKwkJfQorCX0KKworCWlmICggIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7CisJCWlmICggZGF0YVNob3cgKSB7CisJCQlpZiAoICJoaWRkZW4iIGluIGRhdGFTaG93ICkgeworCQkJCWhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRhdGFTaG93ID0gZGF0YV9wcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHt9ICk7CisJCX0KKworCQkvLyBTdG9yZSBzdGF0ZSBpZiBpdHMgdG9nZ2xlIC0gZW5hYmxlcyAuc3RvcCgpLnRvZ2dsZSgpIHRvICJyZXZlcnNlIgorCQlpZiAoIHRvZ2dsZSApIHsKKwkJCWRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47CisJCX0KKwkJaWYgKCBoaWRkZW4gKSB7CisJCQlqUXVlcnkoIGVsZW0gKS5zaG93KCk7CisJCX0gZWxzZSB7CisJCQlhbmltLmRvbmUoZnVuY3Rpb24oKSB7CisJCQkJalF1ZXJ5KCBlbGVtICkuaGlkZSgpOworCQkJfSk7CisJCX0KKwkJYW5pbS5kb25lKGZ1bmN0aW9uKCkgeworCQkJdmFyIHByb3A7CisKKwkJCWRhdGFfcHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CisJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CisJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKKwkJCX0KKwkJfSk7CisJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKKwkJCXR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CisKKwkJCWlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkgeworCQkJCWRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDsKKwkJCQlpZiAoIGhpZGRlbiApIHsKKwkJCQkJdHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7CisJCQkJCXR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVpZ2h0IiA/IDEgOiAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJLy8gSWYgdGhpcyBpcyBhIG5vb3AgbGlrZSAuaGlkZSgpLmhpZGUoKSwgcmVzdG9yZSBhbiBvdmVyd3JpdHRlbiBkaXNwbGF5IHZhbHVlCisJfSBlbHNlIGlmICggKGRpc3BsYXkgPT09ICJub25lIiA/IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5KSA9PT0gImlubGluZSIgKSB7CisJCXN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5OworCX0KK30KKworZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7CisJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKKworCS8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzcworCWZvciAoIGluZGV4IGluIHByb3BzICkgeworCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXggKTsKKwkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOworCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdOworCQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgeworCQkJZWFzaW5nID0gdmFsdWVbIDEgXTsKKwkJCXZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdOworCQl9CisKKwkJaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKKwkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKKwkJCWRlbGV0ZSBwcm9wc1sgaW5kZXggXTsKKwkJfQorCisJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CisJCWlmICggaG9va3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7CisJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKKwkJCWRlbGV0ZSBwcm9wc1sgbmFtZSBdOworCisJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCisJCQkvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0ICJuYW1lIgorCQkJZm9yICggaW5kZXggaW4gdmFsdWUgKSB7CisJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgeworCQkJCQlwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdOworCQkJCQlzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKKwkJfQorCX0KK30KKworZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkgeworCXZhciByZXN1bHQsCisJCXN0b3BwZWQsCisJCWluZGV4ID0gMCwKKwkJbGVuZ3RoID0gYW5pbWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCisJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKKwkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgorCQkJZGVsZXRlIHRpY2suZWxlbTsKKwkJfSksCisJCXRpY2sgPSBmdW5jdGlvbigpIHsKKwkJCWlmICggc3RvcHBlZCApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAorCQkJCXJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSwKKwkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDIuMworCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKKwkJCQl0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsCisJCQkJcGVyY2VudCA9IDEgLSB0ZW1wLAorCQkJCWluZGV4ID0gMCwKKwkJCQlsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDsKKworCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisJCQkJYW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTsKKwkJCX0KKworCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdKTsKKworCQkJaWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7CisJCQkJcmV0dXJuIHJlbWFpbmluZzsKKwkJCX0gZWxzZSB7CisJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0sCisJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoeworCQkJZWxlbTogZWxlbSwKKwkJCXByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLAorCQkJb3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksCisJCQlvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCisJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCisJCQlzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCisJCQlkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiwKKwkJCXR3ZWVuczogW10sCisJCQljcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHsKKwkJCQl2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsCisJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CisJCQkJYW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApOworCQkJCXJldHVybiB0d2VlbjsKKwkJCX0sCisJCQlzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHsKKwkJCQl2YXIgaW5kZXggPSAwLAorCQkJCQkvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnMKKwkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CisJCQkJCWxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7CisJCQkJaWYgKCBzdG9wcGVkICkgeworCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9CisJCQkJc3RvcHBlZCA9IHRydWU7CisJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisJCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7CisJCQkJfQorCisJCQkJLy8gUmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZTsgb3RoZXJ3aXNlLCByZWplY3QKKwkJCQlpZiAoIGdvdG9FbmQgKSB7CisJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0KKwkJfSksCisJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOworCisJcHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTsKKworCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgeworCQlyZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7CisJCWlmICggcmVzdWx0ICkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKworCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CisKKwlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgeworCQlhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsKKwl9CisKKwlqUXVlcnkuZngudGltZXIoCisJCWpRdWVyeS5leHRlbmQoIHRpY2ssIHsKKwkJCWVsZW06IGVsZW0sCisJCQlhbmltOiBhbmltYXRpb24sCisJCQlxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWUKKwkJfSkKKwkpOworCisJLy8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKKwlyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCisJCS5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApCisJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKKwkJLmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7Cit9CisKK2pRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHsKKworCXR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7CisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7CisJCQljYWxsYmFjayA9IHByb3BzOworCQkJcHJvcHMgPSBbICIqIiBdOworCQl9IGVsc2UgeworCQkJcHJvcHMgPSBwcm9wcy5zcGxpdCgiICIpOworCQl9CisKKwkJdmFyIHByb3AsCisJCQlpbmRleCA9IDAsCisJCQlsZW5ndGggPSBwcm9wcy5sZW5ndGg7CisKKwkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CisJCQlwcm9wID0gcHJvcHNbIGluZGV4IF07CisJCQl0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3AgXSB8fCBbXTsKKwkJCXR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsKKwkJfQorCX0sCisKKwlwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHsKKwkJaWYgKCBwcmVwZW5kICkgeworCQkJYW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOworCQl9IGVsc2UgeworCQkJYW5pbWF0aW9uUHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApOworCQl9CisJfQorfSk7CisKK2pRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHsKKwl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogeworCQljb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAorCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCisJCWR1cmF0aW9uOiBzcGVlZCwKKwkJZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCisJfTsKKworCW9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgorCQlvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworCS8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKKwlpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKKwkJb3B0LnF1ZXVlID0gImZ4IjsKKwl9CisKKwkvLyBRdWV1ZWluZworCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CisKKwlvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgeworCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CisJCX0KKworCQlpZiAoIG9wdC5xdWV1ZSApIHsKKwkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTsKKwkJfQorCX07CisKKwlyZXR1cm4gb3B0OworfTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgeworCisJCS8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMAorCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCAib3BhY2l0eSIsIDAgKS5zaG93KCkKKworCQkJLy8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkCisJCQkuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisJfSwKKwlhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksCisJCQlvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksCisJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgeworCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CisJCQkJdmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOworCisJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CisJCQkJaWYgKCBlbXB0eSB8fCBkYXRhX3ByaXYuZ2V0KCB0aGlzLCAiZmluaXNoIiApICkgeworCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKKwkJCQl9CisJCQl9OworCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CisKKwkJcmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgPworCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKKwkJCXRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTsKKwl9LAorCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgeworCQl2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkgeworCQkJdmFyIHN0b3AgPSBob29rcy5zdG9wOworCQkJZGVsZXRlIGhvb2tzLnN0b3A7CisJCQlzdG9wKCBnb3RvRW5kICk7CisJCX07CisKKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CisJCQlnb3RvRW5kID0gY2xlYXJRdWV1ZTsKKwkJCWNsZWFyUXVldWUgPSB0eXBlOworCQkJdHlwZSA9IHVuZGVmaW5lZDsKKwkJfQorCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CisJCQl0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJdmFyIGRlcXVldWUgPSB0cnVlLAorCQkJCWluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyAicXVldWVIb29rcyIsCisJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKKwkJCQlkYXRhID0gZGF0YV9wcml2LmdldCggdGhpcyApOworCisJCQlpZiAoIGluZGV4ICkgeworCQkJCWlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7CisJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKKwkJCQkJaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7CisJCQkJCQlzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJZm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKwkJCQlpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHsKKwkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApOworCQkJCQlkZXF1ZXVlID0gZmFsc2U7CisJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CisJCQkJfQorCQkJfQorCisJCQkvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLgorCQkJLy8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaAorCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgorCQkJaWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkgeworCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CisJCQl9CisJCX0pOworCX0sCisJZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHsKKwkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKKwkJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CisJCX0KKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCXZhciBpbmRleCwKKwkJCQlkYXRhID0gZGF0YV9wcml2LmdldCggdGhpcyApLAorCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKKwkJCQlob29rcyA9IGRhdGFbIHR5cGUgKyAicXVldWVIb29rcyIgXSwKKwkJCQl0aW1lcnMgPSBqUXVlcnkudGltZXJzLAorCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKKworCQkJLy8gRW5hYmxlIGZpbmlzaGluZyBmbGFnIG9uIHByaXZhdGUgZGF0YQorCQkJZGF0YS5maW5pc2ggPSB0cnVlOworCisJCQkvLyBFbXB0eSB0aGUgcXVldWUgZmlyc3QKKwkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKKworCQkJaWYgKCBob29rcyAmJiBob29rcy5zdG9wICkgeworCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOworCQkJfQorCisJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQorCQkJZm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKKwkJCQlpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHsKKwkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOworCQkJCQl0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApOworCQkJCX0KKwkJCX0KKworCQkJLy8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW0KKwkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CisJCQkJaWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7CisJCQkJCXF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7CisJCQkJfQorCQkJfQorCisJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZworCQkJZGVsZXRlIGRhdGEuZmluaXNoOworCQl9KTsKKwl9Cit9KTsKKworalF1ZXJ5LmVhY2goWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJdmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CisJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KKwkJCWNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6CisJCQl0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisJfTsKK30pOworCisvLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zCitqUXVlcnkuZWFjaCh7CisJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIpLAorCXNsaWRlVXA6IGdlbkZ4KCJoaWRlIiksCisJc2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiKSwKKwlmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCisJZmFkZU91dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKKwlmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6ICJ0b2dnbGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CisJfTsKK30pOworCitqUXVlcnkudGltZXJzID0gW107CitqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgeworCXZhciB0aW1lciwKKwkJaSA9IDAsCisJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CisKKwlmeE5vdyA9IGpRdWVyeS5ub3coKTsKKworCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKKwkJdGltZXIgPSB0aW1lcnNbIGkgXTsKKwkJLy8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkCisJCWlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkgeworCQkJdGltZXJzLnNwbGljZSggaS0tLCAxICk7CisJCX0KKwl9CisKKwlpZiAoICF0aW1lcnMubGVuZ3RoICkgeworCQlqUXVlcnkuZnguc3RvcCgpOworCX0KKwlmeE5vdyA9IHVuZGVmaW5lZDsKK307CisKK2pRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKKwlqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7CisJaWYgKCB0aW1lcigpICkgeworCQlqUXVlcnkuZnguc3RhcnQoKTsKKwl9IGVsc2UgeworCQlqUXVlcnkudGltZXJzLnBvcCgpOworCX0KK307CisKK2pRdWVyeS5meC5pbnRlcnZhbCA9IDEzOworCitqUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHsKKwlpZiAoICF0aW1lcklkICkgeworCQl0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTsKKwl9Cit9OworCitqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgeworCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKwl0aW1lcklkID0gbnVsbDsKK307CisKK2pRdWVyeS5meC5zcGVlZHMgPSB7CisJc2xvdzogNjAwLAorCWZhc3Q6IDIwMCwKKwkvLyBEZWZhdWx0IHNwZWVkCisJX2RlZmF1bHQ6IDQwMAorfTsKKworCisvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCisvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCitqUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHsKKwl0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lOworCXR5cGUgPSB0eXBlIHx8ICJmeCI7CisKKwlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkgeworCQl2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTsKKwkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgeworCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CisJCX07CisJfSk7Cit9OworCisKKyhmdW5jdGlvbigpIHsKKwl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICksCisJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCisJCW9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggIm9wdGlvbiIgKSApOworCisJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CisKKwkvLyBTdXBwb3J0OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yKworCS8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlICJvbiIKKwlzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CisKKwkvLyBTdXBwb3J0OiBJRTw9MTErCisJLy8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3QKKwlzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkOworCisJLy8gU3VwcG9ydDogQW5kcm9pZDw9Mi4zCisJLy8gT3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmUgaW5jb3JyZWN0bHkgbWFya2VkIGFzIGRpc2FibGVkCisJc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsKKwlzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKKworCS8vIFN1cHBvcnQ6IElFPD0xMSsKKwkvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpbworCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOworCWlucHV0LnZhbHVlID0gInQiOworCWlucHV0LnR5cGUgPSAicmFkaW8iOworCXN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7Cit9KSgpOworCisKK3ZhciBub2RlSG9vaywgYm9vbEhvb2ssCisJYXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKKwkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOworCX0sCisKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7CisJCX0pOworCX0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKwlhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCXZhciBob29rcywgcmV0LAorCQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOworCisJCS8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKKwkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCisJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBzdHJ1bmRlZmluZWQgKSB7CisJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CisJCX0KKworCQkvLyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlCisJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKKwkJaWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CisJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHwKKwkJCQkoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOworCQl9CisKKwkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQlpZiAoIHZhbHVlID09PSBudWxsICkgeworCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CisKKwkJCX0gZWxzZSBpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJuIHJldDsKKworCQkJfSBlbHNlIHsKKwkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOworCQkJCXJldHVybiB2YWx1ZTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsICkgeworCQkJcmV0dXJuIHJldDsKKworCQl9IGVsc2UgeworCQkJcmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApOworCisJCQkvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAorCQkJcmV0dXJuIHJldCA9PSBudWxsID8KKwkJCQl1bmRlZmluZWQgOgorCQkJCXJldDsKKwkJfQorCX0sCisKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCXZhciBuYW1lLCBwcm9wTmFtZSwKKwkJCWkgPSAwLAorCQkJYXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApOworCisJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQl3aGlsZSAoIChuYW1lID0gYXR0ck5hbWVzW2krK10pICkgeworCQkJCXByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOworCisJCQkJLy8gQm9vbGVhbiBhdHRyaWJ1dGVzIGdldCBzcGVjaWFsIHRyZWF0bWVudCAoIzEwODcwKQorCQkJCWlmICggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgKSB7CisJCQkJCS8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlCisJCQkJCWVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTsKKwkJCQl9CisKKwkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOworCQkJfQorCQl9CisJfSwKKworCWF0dHJIb29rczogeworCQl0eXBlOiB7CisJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKKwkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKKwkJCQkJalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgKSB7CisJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOworCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggInR5cGUiLCB2YWx1ZSApOworCQkJCQlpZiAoIHZhbCApIHsKKwkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHZhbHVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30pOworCisvLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzCitib29sSG9vayA9IHsKKwlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKKwkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CisJCQkvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlCisJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOworCQl9IGVsc2UgeworCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTsKKwkJfQorCQlyZXR1cm4gbmFtZTsKKwl9Cit9OworalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CisJdmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyOworCisJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgeworCQl2YXIgcmV0LCBoYW5kbGU7CisJCWlmICggIWlzWE1MICkgeworCQkJLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlcgorCQkJaGFuZGxlID0gYXR0ckhhbmRsZVsgbmFtZSBdOworCQkJYXR0ckhhbmRsZVsgbmFtZSBdID0gcmV0OworCQkJcmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgPworCQkJCW5hbWUudG9Mb3dlckNhc2UoKSA6CisJCQkJbnVsbDsKKwkJCWF0dHJIYW5kbGVbIG5hbWUgXSA9IGhhbmRsZTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX07Cit9KTsKKworCisKKwordmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKKwl9LAorCisJcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJCQlkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07CisJCX0pOworCX0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKwlwcm9wRml4OiB7CisJCSJmb3IiOiAiaHRtbEZvciIsCisJCSJjbGFzcyI6ICJjbGFzc05hbWUiCisJfSwKKworCXByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKwkJdmFyIHJldCwgaG9va3MsIG5vdHhtbCwKKwkJCW5UeXBlID0gZWxlbS5ub2RlVHlwZTsKKworCQkvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCisJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7CisKKwkJaWYgKCBub3R4bWwgKSB7CisJCQkvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzCisJCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOworCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CisJCX0KKworCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisJCQlyZXR1cm4gaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCA/CisJCQkJcmV0IDoKKwkJCQkoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkpICE9PSBudWxsID8KKwkJCQlyZXQgOgorCQkJCWVsZW1bIG5hbWUgXTsKKwkJfQorCX0sCisKKwlwcm9wSG9va3M6IHsKKwkJdGFiSW5kZXg6IHsKKwkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CisJCQkJcmV0dXJuIGVsZW0uaGFzQXR0cmlidXRlKCAidGFiaW5kZXgiICkgfHwgcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgZWxlbS5ocmVmID8KKwkJCQkJZWxlbS50YWJJbmRleCA6CisJCQkJCS0xOworCQkJfQorCQl9CisJfQorfSk7CisKK2lmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7CisJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKKwkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCQlpZiAoIHBhcmVudCAmJiBwYXJlbnQucGFyZW50Tm9kZSApIHsKKwkJCQlwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9OworfQorCitqUXVlcnkuZWFjaChbCisJInRhYkluZGV4IiwKKwkicmVhZE9ubHkiLAorCSJtYXhMZW5ndGgiLAorCSJjZWxsU3BhY2luZyIsCisJImNlbGxQYWRkaW5nIiwKKwkicm93U3BhbiIsCisJImNvbFNwYW4iLAorCSJ1c2VNYXAiLAorCSJmcmFtZUJvcmRlciIsCisJImNvbnRlbnRFZGl0YWJsZSIKK10sIGZ1bmN0aW9uKCkgeworCWpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7Cit9KTsKKworCisKKwordmFyIHJjbGFzcyA9IC9bXHRcclxuXGZdL2c7CisKK2pRdWVyeS5mbi5leHRlbmQoeworCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAorCQkJcHJvY2VlZCA9IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgdmFsdWUsCisJCQlpID0gMCwKKwkJCWxlbiA9IHRoaXMubGVuZ3RoOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CisJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgeworCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7CisJCQl9KTsKKwkJfQorCisJCWlmICggcHJvY2VlZCApIHsKKwkJCS8vIFRoZSBkaXNqdW5jdGlvbiBoZXJlIGlzIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgcmVtb3ZlQ2xhc3MpCisJCQljbGFzc2VzID0gKCB2YWx1ZSB8fCAiIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsKKworCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisJCQkJZWxlbSA9IHRoaXNbIGkgXTsKKwkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgPworCQkJCQkoICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6CisJCQkJCSIgIgorCQkJCSk7CisKKwkJCQlpZiAoIGN1ciApIHsKKwkJCQkJaiA9IDA7CisJCQkJCXdoaWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHsKKwkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgeworCQkJCQkJCWN1ciArPSBjbGF6eiArICIgIjsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIG9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCisJCQkJCWZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7CisJCQkJCWlmICggZWxlbS5jbGFzc05hbWUgIT09IGZpbmFsVmFsdWUgKSB7CisJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGZpbmFsVmFsdWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY2xhenosIGosIGZpbmFsVmFsdWUsCisJCQlwcm9jZWVkID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmIHZhbHVlLAorCQkJaSA9IDAsCisJCQlsZW4gPSB0aGlzLmxlbmd0aDsKKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKKwkJCQlqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgdGhpcy5jbGFzc05hbWUgKSApOworCQkJfSk7CisJCX0KKwkJaWYgKCBwcm9jZWVkICkgeworCQkJY2xhc3NlcyA9ICggdmFsdWUgfHwgIiIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107CisKKwkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQkJCWVsZW0gPSB0aGlzWyBpIF07CisJCQkJLy8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcykKKwkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgPworCQkJCQkoICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6CisJCQkJCSIiCisJCQkJKTsKKworCQkJCWlmICggY3VyICkgeworCQkJCQlqID0gMDsKKwkJCQkJd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgeworCQkJCQkJLy8gUmVtb3ZlICphbGwqIGluc3RhbmNlcworCQkJCQkJd2hpbGUgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA+PSAwICkgeworCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgorCQkJCQlmaW5hbFZhbHVlID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY3VyICkgOiAiIjsKKwkJCQkJaWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0gZmluYWxWYWx1ZSApIHsKKwkJCQkJCWVsZW0uY2xhc3NOYW1lID0gZmluYWxWYWx1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0aGlzOworCX0sCisKKwl0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKKwkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CisKKwkJaWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFuIiAmJiB0eXBlID09PSAic3RyaW5nIiApIHsKKwkJCXJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApOworCQl9CisKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgdGhpcy5jbGFzc05hbWUsIHN0YXRlVmFsKSwgc3RhdGVWYWwgKTsKKwkJCX0pOworCQl9CisKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CisJCQkJLy8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXMKKwkJCQl2YXIgY2xhc3NOYW1lLAorCQkJCQlpID0gMCwKKwkJCQkJc2VsZiA9IGpRdWVyeSggdGhpcyApLAorCQkJCQljbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdOworCisJCQkJd2hpbGUgKCAoY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0pICkgeworCQkJCQkvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3QKKwkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKKwkJCQkJCXNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCS8vIFRvZ2dsZSB3aG9sZSBjbGFzcyBuYW1lCisJCQl9IGVsc2UgaWYgKCB0eXBlID09PSBzdHJ1bmRlZmluZWQgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgeworCQkJCWlmICggdGhpcy5jbGFzc05hbWUgKSB7CisJCQkJCS8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKKwkJCQkJZGF0YV9wcml2LnNldCggdGhpcywgIl9fY2xhc3NOYW1lX18iLCB0aGlzLmNsYXNzTmFtZSApOworCQkJCX0KKworCQkJCS8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsCisJCQkJLy8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS4KKwkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAorCQkJCS8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC4KKwkJCQl0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/ICIiIDogZGF0YV9wcml2LmdldCggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CisJCQl9CisJCX0pOworCX0sCisKKwloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgc2VsZWN0b3IgKyAiICIsCisJCQlpID0gMCwKKwkJCWwgPSB0aGlzLmxlbmd0aDsKKwkJZm9yICggOyBpIDwgbDsgaSsrICkgeworCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmICgiICIgKyB0aGlzW2ldLmNsYXNzTmFtZSArICIgIikucmVwbGFjZShyY2xhc3MsICIgIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPj0gMCApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9Cit9KTsKKworCisKKwordmFyIHJyZXR1cm4gPSAvXHIvZzsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLAorCQkJZWxlbSA9IHRoaXNbMF07CisKKwkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKKwkJCWlmICggZWxlbSApIHsKKwkJCQlob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTsKKworCQkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgInZhbHVlIiApKSAhPT0gdW5kZWZpbmVkICkgeworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKworCQkJCXJldCA9IGVsZW0udmFsdWU7CisKKwkJCQlyZXR1cm4gdHlwZW9mIHJldCA9PT0gInN0cmluZyIgPworCQkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCisJCQkJCXJldC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6CisJCQkJCS8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlcgorCQkJCQlyZXQgPT0gbnVsbCA/ICIiIDogcmV0OworCQkJfQorCisJCQlyZXR1cm47CisJCX0KKworCQlpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7CisKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCXZhciB2YWw7CisKKwkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmICggaXNGdW5jdGlvbiApIHsKKwkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOworCQkJfSBlbHNlIHsKKwkJCQl2YWwgPSB2YWx1ZTsKKwkJCX0KKworCQkJLy8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgIiI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmcKKwkJCWlmICggdmFsID09IG51bGwgKSB7CisJCQkJdmFsID0gIiI7CisKKwkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgeworCQkJCXZhbCArPSAiIjsKKworCQkJfSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgeworCQkJCXZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkgeworCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKKwkJCQl9KTsKKwkJCX0KKworCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CisKKwkJCS8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nCisJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgInZhbHVlIiApID09PSB1bmRlZmluZWQgKSB7CisJCQkJdGhpcy52YWx1ZSA9IHZhbDsKKwkJCX0KKwkJfSk7CisJfQorfSk7CisKK2pRdWVyeS5leHRlbmQoeworCXZhbEhvb2tzOiB7CisJCW9wdGlvbjogeworCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKKwkJCQl2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgInZhbHVlIiApOworCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CisJCQkJCXZhbCA6CisJCQkJCS8vIFN1cHBvcnQ6IElFMTAtMTErCisJCQkJCS8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OCkKKwkJCQkJalF1ZXJ5LnRyaW0oIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKKwkJCX0KKwkJfSwKKwkJc2VsZWN0OiB7CisJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJCXZhciB2YWx1ZSwgb3B0aW9uLAorCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAorCQkJCQlpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKKwkJCQkJb25lID0gZWxlbS50eXBlID09PSAic2VsZWN0LW9uZSIgfHwgaW5kZXggPCAwLAorCQkJCQl2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sCisJCQkJCW1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLAorCQkJCQlpID0gaW5kZXggPCAwID8KKwkJCQkJCW1heCA6CisJCQkJCQlvbmUgPyBpbmRleCA6IDA7CisKKwkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCisJCQkJZm9yICggOyBpIDwgbWF4OyBpKysgKSB7CisJCQkJCW9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKKworCQkJCQkvLyBJRTYtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSkKKwkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCisJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAorCQkJCQkJCSggc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKCAiZGlzYWJsZWQiICkgPT09IG51bGwgKSAmJgorCQkJCQkJCSggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKKworCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgorCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOworCisJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cworCQkJCQkJaWYgKCBvbmUgKSB7CisJCQkJCQkJcmV0dXJuIHZhbHVlOworCQkJCQkJfQorCisJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQorCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gdmFsdWVzOworCQkJfSwKKworCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCQkJdmFyIG9wdGlvblNldCwgb3B0aW9uLAorCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAorCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAorCQkJCQlpID0gb3B0aW9ucy5sZW5ndGg7CisKKwkJCQl3aGlsZSAoIGktLSApIHsKKwkJCQkJb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCQkJCQlpZiAoIChvcHRpb24uc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggb3B0aW9uLnZhbHVlLCB2YWx1ZXMgKSA+PSAwKSApIHsKKwkJCQkJCW9wdGlvblNldCA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldAorCQkJCWlmICggIW9wdGlvblNldCApIHsKKwkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CisJCQkJfQorCQkJCXJldHVybiB2YWx1ZXM7CisJCQl9CisJCX0KKwl9Cit9KTsKKworLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXIKK2pRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsKKwlqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKKwkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CisJCQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgeworCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCApOworCQkJfQorCQl9CisJfTsKKwlpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7CisJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgeworCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7CisJCX07CisJfQorfSk7CisKKworCisKKy8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KKworCitqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKKwkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCisJImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiKS5zcGxpdCgiICIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKKworCS8vIEhhbmRsZSBldmVudCBiaW5kaW5nCisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CisJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CisJCQl0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDoKKwkJCXRoaXMudHJpZ2dlciggbmFtZSApOworCX07Cit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgeworCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKKwl9LAorCisJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApOworCX0sCisJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgeworCQlyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApOworCX0sCisKKwlkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7CisJfSwKKwl1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHsKKwkJLy8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKQorCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHRoaXMub2ZmKCBzZWxlY3RvciwgIioqIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCAiKioiLCBmbiApOworCX0KK30pOworCisKK3ZhciBub25jZSA9IGpRdWVyeS5ub3coKTsKKwordmFyIHJxdWVyeSA9ICgvXD8vKTsKKworCisKKy8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zCisvLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBpbnB1dAoralF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkgeworCXJldHVybiBKU09OLnBhcnNlKCBkYXRhICsgIiIgKTsKK307CisKKworLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZworalF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7CisJdmFyIHhtbCwgdG1wOworCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyBTdXBwb3J0OiBJRTkKKwl0cnkgeworCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CisJCXhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEsICJ0ZXh0L3htbCIgKTsKKwl9IGNhdGNoICggZSApIHsKKwkJeG1sID0gdW5kZWZpbmVkOworCX0KKworCWlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7CisJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOworCX0KKwlyZXR1cm4geG1sOworfTsKKworCit2YXIKKwlyaGFzaCA9IC8jLiokLywKKwlydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCisJcmhlYWRlcnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL21nLAorCS8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvbgorCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCisJcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sCisJcnByb3RvY29sID0gL15cL1wvLywKKwlydXJsID0gL14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sCisKKwkvKiBQcmVmaWx0ZXJzCisJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKKwkgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOgorCSAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnQKKwkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCisJICogMykga2V5IGlzIHRoZSBkYXRhVHlwZQorCSAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCisJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCisJICovCisJcHJlZmlsdGVycyA9IHt9LAorCisJLyogVHJhbnNwb3J0cyBiaW5kaW5ncworCSAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKKwkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAorCSAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKKwkgKi8KKwl0cmFuc3BvcnRzID0ge30sCisKKwkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KKwlhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKKworCS8vIERvY3VtZW50IGxvY2F0aW9uCisJYWpheExvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWYsCisKKwkvLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHMKKwlhamF4TG9jUGFydHMgPSBydXJsLmV4ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107CisKKy8vIEJhc2UgImNvbnN0cnVjdG9yIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0CitmdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHsKKworCS8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gIioiCisJcmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7CisKKwkJaWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSAic3RyaW5nIiApIHsKKwkJCWZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247CisJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CisJCX0KKworCQl2YXIgZGF0YVR5cGUsCisJCQlpID0gMCwKKwkJCWRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTsKKworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CisJCQkvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uCisJCQl3aGlsZSAoIChkYXRhVHlwZSA9IGRhdGFUeXBlc1tpKytdKSApIHsKKwkJCQkvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZAorCQkJCWlmICggZGF0YVR5cGVbMF0gPT09ICIrIiApIHsKKwkJCQkJZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8ICIqIjsKKwkJCQkJKHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSkudW5zaGlmdCggZnVuYyApOworCisJCQkJLy8gT3RoZXJ3aXNlIGFwcGVuZAorCQkJCX0gZWxzZSB7CisJCQkJCShzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnB1c2goIGZ1bmMgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9OworfQorCisvLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKK2Z1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7CisKKwl2YXIgaW5zcGVjdGVkID0ge30sCisJCXNlZWtpbmdUcmFuc3BvcnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApOworCisJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CisJCXZhciBzZWxlY3RlZDsKKwkJaW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTsKKwkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKKwkJCXZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CisJCQlpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSAic3RyaW5nIiAmJiAhc2Vla2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7CisJCQkJb3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApOworCQkJCWluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkgeworCQkJCXJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiBzZWxlY3RlZDsKKwl9CisKKwlyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbICIqIiBdICYmIGluc3BlY3QoICIqIiApOworfQorCisvLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKKy8vIHRoYXQgdGFrZXMgImZsYXQiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKQorLy8gRml4ZXMgIzk4ODcKK2Z1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkgeworCXZhciBrZXksIGRlZXAsCisJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKKworCWZvciAoIGtleSBpbiBzcmMgKSB7CisJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgeworCQkJKCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKGRlZXAgPSB7fSkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CisJCX0KKwl9CisJaWYgKCBkZWVwICkgeworCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKKwl9CisKKwlyZXR1cm4gdGFyZ2V0OworfQorCisvKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CisgKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQorICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCisgKi8KK2Z1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CisKKwl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCisJCWNvbnRlbnRzID0gcy5jb250ZW50cywKKwkJZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7CisKKwkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcworCXdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09ICIqIiApIHsKKwkJZGF0YVR5cGVzLnNoaWZ0KCk7CisJCWlmICggY3QgPT09IHVuZGVmaW5lZCApIHsKKwkJCWN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIik7CisJCX0KKwl9CisKKwkvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGUKKwlpZiAoIGN0ICkgeworCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgeworCQkJaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHsKKwkJCQlkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCisJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CisJCWZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTsKKwl9IGVsc2UgeworCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCisJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgeworCQkJaWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgIiAiICsgZGF0YVR5cGVzWzBdIF0gKSB7CisJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgeworCQkJCWZpcnN0RGF0YVR5cGUgPSB0eXBlOworCQkJfQorCQl9CisJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQorCQlmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlOworCX0KKworCS8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGUKKwkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAorCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKKwlpZiAoIGZpbmFsRGF0YVR5cGUgKSB7CisJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CisJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOworCQl9CisJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKKwl9Cit9CisKKy8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKKyAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZQorICovCitmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7CisJdmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsCisJCWNvbnZlcnRlcnMgPSB7fSwKKwkJLy8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvbgorCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOworCisJLy8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzCisJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKKwkJZm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7CisJCQljb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdOworCQl9CisJfQorCisJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOworCisJLy8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUKKwl3aGlsZSAoIGN1cnJlbnQgKSB7CisKKwkJaWYgKCBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gKSB7CisJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKKwkJfQorCisJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCisJCWlmICggIXByZXYgJiYgaXNTdWNjZXNzICYmIHMuZGF0YUZpbHRlciApIHsKKwkJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOworCQl9CisKKwkJcHJldiA9IGN1cnJlbnQ7CisJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKKworCQlpZiAoIGN1cnJlbnQgKSB7CisKKwkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bworCQkJaWYgKCBjdXJyZW50ID09PSAiKiIgKSB7CisKKwkJCQljdXJyZW50ID0gcHJldjsKKworCQkJLy8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudAorCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CisKKwkJCQkvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlcgorCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CisKKwkJCQkvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpcgorCQkJCWlmICggIWNvbnYgKSB7CisJCQkJCWZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7CisKKwkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAorCQkJCQkJdG1wID0gY29udjIuc3BsaXQoICIgIiApOworCQkJCQkJaWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHsKKworCQkJCQkJCS8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dAorCQkJCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgdG1wWyAwIF0gXSB8fAorCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKKwkJCQkJCQlpZiAoIGNvbnYgKSB7CisJCQkJCQkJCS8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnMKKwkJCQkJCQkJaWYgKCBjb252ID09PSB0cnVlICkgeworCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CisKKwkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZQorCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgeworCQkJCQkJCQkJY3VycmVudCA9IHRtcFsgMCBdOworCQkJCQkJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJLy8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpCisJCQkJaWYgKCBjb252ICE9PSB0cnVlICkgeworCisJCQkJCS8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW0KKwkJCQkJaWYgKCBjb252ICYmIHNbICJ0aHJvd3MiIF0gKSB7CisJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKKwkJCQkJCX0gY2F0Y2ggKCBlICkgeworCQkJCQkJCXJldHVybiB7IHN0YXRlOiAicGFyc2VyZXJyb3IiLCBlcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudCB9OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHsgc3RhdGU6ICJzdWNjZXNzIiwgZGF0YTogcmVzcG9uc2UgfTsKK30KKworalF1ZXJ5LmV4dGVuZCh7CisKKwkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKwlhY3RpdmU6IDAsCisKKwkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CisJbGFzdE1vZGlmaWVkOiB7fSwKKwlldGFnOiB7fSwKKworCWFqYXhTZXR0aW5nczogeworCQl1cmw6IGFqYXhMb2NhdGlvbiwKKwkJdHlwZTogIkdFVCIsCisJCWlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGFqYXhMb2NQYXJ0c1sgMSBdICksCisJCWdsb2JhbDogdHJ1ZSwKKwkJcHJvY2Vzc0RhdGE6IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCisJCS8qCisJCXRpbWVvdXQ6IDAsCisJCWRhdGE6IG51bGwsCisJCWRhdGFUeXBlOiBudWxsLAorCQl1c2VybmFtZTogbnVsbCwKKwkJcGFzc3dvcmQ6IG51bGwsCisJCWNhY2hlOiBudWxsLAorCQl0aHJvd3M6IGZhbHNlLAorCQl0cmFkaXRpb25hbDogZmFsc2UsCisJCWhlYWRlcnM6IHt9LAorCQkqLworCisJCWFjY2VwdHM6IHsKKwkJCSIqIjogYWxsVHlwZXMsCisJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCisJCQlodG1sOiAidGV4dC9odG1sIiwKKwkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIKKwkJfSwKKworCQljb250ZW50czogeworCQkJeG1sOiAveG1sLywKKwkJCWh0bWw6IC9odG1sLywKKwkJCWpzb246IC9qc29uLworCQl9LAorCisJCXJlc3BvbnNlRmllbGRzOiB7CisJCQl4bWw6ICJyZXNwb25zZVhNTCIsCisJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKKwkJCWpzb246ICJyZXNwb25zZUpTT04iCisJCX0sCisKKwkJLy8gRGF0YSBjb252ZXJ0ZXJzCisJCS8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCAiKiIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlCisJCWNvbnZlcnRlcnM6IHsKKworCQkJLy8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0CisJCQkiKiB0ZXh0IjogU3RyaW5nLAorCisJCQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKKwkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAorCisJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCisJCQkidGV4dCBqc29uIjogalF1ZXJ5LnBhcnNlSlNPTiwKKworCQkJLy8gUGFyc2UgdGV4dCBhcyB4bWwKKwkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAorCQl9LAorCisJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CisJCS8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWYKKwkJLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKKwkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCisJCWZsYXRPcHRpb25zOiB7CisJCQl1cmw6IHRydWUsCisJCQljb250ZXh0OiB0cnVlCisJCX0KKwl9LAorCisJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKKwkvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuCisJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KKwlhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgeworCQlyZXR1cm4gc2V0dGluZ3MgPworCisJCQkvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdAorCQkJYWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOgorCisJCQkvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzCisJCQlhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTsKKwl9LAorCisJYWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksCisJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCisKKwkvLyBNYWluIG1ldGhvZAorCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CisKKwkJLy8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmUKKwkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKKwkJCW9wdGlvbnMgPSB1cmw7CisJCQl1cmwgPSB1bmRlZmluZWQ7CisJCX0KKworCQkvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdAorCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKworCQl2YXIgdHJhbnNwb3J0LAorCQkJLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbQorCQkJY2FjaGVVUkwsCisJCQkvLyBSZXNwb25zZSBoZWFkZXJzCisJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCisJCQlyZXNwb25zZUhlYWRlcnMsCisJCQkvLyB0aW1lb3V0IGhhbmRsZQorCQkJdGltZW91dFRpbWVyLAorCQkJLy8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzCisJCQlwYXJ0cywKKwkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAorCQkJZmlyZUdsb2JhbHMsCisJCQkvLyBMb29wIHZhcmlhYmxlCisJCQlpLAorCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAorCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCisJCQkvLyBDYWxsYmFja3MgY29udGV4dAorCQkJY2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsCisJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uCisJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYgKCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID8KKwkJCQlqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDoKKwkJCQlqUXVlcnkuZXZlbnQsCisJCQkvLyBEZWZlcnJlZHMKKwkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCisJCQljb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwKKwkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCisJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAorCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKKwkJCXJlcXVlc3RIZWFkZXJzID0ge30sCisJCQlyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sCisJCQkvLyBUaGUganFYSFIgc3RhdGUKKwkJCXN0YXRlID0gMCwKKwkJCS8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQorCQkJc3RyQWJvcnQgPSAiY2FuY2VsZWQiLAorCQkJLy8gRmFrZSB4aHIKKwkJCWpxWEhSID0geworCQkJCXJlYWR5U3RhdGU6IDAsCisKKwkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCisJCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CisJCQkJCXZhciBtYXRjaDsKKwkJCQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKKwkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKKwkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB7fTsKKwkJCQkJCQl3aGlsZSAoIChtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApKSApIHsKKwkJCQkJCQkJcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCW1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOworCQkJCQl9CisJCQkJCXJldHVybiBtYXRjaCA9PSBudWxsID8gbnVsbCA6IG1hdGNoOworCQkJCX0sCisKKwkJCQkvLyBSYXcgc3RyaW5nCisJCQkJZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKKwkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKKwkJCQl9LAorCisJCQkJLy8gQ2FjaGVzIHRoZSBoZWFkZXIKKwkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CisJCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKwkJCQkJaWYgKCAhc3RhdGUgKSB7CisJCQkJCQluYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKKwkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9LAorCisJCQkJLy8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXIKKwkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKKwkJCQkJaWYgKCAhc3RhdGUgKSB7CisJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdGhpczsKKwkJCQl9LAorCisJCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKKwkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgeworCQkJCQl2YXIgY29kZTsKKwkJCQkJaWYgKCBtYXAgKSB7CisJCQkJCQlpZiAoIHN0YXRlIDwgMiApIHsKKwkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKKwkJCQkJCQkJLy8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lcworCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcworCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0sCisKKwkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKKwkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CisJCQkJCXZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0OworCQkJCQlpZiAoIHRyYW5zcG9ydCApIHsKKwkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CisJCQkJCX0KKwkJCQkJZG9uZSggMCwgZmluYWxUZXh0ICk7CisJCQkJCXJldHVybiB0aGlzOworCQkJCX0KKwkJCX07CisKKwkJLy8gQXR0YWNoIGRlZmVycmVkcworCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7CisJCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOworCQlqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7CisKKwkJLy8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pCisJCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KQorCQkvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKQorCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKKwkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGFqYXhMb2NhdGlvbiApICsgIiIgKS5yZXBsYWNlKCByaGFzaCwgIiIgKQorCQkJLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CisKKwkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CisJCXMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7CisKKwkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAorCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgIiIgXTsKKworCQkvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2ZSBhIHByb3RvY29sOmhvc3Q6cG9ydCBtaXNtYXRjaAorCQlpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHsKKwkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CisJCQlzLmNyb3NzRG9tYWluID0gISEoIHBhcnRzICYmCisJCQkJKCBwYXJ0c1sgMSBdICE9PSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9PSBhamF4TG9jUGFydHNbIDIgXSB8fAorCQkJCQkoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gIjgwIiA6ICI0NDMiICkgKSAhPT0KKwkJCQkJCSggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gImh0dHA6IiA/ICI4MCIgOiAiNDQzIiApICkgKQorCQkJKTsKKwkJfQorCisJCS8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZworCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgeworCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKKwkJfQorCisJCS8vIEFwcGx5IHByZWZpbHRlcnMKKwkJaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7CisKKwkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmUKKwkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKKwkJCXJldHVybiBqcVhIUjsKKwkJfQorCisJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCisJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCisJCWZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsOworCisJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKKwkJaWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7CisJCX0KKworCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKKwkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CisKKwkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKKwkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CisKKwkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCisJCS8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvbgorCQljYWNoZVVSTCA9IHMudXJsOworCisJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CisJCWlmICggIXMuaGFzQ29udGVudCApIHsKKworCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybAorCQkJaWYgKCBzLmRhdGEgKSB7CisJCQkJY2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YSApOworCQkJCS8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKKwkJCQlkZWxldGUgcy5kYXRhOworCQkJfQorCisJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCisJCQlpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkgeworCQkJCXMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgPworCisJCQkJCS8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlCisJCQkJCWNhY2hlVVJMLnJlcGxhY2UoIHJ0cywgIiQxXz0iICsgbm9uY2UrKyApIDoKKworCQkJCQkvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kCisJCQkJCWNhY2hlVVJMICsgKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIG5vbmNlKys7CisJCQl9CisJCX0KKworCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgorCQlpZiAoIHMuaWZNb2RpZmllZCApIHsKKwkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKKwkJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiSWYtTW9kaWZpZWQtU2luY2UiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7CisJCQl9CisJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgeworCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsKKwkJCX0KKwkJfQorCisJCS8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudAorCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKKwkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlICk7CisJCX0KKworCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCisJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoCisJCQkiQWNjZXB0IiwKKwkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KKwkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBhbGxUeXBlcyArICI7IHE9MC4wMSIgOiAiIiApIDoKKwkJCQlzLmFjY2VwdHNbICIqIiBdCisJCSk7CisKKwkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCisJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgeworCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKKwkJfQorCisJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKwkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkgeworCQkJLy8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCisJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKKwkJfQorCisJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgorCQlzdHJBYm9ydCA9ICJhYm9ydCI7CisKKwkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCisJCWZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHsKKwkJCWpxWEhSWyBpIF0oIHNbIGkgXSApOworCQl9CisKKwkJLy8gR2V0IHRyYW5zcG9ydAorCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKKworCQkvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKKwkJaWYgKCAhdHJhbnNwb3J0ICkgeworCQkJZG9uZSggLTEsICJObyBUcmFuc3BvcnQiICk7CisJCX0gZWxzZSB7CisJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKKworCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKKwkJCWlmICggZmlyZUdsb2JhbHMgKSB7CisJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIsIFsganFYSFIsIHMgXSApOworCQkJfQorCQkJLy8gVGltZW91dAorCQkJaWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7CisJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKKwkJCQkJanFYSFIuYWJvcnQoInRpbWVvdXQiKTsKKwkJCQl9LCBzLnRpbWVvdXQgKTsKKwkJCX0KKworCQkJdHJ5IHsKKwkJCQlzdGF0ZSA9IDE7CisJCQkJdHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7CisJCQl9IGNhdGNoICggZSApIHsKKwkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCisJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CisJCQkJCWRvbmUoIC0xLCBlICk7CisJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKKwkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CisJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAorCQkJCXN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0OworCisJCQkvLyBDYWxsZWQgb25jZQorCQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIFN0YXRlIGlzICJkb25lIiBub3cKKwkJCXN0YXRlID0gMjsKKworCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKKwkJCWlmICggdGltZW91dFRpbWVyICkgeworCQkJCWNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7CisJCQl9CisKKwkJCS8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uCisJCQkvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKQorCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOworCisJCQkvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzCisJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOworCisJCQkvLyBTZXQgcmVhZHlTdGF0ZQorCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKKworCQkJLy8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWwKKwkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OworCisJCQkvLyBHZXQgcmVzcG9uc2UgZGF0YQorCQkJaWYgKCByZXNwb25zZXMgKSB7CisJCQkJcmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7CisJCQl9CisKKwkJCS8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldCkKKwkJCXJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7CisKKwkJCS8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCisJCQlpZiAoIGlzU3VjY2VzcyApIHsKKworCQkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCisJCQkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CisJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKKwkJCQkJaWYgKCBtb2RpZmllZCApIHsKKwkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKKwkJCQkJfQorCQkJCQltb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIik7CisJCQkJCWlmICggbW9kaWZpZWQgKSB7CisJCQkJCQlqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gaWYgbm8gY29udGVudAorCQkJCWlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSAiSEVBRCIgKSB7CisJCQkJCXN0YXR1c1RleHQgPSAibm9jb250ZW50IjsKKworCQkJCS8vIGlmIG5vdCBtb2RpZmllZAorCQkJCX0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkgeworCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKKworCQkJCS8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAorCQkJCX0gZWxzZSB7CisJCQkJCXN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTsKKwkJCQkJc3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7CisJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CisJCQkJCWlzU3VjY2VzcyA9ICFlcnJvcjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKKwkJCQllcnJvciA9IHN0YXR1c1RleHQ7CisJCQkJaWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7CisJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOworCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CisJCQkJCQlzdGF0dXMgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAorCQkJanFYSFIuc3RhdHVzID0gc3RhdHVzOworCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKKworCQkJLy8gU3VjY2Vzcy9FcnJvcgorCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CisJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CisJCQl9IGVsc2UgeworCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOworCQkJfQorCisJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcworCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOworCQkJc3RhdHVzQ29kZSA9IHVuZGVmaW5lZDsKKworCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gImFqYXhTdWNjZXNzIiA6ICJhamF4RXJyb3IiLAorCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOworCQkJfQorCisJCQkvLyBDb21wbGV0ZQorCQkJY29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKKworCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKKwkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOworCQkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorCQkJCWlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7CisJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBqcVhIUjsKKwl9LAorCisJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKKwl9LAorCisJZ2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgInNjcmlwdCIgKTsKKwl9Cit9KTsKKworalF1ZXJ5LmVhY2goIFsgImdldCIsICJwb3N0IiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkgeworCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKKwkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0gdW5kZWZpbmVkOworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJCXVybDogdXJsLAorCQkJdHlwZTogbWV0aG9kLAorCQkJZGF0YVR5cGU6IHR5cGUsCisJCQlkYXRhOiBkYXRhLAorCQkJc3VjY2VzczogY2FsbGJhY2sKKwkJfSk7CisJfTsKK30pOworCisKK2pRdWVyeS5fZXZhbFVybCA9IGZ1bmN0aW9uKCB1cmwgKSB7CisJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJdXJsOiB1cmwsCisJCXR5cGU6ICJHRVQiLAorCQlkYXRhVHlwZTogInNjcmlwdCIsCisJCWFzeW5jOiBmYWxzZSwKKwkJZ2xvYmFsOiBmYWxzZSwKKwkJInRocm93cyI6IHRydWUKKwl9KTsKK307CisKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCXZhciB3cmFwOworCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKKwkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CisJCQl9KTsKKwkJfQorCisJCWlmICggdGhpc1sgMCBdICkgeworCisJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAorCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CisKKwkJCWlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7CisJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOworCQkJfQorCisJCQl3cmFwLm1hcChmdW5jdGlvbigpIHsKKwkJCQl2YXIgZWxlbSA9IHRoaXM7CisKKwkJCQl3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7CisJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOworCQkJCX0KKworCQkJCXJldHVybiBlbGVtOworCQkJfSkuYXBwZW5kKCB0aGlzICk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgeworCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKKwkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApOworCQkJfSk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSwKKwkJCQljb250ZW50cyA9IHNlbGYuY29udGVudHMoKTsKKworCQkJaWYgKCBjb250ZW50cy5sZW5ndGggKSB7CisJCQkJY29udGVudHMud3JhcEFsbCggaHRtbCApOworCisJCQl9IGVsc2UgeworCQkJCXNlbGYuYXBwZW5kKCBodG1sICk7CisJCQl9CisJCX0pOworCX0sCisKKwl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJdmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApOworCQl9KTsKKwl9LAorCisJdW53cmFwOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHsKKwkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImJvZHkiICkgKSB7CisJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOworCQkJfQorCQl9KS5lbmQoKTsKKwl9Cit9KTsKKworCitqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgeworCS8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyCisJLy8gT3BlcmEgcmVwb3J0cyBvZmZzZXRXaWR0aHMgYW5kIG9mZnNldEhlaWdodHMgbGVzcyB0aGFuIHplcm8gb24gc29tZSBlbGVtZW50cworCXJldHVybiBlbGVtLm9mZnNldFdpZHRoIDw9IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPD0gMDsKK307CitqUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKKwlyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7Cit9OworCisKKworCit2YXIgcjIwID0gLyUyMC9nLAorCXJicmFja2V0ID0gL1xbXF0kLywKKwlyQ1JMRiA9IC9ccj9cbi9nLAorCXJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSwKKwlyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7CisKK2Z1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKKwl2YXIgbmFtZTsKKworCWlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgeworCQkvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS4KKwkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CisJCQlpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgeworCQkJCS8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci4KKwkJCQlhZGQoIHByZWZpeCwgdiApOworCisJCQl9IGVsc2UgeworCQkJCS8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LgorCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiA/IGkgOiAiIiApICsgIl0iLCB2LCB0cmFkaXRpb25hbCwgYWRkICk7CisJCQl9CisJCX0pOworCisJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CisJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KKwkJZm9yICggbmFtZSBpbiBvYmogKSB7CisJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgbmFtZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLy8gU2VyaWFsaXplIHNjYWxhciBpdGVtLgorCQlhZGQoIHByZWZpeCwgb2JqICk7CisJfQorfQorCisvLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZgorLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCitqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CisJdmFyIHByZWZpeCwKKwkJcyA9IFtdLAorCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKKwkJCS8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZQorCQkJdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICk7CisJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKKwkJfTsKKworCS8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuCisJaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgeworCQl0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKKwl9CisKKwkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLgorCWlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CisJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cworCQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CisJCQlhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOworCQl9KTsKKworCX0gZWxzZSB7CisJCS8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlICJvbGQiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlcgorCQkvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KKwkJZm9yICggcHJlZml4IGluIGEgKSB7CisJCQlidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApOworCQl9CisJfQorCisJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgorCXJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwgIisiICk7Cit9OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlzZXJpYWxpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKKwl9LAorCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgeworCQkJLy8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgImVsZW1lbnRzIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHMKKwkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CisJCQlyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpczsKKwkJfSkKKwkJLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCXZhciB0eXBlID0gdGhpcy50eXBlOworCisJCQkvLyBVc2UgLmlzKCAiOmRpc2FibGVkIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzCisJCQlyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggIjpkaXNhYmxlZCIgKSAmJgorCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKKwkJCQkoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7CisJCX0pCisJCS5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKSB7CisJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CisKKwkJCXJldHVybiB2YWwgPT0gbnVsbCA/CisJCQkJbnVsbCA6CisJCQkJalF1ZXJ5LmlzQXJyYXkoIHZhbCApID8KKwkJCQkJalF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkgeworCQkJCQkJcmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OworCQkJCQl9KSA6CisJCQkJCXsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OworCQl9KS5nZXQoKTsKKwl9Cit9KTsKKworCitqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgeworCXRyeSB7CisJCXJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwl9IGNhdGNoKCBlICkge30KK307CisKK3ZhciB4aHJJZCA9IDAsCisJeGhyQ2FsbGJhY2tzID0ge30sCisJeGhyU3VjY2Vzc1N0YXR1cyA9IHsKKwkJLy8gZmlsZSBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDAKKwkJMDogMjAwLAorCQkvLyBTdXBwb3J0OiBJRTkKKwkJLy8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0CisJCTEyMjM6IDIwNAorCX0sCisJeGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTsKKworLy8gU3VwcG9ydDogSUU5CisvLyBPcGVuIHJlcXVlc3RzIG11c3QgYmUgbWFudWFsbHkgYWJvcnRlZCBvbiB1bmxvYWQgKCM1MjgwKQorLy8gU2VlIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzI4NTY3NDYgZm9yIG1vcmUgaW5mbworaWYgKCB3aW5kb3cuYXR0YWNoRXZlbnQgKSB7CisJd2luZG93LmF0dGFjaEV2ZW50KCAib251bmxvYWQiLCBmdW5jdGlvbigpIHsKKwkJZm9yICggdmFyIGtleSBpbiB4aHJDYWxsYmFja3MgKSB7CisJCQl4aHJDYWxsYmFja3NbIGtleSBdKCk7CisJCX0KKwl9KTsKK30KKworc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCAid2l0aENyZWRlbnRpYWxzIiBpbiB4aHJTdXBwb3J0ZWQgKTsKK3N1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkOworCitqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggb3B0aW9ucyApIHsKKwl2YXIgY2FsbGJhY2s7CisKKwkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CisJaWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkgeworCQlyZXR1cm4geworCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgeworCQkJCXZhciBpLAorCQkJCQl4aHIgPSBvcHRpb25zLnhocigpLAorCQkJCQlpZCA9ICsreGhySWQ7CisKKwkJCQl4aHIub3Blbiggb3B0aW9ucy50eXBlLCBvcHRpb25zLnVybCwgb3B0aW9ucy5hc3luYywgb3B0aW9ucy51c2VybmFtZSwgb3B0aW9ucy5wYXNzd29yZCApOworCisJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAorCQkJCWlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7CisJCQkJCWZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7CisJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkCisJCQkJaWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkgeworCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOworCQkJCX0KKworCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCisJCQkJLy8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZQorCQkJCS8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuCisJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCisJCQkJLy8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuCisJCQkJaWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdICkgeworCQkJCQloZWFkZXJzWyJYLVJlcXVlc3RlZC1XaXRoIl0gPSAiWE1MSHR0cFJlcXVlc3QiOworCQkJCX0KKworCQkJCS8vIFNldCBoZWFkZXJzCisJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgeworCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CisJCQkJfQorCisJCQkJLy8gQ2FsbGJhY2sKKwkJCQljYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkgeworCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CisJCQkJCQlpZiAoIGNhbGxiYWNrICkgeworCQkJCQkJCWRlbGV0ZSB4aHJDYWxsYmFja3NbIGlkIF07CisJCQkJCQkJY2FsbGJhY2sgPSB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBudWxsOworCisJCQkJCQkJaWYgKCB0eXBlID09PSAiYWJvcnQiICkgeworCQkJCQkJCQl4aHIuYWJvcnQoKTsKKwkJCQkJCQl9IGVsc2UgaWYgKCB0eXBlID09PSAiZXJyb3IiICkgeworCQkJCQkJCQljb21wbGV0ZSgKKwkJCQkJCQkJCS8vIGZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CisJCQkJCQkJCQl4aHIuc3RhdHVzLAorCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKKwkJCQkJCQkJKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb21wbGV0ZSgKKwkJCQkJCQkJCXhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLAorCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCisJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRTkKKwkJCQkJCQkJCS8vIEFjY2Vzc2luZyBiaW5hcnktZGF0YSByZXNwb25zZVRleHQgdGhyb3dzIGFuIGV4Y2VwdGlvbgorCQkJCQkJCQkJLy8gKCMxMTQyNikKKwkJCQkJCQkJCXR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ID09PSAic3RyaW5nIiA/IHsKKwkJCQkJCQkJCQl0ZXh0OiB4aHIucmVzcG9uc2VUZXh0CisJCQkJCQkJCQl9IDogdW5kZWZpbmVkLAorCQkJCQkJCQkJeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpCisJCQkJCQkJCSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9OworCQkJCX07CisKKwkJCQkvLyBMaXN0ZW4gdG8gZXZlbnRzCisJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CisJCQkJeGhyLm9uZXJyb3IgPSBjYWxsYmFjaygiZXJyb3IiKTsKKworCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKKwkJCQljYWxsYmFjayA9IHhockNhbGxiYWNrc1sgaWQgXSA9IGNhbGxiYWNrKCJhYm9ydCIpOworCisJCQkJdHJ5IHsKKwkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKQorCQkJCQl4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7CisJCQkJfSBjYXRjaCAoIGUgKSB7CisJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CisJCQkJCWlmICggY2FsbGJhY2sgKSB7CisJCQkJCQl0aHJvdyBlOworCQkJCQl9CisJCQkJfQorCQkJfSwKKworCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggY2FsbGJhY2sgKSB7CisJCQkJCWNhbGxiYWNrKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KK30pOworCisKKworCisvLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZQoralF1ZXJ5LmFqYXhTZXR1cCh7CisJYWNjZXB0czogeworCQlzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKKwl9LAorCWNvbnRlbnRzOiB7CisJCXNjcmlwdDogLyg/OmphdmF8ZWNtYSlzY3JpcHQvCisJfSwKKwljb252ZXJ0ZXJzOiB7CisJCSJ0ZXh0IHNjcmlwdCI6IGZ1bmN0aW9uKCB0ZXh0ICkgeworCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKKwkJCXJldHVybiB0ZXh0OworCQl9CisJfQorfSk7CisKKy8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW4KK2pRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CisJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CisJCXMuY2FjaGUgPSBmYWxzZTsKKwl9CisJaWYgKCBzLmNyb3NzRG9tYWluICkgeworCQlzLnR5cGUgPSAiR0VUIjsKKwl9Cit9KTsKKworLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0CitqUXVlcnkuYWpheFRyYW5zcG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgeworCS8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHMKKwlpZiAoIHMuY3Jvc3NEb21haW4gKSB7CisJCXZhciBzY3JpcHQsIGNhbGxiYWNrOworCQlyZXR1cm4geworCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgeworCQkJCXNjcmlwdCA9IGpRdWVyeSgiPHNjcmlwdD4iKS5wcm9wKHsKKwkJCQkJYXN5bmM6IHRydWUsCisJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKKwkJCQkJc3JjOiBzLnVybAorCQkJCX0pLm9uKAorCQkJCQkibG9hZCBlcnJvciIsCisJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKKwkJCQkJCXNjcmlwdC5yZW1vdmUoKTsKKwkJCQkJCWNhbGxiYWNrID0gbnVsbDsKKwkJCQkJCWlmICggZXZ0ICkgeworCQkJCQkJCWNvbXBsZXRlKCBldnQudHlwZSA9PT0gImVycm9yIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCSk7CisJCQkJZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTsKKwkJCX0sCisJCQlhYm9ydDogZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBjYWxsYmFjayApIHsKKwkJCQkJY2FsbGJhY2soKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorfSk7CisKKworCisKK3ZhciBvbGRDYWxsYmFja3MgPSBbXSwKKwlyanNvbnAgPSAvKD0pXD8oPz0mfCQpfFw/XD8vOworCisvLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCitqUXVlcnkuYWpheFNldHVwKHsKKwlqc29ucDogImNhbGxiYWNrIiwKKwlqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHsKKwkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOworCQl0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTsKKwkJcmV0dXJuIGNhbGxiYWNrOworCX0KK30pOworCisvLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHMKK2pRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKKworCXZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lciwKKwkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KKwkJCSJ1cmwiIDoKKwkJCXR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICYmICEoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSAmJiByanNvbnAudGVzdCggcy5kYXRhICkgJiYgImRhdGEiCisJCSk7CisKKwkvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgImpzb25wIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldAorCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKKworCQkvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0CisJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/CisJCQlzLmpzb25wQ2FsbGJhY2soKSA6CisJCQlzLmpzb25wQ2FsbGJhY2s7CisKKwkJLy8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YQorCQlpZiAoIGpzb25Qcm9wICkgeworCQkJc1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCAiJDEiICsgY2FsbGJhY2tOYW1lICk7CisJCX0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkgeworCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKKwkJfQorCisJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KKwkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CisJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKKwkJCQlqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArICIgd2FzIG5vdCBjYWxsZWQiICk7CisJCQl9CisJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKKwkJfTsKKworCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCisJCXMuZGF0YVR5cGVzWyAwIF0gPSAianNvbiI7CisKKwkJLy8gSW5zdGFsbCBjYWxsYmFjaworCQlvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07CisJCXdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHsKKwkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOworCQl9OworCisJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQorCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CisJCQkvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCisJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CisKKwkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCisJCQlpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgeworCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAorCQkJCXMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKKworCQkJCS8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKKwkJCQlvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7CisJCQl9CisKKwkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQorCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsKKwkJCQlvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApOworCQkJfQorCisJCQlyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkOworCQl9KTsKKworCQkvLyBEZWxlZ2F0ZSB0byBzY3JpcHQKKwkJcmV0dXJuICJzY3JpcHQiOworCX0KK30pOworCisKKworCisvLyBkYXRhOiBzdHJpbmcgb2YgaHRtbAorLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAorLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZworalF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHsKKwlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWlmICggdHlwZW9mIGNvbnRleHQgPT09ICJib29sZWFuIiApIHsKKwkJa2VlcFNjcmlwdHMgPSBjb250ZXh0OworCQljb250ZXh0ID0gZmFsc2U7CisJfQorCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OworCisJdmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLAorCQlzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOworCisJLy8gU2luZ2xlIHRhZworCWlmICggcGFyc2VkICkgeworCQlyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsxXSApIF07CisJfQorCisJcGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CisKKwlpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7CisJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOworCX0KKworCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOworfTsKKworCisvLyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGxvYWQgbWV0aG9kCit2YXIgX2xvYWQgPSBqUXVlcnkuZm4ubG9hZDsKKworLyoqCisgKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCisgKi8KK2pRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKKwlpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgeworCQlyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCX0KKworCXZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsCisJCXNlbGYgPSB0aGlzLAorCQlvZmYgPSB1cmwuaW5kZXhPZigiICIpOworCisJaWYgKCBvZmYgPj0gMCApIHsKKwkJc2VsZWN0b3IgPSBqUXVlcnkudHJpbSggdXJsLnNsaWNlKCBvZmYgKSApOworCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOworCX0KKworCS8vIElmIGl0J3MgYSBmdW5jdGlvbgorCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgeworCisJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCisJCWNhbGxiYWNrID0gcGFyYW1zOworCQlwYXJhbXMgPSB1bmRlZmluZWQ7CisKKwkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCisJfSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgeworCQl0eXBlID0gIlBPU1QiOworCX0KKworCS8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0CisJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CisJCWpRdWVyeS5hamF4KHsKKwkJCXVybDogdXJsLAorCisJCQkvLyBpZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQKKwkJCXR5cGU6IHR5cGUsCisJCQlkYXRhVHlwZTogImh0bWwiLAorCQkJZGF0YTogcGFyYW1zCisJCX0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsKKworCQkJLy8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrCisJCQlyZXNwb25zZSA9IGFyZ3VtZW50czsKKworCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/CisKKwkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKKwkJCQkvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMKKwkJCQlqUXVlcnkoIjxkaXY+IikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgorCisJCQkJLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHQKKwkJCQlyZXNwb25zZVRleHQgKTsKKworCQl9KS5jb21wbGV0ZSggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7CisJCQlzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CisJCX0pOworCX0KKworCXJldHVybiB0aGlzOworfTsKKworCisKKworLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKK2pRdWVyeS5lYWNoKCBbICJhamF4U3RhcnQiLCAiYWpheFN0b3AiLCAiYWpheENvbXBsZXRlIiwgImFqYXhFcnJvciIsICJhamF4U3VjY2VzcyIsICJhamF4U2VuZCIgXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7CisJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CisJCXJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApOworCX07Cit9KTsKKworCisKKworalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgeworCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CisJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOworCX0pLmxlbmd0aDsKK307CisKKworCisKK3ZhciBkb2NFbGVtID0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKworLyoqCisgKiBHZXRzIGEgd2luZG93IGZyb20gYW4gZWxlbWVudAorICovCitmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CisJcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0VmlldzsKK30KKworalF1ZXJ5Lm9mZnNldCA9IHsKKwlzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgeworCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAorCQkJcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24iICksCisJCQljdXJFbGVtID0galF1ZXJ5KCBlbGVtICksCisJCQlwcm9wcyA9IHt9OworCisJCS8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0KKwkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CisJCQllbGVtLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKKwkJfQorCisJCWN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7CisJCWN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sICJ0b3AiICk7CisJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKKwkJY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYKKwkJCSggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoImF1dG8iKSA+IC0xOworCisJCS8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyCisJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAorCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgeworCQkJY3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7CisJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CisJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKKworCQl9IGVsc2UgeworCQkJY3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDsKKwkJCWN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDsKKwkJfQorCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKKwkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOworCQl9CisKKwkJaWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgeworCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKKwkJfQorCQlpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkgeworCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CisJCX0KKworCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKKwkJCW9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTsKKworCQl9IGVsc2UgeworCQkJY3VyRWxlbS5jc3MoIHByb3BzICk7CisJCX0KKwl9Cit9OworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwlvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgeworCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CisJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KKwkJCQl0aGlzIDoKKwkJCQl0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CisJCQkJCWpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7CisJCQkJfSk7CisJCX0KKworCQl2YXIgZG9jRWxlbSwgd2luLAorCQkJZWxlbSA9IHRoaXNbIDAgXSwKKwkJCWJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sCisJCQlkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1bWVudDsKKworCQlpZiAoICFkb2MgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKKworCQkvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKKwkJaWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7CisJCQlyZXR1cm4gYm94OworCQl9CisKKwkJLy8gU3VwcG9ydDogQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKQorCQkvLyBJZiB3ZSBkb24ndCBoYXZlIGdCQ1IsIGp1c3QgdXNlIDAsMCByYXRoZXIgdGhhbiBlcnJvcgorCQlpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gc3RydW5kZWZpbmVkICkgeworCQkJYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKwkJfQorCQl3aW4gPSBnZXRXaW5kb3coIGRvYyApOworCQlyZXR1cm4geworCQkJdG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsCisJCQlsZWZ0OiBib3gubGVmdCArIHdpbi5wYWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdAorCQl9OworCX0sCisKKwlwb3NpdGlvbjogZnVuY3Rpb24oKSB7CisJCWlmICggIXRoaXNbIDAgXSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwKKwkJCWVsZW0gPSB0aGlzWyAwIF0sCisJCQlwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9OworCisJCS8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudAorCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKKwkJCS8vIEFzc3VtZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgdGhlcmUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZAorCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKworCQl9IGVsc2UgeworCQkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKKwkJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7CisKKwkJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKKwkJCW9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CisJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCAiaHRtbCIgKSApIHsKKwkJCQlwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7CisJCQl9CisKKwkJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycworCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgImJvcmRlclRvcFdpZHRoIiwgdHJ1ZSApOworCQkJcGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJMZWZ0V2lkdGgiLCB0cnVlICk7CisJCX0KKworCQkvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zCisJCXJldHVybiB7CisJCQl0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpblRvcCIsIHRydWUgKSwKKwkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUgKQorCQl9OworCX0sCisKKwlvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7CisJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTsKKworCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnQsICJodG1sIiApICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgInBvc2l0aW9uIiApID09PSAic3RhdGljIiApICkgeworCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CisJCQl9CisKKwkJCXJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTsKKwkJfSk7CisJfQorfSk7CisKKy8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcworalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7CisJdmFyIHRvcCA9ICJwYWdlWU9mZnNldCIgPT09IHByb3A7CisKKwlqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKKwkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkgeworCQkJdmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApOworCisJCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgeworCQkJCXJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdOworCQkJfQorCisJCQlpZiAoIHdpbiApIHsKKwkJCQl3aW4uc2Nyb2xsVG8oCisJCQkJCSF0b3AgPyB2YWwgOiB3aW5kb3cucGFnZVhPZmZzZXQsCisJCQkJCXRvcCA/IHZhbCA6IHdpbmRvdy5wYWdlWU9mZnNldAorCQkJCSk7CisKKwkJCX0gZWxzZSB7CisJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CisJCQl9CisJCX0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoLCBudWxsICk7CisJfTsKK30pOworCisvLyBTdXBwb3J0OiBTYWZhcmk8NyssIENocm9tZTwzNysKKy8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uCisvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKKy8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MAorLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKKy8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlCitqUXVlcnkuZWFjaCggWyAidG9wIiwgImxlZnQiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkgeworCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCisJCWZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKKwkJCWlmICggY29tcHV0ZWQgKSB7CisJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKKwkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKKwkJCQlyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgPworCQkJCQlqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyAicHgiIDoKKwkJCQkJY29tcHV0ZWQ7CisJCQl9CisJCX0KKwkpOworfSk7CisKKworLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCitqUXVlcnkuZWFjaCggeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHsKKwlqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiAiaW5uZXIiICsgbmFtZSwgY29udGVudDogdHlwZSwgIiI6ICJvdXRlciIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgeworCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKKwkJalF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7CisJCQl2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSAiYm9vbGVhbiIgKSwKKwkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKKworCQkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkgeworCQkJCXZhciBkb2M7CisKKwkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgeworCQkJCQkvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZQorCQkJCQkvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246CisJCQkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0CisJCQkJCXJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIgKyBuYW1lIF07CisJCQkJfQorCisJCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAorCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKKwkJCQkJZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7CisKKwkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAorCQkJCQkvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3QKKwkJCQkJcmV0dXJuIE1hdGgubWF4KAorCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKKwkJCQkJCWVsZW0uYm9keVsgIm9mZnNldCIgKyBuYW1lIF0sIGRvY1sgIm9mZnNldCIgKyBuYW1lIF0sCisJCQkJCQlkb2NbICJjbGllbnQiICsgbmFtZSBdCisJCQkJCSk7CisJCQkJfQorCisJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPworCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CisJCQkJCWpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOgorCisJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKKwkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTsKKwkJCX0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVmaW5lZCwgY2hhaW5hYmxlLCBudWxsICk7CisJCX07CisJfSk7Cit9KTsKKworCisvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoralF1ZXJ5LmZuLnNpemUgPSBmdW5jdGlvbigpIHsKKwlyZXR1cm4gdGhpcy5sZW5ndGg7Cit9OworCitqUXVlcnkuZm4uYW5kU2VsZiA9IGpRdWVyeS5mbi5hZGRCYWNrOworCisKKworCisvLyBSZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXIKKy8vIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsIGJ1dCBub3QgdmlhIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXQKKy8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAorLy8gd2F5IHRvIHJlZ2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZQorLy8gZGVyaXZlZCBmcm9tIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlCisvLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKKy8vIHRvIGNhbGwgbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay4KKworLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKKy8vIGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBhbm9ueW1vdXMgbW9kdWxlcywgYW5kIGF2b2lkIHNldHRpbmcgYSBnbG9iYWwgaWYgYW4KKy8vIEFNRCBsb2FkZXIgaXMgcHJlc2VudC4galF1ZXJ5IGlzIGEgc3BlY2lhbCBjYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisvLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCisKK2lmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgeworCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIGpRdWVyeTsKKwl9KTsKK30KKworCisKKwordmFyCisJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCisKKwkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorCV8kID0gd2luZG93LiQ7CisKK2pRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7CisJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgeworCQl3aW5kb3cuJCA9IF8kOworCX0KKworCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CisJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OworCX0KKworCXJldHVybiBqUXVlcnk7Cit9OworCisvLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRAorLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KQorLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQoraWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IHN0cnVuZGVmaW5lZCApIHsKKwl3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7Cit9CisKKworCisKK3JldHVybiBqUXVlcnk7CisKK30pKTsKKworfSx7fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYmFzZUluZGV4T2YnKSwKKyAgICBiaW5hcnlJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2JpbmFyeUluZGV4Jyk7CisKKy8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCit2YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7CisKKy8qKgorICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgCisgKiB1c2luZyBgU2FtZVZhbHVlWmVyb2AgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwKKyAqIGl0IGlzIHVzZWQgYXMgdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBzb3J0ZWQKKyAqIHByb3ZpZGluZyBgdHJ1ZWAgZm9yIGBmcm9tSW5kZXhgIHBlcmZvcm1zIGEgZmFzdGVyIGJpbmFyeSBzZWFyY2guCisgKgorICogKipOb3RlOioqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1zYW1ldmFsdWV6ZXJvKQorICogY29tcGFyaXNvbnMgYXJlIGxpa2Ugc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlLmcuIGA9PT1gLCBleGNlcHQgdGhhdAorICogYE5hTmAgbWF0Y2hlcyBgTmFOYC4KKyAqCisgKiBAc3RhdGljCisgKiBAbWVtYmVyT2YgXworICogQGNhdGVnb3J5IEFycmF5CisgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KKyAqIEBwYXJhbSB7Ym9vbGVhbnxudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tIG9yIGB0cnVlYAorICogIHRvIHBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIG9uIGEgc29ydGVkIGFycmF5LgorICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KKyAqIEBleGFtcGxlCisgKgorICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7CisgKiAvLyA9PiAxCisgKgorICogLy8gdXNpbmcgYGZyb21JbmRleGAKKyAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpOworICogLy8gPT4gMworICoKKyAqIC8vIHBlcmZvcm1pbmcgYSBiaW5hcnkgc2VhcmNoCisgKiBfLmluZGV4T2YoWzEsIDEsIDIsIDJdLCAyLCB0cnVlKTsKKyAqIC8vID0+IDIKKyAqLworZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkgeworICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwOworICBpZiAoIWxlbmd0aCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAodHlwZW9mIGZyb21JbmRleCA9PSAnbnVtYmVyJykgeworICAgIGZyb21JbmRleCA9IGZyb21JbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKSA6IGZyb21JbmRleDsKKyAgfSBlbHNlIGlmIChmcm9tSW5kZXgpIHsKKyAgICB2YXIgaW5kZXggPSBiaW5hcnlJbmRleChhcnJheSwgdmFsdWUpLAorICAgICAgICBvdGhlciA9IGFycmF5W2luZGV4XTsKKworICAgIGlmICh2YWx1ZSA9PT0gdmFsdWUgPyAodmFsdWUgPT09IG90aGVyKSA6IChvdGhlciAhPT0gb3RoZXIpKSB7CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXggfHwgMCk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaW5kZXhPZjsKKworfSx7Ii4uL2ludGVybmFsL2Jhc2VJbmRleE9mIjo0MiwiLi4vaW50ZXJuYWwvYmluYXJ5SW5kZXgiOjU0fV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIExhenlXcmFwcGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvTGF6eVdyYXBwZXInKSwKKyAgICBMb2Rhc2hXcmFwcGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvTG9kYXNoV3JhcHBlcicpLAorICAgIGJhc2VMb2Rhc2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iYXNlTG9kYXNoJyksCisgICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpLAorICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzT2JqZWN0TGlrZScpLAorICAgIHdyYXBwZXJDbG9uZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3dyYXBwZXJDbG9uZScpOworCisvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKKworLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovCit2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTsKKworLyoqCisgKiBDcmVhdGVzIGEgYGxvZGFzaGAgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGltcGxpY2l0IGNoYWluaW5nLgorICogTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gYW5kIHJldHVybiBhcnJheXMsIGNvbGxlY3Rpb25zLCBhbmQgZnVuY3Rpb25zIGNhbgorICogYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHVybiBhIGJvb2xlYW4gb3Igc2luZ2xlIHZhbHVlIHdpbGwKKyAqIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiByZXR1cm5pbmcgdGhlIHVud3JhcHBlZCB2YWx1ZS4gRXhwbGljaXQgY2hhaW5pbmcKKyAqIG1heSBiZSBlbmFibGVkIHVzaW5nIGBfLmNoYWluYC4gVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwKKyAqIHRoYXQgaXMsIGV4ZWN1dGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBgXyN2YWx1ZWAgaXMgaW1wbGljaXRseSBvciBleHBsaWNpdGx5CisgKiBjYWxsZWQuCisgKgorICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uIFNob3J0Y3V0CisgKiBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgbWVyZ2VzIGl0ZXJhdGVlcyB0byBhdm9pZCBjcmVhdGluZyBpbnRlcm1lZGlhdGUKKyAqIGFycmF5cyBhbmQgcmVkdWNlIHRoZSBudW1iZXIgb2YgaXRlcmF0ZWUgZXhlY3V0aW9ucy4KKyAqCisgKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgXyN2YWx1ZWAgbWV0aG9kIGlzCisgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byBsb2Rhc2ggbWV0aG9kcywgd3JhcHBlcnMgaGF2ZSBgQXJyYXlgIGFuZCBgU3RyaW5nYCBtZXRob2RzLgorICoKKyAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6CisgKiBgY29uY2F0YCwgYGpvaW5gLCBgcG9wYCwgYHB1c2hgLCBgcmV2ZXJzZWAsIGBzaGlmdGAsIGBzbGljZWAsIGBzb3J0YCwKKyAqIGBzcGxpY2VgLCBhbmQgYHVuc2hpZnRgCisgKgorICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6CisgKiBgcmVwbGFjZWAgYW5kIGBzcGxpdGAKKyAqCisgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOgorICogYGNvbXBhY3RgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGZpbHRlcmAsCisgKiBgZmlyc3RgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGBwbHVja2AsIGByZWplY3RgLCBgcmVzdGAsIGByZXZlcnNlYCwKKyAqIGBzbGljZWAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBgdG9BcnJheWAsCisgKiBhbmQgYHdoZXJlYAorICoKKyAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZToKKyAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGF0YCwgYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsCisgKiBgY2FsbGJhY2tgLCBgY2hhaW5gLCBgY2h1bmtgLCBgY29tbWl0YCwgYGNvbXBhY3RgLCBgY29uY2F0YCwgYGNvbnN0YW50YCwKKyAqIGBjb3VudEJ5YCwgYGNyZWF0ZWAsIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZlcmAsIGBkZWxheWAsCisgKiBgZGlmZmVyZW5jZWAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wUmlnaHRXaGlsZWAsIGBkcm9wV2hpbGVgLCBgZmlsbGAsCisgKiBgZmlsdGVyYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLCBgZmxvd2AsIGBmbG93UmlnaHRgLCBgZm9yRWFjaGAsCisgKiBgZm9yRWFjaFJpZ2h0YCwgYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGZ1bmN0aW9uc2AsCisgKiBgZ3JvdXBCeWAsIGBpbmRleEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludmVydGAsIGBpbnZva2VgLCBga2V5c2AsCisgKiBga2V5c0luYCwgYG1hcGAsIGBtYXBWYWx1ZXNgLCBgbWF0Y2hlc2AsIGBtYXRjaGVzUHJvcGVydHlgLCBgbWVtb2l6ZWAsIGBtZXJnZWAsCisgKiBgbWl4aW5gLCBgbmVnYXRlYCwgYG5vb3BgLCBgb21pdGAsIGBvbmNlYCwgYHBhaXJzYCwgYHBhcnRpYWxgLCBgcGFydGlhbFJpZ2h0YCwKKyAqIGBwYXJ0aXRpb25gLCBgcGlja2AsIGBwbGFudGAsIGBwbHVja2AsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLAorICogYHB1bGxBdGAsIGBwdXNoYCwgYHJhbmdlYCwgYHJlYXJnYCwgYHJlamVjdGAsIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwKKyAqIGBzaHVmZmxlYCwgYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNvcnRCeUFsbGAsIGBzb3J0QnlPcmRlcmAsIGBzcGxpY2VgLAorICogYHNwcmVhZGAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBgdGFwYCwKKyAqIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRpbWVzYCwgYHRvQXJyYXlgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLAorICogYHVuaW9uYCwgYHVuaXFgLCBgdW5zaGlmdGAsIGB1bnppcGAsIGB2YWx1ZXNgLCBgdmFsdWVzSW5gLCBgd2hlcmVgLAorICogYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgemlwYCwgYW5kIGB6aXBPYmplY3RgCisgKgorICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IGFyZSAqKm5vdCoqIGNoYWluYWJsZSBieSBkZWZhdWx0IGFyZToKKyAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjbG9uZWAsIGBjbG9uZURlZXBgLCBgZGVidXJyYCwKKyAqIGBlbmRzV2l0aGAsIGBlc2NhcGVgLCBgZXNjYXBlUmVnRXhwYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwgYGZpbmRLZXlgLAorICogYGZpbmRMYXN0YCwgYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmluZFdoZXJlYCwgYGZpcnN0YCwgYGhhc2AsCisgKiBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLAorICogYGlzQm9vbGVhbmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsIGBpc0Vycm9yYCwKKyAqIGBpc0Zpbml0ZWAsYGlzRnVuY3Rpb25gLCBgaXNNYXRjaGAsIGBpc05hdGl2ZWAsIGBpc05hTmAsIGBpc051bGxgLCBgaXNOdW1iZXJgLAorICogYGlzT2JqZWN0YCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLAorICogYGlzVHlwZWRBcnJheWAsIGBqb2luYCwgYGtlYmFiQ2FzZWAsIGBsYXN0YCwgYGxhc3RJbmRleE9mYCwgYG1heGAsIGBtaW5gLAorICogYG5vQ29uZmxpY3RgLCBgbm93YCwgYHBhZGAsIGBwYWRMZWZ0YCwgYHBhZFJpZ2h0YCwgYHBhcnNlSW50YCwgYHBvcGAsCisgKiBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsIGByZXBlYXRgLCBgcmVzdWx0YCwgYHJ1bkluQ29udGV4dGAsCisgKiBgc2hpZnRgLCBgc2l6ZWAsIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRMYXN0SW5kZXhgLAorICogYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN1bWAsIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1MZWZ0YCwKKyAqIGB0cmltUmlnaHRgLCBgdHJ1bmNgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdmFsdWVgLCBhbmQgYHdvcmRzYAorICoKKyAqIFRoZSB3cmFwcGVyIG1ldGhvZCBgc2FtcGxlYCB3aWxsIHJldHVybiBhIHdyYXBwZWQgdmFsdWUgd2hlbiBgbmAgaXMgcHJvdmlkZWQsCisgKiBvdGhlcndpc2UgYW4gdW53cmFwcGVkIHZhbHVlIGlzIHJldHVybmVkLgorICoKKyAqIEBuYW1lIF8KKyAqIEBjb25zdHJ1Y3RvcgorICogQGNhdGVnb3J5IENoYWluCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuCisgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS4KKyAqIEBleGFtcGxlCisgKgorICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyLCAzXSk7CisgKgorICogLy8gcmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUKKyAqIHdyYXBwZWQucmVkdWNlKGZ1bmN0aW9uKHN1bSwgbikgeworICogICByZXR1cm4gc3VtICsgbjsKKyAqIH0pOworICogLy8gPT4gNgorICoKKyAqIC8vIHJldHVybnMgYSB3cmFwcGVkIHZhbHVlCisgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKGZ1bmN0aW9uKG4pIHsKKyAqICAgcmV0dXJuIG4gKiBuOworICogfSk7CisgKgorICogXy5pc0FycmF5KHNxdWFyZXMpOworICogLy8gPT4gZmFsc2UKKyAqCisgKiBfLmlzQXJyYXkoc3F1YXJlcy52YWx1ZSgpKTsKKyAqIC8vID0+IHRydWUKKyAqLworZnVuY3Rpb24gbG9kYXNoKHZhbHVlKSB7CisgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7CisgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fY2hhaW5fXycpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7CisgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTsKK30KKworLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLgorbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlOworCittb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDsKKworfSx7Ii4uL2ludGVybmFsL0xhenlXcmFwcGVyIjoyNywiLi4vaW50ZXJuYWwvTG9kYXNoV3JhcHBlciI6MjgsIi4uL2ludGVybmFsL2Jhc2VMb2Rhc2giOjQ3LCIuLi9pbnRlcm5hbC9pc09iamVjdExpa2UiOjgyLCIuLi9pbnRlcm5hbC93cmFwcGVyQ2xvbmUiOjkzLCIuLi9sYW5nL2lzQXJyYXkiOjk2fV0sMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYmFzZUVhY2gnKSwKKyAgICBjcmVhdGVGaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY3JlYXRlRmluZCcpOworCisvKioKKyAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnQKKyAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kCisgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgKgorICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgcHJlZGljYXRlYCB0aGUgY3JlYXRlZCBgXy5wcm9wZXJ0eWAKKyAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICoKKyAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgYHRoaXNBcmdgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNQcm9wZXJ0eWAKKyAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eQorICogdmFsdWUsIGVsc2UgYGZhbHNlYC4KKyAqCisgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlCisgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbgorICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEBhbGlhcyBkZXRlY3QKKyAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCisgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2VhcmNoLgorICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkCisgKiAgcGVyIGl0ZXJhdGlvbi4KKyAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC4KKyAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuCisgKiBAZXhhbXBsZQorICoKKyAqIHZhciB1c2VycyA9IFsKKyAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LAorICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LAorICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH0KKyAqIF07CisgKgorICogXy5yZXN1bHQoXy5maW5kKHVzZXJzLCBmdW5jdGlvbihjaHIpIHsKKyAqICAgcmV0dXJuIGNoci5hZ2UgPCA0MDsKKyAqIH0pLCAndXNlcicpOworICogLy8gPT4gJ2Jhcm5leScKKyAqCisgKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc2AgY2FsbGJhY2sgc2hvcnRoYW5kCisgKiBfLnJlc3VsdChfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pLCAndXNlcicpOworICogLy8gPT4gJ3BlYmJsZXMnCisgKgorICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kCisgKiBfLnJlc3VsdChfLmZpbmQodXNlcnMsICdhY3RpdmUnLCBmYWxzZSksICd1c2VyJyk7CisgKiAvLyA9PiAnZnJlZCcKKyAqCisgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZAorICogXy5yZXN1bHQoXy5maW5kKHVzZXJzLCAnYWN0aXZlJyksICd1c2VyJyk7CisgKiAvLyA9PiAnYmFybmV5JworICovCit2YXIgZmluZCA9IGNyZWF0ZUZpbmQoYmFzZUVhY2gpOworCittb2R1bGUuZXhwb3J0cyA9IGZpbmQ7CisKK30seyIuLi9pbnRlcm5hbC9iYXNlRWFjaCI6MzYsIi4uL2ludGVybmFsL2NyZWF0ZUZpbmQiOjY0fV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2FycmF5RWFjaCcpLAorICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYmFzZUVhY2gnKSwKKyAgICBjcmVhdGVGb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY3JlYXRlRm9yRWFjaCcpOworCisvKioKKyAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGludm9raW5nIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC4KKyAqIFRoZSBgaXRlcmF0ZWVgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKKyAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4gSXRlcmF0b3IgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseQorICogYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KKyAqCisgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciAiQ29sbGVjdGlvbnMiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIGBsZW5ndGhgIHByb3BlcnR5CisgKiBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgYF8uZm9ySW5gIG9yIGBfLmZvck93bmAKKyAqIG1heSBiZSB1c2VkIGZvciBvYmplY3QgaXRlcmF0aW9uLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAYWxpYXMgZWFjaAorICogQGNhdGVnb3J5IENvbGxlY3Rpb24KKyAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLgorICogQHJldHVybnMge0FycmF5fE9iamVjdHxzdHJpbmd9IFJldHVybnMgYGNvbGxlY3Rpb25gLgorICogQGV4YW1wbGUKKyAqCisgKiBfKFsxLCAyXSkuZm9yRWFjaChmdW5jdGlvbihuKSB7CisgKiAgIGNvbnNvbGUubG9nKG4pOworICogfSkudmFsdWUoKTsKKyAqIC8vID0+IGxvZ3MgZWFjaCB2YWx1ZSBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHJldHVybnMgdGhlIGFycmF5CisgKgorICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24obiwga2V5KSB7CisgKiAgIGNvbnNvbGUubG9nKG4sIGtleSk7CisgKiB9KTsKKyAqIC8vID0+IGxvZ3MgZWFjaCB2YWx1ZS1rZXkgcGFpciBhbmQgcmV0dXJucyB0aGUgb2JqZWN0IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpCisgKi8KK3ZhciBmb3JFYWNoID0gY3JlYXRlRm9yRWFjaChhcnJheUVhY2gsIGJhc2VFYWNoKTsKKworbW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoOworCit9LHsiLi4vaW50ZXJuYWwvYXJyYXlFYWNoIjozMCwiLi4vaW50ZXJuYWwvYmFzZUVhY2giOjM2LCIuLi9pbnRlcm5hbC9jcmVhdGVGb3JFYWNoIjo2NX1dLDIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2FycmF5TWFwJyksCisgICAgYmFzZUNhbGxiYWNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYmFzZUNhbGxiYWNrJyksCisgICAgYmFzZU1hcCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VNYXAnKSwKKyAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi4vbGFuZy9pc0FycmF5Jyk7CisKKy8qKgorICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocm91Z2gKKyAqIGBpdGVyYXRlZWAuIFRoZSBgaXRlcmF0ZWVgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlCisgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAqCisgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ucHJvcGVydHlgCisgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAqCisgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIGB0aGlzQXJnYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzUHJvcGVydHlgCisgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHkKKyAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuCisgKgorICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlCisgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbgorICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuCisgKgorICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGludGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZQorICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuCisgKgorICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6CisgKiBgYXJ5YCwgYGNhbGxiYWNrYCwgYGNodW5rYCwgYGNsb25lYCwgYGNyZWF0ZWAsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLAorICogYGRyb3BSaWdodGAsIGBldmVyeWAsIGBmaWxsYCwgYGZsYXR0ZW5gLCBgaW52ZXJ0YCwgYG1heGAsIGBtaW5gLCBgcGFyc2VJbnRgLAorICogYHNsaWNlYCwgYHNvcnRCeWAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1MZWZ0YCwKKyAqIGB0cmltUmlnaHRgLCBgdHJ1bmNgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHNhbXBsZWAsIGBzb21lYCwgYHVuaXFgLCBhbmQgYHdvcmRzYAorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAYWxpYXMgY29sbGVjdAorICogQGNhdGVnb3J5IENvbGxlY3Rpb24KKyAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZAorICogIHBlciBpdGVyYXRpb24uCisgKiAgY3JlYXRlIGEgYF8ucHJvcGVydHlgIG9yIGBfLm1hdGNoZXNgIHN0eWxlIGNhbGxiYWNrIHJlc3BlY3RpdmVseS4KKyAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLgorICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LgorICogQGV4YW1wbGUKKyAqCisgKiBmdW5jdGlvbiB0aW1lc1RocmVlKG4pIHsKKyAqICAgcmV0dXJuIG4gKiAzOworICogfQorICoKKyAqIF8ubWFwKFsxLCAyXSwgdGltZXNUaHJlZSk7CisgKiAvLyA9PiBbMywgNl0KKyAqCisgKiBfLm1hcCh7ICdhJzogMSwgJ2InOiAyIH0sIHRpbWVzVGhyZWUpOworICogLy8gPT4gWzMsIDZdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpCisgKgorICogdmFyIHVzZXJzID0gWworICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSwKKyAqICAgeyAndXNlcic6ICdmcmVkJyB9CisgKiBdOworICoKKyAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kCisgKiBfLm1hcCh1c2VycywgJ3VzZXInKTsKKyAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXQorICovCitmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIHRoaXNBcmcpIHsKKyAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwOworICBpdGVyYXRlZSA9IGJhc2VDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMyk7CisgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBtYXA7CisKK30seyIuLi9pbnRlcm5hbC9hcnJheU1hcCI6MzEsIi4uL2ludGVybmFsL2Jhc2VDYWxsYmFjayI6MzIsIi4uL2ludGVybmFsL2Jhc2VNYXAiOjQ4LCIuLi9sYW5nL2lzQXJyYXkiOjk2fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGlzTmF0aXZlID0gcmVxdWlyZSgnLi4vbGFuZy9pc05hdGl2ZScpOworCisvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwordmFyIG5hdGl2ZU5vdyA9IGlzTmF0aXZlKG5hdGl2ZU5vdyA9IERhdGUubm93KSAmJiBuYXRpdmVOb3c7CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgVW5peCBlcG9jaAorICogKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEBjYXRlZ29yeSBEYXRlCisgKiBAZXhhbXBsZQorICoKKyAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHsKKyAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTsKKyAqIH0sIF8ubm93KCkpOworICogLy8gPT4gbG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgZnVuY3Rpb24gdG8gYmUgaW52b2tlZAorICovCit2YXIgbm93ID0gbmF0aXZlTm93IHx8IGZ1bmN0aW9uKCkgeworICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7Cit9OworCittb2R1bGUuZXhwb3J0cyA9IG5vdzsKKworfSx7Ii4uL2xhbmcvaXNOYXRpdmUiOjk4fV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGNyZWF0ZVdyYXBwZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jcmVhdGVXcmFwcGVyJyksCisgICAgcmVwbGFjZUhvbGRlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZXBsYWNlSG9sZGVycycpLAorICAgIHJlc3RQYXJhbSA9IHJlcXVpcmUoJy4vcmVzdFBhcmFtJyk7CisKKy8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHdyYXBwZXIgbWV0YWRhdGEuICovCit2YXIgQklORF9GTEFHID0gMSwKKyAgICBQQVJUSUFMX0ZMQUcgPSAzMjsKKworLyoqCisgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AKKyAqIGFuZCBwcmVwZW5kcyBhbnkgYWRkaXRpb25hbCBgXy5iaW5kYCBhcmd1bWVudHMgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlCisgKiBib3VuZCBmdW5jdGlvbi4KKyAqCisgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcywKKyAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy4KKyAqCisgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAgdGhpcyBtZXRob2QgZG9lcyBub3Qgc2V0IHRoZSBgbGVuZ3RoYAorICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuCisgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC4KKyAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uCisgKiBAZXhhbXBsZQorICoKKyAqIHZhciBncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikgeworICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjsKKyAqIH07CisgKgorICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTsKKyAqCisgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7CisgKiBib3VuZCgnIScpOworICogLy8gPT4gJ2hpIGZyZWQhJworICoKKyAqIC8vIHVzaW5nIHBsYWNlaG9sZGVycworICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7CisgKiBib3VuZCgnaGknKTsKKyAqIC8vID0+ICdoaSBmcmVkIScKKyAqLwordmFyIGJpbmQgPSByZXN0UGFyYW0oZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHsKKyAgdmFyIGJpdG1hc2sgPSBCSU5EX0ZMQUc7CisgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHsKKyAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBiaW5kLnBsYWNlaG9sZGVyKTsKKyAgICBiaXRtYXNrIHw9IFBBUlRJQUxfRkxBRzsKKyAgfQorICByZXR1cm4gY3JlYXRlV3JhcHBlcihmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7Cit9KTsKKworLy8gQXNzaWduIGRlZmF1bHQgcGxhY2Vob2xkZXJzLgorYmluZC5wbGFjZWhvbGRlciA9IHt9OworCittb2R1bGUuZXhwb3J0cyA9IGJpbmQ7CisKK30seyIuLi9pbnRlcm5hbC9jcmVhdGVXcmFwcGVyIjo2OCwiLi4vaW50ZXJuYWwvcmVwbGFjZUhvbGRlcnMiOjg4LCIuL3Jlc3RQYXJhbSI6MjZ9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgIkZ1bmN0aW9ucyIgbWV0aG9kcy4gKi8KK3ZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7CisKKy8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCit2YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7CisKKy8qKgorICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlCisgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXMgYW4gYXJyYXkuCisgKgorICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZSBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0Z1bmN0aW9ucy9yZXN0X3BhcmFtZXRlcnMpLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uCisgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuCisgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KKyAqIEBleGFtcGxlCisgKgorICogdmFyIHNheSA9IF8ucmVzdFBhcmFtKGZ1bmN0aW9uKHdoYXQsIG5hbWVzKSB7CisgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICsKKyAqICAgICAoXy5zaXplKG5hbWVzKSA+IDEgPyAnLCAmICcgOiAnJykgKyBfLmxhc3QobmFtZXMpOworICogfSk7CisgKgorICogc2F5KCdoZWxsbycsICdmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJyk7CisgKiAvLyA9PiAnaGVsbG8gZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnCisgKi8KK2Z1bmN0aW9uIHJlc3RQYXJhbShmdW5jLCBzdGFydCkgeworICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTsKKyAgfQorICBzdGFydCA9IG5hdGl2ZU1heCh0eXBlb2Ygc3RhcnQgPT0gJ3VuZGVmaW5lZCcgPyAoZnVuYy5sZW5ndGggLSAxKSA6ICgrc3RhcnQgfHwgMCksIDApOworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCisgICAgICAgIGluZGV4ID0gLTEsCisgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSwKKyAgICAgICAgcmVzdCA9IEFycmF5KGxlbmd0aCk7CisKKyAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgICAgcmVzdFtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdOworICAgIH0KKyAgICBzd2l0Y2ggKHN0YXJ0KSB7CisgICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpcywgcmVzdCk7CisgICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJnc1swXSwgcmVzdCk7CisgICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgcmVzdCk7CisgICAgfQorICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpOworICAgIGluZGV4ID0gLTE7CisgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkgeworICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdOworICAgIH0KKyAgICBvdGhlckFyZ3Nbc3RhcnRdID0gcmVzdDsKKyAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBvdGhlckFyZ3MpOworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IHJlc3RQYXJhbTsKKworfSx7fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL2Jhc2VDcmVhdGUnKSwKKyAgICBiYXNlTG9kYXNoID0gcmVxdWlyZSgnLi9iYXNlTG9kYXNoJyk7CisKKy8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIGAtSW5maW5pdHlgIGFuZCBgSW5maW5pdHlgLiAqLwordmFyIFBPU0lUSVZFX0lORklOSVRZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOworCisvKioKKyAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC4KKyAqLworZnVuY3Rpb24gTGF6eVdyYXBwZXIodmFsdWUpIHsKKyAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlOworICB0aGlzLl9fYWN0aW9uc19fID0gbnVsbDsKKyAgdGhpcy5fX2Rpcl9fID0gMTsKKyAgdGhpcy5fX2Ryb3BDb3VudF9fID0gMDsKKyAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTsKKyAgdGhpcy5fX2l0ZXJhdGVlc19fID0gbnVsbDsKKyAgdGhpcy5fX3Rha2VDb3VudF9fID0gUE9TSVRJVkVfSU5GSU5JVFk7CisgIHRoaXMuX192aWV3c19fID0gbnVsbDsKK30KKworTGF6eVdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7CitMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjsKKworbW9kdWxlLmV4cG9ydHMgPSBMYXp5V3JhcHBlcjsKKworfSx7Ii4vYmFzZUNyZWF0ZSI6MzUsIi4vYmFzZUxvZGFzaCI6NDd9XSwyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vYmFzZUNyZWF0ZScpLAorICAgIGJhc2VMb2Rhc2ggPSByZXF1aXJlKCcuL2Jhc2VMb2Rhc2gnKTsKKworLyoqCisgKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLgorICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBjaGFpbmluZyBmb3IgYWxsIHdyYXBwZXIgbWV0aG9kcy4KKyAqIEBwYXJhbSB7QXJyYXl9IFthY3Rpb25zPVtdXSBBY3Rpb25zIHRvIHBlZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuCisgKi8KK2Z1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsLCBhY3Rpb25zKSB7CisgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTsKKyAgdGhpcy5fX2FjdGlvbnNfXyA9IGFjdGlvbnMgfHwgW107CisgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDsKK30KKworTG9kYXNoV3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKK0xvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjsKKworbW9kdWxlLmV4cG9ydHMgPSBMb2Rhc2hXcmFwcGVyOworCit9LHsiLi9iYXNlQ3JlYXRlIjozNSwiLi9iYXNlTG9kYXNoIjo0N31dLDI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLgorICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uCisgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KKyAqLworZnVuY3Rpb24gYXJyYXlDb3B5KHNvdXJjZSwgYXJyYXkpIHsKKyAgdmFyIGluZGV4ID0gLTEsCisgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOworCisgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpOworICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07CisgIH0KKyAgcmV0dXJuIGFycmF5OworfQorCittb2R1bGUuZXhwb3J0cyA9IGFycmF5Q29weTsKKworfSx7fV0sMzA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrCisgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KKyAqLworZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkgeworICB2YXIgaW5kZXggPSAtMSwKKyAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKKworICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGFycmF5OworfQorCittb2R1bGUuZXhwb3J0cyA9IGFycmF5RWFjaDsKKworfSx7fV0sMzE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2sKKyAqIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgorICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS4KKyAqLworZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7CisgIHZhciBpbmRleCA9IC0xLAorICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAorICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKKworICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBhcnJheU1hcDsKKworfSx7fV0sMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJhc2VNYXRjaGVzID0gcmVxdWlyZSgnLi9iYXNlTWF0Y2hlcycpLAorICAgIGJhc2VNYXRjaGVzUHJvcGVydHkgPSByZXF1aXJlKCcuL2Jhc2VNYXRjaGVzUHJvcGVydHknKSwKKyAgICBiYXNlUHJvcGVydHkgPSByZXF1aXJlKCcuL2Jhc2VQcm9wZXJ0eScpLAorICAgIGJpbmRDYWxsYmFjayA9IHJlcXVpcmUoJy4vYmluZENhbGxiYWNrJyksCisgICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuLi91dGlsaXR5L2lkZW50aXR5Jyk7CisKKy8qKgorICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2FsbGJhY2tgIHdoaWNoIHN1cHBvcnRzIHNwZWNpZnlpbmcgdGhlCisgKiBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suCisgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgorICogQHBhcmFtIHtudW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuCisgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLgorICovCitmdW5jdGlvbiBiYXNlQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHsKKyAgdmFyIHR5cGUgPSB0eXBlb2YgZnVuYzsKKyAgaWYgKHR5cGUgPT0gJ2Z1bmN0aW9uJykgeworICAgIHJldHVybiB0eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJworICAgICAgPyBmdW5jCisgICAgICA6IGJpbmRDYWxsYmFjayhmdW5jLCB0aGlzQXJnLCBhcmdDb3VudCk7CisgIH0KKyAgaWYgKGZ1bmMgPT0gbnVsbCkgeworICAgIHJldHVybiBpZGVudGl0eTsKKyAgfQorICBpZiAodHlwZSA9PSAnb2JqZWN0JykgeworICAgIHJldHVybiBiYXNlTWF0Y2hlcyhmdW5jKTsKKyAgfQorICByZXR1cm4gdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcKKyAgICA/IGJhc2VQcm9wZXJ0eShmdW5jICsgJycpCisgICAgOiBiYXNlTWF0Y2hlc1Byb3BlcnR5KGZ1bmMgKyAnJywgdGhpc0FyZyk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gYmFzZUNhbGxiYWNrOworCit9LHsiLi4vdXRpbGl0eS9pZGVudGl0eSI6MTA5LCIuL2Jhc2VNYXRjaGVzIjo0OSwiLi9iYXNlTWF0Y2hlc1Byb3BlcnR5Ijo1MCwiLi9iYXNlUHJvcGVydHkiOjUxLCIuL2JpbmRDYWxsYmFjayI6NTZ9XSwzMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYXJyYXlDb3B5ID0gcmVxdWlyZSgnLi9hcnJheUNvcHknKSwKKyAgICBhcnJheUVhY2ggPSByZXF1aXJlKCcuL2FycmF5RWFjaCcpLAorICAgIGJhc2VDb3B5ID0gcmVxdWlyZSgnLi9iYXNlQ29weScpLAorICAgIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL2Jhc2VGb3JPd24nKSwKKyAgICBpbml0Q2xvbmVBcnJheSA9IHJlcXVpcmUoJy4vaW5pdENsb25lQXJyYXknKSwKKyAgICBpbml0Q2xvbmVCeVRhZyA9IHJlcXVpcmUoJy4vaW5pdENsb25lQnlUYWcnKSwKKyAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL2luaXRDbG9uZU9iamVjdCcpLAorICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJyYXknKSwKKyAgICBpc0hvc3RPYmplY3QgPSByZXF1aXJlKCcuL2lzSG9zdE9iamVjdCcpLAorICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vbGFuZy9pc09iamVjdCcpLAorICAgIGtleXMgPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5cycpOworCisvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCit2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLAorICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJywKKyAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLAorICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsCisgICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLAorICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLAorICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLAorICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLAorICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLAorICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLAorICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLAorICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLAorICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7CisKK3ZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsCisgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLAorICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJywKKyAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsCisgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsCisgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsCisgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsCisgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJywKKyAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLAorICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7CisKKy8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovCit2YXIgY2xvbmVhYmxlVGFncyA9IHt9OworY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID0KK2Nsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9CitjbG9uZWFibGVUYWdzW2RhdGVUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9CitjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9CitjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0KK2Nsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9CitjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPQorY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPQorY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTsKK2Nsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9CitjbG9uZWFibGVUYWdzW21hcFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPQorY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOworCisvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKKworLyoqCisgKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZykKKyAqIG9mIHZhbHVlcy4KKyAqLwordmFyIG9ialRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7CisKKy8qKgorICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXJndW1lbnQganVnZ2xpbmcKKyAqIGFuZCBgdGhpc2AgYmluZGluZyBgY3VzdG9taXplcmAgZnVuY3Rpb25zLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS4KKyAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuCisgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCBgdmFsdWVgIGJlbG9uZ3MgdG8uCisgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLgorICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQj1bXV0gQXNzb2NpYXRlcyBjbG9uZXMgd2l0aCBzb3VyY2UgY291bnRlcnBhcnRzLgorICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS4KKyAqLworZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBpc0RlZXAsIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFja0EsIHN0YWNrQikgeworICB2YXIgcmVzdWx0OworICBpZiAoY3VzdG9taXplcikgeworICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0KSA6IGN1c3RvbWl6ZXIodmFsdWUpOworICB9CisgIGlmICh0eXBlb2YgcmVzdWx0ICE9ICd1bmRlZmluZWQnKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTsKKyAgaWYgKGlzQXJyKSB7CisgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpOworICAgIGlmICghaXNEZWVwKSB7CisgICAgICByZXR1cm4gYXJyYXlDb3B5KHZhbHVlLCByZXN1bHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB2YXIgdGFnID0gb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSksCisgICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnOworCisgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkgeworICAgICAgaWYgKGlzSG9zdE9iamVjdCh2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307CisgICAgICB9CisgICAgICByZXN1bHQgPSBpbml0Q2xvbmVPYmplY3QoaXNGdW5jID8ge30gOiB2YWx1ZSk7CisgICAgICBpZiAoIWlzRGVlcCkgeworICAgICAgICByZXR1cm4gYmFzZUNvcHkodmFsdWUsIHJlc3VsdCwga2V5cyh2YWx1ZSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2xvbmVhYmxlVGFnc1t0YWddCisgICAgICAgID8gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKQorICAgICAgICA6IChvYmplY3QgPyB2YWx1ZSA6IHt9KTsKKyAgICB9CisgIH0KKyAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBjb3JyZXNwb25kaW5nIGNsb25lLgorICBzdGFja0EgfHwgKHN0YWNrQSA9IFtdKTsKKyAgc3RhY2tCIHx8IChzdGFja0IgPSBbXSk7CisKKyAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7CisgIHdoaWxlIChsZW5ndGgtLSkgeworICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSB2YWx1ZSkgeworICAgICAgcmV0dXJuIHN0YWNrQltsZW5ndGhdOworICAgIH0KKyAgfQorICAvLyBBZGQgdGhlIHNvdXJjZSB2YWx1ZSB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGl0cyBjbG9uZS4KKyAgc3RhY2tBLnB1c2godmFsdWUpOworICBzdGFja0IucHVzaChyZXN1bHQpOworCisgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCisgIChpc0FyciA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7CisgICAgcmVzdWx0W2tleV0gPSBiYXNlQ2xvbmUoc3ViVmFsdWUsIGlzRGVlcCwgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2tBLCBzdGFja0IpOworICB9KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiYXNlQ2xvbmU7CisKK30seyIuLi9sYW5nL2lzQXJyYXkiOjk2LCIuLi9sYW5nL2lzT2JqZWN0Ijo5OSwiLi4vb2JqZWN0L2tleXMiOjEwNCwiLi9hcnJheUNvcHkiOjI5LCIuL2FycmF5RWFjaCI6MzAsIi4vYmFzZUNvcHkiOjM0LCIuL2Jhc2VGb3JPd24iOjQxLCIuL2luaXRDbG9uZUFycmF5Ijo3NSwiLi9pbml0Q2xvbmVCeVRhZyI6NzYsIi4vaW5pdENsb25lT2JqZWN0Ijo3NywiLi9pc0hvc3RPYmplY3QiOjc4fV0sMzQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBDb3BpZXMgdGhlIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KKyAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by4KKyAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBjb3B5LgorICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAqLworZnVuY3Rpb24gYmFzZUNvcHkoc291cmNlLCBvYmplY3QsIHByb3BzKSB7CisgIGlmICghcHJvcHMpIHsKKyAgICBwcm9wcyA9IG9iamVjdDsKKyAgICBvYmplY3QgPSB7fTsKKyAgfQorICB2YXIgaW5kZXggPSAtMSwKKyAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKKworICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07CisgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTsKKyAgfQorICByZXR1cm4gb2JqZWN0OworfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VDb3B5OworCit9LHt9XSwzNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKGdsb2JhbCl7Cit2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9sYW5nL2lzT2JqZWN0Jyk7CisKKy8qKgorICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZworICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uCisgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgorICovCit2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gT2JqZWN0KCkge30KKyAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvdHlwZSkgeworICAgIGlmIChpc09iamVjdChwcm90b3R5cGUpKSB7CisgICAgICBPYmplY3QucHJvdG90eXBlID0gcHJvdG90eXBlOworICAgICAgdmFyIHJlc3VsdCA9IG5ldyBPYmplY3Q7CisgICAgICBPYmplY3QucHJvdG90eXBlID0gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCB8fCBnbG9iYWwuT2JqZWN0KCk7CisgIH07Cit9KCkpOworCittb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7CisKK30pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQorCit9LHsiLi4vbGFuZy9pc09iamVjdCI6OTl9XSwzNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vYmFzZUZvck93bicpLAorICAgIGNyZWF0ZUJhc2VFYWNoID0gcmVxdWlyZSgnLi9jcmVhdGVCYXNlRWFjaCcpOworCisvKioKKyAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2sKKyAqIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R8c3RyaW5nfSBSZXR1cm5zIGBjb2xsZWN0aW9uYC4KKyAqLwordmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7CisKK21vZHVsZS5leHBvcnRzID0gYmFzZUVhY2g7CisKK30seyIuL2Jhc2VGb3JPd24iOjQxLCIuL2NyZWF0ZUJhc2VFYWNoIjo2MH1dLDM3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZGAsIGBfLmZpbmRMYXN0YCwgYF8uZmluZEtleWAsIGFuZCBgXy5maW5kTGFzdEtleWAsCisgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLCB3aGljaCBpdGVyYXRlcworICogb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgdGhlIHByb3ZpZGVkIGBlYWNoRnVuY2AuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzZWFyY2guCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLgorICogQHBhcmFtIHtib29sZWFufSBbcmV0S2V5XSBTcGVjaWZ5IHJldHVybmluZyB0aGUga2V5IG9mIHRoZSBmb3VuZCBlbGVtZW50CisgKiAgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuCisgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLgorICovCitmdW5jdGlvbiBiYXNlRmluZChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGVhY2hGdW5jLCByZXRLZXkpIHsKKyAgdmFyIHJlc3VsdDsKKyAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikgeworICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHsKKyAgICAgIHJlc3VsdCA9IHJldEtleSA/IGtleSA6IHZhbHVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZS5leHBvcnRzID0gYmFzZUZpbmQ7CisKK30se31dLDM4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dAorICogc3VwcG9ydCBmb3IgY2FsbGJhY2sgc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LgorICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KKyAqLworZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tUmlnaHQpIHsKKyAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCwKKyAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7CisKKyAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHsKKyAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgeworICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CisKK21vZHVsZS5leHBvcnRzID0gYmFzZUZpbmRJbmRleDsKKworfSx7fV0sMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL2NyZWF0ZUJhc2VGb3InKTsKKworLyoqCisgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvckluYCBhbmQgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzCisgKiBvdmVyIGBvYmplY3RgIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBpbnZva2luZyBgaXRlcmF0ZWVgIGZvcgorICogZWFjaCBwcm9wZXJ0eS4gSXRlcmF0b3IgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5CisgKiByZXR1cm5pbmcgYGZhbHNlYC4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLgorICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAqLwordmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7CisKK21vZHVsZS5leHBvcnRzID0gYmFzZUZvcjsKKworfSx7Ii4vY3JlYXRlQmFzZUZvciI6NjF9XSw0MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYmFzZUZvciA9IHJlcXVpcmUoJy4vYmFzZUZvcicpLAorICAgIGtleXNJbiA9IHJlcXVpcmUoJy4uL29iamVjdC9rZXlzSW4nKTsKKworLyoqCisgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjaworICogc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAqLworZnVuY3Rpb24gYmFzZUZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHsKKyAgcmV0dXJuIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5c0luKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9ySW47CisKK30seyIuLi9vYmplY3Qva2V5c0luIjoxMDUsIi4vYmFzZUZvciI6Mzl9XSw0MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYmFzZUZvciA9IHJlcXVpcmUoJy4vYmFzZUZvcicpLAorICAgIGtleXMgPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5cycpOworCisvKioKKyAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjaworICogc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAqLworZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7CisgIHJldHVybiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpOworfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VGb3JPd247CisKK30seyIuLi9vYmplY3Qva2V5cyI6MTA0LCIuL2Jhc2VGb3IiOjM5fV0sNDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGluZGV4T2ZOYU4gPSByZXF1aXJlKCcuL2luZGV4T2ZOYU4nKTsKKworLyoqCisgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGJpbmFyeSBzZWFyY2hlcy4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC4KKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KKyAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCisgKi8KK2Z1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7CisgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHsKKyAgICByZXR1cm4gaW5kZXhPZk5hTihhcnJheSwgZnJvbUluZGV4KTsKKyAgfQorICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLAorICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworCisgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHsKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VJbmRleE9mOworCit9LHsiLi9pbmRleE9mTmFOIjo3NH1dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL2Jhc2VJc0VxdWFsRGVlcCcpOworCisvKioKKyAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYHRoaXNgIGJpbmRpbmcKKyAqIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCisgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgorICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaW5nIHZhbHVlcy4KKyAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzTG9vc2VdIFNwZWNpZnkgcGVyZm9ybWluZyBwYXJ0aWFsIGNvbXBhcmlzb25zLgorICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQV0gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIG9iamVjdHMuCisgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCXSBUcmFja3MgdHJhdmVyc2VkIGBvdGhlcmAgb2JqZWN0cy4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCisgKi8KK2Z1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpIHsKKyAgLy8gRXhpdCBlYXJseSBmb3IgaWRlbnRpY2FsIHZhbHVlcy4KKyAgaWYgKHZhbHVlID09PSBvdGhlcikgeworICAgIC8vIFRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsLgorICAgIHJldHVybiB2YWx1ZSAhPT0gMCB8fCAoMSAvIHZhbHVlID09IDEgLyBvdGhlcik7CisgIH0KKyAgdmFyIHZhbFR5cGUgPSB0eXBlb2YgdmFsdWUsCisgICAgICBvdGhUeXBlID0gdHlwZW9mIG90aGVyOworCisgIC8vIEV4aXQgZWFybHkgZm9yIHVubGlrZSBwcmltaXRpdmUgdmFsdWVzLgorICBpZiAoKHZhbFR5cGUgIT0gJ2Z1bmN0aW9uJyAmJiB2YWxUeXBlICE9ICdvYmplY3QnICYmIG90aFR5cGUgIT0gJ2Z1bmN0aW9uJyAmJiBvdGhUeXBlICE9ICdvYmplY3QnKSB8fAorICAgICAgdmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsKSB7CisgICAgLy8gUmV0dXJuIGBmYWxzZWAgdW5sZXNzIGJvdGggdmFsdWVzIGFyZSBgTmFOYC4KKyAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjsKKyAgfQorICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYmFzZUlzRXF1YWwsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDsKKworfSx7Ii4vYmFzZUlzRXF1YWxEZWVwIjo0NH1dLDQ0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vZXF1YWxBcnJheXMnKSwKKyAgICBlcXVhbEJ5VGFnID0gcmVxdWlyZSgnLi9lcXVhbEJ5VGFnJyksCisgICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9lcXVhbE9iamVjdHMnKSwKKyAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi4vbGFuZy9pc0FycmF5JyksCisgICAgaXNIb3N0T2JqZWN0ID0gcmVxdWlyZSgnLi9pc0hvc3RPYmplY3QnKSwKKyAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuLi9sYW5nL2lzVHlwZWRBcnJheScpOworCisvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCit2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLAorICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJywKKyAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJywKKyAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJzsKKworLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi8KK3ZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CisKKy8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwordmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7CisKKy8qKgorICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpCisgKiBvZiB2YWx1ZXMuCisgKi8KK3ZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOworCisvKioKKyAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXMKKyAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXIKKyAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLgorICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyBvYmplY3RzLgorICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuCisgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy4KKyAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCisgKi8KK2Z1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7CisgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSwKKyAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksCisgICAgICBvYmpUYWcgPSBhcnJheVRhZywKKyAgICAgIG90aFRhZyA9IGFycmF5VGFnOworCisgIGlmICghb2JqSXNBcnIpIHsKKyAgICBvYmpUYWcgPSBvYmpUb1N0cmluZy5jYWxsKG9iamVjdCk7CisgICAgaWYgKG9ialRhZyA9PSBhcmdzVGFnKSB7CisgICAgICBvYmpUYWcgPSBvYmplY3RUYWc7CisgICAgfSBlbHNlIGlmIChvYmpUYWcgIT0gb2JqZWN0VGFnKSB7CisgICAgICBvYmpJc0FyciA9IGlzVHlwZWRBcnJheShvYmplY3QpOworICAgIH0KKyAgfQorICBpZiAoIW90aElzQXJyKSB7CisgICAgb3RoVGFnID0gb2JqVG9TdHJpbmcuY2FsbChvdGhlcik7CisgICAgaWYgKG90aFRhZyA9PSBhcmdzVGFnKSB7CisgICAgICBvdGhUYWcgPSBvYmplY3RUYWc7CisgICAgfSBlbHNlIGlmIChvdGhUYWcgIT0gb2JqZWN0VGFnKSB7CisgICAgICBvdGhJc0FyciA9IGlzVHlwZWRBcnJheShvdGhlcik7CisgICAgfQorICB9CisgIHZhciBvYmpJc09iaiA9IChvYmpUYWcgPT0gb2JqZWN0VGFnIHx8IChpc0xvb3NlICYmIG9ialRhZyA9PSBmdW5jVGFnKSkgJiYgIWlzSG9zdE9iamVjdChvYmplY3QpLAorICAgICAgb3RoSXNPYmogPSAob3RoVGFnID09IG9iamVjdFRhZyB8fCAoaXNMb29zZSAmJiBvdGhUYWcgPT0gZnVuY1RhZykpICYmICFpc0hvc3RPYmplY3Qob3RoZXIpLAorICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZzsKKworICBpZiAoaXNTYW1lVGFnICYmICEob2JqSXNBcnIgfHwgb2JqSXNPYmopKSB7CisgICAgcmV0dXJuIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnKTsKKyAgfQorICBpZiAoaXNMb29zZSkgeworICAgIGlmICghaXNTYW1lVGFnICYmICEob2JqSXNPYmogJiYgb3RoSXNPYmopKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIHZhciB2YWxXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLAorICAgICAgICBvdGhXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7CisKKyAgICBpZiAodmFsV3JhcHBlZCB8fCBvdGhXcmFwcGVkKSB7CisgICAgICByZXR1cm4gZXF1YWxGdW5jKHZhbFdyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCwgb3RoV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlciwgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpOworICAgIH0KKyAgICBpZiAoIWlzU2FtZVRhZykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuCisgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGRldGVjdGluZyBjaXJjdWxhciByZWZlcmVuY2VzIHNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI0pPLgorICBzdGFja0EgfHwgKHN0YWNrQSA9IFtdKTsKKyAgc3RhY2tCIHx8IChzdGFja0IgPSBbXSk7CisKKyAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7CisgIHdoaWxlIChsZW5ndGgtLSkgeworICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSBvYmplY3QpIHsKKyAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXSA9PSBvdGhlcjsKKyAgICB9CisgIH0KKyAgLy8gQWRkIGBvYmplY3RgIGFuZCBgb3RoZXJgIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy4KKyAgc3RhY2tBLnB1c2gob2JqZWN0KTsKKyAgc3RhY2tCLnB1c2gob3RoZXIpOworCisgIHZhciByZXN1bHQgPSAob2JqSXNBcnIgPyBlcXVhbEFycmF5cyA6IGVxdWFsT2JqZWN0cykob2JqZWN0LCBvdGhlciwgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQik7CisKKyAgc3RhY2tBLnBvcCgpOworICBzdGFja0IucG9wKCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbERlZXA7CisKK30seyIuLi9sYW5nL2lzQXJyYXkiOjk2LCIuLi9sYW5nL2lzVHlwZWRBcnJheSI6MTAyLCIuL2VxdWFsQXJyYXlzIjo2OSwiLi9lcXVhbEJ5VGFnIjo3MCwiLi9lcXVhbE9iamVjdHMiOjcxLCIuL2lzSG9zdE9iamVjdCI6Nzh9XSw0NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRnVuY3Rpb25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZW52aXJvbm1lbnRzCisgKiB3aXRoIGluY29ycmVjdCBgdHlwZW9mYCByZXN1bHRzLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuCisgKi8KK2Z1bmN0aW9uIGJhc2VJc0Z1bmN0aW9uKHZhbHVlKSB7CisgIC8vIEF2b2lkIGEgQ2hha3JhIEpJVCBidWcgaW4gY29tcGF0aWJpbGl0eSBtb2RlcyBvZiBJRSAxMS4KKyAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9pc3N1ZXMvMTYyMSBmb3IgbW9yZSBkZXRhaWxzLgorICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgfHwgZmFsc2U7Cit9CisKK21vZHVsZS5leHBvcnRzID0gYmFzZUlzRnVuY3Rpb247CisKK30se31dLDQ2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vYmFzZUlzRXF1YWwnKTsKKworLyoqCisgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrCisgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCisgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgc291cmNlIHByb3BlcnR5IG5hbWVzIHRvIG1hdGNoLgorICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBzb3VyY2UgdmFsdWVzIHRvIG1hdGNoLgorICogQHBhcmFtIHtBcnJheX0gc3RyaWN0Q29tcGFyZUZsYWdzIFN0cmljdCBjb21wYXJpc29uIGZsYWdzIGZvciBzb3VyY2UgdmFsdWVzLgorICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaW5nIG9iamVjdHMuCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLgorICovCitmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHByb3BzLCB2YWx1ZXMsIHN0cmljdENvbXBhcmVGbGFncywgY3VzdG9taXplcikgeworICB2YXIgaW5kZXggPSAtMSwKKyAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKKyAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyOworCisgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgc3RyaWN0Q29tcGFyZUZsYWdzW2luZGV4XSkKKyAgICAgICAgICA/IHZhbHVlc1tpbmRleF0gIT09IG9iamVjdFtwcm9wc1tpbmRleF1dCisgICAgICAgICAgOiAhKHByb3BzW2luZGV4XSBpbiBvYmplY3QpCisgICAgICAgICkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBpbmRleCA9IC0xOworICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgeworICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF0sCisgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sCisgICAgICAgIHNyY1ZhbHVlID0gdmFsdWVzW2luZGV4XTsKKworICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgc3RyaWN0Q29tcGFyZUZsYWdzW2luZGV4XSkgeworICAgICAgdmFyIHJlc3VsdCA9IHR5cGVvZiBvYmpWYWx1ZSAhPSAndW5kZWZpbmVkJyB8fCAoa2V5IGluIG9iamVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5KSA6IHVuZGVmaW5lZDsKKyAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIHJlc3VsdCA9IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgY3VzdG9taXplciwgdHJ1ZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghcmVzdWx0KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hdGNoOworCit9LHsiLi9iYXNlSXNFcXVhbCI6NDN9XSw0NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgYWxsIGNoYWluaW5nIHdyYXBwZXJzIGluaGVyaXQgZnJvbS4KKyAqCisgKiBAcHJpdmF0ZQorICovCitmdW5jdGlvbiBiYXNlTG9kYXNoKCkgeworICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLgorfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VMb2Rhc2g7CisKK30se31dLDQ4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vYmFzZUVhY2gnKTsKKworLyoqCisgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2sgc2hvcnRoYW5kcworICogYW5kIGB0aGlzYCBiaW5kaW5nLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS4KKyAqLworZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkgeworICB2YXIgcmVzdWx0ID0gW107CisgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKKyAgICByZXN1bHQucHVzaChpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSk7CisgIH0pOworICByZXR1cm4gcmVzdWx0OworfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7CisKK30seyIuL2Jhc2VFYWNoIjozNn1dLDQ5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlSXNNYXRjaCA9IHJlcXVpcmUoJy4vYmFzZUlzTWF0Y2gnKSwKKyAgICBjb25zdGFudCA9IHJlcXVpcmUoJy4uL3V0aWxpdHkvY29uc3RhbnQnKSwKKyAgICBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL2lzU3RyaWN0Q29tcGFyYWJsZScpLAorICAgIGtleXMgPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5cycpLAorICAgIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iamVjdCcpOworCisvKioKKyAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXMgbm90IGNsb25lIGBzb3VyY2VgLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkgeworICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksCisgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7CisKKyAgaWYgKCFsZW5ndGgpIHsKKyAgICByZXR1cm4gY29uc3RhbnQodHJ1ZSk7CisgIH0KKyAgaWYgKGxlbmd0aCA9PSAxKSB7CisgICAgdmFyIGtleSA9IHByb3BzWzBdLAorICAgICAgICB2YWx1ZSA9IHNvdXJjZVtrZXldOworCisgICAgaWYgKGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdFtrZXldID09PSB2YWx1ZSAmJgorICAgICAgICAgICh0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcgfHwgKGtleSBpbiB0b09iamVjdChvYmplY3QpKSk7CisgICAgICB9OworICAgIH0KKyAgfQorICB2YXIgdmFsdWVzID0gQXJyYXkobGVuZ3RoKSwKKyAgICAgIHN0cmljdENvbXBhcmVGbGFncyA9IEFycmF5KGxlbmd0aCk7CisKKyAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgdmFsdWUgPSBzb3VyY2VbcHJvcHNbbGVuZ3RoXV07CisgICAgdmFsdWVzW2xlbmd0aF0gPSB2YWx1ZTsKKyAgICBzdHJpY3RDb21wYXJlRmxhZ3NbbGVuZ3RoXSA9IGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSk7CisgIH0KKyAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBiYXNlSXNNYXRjaCh0b09iamVjdChvYmplY3QpLCBwcm9wcywgdmFsdWVzLCBzdHJpY3RDb21wYXJlRmxhZ3MpOworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzOworCit9LHsiLi4vb2JqZWN0L2tleXMiOjEwNCwiLi4vdXRpbGl0eS9jb25zdGFudCI6MTA4LCIuL2Jhc2VJc01hdGNoIjo0NiwiLi9pc1N0cmljdENvbXBhcmFibGUiOjgzLCIuL3RvT2JqZWN0Ijo5Mn1dLDUwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vYmFzZUlzRXF1YWwnKSwKKyAgICBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL2lzU3RyaWN0Q29tcGFyYWJsZScpLAorICAgIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iamVjdCcpOworCisvKioKKyAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lcyBub3QgY29lcmNlIGBrZXlgCisgKiB0byBhIHN0cmluZy4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkoa2V5LCB2YWx1ZSkgeworICBpZiAoaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSkgeworICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBvYmplY3Rba2V5XSA9PT0gdmFsdWUgJiYKKyAgICAgICAgKHR5cGVvZiB2YWx1ZSAhPSAndW5kZWZpbmVkJyB8fCAoa2V5IGluIHRvT2JqZWN0KG9iamVjdCkpKTsKKyAgICB9OworICB9CisgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgYmFzZUlzRXF1YWwodmFsdWUsIG9iamVjdFtrZXldLCBudWxsLCB0cnVlKTsKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5OworCit9LHsiLi9iYXNlSXNFcXVhbCI6NDMsIi4vaXNTdHJpY3RDb21wYXJhYmxlIjo4MywiLi90b09iamVjdCI6OTJ9XSw1MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5YCB3aGljaCBkb2VzIG5vdCBjb2VyY2UgYGtleWAgdG8gYSBzdHJpbmcuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldOworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eTsKKworfSx7fV0sNTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi4vdXRpbGl0eS9pZGVudGl0eScpLAorICAgIG1ldGFNYXAgPSByZXF1aXJlKCcuL21ldGFNYXAnKTsKKworLyoqCisgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBkZXRlY3Rpb24uCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLgorICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS4KKyAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuCisgKi8KK3ZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7CisgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpOworICByZXR1cm4gZnVuYzsKK307CisKK21vZHVsZS5leHBvcnRzID0gYmFzZVNldERhdGE7CisKK30seyIuLi91dGlsaXR5L2lkZW50aXR5IjoxMDksIi4vbWV0YU1hcCI6ODV9XSw1MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgaWYgaXQgaXMgbm90IG9uZS4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkCisgKiBmb3IgYG51bGxgIG9yIGB1bmRlZmluZWRgIHZhbHVlcy4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy4KKyAqLworZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7CisgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKyAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6ICh2YWx1ZSArICcnKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7CisKK30se31dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiaW5hcnlJbmRleEJ5ID0gcmVxdWlyZSgnLi9iaW5hcnlJbmRleEJ5JyksCisgICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuLi91dGlsaXR5L2lkZW50aXR5Jyk7CisKKy8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovCit2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IE1hdGgucG93KDIsIDMyKSAtIDEsCisgICAgSEFMRl9NQVhfQVJSQVlfTEVOR1RIID0gTUFYX0FSUkFZX0xFTkdUSCA+Pj4gMTsKKworLyoqCisgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAKKyAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC4KKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLgorICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LgorICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQKKyAqICBpbnRvIGBhcnJheWAuCisgKi8KK2Z1bmN0aW9uIGJpbmFyeUluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkgeworICB2YXIgbG93ID0gMCwKKyAgICAgIGhpZ2ggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IGxvdzsKKworICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09PSB2YWx1ZSAmJiBoaWdoIDw9IEhBTEZfTUFYX0FSUkFZX0xFTkdUSCkgeworICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7CisgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLAorICAgICAgICAgIGNvbXB1dGVkID0gYXJyYXlbbWlkXTsKKworICAgICAgaWYgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSB7CisgICAgICAgIGxvdyA9IG1pZCArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBoaWdoID0gbWlkOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGlnaDsKKyAgfQorICByZXR1cm4gYmluYXJ5SW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiaW5hcnlJbmRleDsKKworfSx7Ii4uL3V0aWxpdHkvaWRlbnRpdHkiOjEwOSwiLi9iaW5hcnlJbmRleEJ5Ijo1NX1dLDU1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgZmxvb3IgPSBNYXRoLmZsb29yOworCisvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwordmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluOworCisvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqLwordmFyIE1BWF9BUlJBWV9MRU5HVEggPSBNYXRoLnBvdygyLCAzMikgLSAxLAorICAgIE1BWF9BUlJBWV9JTkRFWCA9ICBNQVhfQVJSQVlfTEVOR1RIIC0gMTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJpbmFyeUluZGV4YCBleGNlcHQgdGhhdCBpdCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yCisgKiBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlCisgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguCisgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZAorICogIGludG8gYGFycmF5YC4KKyAqLworZnVuY3Rpb24gYmluYXJ5SW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlLCByZXRIaWdoZXN0KSB7CisgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpOworCisgIHZhciBsb3cgPSAwLAorICAgICAgaGlnaCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCwKKyAgICAgIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLAorICAgICAgdmFsSXNVbmRlZiA9IHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVkJzsKKworICB3aGlsZSAobG93IDwgaGlnaCkgeworICAgIHZhciBtaWQgPSBmbG9vcigobG93ICsgaGlnaCkgLyAyKSwKKyAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSwKKyAgICAgICAgaXNSZWZsZXhpdmUgPSBjb21wdXRlZCA9PT0gY29tcHV0ZWQ7CisKKyAgICBpZiAodmFsSXNOYU4pIHsKKyAgICAgIHZhciBzZXRMb3cgPSBpc1JlZmxleGl2ZSB8fCByZXRIaWdoZXN0OworICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZikgeworICAgICAgc2V0TG93ID0gaXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgdHlwZW9mIGNvbXB1dGVkICE9ICd1bmRlZmluZWQnKTsKKyAgICB9IGVsc2UgeworICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7CisgICAgfQorICAgIGlmIChzZXRMb3cpIHsKKyAgICAgIGxvdyA9IG1pZCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGhpZ2ggPSBtaWQ7CisgICAgfQorICB9CisgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiaW5hcnlJbmRleEJ5OworCit9LHt9XSw1NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuLi91dGlsaXR5L2lkZW50aXR5Jyk7CisKKy8qKgorICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlQ2FsbGJhY2tgIHdoaWNoIG9ubHkgc3VwcG9ydHMgYHRoaXNgIGJpbmRpbmcKKyAqIGFuZCBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLgorICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuCisgKiBAcGFyYW0ge251bWJlcn0gW2FyZ0NvdW50XSBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC4KKyAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgY2FsbGJhY2suCisgKi8KK2Z1bmN0aW9uIGJpbmRDYWxsYmFjayhmdW5jLCB0aGlzQXJnLCBhcmdDb3VudCkgeworICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgeworICAgIHJldHVybiBpZGVudGl0eTsKKyAgfQorICBpZiAodHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICByZXR1cm4gZnVuYzsKKyAgfQorICBzd2l0Y2ggKGFyZ0NvdW50KSB7CisgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUpOworICAgIH07CisgICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7CisgICAgfTsKKyAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CisgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOworICAgIH07CisgICAgY2FzZSA1OiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyLCBrZXksIG9iamVjdCwgc291cmNlKSB7CisgICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBvdGhlciwga2V5LCBvYmplY3QsIHNvdXJjZSk7CisgICAgfTsKKyAgfQorICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTsKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBiaW5kQ2FsbGJhY2s7CisKK30seyIuLi91dGlsaXR5L2lkZW50aXR5IjoxMDl9XSw1NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKGdsb2JhbCl7Cit2YXIgY29uc3RhbnQgPSByZXF1aXJlKCcuLi91dGlsaXR5L2NvbnN0YW50JyksCisgICAgaXNOYXRpdmUgPSByZXF1aXJlKCcuLi9sYW5nL2lzTmF0aXZlJyk7CisKKy8qKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgQXJyYXlCdWZmZXIgPSBpc05hdGl2ZShBcnJheUJ1ZmZlciA9IGdsb2JhbC5BcnJheUJ1ZmZlcikgJiYgQXJyYXlCdWZmZXIsCisgICAgYnVmZmVyU2xpY2UgPSBpc05hdGl2ZShidWZmZXJTbGljZSA9IEFycmF5QnVmZmVyICYmIG5ldyBBcnJheUJ1ZmZlcigwKS5zbGljZSkgJiYgYnVmZmVyU2xpY2UsCisgICAgZmxvb3IgPSBNYXRoLmZsb29yLAorICAgIFVpbnQ4QXJyYXkgPSBpc05hdGl2ZShVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkpICYmIFVpbnQ4QXJyYXk7CisKKy8qKiBVc2VkIHRvIGNsb25lIGFycmF5IGJ1ZmZlcnMuICovCit2YXIgRmxvYXQ2NEFycmF5ID0gKGZ1bmN0aW9uKCkgeworICAvLyBTYWZhcmkgNSBlcnJvcnMgd2hlbiB1c2luZyBhbiBhcnJheSBidWZmZXIgdG8gaW5pdGlhbGl6ZSBhIHR5cGVkIGFycmF5CisgIC8vIHdoZXJlIHRoZSBhcnJheSBidWZmZXIncyBgYnl0ZUxlbmd0aGAgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHR5cGVkCisgIC8vIGFycmF5J3MgYEJZVEVTX1BFUl9FTEVNRU5UYC4KKyAgdHJ5IHsKKyAgICB2YXIgZnVuYyA9IGlzTmF0aXZlKGZ1bmMgPSBnbG9iYWwuRmxvYXQ2NEFycmF5KSAmJiBmdW5jLAorICAgICAgICByZXN1bHQgPSBuZXcgZnVuYyhuZXcgQXJyYXlCdWZmZXIoMTApLCAwLCAxKSAmJiBmdW5jOworICB9IGNhdGNoKGUpIHt9CisgIHJldHVybiByZXN1bHQ7Cit9KCkpOworCisvKiogVXNlZCBhcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGVhY2ggYEZsb2F0NjRBcnJheWAgZWxlbWVudC4gKi8KK3ZhciBGTE9BVDY0X0JZVEVTX1BFUl9FTEVNRU5UID0gRmxvYXQ2NEFycmF5ID8gRmxvYXQ2NEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UIDogMDsKKworLyoqCisgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGdpdmVuIGFycmF5IGJ1ZmZlci4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuCisgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuCisgKi8KK2Z1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1ZmZlcikgeworICByZXR1cm4gYnVmZmVyU2xpY2UuY2FsbChidWZmZXIsIDApOworfQoraWYgKCFidWZmZXJTbGljZSkgeworICAvLyBQaGFudG9tSlMgaGFzIGBBcnJheUJ1ZmZlcmAgYW5kIGBVaW50OEFycmF5YCBidXQgbm90IGBGbG9hdDY0QXJyYXlgLgorICBidWZmZXJDbG9uZSA9ICEoQXJyYXlCdWZmZXIgJiYgVWludDhBcnJheSkgPyBjb25zdGFudChudWxsKSA6IGZ1bmN0aW9uKGJ1ZmZlcikgeworICAgIHZhciBieXRlTGVuZ3RoID0gYnVmZmVyLmJ5dGVMZW5ndGgsCisgICAgICAgIGZsb2F0TGVuZ3RoID0gRmxvYXQ2NEFycmF5ID8gZmxvb3IoYnl0ZUxlbmd0aCAvIEZMT0FUNjRfQllURVNfUEVSX0VMRU1FTlQpIDogMCwKKyAgICAgICAgb2Zmc2V0ID0gZmxvYXRMZW5ndGggKiBGTE9BVDY0X0JZVEVTX1BFUl9FTEVNRU5ULAorICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCk7CisKKyAgICBpZiAoZmxvYXRMZW5ndGgpIHsKKyAgICAgIHZhciB2aWV3ID0gbmV3IEZsb2F0NjRBcnJheShyZXN1bHQsIDAsIGZsb2F0TGVuZ3RoKTsKKyAgICAgIHZpZXcuc2V0KG5ldyBGbG9hdDY0QXJyYXkoYnVmZmVyLCAwLCBmbG9hdExlbmd0aCkpOworICAgIH0KKyAgICBpZiAoYnl0ZUxlbmd0aCAhPSBvZmZzZXQpIHsKKyAgICAgIHZpZXcgPSBuZXcgVWludDhBcnJheShyZXN1bHQsIG9mZnNldCk7CisgICAgICB2aWV3LnNldChuZXcgVWludDhBcnJheShidWZmZXIsIG9mZnNldCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlckNsb25lOworCit9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKKworfSx7Ii4uL2xhbmcvaXNOYXRpdmUiOjk4LCIuLi91dGlsaXR5L2NvbnN0YW50IjoxMDh9XSw1ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwordmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4OworCisvKioKKyAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLAorICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLgorICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkLgorICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLgorICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLgorICovCitmdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycykgeworICB2YXIgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLAorICAgICAgYXJnc0luZGV4ID0gLTEsCisgICAgICBhcmdzTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksCisgICAgICBsZWZ0SW5kZXggPSAtMSwKKyAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsCisgICAgICByZXN1bHQgPSBBcnJheShhcmdzTGVuZ3RoICsgbGVmdExlbmd0aCk7CisKKyAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkgeworICAgIHJlc3VsdFtsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTsKKyAgfQorICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7CisgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07CisgIH0KKyAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkgeworICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCittb2R1bGUuZXhwb3J0cyA9IGNvbXBvc2VBcmdzOworCit9LHt9XSw1OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwordmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4OworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb24KKyAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLgorICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuCisgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuCisgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuCisgKi8KK2Z1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMpIHsKKyAgdmFyIGhvbGRlcnNJbmRleCA9IC0xLAorICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLAorICAgICAgYXJnc0luZGV4ID0gLTEsCisgICAgICBhcmdzTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksCisgICAgICByaWdodEluZGV4ID0gLTEsCisgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCwKKyAgICAgIHJlc3VsdCA9IEFycmF5KGFyZ3NMZW5ndGggKyByaWdodExlbmd0aCk7CisKKyAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkgeworICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdOworICB9CisgIHZhciBwYWQgPSBhcmdzSW5kZXg7CisgIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkgeworICAgIHJlc3VsdFtwYWQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdOworICB9CisgIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHsKKyAgICByZXN1bHRbcGFkICsgaG9sZGVyc1tob2xkZXJzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4KytdOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZS5leHBvcnRzID0gY29tcG9zZUFyZ3NSaWdodDsKKworfSx7fV0sNjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLAorICAgIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iamVjdCcpOworCisvKioKKyAqIENyZWF0ZXMgYSBgYmFzZUVhY2hgIG9yIGBiYXNlRWFjaFJpZ2h0YCBmdW5jdGlvbi4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7CisgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7CisgICAgaWYgKCFpc0xlbmd0aChsZW5ndGgpKSB7CisgICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpOworICAgIH0KKyAgICB2YXIgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSwKKyAgICAgICAgaXRlcmFibGUgPSB0b09iamVjdChjb2xsZWN0aW9uKTsKKworICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7CisgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbGxlY3Rpb247CisgIH07Cit9CisKK21vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUVhY2g7CisKK30seyIuL2lzTGVuZ3RoIjo4MSwiLi90b09iamVjdCI6OTJ9XSw2MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL3RvT2JqZWN0Jyk7CisKKy8qKgorICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIGBfLmZvckluYCBvciBgXy5mb3JJblJpZ2h0YC4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuCisgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLgorICovCitmdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkgeworICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHsKKyAgICB2YXIgaXRlcmFibGUgPSB0b09iamVjdChvYmplY3QpLAorICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksCisgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKKyAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTsKKworICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7CisgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdOworICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9iamVjdDsKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yOworCit9LHsiLi90b09iamVjdCI6OTJ9XSw2MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKGdsb2JhbCl7Cit2YXIgY3JlYXRlQ3RvcldyYXBwZXIgPSByZXF1aXJlKCcuL2NyZWF0ZUN0b3JXcmFwcGVyJyk7CisKKy8qKgorICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBpbnZva2VzIGl0IHdpdGggdGhlIGB0aGlzYAorICogYmluZGluZyBvZiBgdGhpc0FyZ2AuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuCisgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUJpbmRXcmFwcGVyKGZ1bmMsIHRoaXNBcmcpIHsKKyAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yV3JhcHBlcihmdW5jKTsKKworICBmdW5jdGlvbiB3cmFwcGVyKCkgeworICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IGdsb2JhbCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYzsKKyAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTsKKyAgfQorICByZXR1cm4gd3JhcHBlcjsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCaW5kV3JhcHBlcjsKKworfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCisKK30seyIuL2NyZWF0ZUN0b3JXcmFwcGVyIjo2M31dLDYzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlQ3JlYXRlID0gcmVxdWlyZSgnLi9iYXNlQ3JlYXRlJyksCisgICAgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9sYW5nL2lzT2JqZWN0Jyk7CisKKy8qKgorICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoZXRoZXIgaXQgd2FzIGludm9rZWQgYXMgcGFydCBvZiBhIGBuZXdgIGV4cHJlc3Npb24gb3IgYnkgYGNhbGxgIG9yIGBhcHBseWAuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IEN0b3IgVGhlIGNvbnN0cnVjdG9yIHRvIHdyYXAuCisgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLgorICovCitmdW5jdGlvbiBjcmVhdGVDdG9yV3JhcHBlcihDdG9yKSB7CisgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSwKKyAgICAgICAgcmVzdWx0ID0gQ3Rvci5hcHBseSh0aGlzQmluZGluZywgYXJndW1lbnRzKTsKKworICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLgorICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy4KKyAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nOworICB9OworfQorCittb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUN0b3JXcmFwcGVyOworCit9LHsiLi4vbGFuZy9pc09iamVjdCI6OTksIi4vYmFzZUNyZWF0ZSI6MzV9XSw2NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYmFzZUNhbGxiYWNrID0gcmVxdWlyZSgnLi9iYXNlQ2FsbGJhY2snKSwKKyAgICBiYXNlRmluZCA9IHJlcXVpcmUoJy4vYmFzZUZpbmQnKSwKKyAgICBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9iYXNlRmluZEluZGV4JyksCisgICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpOworCisvKioKKyAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLgorICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuCisgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLgorICovCitmdW5jdGlvbiBjcmVhdGVGaW5kKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgdGhpc0FyZykgeworICAgIHByZWRpY2F0ZSA9IGJhc2VDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpOworICAgIGlmIChpc0FycmF5KGNvbGxlY3Rpb24pKSB7CisgICAgICB2YXIgaW5kZXggPSBiYXNlRmluZEluZGV4KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbVJpZ2h0KTsKKyAgICAgIHJldHVybiBpbmRleCA+IC0xID8gY29sbGVjdGlvbltpbmRleF0gOiB1bmRlZmluZWQ7CisgICAgfQorICAgIHJldHVybiBiYXNlRmluZChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGVhY2hGdW5jKTsKKyAgfQorfQorCittb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbmQ7CisKK30seyIuLi9sYW5nL2lzQXJyYXkiOjk2LCIuL2Jhc2VDYWxsYmFjayI6MzIsIi4vYmFzZUZpbmQiOjM3LCIuL2Jhc2VGaW5kSW5kZXgiOjM4fV0sNjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJpbmRDYWxsYmFjayA9IHJlcXVpcmUoJy4vYmluZENhbGxiYWNrJyksCisgICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpOworCisvKioKKyAqIENyZWF0ZXMgYSBmdW5jdGlvbiBmb3IgYF8uZm9yRWFjaGAgb3IgYF8uZm9yRWFjaFJpZ2h0YC4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtGdW5jdGlvbn0gYXJyYXlGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYW4gYXJyYXkuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi4KKyAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGVhY2ggZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZUZvckVhY2goYXJyYXlGdW5jLCBlYWNoRnVuYykgeworICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUsIHRoaXNBcmcpIHsKKyAgICByZXR1cm4gKHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0aGlzQXJnID09ICd1bmRlZmluZWQnICYmIGlzQXJyYXkoY29sbGVjdGlvbikpCisgICAgICA/IGFycmF5RnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSkKKyAgICAgIDogZWFjaEZ1bmMoY29sbGVjdGlvbiwgYmluZENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCAzKSk7CisgIH07Cit9CisKK21vZHVsZS5leHBvcnRzID0gY3JlYXRlRm9yRWFjaDsKKworfSx7Ii4uL2xhbmcvaXNBcnJheSI6OTYsIi4vYmluZENhbGxiYWNrIjo1Nn1dLDY2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlvbiAoZ2xvYmFsKXsKK3ZhciBhcnJheUNvcHkgPSByZXF1aXJlKCcuL2FycmF5Q29weScpLAorICAgIGNvbXBvc2VBcmdzID0gcmVxdWlyZSgnLi9jb21wb3NlQXJncycpLAorICAgIGNvbXBvc2VBcmdzUmlnaHQgPSByZXF1aXJlKCcuL2NvbXBvc2VBcmdzUmlnaHQnKSwKKyAgICBjcmVhdGVDdG9yV3JhcHBlciA9IHJlcXVpcmUoJy4vY3JlYXRlQ3RvcldyYXBwZXInKSwKKyAgICBpc0xhemlhYmxlID0gcmVxdWlyZSgnLi9pc0xhemlhYmxlJyksCisgICAgcmVvcmRlciA9IHJlcXVpcmUoJy4vcmVvcmRlcicpLAorICAgIHJlcGxhY2VIb2xkZXJzID0gcmVxdWlyZSgnLi9yZXBsYWNlSG9sZGVycycpLAorICAgIHNldERhdGEgPSByZXF1aXJlKCcuL3NldERhdGEnKTsKKworLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3Igd3JhcHBlciBtZXRhZGF0YS4gKi8KK3ZhciBCSU5EX0ZMQUcgPSAxLAorICAgIEJJTkRfS0VZX0ZMQUcgPSAyLAorICAgIENVUlJZX0JPVU5EX0ZMQUcgPSA0LAorICAgIENVUlJZX0ZMQUcgPSA4LAorICAgIENVUlJZX1JJR0hUX0ZMQUcgPSAxNiwKKyAgICBQQVJUSUFMX0ZMQUcgPSAzMiwKKyAgICBQQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NCwKKyAgICBBUllfRkxBRyA9IDEyODsKKworLyogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi8KK3ZhciBuYXRpdmVNYXggPSBNYXRoLm1heDsKKworLyoqCisgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGludm9rZXMgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2AKKyAqIGJpbmRpbmcgb2YsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHJlZmVyZW5jZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIG9mIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBwZXJgIGZvciBtb3JlIGRldGFpbHMuCisgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgorICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi4KKyAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLgorICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uCisgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuCisgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uCisgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuCisgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi4KKyAqLworZnVuY3Rpb24gY3JlYXRlSHlicmlkV3JhcHBlcihmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHsKKyAgdmFyIGlzQXJ5ID0gYml0bWFzayAmIEFSWV9GTEFHLAorICAgICAgaXNCaW5kID0gYml0bWFzayAmIEJJTkRfRkxBRywKKyAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiBCSU5EX0tFWV9GTEFHLAorICAgICAgaXNDdXJyeSA9IGJpdG1hc2sgJiBDVVJSWV9GTEFHLAorICAgICAgaXNDdXJyeUJvdW5kID0gYml0bWFzayAmIENVUlJZX0JPVU5EX0ZMQUcsCisgICAgICBpc0N1cnJ5UmlnaHQgPSBiaXRtYXNrICYgQ1VSUllfUklHSFRfRkxBRzsKKworICB2YXIgQ3RvciA9ICFpc0JpbmRLZXkgJiYgY3JlYXRlQ3RvcldyYXBwZXIoZnVuYyksCisgICAgICBrZXkgPSBmdW5jOworCisgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7CisgICAgLy8gQXZvaWQgYGFyZ3VtZW50c2Agb2JqZWN0IHVzZSBkaXNxdWFsaWZ5aW5nIG9wdGltaXphdGlvbnMgYnkKKyAgICAvLyBjb252ZXJ0aW5nIGl0IHRvIGFuIGFycmF5IGJlZm9yZSBwcm92aWRpbmcgaXQgdG8gb3RoZXIgZnVuY3Rpb25zLgorICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAorICAgICAgICBpbmRleCA9IGxlbmd0aCwKKyAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCk7CisKKyAgICB3aGlsZSAoaW5kZXgtLSkgeworICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdOworICAgIH0KKyAgICBpZiAocGFydGlhbHMpIHsKKyAgICAgIGFyZ3MgPSBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycyk7CisgICAgfQorICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7CisgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQpOworICAgIH0KKyAgICBpZiAoaXNDdXJyeSB8fCBpc0N1cnJ5UmlnaHQpIHsKKyAgICAgIHZhciBwbGFjZWhvbGRlciA9IHdyYXBwZXIucGxhY2Vob2xkZXIsCisgICAgICAgICAgYXJnc0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7CisKKyAgICAgIGxlbmd0aCAtPSBhcmdzSG9sZGVycy5sZW5ndGg7CisgICAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHsKKyAgICAgICAgdmFyIG5ld0FyZ1BvcyA9IGFyZ1BvcyA/IGFycmF5Q29weShhcmdQb3MpIDogbnVsbCwKKyAgICAgICAgICAgIG5ld0FyaXR5ID0gbmF0aXZlTWF4KGFyaXR5IC0gbGVuZ3RoLCAwKSwKKyAgICAgICAgICAgIG5ld3NIb2xkZXJzID0gaXNDdXJyeSA/IGFyZ3NIb2xkZXJzIDogbnVsbCwKKyAgICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyBudWxsIDogYXJnc0hvbGRlcnMsCisgICAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBhcmdzIDogbnVsbCwKKyAgICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gbnVsbCA6IGFyZ3M7CisKKyAgICAgICAgYml0bWFzayB8PSAoaXNDdXJyeSA/IFBBUlRJQUxfRkxBRyA6IFBBUlRJQUxfUklHSFRfRkxBRyk7CisgICAgICAgIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gUEFSVElBTF9SSUdIVF9GTEFHIDogUEFSVElBTF9GTEFHKTsKKworICAgICAgICBpZiAoIWlzQ3VycnlCb3VuZCkgeworICAgICAgICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTsKKyAgICAgICAgfQorICAgICAgICB2YXIgbmV3RGF0YSA9IFtmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3c0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsIG5ld0hvbGRlcnNSaWdodCwgbmV3QXJnUG9zLCBhcnksIG5ld0FyaXR5XSwKKyAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZFdyYXBwZXIuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTsKKworICAgICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkgeworICAgICAgICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgICAgdmFyIHRoaXNCaW5kaW5nID0gaXNCaW5kID8gdGhpc0FyZyA6IHRoaXM7CisgICAgaWYgKGlzQmluZEtleSkgeworICAgICAgZnVuYyA9IHRoaXNCaW5kaW5nW2tleV07CisgICAgfQorICAgIGlmIChhcmdQb3MpIHsKKyAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7CisgICAgfQorICAgIGlmIChpc0FyeSAmJiBhcnkgPCBhcmdzLmxlbmd0aCkgeworICAgICAgYXJncy5sZW5ndGggPSBhcnk7CisgICAgfQorICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IGdsb2JhbCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyAoQ3RvciB8fCBjcmVhdGVDdG9yV3JhcHBlcihmdW5jKSkgOiBmdW5jOworICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7CisgIH0KKyAgcmV0dXJuIHdyYXBwZXI7Cit9CisKK21vZHVsZS5leHBvcnRzID0gY3JlYXRlSHlicmlkV3JhcHBlcjsKKworfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCisKK30seyIuL2FycmF5Q29weSI6MjksIi4vY29tcG9zZUFyZ3MiOjU4LCIuL2NvbXBvc2VBcmdzUmlnaHQiOjU5LCIuL2NyZWF0ZUN0b3JXcmFwcGVyIjo2MywiLi9pc0xhemlhYmxlIjo4MCwiLi9yZW9yZGVyIjo4NywiLi9yZXBsYWNlSG9sZGVycyI6ODgsIi4vc2V0RGF0YSI6ODl9XSw2NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKGdsb2JhbCl7Cit2YXIgY3JlYXRlQ3RvcldyYXBwZXIgPSByZXF1aXJlKCcuL2NyZWF0ZUN0b3JXcmFwcGVyJyk7CisKKy8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHdyYXBwZXIgbWV0YWRhdGEuICovCit2YXIgQklORF9GTEFHID0gMTsKKworLyoqCisgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGludm9rZXMgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgCisgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvCisgKiB0aGUgd3JhcHBlci4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIG9mIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBwZXJgIGZvciBtb3JlIGRldGFpbHMuCisgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC4KKyAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uCisgKi8KK2Z1bmN0aW9uIGNyZWF0ZVBhcnRpYWxXcmFwcGVyKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7CisgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLAorICAgICAgQ3RvciA9IGNyZWF0ZUN0b3JXcmFwcGVyKGZ1bmMpOworCisgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7CisgICAgLy8gQXZvaWQgYGFyZ3VtZW50c2Agb2JqZWN0IHVzZSBkaXNxdWFsaWZ5aW5nIG9wdGltaXphdGlvbnMgYnkKKyAgICAvLyBjb252ZXJ0aW5nIGl0IHRvIGFuIGFycmF5IGJlZm9yZSBwcm92aWRpbmcgaXQgYGZ1bmNgLgorICAgIHZhciBhcmdzSW5kZXggPSAtMSwKKyAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCisgICAgICAgIGxlZnRJbmRleCA9IC0xLAorICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLAorICAgICAgICBhcmdzID0gQXJyYXkoYXJnc0xlbmd0aCArIGxlZnRMZW5ndGgpOworCisgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkgeworICAgICAgYXJnc1tsZWZ0SW5kZXhdID0gcGFydGlhbHNbbGVmdEluZGV4XTsKKyAgICB9CisgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkgeworICAgICAgYXJnc1tsZWZ0SW5kZXgrK10gPSBhcmd1bWVudHNbKythcmdzSW5kZXhdOworICAgIH0KKyAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSBnbG9iYWwgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7CisgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTsKKyAgfQorICByZXR1cm4gd3JhcHBlcjsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVQYXJ0aWFsV3JhcHBlcjsKKworfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCisKK30seyIuL2NyZWF0ZUN0b3JXcmFwcGVyIjo2M31dLDY4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlU2V0RGF0YSA9IHJlcXVpcmUoJy4vYmFzZVNldERhdGEnKSwKKyAgICBjcmVhdGVCaW5kV3JhcHBlciA9IHJlcXVpcmUoJy4vY3JlYXRlQmluZFdyYXBwZXInKSwKKyAgICBjcmVhdGVIeWJyaWRXcmFwcGVyID0gcmVxdWlyZSgnLi9jcmVhdGVIeWJyaWRXcmFwcGVyJyksCisgICAgY3JlYXRlUGFydGlhbFdyYXBwZXIgPSByZXF1aXJlKCcuL2NyZWF0ZVBhcnRpYWxXcmFwcGVyJyksCisgICAgZ2V0RGF0YSA9IHJlcXVpcmUoJy4vZ2V0RGF0YScpLAorICAgIG1lcmdlRGF0YSA9IHJlcXVpcmUoJy4vbWVyZ2VEYXRhJyksCisgICAgc2V0RGF0YSA9IHJlcXVpcmUoJy4vc2V0RGF0YScpOworCisvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB3cmFwcGVyIG1ldGFkYXRhLiAqLwordmFyIEJJTkRfRkxBRyA9IDEsCisgICAgQklORF9LRVlfRkxBRyA9IDIsCisgICAgUEFSVElBTF9GTEFHID0gMzIsCisgICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQ7CisKKy8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciAiRnVuY3Rpb25zIiBtZXRob2RzLiAqLwordmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJzsKKworLyogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi8KK3ZhciBuYXRpdmVNYXggPSBNYXRoLm1heDsKKworLyoqCisgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsCisgKiBgdGhpc2AgYmluZGluZyBhbmQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gcmVmZXJlbmNlLgorICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgb2YgZmxhZ3MuCisgKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6CisgKiAgICAgMSAtIGBfLmJpbmRgCisgKiAgICAgMiAtIGBfLmJpbmRLZXlgCisgKiAgICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uCisgKiAgICAgOCAtIGBfLmN1cnJ5YAorICogICAgMTYgLSBgXy5jdXJyeVJpZ2h0YAorICogICAgMzIgLSBgXy5wYXJ0aWFsYAorICogICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgCisgKiAgIDEyOCAtIGBfLnJlYXJnYAorICogICAyNTYgLSBgXy5hcnlgCisgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgorICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLgorICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuCisgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uCisgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuCisgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLgorICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi4KKyAqLworZnVuY3Rpb24gY3JlYXRlV3JhcHBlcihmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7CisgIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgQklORF9LRVlfRkxBRzsKKyAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgeworICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTsKKyAgfQorICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwOworICBpZiAoIWxlbmd0aCkgeworICAgIGJpdG1hc2sgJj0gfihQQVJUSUFMX0ZMQUcgfCBQQVJUSUFMX1JJR0hUX0ZMQUcpOworICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IG51bGw7CisgIH0KKyAgbGVuZ3RoIC09IChob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwKTsKKyAgaWYgKGJpdG1hc2sgJiBQQVJUSUFMX1JJR0hUX0ZMQUcpIHsKKyAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLAorICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzOworCisgICAgcGFydGlhbHMgPSBob2xkZXJzID0gbnVsbDsKKyAgfQorICB2YXIgZGF0YSA9IGlzQmluZEtleSA/IG51bGwgOiBnZXREYXRhKGZ1bmMpLAorICAgICAgbmV3RGF0YSA9IFtmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHldOworCisgIGlmIChkYXRhKSB7CisgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpOworICAgIGJpdG1hc2sgPSBuZXdEYXRhWzFdOworICAgIGFyaXR5ID0gbmV3RGF0YVs5XTsKKyAgfQorICBuZXdEYXRhWzldID0gYXJpdHkgPT0gbnVsbAorICAgID8gKGlzQmluZEtleSA/IDAgOiBmdW5jLmxlbmd0aCkKKyAgICA6IChuYXRpdmVNYXgoYXJpdHkgLSBsZW5ndGgsIDApIHx8IDApOworCisgIGlmIChiaXRtYXNrID09IEJJTkRfRkxBRykgeworICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kV3JhcHBlcihuZXdEYXRhWzBdLCBuZXdEYXRhWzJdKTsKKyAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBQQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoQklORF9GTEFHIHwgUEFSVElBTF9GTEFHKSkgJiYgIW5ld0RhdGFbNF0ubGVuZ3RoKSB7CisgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbFdyYXBwZXIuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWRXcmFwcGVyLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7CisgIH0KKyAgdmFyIHNldHRlciA9IGRhdGEgPyBiYXNlU2V0RGF0YSA6IHNldERhdGE7CisgIHJldHVybiBzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVXcmFwcGVyOworCit9LHsiLi9iYXNlU2V0RGF0YSI6NTIsIi4vY3JlYXRlQmluZFdyYXBwZXIiOjYyLCIuL2NyZWF0ZUh5YnJpZFdyYXBwZXIiOjY2LCIuL2NyZWF0ZVBhcnRpYWxXcmFwcGVyIjo2NywiLi9nZXREYXRhIjo3MiwiLi9tZXJnZURhdGEiOjg0LCIuL3NldERhdGEiOjg5fV0sNjk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yCisgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLgorICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgYXJyYXlzLgorICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuCisgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy4KKyAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0JdIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KKyAqLworZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7CisgIHZhciBpbmRleCA9IC0xLAorICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLAorICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoLAorICAgICAgcmVzdWx0ID0gdHJ1ZTsKKworICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzTG9vc2UgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBEZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLCBpZ25vcmluZyBub24tbnVtZXJpYyBwcm9wZXJ0aWVzLgorICB3aGlsZSAocmVzdWx0ICYmICsraW5kZXggPCBhcnJMZW5ndGgpIHsKKyAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sCisgICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdOworCisgICAgcmVzdWx0ID0gdW5kZWZpbmVkOworICAgIGlmIChjdXN0b21pemVyKSB7CisgICAgICByZXN1bHQgPSBpc0xvb3NlCisgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4KQorICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCk7CisgICAgfQorICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICd1bmRlZmluZWQnKSB7CisgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLgorICAgICAgaWYgKGlzTG9vc2UpIHsKKyAgICAgICAgdmFyIG90aEluZGV4ID0gb3RoTGVuZ3RoOworICAgICAgICB3aGlsZSAob3RoSW5kZXgtLSkgeworICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJbb3RoSW5kZXhdOworICAgICAgICAgIHJlc3VsdCA9IChhcnJWYWx1ZSAmJiBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUpIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKTsKKyAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IChhcnJWYWx1ZSAmJiBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUpIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuICEhcmVzdWx0OworfQorCittb2R1bGUuZXhwb3J0cyA9IGVxdWFsQXJyYXlzOworCit9LHt9XSw3MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCit2YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJywKKyAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLAorICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJywKKyAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJywKKyAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJywKKyAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJzsKKworLyoqCisgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mCisgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLgorICoKKyAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2YKKyAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIG9iamVjdCB0byBjb21wYXJlLgorICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS4KKyAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLgorICovCitmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZykgeworICBzd2l0Y2ggKHRhZykgeworICAgIGNhc2UgYm9vbFRhZzoKKyAgICBjYXNlIGRhdGVUYWc6CisgICAgICAvLyBDb2VyY2UgZGF0ZXMgYW5kIGJvb2xlYW5zIHRvIG51bWJlcnMsIGRhdGVzIHRvIG1pbGxpc2Vjb25kcyBhbmQgYm9vbGVhbnMKKyAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbC4KKyAgICAgIHJldHVybiArb2JqZWN0ID09ICtvdGhlcjsKKworICAgIGNhc2UgZXJyb3JUYWc6CisgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlOworCisgICAgY2FzZSBudW1iZXJUYWc6CisgICAgICAvLyBUcmVhdCBgTmFOYCB2cy4gYE5hTmAgYXMgZXF1YWwuCisgICAgICByZXR1cm4gKG9iamVjdCAhPSArb2JqZWN0KQorICAgICAgICA/IG90aGVyICE9ICtvdGhlcgorICAgICAgICAvLyBCdXQsIHRyZWF0IGAtMGAgdnMuIGArMGAgYXMgbm90IGVxdWFsLgorICAgICAgICA6IChvYmplY3QgPT0gMCA/ICgoMSAvIG9iamVjdCkgPT0gKDEgLyBvdGhlcikpIDogb2JqZWN0ID09ICtvdGhlcik7CisKKyAgICBjYXNlIHJlZ2V4cFRhZzoKKyAgICBjYXNlIHN0cmluZ1RhZzoKKyAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MgcHJpbWl0aXZlcyBhbmQgc3RyaW5nCisgICAgICAvLyBvYmplY3RzIGFzIGVxdWFsLiBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMTAuNi40IGZvciBtb3JlIGRldGFpbHMuCisgICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZXF1YWxCeVRhZzsKKworfSx7fV0sNzE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGtleXMgPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5cycpOworCisvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKKworLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovCit2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTsKKworLyoqCisgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvcgorICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS4KKyAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLgorICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuCisgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy4KKyAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0JdIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCisgKi8KK2Z1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7CisgIHZhciBvYmpQcm9wcyA9IGtleXMob2JqZWN0KSwKKyAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCwKKyAgICAgIG90aFByb3BzID0ga2V5cyhvdGhlciksCisgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7CisKKyAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzTG9vc2UpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdmFyIHNraXBDdG9yID0gaXNMb29zZSwKKyAgICAgIGluZGV4ID0gLTE7CisKKyAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHsKKyAgICB2YXIga2V5ID0gb2JqUHJvcHNbaW5kZXhdLAorICAgICAgICByZXN1bHQgPSBpc0xvb3NlID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KTsKKworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLAorICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTsKKworICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkOworICAgICAgaWYgKGN1c3RvbWl6ZXIpIHsKKyAgICAgICAgcmVzdWx0ID0gaXNMb29zZQorICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgb2JqVmFsdWUsIGtleSkKKyAgICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXkpOworICAgICAgfQorICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCisgICAgICAgIHJlc3VsdCA9IChvYmpWYWx1ZSAmJiBvYmpWYWx1ZSA9PT0gb3RoVmFsdWUpIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpOworICB9CisgIGlmICghc2tpcEN0b3IpIHsKKyAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvciwKKyAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yOworCisgICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuCisgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJgorICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiYKKyAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmCisgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK21vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzOworCit9LHsiLi4vb2JqZWN0L2tleXMiOjEwNH1dLDcyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBtZXRhTWFwID0gcmVxdWlyZSgnLi9tZXRhTWFwJyksCisgICAgbm9vcCA9IHJlcXVpcmUoJy4uL3V0aWxpdHkvbm9vcCcpOworCisvKioKKyAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuCisgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWV0YWRhdGEgZm9yIGBmdW5jYC4KKyAqLwordmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7CisgIHJldHVybiBtZXRhTWFwLmdldChmdW5jKTsKK307CisKK21vZHVsZS5leHBvcnRzID0gZ2V0RGF0YTsKKworfSx7Ii4uL3V0aWxpdHkvbm9vcCI6MTEwLCIuL21ldGFNYXAiOjg1fV0sNzM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vYmFzZVByb3BlcnR5JyksCisgICAgY29uc3RhbnQgPSByZXF1aXJlKCcuLi91dGlsaXR5L2NvbnN0YW50JyksCisgICAgcmVhbE5hbWVzID0gcmVxdWlyZSgnLi9yZWFsTmFtZXMnKSwKKyAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpOworCisvKioKKyAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3ZhciBnZXRGdW5jTmFtZSA9IChmdW5jdGlvbigpIHsKKyAgaWYgKCFzdXBwb3J0LmZ1bmNOYW1lcykgeworICAgIHJldHVybiBjb25zdGFudCgnJyk7CisgIH0KKyAgaWYgKGNvbnN0YW50Lm5hbWUgPT0gJ2NvbnN0YW50JykgeworICAgIHJldHVybiBiYXNlUHJvcGVydHkoJ25hbWUnKTsKKyAgfQorICByZXR1cm4gZnVuY3Rpb24oZnVuYykgeworICAgIHZhciByZXN1bHQgPSBmdW5jLm5hbWUsCisgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sCisgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKKworICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLAorICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYzsKKworICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7CisgICAgICAgIHJldHVybiBkYXRhLm5hbWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH07Cit9KCkpOworCittb2R1bGUuZXhwb3J0cyA9IGdldEZ1bmNOYW1lOworCit9LHsiLi4vc3VwcG9ydCI6MTA3LCIuLi91dGlsaXR5L2NvbnN0YW50IjoxMDgsIi4vYmFzZVByb3BlcnR5Ijo1MSwiLi9yZWFsTmFtZXMiOjg2fV0sNzQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworLyoqCisgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgTmFOYCBpcyBmb3VuZCBpbiBgYXJyYXlgLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCisgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KKyAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIGBOYU5gLCBlbHNlIGAtMWAuCisgKi8KK2Z1bmN0aW9uIGluZGV4T2ZOYU4oYXJyYXksIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7CisgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsCisgICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAwIDogLTEpOworCisgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7CisgICAgdmFyIG90aGVyID0gYXJyYXlbaW5kZXhdOworICAgIGlmIChvdGhlciAhPT0gb3RoZXIpIHsKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQorCittb2R1bGUuZXhwb3J0cyA9IGluZGV4T2ZOYU47CisKK30se31dLDc1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOworCisvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KK3ZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OworCisvKioKKyAqIEluaXRpYWxpemVzIGFuIGFycmF5IGNsb25lLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuCisgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLgorICovCitmdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkgeworICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAorICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7CisKKyAgLy8gQWRkIGFycmF5IHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYC4KKyAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHsKKyAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDsKKyAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCittb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUFycmF5OworCit9LHt9XSw3NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisoZnVuY3Rpb24gKGdsb2JhbCl7Cit2YXIgYnVmZmVyQ2xvbmUgPSByZXF1aXJlKCcuL2J1ZmZlckNsb25lJyk7CisKKy8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KK3ZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLAorICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsCisgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsCisgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsCisgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7CisKK3ZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsCisgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLAorICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJywKKyAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsCisgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsCisgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsCisgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsCisgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJywKKyAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLAorICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7CisKKy8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqLwordmFyIHJlRmxhZ3MgPSAvXHcqJC87CisKKy8qKiBVc2VkIHRvIGxvb2t1cCBhIHR5cGUgYXJyYXkgY29uc3RydWN0b3JzIGJ5IGB0b1N0cmluZ1RhZ2AuICovCit2YXIgY3RvckJ5VGFnID0ge307CitjdG9yQnlUYWdbZmxvYXQzMlRhZ10gPSBnbG9iYWwuRmxvYXQzMkFycmF5OworY3RvckJ5VGFnW2Zsb2F0NjRUYWddID0gZ2xvYmFsLkZsb2F0NjRBcnJheTsKK2N0b3JCeVRhZ1tpbnQ4VGFnXSA9IGdsb2JhbC5JbnQ4QXJyYXk7CitjdG9yQnlUYWdbaW50MTZUYWddID0gZ2xvYmFsLkludDE2QXJyYXk7CitjdG9yQnlUYWdbaW50MzJUYWddID0gZ2xvYmFsLkludDMyQXJyYXk7CitjdG9yQnlUYWdbdWludDhUYWddID0gZ2xvYmFsLlVpbnQ4QXJyYXk7CitjdG9yQnlUYWdbdWludDhDbGFtcGVkVGFnXSA9IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheTsKK2N0b3JCeVRhZ1t1aW50MTZUYWddID0gZ2xvYmFsLlVpbnQxNkFycmF5OworY3RvckJ5VGFnW3VpbnQzMlRhZ10gPSBnbG9iYWwuVWludDMyQXJyYXk7CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLgorICoKKyAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mCisgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC4KKyAqCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS4KKyAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS4KKyAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuCisgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS4KKyAqLworZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkgeworICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjsKKyAgc3dpdGNoICh0YWcpIHsKKyAgICBjYXNlIGFycmF5QnVmZmVyVGFnOgorICAgICAgcmV0dXJuIGJ1ZmZlckNsb25lKG9iamVjdCk7CisKKyAgICBjYXNlIGJvb2xUYWc6CisgICAgY2FzZSBkYXRlVGFnOgorICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpOworCisgICAgY2FzZSBmbG9hdDMyVGFnOiBjYXNlIGZsb2F0NjRUYWc6CisgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOgorICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6CisgICAgICAvLyBTYWZhcmkgNSBtb2JpbGUgaW5jb3JyZWN0bHkgaGFzIGBPYmplY3RgIGFzIHRoZSBjb25zdHJ1Y3RvciBvZiB0eXBlZCBhcnJheXMuCisgICAgICBpZiAoQ3RvciBpbnN0YW5jZW9mIEN0b3IpIHsKKyAgICAgICAgQ3RvciA9IGN0b3JCeVRhZ1t0YWddOworICAgICAgfQorICAgICAgdmFyIGJ1ZmZlciA9IG9iamVjdC5idWZmZXI7CisgICAgICByZXR1cm4gbmV3IEN0b3IoaXNEZWVwID8gYnVmZmVyQ2xvbmUoYnVmZmVyKSA6IGJ1ZmZlciwgb2JqZWN0LmJ5dGVPZmZzZXQsIG9iamVjdC5sZW5ndGgpOworCisgICAgY2FzZSBudW1iZXJUYWc6CisgICAgY2FzZSBzdHJpbmdUYWc6CisgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTsKKworICAgIGNhc2UgcmVnZXhwVGFnOgorICAgICAgdmFyIHJlc3VsdCA9IG5ldyBDdG9yKG9iamVjdC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhvYmplY3QpKTsKKyAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSBvYmplY3QubGFzdEluZGV4OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQnlUYWc7CisKK30pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQorCit9LHsiLi9idWZmZXJDbG9uZSI6NTd9XSw3NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLgorICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuCisgKi8KK2Z1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHsKKyAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7CisgIGlmICghKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IpKSB7CisgICAgQ3RvciA9IE9iamVjdDsKKyAgfQorICByZXR1cm4gbmV3IEN0b3I7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0OworCit9LHt9XSw3ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QgaW4gSUUgPCA5LgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgaG9zdCBvYmplY3QsIGVsc2UgYGZhbHNlYC4KKyAqLwordmFyIGlzSG9zdE9iamVjdCA9IChmdW5jdGlvbigpIHsKKyAgdHJ5IHsKKyAgICBPYmplY3QoeyAndG9TdHJpbmcnOiAwIH0gKyAnJyk7CisgIH0gY2F0Y2goZSkgeworICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9OworICB9CisgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgeworICAgIC8vIElFIDwgOSBwcmVzZW50cyBtYW55IGhvc3Qgb2JqZWN0cyBhcyBgT2JqZWN0YCBvYmplY3RzIHRoYXQgY2FuIGNvZXJjZQorICAgIC8vIHRvIHN0cmluZ3MgZGVzcGl0ZSBoYXZpbmcgaW1wcm9wZXJseSBkZWZpbmVkIGB0b1N0cmluZ2AgbWV0aG9kcy4KKyAgICByZXR1cm4gdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicgJiYgdHlwZW9mICh2YWx1ZSArICcnKSA9PSAnc3RyaW5nJzsKKyAgfTsKK30oKSk7CisKK21vZHVsZS5leHBvcnRzID0gaXNIb3N0T2JqZWN0OworCit9LHt9XSw3OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIFVzZWQgYXMgdGhlIFttYXhpbXVtIGxlbmd0aF0oaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW51bWJlci5tYXhfc2FmZV9pbnRlZ2VyKQorICogb2YgYW4gYXJyYXktbGlrZSB2YWx1ZS4KKyAqLwordmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxOworCisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuCisgKi8KK2Z1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkgeworICB2YWx1ZSA9ICt2YWx1ZTsKKyAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoOworICByZXR1cm4gdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4OworCit9LHt9XSw4MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgTGF6eVdyYXBwZXIgPSByZXF1aXJlKCcuL0xhenlXcmFwcGVyJyksCisgICAgZ2V0RnVuY05hbWUgPSByZXF1aXJlKCcuL2dldEZ1bmNOYW1lJyksCisgICAgbG9kYXNoID0gcmVxdWlyZSgnLi4vY2hhaW4vbG9kYXNoJyk7CisKKy8qKgorICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCwgZWxzZSBgZmFsc2VgLgorICovCitmdW5jdGlvbiBpc0xhemlhYmxlKGZ1bmMpIHsKKyAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyk7CisgIHJldHVybiAhIWZ1bmNOYW1lICYmIGZ1bmMgPT09IGxvZGFzaFtmdW5jTmFtZV0gJiYgZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlOworfQorCittb2R1bGUuZXhwb3J0cyA9IGlzTGF6aWFibGU7CisKK30seyIuLi9jaGFpbi9sb2Rhc2giOjIwLCIuL0xhenlXcmFwcGVyIjoyNywiLi9nZXRGdW5jTmFtZSI6NzN9XSw4MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIFVzZWQgYXMgdGhlIFttYXhpbXVtIGxlbmd0aF0oaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW51bWJlci5tYXhfc2FmZV9pbnRlZ2VyKQorICogb2YgYW4gYXJyYXktbGlrZSB2YWx1ZS4KKyAqLwordmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxOworCisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguCisgKgorICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gW2BUb0xlbmd0aGBdKGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2xlbmd0aCkuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC4KKyAqLworZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHsKKyAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7CisKK30se31dLDgyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC4KKyAqLworZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7CisgIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JzsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7CisKK30se31dLDgzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2xhbmcvaXNPYmplY3QnKTsKKworLyoqCisgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3QKKyAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLgorICovCitmdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAodmFsdWUgPT09IDAgPyAoKDEgLyB2YWx1ZSkgPiAwKSA6ICFpc09iamVjdCh2YWx1ZSkpOworfQorCittb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTsKKworfSx7Ii4uL2xhbmcvaXNPYmplY3QiOjk5fV0sODQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGFycmF5Q29weSA9IHJlcXVpcmUoJy4vYXJyYXlDb3B5JyksCisgICAgY29tcG9zZUFyZ3MgPSByZXF1aXJlKCcuL2NvbXBvc2VBcmdzJyksCisgICAgY29tcG9zZUFyZ3NSaWdodCA9IHJlcXVpcmUoJy4vY29tcG9zZUFyZ3NSaWdodCcpLAorICAgIHJlcGxhY2VIb2xkZXJzID0gcmVxdWlyZSgnLi9yZXBsYWNlSG9sZGVycycpOworCisvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB3cmFwcGVyIG1ldGFkYXRhLiAqLwordmFyIEJJTkRfRkxBRyA9IDEsCisgICAgQ1VSUllfQk9VTkRfRkxBRyA9IDQsCisgICAgQ1VSUllfRkxBRyA9IDgsCisgICAgQVJZX0ZMQUcgPSAxMjgsCisgICAgUkVBUkdfRkxBRyA9IDI1NjsKKworLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqLwordmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nOworCisvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwordmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluOworCisvKioKKyAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuCisgKgorICogTWVyZ2luZyBtZXRhZGF0YSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygd3JhcHBlcnMgcmVxdWlyZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uCisgKiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgbWV0aG9kcyBsaWtlIGBfLmJpbmRgLCBgXy5jdXJyeWAsIGFuZCBgXy5wYXJ0aWFsYAorICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZCBgXy5yZWFyZ2AKKyAqIGF1Z21lbnQgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGV4ZWN1dGVkIGltcG9ydGFudCwKKyAqIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2UgYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUKKyAqIGNvbW1vbiBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YCBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLgorICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuCisgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRhdGFgLgorICovCitmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7CisgIHZhciBiaXRtYXNrID0gZGF0YVsxXSwKKyAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sCisgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssCisgICAgICBpc0NvbW1vbiA9IG5ld0JpdG1hc2sgPCBBUllfRkxBRzsKKworICB2YXIgaXNDb21ibyA9CisgICAgKHNyY0JpdG1hc2sgPT0gQVJZX0ZMQUcgJiYgYml0bWFzayA9PSBDVVJSWV9GTEFHKSB8fAorICAgIChzcmNCaXRtYXNrID09IEFSWV9GTEFHICYmIGJpdG1hc2sgPT0gUkVBUkdfRkxBRyAmJiBkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pIHx8CisgICAgKHNyY0JpdG1hc2sgPT0gKEFSWV9GTEFHIHwgUkVBUkdfRkxBRykgJiYgYml0bWFzayA9PSBDVVJSWV9GTEFHKTsKKworICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC4KKyAgaWYgKCEoaXNDb21tb24gfHwgaXNDb21ibykpIHsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorICAvLyBVc2Ugc291cmNlIGB0aGlzQXJnYCBpZiBhdmFpbGFibGUuCisgIGlmIChzcmNCaXRtYXNrICYgQklORF9GTEFHKSB7CisgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTsKKyAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLgorICAgIG5ld0JpdG1hc2sgfD0gKGJpdG1hc2sgJiBCSU5EX0ZMQUcpID8gMCA6IENVUlJZX0JPVU5EX0ZMQUc7CisgIH0KKyAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy4KKyAgdmFyIHZhbHVlID0gc291cmNlWzNdOworICBpZiAodmFsdWUpIHsKKyAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdOworICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IGFycmF5Q29weSh2YWx1ZSk7CisgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogYXJyYXlDb3B5KHNvdXJjZVs0XSk7CisgIH0KKyAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy4KKyAgdmFsdWUgPSBzb3VyY2VbNV07CisgIGlmICh2YWx1ZSkgeworICAgIHBhcnRpYWxzID0gZGF0YVs1XTsKKyAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IGFycmF5Q29weSh2YWx1ZSk7CisgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogYXJyYXlDb3B5KHNvdXJjZVs2XSk7CisgIH0KKyAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuCisgIHZhbHVlID0gc291cmNlWzddOworICBpZiAodmFsdWUpIHsKKyAgICBkYXRhWzddID0gYXJyYXlDb3B5KHZhbHVlKTsKKyAgfQorICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci4KKyAgaWYgKHNyY0JpdG1hc2sgJiBBUllfRkxBRykgeworICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTsKKyAgfQorICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC4KKyAgaWYgKGRhdGFbOV0gPT0gbnVsbCkgeworICAgIGRhdGFbOV0gPSBzb3VyY2VbOV07CisgIH0KKyAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLgorICBkYXRhWzBdID0gc291cmNlWzBdOworICBkYXRhWzFdID0gbmV3Qml0bWFzazsKKworICByZXR1cm4gZGF0YTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBtZXJnZURhdGE7CisKK30seyIuL2FycmF5Q29weSI6MjksIi4vY29tcG9zZUFyZ3MiOjU4LCIuL2NvbXBvc2VBcmdzUmlnaHQiOjU5LCIuL3JlcGxhY2VIb2xkZXJzIjo4OH1dLDg1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlvbiAoZ2xvYmFsKXsKK3ZhciBpc05hdGl2ZSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNOYXRpdmUnKTsKKworLyoqIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi8KK3ZhciBXZWFrTWFwID0gaXNOYXRpdmUoV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwKSAmJiBXZWFrTWFwOworCisvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi8KK3ZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDsKKworbW9kdWxlLmV4cG9ydHMgPSBtZXRhTWFwOworCit9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKKworfSx7Ii4uL2xhbmcvaXNOYXRpdmUiOjk4fV0sODY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworLyoqIFVzZWQgdG8gbG9va3VwIHVubWluaWZpZWQgZnVuY3Rpb24gbmFtZXMuICovCit2YXIgcmVhbE5hbWVzID0ge307CisKK21vZHVsZS5leHBvcnRzID0gcmVhbE5hbWVzOworCit9LHt9XSw4NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYXJyYXlDb3B5ID0gcmVxdWlyZSgnLi9hcnJheUNvcHknKSwKKyAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9pc0luZGV4Jyk7CisKKy8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCit2YXIgbmF0aXZlTWluID0gTWF0aC5taW47CisKKy8qKgorICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXQKKyAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXQKKyAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLgorICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy4KKyAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgorICovCitmdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7CisgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsCisgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksCisgICAgICBvbGRBcnJheSA9IGFycmF5Q29weShhcnJheSk7CisKKyAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdOworICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkOworICB9CisgIHJldHVybiBhcnJheTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSByZW9yZGVyOworCit9LHsiLi9hcnJheUNvcHkiOjI5LCIuL2lzSW5kZXgiOjc5fV0sODg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqLwordmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nOworCisvKioKKyAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlcgorICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KKyAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHJlcGxhY2UuCisgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLgorICovCitmdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHsKKyAgdmFyIGluZGV4ID0gLTEsCisgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsCisgICAgICByZXNJbmRleCA9IC0xLAorICAgICAgcmVzdWx0ID0gW107CisKKyAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKKyAgICBpZiAoYXJyYXlbaW5kZXhdID09PSBwbGFjZWhvbGRlcikgeworICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7CisgICAgICByZXN1bHRbKytyZXNJbmRleF0gPSBpbmRleDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworbW9kdWxlLmV4cG9ydHMgPSByZXBsYWNlSG9sZGVyczsKKworfSx7fV0sODk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJhc2VTZXREYXRhID0gcmVxdWlyZSgnLi9iYXNlU2V0RGF0YScpLAorICAgIG5vdyA9IHJlcXVpcmUoJy4uL2RhdGUvbm93Jyk7CisKKy8qKiBVc2VkIHRvIGRldGVjdCB3aGVuIGEgZnVuY3Rpb24gYmVjb21lcyBob3QuICovCit2YXIgSE9UX0NPVU5UID0gMTUwLAorICAgIEhPVF9TUEFOID0gMTY7CisKKy8qKgorICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLgorICoKKyAqICoqTm90ZToqKiBJZiB0aGlzIGZ1bmN0aW9uIGJlY29tZXMgaG90LCBpLmUuIGlzIGludm9rZWQgYSBsb3QgaW4gYSBzaG9ydAorICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eSBmdW5jdGlvbgorICogdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjA3MCkKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLgorICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS4KKyAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuCisgKi8KK3ZhciBzZXREYXRhID0gKGZ1bmN0aW9uKCkgeworICB2YXIgY291bnQgPSAwLAorICAgICAgbGFzdENhbGxlZCA9IDA7CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICB2YXIgc3RhbXAgPSBub3coKSwKKyAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTsKKworICAgIGxhc3RDYWxsZWQgPSBzdGFtcDsKKyAgICBpZiAocmVtYWluaW5nID4gMCkgeworICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvdW50ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGJhc2VTZXREYXRhKGtleSwgdmFsdWUpOworICB9OworfSgpKTsKKworbW9kdWxlLmV4cG9ydHMgPSBzZXREYXRhOworCit9LHsiLi4vZGF0ZS9ub3ciOjI0LCIuL2Jhc2VTZXREYXRhIjo1Mn1dLDkwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlRm9ySW4gPSByZXF1aXJlKCcuL2Jhc2VGb3JJbicpLAorICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi4vbGFuZy9pc0FyZ3VtZW50cycpLAorICAgIGlzSG9zdE9iamVjdCA9IHJlcXVpcmUoJy4vaXNIb3N0T2JqZWN0JyksCisgICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKSwKKyAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpOworCisvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCit2YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7CisKKy8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOworCisvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KK3ZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OworCisvKioKKyAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKQorICogb2YgdmFsdWVzLgorICovCit2YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZzsKKworLyoqCisgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzUGxhaW5PYmplY3RgIHdoaWNoIGNoZWNrcyBpZiBgdmFsdWVgCisgKiBpcyBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGUgYE9iamVjdGAgY29uc3RydWN0b3Igb3IgaGFzIGEgYFtbUHJvdG90eXBlXV1gCisgKiBvZiBgbnVsbGAuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC4KKyAqLworZnVuY3Rpb24gc2hpbUlzUGxhaW5PYmplY3QodmFsdWUpIHsKKyAgdmFyIEN0b3I7CisKKyAgLy8gRXhpdCBlYXJseSBmb3Igbm9uIGBPYmplY3RgIG9iamVjdHMuCisgIGlmICghKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gb2JqZWN0VGFnICYmICFpc0hvc3RPYmplY3QodmFsdWUpKSB8fAorICAgICAgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY29uc3RydWN0b3InKSAmJgorICAgICAgICAoQ3RvciA9IHZhbHVlLmNvbnN0cnVjdG9yLCB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmICEoQ3RvciBpbnN0YW5jZW9mIEN0b3IpKSkgfHwKKyAgICAgICghc3VwcG9ydC5hcmdzVGFnICYmIGlzQXJndW1lbnRzKHZhbHVlKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gSUUgPCA5IGl0ZXJhdGVzIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGJlZm9yZSBvd24gcHJvcGVydGllcy4gSWYgdGhlIGZpcnN0CisgIC8vIGl0ZXJhdGVkIHByb3BlcnR5IGlzIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0eSB0aGVuIHRoZXJlIGFyZSBubyBpbmhlcml0ZWQKKyAgLy8gZW51bWVyYWJsZSBwcm9wZXJ0aWVzLgorICB2YXIgcmVzdWx0OworICBpZiAoc3VwcG9ydC5vd25MYXN0KSB7CisgICAgYmFzZUZvckluKHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5LCBvYmplY3QpIHsKKyAgICAgIHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQgIT09IGZhbHNlOworICB9CisgIC8vIEluIG1vc3QgZW52aXJvbm1lbnRzIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzIGFyZSBpdGVyYXRlZCBiZWZvcmUKKyAgLy8gaXRzIGluaGVyaXRlZCBwcm9wZXJ0aWVzLiBJZiB0aGUgbGFzdCBpdGVyYXRlZCBwcm9wZXJ0eSBpcyBhbiBvYmplY3QncworICAvLyBvd24gcHJvcGVydHkgdGhlbiB0aGVyZSBhcmUgbm8gaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy4KKyAgYmFzZUZvckluKHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7CisgICAgcmVzdWx0ID0ga2V5OworICB9KTsKKyAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT0gJ3VuZGVmaW5lZCcgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcmVzdWx0KTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBzaGltSXNQbGFpbk9iamVjdDsKKworfSx7Ii4uL2xhbmcvaXNBcmd1bWVudHMiOjk1LCIuLi9zdXBwb3J0IjoxMDcsIi4vYmFzZUZvckluIjo0MCwiLi9pc0hvc3RPYmplY3QiOjc4LCIuL2lzT2JqZWN0TGlrZSI6ODJ9XSw5MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJndW1lbnRzJyksCisgICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpLAorICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL2lzSW5kZXgnKSwKKyAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSwKKyAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL2xhbmcvaXNTdHJpbmcnKSwKKyAgICBrZXlzSW4gPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5c0luJyksCisgICAgc3VwcG9ydCA9IHJlcXVpcmUoJy4uL3N1cHBvcnQnKTsKKworLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi8KK3ZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CisKKy8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwordmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7CisKKy8qKgorICogQSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiBgT2JqZWN0LmtleXNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlCisgKiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCisgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgorICovCitmdW5jdGlvbiBzaGltS2V5cyhvYmplY3QpIHsKKyAgdmFyIHByb3BzID0ga2V5c0luKG9iamVjdCksCisgICAgICBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aCwKKyAgICAgIGxlbmd0aCA9IHByb3BzTGVuZ3RoICYmIG9iamVjdC5sZW5ndGg7CisKKyAgdmFyIGFsbG93SW5kZXhlcyA9IGxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmCisgICAgKGlzQXJyYXkob2JqZWN0KSB8fCAoc3VwcG9ydC5ub25FbnVtU3RyaW5ncyAmJiBpc1N0cmluZyhvYmplY3QpKSB8fAorICAgICAgKHN1cHBvcnQubm9uRW51bUFyZ3MgJiYgaXNBcmd1bWVudHMob2JqZWN0KSkpOworCisgIHZhciBpbmRleCA9IC0xLAorICAgICAgcmVzdWx0ID0gW107CisKKyAgd2hpbGUgKCsraW5kZXggPCBwcm9wc0xlbmd0aCkgeworICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07CisgICAgaWYgKChhbGxvd0luZGV4ZXMgJiYgaXNJbmRleChrZXksIGxlbmd0aCkpIHx8IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7CisgICAgICByZXN1bHQucHVzaChrZXkpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCittb2R1bGUuZXhwb3J0cyA9IHNoaW1LZXlzOworCit9LHsiLi4vbGFuZy9pc0FyZ3VtZW50cyI6OTUsIi4uL2xhbmcvaXNBcnJheSI6OTYsIi4uL2xhbmcvaXNTdHJpbmciOjEwMSwiLi4vb2JqZWN0L2tleXNJbiI6MTA1LCIuLi9zdXBwb3J0IjoxMDcsIi4vaXNJbmRleCI6NzksIi4vaXNMZW5ndGgiOjgxfV0sOTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vbGFuZy9pc09iamVjdCcpLAorICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi4vbGFuZy9pc1N0cmluZycpLAorICAgIHN1cHBvcnQgPSByZXF1aXJlKCcuLi9zdXBwb3J0Jyk7CisKKy8qKgorICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBvYmplY3QgaWYgaXQgaXMgbm90IG9uZS4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy4KKyAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG9iamVjdC4KKyAqLworZnVuY3Rpb24gdG9PYmplY3QodmFsdWUpIHsKKyAgaWYgKHN1cHBvcnQudW5pbmRleGVkQ2hhcnMgJiYgaXNTdHJpbmcodmFsdWUpKSB7CisgICAgdmFyIGluZGV4ID0gLTEsCisgICAgICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCwKKyAgICAgICAgcmVzdWx0ID0gT2JqZWN0KHZhbHVlKTsKKworICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgICByZXN1bHRbaW5kZXhdID0gdmFsdWUuY2hhckF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICByZXR1cm4gaXNPYmplY3QodmFsdWUpID8gdmFsdWUgOiBPYmplY3QodmFsdWUpOworfQorCittb2R1bGUuZXhwb3J0cyA9IHRvT2JqZWN0OworCit9LHsiLi4vbGFuZy9pc09iamVjdCI6OTksIi4uL2xhbmcvaXNTdHJpbmciOjEwMSwiLi4vc3VwcG9ydCI6MTA3fV0sOTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIExhenlXcmFwcGVyID0gcmVxdWlyZSgnLi9MYXp5V3JhcHBlcicpLAorICAgIExvZGFzaFdyYXBwZXIgPSByZXF1aXJlKCcuL0xvZGFzaFdyYXBwZXInKSwKKyAgICBhcnJheUNvcHkgPSByZXF1aXJlKCcuL2FycmF5Q29weScpOworCisvKioKKyAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLgorICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuCisgKi8KK2Z1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7CisgIHJldHVybiB3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIKKyAgICA/IHdyYXBwZXIuY2xvbmUoKQorICAgIDogbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18sIGFycmF5Q29weSh3cmFwcGVyLl9fYWN0aW9uc19fKSk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gd3JhcHBlckNsb25lOworCit9LHsiLi9MYXp5V3JhcHBlciI6MjcsIi4vTG9kYXNoV3JhcHBlciI6MjgsIi4vYXJyYXlDb3B5IjoyOX1dLDk0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBiYXNlQ2xvbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iYXNlQ2xvbmUnKSwKKyAgICBiaW5kQ2FsbGJhY2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iaW5kQ2FsbGJhY2snKTsKKworLyoqCisgKiBDcmVhdGVzIGEgZGVlcCBjbG9uZSBvZiBgdmFsdWVgLiBJZiBgY3VzdG9taXplcmAgaXMgcHJvdmlkZWQgaXQgaXMgaW52b2tlZAorICogdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAgY2xvbmluZworICogaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgYm91bmQgdG8gYHRoaXNBcmdgCisgKiBhbmQgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudDsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0XSkuCisgKgorICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlCisgKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZnJhc3RydWN0dXJlLmh0bWwjaW50ZXJuYWwtc3RydWN0dXJlZC1jbG9uaW5nLWFsZ29yaXRobSkuCisgKiBUaGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYW5kIG9iamVjdHMgY3JlYXRlZCBieQorICogY29uc3RydWN0b3JzIG90aGVyIHRoYW4gYE9iamVjdGAgYXJlIGNsb25lZCB0byBwbGFpbiBgT2JqZWN0YCBvYmplY3RzLiBBbgorICogZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaCBhcyBmdW5jdGlvbnMsIERPTSBub2RlcywKKyAqIE1hcHMsIFNldHMsIGFuZCBXZWFrTWFwcy4KKyAqCisgKiBAc3RhdGljCisgKiBAbWVtYmVyT2YgXworICogQGNhdGVnb3J5IExhbmcKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGRlZXAgY2xvbmUuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy4KKyAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY3VzdG9taXplcmAuCisgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuCisgKiBAZXhhbXBsZQorICoKKyAqIHZhciB1c2VycyA9IFsKKyAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sCisgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfQorICogXTsKKyAqCisgKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKHVzZXJzKTsKKyAqIGRlZXBbMF0gPT09IHVzZXJzWzBdOworICogLy8gPT4gZmFsc2UKKyAqCisgKiAvLyB1c2luZyBhIGN1c3RvbWl6ZXIgY2FsbGJhY2sKKyAqIHZhciBlbCA9IF8uY2xvbmVEZWVwKGRvY3VtZW50LmJvZHksIGZ1bmN0aW9uKHZhbHVlKSB7CisgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHsKKyAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpOworICogICB9CisgKiB9KTsKKyAqCisgKiBlbCA9PT0gZG9jdW1lbnQuYm9keQorICogLy8gPT4gZmFsc2UKKyAqIGVsLm5vZGVOYW1lCisgKiAvLyA9PiBCT0RZCisgKiBlbC5jaGlsZE5vZGVzLmxlbmd0aDsKKyAqIC8vID0+IDIwCisgKi8KK2Z1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSwgY3VzdG9taXplciwgdGhpc0FyZykgeworICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyAmJiBiaW5kQ2FsbGJhY2soY3VzdG9taXplciwgdGhpc0FyZywgMSk7CisgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIHRydWUsIGN1c3RvbWl6ZXIpOworfQorCittb2R1bGUuZXhwb3J0cyA9IGNsb25lRGVlcDsKKworfSx7Ii4uL2ludGVybmFsL2Jhc2VDbG9uZSI6MzMsIi4uL2ludGVybmFsL2JpbmRDYWxsYmFjayI6NTZ9XSw5NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgaXNMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc0xlbmd0aCcpLAorICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzT2JqZWN0TGlrZScpLAorICAgIHN1cHBvcnQgPSByZXF1aXJlKCcuLi9zdXBwb3J0Jyk7CisKKy8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KK3ZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7CisKKy8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOworCisvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KK3ZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OworCisvKioKKyAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKQorICogb2YgdmFsdWVzLgorICovCit2YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZzsKKworLyoqIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi8KK3ZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlOworCisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgTGFuZworICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLgorICogQGV4YW1wbGUKKyAqCisgKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpOworICogLy8gPT4gdHJ1ZQorICoKKyAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTsKKyAqIC8vID0+IGZhbHNlCisgKi8KK2Z1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7CisgIHZhciBsZW5ndGggPSBpc09iamVjdExpa2UodmFsdWUpID8gdmFsdWUubGVuZ3RoIDogdW5kZWZpbmVkOworICByZXR1cm4gaXNMZW5ndGgobGVuZ3RoKSAmJiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzVGFnOworfQorLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGEgYHRvU3RyaW5nVGFnYCBmb3IgYGFyZ3VtZW50c2Agb2JqZWN0cy4KK2lmICghc3VwcG9ydC5hcmdzVGFnKSB7CisgIGlzQXJndW1lbnRzID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICB2YXIgbGVuZ3RoID0gaXNPYmplY3RMaWtlKHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IHVuZGVmaW5lZDsKKyAgICByZXR1cm4gaXNMZW5ndGgobGVuZ3RoKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiYKKyAgICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7CisgIH07Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7CisKK30seyIuLi9pbnRlcm5hbC9pc0xlbmd0aCI6ODEsIi4uL2ludGVybmFsL2lzT2JqZWN0TGlrZSI6ODIsIi4uL3N1cHBvcnQiOjEwN31dLDk2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBpc0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzTGVuZ3RoJyksCisgICAgaXNOYXRpdmUgPSByZXF1aXJlKCcuL2lzTmF0aXZlJyksCisgICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNPYmplY3RMaWtlJyk7CisKKy8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KK3ZhciBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XSc7CisKKy8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOworCisvKioKKyAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKQorICogb2YgdmFsdWVzLgorICovCit2YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZzsKKworLyogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi8KK3ZhciBuYXRpdmVJc0FycmF5ID0gaXNOYXRpdmUobmF0aXZlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkpICYmIG5hdGl2ZUlzQXJyYXk7CisKKy8qKgorICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC4KKyAqCisgKiBAc3RhdGljCisgKiBAbWVtYmVyT2YgXworICogQGNhdGVnb3J5IExhbmcKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC4KKyAqIEBleGFtcGxlCisgKgorICogXy5pc0FycmF5KFsxLCAyLCAzXSk7CisgKiAvLyA9PiB0cnVlCisgKgorICogXy5pc0FycmF5KGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpOworICogLy8gPT4gZmFsc2UKKyAqLwordmFyIGlzQXJyYXkgPSBuYXRpdmVJc0FycmF5IHx8IGZ1bmN0aW9uKHZhbHVlKSB7CisgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJyYXlUYWc7Cit9OworCittb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7CisKK30seyIuLi9pbnRlcm5hbC9pc0xlbmd0aCI6ODEsIi4uL2ludGVybmFsL2lzT2JqZWN0TGlrZSI6ODIsIi4vaXNOYXRpdmUiOjk4fV0sOTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeworKGZ1bmN0aW9uIChnbG9iYWwpewordmFyIGJhc2VJc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYmFzZUlzRnVuY3Rpb24nKSwKKyAgICBpc05hdGl2ZSA9IHJlcXVpcmUoJy4vaXNOYXRpdmUnKTsKKworLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqLwordmFyIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nOworCisvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKKworLyoqCisgKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZykKKyAqIG9mIHZhbHVlcy4KKyAqLwordmFyIG9ialRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7CisKKy8qKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgVWludDhBcnJheSA9IGlzTmF0aXZlKFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSkgJiYgVWludDhBcnJheTsKKworLyoqCisgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEBjYXRlZ29yeSBMYW5nCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuCisgKiBAZXhhbXBsZQorICoKKyAqIF8uaXNGdW5jdGlvbihfKTsKKyAqIC8vID0+IHRydWUKKyAqCisgKiBfLmlzRnVuY3Rpb24oL2FiYy8pOworICogLy8gPT4gZmFsc2UKKyAqLwordmFyIGlzRnVuY3Rpb24gPSAhKGJhc2VJc0Z1bmN0aW9uKC94LykgfHwgKFVpbnQ4QXJyYXkgJiYgIWJhc2VJc0Z1bmN0aW9uKFVpbnQ4QXJyYXkpKSkgPyBiYXNlSXNGdW5jdGlvbiA6IGZ1bmN0aW9uKHZhbHVlKSB7CisgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvcgorICAvLyBpbiBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaSB3aGljaCByZXR1cm4gJ2Z1bmN0aW9uJyBmb3IgcmVnZXhlcworICAvLyBhbmQgU2FmYXJpIDggZXF1aXZhbGVudHMgd2hpY2ggcmV0dXJuICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvcnMuCisgIHJldHVybiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBmdW5jVGFnOworfTsKKworbW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uOworCit9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKKworfSx7Ii4uL2ludGVybmFsL2Jhc2VJc0Z1bmN0aW9uIjo0NSwiLi9pc05hdGl2ZSI6OTh9XSw5ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgZXNjYXBlUmVnRXhwID0gcmVxdWlyZSgnLi4vc3RyaW5nL2VzY2FwZVJlZ0V4cCcpLAorICAgIGlzSG9zdE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzSG9zdE9iamVjdCcpLAorICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzT2JqZWN0TGlrZScpOworCisvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCit2YXIgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7CisKKy8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpID4gNSkuICovCit2YXIgcmVIb3N0Q3RvciA9IC9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvOworCisvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKKworLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqLwordmFyIGZuVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7CisKKy8qKgorICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpCisgKiBvZiB2YWx1ZXMuCisgKi8KK3ZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOworCisvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqLwordmFyIHJlTmF0aXZlID0gUmVnRXhwKCdeJyArCisgIGVzY2FwZVJlZ0V4cChvYmpUb1N0cmluZykKKyAgLnJlcGxhY2UoL3RvU3RyaW5nfChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csICckMS4qPycpICsgJyQnCispOworCisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgTGFuZworICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLgorICogQGV4YW1wbGUKKyAqCisgKiBfLmlzTmF0aXZlKEFycmF5LnByb3RvdHlwZS5wdXNoKTsKKyAqIC8vID0+IHRydWUKKyAqCisgKiBfLmlzTmF0aXZlKF8pOworICogLy8gPT4gZmFsc2UKKyAqLworZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpIHsKKyAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IGZ1bmNUYWcpIHsKKyAgICByZXR1cm4gcmVOYXRpdmUudGVzdChmblRvU3RyaW5nLmNhbGwodmFsdWUpKTsKKyAgfQorICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAoaXNIb3N0T2JqZWN0KHZhbHVlKSA/IHJlTmF0aXZlIDogcmVIb3N0Q3RvcikudGVzdCh2YWx1ZSk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNOYXRpdmU7CisKK30seyIuLi9pbnRlcm5hbC9pc0hvc3RPYmplY3QiOjc4LCIuLi9pbnRlcm5hbC9pc09iamVjdExpa2UiOjgyLCIuLi9zdHJpbmcvZXNjYXBlUmVnRXhwIjoxMDZ9XSw5OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZSBbbGFuZ3VhZ2UgdHlwZV0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OCkgb2YgYE9iamVjdGAuCisgKiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYCkKKyAqCisgKiBAc3RhdGljCisgKiBAbWVtYmVyT2YgXworICogQGNhdGVnb3J5IExhbmcKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuCisgKiBAZXhhbXBsZQorICoKKyAqIF8uaXNPYmplY3Qoe30pOworICogLy8gPT4gdHJ1ZQorICoKKyAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTsKKyAqIC8vID0+IHRydWUKKyAqCisgKiBfLmlzT2JqZWN0KDEpOworICogLy8gPT4gZmFsc2UKKyAqLworZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKKyAgLy8gQXZvaWQgYSBWOCBKSVQgYnVnIGluIENocm9tZSAxOS0yMC4KKyAgLy8gU2VlIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMjkxIGZvciBtb3JlIGRldGFpbHMuCisgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlOworICByZXR1cm4gdHlwZSA9PSAnZnVuY3Rpb24nIHx8ICghIXZhbHVlICYmIHR5cGUgPT0gJ29iamVjdCcpOworfQorCittb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0OworCit9LHt9XSwxMDA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLAorICAgIGlzTmF0aXZlID0gcmVxdWlyZSgnLi9pc05hdGl2ZScpLAorICAgIHNoaW1Jc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc2hpbUlzUGxhaW5PYmplY3QnKSwKKyAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpOworCisvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCit2YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7CisKKy8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOworCisvKioKKyAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKQorICogb2YgdmFsdWVzLgorICovCit2YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZzsKKworLyoqIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi8KK3ZhciBnZXRQcm90b3R5cGVPZiA9IGlzTmF0aXZlKGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKSAmJiBnZXRQcm90b3R5cGVPZjsKKworLyoqCisgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlCisgKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuCisgKgorICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFzc3VtZXMgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3RvcgorICogaGF2ZSBubyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgTGFuZworICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLgorICogQGV4YW1wbGUKKyAqCisgKiBmdW5jdGlvbiBGb28oKSB7CisgKiAgIHRoaXMuYSA9IDE7CisgKiB9CisgKgorICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pOworICogLy8gPT4gZmFsc2UKKyAqCisgKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTsKKyAqIC8vID0+IGZhbHNlCisgKgorICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7CisgKiAvLyA9PiB0cnVlCisgKgorICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpOworICogLy8gPT4gdHJ1ZQorICovCit2YXIgaXNQbGFpbk9iamVjdCA9ICFnZXRQcm90b3R5cGVPZiA/IHNoaW1Jc1BsYWluT2JqZWN0IDogZnVuY3Rpb24odmFsdWUpIHsKKyAgaWYgKCEodmFsdWUgJiYgb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gb2JqZWN0VGFnKSB8fCAoIXN1cHBvcnQuYXJnc1RhZyAmJiBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiwKKyAgICAgIG9ialByb3RvID0gaXNOYXRpdmUodmFsdWVPZikgJiYgKG9ialByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFsdWVPZikpICYmIGdldFByb3RvdHlwZU9mKG9ialByb3RvKTsKKworICByZXR1cm4gb2JqUHJvdG8KKyAgICA/ICh2YWx1ZSA9PSBvYmpQcm90byB8fCBnZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gb2JqUHJvdG8pCisgICAgOiBzaGltSXNQbGFpbk9iamVjdCh2YWx1ZSk7Cit9OworCittb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7CisKK30seyIuLi9pbnRlcm5hbC9zaGltSXNQbGFpbk9iamVjdCI6OTAsIi4uL3N1cHBvcnQiOjEwNywiLi9pc0FyZ3VtZW50cyI6OTUsIi4vaXNOYXRpdmUiOjk4fV0sMTAxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc09iamVjdExpa2UnKTsKKworLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqLwordmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nOworCisvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKKworLyoqCisgKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZykKKyAqIG9mIHZhbHVlcy4KKyAqLwordmFyIG9ialRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7CisKKy8qKgorICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEBjYXRlZ29yeSBMYW5nCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuCisgKiBAZXhhbXBsZQorICoKKyAqIF8uaXNTdHJpbmcoJ2FiYycpOworICogLy8gPT4gdHJ1ZQorICoKKyAqIF8uaXNTdHJpbmcoMSk7CisgKiAvLyA9PiBmYWxzZQorICovCitmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkgeworICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IChpc09iamVjdExpa2UodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN0cmluZ1RhZyk7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7CisKK30seyIuLi9pbnRlcm5hbC9pc09iamVjdExpa2UiOjgyfV0sMTAyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKK3ZhciBpc0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzTGVuZ3RoJyksCisgICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNPYmplY3RMaWtlJyk7CisKKy8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KK3ZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsCisgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLAorICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsCisgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJywKKyAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsCisgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsCisgICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsCisgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsCisgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsCisgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsCisgICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsCisgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsCisgICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJzsKKwordmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJywKKyAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsCisgICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLAorICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJywKKyAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJywKKyAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJywKKyAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJywKKyAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLAorICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsCisgICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJzsKKworLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqLwordmFyIHR5cGVkQXJyYXlUYWdzID0ge307Cit0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID0KK3R5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID0KK3R5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9Cit0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9Cit0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTsKK3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID0KK3R5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID0KK3R5cGVkQXJyYXlUYWdzW2RhdGVUYWddID0gdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0KK3R5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID0gdHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9Cit0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID0gdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9Cit0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID0gdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9Cit0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID0gdHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTsKKworLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi8KK3ZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CisKKy8qKgorICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpCisgKiBvZiB2YWx1ZXMuCisgKi8KK3ZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOworCisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS4KKyAqCisgKiBAc3RhdGljCisgKiBAbWVtYmVyT2YgXworICogQGNhdGVnb3J5IExhbmcKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC4KKyAqIEBleGFtcGxlCisgKgorICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpOworICogLy8gPT4gdHJ1ZQorICoKKyAqIF8uaXNUeXBlZEFycmF5KFtdKTsKKyAqIC8vID0+IGZhbHNlCisgKi8KK2Z1bmN0aW9uIGlzVHlwZWRBcnJheSh2YWx1ZSkgeworICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3Nbb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSldOworfQorCittb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTsKKworfSx7Ii4uL2ludGVybmFsL2lzTGVuZ3RoIjo4MSwiLi4vaW50ZXJuYWwvaXNPYmplY3RMaWtlIjo4Mn1dLDEwMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgTGFuZworICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLgorICogQGV4YW1wbGUKKyAqCisgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7CisgKiAvLyA9PiB0cnVlCisgKgorICogXy5pc1VuZGVmaW5lZChudWxsKTsKKyAqIC8vID0+IGZhbHNlCisgKi8KK2Z1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7CisgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3VuZGVmaW5lZCc7Cit9CisKK21vZHVsZS5leHBvcnRzID0gaXNVbmRlZmluZWQ7CisKK30se31dLDEwNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgaXNMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc0xlbmd0aCcpLAorICAgIGlzTmF0aXZlID0gcmVxdWlyZSgnLi4vbGFuZy9pc05hdGl2ZScpLAorICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vbGFuZy9pc09iamVjdCcpLAorICAgIHNoaW1LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvc2hpbUtleXMnKSwKKyAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpOworCisvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwordmFyIG5hdGl2ZUtleXMgPSBpc05hdGl2ZShuYXRpdmVLZXlzID0gT2JqZWN0LmtleXMpICYmIG5hdGl2ZUtleXM7CisKKy8qKgorICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuCisgKgorICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGUKKyAqIFtFUyBzcGVjXShodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtb2JqZWN0LmtleXMpCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgT2JqZWN0CisgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KKyAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuCisgKiBAZXhhbXBsZQorICoKKyAqIGZ1bmN0aW9uIEZvbygpIHsKKyAqICAgdGhpcy5hID0gMTsKKyAqICAgdGhpcy5iID0gMjsKKyAqIH0KKyAqCisgKiBGb28ucHJvdG90eXBlLmMgPSAzOworICoKKyAqIF8ua2V5cyhuZXcgRm9vKTsKKyAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkKKyAqCisgKiBfLmtleXMoJ2hpJyk7CisgKiAvLyA9PiBbJzAnLCAnMSddCisgKi8KK3ZhciBrZXlzID0gIW5hdGl2ZUtleXMgPyBzaGltS2V5cyA6IGZ1bmN0aW9uKG9iamVjdCkgeworICBpZiAob2JqZWN0KSB7CisgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsCisgICAgICAgIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7CisgIH0KKyAgaWYgKCh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlID09PSBvYmplY3QpIHx8CisgICAgICAodHlwZW9mIG9iamVjdCA9PSAnZnVuY3Rpb24nID8gc3VwcG9ydC5lbnVtUHJvdG90eXBlcyA6IChsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSkpKSB7CisgICAgcmV0dXJuIHNoaW1LZXlzKG9iamVjdCk7CisgIH0KKyAgcmV0dXJuIGlzT2JqZWN0KG9iamVjdCkgPyBuYXRpdmVLZXlzKG9iamVjdCkgOiBbXTsKK307CisKK21vZHVsZS5leHBvcnRzID0ga2V5czsKKworfSx7Ii4uL2ludGVybmFsL2lzTGVuZ3RoIjo4MSwiLi4vaW50ZXJuYWwvc2hpbUtleXMiOjkxLCIuLi9sYW5nL2lzTmF0aXZlIjo5OCwiLi4vbGFuZy9pc09iamVjdCI6OTksIi4uL3N1cHBvcnQiOjEwN31dLDEwNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cit2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYXJyYXlFYWNoJyksCisgICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJndW1lbnRzJyksCisgICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpLAorICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9sYW5nL2lzRnVuY3Rpb24nKSwKKyAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNJbmRleCcpLAorICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNMZW5ndGgnKSwKKyAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2xhbmcvaXNPYmplY3QnKSwKKyAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL2xhbmcvaXNTdHJpbmcnKSwKKyAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpOworCisvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCit2YXIgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLAorICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsCisgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJywKKyAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsCisgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsCisgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsCisgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsCisgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsCisgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7CisKKy8qKiBVc2VkIHRvIGZpeCB0aGUgSlNjcmlwdCBgW1tEb250RW51bV1dYCBidWcuICovCit2YXIgc2hhZG93UHJvcHMgPSBbCisgICdjb25zdHJ1Y3RvcicsICdoYXNPd25Qcm9wZXJ0eScsICdpc1Byb3RvdHlwZU9mJywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywKKyAgJ3RvTG9jYWxlU3RyaW5nJywgJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnCitdOworCisvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIGVycm9yUHJvdG8gPSBFcnJvci5wcm90b3R5cGUsCisgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLAorICAgIHN0cmluZ1Byb3RvID0gU3RyaW5nLnByb3RvdHlwZTsKKworLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovCit2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTsKKworLyoqCisgKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZykKKyAqIG9mIHZhbHVlcy4KKyAqLwordmFyIG9ialRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7CisKKy8qKiBVc2VkIHRvIGF2b2lkIGl0ZXJhdGluZyBvdmVyIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgaW4gSUUgPCA5LiAqLwordmFyIG5vbkVudW1Qcm9wcyA9IHt9Oworbm9uRW51bVByb3BzW2FycmF5VGFnXSA9IG5vbkVudW1Qcm9wc1tkYXRlVGFnXSA9IG5vbkVudW1Qcm9wc1tudW1iZXJUYWddID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9Mb2NhbGVTdHJpbmcnOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlLCAndmFsdWVPZic6IHRydWUgfTsKK25vbkVudW1Qcm9wc1tib29sVGFnXSA9IG5vbkVudW1Qcm9wc1tzdHJpbmdUYWddID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlLCAndmFsdWVPZic6IHRydWUgfTsKK25vbkVudW1Qcm9wc1tlcnJvclRhZ10gPSBub25FbnVtUHJvcHNbZnVuY1RhZ10gPSBub25FbnVtUHJvcHNbcmVnZXhwVGFnXSA9IHsgJ2NvbnN0cnVjdG9yJzogdHJ1ZSwgJ3RvU3RyaW5nJzogdHJ1ZSB9Oworbm9uRW51bVByb3BzW29iamVjdFRhZ10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUgfTsKKworYXJyYXlFYWNoKHNoYWRvd1Byb3BzLCBmdW5jdGlvbihrZXkpIHsKKyAgZm9yICh2YXIgdGFnIGluIG5vbkVudW1Qcm9wcykgeworICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG5vbkVudW1Qcm9wcywgdGFnKSkgeworICAgICAgdmFyIHByb3BzID0gbm9uRW51bVByb3BzW3RhZ107CisgICAgICBwcm9wc1trZXldID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywga2V5KTsKKyAgICB9CisgIH0KK30pOworCisvKioKKyAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuCisgKgorICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEBjYXRlZ29yeSBPYmplY3QKKyAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgorICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy4KKyAqIEBleGFtcGxlCisgKgorICogZnVuY3Rpb24gRm9vKCkgeworICogICB0aGlzLmEgPSAxOworICogICB0aGlzLmIgPSAyOworICogfQorICoKKyAqIEZvby5wcm90b3R5cGUuYyA9IDM7CisgKgorICogXy5rZXlzSW4obmV3IEZvbyk7CisgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkKKyAqLworZnVuY3Rpb24ga2V5c0luKG9iamVjdCkgeworICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICByZXR1cm4gW107CisgIH0KKyAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7CisgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7CisgIH0KKyAgdmFyIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7CisKKyAgbGVuZ3RoID0gKGxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmCisgICAgKGlzQXJyYXkob2JqZWN0KSB8fCAoc3VwcG9ydC5ub25FbnVtU3RyaW5ncyAmJiBpc1N0cmluZyhvYmplY3QpKSB8fAorICAgICAgKHN1cHBvcnQubm9uRW51bUFyZ3MgJiYgaXNBcmd1bWVudHMob2JqZWN0KSkpICYmIGxlbmd0aCkgfHwgMDsKKworICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvciwKKyAgICAgIGluZGV4ID0gLTEsCisgICAgICBwcm90byA9IChpc0Z1bmN0aW9uKEN0b3IpICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bywKKyAgICAgIGlzUHJvdG8gPSBwcm90byA9PT0gb2JqZWN0LAorICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSwKKyAgICAgIHNraXBJbmRleGVzID0gbGVuZ3RoID4gMCwKKyAgICAgIHNraXBFcnJvclByb3BzID0gc3VwcG9ydC5lbnVtRXJyb3JQcm9wcyAmJiAob2JqZWN0ID09PSBlcnJvclByb3RvIHx8IG9iamVjdCBpbnN0YW5jZW9mIEVycm9yKSwKKyAgICAgIHNraXBQcm90byA9IHN1cHBvcnQuZW51bVByb3RvdHlwZXMgJiYgaXNGdW5jdGlvbihvYmplY3QpOworCisgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CisgICAgcmVzdWx0W2luZGV4XSA9IChpbmRleCArICcnKTsKKyAgfQorICAvLyBsb2Rhc2ggc2tpcHMgdGhlIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgd2hlbiBpdCBpbmZlcnMgaXQgaXMgaXRlcmF0aW5nCisgIC8vIG92ZXIgYSBgcHJvdG90eXBlYCBvYmplY3QgYmVjYXVzZSBJRSA8IDkgY2FuJ3Qgc2V0IHRoZSBgW1tFbnVtZXJhYmxlXV1gCisgIC8vIGF0dHJpYnV0ZSBvZiBhbiBleGlzdGluZyBwcm9wZXJ0eSBhbmQgdGhlIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb2YgYQorICAvLyBwcm90b3R5cGUgZGVmYXVsdHMgdG8gbm9uLWVudW1lcmFibGUuCisgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKKyAgICBpZiAoIShza2lwUHJvdG8gJiYga2V5ID09ICdwcm90b3R5cGUnKSAmJgorICAgICAgICAhKHNraXBFcnJvclByb3BzICYmIChrZXkgPT0gJ21lc3NhZ2UnIHx8IGtleSA9PSAnbmFtZScpKSAmJgorICAgICAgICAhKHNraXBJbmRleGVzICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpKSAmJgorICAgICAgICAhKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7CisgICAgICByZXN1bHQucHVzaChrZXkpOworICAgIH0KKyAgfQorICBpZiAoc3VwcG9ydC5ub25FbnVtU2hhZG93cyAmJiBvYmplY3QgIT09IG9iamVjdFByb3RvKSB7CisgICAgdmFyIHRhZyA9IG9iamVjdCA9PT0gc3RyaW5nUHJvdG8gPyBzdHJpbmdUYWcgOiAob2JqZWN0ID09PSBlcnJvclByb3RvID8gZXJyb3JUYWcgOiBvYmpUb1N0cmluZy5jYWxsKG9iamVjdCkpLAorICAgICAgICBub25FbnVtcyA9IG5vbkVudW1Qcm9wc1t0YWddIHx8IG5vbkVudW1Qcm9wc1tvYmplY3RUYWddOworCisgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcpIHsKKyAgICAgIHByb3RvID0gb2JqZWN0UHJvdG87CisgICAgfQorICAgIGxlbmd0aCA9IHNoYWRvd1Byb3BzLmxlbmd0aDsKKyAgICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICAgIGtleSA9IHNoYWRvd1Byb3BzW2xlbmd0aF07CisgICAgICB2YXIgbm9uRW51bSA9IG5vbkVudW1zW2tleV07CisgICAgICBpZiAoIShpc1Byb3RvICYmIG5vbkVudW0pICYmCisgICAgICAgICAgKG5vbkVudW0gPyBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSA6IG9iamVjdFtrZXldICE9PSBwcm90b1trZXldKSkgeworICAgICAgICByZXN1bHQucHVzaChrZXkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCittb2R1bGUuZXhwb3J0cyA9IGtleXNJbjsKKworfSx7Ii4uL2ludGVybmFsL2FycmF5RWFjaCI6MzAsIi4uL2ludGVybmFsL2lzSW5kZXgiOjc5LCIuLi9pbnRlcm5hbC9pc0xlbmd0aCI6ODEsIi4uL2xhbmcvaXNBcmd1bWVudHMiOjk1LCIuLi9sYW5nL2lzQXJyYXkiOjk2LCIuLi9sYW5nL2lzRnVuY3Rpb24iOjk3LCIuLi9sYW5nL2lzT2JqZWN0Ijo5OSwiLi4vbGFuZy9pc1N0cmluZyI6MTAxLCIuLi9zdXBwb3J0IjoxMDd9XSwxMDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewordmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VUb1N0cmluZycpOworCisvKioKKyAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgW3NwZWNpYWwgY2hhcmFjdGVyc10oaHR0cDovL3d3dy5yZWd1bGFyLWV4cHJlc3Npb25zLmluZm8vY2hhcmFjdGVycy5odG1sI3NwZWNpYWwpLgorICogSW4gYWRkaXRpb24gdG8gc3BlY2lhbCBjaGFyYWN0ZXJzIHRoZSBmb3J3YXJkIHNsYXNoIGlzIGVzY2FwZWQgdG8gYWxsb3cgZm9yCisgKiBlYXNpZXIgYGV2YWxgIHVzZSBhbmQgYEZ1bmN0aW9uYCBjb21waWxhdGlvbi4KKyAqLwordmFyIHJlUmVnRXhwQ2hhcnMgPSAvWy4qKz9eJHt9KCl8W1xdXC9cXF0vZywKKyAgICByZUhhc1JlZ0V4cENoYXJzID0gUmVnRXhwKHJlUmVnRXhwQ2hhcnMuc291cmNlKTsKKworLyoqCisgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgIlwiLCAiLyIsICJeIiwgIiQiLCAiLiIsICJ8IiwgIj8iLAorICogIioiLCAiKyIsICIoIiwgIikiLCAiWyIsICJdIiwgInsiIGFuZCAifSIgaW4gYHN0cmluZ2AuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEBjYXRlZ29yeSBTdHJpbmcKKyAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLgorICogQGV4YW1wbGUKKyAqCisgKiBfLmVzY2FwZVJlZ0V4cCgnW2xvZGFzaF0oaHR0cHM6Ly9sb2Rhc2guY29tLyknKTsKKyAqIC8vID0+ICdcW2xvZGFzaFxdXChodHRwczpcL1wvbG9kYXNoXC5jb21cL1wpJworICovCitmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7CisgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpOworICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1JlZ0V4cENoYXJzLnRlc3Qoc3RyaW5nKSkKKyAgICA/IHN0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhcnMsICdcXCQmJykKKyAgICA6IHN0cmluZzsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBlc2NhcGVSZWdFeHA7CisKK30seyIuLi9pbnRlcm5hbC9iYXNlVG9TdHJpbmciOjUzfV0sMTA3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKyhmdW5jdGlvbiAoZ2xvYmFsKXsKKy8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KK3ZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsCisgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7CisKKy8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovCit2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwKKyAgICBlcnJvclByb3RvID0gRXJyb3IucHJvdG90eXBlLAorICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKKworLyoqIFVzZWQgdG8gZGV0ZWN0IERPTSBzdXBwb3J0LiAqLwordmFyIGRvY3VtZW50ID0gKGRvY3VtZW50ID0gZ2xvYmFsLndpbmRvdykgJiYgZG9jdW1lbnQuZG9jdW1lbnQ7CisKKy8qKgorICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpCisgKiBvZiB2YWx1ZXMuCisgKi8KK3ZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOworCisvKiogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqLwordmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsCisgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7CisKKy8qKgorICogQW4gb2JqZWN0IGVudmlyb25tZW50IGZlYXR1cmUgZmxhZ3MuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEB0eXBlIE9iamVjdAorICovCit2YXIgc3VwcG9ydCA9IHt9OworCisoZnVuY3Rpb24oeCkgeworICB2YXIgQ3RvciA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSAxOyB9LAorICAgICAgb2JqZWN0ID0geyAnMCc6IDEsICdsZW5ndGgnOiAxIH0sCisgICAgICBwcm9wcyA9IFtdOworCisgIEN0b3IucHJvdG90eXBlID0geyAndmFsdWVPZic6IDEsICd5JzogMSB9OworICBmb3IgKHZhciBrZXkgaW4gbmV3IEN0b3IpIHsgcHJvcHMucHVzaChrZXkpOyB9CisKKyAgLyoqCisgICAqIERldGVjdCBpZiB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGlzIHJlc29sdmFibGUKKyAgICogKGFsbCBidXQgRmlyZWZveCA8IDQsIElFIDwgOSkuCisgICAqCisgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnQKKyAgICogQHR5cGUgYm9vbGVhbgorICAgKi8KKyAgc3VwcG9ydC5hcmdzVGFnID0gb2JqVG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09IGFyZ3NUYWc7CisKKyAgLyoqCisgICAqIERldGVjdCBpZiBgbmFtZWAgb3IgYG1lc3NhZ2VgIHByb3BlcnRpZXMgb2YgYEVycm9yLnByb3RvdHlwZWAgYXJlCisgICAqIGVudW1lcmFibGUgYnkgZGVmYXVsdCAoSUUgPCA5LCBTYWZhcmkgPCA1LjEpLgorICAgKgorICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0CisgICAqIEB0eXBlIGJvb2xlYW4KKyAgICovCisgIHN1cHBvcnQuZW51bUVycm9yUHJvcHMgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGVycm9yUHJvdG8sICdtZXNzYWdlJykgfHwKKyAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGVycm9yUHJvdG8sICduYW1lJyk7CisKKyAgLyoqCisgICAqIERldGVjdCBpZiBgcHJvdG90eXBlYCBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhYmxlIGJ5IGRlZmF1bHQuCisgICAqCisgICAqIEZpcmVmb3ggPCAzLjYsIE9wZXJhID4gOS41MCAtIE9wZXJhIDwgMTEuNjAsIGFuZCBTYWZhcmkgPCA1LjEKKyAgICogKGlmIHRoZSBwcm90b3R5cGUgb3IgYSBwcm9wZXJ0eSBvbiB0aGUgcHJvdG90eXBlIGhhcyBiZWVuIHNldCkKKyAgICogaW5jb3JyZWN0bHkgc2V0IHRoZSBgW1tFbnVtZXJhYmxlXV1gIHZhbHVlIG9mIGEgZnVuY3Rpb24ncyBgcHJvdG90eXBlYAorICAgKiBwcm9wZXJ0eSB0byBgdHJ1ZWAuCisgICAqCisgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnQKKyAgICogQHR5cGUgYm9vbGVhbgorICAgKi8KKyAgc3VwcG9ydC5lbnVtUHJvdG90eXBlcyA9IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoQ3RvciwgJ3Byb3RvdHlwZScpOworCisgIC8qKgorICAgKiBEZXRlY3QgaWYgZnVuY3Rpb25zIGNhbiBiZSBkZWNvbXBpbGVkIGJ5IGBGdW5jdGlvbiN0b1N0cmluZ2AKKyAgICogKGFsbCBidXQgRmlyZWZveCBPUyBjZXJ0aWZpZWQgYXBwcywgb2xkZXIgT3BlcmEgbW9iaWxlIGJyb3dzZXJzLCBhbmQKKyAgICogdGhlIFBsYXlTdGF0aW9uIDM7IGZvcmNlZCBgZmFsc2VgIGZvciBXaW5kb3dzIDggYXBwcykuCisgICAqCisgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnQKKyAgICogQHR5cGUgYm9vbGVhbgorICAgKi8KKyAgc3VwcG9ydC5mdW5jRGVjb21wID0gL1xidGhpc1xiLy50ZXN0KGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSk7CisKKyAgLyoqCisgICAqIERldGVjdCBpZiBgRnVuY3Rpb24jbmFtZWAgaXMgc3VwcG9ydGVkIChhbGwgYnV0IElFKS4KKyAgICoKKyAgICogQG1lbWJlck9mIF8uc3VwcG9ydAorICAgKiBAdHlwZSBib29sZWFuCisgICAqLworICBzdXBwb3J0LmZ1bmNOYW1lcyA9IHR5cGVvZiBGdW5jdGlvbi5uYW1lID09ICdzdHJpbmcnOworCisgIC8qKgorICAgKiBEZXRlY3QgaWYgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgRE9NIG5vZGVzIGlzIHJlc29sdmFibGUgKGFsbCBidXQgSUUgPCA5KS4KKyAgICoKKyAgICogQG1lbWJlck9mIF8uc3VwcG9ydAorICAgKiBAdHlwZSBib29sZWFuCisgICAqLworICBzdXBwb3J0Lm5vZGVUYWcgPSBvYmpUb1N0cmluZy5jYWxsKGRvY3VtZW50KSAhPSBvYmplY3RUYWc7CisKKyAgLyoqCisgICAqIERldGVjdCBpZiBzdHJpbmcgaW5kZXhlcyBhcmUgbm9uLWVudW1lcmFibGUKKyAgICogKElFIDwgOSwgUmluZ29KUywgUmhpbm8sIE5hcndoYWwpLgorICAgKgorICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0CisgICAqIEB0eXBlIGJvb2xlYW4KKyAgICovCisgIHN1cHBvcnQubm9uRW51bVN0cmluZ3MgPSAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCgneCcsIDApOworCisgIC8qKgorICAgKiBEZXRlY3QgaWYgcHJvcGVydGllcyBzaGFkb3dpbmcgdGhvc2Ugb24gYE9iamVjdC5wcm90b3R5cGVgIGFyZQorICAgKiBub24tZW51bWVyYWJsZS4KKyAgICoKKyAgICogSW4gSUUgPCA5IGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLCBzaGFkb3dpbmcgbm9uLWVudW1lcmFibGUgb25lcywKKyAgICogYXJlIG1hZGUgbm9uLWVudW1lcmFibGUgYXMgd2VsbCAoYS5rLmEgdGhlIEpTY3JpcHQgYFtbRG9udEVudW1dXWAgYnVnKS4KKyAgICoKKyAgICogQG1lbWJlck9mIF8uc3VwcG9ydAorICAgKiBAdHlwZSBib29sZWFuCisgICAqLworICBzdXBwb3J0Lm5vbkVudW1TaGFkb3dzID0gIS92YWx1ZU9mLy50ZXN0KHByb3BzKTsKKworICAvKioKKyAgICogRGV0ZWN0IGlmIG93biBwcm9wZXJ0aWVzIGFyZSBpdGVyYXRlZCBhZnRlciBpbmhlcml0ZWQgcHJvcGVydGllcyAoSUUgPCA5KS4KKyAgICoKKyAgICogQG1lbWJlck9mIF8uc3VwcG9ydAorICAgKiBAdHlwZSBib29sZWFuCisgICAqLworICBzdXBwb3J0Lm93bkxhc3QgPSBwcm9wc1swXSAhPSAneCc7CisKKyAgLyoqCisgICAqIERldGVjdCBpZiBgQXJyYXkjc2hpZnRgIGFuZCBgQXJyYXkjc3BsaWNlYCBhdWdtZW50IGFycmF5LWxpa2Ugb2JqZWN0cworICAgKiBjb3JyZWN0bHkuCisgICAqCisgICAqIEZpcmVmb3ggPCAxMCwgY29tcGF0aWJpbGl0eSBtb2RlcyBvZiBJRSA4LCBhbmQgSUUgPCA5IGhhdmUgYnVnZ3kgQXJyYXkgYHNoaWZ0KClgCisgICAqIGFuZCBgc3BsaWNlKClgIGZ1bmN0aW9ucyB0aGF0IGZhaWwgdG8gcmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQsIGB2YWx1ZVswXWAsCisgICAqIG9mIGFycmF5LWxpa2Ugb2JqZWN0cyBldmVuIHRob3VnaCB0aGUgYGxlbmd0aGAgcHJvcGVydHkgaXMgc2V0IHRvIGAwYC4KKyAgICogVGhlIGBzaGlmdCgpYCBtZXRob2QgaXMgYnVnZ3kgaW4gY29tcGF0aWJpbGl0eSBtb2RlcyBvZiBJRSA4LCB3aGlsZSBgc3BsaWNlKClgCisgICAqIGlzIGJ1Z2d5IHJlZ2FyZGxlc3Mgb2YgbW9kZSBpbiBJRSA8IDkuCisgICAqCisgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnQKKyAgICogQHR5cGUgYm9vbGVhbgorICAgKi8KKyAgc3VwcG9ydC5zcGxpY2VPYmplY3RzID0gKHNwbGljZS5jYWxsKG9iamVjdCwgMCwgMSksICFvYmplY3RbMF0pOworCisgIC8qKgorICAgKiBEZXRlY3QgbGFjayBvZiBzdXBwb3J0IGZvciBhY2Nlc3Npbmcgc3RyaW5nIGNoYXJhY3RlcnMgYnkgaW5kZXguCisgICAqCisgICAqIElFIDwgOCBjYW4ndCBhY2Nlc3MgY2hhcmFjdGVycyBieSBpbmRleC4gSUUgOCBjYW4gb25seSBhY2Nlc3MgY2hhcmFjdGVycworICAgKiBieSBpbmRleCBvbiBzdHJpbmcgbGl0ZXJhbHMsIG5vdCBzdHJpbmcgb2JqZWN0cy4KKyAgICoKKyAgICogQG1lbWJlck9mIF8uc3VwcG9ydAorICAgKiBAdHlwZSBib29sZWFuCisgICAqLworICBzdXBwb3J0LnVuaW5kZXhlZENoYXJzID0gKCd4J1swXSArIE9iamVjdCgneCcpWzBdKSAhPSAneHgnOworCisgIC8qKgorICAgKiBEZXRlY3QgaWYgdGhlIERPTSBpcyBzdXBwb3J0ZWQuCisgICAqCisgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnQKKyAgICogQHR5cGUgYm9vbGVhbgorICAgKi8KKyAgdHJ5IHsKKyAgICBzdXBwb3J0LmRvbSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5ub2RlVHlwZSA9PT0gMTE7CisgIH0gY2F0Y2goZSkgeworICAgIHN1cHBvcnQuZG9tID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogRGV0ZWN0IGlmIGBhcmd1bWVudHNgIG9iamVjdCBpbmRleGVzIGFyZSBub24tZW51bWVyYWJsZS4KKyAgICoKKyAgICogSW4gRmlyZWZveCA8IDQsIElFIDwgOSwgUGhhbnRvbUpTLCBhbmQgU2FmYXJpIDwgNS4xIGBhcmd1bWVudHNgIG9iamVjdAorICAgKiBpbmRleGVzIGFyZSBub24tZW51bWVyYWJsZS4gQ2hyb21lIDwgMjUgYW5kIE5vZGUuanMgPCAwLjExLjAgdHJlYXQKKyAgICogYGFyZ3VtZW50c2Agb2JqZWN0IGluZGV4ZXMgYXMgbm9uLWVudW1lcmFibGUgYW5kIGZhaWwgYGhhc093blByb3BlcnR5YAorICAgKiBjaGVja3MgZm9yIGluZGV4ZXMgdGhhdCBleGNlZWQgdGhlaXIgZnVuY3Rpb24ncyBmb3JtYWwgcGFyYW1ldGVycyB3aXRoCisgICAqIGFzc29jaWF0ZWQgdmFsdWVzIG9mIGAwYC4KKyAgICoKKyAgICogQG1lbWJlck9mIF8uc3VwcG9ydAorICAgKiBAdHlwZSBib29sZWFuCisgICAqLworICB0cnkgeworICAgIHN1cHBvcnQubm9uRW51bUFyZ3MgPSAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChhcmd1bWVudHMsIDEpOworICB9IGNhdGNoKGUpIHsKKyAgICBzdXBwb3J0Lm5vbkVudW1BcmdzID0gdHJ1ZTsKKyAgfQorfSgwLCAwKSk7CisKK21vZHVsZS5leHBvcnRzID0gc3VwcG9ydDsKKworfSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09ICJ1bmRlZmluZWQiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDoge30pCisKK30se31dLDEwODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisvKioKKyAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC4KKyAqCisgKiBAc3RhdGljCisgKiBAbWVtYmVyT2YgXworICogQGNhdGVnb3J5IFV0aWxpdHkKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uCisgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KKyAqIEBleGFtcGxlCisgKgorICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTsKKyAqIHZhciBnZXR0ZXIgPSBfLmNvbnN0YW50KG9iamVjdCk7CisgKgorICogZ2V0dGVyKCkgPT09IG9iamVjdDsKKyAqIC8vID0+IHRydWUKKyAqLworZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDsKKworfSx7fV0sMTA5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gaXQuCisgKgorICogQHN0YXRpYworICogQG1lbWJlck9mIF8KKyAqIEBjYXRlZ29yeSBVdGlsaXR5CisgKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS4KKyAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuCisgKiBAZXhhbXBsZQorICoKKyAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07CisgKgorICogXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3Q7CisgKiAvLyA9PiB0cnVlCisgKi8KK2Z1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZTsKK30KKworbW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTsKKworfSx7fV0sMTEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogQSBuby1vcGVyYXRpb24gZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBgdW5kZWZpbmVkYCByZWdhcmRsZXNzIG9mIHRoZQorICogYXJndW1lbnRzIGl0IHJlY2VpdmVzLgorICoKKyAqIEBzdGF0aWMKKyAqIEBtZW1iZXJPZiBfCisgKiBAY2F0ZWdvcnkgVXRpbGl0eQorICogQGV4YW1wbGUKKyAqCisgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9OworICoKKyAqIF8ubm9vcChvYmplY3QpID09PSB1bmRlZmluZWQ7CisgKiAvLyA9PiB0cnVlCisgKi8KK2Z1bmN0aW9uIG5vb3AoKSB7CisgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuCit9CisKK21vZHVsZS5leHBvcnRzID0gbm9vcDsKKworfSx7fV0sMTExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKy8qKgorICogTW9kdWxlIGRlcGVuZGVuY2llcy4KKyAqLworCit2YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2VtaXR0ZXInKTsKK3ZhciByZWR1Y2UgPSByZXF1aXJlKCdyZWR1Y2UnKTsKKworLyoqCisgKiBSb290IHJlZmVyZW5jZSBmb3IgaWZyYW1lcy4KKyAqLworCit2YXIgcm9vdCA9ICd1bmRlZmluZWQnID09IHR5cGVvZiB3aW5kb3cKKyAgPyB0aGlzCisgIDogd2luZG93OworCisvKioKKyAqIE5vb3AuCisgKi8KKworZnVuY3Rpb24gbm9vcCgpe307CisKKy8qKgorICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCwKKyAqIHdlIGRvbid0IHdhbnQgdG8gc2VyaWFsaXplIHRoZXNlIDopCisgKgorICogVE9ETzogZnV0dXJlIHByb29mLCBtb3ZlIHRvIGNvbXBvZW50IGxhbmQKKyAqCisgKiBAcGFyYW0ge09iamVjdH0gb2JqCisgKiBAcmV0dXJuIHtCb29sZWFufQorICogQGFwaSBwcml2YXRlCisgKi8KKworZnVuY3Rpb24gaXNIb3N0KG9iaikgeworICB2YXIgc3RyID0ge30udG9TdHJpbmcuY2FsbChvYmopOworCisgIHN3aXRjaCAoc3RyKSB7CisgICAgY2FzZSAnW29iamVjdCBGaWxlXSc6CisgICAgY2FzZSAnW29iamVjdCBCbG9iXSc6CisgICAgY2FzZSAnW29iamVjdCBGb3JtRGF0YV0nOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIERldGVybWluZSBYSFIuCisgKi8KKworZnVuY3Rpb24gZ2V0WEhSKCkgeworICBpZiAocm9vdC5YTUxIdHRwUmVxdWVzdAorICAgICYmICgnZmlsZTonICE9IHJvb3QubG9jYXRpb24ucHJvdG9jb2wgfHwgIXJvb3QuQWN0aXZlWE9iamVjdCkpIHsKKyAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0OworICB9IGVsc2UgeworICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fQorICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuNi4wJyk7IH0gY2F0Y2goZSkge30KKyAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjMuMCcpOyB9IGNhdGNoKGUpIHt9CisgICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYWRkZWQgdG8gc3VwcG9ydCBJRS4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gcworICogQHJldHVybiB7U3RyaW5nfQorICogQGFwaSBwcml2YXRlCisgKi8KKwordmFyIHRyaW0gPSAnJy50cmltCisgID8gZnVuY3Rpb24ocykgeyByZXR1cm4gcy50cmltKCk7IH0KKyAgOiBmdW5jdGlvbihzKSB7IHJldHVybiBzLnJlcGxhY2UoLyheXHMqfFxzKiQpL2csICcnKTsgfTsKKworLyoqCisgKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBvYmplY3QuCisgKgorICogQHBhcmFtIHtPYmplY3R9IG9iagorICogQHJldHVybiB7Qm9vbGVhbn0KKyAqIEBhcGkgcHJpdmF0ZQorICovCisKK2Z1bmN0aW9uIGlzT2JqZWN0KG9iaikgeworICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKTsKK30KKworLyoqCisgKiBTZXJpYWxpemUgdGhlIGdpdmVuIGBvYmpgLgorICoKKyAqIEBwYXJhbSB7T2JqZWN0fSBvYmoKKyAqIEByZXR1cm4ge1N0cmluZ30KKyAqIEBhcGkgcHJpdmF0ZQorICovCisKK2Z1bmN0aW9uIHNlcmlhbGl6ZShvYmopIHsKKyAgaWYgKCFpc09iamVjdChvYmopKSByZXR1cm4gb2JqOworICB2YXIgcGFpcnMgPSBbXTsKKyAgZm9yICh2YXIga2V5IGluIG9iaikgeworICAgIGlmIChudWxsICE9IG9ialtrZXldKSB7CisgICAgICBwYWlycy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpCisgICAgICAgICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtrZXldKSk7CisgICAgfQorICB9CisgIHJldHVybiBwYWlycy5qb2luKCcmJyk7Cit9CisKKy8qKgorICogRXhwb3NlIHNlcmlhbGl6YXRpb24gbWV0aG9kLgorICovCisKKyByZXF1ZXN0LnNlcmlhbGl6ZU9iamVjdCA9IHNlcmlhbGl6ZTsKKworIC8qKgorICAqIFBhcnNlIHRoZSBnaXZlbiB4LXd3dy1mb3JtLXVybGVuY29kZWQgYHN0cmAuCisgICoKKyAgKiBAcGFyYW0ge1N0cmluZ30gc3RyCisgICogQHJldHVybiB7T2JqZWN0fQorICAqIEBhcGkgcHJpdmF0ZQorICAqLworCitmdW5jdGlvbiBwYXJzZVN0cmluZyhzdHIpIHsKKyAgdmFyIG9iaiA9IHt9OworICB2YXIgcGFpcnMgPSBzdHIuc3BsaXQoJyYnKTsKKyAgdmFyIHBhcnRzOworICB2YXIgcGFpcjsKKworICBmb3IgKHZhciBpID0gMCwgbGVuID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKKyAgICBwYWlyID0gcGFpcnNbaV07CisgICAgcGFydHMgPSBwYWlyLnNwbGl0KCc9Jyk7CisgICAgb2JqW2RlY29kZVVSSUNvbXBvbmVudChwYXJ0c1swXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzFdKTsKKyAgfQorCisgIHJldHVybiBvYmo7Cit9CisKKy8qKgorICogRXhwb3NlIHBhcnNlci4KKyAqLworCityZXF1ZXN0LnBhcnNlU3RyaW5nID0gcGFyc2VTdHJpbmc7CisKKy8qKgorICogRGVmYXVsdCBNSU1FIHR5cGUgbWFwLgorICoKKyAqICAgICBzdXBlcmFnZW50LnR5cGVzLnhtbCA9ICdhcHBsaWNhdGlvbi94bWwnOworICoKKyAqLworCityZXF1ZXN0LnR5cGVzID0geworICBodG1sOiAndGV4dC9odG1sJywKKyAganNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLAorICB4bWw6ICdhcHBsaWNhdGlvbi94bWwnLAorICB1cmxlbmNvZGVkOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKKyAgJ2Zvcm0nOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKKyAgJ2Zvcm0tZGF0YSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCit9OworCisvKioKKyAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiBtYXAuCisgKgorICogICAgIHN1cGVyYWdlbnQuc2VyaWFsaXplWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKG9iail7CisgKiAgICAgICByZXR1cm4gJ2dlbmVyYXRlZCB4bWwgaGVyZSc7CisgKiAgICAgfTsKKyAqCisgKi8KKworIHJlcXVlc3Quc2VyaWFsaXplID0geworICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6IHNlcmlhbGl6ZSwKKyAgICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5zdHJpbmdpZnkKKyB9OworCisgLyoqCisgICogRGVmYXVsdCBwYXJzZXJzLgorICAqCisgICogICAgIHN1cGVyYWdlbnQucGFyc2VbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24oc3RyKXsKKyAgKiAgICAgICByZXR1cm4geyBvYmplY3QgcGFyc2VkIGZyb20gc3RyIH07CisgICogICAgIH07CisgICoKKyAgKi8KKworcmVxdWVzdC5wYXJzZSA9IHsKKyAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6IHBhcnNlU3RyaW5nLAorICAnYXBwbGljYXRpb24vanNvbic6IEpTT04ucGFyc2UKK307CisKKy8qKgorICogUGFyc2UgdGhlIGdpdmVuIGhlYWRlciBgc3RyYCBpbnRvCisgKiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgbWFwcGVkIGZpZWxkcy4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gc3RyCisgKiBAcmV0dXJuIHtPYmplY3R9CisgKiBAYXBpIHByaXZhdGUKKyAqLworCitmdW5jdGlvbiBwYXJzZUhlYWRlcihzdHIpIHsKKyAgdmFyIGxpbmVzID0gc3RyLnNwbGl0KC9ccj9cbi8pOworICB2YXIgZmllbGRzID0ge307CisgIHZhciBpbmRleDsKKyAgdmFyIGxpbmU7CisgIHZhciBmaWVsZDsKKyAgdmFyIHZhbDsKKworICBsaW5lcy5wb3AoKTsgLy8gdHJhaWxpbmcgQ1JMRgorCisgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgIGxpbmUgPSBsaW5lc1tpXTsKKyAgICBpbmRleCA9IGxpbmUuaW5kZXhPZignOicpOworICAgIGZpZWxkID0gbGluZS5zbGljZSgwLCBpbmRleCkudG9Mb3dlckNhc2UoKTsKKyAgICB2YWwgPSB0cmltKGxpbmUuc2xpY2UoaW5kZXggKyAxKSk7CisgICAgZmllbGRzW2ZpZWxkXSA9IHZhbDsKKyAgfQorCisgIHJldHVybiBmaWVsZHM7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBnaXZlbiBgc3RyYC4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gc3RyCisgKiBAcmV0dXJuIHtTdHJpbmd9CisgKiBAYXBpIHByaXZhdGUKKyAqLworCitmdW5jdGlvbiB0eXBlKHN0cil7CisgIHJldHVybiBzdHIuc3BsaXQoLyAqOyAqLykuc2hpZnQoKTsKK307CisKKy8qKgorICogUmV0dXJuIGhlYWRlciBmaWVsZCBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSB7U3RyaW5nfSBzdHIKKyAqIEByZXR1cm4ge09iamVjdH0KKyAqIEBhcGkgcHJpdmF0ZQorICovCisKK2Z1bmN0aW9uIHBhcmFtcyhzdHIpeworICByZXR1cm4gcmVkdWNlKHN0ci5zcGxpdCgvICo7ICovKSwgZnVuY3Rpb24ob2JqLCBzdHIpeworICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgvICo9ICovKQorICAgICAgLCBrZXkgPSBwYXJ0cy5zaGlmdCgpCisgICAgICAsIHZhbCA9IHBhcnRzLnNoaWZ0KCk7CisKKyAgICBpZiAoa2V5ICYmIHZhbCkgb2JqW2tleV0gPSB2YWw7CisgICAgcmV0dXJuIG9iajsKKyAgfSwge30pOworfTsKKworLyoqCisgKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZWAgd2l0aCB0aGUgZ2l2ZW4gYHhocmAuCisgKgorICogIC0gc2V0IGZsYWdzICgub2ssIC5lcnJvciwgZXRjKQorICogIC0gcGFyc2UgaGVhZGVyCisgKgorICogRXhhbXBsZXM6CisgKgorICogIEFsaWFzaW5nIGBzdXBlcmFnZW50YCBhcyBgcmVxdWVzdGAgaXMgbmljZToKKyAqCisgKiAgICAgIHJlcXVlc3QgPSBzdXBlcmFnZW50OworICoKKyAqICBXZSBjYW4gdXNlIHRoZSBwcm9taXNlLWxpa2UgQVBJLCBvciBwYXNzIGNhbGxiYWNrczoKKyAqCisgKiAgICAgIHJlcXVlc3QuZ2V0KCcvJykuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7CisgKiAgICAgIHJlcXVlc3QuZ2V0KCcvJywgZnVuY3Rpb24ocmVzKXt9KTsKKyAqCisgKiAgU2VuZGluZyBkYXRhIGNhbiBiZSBjaGFpbmVkOgorICoKKyAqICAgICAgcmVxdWVzdAorICogICAgICAgIC5wb3N0KCcvdXNlcicpCisgKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pCisgKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pOworICoKKyAqICBPciBwYXNzZWQgdG8gYC5zZW5kKClgOgorICoKKyAqICAgICAgcmVxdWVzdAorICogICAgICAgIC5wb3N0KCcvdXNlcicpCisgKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7CisgKgorICogIE9yIHBhc3NlZCB0byBgLnBvc3QoKWA6CisgKgorICogICAgICByZXF1ZXN0CisgKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0pCisgKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pOworICoKKyAqIE9yIGZ1cnRoZXIgcmVkdWNlZCB0byBhIHNpbmdsZSBjYWxsIGZvciBzaW1wbGUgY2FzZXM6CisgKgorICogICAgICByZXF1ZXN0CisgKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7CisgKgorICogQHBhcmFtIHtYTUxIVFRQUmVxdWVzdH0geGhyCisgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucworICogQGFwaSBwcml2YXRlCisgKi8KKworZnVuY3Rpb24gUmVzcG9uc2UocmVxLCBvcHRpb25zKSB7CisgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICB0aGlzLnJlcSA9IHJlcTsKKyAgdGhpcy54aHIgPSB0aGlzLnJlcS54aHI7CisgIHRoaXMudGV4dCA9IHRoaXMucmVxLm1ldGhvZCAhPSdIRUFEJyAKKyAgICAgPyB0aGlzLnhoci5yZXNwb25zZVRleHQgCisgICAgIDogbnVsbDsKKyAgdGhpcy5zZXRTdGF0dXNQcm9wZXJ0aWVzKHRoaXMueGhyLnN0YXR1cyk7CisgIHRoaXMuaGVhZGVyID0gdGhpcy5oZWFkZXJzID0gcGFyc2VIZWFkZXIodGhpcy54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOworICAvLyBnZXRBbGxSZXNwb25zZUhlYWRlcnMgc29tZXRpbWVzIGZhbHNlbHkgcmV0dXJucyAiIiBmb3IgQ09SUyByZXF1ZXN0cywgYnV0CisgIC8vIGdldFJlc3BvbnNlSGVhZGVyIHN0aWxsIHdvcmtzLiBzbyB3ZSBnZXQgY29udGVudC10eXBlIGV2ZW4gaWYgZ2V0dGluZworICAvLyBvdGhlciBoZWFkZXJzIGZhaWxzLgorICB0aGlzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSB0aGlzLnhoci5nZXRSZXNwb25zZUhlYWRlcignY29udGVudC10eXBlJyk7CisgIHRoaXMuc2V0SGVhZGVyUHJvcGVydGllcyh0aGlzLmhlYWRlcik7CisgIHRoaXMuYm9keSA9IHRoaXMucmVxLm1ldGhvZCAhPSAnSEVBRCcKKyAgICA/IHRoaXMucGFyc2VCb2R5KHRoaXMudGV4dCkKKyAgICA6IG51bGw7Cit9CisKKy8qKgorICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgYGZpZWxkYCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gZmllbGQKKyAqIEByZXR1cm4ge1N0cmluZ30KKyAqIEBhcGkgcHVibGljCisgKi8KKworUmVzcG9uc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKXsKKyAgcmV0dXJuIHRoaXMuaGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldOworfTsKKworLyoqCisgKiBTZXQgaGVhZGVyIHJlbGF0ZWQgcHJvcGVydGllczoKKyAqCisgKiAgIC0gYC50eXBlYCB0aGUgY29udGVudCB0eXBlIHdpdGhvdXQgcGFyYW1zCisgKgorICogQSByZXNwb25zZSBvZiAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IgorICogd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgYC50eXBlYCBvZiAidGV4dC9wbGFpbiIuCisgKgorICogQHBhcmFtIHtPYmplY3R9IGhlYWRlcgorICogQGFwaSBwcml2YXRlCisgKi8KKworUmVzcG9uc2UucHJvdG90eXBlLnNldEhlYWRlclByb3BlcnRpZXMgPSBmdW5jdGlvbihoZWFkZXIpeworICAvLyBjb250ZW50LXR5cGUKKyAgdmFyIGN0ID0gdGhpcy5oZWFkZXJbJ2NvbnRlbnQtdHlwZSddIHx8ICcnOworICB0aGlzLnR5cGUgPSB0eXBlKGN0KTsKKworICAvLyBwYXJhbXMKKyAgdmFyIG9iaiA9IHBhcmFtcyhjdCk7CisgIGZvciAodmFyIGtleSBpbiBvYmopIHRoaXNba2V5XSA9IG9ialtrZXldOworfTsKKworLyoqCisgKiBQYXJzZSB0aGUgZ2l2ZW4gYm9keSBgc3RyYC4KKyAqCisgKiBVc2VkIGZvciBhdXRvLXBhcnNpbmcgb2YgYm9kaWVzLiBQYXJzZXJzCisgKiBhcmUgZGVmaW5lZCBvbiB0aGUgYHN1cGVyYWdlbnQucGFyc2VgIG9iamVjdC4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gc3RyCisgKiBAcmV0dXJuIHtNaXhlZH0KKyAqIEBhcGkgcHJpdmF0ZQorICovCisKK1Jlc3BvbnNlLnByb3RvdHlwZS5wYXJzZUJvZHkgPSBmdW5jdGlvbihzdHIpeworICB2YXIgcGFyc2UgPSByZXF1ZXN0LnBhcnNlW3RoaXMudHlwZV07CisgIHJldHVybiBwYXJzZSAmJiBzdHIgJiYgc3RyLmxlbmd0aAorICAgID8gcGFyc2Uoc3RyKQorICAgIDogbnVsbDsKK307CisKKy8qKgorICogU2V0IGZsYWdzIHN1Y2ggYXMgYC5va2AgYmFzZWQgb24gYHN0YXR1c2AuCisgKgorICogRm9yIGV4YW1wbGUgYSAyeHggcmVzcG9uc2Ugd2lsbCBnaXZlIHlvdSBhIGAub2tgIG9mIF9fdHJ1ZV9fCisgKiB3aGVyZWFzIDV4eCB3aWxsIGJlIF9fZmFsc2VfXyBhbmQgYC5lcnJvcmAgd2lsbCBiZSBfX3RydWVfXy4gVGhlCisgKiBgLmNsaWVudEVycm9yYCBhbmQgYC5zZXJ2ZXJFcnJvcmAgYXJlIGFsc28gYXZhaWxhYmxlIHRvIGJlIG1vcmUKKyAqIHNwZWNpZmljLCBhbmQgYC5zdGF0dXNUeXBlYCBpcyB0aGUgY2xhc3Mgb2YgZXJyb3IgcmFuZ2luZyBmcm9tIDEuLjUKKyAqIHNvbWV0aW1lcyB1c2VmdWwgZm9yIG1hcHBpbmcgcmVzcG9uZCBjb2xvcnMgZXRjLgorICoKKyAqICJzdWdhciIgcHJvcGVydGllcyBhcmUgYWxzbyBkZWZpbmVkIGZvciBjb21tb24gY2FzZXMuIEN1cnJlbnRseSBwcm92aWRpbmc6CisgKgorICogICAtIC5ub0NvbnRlbnQKKyAqICAgLSAuYmFkUmVxdWVzdAorICogICAtIC51bmF1dGhvcml6ZWQKKyAqICAgLSAubm90QWNjZXB0YWJsZQorICogICAtIC5ub3RGb3VuZAorICoKKyAqIEBwYXJhbSB7TnVtYmVyfSBzdGF0dXMKKyAqIEBhcGkgcHJpdmF0ZQorICovCisKK1Jlc3BvbnNlLnByb3RvdHlwZS5zZXRTdGF0dXNQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc3RhdHVzKXsKKyAgdmFyIHR5cGUgPSBzdGF0dXMgLyAxMDAgfCAwOworCisgIC8vIHN0YXR1cyAvIGNsYXNzCisgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICB0aGlzLnN0YXR1c1R5cGUgPSB0eXBlOworCisgIC8vIGJhc2ljcworICB0aGlzLmluZm8gPSAxID09IHR5cGU7CisgIHRoaXMub2sgPSAyID09IHR5cGU7CisgIHRoaXMuY2xpZW50RXJyb3IgPSA0ID09IHR5cGU7CisgIHRoaXMuc2VydmVyRXJyb3IgPSA1ID09IHR5cGU7CisgIHRoaXMuZXJyb3IgPSAoNCA9PSB0eXBlIHx8IDUgPT0gdHlwZSkKKyAgICA/IHRoaXMudG9FcnJvcigpCisgICAgOiBmYWxzZTsKKworICAvLyBzdWdhcgorICB0aGlzLmFjY2VwdGVkID0gMjAyID09IHN0YXR1czsKKyAgdGhpcy5ub0NvbnRlbnQgPSAyMDQgPT0gc3RhdHVzIHx8IDEyMjMgPT0gc3RhdHVzOworICB0aGlzLmJhZFJlcXVlc3QgPSA0MDAgPT0gc3RhdHVzOworICB0aGlzLnVuYXV0aG9yaXplZCA9IDQwMSA9PSBzdGF0dXM7CisgIHRoaXMubm90QWNjZXB0YWJsZSA9IDQwNiA9PSBzdGF0dXM7CisgIHRoaXMubm90Rm91bmQgPSA0MDQgPT0gc3RhdHVzOworICB0aGlzLmZvcmJpZGRlbiA9IDQwMyA9PSBzdGF0dXM7Cit9OworCisvKioKKyAqIFJldHVybiBhbiBgRXJyb3JgIHJlcHJlc2VudGF0aXZlIG9mIHRoaXMgcmVzcG9uc2UuCisgKgorICogQHJldHVybiB7RXJyb3J9CisgKiBAYXBpIHB1YmxpYworICovCisKK1Jlc3BvbnNlLnByb3RvdHlwZS50b0Vycm9yID0gZnVuY3Rpb24oKXsKKyAgdmFyIHJlcSA9IHRoaXMucmVxOworICB2YXIgbWV0aG9kID0gcmVxLm1ldGhvZDsKKyAgdmFyIHVybCA9IHJlcS51cmw7CisKKyAgdmFyIG1zZyA9ICdjYW5ub3QgJyArIG1ldGhvZCArICcgJyArIHVybCArICcgKCcgKyB0aGlzLnN0YXR1cyArICcpJzsKKyAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpOworICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7CisgIGVyci5tZXRob2QgPSBtZXRob2Q7CisgIGVyci51cmwgPSB1cmw7CisKKyAgcmV0dXJuIGVycjsKK307CisKKy8qKgorICogRXhwb3NlIGBSZXNwb25zZWAuCisgKi8KKworcmVxdWVzdC5SZXNwb25zZSA9IFJlc3BvbnNlOworCisvKioKKyAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RgIHdpdGggdGhlIGdpdmVuIGBtZXRob2RgIGFuZCBgdXJsYC4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kCisgKiBAcGFyYW0ge1N0cmluZ30gdXJsCisgKiBAYXBpIHB1YmxpYworICovCisKK2Z1bmN0aW9uIFJlcXVlc3QobWV0aG9kLCB1cmwpIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBFbWl0dGVyLmNhbGwodGhpcyk7CisgIHRoaXMuX3F1ZXJ5ID0gdGhpcy5fcXVlcnkgfHwgW107CisgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICB0aGlzLnVybCA9IHVybDsKKyAgdGhpcy5oZWFkZXIgPSB7fTsKKyAgdGhpcy5faGVhZGVyID0ge307CisgIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCl7CisgICAgdmFyIGVyciA9IG51bGw7CisgICAgdmFyIHJlcyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgcmVzID0gbmV3IFJlc3BvbnNlKHNlbGYpOyAKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgIGVyciA9IG5ldyBFcnJvcignUGFyc2VyIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgcmVzcG9uc2UnKTsKKyAgICAgIGVyci5wYXJzZSA9IHRydWU7CisgICAgICBlcnIub3JpZ2luYWwgPSBlOworICAgIH0KKworICAgIHNlbGYuY2FsbGJhY2soZXJyLCByZXMpOworICB9KTsKK30KKworLyoqCisgKiBNaXhpbiBgRW1pdHRlcmAuCisgKi8KKworRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7CisKKy8qKgorICogQWxsb3cgZm9yIGV4dGVuc2lvbgorICovCisKK1JlcXVlc3QucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uKGZuKSB7CisgIGZuKHRoaXMpOworICByZXR1cm4gdGhpczsKK30KKworLyoqCisgKiBTZXQgdGltZW91dCB0byBgbXNgLgorICoKKyAqIEBwYXJhbSB7TnVtYmVyfSBtcworICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nCisgKiBAYXBpIHB1YmxpYworICovCisKK1JlcXVlc3QucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbihtcyl7CisgIHRoaXMuX3RpbWVvdXQgPSBtczsKKyAgcmV0dXJuIHRoaXM7Cit9OworCisvKioKKyAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuCisgKgorICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nCisgKiBAYXBpIHB1YmxpYworICovCisKK1JlcXVlc3QucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uKCl7CisgIHRoaXMuX3RpbWVvdXQgPSAwOworICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC4KKyAqCisgKiBAcmV0dXJuIHtSZXF1ZXN0fQorICogQGFwaSBwdWJsaWMKKyAqLworCitSZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCl7CisgIGlmICh0aGlzLmFib3J0ZWQpIHJldHVybjsKKyAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKKyAgdGhpcy54aHIuYWJvcnQoKTsKKyAgdGhpcy5jbGVhclRpbWVvdXQoKTsKKyAgdGhpcy5lbWl0KCdhYm9ydCcpOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorICogU2V0IGhlYWRlciBgZmllbGRgIHRvIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0LgorICoKKyAqIEV4YW1wbGVzOgorICoKKyAqICAgICAgcmVxLmdldCgnLycpCisgKiAgICAgICAgLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKQorICogICAgICAgIC5zZXQoJ1gtQVBJLUtleScsICdmb29iYXInKQorICogICAgICAgIC5lbmQoY2FsbGJhY2spOworICoKKyAqICAgICAgcmVxLmdldCgnLycpCisgKiAgICAgICAgLnNldCh7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1BUEktS2V5JzogJ2Zvb2JhcicgfSkKKyAqICAgICAgICAuZW5kKGNhbGxiYWNrKTsKKyAqCisgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGZpZWxkCisgKiBAcGFyYW0ge1N0cmluZ30gdmFsCisgKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmcKKyAqIEBhcGkgcHVibGljCisgKi8KKworUmVxdWVzdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCl7CisgIGlmIChpc09iamVjdChmaWVsZCkpIHsKKyAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHsKKyAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICB9CisgIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXSA9IHZhbDsKKyAgdGhpcy5oZWFkZXJbZmllbGRdID0gdmFsOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogICAgICByZXEuZ2V0KCcvJykKKyAqICAgICAgICAudW5zZXQoJ1VzZXItQWdlbnQnKQorICogICAgICAgIC5lbmQoY2FsbGJhY2spOworICoKKyAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZAorICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nCisgKiBAYXBpIHB1YmxpYworICovCisKK1JlcXVlc3QucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24oZmllbGQpeworICBkZWxldGUgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldOworICBkZWxldGUgdGhpcy5oZWFkZXJbZmllbGRdOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgaGVhZGVyIGBmaWVsZGAgdmFsdWUuCisgKgorICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkCisgKiBAcmV0dXJuIHtTdHJpbmd9CisgKiBAYXBpIHByaXZhdGUKKyAqLworCitSZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIgPSBmdW5jdGlvbihmaWVsZCl7CisgIHJldHVybiB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07Cit9OworCisvKioKKyAqIFNldCBDb250ZW50LVR5cGUgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC4KKyAqCisgKiBFeGFtcGxlczoKKyAqCisgKiAgICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7CisgKgorICogICAgICByZXF1ZXN0LnBvc3QoJy8nKQorICogICAgICAgIC50eXBlKCd4bWwnKQorICogICAgICAgIC5zZW5kKHhtbHN0cmluZykKKyAqICAgICAgICAuZW5kKGNhbGxiYWNrKTsKKyAqCisgKiAgICAgIHJlcXVlc3QucG9zdCgnLycpCisgKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpCisgKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKQorICogICAgICAgIC5lbmQoY2FsbGJhY2spOworICoKKyAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCisgKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmcKKyAqIEBhcGkgcHVibGljCisgKi8KKworUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uKHR5cGUpeworICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTsKKyAgcmV0dXJuIHRoaXM7Cit9OworCisvKioKKyAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC4KKyAqCisgKiBFeGFtcGxlczoKKyAqCisgKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJzsKKyAqCisgKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKQorICogICAgICAgIC5hY2NlcHQoJ2pzb24nKQorICogICAgICAgIC5lbmQoY2FsbGJhY2spOworICoKKyAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpCisgKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpCisgKiAgICAgICAgLmVuZChjYWxsYmFjayk7CisgKgorICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdAorICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nCisgKiBAYXBpIHB1YmxpYworICovCisKK1JlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpeworICB0aGlzLnNldCgnQWNjZXB0JywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTsKKyAgcmV0dXJuIHRoaXM7Cit9OworCisvKioKKyAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuCisgKgorICogQHBhcmFtIHtTdHJpbmd9IHVzZXIKKyAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzCisgKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmcKKyAqIEBhcGkgcHVibGljCisgKi8KKworUmVxdWVzdC5wcm90b3R5cGUuYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3MpeworICB2YXIgc3RyID0gYnRvYSh1c2VyICsgJzonICsgcGFzcyk7CisgIHRoaXMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBzdHIpOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLgorKgorKiBFeGFtcGxlczoKKyoKKyogICByZXF1ZXN0LmdldCgnL3Nob2VzJykKKyogICAgIC5xdWVyeSgnc2l6ZT0xMCcpCisqICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pCisqCisqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmFsCisqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZworKiBAYXBpIHB1YmxpYworKi8KKworUmVxdWVzdC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbih2YWwpeworICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHZhbCkgdmFsID0gc2VyaWFsaXplKHZhbCk7CisgIGlmICh2YWwpIHRoaXMuX3F1ZXJ5LnB1c2godmFsKTsKKyAgcmV0dXJuIHRoaXM7Cit9OworCisvKioKKyAqIFdyaXRlIHRoZSBmaWVsZCBgbmFtZWAgYW5kIGB2YWxgIGZvciAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIKKyAqIHJlcXVlc3QgYm9kaWVzLgorICoKKyAqIGBgYCBqcworICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJykKKyAqICAgLmZpZWxkKCdmb28nLCAnYmFyJykKKyAqICAgLmVuZChjYWxsYmFjayk7CisgKiBgYGAKKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gbmFtZQorICogQHBhcmFtIHtTdHJpbmd8QmxvYnxGaWxlfSB2YWwKKyAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZworICogQGFwaSBwdWJsaWMKKyAqLworCitSZXF1ZXN0LnByb3RvdHlwZS5maWVsZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbCl7CisgIGlmICghdGhpcy5fZm9ybURhdGEpIHRoaXMuX2Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CisgIHRoaXMuX2Zvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWwpOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorICogUXVldWUgdGhlIGdpdmVuIGBmaWxlYCBhcyBhbiBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYGZpZWxkYCwKKyAqIHdpdGggb3B0aW9uYWwgYGZpbGVuYW1lYC4KKyAqCisgKiBgYGAganMKKyAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpCisgKiAgIC5hdHRhY2gobmV3IEJsb2IoWyc8YSBpZD0iYSI+PGIgaWQ9ImIiPmhleSE8L2I+PC9hPiddLCB7IHR5cGU6ICJ0ZXh0L2h0bWwifSkpCisgKiAgIC5lbmQoY2FsbGJhY2spOworICogYGBgCisgKgorICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkCisgKiBAcGFyYW0ge0Jsb2J8RmlsZX0gZmlsZQorICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lCisgKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmcKKyAqIEBhcGkgcHVibGljCisgKi8KKworUmVxdWVzdC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24oZmllbGQsIGZpbGUsIGZpbGVuYW1lKXsKKyAgaWYgKCF0aGlzLl9mb3JtRGF0YSkgdGhpcy5fZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKKyAgdGhpcy5fZm9ybURhdGEuYXBwZW5kKGZpZWxkLCBmaWxlLCBmaWxlbmFtZSk7CisgIHJldHVybiB0aGlzOworfTsKKworLyoqCisgKiBTZW5kIGBkYXRhYCwgZGVmYXVsdGluZyB0aGUgYC50eXBlKClgIHRvICJqc29uIiB3aGVuCisgKiBhbiBvYmplY3QgaXMgZ2l2ZW4uCisgKgorICogRXhhbXBsZXM6CisgKgorICogICAgICAgLy8gcXVlcnlzdHJpbmcKKyAqICAgICAgIHJlcXVlc3QuZ2V0KCcvc2VhcmNoJykKKyAqICAgICAgICAgLmVuZChjYWxsYmFjaykKKyAqCisgKiAgICAgICAvLyBtdWx0aXBsZSBkYXRhICJ3cml0ZXMiCisgKiAgICAgICByZXF1ZXN0LmdldCgnL3NlYXJjaCcpCisgKiAgICAgICAgIC5zZW5kKHsgc2VhcmNoOiAncXVlcnknIH0pCisgKiAgICAgICAgIC5zZW5kKHsgcmFuZ2U6ICcxLi41JyB9KQorICogICAgICAgICAuc2VuZCh7IG9yZGVyOiAnZGVzYycgfSkKKyAqICAgICAgICAgLmVuZChjYWxsYmFjaykKKyAqCisgKiAgICAgICAvLyBtYW51YWwganNvbgorICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpCisgKiAgICAgICAgIC50eXBlKCdqc29uJykKKyAqICAgICAgICAgLnNlbmQoJ3sibmFtZSI6InRqIn0pCisgKiAgICAgICAgIC5lbmQoY2FsbGJhY2spCisgKgorICogICAgICAgLy8gYXV0byBqc29uCisgKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJykKKyAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pCisgKiAgICAgICAgIC5lbmQoY2FsbGJhY2spCisgKgorICogICAgICAgLy8gbWFudWFsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZAorICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpCisgKiAgICAgICAgIC50eXBlKCdmb3JtJykKKyAqICAgICAgICAgLnNlbmQoJ25hbWU9dGonKQorICogICAgICAgICAuZW5kKGNhbGxiYWNrKQorICoKKyAqICAgICAgIC8vIGF1dG8geC13d3ctZm9ybS11cmxlbmNvZGVkCisgKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJykKKyAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKQorICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSkKKyAqICAgICAgICAgLmVuZChjYWxsYmFjaykKKyAqCisgKiAgICAgICAvLyBkZWZhdWx0cyB0byB4LXd3dy1mb3JtLXVybGVuY29kZWQKKyAgKiAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKQorICAqICAgICAgICAuc2VuZCgnbmFtZT10b2JpJykKKyAgKiAgICAgICAgLnNlbmQoJ3NwZWNpZXM9ZmVycmV0JykKKyAgKiAgICAgICAgLmVuZChjYWxsYmFjaykKKyAqCisgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGRhdGEKKyAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZworICogQGFwaSBwdWJsaWMKKyAqLworCitSZXF1ZXN0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oZGF0YSl7CisgIHZhciBvYmogPSBpc09iamVjdChkYXRhKTsKKyAgdmFyIHR5cGUgPSB0aGlzLmdldEhlYWRlcignQ29udGVudC1UeXBlJyk7CisKKyAgLy8gbWVyZ2UKKyAgaWYgKG9iaiAmJiBpc09iamVjdCh0aGlzLl9kYXRhKSkgeworICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7CisgICAgICB0aGlzLl9kYXRhW2tleV0gPSBkYXRhW2tleV07CisgICAgfQorICB9IGVsc2UgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBkYXRhKSB7CisgICAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2Zvcm0nKTsKKyAgICB0eXBlID0gdGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpOworICAgIGlmICgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyA9PSB0eXBlKSB7CisgICAgICB0aGlzLl9kYXRhID0gdGhpcy5fZGF0YQorICAgICAgICA/IHRoaXMuX2RhdGEgKyAnJicgKyBkYXRhCisgICAgICAgIDogZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5fZGF0YSA9ICh0aGlzLl9kYXRhIHx8ICcnKSArIGRhdGE7CisgICAgfQorICB9IGVsc2UgeworICAgIHRoaXMuX2RhdGEgPSBkYXRhOworICB9CisKKyAgaWYgKCFvYmopIHJldHVybiB0aGlzOworICBpZiAoIXR5cGUpIHRoaXMudHlwZSgnanNvbicpOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorICogSW52b2tlIHRoZSBjYWxsYmFjayB3aXRoIGBlcnJgIGFuZCBgcmVzYAorICogYW5kIGhhbmRsZSBhcml0eSBjaGVjay4KKyAqCisgKiBAcGFyYW0ge0Vycm9yfSBlcnIKKyAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlcworICogQGFwaSBwcml2YXRlCisgKi8KKworUmVxdWVzdC5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbihlcnIsIHJlcyl7CisgIHZhciBmbiA9IHRoaXMuX2NhbGxiYWNrOworICB0aGlzLmNsZWFyVGltZW91dCgpOworICBpZiAoMiA9PSBmbi5sZW5ndGgpIHJldHVybiBmbihlcnIsIHJlcyk7CisgIGlmIChlcnIpIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKKyAgZm4ocmVzKTsKK307CisKKy8qKgorICogSW52b2tlIGNhbGxiYWNrIHdpdGggeC1kb21haW4gZXJyb3IuCisgKgorICogQGFwaSBwcml2YXRlCisgKi8KKworUmVxdWVzdC5wcm90b3R5cGUuY3Jvc3NEb21haW5FcnJvciA9IGZ1bmN0aW9uKCl7CisgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ09yaWdpbiBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nKTsKKyAgZXJyLmNyb3NzRG9tYWluID0gdHJ1ZTsKKyAgdGhpcy5jYWxsYmFjayhlcnIpOworfTsKKworLyoqCisgKiBJbnZva2UgY2FsbGJhY2sgd2l0aCB0aW1lb3V0IGVycm9yLgorICoKKyAqIEBhcGkgcHJpdmF0ZQorICovCisKK1JlcXVlc3QucHJvdG90eXBlLnRpbWVvdXRFcnJvciA9IGZ1bmN0aW9uKCl7CisgIHZhciB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDsKKyAgdmFyIGVyciA9IG5ldyBFcnJvcigndGltZW91dCBvZiAnICsgdGltZW91dCArICdtcyBleGNlZWRlZCcpOworICBlcnIudGltZW91dCA9IHRpbWVvdXQ7CisgIHRoaXMuY2FsbGJhY2soZXJyKTsKK307CisKKy8qKgorICogRW5hYmxlIHRyYW5zbWlzc2lvbiBvZiBjb29raWVzIHdpdGggeC1kb21haW4gcmVxdWVzdHMuCisgKgorICogTm90ZSB0aGF0IGZvciB0aGlzIHRvIHdvcmsgdGhlIG9yaWdpbiBtdXN0IG5vdCBiZQorICogdXNpbmcgIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiIgd2l0aCBhIHdpbGRjYXJkLAorICogYW5kIGFsc28gbXVzdCBzZXQgIkFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIgorICogdG8gInRydWUiLgorICoKKyAqIEBhcGkgcHVibGljCisgKi8KKworUmVxdWVzdC5wcm90b3R5cGUud2l0aENyZWRlbnRpYWxzID0gZnVuY3Rpb24oKXsKKyAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsKKyAgcmV0dXJuIHRoaXM7Cit9OworCisvKioKKyAqIEluaXRpYXRlIHJlcXVlc3QsIGludm9raW5nIGNhbGxiYWNrIGBmbihyZXMpYAorICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuCisgKgorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZworICogQGFwaSBwdWJsaWMKKyAqLworCitSZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihmbil7CisgIHZhciBzZWxmID0gdGhpczsKKyAgdmFyIHhociA9IHRoaXMueGhyID0gZ2V0WEhSKCk7CisgIHZhciBxdWVyeSA9IHRoaXMuX3F1ZXJ5LmpvaW4oJyYnKTsKKyAgdmFyIHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0OworICB2YXIgZGF0YSA9IHRoaXMuX2Zvcm1EYXRhIHx8IHRoaXMuX2RhdGE7CisKKyAgLy8gc3RvcmUgY2FsbGJhY2sKKyAgdGhpcy5fY2FsbGJhY2sgPSBmbiB8fCBub29wOworCisgIC8vIHN0YXRlIGNoYW5nZQorICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXsKKyAgICBpZiAoNCAhPSB4aHIucmVhZHlTdGF0ZSkgcmV0dXJuOworICAgIGlmICgwID09IHhoci5zdGF0dXMpIHsKKyAgICAgIGlmIChzZWxmLmFib3J0ZWQpIHJldHVybiBzZWxmLnRpbWVvdXRFcnJvcigpOworICAgICAgcmV0dXJuIHNlbGYuY3Jvc3NEb21haW5FcnJvcigpOworICAgIH0KKyAgICBzZWxmLmVtaXQoJ2VuZCcpOworICB9OworCisgIC8vIHByb2dyZXNzCisgIGlmICh4aHIudXBsb2FkKSB7CisgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZnVuY3Rpb24oZSl7CisgICAgICBlLnBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWwgKiAxMDA7CisgICAgICBzZWxmLmVtaXQoJ3Byb2dyZXNzJywgZSk7CisgICAgfTsKKyAgfQorCisgIC8vIHRpbWVvdXQKKyAgaWYgKHRpbWVvdXQgJiYgIXRoaXMuX3RpbWVyKSB7CisgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CisgICAgICBzZWxmLmFib3J0KCk7CisgICAgfSwgdGltZW91dCk7CisgIH0KKworICAvLyBxdWVyeXN0cmluZworICBpZiAocXVlcnkpIHsKKyAgICBxdWVyeSA9IHJlcXVlc3Quc2VyaWFsaXplT2JqZWN0KHF1ZXJ5KTsKKyAgICB0aGlzLnVybCArPSB+dGhpcy51cmwuaW5kZXhPZignPycpCisgICAgICA/ICcmJyArIHF1ZXJ5CisgICAgICA6ICc/JyArIHF1ZXJ5OworICB9CisKKyAgLy8gaW5pdGlhdGUgcmVxdWVzdAorICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUpOworCisgIC8vIENPUlMKKyAgaWYgKHRoaXMuX3dpdGhDcmVkZW50aWFscykgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7CisKKyAgLy8gYm9keQorICBpZiAoJ0dFVCcgIT0gdGhpcy5tZXRob2QgJiYgJ0hFQUQnICE9IHRoaXMubWV0aG9kICYmICdzdHJpbmcnICE9IHR5cGVvZiBkYXRhICYmICFpc0hvc3QoZGF0YSkpIHsKKyAgICAvLyBzZXJpYWxpemUgc3R1ZmYKKyAgICB2YXIgc2VyaWFsaXplID0gcmVxdWVzdC5zZXJpYWxpemVbdGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpXTsKKyAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpOworICB9CisKKyAgLy8gc2V0IGhlYWRlciBmaWVsZHMKKyAgZm9yICh2YXIgZmllbGQgaW4gdGhpcy5oZWFkZXIpIHsKKyAgICBpZiAobnVsbCA9PSB0aGlzLmhlYWRlcltmaWVsZF0pIGNvbnRpbnVlOworICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGZpZWxkLCB0aGlzLmhlYWRlcltmaWVsZF0pOworICB9CisKKyAgLy8gc2VuZCBzdHVmZgorICB0aGlzLmVtaXQoJ3JlcXVlc3QnLCB0aGlzKTsKKyAgeGhyLnNlbmQoZGF0YSk7CisgIHJldHVybiB0aGlzOworfTsKKworLyoqCisgKiBFeHBvc2UgYFJlcXVlc3RgLgorICovCisKK3JlcXVlc3QuUmVxdWVzdCA9IFJlcXVlc3Q7CisKKy8qKgorICogSXNzdWUgYSByZXF1ZXN0OgorICoKKyAqIEV4YW1wbGVzOgorICoKKyAqICAgIHJlcXVlc3QoJ0dFVCcsICcvdXNlcnMnKS5lbmQoY2FsbGJhY2spCisgKiAgICByZXF1ZXN0KCcvdXNlcnMnKS5lbmQoY2FsbGJhY2spCisgKiAgICByZXF1ZXN0KCcvdXNlcnMnLCBjYWxsYmFjaykKKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kCisgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gdXJsIG9yIGNhbGxiYWNrCisgKiBAcmV0dXJuIHtSZXF1ZXN0fQorICogQGFwaSBwdWJsaWMKKyAqLworCitmdW5jdGlvbiByZXF1ZXN0KG1ldGhvZCwgdXJsKSB7CisgIC8vIGNhbGxiYWNrCisgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiB1cmwpIHsKKyAgICByZXR1cm4gbmV3IFJlcXVlc3QoJ0dFVCcsIG1ldGhvZCkuZW5kKHVybCk7CisgIH0KKworICAvLyB1cmwgZmlyc3QKKyAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkgeworICAgIHJldHVybiBuZXcgUmVxdWVzdCgnR0VUJywgbWV0aG9kKTsKKyAgfQorCisgIHJldHVybiBuZXcgUmVxdWVzdChtZXRob2QsIHVybCk7Cit9CisKKy8qKgorICogR0VUIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLgorICoKKyAqIEBwYXJhbSB7U3RyaW5nfSB1cmwKKyAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IGRhdGEgb3IgZm4KKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKiBAcmV0dXJuIHtSZXF1ZXN0fQorICogQGFwaSBwdWJsaWMKKyAqLworCityZXF1ZXN0LmdldCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4peworICB2YXIgcmVxID0gcmVxdWVzdCgnR0VUJywgdXJsKTsKKyAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIGZuID0gZGF0YSwgZGF0YSA9IG51bGw7CisgIGlmIChkYXRhKSByZXEucXVlcnkoZGF0YSk7CisgIGlmIChmbikgcmVxLmVuZChmbik7CisgIHJldHVybiByZXE7Cit9OworCisvKioKKyAqIEhFQUQgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuCisgKgorICogQHBhcmFtIHtTdHJpbmd9IHVybAorICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gZGF0YSBvciBmbgorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAqIEByZXR1cm4ge1JlcXVlc3R9CisgKiBAYXBpIHB1YmxpYworICovCisKK3JlcXVlc3QuaGVhZCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4peworICB2YXIgcmVxID0gcmVxdWVzdCgnSEVBRCcsIHVybCk7CisgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsOworICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7CisgIGlmIChmbikgcmVxLmVuZChmbik7CisgIHJldHVybiByZXE7Cit9OworCisvKioKKyAqIERFTEVURSBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gdXJsCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgorICogQHJldHVybiB7UmVxdWVzdH0KKyAqIEBhcGkgcHVibGljCisgKi8KKworcmVxdWVzdC5kZWwgPSBmdW5jdGlvbih1cmwsIGZuKXsKKyAgdmFyIHJlcSA9IHJlcXVlc3QoJ0RFTEVURScsIHVybCk7CisgIGlmIChmbikgcmVxLmVuZChmbik7CisgIHJldHVybiByZXE7Cit9OworCisvKioKKyAqIFBBVENIIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuCisgKgorICogQHBhcmFtIHtTdHJpbmd9IHVybAorICogQHBhcmFtIHtNaXhlZH0gZGF0YQorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAqIEByZXR1cm4ge1JlcXVlc3R9CisgKiBAYXBpIHB1YmxpYworICovCisKK3JlcXVlc3QucGF0Y2ggPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXsKKyAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BBVENIJywgdXJsKTsKKyAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIGZuID0gZGF0YSwgZGF0YSA9IG51bGw7CisgIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTsKKyAgaWYgKGZuKSByZXEuZW5kKGZuKTsKKyAgcmV0dXJuIHJlcTsKK307CisKKy8qKgorICogUE9TVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLgorICoKKyAqIEBwYXJhbSB7U3RyaW5nfSB1cmwKKyAqIEBwYXJhbSB7TWl4ZWR9IGRhdGEKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKiBAcmV0dXJuIHtSZXF1ZXN0fQorICogQGFwaSBwdWJsaWMKKyAqLworCityZXF1ZXN0LnBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXsKKyAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BPU1QnLCB1cmwpOworICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDsKKyAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpOworICBpZiAoZm4pIHJlcS5lbmQoZm4pOworICByZXR1cm4gcmVxOworfTsKKworLyoqCisgKiBQVVQgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gdXJsCisgKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBkYXRhIG9yIGZuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgorICogQHJldHVybiB7UmVxdWVzdH0KKyAqIEBhcGkgcHVibGljCisgKi8KKworcmVxdWVzdC5wdXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXsKKyAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BVVCcsIHVybCk7CisgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsOworICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7CisgIGlmIChmbikgcmVxLmVuZChmbik7CisgIHJldHVybiByZXE7Cit9OworCisvKioKKyAqIEV4cG9zZSBgcmVxdWVzdGAuCisgKi8KKworbW9kdWxlLmV4cG9ydHMgPSByZXF1ZXN0OworCit9LHsiZW1pdHRlciI6MTEyLCJyZWR1Y2UiOjExM31dLDExMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisKKy8qKgorICogRXhwb3NlIGBFbWl0dGVyYC4KKyAqLworCittb2R1bGUuZXhwb3J0cyA9IEVtaXR0ZXI7CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIG5ldyBgRW1pdHRlcmAuCisgKgorICogQGFwaSBwdWJsaWMKKyAqLworCitmdW5jdGlvbiBFbWl0dGVyKG9iaikgeworICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTsKK307CisKKy8qKgorICogTWl4aW4gdGhlIGVtaXR0ZXIgcHJvcGVydGllcy4KKyAqCisgKiBAcGFyYW0ge09iamVjdH0gb2JqCisgKiBAcmV0dXJuIHtPYmplY3R9CisgKiBAYXBpIHByaXZhdGUKKyAqLworCitmdW5jdGlvbiBtaXhpbihvYmopIHsKKyAgZm9yICh2YXIga2V5IGluIEVtaXR0ZXIucHJvdG90eXBlKSB7CisgICAgb2JqW2tleV0gPSBFbWl0dGVyLnByb3RvdHlwZVtrZXldOworICB9CisgIHJldHVybiBvYmo7Cit9CisKKy8qKgorICogTGlzdGVuIG9uIHRoZSBnaXZlbiBgZXZlbnRgIHdpdGggYGZuYC4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKiBAcmV0dXJuIHtFbWl0dGVyfQorICogQGFwaSBwdWJsaWMKKyAqLworCitFbWl0dGVyLnByb3RvdHlwZS5vbiA9CitFbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXsKKyAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9OworICAodGhpcy5fY2FsbGJhY2tzW2V2ZW50XSA9IHRoaXMuX2NhbGxiYWNrc1tldmVudF0gfHwgW10pCisgICAgLnB1c2goZm4pOworICByZXR1cm4gdGhpczsKK307CisKKy8qKgorICogQWRkcyBhbiBgZXZlbnRgIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIGEgc2luZ2xlCisgKiB0aW1lIHRoZW4gYXV0b21hdGljYWxseSByZW1vdmVkLgorICoKKyAqIEBwYXJhbSB7U3RyaW5nfSBldmVudAorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAqIEByZXR1cm4ge0VtaXR0ZXJ9CisgKiBAYXBpIHB1YmxpYworICovCisKK0VtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbihldmVudCwgZm4peworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTsKKworICBmdW5jdGlvbiBvbigpIHsKKyAgICBzZWxmLm9mZihldmVudCwgb24pOworICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0KKworICBvbi5mbiA9IGZuOworICB0aGlzLm9uKGV2ZW50LCBvbik7CisgIHJldHVybiB0aGlzOworfTsKKworLyoqCisgKiBSZW1vdmUgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBgZXZlbnRgIG9yIGFsbAorICogcmVnaXN0ZXJlZCBjYWxsYmFja3MuCisgKgorICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50CisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgorICogQHJldHVybiB7RW1pdHRlcn0KKyAqIEBhcGkgcHVibGljCisgKi8KKworRW1pdHRlci5wcm90b3R5cGUub2ZmID0KK0VtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0KK0VtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9CitFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXsKKyAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9OworCisgIC8vIGFsbAorICBpZiAoMCA9PSBhcmd1bWVudHMubGVuZ3RoKSB7CisgICAgdGhpcy5fY2FsbGJhY2tzID0ge307CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLyBzcGVjaWZpYyBldmVudAorICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzW2V2ZW50XTsKKyAgaWYgKCFjYWxsYmFja3MpIHJldHVybiB0aGlzOworCisgIC8vIHJlbW92ZSBhbGwgaGFuZGxlcnMKKyAgaWYgKDEgPT0gYXJndW1lbnRzLmxlbmd0aCkgeworICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXIKKyAgdmFyIGNiOworICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykgeworICAgIGNiID0gY2FsbGJhY2tzW2ldOworICAgIGlmIChjYiA9PT0gZm4gfHwgY2IuZm4gPT09IGZuKSB7CisgICAgICBjYWxsYmFja3Muc3BsaWNlKGksIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0aGlzOworfTsKKworLyoqCisgKiBFbWl0IGBldmVudGAgd2l0aCB0aGUgZ2l2ZW4gYXJncy4KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQKKyAqIEBwYXJhbSB7TWl4ZWR9IC4uLgorICogQHJldHVybiB7RW1pdHRlcn0KKyAqLworCitFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnQpeworICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307CisgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpCisgICAgLCBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdOworCisgIGlmIChjYWxsYmFja3MpIHsKKyAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0aGlzOworfTsKKworLyoqCisgKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLgorICoKKyAqIEBwYXJhbSB7U3RyaW5nfSBldmVudAorICogQHJldHVybiB7QXJyYXl9CisgKiBAYXBpIHB1YmxpYworICovCisKK0VtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXsKKyAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9OworICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzW2V2ZW50XSB8fCBbXTsKK307CisKKy8qKgorICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLgorICoKKyAqIEBwYXJhbSB7U3RyaW5nfSBldmVudAorICogQHJldHVybiB7Qm9vbGVhbn0KKyAqIEBhcGkgcHVibGljCisgKi8KKworRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpeworICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDsKK307CisKK30se31dLDExMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CisKKy8qKgorICogUmVkdWNlIGBhcnJgIHdpdGggYGZuYC4KKyAqCisgKiBAcGFyYW0ge0FycmF5fSBhcnIKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKiBAcGFyYW0ge01peGVkfSBpbml0aWFsCisgKgorICogVE9ETzogY29tYmF0aWJsZSBlcnJvciBoYW5kbGluZz8KKyAqLworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgZm4sIGluaXRpYWwpeyAgCisgIHZhciBpZHggPSAwOworICB2YXIgbGVuID0gYXJyLmxlbmd0aDsKKyAgdmFyIGN1cnIgPSBhcmd1bWVudHMubGVuZ3RoID09IDMKKyAgICA/IGluaXRpYWwKKyAgICA6IGFycltpZHgrK107CisKKyAgd2hpbGUgKGlkeCA8IGxlbikgeworICAgIGN1cnIgPSBmbi5jYWxsKG51bGwsIGN1cnIsIGFycltpZHhdLCArK2lkeCwgYXJyKTsKKyAgfQorICAKKyAgcmV0dXJuIGN1cnI7Cit9OworfSx7fV19LHt9LFsxXSkoMSkKK30pOworLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTlpY205M2MyVnlhV1o1TDI1dlpHVmZiVzlrZFd4bGN5OWljbTkzYzJWeUxYQmhZMnN2WDNCeVpXeDFaR1V1YW5NaUxDSnBibVJsZUM1cWN5SXNJbXhwWWk5aGRYUm9MbXB6SWl3aWJHbGlMMk5zYVdWdWRDNXFjeUlzSW14cFlpOW9aV3h3WlhKekxtcHpJaXdpYkdsaUwyaDBkSEF1YW5NaUxDSnNhV0l2Y21WemIyeDJaWEl1YW5NaUxDSnNhV0l2YzNCbFl5MWpiMjUyWlhKMFpYSXVhbk1pTENKc2FXSXZkSGx3WlhNdmJXOWtaV3d1YW5NaUxDSnNhV0l2ZEhsd1pYTXZiM0JsY21GMGFXOXVMbXB6SWl3aWJHbGlMM1I1Y0dWekwyOXdaWEpoZEdsdmJrZHliM1Z3TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJKeWIzZHpaWEpwWm5rdmJtOWtaVjl0YjJSMWJHVnpMMkoxWm1abGNpOXBibVJsZUM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5aWNtOTNjMlZ5YVdaNUwyNXZaR1ZmYlc5a2RXeGxjeTlpZFdabVpYSXZibTlrWlY5dGIyUjFiR1Z6TDJKaGMyVTJOQzFxY3k5c2FXSXZZalkwTG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJKeWIzZHpaWEpwWm5rdmJtOWtaVjl0YjJSMWJHVnpMMkoxWm1abGNpOXViMlJsWDIxdlpIVnNaWE12YVdWbFpUYzFOQzlwYm1SbGVDNXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OWljbTkzYzJWeWFXWjVMMjV2WkdWZmJXOWtkV3hsY3k5aWRXWm1aWEl2Ym05a1pWOXRiMlIxYkdWekwybHpMV0Z5Y21GNUwybHVaR1Y0TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJKeWIzZHpaWEpwWm5rdmJtOWtaVjl0YjJSMWJHVnpMM0J5YjJObGMzTXZZbkp2ZDNObGNpNXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OWlkRzloTDJsdVpHVjRMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMk52YjJ0cFpXcGhjaTlqYjI5cmFXVnFZWEl1YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12YW5GMVpYSjVMMlJwYzNRdmFuRjFaWEo1TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZZWEp5WVhrdmFXNWtaWGhQWmk1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMk5vWVdsdUwyeHZaR0Z6YUM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMk52Ykd4bFkzUnBiMjR2Wm1sdVpDNXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDJOdmJHeGxZM1JwYjI0dlptOXlSV0ZqYUM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMk52Ykd4bFkzUnBiMjR2YldGd0xtcHpJaXdpYm05a1pWOXRiMlIxYkdWekwyeHZaR0Z6YUMxamIyMXdZWFF2WkdGMFpTOXViM2N1YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12Ykc5a1lYTm9MV052YlhCaGRDOW1kVzVqZEdsdmJpOWlhVzVrTG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZablZ1WTNScGIyNHZjbVZ6ZEZCaGNtRnRMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlRHRjZlVmR5WVhCd1pYSXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5TWIyUmhjMmhYY21Gd2NHVnlMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dllYSnlZWGxEYjNCNUxtcHpJaXdpYm05a1pWOXRiMlIxYkdWekwyeHZaR0Z6YUMxamIyMXdZWFF2YVc1MFpYSnVZV3d2WVhKeVlYbEZZV05vTG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZZWEp5WVhsTllYQXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5aVlYTmxRMkZzYkdKaFkyc3Vhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5aVlYTmxRMnh2Ym1VdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlwYm5SbGNtNWhiQzlpWVhObFEyOXdlUzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wySmhjMlZEY21WaGRHVXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5aVlYTmxSV0ZqYUM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMMkpoYzJWR2FXNWtMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlltRnpaVVpwYm1SSmJtUmxlQzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wySmhjMlZHYjNJdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlwYm5SbGNtNWhiQzlpWVhObFJtOXlTVzR1YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12Ykc5a1lYTm9MV052YlhCaGRDOXBiblJsY201aGJDOWlZWE5sUm05eVQzZHVMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlltRnpaVWx1WkdWNFQyWXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5aVlYTmxTWE5GY1hWaGJDNXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDJsdWRHVnlibUZzTDJKaGMyVkpjMFZ4ZFdGc1JHVmxjQzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wySmhjMlZKYzBaMWJtTjBhVzl1TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZZbUZ6WlVselRXRjBZMmd1YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12Ykc5a1lYTm9MV052YlhCaGRDOXBiblJsY201aGJDOWlZWE5sVEc5a1lYTm9MbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlltRnpaVTFoY0M1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMMkpoYzJWTllYUmphR1Z6TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZZbUZ6WlUxaGRHTm9aWE5RY205d1pYSjBlUzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wySmhjMlZRY205d1pYSjBlUzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wySmhjMlZUWlhSRVlYUmhMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlltRnpaVlJ2VTNSeWFXNW5MbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlltbHVZWEo1U1c1a1pYZ3Vhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5aWFXNWhjbmxKYm1SbGVFSjVMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlltbHVaRU5oYkd4aVlXTnJMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlluVm1abVZ5UTJ4dmJtVXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5amIyMXdiM05sUVhKbmN5NXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDJsdWRHVnlibUZzTDJOdmJYQnZjMlZCY21kelVtbG5hSFF1YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12Ykc5a1lYTm9MV052YlhCaGRDOXBiblJsY201aGJDOWpjbVZoZEdWQ1lYTmxSV0ZqYUM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMMk55WldGMFpVSmhjMlZHYjNJdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlwYm5SbGNtNWhiQzlqY21WaGRHVkNhVzVrVjNKaGNIQmxjaTVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wyTnlaV0YwWlVOMGIzSlhjbUZ3Y0dWeUxtcHpJaXdpYm05a1pWOXRiMlIxYkdWekwyeHZaR0Z6YUMxamIyMXdZWFF2YVc1MFpYSnVZV3d2WTNKbFlYUmxSbWx1WkM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMMk55WldGMFpVWnZja1ZoWTJndWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlwYm5SbGNtNWhiQzlqY21WaGRHVkllV0p5YVdSWGNtRndjR1Z5TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZZM0psWVhSbFVHRnlkR2xoYkZkeVlYQndaWEl1YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12Ykc5a1lYTm9MV052YlhCaGRDOXBiblJsY201aGJDOWpjbVZoZEdWWGNtRndjR1Z5TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZaWEYxWVd4QmNuSmhlWE11YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12Ykc5a1lYTm9MV052YlhCaGRDOXBiblJsY201aGJDOWxjWFZoYkVKNVZHRm5MbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dlpYRjFZV3hQWW1wbFkzUnpMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dloyVjBSR0YwWVM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMMmRsZEVaMWJtTk9ZVzFsTG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZhVzVrWlhoUFprNWhUaTVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wybHVhWFJEYkc5dVpVRnljbUY1TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZhVzVwZEVOc2IyNWxRbmxVWVdjdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlwYm5SbGNtNWhiQzlwYm1sMFEyeHZibVZQWW1wbFkzUXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5cGMwaHZjM1JQWW1wbFkzUXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5cGMwbHVaR1Y0TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZhWE5NWVhwcFlXSnNaUzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wybHpUR1Z1WjNSb0xtcHpJaXdpYm05a1pWOXRiMlIxYkdWekwyeHZaR0Z6YUMxamIyMXdZWFF2YVc1MFpYSnVZV3d2YVhOUFltcGxZM1JNYVd0bExtcHpJaXdpYm05a1pWOXRiMlIxYkdWekwyeHZaR0Z6YUMxamIyMXdZWFF2YVc1MFpYSnVZV3d2YVhOVGRISnBZM1JEYjIxd1lYSmhZbXhsTG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZiV1Z5WjJWRVlYUmhMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmFXNTBaWEp1WVd3dmJXVjBZVTFoY0M1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMM0psWVd4T1lXMWxjeTVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wzSmxiM0prWlhJdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlwYm5SbGNtNWhiQzl5WlhCc1lXTmxTRzlzWkdWeWN5NXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDJsdWRHVnlibUZzTDNObGRFUmhkR0V1YW5NaUxDSnViMlJsWDIxdlpIVnNaWE12Ykc5a1lYTm9MV052YlhCaGRDOXBiblJsY201aGJDOXphR2x0U1hOUWJHRnBiazlpYW1WamRDNXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDJsdWRHVnlibUZzTDNOb2FXMUxaWGx6TG1weklpd2libTlrWlY5dGIyUjFiR1Z6TDJ4dlpHRnphQzFqYjIxd1lYUXZhVzUwWlhKdVlXd3ZkRzlQWW1wbFkzUXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5cGJuUmxjbTVoYkM5M2NtRndjR1Z5UTJ4dmJtVXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5c1lXNW5MMk5zYjI1bFJHVmxjQzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwyeGhibWN2YVhOQmNtZDFiV1Z1ZEhNdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlzWVc1bkwybHpRWEp5WVhrdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzlzWVc1bkwybHpSblZ1WTNScGIyNHVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5c1lXNW5MMmx6VG1GMGFYWmxMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmJHRnVaeTlwYzA5aWFtVmpkQzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwyeGhibWN2YVhOUWJHRnBiazlpYW1WamRDNXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDJ4aGJtY3ZhWE5UZEhKcGJtY3Vhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5c1lXNW5MMmx6Vkhsd1pXUkJjbkpoZVM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMnhoYm1jdmFYTlZibVJsWm1sdVpXUXVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5dlltcGxZM1F2YTJWNWN5NXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDI5aWFtVmpkQzlyWlhselNXNHVhbk1pTENKdWIyUmxYMjF2WkhWc1pYTXZiRzlrWVhOb0xXTnZiWEJoZEM5emRISnBibWN2WlhOallYQmxVbVZuUlhod0xtcHpJaXdpYm05a1pWOXRiMlIxYkdWekwyeHZaR0Z6YUMxamIyMXdZWFF2YzNWd2NHOXlkQzVxY3lJc0ltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwzVjBhV3hwZEhrdlkyOXVjM1JoYm5RdWFuTWlMQ0p1YjJSbFgyMXZaSFZzWlhNdmJHOWtZWE5vTFdOdmJYQmhkQzkxZEdsc2FYUjVMMmxrWlc1MGFYUjVMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMMnh2WkdGemFDMWpiMjF3WVhRdmRYUnBiR2wwZVM5dWIyOXdMbXB6SWl3aWJtOWtaVjl0YjJSMWJHVnpMM04xY0dWeVlXZGxiblF2YkdsaUwyTnNhV1Z1ZEM1cWN5SXNJbTV2WkdWZmJXOWtkV3hsY3k5emRYQmxjbUZuWlc1MEwyNXZaR1ZmYlc5a2RXeGxjeTlqYjIxd2IyNWxiblF0WlcxcGRIUmxjaTlwYm1SbGVDNXFjeUlzSW01dlpHVmZiVzlrZFd4bGN5OXpkWEJsY21GblpXNTBMMjV2WkdWZmJXOWtkV3hsY3k5eVpXUjFZMlV0WTI5dGNHOXVaVzUwTDJsdVpHVjRMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQk8wRkRRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRMjVEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZETjBoQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN096dEJRM3BqUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenM3TzBGRE4wZEJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRMnhPUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRGNsTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRlR3BDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU16V2tFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRE4zbENRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUTJoQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRGJucERRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUXpWSVFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTndSa0U3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRha05CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN096dEJRekZFUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN096dEJRMnhDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZEY0ZGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRjaTlTUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVONlJFRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRekZJUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRlRVJCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZEY2tOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTndSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRlRUpCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTjRSRUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTXhSRUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRE0wSkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM0pDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRjRUpCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRkRUpCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUTNKQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRGJrTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZEY2tsQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN096dEJRM3BDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3T3pzN1FVTjJRa0U3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRaa0U3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVONlFrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM1pDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZEYWtKQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVOcVFrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlEycENRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVNelFrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU5zUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkROVWRCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRMlpCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRha1JCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZEVmtFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM0JDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTTNRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRekZDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRFpFRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlEycENRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUTJoQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTjJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM0pFUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3TzBGRGRrTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN096czdRVU4yUkVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTnNRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRGNFTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRemxDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN08wRkRNMEpCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN096czdRVU4wUWtFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlEzWkNRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUTNwQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPenRCUTNCQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenM3T3p0QlEyaElRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenM3TzBGRE0wTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU4wUmtFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRkRVJCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRha1JCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTXhSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkRaa0U3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU55UTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlEzWkNRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN096dEJRekZDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPenM3UVVOb1JrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU5vUWtFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRGNrSkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM0pDUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZEYWtKQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU53UWtFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRFdrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGRFprRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3pzN1FVTjZSa0U3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3T3pzN1FVTlVRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlEwcEJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVNM1FrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTTFRa0U3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUTNwRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRemRFUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZETlVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVNeFFrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZEYkVKQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM1JFUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlEzQkVRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3pzN1FVTjRRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN096czdRVU14UTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVOMlJFRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTTFRa0U3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGREwwUkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVTnVRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlF6RkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU55UWtFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVU5xUkVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM3BKUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3T3p0QlEyaERRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3pzN08wRkRlRXhCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVOMlFrRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUTNCQ1FUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlEyNUNRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM3BxUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRM0JMUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEVpTENKbWFXeGxJam9pWjJWdVpYSmhkR1ZrTG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpaG1kVzVqZEdsdmJpQmxLSFFzYml4eUtYdG1kVzVqZEdsdmJpQnpLRzhzZFNsN2FXWW9JVzViYjEwcGUybG1LQ0YwVzI5ZEtYdDJZWElnWVQxMGVYQmxiMllnY21WeGRXbHlaVDA5WENKbWRXNWpkR2x2Ymx3aUppWnlaWEYxYVhKbE8ybG1LQ0YxSmlaaEtYSmxkSFZ5YmlCaEtHOHNJVEFwTzJsbUtHa3BjbVYwZFhKdUlHa29ieXdoTUNrN2RtRnlJR1k5Ym1WM0lFVnljbTl5S0Z3aVEyRnVibTkwSUdacGJtUWdiVzlrZFd4bElDZGNJaXR2SzF3aUoxd2lLVHQwYUhKdmR5Qm1MbU52WkdVOVhDSk5UMFJWVEVWZlRrOVVYMFpQVlU1RVhDSXNabjEyWVhJZ2JEMXVXMjlkUFh0bGVIQnZjblJ6T250OWZUdDBXMjlkV3pCZExtTmhiR3dvYkM1bGVIQnZjblJ6TEdaMWJtTjBhVzl1S0dVcGUzWmhjaUJ1UFhSYmIxMWJNVjFiWlYwN2NtVjBkWEp1SUhNb2JqOXVPbVVwZlN4c0xHd3VaWGh3YjNKMGN5eGxMSFFzYml4eUtYMXlaWFIxY200Z2JsdHZYUzVsZUhCdmNuUnpmWFpoY2lCcFBYUjVjR1Z2WmlCeVpYRjFhWEpsUFQxY0ltWjFibU4wYVc5dVhDSW1KbkpsY1hWcGNtVTdabTl5S0haaGNpQnZQVEE3Ynp4eUxteGxibWQwYUR0dkt5c3BjeWh5VzI5ZEtUdHlaWFIxY200Z2MzMHBJaXdpSjNWelpTQnpkSEpwWTNRbk8xeHVYRzUyWVhJZ1lYVjBhQ0E5SUhKbGNYVnBjbVVvSnk0dmJHbGlMMkYxZEdnbktUdGNiblpoY2lCb1pXeHdaWEp6SUQwZ2NtVnhkV2x5WlNnbkxpOXNhV0l2YUdWc2NHVnljeWNwTzF4dWRtRnlJRk4zWVdkblpYSkRiR2xsYm5RZ1BTQnlaWEYxYVhKbEtDY3VMMnhwWWk5amJHbGxiblFuS1R0Y2JuWmhjaUJrWlhCeVpXTmhkR2x2YmxkeVlYQndaWElnUFNCbWRXNWpkR2x2YmlBb2RYSnNMQ0J2Y0hScGIyNXpLU0I3WEc0Z0lHaGxiSEJsY25NdWJHOW5LQ2RVYUdseklHbHpJR1JsY0hKbFkyRjBaV1FzSUhWelpTQmNJbTVsZHlCVGQyRm5aMlZ5UTJ4cFpXNTBYQ0lnYVc1emRHVmhaQzRuS1R0Y2JseHVJQ0J5WlhSMWNtNGdibVYzSUZOM1lXZG5aWEpEYkdsbGJuUW9kWEpzTENCdmNIUnBiMjV6S1R0Y2JuMDdYRzVjYmk4cUlFaGxjbVVnWm05eUlFbEZPQ0JUZFhCd2IzSjBJQ292WEc1cFppQW9JVUZ5Y21GNUxuQnliM1J2ZEhsd1pTNXBibVJsZUU5bUtTQjdYRzRnSUVGeWNtRjVMbkJ5YjNSdmRIbHdaUzVwYm1SbGVFOW1JRDBnWm5WdVkzUnBiMjRvYjJKcUxDQnpkR0Z5ZENrZ2UxeHVJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQW9jM1JoY25RZ2ZId2dNQ2tzSUdvZ1BTQjBhR2x6TG14bGJtZDBhRHNnYVNBOElHbzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLSFJvYVhOYmFWMGdQVDA5SUc5aWFpa2dleUJ5WlhSMWNtNGdhVHNnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z0xURTdYRzRnSUgwN1hHNTlPMXh1WEc0dktpQklaWEpsSUdadmNpQnViMlJsSURFd0xuZ2djM1Z3Y0c5eWRDQXFMMXh1YVdZZ0tDRlRkSEpwYm1jdWNISnZkRzkwZVhCbExtVnVaSE5YYVhSb0tTQjdYRzRnSUZOMGNtbHVaeTV3Y205MGIzUjVjR1V1Wlc1a2MxZHBkR2dnUFNCbWRXNWpkR2x2YmloemRXWm1hWGdwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1cGJtUmxlRTltS0hOMVptWnBlQ3dnZEdocGN5NXNaVzVuZEdnZ0xTQnpkV1ptYVhndWJHVnVaM1JvS1NBaFBUMGdMVEU3WEc0Z0lIMDdYRzU5TzF4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlGTjNZV2RuWlhKRGJHbGxiblE3WEc1Y2JsTjNZV2RuWlhKRGJHbGxiblF1UVhCcFMyVjVRWFYwYUc5eWFYcGhkR2x2YmlBOUlHRjFkR2d1UVhCcFMyVjVRWFYwYUc5eWFYcGhkR2x2Ymp0Y2JsTjNZV2RuWlhKRGJHbGxiblF1VUdGemMzZHZjbVJCZFhSb2IzSnBlbUYwYVc5dUlEMGdZWFYwYUM1UVlYTnpkMjl5WkVGMWRHaHZjbWw2WVhScGIyNDdYRzVUZDJGbloyVnlRMnhwWlc1MExrTnZiMnRwWlVGMWRHaHZjbWw2WVhScGIyNGdQU0JoZFhSb0xrTnZiMnRwWlVGMWRHaHZjbWw2WVhScGIyNDdYRzVUZDJGbloyVnlRMnhwWlc1MExsTjNZV2RuWlhKQmNHa2dQU0JrWlhCeVpXTmhkR2x2YmxkeVlYQndaWEk3WEc1VGQyRm5aMlZ5UTJ4cFpXNTBMbE4zWVdkblpYSkRiR2xsYm5RZ1BTQmtaWEJ5WldOaGRHbHZibGR5WVhCd1pYSTdYRzRpTENJbmRYTmxJSE4wY21samRDYzdYRzVjYm5aaGNpQmlkRzloSUQwZ2NtVnhkV2x5WlNnblluUnZZU2NwT3lBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNiblpoY2lCRGIyOXJhV1ZLWVhJZ1BTQnlaWEYxYVhKbEtDZGpiMjlyYVdWcVlYSW5LVHRjYmx4dUx5b3FYRzRnS2lCVGQyRm5aMlZ5UVhWMGFHOXlhWHBoZEdsdmJuTWdZWEJ3YkhseklIUm9aU0JqYjNKeVpXTjBJR0YxZEdodmNtbDZZWFJwYjI0Z2RHOGdZVzRnYjNCbGNtRjBhVzl1SUdKbGFXNW5JR1Y0WldOMWRHVmtYRzRnS2k5Y2JuWmhjaUJUZDJGbloyVnlRWFYwYUc5eWFYcGhkR2x2Ym5NZ1BTQnRiMlIxYkdVdVpYaHdiM0owY3k1VGQyRm5aMlZ5UVhWMGFHOXlhWHBoZEdsdmJuTWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJSFJvYVhNdVlYVjBhSG9nUFNCN2ZUdGNibjA3WEc1Y2JsTjNZV2RuWlhKQmRYUm9iM0pwZW1GMGFXOXVjeTV3Y205MGIzUjVjR1V1WVdSa0lEMGdablZ1WTNScGIyNGdLRzVoYldVc0lHRjFkR2dwSUh0Y2JpQWdkR2hwY3k1aGRYUm9lbHR1WVcxbFhTQTlJR0YxZEdnN1hHNWNiaUFnY21WMGRYSnVJR0YxZEdnN1hHNTlPMXh1WEc1VGQyRm5aMlZ5UVhWMGFHOXlhWHBoZEdsdmJuTXVjSEp2ZEc5MGVYQmxMbkpsYlc5MlpTQTlJR1oxYm1OMGFXOXVJQ2h1WVcxbEtTQjdYRzRnSUhKbGRIVnliaUJrWld4bGRHVWdkR2hwY3k1aGRYUm9lbHR1WVcxbFhUdGNibjA3WEc1Y2JsTjNZV2RuWlhKQmRYUm9iM0pwZW1GMGFXOXVjeTV3Y205MGIzUjVjR1V1WVhCd2JIa2dQU0JtZFc1amRHbHZiaUFvYjJKcUxDQmhkWFJvYjNKcGVtRjBhVzl1Y3lrZ2UxeHVJQ0IyWVhJZ2MzUmhkSFZ6SUQwZ2JuVnNiRHRjYmlBZ2RtRnlJR3RsZVN3Z2JtRnRaU3dnZG1Gc2RXVXNJSEpsYzNWc2REdGNibHh1SUNBdkx5QnBaaUIwYUdVZ0oyRjFkR2h2Y21sNllYUnBiMjV6SnlCclpYa2dhWE1nZFc1a1pXWnBibVZrTENCdmNpQm9ZWE1nWVc0Z1pXMXdkSGtnWVhKeVlYa3NJR0ZrWkNCaGJHd2dhMlY1YzF4dUlDQnBaaUFvZEhsd1pXOW1JR0YxZEdodmNtbDZZWFJwYjI1eklEMDlQU0FuZFc1a1pXWnBibVZrSnlCOGZDQlBZbXBsWTNRdWEyVjVjeWhoZFhSb2IzSnBlbUYwYVc5dWN5a3ViR1Z1WjNSb0lEMDlQU0F3S1NCN1hHNGdJQ0FnWm05eUlDaHJaWGtnYVc0Z2RHaHBjeTVoZFhSb2Vpa2dlMXh1SUNBZ0lDQWdkbUZzZFdVZ1BTQjBhR2x6TG1GMWRHaDZXMnRsZVYwN1hHNGdJQ0FnSUNCeVpYTjFiSFFnUFNCMllXeDFaUzVoY0hCc2VTaHZZbW9zSUdGMWRHaHZjbWw2WVhScGIyNXpLVHRjYmx4dUlDQWdJQ0FnYVdZZ0tISmxjM1ZzZENBOVBUMGdkSEoxWlNrZ2UxeHVJQ0FnSUNBZ0lDQnpkR0YwZFhNZ1BTQjBjblZsTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0F2THlBeUxqQWdjM1Z3Y0c5eWRGeHVJQ0FnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0dGMWRHaHZjbWw2WVhScGIyNXpLU2tnZTF4dUlDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCaGRYUm9iM0pwZW1GMGFXOXVjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWVhWMGFDQTlJR0YxZEdodmNtbDZZWFJwYjI1elcybGRPMXh1WEc0Z0lDQWdJQ0FnSUdadmNpQW9ibUZ0WlNCcGJpQmhkWFJvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdabTl5SUNoclpYa2dhVzRnZEdocGN5NWhkWFJvZWlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHdGxlU0E5UFQwZ2JtRnRaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVd4MVpTQTlJSFJvYVhNdVlYVjBhSHBiYTJWNVhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2RtRnNkV1V1WVhCd2JIa29iMkpxTENCaGRYUm9iM0pwZW1GMGFXOXVjeWs3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tISmxjM1ZzZENBOVBUMGdkSEoxWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITjBZWFIxY3lBOUlIUnlkV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdMeThnTVM0eUlITjFjSEJ2Y25SY2JpQWdJQ0FnSUdadmNpQW9ibUZ0WlNCcGJpQmhkWFJvYjNKcGVtRjBhVzl1Y3lrZ2UxeHVJQ0FnSUNBZ0lDQm1iM0lnS0d0bGVTQnBiaUIwYUdsekxtRjFkR2g2S1NCN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0d0bGVTQTlQVDBnYm1GdFpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCMGFHbHpMbUYxZEdoNlcydGxlVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQjJZV3gxWlM1aGNIQnNlU2h2WW1vc0lHRjFkR2h2Y21sNllYUnBiMjV6S1R0Y2JseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tISmxjM1ZzZENBOVBUMGdkSEoxWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCemRHRjBkWE1nUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ6ZEdGMGRYTTdYRzU5TzF4dVhHNHZLaXBjYmlBcUlFRndhVXRsZVVGMWRHaHZjbWw2WVhScGIyNGdZV3hzYjNkeklHRWdjWFZsY25rZ2NHRnlZVzBnYjNJZ2FHVmhaR1Z5SUhSdklHSmxJR2x1YW1WamRHVmtYRzRnS2k5Y2JuWmhjaUJCY0dsTFpYbEJkWFJvYjNKcGVtRjBhVzl1SUQwZ2JXOWtkV3hsTG1WNGNHOXlkSE11UVhCcFMyVjVRWFYwYUc5eWFYcGhkR2x2YmlBOUlHWjFibU4wYVc5dUlDaHVZVzFsTENCMllXeDFaU3dnZEhsd1pTa2dlMXh1SUNCMGFHbHpMbTVoYldVZ1BTQnVZVzFsTzF4dUlDQjBhR2x6TG5aaGJIVmxJRDBnZG1Gc2RXVTdYRzRnSUhSb2FYTXVkSGx3WlNBOUlIUjVjR1U3WEc1OU8xeHVYRzVCY0dsTFpYbEJkWFJvYjNKcGVtRjBhVzl1TG5CeWIzUnZkSGx3WlM1aGNIQnNlU0E5SUdaMWJtTjBhVzl1SUNodlltb3BJSHRjYmlBZ2FXWWdLSFJvYVhNdWRIbHdaU0E5UFQwZ0ozRjFaWEo1SnlrZ2UxeHVJQ0FnSUdsbUlDaHZZbW91ZFhKc0xtbHVaR1Y0VDJZb0p6OG5LU0ErSURBcElIdGNiaUFnSUNBZ0lHOWlhaTUxY213Z1BTQnZZbW91ZFhKc0lDc2dKeVluSUNzZ2RHaHBjeTV1WVcxbElDc2dKejBuSUNzZ2RHaHBjeTUyWVd4MVpUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnYjJKcUxuVnliQ0E5SUc5aWFpNTFjbXdnS3lBblB5Y2dLeUIwYUdsekxtNWhiV1VnS3lBblBTY2dLeUIwYUdsekxuWmhiSFZsTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEhWeWJpQjBjblZsTzF4dUlDQjlJR1ZzYzJVZ2FXWWdLSFJvYVhNdWRIbHdaU0E5UFQwZ0oyaGxZV1JsY2ljcElIdGNiaUFnSUNCdlltb3VhR1ZoWkdWeWMxdDBhR2x6TG01aGJXVmRJRDBnZEdocGN5NTJZV3gxWlR0Y2JseHVJQ0FnSUhKbGRIVnliaUIwY25WbE8xeHVJQ0I5WEc1OU8xeHVYRzUyWVhJZ1EyOXZhMmxsUVhWMGFHOXlhWHBoZEdsdmJpQTlJRzF2WkhWc1pTNWxlSEJ2Y25SekxrTnZiMnRwWlVGMWRHaHZjbWw2WVhScGIyNGdQU0JtZFc1amRHbHZiaUFvWTI5dmEybGxLU0I3WEc0Z0lIUm9hWE11WTI5dmEybGxJRDBnWTI5dmEybGxPMXh1ZlR0Y2JseHVRMjl2YTJsbFFYVjBhRzl5YVhwaGRHbHZiaTV3Y205MGIzUjVjR1V1WVhCd2JIa2dQU0JtZFc1amRHbHZiaUFvYjJKcUtTQjdYRzRnSUc5aWFpNWpiMjlyYVdWS1lYSWdQU0J2WW1vdVkyOXZhMmxsU21GeUlIeDhJRzVsZHlCRGIyOXJhV1ZLWVhJb0tUdGNiaUFnYjJKcUxtTnZiMnRwWlVwaGNpNXpaWFJEYjI5cmFXVW9kR2hwY3k1amIyOXJhV1VwTzF4dVhHNGdJSEpsZEhWeWJpQjBjblZsTzF4dWZUdGNibHh1THlvcVhHNGdLaUJRWVhOemQyOXlaQ0JCZFhSb2IzSnBlbUYwYVc5dUlHbHpJR0VnWW1GemFXTWdZWFYwYUNCcGJYQnNaVzFsYm5SaGRHbHZibHh1SUNvdlhHNTJZWElnVUdGemMzZHZjbVJCZFhSb2IzSnBlbUYwYVc5dUlEMGdiVzlrZFd4bExtVjRjRzl5ZEhNdVVHRnpjM2R2Y21SQmRYUm9iM0pwZW1GMGFXOXVJRDBnWm5WdVkzUnBiMjRnS0c1aGJXVXNJSFZ6WlhKdVlXMWxMQ0J3WVhOemQyOXlaQ2tnZTF4dUlDQjBhR2x6TG01aGJXVWdQU0J1WVcxbE8xeHVJQ0IwYUdsekxuVnpaWEp1WVcxbElEMGdkWE5sY201aGJXVTdYRzRnSUhSb2FYTXVjR0Z6YzNkdmNtUWdQU0J3WVhOemQyOXlaRHRjYm4wN1hHNWNibEJoYzNOM2IzSmtRWFYwYUc5eWFYcGhkR2x2Ymk1d2NtOTBiM1I1Y0dVdVlYQndiSGtnUFNCbWRXNWpkR2x2YmlBb2IySnFLU0I3WEc0Z0lHOWlhaTVvWldGa1pYSnpMa0YxZEdodmNtbDZZWFJwYjI0Z1BTQW5RbUZ6YVdNZ0p5QXJJR0owYjJFb2RHaHBjeTUxYzJWeWJtRnRaU0FySUNjNkp5QXJJSFJvYVhNdWNHRnpjM2R2Y21RcE8xeHVYRzRnSUhKbGRIVnliaUIwY25WbE8xeHVmVHRjYmlJc0lpZDFjMlVnYzNSeWFXTjBKenRjYmx4dWRtRnlJRjhnUFNCN1hHNGdJR0pwYm1RNklISmxjWFZwY21Vb0oyeHZaR0Z6YUMxamIyMXdZWFF2Wm5WdVkzUnBiMjR2WW1sdVpDY3BMRnh1SUNCamJHOXVaVVJsWlhBNklISmxjWFZwY21Vb0oyeHZaR0Z6YUMxamIyMXdZWFF2YkdGdVp5OWpiRzl1WlVSbFpYQW5LU3hjYmlBZ1ptbHVaRG9nY21WeGRXbHlaU2duYkc5a1lYTm9MV052YlhCaGRDOWpiMnhzWldOMGFXOXVMMlpwYm1RbktTeGNiaUFnWm05eVJXRmphRG9nY21WeGRXbHlaU2duYkc5a1lYTm9MV052YlhCaGRDOWpiMnhzWldOMGFXOXVMMlp2Y2tWaFkyZ25LU3hjYmlBZ2FXNWtaWGhQWmpvZ2NtVnhkV2x5WlNnbmJHOWtZWE5vTFdOdmJYQmhkQzloY25KaGVTOXBibVJsZUU5bUp5a3NYRzRnSUdselFYSnlZWGs2SUhKbGNYVnBjbVVvSjJ4dlpHRnphQzFqYjIxd1lYUXZiR0Z1Wnk5cGMwRnljbUY1Snlrc1hHNGdJR2x6Um5WdVkzUnBiMjQ2SUhKbGNYVnBjbVVvSjJ4dlpHRnphQzFqYjIxd1lYUXZiR0Z1Wnk5cGMwWjFibU4wYVc5dUp5a3NYRzRnSUdselVHeGhhVzVQWW1wbFkzUTZJSEpsY1hWcGNtVW9KMnh2WkdGemFDMWpiMjF3WVhRdmJHRnVaeTlwYzFCc1lXbHVUMkpxWldOMEp5a3NYRzRnSUdselZXNWtaV1pwYm1Wa09pQnlaWEYxYVhKbEtDZHNiMlJoYzJndFkyOXRjR0YwTDJ4aGJtY3ZhWE5WYm1SbFptbHVaV1FuS1Z4dWZUdGNiblpoY2lCaGRYUm9JRDBnY21WeGRXbHlaU2duTGk5aGRYUm9KeWs3WEc1MllYSWdhR1ZzY0dWeWN5QTlJSEpsY1hWcGNtVW9KeTR2YUdWc2NHVnljeWNwTzF4dWRtRnlJRTF2WkdWc0lEMGdjbVZ4ZFdseVpTZ25MaTkwZVhCbGN5OXRiMlJsYkNjcE8xeHVkbUZ5SUU5d1pYSmhkR2x2YmlBOUlISmxjWFZwY21Vb0p5NHZkSGx3WlhNdmIzQmxjbUYwYVc5dUp5azdYRzUyWVhJZ1QzQmxjbUYwYVc5dVIzSnZkWEFnUFNCeVpYRjFhWEpsS0NjdUwzUjVjR1Z6TDI5d1pYSmhkR2x2YmtkeWIzVndKeWs3WEc1MllYSWdVbVZ6YjJ4MlpYSWdQU0J5WlhGMWFYSmxLQ2N1TDNKbGMyOXNkbVZ5SnlrN1hHNTJZWElnVTNkaFoyZGxja2gwZEhBZ1BTQnlaWEYxYVhKbEtDY3VMMmgwZEhBbktUdGNiblpoY2lCVGQyRm5aMlZ5VTNCbFkwTnZiblpsY25SbGNpQTlJSEpsY1hWcGNtVW9KeTR2YzNCbFl5MWpiMjUyWlhKMFpYSW5LVHRjYmx4dUx5OGdWMlVnYUdGMlpTQjBieUJyWldWd0lIUnlZV05ySUc5bUlIUm9aU0JtZFc1amRHbHZiaTl3Y205d1pYSjBlU0J1WVcxbGN5QjBieUJoZG05cFpDQmpiMnhzYVhOcGIyNXpJR1p2Y2lCMFlXY2dibUZ0WlhNZ2QyaHBZMmdnWVhKbElIVnpaV1FnZEc4Z1lXeHNiM2NnZEdobFhHNHZMeUJtYjJ4c2IzZHBibWNnZFhOaFoyVTZJQ2RqYkdsbGJuUXVlM1JoWjA1aGJXVjlKMXh1ZG1GeUlISmxjMlZ5ZG1Wa1EyeHBaVzUwVkdGbmN5QTlJRnRjYmlBZ0oyRjFkR2h2Y21sNllYUnBiMjVUWTJobGJXVW5MRnh1SUNBbllYVjBhRzl5YVhwaGRHbHZibk1uTEZ4dUlDQW5ZbUZ6WlZCaGRHZ25MRnh1SUNBblluVnBiR1FuTEZ4dUlDQW5ZblZwYkdSR2NtOXRNVjh4VTNCbFl5Y3NYRzRnSUNkaWRXbHNaRVp5YjIweFh6SlRjR1ZqSnl4Y2JpQWdKMkoxYVd4a1JuSnZiVk53WldNbkxGeHVJQ0FuWTJ4cFpXNTBRWFYwYUc5eWFYcGhkR2x2Ym5NbkxGeHVJQ0FuWTI5dWRtVnlkRWx1Wm04bkxGeHVJQ0FuWkdWaWRXY25MRnh1SUNBblpHVm1ZWFZzZEVWeWNtOXlRMkZzYkdKaFkyc25MRnh1SUNBblpHVm1ZWFZzZEZOMVkyTmxjM05EWVd4c1ltRmpheWNzWEc0Z0lDZG1ZV2xzSnl4Y2JpQWdKMlpoYVd4MWNtVW5MRnh1SUNBblptbHVhWE5vSnl4Y2JpQWdKMmhsYkhBbkxGeHVJQ0FuYVdSR2NtOXRUM0FuTEZ4dUlDQW5hVzVtYnljc1hHNGdJQ2RwYm1sMGFXRnNhWHBsSnl4Y2JpQWdKMmx6UW5WcGJIUW5MRnh1SUNBbmFYTldZV3hwWkNjc1hHNGdJQ2R0YjJSbGJITW5MRnh1SUNBbmJXOWtaV3h6UVhKeVlYa25MRnh1SUNBbmIzQjBhVzl1Y3ljc1hHNGdJQ2R3WVhKelpWVnlhU2NzWEc0Z0lDZHdjbTluY21WemN5Y3NYRzRnSUNkeVpYTnZkWEpqWlVOdmRXNTBKeXhjYmlBZ0ozTmhiWEJzWlUxdlpHVnNjeWNzWEc0Z0lDZHpaV3htVW1WbWJHVmpkQ2NzWEc0Z0lDZHpaWFJEYjI1emIyeHBaR0YwWldSTmIyUmxiSE1uTEZ4dUlDQW5jM0JsWXljc1hHNGdJQ2R6ZFhCd2IzSjBaV1JUZFdKdGFYUk5aWFJvYjJSekp5eGNiaUFnSjNOM1lXZG5aWEpTWlhGMVpYTjBTR1ZoWkdWeWN5Y3NYRzRnSUNkMFlXZEdjbTl0VEdGaVpXd25MRnh1SUNBbmRYSnNKeXhjYmlBZ0ozVnpaVXBSZFdWeWVTZGNibDA3WEc0dkx5QlhaU0JvWVhabElIUnZJR3RsWlhBZ2RISmhZMnNnYjJZZ2RHaGxJR1oxYm1OMGFXOXVMM0J5YjNCbGNuUjVJRzVoYldWeklIUnZJR0YyYjJsa0lHTnZiR3hwYzJsdmJuTWdabTl5SUhSaFp5QnVZVzFsY3lCM2FHbGphQ0JoY21VZ2RYTmxaQ0IwYnlCaGJHeHZkeUIwYUdWY2JpOHZJR1p2Ykd4dmQybHVaeUIxYzJGblpUb2dKMk5zYVdWdWRDNWhjR2x6TG50MFlXZE9ZVzFsZlNkY2JuWmhjaUJ5WlhObGNuWmxaRUZ3YVZSaFozTWdQU0JiWEc0Z0lDZGhjR2x6Snl4Y2JpQWdKMkZ6UTNWeWJDY3NYRzRnSUNka1pYTmpjbWx3ZEdsdmJpY3NYRzRnSUNkbGVIUmxjbTVoYkVSdlkzTW5MRnh1SUNBbmFHVnNjQ2NzWEc0Z0lDZHNZV0psYkNjc1hHNGdJQ2R1WVcxbEp5eGNiaUFnSjI5d1pYSmhkR2x2Ymljc1hHNGdJQ2R2Y0dWeVlYUnBiMjV6Snl4Y2JpQWdKMjl3WlhKaGRHbHZibk5CY25KaGVTY3NYRzRnSUNkd1lYUm9KeXhjYmlBZ0ozUmhaeWRjYmwwN1hHNTJZWElnYzNWd2NHOXlkR1ZrVDNCbGNtRjBhVzl1VFdWMGFHOWtjeUE5SUZzblpHVnNaWFJsSnl3Z0oyZGxkQ2NzSUNkb1pXRmtKeXdnSjI5d2RHbHZibk1uTENBbmNHRjBZMmduTENBbmNHOXpkQ2NzSUNkd2RYUW5YVHRjYm5aaGNpQlRkMkZuWjJWeVEyeHBaVzUwSUQwZ2JXOWtkV3hsTG1WNGNHOXlkSE1nUFNCbWRXNWpkR2x2YmlBb2RYSnNMQ0J2Y0hScGIyNXpLU0I3WEc0Z0lIUm9hWE11WVhWMGFHOXlhWHBoZEdsdmJsTmphR1Z0WlNBOUlHNTFiR3c3WEc0Z0lIUm9hWE11WVhWMGFHOXlhWHBoZEdsdmJuTWdQU0J1ZFd4c08xeHVJQ0IwYUdsekxtSmhjMlZRWVhSb0lEMGdiblZzYkR0Y2JpQWdkR2hwY3k1a1pXSjFaeUE5SUdaaGJITmxPMXh1SUNCMGFHbHpMbWx1Wm04Z1BTQnVkV3hzTzF4dUlDQjBhR2x6TG1selFuVnBiSFFnUFNCbVlXeHpaVHRjYmlBZ2RHaHBjeTVwYzFaaGJHbGtJRDBnWm1Gc2MyVTdYRzRnSUhSb2FYTXViVzlrWld4elFYSnlZWGtnUFNCYlhUdGNiaUFnZEdocGN5NXlaWE52ZFhKalpVTnZkVzUwSUQwZ01EdGNiaUFnZEdocGN5NTFjbXdnUFNCdWRXeHNPMXh1SUNCMGFHbHpMblZ6WlVwUmRXVnllU0E5SUdaaGJITmxPMXh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdkWEpzSUNFOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG1sdWFYUnBZV3hwZW1Vb2RYSnNMQ0J2Y0hScGIyNXpLVHRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmVnh1ZlR0Y2JseHVVM2RoWjJkbGNrTnNhV1Z1ZEM1d2NtOTBiM1I1Y0dVdWFXNXBkR2xoYkdsNlpTQTlJR1oxYm1OMGFXOXVJQ2gxY213c0lHOXdkR2x2Ym5NcElIdGNiaUFnZEdocGN5NXRiMlJsYkhNZ1BTQjdmVHRjYmlBZ2RHaHBjeTV6WVcxd2JHVk5iMlJsYkhNZ1BTQjdmVHRjYmx4dUlDQnZjSFJwYjI1eklEMGdLRzl3ZEdsdmJuTWdmSHdnZTMwcE8xeHVYRzRnSUdsbUlDaDBlWEJsYjJZZ2RYSnNJRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHVJQ0FnSUhSb2FYTXVkWEpzSUQwZ2RYSnNPMXh1SUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlCMWNtd2dQVDA5SUNkdlltcGxZM1FuS1NCN1hHNGdJQ0FnYjNCMGFXOXVjeUE5SUhWeWJEdGNiaUFnSUNCMGFHbHpMblZ5YkNBOUlHOXdkR2x2Ym5NdWRYSnNPMXh1SUNCOVhHNWNiaUFnZEdocGN5NXpkMkZuWjJWeVVtVnhkV1Z6ZEVobFlXUmxjbk1nUFNCdmNIUnBiMjV6TG5OM1lXZG5aWEpTWlhGMVpYTjBTR1ZoWkdWeWN5QjhmQ0FuWVhCd2JHbGpZWFJwYjI0dmFuTnZianRqYUdGeWMyVjBQWFYwWmkwNExDb3ZLaWM3WEc0Z0lIUm9hWE11WkdWbVlYVnNkRk4xWTJObGMzTkRZV3hzWW1GamF5QTlJRzl3ZEdsdmJuTXVaR1ZtWVhWc2RGTjFZMk5sYzNORFlXeHNZbUZqYXlCOGZDQnVkV3hzTzF4dUlDQjBhR2x6TG1SbFptRjFiSFJGY25KdmNrTmhiR3hpWVdOcklEMGdiM0IwYVc5dWN5NWtaV1poZFd4MFJYSnliM0pEWVd4c1ltRmpheUI4ZkNCdWRXeHNPMXh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdiM0IwYVc5dWN5NXpkV05qWlhOeklEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnZEdocGN5NXpkV05qWlhOeklEMGdiM0IwYVc5dWN5NXpkV05qWlhOek8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0c5d2RHbHZibk11ZFhObFNsRjFaWEo1S1NCN1hHNGdJQ0FnZEdocGN5NTFjMlZLVVhWbGNua2dQU0J2Y0hScGIyNXpMblZ6WlVwUmRXVnllVHRjYmlBZ2ZWeHVYRzRnSUdsbUlDaHZjSFJwYjI1ekxtRjFkR2h2Y21sNllYUnBiMjV6S1NCN1hHNGdJQ0FnZEdocGN5NWpiR2xsYm5SQmRYUm9iM0pwZW1GMGFXOXVjeUE5SUc5d2RHbHZibk11WVhWMGFHOXlhWHBoZEdsdmJuTTdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkR2hwY3k1amJHbGxiblJCZFhSb2IzSnBlbUYwYVc5dWN5QTlJRzVsZHlCaGRYUm9MbE4zWVdkblpYSkJkWFJvYjNKcGVtRjBhVzl1Y3lncE8xeHVJQ0I5WEc1Y2JpQWdkR2hwY3k1emRYQndiM0owWldSVGRXSnRhWFJOWlhSb2IyUnpJRDBnYjNCMGFXOXVjeTV6ZFhCd2IzSjBaV1JUZFdKdGFYUk5aWFJvYjJSeklIeDhJRnRkTzF4dUlDQjBhR2x6TG1aaGFXeDFjbVVnUFNCdmNIUnBiMjV6TG1aaGFXeDFjbVVnZkh3Z1puVnVZM1JwYjI0Z0tDa2dlMzA3WEc0Z0lIUm9hWE11Y0hKdlozSmxjM01nUFNCdmNIUnBiMjV6TG5CeWIyZHlaWE56SUh4OElHWjFibU4wYVc5dUlDZ3BJSHQ5TzF4dUlDQjBhR2x6TG5Od1pXTWdQU0JmTG1Oc2IyNWxSR1ZsY0NodmNIUnBiMjV6TG5Od1pXTXBPeUF2THlCRGJHOXVaU0J6YnlCM1pTQmtieUJ1YjNRZ1lXeDBaWElnZEdobElIQnliM1pwWkdWa0lHUnZZM1Z0Wlc1MFhHNGdJSFJvYVhNdWIzQjBhVzl1Y3lBOUlHOXdkR2x2Ym5NN1hHNWNiaUFnYVdZZ0tIUjVjR1Z2WmlCdmNIUnBiMjV6TG5OMVkyTmxjM01nUFQwOUlDZG1kVzVqZEdsdmJpY3BJSHRjYmlBZ0lDQjBhR2x6TG5KbFlXUjVJRDBnZEhKMVpUdGNiaUFnSUNCMGFHbHpMbUoxYVd4a0tDazdYRzRnSUgxY2JuMDdYRzVjYmxOM1lXZG5aWEpEYkdsbGJuUXVjSEp2ZEc5MGVYQmxMbUoxYVd4a0lEMGdablZ1WTNScGIyNGdLRzF2WTJzcElIdGNiaUFnYVdZZ0tIUm9hWE11YVhOQ2RXbHNkQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TzF4dUlDQjlYRzVjYmlBZ2RtRnlJSE5sYkdZZ1BTQjBhR2x6TzF4dVhHNGdJSFJvYVhNdWNISnZaM0psYzNNb0oyWmxkR05vYVc1bklISmxjMjkxY21ObElHeHBjM1E2SUNjZ0t5QjBhR2x6TG5WeWJDazdYRzVjYmlBZ2RtRnlJRzlpYWlBOUlIdGNiaUFnSUNCMWMyVktVWFZsY25rNklIUm9hWE11ZFhObFNsRjFaWEo1TEZ4dUlDQWdJSFZ5YkRvZ2RHaHBjeTUxY213c1hHNGdJQ0FnYldWMGFHOWtPaUFuWjJWMEp5eGNiaUFnSUNCb1pXRmtaWEp6T2lCN1hHNGdJQ0FnSUNCaFkyTmxjSFE2SUhSb2FYTXVjM2RoWjJkbGNsSmxjWFZsYzNSSVpXRmtaWEp6WEc0Z0lDQWdmU3hjYmlBZ0lDQnZiam9nZTF4dUlDQWdJQ0FnWlhKeWIzSTZJR1oxYm1OMGFXOXVJQ2h5WlhOd2IyNXpaU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9jMlZzWmk1MWNtd3VjM1ZpYzNSeWFXNW5LREFzSURRcElDRTlQU0FuYUhSMGNDY3BJSHRjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYzJWc1ppNW1ZV2xzS0NkUWJHVmhjMlVnYzNCbFkybG1lU0IwYUdVZ2NISnZkRzlqYjJ3Z1ptOXlJQ2NnS3lCelpXeG1MblZ5YkNrN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9jbVZ6Y0c5dWMyVXVjM1JoZEhWeklEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlITmxiR1l1Wm1GcGJDZ25RMkZ1WEZ3bmRDQnlaV0ZrSUdaeWIyMGdjMlZ5ZG1WeUxpQWdTWFFnYldGNUlHNXZkQ0JvWVhabElIUm9aU0JoY0hCeWIzQnlhV0YwWlNCaFkyTmxjM010WTI5dWRISnZiQzF2Y21sbmFXNGdjMlYwZEdsdVozTXVKeWs3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2NtVnpjRzl1YzJVdWMzUmhkSFZ6SUQwOVBTQTBNRFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MyVnNaaTVtWVdsc0tDZERZVzVjWENkMElISmxZV1FnYzNkaFoyZGxjaUJLVTA5T0lHWnliMjBnSnlBcklITmxiR1l1ZFhKc0tUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjMlZzWmk1bVlXbHNLSEpsYzNCdmJuTmxMbk4wWVhSMWN5QXJJQ2NnT2lBbklDc2djbVZ6Y0c5dWMyVXVjM1JoZEhWelZHVjRkQ0FySUNjZ0p5QXJJSE5sYkdZdWRYSnNLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUhKbGMzQnZibk5sT2lCbWRXNWpkR2x2YmlBb2NtVnpjQ2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdjbVZ6Y0c5dWMyVlBZbW9nUFNCeVpYTndMbTlpYWlCOGZDQktVMDlPTG5CaGNuTmxLSEpsYzNBdVpHRjBZU2s3WEc0Z0lDQWdJQ0FnSUhObGJHWXVjM2RoWjJkbGNsWmxjbk5wYjI0Z1BTQnlaWE53YjI1elpVOWlhaTV6ZDJGbloyVnlWbVZ5YzJsdmJqdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2NtVnpjRzl1YzJWUFltb3VjM2RoWjJkbGNpQW1KaUJ3WVhKelpVbHVkQ2h5WlhOd2IyNXpaVTlpYWk1emQyRm5aMlZ5S1NBOVBUMGdNaWtnZTF4dUlDQWdJQ0FnSUNBZ0lITmxiR1l1YzNkaFoyZGxjbFpsY25OcGIyNGdQU0J5WlhOd2IyNXpaVTlpYWk1emQyRm5aMlZ5TzF4dVhHNGdJQ0FnSUNBZ0lDQWdibVYzSUZKbGMyOXNkbVZ5S0NrdWNtVnpiMngyWlNoeVpYTndiMjV6WlU5aWFpd2djMlZzWmk1aWRXbHNaRVp5YjIxVGNHVmpMQ0J6Wld4bUtUdGNibHh1SUNBZ0lDQWdJQ0FnSUhObGJHWXVhWE5XWVd4cFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdkbUZ5SUdOdmJuWmxjblJsY2lBOUlHNWxkeUJUZDJGbloyVnlVM0JsWTBOdmJuWmxjblJsY2lncE8xeHVJQ0FnSUNBZ0lDQWdJR052Ym5abGNuUmxjaTV6WlhSRWIyTjFiV1Z1ZEdGMGFXOXVURzlqWVhScGIyNG9jMlZzWmk1MWNtd3BPMXh1SUNBZ0lDQWdJQ0FnSUdOdmJuWmxjblJsY2k1amIyNTJaWEowS0hKbGMzQnZibk5sVDJKcUxDQm1kVzVqZEdsdmJpaHpjR1ZqS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J1WlhjZ1VtVnpiMngyWlhJb0tTNXlaWE52YkhabEtITndaV01zSUhObGJHWXVZblZwYkdSR2NtOXRVM0JsWXl3Z2MyVnNaaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaV3htTG1selZtRnNhV1FnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5TzF4dVhHNGdJR2xtSUNoMGFHbHpMbk53WldNcElIdGNiaUFnSUNCelpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJRzVsZHlCU1pYTnZiSFpsY2lncExuSmxjMjlzZG1Vb2MyVnNaaTV6Y0dWakxDQnpaV3htTG1KMWFXeGtSbkp2YlZOd1pXTXNJSE5sYkdZcE8xeHVJQ0FnZlN3Z01UQXBPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSFJvYVhNdVkyeHBaVzUwUVhWMGFHOXlhWHBoZEdsdmJuTXVZWEJ3Ykhrb2IySnFLVHRjYmx4dUlDQWdJR2xtSUNodGIyTnJLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdiMkpxTzF4dUlDQWdJSDFjYmx4dUlDQWdJRzVsZHlCVGQyRm5aMlZ5U0hSMGNDZ3BMbVY0WldOMWRHVW9iMkpxS1R0Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCMGFHbHpPMXh1ZlR0Y2JseHVVM2RoWjJkbGNrTnNhV1Z1ZEM1d2NtOTBiM1I1Y0dVdVluVnBiR1JHY205dFUzQmxZeUE5SUdaMWJtTjBhVzl1SUNoeVpYTndiMjV6WlNrZ2UxeHVJQ0JwWmlBb2RHaHBjeTVwYzBKMWFXeDBLU0I3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE03WEc0Z0lIMWNibHh1SUNCMGFHbHpMbUZ3YVhNZ1BTQjdmVHRjYmlBZ2RHaHBjeTVoY0dselFYSnlZWGtnUFNCYlhUdGNiaUFnZEdocGN5NWlZWE5sVUdGMGFDQTlJSEpsYzNCdmJuTmxMbUpoYzJWUVlYUm9JSHg4SUNjbk8xeHVJQ0IwYUdsekxtTnZibk4xYldWeklEMGdjbVZ6Y0c5dWMyVXVZMjl1YzNWdFpYTTdYRzRnSUhSb2FYTXVhRzl6ZENBOUlISmxjM0J2Ym5ObExtaHZjM1FnZkh3Z0p5YzdYRzRnSUhSb2FYTXVhVzVtYnlBOUlISmxjM0J2Ym5ObExtbHVabThnZkh3Z2UzMDdYRzRnSUhSb2FYTXVjSEp2WkhWalpYTWdQU0J5WlhOd2IyNXpaUzV3Y205a2RXTmxjenRjYmlBZ2RHaHBjeTV6WTJobGJXVnpJRDBnY21WemNHOXVjMlV1YzJOb1pXMWxjeUI4ZkNCYlhUdGNiaUFnZEdocGN5NXpaV04xY21sMGVVUmxabWx1YVhScGIyNXpJRDBnY21WemNHOXVjMlV1YzJWamRYSnBkSGxFWldacGJtbDBhVzl1Y3p0Y2JpQWdkR2hwY3k1MGFYUnNaU0E5SUhKbGMzQnZibk5sTG5ScGRHeGxJSHg4SUNjbk8xeHVYRzRnSUdsbUlDaHlaWE53YjI1elpTNWxlSFJsY201aGJFUnZZM01wSUh0Y2JpQWdJQ0IwYUdsekxtVjRkR1Z5Ym1Gc1JHOWpjeUE5SUhKbGMzQnZibk5sTG1WNGRHVnlibUZzUkc5amN6dGNiaUFnZlZ4dVhHNGdJQzh2SUd4bFoyRmplU0J6ZFhCd2IzSjBYRzRnSUhSb2FYTXVZWFYwYUZOamFHVnRaWE1nUFNCeVpYTndiMjV6WlM1elpXTjFjbWwwZVVSbFptbHVhWFJwYjI1ek8xeHVYRzRnSUhaaGNpQmtaV1pwYm1Wa1ZHRm5jeUE5SUh0OU8xeHVJQ0IyWVhJZ2F6dGNibHh1SUNCcFppQW9RWEp5WVhrdWFYTkJjbkpoZVNoeVpYTndiMjV6WlM1MFlXZHpLU2tnZTF4dUlDQWdJR1JsWm1sdVpXUlVZV2R6SUQwZ2UzMDdYRzVjYmlBZ0lDQm1iM0lnS0dzZ1BTQXdPeUJySUR3Z2NtVnpjRzl1YzJVdWRHRm5jeTVzWlc1bmRHZzdJR3NyS3lrZ2UxeHVJQ0FnSUNBZ2RtRnlJSFFnUFNCeVpYTndiMjV6WlM1MFlXZHpXMnRkTzF4dVhHNGdJQ0FnSUNCa1pXWnBibVZrVkdGbmMxdDBMbTVoYldWZElEMGdkRHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0IyWVhJZ2JHOWpZWFJwYjI0N1hHNWNiaUFnYVdZZ0tIUjVjR1Z2WmlCMGFHbHpMblZ5YkNBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQnNiMk5oZEdsdmJpQTlJSFJvYVhNdWNHRnljMlZWY21rb2RHaHBjeTUxY213cE8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0hSNWNHVnZaaUIwYUdsekxuTmphR1Z0WlhNZ1BUMDlJQ2QxYm1SbFptbHVaV1FuSUh4OElIUm9hWE11YzJOb1pXMWxjeTVzWlc1bmRHZ2dQVDA5SURBcElIdGNiaUFnSUNCMGFHbHpMbk5qYUdWdFpTQTlJR3h2WTJGMGFXOXVMbk5qYUdWdFpTQjhmQ0FuYUhSMGNDYzdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkR2hwY3k1elkyaGxiV1VnUFNCMGFHbHpMbk5qYUdWdFpYTmJNRjA3WEc0Z0lIMWNibHh1SUNCcFppQW9kSGx3Wlc5bUlIUm9hWE11YUc5emRDQTlQVDBnSjNWdVpHVm1hVzVsWkNjZ2ZId2dkR2hwY3k1b2IzTjBJRDA5UFNBbkp5a2dlMXh1SUNBZ0lIUm9hWE11YUc5emRDQTlJR3h2WTJGMGFXOXVMbWh2YzNRN1hHNWNiaUFnSUNCcFppQW9iRzlqWVhScGIyNHVjRzl5ZENrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVvYjNOMElEMGdkR2hwY3k1b2IzTjBJQ3NnSnpvbklDc2diRzlqWVhScGIyNHVjRzl5ZER0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCMGFHbHpMbVJsWm1sdWFYUnBiMjV6SUQwZ2NtVnpjRzl1YzJVdVpHVm1hVzVwZEdsdmJuTTdYRzVjYmlBZ2RtRnlJR3RsZVR0Y2JseHVJQ0JtYjNJZ0tHdGxlU0JwYmlCMGFHbHpMbVJsWm1sdWFYUnBiMjV6S1NCN1hHNGdJQ0FnZG1GeUlHMXZaR1ZzSUQwZ2JtVjNJRTF2WkdWc0tHdGxlU3dnZEdocGN5NWtaV1pwYm1sMGFXOXVjMXRyWlhsZExDQjBhR2x6TG0xdlpHVnNjeWs3WEc1Y2JpQWdJQ0JwWmlBb2JXOWtaV3dwSUh0Y2JpQWdJQ0FnSUhSb2FYTXViVzlrWld4elcydGxlVjBnUFNCdGIyUmxiRHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0F2THlCblpYUWdjR0YwYUhNc0lHTnlaV0YwWlNCbWRXNWpkR2x2Ym5NZ1ptOXlJR1ZoWTJnZ2IzQmxjbUYwYVc5dVNXUmNiaUFnZG1GeUlITmxiR1lnUFNCMGFHbHpPMXh1WEc0Z0lDOHZJRUpwYm1RZ2FHVnNjQ0IwYnlBblkyeHBaVzUwTG1Gd2FYTW5YRzRnSUhObGJHWXVZWEJwY3k1b1pXeHdJRDBnWHk1aWFXNWtLSE5sYkdZdWFHVnNjQ3dnYzJWc1ppazdYRzVjYmlBZ1h5NW1iM0pGWVdOb0tISmxjM0J2Ym5ObExuQmhkR2h6TENCbWRXNWpkR2x2YmlBb2NHRjBhRTlpYWl3Z2NHRjBhQ2tnZTF4dUlDQWdJQzh2SUU5dWJIa2djSEp2WTJWemN5QmhJSEJoZEdnZ2FXWWdhWFFuY3lCaGJpQnZZbXBsWTNSY2JpQWdJQ0JwWmlBb0lWOHVhWE5RYkdGcGJrOWlhbVZqZENod1lYUm9UMkpxS1NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJSDFjYmx4dUlDQWdJRjh1Wm05eVJXRmphQ2h6ZFhCd2IzSjBaV1JQY0dWeVlYUnBiMjVOWlhSb2IyUnpMQ0JtZFc1amRHbHZiaUFvYldWMGFHOWtLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2IzQmxjbUYwYVc5dUlEMGdjR0YwYUU5aWFsdHRaWFJvYjJSZE8xeHVYRzRnSUNBZ0lDQnBaaUFvWHk1cGMxVnVaR1ZtYVc1bFpDaHZjR1Z5WVhScGIyNHBLU0I3WEc0Z0lDQWdJQ0FnSUM4dklFOXdaWEpoZEdsdmJpQmtiMlZ6SUc1dmRDQmxlR2x6ZEZ4dUlDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0NGZkxtbHpVR3hoYVc1UFltcGxZM1FvYjNCbGNtRjBhVzl1S1NrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJQY0dWeVlYUnBiMjRnWlhocGMzUnpJR0oxZENCcGRDQnBjeUJ1YjNRZ1lXNGdUM0JsY21GMGFXOXVJRTlpYW1WamRDNGdJRk5wYm1ObElIUm9hWE1nYVhNZ2FXNTJZV3hwWkN3Z2JHOW5JR2wwTGx4dUlDQWdJQ0FnSUNCb1pXeHdaWEp6TG14dlp5Z25WR2hsSUZ4Y0p5Y2dLeUJ0WlhSb2IyUWdLeUFuWEZ3bklHOXdaWEpoZEdsdmJpQm1iM0lnWEZ3bkp5QXJJSEJoZEdnZ0t5QW5YRnduSUhCaGRHZ2dhWE1nYm05MElHRnVJRTl3WlhKaGRHbHZiaUJQWW1wbFkzUW5LVHRjYmx4dUlDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JjYmlBZ0lDQWdJSFpoY2lCMFlXZHpJRDBnYjNCbGNtRjBhVzl1TG5SaFozTTdYRzVjYmlBZ0lDQWdJR2xtSUNoZkxtbHpWVzVrWldacGJtVmtLSFJoWjNNcElIeDhJQ0ZmTG1selFYSnlZWGtvZEdGbmN5a2dmSHdnZEdGbmN5NXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ2RHRm5jeUE5SUc5d1pYSmhkR2x2Ymk1MFlXZHpJRDBnV3lBblpHVm1ZWFZzZENjZ1hUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdkbUZ5SUc5d1pYSmhkR2x2Ymtsa0lEMGdjMlZzWmk1cFpFWnliMjFQY0Nod1lYUm9MQ0J0WlhSb2IyUXNJRzl3WlhKaGRHbHZiaWs3WEc0Z0lDQWdJQ0IyWVhJZ2IzQmxjbUYwYVc5dVQySnFaV04wSUQwZ2JtVjNJRTl3WlhKaGRHbHZiaWh6Wld4bUxDQnZjR1Z5WVhScGIyNHVjMk5vWlcxbExDQnZjR1Z5WVhScGIyNUpaQ3dnYldWMGFHOWtMQ0J3WVhSb0xDQnZjR1Z5WVhScGIyNHNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaV3htTG1SbFptbHVhWFJwYjI1ekxDQnpaV3htTG0xdlpHVnNjeXdnYzJWc1ppNWpiR2xsYm5SQmRYUm9iM0pwZW1GMGFXOXVjeWs3WEc1Y2JpQWdJQ0FnSUM4dklHSnBibVFnYzJWc1ppQnZjR1Z5WVhScGIyNG5jeUJsZUdWamRYUmxJR052YlcxaGJtUWdkRzhnZEdobElHRndhVnh1SUNBZ0lDQWdYeTVtYjNKRllXTm9LSFJoWjNNc0lHWjFibU4wYVc5dUlDaDBZV2NwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR05zYVdWdWRGQnliM0JsY25SNUlEMGdYeTVwYm1SbGVFOW1LSEpsYzJWeWRtVmtRMnhwWlc1MFZHRm5jeXdnZEdGbktTQStJQzB4SUQ4Z0oxOG5JQ3NnZEdGbklEb2dkR0ZuTzF4dUlDQWdJQ0FnSUNCMllYSWdZWEJwVUhKdmNHVnlkSGtnUFNCZkxtbHVaR1Y0VDJZb2NtVnpaWEoyWldSQmNHbFVZV2R6TENCMFlXY3BJRDRnTFRFZ1B5QW5YeWNnS3lCMFlXY2dPaUIwWVdjN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ2Y0dWeVlYUnBiMjVIY205MWNDQTlJSE5sYkdaYlkyeHBaVzUwVUhKdmNHVnlkSGxkTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hqYkdsbGJuUlFjbTl3WlhKMGVTQWhQVDBnZEdGbktTQjdYRzRnSUNBZ0lDQWdJQ0FnYUdWc2NHVnljeTVzYjJjb0oxUm9aU0JjWENjbklDc2dkR0ZuSUNzZ0oxeGNKeUIwWVdjZ1kyOXVabXhwWTNSeklIZHBkR2dnWVNCVGQyRm5aMlZ5UTJ4cFpXNTBJR1oxYm1OMGFXOXVMM0J5YjNCbGNuUjVJRzVoYldVdUlDQlZjMlVnWEZ3blkyeHBaVzUwTGljZ0sxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOc2FXVnVkRkJ5YjNCbGNuUjVJQ3NnSjF4Y0p5QnZjaUJjWENkamJHbGxiblF1WVhCcGN5NG5JQ3NnZEdGbklDc2dKMXhjSnlCcGJuTjBaV0ZrSUc5bUlGeGNKMk5zYVdWdWRDNG5JQ3NnZEdGbklDc2dKMXhjSnk0bktUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdsbUlDaGhjR2xRY205d1pYSjBlU0FoUFQwZ2RHRm5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FHVnNjR1Z5Y3k1c2IyY29KMVJvWlNCY1hDY25JQ3NnZEdGbklDc2dKMXhjSnlCMFlXY2dZMjl1Wm14cFkzUnpJSGRwZEdnZ1lTQlRkMkZuWjJWeVEyeHBaVzUwSUc5d1pYSmhkR2x2YmlCbWRXNWpkR2x2Ymk5d2NtOXdaWEowZVNCdVlXMWxMaUFnVlhObElDY2dLMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDZGNYQ2RqYkdsbGJuUXVZWEJwY3k0bklDc2dZWEJwVUhKdmNHVnlkSGtnS3lBblhGd25JR2x1YzNSbFlXUWdiMllnWEZ3blkyeHBaVzUwTG1Gd2FYTXVKeUFySUhSaFp5QXJJQ2RjWENjdUp5azdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCcFppQW9YeTVwYm1SbGVFOW1LSEpsYzJWeWRtVmtRWEJwVkdGbmN5d2diM0JsY21GMGFXOXVTV1FwSUQ0Z0xURXBJSHRjYmlBZ0lDQWdJQ0FnSUNCb1pXeHdaWEp6TG14dlp5Z25WR2hsSUZ4Y0p5Y2dLeUJ2Y0dWeVlYUnBiMjVKWkNBcklDZGNYQ2NnYjNCbGNtRjBhVzl1U1dRZ1kyOXVabXhwWTNSeklIZHBkR2dnWVNCVGQyRm5aMlZ5UTJ4cFpXNTBJRzl3WlhKaGRHbHZiaUFuSUN0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FuWm5WdVkzUnBiMjR2Y0hKdmNHVnlkSGtnYm1GdFpTNGdJRlZ6WlNCY1hDZGpiR2xsYm5RdVlYQnBjeTRuSUNzZ1lYQnBVSEp2Y0dWeWRIa2dLeUFuTGw4bklDc2diM0JsY21GMGFXOXVTV1FnSzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2RjWENjZ2FXNXpkR1ZoWkNCdlppQmNYQ2RqYkdsbGJuUXVZWEJwY3k0bklDc2dZWEJwVUhKdmNHVnlkSGtnS3lBbkxpY2dLeUJ2Y0dWeVlYUnBiMjVKWkNBcklDZGNYQ2N1SnlrN1hHNWNiaUFnSUNBZ0lDQWdJQ0J2Y0dWeVlYUnBiMjVKWkNBOUlDZGZKeUFySUc5d1pYSmhkR2x2Ymtsa08xeHVJQ0FnSUNBZ0lDQWdJRzl3WlhKaGRHbHZiazlpYW1WamRDNXVhV05yYm1GdFpTQTlJRzl3WlhKaGRHbHZia2xrT3lBdkx5QlRieUFuWTJ4cFpXNTBMbUZ3YVhNdVczUmhaMTB1YjNCbGNtRjBhVzl1U1dRdWFHVnNjQ2dwSUhkdmNtdHpJSEJ5YjNCbGNteDVYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCcFppQW9YeTVwYzFWdVpHVm1hVzVsWkNodmNHVnlZWFJwYjI1SGNtOTFjQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQnZjR1Z5WVhScGIyNUhjbTkxY0NBOUlITmxiR1piWTJ4cFpXNTBVSEp2Y0dWeWRIbGRJRDBnYzJWc1ppNWhjR2x6VzJGd2FWQnliM0JsY25SNVhTQTlJSHQ5TzF4dVhHNGdJQ0FnSUNBZ0lDQWdiM0JsY21GMGFXOXVSM0p2ZFhBdWIzQmxjbUYwYVc5dWN5QTlJSHQ5TzF4dUlDQWdJQ0FnSUNBZ0lHOXdaWEpoZEdsdmJrZHliM1Z3TG14aFltVnNJRDBnWVhCcFVISnZjR1Z5ZEhrN1hHNGdJQ0FnSUNBZ0lDQWdiM0JsY21GMGFXOXVSM0p2ZFhBdVlYQnBjeUE5SUh0OU8xeHVYRzRnSUNBZ0lDQWdJQ0FnZG1GeUlIUmhaMFJsWmlBOUlHUmxabWx1WldSVVlXZHpXM1JoWjEwN1hHNWNiaUFnSUNBZ0lDQWdJQ0JwWmlBb0lWOHVhWE5WYm1SbFptbHVaV1FvZEdGblJHVm1LU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiM0JsY21GMGFXOXVSM0p2ZFhBdVpHVnpZM0pwY0hScGIyNGdQU0IwWVdkRVpXWXVaR1Z6WTNKcGNIUnBiMjQ3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnZjR1Z5WVhScGIyNUhjbTkxY0M1bGVIUmxjbTVoYkVSdlkzTWdQU0IwWVdkRVpXWXVaWGgwWlhKdVlXeEViMk56TzF4dUlDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUhObGJHWmJZMnhwWlc1MFVISnZjR1Z5ZEhsZExtaGxiSEFnUFNCZkxtSnBibVFvYzJWc1ppNW9aV3h3TENCdmNHVnlZWFJwYjI1SGNtOTFjQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2MyVnNaaTVoY0dselFYSnlZWGt1Y0hWemFDaHVaWGNnVDNCbGNtRjBhVzl1UjNKdmRYQW9kR0ZuTENCdmNHVnlZWFJwYjI1SGNtOTFjQzVrWlhOamNtbHdkR2x2Yml3Z2IzQmxjbUYwYVc5dVIzSnZkWEF1WlhoMFpYSnVZV3hFYjJOekxDQnZjR1Z5WVhScGIyNVBZbXBsWTNRcEtUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUM4dklFSnBibVFnZEdGbklHaGxiSEJjYmlBZ0lDQWdJQ0FnYVdZZ0tDRmZMbWx6Um5WdVkzUnBiMjRvYjNCbGNtRjBhVzl1UjNKdmRYQXVhR1ZzY0NrcElIdGNiaUFnSUNBZ0lDQWdJQ0J2Y0dWeVlYUnBiMjVIY205MWNDNW9aV3h3SUQwZ1h5NWlhVzVrS0hObGJHWXVhR1ZzY0N3Z2IzQmxjbUYwYVc5dVIzSnZkWEFwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdMeThnWW1sdVpDQjBieUIwYUdVZ1lYQnBjeUJ2WW1wbFkzUmNiaUFnSUNBZ0lDQWdjMlZzWmk1aGNHbHpXMkZ3YVZCeWIzQmxjblI1WFZ0dmNHVnlZWFJwYjI1SlpGMGdQU0J2Y0dWeVlYUnBiMjVIY205MWNGdHZjR1Z5WVhScGIyNUpaRjA5SUY4dVltbHVaQ2h2Y0dWeVlYUnBiMjVQWW1wbFkzUXVaWGhsWTNWMFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y0dWeVlYUnBiMjVQWW1wbFkzUXBPMXh1SUNBZ0lDQWdJQ0J6Wld4bUxtRndhWE5iWVhCcFVISnZjR1Z5ZEhsZFcyOXdaWEpoZEdsdmJrbGtYUzVvWld4d0lEMGdiM0JsY21GMGFXOXVSM0p2ZFhCYmIzQmxjbUYwYVc5dVNXUmRMbWhsYkhBZ1BTQmZMbUpwYm1Rb2IzQmxjbUYwYVc5dVQySnFaV04wTG1obGJIQXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmNHVnlZWFJwYjI1UFltcGxZM1FwTzF4dUlDQWdJQ0FnSUNCelpXeG1MbUZ3YVhOYllYQnBVSEp2Y0dWeWRIbGRXMjl3WlhKaGRHbHZia2xrWFM1aGMwTjFjbXdnUFNCdmNHVnlZWFJwYjI1SGNtOTFjRnR2Y0dWeVlYUnBiMjVKWkYwdVlYTkRkWEpzSUQwZ1h5NWlhVzVrS0c5d1pYSmhkR2x2Yms5aWFtVmpkQzVoYzBOMWNtd3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM0JsY21GMGFXOXVUMkpxWldOMEtUdGNibHh1SUNBZ0lDQWdJQ0J2Y0dWeVlYUnBiMjVIY205MWNDNWhjR2x6VzI5d1pYSmhkR2x2Ymtsa1hTQTlJRzl3WlhKaGRHbHZia2R5YjNWd0xtOXdaWEpoZEdsdmJuTmJiM0JsY21GMGFXOXVTV1JkSUQwZ2IzQmxjbUYwYVc5dVQySnFaV04wTzF4dVhHNGdJQ0FnSUNBZ0lDOHZJR3hsWjJGamVTQlZTU0JtWldGMGRYSmxYRzRnSUNBZ0lDQWdJSFpoY2lCaGNHa2dQU0JmTG1acGJtUW9jMlZzWmk1aGNHbHpRWEp5WVhrc0lHWjFibU4wYVc5dUlDaGhjR2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1lYQnBMblJoWnlBOVBUMGdkR0ZuTzF4dUlDQWdJQ0FnSUNCOUtUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb1lYQnBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1lYQnBMbTl3WlhKaGRHbHZibk5CY25KaGVTNXdkWE5vS0c5d1pYSmhkR2x2Yms5aWFtVmpkQ2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUgwcE8xeHVJQ0I5S1R0Y2JseHVJQ0IwYUdsekxtbHpRblZwYkhRZ1BTQjBjblZsTzF4dVhHNGdJR2xtSUNoMGFHbHpMbk4xWTJObGMzTXBJSHRjYmlBZ0lDQjBhR2x6TG1selZtRnNhV1FnUFNCMGNuVmxPMXh1SUNBZ0lIUm9hWE11YVhOQ2RXbHNkQ0E5SUhSeWRXVTdYRzRnSUNBZ2RHaHBjeTV6ZFdOalpYTnpLQ2s3WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnZEdocGN6dGNibjA3WEc1Y2JsTjNZV2RuWlhKRGJHbGxiblF1Y0hKdmRHOTBlWEJsTG5CaGNuTmxWWEpwSUQwZ1puVnVZM1JwYjI0Z0tIVnlhU2tnZTF4dUlDQjJZWElnZFhKc1VHRnljMlZTUlNBOUlDOWVLQ2dvS0Z0ZU9seGNMeU5jWEQ5ZEt6b3BQeWcvT2loY1hDOWNYQzhwS0NnL09pZ29XMTQ2UUZ4Y0x5TmNYRDlkS3lrb1B6cGNYRG9vVzE0NlFGeGNMeU5jWEQ5ZEt5a3BQeWxBS1Q4b0tGdGVPbHhjTHlOY1hEOWNYRjFjWEZ0ZEszeGNYRnRiWGx4Y0wxeGNYVUFqUDEwclhGeGRLU2cvT2x4Y09paGJNQzA1WFNzcEtUOHBLVDhwUHlrL0tDaGNYQzgvS0Q4NlcxNWNYQzljWEQ4alhTdGNYQzhyS1NvcEtGdGVYRncvSTEwcUtTa3BQeWhjWEQ5YlhpTmRLeWsvS1Nnakxpb3BQeTg3WEc0Z0lIWmhjaUJ3WVhKMGN5QTlJSFZ5YkZCaGNuTmxVa1V1WlhobFl5aDFjbWtwTzF4dVhHNGdJSEpsZEhWeWJpQjdYRzRnSUNBZ2MyTm9aVzFsT2lCd1lYSjBjMXMwWFM1eVpYQnNZV05sS0NjNkp5d25KeWtzWEc0Z0lDQWdhRzl6ZERvZ2NHRnlkSE5iTVRGZExGeHVJQ0FnSUhCdmNuUTZJSEJoY25Seld6RXlYU3hjYmlBZ0lDQndZWFJvT2lCd1lYSjBjMXN4TlYxY2JpQWdmVHRjYm4wN1hHNWNibE4zWVdkblpYSkRiR2xsYm5RdWNISnZkRzkwZVhCbExtaGxiSEFnUFNCbWRXNWpkR2x2YmlBb1pHOXVkRkJ5YVc1MEtTQjdYRzRnSUhaaGNpQnZkWFJ3ZFhRZ1BTQW5KenRjYmx4dUlDQnBaaUFvZEdocGN5QnBibk4wWVc1alpXOW1JRk4zWVdkblpYSkRiR2xsYm5RcElIdGNiaUFnSUNCZkxtWnZja1ZoWTJnb2RHaHBjeTVoY0dsekxDQm1kVzVqZEdsdmJpQW9ZWEJwTENCdVlXMWxLU0I3WEc0Z0lDQWdJQ0JwWmlBb1h5NXBjMUJzWVdsdVQySnFaV04wS0dGd2FTa3BJSHRjYmlBZ0lDQWdJQ0FnYjNWMGNIVjBJQ3M5SUNkdmNHVnlZWFJwYjI1eklHWnZjaUIwYUdVZ1hGd25KeUFySUc1aGJXVWdLeUFuWEZ3bklIUmhaMXhjYmljN1hHNWNiaUFnSUNBZ0lDQWdYeTVtYjNKRllXTm9LR0Z3YVM1dmNHVnlZWFJwYjI1ekxDQm1kVzVqZEdsdmJpQW9iM0JsY21GMGFXOXVMQ0J1WVcxbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnYjNWMGNIVjBJQ3M5SUNjZ0lDb2dKeUFySUc1aGJXVWdLeUFuT2lBbklDc2diM0JsY21GMGFXOXVMbk4xYlcxaGNua2dLeUFuWEZ4dUp6dGNiaUFnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU2s3WEc0Z0lIMGdaV3h6WlNCcFppQW9kR2hwY3lCcGJuTjBZVzVqWlc5bUlFOXdaWEpoZEdsdmJrZHliM1Z3SUh4OElGOHVhWE5RYkdGcGJrOWlhbVZqZENoMGFHbHpLU2tnZTF4dUlDQWdJRzkxZEhCMWRDQXJQU0FuYjNCbGNtRjBhVzl1Y3lCbWIzSWdkR2hsSUZ4Y0p5Y2dLeUIwYUdsekxteGhZbVZzSUNzZ0oxeGNKeUIwWVdkY1hHNG5PMXh1WEc0Z0lDQWdYeTVtYjNKRllXTm9LSFJvYVhNdVlYQnBjeXdnWm5WdVkzUnBiMjRnS0c5d1pYSmhkR2x2Yml3Z2JtRnRaU2tnZTF4dUlDQWdJQ0FnYjNWMGNIVjBJQ3M5SUNjZ0lDb2dKeUFySUc1aGJXVWdLeUFuT2lBbklDc2diM0JsY21GMGFXOXVMbk4xYlcxaGNua2dLeUFuWEZ4dUp6dGNiaUFnSUNCOUtUdGNiaUFnZlZ4dVhHNGdJR2xtSUNoa2IyNTBVSEpwYm5RcElIdGNiaUFnSUNCeVpYUjFjbTRnYjNWMGNIVjBPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJR2hsYkhCbGNuTXViRzluS0c5MWRIQjFkQ2s3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdiM1YwY0hWME8xeHVJQ0I5WEc1OU8xeHVYRzVUZDJGbloyVnlRMnhwWlc1MExuQnliM1J2ZEhsd1pTNTBZV2RHY205dFRHRmlaV3dnUFNCbWRXNWpkR2x2YmlBb2JHRmlaV3dwSUh0Y2JpQWdjbVYwZFhKdUlHeGhZbVZzTzF4dWZUdGNibHh1VTNkaFoyZGxja05zYVdWdWRDNXdjbTkwYjNSNWNHVXVhV1JHY205dFQzQWdQU0JtZFc1amRHbHZiaUFvY0dGMGFDd2dhSFIwY0UxbGRHaHZaQ3dnYjNBcElIdGNiaUFnYVdZb0lXOXdJSHg4SUNGdmNDNXZjR1Z5WVhScGIyNUpaQ2tnZTF4dUlDQWdJRzl3SUQwZ2IzQWdmSHdnZTMwN1hHNGdJQ0FnYjNBdWIzQmxjbUYwYVc5dVNXUWdQU0JvZEhSd1RXVjBhRzlrSUNzZ0oxOG5JQ3NnY0dGMGFEdGNiaUFnZlZ4dUlDQjJZWElnYjNCSlpDQTlJRzl3TG05d1pYSmhkR2x2Ymtsa0xuSmxjR3hoWTJVb0wxdGNYSE1oUUNNa0pWNG1LaWdwWHlzOVhGeGJlMXhjWFgwN09qdytmQzVjWEM4L0xGeGNYRnduWENKY0lpMWRMMmNzSUNkZkp5a2dmSHdnS0hCaGRHZ3VjM1ZpYzNSeWFXNW5LREVwSUNzZ0oxOG5JQ3NnYUhSMGNFMWxkR2h2WkNrN1hHNWNiaUFnYjNCSlpDQTlJRzl3U1dRdWNtVndiR0ZqWlNndktDaGZLWHN5TEgwcEwyY3NJQ2RmSnlrN1hHNGdJRzl3U1dRZ1BTQnZjRWxrTG5KbGNHeGhZMlVvTDE0b1h5a3FMMmNzSUNjbktUdGNiaUFnYjNCSlpDQTlJRzl3U1dRdWNtVndiR0ZqWlNndktGdGZYU2txSkM5bkxDQW5KeWs3WEc0Z0lISmxkSFZ5YmlCdmNFbGtPMXh1ZlR0Y2JseHVVM2RoWjJkbGNrTnNhV1Z1ZEM1d2NtOTBiM1I1Y0dVdVptRnBiQ0E5SUdaMWJtTjBhVzl1SUNodFpYTnpZV2RsS1NCN1hHNGdJSFJvYVhNdVptRnBiSFZ5WlNodFpYTnpZV2RsS1R0Y2JseHVJQ0IwYUhKdmR5QnRaWE56WVdkbE8xeHVmVHRjYmlJc0lpZDFjMlVnYzNSeWFXTjBKenRjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE11WDE5aWFXNWtJRDBnWm5WdVkzUnBiMjRnS0dadUxDQnRaU2tnZTF4dUlDQnlaWFIxY200Z1puVnVZM1JwYjI0b0tYdGNiaUFnSUNCeVpYUjFjbTRnWm00dVlYQndiSGtvYldVc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUgwN1hHNTlPMXh1WEc1MllYSWdiRzluSUQwZ2JXOWtkV3hsTG1WNGNHOXlkSE11Ykc5bklEMGdablZ1WTNScGIyNG9LU0I3WEc0Z0lHeHZaeTVvYVhOMGIzSjVJRDBnYkc5bkxtaHBjM1J2Y25rZ2ZId2dXMTA3WEc0Z0lHeHZaeTVvYVhOMGIzSjVMbkIxYzJnb1lYSm5kVzFsYm5SektUdGNibHh1SUNBdkx5QlBibXg1SUd4dlp5QnBaaUJoZG1GcGJHRmliR1VnWVc1a0lIZGxKM0psSUc1dmRDQjBaWE4wYVc1blhHNGdJR2xtSUNoamIyNXpiMnhsSUNZbUlIQnliMk5sYzNNdVpXNTJMazVQUkVWZlJVNVdJQ0U5UFNBbmRHVnpkQ2NwSUh0Y2JpQWdJQ0JqYjI1emIyeGxMbXh2WnloQmNuSmhlUzV3Y205MGIzUjVjR1V1YzJ4cFkyVXVZMkZzYkNoaGNtZDFiV1Z1ZEhNcFd6QmRLVHRjYmlBZ2ZWeHVmVHRjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE11Wm1GcGJDQTlJR1oxYm1OMGFXOXVJQ2h0WlhOellXZGxLU0I3WEc0Z0lHeHZaeWh0WlhOellXZGxLVHRjYm4wN1hHNWNibTF2WkhWc1pTNWxlSEJ2Y25SekxtOXdkR2x2YmtoMGJXd2dQU0JtZFc1amRHbHZiaUFvYkdGaVpXd3NJSFpoYkhWbEtTQjdYRzRnSUhKbGRIVnliaUFuUEhSeVBqeDBaQ0JqYkdGemN6MWNJbTl3ZEdsdmJrNWhiV1ZjSWo0bklDc2diR0ZpWld3Z0t5QW5Pand2ZEdRK1BIUmtQaWNnS3lCMllXeDFaU0FySUNjOEwzUmtQand2ZEhJK0p6dGNibjA3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6TG5SNWNHVkdjbTl0U25OdmJsTmphR1Z0WVNBOUlHWjFibU4wYVc5dUlDaDBlWEJsTENCbWIzSnRZWFFwSUh0Y2JpQWdkbUZ5SUhOMGNqdGNibHh1SUNCcFppQW9kSGx3WlNBOVBUMGdKMmx1ZEdWblpYSW5JQ1ltSUdadmNtMWhkQ0E5UFQwZ0oybHVkRE15SnlrZ2UxeHVJQ0FnSUhOMGNpQTlJQ2RwYm5SbFoyVnlKenRjYmlBZ2ZTQmxiSE5sSUdsbUlDaDBlWEJsSUQwOVBTQW5hVzUwWldkbGNpY2dKaVlnWm05eWJXRjBJRDA5UFNBbmFXNTBOalFuS1NCN1hHNGdJQ0FnYzNSeUlEMGdKMnh2Ym1jbk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkcGJuUmxaMlZ5SnlBbUppQjBlWEJsYjJZZ1ptOXliV0YwSUQwOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJSE4wY2lBOUlDZHNiMjVuSnp0Y2JpQWdmU0JsYkhObElHbG1JQ2gwZVhCbElEMDlQU0FuYzNSeWFXNW5KeUFtSmlCbWIzSnRZWFFnUFQwOUlDZGtZWFJsTFhScGJXVW5LU0I3WEc0Z0lDQWdjM1J5SUQwZ0oyUmhkR1V0ZEdsdFpTYzdYRzRnSUgwZ1pXeHpaU0JwWmlBb2RIbHdaU0E5UFQwZ0ozTjBjbWx1WnljZ0ppWWdabTl5YldGMElEMDlQU0FuWkdGMFpTY3BJSHRjYmlBZ0lDQnpkSElnUFNBblpHRjBaU2M3WEc0Z0lIMGdaV3h6WlNCcFppQW9kSGx3WlNBOVBUMGdKMjUxYldKbGNpY2dKaVlnWm05eWJXRjBJRDA5UFNBblpteHZZWFFuS1NCN1hHNGdJQ0FnYzNSeUlEMGdKMlpzYjJGMEp6dGNiaUFnZlNCbGJITmxJR2xtSUNoMGVYQmxJRDA5UFNBbmJuVnRZbVZ5SnlBbUppQm1iM0p0WVhRZ1BUMDlJQ2RrYjNWaWJHVW5LU0I3WEc0Z0lDQWdjM1J5SUQwZ0oyUnZkV0pzWlNjN1hHNGdJSDBnWld4elpTQnBaaUFvZEhsd1pTQTlQVDBnSjI1MWJXSmxjaWNnSmlZZ2RIbHdaVzltSUdadmNtMWhkQ0E5UFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSHRjYmlBZ0lDQnpkSElnUFNBblpHOTFZbXhsSnp0Y2JpQWdmU0JsYkhObElHbG1JQ2gwZVhCbElEMDlQU0FuWW05dmJHVmhiaWNwSUh0Y2JpQWdJQ0J6ZEhJZ1BTQW5ZbTl2YkdWaGJpYzdYRzRnSUgwZ1pXeHpaU0JwWmlBb2RIbHdaU0E5UFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNCemRISWdQU0FuYzNSeWFXNW5KenRjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ6ZEhJN1hHNTlPMXh1WEc1MllYSWdjMmx0Y0d4bFVtVm1JRDBnYlc5a2RXeGxMbVY0Y0c5eWRITXVjMmx0Y0d4bFVtVm1JRDBnWm5WdVkzUnBiMjRnS0c1aGJXVXBJSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQnVZVzFsSUQwOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJSEpsZEhWeWJpQnVkV3hzTzF4dUlDQjlYRzVjYmlBZ2FXWWdLRzVoYldVdWFXNWtaWGhQWmlnbkl5OWtaV1pwYm1sMGFXOXVjeThuS1NBOVBUMGdNQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQnVZVzFsTG5OMVluTjBjbWx1Wnlnbkl5OWtaV1pwYm1sMGFXOXVjeThuTG14bGJtZDBhQ2s3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnY21WMGRYSnVJRzVoYldVN1hHNGdJSDFjYm4wN1hHNWNiblpoY2lCblpYUlRkSEpwYm1kVGFXZHVZWFIxY21VZ1BTQnRiMlIxYkdVdVpYaHdiM0owY3k1blpYUlRkSEpwYm1kVGFXZHVZWFIxY21VZ1BTQm1kVzVqZEdsdmJpQW9iMkpxTENCaVlYTmxRMjl0Y0c5dVpXNTBLU0I3WEc0Z0lIWmhjaUJ6ZEhJZ1BTQW5KenRjYmx4dUlDQnBaaUFvZEhsd1pXOW1JRzlpYWk0a2NtVm1JQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lITjBjaUFyUFNCemFXMXdiR1ZTWldZb2IySnFMaVJ5WldZcE8xeHVJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVnZaaUJ2WW1vdWRIbHdaU0E5UFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSHRjYmlBZ0lDQnpkSElnS3owZ0oyOWlhbVZqZENjN1hHNGdJSDBnWld4elpTQnBaaUFvYjJKcUxuUjVjR1VnUFQwOUlDZGhjbkpoZVNjcElIdGNiaUFnSUNCcFppQW9ZbUZ6WlVOdmJYQnZibVZ1ZENrZ2UxeHVJQ0FnSUNBZ2MzUnlJQ3M5SUdkbGRGTjBjbWx1WjFOcFoyNWhkSFZ5WlNnb2IySnFMbWwwWlcxeklIeDhJRzlpYWk0a2NtVm1JSHg4SUh0OUtTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhOMGNpQXJQU0FuUVhKeVlYbGJKenRjYmlBZ0lDQWdJSE4wY2lBclBTQm5aWFJUZEhKcGJtZFRhV2R1WVhSMWNtVW9LRzlpYWk1cGRHVnRjeUI4ZkNCdlltb3VKSEpsWmlCOGZDQjdmU2twTzF4dUlDQWdJQ0FnYzNSeUlDczlJQ2RkSnp0Y2JpQWdJQ0I5WEc0Z0lIMGdaV3h6WlNCcFppQW9iMkpxTG5SNWNHVWdQVDA5SUNkcGJuUmxaMlZ5SnlBbUppQnZZbW91Wm05eWJXRjBJRDA5UFNBbmFXNTBNekluS1NCN1hHNGdJQ0FnYzNSeUlDczlJQ2RwYm5SbFoyVnlKenRjYmlBZ2ZTQmxiSE5sSUdsbUlDaHZZbW91ZEhsd1pTQTlQVDBnSjJsdWRHVm5aWEluSUNZbUlHOWlhaTVtYjNKdFlYUWdQVDA5SUNkcGJuUTJOQ2NwSUh0Y2JpQWdJQ0J6ZEhJZ0t6MGdKMnh2Ym1jbk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0c5aWFpNTBlWEJsSUQwOVBTQW5hVzUwWldkbGNpY2dKaVlnZEhsd1pXOW1JRzlpYWk1bWIzSnRZWFFnUFQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEc0Z0lDQWdjM1J5SUNzOUlDZHNiMjVuSnp0Y2JpQWdmU0JsYkhObElHbG1JQ2h2WW1vdWRIbHdaU0E5UFQwZ0ozTjBjbWx1WnljZ0ppWWdiMkpxTG1admNtMWhkQ0E5UFQwZ0oyUmhkR1V0ZEdsdFpTY3BJSHRjYmlBZ0lDQnpkSElnS3owZ0oyUmhkR1V0ZEdsdFpTYzdYRzRnSUgwZ1pXeHpaU0JwWmlBb2IySnFMblI1Y0dVZ1BUMDlJQ2R6ZEhKcGJtY25JQ1ltSUc5aWFpNW1iM0p0WVhRZ1BUMDlJQ2RrWVhSbEp5a2dlMXh1SUNBZ0lITjBjaUFyUFNBblpHRjBaU2M3WEc0Z0lIMGdaV3h6WlNCcFppQW9iMkpxTG5SNWNHVWdQVDA5SUNkemRISnBibWNuSUNZbUlIUjVjR1Z2WmlCdlltb3VabTl5YldGMElEMDlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUhOMGNpQXJQU0FuYzNSeWFXNW5KenRjYmlBZ2ZTQmxiSE5sSUdsbUlDaHZZbW91ZEhsd1pTQTlQVDBnSjI1MWJXSmxjaWNnSmlZZ2IySnFMbVp2Y20xaGRDQTlQVDBnSjJac2IyRjBKeWtnZTF4dUlDQWdJSE4wY2lBclBTQW5abXh2WVhRbk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0c5aWFpNTBlWEJsSUQwOVBTQW5iblZ0WW1WeUp5QW1KaUJ2WW1vdVptOXliV0YwSUQwOVBTQW5aRzkxWW14bEp5a2dlMXh1SUNBZ0lITjBjaUFyUFNBblpHOTFZbXhsSnp0Y2JpQWdmU0JsYkhObElHbG1JQ2h2WW1vdWRIbHdaU0E5UFQwZ0oyNTFiV0psY2ljZ0ppWWdkSGx3Wlc5bUlHOWlhaTVtYjNKdFlYUWdQVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ2MzUnlJQ3M5SUNka2IzVmliR1VuTzF4dUlDQjlJR1ZzYzJVZ2FXWWdLRzlpYWk1MGVYQmxJRDA5UFNBblltOXZiR1ZoYmljcElIdGNiaUFnSUNCemRISWdLejBnSjJKdmIyeGxZVzRuTzF4dUlDQjlJR1ZzYzJVZ2FXWWdLRzlpYWk0a2NtVm1LU0I3WEc0Z0lDQWdjM1J5SUNzOUlITnBiWEJzWlZKbFppaHZZbW91SkhKbFppazdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdjM1J5SUNzOUlHOWlhaTUwZVhCbE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlITjBjanRjYm4wN1hHNGlMQ0luZFhObElITjBjbWxqZENjN1hHNWNiblpoY2lCb1pXeHdaWEp6SUQwZ2NtVnhkV2x5WlNnbkxpOW9aV3h3WlhKekp5azdYRzUyWVhJZ2FsRjFaWEo1SUQwZ2NtVnhkV2x5WlNnbmFuRjFaWEo1SnlrN1hHNTJZWElnY21WeGRXVnpkQ0E5SUhKbGNYVnBjbVVvSjNOMWNHVnlZV2RsYm5RbktUdGNibHh1THlwY2JpQXFJRXBSZFdWeWVVaDBkSEJEYkdsbGJuUWdhWE1nWVNCc2FXZG9kQzEzWldsbmFIUXNJRzV2WkdVZ2IzSWdZbkp2ZDNObGNpQklWRlJRSUdOc2FXVnVkRnh1SUNvdlhHNTJZWElnU2xGMVpYSjVTSFIwY0VOc2FXVnVkQ0E5SUdaMWJtTjBhVzl1SUNncElIdDlPMXh1WEc0dktseHVJQ29nVTNWd1pYSmhaMlZ1ZEVoMGRIQkRiR2xsYm5RZ2FYTWdZU0JzYVdkb2RDMTNaV2xuYUhRc0lHNXZaR1VnYjNJZ1luSnZkM05sY2lCSVZGUlFJR05zYVdWdWRGeHVJQ292WEc1MllYSWdVM1Z3WlhKaFoyVnVkRWgwZEhCRGJHbGxiblFnUFNCbWRXNWpkR2x2YmlBb0tTQjdmVHRjYmx4dUx5b3FYRzRnS2lCVGQyRm5aMlZ5U0hSMGNDQnBjeUJoSUhkeVlYQndaWElnWm05eUlHVjRaV04xZEdsdVp5QnlaWEYxWlhOMGMxeHVJQ292WEc1MllYSWdVM2RoWjJkbGNraDBkSEFnUFNCdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdaMWJtTjBhVzl1SUNncElIdDlPMXh1WEc1VGQyRm5aMlZ5U0hSMGNDNXdjbTkwYjNSNWNHVXVaWGhsWTNWMFpTQTlJR1oxYm1OMGFXOXVJQ2h2WW1vc0lHOXdkSE1wSUh0Y2JpQWdhV1lnS0c5aWFpQW1KaUFvZEhsd1pXOW1JRzlpYWk1MWMyVktVWFZsY25rZ1BUMDlJQ2RpYjI5c1pXRnVKeWtwSUh0Y2JpQWdJQ0IwYUdsekxuVnpaVXBSZFdWeWVTQTlJRzlpYWk1MWMyVktVWFZsY25rN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RHaHBjeTUxYzJWS1VYVmxjbmtnUFNCMGFHbHpMbWx6U1VVNEtDazdYRzRnSUgxY2JseHVJQ0JwWmlBb2IySnFJQ1ltSUhSNWNHVnZaaUJ2WW1vdVltOWtlU0E5UFQwZ0oyOWlhbVZqZENjcElIdGNiaUFnSUNBdkx5QnpjR1ZqYVdGc0lIQnliMk5sYzNOcGJtY2dabTl5SUdacGJHVWdkWEJzYjJGa2N5QjJhV0VnYW5GMVpYSjVYRzRnSUNBZ2FXWWdLRzlpYWk1aWIyUjVMblI1Y0dVZ0ppWWdiMkpxTG1KdlpIa3VkSGx3WlNBOVBUMGdKMlp2Y20xRVlYUmhKeWw3WEc0Z0lDQWdJQ0J2WW1vdVkyOXVkR1Z1ZEZSNWNHVWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lHOWlhaTV3Y205alpYTnpSR0YwWVNBOUlHWmhiSE5sTzF4dVhHNGdJQ0FnSUNCa1pXeGxkR1VnYjJKcUxtaGxZV1JsY25OYkowTnZiblJsYm5RdFZIbHdaU2RkTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnZZbW91WW05a2VTQTlJRXBUVDA0dWMzUnlhVzVuYVdaNUtHOWlhaTVpYjJSNUtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnBaaUFvZEdocGN5NTFjMlZLVVhWbGNua3BJSHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRXBSZFdWeWVVaDBkSEJEYkdsbGJuUW9iM0IwY3lrdVpYaGxZM1YwWlNodlltb3BPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVTNWd1pYSmhaMlZ1ZEVoMGRIQkRiR2xsYm5Rb2IzQjBjeWt1WlhobFkzVjBaU2h2WW1vcE8xeHVJQ0I5WEc1OU8xeHVYRzVUZDJGbloyVnlTSFIwY0M1d2NtOTBiM1I1Y0dVdWFYTkpSVGdnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUhaaGNpQmtaWFJsWTNSbFpFbEZJRDBnWm1Gc2MyVTdYRzVjYmlBZ2FXWWdLSFI1Y0dWdlppQnVZWFpwWjJGMGIzSWdJVDA5SUNkMWJtUmxabWx1WldRbklDWW1JRzVoZG1sbllYUnZjaTUxYzJWeVFXZGxiblFwSUh0Y2JpQWdJQ0IyWVhJZ2JtRjJJRDBnYm1GMmFXZGhkRzl5TG5WelpYSkJaMlZ1ZEM1MGIweHZkMlZ5UTJGelpTZ3BPMXh1WEc0Z0lDQWdhV1lnS0c1aGRpNXBibVJsZUU5bUtDZHRjMmxsSnlrZ0lUMDlJQzB4S1NCN1hHNGdJQ0FnSUNCMllYSWdkbVZ5YzJsdmJpQTlJSEJoY25ObFNXNTBLRzVoZGk1emNHeHBkQ2duYlhOcFpTY3BXekZkS1R0Y2JseHVJQ0FnSUNBZ2FXWWdLSFpsY25OcGIyNGdQRDBnT0NrZ2UxeHVJQ0FnSUNBZ0lDQmtaWFJsWTNSbFpFbEZJRDBnZEhKMVpUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z1pHVjBaV04wWldSSlJUdGNibjA3WEc1Y2JrcFJkV1Z5ZVVoMGRIQkRiR2xsYm5RdWNISnZkRzkwZVhCbExtVjRaV04xZEdVZ1BTQm1kVzVqZEdsdmJpQW9iMkpxS1NCN1hHNGdJSFpoY2lCallpQTlJRzlpYWk1dmJqdGNiaUFnZG1GeUlISmxjWFZsYzNRZ1BTQnZZbW83WEc1Y2JpQWdiMkpxTG5SNWNHVWdQU0J2WW1vdWJXVjBhRzlrTzF4dUlDQnZZbW91WTJGamFHVWdQU0JtWVd4elpUdGNiaUFnWkdWc1pYUmxJRzlpYWk1MWMyVktVWFZsY25rN1hHNWNiaUFnTHlwY2JpQWdiMkpxTG1KbFptOXlaVk5sYm1RZ1BTQm1kVzVqZEdsdmJpQW9lR2h5S1NCN1hHNGdJQ0FnZG1GeUlHdGxlU3dnY21WemRXeDBjenRjYmlBZ0lDQnBaaUFvYjJKcUxtaGxZV1JsY25NcElIdGNiaUFnSUNBZ0lISmxjM1ZzZEhNZ1BTQmJYVHRjYmlBZ0lDQWdJR1p2Y2lBb2EyVjVJR2x1SUc5aWFpNW9aV0ZrWlhKektTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoclpYa3VkRzlNYjNkbGNrTmhjMlVvS1NBOVBUMGdKMk52Ym5SbGJuUXRkSGx3WlNjcElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOMWJIUnpMbkIxYzJnb2IySnFMbU52Ym5SbGJuUlVlWEJsSUQwZ2IySnFMbWhsWVdSbGNuTmJhMlY1WFNrN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9hMlY1TG5SdlRHOTNaWEpEWVhObEtDa2dQVDA5SUNkaFkyTmxjSFFuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MGN5NXdkWE5vS0c5aWFpNWhZMk5sY0hSeklEMGdiMkpxTG1obFlXUmxjbk5iYTJWNVhTazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WemRXeDBjeTV3ZFhOb0tIaG9jaTV6WlhSU1pYRjFaWE4wU0dWaFpHVnlLR3RsZVN3Z2IySnFMbWhsWVdSbGNuTmJhMlY1WFNrcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z2NtVnpkV3gwY3p0Y2JpQWdJQ0I5WEc0Z0lIMDdLaTljYmx4dUlDQnZZbW91WkdGMFlTQTlJRzlpYWk1aWIyUjVPMXh1WEc0Z0lHUmxiR1YwWlNCdlltb3VZbTlrZVR0Y2JseHVJQ0J2WW1vdVkyOXRjR3hsZEdVZ1BTQm1kVzVqZEdsdmJpQW9jbVZ6Y0c5dWMyVXBJSHRjYmlBZ0lDQjJZWElnYUdWaFpHVnljeUE5SUh0OU8xeHVJQ0FnSUhaaGNpQm9aV0ZrWlhKQmNuSmhlU0E5SUhKbGMzQnZibk5sTG1kbGRFRnNiRkpsYzNCdmJuTmxTR1ZoWkdWeWN5Z3BMbk53YkdsMEtDZGNYRzRuS1R0Y2JseHVJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2FHVmhaR1Z5UVhKeVlYa3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUhaaGNpQjBiMU53YkdsMElEMGdhR1ZoWkdWeVFYSnlZWGxiYVYwdWRISnBiU2dwTzF4dVhHNGdJQ0FnSUNCcFppQW9kRzlUY0d4cGRDNXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJ6WlhCaGNtRjBiM0lnUFNCMGIxTndiR2wwTG1sdVpHVjRUMllvSnpvbktUdGNibHh1SUNBZ0lDQWdhV1lnS0hObGNHRnlZWFJ2Y2lBOVBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdUbUZ0WlNCaWRYUWdibThnZG1Gc2RXVWdhVzRnZEdobElHaGxZV1JsY2x4dUlDQWdJQ0FnSUNCb1pXRmtaWEp6VzNSdlUzQnNhWFJkSUQwZ2JuVnNiRHRjYmx4dUlDQWdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2RtRnlJRzVoYldVZ1BTQjBiMU53YkdsMExuTjFZbk4wY21sdVp5Z3dMQ0J6WlhCaGNtRjBiM0lwTG5SeWFXMG9LVHRjYmlBZ0lDQWdJSFpoY2lCMllXeDFaU0E5SUhSdlUzQnNhWFF1YzNWaWMzUnlhVzVuS0hObGNHRnlZWFJ2Y2lBcklERXBMblJ5YVcwb0tUdGNibHh1SUNBZ0lDQWdhR1ZoWkdWeWMxdHVZVzFsWFNBOUlIWmhiSFZsTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCdmRYUWdQU0I3WEc0Z0lDQWdJQ0IxY213NklISmxjWFZsYzNRdWRYSnNMRnh1SUNBZ0lDQWdiV1YwYUc5a09pQnlaWEYxWlhOMExtMWxkR2h2WkN4Y2JpQWdJQ0FnSUhOMFlYUjFjem9nY21WemNHOXVjMlV1YzNSaGRIVnpMRnh1SUNBZ0lDQWdjM1JoZEhWelZHVjRkRG9nY21WemNHOXVjMlV1YzNSaGRIVnpWR1Y0ZEN4Y2JpQWdJQ0FnSUdSaGRHRTZJSEpsYzNCdmJuTmxMbkpsYzNCdmJuTmxWR1Y0ZEN4Y2JpQWdJQ0FnSUdobFlXUmxjbk02SUdobFlXUmxjbk5jYmlBZ0lDQjlPMXh1WEc0Z0lDQWdkbUZ5SUdOdmJuUmxiblJVZVhCbElEMGdLR2hsWVdSbGNuTmJKMk52Ym5SbGJuUXRkSGx3WlNkZElIeDhJR2hsWVdSbGNuTmJKME52Ym5SbGJuUXRWSGx3WlNkZElIeDhJRzUxYkd3cE8xeHVYRzRnSUNBZ2FXWWdLR052Ym5SbGJuUlVlWEJsS1NCN1hHNGdJQ0FnSUNCcFppQW9ZMjl1ZEdWdWRGUjVjR1V1YVc1a1pYaFBaaWduWVhCd2JHbGpZWFJwYjI0dmFuTnZiaWNwSUQwOVBTQXdJSHg4SUdOdmJuUmxiblJVZVhCbExtbHVaR1Y0VDJZb0p5dHFjMjl1SnlrZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJQ0FnYjNWMExtOWlhaUE5SUhKbGMzQnZibk5sTG5KbGMzQnZibk5sU2xOUFRpQjhmQ0JLVTA5T0xuQmhjbk5sS0c5MWRDNWtZWFJoS1NCOGZDQjdmVHRjYmlBZ0lDQWdJQ0FnZlNCallYUmphQ0FvWlhncElIdGNiaUFnSUNBZ0lDQWdJQ0F2THlCa2J5QnViM1FnYzJWMElHOTFkQzV2WW1wY2JpQWdJQ0FnSUNBZ0lDQm9aV3h3WlhKekxteHZaeWduZFc1aFlteGxJSFJ2SUhCaGNuTmxJRXBUVDA0Z1kyOXVkR1Z1ZENjcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSEpsYzNCdmJuTmxMbk4wWVhSMWN5QStQU0F5TURBZ0ppWWdjbVZ6Y0c5dWMyVXVjM1JoZEhWeklEd2dNekF3S1NCN1hHNGdJQ0FnSUNCallpNXlaWE53YjI1elpTaHZkWFFwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvY21WemNHOXVjMlV1YzNSaGRIVnpJRDA5UFNBd0lIeDhJQ2h5WlhOd2IyNXpaUzV6ZEdGMGRYTWdQajBnTkRBd0lDWW1JSEpsYzNCdmJuTmxMbk4wWVhSMWN5QThJRFU1T1NrcElIdGNiaUFnSUNBZ0lHTmlMbVZ5Y205eUtHOTFkQ2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCallpNXlaWE53YjI1elpTaHZkWFFwTzF4dUlDQWdJSDFjYmlBZ2ZUdGNibHh1SUNCcVVYVmxjbmt1YzNWd2NHOXlkQzVqYjNKeklEMGdkSEoxWlR0Y2JseHVJQ0J5WlhSMWNtNGdhbEYxWlhKNUxtRnFZWGdvYjJKcUtUdGNibjA3WEc1Y2JsTjFjR1Z5WVdkbGJuUklkSFJ3UTJ4cFpXNTBMbkJ5YjNSdmRIbHdaUzVsZUdWamRYUmxJRDBnWm5WdVkzUnBiMjRnS0c5aWFpa2dlMXh1SUNCMllYSWdiV1YwYUc5a0lEMGdiMkpxTG0xbGRHaHZaQzUwYjB4dmQyVnlRMkZ6WlNncE8xeHVYRzRnSUdsbUlDaHRaWFJvYjJRZ1BUMDlJQ2RrWld4bGRHVW5LU0I3WEc0Z0lDQWdiV1YwYUc5a0lEMGdKMlJsYkNjN1hHNGdJSDFjYmx4dUlDQjJZWElnYUdWaFpHVnljeUE5SUc5aWFpNW9aV0ZrWlhKeklIeDhJSHQ5TzF4dUlDQjJZWElnY2lBOUlISmxjWFZsYzNSYmJXVjBhRzlrWFNodlltb3VkWEpzS1R0Y2JpQWdkbUZ5SUc1aGJXVTdYRzVjYmlBZ1ptOXlJQ2h1WVcxbElHbHVJR2hsWVdSbGNuTXBJSHRjYmlBZ0lDQnlMbk5sZENodVlXMWxMQ0JvWldGa1pYSnpXMjVoYldWZEtUdGNiaUFnZlZ4dVhHNGdJR2xtSUNodlltb3VZbTlrZVNrZ2UxeHVJQ0FnSUhJdWMyVnVaQ2h2WW1vdVltOWtlU2s3WEc0Z0lIMWNibHh1SUNCeUxtVnVaQ2htZFc1amRHbHZiaUFvWlhKeUxDQnlaWE1wSUh0Y2JpQWdJQ0J5WlhNZ1BTQnlaWE1nZkh3Z2UxeHVJQ0FnSUNBZ2MzUmhkSFZ6T2lBd0xGeHVJQ0FnSUNBZ2FHVmhaR1Z5Y3pvZ2UyVnljbTl5T2lBbmJtOGdjbVZ6Y0c5dWMyVWdabkp2YlNCelpYSjJaWEluZlZ4dUlDQWdJSDA3WEc0Z0lDQWdkbUZ5SUhKbGMzQnZibk5sSUQwZ2UxeHVJQ0FnSUNBZ2RYSnNPaUJ2WW1vdWRYSnNMRnh1SUNBZ0lDQWdiV1YwYUc5a09pQnZZbW91YldWMGFHOWtMRnh1SUNBZ0lDQWdhR1ZoWkdWeWN6b2djbVZ6TG1obFlXUmxjbk5jYmlBZ0lDQjlPMXh1SUNBZ0lIWmhjaUJqWWp0Y2JseHVJQ0FnSUdsbUlDZ2haWEp5SUNZbUlISmxjeTVsY25KdmNpa2dlMXh1SUNBZ0lDQWdaWEp5SUQwZ2NtVnpMbVZ5Y205eU8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaGxjbklnSmlZZ2IySnFMbTl1SUNZbUlHOWlhaTV2Ymk1bGNuSnZjaWtnZTF4dUlDQWdJQ0FnY21WemNHOXVjMlV1YjJKcUlEMGdaWEp5TzF4dUlDQWdJQ0FnY21WemNHOXVjMlV1YzNSaGRIVnpJRDBnY21WeklEOGdjbVZ6TG5OMFlYUjFjeUE2SURVd01EdGNiaUFnSUNBZ0lISmxjM0J2Ym5ObExuTjBZWFIxYzFSbGVIUWdQU0J5WlhNZ1B5QnlaWE11ZEdWNGRDQTZJR1Z5Y2k1dFpYTnpZV2RsTzF4dUlDQWdJQ0FnWTJJZ1BTQnZZbW91YjI0dVpYSnliM0k3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2h5WlhNZ0ppWWdiMkpxTG05dUlDWW1JRzlpYWk1dmJpNXlaWE53YjI1elpTa2dlMXh1SUNBZ0lDQWdjbVZ6Y0c5dWMyVXViMkpxSUQwZ0tIUjVjR1Z2WmlCeVpYTXVZbTlrZVNBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUQ4Z2NtVnpMbUp2WkhrZ09pQnlaWE11ZEdWNGREdGNiaUFnSUNBZ0lISmxjM0J2Ym5ObExuTjBZWFIxY3lBOUlISmxjeTV6ZEdGMGRYTTdYRzRnSUNBZ0lDQnlaWE53YjI1elpTNXpkR0YwZFhOVVpYaDBJRDBnY21WekxuUmxlSFE3WEc0Z0lDQWdJQ0JqWWlBOUlHOWlhaTV2Ymk1eVpYTndiMjV6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVZ6Y0c5dWMyVXVaR0YwWVNBOUlISmxjM0J2Ym5ObExuTjBZWFIxYzFSbGVIUTdYRzVjYmlBZ0lDQnBaaUFvWTJJcElIdGNiaUFnSUNBZ0lHTmlLSEpsYzNCdmJuTmxLVHRjYmlBZ0lDQjlYRzRnSUgwcE8xeHVmVHRjYmlJc0lpZDFjMlVnYzNSeWFXTjBKenRjYmx4dWRtRnlJRk4zWVdkblpYSklkSFJ3SUQwZ2NtVnhkV2x5WlNnbkxpOW9kSFJ3SnlrN1hHNWNiaThxS2lCY2JpQXFJRkpsYzI5c2RtVnpJR0VnYzNCbFl5ZHpJSEpsYlc5MFpTQnlaV1psY21WdVkyVnpYRzRnS2k5Y2JuWmhjaUJTWlhOdmJIWmxjaUE5SUcxdlpIVnNaUzVsZUhCdmNuUnpJRDBnWm5WdVkzUnBiMjRnS0NrZ2UzMDdYRzVjYmxKbGMyOXNkbVZ5TG5CeWIzUnZkSGx3WlM1eVpYTnZiSFpsSUQwZ1puVnVZM1JwYjI0Z0tITndaV01zSUdOaGJHeGlZV05yTENCelkyOXdaU2tnZTF4dUlDQjBhR2x6TG5OamIzQmxJRDBnS0hOamIzQmxJSHg4SUhSb2FYTXBPMXh1WEc0Z0lIWmhjaUJvYjNOMExDQnVZVzFsTENCd1lYUm9MQ0J3Y205d1pYSjBlU3dnY0hKdmNHVnlkSGxPWVcxbE8xeHVJQ0IyWVhJZ2NISnZZMlZ6YzJWa1EyRnNiSE1nUFNBd0xDQnlaWE52YkhabFpGSmxabk1nUFNCN2ZTd2dkVzV5WlhOdmJIWmxaRkpsWm5NZ1BTQjdmVHRjYmlBZ2RtRnlJSEpsYzI5c2RYUnBiMjVVWVdKc1pTQTlJSHQ5T3lBdkx5QnpkRzl5WlNCdlltcGxZM1J6SUdadmNpQmtaWEpsWm1WeVpXNWphVzVuWEc1Y2JpQWdMeThnYlc5a1pXeHpYRzRnSUdadmNpQW9ibUZ0WlNCcGJpQnpjR1ZqTG1SbFptbHVhWFJwYjI1ektTQjdYRzRnSUNBZ2RtRnlJRzF2WkdWc0lEMGdjM0JsWXk1a1pXWnBibWwwYVc5dWMxdHVZVzFsWFR0Y2JseHVJQ0FnSUdadmNpQW9jSEp2Y0dWeWRIbE9ZVzFsSUdsdUlHMXZaR1ZzTG5CeWIzQmxjblJwWlhNcElIdGNiaUFnSUNBZ0lIQnliM0JsY25SNUlEMGdiVzlrWld3dWNISnZjR1Z5ZEdsbGMxdHdjbTl3WlhKMGVVNWhiV1ZkTzF4dVhHNGdJQ0FnSUNCMGFHbHpMbkpsYzI5c2RtVlVieWh3Y205d1pYSjBlU3dnY21WemIyeDFkR2x2YmxSaFlteGxLVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0F2THlCdmNHVnlZWFJwYjI1elhHNGdJR1p2Y2lBb2JtRnRaU0JwYmlCemNHVmpMbkJoZEdoektTQjdYRzRnSUNBZ2RtRnlJRzFsZEdodlpDd2diM0JsY21GMGFXOXVMQ0J5WlhOd2IyNXpaVU52WkdVN1hHNWNiaUFnSUNCd1lYUm9JRDBnYzNCbFl5NXdZWFJvYzF0dVlXMWxYVHRjYmx4dUlDQWdJR1p2Y2lBb2JXVjBhRzlrSUdsdUlIQmhkR2dwSUh0Y2JpQWdJQ0FnSUdsbUtHMWxkR2h2WkNBOVBUMGdKeVJ5WldZbktTQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdWNtVnpiMngyWlVsdWJHbHVaU2h6Y0dWakxDQndZWFJvTENCeVpYTnZiSFYwYVc5dVZHRmliR1VzSUhWdWNtVnpiMngyWldSU1pXWnpLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnZjR1Z5WVhScGIyNGdQU0J3WVhSb1cyMWxkR2h2WkYwN1hHNWNiaUFnSUNBZ0lDQWdkbUZ5SUdrc0lIQmhjbUZ0WlhSbGNuTWdQU0J2Y0dWeVlYUnBiMjR1Y0dGeVlXMWxkR1Z5Y3p0Y2JseHVJQ0FnSUNBZ0lDQm1iM0lnS0drZ2FXNGdjR0Z5WVcxbGRHVnljeWtnZTF4dUlDQWdJQ0FnSUNBZ0lIWmhjaUJ3WVhKaGJXVjBaWElnUFNCd1lYSmhiV1YwWlhKelcybGRPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLSEJoY21GdFpYUmxjaTVwYmlBOVBUMGdKMkp2WkhrbklDWW1JSEJoY21GdFpYUmxjaTV6WTJobGJXRXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WemIyeDJaVlJ2S0hCaGNtRnRaWFJsY2k1elkyaGxiV0VzSUhKbGMyOXNkWFJwYjI1VVlXSnNaU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tIQmhjbUZ0WlhSbGNpNGtjbVZtS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuSmxjMjlzZG1WSmJteHBibVVvYzNCbFl5d2djR0Z5WVcxbGRHVnlMQ0J5WlhOdmJIVjBhVzl1VkdGaWJHVXNJSFZ1Y21WemIyeDJaV1JTWldaektUdGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQm1iM0lnS0hKbGMzQnZibk5sUTI5a1pTQnBiaUJ2Y0dWeVlYUnBiMjR1Y21WemNHOXVjMlZ6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMzQnZibk5sSUQwZ2IzQmxjbUYwYVc5dUxuSmxjM0J2Ym5ObGMxdHlaWE53YjI1elpVTnZaR1ZkTzF4dUlDQWdJQ0FnSUNBZ0lHbG1LSFI1Y0dWdlppQnlaWE53YjI1elpTQTlQVDBnSjI5aWFtVmpkQ2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtS0hKbGMzQnZibk5sTGlSeVpXWXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1eVpYTnZiSFpsU1c1c2FXNWxLSE53WldNc0lISmxjM0J2Ym5ObExDQnlaWE52YkhWMGFXOXVWR0ZpYkdVc0lIVnVjbVZ6YjJ4MlpXUlNaV1p6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hKbGMzQnZibk5sTG5OamFHVnRZU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1eVpYTnZiSFpsVkc4b2NtVnpjRzl1YzJVdWMyTm9aVzFoTENCeVpYTnZiSFYwYVc5dVZHRmliR1VwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzh2SUdkbGRDQm9iM04wYzF4dUlDQjJZWElnYjNCMGN5QTlJSHQ5TENCbGVIQmxZM1JsWkVOaGJHeHpJRDBnTUR0Y2JseHVJQ0JtYjNJZ0tHNWhiV1VnYVc0Z2NtVnpiMngxZEdsdmJsUmhZbXhsS1NCN1hHNGdJQ0FnZG1GeUlIQmhjblJ6SUQwZ2JtRnRaUzV6Y0d4cGRDZ25JeWNwTzF4dVhHNGdJQ0FnYVdZZ0tIQmhjblJ6TG14bGJtZDBhQ0E5UFQwZ01pa2dlMXh1SUNBZ0lDQWdhRzl6ZENBOUlIQmhjblJ6V3pCZE95QndZWFJvSUQwZ2NHRnlkSE5iTVYwN1hHNWNiaUFnSUNBZ0lHbG1JQ2doUVhKeVlYa3VhWE5CY25KaGVTaHZjSFJ6VzJodmMzUmRLU2tnZTF4dUlDQWdJQ0FnSUNCdmNIUnpXMmh2YzNSZElEMGdXMTA3WEc0Z0lDQWdJQ0FnSUdWNGNHVmpkR1ZrUTJGc2JITWdLejBnTVR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2IzQjBjMXRvYjNOMFhTNXdkWE5vS0hCaGRHZ3BPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJSHRjYmlBZ0lDQWdJR2xtSUNnaFFYSnlZWGt1YVhOQmNuSmhlU2h2Y0hSelcyNWhiV1ZkS1NrZ2UxeHVJQ0FnSUNBZ0lDQnZjSFJ6VzI1aGJXVmRJRDBnVzEwN1hHNGdJQ0FnSUNBZ0lHVjRjR1ZqZEdWa1EyRnNiSE1nS3owZ01UdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdiM0IwYzF0dVlXMWxYUzV3ZFhOb0tHNTFiR3dwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUdadmNpQW9ibUZ0WlNCcGJpQnZjSFJ6S1NCN1hHNGdJQ0FnZG1GeUlITmxiR1lnUFNCMGFHbHpMQ0J2Y0hRZ1BTQnZjSFJ6VzI1aGJXVmRPMXh1WEc0Z0lDQWdhRzl6ZENBOUlHNWhiV1U3WEc1Y2JpQWdJQ0IyWVhJZ2IySnFJRDBnZTF4dUlDQWdJQ0FnZFhObFNsRjFaWEo1T2lCbVlXeHpaU3dnSUM4dklGUlBSRTljYmlBZ0lDQWdJSFZ5YkRvZ2FHOXpkQ3hjYmlBZ0lDQWdJRzFsZEdodlpEb2dKMmRsZENjc1hHNGdJQ0FnSUNCb1pXRmtaWEp6T2lCN1hHNGdJQ0FnSUNBZ0lHRmpZMlZ3ZERvZ2RHaHBjeTV6WTI5d1pTNXpkMkZuWjJWeVVtVnhkV1Z6ZEVobFlXUmxjbk1nZkh3Z0oyRndjR3hwWTJGMGFXOXVMMnB6YjI0blhHNGdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ2IyNDZJSHRjYmlBZ0lDQWdJQ0FnWlhKeWIzSTZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQndjbTlqWlhOelpXUkRZV3hzY3lBclBTQXhPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJR2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z2IzQjBMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCbVlXbHNJR0ZzYkNCdlppQjBhR1Z6WlZ4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMyOXNkbVZrSUQwZ2FHOXpkQ0FySUNjakp5QXJJRzl3ZEZ0cFhUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2RXNXlaWE52YkhabFpGSmxabk5iY21WemIyeDJaV1JkSUQwZ2JuVnNiRHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0JwWmlBb2NISnZZMlZ6YzJWa1EyRnNiSE1nUFQwOUlHVjRjR1ZqZEdWa1EyRnNiSE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdVptbHVhWE5vS0hOd1pXTXNJSEpsYzI5c2RYUnBiMjVVWVdKc1pTd2djbVZ6YjJ4MlpXUlNaV1p6TENCMWJuSmxjMjlzZG1Wa1VtVm1jeXdnWTJGc2JHSmhZMnNwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmU3dnSUM4dklHcHphR2x1ZENCcFoyNXZjbVU2YkdsdVpWeHVJQ0FnSUNBZ0lDQnlaWE53YjI1elpUb2dablZ1WTNScGIyNGdLSEpsYzNCdmJuTmxLU0I3WEc1Y2JpQWdJQ0FnSUNBZ0lDQjJZWElnYVN3Z2Fpd2djM2RoWjJkbGNpQTlJSEpsYzNCdmJuTmxMbTlpYWp0Y2JseHVJQ0FnSUNBZ0lDQWdJR2xtS0hOM1lXZG5aWElnUFQwOUlHNTFiR3dnZkh3Z1QySnFaV04wTG10bGVYTW9jM2RoWjJkbGNpa3ViR1Z1WjNSb0lEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCemQyRm5aMlZ5SUQwZ1NsTlBUaTV3WVhKelpTaHlaWE53YjI1elpTNWtZWFJoS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHTmhkR05vSUNobEtYdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MzZGhaMmRsY2lBOUlIdDlPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNBZ0lIQnliMk5sYzNObFpFTmhiR3h6SUNzOUlERTdYRzVjYmlBZ0lDQWdJQ0FnSUNCbWIzSWdLR2tnUFNBd095QnBJRHdnYjNCMExteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY0dGMGFDQTlJRzl3ZEZ0cFhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUtIQmhkR2dnUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOdmJIWmxaRkpsWm5OYmJtRnRaVjBnUFNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JtRnRaVG9nYm1GdFpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZZbW82SUhOM1lXZG5aWEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdmVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnYkc5allYUnBiMjRnUFNCemQyRm5aMlZ5TENCd1lYSjBjeUE5SUhCaGRHZ3VjM0JzYVhRb0p5OG5LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5SUNocUlEMGdNRHNnYWlBOElIQmhjblJ6TG14bGJtZDBhRHNnYWlzcktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhObFoyMWxiblFnUFNCd1lYSjBjMXRxWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppaHpaV2R0Wlc1MExtbHVaR1Y0VDJZb0ozNHhKeWtnSVQwOUlDMHhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXZHRaVzUwSUQwZ2NHRnlkSE5iYWwwdWNtVndiR0ZqWlNndmZqQXZaeXdnSjM0bktTNXlaWEJzWVdObEtDOStNUzluTENBbkx5Y3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZb2MyVm5iV1Z1ZEM1amFHRnlRWFFvTUNrZ0lUMDlJQ2N2SnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6WldkdFpXNTBJRDBnSnk4bklDc2djMlZuYldWdWREdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlHeHZZMkYwYVc5dUlEMDlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hObFoyMWxiblF1YkdWdVozUm9JRDRnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiRzlqWVhScGIyNGdQU0JzYjJOaGRHbHZibHR6WldkdFpXNTBYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMyOXNkbVZrSUQwZ2FHOXpkQ0FySUNjakp5QXJJSEJoZEdnc0lISmxjMjlzZG1Wa1RtRnRaU0E5SUhCaGNuUnpXMm90TVYwN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnNiMk5oZEdsdmJpQWhQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE52YkhabFpGSmxabk5iY21WemIyeDJaV1JkSUQwZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdibUZ0WlRvZ2NtVnpiMngyWldST1lXMWxMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJKcU9pQnNiMk5oZEdsdmJseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RXNXlaWE52YkhabFpGSmxabk5iY21WemIyeDJaV1JkSUQwZ2JuVnNiRHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jSEp2WTJWemMyVmtRMkZzYkhNZ1BUMDlJR1Y0Y0dWamRHVmtRMkZzYkhNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhObGJHWXVabWx1YVhOb0tITndaV01zSUhKbGMyOXNkWFJwYjI1VVlXSnNaU3dnY21WemIyeDJaV1JTWldaekxDQjFibkpsYzI5c2RtVmtVbVZtY3l3Z1kyRnNiR0poWTJzcE8xeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlNBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNiaUFnSUNCOU8xeHVYRzRnSUNBZ2FXWWdLSE5qYjNCbElDWW1JSE5qYjNCbExtTnNhV1Z1ZEVGMWRHaHZjbWw2WVhScGIyNXpLU0I3WEc0Z0lDQWdJQ0J6WTI5d1pTNWpiR2xsYm5SQmRYUm9iM0pwZW1GMGFXOXVjeTVoY0hCc2VTaHZZbW9wTzF4dUlDQWdJSDFjYmx4dUlDQWdJRzVsZHlCVGQyRm5aMlZ5U0hSMGNDZ3BMbVY0WldOMWRHVW9iMkpxS1R0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2hQWW1wbFkzUXVhMlY1Y3lodmNIUnpLUzVzWlc1bmRHZ2dQVDA5SURBcElIdGNiaUFnSUNCallXeHNZbUZqYXk1allXeHNLSFJvYVhNdWMyTnZjR1VzSUhOd1pXTXNJSFZ1Y21WemIyeDJaV1JTWldaektUdGNiaUFnZlZ4dWZUdGNibHh1VW1WemIyeDJaWEl1Y0hKdmRHOTBlWEJsTG1acGJtbHphQ0E5SUdaMWJtTjBhVzl1SUNoemNHVmpMQ0J5WlhOdmJIVjBhVzl1VkdGaWJHVXNJSEpsYzI5c2RtVmtVbVZtY3l3Z2RXNXlaWE52YkhabFpGSmxabk1zSUdOaGJHeGlZV05yS1NCN1hHNGdJQzh2SUhkaGJHc2djbVZ6YjJ4MWRHbHZiaUIwWVdKc1pTQmhibVFnY21Wd2JHRmpaU0IzYVhSb0lISmxjMjlzZG1Wa0lISmxabk5jYmlBZ2RtRnlJSEpsWmp0Y2JseHVJQ0JtYjNJZ0tISmxaaUJwYmlCeVpYTnZiSFYwYVc5dVZHRmliR1VwSUh0Y2JpQWdJQ0IyWVhJZ2FTd2diRzlqWVhScGIyNXpJRDBnY21WemIyeDFkR2x2YmxSaFlteGxXM0psWmwwN1hHNWNiaUFnSUNCbWIzSWdLR2tnUFNBd095QnBJRHdnYkc5allYUnBiMjV6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQjJZWElnY21WemIyeDJaV1JVYnlBOUlISmxjMjlzZG1Wa1VtVm1jMXRzYjJOaGRHbHZibk5iYVYwdWIySnFMaVJ5WldaZE8xeHVYRzRnSUNBZ0lDQnBaaUFvY21WemIyeDJaV1JVYnlrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVhOd1pXTXVaR1ZtYVc1cGRHbHZibk1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQnpjR1ZqTG1SbFptbHVhWFJwYjI1eklEMGdlMzA3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnBaaUFvYkc5allYUnBiMjV6VzJsZExuSmxjMjlzZG1WQmN5QTlQVDBnSnlSeVpXWW5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ2MzQmxZeTVrWldacGJtbDBhVzl1YzF0eVpYTnZiSFpsWkZSdkxtNWhiV1ZkSUQwZ2NtVnpiMngyWldSVWJ5NXZZbW83WEc0Z0lDQWdJQ0FnSUNBZ2JHOWpZWFJwYjI1elcybGRMbTlpYWk0a2NtVm1JRDBnSnlNdlpHVm1hVzVwZEdsdmJuTXZKeUFySUhKbGMyOXNkbVZrVkc4dWJtRnRaVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoc2IyTmhkR2x2Ym5OYmFWMHVjbVZ6YjJ4MlpVRnpJRDA5UFNBbmFXNXNhVzVsSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCMFlYSm5aWFJQWW1vZ1BTQnNiMk5oZEdsdmJuTmJhVjB1YjJKcU8xeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCclpYazdYRzVjYmlBZ0lDQWdJQ0FnSUNCa1pXeGxkR1VnZEdGeVoyVjBUMkpxTGlSeVpXWTdYRzVjYmlBZ0lDQWdJQ0FnSUNCbWIzSWdLR3RsZVNCcGJpQnlaWE52YkhabFpGUnZMbTlpYWlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdGeVoyVjBUMkpxVzJ0bGVWMGdQU0J5WlhOdmJIWmxaRlJ2TG05aWFsdHJaWGxkTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJR05oYkd4aVlXTnJMbU5oYkd3b2RHaHBjeTV6WTI5d1pTd2djM0JsWXl3Z2RXNXlaWE52YkhabFpGSmxabk1wTzF4dWZUdGNibHh1THlvcVhHNGdLaUJwYlcxbFpHbGhkR1ZzZVNCcGJpMXNhVzVsY3lCc2IyTmhiQ0J5WldaekxDQnhkV1YxWlhNZ2NtVnRiM1JsSUhKbFpuTmNiaUFxSUdadmNpQnBibXhwYm1VZ2NtVnpiMngxZEdsdmJseHVJQ292WEc1U1pYTnZiSFpsY2k1d2NtOTBiM1I1Y0dVdWNtVnpiMngyWlVsdWJHbHVaU0E5SUdaMWJtTjBhVzl1SUNoemNHVmpMQ0J3Y205d1pYSjBlU3dnYjJKcWN5d2dkVzV5WlhOdmJIWmxaRkpsWm5NcElIdGNiaUFnZG1GeUlISmxaaUE5SUhCeWIzQmxjblI1TGlSeVpXWTdYRzVjYmlBZ2FXWWdLSEpsWmlrZ2UxeHVJQ0FnSUdsbUlDaHlaV1l1YVc1a1pYaFBaaWduYUhSMGNDY3BJRDA5UFNBd0tTQjdYRzRnSUNBZ0lDQnBaaUFvUVhKeVlYa3VhWE5CY25KaGVTaHZZbXB6VzNKbFpsMHBLU0I3WEc0Z0lDQWdJQ0FnSUc5aWFuTmJjbVZtWFM1d2RYTm9LSHR2WW1vNklIQnliM0JsY25SNUxDQnlaWE52YkhabFFYTTZJQ2RwYm14cGJtVW5mU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0J2WW1welczSmxabDBnUFNCYmUyOWlham9nY0hKdmNHVnlkSGtzSUhKbGMyOXNkbVZCY3pvZ0oybHViR2x1WlNkOVhUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tISmxaaTVwYm1SbGVFOW1LQ2NqSnlrZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUM4dklHeHZZMkZzSUhKbGMyOXNkbVZjYmlBZ0lDQWdJSFpoY2lCemFHOXlkR1Z1WldSU1pXWWdQU0J5WldZdWMzVmljM1J5YVc1bktERXBPMXh1SUNBZ0lDQWdkbUZ5SUdrc0lIQmhjblJ6SUQwZ2MyaHZjblJsYm1Wa1VtVm1Mbk53YkdsMEtDY3ZKeWtzSUd4dlkyRjBhVzl1SUQwZ2MzQmxZenRjYmx4dUlDQWdJQ0FnWm05eUlDaHBJRDBnTURzZ2FTQThJSEJoY25SekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQndZWEowSUQwZ2NHRnlkSE5iYVYwN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0hCaGNuUXViR1Z1WjNSb0lENGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHeHZZMkYwYVc5dUlEMGdiRzlqWVhScGIyNWJjR0Z5ZEYwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0d4dlkyRjBhVzl1S1NCN1hHNGdJQ0FnSUNBZ0lHUmxiR1YwWlNCd2NtOXdaWEowZVM0a2NtVm1PMXh1WEc0Z0lDQWdJQ0FnSUhaaGNpQnJaWGs3WEc1Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2hyWlhrZ2FXNGdiRzlqWVhScGIyNHBJSHRjYmlBZ0lDQWdJQ0FnSUNCd2NtOXdaWEowZVZ0clpYbGRJRDBnYkc5allYUnBiMjViYTJWNVhUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdkVzV5WlhOdmJIWmxaRkpsWm5OYmNtVm1YU0E5SUc1MWJHdzdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5SUdWc2MyVWdhV1lnS0hCeWIzQmxjblI1TG5SNWNHVWdQVDA5SUNkaGNuSmhlU2NwSUh0Y2JpQWdJQ0IwYUdsekxuSmxjMjlzZG1WVWJ5aHdjbTl3WlhKMGVTNXBkR1Z0Y3l3Z2IySnFjeWs3WEc0Z0lIMWNibjA3WEc1Y2JsSmxjMjlzZG1WeUxuQnliM1J2ZEhsd1pTNXlaWE52YkhabFZHOGdQU0JtZFc1amRHbHZiaUFvY0hKdmNHVnlkSGtzSUc5aWFuTXBJSHRjYmlBZ2RtRnlJSEpsWmlBOUlIQnliM0JsY25SNUxpUnlaV1k3WEc1Y2JpQWdhV1lnS0hKbFppa2dlMXh1SUNBZ0lHbG1JQ2h5WldZdWFXNWtaWGhQWmlnbmFIUjBjQ2NwSUQwOVBTQXdLU0I3WEc0Z0lDQWdJQ0JwWmlBb1FYSnlZWGt1YVhOQmNuSmhlU2h2WW1welczSmxabDBwS1NCN1hHNGdJQ0FnSUNBZ0lHOWlhbk5iY21WbVhTNXdkWE5vS0h0dlltbzZJSEJ5YjNCbGNuUjVMQ0J5WlhOdmJIWmxRWE02SUNja2NtVm1KMzBwTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnYjJKcWMxdHlaV1pkSUQwZ1czdHZZbW82SUhCeWIzQmxjblI1TENCeVpYTnZiSFpsUVhNNklDY2tjbVZtSjMxZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmU0JsYkhObElHbG1JQ2h3Y205d1pYSjBlUzUwZVhCbElEMDlQU0FuWVhKeVlYa25LU0I3WEc0Z0lDQWdkbUZ5SUdsMFpXMXpJRDBnY0hKdmNHVnlkSGt1YVhSbGJYTTdYRzVjYmlBZ0lDQjBhR2x6TG5KbGMyOXNkbVZVYnlocGRHVnRjeXdnYjJKcWN5azdYRzRnSUgxY2JuMDdYRzRpTENJbmRYTmxJSE4wY21samRDYzdYRzVjYm5aaGNpQlRkMkZuWjJWeVEyeHBaVzUwSUQwZ2NtVnhkV2x5WlNnbkxpOWpiR2xsYm5RbktUdGNiblpoY2lCVGQyRm5aMlZ5U0hSMGNDQTlJSEpsY1hWcGNtVW9KeTR2YUhSMGNDY3BPMXh1WEc1MllYSWdVM2RoWjJkbGNsTndaV05EYjI1MlpYSjBaWElnUFNCdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnZEdocGN5NWxjbkp2Y25NZ1BTQmJYVHRjYmlBZ2RHaHBjeTUzWVhKdWFXNW5jeUE5SUZ0ZE8xeHVJQ0IwYUdsekxtMXZaR1ZzVFdGd0lEMGdlMzA3WEc1OU8xeHVYRzVUZDJGbloyVnlVM0JsWTBOdmJuWmxjblJsY2k1d2NtOTBiM1I1Y0dVdWMyVjBSRzlqZFcxbGJuUmhkR2x2Ymt4dlkyRjBhVzl1SUQwZ1puVnVZM1JwYjI0Z0tHeHZZMkYwYVc5dUtTQjdYRzRnSUhSb2FYTXVaRzlqVEc5allYUnBiMjRnUFNCc2IyTmhkR2x2Ymp0Y2JuMDdYRzVjYmk4cUtseHVJQ29nWTI5dWRtVnlkSE1nWVNCeVpYTnZkWEpqWlNCc2FYTjBhVzVuSUU5U0lHRndhU0JrWldOc1lYSmhkR2x2Ymx4dUlDb3FMMXh1VTNkaFoyZGxjbE53WldORGIyNTJaWEowWlhJdWNISnZkRzkwZVhCbExtTnZiblpsY25RZ1BTQm1kVzVqZEdsdmJpQW9iMkpxTENCallXeHNZbUZqYXlrZ2UxeHVJQ0F2THlCdWIzUWdZU0IyWVd4cFpDQnpjR1ZqWEc0Z0lHbG1LQ0Z2WW1vZ2ZId2dJVUZ5Y21GNUxtbHpRWEp5WVhrb2IySnFMbUZ3YVhNcEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVabWx1YVhOb0tHTmhiR3hpWVdOckxDQnVkV3hzS1R0Y2JpQWdmVnh1WEc0Z0lDOHZJR055WldGMFpTQmhJRzVsZHlCemQyRm5aMlZ5SUc5aWFtVmpkQ0IwYnlCeVpYUjFjbTVjYmlBZ2RtRnlJSE4zWVdkblpYSWdQU0I3SUhOM1lXZG5aWEk2SUNjeUxqQW5JSDA3WEc1Y2JpQWdjM2RoWjJkbGNpNXZjbWxuYVc1aGJGWmxjbk5wYjI0Z1BTQnZZbW91YzNkaFoyZGxjbFpsY25OcGIyNDdYRzVjYmlBZ0x5OGdZV1JrSUhSb1pTQnBibVp2WEc0Z0lIUm9hWE11WVhCcFNXNW1ieWh2WW1vc0lITjNZV2RuWlhJcE8xeHVYRzRnSUM4dklHRmtaQ0J6WldOMWNtbDBlU0JrWldacGJtbDBhVzl1YzF4dUlDQjBhR2x6TG5ObFkzVnlhWFI1UkdWbWFXNXBkR2x2Ym5Nb2IySnFMQ0J6ZDJGbloyVnlLVHRjYmx4dUlDQXZMeUJ6WldVZ2FXWWdkR2hwY3lCcGN5QmhJSE5wYm1kc1pTMW1hV3hsSUhOM1lXZG5aWElnWkdWbWFXNXBkR2x2Ymx4dUlDQjJZWElnYVhOVGFXNW5iR1ZHYVd4bFUzZGhaMmRsY2lBOUlHWmhiSE5sTzF4dUlDQjJZWElnYVR0Y2JpQWdabTl5S0drZ1BTQXdPeUJwSUR3Z2IySnFMbUZ3YVhNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQjJZWElnWVhCcElEMGdiMkpxTG1Gd2FYTmJhVjA3WEc0Z0lDQWdhV1lvUVhKeVlYa3VhWE5CY25KaGVTaGhjR2t1YjNCbGNtRjBhVzl1Y3lrcElIdGNiaUFnSUNBZ0lHbHpVMmx1WjJ4bFJtbHNaVk4zWVdkblpYSWdQU0IwY25WbE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCcFppaHBjMU5wYm1kc1pVWnBiR1ZUZDJGbloyVnlLU0I3WEc0Z0lDQWdkR2hwY3k1a1pXTnNZWEpoZEdsdmJpaHZZbW9zSUhOM1lXZG5aWElwTzF4dUlDQWdJSFJvYVhNdVptbHVhWE5vS0dOaGJHeGlZV05yTENCemQyRm5aMlZ5S1R0Y2JpQWdmVnh1SUNCbGJITmxJSHRjYmlBZ0lDQjBhR2x6TG5KbGMyOTFjbU5sVEdsemRHbHVaeWh2WW1vc0lITjNZV2RuWlhJc0lHTmhiR3hpWVdOcktUdGNiaUFnZlZ4dWZUdGNibHh1VTNkaFoyZGxjbE53WldORGIyNTJaWEowWlhJdWNISnZkRzkwZVhCbExtUmxZMnhoY21GMGFXOXVJRDBnWm5WdVkzUnBiMjRvYjJKcUxDQnpkMkZuWjJWeUtTQjdYRzRnSUhaaGNpQnVZVzFsTENCcE8xeHVJQ0JwWmlnaGIySnFMbUZ3YVhNcElIdGNiaUFnSUNCeVpYUjFjbTQ3WEc0Z0lIMWNibHh1SUNCMllYSWdZbUZ6WlZCaGRHZ2dQU0J2WW1vdVltRnpaVkJoZEdnN1hHNGdJR2xtS0c5aWFpNWlZWE5sVUdGMGFDNXBibVJsZUU5bUtDZG9kSFJ3T2k4dkp5a2dQVDA5SURBcElIdGNiaUFnSUNCMllYSWdjQ0E5SUc5aWFpNWlZWE5sVUdGMGFDNXpkV0p6ZEhKcGJtY29KMmgwZEhBNkx5OG5MbXhsYm1kMGFDazdYRzRnSUNBZ2RtRnlJSEJ2Y3lBOUlIQXVhVzVrWlhoUFppZ25MeWNwTzF4dUlDQWdJR2xtS0hCdmN5QStJREFwSUh0Y2JpQWdJQ0FnSUhOM1lXZG5aWEl1YUc5emRDQTlJSEF1YzNWaWMzUnlhVzVuS0RBc0lIQnZjeWs3WEc0Z0lDQWdJQ0J6ZDJGbloyVnlMbUpoYzJWUVlYUm9JRDBnY0M1emRXSnpkSEpwYm1jb2NHOXpLVHRjYmlBZ0lDQjlYRzRnSUNBZ1pXeHpaWHRjYmlBZ0lDQWdJSE4zWVdkblpYSXVhRzl6ZENBOUlIQTdYRzRnSUNBZ0lDQnpkMkZuWjJWeUxtSmhjMlZRWVhSb0lEMGdKeThuTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0IyWVhJZ2NtVnpiM1Z5WTJWTVpYWmxiRUYxZEdnN1hHNGdJR2xtS0c5aWFpNWhkWFJvYjNKcGVtRjBhVzl1Y3lrZ2UxeHVJQ0FnSUhKbGMyOTFjbU5sVEdWMlpXeEJkWFJvSUQwZ2IySnFMbUYxZEdodmNtbDZZWFJwYjI1ek8xeHVJQ0I5WEc0Z0lHbG1LRzlpYWk1amIyNXpkVzFsY3lrZ2UxeHVJQ0FnSUhOM1lXZG5aWEl1WTI5dWMzVnRaWE1nUFNCdlltb3VZMjl1YzNWdFpYTTdYRzRnSUgxY2JpQWdhV1lvYjJKcUxuQnliMlIxWTJWektTQjdYRzRnSUNBZ2MzZGhaMmRsY2k1d2NtOWtkV05sY3lBOUlHOWlhaTV3Y205a2RXTmxjenRjYmlBZ2ZWeHVYRzRnSUM4dklHSjFhV3hrSUdFZ2JXRndjR2x1WnlCdlppQnBaQ0IwYnlCdVlXMWxJR1p2Y2lBeExqQWdiVzlrWld3Z2NtVnpiMngxZEdsdmJuTmNiaUFnYVdZb2RIbHdaVzltSUc5aWFpQTlQVDBnSjI5aWFtVmpkQ2NwSUh0Y2JpQWdJQ0JtYjNJb2JtRnRaU0JwYmlCdlltb3ViVzlrWld4ektTQjdYRzRnSUNBZ0lDQjJZWElnWlhocGMzUnBibWROYjJSbGJDQTlJRzlpYWk1dGIyUmxiSE5iYm1GdFpWMDdYRzRnSUNBZ0lDQjJZWElnYTJWNUlEMGdLR1Y0YVhOMGFXNW5UVzlrWld3dWFXUWdmSHdnYm1GdFpTazdYRzRnSUNBZ0lDQjBhR2x6TG0xdlpHVnNUV0Z3VzJ0bGVWMGdQU0J1WVcxbE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lHWnZjaWhwSUQwZ01Ec2dhU0E4SUc5aWFpNWhjR2x6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2RtRnlJR0Z3YVNBOUlHOWlhaTVoY0dselcybGRPMXh1SUNBZ0lIWmhjaUJ3WVhSb0lEMGdZWEJwTG5CaGRHZzdYRzRnSUNBZ2RtRnlJRzl3WlhKaGRHbHZibk1nUFNCaGNHa3ViM0JsY21GMGFXOXVjenRjYmlBZ0lDQjBhR2x6TG05d1pYSmhkR2x2Ym5Nb2NHRjBhQ3dnYjJKcUxuSmxjMjkxY21ObFVHRjBhQ3dnYjNCbGNtRjBhVzl1Y3l3Z2NtVnpiM1Z5WTJWTVpYWmxiRUYxZEdnc0lITjNZV2RuWlhJcE8xeHVJQ0I5WEc1Y2JpQWdkbUZ5SUcxdlpHVnNjeUE5SUc5aWFpNXRiMlJsYkhNN1hHNGdJSFJvYVhNdWJXOWtaV3h6S0cxdlpHVnNjeXdnYzNkaFoyZGxjaWs3WEc1OU8xeHVYRzVUZDJGbloyVnlVM0JsWTBOdmJuWmxjblJsY2k1d2NtOTBiM1I1Y0dVdWJXOWtaV3h6SUQwZ1puVnVZM1JwYjI0b2IySnFMQ0J6ZDJGbloyVnlLU0I3WEc0Z0lHbG1LSFI1Y0dWdlppQnZZbW9nSVQwOUlDZHZZbXBsWTNRbktTQjdYRzRnSUNBZ2NtVjBkWEp1TzF4dUlDQjlYRzRnSUhaaGNpQnVZVzFsTzF4dVhHNGdJSE4zWVdkblpYSXVaR1ZtYVc1cGRHbHZibk1nUFNCemQyRm5aMlZ5TG1SbFptbHVhWFJwYjI1eklIeDhJSHQ5TzF4dUlDQm1iM0lvYm1GdFpTQnBiaUJ2WW1vcElIdGNiaUFnSUNCMllYSWdaWGhwYzNScGJtZE5iMlJsYkNBOUlHOWlhbHR1WVcxbFhUdGNiaUFnSUNCMllYSWdYMlZ1ZFcwZ1BTQmJYVHRjYmlBZ0lDQjJZWElnYzJOb1pXMWhJRDBnZXlCd2NtOXdaWEowYVdWek9pQjdmWDA3WEc0Z0lDQWdkbUZ5SUhCeWIzQmxjblI1VG1GdFpUdGNiaUFnSUNCbWIzSW9jSEp2Y0dWeWRIbE9ZVzFsSUdsdUlHVjRhWE4wYVc1blRXOWtaV3d1Y0hKdmNHVnlkR2xsY3lrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1Y0YVhOMGFXNW5VSEp2Y0dWeWRIa2dQU0JsZUdsemRHbHVaMDF2WkdWc0xuQnliM0JsY25ScFpYTmJjSEp2Y0dWeWRIbE9ZVzFsWFR0Y2JpQWdJQ0FnSUhaaGNpQndjbTl3WlhKMGVTQTlJSHQ5TzF4dUlDQWdJQ0FnZEdocGN5NWtZWFJoVkhsd1pTaGxlR2x6ZEdsdVoxQnliM0JsY25SNUxDQndjbTl3WlhKMGVTazdYRzRnSUNBZ0lDQnBaaWhsZUdsemRHbHVaMUJ5YjNCbGNuUjVMbVJsYzJOeWFYQjBhVzl1S1NCN1hHNGdJQ0FnSUNBZ0lIQnliM0JsY25SNUxtUmxjMk55YVhCMGFXOXVJRDBnWlhocGMzUnBibWRRY205d1pYSjBlUzVrWlhOamNtbHdkR2x2Ymp0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdsbUtHVjRhWE4wYVc1blVISnZjR1Z5ZEhsYkoyVnVkVzBuWFNrZ2UxeHVJQ0FnSUNBZ0lDQndjbTl3WlhKMGVWc25aVzUxYlNkZElEMGdaWGhwYzNScGJtZFFjbTl3WlhKMGVWc25aVzUxYlNkZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2FXWW9kSGx3Wlc5bUlHVjRhWE4wYVc1blVISnZjR1Z5ZEhrdWNtVnhkV2x5WldRZ1BUMDlJQ2RpYjI5c1pXRnVKeUFtSmlCbGVHbHpkR2x1WjFCeWIzQmxjblI1TG5KbGNYVnBjbVZrSUQwOVBTQjBjblZsS1NCN1hHNGdJQ0FnSUNBZ0lGOWxiblZ0TG5CMWMyZ29jSEp2Y0dWeWRIbE9ZVzFsS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdsbUtIUjVjR1Z2WmlCbGVHbHpkR2x1WjFCeWIzQmxjblI1TG5KbGNYVnBjbVZrSUQwOVBTQW5jM1J5YVc1bkp5QW1KaUJsZUdsemRHbHVaMUJ5YjNCbGNuUjVMbkpsY1hWcGNtVmtJRDA5UFNBbmRISjFaU2NwSUh0Y2JpQWdJQ0FnSUNBZ1gyVnVkVzB1Y0hWemFDaHdjbTl3WlhKMGVVNWhiV1VwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYzJOb1pXMWhMbkJ5YjNCbGNuUnBaWE5iY0hKdmNHVnlkSGxPWVcxbFhTQTlJSEJ5YjNCbGNuUjVPMXh1SUNBZ0lIMWNiaUFnSUNCcFppaGZaVzUxYlM1c1pXNW5kR2dnUGlBd0tTQjdYRzRnSUNBZ0lDQnpZMmhsYldGYkoyVnVkVzBuWFNBOUlGOWxiblZ0TzF4dUlDQWdJSDFjYmlBZ0lDQnpkMkZuWjJWeUxtUmxabWx1YVhScGIyNXpXMjVoYldWZElEMGdjMk5vWlcxaE8xeHVJQ0I5WEc1OU8xeHVYRzVUZDJGbloyVnlVM0JsWTBOdmJuWmxjblJsY2k1d2NtOTBiM1I1Y0dVdVpYaDBjbUZqZEZSaFp5QTlJR1oxYm1OMGFXOXVLSEpsYzI5MWNtTmxVR0YwYUNrZ2UxeHVJQ0IyWVhJZ2NHRjBhRk4wY21sdVp5QTlJSEpsYzI5MWNtTmxVR0YwYUNCOGZDQW5aR1ZtWVhWc2RDYzdYRzRnSUdsbUtIQmhkR2hUZEhKcGJtY3VhVzVrWlhoUFppZ25hSFIwY0RvbktTQTlQVDBnTUNCOGZDQndZWFJvVTNSeWFXNW5MbWx1WkdWNFQyWW9KMmgwZEhCek9pY3BJRDA5UFNBd0tTQjdYRzRnSUNBZ2NHRjBhRk4wY21sdVp5QTlJSEJoZEdoVGRISnBibWN1YzNCc2FYUW9XeWN2SjEwcE8xeHVJQ0FnSUhCaGRHaFRkSEpwYm1jZ1BTQndZWFJvVTNSeWFXNW5XM0JoZEdoVGRISnBibWN1YkdWdVozUm9JQzB4WFM1emRXSnpkSEpwYm1jb0tUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2NHRjBhRk4wY21sdVp5NXlaWEJzWVdObEtDY3ZKeXduSnlrN1hHNTlYRzVjYmxOM1lXZG5aWEpUY0dWalEyOXVkbVZ5ZEdWeUxuQnliM1J2ZEhsd1pTNXZjR1Z5WVhScGIyNXpJRDBnWm5WdVkzUnBiMjRvY0dGMGFDd2djbVZ6YjNWeVkyVlFZWFJvTENCdlltb3NJSEpsYzI5MWNtTmxUR1YyWld4QmRYUm9MQ0J6ZDJGbloyVnlLU0I3WEc0Z0lHbG1LQ0ZCY25KaGVTNXBjMEZ5Y21GNUtHOWlhaWtwSUh0Y2JpQWdJQ0J5WlhSMWNtNDdYRzRnSUgxY2JpQWdkbUZ5SUdrN1hHNWNiaUFnYVdZb0lYTjNZV2RuWlhJdWNHRjBhSE1wSUh0Y2JpQWdJQ0J6ZDJGbloyVnlMbkJoZEdoeklEMGdlMzA3WEc0Z0lIMWNibHh1SUNCMllYSWdjR0YwYUU5aWFpQTlJSE4zWVdkblpYSXVjR0YwYUhOYmNHRjBhRjBnZkh3Z2UzMDdYRzRnSUhaaGNpQjBZV2NnUFNCMGFHbHpMbVY0ZEhKaFkzUlVZV2NvY21WemIzVnlZMlZRWVhSb0tUdGNiaUFnYzNkaFoyZGxjaTUwWVdkeklEMGdjM2RoWjJkbGNpNTBZV2R6SUh4OElGdGRPMXh1SUNCMllYSWdiV0YwWTJobFpDQTlJR1poYkhObE8xeHVJQ0JtYjNJb2FTQTlJREE3SUdrZ1BDQnpkMkZuWjJWeUxuUmhaM011YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCMllYSWdkR0ZuVDJKcVpXTjBJRDBnYzNkaFoyZGxjaTUwWVdkelcybGRPMXh1SUNBZ0lHbG1LSFJoWjA5aWFtVmpkQzV1WVcxbElEMDlQU0IwWVdjcElIdGNiaUFnSUNBZ0lHMWhkR05vWldRZ1BTQjBjblZsTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0JwWmlnaGJXRjBZMmhsWkNrZ2UxeHVJQ0FnSUhOM1lXZG5aWEl1ZEdGbmN5NXdkWE5vS0h0dVlXMWxPaUIwWVdkOUtUdGNiaUFnZlZ4dVhHNGdJR1p2Y2locElEMGdNRHNnYVNBOElHOWlhaTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUhaaGNpQmxlR2x6ZEdsdVowOXdaWEpoZEdsdmJpQTlJRzlpYWx0cFhUdGNiaUFnSUNCMllYSWdiV1YwYUc5a0lEMGdLR1Y0YVhOMGFXNW5UM0JsY21GMGFXOXVMbTFsZEdodlpDQjhmQ0JsZUdsemRHbHVaMDl3WlhKaGRHbHZiaTVvZEhSd1RXVjBhRzlrS1M1MGIweHZkMlZ5UTJGelpTZ3BPMXh1SUNBZ0lIWmhjaUJ2Y0dWeVlYUnBiMjRnUFNCN2RHRm5jem9nVzNSaFoxMTlPMXh1SUNBZ0lIWmhjaUJsZUdsemRHbHVaMEYxZEdodmNtbDZZWFJwYjI1eklEMGdaWGhwYzNScGJtZFBjR1Z5WVhScGIyNHVZWFYwYUc5eWFYcGhkR2x2Ym5NN1hHNWNiaUFnSUNCcFppaGxlR2x6ZEdsdVowRjFkR2h2Y21sNllYUnBiMjV6SUNZbUlFOWlhbVZqZEM1clpYbHpLR1Y0YVhOMGFXNW5RWFYwYUc5eWFYcGhkR2x2Ym5NcExteGxibWQwYUNBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnWlhocGMzUnBibWRCZFhSb2IzSnBlbUYwYVc5dWN5QTlJSEpsYzI5MWNtTmxUR1YyWld4QmRYUm9PMXh1SUNBZ0lIMWNibHh1SUNBZ0lHbG1LSFI1Y0dWdlppQmxlR2x6ZEdsdVowRjFkR2h2Y21sNllYUnBiMjV6SUNFOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJQ0FnWm05eUtIWmhjaUJyWlhrZ2FXNGdaWGhwYzNScGJtZEJkWFJvYjNKcGVtRjBhVzl1Y3lrZ2UxeHVJQ0FnSUNBZ0lDQnZjR1Z5WVhScGIyNHVjMlZqZFhKcGRIa2dQU0J2Y0dWeVlYUnBiMjR1YzJWamRYSnBkSGtnZkh3Z1cxMDdYRzRnSUNBZ0lDQWdJSFpoY2lCelkyOXdaWE1nUFNCbGVHbHpkR2x1WjBGMWRHaHZjbWw2WVhScGIyNXpXMnRsZVYwN1hHNGdJQ0FnSUNBZ0lHbG1LSE5qYjNCbGN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhaaGNpQnpaV04xY21sMGVWTmpiM0JsY3lBOUlGdGRPMXh1SUNBZ0lDQWdJQ0FnSUdadmNpaDJZWElnYWlCcGJpQnpZMjl3WlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhObFkzVnlhWFI1VTJOdmNHVnpMbkIxYzJnb2MyTnZjR1Z6VzJwZExuTmpiM0JsS1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnZG1GeUlITmpiM0JsYzA5aWFtVmpkQ0E5SUh0OU8xeHVJQ0FnSUNBZ0lDQWdJSE5qYjNCbGMwOWlhbVZqZEZ0clpYbGRJRDBnYzJWamRYSnBkSGxUWTI5d1pYTTdYRzRnSUNBZ0lDQWdJQ0FnYjNCbGNtRjBhVzl1TG5ObFkzVnlhWFI1TG5CMWMyZ29jMk52Y0dWelQySnFaV04wS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQjJZWElnYzJOdmNHVnpUMkpxWldOMElEMGdlMzA3WEc0Z0lDQWdJQ0FnSUNBZ2MyTnZjR1Z6VDJKcVpXTjBXMnRsZVYwZ1BTQmJYVHRjYmlBZ0lDQWdJQ0FnSUNCdmNHVnlZWFJwYjI0dWMyVmpkWEpwZEhrdWNIVnphQ2h6WTI5d1pYTlBZbXBsWTNRcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWW9aWGhwYzNScGJtZFBjR1Z5WVhScGIyNHVZMjl1YzNWdFpYTXBJSHRjYmlBZ0lDQWdJRzl3WlhKaGRHbHZiaTVqYjI1emRXMWxjeUE5SUdWNGFYTjBhVzVuVDNCbGNtRjBhVzl1TG1OdmJuTjFiV1Z6TzF4dUlDQWdJSDFjYmlBZ0lDQmxiSE5sSUdsbUtITjNZV2RuWlhJdVkyOXVjM1Z0WlhNcElIdGNiaUFnSUNBZ0lHOXdaWEpoZEdsdmJpNWpiMjV6ZFcxbGN5QTlJSE4zWVdkblpYSXVZMjl1YzNWdFpYTTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUtHVjRhWE4wYVc1blQzQmxjbUYwYVc5dUxuQnliMlIxWTJWektTQjdYRzRnSUNBZ0lDQnZjR1Z5WVhScGIyNHVjSEp2WkhWalpYTWdQU0JsZUdsemRHbHVaMDl3WlhKaGRHbHZiaTV3Y205a2RXTmxjenRjYmlBZ0lDQjlYRzRnSUNBZ1pXeHpaU0JwWmloemQyRm5aMlZ5TG5CeWIyUjFZMlZ6S1NCN1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0dWNISnZaSFZqWlhNZ1BTQnpkMkZuWjJWeUxuQnliMlIxWTJWek8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlobGVHbHpkR2x1WjA5d1pYSmhkR2x2Ymk1emRXMXRZWEo1S1NCN1hHNGdJQ0FnSUNCdmNHVnlZWFJwYjI0dWMzVnRiV0Z5ZVNBOUlHVjRhWE4wYVc1blQzQmxjbUYwYVc5dUxuTjFiVzFoY25rN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtS0dWNGFYTjBhVzVuVDNCbGNtRjBhVzl1TG01dmRHVnpLU0I3WEc0Z0lDQWdJQ0J2Y0dWeVlYUnBiMjR1WkdWelkzSnBjSFJwYjI0Z1BTQmxlR2x6ZEdsdVowOXdaWEpoZEdsdmJpNXViM1JsY3p0Y2JpQWdJQ0I5WEc0Z0lDQWdhV1lvWlhocGMzUnBibWRQY0dWeVlYUnBiMjR1Ym1samEyNWhiV1VwSUh0Y2JpQWdJQ0FnSUc5d1pYSmhkR2x2Ymk1dmNHVnlZWFJwYjI1SlpDQTlJR1Y0YVhOMGFXNW5UM0JsY21GMGFXOXVMbTVwWTJ0dVlXMWxPMXh1SUNBZ0lIMWNiaUFnSUNCcFppaGxlR2x6ZEdsdVowOXdaWEpoZEdsdmJpNWtaWEJ5WldOaGRHVmtLU0I3WEc0Z0lDQWdJQ0J2Y0dWeVlYUnBiMjR1WkdWd2NtVmpZWFJsWkNBOUlHVjRhWE4wYVc1blQzQmxjbUYwYVc5dUxtUmxjSEpsWTJGMFpXUTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RHaHBjeTVoZFhSb2IzSnBlbUYwYVc5dWN5aGxlR2x6ZEdsdVowRjFkR2h2Y21sNllYUnBiMjV6TENCemQyRm5aMlZ5S1R0Y2JpQWdJQ0IwYUdsekxuQmhjbUZ0WlhSbGNuTW9iM0JsY21GMGFXOXVMQ0JsZUdsemRHbHVaMDl3WlhKaGRHbHZiaTV3WVhKaGJXVjBaWEp6TENCemQyRm5aMlZ5S1R0Y2JpQWdJQ0IwYUdsekxuSmxjM0J2Ym5ObFRXVnpjMkZuWlhNb2IzQmxjbUYwYVc5dUxDQmxlR2x6ZEdsdVowOXdaWEpoZEdsdmJpd2djM2RoWjJkbGNpazdYRzVjYmlBZ0lDQndZWFJvVDJKcVcyMWxkR2h2WkYwZ1BTQnZjR1Z5WVhScGIyNDdYRzRnSUgxY2JseHVJQ0J6ZDJGbloyVnlMbkJoZEdoelczQmhkR2hkSUQwZ2NHRjBhRTlpYWp0Y2JuMDdYRzVjYmxOM1lXZG5aWEpUY0dWalEyOXVkbVZ5ZEdWeUxuQnliM1J2ZEhsd1pTNXlaWE53YjI1elpVMWxjM05oWjJWeklEMGdablZ1WTNScGIyNG9iM0JsY21GMGFXOXVMQ0JsZUdsemRHbHVaMDl3WlhKaGRHbHZiaXdnYzNkaFoyZGxjaWtnZTF4dUlDQnBaaWgwZVhCbGIyWWdaWGhwYzNScGJtZFBjR1Z5WVhScGIyNGdJVDA5SUNkdlltcGxZM1FuS1NCN1hHNGdJQ0FnY21WMGRYSnVPMXh1SUNCOVhHNGdJQzh2SUdKMWFXeGtJR1JsWm1GMWJIUWdjbVZ6Y0c5dWMyVWdabkp2YlNCMGFHVWdiM0JsY21GMGFXOXVJQ2d4TG5ncFhHNGdJSFpoY2lCa1pXWmhkV3gwVW1WemNHOXVjMlVnUFNCN2ZUdGNiaUFnZEdocGN5NWtZWFJoVkhsd1pTaGxlR2x6ZEdsdVowOXdaWEpoZEdsdmJpd2daR1ZtWVhWc2RGSmxjM0J2Ym5ObEtUdGNiaUFnYVdZb0lXUmxabUYxYkhSU1pYTndiMjV6WlM1elkyaGxiV0VwSUh0Y2JpQWdJQ0JrWldaaGRXeDBVbVZ6Y0c5dWMyVWdQU0I3YzJOb1pXMWhPaUJrWldaaGRXeDBVbVZ6Y0c5dWMyVjlPMXh1SUNCOVhHNWNiaUFnYjNCbGNtRjBhVzl1TG5KbGMzQnZibk5sY3lBOUlHOXdaWEpoZEdsdmJpNXlaWE53YjI1elpYTWdmSHdnZTMwN1hHNWNiaUFnTHk4Z1ozSmhZaUJtY205dElISmxjM0J2Ym5ObFRXVnpjMkZuWlhNZ0tERXVNaWxjYmlBZ2RtRnlJR2hoY3pJd01DQTlJR1poYkhObE8xeHVJQ0JwWmloQmNuSmhlUzVwYzBGeWNtRjVLR1Y0YVhOMGFXNW5UM0JsY21GMGFXOXVMbkpsYzNCdmJuTmxUV1Z6YzJGblpYTXBLU0I3WEc0Z0lDQWdkbUZ5SUdrN1hHNGdJQ0FnZG1GeUlHVjRhWE4wYVc1blVtVnpjRzl1YzJWeklEMGdaWGhwYzNScGJtZFBjR1Z5WVhScGIyNHVjbVZ6Y0c5dWMyVk5aWE56WVdkbGN6dGNiaUFnSUNCbWIzSW9hU0E5SURBN0lHa2dQQ0JsZUdsemRHbHVaMUpsYzNCdmJuTmxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1Y0YVhOMGFXNW5VbVZ6Y0c5dWMyVWdQU0JsZUdsemRHbHVaMUpsYzNCdmJuTmxjMXRwWFR0Y2JpQWdJQ0FnSUhaaGNpQnlaWE53YjI1elpTQTlJSHNnWkdWelkzSnBjSFJwYjI0NklHVjRhWE4wYVc1blVtVnpjRzl1YzJVdWJXVnpjMkZuWlNCOU8xeHVJQ0FnSUNBZ2FXWW9aWGhwYzNScGJtZFNaWE53YjI1elpTNWpiMlJsSUQwOVBTQXlNREFwSUh0Y2JpQWdJQ0FnSUNBZ2FHRnpNakF3SUQwZ2RISjFaVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJRzl3WlhKaGRHbHZiaTV5WlhOd2IyNXpaWE5iSnljZ0t5QmxlR2x6ZEdsdVoxSmxjM0J2Ym5ObExtTnZaR1ZkSUQwZ2NtVnpjRzl1YzJVN1hHNGdJQ0FnSUNBdkx5QlVUMFJQT2lCelkyaGxiV0ZjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0JwWmlob1lYTXlNREFwSUh0Y2JpQWdJQ0J2Y0dWeVlYUnBiMjR1Y21WemNHOXVjMlZ6V3lka1pXWmhkV3gwSjEwZ1BTQmtaV1poZFd4MFVtVnpjRzl1YzJVN1hHNGdJSDFjYmlBZ1pXeHpaU0I3WEc0Z0lDQWdiM0JsY21GMGFXOXVMbkpsYzNCdmJuTmxjMXNuTWpBd0oxMGdQU0JrWldaaGRXeDBVbVZ6Y0c5dWMyVTdYRzRnSUgxY2JuMDdYRzVjYmxOM1lXZG5aWEpUY0dWalEyOXVkbVZ5ZEdWeUxuQnliM1J2ZEhsd1pTNWhkWFJvYjNKcGVtRjBhVzl1Y3lBOUlHWjFibU4wYVc5dUtHOWlhaXdnYzNkaFoyZGxjaWtnZTF4dUlDQXZMeUJVVDBSUFhHNGdJR2xtS0hSNWNHVnZaaUJ2WW1vZ0lUMDlJQ2R2WW1wbFkzUW5LU0I3WEc0Z0lDQWdjbVYwZFhKdU8xeHVJQ0I5WEc1OU8xeHVYRzVUZDJGbloyVnlVM0JsWTBOdmJuWmxjblJsY2k1d2NtOTBiM1I1Y0dVdWNHRnlZVzFsZEdWeWN5QTlJR1oxYm1OMGFXOXVLRzl3WlhKaGRHbHZiaXdnYjJKcUxDQnpkMkZuWjJWeUtTQjdYRzRnSUdsbUtDRkJjbkpoZVM1cGMwRnljbUY1S0c5aWFpa3BJSHRjYmlBZ0lDQnlaWFIxY200N1hHNGdJSDFjYmlBZ2RtRnlJR2s3WEc0Z0lHWnZjaWhwSUQwZ01Ec2dhU0E4SUc5aWFpNXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJSFpoY2lCbGVHbHpkR2x1WjFCaGNtRnRaWFJsY2lBOUlHOWlhbHRwWFR0Y2JpQWdJQ0IyWVhJZ2NHRnlZVzFsZEdWeUlEMGdlMzA3WEc0Z0lDQWdjR0Z5WVcxbGRHVnlMbTVoYldVZ1BTQmxlR2x6ZEdsdVoxQmhjbUZ0WlhSbGNpNXVZVzFsTzF4dUlDQWdJSEJoY21GdFpYUmxjaTVrWlhOamNtbHdkR2x2YmlBOUlHVjRhWE4wYVc1blVHRnlZVzFsZEdWeUxtUmxjMk55YVhCMGFXOXVPMXh1SUNBZ0lIQmhjbUZ0WlhSbGNpNXlaWEYxYVhKbFpDQTlJR1Y0YVhOMGFXNW5VR0Z5WVcxbGRHVnlMbkpsY1hWcGNtVmtPMXh1SUNBZ0lIQmhjbUZ0WlhSbGNpNXBiaUE5SUdWNGFYTjBhVzVuVUdGeVlXMWxkR1Z5TG5CaGNtRnRWSGx3WlR0Y2JseHVJQ0FnSUM4dklIQmxjaUFqTVRZNFhHNGdJQ0FnYVdZb2NHRnlZVzFsZEdWeUxtbHVJRDA5UFNBblltOWtlU2NwSUh0Y2JpQWdJQ0FnSUhCaGNtRnRaWFJsY2k1dVlXMWxJRDBnSjJKdlpIa25PMXh1SUNBZ0lIMWNiaUFnSUNCcFppaHdZWEpoYldWMFpYSXVhVzRnUFQwOUlDZG1iM0p0SnlrZ2UxeHVJQ0FnSUNBZ2NHRnlZVzFsZEdWeUxtbHVJRDBnSjJadmNtMUVZWFJoSnp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlobGVHbHpkR2x1WjFCaGNtRnRaWFJsY2k1aGJHeHZkMDExYkhScGNHeGxJRDA5UFNCMGNuVmxJSHg4SUdWNGFYTjBhVzVuVUdGeVlXMWxkR1Z5TG1Gc2JHOTNUWFZzZEdsd2JHVWdQVDA5SUNkMGNuVmxKeWtnZTF4dUlDQWdJQ0FnZG1GeUlHbHVibVZ5Vkhsd1pTQTlJSHQ5TzF4dUlDQWdJQ0FnZEdocGN5NWtZWFJoVkhsd1pTaGxlR2x6ZEdsdVoxQmhjbUZ0WlhSbGNpd2dhVzV1WlhKVWVYQmxLVHRjYmlBZ0lDQWdJSEJoY21GdFpYUmxjaTUwZVhCbElEMGdKMkZ5Y21GNUp6dGNiaUFnSUNBZ0lIQmhjbUZ0WlhSbGNpNXBkR1Z0Y3lBOUlHbHVibVZ5Vkhsd1pUdGNibHh1SUNBZ0lDQWdhV1lvWlhocGMzUnBibWRRWVhKaGJXVjBaWEl1WVd4c2IzZGhZbXhsVm1Gc2RXVnpLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmhkaUE5SUdWNGFYTjBhVzVuVUdGeVlXMWxkR1Z5TG1Gc2JHOTNZV0pzWlZaaGJIVmxjenRjYmlBZ0lDQWdJQ0FnYVdZb1lYWXVkbUZzZFdWVWVYQmxJRDA5UFNBblRFbFRWQ2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQndZWEpoYldWMFpYSmJKMlZ1ZFcwblhTQTlJR0YyTG5aaGJIVmxjenRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQmxiSE5sSUh0Y2JpQWdJQ0FnSUhSb2FYTXVaR0YwWVZSNWNHVW9aWGhwYzNScGJtZFFZWEpoYldWMFpYSXNJSEJoY21GdFpYUmxjaWs3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdiM0JsY21GMGFXOXVMbkJoY21GdFpYUmxjbk1nUFNCdmNHVnlZWFJwYjI0dWNHRnlZVzFsZEdWeWN5QjhmQ0JiWFR0Y2JpQWdJQ0J2Y0dWeVlYUnBiMjR1Y0dGeVlXMWxkR1Z5Y3k1d2RYTm9LSEJoY21GdFpYUmxjaWs3WEc0Z0lIMWNibjA3WEc1Y2JsTjNZV2RuWlhKVGNHVmpRMjl1ZG1WeWRHVnlMbkJ5YjNSdmRIbHdaUzVrWVhSaFZIbHdaU0E5SUdaMWJtTjBhVzl1S0hOdmRYSmpaU3dnZEdGeVoyVjBLU0I3WEc0Z0lHbG1LSFI1Y0dWdlppQnpiM1Z5WTJVZ0lUMDlJQ2R2WW1wbFkzUW5LU0I3WEc0Z0lDQWdjbVYwZFhKdU8xeHVJQ0I5WEc1Y2JpQWdhV1lvYzI5MWNtTmxMbTFwYm1sdGRXMHBJSHRjYmlBZ0lDQjBZWEpuWlhRdWJXbHVhVzExYlNBOUlITnZkWEpqWlM1dGFXNXBiWFZ0TzF4dUlDQjlYRzRnSUdsbUtITnZkWEpqWlM1dFlYaHBiWFZ0S1NCN1hHNGdJQ0FnZEdGeVoyVjBMbTFoZUdsdGRXMGdQU0J6YjNWeVkyVXViV0Y0YVcxMWJUdGNiaUFnZlZ4dUlDQnBaaWh6YjNWeVkyVXVaR1ZtWVhWc2RGWmhiSFZsS1NCN1hHNGdJQ0FnZEdGeVoyVjBMbVJsWm1GMWJIUWdQU0J6YjNWeVkyVXVaR1ZtWVhWc2RGWmhiSFZsTzF4dUlDQjlYRzVjYmlBZ2RtRnlJR3B6YjI1VFkyaGxiV0ZVZVhCbElEMGdkR2hwY3k1MGIwcHpiMjVUWTJobGJXRW9jMjkxY21ObEtUdGNiaUFnYVdZb2FuTnZibE5qYUdWdFlWUjVjR1VwSUh0Y2JpQWdJQ0IwWVhKblpYUWdQU0IwWVhKblpYUWdmSHdnZTMwN1hHNGdJQ0FnYVdZb2FuTnZibE5qYUdWdFlWUjVjR1V1ZEhsd1pTa2dlMXh1SUNBZ0lDQWdkR0Z5WjJWMExuUjVjR1VnUFNCcWMyOXVVMk5vWlcxaFZIbHdaUzUwZVhCbE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlocWMyOXVVMk5vWlcxaFZIbHdaUzVtYjNKdFlYUXBJSHRjYmlBZ0lDQWdJSFJoY21kbGRDNW1iM0p0WVhRZ1BTQnFjMjl1VTJOb1pXMWhWSGx3WlM1bWIzSnRZWFE3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1LR3B6YjI1VFkyaGxiV0ZVZVhCbExpUnlaV1lwSUh0Y2JpQWdJQ0FnSUhSaGNtZGxkQzV6WTJobGJXRWdQU0I3SkhKbFpqb2dhbk52YmxOamFHVnRZVlI1Y0dVdUpISmxabjA3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1LR3B6YjI1VFkyaGxiV0ZVZVhCbExtbDBaVzF6S1NCN1hHNGdJQ0FnSUNCMFlYSm5aWFF1YVhSbGJYTWdQU0JxYzI5dVUyTm9aVzFoVkhsd1pTNXBkR1Z0Y3p0Y2JpQWdJQ0I5WEc0Z0lIMWNibjA3WEc1Y2JsTjNZV2RuWlhKVGNHVmpRMjl1ZG1WeWRHVnlMbkJ5YjNSdmRIbHdaUzUwYjBwemIyNVRZMmhsYldFZ1BTQm1kVzVqZEdsdmJpaHpiM1Z5WTJVcElIdGNiaUFnYVdZb0lYTnZkWEpqWlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUFuYjJKcVpXTjBKenRjYmlBZ2ZWeHVJQ0IyWVhJZ1pHVjBaV04wWldSVWVYQmxJRDBnS0hOdmRYSmpaUzUwZVhCbElIeDhJSE52ZFhKalpTNWtZWFJoVkhsd1pTQjhmQ0J6YjNWeVkyVXVjbVZ6Y0c5dWMyVkRiR0Z6Y3lCOGZDQW5KeWs3WEc0Z0lIWmhjaUJzWTFSNWNHVWdQU0JrWlhSbFkzUmxaRlI1Y0dVdWRHOU1iM2RsY2tOaGMyVW9LVHRjYmlBZ2RtRnlJR1p2Y20xaGRDQTlJQ2h6YjNWeVkyVXVabTl5YldGMElIeDhJQ2NuS1M1MGIweHZkMlZ5UTJGelpTZ3BPMXh1WEc0Z0lHbG1LR3hqVkhsd1pTNXBibVJsZUU5bUtDZHNhWE4wV3ljcElEMDlQU0F3S1NCN1hHNGdJQ0FnZG1GeUlHbHVibVZ5Vkhsd1pTQTlJR1JsZEdWamRHVmtWSGx3WlM1emRXSnpkSEpwYm1jb05Td2daR1YwWldOMFpXUlVlWEJsTG14bGJtZDBhQ0F0SURFcE8xeHVJQ0FnSUhaaGNpQnFjMjl1Vkhsd1pTQTlJSFJvYVhNdWRHOUtjMjl1VTJOb1pXMWhLSHQwZVhCbE9pQnBibTVsY2xSNWNHVjlLVHRjYmlBZ0lDQnlaWFIxY200Z2UzUjVjR1U2SUNkaGNuSmhlU2NzSUdsMFpXMXpPaUJxYzI5dVZIbHdaWDA3WEc0Z0lIMWNiaUFnWld4elpTQnBaaWhzWTFSNWNHVWdQVDA5SUNkcGJuUW5JSHg4SUNoc1kxUjVjR1VnUFQwOUlDZHBiblJsWjJWeUp5QW1KaUJtYjNKdFlYUWdQVDA5SUNkcGJuUXpNaWNwS1Z4dUlDQWdJSHR5WlhSMWNtNGdlM1I1Y0dVNklDZHBiblJsWjJWeUp5d2dabTl5YldGME9pQW5hVzUwTXpJbmZUdDlYRzRnSUdWc2MyVWdhV1lvYkdOVWVYQmxJRDA5UFNBbmJHOXVaeWNnZkh3Z0tHeGpWSGx3WlNBOVBUMGdKMmx1ZEdWblpYSW5JQ1ltSUdadmNtMWhkQ0E5UFQwZ0oybHVkRFkwSnlrcFhHNGdJQ0FnZTNKbGRIVnliaUI3ZEhsd1pUb2dKMmx1ZEdWblpYSW5MQ0JtYjNKdFlYUTZJQ2RwYm5RMk5DZDlPMzFjYmlBZ1pXeHpaU0JwWmloc1kxUjVjR1VnUFQwOUlDZHBiblJsWjJWeUp5bGNiaUFnSUNCN2NtVjBkWEp1SUh0MGVYQmxPaUFuYVc1MFpXZGxjaWNzSUdadmNtMWhkRG9nSjJsdWREWTBKMzA3ZlZ4dUlDQmxiSE5sSUdsbUtHeGpWSGx3WlNBOVBUMGdKMlpzYjJGMEp5QjhmQ0FvYkdOVWVYQmxJRDA5UFNBbmJuVnRZbVZ5SnlBbUppQm1iM0p0WVhRZ1BUMDlJQ2RtYkc5aGRDY3BLVnh1SUNBZ0lIdHlaWFIxY200Z2UzUjVjR1U2SUNkdWRXMWlaWEluTENCbWIzSnRZWFE2SUNkbWJHOWhkQ2Q5TzMxY2JpQWdaV3h6WlNCcFppaHNZMVI1Y0dVZ1BUMDlJQ2RrYjNWaWJHVW5JSHg4SUNoc1kxUjVjR1VnUFQwOUlDZHVkVzFpWlhJbklDWW1JR1p2Y20xaGRDQTlQVDBnSjJSdmRXSnNaU2NwS1Z4dUlDQWdJSHR5WlhSMWNtNGdlM1I1Y0dVNklDZHVkVzFpWlhJbkxDQm1iM0p0WVhRNklDZGtiM1ZpYkdVbmZUdDlYRzRnSUdWc2MyVWdhV1lvS0d4alZIbHdaU0E5UFQwZ0ozTjBjbWx1WnljZ0ppWWdabTl5YldGMElEMDlQU0FuWkdGMFpTMTBhVzFsSnlrZ2ZId2dLR3hqVkhsd1pTQTlQVDBnSjJSaGRHVW5LU2xjYmlBZ0lDQjdjbVYwZFhKdUlIdDBlWEJsT2lBbmMzUnlhVzVuSnl3Z1ptOXliV0YwT2lBblpHRjBaUzEwYVcxbEozMDdmVnh1SUNCbGJITmxJR2xtS0d4alZIbHdaU0E5UFQwZ0ozTjBjbWx1WnljcFhHNGdJQ0FnZTNKbGRIVnliaUI3ZEhsd1pUb2dKM04wY21sdVp5ZDlPMzFjYmlBZ1pXeHpaU0JwWmloc1kxUjVjR1VnUFQwOUlDZG1hV3hsSnlsY2JpQWdJQ0I3Y21WMGRYSnVJSHQwZVhCbE9pQW5abWxzWlNkOU8zMWNiaUFnWld4elpTQnBaaWhzWTFSNWNHVWdQVDA5SUNkaWIyOXNaV0Z1SnlsY2JpQWdJQ0I3Y21WMGRYSnVJSHQwZVhCbE9pQW5ZbTl2YkdWaGJpZDlPMzFjYmlBZ1pXeHpaU0JwWmloc1kxUjVjR1VnUFQwOUlDZGhjbkpoZVNjZ2ZId2diR05VZVhCbElEMDlQU0FuYkdsemRDY3BJSHRjYmlBZ0lDQnBaaWh6YjNWeVkyVXVhWFJsYlhNcElIdGNiaUFnSUNBZ0lIWmhjaUJwZENBOUlIUm9hWE11ZEc5S2MyOXVVMk5vWlcxaEtITnZkWEpqWlM1cGRHVnRjeWs3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdlM1I1Y0dVNklDZGhjbkpoZVNjc0lHbDBaVzF6T2lCcGRIMDdYRzRnSUNBZ2ZWeHVJQ0FnSUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVYwZFhKdUlIdDBlWEJsT2lBbllYSnlZWGtuTENCcGRHVnRjem9nZTNSNWNHVTZJQ2R2WW1wbFkzUW5mWDA3WEc0Z0lDQWdmVnh1SUNCOVhHNGdJR1ZzYzJVZ2FXWW9jMjkxY21ObExpUnlaV1lwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdleVJ5WldZNklDY2pMMlJsWm1sdWFYUnBiMjV6THljZ0t5QjBhR2x6TG0xdlpHVnNUV0Z3VzNOdmRYSmpaUzRrY21WbVhTQjhmQ0J6YjNWeVkyVXVKSEpsWm4wN1hHNGdJSDFjYmlBZ1pXeHpaU0I3WEc0Z0lDQWdjbVYwZFhKdUlIc2tjbVZtT2lBbkl5OWtaV1pwYm1sMGFXOXVjeThuSUNzZ2RHaHBjeTV0YjJSbGJFMWhjRnR6YjNWeVkyVXVkSGx3WlYwZ2ZId2djMjkxY21ObExuUjVjR1Y5TzF4dUlDQjlYRzU5TzF4dVhHNVRkMkZuWjJWeVUzQmxZME52Ym5abGNuUmxjaTV3Y205MGIzUjVjR1V1Y21WemIzVnlZMlZNYVhOMGFXNW5JRDBnWm5WdVkzUnBiMjRvYjJKcUxDQnpkMkZuWjJWeUxDQmpZV3hzWW1GamF5a2dlMXh1SUNCMllYSWdhU3dnY0hKdlkyVnpjMlZrUTI5MWJuUWdQU0F3TzF4dUlDQjJZWElnYzJWc1ppQTlJSFJvYVhNN1hHNGdJSFpoY2lCbGVIQmxZM1JsWkVOdmRXNTBJRDBnYjJKcUxtRndhWE11YkdWdVozUm9PMXh1SUNCMllYSWdYM04zWVdkblpYSWdQU0J6ZDJGbloyVnlPMXh1WEc0Z0lHbG1LR1Y0Y0dWamRHVmtRMjkxYm5RZ1BUMDlJREFwSUh0Y2JpQWdJQ0IwYUdsekxtWnBibWx6YUNoallXeHNZbUZqYXl3Z2MzZGhaMmRsY2lrN1hHNGdJSDFjYmx4dUlDQm1iM0lvYVNBOUlEQTdJR2tnUENCbGVIQmxZM1JsWkVOdmRXNTBPeUJwS3lzcElIdGNiaUFnSUNCMllYSWdZWEJwSUQwZ2IySnFMbUZ3YVhOYmFWMDdYRzRnSUNBZ2RtRnlJSEJoZEdnZ1BTQmhjR2t1Y0dGMGFEdGNiaUFnSUNCMllYSWdZV0p6YjJ4MWRHVlFZWFJvSUQwZ2RHaHBjeTVuWlhSQlluTnZiSFYwWlZCaGRHZ29iMkpxTG5OM1lXZG5aWEpXWlhKemFXOXVMQ0IwYUdsekxtUnZZMHh2WTJGMGFXOXVMQ0J3WVhSb0tUdGNibHh1SUNBZ0lHbG1LR0Z3YVM1a1pYTmpjbWx3ZEdsdmJpa2dlMXh1SUNBZ0lDQWdjM2RoWjJkbGNpNTBZV2R6SUQwZ2MzZGhaMmRsY2k1MFlXZHpJSHg4SUZ0ZE8xeHVJQ0FnSUNBZ2MzZGhaMmRsY2k1MFlXZHpMbkIxYzJnb2UxeHVJQ0FnSUNBZ0lDQnVZVzFsSURvZ2RHaHBjeTVsZUhSeVlXTjBWR0ZuS0dGd2FTNXdZWFJvS1N4Y2JpQWdJQ0FnSUNBZ1pHVnpZM0pwY0hScGIyNGdPaUJoY0drdVpHVnpZM0pwY0hScGIyNGdmSHdnSnlkY2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnZG1GeUlHaDBkSEFnUFNCN1hHNGdJQ0FnSUNCMWNtdzZJR0ZpYzI5c2RYUmxVR0YwYUN4Y2JpQWdJQ0FnSUdobFlXUmxjbk02SUh0aFkyTmxjSFE2SUNkaGNIQnNhV05oZEdsdmJpOXFjMjl1SjMwc1hHNGdJQ0FnSUNCdmJqb2dlMzBzWEc0Z0lDQWdJQ0J0WlhSb2IyUTZJQ2RuWlhRblhHNGdJQ0FnZlR0Y2JpQWdJQ0JvZEhSd0xtOXVMbkpsYzNCdmJuTmxJRDBnWm5WdVkzUnBiMjRvWkdGMFlTa2dlMXh1SUNBZ0lDQWdjSEp2WTJWemMyVmtRMjkxYm5RZ0t6MGdNVHRjYmlBZ0lDQWdJR2xtS0dSaGRHRXViMkpxS1NCN1hHNGdJQ0FnSUNBZ0lITmxiR1l1WkdWamJHRnlZWFJwYjI0b1pHRjBZUzV2WW1vc0lGOXpkMkZuWjJWeUtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHbG1LSEJ5YjJObGMzTmxaRU52ZFc1MElEMDlQU0JsZUhCbFkzUmxaRU52ZFc1MEtTQjdYRzRnSUNBZ0lDQWdJSE5sYkdZdVptbHVhWE5vS0dOaGJHeGlZV05yTENCZmMzZGhaMmRsY2lrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JpQWdJQ0JvZEhSd0xtOXVMbVZ5Y205eUlEMGdablZ1WTNScGIyNG9aR0YwWVNrZ2UxeHVJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWhrWVhSaEtUdGNiaUFnSUNBZ0lIQnliMk5sYzNObFpFTnZkVzUwSUNzOUlERTdYRzRnSUNBZ0lDQnBaaWh3Y205alpYTnpaV1JEYjNWdWRDQTlQVDBnWlhod1pXTjBaV1JEYjNWdWRDa2dlMXh1SUNBZ0lDQWdJQ0J6Wld4bUxtWnBibWx6YUNoallXeHNZbUZqYXl3Z1gzTjNZV2RuWlhJcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNGdJQ0FnYm1WM0lGTjNZV2RuWlhKSWRIUndLQ2t1WlhobFkzVjBaU2hvZEhSd0tUdGNiaUFnZlZ4dWZUdGNibHh1VTNkaFoyZGxjbE53WldORGIyNTJaWEowWlhJdWNISnZkRzkwZVhCbExtZGxkRUZpYzI5c2RYUmxVR0YwYUNBOUlHWjFibU4wYVc5dUtIWmxjbk5wYjI0c0lHUnZZMHh2WTJGMGFXOXVMQ0J3WVhSb0tTQWdlMXh1SUNCcFppaDJaWEp6YVc5dUlEMDlQU0FuTVM0d0p5a2dlMXh1SUNBZ0lHbG1LR1J2WTB4dlkyRjBhVzl1TG1WdVpITlhhWFJvS0NjdWFuTnZiaWNwS1NCN1hHNGdJQ0FnSUNBdkx5Qm5aWFFnY205dmRDQndZWFJvWEc0Z0lDQWdJQ0IyWVhJZ2NHOXpJRDBnWkc5alRHOWpZWFJwYjI0dWJHRnpkRWx1WkdWNFQyWW9KeThuS1R0Y2JpQWdJQ0FnSUdsbUtIQnZjeUErSURBcElIdGNiaUFnSUNBZ0lDQWdaRzlqVEc5allYUnBiMjRnUFNCa2IyTk1iMk5oZEdsdmJpNXpkV0p6ZEhKcGJtY29NQ3dnY0c5ektUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQjJZWElnYkc5allYUnBiMjRnUFNCa2IyTk1iMk5oZEdsdmJqdGNiaUFnYVdZb2NHRjBhQzVwYm1SbGVFOW1LQ2RvZEhSd09pOHZKeWtnUFQwOUlEQWdmSHdnY0dGMGFDNXBibVJsZUU5bUtDZG9kSFJ3Y3pvdkx5Y3BJRDA5UFNBd0tTQjdYRzRnSUNBZ2JHOWpZWFJwYjI0Z1BTQndZWFJvTzF4dUlDQjlYRzRnSUdWc2MyVWdlMXh1SUNBZ0lHbG1LR1J2WTB4dlkyRjBhVzl1TG1WdVpITlhhWFJvS0Njdkp5a3BJSHRjYmlBZ0lDQWdJR3h2WTJGMGFXOXVJRDBnWkc5alRHOWpZWFJwYjI0dWMzVmljM1J5YVc1bktEQXNJR1J2WTB4dlkyRjBhVzl1TG14bGJtZDBhQ0F0SURFcE8xeHVJQ0FnSUgxY2JpQWdJQ0JzYjJOaGRHbHZiaUFyUFNCd1lYUm9PMXh1SUNCOVhHNGdJR3h2WTJGMGFXOXVJRDBnYkc5allYUnBiMjR1Y21Wd2JHRmpaU2duZTJadmNtMWhkSDBuTENBbmFuTnZiaWNwTzF4dUlDQnlaWFIxY200Z2JHOWpZWFJwYjI0N1hHNTlPMXh1WEc1VGQyRm5aMlZ5VTNCbFkwTnZiblpsY25SbGNpNXdjbTkwYjNSNWNHVXVjMlZqZFhKcGRIbEVaV1pwYm1sMGFXOXVjeUE5SUdaMWJtTjBhVzl1S0c5aWFpd2djM2RoWjJkbGNpa2dlMXh1SUNCcFppaHZZbW91WVhWMGFHOXlhWHBoZEdsdmJuTXBJSHRjYmlBZ0lDQjJZWElnYm1GdFpUdGNiaUFnSUNCbWIzSW9ibUZ0WlNCcGJpQnZZbW91WVhWMGFHOXlhWHBoZEdsdmJuTXBJSHRjYmlBZ0lDQWdJSFpoY2lCcGMxWmhiR2xrSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0IyWVhJZ2MyVmpkWEpwZEhsRVpXWnBibWwwYVc5dUlEMGdlMzA3WEc0Z0lDQWdJQ0IyWVhJZ1pHVm1hVzVwZEdsdmJpQTlJRzlpYWk1aGRYUm9iM0pwZW1GMGFXOXVjMXR1WVcxbFhUdGNiaUFnSUNBZ0lHbG1LR1JsWm1sdWFYUnBiMjR1ZEhsd1pTQTlQVDBnSjJGd2FVdGxlU2NwSUh0Y2JpQWdJQ0FnSUNBZ2MyVmpkWEpwZEhsRVpXWnBibWwwYVc5dUxuUjVjR1VnUFNBbllYQnBTMlY1Snp0Y2JpQWdJQ0FnSUNBZ2MyVmpkWEpwZEhsRVpXWnBibWwwYVc5dUxtbHVJRDBnWkdWbWFXNXBkR2x2Ymk1d1lYTnpRWE03WEc0Z0lDQWdJQ0FnSUhObFkzVnlhWFI1UkdWbWFXNXBkR2x2Ymk1dVlXMWxJRDBnWkdWbWFXNXBkR2x2Ymk1clpYbHVZVzFsSUh4OElHNWhiV1U3WEc0Z0lDQWdJQ0FnSUdselZtRnNhV1FnUFNCMGNuVmxPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdaV3h6WlNCcFppaGtaV1pwYm1sMGFXOXVMblI1Y0dVZ1BUMDlJQ2R2WVhWMGFESW5LU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmxlR2x6ZEdsdVoxTmpiM0JsY3lBOUlHUmxabWx1YVhScGIyNHVjMk52Y0dWeklIeDhJRnRkTzF4dUlDQWdJQ0FnSUNCMllYSWdjMk52Y0dWeklEMGdlMzA3WEc0Z0lDQWdJQ0FnSUhaaGNpQnBPMXh1SUNBZ0lDQWdJQ0JtYjNJb2FTQnBiaUJsZUdsemRHbHVaMU5qYjNCbGN5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhaaGNpQnpZMjl3WlNBOUlHVjRhWE4wYVc1blUyTnZjR1Z6VzJsZE8xeHVJQ0FnSUNBZ0lDQWdJSE5qYjNCbGMxdHpZMjl3WlM1elkyOXdaVjBnUFNCelkyOXdaUzVrWlhOamNtbHdkR2x2Ymp0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnpaV04xY21sMGVVUmxabWx1YVhScGIyNHVkSGx3WlNBOUlDZHZZWFYwYURJbk8xeHVJQ0FnSUNBZ0lDQnBaaWhwSUQ0Z01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUhObFkzVnlhWFI1UkdWbWFXNXBkR2x2Ymk1elkyOXdaWE1nUFNCelkyOXdaWE03SUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCcFppaGtaV1pwYm1sMGFXOXVMbWR5WVc1MFZIbHdaWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBaaWhrWldacGJtbDBhVzl1TG1keVlXNTBWSGx3WlhNdWFXMXdiR2xqYVhRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBiWEJzYVdOcGRDQTlJR1JsWm1sdWFYUnBiMjR1WjNKaGJuUlVlWEJsY3k1cGJYQnNhV05wZER0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE5sWTNWeWFYUjVSR1ZtYVc1cGRHbHZiaTVtYkc5M0lEMGdKMmx0Y0d4cFkybDBKenRjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxZM1Z5YVhSNVJHVm1hVzVwZEdsdmJpNWhkWFJvYjNKcGVtRjBhVzl1VlhKc0lEMGdhVzF3YkdsamFYUXViRzluYVc1RmJtUndiMmx1ZER0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2x6Vm1Gc2FXUWdQU0IwY25WbE8xeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCcFppaGtaV1pwYm1sMGFXOXVMbWR5WVc1MFZIbHdaWE11WVhWMGFHOXlhWHBoZEdsdmJsOWpiMlJsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlnaGMyVmpkWEpwZEhsRVpXWnBibWwwYVc5dUxtWnNiM2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1kyRnVibTkwSUhObGRDQnBaaUJtYkc5M0lHbHpJR0ZzY21WaFpIa2daR1ZtYVc1bFpGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZWFYwYUVOdlpHVWdQU0JrWldacGJtbDBhVzl1TG1keVlXNTBWSGx3WlhNdVlYVjBhRzl5YVhwaGRHbHZibDlqYjJSbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXTjFjbWwwZVVSbFptbHVhWFJwYjI0dVpteHZkeUE5SUNkaFkyTmxjM05EYjJSbEp6dGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2MyVmpkWEpwZEhsRVpXWnBibWwwYVc5dUxtRjFkR2h2Y21sNllYUnBiMjVWY213Z1BTQmhkWFJvUTI5a1pTNTBiMnRsYmxKbGNYVmxjM1JGYm1Sd2IybHVkQzUxY213N1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhObFkzVnlhWFI1UkdWbWFXNXBkR2x2Ymk1MGIydGxibFZ5YkNBOUlHRjFkR2hEYjJSbExuUnZhMlZ1Ulc1a2NHOXBiblF1ZFhKc08xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCcGMxWmhiR2xrSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdsbUtHbHpWbUZzYVdRcElIdGNiaUFnSUNBZ0lDQWdjM2RoWjJkbGNpNXpaV04xY21sMGVVUmxabWx1YVhScGIyNXpJRDBnYzNkaFoyZGxjaTV6WldOMWNtbDBlVVJsWm1sdWFYUnBiMjV6SUh4OElIdDlPMXh1SUNBZ0lDQWdJQ0J6ZDJGbloyVnlMbk5sWTNWeWFYUjVSR1ZtYVc1cGRHbHZibk5iYm1GdFpWMGdQU0J6WldOMWNtbDBlVVJsWm1sdWFYUnBiMjQ3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNTlPMXh1WEc1VGQyRm5aMlZ5VTNCbFkwTnZiblpsY25SbGNpNXdjbTkwYjNSNWNHVXVZWEJwU1c1bWJ5QTlJR1oxYm1OMGFXOXVLRzlpYWl3Z2MzZGhaMmRsY2lrZ2UxeHVJQ0F2THlCcGJtWnZJSE5sWTNScGIyNWNiaUFnYVdZb2IySnFMbWx1Wm04cElIdGNiaUFnSUNCMllYSWdhVzVtYnlBOUlHOWlhaTVwYm1adk8xeHVJQ0FnSUhOM1lXZG5aWEl1YVc1bWJ5QTlJSHQ5TzF4dVhHNGdJQ0FnYVdZb2FXNW1ieTVqYjI1MFlXTjBLU0I3WEc0Z0lDQWdJQ0J6ZDJGbloyVnlMbWx1Wm04dVkyOXVkR0ZqZENBOUlIdDlPMXh1SUNBZ0lDQWdjM2RoWjJkbGNpNXBibVp2TG1OdmJuUmhZM1F1WlcxaGFXd2dQU0JwYm1adkxtTnZiblJoWTNRN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtS0dsdVptOHVaR1Z6WTNKcGNIUnBiMjRwSUh0Y2JpQWdJQ0FnSUhOM1lXZG5aWEl1YVc1bWJ5NWtaWE5qY21sd2RHbHZiaUE5SUdsdVptOHVaR1Z6WTNKcGNIUnBiMjQ3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1LR2x1Wm04dWRHbDBiR1VwSUh0Y2JpQWdJQ0FnSUhOM1lXZG5aWEl1YVc1bWJ5NTBhWFJzWlNBOUlHbHVabTh1ZEdsMGJHVTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUtHbHVabTh1ZEdWeWJYTlBabE5sY25acFkyVlZjbXdwSUh0Y2JpQWdJQ0FnSUhOM1lXZG5aWEl1YVc1bWJ5NTBaWEp0YzA5bVUyVnlkbWxqWlNBOUlHbHVabTh1ZEdWeWJYTlBabE5sY25acFkyVlZjbXc3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1LR2x1Wm04dWJHbGpaVzV6WlNCOGZDQnBibVp2TG14cFkyVnVjMlZWY213cElIdGNiaUFnSUNBZ0lITjNZV2RuWlhJdWJHbGpaVzV6WlNBOUlIdDlPMXh1SUNBZ0lDQWdhV1lvYVc1bWJ5NXNhV05sYm5ObEtTQjdYRzRnSUNBZ0lDQWdJSE4zWVdkblpYSXViR2xqWlc1elpTNXVZVzFsSUQwZ2FXNW1ieTVzYVdObGJuTmxPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdhV1lvYVc1bWJ5NXNhV05sYm5ObFZYSnNLU0I3WEc0Z0lDQWdJQ0FnSUhOM1lXZG5aWEl1YkdsalpXNXpaUzUxY213Z1BTQnBibVp2TG14cFkyVnVjMlZWY213N1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzRnSUdWc2MyVWdlMXh1SUNBZ0lIUm9hWE11ZDJGeWJtbHVaM011Y0hWemFDZ25iV2x6YzJsdVp5QnBibVp2SUhObFkzUnBiMjRuS1R0Y2JpQWdmVnh1ZlR0Y2JseHVVM2RoWjJkbGNsTndaV05EYjI1MlpYSjBaWEl1Y0hKdmRHOTBlWEJsTG1acGJtbHphQ0E5SUdaMWJtTjBhVzl1SUNoallXeHNZbUZqYXl3Z2IySnFLU0I3WEc0Z0lHTmhiR3hpWVdOcktHOWlhaWs3WEc1OU95SXNJaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHVkbUZ5SUY4Z1BTQjdYRzRnSUdadmNrVmhZMmc2SUhKbGNYVnBjbVVvSjJ4dlpHRnphQzFqYjIxd1lYUXZZMjlzYkdWamRHbHZiaTltYjNKRllXTm9KeWtzWEc0Z0lHbHVaR1Y0VDJZNklISmxjWFZwY21Vb0oyeHZaR0Z6YUMxamIyMXdZWFF2WVhKeVlYa3ZhVzVrWlhoUFppY3BMRnh1SUNCcGMwRnljbUY1T2lCeVpYRjFhWEpsS0Nkc2IyUmhjMmd0WTI5dGNHRjBMMnhoYm1jdmFYTkJjbkpoZVNjcExGeHVJQ0JwYzFCc1lXbHVUMkpxWldOME9pQnlaWEYxYVhKbEtDZHNiMlJoYzJndFkyOXRjR0YwTDJ4aGJtY3ZhWE5RYkdGcGJrOWlhbVZqZENjcExGeHVJQ0JwYzFOMGNtbHVaem9nY21WeGRXbHlaU2duYkc5a1lYTm9MV052YlhCaGRDOXNZVzVuTDJselUzUnlhVzVuSnlrc1hHNGdJR2x6Vlc1a1pXWnBibVZrT2lCeVpYRjFhWEpsS0Nkc2IyUmhjMmd0WTI5dGNHRjBMMnhoYm1jdmFYTlZibVJsWm1sdVpXUW5LU3hjYmlBZ2EyVjVjem9nY21WeGRXbHlaU2duYkc5a1lYTm9MV052YlhCaGRDOXZZbXBsWTNRdmEyVjVjeWNwTEZ4dUlDQnRZWEE2SUhKbGNYVnBjbVVvSjJ4dlpHRnphQzFqYjIxd1lYUXZZMjlzYkdWamRHbHZiaTl0WVhBbktWeHVmVHRjYm5aaGNpQm9aV3h3WlhKeklEMGdjbVZ4ZFdseVpTZ25MaTR2YUdWc2NHVnljeWNwTzF4dVhHNWNiaThxS2x4dUlDb2dZV3hzYjNkeklHOTJaWEp5YVdSbElHOW1JSFJvWlNCa1pXWmhkV3gwSUhaaGJIVmxJR0poYzJWa0lHOXVJSFJvWlNCd1lYSmhiV1YwWlhJZ1ltVnBibWRjYmlBcUlITjFjSEJzYVdWa1hHNGdLaW92WEc1MllYSWdZWEJ3YkhsUVlYSmhiV1YwWlhKTllXTnlieUE5SUdaMWJtTjBhVzl1SUNodmNHVnlZWFJwYjI0c0lIQmhjbUZ0WlhSbGNpa2dlMXh1SUNBdkx5QlVUMFJQSUhSb1pTQnlaV1psY21WdVkyVWdkRzhnYjNCbGNtRjBhVzl1TG1Gd2FTQnBjeUJ1YjNRZ1lYWmhhV3hoWW14bFhHNGdJR2xtSUNodmNHVnlZWFJwYjI0dVlYQnBJQ1ltSUc5d1pYSmhkR2x2Ymk1aGNHa3VjR0Z5WVcxbGRHVnlUV0ZqY204cElIdGNiaUFnSUNCeVpYUjFjbTRnYjNCbGNtRjBhVzl1TG1Gd2FTNXdZWEpoYldWMFpYSk5ZV055YnlodmNHVnlZWFJwYjI0c0lIQmhjbUZ0WlhSbGNpazdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdjbVYwZFhKdUlIQmhjbUZ0WlhSbGNpNWtaV1poZFd4MFZtRnNkV1U3WEc0Z0lIMWNibjA3WEc1Y2JpOHFLbHh1SUNvZ1lXeHNiM2R6SUc5MlpYSnlhV1JwYm1jZ2RHaGxJR1JsWm1GMWJIUWdkbUZzZFdVZ2IyWWdZVzRnYlc5a1pXd2djSEp2Y0dWeWRIbGNiaUFxS2k5Y2JuWmhjaUJoY0hCc2VVMXZaR1ZzVUhKdmNHVnlkSGxOWVdOeWJ5QTlJR1oxYm1OMGFXOXVJQ2h0YjJSbGJDd2djSEp2Y0dWeWRIa3BJSHRjYmlBZ0x5OGdWRTlFVHlCMGFHVWdjbVZtWlhKbGJtTmxJSFJ2SUcxdlpHVnNMbUZ3YVNCcGN5QnViM1FnWVhaaGFXeGhZbXhsWEc0Z0lHbG1JQ2h0YjJSbGJDNWhjR2tnSmlZZ2JXOWtaV3d1WVhCcExtMXZaR1ZzVUhKdmNHVnlkSGxOWVdOeWJ5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCdGIyUmxiQzVoY0drdWJXOWtaV3hRY205d1pYSjBlVTFoWTNKdktHMXZaR1ZzTENCd2NtOXdaWEowZVNrN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2NtVjBkWEp1SUhCeWIzQmxjblI1TG1SbFptRjFiSFE3WEc0Z0lIMWNibjA3WEc1Y2JuWmhjaUJOYjJSbGJDQTlJRzF2WkhWc1pTNWxlSEJ2Y25SeklEMGdablZ1WTNScGIyNGdLRzVoYldVc0lHUmxabWx1YVhScGIyNHNJRzF2WkdWc2N5a2dlMXh1SUNCMGFHbHpMbVJsWm1sdWFYUnBiMjRnUFNCa1pXWnBibWwwYVc5dUlIeDhJSHQ5TzF4dUlDQjBhR2x6TG1selFYSnlZWGtnUFNCa1pXWnBibWwwYVc5dUxuUjVjR1VnUFQwOUlDZGhjbkpoZVNjN1hHNGdJSFJvYVhNdWJXOWtaV3h6SUQwZ2JXOWtaV3h6SUh4OElIdDlPMXh1SUNCMGFHbHpMbTVoYldVZ1BTQnVZVzFsSUh4OElDZEpibXhwYm1VZ1RXOWtaV3duTzF4dVhHNGdJSEpsZEhWeWJpQjBhR2x6TzF4dWZUdGNibHh1ZG1GeUlITmphR1Z0WVZSdlNGUk5UQ0E5SUdaMWJtTjBhVzl1SUNodVlXMWxMQ0J6WTJobGJXRXNJRzF2WkdWc2N5a2dlMXh1SUNCMllYSWdjM1J5YjI1blQzQmxiaUE5SUNjOGMzQmhiaUJqYkdGemN6MWNJbk4wY205dVoxd2lQaWM3WEc0Z0lIWmhjaUJ6ZEhKdmJtZERiRzl6WlNBOUlDYzhMM053WVc0K0p6dGNiaUFnZG1GeUlISmxabVZ5Wlc1alpYTWdQU0I3ZlR0Y2JpQWdkbUZ5SUhObFpXNU5iMlJsYkhNZ1BTQmJYVHRjYmlBZ2RtRnlJR2x1YkdsdVpVMXZaR1ZzY3lBOUlEQTdYRzRnSUhaaGNpQmhaR1JTWldabGNtVnVZMlVnUFNCbWRXNWpkR2x2YmlBb2MyTm9aVzFoTENCdVlXMWxMQ0J6YTJsd1VtVm1LU0I3WEc0Z0lDQWdkbUZ5SUcxdlpHVnNUbUZ0WlNBOUlHNWhiV1U3WEc0Z0lDQWdkbUZ5SUcxdlpHVnNPMXh1WEc0Z0lDQWdhV1lnS0hOamFHVnRZUzRrY21WbUtTQjdYRzRnSUNBZ0lDQnRiMlJsYkU1aGJXVWdQU0JvWld4d1pYSnpMbk5wYlhCc1pWSmxaaWh6WTJobGJXRXVKSEpsWmlrN1hHNGdJQ0FnSUNCdGIyUmxiQ0E5SUcxdlpHVnNjMXR0YjJSbGJFNWhiV1ZkTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvWHk1cGMxVnVaR1ZtYVc1bFpDaHVZVzFsS1NrZ2UxeHVJQ0FnSUNBZ2JXOWtaV3hPWVcxbElEMGdKMGx1YkdsdVpTQk5iMlJsYkNBbklDc2dLQ3NyYVc1c2FXNWxUVzlrWld4ektUdGNiaUFnSUNBZ0lHMXZaR1ZzSUQwZ2JtVjNJRTF2WkdWc0tHMXZaR1ZzVG1GdFpTd2djMk5vWlcxaExDQnRiMlJsYkhNcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaHphMmx3VW1WbUlDRTlQU0IwY25WbEtTQjdYRzRnSUNBZ0lDQnlaV1psY21WdVkyVnpXMjF2WkdWc1RtRnRaVjBnUFNCZkxtbHpWVzVrWldacGJtVmtLRzF2WkdWc0tTQS9JSHQ5SURvZ2JXOWtaV3d1WkdWbWFXNXBkR2x2Ymp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdiVzlrWld4T1lXMWxPMXh1SUNCOU8xeHVJQ0IyWVhJZ2NISnBiV2wwYVhabFZHOUlWRTFNSUQwZ1puVnVZM1JwYjI0Z0tITmphR1Z0WVNrZ2UxeHVJQ0FnSUhaaGNpQm9kRzFzSUQwZ0p6eHpjR0Z1SUdOc1lYTnpQVndpY0hKdmNGUjVjR1ZjSWo0bk8xeHVJQ0FnSUhaaGNpQjBlWEJsSUQwZ2MyTm9aVzFoTG5SNWNHVWdmSHdnSjI5aWFtVmpkQ2M3WEc1Y2JpQWdJQ0JwWmlBb2MyTm9aVzFoTGlSeVpXWXBJSHRjYmlBZ0lDQWdJR2gwYld3Z0t6MGdZV1JrVW1WbVpYSmxibU5sS0hOamFHVnRZU3dnYUdWc2NHVnljeTV6YVcxd2JHVlNaV1lvYzJOb1pXMWhMaVJ5WldZcEtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1VnUFQwOUlDZHZZbXBsWTNRbktTQjdYRzRnSUNBZ0lDQnBaaUFvSVY4dWFYTlZibVJsWm1sdVpXUW9jMk5vWlcxaExuQnliM0JsY25ScFpYTXBLU0I3WEc0Z0lDQWdJQ0FnSUdoMGJXd2dLejBnWVdSa1VtVm1aWEpsYm1ObEtITmphR1Z0WVNrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCb2RHMXNJQ3M5SUNkdlltcGxZM1FuTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnWld4elpTQnBaaUFvZEhsd1pTQTlQVDBnSjJGeWNtRjVKeWtnZTF4dUlDQWdJQ0FnYUhSdGJDQXJQU0FuUVhKeVlYbGJKenRjYmx4dUlDQWdJQ0FnYVdZZ0tGOHVhWE5CY25KaGVTaHpZMmhsYldFdWFYUmxiWE1wS1NCN1hHNGdJQ0FnSUNBZ0lHaDBiV3dnS3owZ1h5NXRZWEFvYzJOb1pXMWhMbWwwWlcxekxDQmhaR1JTWldabGNtVnVZMlVwTG1wdmFXNG9KeXduS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1h5NXBjMUJzWVdsdVQySnFaV04wS0hOamFHVnRZUzVwZEdWdGN5a3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tGOHVhWE5WYm1SbFptbHVaV1FvYzJOb1pXMWhMbWwwWlcxekxpUnlaV1lwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NGZkxtbHpWVzVrWldacGJtVmtLSE5qYUdWdFlTNXBkR1Z0Y3k1MGVYQmxLU0FtSmlCZkxtbHVaR1Y0VDJZb1d5ZGhjbkpoZVNjc0lDZHZZbXBsWTNRblhTd2djMk5vWlcxaExtbDBaVzF6TG5SNWNHVXBJRDA5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FIUnRiQ0FyUFNCelkyaGxiV0V1YVhSbGJYTXVkSGx3WlR0Y2JpQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYUhSdGJDQXJQU0JoWkdSU1pXWmxjbVZ1WTJVb2MyTm9aVzFoTG1sMFpXMXpLVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdhSFJ0YkNBclBTQmhaR1JTWldabGNtVnVZMlVvYzJOb1pXMWhMbWwwWlcxekxDQm9aV3h3WlhKekxuTnBiWEJzWlZKbFppaHpZMmhsYldFdWFYUmxiWE11SkhKbFppa3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JvWld4d1pYSnpMbXh2WnlnblFYSnlZWGtnZEhsd1pWeGNKM01nWEZ3bmFYUmxiWE5jWENjZ2MyTm9aVzFoSUdseklHNXZkQ0JoYmlCaGNuSmhlU0J2Y2lCaGJpQnZZbXBsWTNRc0lHTmhibTV2ZENCd2NtOWpaWE56SnlrN1hHNGdJQ0FnSUNBZ0lHaDBiV3dnS3owZ0oyOWlhbVZqZENjN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHaDBiV3dnS3owZ0oxMG5PMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCb2RHMXNJQ3M5SUhOamFHVnRZUzUwZVhCbE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdoMGJXd2dLejBnSnp3dmMzQmhiajRuTzF4dVhHNGdJQ0FnY21WMGRYSnVJR2gwYld3N1hHNGdJSDA3WEc0Z0lIWmhjaUJ3Y21sdGFYUnBkbVZVYjA5d2RHbHZibk5JVkUxTUlEMGdablZ1WTNScGIyNGdLSE5qYUdWdFlTd2dhSFJ0YkNrZ2UxeHVJQ0FnSUhaaGNpQnZjSFJwYjI1eklEMGdKeWM3WEc0Z0lDQWdkbUZ5SUhSNWNHVWdQU0J6WTJobGJXRXVkSGx3WlNCOGZDQW5iMkpxWldOMEp6dGNiaUFnSUNCMllYSWdhWE5CY25KaGVTQTlJSFI1Y0dVZ1BUMDlJQ2RoY25KaGVTYzdYRzVjYmlBZ0lDQnBaaUFvYVhOQmNuSmhlU2tnZTF4dUlDQWdJQ0FnYVdZZ0tGOHVhWE5RYkdGcGJrOWlhbVZqZENoelkyaGxiV0V1YVhSbGJYTXBJQ1ltSUNGZkxtbHpWVzVrWldacGJtVmtLSE5qYUdWdFlTNXBkR1Z0Y3k1MGVYQmxLU2tnZTF4dUlDQWdJQ0FnSUNCMGVYQmxJRDBnYzJOb1pXMWhMbWwwWlcxekxuUjVjR1U3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0IwZVhCbElEMGdKMjlpYW1WamRDYzdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSE5qYUdWdFlTNWtaV1poZFd4MEtTQjdYRzRnSUNBZ0lDQnZjSFJwYjI1eklDczlJR2hsYkhCbGNuTXViM0IwYVc5dVNIUnRiQ2duUkdWbVlYVnNkQ2NzSUhOamFHVnRZUzVrWldaaGRXeDBLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnpkMmwwWTJnZ0tIUjVjR1VwSUh0Y2JpQWdJQ0JqWVhObElDZHpkSEpwYm1jbk9seHVJQ0FnSUNBZ2FXWWdLSE5qYUdWdFlTNXRhVzVNWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJQ0FnYjNCMGFXOXVjeUFyUFNCb1pXeHdaWEp6TG05d2RHbHZia2gwYld3b0owMXBiaTRnVEdWdVozUm9KeXdnYzJOb1pXMWhMbTFwYmt4bGJtZDBhQ2s3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdsbUlDaHpZMmhsYldFdWJXRjRUR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQWdJRzl3ZEdsdmJuTWdLejBnYUdWc2NHVnljeTV2Y0hScGIyNUlkRzFzS0NkTllYZ3VJRXhsYm1kMGFDY3NJSE5qYUdWdFlTNXRZWGhNWlc1bmRHZ3BPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JwWmlBb2MyTm9aVzFoTG5CaGRIUmxjbTRwSUh0Y2JpQWdJQ0FnSUNBZ2IzQjBhVzl1Y3lBclBTQm9aV3h3WlhKekxtOXdkR2x2YmtoMGJXd29KMUpsWnk0Z1JYaHdMaWNzSUhOamFHVnRZUzV3WVhSMFpYSnVLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUdOaGMyVWdKMmx1ZEdWblpYSW5PbHh1SUNBZ0lHTmhjMlVnSjI1MWJXSmxjaWM2WEc0Z0lDQWdJQ0JwWmlBb2MyTm9aVzFoTG0xcGJtbHRkVzBwSUh0Y2JpQWdJQ0FnSUNBZ2IzQjBhVzl1Y3lBclBTQm9aV3h3WlhKekxtOXdkR2x2YmtoMGJXd29KMDFwYmk0Z1ZtRnNkV1VuTENCelkyaGxiV0V1YldsdWFXMTFiU2s3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdsbUlDaHpZMmhsYldFdVpYaGpiSFZ6YVhabFRXbHVhVzExYlNrZ2UxeHVJQ0FnSUNBZ0lDQnZjSFJwYjI1eklDczlJR2hsYkhCbGNuTXViM0IwYVc5dVNIUnRiQ2duUlhoamJIVnphWFpsSUUxcGJpNG5MQ0FuZEhKMVpTY3BPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JwWmlBb2MyTm9aVzFoTG0xaGVHbHRkVzBwSUh0Y2JpQWdJQ0FnSUNBZ2IzQjBhVzl1Y3lBclBTQm9aV3h3WlhKekxtOXdkR2x2YmtoMGJXd29KMDFoZUM0Z1ZtRnNkV1VuTENCelkyaGxiV0V1YldGNGFXMTFiU2s3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdsbUlDaHpZMmhsYldFdVpYaGpiSFZ6YVhabFRXRjRhVzExYlNrZ2UxeHVJQ0FnSUNBZ0lDQnZjSFJwYjI1eklDczlJR2hsYkhCbGNuTXViM0IwYVc5dVNIUnRiQ2duUlhoamJIVnphWFpsSUUxaGVDNG5MQ0FuZEhKMVpTY3BPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JwWmlBb2MyTm9aVzFoTG0xMWJIUnBjR3hsVDJZcElIdGNiaUFnSUNBZ0lDQWdiM0IwYVc5dWN5QXJQU0JvWld4d1pYSnpMbTl3ZEdsdmJraDBiV3dvSjAxMWJIUnBjR3hsSUU5bUp5d2djMk5vWlcxaExtMTFiSFJwY0d4bFQyWXBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9hWE5CY25KaGVTa2dlMXh1SUNBZ0lDQWdhV1lnS0hOamFHVnRZUzV0YVc1SmRHVnRjeWtnZTF4dUlDQWdJQ0FnSUNCdmNIUnBiMjV6SUNzOUlHaGxiSEJsY25NdWIzQjBhVzl1U0hSdGJDZ25UV2x1TGlCSmRHVnRjeWNzSUhOamFHVnRZUzV0YVc1SmRHVnRjeWs3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdsbUlDaHpZMmhsYldFdWJXRjRTWFJsYlhNcElIdGNiaUFnSUNBZ0lDQWdiM0IwYVc5dWN5QXJQU0JvWld4d1pYSnpMbTl3ZEdsdmJraDBiV3dvSjAxaGVDNGdTWFJsYlhNbkxDQnpZMmhsYldFdWJXRjRTWFJsYlhNcE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvYzJOb1pXMWhMblZ1YVhGMVpVbDBaVzF6S1NCN1hHNGdJQ0FnSUNBZ0lHOXdkR2x2Ym5NZ0t6MGdhR1ZzY0dWeWN5NXZjSFJwYjI1SWRHMXNLQ2RWYm1seGRXVWdTWFJsYlhNbkxDQW5kSEoxWlNjcE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvYzJOb1pXMWhMbU52Ykd4bFkzUnBiMjVHYjNKdFlYUXBJSHRjYmlBZ0lDQWdJQ0FnYjNCMGFXOXVjeUFyUFNCb1pXeHdaWEp6TG05d2RHbHZia2gwYld3b0owTnZiR3d1SUVadmNtMWhkQ2NzSUhOamFHVnRZUzVqYjJ4c1pXTjBhVzl1Um05eWJXRjBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvWHk1cGMxVnVaR1ZtYVc1bFpDaHpZMmhsYldFdWFYUmxiWE1wS1NCN1hHNGdJQ0FnSUNCcFppQW9YeTVwYzBGeWNtRjVLSE5qYUdWdFlTNWxiblZ0S1NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWlc1MWJWTjBjbWx1Wnp0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvZEhsd1pTQTlQVDBnSjI1MWJXSmxjaWNnZkh3Z2RIbHdaU0E5UFQwZ0oybHVkR1ZuWlhJbktTQjdYRzRnSUNBZ0lDQWdJQ0FnWlc1MWJWTjBjbWx1WnlBOUlITmphR1Z0WVM1bGJuVnRMbXB2YVc0b0p5d2dKeWs3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ1pXNTFiVk4wY21sdVp5QTlJQ2RjSWljZ0t5QnpZMmhsYldFdVpXNTFiUzVxYjJsdUtDZGNJaXdnWENJbktTQXJJQ2RjSWljN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J2Y0hScGIyNXpJQ3M5SUdobGJIQmxjbk11YjNCMGFXOXVTSFJ0YkNnblJXNTFiU2NzSUdWdWRXMVRkSEpwYm1jcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaHZjSFJwYjI1ekxteGxibWQwYUNBK0lEQXBJSHRjYmlBZ0lDQWdJR2gwYld3Z1BTQW5QSE53WVc0Z1kyeGhjM005WENKd2NtOXdWM0poY0Z3aVBpY2dLeUJvZEcxc0lDc2dKengwWVdKc1pTQmpiR0Z6Y3oxY0ltOXdkR2x2Ym5OWGNtRndjR1Z5WENJK1BIUnlQangwYUNCamIyeHpjR0Z1UFZ3aU1sd2lQaWNnS3lCMGVYQmxJQ3NnSnp3dmRHZytQQzkwY2o0bklDc2diM0IwYVc5dWN5QXJJQ2M4TDNSaFlteGxQand2YzNCaGJqNG5PMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCb2RHMXNPMXh1SUNCOU8xeHVJQ0IyWVhJZ2NISnZZMlZ6YzAxdlpHVnNJRDBnWm5WdVkzUnBiMjRnS0hOamFHVnRZU3dnYm1GdFpTa2dlMXh1SUNBZ0lIWmhjaUIwZVhCbElEMGdjMk5vWlcxaExuUjVjR1VnZkh3Z0oyOWlhbVZqZENjN1hHNGdJQ0FnZG1GeUlHbHpRWEp5WVhrZ1BTQnpZMmhsYldFdWRIbHdaU0E5UFQwZ0oyRnljbUY1Snp0Y2JpQWdJQ0IyWVhJZ2FIUnRiQ0E5SUhOMGNtOXVaMDl3Wlc0Z0t5QnVZVzFsSUNzZ0p5QW5JQ3NnS0dselFYSnlZWGtnUHlBbld5Y2dPaUFuZXljcElDc2djM1J5YjI1blEyeHZjMlU3WEc1Y2JpQWdJQ0JwWmlBb2JtRnRaU2tnZTF4dUlDQWdJQ0FnYzJWbGJrMXZaR1ZzY3k1d2RYTm9LRzVoYldVcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaHBjMEZ5Y21GNUtTQjdYRzRnSUNBZ0lDQnBaaUFvWHk1cGMwRnljbUY1S0hOamFHVnRZUzVwZEdWdGN5a3BJSHRjYmlBZ0lDQWdJQ0FnYUhSdGJDQXJQU0FuUEdScGRqNG5JQ3NnWHk1dFlYQW9jMk5vWlcxaExtbDBaVzF6TENCbWRXNWpkR2x2YmlBb2FYUmxiU2tnZTF4dUlDQWdJQ0FnSUNBZ0lIWmhjaUIwZVhCbElEMGdhWFJsYlM1MGVYQmxJSHg4SUNkdlltcGxZM1FuTzF4dVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0Y4dWFYTlZibVJsWm1sdVpXUW9hWFJsYlM0a2NtVm1LU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0Y4dWFXNWtaWGhQWmloYkoyRnljbUY1Snl3Z0oyOWlhbVZqZENkZExDQjBlWEJsS1NBK0lDMHhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGVYQmxJRDA5UFNBbmIySnFaV04wSnlBbUppQmZMbWx6Vlc1a1pXWnBibVZrS0dsMFpXMHVjSEp2Y0dWeWRHbGxjeWtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnSjI5aWFtVmpkQ2M3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHRmtaRkpsWm1WeVpXNWpaU2hwZEdWdEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIQnlhVzFwZEdsMlpWUnZUM0IwYVc5dWMwaFVUVXdvYVhSbGJTd2dkSGx3WlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmhaR1JTWldabGNtVnVZMlVvYVhSbGJTd2dhR1ZzY0dWeWN5NXphVzF3YkdWU1pXWW9hWFJsYlM0a2NtVm1LU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlLUzVxYjJsdUtDY3NQQzlrYVhZK1BHUnBkajRuS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1h5NXBjMUJzWVdsdVQySnFaV04wS0hOamFHVnRZUzVwZEdWdGN5a3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tGOHVhWE5WYm1SbFptbHVaV1FvYzJOb1pXMWhMbWwwWlcxekxpUnlaV1lwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0Y4dWFXNWtaWGhQWmloYkoyRnljbUY1Snl3Z0oyOWlhbVZqZENkZExDQnpZMmhsYldFdWFYUmxiWE11ZEhsd1pTQjhmQ0FuYjJKcVpXTjBKeWtnUGlBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ2hmTG1selZXNWtaV1pwYm1Wa0tITmphR1Z0WVM1cGRHVnRjeTUwZVhCbEtTQjhmQ0J6WTJobGJXRXVhWFJsYlhNdWRIbHdaU0E5UFQwZ0oyOWlhbVZqZENjcElDWW1JRjh1YVhOVmJtUmxabWx1WldRb2MyTm9aVzFoTG1sMFpXMXpMbkJ5YjNCbGNuUnBaWE1wS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdoMGJXd2dLejBnSnp4a2FYWStiMkpxWldOMFBDOWthWFkrSnp0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHaDBiV3dnS3owZ0p6eGthWFkrSnlBcklHRmtaRkpsWm1WeVpXNWpaU2h6WTJobGJXRXVhWFJsYlhNcElDc2dKend2WkdsMlBpYzdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdoMGJXd2dLejBnSnp4a2FYWStKeUFySUhCeWFXMXBkR2wyWlZSdlQzQjBhVzl1YzBoVVRVd29jMk5vWlcxaExtbDBaVzF6TENCelkyaGxiV0V1YVhSbGJYTXVkSGx3WlNrZ0t5QW5QQzlrYVhZK0p6dGNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FIUnRiQ0FyUFNBblBHUnBkajRuSUNzZ1lXUmtVbVZtWlhKbGJtTmxLSE5qYUdWdFlTNXBkR1Z0Y3l3Z2FHVnNjR1Z5Y3k1emFXMXdiR1ZTWldZb2MyTm9aVzFoTG1sMFpXMXpMaVJ5WldZcEtTQXJJQ2M4TDJScGRqNG5PMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JvWld4d1pYSnpMbXh2WnlnblFYSnlZWGtnZEhsd1pWeGNKM01nWEZ3bmFYUmxiWE5jWENjZ2NISnZjR1Z5ZEhrZ2FYTWdibTkwSUdGdUlHRnljbUY1SUc5eUlHRnVJRzlpYW1WamRDd2dZMkZ1Ym05MElIQnliMk5sYzNNbktUdGNiaUFnSUNBZ0lDQWdhSFJ0YkNBclBTQW5QR1JwZGo1dlltcGxZM1E4TDJScGRqNG5PMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCcFppQW9jMk5vWlcxaExpUnlaV1lwSUh0Y2JpQWdJQ0FnSUNBZ2FIUnRiQ0FyUFNBblBHUnBkajRuSUNzZ1lXUmtVbVZtWlhKbGJtTmxLSE5qYUdWdFlTd2dibUZ0WlNrZ0t5QW5QQzlrYVhZK0p6dGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9kSGx3WlNBOVBUMGdKMjlpYW1WamRDY3BJSHRjYmlBZ0lDQWdJQ0FnYUhSdGJDQXJQU0FuUEdScGRqNG5PMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaGZMbWx6VUd4aGFXNVBZbXBsWTNRb2MyTm9aVzFoTG5CeWIzQmxjblJwWlhNcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnYUhSdGJDQXJQU0JmTG0xaGNDaHpZMmhsYldFdWNISnZjR1Z5ZEdsbGN5d2dablZ1WTNScGIyNGdLSEJ5YjNCbGNuUjVMQ0J1WVcxbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjbVZ4ZFdseVpXUWdQU0JmTG1sdVpHVjRUMllvYzJOb1pXMWhMbkpsY1hWcGNtVmtJSHg4SUZ0ZExDQnVZVzFsS1NBK0lDMHhPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR2gwYld3Z1BTQW5QSE53WVc0Z1kyeGhjM005WENKd2NtOXdUbUZ0WlNBbklDc2djbVZ4ZFdseVpXUWdLeUFuWENJK0p5QXJJRzVoYldVZ0t5QW5QQzl6Y0dGdVBpQW9KenRjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdhSFJ0YkNBclBTQndjbWx0YVhScGRtVlViMGhVVFV3b2NISnZjR1Z5ZEhrcE8xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWEpsY1hWcGNtVmtLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR2gwYld3Z0t6MGdKeXdnUEhOd1lXNGdZMnhoYzNNOVhDSndjbTl3VDNCMFMyVjVYQ0krYjNCMGFXOXVZV3c4TDNOd1lXNCtKenRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FIUnRiQ0FyUFNBbktTYzdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doWHk1cGMxVnVaR1ZtYVc1bFpDaHdjbTl3WlhKMGVTNWtaWE5qY21sd2RHbHZiaWtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYUhSdGJDQXJQU0FuT2lBbklDc2djSEp2Y0dWeWRIa3VaR1Z6WTNKcGNIUnBiMjQ3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h3Y205d1pYSjBlUzVsYm5WdEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHaDBiV3dnS3owZ0p5QTlJRHh6Y0dGdUlHTnNZWE56UFZ3aWNISnZjRlpoYkhOY0lqNWJYRnduSnlBcklIQnliM0JsY25SNUxtVnVkVzB1YW05cGJpZ25YRnduSUc5eUlGeGNKeWNwSUNzZ0oxeGNKMTA4TDNOd1lXNCtKenRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhCeWFXMXBkR2wyWlZSdlQzQjBhVzl1YzBoVVRVd29jSEp2Y0dWeWRIa3NJR2gwYld3cE8xeHVJQ0FnSUNBZ0lDQWdJSDBwTG1wdmFXNG9KeXc4TDJScGRqNDhaR2wyUGljcE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYUhSdGJDQXJQU0FuUEM5a2FYWStKenRjYmlBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJR2gwYld3Z1BTQW5QR1JwZGo0bklDc2djSEpwYldsMGFYWmxWRzlQY0hScGIyNXpTRlJOVENoelkyaGxiV0VzSUhSNWNHVXBJQ3NnSnp3dlpHbDJQaWM3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjbVYwZFhKdUlHaDBiV3dnS3lCemRISnZibWRQY0dWdUlDc2dLR2x6UVhKeVlYa2dQeUFuWFNjZ09pQW5mU2NwSUNzZ2MzUnliMjVuUTJ4dmMyVTdYRzRnSUgwN1hHNWNiaUFnWEc0Z0lDOHZJRWRsYm1WeVlYUmxJR04xY25KbGJuUWdTRlJOVEZ4dUlDQjJZWElnYUhSdGJDQTlJSEJ5YjJObGMzTk5iMlJsYkNoelkyaGxiV0VzSUc1aGJXVXBPMXh1SUNCY2JpQWdMeThnUjJWdVpYSmhkR1VnY21WbVpYSmxibU5sY3lCSVZFMU1YRzRnSUhkb2FXeGxJQ2hmTG10bGVYTW9jbVZtWlhKbGJtTmxjeWt1YkdWdVozUm9JRDRnTUNrZ2UxeHVJQ0FnSUY4dVptOXlSV0ZqYUNoeVpXWmxjbVZ1WTJWekxDQm1kVzVqZEdsdmJpQW9jMk5vWlcxaExDQnVZVzFsS1NCN1hHNGdJQ0FnSUNCMllYSWdjMlZsYmsxdlpHVnNJRDBnWHk1cGJtUmxlRTltS0hObFpXNU5iMlJsYkhNc0lHNWhiV1VwSUQ0Z0xURTdYRzVjYmlBZ0lDQWdJR1JsYkdWMFpTQnlaV1psY21WdVkyVnpXMjVoYldWZE8xeHVYRzRnSUNBZ0lDQnBaaUFvSVhObFpXNU5iMlJsYkNrZ2UxeHVJQ0FnSUNBZ0lDQnpaV1Z1VFc5a1pXeHpMbkIxYzJnb2JtRnRaU2s3WEc1Y2JpQWdJQ0FnSUNBZ2FIUnRiQ0FyUFNBblBHSnlJQzgrSnlBcklIQnliMk5sYzNOTmIyUmxiQ2h6WTJobGJXRXNJRzVoYldVcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwcE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlHaDBiV3c3WEc1OU8xeHVYRzUyWVhJZ2MyTm9aVzFoVkc5S1UwOU9JRDBnWm5WdVkzUnBiMjRnS0hOamFHVnRZU3dnYlc5a1pXeHpMQ0J0YjJSbGJITlViMGxuYm05eVpTa2dlMXh1SUNCMllYSWdkSGx3WlNBOUlITmphR1Z0WVM1MGVYQmxJSHg4SUNkdlltcGxZM1FuTzF4dUlDQjJZWElnYlc5a1pXdzdYRzRnSUhaaGNpQnZkWFJ3ZFhRN1hHNWNiaUFnYVdZZ0tITmphR1Z0WVM1bGVHRnRjR3hsS1NCN1hHNGdJQ0FnYjNWMGNIVjBJRDBnYzJOb1pXMWhMbVY0WVcxd2JHVTdYRzRnSUgwZ1pXeHpaU0JwWmlBb1h5NXBjMVZ1WkdWbWFXNWxaQ2h6WTJobGJXRXVhWFJsYlhNcElDWW1JRjh1YVhOQmNuSmhlU2h6WTJobGJXRXVaVzUxYlNrcElIdGNiaUFnSUNCdmRYUndkWFFnUFNCelkyaGxiV0V1Wlc1MWJWc3dYVHRjYmlBZ2ZWeHVYRzRnSUdsbUlDaGZMbWx6Vlc1a1pXWnBibVZrS0c5MWRIQjFkQ2twSUh0Y2JpQWdJQ0JwWmlBb2MyTm9aVzFoTGlSeVpXWXBJSHRjYmlBZ0lDQWdJRzF2WkdWc0lEMGdiVzlrWld4elcyaGxiSEJsY25NdWMybHRjR3hsVW1WbUtITmphR1Z0WVM0a2NtVm1LVjA3WEc1Y2JpQWdJQ0FnSUdsbUlDZ2hYeTVwYzFWdVpHVm1hVzVsWkNodGIyUmxiQ2twSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRjh1YVhOVmJtUmxabWx1WldRb2JXOWtaV3h6Vkc5SloyNXZjbVZiYlc5a1pXd3VibUZ0WlYwcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnYlc5a1pXeHpWRzlKWjI1dmNtVmJiVzlrWld3dWJtRnRaVjBnUFNCdGIyUmxiRHRjYmlBZ0lDQWdJQ0FnSUNCdmRYUndkWFFnUFNCelkyaGxiV0ZVYjBwVFQwNG9iVzlrWld3dVpHVm1hVzVwZEdsdmJpd2diVzlrWld4ekxDQnRiMlJsYkhOVWIwbG5ibTl5WlNrN1hHNGdJQ0FnSUNBZ0lDQWdaR1ZzWlhSbElHMXZaR1ZzYzFSdlNXZHViM0psVzIxdlpHVnNMbTVoYldWZE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJR2xtSUNodGIyUmxiQzUwZVhCbElEMDlQU0FuWVhKeVlYa25LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnZkWFJ3ZFhRZ1BTQmJYVHRjYmlBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiM1YwY0hWMElEMGdlMzA3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHpZMmhsYldFdVpHVm1ZWFZzZENrZ2UxeHVJQ0FnSUNBZ2IzVjBjSFYwSUQwZ2MyTm9aVzFoTG1SbFptRjFiSFE3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2gwZVhCbElEMDlQU0FuWkdGMFpTMTBhVzFsSnlrZ2UxeHVJQ0FnSUNBZ2IzVjBjSFYwSUQwZ2JtVjNJRVJoZEdVb0tTNTBiMGxUVDFOMGNtbHVaeWdwTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvZEhsd1pTQTlQVDBnSjJSaGRHVW5LU0I3WEc0Z0lDQWdJQ0J2ZFhSd2RYUWdQU0J1WlhjZ1JHRjBaU2dwTG5SdlNWTlBVM1J5YVc1bktDa3VjM0JzYVhRb0oxUW5LVnN3WFR0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnSUNCdmRYUndkWFFnUFNBbmMzUnlhVzVuSnp0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkcGJuUmxaMlZ5SnlrZ2UxeHVJQ0FnSUNBZ2IzVjBjSFYwSUQwZ01EdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1VnUFQwOUlDZHNiMjVuSnlrZ2UxeHVJQ0FnSUNBZ2IzVjBjSFYwSUQwZ01EdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1VnUFQwOUlDZG1iRzloZENjcElIdGNiaUFnSUNBZ0lHOTFkSEIxZENBOUlEQXVNRHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dVZ1BUMDlJQ2RrYjNWaWJHVW5LU0I3WEc0Z0lDQWdJQ0J2ZFhSd2RYUWdQU0F3TGpBN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoMGVYQmxJRDA5UFNBblltOXZiR1ZoYmljcElIdGNiaUFnSUNBZ0lHOTFkSEIxZENBOUlIUnlkV1U3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2gwZVhCbElEMDlQU0FuYjJKcVpXTjBKeWtnZTF4dUlDQWdJQ0FnYjNWMGNIVjBJRDBnZTMwN1hHNWNiaUFnSUNBZ0lGOHVabTl5UldGamFDaHpZMmhsYldFdWNISnZjR1Z5ZEdsbGN5d2dablZ1WTNScGIyNGdLSEJ5YjNCbGNuUjVMQ0J1WVcxbEtTQjdYRzRnSUNBZ0lDQWdJRzkxZEhCMWRGdHVZVzFsWFNBOUlITmphR1Z0WVZSdlNsTlBUaWh3Y205d1pYSjBlU3dnYlc5a1pXeHpMQ0J0YjJSbGJITlViMGxuYm05eVpTazdYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dVZ1BUMDlJQ2RoY25KaGVTY3BJSHRjYmlBZ0lDQWdJRzkxZEhCMWRDQTlJRnRkTzF4dVhHNGdJQ0FnSUNCcFppQW9YeTVwYzBGeWNtRjVLSE5qYUdWdFlTNXBkR1Z0Y3lrcElIdGNiaUFnSUNBZ0lDQWdYeTVtYjNKRllXTm9LSE5qYUdWdFlTNXBkR1Z0Y3l3Z1puVnVZM1JwYjI0Z0tHbDBaVzBwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnZkWFJ3ZFhRdWNIVnphQ2h6WTJobGJXRlViMHBUVDA0b2FYUmxiU3dnYlc5a1pXeHpMQ0J0YjJSbGJITlViMGxuYm05eVpTa3BPMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1h5NXBjMUJzWVdsdVQySnFaV04wS0hOamFHVnRZUzVwZEdWdGN5a3BJSHRjYmlBZ0lDQWdJQ0FnYjNWMGNIVjBMbkIxYzJnb2MyTm9aVzFoVkc5S1UwOU9LSE5qYUdWdFlTNXBkR1Z0Y3l3Z2JXOWtaV3h6TENCdGIyUmxiSE5VYjBsbmJtOXlaU2twTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNoZkxtbHpWVzVrWldacGJtVmtLSE5qYUdWdFlTNXBkR1Z0Y3lrcElIdGNiaUFnSUNBZ0lDQWdiM1YwY0hWMExuQjFjMmdvZTMwcE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2FHVnNjR1Z5Y3k1c2IyY29KMEZ5Y21GNUlIUjVjR1ZjWENkeklGeGNKMmwwWlcxelhGd25JSEJ5YjNCbGNuUjVJR2x6SUc1dmRDQmhiaUJoY25KaGVTQnZjaUJoYmlCdlltcGxZM1FzSUdOaGJtNXZkQ0J3Y205alpYTnpKeWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJRzkxZEhCMWREdGNibjA3WEc1Y2JrMXZaR1ZzTG5CeWIzUnZkSGx3WlM1amNtVmhkR1ZLVTA5T1UyRnRjR3hsSUQwZ1RXOWtaV3d1Y0hKdmRHOTBlWEJsTG1kbGRGTmhiWEJzWlZaaGJIVmxJRDBnWm5WdVkzUnBiMjRnS0cxdlpHVnNjMVJ2U1dkdWIzSmxLU0I3WEc0Z0lHMXZaR1ZzYzFSdlNXZHViM0psSUQwZ2JXOWtaV3h6Vkc5SloyNXZjbVVnZkh3Z2UzMDdYRzVjYmlBZ2JXOWtaV3h6Vkc5SloyNXZjbVZiZEdocGN5NXVZVzFsWFNBOUlIUm9hWE03WEc1Y2JpQWdMeThnVW1WemNHOXVjMlVnYzNWd2NHOXlkRnh1SUNCcFppQW9kR2hwY3k1bGVHRnRjR3hsY3lBbUppQmZMbWx6VUd4aGFXNVBZbXBsWTNRb2RHaHBjeTVsZUdGdGNHeGxjeWtnSmlZZ2RHaHBjeTVsZUdGdGNHeGxjMXNuWVhCd2JHbGpZWFJwYjI0dmFuTnZiaWRkS1NCN1hHNGdJQ0FnZEdocGN5NWtaV1pwYm1sMGFXOXVMbVY0WVcxd2JHVWdQU0IwYUdsekxtVjRZVzF3YkdWeld5ZGhjSEJzYVdOaGRHbHZiaTlxYzI5dUoxMDdYRzVjYmlBZ0lDQnBaaUFvWHk1cGMxTjBjbWx1WnloMGFHbHpMbVJsWm1sdWFYUnBiMjR1WlhoaGJYQnNaU2twSUh0Y2JpQWdJQ0FnSUhSb2FYTXVaR1ZtYVc1cGRHbHZiaTVsZUdGdGNHeGxJRDBnU2xOUFRpNXdZWEp6WlNoMGFHbHpMbVJsWm1sdWFYUnBiMjR1WlhoaGJYQnNaU2s3WEc0Z0lDQWdmVnh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSFJvYVhNdVpHVm1hVzVwZEdsdmJpNWxlR0Z0Y0d4bElEMGdkR2hwY3k1bGVHRnRjR3hsY3p0Y2JpQWdmVnh1WEc0Z0lGeHVJQ0J5WlhSMWNtNGdjMk5vWlcxaFZHOUtVMDlPS0hSb2FYTXVaR1ZtYVc1cGRHbHZiaXdnZEdocGN5NXRiMlJsYkhNc0lHMXZaR1ZzYzFSdlNXZHViM0psS1R0Y2JuMDdYRzVjYmsxdlpHVnNMbkJ5YjNSdmRIbHdaUzVuWlhSTmIyTnJVMmxuYm1GMGRYSmxJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0J5WlhSMWNtNGdjMk5vWlcxaFZHOUlWRTFNS0hSb2FYTXVibUZ0WlN3Z2RHaHBjeTVrWldacGJtbDBhVzl1TENCMGFHbHpMbTF2WkdWc2N5azdYRzU5TzF4dUlpd2lKM1Z6WlNCemRISnBZM1FuTzF4dVhHNTJZWElnWHlBOUlIdGNiaUFnYVhOVmJtUmxabWx1WldRNklISmxjWFZwY21Vb0oyeHZaR0Z6YUMxamIyMXdZWFF2YkdGdVp5OXBjMVZ1WkdWbWFXNWxaQ2NwWEc1OU8xeHVkbUZ5SUdobGJIQmxjbk1nUFNCeVpYRjFhWEpsS0NjdUxpOW9aV3h3WlhKekp5azdYRzUyWVhJZ1RXOWtaV3dnUFNCeVpYRjFhWEpsS0NjdUwyMXZaR1ZzSnlrN1hHNTJZWElnVTNkaFoyZGxja2gwZEhBZ1BTQnlaWEYxYVhKbEtDY3VMaTlvZEhSd0p5azdYRzVjYm5aaGNpQlBjR1Z5WVhScGIyNGdQU0J0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR1oxYm1OMGFXOXVJQ2h3WVhKbGJuUXNJSE5qYUdWdFpTd2diM0JsY21GMGFXOXVTV1FzSUdoMGRIQk5aWFJvYjJRc0lIQmhkR2dzSUdGeVozTXNJR1JsWm1sdWFYUnBiMjV6TENCdGIyUmxiSE1zSUdOc2FXVnVkRUYxZEdodmNtbDZZWFJwYjI1ektTQjdYRzRnSUhaaGNpQmxjbkp2Y25NZ1BTQmJYVHRjYmx4dUlDQndZWEpsYm5RZ1BTQndZWEpsYm5RZ2ZId2dlMzA3WEc0Z0lHRnlaM01nUFNCaGNtZHpJSHg4SUh0OU8xeHVYRzRnSUhSb2FYTXVZWFYwYUc5eWFYcGhkR2x2Ym5NZ1BTQmhjbWR6TG5ObFkzVnlhWFI1TzF4dUlDQjBhR2x6TG1KaGMyVlFZWFJvSUQwZ2NHRnlaVzUwTG1KaGMyVlFZWFJvSUh4OElDY3ZKenRjYmlBZ2RHaHBjeTVqYkdsbGJuUkJkWFJvYjNKcGVtRjBhVzl1Y3lBOUlHTnNhV1Z1ZEVGMWRHaHZjbWw2WVhScGIyNXpPMXh1SUNCMGFHbHpMbU52Ym5OMWJXVnpJRDBnWVhKbmN5NWpiMjV6ZFcxbGN6dGNiaUFnZEdocGN5NWtaWEJ5WldOaGRHVmtJRDBnWVhKbmN5NWtaWEJ5WldOaGRHVmtPMXh1SUNCMGFHbHpMbVJsYzJOeWFYQjBhVzl1SUQwZ1lYSm5jeTVrWlhOamNtbHdkR2x2Ymp0Y2JpQWdkR2hwY3k1b2IzTjBJRDBnY0dGeVpXNTBMbWh2YzNRZ2ZId2dKMnh2WTJGc2FHOXpkQ2M3WEc0Z0lIUm9hWE11YldWMGFHOWtJRDBnS0doMGRIQk5aWFJvYjJRZ2ZId2daWEp5YjNKekxuQjFjMmdvSjA5d1pYSmhkR2x2YmlBbklDc2diM0JsY21GMGFXOXVTV1FnS3lBbklHbHpJRzFwYzNOcGJtY2diV1YwYUc5a0xpY3BLVHRjYmlBZ2RHaHBjeTV0YjJSbGJITWdQU0J0YjJSbGJITWdmSHdnZTMwN1hHNGdJSFJvYVhNdWJtbGphMjVoYldVZ1BTQW9iM0JsY21GMGFXOXVTV1FnZkh3Z1pYSnliM0p6TG5CMWMyZ29KMDl3WlhKaGRHbHZibk1nYlhWemRDQm9ZWFpsSUdFZ2JtbGphMjVoYldVdUp5a3BPMXh1SUNCMGFHbHpMbTl3WlhKaGRHbHZiaUE5SUdGeVozTTdYRzRnSUhSb2FYTXViM0JsY21GMGFXOXVjeUE5SUh0OU8xeHVJQ0IwYUdsekxuQmhjbUZ0WlhSbGNuTWdQU0JoY21keklDRTlQU0J1ZFd4c0lEOGdLR0Z5WjNNdWNHRnlZVzFsZEdWeWN5QjhmQ0JiWFNrZ09pQjdmVHRjYmlBZ2RHaHBjeTV3WVhKbGJuUWdQU0J3WVhKbGJuUTdYRzRnSUhSb2FYTXVjR0YwYUNBOUlDaHdZWFJvSUh4OElHVnljbTl5Y3k1d2RYTm9LQ2RQY0dWeVlYUnBiMjRnSnlBcklIUm9hWE11Ym1samEyNWhiV1VnS3lBbklHbHpJRzFwYzNOcGJtY2djR0YwYUM0bktTazdYRzRnSUhSb2FYTXVjSEp2WkhWalpYTWdQU0JoY21kekxuQnliMlIxWTJWek8xeHVJQ0IwYUdsekxuSmxjM0J2Ym5ObGN5QTlJQ2hoY21kekxuSmxjM0J2Ym5ObGN5QjhmQ0I3ZlNrN1hHNGdJSFJvYVhNdWMyTm9aVzFsSUQwZ2MyTm9aVzFsSUh4OElIQmhjbVZ1ZEM1elkyaGxiV1VnZkh3Z0oyaDBkSEFuTzF4dUlDQjBhR2x6TG5OamFHVnRaWE1nUFNCd1lYSmxiblF1YzJOb1pXMWxjenRjYmlBZ2RHaHBjeTV6WldOMWNtbDBlU0E5SUdGeVozTXVjMlZqZFhKcGRIazdYRzRnSUhSb2FYTXVjM1Z0YldGeWVTQTlJR0Z5WjNNdWMzVnRiV0Z5ZVNCOGZDQW5KenRjYmlBZ2RHaHBjeTUwZVhCbElEMGdiblZzYkR0Y2JpQWdkR2hwY3k1MWMyVktVWFZsY25rZ1BTQndZWEpsYm5RdWRYTmxTbEYxWlhKNU8xeHVYRzRnSUdsbUlDaDBlWEJsYjJZZ2RHaHBjeTVrWlhCeVpXTmhkR1ZrSUQwOVBTQW5jM1J5YVc1bkp5a2dlMXh1SUNBZ0lITjNhWFJqYUNoMGFHbHpMbVJsY0hKbFkyRjBaV1F1ZEc5TWIzZGxja05oYzJVb0tTa2dlMXh1SUNBZ0lDQWdZMkZ6WlNBbmRISjFaU2M2SUdOaGMyVWdKM2xsY3ljNklHTmhjMlVnSnpFbk9pQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdVpHVndjbVZqWVhSbFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCallYTmxJQ2RtWVd4elpTYzZJR05oYzJVZ0oyNXZKem9nWTJGelpTQW5NQ2M2SUdOaGMyVWdiblZzYkRvZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG1SbGNISmxZMkYwWldRZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUdSbFptRjFiSFE2SUhSb2FYTXVaR1Z3Y21WallYUmxaQ0E5SUVKdmIyeGxZVzRvZEdocGN5NWtaWEJ5WldOaGRHVmtLVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0IyWVhJZ2FTd2diVzlrWld3N1hHNWNiaUFnYVdZZ0tHUmxabWx1YVhScGIyNXpLU0I3WEc0Z0lDQWdMeThnWVdSa0lIUnZJR2RzYjJKaGJDQnRiMlJsYkhOY2JpQWdJQ0IyWVhJZ2EyVjVPMXh1WEc0Z0lDQWdabTl5SUNoclpYa2dhVzRnZEdocGN5NWtaV1pwYm1sMGFXOXVjeWtnZTF4dUlDQWdJQ0FnYlc5a1pXd2dQU0J1WlhjZ1RXOWtaV3dvYTJWNUxDQmtaV1pwYm1sMGFXOXVjMXRyWlhsZExDQjBhR2x6TG0xdlpHVnNjeWs3WEc1Y2JpQWdJQ0FnSUdsbUlDaHRiMlJsYkNrZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG0xdlpHVnNjMXRyWlhsZElEMGdiVzlrWld3N1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzRnSUdadmNpQW9hU0E5SURBN0lHa2dQQ0IwYUdsekxuQmhjbUZ0WlhSbGNuTXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0IyWVhJZ2NHRnlZVzBnUFNCMGFHbHpMbkJoY21GdFpYUmxjbk5iYVYwN1hHNWNiaUFnSUNCcFppQW9jR0Z5WVcwdWRIbHdaU0E5UFQwZ0oyRnljbUY1SnlrZ2UxeHVJQ0FnSUNBZ2NHRnlZVzB1YVhOTWFYTjBJRDBnZEhKMVpUdGNiaUFnSUNBZ0lIQmhjbUZ0TG1Gc2JHOTNUWFZzZEdsd2JHVWdQU0IwY25WbE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQnBibTVsY2xSNWNHVWdQU0IwYUdsekxtZGxkRlI1Y0dVb2NHRnlZVzBwTzF4dVhHNGdJQ0FnYVdZZ0tHbHVibVZ5Vkhsd1pTQW1KaUJwYm01bGNsUjVjR1V1ZEc5VGRISnBibWNvS1M1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNBblltOXZiR1ZoYmljcElIdGNiaUFnSUNBZ0lIQmhjbUZ0TG1Gc2JHOTNZV0pzWlZaaGJIVmxjeUE5SUh0OU8xeHVJQ0FnSUNBZ2NHRnlZVzB1YVhOTWFYTjBJRDBnZEhKMVpUdGNiaUFnSUNBZ0lIQmhjbUZ0V3lkbGJuVnRKMTBnUFNCYkozUnlkV1VuTENBblptRnNjMlVuWFR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUhCaGNtRnRXeWRsYm5WdEoxMGdJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ0lDQjJZWElnYVdRN1hHNWNiaUFnSUNBZ0lIQmhjbUZ0TG1Gc2JHOTNZV0pzWlZaaGJIVmxjeUE5SUh0OU8xeHVJQ0FnSUNBZ2NHRnlZVzB1WVd4c2IzZGhZbXhsVm1Gc2RXVnpMblpoYkhWbGN5QTlJRnRkTzF4dUlDQWdJQ0FnY0dGeVlXMHVZV3hzYjNkaFlteGxWbUZzZFdWekxtUmxjMk55YVhCMGFYWmxWbUZzZFdWeklEMGdXMTA3WEc1Y2JpQWdJQ0FnSUdadmNpQW9hV1FnUFNBd095QnBaQ0E4SUhCaGNtRnRXeWRsYm5WdEoxMHViR1Z1WjNSb095QnBaQ3NyS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUIyWVd4MVpTQTlJSEJoY21GdFd5ZGxiblZ0SjExYmFXUmRPMXh1SUNBZ0lDQWdJQ0IyWVhJZ2FYTkVaV1poZFd4MElEMGdLSFpoYkhWbElEMDlQU0J3WVhKaGJTNWtaV1poZFd4MEtTQS9JSFJ5ZFdVZ09pQm1ZV3h6WlR0Y2JseHVJQ0FnSUNBZ0lDQndZWEpoYlM1aGJHeHZkMkZpYkdWV1lXeDFaWE11ZG1Gc2RXVnpMbkIxYzJnb2RtRnNkV1VwTzF4dUlDQWdJQ0FnSUNCd1lYSmhiUzVoYkd4dmQyRmliR1ZXWVd4MVpYTXVaR1Z6WTNKcGNIUnBkbVZXWVd4MVpYTXVjSFZ6YUNoN2RtRnNkV1VnT2lCMllXeDFaU3dnYVhORVpXWmhkV3gwT2lCcGMwUmxabUYxYkhSOUtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9jR0Z5WVcwdWRIbHdaU0E5UFQwZ0oyRnljbUY1SnlrZ2UxeHVJQ0FnSUNBZ2FXNXVaWEpVZVhCbElEMGdXMmx1Ym1WeVZIbHdaVjA3WEc1Y2JpQWdJQ0FnSUdsbUlDaDBlWEJsYjJZZ2NHRnlZVzB1WVd4c2IzZGhZbXhsVm1Gc2RXVnpJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lDQWdJQ0F2THlCallXNG5kQ0J6YUc5M0lHRnpJR0VnYkdsemRDQnBaaUJ1YnlCMllXeDFaWE1nZEc4Z2MyVnNaV04wSUdaeWIyMWNiaUFnSUNBZ0lDQWdaR1ZzWlhSbElIQmhjbUZ0TG1selRHbHpkRHRjYmlBZ0lDQWdJQ0FnWkdWc1pYUmxJSEJoY21GdExtRnNiRzkzVFhWc2RHbHdiR1U3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjR0Z5WVcwdWMybG5ibUYwZFhKbElEMGdkR2hwY3k1blpYUk5iMlJsYkZOcFoyNWhkSFZ5WlNocGJtNWxjbFI1Y0dVc0lIUm9hWE11Ylc5a1pXeHpLUzUwYjFOMGNtbHVaeWdwTzF4dUlDQWdJSEJoY21GdExuTmhiWEJzWlVwVFQwNGdQU0IwYUdsekxtZGxkRTF2WkdWc1UyRnRjR3hsU2xOUFRpaHBibTVsY2xSNWNHVXNJSFJvYVhNdWJXOWtaV3h6S1R0Y2JpQWdJQ0J3WVhKaGJTNXlaWE53YjI1elpVTnNZWE56VTJsbmJtRjBkWEpsSUQwZ2NHRnlZVzB1YzJsbmJtRjBkWEpsTzF4dUlDQjlYRzVjYmlBZ2RtRnlJR1JsWm1GMWJIUlNaWE53YjI1elpVTnZaR1VzSUhKbGMzQnZibk5sTENCeVpYTndiMjV6WlhNZ1BTQjBhR2x6TG5KbGMzQnZibk5sY3p0Y2JseHVJQ0JwWmlBb2NtVnpjRzl1YzJWeld5Y3lNREFuWFNrZ2UxeHVJQ0FnSUhKbGMzQnZibk5sSUQwZ2NtVnpjRzl1YzJWeld5Y3lNREFuWFR0Y2JpQWdJQ0JrWldaaGRXeDBVbVZ6Y0c5dWMyVkRiMlJsSUQwZ0p6SXdNQ2M3WEc0Z0lIMGdaV3h6WlNCcFppQW9jbVZ6Y0c5dWMyVnpXeWN5TURFblhTa2dlMXh1SUNBZ0lISmxjM0J2Ym5ObElEMGdjbVZ6Y0c5dWMyVnpXeWN5TURFblhUdGNiaUFnSUNCa1pXWmhkV3gwVW1WemNHOXVjMlZEYjJSbElEMGdKekl3TVNjN1hHNGdJSDBnWld4elpTQnBaaUFvY21WemNHOXVjMlZ6V3ljeU1ESW5YU2tnZTF4dUlDQWdJSEpsYzNCdmJuTmxJRDBnY21WemNHOXVjMlZ6V3ljeU1ESW5YVHRjYmlBZ0lDQmtaV1poZFd4MFVtVnpjRzl1YzJWRGIyUmxJRDBnSnpJd01pYzdYRzRnSUgwZ1pXeHpaU0JwWmlBb2NtVnpjRzl1YzJWeld5Y3lNRE1uWFNrZ2UxeHVJQ0FnSUhKbGMzQnZibk5sSUQwZ2NtVnpjRzl1YzJWeld5Y3lNRE1uWFR0Y2JpQWdJQ0JrWldaaGRXeDBVbVZ6Y0c5dWMyVkRiMlJsSUQwZ0p6SXdNeWM3WEc0Z0lIMGdaV3h6WlNCcFppQW9jbVZ6Y0c5dWMyVnpXeWN5TURRblhTa2dlMXh1SUNBZ0lISmxjM0J2Ym5ObElEMGdjbVZ6Y0c5dWMyVnpXeWN5TURRblhUdGNiaUFnSUNCa1pXWmhkV3gwVW1WemNHOXVjMlZEYjJSbElEMGdKekl3TkNjN1hHNGdJSDBnWld4elpTQnBaaUFvY21WemNHOXVjMlZ6V3ljeU1EVW5YU2tnZTF4dUlDQWdJSEpsYzNCdmJuTmxJRDBnY21WemNHOXVjMlZ6V3ljeU1EVW5YVHRjYmlBZ0lDQmtaV1poZFd4MFVtVnpjRzl1YzJWRGIyUmxJRDBnSnpJd05TYzdYRzRnSUgwZ1pXeHpaU0JwWmlBb2NtVnpjRzl1YzJWeld5Y3lNRFluWFNrZ2UxeHVJQ0FnSUhKbGMzQnZibk5sSUQwZ2NtVnpjRzl1YzJWeld5Y3lNRFluWFR0Y2JpQWdJQ0JrWldaaGRXeDBVbVZ6Y0c5dWMyVkRiMlJsSUQwZ0p6SXdOaWM3WEc0Z0lIMGdaV3h6WlNCcFppQW9jbVZ6Y0c5dWMyVnpXeWRrWldaaGRXeDBKMTBwSUh0Y2JpQWdJQ0J5WlhOd2IyNXpaU0E5SUhKbGMzQnZibk5sYzFzblpHVm1ZWFZzZENkZE8xeHVJQ0FnSUdSbFptRjFiSFJTWlhOd2IyNXpaVU52WkdVZ1BTQW5aR1ZtWVhWc2RDYzdYRzRnSUgxY2JpQWdYRzRnSUdsbUlDaHlaWE53YjI1elpTQW1KaUJ5WlhOd2IyNXpaUzV6WTJobGJXRXBJSHRjYmlBZ0lDQjJZWElnY21WemIyeDJaV1JOYjJSbGJDQTlJSFJvYVhNdWNtVnpiMngyWlUxdlpHVnNLSEpsYzNCdmJuTmxMbk5qYUdWdFlTd2daR1ZtYVc1cGRHbHZibk1wTzF4dUlDQWdJSFpoY2lCemRXTmpaWE56VW1WemNHOXVjMlU3WEc1Y2JpQWdJQ0JrWld4bGRHVWdjbVZ6Y0c5dWMyVnpXMlJsWm1GMWJIUlNaWE53YjI1elpVTnZaR1ZkTzF4dVhHNGdJQ0FnYVdZZ0tISmxjMjlzZG1Wa1RXOWtaV3dwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVjM1ZqWTJWemMxSmxjM0J2Ym5ObElEMGdlMzA3WEc0Z0lDQWdJQ0J6ZFdOalpYTnpVbVZ6Y0c5dWMyVWdQU0IwYUdsekxuTjFZMk5sYzNOU1pYTndiMjV6WlZ0a1pXWmhkV3gwVW1WemNHOXVjMlZEYjJSbFhTQTlJSEpsYzI5c2RtVmtUVzlrWld3N0lGeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb0lYSmxjM0J2Ym5ObExuTmphR1Z0WVM1MGVYQmxJSHg4SUhKbGMzQnZibk5sTG5OamFHVnRZUzUwZVhCbElEMDlQU0FuYjJKcVpXTjBKeUI4ZkNCeVpYTndiMjV6WlM1elkyaGxiV0V1ZEhsd1pTQTlQVDBnSjJGeWNtRjVKeWtnZTF4dUlDQWdJQ0FnTHk4Z1NXNXNhVzVsSUcxdlpHVnNYRzRnSUNBZ0lDQjBhR2x6TG5OMVkyTmxjM05TWlhOd2IyNXpaU0E5SUh0OU8xeHVJQ0FnSUNBZ2MzVmpZMlZ6YzFKbGMzQnZibk5sSUQwZ2RHaHBjeTV6ZFdOalpYTnpVbVZ6Y0c5dWMyVmJaR1ZtWVhWc2RGSmxjM0J2Ym5ObFEyOWtaVjBnUFNCdVpYY2dUVzlrWld3b2RXNWtaV1pwYm1Wa0xDQnlaWE53YjI1elpTNXpZMmhsYldFZ2ZId2dlMzBzSUhSb2FYTXViVzlrWld4ektUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnTHk4Z1VISnBiV2wwYVhabFhHNGdJQ0FnSUNCMGFHbHpMbk4xWTJObGMzTlNaWE53YjI1elpTQTlJSHQ5TzF4dUlDQWdJQ0FnYzNWalkyVnpjMUpsYzNCdmJuTmxJRDBnZEdocGN5NXpkV05qWlhOelVtVnpjRzl1YzJWYlpHVm1ZWFZzZEZKbGMzQnZibk5sUTI5a1pWMGdQU0J5WlhOd2IyNXpaUzV6WTJobGJXRTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSE4xWTJObGMzTlNaWE53YjI1elpTa2dlMXh1SUNBZ0lDQWdMeThnUVhSMFlXTm9JSEpsYzNCdmJuTmxJSEJ5YjNCbGNuUnBaWE5jYmlBZ0lDQWdJR2xtSUNoeVpYTndiMjV6WlM1a1pYTmpjbWx3ZEdsdmJpa2dlMXh1SUNBZ0lDQWdJQ0J6ZFdOalpYTnpVbVZ6Y0c5dWMyVXVaR1Z6WTNKcGNIUnBiMjRnUFNCeVpYTndiMjV6WlM1a1pYTmpjbWx3ZEdsdmJqdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0hKbGMzQnZibk5sTG1WNFlXMXdiR1Z6S1NCN1hHNGdJQ0FnSUNBZ0lITjFZMk5sYzNOU1pYTndiMjV6WlM1bGVHRnRjR3hsY3lBOUlISmxjM0J2Ym5ObExtVjRZVzF3YkdWek8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvY21WemNHOXVjMlV1YUdWaFpHVnljeWtnZTF4dUlDQWdJQ0FnSUNCemRXTmpaWE56VW1WemNHOXVjMlV1YUdWaFpHVnljeUE5SUhKbGMzQnZibk5sTG1obFlXUmxjbk03WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdkR2hwY3k1MGVYQmxJRDBnY21WemNHOXVjMlU3WEc0Z0lIMWNibHh1SUNCcFppQW9aWEp5YjNKekxteGxibWQwYUNBK0lEQXBJSHRjYmlBZ0lDQnBaaUFvZEdocGN5NXlaWE52ZFhKalpTQW1KaUIwYUdsekxuSmxjMjkxY21ObExtRndhU0FtSmlCMGFHbHpMbkpsYzI5MWNtTmxMbUZ3YVM1bVlXbHNLU0I3WEc0Z0lDQWdJQ0IwYUdsekxuSmxjMjkxY21ObExtRndhUzVtWVdsc0tHVnljbTl5Y3lrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUhSb2FYTTdYRzU5TzF4dVhHNVBjR1Z5WVhScGIyNHVjSEp2ZEc5MGVYQmxMbWRsZEZSNWNHVWdQU0JtZFc1amRHbHZiaUFvY0dGeVlXMHBJSHRjYmlBZ2RtRnlJSFI1Y0dVZ1BTQndZWEpoYlM1MGVYQmxPMXh1SUNCMllYSWdabTl5YldGMElEMGdjR0Z5WVcwdVptOXliV0YwTzF4dUlDQjJZWElnYVhOQmNuSmhlU0E5SUdaaGJITmxPMXh1SUNCMllYSWdjM1J5TzF4dVhHNGdJR2xtSUNoMGVYQmxJRDA5UFNBbmFXNTBaV2RsY2ljZ0ppWWdabTl5YldGMElEMDlQU0FuYVc1ME16SW5LU0I3WEc0Z0lDQWdjM1J5SUQwZ0oybHVkR1ZuWlhJbk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkcGJuUmxaMlZ5SnlBbUppQm1iM0p0WVhRZ1BUMDlJQ2RwYm5RMk5DY3BJSHRjYmlBZ0lDQnpkSElnUFNBbmJHOXVaeWM3WEc0Z0lIMGdaV3h6WlNCcFppQW9kSGx3WlNBOVBUMGdKMmx1ZEdWblpYSW5LU0I3WEc0Z0lDQWdjM1J5SUQwZ0oybHVkR1ZuWlhJbk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnYVdZZ0tHWnZjbTFoZENBOVBUMGdKMlJoZEdVdGRHbHRaU2NwSUh0Y2JpQWdJQ0FnSUhOMGNpQTlJQ2RrWVhSbExYUnBiV1VuTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvWm05eWJXRjBJRDA5UFNBblpHRjBaU2NwSUh0Y2JpQWdJQ0FnSUhOMGNpQTlJQ2RrWVhSbEp6dGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnYzNSeUlEMGdKM04wY21sdVp5YzdYRzRnSUNBZ2ZWeHVJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkdWRXMWlaWEluSUNZbUlHWnZjbTFoZENBOVBUMGdKMlpzYjJGMEp5a2dlMXh1SUNBZ0lITjBjaUE5SUNkbWJHOWhkQ2M3WEc0Z0lIMGdaV3h6WlNCcFppQW9kSGx3WlNBOVBUMGdKMjUxYldKbGNpY2dKaVlnWm05eWJXRjBJRDA5UFNBblpHOTFZbXhsSnlrZ2UxeHVJQ0FnSUhOMGNpQTlJQ2RrYjNWaWJHVW5PMXh1SUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1VnUFQwOUlDZHVkVzFpWlhJbktTQjdYRzRnSUNBZ2MzUnlJRDBnSjJSdmRXSnNaU2M3WEc0Z0lIMGdaV3h6WlNCcFppQW9kSGx3WlNBOVBUMGdKMkp2YjJ4bFlXNG5LU0I3WEc0Z0lDQWdjM1J5SUQwZ0oySnZiMnhsWVc0bk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkaGNuSmhlU2NwSUh0Y2JpQWdJQ0JwYzBGeWNtRjVJRDBnZEhKMVpUdGNibHh1SUNBZ0lHbG1JQ2h3WVhKaGJTNXBkR1Z0Y3lrZ2UxeHVJQ0FnSUNBZ2MzUnlJRDBnZEdocGN5NW5aWFJVZVhCbEtIQmhjbUZ0TG1sMFpXMXpLVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0JwWmlBb2NHRnlZVzB1SkhKbFppa2dlMXh1SUNBZ0lITjBjaUE5SUhCaGNtRnRMaVJ5WldZN1hHNGdJSDFjYmx4dUlDQjJZWElnYzJOb1pXMWhJRDBnY0dGeVlXMHVjMk5vWlcxaE8xeHVYRzRnSUdsbUlDaHpZMmhsYldFcElIdGNiaUFnSUNCMllYSWdjbVZtSUQwZ2MyTm9aVzFoTGlSeVpXWTdYRzVjYmlBZ0lDQnBaaUFvY21WbUtTQjdYRzRnSUNBZ0lDQnlaV1lnUFNCb1pXeHdaWEp6TG5OcGJYQnNaVkpsWmloeVpXWXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb2FYTkJjbkpoZVNrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1d5QnlaV1lnWFR0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WldZN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG1kbGRGUjVjR1VvYzJOb1pXMWhLVHRjYmlBZ0lDQjlYRzRnSUgxY2JpQWdhV1lnS0dselFYSnlZWGtwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdXeUJ6ZEhJZ1hUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnlaWFIxY200Z2MzUnlPMXh1SUNCOVhHNTlPMXh1WEc1UGNHVnlZWFJwYjI0dWNISnZkRzkwZVhCbExuSmxjMjlzZG1WTmIyUmxiQ0E5SUdaMWJtTjBhVzl1SUNoelkyaGxiV0VzSUdSbFptbHVhWFJwYjI1ektTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2MyTm9aVzFoTGlSeVpXWWdJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ2RtRnlJSEpsWmlBOUlITmphR1Z0WVM0a2NtVm1PMXh1WEc0Z0lDQWdhV1lnS0hKbFppNXBibVJsZUU5bUtDY2pMMlJsWm1sdWFYUnBiMjV6THljcElEMDlQU0F3S1NCN1hHNGdJQ0FnSUNCeVpXWWdQU0J5WldZdWMzVmljM1J5YVc1bktDY2pMMlJsWm1sdWFYUnBiMjV6THljdWJHVnVaM1JvS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb1pHVm1hVzVwZEdsdmJuTmJjbVZtWFNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5Qk5iMlJsYkNoeVpXWXNJR1JsWm1sdWFYUnBiMjV6VzNKbFpsMHNJSFJvYVhNdWJXOWtaV3h6S1R0Y2JpQWdJQ0I5WEc0Z0lIMGdaV3h6WlNCcFppQW9jMk5vWlcxaExuUjVjR1VnUFQwOUlDZHZZbXBsWTNRbklIeDhJRjh1YVhOVmJtUmxabWx1WldRb2MyTm9aVzFoTG5SNWNHVXBLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHNWxkeUJOYjJSbGJDaDFibVJsWm1sdVpXUXNJSE5qYUdWdFlTd2dkR2hwY3k1dGIyUmxiSE1wTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUc1MWJHdzdYRzU5TzF4dVhHNVBjR1Z5WVhScGIyNHVjSEp2ZEc5MGVYQmxMbWhsYkhBZ1BTQm1kVzVqZEdsdmJpQW9aRzl1ZEZCeWFXNTBLU0I3WEc0Z0lIWmhjaUJ2ZFhRZ1BTQjBhR2x6TG01cFkydHVZVzFsSUNzZ0p6b2dKeUFySUhSb2FYTXVjM1Z0YldGeWVTQXJJQ2RjWEc0bk8xeHVYRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2RHaHBjeTV3WVhKaGJXVjBaWEp6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2RtRnlJSEJoY21GdElEMGdkR2hwY3k1d1lYSmhiV1YwWlhKelcybGRPMXh1SUNBZ0lIWmhjaUIwZVhCbFNXNW1ieUE5SUhCaGNtRnRMbk5wWjI1aGRIVnlaVHRjYmx4dUlDQWdJRzkxZENBclBTQW5YRnh1SUNBcUlDY2dLeUJ3WVhKaGJTNXVZVzFsSUNzZ0p5QW9KeUFySUhSNWNHVkpibVp2SUNzZ0p5azZJQ2NnS3lCd1lYSmhiUzVrWlhOamNtbHdkR2x2Ymp0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2gwZVhCbGIyWWdaRzl1ZEZCeWFXNTBJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lHaGxiSEJsY25NdWJHOW5LRzkxZENrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2IzVjBPMXh1ZlR0Y2JseHVUM0JsY21GMGFXOXVMbkJ5YjNSdmRIbHdaUzVuWlhSTmIyUmxiRk5wWjI1aGRIVnlaU0E5SUdaMWJtTjBhVzl1SUNoMGVYQmxMQ0JrWldacGJtbDBhVzl1Y3lrZ2UxeHVJQ0IyWVhJZ2FYTlFjbWx0YVhScGRtVXNJR3hwYzNSVWVYQmxPMXh1WEc0Z0lHbG1JQ2gwZVhCbElHbHVjM1JoYm1ObGIyWWdRWEp5WVhrcElIdGNiaUFnSUNCc2FYTjBWSGx3WlNBOUlIUnlkV1U3WEc0Z0lDQWdkSGx3WlNBOUlIUjVjR1ZiTUYwN1hHNGdJSDBnWld4elpTQnBaaUFvZEhsd1pXOW1JSFI1Y0dVZ1BUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hHNGdJQ0FnZEhsd1pTQTlJQ2QxYm1SbFptbHVaV1FuTzF4dUlDQjlYRzVjYmlBZ2FXWWdLSFI1Y0dVZ1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdhWE5RY21sdGFYUnBkbVVnUFNCMGNuVmxPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJR2x6VUhKcGJXbDBhWFpsSUQwZ0tHeHBjM1JVZVhCbElDWW1JR1JsWm1sdWFYUnBiMjV6VzJ4cGMzUlVlWEJsWFNrZ2ZId2dLR1JsWm1sdWFYUnBiMjV6VzNSNWNHVmRLU0EvSUdaaGJITmxJRG9nZEhKMVpUdGNiaUFnZlZ4dVhHNGdJR2xtSUNocGMxQnlhVzFwZEdsMlpTa2dlMXh1SUNBZ0lHbG1JQ2hzYVhOMFZIbHdaU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJQ2RCY25KaGVWc25JQ3NnZEhsd1pTQXJJQ2RkSnp0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVYwZFhKdUlIUjVjR1V1ZEc5VGRISnBibWNvS1R0Y2JpQWdJQ0I5WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnYVdZZ0tHeHBjM1JVZVhCbEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z0owRnljbUY1V3ljZ0t5QmtaV1pwYm1sMGFXOXVjMXQwZVhCbFhTNW5aWFJOYjJOclUybG5ibUYwZFhKbEtDa2dLeUFuWFNjN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmtaV1pwYm1sMGFXOXVjMXQwZVhCbFhTNW5aWFJOYjJOclUybG5ibUYwZFhKbEtDazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1OU8xeHVYRzVQY0dWeVlYUnBiMjR1Y0hKdmRHOTBlWEJsTG5OMWNIQnZjblJJWldGa1pYSlFZWEpoYlhNZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lISmxkSFZ5YmlCMGNuVmxPMXh1ZlR0Y2JseHVUM0JsY21GMGFXOXVMbkJ5YjNSdmRIbHdaUzV6ZFhCd2IzSjBaV1JUZFdKdGFYUk5aWFJvYjJSeklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQnlaWFIxY200Z2RHaHBjeTV3WVhKbGJuUXVjM1Z3Y0c5eWRHVmtVM1ZpYldsMFRXVjBhRzlrY3p0Y2JuMDdYRzVjYms5d1pYSmhkR2x2Ymk1d2NtOTBiM1I1Y0dVdVoyVjBTR1ZoWkdWeVVHRnlZVzF6SUQwZ1puVnVZM1JwYjI0Z0tHRnlaM01wSUh0Y2JpQWdkbUZ5SUdobFlXUmxjbk1nUFNCMGFHbHpMbk5sZEVOdmJuUmxiblJVZVhCbGN5aGhjbWR6TENCN2ZTazdYRzVjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQjBhR2x6TG5CaGNtRnRaWFJsY25NdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQjJZWElnY0dGeVlXMGdQU0IwYUdsekxuQmhjbUZ0WlhSbGNuTmJhVjA3WEc1Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUdGeVozTmJjR0Z5WVcwdWJtRnRaVjBnSVQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEc0Z0lDQWdJQ0JwWmlBb2NHRnlZVzB1YVc0Z1BUMDlJQ2RvWldGa1pYSW5LU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQjJZV3gxWlNBOUlHRnlaM05iY0dGeVlXMHVibUZ0WlYwN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0VGeWNtRjVMbWx6UVhKeVlYa29kbUZzZFdVcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnZG1Gc2RXVWdQU0IyWVd4MVpTNTBiMU4wY21sdVp5Z3BPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ2FHVmhaR1Z5YzF0d1lYSmhiUzV1WVcxbFhTQTlJSFpoYkhWbE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCb1pXRmtaWEp6TzF4dWZUdGNibHh1VDNCbGNtRjBhVzl1TG5CeWIzUnZkSGx3WlM1MWNteHBabmtnUFNCbWRXNWpkR2x2YmlBb1lYSm5jeWtnZTF4dUlDQjJZWElnWm05eWJWQmhjbUZ0Y3lBOUlIdDlPMXh1SUNCMllYSWdjbVZ4ZFdWemRGVnliQ0E5SUhSb2FYTXVjR0YwYUR0Y2JpQWdkbUZ5SUhGMVpYSjVjM1J5YVc1bklEMGdKeWM3SUM4dklHZHlZV0lnY0dGeVlXMXpJR1p5YjIwZ2RHaGxJR0Z5WjNNc0lHSjFhV3hrSUhSb1pTQnhkV1Z5ZVhOMGNtbHVaeUJoYkc5dVp5QjBhR1VnZDJGNVhHNWNiaUFnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCMGFHbHpMbkJoY21GdFpYUmxjbk11YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCMllYSWdjR0Z5WVcwZ1BTQjBhR2x6TG5CaGNtRnRaWFJsY25OYmFWMDdYRzVjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JR0Z5WjNOYmNHRnlZVzB1Ym1GdFpWMGdJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ0lDQnBaaUFvY0dGeVlXMHVhVzRnUFQwOUlDZHdZWFJvSnlrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnY21WbklEMGdibVYzSUZKbFowVjRjQ2duWEZ4N0p5QXJJSEJoY21GdExtNWhiV1VnS3lBblhGeDlKeXdnSjJkcEp5azdYRzRnSUNBZ0lDQWdJSFpoY2lCMllXeDFaU0E5SUdGeVozTmJjR0Z5WVcwdWJtRnRaVjA3WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLRUZ5Y21GNUxtbHpRWEp5WVhrb2RtRnNkV1VwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdkbUZzZFdVZ1BTQjBhR2x6TG1WdVkyOWtaVkJoZEdoRGIyeHNaV04wYVc5dUtIQmhjbUZ0TG1OdmJHeGxZM1JwYjI1R2IzSnRZWFFzSUhCaGNtRnRMbTVoYldVc0lIWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQjJZV3gxWlNBOUlIUm9hWE11Wlc1amIyUmxVR0YwYUZCaGNtRnRLSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUhKbGNYVmxjM1JWY213Z1BTQnlaWEYxWlhOMFZYSnNMbkpsY0d4aFkyVW9jbVZuTENCMllXeDFaU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hCaGNtRnRMbWx1SUQwOVBTQW5jWFZsY25rbklDWW1JSFI1Y0dWdlppQmhjbWR6VzNCaGNtRnRMbTVoYldWZElDRTlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvY1hWbGNubHpkSEpwYm1jZ1BUMDlJQ2NuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdjWFZsY25semRISnBibWNnS3owZ0p6OG5PMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUhGMVpYSjVjM1J5YVc1bklDczlJQ2NtSnp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR2xtSUNoMGVYQmxiMllnY0dGeVlXMHVZMjlzYkdWamRHbHZia1p2Y20xaGRDQWhQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNiaUFnSUNBZ0lDQWdJQ0IyWVhJZ2NYQWdQU0JoY21kelczQmhjbUZ0TG01aGJXVmRPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLRUZ5Y21GNUxtbHpRWEp5WVhrb2NYQXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnhkV1Z5ZVhOMGNtbHVaeUFyUFNCMGFHbHpMbVZ1WTI5a1pWRjFaWEo1UTI5c2JHVmpkR2x2Ymlod1lYSmhiUzVqYjJ4c1pXTjBhVzl1Um05eWJXRjBMQ0J3WVhKaGJTNXVZVzFsTENCeGNDazdYRzRnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIRjFaWEo1YzNSeWFXNW5JQ3M5SUhSb2FYTXVaVzVqYjJSbFVYVmxjbmxRWVhKaGJTaHdZWEpoYlM1dVlXMWxLU0FySUNjOUp5QXJJSFJvYVhNdVpXNWpiMlJsVVhWbGNubFFZWEpoYlNoaGNtZHpXM0JoY21GdExtNWhiV1ZkS1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnY1hWbGNubHpkSEpwYm1jZ0t6MGdkR2hwY3k1bGJtTnZaR1ZSZFdWeWVWQmhjbUZ0S0hCaGNtRnRMbTVoYldVcElDc2dKejBuSUNzZ2RHaHBjeTVsYm1OdlpHVlJkV1Z5ZVZCaGNtRnRLR0Z5WjNOYmNHRnlZVzB1Ym1GdFpWMHBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hCaGNtRnRMbWx1SUQwOVBTQW5abTl5YlVSaGRHRW5LU0I3WEc0Z0lDQWdJQ0FnSUdadmNtMVFZWEpoYlhOYmNHRnlZVzB1Ym1GdFpWMGdQU0JoY21kelczQmhjbUZ0TG01aGJXVmRPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dUlDQjJZWElnZFhKc0lEMGdkR2hwY3k1elkyaGxiV1VnS3lBbk9pOHZKeUFySUhSb2FYTXVhRzl6ZER0Y2JseHVJQ0JwWmlBb2RHaHBjeTVpWVhObFVHRjBhQ0FoUFQwZ0p5OG5LU0I3WEc0Z0lDQWdkWEpzSUNzOUlIUm9hWE11WW1GelpWQmhkR2c3WEc0Z0lIMWNiaUFnY21WMGRYSnVJSFZ5YkNBcklISmxjWFZsYzNSVmNtd2dLeUJ4ZFdWeWVYTjBjbWx1Wnp0Y2JuMDdYRzVjYms5d1pYSmhkR2x2Ymk1d2NtOTBiM1I1Y0dVdVoyVjBUV2x6YzJsdVoxQmhjbUZ0Y3lBOUlHWjFibU4wYVc5dUlDaGhjbWR6S1NCN1hHNGdJSFpoY2lCdGFYTnphVzVuVUdGeVlXMXpJRDBnVzEwN0lDOHZJR05vWldOcklISmxjWFZwY21Wa0lIQmhjbUZ0Y3l3Z2RISmhZMnNnZEdobElHOXVaWE1nZEdoaGRDQmhjbVVnYldsemMybHVaMXh1SUNCMllYSWdhVHRjYmx4dUlDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z2RHaHBjeTV3WVhKaGJXVjBaWEp6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ2RtRnlJSEJoY21GdElEMGdkR2hwY3k1d1lYSmhiV1YwWlhKelcybGRPMXh1WEc0Z0lDQWdhV1lnS0hCaGNtRnRMbkpsY1hWcGNtVmtJRDA5UFNCMGNuVmxLU0I3WEc0Z0lDQWdJQ0JwWmlBb2RIbHdaVzltSUdGeVozTmJjR0Z5WVcwdWJtRnRaVjBnUFQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEc0Z0lDQWdJQ0FnSUcxcGMzTnBibWRRWVhKaGJYTWdQU0J3WVhKaGJTNXVZVzFsTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJ0YVhOemFXNW5VR0Z5WVcxek8xeHVmVHRjYmx4dVQzQmxjbUYwYVc5dUxuQnliM1J2ZEhsd1pTNW5aWFJDYjJSNUlEMGdablZ1WTNScGIyNGdLR2hsWVdSbGNuTXNJR0Z5WjNNc0lHOXdkSE1wSUh0Y2JpQWdkbUZ5SUdadmNtMVFZWEpoYlhNZ1BTQjdmU3dnWW05a2VTd2dhMlY1TENCMllXeDFaVHRjYmx4dUlDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJSFJvYVhNdWNHRnlZVzFsZEdWeWN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJSFpoY2lCd1lYSmhiU0E5SUhSb2FYTXVjR0Z5WVcxbGRHVnljMXRwWFR0Y2JseHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ1lYSm5jMXR3WVhKaGJTNXVZVzFsWFNBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JpQWdJQ0FnSUdsbUlDaHdZWEpoYlM1cGJpQTlQVDBnSjJKdlpIa25LU0I3WEc0Z0lDQWdJQ0FnSUdKdlpIa2dQU0JoY21kelczQmhjbUZ0TG01aGJXVmRPMXh1SUNBZ0lDQWdmU0JsYkhObElHbG1JQ2h3WVhKaGJTNXBiaUE5UFQwZ0oyWnZjbTFFWVhSaEp5a2dlMXh1SUNBZ0lDQWdJQ0JtYjNKdFVHRnlZVzF6VzNCaGNtRnRMbTVoYldWZElEMGdZWEpuYzF0d1lYSmhiUzV1WVcxbFhUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZMeUJvWVc1a2JHVWdabTl5YlNCd1lYSmhiWE5jYmlBZ2FXWWdLR2hsWVdSbGNuTmJKME52Ym5SbGJuUXRWSGx3WlNkZElEMDlQU0FuWVhCd2JHbGpZWFJwYjI0dmVDMTNkM2N0Wm05eWJTMTFjbXhsYm1OdlpHVmtKeWtnZTF4dUlDQWdJSFpoY2lCbGJtTnZaR1ZrSUQwZ0p5YzdYRzVjYmlBZ0lDQm1iM0lnS0d0bGVTQnBiaUJtYjNKdFVHRnlZVzF6S1NCN1hHNGdJQ0FnSUNCMllXeDFaU0E5SUdadmNtMVFZWEpoYlhOYmEyVjVYVHRjYmx4dUlDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCMllXeDFaU0FoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHVnVZMjlrWldRZ0lUMDlJQ2NuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdaVzVqYjJSbFpDQXJQU0FuSmljN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JsYm1OdlpHVmtJQ3M5SUdWdVkyOWtaVlZTU1VOdmJYQnZibVZ1ZENoclpYa3BJQ3NnSnowbklDc2daVzVqYjJSbFZWSkpRMjl0Y0c5dVpXNTBLSFpoYkhWbEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCaWIyUjVJRDBnWlc1amIyUmxaRHRjYmlBZ2ZTQmxiSE5sSUdsbUlDaG9aV0ZrWlhKeld5ZERiMjUwWlc1MExWUjVjR1VuWFNBbUppQm9aV0ZrWlhKeld5ZERiMjUwWlc1MExWUjVjR1VuWFM1cGJtUmxlRTltS0NkdGRXeDBhWEJoY25RdlptOXliUzFrWVhSaEp5a2dQajBnTUNrZ2UxeHVJQ0FnSUdsbUlDaHZjSFJ6TG5WelpVcFJkV1Z5ZVNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR0p2WkhsUVlYSmhiU0E5SUc1bGR5QkdiM0p0UkdGMFlTZ3BPMXh1WEc0Z0lDQWdJQ0JpYjJSNVVHRnlZVzB1ZEhsd1pTQTlJQ2RtYjNKdFJHRjBZU2M3WEc1Y2JpQWdJQ0FnSUdadmNpQW9hMlY1SUdsdUlHWnZjbTFRWVhKaGJYTXBJSHRjYmlBZ0lDQWdJQ0FnZG1Gc2RXVWdQU0JoY21kelcydGxlVjA3WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQjJZV3gxWlNBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJ5WlhGMWFYSmxaQ0JtYjNJZ2FuRjFaWEo1SUdacGJHVWdkWEJzYjJGa1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0haaGJIVmxMblI1Y0dVZ1BUMDlJQ2RtYVd4bEp5QW1KaUIyWVd4MVpTNTJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWc1pYUmxJR2hsWVdSbGNuTmJKME52Ym5SbGJuUXRWSGx3WlNkZE8xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCaWIyUjVVR0Z5WVcwdVlYQndaVzVrS0d0bGVTd2dkbUZzZFdVdWRtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JpYjJSNVVHRnlZVzB1WVhCd1pXNWtLR3RsZVN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JpYjJSNUlEMGdZbTlrZVZCaGNtRnRPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQmliMlI1TzF4dWZUdGNibHh1THlvcVhHNGdLaUJuWlhSeklITmhiWEJzWlNCeVpYTndiMjV6WlNCbWIzSWdZU0J6YVc1bmJHVWdiM0JsY21GMGFXOXVYRzRnS2lvdlhHNVBjR1Z5WVhScGIyNHVjSEp2ZEc5MGVYQmxMbWRsZEUxdlpHVnNVMkZ0Y0d4bFNsTlBUaUE5SUdaMWJtTjBhVzl1SUNoMGVYQmxMQ0J0YjJSbGJITXBJSHRjYmlBZ2RtRnlJR2x6VUhKcGJXbDBhWFpsTENCc2FYTjBWSGx3WlN3Z2MyRnRjR3hsU25OdmJqdGNibHh1SUNCc2FYTjBWSGx3WlNBOUlDaDBlWEJsSUdsdWMzUmhibU5sYjJZZ1FYSnlZWGtwTzF4dUlDQnBjMUJ5YVcxcGRHbDJaU0E5SUcxdlpHVnNjMXQwZVhCbFhTQS9JR1poYkhObElEb2dkSEoxWlR0Y2JpQWdjMkZ0Y0d4bFNuTnZiaUE5SUdselVISnBiV2wwYVhabElEOGdkbTlwWkNBd0lEb2diVzlrWld4elczUjVjR1ZkTG1OeVpXRjBaVXBUVDA1VFlXMXdiR1VvS1R0Y2JseHVJQ0JwWmlBb2MyRnRjR3hsU25OdmJpa2dlMXh1SUNBZ0lITmhiWEJzWlVwemIyNGdQU0JzYVhOMFZIbHdaU0EvSUZ0ellXMXdiR1ZLYzI5dVhTQTZJSE5oYlhCc1pVcHpiMjQ3WEc1Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUhOaGJYQnNaVXB6YjI0Z1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjMkZ0Y0d4bFNuTnZianRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dWdlppQnpZVzF3YkdWS2MyOXVJRDA5UFNBbmIySnFaV04wSnlrZ2UxeHVJQ0FnSUNBZ2RtRnlJSFFnUFNCellXMXdiR1ZLYzI5dU8xeHVYRzRnSUNBZ0lDQnBaaUFvYzJGdGNHeGxTbk52YmlCcGJuTjBZVzVqWlc5bUlFRnljbUY1SUNZbUlITmhiWEJzWlVwemIyNHViR1Z1WjNSb0lENGdNQ2tnZTF4dUlDQWdJQ0FnSUNCMElEMGdjMkZ0Y0d4bFNuTnZibHN3WFR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2FXWWdLSFF1Ym05a1pVNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSGh0YkZOMGNtbHVaeUE5SUc1bGR5QllUVXhUWlhKcFlXeHBlbVZ5S0NrdWMyVnlhV0ZzYVhwbFZHOVRkSEpwYm1jb2RDazdYRzVjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVptOXliV0YwV0cxc0tIaHRiRk4wY21sdVp5azdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1NsTlBUaTV6ZEhKcGJtZHBabmtvYzJGdGNHeGxTbk52Yml3Z2JuVnNiQ3dnTWlrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnpZVzF3YkdWS2MyOXVPMXh1SUNBZ0lIMWNiaUFnZlZ4dWZUdGNibHh1THlvcVhHNGdLaUJzWldkaFkza2dZbWx1WkdsdVoxeHVJQ29xTDF4dVQzQmxjbUYwYVc5dUxuQnliM1J2ZEhsd1pTNWtieUE5SUdaMWJtTjBhVzl1SUNoaGNtZHpMQ0J2Y0hSekxDQmpZV3hzWW1GamF5d2daWEp5YjNJc0lIQmhjbVZ1ZENrZ2UxeHVJQ0J5WlhSMWNtNGdkR2hwY3k1bGVHVmpkWFJsS0dGeVozTXNJRzl3ZEhNc0lHTmhiR3hpWVdOckxDQmxjbkp2Y2l3Z2NHRnlaVzUwS1R0Y2JuMDdYRzVjYmk4cUtseHVJQ29nWlhobFkzVjBaWE1nWVc0Z2IzQmxjbUYwYVc5dVhHNGdLaW92WEc1UGNHVnlZWFJwYjI0dWNISnZkRzkwZVhCbExtVjRaV04xZEdVZ1BTQm1kVzVqZEdsdmJpQW9ZWEpuTVN3Z1lYSm5NaXdnWVhKbk15d2dZWEpuTkN3Z2NHRnlaVzUwS1NCN1hHNGdJSFpoY2lCaGNtZHpJRDBnWVhKbk1TQjhmQ0I3ZlR0Y2JpQWdkbUZ5SUc5d2RITWdQU0I3ZlN3Z2MzVmpZMlZ6Y3l3Z1pYSnliM0k3WEc1Y2JpQWdhV1lnS0hSNWNHVnZaaUJoY21jeUlEMDlQU0FuYjJKcVpXTjBKeWtnZTF4dUlDQWdJRzl3ZEhNZ1BTQmhjbWN5TzF4dUlDQWdJSE4xWTJObGMzTWdQU0JoY21jek8xeHVJQ0FnSUdWeWNtOXlJRDBnWVhKbk5EdGNiaUFnZlZ4dVhHNGdJR2xtSUNoMGVYQmxiMllnWVhKbk1pQTlQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUhOMVkyTmxjM01nUFNCaGNtY3lPMXh1SUNBZ0lHVnljbTl5SUQwZ1lYSm5NenRjYmlBZ2ZWeHVYRzRnSUhOMVkyTmxjM01nUFNBb2MzVmpZMlZ6Y3lCOGZDQm9aV3h3WlhKekxteHZaeWs3WEc0Z0lHVnljbTl5SUQwZ0tHVnljbTl5SUh4OElHaGxiSEJsY25NdWJHOW5LVHRjYmx4dUlDQnBaaUFvYjNCMGN5NTFjMlZLVVhWbGNua3BJSHRjYmlBZ0lDQjBhR2x6TG5WelpVcFJkV1Z5ZVNBOUlHOXdkSE11ZFhObFNsRjFaWEo1TzF4dUlDQjlYRzVjYmlBZ2RtRnlJRzFwYzNOcGJtZFFZWEpoYlhNZ1BTQjBhR2x6TG1kbGRFMXBjM05wYm1kUVlYSmhiWE1vWVhKbmN5azdYRzVjYmlBZ2FXWWdLRzFwYzNOcGJtZFFZWEpoYlhNdWJHVnVaM1JvSUQ0Z01Da2dlMXh1SUNBZ0lIWmhjaUJ0WlhOellXZGxJRDBnSjIxcGMzTnBibWNnY21WeGRXbHlaV1FnY0dGeVlXMXpPaUFuSUNzZ2JXbHpjMmx1WjFCaGNtRnRjenRjYmx4dUlDQWdJR2hsYkhCbGNuTXVabUZwYkNodFpYTnpZV2RsS1R0Y2JseHVJQ0FnSUhKbGRIVnlianRjYmlBZ2ZWeHVYRzRnSUhaaGNpQmhiR3hJWldGa1pYSnpJRDBnZEdocGN5NW5aWFJJWldGa1pYSlFZWEpoYlhNb1lYSm5jeWs3WEc0Z0lIWmhjaUJqYjI1MFpXNTBWSGx3WlVobFlXUmxjbk1nUFNCMGFHbHpMbk5sZEVOdmJuUmxiblJVZVhCbGN5aGhjbWR6TENCdmNIUnpLVHRjYmlBZ2RtRnlJR2hsWVdSbGNuTWdQU0I3ZlN3Z1lYUjBjbTVoYldVN1hHNWNiaUFnWm05eUlDaGhkSFJ5Ym1GdFpTQnBiaUJoYkd4SVpXRmtaWEp6S1NCN0lHaGxZV1JsY25OYllYUjBjbTVoYldWZElEMGdZV3hzU0dWaFpHVnljMXRoZEhSeWJtRnRaVjA3SUgxY2JpQWdabTl5SUNoaGRIUnlibUZ0WlNCcGJpQmpiMjUwWlc1MFZIbHdaVWhsWVdSbGNuTXBJSHNnYUdWaFpHVnljMXRoZEhSeWJtRnRaVjBnUFNCamIyNTBaVzUwVkhsd1pVaGxZV1JsY25OYllYUjBjbTVoYldWZE95QjlYRzVjYmlBZ2RtRnlJR0p2WkhrZ1BTQjBhR2x6TG1kbGRFSnZaSGtvYUdWaFpHVnljeXdnWVhKbmN5d2diM0IwY3lrN1hHNGdJSFpoY2lCMWNtd2dQU0IwYUdsekxuVnliR2xtZVNoaGNtZHpLVHRjYmx4dUlDQnBaaWgxY213dWFXNWtaWGhQWmlnbkxudG1iM0p0WVhSOUp5a2dQaUF3S1NCN1hHNGdJQ0FnYVdZb2FHVmhaR1Z5Y3lrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1p2Y20xaGRDQTlJR2hsWVdSbGNuTXVRV05qWlhCMElIeDhJR2hsWVdSbGNuTXVZV05qWlhCME8xeHVJQ0FnSUNBZ2FXWW9abTl5YldGMElDWW1JR1p2Y20xaGRDNXBibVJsZUU5bUtDZHFjMjl1SnlrZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUhWeWJDQTlJSFZ5YkM1eVpYQnNZV05sS0NjdWUyWnZjbTFoZEgwbkxDQW5MbXB6YjI0bktUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHVnNjMlVnYVdZb1ptOXliV0YwSUNZbUlHWnZjbTFoZEM1cGJtUmxlRTltS0NkNGJXd25LU0ErSURBcElIdGNiaUFnSUNBZ0lDQWdkWEpzSUQwZ2RYSnNMbkpsY0d4aFkyVW9KeTU3Wm05eWJXRjBmU2NzSUNjdWVHMXNKeWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnZG1GeUlHOWlhaUE5SUh0Y2JpQWdJQ0IxY213NklIVnliQ3hjYmlBZ0lDQnRaWFJvYjJRNklIUm9hWE11YldWMGFHOWtMblJ2VlhCd1pYSkRZWE5sS0Nrc1hHNGdJQ0FnWW05a2VUb2dZbTlrZVN4Y2JpQWdJQ0IxYzJWS1VYVmxjbms2SUhSb2FYTXVkWE5sU2xGMVpYSjVMRnh1SUNBZ0lHaGxZV1JsY25NNklHaGxZV1JsY25Nc1hHNGdJQ0FnYjI0NklIdGNiaUFnSUNBZ0lISmxjM0J2Ym5ObE9pQm1kVzVqZEdsdmJpQW9jbVZ6Y0c5dWMyVXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSE4xWTJObGMzTW9jbVZ6Y0c5dWMyVXNJSEJoY21WdWRDazdYRzRnSUNBZ0lDQjlMRnh1SUNBZ0lDQWdaWEp5YjNJNklHWjFibU4wYVc5dUlDaHlaWE53YjI1elpTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaWEp5YjNJb2NtVnpjRzl1YzJVc0lIQmhjbVZ1ZENrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlPMXh1WEc0Z0lIUm9hWE11WTJ4cFpXNTBRWFYwYUc5eWFYcGhkR2x2Ym5NdVlYQndiSGtvYjJKcUxDQjBhR2x6TG05d1pYSmhkR2x2Ymk1elpXTjFjbWwwZVNrN1hHNGdJR2xtSUNodmNIUnpMbTF2WTJzZ1BUMDlJSFJ5ZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnYjJKcU8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHNWxkeUJUZDJGbloyVnlTSFIwY0NncExtVjRaV04xZEdVb2IySnFMQ0J2Y0hSektUdGNiaUFnZlZ4dWZUdGNibHh1VDNCbGNtRjBhVzl1TG5CeWIzUnZkSGx3WlM1elpYUkRiMjUwWlc1MFZIbHdaWE1nUFNCbWRXNWpkR2x2YmlBb1lYSm5jeXdnYjNCMGN5a2dlMXh1SUNBdkx5QmtaV1poZFd4MElIUjVjR1ZjYmlBZ2RtRnlJR0ZqWTJWd2RITWdQU0FuWVhCd2JHbGpZWFJwYjI0dmFuTnZiaWM3WEc0Z0lIWmhjaUJoYkd4RVpXWnBibVZrVUdGeVlXMXpJRDBnZEdocGN5NXdZWEpoYldWMFpYSnpPMXh1SUNCMllYSWdZbTlrZVR0Y2JpQWdkbUZ5SUdOdmJuTjFiV1Z6SUQwZ1lYSm5jeTV3WVhKaGJXVjBaWEpEYjI1MFpXNTBWSGx3WlNCOGZDQW5ZWEJ3YkdsallYUnBiMjR2YW5OdmJpYzdYRzRnSUhaaGNpQmtaV1pwYm1Wa1JtbHNaVkJoY21GdGN5QTlJRnRkTzF4dUlDQjJZWElnWkdWbWFXNWxaRVp2Y20xUVlYSmhiWE1nUFNCYlhUdGNiaUFnZG1GeUlHaGxZV1JsY25NZ1BTQjdmVHRjYmlBZ2RtRnlJR2s3WEc1Y2JpQWdMeThnWjJWMElIQmhjbUZ0Y3lCbWNtOXRJSFJvWlNCdmNHVnlZWFJwYjI0Z1lXNWtJSE5sZENCMGFHVnRJR2x1SUdSbFptbHVaV1JHYVd4bFVHRnlZVzF6TENCa1pXWnBibVZrUm05eWJWQmhjbUZ0Y3l3Z2FHVmhaR1Z5YzF4dUlDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z1lXeHNSR1ZtYVc1bFpGQmhjbUZ0Y3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lIWmhjaUJ3WVhKaGJTQTlJR0ZzYkVSbFptbHVaV1JRWVhKaGJYTmJhVjA3WEc1Y2JpQWdJQ0JwWmlBb2NHRnlZVzB1YVc0Z1BUMDlJQ2RtYjNKdFJHRjBZU2NwSUh0Y2JpQWdJQ0FnSUdsbUlDaHdZWEpoYlM1MGVYQmxJRDA5UFNBblptbHNaU2NwSUh0Y2JpQWdJQ0FnSUNBZ1pHVm1hVzVsWkVacGJHVlFZWEpoYlhNdWNIVnphQ2h3WVhKaGJTazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQmtaV1pwYm1Wa1JtOXliVkJoY21GdGN5NXdkWE5vS0hCaGNtRnRLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSEJoY21GdExtbHVJRDA5UFNBbmFHVmhaR1Z5SnlBbUppQnZjSFJ6S1NCN1hHNGdJQ0FnSUNCMllYSWdhMlY1SUQwZ2NHRnlZVzB1Ym1GdFpUdGNiaUFnSUNBZ0lIWmhjaUJvWldGa1pYSldZV3gxWlNBOUlHOXdkSE5iY0dGeVlXMHVibUZ0WlYwN1hHNWNiaUFnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdiM0IwYzF0d1lYSmhiUzV1WVcxbFhTQWhQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNiaUFnSUNBZ0lDQWdhR1ZoWkdWeWMxdHJaWGxkSUQwZ2FHVmhaR1Z5Vm1Gc2RXVTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHdZWEpoYlM1cGJpQTlQVDBnSjJKdlpIa25JQ1ltSUhSNWNHVnZaaUJoY21kelczQmhjbUZ0TG01aGJXVmRJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lDQWdZbTlrZVNBOUlHRnlaM05iY0dGeVlXMHVibUZ0WlYwN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdhV1lnZEdobGNtVW5jeUJoSUdKdlpIa3NJRzVsWldRZ2RHOGdjMlYwSUhSb1pTQmpiMjV6ZFcxbGN5Qm9aV0ZrWlhJZ2RtbGhJSEpsY1hWbGMzUkRiMjUwWlc1MFZIbHdaVnh1SUNCcFppQW9ZbTlrZVNBbUppQW9kR2hwY3k1dFpYUm9iMlFnUFQwOUlDZHdiM04wSnlCOGZDQjBhR2x6TG0xbGRHaHZaQ0E5UFQwZ0ozQjFkQ2NnZkh3Z2RHaHBjeTV0WlhSb2IyUWdQVDA5SUNkd1lYUmphQ2NnZkh3Z2RHaHBjeTV0WlhSb2IyUWdQVDA5SUNka1pXeGxkR1VuS1NrZ2UxeHVJQ0FnSUdsbUlDaHZjSFJ6TG5KbGNYVmxjM1JEYjI1MFpXNTBWSGx3WlNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1Z0WlhNZ1BTQnZjSFJ6TG5KbGNYVmxjM1JEYjI1MFpXNTBWSGx3WlR0Y2JpQWdJQ0I5WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnTHk4Z2FXWWdZVzU1SUdadmNtMGdjR0Z5WVcxekxDQmpiMjUwWlc1MElIUjVjR1VnYlhWemRDQmlaU0J6WlhSY2JpQWdJQ0JwWmlBb1pHVm1hVzVsWkVadmNtMVFZWEpoYlhNdWJHVnVaM1JvSUQ0Z01Da2dlMXh1SUNBZ0lDQWdhV1lnS0c5d2RITXVjbVZ4ZFdWemRFTnZiblJsYm5SVWVYQmxLU0I3SUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJRzkyWlhKeWFXUmxJR2xtSUhObGRGeHVJQ0FnSUNBZ0lDQmpiMjV6ZFcxbGN5QTlJRzl3ZEhNdWNtVnhkV1Z6ZEVOdmJuUmxiblJVZVhCbE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGtaV1pwYm1Wa1JtbHNaVkJoY21GdGN5NXNaVzVuZEdnZ1BpQXdLU0I3SUM4dklHbG1JR0VnWm1sc1pTd2diWFZ6ZENCaVpTQnRkV3gwYVhCaGNuUXZabTl5YlMxa1lYUmhYRzRnSUNBZ0lDQWdJR052Ym5OMWJXVnpJRDBnSjIxMWJIUnBjR0Z5ZEM5bWIzSnRMV1JoZEdFbk8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUhzZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHUmxabUYxYkhRZ2RHOGdlQzEzZDNjdFpuSnZiUzExY214bGJtTnZaR1ZrWEc0Z0lDQWdJQ0FnSUdOdmJuTjFiV1Z6SUQwZ0oyRndjR3hwWTJGMGFXOXVMM2d0ZDNkM0xXWnZjbTB0ZFhKc1pXNWpiMlJsWkNjN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJR2xtSUNoMGFHbHpMblI1Y0dVZ1BUMDlJQ2RFUlV4RlZFVW5LU0I3WEc0Z0lDQWdJQ0JpYjJSNUlEMGdKM3Q5Snp0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb2FYTXVkSGx3WlNBaFBUMGdKMFJGVEVWVVJTY3BJSHRjYmlBZ0lDQWdJR052Ym5OMWJXVnpJRDBnYm5Wc2JEdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnBaaUFvWTI5dWMzVnRaWE1nSmlZZ2RHaHBjeTVqYjI1emRXMWxjeWtnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbU52Ym5OMWJXVnpMbWx1WkdWNFQyWW9ZMjl1YzNWdFpYTXBJRDA5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdhR1ZzY0dWeWN5NXNiMmNvSjNObGNuWmxjaUJrYjJWemJseGNKM1FnWTI5dWMzVnRaU0FuSUNzZ1kyOXVjM1Z0WlhNZ0t5QW5MQ0IwY25rZ0p5QXJJRXBUVDA0dWMzUnlhVzVuYVdaNUtIUm9hWE11WTI5dWMzVnRaWE1wS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCcFppQW9iM0IwY3k1eVpYTndiMjV6WlVOdmJuUmxiblJVZVhCbEtTQjdYRzRnSUNBZ1lXTmpaWEIwY3lBOUlHOXdkSE11Y21WemNHOXVjMlZEYjI1MFpXNTBWSGx3WlR0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCaFkyTmxjSFJ6SUQwZ0oyRndjR3hwWTJGMGFXOXVMMnB6YjI0bk8xeHVJQ0I5WEc1Y2JpQWdhV1lnS0dGalkyVndkSE1nSmlZZ2RHaHBjeTV3Y205a2RXTmxjeWtnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbkJ5YjJSMVkyVnpMbWx1WkdWNFQyWW9ZV05qWlhCMGN5a2dQVDA5SUMweEtTQjdYRzRnSUNBZ0lDQm9aV3h3WlhKekxteHZaeWduYzJWeWRtVnlJR05oYmx4Y0ozUWdjSEp2WkhWalpTQW5JQ3NnWVdOalpYQjBjeWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnYVdZZ0tDaGpiMjV6ZFcxbGN5QW1KaUJpYjJSNUlDRTlQU0FuSnlrZ2ZId2dLR052Ym5OMWJXVnpJRDA5UFNBbllYQndiR2xqWVhScGIyNHZlQzEzZDNjdFptOXliUzExY214bGJtTnZaR1ZrSnlrcElIdGNiaUFnSUNCb1pXRmtaWEp6V3lkRGIyNTBaVzUwTFZSNWNHVW5YU0E5SUdOdmJuTjFiV1Z6TzF4dUlDQjlYRzVjYmlBZ2FXWWdLR0ZqWTJWd2RITXBJSHRjYmlBZ0lDQm9aV0ZrWlhKekxrRmpZMlZ3ZENBOUlHRmpZMlZ3ZEhNN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2FHVmhaR1Z5Y3p0Y2JuMDdYRzVjYms5d1pYSmhkR2x2Ymk1d2NtOTBiM1I1Y0dVdVlYTkRkWEpzSUQwZ1puVnVZM1JwYjI0Z0tHRnlaM01wSUh0Y2JpQWdkbUZ5SUc5aWFpQTlJSFJvYVhNdVpYaGxZM1YwWlNoaGNtZHpMQ0I3Ylc5amF6b2dkSEoxWlgwcE8xeHVYRzRnSUhSb2FYTXVZMnhwWlc1MFFYVjBhRzl5YVhwaGRHbHZibk11WVhCd2JIa29iMkpxS1R0Y2JseHVJQ0IyWVhJZ2NtVnpkV3gwY3lBOUlGdGRPMXh1WEc0Z0lISmxjM1ZzZEhNdWNIVnphQ2duTFZnZ0p5QXJJSFJvYVhNdWJXVjBhRzlrTG5SdlZYQndaWEpEWVhObEtDa3BPMXh1WEc0Z0lHbG1JQ2h2WW1vdWFHVmhaR1Z5Y3lrZ2UxeHVJQ0FnSUhaaGNpQnJaWGs3WEc1Y2JpQWdJQ0JtYjNJZ0tHdGxlU0JwYmlCdlltb3VhR1ZoWkdWeWN5a2dlMXh1SUNBZ0lDQWdjbVZ6ZFd4MGN5NXdkWE5vS0NjdExXaGxZV1JsY2lCY0lpY2dLeUJyWlhrZ0t5QW5PaUFuSUNzZ2IySnFMbWhsWVdSbGNuTmJhMlY1WFNBcklDZGNJaWNwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUdsbUlDaHZZbW91WW05a2VTa2dlMXh1SUNBZ0lIWmhjaUJpYjJSNU8xeHVYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQnZZbW91WW05a2VTQTlQVDBnSjI5aWFtVmpkQ2NwSUh0Y2JpQWdJQ0FnSUdKdlpIa2dQU0JLVTA5T0xuTjBjbWx1WjJsbWVTaHZZbW91WW05a2VTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdKdlpIa2dQU0J2WW1vdVltOWtlVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWE4xYkhSekxuQjFjMmdvSnkxa0lGd2lKeUFySUdKdlpIa3VjbVZ3YkdGalpTZ3ZYQ0l2Wnl3Z0oxeGNYRnhjSWljcElDc2dKMXdpSnlrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z0oyTjFjbXdnSnlBcklDaHlaWE4xYkhSekxtcHZhVzRvSnlBbktTa2dLeUFuSUZ3aUp5QXJJRzlpYWk1MWNtd2dLeUFuWENJbk8xeHVmVHRjYmx4dVQzQmxjbUYwYVc5dUxuQnliM1J2ZEhsd1pTNWxibU52WkdWUVlYUm9RMjlzYkdWamRHbHZiaUE5SUdaMWJtTjBhVzl1SUNoMGVYQmxMQ0J1WVcxbExDQjJZV3gxWlNrZ2UxeHVJQ0IyWVhJZ1pXNWpiMlJsWkNBOUlDY25PMXh1SUNCMllYSWdhVHRjYmlBZ2RtRnlJSE5sY0dGeVlYUnZjaUE5SUNjbk8xeHVYRzRnSUdsbUlDaDBlWEJsSUQwOVBTQW5jM04ySnlrZ2UxeHVJQ0FnSUhObGNHRnlZWFJ2Y2lBOUlDY2xNakFuTzF4dUlDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dVZ1BUMDlJQ2QwYzNZbktTQjdYRzRnSUNBZ2MyVndZWEpoZEc5eUlEMGdKMXhjWEZ4MEp6dGNiaUFnZlNCbGJITmxJR2xtSUNoMGVYQmxJRDA5UFNBbmNHbHdaWE1uS1NCN1hHNGdJQ0FnYzJWd1lYSmhkRzl5SUQwZ0ozd25PMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSE5sY0dGeVlYUnZjaUE5SUNjc0p6dGNiaUFnZlZ4dVhHNGdJR1p2Y2lBb2FTQTlJREE3SUdrZ1BDQjJZV3gxWlM1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHbG1JQ2hwSUQwOVBTQXdLU0I3WEc0Z0lDQWdJQ0JsYm1OdlpHVmtJRDBnZEdocGN5NWxibU52WkdWUmRXVnllVkJoY21GdEtIWmhiSFZsVzJsZEtUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnWlc1amIyUmxaQ0FyUFNCelpYQmhjbUYwYjNJZ0t5QjBhR2x6TG1WdVkyOWtaVkYxWlhKNVVHRnlZVzBvZG1Gc2RXVmJhVjBwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUJsYm1OdlpHVmtPMXh1ZlR0Y2JseHVUM0JsY21GMGFXOXVMbkJ5YjNSdmRIbHdaUzVsYm1OdlpHVlJkV1Z5ZVVOdmJHeGxZM1JwYjI0Z1BTQm1kVzVqZEdsdmJpQW9kSGx3WlN3Z2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ2RtRnlJR1Z1WTI5a1pXUWdQU0FuSnp0Y2JpQWdkbUZ5SUdrN1hHNWNiaUFnYVdZZ0tIUjVjR1VnUFQwOUlDZGtaV1poZFd4MEp5QjhmQ0IwZVhCbElEMDlQU0FuYlhWc2RHa25LU0I3WEc0Z0lDQWdabTl5SUNocElEMGdNRHNnYVNBOElIWmhiSFZsTG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnBaaUFvYVNBK0lEQXBJSHRsYm1OdlpHVmtJQ3M5SUNjbUp6dDlYRzVjYmlBZ0lDQWdJR1Z1WTI5a1pXUWdLejBnZEdocGN5NWxibU52WkdWUmRXVnllVkJoY21GdEtHNWhiV1VwSUNzZ0p6MG5JQ3NnZEdocGN5NWxibU52WkdWUmRXVnllVkJoY21GdEtIWmhiSFZsVzJsZEtUdGNiaUFnSUNCOVhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RtRnlJSE5sY0dGeVlYUnZjaUE5SUNjbk8xeHVYRzRnSUNBZ2FXWWdLSFI1Y0dVZ1BUMDlJQ2RqYzNZbktTQjdYRzRnSUNBZ0lDQnpaWEJoY21GMGIzSWdQU0FuTENjN1hHNGdJQ0FnZlNCbGJITmxJR2xtSUNoMGVYQmxJRDA5UFNBbmMzTjJKeWtnZTF4dUlDQWdJQ0FnYzJWd1lYSmhkRzl5SUQwZ0p5VXlNQ2M3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2gwZVhCbElEMDlQU0FuZEhOMkp5a2dlMXh1SUNBZ0lDQWdjMlZ3WVhKaGRHOXlJRDBnSjF4Y1hGeDBKenRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dVZ1BUMDlJQ2R3YVhCbGN5Y3BJSHRjYmlBZ0lDQWdJSE5sY0dGeVlYUnZjaUE5SUNkOEp6dGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1VnUFQwOUlDZGljbUZqYTJWMGN5Y3BJSHNnWEc0Z0lDQWdJQ0JtYjNJZ0tHa2dQU0F3T3lCcElEd2dkbUZzZFdVdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHa2dJVDA5SURBcElIdGNiaUFnSUNBZ0lDQWdJQ0JsYm1OdlpHVmtJQ3M5SUNjbUp6dGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdWdVkyOWtaV1FnS3owZ2RHaHBjeTVsYm1OdlpHVlJkV1Z5ZVZCaGNtRnRLRzVoYldVcElDc2dKMXRkUFNjZ0t5QjBhR2x6TG1WdVkyOWtaVkYxWlhKNVVHRnlZVzBvZG1Gc2RXVmJhVjBwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJR2xtSUNoelpYQmhjbUYwYjNJZ0lUMDlJQ2NuS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR2tnUFNBd095QnBJRHdnZG1Gc2RXVXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR2tnUFQwOUlEQXBJSHRjYmlBZ0lDQWdJQ0FnSUNCbGJtTnZaR1ZrSUQwZ2RHaHBjeTVsYm1OdlpHVlJkV1Z5ZVZCaGNtRnRLRzVoYldVcElDc2dKejBuSUNzZ2RHaHBjeTVsYm1OdlpHVlJkV1Z5ZVZCaGNtRnRLSFpoYkhWbFcybGRLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCbGJtTnZaR1ZrSUNzOUlITmxjR0Z5WVhSdmNpQXJJSFJvYVhNdVpXNWpiMlJsVVhWbGNubFFZWEpoYlNoMllXeDFaVnRwWFNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z1pXNWpiMlJsWkR0Y2JuMDdYRzVjYms5d1pYSmhkR2x2Ymk1d2NtOTBiM1I1Y0dVdVpXNWpiMlJsVVhWbGNubFFZWEpoYlNBOUlHWjFibU4wYVc5dUlDaGhjbWNwSUh0Y2JpQWdjbVYwZFhKdUlHVnVZMjlrWlZWU1NVTnZiWEJ2Ym1WdWRDaGhjbWNwTzF4dWZUdGNibHh1THlvcVhHNGdLaUJVVDBSUElISmxkbWx6YVhRc0lHMXBaMmgwSUc1dmRDQjNZVzUwSUhSdklHeGxZWFpsSUNjdkoxeHVJQ29xTDF4dVQzQmxjbUYwYVc5dUxuQnliM1J2ZEhsd1pTNWxibU52WkdWUVlYUm9VR0Z5WVcwZ1BTQm1kVzVqZEdsdmJpQW9jR0YwYUZCaGNtRnRLU0I3WEc0Z0lIWmhjaUJsYm1OUVlYSjBjeXdnY0dGeWRITXNJR2tzSUd4bGJqdGNibHh1SUNCd1lYUm9VR0Z5WVcwZ1BTQndZWFJvVUdGeVlXMHVkRzlUZEhKcGJtY29LVHRjYmx4dUlDQnBaaUFvY0dGMGFGQmhjbUZ0TG1sdVpHVjRUMllvSnk4bktTQTlQVDBnTFRFcElIdGNiaUFnSUNCeVpYUjFjbTRnWlc1amIyUmxWVkpKUTI5dGNHOXVaVzUwS0hCaGRHaFFZWEpoYlNrN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2NHRnlkSE1nUFNCd1lYUm9VR0Z5WVcwdWMzQnNhWFFvSnk4bktUdGNiaUFnSUNCbGJtTlFZWEowY3lBOUlGdGRPMXh1WEc0Z0lDQWdabTl5SUNocElEMGdNQ3dnYkdWdUlEMGdjR0Z5ZEhNdWJHVnVaM1JvT3lCcElEd2diR1Z1T3lCcEt5c3BJSHRjYmlBZ0lDQWdJR1Z1WTFCaGNuUnpMbkIxYzJnb1pXNWpiMlJsVlZKSlEyOXRjRzl1Wlc1MEtIQmhjblJ6VzJsZEtTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUdWdVkxQmhjblJ6TG1wdmFXNG9KeThuS1R0Y2JpQWdmVnh1ZlR0Y2JpSXNJaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHVkbUZ5SUU5d1pYSmhkR2x2YmtkeWIzVndJRDBnYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0JtZFc1amRHbHZiaUFvZEdGbkxDQmtaWE5qY21sd2RHbHZiaXdnWlhoMFpYSnVZV3hFYjJOekxDQnZjR1Z5WVhScGIyNHBJSHRjYmlBZ2RHaHBjeTVrWlhOamNtbHdkR2x2YmlBOUlHUmxjMk55YVhCMGFXOXVPMXh1SUNCMGFHbHpMbVY0ZEdWeWJtRnNSRzlqY3lBOUlHVjRkR1Z5Ym1Gc1JHOWpjenRjYmlBZ2RHaHBjeTV1WVcxbElEMGdkR0ZuTzF4dUlDQjBhR2x6TG05d1pYSmhkR2x2YmlBOUlHOXdaWEpoZEdsdmJqdGNiaUFnZEdocGN5NXZjR1Z5WVhScGIyNXpRWEp5WVhrZ1BTQmJYVHRjYmlBZ2RHaHBjeTV3WVhSb0lEMGdkR0ZuTzF4dUlDQjBhR2x6TG5SaFp5QTlJSFJoWnp0Y2JuMDdYRzVjYms5d1pYSmhkR2x2YmtkeWIzVndMbkJ5YjNSdmRIbHdaUzV6YjNKMElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhHNTlPMXh1WEc0aUxDSXZLaUZjYmlBcUlGUm9aU0JpZFdabVpYSWdiVzlrZFd4bElHWnliMjBnYm05a1pTNXFjeXdnWm05eUlIUm9aU0JpY205M2MyVnlMbHh1SUNwY2JpQXFJRUJoZFhSb2IzSWdJQ0JHWlhKdmMzTWdRV0p2ZFd0b1lXUnBhbVZvSUR4bVpYSnZjM05BWm1WeWIzTnpMbTl5Wno0Z1BHaDBkSEE2THk5bVpYSnZjM011YjNKblBseHVJQ29nUUd4cFkyVnVjMlVnSUUxSlZGeHVJQ292WEc1Y2JuWmhjaUJpWVhObE5qUWdQU0J5WlhGMWFYSmxLQ2RpWVhObE5qUXRhbk1uS1Z4dWRtRnlJR2xsWldVM05UUWdQU0J5WlhGMWFYSmxLQ2RwWldWbE56VTBKeWxjYm5aaGNpQnBjMEZ5Y21GNUlEMGdjbVZ4ZFdseVpTZ25hWE10WVhKeVlYa25LVnh1WEc1bGVIQnZjblJ6TGtKMVptWmxjaUE5SUVKMVptWmxjbHh1Wlhod2IzSjBjeTVUYkc5M1FuVm1abVZ5SUQwZ1UyeHZkMEoxWm1abGNseHVaWGh3YjNKMGN5NUpUbE5RUlVOVVgwMUJXRjlDV1ZSRlV5QTlJRFV3WEc1Q2RXWm1aWEl1Y0c5dmJGTnBlbVVnUFNBNE1Ua3lJQzh2SUc1dmRDQjFjMlZrSUdKNUlIUm9hWE1nYVcxd2JHVnRaVzUwWVhScGIyNWNibHh1ZG1GeUlHdE5ZWGhNWlc1bmRHZ2dQU0F3ZURObVptWm1abVptWEc1MllYSWdjbTl2ZEZCaGNtVnVkQ0E5SUh0OVhHNWNiaThxS2x4dUlDb2dTV1lnWUVKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVWURwY2JpQXFJQ0FnUFQwOUlIUnlkV1VnSUNBZ1ZYTmxJRlZwYm5RNFFYSnlZWGtnYVcxd2JHVnRaVzUwWVhScGIyNGdLR1poYzNSbGMzUXBYRzRnS2lBZ0lEMDlQU0JtWVd4elpTQWdJRlZ6WlNCUFltcGxZM1FnYVcxd2JHVnRaVzUwWVhScGIyNGdLRzF2YzNRZ1kyOXRjR0YwYVdKc1pTd2daWFpsYmlCSlJUWXBYRzRnS2x4dUlDb2dRbkp2ZDNObGNuTWdkR2hoZENCemRYQndiM0owSUhSNWNHVmtJR0Z5Y21GNWN5QmhjbVVnU1VVZ01UQXJMQ0JHYVhKbFptOTRJRFFyTENCRGFISnZiV1VnTnlzc0lGTmhabUZ5YVNBMUxqRXJMRnh1SUNvZ1QzQmxjbUVnTVRFdU5pc3NJR2xQVXlBMExqSXJMbHh1SUNwY2JpQXFJRTV2ZEdVNlhHNGdLbHh1SUNvZ0xTQkpiWEJzWlcxbGJuUmhkR2x2YmlCdGRYTjBJSE4xY0hCdmNuUWdZV1JrYVc1bklHNWxkeUJ3Y205d1pYSjBhV1Z6SUhSdklHQlZhVzUwT0VGeWNtRjVZQ0JwYm5OMFlXNWpaWE11WEc0Z0tpQWdJRVpwY21WbWIzZ2dOQzB5T1NCc1lXTnJaV1FnYzNWd2NHOXlkQ3dnWm1sNFpXUWdhVzRnUm1seVpXWnZlQ0F6TUNzdVhHNGdLaUFnSUZObFpUb2dhSFIwY0hNNkx5OWlkV2Q2YVd4c1lTNXRiM3BwYkd4aExtOXlaeTl6YUc5M1gySjFaeTVqWjJrL2FXUTlOamsxTkRNNExseHVJQ3BjYmlBcUlDQXRJRU5vY205dFpTQTVMVEV3SUdseklHMXBjM05wYm1jZ2RHaGxJR0JVZVhCbFpFRnljbUY1TG5CeWIzUnZkSGx3WlM1emRXSmhjbkpoZVdBZ1puVnVZM1JwYjI0dVhHNGdLbHh1SUNvZ0lDMGdTVVV4TUNCb1lYTWdZU0JpY205clpXNGdZRlI1Y0dWa1FYSnlZWGt1Y0hKdmRHOTBlWEJsTG5OMVltRnljbUY1WUNCbWRXNWpkR2x2YmlCM2FHbGphQ0J5WlhSMWNtNXpJR0Z5Y21GNWN5QnZabHh1SUNvZ0lDQWdhVzVqYjNKeVpXTjBJR3hsYm1kMGFDQnBiaUJ6YjIxbElITnBkSFZoZEdsdmJuTXVYRzRnS2x4dUlDb2dWMlVnWkdWMFpXTjBJSFJvWlhObElHSjFaMmQ1SUdKeWIzZHpaWEp6SUdGdVpDQnpaWFFnWUVKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVWUNCMGJ5QmdabUZzYzJWZ0lITnZJSFJvWlhrZ2QybHNiRnh1SUNvZ1oyVjBJSFJvWlNCUFltcGxZM1FnYVcxd2JHVnRaVzUwWVhScGIyNHNJSGRvYVdOb0lHbHpJSE5zYjNkbGNpQmlkWFFnZDJsc2JDQjNiM0pySUdOdmNuSmxZM1JzZVM1Y2JpQXFMMXh1UW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFnUFNBb1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNCMGNua2dlMXh1SUNBZ0lIWmhjaUJpZFdZZ1BTQnVaWGNnUVhKeVlYbENkV1ptWlhJb01DbGNiaUFnSUNCMllYSWdZWEp5SUQwZ2JtVjNJRlZwYm5RNFFYSnlZWGtvWW5WbUtWeHVJQ0FnSUdGeWNpNW1iMjhnUFNCbWRXNWpkR2x2YmlBb0tTQjdJSEpsZEhWeWJpQTBNaUI5WEc0Z0lDQWdjbVYwZFhKdUlHRnljaTVtYjI4b0tTQTlQVDBnTkRJZ0ppWWdMeThnZEhsd1pXUWdZWEp5WVhrZ2FXNXpkR0Z1WTJWeklHTmhiaUJpWlNCaGRXZHRaVzUwWldSY2JpQWdJQ0FnSUNBZ2RIbHdaVzltSUdGeWNpNXpkV0poY25KaGVTQTlQVDBnSjJaMWJtTjBhVzl1SnlBbUppQXZMeUJqYUhKdmJXVWdPUzB4TUNCc1lXTnJJR0J6ZFdKaGNuSmhlV0JjYmlBZ0lDQWdJQ0FnYm1WM0lGVnBiblE0UVhKeVlYa29NU2t1YzNWaVlYSnlZWGtvTVN3Z01Ta3VZbmwwWlV4bGJtZDBhQ0E5UFQwZ01DQXZMeUJwWlRFd0lHaGhjeUJpY205clpXNGdZSE4xWW1GeWNtRjVZRnh1SUNCOUlHTmhkR05vSUNobEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaaGJITmxYRzRnSUgxY2JuMHBLQ2xjYmx4dUx5b3FYRzRnS2lCRGJHRnpjem9nUW5WbVptVnlYRzRnS2lBOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2x4dUlDb2dWR2hsSUVKMVptWmxjaUJqYjI1emRISjFZM1J2Y2lCeVpYUjFjbTV6SUdsdWMzUmhibU5sY3lCdlppQmdWV2x1ZERoQmNuSmhlV0FnZEdoaGRDQmhjbVVnWVhWbmJXVnVkR1ZrWEc0Z0tpQjNhWFJvSUdaMWJtTjBhVzl1SUhCeWIzQmxjblJwWlhNZ1ptOXlJR0ZzYkNCMGFHVWdibTlrWlNCZ1FuVm1abVZ5WUNCQlVFa2dablZ1WTNScGIyNXpMaUJYWlNCMWMyVmNiaUFxSUdCVmFXNTBPRUZ5Y21GNVlDQnpieUIwYUdGMElITnhkV0Z5WlNCaWNtRmphMlYwSUc1dmRHRjBhVzl1SUhkdmNtdHpJR0Z6SUdWNGNHVmpkR1ZrSUMwdElHbDBJSEpsZEhWeWJuTmNiaUFxSUdFZ2MybHVaMnhsSUc5amRHVjBMbHh1SUNwY2JpQXFJRUo1SUdGMVoyMWxiblJwYm1jZ2RHaGxJR2x1YzNSaGJtTmxjeXdnZDJVZ1kyRnVJR0YyYjJsa0lHMXZaR2xtZVdsdVp5QjBhR1VnWUZWcGJuUTRRWEp5WVhsZ1hHNGdLaUJ3Y205MGIzUjVjR1V1WEc0Z0tpOWNibVoxYm1OMGFXOXVJRUoxWm1abGNpQW9jM1ZpYW1WamRDd2daVzVqYjJScGJtY3BJSHRjYmlBZ2RtRnlJSE5sYkdZZ1BTQjBhR2x6WEc0Z0lHbG1JQ2doS0hObGJHWWdhVzV6ZEdGdVkyVnZaaUJDZFdabVpYSXBLU0J5WlhSMWNtNGdibVYzSUVKMVptWmxjaWh6ZFdKcVpXTjBMQ0JsYm1OdlpHbHVaeWxjYmx4dUlDQjJZWElnZEhsd1pTQTlJSFI1Y0dWdlppQnpkV0pxWldOMFhHNGdJSFpoY2lCc1pXNW5kR2hjYmx4dUlDQnBaaUFvZEhsd1pTQTlQVDBnSjI1MWJXSmxjaWNwSUh0Y2JpQWdJQ0JzWlc1bmRHZ2dQU0FyYzNWaWFtVmpkRnh1SUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1VnUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ2JHVnVaM1JvSUQwZ1FuVm1abVZ5TG1KNWRHVk1aVzVuZEdnb2MzVmlhbVZqZEN3Z1pXNWpiMlJwYm1jcFhHNGdJSDBnWld4elpTQnBaaUFvZEhsd1pTQTlQVDBnSjI5aWFtVmpkQ2NnSmlZZ2MzVmlhbVZqZENBaFBUMGdiblZzYkNrZ2UxeHVJQ0FnSUM4dklHRnpjM1Z0WlNCdlltcGxZM1FnYVhNZ1lYSnlZWGt0YkdsclpWeHVJQ0FnSUdsbUlDaHpkV0pxWldOMExuUjVjR1VnUFQwOUlDZENkV1ptWlhJbklDWW1JR2x6UVhKeVlYa29jM1ZpYW1WamRDNWtZWFJoS1NrZ2MzVmlhbVZqZENBOUlITjFZbXBsWTNRdVpHRjBZVnh1SUNBZ0lHeGxibWQwYUNBOUlDdHpkV0pxWldOMExteGxibWQwYUZ4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0oyMTFjM1FnYzNSaGNuUWdkMmwwYUNCdWRXMWlaWElzSUdKMVptWmxjaXdnWVhKeVlYa2diM0lnYzNSeWFXNW5KeWxjYmlBZ2ZWeHVYRzRnSUdsbUlDaHNaVzVuZEdnZ1BpQnJUV0Y0VEdWdVozUm9LU0I3WEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRkpoYm1kbFJYSnliM0lvSjBGMGRHVnRjSFFnZEc4Z1lXeHNiMk5oZEdVZ1FuVm1abVZ5SUd4aGNtZGxjaUIwYUdGdUlHMWhlR2x0ZFcwZ2MybDZaVG9nTUhnbklDdGNiaUFnSUNBZ0lHdE5ZWGhNWlc1bmRHZ3VkRzlUZEhKcGJtY29NVFlwSUNzZ0p5QmllWFJsY3ljcFhHNGdJSDFjYmx4dUlDQnBaaUFvYkdWdVozUm9JRHdnTUNrZ2JHVnVaM1JvSUQwZ01GeHVJQ0JsYkhObElHeGxibWQwYUNBK1BqNDlJREFnTHk4Z1kyOWxjbU5sSUhSdklIVnBiblF6TWx4dVhHNGdJR2xtSUNoQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNrZ2UxeHVJQ0FnSUM4dklGQnlaV1psY25KbFpEb2dVbVYwZFhKdUlHRnVJR0YxWjIxbGJuUmxaQ0JnVldsdWREaEJjbkpoZVdBZ2FXNXpkR0Z1WTJVZ1ptOXlJR0psYzNRZ2NHVnlabTl5YldGdVkyVmNiaUFnSUNCelpXeG1JRDBnUW5WbVptVnlMbDloZFdkdFpXNTBLRzVsZHlCVmFXNTBPRUZ5Y21GNUtHeGxibWQwYUNrcElDOHZJR1Z6YkdsdWRDMWthWE5oWW14bExXeHBibVVnWTI5dWMybHpkR1Z1ZEMxMGFHbHpYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdMeThnUm1Gc2JHSmhZMnM2SUZKbGRIVnliaUJVU0VsVElHbHVjM1JoYm1ObElHOW1JRUoxWm1abGNpQW9ZM0psWVhSbFpDQmllU0JnYm1WM1lDbGNiaUFnSUNCelpXeG1MbXhsYm1kMGFDQTlJR3hsYm1kMGFGeHVJQ0FnSUhObGJHWXVYMmx6UW5WbVptVnlJRDBnZEhKMVpWeHVJQ0I5WEc1Y2JpQWdkbUZ5SUdsY2JpQWdhV1lnS0VKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVSUNZbUlIUjVjR1Z2WmlCemRXSnFaV04wTG1KNWRHVk1aVzVuZEdnZ1BUMDlJQ2R1ZFcxaVpYSW5LU0I3WEc0Z0lDQWdMeThnVTNCbFpXUWdiM0IwYVcxcGVtRjBhVzl1SUMwdElIVnpaU0J6WlhRZ2FXWWdkMlVuY21VZ1kyOXdlV2x1WnlCbWNtOXRJR0VnZEhsd1pXUWdZWEp5WVhsY2JpQWdJQ0J6Wld4bUxsOXpaWFFvYzNWaWFtVmpkQ2xjYmlBZ2ZTQmxiSE5sSUdsbUlDaHBjMEZ5Y21GNWFYTm9LSE4xWW1wbFkzUXBLU0I3WEc0Z0lDQWdMeThnVkhKbFlYUWdZWEp5WVhrdGFYTm9JRzlpYW1WamRITWdZWE1nWVNCaWVYUmxJR0Z5Y21GNVhHNGdJQ0FnYVdZZ0tFSjFabVpsY2k1cGMwSjFabVpsY2loemRXSnFaV04wS1NrZ2UxeHVJQ0FnSUNBZ1ptOXlJQ2hwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJSE5sYkdaYmFWMGdQU0J6ZFdKcVpXTjBMbkpsWVdSVlNXNTBPQ2hwS1Z4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z2JHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnYzJWc1psdHBYU0E5SUNnb2MzVmlhbVZqZEZ0cFhTQWxJREkxTmlrZ0t5QXlOVFlwSUNVZ01qVTJYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVWdQVDA5SUNkemRISnBibWNuS1NCN1hHNGdJQ0FnYzJWc1ppNTNjbWwwWlNoemRXSnFaV04wTENBd0xDQmxibU52WkdsdVp5bGNiaUFnZlNCbGJITmxJR2xtSUNoMGVYQmxJRDA5UFNBbmJuVnRZbVZ5SnlBbUppQWhRblZtWm1WeUxsUlpVRVZFWDBGU1VrRlpYMU5WVUZCUFVsUXBJSHRjYmlBZ0lDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z2JHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJSE5sYkdaYmFWMGdQU0F3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnYVdZZ0tHeGxibWQwYUNBK0lEQWdKaVlnYkdWdVozUm9JRHc5SUVKMVptWmxjaTV3YjI5c1UybDZaU2tnYzJWc1ppNXdZWEpsYm5RZ1BTQnliMjkwVUdGeVpXNTBYRzVjYmlBZ2NtVjBkWEp1SUhObGJHWmNibjFjYmx4dVpuVnVZM1JwYjI0Z1UyeHZkMEoxWm1abGNpQW9jM1ZpYW1WamRDd2daVzVqYjJScGJtY3BJSHRjYmlBZ2FXWWdLQ0VvZEdocGN5QnBibk4wWVc1alpXOW1JRk5zYjNkQ2RXWm1aWElwS1NCeVpYUjFjbTRnYm1WM0lGTnNiM2RDZFdabVpYSW9jM1ZpYW1WamRDd2daVzVqYjJScGJtY3BYRzVjYmlBZ2RtRnlJR0oxWmlBOUlHNWxkeUJDZFdabVpYSW9jM1ZpYW1WamRDd2daVzVqYjJScGJtY3BYRzRnSUdSbGJHVjBaU0JpZFdZdWNHRnlaVzUwWEc0Z0lISmxkSFZ5YmlCaWRXWmNibjFjYmx4dVFuVm1abVZ5TG1selFuVm1abVZ5SUQwZ1puVnVZM1JwYjI0Z2FYTkNkV1ptWlhJZ0tHSXBJSHRjYmlBZ2NtVjBkWEp1SUNFaEtHSWdJVDBnYm5Wc2JDQW1KaUJpTGw5cGMwSjFabVpsY2lsY2JuMWNibHh1UW5WbVptVnlMbU52YlhCaGNtVWdQU0JtZFc1amRHbHZiaUJqYjIxd1lYSmxJQ2hoTENCaUtTQjdYRzRnSUdsbUlDZ2hRblZtWm1WeUxtbHpRblZtWm1WeUtHRXBJSHg4SUNGQ2RXWm1aWEl1YVhOQ2RXWm1aWElvWWlrcElIdGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtDZEJjbWQxYldWdWRITWdiWFZ6ZENCaVpTQkNkV1ptWlhKekp5bGNiaUFnZlZ4dVhHNGdJR2xtSUNoaElEMDlQU0JpS1NCeVpYUjFjbTRnTUZ4dVhHNGdJSFpoY2lCNElEMGdZUzVzWlc1bmRHaGNiaUFnZG1GeUlIa2dQU0JpTG14bGJtZDBhRnh1SUNCbWIzSWdLSFpoY2lCcElEMGdNQ3dnYkdWdUlEMGdUV0YwYUM1dGFXNG9lQ3dnZVNrN0lHa2dQQ0JzWlc0Z0ppWWdZVnRwWFNBOVBUMGdZbHRwWFRzZ2FTc3JLU0I3ZlZ4dUlDQnBaaUFvYVNBaFBUMGdiR1Z1S1NCN1hHNGdJQ0FnZUNBOUlHRmJhVjFjYmlBZ0lDQjVJRDBnWWx0cFhWeHVJQ0I5WEc0Z0lHbG1JQ2g0SUR3Z2VTa2djbVYwZFhKdUlDMHhYRzRnSUdsbUlDaDVJRHdnZUNrZ2NtVjBkWEp1SURGY2JpQWdjbVYwZFhKdUlEQmNibjFjYmx4dVFuVm1abVZ5TG1selJXNWpiMlJwYm1jZ1BTQm1kVzVqZEdsdmJpQnBjMFZ1WTI5a2FXNW5JQ2hsYm1OdlpHbHVaeWtnZTF4dUlDQnpkMmwwWTJnZ0tGTjBjbWx1WnlobGJtTnZaR2x1WnlrdWRHOU1iM2RsY2tOaGMyVW9LU2tnZTF4dUlDQWdJR05oYzJVZ0oyaGxlQ2M2WEc0Z0lDQWdZMkZ6WlNBbmRYUm1PQ2M2WEc0Z0lDQWdZMkZ6WlNBbmRYUm1MVGduT2x4dUlDQWdJR05oYzJVZ0oyRnpZMmxwSnpwY2JpQWdJQ0JqWVhObElDZGlhVzVoY25rbk9seHVJQ0FnSUdOaGMyVWdKMkpoYzJVMk5DYzZYRzRnSUNBZ1kyRnpaU0FuY21GM0p6cGNiaUFnSUNCallYTmxJQ2QxWTNNeUp6cGNiaUFnSUNCallYTmxJQ2QxWTNNdE1pYzZYRzRnSUNBZ1kyRnpaU0FuZFhSbU1UWnNaU2M2WEc0Z0lDQWdZMkZ6WlNBbmRYUm1MVEUyYkdVbk9seHVJQ0FnSUNBZ2NtVjBkWEp1SUhSeWRXVmNiaUFnSUNCa1pXWmhkV3gwT2x4dUlDQWdJQ0FnY21WMGRYSnVJR1poYkhObFhHNGdJSDFjYm4xY2JseHVRblZtWm1WeUxtTnZibU5oZENBOUlHWjFibU4wYVc5dUlHTnZibU5oZENBb2JHbHpkQ3dnZEc5MFlXeE1aVzVuZEdncElIdGNiaUFnYVdZZ0tDRnBjMEZ5Y21GNUtHeHBjM1FwS1NCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtDZHNhWE4wSUdGeVozVnRaVzUwSUcxMWMzUWdZbVVnWVc0Z1FYSnlZWGtnYjJZZ1FuVm1abVZ5Y3k0bktWeHVYRzRnSUdsbUlDaHNhWE4wTG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh1SUNBZ0lISmxkSFZ5YmlCdVpYY2dRblZtWm1WeUtEQXBYRzRnSUgwZ1pXeHpaU0JwWmlBb2JHbHpkQzVzWlc1bmRHZ2dQVDA5SURFcElIdGNiaUFnSUNCeVpYUjFjbTRnYkdsemRGc3dYVnh1SUNCOVhHNWNiaUFnZG1GeUlHbGNiaUFnYVdZZ0tIUnZkR0ZzVEdWdVozUm9JRDA5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNCMGIzUmhiRXhsYm1kMGFDQTlJREJjYmlBZ0lDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z2JHbHpkQzVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2RHOTBZV3hNWlc1bmRHZ2dLejBnYkdsemRGdHBYUzVzWlc1bmRHaGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQjJZWElnWW5WbUlEMGdibVYzSUVKMVptWmxjaWgwYjNSaGJFeGxibWQwYUNsY2JpQWdkbUZ5SUhCdmN5QTlJREJjYmlBZ1ptOXlJQ2hwSUQwZ01Ec2dhU0E4SUd4cGMzUXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0IyWVhJZ2FYUmxiU0E5SUd4cGMzUmJhVjFjYmlBZ0lDQnBkR1Z0TG1OdmNIa29ZblZtTENCd2IzTXBYRzRnSUNBZ2NHOXpJQ3M5SUdsMFpXMHViR1Z1WjNSb1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUdKMVpseHVmVnh1WEc1Q2RXWm1aWEl1WW5sMFpVeGxibWQwYUNBOUlHWjFibU4wYVc5dUlHSjVkR1ZNWlc1bmRHZ2dLSE4wY2l3Z1pXNWpiMlJwYm1jcElIdGNiaUFnZG1GeUlISmxkRnh1SUNCemRISWdQU0J6ZEhJZ0t5QW5KMXh1SUNCemQybDBZMmdnS0dWdVkyOWthVzVuSUh4OElDZDFkR1k0SnlrZ2UxeHVJQ0FnSUdOaGMyVWdKMkZ6WTJscEp6cGNiaUFnSUNCallYTmxJQ2RpYVc1aGNua25PbHh1SUNBZ0lHTmhjMlVnSjNKaGR5YzZYRzRnSUNBZ0lDQnlaWFFnUFNCemRISXViR1Z1WjNSb1hHNGdJQ0FnSUNCaWNtVmhhMXh1SUNBZ0lHTmhjMlVnSjNWamN6SW5PbHh1SUNBZ0lHTmhjMlVnSjNWamN5MHlKenBjYmlBZ0lDQmpZWE5sSUNkMWRHWXhObXhsSnpwY2JpQWdJQ0JqWVhObElDZDFkR1l0TVRac1pTYzZYRzRnSUNBZ0lDQnlaWFFnUFNCemRISXViR1Z1WjNSb0lDb2dNbHh1SUNBZ0lDQWdZbkpsWVd0Y2JpQWdJQ0JqWVhObElDZG9aWGduT2x4dUlDQWdJQ0FnY21WMElEMGdjM1J5TG14bGJtZDBhQ0ErUGo0Z01WeHVJQ0FnSUNBZ1luSmxZV3RjYmlBZ0lDQmpZWE5sSUNkMWRHWTRKenBjYmlBZ0lDQmpZWE5sSUNkMWRHWXRPQ2M2WEc0Z0lDQWdJQ0J5WlhRZ1BTQjFkR1k0Vkc5Q2VYUmxjeWh6ZEhJcExteGxibWQwYUZ4dUlDQWdJQ0FnWW5KbFlXdGNiaUFnSUNCallYTmxJQ2RpWVhObE5qUW5PbHh1SUNBZ0lDQWdjbVYwSUQwZ1ltRnpaVFkwVkc5Q2VYUmxjeWh6ZEhJcExteGxibWQwYUZ4dUlDQWdJQ0FnWW5KbFlXdGNiaUFnSUNCa1pXWmhkV3gwT2x4dUlDQWdJQ0FnY21WMElEMGdjM1J5TG14bGJtZDBhRnh1SUNCOVhHNGdJSEpsZEhWeWJpQnlaWFJjYm4xY2JseHVMeThnY0hKbExYTmxkQ0JtYjNJZ2RtRnNkV1Z6SUhSb1lYUWdiV0Y1SUdWNGFYTjBJR2x1SUhSb1pTQm1kWFIxY21WY2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWJHVnVaM1JvSUQwZ2RXNWtaV1pwYm1Wa1hHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuQmhjbVZ1ZENBOUlIVnVaR1ZtYVc1bFpGeHVYRzR2THlCMGIxTjBjbWx1WnlobGJtTnZaR2x1Wnl3Z2MzUmhjblE5TUN3Z1pXNWtQV0oxWm1abGNpNXNaVzVuZEdncFhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bklEMGdablZ1WTNScGIyNGdkRzlUZEhKcGJtY2dLR1Z1WTI5a2FXNW5MQ0J6ZEdGeWRDd2daVzVrS1NCN1hHNGdJSFpoY2lCc2IzZGxjbVZrUTJGelpTQTlJR1poYkhObFhHNWNiaUFnYzNSaGNuUWdQU0J6ZEdGeWRDQStQajRnTUZ4dUlDQmxibVFnUFNCbGJtUWdQVDA5SUhWdVpHVm1hVzVsWkNCOGZDQmxibVFnUFQwOUlFbHVabWx1YVhSNUlEOGdkR2hwY3k1c1pXNW5kR2dnT2lCbGJtUWdQajQrSURCY2JseHVJQ0JwWmlBb0lXVnVZMjlrYVc1bktTQmxibU52WkdsdVp5QTlJQ2QxZEdZNEoxeHVJQ0JwWmlBb2MzUmhjblFnUENBd0tTQnpkR0Z5ZENBOUlEQmNiaUFnYVdZZ0tHVnVaQ0ErSUhSb2FYTXViR1Z1WjNSb0tTQmxibVFnUFNCMGFHbHpMbXhsYm1kMGFGeHVJQ0JwWmlBb1pXNWtJRHc5SUhOMFlYSjBLU0J5WlhSMWNtNGdKeWRjYmx4dUlDQjNhR2xzWlNBb2RISjFaU2tnZTF4dUlDQWdJSE4zYVhSamFDQW9aVzVqYjJScGJtY3BJSHRjYmlBZ0lDQWdJR05oYzJVZ0oyaGxlQ2M2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJvWlhoVGJHbGpaU2gwYUdsekxDQnpkR0Z5ZEN3Z1pXNWtLVnh1WEc0Z0lDQWdJQ0JqWVhObElDZDFkR1k0SnpwY2JpQWdJQ0FnSUdOaGMyVWdKM1YwWmkwNEp6cGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIVjBaamhUYkdsalpTaDBhR2x6TENCemRHRnlkQ3dnWlc1a0tWeHVYRzRnSUNBZ0lDQmpZWE5sSUNkaGMyTnBhU2M2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJoYzJOcGFWTnNhV05sS0hSb2FYTXNJSE4wWVhKMExDQmxibVFwWEc1Y2JpQWdJQ0FnSUdOaGMyVWdKMkpwYm1GeWVTYzZYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmlhVzVoY25sVGJHbGpaU2gwYUdsekxDQnpkR0Z5ZEN3Z1pXNWtLVnh1WEc0Z0lDQWdJQ0JqWVhObElDZGlZWE5sTmpRbk9seHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ltRnpaVFkwVTJ4cFkyVW9kR2hwY3l3Z2MzUmhjblFzSUdWdVpDbGNibHh1SUNBZ0lDQWdZMkZ6WlNBbmRXTnpNaWM2WEc0Z0lDQWdJQ0JqWVhObElDZDFZM010TWljNlhHNGdJQ0FnSUNCallYTmxJQ2QxZEdZeE5teGxKenBjYmlBZ0lDQWdJR05oYzJVZ0ozVjBaaTB4Tm14bEp6cGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIVjBaakUyYkdWVGJHbGpaU2gwYUdsekxDQnpkR0Z5ZEN3Z1pXNWtLVnh1WEc0Z0lDQWdJQ0JrWldaaGRXeDBPbHh1SUNBZ0lDQWdJQ0JwWmlBb2JHOTNaWEpsWkVOaGMyVXBJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjFWdWEyNXZkMjRnWlc1amIyUnBibWM2SUNjZ0t5QmxibU52WkdsdVp5bGNiaUFnSUNBZ0lDQWdaVzVqYjJScGJtY2dQU0FvWlc1amIyUnBibWNnS3lBbkp5a3VkRzlNYjNkbGNrTmhjMlVvS1Z4dUlDQWdJQ0FnSUNCc2IzZGxjbVZrUTJGelpTQTlJSFJ5ZFdWY2JpQWdJQ0I5WEc0Z0lIMWNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1bGNYVmhiSE1nUFNCbWRXNWpkR2x2YmlCbGNYVmhiSE1nS0dJcElIdGNiaUFnYVdZZ0tDRkNkV1ptWlhJdWFYTkNkV1ptWlhJb1lpa3BJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjBGeVozVnRaVzUwSUcxMWMzUWdZbVVnWVNCQ2RXWm1aWEluS1Z4dUlDQnBaaUFvZEdocGN5QTlQVDBnWWlrZ2NtVjBkWEp1SUhSeWRXVmNiaUFnY21WMGRYSnVJRUoxWm1abGNpNWpiMjF3WVhKbEtIUm9hWE1zSUdJcElEMDlQU0F3WEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVhVzV6Y0dWamRDQTlJR1oxYm1OMGFXOXVJR2x1YzNCbFkzUWdLQ2tnZTF4dUlDQjJZWElnYzNSeUlEMGdKeWRjYmlBZ2RtRnlJRzFoZUNBOUlHVjRjRzl5ZEhNdVNVNVRVRVZEVkY5TlFWaGZRbGxVUlZOY2JpQWdhV1lnS0hSb2FYTXViR1Z1WjNSb0lENGdNQ2tnZTF4dUlDQWdJSE4wY2lBOUlIUm9hWE11ZEc5VGRISnBibWNvSjJobGVDY3NJREFzSUcxaGVDa3ViV0YwWTJnb0x5NTdNbjB2WnlrdWFtOXBiaWduSUNjcFhHNGdJQ0FnYVdZZ0tIUm9hWE11YkdWdVozUm9JRDRnYldGNEtTQnpkSElnS3owZ0p5QXVMaTRnSjF4dUlDQjlYRzRnSUhKbGRIVnliaUFuUEVKMVptWmxjaUFuSUNzZ2MzUnlJQ3NnSno0blhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1WTI5dGNHRnlaU0E5SUdaMWJtTjBhVzl1SUdOdmJYQmhjbVVnS0dJcElIdGNiaUFnYVdZZ0tDRkNkV1ptWlhJdWFYTkNkV1ptWlhJb1lpa3BJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjBGeVozVnRaVzUwSUcxMWMzUWdZbVVnWVNCQ2RXWm1aWEluS1Z4dUlDQnBaaUFvZEdocGN5QTlQVDBnWWlrZ2NtVjBkWEp1SURCY2JpQWdjbVYwZFhKdUlFSjFabVpsY2k1amIyMXdZWEpsS0hSb2FYTXNJR0lwWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVhVzVrWlhoUFppQTlJR1oxYm1OMGFXOXVJR2x1WkdWNFQyWWdLSFpoYkN3Z1lubDBaVTltWm5ObGRDa2dlMXh1SUNCcFppQW9ZbmwwWlU5bVpuTmxkQ0ErSURCNE4yWm1abVptWm1ZcElHSjVkR1ZQWm1aelpYUWdQU0F3ZURkbVptWm1abVptWEc0Z0lHVnNjMlVnYVdZZ0tHSjVkR1ZQWm1aelpYUWdQQ0F0TUhnNE1EQXdNREF3TUNrZ1lubDBaVTltWm5ObGRDQTlJQzB3ZURnd01EQXdNREF3WEc0Z0lHSjVkR1ZQWm1aelpYUWdQajQ5SURCY2JseHVJQ0JwWmlBb2RHaHBjeTVzWlc1bmRHZ2dQVDA5SURBcElISmxkSFZ5YmlBdE1WeHVJQ0JwWmlBb1lubDBaVTltWm5ObGRDQStQU0IwYUdsekxteGxibWQwYUNrZ2NtVjBkWEp1SUMweFhHNWNiaUFnTHk4Z1RtVm5ZWFJwZG1VZ2IyWm1jMlYwY3lCemRHRnlkQ0JtY205dElIUm9aU0JsYm1RZ2IyWWdkR2hsSUdKMVptWmxjbHh1SUNCcFppQW9ZbmwwWlU5bVpuTmxkQ0E4SURBcElHSjVkR1ZQWm1aelpYUWdQU0JOWVhSb0xtMWhlQ2gwYUdsekxteGxibWQwYUNBcklHSjVkR1ZQWm1aelpYUXNJREFwWEc1Y2JpQWdhV1lnS0hSNWNHVnZaaUIyWVd3Z1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdhV1lnS0haaGJDNXNaVzVuZEdnZ1BUMDlJREFwSUhKbGRIVnliaUF0TVNBdkx5QnpjR1ZqYVdGc0lHTmhjMlU2SUd4dmIydHBibWNnWm05eUlHVnRjSFI1SUhOMGNtbHVaeUJoYkhkaGVYTWdabUZwYkhOY2JpQWdJQ0J5WlhSMWNtNGdVM1J5YVc1bkxuQnliM1J2ZEhsd1pTNXBibVJsZUU5bUxtTmhiR3dvZEdocGN5d2dkbUZzTENCaWVYUmxUMlptYzJWMEtWeHVJQ0I5WEc0Z0lHbG1JQ2hDZFdabVpYSXVhWE5DZFdabVpYSW9kbUZzS1NrZ2UxeHVJQ0FnSUhKbGRIVnliaUJoY25KaGVVbHVaR1Y0VDJZb2RHaHBjeXdnZG1Gc0xDQmllWFJsVDJabWMyVjBLVnh1SUNCOVhHNGdJR2xtSUNoMGVYQmxiMllnZG1Gc0lEMDlQU0FuYm5WdFltVnlKeWtnZTF4dUlDQWdJR2xtSUNoQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNBbUppQlZhVzUwT0VGeWNtRjVMbkJ5YjNSdmRIbHdaUzVwYm1SbGVFOW1JRDA5UFNBblpuVnVZM1JwYjI0bktTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1ZXbHVkRGhCY25KaGVTNXdjbTkwYjNSNWNHVXVhVzVrWlhoUFppNWpZV3hzS0hSb2FYTXNJSFpoYkN3Z1lubDBaVTltWm5ObGRDbGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR0Z5Y21GNVNXNWtaWGhQWmloMGFHbHpMQ0JiSUhaaGJDQmRMQ0JpZVhSbFQyWm1jMlYwS1Z4dUlDQjlYRzVjYmlBZ1puVnVZM1JwYjI0Z1lYSnlZWGxKYm1SbGVFOW1JQ2hoY25Jc0lIWmhiQ3dnWW5sMFpVOW1abk5sZENrZ2UxeHVJQ0FnSUhaaGNpQm1iM1Z1WkVsdVpHVjRJRDBnTFRGY2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dZbmwwWlU5bVpuTmxkQ0FySUdrZ1BDQmhjbkl1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lHbG1JQ2hoY25KYllubDBaVTltWm5ObGRDQXJJR2xkSUQwOVBTQjJZV3hiWm05MWJtUkpibVJsZUNBOVBUMGdMVEVnUHlBd0lEb2dhU0F0SUdadmRXNWtTVzVrWlhoZEtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNobWIzVnVaRWx1WkdWNElEMDlQU0F0TVNrZ1ptOTFibVJKYm1SbGVDQTlJR2xjYmlBZ0lDQWdJQ0FnYVdZZ0tHa2dMU0JtYjNWdVpFbHVaR1Y0SUNzZ01TQTlQVDBnZG1Gc0xteGxibWQwYUNrZ2NtVjBkWEp1SUdKNWRHVlBabVp6WlhRZ0t5Qm1iM1Z1WkVsdVpHVjRYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQm1iM1Z1WkVsdVpHVjRJRDBnTFRGY2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlDMHhYRzRnSUgxY2JseHVJQ0IwYUhKdmR5QnVaWGNnVkhsd1pVVnljbTl5S0NkMllXd2diWFZ6ZENCaVpTQnpkSEpwYm1jc0lHNTFiV0psY2lCdmNpQkNkV1ptWlhJbktWeHVmVnh1WEc0dkx5QmdaMlYwWUNCM2FXeHNJR0psSUhKbGJXOTJaV1FnYVc0Z1RtOWtaU0F3TGpFeksxeHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNW5aWFFnUFNCbWRXNWpkR2x2YmlCblpYUWdLRzltWm5ObGRDa2dlMXh1SUNCamIyNXpiMnhsTG14dlp5Z25MbWRsZENncElHbHpJR1JsY0hKbFkyRjBaV1F1SUVGalkyVnpjeUIxYzJsdVp5QmhjbkpoZVNCcGJtUmxlR1Z6SUdsdWMzUmxZV1F1SnlsY2JpQWdjbVYwZFhKdUlIUm9hWE11Y21WaFpGVkpiblE0S0c5bVpuTmxkQ2xjYm4xY2JseHVMeThnWUhObGRHQWdkMmxzYkNCaVpTQnlaVzF2ZG1Wa0lHbHVJRTV2WkdVZ01DNHhNeXRjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1YzJWMElEMGdablZ1WTNScGIyNGdjMlYwSUNoMkxDQnZabVp6WlhRcElIdGNiaUFnWTI5dWMyOXNaUzVzYjJjb0p5NXpaWFFvS1NCcGN5QmtaWEJ5WldOaGRHVmtMaUJCWTJObGMzTWdkWE5wYm1jZ1lYSnlZWGtnYVc1a1pYaGxjeUJwYm5OMFpXRmtMaWNwWEc0Z0lISmxkSFZ5YmlCMGFHbHpMbmR5YVhSbFZVbHVkRGdvZGl3Z2IyWm1jMlYwS1Z4dWZWeHVYRzVtZFc1amRHbHZiaUJvWlhoWGNtbDBaU0FvWW5WbUxDQnpkSEpwYm1jc0lHOW1abk5sZEN3Z2JHVnVaM1JvS1NCN1hHNGdJRzltWm5ObGRDQTlJRTUxYldKbGNpaHZabVp6WlhRcElIeDhJREJjYmlBZ2RtRnlJSEpsYldGcGJtbHVaeUE5SUdKMVppNXNaVzVuZEdnZ0xTQnZabVp6WlhSY2JpQWdhV1lnS0NGc1pXNW5kR2dwSUh0Y2JpQWdJQ0JzWlc1bmRHZ2dQU0J5WlcxaGFXNXBibWRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0JzWlc1bmRHZ2dQU0JPZFcxaVpYSW9iR1Z1WjNSb0tWeHVJQ0FnSUdsbUlDaHNaVzVuZEdnZ1BpQnlaVzFoYVc1cGJtY3BJSHRjYmlBZ0lDQWdJR3hsYm1kMGFDQTlJSEpsYldGcGJtbHVaMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzh2SUcxMWMzUWdZbVVnWVc0Z1pYWmxiaUJ1ZFcxaVpYSWdiMllnWkdsbmFYUnpYRzRnSUhaaGNpQnpkSEpNWlc0Z1BTQnpkSEpwYm1jdWJHVnVaM1JvWEc0Z0lHbG1JQ2h6ZEhKTVpXNGdKU0F5SUNFOVBTQXdLU0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMGx1ZG1Gc2FXUWdhR1Y0SUhOMGNtbHVaeWNwWEc1Y2JpQWdhV1lnS0d4bGJtZDBhQ0ErSUhOMGNreGxiaUF2SURJcElIdGNiaUFnSUNCc1pXNW5kR2dnUFNCemRISk1aVzRnTHlBeVhHNGdJSDFjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQnNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJSFpoY2lCd1lYSnpaV1FnUFNCd1lYSnpaVWx1ZENoemRISnBibWN1YzNWaWMzUnlLR2tnS2lBeUxDQXlLU3dnTVRZcFhHNGdJQ0FnYVdZZ0tHbHpUbUZPS0hCaGNuTmxaQ2twSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduU1c1MllXeHBaQ0JvWlhnZ2MzUnlhVzVuSnlsY2JpQWdJQ0JpZFdaYmIyWm1jMlYwSUNzZ2FWMGdQU0J3WVhKelpXUmNiaUFnZlZ4dUlDQnlaWFIxY200Z2FWeHVmVnh1WEc1bWRXNWpkR2x2YmlCMWRHWTRWM0pwZEdVZ0tHSjFaaXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDa2dlMXh1SUNCMllYSWdZMmhoY25OWGNtbDBkR1Z1SUQwZ1lteHBkRUoxWm1abGNpaDFkR1k0Vkc5Q2VYUmxjeWh6ZEhKcGJtY3NJR0oxWmk1c1pXNW5kR2dnTFNCdlptWnpaWFFwTENCaWRXWXNJRzltWm5ObGRDd2diR1Z1WjNSb0tWeHVJQ0J5WlhSMWNtNGdZMmhoY25OWGNtbDBkR1Z1WEc1OVhHNWNibVoxYm1OMGFXOXVJR0Z6WTJscFYzSnBkR1VnS0dKMVppd2djM1J5YVc1bkxDQnZabVp6WlhRc0lHeGxibWQwYUNrZ2UxeHVJQ0IyWVhJZ1kyaGhjbk5YY21sMGRHVnVJRDBnWW14cGRFSjFabVpsY2loaGMyTnBhVlJ2UW5sMFpYTW9jM1J5YVc1bktTd2dZblZtTENCdlptWnpaWFFzSUd4bGJtZDBhQ2xjYmlBZ2NtVjBkWEp1SUdOb1lYSnpWM0pwZEhSbGJseHVmVnh1WEc1bWRXNWpkR2x2YmlCaWFXNWhjbmxYY21sMFpTQW9ZblZtTENCemRISnBibWNzSUc5bVpuTmxkQ3dnYkdWdVozUm9LU0I3WEc0Z0lISmxkSFZ5YmlCaGMyTnBhVmR5YVhSbEtHSjFaaXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNibjFjYmx4dVpuVnVZM1JwYjI0Z1ltRnpaVFkwVjNKcGRHVWdLR0oxWml3Z2MzUnlhVzVuTENCdlptWnpaWFFzSUd4bGJtZDBhQ2tnZTF4dUlDQjJZWElnWTJoaGNuTlhjbWwwZEdWdUlEMGdZbXhwZEVKMVptWmxjaWhpWVhObE5qUlViMEo1ZEdWektITjBjbWx1Wnlrc0lHSjFaaXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzRnSUhKbGRIVnliaUJqYUdGeWMxZHlhWFIwWlc1Y2JuMWNibHh1Wm5WdVkzUnBiMjRnZFhSbU1UWnNaVmR5YVhSbElDaGlkV1lzSUhOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BJSHRjYmlBZ2RtRnlJR05vWVhKelYzSnBkSFJsYmlBOUlHSnNhWFJDZFdabVpYSW9kWFJtTVRac1pWUnZRbmwwWlhNb2MzUnlhVzVuTENCaWRXWXViR1Z1WjNSb0lDMGdiMlptYzJWMEtTd2dZblZtTENCdlptWnpaWFFzSUd4bGJtZDBhQ2xjYmlBZ2NtVjBkWEp1SUdOb1lYSnpWM0pwZEhSbGJseHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5keWFYUmxJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVWdLSE4wY21sdVp5d2diMlptYzJWMExDQnNaVzVuZEdnc0lHVnVZMjlrYVc1bktTQjdYRzRnSUM4dklGTjFjSEJ2Y25RZ1ltOTBhQ0FvYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDd2daVzVqYjJScGJtY3BYRzRnSUM4dklHRnVaQ0IwYUdVZ2JHVm5ZV041SUNoemRISnBibWNzSUdWdVkyOWthVzVuTENCdlptWnpaWFFzSUd4bGJtZDBhQ2xjYmlBZ2FXWWdLR2x6Um1sdWFYUmxLRzltWm5ObGRDa3BJSHRjYmlBZ0lDQnBaaUFvSVdselJtbHVhWFJsS0d4bGJtZDBhQ2twSUh0Y2JpQWdJQ0FnSUdWdVkyOWthVzVuSUQwZ2JHVnVaM1JvWEc0Z0lDQWdJQ0JzWlc1bmRHZ2dQU0IxYm1SbFptbHVaV1JjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0I3SUNBdkx5QnNaV2RoWTNsY2JpQWdJQ0IyWVhJZ2MzZGhjQ0E5SUdWdVkyOWthVzVuWEc0Z0lDQWdaVzVqYjJScGJtY2dQU0J2Wm1aelpYUmNiaUFnSUNCdlptWnpaWFFnUFNCc1pXNW5kR2hjYmlBZ0lDQnNaVzVuZEdnZ1BTQnpkMkZ3WEc0Z0lIMWNibHh1SUNCdlptWnpaWFFnUFNCT2RXMWlaWElvYjJabWMyVjBLU0I4ZkNBd1hHNWNiaUFnYVdZZ0tHeGxibWQwYUNBOElEQWdmSHdnYjJabWMyVjBJRHdnTUNCOGZDQnZabVp6WlhRZ1BpQjBhR2x6TG14bGJtZDBhQ2tnZTF4dUlDQWdJSFJvY205M0lHNWxkeUJTWVc1blpVVnljbTl5S0NkaGRIUmxiWEIwSUhSdklIZHlhWFJsSUc5MWRITnBaR1VnWW5WbVptVnlJR0p2ZFc1a2N5Y3BYRzRnSUgxY2JseHVJQ0IyWVhJZ2NtVnRZV2x1YVc1bklEMGdkR2hwY3k1c1pXNW5kR2dnTFNCdlptWnpaWFJjYmlBZ2FXWWdLQ0ZzWlc1bmRHZ3BJSHRjYmlBZ0lDQnNaVzVuZEdnZ1BTQnlaVzFoYVc1cGJtZGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnNaVzVuZEdnZ1BTQk9kVzFpWlhJb2JHVnVaM1JvS1Z4dUlDQWdJR2xtSUNoc1pXNW5kR2dnUGlCeVpXMWhhVzVwYm1jcElIdGNiaUFnSUNBZ0lHeGxibWQwYUNBOUlISmxiV0ZwYm1sdVoxeHVJQ0FnSUgxY2JpQWdmVnh1SUNCbGJtTnZaR2x1WnlBOUlGTjBjbWx1WnlobGJtTnZaR2x1WnlCOGZDQW5kWFJtT0NjcExuUnZURzkzWlhKRFlYTmxLQ2xjYmx4dUlDQjJZWElnY21WMFhHNGdJSE4zYVhSamFDQW9aVzVqYjJScGJtY3BJSHRjYmlBZ0lDQmpZWE5sSUNkb1pYZ25PbHh1SUNBZ0lDQWdjbVYwSUQwZ2FHVjRWM0pwZEdVb2RHaHBjeXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNiaUFnSUNBZ0lHSnlaV0ZyWEc0Z0lDQWdZMkZ6WlNBbmRYUm1PQ2M2WEc0Z0lDQWdZMkZ6WlNBbmRYUm1MVGduT2x4dUlDQWdJQ0FnY21WMElEMGdkWFJtT0ZkeWFYUmxLSFJvYVhNc0lITjBjbWx1Wnl3Z2IyWm1jMlYwTENCc1pXNW5kR2dwWEc0Z0lDQWdJQ0JpY21WaGExeHVJQ0FnSUdOaGMyVWdKMkZ6WTJscEp6cGNiaUFnSUNBZ0lISmxkQ0E5SUdGelkybHBWM0pwZEdVb2RHaHBjeXdnYzNSeWFXNW5MQ0J2Wm1aelpYUXNJR3hsYm1kMGFDbGNiaUFnSUNBZ0lHSnlaV0ZyWEc0Z0lDQWdZMkZ6WlNBblltbHVZWEo1SnpwY2JpQWdJQ0FnSUhKbGRDQTlJR0pwYm1GeWVWZHlhWFJsS0hSb2FYTXNJSE4wY21sdVp5d2diMlptYzJWMExDQnNaVzVuZEdncFhHNGdJQ0FnSUNCaWNtVmhhMXh1SUNBZ0lHTmhjMlVnSjJKaGMyVTJOQ2M2WEc0Z0lDQWdJQ0J5WlhRZ1BTQmlZWE5sTmpSWGNtbDBaU2gwYUdsekxDQnpkSEpwYm1jc0lHOW1abk5sZEN3Z2JHVnVaM1JvS1Z4dUlDQWdJQ0FnWW5KbFlXdGNiaUFnSUNCallYTmxJQ2QxWTNNeUp6cGNiaUFnSUNCallYTmxJQ2QxWTNNdE1pYzZYRzRnSUNBZ1kyRnpaU0FuZFhSbU1UWnNaU2M2WEc0Z0lDQWdZMkZ6WlNBbmRYUm1MVEUyYkdVbk9seHVJQ0FnSUNBZ2NtVjBJRDBnZFhSbU1UWnNaVmR5YVhSbEtIUm9hWE1zSUhOMGNtbHVaeXdnYjJabWMyVjBMQ0JzWlc1bmRHZ3BYRzRnSUNBZ0lDQmljbVZoYTF4dUlDQWdJR1JsWm1GMWJIUTZYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RWYm10dWIzZHVJR1Z1WTI5a2FXNW5PaUFuSUNzZ1pXNWpiMlJwYm1jcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUhKbGRGeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5SdlNsTlBUaUE5SUdaMWJtTjBhVzl1SUhSdlNsTlBUaUFvS1NCN1hHNGdJSEpsZEhWeWJpQjdYRzRnSUNBZ2RIbHdaVG9nSjBKMVptWmxjaWNzWEc0Z0lDQWdaR0YwWVRvZ1FYSnlZWGt1Y0hKdmRHOTBlWEJsTG5Oc2FXTmxMbU5oYkd3b2RHaHBjeTVmWVhKeUlIeDhJSFJvYVhNc0lEQXBYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWW1GelpUWTBVMnhwWTJVZ0tHSjFaaXdnYzNSaGNuUXNJR1Z1WkNrZ2UxeHVJQ0JwWmlBb2MzUmhjblFnUFQwOUlEQWdKaVlnWlc1a0lEMDlQU0JpZFdZdWJHVnVaM1JvS1NCN1hHNGdJQ0FnY21WMGRYSnVJR0poYzJVMk5DNW1jbTl0UW5sMFpVRnljbUY1S0dKMVppbGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnlaWFIxY200Z1ltRnpaVFkwTG1aeWIyMUNlWFJsUVhKeVlYa29ZblZtTG5Oc2FXTmxLSE4wWVhKMExDQmxibVFwS1Z4dUlDQjlYRzU5WEc1Y2JtWjFibU4wYVc5dUlIVjBaamhUYkdsalpTQW9ZblZtTENCemRHRnlkQ3dnWlc1a0tTQjdYRzRnSUhaaGNpQnlaWE1nUFNBbkoxeHVJQ0IyWVhJZ2RHMXdJRDBnSnlkY2JpQWdaVzVrSUQwZ1RXRjBhQzV0YVc0b1luVm1MbXhsYm1kMGFDd2daVzVrS1Z4dVhHNGdJR1p2Y2lBb2RtRnlJR2tnUFNCemRHRnlkRHNnYVNBOElHVnVaRHNnYVNzcktTQjdYRzRnSUNBZ2FXWWdLR0oxWmx0cFhTQThQU0F3ZURkR0tTQjdYRzRnSUNBZ0lDQnlaWE1nS3owZ1pHVmpiMlJsVlhSbU9FTm9ZWElvZEcxd0tTQXJJRk4wY21sdVp5NW1jbTl0UTJoaGNrTnZaR1VvWW5WbVcybGRLVnh1SUNBZ0lDQWdkRzF3SUQwZ0p5ZGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnZEcxd0lDczlJQ2NsSnlBcklHSjFabHRwWFM1MGIxTjBjbWx1WnlneE5pbGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2NtVnpJQ3NnWkdWamIyUmxWWFJtT0VOb1lYSW9kRzF3S1Z4dWZWeHVYRzVtZFc1amRHbHZiaUJoYzJOcGFWTnNhV05sSUNoaWRXWXNJSE4wWVhKMExDQmxibVFwSUh0Y2JpQWdkbUZ5SUhKbGRDQTlJQ2NuWEc0Z0lHVnVaQ0E5SUUxaGRHZ3ViV2x1S0dKMVppNXNaVzVuZEdnc0lHVnVaQ2xjYmx4dUlDQm1iM0lnS0haaGNpQnBJRDBnYzNSaGNuUTdJR2tnUENCbGJtUTdJR2tyS3lrZ2UxeHVJQ0FnSUhKbGRDQXJQU0JUZEhKcGJtY3Vabkp2YlVOb1lYSkRiMlJsS0dKMVpsdHBYU0FtSURCNE4wWXBYRzRnSUgxY2JpQWdjbVYwZFhKdUlISmxkRnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmlhVzVoY25sVGJHbGpaU0FvWW5WbUxDQnpkR0Z5ZEN3Z1pXNWtLU0I3WEc0Z0lIWmhjaUJ5WlhRZ1BTQW5KMXh1SUNCbGJtUWdQU0JOWVhSb0xtMXBiaWhpZFdZdWJHVnVaM1JvTENCbGJtUXBYRzVjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJSE4wWVhKME95QnBJRHdnWlc1a095QnBLeXNwSUh0Y2JpQWdJQ0J5WlhRZ0t6MGdVM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2hpZFdaYmFWMHBYRzRnSUgxY2JpQWdjbVYwZFhKdUlISmxkRnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQm9aWGhUYkdsalpTQW9ZblZtTENCemRHRnlkQ3dnWlc1a0tTQjdYRzRnSUhaaGNpQnNaVzRnUFNCaWRXWXViR1Z1WjNSb1hHNWNiaUFnYVdZZ0tDRnpkR0Z5ZENCOGZDQnpkR0Z5ZENBOElEQXBJSE4wWVhKMElEMGdNRnh1SUNCcFppQW9JV1Z1WkNCOGZDQmxibVFnUENBd0lIeDhJR1Z1WkNBK0lHeGxiaWtnWlc1a0lEMGdiR1Z1WEc1Y2JpQWdkbUZ5SUc5MWRDQTlJQ2NuWEc0Z0lHWnZjaUFvZG1GeUlHa2dQU0J6ZEdGeWREc2dhU0E4SUdWdVpEc2dhU3NyS1NCN1hHNGdJQ0FnYjNWMElDczlJSFJ2U0dWNEtHSjFabHRwWFNsY2JpQWdmVnh1SUNCeVpYUjFjbTRnYjNWMFhHNTlYRzVjYm1aMWJtTjBhVzl1SUhWMFpqRTJiR1ZUYkdsalpTQW9ZblZtTENCemRHRnlkQ3dnWlc1a0tTQjdYRzRnSUhaaGNpQmllWFJsY3lBOUlHSjFaaTV6YkdsalpTaHpkR0Z5ZEN3Z1pXNWtLVnh1SUNCMllYSWdjbVZ6SUQwZ0p5ZGNiaUFnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCaWVYUmxjeTVzWlc1bmRHZzdJR2tnS3owZ01pa2dlMXh1SUNBZ0lISmxjeUFyUFNCVGRISnBibWN1Wm5KdmJVTm9ZWEpEYjJSbEtHSjVkR1Z6VzJsZElDc2dZbmwwWlhOYmFTQXJJREZkSUNvZ01qVTJLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnlaWE5jYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXpiR2xqWlNBOUlHWjFibU4wYVc5dUlITnNhV05sSUNoemRHRnlkQ3dnWlc1a0tTQjdYRzRnSUhaaGNpQnNaVzRnUFNCMGFHbHpMbXhsYm1kMGFGeHVJQ0J6ZEdGeWRDQTlJSDUrYzNSaGNuUmNiaUFnWlc1a0lEMGdaVzVrSUQwOVBTQjFibVJsWm1sdVpXUWdQeUJzWlc0Z09pQitmbVZ1WkZ4dVhHNGdJR2xtSUNoemRHRnlkQ0E4SURBcElIdGNiaUFnSUNCemRHRnlkQ0FyUFNCc1pXNWNiaUFnSUNCcFppQW9jM1JoY25RZ1BDQXdLU0J6ZEdGeWRDQTlJREJjYmlBZ2ZTQmxiSE5sSUdsbUlDaHpkR0Z5ZENBK0lHeGxiaWtnZTF4dUlDQWdJSE4wWVhKMElEMGdiR1Z1WEc0Z0lIMWNibHh1SUNCcFppQW9aVzVrSUR3Z01Da2dlMXh1SUNBZ0lHVnVaQ0FyUFNCc1pXNWNiaUFnSUNCcFppQW9aVzVrSUR3Z01Da2daVzVrSUQwZ01GeHVJQ0I5SUdWc2MyVWdhV1lnS0dWdVpDQStJR3hsYmlrZ2UxeHVJQ0FnSUdWdVpDQTlJR3hsYmx4dUlDQjlYRzVjYmlBZ2FXWWdLR1Z1WkNBOElITjBZWEowS1NCbGJtUWdQU0J6ZEdGeWRGeHVYRzRnSUhaaGNpQnVaWGRDZFdaY2JpQWdhV1lnS0VKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVS1NCN1hHNGdJQ0FnYm1WM1FuVm1JRDBnUW5WbVptVnlMbDloZFdkdFpXNTBLSFJvYVhNdWMzVmlZWEp5WVhrb2MzUmhjblFzSUdWdVpDa3BYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkbUZ5SUhOc2FXTmxUR1Z1SUQwZ1pXNWtJQzBnYzNSaGNuUmNiaUFnSUNCdVpYZENkV1lnUFNCdVpYY2dRblZtWm1WeUtITnNhV05sVEdWdUxDQjFibVJsWm1sdVpXUXBYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQnpiR2xqWlV4bGJqc2dhU3NyS1NCN1hHNGdJQ0FnSUNCdVpYZENkV1piYVYwZ1BTQjBhR2x6VzJrZ0t5QnpkR0Z5ZEYxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCcFppQW9ibVYzUW5WbUxteGxibWQwYUNrZ2JtVjNRblZtTG5CaGNtVnVkQ0E5SUhSb2FYTXVjR0Z5Wlc1MElIeDhJSFJvYVhOY2JseHVJQ0J5WlhSMWNtNGdibVYzUW5WbVhHNTlYRzVjYmk4cVhHNGdLaUJPWldWa0lIUnZJRzFoYTJVZ2MzVnlaU0IwYUdGMElHSjFabVpsY2lCcGMyNG5kQ0IwY25scGJtY2dkRzhnZDNKcGRHVWdiM1YwSUc5bUlHSnZkVzVrY3k1Y2JpQXFMMXh1Wm5WdVkzUnBiMjRnWTJobFkydFBabVp6WlhRZ0tHOW1abk5sZEN3Z1pYaDBMQ0JzWlc1bmRHZ3BJSHRjYmlBZ2FXWWdLQ2h2Wm1aelpYUWdKU0F4S1NBaFBUMGdNQ0I4ZkNCdlptWnpaWFFnUENBd0tTQjBhSEp2ZHlCdVpYY2dVbUZ1WjJWRmNuSnZjaWduYjJabWMyVjBJR2x6SUc1dmRDQjFhVzUwSnlsY2JpQWdhV1lnS0c5bVpuTmxkQ0FySUdWNGRDQStJR3hsYm1kMGFDa2dkR2h5YjNjZ2JtVjNJRkpoYm1kbFJYSnliM0lvSjFSeWVXbHVaeUIwYnlCaFkyTmxjM01nWW1WNWIyNWtJR0oxWm1abGNpQnNaVzVuZEdnbktWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUlZTVzUwVEVVZ1BTQm1kVzVqZEdsdmJpQnlaV0ZrVlVsdWRFeEZJQ2h2Wm1aelpYUXNJR0o1ZEdWTVpXNW5kR2dzSUc1dlFYTnpaWEowS1NCN1hHNGdJRzltWm5ObGRDQTlJRzltWm5ObGRDQStQajRnTUZ4dUlDQmllWFJsVEdWdVozUm9JRDBnWW5sMFpVeGxibWQwYUNBK1BqNGdNRnh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0JqYUdWamEwOW1abk5sZENodlptWnpaWFFzSUdKNWRHVk1aVzVuZEdnc0lIUm9hWE11YkdWdVozUm9LVnh1WEc0Z0lIWmhjaUIyWVd3Z1BTQjBhR2x6VzI5bVpuTmxkRjFjYmlBZ2RtRnlJRzExYkNBOUlERmNiaUFnZG1GeUlHa2dQU0F3WEc0Z0lIZG9hV3hsSUNncksya2dQQ0JpZVhSbFRHVnVaM1JvSUNZbUlDaHRkV3dnS2owZ01IZ3hNREFwS1NCN1hHNGdJQ0FnZG1Gc0lDczlJSFJvYVhOYmIyWm1jMlYwSUNzZ2FWMGdLaUJ0ZFd4Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCMllXeGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtWVWx1ZEVKRklEMGdablZ1WTNScGIyNGdjbVZoWkZWSmJuUkNSU0FvYjJabWMyVjBMQ0JpZVhSbFRHVnVaM1JvTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0J2Wm1aelpYUWdQU0J2Wm1aelpYUWdQajQrSURCY2JpQWdZbmwwWlV4bGJtZDBhQ0E5SUdKNWRHVk1aVzVuZEdnZ1BqNCtJREJjYmlBZ2FXWWdLQ0Z1YjBGemMyVnlkQ2tnZTF4dUlDQWdJR05vWldOclQyWm1jMlYwS0c5bVpuTmxkQ3dnWW5sMFpVeGxibWQwYUN3Z2RHaHBjeTVzWlc1bmRHZ3BYRzRnSUgxY2JseHVJQ0IyWVhJZ2RtRnNJRDBnZEdocGMxdHZabVp6WlhRZ0t5QXRMV0o1ZEdWTVpXNW5kR2hkWEc0Z0lIWmhjaUJ0ZFd3Z1BTQXhYRzRnSUhkb2FXeGxJQ2hpZVhSbFRHVnVaM1JvSUQ0Z01DQW1KaUFvYlhWc0lDbzlJREI0TVRBd0tTa2dlMXh1SUNBZ0lIWmhiQ0FyUFNCMGFHbHpXMjltWm5ObGRDQXJJQzB0WW5sMFpVeGxibWQwYUYwZ0tpQnRkV3hjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUIyWVd4Y2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzV5WldGa1ZVbHVkRGdnUFNCbWRXNWpkR2x2YmlCeVpXRmtWVWx1ZERnZ0tHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0UFptWnpaWFFvYjJabWMyVjBMQ0F4TENCMGFHbHpMbXhsYm1kMGFDbGNiaUFnY21WMGRYSnVJSFJvYVhOYmIyWm1jMlYwWFZ4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbkpsWVdSVlNXNTBNVFpNUlNBOUlHWjFibU4wYVc5dUlISmxZV1JWU1c1ME1UWk1SU0FvYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMDltWm5ObGRDaHZabVp6WlhRc0lESXNJSFJvYVhNdWJHVnVaM1JvS1Z4dUlDQnlaWFIxY200Z2RHaHBjMXR2Wm1aelpYUmRJSHdnS0hSb2FYTmJiMlptYzJWMElDc2dNVjBnUER3Z09DbGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtWVWx1ZERFMlFrVWdQU0JtZFc1amRHbHZiaUJ5WldGa1ZVbHVkREUyUWtVZ0tHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0UFptWnpaWFFvYjJabWMyVjBMQ0F5TENCMGFHbHpMbXhsYm1kMGFDbGNiaUFnY21WMGRYSnVJQ2gwYUdselcyOW1abk5sZEYwZ1BEd2dPQ2tnZkNCMGFHbHpXMjltWm5ObGRDQXJJREZkWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVjbVZoWkZWSmJuUXpNa3hGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRlZKYm5Rek1reEZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z05Dd2dkR2hwY3k1c1pXNW5kR2dwWEc1Y2JpQWdjbVYwZFhKdUlDZ29kR2hwYzF0dlptWnpaWFJkS1NCOFhHNGdJQ0FnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF4WFNBOFBDQTRLU0I4WEc0Z0lDQWdJQ0FvZEdocGMxdHZabVp6WlhRZ0t5QXlYU0E4UENBeE5pa3BJQ3RjYmlBZ0lDQWdJQ2gwYUdselcyOW1abk5sZENBcklETmRJQ29nTUhneE1EQXdNREF3S1Z4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbkpsWVdSVlNXNTBNekpDUlNBOUlHWjFibU4wYVc5dUlISmxZV1JWU1c1ME16SkNSU0FvYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMDltWm5ObGRDaHZabVp6WlhRc0lEUXNJSFJvYVhNdWJHVnVaM1JvS1Z4dVhHNGdJSEpsZEhWeWJpQW9kR2hwYzF0dlptWnpaWFJkSUNvZ01IZ3hNREF3TURBd0tTQXJYRzRnSUNBZ0tDaDBhR2x6VzI5bVpuTmxkQ0FySURGZElEdzhJREUyS1NCOFhHNGdJQ0FnS0hSb2FYTmJiMlptYzJWMElDc2dNbDBnUER3Z09Da2dmRnh1SUNBZ0lIUm9hWE5iYjJabWMyVjBJQ3NnTTEwcFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1Y21WaFpFbHVkRXhGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRWx1ZEV4RklDaHZabVp6WlhRc0lHSjVkR1ZNWlc1bmRHZ3NJRzV2UVhOelpYSjBLU0I3WEc0Z0lHOW1abk5sZENBOUlHOW1abk5sZENBK1BqNGdNRnh1SUNCaWVYUmxUR1Z1WjNSb0lEMGdZbmwwWlV4bGJtZDBhQ0ErUGo0Z01GeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQmphR1ZqYTA5bVpuTmxkQ2h2Wm1aelpYUXNJR0o1ZEdWTVpXNW5kR2dzSUhSb2FYTXViR1Z1WjNSb0tWeHVYRzRnSUhaaGNpQjJZV3dnUFNCMGFHbHpXMjltWm5ObGRGMWNiaUFnZG1GeUlHMTFiQ0E5SURGY2JpQWdkbUZ5SUdrZ1BTQXdYRzRnSUhkb2FXeGxJQ2dySzJrZ1BDQmllWFJsVEdWdVozUm9JQ1ltSUNodGRXd2dLajBnTUhneE1EQXBLU0I3WEc0Z0lDQWdkbUZzSUNzOUlIUm9hWE5iYjJabWMyVjBJQ3NnYVYwZ0tpQnRkV3hjYmlBZ2ZWeHVJQ0J0ZFd3Z0tqMGdNSGc0TUZ4dVhHNGdJR2xtSUNoMllXd2dQajBnYlhWc0tTQjJZV3dnTFQwZ1RXRjBhQzV3YjNjb01pd2dPQ0FxSUdKNWRHVk1aVzVuZEdncFhHNWNiaUFnY21WMGRYSnVJSFpoYkZ4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbkpsWVdSSmJuUkNSU0E5SUdaMWJtTjBhVzl1SUhKbFlXUkpiblJDUlNBb2IyWm1jMlYwTENCaWVYUmxUR1Z1WjNSb0xDQnViMEZ6YzJWeWRDa2dlMXh1SUNCdlptWnpaWFFnUFNCdlptWnpaWFFnUGo0K0lEQmNiaUFnWW5sMFpVeGxibWQwYUNBOUlHSjVkR1ZNWlc1bmRHZ2dQajQrSURCY2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRQWm1aelpYUW9iMlptYzJWMExDQmllWFJsVEdWdVozUm9MQ0IwYUdsekxteGxibWQwYUNsY2JseHVJQ0IyWVhJZ2FTQTlJR0o1ZEdWTVpXNW5kR2hjYmlBZ2RtRnlJRzExYkNBOUlERmNiaUFnZG1GeUlIWmhiQ0E5SUhSb2FYTmJiMlptYzJWMElDc2dMUzFwWFZ4dUlDQjNhR2xzWlNBb2FTQStJREFnSmlZZ0tHMTFiQ0FxUFNBd2VERXdNQ2twSUh0Y2JpQWdJQ0IyWVd3Z0t6MGdkR2hwYzF0dlptWnpaWFFnS3lBdExXbGRJQ29nYlhWc1hHNGdJSDFjYmlBZ2JYVnNJQ285SURCNE9EQmNibHh1SUNCcFppQW9kbUZzSUQ0OUlHMTFiQ2tnZG1Gc0lDMDlJRTFoZEdndWNHOTNLRElzSURnZ0tpQmllWFJsVEdWdVozUm9LVnh1WEc0Z0lISmxkSFZ5YmlCMllXeGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtTVzUwT0NBOUlHWjFibU4wYVc5dUlISmxZV1JKYm5RNElDaHZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclQyWm1jMlYwS0c5bVpuTmxkQ3dnTVN3Z2RHaHBjeTVzWlc1bmRHZ3BYRzRnSUdsbUlDZ2hLSFJvYVhOYmIyWm1jMlYwWFNBbUlEQjRPREFwS1NCeVpYUjFjbTRnS0hSb2FYTmJiMlptYzJWMFhTbGNiaUFnY21WMGRYSnVJQ2dvTUhobVppQXRJSFJvYVhOYmIyWm1jMlYwWFNBcklERXBJQ29nTFRFcFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1Y21WaFpFbHVkREUyVEVVZ1BTQm1kVzVqZEdsdmJpQnlaV0ZrU1c1ME1UWk1SU0FvYjJabWMyVjBMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMDltWm5ObGRDaHZabVp6WlhRc0lESXNJSFJvYVhNdWJHVnVaM1JvS1Z4dUlDQjJZWElnZG1Gc0lEMGdkR2hwYzF0dlptWnpaWFJkSUh3Z0tIUm9hWE5iYjJabWMyVjBJQ3NnTVYwZ1BEd2dPQ2xjYmlBZ2NtVjBkWEp1SUNoMllXd2dKaUF3ZURnd01EQXBJRDhnZG1Gc0lId2dNSGhHUmtaR01EQXdNQ0E2SUhaaGJGeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5KbFlXUkpiblF4TmtKRklEMGdablZ1WTNScGIyNGdjbVZoWkVsdWRERTJRa1VnS0c5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRQWm1aelpYUW9iMlptYzJWMExDQXlMQ0IwYUdsekxteGxibWQwYUNsY2JpQWdkbUZ5SUhaaGJDQTlJSFJvYVhOYmIyWm1jMlYwSUNzZ01WMGdmQ0FvZEdocGMxdHZabVp6WlhSZElEdzhJRGdwWEc0Z0lISmxkSFZ5YmlBb2RtRnNJQ1lnTUhnNE1EQXdLU0EvSUhaaGJDQjhJREI0UmtaR1JqQXdNREFnT2lCMllXeGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtTVzUwTXpKTVJTQTlJR1oxYm1OMGFXOXVJSEpsWVdSSmJuUXpNa3hGSUNodlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yVDJabWMyVjBLRzltWm5ObGRDd2dOQ3dnZEdocGN5NXNaVzVuZEdncFhHNWNiaUFnY21WMGRYSnVJQ2gwYUdselcyOW1abk5sZEYwcElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF4WFNBOFBDQTRLU0I4WEc0Z0lDQWdLSFJvYVhOYmIyWm1jMlYwSUNzZ01sMGdQRHdnTVRZcElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF6WFNBOFBDQXlOQ2xjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNXlaV0ZrU1c1ME16SkNSU0E5SUdaMWJtTjBhVzl1SUhKbFlXUkpiblF6TWtKRklDaHZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclQyWm1jMlYwS0c5bVpuTmxkQ3dnTkN3Z2RHaHBjeTVzWlc1bmRHZ3BYRzVjYmlBZ2NtVjBkWEp1SUNoMGFHbHpXMjltWm5ObGRGMGdQRHdnTWpRcElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF4WFNBOFBDQXhOaWtnZkZ4dUlDQWdJQ2gwYUdselcyOW1abk5sZENBcklESmRJRHc4SURncElIeGNiaUFnSUNBb2RHaHBjMXR2Wm1aelpYUWdLeUF6WFNsY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzV5WldGa1JteHZZWFJNUlNBOUlHWjFibU4wYVc5dUlISmxZV1JHYkc5aGRFeEZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z05Dd2dkR2hwY3k1c1pXNW5kR2dwWEc0Z0lISmxkSFZ5YmlCcFpXVmxOelUwTG5KbFlXUW9kR2hwY3l3Z2IyWm1jMlYwTENCMGNuVmxMQ0F5TXl3Z05DbGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtSbXh2WVhSQ1JTQTlJR1oxYm1OMGFXOXVJSEpsWVdSR2JHOWhkRUpGSUNodlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yVDJabWMyVjBLRzltWm5ObGRDd2dOQ3dnZEdocGN5NXNaVzVuZEdncFhHNGdJSEpsZEhWeWJpQnBaV1ZsTnpVMExuSmxZV1FvZEdocGN5d2diMlptYzJWMExDQm1ZV3h6WlN3Z01qTXNJRFFwWEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVjbVZoWkVSdmRXSnNaVXhGSUQwZ1puVnVZM1JwYjI0Z2NtVmhaRVJ2ZFdKc1pVeEZJQ2h2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJUMlptYzJWMEtHOW1abk5sZEN3Z09Dd2dkR2hwY3k1c1pXNW5kR2dwWEc0Z0lISmxkSFZ5YmlCcFpXVmxOelUwTG5KbFlXUW9kR2hwY3l3Z2IyWm1jMlYwTENCMGNuVmxMQ0ExTWl3Z09DbGNibjFjYmx4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1eVpXRmtSRzkxWW14bFFrVWdQU0JtZFc1amRHbHZiaUJ5WldGa1JHOTFZbXhsUWtVZ0tHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0UFptWnpaWFFvYjJabWMyVjBMQ0E0TENCMGFHbHpMbXhsYm1kMGFDbGNiaUFnY21WMGRYSnVJR2xsWldVM05UUXVjbVZoWkNoMGFHbHpMQ0J2Wm1aelpYUXNJR1poYkhObExDQTFNaXdnT0NsY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJobFkydEpiblFnS0dKMVppd2dkbUZzZFdVc0lHOW1abk5sZEN3Z1pYaDBMQ0J0WVhnc0lHMXBiaWtnZTF4dUlDQnBaaUFvSVVKMVptWmxjaTVwYzBKMVptWmxjaWhpZFdZcEtTQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLQ2RpZFdabVpYSWdiWFZ6ZENCaVpTQmhJRUoxWm1abGNpQnBibk4wWVc1alpTY3BYRzRnSUdsbUlDaDJZV3gxWlNBK0lHMWhlQ0I4ZkNCMllXeDFaU0E4SUcxcGJpa2dkR2h5YjNjZ2JtVjNJRkpoYm1kbFJYSnliM0lvSjNaaGJIVmxJR2x6SUc5MWRDQnZaaUJpYjNWdVpITW5LVnh1SUNCcFppQW9iMlptYzJWMElDc2daWGgwSUQ0Z1luVm1MbXhsYm1kMGFDa2dkR2h5YjNjZ2JtVjNJRkpoYm1kbFJYSnliM0lvSjJsdVpHVjRJRzkxZENCdlppQnlZVzVuWlNjcFhHNTlYRzVjYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZDNKcGRHVlZTVzUwVEVVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlZWSmJuUk1SU0FvZG1Gc2RXVXNJRzltWm5ObGRDd2dZbmwwWlV4bGJtZDBhQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdkbUZzZFdVZ1BTQXJkbUZzZFdWY2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElENCtQaUF3WEc0Z0lHSjVkR1ZNWlc1bmRHZ2dQU0JpZVhSbFRHVnVaM1JvSUQ0K1BpQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSUdKNWRHVk1aVzVuZEdnc0lFMWhkR2d1Y0c5M0tESXNJRGdnS2lCaWVYUmxUR1Z1WjNSb0tTd2dNQ2xjYmx4dUlDQjJZWElnYlhWc0lEMGdNVnh1SUNCMllYSWdhU0E5SURCY2JpQWdkR2hwYzF0dlptWnpaWFJkSUQwZ2RtRnNkV1VnSmlBd2VFWkdYRzRnSUhkb2FXeGxJQ2dySzJrZ1BDQmllWFJsVEdWdVozUm9JQ1ltSUNodGRXd2dLajBnTUhneE1EQXBLU0I3WEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lCcFhTQTlJQ2gyWVd4MVpTQXZJRzExYkNrZ1BqNCtJREFnSmlBd2VFWkdYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdiMlptYzJWMElDc2dZbmwwWlV4bGJtZDBhRnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsVlVsdWRFSkZJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVlZTVzUwUWtVZ0tIWmhiSFZsTENCdlptWnpaWFFzSUdKNWRHVk1aVzVuZEdnc0lHNXZRWE56WlhKMEtTQjdYRzRnSUhaaGJIVmxJRDBnSzNaaGJIVmxYRzRnSUc5bVpuTmxkQ0E5SUc5bVpuTmxkQ0ErUGo0Z01GeHVJQ0JpZVhSbFRHVnVaM1JvSUQwZ1lubDBaVXhsYm1kMGFDQStQajRnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMGx1ZENoMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQmllWFJsVEdWdVozUm9MQ0JOWVhSb0xuQnZkeWd5TENBNElDb2dZbmwwWlV4bGJtZDBhQ2tzSURBcFhHNWNiaUFnZG1GeUlHa2dQU0JpZVhSbFRHVnVaM1JvSUMwZ01WeHVJQ0IyWVhJZ2JYVnNJRDBnTVZ4dUlDQjBhR2x6VzI5bVpuTmxkQ0FySUdsZElEMGdkbUZzZFdVZ0ppQXdlRVpHWEc0Z0lIZG9hV3hsSUNndExXa2dQajBnTUNBbUppQW9iWFZzSUNvOUlEQjRNVEF3S1NrZ2UxeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dhVjBnUFNBb2RtRnNkV1VnTHlCdGRXd3BJRDQrUGlBd0lDWWdNSGhHUmx4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySUdKNWRHVk1aVzVuZEdoY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpWVkpiblE0SUQwZ1puVnVZM1JwYjI0Z2QzSnBkR1ZWU1c1ME9DQW9kbUZzZFdVc0lHOW1abk5sZEN3Z2JtOUJjM05sY25RcElIdGNiaUFnZG1Gc2RXVWdQU0FyZG1Gc2RXVmNiaUFnYjJabWMyVjBJRDBnYjJabWMyVjBJRDQrUGlBd1hHNGdJR2xtSUNnaGJtOUJjM05sY25RcElHTm9aV05yU1c1MEtIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJREVzSURCNFptWXNJREFwWEc0Z0lHbG1JQ2doUW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFwSUhaaGJIVmxJRDBnVFdGMGFDNW1iRzl2Y2loMllXeDFaU2xjYmlBZ2RHaHBjMXR2Wm1aelpYUmRJRDBnZG1Gc2RXVmNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJREZjYm4xY2JseHVablZ1WTNScGIyNGdiMkpxWldOMFYzSnBkR1ZWU1c1ME1UWWdLR0oxWml3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnYkdsMGRHeGxSVzVrYVdGdUtTQjdYRzRnSUdsbUlDaDJZV3gxWlNBOElEQXBJSFpoYkhWbElEMGdNSGhtWm1abUlDc2dkbUZzZFdVZ0t5QXhYRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQXdMQ0JxSUQwZ1RXRjBhQzV0YVc0b1luVm1MbXhsYm1kMGFDQXRJRzltWm5ObGRDd2dNaWs3SUdrZ1BDQnFPeUJwS3lzcElIdGNiaUFnSUNCaWRXWmJiMlptYzJWMElDc2dhVjBnUFNBb2RtRnNkV1VnSmlBb01IaG1aaUE4UENBb09DQXFJQ2hzYVhSMGJHVkZibVJwWVc0Z1B5QnBJRG9nTVNBdElHa3BLU2twSUQ0K1BseHVJQ0FnSUNBZ0tHeHBkSFJzWlVWdVpHbGhiaUEvSUdrZ09pQXhJQzBnYVNrZ0tpQTRYRzRnSUgxY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpWVkpiblF4Tmt4RklEMGdablZ1WTNScGIyNGdkM0pwZEdWVlNXNTBNVFpNUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdkbUZzZFdVZ1BTQXJkbUZzZFdWY2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElENCtQaUF3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJTVzUwS0hSb2FYTXNJSFpoYkhWbExDQnZabVp6WlhRc0lESXNJREI0Wm1abVppd2dNQ2xjYmlBZ2FXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lDQWdkR2hwYzF0dlptWnpaWFJkSUQwZ2RtRnNkV1ZjYmlBZ0lDQjBhR2x6VzI5bVpuTmxkQ0FySURGZElEMGdLSFpoYkhWbElENCtQaUE0S1Z4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUc5aWFtVmpkRmR5YVhSbFZVbHVkREUyS0hSb2FYTXNJSFpoYkhWbExDQnZabVp6WlhRc0lIUnlkV1VwWEc0Z0lIMWNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJREpjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlZWSmJuUXhOa0pGSUQwZ1puVnVZM1JwYjI0Z2QzSnBkR1ZWU1c1ME1UWkNSU0FvZG1Gc2RXVXNJRzltWm5ObGRDd2dibTlCYzNObGNuUXBJSHRjYmlBZ2RtRnNkV1VnUFNBcmRtRnNkV1ZjYmlBZ2IyWm1jMlYwSUQwZ2IyWm1jMlYwSUQ0K1BpQXdYRzRnSUdsbUlDZ2hibTlCYzNObGNuUXBJR05vWldOclNXNTBLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSURJc0lEQjRabVptWml3Z01DbGNiaUFnYVdZZ0tFSjFabVpsY2k1VVdWQkZSRjlCVWxKQldWOVRWVkJRVDFKVUtTQjdYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dNVjBnUFNCMllXeDFaVnh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJRzlpYW1WamRGZHlhWFJsVlVsdWRERTJLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSUdaaGJITmxLVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QXlYRzU5WEc1Y2JtWjFibU4wYVc5dUlHOWlhbVZqZEZkeWFYUmxWVWx1ZERNeUlDaGlkV1lzSUhaaGJIVmxMQ0J2Wm1aelpYUXNJR3hwZEhSc1pVVnVaR2xoYmlrZ2UxeHVJQ0JwWmlBb2RtRnNkV1VnUENBd0tTQjJZV3gxWlNBOUlEQjRabVptWm1abVptWWdLeUIyWVd4MVpTQXJJREZjYmlBZ1ptOXlJQ2gyWVhJZ2FTQTlJREFzSUdvZ1BTQk5ZWFJvTG0xcGJpaGlkV1l1YkdWdVozUm9JQzBnYjJabWMyVjBMQ0EwS1RzZ2FTQThJR283SUdrckt5a2dlMXh1SUNBZ0lHSjFabHR2Wm1aelpYUWdLeUJwWFNBOUlDaDJZV3gxWlNBK1BqNGdLR3hwZEhSc1pVVnVaR2xoYmlBL0lHa2dPaUF6SUMwZ2FTa2dLaUE0S1NBbUlEQjRabVpjYmlBZ2ZWeHVmVnh1WEc1Q2RXWm1aWEl1Y0hKdmRHOTBlWEJsTG5keWFYUmxWVWx1ZERNeVRFVWdQU0JtZFc1amRHbHZiaUIzY21sMFpWVkpiblF6TWt4RklDaDJZV3gxWlN3Z2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0IyWVd4MVpTQTlJQ3QyWVd4MVpWeHVJQ0J2Wm1aelpYUWdQU0J2Wm1aelpYUWdQajQrSURCY2JpQWdhV1lnS0NGdWIwRnpjMlZ5ZENrZ1kyaGxZMnRKYm5Rb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dOQ3dnTUhobVptWm1abVptWml3Z01DbGNiaUFnYVdZZ0tFSjFabVpsY2k1VVdWQkZSRjlCVWxKQldWOVRWVkJRVDFKVUtTQjdYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUWdLeUF6WFNBOUlDaDJZV3gxWlNBK1BqNGdNalFwWEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lBeVhTQTlJQ2gyWVd4MVpTQStQajRnTVRZcFhHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QXhYU0E5SUNoMllXeDFaU0ErUGo0Z09DbGNiaUFnSUNCMGFHbHpXMjltWm5ObGRGMGdQU0IyWVd4MVpWeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lHOWlhbVZqZEZkeWFYUmxWVWx1ZERNeUtIUm9hWE1zSUhaaGJIVmxMQ0J2Wm1aelpYUXNJSFJ5ZFdVcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySURSY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpWVkpiblF6TWtKRklEMGdablZ1WTNScGIyNGdkM0pwZEdWVlNXNTBNekpDUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdkbUZzZFdVZ1BTQXJkbUZzZFdWY2JpQWdiMlptYzJWMElEMGdiMlptYzJWMElENCtQaUF3WEc0Z0lHbG1JQ2doYm05QmMzTmxjblFwSUdOb1pXTnJTVzUwS0hSb2FYTXNJSFpoYkhWbExDQnZabVp6WlhRc0lEUXNJREI0Wm1abVptWm1abVlzSURBcFhHNGdJR2xtSUNoQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNrZ2UxeHVJQ0FnSUhSb2FYTmJiMlptYzJWMFhTQTlJQ2gyWVd4MVpTQStQajRnTWpRcFhHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QXhYU0E5SUNoMllXeDFaU0ErUGo0Z01UWXBYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUWdLeUF5WFNBOUlDaDJZV3gxWlNBK1BqNGdPQ2xjYmlBZ0lDQjBhR2x6VzI5bVpuTmxkQ0FySUROZElEMGdkbUZzZFdWY2JpQWdmU0JsYkhObElIdGNiaUFnSUNCdlltcGxZM1JYY21sMFpWVkpiblF6TWloMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQm1ZV3h6WlNsY2JpQWdmVnh1SUNCeVpYUjFjbTRnYjJabWMyVjBJQ3NnTkZ4dWZWeHVYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbmR5YVhSbFNXNTBURVVnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVWx1ZEV4RklDaDJZV3gxWlN3Z2IyWm1jMlYwTENCaWVYUmxUR1Z1WjNSb0xDQnViMEZ6YzJWeWRDa2dlMXh1SUNCMllXeDFaU0E5SUN0MllXeDFaVnh1SUNCdlptWnpaWFFnUFNCdlptWnpaWFFnUGo0K0lEQmNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dlMXh1SUNBZ0lHTm9aV05yU1c1MEtGeHVJQ0FnSUNBZ2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dZbmwwWlV4bGJtZDBhQ3hjYmlBZ0lDQWdJRTFoZEdndWNHOTNLRElzSURnZ0tpQmllWFJsVEdWdVozUm9JQzBnTVNrZ0xTQXhMRnh1SUNBZ0lDQWdMVTFoZEdndWNHOTNLRElzSURnZ0tpQmllWFJsVEdWdVozUm9JQzBnTVNsY2JpQWdJQ0FwWEc0Z0lIMWNibHh1SUNCMllYSWdhU0E5SURCY2JpQWdkbUZ5SUcxMWJDQTlJREZjYmlBZ2RtRnlJSE4xWWlBOUlIWmhiSFZsSUR3Z01DQS9JREVnT2lBd1hHNGdJSFJvYVhOYmIyWm1jMlYwWFNBOUlIWmhiSFZsSUNZZ01IaEdSbHh1SUNCM2FHbHNaU0FvS3l0cElEd2dZbmwwWlV4bGJtZDBhQ0FtSmlBb2JYVnNJQ285SURCNE1UQXdLU2tnZTF4dUlDQWdJSFJvYVhOYmIyWm1jMlYwSUNzZ2FWMGdQU0FvS0haaGJIVmxJQzhnYlhWc0tTQStQaUF3S1NBdElITjFZaUFtSURCNFJrWmNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QmllWFJsVEdWdVozUm9YRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWQzSnBkR1ZKYm5SQ1JTQTlJR1oxYm1OMGFXOXVJSGR5YVhSbFNXNTBRa1VnS0haaGJIVmxMQ0J2Wm1aelpYUXNJR0o1ZEdWTVpXNW5kR2dzSUc1dlFYTnpaWEowS1NCN1hHNGdJSFpoYkhWbElEMGdLM1poYkhWbFhHNGdJRzltWm5ObGRDQTlJRzltWm5ObGRDQStQajRnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCN1hHNGdJQ0FnWTJobFkydEpiblFvWEc0Z0lDQWdJQ0IwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCaWVYUmxUR1Z1WjNSb0xGeHVJQ0FnSUNBZ1RXRjBhQzV3YjNjb01pd2dPQ0FxSUdKNWRHVk1aVzVuZEdnZ0xTQXhLU0F0SURFc1hHNGdJQ0FnSUNBdFRXRjBhQzV3YjNjb01pd2dPQ0FxSUdKNWRHVk1aVzVuZEdnZ0xTQXhLVnh1SUNBZ0lDbGNiaUFnZlZ4dVhHNGdJSFpoY2lCcElEMGdZbmwwWlV4bGJtZDBhQ0F0SURGY2JpQWdkbUZ5SUcxMWJDQTlJREZjYmlBZ2RtRnlJSE4xWWlBOUlIWmhiSFZsSUR3Z01DQS9JREVnT2lBd1hHNGdJSFJvYVhOYmIyWm1jMlYwSUNzZ2FWMGdQU0IyWVd4MVpTQW1JREI0UmtaY2JpQWdkMmhwYkdVZ0tDMHRhU0ErUFNBd0lDWW1JQ2h0ZFd3Z0tqMGdNSGd4TURBcEtTQjdYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUWdLeUJwWFNBOUlDZ29kbUZzZFdVZ0x5QnRkV3dwSUQ0K0lEQXBJQzBnYzNWaUlDWWdNSGhHUmx4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySUdKNWRHVk1aVzVuZEdoY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpVbHVkRGdnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVWx1ZERnZ0tIWmhiSFZsTENCdlptWnpaWFFzSUc1dlFYTnpaWEowS1NCN1hHNGdJSFpoYkhWbElEMGdLM1poYkhWbFhHNGdJRzltWm5ObGRDQTlJRzltWm5ObGRDQStQajRnTUZ4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCamFHVmphMGx1ZENoMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQXhMQ0F3ZURkbUxDQXRNSGc0TUNsY2JpQWdhV1lnS0NGQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNrZ2RtRnNkV1VnUFNCTllYUm9MbVpzYjI5eUtIWmhiSFZsS1Z4dUlDQnBaaUFvZG1Gc2RXVWdQQ0F3S1NCMllXeDFaU0E5SURCNFptWWdLeUIyWVd4MVpTQXJJREZjYmlBZ2RHaHBjMXR2Wm1aelpYUmRJRDBnZG1Gc2RXVmNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJREZjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlVsdWRERTJURVVnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVWx1ZERFMlRFVWdLSFpoYkhWbExDQnZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUhaaGJIVmxJRDBnSzNaaGJIVmxYRzRnSUc5bVpuTmxkQ0E5SUc5bVpuTmxkQ0ErUGo0Z01GeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQmphR1ZqYTBsdWRDaDBhR2x6TENCMllXeDFaU3dnYjJabWMyVjBMQ0F5TENBd2VEZG1abVlzSUMwd2VEZ3dNREFwWEc0Z0lHbG1JQ2hDZFdabVpYSXVWRmxRUlVSZlFWSlNRVmxmVTFWUVVFOVNWQ2tnZTF4dUlDQWdJSFJvYVhOYmIyWm1jMlYwWFNBOUlIWmhiSFZsWEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lBeFhTQTlJQ2gyWVd4MVpTQStQajRnT0NsY2JpQWdmU0JsYkhObElIdGNiaUFnSUNCdlltcGxZM1JYY21sMFpWVkpiblF4TmloMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQjBjblZsS1Z4dUlDQjlYRzRnSUhKbGRIVnliaUJ2Wm1aelpYUWdLeUF5WEc1OVhHNWNia0oxWm1abGNpNXdjbTkwYjNSNWNHVXVkM0pwZEdWSmJuUXhOa0pGSUQwZ1puVnVZM1JwYjI0Z2QzSnBkR1ZKYm5ReE5rSkZJQ2gyWVd4MVpTd2diMlptYzJWMExDQnViMEZ6YzJWeWRDa2dlMXh1SUNCMllXeDFaU0E5SUN0MllXeDFaVnh1SUNCdlptWnpaWFFnUFNCdlptWnpaWFFnUGo0K0lEQmNiaUFnYVdZZ0tDRnViMEZ6YzJWeWRDa2dZMmhsWTJ0SmJuUW9kR2hwY3l3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnTWl3Z01IZzNabVptTENBdE1IZzRNREF3S1Z4dUlDQnBaaUFvUW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFwSUh0Y2JpQWdJQ0IwYUdselcyOW1abk5sZEYwZ1BTQW9kbUZzZFdVZ1BqNCtJRGdwWEc0Z0lDQWdkR2hwYzF0dlptWnpaWFFnS3lBeFhTQTlJSFpoYkhWbFhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2IySnFaV04wVjNKcGRHVlZTVzUwTVRZb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dabUZzYzJVcFhHNGdJSDFjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySURKY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpVbHVkRE15VEVVZ1BTQm1kVzVqZEdsdmJpQjNjbWwwWlVsdWRETXlURVVnS0haaGJIVmxMQ0J2Wm1aelpYUXNJRzV2UVhOelpYSjBLU0I3WEc0Z0lIWmhiSFZsSUQwZ0szWmhiSFZsWEc0Z0lHOW1abk5sZENBOUlHOW1abk5sZENBK1BqNGdNRnh1SUNCcFppQW9JVzV2UVhOelpYSjBLU0JqYUdWamEwbHVkQ2gwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENBMExDQXdlRGRtWm1abVptWm1MQ0F0TUhnNE1EQXdNREF3TUNsY2JpQWdhV1lnS0VKMVptWmxjaTVVV1ZCRlJGOUJVbEpCV1Y5VFZWQlFUMUpVS1NCN1hHNGdJQ0FnZEdocGMxdHZabVp6WlhSZElEMGdkbUZzZFdWY2JpQWdJQ0IwYUdselcyOW1abk5sZENBcklERmRJRDBnS0haaGJIVmxJRDQrUGlBNEtWeHVJQ0FnSUhSb2FYTmJiMlptYzJWMElDc2dNbDBnUFNBb2RtRnNkV1VnUGo0K0lERTJLVnh1SUNBZ0lIUm9hWE5iYjJabWMyVjBJQ3NnTTEwZ1BTQW9kbUZzZFdVZ1BqNCtJREkwS1Z4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUc5aWFtVmpkRmR5YVhSbFZVbHVkRE15S0hSb2FYTXNJSFpoYkhWbExDQnZabVp6WlhRc0lIUnlkV1VwWEc0Z0lIMWNiaUFnY21WMGRYSnVJRzltWm5ObGRDQXJJRFJjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlVsdWRETXlRa1VnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVWx1ZERNeVFrVWdLSFpoYkhWbExDQnZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUhaaGJIVmxJRDBnSzNaaGJIVmxYRzRnSUc5bVpuTmxkQ0E5SUc5bVpuTmxkQ0ErUGo0Z01GeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQmphR1ZqYTBsdWRDaDBhR2x6TENCMllXeDFaU3dnYjJabWMyVjBMQ0EwTENBd2VEZG1abVptWm1abUxDQXRNSGc0TURBd01EQXdNQ2xjYmlBZ2FXWWdLSFpoYkhWbElEd2dNQ2tnZG1Gc2RXVWdQU0F3ZUdabVptWm1abVptSUNzZ2RtRnNkV1VnS3lBeFhHNGdJR2xtSUNoQ2RXWm1aWEl1VkZsUVJVUmZRVkpTUVZsZlUxVlFVRTlTVkNrZ2UxeHVJQ0FnSUhSb2FYTmJiMlptYzJWMFhTQTlJQ2gyWVd4MVpTQStQajRnTWpRcFhHNGdJQ0FnZEdocGMxdHZabVp6WlhRZ0t5QXhYU0E5SUNoMllXeDFaU0ErUGo0Z01UWXBYRzRnSUNBZ2RHaHBjMXR2Wm1aelpYUWdLeUF5WFNBOUlDaDJZV3gxWlNBK1BqNGdPQ2xjYmlBZ0lDQjBhR2x6VzI5bVpuTmxkQ0FySUROZElEMGdkbUZzZFdWY2JpQWdmU0JsYkhObElIdGNiaUFnSUNCdlltcGxZM1JYY21sMFpWVkpiblF6TWloMGFHbHpMQ0IyWVd4MVpTd2diMlptYzJWMExDQm1ZV3h6WlNsY2JpQWdmVnh1SUNCeVpYUjFjbTRnYjJabWMyVjBJQ3NnTkZ4dWZWeHVYRzVtZFc1amRHbHZiaUJqYUdWamEwbEZSVVUzTlRRZ0tHSjFaaXdnZG1Gc2RXVXNJRzltWm5ObGRDd2daWGgwTENCdFlYZ3NJRzFwYmlrZ2UxeHVJQ0JwWmlBb2RtRnNkV1VnUGlCdFlYZ2dmSHdnZG1Gc2RXVWdQQ0J0YVc0cElIUm9jbTkzSUc1bGR5QlNZVzVuWlVWeWNtOXlLQ2QyWVd4MVpTQnBjeUJ2ZFhRZ2IyWWdZbTkxYm1Sekp5bGNiaUFnYVdZZ0tHOW1abk5sZENBcklHVjRkQ0ErSUdKMVppNXNaVzVuZEdncElIUm9jbTkzSUc1bGR5QlNZVzVuWlVWeWNtOXlLQ2RwYm1SbGVDQnZkWFFnYjJZZ2NtRnVaMlVuS1Z4dUlDQnBaaUFvYjJabWMyVjBJRHdnTUNrZ2RHaHliM2NnYm1WM0lGSmhibWRsUlhKeWIzSW9KMmx1WkdWNElHOTFkQ0J2WmlCeVlXNW5aU2NwWEc1OVhHNWNibVoxYm1OMGFXOXVJSGR5YVhSbFJteHZZWFFnS0dKMVppd2dkbUZzZFdVc0lHOW1abk5sZEN3Z2JHbDBkR3hsUlc1a2FXRnVMQ0J1YjBGemMyVnlkQ2tnZTF4dUlDQnBaaUFvSVc1dlFYTnpaWEowS1NCN1hHNGdJQ0FnWTJobFkydEpSVVZGTnpVMEtHSjFaaXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dOQ3dnTXk0ME1ESTRNak0wTmpZek9EVXlPRGcyWlNzek9Dd2dMVE11TkRBeU9ESXpORFkyTXpnMU1qZzRObVVyTXpncFhHNGdJSDFjYmlBZ2FXVmxaVGMxTkM1M2NtbDBaU2hpZFdZc0lIWmhiSFZsTENCdlptWnpaWFFzSUd4cGRIUnNaVVZ1WkdsaGJpd2dNak1zSURRcFhHNGdJSEpsZEhWeWJpQnZabVp6WlhRZ0t5QTBYRzU5WEc1Y2JrSjFabVpsY2k1d2NtOTBiM1I1Y0dVdWQzSnBkR1ZHYkc5aGRFeEZJRDBnWm5WdVkzUnBiMjRnZDNKcGRHVkdiRzloZEV4RklDaDJZV3gxWlN3Z2IyWm1jMlYwTENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0J5WlhSMWNtNGdkM0pwZEdWR2JHOWhkQ2gwYUdsekxDQjJZV3gxWlN3Z2IyWm1jMlYwTENCMGNuVmxMQ0J1YjBGemMyVnlkQ2xjYm4xY2JseHVRblZtWm1WeUxuQnliM1J2ZEhsd1pTNTNjbWwwWlVac2IyRjBRa1VnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVVpzYjJGMFFrVWdLSFpoYkhWbExDQnZabVp6WlhRc0lHNXZRWE56WlhKMEtTQjdYRzRnSUhKbGRIVnliaUIzY21sMFpVWnNiMkYwS0hSb2FYTXNJSFpoYkhWbExDQnZabVp6WlhRc0lHWmhiSE5sTENCdWIwRnpjMlZ5ZENsY2JuMWNibHh1Wm5WdVkzUnBiMjRnZDNKcGRHVkViM1ZpYkdVZ0tHSjFaaXdnZG1Gc2RXVXNJRzltWm5ObGRDd2diR2wwZEd4bFJXNWthV0Z1TENCdWIwRnpjMlZ5ZENrZ2UxeHVJQ0JwWmlBb0lXNXZRWE56WlhKMEtTQjdYRzRnSUNBZ1kyaGxZMnRKUlVWRk56VTBLR0oxWml3Z2RtRnNkV1VzSUc5bVpuTmxkQ3dnT0N3Z01TNDNPVGMyT1RNeE16UTROakl6TVRVM1JTc3pNRGdzSUMweExqYzVOelk1TXpFek5EZzJNak14TlRkRkt6TXdPQ2xjYmlBZ2ZWeHVJQ0JwWldWbE56VTBMbmR5YVhSbEtHSjFaaXdnZG1Gc2RXVXNJRzltWm5ObGRDd2diR2wwZEd4bFJXNWthV0Z1TENBMU1pd2dPQ2xjYmlBZ2NtVjBkWEp1SUc5bVpuTmxkQ0FySURoY2JuMWNibHh1UW5WbVptVnlMbkJ5YjNSdmRIbHdaUzUzY21sMFpVUnZkV0pzWlV4RklEMGdablZ1WTNScGIyNGdkM0pwZEdWRWIzVmliR1ZNUlNBb2RtRnNkV1VzSUc5bVpuTmxkQ3dnYm05QmMzTmxjblFwSUh0Y2JpQWdjbVYwZFhKdUlIZHlhWFJsUkc5MVlteGxLSFJvYVhNc0lIWmhiSFZsTENCdlptWnpaWFFzSUhSeWRXVXNJRzV2UVhOelpYSjBLVnh1ZlZ4dVhHNUNkV1ptWlhJdWNISnZkRzkwZVhCbExuZHlhWFJsUkc5MVlteGxRa1VnUFNCbWRXNWpkR2x2YmlCM2NtbDBaVVJ2ZFdKc1pVSkZJQ2gyWVd4MVpTd2diMlptYzJWMExDQnViMEZ6YzJWeWRDa2dlMXh1SUNCeVpYUjFjbTRnZDNKcGRHVkViM1ZpYkdVb2RHaHBjeXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dabUZzYzJVc0lHNXZRWE56WlhKMEtWeHVmVnh1WEc0dkx5QmpiM0I1S0hSaGNtZGxkRUoxWm1abGNpd2dkR0Z5WjJWMFUzUmhjblE5TUN3Z2MyOTFjbU5sVTNSaGNuUTlNQ3dnYzI5MWNtTmxSVzVrUFdKMVptWmxjaTVzWlc1bmRHZ3BYRzVDZFdabVpYSXVjSEp2ZEc5MGVYQmxMbU52Y0hrZ1BTQm1kVzVqZEdsdmJpQmpiM0I1SUNoMFlYSm5aWFFzSUhSaGNtZGxkRjl6ZEdGeWRDd2djM1JoY25Rc0lHVnVaQ2tnZTF4dUlDQnBaaUFvSVhOMFlYSjBLU0J6ZEdGeWRDQTlJREJjYmlBZ2FXWWdLQ0ZsYm1RZ0ppWWdaVzVrSUNFOVBTQXdLU0JsYm1RZ1BTQjBhR2x6TG14bGJtZDBhRnh1SUNCcFppQW9kR0Z5WjJWMFgzTjBZWEowSUQ0OUlIUmhjbWRsZEM1c1pXNW5kR2dwSUhSaGNtZGxkRjl6ZEdGeWRDQTlJSFJoY21kbGRDNXNaVzVuZEdoY2JpQWdhV1lnS0NGMFlYSm5aWFJmYzNSaGNuUXBJSFJoY21kbGRGOXpkR0Z5ZENBOUlEQmNiaUFnYVdZZ0tHVnVaQ0ErSURBZ0ppWWdaVzVrSUR3Z2MzUmhjblFwSUdWdVpDQTlJSE4wWVhKMFhHNWNiaUFnTHk4Z1EyOXdlU0F3SUdKNWRHVnpPeUIzWlNkeVpTQmtiMjVsWEc0Z0lHbG1JQ2hsYm1RZ1BUMDlJSE4wWVhKMEtTQnlaWFIxY200Z01GeHVJQ0JwWmlBb2RHRnlaMlYwTG14bGJtZDBhQ0E5UFQwZ01DQjhmQ0IwYUdsekxteGxibWQwYUNBOVBUMGdNQ2tnY21WMGRYSnVJREJjYmx4dUlDQXZMeUJHWVhSaGJDQmxjbkp2Y2lCamIyNWthWFJwYjI1elhHNGdJR2xtSUNoMFlYSm5aWFJmYzNSaGNuUWdQQ0F3S1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUZKaGJtZGxSWEp5YjNJb0ozUmhjbWRsZEZOMFlYSjBJRzkxZENCdlppQmliM1Z1WkhNbktWeHVJQ0I5WEc0Z0lHbG1JQ2h6ZEdGeWRDQThJREFnZkh3Z2MzUmhjblFnUGowZ2RHaHBjeTVzWlc1bmRHZ3BJSFJvY205M0lHNWxkeUJTWVc1blpVVnljbTl5S0NkemIzVnlZMlZUZEdGeWRDQnZkWFFnYjJZZ1ltOTFibVJ6SnlsY2JpQWdhV1lnS0dWdVpDQThJREFwSUhSb2NtOTNJRzVsZHlCU1lXNW5aVVZ5Y205eUtDZHpiM1Z5WTJWRmJtUWdiM1YwSUc5bUlHSnZkVzVrY3ljcFhHNWNiaUFnTHk4Z1FYSmxJSGRsSUc5dllqOWNiaUFnYVdZZ0tHVnVaQ0ErSUhSb2FYTXViR1Z1WjNSb0tTQmxibVFnUFNCMGFHbHpMbXhsYm1kMGFGeHVJQ0JwWmlBb2RHRnlaMlYwTG14bGJtZDBhQ0F0SUhSaGNtZGxkRjl6ZEdGeWRDQThJR1Z1WkNBdElITjBZWEowS1NCN1hHNGdJQ0FnWlc1a0lEMGdkR0Z5WjJWMExteGxibWQwYUNBdElIUmhjbWRsZEY5emRHRnlkQ0FySUhOMFlYSjBYRzRnSUgxY2JseHVJQ0IyWVhJZ2JHVnVJRDBnWlc1a0lDMGdjM1JoY25SY2JseHVJQ0JwWmlBb2JHVnVJRHdnTVRBd01DQjhmQ0FoUW5WbVptVnlMbFJaVUVWRVgwRlNVa0ZaWDFOVlVGQlBVbFFwSUh0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJqc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMFlYSm5aWFJiYVNBcklIUmhjbWRsZEY5emRHRnlkRjBnUFNCMGFHbHpXMmtnS3lCemRHRnlkRjFjYmlBZ0lDQjlYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdkR0Z5WjJWMExsOXpaWFFvZEdocGN5NXpkV0poY25KaGVTaHpkR0Z5ZEN3Z2MzUmhjblFnS3lCc1pXNHBMQ0IwWVhKblpYUmZjM1JoY25RcFhHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2JHVnVYRzU5WEc1Y2JpOHZJR1pwYkd3b2RtRnNkV1VzSUhOMFlYSjBQVEFzSUdWdVpEMWlkV1ptWlhJdWJHVnVaM1JvS1Z4dVFuVm1abVZ5TG5CeWIzUnZkSGx3WlM1bWFXeHNJRDBnWm5WdVkzUnBiMjRnWm1sc2JDQW9kbUZzZFdVc0lITjBZWEowTENCbGJtUXBJSHRjYmlBZ2FXWWdLQ0YyWVd4MVpTa2dkbUZzZFdVZ1BTQXdYRzRnSUdsbUlDZ2hjM1JoY25RcElITjBZWEowSUQwZ01GeHVJQ0JwWmlBb0lXVnVaQ2tnWlc1a0lEMGdkR2hwY3k1c1pXNW5kR2hjYmx4dUlDQnBaaUFvWlc1a0lEd2djM1JoY25RcElIUm9jbTkzSUc1bGR5QlNZVzVuWlVWeWNtOXlLQ2RsYm1RZ1BDQnpkR0Z5ZENjcFhHNWNiaUFnTHk4Z1JtbHNiQ0F3SUdKNWRHVnpPeUIzWlNkeVpTQmtiMjVsWEc0Z0lHbG1JQ2hsYm1RZ1BUMDlJSE4wWVhKMEtTQnlaWFIxY201Y2JpQWdhV1lnS0hSb2FYTXViR1Z1WjNSb0lEMDlQU0F3S1NCeVpYUjFjbTVjYmx4dUlDQnBaaUFvYzNSaGNuUWdQQ0F3SUh4OElITjBZWEowSUQ0OUlIUm9hWE11YkdWdVozUm9LU0IwYUhKdmR5QnVaWGNnVW1GdVoyVkZjbkp2Y2lnbmMzUmhjblFnYjNWMElHOW1JR0p2ZFc1a2N5Y3BYRzRnSUdsbUlDaGxibVFnUENBd0lIeDhJR1Z1WkNBK0lIUm9hWE11YkdWdVozUm9LU0IwYUhKdmR5QnVaWGNnVW1GdVoyVkZjbkp2Y2lnblpXNWtJRzkxZENCdlppQmliM1Z1WkhNbktWeHVYRzRnSUhaaGNpQnBYRzRnSUdsbUlDaDBlWEJsYjJZZ2RtRnNkV1VnUFQwOUlDZHVkVzFpWlhJbktTQjdYRzRnSUNBZ1ptOXlJQ2hwSUQwZ2MzUmhjblE3SUdrZ1BDQmxibVE3SUdrckt5a2dlMXh1SUNBZ0lDQWdkR2hwYzF0cFhTQTlJSFpoYkhWbFhHNGdJQ0FnZlZ4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhaaGNpQmllWFJsY3lBOUlIVjBaamhVYjBKNWRHVnpLSFpoYkhWbExuUnZVM1J5YVc1bktDa3BYRzRnSUNBZ2RtRnlJR3hsYmlBOUlHSjVkR1Z6TG14bGJtZDBhRnh1SUNBZ0lHWnZjaUFvYVNBOUlITjBZWEowT3lCcElEd2daVzVrT3lCcEt5c3BJSHRjYmlBZ0lDQWdJSFJvYVhOYmFWMGdQU0JpZVhSbGMxdHBJQ1VnYkdWdVhWeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCMGFHbHpYRzU5WEc1Y2JpOHFLbHh1SUNvZ1EzSmxZWFJsY3lCaElHNWxkeUJnUVhKeVlYbENkV1ptWlhKZ0lIZHBkR2dnZEdobElDcGpiM0JwWldRcUlHMWxiVzl5ZVNCdlppQjBhR1VnWW5WbVptVnlJR2x1YzNSaGJtTmxMbHh1SUNvZ1FXUmtaV1FnYVc0Z1RtOWtaU0F3TGpFeUxpQlBibXg1SUdGMllXbHNZV0pzWlNCcGJpQmljbTkzYzJWeWN5QjBhR0YwSUhOMWNIQnZjblFnUVhKeVlYbENkV1ptWlhJdVhHNGdLaTljYmtKMVptWmxjaTV3Y205MGIzUjVjR1V1ZEc5QmNuSmhlVUoxWm1abGNpQTlJR1oxYm1OMGFXOXVJSFJ2UVhKeVlYbENkV1ptWlhJZ0tDa2dlMXh1SUNCcFppQW9kSGx3Wlc5bUlGVnBiblE0UVhKeVlYa2dJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ2FXWWdLRUoxWm1abGNpNVVXVkJGUkY5QlVsSkJXVjlUVlZCUVQxSlVLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdLRzVsZHlCQ2RXWm1aWElvZEdocGN5a3BMbUoxWm1abGNseHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IyWVhJZ1luVm1JRDBnYm1WM0lGVnBiblE0UVhKeVlYa29kR2hwY3k1c1pXNW5kR2dwWEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Dd2diR1Z1SUQwZ1luVm1MbXhsYm1kMGFEc2dhU0E4SUd4bGJqc2dhU0FyUFNBeEtTQjdYRzRnSUNBZ0lDQWdJR0oxWmx0cFhTQTlJSFJvYVhOYmFWMWNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lISmxkSFZ5YmlCaWRXWXVZblZtWm1WeVhHNGdJQ0FnZlZ4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0owSjFabVpsY2k1MGIwRnljbUY1UW5WbVptVnlJRzV2ZENCemRYQndiM0owWldRZ2FXNGdkR2hwY3lCaWNtOTNjMlZ5SnlsY2JpQWdmVnh1ZlZ4dVhHNHZMeUJJUlV4UVJWSWdSbFZPUTFSSlQwNVRYRzR2THlBOVBUMDlQVDA5UFQwOVBUMDlQVDA5WEc1Y2JuWmhjaUJDVUNBOUlFSjFabVpsY2k1d2NtOTBiM1I1Y0dWY2JseHVMeW9xWEc0Z0tpQkJkV2R0Wlc1MElHRWdWV2x1ZERoQmNuSmhlU0FxYVc1emRHRnVZMlVxSUNodWIzUWdkR2hsSUZWcGJuUTRRWEp5WVhrZ1kyeGhjM01oS1NCM2FYUm9JRUoxWm1abGNpQnRaWFJvYjJSelhHNGdLaTljYmtKMVptWmxjaTVmWVhWbmJXVnVkQ0E5SUdaMWJtTjBhVzl1SUY5aGRXZHRaVzUwSUNoaGNuSXBJSHRjYmlBZ1lYSnlMbU52Ym5OMGNuVmpkRzl5SUQwZ1FuVm1abVZ5WEc0Z0lHRnljaTVmYVhOQ2RXWm1aWElnUFNCMGNuVmxYRzVjYmlBZ0x5OGdjMkYyWlNCeVpXWmxjbVZ1WTJVZ2RHOGdiM0pwWjJsdVlXd2dWV2x1ZERoQmNuSmhlU0J6WlhRZ2JXVjBhRzlrSUdKbFptOXlaU0J2ZG1WeWQzSnBkR2x1WjF4dUlDQmhjbkl1WDNObGRDQTlJR0Z5Y2k1elpYUmNibHh1SUNBdkx5QmtaWEJ5WldOaGRHVmtMQ0IzYVd4c0lHSmxJSEpsYlc5MlpXUWdhVzRnYm05a1pTQXdMakV6SzF4dUlDQmhjbkl1WjJWMElEMGdRbEF1WjJWMFhHNGdJR0Z5Y2k1elpYUWdQU0JDVUM1elpYUmNibHh1SUNCaGNuSXVkM0pwZEdVZ1BTQkNVQzUzY21sMFpWeHVJQ0JoY25JdWRHOVRkSEpwYm1jZ1BTQkNVQzUwYjFOMGNtbHVaMXh1SUNCaGNuSXVkRzlNYjJOaGJHVlRkSEpwYm1jZ1BTQkNVQzUwYjFOMGNtbHVaMXh1SUNCaGNuSXVkRzlLVTA5T0lEMGdRbEF1ZEc5S1UwOU9YRzRnSUdGeWNpNWxjWFZoYkhNZ1BTQkNVQzVsY1hWaGJITmNiaUFnWVhKeUxtTnZiWEJoY21VZ1BTQkNVQzVqYjIxd1lYSmxYRzRnSUdGeWNpNXBibVJsZUU5bUlEMGdRbEF1YVc1a1pYaFBabHh1SUNCaGNuSXVZMjl3ZVNBOUlFSlFMbU52Y0hsY2JpQWdZWEp5TG5Oc2FXTmxJRDBnUWxBdWMyeHBZMlZjYmlBZ1lYSnlMbkpsWVdSVlNXNTBURVVnUFNCQ1VDNXlaV0ZrVlVsdWRFeEZYRzRnSUdGeWNpNXlaV0ZrVlVsdWRFSkZJRDBnUWxBdWNtVmhaRlZKYm5SQ1JWeHVJQ0JoY25JdWNtVmhaRlZKYm5RNElEMGdRbEF1Y21WaFpGVkpiblE0WEc0Z0lHRnljaTV5WldGa1ZVbHVkREUyVEVVZ1BTQkNVQzV5WldGa1ZVbHVkREUyVEVWY2JpQWdZWEp5TG5KbFlXUlZTVzUwTVRaQ1JTQTlJRUpRTG5KbFlXUlZTVzUwTVRaQ1JWeHVJQ0JoY25JdWNtVmhaRlZKYm5Rek1reEZJRDBnUWxBdWNtVmhaRlZKYm5Rek1reEZYRzRnSUdGeWNpNXlaV0ZrVlVsdWRETXlRa1VnUFNCQ1VDNXlaV0ZrVlVsdWRETXlRa1ZjYmlBZ1lYSnlMbkpsWVdSSmJuUk1SU0E5SUVKUUxuSmxZV1JKYm5STVJWeHVJQ0JoY25JdWNtVmhaRWx1ZEVKRklEMGdRbEF1Y21WaFpFbHVkRUpGWEc0Z0lHRnljaTV5WldGa1NXNTBPQ0E5SUVKUUxuSmxZV1JKYm5RNFhHNGdJR0Z5Y2k1eVpXRmtTVzUwTVRaTVJTQTlJRUpRTG5KbFlXUkpiblF4Tmt4RlhHNGdJR0Z5Y2k1eVpXRmtTVzUwTVRaQ1JTQTlJRUpRTG5KbFlXUkpiblF4TmtKRlhHNGdJR0Z5Y2k1eVpXRmtTVzUwTXpKTVJTQTlJRUpRTG5KbFlXUkpiblF6TWt4RlhHNGdJR0Z5Y2k1eVpXRmtTVzUwTXpKQ1JTQTlJRUpRTG5KbFlXUkpiblF6TWtKRlhHNGdJR0Z5Y2k1eVpXRmtSbXh2WVhSTVJTQTlJRUpRTG5KbFlXUkdiRzloZEV4RlhHNGdJR0Z5Y2k1eVpXRmtSbXh2WVhSQ1JTQTlJRUpRTG5KbFlXUkdiRzloZEVKRlhHNGdJR0Z5Y2k1eVpXRmtSRzkxWW14bFRFVWdQU0JDVUM1eVpXRmtSRzkxWW14bFRFVmNiaUFnWVhKeUxuSmxZV1JFYjNWaWJHVkNSU0E5SUVKUUxuSmxZV1JFYjNWaWJHVkNSVnh1SUNCaGNuSXVkM0pwZEdWVlNXNTBPQ0E5SUVKUUxuZHlhWFJsVlVsdWREaGNiaUFnWVhKeUxuZHlhWFJsVlVsdWRFeEZJRDBnUWxBdWQzSnBkR1ZWU1c1MFRFVmNiaUFnWVhKeUxuZHlhWFJsVlVsdWRFSkZJRDBnUWxBdWQzSnBkR1ZWU1c1MFFrVmNiaUFnWVhKeUxuZHlhWFJsVlVsdWRERTJURVVnUFNCQ1VDNTNjbWwwWlZWSmJuUXhOa3hGWEc0Z0lHRnljaTUzY21sMFpWVkpiblF4TmtKRklEMGdRbEF1ZDNKcGRHVlZTVzUwTVRaQ1JWeHVJQ0JoY25JdWQzSnBkR1ZWU1c1ME16Sk1SU0E5SUVKUUxuZHlhWFJsVlVsdWRETXlURVZjYmlBZ1lYSnlMbmR5YVhSbFZVbHVkRE15UWtVZ1BTQkNVQzUzY21sMFpWVkpiblF6TWtKRlhHNGdJR0Z5Y2k1M2NtbDBaVWx1ZEV4RklEMGdRbEF1ZDNKcGRHVkpiblJNUlZ4dUlDQmhjbkl1ZDNKcGRHVkpiblJDUlNBOUlFSlFMbmR5YVhSbFNXNTBRa1ZjYmlBZ1lYSnlMbmR5YVhSbFNXNTBPQ0E5SUVKUUxuZHlhWFJsU1c1ME9GeHVJQ0JoY25JdWQzSnBkR1ZKYm5ReE5reEZJRDBnUWxBdWQzSnBkR1ZKYm5ReE5reEZYRzRnSUdGeWNpNTNjbWwwWlVsdWRERTJRa1VnUFNCQ1VDNTNjbWwwWlVsdWRERTJRa1ZjYmlBZ1lYSnlMbmR5YVhSbFNXNTBNekpNUlNBOUlFSlFMbmR5YVhSbFNXNTBNekpNUlZ4dUlDQmhjbkl1ZDNKcGRHVkpiblF6TWtKRklEMGdRbEF1ZDNKcGRHVkpiblF6TWtKRlhHNGdJR0Z5Y2k1M2NtbDBaVVpzYjJGMFRFVWdQU0JDVUM1M2NtbDBaVVpzYjJGMFRFVmNiaUFnWVhKeUxuZHlhWFJsUm14dllYUkNSU0E5SUVKUUxuZHlhWFJsUm14dllYUkNSVnh1SUNCaGNuSXVkM0pwZEdWRWIzVmliR1ZNUlNBOUlFSlFMbmR5YVhSbFJHOTFZbXhsVEVWY2JpQWdZWEp5TG5keWFYUmxSRzkxWW14bFFrVWdQU0JDVUM1M2NtbDBaVVJ2ZFdKc1pVSkZYRzRnSUdGeWNpNW1hV3hzSUQwZ1FsQXVabWxzYkZ4dUlDQmhjbkl1YVc1emNHVmpkQ0E5SUVKUUxtbHVjM0JsWTNSY2JpQWdZWEp5TG5SdlFYSnlZWGxDZFdabVpYSWdQU0JDVUM1MGIwRnljbUY1UW5WbVptVnlYRzVjYmlBZ2NtVjBkWEp1SUdGeWNseHVmVnh1WEc1MllYSWdTVTVXUVV4SlJGOUNRVk5GTmpSZlVrVWdQU0F2VzE0clhGd3ZNQzA1UVMxNlhGd3RYUzluWEc1Y2JtWjFibU4wYVc5dUlHSmhjMlUyTkdOc1pXRnVJQ2h6ZEhJcElIdGNiaUFnTHk4Z1RtOWtaU0J6ZEhKcGNITWdiM1YwSUdsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5Y3lCc2FXdGxJRnhjYmlCaGJtUWdYRngwSUdaeWIyMGdkR2hsSUhOMGNtbHVaeXdnWW1GelpUWTBMV3B6SUdSdlpYTWdibTkwWEc0Z0lITjBjaUE5SUhOMGNtbHVaM1J5YVcwb2MzUnlLUzV5WlhCc1lXTmxLRWxPVmtGTVNVUmZRa0ZUUlRZMFgxSkZMQ0FuSnlsY2JpQWdMeThnVG05a1pTQmpiMjUyWlhKMGN5QnpkSEpwYm1keklIZHBkR2dnYkdWdVozUm9JRHdnTWlCMGJ5QW5KMXh1SUNCcFppQW9jM1J5TG14bGJtZDBhQ0E4SURJcElISmxkSFZ5YmlBbkoxeHVJQ0F2THlCT2IyUmxJR0ZzYkc5M2N5Qm1iM0lnYm05dUxYQmhaR1JsWkNCaVlYTmxOalFnYzNSeWFXNW5jeUFvYldsemMybHVaeUIwY21GcGJHbHVaeUE5UFQwcExDQmlZWE5sTmpRdGFuTWdaRzlsY3lCdWIzUmNiaUFnZDJocGJHVWdLSE4wY2k1c1pXNW5kR2dnSlNBMElDRTlQU0F3S1NCN1hHNGdJQ0FnYzNSeUlEMGdjM1J5SUNzZ0p6MG5YRzRnSUgxY2JpQWdjbVYwZFhKdUlITjBjbHh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnpkSEpwYm1kMGNtbHRJQ2h6ZEhJcElIdGNiaUFnYVdZZ0tITjBjaTUwY21sdEtTQnlaWFIxY200Z2MzUnlMblJ5YVcwb0tWeHVJQ0J5WlhSMWNtNGdjM1J5TG5KbGNHeGhZMlVvTDE1Y1hITXJmRnhjY3lza0wyY3NJQ2NuS1Z4dWZWeHVYRzVtZFc1amRHbHZiaUJwYzBGeWNtRjVhWE5vSUNoemRXSnFaV04wS1NCN1hHNGdJSEpsZEhWeWJpQnBjMEZ5Y21GNUtITjFZbXBsWTNRcElIeDhJRUoxWm1abGNpNXBjMEoxWm1abGNpaHpkV0pxWldOMEtTQjhmRnh1SUNBZ0lDQWdjM1ZpYW1WamRDQW1KaUIwZVhCbGIyWWdjM1ZpYW1WamRDQTlQVDBnSjI5aWFtVmpkQ2NnSmlaY2JpQWdJQ0FnSUhSNWNHVnZaaUJ6ZFdKcVpXTjBMbXhsYm1kMGFDQTlQVDBnSjI1MWJXSmxjaWRjYm4xY2JseHVablZ1WTNScGIyNGdkRzlJWlhnZ0tHNHBJSHRjYmlBZ2FXWWdLRzRnUENBeE5pa2djbVYwZFhKdUlDY3dKeUFySUc0dWRHOVRkSEpwYm1jb01UWXBYRzRnSUhKbGRIVnliaUJ1TG5SdlUzUnlhVzVuS0RFMktWeHVmVnh1WEc1bWRXNWpkR2x2YmlCMWRHWTRWRzlDZVhSbGN5QW9jM1J5YVc1bkxDQjFibWwwY3lrZ2UxeHVJQ0IxYm1sMGN5QTlJSFZ1YVhSeklIeDhJRWx1Wm1sdWFYUjVYRzRnSUhaaGNpQmpiMlJsVUc5cGJuUmNiaUFnZG1GeUlHeGxibWQwYUNBOUlITjBjbWx1Wnk1c1pXNW5kR2hjYmlBZ2RtRnlJR3hsWVdSVGRYSnliMmRoZEdVZ1BTQnVkV3hzWEc0Z0lIWmhjaUJpZVhSbGN5QTlJRnRkWEc0Z0lIWmhjaUJwSUQwZ01GeHVYRzRnSUdadmNpQW9PeUJwSUR3Z2JHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQmpiMlJsVUc5cGJuUWdQU0J6ZEhKcGJtY3VZMmhoY2tOdlpHVkJkQ2hwS1Z4dVhHNGdJQ0FnTHk4Z2FYTWdjM1Z5Y205bllYUmxJR052YlhCdmJtVnVkRnh1SUNBZ0lHbG1JQ2hqYjJSbFVHOXBiblFnUGlBd2VFUTNSa1lnSmlZZ1kyOWtaVkJ2YVc1MElEd2dNSGhGTURBd0tTQjdYRzRnSUNBZ0lDQXZMeUJzWVhOMElHTm9ZWElnZDJGeklHRWdiR1ZoWkZ4dUlDQWdJQ0FnYVdZZ0tHeGxZV1JUZFhKeWIyZGhkR1VwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdNaUJzWldGa2N5QnBiaUJoSUhKdmQxeHVJQ0FnSUNBZ0lDQnBaaUFvWTI5a1pWQnZhVzUwSUR3Z01IaEVRekF3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NoMWJtbDBjeUF0UFNBektTQStJQzB4S1NCaWVYUmxjeTV3ZFhOb0tEQjRSVVlzSURCNFFrWXNJREI0UWtRcFhHNGdJQ0FnSUNBZ0lDQWdiR1ZoWkZOMWNuSnZaMkYwWlNBOUlHTnZaR1ZRYjJsdWRGeHVJQ0FnSUNBZ0lDQWdJR052Ym5ScGJuVmxYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z2RtRnNhV1FnYzNWeWNtOW5ZWFJsSUhCaGFYSmNiaUFnSUNBZ0lDQWdJQ0JqYjJSbFVHOXBiblFnUFNCc1pXRmtVM1Z5Y205bllYUmxJQzBnTUhoRU9EQXdJRHc4SURFd0lId2dZMjlrWlZCdmFXNTBJQzBnTUhoRVF6QXdJSHdnTUhneE1EQXdNRnh1SUNBZ0lDQWdJQ0FnSUd4bFlXUlRkWEp5YjJkaGRHVWdQU0J1ZFd4c1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDOHZJRzV2SUd4bFlXUWdlV1YwWEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLR052WkdWUWIybHVkQ0ErSURCNFJFSkdSaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJSFZ1Wlhod1pXTjBaV1FnZEhKaGFXeGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb0tIVnVhWFJ6SUMwOUlETXBJRDRnTFRFcElHSjVkR1Z6TG5CMWMyZ29NSGhGUml3Z01IaENSaXdnTUhoQ1JDbGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVnh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0drZ0t5QXhJRDA5UFNCc1pXNW5kR2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUIxYm5CaGFYSmxaQ0JzWldGa1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NoMWJtbDBjeUF0UFNBektTQStJQzB4S1NCaWVYUmxjeTV3ZFhOb0tEQjRSVVlzSURCNFFrWXNJREI0UWtRcFhHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdsdWRXVmNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0F2THlCMllXeHBaQ0JzWldGa1hHNGdJQ0FnSUNBZ0lDQWdiR1ZoWkZOMWNuSnZaMkYwWlNBOUlHTnZaR1ZRYjJsdWRGeHVJQ0FnSUNBZ0lDQWdJR052Ym5ScGJuVmxYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLR3hsWVdSVGRYSnliMmRoZEdVcElIdGNiaUFnSUNBZ0lDOHZJSFpoYkdsa0lHSnRjQ0JqYUdGeUxDQmlkWFFnYkdGemRDQmphR0Z5SUhkaGN5QmhJR3hsWVdSY2JpQWdJQ0FnSUdsbUlDZ29kVzVwZEhNZ0xUMGdNeWtnUGlBdE1Ta2dZbmwwWlhNdWNIVnphQ2d3ZUVWR0xDQXdlRUpHTENBd2VFSkVLVnh1SUNBZ0lDQWdiR1ZoWkZOMWNuSnZaMkYwWlNBOUlHNTFiR3hjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUJsYm1OdlpHVWdkWFJtT0Z4dUlDQWdJR2xtSUNoamIyUmxVRzlwYm5RZ1BDQXdlRGd3S1NCN1hHNGdJQ0FnSUNCcFppQW9LSFZ1YVhSeklDMDlJREVwSUR3Z01Da2dZbkpsWVd0Y2JpQWdJQ0FnSUdKNWRHVnpMbkIxYzJnb1kyOWtaVkJ2YVc1MEtWeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyOWtaVkJ2YVc1MElEd2dNSGc0TURBcElIdGNiaUFnSUNBZ0lHbG1JQ2dvZFc1cGRITWdMVDBnTWlrZ1BDQXdLU0JpY21WaGExeHVJQ0FnSUNBZ1lubDBaWE11Y0hWemFDaGNiaUFnSUNBZ0lDQWdZMjlrWlZCdmFXNTBJRDQrSURCNE5pQjhJREI0UXpBc1hHNGdJQ0FnSUNBZ0lHTnZaR1ZRYjJsdWRDQW1JREI0TTBZZ2ZDQXdlRGd3WEc0Z0lDQWdJQ0FwWEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hqYjJSbFVHOXBiblFnUENBd2VERXdNREF3S1NCN1hHNGdJQ0FnSUNCcFppQW9LSFZ1YVhSeklDMDlJRE1wSUR3Z01Da2dZbkpsWVd0Y2JpQWdJQ0FnSUdKNWRHVnpMbkIxYzJnb1hHNGdJQ0FnSUNBZ0lHTnZaR1ZRYjJsdWRDQStQaUF3ZUVNZ2ZDQXdlRVV3TEZ4dUlDQWdJQ0FnSUNCamIyUmxVRzlwYm5RZ1BqNGdNSGcySUNZZ01IZ3pSaUI4SURCNE9EQXNYRzRnSUNBZ0lDQWdJR052WkdWUWIybHVkQ0FtSURCNE0wWWdmQ0F3ZURnd1hHNGdJQ0FnSUNBcFhHNGdJQ0FnZlNCbGJITmxJR2xtSUNoamIyUmxVRzlwYm5RZ1BDQXdlREl3TURBd01Da2dlMXh1SUNBZ0lDQWdhV1lnS0NoMWJtbDBjeUF0UFNBMEtTQThJREFwSUdKeVpXRnJYRzRnSUNBZ0lDQmllWFJsY3k1d2RYTm9LRnh1SUNBZ0lDQWdJQ0JqYjJSbFVHOXBiblFnUGo0Z01IZ3hNaUI4SURCNFJqQXNYRzRnSUNBZ0lDQWdJR052WkdWUWIybHVkQ0ErUGlBd2VFTWdKaUF3ZUROR0lId2dNSGc0TUN4Y2JpQWdJQ0FnSUNBZ1kyOWtaVkJ2YVc1MElENCtJREI0TmlBbUlEQjRNMFlnZkNBd2VEZ3dMRnh1SUNBZ0lDQWdJQ0JqYjJSbFVHOXBiblFnSmlBd2VETkdJSHdnTUhnNE1GeHVJQ0FnSUNBZ0tWeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMGx1ZG1Gc2FXUWdZMjlrWlNCd2IybHVkQ2NwWEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJR0o1ZEdWelhHNTlYRzVjYm1aMWJtTjBhVzl1SUdGelkybHBWRzlDZVhSbGN5QW9jM1J5S1NCN1hHNGdJSFpoY2lCaWVYUmxRWEp5WVhrZ1BTQmJYVnh1SUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElITjBjaTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUM4dklFNXZaR1VuY3lCamIyUmxJSE5sWlcxeklIUnZJR0psSUdSdmFXNW5JSFJvYVhNZ1lXNWtJRzV2ZENBbUlEQjROMFl1TGx4dUlDQWdJR0o1ZEdWQmNuSmhlUzV3ZFhOb0tITjBjaTVqYUdGeVEyOWtaVUYwS0drcElDWWdNSGhHUmlsY2JpQWdmVnh1SUNCeVpYUjFjbTRnWW5sMFpVRnljbUY1WEc1OVhHNWNibVoxYm1OMGFXOXVJSFYwWmpFMmJHVlViMEo1ZEdWeklDaHpkSElzSUhWdWFYUnpLU0I3WEc0Z0lIWmhjaUJqTENCb2FTd2diRzljYmlBZ2RtRnlJR0o1ZEdWQmNuSmhlU0E5SUZ0ZFhHNGdJR1p2Y2lBb2RtRnlJR2tnUFNBd095QnBJRHdnYzNSeUxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdhV1lnS0NoMWJtbDBjeUF0UFNBeUtTQThJREFwSUdKeVpXRnJYRzVjYmlBZ0lDQmpJRDBnYzNSeUxtTm9ZWEpEYjJSbFFYUW9hU2xjYmlBZ0lDQm9hU0E5SUdNZ1BqNGdPRnh1SUNBZ0lHeHZJRDBnWXlBbElESTFObHh1SUNBZ0lHSjVkR1ZCY25KaGVTNXdkWE5vS0d4dktWeHVJQ0FnSUdKNWRHVkJjbkpoZVM1d2RYTm9LR2hwS1Z4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUdKNWRHVkJjbkpoZVZ4dWZWeHVYRzVtZFc1amRHbHZiaUJpWVhObE5qUlViMEo1ZEdWeklDaHpkSElwSUh0Y2JpQWdjbVYwZFhKdUlHSmhjMlUyTkM1MGIwSjVkR1ZCY25KaGVTaGlZWE5sTmpSamJHVmhiaWh6ZEhJcEtWeHVmVnh1WEc1bWRXNWpkR2x2YmlCaWJHbDBRblZtWm1WeUlDaHpjbU1zSUdSemRDd2diMlptYzJWMExDQnNaVzVuZEdncElIdGNiaUFnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCc1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lHbG1JQ2dvYVNBcklHOW1abk5sZENBK1BTQmtjM1F1YkdWdVozUm9LU0I4ZkNBb2FTQStQU0J6Y21NdWJHVnVaM1JvS1NrZ1luSmxZV3RjYmlBZ0lDQmtjM1JiYVNBcklHOW1abk5sZEYwZ1BTQnpjbU5iYVYxY2JpQWdmVnh1SUNCeVpYUjFjbTRnYVZ4dWZWeHVYRzVtZFc1amRHbHZiaUJrWldOdlpHVlZkR1k0UTJoaGNpQW9jM1J5S1NCN1hHNGdJSFJ5ZVNCN1hHNGdJQ0FnY21WMGRYSnVJR1JsWTI5a1pWVlNTVU52YlhCdmJtVnVkQ2h6ZEhJcFhHNGdJSDBnWTJGMFkyZ2dLR1Z5Y2lrZ2UxeHVJQ0FnSUhKbGRIVnliaUJUZEhKcGJtY3Vabkp2YlVOb1lYSkRiMlJsS0RCNFJrWkdSQ2tnTHk4Z1ZWUkdJRGdnYVc1MllXeHBaQ0JqYUdGeVhHNGdJSDFjYm4xY2JpSXNJblpoY2lCc2IyOXJkWEFnUFNBblFVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UxUlZWbGRZV1ZwaFltTmtaV1puYUdscWEyeHRibTl3Y1hKemRIVjJkM2g1ZWpBeE1qTTBOVFkzT0Rrckx5YzdYRzVjYmpzb1puVnVZM1JwYjI0Z0tHVjRjRzl5ZEhNcElIdGNibHgwSjNWelpTQnpkSEpwWTNRbk8xeHVYRzRnSUhaaGNpQkJjbklnUFNBb2RIbHdaVzltSUZWcGJuUTRRWEp5WVhrZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1Z4dUlDQWdJRDhnVldsdWREaEJjbkpoZVZ4dUlDQWdJRG9nUVhKeVlYbGNibHh1WEhSMllYSWdVRXhWVXlBZ0lEMGdKeXNuTG1Ob1lYSkRiMlJsUVhRb01DbGNibHgwZG1GeUlGTk1RVk5JSUNBOUlDY3ZKeTVqYUdGeVEyOWtaVUYwS0RBcFhHNWNkSFpoY2lCT1ZVMUNSVklnUFNBbk1DY3VZMmhoY2tOdlpHVkJkQ2d3S1Z4dVhIUjJZWElnVEU5WFJWSWdJRDBnSjJFbkxtTm9ZWEpEYjJSbFFYUW9NQ2xjYmx4MGRtRnlJRlZRVUVWU0lDQTlJQ2RCSnk1amFHRnlRMjlrWlVGMEtEQXBYRzVjZEhaaGNpQlFURlZUWDFWU1RGOVRRVVpGSUQwZ0p5MG5MbU5vWVhKRGIyUmxRWFFvTUNsY2JseDBkbUZ5SUZOTVFWTklYMVZTVEY5VFFVWkZJRDBnSjE4bkxtTm9ZWEpEYjJSbFFYUW9NQ2xjYmx4dVhIUm1kVzVqZEdsdmJpQmtaV052WkdVZ0tHVnNkQ2tnZTF4dVhIUmNkSFpoY2lCamIyUmxJRDBnWld4MExtTm9ZWEpEYjJSbFFYUW9NQ2xjYmx4MFhIUnBaaUFvWTI5a1pTQTlQVDBnVUV4VlV5QjhmRnh1WEhSY2RDQWdJQ0JqYjJSbElEMDlQU0JRVEZWVFgxVlNURjlUUVVaRktWeHVYSFJjZEZ4MGNtVjBkWEp1SURZeUlDOHZJQ2NySjF4dVhIUmNkR2xtSUNoamIyUmxJRDA5UFNCVFRFRlRTQ0I4ZkZ4dVhIUmNkQ0FnSUNCamIyUmxJRDA5UFNCVFRFRlRTRjlWVWt4ZlUwRkdSU2xjYmx4MFhIUmNkSEpsZEhWeWJpQTJNeUF2THlBbkx5ZGNibHgwWEhScFppQW9ZMjlrWlNBOElFNVZUVUpGVWlsY2JseDBYSFJjZEhKbGRIVnliaUF0TVNBdkwyNXZJRzFoZEdOb1hHNWNkRngwYVdZZ0tHTnZaR1VnUENCT1ZVMUNSVklnS3lBeE1DbGNibHgwWEhSY2RISmxkSFZ5YmlCamIyUmxJQzBnVGxWTlFrVlNJQ3NnTWpZZ0t5QXlObHh1WEhSY2RHbG1JQ2hqYjJSbElEd2dWVkJRUlZJZ0t5QXlOaWxjYmx4MFhIUmNkSEpsZEhWeWJpQmpiMlJsSUMwZ1ZWQlFSVkpjYmx4MFhIUnBaaUFvWTI5a1pTQThJRXhQVjBWU0lDc2dNallwWEc1Y2RGeDBYSFJ5WlhSMWNtNGdZMjlrWlNBdElFeFBWMFZTSUNzZ01qWmNibHgwZlZ4dVhHNWNkR1oxYm1OMGFXOXVJR0kyTkZSdlFubDBaVUZ5Y21GNUlDaGlOalFwSUh0Y2JseDBYSFIyWVhJZ2FTd2dhaXdnYkN3Z2RHMXdMQ0J3YkdGalpVaHZiR1JsY25Nc0lHRnljbHh1WEc1Y2RGeDBhV1lnS0dJMk5DNXNaVzVuZEdnZ0pTQTBJRDRnTUNrZ2UxeHVYSFJjZEZ4MGRHaHliM2NnYm1WM0lFVnljbTl5S0NkSmJuWmhiR2xrSUhOMGNtbHVaeTRnVEdWdVozUm9JRzExYzNRZ1ltVWdZU0J0ZFd4MGFYQnNaU0J2WmlBMEp5bGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QjBhR1VnYm5WdFltVnlJRzltSUdWeGRXRnNJSE5wWjI1eklDaHdiR0ZqWlNCb2IyeGtaWEp6S1Z4dVhIUmNkQzh2SUdsbUlIUm9aWEpsSUdGeVpTQjBkMjhnY0d4aFkyVm9iMnhrWlhKekxDQjBhR0Z1SUhSb1pTQjBkMjhnWTJoaGNtRmpkR1Z5Y3lCaVpXWnZjbVVnYVhSY2JseDBYSFF2THlCeVpYQnlaWE5sYm5RZ2IyNWxJR0o1ZEdWY2JseDBYSFF2THlCcFppQjBhR1Z5WlNCcGN5QnZibXg1SUc5dVpTd2dkR2hsYmlCMGFHVWdkR2h5WldVZ1kyaGhjbUZqZEdWeWN5QmlaV1p2Y21VZ2FYUWdjbVZ3Y21WelpXNTBJRElnWW5sMFpYTmNibHgwWEhRdkx5QjBhR2x6SUdseklHcDFjM1FnWVNCamFHVmhjQ0JvWVdOcklIUnZJRzV2ZENCa2J5QnBibVJsZUU5bUlIUjNhV05sWEc1Y2RGeDBkbUZ5SUd4bGJpQTlJR0kyTkM1c1pXNW5kR2hjYmx4MFhIUndiR0ZqWlVodmJHUmxjbk1nUFNBblBTY2dQVDA5SUdJMk5DNWphR0Z5UVhRb2JHVnVJQzBnTWlrZ1B5QXlJRG9nSnowbklEMDlQU0JpTmpRdVkyaGhja0YwS0d4bGJpQXRJREVwSUQ4Z01TQTZJREJjYmx4dVhIUmNkQzh2SUdKaGMyVTJOQ0JwY3lBMEx6TWdLeUIxY0NCMGJ5QjBkMjhnWTJoaGNtRmpkR1Z5Y3lCdlppQjBhR1VnYjNKcFoybHVZV3dnWkdGMFlWeHVYSFJjZEdGeWNpQTlJRzVsZHlCQmNuSW9ZalkwTG14bGJtZDBhQ0FxSURNZ0x5QTBJQzBnY0d4aFkyVkliMnhrWlhKektWeHVYRzVjZEZ4MEx5OGdhV1lnZEdobGNtVWdZWEpsSUhCc1lXTmxhRzlzWkdWeWN5d2diMjVzZVNCblpYUWdkWEFnZEc4Z2RHaGxJR3hoYzNRZ1kyOXRjR3hsZEdVZ05DQmphR0Z5YzF4dVhIUmNkR3dnUFNCd2JHRmpaVWh2YkdSbGNuTWdQaUF3SUQ4Z1lqWTBMbXhsYm1kMGFDQXRJRFFnT2lCaU5qUXViR1Z1WjNSb1hHNWNibHgwWEhSMllYSWdUQ0E5SURCY2JseHVYSFJjZEdaMWJtTjBhVzl1SUhCMWMyZ2dLSFlwSUh0Y2JseDBYSFJjZEdGeWNsdE1LeXRkSUQwZ2RseHVYSFJjZEgxY2JseHVYSFJjZEdadmNpQW9hU0E5SURBc0lHb2dQU0F3T3lCcElEd2diRHNnYVNBclBTQTBMQ0JxSUNzOUlETXBJSHRjYmx4MFhIUmNkSFJ0Y0NBOUlDaGtaV052WkdVb1lqWTBMbU5vWVhKQmRDaHBLU2tnUER3Z01UZ3BJSHdnS0dSbFkyOWtaU2hpTmpRdVkyaGhja0YwS0drZ0t5QXhLU2tnUER3Z01USXBJSHdnS0dSbFkyOWtaU2hpTmpRdVkyaGhja0YwS0drZ0t5QXlLU2tnUER3Z05pa2dmQ0JrWldOdlpHVW9ZalkwTG1Ob1lYSkJkQ2hwSUNzZ015a3BYRzVjZEZ4MFhIUndkWE5vS0NoMGJYQWdKaUF3ZUVaR01EQXdNQ2tnUGo0Z01UWXBYRzVjZEZ4MFhIUndkWE5vS0NoMGJYQWdKaUF3ZUVaR01EQXBJRDQrSURncFhHNWNkRngwWEhSd2RYTm9LSFJ0Y0NBbUlEQjRSa1lwWEc1Y2RGeDBmVnh1WEc1Y2RGeDBhV1lnS0hCc1lXTmxTRzlzWkdWeWN5QTlQVDBnTWlrZ2UxeHVYSFJjZEZ4MGRHMXdJRDBnS0dSbFkyOWtaU2hpTmpRdVkyaGhja0YwS0drcEtTQThQQ0F5S1NCOElDaGtaV052WkdVb1lqWTBMbU5vWVhKQmRDaHBJQ3NnTVNrcElENCtJRFFwWEc1Y2RGeDBYSFJ3ZFhOb0tIUnRjQ0FtSURCNFJrWXBYRzVjZEZ4MGZTQmxiSE5sSUdsbUlDaHdiR0ZqWlVodmJHUmxjbk1nUFQwOUlERXBJSHRjYmx4MFhIUmNkSFJ0Y0NBOUlDaGtaV052WkdVb1lqWTBMbU5vWVhKQmRDaHBLU2tnUER3Z01UQXBJSHdnS0dSbFkyOWtaU2hpTmpRdVkyaGhja0YwS0drZ0t5QXhLU2tnUER3Z05Da2dmQ0FvWkdWamIyUmxLR0kyTkM1amFHRnlRWFFvYVNBcklESXBLU0ErUGlBeUtWeHVYSFJjZEZ4MGNIVnphQ2dvZEcxd0lENCtJRGdwSUNZZ01IaEdSaWxjYmx4MFhIUmNkSEIxYzJnb2RHMXdJQ1lnTUhoR1JpbGNibHgwWEhSOVhHNWNibHgwWEhSeVpYUjFjbTRnWVhKeVhHNWNkSDFjYmx4dVhIUm1kVzVqZEdsdmJpQjFhVzUwT0ZSdlFtRnpaVFkwSUNoMWFXNTBPQ2tnZTF4dVhIUmNkSFpoY2lCcExGeHVYSFJjZEZ4MFpYaDBjbUZDZVhSbGN5QTlJSFZwYm5RNExteGxibWQwYUNBbElETXNJQzh2SUdsbUlIZGxJR2hoZG1VZ01TQmllWFJsSUd4bFpuUXNJSEJoWkNBeUlHSjVkR1Z6WEc1Y2RGeDBYSFJ2ZFhSd2RYUWdQU0JjSWx3aUxGeHVYSFJjZEZ4MGRHVnRjQ3dnYkdWdVozUm9YRzVjYmx4MFhIUm1kVzVqZEdsdmJpQmxibU52WkdVZ0tHNTFiU2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR3h2YjJ0MWNDNWphR0Z5UVhRb2JuVnRLVnh1WEhSY2RIMWNibHh1WEhSY2RHWjFibU4wYVc5dUlIUnlhWEJzWlhSVWIwSmhjMlUyTkNBb2JuVnRLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdaVzVqYjJSbEtHNTFiU0ErUGlBeE9DQW1JREI0TTBZcElDc2daVzVqYjJSbEtHNTFiU0ErUGlBeE1pQW1JREI0TTBZcElDc2daVzVqYjJSbEtHNTFiU0ErUGlBMklDWWdNSGd6UmlrZ0t5QmxibU52WkdVb2JuVnRJQ1lnTUhnelJpbGNibHgwWEhSOVhHNWNibHgwWEhRdkx5Qm5ieUIwYUhKdmRXZG9JSFJvWlNCaGNuSmhlU0JsZG1WeWVTQjBhSEpsWlNCaWVYUmxjeXdnZDJVbmJHd2daR1ZoYkNCM2FYUm9JSFJ5WVdsc2FXNW5JSE4wZFdabUlHeGhkR1Z5WEc1Y2RGeDBabTl5SUNocElEMGdNQ3dnYkdWdVozUm9JRDBnZFdsdWREZ3ViR1Z1WjNSb0lDMGdaWGgwY21GQ2VYUmxjenNnYVNBOElHeGxibWQwYURzZ2FTQXJQU0F6S1NCN1hHNWNkRngwWEhSMFpXMXdJRDBnS0hWcGJuUTRXMmxkSUR3OElERTJLU0FySUNoMWFXNTBPRnRwSUNzZ01WMGdQRHdnT0NrZ0t5QW9kV2x1ZERoYmFTQXJJREpkS1Z4dVhIUmNkRngwYjNWMGNIVjBJQ3M5SUhSeWFYQnNaWFJVYjBKaGMyVTJOQ2gwWlcxd0tWeHVYSFJjZEgxY2JseHVYSFJjZEM4dklIQmhaQ0IwYUdVZ1pXNWtJSGRwZEdnZ2VtVnliM01zSUdKMWRDQnRZV3RsSUhOMWNtVWdkRzhnYm05MElHWnZjbWRsZENCMGFHVWdaWGgwY21FZ1lubDBaWE5jYmx4MFhIUnpkMmwwWTJnZ0tHVjRkSEpoUW5sMFpYTXBJSHRjYmx4MFhIUmNkR05oYzJVZ01UcGNibHgwWEhSY2RGeDBkR1Z0Y0NBOUlIVnBiblE0VzNWcGJuUTRMbXhsYm1kMGFDQXRJREZkWEc1Y2RGeDBYSFJjZEc5MWRIQjFkQ0FyUFNCbGJtTnZaR1VvZEdWdGNDQStQaUF5S1Z4dVhIUmNkRngwWEhSdmRYUndkWFFnS3owZ1pXNWpiMlJsS0NoMFpXMXdJRHc4SURRcElDWWdNSGd6UmlsY2JseDBYSFJjZEZ4MGIzVjBjSFYwSUNzOUlDYzlQU2RjYmx4MFhIUmNkRngwWW5KbFlXdGNibHgwWEhSY2RHTmhjMlVnTWpwY2JseDBYSFJjZEZ4MGRHVnRjQ0E5SUNoMWFXNTBPRnQxYVc1ME9DNXNaVzVuZEdnZ0xTQXlYU0E4UENBNEtTQXJJQ2gxYVc1ME9GdDFhVzUwT0M1c1pXNW5kR2dnTFNBeFhTbGNibHgwWEhSY2RGeDBiM1YwY0hWMElDczlJR1Z1WTI5a1pTaDBaVzF3SUQ0K0lERXdLVnh1WEhSY2RGeDBYSFJ2ZFhSd2RYUWdLejBnWlc1amIyUmxLQ2gwWlcxd0lENCtJRFFwSUNZZ01IZ3pSaWxjYmx4MFhIUmNkRngwYjNWMGNIVjBJQ3M5SUdWdVkyOWtaU2dvZEdWdGNDQThQQ0F5S1NBbUlEQjRNMFlwWEc1Y2RGeDBYSFJjZEc5MWRIQjFkQ0FyUFNBblBTZGNibHgwWEhSY2RGeDBZbkpsWVd0Y2JseDBYSFI5WEc1Y2JseDBYSFJ5WlhSMWNtNGdiM1YwY0hWMFhHNWNkSDFjYmx4dVhIUmxlSEJ2Y25SekxuUnZRbmwwWlVGeWNtRjVJRDBnWWpZMFZHOUNlWFJsUVhKeVlYbGNibHgwWlhod2IzSjBjeTVtY205dFFubDBaVUZ5Y21GNUlEMGdkV2x1ZERoVWIwSmhjMlUyTkZ4dWZTaDBlWEJsYjJZZ1pYaHdiM0owY3lBOVBUMGdKM1Z1WkdWbWFXNWxaQ2NnUHlBb2RHaHBjeTVpWVhObE5qUnFjeUE5SUh0OUtTQTZJR1Y0Y0c5eWRITXBLVnh1SWl3aVpYaHdiM0owY3k1eVpXRmtJRDBnWm5WdVkzUnBiMjRvWW5WbVptVnlMQ0J2Wm1aelpYUXNJR2x6VEVVc0lHMU1aVzRzSUc1Q2VYUmxjeWtnZTF4dUlDQjJZWElnWlN3Z2JTeGNiaUFnSUNBZ0lHVk1aVzRnUFNCdVFubDBaWE1nS2lBNElDMGdiVXhsYmlBdElERXNYRzRnSUNBZ0lDQmxUV0Y0SUQwZ0tERWdQRHdnWlV4bGJpa2dMU0F4TEZ4dUlDQWdJQ0FnWlVKcFlYTWdQU0JsVFdGNElENCtJREVzWEc0Z0lDQWdJQ0J1UW1sMGN5QTlJQzAzTEZ4dUlDQWdJQ0FnYVNBOUlHbHpURVVnUHlBb2JrSjVkR1Z6SUMwZ01Ta2dPaUF3TEZ4dUlDQWdJQ0FnWkNBOUlHbHpURVVnUHlBdE1TQTZJREVzWEc0Z0lDQWdJQ0J6SUQwZ1luVm1abVZ5VzI5bVpuTmxkQ0FySUdsZE8xeHVYRzRnSUdrZ0t6MGdaRHRjYmx4dUlDQmxJRDBnY3lBbUlDZ29NU0E4UENBb0xXNUNhWFJ6S1NrZ0xTQXhLVHRjYmlBZ2N5QStQajBnS0MxdVFtbDBjeWs3WEc0Z0lHNUNhWFJ6SUNzOUlHVk1aVzQ3WEc0Z0lHWnZjaUFvT3lCdVFtbDBjeUErSURBN0lHVWdQU0JsSUNvZ01qVTJJQ3NnWW5WbVptVnlXMjltWm5ObGRDQXJJR2xkTENCcElDczlJR1FzSUc1Q2FYUnpJQzA5SURncE8xeHVYRzRnSUcwZ1BTQmxJQ1lnS0NneElEdzhJQ2d0YmtKcGRITXBLU0F0SURFcE8xeHVJQ0JsSUQ0K1BTQW9MVzVDYVhSektUdGNiaUFnYmtKcGRITWdLejBnYlV4bGJqdGNiaUFnWm05eUlDZzdJRzVDYVhSeklENGdNRHNnYlNBOUlHMGdLaUF5TlRZZ0t5QmlkV1ptWlhKYmIyWm1jMlYwSUNzZ2FWMHNJR2tnS3owZ1pDd2dia0pwZEhNZ0xUMGdPQ2s3WEc1Y2JpQWdhV1lnS0dVZ1BUMDlJREFwSUh0Y2JpQWdJQ0JsSUQwZ01TQXRJR1ZDYVdGek8xeHVJQ0I5SUdWc2MyVWdhV1lnS0dVZ1BUMDlJR1ZOWVhncElIdGNiaUFnSUNCeVpYUjFjbTRnYlNBL0lFNWhUaUE2SUNnb2N5QS9JQzB4SURvZ01Ta2dLaUJKYm1acGJtbDBlU2s3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnYlNBOUlHMGdLeUJOWVhSb0xuQnZkeWd5TENCdFRHVnVLVHRjYmlBZ0lDQmxJRDBnWlNBdElHVkNhV0Z6TzF4dUlDQjlYRzRnSUhKbGRIVnliaUFvY3lBL0lDMHhJRG9nTVNrZ0tpQnRJQ29nVFdGMGFDNXdiM2NvTWl3Z1pTQXRJRzFNWlc0cE8xeHVmVHRjYmx4dVpYaHdiM0owY3k1M2NtbDBaU0E5SUdaMWJtTjBhVzl1S0dKMVptWmxjaXdnZG1Gc2RXVXNJRzltWm5ObGRDd2dhWE5NUlN3Z2JVeGxiaXdnYmtKNWRHVnpLU0I3WEc0Z0lIWmhjaUJsTENCdExDQmpMRnh1SUNBZ0lDQWdaVXhsYmlBOUlHNUNlWFJsY3lBcUlEZ2dMU0J0VEdWdUlDMGdNU3hjYmlBZ0lDQWdJR1ZOWVhnZ1BTQW9NU0E4UENCbFRHVnVLU0F0SURFc1hHNGdJQ0FnSUNCbFFtbGhjeUE5SUdWTllYZ2dQajRnTVN4Y2JpQWdJQ0FnSUhKMElEMGdLRzFNWlc0Z1BUMDlJREl6SUQ4Z1RXRjBhQzV3YjNjb01pd2dMVEkwS1NBdElFMWhkR2d1Y0c5M0tESXNJQzAzTnlrZ09pQXdLU3hjYmlBZ0lDQWdJR2tnUFNCcGMweEZJRDhnTUNBNklDaHVRbmwwWlhNZ0xTQXhLU3hjYmlBZ0lDQWdJR1FnUFNCcGMweEZJRDhnTVNBNklDMHhMRnh1SUNBZ0lDQWdjeUE5SUhaaGJIVmxJRHdnTUNCOGZDQW9kbUZzZFdVZ1BUMDlJREFnSmlZZ01TQXZJSFpoYkhWbElEd2dNQ2tnUHlBeElEb2dNRHRjYmx4dUlDQjJZV3gxWlNBOUlFMWhkR2d1WVdKektIWmhiSFZsS1R0Y2JseHVJQ0JwWmlBb2FYTk9ZVTRvZG1Gc2RXVXBJSHg4SUhaaGJIVmxJRDA5UFNCSmJtWnBibWwwZVNrZ2UxeHVJQ0FnSUcwZ1BTQnBjMDVoVGloMllXeDFaU2tnUHlBeElEb2dNRHRjYmlBZ0lDQmxJRDBnWlUxaGVEdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQmxJRDBnVFdGMGFDNW1iRzl2Y2loTllYUm9MbXh2WnloMllXeDFaU2tnTHlCTllYUm9Ma3hPTWlrN1hHNGdJQ0FnYVdZZ0tIWmhiSFZsSUNvZ0tHTWdQU0JOWVhSb0xuQnZkeWd5TENBdFpTa3BJRHdnTVNrZ2UxeHVJQ0FnSUNBZ1pTMHRPMXh1SUNBZ0lDQWdZeUFxUFNBeU8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb1pTQXJJR1ZDYVdGeklENDlJREVwSUh0Y2JpQWdJQ0FnSUhaaGJIVmxJQ3M5SUhKMElDOGdZenRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RtRnNkV1VnS3owZ2NuUWdLaUJOWVhSb0xuQnZkeWd5TENBeElDMGdaVUpwWVhNcE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2RtRnNkV1VnS2lCaklENDlJRElwSUh0Y2JpQWdJQ0FnSUdVckt6dGNiaUFnSUNBZ0lHTWdMejBnTWp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb1pTQXJJR1ZDYVdGeklENDlJR1ZOWVhncElIdGNiaUFnSUNBZ0lHMGdQU0F3TzF4dUlDQWdJQ0FnWlNBOUlHVk5ZWGc3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hsSUNzZ1pVSnBZWE1nUGowZ01Ta2dlMXh1SUNBZ0lDQWdiU0E5SUNoMllXeDFaU0FxSUdNZ0xTQXhLU0FxSUUxaGRHZ3VjRzkzS0RJc0lHMU1aVzRwTzF4dUlDQWdJQ0FnWlNBOUlHVWdLeUJsUW1saGN6dGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnYlNBOUlIWmhiSFZsSUNvZ1RXRjBhQzV3YjNjb01pd2daVUpwWVhNZ0xTQXhLU0FxSUUxaGRHZ3VjRzkzS0RJc0lHMU1aVzRwTzF4dUlDQWdJQ0FnWlNBOUlEQTdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdabTl5SUNnN0lHMU1aVzRnUGowZ09Ec2dZblZtWm1WeVcyOW1abk5sZENBcklHbGRJRDBnYlNBbUlEQjRabVlzSUdrZ0t6MGdaQ3dnYlNBdlBTQXlOVFlzSUcxTVpXNGdMVDBnT0NrN1hHNWNiaUFnWlNBOUlDaGxJRHc4SUcxTVpXNHBJSHdnYlR0Y2JpQWdaVXhsYmlBclBTQnRUR1Z1TzF4dUlDQm1iM0lnS0RzZ1pVeGxiaUErSURBN0lHSjFabVpsY2x0dlptWnpaWFFnS3lCcFhTQTlJR1VnSmlBd2VHWm1MQ0JwSUNzOUlHUXNJR1VnTHowZ01qVTJMQ0JsVEdWdUlDMDlJRGdwTzF4dVhHNGdJR0oxWm1abGNsdHZabVp6WlhRZ0t5QnBJQzBnWkYwZ2ZEMGdjeUFxSURFeU9EdGNibjA3WEc0aUxDSmNiaThxS2x4dUlDb2dhWE5CY25KaGVWeHVJQ292WEc1Y2JuWmhjaUJwYzBGeWNtRjVJRDBnUVhKeVlYa3VhWE5CY25KaGVUdGNibHh1THlvcVhHNGdLaUIwYjFOMGNtbHVaMXh1SUNvdlhHNWNiblpoY2lCemRISWdQU0JQWW1wbFkzUXVjSEp2ZEc5MGVYQmxMblJ2VTNSeWFXNW5PMXh1WEc0dktpcGNiaUFxSUZkb1pYUm9aWElnYjNJZ2JtOTBJSFJvWlNCbmFYWmxiaUJnZG1Gc1lGeHVJQ29nYVhNZ1lXNGdZWEp5WVhrdVhHNGdLbHh1SUNvZ1pYaGhiWEJzWlRwY2JpQXFYRzRnS2lBZ0lDQWdJQ0FnYVhOQmNuSmhlU2hiWFNrN1hHNGdLaUFnSUNBZ0lDQWdMeThnUGlCMGNuVmxYRzRnS2lBZ0lDQWdJQ0FnYVhOQmNuSmhlU2hoY21kMWJXVnVkSE1wTzF4dUlDb2dJQ0FnSUNBZ0lDOHZJRDRnWm1Gc2MyVmNiaUFxSUNBZ0lDQWdJQ0JwYzBGeWNtRjVLQ2NuS1R0Y2JpQXFJQ0FnSUNBZ0lDQXZMeUErSUdaaGJITmxYRzRnS2x4dUlDb2dRSEJoY21GdElIdHRhWGhsWkgwZ2RtRnNYRzRnS2lCQWNtVjBkWEp1SUh0aWIyOXNmVnh1SUNvdlhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdhWE5CY25KaGVTQjhmQ0JtZFc1amRHbHZiaUFvZG1Gc0tTQjdYRzRnSUhKbGRIVnliaUFoSVNCMllXd2dKaVlnSjF0dlltcGxZM1FnUVhKeVlYbGRKeUE5UFNCemRISXVZMkZzYkNoMllXd3BPMXh1ZlR0Y2JpSXNJaTh2SUhOb2FXMGdabTl5SUhWemFXNW5JSEJ5YjJObGMzTWdhVzRnWW5KdmQzTmxjbHh1WEc1MllYSWdjSEp2WTJWemN5QTlJRzF2WkhWc1pTNWxlSEJ2Y25SeklEMGdlMzA3WEc1MllYSWdjWFZsZFdVZ1BTQmJYVHRjYm5aaGNpQmtjbUZwYm1sdVp5QTlJR1poYkhObE8xeHVYRzVtZFc1amRHbHZiaUJrY21GcGJsRjFaWFZsS0NrZ2UxeHVJQ0FnSUdsbUlDaGtjbUZwYm1sdVp5a2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ2ZWeHVJQ0FnSUdSeVlXbHVhVzVuSUQwZ2RISjFaVHRjYmlBZ0lDQjJZWElnWTNWeWNtVnVkRkYxWlhWbE8xeHVJQ0FnSUhaaGNpQnNaVzRnUFNCeGRXVjFaUzVzWlc1bmRHZzdYRzRnSUNBZ2QyaHBiR1VvYkdWdUtTQjdYRzRnSUNBZ0lDQWdJR04xY25KbGJuUlJkV1YxWlNBOUlIRjFaWFZsTzF4dUlDQWdJQ0FnSUNCeGRXVjFaU0E5SUZ0ZE8xeHVJQ0FnSUNBZ0lDQjJZWElnYVNBOUlDMHhPMXh1SUNBZ0lDQWdJQ0IzYUdsc1pTQW9LeXRwSUR3Z2JHVnVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpkWEp5Wlc1MFVYVmxkV1ZiYVYwb0tUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JzWlc0Z1BTQnhkV1YxWlM1c1pXNW5kR2c3WEc0Z0lDQWdmVnh1SUNBZ0lHUnlZV2x1YVc1bklEMGdabUZzYzJVN1hHNTlYRzV3Y205alpYTnpMbTVsZUhSVWFXTnJJRDBnWm5WdVkzUnBiMjRnS0daMWJpa2dlMXh1SUNBZ0lIRjFaWFZsTG5CMWMyZ29ablZ1S1R0Y2JpQWdJQ0JwWmlBb0lXUnlZV2x1YVc1bktTQjdYRzRnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvWkhKaGFXNVJkV1YxWlN3Z01DazdYRzRnSUNBZ2ZWeHVmVHRjYmx4dWNISnZZMlZ6Y3k1MGFYUnNaU0E5SUNkaWNtOTNjMlZ5Snp0Y2JuQnliMk5sYzNNdVluSnZkM05sY2lBOUlIUnlkV1U3WEc1d2NtOWpaWE56TG1WdWRpQTlJSHQ5TzF4dWNISnZZMlZ6Y3k1aGNtZDJJRDBnVzEwN1hHNXdjbTlqWlhOekxuWmxjbk5wYjI0Z1BTQW5KenNnTHk4Z1pXMXdkSGtnYzNSeWFXNW5JSFJ2SUdGMmIybGtJSEpsWjJWNGNDQnBjM04xWlhOY2JuQnliMk5sYzNNdWRtVnljMmx2Ym5NZ1BTQjdmVHRjYmx4dVpuVnVZM1JwYjI0Z2JtOXZjQ2dwSUh0OVhHNWNibkJ5YjJObGMzTXViMjRnUFNCdWIyOXdPMXh1Y0hKdlkyVnpjeTVoWkdSTWFYTjBaVzVsY2lBOUlHNXZiM0E3WEc1d2NtOWpaWE56TG05dVkyVWdQU0J1YjI5d08xeHVjSEp2WTJWemN5NXZabVlnUFNCdWIyOXdPMXh1Y0hKdlkyVnpjeTV5WlcxdmRtVk1hWE4wWlc1bGNpQTlJRzV2YjNBN1hHNXdjbTlqWlhOekxuSmxiVzkyWlVGc2JFeHBjM1JsYm1WeWN5QTlJRzV2YjNBN1hHNXdjbTlqWlhOekxtVnRhWFFnUFNCdWIyOXdPMXh1WEc1d2NtOWpaWE56TG1KcGJtUnBibWNnUFNCbWRXNWpkR2x2YmlBb2JtRnRaU2tnZTF4dUlDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25jSEp2WTJWemN5NWlhVzVrYVc1bklHbHpJRzV2ZENCemRYQndiM0owWldRbktUdGNibjA3WEc1Y2JpOHZJRlJQUkU4b2MyaDBlV3h0WVc0cFhHNXdjbTlqWlhOekxtTjNaQ0E5SUdaMWJtTjBhVzl1SUNncElIc2djbVYwZFhKdUlDY3ZKeUI5TzF4dWNISnZZMlZ6Y3k1amFHUnBjaUE5SUdaMWJtTjBhVzl1SUNoa2FYSXBJSHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0ozQnliMk5sYzNNdVkyaGthWElnYVhNZ2JtOTBJSE4xY0hCdmNuUmxaQ2NwTzF4dWZUdGNibkJ5YjJObGMzTXVkVzFoYzJzZ1BTQm1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJREE3SUgwN1hHNGlMQ0lvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0JjSW5WelpTQnpkSEpwWTNSY0lqdGNibHh1SUNCbWRXNWpkR2x2YmlCaWRHOWhLSE4wY2lrZ2UxeHVJQ0FnSUhaaGNpQmlkV1ptWlhKY2JpQWdJQ0FnSUR0Y2JseHVJQ0FnSUdsbUlDaHpkSElnYVc1emRHRnVZMlZ2WmlCQ2RXWm1aWElwSUh0Y2JpQWdJQ0FnSUdKMVptWmxjaUE5SUhOMGNqdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnWW5WbVptVnlJRDBnYm1WM0lFSjFabVpsY2loemRISXVkRzlUZEhKcGJtY29LU3dnSjJKcGJtRnllU2NwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEhWeWJpQmlkV1ptWlhJdWRHOVRkSEpwYm1jb0oySmhjMlUyTkNjcE8xeHVJQ0I5WEc1Y2JpQWdiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQmlkRzloTzF4dWZTZ3BLVHRjYmlJc0lpOHFJR3B6YUdsdWRDQnViMlJsT2lCMGNuVmxJQ292WEc0b1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lGd2lkWE5sSUhOMGNtbGpkRndpTzF4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnUTI5dmEybGxRV05qWlhOelNXNW1ieWhrYjIxaGFXNHNJSEJoZEdnc0lITmxZM1Z5WlN3Z2MyTnlhWEIwS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdseklHbHVjM1JoYm1ObGIyWWdRMjl2YTJsbFFXTmpaWE56U1c1bWJ5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVrYjIxaGFXNGdQU0JrYjIxaGFXNGdmSHdnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d1lYUm9JRDBnY0dGMGFDQjhmQ0JjSWk5Y0lqdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZqZFhKbElEMGdJU0Z6WldOMWNtVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5qY21sd2RDQTlJQ0VoYzJOeWFYQjBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCRGIyOXJhV1ZCWTJObGMzTkpibVp2S0dSdmJXRnBiaXdnY0dGMGFDd2djMlZqZFhKbExDQnpZM0pwY0hRcE8xeHVJQ0FnSUgxY2JpQWdJQ0JsZUhCdmNuUnpMa052YjJ0cFpVRmpZMlZ6YzBsdVptOGdQU0JEYjI5cmFXVkJZMk5sYzNOSmJtWnZPMXh1WEc0Z0lDQWdablZ1WTNScGIyNGdRMjl2YTJsbEtHTnZiMnRwWlhOMGNpd2djbVZ4ZFdWemRGOWtiMjFoYVc0c0lISmxjWFZsYzNSZmNHRjBhQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9ZMjl2YTJsbGMzUnlJR2x1YzNSaGJtTmxiMllnUTI5dmEybGxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyOXZhMmxsYzNSeU8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpJR2x1YzNSaGJtTmxiMllnUTI5dmEybGxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG01aGJXVWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTJZV3gxWlNBOUlHNTFiR3c3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1WNGNHbHlZWFJwYjI1ZlpHRjBaU0E5SUVsdVptbHVhWFI1TzF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d1lYUm9JRDBnVTNSeWFXNW5LSEpsY1hWbGMzUmZjR0YwYUNCOGZDQmNJaTljSWlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtVjRjR3hwWTJsMFgzQmhkR2dnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wkc5dFlXbHVJRDBnY21WeGRXVnpkRjlrYjIxaGFXNGdmSHdnYm5Wc2JEdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaWGh3YkdsamFYUmZaRzl0WVdsdUlEMGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZM1Z5WlNBOUlHWmhiSE5sT3lBdkwyaHZkeUIwYnlCa1pXWnBibVVnWkdWbVlYVnNkRDljYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Ym05elkzSnBjSFFnUFNCbVlXeHpaVHNnTHk5b2RIUndiMjVzZVZ4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOdmIydHBaWE4wY2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0dGeWMyVW9ZMjl2YTJsbGMzUnlMQ0J5WlhGMVpYTjBYMlJ2YldGcGJpd2djbVZ4ZFdWemRGOXdZWFJvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ1WlhjZ1EyOXZhMmxsS0dOdmIydHBaWE4wY2lrN1hHNGdJQ0FnZlZ4dUlDQWdJR1Y0Y0c5eWRITXVRMjl2YTJsbElEMGdRMjl2YTJsbE8xeHVYRzRnSUNBZ1EyOXZhMmxsTG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1WnlBOUlHWjFibU4wYVc5dUlIUnZVM1J5YVc1bktDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2MzUnlJRDBnVzNSb2FYTXVibUZ0WlNBcklGd2lQVndpSUNzZ2RHaHBjeTUyWVd4MVpWMDdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbVY0Y0dseVlYUnBiMjVmWkdGMFpTQWhQVDBnU1c1bWFXNXBkSGtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE4wY2k1d2RYTm9LRndpWlhod2FYSmxjejFjSWlBcklDaHVaWGNnUkdGMFpTaDBhR2x6TG1WNGNHbHlZWFJwYjI1ZlpHRjBaU2twTG5SdlIwMVVVM1J5YVc1bktDa3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG1SdmJXRnBiaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjM1J5TG5CMWMyZ29YQ0prYjIxaGFXNDlYQ0lnS3lCMGFHbHpMbVJ2YldGcGJpazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11Y0dGMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2MzUnlMbkIxYzJnb1hDSndZWFJvUFZ3aUlDc2dkR2hwY3k1d1lYUm9LVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1elpXTjFjbVVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE4wY2k1d2RYTm9LRndpYzJWamRYSmxYQ0lwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtNXZjMk55YVhCMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCemRISXVjSFZ6YUNoY0ltaDBkSEJ2Ym14NVhDSXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ6ZEhJdWFtOXBiaWhjSWpzZ1hDSXBPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQkRiMjlyYVdVdWNISnZkRzkwZVhCbExuUnZWbUZzZFdWVGRISnBibWNnUFNCbWRXNWpkR2x2YmlCMGIxWmhiSFZsVTNSeWFXNW5LQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXVZVzFsSUNzZ1hDSTlYQ0lnS3lCMGFHbHpMblpoYkhWbE8xeHVJQ0FnSUgwN1hHNWNiaUFnSUNCMllYSWdZMjl2YTJsbFgzTjBjbDl6Y0d4cGRIUmxjaUE5SUM5Yk9sMG9QejFjWEhNcVcyRXRla0V0V2pBdE9WOWNYQzFkSzF4Y2N5cGJQVjBwTDJjN1hHNGdJQ0FnUTI5dmEybGxMbkJ5YjNSdmRIbHdaUzV3WVhKelpTQTlJR1oxYm1OMGFXOXVJSEJoY25ObEtITjBjaXdnY21WeGRXVnpkRjlrYjIxaGFXNHNJSEpsY1hWbGMzUmZjR0YwYUNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5QnBibk4wWVc1alpXOW1JRU52YjJ0cFpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEJoY25SeklEMGdjM1J5TG5Od2JHbDBLRndpTzF3aUtTNW1hV3gwWlhJb1puVnVZM1JwYjI0Z0tIWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQWhJWFpoYkhWbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJoYVhJZ1BTQndZWEowYzFzd1hTNXRZWFJqYUNndktGdGVQVjByS1Qwb1cxeGNjMXhjVTEwcUtTOHBMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3RsZVNBOUlIQmhhWEpiTVYwc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCd1lXbHlXekpkTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtNWhiV1VnUFNCclpYazdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkbUZzZFdVN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnSUdadmNpQW9hU0E5SURFN0lHa2dQQ0J3WVhKMGN5NXNaVzVuZEdnN0lHa2dLejBnTVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmhhWElnUFNCd1lYSjBjMXRwWFM1dFlYUmphQ2d2S0Z0ZVBWMHJLU2cvT2owb1cxeGNjMXhjVTEwcUtTay9MeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJWNUlEMGdjR0ZwY2xzeFhTNTBjbWx0S0NrdWRHOU1iM2RsY2tOaGMyVW9LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVd4MVpTQTlJSEJoYVhKYk1sMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM2RwZEdOb0lDaHJaWGtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallYTmxJRndpYUhSMGNHOXViSGxjSWpwY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dWIzTmpjbWx3ZENBOUlIUnlkV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdYQ0psZUhCcGNtVnpYQ0k2WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wlhod2FYSmhkR2x2Ymw5a1lYUmxJRDBnZG1Gc2RXVWdQMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUU1MWJXSmxjaWhFWVhSbExuQmhjbk5sS0haaGJIVmxLU2tnT2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lFbHVabWx1YVhSNU8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZWE5sSUZ3aWNHRjBhRndpT2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CaGRHZ2dQU0IyWVd4MVpTQS9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVXVkSEpwYlNncElEcGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWx3aU8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtVjRjR3hwWTJsMFgzQmhkR2dnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVhObElGd2laRzl0WVdsdVhDSTZYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaRzl0WVdsdUlEMGdkbUZzZFdVZ1AxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoYkhWbExuUnlhVzBvS1NBNlhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0pjSWp0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bGVIQnNhV05wZEY5a2IyMWhhVzRnUFNBaElYUm9hWE11Wkc5dFlXbHVPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVhObElGd2ljMlZqZFhKbFhDSTZYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZqZFhKbElEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hWE11Wlhod2JHbGphWFJmY0dGMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d1lYUm9JRDBnY21WeGRXVnpkRjl3WVhSb0lIeDhJRndpTDF3aU8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbVY0Y0d4cFkybDBYMlJ2YldGcGJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1a2IyMWhhVzRnUFNCeVpYRjFaWE4wWDJSdmJXRnBianRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCRGIyOXJhV1VvS1M1d1lYSnpaU2h6ZEhJc0lISmxjWFZsYzNSZlpHOXRZV2x1TENCeVpYRjFaWE4wWDNCaGRHZ3BPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQkRiMjlyYVdVdWNISnZkRzkwZVhCbExtMWhkR05vWlhNZ1BTQm1kVzVqZEdsdmJpQnRZWFJqYUdWektHRmpZMlZ6YzE5cGJtWnZLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG01dmMyTnlhWEIwSUNZbUlHRmpZMlZ6YzE5cGJtWnZMbk5qY21sd2RDQjhmRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmpkWEpsSUNZbUlDRmhZMk5sYzNOZmFXNW1ieTV6WldOMWNtVWdmSHhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FoZEdocGN5NWpiMnhzYVdSbGMxZHBkR2dvWVdOalpYTnpYMmx1Wm04cEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUVOdmIydHBaUzV3Y205MGIzUjVjR1V1WTI5c2JHbGtaWE5YYVhSb0lEMGdablZ1WTNScGIyNGdZMjlzYkdsa1pYTlhhWFJvS0dGalkyVnpjMTlwYm1adktTQjdYRzRnSUNBZ0lDQWdJR2xtSUNnb2RHaHBjeTV3WVhSb0lDWW1JQ0ZoWTJObGMzTmZhVzVtYnk1d1lYUm9LU0I4ZkNBb2RHaHBjeTVrYjIxaGFXNGdKaVlnSVdGalkyVnpjMTlwYm1adkxtUnZiV0ZwYmlrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV3WVhSb0lDWW1JR0ZqWTJWemMxOXBibVp2TG5CaGRHZ3VhVzVrWlhoUFppaDBhR2x6TG5CaGRHZ3BJQ0U5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG1WNGNHeHBZMmwwWDNCaGRHZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWNHRjBhQ0FoUFQwZ1lXTmpaWE56WDJsdVptOHVjR0YwYUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdkbUZ5SUdGalkyVnpjMTlrYjIxaGFXNGdQU0JoWTJObGMzTmZhVzVtYnk1a2IyMWhhVzRnSmlZZ1lXTmpaWE56WDJsdVptOHVaRzl0WVdsdUxuSmxjR3hoWTJVb0wxNWJYRnd1WFM4c0p5Y3BPMXh1SUNBZ0lDQWdJQ0IyWVhJZ1kyOXZhMmxsWDJSdmJXRnBiaUE5SUhSb2FYTXVaRzl0WVdsdUlDWW1JSFJvYVhNdVpHOXRZV2x1TG5KbGNHeGhZMlVvTDE1YlhGd3VYUzhzSnljcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWTI5dmEybGxYMlJ2YldGcGJpQTlQVDBnWVdOalpYTnpYMlJ2YldGcGJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSeWRXVTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tHTnZiMnRwWlY5a2IyMWhhVzRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVsZUhCc2FXTnBkRjlrYjIxaGFXNHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN0lDOHZJSGRsSUdGc2NtVmhaSGtnWTJobFkydGxaQ0JwWmlCMGFHVWdaRzl0WVdsdWN5QjNaWEpsSUdWNFlXTjBiSGtnZEdobElITmhiV1ZjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQjNhV3hrWTJGeVpDQTlJR0ZqWTJWemMxOWtiMjFoYVc0dWFXNWtaWGhQWmloamIyOXJhV1ZmWkc5dFlXbHVLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gzYVd4a1kyRnlaQ0E5UFQwZ0xURWdmSHdnZDJsc1pHTmhjbVFnSVQwOUlHRmpZMlZ6YzE5a2IyMWhhVzR1YkdWdVozUm9JQzBnWTI5dmEybGxYMlJ2YldGcGJpNXNaVzVuZEdncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEhKMVpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdJQ0I5TzF4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnUTI5dmEybGxTbUZ5S0NrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWTI5dmEybGxjeXdnWTI5dmEybGxjMTlzYVhOMExDQmpiMnhzYVdSaFlteGxYMk52YjJ0cFpUdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTWdhVzV6ZEdGdVkyVnZaaUJEYjI5cmFXVktZWElwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR052YjJ0cFpYTWdQU0JQWW1wbFkzUXVZM0psWVhSbEtHNTFiR3dwT3lBdkwyNWhiV1U2SUZ0RGIyOXJhV1ZkWEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVjBRMjl2YTJsbElEMGdablZ1WTNScGIyNGdjMlYwUTI5dmEybGxLR052YjJ0cFpTd2djbVZ4ZFdWemRGOWtiMjFoYVc0c0lISmxjWFZsYzNSZmNHRjBhQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaVzF2ZG1Vc0lHazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl2YTJsbElEMGdibVYzSUVOdmIydHBaU2hqYjI5cmFXVXNJSEpsY1hWbGMzUmZaRzl0WVdsdUxDQnlaWEYxWlhOMFgzQmhkR2dwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dlJHVnNaWFJsSUhSb1pTQmpiMjlyYVdVZ2FXWWdkR2hsSUhObGRDQnBjeUJ3WVhOMElIUm9aU0JqZFhKeVpXNTBJSFJwYldWY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpXMXZkbVVnUFNCamIyOXJhV1V1Wlhod2FYSmhkR2x2Ymw5a1lYUmxJRHc5SUVSaGRHVXVibTkzS0NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR052YjJ0cFpYTmJZMjl2YTJsbExtNWhiV1ZkSUNFOVBTQjFibVJsWm1sdVpXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXZhMmxsYzE5c2FYTjBJRDBnWTI5dmEybGxjMXRqYjI5cmFXVXVibUZ0WlYwN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1p2Y2lBb2FTQTlJREE3SUdrZ1BDQmpiMjlyYVdWelgyeHBjM1F1YkdWdVozUm9PeUJwSUNzOUlERXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052Ykd4cFpHRmliR1ZmWTI5dmEybGxJRDBnWTI5dmEybGxjMTlzYVhOMFcybGRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOdmJHeHBaR0ZpYkdWZlkyOXZhMmxsTG1OdmJHeHBaR1Z6VjJsMGFDaGpiMjlyYVdVcEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tISmxiVzkyWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyOXJhV1Z6WDJ4cGMzUXVjM0JzYVdObEtHa3NJREVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kyOXZhMmxsYzE5c2FYTjBMbXhsYm1kMGFDQTlQVDBnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR1ZzWlhSbElHTnZiMnRwWlhOYlkyOXZhMmxsTG01aGJXVmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl2YTJsbGMxOXNhWE4wVzJsZElEMGdZMjl2YTJsbE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmpiMjlyYVdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEpsYlc5MlpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmIydHBaWE5mYkdsemRDNXdkWE5vS0dOdmIydHBaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCamIyOXJhV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHlaVzF2ZG1VcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMjlyYVdWelcyTnZiMnRwWlM1dVlXMWxYU0E5SUZ0amIyOXJhV1ZkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJqYjI5cmFXVnpXMk52YjJ0cFpTNXVZVzFsWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMM0psZEhWeWJuTWdZU0JqYjI5cmFXVmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaMlYwUTI5dmEybGxJRDBnWm5WdVkzUnBiMjRnWjJWMFEyOXZhMmxsS0dOdmIydHBaVjl1WVcxbExDQmhZMk5sYzNOZmFXNW1ieWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQmpiMjlyYVdVc0lHazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl2YTJsbGMxOXNhWE4wSUQwZ1kyOXZhMmxsYzF0amIyOXJhV1ZmYm1GdFpWMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGamIyOXJhV1Z6WDJ4cGMzUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWIzSWdLR2tnUFNBd095QnBJRHdnWTI5dmEybGxjMTlzYVhOMExteGxibWQwYURzZ2FTQXJQU0F4S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR052YjJ0cFpTQTlJR052YjJ0cFpYTmZiR2x6ZEZ0cFhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTnZiMnRwWlM1bGVIQnBjbUYwYVc5dVgyUmhkR1VnUEQwZ1JHRjBaUzV1YjNjb0tTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOdmIydHBaWE5mYkdsemRDNXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtaV3hsZEdVZ1kyOXZhMmxsYzF0amIyOXJhV1V1Ym1GdFpWMDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTI5dmEybGxMbTFoZEdOb1pYTW9ZV05qWlhOelgybHVabThwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWTI5dmEybGxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnZlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2Y21WMGRYSnVjeUJoSUd4cGMzUWdiMllnWTI5dmEybGxjMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVuWlhSRGIyOXJhV1Z6SUQwZ1puVnVZM1JwYjI0Z1oyVjBRMjl2YTJsbGN5aGhZMk5sYzNOZmFXNW1ieWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnRZWFJqYUdWeklEMGdXMTBzSUdOdmIydHBaVjl1WVcxbExDQmpiMjlyYVdVN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2hqYjI5cmFXVmZibUZ0WlNCcGJpQmpiMjlyYVdWektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmIydHBaU0E5SUhSb2FYTXVaMlYwUTI5dmEybGxLR052YjJ0cFpWOXVZVzFsTENCaFkyTmxjM05mYVc1bWJ5azdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGpiMjlyYVdVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhkR05vWlhNdWNIVnphQ2hqYjI5cmFXVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhkR05vWlhNdWRHOVRkSEpwYm1jZ1BTQm1kVzVqZEdsdmJpQjBiMU4wY21sdVp5Z3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUcxaGRHTm9aWE11YW05cGJpaGNJanBjSWlrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWFJqYUdWekxuUnZWbUZzZFdWVGRISnBibWNnUFNCbWRXNWpkR2x2YmlCMGIxWmhiSFZsVTNSeWFXNW5LQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JXRjBZMmhsY3k1dFlYQW9ablZ1WTNScGIyNGdLR01wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJqTG5SdlZtRnNkV1ZUZEhKcGJtY29LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTa3VhbTlwYmlnbk95Y3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRzFoZEdOb1pYTTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN6dGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdibVYzSUVOdmIydHBaVXBoY2lncE8xeHVJQ0FnSUgxY2JpQWdJQ0JsZUhCdmNuUnpMa052YjJ0cFpVcGhjaUE5SUVOdmIydHBaVXBoY2p0Y2JseHVJQ0FnSUM4dmNtVjBkWEp1Y3lCc2FYTjBJRzltSUdOdmIydHBaWE1nZEdoaGRDQjNaWEpsSUhObGRDQmpiM0p5WldOMGJIa3VJRU52YjJ0cFpYTWdkR2hoZENCaGNtVWdaWGh3YVhKbFpDQmhibVFnY21WdGIzWmxaQ0JoY21VZ2JtOTBJSEpsZEhWeWJtVmtMbHh1SUNBZ0lFTnZiMnRwWlVwaGNpNXdjbTkwYjNSNWNHVXVjMlYwUTI5dmEybGxjeUE5SUdaMWJtTjBhVzl1SUhObGRFTnZiMnRwWlhNb1kyOXZhMmxsY3l3Z2NtVnhkV1Z6ZEY5a2IyMWhhVzRzSUhKbGNYVmxjM1JmY0dGMGFDa2dlMXh1SUNBZ0lDQWdJQ0JqYjI5cmFXVnpJRDBnUVhKeVlYa3VhWE5CY25KaGVTaGpiMjlyYVdWektTQS9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl2YTJsbGN5QTZYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl2YTJsbGN5NXpjR3hwZENoamIyOXJhV1ZmYzNSeVgzTndiR2wwZEdWeUtUdGNiaUFnSUNBZ0lDQWdkbUZ5SUhOMVkyTmxjM05tZFd3Z1BTQmJYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHa3NYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyOXJhV1U3WEc0Z0lDQWdJQ0FnSUdOdmIydHBaWE1nUFNCamIyOXJhV1Z6TG0xaGNDaERiMjlyYVdVcE8xeHVJQ0FnSUNBZ0lDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z1kyOXZhMmxsY3k1c1pXNW5kR2c3SUdrZ0t6MGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdZMjl2YTJsbElEMGdZMjl2YTJsbGMxdHBYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuTmxkRU52YjJ0cFpTaGpiMjlyYVdVc0lISmxjWFZsYzNSZlpHOXRZV2x1TENCeVpYRjFaWE4wWDNCaGRHZ3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzNWalkyVnpjMloxYkM1d2RYTm9LR052YjJ0cFpTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlITjFZMk5sYzNObWRXdzdYRzRnSUNBZ2ZUdGNibjBvS1NrN1hHNGlMQ0l2S2lGY2JpQXFJR3BSZFdWeWVTQktZWFpoVTJOeWFYQjBJRXhwWW5KaGNua2dkakl1TVM0elhHNGdLaUJvZEhSd09pOHZhbkYxWlhKNUxtTnZiUzljYmlBcVhHNGdLaUJKYm1Oc2RXUmxjeUJUYVhwNmJHVXVhbk5jYmlBcUlHaDBkSEE2THk5emFYcDZiR1ZxY3k1amIyMHZYRzRnS2x4dUlDb2dRMjl3ZVhKcFoyaDBJREl3TURVc0lESXdNVFFnYWxGMVpYSjVJRVp2ZFc1a1lYUnBiMjRzSUVsdVl5NGdZVzVrSUc5MGFHVnlJR052Ym5SeWFXSjFkRzl5YzF4dUlDb2dVbVZzWldGelpXUWdkVzVrWlhJZ2RHaGxJRTFKVkNCc2FXTmxibk5sWEc0Z0tpQm9kSFJ3T2k4dmFuRjFaWEo1TG05eVp5OXNhV05sYm5ObFhHNGdLbHh1SUNvZ1JHRjBaVG9nTWpBeE5DMHhNaTB4T0ZReE5Ub3hNVnBjYmlBcUwxeHVYRzRvWm5WdVkzUnBiMjRvSUdkc2IySmhiQ3dnWm1GamRHOXllU0FwSUh0Y2JseHVYSFJwWmlBb0lIUjVjR1Z2WmlCdGIyUjFiR1VnUFQwOUlGd2liMkpxWldOMFhDSWdKaVlnZEhsd1pXOW1JRzF2WkhWc1pTNWxlSEJ2Y25SeklEMDlQU0JjSW05aWFtVmpkRndpSUNrZ2UxeHVYSFJjZEM4dklFWnZjaUJEYjIxdGIyNUtVeUJoYm1RZ1EyOXRiVzl1U2xNdGJHbHJaU0JsYm5acGNtOXViV1Z1ZEhNZ2QyaGxjbVVnWVNCd2NtOXdaWElnWUhkcGJtUnZkMkJjYmx4MFhIUXZMeUJwY3lCd2NtVnpaVzUwTENCbGVHVmpkWFJsSUhSb1pTQm1ZV04wYjNKNUlHRnVaQ0JuWlhRZ2FsRjFaWEo1TGx4dVhIUmNkQzh2SUVadmNpQmxiblpwY205dWJXVnVkSE1nZEdoaGRDQmtieUJ1YjNRZ2FHRjJaU0JoSUdCM2FXNWtiM2RnSUhkcGRHZ2dZU0JnWkc5amRXMWxiblJnWEc1Y2RGeDBMeThnS0hOMVkyZ2dZWE1nVG05a1pTNXFjeWtzSUdWNGNHOXpaU0JoSUdaaFkzUnZjbmtnWVhNZ2JXOWtkV3hsTG1WNGNHOXlkSE11WEc1Y2RGeDBMeThnVkdocGN5QmhZMk5sYm5SMVlYUmxjeUIwYUdVZ2JtVmxaQ0JtYjNJZ2RHaGxJR055WldGMGFXOXVJRzltSUdFZ2NtVmhiQ0JnZDJsdVpHOTNZQzVjYmx4MFhIUXZMeUJsTG1jdUlIWmhjaUJxVVhWbGNua2dQU0J5WlhGMWFYSmxLRndpYW5GMVpYSjVYQ0lwS0hkcGJtUnZkeWs3WEc1Y2RGeDBMeThnVTJWbElIUnBZMnRsZENBak1UUTFORGtnWm05eUlHMXZjbVVnYVc1bWJ5NWNibHgwWEhSdGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdkc2IySmhiQzVrYjJOMWJXVnVkQ0EvWEc1Y2RGeDBYSFJtWVdOMGIzSjVLQ0JuYkc5aVlXd3NJSFJ5ZFdVZ0tTQTZYRzVjZEZ4MFhIUm1kVzVqZEdsdmJpZ2dkeUFwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0FoZHk1a2IyTjFiV1Z1ZENBcElIdGNibHgwWEhSY2RGeDBYSFIwYUhKdmR5QnVaWGNnUlhKeWIzSW9JRndpYWxGMVpYSjVJSEpsY1hWcGNtVnpJR0VnZDJsdVpHOTNJSGRwZEdnZ1lTQmtiMk4xYldWdWRGd2lJQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdaaFkzUnZjbmtvSUhjZ0tUdGNibHgwWEhSY2RIMDdYRzVjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBabUZqZEc5eWVTZ2daMnh2WW1Gc0lDazdYRzVjZEgxY2JseHVMeThnVUdGemN5QjBhR2x6SUdsbUlIZHBibVJ2ZHlCcGN5QnViM1FnWkdWbWFXNWxaQ0I1WlhSY2JuMG9kSGx3Wlc5bUlIZHBibVJ2ZHlBaFBUMGdYQ0oxYm1SbFptbHVaV1JjSWlBL0lIZHBibVJ2ZHlBNklIUm9hWE1zSUdaMWJtTjBhVzl1S0NCM2FXNWtiM2NzSUc1dlIyeHZZbUZzSUNrZ2UxeHVYRzR2THlCVGRYQndiM0owT2lCR2FYSmxabTk0SURFNEsxeHVMeThnUTJGdUozUWdZbVVnYVc0Z2MzUnlhV04wSUcxdlpHVXNJSE5sZG1WeVlXd2diR2xpY3lCcGJtTnNkV1JwYm1jZ1FWTlFMazVGVkNCMGNtRmpaVnh1THk4Z2RHaGxJSE4wWVdOcklIWnBZU0JoY21kMWJXVnVkSE11WTJGc2JHVnlMbU5oYkd4bFpTQmhibVFnUm1seVpXWnZlQ0JrYVdWeklHbG1YRzR2THlCNWIzVWdkSEo1SUhSdklIUnlZV05sSUhSb2NtOTFaMmdnWENKMWMyVWdjM1J5YVdOMFhDSWdZMkZzYkNCamFHRnBibk11SUNnak1UTXpNelVwWEc0dkwxeHVYRzUyWVhJZ1lYSnlJRDBnVzEwN1hHNWNiblpoY2lCemJHbGpaU0E5SUdGeWNpNXpiR2xqWlR0Y2JseHVkbUZ5SUdOdmJtTmhkQ0E5SUdGeWNpNWpiMjVqWVhRN1hHNWNiblpoY2lCd2RYTm9JRDBnWVhKeUxuQjFjMmc3WEc1Y2JuWmhjaUJwYm1SbGVFOW1JRDBnWVhKeUxtbHVaR1Y0VDJZN1hHNWNiblpoY2lCamJHRnpjekowZVhCbElEMGdlMzA3WEc1Y2JuWmhjaUIwYjFOMGNtbHVaeUE5SUdOc1lYTnpNblI1Y0dVdWRHOVRkSEpwYm1jN1hHNWNiblpoY2lCb1lYTlBkMjRnUFNCamJHRnpjekowZVhCbExtaGhjMDkzYmxCeWIzQmxjblI1TzF4dVhHNTJZWElnYzNWd2NHOXlkQ0E5SUh0OU8xeHVYRzVjYmx4dWRtRnlYRzVjZEM4dklGVnpaU0IwYUdVZ1kyOXljbVZqZENCa2IyTjFiV1Z1ZENCaFkyTnZjbVJwYm1kc2VTQjNhWFJvSUhkcGJtUnZkeUJoY21kMWJXVnVkQ0FvYzJGdVpHSnZlQ2xjYmx4MFpHOWpkVzFsYm5RZ1BTQjNhVzVrYjNjdVpHOWpkVzFsYm5Rc1hHNWNibHgwZG1WeWMybHZiaUE5SUZ3aU1pNHhMak5jSWl4Y2JseHVYSFF2THlCRVpXWnBibVVnWVNCc2IyTmhiQ0JqYjNCNUlHOW1JR3BSZFdWeWVWeHVYSFJxVVhWbGNua2dQU0JtZFc1amRHbHZiaWdnYzJWc1pXTjBiM0lzSUdOdmJuUmxlSFFnS1NCN1hHNWNkRngwTHk4Z1ZHaGxJR3BSZFdWeWVTQnZZbXBsWTNRZ2FYTWdZV04wZFdGc2JIa2dhblZ6ZENCMGFHVWdhVzVwZENCamIyNXpkSEoxWTNSdmNpQW5aVzVvWVc1alpXUW5YRzVjZEZ4MEx5OGdUbVZsWkNCcGJtbDBJR2xtSUdwUmRXVnllU0JwY3lCallXeHNaV1FnS0dwMWMzUWdZV3hzYjNjZ1pYSnliM0lnZEc4Z1ltVWdkR2h5YjNkdUlHbG1JRzV2ZENCcGJtTnNkV1JsWkNsY2JseDBYSFJ5WlhSMWNtNGdibVYzSUdwUmRXVnllUzVtYmk1cGJtbDBLQ0J6Wld4bFkzUnZjaXdnWTI5dWRHVjRkQ0FwTzF4dVhIUjlMRnh1WEc1Y2RDOHZJRk4xY0hCdmNuUTZJRUZ1WkhKdmFXUThOQzR4WEc1Y2RDOHZJRTFoYTJVZ2MzVnlaU0IzWlNCMGNtbHRJRUpQVFNCaGJtUWdUa0pUVUZ4dVhIUnlkSEpwYlNBOUlDOWVXMXhjYzF4Y2RVWkZSa1pjWEhoQk1GMHJmRnRjWEhOY1hIVkdSVVpHWEZ4NFFUQmRLeVF2Wnl4Y2JseHVYSFF2THlCTllYUmphR1Z6SUdSaGMyaGxaQ0J6ZEhKcGJtY2dabTl5SUdOaGJXVnNhWHBwYm1kY2JseDBjbTF6VUhKbFptbDRJRDBnTDE0dGJYTXRMeXhjYmx4MGNtUmhjMmhCYkhCb1lTQTlJQzh0S0Z0Y1hHUmhMWHBkS1M5bmFTeGNibHh1WEhRdkx5QlZjMlZrSUdKNUlHcFJkV1Z5ZVM1allXMWxiRU5oYzJVZ1lYTWdZMkZzYkdKaFkyc2dkRzhnY21Wd2JHRmpaU2dwWEc1Y2RHWmpZVzFsYkVOaGMyVWdQU0JtZFc1amRHbHZiaWdnWVd4c0xDQnNaWFIwWlhJZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUd4bGRIUmxjaTUwYjFWd2NHVnlRMkZ6WlNncE8xeHVYSFI5TzF4dVhHNXFVWFZsY25rdVptNGdQU0JxVVhWbGNua3VjSEp2ZEc5MGVYQmxJRDBnZTF4dVhIUXZMeUJVYUdVZ1kzVnljbVZ1ZENCMlpYSnphVzl1SUc5bUlHcFJkV1Z5ZVNCaVpXbHVaeUIxYzJWa1hHNWNkR3B4ZFdWeWVUb2dkbVZ5YzJsdmJpeGNibHh1WEhSamIyNXpkSEoxWTNSdmNqb2dhbEYxWlhKNUxGeHVYRzVjZEM4dklGTjBZWEowSUhkcGRHZ2dZVzRnWlcxd2RIa2djMlZzWldOMGIzSmNibHgwYzJWc1pXTjBiM0k2SUZ3aVhDSXNYRzVjYmx4MEx5OGdWR2hsSUdSbFptRjFiSFFnYkdWdVozUm9JRzltSUdFZ2FsRjFaWEo1SUc5aWFtVmpkQ0JwY3lBd1hHNWNkR3hsYm1kMGFEb2dNQ3hjYmx4dVhIUjBiMEZ5Y21GNU9pQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUnlaWFIxY200Z2MyeHBZMlV1WTJGc2JDZ2dkR2hwY3lBcE8xeHVYSFI5TEZ4dVhHNWNkQzh2SUVkbGRDQjBhR1VnVG5Sb0lHVnNaVzFsYm5RZ2FXNGdkR2hsSUcxaGRHTm9aV1FnWld4bGJXVnVkQ0J6WlhRZ1QxSmNibHgwTHk4Z1IyVjBJSFJvWlNCM2FHOXNaU0J0WVhSamFHVmtJR1ZzWlcxbGJuUWdjMlYwSUdGeklHRWdZMnhsWVc0Z1lYSnlZWGxjYmx4MFoyVjBPaUJtZFc1amRHbHZiaWdnYm5WdElDa2dlMXh1WEhSY2RISmxkSFZ5YmlCdWRXMGdJVDBnYm5Wc2JDQS9YRzVjYmx4MFhIUmNkQzh2SUZKbGRIVnliaUJxZFhOMElIUm9aU0J2Ym1VZ1pXeGxiV1Z1ZENCbWNtOXRJSFJvWlNCelpYUmNibHgwWEhSY2RDZ2diblZ0SUR3Z01DQS9JSFJvYVhOYklHNTFiU0FySUhSb2FYTXViR1Z1WjNSb0lGMGdPaUIwYUdseld5QnVkVzBnWFNBcElEcGNibHh1WEhSY2RGeDBMeThnVW1WMGRYSnVJR0ZzYkNCMGFHVWdaV3hsYldWdWRITWdhVzRnWVNCamJHVmhiaUJoY25KaGVWeHVYSFJjZEZ4MGMyeHBZMlV1WTJGc2JDZ2dkR2hwY3lBcE8xeHVYSFI5TEZ4dVhHNWNkQzh2SUZSaGEyVWdZVzRnWVhKeVlYa2diMllnWld4bGJXVnVkSE1nWVc1a0lIQjFjMmdnYVhRZ2IyNTBieUIwYUdVZ2MzUmhZMnRjYmx4MEx5OGdLSEpsZEhWeWJtbHVaeUIwYUdVZ2JtVjNJRzFoZEdOb1pXUWdaV3hsYldWdWRDQnpaWFFwWEc1Y2RIQjFjMmhUZEdGamF6b2dablZ1WTNScGIyNG9JR1ZzWlcxeklDa2dlMXh1WEc1Y2RGeDBMeThnUW5WcGJHUWdZU0J1WlhjZ2FsRjFaWEo1SUcxaGRHTm9aV1FnWld4bGJXVnVkQ0J6WlhSY2JseDBYSFIyWVhJZ2NtVjBJRDBnYWxGMVpYSjVMbTFsY21kbEtDQjBhR2x6TG1OdmJuTjBjblZqZEc5eUtDa3NJR1ZzWlcxeklDazdYRzVjYmx4MFhIUXZMeUJCWkdRZ2RHaGxJRzlzWkNCdlltcGxZM1FnYjI1MGJ5QjBhR1VnYzNSaFkyc2dLR0Z6SUdFZ2NtVm1aWEpsYm1ObEtWeHVYSFJjZEhKbGRDNXdjbVYyVDJKcVpXTjBJRDBnZEdocGN6dGNibHgwWEhSeVpYUXVZMjl1ZEdWNGRDQTlJSFJvYVhNdVkyOXVkR1Y0ZER0Y2JseHVYSFJjZEM4dklGSmxkSFZ5YmlCMGFHVWdibVYzYkhrdFptOXliV1ZrSUdWc1pXMWxiblFnYzJWMFhHNWNkRngwY21WMGRYSnVJSEpsZER0Y2JseDBmU3hjYmx4dVhIUXZMeUJGZUdWamRYUmxJR0VnWTJGc2JHSmhZMnNnWm05eUlHVjJaWEo1SUdWc1pXMWxiblFnYVc0Z2RHaGxJRzFoZEdOb1pXUWdjMlYwTGx4dVhIUXZMeUFvV1c5MUlHTmhiaUJ6WldWa0lIUm9aU0JoY21kMWJXVnVkSE1nZDJsMGFDQmhiaUJoY25KaGVTQnZaaUJoY21kekxDQmlkWFFnZEdocGN5QnBjMXh1WEhRdkx5QnZibXg1SUhWelpXUWdhVzUwWlhKdVlXeHNlUzRwWEc1Y2RHVmhZMmc2SUdaMWJtTjBhVzl1S0NCallXeHNZbUZqYXl3Z1lYSm5jeUFwSUh0Y2JseDBYSFJ5WlhSMWNtNGdhbEYxWlhKNUxtVmhZMmdvSUhSb2FYTXNJR05oYkd4aVlXTnJMQ0JoY21keklDazdYRzVjZEgwc1hHNWNibHgwYldGd09pQm1kVzVqZEdsdmJpZ2dZMkZzYkdKaFkyc2dLU0I3WEc1Y2RGeDBjbVYwZFhKdUlIUm9hWE11Y0hWemFGTjBZV05yS0NCcVVYVmxjbmt1YldGd0tIUm9hWE1zSUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0JwSUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUdOaGJHeGlZV05yTG1OaGJHd29JR1ZzWlcwc0lHa3NJR1ZzWlcwZ0tUdGNibHgwWEhSOUtTazdYRzVjZEgwc1hHNWNibHgwYzJ4cFkyVTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG5CMWMyaFRkR0ZqYXlnZ2MyeHBZMlV1WVhCd2JIa29JSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5QXBJQ2s3WEc1Y2RIMHNYRzVjYmx4MFptbHljM1E2SUdaMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEhKbGRIVnliaUIwYUdsekxtVnhLQ0F3SUNrN1hHNWNkSDBzWEc1Y2JseDBiR0Z6ZERvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVaWEVvSUMweElDazdYRzVjZEgwc1hHNWNibHgwWlhFNklHWjFibU4wYVc5dUtDQnBJQ2tnZTF4dVhIUmNkSFpoY2lCc1pXNGdQU0IwYUdsekxteGxibWQwYUN4Y2JseDBYSFJjZEdvZ1BTQXJhU0FySUNnZ2FTQThJREFnUHlCc1pXNGdPaUF3SUNrN1hHNWNkRngwY21WMGRYSnVJSFJvYVhNdWNIVnphRk4wWVdOcktDQnFJRDQ5SURBZ0ppWWdhaUE4SUd4bGJpQS9JRnNnZEdocGMxdHFYU0JkSURvZ1cxMGdLVHRjYmx4MGZTeGNibHh1WEhSbGJtUTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG5CeVpYWlBZbXBsWTNRZ2ZId2dkR2hwY3k1amIyNXpkSEoxWTNSdmNpaHVkV3hzS1R0Y2JseDBmU3hjYmx4dVhIUXZMeUJHYjNJZ2FXNTBaWEp1WVd3Z2RYTmxJRzl1YkhrdVhHNWNkQzh2SUVKbGFHRjJaWE1nYkdsclpTQmhiaUJCY25KaGVTZHpJRzFsZEdodlpDd2dibTkwSUd4cGEyVWdZU0JxVVhWbGNua2diV1YwYUc5a0xseHVYSFJ3ZFhOb09pQndkWE5vTEZ4dVhIUnpiM0owT2lCaGNuSXVjMjl5ZEN4Y2JseDBjM0JzYVdObE9pQmhjbkl1YzNCc2FXTmxYRzU5TzF4dVhHNXFVWFZsY25rdVpYaDBaVzVrSUQwZ2FsRjFaWEo1TG1adUxtVjRkR1Z1WkNBOUlHWjFibU4wYVc5dUtDa2dlMXh1WEhSMllYSWdiM0IwYVc5dWN5d2dibUZ0WlN3Z2MzSmpMQ0JqYjNCNUxDQmpiM0I1U1hOQmNuSmhlU3dnWTJ4dmJtVXNYRzVjZEZ4MGRHRnlaMlYwSUQwZ1lYSm5kVzFsYm5Seld6QmRJSHg4SUh0OUxGeHVYSFJjZEdrZ1BTQXhMRnh1WEhSY2RHeGxibWQwYUNBOUlHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnc1hHNWNkRngwWkdWbGNDQTlJR1poYkhObE8xeHVYRzVjZEM4dklFaGhibVJzWlNCaElHUmxaWEFnWTI5d2VTQnphWFIxWVhScGIyNWNibHgwYVdZZ0tDQjBlWEJsYjJZZ2RHRnlaMlYwSUQwOVBTQmNJbUp2YjJ4bFlXNWNJaUFwSUh0Y2JseDBYSFJrWldWd0lEMGdkR0Z5WjJWME8xeHVYRzVjZEZ4MEx5OGdVMnRwY0NCMGFHVWdZbTl2YkdWaGJpQmhibVFnZEdobElIUmhjbWRsZEZ4dVhIUmNkSFJoY21kbGRDQTlJR0Z5WjNWdFpXNTBjMXNnYVNCZElIeDhJSHQ5TzF4dVhIUmNkR2tyS3p0Y2JseDBmVnh1WEc1Y2RDOHZJRWhoYm1Sc1pTQmpZWE5sSUhkb1pXNGdkR0Z5WjJWMElHbHpJR0VnYzNSeWFXNW5JRzl5SUhOdmJXVjBhR2x1WnlBb2NHOXpjMmxpYkdVZ2FXNGdaR1ZsY0NCamIzQjVLVnh1WEhScFppQW9JSFI1Y0dWdlppQjBZWEpuWlhRZ0lUMDlJRndpYjJKcVpXTjBYQ0lnSmlZZ0lXcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtIUmhjbWRsZENrZ0tTQjdYRzVjZEZ4MGRHRnlaMlYwSUQwZ2UzMDdYRzVjZEgxY2JseHVYSFF2THlCRmVIUmxibVFnYWxGMVpYSjVJR2wwYzJWc1ppQnBaaUJ2Ym14NUlHOXVaU0JoY21kMWJXVnVkQ0JwY3lCd1lYTnpaV1JjYmx4MGFXWWdLQ0JwSUQwOVBTQnNaVzVuZEdnZ0tTQjdYRzVjZEZ4MGRHRnlaMlYwSUQwZ2RHaHBjenRjYmx4MFhIUnBMUzA3WEc1Y2RIMWNibHh1WEhSbWIzSWdLQ0E3SUdrZ1BDQnNaVzVuZEdnN0lHa3JLeUFwSUh0Y2JseDBYSFF2THlCUGJteDVJR1JsWVd3Z2QybDBhQ0J1YjI0dGJuVnNiQzkxYm1SbFptbHVaV1FnZG1Gc2RXVnpYRzVjZEZ4MGFXWWdLQ0FvYjNCMGFXOXVjeUE5SUdGeVozVnRaVzUwYzFzZ2FTQmRLU0FoUFNCdWRXeHNJQ2tnZTF4dVhIUmNkRngwTHk4Z1JYaDBaVzVrSUhSb1pTQmlZWE5sSUc5aWFtVmpkRnh1WEhSY2RGeDBabTl5SUNnZ2JtRnRaU0JwYmlCdmNIUnBiMjV6SUNrZ2UxeHVYSFJjZEZ4MFhIUnpjbU1nUFNCMFlYSm5aWFJiSUc1aGJXVWdYVHRjYmx4MFhIUmNkRngwWTI5d2VTQTlJRzl3ZEdsdmJuTmJJRzVoYldVZ1hUdGNibHh1WEhSY2RGeDBYSFF2THlCUWNtVjJaVzUwSUc1bGRtVnlMV1Z1WkdsdVp5QnNiMjl3WEc1Y2RGeDBYSFJjZEdsbUlDZ2dkR0Z5WjJWMElEMDlQU0JqYjNCNUlDa2dlMXh1WEhSY2RGeDBYSFJjZEdOdmJuUnBiblZsTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBMeThnVW1WamRYSnpaU0JwWmlCM1pTZHlaU0J0WlhKbmFXNW5JSEJzWVdsdUlHOWlhbVZqZEhNZ2IzSWdZWEp5WVhselhHNWNkRngwWEhSY2RHbG1JQ2dnWkdWbGNDQW1KaUJqYjNCNUlDWW1JQ2dnYWxGMVpYSjVMbWx6VUd4aGFXNVBZbXBsWTNRb1kyOXdlU2tnZkh3Z0tHTnZjSGxKYzBGeWNtRjVJRDBnYWxGMVpYSjVMbWx6UVhKeVlYa29ZMjl3ZVNrcElDa2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0JqYjNCNVNYTkJjbkpoZVNBcElIdGNibHgwWEhSY2RGeDBYSFJjZEdOdmNIbEpjMEZ5Y21GNUlEMGdabUZzYzJVN1hHNWNkRngwWEhSY2RGeDBYSFJqYkc5dVpTQTlJSE55WXlBbUppQnFVWFZsY25rdWFYTkJjbkpoZVNoemNtTXBJRDhnYzNKaklEb2dXMTA3WEc1Y2JseDBYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWTJ4dmJtVWdQU0J6Y21NZ0ppWWdhbEYxWlhKNUxtbHpVR3hoYVc1UFltcGxZM1FvYzNKaktTQS9JSE55WXlBNklIdDlPMXh1WEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkQzh2SUU1bGRtVnlJRzF2ZG1VZ2IzSnBaMmx1WVd3Z2IySnFaV04wY3l3Z1kyeHZibVVnZEdobGJWeHVYSFJjZEZ4MFhIUmNkSFJoY21kbGRGc2dibUZ0WlNCZElEMGdhbEYxWlhKNUxtVjRkR1Z1WkNnZ1pHVmxjQ3dnWTJ4dmJtVXNJR052Y0hrZ0tUdGNibHh1WEhSY2RGeDBYSFF2THlCRWIyNG5kQ0JpY21sdVp5QnBiaUIxYm1SbFptbHVaV1FnZG1Gc2RXVnpYRzVjZEZ4MFhIUmNkSDBnWld4elpTQnBaaUFvSUdOdmNIa2dJVDA5SUhWdVpHVm1hVzVsWkNBcElIdGNibHgwWEhSY2RGeDBYSFIwWVhKblpYUmJJRzVoYldVZ1hTQTlJR052Y0hrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNkSDFjYmx4dVhIUXZMeUJTWlhSMWNtNGdkR2hsSUcxdlpHbG1hV1ZrSUc5aWFtVmpkRnh1WEhSeVpYUjFjbTRnZEdGeVoyVjBPMXh1ZlR0Y2JseHVhbEYxWlhKNUxtVjRkR1Z1WkNoN1hHNWNkQzh2SUZWdWFYRjFaU0JtYjNJZ1pXRmphQ0JqYjNCNUlHOW1JR3BSZFdWeWVTQnZiaUIwYUdVZ2NHRm5aVnh1WEhSbGVIQmhibVJ2T2lCY0ltcFJkV1Z5ZVZ3aUlDc2dLQ0IyWlhKemFXOXVJQ3NnVFdGMGFDNXlZVzVrYjIwb0tTQXBMbkpsY0d4aFkyVW9JQzljWEVRdlp5d2dYQ0pjSWlBcExGeHVYRzVjZEM4dklFRnpjM1Z0WlNCcVVYVmxjbmtnYVhNZ2NtVmhaSGtnZDJsMGFHOTFkQ0IwYUdVZ2NtVmhaSGtnYlc5a2RXeGxYRzVjZEdselVtVmhaSGs2SUhSeWRXVXNYRzVjYmx4MFpYSnliM0k2SUdaMWJtTjBhVzl1S0NCdGMyY2dLU0I3WEc1Y2RGeDBkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDQnRjMmNnS1R0Y2JseDBmU3hjYmx4dVhIUnViMjl3T2lCbWRXNWpkR2x2YmlncElIdDlMRnh1WEc1Y2RHbHpSblZ1WTNScGIyNDZJR1oxYm1OMGFXOXVLQ0J2WW1vZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUdwUmRXVnllUzUwZVhCbEtHOWlhaWtnUFQwOUlGd2lablZ1WTNScGIyNWNJanRjYmx4MGZTeGNibHh1WEhScGMwRnljbUY1T2lCQmNuSmhlUzVwYzBGeWNtRjVMRnh1WEc1Y2RHbHpWMmx1Wkc5M09pQm1kVzVqZEdsdmJpZ2diMkpxSUNrZ2UxeHVYSFJjZEhKbGRIVnliaUJ2WW1vZ0lUMGdiblZzYkNBbUppQnZZbW9nUFQwOUlHOWlhaTUzYVc1a2IzYzdYRzVjZEgwc1hHNWNibHgwYVhOT2RXMWxjbWxqT2lCbWRXNWpkR2x2YmlnZ2IySnFJQ2tnZTF4dVhIUmNkQzh2SUhCaGNuTmxSbXh2WVhRZ1RtRk9jeUJ1ZFcxbGNtbGpMV05oYzNRZ1ptRnNjMlVnY0c5emFYUnBkbVZ6SUNodWRXeHNmSFJ5ZFdWOFptRnNjMlY4WENKY0lpbGNibHgwWEhRdkx5QXVMaTVpZFhRZ2JXbHphVzUwWlhKd2NtVjBjeUJzWldGa2FXNW5MVzUxYldKbGNpQnpkSEpwYm1kekxDQndZWEowYVdOMWJHRnliSGtnYUdWNElHeHBkR1Z5WVd4eklDaGNJakI0TGk0dVhDSXBYRzVjZEZ4MEx5OGdjM1ZpZEhKaFkzUnBiMjRnWm05eVkyVnpJR2x1Wm1sdWFYUnBaWE1nZEc4Z1RtRk9YRzVjZEZ4MEx5OGdZV1JrYVc1bklERWdZMjl5Y21WamRITWdiRzl6Y3lCdlppQndjbVZqYVhOcGIyNGdabkp2YlNCd1lYSnpaVVpzYjJGMElDZ2pNVFV4TURBcFhHNWNkRngwY21WMGRYSnVJQ0ZxVVhWbGNua3VhWE5CY25KaGVTZ2diMkpxSUNrZ0ppWWdLRzlpYWlBdElIQmhjbk5sUm14dllYUW9JRzlpYWlBcElDc2dNU2tnUGowZ01EdGNibHgwZlN4Y2JseHVYSFJwYzFCc1lXbHVUMkpxWldOME9pQm1kVzVqZEdsdmJpZ2diMkpxSUNrZ2UxeHVYSFJjZEM4dklFNXZkQ0J3YkdGcGJpQnZZbXBsWTNSek9seHVYSFJjZEM4dklDMGdRVzU1SUc5aWFtVmpkQ0J2Y2lCMllXeDFaU0IzYUc5elpTQnBiblJsY201aGJDQmJXME5zWVhOelhWMGdjSEp2Y0dWeWRIa2dhWE1nYm05MElGd2lXMjlpYW1WamRDQlBZbXBsWTNSZFhDSmNibHgwWEhRdkx5QXRJRVJQVFNCdWIyUmxjMXh1WEhSY2RDOHZJQzBnZDJsdVpHOTNYRzVjZEZ4MGFXWWdLQ0JxVVhWbGNua3VkSGx3WlNnZ2IySnFJQ2tnSVQwOUlGd2liMkpxWldOMFhDSWdmSHdnYjJKcUxtNXZaR1ZVZVhCbElIeDhJR3BSZFdWeWVTNXBjMWRwYm1SdmR5Z2diMkpxSUNrZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z1ptRnNjMlU3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBhV1lnS0NCdlltb3VZMjl1YzNSeWRXTjBiM0lnSmlaY2JseDBYSFJjZEZ4MElXaGhjMDkzYmk1allXeHNLQ0J2WW1vdVkyOXVjM1J5ZFdOMGIzSXVjSEp2ZEc5MGVYQmxMQ0JjSW1selVISnZkRzkwZVhCbFQyWmNJaUFwSUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUdaaGJITmxPMXh1WEhSY2RIMWNibHh1WEhSY2RDOHZJRWxtSUhSb1pTQm1kVzVqZEdsdmJpQm9ZWE51SjNRZ2NtVjBkWEp1WldRZ1lXeHlaV0ZrZVN3Z2QyVW5jbVVnWTI5dVptbGtaVzUwSUhSb1lYUmNibHgwWEhRdkx5QjhiMkpxZkNCcGN5QmhJSEJzWVdsdUlHOWlhbVZqZEN3Z1kzSmxZWFJsWkNCaWVTQjdmU0J2Y2lCamIyNXpkSEoxWTNSbFpDQjNhWFJvSUc1bGR5QlBZbXBsWTNSY2JseDBYSFJ5WlhSMWNtNGdkSEoxWlR0Y2JseDBmU3hjYmx4dVhIUnBjMFZ0Y0hSNVQySnFaV04wT2lCbWRXNWpkR2x2YmlnZ2IySnFJQ2tnZTF4dVhIUmNkSFpoY2lCdVlXMWxPMXh1WEhSY2RHWnZjaUFvSUc1aGJXVWdhVzRnYjJKcUlDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHWmhiSE5sTzF4dVhIUmNkSDFjYmx4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MGZTeGNibHh1WEhSMGVYQmxPaUJtZFc1amRHbHZiaWdnYjJKcUlDa2dlMXh1WEhSY2RHbG1JQ2dnYjJKcUlEMDlJRzUxYkd3Z0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2IySnFJQ3NnWENKY0lqdGNibHgwWEhSOVhHNWNkRngwTHk4Z1UzVndjRzl5ZERvZ1FXNWtjbTlwWkR3MExqQXNJR2xQVXp3MklDaG1kVzVqZEdsdmJtbHphQ0JTWldkRmVIQXBYRzVjZEZ4MGNtVjBkWEp1SUhSNWNHVnZaaUJ2WW1vZ1BUMDlJRndpYjJKcVpXTjBYQ0lnZkh3Z2RIbHdaVzltSUc5aWFpQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlEOWNibHgwWEhSY2RHTnNZWE56TW5SNWNHVmJJSFJ2VTNSeWFXNW5MbU5oYkd3b2IySnFLU0JkSUh4OElGd2liMkpxWldOMFhDSWdPbHh1WEhSY2RGeDBkSGx3Wlc5bUlHOWlhanRjYmx4MGZTeGNibHh1WEhRdkx5QkZkbUZzZFdGMFpYTWdZU0J6WTNKcGNIUWdhVzRnWVNCbmJHOWlZV3dnWTI5dWRHVjRkRnh1WEhSbmJHOWlZV3hGZG1Gc09pQm1kVzVqZEdsdmJpZ2dZMjlrWlNBcElIdGNibHgwWEhSMllYSWdjMk55YVhCMExGeHVYSFJjZEZ4MGFXNWthWEpsWTNRZ1BTQmxkbUZzTzF4dVhHNWNkRngwWTI5a1pTQTlJR3BSZFdWeWVTNTBjbWx0S0NCamIyUmxJQ2s3WEc1Y2JseDBYSFJwWmlBb0lHTnZaR1VnS1NCN1hHNWNkRngwWEhRdkx5QkpaaUIwYUdVZ1kyOWtaU0JwYm1Oc2RXUmxjeUJoSUhaaGJHbGtMQ0J3Y205c2IyZDFaU0J3YjNOcGRHbHZibHh1WEhSY2RGeDBMeThnYzNSeWFXTjBJRzF2WkdVZ2NISmhaMjFoTENCbGVHVmpkWFJsSUdOdlpHVWdZbmtnYVc1cVpXTjBhVzVuSUdGY2JseDBYSFJjZEM4dklITmpjbWx3ZENCMFlXY2dhVzUwYnlCMGFHVWdaRzlqZFcxbGJuUXVYRzVjZEZ4MFhIUnBaaUFvSUdOdlpHVXVhVzVrWlhoUFppaGNJblZ6WlNCemRISnBZM1JjSWlrZ1BUMDlJREVnS1NCN1hHNWNkRngwWEhSY2RITmpjbWx3ZENBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblFvWENKelkzSnBjSFJjSWlrN1hHNWNkRngwWEhSY2RITmpjbWx3ZEM1MFpYaDBJRDBnWTI5a1pUdGNibHgwWEhSY2RGeDBaRzlqZFcxbGJuUXVhR1ZoWkM1aGNIQmxibVJEYUdsc1pDZ2djMk55YVhCMElDa3VjR0Z5Wlc1MFRtOWtaUzV5WlcxdmRtVkRhR2xzWkNnZ2MyTnlhWEIwSUNrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwTHk4Z1QzUm9aWEozYVhObExDQmhkbTlwWkNCMGFHVWdSRTlOSUc1dlpHVWdZM0psWVhScGIyNHNJR2x1YzJWeWRHbHZibHh1WEhSY2RGeDBMeThnWVc1a0lISmxiVzkyWVd3Z1lua2dkWE5wYm1jZ1lXNGdhVzVrYVhKbFkzUWdaMnh2WW1Gc0lHVjJZV3hjYmx4MFhIUmNkRngwYVc1a2FYSmxZM1FvSUdOdlpHVWdLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjZEgwc1hHNWNibHgwTHk4Z1EyOXVkbVZ5ZENCa1lYTm9aV1FnZEc4Z1kyRnRaV3hEWVhObE95QjFjMlZrSUdKNUlIUm9aU0JqYzNNZ1lXNWtJR1JoZEdFZ2JXOWtkV3hsYzF4dVhIUXZMeUJUZFhCd2IzSjBPaUJKUlRrdE1URXJYRzVjZEM4dklFMXBZM0p2YzI5bWRDQm1iM0puYjNRZ2RHOGdhSFZ0Y0NCMGFHVnBjaUIyWlc1a2IzSWdjSEpsWm1sNElDZ2pPVFUzTWlsY2JseDBZMkZ0Wld4RFlYTmxPaUJtZFc1amRHbHZiaWdnYzNSeWFXNW5JQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQnpkSEpwYm1jdWNtVndiR0ZqWlNnZ2NtMXpVSEpsWm1sNExDQmNJbTF6TFZ3aUlDa3VjbVZ3YkdGalpTZ2djbVJoYzJoQmJIQm9ZU3dnWm1OaGJXVnNRMkZ6WlNBcE8xeHVYSFI5TEZ4dVhHNWNkRzV2WkdWT1lXMWxPaUJtZFc1amRHbHZiaWdnWld4bGJTd2dibUZ0WlNBcElIdGNibHgwWEhSeVpYUjFjbTRnWld4bGJTNXViMlJsVG1GdFpTQW1KaUJsYkdWdExtNXZaR1ZPWVcxbExuUnZURzkzWlhKRFlYTmxLQ2tnUFQwOUlHNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tUdGNibHgwZlN4Y2JseHVYSFF2THlCaGNtZHpJR2x6SUdadmNpQnBiblJsY201aGJDQjFjMkZuWlNCdmJteDVYRzVjZEdWaFkyZzZJR1oxYm1OMGFXOXVLQ0J2WW1vc0lHTmhiR3hpWVdOckxDQmhjbWR6SUNrZ2UxeHVYSFJjZEhaaGNpQjJZV3gxWlN4Y2JseDBYSFJjZEdrZ1BTQXdMRnh1WEhSY2RGeDBiR1Z1WjNSb0lEMGdiMkpxTG14bGJtZDBhQ3hjYmx4MFhIUmNkR2x6UVhKeVlYa2dQU0JwYzBGeWNtRjViR2xyWlNnZ2IySnFJQ2s3WEc1Y2JseDBYSFJwWmlBb0lHRnlaM01nS1NCN1hHNWNkRngwWEhScFppQW9JR2x6UVhKeVlYa2dLU0I3WEc1Y2RGeDBYSFJjZEdadmNpQW9JRHNnYVNBOElHeGxibWQwYURzZ2FTc3JJQ2tnZTF4dVhIUmNkRngwWEhSY2RIWmhiSFZsSUQwZ1kyRnNiR0poWTJzdVlYQndiSGtvSUc5aWFsc2dhU0JkTENCaGNtZHpJQ2s3WEc1Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSUhaaGJIVmxJRDA5UFNCbVlXeHpaU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR0p5WldGck8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWm05eUlDZ2dhU0JwYmlCdlltb2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnNkV1VnUFNCallXeHNZbUZqYXk1aGNIQnNlU2dnYjJKcVd5QnBJRjBzSUdGeVozTWdLVHRjYmx4dVhIUmNkRngwWEhSY2RHbG1JQ2dnZG1Gc2RXVWdQVDA5SUdaaGJITmxJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBZbkpsWVdzN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFF2THlCQklITndaV05wWVd3c0lHWmhjM1FzSUdOaGMyVWdabTl5SUhSb1pTQnRiM04wSUdOdmJXMXZiaUIxYzJVZ2IyWWdaV0ZqYUZ4dVhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUnBaaUFvSUdselFYSnlZWGtnS1NCN1hHNWNkRngwWEhSY2RHWnZjaUFvSURzZ2FTQThJR3hsYm1kMGFEc2dhU3NySUNrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoYkhWbElEMGdZMkZzYkdKaFkyc3VZMkZzYkNnZ2IySnFXeUJwSUYwc0lHa3NJRzlpYWxzZ2FTQmRJQ2s3WEc1Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSUhaaGJIVmxJRDA5UFNCbVlXeHpaU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR0p5WldGck8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWm05eUlDZ2dhU0JwYmlCdlltb2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnNkV1VnUFNCallXeHNZbUZqYXk1allXeHNLQ0J2WW1wYklHa2dYU3dnYVN3Z2IySnFXeUJwSUYwZ0tUdGNibHh1WEhSY2RGeDBYSFJjZEdsbUlDZ2dkbUZzZFdVZ1BUMDlJR1poYkhObElDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFluSmxZV3M3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYRzVjZEZ4MGNtVjBkWEp1SUc5aWFqdGNibHgwZlN4Y2JseHVYSFF2THlCVGRYQndiM0owT2lCQmJtUnliMmxrUERRdU1WeHVYSFIwY21sdE9pQm1kVzVqZEdsdmJpZ2dkR1Y0ZENBcElIdGNibHgwWEhSeVpYUjFjbTRnZEdWNGRDQTlQU0J1ZFd4c0lEOWNibHgwWEhSY2RGd2lYQ0lnT2x4dVhIUmNkRngwS0NCMFpYaDBJQ3NnWENKY0lpQXBMbkpsY0d4aFkyVW9JSEowY21sdExDQmNJbHdpSUNrN1hHNWNkSDBzWEc1Y2JseDBMeThnY21WemRXeDBjeUJwY3lCbWIzSWdhVzUwWlhKdVlXd2dkWE5oWjJVZ2IyNXNlVnh1WEhSdFlXdGxRWEp5WVhrNklHWjFibU4wYVc5dUtDQmhjbklzSUhKbGMzVnNkSE1nS1NCN1hHNWNkRngwZG1GeUlISmxkQ0E5SUhKbGMzVnNkSE1nZkh3Z1cxMDdYRzVjYmx4MFhIUnBaaUFvSUdGeWNpQWhQU0J1ZFd4c0lDa2dlMXh1WEhSY2RGeDBhV1lnS0NCcGMwRnljbUY1YkdsclpTZ2dUMkpxWldOMEtHRnljaWtnS1NBcElIdGNibHgwWEhSY2RGeDBhbEYxWlhKNUxtMWxjbWRsS0NCeVpYUXNYRzVjZEZ4MFhIUmNkRngwZEhsd1pXOW1JR0Z5Y2lBOVBUMGdYQ0p6ZEhKcGJtZGNJaUEvWEc1Y2RGeDBYSFJjZEZ4MFd5QmhjbklnWFNBNklHRnljbHh1WEhSY2RGeDBYSFFwTzF4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwY0hWemFDNWpZV3hzS0NCeVpYUXNJR0Z5Y2lBcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseHVYSFJjZEhKbGRIVnliaUJ5WlhRN1hHNWNkSDBzWEc1Y2JseDBhVzVCY25KaGVUb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lHRnljaXdnYVNBcElIdGNibHgwWEhSeVpYUjFjbTRnWVhKeUlEMDlJRzUxYkd3Z1B5QXRNU0E2SUdsdVpHVjRUMll1WTJGc2JDZ2dZWEp5TENCbGJHVnRMQ0JwSUNrN1hHNWNkSDBzWEc1Y2JseDBiV1Z5WjJVNklHWjFibU4wYVc5dUtDQm1hWEp6ZEN3Z2MyVmpiMjVrSUNrZ2UxeHVYSFJjZEhaaGNpQnNaVzRnUFNBcmMyVmpiMjVrTG14bGJtZDBhQ3hjYmx4MFhIUmNkR29nUFNBd0xGeHVYSFJjZEZ4MGFTQTlJR1pwY25OMExteGxibWQwYUR0Y2JseHVYSFJjZEdadmNpQW9JRHNnYWlBOElHeGxianNnYWlzcklDa2dlMXh1WEhSY2RGeDBabWx5YzNSYklHa3JLeUJkSUQwZ2MyVmpiMjVrV3lCcUlGMDdYRzVjZEZ4MGZWeHVYRzVjZEZ4MFptbHljM1F1YkdWdVozUm9JRDBnYVR0Y2JseHVYSFJjZEhKbGRIVnliaUJtYVhKemREdGNibHgwZlN4Y2JseHVYSFJuY21Wd09pQm1kVzVqZEdsdmJpZ2daV3hsYlhNc0lHTmhiR3hpWVdOckxDQnBiblpsY25RZ0tTQjdYRzVjZEZ4MGRtRnlJR05oYkd4aVlXTnJTVzUyWlhKelpTeGNibHgwWEhSY2RHMWhkR05vWlhNZ1BTQmJYU3hjYmx4MFhIUmNkR2tnUFNBd0xGeHVYSFJjZEZ4MGJHVnVaM1JvSUQwZ1pXeGxiWE11YkdWdVozUm9MRnh1WEhSY2RGeDBZMkZzYkdKaFkydEZlSEJsWTNRZ1BTQWhhVzUyWlhKME8xeHVYRzVjZEZ4MEx5OGdSMjhnZEdoeWIzVm5hQ0IwYUdVZ1lYSnlZWGtzSUc5dWJIa2djMkYyYVc1bklIUm9aU0JwZEdWdGMxeHVYSFJjZEM4dklIUm9ZWFFnY0dGemN5QjBhR1VnZG1Gc2FXUmhkRzl5SUdaMWJtTjBhVzl1WEc1Y2RGeDBabTl5SUNnZ095QnBJRHdnYkdWdVozUm9PeUJwS3lzZ0tTQjdYRzVjZEZ4MFhIUmpZV3hzWW1GamEwbHVkbVZ5YzJVZ1BTQWhZMkZzYkdKaFkyc29JR1ZzWlcxeld5QnBJRjBzSUdrZ0tUdGNibHgwWEhSY2RHbG1JQ2dnWTJGc2JHSmhZMnRKYm5abGNuTmxJQ0U5UFNCallXeHNZbUZqYTBWNGNHVmpkQ0FwSUh0Y2JseDBYSFJjZEZ4MGJXRjBZMmhsY3k1d2RYTm9LQ0JsYkdWdGMxc2dhU0JkSUNrN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhHNWNkRngwY21WMGRYSnVJRzFoZEdOb1pYTTdYRzVjZEgwc1hHNWNibHgwTHk4Z1lYSm5JR2x6SUdadmNpQnBiblJsY201aGJDQjFjMkZuWlNCdmJteDVYRzVjZEcxaGNEb2dablZ1WTNScGIyNG9JR1ZzWlcxekxDQmpZV3hzWW1GamF5d2dZWEpuSUNrZ2UxeHVYSFJjZEhaaGNpQjJZV3gxWlN4Y2JseDBYSFJjZEdrZ1BTQXdMRnh1WEhSY2RGeDBiR1Z1WjNSb0lEMGdaV3hsYlhNdWJHVnVaM1JvTEZ4dVhIUmNkRngwYVhOQmNuSmhlU0E5SUdselFYSnlZWGxzYVd0bEtDQmxiR1Z0Y3lBcExGeHVYSFJjZEZ4MGNtVjBJRDBnVzEwN1hHNWNibHgwWEhRdkx5QkhieUIwYUhKdmRXZG9JSFJvWlNCaGNuSmhlU3dnZEhKaGJuTnNZWFJwYm1jZ1pXRmphQ0J2WmlCMGFHVWdhWFJsYlhNZ2RHOGdkR2hsYVhJZ2JtVjNJSFpoYkhWbGMxeHVYSFJjZEdsbUlDZ2dhWE5CY25KaGVTQXBJSHRjYmx4MFhIUmNkR1p2Y2lBb0lEc2dhU0E4SUd4bGJtZDBhRHNnYVNzcklDa2dlMXh1WEhSY2RGeDBYSFIyWVd4MVpTQTlJR05oYkd4aVlXTnJLQ0JsYkdWdGMxc2dhU0JkTENCcExDQmhjbWNnS1R0Y2JseHVYSFJjZEZ4MFhIUnBaaUFvSUhaaGJIVmxJQ0U5SUc1MWJHd2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBMbkIxYzJnb0lIWmhiSFZsSUNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHh1WEhSY2RDOHZJRWR2SUhSb2NtOTFaMmdnWlhabGNua2dhMlY1SUc5dUlIUm9aU0J2WW1wbFkzUXNYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEdadmNpQW9JR2tnYVc0Z1pXeGxiWE1nS1NCN1hHNWNkRngwWEhSY2RIWmhiSFZsSUQwZ1kyRnNiR0poWTJzb0lHVnNaVzF6V3lCcElGMHNJR2tzSUdGeVp5QXBPMXh1WEc1Y2RGeDBYSFJjZEdsbUlDZ2dkbUZzZFdVZ0lUMGdiblZzYkNBcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhRdWNIVnphQ2dnZG1Gc2RXVWdLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUVac1lYUjBaVzRnWVc1NUlHNWxjM1JsWkNCaGNuSmhlWE5jYmx4MFhIUnlaWFIxY200Z1kyOXVZMkYwTG1Gd2NHeDVLQ0JiWFN3Z2NtVjBJQ2s3WEc1Y2RIMHNYRzVjYmx4MEx5OGdRU0JuYkc5aVlXd2dSMVZKUkNCamIzVnVkR1Z5SUdadmNpQnZZbXBsWTNSelhHNWNkR2QxYVdRNklERXNYRzVjYmx4MEx5OGdRbWx1WkNCaElHWjFibU4wYVc5dUlIUnZJR0VnWTI5dWRHVjRkQ3dnYjNCMGFXOXVZV3hzZVNCd1lYSjBhV0ZzYkhrZ1lYQndiSGxwYm1jZ1lXNTVYRzVjZEM4dklHRnlaM1Z0Wlc1MGN5NWNibHgwY0hKdmVIazZJR1oxYm1OMGFXOXVLQ0JtYml3Z1kyOXVkR1Y0ZENBcElIdGNibHgwWEhSMllYSWdkRzF3TENCaGNtZHpMQ0J3Y205NGVUdGNibHh1WEhSY2RHbG1JQ2dnZEhsd1pXOW1JR052Ym5SbGVIUWdQVDA5SUZ3aWMzUnlhVzVuWENJZ0tTQjdYRzVjZEZ4MFhIUjBiWEFnUFNCbWJsc2dZMjl1ZEdWNGRDQmRPMXh1WEhSY2RGeDBZMjl1ZEdWNGRDQTlJR1p1TzF4dVhIUmNkRngwWm00Z1BTQjBiWEE3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeThnVVhWcFkyc2dZMmhsWTJzZ2RHOGdaR1YwWlhKdGFXNWxJR2xtSUhSaGNtZGxkQ0JwY3lCallXeHNZV0pzWlN3Z2FXNGdkR2hsSUhOd1pXTmNibHgwWEhRdkx5QjBhR2x6SUhSb2NtOTNjeUJoSUZSNWNHVkZjbkp2Y2l3Z1luVjBJSGRsSUhkcGJHd2dhblZ6ZENCeVpYUjFjbTRnZFc1a1pXWnBibVZrTGx4dVhIUmNkR2xtSUNnZ0lXcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQm1iaUFwSUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhWdVpHVm1hVzVsWkR0Y2JseDBYSFI5WEc1Y2JseDBYSFF2THlCVGFXMTFiR0YwWldRZ1ltbHVaRnh1WEhSY2RHRnlaM01nUFNCemJHbGpaUzVqWVd4c0tDQmhjbWQxYldWdWRITXNJRElnS1R0Y2JseDBYSFJ3Y205NGVTQTlJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR1p1TG1Gd2NHeDVLQ0JqYjI1MFpYaDBJSHg4SUhSb2FYTXNJR0Z5WjNNdVkyOXVZMkYwS0NCemJHbGpaUzVqWVd4c0tDQmhjbWQxYldWdWRITWdLU0FwSUNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4dklGTmxkQ0IwYUdVZ1ozVnBaQ0J2WmlCMWJtbHhkV1VnYUdGdVpHeGxjaUIwYnlCMGFHVWdjMkZ0WlNCdlppQnZjbWxuYVc1aGJDQm9ZVzVrYkdWeUxDQnpieUJwZENCallXNGdZbVVnY21WdGIzWmxaRnh1WEhSY2RIQnliM2g1TG1kMWFXUWdQU0JtYmk1bmRXbGtJRDBnWm00dVozVnBaQ0I4ZkNCcVVYVmxjbmt1WjNWcFpDc3JPMXh1WEc1Y2RGeDBjbVYwZFhKdUlIQnliM2g1TzF4dVhIUjlMRnh1WEc1Y2RHNXZkem9nUkdGMFpTNXViM2NzWEc1Y2JseDBMeThnYWxGMVpYSjVMbk4xY0hCdmNuUWdhWE1nYm05MElIVnpaV1FnYVc0Z1EyOXlaU0JpZFhRZ2IzUm9aWElnY0hKdmFtVmpkSE1nWVhSMFlXTm9JSFJvWldseVhHNWNkQzh2SUhCeWIzQmxjblJwWlhNZ2RHOGdhWFFnYzI4Z2FYUWdibVZsWkhNZ2RHOGdaWGhwYzNRdVhHNWNkSE4xY0hCdmNuUTZJSE4xY0hCdmNuUmNibjBwTzF4dVhHNHZMeUJRYjNCMWJHRjBaU0IwYUdVZ1kyeGhjM015ZEhsd1pTQnRZWEJjYm1wUmRXVnllUzVsWVdOb0tGd2lRbTl2YkdWaGJpQk9kVzFpWlhJZ1UzUnlhVzVuSUVaMWJtTjBhVzl1SUVGeWNtRjVJRVJoZEdVZ1VtVm5SWGh3SUU5aWFtVmpkQ0JGY25KdmNsd2lMbk53YkdsMEtGd2lJRndpS1N3Z1puVnVZM1JwYjI0b2FTd2dibUZ0WlNrZ2UxeHVYSFJqYkdGemN6SjBlWEJsV3lCY0lsdHZZbXBsWTNRZ1hDSWdLeUJ1WVcxbElDc2dYQ0pkWENJZ1hTQTlJRzVoYldVdWRHOU1iM2RsY2tOaGMyVW9LVHRjYm4wcE8xeHVYRzVtZFc1amRHbHZiaUJwYzBGeWNtRjViR2xyWlNnZ2IySnFJQ2tnZTF4dVhIUjJZWElnYkdWdVozUm9JRDBnYjJKcUxteGxibWQwYUN4Y2JseDBYSFIwZVhCbElEMGdhbEYxWlhKNUxuUjVjR1VvSUc5aWFpQXBPMXh1WEc1Y2RHbG1JQ2dnZEhsd1pTQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlIeDhJR3BSZFdWeWVTNXBjMWRwYm1SdmR5Z2diMkpxSUNrZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUdaaGJITmxPMXh1WEhSOVhHNWNibHgwYVdZZ0tDQnZZbW91Ym05a1pWUjVjR1VnUFQwOUlERWdKaVlnYkdWdVozUm9JQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQjBjblZsTzF4dVhIUjlYRzVjYmx4MGNtVjBkWEp1SUhSNWNHVWdQVDA5SUZ3aVlYSnlZWGxjSWlCOGZDQnNaVzVuZEdnZ1BUMDlJREFnZkh4Y2JseDBYSFIwZVhCbGIyWWdiR1Z1WjNSb0lEMDlQU0JjSW01MWJXSmxjbHdpSUNZbUlHeGxibWQwYUNBK0lEQWdKaVlnS0NCc1pXNW5kR2dnTFNBeElDa2dhVzRnYjJKcU8xeHVmVnh1ZG1GeUlGTnBlbnBzWlNBOVhHNHZLaUZjYmlBcUlGTnBlbnBzWlNCRFUxTWdVMlZzWldOMGIzSWdSVzVuYVc1bElIWXlMakl1TUMxd2NtVmNiaUFxSUdoMGRIQTZMeTl6YVhwNmJHVnFjeTVqYjIwdlhHNGdLbHh1SUNvZ1EyOXdlWEpwWjJoMElESXdNRGdzSURJd01UUWdhbEYxWlhKNUlFWnZkVzVrWVhScGIyNHNJRWx1WXk0Z1lXNWtJRzkwYUdWeUlHTnZiblJ5YVdKMWRHOXljMXh1SUNvZ1VtVnNaV0Z6WldRZ2RXNWtaWElnZEdobElFMUpWQ0JzYVdObGJuTmxYRzRnS2lCb2RIUndPaTh2YW5GMVpYSjVMbTl5Wnk5c2FXTmxibk5sWEc0Z0tseHVJQ29nUkdGMFpUb2dNakF4TkMweE1pMHhObHh1SUNvdlhHNG9ablZ1WTNScGIyNG9JSGRwYm1SdmR5QXBJSHRjYmx4dWRtRnlJR2tzWEc1Y2RITjFjSEJ2Y25Rc1hHNWNkRVY0Y0hJc1hHNWNkR2RsZEZSbGVIUXNYRzVjZEdseldFMU1MRnh1WEhSMGIydGxibWw2WlN4Y2JseDBZMjl0Y0dsc1pTeGNibHgwYzJWc1pXTjBMRnh1WEhSdmRYUmxjbTF2YzNSRGIyNTBaWGgwTEZ4dVhIUnpiM0owU1c1d2RYUXNYRzVjZEdoaGMwUjFjR3hwWTJGMFpTeGNibHh1WEhRdkx5Qk1iMk5oYkNCa2IyTjFiV1Z1ZENCMllYSnpYRzVjZEhObGRFUnZZM1Z0Wlc1MExGeHVYSFJrYjJOMWJXVnVkQ3hjYmx4MFpHOWpSV3hsYlN4Y2JseDBaRzlqZFcxbGJuUkpjMGhVVFV3c1hHNWNkSEppZFdkbmVWRlRRU3hjYmx4MGNtSjFaMmQ1VFdGMFkyaGxjeXhjYmx4MGJXRjBZMmhsY3l4Y2JseDBZMjl1ZEdGcGJuTXNYRzVjYmx4MEx5OGdTVzV6ZEdGdVkyVXRjM0JsWTJsbWFXTWdaR0YwWVZ4dVhIUmxlSEJoYm1SdklEMGdYQ0p6YVhwNmJHVmNJaUFySURFZ0tpQnVaWGNnUkdGMFpTZ3BMRnh1WEhSd2NtVm1aWEp5WldSRWIyTWdQU0IzYVc1a2IzY3VaRzlqZFcxbGJuUXNYRzVjZEdScGNuSjFibk1nUFNBd0xGeHVYSFJrYjI1bElEMGdNQ3hjYmx4MFkyeGhjM05EWVdOb1pTQTlJR055WldGMFpVTmhZMmhsS0Nrc1hHNWNkSFJ2YTJWdVEyRmphR1VnUFNCamNtVmhkR1ZEWVdOb1pTZ3BMRnh1WEhSamIyMXdhV3hsY2tOaFkyaGxJRDBnWTNKbFlYUmxRMkZqYUdVb0tTeGNibHgwYzI5eWRFOXlaR1Z5SUQwZ1puVnVZM1JwYjI0b0lHRXNJR0lnS1NCN1hHNWNkRngwYVdZZ0tDQmhJRDA5UFNCaUlDa2dlMXh1WEhSY2RGeDBhR0Z6UkhWd2JHbGpZWFJsSUQwZ2RISjFaVHRjYmx4MFhIUjlYRzVjZEZ4MGNtVjBkWEp1SURBN1hHNWNkSDBzWEc1Y2JseDBMeThnUjJWdVpYSmhiQzF3ZFhKd2IzTmxJR052Ym5OMFlXNTBjMXh1WEhSTlFWaGZUa1ZIUVZSSlZrVWdQU0F4SUR3OElETXhMRnh1WEc1Y2RDOHZJRWx1YzNSaGJtTmxJRzFsZEdodlpITmNibHgwYUdGelQzZHVJRDBnS0h0OUtTNW9ZWE5QZDI1UWNtOXdaWEowZVN4Y2JseDBZWEp5SUQwZ1cxMHNYRzVjZEhCdmNDQTlJR0Z5Y2k1d2IzQXNYRzVjZEhCMWMyaGZibUYwYVhabElEMGdZWEp5TG5CMWMyZ3NYRzVjZEhCMWMyZ2dQU0JoY25JdWNIVnphQ3hjYmx4MGMyeHBZMlVnUFNCaGNuSXVjMnhwWTJVc1hHNWNkQzh2SUZWelpTQmhJSE4wY21sd2NHVmtMV1J2ZDI0Z2FXNWtaWGhQWmlCaGN5QnBkQ2R6SUdaaGMzUmxjaUIwYUdGdUlHNWhkR2wyWlZ4dVhIUXZMeUJvZEhSd09pOHZhbk53WlhKbUxtTnZiUzkwYUc5eUxXbHVaR1Y0YjJZdGRuTXRabTl5THpWY2JseDBhVzVrWlhoUFppQTlJR1oxYm1OMGFXOXVLQ0JzYVhOMExDQmxiR1Z0SUNrZ2UxeHVYSFJjZEhaaGNpQnBJRDBnTUN4Y2JseDBYSFJjZEd4bGJpQTlJR3hwYzNRdWJHVnVaM1JvTzF4dVhIUmNkR1p2Y2lBb0lEc2dhU0E4SUd4bGJqc2dhU3NySUNrZ2UxeHVYSFJjZEZ4MGFXWWdLQ0JzYVhOMFcybGRJRDA5UFNCbGJHVnRJQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYVR0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RGeDBjbVYwZFhKdUlDMHhPMXh1WEhSOUxGeHVYRzVjZEdKdmIyeGxZVzV6SUQwZ1hDSmphR1ZqYTJWa2ZITmxiR1ZqZEdWa2ZHRnplVzVqZkdGMWRHOW1iMk4xYzN4aGRYUnZjR3hoZVh4amIyNTBjbTlzYzN4a1pXWmxjbnhrYVhOaFlteGxaSHhvYVdSa1pXNThhWE50WVhCOGJHOXZjSHh0ZFd4MGFYQnNaWHh2Y0dWdWZISmxZV1J2Ym14NWZISmxjWFZwY21Wa2ZITmpiM0JsWkZ3aUxGeHVYRzVjZEM4dklGSmxaM1ZzWVhJZ1pYaHdjbVZ6YzJsdmJuTmNibHh1WEhRdkx5QlhhR2wwWlhOd1lXTmxJR05vWVhKaFkzUmxjbk1nYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2VkZJdlkzTnpNeTF6Wld4bFkzUnZjbk12STNkb2FYUmxjM0JoWTJWY2JseDBkMmhwZEdWemNHRmpaU0E5SUZ3aVcxeGNYRng0TWpCY1hGeGNkRnhjWEZ4eVhGeGNYRzVjWEZ4Y1psMWNJaXhjYmx4MEx5OGdhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZWRkl2WTNOek15MXplVzUwWVhndkkyTm9ZWEpoWTNSbGNuTmNibHgwWTJoaGNtRmpkR1Z5Ulc1amIyUnBibWNnUFNCY0lpZy9PbHhjWEZ4Y1hGeGNMbnhiWEZ4Y1hIY3RYWHhiWGx4Y1hGeDRNREF0WEZ4Y1hIaGhNRjBwSzF3aUxGeHVYRzVjZEM4dklFeHZiM05sYkhrZ2JXOWtaV3hsWkNCdmJpQkRVMU1nYVdSbGJuUnBabWxsY2lCamFHRnlZV04wWlhKelhHNWNkQzh2SUVGdUlIVnVjWFZ2ZEdWa0lIWmhiSFZsSUhOb2IzVnNaQ0JpWlNCaElFTlRVeUJwWkdWdWRHbG1hV1Z5SUdoMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0wyTnpjek10YzJWc1pXTjBiM0p6THlOaGRIUnlhV0oxZEdVdGMyVnNaV04wYjNKelhHNWNkQzh2SUZCeWIzQmxjaUJ6ZVc1MFlYZzZJR2gwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MMVJTTDBOVFV6SXhMM041Ym1SaGRHRXVhSFJ0YkNOMllXeDFaUzFrWldZdGFXUmxiblJwWm1sbGNseHVYSFJwWkdWdWRHbG1hV1Z5SUQwZ1kyaGhjbUZqZEdWeVJXNWpiMlJwYm1jdWNtVndiR0ZqWlNnZ1hDSjNYQ0lzSUZ3aWR5TmNJaUFwTEZ4dVhHNWNkQzh2SUVGMGRISnBZblYwWlNCelpXeGxZM1J2Y25NNklHaDBkSEE2THk5M2QzY3Vkek11YjNKbkwxUlNMM05sYkdWamRHOXljeThqWVhSMGNtbGlkWFJsTFhObGJHVmpkRzl5YzF4dVhIUmhkSFJ5YVdKMWRHVnpJRDBnWENKY1hGeGNXMXdpSUNzZ2QyaHBkR1Z6Y0dGalpTQXJJRndpS2loY0lpQXJJR05vWVhKaFkzUmxja1Z1WTI5a2FXNW5JQ3NnWENJcEtEODZYQ0lnS3lCM2FHbDBaWE53WVdObElDdGNibHgwWEhRdkx5QlBjR1Z5WVhSdmNpQW9ZMkZ3ZEhWeVpTQXlLVnh1WEhSY2RGd2lLaWhiS2w0a2ZDRitYVDg5S1Z3aUlDc2dkMmhwZEdWemNHRmpaU0FyWEc1Y2RGeDBMeThnWENKQmRIUnlhV0oxZEdVZ2RtRnNkV1Z6SUcxMWMzUWdZbVVnUTFOVElHbGtaVzUwYVdacFpYSnpJRnRqWVhCMGRYSmxJRFZkSUc5eUlITjBjbWx1WjNNZ1cyTmhjSFIxY21VZ015QnZjaUJqWVhCMGRYSmxJRFJkWENKY2JseDBYSFJjSWlvb1B6b25LQ2cvT2x4Y1hGeGNYRnhjTG54YlhseGNYRnhjWEZ4Y0oxMHBLaWtuZkZ4Y1hDSW9LRDg2WEZ4Y1hGeGNYRnd1ZkZ0ZVhGeGNYRnhjWEZ4Y1hGd2lYU2txS1Z4Y1hDSjhLRndpSUNzZ2FXUmxiblJwWm1sbGNpQXJJRndpS1NsOEtWd2lJQ3NnZDJocGRHVnpjR0ZqWlNBclhHNWNkRngwWENJcVhGeGNYRjFjSWl4Y2JseHVYSFJ3YzJWMVpHOXpJRDBnWENJNktGd2lJQ3NnWTJoaGNtRmpkR1Z5Ulc1amIyUnBibWNnS3lCY0lpa29QenBjWEZ4Y0tDaGNJaUFyWEc1Y2RGeDBMeThnVkc4Z2NtVmtkV05sSUhSb1pTQnVkVzFpWlhJZ2IyWWdjMlZzWldOMGIzSnpJRzVsWldScGJtY2dkRzlyWlc1cGVtVWdhVzRnZEdobElIQnlaVVpwYkhSbGNpd2djSEpsWm1WeUlHRnlaM1Z0Wlc1MGN6cGNibHgwWEhRdkx5QXhMaUJ4ZFc5MFpXUWdLR05oY0hSMWNtVWdNenNnWTJGd2RIVnlaU0EwSUc5eUlHTmhjSFIxY21VZ05TbGNibHgwWEhSY0lpZ25LQ2cvT2x4Y1hGeGNYRnhjTG54YlhseGNYRnhjWEZ4Y0oxMHBLaWtuZkZ4Y1hDSW9LRDg2WEZ4Y1hGeGNYRnd1ZkZ0ZVhGeGNYRnhjWEZ4Y1hGd2lYU2txS1Z4Y1hDSXBmRndpSUN0Y2JseDBYSFF2THlBeUxpQnphVzF3YkdVZ0tHTmhjSFIxY21VZ05pbGNibHgwWEhSY0lpZ29QenBjWEZ4Y1hGeGNYQzU4VzE1Y1hGeGNYRnhjWENncFcxeGNYRnhkWFh4Y0lpQXJJR0YwZEhKcFluVjBaWE1nS3lCY0lpa3FLWHhjSWlBclhHNWNkRngwTHk4Z015NGdZVzU1ZEdocGJtY2daV3h6WlNBb1kyRndkSFZ5WlNBeUtWeHVYSFJjZEZ3aUxpcGNJaUFyWEc1Y2RGeDBYQ0lwWEZ4Y1hDbDhLVndpTEZ4dVhHNWNkQzh2SUV4bFlXUnBibWNnWVc1a0lHNXZiaTFsYzJOaGNHVmtJSFJ5WVdsc2FXNW5JSGRvYVhSbGMzQmhZMlVzSUdOaGNIUjFjbWx1WnlCemIyMWxJRzV2YmkxM2FHbDBaWE53WVdObElHTm9ZWEpoWTNSbGNuTWdjSEpsWTJWa2FXNW5JSFJvWlNCc1lYUjBaWEpjYmx4MGNuZG9hWFJsYzNCaFkyVWdQU0J1WlhjZ1VtVm5SWGh3S0NCM2FHbDBaWE53WVdObElDc2dYQ0lyWENJc0lGd2laMXdpSUNrc1hHNWNkSEowY21sdElEMGdibVYzSUZKbFowVjRjQ2dnWENKZVhDSWdLeUIzYUdsMFpYTndZV05sSUNzZ1hDSXJmQ2dvUHpwZWZGdGVYRnhjWEZ4Y1hGeGRLU2cvT2x4Y1hGeGNYRnhjTGlrcUtWd2lJQ3NnZDJocGRHVnpjR0ZqWlNBcklGd2lLeVJjSWl3Z1hDSm5YQ0lnS1N4Y2JseHVYSFJ5WTI5dGJXRWdQU0J1WlhjZ1VtVm5SWGh3S0NCY0lsNWNJaUFySUhkb2FYUmxjM0JoWTJVZ0t5QmNJaW9zWENJZ0t5QjNhR2wwWlhOd1lXTmxJQ3NnWENJcVhDSWdLU3hjYmx4MGNtTnZiV0pwYm1GMGIzSnpJRDBnYm1WM0lGSmxaMFY0Y0NnZ1hDSmVYQ0lnS3lCM2FHbDBaWE53WVdObElDc2dYQ0lxS0ZzK0szNWRmRndpSUNzZ2QyaHBkR1Z6Y0dGalpTQXJJRndpS1Z3aUlDc2dkMmhwZEdWemNHRmpaU0FySUZ3aUtsd2lJQ2tzWEc1Y2JseDBjbUYwZEhKcFluVjBaVkYxYjNSbGN5QTlJRzVsZHlCU1pXZEZlSEFvSUZ3aVBWd2lJQ3NnZDJocGRHVnpjR0ZqWlNBcklGd2lLaWhiWGx4Y1hGeGRKMXhjWENKZEtqOHBYQ0lnS3lCM2FHbDBaWE53WVdObElDc2dYQ0lxWEZ4Y1hGMWNJaXdnWENKblhDSWdLU3hjYmx4dVhIUnljSE5sZFdSdklEMGdibVYzSUZKbFowVjRjQ2dnY0hObGRXUnZjeUFwTEZ4dVhIUnlhV1JsYm5ScFptbGxjaUE5SUc1bGR5QlNaV2RGZUhBb0lGd2lYbHdpSUNzZ2FXUmxiblJwWm1sbGNpQXJJRndpSkZ3aUlDa3NYRzVjYmx4MGJXRjBZMmhGZUhCeUlEMGdlMXh1WEhSY2RGd2lTVVJjSWpvZ2JtVjNJRkpsWjBWNGNDZ2dYQ0plSXloY0lpQXJJR05vWVhKaFkzUmxja1Z1WTI5a2FXNW5JQ3NnWENJcFhDSWdLU3hjYmx4MFhIUmNJa05NUVZOVFhDSTZJRzVsZHlCU1pXZEZlSEFvSUZ3aVhseGNYRnd1S0Z3aUlDc2dZMmhoY21GamRHVnlSVzVqYjJScGJtY2dLeUJjSWlsY0lpQXBMRnh1WEhSY2RGd2lWRUZIWENJNklHNWxkeUJTWldkRmVIQW9JRndpWGloY0lpQXJJR05vWVhKaFkzUmxja1Z1WTI5a2FXNW5MbkpsY0d4aFkyVW9JRndpZDF3aUxDQmNJbmNxWENJZ0tTQXJJRndpS1Z3aUlDa3NYRzVjZEZ4MFhDSkJWRlJTWENJNklHNWxkeUJTWldkRmVIQW9JRndpWGx3aUlDc2dZWFIwY21saWRYUmxjeUFwTEZ4dVhIUmNkRndpVUZORlZVUlBYQ0k2SUc1bGR5QlNaV2RGZUhBb0lGd2lYbHdpSUNzZ2NITmxkV1J2Y3lBcExGeHVYSFJjZEZ3aVEwaEpURVJjSWpvZ2JtVjNJRkpsWjBWNGNDZ2dYQ0plT2lodmJteDVmR1pwY25OMGZHeGhjM1I4Ym5Sb2ZHNTBhQzFzWVhOMEtTMG9ZMmhwYkdSOGIyWXRkSGx3WlNrb1B6cGNYRnhjS0Z3aUlDc2dkMmhwZEdWemNHRmpaU0FyWEc1Y2RGeDBYSFJjSWlvb1pYWmxibnh2WkdSOEtDaGJLeTFkZkNrb1hGeGNYR1FxS1c1OEtWd2lJQ3NnZDJocGRHVnpjR0ZqWlNBcklGd2lLaWcvT2loYkt5MWRmQ2xjSWlBcklIZG9hWFJsYzNCaFkyVWdLMXh1WEhSY2RGeDBYQ0lxS0Z4Y1hGeGtLeWw4S1NsY0lpQXJJSGRvYVhSbGMzQmhZMlVnS3lCY0lpcGNYRnhjS1h3cFhDSXNJRndpYVZ3aUlDa3NYRzVjZEZ4MFhDSmliMjlzWENJNklHNWxkeUJTWldkRmVIQW9JRndpWGlnL09sd2lJQ3NnWW05dmJHVmhibk1nS3lCY0lpa2tYQ0lzSUZ3aWFWd2lJQ2tzWEc1Y2RGeDBMeThnUm05eUlIVnpaU0JwYmlCc2FXSnlZWEpwWlhNZ2FXMXdiR1Z0Wlc1MGFXNW5JQzVwY3lncFhHNWNkRngwTHk4Z1YyVWdkWE5sSUhSb2FYTWdabTl5SUZCUFV5QnRZWFJqYUdsdVp5QnBiaUJnYzJWc1pXTjBZRnh1WEhSY2RGd2libVZsWkhORGIyNTBaWGgwWENJNklHNWxkeUJTWldkRmVIQW9JRndpWGx3aUlDc2dkMmhwZEdWemNHRmpaU0FySUZ3aUtscytLMzVkZkRvb1pYWmxibnh2WkdSOFpYRjhaM1I4YkhSOGJuUm9mR1pwY25OMGZHeGhjM1FwS0Q4NlhGeGNYQ2hjSWlBclhHNWNkRngwWEhSM2FHbDBaWE53WVdObElDc2dYQ0lxS0NnL09pMWNYRnhjWkNrL1hGeGNYR1FxS1Z3aUlDc2dkMmhwZEdWemNHRmpaU0FySUZ3aUtseGNYRndwZkNrb1B6MWJYaTFkZkNRcFhDSXNJRndpYVZ3aUlDbGNibHgwZlN4Y2JseHVYSFJ5YVc1d2RYUnpJRDBnTDE0b1B6cHBibkIxZEh4elpXeGxZM1I4ZEdWNGRHRnlaV0Y4WW5WMGRHOXVLU1F2YVN4Y2JseDBjbWhsWVdSbGNpQTlJQzllYUZ4Y1pDUXZhU3hjYmx4dVhIUnlibUYwYVhabElEMGdMMTViWG50ZEsxeGNlMXhjY3lwY1hGdHVZWFJwZG1VZ1hGeDNMeXhjYmx4dVhIUXZMeUJGWVhOcGJIa3RjR0Z5YzJWaFlteGxMM0psZEhKcFpYWmhZbXhsSUVsRUlHOXlJRlJCUnlCdmNpQkRURUZUVXlCelpXeGxZM1J2Y25OY2JseDBjbkYxYVdOclJYaHdjaUE5SUM5ZUtEODZJeWhiWEZ4M0xWMHJLWHdvWEZ4M0t5bDhYRnd1S0Z0Y1hIY3RYU3NwS1NRdkxGeHVYRzVjZEhKemFXSnNhVzVuSUQwZ0wxc3JmbDB2TEZ4dVhIUnlaWE5qWVhCbElEMGdMeWQ4WEZ4Y1hDOW5MRnh1WEc1Y2RDOHZJRU5UVXlCbGMyTmhjR1Z6SUdoMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0wwTlRVekl4TDNONWJtUmhkR0V1YUhSdGJDTmxjMk5oY0dWa0xXTm9ZWEpoWTNSbGNuTmNibHgwY25WdVpYTmpZWEJsSUQwZ2JtVjNJRkpsWjBWNGNDZ2dYQ0pjWEZ4Y1hGeGNYQ2hiWEZ4Y1hHUmhMV1pkZXpFc05uMWNJaUFySUhkb2FYUmxjM0JoWTJVZ0t5QmNJajk4S0Z3aUlDc2dkMmhwZEdWemNHRmpaU0FySUZ3aUtYd3VLVndpTENCY0ltbG5YQ0lnS1N4Y2JseDBablZ1WlhOallYQmxJRDBnWm5WdVkzUnBiMjRvSUY4c0lHVnpZMkZ3WldRc0lHVnpZMkZ3WldSWGFHbDBaWE53WVdObElDa2dlMXh1WEhSY2RIWmhjaUJvYVdkb0lEMGdYQ0l3ZUZ3aUlDc2daWE5qWVhCbFpDQXRJREI0TVRBd01EQTdYRzVjZEZ4MEx5OGdUbUZPSUcxbFlXNXpJRzV2YmkxamIyUmxjRzlwYm5SY2JseDBYSFF2THlCVGRYQndiM0owT2lCR2FYSmxabTk0UERJMFhHNWNkRngwTHk4Z1YyOXlhMkZ5YjNWdVpDQmxjbkp2Ym1WdmRYTWdiblZ0WlhKcFl5QnBiblJsY25CeVpYUmhkR2x2YmlCdlppQXJYQ0l3ZUZ3aVhHNWNkRngwY21WMGRYSnVJR2hwWjJnZ0lUMDlJR2hwWjJnZ2ZId2daWE5qWVhCbFpGZG9hWFJsYzNCaFkyVWdQMXh1WEhSY2RGeDBaWE5qWVhCbFpDQTZYRzVjZEZ4MFhIUm9hV2RvSUR3Z01DQS9YRzVjZEZ4MFhIUmNkQzh2SUVKTlVDQmpiMlJsY0c5cGJuUmNibHgwWEhSY2RGeDBVM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2dnYUdsbmFDQXJJREI0TVRBd01EQWdLU0E2WEc1Y2RGeDBYSFJjZEM4dklGTjFjSEJzWlcxbGJuUmhiQ0JRYkdGdVpTQmpiMlJsY0c5cGJuUWdLSE4xY25KdloyRjBaU0J3WVdseUtWeHVYSFJjZEZ4MFhIUlRkSEpwYm1jdVpuSnZiVU5vWVhKRGIyUmxLQ0JvYVdkb0lENCtJREV3SUh3Z01IaEVPREF3TENCb2FXZG9JQ1lnTUhnelJrWWdmQ0F3ZUVSRE1EQWdLVHRjYmx4MGZTeGNibHh1WEhRdkx5QlZjMlZrSUdadmNpQnBabkpoYldWelhHNWNkQzh2SUZObFpTQnpaWFJFYjJOMWJXVnVkQ2dwWEc1Y2RDOHZJRkpsYlc5MmFXNW5JSFJvWlNCbWRXNWpkR2x2YmlCM2NtRndjR1Z5SUdOaGRYTmxjeUJoSUZ3aVVHVnliV2x6YzJsdmJpQkVaVzVwWldSY0lseHVYSFF2THlCbGNuSnZjaUJwYmlCSlJWeHVYSFIxYm14dllXUklZVzVrYkdWeUlEMGdablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBjMlYwUkc5amRXMWxiblFvS1R0Y2JseDBmVHRjYmx4dUx5OGdUM0IwYVcxcGVtVWdabTl5SUhCMWMyZ3VZWEJ3Ykhrb0lGOHNJRTV2WkdWTWFYTjBJQ2xjYm5SeWVTQjdYRzVjZEhCMWMyZ3VZWEJ3Ykhrb1hHNWNkRngwS0dGeWNpQTlJSE5zYVdObExtTmhiR3dvSUhCeVpXWmxjbkpsWkVSdll5NWphR2xzWkU1dlpHVnpJQ2twTEZ4dVhIUmNkSEJ5WldabGNuSmxaRVJ2WXk1amFHbHNaRTV2WkdWelhHNWNkQ2s3WEc1Y2RDOHZJRk4xY0hCdmNuUTZJRUZ1WkhKdmFXUThOQzR3WEc1Y2RDOHZJRVJsZEdWamRDQnphV3hsYm5Sc2VTQm1ZV2xzYVc1bklIQjFjMmd1WVhCd2JIbGNibHgwWVhKeVd5QndjbVZtWlhKeVpXUkViMk11WTJocGJHUk9iMlJsY3k1c1pXNW5kR2dnWFM1dWIyUmxWSGx3WlR0Y2JuMGdZMkYwWTJnZ0tDQmxJQ2tnZTF4dVhIUndkWE5vSUQwZ2V5QmhjSEJzZVRvZ1lYSnlMbXhsYm1kMGFDQS9YRzVjYmx4MFhIUXZMeUJNWlhabGNtRm5aU0J6YkdsalpTQnBaaUJ3YjNOemFXSnNaVnh1WEhSY2RHWjFibU4wYVc5dUtDQjBZWEpuWlhRc0lHVnNjeUFwSUh0Y2JseDBYSFJjZEhCMWMyaGZibUYwYVhabExtRndjR3g1S0NCMFlYSm5aWFFzSUhOc2FXTmxMbU5oYkd3b1pXeHpLU0FwTzF4dVhIUmNkSDBnT2x4dVhHNWNkRngwTHk4Z1UzVndjRzl5ZERvZ1NVVThPVnh1WEhSY2RDOHZJRTkwYUdWeWQybHpaU0JoY0hCbGJtUWdaR2x5WldOMGJIbGNibHgwWEhSbWRXNWpkR2x2YmlnZ2RHRnlaMlYwTENCbGJITWdLU0I3WEc1Y2RGeDBYSFIyWVhJZ2FpQTlJSFJoY21kbGRDNXNaVzVuZEdnc1hHNWNkRngwWEhSY2RHa2dQU0F3TzF4dVhIUmNkRngwTHk4Z1EyRnVKM1FnZEhKMWMzUWdUbTlrWlV4cGMzUXViR1Z1WjNSb1hHNWNkRngwWEhSM2FHbHNaU0FvSUNoMFlYSm5aWFJiYWlzclhTQTlJR1ZzYzF0cEt5dGRLU0FwSUh0OVhHNWNkRngwWEhSMFlYSm5aWFF1YkdWdVozUm9JRDBnYWlBdElERTdYRzVjZEZ4MGZWeHVYSFI5TzF4dWZWeHVYRzVtZFc1amRHbHZiaUJUYVhwNmJHVW9JSE5sYkdWamRHOXlMQ0JqYjI1MFpYaDBMQ0J5WlhOMWJIUnpMQ0J6WldWa0lDa2dlMXh1WEhSMllYSWdiV0YwWTJnc0lHVnNaVzBzSUcwc0lHNXZaR1ZVZVhCbExGeHVYSFJjZEM4dklGRlRRU0IyWVhKelhHNWNkRngwYVN3Z1ozSnZkWEJ6TENCdmJHUXNJRzVwWkN3Z2JtVjNRMjl1ZEdWNGRDd2dibVYzVTJWc1pXTjBiM0k3WEc1Y2JseDBhV1lnS0NBb0lHTnZiblJsZUhRZ1B5QmpiMjUwWlhoMExtOTNibVZ5Ukc5amRXMWxiblFnZkh3Z1kyOXVkR1Y0ZENBNklIQnlaV1psY25KbFpFUnZZeUFwSUNFOVBTQmtiMk4xYldWdWRDQXBJSHRjYmx4MFhIUnpaWFJFYjJOMWJXVnVkQ2dnWTI5dWRHVjRkQ0FwTzF4dVhIUjlYRzVjYmx4MFkyOXVkR1Y0ZENBOUlHTnZiblJsZUhRZ2ZId2daRzlqZFcxbGJuUTdYRzVjZEhKbGMzVnNkSE1nUFNCeVpYTjFiSFJ6SUh4OElGdGRPMXh1WEhSdWIyUmxWSGx3WlNBOUlHTnZiblJsZUhRdWJtOWtaVlI1Y0dVN1hHNWNibHgwYVdZZ0tDQjBlWEJsYjJZZ2MyVnNaV04wYjNJZ0lUMDlJRndpYzNSeWFXNW5YQ0lnZkh3Z0lYTmxiR1ZqZEc5eUlIeDhYRzVjZEZ4MGJtOWtaVlI1Y0dVZ0lUMDlJREVnSmlZZ2JtOWtaVlI1Y0dVZ0lUMDlJRGtnSmlZZ2JtOWtaVlI1Y0dVZ0lUMDlJREV4SUNrZ2UxeHVYRzVjZEZ4MGNtVjBkWEp1SUhKbGMzVnNkSE03WEc1Y2RIMWNibHh1WEhScFppQW9JQ0Z6WldWa0lDWW1JR1J2WTNWdFpXNTBTWE5JVkUxTUlDa2dlMXh1WEc1Y2RGeDBMeThnVkhKNUlIUnZJSE5vYjNKMFkzVjBJR1pwYm1RZ2IzQmxjbUYwYVc5dWN5QjNhR1Z1SUhCdmMzTnBZbXhsSUNobExtY3VMQ0J1YjNRZ2RXNWtaWElnUkc5amRXMWxiblJHY21GbmJXVnVkQ2xjYmx4MFhIUnBaaUFvSUc1dlpHVlVlWEJsSUNFOVBTQXhNU0FtSmlBb2JXRjBZMmdnUFNCeWNYVnBZMnRGZUhCeUxtVjRaV01vSUhObGJHVmpkRzl5SUNrcElDa2dlMXh1WEhSY2RGeDBMeThnVTNCbFpXUXRkWEE2SUZOcGVucHNaU2hjSWlOSlJGd2lLVnh1WEhSY2RGeDBhV1lnS0NBb2JTQTlJRzFoZEdOb1d6RmRLU0FwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0J1YjJSbFZIbHdaU0E5UFQwZ09TQXBJSHRjYmx4MFhIUmNkRngwWEhSbGJHVnRJRDBnWTI5dWRHVjRkQzVuWlhSRmJHVnRaVzUwUW5sSlpDZ2diU0FwTzF4dVhIUmNkRngwWEhSY2RDOHZJRU5vWldOcklIQmhjbVZ1ZEU1dlpHVWdkRzhnWTJGMFkyZ2dkMmhsYmlCQ2JHRmphMkpsY25KNUlEUXVOaUJ5WlhSMWNtNXpYRzVjZEZ4MFhIUmNkRngwTHk4Z2JtOWtaWE1nZEdoaGRDQmhjbVVnYm04Z2JHOXVaMlZ5SUdsdUlIUm9aU0JrYjJOMWJXVnVkQ0FvYWxGMVpYSjVJQ00yT1RZektWeHVYSFJjZEZ4MFhIUmNkR2xtSUNnZ1pXeGxiU0FtSmlCbGJHVnRMbkJoY21WdWRFNXZaR1VnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFF2THlCSVlXNWtiR1VnZEdobElHTmhjMlVnZDJobGNtVWdTVVVzSUU5d1pYSmhMQ0JoYm1RZ1YyVmlhMmwwSUhKbGRIVnliaUJwZEdWdGMxeHVYSFJjZEZ4MFhIUmNkRngwTHk4Z1lua2dibUZ0WlNCcGJuTjBaV0ZrSUc5bUlFbEVYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9JR1ZzWlcwdWFXUWdQVDA5SUcwZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RISmxjM1ZzZEhNdWNIVnphQ2dnWld4bGJTQXBPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200Z2NtVnpkV3gwY3p0Y2JseDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RGeDBjbVYwZFhKdUlISmxjM1ZzZEhNN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEM4dklFTnZiblJsZUhRZ2FYTWdibTkwSUdFZ1pHOWpkVzFsYm5SY2JseDBYSFJjZEZ4MFhIUnBaaUFvSUdOdmJuUmxlSFF1YjNkdVpYSkViMk4xYldWdWRDQW1KaUFvWld4bGJTQTlJR052Ym5SbGVIUXViM2R1WlhKRWIyTjFiV1Z1ZEM1blpYUkZiR1Z0Wlc1MFFubEpaQ2dnYlNBcEtTQW1KbHh1WEhSY2RGeDBYSFJjZEZ4MFkyOXVkR0ZwYm5Nb0lHTnZiblJsZUhRc0lHVnNaVzBnS1NBbUppQmxiR1Z0TG1sa0lEMDlQU0J0SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WemRXeDBjeTV3ZFhOb0tDQmxiR1Z0SUNrN1hHNWNkRngwWEhSY2RGeDBYSFJ5WlhSMWNtNGdjbVZ6ZFd4MGN6dGNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdVM0JsWldRdGRYQTZJRk5wZW5wc1pTaGNJbFJCUjF3aUtWeHVYSFJjZEZ4MGZTQmxiSE5sSUdsbUlDZ2diV0YwWTJoYk1sMGdLU0I3WEc1Y2RGeDBYSFJjZEhCMWMyZ3VZWEJ3Ykhrb0lISmxjM1ZzZEhNc0lHTnZiblJsZUhRdVoyVjBSV3hsYldWdWRITkNlVlJoWjA1aGJXVW9JSE5sYkdWamRHOXlJQ2tnS1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhKbGMzVnNkSE03WEc1Y2JseDBYSFJjZEM4dklGTndaV1ZrTFhWd09pQlRhWHA2YkdVb1hDSXVRMHhCVTFOY0lpbGNibHgwWEhSY2RIMGdaV3h6WlNCcFppQW9JQ2h0SUQwZ2JXRjBZMmhiTTEwcElDWW1JSE4xY0hCdmNuUXVaMlYwUld4bGJXVnVkSE5DZVVOc1lYTnpUbUZ0WlNBcElIdGNibHgwWEhSY2RGeDBjSFZ6YUM1aGNIQnNlU2dnY21WemRXeDBjeXdnWTI5dWRHVjRkQzVuWlhSRmJHVnRaVzUwYzBKNVEyeGhjM05PWVcxbEtDQnRJQ2tnS1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhKbGMzVnNkSE03WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeThnVVZOQklIQmhkR2hjYmx4MFhIUnBaaUFvSUhOMWNIQnZjblF1Y1hOaElDWW1JQ2doY21KMVoyZDVVVk5CSUh4OElDRnlZblZuWjNsUlUwRXVkR1Z6ZENnZ2MyVnNaV04wYjNJZ0tTa2dLU0I3WEc1Y2RGeDBYSFJ1YVdRZ1BTQnZiR1FnUFNCbGVIQmhibVJ2TzF4dVhIUmNkRngwYm1WM1EyOXVkR1Y0ZENBOUlHTnZiblJsZUhRN1hHNWNkRngwWEhSdVpYZFRaV3hsWTNSdmNpQTlJRzV2WkdWVWVYQmxJQ0U5UFNBeElDWW1JSE5sYkdWamRHOXlPMXh1WEc1Y2RGeDBYSFF2THlCeFUwRWdkMjl5YTNNZ2MzUnlZVzVuWld4NUlHOXVJRVZzWlcxbGJuUXRjbTl2ZEdWa0lIRjFaWEpwWlhOY2JseDBYSFJjZEM4dklGZGxJR05oYmlCM2IzSnJJR0Z5YjNWdVpDQjBhR2x6SUdKNUlITndaV05wWm5scGJtY2dZVzRnWlhoMGNtRWdTVVFnYjI0Z2RHaGxJSEp2YjNSY2JseDBYSFJjZEM4dklHRnVaQ0IzYjNKcmFXNW5JSFZ3SUdaeWIyMGdkR2hsY21VZ0tGUm9ZVzVyY3lCMGJ5QkJibVJ5WlhjZ1JIVndiMjUwSUdadmNpQjBhR1VnZEdWamFHNXBjWFZsS1Z4dVhIUmNkRngwTHk4Z1NVVWdPQ0JrYjJWemJpZDBJSGR2Y21zZ2IyNGdiMkpxWldOMElHVnNaVzFsYm5SelhHNWNkRngwWEhScFppQW9JRzV2WkdWVWVYQmxJRDA5UFNBeElDWW1JR052Ym5SbGVIUXVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1NBaFBUMGdYQ0p2WW1wbFkzUmNJaUFwSUh0Y2JseDBYSFJjZEZ4MFozSnZkWEJ6SUQwZ2RHOXJaVzVwZW1Vb0lITmxiR1ZqZEc5eUlDazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tDQW9iMnhrSUQwZ1kyOXVkR1Y0ZEM1blpYUkJkSFJ5YVdKMWRHVW9YQ0pwWkZ3aUtTa2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGJtbGtJRDBnYjJ4a0xuSmxjR3hoWTJVb0lISmxjMk5oY0dVc0lGd2lYRnhjWENRbVhDSWdLVHRjYmx4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSamIyNTBaWGgwTG5ObGRFRjBkSEpwWW5WMFpTZ2dYQ0pwWkZ3aUxDQnVhV1FnS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUnVhV1FnUFNCY0lsdHBaRDBuWENJZ0t5QnVhV1FnS3lCY0lpZGRJRndpTzF4dVhHNWNkRngwWEhSY2RHa2dQU0JuY205MWNITXViR1Z1WjNSb08xeHVYSFJjZEZ4MFhIUjNhR2xzWlNBb0lHa3RMU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUm5jbTkxY0hOYmFWMGdQU0J1YVdRZ0t5QjBiMU5sYkdWamRHOXlLQ0JuY205MWNITmJhVjBnS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUnVaWGREYjI1MFpYaDBJRDBnY25OcFlteHBibWN1ZEdWemRDZ2djMlZzWldOMGIzSWdLU0FtSmlCMFpYTjBRMjl1ZEdWNGRDZ2dZMjl1ZEdWNGRDNXdZWEpsYm5ST2IyUmxJQ2tnZkh3Z1kyOXVkR1Y0ZER0Y2JseDBYSFJjZEZ4MGJtVjNVMlZzWldOMGIzSWdQU0JuY205MWNITXVhbTlwYmloY0lpeGNJaWs3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEdsbUlDZ2dibVYzVTJWc1pXTjBiM0lnS1NCN1hHNWNkRngwWEhSY2RIUnllU0I3WEc1Y2RGeDBYSFJjZEZ4MGNIVnphQzVoY0hCc2VTZ2djbVZ6ZFd4MGN5eGNibHgwWEhSY2RGeDBYSFJjZEc1bGQwTnZiblJsZUhRdWNYVmxjbmxUWld4bFkzUnZja0ZzYkNnZ2JtVjNVMlZzWldOMGIzSWdLVnh1WEhSY2RGeDBYSFJjZENrN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlISmxjM1ZzZEhNN1hHNWNkRngwWEhSY2RIMGdZMkYwWTJnb2NYTmhSWEp5YjNJcElIdGNibHgwWEhSY2RGeDBmU0JtYVc1aGJHeDVJSHRjYmx4MFhIUmNkRngwWEhScFppQW9JQ0Z2YkdRZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSamIyNTBaWGgwTG5KbGJXOTJaVUYwZEhKcFluVjBaU2hjSW1sa1hDSXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBmVnh1WEc1Y2RDOHZJRUZzYkNCdmRHaGxjbk5jYmx4MGNtVjBkWEp1SUhObGJHVmpkQ2dnYzJWc1pXTjBiM0l1Y21Wd2JHRmpaU2dnY25SeWFXMHNJRndpSkRGY0lpQXBMQ0JqYjI1MFpYaDBMQ0J5WlhOMWJIUnpMQ0J6WldWa0lDazdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1EzSmxZWFJsSUd0bGVTMTJZV3gxWlNCallXTm9aWE1nYjJZZ2JHbHRhWFJsWkNCemFYcGxYRzRnS2lCQWNtVjBkWEp1Y3lCN1JuVnVZM1JwYjI0b2MzUnlhVzVuTENCUFltcGxZM1FwZlNCU1pYUjFjbTV6SUhSb1pTQlBZbXBsWTNRZ1pHRjBZU0JoWm5SbGNpQnpkRzl5YVc1bklHbDBJRzl1SUdsMGMyVnNaaUIzYVhSb1hHNGdLbHgwY0hKdmNHVnlkSGtnYm1GdFpTQjBhR1VnS0hOd1lXTmxMWE4xWm1acGVHVmtLU0J6ZEhKcGJtY2dZVzVrSUNocFppQjBhR1VnWTJGamFHVWdhWE1nYkdGeVoyVnlJSFJvWVc0Z1JYaHdjaTVqWVdOb1pVeGxibWQwYUNsY2JpQXFYSFJrWld4bGRHbHVaeUIwYUdVZ2IyeGtaWE4wSUdWdWRISjVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHTnlaV0YwWlVOaFkyaGxLQ2tnZTF4dVhIUjJZWElnYTJWNWN5QTlJRnRkTzF4dVhHNWNkR1oxYm1OMGFXOXVJR05oWTJobEtDQnJaWGtzSUhaaGJIVmxJQ2tnZTF4dVhIUmNkQzh2SUZWelpTQW9hMlY1SUNzZ1hDSWdYQ0lwSUhSdklHRjJiMmxrSUdOdmJHeHBjMmx2YmlCM2FYUm9JRzVoZEdsMlpTQndjbTkwYjNSNWNHVWdjSEp2Y0dWeWRHbGxjeUFvYzJWbElFbHpjM1ZsSUNNeE5UY3BYRzVjZEZ4MGFXWWdLQ0JyWlhsekxuQjFjMmdvSUd0bGVTQXJJRndpSUZ3aUlDa2dQaUJGZUhCeUxtTmhZMmhsVEdWdVozUm9JQ2tnZTF4dVhIUmNkRngwTHk4Z1QyNXNlU0JyWldWd0lIUm9aU0J0YjNOMElISmxZMlZ1ZENCbGJuUnlhV1Z6WEc1Y2RGeDBYSFJrWld4bGRHVWdZMkZqYUdWYklHdGxlWE11YzJocFpuUW9LU0JkTzF4dVhIUmNkSDFjYmx4MFhIUnlaWFIxY200Z0tHTmhZMmhsV3lCclpYa2dLeUJjSWlCY0lpQmRJRDBnZG1Gc2RXVXBPMXh1WEhSOVhHNWNkSEpsZEhWeWJpQmpZV05vWlR0Y2JuMWNibHh1THlvcVhHNGdLaUJOWVhKcklHRWdablZ1WTNScGIyNGdabTl5SUhOd1pXTnBZV3dnZFhObElHSjVJRk5wZW5wc1pWeHVJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnWm00Z1ZHaGxJR1oxYm1OMGFXOXVJSFJ2SUcxaGNtdGNiaUFxTDF4dVpuVnVZM1JwYjI0Z2JXRnlhMFoxYm1OMGFXOXVLQ0JtYmlBcElIdGNibHgwWm01YklHVjRjR0Z1Wkc4Z1hTQTlJSFJ5ZFdVN1hHNWNkSEpsZEhWeWJpQm1ianRjYm4xY2JseHVMeW9xWEc0Z0tpQlRkWEJ3YjNKMElIUmxjM1JwYm1jZ2RYTnBibWNnWVc0Z1pXeGxiV1Z1ZEZ4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdabTRnVUdGemMyVmtJSFJvWlNCamNtVmhkR1ZrSUdScGRpQmhibVFnWlhod1pXTjBjeUJoSUdKdmIyeGxZVzRnY21WemRXeDBYRzRnS2k5Y2JtWjFibU4wYVc5dUlHRnpjMlZ5ZENnZ1ptNGdLU0I3WEc1Y2RIWmhjaUJrYVhZZ1BTQmtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0Z3aVpHbDJYQ0lwTzF4dVhHNWNkSFJ5ZVNCN1hHNWNkRngwY21WMGRYSnVJQ0VoWm00b0lHUnBkaUFwTzF4dVhIUjlJR05oZEdOb0lDaGxLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHWmhiSE5sTzF4dVhIUjlJR1pwYm1Gc2JIa2dlMXh1WEhSY2RDOHZJRkpsYlc5MlpTQm1jbTl0SUdsMGN5QndZWEpsYm5RZ1lua2daR1ZtWVhWc2RGeHVYSFJjZEdsbUlDZ2daR2wyTG5CaGNtVnVkRTV2WkdVZ0tTQjdYRzVjZEZ4MFhIUmthWFl1Y0dGeVpXNTBUbTlrWlM1eVpXMXZkbVZEYUdsc1pDZ2daR2wySUNrN1hHNWNkRngwZlZ4dVhIUmNkQzh2SUhKbGJHVmhjMlVnYldWdGIzSjVJR2x1SUVsRlhHNWNkRngwWkdsMklEMGdiblZzYkR0Y2JseDBmVnh1ZlZ4dVhHNHZLaXBjYmlBcUlFRmtaSE1nZEdobElITmhiV1VnYUdGdVpHeGxjaUJtYjNJZ1lXeHNJRzltSUhSb1pTQnpjR1ZqYVdacFpXUWdZWFIwY25OY2JpQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmhkSFJ5Y3lCUWFYQmxMWE5sY0dGeVlYUmxaQ0JzYVhOMElHOW1JR0YwZEhKcFluVjBaWE5jYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHaGhibVJzWlhJZ1ZHaGxJRzFsZEdodlpDQjBhR0YwSUhkcGJHd2dZbVVnWVhCd2JHbGxaRnh1SUNvdlhHNW1kVzVqZEdsdmJpQmhaR1JJWVc1a2JHVW9JR0YwZEhKekxDQm9ZVzVrYkdWeUlDa2dlMXh1WEhSMllYSWdZWEp5SUQwZ1lYUjBjbk11YzNCc2FYUW9YQ0o4WENJcExGeHVYSFJjZEdrZ1BTQmhkSFJ5Y3k1c1pXNW5kR2c3WEc1Y2JseDBkMmhwYkdVZ0tDQnBMUzBnS1NCN1hHNWNkRngwUlhod2NpNWhkSFJ5U0dGdVpHeGxXeUJoY25KYmFWMGdYU0E5SUdoaGJtUnNaWEk3WEc1Y2RIMWNibjFjYmx4dUx5b3FYRzRnS2lCRGFHVmphM01nWkc5amRXMWxiblFnYjNKa1pYSWdiMllnZEhkdklITnBZbXhwYm1kelhHNGdLaUJBY0dGeVlXMGdlMFZzWlcxbGJuUjlJR0ZjYmlBcUlFQndZWEpoYlNCN1JXeGxiV1Z1ZEgwZ1lseHVJQ29nUUhKbGRIVnlibk1nZTA1MWJXSmxjbjBnVW1WMGRYSnVjeUJzWlhOeklIUm9ZVzRnTUNCcFppQmhJSEJ5WldObFpHVnpJR0lzSUdkeVpXRjBaWElnZEdoaGJpQXdJR2xtSUdFZ1ptOXNiRzkzY3lCaVhHNGdLaTljYm1aMWJtTjBhVzl1SUhOcFlteHBibWREYUdWamF5Z2dZU3dnWWlBcElIdGNibHgwZG1GeUlHTjFjaUE5SUdJZ0ppWWdZU3hjYmx4MFhIUmthV1ptSUQwZ1kzVnlJQ1ltSUdFdWJtOWtaVlI1Y0dVZ1BUMDlJREVnSmlZZ1lpNXViMlJsVkhsd1pTQTlQVDBnTVNBbUpseHVYSFJjZEZ4MEtDQitZaTV6YjNWeVkyVkpibVJsZUNCOGZDQk5RVmhmVGtWSFFWUkpWa1VnS1NBdFhHNWNkRngwWEhRb0lINWhMbk52ZFhKalpVbHVaR1Y0SUh4OElFMUJXRjlPUlVkQlZFbFdSU0FwTzF4dVhHNWNkQzh2SUZWelpTQkpSU0J6YjNWeVkyVkpibVJsZUNCcFppQmhkbUZwYkdGaWJHVWdiMjRnWW05MGFDQnViMlJsYzF4dVhIUnBaaUFvSUdScFptWWdLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHUnBabVk3WEc1Y2RIMWNibHh1WEhRdkx5QkRhR1ZqYXlCcFppQmlJR1p2Ykd4dmQzTWdZVnh1WEhScFppQW9JR04xY2lBcElIdGNibHgwWEhSM2FHbHNaU0FvSUNoamRYSWdQU0JqZFhJdWJtVjRkRk5wWW14cGJtY3BJQ2tnZTF4dVhIUmNkRngwYVdZZ0tDQmpkWElnUFQwOUlHSWdLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUF0TVR0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMWNibHh1WEhSeVpYUjFjbTRnWVNBL0lERWdPaUF0TVR0Y2JuMWNibHh1THlvcVhHNGdLaUJTWlhSMWNtNXpJR0VnWm5WdVkzUnBiMjRnZEc4Z2RYTmxJR2x1SUhCelpYVmtiM01nWm05eUlHbHVjSFYwSUhSNWNHVnpYRzRnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnZEhsd1pWeHVJQ292WEc1bWRXNWpkR2x2YmlCamNtVmhkR1ZKYm5CMWRGQnpaWFZrYnlnZ2RIbHdaU0FwSUh0Y2JseDBjbVYwZFhKdUlHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2UxeHVYSFJjZEhaaGNpQnVZVzFsSUQwZ1pXeGxiUzV1YjJSbFRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncE8xeHVYSFJjZEhKbGRIVnliaUJ1WVcxbElEMDlQU0JjSW1sdWNIVjBYQ0lnSmlZZ1pXeGxiUzUwZVhCbElEMDlQU0IwZVhCbE8xeHVYSFI5TzF4dWZWeHVYRzR2S2lwY2JpQXFJRkpsZEhWeWJuTWdZU0JtZFc1amRHbHZiaUIwYnlCMWMyVWdhVzRnY0hObGRXUnZjeUJtYjNJZ1luVjBkRzl1YzF4dUlDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIUjVjR1ZjYmlBcUwxeHVablZ1WTNScGIyNGdZM0psWVhSbFFuVjBkRzl1VUhObGRXUnZLQ0IwZVhCbElDa2dlMXh1WEhSeVpYUjFjbTRnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RGeDBkbUZ5SUc1aGJXVWdQU0JsYkdWdExtNXZaR1ZPWVcxbExuUnZURzkzWlhKRFlYTmxLQ2s3WEc1Y2RGeDBjbVYwZFhKdUlDaHVZVzFsSUQwOVBTQmNJbWx1Y0hWMFhDSWdmSHdnYm1GdFpTQTlQVDBnWENKaWRYUjBiMjVjSWlrZ0ppWWdaV3hsYlM1MGVYQmxJRDA5UFNCMGVYQmxPMXh1WEhSOU8xeHVmVnh1WEc0dktpcGNiaUFxSUZKbGRIVnlibk1nWVNCbWRXNWpkR2x2YmlCMGJ5QjFjMlVnYVc0Z2NITmxkV1J2Y3lCbWIzSWdjRzl6YVhScGIyNWhiSE5jYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHWnVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHTnlaV0YwWlZCdmMybDBhVzl1WVd4UWMyVjFaRzhvSUdadUlDa2dlMXh1WEhSeVpYUjFjbTRnYldGeWEwWjFibU4wYVc5dUtHWjFibU4wYVc5dUtDQmhjbWQxYldWdWRDQXBJSHRjYmx4MFhIUmhjbWQxYldWdWRDQTlJQ3RoY21kMWJXVnVkRHRjYmx4MFhIUnlaWFIxY200Z2JXRnlhMFoxYm1OMGFXOXVLR1oxYm1OMGFXOXVLQ0J6WldWa0xDQnRZWFJqYUdWeklDa2dlMXh1WEhSY2RGeDBkbUZ5SUdvc1hHNWNkRngwWEhSY2RHMWhkR05vU1c1a1pYaGxjeUE5SUdadUtDQmJYU3dnYzJWbFpDNXNaVzVuZEdnc0lHRnlaM1Z0Wlc1MElDa3NYRzVjZEZ4MFhIUmNkR2tnUFNCdFlYUmphRWx1WkdWNFpYTXViR1Z1WjNSb08xeHVYRzVjZEZ4MFhIUXZMeUJOWVhSamFDQmxiR1Z0Wlc1MGN5Qm1iM1Z1WkNCaGRDQjBhR1VnYzNCbFkybG1hV1ZrSUdsdVpHVjRaWE5jYmx4MFhIUmNkSGRvYVd4bElDZ2dhUzB0SUNrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvSUhObFpXUmJJQ2hxSUQwZ2JXRjBZMmhKYm1SbGVHVnpXMmxkS1NCZElDa2dlMXh1WEhSY2RGeDBYSFJjZEhObFpXUmJhbDBnUFNBaEtHMWhkR05vWlhOYmFsMGdQU0J6WldWa1cycGRLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhIUmNkSDBwTzF4dVhIUjlLVHRjYm4xY2JseHVMeW9xWEc0Z0tpQkRhR1ZqYTNNZ1lTQnViMlJsSUdadmNpQjJZV3hwWkdsMGVTQmhjeUJoSUZOcGVucHNaU0JqYjI1MFpYaDBYRzRnS2lCQWNHRnlZVzBnZTBWc1pXMWxiblI4VDJKcVpXTjBQWDBnWTI5dWRHVjRkRnh1SUNvZ1FISmxkSFZ5Ym5NZ2UwVnNaVzFsYm5SOFQySnFaV04wZkVKdmIyeGxZVzU5SUZSb1pTQnBibkIxZENCdWIyUmxJR2xtSUdGalkyVndkR0ZpYkdVc0lHOTBhR1Z5ZDJselpTQmhJR1poYkhONUlIWmhiSFZsWEc0Z0tpOWNibVoxYm1OMGFXOXVJSFJsYzNSRGIyNTBaWGgwS0NCamIyNTBaWGgwSUNrZ2UxeHVYSFJ5WlhSMWNtNGdZMjl1ZEdWNGRDQW1KaUIwZVhCbGIyWWdZMjl1ZEdWNGRDNW5aWFJGYkdWdFpXNTBjMEo1VkdGblRtRnRaU0FoUFQwZ1hDSjFibVJsWm1sdVpXUmNJaUFtSmlCamIyNTBaWGgwTzF4dWZWeHVYRzR2THlCRmVIQnZjMlVnYzNWd2NHOXlkQ0IyWVhKeklHWnZjaUJqYjI1MlpXNXBaVzVqWlZ4dWMzVndjRzl5ZENBOUlGTnBlbnBzWlM1emRYQndiM0owSUQwZ2UzMDdYRzVjYmk4cUtseHVJQ29nUkdWMFpXTjBjeUJZVFV3Z2JtOWtaWE5jYmlBcUlFQndZWEpoYlNCN1JXeGxiV1Z1ZEh4UFltcGxZM1I5SUdWc1pXMGdRVzRnWld4bGJXVnVkQ0J2Y2lCaElHUnZZM1Z0Wlc1MFhHNGdLaUJBY21WMGRYSnVjeUI3UW05dmJHVmhibjBnVkhKMVpTQnBabVlnWld4bGJTQnBjeUJoSUc1dmJpMUlWRTFNSUZoTlRDQnViMlJsWEc0Z0tpOWNibWx6V0UxTUlEMGdVMmw2ZW14bExtbHpXRTFNSUQwZ1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN1hHNWNkQzh2SUdSdlkzVnRaVzUwUld4bGJXVnVkQ0JwY3lCMlpYSnBabWxsWkNCbWIzSWdZMkZ6WlhNZ2QyaGxjbVVnYVhRZ1pHOWxjMjRuZENCNVpYUWdaWGhwYzNSY2JseDBMeThnS0hOMVkyZ2dZWE1nYkc5aFpHbHVaeUJwWm5KaGJXVnpJR2x1SUVsRklDMGdJelE0TXpNcFhHNWNkSFpoY2lCa2IyTjFiV1Z1ZEVWc1pXMWxiblFnUFNCbGJHVnRJQ1ltSUNobGJHVnRMbTkzYm1WeVJHOWpkVzFsYm5RZ2ZId2daV3hsYlNrdVpHOWpkVzFsYm5SRmJHVnRaVzUwTzF4dVhIUnlaWFIxY200Z1pHOWpkVzFsYm5SRmJHVnRaVzUwSUQ4Z1pHOWpkVzFsYm5SRmJHVnRaVzUwTG01dlpHVk9ZVzFsSUNFOVBTQmNJa2hVVFV4Y0lpQTZJR1poYkhObE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCVFpYUnpJR1J2WTNWdFpXNTBMWEpsYkdGMFpXUWdkbUZ5YVdGaWJHVnpJRzl1WTJVZ1ltRnpaV1FnYjI0Z2RHaGxJR04xY25KbGJuUWdaRzlqZFcxbGJuUmNiaUFxSUVCd1lYSmhiU0I3Uld4bGJXVnVkSHhQWW1wbFkzUjlJRnRrYjJOZElFRnVJR1ZzWlcxbGJuUWdiM0lnWkc5amRXMWxiblFnYjJKcVpXTjBJSFJ2SUhWelpTQjBieUJ6WlhRZ2RHaGxJR1J2WTNWdFpXNTBYRzRnS2lCQWNtVjBkWEp1Y3lCN1QySnFaV04wZlNCU1pYUjFjbTV6SUhSb1pTQmpkWEp5Wlc1MElHUnZZM1Z0Wlc1MFhHNGdLaTljYm5ObGRFUnZZM1Z0Wlc1MElEMGdVMmw2ZW14bExuTmxkRVJ2WTNWdFpXNTBJRDBnWm5WdVkzUnBiMjRvSUc1dlpHVWdLU0I3WEc1Y2RIWmhjaUJvWVhORGIyMXdZWEpsTENCd1lYSmxiblFzWEc1Y2RGeDBaRzlqSUQwZ2JtOWtaU0EvSUc1dlpHVXViM2R1WlhKRWIyTjFiV1Z1ZENCOGZDQnViMlJsSURvZ2NISmxabVZ5Y21Wa1JHOWpPMXh1WEc1Y2RDOHZJRWxtSUc1dklHUnZZM1Z0Wlc1MElHRnVaQ0JrYjJOMWJXVnVkRVZzWlcxbGJuUWdhWE1nWVhaaGFXeGhZbXhsTENCeVpYUjFjbTVjYmx4MGFXWWdLQ0JrYjJNZ1BUMDlJR1J2WTNWdFpXNTBJSHg4SUdSdll5NXViMlJsVkhsd1pTQWhQVDBnT1NCOGZDQWhaRzlqTG1SdlkzVnRaVzUwUld4bGJXVnVkQ0FwSUh0Y2JseDBYSFJ5WlhSMWNtNGdaRzlqZFcxbGJuUTdYRzVjZEgxY2JseHVYSFF2THlCVFpYUWdiM1Z5SUdSdlkzVnRaVzUwWEc1Y2RHUnZZM1Z0Wlc1MElEMGdaRzlqTzF4dVhIUmtiMk5GYkdWdElEMGdaRzlqTG1SdlkzVnRaVzUwUld4bGJXVnVkRHRjYmx4MGNHRnlaVzUwSUQwZ1pHOWpMbVJsWm1GMWJIUldhV1YzTzF4dVhHNWNkQzh2SUZOMWNIQnZjblE2SUVsRlBqaGNibHgwTHk4Z1NXWWdhV1p5WVcxbElHUnZZM1Z0Wlc1MElHbHpJR0Z6YzJsbmJtVmtJSFJ2SUZ3aVpHOWpkVzFsYm5SY0lpQjJZWEpwWVdKc1pTQmhibVFnYVdZZ2FXWnlZVzFsSUdoaGN5QmlaV1Z1SUhKbGJHOWhaR1ZrTEZ4dVhIUXZMeUJKUlNCM2FXeHNJSFJvY205M0lGd2ljR1Z5YldsemMybHZiaUJrWlc1cFpXUmNJaUJsY25KdmNpQjNhR1Z1SUdGalkyVnpjMmx1WnlCY0ltUnZZM1Z0Wlc1MFhDSWdkbUZ5YVdGaWJHVXNJSE5sWlNCcVVYVmxjbmtnSXpFek9UTTJYRzVjZEM4dklFbEZOaTA0SUdSdklHNXZkQ0J6ZFhCd2IzSjBJSFJvWlNCa1pXWmhkV3gwVm1sbGR5QndjbTl3WlhKMGVTQnpieUJ3WVhKbGJuUWdkMmxzYkNCaVpTQjFibVJsWm1sdVpXUmNibHgwYVdZZ0tDQndZWEpsYm5RZ0ppWWdjR0Z5Wlc1MElDRTlQU0J3WVhKbGJuUXVkRzl3SUNrZ2UxeHVYSFJjZEM4dklFbEZNVEVnWkc5bGN5QnViM1FnYUdGMlpTQmhkSFJoWTJoRmRtVnVkQ3dnYzI4Z1lXeHNJRzExYzNRZ2MzVm1abVZ5WEc1Y2RGeDBhV1lnS0NCd1lYSmxiblF1WVdSa1JYWmxiblJNYVhOMFpXNWxjaUFwSUh0Y2JseDBYSFJjZEhCaGNtVnVkQzVoWkdSRmRtVnVkRXhwYzNSbGJtVnlLQ0JjSW5WdWJHOWhaRndpTENCMWJteHZZV1JJWVc1a2JHVnlMQ0JtWVd4elpTQXBPMXh1WEhSY2RIMGdaV3h6WlNCcFppQW9JSEJoY21WdWRDNWhkSFJoWTJoRmRtVnVkQ0FwSUh0Y2JseDBYSFJjZEhCaGNtVnVkQzVoZEhSaFkyaEZkbVZ1ZENnZ1hDSnZiblZ1Ykc5aFpGd2lMQ0IxYm14dllXUklZVzVrYkdWeUlDazdYRzVjZEZ4MGZWeHVYSFI5WEc1Y2JseDBMeW9nVTNWd2NHOXlkQ0IwWlhOMGMxeHVYSFF0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRJQ292WEc1Y2RHUnZZM1Z0Wlc1MFNYTklWRTFNSUQwZ0lXbHpXRTFNS0NCa2IyTWdLVHRjYmx4dVhIUXZLaUJCZEhSeWFXSjFkR1Z6WEc1Y2RDMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwZ0tpOWNibHh1WEhRdkx5QlRkWEJ3YjNKME9pQkpSVHc0WEc1Y2RDOHZJRlpsY21sbWVTQjBhR0YwSUdkbGRFRjBkSEpwWW5WMFpTQnlaV0ZzYkhrZ2NtVjBkWEp1Y3lCaGRIUnlhV0oxZEdWeklHRnVaQ0J1YjNRZ2NISnZjR1Z5ZEdsbGMxeHVYSFF2THlBb1pYaGpaWEIwYVc1bklFbEZPQ0JpYjI5c1pXRnVjeWxjYmx4MGMzVndjRzl5ZEM1aGRIUnlhV0oxZEdWeklEMGdZWE56WlhKMEtHWjFibU4wYVc5dUtDQmthWFlnS1NCN1hHNWNkRngwWkdsMkxtTnNZWE56VG1GdFpTQTlJRndpYVZ3aU8xeHVYSFJjZEhKbGRIVnliaUFoWkdsMkxtZGxkRUYwZEhKcFluVjBaU2hjSW1Oc1lYTnpUbUZ0WlZ3aUtUdGNibHgwZlNrN1hHNWNibHgwTHlvZ1oyVjBSV3hsYldWdWRDaHpLVUo1S2x4dVhIUXRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdElDb3ZYRzVjYmx4MEx5OGdRMmhsWTJzZ2FXWWdaMlYwUld4bGJXVnVkSE5DZVZSaFowNWhiV1VvWENJcVhDSXBJSEpsZEhWeWJuTWdiMjVzZVNCbGJHVnRaVzUwYzF4dVhIUnpkWEJ3YjNKMExtZGxkRVZzWlcxbGJuUnpRbmxVWVdkT1lXMWxJRDBnWVhOelpYSjBLR1oxYm1OMGFXOXVLQ0JrYVhZZ0tTQjdYRzVjZEZ4MFpHbDJMbUZ3Y0dWdVpFTm9hV3hrS0NCa2IyTXVZM0psWVhSbFEyOXRiV1Z1ZENoY0lsd2lLU0FwTzF4dVhIUmNkSEpsZEhWeWJpQWhaR2wyTG1kbGRFVnNaVzFsYm5SelFubFVZV2RPWVcxbEtGd2lLbHdpS1M1c1pXNW5kR2c3WEc1Y2RIMHBPMXh1WEc1Y2RDOHZJRk4xY0hCdmNuUTZJRWxGUERsY2JseDBjM1Z3Y0c5eWRDNW5aWFJGYkdWdFpXNTBjMEo1UTJ4aGMzTk9ZVzFsSUQwZ2NtNWhkR2wyWlM1MFpYTjBLQ0JrYjJNdVoyVjBSV3hsYldWdWRITkNlVU5zWVhOelRtRnRaU0FwTzF4dVhHNWNkQzh2SUZOMWNIQnZjblE2SUVsRlBERXdYRzVjZEM4dklFTm9aV05ySUdsbUlHZGxkRVZzWlcxbGJuUkNlVWxrSUhKbGRIVnlibk1nWld4bGJXVnVkSE1nWW5rZ2JtRnRaVnh1WEhRdkx5QlVhR1VnWW5KdmEyVnVJR2RsZEVWc1pXMWxiblJDZVVsa0lHMWxkR2h2WkhNZ1pHOXVKM1FnY0dsamF5QjFjQ0J3Y205bmNtRnRZWFJwWTJGc2JIa3RjMlYwSUc1aGJXVnpMRnh1WEhRdkx5QnpieUIxYzJVZ1lTQnliM1Z1WkdGaWIzVjBJR2RsZEVWc1pXMWxiblJ6UW5sT1lXMWxJSFJsYzNSY2JseDBjM1Z3Y0c5eWRDNW5aWFJDZVVsa0lEMGdZWE56WlhKMEtHWjFibU4wYVc5dUtDQmthWFlnS1NCN1hHNWNkRngwWkc5alJXeGxiUzVoY0hCbGJtUkRhR2xzWkNnZ1pHbDJJQ2t1YVdRZ1BTQmxlSEJoYm1Sdk8xeHVYSFJjZEhKbGRIVnliaUFoWkc5akxtZGxkRVZzWlcxbGJuUnpRbmxPWVcxbElIeDhJQ0ZrYjJNdVoyVjBSV3hsYldWdWRITkNlVTVoYldVb0lHVjRjR0Z1Wkc4Z0tTNXNaVzVuZEdnN1hHNWNkSDBwTzF4dVhHNWNkQzh2SUVsRUlHWnBibVFnWVc1a0lHWnBiSFJsY2x4dVhIUnBaaUFvSUhOMWNIQnZjblF1WjJWMFFubEpaQ0FwSUh0Y2JseDBYSFJGZUhCeUxtWnBibVJiWENKSlJGd2lYU0E5SUdaMWJtTjBhVzl1S0NCcFpDd2dZMjl1ZEdWNGRDQXBJSHRjYmx4MFhIUmNkR2xtSUNnZ2RIbHdaVzltSUdOdmJuUmxlSFF1WjJWMFJXeGxiV1Z1ZEVKNVNXUWdJVDA5SUZ3aWRXNWtaV1pwYm1Wa1hDSWdKaVlnWkc5amRXMWxiblJKYzBoVVRVd2dLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnRJRDBnWTI5dWRHVjRkQzVuWlhSRmJHVnRaVzUwUW5sSlpDZ2dhV1FnS1R0Y2JseDBYSFJjZEZ4MEx5OGdRMmhsWTJzZ2NHRnlaVzUwVG05a1pTQjBieUJqWVhSamFDQjNhR1Z1SUVKc1lXTnJZbVZ5Y25rZ05DNDJJSEpsZEhWeWJuTmNibHgwWEhSY2RGeDBMeThnYm05a1pYTWdkR2hoZENCaGNtVWdibThnYkc5dVoyVnlJR2x1SUhSb1pTQmtiMk4xYldWdWRDQWpOamsyTTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYlNBbUppQnRMbkJoY21WdWRFNXZaR1VnUHlCYklHMGdYU0E2SUZ0ZE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNkRngwUlhod2NpNW1hV3gwWlhKYlhDSkpSRndpWFNBOUlHWjFibU4wYVc5dUtDQnBaQ0FwSUh0Y2JseDBYSFJjZEhaaGNpQmhkSFJ5U1dRZ1BTQnBaQzV5WlhCc1lXTmxLQ0J5ZFc1bGMyTmhjR1VzSUdaMWJtVnpZMkZ3WlNBcE8xeHVYSFJjZEZ4MGNtVjBkWEp1SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnWld4bGJTNW5aWFJCZEhSeWFXSjFkR1VvWENKcFpGd2lLU0E5UFQwZ1lYUjBja2xrTzF4dVhIUmNkRngwZlR0Y2JseDBYSFI5TzF4dVhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEM4dklGTjFjSEJ2Y25RNklFbEZOaTgzWEc1Y2RGeDBMeThnWjJWMFJXeGxiV1Z1ZEVKNVNXUWdhWE1nYm05MElISmxiR2xoWW14bElHRnpJR0VnWm1sdVpDQnphRzl5ZEdOMWRGeHVYSFJjZEdSbGJHVjBaU0JGZUhCeUxtWnBibVJiWENKSlJGd2lYVHRjYmx4dVhIUmNkRVY0Y0hJdVptbHNkR1Z5VzF3aVNVUmNJbDBnUFNBZ1puVnVZM1JwYjI0b0lHbGtJQ2tnZTF4dVhIUmNkRngwZG1GeUlHRjBkSEpKWkNBOUlHbGtMbkpsY0d4aFkyVW9JSEoxYm1WelkyRndaU3dnWm5WdVpYTmpZWEJsSUNrN1hHNWNkRngwWEhSeVpYUjFjbTRnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnViMlJsSUQwZ2RIbHdaVzltSUdWc1pXMHVaMlYwUVhSMGNtbGlkWFJsVG05a1pTQWhQVDBnWENKMWJtUmxabWx1WldSY0lpQW1KaUJsYkdWdExtZGxkRUYwZEhKcFluVjBaVTV2WkdVb1hDSnBaRndpS1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUc1dlpHVWdKaVlnYm05a1pTNTJZV3gxWlNBOVBUMGdZWFIwY2tsa08xeHVYSFJjZEZ4MGZUdGNibHgwWEhSOU8xeHVYSFI5WEc1Y2JseDBMeThnVkdGblhHNWNkRVY0Y0hJdVptbHVaRnRjSWxSQlIxd2lYU0E5SUhOMWNIQnZjblF1WjJWMFJXeGxiV1Z1ZEhOQ2VWUmhaMDVoYldVZ1AxeHVYSFJjZEdaMWJtTjBhVzl1S0NCMFlXY3NJR052Ym5SbGVIUWdLU0I3WEc1Y2RGeDBYSFJwWmlBb0lIUjVjR1Z2WmlCamIyNTBaWGgwTG1kbGRFVnNaVzFsYm5SelFubFVZV2RPWVcxbElDRTlQU0JjSW5WdVpHVm1hVzVsWkZ3aUlDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdZMjl1ZEdWNGRDNW5aWFJGYkdWdFpXNTBjMEo1VkdGblRtRnRaU2dnZEdGbklDazdYRzVjYmx4MFhIUmNkQzh2SUVSdlkzVnRaVzUwUm5KaFoyMWxiblFnYm05a1pYTWdaRzl1SjNRZ2FHRjJaU0JuUlVKVVRseHVYSFJjZEZ4MGZTQmxiSE5sSUdsbUlDZ2djM1Z3Y0c5eWRDNXhjMkVnS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCamIyNTBaWGgwTG5GMVpYSjVVMlZzWldOMGIzSkJiR3dvSUhSaFp5QXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMGdPbHh1WEc1Y2RGeDBablZ1WTNScGIyNG9JSFJoWnl3Z1kyOXVkR1Y0ZENBcElIdGNibHgwWEhSY2RIWmhjaUJsYkdWdExGeHVYSFJjZEZ4MFhIUjBiWEFnUFNCYlhTeGNibHgwWEhSY2RGeDBhU0E5SURBc1hHNWNkRngwWEhSY2RDOHZJRUo1SUdoaGNIQjVJR052YVc1amFXUmxibU5sTENCaElDaGljbTlyWlc0cElHZEZRbFJPSUdGd2NHVmhjbk1nYjI0Z1JHOWpkVzFsYm5SR2NtRm5iV1Z1ZENCdWIyUmxjeUIwYjI5Y2JseDBYSFJjZEZ4MGNtVnpkV3gwY3lBOUlHTnZiblJsZUhRdVoyVjBSV3hsYldWdWRITkNlVlJoWjA1aGJXVW9JSFJoWnlBcE8xeHVYRzVjZEZ4MFhIUXZMeUJHYVd4MFpYSWdiM1YwSUhCdmMzTnBZbXhsSUdOdmJXMWxiblJ6WEc1Y2RGeDBYSFJwWmlBb0lIUmhaeUE5UFQwZ1hDSXFYQ0lnS1NCN1hHNWNkRngwWEhSY2RIZG9hV3hsSUNnZ0tHVnNaVzBnUFNCeVpYTjFiSFJ6VzJrcksxMHBJQ2tnZTF4dVhIUmNkRngwWEhSY2RHbG1JQ2dnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVNBcElIdGNibHgwWEhSY2RGeDBYSFJjZEhSdGNDNXdkWE5vS0NCbGJHVnRJQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ0Y0R0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEhKbGRIVnliaUJ5WlhOMWJIUnpPMXh1WEhSY2RIMDdYRzVjYmx4MEx5OGdRMnhoYzNOY2JseDBSWGh3Y2k1bWFXNWtXMXdpUTB4QlUxTmNJbDBnUFNCemRYQndiM0owTG1kbGRFVnNaVzFsYm5SelFubERiR0Z6YzA1aGJXVWdKaVlnWm5WdVkzUnBiMjRvSUdOc1lYTnpUbUZ0WlN3Z1kyOXVkR1Y0ZENBcElIdGNibHgwWEhScFppQW9JR1J2WTNWdFpXNTBTWE5JVkUxTUlDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHTnZiblJsZUhRdVoyVjBSV3hsYldWdWRITkNlVU5zWVhOelRtRnRaU2dnWTJ4aGMzTk9ZVzFsSUNrN1hHNWNkRngwZlZ4dVhIUjlPMXh1WEc1Y2RDOHFJRkZUUVM5dFlYUmphR1Z6VTJWc1pXTjBiM0pjYmx4MExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFNBcUwxeHVYRzVjZEM4dklGRlRRU0JoYm1RZ2JXRjBZMmhsYzFObGJHVmpkRzl5SUhOMWNIQnZjblJjYmx4dVhIUXZMeUJ0WVhSamFHVnpVMlZzWldOMGIzSW9PbUZqZEdsMlpTa2djbVZ3YjNKMGN5Qm1ZV3h6WlNCM2FHVnVJSFJ5ZFdVZ0tFbEZPUzlQY0dWeVlTQXhNUzQxS1Z4dVhIUnlZblZuWjNsTllYUmphR1Z6SUQwZ1cxMDdYRzVjYmx4MEx5OGdjVk5oS0RwbWIyTjFjeWtnY21Wd2IzSjBjeUJtWVd4elpTQjNhR1Z1SUhSeWRXVWdLRU5vY205dFpTQXlNU2xjYmx4MEx5OGdWMlVnWVd4c2IzY2dkR2hwY3lCaVpXTmhkWE5sSUc5bUlHRWdZblZuSUdsdUlFbEZPQzg1SUhSb1lYUWdkR2h5YjNkeklHRnVJR1Z5Y205eVhHNWNkQzh2SUhkb1pXNWxkbVZ5SUdCa2IyTjFiV1Z1ZEM1aFkzUnBkbVZGYkdWdFpXNTBZQ0JwY3lCaFkyTmxjM05sWkNCdmJpQmhiaUJwWm5KaGJXVmNibHgwTHk4Z1UyOHNJSGRsSUdGc2JHOTNJRHBtYjJOMWN5QjBieUJ3WVhOeklIUm9jbTkxWjJnZ1VWTkJJR0ZzYkNCMGFHVWdkR2x0WlNCMGJ5QmhkbTlwWkNCMGFHVWdTVVVnWlhKeWIzSmNibHgwTHk4Z1UyVmxJR2gwZEhBNkx5OWlkV2R6TG1weGRXVnllUzVqYjIwdmRHbGphMlYwTHpFek16YzRYRzVjZEhKaWRXZG5lVkZUUVNBOUlGdGRPMXh1WEc1Y2RHbG1JQ2dnS0hOMWNIQnZjblF1Y1hOaElEMGdjbTVoZEdsMlpTNTBaWE4wS0NCa2IyTXVjWFZsY25sVFpXeGxZM1J2Y2tGc2JDQXBLU0FwSUh0Y2JseDBYSFF2THlCQ2RXbHNaQ0JSVTBFZ2NtVm5aWGhjYmx4MFhIUXZMeUJTWldkbGVDQnpkSEpoZEdWbmVTQmhaRzl3ZEdWa0lHWnliMjBnUkdsbFoyOGdVR1Z5YVc1cFhHNWNkRngwWVhOelpYSjBLR1oxYm1OMGFXOXVLQ0JrYVhZZ0tTQjdYRzVjZEZ4MFhIUXZMeUJUWld4bFkzUWdhWE1nYzJWMElIUnZJR1Z0Y0hSNUlITjBjbWx1WnlCdmJpQndkWEp3YjNObFhHNWNkRngwWEhRdkx5QlVhR2x6SUdseklIUnZJSFJsYzNRZ1NVVW5jeUIwY21WaGRHMWxiblFnYjJZZ2JtOTBJR1Y0Y0d4cFkybDBiSGxjYmx4MFhIUmNkQzh2SUhObGRIUnBibWNnWVNCaWIyOXNaV0Z1SUdOdmJuUmxiblFnWVhSMGNtbGlkWFJsTEZ4dVhIUmNkRngwTHk4Z2MybHVZMlVnYVhSeklIQnlaWE5sYm1ObElITm9iM1ZzWkNCaVpTQmxibTkxWjJoY2JseDBYSFJjZEM4dklHaDBkSEE2THk5aWRXZHpMbXB4ZFdWeWVTNWpiMjB2ZEdsamEyVjBMekV5TXpVNVhHNWNkRngwWEhSa2IyTkZiR1Z0TG1Gd2NHVnVaRU5vYVd4a0tDQmthWFlnS1M1cGJtNWxja2hVVFV3Z1BTQmNJanhoSUdsa1BTZGNJaUFySUdWNGNHRnVaRzhnS3lCY0lpYytQQzloUGx3aUlDdGNibHgwWEhSY2RGeDBYQ0k4YzJWc1pXTjBJR2xrUFNkY0lpQXJJR1Y0Y0dGdVpHOGdLeUJjSWkxY1hHWmRKeUJ0YzJGc2JHOTNZMkZ3ZEhWeVpUMG5KejVjSWlBclhHNWNkRngwWEhSY2RGd2lQRzl3ZEdsdmJpQnpaV3hsWTNSbFpEMG5KejQ4TDI5d2RHbHZiajQ4TDNObGJHVmpkRDVjSWp0Y2JseHVYSFJjZEZ4MEx5OGdVM1Z3Y0c5eWREb2dTVVU0TENCUGNHVnlZU0F4TVMweE1pNHhObHh1WEhSY2RGeDBMeThnVG05MGFHbHVaeUJ6YUc5MWJHUWdZbVVnYzJWc1pXTjBaV1FnZDJobGJpQmxiWEIwZVNCemRISnBibWR6SUdadmJHeHZkeUJlUFNCdmNpQWtQU0J2Y2lBcVBWeHVYSFJjZEZ4MEx5OGdWR2hsSUhSbGMzUWdZWFIwY21saWRYUmxJRzExYzNRZ1ltVWdkVzVyYm05M2JpQnBiaUJQY0dWeVlTQmlkWFFnWENKellXWmxYQ0lnWm05eUlGZHBibEpVWEc1Y2RGeDBYSFF2THlCb2RIUndPaTh2YlhOa2JpNXRhV055YjNOdlpuUXVZMjl0TDJWdUxYVnpMMnhwWW5KaGNua3ZhV1V2YUdnME5qVXpPRGd1WVhOd2VDTmhkSFJ5YVdKMWRHVmZjMlZqZEdsdmJseHVYSFJjZEZ4MGFXWWdLQ0JrYVhZdWNYVmxjbmxUWld4bFkzUnZja0ZzYkNoY0lsdHRjMkZzYkc5M1kyRndkSFZ5WlY0OUp5ZGRYQ0lwTG14bGJtZDBhQ0FwSUh0Y2JseDBYSFJjZEZ4MGNtSjFaMmQ1VVZOQkxuQjFjMmdvSUZ3aVd5cGVKRjA5WENJZ0t5QjNhR2wwWlhOd1lXTmxJQ3NnWENJcUtEODZKeWQ4WEZ4Y0lseGNYQ0lwWENJZ0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnVTNWd2NHOXlkRG9nU1VVNFhHNWNkRngwWEhRdkx5QkNiMjlzWldGdUlHRjBkSEpwWW5WMFpYTWdZVzVrSUZ3aWRtRnNkV1ZjSWlCaGNtVWdibTkwSUhSeVpXRjBaV1FnWTI5eWNtVmpkR3g1WEc1Y2RGeDBYSFJwWmlBb0lDRmthWFl1Y1hWbGNubFRaV3hsWTNSdmNrRnNiQ2hjSWx0elpXeGxZM1JsWkYxY0lpa3ViR1Z1WjNSb0lDa2dlMXh1WEhSY2RGeDBYSFJ5WW5WblozbFJVMEV1Y0hWemFDZ2dYQ0pjWEZ4Y1cxd2lJQ3NnZDJocGRHVnpjR0ZqWlNBcklGd2lLaWcvT25aaGJIVmxmRndpSUNzZ1ltOXZiR1ZoYm5NZ0t5QmNJaWxjSWlBcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJUZFhCd2IzSjBPaUJEYUhKdmJXVThNamtzSUVGdVpISnZhV1E4TkM0eUt5d2dVMkZtWVhKcFBEY3VNQ3NzSUdsUFV6dzNMakFyTENCUWFHRnVkRzl0U2xNOE1TNDVMamNyWEc1Y2RGeDBYSFJwWmlBb0lDRmthWFl1Y1hWbGNubFRaV3hsWTNSdmNrRnNiQ2dnWENKYmFXUitQVndpSUNzZ1pYaHdZVzVrYnlBcklGd2lMVjFjSWlBcExteGxibWQwYUNBcElIdGNibHgwWEhSY2RGeDBjbUoxWjJkNVVWTkJMbkIxYzJnb1hDSitQVndpS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdWMlZpYTJsMEwwOXdaWEpoSUMwZ09tTm9aV05yWldRZ2MyaHZkV3hrSUhKbGRIVnliaUJ6Wld4bFkzUmxaQ0J2Y0hScGIyNGdaV3hsYldWdWRITmNibHgwWEhSY2RDOHZJR2gwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MMVJTTHpJd01URXZVa1ZETFdOemN6TXRjMlZzWldOMGIzSnpMVEl3TVRFd09USTVMeU5qYUdWamEyVmtYRzVjZEZ4MFhIUXZMeUJKUlRnZ2RHaHliM2R6SUdWeWNtOXlJR2hsY21VZ1lXNWtJSGRwYkd3Z2JtOTBJSE5sWlNCc1lYUmxjaUIwWlhOMGMxeHVYSFJjZEZ4MGFXWWdLQ0FoWkdsMkxuRjFaWEo1VTJWc1pXTjBiM0pCYkd3b1hDSTZZMmhsWTJ0bFpGd2lLUzVzWlc1bmRHZ2dLU0I3WEc1Y2RGeDBYSFJjZEhKaWRXZG5lVkZUUVM1d2RYTm9LRndpT21Ob1pXTnJaV1JjSWlrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRk4xY0hCdmNuUTZJRk5oWm1GeWFTQTRLeXdnYVU5VElEZ3JYRzVjZEZ4MFhIUXZMeUJvZEhSd2N6b3ZMMkoxWjNNdWQyVmlhMmwwTG05eVp5OXphRzkzWDJKMVp5NWpaMmsvYVdROU1UTTJPRFV4WEc1Y2RGeDBYSFF2THlCSmJpMXdZV2RsSUdCelpXeGxZM1J2Y2lOcFpDQnphV0pwYm1jdFkyOXRZbWx1WVhSdmNpQnpaV3hsWTNSdmNtQWdabUZwYkhOY2JseDBYSFJjZEdsbUlDZ2dJV1JwZGk1eGRXVnllVk5sYkdWamRHOXlRV3hzS0NCY0ltRWpYQ0lnS3lCbGVIQmhibVJ2SUNzZ1hDSXJLbHdpSUNrdWJHVnVaM1JvSUNrZ2UxeHVYSFJjZEZ4MFhIUnlZblZuWjNsUlUwRXVjSFZ6YUNoY0lpNGpMaXRiSzM1ZFhDSXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMHBPMXh1WEc1Y2RGeDBZWE56WlhKMEtHWjFibU4wYVc5dUtDQmthWFlnS1NCN1hHNWNkRngwWEhRdkx5QlRkWEJ3YjNKME9pQlhhVzVrYjNkeklEZ2dUbUYwYVhabElFRndjSE5jYmx4MFhIUmNkQzh2SUZSb1pTQjBlWEJsSUdGdVpDQnVZVzFsSUdGMGRISnBZblYwWlhNZ1lYSmxJSEpsYzNSeWFXTjBaV1FnWkhWeWFXNW5JQzVwYm01bGNraFVUVXdnWVhOemFXZHViV1Z1ZEZ4dVhIUmNkRngwZG1GeUlHbHVjSFYwSUQwZ1pHOWpMbU55WldGMFpVVnNaVzFsYm5Rb1hDSnBibkIxZEZ3aUtUdGNibHgwWEhSY2RHbHVjSFYwTG5ObGRFRjBkSEpwWW5WMFpTZ2dYQ0owZVhCbFhDSXNJRndpYUdsa1pHVnVYQ0lnS1R0Y2JseDBYSFJjZEdScGRpNWhjSEJsYm1SRGFHbHNaQ2dnYVc1d2RYUWdLUzV6WlhSQmRIUnlhV0oxZEdVb0lGd2libUZ0WlZ3aUxDQmNJa1JjSWlBcE8xeHVYRzVjZEZ4MFhIUXZMeUJUZFhCd2IzSjBPaUJKUlRoY2JseDBYSFJjZEM4dklFVnVabTl5WTJVZ1kyRnpaUzF6Wlc1emFYUnBkbWwwZVNCdlppQnVZVzFsSUdGMGRISnBZblYwWlZ4dVhIUmNkRngwYVdZZ0tDQmthWFl1Y1hWbGNubFRaV3hsWTNSdmNrRnNiQ2hjSWx0dVlXMWxQV1JkWENJcExteGxibWQwYUNBcElIdGNibHgwWEhSY2RGeDBjbUoxWjJkNVVWTkJMbkIxYzJnb0lGd2libUZ0WlZ3aUlDc2dkMmhwZEdWemNHRmpaU0FySUZ3aUtsc3FYaVI4SVg1ZFB6MWNJaUFwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QkdSaUF6TGpVZ0xTQTZaVzVoWW14bFpDODZaR2x6WVdKc1pXUWdZVzVrSUdocFpHUmxiaUJsYkdWdFpXNTBjeUFvYUdsa1pHVnVJR1ZzWlcxbGJuUnpJR0Z5WlNCemRHbHNiQ0JsYm1GaWJHVmtLVnh1WEhSY2RGeDBMeThnU1VVNElIUm9jbTkzY3lCbGNuSnZjaUJvWlhKbElHRnVaQ0IzYVd4c0lHNXZkQ0J6WldVZ2JHRjBaWElnZEdWemRITmNibHgwWEhSY2RHbG1JQ2dnSVdScGRpNXhkV1Z5ZVZObGJHVmpkRzl5UVd4c0tGd2lPbVZ1WVdKc1pXUmNJaWt1YkdWdVozUm9JQ2tnZTF4dVhIUmNkRngwWEhSeVluVm5aM2xSVTBFdWNIVnphQ2dnWENJNlpXNWhZbXhsWkZ3aUxDQmNJanBrYVhOaFlteGxaRndpSUNrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRTl3WlhKaElERXdMVEV4SUdSdlpYTWdibTkwSUhSb2NtOTNJRzl1SUhCdmMzUXRZMjl0YldFZ2FXNTJZV3hwWkNCd2MyVjFaRzl6WEc1Y2RGeDBYSFJrYVhZdWNYVmxjbmxUWld4bFkzUnZja0ZzYkNoY0lpb3NPbmhjSWlrN1hHNWNkRngwWEhSeVluVm5aM2xSVTBFdWNIVnphQ2hjSWl3dUtqcGNJaWs3WEc1Y2RGeDBmU2s3WEc1Y2RIMWNibHh1WEhScFppQW9JQ2h6ZFhCd2IzSjBMbTFoZEdOb1pYTlRaV3hsWTNSdmNpQTlJSEp1WVhScGRtVXVkR1Z6ZENnZ0tHMWhkR05vWlhNZ1BTQmtiMk5GYkdWdExtMWhkR05vWlhNZ2ZIeGNibHgwWEhSa2IyTkZiR1Z0TG5kbFltdHBkRTFoZEdOb1pYTlRaV3hsWTNSdmNpQjhmRnh1WEhSY2RHUnZZMFZzWlcwdWJXOTZUV0YwWTJobGMxTmxiR1ZqZEc5eUlIeDhYRzVjZEZ4MFpHOWpSV3hsYlM1dlRXRjBZMmhsYzFObGJHVmpkRzl5SUh4OFhHNWNkRngwWkc5alJXeGxiUzV0YzAxaGRHTm9aWE5UWld4bFkzUnZjaWtnS1NrZ0tTQjdYRzVjYmx4MFhIUmhjM05sY25Rb1puVnVZM1JwYjI0b0lHUnBkaUFwSUh0Y2JseDBYSFJjZEM4dklFTm9aV05ySUhSdklITmxaU0JwWmlCcGRDZHpJSEJ2YzNOcFlteGxJSFJ2SUdSdklHMWhkR05vWlhOVFpXeGxZM1J2Y2x4dVhIUmNkRngwTHk4Z2IyNGdZU0JrYVhOamIyNXVaV04wWldRZ2JtOWtaU0FvU1VVZ09TbGNibHgwWEhSY2RITjFjSEJ2Y25RdVpHbHpZMjl1Ym1WamRHVmtUV0YwWTJnZ1BTQnRZWFJqYUdWekxtTmhiR3dvSUdScGRpd2dYQ0prYVhaY0lpQXBPMXh1WEc1Y2RGeDBYSFF2THlCVWFHbHpJSE5vYjNWc1pDQm1ZV2xzSUhkcGRHZ2dZVzRnWlhoalpYQjBhVzl1WEc1Y2RGeDBYSFF2THlCSFpXTnJieUJrYjJWeklHNXZkQ0JsY25KdmNpd2djbVYwZFhKdWN5Qm1ZV3h6WlNCcGJuTjBaV0ZrWEc1Y2RGeDBYSFJ0WVhSamFHVnpMbU5oYkd3b0lHUnBkaXdnWENKYmN5RTlKeWRkT25oY0lpQXBPMXh1WEhSY2RGeDBjbUoxWjJkNVRXRjBZMmhsY3k1d2RYTm9LQ0JjSWlFOVhDSXNJSEJ6WlhWa2IzTWdLVHRjYmx4MFhIUjlLVHRjYmx4MGZWeHVYRzVjZEhKaWRXZG5lVkZUUVNBOUlISmlkV2RuZVZGVFFTNXNaVzVuZEdnZ0ppWWdibVYzSUZKbFowVjRjQ2dnY21KMVoyZDVVVk5CTG1wdmFXNG9YQ0o4WENJcElDazdYRzVjZEhKaWRXZG5lVTFoZEdOb1pYTWdQU0J5WW5WblozbE5ZWFJqYUdWekxteGxibWQwYUNBbUppQnVaWGNnVW1WblJYaHdLQ0J5WW5WblozbE5ZWFJqYUdWekxtcHZhVzRvWENKOFhDSXBJQ2s3WEc1Y2JseDBMeW9nUTI5dWRHRnBibk5jYmx4MExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFNBcUwxeHVYSFJvWVhORGIyMXdZWEpsSUQwZ2NtNWhkR2wyWlM1MFpYTjBLQ0JrYjJORmJHVnRMbU52YlhCaGNtVkViMk4xYldWdWRGQnZjMmwwYVc5dUlDazdYRzVjYmx4MEx5OGdSV3hsYldWdWRDQmpiMjUwWVdsdWN5QmhibTkwYUdWeVhHNWNkQzh2SUZCMWNuQnZjMlZtZFd4c2VTQmtiMlZ6SUc1dmRDQnBiWEJzWlcxbGJuUWdhVzVqYkhWemFYWmxJR1JsYzJObGJtUmxiblJjYmx4MEx5OGdRWE1nYVc0c0lHRnVJR1ZzWlcxbGJuUWdaRzlsY3lCdWIzUWdZMjl1ZEdGcGJpQnBkSE5sYkdaY2JseDBZMjl1ZEdGcGJuTWdQU0JvWVhORGIyMXdZWEpsSUh4OElISnVZWFJwZG1VdWRHVnpkQ2dnWkc5alJXeGxiUzVqYjI1MFlXbHVjeUFwSUQ5Y2JseDBYSFJtZFc1amRHbHZiaWdnWVN3Z1lpQXBJSHRjYmx4MFhIUmNkSFpoY2lCaFpHOTNiaUE5SUdFdWJtOWtaVlI1Y0dVZ1BUMDlJRGtnUHlCaExtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZENBNklHRXNYRzVjZEZ4MFhIUmNkR0oxY0NBOUlHSWdKaVlnWWk1d1lYSmxiblJPYjJSbE8xeHVYSFJjZEZ4MGNtVjBkWEp1SUdFZ1BUMDlJR0oxY0NCOGZDQWhJU2dnWW5Wd0lDWW1JR0oxY0M1dWIyUmxWSGx3WlNBOVBUMGdNU0FtSmlBb1hHNWNkRngwWEhSY2RHRmtiM2R1TG1OdmJuUmhhVzV6SUQ5Y2JseDBYSFJjZEZ4MFhIUmhaRzkzYmk1amIyNTBZV2x1Y3lnZ1luVndJQ2tnT2x4dVhIUmNkRngwWEhSY2RHRXVZMjl0Y0dGeVpVUnZZM1Z0Wlc1MFVHOXphWFJwYjI0Z0ppWWdZUzVqYjIxd1lYSmxSRzlqZFcxbGJuUlFiM05wZEdsdmJpZ2dZblZ3SUNrZ0ppQXhObHh1WEhSY2RGeDBLU2s3WEc1Y2RGeDBmU0E2WEc1Y2RGeDBablZ1WTNScGIyNG9JR0VzSUdJZ0tTQjdYRzVjZEZ4MFhIUnBaaUFvSUdJZ0tTQjdYRzVjZEZ4MFhIUmNkSGRvYVd4bElDZ2dLR0lnUFNCaUxuQmhjbVZ1ZEU1dlpHVXBJQ2tnZTF4dVhIUmNkRngwWEhSY2RHbG1JQ2dnWWlBOVBUMGdZU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjblZsTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEhSY2RGeDBjbVYwZFhKdUlHWmhiSE5sTzF4dVhIUmNkSDA3WEc1Y2JseDBMeW9nVTI5eWRHbHVaMXh1WEhRdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0SUNvdlhHNWNibHgwTHk4Z1JHOWpkVzFsYm5RZ2IzSmtaWElnYzI5eWRHbHVaMXh1WEhSemIzSjBUM0prWlhJZ1BTQm9ZWE5EYjIxd1lYSmxJRDljYmx4MFpuVnVZM1JwYjI0b0lHRXNJR0lnS1NCN1hHNWNibHgwWEhRdkx5QkdiR0ZuSUdadmNpQmtkWEJzYVdOaGRHVWdjbVZ0YjNaaGJGeHVYSFJjZEdsbUlDZ2dZU0E5UFQwZ1lpQXBJSHRjYmx4MFhIUmNkR2hoYzBSMWNHeHBZMkYwWlNBOUlIUnlkV1U3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdNRHRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJUYjNKMElHOXVJRzFsZEdodlpDQmxlR2x6ZEdWdVkyVWdhV1lnYjI1c2VTQnZibVVnYVc1d2RYUWdhR0Z6SUdOdmJYQmhjbVZFYjJOMWJXVnVkRkJ2YzJsMGFXOXVYRzVjZEZ4MGRtRnlJR052YlhCaGNtVWdQU0FoWVM1amIyMXdZWEpsUkc5amRXMWxiblJRYjNOcGRHbHZiaUF0SUNGaUxtTnZiWEJoY21WRWIyTjFiV1Z1ZEZCdmMybDBhVzl1TzF4dVhIUmNkR2xtSUNnZ1kyOXRjR0Z5WlNBcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCamIyMXdZWEpsTzF4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUVOaGJHTjFiR0YwWlNCd2IzTnBkR2x2YmlCcFppQmliM1JvSUdsdWNIVjBjeUJpWld4dmJtY2dkRzhnZEdobElITmhiV1VnWkc5amRXMWxiblJjYmx4MFhIUmpiMjF3WVhKbElEMGdLQ0JoTG05M2JtVnlSRzlqZFcxbGJuUWdmSHdnWVNBcElEMDlQU0FvSUdJdWIzZHVaWEpFYjJOMWJXVnVkQ0I4ZkNCaUlDa2dQMXh1WEhSY2RGeDBZUzVqYjIxd1lYSmxSRzlqZFcxbGJuUlFiM05wZEdsdmJpZ2dZaUFwSURwY2JseHVYSFJjZEZ4MEx5OGdUM1JvWlhKM2FYTmxJSGRsSUd0dWIzY2dkR2hsZVNCaGNtVWdaR2x6WTI5dWJtVmpkR1ZrWEc1Y2RGeDBYSFF4TzF4dVhHNWNkRngwTHk4Z1JHbHpZMjl1Ym1WamRHVmtJRzV2WkdWelhHNWNkRngwYVdZZ0tDQmpiMjF3WVhKbElDWWdNU0I4ZkZ4dVhIUmNkRngwS0NGemRYQndiM0owTG5OdmNuUkVaWFJoWTJobFpDQW1KaUJpTG1OdmJYQmhjbVZFYjJOMWJXVnVkRkJ2YzJsMGFXOXVLQ0JoSUNrZ1BUMDlJR052YlhCaGNtVXBJQ2tnZTF4dVhHNWNkRngwWEhRdkx5QkRhRzl2YzJVZ2RHaGxJR1pwY25OMElHVnNaVzFsYm5RZ2RHaGhkQ0JwY3lCeVpXeGhkR1ZrSUhSdklHOTFjaUJ3Y21WbVpYSnlaV1FnWkc5amRXMWxiblJjYmx4MFhIUmNkR2xtSUNnZ1lTQTlQVDBnWkc5aklIeDhJR0V1YjNkdVpYSkViMk4xYldWdWRDQTlQVDBnY0hKbFptVnljbVZrUkc5aklDWW1JR052Ym5SaGFXNXpLSEJ5WldabGNuSmxaRVJ2WXl3Z1lTa2dLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUF0TVR0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEdsbUlDZ2dZaUE5UFQwZ1pHOWpJSHg4SUdJdWIzZHVaWEpFYjJOMWJXVnVkQ0E5UFQwZ2NISmxabVZ5Y21Wa1JHOWpJQ1ltSUdOdmJuUmhhVzV6S0hCeVpXWmxjbkpsWkVSdll5d2dZaWtnS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlBeE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJOWVdsdWRHRnBiaUJ2Y21sbmFXNWhiQ0J2Y21SbGNseHVYSFJjZEZ4MGNtVjBkWEp1SUhOdmNuUkpibkIxZENBL1hHNWNkRngwWEhSY2RDZ2dhVzVrWlhoUFppZ2djMjl5ZEVsdWNIVjBMQ0JoSUNrZ0xTQnBibVJsZUU5bUtDQnpiM0owU1c1d2RYUXNJR0lnS1NBcElEcGNibHgwWEhSY2RGeDBNRHRjYmx4MFhIUjlYRzVjYmx4MFhIUnlaWFIxY200Z1kyOXRjR0Z5WlNBbUlEUWdQeUF0TVNBNklERTdYRzVjZEgwZ09seHVYSFJtZFc1amRHbHZiaWdnWVN3Z1lpQXBJSHRjYmx4MFhIUXZMeUJGZUdsMElHVmhjbXg1SUdsbUlIUm9aU0J1YjJSbGN5QmhjbVVnYVdSbGJuUnBZMkZzWEc1Y2RGeDBhV1lnS0NCaElEMDlQU0JpSUNrZ2UxeHVYSFJjZEZ4MGFHRnpSSFZ3YkdsallYUmxJRDBnZEhKMVpUdGNibHgwWEhSY2RISmxkSFZ5YmlBd08xeHVYSFJjZEgxY2JseHVYSFJjZEhaaGNpQmpkWElzWEc1Y2RGeDBYSFJwSUQwZ01DeGNibHgwWEhSY2RHRjFjQ0E5SUdFdWNHRnlaVzUwVG05a1pTeGNibHgwWEhSY2RHSjFjQ0E5SUdJdWNHRnlaVzUwVG05a1pTeGNibHgwWEhSY2RHRndJRDBnV3lCaElGMHNYRzVjZEZ4MFhIUmljQ0E5SUZzZ1lpQmRPMXh1WEc1Y2RGeDBMeThnVUdGeVpXNTBiR1Z6Y3lCdWIyUmxjeUJoY21VZ1pXbDBhR1Z5SUdSdlkzVnRaVzUwY3lCdmNpQmthWE5qYjI1dVpXTjBaV1JjYmx4MFhIUnBaaUFvSUNGaGRYQWdmSHdnSVdKMWNDQXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQmhJRDA5UFNCa2IyTWdQeUF0TVNBNlhHNWNkRngwWEhSY2RHSWdQVDA5SUdSdll5QS9JREVnT2x4dVhIUmNkRngwWEhSaGRYQWdQeUF0TVNBNlhHNWNkRngwWEhSY2RHSjFjQ0EvSURFZ09seHVYSFJjZEZ4MFhIUnpiM0owU1c1d2RYUWdQMXh1WEhSY2RGeDBYSFFvSUdsdVpHVjRUMllvSUhOdmNuUkpibkIxZEN3Z1lTQXBJQzBnYVc1a1pYaFBaaWdnYzI5eWRFbHVjSFYwTENCaUlDa2dLU0E2WEc1Y2RGeDBYSFJjZERBN1hHNWNibHgwWEhRdkx5QkpaaUIwYUdVZ2JtOWtaWE1nWVhKbElITnBZbXhwYm1kekxDQjNaU0JqWVc0Z1pHOGdZU0J4ZFdsamF5QmphR1ZqYTF4dVhIUmNkSDBnWld4elpTQnBaaUFvSUdGMWNDQTlQVDBnWW5Wd0lDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlITnBZbXhwYm1kRGFHVmpheWdnWVN3Z1lpQXBPMXh1WEhSY2RIMWNibHh1WEhSY2RDOHZJRTkwYUdWeWQybHpaU0IzWlNCdVpXVmtJR1oxYkd3Z2JHbHpkSE1nYjJZZ2RHaGxhWElnWVc1alpYTjBiM0p6SUdadmNpQmpiMjF3WVhKcGMyOXVYRzVjZEZ4MFkzVnlJRDBnWVR0Y2JseDBYSFIzYUdsc1pTQW9JQ2hqZFhJZ1BTQmpkWEl1Y0dGeVpXNTBUbTlrWlNrZ0tTQjdYRzVjZEZ4MFhIUmhjQzUxYm5Ob2FXWjBLQ0JqZFhJZ0tUdGNibHgwWEhSOVhHNWNkRngwWTNWeUlEMGdZanRjYmx4MFhIUjNhR2xzWlNBb0lDaGpkWElnUFNCamRYSXVjR0Z5Wlc1MFRtOWtaU2tnS1NCN1hHNWNkRngwWEhSaWNDNTFibk5vYVdaMEtDQmpkWElnS1R0Y2JseDBYSFI5WEc1Y2JseDBYSFF2THlCWFlXeHJJR1J2ZDI0Z2RHaGxJSFJ5WldVZ2JHOXZhMmx1WnlCbWIzSWdZU0JrYVhOamNtVndZVzVqZVZ4dVhIUmNkSGRvYVd4bElDZ2dZWEJiYVYwZ1BUMDlJR0p3VzJsZElDa2dlMXh1WEhSY2RGeDBhU3NyTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQnBJRDljYmx4MFhIUmNkQzh2SUVSdklHRWdjMmxpYkdsdVp5QmphR1ZqYXlCcFppQjBhR1VnYm05a1pYTWdhR0YyWlNCaElHTnZiVzF2YmlCaGJtTmxjM1J2Y2x4dVhIUmNkRngwYzJsaWJHbHVaME5vWldOcktDQmhjRnRwWFN3Z1luQmJhVjBnS1NBNlhHNWNibHgwWEhSY2RDOHZJRTkwYUdWeWQybHpaU0J1YjJSbGN5QnBiaUJ2ZFhJZ1pHOWpkVzFsYm5RZ2MyOXlkQ0JtYVhKemRGeHVYSFJjZEZ4MFlYQmJhVjBnUFQwOUlIQnlaV1psY25KbFpFUnZZeUEvSUMweElEcGNibHgwWEhSY2RHSndXMmxkSUQwOVBTQndjbVZtWlhKeVpXUkViMk1nUHlBeElEcGNibHgwWEhSY2REQTdYRzVjZEgwN1hHNWNibHgwY21WMGRYSnVJR1J2WXp0Y2JuMDdYRzVjYmxOcGVucHNaUzV0WVhSamFHVnpJRDBnWm5WdVkzUnBiMjRvSUdWNGNISXNJR1ZzWlcxbGJuUnpJQ2tnZTF4dVhIUnlaWFIxY200Z1UybDZlbXhsS0NCbGVIQnlMQ0J1ZFd4c0xDQnVkV3hzTENCbGJHVnRaVzUwY3lBcE8xeHVmVHRjYmx4dVUybDZlbXhsTG0xaGRHTm9aWE5UWld4bFkzUnZjaUE5SUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0JsZUhCeUlDa2dlMXh1WEhRdkx5QlRaWFFnWkc5amRXMWxiblFnZG1GeWN5QnBaaUJ1WldWa1pXUmNibHgwYVdZZ0tDQW9JR1ZzWlcwdWIzZHVaWEpFYjJOMWJXVnVkQ0I4ZkNCbGJHVnRJQ2tnSVQwOUlHUnZZM1Z0Wlc1MElDa2dlMXh1WEhSY2RITmxkRVJ2WTNWdFpXNTBLQ0JsYkdWdElDazdYRzVjZEgxY2JseHVYSFF2THlCTllXdGxJSE4xY21VZ2RHaGhkQ0JoZEhSeWFXSjFkR1VnYzJWc1pXTjBiM0p6SUdGeVpTQnhkVzkwWldSY2JseDBaWGh3Y2lBOUlHVjRjSEl1Y21Wd2JHRmpaU2dnY21GMGRISnBZblYwWlZGMWIzUmxjeXdnWENJOUp5UXhKMTFjSWlBcE8xeHVYRzVjZEdsbUlDZ2djM1Z3Y0c5eWRDNXRZWFJqYUdWelUyVnNaV04wYjNJZ0ppWWdaRzlqZFcxbGJuUkpjMGhVVFV3Z0ppWmNibHgwWEhRb0lDRnlZblZuWjNsTllYUmphR1Z6SUh4OElDRnlZblZuWjNsTllYUmphR1Z6TG5SbGMzUW9JR1Y0Y0hJZ0tTQXBJQ1ltWEc1Y2RGeDBLQ0FoY21KMVoyZDVVVk5CSUNBZ0lDQjhmQ0FoY21KMVoyZDVVVk5CTG5SbGMzUW9JR1Y0Y0hJZ0tTQXBJQ2tnZTF4dVhHNWNkRngwZEhKNUlIdGNibHgwWEhSY2RIWmhjaUJ5WlhRZ1BTQnRZWFJqYUdWekxtTmhiR3dvSUdWc1pXMHNJR1Y0Y0hJZ0tUdGNibHh1WEhSY2RGeDBMeThnU1VVZ09TZHpJRzFoZEdOb1pYTlRaV3hsWTNSdmNpQnlaWFIxY201eklHWmhiSE5sSUc5dUlHUnBjMk52Ym01bFkzUmxaQ0J1YjJSbGMxeHVYSFJjZEZ4MGFXWWdLQ0J5WlhRZ2ZId2djM1Z3Y0c5eWRDNWthWE5qYjI1dVpXTjBaV1JOWVhSamFDQjhmRnh1WEhSY2RGeDBYSFJjZEM4dklFRnpJSGRsYkd3c0lHUnBjMk52Ym01bFkzUmxaQ0J1YjJSbGN5QmhjbVVnYzJGcFpDQjBieUJpWlNCcGJpQmhJR1J2WTNWdFpXNTBYRzVjZEZ4MFhIUmNkRngwTHk4Z1puSmhaMjFsYm5RZ2FXNGdTVVVnT1Z4dVhIUmNkRngwWEhSY2RHVnNaVzB1Wkc5amRXMWxiblFnSmlZZ1pXeGxiUzVrYjJOMWJXVnVkQzV1YjJSbFZIbHdaU0FoUFQwZ01URWdLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ5WlhRN1hHNWNkRngwWEhSOVhHNWNkRngwZlNCallYUmphQ0FvWlNrZ2UzMWNibHgwZlZ4dVhHNWNkSEpsZEhWeWJpQlRhWHA2YkdVb0lHVjRjSElzSUdSdlkzVnRaVzUwTENCdWRXeHNMQ0JiSUdWc1pXMGdYU0FwTG14bGJtZDBhQ0ErSURBN1hHNTlPMXh1WEc1VGFYcDZiR1V1WTI5dWRHRnBibk1nUFNCbWRXNWpkR2x2YmlnZ1kyOXVkR1Y0ZEN3Z1pXeGxiU0FwSUh0Y2JseDBMeThnVTJWMElHUnZZM1Z0Wlc1MElIWmhjbk1nYVdZZ2JtVmxaR1ZrWEc1Y2RHbG1JQ2dnS0NCamIyNTBaWGgwTG05M2JtVnlSRzlqZFcxbGJuUWdmSHdnWTI5dWRHVjRkQ0FwSUNFOVBTQmtiMk4xYldWdWRDQXBJSHRjYmx4MFhIUnpaWFJFYjJOMWJXVnVkQ2dnWTI5dWRHVjRkQ0FwTzF4dVhIUjlYRzVjZEhKbGRIVnliaUJqYjI1MFlXbHVjeWdnWTI5dWRHVjRkQ3dnWld4bGJTQXBPMXh1ZlR0Y2JseHVVMmw2ZW14bExtRjBkSElnUFNCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnYm1GdFpTQXBJSHRjYmx4MEx5OGdVMlYwSUdSdlkzVnRaVzUwSUhaaGNuTWdhV1lnYm1WbFpHVmtYRzVjZEdsbUlDZ2dLQ0JsYkdWdExtOTNibVZ5Ukc5amRXMWxiblFnZkh3Z1pXeGxiU0FwSUNFOVBTQmtiMk4xYldWdWRDQXBJSHRjYmx4MFhIUnpaWFJFYjJOMWJXVnVkQ2dnWld4bGJTQXBPMXh1WEhSOVhHNWNibHgwZG1GeUlHWnVJRDBnUlhod2NpNWhkSFJ5U0dGdVpHeGxXeUJ1WVcxbExuUnZURzkzWlhKRFlYTmxLQ2tnWFN4Y2JseDBYSFF2THlCRWIyNG5kQ0JuWlhRZ1ptOXZiR1ZrSUdKNUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVZ2NISnZjR1Z5ZEdsbGN5QW9hbEYxWlhKNUlDTXhNemd3TnlsY2JseDBYSFIyWVd3Z1BTQm1iaUFtSmlCb1lYTlBkMjR1WTJGc2JDZ2dSWGh3Y2k1aGRIUnlTR0Z1Wkd4bExDQnVZVzFsTG5SdlRHOTNaWEpEWVhObEtDa2dLU0EvWEc1Y2RGeDBYSFJtYmlnZ1pXeGxiU3dnYm1GdFpTd2dJV1J2WTNWdFpXNTBTWE5JVkUxTUlDa2dPbHh1WEhSY2RGeDBkVzVrWldacGJtVmtPMXh1WEc1Y2RISmxkSFZ5YmlCMllXd2dJVDA5SUhWdVpHVm1hVzVsWkNBL1hHNWNkRngwZG1Gc0lEcGNibHgwWEhSemRYQndiM0owTG1GMGRISnBZblYwWlhNZ2ZId2dJV1J2WTNWdFpXNTBTWE5JVkUxTUlEOWNibHgwWEhSY2RHVnNaVzB1WjJWMFFYUjBjbWxpZFhSbEtDQnVZVzFsSUNrZ09seHVYSFJjZEZ4MEtIWmhiQ0E5SUdWc1pXMHVaMlYwUVhSMGNtbGlkWFJsVG05a1pTaHVZVzFsS1NrZ0ppWWdkbUZzTG5Od1pXTnBabWxsWkNBL1hHNWNkRngwWEhSY2RIWmhiQzUyWVd4MVpTQTZYRzVjZEZ4MFhIUmNkRzUxYkd3N1hHNTlPMXh1WEc1VGFYcDZiR1V1WlhKeWIzSWdQU0JtZFc1amRHbHZiaWdnYlhObklDa2dlMXh1WEhSMGFISnZkeUJ1WlhjZ1JYSnliM0lvSUZ3aVUzbHVkR0Y0SUdWeWNtOXlMQ0IxYm5KbFkyOW5ibWw2WldRZ1pYaHdjbVZ6YzJsdmJqb2dYQ0lnS3lCdGMyY2dLVHRjYm4wN1hHNWNiaThxS2x4dUlDb2dSRzlqZFcxbGJuUWdjMjl5ZEdsdVp5QmhibVFnY21WdGIzWnBibWNnWkhWd2JHbGpZWFJsYzF4dUlDb2dRSEJoY21GdElIdEJjbkpoZVV4cGEyVjlJSEpsYzNWc2RITmNiaUFxTDF4dVUybDZlbXhsTG5WdWFYRjFaVk52Y25RZ1BTQm1kVzVqZEdsdmJpZ2djbVZ6ZFd4MGN5QXBJSHRjYmx4MGRtRnlJR1ZzWlcwc1hHNWNkRngwWkhWd2JHbGpZWFJsY3lBOUlGdGRMRnh1WEhSY2RHb2dQU0F3TEZ4dVhIUmNkR2tnUFNBd08xeHVYRzVjZEM4dklGVnViR1Z6Y3lCM1pTQXFhMjV2ZHlvZ2QyVWdZMkZ1SUdSbGRHVmpkQ0JrZFhCc2FXTmhkR1Z6TENCaGMzTjFiV1VnZEdobGFYSWdjSEpsYzJWdVkyVmNibHgwYUdGelJIVndiR2xqWVhSbElEMGdJWE4xY0hCdmNuUXVaR1YwWldOMFJIVndiR2xqWVhSbGN6dGNibHgwYzI5eWRFbHVjSFYwSUQwZ0lYTjFjSEJ2Y25RdWMyOXlkRk4wWVdKc1pTQW1KaUJ5WlhOMWJIUnpMbk5zYVdObEtDQXdJQ2s3WEc1Y2RISmxjM1ZzZEhNdWMyOXlkQ2dnYzI5eWRFOXlaR1Z5SUNrN1hHNWNibHgwYVdZZ0tDQm9ZWE5FZFhCc2FXTmhkR1VnS1NCN1hHNWNkRngwZDJocGJHVWdLQ0FvWld4bGJTQTlJSEpsYzNWc2RITmJhU3NyWFNrZ0tTQjdYRzVjZEZ4MFhIUnBaaUFvSUdWc1pXMGdQVDA5SUhKbGMzVnNkSE5iSUdrZ1hTQXBJSHRjYmx4MFhIUmNkRngwYWlBOUlHUjFjR3hwWTJGMFpYTXVjSFZ6YUNnZ2FTQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHgwWEhSM2FHbHNaU0FvSUdvdExTQXBJSHRjYmx4MFhIUmNkSEpsYzNWc2RITXVjM0JzYVdObEtDQmtkWEJzYVdOaGRHVnpXeUJxSUYwc0lERWdLVHRjYmx4MFhIUjlYRzVjZEgxY2JseHVYSFF2THlCRGJHVmhjaUJwYm5CMWRDQmhablJsY2lCemIzSjBhVzVuSUhSdklISmxiR1ZoYzJVZ2IySnFaV04wYzF4dVhIUXZMeUJUWldVZ2FIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwycHhkV1Z5ZVM5emFYcDZiR1V2Y0hWc2JDOHlNalZjYmx4MGMyOXlkRWx1Y0hWMElEMGdiblZzYkR0Y2JseHVYSFJ5WlhSMWNtNGdjbVZ6ZFd4MGN6dGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1ZYUnBiR2wwZVNCbWRXNWpkR2x2YmlCbWIzSWdjbVYwY21sbGRtbHVaeUIwYUdVZ2RHVjRkQ0IyWVd4MVpTQnZaaUJoYmlCaGNuSmhlU0J2WmlCRVQwMGdibTlrWlhOY2JpQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOFJXeGxiV1Z1ZEgwZ1pXeGxiVnh1SUNvdlhHNW5aWFJVWlhoMElEMGdVMmw2ZW14bExtZGxkRlJsZUhRZ1BTQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwZG1GeUlHNXZaR1VzWEc1Y2RGeDBjbVYwSUQwZ1hDSmNJaXhjYmx4MFhIUnBJRDBnTUN4Y2JseDBYSFJ1YjJSbFZIbHdaU0E5SUdWc1pXMHVibTlrWlZSNWNHVTdYRzVjYmx4MGFXWWdLQ0FoYm05a1pWUjVjR1VnS1NCN1hHNWNkRngwTHk4Z1NXWWdibThnYm05a1pWUjVjR1VzSUhSb2FYTWdhWE1nWlhod1pXTjBaV1FnZEc4Z1ltVWdZVzRnWVhKeVlYbGNibHgwWEhSM2FHbHNaU0FvSUNodWIyUmxJRDBnWld4bGJWdHBLeXRkS1NBcElIdGNibHgwWEhSY2RDOHZJRVJ2SUc1dmRDQjBjbUYyWlhKelpTQmpiMjF0Wlc1MElHNXZaR1Z6WEc1Y2RGeDBYSFJ5WlhRZ0t6MGdaMlYwVkdWNGRDZ2dibTlrWlNBcE8xeHVYSFJjZEgxY2JseDBmU0JsYkhObElHbG1JQ2dnYm05a1pWUjVjR1VnUFQwOUlERWdmSHdnYm05a1pWUjVjR1VnUFQwOUlEa2dmSHdnYm05a1pWUjVjR1VnUFQwOUlERXhJQ2tnZTF4dVhIUmNkQzh2SUZWelpTQjBaWGgwUTI5dWRHVnVkQ0JtYjNJZ1pXeGxiV1Z1ZEhOY2JseDBYSFF2THlCcGJtNWxjbFJsZUhRZ2RYTmhaMlVnY21WdGIzWmxaQ0JtYjNJZ1kyOXVjMmx6ZEdWdVkza2diMllnYm1WM0lHeHBibVZ6SUNocVVYVmxjbmtnSXpFeE1UVXpLVnh1WEhSY2RHbG1JQ2dnZEhsd1pXOW1JR1ZzWlcwdWRHVjRkRU52Ym5SbGJuUWdQVDA5SUZ3aWMzUnlhVzVuWENJZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z1pXeGxiUzUwWlhoMFEyOXVkR1Z1ZER0Y2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBMeThnVkhKaGRtVnljMlVnYVhSeklHTm9hV3hrY21WdVhHNWNkRngwWEhSbWIzSWdLQ0JsYkdWdElEMGdaV3hsYlM1bWFYSnpkRU5vYVd4a095QmxiR1Z0T3lCbGJHVnRJRDBnWld4bGJTNXVaWGgwVTJsaWJHbHVaeUFwSUh0Y2JseDBYSFJjZEZ4MGNtVjBJQ3M5SUdkbGRGUmxlSFFvSUdWc1pXMGdLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjZEgwZ1pXeHpaU0JwWmlBb0lHNXZaR1ZVZVhCbElEMDlQU0F6SUh4OElHNXZaR1ZVZVhCbElEMDlQU0EwSUNrZ2UxeHVYSFJjZEhKbGRIVnliaUJsYkdWdExtNXZaR1ZXWVd4MVpUdGNibHgwZlZ4dVhIUXZMeUJFYnlCdWIzUWdhVzVqYkhWa1pTQmpiMjF0Wlc1MElHOXlJSEJ5YjJObGMzTnBibWNnYVc1emRISjFZM1JwYjI0Z2JtOWtaWE5jYmx4dVhIUnlaWFIxY200Z2NtVjBPMXh1ZlR0Y2JseHVSWGh3Y2lBOUlGTnBlbnBzWlM1elpXeGxZM1J2Y25NZ1BTQjdYRzVjYmx4MEx5OGdRMkZ1SUdKbElHRmthblZ6ZEdWa0lHSjVJSFJvWlNCMWMyVnlYRzVjZEdOaFkyaGxUR1Z1WjNSb09pQTFNQ3hjYmx4dVhIUmpjbVZoZEdWUWMyVjFaRzg2SUcxaGNtdEdkVzVqZEdsdmJpeGNibHh1WEhSdFlYUmphRG9nYldGMFkyaEZlSEJ5TEZ4dVhHNWNkR0YwZEhKSVlXNWtiR1U2SUh0OUxGeHVYRzVjZEdacGJtUTZJSHQ5TEZ4dVhHNWNkSEpsYkdGMGFYWmxPaUI3WEc1Y2RGeDBYQ0krWENJNklIc2daR2x5T2lCY0luQmhjbVZ1ZEU1dlpHVmNJaXdnWm1seWMzUTZJSFJ5ZFdVZ2ZTeGNibHgwWEhSY0lpQmNJam9nZXlCa2FYSTZJRndpY0dGeVpXNTBUbTlrWlZ3aUlIMHNYRzVjZEZ4MFhDSXJYQ0k2SUhzZ1pHbHlPaUJjSW5CeVpYWnBiM1Z6VTJsaWJHbHVaMXdpTENCbWFYSnpkRG9nZEhKMVpTQjlMRnh1WEhSY2RGd2lmbHdpT2lCN0lHUnBjam9nWENKd2NtVjJhVzkxYzFOcFlteHBibWRjSWlCOVhHNWNkSDBzWEc1Y2JseDBjSEpsUm1sc2RHVnlPaUI3WEc1Y2RGeDBYQ0pCVkZSU1hDSTZJR1oxYm1OMGFXOXVLQ0J0WVhSamFDQXBJSHRjYmx4MFhIUmNkRzFoZEdOb1d6RmRJRDBnYldGMFkyaGJNVjB1Y21Wd2JHRmpaU2dnY25WdVpYTmpZWEJsTENCbWRXNWxjMk5oY0dVZ0tUdGNibHh1WEhSY2RGeDBMeThnVFc5MlpTQjBhR1VnWjJsMlpXNGdkbUZzZFdVZ2RHOGdiV0YwWTJoYk0xMGdkMmhsZEdobGNpQnhkVzkwWldRZ2IzSWdkVzV4ZFc5MFpXUmNibHgwWEhSY2RHMWhkR05vV3pOZElEMGdLQ0J0WVhSamFGc3pYU0I4ZkNCdFlYUmphRnMwWFNCOGZDQnRZWFJqYUZzMVhTQjhmQ0JjSWx3aUlDa3VjbVZ3YkdGalpTZ2djblZ1WlhOallYQmxMQ0JtZFc1bGMyTmhjR1VnS1R0Y2JseHVYSFJjZEZ4MGFXWWdLQ0J0WVhSamFGc3lYU0E5UFQwZ1hDSitQVndpSUNrZ2UxeHVYSFJjZEZ4MFhIUnRZWFJqYUZzelhTQTlJRndpSUZ3aUlDc2diV0YwWTJoYk0xMGdLeUJjSWlCY0lqdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlHMWhkR05vTG5Oc2FXTmxLQ0F3TENBMElDazdYRzVjZEZ4MGZTeGNibHh1WEhSY2RGd2lRMGhKVEVSY0lqb2dablZ1WTNScGIyNG9JRzFoZEdOb0lDa2dlMXh1WEhSY2RGeDBMeW9nYldGMFkyaGxjeUJtY205dElHMWhkR05vUlhod2NsdGNJa05JU1V4RVhDSmRYRzVjZEZ4MFhIUmNkREVnZEhsd1pTQW9iMjVzZVh4dWRHaDhMaTR1S1Z4dVhIUmNkRngwWEhReUlIZG9ZWFFnS0dOb2FXeGtmRzltTFhSNWNHVXBYRzVjZEZ4MFhIUmNkRE1nWVhKbmRXMWxiblFnS0dWMlpXNThiMlJrZkZ4Y1pDcDhYRnhrS200b1d5c3RYVnhjWkNzcFAzd3VMaTRwWEc1Y2RGeDBYSFJjZERRZ2VHNHRZMjl0Y0c5dVpXNTBJRzltSUhodUsza2dZWEpuZFcxbGJuUWdLRnNyTFYwL1hGeGtLbTU4S1Z4dVhIUmNkRngwWEhRMUlITnBaMjRnYjJZZ2VHNHRZMjl0Y0c5dVpXNTBYRzVjZEZ4MFhIUmNkRFlnZUNCdlppQjRiaTFqYjIxd2IyNWxiblJjYmx4MFhIUmNkRngwTnlCemFXZHVJRzltSUhrdFkyOXRjRzl1Wlc1MFhHNWNkRngwWEhSY2REZ2dlU0J2WmlCNUxXTnZiWEJ2Ym1WdWRGeHVYSFJjZEZ4MEtpOWNibHgwWEhSY2RHMWhkR05vV3pGZElEMGdiV0YwWTJoYk1WMHVkRzlNYjNkbGNrTmhjMlVvS1R0Y2JseHVYSFJjZEZ4MGFXWWdLQ0J0WVhSamFGc3hYUzV6YkdsalpTZ2dNQ3dnTXlBcElEMDlQU0JjSW01MGFGd2lJQ2tnZTF4dVhIUmNkRngwWEhRdkx5QnVkR2d0S2lCeVpYRjFhWEpsY3lCaGNtZDFiV1Z1ZEZ4dVhIUmNkRngwWEhScFppQW9JQ0Z0WVhSamFGc3pYU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUlRhWHA2YkdVdVpYSnliM0lvSUcxaGRHTm9XekJkSUNrN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFF2THlCdWRXMWxjbWxqSUhnZ1lXNWtJSGtnY0dGeVlXMWxkR1Z5Y3lCbWIzSWdSWGh3Y2k1bWFXeDBaWEl1UTBoSlRFUmNibHgwWEhSY2RGeDBMeThnY21WdFpXMWlaWElnZEdoaGRDQm1ZV3h6WlM5MGNuVmxJR05oYzNRZ2NtVnpjR1ZqZEdsMlpXeDVJSFJ2SURBdk1WeHVYSFJjZEZ4MFhIUnRZWFJqYUZzMFhTQTlJQ3NvSUcxaGRHTm9XelJkSUQ4Z2JXRjBZMmhiTlYwZ0t5QW9iV0YwWTJoYk5sMGdmSHdnTVNrZ09pQXlJQ29nS0NCdFlYUmphRnN6WFNBOVBUMGdYQ0psZG1WdVhDSWdmSHdnYldGMFkyaGJNMTBnUFQwOUlGd2liMlJrWENJZ0tTQXBPMXh1WEhSY2RGeDBYSFJ0WVhSamFGczFYU0E5SUNzb0lDZ2diV0YwWTJoYk4xMGdLeUJ0WVhSamFGczRYU0FwSUh4OElHMWhkR05vV3pOZElEMDlQU0JjSW05a1pGd2lJQ2s3WEc1Y2JseDBYSFJjZEM4dklHOTBhR1Z5SUhSNWNHVnpJSEJ5YjJocFltbDBJR0Z5WjNWdFpXNTBjMXh1WEhSY2RGeDBmU0JsYkhObElHbG1JQ2dnYldGMFkyaGJNMTBnS1NCN1hHNWNkRngwWEhSY2RGTnBlbnBzWlM1bGNuSnZjaWdnYldGMFkyaGJNRjBnS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGNtVjBkWEp1SUcxaGRHTm9PMXh1WEhSY2RIMHNYRzVjYmx4MFhIUmNJbEJUUlZWRVQxd2lPaUJtZFc1amRHbHZiaWdnYldGMFkyZ2dLU0I3WEc1Y2RGeDBYSFIyWVhJZ1pYaGpaWE56TEZ4dVhIUmNkRngwWEhSMWJuRjFiM1JsWkNBOUlDRnRZWFJqYUZzMlhTQW1KaUJ0WVhSamFGc3lYVHRjYmx4dVhIUmNkRngwYVdZZ0tDQnRZWFJqYUVWNGNISmJYQ0pEU0VsTVJGd2lYUzUwWlhOMEtDQnRZWFJqYUZzd1hTQXBJQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYm5Wc2JEdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnUVdOalpYQjBJSEYxYjNSbFpDQmhjbWQxYldWdWRITWdZWE10YVhOY2JseDBYSFJjZEdsbUlDZ2diV0YwWTJoYk0xMGdLU0I3WEc1Y2RGeDBYSFJjZEcxaGRHTm9XekpkSUQwZ2JXRjBZMmhiTkYwZ2ZId2diV0YwWTJoYk5WMGdmSHdnWENKY0lqdGNibHh1WEhSY2RGeDBMeThnVTNSeWFYQWdaWGhqWlhOeklHTm9ZWEpoWTNSbGNuTWdabkp2YlNCMWJuRjFiM1JsWkNCaGNtZDFiV1Z1ZEhOY2JseDBYSFJjZEgwZ1pXeHpaU0JwWmlBb0lIVnVjWFZ2ZEdWa0lDWW1JSEp3YzJWMVpHOHVkR1Z6ZENnZ2RXNXhkVzkwWldRZ0tTQW1KbHh1WEhSY2RGeDBYSFF2THlCSFpYUWdaWGhqWlhOeklHWnliMjBnZEc5clpXNXBlbVVnS0hKbFkzVnljMmwyWld4NUtWeHVYSFJjZEZ4MFhIUW9aWGhqWlhOeklEMGdkRzlyWlc1cGVtVW9JSFZ1Y1hWdmRHVmtMQ0IwY25WbElDa3BJQ1ltWEc1Y2RGeDBYSFJjZEM4dklHRmtkbUZ1WTJVZ2RHOGdkR2hsSUc1bGVIUWdZMnh2YzJsdVp5QndZWEpsYm5Sb1pYTnBjMXh1WEhSY2RGeDBYSFFvWlhoalpYTnpJRDBnZFc1eGRXOTBaV1F1YVc1a1pYaFBaaWdnWENJcFhDSXNJSFZ1Y1hWdmRHVmtMbXhsYm1kMGFDQXRJR1Y0WTJWemN5QXBJQzBnZFc1eGRXOTBaV1F1YkdWdVozUm9LU0FwSUh0Y2JseHVYSFJjZEZ4MFhIUXZMeUJsZUdObGMzTWdhWE1nWVNCdVpXZGhkR2wyWlNCcGJtUmxlRnh1WEhSY2RGeDBYSFJ0WVhSamFGc3dYU0E5SUcxaGRHTm9XekJkTG5Oc2FXTmxLQ0F3TENCbGVHTmxjM01nS1R0Y2JseDBYSFJjZEZ4MGJXRjBZMmhiTWwwZ1BTQjFibkYxYjNSbFpDNXpiR2xqWlNnZ01Dd2daWGhqWlhOeklDazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzh2SUZKbGRIVnliaUJ2Ym14NUlHTmhjSFIxY21WeklHNWxaV1JsWkNCaWVTQjBhR1VnY0hObGRXUnZJR1pwYkhSbGNpQnRaWFJvYjJRZ0tIUjVjR1VnWVc1a0lHRnlaM1Z0Wlc1MEtWeHVYSFJjZEZ4MGNtVjBkWEp1SUcxaGRHTm9Mbk5zYVdObEtDQXdMQ0F6SUNrN1hHNWNkRngwZlZ4dVhIUjlMRnh1WEc1Y2RHWnBiSFJsY2pvZ2UxeHVYRzVjZEZ4MFhDSlVRVWRjSWpvZ1puVnVZM1JwYjI0b0lHNXZaR1ZPWVcxbFUyVnNaV04wYjNJZ0tTQjdYRzVjZEZ4MFhIUjJZWElnYm05a1pVNWhiV1VnUFNCdWIyUmxUbUZ0WlZObGJHVmpkRzl5TG5KbGNHeGhZMlVvSUhKMWJtVnpZMkZ3WlN3Z1puVnVaWE5qWVhCbElDa3VkRzlNYjNkbGNrTmhjMlVvS1R0Y2JseDBYSFJjZEhKbGRIVnliaUJ1YjJSbFRtRnRaVk5sYkdWamRHOXlJRDA5UFNCY0lpcGNJaUEvWEc1Y2RGeDBYSFJjZEdaMWJtTjBhVzl1S0NrZ2V5QnlaWFIxY200Z2RISjFaVHNnZlNBNlhHNWNkRngwWEhSY2RHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQmxiR1Z0TG01dlpHVk9ZVzFsSUNZbUlHVnNaVzB1Ym05a1pVNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tTQTlQVDBnYm05a1pVNWhiV1U3WEc1Y2RGeDBYSFJjZEgwN1hHNWNkRngwZlN4Y2JseHVYSFJjZEZ3aVEweEJVMU5jSWpvZ1puVnVZM1JwYjI0b0lHTnNZWE56VG1GdFpTQXBJSHRjYmx4MFhIUmNkSFpoY2lCd1lYUjBaWEp1SUQwZ1kyeGhjM05EWVdOb1pWc2dZMnhoYzNOT1lXMWxJQ3NnWENJZ1hDSWdYVHRjYmx4dVhIUmNkRngwY21WMGRYSnVJSEJoZEhSbGNtNGdmSHhjYmx4MFhIUmNkRngwS0hCaGRIUmxjbTRnUFNCdVpYY2dVbVZuUlhod0tDQmNJaWhlZkZ3aUlDc2dkMmhwZEdWemNHRmpaU0FySUZ3aUtWd2lJQ3NnWTJ4aGMzTk9ZVzFsSUNzZ1hDSW9YQ0lnS3lCM2FHbDBaWE53WVdObElDc2dYQ0o4SkNsY0lpQXBLU0FtSmx4dVhIUmNkRngwWEhSamJHRnpjME5oWTJobEtDQmpiR0Z6YzA1aGJXVXNJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJ3WVhSMFpYSnVMblJsYzNRb0lIUjVjR1Z2WmlCbGJHVnRMbU5zWVhOelRtRnRaU0E5UFQwZ1hDSnpkSEpwYm1kY0lpQW1KaUJsYkdWdExtTnNZWE56VG1GdFpTQjhmQ0IwZVhCbGIyWWdaV3hsYlM1blpYUkJkSFJ5YVdKMWRHVWdJVDA5SUZ3aWRXNWtaV1pwYm1Wa1hDSWdKaVlnWld4bGJTNW5aWFJCZEhSeWFXSjFkR1VvWENKamJHRnpjMXdpS1NCOGZDQmNJbHdpSUNrN1hHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RIMHNYRzVjYmx4MFhIUmNJa0ZVVkZKY0lqb2dablZ1WTNScGIyNG9JRzVoYldVc0lHOXdaWEpoZEc5eUxDQmphR1ZqYXlBcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJSEpsYzNWc2RDQTlJRk5wZW5wc1pTNWhkSFJ5S0NCbGJHVnRMQ0J1WVcxbElDazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tDQnlaWE4xYkhRZ1BUMGdiblZzYkNBcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdiM0JsY21GMGIzSWdQVDA5SUZ3aUlUMWNJanRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhScFppQW9JQ0Z2Y0dWeVlYUnZjaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RISmxjM1ZzZENBclBTQmNJbHdpTzF4dVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCdmNHVnlZWFJ2Y2lBOVBUMGdYQ0k5WENJZ1B5QnlaWE4xYkhRZ1BUMDlJR05vWldOcklEcGNibHgwWEhSY2RGeDBYSFJ2Y0dWeVlYUnZjaUE5UFQwZ1hDSWhQVndpSUQ4Z2NtVnpkV3gwSUNFOVBTQmphR1ZqYXlBNlhHNWNkRngwWEhSY2RGeDBiM0JsY21GMGIzSWdQVDA5SUZ3aVhqMWNJaUEvSUdOb1pXTnJJQ1ltSUhKbGMzVnNkQzVwYm1SbGVFOW1LQ0JqYUdWamF5QXBJRDA5UFNBd0lEcGNibHgwWEhSY2RGeDBYSFJ2Y0dWeVlYUnZjaUE5UFQwZ1hDSXFQVndpSUQ4Z1kyaGxZMnNnSmlZZ2NtVnpkV3gwTG1sdVpHVjRUMllvSUdOb1pXTnJJQ2tnUGlBdE1TQTZYRzVjZEZ4MFhIUmNkRngwYjNCbGNtRjBiM0lnUFQwOUlGd2lKRDFjSWlBL0lHTm9aV05ySUNZbUlISmxjM1ZzZEM1emJHbGpaU2dnTFdOb1pXTnJMbXhsYm1kMGFDQXBJRDA5UFNCamFHVmpheUE2WEc1Y2RGeDBYSFJjZEZ4MGIzQmxjbUYwYjNJZ1BUMDlJRndpZmoxY0lpQS9JQ2dnWENJZ1hDSWdLeUJ5WlhOMWJIUXVjbVZ3YkdGalpTZ2djbmRvYVhSbGMzQmhZMlVzSUZ3aUlGd2lJQ2tnS3lCY0lpQmNJaUFwTG1sdVpHVjRUMllvSUdOb1pXTnJJQ2tnUGlBdE1TQTZYRzVjZEZ4MFhIUmNkRngwYjNCbGNtRjBiM0lnUFQwOUlGd2lmRDFjSWlBL0lISmxjM1ZzZENBOVBUMGdZMmhsWTJzZ2ZId2djbVZ6ZFd4MExuTnNhV05sS0NBd0xDQmphR1ZqYXk1c1pXNW5kR2dnS3lBeElDa2dQVDA5SUdOb1pXTnJJQ3NnWENJdFhDSWdPbHh1WEhSY2RGeDBYSFJjZEdaaGJITmxPMXh1WEhSY2RGeDBmVHRjYmx4MFhIUjlMRnh1WEc1Y2RGeDBYQ0pEU0VsTVJGd2lPaUJtZFc1amRHbHZiaWdnZEhsd1pTd2dkMmhoZEN3Z1lYSm5kVzFsYm5Rc0lHWnBjbk4wTENCc1lYTjBJQ2tnZTF4dVhIUmNkRngwZG1GeUlITnBiWEJzWlNBOUlIUjVjR1V1YzJ4cFkyVW9JREFzSURNZ0tTQWhQVDBnWENKdWRHaGNJaXhjYmx4MFhIUmNkRngwWm05eWQyRnlaQ0E5SUhSNWNHVXVjMnhwWTJVb0lDMDBJQ2tnSVQwOUlGd2liR0Z6ZEZ3aUxGeHVYSFJjZEZ4MFhIUnZabFI1Y0dVZ1BTQjNhR0YwSUQwOVBTQmNJbTltTFhSNWNHVmNJanRjYmx4dVhIUmNkRngwY21WMGRYSnVJR1pwY25OMElEMDlQU0F4SUNZbUlHeGhjM1FnUFQwOUlEQWdQMXh1WEc1Y2RGeDBYSFJjZEM4dklGTm9iM0owWTNWMElHWnZjaUE2Ym5Sb0xTb29iaWxjYmx4MFhIUmNkRngwWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUNFaFpXeGxiUzV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwWEhSOUlEcGNibHh1WEhSY2RGeDBYSFJtZFc1amRHbHZiaWdnWld4bGJTd2dZMjl1ZEdWNGRDd2dlRzFzSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCallXTm9aU3dnYjNWMFpYSkRZV05vWlN3Z2JtOWtaU3dnWkdsbVppd2dibTlrWlVsdVpHVjRMQ0J6ZEdGeWRDeGNibHgwWEhSY2RGeDBYSFJjZEdScGNpQTlJSE5wYlhCc1pTQWhQVDBnWm05eWQyRnlaQ0EvSUZ3aWJtVjRkRk5wWW14cGJtZGNJaUE2SUZ3aWNISmxkbWx2ZFhOVGFXSnNhVzVuWENJc1hHNWNkRngwWEhSY2RGeDBYSFJ3WVhKbGJuUWdQU0JsYkdWdExuQmhjbVZ1ZEU1dlpHVXNYRzVjZEZ4MFhIUmNkRngwWEhSdVlXMWxJRDBnYjJaVWVYQmxJQ1ltSUdWc1pXMHVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1N4Y2JseDBYSFJjZEZ4MFhIUmNkSFZ6WlVOaFkyaGxJRDBnSVhodGJDQW1KaUFoYjJaVWVYQmxPMXh1WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0J3WVhKbGJuUWdLU0I3WEc1Y2JseDBYSFJjZEZ4MFhIUmNkQzh2SURvb1ptbHljM1I4YkdGemRIeHZibXg1S1Mwb1kyaHBiR1I4YjJZdGRIbHdaU2xjYmx4MFhIUmNkRngwWEhSY2RHbG1JQ2dnYzJsdGNHeGxJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFIzYUdsc1pTQW9JR1JwY2lBcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUnViMlJsSUQwZ1pXeGxiVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFIzYUdsc1pTQW9JQ2h1YjJSbElEMGdibTlrWlZzZ1pHbHlJRjBwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBhV1lnS0NCdlpsUjVjR1VnUHlCdWIyUmxMbTV2WkdWT1lXMWxMblJ2VEc5M1pYSkRZWE5sS0NrZ1BUMDlJRzVoYldVZ09pQnViMlJsTG01dlpHVlVlWEJsSUQwOVBTQXhJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200Z1ptRnNjMlU3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDOHZJRkpsZG1WeWMyVWdaR2x5WldOMGFXOXVJR1p2Y2lBNmIyNXNlUzBxSUNocFppQjNaU0JvWVhabGJpZDBJSGxsZENCa2IyNWxJSE52S1Z4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEhOMFlYSjBJRDBnWkdseUlEMGdkSGx3WlNBOVBUMGdYQ0p2Ym14NVhDSWdKaVlnSVhOMFlYSjBJQ1ltSUZ3aWJtVjRkRk5wWW14cGJtZGNJanRjYmx4MFhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEZ4MGMzUmhjblFnUFNCYklHWnZjbmRoY21RZ1B5QndZWEpsYm5RdVptbHljM1JEYUdsc1pDQTZJSEJoY21WdWRDNXNZWE4wUTJocGJHUWdYVHRjYmx4dVhIUmNkRngwWEhSY2RGeDBMeThnYm05dUxYaHRiQ0E2Ym5Sb0xXTm9hV3hrS0M0dUxpa2djM1J2Y21WeklHTmhZMmhsSUdSaGRHRWdiMjRnWUhCaGNtVnVkR0JjYmx4MFhIUmNkRngwWEhSY2RHbG1JQ2dnWm05eWQyRnlaQ0FtSmlCMWMyVkRZV05vWlNBcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MEx5OGdVMlZsYXlCZ1pXeGxiV0FnWm5KdmJTQmhJSEJ5WlhacGIzVnpiSGt0WTJGamFHVmtJR2x1WkdWNFhHNWNkRngwWEhSY2RGeDBYSFJjZEc5MWRHVnlRMkZqYUdVZ1BTQndZWEpsYm5SYklHVjRjR0Z1Wkc4Z1hTQjhmQ0FvY0dGeVpXNTBXeUJsZUhCaGJtUnZJRjBnUFNCN2ZTazdYRzVjZEZ4MFhIUmNkRngwWEhSY2RHTmhZMmhsSUQwZ2IzVjBaWEpEWVdOb1pWc2dkSGx3WlNCZElIeDhJRnRkTzF4dVhIUmNkRngwWEhSY2RGeDBYSFJ1YjJSbFNXNWtaWGdnUFNCallXTm9aVnN3WFNBOVBUMGdaR2x5Y25WdWN5QW1KaUJqWVdOb1pWc3hYVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBaR2xtWmlBOUlHTmhZMmhsV3pCZElEMDlQU0JrYVhKeWRXNXpJQ1ltSUdOaFkyaGxXekpkTzF4dVhIUmNkRngwWEhSY2RGeDBYSFJ1YjJSbElEMGdibTlrWlVsdVpHVjRJQ1ltSUhCaGNtVnVkQzVqYUdsc1pFNXZaR1Z6V3lCdWIyUmxTVzVrWlhnZ1hUdGNibHh1WEhSY2RGeDBYSFJjZEZ4MFhIUjNhR2xzWlNBb0lDaHViMlJsSUQwZ0t5dHViMlJsU1c1a1pYZ2dKaVlnYm05a1pTQW1KaUJ1YjJSbFd5QmthWElnWFNCOGZGeHVYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBMeThnUm1Gc2JHSmhZMnNnZEc4Z2MyVmxhMmx1WnlCZ1pXeGxiV0FnWm5KdmJTQjBhR1VnYzNSaGNuUmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUW9aR2xtWmlBOUlHNXZaR1ZKYm1SbGVDQTlJREFwSUh4OElITjBZWEowTG5CdmNDZ3BLU0FwSUh0Y2JseHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDOHZJRmRvWlc0Z1ptOTFibVFzSUdOaFkyaGxJR2x1WkdWNFpYTWdiMjRnWUhCaGNtVnVkR0FnWVc1a0lHSnlaV0ZyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDQnViMlJsTG01dlpHVlVlWEJsSUQwOVBTQXhJQ1ltSUNzclpHbG1aaUFtSmlCdWIyUmxJRDA5UFNCbGJHVnRJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MGIzVjBaWEpEWVdOb1pWc2dkSGx3WlNCZElEMGdXeUJrYVhKeWRXNXpMQ0J1YjJSbFNXNWtaWGdzSUdScFptWWdYVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdKeVpXRnJPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEZ4MFhIUXZMeUJWYzJVZ2NISmxkbWx2ZFhOc2VTMWpZV05vWldRZ1pXeGxiV1Z1ZENCcGJtUmxlQ0JwWmlCaGRtRnBiR0ZpYkdWY2JseDBYSFJjZEZ4MFhIUmNkSDBnWld4elpTQnBaaUFvSUhWelpVTmhZMmhsSUNZbUlDaGpZV05vWlNBOUlDaGxiR1Z0V3lCbGVIQmhibVJ2SUYwZ2ZId2dLR1ZzWlcxYklHVjRjR0Z1Wkc4Z1hTQTlJSHQ5S1NsYklIUjVjR1VnWFNrZ0ppWWdZMkZqYUdWYk1GMGdQVDA5SUdScGNuSjFibk1nS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEdScFptWWdQU0JqWVdOb1pWc3hYVHRjYmx4dVhIUmNkRngwWEhSY2RGeDBMeThnZUcxc0lEcHVkR2d0WTJocGJHUW9MaTR1S1NCdmNpQTZiblJvTFd4aGMzUXRZMmhwYkdRb0xpNHVLU0J2Y2lBNmJuUm9LQzFzWVhOMEtUOHRiMll0ZEhsd1pTZ3VMaTRwWEc1Y2RGeDBYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhRdkx5QlZjMlVnZEdobElITmhiV1VnYkc5dmNDQmhjeUJoWW05MlpTQjBieUJ6WldWcklHQmxiR1Z0WUNCbWNtOXRJSFJvWlNCemRHRnlkRnh1WEhSY2RGeDBYSFJjZEZ4MFhIUjNhR2xzWlNBb0lDaHViMlJsSUQwZ0t5dHViMlJsU1c1a1pYZ2dKaVlnYm05a1pTQW1KaUJ1YjJSbFd5QmthWElnWFNCOGZGeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDaGthV1ptSUQwZ2JtOWtaVWx1WkdWNElEMGdNQ2tnZkh3Z2MzUmhjblF1Y0c5d0tDa3BJQ2tnZTF4dVhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGFXWWdLQ0FvSUc5bVZIbHdaU0EvSUc1dlpHVXVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1NBOVBUMGdibUZ0WlNBNklHNXZaR1V1Ym05a1pWUjVjR1VnUFQwOUlERWdLU0FtSmlBcksyUnBabVlnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUXZMeUJEWVdOb1pTQjBhR1VnYVc1a1pYZ2diMllnWldGamFDQmxibU52ZFc1MFpYSmxaQ0JsYkdWdFpXNTBYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJwWmlBb0lIVnpaVU5oWTJobElDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRb2JtOWtaVnNnWlhod1lXNWtieUJkSUh4OElDaHViMlJsV3lCbGVIQmhibVJ2SUYwZ1BTQjdmU2twV3lCMGVYQmxJRjBnUFNCYklHUnBjbkoxYm5Nc0lHUnBabVlnWFR0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDQnViMlJsSUQwOVBTQmxiR1Z0SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJpY21WaGF6dGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEZ4MEx5OGdTVzVqYjNKd2IzSmhkR1VnZEdobElHOW1abk5sZEN3Z2RHaGxiaUJqYUdWamF5QmhaMkZwYm5OMElHTjVZMnhsSUhOcGVtVmNibHgwWEhSY2RGeDBYSFJjZEdScFptWWdMVDBnYkdGemREdGNibHgwWEhSY2RGeDBYSFJjZEhKbGRIVnliaUJrYVdabUlEMDlQU0JtYVhKemRDQjhmQ0FvSUdScFptWWdKU0JtYVhKemRDQTlQVDBnTUNBbUppQmthV1ptSUM4Z1ptbHljM1FnUGowZ01DQXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZUdGNibHgwWEhSOUxGeHVYRzVjZEZ4MFhDSlFVMFZWUkU5Y0lqb2dablZ1WTNScGIyNG9JSEJ6WlhWa2J5d2dZWEpuZFcxbGJuUWdLU0I3WEc1Y2RGeDBYSFF2THlCd2MyVjFaRzh0WTJ4aGMzTWdibUZ0WlhNZ1lYSmxJR05oYzJVdGFXNXpaVzV6YVhScGRtVmNibHgwWEhSY2RDOHZJR2gwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MMVJTTDNObGJHVmpkRzl5Y3k4amNITmxkV1J2TFdOc1lYTnpaWE5jYmx4MFhIUmNkQzh2SUZCeWFXOXlhWFJwZW1VZ1lua2dZMkZ6WlNCelpXNXphWFJwZG1sMGVTQnBiaUJqWVhObElHTjFjM1J2YlNCd2MyVjFaRzl6SUdGeVpTQmhaR1JsWkNCM2FYUm9JSFZ3Y0dWeVkyRnpaU0JzWlhSMFpYSnpYRzVjZEZ4MFhIUXZMeUJTWlcxbGJXSmxjaUIwYUdGMElITmxkRVpwYkhSbGNuTWdhVzVvWlhKcGRITWdabkp2YlNCd2MyVjFaRzl6WEc1Y2RGeDBYSFIyWVhJZ1lYSm5jeXhjYmx4MFhIUmNkRngwWm00Z1BTQkZlSEJ5TG5CelpYVmtiM05iSUhCelpYVmtieUJkSUh4OElFVjRjSEl1YzJWMFJtbHNkR1Z5YzFzZ2NITmxkV1J2TG5SdlRHOTNaWEpEWVhObEtDa2dYU0I4ZkZ4dVhIUmNkRngwWEhSY2RGTnBlbnBzWlM1bGNuSnZjaWdnWENKMWJuTjFjSEJ2Y25SbFpDQndjMlYxWkc4NklGd2lJQ3NnY0hObGRXUnZJQ2s3WEc1Y2JseDBYSFJjZEM4dklGUm9aU0IxYzJWeUlHMWhlU0IxYzJVZ1kzSmxZWFJsVUhObGRXUnZJSFJ2SUdsdVpHbGpZWFJsSUhSb1lYUmNibHgwWEhSY2RDOHZJR0Z5WjNWdFpXNTBjeUJoY21VZ2JtVmxaR1ZrSUhSdklHTnlaV0YwWlNCMGFHVWdabWxzZEdWeUlHWjFibU4wYVc5dVhHNWNkRngwWEhRdkx5QnFkWE4wSUdGeklGTnBlbnBzWlNCa2IyVnpYRzVjZEZ4MFhIUnBaaUFvSUdadVd5QmxlSEJoYm1SdklGMGdLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJtYmlnZ1lYSm5kVzFsYm5RZ0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnUW5WMElHMWhhVzUwWVdsdUlITjFjSEJ2Y25RZ1ptOXlJRzlzWkNCemFXZHVZWFIxY21WelhHNWNkRngwWEhScFppQW9JR1p1TG14bGJtZDBhQ0ErSURFZ0tTQjdYRzVjZEZ4MFhIUmNkR0Z5WjNNZ1BTQmJJSEJ6WlhWa2J5d2djSE5sZFdSdkxDQmNJbHdpTENCaGNtZDFiV1Z1ZENCZE8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1JYaHdjaTV6WlhSR2FXeDBaWEp6TG1oaGMwOTNibEJ5YjNCbGNuUjVLQ0J3YzJWMVpHOHVkRzlNYjNkbGNrTmhjMlVvS1NBcElEOWNibHgwWEhSY2RGeDBYSFJ0WVhKclJuVnVZM1JwYjI0b1puVnVZM1JwYjI0b0lITmxaV1FzSUcxaGRHTm9aWE1nS1NCN1hHNWNkRngwWEhSY2RGeDBYSFIyWVhJZ2FXUjRMRnh1WEhSY2RGeDBYSFJjZEZ4MFhIUnRZWFJqYUdWa0lEMGdabTRvSUhObFpXUXNJR0Z5WjNWdFpXNTBJQ2tzWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkR2tnUFNCdFlYUmphR1ZrTG14bGJtZDBhRHRjYmx4MFhIUmNkRngwWEhSY2RIZG9hV3hsSUNnZ2FTMHRJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJwWkhnZ1BTQnBibVJsZUU5bUtDQnpaV1ZrTENCdFlYUmphR1ZrVzJsZElDazdYRzVjZEZ4MFhIUmNkRngwWEhSY2RITmxaV1JiSUdsa2VDQmRJRDBnSVNnZ2JXRjBZMmhsYzFzZ2FXUjRJRjBnUFNCdFlYUmphR1ZrVzJsZElDazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBmU2tnT2x4dVhIUmNkRngwWEhSY2RHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVJR1p1S0NCbGJHVnRMQ0F3TENCaGNtZHpJQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlHWnVPMXh1WEhSY2RIMWNibHgwZlN4Y2JseHVYSFJ3YzJWMVpHOXpPaUI3WEc1Y2RGeDBMeThnVUc5MFpXNTBhV0ZzYkhrZ1kyOXRjR3hsZUNCd2MyVjFaRzl6WEc1Y2RGeDBYQ0p1YjNSY0lqb2diV0Z5YTBaMWJtTjBhVzl1S0daMWJtTjBhVzl1S0NCelpXeGxZM1J2Y2lBcElIdGNibHgwWEhSY2RDOHZJRlJ5YVcwZ2RHaGxJSE5sYkdWamRHOXlJSEJoYzNObFpDQjBieUJqYjIxd2FXeGxYRzVjZEZ4MFhIUXZMeUIwYnlCaGRtOXBaQ0IwY21WaGRHbHVaeUJzWldGa2FXNW5JR0Z1WkNCMGNtRnBiR2x1WjF4dVhIUmNkRngwTHk4Z2MzQmhZMlZ6SUdGeklHTnZiV0pwYm1GMGIzSnpYRzVjZEZ4MFhIUjJZWElnYVc1d2RYUWdQU0JiWFN4Y2JseDBYSFJjZEZ4MGNtVnpkV3gwY3lBOUlGdGRMRnh1WEhSY2RGeDBYSFJ0WVhSamFHVnlJRDBnWTI5dGNHbHNaU2dnYzJWc1pXTjBiM0l1Y21Wd2JHRmpaU2dnY25SeWFXMHNJRndpSkRGY0lpQXBJQ2s3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUJ0WVhSamFHVnlXeUJsZUhCaGJtUnZJRjBnUDF4dVhIUmNkRngwWEhSdFlYSnJSblZ1WTNScGIyNG9ablZ1WTNScGIyNG9JSE5sWldRc0lHMWhkR05vWlhNc0lHTnZiblJsZUhRc0lIaHRiQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnWld4bGJTeGNibHgwWEhSY2RGeDBYSFJjZEhWdWJXRjBZMmhsWkNBOUlHMWhkR05vWlhJb0lITmxaV1FzSUc1MWJHd3NJSGh0YkN3Z1cxMGdLU3hjYmx4MFhIUmNkRngwWEhSY2RHa2dQU0J6WldWa0xteGxibWQwYUR0Y2JseHVYSFJjZEZ4MFhIUmNkQzh2SUUxaGRHTm9JR1ZzWlcxbGJuUnpJSFZ1YldGMFkyaGxaQ0JpZVNCZ2JXRjBZMmhsY21CY2JseDBYSFJjZEZ4MFhIUjNhR2xzWlNBb0lHa3RMU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNnZ0tHVnNaVzBnUFNCMWJtMWhkR05vWldSYmFWMHBJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJ6WldWa1cybGRJRDBnSVNodFlYUmphR1Z6VzJsZElEMGdaV3hsYlNrN1hHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlLU0E2WEc1Y2RGeDBYSFJjZEdaMWJtTjBhVzl1S0NCbGJHVnRMQ0JqYjI1MFpYaDBMQ0I0Yld3Z0tTQjdYRzVjZEZ4MFhIUmNkRngwYVc1d2RYUmJNRjBnUFNCbGJHVnRPMXh1WEhSY2RGeDBYSFJjZEcxaGRHTm9aWElvSUdsdWNIVjBMQ0J1ZFd4c0xDQjRiV3dzSUhKbGMzVnNkSE1nS1R0Y2JseDBYSFJjZEZ4MFhIUXZMeUJFYjI0bmRDQnJaV1Z3SUhSb1pTQmxiR1Z0Wlc1MElDaHBjM04xWlNBak1qazVLVnh1WEhSY2RGeDBYSFJjZEdsdWNIVjBXekJkSUQwZ2JuVnNiRHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnSVhKbGMzVnNkSE11Y0c5d0tDazdYRzVjZEZ4MFhIUmNkSDA3WEc1Y2RGeDBmU2tzWEc1Y2JseDBYSFJjSW1oaGMxd2lPaUJ0WVhKclJuVnVZM1JwYjI0b1puVnVZM1JwYjI0b0lITmxiR1ZqZEc5eUlDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1UybDZlbXhsS0NCelpXeGxZM1J2Y2l3Z1pXeGxiU0FwTG14bGJtZDBhQ0ErSURBN1hHNWNkRngwWEhSOU8xeHVYSFJjZEgwcExGeHVYRzVjZEZ4MFhDSmpiMjUwWVdsdWMxd2lPaUJ0WVhKclJuVnVZM1JwYjI0b1puVnVZM1JwYjI0b0lIUmxlSFFnS1NCN1hHNWNkRngwWEhSMFpYaDBJRDBnZEdWNGRDNXlaWEJzWVdObEtDQnlkVzVsYzJOaGNHVXNJR1oxYm1WelkyRndaU0FwTzF4dVhIUmNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdLQ0JsYkdWdExuUmxlSFJEYjI1MFpXNTBJSHg4SUdWc1pXMHVhVzV1WlhKVVpYaDBJSHg4SUdkbGRGUmxlSFFvSUdWc1pXMGdLU0FwTG1sdVpHVjRUMllvSUhSbGVIUWdLU0ErSUMweE8xeHVYSFJjZEZ4MGZUdGNibHgwWEhSOUtTeGNibHh1WEhSY2RDOHZJRndpVjJobGRHaGxjaUJoYmlCbGJHVnRaVzUwSUdseklISmxjSEpsYzJWdWRHVmtJR0o1SUdFZ09teGhibWNvS1NCelpXeGxZM1J2Y2x4dVhIUmNkQzh2SUdseklHSmhjMlZrSUhOdmJHVnNlU0J2YmlCMGFHVWdaV3hsYldWdWRDZHpJR3hoYm1kMVlXZGxJSFpoYkhWbFhHNWNkRngwTHk4Z1ltVnBibWNnWlhGMVlXd2dkRzhnZEdobElHbGtaVzUwYVdacFpYSWdReXhjYmx4MFhIUXZMeUJ2Y2lCaVpXZHBibTVwYm1jZ2QybDBhQ0IwYUdVZ2FXUmxiblJwWm1sbGNpQkRJR2x0YldWa2FXRjBaV3g1SUdadmJHeHZkMlZrSUdKNUlGd2lMVndpTGx4dVhIUmNkQzh2SUZSb1pTQnRZWFJqYUdsdVp5QnZaaUJESUdGbllXbHVjM1FnZEdobElHVnNaVzFsYm5RbmN5QnNZVzVuZFdGblpTQjJZV3gxWlNCcGN5QndaWEptYjNKdFpXUWdZMkZ6WlMxcGJuTmxibk5wZEdsMlpXeDVMbHh1WEhSY2RDOHZJRlJvWlNCcFpHVnVkR2xtYVdWeUlFTWdaRzlsY3lCdWIzUWdhR0YyWlNCMGJ5QmlaU0JoSUhaaGJHbGtJR3hoYm1kMVlXZGxJRzVoYldVdVhDSmNibHgwWEhRdkx5Qm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OVVVaTl6Wld4bFkzUnZjbk12STJ4aGJtY3RjSE5sZFdSdlhHNWNkRngwWENKc1lXNW5YQ0k2SUcxaGNtdEdkVzVqZEdsdmJpZ2dablZ1WTNScGIyNG9JR3hoYm1jZ0tTQjdYRzVjZEZ4MFhIUXZMeUJzWVc1bklIWmhiSFZsSUcxMWMzUWdZbVVnWVNCMllXeHBaQ0JwWkdWdWRHbG1hV1Z5WEc1Y2RGeDBYSFJwWmlBb0lDRnlhV1JsYm5ScFptbGxjaTUwWlhOMEtHeGhibWNnZkh3Z1hDSmNJaWtnS1NCN1hHNWNkRngwWEhSY2RGTnBlbnBzWlM1bGNuSnZjaWdnWENKMWJuTjFjSEJ2Y25SbFpDQnNZVzVuT2lCY0lpQXJJR3hoYm1jZ0tUdGNibHgwWEhSY2RIMWNibHgwWEhSY2RHeGhibWNnUFNCc1lXNW5MbkpsY0d4aFkyVW9JSEoxYm1WelkyRndaU3dnWm5WdVpYTmpZWEJsSUNrdWRHOU1iM2RsY2tOaGMyVW9LVHRjYmx4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhSY2RGeDBkbUZ5SUdWc1pXMU1ZVzVuTzF4dVhIUmNkRngwWEhSa2J5QjdYRzVjZEZ4MFhIUmNkRngwYVdZZ0tDQW9aV3hsYlV4aGJtY2dQU0JrYjJOMWJXVnVkRWx6U0ZSTlRDQS9YRzVjZEZ4MFhIUmNkRngwWEhSbGJHVnRMbXhoYm1jZ09seHVYSFJjZEZ4MFhIUmNkRngwWld4bGJTNW5aWFJCZEhSeWFXSjFkR1VvWENKNGJXdzZiR0Z1WjF3aUtTQjhmQ0JsYkdWdExtZGxkRUYwZEhKcFluVjBaU2hjSW14aGJtZGNJaWtwSUNrZ2UxeHVYRzVjZEZ4MFhIUmNkRngwWEhSbGJHVnRUR0Z1WnlBOUlHVnNaVzFNWVc1bkxuUnZURzkzWlhKRFlYTmxLQ2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200Z1pXeGxiVXhoYm1jZ1BUMDlJR3hoYm1jZ2ZId2daV3hsYlV4aGJtY3VhVzVrWlhoUFppZ2diR0Z1WnlBcklGd2lMVndpSUNrZ1BUMDlJREE3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlJSGRvYVd4bElDZ2dLR1ZzWlcwZ1BTQmxiR1Z0TG5CaGNtVnVkRTV2WkdVcElDWW1JR1ZzWlcwdWJtOWtaVlI1Y0dVZ1BUMDlJREVnS1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdaaGJITmxPMXh1WEhSY2RGeDBmVHRjYmx4MFhIUjlLU3hjYmx4dVhIUmNkQzh2SUUxcGMyTmxiR3hoYm1WdmRYTmNibHgwWEhSY0luUmhjbWRsZEZ3aU9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhSY2RIWmhjaUJvWVhOb0lEMGdkMmx1Wkc5M0xteHZZMkYwYVc5dUlDWW1JSGRwYm1SdmR5NXNiMk5oZEdsdmJpNW9ZWE5vTzF4dVhIUmNkRngwY21WMGRYSnVJR2hoYzJnZ0ppWWdhR0Z6YUM1emJHbGpaU2dnTVNBcElEMDlQU0JsYkdWdExtbGtPMXh1WEhSY2RIMHNYRzVjYmx4MFhIUmNJbkp2YjNSY0lqb2dablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z1pXeGxiU0E5UFQwZ1pHOWpSV3hsYlR0Y2JseDBYSFI5TEZ4dVhHNWNkRngwWENKbWIyTjFjMXdpT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJsYkdWdElEMDlQU0JrYjJOMWJXVnVkQzVoWTNScGRtVkZiR1Z0Wlc1MElDWW1JQ2doWkc5amRXMWxiblF1YUdGelJtOWpkWE1nZkh3Z1pHOWpkVzFsYm5RdWFHRnpSbTlqZFhNb0tTa2dKaVlnSVNFb1pXeGxiUzUwZVhCbElIeDhJR1ZzWlcwdWFISmxaaUI4ZkNCK1pXeGxiUzUwWVdKSmJtUmxlQ2s3WEc1Y2RGeDBmU3hjYmx4dVhIUmNkQzh2SUVKdmIyeGxZVzRnY0hKdmNHVnlkR2xsYzF4dVhIUmNkRndpWlc1aFlteGxaRndpT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJsYkdWdExtUnBjMkZpYkdWa0lEMDlQU0JtWVd4elpUdGNibHgwWEhSOUxGeHVYRzVjZEZ4MFhDSmthWE5oWW14bFpGd2lPaUJtZFc1amRHbHZiaWdnWld4bGJTQXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQmxiR1Z0TG1ScGMyRmliR1ZrSUQwOVBTQjBjblZsTzF4dVhIUmNkSDBzWEc1Y2JseDBYSFJjSW1Ob1pXTnJaV1JjSWpvZ1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN1hHNWNkRngwWEhRdkx5QkpiaUJEVTFNekxDQTZZMmhsWTJ0bFpDQnphRzkxYkdRZ2NtVjBkWEp1SUdKdmRHZ2dZMmhsWTJ0bFpDQmhibVFnYzJWc1pXTjBaV1FnWld4bGJXVnVkSE5jYmx4MFhIUmNkQzh2SUdoMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0x6SXdNVEV2VWtWRExXTnpjek10YzJWc1pXTjBiM0p6TFRJd01URXdPVEk1THlOamFHVmphMlZrWEc1Y2RGeDBYSFIyWVhJZ2JtOWtaVTVoYldVZ1BTQmxiR1Z0TG01dlpHVk9ZVzFsTG5SdlRHOTNaWEpEWVhObEtDazdYRzVjZEZ4MFhIUnlaWFIxY200Z0tHNXZaR1ZPWVcxbElEMDlQU0JjSW1sdWNIVjBYQ0lnSmlZZ0lTRmxiR1Z0TG1Ob1pXTnJaV1FwSUh4OElDaHViMlJsVG1GdFpTQTlQVDBnWENKdmNIUnBiMjVjSWlBbUppQWhJV1ZzWlcwdWMyVnNaV04wWldRcE8xeHVYSFJjZEgwc1hHNWNibHgwWEhSY0luTmxiR1ZqZEdWa1hDSTZJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dlMXh1WEhSY2RGeDBMeThnUVdOalpYTnphVzVuSUhSb2FYTWdjSEp2Y0dWeWRIa2diV0ZyWlhNZ2MyVnNaV04wWldRdFlua3RaR1ZtWVhWc2RGeHVYSFJjZEZ4MEx5OGdiM0IwYVc5dWN5QnBiaUJUWVdaaGNta2dkMjl5YXlCd2NtOXdaWEpzZVZ4dVhIUmNkRngwYVdZZ0tDQmxiR1Z0TG5CaGNtVnVkRTV2WkdVZ0tTQjdYRzVjZEZ4MFhIUmNkR1ZzWlcwdWNHRnlaVzUwVG05a1pTNXpaV3hsWTNSbFpFbHVaR1Y0TzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnWld4bGJTNXpaV3hsWTNSbFpDQTlQVDBnZEhKMVpUdGNibHgwWEhSOUxGeHVYRzVjZEZ4MEx5OGdRMjl1ZEdWdWRITmNibHgwWEhSY0ltVnRjSFI1WENJNklHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2UxeHVYSFJjZEZ4MEx5OGdhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZWRkl2YzJWc1pXTjBiM0p6THlObGJYQjBlUzF3YzJWMVpHOWNibHgwWEhSY2RDOHZJRHBsYlhCMGVTQnBjeUJ1WldkaGRHVmtJR0o1SUdWc1pXMWxiblFnS0RFcElHOXlJR052Ym5SbGJuUWdibTlrWlhNZ0tIUmxlSFE2SURNN0lHTmtZWFJoT2lBME95QmxiblJwZEhrZ2NtVm1PaUExS1N4Y2JseDBYSFJjZEM4dklDQWdZblYwSUc1dmRDQmllU0J2ZEdobGNuTWdLR052YlcxbGJuUTZJRGc3SUhCeWIyTmxjM05wYm1jZ2FXNXpkSEoxWTNScGIyNDZJRGM3SUdWMFl5NHBYRzVjZEZ4MFhIUXZMeUJ1YjJSbFZIbHdaU0E4SURZZ2QyOXlhM01nWW1WallYVnpaU0JoZEhSeWFXSjFkR1Z6SUNneUtTQmtieUJ1YjNRZ1lYQndaV0Z5SUdGeklHTm9hV3hrY21WdVhHNWNkRngwWEhSbWIzSWdLQ0JsYkdWdElEMGdaV3hsYlM1bWFYSnpkRU5vYVd4a095QmxiR1Z0T3lCbGJHVnRJRDBnWld4bGJTNXVaWGgwVTJsaWJHbHVaeUFwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0JsYkdWdExtNXZaR1ZVZVhCbElEd2dOaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z1ptRnNjMlU3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseDBYSFJjZEhKbGRIVnliaUIwY25WbE8xeHVYSFJjZEgwc1hHNWNibHgwWEhSY0luQmhjbVZ1ZEZ3aU9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhSY2RISmxkSFZ5YmlBaFJYaHdjaTV3YzJWMVpHOXpXMXdpWlcxd2RIbGNJbDBvSUdWc1pXMGdLVHRjYmx4MFhIUjlMRnh1WEc1Y2RGeDBMeThnUld4bGJXVnVkQzlwYm5CMWRDQjBlWEJsYzF4dVhIUmNkRndpYUdWaFpHVnlYQ0k2SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJSEpvWldGa1pYSXVkR1Z6ZENnZ1pXeGxiUzV1YjJSbFRtRnRaU0FwTzF4dVhIUmNkSDBzWEc1Y2JseDBYSFJjSW1sdWNIVjBYQ0k2SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJSEpwYm5CMWRITXVkR1Z6ZENnZ1pXeGxiUzV1YjJSbFRtRnRaU0FwTzF4dVhIUmNkSDBzWEc1Y2JseDBYSFJjSW1KMWRIUnZibHdpT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUh0Y2JseDBYSFJjZEhaaGNpQnVZVzFsSUQwZ1pXeGxiUzV1YjJSbFRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncE8xeHVYSFJjZEZ4MGNtVjBkWEp1SUc1aGJXVWdQVDA5SUZ3aWFXNXdkWFJjSWlBbUppQmxiR1Z0TG5SNWNHVWdQVDA5SUZ3aVluVjBkRzl1WENJZ2ZId2dibUZ0WlNBOVBUMGdYQ0ppZFhSMGIyNWNJanRjYmx4MFhIUjlMRnh1WEc1Y2RGeDBYQ0owWlhoMFhDSTZJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dlMXh1WEhSY2RGeDBkbUZ5SUdGMGRISTdYRzVjZEZ4MFhIUnlaWFIxY200Z1pXeGxiUzV1YjJSbFRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElEMDlQU0JjSW1sdWNIVjBYQ0lnSmlaY2JseDBYSFJjZEZ4MFpXeGxiUzUwZVhCbElEMDlQU0JjSW5SbGVIUmNJaUFtSmx4dVhHNWNkRngwWEhSY2RDOHZJRk4xY0hCdmNuUTZJRWxGUERoY2JseDBYSFJjZEZ4MEx5OGdUbVYzSUVoVVRVdzFJR0YwZEhKcFluVjBaU0IyWVd4MVpYTWdLR1V1Wnk0c0lGd2ljMlZoY21Ob1hDSXBJR0Z3Y0dWaGNpQjNhWFJvSUdWc1pXMHVkSGx3WlNBOVBUMGdYQ0owWlhoMFhDSmNibHgwWEhSY2RGeDBLQ0FvWVhSMGNpQTlJR1ZzWlcwdVoyVjBRWFIwY21saWRYUmxLRndpZEhsd1pWd2lLU2tnUFQwZ2JuVnNiQ0I4ZkNCaGRIUnlMblJ2VEc5M1pYSkRZWE5sS0NrZ1BUMDlJRndpZEdWNGRGd2lJQ2s3WEc1Y2RGeDBmU3hjYmx4dVhIUmNkQzh2SUZCdmMybDBhVzl1TFdsdUxXTnZiR3hsWTNScGIyNWNibHgwWEhSY0ltWnBjbk4wWENJNklHTnlaV0YwWlZCdmMybDBhVzl1WVd4UWMyVjFaRzhvWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnV3lBd0lGMDdYRzVjZEZ4MGZTa3NYRzVjYmx4MFhIUmNJbXhoYzNSY0lqb2dZM0psWVhSbFVHOXphWFJwYjI1aGJGQnpaWFZrYnlobWRXNWpkR2x2YmlnZ2JXRjBZMmhKYm1SbGVHVnpMQ0JzWlc1bmRHZ2dLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdXeUJzWlc1bmRHZ2dMU0F4SUYwN1hHNWNkRngwZlNrc1hHNWNibHgwWEhSY0ltVnhYQ0k2SUdOeVpXRjBaVkJ2YzJsMGFXOXVZV3hRYzJWMVpHOG9ablZ1WTNScGIyNG9JRzFoZEdOb1NXNWtaWGhsY3l3Z2JHVnVaM1JvTENCaGNtZDFiV1Z1ZENBcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCYklHRnlaM1Z0Wlc1MElEd2dNQ0EvSUdGeVozVnRaVzUwSUNzZ2JHVnVaM1JvSURvZ1lYSm5kVzFsYm5RZ1hUdGNibHgwWEhSOUtTeGNibHh1WEhSY2RGd2laWFpsYmx3aU9pQmpjbVZoZEdWUWIzTnBkR2x2Ym1Gc1VITmxkV1J2S0daMWJtTjBhVzl1S0NCdFlYUmphRWx1WkdWNFpYTXNJR3hsYm1kMGFDQXBJSHRjYmx4MFhIUmNkSFpoY2lCcElEMGdNRHRjYmx4MFhIUmNkR1p2Y2lBb0lEc2dhU0E4SUd4bGJtZDBhRHNnYVNBclBTQXlJQ2tnZTF4dVhIUmNkRngwWEhSdFlYUmphRWx1WkdWNFpYTXVjSFZ6YUNnZ2FTQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RGeDBjbVYwZFhKdUlHMWhkR05vU1c1a1pYaGxjenRjYmx4MFhIUjlLU3hjYmx4dVhIUmNkRndpYjJSa1hDSTZJR055WldGMFpWQnZjMmwwYVc5dVlXeFFjMlYxWkc4b1puVnVZM1JwYjI0b0lHMWhkR05vU1c1a1pYaGxjeXdnYkdWdVozUm9JQ2tnZTF4dVhIUmNkRngwZG1GeUlHa2dQU0F4TzF4dVhIUmNkRngwWm05eUlDZ2dPeUJwSUR3Z2JHVnVaM1JvT3lCcElDczlJRElnS1NCN1hHNWNkRngwWEhSY2RHMWhkR05vU1c1a1pYaGxjeTV3ZFhOb0tDQnBJQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdiV0YwWTJoSmJtUmxlR1Z6TzF4dVhIUmNkSDBwTEZ4dVhHNWNkRngwWENKc2RGd2lPaUJqY21WaGRHVlFiM05wZEdsdmJtRnNVSE5sZFdSdktHWjFibU4wYVc5dUtDQnRZWFJqYUVsdVpHVjRaWE1zSUd4bGJtZDBhQ3dnWVhKbmRXMWxiblFnS1NCN1hHNWNkRngwWEhSMllYSWdhU0E5SUdGeVozVnRaVzUwSUR3Z01DQS9JR0Z5WjNWdFpXNTBJQ3NnYkdWdVozUm9JRG9nWVhKbmRXMWxiblE3WEc1Y2RGeDBYSFJtYjNJZ0tDQTdJQzB0YVNBK1BTQXdPeUFwSUh0Y2JseDBYSFJjZEZ4MGJXRjBZMmhKYm1SbGVHVnpMbkIxYzJnb0lHa2dLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkSEpsZEhWeWJpQnRZWFJqYUVsdVpHVjRaWE03WEc1Y2RGeDBmU2tzWEc1Y2JseDBYSFJjSW1kMFhDSTZJR055WldGMFpWQnZjMmwwYVc5dVlXeFFjMlYxWkc4b1puVnVZM1JwYjI0b0lHMWhkR05vU1c1a1pYaGxjeXdnYkdWdVozUm9MQ0JoY21kMWJXVnVkQ0FwSUh0Y2JseDBYSFJjZEhaaGNpQnBJRDBnWVhKbmRXMWxiblFnUENBd0lEOGdZWEpuZFcxbGJuUWdLeUJzWlc1bmRHZ2dPaUJoY21kMWJXVnVkRHRjYmx4MFhIUmNkR1p2Y2lBb0lEc2dLeXRwSUR3Z2JHVnVaM1JvT3lBcElIdGNibHgwWEhSY2RGeDBiV0YwWTJoSmJtUmxlR1Z6TG5CMWMyZ29JR2tnS1R0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEhKbGRIVnliaUJ0WVhSamFFbHVaR1Y0WlhNN1hHNWNkRngwZlNsY2JseDBmVnh1ZlR0Y2JseHVSWGh3Y2k1d2MyVjFaRzl6VzF3aWJuUm9YQ0pkSUQwZ1JYaHdjaTV3YzJWMVpHOXpXMXdpWlhGY0lsMDdYRzVjYmk4dklFRmtaQ0JpZFhSMGIyNHZhVzV3ZFhRZ2RIbHdaU0J3YzJWMVpHOXpYRzVtYjNJZ0tDQnBJR2x1SUhzZ2NtRmthVzg2SUhSeWRXVXNJR05vWldOclltOTRPaUIwY25WbExDQm1hV3hsT2lCMGNuVmxMQ0J3WVhOemQyOXlaRG9nZEhKMVpTd2dhVzFoWjJVNklIUnlkV1VnZlNBcElIdGNibHgwUlhod2NpNXdjMlYxWkc5eld5QnBJRjBnUFNCamNtVmhkR1ZKYm5CMWRGQnpaWFZrYnlnZ2FTQXBPMXh1ZlZ4dVptOXlJQ2dnYVNCcGJpQjdJSE4xWW0xcGREb2dkSEoxWlN3Z2NtVnpaWFE2SUhSeWRXVWdmU0FwSUh0Y2JseDBSWGh3Y2k1d2MyVjFaRzl6V3lCcElGMGdQU0JqY21WaGRHVkNkWFIwYjI1UWMyVjFaRzhvSUdrZ0tUdGNibjFjYmx4dUx5OGdSV0Z6ZVNCQlVFa2dabTl5SUdOeVpXRjBhVzVuSUc1bGR5QnpaWFJHYVd4MFpYSnpYRzVtZFc1amRHbHZiaUJ6WlhSR2FXeDBaWEp6S0NrZ2UzMWNibk5sZEVacGJIUmxjbk11Y0hKdmRHOTBlWEJsSUQwZ1JYaHdjaTVtYVd4MFpYSnpJRDBnUlhod2NpNXdjMlYxWkc5ek8xeHVSWGh3Y2k1elpYUkdhV3gwWlhKeklEMGdibVYzSUhObGRFWnBiSFJsY25Nb0tUdGNibHh1ZEc5clpXNXBlbVVnUFNCVGFYcDZiR1V1ZEc5clpXNXBlbVVnUFNCbWRXNWpkR2x2YmlnZ2MyVnNaV04wYjNJc0lIQmhjbk5sVDI1c2VTQXBJSHRjYmx4MGRtRnlJRzFoZEdOb1pXUXNJRzFoZEdOb0xDQjBiMnRsYm5Nc0lIUjVjR1VzWEc1Y2RGeDBjMjlHWVhJc0lHZHliM1Z3Y3l3Z2NISmxSbWxzZEdWeWN5eGNibHgwWEhSallXTm9aV1FnUFNCMGIydGxia05oWTJobFd5QnpaV3hsWTNSdmNpQXJJRndpSUZ3aUlGMDdYRzVjYmx4MGFXWWdLQ0JqWVdOb1pXUWdLU0I3WEc1Y2RGeDBjbVYwZFhKdUlIQmhjbk5sVDI1c2VTQS9JREFnT2lCallXTm9aV1F1YzJ4cFkyVW9JREFnS1R0Y2JseDBmVnh1WEc1Y2RITnZSbUZ5SUQwZ2MyVnNaV04wYjNJN1hHNWNkR2R5YjNWd2N5QTlJRnRkTzF4dVhIUndjbVZHYVd4MFpYSnpJRDBnUlhod2NpNXdjbVZHYVd4MFpYSTdYRzVjYmx4MGQyaHBiR1VnS0NCemIwWmhjaUFwSUh0Y2JseHVYSFJjZEM4dklFTnZiVzFoSUdGdVpDQm1hWEp6ZENCeWRXNWNibHgwWEhScFppQW9JQ0Z0WVhSamFHVmtJSHg4SUNodFlYUmphQ0E5SUhKamIyMXRZUzVsZUdWaktDQnpiMFpoY2lBcEtTQXBJSHRjYmx4MFhIUmNkR2xtSUNnZ2JXRjBZMmdnS1NCN1hHNWNkRngwWEhSY2RDOHZJRVJ2YmlkMElHTnZibk4xYldVZ2RISmhhV3hwYm1jZ1kyOXRiV0Z6SUdGeklIWmhiR2xrWEc1Y2RGeDBYSFJjZEhOdlJtRnlJRDBnYzI5R1lYSXVjMnhwWTJVb0lHMWhkR05vV3pCZExteGxibWQwYUNBcElIeDhJSE52Um1GeU8xeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MFozSnZkWEJ6TG5CMWMyZ29JQ2gwYjJ0bGJuTWdQU0JiWFNrZ0tUdGNibHgwWEhSOVhHNWNibHgwWEhSdFlYUmphR1ZrSUQwZ1ptRnNjMlU3WEc1Y2JseDBYSFF2THlCRGIyMWlhVzVoZEc5eWMxeHVYSFJjZEdsbUlDZ2dLRzFoZEdOb0lEMGdjbU52YldKcGJtRjBiM0p6TG1WNFpXTW9JSE52Um1GeUlDa3BJQ2tnZTF4dVhIUmNkRngwYldGMFkyaGxaQ0E5SUcxaGRHTm9Mbk5vYVdaMEtDazdYRzVjZEZ4MFhIUjBiMnRsYm5NdWNIVnphQ2g3WEc1Y2RGeDBYSFJjZEhaaGJIVmxPaUJ0WVhSamFHVmtMRnh1WEhSY2RGeDBYSFF2THlCRFlYTjBJR1JsYzJObGJtUmhiblFnWTI5dFltbHVZWFJ2Y25NZ2RHOGdjM0JoWTJWY2JseDBYSFJjZEZ4MGRIbHdaVG9nYldGMFkyaGJNRjB1Y21Wd2JHRmpaU2dnY25SeWFXMHNJRndpSUZ3aUlDbGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBjMjlHWVhJZ1BTQnpiMFpoY2k1emJHbGpaU2dnYldGMFkyaGxaQzVzWlc1bmRHZ2dLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJHYVd4MFpYSnpYRzVjZEZ4MFptOXlJQ2dnZEhsd1pTQnBiaUJGZUhCeUxtWnBiSFJsY2lBcElIdGNibHgwWEhSY2RHbG1JQ2dnS0cxaGRHTm9JRDBnYldGMFkyaEZlSEJ5V3lCMGVYQmxJRjB1WlhobFl5Z2djMjlHWVhJZ0tTa2dKaVlnS0NGd2NtVkdhV3gwWlhKeld5QjBlWEJsSUYwZ2ZIeGNibHgwWEhSY2RGeDBLRzFoZEdOb0lEMGdjSEpsUm1sc2RHVnljMXNnZEhsd1pTQmRLQ0J0WVhSamFDQXBLU2tnS1NCN1hHNWNkRngwWEhSY2RHMWhkR05vWldRZ1BTQnRZWFJqYUM1emFHbG1kQ2dwTzF4dVhIUmNkRngwWEhSMGIydGxibk11Y0hWemFDaDdYRzVjZEZ4MFhIUmNkRngwZG1Gc2RXVTZJRzFoZEdOb1pXUXNYRzVjZEZ4MFhIUmNkRngwZEhsd1pUb2dkSGx3WlN4Y2JseDBYSFJjZEZ4MFhIUnRZWFJqYUdWek9pQnRZWFJqYUZ4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBjMjlHWVhJZ1BTQnpiMFpoY2k1emJHbGpaU2dnYldGMFkyaGxaQzVzWlc1bmRHZ2dLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjYmx4MFhIUnBaaUFvSUNGdFlYUmphR1ZrSUNrZ2UxeHVYSFJjZEZ4MFluSmxZV3M3WEc1Y2RGeDBmVnh1WEhSOVhHNWNibHgwTHk4Z1VtVjBkWEp1SUhSb1pTQnNaVzVuZEdnZ2IyWWdkR2hsSUdsdWRtRnNhV1FnWlhoalpYTnpYRzVjZEM4dklHbG1JSGRsSjNKbElHcDFjM1FnY0dGeWMybHVaMXh1WEhRdkx5QlBkR2hsY25kcGMyVXNJSFJvY205M0lHRnVJR1Z5Y205eUlHOXlJSEpsZEhWeWJpQjBiMnRsYm5OY2JseDBjbVYwZFhKdUlIQmhjbk5sVDI1c2VTQS9YRzVjZEZ4MGMyOUdZWEl1YkdWdVozUm9JRHBjYmx4MFhIUnpiMFpoY2lBL1hHNWNkRngwWEhSVGFYcDZiR1V1WlhKeWIzSW9JSE5sYkdWamRHOXlJQ2tnT2x4dVhIUmNkRngwTHk4Z1EyRmphR1VnZEdobElIUnZhMlZ1YzF4dVhIUmNkRngwZEc5clpXNURZV05vWlNnZ2MyVnNaV04wYjNJc0lHZHliM1Z3Y3lBcExuTnNhV05sS0NBd0lDazdYRzU5TzF4dVhHNW1kVzVqZEdsdmJpQjBiMU5sYkdWamRHOXlLQ0IwYjJ0bGJuTWdLU0I3WEc1Y2RIWmhjaUJwSUQwZ01DeGNibHgwWEhSc1pXNGdQU0IwYjJ0bGJuTXViR1Z1WjNSb0xGeHVYSFJjZEhObGJHVmpkRzl5SUQwZ1hDSmNJanRjYmx4MFptOXlJQ2dnT3lCcElEd2diR1Z1T3lCcEt5c2dLU0I3WEc1Y2RGeDBjMlZzWldOMGIzSWdLejBnZEc5clpXNXpXMmxkTG5aaGJIVmxPMXh1WEhSOVhHNWNkSEpsZEhWeWJpQnpaV3hsWTNSdmNqdGNibjFjYmx4dVpuVnVZM1JwYjI0Z1lXUmtRMjl0WW1sdVlYUnZjaWdnYldGMFkyaGxjaXdnWTI5dFltbHVZWFJ2Y2l3Z1ltRnpaU0FwSUh0Y2JseDBkbUZ5SUdScGNpQTlJR052YldKcGJtRjBiM0l1WkdseUxGeHVYSFJjZEdOb1pXTnJUbTl1Uld4bGJXVnVkSE1nUFNCaVlYTmxJQ1ltSUdScGNpQTlQVDBnWENKd1lYSmxiblJPYjJSbFhDSXNYRzVjZEZ4MFpHOXVaVTVoYldVZ1BTQmtiMjVsS3lzN1hHNWNibHgwY21WMGRYSnVJR052YldKcGJtRjBiM0l1Wm1seWMzUWdQMXh1WEhSY2RDOHZJRU5vWldOcklHRm5ZV2x1YzNRZ1kyeHZjMlZ6ZENCaGJtTmxjM1J2Y2k5d2NtVmpaV1JwYm1jZ1pXeGxiV1Z1ZEZ4dVhIUmNkR1oxYm1OMGFXOXVLQ0JsYkdWdExDQmpiMjUwWlhoMExDQjRiV3dnS1NCN1hHNWNkRngwWEhSM2FHbHNaU0FvSUNobGJHVnRJRDBnWld4bGJWc2daR2x5SUYwcElDa2dlMXh1WEhSY2RGeDBYSFJwWmlBb0lHVnNaVzB1Ym05a1pWUjVjR1VnUFQwOUlERWdmSHdnWTJobFkydE9iMjVGYkdWdFpXNTBjeUFwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2JXRjBZMmhsY2lnZ1pXeGxiU3dnWTI5dWRHVjRkQ3dnZUcxc0lDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlJRHBjYmx4dVhIUmNkQzh2SUVOb1pXTnJJR0ZuWVdsdWMzUWdZV3hzSUdGdVkyVnpkRzl5TDNCeVpXTmxaR2x1WnlCbGJHVnRaVzUwYzF4dVhIUmNkR1oxYm1OMGFXOXVLQ0JsYkdWdExDQmpiMjUwWlhoMExDQjRiV3dnS1NCN1hHNWNkRngwWEhSMllYSWdiMnhrUTJGamFHVXNJRzkxZEdWeVEyRmphR1VzWEc1Y2RGeDBYSFJjZEc1bGQwTmhZMmhsSUQwZ1d5QmthWEp5ZFc1ekxDQmtiMjVsVG1GdFpTQmRPMXh1WEc1Y2RGeDBYSFF2THlCWFpTQmpZVzRuZENCelpYUWdZWEppYVhSeVlYSjVJR1JoZEdFZ2IyNGdXRTFNSUc1dlpHVnpMQ0J6YnlCMGFHVjVJR1J2YmlkMElHSmxibVZtYVhRZ1puSnZiU0JrYVhJZ1kyRmphR2x1WjF4dVhIUmNkRngwYVdZZ0tDQjRiV3dnS1NCN1hHNWNkRngwWEhSY2RIZG9hV3hsSUNnZ0tHVnNaVzBnUFNCbGJHVnRXeUJrYVhJZ1hTa2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0JsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0F4SUh4OElHTm9aV05yVG05dVJXeGxiV1Z1ZEhNZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9JRzFoZEdOb1pYSW9JR1ZzWlcwc0lHTnZiblJsZUhRc0lIaHRiQ0FwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnZEhKMVpUdGNibHgwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkSGRvYVd4bElDZ2dLR1ZzWlcwZ1BTQmxiR1Z0V3lCa2FYSWdYU2tnS1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0NCbGJHVnRMbTV2WkdWVWVYQmxJRDA5UFNBeElIeDhJR05vWldOclRtOXVSV3hsYldWdWRITWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnZkWFJsY2tOaFkyaGxJRDBnWld4bGJWc2daWGh3WVc1a2J5QmRJSHg4SUNobGJHVnRXeUJsZUhCaGJtUnZJRjBnUFNCN2ZTazdYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9JQ2h2YkdSRFlXTm9aU0E5SUc5MWRHVnlRMkZqYUdWYklHUnBjaUJkS1NBbUpseHVYSFJjZEZ4MFhIUmNkRngwWEhSdmJHUkRZV05vWlZzZ01DQmRJRDA5UFNCa2FYSnlkVzV6SUNZbUlHOXNaRU5oWTJobFd5QXhJRjBnUFQwOUlHUnZibVZPWVcxbElDa2dlMXh1WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzh2SUVGemMybG5iaUIwYnlCdVpYZERZV05vWlNCemJ5QnlaWE4xYkhSeklHSmhZMnN0Y0hKdmNHRm5ZWFJsSUhSdklIQnlaWFpwYjNWeklHVnNaVzFsYm5SelhHNWNkRngwWEhSY2RGeDBYSFJjZEhKbGRIVnliaUFvYm1WM1EyRmphR1ZiSURJZ1hTQTlJRzlzWkVOaFkyaGxXeUF5SUYwcE8xeHVYSFJjZEZ4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBMeThnVW1WMWMyVWdibVYzWTJGamFHVWdjMjhnY21WemRXeDBjeUJpWVdOckxYQnliM0JoWjJGMFpTQjBieUJ3Y21WMmFXOTFjeUJsYkdWdFpXNTBjMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUnZkWFJsY2tOaFkyaGxXeUJrYVhJZ1hTQTlJRzVsZDBOaFkyaGxPMXh1WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzh2SUVFZ2JXRjBZMmdnYldWaGJuTWdkMlVuY21VZ1pHOXVaVHNnWVNCbVlXbHNJRzFsWVc1eklIZGxJR2hoZG1VZ2RHOGdhMlZsY0NCamFHVmphMmx1WjF4dVhIUmNkRngwWEhSY2RGeDBYSFJwWmlBb0lDaHVaWGREWVdOb1pWc2dNaUJkSUQwZ2JXRjBZMmhsY2lnZ1pXeGxiU3dnWTI5dWRHVjRkQ3dnZUcxc0lDa3BJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEhKbGRIVnliaUIwY25WbE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z1pXeGxiV1Z1ZEUxaGRHTm9aWElvSUcxaGRHTm9aWEp6SUNrZ2UxeHVYSFJ5WlhSMWNtNGdiV0YwWTJobGNuTXViR1Z1WjNSb0lENGdNU0EvWEc1Y2RGeDBablZ1WTNScGIyNG9JR1ZzWlcwc0lHTnZiblJsZUhRc0lIaHRiQ0FwSUh0Y2JseDBYSFJjZEhaaGNpQnBJRDBnYldGMFkyaGxjbk11YkdWdVozUm9PMXh1WEhSY2RGeDBkMmhwYkdVZ0tDQnBMUzBnS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2dnSVcxaGRHTm9aWEp6VzJsZEtDQmxiR1Z0TENCamIyNTBaWGgwTENCNGJXd2dLU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z1ptRnNjMlU3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseDBYSFJjZEhKbGRIVnliaUIwY25WbE8xeHVYSFJjZEgwZ09seHVYSFJjZEcxaGRHTm9aWEp6V3pCZE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCdGRXeDBhWEJzWlVOdmJuUmxlSFJ6S0NCelpXeGxZM1J2Y2l3Z1kyOXVkR1Y0ZEhNc0lISmxjM1ZzZEhNZ0tTQjdYRzVjZEhaaGNpQnBJRDBnTUN4Y2JseDBYSFJzWlc0Z1BTQmpiMjUwWlhoMGN5NXNaVzVuZEdnN1hHNWNkR1p2Y2lBb0lEc2dhU0E4SUd4bGJqc2dhU3NySUNrZ2UxeHVYSFJjZEZOcGVucHNaU2dnYzJWc1pXTjBiM0lzSUdOdmJuUmxlSFJ6VzJsZExDQnlaWE4xYkhSeklDazdYRzVjZEgxY2JseDBjbVYwZFhKdUlISmxjM1ZzZEhNN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdOdmJtUmxibk5sS0NCMWJtMWhkR05vWldRc0lHMWhjQ3dnWm1sc2RHVnlMQ0JqYjI1MFpYaDBMQ0I0Yld3Z0tTQjdYRzVjZEhaaGNpQmxiR1Z0TEZ4dVhIUmNkRzVsZDFWdWJXRjBZMmhsWkNBOUlGdGRMRnh1WEhSY2RHa2dQU0F3TEZ4dVhIUmNkR3hsYmlBOUlIVnViV0YwWTJobFpDNXNaVzVuZEdnc1hHNWNkRngwYldGd2NHVmtJRDBnYldGd0lDRTlJRzUxYkd3N1hHNWNibHgwWm05eUlDZ2dPeUJwSUR3Z2JHVnVPeUJwS3lzZ0tTQjdYRzVjZEZ4MGFXWWdLQ0FvWld4bGJTQTlJSFZ1YldGMFkyaGxaRnRwWFNrZ0tTQjdYRzVjZEZ4MFhIUnBaaUFvSUNGbWFXeDBaWElnZkh3Z1ptbHNkR1Z5S0NCbGJHVnRMQ0JqYjI1MFpYaDBMQ0I0Yld3Z0tTQXBJSHRjYmx4MFhIUmNkRngwYm1WM1ZXNXRZWFJqYUdWa0xuQjFjMmdvSUdWc1pXMGdLVHRjYmx4MFhIUmNkRngwYVdZZ0tDQnRZWEJ3WldRZ0tTQjdYRzVjZEZ4MFhIUmNkRngwYldGd0xuQjFjMmdvSUdrZ0tUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHgwZlZ4dVhHNWNkSEpsZEhWeWJpQnVaWGRWYm0xaGRHTm9aV1E3WEc1OVhHNWNibVoxYm1OMGFXOXVJSE5sZEUxaGRHTm9aWElvSUhCeVpVWnBiSFJsY2l3Z2MyVnNaV04wYjNJc0lHMWhkR05vWlhJc0lIQnZjM1JHYVd4MFpYSXNJSEJ2YzNSR2FXNWtaWElzSUhCdmMzUlRaV3hsWTNSdmNpQXBJSHRjYmx4MGFXWWdLQ0J3YjNOMFJtbHNkR1Z5SUNZbUlDRndiM04wUm1sc2RHVnlXeUJsZUhCaGJtUnZJRjBnS1NCN1hHNWNkRngwY0c5emRFWnBiSFJsY2lBOUlITmxkRTFoZEdOb1pYSW9JSEJ2YzNSR2FXeDBaWElnS1R0Y2JseDBmVnh1WEhScFppQW9JSEJ2YzNSR2FXNWtaWElnSmlZZ0lYQnZjM1JHYVc1a1pYSmJJR1Y0Y0dGdVpHOGdYU0FwSUh0Y2JseDBYSFJ3YjNOMFJtbHVaR1Z5SUQwZ2MyVjBUV0YwWTJobGNpZ2djRzl6ZEVacGJtUmxjaXdnY0c5emRGTmxiR1ZqZEc5eUlDazdYRzVjZEgxY2JseDBjbVYwZFhKdUlHMWhjbXRHZFc1amRHbHZiaWhtZFc1amRHbHZiaWdnYzJWbFpDd2djbVZ6ZFd4MGN5d2dZMjl1ZEdWNGRDd2dlRzFzSUNrZ2UxeHVYSFJjZEhaaGNpQjBaVzF3TENCcExDQmxiR1Z0TEZ4dVhIUmNkRngwY0hKbFRXRndJRDBnVzEwc1hHNWNkRngwWEhSd2IzTjBUV0Z3SUQwZ1cxMHNYRzVjZEZ4MFhIUndjbVZsZUdsemRHbHVaeUE5SUhKbGMzVnNkSE11YkdWdVozUm9MRnh1WEc1Y2RGeDBYSFF2THlCSFpYUWdhVzVwZEdsaGJDQmxiR1Z0Wlc1MGN5Qm1jbTl0SUhObFpXUWdiM0lnWTI5dWRHVjRkRnh1WEhSY2RGeDBaV3hsYlhNZ1BTQnpaV1ZrSUh4OElHMTFiSFJwY0d4bFEyOXVkR1Y0ZEhNb0lITmxiR1ZqZEc5eUlIeDhJRndpS2x3aUxDQmpiMjUwWlhoMExtNXZaR1ZVZVhCbElEOGdXeUJqYjI1MFpYaDBJRjBnT2lCamIyNTBaWGgwTENCYlhTQXBMRnh1WEc1Y2RGeDBYSFF2THlCUWNtVm1hV3gwWlhJZ2RHOGdaMlYwSUcxaGRHTm9aWElnYVc1d2RYUXNJSEJ5WlhObGNuWnBibWNnWVNCdFlYQWdabTl5SUhObFpXUXRjbVZ6ZFd4MGN5QnplVzVqYUhKdmJtbDZZWFJwYjI1Y2JseDBYSFJjZEcxaGRHTm9aWEpKYmlBOUlIQnlaVVpwYkhSbGNpQW1KaUFvSUhObFpXUWdmSHdnSVhObGJHVmpkRzl5SUNrZ1AxeHVYSFJjZEZ4MFhIUmpiMjVrWlc1elpTZ2daV3hsYlhNc0lIQnlaVTFoY0N3Z2NISmxSbWxzZEdWeUxDQmpiMjUwWlhoMExDQjRiV3dnS1NBNlhHNWNkRngwWEhSY2RHVnNaVzF6TEZ4dVhHNWNkRngwWEhSdFlYUmphR1Z5VDNWMElEMGdiV0YwWTJobGNpQS9YRzVjZEZ4MFhIUmNkQzh2SUVsbUlIZGxJR2hoZG1VZ1lTQndiM04wUm1sdVpHVnlMQ0J2Y2lCbWFXeDBaWEpsWkNCelpXVmtMQ0J2Y2lCdWIyNHRjMlZsWkNCd2IzTjBSbWxzZEdWeUlHOXlJSEJ5WldWNGFYTjBhVzVuSUhKbGMzVnNkSE1zWEc1Y2RGeDBYSFJjZEhCdmMzUkdhVzVrWlhJZ2ZId2dLQ0J6WldWa0lEOGdjSEpsUm1sc2RHVnlJRG9nY0hKbFpYaHBjM1JwYm1jZ2ZId2djRzl6ZEVacGJIUmxjaUFwSUQ5Y2JseHVYSFJjZEZ4MFhIUmNkQzh2SUM0dUxtbHVkR1Z5YldWa2FXRjBaU0J3Y205alpYTnphVzVuSUdseklHNWxZMlZ6YzJGeWVWeHVYSFJjZEZ4MFhIUmNkRnRkSURwY2JseHVYSFJjZEZ4MFhIUmNkQzh2SUM0dUxtOTBhR1Z5ZDJselpTQjFjMlVnY21WemRXeDBjeUJrYVhKbFkzUnNlVnh1WEhSY2RGeDBYSFJjZEhKbGMzVnNkSE1nT2x4dVhIUmNkRngwWEhSdFlYUmphR1Z5U1c0N1hHNWNibHgwWEhRdkx5QkdhVzVrSUhCeWFXMWhjbmtnYldGMFkyaGxjMXh1WEhSY2RHbG1JQ2dnYldGMFkyaGxjaUFwSUh0Y2JseDBYSFJjZEcxaGRHTm9aWElvSUcxaGRHTm9aWEpKYml3Z2JXRjBZMmhsY2s5MWRDd2dZMjl1ZEdWNGRDd2dlRzFzSUNrN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1FYQndiSGtnY0c5emRFWnBiSFJsY2x4dVhIUmNkR2xtSUNnZ2NHOXpkRVpwYkhSbGNpQXBJSHRjYmx4MFhIUmNkSFJsYlhBZ1BTQmpiMjVrWlc1elpTZ2diV0YwWTJobGNrOTFkQ3dnY0c5emRFMWhjQ0FwTzF4dVhIUmNkRngwY0c5emRFWnBiSFJsY2lnZ2RHVnRjQ3dnVzEwc0lHTnZiblJsZUhRc0lIaHRiQ0FwTzF4dVhHNWNkRngwWEhRdkx5QlZiaTF0WVhSamFDQm1ZV2xzYVc1bklHVnNaVzFsYm5SeklHSjVJRzF2ZG1sdVp5QjBhR1Z0SUdKaFkyc2dkRzhnYldGMFkyaGxja2x1WEc1Y2RGeDBYSFJwSUQwZ2RHVnRjQzVzWlc1bmRHZzdYRzVjZEZ4MFhIUjNhR2xzWlNBb0lHa3RMU0FwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0FvWld4bGJTQTlJSFJsYlhCYmFWMHBJQ2tnZTF4dVhIUmNkRngwWEhSY2RHMWhkR05vWlhKUGRYUmJJSEJ2YzNSTllYQmJhVjBnWFNBOUlDRW9iV0YwWTJobGNrbHVXeUJ3YjNOMFRXRndXMmxkSUYwZ1BTQmxiR1Z0S1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseHVYSFJjZEdsbUlDZ2djMlZsWkNBcElIdGNibHgwWEhSY2RHbG1JQ2dnY0c5emRFWnBibVJsY2lCOGZDQndjbVZHYVd4MFpYSWdLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDZ2djRzl6ZEVacGJtUmxjaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUXZMeUJIWlhRZ2RHaGxJR1pwYm1Gc0lHMWhkR05vWlhKUGRYUWdZbmtnWTI5dVpHVnVjMmx1WnlCMGFHbHpJR2x1ZEdWeWJXVmthV0YwWlNCcGJuUnZJSEJ2YzNSR2FXNWtaWElnWTI5dWRHVjRkSE5jYmx4MFhIUmNkRngwWEhSMFpXMXdJRDBnVzEwN1hHNWNkRngwWEhSY2RGeDBhU0E5SUcxaGRHTm9aWEpQZFhRdWJHVnVaM1JvTzF4dVhIUmNkRngwWEhSY2RIZG9hV3hsSUNnZ2FTMHRJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBhV1lnS0NBb1pXeGxiU0E5SUcxaGRHTm9aWEpQZFhSYmFWMHBJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFF2THlCU1pYTjBiM0psSUcxaGRHTm9aWEpKYmlCemFXNWpaU0JsYkdWdElHbHpJRzV2ZENCNVpYUWdZU0JtYVc1aGJDQnRZWFJqYUZ4dVhIUmNkRngwWEhSY2RGeDBYSFIwWlcxd0xuQjFjMmdvSUNodFlYUmphR1Z5U1c1YmFWMGdQU0JsYkdWdEtTQXBPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSd2IzTjBSbWx1WkdWeUtDQnVkV3hzTENBb2JXRjBZMmhsY2s5MWRDQTlJRnRkS1N3Z2RHVnRjQ3dnZUcxc0lDazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhRdkx5Qk5iM1psSUcxaGRHTm9aV1FnWld4bGJXVnVkSE1nWm5KdmJTQnpaV1ZrSUhSdklISmxjM1ZzZEhNZ2RHOGdhMlZsY0NCMGFHVnRJSE41Ym1Ob2NtOXVhWHBsWkZ4dVhIUmNkRngwWEhScElEMGdiV0YwWTJobGNrOTFkQzVzWlc1bmRHZzdYRzVjZEZ4MFhIUmNkSGRvYVd4bElDZ2dhUzB0SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR2xtSUNnZ0tHVnNaVzBnUFNCdFlYUmphR1Z5VDNWMFcybGRLU0FtSmx4dVhIUmNkRngwWEhSY2RGeDBLSFJsYlhBZ1BTQndiM04wUm1sdVpHVnlJRDhnYVc1a1pYaFBaaWdnYzJWbFpDd2daV3hsYlNBcElEb2djSEpsVFdGd1cybGRLU0ErSUMweElDa2dlMXh1WEc1Y2RGeDBYSFJjZEZ4MFhIUnpaV1ZrVzNSbGJYQmRJRDBnSVNoeVpYTjFiSFJ6VzNSbGJYQmRJRDBnWld4bGJTazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNibHgwWEhRdkx5QkJaR1FnWld4bGJXVnVkSE1nZEc4Z2NtVnpkV3gwY3l3Z2RHaHliM1ZuYUNCd2IzTjBSbWx1WkdWeUlHbG1JR1JsWm1sdVpXUmNibHgwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwYldGMFkyaGxjazkxZENBOUlHTnZibVJsYm5ObEtGeHVYSFJjZEZ4MFhIUnRZWFJqYUdWeVQzVjBJRDA5UFNCeVpYTjFiSFJ6SUQ5Y2JseDBYSFJjZEZ4MFhIUnRZWFJqYUdWeVQzVjBMbk53YkdsalpTZ2djSEpsWlhocGMzUnBibWNzSUcxaGRHTm9aWEpQZFhRdWJHVnVaM1JvSUNrZ09seHVYSFJjZEZ4MFhIUmNkRzFoZEdOb1pYSlBkWFJjYmx4MFhIUmNkQ2s3WEc1Y2RGeDBYSFJwWmlBb0lIQnZjM1JHYVc1a1pYSWdLU0I3WEc1Y2RGeDBYSFJjZEhCdmMzUkdhVzVrWlhJb0lHNTFiR3dzSUhKbGMzVnNkSE1zSUcxaGRHTm9aWEpQZFhRc0lIaHRiQ0FwTzF4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwY0hWemFDNWhjSEJzZVNnZ2NtVnpkV3gwY3l3Z2JXRjBZMmhsY2s5MWRDQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHgwZlNrN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUcxaGRHTm9aWEpHY205dFZHOXJaVzV6S0NCMGIydGxibk1nS1NCN1hHNWNkSFpoY2lCamFHVmphME52Ym5SbGVIUXNJRzFoZEdOb1pYSXNJR29zWEc1Y2RGeDBiR1Z1SUQwZ2RHOXJaVzV6TG14bGJtZDBhQ3hjYmx4MFhIUnNaV0ZrYVc1blVtVnNZWFJwZG1VZ1BTQkZlSEJ5TG5KbGJHRjBhWFpsV3lCMGIydGxibk5iTUYwdWRIbHdaU0JkTEZ4dVhIUmNkR2x0Y0d4cFkybDBVbVZzWVhScGRtVWdQU0JzWldGa2FXNW5VbVZzWVhScGRtVWdmSHdnUlhod2NpNXlaV3hoZEdsMlpWdGNJaUJjSWwwc1hHNWNkRngwYVNBOUlHeGxZV1JwYm1kU1pXeGhkR2wyWlNBL0lERWdPaUF3TEZ4dVhHNWNkRngwTHk4Z1ZHaGxJR1p2ZFc1a1lYUnBiMjVoYkNCdFlYUmphR1Z5SUdWdWMzVnlaWE1nZEdoaGRDQmxiR1Z0Wlc1MGN5QmhjbVVnY21WaFkyaGhZbXhsSUdaeWIyMGdkRzl3TFd4bGRtVnNJR052Ym5SbGVIUW9jeWxjYmx4MFhIUnRZWFJqYUVOdmJuUmxlSFFnUFNCaFpHUkRiMjFpYVc1aGRHOXlLQ0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQmxiR1Z0SUQwOVBTQmphR1ZqYTBOdmJuUmxlSFE3WEc1Y2RGeDBmU3dnYVcxd2JHbGphWFJTWld4aGRHbDJaU3dnZEhKMVpTQXBMRnh1WEhSY2RHMWhkR05vUVc1NVEyOXVkR1Y0ZENBOUlHRmtaRU52YldKcGJtRjBiM0lvSUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR2x1WkdWNFQyWW9JR05vWldOclEyOXVkR1Y0ZEN3Z1pXeGxiU0FwSUQ0Z0xURTdYRzVjZEZ4MGZTd2dhVzF3YkdsamFYUlNaV3hoZEdsMlpTd2dkSEoxWlNBcExGeHVYSFJjZEcxaGRHTm9aWEp6SUQwZ1d5Qm1kVzVqZEdsdmJpZ2daV3hsYlN3Z1kyOXVkR1Y0ZEN3Z2VHMXNJQ2tnZTF4dVhIUmNkRngwZG1GeUlISmxkQ0E5SUNnZ0lXeGxZV1JwYm1kU1pXeGhkR2wyWlNBbUppQW9JSGh0YkNCOGZDQmpiMjUwWlhoMElDRTlQU0J2ZFhSbGNtMXZjM1JEYjI1MFpYaDBJQ2tnS1NCOGZDQW9YRzVjZEZ4MFhIUmNkQ2hqYUdWamEwTnZiblJsZUhRZ1BTQmpiMjUwWlhoMEtTNXViMlJsVkhsd1pTQS9YRzVjZEZ4MFhIUmNkRngwYldGMFkyaERiMjUwWlhoMEtDQmxiR1Z0TENCamIyNTBaWGgwTENCNGJXd2dLU0E2WEc1Y2RGeDBYSFJjZEZ4MGJXRjBZMmhCYm5sRGIyNTBaWGgwS0NCbGJHVnRMQ0JqYjI1MFpYaDBMQ0I0Yld3Z0tTQXBPMXh1WEhSY2RGeDBMeThnUVhadmFXUWdhR0Z1WjJsdVp5QnZiblJ2SUdWc1pXMWxiblFnS0dsemMzVmxJQ015T1RrcFhHNWNkRngwWEhSamFHVmphME52Ym5SbGVIUWdQU0J1ZFd4c08xeHVYSFJjZEZ4MGNtVjBkWEp1SUhKbGREdGNibHgwWEhSOUlGMDdYRzVjYmx4MFptOXlJQ2dnT3lCcElEd2diR1Z1T3lCcEt5c2dLU0I3WEc1Y2RGeDBhV1lnS0NBb2JXRjBZMmhsY2lBOUlFVjRjSEl1Y21Wc1lYUnBkbVZiSUhSdmEyVnVjMXRwWFM1MGVYQmxJRjBwSUNrZ2UxeHVYSFJjZEZ4MGJXRjBZMmhsY25NZ1BTQmJJR0ZrWkVOdmJXSnBibUYwYjNJb1pXeGxiV1Z1ZEUxaGRHTm9aWElvSUcxaGRHTm9aWEp6SUNrc0lHMWhkR05vWlhJcElGMDdYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEcxaGRHTm9aWElnUFNCRmVIQnlMbVpwYkhSbGNsc2dkRzlyWlc1elcybGRMblI1Y0dVZ1hTNWhjSEJzZVNnZ2JuVnNiQ3dnZEc5clpXNXpXMmxkTG0xaGRHTm9aWE1nS1R0Y2JseHVYSFJjZEZ4MEx5OGdVbVYwZFhKdUlITndaV05wWVd3Z2RYQnZiaUJ6WldWcGJtY2dZU0J3YjNOcGRHbHZibUZzSUcxaGRHTm9aWEpjYmx4MFhIUmNkR2xtSUNnZ2JXRjBZMmhsY2xzZ1pYaHdZVzVrYnlCZElDa2dlMXh1WEhSY2RGeDBYSFF2THlCR2FXNWtJSFJvWlNCdVpYaDBJSEpsYkdGMGFYWmxJRzl3WlhKaGRHOXlJQ2hwWmlCaGJua3BJR1p2Y2lCd2NtOXdaWElnYUdGdVpHeHBibWRjYmx4MFhIUmNkRngwYWlBOUlDc3JhVHRjYmx4MFhIUmNkRngwWm05eUlDZ2dPeUJxSUR3Z2JHVnVPeUJxS3lzZ0tTQjdYRzVjZEZ4MFhIUmNkRngwYVdZZ0tDQkZlSEJ5TG5KbGJHRjBhWFpsV3lCMGIydGxibk5iYWwwdWRIbHdaU0JkSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWW5KbFlXczdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCelpYUk5ZWFJqYUdWeUtGeHVYSFJjZEZ4MFhIUmNkR2tnUGlBeElDWW1JR1ZzWlcxbGJuUk5ZWFJqYUdWeUtDQnRZWFJqYUdWeWN5QXBMRnh1WEhSY2RGeDBYSFJjZEdrZ1BpQXhJQ1ltSUhSdlUyVnNaV04wYjNJb1hHNWNkRngwWEhSY2RGeDBYSFF2THlCSlppQjBhR1VnY0hKbFkyVmthVzVuSUhSdmEyVnVJSGRoY3lCaElHUmxjMk5sYm1SaGJuUWdZMjl0WW1sdVlYUnZjaXdnYVc1elpYSjBJR0Z1SUdsdGNHeHBZMmwwSUdGdWVTMWxiR1Z0Wlc1MElHQXFZRnh1WEhSY2RGeDBYSFJjZEZ4MGRHOXJaVzV6TG5Oc2FXTmxLQ0F3TENCcElDMGdNU0FwTG1OdmJtTmhkQ2g3SUhaaGJIVmxPaUIwYjJ0bGJuTmJJR2tnTFNBeUlGMHVkSGx3WlNBOVBUMGdYQ0lnWENJZ1B5QmNJaXBjSWlBNklGd2lYQ0lnZlNsY2JseDBYSFJjZEZ4MFhIUXBMbkpsY0d4aFkyVW9JSEowY21sdExDQmNJaVF4WENJZ0tTeGNibHgwWEhSY2RGeDBYSFJ0WVhSamFHVnlMRnh1WEhSY2RGeDBYSFJjZEdrZ1BDQnFJQ1ltSUcxaGRHTm9aWEpHY205dFZHOXJaVzV6S0NCMGIydGxibk11YzJ4cFkyVW9JR2tzSUdvZ0tTQXBMRnh1WEhSY2RGeDBYSFJjZEdvZ1BDQnNaVzRnSmlZZ2JXRjBZMmhsY2taeWIyMVViMnRsYm5Nb0lDaDBiMnRsYm5NZ1BTQjBiMnRsYm5NdWMyeHBZMlVvSUdvZ0tTa2dLU3hjYmx4MFhIUmNkRngwWEhScUlEd2diR1Z1SUNZbUlIUnZVMlZzWldOMGIzSW9JSFJ2YTJWdWN5QXBYRzVjZEZ4MFhIUmNkQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ0WVhSamFHVnljeTV3ZFhOb0tDQnRZWFJqYUdWeUlDazdYRzVjZEZ4MGZWeHVYSFI5WEc1Y2JseDBjbVYwZFhKdUlHVnNaVzFsYm5STllYUmphR1Z5S0NCdFlYUmphR1Z5Y3lBcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCdFlYUmphR1Z5Um5KdmJVZHliM1Z3VFdGMFkyaGxjbk1vSUdWc1pXMWxiblJOWVhSamFHVnljeXdnYzJWMFRXRjBZMmhsY25NZ0tTQjdYRzVjZEhaaGNpQmllVk5sZENBOUlITmxkRTFoZEdOb1pYSnpMbXhsYm1kMGFDQStJREFzWEc1Y2RGeDBZbmxGYkdWdFpXNTBJRDBnWld4bGJXVnVkRTFoZEdOb1pYSnpMbXhsYm1kMGFDQStJREFzWEc1Y2RGeDBjM1Z3WlhKTllYUmphR1Z5SUQwZ1puVnVZM1JwYjI0b0lITmxaV1FzSUdOdmJuUmxlSFFzSUhodGJDd2djbVZ6ZFd4MGN5d2diM1YwWlhKdGIzTjBJQ2tnZTF4dVhIUmNkRngwZG1GeUlHVnNaVzBzSUdvc0lHMWhkR05vWlhJc1hHNWNkRngwWEhSY2RHMWhkR05vWldSRGIzVnVkQ0E5SURBc1hHNWNkRngwWEhSY2RHa2dQU0JjSWpCY0lpeGNibHgwWEhSY2RGeDBkVzV0WVhSamFHVmtJRDBnYzJWbFpDQW1KaUJiWFN4Y2JseDBYSFJjZEZ4MGMyVjBUV0YwWTJobFpDQTlJRnRkTEZ4dVhIUmNkRngwWEhSamIyNTBaWGgwUW1GamEzVndJRDBnYjNWMFpYSnRiM04wUTI5dWRHVjRkQ3hjYmx4MFhIUmNkRngwTHk4Z1YyVWdiWFZ6ZENCaGJIZGhlWE1nYUdGMlpTQmxhWFJvWlhJZ2MyVmxaQ0JsYkdWdFpXNTBjeUJ2Y2lCdmRYUmxjbTF2YzNRZ1kyOXVkR1Y0ZEZ4dVhIUmNkRngwWEhSbGJHVnRjeUE5SUhObFpXUWdmSHdnWW5sRmJHVnRaVzUwSUNZbUlFVjRjSEl1Wm1sdVpGdGNJbFJCUjF3aVhTZ2dYQ0lxWENJc0lHOTFkR1Z5Ylc5emRDQXBMRnh1WEhSY2RGeDBYSFF2THlCVmMyVWdhVzUwWldkbGNpQmthWEp5ZFc1eklHbG1aaUIwYUdseklHbHpJSFJvWlNCdmRYUmxjbTF2YzNRZ2JXRjBZMmhsY2x4dVhIUmNkRngwWEhSa2FYSnlkVzV6Vlc1cGNYVmxJRDBnS0dScGNuSjFibk1nS3owZ1kyOXVkR1Y0ZEVKaFkydDFjQ0E5UFNCdWRXeHNJRDhnTVNBNklFMWhkR2d1Y21GdVpHOXRLQ2tnZkh3Z01DNHhLU3hjYmx4MFhIUmNkRngwYkdWdUlEMGdaV3hsYlhNdWJHVnVaM1JvTzF4dVhHNWNkRngwWEhScFppQW9JRzkxZEdWeWJXOXpkQ0FwSUh0Y2JseDBYSFJjZEZ4MGIzVjBaWEp0YjNOMFEyOXVkR1Y0ZENBOUlHTnZiblJsZUhRZ0lUMDlJR1J2WTNWdFpXNTBJQ1ltSUdOdmJuUmxlSFE3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklFRmtaQ0JsYkdWdFpXNTBjeUJ3WVhOemFXNW5JR1ZzWlcxbGJuUk5ZWFJqYUdWeWN5QmthWEpsWTNSc2VTQjBieUJ5WlhOMWJIUnpYRzVjZEZ4MFhIUXZMeUJMWldWd0lHQnBZQ0JoSUhOMGNtbHVaeUJwWmlCMGFHVnlaU0JoY21VZ2JtOGdaV3hsYldWdWRITWdjMjhnWUcxaGRHTm9aV1JEYjNWdWRHQWdkMmxzYkNCaVpTQmNJakF3WENJZ1ltVnNiM2RjYmx4MFhIUmNkQzh2SUZOMWNIQnZjblE2SUVsRlBEa3NJRk5oWm1GeWFWeHVYSFJjZEZ4MEx5OGdWRzlzWlhKaGRHVWdUbTlrWlV4cGMzUWdjSEp2Y0dWeWRHbGxjeUFvU1VVNklGd2liR1Z1WjNSb1hDSTdJRk5oWm1GeWFUb2dQRzUxYldKbGNqNHBJRzFoZEdOb2FXNW5JR1ZzWlcxbGJuUnpJR0o1SUdsa1hHNWNkRngwWEhSbWIzSWdLQ0E3SUdrZ0lUMDlJR3hsYmlBbUppQW9aV3hsYlNBOUlHVnNaVzF6VzJsZEtTQWhQU0J1ZFd4c095QnBLeXNnS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2dnWW5sRmJHVnRaVzUwSUNZbUlHVnNaVzBnS1NCN1hHNWNkRngwWEhSY2RGeDBhaUE5SURBN1hHNWNkRngwWEhSY2RGeDBkMmhwYkdVZ0tDQW9iV0YwWTJobGNpQTlJR1ZzWlcxbGJuUk5ZWFJqYUdWeWMxdHFLeXRkS1NBcElIdGNibHgwWEhSY2RGeDBYSFJjZEdsbUlDZ2diV0YwWTJobGNpZ2daV3hsYlN3Z1kyOXVkR1Y0ZEN3Z2VHMXNJQ2tnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEhKbGMzVnNkSE11Y0hWemFDZ2daV3hsYlNBcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSaWNtVmhhenRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0J2ZFhSbGNtMXZjM1FnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJrYVhKeWRXNXpJRDBnWkdseWNuVnVjMVZ1YVhGMVpUdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUXZMeUJVY21GamF5QjFibTFoZEdOb1pXUWdaV3hsYldWdWRITWdabTl5SUhObGRDQm1hV3gwWlhKelhHNWNkRngwWEhSY2RHbG1JQ2dnWW5sVFpYUWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MEx5OGdWR2hsZVNCM2FXeHNJR2hoZG1VZ1oyOXVaU0IwYUhKdmRXZG9JR0ZzYkNCd2IzTnphV0pzWlNCdFlYUmphR1Z5YzF4dVhIUmNkRngwWEhSY2RHbG1JQ2dnS0dWc1pXMGdQU0FoYldGMFkyaGxjaUFtSmlCbGJHVnRLU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRzFoZEdOb1pXUkRiM1Z1ZEMwdE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSY2RDOHZJRXhsYm1kMGFHVnVJSFJvWlNCaGNuSmhlU0JtYjNJZ1pYWmxjbmtnWld4bGJXVnVkQ3dnYldGMFkyaGxaQ0J2Y2lCdWIzUmNibHgwWEhSY2RGeDBYSFJwWmlBb0lITmxaV1FnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFIxYm0xaGRHTm9aV1F1Y0hWemFDZ2daV3hsYlNBcE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QkJjSEJzZVNCelpYUWdabWxzZEdWeWN5QjBieUIxYm0xaGRHTm9aV1FnWld4bGJXVnVkSE5jYmx4MFhIUmNkRzFoZEdOb1pXUkRiM1Z1ZENBclBTQnBPMXh1WEhSY2RGeDBhV1lnS0NCaWVWTmxkQ0FtSmlCcElDRTlQU0J0WVhSamFHVmtRMjkxYm5RZ0tTQjdYRzVjZEZ4MFhIUmNkR29nUFNBd08xeHVYSFJjZEZ4MFhIUjNhR2xzWlNBb0lDaHRZWFJqYUdWeUlEMGdjMlYwVFdGMFkyaGxjbk5iYWlzclhTa2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGJXRjBZMmhsY2lnZ2RXNXRZWFJqYUdWa0xDQnpaWFJOWVhSamFHVmtMQ0JqYjI1MFpYaDBMQ0I0Yld3Z0tUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEdsbUlDZ2djMlZsWkNBcElIdGNibHgwWEhSY2RGeDBYSFF2THlCU1pXbHVkR1ZuY21GMFpTQmxiR1Z0Wlc1MElHMWhkR05vWlhNZ2RHOGdaV3hwYldsdVlYUmxJSFJvWlNCdVpXVmtJR1p2Y2lCemIzSjBhVzVuWEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0J0WVhSamFHVmtRMjkxYm5RZ1BpQXdJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBkMmhwYkdVZ0tDQnBMUzBnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEdsbUlDZ2dJU2gxYm0xaGRHTm9aV1JiYVYwZ2ZId2djMlYwVFdGMFkyaGxaRnRwWFNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBjMlYwVFdGMFkyaGxaRnRwWFNBOUlIQnZjQzVqWVd4c0tDQnlaWE4xYkhSeklDazdYRzVjZEZ4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhRdkx5QkVhWE5qWVhKa0lHbHVaR1Y0SUhCc1lXTmxhRzlzWkdWeUlIWmhiSFZsY3lCMGJ5Qm5aWFFnYjI1c2VTQmhZM1IxWVd3Z2JXRjBZMmhsYzF4dVhIUmNkRngwWEhSY2RITmxkRTFoZEdOb1pXUWdQU0JqYjI1a1pXNXpaU2dnYzJWMFRXRjBZMmhsWkNBcE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwTHk4Z1FXUmtJRzFoZEdOb1pYTWdkRzhnY21WemRXeDBjMXh1WEhSY2RGeDBYSFJ3ZFhOb0xtRndjR3g1S0NCeVpYTjFiSFJ6TENCelpYUk5ZWFJqYUdWa0lDazdYRzVjYmx4MFhIUmNkRngwTHk4Z1UyVmxaR3hsYzNNZ2MyVjBJRzFoZEdOb1pYTWdjM1ZqWTJWbFpHbHVaeUJ0ZFd4MGFYQnNaU0J6ZFdOalpYTnpablZzSUcxaGRHTm9aWEp6SUhOMGFYQjFiR0YwWlNCemIzSjBhVzVuWEc1Y2RGeDBYSFJjZEdsbUlDZ2diM1YwWlhKdGIzTjBJQ1ltSUNGelpXVmtJQ1ltSUhObGRFMWhkR05vWldRdWJHVnVaM1JvSUQ0Z01DQW1KbHh1WEhSY2RGeDBYSFJjZENnZ2JXRjBZMmhsWkVOdmRXNTBJQ3NnYzJWMFRXRjBZMmhsY25NdWJHVnVaM1JvSUNrZ1BpQXhJQ2tnZTF4dVhHNWNkRngwWEhSY2RGeDBVMmw2ZW14bExuVnVhWEYxWlZOdmNuUW9JSEpsYzNWc2RITWdLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QlBkbVZ5Y21sa1pTQnRZVzVwY0hWc1lYUnBiMjRnYjJZZ1oyeHZZbUZzY3lCaWVTQnVaWE4wWldRZ2JXRjBZMmhsY25OY2JseDBYSFJjZEdsbUlDZ2diM1YwWlhKdGIzTjBJQ2tnZTF4dVhIUmNkRngwWEhSa2FYSnlkVzV6SUQwZ1pHbHljblZ1YzFWdWFYRjFaVHRjYmx4MFhIUmNkRngwYjNWMFpYSnRiM04wUTI5dWRHVjRkQ0E5SUdOdmJuUmxlSFJDWVdOcmRYQTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjFibTFoZEdOb1pXUTdYRzVjZEZ4MGZUdGNibHh1WEhSeVpYUjFjbTRnWW5sVFpYUWdQMXh1WEhSY2RHMWhjbXRHZFc1amRHbHZiaWdnYzNWd1pYSk5ZWFJqYUdWeUlDa2dPbHh1WEhSY2RITjFjR1Z5VFdGMFkyaGxjanRjYm4xY2JseHVZMjl0Y0dsc1pTQTlJRk5wZW5wc1pTNWpiMjF3YVd4bElEMGdablZ1WTNScGIyNG9JSE5sYkdWamRHOXlMQ0J0WVhSamFDQXZLaUJKYm5SbGNtNWhiQ0JWYzJVZ1QyNXNlU0FxTHlBcElIdGNibHgwZG1GeUlHa3NYRzVjZEZ4MGMyVjBUV0YwWTJobGNuTWdQU0JiWFN4Y2JseDBYSFJsYkdWdFpXNTBUV0YwWTJobGNuTWdQU0JiWFN4Y2JseDBYSFJqWVdOb1pXUWdQU0JqYjIxd2FXeGxja05oWTJobFd5QnpaV3hsWTNSdmNpQXJJRndpSUZ3aUlGMDdYRzVjYmx4MGFXWWdLQ0FoWTJGamFHVmtJQ2tnZTF4dVhIUmNkQzh2SUVkbGJtVnlZWFJsSUdFZ1puVnVZM1JwYjI0Z2IyWWdjbVZqZFhKemFYWmxJR1oxYm1OMGFXOXVjeUIwYUdGMElHTmhiaUJpWlNCMWMyVmtJSFJ2SUdOb1pXTnJJR1ZoWTJnZ1pXeGxiV1Z1ZEZ4dVhIUmNkR2xtSUNnZ0lXMWhkR05vSUNrZ2UxeHVYSFJjZEZ4MGJXRjBZMmdnUFNCMGIydGxibWw2WlNnZ2MyVnNaV04wYjNJZ0tUdGNibHgwWEhSOVhHNWNkRngwYVNBOUlHMWhkR05vTG14bGJtZDBhRHRjYmx4MFhIUjNhR2xzWlNBb0lHa3RMU0FwSUh0Y2JseDBYSFJjZEdOaFkyaGxaQ0E5SUcxaGRHTm9aWEpHY205dFZHOXJaVzV6S0NCdFlYUmphRnRwWFNBcE8xeHVYSFJjZEZ4MGFXWWdLQ0JqWVdOb1pXUmJJR1Y0Y0dGdVpHOGdYU0FwSUh0Y2JseDBYSFJjZEZ4MGMyVjBUV0YwWTJobGNuTXVjSFZ6YUNnZ1kyRmphR1ZrSUNrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSbGJHVnRaVzUwVFdGMFkyaGxjbk11Y0hWemFDZ2dZMkZqYUdWa0lDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYRzVjZEZ4MEx5OGdRMkZqYUdVZ2RHaGxJR052YlhCcGJHVmtJR1oxYm1OMGFXOXVYRzVjZEZ4MFkyRmphR1ZrSUQwZ1kyOXRjR2xzWlhKRFlXTm9aU2dnYzJWc1pXTjBiM0lzSUcxaGRHTm9aWEpHY205dFIzSnZkWEJOWVhSamFHVnljeWdnWld4bGJXVnVkRTFoZEdOb1pYSnpMQ0J6WlhSTllYUmphR1Z5Y3lBcElDazdYRzVjYmx4MFhIUXZMeUJUWVhabElITmxiR1ZqZEc5eUlHRnVaQ0IwYjJ0bGJtbDZZWFJwYjI1Y2JseDBYSFJqWVdOb1pXUXVjMlZzWldOMGIzSWdQU0J6Wld4bFkzUnZjanRjYmx4MGZWeHVYSFJ5WlhSMWNtNGdZMkZqYUdWa08xeHVmVHRjYmx4dUx5b3FYRzRnS2lCQklHeHZkeTFzWlhabGJDQnpaV3hsWTNScGIyNGdablZ1WTNScGIyNGdkR2hoZENCM2IzSnJjeUIzYVhSb0lGTnBlbnBzWlNkeklHTnZiWEJwYkdWa1hHNGdLaUFnYzJWc1pXTjBiM0lnWm5WdVkzUnBiMjV6WEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjN4R2RXNWpkR2x2Ym4wZ2MyVnNaV04wYjNJZ1FTQnpaV3hsWTNSdmNpQnZjaUJoSUhCeVpTMWpiMjF3YVd4bFpGeHVJQ29nSUhObGJHVmpkRzl5SUdaMWJtTjBhVzl1SUdKMWFXeDBJSGRwZEdnZ1UybDZlbXhsTG1OdmJYQnBiR1ZjYmlBcUlFQndZWEpoYlNCN1JXeGxiV1Z1ZEgwZ1kyOXVkR1Y0ZEZ4dUlDb2dRSEJoY21GdElIdEJjbkpoZVgwZ1czSmxjM1ZzZEhOZFhHNGdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQmJjMlZsWkYwZ1FTQnpaWFFnYjJZZ1pXeGxiV1Z1ZEhNZ2RHOGdiV0YwWTJnZ1lXZGhhVzV6ZEZ4dUlDb3ZYRzV6Wld4bFkzUWdQU0JUYVhwNmJHVXVjMlZzWldOMElEMGdablZ1WTNScGIyNG9JSE5sYkdWamRHOXlMQ0JqYjI1MFpYaDBMQ0J5WlhOMWJIUnpMQ0J6WldWa0lDa2dlMXh1WEhSMllYSWdhU3dnZEc5clpXNXpMQ0IwYjJ0bGJpd2dkSGx3WlN3Z1ptbHVaQ3hjYmx4MFhIUmpiMjF3YVd4bFpDQTlJSFI1Y0dWdlppQnpaV3hsWTNSdmNpQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlDWW1JSE5sYkdWamRHOXlMRnh1WEhSY2RHMWhkR05vSUQwZ0lYTmxaV1FnSmlZZ2RHOXJaVzVwZW1Vb0lDaHpaV3hsWTNSdmNpQTlJR052YlhCcGJHVmtMbk5sYkdWamRHOXlJSHg4SUhObGJHVmpkRzl5S1NBcE8xeHVYRzVjZEhKbGMzVnNkSE1nUFNCeVpYTjFiSFJ6SUh4OElGdGRPMXh1WEc1Y2RDOHZJRlJ5ZVNCMGJ5QnRhVzVwYldsNlpTQnZjR1Z5WVhScGIyNXpJR2xtSUhSb1pYSmxJR2x6SUc1dklITmxaV1FnWVc1a0lHOXViSGtnYjI1bElHZHliM1Z3WEc1Y2RHbG1JQ2dnYldGMFkyZ3ViR1Z1WjNSb0lEMDlQU0F4SUNrZ2UxeHVYRzVjZEZ4MEx5OGdWR0ZyWlNCaElITm9iM0owWTNWMElHRnVaQ0J6WlhRZ2RHaGxJR052Ym5SbGVIUWdhV1lnZEdobElISnZiM1FnYzJWc1pXTjBiM0lnYVhNZ1lXNGdTVVJjYmx4MFhIUjBiMnRsYm5NZ1BTQnRZWFJqYUZzd1hTQTlJRzFoZEdOb1d6QmRMbk5zYVdObEtDQXdJQ2s3WEc1Y2RGeDBhV1lnS0NCMGIydGxibk11YkdWdVozUm9JRDRnTWlBbUppQW9kRzlyWlc0Z1BTQjBiMnRsYm5OYk1GMHBMblI1Y0dVZ1BUMDlJRndpU1VSY0lpQW1KbHh1WEhSY2RGeDBYSFJ6ZFhCd2IzSjBMbWRsZEVKNVNXUWdKaVlnWTI5dWRHVjRkQzV1YjJSbFZIbHdaU0E5UFQwZ09TQW1KaUJrYjJOMWJXVnVkRWx6U0ZSTlRDQW1KbHh1WEhSY2RGeDBYSFJGZUhCeUxuSmxiR0YwYVhabFd5QjBiMnRsYm5OYk1WMHVkSGx3WlNCZElDa2dlMXh1WEc1Y2RGeDBYSFJqYjI1MFpYaDBJRDBnS0NCRmVIQnlMbVpwYm1SYlhDSkpSRndpWFNnZ2RHOXJaVzR1YldGMFkyaGxjMXN3WFM1eVpYQnNZV05sS0hKMWJtVnpZMkZ3WlN3Z1puVnVaWE5qWVhCbEtTd2dZMjl1ZEdWNGRDQXBJSHg4SUZ0ZElDbGJNRjA3WEc1Y2RGeDBYSFJwWmlBb0lDRmpiMjUwWlhoMElDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdjbVZ6ZFd4MGN6dGNibHh1WEhSY2RGeDBMeThnVUhKbFkyOXRjR2xzWldRZ2JXRjBZMmhsY25NZ2QybHNiQ0J6ZEdsc2JDQjJaWEpwWm5rZ1lXNWpaWE4wY25rc0lITnZJSE4wWlhBZ2RYQWdZU0JzWlhabGJGeHVYSFJjZEZ4MGZTQmxiSE5sSUdsbUlDZ2dZMjl0Y0dsc1pXUWdLU0I3WEc1Y2RGeDBYSFJjZEdOdmJuUmxlSFFnUFNCamIyNTBaWGgwTG5CaGNtVnVkRTV2WkdVN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RITmxiR1ZqZEc5eUlEMGdjMlZzWldOMGIzSXVjMnhwWTJVb0lIUnZhMlZ1Y3k1emFHbG1kQ2dwTG5aaGJIVmxMbXhsYm1kMGFDQXBPMXh1WEhSY2RIMWNibHh1WEhSY2RDOHZJRVpsZEdOb0lHRWdjMlZsWkNCelpYUWdabTl5SUhKcFoyaDBMWFJ2TFd4bFpuUWdiV0YwWTJocGJtZGNibHgwWEhScElEMGdiV0YwWTJoRmVIQnlXMXdpYm1WbFpITkRiMjUwWlhoMFhDSmRMblJsYzNRb0lITmxiR1ZqZEc5eUlDa2dQeUF3SURvZ2RHOXJaVzV6TG14bGJtZDBhRHRjYmx4MFhIUjNhR2xzWlNBb0lHa3RMU0FwSUh0Y2JseDBYSFJjZEhSdmEyVnVJRDBnZEc5clpXNXpXMmxkTzF4dVhHNWNkRngwWEhRdkx5QkJZbTl5ZENCcFppQjNaU0JvYVhRZ1lTQmpiMjFpYVc1aGRHOXlYRzVjZEZ4MFhIUnBaaUFvSUVWNGNISXVjbVZzWVhScGRtVmJJQ2gwZVhCbElEMGdkRzlyWlc0dWRIbHdaU2tnWFNBcElIdGNibHgwWEhSY2RGeDBZbkpsWVdzN1hHNWNkRngwWEhSOVhHNWNkRngwWEhScFppQW9JQ2htYVc1a0lEMGdSWGh3Y2k1bWFXNWtXeUIwZVhCbElGMHBJQ2tnZTF4dVhIUmNkRngwWEhRdkx5QlRaV0Z5WTJnc0lHVjRjR0Z1WkdsdVp5QmpiMjUwWlhoMElHWnZjaUJzWldGa2FXNW5JSE5wWW14cGJtY2dZMjl0WW1sdVlYUnZjbk5jYmx4MFhIUmNkRngwYVdZZ0tDQW9jMlZsWkNBOUlHWnBibVFvWEc1Y2RGeDBYSFJjZEZ4MGRHOXJaVzR1YldGMFkyaGxjMXN3WFM1eVpYQnNZV05sS0NCeWRXNWxjMk5oY0dVc0lHWjFibVZ6WTJGd1pTQXBMRnh1WEhSY2RGeDBYSFJjZEhKemFXSnNhVzVuTG5SbGMzUW9JSFJ2YTJWdWMxc3dYUzUwZVhCbElDa2dKaVlnZEdWemRFTnZiblJsZUhRb0lHTnZiblJsZUhRdWNHRnlaVzUwVG05a1pTQXBJSHg4SUdOdmJuUmxlSFJjYmx4MFhIUmNkRngwS1NrZ0tTQjdYRzVjYmx4MFhIUmNkRngwWEhRdkx5QkpaaUJ6WldWa0lHbHpJR1Z0Y0hSNUlHOXlJRzV2SUhSdmEyVnVjeUJ5WlcxaGFXNHNJSGRsSUdOaGJpQnlaWFIxY200Z1pXRnliSGxjYmx4MFhIUmNkRngwWEhSMGIydGxibk11YzNCc2FXTmxLQ0JwTENBeElDazdYRzVjZEZ4MFhIUmNkRngwYzJWc1pXTjBiM0lnUFNCelpXVmtMbXhsYm1kMGFDQW1KaUIwYjFObGJHVmpkRzl5S0NCMGIydGxibk1nS1R0Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSUNGelpXeGxZM1J2Y2lBcElIdGNibHgwWEhSY2RGeDBYSFJjZEhCMWMyZ3VZWEJ3Ykhrb0lISmxjM1ZzZEhNc0lITmxaV1FnS1R0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQnlaWE4xYkhSek8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSY2RHSnlaV0ZyTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUjlYRzVjYmx4MEx5OGdRMjl0Y0dsc1pTQmhibVFnWlhobFkzVjBaU0JoSUdacGJIUmxjbWx1WnlCbWRXNWpkR2x2YmlCcFppQnZibVVnYVhNZ2JtOTBJSEJ5YjNacFpHVmtYRzVjZEM4dklGQnliM1pwWkdVZ1lHMWhkR05vWUNCMGJ5QmhkbTlwWkNCeVpYUnZhMlZ1YVhwaGRHbHZiaUJwWmlCM1pTQnRiMlJwWm1sbFpDQjBhR1VnYzJWc1pXTjBiM0lnWVdKdmRtVmNibHgwS0NCamIyMXdhV3hsWkNCOGZDQmpiMjF3YVd4bEtDQnpaV3hsWTNSdmNpd2diV0YwWTJnZ0tTQXBLRnh1WEhSY2RITmxaV1FzWEc1Y2RGeDBZMjl1ZEdWNGRDeGNibHgwWEhRaFpHOWpkVzFsYm5SSmMwaFVUVXdzWEc1Y2RGeDBjbVZ6ZFd4MGN5eGNibHgwWEhSeWMybGliR2x1Wnk1MFpYTjBLQ0J6Wld4bFkzUnZjaUFwSUNZbUlIUmxjM1JEYjI1MFpYaDBLQ0JqYjI1MFpYaDBMbkJoY21WdWRFNXZaR1VnS1NCOGZDQmpiMjUwWlhoMFhHNWNkQ2s3WEc1Y2RISmxkSFZ5YmlCeVpYTjFiSFJ6TzF4dWZUdGNibHh1THk4Z1QyNWxMWFJwYldVZ1lYTnphV2R1YldWdWRITmNibHh1THk4Z1UyOXlkQ0J6ZEdGaWFXeHBkSGxjYm5OMWNIQnZjblF1YzI5eWRGTjBZV0pzWlNBOUlHVjRjR0Z1Wkc4dWMzQnNhWFFvWENKY0lpa3VjMjl5ZENnZ2MyOXlkRTl5WkdWeUlDa3VhbTlwYmloY0lsd2lLU0E5UFQwZ1pYaHdZVzVrYnp0Y2JseHVMeThnVTNWd2NHOXlkRG9nUTJoeWIyMWxJREUwTFRNMUsxeHVMeThnUVd4M1lYbHpJR0Z6YzNWdFpTQmtkWEJzYVdOaGRHVnpJR2xtSUhSb1pYa2dZWEpsYmlkMElIQmhjM05sWkNCMGJ5QjBhR1VnWTI5dGNHRnlhWE52YmlCbWRXNWpkR2x2Ymx4dWMzVndjRzl5ZEM1a1pYUmxZM1JFZFhCc2FXTmhkR1Z6SUQwZ0lTRm9ZWE5FZFhCc2FXTmhkR1U3WEc1Y2JpOHZJRWx1YVhScFlXeHBlbVVnWVdkaGFXNXpkQ0IwYUdVZ1pHVm1ZWFZzZENCa2IyTjFiV1Z1ZEZ4dWMyVjBSRzlqZFcxbGJuUW9LVHRjYmx4dUx5OGdVM1Z3Y0c5eWREb2dWMlZpYTJsMFBEVXpOeTR6TWlBdElGTmhabUZ5YVNBMkxqQXVNeTlEYUhKdmJXVWdNalVnS0dacGVHVmtJR2x1SUVOb2NtOXRaU0F5TnlsY2JpOHZJRVJsZEdGamFHVmtJRzV2WkdWeklHTnZibVp2ZFc1a2FXNW5iSGtnWm05c2JHOTNJQ3BsWVdOb0lHOTBhR1Z5S2x4dWMzVndjRzl5ZEM1emIzSjBSR1YwWVdOb1pXUWdQU0JoYzNObGNuUW9ablZ1WTNScGIyNG9JR1JwZGpFZ0tTQjdYRzVjZEM4dklGTm9iM1ZzWkNCeVpYUjFjbTRnTVN3Z1luVjBJSEpsZEhWeWJuTWdOQ0FvWm05c2JHOTNhVzVuS1Z4dVhIUnlaWFIxY200Z1pHbDJNUzVqYjIxd1lYSmxSRzlqZFcxbGJuUlFiM05wZEdsdmJpZ2daRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENoY0ltUnBkbHdpS1NBcElDWWdNVHRjYm4wcE8xeHVYRzR2THlCVGRYQndiM0owT2lCSlJUdzRYRzR2THlCUWNtVjJaVzUwSUdGMGRISnBZblYwWlM5d2NtOXdaWEowZVNCY0ltbHVkR1Z5Y0c5c1lYUnBiMjVjSWx4dUx5OGdhSFIwY0RvdkwyMXpaRzR1YldsamNtOXpiMlowTG1OdmJTOWxiaTExY3k5c2FXSnlZWEo1TDIxek5UTTJOREk1SlRJNFZsTXVPRFVsTWprdVlYTndlRnh1YVdZZ0tDQWhZWE56WlhKMEtHWjFibU4wYVc5dUtDQmthWFlnS1NCN1hHNWNkR1JwZGk1cGJtNWxja2hVVFV3Z1BTQmNJanhoSUdoeVpXWTlKeU1uUGp3dllUNWNJanRjYmx4MGNtVjBkWEp1SUdScGRpNW1hWEp6ZEVOb2FXeGtMbWRsZEVGMGRISnBZblYwWlNoY0ltaHlaV1pjSWlrZ1BUMDlJRndpSTF3aUlEdGNibjBwSUNrZ2UxeHVYSFJoWkdSSVlXNWtiR1VvSUZ3aWRIbHdaWHhvY21WbWZHaGxhV2RvZEh4M2FXUjBhRndpTENCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnYm1GdFpTd2dhWE5ZVFV3Z0tTQjdYRzVjZEZ4MGFXWWdLQ0FoYVhOWVRVd2dLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdaV3hsYlM1blpYUkJkSFJ5YVdKMWRHVW9JRzVoYldVc0lHNWhiV1V1ZEc5TWIzZGxja05oYzJVb0tTQTlQVDBnWENKMGVYQmxYQ0lnUHlBeElEb2dNaUFwTzF4dVhIUmNkSDFjYmx4MGZTazdYRzU5WEc1Y2JpOHZJRk4xY0hCdmNuUTZJRWxGUERsY2JpOHZJRlZ6WlNCa1pXWmhkV3gwVm1Gc2RXVWdhVzRnY0d4aFkyVWdiMllnWjJWMFFYUjBjbWxpZFhSbEtGd2lkbUZzZFdWY0lpbGNibWxtSUNnZ0lYTjFjSEJ2Y25RdVlYUjBjbWxpZFhSbGN5QjhmQ0FoWVhOelpYSjBLR1oxYm1OMGFXOXVLQ0JrYVhZZ0tTQjdYRzVjZEdScGRpNXBibTVsY2toVVRVd2dQU0JjSWp4cGJuQjFkQzgrWENJN1hHNWNkR1JwZGk1bWFYSnpkRU5vYVd4a0xuTmxkRUYwZEhKcFluVjBaU2dnWENKMllXeDFaVndpTENCY0lsd2lJQ2s3WEc1Y2RISmxkSFZ5YmlCa2FYWXVabWx5YzNSRGFHbHNaQzVuWlhSQmRIUnlhV0oxZEdVb0lGd2lkbUZzZFdWY0lpQXBJRDA5UFNCY0lsd2lPMXh1ZlNrZ0tTQjdYRzVjZEdGa1pFaGhibVJzWlNnZ1hDSjJZV3gxWlZ3aUxDQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2JtRnRaU3dnYVhOWVRVd2dLU0I3WEc1Y2RGeDBhV1lnS0NBaGFYTllUVXdnSmlZZ1pXeGxiUzV1YjJSbFRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElEMDlQU0JjSW1sdWNIVjBYQ0lnS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnWld4bGJTNWtaV1poZFd4MFZtRnNkV1U3WEc1Y2RGeDBmVnh1WEhSOUtUdGNibjFjYmx4dUx5OGdVM1Z3Y0c5eWREb2dTVVU4T1Z4dUx5OGdWWE5sSUdkbGRFRjBkSEpwWW5WMFpVNXZaR1VnZEc4Z1ptVjBZMmdnWW05dmJHVmhibk1nZDJobGJpQm5aWFJCZEhSeWFXSjFkR1VnYkdsbGMxeHVhV1lnS0NBaFlYTnpaWEowS0daMWJtTjBhVzl1S0NCa2FYWWdLU0I3WEc1Y2RISmxkSFZ5YmlCa2FYWXVaMlYwUVhSMGNtbGlkWFJsS0Z3aVpHbHpZV0pzWldSY0lpa2dQVDBnYm5Wc2JEdGNibjBwSUNrZ2UxeHVYSFJoWkdSSVlXNWtiR1VvSUdKdmIyeGxZVzV6TENCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnYm1GdFpTd2dhWE5ZVFV3Z0tTQjdYRzVjZEZ4MGRtRnlJSFpoYkR0Y2JseDBYSFJwWmlBb0lDRnBjMWhOVENBcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCbGJHVnRXeUJ1WVcxbElGMGdQVDA5SUhSeWRXVWdQeUJ1WVcxbExuUnZURzkzWlhKRFlYTmxLQ2tnT2x4dVhIUmNkRngwWEhSY2RDaDJZV3dnUFNCbGJHVnRMbWRsZEVGMGRISnBZblYwWlU1dlpHVW9JRzVoYldVZ0tTa2dKaVlnZG1Gc0xuTndaV05wWm1sbFpDQS9YRzVjZEZ4MFhIUmNkRngwZG1Gc0xuWmhiSFZsSURwY2JseDBYSFJjZEZ4MGJuVnNiRHRjYmx4MFhIUjlYRzVjZEgwcE8xeHVmVnh1WEc1eVpYUjFjbTRnVTJsNmVteGxPMXh1WEc1OUtTZ2dkMmx1Wkc5M0lDazdYRzVjYmx4dVhHNXFVWFZsY25rdVptbHVaQ0E5SUZOcGVucHNaVHRjYm1wUmRXVnllUzVsZUhCeUlEMGdVMmw2ZW14bExuTmxiR1ZqZEc5eWN6dGNibXBSZFdWeWVTNWxlSEJ5VzF3aU9sd2lYU0E5SUdwUmRXVnllUzVsZUhCeUxuQnpaWFZrYjNNN1hHNXFVWFZsY25rdWRXNXBjWFZsSUQwZ1UybDZlbXhsTG5WdWFYRjFaVk52Y25RN1hHNXFVWFZsY25rdWRHVjRkQ0E5SUZOcGVucHNaUzVuWlhSVVpYaDBPMXh1YWxGMVpYSjVMbWx6V0UxTVJHOWpJRDBnVTJsNmVteGxMbWx6V0UxTU8xeHVhbEYxWlhKNUxtTnZiblJoYVc1eklEMGdVMmw2ZW14bExtTnZiblJoYVc1ek8xeHVYRzVjYmx4dWRtRnlJSEp1WldWa2MwTnZiblJsZUhRZ1BTQnFVWFZsY25rdVpYaHdjaTV0WVhSamFDNXVaV1ZrYzBOdmJuUmxlSFE3WEc1Y2JuWmhjaUJ5YzJsdVoyeGxWR0ZuSUQwZ0tDOWVQQ2hjWEhjcktWeGNjeXBjWEM4L1BpZy9PanhjWEM5Y1hERStmQ2trTHlrN1hHNWNibHh1WEc1MllYSWdjbWx6VTJsdGNHeGxJRDBnTDE0dVcxNDZJMXhjVzF4Y0xpeGRLaVF2TzF4dVhHNHZMeUJKYlhCc1pXMWxiblFnZEdobElHbGtaVzUwYVdOaGJDQm1kVzVqZEdsdmJtRnNhWFI1SUdadmNpQm1hV3gwWlhJZ1lXNWtJRzV2ZEZ4dVpuVnVZM1JwYjI0Z2QybHVibTkzS0NCbGJHVnRaVzUwY3l3Z2NYVmhiR2xtYVdWeUxDQnViM1FnS1NCN1hHNWNkR2xtSUNnZ2FsRjFaWEo1TG1selJuVnVZM1JwYjI0b0lIRjFZV3hwWm1sbGNpQXBJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQnFVWFZsY25rdVozSmxjQ2dnWld4bGJXVnVkSE1zSUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0JwSUNrZ2UxeHVYSFJjZEZ4MEx5b2dhbk5vYVc1MElDMVhNREU0SUNvdlhHNWNkRngwWEhSeVpYUjFjbTRnSVNGeGRXRnNhV1pwWlhJdVkyRnNiQ2dnWld4bGJTd2dhU3dnWld4bGJTQXBJQ0U5UFNCdWIzUTdYRzVjZEZ4MGZTazdYRzVjYmx4MGZWeHVYRzVjZEdsbUlDZ2djWFZoYkdsbWFXVnlMbTV2WkdWVWVYQmxJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQnFVWFZsY25rdVozSmxjQ2dnWld4bGJXVnVkSE1zSUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJQ2dnWld4bGJTQTlQVDBnY1hWaGJHbG1hV1Z5SUNrZ0lUMDlJRzV2ZER0Y2JseDBYSFI5S1R0Y2JseHVYSFI5WEc1Y2JseDBhV1lnS0NCMGVYQmxiMllnY1hWaGJHbG1hV1Z5SUQwOVBTQmNJbk4wY21sdVoxd2lJQ2tnZTF4dVhIUmNkR2xtSUNnZ2NtbHpVMmx0Y0d4bExuUmxjM1FvSUhGMVlXeHBabWxsY2lBcElDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHcFJkV1Z5ZVM1bWFXeDBaWElvSUhGMVlXeHBabWxsY2l3Z1pXeGxiV1Z1ZEhNc0lHNXZkQ0FwTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEYxWVd4cFptbGxjaUE5SUdwUmRXVnllUzVtYVd4MFpYSW9JSEYxWVd4cFptbGxjaXdnWld4bGJXVnVkSE1nS1R0Y2JseDBmVnh1WEc1Y2RISmxkSFZ5YmlCcVVYVmxjbmt1WjNKbGNDZ2daV3hsYldWdWRITXNJR1oxYm1OMGFXOXVLQ0JsYkdWdElDa2dlMXh1WEhSY2RISmxkSFZ5YmlBb0lHbHVaR1Y0VDJZdVkyRnNiQ2dnY1hWaGJHbG1hV1Z5TENCbGJHVnRJQ2tnUGowZ01DQXBJQ0U5UFNCdWIzUTdYRzVjZEgwcE8xeHVmVnh1WEc1cVVYVmxjbmt1Wm1sc2RHVnlJRDBnWm5WdVkzUnBiMjRvSUdWNGNISXNJR1ZzWlcxekxDQnViM1FnS1NCN1hHNWNkSFpoY2lCbGJHVnRJRDBnWld4bGJYTmJJREFnWFR0Y2JseHVYSFJwWmlBb0lHNXZkQ0FwSUh0Y2JseDBYSFJsZUhCeUlEMGdYQ0k2Ym05MEtGd2lJQ3NnWlhod2NpQXJJRndpS1Z3aU8xeHVYSFI5WEc1Y2JseDBjbVYwZFhKdUlHVnNaVzF6TG14bGJtZDBhQ0E5UFQwZ01TQW1KaUJsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0F4SUQ5Y2JseDBYSFJxVVhWbGNua3VabWx1WkM1dFlYUmphR1Z6VTJWc1pXTjBiM0lvSUdWc1pXMHNJR1Y0Y0hJZ0tTQS9JRnNnWld4bGJTQmRJRG9nVzEwZ09seHVYSFJjZEdwUmRXVnllUzVtYVc1a0xtMWhkR05vWlhNb0lHVjRjSElzSUdwUmRXVnllUzVuY21Wd0tDQmxiR1Z0Y3l3Z1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVR0Y2JseDBYSFI5S1NrN1hHNTlPMXh1WEc1cVVYVmxjbmt1Wm00dVpYaDBaVzVrS0h0Y2JseDBabWx1WkRvZ1puVnVZM1JwYjI0b0lITmxiR1ZqZEc5eUlDa2dlMXh1WEhSY2RIWmhjaUJwTEZ4dVhIUmNkRngwYkdWdUlEMGdkR2hwY3k1c1pXNW5kR2dzWEc1Y2RGeDBYSFJ5WlhRZ1BTQmJYU3hjYmx4MFhIUmNkSE5sYkdZZ1BTQjBhR2x6TzF4dVhHNWNkRngwYVdZZ0tDQjBlWEJsYjJZZ2MyVnNaV04wYjNJZ0lUMDlJRndpYzNSeWFXNW5YQ0lnS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnZEdocGN5NXdkWE5vVTNSaFkyc29JR3BSZFdWeWVTZ2djMlZzWldOMGIzSWdLUzVtYVd4MFpYSW9ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJjZEdadmNpQW9JR2tnUFNBd095QnBJRHdnYkdWdU95QnBLeXNnS1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0NCcVVYVmxjbmt1WTI5dWRHRnBibk1vSUhObGJHWmJJR2tnWFN3Z2RHaHBjeUFwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVJSFJ5ZFdVN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5S1NBcE8xeHVYSFJjZEgxY2JseHVYSFJjZEdadmNpQW9JR2tnUFNBd095QnBJRHdnYkdWdU95QnBLeXNnS1NCN1hHNWNkRngwWEhScVVYVmxjbmt1Wm1sdVpDZ2djMlZzWldOMGIzSXNJSE5sYkdaYklHa2dYU3dnY21WMElDazdYRzVjZEZ4MGZWeHVYRzVjZEZ4MEx5OGdUbVZsWkdWa0lHSmxZMkYxYzJVZ0pDZ2djMlZzWldOMGIzSXNJR052Ym5SbGVIUWdLU0JpWldOdmJXVnpJQ1FvSUdOdmJuUmxlSFFnS1M1bWFXNWtLQ0J6Wld4bFkzUnZjaUFwWEc1Y2RGeDBjbVYwSUQwZ2RHaHBjeTV3ZFhOb1UzUmhZMnNvSUd4bGJpQStJREVnUHlCcVVYVmxjbmt1ZFc1cGNYVmxLQ0J5WlhRZ0tTQTZJSEpsZENBcE8xeHVYSFJjZEhKbGRDNXpaV3hsWTNSdmNpQTlJSFJvYVhNdWMyVnNaV04wYjNJZ1B5QjBhR2x6TG5ObGJHVmpkRzl5SUNzZ1hDSWdYQ0lnS3lCelpXeGxZM1J2Y2lBNklITmxiR1ZqZEc5eU8xeHVYSFJjZEhKbGRIVnliaUJ5WlhRN1hHNWNkSDBzWEc1Y2RHWnBiSFJsY2pvZ1puVnVZM1JwYjI0b0lITmxiR1ZqZEc5eUlDa2dlMXh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbkIxYzJoVGRHRmpheWdnZDJsdWJtOTNLSFJvYVhNc0lITmxiR1ZqZEc5eUlIeDhJRnRkTENCbVlXeHpaU2tnS1R0Y2JseDBmU3hjYmx4MGJtOTBPaUJtZFc1amRHbHZiaWdnYzJWc1pXTjBiM0lnS1NCN1hHNWNkRngwY21WMGRYSnVJSFJvYVhNdWNIVnphRk4wWVdOcktDQjNhVzV1YjNjb2RHaHBjeXdnYzJWc1pXTjBiM0lnZkh3Z1cxMHNJSFJ5ZFdVcElDazdYRzVjZEgwc1hHNWNkR2x6T2lCbWRXNWpkR2x2YmlnZ2MyVnNaV04wYjNJZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUNFaGQybHVibTkzS0Z4dVhIUmNkRngwZEdocGN5eGNibHh1WEhSY2RGeDBMeThnU1dZZ2RHaHBjeUJwY3lCaElIQnZjMmwwYVc5dVlXd3ZjbVZzWVhScGRtVWdjMlZzWldOMGIzSXNJR05vWldOcklHMWxiV0psY25Ob2FYQWdhVzRnZEdobElISmxkSFZ5Ym1Wa0lITmxkRnh1WEhSY2RGeDBMeThnYzI4Z0pDaGNJbkE2Wm1seWMzUmNJaWt1YVhNb1hDSndPbXhoYzNSY0lpa2dkMjl1SjNRZ2NtVjBkWEp1SUhSeWRXVWdabTl5SUdFZ1pHOWpJSGRwZEdnZ2RIZHZJRndpY0Z3aUxseHVYSFJjZEZ4MGRIbHdaVzltSUhObGJHVmpkRzl5SUQwOVBTQmNJbk4wY21sdVoxd2lJQ1ltSUhKdVpXVmtjME52Ym5SbGVIUXVkR1Z6ZENnZ2MyVnNaV04wYjNJZ0tTQS9YRzVjZEZ4MFhIUmNkR3BSZFdWeWVTZ2djMlZzWldOMGIzSWdLU0E2WEc1Y2RGeDBYSFJjZEhObGJHVmpkRzl5SUh4OElGdGRMRnh1WEhSY2RGeDBabUZzYzJWY2JseDBYSFFwTG14bGJtZDBhRHRjYmx4MGZWeHVmU2s3WEc1Y2JseHVMeThnU1c1cGRHbGhiR2w2WlNCaElHcFJkV1Z5ZVNCdlltcGxZM1JjYmx4dVhHNHZMeUJCSUdObGJuUnlZV3dnY21WbVpYSmxibU5sSUhSdklIUm9aU0J5YjI5MElHcFJkV1Z5ZVNoa2IyTjFiV1Z1ZENsY2JuWmhjaUJ5YjI5MGFsRjFaWEo1TEZ4dVhHNWNkQzh2SUVFZ2MybHRjR3hsSUhkaGVTQjBieUJqYUdWamF5Qm1iM0lnU0ZSTlRDQnpkSEpwYm1kelhHNWNkQzh2SUZCeWFXOXlhWFJwZW1VZ0kybGtJRzkyWlhJZ1BIUmhaejRnZEc4Z1lYWnZhV1FnV0ZOVElIWnBZU0JzYjJOaGRHbHZiaTVvWVhOb0lDZ2pPVFV5TVNsY2JseDBMeThnVTNSeWFXTjBJRWhVVFV3Z2NtVmpiMmR1YVhScGIyNGdLQ014TVRJNU1Eb2diWFZ6ZENCemRHRnlkQ0IzYVhSb0lEd3BYRzVjZEhKeGRXbGphMFY0Y0hJZ1BTQXZYaWcvT2x4Y2N5b29QRnRjWEhkY1hGZGRLejRwVzE0K1hTcDhJeWhiWEZ4M0xWMHFLU2trTHl4Y2JseHVYSFJwYm1sMElEMGdhbEYxWlhKNUxtWnVMbWx1YVhRZ1BTQm1kVzVqZEdsdmJpZ2djMlZzWldOMGIzSXNJR052Ym5SbGVIUWdLU0I3WEc1Y2RGeDBkbUZ5SUcxaGRHTm9MQ0JsYkdWdE8xeHVYRzVjZEZ4MEx5OGdTRUZPUkV4Rk9pQWtLRndpWENJcExDQWtLRzUxYkd3cExDQWtLSFZ1WkdWbWFXNWxaQ2tzSUNRb1ptRnNjMlVwWEc1Y2RGeDBhV1lnS0NBaGMyVnNaV04wYjNJZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJJWVc1a2JHVWdTRlJOVENCemRISnBibWR6WEc1Y2RGeDBhV1lnS0NCMGVYQmxiMllnYzJWc1pXTjBiM0lnUFQwOUlGd2ljM1J5YVc1blhDSWdLU0I3WEc1Y2RGeDBYSFJwWmlBb0lITmxiR1ZqZEc5eVd6QmRJRDA5UFNCY0lqeGNJaUFtSmlCelpXeGxZM1J2Y2xzZ2MyVnNaV04wYjNJdWJHVnVaM1JvSUMwZ01TQmRJRDA5UFNCY0lqNWNJaUFtSmlCelpXeGxZM1J2Y2k1c1pXNW5kR2dnUGowZ015QXBJSHRjYmx4MFhIUmNkRngwTHk4Z1FYTnpkVzFsSUhSb1lYUWdjM1J5YVc1bmN5QjBhR0YwSUhOMFlYSjBJR0Z1WkNCbGJtUWdkMmwwYUNBOFBpQmhjbVVnU0ZSTlRDQmhibVFnYzJ0cGNDQjBhR1VnY21WblpYZ2dZMmhsWTJ0Y2JseDBYSFJjZEZ4MGJXRjBZMmdnUFNCYklHNTFiR3dzSUhObGJHVmpkRzl5TENCdWRXeHNJRjA3WEc1Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEcxaGRHTm9JRDBnY25GMWFXTnJSWGh3Y2k1bGVHVmpLQ0J6Wld4bFkzUnZjaUFwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5Qk5ZWFJqYUNCb2RHMXNJRzl5SUcxaGEyVWdjM1Z5WlNCdWJ5QmpiMjUwWlhoMElHbHpJSE53WldOcFptbGxaQ0JtYjNJZ0kybGtYRzVjZEZ4MFhIUnBaaUFvSUcxaGRHTm9JQ1ltSUNodFlYUmphRnN4WFNCOGZDQWhZMjl1ZEdWNGRDa2dLU0I3WEc1Y2JseDBYSFJjZEZ4MEx5OGdTRUZPUkV4Rk9pQWtLR2gwYld3cElDMCtJQ1FvWVhKeVlYa3BYRzVjZEZ4MFhIUmNkR2xtSUNnZ2JXRjBZMmhiTVYwZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWTI5dWRHVjRkQ0E5SUdOdmJuUmxlSFFnYVc1emRHRnVZMlZ2WmlCcVVYVmxjbmtnUHlCamIyNTBaWGgwV3pCZElEb2dZMjl1ZEdWNGREdGNibHh1WEhSY2RGeDBYSFJjZEM4dklFOXdkR2x2YmlCMGJ5QnlkVzRnYzJOeWFYQjBjeUJwY3lCMGNuVmxJR1p2Y2lCaVlXTnJMV052YlhCaGRGeHVYSFJjZEZ4MFhIUmNkQzh2SUVsdWRHVnVkR2x2Ym1Gc2JIa2diR1YwSUhSb1pTQmxjbkp2Y2lCaVpTQjBhSEp2ZDI0Z2FXWWdjR0Z5YzJWSVZFMU1JR2x6SUc1dmRDQndjbVZ6Wlc1MFhHNWNkRngwWEhSY2RGeDBhbEYxWlhKNUxtMWxjbWRsS0NCMGFHbHpMQ0JxVVhWbGNua3VjR0Z5YzJWSVZFMU1LRnh1WEhSY2RGeDBYSFJjZEZ4MGJXRjBZMmhiTVYwc1hHNWNkRngwWEhSY2RGeDBYSFJqYjI1MFpYaDBJQ1ltSUdOdmJuUmxlSFF1Ym05a1pWUjVjR1VnUHlCamIyNTBaWGgwTG05M2JtVnlSRzlqZFcxbGJuUWdmSHdnWTI5dWRHVjRkQ0E2SUdSdlkzVnRaVzUwTEZ4dVhIUmNkRngwWEhSY2RGeDBkSEoxWlZ4dVhIUmNkRngwWEhSY2RDa2dLVHRjYmx4dVhIUmNkRngwWEhSY2RDOHZJRWhCVGtSTVJUb2dKQ2hvZEcxc0xDQndjbTl3Y3lsY2JseDBYSFJjZEZ4MFhIUnBaaUFvSUhKemFXNW5iR1ZVWVdjdWRHVnpkQ2dnYldGMFkyaGJNVjBnS1NBbUppQnFVWFZsY25rdWFYTlFiR0ZwYms5aWFtVmpkQ2dnWTI5dWRHVjRkQ0FwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWm05eUlDZ2diV0YwWTJnZ2FXNGdZMjl1ZEdWNGRDQXBJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBMeThnVUhKdmNHVnlkR2xsY3lCdlppQmpiMjUwWlhoMElHRnlaU0JqWVd4c1pXUWdZWE1nYldWMGFHOWtjeUJwWmlCd2IzTnphV0pzWlZ4dVhIUmNkRngwWEhSY2RGeDBYSFJwWmlBb0lHcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQjBhR2x6V3lCdFlYUmphQ0JkSUNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBkR2hwYzFzZ2JXRjBZMmdnWFNnZ1kyOXVkR1Y0ZEZzZ2JXRjBZMmdnWFNBcE8xeHVYRzVjZEZ4MFhIUmNkRngwWEhSY2RDOHZJQzR1TG1GdVpDQnZkR2hsY25kcGMyVWdjMlYwSUdGeklHRjBkSEpwWW5WMFpYTmNibHgwWEhSY2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSMGFHbHpMbUYwZEhJb0lHMWhkR05vTENCamIyNTBaWGgwV3lCdFlYUmphQ0JkSUNrN1hHNWNkRngwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdkR2hwY3p0Y2JseHVYSFJjZEZ4MFhIUXZMeUJJUVU1RVRFVTZJQ1FvSTJsa0tWeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkR1ZzWlcwZ1BTQmtiMk4xYldWdWRDNW5aWFJGYkdWdFpXNTBRbmxKWkNnZ2JXRjBZMmhiTWwwZ0tUdGNibHh1WEhSY2RGeDBYSFJjZEM4dklGTjFjSEJ2Y25RNklFSnNZV05yWW1WeWNua2dOQzQyWEc1Y2RGeDBYSFJjZEZ4MEx5OGdaMFZDU1VRZ2NtVjBkWEp1Y3lCdWIyUmxjeUJ1YnlCc2IyNW5aWElnYVc0Z2RHaGxJR1J2WTNWdFpXNTBJQ2dqTmprMk15bGNibHgwWEhSY2RGeDBYSFJwWmlBb0lHVnNaVzBnSmlZZ1pXeGxiUzV3WVhKbGJuUk9iMlJsSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwTHk4Z1NXNXFaV04wSUhSb1pTQmxiR1Z0Wlc1MElHUnBjbVZqZEd4NUlHbHVkRzhnZEdobElHcFJkV1Z5ZVNCdlltcGxZM1JjYmx4MFhIUmNkRngwWEhSY2RIUm9hWE11YkdWdVozUm9JRDBnTVR0Y2JseDBYSFJjZEZ4MFhIUmNkSFJvYVhOYk1GMGdQU0JsYkdWdE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSY2RIUm9hWE11WTI5dWRHVjRkQ0E5SUdSdlkzVnRaVzUwTzF4dVhIUmNkRngwWEhSY2RIUm9hWE11YzJWc1pXTjBiM0lnUFNCelpXeGxZM1J2Y2p0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QklRVTVFVEVVNklDUW9aWGh3Y2l3Z0pDZ3VMaTRwS1Z4dVhIUmNkRngwZlNCbGJITmxJR2xtSUNnZ0lXTnZiblJsZUhRZ2ZId2dZMjl1ZEdWNGRDNXFjWFZsY25rZ0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQW9JR052Ym5SbGVIUWdmSHdnY205dmRHcFJkV1Z5ZVNBcExtWnBibVFvSUhObGJHVmpkRzl5SUNrN1hHNWNibHgwWEhSY2RDOHZJRWhCVGtSTVJUb2dKQ2hsZUhCeUxDQmpiMjUwWlhoMEtWeHVYSFJjZEZ4MEx5OGdLSGRvYVdOb0lHbHpJR3AxYzNRZ1pYRjFhWFpoYkdWdWRDQjBiem9nSkNoamIyNTBaWGgwS1M1bWFXNWtLR1Y0Y0hJcFhHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEdocGN5NWpiMjV6ZEhKMVkzUnZjaWdnWTI5dWRHVjRkQ0FwTG1acGJtUW9JSE5sYkdWamRHOXlJQ2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFF2THlCSVFVNUVURVU2SUNRb1JFOU5SV3hsYldWdWRDbGNibHgwWEhSOUlHVnNjMlVnYVdZZ0tDQnpaV3hsWTNSdmNpNXViMlJsVkhsd1pTQXBJSHRjYmx4MFhIUmNkSFJvYVhNdVkyOXVkR1Y0ZENBOUlIUm9hWE5iTUYwZ1BTQnpaV3hsWTNSdmNqdGNibHgwWEhSY2RIUm9hWE11YkdWdVozUm9JRDBnTVR0Y2JseDBYSFJjZEhKbGRIVnliaUIwYUdsek8xeHVYRzVjZEZ4MEx5OGdTRUZPUkV4Rk9pQWtLR1oxYm1OMGFXOXVLVnh1WEhSY2RDOHZJRk5vYjNKMFkzVjBJR1p2Y2lCa2IyTjFiV1Z1ZENCeVpXRmtlVnh1WEhSY2RIMGdaV3h6WlNCcFppQW9JR3BSZFdWeWVTNXBjMFoxYm1OMGFXOXVLQ0J6Wld4bFkzUnZjaUFwSUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhSNWNHVnZaaUJ5YjI5MGFsRjFaWEo1TG5KbFlXUjVJQ0U5UFNCY0luVnVaR1ZtYVc1bFpGd2lJRDljYmx4MFhIUmNkRngwY205dmRHcFJkV1Z5ZVM1eVpXRmtlU2dnYzJWc1pXTjBiM0lnS1NBNlhHNWNkRngwWEhSY2RDOHZJRVY0WldOMWRHVWdhVzF0WldScFlYUmxiSGtnYVdZZ2NtVmhaSGtnYVhNZ2JtOTBJSEJ5WlhObGJuUmNibHgwWEhSY2RGeDBjMlZzWldOMGIzSW9JR3BSZFdWeWVTQXBPMXh1WEhSY2RIMWNibHh1WEhSY2RHbG1JQ2dnYzJWc1pXTjBiM0l1YzJWc1pXTjBiM0lnSVQwOUlIVnVaR1ZtYVc1bFpDQXBJSHRjYmx4MFhIUmNkSFJvYVhNdWMyVnNaV04wYjNJZ1BTQnpaV3hsWTNSdmNpNXpaV3hsWTNSdmNqdGNibHgwWEhSY2RIUm9hWE11WTI5dWRHVjRkQ0E5SUhObGJHVmpkRzl5TG1OdmJuUmxlSFE3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBjbVYwZFhKdUlHcFJkV1Z5ZVM1dFlXdGxRWEp5WVhrb0lITmxiR1ZqZEc5eUxDQjBhR2x6SUNrN1hHNWNkSDA3WEc1Y2JpOHZJRWRwZG1VZ2RHaGxJR2x1YVhRZ1puVnVZM1JwYjI0Z2RHaGxJR3BSZFdWeWVTQndjbTkwYjNSNWNHVWdabTl5SUd4aGRHVnlJR2x1YzNSaGJuUnBZWFJwYjI1Y2JtbHVhWFF1Y0hKdmRHOTBlWEJsSUQwZ2FsRjFaWEo1TG1adU8xeHVYRzR2THlCSmJtbDBhV0ZzYVhwbElHTmxiblJ5WVd3Z2NtVm1aWEpsYm1ObFhHNXliMjkwYWxGMVpYSjVJRDBnYWxGMVpYSjVLQ0JrYjJOMWJXVnVkQ0FwTzF4dVhHNWNiblpoY2lCeWNHRnlaVzUwYzNCeVpYWWdQU0F2WGlnL09uQmhjbVZ1ZEhOOGNISmxkaWcvT2xWdWRHbHNmRUZzYkNrcEx5eGNibHgwTHk4Z1RXVjBhRzlrY3lCbmRXRnlZVzUwWldWa0lIUnZJSEJ5YjJSMVkyVWdZU0IxYm1seGRXVWdjMlYwSUhkb1pXNGdjM1JoY25ScGJtY2dabkp2YlNCaElIVnVhWEYxWlNCelpYUmNibHgwWjNWaGNtRnVkR1ZsWkZWdWFYRjFaU0E5SUh0Y2JseDBYSFJqYUdsc1pISmxiam9nZEhKMVpTeGNibHgwWEhSamIyNTBaVzUwY3pvZ2RISjFaU3hjYmx4MFhIUnVaWGgwT2lCMGNuVmxMRnh1WEhSY2RIQnlaWFk2SUhSeWRXVmNibHgwZlR0Y2JseHVhbEYxWlhKNUxtVjRkR1Z1WkNoN1hHNWNkR1JwY2pvZ1puVnVZM1JwYjI0b0lHVnNaVzBzSUdScGNpd2dkVzUwYVd3Z0tTQjdYRzVjZEZ4MGRtRnlJRzFoZEdOb1pXUWdQU0JiWFN4Y2JseDBYSFJjZEhSeWRXNWpZWFJsSUQwZ2RXNTBhV3dnSVQwOUlIVnVaR1ZtYVc1bFpEdGNibHh1WEhSY2RIZG9hV3hsSUNnZ0tHVnNaVzBnUFNCbGJHVnRXeUJrYVhJZ1hTa2dKaVlnWld4bGJTNXViMlJsVkhsd1pTQWhQVDBnT1NBcElIdGNibHgwWEhSY2RHbG1JQ2dnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVNBcElIdGNibHgwWEhSY2RGeDBhV1lnS0NCMGNuVnVZMkYwWlNBbUppQnFVWFZsY25rb0lHVnNaVzBnS1M1cGN5Z2dkVzUwYVd3Z0tTQXBJSHRjYmx4MFhIUmNkRngwWEhSaWNtVmhhenRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSdFlYUmphR1ZrTG5CMWMyZ29JR1ZzWlcwZ0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNkRngwY21WMGRYSnVJRzFoZEdOb1pXUTdYRzVjZEgwc1hHNWNibHgwYzJsaWJHbHVaem9nWm5WdVkzUnBiMjRvSUc0c0lHVnNaVzBnS1NCN1hHNWNkRngwZG1GeUlHMWhkR05vWldRZ1BTQmJYVHRjYmx4dVhIUmNkR1p2Y2lBb0lEc2dianNnYmlBOUlHNHVibVY0ZEZOcFlteHBibWNnS1NCN1hHNWNkRngwWEhScFppQW9JRzR1Ym05a1pWUjVjR1VnUFQwOUlERWdKaVlnYmlBaFBUMGdaV3hsYlNBcElIdGNibHgwWEhSY2RGeDBiV0YwWTJobFpDNXdkWE5vS0NCdUlDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYRzVjZEZ4MGNtVjBkWEp1SUcxaGRHTm9aV1E3WEc1Y2RIMWNibjBwTzF4dVhHNXFVWFZsY25rdVptNHVaWGgwWlc1a0tIdGNibHgwYUdGek9pQm1kVzVqZEdsdmJpZ2dkR0Z5WjJWMElDa2dlMXh1WEhSY2RIWmhjaUIwWVhKblpYUnpJRDBnYWxGMVpYSjVLQ0IwWVhKblpYUXNJSFJvYVhNZ0tTeGNibHgwWEhSY2RHd2dQU0IwWVhKblpYUnpMbXhsYm1kMGFEdGNibHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbVpwYkhSbGNpaG1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUmNkSFpoY2lCcElEMGdNRHRjYmx4MFhIUmNkR1p2Y2lBb0lEc2dhU0E4SUd3N0lHa3JLeUFwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0JxVVhWbGNua3VZMjl1ZEdGcGJuTW9JSFJvYVhNc0lIUmhjbWRsZEhOYmFWMGdLU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhIUmNkSDBwTzF4dVhIUjlMRnh1WEc1Y2RHTnNiM05sYzNRNklHWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNuTXNJR052Ym5SbGVIUWdLU0I3WEc1Y2RGeDBkbUZ5SUdOMWNpeGNibHgwWEhSY2RHa2dQU0F3TEZ4dVhIUmNkRngwYkNBOUlIUm9hWE11YkdWdVozUm9MRnh1WEhSY2RGeDBiV0YwWTJobFpDQTlJRnRkTEZ4dVhIUmNkRngwY0c5eklEMGdjbTVsWldSelEyOXVkR1Y0ZEM1MFpYTjBLQ0J6Wld4bFkzUnZjbk1nS1NCOGZDQjBlWEJsYjJZZ2MyVnNaV04wYjNKeklDRTlQU0JjSW5OMGNtbHVaMXdpSUQ5Y2JseDBYSFJjZEZ4MGFsRjFaWEo1S0NCelpXeGxZM1J2Y25Nc0lHTnZiblJsZUhRZ2ZId2dkR2hwY3k1amIyNTBaWGgwSUNrZ09seHVYSFJjZEZ4MFhIUXdPMXh1WEc1Y2RGeDBabTl5SUNnZ095QnBJRHdnYkRzZ2FTc3JJQ2tnZTF4dVhIUmNkRngwWm05eUlDZ2dZM1Z5SUQwZ2RHaHBjMXRwWFRzZ1kzVnlJQ1ltSUdOMWNpQWhQVDBnWTI5dWRHVjRkRHNnWTNWeUlEMGdZM1Z5TG5CaGNtVnVkRTV2WkdVZ0tTQjdYRzVjZEZ4MFhIUmNkQzh2SUVGc2QyRjVjeUJ6YTJsd0lHUnZZM1Z0Wlc1MElHWnlZV2R0Wlc1MGMxeHVYSFJjZEZ4MFhIUnBaaUFvSUdOMWNpNXViMlJsVkhsd1pTQThJREV4SUNZbUlDaHdiM01nUDF4dVhIUmNkRngwWEhSY2RIQnZjeTVwYm1SbGVDaGpkWElwSUQ0Z0xURWdPbHh1WEc1Y2RGeDBYSFJjZEZ4MEx5OGdSRzl1SjNRZ2NHRnpjeUJ1YjI0dFpXeGxiV1Z1ZEhNZ2RHOGdVMmw2ZW14bFhHNWNkRngwWEhSY2RGeDBZM1Z5TG01dlpHVlVlWEJsSUQwOVBTQXhJQ1ltWEc1Y2RGeDBYSFJjZEZ4MFhIUnFVWFZsY25rdVptbHVaQzV0WVhSamFHVnpVMlZzWldOMGIzSW9ZM1Z5TENCelpXeGxZM1J2Y25NcEtTQXBJSHRjYmx4dVhIUmNkRngwWEhSY2RHMWhkR05vWldRdWNIVnphQ2dnWTNWeUlDazdYRzVjZEZ4MFhIUmNkRngwWW5KbFlXczdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjYmx4MFhIUnlaWFIxY200Z2RHaHBjeTV3ZFhOb1UzUmhZMnNvSUcxaGRHTm9aV1F1YkdWdVozUm9JRDRnTVNBL0lHcFJkV1Z5ZVM1MWJtbHhkV1VvSUcxaGRHTm9aV1FnS1NBNklHMWhkR05vWldRZ0tUdGNibHgwZlN4Y2JseHVYSFF2THlCRVpYUmxjbTFwYm1VZ2RHaGxJSEJ2YzJsMGFXOXVJRzltSUdGdUlHVnNaVzFsYm5RZ2QybDBhR2x1SUhSb1pTQnpaWFJjYmx4MGFXNWtaWGc2SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhHNWNkRngwTHk4Z1RtOGdZWEpuZFcxbGJuUXNJSEpsZEhWeWJpQnBibVJsZUNCcGJpQndZWEpsYm5SY2JseDBYSFJwWmlBb0lDRmxiR1Z0SUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUNnZ2RHaHBjMXNnTUNCZElDWW1JSFJvYVhOYklEQWdYUzV3WVhKbGJuUk9iMlJsSUNrZ1B5QjBhR2x6TG1acGNuTjBLQ2t1Y0hKbGRrRnNiQ2dwTG14bGJtZDBhQ0E2SUMweE8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklFbHVaR1Y0SUdsdUlITmxiR1ZqZEc5eVhHNWNkRngwYVdZZ0tDQjBlWEJsYjJZZ1pXeGxiU0E5UFQwZ1hDSnpkSEpwYm1kY0lpQXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQnBibVJsZUU5bUxtTmhiR3dvSUdwUmRXVnllU2dnWld4bGJTQXBMQ0IwYUdseld5QXdJRjBnS1R0Y2JseDBYSFI5WEc1Y2JseDBYSFF2THlCTWIyTmhkR1VnZEdobElIQnZjMmwwYVc5dUlHOW1JSFJvWlNCa1pYTnBjbVZrSUdWc1pXMWxiblJjYmx4MFhIUnlaWFIxY200Z2FXNWtaWGhQWmk1allXeHNLQ0IwYUdsekxGeHVYRzVjZEZ4MFhIUXZMeUJKWmlCcGRDQnlaV05sYVhabGN5QmhJR3BSZFdWeWVTQnZZbXBsWTNRc0lIUm9aU0JtYVhKemRDQmxiR1Z0Wlc1MElHbHpJSFZ6WldSY2JseDBYSFJjZEdWc1pXMHVhbkYxWlhKNUlEOGdaV3hsYlZzZ01DQmRJRG9nWld4bGJWeHVYSFJjZENrN1hHNWNkSDBzWEc1Y2JseDBZV1JrT2lCbWRXNWpkR2x2YmlnZ2MyVnNaV04wYjNJc0lHTnZiblJsZUhRZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVjSFZ6YUZOMFlXTnJLRnh1WEhSY2RGeDBhbEYxWlhKNUxuVnVhWEYxWlNoY2JseDBYSFJjZEZ4MGFsRjFaWEo1TG0xbGNtZGxLQ0IwYUdsekxtZGxkQ2dwTENCcVVYVmxjbmtvSUhObGJHVmpkRzl5TENCamIyNTBaWGgwSUNrZ0tWeHVYSFJjZEZ4MEtWeHVYSFJjZENrN1hHNWNkSDBzWEc1Y2JseDBZV1JrUW1GamF6b2dablZ1WTNScGIyNG9JSE5sYkdWamRHOXlJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG1Ga1pDZ2djMlZzWldOMGIzSWdQVDBnYm5Wc2JDQS9YRzVjZEZ4MFhIUjBhR2x6TG5CeVpYWlBZbXBsWTNRZ09pQjBhR2x6TG5CeVpYWlBZbXBsWTNRdVptbHNkR1Z5S0hObGJHVmpkRzl5S1Z4dVhIUmNkQ2s3WEc1Y2RIMWNibjBwTzF4dVhHNW1kVzVqZEdsdmJpQnphV0pzYVc1bktDQmpkWElzSUdScGNpQXBJSHRjYmx4MGQyaHBiR1VnS0NBb1kzVnlJRDBnWTNWeVcyUnBjbDBwSUNZbUlHTjFjaTV1YjJSbFZIbHdaU0FoUFQwZ01TQXBJSHQ5WEc1Y2RISmxkSFZ5YmlCamRYSTdYRzU5WEc1Y2JtcFJkV1Z5ZVM1bFlXTm9LSHRjYmx4MGNHRnlaVzUwT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUh0Y2JseDBYSFIyWVhJZ2NHRnlaVzUwSUQwZ1pXeGxiUzV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkSEpsZEhWeWJpQndZWEpsYm5RZ0ppWWdjR0Z5Wlc1MExtNXZaR1ZVZVhCbElDRTlQU0F4TVNBL0lIQmhjbVZ1ZENBNklHNTFiR3c3WEc1Y2RIMHNYRzVjZEhCaGNtVnVkSE02SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQnFVWFZsY25rdVpHbHlLQ0JsYkdWdExDQmNJbkJoY21WdWRFNXZaR1ZjSWlBcE8xeHVYSFI5TEZ4dVhIUndZWEpsYm5SelZXNTBhV3c2SUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0JwTENCMWJuUnBiQ0FwSUh0Y2JseDBYSFJ5WlhSMWNtNGdhbEYxWlhKNUxtUnBjaWdnWld4bGJTd2dYQ0p3WVhKbGJuUk9iMlJsWENJc0lIVnVkR2xzSUNrN1hHNWNkSDBzWEc1Y2RHNWxlSFE2SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQnphV0pzYVc1bktDQmxiR1Z0TENCY0ltNWxlSFJUYVdKc2FXNW5YQ0lnS1R0Y2JseDBmU3hjYmx4MGNISmxkam9nWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RGeDBjbVYwZFhKdUlITnBZbXhwYm1jb0lHVnNaVzBzSUZ3aWNISmxkbWx2ZFhOVGFXSnNhVzVuWENJZ0tUdGNibHgwZlN4Y2JseDBibVY0ZEVGc2JEb2dablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUdwUmRXVnllUzVrYVhJb0lHVnNaVzBzSUZ3aWJtVjRkRk5wWW14cGJtZGNJaUFwTzF4dVhIUjlMRnh1WEhSd2NtVjJRV3hzT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU0FwSUh0Y2JseDBYSFJ5WlhSMWNtNGdhbEYxWlhKNUxtUnBjaWdnWld4bGJTd2dYQ0p3Y21WMmFXOTFjMU5wWW14cGJtZGNJaUFwTzF4dVhIUjlMRnh1WEhSdVpYaDBWVzUwYVd3NklHWjFibU4wYVc5dUtDQmxiR1Z0TENCcExDQjFiblJwYkNBcElIdGNibHgwWEhSeVpYUjFjbTRnYWxGMVpYSjVMbVJwY2lnZ1pXeGxiU3dnWENKdVpYaDBVMmxpYkdsdVoxd2lMQ0IxYm5ScGJDQXBPMXh1WEhSOUxGeHVYSFJ3Y21WMlZXNTBhV3c2SUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0JwTENCMWJuUnBiQ0FwSUh0Y2JseDBYSFJ5WlhSMWNtNGdhbEYxWlhKNUxtUnBjaWdnWld4bGJTd2dYQ0p3Y21WMmFXOTFjMU5wWW14cGJtZGNJaXdnZFc1MGFXd2dLVHRjYmx4MGZTeGNibHgwYzJsaWJHbHVaM002SUdaMWJtTjBhVzl1S0NCbGJHVnRJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQnFVWFZsY25rdWMybGliR2x1WnlnZ0tDQmxiR1Z0TG5CaGNtVnVkRTV2WkdVZ2ZId2dlMzBnS1M1bWFYSnpkRU5vYVd4a0xDQmxiR1Z0SUNrN1hHNWNkSDBzWEc1Y2RHTm9hV3hrY21WdU9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhSeVpYUjFjbTRnYWxGMVpYSjVMbk5wWW14cGJtY29JR1ZzWlcwdVptbHljM1JEYUdsc1pDQXBPMXh1WEhSOUxGeHVYSFJqYjI1MFpXNTBjem9nWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHVnNaVzB1WTI5dWRHVnVkRVJ2WTNWdFpXNTBJSHg4SUdwUmRXVnllUzV0WlhKblpTZ2dXMTBzSUdWc1pXMHVZMmhwYkdST2IyUmxjeUFwTzF4dVhIUjlYRzU5TENCbWRXNWpkR2x2YmlnZ2JtRnRaU3dnWm00Z0tTQjdYRzVjZEdwUmRXVnllUzVtYmxzZ2JtRnRaU0JkSUQwZ1puVnVZM1JwYjI0b0lIVnVkR2xzTENCelpXeGxZM1J2Y2lBcElIdGNibHgwWEhSMllYSWdiV0YwWTJobFpDQTlJR3BSZFdWeWVTNXRZWEFvSUhSb2FYTXNJR1p1TENCMWJuUnBiQ0FwTzF4dVhHNWNkRngwYVdZZ0tDQnVZVzFsTG5Oc2FXTmxLQ0F0TlNBcElDRTlQU0JjSWxWdWRHbHNYQ0lnS1NCN1hHNWNkRngwWEhSelpXeGxZM1J2Y2lBOUlIVnVkR2xzTzF4dVhIUmNkSDFjYmx4dVhIUmNkR2xtSUNnZ2MyVnNaV04wYjNJZ0ppWWdkSGx3Wlc5bUlITmxiR1ZqZEc5eUlEMDlQU0JjSW5OMGNtbHVaMXdpSUNrZ2UxeHVYSFJjZEZ4MGJXRjBZMmhsWkNBOUlHcFJkV1Z5ZVM1bWFXeDBaWElvSUhObGJHVmpkRzl5TENCdFlYUmphR1ZrSUNrN1hHNWNkRngwZlZ4dVhHNWNkRngwYVdZZ0tDQjBhR2x6TG14bGJtZDBhQ0ErSURFZ0tTQjdYRzVjZEZ4MFhIUXZMeUJTWlcxdmRtVWdaSFZ3YkdsallYUmxjMXh1WEhSY2RGeDBhV1lnS0NBaFozVmhjbUZ1ZEdWbFpGVnVhWEYxWlZzZ2JtRnRaU0JkSUNrZ2UxeHVYSFJjZEZ4MFhIUnFVWFZsY25rdWRXNXBjWFZsS0NCdFlYUmphR1ZrSUNrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRkpsZG1WeWMyVWdiM0prWlhJZ1ptOXlJSEJoY21WdWRITXFJR0Z1WkNCd2NtVjJMV1JsY21sMllYUnBkbVZ6WEc1Y2RGeDBYSFJwWmlBb0lISndZWEpsYm5SemNISmxkaTUwWlhOMEtDQnVZVzFsSUNrZ0tTQjdYRzVjZEZ4MFhIUmNkRzFoZEdOb1pXUXVjbVYyWlhKelpTZ3BPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbkIxYzJoVGRHRmpheWdnYldGMFkyaGxaQ0FwTzF4dVhIUjlPMXh1ZlNrN1hHNTJZWElnY201dmRIZG9hWFJsSUQwZ0tDOWNYRk1yTDJjcE8xeHVYRzVjYmx4dUx5OGdVM1J5YVc1bklIUnZJRTlpYW1WamRDQnZjSFJwYjI1eklHWnZjbTFoZENCallXTm9aVnh1ZG1GeUlHOXdkR2x2Ym5ORFlXTm9aU0E5SUh0OU8xeHVYRzR2THlCRGIyNTJaWEowSUZOMGNtbHVaeTFtYjNKdFlYUjBaV1FnYjNCMGFXOXVjeUJwYm5SdklFOWlhbVZqZEMxbWIzSnRZWFIwWldRZ2IyNWxjeUJoYm1RZ2MzUnZjbVVnYVc0Z1kyRmphR1ZjYm1aMWJtTjBhVzl1SUdOeVpXRjBaVTl3ZEdsdmJuTW9JRzl3ZEdsdmJuTWdLU0I3WEc1Y2RIWmhjaUJ2WW1wbFkzUWdQU0J2Y0hScGIyNXpRMkZqYUdWYklHOXdkR2x2Ym5NZ1hTQTlJSHQ5TzF4dVhIUnFVWFZsY25rdVpXRmphQ2dnYjNCMGFXOXVjeTV0WVhSamFDZ2djbTV2ZEhkb2FYUmxJQ2tnZkh3Z1cxMHNJR1oxYm1OMGFXOXVLQ0JmTENCbWJHRm5JQ2tnZTF4dVhIUmNkRzlpYW1WamRGc2dabXhoWnlCZElEMGdkSEoxWlR0Y2JseDBmU2s3WEc1Y2RISmxkSFZ5YmlCdlltcGxZM1E3WEc1OVhHNWNiaThxWEc0Z0tpQkRjbVZoZEdVZ1lTQmpZV3hzWW1GamF5QnNhWE4wSUhWemFXNW5JSFJvWlNCbWIyeHNiM2RwYm1jZ2NHRnlZVzFsZEdWeWN6cGNiaUFxWEc0Z0tseDBiM0IwYVc5dWN6b2dZVzRnYjNCMGFXOXVZV3dnYkdsemRDQnZaaUJ6Y0dGalpTMXpaWEJoY21GMFpXUWdiM0IwYVc5dWN5QjBhR0YwSUhkcGJHd2dZMmhoYm1kbElHaHZkMXh1SUNwY2RGeDBYSFIwYUdVZ1kyRnNiR0poWTJzZ2JHbHpkQ0JpWldoaGRtVnpJRzl5SUdFZ2JXOXlaU0IwY21Ga2FYUnBiMjVoYkNCdmNIUnBiMjRnYjJKcVpXTjBYRzRnS2x4dUlDb2dRbmtnWkdWbVlYVnNkQ0JoSUdOaGJHeGlZV05ySUd4cGMzUWdkMmxzYkNCaFkzUWdiR2xyWlNCaGJpQmxkbVZ1ZENCallXeHNZbUZqYXlCc2FYTjBJR0Z1WkNCallXNGdZbVZjYmlBcUlGd2labWx5WldSY0lpQnRkV3gwYVhCc1pTQjBhVzFsY3k1Y2JpQXFYRzRnS2lCUWIzTnphV0pzWlNCdmNIUnBiMjV6T2x4dUlDcGNiaUFxWEhSdmJtTmxPbHgwWEhSY2RIZHBiR3dnWlc1emRYSmxJSFJvWlNCallXeHNZbUZqYXlCc2FYTjBJR05oYmlCdmJteDVJR0psSUdacGNtVmtJRzl1WTJVZ0tHeHBhMlVnWVNCRVpXWmxjbkpsWkNsY2JpQXFYRzRnS2x4MGJXVnRiM0o1T2x4MFhIUmNkSGRwYkd3Z2EyVmxjQ0IwY21GamF5QnZaaUJ3Y21WMmFXOTFjeUIyWVd4MVpYTWdZVzVrSUhkcGJHd2dZMkZzYkNCaGJua2dZMkZzYkdKaFkyc2dZV1JrWldSY2JpQXFYSFJjZEZ4MFhIUmNkR0ZtZEdWeUlIUm9aU0JzYVhOMElHaGhjeUJpWldWdUlHWnBjbVZrSUhKcFoyaDBJR0YzWVhrZ2QybDBhQ0IwYUdVZ2JHRjBaWE4wSUZ3aWJXVnRiM0pwZW1Wa1hDSmNiaUFxWEhSY2RGeDBYSFJjZEhaaGJIVmxjeUFvYkdsclpTQmhJRVJsWm1WeWNtVmtLVnh1SUNwY2JpQXFYSFIxYm1seGRXVTZYSFJjZEZ4MGQybHNiQ0JsYm5OMWNtVWdZU0JqWVd4c1ltRmpheUJqWVc0Z2IyNXNlU0JpWlNCaFpHUmxaQ0J2Ym1ObElDaHVieUJrZFhCc2FXTmhkR1VnYVc0Z2RHaGxJR3hwYzNRcFhHNGdLbHh1SUNwY2RITjBiM0JQYmtaaGJITmxPbHgwYVc1MFpYSnlkWEIwSUdOaGJHeHBibWR6SUhkb1pXNGdZU0JqWVd4c1ltRmpheUJ5WlhSMWNtNXpJR1poYkhObFhHNGdLbHh1SUNvdlhHNXFVWFZsY25rdVEyRnNiR0poWTJ0eklEMGdablZ1WTNScGIyNG9JRzl3ZEdsdmJuTWdLU0I3WEc1Y2JseDBMeThnUTI5dWRtVnlkQ0J2Y0hScGIyNXpJR1p5YjIwZ1UzUnlhVzVuTFdadmNtMWhkSFJsWkNCMGJ5QlBZbXBsWTNRdFptOXliV0YwZEdWa0lHbG1JRzVsWldSbFpGeHVYSFF2THlBb2QyVWdZMmhsWTJzZ2FXNGdZMkZqYUdVZ1ptbHljM1FwWEc1Y2RHOXdkR2x2Ym5NZ1BTQjBlWEJsYjJZZ2IzQjBhVzl1Y3lBOVBUMGdYQ0p6ZEhKcGJtZGNJaUEvWEc1Y2RGeDBLQ0J2Y0hScGIyNXpRMkZqYUdWYklHOXdkR2x2Ym5NZ1hTQjhmQ0JqY21WaGRHVlBjSFJwYjI1ektDQnZjSFJwYjI1eklDa2dLU0E2WEc1Y2RGeDBhbEYxWlhKNUxtVjRkR1Z1WkNnZ2UzMHNJRzl3ZEdsdmJuTWdLVHRjYmx4dVhIUjJZWElnTHk4Z1RHRnpkQ0JtYVhKbElIWmhiSFZsSUNobWIzSWdibTl1TFdadmNtZGxkSFJoWW14bElHeHBjM1J6S1Z4dVhIUmNkRzFsYlc5eWVTeGNibHgwWEhRdkx5QkdiR0ZuSUhSdklHdHViM2NnYVdZZ2JHbHpkQ0IzWVhNZ1lXeHlaV0ZrZVNCbWFYSmxaRnh1WEhSY2RHWnBjbVZrTEZ4dVhIUmNkQzh2SUVac1lXY2dkRzhnYTI1dmR5QnBaaUJzYVhOMElHbHpJR04xY25KbGJuUnNlU0JtYVhKcGJtZGNibHgwWEhSbWFYSnBibWNzWEc1Y2RGeDBMeThnUm1seWMzUWdZMkZzYkdKaFkyc2dkRzhnWm1seVpTQW9kWE5sWkNCcGJuUmxjbTVoYkd4NUlHSjVJR0ZrWkNCaGJtUWdabWx5WlZkcGRHZ3BYRzVjZEZ4MFptbHlhVzVuVTNSaGNuUXNYRzVjZEZ4MEx5OGdSVzVrSUc5bUlIUm9aU0JzYjI5d0lIZG9aVzRnWm1seWFXNW5YRzVjZEZ4MFptbHlhVzVuVEdWdVozUm9MRnh1WEhSY2RDOHZJRWx1WkdWNElHOW1JR04xY25KbGJuUnNlU0JtYVhKcGJtY2dZMkZzYkdKaFkyc2dLRzF2WkdsbWFXVmtJR0o1SUhKbGJXOTJaU0JwWmlCdVpXVmtaV1FwWEc1Y2RGeDBabWx5YVc1blNXNWtaWGdzWEc1Y2RGeDBMeThnUVdOMGRXRnNJR05oYkd4aVlXTnJJR3hwYzNSY2JseDBYSFJzYVhOMElEMGdXMTBzWEc1Y2RGeDBMeThnVTNSaFkyc2diMllnWm1seVpTQmpZV3hzY3lCbWIzSWdjbVZ3WldGMFlXSnNaU0JzYVhOMGMxeHVYSFJjZEhOMFlXTnJJRDBnSVc5d2RHbHZibk11YjI1alpTQW1KaUJiWFN4Y2JseDBYSFF2THlCR2FYSmxJR05oYkd4aVlXTnJjMXh1WEhSY2RHWnBjbVVnUFNCbWRXNWpkR2x2YmlnZ1pHRjBZU0FwSUh0Y2JseDBYSFJjZEcxbGJXOXllU0E5SUc5d2RHbHZibk11YldWdGIzSjVJQ1ltSUdSaGRHRTdYRzVjZEZ4MFhIUm1hWEpsWkNBOUlIUnlkV1U3WEc1Y2RGeDBYSFJtYVhKcGJtZEpibVJsZUNBOUlHWnBjbWx1WjFOMFlYSjBJSHg4SURBN1hHNWNkRngwWEhSbWFYSnBibWRUZEdGeWRDQTlJREE3WEc1Y2RGeDBYSFJtYVhKcGJtZE1aVzVuZEdnZ1BTQnNhWE4wTG14bGJtZDBhRHRjYmx4MFhIUmNkR1pwY21sdVp5QTlJSFJ5ZFdVN1hHNWNkRngwWEhSbWIzSWdLQ0E3SUd4cGMzUWdKaVlnWm1seWFXNW5TVzVrWlhnZ1BDQm1hWEpwYm1kTVpXNW5kR2c3SUdacGNtbHVaMGx1WkdWNEt5c2dLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDZ2diR2x6ZEZzZ1ptbHlhVzVuU1c1a1pYZ2dYUzVoY0hCc2VTZ2daR0YwWVZzZ01DQmRMQ0JrWVhSaFd5QXhJRjBnS1NBOVBUMGdabUZzYzJVZ0ppWWdiM0IwYVc5dWN5NXpkRzl3VDI1R1lXeHpaU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnRaVzF2Y25rZ1BTQm1ZV3h6WlRzZ0x5OGdWRzhnY0hKbGRtVnVkQ0JtZFhKMGFHVnlJR05oYkd4eklIVnphVzVuSUdGa1pGeHVYSFJjZEZ4MFhIUmNkR0p5WldGck8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUm1hWEpwYm1jZ1BTQm1ZV3h6WlR0Y2JseDBYSFJjZEdsbUlDZ2diR2x6ZENBcElIdGNibHgwWEhSY2RGeDBhV1lnS0NCemRHRmpheUFwSUh0Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSUhOMFlXTnJMbXhsYm1kMGFDQXBJSHRjYmx4MFhIUmNkRngwWEhSY2RHWnBjbVVvSUhOMFlXTnJMbk5vYVdaMEtDa2dLVHRjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9JRzFsYlc5eWVTQXBJSHRjYmx4MFhIUmNkRngwWEhSc2FYTjBJRDBnVzEwN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBjMlZzWmk1a2FYTmhZbXhsS0NrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSOUxGeHVYSFJjZEM4dklFRmpkSFZoYkNCRFlXeHNZbUZqYTNNZ2IySnFaV04wWEc1Y2RGeDBjMlZzWmlBOUlIdGNibHgwWEhSY2RDOHZJRUZrWkNCaElHTmhiR3hpWVdOcklHOXlJR0VnWTI5c2JHVmpkR2x2YmlCdlppQmpZV3hzWW1GamEzTWdkRzhnZEdobElHeHBjM1JjYmx4MFhIUmNkR0ZrWkRvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUmNkR2xtSUNnZ2JHbHpkQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUXZMeUJHYVhKemRDd2dkMlVnYzJGMlpTQjBhR1VnWTNWeWNtVnVkQ0JzWlc1bmRHaGNibHgwWEhSY2RGeDBYSFIyWVhJZ2MzUmhjblFnUFNCc2FYTjBMbXhsYm1kMGFEdGNibHgwWEhSY2RGeDBYSFFvWm5WdVkzUnBiMjRnWVdSa0tDQmhjbWR6SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYWxGMVpYSjVMbVZoWTJnb0lHRnlaM01zSUdaMWJtTjBhVzl1S0NCZkxDQmhjbWNnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEhaaGNpQjBlWEJsSUQwZ2FsRjFaWEo1TG5SNWNHVW9JR0Z5WnlBcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhScFppQW9JSFI1Y0dVZ1BUMDlJRndpWm5WdVkzUnBiMjVjSWlBcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUnBaaUFvSUNGdmNIUnBiMjV6TG5WdWFYRjFaU0I4ZkNBaGMyVnNaaTVvWVhNb0lHRnlaeUFwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBiR2x6ZEM1d2RYTm9LQ0JoY21jZ0tUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9JR0Z5WnlBbUppQmhjbWN1YkdWdVozUm9JQ1ltSUhSNWNHVWdJVDA5SUZ3aWMzUnlhVzVuWENJZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBMeThnU1c1emNHVmpkQ0J5WldOMWNuTnBkbVZzZVZ4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEdGa1pDZ2dZWEpuSUNrN1hHNWNkRngwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSY2RIMHBLQ0JoY21kMWJXVnVkSE1nS1R0Y2JseDBYSFJjZEZ4MFhIUXZMeUJFYnlCM1pTQnVaV1ZrSUhSdklHRmtaQ0IwYUdVZ1kyRnNiR0poWTJ0eklIUnZJSFJvWlZ4dVhIUmNkRngwWEhSY2RDOHZJR04xY25KbGJuUWdabWx5YVc1bklHSmhkR05vUDF4dVhIUmNkRngwWEhSY2RHbG1JQ2dnWm1seWFXNW5JQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBabWx5YVc1blRHVnVaM1JvSUQwZ2JHbHpkQzVzWlc1bmRHZzdYRzVjZEZ4MFhIUmNkRngwTHk4Z1YybDBhQ0J0WlcxdmNua3NJR2xtSUhkbEozSmxJRzV2ZENCbWFYSnBibWNnZEdobGJseHVYSFJjZEZ4MFhIUmNkQzh2SUhkbElITm9iM1ZzWkNCallXeHNJSEpwWjJoMElHRjNZWGxjYmx4MFhIUmNkRngwWEhSOUlHVnNjMlVnYVdZZ0tDQnRaVzF2Y25rZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSbWFYSnBibWRUZEdGeWRDQTlJSE4wWVhKME8xeHVYSFJjZEZ4MFhIUmNkRngwWm1seVpTZ2diV1Z0YjNKNUlDazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGFHbHpPMXh1WEhSY2RGeDBmU3hjYmx4MFhIUmNkQzh2SUZKbGJXOTJaU0JoSUdOaGJHeGlZV05ySUdaeWIyMGdkR2hsSUd4cGMzUmNibHgwWEhSY2RISmxiVzkyWlRvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUmNkR2xtSUNnZ2JHbHpkQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnFVWFZsY25rdVpXRmphQ2dnWVhKbmRXMWxiblJ6TENCbWRXNWpkR2x2YmlnZ1h5d2dZWEpuSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwZG1GeUlHbHVaR1Y0TzF4dVhIUmNkRngwWEhSY2RGeDBkMmhwYkdVZ0tDQW9JR2x1WkdWNElEMGdhbEYxWlhKNUxtbHVRWEp5WVhrb0lHRnlaeXdnYkdsemRDd2dhVzVrWlhnZ0tTQXBJRDRnTFRFZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RHeHBjM1F1YzNCc2FXTmxLQ0JwYm1SbGVDd2dNU0FwTzF4dVhIUmNkRngwWEhSY2RGeDBYSFF2THlCSVlXNWtiR1VnWm1seWFXNW5JR2x1WkdWNFpYTmNibHgwWEhSY2RGeDBYSFJjZEZ4MGFXWWdLQ0JtYVhKcGJtY2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDQnBibVJsZUNBOFBTQm1hWEpwYm1kTVpXNW5kR2dnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUm1hWEpwYm1kTVpXNW5kR2d0TFR0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGFXWWdLQ0JwYm1SbGVDQThQU0JtYVhKcGJtZEpibVJsZUNBcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkR1pwY21sdVowbHVaR1Y0TFMwN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJvYVhNN1hHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MEx5OGdRMmhsWTJzZ2FXWWdZU0JuYVhabGJpQmpZV3hzWW1GamF5QnBjeUJwYmlCMGFHVWdiR2x6ZEM1Y2JseDBYSFJjZEM4dklFbG1JRzV2SUdGeVozVnRaVzUwSUdseklHZHBkbVZ1TENCeVpYUjFjbTRnZDJobGRHaGxjaUJ2Y2lCdWIzUWdiR2x6ZENCb1lYTWdZMkZzYkdKaFkydHpJR0YwZEdGamFHVmtMbHh1WEhSY2RGeDBhR0Z6T2lCbWRXNWpkR2x2YmlnZ1ptNGdLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJtYmlBL0lHcFJkV1Z5ZVM1cGJrRnljbUY1S0NCbWJpd2diR2x6ZENBcElENGdMVEVnT2lBaElTZ2diR2x6ZENBbUppQnNhWE4wTG14bGJtZDBhQ0FwTzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEM4dklGSmxiVzkyWlNCaGJHd2dZMkZzYkdKaFkydHpJR1p5YjIwZ2RHaGxJR3hwYzNSY2JseDBYSFJjZEdWdGNIUjVPaUJtZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJjZEZ4MGJHbHpkQ0E5SUZ0ZE8xeHVYSFJjZEZ4MFhIUm1hWEpwYm1kTVpXNW5kR2dnUFNBd08xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUmNkSDBzWEc1Y2RGeDBYSFF2THlCSVlYWmxJSFJvWlNCc2FYTjBJR1J2SUc1dmRHaHBibWNnWVc1NWJXOXlaVnh1WEhSY2RGeDBaR2x6WVdKc1pUb2dablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJjZEd4cGMzUWdQU0J6ZEdGamF5QTlJRzFsYlc5eWVTQTlJSFZ1WkdWbWFXNWxaRHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJvYVhNN1hHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MEx5OGdTWE1nYVhRZ1pHbHpZV0pzWldRL1hHNWNkRngwWEhSa2FYTmhZbXhsWkRvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQWhiR2x6ZER0Y2JseDBYSFJjZEgwc1hHNWNkRngwWEhRdkx5Qk1iMk5ySUhSb1pTQnNhWE4wSUdsdUlHbDBjeUJqZFhKeVpXNTBJSE4wWVhSbFhHNWNkRngwWEhSc2IyTnJPaUJtZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJjZEZ4MGMzUmhZMnNnUFNCMWJtUmxabWx1WldRN1hHNWNkRngwWEhSY2RHbG1JQ2dnSVcxbGJXOXllU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnpaV3htTG1ScGMyRmliR1VvS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUmNkSDBzWEc1Y2RGeDBYSFF2THlCSmN5QnBkQ0JzYjJOclpXUS9YRzVjZEZ4MFhIUnNiMk5yWldRNklHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdJWE4wWVdOck8xeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RDOHZJRU5oYkd3Z1lXeHNJR05oYkd4aVlXTnJjeUIzYVhSb0lIUm9aU0JuYVhabGJpQmpiMjUwWlhoMElHRnVaQ0JoY21kMWJXVnVkSE5jYmx4MFhIUmNkR1pwY21WWGFYUm9PaUJtZFc1amRHbHZiaWdnWTI5dWRHVjRkQ3dnWVhKbmN5QXBJSHRjYmx4MFhIUmNkRngwYVdZZ0tDQnNhWE4wSUNZbUlDZ2dJV1pwY21Wa0lIeDhJSE4wWVdOcklDa2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MFlYSm5jeUE5SUdGeVozTWdmSHdnVzEwN1hHNWNkRngwWEhSY2RGeDBZWEpuY3lBOUlGc2dZMjl1ZEdWNGRDd2dZWEpuY3k1emJHbGpaU0EvSUdGeVozTXVjMnhwWTJVb0tTQTZJR0Z5WjNNZ1hUdGNibHgwWEhSY2RGeDBYSFJwWmlBb0lHWnBjbWx1WnlBcElIdGNibHgwWEhSY2RGeDBYSFJjZEhOMFlXTnJMbkIxYzJnb0lHRnlaM01nS1R0Y2JseDBYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWm1seVpTZ2dZWEpuY3lBcE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEdocGN6dGNibHgwWEhSY2RIMHNYRzVjZEZ4MFhIUXZMeUJEWVd4c0lHRnNiQ0IwYUdVZ1kyRnNiR0poWTJ0eklIZHBkR2dnZEdobElHZHBkbVZ1SUdGeVozVnRaVzUwYzF4dVhIUmNkRngwWm1seVpUb2dablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJjZEhObGJHWXVabWx5WlZkcGRHZ29JSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5QXBPMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkR2hwY3p0Y2JseDBYSFJjZEgwc1hHNWNkRngwWEhRdkx5QlVieUJyYm05M0lHbG1JSFJvWlNCallXeHNZbUZqYTNNZ2FHRjJaU0JoYkhKbFlXUjVJR0psWlc0Z1kyRnNiR1ZrSUdGMElHeGxZWE4wSUc5dVkyVmNibHgwWEhSY2RHWnBjbVZrT2lCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlDRWhabWx5WldRN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJ5WlhSMWNtNGdjMlZzWmp0Y2JuMDdYRzVjYmx4dWFsRjFaWEo1TG1WNGRHVnVaQ2g3WEc1Y2JseDBSR1ZtWlhKeVpXUTZJR1oxYm1OMGFXOXVLQ0JtZFc1aklDa2dlMXh1WEhSY2RIWmhjaUIwZFhCc1pYTWdQU0JiWEc1Y2RGeDBYSFJjZEM4dklHRmpkR2x2Yml3Z1lXUmtJR3hwYzNSbGJtVnlMQ0JzYVhOMFpXNWxjaUJzYVhOMExDQm1hVzVoYkNCemRHRjBaVnh1WEhSY2RGeDBYSFJiSUZ3aWNtVnpiMngyWlZ3aUxDQmNJbVJ2Ym1WY0lpd2dhbEYxWlhKNUxrTmhiR3hpWVdOcmN5aGNJbTl1WTJVZ2JXVnRiM0o1WENJcExDQmNJbkpsYzI5c2RtVmtYQ0lnWFN4Y2JseDBYSFJjZEZ4MFd5QmNJbkpsYW1WamRGd2lMQ0JjSW1aaGFXeGNJaXdnYWxGMVpYSjVMa05oYkd4aVlXTnJjeWhjSW05dVkyVWdiV1Z0YjNKNVhDSXBMQ0JjSW5KbGFtVmpkR1ZrWENJZ1hTeGNibHgwWEhSY2RGeDBXeUJjSW01dmRHbG1lVndpTENCY0luQnliMmR5WlhOelhDSXNJR3BSZFdWeWVTNURZV3hzWW1GamEzTW9YQ0p0WlcxdmNubGNJaWtnWFZ4dVhIUmNkRngwWFN4Y2JseDBYSFJjZEhOMFlYUmxJRDBnWENKd1pXNWthVzVuWENJc1hHNWNkRngwWEhSd2NtOXRhWE5sSUQwZ2UxeHVYSFJjZEZ4MFhIUnpkR0YwWlRvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSE4wWVhSbE8xeHVYSFJjZEZ4MFhIUjlMRnh1WEhSY2RGeDBYSFJoYkhkaGVYTTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwWEhSY2RHUmxabVZ5Y21Wa0xtUnZibVVvSUdGeVozVnRaVzUwY3lBcExtWmhhV3dvSUdGeVozVnRaVzUwY3lBcE8xeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQjBhR2x6TzF4dVhIUmNkRngwWEhSOUxGeHVYSFJjZEZ4MFhIUjBhR1Z1T2lCbWRXNWpkR2x2YmlnZ0x5b2dabTVFYjI1bExDQm1ia1poYVd3c0lHWnVVSEp2WjNKbGMzTWdLaThnS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdadWN5QTlJR0Z5WjNWdFpXNTBjenRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnYWxGMVpYSjVMa1JsWm1WeWNtVmtLR1oxYm1OMGFXOXVLQ0J1WlhkRVpXWmxjaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR3BSZFdWeWVTNWxZV05vS0NCMGRYQnNaWE1zSUdaMWJtTjBhVzl1S0NCcExDQjBkWEJzWlNBcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGRtRnlJR1p1SUQwZ2FsRjFaWEo1TG1selJuVnVZM1JwYjI0b0lHWnVjMXNnYVNCZElDa2dKaVlnWm01eld5QnBJRjA3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzh2SUdSbFptVnljbVZrV3lCa2IyNWxJSHdnWm1GcGJDQjhJSEJ5YjJkeVpYTnpJRjBnWm05eUlHWnZjbmRoY21ScGJtY2dZV04wYVc5dWN5QjBieUJ1WlhkRVpXWmxjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUmtaV1psY25KbFpGc2dkSFZ3YkdWYk1WMGdYU2htZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSMllYSWdjbVYwZFhKdVpXUWdQU0JtYmlBbUppQm1iaTVoY0hCc2VTZ2dkR2hwY3l3Z1lYSm5kVzFsYm5SeklDazdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBhV1lnS0NCeVpYUjFjbTVsWkNBbUppQnFVWFZsY25rdWFYTkdkVzVqZEdsdmJpZ2djbVYwZFhKdVpXUXVjSEp2YldselpTQXBJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MGNtVjBkWEp1WldRdWNISnZiV2x6WlNncFhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkQzVrYjI1bEtDQnVaWGRFWldabGNpNXlaWE52YkhabElDbGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwTG1aaGFXd29JRzVsZDBSbFptVnlMbkpsYW1WamRDQXBYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEM1d2NtOW5jbVZ6Y3lnZ2JtVjNSR1ZtWlhJdWJtOTBhV1o1SUNrN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RHNWxkMFJsWm1WeVd5QjBkWEJzWlZzZ01DQmRJQ3NnWENKWGFYUm9YQ0lnWFNnZ2RHaHBjeUE5UFQwZ2NISnZiV2x6WlNBL0lHNWxkMFJsWm1WeUxuQnliMjFwYzJVb0tTQTZJSFJvYVhNc0lHWnVJRDhnV3lCeVpYUjFjbTVsWkNCZElEb2dZWEpuZFcxbGJuUnpJQ2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSY2RGeDBabTV6SUQwZ2JuVnNiRHRjYmx4MFhIUmNkRngwWEhSOUtTNXdjbTl0YVhObEtDazdYRzVjZEZ4MFhIUmNkSDBzWEc1Y2RGeDBYSFJjZEM4dklFZGxkQ0JoSUhCeWIyMXBjMlVnWm05eUlIUm9hWE1nWkdWbVpYSnlaV1JjYmx4MFhIUmNkRngwTHk4Z1NXWWdiMkpxSUdseklIQnliM1pwWkdWa0xDQjBhR1VnY0hKdmJXbHpaU0JoYzNCbFkzUWdhWE1nWVdSa1pXUWdkRzhnZEdobElHOWlhbVZqZEZ4dVhIUmNkRngwWEhSd2NtOXRhWE5sT2lCbWRXNWpkR2x2YmlnZ2IySnFJQ2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCdlltb2dJVDBnYm5Wc2JDQS9JR3BSZFdWeWVTNWxlSFJsYm1Rb0lHOWlhaXdnY0hKdmJXbHpaU0FwSURvZ2NISnZiV2x6WlR0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RHUmxabVZ5Y21Wa0lEMGdlMzA3WEc1Y2JseDBYSFF2THlCTFpXVndJSEJwY0dVZ1ptOXlJR0poWTJzdFkyOXRjR0YwWEc1Y2RGeDBjSEp2YldselpTNXdhWEJsSUQwZ2NISnZiV2x6WlM1MGFHVnVPMXh1WEc1Y2RGeDBMeThnUVdSa0lHeHBjM1F0YzNCbFkybG1hV01nYldWMGFHOWtjMXh1WEhSY2RHcFJkV1Z5ZVM1bFlXTm9LQ0IwZFhCc1pYTXNJR1oxYm1OMGFXOXVLQ0JwTENCMGRYQnNaU0FwSUh0Y2JseDBYSFJjZEhaaGNpQnNhWE4wSUQwZ2RIVndiR1ZiSURJZ1hTeGNibHgwWEhSY2RGeDBjM1JoZEdWVGRISnBibWNnUFNCMGRYQnNaVnNnTXlCZE8xeHVYRzVjZEZ4MFhIUXZMeUJ3Y205dGFYTmxXeUJrYjI1bElId2dabUZwYkNCOElIQnliMmR5WlhOeklGMGdQU0JzYVhOMExtRmtaRnh1WEhSY2RGeDBjSEp2YldselpWc2dkSFZ3YkdWYk1WMGdYU0E5SUd4cGMzUXVZV1JrTzF4dVhHNWNkRngwWEhRdkx5QklZVzVrYkdVZ2MzUmhkR1ZjYmx4MFhIUmNkR2xtSUNnZ2MzUmhkR1ZUZEhKcGJtY2dLU0I3WEc1Y2RGeDBYSFJjZEd4cGMzUXVZV1JrS0daMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEZ4MFhIUmNkQzh2SUhOMFlYUmxJRDBnV3lCeVpYTnZiSFpsWkNCOElISmxhbVZqZEdWa0lGMWNibHgwWEhSY2RGeDBYSFJ6ZEdGMFpTQTlJSE4wWVhSbFUzUnlhVzVuTzF4dVhHNWNkRngwWEhSY2RDOHZJRnNnY21WcVpXTjBYMnhwYzNRZ2ZDQnlaWE52YkhabFgyeHBjM1FnWFM1a2FYTmhZbXhsT3lCd2NtOW5jbVZ6YzE5c2FYTjBMbXh2WTJ0Y2JseDBYSFJjZEZ4MGZTd2dkSFZ3YkdWeld5QnBJRjRnTVNCZFd5QXlJRjB1WkdsellXSnNaU3dnZEhWd2JHVnpXeUF5SUYxYklESWdYUzVzYjJOcklDazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzh2SUdSbFptVnljbVZrV3lCeVpYTnZiSFpsSUh3Z2NtVnFaV04wSUh3Z2JtOTBhV1o1SUYxY2JseDBYSFJjZEdSbFptVnljbVZrV3lCMGRYQnNaVnN3WFNCZElEMGdablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJjZEdSbFptVnljbVZrV3lCMGRYQnNaVnN3WFNBcklGd2lWMmwwYUZ3aUlGMG9JSFJvYVhNZ1BUMDlJR1JsWm1WeWNtVmtJRDhnY0hKdmJXbHpaU0E2SUhSb2FYTXNJR0Z5WjNWdFpXNTBjeUFwTzF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEdocGN6dGNibHgwWEhSY2RIMDdYRzVjZEZ4MFhIUmtaV1psY25KbFpGc2dkSFZ3YkdWYk1GMGdLeUJjSWxkcGRHaGNJaUJkSUQwZ2JHbHpkQzVtYVhKbFYybDBhRHRjYmx4MFhIUjlLVHRjYmx4dVhIUmNkQzh2SUUxaGEyVWdkR2hsSUdSbFptVnljbVZrSUdFZ2NISnZiV2x6WlZ4dVhIUmNkSEJ5YjIxcGMyVXVjSEp2YldselpTZ2daR1ZtWlhKeVpXUWdLVHRjYmx4dVhIUmNkQzh2SUVOaGJHd2daMmwyWlc0Z1puVnVZeUJwWmlCaGJubGNibHgwWEhScFppQW9JR1oxYm1NZ0tTQjdYRzVjZEZ4MFhIUm1kVzVqTG1OaGJHd29JR1JsWm1WeWNtVmtMQ0JrWldabGNuSmxaQ0FwTzF4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUVGc2JDQmtiMjVsSVZ4dVhIUmNkSEpsZEhWeWJpQmtaV1psY25KbFpEdGNibHgwZlN4Y2JseHVYSFF2THlCRVpXWmxjbkpsWkNCb1pXeHdaWEpjYmx4MGQyaGxiam9nWm5WdVkzUnBiMjRvSUhOMVltOXlaR2x1WVhSbElDOHFJQ3dnTGk0dUxDQnpkV0p2Y21ScGJtRjBaVTRnS2k4Z0tTQjdYRzVjZEZ4MGRtRnlJR2tnUFNBd0xGeHVYSFJjZEZ4MGNtVnpiMngyWlZaaGJIVmxjeUE5SUhOc2FXTmxMbU5oYkd3b0lHRnlaM1Z0Wlc1MGN5QXBMRnh1WEhSY2RGeDBiR1Z1WjNSb0lEMGdjbVZ6YjJ4MlpWWmhiSFZsY3k1c1pXNW5kR2dzWEc1Y2JseDBYSFJjZEM4dklIUm9aU0JqYjNWdWRDQnZaaUIxYm1OdmJYQnNaWFJsWkNCemRXSnZjbVJwYm1GMFpYTmNibHgwWEhSY2RISmxiV0ZwYm1sdVp5QTlJR3hsYm1kMGFDQWhQVDBnTVNCOGZDQW9JSE4xWW05eVpHbHVZWFJsSUNZbUlHcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQnpkV0p2Y21ScGJtRjBaUzV3Y205dGFYTmxJQ2tnS1NBL0lHeGxibWQwYUNBNklEQXNYRzVjYmx4MFhIUmNkQzh2SUhSb1pTQnRZWE4wWlhJZ1JHVm1aWEp5WldRdUlFbG1JSEpsYzI5c2RtVldZV3gxWlhNZ1kyOXVjMmx6ZENCdlppQnZibXg1SUdFZ2MybHVaMnhsSUVSbFptVnljbVZrTENCcWRYTjBJSFZ6WlNCMGFHRjBMbHh1WEhSY2RGeDBaR1ZtWlhKeVpXUWdQU0J5WlcxaGFXNXBibWNnUFQwOUlERWdQeUJ6ZFdKdmNtUnBibUYwWlNBNklHcFJkV1Z5ZVM1RVpXWmxjbkpsWkNncExGeHVYRzVjZEZ4MFhIUXZMeUJWY0dSaGRHVWdablZ1WTNScGIyNGdabTl5SUdKdmRHZ2djbVZ6YjJ4MlpTQmhibVFnY0hKdlozSmxjM01nZG1Gc2RXVnpYRzVjZEZ4MFhIUjFjR1JoZEdWR2RXNWpJRDBnWm5WdVkzUnBiMjRvSUdrc0lHTnZiblJsZUhSekxDQjJZV3gxWlhNZ0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpZ2dkbUZzZFdVZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWTI5dWRHVjRkSE5iSUdrZ1hTQTlJSFJvYVhNN1hHNWNkRngwWEhSY2RGeDBkbUZzZFdWeld5QnBJRjBnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01TQS9JSE5zYVdObExtTmhiR3dvSUdGeVozVnRaVzUwY3lBcElEb2dkbUZzZFdVN1hHNWNkRngwWEhSY2RGeDBhV1lnS0NCMllXeDFaWE1nUFQwOUlIQnliMmR5WlhOelZtRnNkV1Z6SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWkdWbVpYSnlaV1F1Ym05MGFXWjVWMmwwYUNnZ1kyOXVkR1Y0ZEhNc0lIWmhiSFZsY3lBcE8xeHVYSFJjZEZ4MFhIUmNkSDBnWld4elpTQnBaaUFvSUNFb0lDMHRjbVZ0WVdsdWFXNW5JQ2tnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJrWldabGNuSmxaQzV5WlhOdmJIWmxWMmwwYUNnZ1kyOXVkR1Y0ZEhNc0lIWmhiSFZsY3lBcE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEgwc1hHNWNibHgwWEhSY2RIQnliMmR5WlhOelZtRnNkV1Z6TENCd2NtOW5jbVZ6YzBOdmJuUmxlSFJ6TENCeVpYTnZiSFpsUTI5dWRHVjRkSE03WEc1Y2JseDBYSFF2THlCQlpHUWdiR2x6ZEdWdVpYSnpJSFJ2SUVSbFptVnljbVZrSUhOMVltOXlaR2x1WVhSbGN6c2dkSEpsWVhRZ2IzUm9aWEp6SUdGeklISmxjMjlzZG1Wa1hHNWNkRngwYVdZZ0tDQnNaVzVuZEdnZ1BpQXhJQ2tnZTF4dVhIUmNkRngwY0hKdlozSmxjM05XWVd4MVpYTWdQU0J1WlhjZ1FYSnlZWGtvSUd4bGJtZDBhQ0FwTzF4dVhIUmNkRngwY0hKdlozSmxjM05EYjI1MFpYaDBjeUE5SUc1bGR5QkJjbkpoZVNnZ2JHVnVaM1JvSUNrN1hHNWNkRngwWEhSeVpYTnZiSFpsUTI5dWRHVjRkSE1nUFNCdVpYY2dRWEp5WVhrb0lHeGxibWQwYUNBcE8xeHVYSFJjZEZ4MFptOXlJQ2dnT3lCcElEd2diR1Z1WjNSb095QnBLeXNnS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2dnY21WemIyeDJaVlpoYkhWbGMxc2dhU0JkSUNZbUlHcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQnlaWE52YkhabFZtRnNkV1Z6V3lCcElGMHVjSEp2YldselpTQXBJQ2tnZTF4dVhIUmNkRngwWEhSY2RISmxjMjlzZG1WV1lXeDFaWE5iSUdrZ1hTNXdjbTl0YVhObEtDbGNibHgwWEhSY2RGeDBYSFJjZEM1a2IyNWxLQ0IxY0dSaGRHVkdkVzVqS0NCcExDQnlaWE52YkhabFEyOXVkR1Y0ZEhNc0lISmxjMjlzZG1WV1lXeDFaWE1nS1NBcFhHNWNkRngwWEhSY2RGeDBYSFF1Wm1GcGJDZ2daR1ZtWlhKeVpXUXVjbVZxWldOMElDbGNibHgwWEhSY2RGeDBYSFJjZEM1d2NtOW5jbVZ6Y3lnZ2RYQmtZWFJsUm5WdVl5Z2dhU3dnY0hKdlozSmxjM05EYjI1MFpYaDBjeXdnY0hKdlozSmxjM05XWVd4MVpYTWdLU0FwTzF4dVhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RDMHRjbVZ0WVdsdWFXNW5PMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeThnU1dZZ2QyVW5jbVVnYm05MElIZGhhWFJwYm1jZ2IyNGdZVzU1ZEdocGJtY3NJSEpsYzI5c2RtVWdkR2hsSUcxaGMzUmxjbHh1WEhSY2RHbG1JQ2dnSVhKbGJXRnBibWx1WnlBcElIdGNibHgwWEhSY2RHUmxabVZ5Y21Wa0xuSmxjMjlzZG1WWGFYUm9LQ0J5WlhOdmJIWmxRMjl1ZEdWNGRITXNJSEpsYzI5c2RtVldZV3gxWlhNZ0tUdGNibHgwWEhSOVhHNWNibHgwWEhSeVpYUjFjbTRnWkdWbVpYSnlaV1F1Y0hKdmJXbHpaU2dwTzF4dVhIUjlYRzU5S1R0Y2JseHVYRzR2THlCVWFHVWdaR1ZtWlhKeVpXUWdkWE5sWkNCdmJpQkVUMDBnY21WaFpIbGNiblpoY2lCeVpXRmtlVXhwYzNRN1hHNWNibXBSZFdWeWVTNW1iaTV5WldGa2VTQTlJR1oxYm1OMGFXOXVLQ0JtYmlBcElIdGNibHgwTHk4Z1FXUmtJSFJvWlNCallXeHNZbUZqYTF4dVhIUnFVWFZsY25rdWNtVmhaSGt1Y0hKdmJXbHpaU2dwTG1SdmJtVW9JR1p1SUNrN1hHNWNibHgwY21WMGRYSnVJSFJvYVhNN1hHNTlPMXh1WEc1cVVYVmxjbmt1WlhoMFpXNWtLSHRjYmx4MEx5OGdTWE1nZEdobElFUlBUU0J5WldGa2VTQjBieUJpWlNCMWMyVmtQeUJUWlhRZ2RHOGdkSEoxWlNCdmJtTmxJR2wwSUc5alkzVnljeTVjYmx4MGFYTlNaV0ZrZVRvZ1ptRnNjMlVzWEc1Y2JseDBMeThnUVNCamIzVnVkR1Z5SUhSdklIUnlZV05ySUdodmR5QnRZVzU1SUdsMFpXMXpJSFJ2SUhkaGFYUWdabTl5SUdKbFptOXlaVnh1WEhRdkx5QjBhR1VnY21WaFpIa2daWFpsYm5RZ1ptbHlaWE11SUZObFpTQWpOamM0TVZ4dVhIUnlaV0ZrZVZkaGFYUTZJREVzWEc1Y2JseDBMeThnU0c5c1pDQW9iM0lnY21Wc1pXRnpaU2tnZEdobElISmxZV1I1SUdWMlpXNTBYRzVjZEdodmJHUlNaV0ZrZVRvZ1puVnVZM1JwYjI0b0lHaHZiR1FnS1NCN1hHNWNkRngwYVdZZ0tDQm9iMnhrSUNrZ2UxeHVYSFJjZEZ4MGFsRjFaWEo1TG5KbFlXUjVWMkZwZENzck8xeHVYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJxVVhWbGNua3VjbVZoWkhrb0lIUnlkV1VnS1R0Y2JseDBYSFI5WEc1Y2RIMHNYRzVjYmx4MEx5OGdTR0Z1Wkd4bElIZG9aVzRnZEdobElFUlBUU0JwY3lCeVpXRmtlVnh1WEhSeVpXRmtlVG9nWm5WdVkzUnBiMjRvSUhkaGFYUWdLU0I3WEc1Y2JseDBYSFF2THlCQlltOXlkQ0JwWmlCMGFHVnlaU0JoY21VZ2NHVnVaR2x1WnlCb2IyeGtjeUJ2Y2lCM1pTZHlaU0JoYkhKbFlXUjVJSEpsWVdSNVhHNWNkRngwYVdZZ0tDQjNZV2wwSUQwOVBTQjBjblZsSUQ4Z0xTMXFVWFZsY25rdWNtVmhaSGxYWVdsMElEb2dhbEYxWlhKNUxtbHpVbVZoWkhrZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200N1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1VtVnRaVzFpWlhJZ2RHaGhkQ0IwYUdVZ1JFOU5JR2x6SUhKbFlXUjVYRzVjZEZ4MGFsRjFaWEo1TG1selVtVmhaSGtnUFNCMGNuVmxPMXh1WEc1Y2RGeDBMeThnU1dZZ1lTQnViM0p0WVd3Z1JFOU5JRkpsWVdSNUlHVjJaVzUwSUdacGNtVmtMQ0JrWldOeVpXMWxiblFzSUdGdVpDQjNZV2wwSUdsbUlHNWxaV1FnWW1WY2JseDBYSFJwWmlBb0lIZGhhWFFnSVQwOUlIUnlkV1VnSmlZZ0xTMXFVWFZsY25rdWNtVmhaSGxYWVdsMElENGdNQ0FwSUh0Y2JseDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJKWmlCMGFHVnlaU0JoY21VZ1puVnVZM1JwYjI1eklHSnZkVzVrTENCMGJ5QmxlR1ZqZFhSbFhHNWNkRngwY21WaFpIbE1hWE4wTG5KbGMyOXNkbVZYYVhSb0tDQmtiMk4xYldWdWRDd2dXeUJxVVhWbGNua2dYU0FwTzF4dVhHNWNkRngwTHk4Z1ZISnBaMmRsY2lCaGJua2dZbTkxYm1RZ2NtVmhaSGtnWlhabGJuUnpYRzVjZEZ4MGFXWWdLQ0JxVVhWbGNua3VabTR1ZEhKcFoyZGxja2hoYm1Sc1pYSWdLU0I3WEc1Y2RGeDBYSFJxVVhWbGNua29JR1J2WTNWdFpXNTBJQ2t1ZEhKcFoyZGxja2hoYm1Sc1pYSW9JRndpY21WaFpIbGNJaUFwTzF4dVhIUmNkRngwYWxGMVpYSjVLQ0JrYjJOMWJXVnVkQ0FwTG05bVppZ2dYQ0p5WldGa2VWd2lJQ2s3WEc1Y2RGeDBmVnh1WEhSOVhHNTlLVHRjYmx4dUx5b3FYRzRnS2lCVWFHVWdjbVZoWkhrZ1pYWmxiblFnYUdGdVpHeGxjaUJoYm1RZ2MyVnNaaUJqYkdWaGJuVndJRzFsZEdodlpGeHVJQ292WEc1bWRXNWpkR2x2YmlCamIyMXdiR1YwWldRb0tTQjdYRzVjZEdSdlkzVnRaVzUwTG5KbGJXOTJaVVYyWlc1MFRHbHpkR1Z1WlhJb0lGd2lSRTlOUTI5dWRHVnVkRXh2WVdSbFpGd2lMQ0JqYjIxd2JHVjBaV1FzSUdaaGJITmxJQ2s3WEc1Y2RIZHBibVJ2ZHk1eVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUtDQmNJbXh2WVdSY0lpd2dZMjl0Y0d4bGRHVmtMQ0JtWVd4elpTQXBPMXh1WEhScVVYVmxjbmt1Y21WaFpIa29LVHRjYm4xY2JseHVhbEYxWlhKNUxuSmxZV1I1TG5CeWIyMXBjMlVnUFNCbWRXNWpkR2x2YmlnZ2IySnFJQ2tnZTF4dVhIUnBaaUFvSUNGeVpXRmtlVXhwYzNRZ0tTQjdYRzVjYmx4MFhIUnlaV0ZrZVV4cGMzUWdQU0JxVVhWbGNua3VSR1ZtWlhKeVpXUW9LVHRjYmx4dVhIUmNkQzh2SUVOaGRHTm9JR05oYzJWeklIZG9aWEpsSUNRb1pHOWpkVzFsYm5RcExuSmxZV1I1S0NrZ2FYTWdZMkZzYkdWa0lHRm1kR1Z5SUhSb1pTQmljbTkzYzJWeUlHVjJaVzUwSUdoaGN5QmhiSEpsWVdSNUlHOWpZM1Z5Y21Wa0xseHVYSFJjZEM4dklGZGxJRzl1WTJVZ2RISnBaV1FnZEc4Z2RYTmxJSEpsWVdSNVUzUmhkR1VnWENKcGJuUmxjbUZqZEdsMlpWd2lJR2hsY21Vc0lHSjFkQ0JwZENCallYVnpaV1FnYVhOemRXVnpJR3hwYTJVZ2RHaGxJRzl1WlZ4dVhIUmNkQzh2SUdScGMyTnZkbVZ5WldRZ1lua2dRMmh5YVhOVElHaGxjbVU2SUdoMGRIQTZMeTlpZFdkekxtcHhkV1Z5ZVM1amIyMHZkR2xqYTJWMEx6RXlNamd5STJOdmJXMWxiblE2TVRWY2JseDBYSFJwWmlBb0lHUnZZM1Z0Wlc1MExuSmxZV1I1VTNSaGRHVWdQVDA5SUZ3aVkyOXRjR3hsZEdWY0lpQXBJSHRjYmx4MFhIUmNkQzh2SUVoaGJtUnNaU0JwZENCaGMzbHVZMmh5YjI1dmRYTnNlU0IwYnlCaGJHeHZkeUJ6WTNKcGNIUnpJSFJvWlNCdmNIQnZjblIxYm1sMGVTQjBieUJrWld4aGVTQnlaV0ZrZVZ4dVhIUmNkRngwYzJWMFZHbHRaVzkxZENnZ2FsRjFaWEo1TG5KbFlXUjVJQ2s3WEc1Y2JseDBYSFI5SUdWc2MyVWdlMXh1WEc1Y2RGeDBYSFF2THlCVmMyVWdkR2hsSUdoaGJtUjVJR1YyWlc1MElHTmhiR3hpWVdOclhHNWNkRngwWEhSa2IyTjFiV1Z1ZEM1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0NCY0lrUlBUVU52Ym5SbGJuUk1iMkZrWldSY0lpd2dZMjl0Y0d4bGRHVmtMQ0JtWVd4elpTQXBPMXh1WEc1Y2RGeDBYSFF2THlCQklHWmhiR3hpWVdOcklIUnZJSGRwYm1SdmR5NXZibXh2WVdRc0lIUm9ZWFFnZDJsc2JDQmhiSGRoZVhNZ2QyOXlhMXh1WEhSY2RGeDBkMmx1Wkc5M0xtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0lGd2liRzloWkZ3aUxDQmpiMjF3YkdWMFpXUXNJR1poYkhObElDazdYRzVjZEZ4MGZWeHVYSFI5WEc1Y2RISmxkSFZ5YmlCeVpXRmtlVXhwYzNRdWNISnZiV2x6WlNnZ2IySnFJQ2s3WEc1OU8xeHVYRzR2THlCTGFXTnJJRzltWmlCMGFHVWdSRTlOSUhKbFlXUjVJR05vWldOcklHVjJaVzRnYVdZZ2RHaGxJSFZ6WlhJZ1pHOWxjeUJ1YjNSY2JtcFJkV1Z5ZVM1eVpXRmtlUzV3Y205dGFYTmxLQ2s3WEc1Y2JseHVYRzVjYmk4dklFMTFiSFJwWm5WdVkzUnBiMjVoYkNCdFpYUm9iMlFnZEc4Z1oyVjBJR0Z1WkNCelpYUWdkbUZzZFdWeklHOW1JR0VnWTI5c2JHVmpkR2x2Ymx4dUx5OGdWR2hsSUhaaGJIVmxMM01nWTJGdUlHOXdkR2x2Ym1Gc2JIa2dZbVVnWlhobFkzVjBaV1FnYVdZZ2FYUW5jeUJoSUdaMWJtTjBhVzl1WEc1MllYSWdZV05qWlhOeklEMGdhbEYxWlhKNUxtRmpZMlZ6Y3lBOUlHWjFibU4wYVc5dUtDQmxiR1Z0Y3l3Z1ptNHNJR3RsZVN3Z2RtRnNkV1VzSUdOb1lXbHVZV0pzWlN3Z1pXMXdkSGxIWlhRc0lISmhkeUFwSUh0Y2JseDBkbUZ5SUdrZ1BTQXdMRnh1WEhSY2RHeGxiaUE5SUdWc1pXMXpMbXhsYm1kMGFDeGNibHgwWEhSaWRXeHJJRDBnYTJWNUlEMDlJRzUxYkd3N1hHNWNibHgwTHk4Z1UyVjBjeUJ0WVc1NUlIWmhiSFZsYzF4dVhIUnBaaUFvSUdwUmRXVnllUzUwZVhCbEtDQnJaWGtnS1NBOVBUMGdYQ0p2WW1wbFkzUmNJaUFwSUh0Y2JseDBYSFJqYUdGcGJtRmliR1VnUFNCMGNuVmxPMXh1WEhSY2RHWnZjaUFvSUdrZ2FXNGdhMlY1SUNrZ2UxeHVYSFJjZEZ4MGFsRjFaWEo1TG1GalkyVnpjeWdnWld4bGJYTXNJR1p1TENCcExDQnJaWGxiYVYwc0lIUnlkV1VzSUdWdGNIUjVSMlYwTENCeVlYY2dLVHRjYmx4MFhIUjlYRzVjYmx4MEx5OGdVMlYwY3lCdmJtVWdkbUZzZFdWY2JseDBmU0JsYkhObElHbG1JQ2dnZG1Gc2RXVWdJVDA5SUhWdVpHVm1hVzVsWkNBcElIdGNibHgwWEhSamFHRnBibUZpYkdVZ1BTQjBjblZsTzF4dVhHNWNkRngwYVdZZ0tDQWhhbEYxWlhKNUxtbHpSblZ1WTNScGIyNG9JSFpoYkhWbElDa2dLU0I3WEc1Y2RGeDBYSFJ5WVhjZ1BTQjBjblZsTzF4dVhIUmNkSDFjYmx4dVhIUmNkR2xtSUNnZ1luVnNheUFwSUh0Y2JseDBYSFJjZEM4dklFSjFiR3NnYjNCbGNtRjBhVzl1Y3lCeWRXNGdZV2RoYVc1emRDQjBhR1VnWlc1MGFYSmxJSE5sZEZ4dVhIUmNkRngwYVdZZ0tDQnlZWGNnS1NCN1hHNWNkRngwWEhSY2RHWnVMbU5oYkd3b0lHVnNaVzF6TENCMllXeDFaU0FwTzF4dVhIUmNkRngwWEhSbWJpQTlJRzUxYkd3N1hHNWNibHgwWEhSY2RDOHZJQzR1TG1WNFkyVndkQ0IzYUdWdUlHVjRaV04xZEdsdVp5Qm1kVzVqZEdsdmJpQjJZV3gxWlhOY2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEdKMWJHc2dQU0JtYmp0Y2JseDBYSFJjZEZ4MFptNGdQU0JtZFc1amRHbHZiaWdnWld4bGJTd2dhMlY1TENCMllXeDFaU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z1luVnNheTVqWVd4c0tDQnFVWFZsY25rb0lHVnNaVzBnS1N3Z2RtRnNkV1VnS1R0Y2JseDBYSFJjZEZ4MGZUdGNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNibHgwWEhScFppQW9JR1p1SUNrZ2UxeHVYSFJjZEZ4MFptOXlJQ2dnT3lCcElEd2diR1Z1T3lCcEt5c2dLU0I3WEc1Y2RGeDBYSFJjZEdadUtDQmxiR1Z0YzF0cFhTd2dhMlY1TENCeVlYY2dQeUIyWVd4MVpTQTZJSFpoYkhWbExtTmhiR3dvSUdWc1pXMXpXMmxkTENCcExDQm1iaWdnWld4bGJYTmJhVjBzSUd0bGVTQXBJQ2tnS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMWNibHh1WEhSeVpYUjFjbTRnWTJoaGFXNWhZbXhsSUQ5Y2JseDBYSFJsYkdWdGN5QTZYRzVjYmx4MFhIUXZMeUJIWlhSelhHNWNkRngwWW5Wc2F5QS9YRzVjZEZ4MFhIUm1iaTVqWVd4c0tDQmxiR1Z0Y3lBcElEcGNibHgwWEhSY2RHeGxiaUEvSUdadUtDQmxiR1Z0YzFzd1hTd2dhMlY1SUNrZ09pQmxiWEIwZVVkbGREdGNibjA3WEc1Y2JseHVMeW9xWEc0Z0tpQkVaWFJsY20xcGJtVnpJSGRvWlhSb1pYSWdZVzRnYjJKcVpXTjBJR05oYmlCb1lYWmxJR1JoZEdGY2JpQXFMMXh1YWxGMVpYSjVMbUZqWTJWd2RFUmhkR0VnUFNCbWRXNWpkR2x2YmlnZ2IzZHVaWElnS1NCN1hHNWNkQzh2SUVGalkyVndkSE1nYjI1c2VUcGNibHgwTHk4Z0lDMGdUbTlrWlZ4dVhIUXZMeUFnSUNBdElFNXZaR1V1UlV4RlRVVk9WRjlPVDBSRlhHNWNkQzh2SUNBZ0lDMGdUbTlrWlM1RVQwTlZUVVZPVkY5T1QwUkZYRzVjZEM4dklDQXRJRTlpYW1WamRGeHVYSFF2THlBZ0lDQXRJRUZ1ZVZ4dVhIUXZLaUJxYzJocGJuUWdMVmN3TVRnZ0tpOWNibHgwY21WMGRYSnVJRzkzYm1WeUxtNXZaR1ZVZVhCbElEMDlQU0F4SUh4OElHOTNibVZ5TG01dlpHVlVlWEJsSUQwOVBTQTVJSHg4SUNFb0lDdHZkMjVsY2k1dWIyUmxWSGx3WlNBcE8xeHVmVHRjYmx4dVhHNW1kVzVqZEdsdmJpQkVZWFJoS0NrZ2UxeHVYSFF2THlCVGRYQndiM0owT2lCQmJtUnliMmxrUERRc1hHNWNkQzh2SUU5c1pDQlhaV0pMYVhRZ1pHOWxjeUJ1YjNRZ2FHRjJaU0JQWW1wbFkzUXVjSEpsZG1WdWRFVjRkR1Z1YzJsdmJuTXZabkpsWlhwbElHMWxkR2h2WkN4Y2JseDBMeThnY21WMGRYSnVJRzVsZHlCbGJYQjBlU0J2WW1wbFkzUWdhVzV6ZEdWaFpDQjNhWFJvSUc1dklGdGJjMlYwWFYwZ1lXTmpaWE56YjNKY2JseDBUMkpxWldOMExtUmxabWx1WlZCeWIzQmxjblI1S0NCMGFHbHpMbU5oWTJobElEMGdlMzBzSURBc0lIdGNibHgwWEhSblpYUTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJSHQ5TzF4dVhIUmNkSDFjYmx4MGZTazdYRzVjYmx4MGRHaHBjeTVsZUhCaGJtUnZJRDBnYWxGMVpYSjVMbVY0Y0dGdVpHOGdLeUJFWVhSaExuVnBaQ3NyTzF4dWZWeHVYRzVFWVhSaExuVnBaQ0E5SURFN1hHNUVZWFJoTG1GalkyVndkSE1nUFNCcVVYVmxjbmt1WVdOalpYQjBSR0YwWVR0Y2JseHVSR0YwWVM1d2NtOTBiM1I1Y0dVZ1BTQjdYRzVjZEd0bGVUb2dablZ1WTNScGIyNG9JRzkzYm1WeUlDa2dlMXh1WEhSY2RDOHZJRmRsSUdOaGJpQmhZMk5sY0hRZ1pHRjBZU0JtYjNJZ2JtOXVMV1ZzWlcxbGJuUWdibTlrWlhNZ2FXNGdiVzlrWlhKdUlHSnliM2R6WlhKekxGeHVYSFJjZEM4dklHSjFkQ0IzWlNCemFHOTFiR1FnYm05MExDQnpaV1VnSXpnek16VXVYRzVjZEZ4MEx5OGdRV3gzWVhseklISmxkSFZ5YmlCMGFHVWdhMlY1SUdadmNpQmhJR1p5YjNwbGJpQnZZbXBsWTNRdVhHNWNkRngwYVdZZ0tDQWhSR0YwWVM1aFkyTmxjSFJ6S0NCdmQyNWxjaUFwSUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SURBN1hHNWNkRngwZlZ4dVhHNWNkRngwZG1GeUlHUmxjMk55YVhCMGIzSWdQU0I3ZlN4Y2JseDBYSFJjZEM4dklFTm9aV05ySUdsbUlIUm9aU0J2ZDI1bGNpQnZZbXBsWTNRZ1lXeHlaV0ZrZVNCb1lYTWdZU0JqWVdOb1pTQnJaWGxjYmx4MFhIUmNkSFZ1Ykc5amF5QTlJRzkzYm1WeVd5QjBhR2x6TG1WNGNHRnVaRzhnWFR0Y2JseHVYSFJjZEM4dklFbG1JRzV2ZEN3Z1kzSmxZWFJsSUc5dVpWeHVYSFJjZEdsbUlDZ2dJWFZ1Ykc5amF5QXBJSHRjYmx4MFhIUmNkSFZ1Ykc5amF5QTlJRVJoZEdFdWRXbGtLeXM3WEc1Y2JseDBYSFJjZEM4dklGTmxZM1Z5WlNCcGRDQnBiaUJoSUc1dmJpMWxiblZ0WlhKaFlteGxMQ0J1YjI0dGQzSnBkR0ZpYkdVZ2NISnZjR1Z5ZEhsY2JseDBYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmNkR1JsYzJOeWFYQjBiM0piSUhSb2FYTXVaWGh3WVc1a2J5QmRJRDBnZXlCMllXeDFaVG9nZFc1c2IyTnJJSDA3WEc1Y2RGeDBYSFJjZEU5aWFtVmpkQzVrWldacGJtVlFjbTl3WlhKMGFXVnpLQ0J2ZDI1bGNpd2daR1Z6WTNKcGNIUnZjaUFwTzF4dVhHNWNkRngwWEhRdkx5QlRkWEJ3YjNKME9pQkJibVJ5YjJsa1BEUmNibHgwWEhSY2RDOHZJRVpoYkd4aVlXTnJJSFJ2SUdFZ2JHVnpjeUJ6WldOMWNtVWdaR1ZtYVc1cGRHbHZibHh1WEhSY2RGeDBmU0JqWVhSamFDQW9JR1VnS1NCN1hHNWNkRngwWEhSY2RHUmxjMk55YVhCMGIzSmJJSFJvYVhNdVpYaHdZVzVrYnlCZElEMGdkVzVzYjJOck8xeHVYSFJjZEZ4MFhIUnFVWFZsY25rdVpYaDBaVzVrS0NCdmQyNWxjaXdnWkdWelkzSnBjSFJ2Y2lBcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseHVYSFJjZEM4dklFVnVjM1Z5WlNCMGFHVWdZMkZqYUdVZ2IySnFaV04wWEc1Y2RGeDBhV1lnS0NBaGRHaHBjeTVqWVdOb1pWc2dkVzVzYjJOcklGMGdLU0I3WEc1Y2RGeDBYSFIwYUdsekxtTmhZMmhsV3lCMWJteHZZMnNnWFNBOUlIdDlPMXh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCMWJteHZZMnM3WEc1Y2RIMHNYRzVjZEhObGREb2dablZ1WTNScGIyNG9JRzkzYm1WeUxDQmtZWFJoTENCMllXeDFaU0FwSUh0Y2JseDBYSFIyWVhJZ2NISnZjQ3hjYmx4MFhIUmNkQzh2SUZSb1pYSmxJRzFoZVNCaVpTQmhiaUIxYm14dlkyc2dZWE56YVdkdVpXUWdkRzhnZEdocGN5QnViMlJsTEZ4dVhIUmNkRngwTHk4Z2FXWWdkR2hsY21VZ2FYTWdibThnWlc1MGNua2dabTl5SUhSb2FYTWdYQ0p2ZDI1bGNsd2lMQ0JqY21WaGRHVWdiMjVsSUdsdWJHbHVaVnh1WEhSY2RGeDBMeThnWVc1a0lITmxkQ0IwYUdVZ2RXNXNiMk5ySUdGeklIUm9iM1ZuYUNCaGJpQnZkMjVsY2lCbGJuUnllU0JvWVdRZ1lXeDNZWGx6SUdWNGFYTjBaV1JjYmx4MFhIUmNkSFZ1Ykc5amF5QTlJSFJvYVhNdWEyVjVLQ0J2ZDI1bGNpQXBMRnh1WEhSY2RGeDBZMkZqYUdVZ1BTQjBhR2x6TG1OaFkyaGxXeUIxYm14dlkyc2dYVHRjYmx4dVhIUmNkQzh2SUVoaGJtUnNaVG9nV3lCdmQyNWxjaXdnYTJWNUxDQjJZV3gxWlNCZElHRnlaM05jYmx4MFhIUnBaaUFvSUhSNWNHVnZaaUJrWVhSaElEMDlQU0JjSW5OMGNtbHVaMXdpSUNrZ2UxeHVYSFJjZEZ4MFkyRmphR1ZiSUdSaGRHRWdYU0E5SUhaaGJIVmxPMXh1WEc1Y2RGeDBMeThnU0dGdVpHeGxPaUJiSUc5M2JtVnlMQ0I3SUhCeWIzQmxjblJwWlhNZ2ZTQmRJR0Z5WjNOY2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBMeThnUm5KbGMyZ2dZWE56YVdkdWJXVnVkSE1nWW5rZ2IySnFaV04wSUdGeVpTQnphR0ZzYkc5M0lHTnZjR2xsWkZ4dVhIUmNkRngwYVdZZ0tDQnFVWFZsY25rdWFYTkZiWEIwZVU5aWFtVmpkQ2dnWTJGamFHVWdLU0FwSUh0Y2JseDBYSFJjZEZ4MGFsRjFaWEo1TG1WNGRHVnVaQ2dnZEdocGN5NWpZV05vWlZzZ2RXNXNiMk5ySUYwc0lHUmhkR0VnS1R0Y2JseDBYSFJjZEM4dklFOTBhR1Z5ZDJselpTd2dZMjl3ZVNCMGFHVWdjSEp2Y0dWeWRHbGxjeUJ2Ym1VdFlua3RiMjVsSUhSdklIUm9aU0JqWVdOb1pTQnZZbXBsWTNSY2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEdadmNpQW9JSEJ5YjNBZ2FXNGdaR0YwWVNBcElIdGNibHgwWEhSY2RGeDBYSFJqWVdOb1pWc2djSEp2Y0NCZElEMGdaR0YwWVZzZ2NISnZjQ0JkTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUmNkSEpsZEhWeWJpQmpZV05vWlR0Y2JseDBmU3hjYmx4MFoyVjBPaUJtZFc1amRHbHZiaWdnYjNkdVpYSXNJR3RsZVNBcElIdGNibHgwWEhRdkx5QkZhWFJvWlhJZ1lTQjJZV3hwWkNCallXTm9aU0JwY3lCbWIzVnVaQ3dnYjNJZ2QybHNiQ0JpWlNCamNtVmhkR1ZrTGx4dVhIUmNkQzh2SUU1bGR5QmpZV05vWlhNZ2QybHNiQ0JpWlNCamNtVmhkR1ZrSUdGdVpDQjBhR1VnZFc1c2IyTnJJSEpsZEhWeWJtVmtMRnh1WEhSY2RDOHZJR0ZzYkc5M2FXNW5JR1JwY21WamRDQmhZMk5sYzNNZ2RHOGdkR2hsSUc1bGQyeDVJR055WldGMFpXUmNibHgwWEhRdkx5QmxiWEIwZVNCa1lYUmhJRzlpYW1WamRDNGdRU0IyWVd4cFpDQnZkMjVsY2lCdlltcGxZM1FnYlhWemRDQmlaU0J3Y205MmFXUmxaQzVjYmx4MFhIUjJZWElnWTJGamFHVWdQU0IwYUdsekxtTmhZMmhsV3lCMGFHbHpMbXRsZVNnZ2IzZHVaWElnS1NCZE8xeHVYRzVjZEZ4MGNtVjBkWEp1SUd0bGVTQTlQVDBnZFc1a1pXWnBibVZrSUQ5Y2JseDBYSFJjZEdOaFkyaGxJRG9nWTJGamFHVmJJR3RsZVNCZE8xeHVYSFI5TEZ4dVhIUmhZMk5sYzNNNklHWjFibU4wYVc5dUtDQnZkMjVsY2l3Z2EyVjVMQ0IyWVd4MVpTQXBJSHRjYmx4MFhIUjJZWElnYzNSdmNtVmtPMXh1WEhSY2RDOHZJRWx1SUdOaGMyVnpJSGRvWlhKbElHVnBkR2hsY2pwY2JseDBYSFF2TDF4dVhIUmNkQzh2SUNBZ01TNGdUbThnYTJWNUlIZGhjeUJ6Y0dWamFXWnBaV1JjYmx4MFhIUXZMeUFnSURJdUlFRWdjM1J5YVc1bklHdGxlU0IzWVhNZ2MzQmxZMmxtYVdWa0xDQmlkWFFnYm04Z2RtRnNkV1VnY0hKdmRtbGtaV1JjYmx4MFhIUXZMMXh1WEhSY2RDOHZJRlJoYTJVZ2RHaGxJRndpY21WaFpGd2lJSEJoZEdnZ1lXNWtJR0ZzYkc5M0lIUm9aU0JuWlhRZ2JXVjBhRzlrSUhSdklHUmxkR1Z5YldsdVpWeHVYSFJjZEM4dklIZG9hV05vSUhaaGJIVmxJSFJ2SUhKbGRIVnliaXdnY21WemNHVmpkR2wyWld4NUlHVnBkR2hsY2pwY2JseDBYSFF2TDF4dVhIUmNkQzh2SUNBZ01TNGdWR2hsSUdWdWRHbHlaU0JqWVdOb1pTQnZZbXBsWTNSY2JseDBYSFF2THlBZ0lESXVJRlJvWlNCa1lYUmhJSE4wYjNKbFpDQmhkQ0IwYUdVZ2EyVjVYRzVjZEZ4MEx5OWNibHgwWEhScFppQW9JR3RsZVNBOVBUMGdkVzVrWldacGJtVmtJSHg4WEc1Y2RGeDBYSFJjZENnb2EyVjVJQ1ltSUhSNWNHVnZaaUJyWlhrZ1BUMDlJRndpYzNSeWFXNW5YQ0lwSUNZbUlIWmhiSFZsSUQwOVBTQjFibVJsWm1sdVpXUXBJQ2tnZTF4dVhHNWNkRngwWEhSemRHOXlaV1FnUFNCMGFHbHpMbWRsZENnZ2IzZHVaWElzSUd0bGVTQXBPMXh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdjM1J2Y21Wa0lDRTlQU0IxYm1SbFptbHVaV1FnUDF4dVhIUmNkRngwWEhSemRHOXlaV1FnT2lCMGFHbHpMbWRsZENnZ2IzZHVaWElzSUdwUmRXVnllUzVqWVcxbGJFTmhjMlVvYTJWNUtTQXBPMXh1WEhSY2RIMWNibHh1WEhSY2RDOHZJRnNxWFZkb1pXNGdkR2hsSUd0bGVTQnBjeUJ1YjNRZ1lTQnpkSEpwYm1jc0lHOXlJR0p2ZEdnZ1lTQnJaWGtnWVc1a0lIWmhiSFZsWEc1Y2RGeDBMeThnWVhKbElITndaV05wWm1sbFpDd2djMlYwSUc5eUlHVjRkR1Z1WkNBb1pYaHBjM1JwYm1jZ2IySnFaV04wY3lrZ2QybDBhQ0JsYVhSb1pYSTZYRzVjZEZ4MEx5OWNibHgwWEhRdkx5QWdJREV1SUVGdUlHOWlhbVZqZENCdlppQndjbTl3WlhKMGFXVnpYRzVjZEZ4MEx5OGdJQ0F5TGlCQklHdGxlU0JoYm1RZ2RtRnNkV1ZjYmx4MFhIUXZMMXh1WEhSY2RIUm9hWE11YzJWMEtDQnZkMjVsY2l3Z2EyVjVMQ0IyWVd4MVpTQXBPMXh1WEc1Y2RGeDBMeThnVTJsdVkyVWdkR2hsSUZ3aWMyVjBYQ0lnY0dGMGFDQmpZVzRnYUdGMlpTQjBkMjhnY0c5emMybGliR1VnWlc1MGNua2djRzlwYm5SelhHNWNkRngwTHk4Z2NtVjBkWEp1SUhSb1pTQmxlSEJsWTNSbFpDQmtZWFJoSUdKaGMyVmtJRzl1SUhkb2FXTm9JSEJoZEdnZ2QyRnpJSFJoYTJWdVd5cGRYRzVjZEZ4MGNtVjBkWEp1SUhaaGJIVmxJQ0U5UFNCMWJtUmxabWx1WldRZ1B5QjJZV3gxWlNBNklHdGxlVHRjYmx4MGZTeGNibHgwY21WdGIzWmxPaUJtZFc1amRHbHZiaWdnYjNkdVpYSXNJR3RsZVNBcElIdGNibHgwWEhSMllYSWdhU3dnYm1GdFpTd2dZMkZ0Wld3c1hHNWNkRngwWEhSMWJteHZZMnNnUFNCMGFHbHpMbXRsZVNnZ2IzZHVaWElnS1N4Y2JseDBYSFJjZEdOaFkyaGxJRDBnZEdocGN5NWpZV05vWlZzZ2RXNXNiMk5ySUYwN1hHNWNibHgwWEhScFppQW9JR3RsZVNBOVBUMGdkVzVrWldacGJtVmtJQ2tnZTF4dVhIUmNkRngwZEdocGN5NWpZV05vWlZzZ2RXNXNiMk5ySUYwZ1BTQjdmVHRjYmx4dVhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUXZMeUJUZFhCd2IzSjBJR0Z5Y21GNUlHOXlJSE53WVdObElITmxjR0Z5WVhSbFpDQnpkSEpwYm1jZ2IyWWdhMlY1YzF4dVhIUmNkRngwYVdZZ0tDQnFVWFZsY25rdWFYTkJjbkpoZVNnZ2EyVjVJQ2tnS1NCN1hHNWNkRngwWEhSY2RDOHZJRWxtSUZ3aWJtRnRaVndpSUdseklHRnVJR0Z5Y21GNUlHOW1JR3RsZVhNdUxpNWNibHgwWEhSY2RGeDBMeThnVjJobGJpQmtZWFJoSUdseklHbHVhWFJwWVd4c2VTQmpjbVZoZEdWa0xDQjJhV0VnS0Z3aWEyVjVYQ0lzSUZ3aWRtRnNYQ0lwSUhOcFoyNWhkSFZ5WlN4Y2JseDBYSFJjZEZ4MEx5OGdhMlY1Y3lCM2FXeHNJR0psSUdOdmJuWmxjblJsWkNCMGJ5QmpZVzFsYkVOaGMyVXVYRzVjZEZ4MFhIUmNkQzh2SUZOcGJtTmxJSFJvWlhKbElHbHpJRzV2SUhkaGVTQjBieUIwWld4c0lGOW9iM2RmSUdFZ2EyVjVJSGRoY3lCaFpHUmxaQ3dnY21WdGIzWmxYRzVjZEZ4MFhIUmNkQzh2SUdKdmRHZ2djR3hoYVc0Z2EyVjVJR0Z1WkNCallXMWxiRU5oYzJVZ2EyVjVMaUFqTVRJM09EWmNibHgwWEhSY2RGeDBMeThnVkdocGN5QjNhV3hzSUc5dWJIa2djR1Z1WVd4cGVtVWdkR2hsSUdGeWNtRjVJR0Z5WjNWdFpXNTBJSEJoZEdndVhHNWNkRngwWEhSY2RHNWhiV1VnUFNCclpYa3VZMjl1WTJGMEtDQnJaWGt1YldGd0tDQnFVWFZsY25rdVkyRnRaV3hEWVhObElDa2dLVHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkR05oYldWc0lEMGdhbEYxWlhKNUxtTmhiV1ZzUTJGelpTZ2dhMlY1SUNrN1hHNWNkRngwWEhSY2RDOHZJRlJ5ZVNCMGFHVWdjM1J5YVc1bklHRnpJR0VnYTJWNUlHSmxabTl5WlNCaGJua2diV0Z1YVhCMWJHRjBhVzl1WEc1Y2RGeDBYSFJjZEdsbUlDZ2dhMlY1SUdsdUlHTmhZMmhsSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRzVoYldVZ1BTQmJJR3RsZVN3Z1kyRnRaV3dnWFR0Y2JseDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUXZMeUJKWmlCaElHdGxlU0IzYVhSb0lIUm9aU0J6Y0dGalpYTWdaWGhwYzNSekxDQjFjMlVnYVhRdVhHNWNkRngwWEhSY2RGeDBMeThnVDNSb1pYSjNhWE5sTENCamNtVmhkR1VnWVc0Z1lYSnlZWGtnWW5rZ2JXRjBZMmhwYm1jZ2JtOXVMWGRvYVhSbGMzQmhZMlZjYmx4MFhIUmNkRngwWEhSdVlXMWxJRDBnWTJGdFpXdzdYRzVjZEZ4MFhIUmNkRngwYm1GdFpTQTlJRzVoYldVZ2FXNGdZMkZqYUdVZ1AxeHVYSFJjZEZ4MFhIUmNkRngwV3lCdVlXMWxJRjBnT2lBb0lHNWhiV1V1YldGMFkyZ29JSEp1YjNSM2FHbDBaU0FwSUh4OElGdGRJQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGFTQTlJRzVoYldVdWJHVnVaM1JvTzF4dVhIUmNkRngwZDJocGJHVWdLQ0JwTFMwZ0tTQjdYRzVjZEZ4MFhIUmNkR1JsYkdWMFpTQmpZV05vWlZzZ2JtRnRaVnNnYVNCZElGMDdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYSFI5TEZ4dVhIUm9ZWE5FWVhSaE9pQm1kVzVqZEdsdmJpZ2diM2R1WlhJZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUNGcVVYVmxjbmt1YVhORmJYQjBlVTlpYW1WamRDaGNibHgwWEhSY2RIUm9hWE11WTJGamFHVmJJRzkzYm1WeVd5QjBhR2x6TG1WNGNHRnVaRzhnWFNCZElIeDhJSHQ5WEc1Y2RGeDBLVHRjYmx4MGZTeGNibHgwWkdselkyRnlaRG9nWm5WdVkzUnBiMjRvSUc5M2JtVnlJQ2tnZTF4dVhIUmNkR2xtSUNnZ2IzZHVaWEpiSUhSb2FYTXVaWGh3WVc1a2J5QmRJQ2tnZTF4dVhIUmNkRngwWkdWc1pYUmxJSFJvYVhNdVkyRmphR1ZiSUc5M2JtVnlXeUIwYUdsekxtVjRjR0Z1Wkc4Z1hTQmRPMXh1WEhSY2RIMWNibHgwZlZ4dWZUdGNiblpoY2lCa1lYUmhYM0J5YVhZZ1BTQnVaWGNnUkdGMFlTZ3BPMXh1WEc1MllYSWdaR0YwWVY5MWMyVnlJRDBnYm1WM0lFUmhkR0VvS1R0Y2JseHVYRzVjYmk4dlhIUkpiWEJzWlcxbGJuUmhkR2x2YmlCVGRXMXRZWEo1WEc0dkwxeHVMeTljZERFdUlFVnVabTl5WTJVZ1FWQkpJSE4xY21aaFkyVWdZVzVrSUhObGJXRnVkR2xqSUdOdmJYQmhkR2xpYVd4cGRIa2dkMmwwYUNBeExqa3VlQ0JpY21GdVkyaGNiaTh2WEhReUxpQkpiWEJ5YjNabElIUm9aU0J0YjJSMWJHVW5jeUJ0WVdsdWRHRnBibUZpYVd4cGRIa2dZbmtnY21Wa2RXTnBibWNnZEdobElITjBiM0poWjJWY2JpOHZYSFJjZEhCaGRHaHpJSFJ2SUdFZ2MybHVaMnhsSUcxbFkyaGhibWx6YlM1Y2JpOHZYSFF6TGlCVmMyVWdkR2hsSUhOaGJXVWdjMmx1WjJ4bElHMWxZMmhoYm1semJTQjBieUJ6ZFhCd2IzSjBJRndpY0hKcGRtRjBaVndpSUdGdVpDQmNJblZ6WlhKY0lpQmtZWFJoTGx4dUx5OWNkRFF1SUY5T1pYWmxjbDhnWlhod2IzTmxJRndpY0hKcGRtRjBaVndpSUdSaGRHRWdkRzhnZFhObGNpQmpiMlJsSUNoVVQwUlBPaUJFY205d0lGOWtZWFJoTENCZmNtVnRiM1psUkdGMFlTbGNiaTh2WEhRMUxpQkJkbTlwWkNCbGVIQnZjMmx1WnlCcGJYQnNaVzFsYm5SaGRHbHZiaUJrWlhSaGFXeHpJRzl1SUhWelpYSWdiMkpxWldOMGN5QW9aV2N1SUdWNGNHRnVaRzhnY0hKdmNHVnlkR2xsY3lsY2JpOHZYSFEyTGlCUWNtOTJhV1JsSUdFZ1kyeGxZWElnY0dGMGFDQm1iM0lnYVcxd2JHVnRaVzUwWVhScGIyNGdkWEJuY21Ga1pTQjBieUJYWldGclRXRndJR2x1SURJd01UUmNibHh1ZG1GeUlISmljbUZqWlNBOUlDOWVLRDg2WEZ4N1cxeGNkMXhjVjEwcVhGeDlmRnhjVzF0Y1hIZGNYRmRkS2x4Y1hTa2tMeXhjYmx4MGNtMTFiSFJwUkdGemFDQTlJQzhvVzBFdFdsMHBMMmM3WEc1Y2JtWjFibU4wYVc5dUlHUmhkR0ZCZEhSeUtDQmxiR1Z0TENCclpYa3NJR1JoZEdFZ0tTQjdYRzVjZEhaaGNpQnVZVzFsTzF4dVhHNWNkQzh2SUVsbUlHNXZkR2hwYm1jZ2QyRnpJR1p2ZFc1a0lHbHVkR1Z5Ym1Gc2JIa3NJSFJ5ZVNCMGJ5Qm1aWFJqYUNCaGJubGNibHgwTHk4Z1pHRjBZU0JtY205dElIUm9aU0JJVkUxTU5TQmtZWFJoTFNvZ1lYUjBjbWxpZFhSbFhHNWNkR2xtSUNnZ1pHRjBZU0E5UFQwZ2RXNWtaV1pwYm1Wa0lDWW1JR1ZzWlcwdWJtOWtaVlI1Y0dVZ1BUMDlJREVnS1NCN1hHNWNkRngwYm1GdFpTQTlJRndpWkdGMFlTMWNJaUFySUd0bGVTNXlaWEJzWVdObEtDQnliWFZzZEdsRVlYTm9MQ0JjSWkwa01Wd2lJQ2t1ZEc5TWIzZGxja05oYzJVb0tUdGNibHgwWEhSa1lYUmhJRDBnWld4bGJTNW5aWFJCZEhSeWFXSjFkR1VvSUc1aGJXVWdLVHRjYmx4dVhIUmNkR2xtSUNnZ2RIbHdaVzltSUdSaGRHRWdQVDA5SUZ3aWMzUnlhVzVuWENJZ0tTQjdYRzVjZEZ4MFhIUjBjbmtnZTF4dVhIUmNkRngwWEhSa1lYUmhJRDBnWkdGMFlTQTlQVDBnWENKMGNuVmxYQ0lnUHlCMGNuVmxJRHBjYmx4MFhIUmNkRngwWEhSa1lYUmhJRDA5UFNCY0ltWmhiSE5sWENJZ1B5Qm1ZV3h6WlNBNlhHNWNkRngwWEhSY2RGeDBaR0YwWVNBOVBUMGdYQ0p1ZFd4c1hDSWdQeUJ1ZFd4c0lEcGNibHgwWEhSY2RGeDBYSFF2THlCUGJteDVJR052Ym5abGNuUWdkRzhnWVNCdWRXMWlaWElnYVdZZ2FYUWdaRzlsYzI0bmRDQmphR0Z1WjJVZ2RHaGxJSE4wY21sdVoxeHVYSFJjZEZ4MFhIUmNkQ3RrWVhSaElDc2dYQ0pjSWlBOVBUMGdaR0YwWVNBL0lDdGtZWFJoSURwY2JseDBYSFJjZEZ4MFhIUnlZbkpoWTJVdWRHVnpkQ2dnWkdGMFlTQXBJRDhnYWxGMVpYSjVMbkJoY25ObFNsTlBUaWdnWkdGMFlTQXBJRHBjYmx4MFhIUmNkRngwWEhSa1lYUmhPMXh1WEhSY2RGeDBmU0JqWVhSamFDZ2daU0FwSUh0OVhHNWNibHgwWEhSY2RDOHZJRTFoYTJVZ2MzVnlaU0IzWlNCelpYUWdkR2hsSUdSaGRHRWdjMjhnYVhRZ2FYTnVKM1FnWTJoaGJtZGxaQ0JzWVhSbGNseHVYSFJjZEZ4MFpHRjBZVjkxYzJWeUxuTmxkQ2dnWld4bGJTd2dhMlY1TENCa1lYUmhJQ2s3WEc1Y2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RHUmhkR0VnUFNCMWJtUmxabWx1WldRN1hHNWNkRngwZlZ4dVhIUjlYRzVjZEhKbGRIVnliaUJrWVhSaE8xeHVmVnh1WEc1cVVYVmxjbmt1WlhoMFpXNWtLSHRjYmx4MGFHRnpSR0YwWVRvZ1puVnVZM1JwYjI0b0lHVnNaVzBnS1NCN1hHNWNkRngwY21WMGRYSnVJR1JoZEdGZmRYTmxjaTVvWVhORVlYUmhLQ0JsYkdWdElDa2dmSHdnWkdGMFlWOXdjbWwyTG1oaGMwUmhkR0VvSUdWc1pXMGdLVHRjYmx4MGZTeGNibHh1WEhSa1lYUmhPaUJtZFc1amRHbHZiaWdnWld4bGJTd2dibUZ0WlN3Z1pHRjBZU0FwSUh0Y2JseDBYSFJ5WlhSMWNtNGdaR0YwWVY5MWMyVnlMbUZqWTJWemN5Z2daV3hsYlN3Z2JtRnRaU3dnWkdGMFlTQXBPMXh1WEhSOUxGeHVYRzVjZEhKbGJXOTJaVVJoZEdFNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCdVlXMWxJQ2tnZTF4dVhIUmNkR1JoZEdGZmRYTmxjaTV5WlcxdmRtVW9JR1ZzWlcwc0lHNWhiV1VnS1R0Y2JseDBmU3hjYmx4dVhIUXZMeUJVVDBSUE9pQk9iM2NnZEdoaGRDQmhiR3dnWTJGc2JITWdkRzhnWDJSaGRHRWdZVzVrSUY5eVpXMXZkbVZFWVhSaElHaGhkbVVnWW1WbGJpQnlaWEJzWVdObFpGeHVYSFF2THlCM2FYUm9JR1JwY21WamRDQmpZV3hzY3lCMGJ5QmtZWFJoWDNCeWFYWWdiV1YwYUc5a2N5d2dkR2hsYzJVZ1kyRnVJR0psSUdSbGNISmxZMkYwWldRdVhHNWNkRjlrWVhSaE9pQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2JtRnRaU3dnWkdGMFlTQXBJSHRjYmx4MFhIUnlaWFIxY200Z1pHRjBZVjl3Y21sMkxtRmpZMlZ6Y3lnZ1pXeGxiU3dnYm1GdFpTd2daR0YwWVNBcE8xeHVYSFI5TEZ4dVhHNWNkRjl5WlcxdmRtVkVZWFJoT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnYm1GdFpTQXBJSHRjYmx4MFhIUmtZWFJoWDNCeWFYWXVjbVZ0YjNabEtDQmxiR1Z0TENCdVlXMWxJQ2s3WEc1Y2RIMWNibjBwTzF4dVhHNXFVWFZsY25rdVptNHVaWGgwWlc1a0tIdGNibHgwWkdGMFlUb2dablZ1WTNScGIyNG9JR3RsZVN3Z2RtRnNkV1VnS1NCN1hHNWNkRngwZG1GeUlHa3NJRzVoYldVc0lHUmhkR0VzWEc1Y2RGeDBYSFJsYkdWdElEMGdkR2hwYzFzZ01DQmRMRnh1WEhSY2RGeDBZWFIwY25NZ1BTQmxiR1Z0SUNZbUlHVnNaVzB1WVhSMGNtbGlkWFJsY3p0Y2JseHVYSFJjZEM4dklFZGxkSE1nWVd4c0lIWmhiSFZsYzF4dVhIUmNkR2xtSUNnZ2EyVjVJRDA5UFNCMWJtUmxabWx1WldRZ0tTQjdYRzVjZEZ4MFhIUnBaaUFvSUhSb2FYTXViR1Z1WjNSb0lDa2dlMXh1WEhSY2RGeDBYSFJrWVhSaElEMGdaR0YwWVY5MWMyVnlMbWRsZENnZ1pXeGxiU0FwTzF4dVhHNWNkRngwWEhSY2RHbG1JQ2dnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVNBbUppQWhaR0YwWVY5d2NtbDJMbWRsZENnZ1pXeGxiU3dnWENKb1lYTkVZWFJoUVhSMGNuTmNJaUFwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR2tnUFNCaGRIUnljeTVzWlc1bmRHZzdYRzVjZEZ4MFhIUmNkRngwZDJocGJHVWdLQ0JwTFMwZ0tTQjdYRzVjYmx4MFhIUmNkRngwWEhSY2RDOHZJRk4xY0hCdmNuUTZJRWxGTVRFclhHNWNkRngwWEhSY2RGeDBYSFF2THlCVWFHVWdZWFIwY25NZ1pXeGxiV1Z1ZEhNZ1kyRnVJR0psSUc1MWJHd2dLQ014TkRnNU5DbGNibHgwWEhSY2RGeDBYSFJjZEdsbUlDZ2dZWFIwY25OYklHa2dYU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwYm1GdFpTQTlJR0YwZEhKeld5QnBJRjB1Ym1GdFpUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGFXWWdLQ0J1WVcxbExtbHVaR1Y0VDJZb0lGd2laR0YwWVMxY0lpQXBJRDA5UFNBd0lDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkRzVoYldVZ1BTQnFVWFZsY25rdVkyRnRaV3hEWVhObEtDQnVZVzFsTG5Oc2FXTmxLRFVwSUNrN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFpHRjBZVUYwZEhJb0lHVnNaVzBzSUc1aGJXVXNJR1JoZEdGYklHNWhiV1VnWFNBcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkR1JoZEdGZmNISnBkaTV6WlhRb0lHVnNaVzBzSUZ3aWFHRnpSR0YwWVVGMGRISnpYQ0lzSUhSeWRXVWdLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnWkdGMFlUdGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QlRaWFJ6SUcxMWJIUnBjR3hsSUhaaGJIVmxjMXh1WEhSY2RHbG1JQ2dnZEhsd1pXOW1JR3RsZVNBOVBUMGdYQ0p2WW1wbFkzUmNJaUFwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUIwYUdsekxtVmhZMmdvWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwWEhSY2RHUmhkR0ZmZFhObGNpNXpaWFFvSUhSb2FYTXNJR3RsZVNBcE8xeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MGZWeHVYRzVjZEZ4MGNtVjBkWEp1SUdGalkyVnpjeWdnZEdocGN5d2dablZ1WTNScGIyNG9JSFpoYkhWbElDa2dlMXh1WEhSY2RGeDBkbUZ5SUdSaGRHRXNYRzVjZEZ4MFhIUmNkR05oYldWc1MyVjVJRDBnYWxGMVpYSjVMbU5oYldWc1EyRnpaU2dnYTJWNUlDazdYRzVjYmx4MFhIUmNkQzh2SUZSb1pTQmpZV3hzYVc1bklHcFJkV1Z5ZVNCdlltcGxZM1FnS0dWc1pXMWxiblFnYldGMFkyaGxjeWtnYVhNZ2JtOTBJR1Z0Y0hSNVhHNWNkRngwWEhRdkx5QW9ZVzVrSUhSb1pYSmxabTl5WlNCb1lYTWdZVzRnWld4bGJXVnVkQ0JoY0hCbFlYSnpJR0YwSUhSb2FYTmJJREFnWFNrZ1lXNWtJSFJvWlZ4dVhIUmNkRngwTHk4Z1lIWmhiSFZsWUNCd1lYSmhiV1YwWlhJZ2QyRnpJRzV2ZENCMWJtUmxabWx1WldRdUlFRnVJR1Z0Y0hSNUlHcFJkV1Z5ZVNCdlltcGxZM1JjYmx4MFhIUmNkQzh2SUhkcGJHd2djbVZ6ZFd4MElHbHVJR0IxYm1SbFptbHVaV1JnSUdadmNpQmxiR1Z0SUQwZ2RHaHBjMXNnTUNCZElIZG9hV05vSUhkcGJHeGNibHgwWEhSY2RDOHZJSFJvY205M0lHRnVJR1Y0WTJWd2RHbHZiaUJwWmlCaGJpQmhkSFJsYlhCMElIUnZJSEpsWVdRZ1lTQmtZWFJoSUdOaFkyaGxJR2x6SUcxaFpHVXVYRzVjZEZ4MFhIUnBaaUFvSUdWc1pXMGdKaVlnZG1Gc2RXVWdQVDA5SUhWdVpHVm1hVzVsWkNBcElIdGNibHgwWEhSY2RGeDBMeThnUVhSMFpXMXdkQ0IwYnlCblpYUWdaR0YwWVNCbWNtOXRJSFJvWlNCallXTm9aVnh1WEhSY2RGeDBYSFF2THlCM2FYUm9JSFJvWlNCclpYa2dZWE10YVhOY2JseDBYSFJjZEZ4MFpHRjBZU0E5SUdSaGRHRmZkWE5sY2k1blpYUW9JR1ZzWlcwc0lHdGxlU0FwTzF4dVhIUmNkRngwWEhScFppQW9JR1JoZEdFZ0lUMDlJSFZ1WkdWbWFXNWxaQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z1pHRjBZVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJRUYwZEdWdGNIUWdkRzhnWjJWMElHUmhkR0VnWm5KdmJTQjBhR1VnWTJGamFHVmNibHgwWEhSY2RGeDBMeThnZDJsMGFDQjBhR1VnYTJWNUlHTmhiV1ZzYVhwbFpGeHVYSFJjZEZ4MFhIUmtZWFJoSUQwZ1pHRjBZVjkxYzJWeUxtZGxkQ2dnWld4bGJTd2dZMkZ0Wld4TFpYa2dLVHRjYmx4MFhIUmNkRngwYVdZZ0tDQmtZWFJoSUNFOVBTQjFibVJsWm1sdVpXUWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUdSaGRHRTdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhRdkx5QkJkSFJsYlhCMElIUnZJRndpWkdselkyOTJaWEpjSWlCMGFHVWdaR0YwWVNCcGJseHVYSFJjZEZ4MFhIUXZMeUJJVkUxTU5TQmpkWE4wYjIwZ1pHRjBZUzBxSUdGMGRISnpYRzVjZEZ4MFhIUmNkR1JoZEdFZ1BTQmtZWFJoUVhSMGNpZ2daV3hsYlN3Z1kyRnRaV3hMWlhrc0lIVnVaR1ZtYVc1bFpDQXBPMXh1WEhSY2RGeDBYSFJwWmlBb0lHUmhkR0VnSVQwOUlIVnVaR1ZtYVc1bFpDQXBJSHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnWkdGMFlUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEM4dklGZGxJSFJ5YVdWa0lISmxZV3hzZVNCb1lYSmtMQ0JpZFhRZ2RHaGxJR1JoZEdFZ1pHOWxjMjRuZENCbGVHbHpkQzVjYmx4MFhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCVFpYUWdkR2hsSUdSaGRHRXVMaTVjYmx4MFhIUmNkSFJvYVhNdVpXRmphQ2htZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJjZEZ4MEx5OGdSbWx5YzNRc0lHRjBkR1Z0Y0hRZ2RHOGdjM1J2Y21VZ1lTQmpiM0I1SUc5eUlISmxabVZ5Wlc1alpTQnZaaUJoYm5sY2JseDBYSFJjZEZ4MEx5OGdaR0YwWVNCMGFHRjBJRzFwWjJoMEozWmxJR0psWlc0Z2MzUnZjbVVnZDJsMGFDQmhJR05oYldWc1EyRnpaV1FnYTJWNUxseHVYSFJjZEZ4MFhIUjJZWElnWkdGMFlTQTlJR1JoZEdGZmRYTmxjaTVuWlhRb0lIUm9hWE1zSUdOaGJXVnNTMlY1SUNrN1hHNWNibHgwWEhSY2RGeDBMeThnUm05eUlFaFVUVXcxSUdSaGRHRXRLaUJoZEhSeWFXSjFkR1VnYVc1MFpYSnZjQ3dnZDJVZ2FHRjJaU0IwYjF4dVhIUmNkRngwWEhRdkx5QnpkRzl5WlNCd2NtOXdaWEowZVNCdVlXMWxjeUIzYVhSb0lHUmhjMmhsY3lCcGJpQmhJR05oYldWc1EyRnpaU0JtYjNKdExseHVYSFJjZEZ4MFhIUXZMeUJVYUdseklHMXBaMmgwSUc1dmRDQmhjSEJzZVNCMGJ5QmhiR3dnY0hKdmNHVnlkR2xsY3k0dUxpcGNibHgwWEhSY2RGeDBaR0YwWVY5MWMyVnlMbk5sZENnZ2RHaHBjeXdnWTJGdFpXeExaWGtzSUhaaGJIVmxJQ2s3WEc1Y2JseDBYSFJjZEZ4MEx5OGdLaTR1TGlCSmJpQjBhR1VnWTJGelpTQnZaaUJ3Y205d1pYSjBhV1Z6SUhSb1lYUWdiV2xuYUhRZ1gyRmpkSFZoYkd4NVgxeHVYSFJjZEZ4MFhIUXZMeUJvWVhabElHUmhjMmhsY3l3Z2QyVWdibVZsWkNCMGJ5QmhiSE52SUhOMGIzSmxJR0VnWTI5d2VTQnZaaUIwYUdGMFhHNWNkRngwWEhSY2RDOHZJSFZ1WTJoaGJtZGxaQ0J3Y205d1pYSjBlUzVjYmx4MFhIUmNkRngwYVdZZ0tDQnJaWGt1YVc1a1pYaFBaaWhjSWkxY0lpa2dJVDA5SUMweElDWW1JR1JoZEdFZ0lUMDlJSFZ1WkdWbWFXNWxaQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmtZWFJoWDNWelpYSXVjMlYwS0NCMGFHbHpMQ0JyWlhrc0lIWmhiSFZsSUNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHBPMXh1WEhSY2RIMHNJRzUxYkd3c0lIWmhiSFZsTENCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01Td2diblZzYkN3Z2RISjFaU0FwTzF4dVhIUjlMRnh1WEc1Y2RISmxiVzkyWlVSaGRHRTZJR1oxYm1OMGFXOXVLQ0JyWlhrZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVaV0ZqYUNobWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RHUmhkR0ZmZFhObGNpNXlaVzF2ZG1Vb0lIUm9hWE1zSUd0bGVTQXBPMXh1WEhSY2RIMHBPMXh1WEhSOVhHNTlLVHRjYmx4dVhHNXFVWFZsY25rdVpYaDBaVzVrS0h0Y2JseDBjWFZsZFdVNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCMGVYQmxMQ0JrWVhSaElDa2dlMXh1WEhSY2RIWmhjaUJ4ZFdWMVpUdGNibHh1WEhSY2RHbG1JQ2dnWld4bGJTQXBJSHRjYmx4MFhIUmNkSFI1Y0dVZ1BTQW9JSFI1Y0dVZ2ZId2dYQ0ptZUZ3aUlDa2dLeUJjSW5GMVpYVmxYQ0k3WEc1Y2RGeDBYSFJ4ZFdWMVpTQTlJR1JoZEdGZmNISnBkaTVuWlhRb0lHVnNaVzBzSUhSNWNHVWdLVHRjYmx4dVhIUmNkRngwTHk4Z1UzQmxaV1FnZFhBZ1pHVnhkV1YxWlNCaWVTQm5aWFIwYVc1bklHOTFkQ0J4ZFdsamEyeDVJR2xtSUhSb2FYTWdhWE1nYW5WemRDQmhJR3h2YjJ0MWNGeHVYSFJjZEZ4MGFXWWdLQ0JrWVhSaElDa2dlMXh1WEhSY2RGeDBYSFJwWmlBb0lDRnhkV1YxWlNCOGZDQnFVWFZsY25rdWFYTkJjbkpoZVNnZ1pHRjBZU0FwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkSEYxWlhWbElEMGdaR0YwWVY5d2NtbDJMbUZqWTJWemN5Z2daV3hsYlN3Z2RIbHdaU3dnYWxGMVpYSjVMbTFoYTJWQmNuSmhlU2hrWVhSaEtTQXBPMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEhGMVpYVmxMbkIxYzJnb0lHUmhkR0VnS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MGNtVjBkWEp1SUhGMVpYVmxJSHg4SUZ0ZE8xeHVYSFJjZEgxY2JseDBmU3hjYmx4dVhIUmtaWEYxWlhWbE9pQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2RIbHdaU0FwSUh0Y2JseDBYSFIwZVhCbElEMGdkSGx3WlNCOGZDQmNJbVo0WENJN1hHNWNibHgwWEhSMllYSWdjWFZsZFdVZ1BTQnFVWFZsY25rdWNYVmxkV1VvSUdWc1pXMHNJSFI1Y0dVZ0tTeGNibHgwWEhSY2RITjBZWEowVEdWdVozUm9JRDBnY1hWbGRXVXViR1Z1WjNSb0xGeHVYSFJjZEZ4MFptNGdQU0J4ZFdWMVpTNXphR2xtZENncExGeHVYSFJjZEZ4MGFHOXZhM01nUFNCcVVYVmxjbmt1WDNGMVpYVmxTRzl2YTNNb0lHVnNaVzBzSUhSNWNHVWdLU3hjYmx4MFhIUmNkRzVsZUhRZ1BTQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUmNkRngwYWxGMVpYSjVMbVJsY1hWbGRXVW9JR1ZzWlcwc0lIUjVjR1VnS1R0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhRdkx5QkpaaUIwYUdVZ1puZ2djWFZsZFdVZ2FYTWdaR1Z4ZFdWMVpXUXNJR0ZzZDJGNWN5QnlaVzF2ZG1VZ2RHaGxJSEJ5YjJkeVpYTnpJSE5sYm5ScGJtVnNYRzVjZEZ4MGFXWWdLQ0JtYmlBOVBUMGdYQ0pwYm5CeWIyZHlaWE56WENJZ0tTQjdYRzVjZEZ4MFhIUm1iaUE5SUhGMVpYVmxMbk5vYVdaMEtDazdYRzVjZEZ4MFhIUnpkR0Z5ZEV4bGJtZDBhQzB0TzF4dVhIUmNkSDFjYmx4dVhIUmNkR2xtSUNnZ1ptNGdLU0I3WEc1Y2JseDBYSFJjZEM4dklFRmtaQ0JoSUhCeWIyZHlaWE56SUhObGJuUnBibVZzSUhSdklIQnlaWFpsYm5RZ2RHaGxJR1o0SUhGMVpYVmxJR1p5YjIwZ1ltVnBibWRjYmx4MFhIUmNkQzh2SUdGMWRHOXRZWFJwWTJGc2JIa2daR1Z4ZFdWMVpXUmNibHgwWEhSY2RHbG1JQ2dnZEhsd1pTQTlQVDBnWENKbWVGd2lJQ2tnZTF4dVhIUmNkRngwWEhSeGRXVjFaUzUxYm5Ob2FXWjBLQ0JjSW1sdWNISnZaM0psYzNOY0lpQXBPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCRGJHVmhjaUIxY0NCMGFHVWdiR0Z6ZENCeGRXVjFaU0J6ZEc5d0lHWjFibU4wYVc5dVhHNWNkRngwWEhSa1pXeGxkR1VnYUc5dmEzTXVjM1J2Y0R0Y2JseDBYSFJjZEdadUxtTmhiR3dvSUdWc1pXMHNJRzVsZUhRc0lHaHZiMnR6SUNrN1hHNWNkRngwZlZ4dVhHNWNkRngwYVdZZ0tDQWhjM1JoY25STVpXNW5kR2dnSmlZZ2FHOXZhM01nS1NCN1hHNWNkRngwWEhSb2IyOXJjeTVsYlhCMGVTNW1hWEpsS0NrN1hHNWNkRngwZlZ4dVhIUjlMRnh1WEc1Y2RDOHZJRTV2ZENCd2RXSnNhV01nTFNCblpXNWxjbUYwWlNCaElIRjFaWFZsU0c5dmEzTWdiMkpxWldOMExDQnZjaUJ5WlhSMWNtNGdkR2hsSUdOMWNuSmxiblFnYjI1bFhHNWNkRjl4ZFdWMVpVaHZiMnR6T2lCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnZEhsd1pTQXBJSHRjYmx4MFhIUjJZWElnYTJWNUlEMGdkSGx3WlNBcklGd2ljWFZsZFdWSWIyOXJjMXdpTzF4dVhIUmNkSEpsZEhWeWJpQmtZWFJoWDNCeWFYWXVaMlYwS0NCbGJHVnRMQ0JyWlhrZ0tTQjhmQ0JrWVhSaFgzQnlhWFl1WVdOalpYTnpLQ0JsYkdWdExDQnJaWGtzSUh0Y2JseDBYSFJjZEdWdGNIUjVPaUJxVVhWbGNua3VRMkZzYkdKaFkydHpLRndpYjI1alpTQnRaVzF2Y25sY0lpa3VZV1JrS0daMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEZ4MFhIUmtZWFJoWDNCeWFYWXVjbVZ0YjNabEtDQmxiR1Z0TENCYklIUjVjR1VnS3lCY0luRjFaWFZsWENJc0lHdGxlU0JkSUNrN1hHNWNkRngwWEhSOUtWeHVYSFJjZEgwcE8xeHVYSFI5WEc1OUtUdGNibHh1YWxGMVpYSjVMbVp1TG1WNGRHVnVaQ2g3WEc1Y2RIRjFaWFZsT2lCbWRXNWpkR2x2YmlnZ2RIbHdaU3dnWkdGMFlTQXBJSHRjYmx4MFhIUjJZWElnYzJWMGRHVnlJRDBnTWp0Y2JseHVYSFJjZEdsbUlDZ2dkSGx3Wlc5bUlIUjVjR1VnSVQwOUlGd2ljM1J5YVc1blhDSWdLU0I3WEc1Y2RGeDBYSFJrWVhSaElEMGdkSGx3WlR0Y2JseDBYSFJjZEhSNWNHVWdQU0JjSW1aNFhDSTdYRzVjZEZ4MFhIUnpaWFIwWlhJdExUdGNibHgwWEhSOVhHNWNibHgwWEhScFppQW9JR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQQ0J6WlhSMFpYSWdLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdhbEYxWlhKNUxuRjFaWFZsS0NCMGFHbHpXekJkTENCMGVYQmxJQ2s3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBjbVYwZFhKdUlHUmhkR0VnUFQwOUlIVnVaR1ZtYVc1bFpDQS9YRzVjZEZ4MFhIUjBhR2x6SURwY2JseDBYSFJjZEhSb2FYTXVaV0ZqYUNobWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RGeDBkbUZ5SUhGMVpYVmxJRDBnYWxGMVpYSjVMbkYxWlhWbEtDQjBhR2x6TENCMGVYQmxMQ0JrWVhSaElDazdYRzVjYmx4MFhIUmNkRngwTHk4Z1JXNXpkWEpsSUdFZ2FHOXZhM01nWm05eUlIUm9hWE1nY1hWbGRXVmNibHgwWEhSY2RGeDBhbEYxWlhKNUxsOXhkV1YxWlVodmIydHpLQ0IwYUdsekxDQjBlWEJsSUNrN1hHNWNibHgwWEhSY2RGeDBhV1lnS0NCMGVYQmxJRDA5UFNCY0ltWjRYQ0lnSmlZZ2NYVmxkV1ZiTUYwZ0lUMDlJRndpYVc1d2NtOW5jbVZ6YzF3aUlDa2dlMXh1WEhSY2RGeDBYSFJjZEdwUmRXVnllUzVrWlhGMVpYVmxLQ0IwYUdsekxDQjBlWEJsSUNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHBPMXh1WEhSOUxGeHVYSFJrWlhGMVpYVmxPaUJtZFc1amRHbHZiaWdnZEhsd1pTQXBJSHRjYmx4MFhIUnlaWFIxY200Z2RHaHBjeTVsWVdOb0tHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RGeDBhbEYxWlhKNUxtUmxjWFZsZFdVb0lIUm9hWE1zSUhSNWNHVWdLVHRjYmx4MFhIUjlLVHRjYmx4MGZTeGNibHgwWTJ4bFlYSlJkV1YxWlRvZ1puVnVZM1JwYjI0b0lIUjVjR1VnS1NCN1hHNWNkRngwY21WMGRYSnVJSFJvYVhNdWNYVmxkV1VvSUhSNWNHVWdmSHdnWENKbWVGd2lMQ0JiWFNBcE8xeHVYSFI5TEZ4dVhIUXZMeUJIWlhRZ1lTQndjbTl0YVhObElISmxjMjlzZG1Wa0lIZG9aVzRnY1hWbGRXVnpJRzltSUdFZ1kyVnlkR0ZwYmlCMGVYQmxYRzVjZEM4dklHRnlaU0JsYlhCMGFXVmtJQ2htZUNCcGN5QjBhR1VnZEhsd1pTQmllU0JrWldaaGRXeDBLVnh1WEhSd2NtOXRhWE5sT2lCbWRXNWpkR2x2YmlnZ2RIbHdaU3dnYjJKcUlDa2dlMXh1WEhSY2RIWmhjaUIwYlhBc1hHNWNkRngwWEhSamIzVnVkQ0E5SURFc1hHNWNkRngwWEhSa1pXWmxjaUE5SUdwUmRXVnllUzVFWldabGNuSmxaQ2dwTEZ4dVhIUmNkRngwWld4bGJXVnVkSE1nUFNCMGFHbHpMRnh1WEhSY2RGeDBhU0E5SUhSb2FYTXViR1Z1WjNSb0xGeHVYSFJjZEZ4MGNtVnpiMngyWlNBOUlHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RGeDBYSFJwWmlBb0lDRW9JQzB0WTI5MWJuUWdLU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmtaV1psY2k1eVpYTnZiSFpsVjJsMGFDZ2daV3hsYldWdWRITXNJRnNnWld4bGJXVnVkSE1nWFNBcE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBhV1lnS0NCMGVYQmxiMllnZEhsd1pTQWhQVDBnWENKemRISnBibWRjSWlBcElIdGNibHgwWEhSY2RHOWlhaUE5SUhSNWNHVTdYRzVjZEZ4MFhIUjBlWEJsSUQwZ2RXNWtaV1pwYm1Wa08xeHVYSFJjZEgxY2JseDBYSFIwZVhCbElEMGdkSGx3WlNCOGZDQmNJbVo0WENJN1hHNWNibHgwWEhSM2FHbHNaU0FvSUdrdExTQXBJSHRjYmx4MFhIUmNkSFJ0Y0NBOUlHUmhkR0ZmY0hKcGRpNW5aWFFvSUdWc1pXMWxiblJ6V3lCcElGMHNJSFI1Y0dVZ0t5QmNJbkYxWlhWbFNHOXZhM05jSWlBcE8xeHVYSFJjZEZ4MGFXWWdLQ0IwYlhBZ0ppWWdkRzF3TG1WdGNIUjVJQ2tnZTF4dVhIUmNkRngwWEhSamIzVnVkQ3NyTzF4dVhIUmNkRngwWEhSMGJYQXVaVzF3ZEhrdVlXUmtLQ0J5WlhOdmJIWmxJQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEhSY2RISmxjMjlzZG1Vb0tUdGNibHgwWEhSeVpYUjFjbTRnWkdWbVpYSXVjSEp2YldselpTZ2diMkpxSUNrN1hHNWNkSDFjYm4wcE8xeHVkbUZ5SUhCdWRXMGdQU0FvTDFzckxWMC9LRDg2WEZ4a0tseGNMbndwWEZ4a0t5Zy9PbHRsUlYxYkt5MWRQMXhjWkN0OEtTOHBMbk52ZFhKalpUdGNibHh1ZG1GeUlHTnpjMFY0Y0dGdVpDQTlJRnNnWENKVWIzQmNJaXdnWENKU2FXZG9kRndpTENCY0lrSnZkSFJ2YlZ3aUxDQmNJa3hsWm5SY0lpQmRPMXh1WEc1MllYSWdhWE5JYVdSa1pXNGdQU0JtZFc1amRHbHZiaWdnWld4bGJTd2daV3dnS1NCN1hHNWNkRngwTHk4Z2FYTklhV1JrWlc0Z2JXbG5hSFFnWW1VZ1kyRnNiR1ZrSUdaeWIyMGdhbEYxWlhKNUkyWnBiSFJsY2lCbWRXNWpkR2x2Ymp0Y2JseDBYSFF2THlCcGJpQjBhR0YwSUdOaGMyVXNJR1ZzWlcxbGJuUWdkMmxzYkNCaVpTQnpaV052Ym1RZ1lYSm5kVzFsYm5SY2JseDBYSFJsYkdWdElEMGdaV3dnZkh3Z1pXeGxiVHRjYmx4MFhIUnlaWFIxY200Z2FsRjFaWEo1TG1OemN5Z2daV3hsYlN3Z1hDSmthWE53YkdGNVhDSWdLU0E5UFQwZ1hDSnViMjVsWENJZ2ZId2dJV3BSZFdWeWVTNWpiMjUwWVdsdWN5Z2daV3hsYlM1dmQyNWxja1J2WTNWdFpXNTBMQ0JsYkdWdElDazdYRzVjZEgwN1hHNWNiblpoY2lCeVkyaGxZMnRoWW14bFZIbHdaU0E5SUNndlhpZy9PbU5vWldOclltOTRmSEpoWkdsdktTUXZhU2s3WEc1Y2JseHVYRzRvWm5WdVkzUnBiMjRvS1NCN1hHNWNkSFpoY2lCbWNtRm5iV1Z1ZENBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVSdlkzVnRaVzUwUm5KaFoyMWxiblFvS1N4Y2JseDBYSFJrYVhZZ1BTQm1jbUZuYldWdWRDNWhjSEJsYm1SRGFHbHNaQ2dnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ2dYQ0prYVhaY0lpQXBJQ2tzWEc1Y2RGeDBhVzV3ZFhRZ1BTQmtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0NCY0ltbHVjSFYwWENJZ0tUdGNibHh1WEhRdkx5QlRkWEJ3YjNKME9pQlRZV1poY21rOFBUVXVNVnh1WEhRdkx5QkRhR1ZqYXlCemRHRjBaU0JzYjNOMElHbG1JSFJvWlNCdVlXMWxJR2x6SUhObGRDQW9JekV4TWpFM0tWeHVYSFF2THlCVGRYQndiM0owT2lCWGFXNWtiM2R6SUZkbFlpQkJjSEJ6SUNoWFYwRXBYRzVjZEM4dklHQnVZVzFsWUNCaGJtUWdZSFI1Y0dWZ0lHMTFjM1FnZFhObElDNXpaWFJCZEhSeWFXSjFkR1VnWm05eUlGZFhRU0FvSXpFME9UQXhLVnh1WEhScGJuQjFkQzV6WlhSQmRIUnlhV0oxZEdVb0lGd2lkSGx3WlZ3aUxDQmNJbkpoWkdsdlhDSWdLVHRjYmx4MGFXNXdkWFF1YzJWMFFYUjBjbWxpZFhSbEtDQmNJbU5vWldOclpXUmNJaXdnWENKamFHVmphMlZrWENJZ0tUdGNibHgwYVc1d2RYUXVjMlYwUVhSMGNtbGlkWFJsS0NCY0ltNWhiV1ZjSWl3Z1hDSjBYQ0lnS1R0Y2JseHVYSFJrYVhZdVlYQndaVzVrUTJocGJHUW9JR2x1Y0hWMElDazdYRzVjYmx4MEx5OGdVM1Z3Y0c5eWREb2dVMkZtWVhKcFBEMDFMakVzSUVGdVpISnZhV1E4TkM0eVhHNWNkQzh2SUU5c1pHVnlJRmRsWWt0cGRDQmtiMlZ6YmlkMElHTnNiMjVsSUdOb1pXTnJaV1FnYzNSaGRHVWdZMjl5Y21WamRHeDVJR2x1SUdaeVlXZHRaVzUwYzF4dVhIUnpkWEJ3YjNKMExtTm9aV05yUTJ4dmJtVWdQU0JrYVhZdVkyeHZibVZPYjJSbEtDQjBjblZsSUNrdVkyeHZibVZPYjJSbEtDQjBjblZsSUNrdWJHRnpkRU5vYVd4a0xtTm9aV05yWldRN1hHNWNibHgwTHk4Z1UzVndjRzl5ZERvZ1NVVThQVEV4SzF4dVhIUXZMeUJOWVd0bElITjFjbVVnZEdWNGRHRnlaV0VnS0dGdVpDQmphR1ZqYTJKdmVDa2daR1ZtWVhWc2RGWmhiSFZsSUdseklIQnliM0JsY214NUlHTnNiMjVsWkZ4dVhIUmthWFl1YVc1dVpYSklWRTFNSUQwZ1hDSThkR1Y0ZEdGeVpXRStlRHd2ZEdWNGRHRnlaV0UrWENJN1hHNWNkSE4xY0hCdmNuUXVibTlEYkc5dVpVTm9aV05yWldRZ1BTQWhJV1JwZGk1amJHOXVaVTV2WkdVb0lIUnlkV1VnS1M1c1lYTjBRMmhwYkdRdVpHVm1ZWFZzZEZaaGJIVmxPMXh1ZlNrb0tUdGNiblpoY2lCemRISjFibVJsWm1sdVpXUWdQU0IwZVhCbGIyWWdkVzVrWldacGJtVmtPMXh1WEc1Y2JseHVjM1Z3Y0c5eWRDNW1iMk4xYzJsdVFuVmlZbXhsY3lBOUlGd2liMjVtYjJOMWMybHVYQ0lnYVc0Z2QybHVaRzkzTzF4dVhHNWNiblpoY2x4dVhIUnlhMlY1UlhabGJuUWdQU0F2WG10bGVTOHNYRzVjZEhKdGIzVnpaVVYyWlc1MElEMGdMMTRvUHpwdGIzVnpaWHh3YjJsdWRHVnlmR052Ym5SbGVIUnRaVzUxS1h4amJHbGpheThzWEc1Y2RISm1iMk4xYzAxdmNuQm9JRDBnTDE0b1B6cG1iMk4xYzJsdVptOWpkWE44Wm05amRYTnZkWFJpYkhWeUtTUXZMRnh1WEhSeWRIbHdaVzVoYldWemNHRmpaU0E5SUM5ZUtGdGVMbDBxS1NnL09seGNMaWd1S3lsOEtTUXZPMXh1WEc1bWRXNWpkR2x2YmlCeVpYUjFjbTVVY25WbEtDa2dlMXh1WEhSeVpYUjFjbTRnZEhKMVpUdGNibjFjYmx4dVpuVnVZM1JwYjI0Z2NtVjBkWEp1Um1Gc2MyVW9LU0I3WEc1Y2RISmxkSFZ5YmlCbVlXeHpaVHRjYm4xY2JseHVablZ1WTNScGIyNGdjMkZtWlVGamRHbDJaVVZzWlcxbGJuUW9LU0I3WEc1Y2RIUnllU0I3WEc1Y2RGeDBjbVYwZFhKdUlHUnZZM1Z0Wlc1MExtRmpkR2wyWlVWc1pXMWxiblE3WEc1Y2RIMGdZMkYwWTJnZ0tDQmxjbklnS1NCN0lIMWNibjFjYmx4dUx5cGNiaUFxSUVobGJIQmxjaUJtZFc1amRHbHZibk1nWm05eUlHMWhibUZuYVc1bklHVjJaVzUwY3lBdExTQnViM1FnY0dGeWRDQnZaaUIwYUdVZ2NIVmliR2xqSUdsdWRHVnlabUZqWlM1Y2JpQXFJRkJ5YjNCeklIUnZJRVJsWVc0Z1JXUjNZWEprY3ljZ1lXUmtSWFpsYm5RZ2JHbGljbUZ5ZVNCbWIzSWdiV0Z1ZVNCdlppQjBhR1VnYVdSbFlYTXVYRzRnS2k5Y2JtcFJkV1Z5ZVM1bGRtVnVkQ0E5SUh0Y2JseHVYSFJuYkc5aVlXdzZJSHQ5TEZ4dVhHNWNkR0ZrWkRvZ1puVnVZM1JwYjI0b0lHVnNaVzBzSUhSNWNHVnpMQ0JvWVc1a2JHVnlMQ0JrWVhSaExDQnpaV3hsWTNSdmNpQXBJSHRjYmx4dVhIUmNkSFpoY2lCb1lXNWtiR1ZQWW1wSmJpd2daWFpsYm5SSVlXNWtiR1VzSUhSdGNDeGNibHgwWEhSY2RHVjJaVzUwY3l3Z2RDd2dhR0Z1Wkd4bFQySnFMRnh1WEhSY2RGeDBjM0JsWTJsaGJDd2dhR0Z1Wkd4bGNuTXNJSFI1Y0dVc0lHNWhiV1Z6Y0dGalpYTXNJRzl5YVdkVWVYQmxMRnh1WEhSY2RGeDBaV3hsYlVSaGRHRWdQU0JrWVhSaFgzQnlhWFl1WjJWMEtDQmxiR1Z0SUNrN1hHNWNibHgwWEhRdkx5QkViMjRuZENCaGRIUmhZMmdnWlhabGJuUnpJSFJ2SUc1dlJHRjBZU0J2Y2lCMFpYaDBMMk52YlcxbGJuUWdibTlrWlhNZ0tHSjFkQ0JoYkd4dmR5QndiR0ZwYmlCdlltcGxZM1J6S1Z4dVhIUmNkR2xtSUNnZ0lXVnNaVzFFWVhSaElDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklFTmhiR3hsY2lCallXNGdjR0Z6Y3lCcGJpQmhiaUJ2WW1wbFkzUWdiMllnWTNWemRHOXRJR1JoZEdFZ2FXNGdiR2xsZFNCdlppQjBhR1VnYUdGdVpHeGxjbHh1WEhSY2RHbG1JQ2dnYUdGdVpHeGxjaTVvWVc1a2JHVnlJQ2tnZTF4dVhIUmNkRngwYUdGdVpHeGxUMkpxU1c0Z1BTQm9ZVzVrYkdWeU8xeHVYSFJjZEZ4MGFHRnVaR3hsY2lBOUlHaGhibVJzWlU5aWFrbHVMbWhoYm1Sc1pYSTdYRzVjZEZ4MFhIUnpaV3hsWTNSdmNpQTlJR2hoYm1Sc1pVOWlha2x1TG5ObGJHVmpkRzl5TzF4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUUxaGEyVWdjM1Z5WlNCMGFHRjBJSFJvWlNCb1lXNWtiR1Z5SUdoaGN5QmhJSFZ1YVhGMVpTQkpSQ3dnZFhObFpDQjBieUJtYVc1a0wzSmxiVzkyWlNCcGRDQnNZWFJsY2x4dVhIUmNkR2xtSUNnZ0lXaGhibVJzWlhJdVozVnBaQ0FwSUh0Y2JseDBYSFJjZEdoaGJtUnNaWEl1WjNWcFpDQTlJR3BSZFdWeWVTNW5kV2xrS3lzN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1NXNXBkQ0IwYUdVZ1pXeGxiV1Z1ZENkeklHVjJaVzUwSUhOMGNuVmpkSFZ5WlNCaGJtUWdiV0ZwYmlCb1lXNWtiR1Z5TENCcFppQjBhR2x6SUdseklIUm9aU0JtYVhKemRGeHVYSFJjZEdsbUlDZ2dJU2hsZG1WdWRITWdQU0JsYkdWdFJHRjBZUzVsZG1WdWRITXBJQ2tnZTF4dVhIUmNkRngwWlhabGJuUnpJRDBnWld4bGJVUmhkR0V1WlhabGJuUnpJRDBnZTMwN1hHNWNkRngwZlZ4dVhIUmNkR2xtSUNnZ0lTaGxkbVZ1ZEVoaGJtUnNaU0E5SUdWc1pXMUVZWFJoTG1oaGJtUnNaU2tnS1NCN1hHNWNkRngwWEhSbGRtVnVkRWhoYm1Sc1pTQTlJR1ZzWlcxRVlYUmhMbWhoYm1Sc1pTQTlJR1oxYm1OMGFXOXVLQ0JsSUNrZ2UxeHVYSFJjZEZ4MFhIUXZMeUJFYVhOallYSmtJSFJvWlNCelpXTnZibVFnWlhabGJuUWdiMllnWVNCcVVYVmxjbmt1WlhabGJuUXVkSEpwWjJkbGNpZ3BJR0Z1WkZ4dVhIUmNkRngwWEhRdkx5QjNhR1Z1SUdGdUlHVjJaVzUwSUdseklHTmhiR3hsWkNCaFpuUmxjaUJoSUhCaFoyVWdhR0Z6SUhWdWJHOWhaR1ZrWEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwZVhCbGIyWWdhbEYxWlhKNUlDRTlQU0J6ZEhKMWJtUmxabWx1WldRZ0ppWWdhbEYxWlhKNUxtVjJaVzUwTG5SeWFXZG5aWEpsWkNBaFBUMGdaUzUwZVhCbElEOWNibHgwWEhSY2RGeDBYSFJxVVhWbGNua3VaWFpsYm5RdVpHbHpjR0YwWTJndVlYQndiSGtvSUdWc1pXMHNJR0Z5WjNWdFpXNTBjeUFwSURvZ2RXNWtaV1pwYm1Wa08xeHVYSFJjZEZ4MGZUdGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QklZVzVrYkdVZ2JYVnNkR2x3YkdVZ1pYWmxiblJ6SUhObGNHRnlZWFJsWkNCaWVTQmhJSE53WVdObFhHNWNkRngwZEhsd1pYTWdQU0FvSUhSNWNHVnpJSHg4SUZ3aVhDSWdLUzV0WVhSamFDZ2djbTV2ZEhkb2FYUmxJQ2tnZkh3Z1d5QmNJbHdpSUYwN1hHNWNkRngwZENBOUlIUjVjR1Z6TG14bGJtZDBhRHRjYmx4MFhIUjNhR2xzWlNBb0lIUXRMU0FwSUh0Y2JseDBYSFJjZEhSdGNDQTlJSEowZVhCbGJtRnRaWE53WVdObExtVjRaV01vSUhSNWNHVnpXM1JkSUNrZ2ZId2dXMTA3WEc1Y2RGeDBYSFIwZVhCbElEMGdiM0pwWjFSNWNHVWdQU0IwYlhCYk1WMDdYRzVjZEZ4MFhIUnVZVzFsYzNCaFkyVnpJRDBnS0NCMGJYQmJNbDBnZkh3Z1hDSmNJaUFwTG5Od2JHbDBLQ0JjSWk1Y0lpQXBMbk52Y25Rb0tUdGNibHh1WEhSY2RGeDBMeThnVkdobGNtVWdLbTExYzNRcUlHSmxJR0VnZEhsd1pTd2dibThnWVhSMFlXTm9hVzVuSUc1aGJXVnpjR0ZqWlMxdmJteDVJR2hoYm1Sc1pYSnpYRzVjZEZ4MFhIUnBaaUFvSUNGMGVYQmxJQ2tnZTF4dVhIUmNkRngwWEhSamIyNTBhVzUxWlR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdTV1lnWlhabGJuUWdZMmhoYm1kbGN5QnBkSE1nZEhsd1pTd2dkWE5sSUhSb1pTQnpjR1ZqYVdGc0lHVjJaVzUwSUdoaGJtUnNaWEp6SUdadmNpQjBhR1VnWTJoaGJtZGxaQ0IwZVhCbFhHNWNkRngwWEhSemNHVmphV0ZzSUQwZ2FsRjFaWEo1TG1WMlpXNTBMbk53WldOcFlXeGJJSFI1Y0dVZ1hTQjhmQ0I3ZlR0Y2JseHVYSFJjZEZ4MEx5OGdTV1lnYzJWc1pXTjBiM0lnWkdWbWFXNWxaQ3dnWkdWMFpYSnRhVzVsSUhOd1pXTnBZV3dnWlhabGJuUWdZWEJwSUhSNWNHVXNJRzkwYUdWeWQybHpaU0JuYVhabGJpQjBlWEJsWEc1Y2RGeDBYSFIwZVhCbElEMGdLQ0J6Wld4bFkzUnZjaUEvSUhOd1pXTnBZV3d1WkdWc1pXZGhkR1ZVZVhCbElEb2djM0JsWTJsaGJDNWlhVzVrVkhsd1pTQXBJSHg4SUhSNWNHVTdYRzVjYmx4MFhIUmNkQzh2SUZWd1pHRjBaU0J6Y0dWamFXRnNJR0poYzJWa0lHOXVJRzVsZDJ4NUlISmxjMlYwSUhSNWNHVmNibHgwWEhSY2RITndaV05wWVd3Z1BTQnFVWFZsY25rdVpYWmxiblF1YzNCbFkybGhiRnNnZEhsd1pTQmRJSHg4SUh0OU8xeHVYRzVjZEZ4MFhIUXZMeUJvWVc1a2JHVlBZbW9nYVhNZ2NHRnpjMlZrSUhSdklHRnNiQ0JsZG1WdWRDQm9ZVzVrYkdWeWMxeHVYSFJjZEZ4MGFHRnVaR3hsVDJKcUlEMGdhbEYxWlhKNUxtVjRkR1Z1WkNoN1hHNWNkRngwWEhSY2RIUjVjR1U2SUhSNWNHVXNYRzVjZEZ4MFhIUmNkRzl5YVdkVWVYQmxPaUJ2Y21sblZIbHdaU3hjYmx4MFhIUmNkRngwWkdGMFlUb2daR0YwWVN4Y2JseDBYSFJjZEZ4MGFHRnVaR3hsY2pvZ2FHRnVaR3hsY2l4Y2JseDBYSFJjZEZ4MFozVnBaRG9nYUdGdVpHeGxjaTVuZFdsa0xGeHVYSFJjZEZ4MFhIUnpaV3hsWTNSdmNqb2djMlZzWldOMGIzSXNYRzVjZEZ4MFhIUmNkRzVsWldSelEyOXVkR1Y0ZERvZ2MyVnNaV04wYjNJZ0ppWWdhbEYxWlhKNUxtVjRjSEl1YldGMFkyZ3VibVZsWkhORGIyNTBaWGgwTG5SbGMzUW9JSE5sYkdWamRHOXlJQ2tzWEc1Y2RGeDBYSFJjZEc1aGJXVnpjR0ZqWlRvZ2JtRnRaWE53WVdObGN5NXFiMmx1S0Z3aUxsd2lLVnh1WEhSY2RGeDBmU3dnYUdGdVpHeGxUMkpxU1c0Z0tUdGNibHh1WEhSY2RGeDBMeThnU1c1cGRDQjBhR1VnWlhabGJuUWdhR0Z1Wkd4bGNpQnhkV1YxWlNCcFppQjNaU2R5WlNCMGFHVWdabWx5YzNSY2JseDBYSFJjZEdsbUlDZ2dJU2hvWVc1a2JHVnljeUE5SUdWMlpXNTBjMXNnZEhsd1pTQmRLU0FwSUh0Y2JseDBYSFJjZEZ4MGFHRnVaR3hsY25NZ1BTQmxkbVZ1ZEhOYklIUjVjR1VnWFNBOUlGdGRPMXh1WEhSY2RGeDBYSFJvWVc1a2JHVnljeTVrWld4bFoyRjBaVU52ZFc1MElEMGdNRHRjYmx4dVhIUmNkRngwWEhRdkx5QlBibXg1SUhWelpTQmhaR1JGZG1WdWRFeHBjM1JsYm1WeUlHbG1JSFJvWlNCemNHVmphV0ZzSUdWMlpXNTBjeUJvWVc1a2JHVnlJSEpsZEhWeWJuTWdabUZzYzJWY2JseDBYSFJjZEZ4MGFXWWdLQ0FoYzNCbFkybGhiQzV6WlhSMWNDQjhmQ0J6Y0dWamFXRnNMbk5sZEhWd0xtTmhiR3dvSUdWc1pXMHNJR1JoZEdFc0lHNWhiV1Z6Y0dGalpYTXNJR1YyWlc1MFNHRnVaR3hsSUNrZ1BUMDlJR1poYkhObElDa2dlMXh1WEhSY2RGeDBYSFJjZEdsbUlDZ2daV3hsYlM1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5SUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWld4bGJTNWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDQjBlWEJsTENCbGRtVnVkRWhoYm1Sc1pTd2dabUZzYzJVZ0tUdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGFXWWdLQ0J6Y0dWamFXRnNMbUZrWkNBcElIdGNibHgwWEhSY2RGeDBjM0JsWTJsaGJDNWhaR1F1WTJGc2JDZ2daV3hsYlN3Z2FHRnVaR3hsVDJKcUlDazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tDQWhhR0Z1Wkd4bFQySnFMbWhoYm1Sc1pYSXVaM1ZwWkNBcElIdGNibHgwWEhSY2RGeDBYSFJvWVc1a2JHVlBZbW91YUdGdVpHeGxjaTVuZFdsa0lEMGdhR0Z1Wkd4bGNpNW5kV2xrTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRUZrWkNCMGJ5QjBhR1VnWld4bGJXVnVkQ2R6SUdoaGJtUnNaWElnYkdsemRDd2daR1ZzWldkaGRHVnpJR2x1SUdaeWIyNTBYRzVjZEZ4MFhIUnBaaUFvSUhObGJHVmpkRzl5SUNrZ2UxeHVYSFJjZEZ4MFhIUm9ZVzVrYkdWeWN5NXpjR3hwWTJVb0lHaGhibVJzWlhKekxtUmxiR1ZuWVhSbFEyOTFiblFyS3l3Z01Dd2dhR0Z1Wkd4bFQySnFJQ2s3WEc1Y2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJvWVc1a2JHVnljeTV3ZFhOb0tDQm9ZVzVrYkdWUFltb2dLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwTHk4Z1MyVmxjQ0IwY21GamF5QnZaaUIzYUdsamFDQmxkbVZ1ZEhNZ2FHRjJaU0JsZG1WeUlHSmxaVzRnZFhObFpDd2dabTl5SUdWMlpXNTBJRzl3ZEdsdGFYcGhkR2x2Ymx4dVhIUmNkRngwYWxGMVpYSjVMbVYyWlc1MExtZHNiMkpoYkZzZ2RIbHdaU0JkSUQwZ2RISjFaVHRjYmx4MFhIUjlYRzVjYmx4MGZTeGNibHh1WEhRdkx5QkVaWFJoWTJnZ1lXNGdaWFpsYm5RZ2IzSWdjMlYwSUc5bUlHVjJaVzUwY3lCbWNtOXRJR0Z1SUdWc1pXMWxiblJjYmx4MGNtVnRiM1psT2lCbWRXNWpkR2x2YmlnZ1pXeGxiU3dnZEhsd1pYTXNJR2hoYm1Sc1pYSXNJSE5sYkdWamRHOXlMQ0J0WVhCd1pXUlVlWEJsY3lBcElIdGNibHh1WEhSY2RIWmhjaUJxTENCdmNtbG5RMjkxYm5Rc0lIUnRjQ3hjYmx4MFhIUmNkR1YyWlc1MGN5d2dkQ3dnYUdGdVpHeGxUMkpxTEZ4dVhIUmNkRngwYzNCbFkybGhiQ3dnYUdGdVpHeGxjbk1zSUhSNWNHVXNJRzVoYldWemNHRmpaWE1zSUc5eWFXZFVlWEJsTEZ4dVhIUmNkRngwWld4bGJVUmhkR0VnUFNCa1lYUmhYM0J5YVhZdWFHRnpSR0YwWVNnZ1pXeGxiU0FwSUNZbUlHUmhkR0ZmY0hKcGRpNW5aWFFvSUdWc1pXMGdLVHRjYmx4dVhIUmNkR2xtSUNnZ0lXVnNaVzFFWVhSaElIeDhJQ0VvWlhabGJuUnpJRDBnWld4bGJVUmhkR0V1WlhabGJuUnpLU0FwSUh0Y2JseDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJQYm1ObElHWnZjaUJsWVdOb0lIUjVjR1V1Ym1GdFpYTndZV05sSUdsdUlIUjVjR1Z6T3lCMGVYQmxJRzFoZVNCaVpTQnZiV2wwZEdWa1hHNWNkRngwZEhsd1pYTWdQU0FvSUhSNWNHVnpJSHg4SUZ3aVhDSWdLUzV0WVhSamFDZ2djbTV2ZEhkb2FYUmxJQ2tnZkh3Z1d5QmNJbHdpSUYwN1hHNWNkRngwZENBOUlIUjVjR1Z6TG14bGJtZDBhRHRjYmx4MFhIUjNhR2xzWlNBb0lIUXRMU0FwSUh0Y2JseDBYSFJjZEhSdGNDQTlJSEowZVhCbGJtRnRaWE53WVdObExtVjRaV01vSUhSNWNHVnpXM1JkSUNrZ2ZId2dXMTA3WEc1Y2RGeDBYSFIwZVhCbElEMGdiM0pwWjFSNWNHVWdQU0IwYlhCYk1WMDdYRzVjZEZ4MFhIUnVZVzFsYzNCaFkyVnpJRDBnS0NCMGJYQmJNbDBnZkh3Z1hDSmNJaUFwTG5Od2JHbDBLQ0JjSWk1Y0lpQXBMbk52Y25Rb0tUdGNibHh1WEhSY2RGeDBMeThnVlc1aWFXNWtJR0ZzYkNCbGRtVnVkSE1nS0c5dUlIUm9hWE1nYm1GdFpYTndZV05sTENCcFppQndjbTkyYVdSbFpDa2dabTl5SUhSb1pTQmxiR1Z0Wlc1MFhHNWNkRngwWEhScFppQW9JQ0YwZVhCbElDa2dlMXh1WEhSY2RGeDBYSFJtYjNJZ0tDQjBlWEJsSUdsdUlHVjJaVzUwY3lBcElIdGNibHgwWEhSY2RGeDBYSFJxVVhWbGNua3VaWFpsYm5RdWNtVnRiM1psS0NCbGJHVnRMQ0IwZVhCbElDc2dkSGx3WlhOYklIUWdYU3dnYUdGdVpHeGxjaXdnYzJWc1pXTjBiM0lzSUhSeWRXVWdLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSamIyNTBhVzUxWlR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGMzQmxZMmxoYkNBOUlHcFJkV1Z5ZVM1bGRtVnVkQzV6Y0dWamFXRnNXeUIwZVhCbElGMGdmSHdnZTMwN1hHNWNkRngwWEhSMGVYQmxJRDBnS0NCelpXeGxZM1J2Y2lBL0lITndaV05wWVd3dVpHVnNaV2RoZEdWVWVYQmxJRG9nYzNCbFkybGhiQzVpYVc1a1ZIbHdaU0FwSUh4OElIUjVjR1U3WEc1Y2RGeDBYSFJvWVc1a2JHVnljeUE5SUdWMlpXNTBjMXNnZEhsd1pTQmRJSHg4SUZ0ZE8xeHVYSFJjZEZ4MGRHMXdJRDBnZEcxd1d6SmRJQ1ltSUc1bGR5QlNaV2RGZUhBb0lGd2lLRjU4WEZ4Y1hDNHBYQ0lnS3lCdVlXMWxjM0JoWTJWekxtcHZhVzRvWENKY1hGeGNMaWcvT2k0cVhGeGNYQzU4S1Z3aUtTQXJJRndpS0Z4Y1hGd3VmQ1FwWENJZ0tUdGNibHh1WEhSY2RGeDBMeThnVW1WdGIzWmxJRzFoZEdOb2FXNW5JR1YyWlc1MGMxeHVYSFJjZEZ4MGIzSnBaME52ZFc1MElEMGdhaUE5SUdoaGJtUnNaWEp6TG14bGJtZDBhRHRjYmx4MFhIUmNkSGRvYVd4bElDZ2dhaTB0SUNrZ2UxeHVYSFJjZEZ4MFhIUm9ZVzVrYkdWUFltb2dQU0JvWVc1a2JHVnljMXNnYWlCZE8xeHVYRzVjZEZ4MFhIUmNkR2xtSUNnZ0tDQnRZWEJ3WldSVWVYQmxjeUI4ZkNCdmNtbG5WSGx3WlNBOVBUMGdhR0Z1Wkd4bFQySnFMbTl5YVdkVWVYQmxJQ2tnSmlaY2JseDBYSFJjZEZ4MFhIUW9JQ0ZvWVc1a2JHVnlJSHg4SUdoaGJtUnNaWEl1WjNWcFpDQTlQVDBnYUdGdVpHeGxUMkpxTG1kMWFXUWdLU0FtSmx4dVhIUmNkRngwWEhSY2RDZ2dJWFJ0Y0NCOGZDQjBiWEF1ZEdWemRDZ2dhR0Z1Wkd4bFQySnFMbTVoYldWemNHRmpaU0FwSUNrZ0ppWmNibHgwWEhSY2RGeDBYSFFvSUNGelpXeGxZM1J2Y2lCOGZDQnpaV3hsWTNSdmNpQTlQVDBnYUdGdVpHeGxUMkpxTG5ObGJHVmpkRzl5SUh4OElITmxiR1ZqZEc5eUlEMDlQU0JjSWlvcVhDSWdKaVlnYUdGdVpHeGxUMkpxTG5ObGJHVmpkRzl5SUNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwYUdGdVpHeGxjbk11YzNCc2FXTmxLQ0JxTENBeElDazdYRzVjYmx4MFhIUmNkRngwWEhScFppQW9JR2hoYm1Sc1pVOWlhaTV6Wld4bFkzUnZjaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR2hoYm1Sc1pYSnpMbVJsYkdWbllYUmxRMjkxYm5RdExUdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0J6Y0dWamFXRnNMbkpsYlc5MlpTQXBJSHRjYmx4MFhIUmNkRngwWEhSY2RITndaV05wWVd3dWNtVnRiM1psTG1OaGJHd29JR1ZzWlcwc0lHaGhibVJzWlU5aWFpQXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJTWlcxdmRtVWdaMlZ1WlhKcFl5QmxkbVZ1ZENCb1lXNWtiR1Z5SUdsbUlIZGxJSEpsYlc5MlpXUWdjMjl0WlhSb2FXNW5JR0Z1WkNCdWJ5QnRiM0psSUdoaGJtUnNaWEp6SUdWNGFYTjBYRzVjZEZ4MFhIUXZMeUFvWVhadmFXUnpJSEJ2ZEdWdWRHbGhiQ0JtYjNJZ1pXNWtiR1Z6Y3lCeVpXTjFjbk5wYjI0Z1pIVnlhVzVuSUhKbGJXOTJZV3dnYjJZZ2MzQmxZMmxoYkNCbGRtVnVkQ0JvWVc1a2JHVnljeWxjYmx4MFhIUmNkR2xtSUNnZ2IzSnBaME52ZFc1MElDWW1JQ0ZvWVc1a2JHVnljeTVzWlc1bmRHZ2dLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDZ2dJWE53WldOcFlXd3VkR1ZoY21SdmQyNGdmSHdnYzNCbFkybGhiQzUwWldGeVpHOTNiaTVqWVd4c0tDQmxiR1Z0TENCdVlXMWxjM0JoWTJWekxDQmxiR1Z0UkdGMFlTNW9ZVzVrYkdVZ0tTQTlQVDBnWm1Gc2MyVWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MGFsRjFaWEo1TG5KbGJXOTJaVVYyWlc1MEtDQmxiR1Z0TENCMGVYQmxMQ0JsYkdWdFJHRjBZUzVvWVc1a2JHVWdLVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RHUmxiR1YwWlNCbGRtVnVkSE5iSUhSNWNHVWdYVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJTWlcxdmRtVWdkR2hsSUdWNGNHRnVaRzhnYVdZZ2FYUW5jeUJ1YnlCc2IyNW5aWElnZFhObFpGeHVYSFJjZEdsbUlDZ2dhbEYxWlhKNUxtbHpSVzF3ZEhsUFltcGxZM1FvSUdWMlpXNTBjeUFwSUNrZ2UxeHVYSFJjZEZ4MFpHVnNaWFJsSUdWc1pXMUVZWFJoTG1oaGJtUnNaVHRjYmx4MFhIUmNkR1JoZEdGZmNISnBkaTV5WlcxdmRtVW9JR1ZzWlcwc0lGd2laWFpsYm5SelhDSWdLVHRjYmx4MFhIUjlYRzVjZEgwc1hHNWNibHgwZEhKcFoyZGxjam9nWm5WdVkzUnBiMjRvSUdWMlpXNTBMQ0JrWVhSaExDQmxiR1Z0TENCdmJteDVTR0Z1Wkd4bGNuTWdLU0I3WEc1Y2JseDBYSFIyWVhJZ2FTd2dZM1Z5TENCMGJYQXNJR0oxWW1Kc1pWUjVjR1VzSUc5dWRIbHdaU3dnYUdGdVpHeGxMQ0J6Y0dWamFXRnNMRnh1WEhSY2RGeDBaWFpsYm5SUVlYUm9JRDBnV3lCbGJHVnRJSHg4SUdSdlkzVnRaVzUwSUYwc1hHNWNkRngwWEhSMGVYQmxJRDBnYUdGelQzZHVMbU5oYkd3b0lHVjJaVzUwTENCY0luUjVjR1ZjSWlBcElEOGdaWFpsYm5RdWRIbHdaU0E2SUdWMlpXNTBMRnh1WEhSY2RGeDBibUZ0WlhOd1lXTmxjeUE5SUdoaGMwOTNiaTVqWVd4c0tDQmxkbVZ1ZEN3Z1hDSnVZVzFsYzNCaFkyVmNJaUFwSUQ4Z1pYWmxiblF1Ym1GdFpYTndZV05sTG5Od2JHbDBLRndpTGx3aUtTQTZJRnRkTzF4dVhHNWNkRngwWTNWeUlEMGdkRzF3SUQwZ1pXeGxiU0E5SUdWc1pXMGdmSHdnWkc5amRXMWxiblE3WEc1Y2JseDBYSFF2THlCRWIyNG5kQ0JrYnlCbGRtVnVkSE1nYjI0Z2RHVjRkQ0JoYm1RZ1kyOXRiV1Z1ZENCdWIyUmxjMXh1WEhSY2RHbG1JQ2dnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTXlCOGZDQmxiR1Z0TG01dlpHVlVlWEJsSUQwOVBTQTRJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RDOHZJR1p2WTNWekwySnNkWElnYlc5eWNHaHpJSFJ2SUdadlkzVnphVzR2YjNWME95Qmxibk4xY21VZ2QyVW5jbVVnYm05MElHWnBjbWx1WnlCMGFHVnRJSEpwWjJoMElHNXZkMXh1WEhSY2RHbG1JQ2dnY21adlkzVnpUVzl5Y0dndWRHVnpkQ2dnZEhsd1pTQXJJR3BSZFdWeWVTNWxkbVZ1ZEM1MGNtbG5aMlZ5WldRZ0tTQXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSOVhHNWNibHgwWEhScFppQW9JSFI1Y0dVdWFXNWtaWGhQWmloY0lpNWNJaWtnUGowZ01DQXBJSHRjYmx4MFhIUmNkQzh2SUU1aGJXVnpjR0ZqWldRZ2RISnBaMmRsY2pzZ1kzSmxZWFJsSUdFZ2NtVm5aWGh3SUhSdklHMWhkR05vSUdWMlpXNTBJSFI1Y0dVZ2FXNGdhR0Z1Wkd4bEtDbGNibHgwWEhSY2RHNWhiV1Z6Y0dGalpYTWdQU0IwZVhCbExuTndiR2wwS0Z3aUxsd2lLVHRjYmx4MFhIUmNkSFI1Y0dVZ1BTQnVZVzFsYzNCaFkyVnpMbk5vYVdaMEtDazdYRzVjZEZ4MFhIUnVZVzFsYzNCaFkyVnpMbk52Y25Rb0tUdGNibHgwWEhSOVhHNWNkRngwYjI1MGVYQmxJRDBnZEhsd1pTNXBibVJsZUU5bUtGd2lPbHdpS1NBOElEQWdKaVlnWENKdmJsd2lJQ3NnZEhsd1pUdGNibHh1WEhSY2RDOHZJRU5oYkd4bGNpQmpZVzRnY0dGemN5QnBiaUJoSUdwUmRXVnllUzVGZG1WdWRDQnZZbXBsWTNRc0lFOWlhbVZqZEN3Z2IzSWdhblZ6ZENCaGJpQmxkbVZ1ZENCMGVYQmxJSE4wY21sdVoxeHVYSFJjZEdWMlpXNTBJRDBnWlhabGJuUmJJR3BSZFdWeWVTNWxlSEJoYm1SdklGMGdQMXh1WEhSY2RGeDBaWFpsYm5RZ09seHVYSFJjZEZ4MGJtVjNJR3BSZFdWeWVTNUZkbVZ1ZENnZ2RIbHdaU3dnZEhsd1pXOW1JR1YyWlc1MElEMDlQU0JjSW05aWFtVmpkRndpSUNZbUlHVjJaVzUwSUNrN1hHNWNibHgwWEhRdkx5QlVjbWxuWjJWeUlHSnBkRzFoYzJzNklDWWdNU0JtYjNJZ2JtRjBhWFpsSUdoaGJtUnNaWEp6T3lBbUlESWdabTl5SUdwUmRXVnllU0FvWVd4M1lYbHpJSFJ5ZFdVcFhHNWNkRngwWlhabGJuUXVhWE5VY21sbloyVnlJRDBnYjI1c2VVaGhibVJzWlhKeklEOGdNaUE2SURNN1hHNWNkRngwWlhabGJuUXVibUZ0WlhOd1lXTmxJRDBnYm1GdFpYTndZV05sY3k1cWIybHVLRndpTGx3aUtUdGNibHgwWEhSbGRtVnVkQzV1WVcxbGMzQmhZMlZmY21VZ1BTQmxkbVZ1ZEM1dVlXMWxjM0JoWTJVZ1AxeHVYSFJjZEZ4MGJtVjNJRkpsWjBWNGNDZ2dYQ0lvWG54Y1hGeGNMaWxjSWlBcklHNWhiV1Z6Y0dGalpYTXVhbTlwYmloY0lseGNYRnd1S0Q4NkxpcGNYRnhjTG53cFhDSXBJQ3NnWENJb1hGeGNYQzU4SkNsY0lpQXBJRHBjYmx4MFhIUmNkRzUxYkd3N1hHNWNibHgwWEhRdkx5QkRiR1ZoYmlCMWNDQjBhR1VnWlhabGJuUWdhVzRnWTJGelpTQnBkQ0JwY3lCaVpXbHVaeUJ5WlhWelpXUmNibHgwWEhSbGRtVnVkQzV5WlhOMWJIUWdQU0IxYm1SbFptbHVaV1E3WEc1Y2RGeDBhV1lnS0NBaFpYWmxiblF1ZEdGeVoyVjBJQ2tnZTF4dVhIUmNkRngwWlhabGJuUXVkR0Z5WjJWMElEMGdaV3hsYlR0Y2JseDBYSFI5WEc1Y2JseDBYSFF2THlCRGJHOXVaU0JoYm5rZ2FXNWpiMjFwYm1jZ1pHRjBZU0JoYm1RZ2NISmxjR1Z1WkNCMGFHVWdaWFpsYm5Rc0lHTnlaV0YwYVc1bklIUm9aU0JvWVc1a2JHVnlJR0Z5WnlCc2FYTjBYRzVjZEZ4MFpHRjBZU0E5SUdSaGRHRWdQVDBnYm5Wc2JDQS9YRzVjZEZ4MFhIUmJJR1YyWlc1MElGMGdPbHh1WEhSY2RGeDBhbEYxWlhKNUxtMWhhMlZCY25KaGVTZ2daR0YwWVN3Z1d5QmxkbVZ1ZENCZElDazdYRzVjYmx4MFhIUXZMeUJCYkd4dmR5QnpjR1ZqYVdGc0lHVjJaVzUwY3lCMGJ5QmtjbUYzSUc5MWRITnBaR1VnZEdobElHeHBibVZ6WEc1Y2RGeDBjM0JsWTJsaGJDQTlJR3BSZFdWeWVTNWxkbVZ1ZEM1emNHVmphV0ZzV3lCMGVYQmxJRjBnZkh3Z2UzMDdYRzVjZEZ4MGFXWWdLQ0FoYjI1c2VVaGhibVJzWlhKeklDWW1JSE53WldOcFlXd3VkSEpwWjJkbGNpQW1KaUJ6Y0dWamFXRnNMblJ5YVdkblpYSXVZWEJ3Ykhrb0lHVnNaVzBzSUdSaGRHRWdLU0E5UFQwZ1ptRnNjMlVnS1NCN1hHNWNkRngwWEhSeVpYUjFjbTQ3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeThnUkdWMFpYSnRhVzVsSUdWMlpXNTBJSEJ5YjNCaFoyRjBhVzl1SUhCaGRHZ2dhVzRnWVdSMllXNWpaU3dnY0dWeUlGY3pReUJsZG1WdWRITWdjM0JsWXlBb0l6azVOVEVwWEc1Y2RGeDBMeThnUW5WaVlteGxJSFZ3SUhSdklHUnZZM1Z0Wlc1MExDQjBhR1Z1SUhSdklIZHBibVJ2ZHpzZ2QyRjBZMmdnWm05eUlHRWdaMnh2WW1Gc0lHOTNibVZ5Ukc5amRXMWxiblFnZG1GeUlDZ2pPVGN5TkNsY2JseDBYSFJwWmlBb0lDRnZibXg1U0dGdVpHeGxjbk1nSmlZZ0lYTndaV05wWVd3dWJtOUNkV0ppYkdVZ0ppWWdJV3BSZFdWeWVTNXBjMWRwYm1SdmR5Z2daV3hsYlNBcElDa2dlMXh1WEc1Y2RGeDBYSFJpZFdKaWJHVlVlWEJsSUQwZ2MzQmxZMmxoYkM1a1pXeGxaMkYwWlZSNWNHVWdmSHdnZEhsd1pUdGNibHgwWEhSY2RHbG1JQ2dnSVhKbWIyTjFjMDF2Y25Cb0xuUmxjM1FvSUdKMVltSnNaVlI1Y0dVZ0t5QjBlWEJsSUNrZ0tTQjdYRzVjZEZ4MFhIUmNkR04xY2lBOUlHTjFjaTV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwWm05eUlDZ2dPeUJqZFhJN0lHTjFjaUE5SUdOMWNpNXdZWEpsYm5ST2IyUmxJQ2tnZTF4dVhIUmNkRngwWEhSbGRtVnVkRkJoZEdndWNIVnphQ2dnWTNWeUlDazdYRzVjZEZ4MFhIUmNkSFJ0Y0NBOUlHTjFjanRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwTHk4Z1QyNXNlU0JoWkdRZ2QybHVaRzkzSUdsbUlIZGxJR2R2ZENCMGJ5QmtiMk4xYldWdWRDQW9aUzVuTGl3Z2JtOTBJSEJzWVdsdUlHOWlhaUJ2Y2lCa1pYUmhZMmhsWkNCRVQwMHBYRzVjZEZ4MFhIUnBaaUFvSUhSdGNDQTlQVDBnS0dWc1pXMHViM2R1WlhKRWIyTjFiV1Z1ZENCOGZDQmtiMk4xYldWdWRDa2dLU0I3WEc1Y2RGeDBYSFJjZEdWMlpXNTBVR0YwYUM1d2RYTm9LQ0IwYlhBdVpHVm1ZWFZzZEZacFpYY2dmSHdnZEcxd0xuQmhjbVZ1ZEZkcGJtUnZkeUI4ZkNCM2FXNWtiM2NnS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2JseDBYSFF2THlCR2FYSmxJR2hoYm1Sc1pYSnpJRzl1SUhSb1pTQmxkbVZ1ZENCd1lYUm9YRzVjZEZ4MGFTQTlJREE3WEc1Y2RGeDBkMmhwYkdVZ0tDQW9ZM1Z5SUQwZ1pYWmxiblJRWVhSb1cya3JLMTBwSUNZbUlDRmxkbVZ1ZEM1cGMxQnliM0JoWjJGMGFXOXVVM1J2Y0hCbFpDZ3BJQ2tnZTF4dVhHNWNkRngwWEhSbGRtVnVkQzUwZVhCbElEMGdhU0ErSURFZ1AxeHVYSFJjZEZ4MFhIUmlkV0ppYkdWVWVYQmxJRHBjYmx4MFhIUmNkRngwYzNCbFkybGhiQzVpYVc1a1ZIbHdaU0I4ZkNCMGVYQmxPMXh1WEc1Y2RGeDBYSFF2THlCcVVYVmxjbmtnYUdGdVpHeGxjbHh1WEhSY2RGeDBhR0Z1Wkd4bElEMGdLQ0JrWVhSaFgzQnlhWFl1WjJWMEtDQmpkWElzSUZ3aVpYWmxiblJ6WENJZ0tTQjhmQ0I3ZlNBcFd5QmxkbVZ1ZEM1MGVYQmxJRjBnSmlZZ1pHRjBZVjl3Y21sMkxtZGxkQ2dnWTNWeUxDQmNJbWhoYm1Sc1pWd2lJQ2s3WEc1Y2RGeDBYSFJwWmlBb0lHaGhibVJzWlNBcElIdGNibHgwWEhSY2RGeDBhR0Z1Wkd4bExtRndjR3g1S0NCamRYSXNJR1JoZEdFZ0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnVG1GMGFYWmxJR2hoYm1Sc1pYSmNibHgwWEhSY2RHaGhibVJzWlNBOUlHOXVkSGx3WlNBbUppQmpkWEpiSUc5dWRIbHdaU0JkTzF4dVhIUmNkRngwYVdZZ0tDQm9ZVzVrYkdVZ0ppWWdhR0Z1Wkd4bExtRndjR3g1SUNZbUlHcFJkV1Z5ZVM1aFkyTmxjSFJFWVhSaEtDQmpkWElnS1NBcElIdGNibHgwWEhSY2RGeDBaWFpsYm5RdWNtVnpkV3gwSUQwZ2FHRnVaR3hsTG1Gd2NHeDVLQ0JqZFhJc0lHUmhkR0VnS1R0Y2JseDBYSFJjZEZ4MGFXWWdLQ0JsZG1WdWRDNXlaWE4xYkhRZ1BUMDlJR1poYkhObElDa2dlMXh1WEhSY2RGeDBYSFJjZEdWMlpXNTBMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjZEZ4MFpYWmxiblF1ZEhsd1pTQTlJSFI1Y0dVN1hHNWNibHgwWEhRdkx5QkpaaUJ1YjJKdlpIa2djSEpsZG1WdWRHVmtJSFJvWlNCa1pXWmhkV3gwSUdGamRHbHZiaXdnWkc4Z2FYUWdibTkzWEc1Y2RGeDBhV1lnS0NBaGIyNXNlVWhoYm1Sc1pYSnpJQ1ltSUNGbGRtVnVkQzVwYzBSbFptRjFiSFJRY21WMlpXNTBaV1FvS1NBcElIdGNibHh1WEhSY2RGeDBhV1lnS0NBb0lYTndaV05wWVd3dVgyUmxabUYxYkhRZ2ZId2djM0JsWTJsaGJDNWZaR1ZtWVhWc2RDNWhjSEJzZVNnZ1pYWmxiblJRWVhSb0xuQnZjQ2dwTENCa1lYUmhJQ2tnUFQwOUlHWmhiSE5sS1NBbUpseHVYSFJjZEZ4MFhIUnFVWFZsY25rdVlXTmpaWEIwUkdGMFlTZ2daV3hsYlNBcElDa2dlMXh1WEc1Y2RGeDBYSFJjZEM4dklFTmhiR3dnWVNCdVlYUnBkbVVnUkU5TklHMWxkR2h2WkNCdmJpQjBhR1VnZEdGeVoyVjBJSGRwZEdnZ2RHaGxJSE5oYldVZ2JtRnRaU0J1WVcxbElHRnpJSFJvWlNCbGRtVnVkQzVjYmx4MFhIUmNkRngwTHk4Z1JHOXVKM1FnWkc4Z1pHVm1ZWFZzZENCaFkzUnBiMjV6SUc5dUlIZHBibVJ2ZHl3Z2RHaGhkQ2R6SUhkb1pYSmxJR2RzYjJKaGJDQjJZWEpwWVdKc1pYTWdZbVVnS0NNMk1UY3dLVnh1WEhSY2RGeDBYSFJwWmlBb0lHOXVkSGx3WlNBbUppQnFVWFZsY25rdWFYTkdkVzVqZEdsdmJpZ2daV3hsYlZzZ2RIbHdaU0JkSUNrZ0ppWWdJV3BSZFdWeWVTNXBjMWRwYm1SdmR5Z2daV3hsYlNBcElDa2dlMXh1WEc1Y2RGeDBYSFJjZEZ4MEx5OGdSRzl1SjNRZ2NtVXRkSEpwWjJkbGNpQmhiaUJ2YmtaUFR5QmxkbVZ1ZENCM2FHVnVJSGRsSUdOaGJHd2dhWFJ6SUVaUFR5Z3BJRzFsZEdodlpGeHVYSFJjZEZ4MFhIUmNkSFJ0Y0NBOUlHVnNaVzFiSUc5dWRIbHdaU0JkTzF4dVhHNWNkRngwWEhSY2RGeDBhV1lnS0NCMGJYQWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmxiR1Z0V3lCdmJuUjVjR1VnWFNBOUlHNTFiR3c3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkRngwTHk4Z1VISmxkbVZ1ZENCeVpTMTBjbWxuWjJWeWFXNW5JRzltSUhSb1pTQnpZVzFsSUdWMlpXNTBMQ0J6YVc1alpTQjNaU0JoYkhKbFlXUjVJR0oxWW1Kc1pXUWdhWFFnWVdKdmRtVmNibHgwWEhSY2RGeDBYSFJxVVhWbGNua3VaWFpsYm5RdWRISnBaMmRsY21Wa0lEMGdkSGx3WlR0Y2JseDBYSFJjZEZ4MFhIUmxiR1Z0V3lCMGVYQmxJRjBvS1R0Y2JseDBYSFJjZEZ4MFhIUnFVWFZsY25rdVpYWmxiblF1ZEhKcFoyZGxjbVZrSUQwZ2RXNWtaV1pwYm1Wa08xeHVYRzVjZEZ4MFhIUmNkRngwYVdZZ0tDQjBiWEFnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJsYkdWdFd5QnZiblI1Y0dVZ1hTQTlJSFJ0Y0R0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjYmx4MFhIUnlaWFIxY200Z1pYWmxiblF1Y21WemRXeDBPMXh1WEhSOUxGeHVYRzVjZEdScGMzQmhkR05vT2lCbWRXNWpkR2x2YmlnZ1pYWmxiblFnS1NCN1hHNWNibHgwWEhRdkx5Qk5ZV3RsSUdFZ2QzSnBkR0ZpYkdVZ2FsRjFaWEo1TGtWMlpXNTBJR1p5YjIwZ2RHaGxJRzVoZEdsMlpTQmxkbVZ1ZENCdlltcGxZM1JjYmx4MFhIUmxkbVZ1ZENBOUlHcFJkV1Z5ZVM1bGRtVnVkQzVtYVhnb0lHVjJaVzUwSUNrN1hHNWNibHgwWEhSMllYSWdhU3dnYWl3Z2NtVjBMQ0J0WVhSamFHVmtMQ0JvWVc1a2JHVlBZbW9zWEc1Y2RGeDBYSFJvWVc1a2JHVnlVWFZsZFdVZ1BTQmJYU3hjYmx4MFhIUmNkR0Z5WjNNZ1BTQnpiR2xqWlM1allXeHNLQ0JoY21kMWJXVnVkSE1nS1N4Y2JseDBYSFJjZEdoaGJtUnNaWEp6SUQwZ0tDQmtZWFJoWDNCeWFYWXVaMlYwS0NCMGFHbHpMQ0JjSW1WMlpXNTBjMXdpSUNrZ2ZId2dlMzBnS1ZzZ1pYWmxiblF1ZEhsd1pTQmRJSHg4SUZ0ZExGeHVYSFJjZEZ4MGMzQmxZMmxoYkNBOUlHcFJkV1Z5ZVM1bGRtVnVkQzV6Y0dWamFXRnNXeUJsZG1WdWRDNTBlWEJsSUYwZ2ZId2dlMzA3WEc1Y2JseDBYSFF2THlCVmMyVWdkR2hsSUdacGVDMWxaQ0JxVVhWbGNua3VSWFpsYm5RZ2NtRjBhR1Z5SUhSb1lXNGdkR2hsSUNoeVpXRmtMVzl1YkhrcElHNWhkR2wyWlNCbGRtVnVkRnh1WEhSY2RHRnlaM05iTUYwZ1BTQmxkbVZ1ZER0Y2JseDBYSFJsZG1WdWRDNWtaV3hsWjJGMFpWUmhjbWRsZENBOUlIUm9hWE03WEc1Y2JseDBYSFF2THlCRFlXeHNJSFJvWlNCd2NtVkVhWE53WVhSamFDQm9iMjlySUdadmNpQjBhR1VnYldGd2NHVmtJSFI1Y0dVc0lHRnVaQ0JzWlhRZ2FYUWdZbUZwYkNCcFppQmtaWE5wY21Wa1hHNWNkRngwYVdZZ0tDQnpjR1ZqYVdGc0xuQnlaVVJwYzNCaGRHTm9JQ1ltSUhOd1pXTnBZV3d1Y0hKbFJHbHpjR0YwWTJndVkyRnNiQ2dnZEdocGN5d2daWFpsYm5RZ0tTQTlQVDBnWm1Gc2MyVWdLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MGZWeHVYRzVjZEZ4MEx5OGdSR1YwWlhKdGFXNWxJR2hoYm1Sc1pYSnpYRzVjZEZ4MGFHRnVaR3hsY2xGMVpYVmxJRDBnYWxGMVpYSjVMbVYyWlc1MExtaGhibVJzWlhKekxtTmhiR3dvSUhSb2FYTXNJR1YyWlc1MExDQm9ZVzVrYkdWeWN5QXBPMXh1WEc1Y2RGeDBMeThnVW5WdUlHUmxiR1ZuWVhSbGN5Qm1hWEp6ZERzZ2RHaGxlU0J0WVhrZ2QyRnVkQ0IwYnlCemRHOXdJSEJ5YjNCaFoyRjBhVzl1SUdKbGJtVmhkR2dnZFhOY2JseDBYSFJwSUQwZ01EdGNibHgwWEhSM2FHbHNaU0FvSUNodFlYUmphR1ZrSUQwZ2FHRnVaR3hsY2xGMVpYVmxXeUJwS3lzZ1hTa2dKaVlnSVdWMlpXNTBMbWx6VUhKdmNHRm5ZWFJwYjI1VGRHOXdjR1ZrS0NrZ0tTQjdYRzVjZEZ4MFhIUmxkbVZ1ZEM1amRYSnlaVzUwVkdGeVoyVjBJRDBnYldGMFkyaGxaQzVsYkdWdE8xeHVYRzVjZEZ4MFhIUnFJRDBnTUR0Y2JseDBYSFJjZEhkb2FXeGxJQ2dnS0doaGJtUnNaVTlpYWlBOUlHMWhkR05vWldRdWFHRnVaR3hsY25OYklHb3JLeUJkS1NBbUppQWhaWFpsYm5RdWFYTkpiVzFsWkdsaGRHVlFjbTl3WVdkaGRHbHZibE4wYjNCd1pXUW9LU0FwSUh0Y2JseHVYSFJjZEZ4MFhIUXZMeUJVY21sbloyVnlaV1FnWlhabGJuUWdiWFZ6ZENCbGFYUm9aWElnTVNrZ2FHRjJaU0J1YnlCdVlXMWxjM0JoWTJVc0lHOXlJRElwSUdoaGRtVWdibUZ0WlhOd1lXTmxLSE1wWEc1Y2RGeDBYSFJjZEM4dklHRWdjM1ZpYzJWMElHOXlJR1Z4ZFdGc0lIUnZJSFJvYjNObElHbHVJSFJvWlNCaWIzVnVaQ0JsZG1WdWRDQW9ZbTkwYUNCallXNGdhR0YyWlNCdWJ5QnVZVzFsYzNCaFkyVXBMbHh1WEhSY2RGeDBYSFJwWmlBb0lDRmxkbVZ1ZEM1dVlXMWxjM0JoWTJWZmNtVWdmSHdnWlhabGJuUXVibUZ0WlhOd1lXTmxYM0psTG5SbGMzUW9JR2hoYm1Sc1pVOWlhaTV1WVcxbGMzQmhZMlVnS1NBcElIdGNibHh1WEhSY2RGeDBYSFJjZEdWMlpXNTBMbWhoYm1Sc1pVOWlhaUE5SUdoaGJtUnNaVTlpYWp0Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZEM1a1lYUmhJRDBnYUdGdVpHeGxUMkpxTG1SaGRHRTdYRzVjYmx4MFhIUmNkRngwWEhSeVpYUWdQU0FvSUNocVVYVmxjbmt1WlhabGJuUXVjM0JsWTJsaGJGc2dhR0Z1Wkd4bFQySnFMbTl5YVdkVWVYQmxJRjBnZkh3Z2UzMHBMbWhoYm1Sc1pTQjhmQ0JvWVc1a2JHVlBZbW91YUdGdVpHeGxjaUFwWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzVoY0hCc2VTZ2diV0YwWTJobFpDNWxiR1Z0TENCaGNtZHpJQ2s3WEc1Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSUhKbGRDQWhQVDBnZFc1a1pXWnBibVZrSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDQW9aWFpsYm5RdWNtVnpkV3gwSUQwZ2NtVjBLU0E5UFQwZ1ptRnNjMlVnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEdWMlpXNTBMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdYRzVjZEZ4MFhIUmNkRngwWEhSY2RHVjJaVzUwTG5OMGIzQlFjbTl3WVdkaGRHbHZiaWdwTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseHVYSFJjZEM4dklFTmhiR3dnZEdobElIQnZjM1JFYVhOd1lYUmphQ0JvYjI5cklHWnZjaUIwYUdVZ2JXRndjR1ZrSUhSNWNHVmNibHgwWEhScFppQW9JSE53WldOcFlXd3VjRzl6ZEVScGMzQmhkR05vSUNrZ2UxeHVYSFJjZEZ4MGMzQmxZMmxoYkM1d2IzTjBSR2x6Y0dGMFkyZ3VZMkZzYkNnZ2RHaHBjeXdnWlhabGJuUWdLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUnlaWFIxY200Z1pYWmxiblF1Y21WemRXeDBPMXh1WEhSOUxGeHVYRzVjZEdoaGJtUnNaWEp6T2lCbWRXNWpkR2x2YmlnZ1pYWmxiblFzSUdoaGJtUnNaWEp6SUNrZ2UxeHVYSFJjZEhaaGNpQnBMQ0J0WVhSamFHVnpMQ0J6Wld3c0lHaGhibVJzWlU5aWFpeGNibHgwWEhSY2RHaGhibVJzWlhKUmRXVjFaU0E5SUZ0ZExGeHVYSFJjZEZ4MFpHVnNaV2RoZEdWRGIzVnVkQ0E5SUdoaGJtUnNaWEp6TG1SbGJHVm5ZWFJsUTI5MWJuUXNYRzVjZEZ4MFhIUmpkWElnUFNCbGRtVnVkQzUwWVhKblpYUTdYRzVjYmx4MFhIUXZMeUJHYVc1a0lHUmxiR1ZuWVhSbElHaGhibVJzWlhKelhHNWNkRngwTHk4Z1FteGhZMnN0YUc5c1pTQlRWa2NnUEhWelpUNGdhVzV6ZEdGdVkyVWdkSEpsWlhNZ0tDTXhNekU0TUNsY2JseDBYSFF2THlCQmRtOXBaQ0J1YjI0dGJHVm1kQzFqYkdsamF5QmlkV0ppYkdsdVp5QnBiaUJHYVhKbFptOTRJQ2dqTXpnMk1TbGNibHgwWEhScFppQW9JR1JsYkdWbllYUmxRMjkxYm5RZ0ppWWdZM1Z5TG01dlpHVlVlWEJsSUNZbUlDZ2haWFpsYm5RdVluVjBkRzl1SUh4OElHVjJaVzUwTG5SNWNHVWdJVDA5SUZ3aVkyeHBZMnRjSWlrZ0tTQjdYRzVjYmx4MFhIUmNkR1p2Y2lBb0lEc2dZM1Z5SUNFOVBTQjBhR2x6T3lCamRYSWdQU0JqZFhJdWNHRnlaVzUwVG05a1pTQjhmQ0IwYUdseklDa2dlMXh1WEc1Y2RGeDBYSFJjZEM4dklFUnZiaWQwSUhCeWIyTmxjM01nWTJ4cFkydHpJRzl1SUdScGMyRmliR1ZrSUdWc1pXMWxiblJ6SUNnak5qa3hNU3dnSXpneE5qVXNJQ014TVRNNE1pd2dJekV4TnpZMEtWeHVYSFJjZEZ4MFhIUnBaaUFvSUdOMWNpNWthWE5oWW14bFpDQWhQVDBnZEhKMVpTQjhmQ0JsZG1WdWRDNTBlWEJsSUNFOVBTQmNJbU5zYVdOclhDSWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MGJXRjBZMmhsY3lBOUlGdGRPMXh1WEhSY2RGeDBYSFJjZEdadmNpQW9JR2tnUFNBd095QnBJRHdnWkdWc1pXZGhkR1ZEYjNWdWREc2dhU3NySUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYUdGdVpHeGxUMkpxSUQwZ2FHRnVaR3hsY25OYklHa2dYVHRjYmx4dVhIUmNkRngwWEhSY2RGeDBMeThnUkc5dUozUWdZMjl1Wm14cFkzUWdkMmwwYUNCUFltcGxZM1F1Y0hKdmRHOTBlWEJsSUhCeWIzQmxjblJwWlhNZ0tDTXhNekl3TXlsY2JseDBYSFJjZEZ4MFhIUmNkSE5sYkNBOUlHaGhibVJzWlU5aWFpNXpaV3hsWTNSdmNpQXJJRndpSUZ3aU8xeHVYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9JRzFoZEdOb1pYTmJJSE5sYkNCZElEMDlQU0IxYm1SbFptbHVaV1FnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEcxaGRHTm9aWE5iSUhObGJDQmRJRDBnYUdGdVpHeGxUMkpxTG01bFpXUnpRMjl1ZEdWNGRDQS9YRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBhbEYxWlhKNUtDQnpaV3dzSUhSb2FYTWdLUzVwYm1SbGVDZ2dZM1Z5SUNrZ1BqMGdNQ0E2WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwYWxGMVpYSjVMbVpwYm1Rb0lITmxiQ3dnZEdocGN5d2diblZzYkN3Z1d5QmpkWElnWFNBcExteGxibWQwYUR0Y2JseDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSY2RHbG1JQ2dnYldGMFkyaGxjMXNnYzJWc0lGMGdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRzFoZEdOb1pYTXVjSFZ6YUNnZ2FHRnVaR3hsVDJKcUlDazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEdsbUlDZ2diV0YwWTJobGN5NXNaVzVuZEdnZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSb1lXNWtiR1Z5VVhWbGRXVXVjSFZ6YUNoN0lHVnNaVzA2SUdOMWNpd2dhR0Z1Wkd4bGNuTTZJRzFoZEdOb1pYTWdmU2s3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYRzVjZEZ4MEx5OGdRV1JrSUhSb1pTQnlaVzFoYVc1cGJtY2dLR1JwY21WamRHeDVMV0p2ZFc1a0tTQm9ZVzVrYkdWeWMxeHVYSFJjZEdsbUlDZ2daR1ZzWldkaGRHVkRiM1Z1ZENBOElHaGhibVJzWlhKekxteGxibWQwYUNBcElIdGNibHgwWEhSY2RHaGhibVJzWlhKUmRXVjFaUzV3ZFhOb0tIc2daV3hsYlRvZ2RHaHBjeXdnYUdGdVpHeGxjbk02SUdoaGJtUnNaWEp6TG5Oc2FXTmxLQ0JrWld4bFoyRjBaVU52ZFc1MElDa2dmU2s3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBjbVYwZFhKdUlHaGhibVJzWlhKUmRXVjFaVHRjYmx4MGZTeGNibHh1WEhRdkx5QkpibU5zZFdSbGN5QnpiMjFsSUdWMlpXNTBJSEJ5YjNCeklITm9ZWEpsWkNCaWVTQkxaWGxGZG1WdWRDQmhibVFnVFc5MWMyVkZkbVZ1ZEZ4dVhIUndjbTl3Y3pvZ1hDSmhiSFJMWlhrZ1luVmlZbXhsY3lCallXNWpaV3hoWW14bElHTjBjbXhMWlhrZ1kzVnljbVZ1ZEZSaGNtZGxkQ0JsZG1WdWRGQm9ZWE5sSUcxbGRHRkxaWGtnY21Wc1lYUmxaRlJoY21kbGRDQnphR2xtZEV0bGVTQjBZWEpuWlhRZ2RHbHRaVk4wWVcxd0lIWnBaWGNnZDJocFkyaGNJaTV6Y0d4cGRDaGNJaUJjSWlrc1hHNWNibHgwWm1sNFNHOXZhM002SUh0OUxGeHVYRzVjZEd0bGVVaHZiMnR6T2lCN1hHNWNkRngwY0hKdmNITTZJRndpWTJoaGNpQmphR0Z5UTI5a1pTQnJaWGtnYTJWNVEyOWtaVndpTG5Od2JHbDBLRndpSUZ3aUtTeGNibHgwWEhSbWFXeDBaWEk2SUdaMWJtTjBhVzl1S0NCbGRtVnVkQ3dnYjNKcFoybHVZV3dnS1NCN1hHNWNibHgwWEhSY2RDOHZJRUZrWkNCM2FHbGphQ0JtYjNJZ2EyVjVJR1YyWlc1MGMxeHVYSFJjZEZ4MGFXWWdLQ0JsZG1WdWRDNTNhR2xqYUNBOVBTQnVkV3hzSUNrZ2UxeHVYSFJjZEZ4MFhIUmxkbVZ1ZEM1M2FHbGphQ0E5SUc5eWFXZHBibUZzTG1Ob1lYSkRiMlJsSUNFOUlHNTFiR3dnUHlCdmNtbG5hVzVoYkM1amFHRnlRMjlrWlNBNklHOXlhV2RwYm1Gc0xtdGxlVU52WkdVN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RISmxkSFZ5YmlCbGRtVnVkRHRjYmx4MFhIUjlYRzVjZEgwc1hHNWNibHgwYlc5MWMyVkliMjlyY3pvZ2UxeHVYSFJjZEhCeWIzQnpPaUJjSW1KMWRIUnZiaUJpZFhSMGIyNXpJR05zYVdWdWRGZ2dZMnhwWlc1MFdTQnZabVp6WlhSWUlHOW1abk5sZEZrZ2NHRm5aVmdnY0dGblpWa2djMk55WldWdVdDQnpZM0psWlc1WklIUnZSV3hsYldWdWRGd2lMbk53YkdsMEtGd2lJRndpS1N4Y2JseDBYSFJtYVd4MFpYSTZJR1oxYm1OMGFXOXVLQ0JsZG1WdWRDd2diM0pwWjJsdVlXd2dLU0I3WEc1Y2RGeDBYSFIyWVhJZ1pYWmxiblJFYjJNc0lHUnZZeXdnWW05a2VTeGNibHgwWEhSY2RGeDBZblYwZEc5dUlEMGdiM0pwWjJsdVlXd3VZblYwZEc5dU8xeHVYRzVjZEZ4MFhIUXZMeUJEWVd4amRXeGhkR1VnY0dGblpWZ3ZXU0JwWmlCdGFYTnphVzVuSUdGdVpDQmpiR2xsYm5SWUwxa2dZWFpoYVd4aFlteGxYRzVjZEZ4MFhIUnBaaUFvSUdWMlpXNTBMbkJoWjJWWUlEMDlJRzUxYkd3Z0ppWWdiM0pwWjJsdVlXd3VZMnhwWlc1MFdDQWhQU0J1ZFd4c0lDa2dlMXh1WEhSY2RGeDBYSFJsZG1WdWRFUnZZeUE5SUdWMlpXNTBMblJoY21kbGRDNXZkMjVsY2tSdlkzVnRaVzUwSUh4OElHUnZZM1Z0Wlc1ME8xeHVYSFJjZEZ4MFhIUmtiMk1nUFNCbGRtVnVkRVJ2WXk1a2IyTjFiV1Z1ZEVWc1pXMWxiblE3WEc1Y2RGeDBYSFJjZEdKdlpIa2dQU0JsZG1WdWRFUnZZeTVpYjJSNU8xeHVYRzVjZEZ4MFhIUmNkR1YyWlc1MExuQmhaMlZZSUQwZ2IzSnBaMmx1WVd3dVkyeHBaVzUwV0NBcklDZ2daRzlqSUNZbUlHUnZZeTV6WTNKdmJHeE1aV1owSUh4OElHSnZaSGtnSmlZZ1ltOWtlUzV6WTNKdmJHeE1aV1owSUh4OElEQWdLU0F0SUNnZ1pHOWpJQ1ltSUdSdll5NWpiR2xsYm5STVpXWjBJSHg4SUdKdlpIa2dKaVlnWW05a2VTNWpiR2xsYm5STVpXWjBJSHg4SURBZ0tUdGNibHgwWEhSY2RGeDBaWFpsYm5RdWNHRm5aVmtnUFNCdmNtbG5hVzVoYkM1amJHbGxiblJaSUNzZ0tDQmtiMk1nSmlZZ1pHOWpMbk5qY205c2JGUnZjQ0FnZkh3Z1ltOWtlU0FtSmlCaWIyUjVMbk5qY205c2JGUnZjQ0FnZkh3Z01DQXBJQzBnS0NCa2IyTWdKaVlnWkc5akxtTnNhV1Z1ZEZSdmNDQWdmSHdnWW05a2VTQW1KaUJpYjJSNUxtTnNhV1Z1ZEZSdmNDQWdmSHdnTUNBcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJCWkdRZ2QyaHBZMmdnWm05eUlHTnNhV05yT2lBeElEMDlQU0JzWldaME95QXlJRDA5UFNCdGFXUmtiR1U3SURNZ1BUMDlJSEpwWjJoMFhHNWNkRngwWEhRdkx5Qk9iM1JsT2lCaWRYUjBiMjRnYVhNZ2JtOTBJRzV2Y20xaGJHbDZaV1FzSUhOdklHUnZiaWQwSUhWelpTQnBkRnh1WEhSY2RGeDBhV1lnS0NBaFpYWmxiblF1ZDJocFkyZ2dKaVlnWW5WMGRHOXVJQ0U5UFNCMWJtUmxabWx1WldRZ0tTQjdYRzVjZEZ4MFhIUmNkR1YyWlc1MExuZG9hV05vSUQwZ0tDQmlkWFIwYjI0Z0ppQXhJRDhnTVNBNklDZ2dZblYwZEc5dUlDWWdNaUEvSURNZ09pQW9JR0oxZEhSdmJpQW1JRFFnUHlBeUlEb2dNQ0FwSUNrZ0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlHVjJaVzUwTzF4dVhIUmNkSDFjYmx4MGZTeGNibHh1WEhSbWFYZzZJR1oxYm1OMGFXOXVLQ0JsZG1WdWRDQXBJSHRjYmx4MFhIUnBaaUFvSUdWMlpXNTBXeUJxVVhWbGNua3VaWGh3WVc1a2J5QmRJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR1YyWlc1ME8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklFTnlaV0YwWlNCaElIZHlhWFJoWW14bElHTnZjSGtnYjJZZ2RHaGxJR1YyWlc1MElHOWlhbVZqZENCaGJtUWdibTl5YldGc2FYcGxJSE52YldVZ2NISnZjR1Z5ZEdsbGMxeHVYSFJjZEhaaGNpQnBMQ0J3Y205d0xDQmpiM0I1TEZ4dVhIUmNkRngwZEhsd1pTQTlJR1YyWlc1MExuUjVjR1VzWEc1Y2RGeDBYSFJ2Y21sbmFXNWhiRVYyWlc1MElEMGdaWFpsYm5Rc1hHNWNkRngwWEhSbWFYaEliMjlySUQwZ2RHaHBjeTVtYVhoSWIyOXJjMXNnZEhsd1pTQmRPMXh1WEc1Y2RGeDBhV1lnS0NBaFptbDRTRzl2YXlBcElIdGNibHgwWEhSY2RIUm9hWE11Wm1sNFNHOXZhM05iSUhSNWNHVWdYU0E5SUdacGVFaHZiMnNnUFZ4dVhIUmNkRngwWEhSeWJXOTFjMlZGZG1WdWRDNTBaWE4wS0NCMGVYQmxJQ2tnUHlCMGFHbHpMbTF2ZFhObFNHOXZhM01nT2x4dVhIUmNkRngwWEhSeWEyVjVSWFpsYm5RdWRHVnpkQ2dnZEhsd1pTQXBJRDhnZEdocGN5NXJaWGxJYjI5cmN5QTZYRzVjZEZ4MFhIUmNkSHQ5TzF4dVhIUmNkSDFjYmx4MFhIUmpiM0I1SUQwZ1ptbDRTRzl2YXk1d2NtOXdjeUEvSUhSb2FYTXVjSEp2Y0hNdVkyOXVZMkYwS0NCbWFYaEliMjlyTG5CeWIzQnpJQ2tnT2lCMGFHbHpMbkJ5YjNCek8xeHVYRzVjZEZ4MFpYWmxiblFnUFNCdVpYY2dhbEYxWlhKNUxrVjJaVzUwS0NCdmNtbG5hVzVoYkVWMlpXNTBJQ2s3WEc1Y2JseDBYSFJwSUQwZ1kyOXdlUzVzWlc1bmRHZzdYRzVjZEZ4MGQyaHBiR1VnS0NCcExTMGdLU0I3WEc1Y2RGeDBYSFJ3Y205d0lEMGdZMjl3ZVZzZ2FTQmRPMXh1WEhSY2RGeDBaWFpsYm5SYklIQnliM0FnWFNBOUlHOXlhV2RwYm1Gc1JYWmxiblJiSUhCeWIzQWdYVHRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJUZFhCd2IzSjBPaUJEYjNKa2IzWmhJREl1TlNBb1YyVmlTMmwwS1NBb0l6RXpNalUxS1Z4dVhIUmNkQzh2SUVGc2JDQmxkbVZ1ZEhNZ2MyaHZkV3hrSUdoaGRtVWdZU0IwWVhKblpYUTdJRU52Y21SdmRtRWdaR1YyYVdObGNtVmhaSGtnWkc5bGMyNG5kRnh1WEhSY2RHbG1JQ2dnSVdWMlpXNTBMblJoY21kbGRDQXBJSHRjYmx4MFhIUmNkR1YyWlc1MExuUmhjbWRsZENBOUlHUnZZM1Z0Wlc1ME8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklGTjFjSEJ2Y25RNklGTmhabUZ5YVNBMkxqQXJMQ0JEYUhKdmJXVThNamhjYmx4MFhIUXZMeUJVWVhKblpYUWdjMmh2ZFd4a0lHNXZkQ0JpWlNCaElIUmxlSFFnYm05a1pTQW9JelV3TkN3Z0l6RXpNVFF6S1Z4dVhIUmNkR2xtSUNnZ1pYWmxiblF1ZEdGeVoyVjBMbTV2WkdWVWVYQmxJRDA5UFNBeklDa2dlMXh1WEhSY2RGeDBaWFpsYm5RdWRHRnlaMlYwSUQwZ1pYWmxiblF1ZEdGeVoyVjBMbkJoY21WdWRFNXZaR1U3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBjbVYwZFhKdUlHWnBlRWh2YjJzdVptbHNkR1Z5SUQ4Z1ptbDRTRzl2YXk1bWFXeDBaWElvSUdWMlpXNTBMQ0J2Y21sbmFXNWhiRVYyWlc1MElDa2dPaUJsZG1WdWREdGNibHgwZlN4Y2JseHVYSFJ6Y0dWamFXRnNPaUI3WEc1Y2RGeDBiRzloWkRvZ2UxeHVYSFJjZEZ4MEx5OGdVSEpsZG1WdWRDQjBjbWxuWjJWeVpXUWdhVzFoWjJVdWJHOWhaQ0JsZG1WdWRITWdabkp2YlNCaWRXSmliR2x1WnlCMGJ5QjNhVzVrYjNjdWJHOWhaRnh1WEhSY2RGeDBibTlDZFdKaWJHVTZJSFJ5ZFdWY2JseDBYSFI5TEZ4dVhIUmNkR1p2WTNWek9pQjdYRzVjZEZ4MFhIUXZMeUJHYVhKbElHNWhkR2wyWlNCbGRtVnVkQ0JwWmlCd2IzTnphV0pzWlNCemJ5QmliSFZ5TDJadlkzVnpJSE5sY1hWbGJtTmxJR2x6SUdOdmNuSmxZM1JjYmx4MFhIUmNkSFJ5YVdkblpYSTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwWEhScFppQW9JSFJvYVhNZ0lUMDlJSE5oWm1WQlkzUnBkbVZGYkdWdFpXNTBLQ2tnSmlZZ2RHaHBjeTVtYjJOMWN5QXBJSHRjYmx4MFhIUmNkRngwWEhSMGFHbHpMbVp2WTNWektDazdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJR1poYkhObE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlMRnh1WEhSY2RGeDBaR1ZzWldkaGRHVlVlWEJsT2lCY0ltWnZZM1Z6YVc1Y0lseHVYSFJjZEgwc1hHNWNkRngwWW14MWNqb2dlMXh1WEhSY2RGeDBkSEpwWjJkbGNqb2dablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJjZEdsbUlDZ2dkR2hwY3lBOVBUMGdjMkZtWlVGamRHbDJaVVZzWlcxbGJuUW9LU0FtSmlCMGFHbHpMbUpzZFhJZ0tTQjdYRzVjZEZ4MFhIUmNkRngwZEdocGN5NWliSFZ5S0NrN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlHWmhiSE5sTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MFpHVnNaV2RoZEdWVWVYQmxPaUJjSW1adlkzVnpiM1YwWENKY2JseDBYSFI5TEZ4dVhIUmNkR05zYVdOck9pQjdYRzVjZEZ4MFhIUXZMeUJHYjNJZ1kyaGxZMnRpYjNnc0lHWnBjbVVnYm1GMGFYWmxJR1YyWlc1MElITnZJR05vWldOclpXUWdjM1JoZEdVZ2QybHNiQ0JpWlNCeWFXZG9kRnh1WEhSY2RGeDBkSEpwWjJkbGNqb2dablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJjZEdsbUlDZ2dkR2hwY3k1MGVYQmxJRDA5UFNCY0ltTm9aV05yWW05NFhDSWdKaVlnZEdocGN5NWpiR2xqYXlBbUppQnFVWFZsY25rdWJtOWtaVTVoYldVb0lIUm9hWE1zSUZ3aWFXNXdkWFJjSWlBcElDa2dlMXh1WEhSY2RGeDBYSFJjZEhSb2FYTXVZMnhwWTJzb0tUdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdabUZzYzJVN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkQzh2SUVadmNpQmpjbTl6Y3kxaWNtOTNjMlZ5SUdOdmJuTnBjM1JsYm1ONUxDQmtiMjRuZENCbWFYSmxJRzVoZEdsMlpTQXVZMnhwWTJzb0tTQnZiaUJzYVc1cmMxeHVYSFJjZEZ4MFgyUmxabUYxYkhRNklHWjFibU4wYVc5dUtDQmxkbVZ1ZENBcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHcFJkV1Z5ZVM1dWIyUmxUbUZ0WlNnZ1pYWmxiblF1ZEdGeVoyVjBMQ0JjSW1GY0lpQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMHNYRzVjYmx4MFhIUmlaV1p2Y21WMWJteHZZV1E2SUh0Y2JseDBYSFJjZEhCdmMzUkVhWE53WVhSamFEb2dablZ1WTNScGIyNG9JR1YyWlc1MElDa2dlMXh1WEc1Y2RGeDBYSFJjZEM4dklGTjFjSEJ2Y25RNklFWnBjbVZtYjNnZ01qQXJYRzVjZEZ4MFhIUmNkQzh2SUVacGNtVm1iM2dnWkc5bGMyNG5kQ0JoYkdWeWRDQnBaaUIwYUdVZ2NtVjBkWEp1Vm1Gc2RXVWdabWxsYkdRZ2FYTWdibTkwSUhObGRDNWNibHgwWEhSY2RGeDBhV1lnS0NCbGRtVnVkQzV5WlhOMWJIUWdJVDA5SUhWdVpHVm1hVzVsWkNBbUppQmxkbVZ1ZEM1dmNtbG5hVzVoYkVWMlpXNTBJQ2tnZTF4dVhIUmNkRngwWEhSY2RHVjJaVzUwTG05eWFXZHBibUZzUlhabGJuUXVjbVYwZFhKdVZtRnNkV1VnUFNCbGRtVnVkQzV5WlhOMWJIUTdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjZEgwc1hHNWNibHgwYzJsdGRXeGhkR1U2SUdaMWJtTjBhVzl1S0NCMGVYQmxMQ0JsYkdWdExDQmxkbVZ1ZEN3Z1luVmlZbXhsSUNrZ2UxeHVYSFJjZEM4dklGQnBaMmQ1WW1GamF5QnZiaUJoSUdSdmJtOXlJR1YyWlc1MElIUnZJSE5wYlhWc1lYUmxJR0VnWkdsbVptVnlaVzUwSUc5dVpTNWNibHgwWEhRdkx5QkdZV3RsSUc5eWFXZHBibUZzUlhabGJuUWdkRzhnWVhadmFXUWdaRzl1YjNJbmN5QnpkRzl3VUhKdmNHRm5ZWFJwYjI0c0lHSjFkQ0JwWmlCMGFHVmNibHgwWEhRdkx5QnphVzExYkdGMFpXUWdaWFpsYm5RZ2NISmxkbVZ1ZEhNZ1pHVm1ZWFZzZENCMGFHVnVJSGRsSUdSdklIUm9aU0J6WVcxbElHOXVJSFJvWlNCa2IyNXZjaTVjYmx4MFhIUjJZWElnWlNBOUlHcFJkV1Z5ZVM1bGVIUmxibVFvWEc1Y2RGeDBYSFJ1WlhjZ2FsRjFaWEo1TGtWMlpXNTBLQ2tzWEc1Y2RGeDBYSFJsZG1WdWRDeGNibHgwWEhSY2RIdGNibHgwWEhSY2RGeDBkSGx3WlRvZ2RIbHdaU3hjYmx4MFhIUmNkRngwYVhOVGFXMTFiR0YwWldRNklIUnlkV1VzWEc1Y2RGeDBYSFJjZEc5eWFXZHBibUZzUlhabGJuUTZJSHQ5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBLVHRjYmx4MFhIUnBaaUFvSUdKMVltSnNaU0FwSUh0Y2JseDBYSFJjZEdwUmRXVnllUzVsZG1WdWRDNTBjbWxuWjJWeUtDQmxMQ0J1ZFd4c0xDQmxiR1Z0SUNrN1hHNWNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkR3BSZFdWeWVTNWxkbVZ1ZEM1a2FYTndZWFJqYUM1allXeHNLQ0JsYkdWdExDQmxJQ2s3WEc1Y2RGeDBmVnh1WEhSY2RHbG1JQ2dnWlM1cGMwUmxabUYxYkhSUWNtVjJaVzUwWldRb0tTQXBJSHRjYmx4MFhIUmNkR1YyWlc1MExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hHNWNkRngwZlZ4dVhIUjlYRzU5TzF4dVhHNXFVWFZsY25rdWNtVnRiM1psUlhabGJuUWdQU0JtZFc1amRHbHZiaWdnWld4bGJTd2dkSGx3WlN3Z2FHRnVaR3hsSUNrZ2UxeHVYSFJwWmlBb0lHVnNaVzB1Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lBcElIdGNibHgwWEhSbGJHVnRMbkpsYlc5MlpVVjJaVzUwVEdsemRHVnVaWElvSUhSNWNHVXNJR2hoYm1Sc1pTd2dabUZzYzJVZ0tUdGNibHgwZlZ4dWZUdGNibHh1YWxGMVpYSjVMa1YyWlc1MElEMGdablZ1WTNScGIyNG9JSE55WXl3Z2NISnZjSE1nS1NCN1hHNWNkQzh2SUVGc2JHOTNJR2x1YzNSaGJuUnBZWFJwYjI0Z2QybDBhRzkxZENCMGFHVWdKMjVsZHljZ2EyVjVkMjl5WkZ4dVhIUnBaaUFvSUNFb2RHaHBjeUJwYm5OMFlXNWpaVzltSUdwUmRXVnllUzVGZG1WdWRDa2dLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHNWxkeUJxVVhWbGNua3VSWFpsYm5Rb0lITnlZeXdnY0hKdmNITWdLVHRjYmx4MGZWeHVYRzVjZEM4dklFVjJaVzUwSUc5aWFtVmpkRnh1WEhScFppQW9JSE55WXlBbUppQnpjbU11ZEhsd1pTQXBJSHRjYmx4MFhIUjBhR2x6TG05eWFXZHBibUZzUlhabGJuUWdQU0J6Y21NN1hHNWNkRngwZEdocGN5NTBlWEJsSUQwZ2MzSmpMblI1Y0dVN1hHNWNibHgwWEhRdkx5QkZkbVZ1ZEhNZ1luVmlZbXhwYm1jZ2RYQWdkR2hsSUdSdlkzVnRaVzUwSUcxaGVTQm9ZWFpsSUdKbFpXNGdiV0Z5YTJWa0lHRnpJSEJ5WlhabGJuUmxaRnh1WEhSY2RDOHZJR0o1SUdFZ2FHRnVaR3hsY2lCc2IzZGxjaUJrYjNkdUlIUm9aU0IwY21WbE95QnlaV1pzWldOMElIUm9aU0JqYjNKeVpXTjBJSFpoYkhWbExseHVYSFJjZEhSb2FYTXVhWE5FWldaaGRXeDBVSEpsZG1WdWRHVmtJRDBnYzNKakxtUmxabUYxYkhSUWNtVjJaVzUwWldRZ2ZIeGNibHgwWEhSY2RGeDBjM0pqTG1SbFptRjFiSFJRY21WMlpXNTBaV1FnUFQwOUlIVnVaR1ZtYVc1bFpDQW1KbHh1WEhSY2RGeDBYSFF2THlCVGRYQndiM0owT2lCQmJtUnliMmxrUERRdU1GeHVYSFJjZEZ4MFhIUnpjbU11Y21WMGRYSnVWbUZzZFdVZ1BUMDlJR1poYkhObElEOWNibHgwWEhSY2RISmxkSFZ5YmxSeWRXVWdPbHh1WEhSY2RGeDBjbVYwZFhKdVJtRnNjMlU3WEc1Y2JseDBMeThnUlhabGJuUWdkSGx3WlZ4dVhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEhSb2FYTXVkSGx3WlNBOUlITnlZenRjYmx4MGZWeHVYRzVjZEM4dklGQjFkQ0JsZUhCc2FXTnBkR3g1SUhCeWIzWnBaR1ZrSUhCeWIzQmxjblJwWlhNZ2IyNTBieUIwYUdVZ1pYWmxiblFnYjJKcVpXTjBYRzVjZEdsbUlDZ2djSEp2Y0hNZ0tTQjdYRzVjZEZ4MGFsRjFaWEo1TG1WNGRHVnVaQ2dnZEdocGN5d2djSEp2Y0hNZ0tUdGNibHgwZlZ4dVhHNWNkQzh2SUVOeVpXRjBaU0JoSUhScGJXVnpkR0Z0Y0NCcFppQnBibU52YldsdVp5QmxkbVZ1ZENCa2IyVnpiaWQwSUdoaGRtVWdiMjVsWEc1Y2RIUm9hWE11ZEdsdFpWTjBZVzF3SUQwZ2MzSmpJQ1ltSUhOeVl5NTBhVzFsVTNSaGJYQWdmSHdnYWxGMVpYSjVMbTV2ZHlncE8xeHVYRzVjZEM4dklFMWhjbXNnYVhRZ1lYTWdabWw0WldSY2JseDBkR2hwYzFzZ2FsRjFaWEo1TG1WNGNHRnVaRzhnWFNBOUlIUnlkV1U3WEc1OU8xeHVYRzR2THlCcVVYVmxjbmt1UlhabGJuUWdhWE1nWW1GelpXUWdiMjRnUkU5Tk15QkZkbVZ1ZEhNZ1lYTWdjM0JsWTJsbWFXVmtJR0o1SUhSb1pTQkZRMDFCVTJOeWFYQjBJRXhoYm1kMVlXZGxJRUpwYm1ScGJtZGNiaTh2SUdoMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0x6SXdNRE12VjBRdFJFOU5MVXhsZG1Wc0xUTXRSWFpsYm5SekxUSXdNRE13TXpNeEwyVmpiV0V0YzJOeWFYQjBMV0pwYm1ScGJtY3VhSFJ0YkZ4dWFsRjFaWEo1TGtWMlpXNTBMbkJ5YjNSdmRIbHdaU0E5SUh0Y2JseDBhWE5FWldaaGRXeDBVSEpsZG1WdWRHVmtPaUJ5WlhSMWNtNUdZV3h6WlN4Y2JseDBhWE5RY205d1lXZGhkR2x2YmxOMGIzQndaV1E2SUhKbGRIVnlia1poYkhObExGeHVYSFJwYzBsdGJXVmthV0YwWlZCeWIzQmhaMkYwYVc5dVUzUnZjSEJsWkRvZ2NtVjBkWEp1Um1Gc2MyVXNYRzVjYmx4MGNISmxkbVZ1ZEVSbFptRjFiSFE2SUdaMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEhaaGNpQmxJRDBnZEdocGN5NXZjbWxuYVc1aGJFVjJaVzUwTzF4dVhHNWNkRngwZEdocGN5NXBjMFJsWm1GMWJIUlFjbVYyWlc1MFpXUWdQU0J5WlhSMWNtNVVjblZsTzF4dVhHNWNkRngwYVdZZ0tDQmxJQ1ltSUdVdWNISmxkbVZ1ZEVSbFptRjFiSFFnS1NCN1hHNWNkRngwWEhSbExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hHNWNkRngwZlZ4dVhIUjlMRnh1WEhSemRHOXdVSEp2Y0dGbllYUnBiMjQ2SUdaMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEhaaGNpQmxJRDBnZEdocGN5NXZjbWxuYVc1aGJFVjJaVzUwTzF4dVhHNWNkRngwZEdocGN5NXBjMUJ5YjNCaFoyRjBhVzl1VTNSdmNIQmxaQ0E5SUhKbGRIVnlibFJ5ZFdVN1hHNWNibHgwWEhScFppQW9JR1VnSmlZZ1pTNXpkRzl3VUhKdmNHRm5ZWFJwYjI0Z0tTQjdYRzVjZEZ4MFhIUmxMbk4wYjNCUWNtOXdZV2RoZEdsdmJpZ3BPMXh1WEhSY2RIMWNibHgwZlN4Y2JseDBjM1J2Y0VsdGJXVmthV0YwWlZCeWIzQmhaMkYwYVc5dU9pQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUjJZWElnWlNBOUlIUm9hWE11YjNKcFoybHVZV3hGZG1WdWREdGNibHh1WEhSY2RIUm9hWE11YVhOSmJXMWxaR2xoZEdWUWNtOXdZV2RoZEdsdmJsTjBiM0J3WldRZ1BTQnlaWFIxY201VWNuVmxPMXh1WEc1Y2RGeDBhV1lnS0NCbElDWW1JR1V1YzNSdmNFbHRiV1ZrYVdGMFpWQnliM0JoWjJGMGFXOXVJQ2tnZTF4dVhIUmNkRngwWlM1emRHOXdTVzF0WldScFlYUmxVSEp2Y0dGbllYUnBiMjRvS1R0Y2JseDBYSFI5WEc1Y2JseDBYSFIwYUdsekxuTjBiM0JRY205d1lXZGhkR2x2YmlncE8xeHVYSFI5WEc1OU8xeHVYRzR2THlCRGNtVmhkR1VnYlc5MWMyVmxiblJsY2k5c1pXRjJaU0JsZG1WdWRITWdkWE5wYm1jZ2JXOTFjMlZ2ZG1WeUwyOTFkQ0JoYm1RZ1pYWmxiblF0ZEdsdFpTQmphR1ZqYTNOY2JpOHZJRk4xY0hCdmNuUTZJRU5vY205dFpTQXhOU3RjYm1wUmRXVnllUzVsWVdOb0tIdGNibHgwYlc5MWMyVmxiblJsY2pvZ1hDSnRiM1Z6Wlc5MlpYSmNJaXhjYmx4MGJXOTFjMlZzWldGMlpUb2dYQ0p0YjNWelpXOTFkRndpTEZ4dVhIUndiMmx1ZEdWeVpXNTBaWEk2SUZ3aWNHOXBiblJsY205MlpYSmNJaXhjYmx4MGNHOXBiblJsY214bFlYWmxPaUJjSW5CdmFXNTBaWEp2ZFhSY0lseHVmU3dnWm5WdVkzUnBiMjRvSUc5eWFXY3NJR1pwZUNBcElIdGNibHgwYWxGMVpYSjVMbVYyWlc1MExuTndaV05wWVd4YklHOXlhV2NnWFNBOUlIdGNibHgwWEhSa1pXeGxaMkYwWlZSNWNHVTZJR1pwZUN4Y2JseDBYSFJpYVc1a1ZIbHdaVG9nWm1sNExGeHVYRzVjZEZ4MGFHRnVaR3hsT2lCbWRXNWpkR2x2YmlnZ1pYWmxiblFnS1NCN1hHNWNkRngwWEhSMllYSWdjbVYwTEZ4dVhIUmNkRngwWEhSMFlYSm5aWFFnUFNCMGFHbHpMRnh1WEhSY2RGeDBYSFJ5Wld4aGRHVmtJRDBnWlhabGJuUXVjbVZzWVhSbFpGUmhjbWRsZEN4Y2JseDBYSFJjZEZ4MGFHRnVaR3hsVDJKcUlEMGdaWFpsYm5RdWFHRnVaR3hsVDJKcU8xeHVYRzVjZEZ4MFhIUXZMeUJHYjNJZ2JXOTFjMlZ1ZEdWeUwyeGxZWFpsSUdOaGJHd2dkR2hsSUdoaGJtUnNaWElnYVdZZ2NtVnNZWFJsWkNCcGN5QnZkWFJ6YVdSbElIUm9aU0IwWVhKblpYUXVYRzVjZEZ4MFhIUXZMeUJPUWpvZ1RtOGdjbVZzWVhSbFpGUmhjbWRsZENCcFppQjBhR1VnYlc5MWMyVWdiR1ZtZEM5bGJuUmxjbVZrSUhSb1pTQmljbTkzYzJWeUlIZHBibVJ2ZDF4dVhIUmNkRngwYVdZZ0tDQWhjbVZzWVhSbFpDQjhmQ0FvY21Wc1lYUmxaQ0FoUFQwZ2RHRnlaMlYwSUNZbUlDRnFVWFZsY25rdVkyOXVkR0ZwYm5Nb0lIUmhjbWRsZEN3Z2NtVnNZWFJsWkNBcEtTQXBJSHRjYmx4MFhIUmNkRngwWlhabGJuUXVkSGx3WlNBOUlHaGhibVJzWlU5aWFpNXZjbWxuVkhsd1pUdGNibHgwWEhSY2RGeDBjbVYwSUQwZ2FHRnVaR3hsVDJKcUxtaGhibVJzWlhJdVlYQndiSGtvSUhSb2FYTXNJR0Z5WjNWdFpXNTBjeUFwTzF4dVhIUmNkRngwWEhSbGRtVnVkQzUwZVhCbElEMGdabWw0TzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwY21WMGRYSnVJSEpsZER0Y2JseDBYSFI5WEc1Y2RIMDdYRzU5S1R0Y2JseHVMeThnVTNWd2NHOXlkRG9nUm1seVpXWnZlQ3dnUTJoeWIyMWxMQ0JUWVdaaGNtbGNiaTh2SUVOeVpXRjBaU0JjSW1KMVltSnNhVzVuWENJZ1ptOWpkWE1nWVc1a0lHSnNkWElnWlhabGJuUnpYRzVwWmlBb0lDRnpkWEJ3YjNKMExtWnZZM1Z6YVc1Q2RXSmliR1Z6SUNrZ2UxeHVYSFJxVVhWbGNua3VaV0ZqYUNoN0lHWnZZM1Z6T2lCY0ltWnZZM1Z6YVc1Y0lpd2dZbXgxY2pvZ1hDSm1iMk4xYzI5MWRGd2lJSDBzSUdaMWJtTjBhVzl1S0NCdmNtbG5MQ0JtYVhnZ0tTQjdYRzVjYmx4MFhIUXZMeUJCZEhSaFkyZ2dZU0J6YVc1bmJHVWdZMkZ3ZEhWeWFXNW5JR2hoYm1Sc1pYSWdiMjRnZEdobElHUnZZM1Z0Wlc1MElIZG9hV3hsSUhOdmJXVnZibVVnZDJGdWRITWdabTlqZFhOcGJpOW1iMk4xYzI5MWRGeHVYSFJjZEhaaGNpQm9ZVzVrYkdWeUlEMGdablZ1WTNScGIyNG9JR1YyWlc1MElDa2dlMXh1WEhSY2RGeDBYSFJxVVhWbGNua3VaWFpsYm5RdWMybHRkV3hoZEdVb0lHWnBlQ3dnWlhabGJuUXVkR0Z5WjJWMExDQnFVWFZsY25rdVpYWmxiblF1Wm1sNEtDQmxkbVZ1ZENBcExDQjBjblZsSUNrN1hHNWNkRngwWEhSOU8xeHVYRzVjZEZ4MGFsRjFaWEo1TG1WMlpXNTBMbk53WldOcFlXeGJJR1pwZUNCZElEMGdlMXh1WEhSY2RGeDBjMlYwZFhBNklHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ1pHOWpJRDBnZEdocGN5NXZkMjVsY2tSdlkzVnRaVzUwSUh4OElIUm9hWE1zWEc1Y2RGeDBYSFJjZEZ4MFlYUjBZV05vWlhNZ1BTQmtZWFJoWDNCeWFYWXVZV05qWlhOektDQmtiMk1zSUdacGVDQXBPMXh1WEc1Y2RGeDBYSFJjZEdsbUlDZ2dJV0YwZEdGamFHVnpJQ2tnZTF4dVhIUmNkRngwWEhSY2RHUnZZeTVoWkdSRmRtVnVkRXhwYzNSbGJtVnlLQ0J2Y21sbkxDQm9ZVzVrYkdWeUxDQjBjblZsSUNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBaR0YwWVY5d2NtbDJMbUZqWTJWemN5Z2daRzlqTENCbWFYZ3NJQ2dnWVhSMFlXTm9aWE1nZkh3Z01DQXBJQ3NnTVNBcE8xeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RIUmxZWEprYjNkdU9pQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUmNkRngwZG1GeUlHUnZZeUE5SUhSb2FYTXViM2R1WlhKRWIyTjFiV1Z1ZENCOGZDQjBhR2x6TEZ4dVhIUmNkRngwWEhSY2RHRjBkR0ZqYUdWeklEMGdaR0YwWVY5d2NtbDJMbUZqWTJWemN5Z2daRzlqTENCbWFYZ2dLU0F0SURFN1hHNWNibHgwWEhSY2RGeDBhV1lnS0NBaFlYUjBZV05vWlhNZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWkc5akxuSmxiVzkyWlVWMlpXNTBUR2x6ZEdWdVpYSW9JRzl5YVdjc0lHaGhibVJzWlhJc0lIUnlkV1VnS1R0Y2JseDBYSFJjZEZ4MFhIUmtZWFJoWDNCeWFYWXVjbVZ0YjNabEtDQmtiMk1zSUdacGVDQXBPMXh1WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MFpHRjBZVjl3Y21sMkxtRmpZMlZ6Y3lnZ1pHOWpMQ0JtYVhnc0lHRjBkR0ZqYUdWeklDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEhSOUtUdGNibjFjYmx4dWFsRjFaWEo1TG1adUxtVjRkR1Z1WkNoN1hHNWNibHgwYjI0NklHWjFibU4wYVc5dUtDQjBlWEJsY3l3Z2MyVnNaV04wYjNJc0lHUmhkR0VzSUdadUxDQXZLa2xPVkVWU1RrRk1LaThnYjI1bElDa2dlMXh1WEhSY2RIWmhjaUJ2Y21sblJtNHNJSFI1Y0dVN1hHNWNibHgwWEhRdkx5QlVlWEJsY3lCallXNGdZbVVnWVNCdFlYQWdiMllnZEhsd1pYTXZhR0Z1Wkd4bGNuTmNibHgwWEhScFppQW9JSFI1Y0dWdlppQjBlWEJsY3lBOVBUMGdYQ0p2WW1wbFkzUmNJaUFwSUh0Y2JseDBYSFJjZEM4dklDZ2dkSGx3WlhNdFQySnFaV04wTENCelpXeGxZM1J2Y2l3Z1pHRjBZU0FwWEc1Y2RGeDBYSFJwWmlBb0lIUjVjR1Z2WmlCelpXeGxZM1J2Y2lBaFBUMGdYQ0p6ZEhKcGJtZGNJaUFwSUh0Y2JseDBYSFJjZEZ4MEx5OGdLQ0IwZVhCbGN5MVBZbXBsWTNRc0lHUmhkR0VnS1Z4dVhIUmNkRngwWEhSa1lYUmhJRDBnWkdGMFlTQjhmQ0J6Wld4bFkzUnZjanRjYmx4MFhIUmNkRngwYzJWc1pXTjBiM0lnUFNCMWJtUmxabWx1WldRN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSbWIzSWdLQ0IwZVhCbElHbHVJSFI1Y0dWeklDa2dlMXh1WEhSY2RGeDBYSFIwYUdsekxtOXVLQ0IwZVhCbExDQnpaV3hsWTNSdmNpd2daR0YwWVN3Z2RIbHdaWE5iSUhSNWNHVWdYU3dnYjI1bElDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUjlYRzVjYmx4MFhIUnBaaUFvSUdSaGRHRWdQVDBnYm5Wc2JDQW1KaUJtYmlBOVBTQnVkV3hzSUNrZ2UxeHVYSFJjZEZ4MEx5OGdLQ0IwZVhCbGN5d2dabTRnS1Z4dVhIUmNkRngwWm00Z1BTQnpaV3hsWTNSdmNqdGNibHgwWEhSY2RHUmhkR0VnUFNCelpXeGxZM1J2Y2lBOUlIVnVaR1ZtYVc1bFpEdGNibHgwWEhSOUlHVnNjMlVnYVdZZ0tDQm1iaUE5UFNCdWRXeHNJQ2tnZTF4dVhIUmNkRngwYVdZZ0tDQjBlWEJsYjJZZ2MyVnNaV04wYjNJZ1BUMDlJRndpYzNSeWFXNW5YQ0lnS1NCN1hHNWNkRngwWEhSY2RDOHZJQ2dnZEhsd1pYTXNJSE5sYkdWamRHOXlMQ0JtYmlBcFhHNWNkRngwWEhSY2RHWnVJRDBnWkdGMFlUdGNibHgwWEhSY2RGeDBaR0YwWVNBOUlIVnVaR1ZtYVc1bFpEdGNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RDOHZJQ2dnZEhsd1pYTXNJR1JoZEdFc0lHWnVJQ2xjYmx4MFhIUmNkRngwWm00Z1BTQmtZWFJoTzF4dVhIUmNkRngwWEhSa1lYUmhJRDBnYzJWc1pXTjBiM0k3WEc1Y2RGeDBYSFJjZEhObGJHVmpkRzl5SUQwZ2RXNWtaV1pwYm1Wa08xeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBYSFJwWmlBb0lHWnVJRDA5UFNCbVlXeHpaU0FwSUh0Y2JseDBYSFJjZEdadUlEMGdjbVYwZFhKdVJtRnNjMlU3WEc1Y2RGeDBmU0JsYkhObElHbG1JQ2dnSVdadUlDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlIUm9hWE03WEc1Y2RGeDBmVnh1WEc1Y2RGeDBhV1lnS0NCdmJtVWdQVDA5SURFZ0tTQjdYRzVjZEZ4MFhIUnZjbWxuUm00Z1BTQm1ianRjYmx4MFhIUmNkR1p1SUQwZ1puVnVZM1JwYjI0b0lHVjJaVzUwSUNrZ2UxeHVYSFJjZEZ4MFhIUXZMeUJEWVc0Z2RYTmxJR0Z1SUdWdGNIUjVJSE5sZEN3Z2MybHVZMlVnWlhabGJuUWdZMjl1ZEdGcGJuTWdkR2hsSUdsdVptOWNibHgwWEhSY2RGeDBhbEYxWlhKNUtDa3ViMlptS0NCbGRtVnVkQ0FwTzF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYjNKcFowWnVMbUZ3Y0d4NUtDQjBhR2x6TENCaGNtZDFiV1Z1ZEhNZ0tUdGNibHgwWEhSY2RIMDdYRzVjZEZ4MFhIUXZMeUJWYzJVZ2MyRnRaU0JuZFdsa0lITnZJR05oYkd4bGNpQmpZVzRnY21WdGIzWmxJSFZ6YVc1bklHOXlhV2RHYmx4dVhIUmNkRngwWm00dVozVnBaQ0E5SUc5eWFXZEdiaTVuZFdsa0lIeDhJQ2dnYjNKcFowWnVMbWQxYVdRZ1BTQnFVWFZsY25rdVozVnBaQ3NySUNrN1hHNWNkRngwZlZ4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG1WaFkyZ29JR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwYWxGMVpYSjVMbVYyWlc1MExtRmtaQ2dnZEdocGN5d2dkSGx3WlhNc0lHWnVMQ0JrWVhSaExDQnpaV3hsWTNSdmNpQXBPMXh1WEhSY2RIMHBPMXh1WEhSOUxGeHVYSFJ2Ym1VNklHWjFibU4wYVc5dUtDQjBlWEJsY3l3Z2MyVnNaV04wYjNJc0lHUmhkR0VzSUdadUlDa2dlMXh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbTl1S0NCMGVYQmxjeXdnYzJWc1pXTjBiM0lzSUdSaGRHRXNJR1p1TENBeElDazdYRzVjZEgwc1hHNWNkRzltWmpvZ1puVnVZM1JwYjI0b0lIUjVjR1Z6TENCelpXeGxZM1J2Y2l3Z1ptNGdLU0I3WEc1Y2RGeDBkbUZ5SUdoaGJtUnNaVTlpYWl3Z2RIbHdaVHRjYmx4MFhIUnBaaUFvSUhSNWNHVnpJQ1ltSUhSNWNHVnpMbkJ5WlhabGJuUkVaV1poZFd4MElDWW1JSFI1Y0dWekxtaGhibVJzWlU5aWFpQXBJSHRjYmx4MFhIUmNkQzh2SUNnZ1pYWmxiblFnS1NBZ1pHbHpjR0YwWTJobFpDQnFVWFZsY25rdVJYWmxiblJjYmx4MFhIUmNkR2hoYm1Sc1pVOWlhaUE5SUhSNWNHVnpMbWhoYm1Sc1pVOWlhanRjYmx4MFhIUmNkR3BSZFdWeWVTZ2dkSGx3WlhNdVpHVnNaV2RoZEdWVVlYSm5aWFFnS1M1dlptWW9YRzVjZEZ4MFhIUmNkR2hoYm1Sc1pVOWlhaTV1WVcxbGMzQmhZMlVnUHlCb1lXNWtiR1ZQWW1vdWIzSnBaMVI1Y0dVZ0t5QmNJaTVjSWlBcklHaGhibVJzWlU5aWFpNXVZVzFsYzNCaFkyVWdPaUJvWVc1a2JHVlBZbW91YjNKcFoxUjVjR1VzWEc1Y2RGeDBYSFJjZEdoaGJtUnNaVTlpYWk1elpXeGxZM1J2Y2l4Y2JseDBYSFJjZEZ4MGFHRnVaR3hsVDJKcUxtaGhibVJzWlhKY2JseDBYSFJjZENrN1hHNWNkRngwWEhSeVpYUjFjbTRnZEdocGN6dGNibHgwWEhSOVhHNWNkRngwYVdZZ0tDQjBlWEJsYjJZZ2RIbHdaWE1nUFQwOUlGd2liMkpxWldOMFhDSWdLU0I3WEc1Y2RGeDBYSFF2THlBb0lIUjVjR1Z6TFc5aWFtVmpkQ0JiTENCelpXeGxZM1J2Y2wwZ0tWeHVYSFJjZEZ4MFptOXlJQ2dnZEhsd1pTQnBiaUIwZVhCbGN5QXBJSHRjYmx4MFhIUmNkRngwZEdocGN5NXZabVlvSUhSNWNHVXNJSE5sYkdWamRHOXlMQ0IwZVhCbGMxc2dkSGx3WlNCZElDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUjlYRzVjZEZ4MGFXWWdLQ0J6Wld4bFkzUnZjaUE5UFQwZ1ptRnNjMlVnZkh3Z2RIbHdaVzltSUhObGJHVmpkRzl5SUQwOVBTQmNJbVoxYm1OMGFXOXVYQ0lnS1NCN1hHNWNkRngwWEhRdkx5QW9JSFI1Y0dWeklGc3NJR1p1WFNBcFhHNWNkRngwWEhSbWJpQTlJSE5sYkdWamRHOXlPMXh1WEhSY2RGeDBjMlZzWldOMGIzSWdQU0IxYm1SbFptbHVaV1E3WEc1Y2RGeDBmVnh1WEhSY2RHbG1JQ2dnWm00Z1BUMDlJR1poYkhObElDa2dlMXh1WEhSY2RGeDBabTRnUFNCeVpYUjFjbTVHWVd4elpUdGNibHgwWEhSOVhHNWNkRngwY21WMGRYSnVJSFJvYVhNdVpXRmphQ2htZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJjZEdwUmRXVnllUzVsZG1WdWRDNXlaVzF2ZG1Vb0lIUm9hWE1zSUhSNWNHVnpMQ0JtYml3Z2MyVnNaV04wYjNJZ0tUdGNibHgwWEhSOUtUdGNibHgwZlN4Y2JseHVYSFIwY21sbloyVnlPaUJtZFc1amRHbHZiaWdnZEhsd1pTd2daR0YwWVNBcElIdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NWxZV05vS0daMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEZ4MGFsRjFaWEo1TG1WMlpXNTBMblJ5YVdkblpYSW9JSFI1Y0dVc0lHUmhkR0VzSUhSb2FYTWdLVHRjYmx4MFhIUjlLVHRjYmx4MGZTeGNibHgwZEhKcFoyZGxja2hoYm1Sc1pYSTZJR1oxYm1OMGFXOXVLQ0IwZVhCbExDQmtZWFJoSUNrZ2UxeHVYSFJjZEhaaGNpQmxiR1Z0SUQwZ2RHaHBjMXN3WFR0Y2JseDBYSFJwWmlBb0lHVnNaVzBnS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnYWxGMVpYSjVMbVYyWlc1MExuUnlhV2RuWlhJb0lIUjVjR1VzSUdSaGRHRXNJR1ZzWlcwc0lIUnlkV1VnS1R0Y2JseDBYSFI5WEc1Y2RIMWNibjBwTzF4dVhHNWNiblpoY2x4dVhIUnllR2gwYld4VVlXY2dQU0F2UENnL0lXRnlaV0Y4WW5KOFkyOXNmR1Z0WW1Wa2ZHaHlmR2x0WjN4cGJuQjFkSHhzYVc1cmZHMWxkR0Y4Y0dGeVlXMHBLQ2hiWEZ4M09sMHJLVnRlUGwwcUtWeGNMejR2WjJrc1hHNWNkSEowWVdkT1lXMWxJRDBnTHp3b1cxeGNkenBkS3lrdkxGeHVYSFJ5YUhSdGJDQTlJQzg4ZkNZalAxeGNkeXM3THl4Y2JseDBjbTV2U1c1dVpYSm9kRzFzSUQwZ0x6d29QenB6WTNKcGNIUjhjM1I1YkdWOGJHbHVheWt2YVN4Y2JseDBMeThnWTJobFkydGxaRDFjSW1Ob1pXTnJaV1JjSWlCdmNpQmphR1ZqYTJWa1hHNWNkSEpqYUdWamEyVmtJRDBnTDJOb1pXTnJaV1JjWEhNcUtEODZXMTQ5WFh3OVhGeHpLaTVqYUdWamEyVmtMaWt2YVN4Y2JseDBjbk5qY21sd2RGUjVjR1VnUFNBdlhpUjhYRnd2S0Q4NmFtRjJZWHhsWTIxaEtYTmpjbWx3ZEM5cExGeHVYSFJ5YzJOeWFYQjBWSGx3WlUxaGMydGxaQ0E5SUM5ZWRISjFaVnhjTHlndUtpa3ZMRnh1WEhSeVkyeGxZVzVUWTNKcGNIUWdQU0F2WGx4Y2N5bzhJU2cvT2x4Y1cwTkVRVlJCWEZ4YmZDMHRLWHdvUHpwY1hGMWNYRjE4TFMwcFBseGNjeW9rTDJjc1hHNWNibHgwTHk4Z1YyVWdhR0YyWlNCMGJ5QmpiRzl6WlNCMGFHVnpaU0IwWVdkeklIUnZJSE4xY0hCdmNuUWdXRWhVVFV3Z0tDTXhNekl3TUNsY2JseDBkM0poY0UxaGNDQTlJSHRjYmx4dVhIUmNkQzh2SUZOMWNIQnZjblE2SUVsRk9WeHVYSFJjZEc5d2RHbHZiam9nV3lBeExDQmNJanh6Wld4bFkzUWdiWFZzZEdsd2JHVTlKMjExYkhScGNHeGxKejVjSWl3Z1hDSThMM05sYkdWamRENWNJaUJkTEZ4dVhHNWNkRngwZEdobFlXUTZJRnNnTVN3Z1hDSThkR0ZpYkdVK1hDSXNJRndpUEM5MFlXSnNaVDVjSWlCZExGeHVYSFJjZEdOdmJEb2dXeUF5TENCY0lqeDBZV0pzWlQ0OFkyOXNaM0p2ZFhBK1hDSXNJRndpUEM5amIyeG5jbTkxY0Q0OEwzUmhZbXhsUGx3aUlGMHNYRzVjZEZ4MGRISTZJRnNnTWl3Z1hDSThkR0ZpYkdVK1BIUmliMlI1UGx3aUxDQmNJand2ZEdKdlpIaytQQzkwWVdKc1pUNWNJaUJkTEZ4dVhIUmNkSFJrT2lCYklETXNJRndpUEhSaFlteGxQangwWW05a2VUNDhkSEkrWENJc0lGd2lQQzkwY2o0OEwzUmliMlI1UGp3dmRHRmliR1UrWENJZ1hTeGNibHh1WEhSY2RGOWtaV1poZFd4ME9pQmJJREFzSUZ3aVhDSXNJRndpWENJZ1hWeHVYSFI5TzF4dVhHNHZMeUJUZFhCd2IzSjBPaUJKUlRsY2JuZHlZWEJOWVhBdWIzQjBaM0p2ZFhBZ1BTQjNjbUZ3VFdGd0xtOXdkR2x2Ymp0Y2JseHVkM0poY0UxaGNDNTBZbTlrZVNBOUlIZHlZWEJOWVhBdWRHWnZiM1FnUFNCM2NtRndUV0Z3TG1OdmJHZHliM1Z3SUQwZ2QzSmhjRTFoY0M1allYQjBhVzl1SUQwZ2QzSmhjRTFoY0M1MGFHVmhaRHRjYm5keVlYQk5ZWEF1ZEdnZ1BTQjNjbUZ3VFdGd0xuUmtPMXh1WEc0dkx5QlRkWEJ3YjNKME9pQXhMbmdnWTI5dGNHRjBhV0pwYkdsMGVWeHVMeThnVFdGdWFYQjFiR0YwYVc1bklIUmhZbXhsY3lCeVpYRjFhWEpsY3lCaElIUmliMlI1WEc1bWRXNWpkR2x2YmlCdFlXNXBjSFZzWVhScGIyNVVZWEpuWlhRb0lHVnNaVzBzSUdOdmJuUmxiblFnS1NCN1hHNWNkSEpsZEhWeWJpQnFVWFZsY25rdWJtOWtaVTVoYldVb0lHVnNaVzBzSUZ3aWRHRmliR1ZjSWlBcElDWW1YRzVjZEZ4MGFsRjFaWEo1TG01dlpHVk9ZVzFsS0NCamIyNTBaVzUwTG01dlpHVlVlWEJsSUNFOVBTQXhNU0EvSUdOdmJuUmxiblFnT2lCamIyNTBaVzUwTG1acGNuTjBRMmhwYkdRc0lGd2lkSEpjSWlBcElEOWNibHh1WEhSY2RHVnNaVzB1WjJWMFJXeGxiV1Z1ZEhOQ2VWUmhaMDVoYldVb1hDSjBZbTlrZVZ3aUtWc3dYU0I4ZkZ4dVhIUmNkRngwWld4bGJTNWhjSEJsYm1SRGFHbHNaQ2dnWld4bGJTNXZkMjVsY2tSdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9YQ0owWW05a2VWd2lLU0FwSURwY2JseDBYSFJsYkdWdE8xeHVmVnh1WEc0dkx5QlNaWEJzWVdObEwzSmxjM1J2Y21VZ2RHaGxJSFI1Y0dVZ1lYUjBjbWxpZFhSbElHOW1JSE5qY21sd2RDQmxiR1Z0Wlc1MGN5Qm1iM0lnYzJGbVpTQkVUMDBnYldGdWFYQjFiR0YwYVc5dVhHNW1kVzVqZEdsdmJpQmthWE5oWW14bFUyTnlhWEIwS0NCbGJHVnRJQ2tnZTF4dVhIUmxiR1Z0TG5SNWNHVWdQU0FvWld4bGJTNW5aWFJCZEhSeWFXSjFkR1VvWENKMGVYQmxYQ0lwSUNFOVBTQnVkV3hzS1NBcklGd2lMMXdpSUNzZ1pXeGxiUzUwZVhCbE8xeHVYSFJ5WlhSMWNtNGdaV3hsYlR0Y2JuMWNibVoxYm1OMGFXOXVJSEpsYzNSdmNtVlRZM0pwY0hRb0lHVnNaVzBnS1NCN1hHNWNkSFpoY2lCdFlYUmphQ0E5SUhKelkzSnBjSFJVZVhCbFRXRnphMlZrTG1WNFpXTW9JR1ZzWlcwdWRIbHdaU0FwTzF4dVhHNWNkR2xtSUNnZ2JXRjBZMmdnS1NCN1hHNWNkRngwWld4bGJTNTBlWEJsSUQwZ2JXRjBZMmhiSURFZ1hUdGNibHgwZlNCbGJITmxJSHRjYmx4MFhIUmxiR1Z0TG5KbGJXOTJaVUYwZEhKcFluVjBaU2hjSW5SNWNHVmNJaWs3WEc1Y2RIMWNibHh1WEhSeVpYUjFjbTRnWld4bGJUdGNibjFjYmx4dUx5OGdUV0Z5YXlCelkzSnBjSFJ6SUdGeklHaGhkbWx1WnlCaGJISmxZV1I1SUdKbFpXNGdaWFpoYkhWaGRHVmtYRzVtZFc1amRHbHZiaUJ6WlhSSGJHOWlZV3hGZG1Gc0tDQmxiR1Z0Y3l3Z2NtVm1SV3hsYldWdWRITWdLU0I3WEc1Y2RIWmhjaUJwSUQwZ01DeGNibHgwWEhSc0lEMGdaV3hsYlhNdWJHVnVaM1JvTzF4dVhHNWNkR1p2Y2lBb0lEc2dhU0E4SUd3N0lHa3JLeUFwSUh0Y2JseDBYSFJrWVhSaFgzQnlhWFl1YzJWMEtGeHVYSFJjZEZ4MFpXeGxiWE5iSUdrZ1hTd2dYQ0puYkc5aVlXeEZkbUZzWENJc0lDRnlaV1pGYkdWdFpXNTBjeUI4ZkNCa1lYUmhYM0J5YVhZdVoyVjBLQ0J5WldaRmJHVnRaVzUwYzFzZ2FTQmRMQ0JjSW1kc2IySmhiRVYyWVd4Y0lpQXBYRzVjZEZ4MEtUdGNibHgwZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJqYkc5dVpVTnZjSGxGZG1WdWRDZ2djM0pqTENCa1pYTjBJQ2tnZTF4dVhIUjJZWElnYVN3Z2JDd2dkSGx3WlN3Z2NHUmhkR0ZQYkdRc0lIQmtZWFJoUTNWeUxDQjFaR0YwWVU5c1pDd2dkV1JoZEdGRGRYSXNJR1YyWlc1MGN6dGNibHh1WEhScFppQW9JR1JsYzNRdWJtOWtaVlI1Y0dVZ0lUMDlJREVnS1NCN1hHNWNkRngwY21WMGRYSnVPMXh1WEhSOVhHNWNibHgwTHk4Z01TNGdRMjl3ZVNCd2NtbDJZWFJsSUdSaGRHRTZJR1YyWlc1MGN5d2dhR0Z1Wkd4bGNuTXNJR1YwWXk1Y2JseDBhV1lnS0NCa1lYUmhYM0J5YVhZdWFHRnpSR0YwWVNnZ2MzSmpJQ2tnS1NCN1hHNWNkRngwY0dSaGRHRlBiR1FnUFNCa1lYUmhYM0J5YVhZdVlXTmpaWE56S0NCemNtTWdLVHRjYmx4MFhIUndaR0YwWVVOMWNpQTlJR1JoZEdGZmNISnBkaTV6WlhRb0lHUmxjM1FzSUhCa1lYUmhUMnhrSUNrN1hHNWNkRngwWlhabGJuUnpJRDBnY0dSaGRHRlBiR1F1WlhabGJuUnpPMXh1WEc1Y2RGeDBhV1lnS0NCbGRtVnVkSE1nS1NCN1hHNWNkRngwWEhSa1pXeGxkR1VnY0dSaGRHRkRkWEl1YUdGdVpHeGxPMXh1WEhSY2RGeDBjR1JoZEdGRGRYSXVaWFpsYm5SeklEMGdlMzA3WEc1Y2JseDBYSFJjZEdadmNpQW9JSFI1Y0dVZ2FXNGdaWFpsYm5SeklDa2dlMXh1WEhSY2RGeDBYSFJtYjNJZ0tDQnBJRDBnTUN3Z2JDQTlJR1YyWlc1MGMxc2dkSGx3WlNCZExteGxibWQwYURzZ2FTQThJR3c3SUdrckt5QXBJSHRjYmx4MFhIUmNkRngwWEhScVVYVmxjbmt1WlhabGJuUXVZV1JrS0NCa1pYTjBMQ0IwZVhCbExDQmxkbVZ1ZEhOYklIUjVjR1VnWFZzZ2FTQmRJQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMWNibHh1WEhRdkx5QXlMaUJEYjNCNUlIVnpaWElnWkdGMFlWeHVYSFJwWmlBb0lHUmhkR0ZmZFhObGNpNW9ZWE5FWVhSaEtDQnpjbU1nS1NBcElIdGNibHgwWEhSMVpHRjBZVTlzWkNBOUlHUmhkR0ZmZFhObGNpNWhZMk5sYzNNb0lITnlZeUFwTzF4dVhIUmNkSFZrWVhSaFEzVnlJRDBnYWxGMVpYSjVMbVY0ZEdWdVpDZ2dlMzBzSUhWa1lYUmhUMnhrSUNrN1hHNWNibHgwWEhSa1lYUmhYM1Z6WlhJdWMyVjBLQ0JrWlhOMExDQjFaR0YwWVVOMWNpQXBPMXh1WEhSOVhHNTlYRzVjYm1aMWJtTjBhVzl1SUdkbGRFRnNiQ2dnWTI5dWRHVjRkQ3dnZEdGbklDa2dlMXh1WEhSMllYSWdjbVYwSUQwZ1kyOXVkR1Y0ZEM1blpYUkZiR1Z0Wlc1MGMwSjVWR0ZuVG1GdFpTQS9JR052Ym5SbGVIUXVaMlYwUld4bGJXVnVkSE5DZVZSaFowNWhiV1VvSUhSaFp5QjhmQ0JjSWlwY0lpQXBJRHBjYmx4MFhIUmNkR052Ym5SbGVIUXVjWFZsY25sVFpXeGxZM1J2Y2tGc2JDQS9JR052Ym5SbGVIUXVjWFZsY25sVFpXeGxZM1J2Y2tGc2JDZ2dkR0ZuSUh4OElGd2lLbHdpSUNrZ09seHVYSFJjZEZ4MFcxMDdYRzVjYmx4MGNtVjBkWEp1SUhSaFp5QTlQVDBnZFc1a1pXWnBibVZrSUh4OElIUmhaeUFtSmlCcVVYVmxjbmt1Ym05a1pVNWhiV1VvSUdOdmJuUmxlSFFzSUhSaFp5QXBJRDljYmx4MFhIUnFVWFZsY25rdWJXVnlaMlVvSUZzZ1kyOXVkR1Y0ZENCZExDQnlaWFFnS1NBNlhHNWNkRngwY21WME8xeHVmVnh1WEc0dkx5QkdhWGdnU1VVZ1luVm5jeXdnYzJWbElITjFjSEJ2Y25RZ2RHVnpkSE5jYm1aMWJtTjBhVzl1SUdacGVFbHVjSFYwS0NCemNtTXNJR1JsYzNRZ0tTQjdYRzVjZEhaaGNpQnViMlJsVG1GdFpTQTlJR1JsYzNRdWJtOWtaVTVoYldVdWRHOU1iM2RsY2tOaGMyVW9LVHRjYmx4dVhIUXZMeUJHWVdsc2N5QjBieUJ3WlhKemFYTjBJSFJvWlNCamFHVmphMlZrSUhOMFlYUmxJRzltSUdFZ1kyeHZibVZrSUdOb1pXTnJZbTk0SUc5eUlISmhaR2x2SUdKMWRIUnZiaTVjYmx4MGFXWWdLQ0J1YjJSbFRtRnRaU0E5UFQwZ1hDSnBibkIxZEZ3aUlDWW1JSEpqYUdWamEyRmliR1ZVZVhCbExuUmxjM1FvSUhOeVl5NTBlWEJsSUNrZ0tTQjdYRzVjZEZ4MFpHVnpkQzVqYUdWamEyVmtJRDBnYzNKakxtTm9aV05yWldRN1hHNWNibHgwTHk4Z1JtRnBiSE1nZEc4Z2NtVjBkWEp1SUhSb1pTQnpaV3hsWTNSbFpDQnZjSFJwYjI0Z2RHOGdkR2hsSUdSbFptRjFiSFFnYzJWc1pXTjBaV1FnYzNSaGRHVWdkMmhsYmlCamJHOXVhVzVuSUc5d2RHbHZibk5jYmx4MGZTQmxiSE5sSUdsbUlDZ2dibTlrWlU1aGJXVWdQVDA5SUZ3aWFXNXdkWFJjSWlCOGZDQnViMlJsVG1GdFpTQTlQVDBnWENKMFpYaDBZWEpsWVZ3aUlDa2dlMXh1WEhSY2RHUmxjM1F1WkdWbVlYVnNkRlpoYkhWbElEMGdjM0pqTG1SbFptRjFiSFJXWVd4MVpUdGNibHgwZlZ4dWZWeHVYRzVxVVhWbGNua3VaWGgwWlc1a0tIdGNibHgwWTJ4dmJtVTZJR1oxYm1OMGFXOXVLQ0JsYkdWdExDQmtZWFJoUVc1a1JYWmxiblJ6TENCa1pXVndSR0YwWVVGdVpFVjJaVzUwY3lBcElIdGNibHgwWEhSMllYSWdhU3dnYkN3Z2MzSmpSV3hsYldWdWRITXNJR1JsYzNSRmJHVnRaVzUwY3l4Y2JseDBYSFJjZEdOc2IyNWxJRDBnWld4bGJTNWpiRzl1WlU1dlpHVW9JSFJ5ZFdVZ0tTeGNibHgwWEhSY2RHbHVVR0ZuWlNBOUlHcFJkV1Z5ZVM1amIyNTBZV2x1Y3lnZ1pXeGxiUzV2ZDI1bGNrUnZZM1Z0Wlc1MExDQmxiR1Z0SUNrN1hHNWNibHgwWEhRdkx5QkdhWGdnU1VVZ1kyeHZibWx1WnlCcGMzTjFaWE5jYmx4MFhIUnBaaUFvSUNGemRYQndiM0owTG01dlEyeHZibVZEYUdWamEyVmtJQ1ltSUNnZ1pXeGxiUzV1YjJSbFZIbHdaU0E5UFQwZ01TQjhmQ0JsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0F4TVNBcElDWW1YRzVjZEZ4MFhIUmNkQ0ZxVVhWbGNua3VhWE5ZVFV4RWIyTW9JR1ZzWlcwZ0tTQXBJSHRjYmx4dVhIUmNkRngwTHk4Z1YyVWdaWE5qYUdWM0lGTnBlbnBzWlNCb1pYSmxJR1p2Y2lCd1pYSm1iM0p0WVc1alpTQnlaV0Z6YjI1ek9pQm9kSFJ3T2k4dmFuTndaWEptTG1OdmJTOW5aWFJoYkd3dGRuTXRjMmw2ZW14bEx6SmNibHgwWEhSY2RHUmxjM1JGYkdWdFpXNTBjeUE5SUdkbGRFRnNiQ2dnWTJ4dmJtVWdLVHRjYmx4MFhIUmNkSE55WTBWc1pXMWxiblJ6SUQwZ1oyVjBRV3hzS0NCbGJHVnRJQ2s3WEc1Y2JseDBYSFJjZEdadmNpQW9JR2tnUFNBd0xDQnNJRDBnYzNKalJXeGxiV1Z1ZEhNdWJHVnVaM1JvT3lCcElEd2diRHNnYVNzcklDa2dlMXh1WEhSY2RGeDBYSFJtYVhoSmJuQjFkQ2dnYzNKalJXeGxiV1Z1ZEhOYklHa2dYU3dnWkdWemRFVnNaVzFsYm5Seld5QnBJRjBnS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2JseDBYSFF2THlCRGIzQjVJSFJvWlNCbGRtVnVkSE1nWm5KdmJTQjBhR1VnYjNKcFoybHVZV3dnZEc4Z2RHaGxJR05zYjI1bFhHNWNkRngwYVdZZ0tDQmtZWFJoUVc1a1JYWmxiblJ6SUNrZ2UxeHVYSFJjZEZ4MGFXWWdLQ0JrWldWd1JHRjBZVUZ1WkVWMlpXNTBjeUFwSUh0Y2JseDBYSFJjZEZ4MGMzSmpSV3hsYldWdWRITWdQU0J6Y21ORmJHVnRaVzUwY3lCOGZDQm5aWFJCYkd3b0lHVnNaVzBnS1R0Y2JseDBYSFJjZEZ4MFpHVnpkRVZzWlcxbGJuUnpJRDBnWkdWemRFVnNaVzFsYm5SeklIeDhJR2RsZEVGc2JDZ2dZMnh2Ym1VZ0tUdGNibHh1WEhSY2RGeDBYSFJtYjNJZ0tDQnBJRDBnTUN3Z2JDQTlJSE55WTBWc1pXMWxiblJ6TG14bGJtZDBhRHNnYVNBOElHdzdJR2tyS3lBcElIdGNibHgwWEhSY2RGeDBYSFJqYkc5dVpVTnZjSGxGZG1WdWRDZ2djM0pqUld4bGJXVnVkSE5iSUdrZ1hTd2daR1Z6ZEVWc1pXMWxiblJ6V3lCcElGMGdLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWTJ4dmJtVkRiM0I1UlhabGJuUW9JR1ZzWlcwc0lHTnNiMjVsSUNrN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1VISmxjMlZ5ZG1VZ2MyTnlhWEIwSUdWMllXeDFZWFJwYjI0Z2FHbHpkRzl5ZVZ4dVhIUmNkR1JsYzNSRmJHVnRaVzUwY3lBOUlHZGxkRUZzYkNnZ1kyeHZibVVzSUZ3aWMyTnlhWEIwWENJZ0tUdGNibHgwWEhScFppQW9JR1JsYzNSRmJHVnRaVzUwY3k1c1pXNW5kR2dnUGlBd0lDa2dlMXh1WEhSY2RGeDBjMlYwUjJ4dlltRnNSWFpoYkNnZ1pHVnpkRVZzWlcxbGJuUnpMQ0FoYVc1UVlXZGxJQ1ltSUdkbGRFRnNiQ2dnWld4bGJTd2dYQ0p6WTNKcGNIUmNJaUFwSUNrN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1VtVjBkWEp1SUhSb1pTQmpiRzl1WldRZ2MyVjBYRzVjZEZ4MGNtVjBkWEp1SUdOc2IyNWxPMXh1WEhSOUxGeHVYRzVjZEdKMWFXeGtSbkpoWjIxbGJuUTZJR1oxYm1OMGFXOXVLQ0JsYkdWdGN5d2dZMjl1ZEdWNGRDd2djMk55YVhCMGN5d2djMlZzWldOMGFXOXVJQ2tnZTF4dVhIUmNkSFpoY2lCbGJHVnRMQ0IwYlhBc0lIUmhaeXdnZDNKaGNDd2dZMjl1ZEdGcGJuTXNJR29zWEc1Y2RGeDBYSFJtY21GbmJXVnVkQ0E5SUdOdmJuUmxlSFF1WTNKbFlYUmxSRzlqZFcxbGJuUkdjbUZuYldWdWRDZ3BMRnh1WEhSY2RGeDBibTlrWlhNZ1BTQmJYU3hjYmx4MFhIUmNkR2tnUFNBd0xGeHVYSFJjZEZ4MGJDQTlJR1ZzWlcxekxteGxibWQwYUR0Y2JseHVYSFJjZEdadmNpQW9JRHNnYVNBOElHdzdJR2tyS3lBcElIdGNibHgwWEhSY2RHVnNaVzBnUFNCbGJHVnRjMXNnYVNCZE8xeHVYRzVjZEZ4MFhIUnBaaUFvSUdWc1pXMGdmSHdnWld4bGJTQTlQVDBnTUNBcElIdGNibHh1WEhSY2RGeDBYSFF2THlCQlpHUWdibTlrWlhNZ1pHbHlaV04wYkhsY2JseDBYSFJjZEZ4MGFXWWdLQ0JxVVhWbGNua3VkSGx3WlNnZ1pXeGxiU0FwSUQwOVBTQmNJbTlpYW1WamRGd2lJQ2tnZTF4dVhIUmNkRngwWEhSY2RDOHZJRk4xY0hCdmNuUTZJRkYwVjJWaVMybDBMQ0JRYUdGdWRHOXRTbE5jYmx4MFhIUmNkRngwWEhRdkx5QndkWE5vTG1Gd2NHeDVLRjhzSUdGeWNtRjViR2xyWlNrZ2RHaHliM2R6SUc5dUlHRnVZMmxsYm5RZ1YyVmlTMmwwWEc1Y2RGeDBYSFJjZEZ4MGFsRjFaWEo1TG0xbGNtZGxLQ0J1YjJSbGN5d2daV3hsYlM1dWIyUmxWSGx3WlNBL0lGc2daV3hsYlNCZElEb2daV3hsYlNBcE8xeHVYRzVjZEZ4MFhIUmNkQzh2SUVOdmJuWmxjblFnYm05dUxXaDBiV3dnYVc1MGJ5QmhJSFJsZUhRZ2JtOWtaVnh1WEhSY2RGeDBYSFI5SUdWc2MyVWdhV1lnS0NBaGNtaDBiV3d1ZEdWemRDZ2daV3hsYlNBcElDa2dlMXh1WEhSY2RGeDBYSFJjZEc1dlpHVnpMbkIxYzJnb0lHTnZiblJsZUhRdVkzSmxZWFJsVkdWNGRFNXZaR1VvSUdWc1pXMGdLU0FwTzF4dVhHNWNkRngwWEhSY2RDOHZJRU52Ym5abGNuUWdhSFJ0YkNCcGJuUnZJRVJQVFNCdWIyUmxjMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEhSdGNDQTlJSFJ0Y0NCOGZDQm1jbUZuYldWdWRDNWhjSEJsYm1SRGFHbHNaQ2dnWTI5dWRHVjRkQzVqY21WaGRHVkZiR1Z0Wlc1MEtGd2laR2wyWENJcElDazdYRzVjYmx4MFhIUmNkRngwWEhRdkx5QkVaWE5sY21saGJHbDZaU0JoSUhOMFlXNWtZWEprSUhKbGNISmxjMlZ1ZEdGMGFXOXVYRzVjZEZ4MFhIUmNkRngwZEdGbklEMGdLQ0J5ZEdGblRtRnRaUzVsZUdWaktDQmxiR1Z0SUNrZ2ZId2dXeUJjSWx3aUxDQmNJbHdpSUYwZ0tWc2dNU0JkTG5SdlRHOTNaWEpEWVhObEtDazdYRzVjZEZ4MFhIUmNkRngwZDNKaGNDQTlJSGR5WVhCTllYQmJJSFJoWnlCZElIeDhJSGR5WVhCTllYQXVYMlJsWm1GMWJIUTdYRzVjZEZ4MFhIUmNkRngwZEcxd0xtbHVibVZ5U0ZSTlRDQTlJSGR5WVhCYklERWdYU0FySUdWc1pXMHVjbVZ3YkdGalpTZ2djbmhvZEcxc1ZHRm5MQ0JjSWp3a01UNDhMeVF5UGx3aUlDa2dLeUIzY21Gd1d5QXlJRjA3WEc1Y2JseDBYSFJjZEZ4MFhIUXZMeUJFWlhOalpXNWtJSFJvY205MVoyZ2dkM0poY0hCbGNuTWdkRzhnZEdobElISnBaMmgwSUdOdmJuUmxiblJjYmx4MFhIUmNkRngwWEhScUlEMGdkM0poY0ZzZ01DQmRPMXh1WEhSY2RGeDBYSFJjZEhkb2FXeGxJQ2dnYWkwdElDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGRHMXdJRDBnZEcxd0xteGhjM1JEYUdsc1pEdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MFhIUXZMeUJUZFhCd2IzSjBPaUJSZEZkbFlrdHBkQ3dnVUdoaGJuUnZiVXBUWEc1Y2RGeDBYSFJjZEZ4MEx5OGdjSFZ6YUM1aGNIQnNlU2hmTENCaGNuSmhlV3hwYTJVcElIUm9jbTkzY3lCdmJpQmhibU5wWlc1MElGZGxZa3RwZEZ4dVhIUmNkRngwWEhSY2RHcFJkV1Z5ZVM1dFpYSm5aU2dnYm05a1pYTXNJSFJ0Y0M1amFHbHNaRTV2WkdWeklDazdYRzVjYmx4MFhIUmNkRngwWEhRdkx5QlNaVzFsYldKbGNpQjBhR1VnZEc5d0xXeGxkbVZzSUdOdmJuUmhhVzVsY2x4dVhIUmNkRngwWEhSY2RIUnRjQ0E5SUdaeVlXZHRaVzUwTG1acGNuTjBRMmhwYkdRN1hHNWNibHgwWEhSY2RGeDBYSFF2THlCRmJuTjFjbVVnZEdobElHTnlaV0YwWldRZ2JtOWtaWE1nWVhKbElHOXljR2hoYm1Wa0lDZ2pNVEl6T1RJcFhHNWNkRngwWEhSY2RGeDBkRzF3TG5SbGVIUkRiMjUwWlc1MElEMGdYQ0pjSWp0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseHVYSFJjZEM4dklGSmxiVzkyWlNCM2NtRndjR1Z5SUdaeWIyMGdabkpoWjIxbGJuUmNibHgwWEhSbWNtRm5iV1Z1ZEM1MFpYaDBRMjl1ZEdWdWRDQTlJRndpWENJN1hHNWNibHgwWEhScElEMGdNRHRjYmx4MFhIUjNhR2xzWlNBb0lDaGxiR1Z0SUQwZ2JtOWtaWE5iSUdrckt5QmRLU0FwSUh0Y2JseHVYSFJjZEZ4MEx5OGdJelF3T0RjZ0xTQkpaaUJ2Y21sbmFXNGdZVzVrSUdSbGMzUnBibUYwYVc5dUlHVnNaVzFsYm5SeklHRnlaU0IwYUdVZ2MyRnRaU3dnWVc1a0lIUm9hWE1nYVhOY2JseDBYSFJjZEM4dklIUm9ZWFFnWld4bGJXVnVkQ3dnWkc4Z2JtOTBJR1J2SUdGdWVYUm9hVzVuWEc1Y2RGeDBYSFJwWmlBb0lITmxiR1ZqZEdsdmJpQW1KaUJxVVhWbGNua3VhVzVCY25KaGVTZ2daV3hsYlN3Z2MyVnNaV04wYVc5dUlDa2dJVDA5SUMweElDa2dlMXh1WEhSY2RGeDBYSFJqYjI1MGFXNTFaVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwWTI5dWRHRnBibk1nUFNCcVVYVmxjbmt1WTI5dWRHRnBibk1vSUdWc1pXMHViM2R1WlhKRWIyTjFiV1Z1ZEN3Z1pXeGxiU0FwTzF4dVhHNWNkRngwWEhRdkx5QkJjSEJsYm1RZ2RHOGdabkpoWjIxbGJuUmNibHgwWEhSY2RIUnRjQ0E5SUdkbGRFRnNiQ2dnWm5KaFoyMWxiblF1WVhCd1pXNWtRMmhwYkdRb0lHVnNaVzBnS1N3Z1hDSnpZM0pwY0hSY0lpQXBPMXh1WEc1Y2RGeDBYSFF2THlCUWNtVnpaWEoyWlNCelkzSnBjSFFnWlhaaGJIVmhkR2x2YmlCb2FYTjBiM0o1WEc1Y2RGeDBYSFJwWmlBb0lHTnZiblJoYVc1eklDa2dlMXh1WEhSY2RGeDBYSFJ6WlhSSGJHOWlZV3hGZG1Gc0tDQjBiWEFnS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdRMkZ3ZEhWeVpTQmxlR1ZqZFhSaFlteGxjMXh1WEhSY2RGeDBhV1lnS0NCelkzSnBjSFJ6SUNrZ2UxeHVYSFJjZEZ4MFhIUnFJRDBnTUR0Y2JseDBYSFJjZEZ4MGQyaHBiR1VnS0NBb1pXeGxiU0E5SUhSdGNGc2dhaXNySUYwcElDa2dlMXh1WEhSY2RGeDBYSFJjZEdsbUlDZ2djbk5qY21sd2RGUjVjR1V1ZEdWemRDZ2daV3hsYlM1MGVYQmxJSHg4SUZ3aVhDSWdLU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSE5qY21sd2RITXVjSFZ6YUNnZ1pXeGxiU0FwTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCbWNtRm5iV1Z1ZER0Y2JseDBmU3hjYmx4dVhIUmpiR1ZoYmtSaGRHRTZJR1oxYm1OMGFXOXVLQ0JsYkdWdGN5QXBJSHRjYmx4MFhIUjJZWElnWkdGMFlTd2daV3hsYlN3Z2RIbHdaU3dnYTJWNUxGeHVYSFJjZEZ4MGMzQmxZMmxoYkNBOUlHcFJkV1Z5ZVM1bGRtVnVkQzV6Y0dWamFXRnNMRnh1WEhSY2RGeDBhU0E5SURBN1hHNWNibHgwWEhSbWIzSWdLQ0E3SUNobGJHVnRJRDBnWld4bGJYTmJJR2tnWFNrZ0lUMDlJSFZ1WkdWbWFXNWxaRHNnYVNzcklDa2dlMXh1WEhSY2RGeDBhV1lnS0NCcVVYVmxjbmt1WVdOalpYQjBSR0YwWVNnZ1pXeGxiU0FwSUNrZ2UxeHVYSFJjZEZ4MFhIUnJaWGtnUFNCbGJHVnRXeUJrWVhSaFgzQnlhWFl1Wlhod1lXNWtieUJkTzF4dVhHNWNkRngwWEhSY2RHbG1JQ2dnYTJWNUlDWW1JQ2hrWVhSaElEMGdaR0YwWVY5d2NtbDJMbU5oWTJobFd5QnJaWGtnWFNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwYVdZZ0tDQmtZWFJoTG1WMlpXNTBjeUFwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR1p2Y2lBb0lIUjVjR1VnYVc0Z1pHRjBZUzVsZG1WdWRITWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkR2xtSUNnZ2MzQmxZMmxoYkZzZ2RIbHdaU0JkSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RHcFJkV1Z5ZVM1bGRtVnVkQzV5WlcxdmRtVW9JR1ZzWlcwc0lIUjVjR1VnS1R0Y2JseHVYSFJjZEZ4MFhIUmNkRngwWEhRdkx5QlVhR2x6SUdseklHRWdjMmh2Y25SamRYUWdkRzhnWVhadmFXUWdhbEYxWlhKNUxtVjJaVzUwTG5KbGJXOTJaU2R6SUc5MlpYSm9aV0ZrWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBhbEYxWlhKNUxuSmxiVzkyWlVWMlpXNTBLQ0JsYkdWdExDQjBlWEJsTENCa1lYUmhMbWhoYm1Sc1pTQXBPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEdsbUlDZ2daR0YwWVY5d2NtbDJMbU5oWTJobFd5QnJaWGtnWFNBcElIdGNibHgwWEhSY2RGeDBYSFJjZEM4dklFUnBjMk5oY21RZ1lXNTVJSEpsYldGcGJtbHVaeUJnY0hKcGRtRjBaV0FnWkdGMFlWeHVYSFJjZEZ4MFhIUmNkRngwWkdWc1pYUmxJR1JoZEdGZmNISnBkaTVqWVdOb1pWc2dhMlY1SUYwN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFF2THlCRWFYTmpZWEprSUdGdWVTQnlaVzFoYVc1cGJtY2dZSFZ6WlhKZ0lHUmhkR0ZjYmx4MFhIUmNkR1JsYkdWMFpTQmtZWFJoWDNWelpYSXVZMkZqYUdWYklHVnNaVzFiSUdSaGRHRmZkWE5sY2k1bGVIQmhibVJ2SUYwZ1hUdGNibHgwWEhSOVhHNWNkSDFjYm4wcE8xeHVYRzVxVVhWbGNua3VabTR1WlhoMFpXNWtLSHRjYmx4MGRHVjRkRG9nWm5WdVkzUnBiMjRvSUhaaGJIVmxJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQmhZMk5sYzNNb0lIUm9hWE1zSUdaMWJtTjBhVzl1S0NCMllXeDFaU0FwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUIyWVd4MVpTQTlQVDBnZFc1a1pXWnBibVZrSUQ5Y2JseDBYSFJjZEZ4MGFsRjFaWEo1TG5SbGVIUW9JSFJvYVhNZ0tTQTZYRzVjZEZ4MFhIUmNkSFJvYVhNdVpXMXdkSGtvS1M1bFlXTm9LR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwWEhSY2RHbG1JQ2dnZEdocGN5NXViMlJsVkhsd1pTQTlQVDBnTVNCOGZDQjBhR2x6TG01dlpHVlVlWEJsSUQwOVBTQXhNU0I4ZkNCMGFHbHpMbTV2WkdWVWVYQmxJRDA5UFNBNUlDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGRHaHBjeTUwWlhoMFEyOXVkR1Z1ZENBOUlIWmhiSFZsTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBmU3dnYm5Wc2JDd2dkbUZzZFdVc0lHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ0tUdGNibHgwZlN4Y2JseHVYSFJoY0hCbGJtUTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG1SdmJVMWhibWx3S0NCaGNtZDFiV1Z1ZEhNc0lHWjFibU4wYVc5dUtDQmxiR1Z0SUNrZ2UxeHVYSFJjZEZ4MGFXWWdLQ0IwYUdsekxtNXZaR1ZVZVhCbElEMDlQU0F4SUh4OElIUm9hWE11Ym05a1pWUjVjR1VnUFQwOUlERXhJSHg4SUhSb2FYTXVibTlrWlZSNWNHVWdQVDA5SURrZ0tTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCMFlYSm5aWFFnUFNCdFlXNXBjSFZzWVhScGIyNVVZWEpuWlhRb0lIUm9hWE1zSUdWc1pXMGdLVHRjYmx4MFhIUmNkRngwZEdGeVoyVjBMbUZ3Y0dWdVpFTm9hV3hrS0NCbGJHVnRJQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmU2s3WEc1Y2RIMHNYRzVjYmx4MGNISmxjR1Z1WkRvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVaRzl0VFdGdWFYQW9JR0Z5WjNWdFpXNTBjeXdnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RGeDBYSFJwWmlBb0lIUm9hWE11Ym05a1pWUjVjR1VnUFQwOUlERWdmSHdnZEdocGN5NXViMlJsVkhsd1pTQTlQVDBnTVRFZ2ZId2dkR2hwY3k1dWIyUmxWSGx3WlNBOVBUMGdPU0FwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJSFJoY21kbGRDQTlJRzFoYm1sd2RXeGhkR2x2YmxSaGNtZGxkQ2dnZEdocGN5d2daV3hsYlNBcE8xeHVYSFJjZEZ4MFhIUjBZWEpuWlhRdWFXNXpaWEowUW1WbWIzSmxLQ0JsYkdWdExDQjBZWEpuWlhRdVptbHljM1JEYUdsc1pDQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMHBPMXh1WEhSOUxGeHVYRzVjZEdKbFptOXlaVG9nWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwY21WMGRYSnVJSFJvYVhNdVpHOXRUV0Z1YVhBb0lHRnlaM1Z0Wlc1MGN5d2dablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdYRzVjZEZ4MFhIUnBaaUFvSUhSb2FYTXVjR0Z5Wlc1MFRtOWtaU0FwSUh0Y2JseDBYSFJjZEZ4MGRHaHBjeTV3WVhKbGJuUk9iMlJsTG1sdWMyVnlkRUpsWm05eVpTZ2daV3hsYlN3Z2RHaHBjeUFwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDBwTzF4dVhIUjlMRnh1WEc1Y2RHRm1kR1Z5T2lCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NWtiMjFOWVc1cGNDZ2dZWEpuZFcxbGJuUnpMQ0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHRjYmx4MFhIUmNkR2xtSUNnZ2RHaHBjeTV3WVhKbGJuUk9iMlJsSUNrZ2UxeHVYSFJjZEZ4MFhIUjBhR2x6TG5CaGNtVnVkRTV2WkdVdWFXNXpaWEowUW1WbWIzSmxLQ0JsYkdWdExDQjBhR2x6TG01bGVIUlRhV0pzYVc1bklDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZTazdYRzVjZEgwc1hHNWNibHgwY21WdGIzWmxPaUJtZFc1amRHbHZiaWdnYzJWc1pXTjBiM0lzSUd0bFpYQkVZWFJoSUM4cUlFbHVkR1Z5Ym1Gc0lGVnpaU0JQYm14NUlDb3ZJQ2tnZTF4dVhIUmNkSFpoY2lCbGJHVnRMRnh1WEhSY2RGeDBaV3hsYlhNZ1BTQnpaV3hsWTNSdmNpQS9JR3BSZFdWeWVTNW1hV3gwWlhJb0lITmxiR1ZqZEc5eUxDQjBhR2x6SUNrZ09pQjBhR2x6TEZ4dVhIUmNkRngwYVNBOUlEQTdYRzVjYmx4MFhIUm1iM0lnS0NBN0lDaGxiR1Z0SUQwZ1pXeGxiWE5iYVYwcElDRTlJRzUxYkd3N0lHa3JLeUFwSUh0Y2JseDBYSFJjZEdsbUlDZ2dJV3RsWlhCRVlYUmhJQ1ltSUdWc1pXMHVibTlrWlZSNWNHVWdQVDA5SURFZ0tTQjdYRzVjZEZ4MFhIUmNkR3BSZFdWeWVTNWpiR1ZoYmtSaGRHRW9JR2RsZEVGc2JDZ2daV3hsYlNBcElDazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkR2xtSUNnZ1pXeGxiUzV3WVhKbGJuUk9iMlJsSUNrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvSUd0bFpYQkVZWFJoSUNZbUlHcFJkV1Z5ZVM1amIyNTBZV2x1Y3lnZ1pXeGxiUzV2ZDI1bGNrUnZZM1Z0Wlc1MExDQmxiR1Z0SUNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwYzJWMFIyeHZZbUZzUlhaaGJDZ2daMlYwUVd4c0tDQmxiR1Z0TENCY0luTmpjbWx3ZEZ3aUlDa2dLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSbGJHVnRMbkJoY21WdWRFNXZaR1V1Y21WdGIzWmxRMmhwYkdRb0lHVnNaVzBnS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2JseDBYSFJ5WlhSMWNtNGdkR2hwY3p0Y2JseDBmU3hjYmx4dVhIUmxiWEIwZVRvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MGRtRnlJR1ZzWlcwc1hHNWNkRngwWEhScElEMGdNRHRjYmx4dVhIUmNkR1p2Y2lBb0lEc2dLR1ZzWlcwZ1BTQjBhR2x6VzJsZEtTQWhQU0J1ZFd4c095QnBLeXNnS1NCN1hHNWNkRngwWEhScFppQW9JR1ZzWlcwdWJtOWtaVlI1Y0dVZ1BUMDlJREVnS1NCN1hHNWNibHgwWEhSY2RGeDBMeThnVUhKbGRtVnVkQ0J0WlcxdmNua2diR1ZoYTNOY2JseDBYSFJjZEZ4MGFsRjFaWEo1TG1Oc1pXRnVSR0YwWVNnZ1oyVjBRV3hzS0NCbGJHVnRMQ0JtWVd4elpTQXBJQ2s3WEc1Y2JseDBYSFJjZEZ4MEx5OGdVbVZ0YjNabElHRnVlU0J5WlcxaGFXNXBibWNnYm05a1pYTmNibHgwWEhSY2RGeDBaV3hsYlM1MFpYaDBRMjl1ZEdWdWRDQTlJRndpWENJN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhHNWNkRngwY21WMGRYSnVJSFJvYVhNN1hHNWNkSDBzWEc1Y2JseDBZMnh2Ym1VNklHWjFibU4wYVc5dUtDQmtZWFJoUVc1a1JYWmxiblJ6TENCa1pXVndSR0YwWVVGdVpFVjJaVzUwY3lBcElIdGNibHgwWEhSa1lYUmhRVzVrUlhabGJuUnpJRDBnWkdGMFlVRnVaRVYyWlc1MGN5QTlQU0J1ZFd4c0lEOGdabUZzYzJVZ09pQmtZWFJoUVc1a1JYWmxiblJ6TzF4dVhIUmNkR1JsWlhCRVlYUmhRVzVrUlhabGJuUnpJRDBnWkdWbGNFUmhkR0ZCYm1SRmRtVnVkSE1nUFQwZ2JuVnNiQ0EvSUdSaGRHRkJibVJGZG1WdWRITWdPaUJrWldWd1JHRjBZVUZ1WkVWMlpXNTBjenRjYmx4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG0xaGNDaG1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQnFVWFZsY25rdVkyeHZibVVvSUhSb2FYTXNJR1JoZEdGQmJtUkZkbVZ1ZEhNc0lHUmxaWEJFWVhSaFFXNWtSWFpsYm5SeklDazdYRzVjZEZ4MGZTazdYRzVjZEgwc1hHNWNibHgwYUhSdGJEb2dablZ1WTNScGIyNG9JSFpoYkhWbElDa2dlMXh1WEhSY2RISmxkSFZ5YmlCaFkyTmxjM01vSUhSb2FYTXNJR1oxYm1OMGFXOXVLQ0IyWVd4MVpTQXBJSHRjYmx4MFhIUmNkSFpoY2lCbGJHVnRJRDBnZEdocGMxc2dNQ0JkSUh4OElIdDlMRnh1WEhSY2RGeDBYSFJwSUQwZ01DeGNibHgwWEhSY2RGeDBiQ0E5SUhSb2FYTXViR1Z1WjNSb08xeHVYRzVjZEZ4MFhIUnBaaUFvSUhaaGJIVmxJRDA5UFNCMWJtUmxabWx1WldRZ0ppWWdaV3hsYlM1dWIyUmxWSGx3WlNBOVBUMGdNU0FwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdWc1pXMHVhVzV1WlhKSVZFMU1PMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCVFpXVWdhV1lnZDJVZ1kyRnVJSFJoYTJVZ1lTQnphRzl5ZEdOMWRDQmhibVFnYW5WemRDQjFjMlVnYVc1dVpYSklWRTFNWEc1Y2RGeDBYSFJwWmlBb0lIUjVjR1Z2WmlCMllXeDFaU0E5UFQwZ1hDSnpkSEpwYm1kY0lpQW1KaUFoY201dlNXNXVaWEpvZEcxc0xuUmxjM1FvSUhaaGJIVmxJQ2tnSmlaY2JseDBYSFJjZEZ4MElYZHlZWEJOWVhCYklDZ2djblJoWjA1aGJXVXVaWGhsWXlnZ2RtRnNkV1VnS1NCOGZDQmJJRndpWENJc0lGd2lYQ0lnWFNBcFd5QXhJRjB1ZEc5TWIzZGxja05oYzJVb0tTQmRJQ2tnZTF4dVhHNWNkRngwWEhSY2RIWmhiSFZsSUQwZ2RtRnNkV1V1Y21Wd2JHRmpaU2dnY25ob2RHMXNWR0ZuTENCY0lqd2tNVDQ4THlReVBsd2lJQ2s3WEc1Y2JseDBYSFJjZEZ4MGRISjVJSHRjYmx4MFhIUmNkRngwWEhSbWIzSWdLQ0E3SUdrZ1BDQnNPeUJwS3lzZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSbGJHVnRJRDBnZEdocGMxc2dhU0JkSUh4OElIdDlPMXh1WEc1Y2RGeDBYSFJjZEZ4MFhIUXZMeUJTWlcxdmRtVWdaV3hsYldWdWRDQnViMlJsY3lCaGJtUWdjSEpsZG1WdWRDQnRaVzF2Y25rZ2JHVmhhM05jYmx4MFhIUmNkRngwWEhSY2RHbG1JQ2dnWld4bGJTNXViMlJsVkhsd1pTQTlQVDBnTVNBcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGFsRjFaWEo1TG1Oc1pXRnVSR0YwWVNnZ1oyVjBRV3hzS0NCbGJHVnRMQ0JtWVd4elpTQXBJQ2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkR1ZzWlcwdWFXNXVaWEpJVkUxTUlEMGdkbUZzZFdVN1hHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkRngwWld4bGJTQTlJREE3WEc1Y2JseDBYSFJjZEZ4MEx5OGdTV1lnZFhOcGJtY2dhVzV1WlhKSVZFMU1JSFJvY205M2N5QmhiaUJsZUdObGNIUnBiMjRzSUhWelpTQjBhR1VnWm1Gc2JHSmhZMnNnYldWMGFHOWtYRzVjZEZ4MFhIUmNkSDBnWTJGMFkyZ29JR1VnS1NCN2ZWeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnBaaUFvSUdWc1pXMGdLU0I3WEc1Y2RGeDBYSFJjZEhSb2FYTXVaVzF3ZEhrb0tTNWhjSEJsYm1Rb0lIWmhiSFZsSUNrN1hHNWNkRngwWEhSOVhHNWNkRngwZlN3Z2JuVnNiQ3dnZG1Gc2RXVXNJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dLVHRjYmx4MGZTeGNibHh1WEhSeVpYQnNZV05sVjJsMGFEb2dablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBkbUZ5SUdGeVp5QTlJR0Z5WjNWdFpXNTBjMXNnTUNCZE8xeHVYRzVjZEZ4MEx5OGdUV0ZyWlNCMGFHVWdZMmhoYm1kbGN5d2djbVZ3YkdGamFXNW5JR1ZoWTJnZ1kyOXVkR1Y0ZENCbGJHVnRaVzUwSUhkcGRHZ2dkR2hsSUc1bGR5QmpiMjUwWlc1MFhHNWNkRngwZEdocGN5NWtiMjFOWVc1cGNDZ2dZWEpuZFcxbGJuUnpMQ0JtZFc1amRHbHZiaWdnWld4bGJTQXBJSHRjYmx4MFhIUmNkR0Z5WnlBOUlIUm9hWE11Y0dGeVpXNTBUbTlrWlR0Y2JseHVYSFJjZEZ4MGFsRjFaWEo1TG1Oc1pXRnVSR0YwWVNnZ1oyVjBRV3hzS0NCMGFHbHpJQ2tnS1R0Y2JseHVYSFJjZEZ4MGFXWWdLQ0JoY21jZ0tTQjdYRzVjZEZ4MFhIUmNkR0Z5Wnk1eVpYQnNZV05sUTJocGJHUW9JR1ZzWlcwc0lIUm9hWE1nS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5S1R0Y2JseHVYSFJjZEM4dklFWnZjbU5sSUhKbGJXOTJZV3dnYVdZZ2RHaGxjbVVnZDJGeklHNXZJRzVsZHlCamIyNTBaVzUwSUNobExtY3VMQ0JtY205dElHVnRjSFI1SUdGeVozVnRaVzUwY3lsY2JseDBYSFJ5WlhSMWNtNGdZWEpuSUNZbUlDaGhjbWN1YkdWdVozUm9JSHg4SUdGeVp5NXViMlJsVkhsd1pTa2dQeUIwYUdseklEb2dkR2hwY3k1eVpXMXZkbVVvS1R0Y2JseDBmU3hjYmx4dVhIUmtaWFJoWTJnNklHWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNpQXBJSHRjYmx4MFhIUnlaWFIxY200Z2RHaHBjeTV5WlcxdmRtVW9JSE5sYkdWamRHOXlMQ0IwY25WbElDazdYRzVjZEgwc1hHNWNibHgwWkc5dFRXRnVhWEE2SUdaMWJtTjBhVzl1S0NCaGNtZHpMQ0JqWVd4c1ltRmpheUFwSUh0Y2JseHVYSFJjZEM4dklFWnNZWFIwWlc0Z1lXNTVJRzVsYzNSbFpDQmhjbkpoZVhOY2JseDBYSFJoY21keklEMGdZMjl1WTJGMExtRndjR3g1S0NCYlhTd2dZWEpuY3lBcE8xeHVYRzVjZEZ4MGRtRnlJR1p5WVdkdFpXNTBMQ0JtYVhKemRDd2djMk55YVhCMGN5d2dhR0Z6VTJOeWFYQjBjeXdnYm05a1pTd2daRzlqTEZ4dVhIUmNkRngwYVNBOUlEQXNYRzVjZEZ4MFhIUnNJRDBnZEdocGN5NXNaVzVuZEdnc1hHNWNkRngwWEhSelpYUWdQU0IwYUdsekxGeHVYSFJjZEZ4MGFVNXZRMnh2Ym1VZ1BTQnNJQzBnTVN4Y2JseDBYSFJjZEhaaGJIVmxJRDBnWVhKbmMxc2dNQ0JkTEZ4dVhIUmNkRngwYVhOR2RXNWpkR2x2YmlBOUlHcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQjJZV3gxWlNBcE8xeHVYRzVjZEZ4MEx5OGdWMlVnWTJGdUozUWdZMnh2Ym1WT2IyUmxJR1p5WVdkdFpXNTBjeUIwYUdGMElHTnZiblJoYVc0Z1kyaGxZMnRsWkN3Z2FXNGdWMlZpUzJsMFhHNWNkRngwYVdZZ0tDQnBjMFoxYm1OMGFXOXVJSHg4WEc1Y2RGeDBYSFJjZENnZ2JDQStJREVnSmlZZ2RIbHdaVzltSUhaaGJIVmxJRDA5UFNCY0luTjBjbWx1WjF3aUlDWW1YRzVjZEZ4MFhIUmNkRngwSVhOMWNIQnZjblF1WTJobFkydERiRzl1WlNBbUppQnlZMmhsWTJ0bFpDNTBaWE4wS0NCMllXeDFaU0FwSUNrZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2RHaHBjeTVsWVdOb0tHWjFibU4wYVc5dUtDQnBibVJsZUNBcElIdGNibHgwWEhSY2RGeDBkbUZ5SUhObGJHWWdQU0J6WlhRdVpYRW9JR2x1WkdWNElDazdYRzVjZEZ4MFhIUmNkR2xtSUNnZ2FYTkdkVzVqZEdsdmJpQXBJSHRjYmx4MFhIUmNkRngwWEhSaGNtZHpXeUF3SUYwZ1BTQjJZV3gxWlM1allXeHNLQ0IwYUdsekxDQnBibVJsZUN3Z2MyVnNaaTVvZEcxc0tDa2dLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSelpXeG1MbVJ2YlUxaGJtbHdLQ0JoY21kekxDQmpZV3hzWW1GamF5QXBPMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBhV1lnS0NCc0lDa2dlMXh1WEhSY2RGeDBabkpoWjIxbGJuUWdQU0JxVVhWbGNua3VZblZwYkdSR2NtRm5iV1Z1ZENnZ1lYSm5jeXdnZEdocGMxc2dNQ0JkTG05M2JtVnlSRzlqZFcxbGJuUXNJR1poYkhObExDQjBhR2x6SUNrN1hHNWNkRngwWEhSbWFYSnpkQ0E5SUdaeVlXZHRaVzUwTG1acGNuTjBRMmhwYkdRN1hHNWNibHgwWEhSY2RHbG1JQ2dnWm5KaFoyMWxiblF1WTJocGJHUk9iMlJsY3k1c1pXNW5kR2dnUFQwOUlERWdLU0I3WEc1Y2RGeDBYSFJjZEdaeVlXZHRaVzUwSUQwZ1ptbHljM1E3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEdsbUlDZ2dabWx5YzNRZ0tTQjdYRzVjZEZ4MFhIUmNkSE5qY21sd2RITWdQU0JxVVhWbGNua3ViV0Z3S0NCblpYUkJiR3dvSUdaeVlXZHRaVzUwTENCY0luTmpjbWx3ZEZ3aUlDa3NJR1JwYzJGaWJHVlRZM0pwY0hRZ0tUdGNibHgwWEhSY2RGeDBhR0Z6VTJOeWFYQjBjeUE5SUhOamNtbHdkSE11YkdWdVozUm9PMXh1WEc1Y2RGeDBYSFJjZEM4dklGVnpaU0IwYUdVZ2IzSnBaMmx1WVd3Z1puSmhaMjFsYm5RZ1ptOXlJSFJvWlNCc1lYTjBJR2wwWlcwZ2FXNXpkR1ZoWkNCdlppQjBhR1VnWm1seWMzUWdZbVZqWVhWelpTQnBkQ0JqWVc0Z1pXNWtJSFZ3WEc1Y2RGeDBYSFJjZEM4dklHSmxhVzVuSUdWdGNIUnBaV1FnYVc1amIzSnlaV04wYkhrZ2FXNGdZMlZ5ZEdGcGJpQnphWFIxWVhScGIyNXpJQ2dqT0RBM01Da3VYRzVjZEZ4MFhIUmNkR1p2Y2lBb0lEc2dhU0E4SUd3N0lHa3JLeUFwSUh0Y2JseDBYSFJjZEZ4MFhIUnViMlJsSUQwZ1puSmhaMjFsYm5RN1hHNWNibHgwWEhSY2RGeDBYSFJwWmlBb0lHa2dJVDA5SUdsT2IwTnNiMjVsSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYm05a1pTQTlJR3BSZFdWeWVTNWpiRzl1WlNnZ2JtOWtaU3dnZEhKMVpTd2dkSEoxWlNBcE8xeHVYRzVjZEZ4MFhIUmNkRngwWEhRdkx5QkxaV1Z3SUhKbFptVnlaVzVqWlhNZ2RHOGdZMnh2Ym1Wa0lITmpjbWx3ZEhNZ1ptOXlJR3hoZEdWeUlISmxjM1J2Y21GMGFXOXVYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9JR2hoYzFOamNtbHdkSE1nS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEM4dklGTjFjSEJ2Y25RNklGRjBWMlZpUzJsMFhHNWNkRngwWEhSY2RGeDBYSFJjZEM4dklHcFJkV1Z5ZVM1dFpYSm5aU0JpWldOaGRYTmxJSEIxYzJndVlYQndiSGtvWHl3Z1lYSnlZWGxzYVd0bEtTQjBhSEp2ZDNOY2JseDBYSFJjZEZ4MFhIUmNkRngwYWxGMVpYSjVMbTFsY21kbEtDQnpZM0pwY0hSekxDQm5aWFJCYkd3b0lHNXZaR1VzSUZ3aWMyTnlhWEIwWENJZ0tTQXBPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSY2RHTmhiR3hpWVdOckxtTmhiR3dvSUhSb2FYTmJJR2tnWFN3Z2JtOWtaU3dnYVNBcE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwYVdZZ0tDQm9ZWE5UWTNKcGNIUnpJQ2tnZTF4dVhIUmNkRngwWEhSY2RHUnZZeUE5SUhOamNtbHdkSE5iSUhOamNtbHdkSE11YkdWdVozUm9JQzBnTVNCZExtOTNibVZ5Ukc5amRXMWxiblE3WEc1Y2JseDBYSFJjZEZ4MFhIUXZMeUJTWldWdVlXSnNaU0J6WTNKcGNIUnpYRzVjZEZ4MFhIUmNkRngwYWxGMVpYSjVMbTFoY0NnZ2MyTnlhWEIwY3l3Z2NtVnpkRzl5WlZOamNtbHdkQ0FwTzF4dVhHNWNkRngwWEhSY2RGeDBMeThnUlhaaGJIVmhkR1VnWlhobFkzVjBZV0pzWlNCelkzSnBjSFJ6SUc5dUlHWnBjbk4wSUdSdlkzVnRaVzUwSUdsdWMyVnlkR2x2Ymx4dVhIUmNkRngwWEhSY2RHWnZjaUFvSUdrZ1BTQXdPeUJwSUR3Z2FHRnpVMk55YVhCMGN6c2dhU3NySUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYm05a1pTQTlJSE5qY21sd2RITmJJR2tnWFR0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNnZ2NuTmpjbWx3ZEZSNWNHVXVkR1Z6ZENnZ2JtOWtaUzUwZVhCbElIeDhJRndpWENJZ0tTQW1KbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUWhaR0YwWVY5d2NtbDJMbUZqWTJWemN5Z2dibTlrWlN3Z1hDSm5iRzlpWVd4RmRtRnNYQ0lnS1NBbUppQnFVWFZsY25rdVkyOXVkR0ZwYm5Nb0lHUnZZeXdnYm05a1pTQXBJQ2tnZTF4dVhHNWNkRngwWEhSY2RGeDBYSFJjZEdsbUlDZ2dibTlrWlM1emNtTWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwTHk4Z1QzQjBhVzl1WVd3Z1FVcEJXQ0JrWlhCbGJtUmxibU41TENCaWRYUWdkMjl1SjNRZ2NuVnVJSE5qY21sd2RITWdhV1lnYm05MElIQnlaWE5sYm5SY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhScFppQW9JR3BSZFdWeWVTNWZaWFpoYkZWeWJDQXBJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdwUmRXVnllUzVmWlhaaGJGVnliQ2dnYm05a1pTNXpjbU1nS1R0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwYWxGMVpYSjVMbWRzYjJKaGJFVjJZV3dvSUc1dlpHVXVkR1Y0ZEVOdmJuUmxiblF1Y21Wd2JHRmpaU2dnY21Oc1pXRnVVMk55YVhCMExDQmNJbHdpSUNrZ0tUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpPMXh1WEhSOVhHNTlLVHRjYmx4dWFsRjFaWEo1TG1WaFkyZ29lMXh1WEhSaGNIQmxibVJVYnpvZ1hDSmhjSEJsYm1SY0lpeGNibHgwY0hKbGNHVnVaRlJ2T2lCY0luQnlaWEJsYm1SY0lpeGNibHgwYVc1elpYSjBRbVZtYjNKbE9pQmNJbUpsWm05eVpWd2lMRnh1WEhScGJuTmxjblJCWm5SbGNqb2dYQ0poWm5SbGNsd2lMRnh1WEhSeVpYQnNZV05sUVd4c09pQmNJbkpsY0d4aFkyVlhhWFJvWENKY2JuMHNJR1oxYm1OMGFXOXVLQ0J1WVcxbExDQnZjbWxuYVc1aGJDQXBJSHRjYmx4MGFsRjFaWEo1TG1adVd5QnVZVzFsSUYwZ1BTQm1kVzVqZEdsdmJpZ2djMlZzWldOMGIzSWdLU0I3WEc1Y2RGeDBkbUZ5SUdWc1pXMXpMRnh1WEhSY2RGeDBjbVYwSUQwZ1cxMHNYRzVjZEZ4MFhIUnBibk5sY25RZ1BTQnFVWFZsY25rb0lITmxiR1ZqZEc5eUlDa3NYRzVjZEZ4MFhIUnNZWE4wSUQwZ2FXNXpaWEowTG14bGJtZDBhQ0F0SURFc1hHNWNkRngwWEhScElEMGdNRHRjYmx4dVhIUmNkR1p2Y2lBb0lEc2dhU0E4UFNCc1lYTjBPeUJwS3lzZ0tTQjdYRzVjZEZ4MFhIUmxiR1Z0Y3lBOUlHa2dQVDA5SUd4aGMzUWdQeUIwYUdseklEb2dkR2hwY3k1amJHOXVaU2dnZEhKMVpTQXBPMXh1WEhSY2RGeDBhbEYxWlhKNUtDQnBibk5sY25SYklHa2dYU0FwV3lCdmNtbG5hVzVoYkNCZEtDQmxiR1Z0Y3lBcE8xeHVYRzVjZEZ4MFhIUXZMeUJUZFhCd2IzSjBPaUJSZEZkbFlrdHBkRnh1WEhSY2RGeDBMeThnTG1kbGRDZ3BJR0psWTJGMWMyVWdjSFZ6YUM1aGNIQnNlU2hmTENCaGNuSmhlV3hwYTJVcElIUm9jbTkzYzF4dVhIUmNkRngwY0hWemFDNWhjSEJzZVNnZ2NtVjBMQ0JsYkdWdGN5NW5aWFFvS1NBcE8xeHVYSFJjZEgxY2JseHVYSFJjZEhKbGRIVnliaUIwYUdsekxuQjFjMmhUZEdGamF5Z2djbVYwSUNrN1hHNWNkSDA3WEc1OUtUdGNibHh1WEc1MllYSWdhV1p5WVcxbExGeHVYSFJsYkdWdFpHbHpjR3hoZVNBOUlIdDlPMXh1WEc0dktpcGNiaUFxSUZKbGRISnBaWFpsSUhSb1pTQmhZM1IxWVd3Z1pHbHpjR3hoZVNCdlppQmhJR1ZzWlcxbGJuUmNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J1WVcxbElHNXZaR1ZPWVcxbElHOW1JSFJvWlNCbGJHVnRaVzUwWEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ1pHOWpJRVJ2WTNWdFpXNTBJRzlpYW1WamRGeHVJQ292WEc0dkx5QkRZV3hzWldRZ2IyNXNlU0JtY205dElIZHBkR2hwYmlCa1pXWmhkV3gwUkdsemNHeGhlVnh1Wm5WdVkzUnBiMjRnWVdOMGRXRnNSR2x6Y0d4aGVTZ2dibUZ0WlN3Z1pHOWpJQ2tnZTF4dVhIUjJZWElnYzNSNWJHVXNYRzVjZEZ4MFpXeGxiU0E5SUdwUmRXVnllU2dnWkc5akxtTnlaV0YwWlVWc1pXMWxiblFvSUc1aGJXVWdLU0FwTG1Gd2NHVnVaRlJ2S0NCa2IyTXVZbTlrZVNBcExGeHVYRzVjZEZ4MEx5OGdaMlYwUkdWbVlYVnNkRU52YlhCMWRHVmtVM1I1YkdVZ2JXbG5hSFFnWW1VZ2NtVnNhV0ZpYkhrZ2RYTmxaQ0J2Ym14NUlHOXVJR0YwZEdGamFHVmtJR1ZzWlcxbGJuUmNibHgwWEhSa2FYTndiR0Y1SUQwZ2QybHVaRzkzTG1kbGRFUmxabUYxYkhSRGIyMXdkWFJsWkZOMGVXeGxJQ1ltSUNnZ2MzUjViR1VnUFNCM2FXNWtiM2N1WjJWMFJHVm1ZWFZzZEVOdmJYQjFkR1ZrVTNSNWJHVW9JR1ZzWlcxYklEQWdYU0FwSUNrZ1AxeHVYRzVjZEZ4MFhIUXZMeUJWYzJVZ2IyWWdkR2hwY3lCdFpYUm9iMlFnYVhNZ1lTQjBaVzF3YjNKaGNua2dabWw0SUNodGIzSmxJR3hwYTJVZ2IzQjBhVzFwZW1GMGFXOXVLU0IxYm5ScGJDQnpiMjFsZEdocGJtY2dZbVYwZEdWeUlHTnZiV1Z6SUdGc2IyNW5MRnh1WEhSY2RGeDBMeThnYzJsdVkyVWdhWFFnZDJGeklISmxiVzkyWldRZ1puSnZiU0J6Y0dWamFXWnBZMkYwYVc5dUlHRnVaQ0J6ZFhCd2IzSjBaV1FnYjI1c2VTQnBiaUJHUmx4dVhIUmNkRngwYzNSNWJHVXVaR2x6Y0d4aGVTQTZJR3BSZFdWeWVTNWpjM01vSUdWc1pXMWJJREFnWFN3Z1hDSmthWE53YkdGNVhDSWdLVHRjYmx4dVhIUXZMeUJYWlNCa2IyNG5kQ0JvWVhabElHRnVlU0JrWVhSaElITjBiM0psWkNCdmJpQjBhR1VnWld4bGJXVnVkQ3hjYmx4MEx5OGdjMjhnZFhObElGd2laR1YwWVdOb1hDSWdiV1YwYUc5a0lHRnpJR1poYzNRZ2QyRjVJSFJ2SUdkbGRDQnlhV1FnYjJZZ2RHaGxJR1ZzWlcxbGJuUmNibHgwWld4bGJTNWtaWFJoWTJnb0tUdGNibHh1WEhSeVpYUjFjbTRnWkdsemNHeGhlVHRjYm4xY2JseHVMeW9xWEc0Z0tpQlVjbmtnZEc4Z1pHVjBaWEp0YVc1bElIUm9aU0JrWldaaGRXeDBJR1JwYzNCc1lYa2dkbUZzZFdVZ2IyWWdZVzRnWld4bGJXVnVkRnh1SUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUc1dlpHVk9ZVzFsWEc0Z0tpOWNibVoxYm1OMGFXOXVJR1JsWm1GMWJIUkVhWE53YkdGNUtDQnViMlJsVG1GdFpTQXBJSHRjYmx4MGRtRnlJR1J2WXlBOUlHUnZZM1Z0Wlc1MExGeHVYSFJjZEdScGMzQnNZWGtnUFNCbGJHVnRaR2x6Y0d4aGVWc2dibTlrWlU1aGJXVWdYVHRjYmx4dVhIUnBaaUFvSUNGa2FYTndiR0Y1SUNrZ2UxeHVYSFJjZEdScGMzQnNZWGtnUFNCaFkzUjFZV3hFYVhOd2JHRjVLQ0J1YjJSbFRtRnRaU3dnWkc5aklDazdYRzVjYmx4MFhIUXZMeUJKWmlCMGFHVWdjMmx0Y0d4bElIZGhlU0JtWVdsc2N5d2djbVZoWkNCbWNtOXRJR2x1YzJsa1pTQmhiaUJwWm5KaGJXVmNibHgwWEhScFppQW9JR1JwYzNCc1lYa2dQVDA5SUZ3aWJtOXVaVndpSUh4OElDRmthWE53YkdGNUlDa2dlMXh1WEc1Y2RGeDBYSFF2THlCVmMyVWdkR2hsSUdGc2NtVmhaSGt0WTNKbFlYUmxaQ0JwWm5KaGJXVWdhV1lnY0c5emMybGliR1ZjYmx4MFhIUmNkR2xtY21GdFpTQTlJQ2hwWm5KaGJXVWdmSHdnYWxGMVpYSjVLQ0JjSWp4cFpuSmhiV1VnWm5KaGJXVmliM0prWlhJOUp6QW5JSGRwWkhSb1BTY3dKeUJvWldsbmFIUTlKekFuTHo1Y0lpQXBLUzVoY0hCbGJtUlVieWdnWkc5akxtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZENBcE8xeHVYRzVjZEZ4MFhIUXZMeUJCYkhkaGVYTWdkM0pwZEdVZ1lTQnVaWGNnU0ZSTlRDQnphMlZzWlhSdmJpQnpieUJYWldKcmFYUWdZVzVrSUVacGNtVm1iM2dnWkc5dUozUWdZMmh2YTJVZ2IyNGdjbVYxYzJWY2JseDBYSFJjZEdSdll5QTlJR2xtY21GdFpWc2dNQ0JkTG1OdmJuUmxiblJFYjJOMWJXVnVkRHRjYmx4dVhIUmNkRngwTHk4Z1UzVndjRzl5ZERvZ1NVVmNibHgwWEhSY2RHUnZZeTUzY21sMFpTZ3BPMXh1WEhSY2RGeDBaRzlqTG1Oc2IzTmxLQ2s3WEc1Y2JseDBYSFJjZEdScGMzQnNZWGtnUFNCaFkzUjFZV3hFYVhOd2JHRjVLQ0J1YjJSbFRtRnRaU3dnWkc5aklDazdYRzVjZEZ4MFhIUnBabkpoYldVdVpHVjBZV05vS0NrN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1UzUnZjbVVnZEdobElHTnZjbkpsWTNRZ1pHVm1ZWFZzZENCa2FYTndiR0Y1WEc1Y2RGeDBaV3hsYldScGMzQnNZWGxiSUc1dlpHVk9ZVzFsSUYwZ1BTQmthWE53YkdGNU8xeHVYSFI5WEc1Y2JseDBjbVYwZFhKdUlHUnBjM0JzWVhrN1hHNTlYRzUyWVhJZ2NtMWhjbWRwYmlBOUlDZ3ZYbTFoY21kcGJpOHBPMXh1WEc1MllYSWdjbTUxYlc1dmJuQjRJRDBnYm1WM0lGSmxaMFY0Y0NnZ1hDSmVLRndpSUNzZ2NHNTFiU0FySUZ3aUtTZy9JWEI0S1Z0aExYb2xYU3NrWENJc0lGd2lhVndpSUNrN1hHNWNiblpoY2lCblpYUlRkSGxzWlhNZ1BTQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhRdkx5QlRkWEJ3YjNKME9pQkpSVHc5TVRFckxDQkdhWEpsWm05NFBEMHpNQ3NnS0NNeE5UQTVPQ3dnSXpFME1UVXdLVnh1WEhSY2RDOHZJRWxGSUhSb2NtOTNjeUJ2YmlCbGJHVnRaVzUwY3lCamNtVmhkR1ZrSUdsdUlIQnZjSFZ3YzF4dVhIUmNkQzh2SUVaR0lHMWxZVzUzYUdsc1pTQjBhSEp2ZDNNZ2IyNGdabkpoYldVZ1pXeGxiV1Z1ZEhNZ2RHaHliM1ZuYUNCY0ltUmxabUYxYkhSV2FXVjNMbWRsZEVOdmJYQjFkR1ZrVTNSNWJHVmNJbHh1WEhSY2RHbG1JQ2dnWld4bGJTNXZkMjVsY2tSdlkzVnRaVzUwTG1SbFptRjFiSFJXYVdWM0xtOXdaVzVsY2lBcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCbGJHVnRMbTkzYm1WeVJHOWpkVzFsYm5RdVpHVm1ZWFZzZEZacFpYY3VaMlYwUTI5dGNIVjBaV1JUZEhsc1pTZ2daV3hsYlN3Z2JuVnNiQ0FwTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQjNhVzVrYjNjdVoyVjBRMjl0Y0hWMFpXUlRkSGxzWlNnZ1pXeGxiU3dnYm5Wc2JDQXBPMXh1WEhSOU8xeHVYRzVjYmx4dVpuVnVZM1JwYjI0Z1kzVnlRMU5US0NCbGJHVnRMQ0J1WVcxbExDQmpiMjF3ZFhSbFpDQXBJSHRjYmx4MGRtRnlJSGRwWkhSb0xDQnRhVzVYYVdSMGFDd2diV0Y0VjJsa2RHZ3NJSEpsZEN4Y2JseDBYSFJ6ZEhsc1pTQTlJR1ZzWlcwdWMzUjViR1U3WEc1Y2JseDBZMjl0Y0hWMFpXUWdQU0JqYjIxd2RYUmxaQ0I4ZkNCblpYUlRkSGxzWlhNb0lHVnNaVzBnS1R0Y2JseHVYSFF2THlCVGRYQndiM0owT2lCSlJUbGNibHgwTHk4Z1oyVjBVSEp2Y0dWeWRIbFdZV3gxWlNCcGN5QnZibXg1SUc1bFpXUmxaQ0JtYjNJZ0xtTnpjeWduWm1sc2RHVnlKeWtnS0NNeE1qVXpOeWxjYmx4MGFXWWdLQ0JqYjIxd2RYUmxaQ0FwSUh0Y2JseDBYSFJ5WlhRZ1BTQmpiMjF3ZFhSbFpDNW5aWFJRY205d1pYSjBlVlpoYkhWbEtDQnVZVzFsSUNrZ2ZId2dZMjl0Y0hWMFpXUmJJRzVoYldVZ1hUdGNibHgwZlZ4dVhHNWNkR2xtSUNnZ1kyOXRjSFYwWldRZ0tTQjdYRzVjYmx4MFhIUnBaaUFvSUhKbGRDQTlQVDBnWENKY0lpQW1KaUFoYWxGMVpYSjVMbU52Ym5SaGFXNXpLQ0JsYkdWdExtOTNibVZ5Ukc5amRXMWxiblFzSUdWc1pXMGdLU0FwSUh0Y2JseDBYSFJjZEhKbGRDQTlJR3BSZFdWeWVTNXpkSGxzWlNnZ1pXeGxiU3dnYm1GdFpTQXBPMXh1WEhSY2RIMWNibHh1WEhSY2RDOHZJRk4xY0hCdmNuUTZJR2xQVXlBOElEWmNibHgwWEhRdkx5QkJJSFJ5YVdKMWRHVWdkRzhnZEdobElGd2lZWGRsYzI5dFpTQm9ZV05ySUdKNUlFUmxZVzRnUldSM1lYSmtjMXdpWEc1Y2RGeDBMeThnYVU5VElEd2dOaUFvWVhRZ2JHVmhjM1FwSUhKbGRIVnlibk1nY0dWeVkyVnVkR0ZuWlNCbWIzSWdZU0JzWVhKblpYSWdjMlYwSUc5bUlIWmhiSFZsY3l3Z1luVjBJSGRwWkhSb0lITmxaVzF6SUhSdklHSmxJSEpsYkdsaFlteDVJSEJwZUdWc2MxeHVYSFJjZEM4dklIUm9hWE1nYVhNZ1lXZGhhVzV6ZENCMGFHVWdRMU5UVDAwZ1pISmhablFnYzNCbFl6b2dhSFIwY0RvdkwyUmxkaTUzTXk1dmNtY3ZZM056ZDJjdlkzTnpiMjB2STNKbGMyOXNkbVZrTFhaaGJIVmxjMXh1WEhSY2RHbG1JQ2dnY201MWJXNXZibkI0TG5SbGMzUW9JSEpsZENBcElDWW1JSEp0WVhKbmFXNHVkR1Z6ZENnZ2JtRnRaU0FwSUNrZ2UxeHVYRzVjZEZ4MFhIUXZMeUJTWlcxbGJXSmxjaUIwYUdVZ2IzSnBaMmx1WVd3Z2RtRnNkV1Z6WEc1Y2RGeDBYSFIzYVdSMGFDQTlJSE4wZVd4bExuZHBaSFJvTzF4dVhIUmNkRngwYldsdVYybGtkR2dnUFNCemRIbHNaUzV0YVc1WGFXUjBhRHRjYmx4MFhIUmNkRzFoZUZkcFpIUm9JRDBnYzNSNWJHVXViV0Y0VjJsa2RHZzdYRzVjYmx4MFhIUmNkQzh2SUZCMWRDQnBiaUIwYUdVZ2JtVjNJSFpoYkhWbGN5QjBieUJuWlhRZ1lTQmpiMjF3ZFhSbFpDQjJZV3gxWlNCdmRYUmNibHgwWEhSY2RITjBlV3hsTG0xcGJsZHBaSFJvSUQwZ2MzUjViR1V1YldGNFYybGtkR2dnUFNCemRIbHNaUzUzYVdSMGFDQTlJSEpsZER0Y2JseDBYSFJjZEhKbGRDQTlJR052YlhCMWRHVmtMbmRwWkhSb08xeHVYRzVjZEZ4MFhIUXZMeUJTWlhabGNuUWdkR2hsSUdOb1lXNW5aV1FnZG1Gc2RXVnpYRzVjZEZ4MFhIUnpkSGxzWlM1M2FXUjBhQ0E5SUhkcFpIUm9PMXh1WEhSY2RGeDBjM1I1YkdVdWJXbHVWMmxrZEdnZ1BTQnRhVzVYYVdSMGFEdGNibHgwWEhSY2RITjBlV3hsTG0xaGVGZHBaSFJvSUQwZ2JXRjRWMmxrZEdnN1hHNWNkRngwZlZ4dVhIUjlYRzVjYmx4MGNtVjBkWEp1SUhKbGRDQWhQVDBnZFc1a1pXWnBibVZrSUQ5Y2JseDBYSFF2THlCVGRYQndiM0owT2lCSlJWeHVYSFJjZEM4dklFbEZJSEpsZEhWeWJuTWdla2x1WkdWNElIWmhiSFZsSUdGeklHRnVJR2x1ZEdWblpYSXVYRzVjZEZ4MGNtVjBJQ3NnWENKY0lpQTZYRzVjZEZ4MGNtVjBPMXh1ZlZ4dVhHNWNibVoxYm1OMGFXOXVJR0ZrWkVkbGRFaHZiMnRKWmlnZ1kyOXVaR2wwYVc5dVJtNHNJR2h2YjJ0R2JpQXBJSHRjYmx4MEx5OGdSR1ZtYVc1bElIUm9aU0JvYjI5ckxDQjNaU2RzYkNCamFHVmpheUJ2YmlCMGFHVWdabWx5YzNRZ2NuVnVJR2xtSUdsMEozTWdjbVZoYkd4NUlHNWxaV1JsWkM1Y2JseDBjbVYwZFhKdUlIdGNibHgwWEhSblpYUTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwYVdZZ0tDQmpiMjVrYVhScGIyNUdiaWdwSUNrZ2UxeHVYSFJjZEZ4MFhIUXZMeUJJYjI5cklHNXZkQ0J1WldWa1pXUWdLRzl5SUdsMEozTWdibTkwSUhCdmMzTnBZbXhsSUhSdklIVnpaU0JwZENCa2RXVmNibHgwWEhSY2RGeDBMeThnZEc4Z2JXbHpjMmx1WnlCa1pYQmxibVJsYm1ONUtTd2djbVZ0YjNabElHbDBMbHh1WEhSY2RGeDBYSFJrWld4bGRHVWdkR2hwY3k1blpYUTdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnU0c5dmF5QnVaV1ZrWldRN0lISmxaR1ZtYVc1bElHbDBJSE52SUhSb1lYUWdkR2hsSUhOMWNIQnZjblFnZEdWemRDQnBjeUJ1YjNRZ1pYaGxZM1YwWldRZ1lXZGhhVzR1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdLSFJvYVhNdVoyVjBJRDBnYUc5dmEwWnVLUzVoY0hCc2VTZ2dkR2hwY3l3Z1lYSm5kVzFsYm5SeklDazdYRzVjZEZ4MGZWeHVYSFI5TzF4dWZWeHVYRzVjYmlobWRXNWpkR2x2YmlncElIdGNibHgwZG1GeUlIQnBlR1ZzVUc5emFYUnBiMjVXWVd3c0lHSnZlRk5wZW1sdVoxSmxiR2xoWW14bFZtRnNMRnh1WEhSY2RHUnZZMFZzWlcwZ1BTQmtiMk4xYldWdWRDNWtiMk4xYldWdWRFVnNaVzFsYm5Rc1hHNWNkRngwWTI5dWRHRnBibVZ5SUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2dnWENKa2FYWmNJaUFwTEZ4dVhIUmNkR1JwZGlBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblFvSUZ3aVpHbDJYQ0lnS1R0Y2JseHVYSFJwWmlBb0lDRmthWFl1YzNSNWJHVWdLU0I3WEc1Y2RGeDBjbVYwZFhKdU8xeHVYSFI5WEc1Y2JseDBMeThnVTNWd2NHOXlkRG9nU1VVNUxURXhLMXh1WEhRdkx5QlRkSGxzWlNCdlppQmpiRzl1WldRZ1pXeGxiV1Z1ZENCaFptWmxZM1J6SUhOdmRYSmpaU0JsYkdWdFpXNTBJR05zYjI1bFpDQW9Jemc1TURncFhHNWNkR1JwZGk1emRIbHNaUzVpWVdOclozSnZkVzVrUTJ4cGNDQTlJRndpWTI5dWRHVnVkQzFpYjNoY0lqdGNibHgwWkdsMkxtTnNiMjVsVG05a1pTZ2dkSEoxWlNBcExuTjBlV3hsTG1KaFkydG5jbTkxYm1SRGJHbHdJRDBnWENKY0lqdGNibHgwYzNWd2NHOXlkQzVqYkdWaGNrTnNiMjVsVTNSNWJHVWdQU0JrYVhZdWMzUjViR1V1WW1GamEyZHliM1Z1WkVOc2FYQWdQVDA5SUZ3aVkyOXVkR1Z1ZEMxaWIzaGNJanRjYmx4dVhIUmpiMjUwWVdsdVpYSXVjM1I1YkdVdVkzTnpWR1Y0ZENBOUlGd2lZbTl5WkdWeU9qQTdkMmxrZEdnNk1EdG9aV2xuYUhRNk1EdDBiM0E2TUR0c1pXWjBPaTA1T1RrNWNIZzdiV0Z5WjJsdUxYUnZjRG94Y0hnN1hDSWdLMXh1WEhSY2RGd2ljRzl6YVhScGIyNDZZV0p6YjJ4MWRHVmNJanRjYmx4MFkyOXVkR0ZwYm1WeUxtRndjR1Z1WkVOb2FXeGtLQ0JrYVhZZ0tUdGNibHh1WEhRdkx5QkZlR1ZqZFhScGJtY2dZbTkwYUNCd2FYaGxiRkJ2YzJsMGFXOXVJQ1lnWW05NFUybDZhVzVuVW1Wc2FXRmliR1VnZEdWemRITWdjbVZ4ZFdseVpTQnZibXg1SUc5dVpTQnNZWGx2ZFhSY2JseDBMeThnYzI4Z2RHaGxlU2R5WlNCbGVHVmpkWFJsWkNCaGRDQjBhR1VnYzJGdFpTQjBhVzFsSUhSdklITmhkbVVnZEdobElITmxZMjl1WkNCamIyMXdkWFJoZEdsdmJpNWNibHgwWm5WdVkzUnBiMjRnWTI5dGNIVjBaVkJwZUdWc1VHOXphWFJwYjI1QmJtUkNiM2hUYVhwcGJtZFNaV3hwWVdKc1pTZ3BJSHRjYmx4MFhIUmthWFl1YzNSNWJHVXVZM056VkdWNGRDQTlYRzVjZEZ4MFhIUXZMeUJUZFhCd2IzSjBPaUJHYVhKbFptOTRQREk1TENCQmJtUnliMmxrSURJdU0xeHVYSFJjZEZ4MEx5OGdWbVZ1Wkc5eUxYQnlaV1pwZUNCaWIzZ3RjMmw2YVc1blhHNWNkRngwWEhSY0lpMTNaV0pyYVhRdFltOTRMWE5wZW1sdVp6cGliM0prWlhJdFltOTRPeTF0YjNvdFltOTRMWE5wZW1sdVp6cGliM0prWlhJdFltOTRPMXdpSUN0Y2JseDBYSFJjZEZ3aVltOTRMWE5wZW1sdVp6cGliM0prWlhJdFltOTRPMlJwYzNCc1lYazZZbXh2WTJzN2JXRnlaMmx1TFhSdmNEb3hKVHQwYjNBNk1TVTdYQ0lnSzF4dVhIUmNkRngwWENKaWIzSmtaWEk2TVhCNE8zQmhaR1JwYm1jNk1YQjRPM2RwWkhSb09qUndlRHR3YjNOcGRHbHZianBoWW5OdmJIVjBaVndpTzF4dVhIUmNkR1JwZGk1cGJtNWxja2hVVFV3Z1BTQmNJbHdpTzF4dVhIUmNkR1J2WTBWc1pXMHVZWEJ3Wlc1a1EyaHBiR1FvSUdOdmJuUmhhVzVsY2lBcE8xeHVYRzVjZEZ4MGRtRnlJR1JwZGxOMGVXeGxJRDBnZDJsdVpHOTNMbWRsZEVOdmJYQjFkR1ZrVTNSNWJHVW9JR1JwZGl3Z2JuVnNiQ0FwTzF4dVhIUmNkSEJwZUdWc1VHOXphWFJwYjI1V1lXd2dQU0JrYVhaVGRIbHNaUzUwYjNBZ0lUMDlJRndpTVNWY0lqdGNibHgwWEhSaWIzaFRhWHBwYm1kU1pXeHBZV0pzWlZaaGJDQTlJR1JwZGxOMGVXeGxMbmRwWkhSb0lEMDlQU0JjSWpSd2VGd2lPMXh1WEc1Y2RGeDBaRzlqUld4bGJTNXlaVzF2ZG1WRGFHbHNaQ2dnWTI5dWRHRnBibVZ5SUNrN1hHNWNkSDFjYmx4dVhIUXZMeUJUZFhCd2IzSjBPaUJ1YjJSbExtcHpJR3B6Wkc5dFhHNWNkQzh2SUVSdmJpZDBJR0Z6YzNWdFpTQjBhR0YwSUdkbGRFTnZiWEIxZEdWa1UzUjViR1VnYVhNZ1lTQndjbTl3WlhKMGVTQnZaaUIwYUdVZ1oyeHZZbUZzSUc5aWFtVmpkRnh1WEhScFppQW9JSGRwYm1SdmR5NW5aWFJEYjIxd2RYUmxaRk4wZVd4bElDa2dlMXh1WEhSY2RHcFJkV1Z5ZVM1bGVIUmxibVFvSUhOMWNIQnZjblFzSUh0Y2JseDBYSFJjZEhCcGVHVnNVRzl6YVhScGIyNDZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhHNWNkRngwWEhSY2RDOHZJRlJvYVhNZ2RHVnpkQ0JwY3lCbGVHVmpkWFJsWkNCdmJteDVJRzl1WTJVZ1luVjBJSGRsSUhOMGFXeHNJR1J2SUcxbGJXOXBlbWx1WjF4dVhIUmNkRngwWEhRdkx5QnphVzVqWlNCM1pTQmpZVzRnZFhObElIUm9aU0JpYjNoVGFYcHBibWRTWld4cFlXSnNaU0J3Y21VdFkyOXRjSFYwYVc1bkxseHVYSFJjZEZ4MFhIUXZMeUJPYnlCdVpXVmtJSFJ2SUdOb1pXTnJJR2xtSUhSb1pTQjBaWE4wSUhkaGN5QmhiSEpsWVdSNUlIQmxjbVp2Y20xbFpDd2dkR2h2ZFdkb0xseHVYSFJjZEZ4MFhIUmpiMjF3ZFhSbFVHbDRaV3hRYjNOcGRHbHZia0Z1WkVKdmVGTnBlbWx1WjFKbGJHbGhZbXhsS0NrN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCd2FYaGxiRkJ2YzJsMGFXOXVWbUZzTzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEdKdmVGTnBlbWx1WjFKbGJHbGhZbXhsT2lCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RGeDBhV1lnS0NCaWIzaFRhWHBwYm1kU1pXeHBZV0pzWlZaaGJDQTlQU0J1ZFd4c0lDa2dlMXh1WEhSY2RGeDBYSFJjZEdOdmJYQjFkR1ZRYVhobGJGQnZjMmwwYVc5dVFXNWtRbTk0VTJsNmFXNW5VbVZzYVdGaWJHVW9LVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSeVpYUjFjbTRnWW05NFUybDZhVzVuVW1Wc2FXRmliR1ZXWVd3N1hHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MGNtVnNhV0ZpYkdWTllYSm5hVzVTYVdkb2REb2dablZ1WTNScGIyNG9LU0I3WEc1Y2JseDBYSFJjZEZ4MEx5OGdVM1Z3Y0c5eWREb2dRVzVrY205cFpDQXlMak5jYmx4MFhIUmNkRngwTHk4Z1EyaGxZMnNnYVdZZ1pHbDJJSGRwZEdnZ1pYaHdiR2xqYVhRZ2QybGtkR2dnWVc1a0lHNXZJRzFoY21kcGJpMXlhV2RvZENCcGJtTnZjbkpsWTNSc2VWeHVYSFJjZEZ4MFhIUXZMeUJuWlhSeklHTnZiWEIxZEdWa0lHMWhjbWRwYmkxeWFXZG9kQ0JpWVhObFpDQnZiaUIzYVdSMGFDQnZaaUJqYjI1MFlXbHVaWEl1SUNnak16TXpNeWxjYmx4MFhIUmNkRngwTHk4Z1YyVmlTMmwwSUVKMVp5QXhNek0wTXlBdElHZGxkRU52YlhCMWRHVmtVM1I1YkdVZ2NtVjBkWEp1Y3lCM2NtOXVaeUIyWVd4MVpTQm1iM0lnYldGeVoybHVMWEpwWjJoMFhHNWNkRngwWEhSY2RDOHZJRlJvYVhNZ2MzVndjRzl5ZENCbWRXNWpkR2x2YmlCcGN5QnZibXg1SUdWNFpXTjFkR1ZrSUc5dVkyVWdjMjhnYm04Z2JXVnRiMmw2YVc1bklHbHpJRzVsWldSbFpDNWNibHgwWEhSY2RGeDBkbUZ5SUhKbGRDeGNibHgwWEhSY2RGeDBYSFJ0WVhKbmFXNUVhWFlnUFNCa2FYWXVZWEJ3Wlc1a1EyaHBiR1FvSUdSdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9JRndpWkdsMlhDSWdLU0FwTzF4dVhHNWNkRngwWEhSY2RDOHZJRkpsYzJWMElFTlRVem9nWW05NExYTnBlbWx1WnpzZ1pHbHpjR3hoZVRzZ2JXRnlaMmx1T3lCaWIzSmtaWEk3SUhCaFpHUnBibWRjYmx4MFhIUmNkRngwYldGeVoybHVSR2wyTG5OMGVXeGxMbU56YzFSbGVIUWdQU0JrYVhZdWMzUjViR1V1WTNOelZHVjRkQ0E5WEc1Y2RGeDBYSFJjZEZ4MEx5OGdVM1Z3Y0c5eWREb2dSbWx5WldadmVEd3lPU3dnUVc1a2NtOXBaQ0F5TGpOY2JseDBYSFJjZEZ4MFhIUXZMeUJXWlc1a2IzSXRjSEpsWm1sNElHSnZlQzF6YVhwcGJtZGNibHgwWEhSY2RGeDBYSFJjSWkxM1pXSnJhWFF0WW05NExYTnBlbWx1WnpwamIyNTBaVzUwTFdKdmVEc3RiVzk2TFdKdmVDMXphWHBwYm1jNlkyOXVkR1Z1ZEMxaWIzZzdYQ0lnSzF4dVhIUmNkRngwWEhSY2RGd2lZbTk0TFhOcGVtbHVaenBqYjI1MFpXNTBMV0p2ZUR0a2FYTndiR0Y1T21Kc2IyTnJPMjFoY21kcGJqb3dPMkp2Y21SbGNqb3dPM0JoWkdScGJtYzZNRndpTzF4dVhIUmNkRngwWEhSdFlYSm5hVzVFYVhZdWMzUjViR1V1YldGeVoybHVVbWxuYUhRZ1BTQnRZWEpuYVc1RWFYWXVjM1I1YkdVdWQybGtkR2dnUFNCY0lqQmNJanRjYmx4MFhIUmNkRngwWkdsMkxuTjBlV3hsTG5kcFpIUm9JRDBnWENJeGNIaGNJanRjYmx4MFhIUmNkRngwWkc5alJXeGxiUzVoY0hCbGJtUkRhR2xzWkNnZ1kyOXVkR0ZwYm1WeUlDazdYRzVjYmx4MFhIUmNkRngwY21WMElEMGdJWEJoY25ObFJteHZZWFFvSUhkcGJtUnZkeTVuWlhSRGIyMXdkWFJsWkZOMGVXeGxLQ0J0WVhKbmFXNUVhWFlzSUc1MWJHd2dLUzV0WVhKbmFXNVNhV2RvZENBcE8xeHVYRzVjZEZ4MFhIUmNkR1J2WTBWc1pXMHVjbVZ0YjNabFEyaHBiR1FvSUdOdmJuUmhhVzVsY2lBcE8xeHVYSFJjZEZ4MFhIUmthWFl1Y21WdGIzWmxRMmhwYkdRb0lHMWhjbWRwYmtScGRpQXBPMXh1WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ5WlhRN1hHNWNkRngwWEhSOVhHNWNkRngwZlNrN1hHNWNkSDFjYm4wcEtDazdYRzVjYmx4dUx5OGdRU0J0WlhSb2IyUWdabTl5SUhGMWFXTnJiSGtnYzNkaGNIQnBibWNnYVc0dmIzVjBJRU5UVXlCd2NtOXdaWEowYVdWeklIUnZJR2RsZENCamIzSnlaV04wSUdOaGJHTjFiR0YwYVc5dWN5NWNibXBSZFdWeWVTNXpkMkZ3SUQwZ1puVnVZM1JwYjI0b0lHVnNaVzBzSUc5d2RHbHZibk1zSUdOaGJHeGlZV05yTENCaGNtZHpJQ2tnZTF4dVhIUjJZWElnY21WMExDQnVZVzFsTEZ4dVhIUmNkRzlzWkNBOUlIdDlPMXh1WEc1Y2RDOHZJRkpsYldWdFltVnlJSFJvWlNCdmJHUWdkbUZzZFdWekxDQmhibVFnYVc1elpYSjBJSFJvWlNCdVpYY2diMjVsYzF4dVhIUm1iM0lnS0NCdVlXMWxJR2x1SUc5d2RHbHZibk1nS1NCN1hHNWNkRngwYjJ4a1d5QnVZVzFsSUYwZ1BTQmxiR1Z0TG5OMGVXeGxXeUJ1WVcxbElGMDdYRzVjZEZ4MFpXeGxiUzV6ZEhsc1pWc2dibUZ0WlNCZElEMGdiM0IwYVc5dWMxc2dibUZ0WlNCZE8xeHVYSFI5WEc1Y2JseDBjbVYwSUQwZ1kyRnNiR0poWTJzdVlYQndiSGtvSUdWc1pXMHNJR0Z5WjNNZ2ZId2dXMTBnS1R0Y2JseHVYSFF2THlCU1pYWmxjblFnZEdobElHOXNaQ0IyWVd4MVpYTmNibHgwWm05eUlDZ2dibUZ0WlNCcGJpQnZjSFJwYjI1eklDa2dlMXh1WEhSY2RHVnNaVzB1YzNSNWJHVmJJRzVoYldVZ1hTQTlJRzlzWkZzZ2JtRnRaU0JkTzF4dVhIUjlYRzVjYmx4MGNtVjBkWEp1SUhKbGREdGNibjA3WEc1Y2JseHVkbUZ5WEc1Y2RDOHZJRk4zWVhCd1lXSnNaU0JwWmlCa2FYTndiR0Y1SUdseklHNXZibVVnYjNJZ2MzUmhjblJ6SUhkcGRHZ2dkR0ZpYkdVZ1pYaGpaWEIwSUZ3aWRHRmliR1ZjSWl3Z1hDSjBZV0pzWlMxalpXeHNYQ0lzSUc5eUlGd2lkR0ZpYkdVdFkyRndkR2x2Ymx3aVhHNWNkQzh2SUZObFpTQm9aWEpsSUdadmNpQmthWE53YkdGNUlIWmhiSFZsY3pvZ2FIUjBjSE02THk5a1pYWmxiRzl3WlhJdWJXOTZhV3hzWVM1dmNtY3ZaVzR0VlZNdlpHOWpjeTlEVTFNdlpHbHpjR3hoZVZ4dVhIUnlaR2x6Y0d4aGVYTjNZWEFnUFNBdlhpaHViMjVsZkhSaFlteGxLRDhoTFdOYlpXRmRLUzRyS1M4c1hHNWNkSEp1ZFcxemNHeHBkQ0E5SUc1bGR5QlNaV2RGZUhBb0lGd2lYaWhjSWlBcklIQnVkVzBnS3lCY0lpa29MaW9wSkZ3aUxDQmNJbWxjSWlBcExGeHVYSFJ5Y21Wc1RuVnRJRDBnYm1WM0lGSmxaMFY0Y0NnZ1hDSmVLRnNyTFYwcFBTaGNJaUFySUhCdWRXMGdLeUJjSWlsY0lpd2dYQ0pwWENJZ0tTeGNibHh1WEhSamMzTlRhRzkzSUQwZ2V5QndiM05wZEdsdmJqb2dYQ0poWW5OdmJIVjBaVndpTENCMmFYTnBZbWxzYVhSNU9pQmNJbWhwWkdSbGJsd2lMQ0JrYVhOd2JHRjVPaUJjSW1Kc2IyTnJYQ0lnZlN4Y2JseDBZM056VG05eWJXRnNWSEpoYm5ObWIzSnRJRDBnZTF4dVhIUmNkR3hsZEhSbGNsTndZV05wYm1jNklGd2lNRndpTEZ4dVhIUmNkR1p2Ym5SWFpXbG5hSFE2SUZ3aU5EQXdYQ0pjYmx4MGZTeGNibHh1WEhSamMzTlFjbVZtYVhobGN5QTlJRnNnWENKWFpXSnJhWFJjSWl3Z1hDSlBYQ0lzSUZ3aVRXOTZYQ0lzSUZ3aWJYTmNJaUJkTzF4dVhHNHZMeUJTWlhSMWNtNGdZU0JqYzNNZ2NISnZjR1Z5ZEhrZ2JXRndjR1ZrSUhSdklHRWdjRzkwWlc1MGFXRnNiSGtnZG1WdVpHOXlJSEJ5WldacGVHVmtJSEJ5YjNCbGNuUjVYRzVtZFc1amRHbHZiaUIyWlc1a2IzSlFjbTl3VG1GdFpTZ2djM1I1YkdVc0lHNWhiV1VnS1NCN1hHNWNibHgwTHk4Z1UyaHZjblJqZFhRZ1ptOXlJRzVoYldWeklIUm9ZWFFnWVhKbElHNXZkQ0IyWlc1a2IzSWdjSEpsWm1sNFpXUmNibHgwYVdZZ0tDQnVZVzFsSUdsdUlITjBlV3hsSUNrZ2UxeHVYSFJjZEhKbGRIVnliaUJ1WVcxbE8xeHVYSFI5WEc1Y2JseDBMeThnUTJobFkyc2dabTl5SUhabGJtUnZjaUJ3Y21WbWFYaGxaQ0J1WVcxbGMxeHVYSFIyWVhJZ1kyRndUbUZ0WlNBOUlHNWhiV1ZiTUYwdWRHOVZjSEJsY2tOaGMyVW9LU0FySUc1aGJXVXVjMnhwWTJVb01Ta3NYRzVjZEZ4MGIzSnBaMDVoYldVZ1BTQnVZVzFsTEZ4dVhIUmNkR2tnUFNCamMzTlFjbVZtYVhobGN5NXNaVzVuZEdnN1hHNWNibHgwZDJocGJHVWdLQ0JwTFMwZ0tTQjdYRzVjZEZ4MGJtRnRaU0E5SUdOemMxQnlaV1pwZUdWeld5QnBJRjBnS3lCallYQk9ZVzFsTzF4dVhIUmNkR2xtSUNnZ2JtRnRaU0JwYmlCemRIbHNaU0FwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJ1WVcxbE8xeHVYSFJjZEgxY2JseDBmVnh1WEc1Y2RISmxkSFZ5YmlCdmNtbG5UbUZ0WlR0Y2JuMWNibHh1Wm5WdVkzUnBiMjRnYzJWMFVHOXphWFJwZG1WT2RXMWlaWElvSUdWc1pXMHNJSFpoYkhWbExDQnpkV0owY21GamRDQXBJSHRjYmx4MGRtRnlJRzFoZEdOb1pYTWdQU0J5Ym5WdGMzQnNhWFF1WlhobFl5Z2dkbUZzZFdVZ0tUdGNibHgwY21WMGRYSnVJRzFoZEdOb1pYTWdQMXh1WEhSY2RDOHZJRWQxWVhKa0lHRm5ZV2x1YzNRZ2RXNWtaV1pwYm1Wa0lGd2ljM1ZpZEhKaFkzUmNJaXdnWlM1bkxpd2dkMmhsYmlCMWMyVmtJR0Z6SUdsdUlHTnpjMGh2YjJ0elhHNWNkRngwVFdGMGFDNXRZWGdvSURBc0lHMWhkR05vWlhOYklERWdYU0F0SUNnZ2MzVmlkSEpoWTNRZ2ZId2dNQ0FwSUNrZ0t5QW9JRzFoZEdOb1pYTmJJRElnWFNCOGZDQmNJbkI0WENJZ0tTQTZYRzVjZEZ4MGRtRnNkV1U3WEc1OVhHNWNibVoxYm1OMGFXOXVJR0YxWjIxbGJuUlhhV1IwYUU5eVNHVnBaMmgwS0NCbGJHVnRMQ0J1WVcxbExDQmxlSFJ5WVN3Z2FYTkNiM0prWlhKQ2IzZ3NJSE4wZVd4bGN5QXBJSHRjYmx4MGRtRnlJR2tnUFNCbGVIUnlZU0E5UFQwZ0tDQnBjMEp2Y21SbGNrSnZlQ0EvSUZ3aVltOXlaR1Z5WENJZ09pQmNJbU52Ym5SbGJuUmNJaUFwSUQ5Y2JseDBYSFF2THlCSlppQjNaU0JoYkhKbFlXUjVJR2hoZG1VZ2RHaGxJSEpwWjJoMElHMWxZWE4xY21WdFpXNTBMQ0JoZG05cFpDQmhkV2R0Wlc1MFlYUnBiMjVjYmx4MFhIUTBJRHBjYmx4MFhIUXZMeUJQZEdobGNuZHBjMlVnYVc1cGRHbGhiR2w2WlNCbWIzSWdhRzl5YVhwdmJuUmhiQ0J2Y2lCMlpYSjBhV05oYkNCd2NtOXdaWEowYVdWelhHNWNkRngwYm1GdFpTQTlQVDBnWENKM2FXUjBhRndpSUQ4Z01TQTZJREFzWEc1Y2JseDBYSFIyWVd3Z1BTQXdPMXh1WEc1Y2RHWnZjaUFvSURzZ2FTQThJRFE3SUdrZ0t6MGdNaUFwSUh0Y2JseDBYSFF2THlCQ2IzUm9JR0p2ZUNCdGIyUmxiSE1nWlhoamJIVmtaU0J0WVhKbmFXNHNJSE52SUdGa1pDQnBkQ0JwWmlCM1pTQjNZVzUwSUdsMFhHNWNkRngwYVdZZ0tDQmxlSFJ5WVNBOVBUMGdYQ0p0WVhKbmFXNWNJaUFwSUh0Y2JseDBYSFJjZEhaaGJDQXJQU0JxVVhWbGNua3VZM056S0NCbGJHVnRMQ0JsZUhSeVlTQXJJR056YzBWNGNHRnVaRnNnYVNCZExDQjBjblZsTENCemRIbHNaWE1nS1R0Y2JseDBYSFI5WEc1Y2JseDBYSFJwWmlBb0lHbHpRbTl5WkdWeVFtOTRJQ2tnZTF4dVhIUmNkRngwTHk4Z1ltOXlaR1Z5TFdKdmVDQnBibU5zZFdSbGN5QndZV1JrYVc1bkxDQnpieUJ5WlcxdmRtVWdhWFFnYVdZZ2QyVWdkMkZ1ZENCamIyNTBaVzUwWEc1Y2RGeDBYSFJwWmlBb0lHVjRkSEpoSUQwOVBTQmNJbU52Ym5SbGJuUmNJaUFwSUh0Y2JseDBYSFJjZEZ4MGRtRnNJQzA5SUdwUmRXVnllUzVqYzNNb0lHVnNaVzBzSUZ3aWNHRmtaR2x1WjF3aUlDc2dZM056Ulhod1lXNWtXeUJwSUYwc0lIUnlkV1VzSUhOMGVXeGxjeUFwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QkJkQ0IwYUdseklIQnZhVzUwTENCbGVIUnlZU0JwYzI0bmRDQmliM0prWlhJZ2JtOXlJRzFoY21kcGJpd2djMjhnY21WdGIzWmxJR0p2Y21SbGNseHVYSFJjZEZ4MGFXWWdLQ0JsZUhSeVlTQWhQVDBnWENKdFlYSm5hVzVjSWlBcElIdGNibHgwWEhSY2RGeDBkbUZzSUMwOUlHcFJkV1Z5ZVM1amMzTW9JR1ZzWlcwc0lGd2lZbTl5WkdWeVhDSWdLeUJqYzNORmVIQmhibVJiSUdrZ1hTQXJJRndpVjJsa2RHaGNJaXdnZEhKMVpTd2djM1I1YkdWeklDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEM4dklFRjBJSFJvYVhNZ2NHOXBiblFzSUdWNGRISmhJR2x6YmlkMElHTnZiblJsYm5Rc0lITnZJR0ZrWkNCd1lXUmthVzVuWEc1Y2RGeDBYSFIyWVd3Z0t6MGdhbEYxWlhKNUxtTnpjeWdnWld4bGJTd2dYQ0p3WVdSa2FXNW5YQ0lnS3lCamMzTkZlSEJoYm1SYklHa2dYU3dnZEhKMVpTd2djM1I1YkdWeklDazdYRzVjYmx4MFhIUmNkQzh2SUVGMElIUm9hWE1nY0c5cGJuUXNJR1Y0ZEhKaElHbHpiaWQwSUdOdmJuUmxiblFnYm05eUlIQmhaR1JwYm1jc0lITnZJR0ZrWkNCaWIzSmtaWEpjYmx4MFhIUmNkR2xtSUNnZ1pYaDBjbUVnSVQwOUlGd2ljR0ZrWkdsdVoxd2lJQ2tnZTF4dVhIUmNkRngwWEhSMllXd2dLejBnYWxGMVpYSjVMbU56Y3lnZ1pXeGxiU3dnWENKaWIzSmtaWEpjSWlBcklHTnpjMFY0Y0dGdVpGc2dhU0JkSUNzZ1hDSlhhV1IwYUZ3aUxDQjBjblZsTENCemRIbHNaWE1nS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMWNibHh1WEhSeVpYUjFjbTRnZG1Gc08xeHVmVnh1WEc1bWRXNWpkR2x2YmlCblpYUlhhV1IwYUU5eVNHVnBaMmgwS0NCbGJHVnRMQ0J1WVcxbExDQmxlSFJ5WVNBcElIdGNibHh1WEhRdkx5QlRkR0Z5ZENCM2FYUm9JRzltWm5ObGRDQndjbTl3WlhKMGVTd2dkMmhwWTJnZ2FYTWdaWEYxYVhaaGJHVnVkQ0IwYnlCMGFHVWdZbTl5WkdWeUxXSnZlQ0IyWVd4MVpWeHVYSFIyWVhJZ2RtRnNkV1ZKYzBKdmNtUmxja0p2ZUNBOUlIUnlkV1VzWEc1Y2RGeDBkbUZzSUQwZ2JtRnRaU0E5UFQwZ1hDSjNhV1IwYUZ3aUlEOGdaV3hsYlM1dlptWnpaWFJYYVdSMGFDQTZJR1ZzWlcwdWIyWm1jMlYwU0dWcFoyaDBMRnh1WEhSY2RITjBlV3hsY3lBOUlHZGxkRk4wZVd4bGN5Z2daV3hsYlNBcExGeHVYSFJjZEdselFtOXlaR1Z5UW05NElEMGdhbEYxWlhKNUxtTnpjeWdnWld4bGJTd2dYQ0ppYjNoVGFYcHBibWRjSWl3Z1ptRnNjMlVzSUhOMGVXeGxjeUFwSUQwOVBTQmNJbUp2Y21SbGNpMWliM2hjSWp0Y2JseHVYSFF2THlCVGIyMWxJRzV2Ymkxb2RHMXNJR1ZzWlcxbGJuUnpJSEpsZEhWeWJpQjFibVJsWm1sdVpXUWdabTl5SUc5bVpuTmxkRmRwWkhSb0xDQnpieUJqYUdWamF5Qm1iM0lnYm5Wc2JDOTFibVJsWm1sdVpXUmNibHgwTHk4Z2MzWm5JQzBnYUhSMGNITTZMeTlpZFdkNmFXeHNZUzV0YjNwcGJHeGhMbTl5Wnk5emFHOTNYMkoxWnk1aloyay9hV1E5TmpRNU1qZzFYRzVjZEM4dklFMWhkR2hOVENBdElHaDBkSEJ6T2k4dlluVm5lbWxzYkdFdWJXOTZhV3hzWVM1dmNtY3ZjMmh2ZDE5aWRXY3VZMmRwUDJsa1BUUTVNVFkyT0Z4dVhIUnBaaUFvSUhaaGJDQThQU0F3SUh4OElIWmhiQ0E5UFNCdWRXeHNJQ2tnZTF4dVhIUmNkQzh2SUVaaGJHd2dZbUZqYXlCMGJ5QmpiMjF3ZFhSbFpDQjBhR1Z1SUhWdVkyOXRjSFYwWldRZ1kzTnpJR2xtSUc1bFkyVnpjMkZ5ZVZ4dVhIUmNkSFpoYkNBOUlHTjFja05UVXlnZ1pXeGxiU3dnYm1GdFpTd2djM1I1YkdWeklDazdYRzVjZEZ4MGFXWWdLQ0IyWVd3Z1BDQXdJSHg4SUhaaGJDQTlQU0J1ZFd4c0lDa2dlMXh1WEhSY2RGeDBkbUZzSUQwZ1pXeGxiUzV6ZEhsc1pWc2dibUZ0WlNCZE8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklFTnZiWEIxZEdWa0lIVnVhWFFnYVhNZ2JtOTBJSEJwZUdWc2N5NGdVM1J2Y0NCb1pYSmxJR0Z1WkNCeVpYUjFjbTR1WEc1Y2RGeDBhV1lnS0NCeWJuVnRibTl1Y0hndWRHVnpkQ2gyWVd3cElDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlIWmhiRHRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJEYUdWamF5Qm1iM0lnYzNSNWJHVWdhVzRnWTJGelpTQmhJR0p5YjNkelpYSWdkMmhwWTJnZ2NtVjBkWEp1Y3lCMWJuSmxiR2xoWW14bElIWmhiSFZsYzF4dVhIUmNkQzh2SUdadmNpQm5aWFJEYjIxd2RYUmxaRk4wZVd4bElITnBiR1Z1ZEd4NUlHWmhiR3h6SUdKaFkyc2dkRzhnZEdobElISmxiR2xoWW14bElHVnNaVzB1YzNSNWJHVmNibHgwWEhSMllXeDFaVWx6UW05eVpHVnlRbTk0SUQwZ2FYTkNiM0prWlhKQ2IzZ2dKaVpjYmx4MFhIUmNkQ2dnYzNWd2NHOXlkQzVpYjNoVGFYcHBibWRTWld4cFlXSnNaU2dwSUh4OElIWmhiQ0E5UFQwZ1pXeGxiUzV6ZEhsc1pWc2dibUZ0WlNCZElDazdYRzVjYmx4MFhIUXZMeUJPYjNKdFlXeHBlbVVnWENKY0lpd2dZWFYwYnl3Z1lXNWtJSEJ5WlhCaGNtVWdabTl5SUdWNGRISmhYRzVjZEZ4MGRtRnNJRDBnY0dGeWMyVkdiRzloZENnZ2RtRnNJQ2tnZkh3Z01EdGNibHgwZlZ4dVhHNWNkQzh2SUZWelpTQjBhR1VnWVdOMGFYWmxJR0p2ZUMxemFYcHBibWNnYlc5a1pXd2dkRzhnWVdSa0wzTjFZblJ5WVdOMElHbHljbVZzWlhaaGJuUWdjM1I1YkdWelhHNWNkSEpsZEhWeWJpQW9JSFpoYkNBclhHNWNkRngwWVhWbmJXVnVkRmRwWkhSb1QzSklaV2xuYUhRb1hHNWNkRngwWEhSbGJHVnRMRnh1WEhSY2RGeDBibUZ0WlN4Y2JseDBYSFJjZEdWNGRISmhJSHg4SUNnZ2FYTkNiM0prWlhKQ2IzZ2dQeUJjSW1KdmNtUmxjbHdpSURvZ1hDSmpiMjUwWlc1MFhDSWdLU3hjYmx4MFhIUmNkSFpoYkhWbFNYTkNiM0prWlhKQ2IzZ3NYRzVjZEZ4MFhIUnpkSGxzWlhOY2JseDBYSFFwWEc1Y2RDa2dLeUJjSW5CNFhDSTdYRzU5WEc1Y2JtWjFibU4wYVc5dUlITm9iM2RJYVdSbEtDQmxiR1Z0Wlc1MGN5d2djMmh2ZHlBcElIdGNibHgwZG1GeUlHUnBjM0JzWVhrc0lHVnNaVzBzSUdocFpHUmxiaXhjYmx4MFhIUjJZV3gxWlhNZ1BTQmJYU3hjYmx4MFhIUnBibVJsZUNBOUlEQXNYRzVjZEZ4MGJHVnVaM1JvSUQwZ1pXeGxiV1Z1ZEhNdWJHVnVaM1JvTzF4dVhHNWNkR1p2Y2lBb0lEc2dhVzVrWlhnZ1BDQnNaVzVuZEdnN0lHbHVaR1Y0S3lzZ0tTQjdYRzVjZEZ4MFpXeGxiU0E5SUdWc1pXMWxiblJ6V3lCcGJtUmxlQ0JkTzF4dVhIUmNkR2xtSUNnZ0lXVnNaVzB1YzNSNWJHVWdLU0I3WEc1Y2RGeDBYSFJqYjI1MGFXNTFaVHRjYmx4MFhIUjlYRzVjYmx4MFhIUjJZV3gxWlhOYklHbHVaR1Y0SUYwZ1BTQmtZWFJoWDNCeWFYWXVaMlYwS0NCbGJHVnRMQ0JjSW05c1pHUnBjM0JzWVhsY0lpQXBPMXh1WEhSY2RHUnBjM0JzWVhrZ1BTQmxiR1Z0TG5OMGVXeGxMbVJwYzNCc1lYazdYRzVjZEZ4MGFXWWdLQ0J6YUc5M0lDa2dlMXh1WEhSY2RGeDBMeThnVW1WelpYUWdkR2hsSUdsdWJHbHVaU0JrYVhOd2JHRjVJRzltSUhSb2FYTWdaV3hsYldWdWRDQjBieUJzWldGeWJpQnBaaUJwZENCcGMxeHVYSFJjZEZ4MEx5OGdZbVZwYm1jZ2FHbGtaR1Z1SUdKNUlHTmhjMk5oWkdWa0lISjFiR1Z6SUc5eUlHNXZkRnh1WEhSY2RGeDBhV1lnS0NBaGRtRnNkV1Z6V3lCcGJtUmxlQ0JkSUNZbUlHUnBjM0JzWVhrZ1BUMDlJRndpYm05dVpWd2lJQ2tnZTF4dVhIUmNkRngwWEhSbGJHVnRMbk4wZVd4bExtUnBjM0JzWVhrZ1BTQmNJbHdpTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QlRaWFFnWld4bGJXVnVkSE1nZDJocFkyZ2dhR0YyWlNCaVpXVnVJRzkyWlhKeWFXUmtaVzRnZDJsMGFDQmthWE53YkdGNU9pQnViMjVsWEc1Y2RGeDBYSFF2THlCcGJpQmhJSE4wZVd4bGMyaGxaWFFnZEc4Z2QyaGhkR1YyWlhJZ2RHaGxJR1JsWm1GMWJIUWdZbkp2ZDNObGNpQnpkSGxzWlNCcGMxeHVYSFJjZEZ4MEx5OGdabTl5SUhOMVkyZ2dZVzRnWld4bGJXVnVkRnh1WEhSY2RGeDBhV1lnS0NCbGJHVnRMbk4wZVd4bExtUnBjM0JzWVhrZ1BUMDlJRndpWENJZ0ppWWdhWE5JYVdSa1pXNG9JR1ZzWlcwZ0tTQXBJSHRjYmx4MFhIUmNkRngwZG1Gc2RXVnpXeUJwYm1SbGVDQmRJRDBnWkdGMFlWOXdjbWwyTG1GalkyVnpjeWdnWld4bGJTd2dYQ0p2YkdSa2FYTndiR0Y1WENJc0lHUmxabUYxYkhSRWFYTndiR0Y1S0dWc1pXMHVibTlrWlU1aGJXVXBJQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RHaHBaR1JsYmlBOUlHbHpTR2xrWkdWdUtDQmxiR1Z0SUNrN1hHNWNibHgwWEhSY2RHbG1JQ2dnWkdsemNHeGhlU0FoUFQwZ1hDSnViMjVsWENJZ2ZId2dJV2hwWkdSbGJpQXBJSHRjYmx4MFhIUmNkRngwWkdGMFlWOXdjbWwyTG5ObGRDZ2daV3hsYlN3Z1hDSnZiR1JrYVhOd2JHRjVYQ0lzSUdocFpHUmxiaUEvSUdScGMzQnNZWGtnT2lCcVVYVmxjbmt1WTNOektDQmxiR1Z0TENCY0ltUnBjM0JzWVhsY0lpQXBJQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEhSOVhHNWNibHgwTHk4Z1UyVjBJSFJvWlNCa2FYTndiR0Y1SUc5bUlHMXZjM1FnYjJZZ2RHaGxJR1ZzWlcxbGJuUnpJR2x1SUdFZ2MyVmpiMjVrSUd4dmIzQmNibHgwTHk4Z2RHOGdZWFp2YVdRZ2RHaGxJR052Ym5OMFlXNTBJSEpsWm14dmQxeHVYSFJtYjNJZ0tDQnBibVJsZUNBOUlEQTdJR2x1WkdWNElEd2diR1Z1WjNSb095QnBibVJsZUNzcklDa2dlMXh1WEhSY2RHVnNaVzBnUFNCbGJHVnRaVzUwYzFzZ2FXNWtaWGdnWFR0Y2JseDBYSFJwWmlBb0lDRmxiR1Z0TG5OMGVXeGxJQ2tnZTF4dVhIUmNkRngwWTI5dWRHbHVkV1U3WEc1Y2RGeDBmVnh1WEhSY2RHbG1JQ2dnSVhOb2IzY2dmSHdnWld4bGJTNXpkSGxzWlM1a2FYTndiR0Y1SUQwOVBTQmNJbTV2Ym1WY0lpQjhmQ0JsYkdWdExuTjBlV3hsTG1ScGMzQnNZWGtnUFQwOUlGd2lYQ0lnS1NCN1hHNWNkRngwWEhSbGJHVnRMbk4wZVd4bExtUnBjM0JzWVhrZ1BTQnphRzkzSUQ4Z2RtRnNkV1Z6V3lCcGJtUmxlQ0JkSUh4OElGd2lYQ0lnT2lCY0ltNXZibVZjSWp0Y2JseDBYSFI5WEc1Y2RIMWNibHh1WEhSeVpYUjFjbTRnWld4bGJXVnVkSE03WEc1OVhHNWNibXBSZFdWeWVTNWxlSFJsYm1Rb2UxeHVYRzVjZEM4dklFRmtaQ0JwYmlCemRIbHNaU0J3Y205d1pYSjBlU0JvYjI5cmN5Qm1iM0lnYjNabGNuSnBaR2x1WnlCMGFHVWdaR1ZtWVhWc2RGeHVYSFF2THlCaVpXaGhkbWx2Y2lCdlppQm5aWFIwYVc1bklHRnVaQ0J6WlhSMGFXNW5JR0VnYzNSNWJHVWdjSEp2Y0dWeWRIbGNibHgwWTNOelNHOXZhM002SUh0Y2JseDBYSFJ2Y0dGamFYUjVPaUI3WEc1Y2RGeDBYSFJuWlhRNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCamIyMXdkWFJsWkNBcElIdGNibHgwWEhSY2RGeDBhV1lnS0NCamIyMXdkWFJsWkNBcElIdGNibHh1WEhSY2RGeDBYSFJjZEM4dklGZGxJSE5vYjNWc1pDQmhiSGRoZVhNZ1oyVjBJR0VnYm5WdFltVnlJR0poWTJzZ1puSnZiU0J2Y0dGamFYUjVYRzVjZEZ4MFhIUmNkRngwZG1GeUlISmxkQ0E5SUdOMWNrTlRVeWdnWld4bGJTd2dYQ0p2Y0dGamFYUjVYQ0lnS1R0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2NtVjBJRDA5UFNCY0lsd2lJRDhnWENJeFhDSWdPaUJ5WlhRN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNkSDBzWEc1Y2JseDBMeThnUkc5dUozUWdZWFYwYjIxaGRHbGpZV3hzZVNCaFpHUWdYQ0p3ZUZ3aUlIUnZJSFJvWlhObElIQnZjM05wWW14NUxYVnVhWFJzWlhOeklIQnliM0JsY25ScFpYTmNibHgwWTNOelRuVnRZbVZ5T2lCN1hHNWNkRngwWENKamIyeDFiVzVEYjNWdWRGd2lPaUIwY25WbExGeHVYSFJjZEZ3aVptbHNiRTl3WVdOcGRIbGNJam9nZEhKMVpTeGNibHgwWEhSY0ltWnNaWGhIY205M1hDSTZJSFJ5ZFdVc1hHNWNkRngwWENKbWJHVjRVMmh5YVc1clhDSTZJSFJ5ZFdVc1hHNWNkRngwWENKbWIyNTBWMlZwWjJoMFhDSTZJSFJ5ZFdVc1hHNWNkRngwWENKc2FXNWxTR1ZwWjJoMFhDSTZJSFJ5ZFdVc1hHNWNkRngwWENKdmNHRmphWFI1WENJNklIUnlkV1VzWEc1Y2RGeDBYQ0p2Y21SbGNsd2lPaUIwY25WbExGeHVYSFJjZEZ3aWIzSndhR0Z1YzF3aU9pQjBjblZsTEZ4dVhIUmNkRndpZDJsa2IzZHpYQ0k2SUhSeWRXVXNYRzVjZEZ4MFhDSjZTVzVrWlhoY0lqb2dkSEoxWlN4Y2JseDBYSFJjSW5wdmIyMWNJam9nZEhKMVpWeHVYSFI5TEZ4dVhHNWNkQzh2SUVGa1pDQnBiaUJ3Y205d1pYSjBhV1Z6SUhkb2IzTmxJRzVoYldWeklIbHZkU0IzYVhOb0lIUnZJR1pwZUNCaVpXWnZjbVZjYmx4MEx5OGdjMlYwZEdsdVp5QnZjaUJuWlhSMGFXNW5JSFJvWlNCMllXeDFaVnh1WEhSamMzTlFjbTl3Y3pvZ2UxeHVYSFJjZEZ3aVpteHZZWFJjSWpvZ1hDSmpjM05HYkc5aGRGd2lYRzVjZEgwc1hHNWNibHgwTHk4Z1IyVjBJR0Z1WkNCelpYUWdkR2hsSUhOMGVXeGxJSEJ5YjNCbGNuUjVJRzl1SUdFZ1JFOU5JRTV2WkdWY2JseDBjM1I1YkdVNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCdVlXMWxMQ0IyWVd4MVpTd2daWGgwY21FZ0tTQjdYRzVjYmx4MFhIUXZMeUJFYjI0bmRDQnpaWFFnYzNSNWJHVnpJRzl1SUhSbGVIUWdZVzVrSUdOdmJXMWxiblFnYm05a1pYTmNibHgwWEhScFppQW9JQ0ZsYkdWdElIeDhJR1ZzWlcwdWJtOWtaVlI1Y0dVZ1BUMDlJRE1nZkh3Z1pXeGxiUzV1YjJSbFZIbHdaU0E5UFQwZ09DQjhmQ0FoWld4bGJTNXpkSGxzWlNBcElIdGNibHgwWEhSY2RISmxkSFZ5Ymp0Y2JseDBYSFI5WEc1Y2JseDBYSFF2THlCTllXdGxJSE4xY21VZ2RHaGhkQ0IzWlNkeVpTQjNiM0pyYVc1bklIZHBkR2dnZEdobElISnBaMmgwSUc1aGJXVmNibHgwWEhSMllYSWdjbVYwTENCMGVYQmxMQ0JvYjI5cmN5eGNibHgwWEhSY2RHOXlhV2RPWVcxbElEMGdhbEYxWlhKNUxtTmhiV1ZzUTJGelpTZ2dibUZ0WlNBcExGeHVYSFJjZEZ4MGMzUjViR1VnUFNCbGJHVnRMbk4wZVd4bE8xeHVYRzVjZEZ4MGJtRnRaU0E5SUdwUmRXVnllUzVqYzNOUWNtOXdjMXNnYjNKcFowNWhiV1VnWFNCOGZDQW9JR3BSZFdWeWVTNWpjM05RY205d2Mxc2diM0pwWjA1aGJXVWdYU0E5SUhabGJtUnZjbEJ5YjNCT1lXMWxLQ0J6ZEhsc1pTd2diM0pwWjA1aGJXVWdLU0FwTzF4dVhHNWNkRngwTHk4Z1IyVjBjeUJvYjI5cklHWnZjaUIwYUdVZ2NISmxabWw0WldRZ2RtVnljMmx2Yml3Z2RHaGxiaUIxYm5CeVpXWnBlR1ZrSUhabGNuTnBiMjVjYmx4MFhIUm9iMjlyY3lBOUlHcFJkV1Z5ZVM1amMzTkliMjlyYzFzZ2JtRnRaU0JkSUh4OElHcFJkV1Z5ZVM1amMzTkliMjlyYzFzZ2IzSnBaMDVoYldVZ1hUdGNibHh1WEhSY2RDOHZJRU5vWldOcklHbG1JSGRsSjNKbElITmxkSFJwYm1jZ1lTQjJZV3gxWlZ4dVhIUmNkR2xtSUNnZ2RtRnNkV1VnSVQwOUlIVnVaR1ZtYVc1bFpDQXBJSHRjYmx4MFhIUmNkSFI1Y0dVZ1BTQjBlWEJsYjJZZ2RtRnNkV1U3WEc1Y2JseDBYSFJjZEM4dklFTnZiblpsY25RZ1hDSXJQVndpSUc5eUlGd2lMVDFjSWlCMGJ5QnlaV3hoZEdsMlpTQnVkVzFpWlhKeklDZ2pOek0wTlNsY2JseDBYSFJjZEdsbUlDZ2dkSGx3WlNBOVBUMGdYQ0p6ZEhKcGJtZGNJaUFtSmlBb2NtVjBJRDBnY25KbGJFNTFiUzVsZUdWaktDQjJZV3gxWlNBcEtTQXBJSHRjYmx4MFhIUmNkRngwZG1Gc2RXVWdQU0FvSUhKbGRGc3hYU0FySURFZ0tTQXFJSEpsZEZzeVhTQXJJSEJoY25ObFJteHZZWFFvSUdwUmRXVnllUzVqYzNNb0lHVnNaVzBzSUc1aGJXVWdLU0FwTzF4dVhIUmNkRngwWEhRdkx5QkdhWGhsY3lCaWRXY2dJemt5TXpkY2JseDBYSFJjZEZ4MGRIbHdaU0E5SUZ3aWJuVnRZbVZ5WENJN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRTFoYTJVZ2MzVnlaU0IwYUdGMElHNTFiR3dnWVc1a0lFNWhUaUIyWVd4MVpYTWdZWEpsYmlkMElITmxkQ0FvSXpjeE1UWXBYRzVjZEZ4MFhIUnBaaUFvSUhaaGJIVmxJRDA5SUc1MWJHd2dmSHdnZG1Gc2RXVWdJVDA5SUhaaGJIVmxJQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTQ3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklFbG1JR0VnYm5WdFltVnlMQ0JoWkdRZ0ozQjRKeUIwYnlCMGFHVWdLR1Y0WTJWd2RDQm1iM0lnWTJWeWRHRnBiaUJEVTFNZ2NISnZjR1Z5ZEdsbGN5bGNibHgwWEhSY2RHbG1JQ2dnZEhsd1pTQTlQVDBnWENKdWRXMWlaWEpjSWlBbUppQWhhbEYxWlhKNUxtTnpjMDUxYldKbGNsc2diM0pwWjA1aGJXVWdYU0FwSUh0Y2JseDBYSFJjZEZ4MGRtRnNkV1VnS3owZ1hDSndlRndpTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QlRkWEJ3YjNKME9pQkpSVGt0TVRFclhHNWNkRngwWEhRdkx5QmlZV05yWjNKdmRXNWtMU29nY0hKdmNITWdZV1ptWldOMElHOXlhV2RwYm1Gc0lHTnNiMjVsSjNNZ2RtRnNkV1Z6WEc1Y2RGeDBYSFJwWmlBb0lDRnpkWEJ3YjNKMExtTnNaV0Z5UTJ4dmJtVlRkSGxzWlNBbUppQjJZV3gxWlNBOVBUMGdYQ0pjSWlBbUppQnVZVzFsTG1sdVpHVjRUMllvSUZ3aVltRmphMmR5YjNWdVpGd2lJQ2tnUFQwOUlEQWdLU0I3WEc1Y2RGeDBYSFJjZEhOMGVXeGxXeUJ1WVcxbElGMGdQU0JjSW1sdWFHVnlhWFJjSWp0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdTV1lnWVNCb2IyOXJJSGRoY3lCd2NtOTJhV1JsWkN3Z2RYTmxJSFJvWVhRZ2RtRnNkV1VzSUc5MGFHVnlkMmx6WlNCcWRYTjBJSE5sZENCMGFHVWdjM0JsWTJsbWFXVmtJSFpoYkhWbFhHNWNkRngwWEhScFppQW9JQ0ZvYjI5cmN5QjhmQ0FoS0Z3aWMyVjBYQ0lnYVc0Z2FHOXZhM01wSUh4OElDaDJZV3gxWlNBOUlHaHZiMnR6TG5ObGRDZ2daV3hsYlN3Z2RtRnNkV1VzSUdWNGRISmhJQ2twSUNFOVBTQjFibVJsWm1sdVpXUWdLU0I3WEc1Y2RGeDBYSFJjZEhOMGVXeGxXeUJ1WVcxbElGMGdQU0IyWVd4MVpUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhRdkx5QkpaaUJoSUdodmIyc2dkMkZ6SUhCeWIzWnBaR1ZrSUdkbGRDQjBhR1VnYm05dUxXTnZiWEIxZEdWa0lIWmhiSFZsSUdaeWIyMGdkR2hsY21WY2JseDBYSFJjZEdsbUlDZ2dhRzl2YTNNZ0ppWWdYQ0puWlhSY0lpQnBiaUJvYjI5cmN5QW1KaUFvY21WMElEMGdhRzl2YTNNdVoyVjBLQ0JsYkdWdExDQm1ZV3h6WlN3Z1pYaDBjbUVnS1NrZ0lUMDlJSFZ1WkdWbWFXNWxaQ0FwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhKbGREdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnVDNSb1pYSjNhWE5sSUdwMWMzUWdaMlYwSUhSb1pTQjJZV3gxWlNCbWNtOXRJSFJvWlNCemRIbHNaU0J2WW1wbFkzUmNibHgwWEhSY2RISmxkSFZ5YmlCemRIbHNaVnNnYm1GdFpTQmRPMXh1WEhSY2RIMWNibHgwZlN4Y2JseHVYSFJqYzNNNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCdVlXMWxMQ0JsZUhSeVlTd2djM1I1YkdWeklDa2dlMXh1WEhSY2RIWmhjaUIyWVd3c0lHNTFiU3dnYUc5dmEzTXNYRzVjZEZ4MFhIUnZjbWxuVG1GdFpTQTlJR3BSZFdWeWVTNWpZVzFsYkVOaGMyVW9JRzVoYldVZ0tUdGNibHh1WEhSY2RDOHZJRTFoYTJVZ2MzVnlaU0IwYUdGMElIZGxKM0psSUhkdmNtdHBibWNnZDJsMGFDQjBhR1VnY21sbmFIUWdibUZ0WlZ4dVhIUmNkRzVoYldVZ1BTQnFVWFZsY25rdVkzTnpVSEp2Y0hOYklHOXlhV2RPWVcxbElGMGdmSHdnS0NCcVVYVmxjbmt1WTNOelVISnZjSE5iSUc5eWFXZE9ZVzFsSUYwZ1BTQjJaVzVrYjNKUWNtOXdUbUZ0WlNnZ1pXeGxiUzV6ZEhsc1pTd2diM0pwWjA1aGJXVWdLU0FwTzF4dVhHNWNkRngwTHk4Z1ZISjVJSEJ5WldacGVHVmtJRzVoYldVZ1ptOXNiRzkzWldRZ1lua2dkR2hsSUhWdWNISmxabWw0WldRZ2JtRnRaVnh1WEhSY2RHaHZiMnR6SUQwZ2FsRjFaWEo1TG1OemMwaHZiMnR6V3lCdVlXMWxJRjBnZkh3Z2FsRjFaWEo1TG1OemMwaHZiMnR6V3lCdmNtbG5UbUZ0WlNCZE8xeHVYRzVjZEZ4MEx5OGdTV1lnWVNCb2IyOXJJSGRoY3lCd2NtOTJhV1JsWkNCblpYUWdkR2hsSUdOdmJYQjFkR1ZrSUhaaGJIVmxJR1p5YjIwZ2RHaGxjbVZjYmx4MFhIUnBaaUFvSUdodmIydHpJQ1ltSUZ3aVoyVjBYQ0lnYVc0Z2FHOXZhM01nS1NCN1hHNWNkRngwWEhSMllXd2dQU0JvYjI5cmN5NW5aWFFvSUdWc1pXMHNJSFJ5ZFdVc0lHVjRkSEpoSUNrN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1QzUm9aWEozYVhObExDQnBaaUJoSUhkaGVTQjBieUJuWlhRZ2RHaGxJR052YlhCMWRHVmtJSFpoYkhWbElHVjRhWE4wY3l3Z2RYTmxJSFJvWVhSY2JseDBYSFJwWmlBb0lIWmhiQ0E5UFQwZ2RXNWtaV1pwYm1Wa0lDa2dlMXh1WEhSY2RGeDBkbUZzSUQwZ1kzVnlRMU5US0NCbGJHVnRMQ0J1WVcxbExDQnpkSGxzWlhNZ0tUdGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QkRiMjUyWlhKMElGd2libTl5YldGc1hDSWdkRzhnWTI5dGNIVjBaV1FnZG1Gc2RXVmNibHgwWEhScFppQW9JSFpoYkNBOVBUMGdYQ0p1YjNKdFlXeGNJaUFtSmlCdVlXMWxJR2x1SUdOemMwNXZjbTFoYkZSeVlXNXpabTl5YlNBcElIdGNibHgwWEhSY2RIWmhiQ0E5SUdOemMwNXZjbTFoYkZSeVlXNXpabTl5YlZzZ2JtRnRaU0JkTzF4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUUxaGEyVWdiblZ0WlhKcFl5QnBaaUJtYjNKalpXUWdiM0lnWVNCeGRXRnNhV1pwWlhJZ2QyRnpJSEJ5YjNacFpHVmtJR0Z1WkNCMllXd2diRzl2YTNNZ2JuVnRaWEpwWTF4dVhIUmNkR2xtSUNnZ1pYaDBjbUVnUFQwOUlGd2lYQ0lnZkh3Z1pYaDBjbUVnS1NCN1hHNWNkRngwWEhSdWRXMGdQU0J3WVhKelpVWnNiMkYwS0NCMllXd2dLVHRjYmx4MFhIUmNkSEpsZEhWeWJpQmxlSFJ5WVNBOVBUMGdkSEoxWlNCOGZDQnFVWFZsY25rdWFYTk9kVzFsY21saktDQnVkVzBnS1NBL0lHNTFiU0I4ZkNBd0lEb2dkbUZzTzF4dVhIUmNkSDFjYmx4MFhIUnlaWFIxY200Z2RtRnNPMXh1WEhSOVhHNTlLVHRjYmx4dWFsRjFaWEo1TG1WaFkyZ29XeUJjSW1obGFXZG9kRndpTENCY0luZHBaSFJvWENJZ1hTd2dablZ1WTNScGIyNG9JR2tzSUc1aGJXVWdLU0I3WEc1Y2RHcFJkV1Z5ZVM1amMzTkliMjlyYzFzZ2JtRnRaU0JkSUQwZ2UxeHVYSFJjZEdkbGREb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lHTnZiWEIxZEdWa0xDQmxlSFJ5WVNBcElIdGNibHgwWEhSY2RHbG1JQ2dnWTI5dGNIVjBaV1FnS1NCN1hHNWNibHgwWEhSY2RGeDBMeThnUTJWeWRHRnBiaUJsYkdWdFpXNTBjeUJqWVc0Z2FHRjJaU0JrYVcxbGJuTnBiMjRnYVc1bWJ5QnBaaUIzWlNCcGJuWnBjMmxpYkhrZ2MyaHZkeUIwYUdWdFhHNWNkRngwWEhSY2RDOHZJR0oxZENCcGRDQnRkWE4wSUdoaGRtVWdZU0JqZFhKeVpXNTBJR1JwYzNCc1lYa2djM1I1YkdVZ2RHaGhkQ0IzYjNWc1pDQmlaVzVsWm1sMFhHNWNkRngwWEhSY2RISmxkSFZ5YmlCeVpHbHpjR3hoZVhOM1lYQXVkR1Z6ZENnZ2FsRjFaWEo1TG1OemN5Z2daV3hsYlN3Z1hDSmthWE53YkdGNVhDSWdLU0FwSUNZbUlHVnNaVzB1YjJabWMyVjBWMmxrZEdnZ1BUMDlJREFnUDF4dVhIUmNkRngwWEhSY2RHcFJkV1Z5ZVM1emQyRndLQ0JsYkdWdExDQmpjM05UYUc5M0xDQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUmNkRngwWEhSY2RISmxkSFZ5YmlCblpYUlhhV1IwYUU5eVNHVnBaMmgwS0NCbGJHVnRMQ0J1WVcxbExDQmxlSFJ5WVNBcE8xeHVYSFJjZEZ4MFhIUmNkSDBwSURwY2JseDBYSFJjZEZ4MFhIUm5aWFJYYVdSMGFFOXlTR1ZwWjJoMEtDQmxiR1Z0TENCdVlXMWxMQ0JsZUhSeVlTQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMHNYRzVjYmx4MFhIUnpaWFE2SUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0IyWVd4MVpTd2daWGgwY21FZ0tTQjdYRzVjZEZ4MFhIUjJZWElnYzNSNWJHVnpJRDBnWlhoMGNtRWdKaVlnWjJWMFUzUjViR1Z6S0NCbGJHVnRJQ2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdjMlYwVUc5emFYUnBkbVZPZFcxaVpYSW9JR1ZzWlcwc0lIWmhiSFZsTENCbGVIUnlZU0EvWEc1Y2RGeDBYSFJjZEdGMVoyMWxiblJYYVdSMGFFOXlTR1ZwWjJoMEtGeHVYSFJjZEZ4MFhIUmNkR1ZzWlcwc1hHNWNkRngwWEhSY2RGeDBibUZ0WlN4Y2JseDBYSFJjZEZ4MFhIUmxlSFJ5WVN4Y2JseDBYSFJjZEZ4MFhIUnFVWFZsY25rdVkzTnpLQ0JsYkdWdExDQmNJbUp2ZUZOcGVtbHVaMXdpTENCbVlXeHpaU3dnYzNSNWJHVnpJQ2tnUFQwOUlGd2lZbTl5WkdWeUxXSnZlRndpTEZ4dVhIUmNkRngwWEhSY2RITjBlV3hsYzF4dVhIUmNkRngwWEhRcElEb2dNRnh1WEhSY2RGeDBLVHRjYmx4MFhIUjlYRzVjZEgwN1hHNTlLVHRjYmx4dUx5OGdVM1Z3Y0c5eWREb2dRVzVrY205cFpDQXlMak5jYm1wUmRXVnllUzVqYzNOSWIyOXJjeTV0WVhKbmFXNVNhV2RvZENBOUlHRmtaRWRsZEVodmIydEpaaWdnYzNWd2NHOXlkQzV5Wld4cFlXSnNaVTFoY21kcGJsSnBaMmgwTEZ4dVhIUm1kVzVqZEdsdmJpZ2daV3hsYlN3Z1kyOXRjSFYwWldRZ0tTQjdYRzVjZEZ4MGFXWWdLQ0JqYjIxd2RYUmxaQ0FwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJxVVhWbGNua3VjM2RoY0NnZ1pXeGxiU3dnZXlCY0ltUnBjM0JzWVhsY0lqb2dYQ0pwYm14cGJtVXRZbXh2WTJ0Y0lpQjlMRnh1WEhSY2RGeDBYSFJqZFhKRFUxTXNJRnNnWld4bGJTd2dYQ0p0WVhKbmFXNVNhV2RvZEZ3aUlGMGdLVHRjYmx4MFhIUjlYRzVjZEgxY2JpazdYRzVjYmk4dklGUm9aWE5sSUdodmIydHpJR0Z5WlNCMWMyVmtJR0o1SUdGdWFXMWhkR1VnZEc4Z1pYaHdZVzVrSUhCeWIzQmxjblJwWlhOY2JtcFJkV1Z5ZVM1bFlXTm9LSHRjYmx4MGJXRnlaMmx1T2lCY0lsd2lMRnh1WEhSd1lXUmthVzVuT2lCY0lsd2lMRnh1WEhSaWIzSmtaWEk2SUZ3aVYybGtkR2hjSWx4dWZTd2dablZ1WTNScGIyNG9JSEJ5WldacGVDd2djM1ZtWm1sNElDa2dlMXh1WEhScVVYVmxjbmt1WTNOelNHOXZhM05iSUhCeVpXWnBlQ0FySUhOMVptWnBlQ0JkSUQwZ2UxeHVYSFJjZEdWNGNHRnVaRG9nWm5WdVkzUnBiMjRvSUhaaGJIVmxJQ2tnZTF4dVhIUmNkRngwZG1GeUlHa2dQU0F3TEZ4dVhIUmNkRngwWEhSbGVIQmhibVJsWkNBOUlIdDlMRnh1WEc1Y2RGeDBYSFJjZEM4dklFRnpjM1Z0WlhNZ1lTQnphVzVuYkdVZ2JuVnRZbVZ5SUdsbUlHNXZkQ0JoSUhOMGNtbHVaMXh1WEhSY2RGeDBYSFJ3WVhKMGN5QTlJSFI1Y0dWdlppQjJZV3gxWlNBOVBUMGdYQ0p6ZEhKcGJtZGNJaUEvSUhaaGJIVmxMbk53YkdsMEtGd2lJRndpS1NBNklGc2dkbUZzZFdVZ1hUdGNibHh1WEhSY2RGeDBabTl5SUNnZ095QnBJRHdnTkRzZ2FTc3JJQ2tnZTF4dVhIUmNkRngwWEhSbGVIQmhibVJsWkZzZ2NISmxabWw0SUNzZ1kzTnpSWGh3WVc1a1d5QnBJRjBnS3lCemRXWm1hWGdnWFNBOVhHNWNkRngwWEhSY2RGeDBjR0Z5ZEhOYklHa2dYU0I4ZkNCd1lYSjBjMXNnYVNBdElESWdYU0I4ZkNCd1lYSjBjMXNnTUNCZE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z1pYaHdZVzVrWldRN1hHNWNkRngwZlZ4dVhIUjlPMXh1WEc1Y2RHbG1JQ2dnSVhKdFlYSm5hVzR1ZEdWemRDZ2djSEpsWm1sNElDa2dLU0I3WEc1Y2RGeDBhbEYxWlhKNUxtTnpjMGh2YjJ0eld5QndjbVZtYVhnZ0t5QnpkV1ptYVhnZ1hTNXpaWFFnUFNCelpYUlFiM05wZEdsMlpVNTFiV0psY2p0Y2JseDBmVnh1ZlNrN1hHNWNibXBSZFdWeWVTNW1iaTVsZUhSbGJtUW9lMXh1WEhSamMzTTZJR1oxYm1OMGFXOXVLQ0J1WVcxbExDQjJZV3gxWlNBcElIdGNibHgwWEhSeVpYUjFjbTRnWVdOalpYTnpLQ0IwYUdsekxDQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2JtRnRaU3dnZG1Gc2RXVWdLU0I3WEc1Y2RGeDBYSFIyWVhJZ2MzUjViR1Z6TENCc1pXNHNYRzVjZEZ4MFhIUmNkRzFoY0NBOUlIdDlMRnh1WEhSY2RGeDBYSFJwSUQwZ01EdGNibHh1WEhSY2RGeDBhV1lnS0NCcVVYVmxjbmt1YVhOQmNuSmhlU2dnYm1GdFpTQXBJQ2tnZTF4dVhIUmNkRngwWEhSemRIbHNaWE1nUFNCblpYUlRkSGxzWlhNb0lHVnNaVzBnS1R0Y2JseDBYSFJjZEZ4MGJHVnVJRDBnYm1GdFpTNXNaVzVuZEdnN1hHNWNibHgwWEhSY2RGeDBabTl5SUNnZ095QnBJRHdnYkdWdU95QnBLeXNnS1NCN1hHNWNkRngwWEhSY2RGeDBiV0Z3V3lCdVlXMWxXeUJwSUYwZ1hTQTlJR3BSZFdWeWVTNWpjM01vSUdWc1pXMHNJRzVoYldWYklHa2dYU3dnWm1Gc2MyVXNJSE4wZVd4bGN5QXBPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUcxaGNEdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlIWmhiSFZsSUNFOVBTQjFibVJsWm1sdVpXUWdQMXh1WEhSY2RGeDBYSFJxVVhWbGNua3VjM1I1YkdVb0lHVnNaVzBzSUc1aGJXVXNJSFpoYkhWbElDa2dPbHh1WEhSY2RGeDBYSFJxVVhWbGNua3VZM056S0NCbGJHVnRMQ0J1WVcxbElDazdYRzVjZEZ4MGZTd2dibUZ0WlN3Z2RtRnNkV1VzSUdGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGlBeElDazdYRzVjZEgwc1hHNWNkSE5vYjNjNklHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RISmxkSFZ5YmlCemFHOTNTR2xrWlNnZ2RHaHBjeXdnZEhKMVpTQXBPMXh1WEhSOUxGeHVYSFJvYVdSbE9pQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUnlaWFIxY200Z2MyaHZkMGhwWkdVb0lIUm9hWE1nS1R0Y2JseDBmU3hjYmx4MGRHOW5aMnhsT2lCbWRXNWpkR2x2YmlnZ2MzUmhkR1VnS1NCN1hHNWNkRngwYVdZZ0tDQjBlWEJsYjJZZ2MzUmhkR1VnUFQwOUlGd2lZbTl2YkdWaGJsd2lJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJSE4wWVhSbElEOGdkR2hwY3k1emFHOTNLQ2tnT2lCMGFHbHpMbWhwWkdVb0tUdGNibHgwWEhSOVhHNWNibHgwWEhSeVpYUjFjbTRnZEdocGN5NWxZV05vS0daMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEZ4MGFXWWdLQ0JwYzBocFpHUmxiaWdnZEdocGN5QXBJQ2tnZTF4dVhIUmNkRngwWEhScVVYVmxjbmtvSUhSb2FYTWdLUzV6YUc5M0tDazdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUnFVWFZsY25rb0lIUm9hWE1nS1M1b2FXUmxLQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmU2s3WEc1Y2RIMWNibjBwTzF4dVhHNWNibVoxYm1OMGFXOXVJRlIzWldWdUtDQmxiR1Z0TENCdmNIUnBiMjV6TENCd2NtOXdMQ0JsYm1Rc0lHVmhjMmx1WnlBcElIdGNibHgwY21WMGRYSnVJRzVsZHlCVWQyVmxiaTV3Y205MGIzUjVjR1V1YVc1cGRDZ2daV3hsYlN3Z2IzQjBhVzl1Y3l3Z2NISnZjQ3dnWlc1a0xDQmxZWE5wYm1jZ0tUdGNibjFjYm1wUmRXVnllUzVVZDJWbGJpQTlJRlIzWldWdU8xeHVYRzVVZDJWbGJpNXdjbTkwYjNSNWNHVWdQU0I3WEc1Y2RHTnZibk4wY25WamRHOXlPaUJVZDJWbGJpeGNibHgwYVc1cGREb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lHOXdkR2x2Ym5Nc0lIQnliM0FzSUdWdVpDd2daV0Z6YVc1bkxDQjFibWwwSUNrZ2UxeHVYSFJjZEhSb2FYTXVaV3hsYlNBOUlHVnNaVzA3WEc1Y2RGeDBkR2hwY3k1d2NtOXdJRDBnY0hKdmNEdGNibHgwWEhSMGFHbHpMbVZoYzJsdVp5QTlJR1ZoYzJsdVp5QjhmQ0JjSW5OM2FXNW5YQ0k3WEc1Y2RGeDBkR2hwY3k1dmNIUnBiMjV6SUQwZ2IzQjBhVzl1Y3p0Y2JseDBYSFIwYUdsekxuTjBZWEowSUQwZ2RHaHBjeTV1YjNjZ1BTQjBhR2x6TG1OMWNpZ3BPMXh1WEhSY2RIUm9hWE11Wlc1a0lEMGdaVzVrTzF4dVhIUmNkSFJvYVhNdWRXNXBkQ0E5SUhWdWFYUWdmSHdnS0NCcVVYVmxjbmt1WTNOelRuVnRZbVZ5V3lCd2NtOXdJRjBnUHlCY0lsd2lJRG9nWENKd2VGd2lJQ2s3WEc1Y2RIMHNYRzVjZEdOMWNqb2dablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBkbUZ5SUdodmIydHpJRDBnVkhkbFpXNHVjSEp2Y0VodmIydHpXeUIwYUdsekxuQnliM0FnWFR0Y2JseHVYSFJjZEhKbGRIVnliaUJvYjI5cmN5QW1KaUJvYjI5cmN5NW5aWFFnUDF4dVhIUmNkRngwYUc5dmEzTXVaMlYwS0NCMGFHbHpJQ2tnT2x4dVhIUmNkRngwVkhkbFpXNHVjSEp2Y0VodmIydHpMbDlrWldaaGRXeDBMbWRsZENnZ2RHaHBjeUFwTzF4dVhIUjlMRnh1WEhSeWRXNDZJR1oxYm1OMGFXOXVLQ0J3WlhKalpXNTBJQ2tnZTF4dVhIUmNkSFpoY2lCbFlYTmxaQ3hjYmx4MFhIUmNkR2h2YjJ0eklEMGdWSGRsWlc0dWNISnZjRWh2YjJ0eld5QjBhR2x6TG5CeWIzQWdYVHRjYmx4dVhIUmNkR2xtSUNnZ2RHaHBjeTV2Y0hScGIyNXpMbVIxY21GMGFXOXVJQ2tnZTF4dVhIUmNkRngwZEdocGN5NXdiM01nUFNCbFlYTmxaQ0E5SUdwUmRXVnllUzVsWVhOcGJtZGJJSFJvYVhNdVpXRnphVzVuSUYwb1hHNWNkRngwWEhSY2RIQmxjbU5sYm5Rc0lIUm9hWE11YjNCMGFXOXVjeTVrZFhKaGRHbHZiaUFxSUhCbGNtTmxiblFzSURBc0lERXNJSFJvYVhNdWIzQjBhVzl1Y3k1a2RYSmhkR2x2Ymx4dVhIUmNkRngwS1R0Y2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBkR2hwY3k1d2IzTWdQU0JsWVhObFpDQTlJSEJsY21ObGJuUTdYRzVjZEZ4MGZWeHVYSFJjZEhSb2FYTXVibTkzSUQwZ0tDQjBhR2x6TG1WdVpDQXRJSFJvYVhNdWMzUmhjblFnS1NBcUlHVmhjMlZrSUNzZ2RHaHBjeTV6ZEdGeWREdGNibHh1WEhSY2RHbG1JQ2dnZEdocGN5NXZjSFJwYjI1ekxuTjBaWEFnS1NCN1hHNWNkRngwWEhSMGFHbHpMbTl3ZEdsdmJuTXVjM1JsY0M1allXeHNLQ0IwYUdsekxtVnNaVzBzSUhSb2FYTXVibTkzTENCMGFHbHpJQ2s3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBhV1lnS0NCb2IyOXJjeUFtSmlCb2IyOXJjeTV6WlhRZ0tTQjdYRzVjZEZ4MFhIUm9iMjlyY3k1elpYUW9JSFJvYVhNZ0tUdGNibHgwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwVkhkbFpXNHVjSEp2Y0VodmIydHpMbDlrWldaaGRXeDBMbk5sZENnZ2RHaHBjeUFwTzF4dVhIUmNkSDFjYmx4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MGZWeHVmVHRjYmx4dVZIZGxaVzR1Y0hKdmRHOTBlWEJsTG1sdWFYUXVjSEp2ZEc5MGVYQmxJRDBnVkhkbFpXNHVjSEp2ZEc5MGVYQmxPMXh1WEc1VWQyVmxiaTV3Y205d1NHOXZhM01nUFNCN1hHNWNkRjlrWldaaGRXeDBPaUI3WEc1Y2RGeDBaMlYwT2lCbWRXNWpkR2x2YmlnZ2RIZGxaVzRnS1NCN1hHNWNkRngwWEhSMllYSWdjbVZ6ZFd4ME8xeHVYRzVjZEZ4MFhIUnBaaUFvSUhSM1pXVnVMbVZzWlcxYklIUjNaV1Z1TG5CeWIzQWdYU0FoUFNCdWRXeHNJQ1ltWEc1Y2RGeDBYSFJjZENnaGRIZGxaVzR1Wld4bGJTNXpkSGxzWlNCOGZDQjBkMlZsYmk1bGJHVnRMbk4wZVd4bFd5QjBkMlZsYmk1d2NtOXdJRjBnUFQwZ2JuVnNiQ2tnS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGQyVmxiaTVsYkdWdFd5QjBkMlZsYmk1d2NtOXdJRjA3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklGQmhjM05wYm1jZ1lXNGdaVzF3ZEhrZ2MzUnlhVzVuSUdGeklHRWdNM0prSUhCaGNtRnRaWFJsY2lCMGJ5QXVZM056SUhkcGJHd2dZWFYwYjIxaGRHbGpZV3hzZVZ4dVhIUmNkRngwTHk4Z1lYUjBaVzF3ZENCaElIQmhjbk5sUm14dllYUWdZVzVrSUdaaGJHeGlZV05ySUhSdklHRWdjM1J5YVc1bklHbG1JSFJvWlNCd1lYSnpaU0JtWVdsc2N5NWNibHgwWEhSY2RDOHZJRk5wYlhCc1pTQjJZV3gxWlhNZ2MzVmphQ0JoY3lCY0lqRXdjSGhjSWlCaGNtVWdjR0Z5YzJWa0lIUnZJRVpzYjJGME8xeHVYSFJjZEZ4MEx5OGdZMjl0Y0d4bGVDQjJZV3gxWlhNZ2MzVmphQ0JoY3lCY0luSnZkR0YwWlNneGNtRmtLVndpSUdGeVpTQnlaWFIxY201bFpDQmhjeTFwY3k1Y2JseDBYSFJjZEhKbGMzVnNkQ0E5SUdwUmRXVnllUzVqYzNNb0lIUjNaV1Z1TG1Wc1pXMHNJSFIzWldWdUxuQnliM0FzSUZ3aVhDSWdLVHRjYmx4MFhIUmNkQzh2SUVWdGNIUjVJSE4wY21sdVozTXNJRzUxYkd3c0lIVnVaR1ZtYVc1bFpDQmhibVFnWENKaGRYUnZYQ0lnWVhKbElHTnZiblpsY25SbFpDQjBieUF3TGx4dVhIUmNkRngwY21WMGRYSnVJQ0Z5WlhOMWJIUWdmSHdnY21WemRXeDBJRDA5UFNCY0ltRjFkRzljSWlBL0lEQWdPaUJ5WlhOMWJIUTdYRzVjZEZ4MGZTeGNibHgwWEhSelpYUTZJR1oxYm1OMGFXOXVLQ0IwZDJWbGJpQXBJSHRjYmx4MFhIUmNkQzh2SUZWelpTQnpkR1Z3SUdodmIyc2dabTl5SUdKaFkyc2dZMjl0Y0dGMExseHVYSFJjZEZ4MEx5OGdWWE5sSUdOemMwaHZiMnNnYVdZZ2FYUnpJSFJvWlhKbExseHVYSFJjZEZ4MEx5OGdWWE5sSUM1emRIbHNaU0JwWmlCaGRtRnBiR0ZpYkdVZ1lXNWtJSFZ6WlNCd2JHRnBiaUJ3Y205d1pYSjBhV1Z6SUhkb1pYSmxJR0YyWVdsc1lXSnNaUzVjYmx4MFhIUmNkR2xtSUNnZ2FsRjFaWEo1TG1aNExuTjBaWEJiSUhSM1pXVnVMbkJ5YjNBZ1hTQXBJSHRjYmx4MFhIUmNkRngwYWxGMVpYSjVMbVo0TG5OMFpYQmJJSFIzWldWdUxuQnliM0FnWFNnZ2RIZGxaVzRnS1R0Y2JseDBYSFJjZEgwZ1pXeHpaU0JwWmlBb0lIUjNaV1Z1TG1Wc1pXMHVjM1I1YkdVZ0ppWWdLQ0IwZDJWbGJpNWxiR1Z0TG5OMGVXeGxXeUJxVVhWbGNua3VZM056VUhKdmNITmJJSFIzWldWdUxuQnliM0FnWFNCZElDRTlJRzUxYkd3Z2ZId2dhbEYxWlhKNUxtTnpjMGh2YjJ0eld5QjBkMlZsYmk1d2NtOXdJRjBnS1NBcElIdGNibHgwWEhSY2RGeDBhbEYxWlhKNUxuTjBlV3hsS0NCMGQyVmxiaTVsYkdWdExDQjBkMlZsYmk1d2NtOXdMQ0IwZDJWbGJpNXViM2NnS3lCMGQyVmxiaTUxYm1sMElDazdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUjBkMlZsYmk1bGJHVnRXeUIwZDJWbGJpNXdjbTl3SUYwZ1BTQjBkMlZsYmk1dWIzYzdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYSFI5WEc1OU8xeHVYRzR2THlCVGRYQndiM0owT2lCSlJUbGNiaTh2SUZCaGJtbGpJR0poYzJWa0lHRndjSEp2WVdOb0lIUnZJSE5sZEhScGJtY2dkR2hwYm1keklHOXVJR1JwYzJOdmJtNWxZM1JsWkNCdWIyUmxjMXh1VkhkbFpXNHVjSEp2Y0VodmIydHpMbk5qY205c2JGUnZjQ0E5SUZSM1pXVnVMbkJ5YjNCSWIyOXJjeTV6WTNKdmJHeE1aV1owSUQwZ2UxeHVYSFJ6WlhRNklHWjFibU4wYVc5dUtDQjBkMlZsYmlBcElIdGNibHgwWEhScFppQW9JSFIzWldWdUxtVnNaVzB1Ym05a1pWUjVjR1VnSmlZZ2RIZGxaVzR1Wld4bGJTNXdZWEpsYm5ST2IyUmxJQ2tnZTF4dVhIUmNkRngwZEhkbFpXNHVaV3hsYlZzZ2RIZGxaVzR1Y0hKdmNDQmRJRDBnZEhkbFpXNHVibTkzTzF4dVhIUmNkSDFjYmx4MGZWeHVmVHRjYmx4dWFsRjFaWEo1TG1WaGMybHVaeUE5SUh0Y2JseDBiR2x1WldGeU9pQm1kVzVqZEdsdmJpZ2djQ0FwSUh0Y2JseDBYSFJ5WlhSMWNtNGdjRHRjYmx4MGZTeGNibHgwYzNkcGJtYzZJR1oxYm1OMGFXOXVLQ0J3SUNrZ2UxeHVYSFJjZEhKbGRIVnliaUF3TGpVZ0xTQk5ZWFJvTG1OdmN5Z2djQ0FxSUUxaGRHZ3VVRWtnS1NBdklESTdYRzVjZEgxY2JuMDdYRzVjYm1wUmRXVnllUzVtZUNBOUlGUjNaV1Z1TG5CeWIzUnZkSGx3WlM1cGJtbDBPMXh1WEc0dkx5QkNZV05ySUVOdmJYQmhkQ0E4TVM0NElHVjRkR1Z1YzJsdmJpQndiMmx1ZEZ4dWFsRjFaWEo1TG1aNExuTjBaWEFnUFNCN2ZUdGNibHh1WEc1Y2JseHVkbUZ5WEc1Y2RHWjRUbTkzTENCMGFXMWxja2xrTEZ4dVhIUnlabmgwZVhCbGN5QTlJQzllS0Q4NmRHOW5aMnhsZkhOb2IzZDhhR2xrWlNra0x5eGNibHgwY21aNGJuVnRJRDBnYm1WM0lGSmxaMFY0Y0NnZ1hDSmVLRDg2S0ZzckxWMHBQWHdwS0Z3aUlDc2djRzUxYlNBcklGd2lLU2hiWVMxNkpWMHFLU1JjSWl3Z1hDSnBYQ0lnS1N4Y2JseDBjbkoxYmlBOUlDOXhkV1YxWlVodmIydHpKQzhzWEc1Y2RHRnVhVzFoZEdsdmJsQnlaV1pwYkhSbGNuTWdQU0JiSUdSbFptRjFiSFJRY21WbWFXeDBaWElnWFN4Y2JseDBkSGRsWlc1bGNuTWdQU0I3WEc1Y2RGeDBYQ0lxWENJNklGc2dablZ1WTNScGIyNG9JSEJ5YjNBc0lIWmhiSFZsSUNrZ2UxeHVYSFJjZEZ4MGRtRnlJSFIzWldWdUlEMGdkR2hwY3k1amNtVmhkR1ZVZDJWbGJpZ2djSEp2Y0N3Z2RtRnNkV1VnS1N4Y2JseDBYSFJjZEZ4MGRHRnlaMlYwSUQwZ2RIZGxaVzR1WTNWeUtDa3NYRzVjZEZ4MFhIUmNkSEJoY25SeklEMGdjbVo0Ym5WdExtVjRaV01vSUhaaGJIVmxJQ2tzWEc1Y2RGeDBYSFJjZEhWdWFYUWdQU0J3WVhKMGN5QW1KaUJ3WVhKMGMxc2dNeUJkSUh4OElDZ2dhbEYxWlhKNUxtTnpjMDUxYldKbGNsc2djSEp2Y0NCZElEOGdYQ0pjSWlBNklGd2ljSGhjSWlBcExGeHVYRzVjZEZ4MFhIUmNkQzh2SUZOMFlYSjBhVzVuSUhaaGJIVmxJR052YlhCMWRHRjBhVzl1SUdseklISmxjWFZwY21Wa0lHWnZjaUJ3YjNSbGJuUnBZV3dnZFc1cGRDQnRhWE50WVhSamFHVnpYRzVjZEZ4MFhIUmNkSE4wWVhKMElEMGdLQ0JxVVhWbGNua3VZM056VG5WdFltVnlXeUJ3Y205d0lGMGdmSHdnZFc1cGRDQWhQVDBnWENKd2VGd2lJQ1ltSUN0MFlYSm5aWFFnS1NBbUpseHVYSFJjZEZ4MFhIUmNkSEptZUc1MWJTNWxlR1ZqS0NCcVVYVmxjbmt1WTNOektDQjBkMlZsYmk1bGJHVnRMQ0J3Y205d0lDa2dLU3hjYmx4MFhIUmNkRngwYzJOaGJHVWdQU0F4TEZ4dVhIUmNkRngwWEhSdFlYaEpkR1Z5WVhScGIyNXpJRDBnTWpBN1hHNWNibHgwWEhSY2RHbG1JQ2dnYzNSaGNuUWdKaVlnYzNSaGNuUmJJRE1nWFNBaFBUMGdkVzVwZENBcElIdGNibHgwWEhSY2RGeDBMeThnVkhKMWMzUWdkVzVwZEhNZ2NtVndiM0owWldRZ1lua2dhbEYxWlhKNUxtTnpjMXh1WEhSY2RGeDBYSFIxYm1sMElEMGdkVzVwZENCOGZDQnpkR0Z5ZEZzZ015QmRPMXh1WEc1Y2RGeDBYSFJjZEM4dklFMWhhMlVnYzNWeVpTQjNaU0IxY0dSaGRHVWdkR2hsSUhSM1pXVnVJSEJ5YjNCbGNuUnBaWE1nYkdGMFpYSWdiMjVjYmx4MFhIUmNkRngwY0dGeWRITWdQU0J3WVhKMGN5QjhmQ0JiWFR0Y2JseHVYSFJjZEZ4MFhIUXZMeUJKZEdWeVlYUnBkbVZzZVNCaGNIQnliM2hwYldGMFpTQm1jbTl0SUdFZ2JtOXVlbVZ5YnlCemRHRnlkR2x1WnlCd2IybHVkRnh1WEhSY2RGeDBYSFJ6ZEdGeWRDQTlJQ3QwWVhKblpYUWdmSHdnTVR0Y2JseHVYSFJjZEZ4MFhIUmtieUI3WEc1Y2RGeDBYSFJjZEZ4MEx5OGdTV1lnY0hKbGRtbHZkWE1nYVhSbGNtRjBhVzl1SUhwbGNtOWxaQ0J2ZFhRc0lHUnZkV0pzWlNCMWJuUnBiQ0IzWlNCblpYUWdLbk52YldWMGFHbHVaeW91WEc1Y2RGeDBYSFJjZEZ4MEx5OGdWWE5sSUhOMGNtbHVaeUJtYjNJZ1pHOTFZbXhwYm1jZ2MyOGdkMlVnWkc5dUozUWdZV05qYVdSbGJuUmhiR3g1SUhObFpTQnpZMkZzWlNCaGN5QjFibU5vWVc1blpXUWdZbVZzYjNkY2JseDBYSFJjZEZ4MFhIUnpZMkZzWlNBOUlITmpZV3hsSUh4OElGd2lMalZjSWp0Y2JseHVYSFJjZEZ4MFhIUmNkQzh2SUVGa2FuVnpkQ0JoYm1RZ1lYQndiSGxjYmx4MFhIUmNkRngwWEhSemRHRnlkQ0E5SUhOMFlYSjBJQzhnYzJOaGJHVTdYRzVjZEZ4MFhIUmNkRngwYWxGMVpYSjVMbk4wZVd4bEtDQjBkMlZsYmk1bGJHVnRMQ0J3Y205d0xDQnpkR0Z5ZENBcklIVnVhWFFnS1R0Y2JseHVYSFJjZEZ4MFhIUXZMeUJWY0dSaGRHVWdjMk5oYkdVc0lIUnZiR1Z5WVhScGJtY2dlbVZ5YnlCdmNpQk9ZVTRnWm5KdmJTQjBkMlZsYmk1amRYSW9LU3hjYmx4MFhIUmNkRngwTHk4Z1luSmxZV3NnZEdobElHeHZiM0FnYVdZZ2MyTmhiR1VnYVhNZ2RXNWphR0Z1WjJWa0lHOXlJSEJsY21abFkzUXNJRzl5SUdsbUlIZGxKM1psSUdwMWMzUWdhR0ZrSUdWdWIzVm5hRnh1WEhSY2RGeDBYSFI5SUhkb2FXeGxJQ2dnYzJOaGJHVWdJVDA5SUNoelkyRnNaU0E5SUhSM1pXVnVMbU4xY2lncElDOGdkR0Z5WjJWMEtTQW1KaUJ6WTJGc1pTQWhQVDBnTVNBbUppQXRMVzFoZUVsMFpYSmhkR2x2Ym5NZ0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnVlhCa1lYUmxJSFIzWldWdUlIQnliM0JsY25ScFpYTmNibHgwWEhSY2RHbG1JQ2dnY0dGeWRITWdLU0I3WEc1Y2RGeDBYSFJjZEhOMFlYSjBJRDBnZEhkbFpXNHVjM1JoY25RZ1BTQXJjM1JoY25RZ2ZId2dLM1JoY21kbGRDQjhmQ0F3TzF4dVhIUmNkRngwWEhSMGQyVmxiaTUxYm1sMElEMGdkVzVwZER0Y2JseDBYSFJjZEZ4MEx5OGdTV1lnWVNBclBTOHRQU0IwYjJ0bGJpQjNZWE1nY0hKdmRtbGtaV1FzSUhkbEozSmxJR1J2YVc1bklHRWdjbVZzWVhScGRtVWdZVzVwYldGMGFXOXVYRzVjZEZ4MFhIUmNkSFIzWldWdUxtVnVaQ0E5SUhCaGNuUnpXeUF4SUYwZ1AxeHVYSFJjZEZ4MFhIUmNkSE4wWVhKMElDc2dLQ0J3WVhKMGMxc2dNU0JkSUNzZ01TQXBJQ29nY0dGeWRITmJJRElnWFNBNlhHNWNkRngwWEhSY2RGeDBLM0JoY25Seld5QXlJRjA3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhKbGRIVnliaUIwZDJWbGJqdGNibHgwWEhSOUlGMWNibHgwZlR0Y2JseHVMeThnUVc1cGJXRjBhVzl1Y3lCamNtVmhkR1ZrSUhONWJtTm9jbTl1YjNWemJIa2dkMmxzYkNCeWRXNGdjM2x1WTJoeWIyNXZkWE5zZVZ4dVpuVnVZM1JwYjI0Z1kzSmxZWFJsUm5oT2IzY29LU0I3WEc1Y2RITmxkRlJwYldWdmRYUW9ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBabmhPYjNjZ1BTQjFibVJsWm1sdVpXUTdYRzVjZEgwcE8xeHVYSFJ5WlhSMWNtNGdLQ0JtZUU1dmR5QTlJR3BSZFdWeWVTNXViM2NvS1NBcE8xeHVmVnh1WEc0dkx5QkhaVzVsY21GMFpTQndZWEpoYldWMFpYSnpJSFJ2SUdOeVpXRjBaU0JoSUhOMFlXNWtZWEprSUdGdWFXMWhkR2x2Ymx4dVpuVnVZM1JwYjI0Z1oyVnVSbmdvSUhSNWNHVXNJR2x1WTJ4MVpHVlhhV1IwYUNBcElIdGNibHgwZG1GeUlIZG9hV05vTEZ4dVhIUmNkR2tnUFNBd0xGeHVYSFJjZEdGMGRISnpJRDBnZXlCb1pXbG5hSFE2SUhSNWNHVWdmVHRjYmx4dVhIUXZMeUJKWmlCM1pTQnBibU5zZFdSbElIZHBaSFJvTENCemRHVndJSFpoYkhWbElHbHpJREVnZEc4Z1pHOGdZV3hzSUdOemMwVjRjR0Z1WkNCMllXeDFaWE1zWEc1Y2RDOHZJRzkwYUdWeWQybHpaU0J6ZEdWd0lIWmhiSFZsSUdseklESWdkRzhnYzJ0cGNDQnZkbVZ5SUV4bFpuUWdZVzVrSUZKcFoyaDBYRzVjZEdsdVkyeDFaR1ZYYVdSMGFDQTlJR2x1WTJ4MVpHVlhhV1IwYUNBL0lERWdPaUF3TzF4dVhIUm1iM0lnS0NBN0lHa2dQQ0EwSURzZ2FTQXJQU0F5SUMwZ2FXNWpiSFZrWlZkcFpIUm9JQ2tnZTF4dVhIUmNkSGRvYVdOb0lEMGdZM056Ulhod1lXNWtXeUJwSUYwN1hHNWNkRngwWVhSMGNuTmJJRndpYldGeVoybHVYQ0lnS3lCM2FHbGphQ0JkSUQwZ1lYUjBjbk5iSUZ3aWNHRmtaR2x1WjF3aUlDc2dkMmhwWTJnZ1hTQTlJSFI1Y0dVN1hHNWNkSDFjYmx4dVhIUnBaaUFvSUdsdVkyeDFaR1ZYYVdSMGFDQXBJSHRjYmx4MFhIUmhkSFJ5Y3k1dmNHRmphWFI1SUQwZ1lYUjBjbk11ZDJsa2RHZ2dQU0IwZVhCbE8xeHVYSFI5WEc1Y2JseDBjbVYwZFhKdUlHRjBkSEp6TzF4dWZWeHVYRzVtZFc1amRHbHZiaUJqY21WaGRHVlVkMlZsYmlnZ2RtRnNkV1VzSUhCeWIzQXNJR0Z1YVcxaGRHbHZiaUFwSUh0Y2JseDBkbUZ5SUhSM1pXVnVMRnh1WEhSY2RHTnZiR3hsWTNScGIyNGdQU0FvSUhSM1pXVnVaWEp6V3lCd2NtOXdJRjBnZkh3Z1cxMGdLUzVqYjI1allYUW9JSFIzWldWdVpYSnpXeUJjSWlwY0lpQmRJQ2tzWEc1Y2RGeDBhVzVrWlhnZ1BTQXdMRnh1WEhSY2RHeGxibWQwYUNBOUlHTnZiR3hsWTNScGIyNHViR1Z1WjNSb08xeHVYSFJtYjNJZ0tDQTdJR2x1WkdWNElEd2diR1Z1WjNSb095QnBibVJsZUNzcklDa2dlMXh1WEhSY2RHbG1JQ2dnS0hSM1pXVnVJRDBnWTI5c2JHVmpkR2x2YmxzZ2FXNWtaWGdnWFM1allXeHNLQ0JoYm1sdFlYUnBiMjRzSUhCeWIzQXNJSFpoYkhWbElDa3BJQ2tnZTF4dVhHNWNkRngwWEhRdkx5QlhaU2R5WlNCa2IyNWxJSGRwZEdnZ2RHaHBjeUJ3Y205d1pYSjBlVnh1WEhSY2RGeDBjbVYwZFhKdUlIUjNaV1Z1TzF4dVhIUmNkSDFjYmx4MGZWeHVmVnh1WEc1bWRXNWpkR2x2YmlCa1pXWmhkV3gwVUhKbFptbHNkR1Z5S0NCbGJHVnRMQ0J3Y205d2N5d2diM0IwY3lBcElIdGNibHgwTHlvZ2FuTm9hVzUwSUhaaGJHbGtkR2hwY3pvZ2RISjFaU0FxTDF4dVhIUjJZWElnY0hKdmNDd2dkbUZzZFdVc0lIUnZaMmRzWlN3Z2RIZGxaVzRzSUdodmIydHpMQ0J2YkdSbWFYSmxMQ0JrYVhOd2JHRjVMQ0JqYUdWamEwUnBjM0JzWVhrc1hHNWNkRngwWVc1cGJTQTlJSFJvYVhNc1hHNWNkRngwYjNKcFp5QTlJSHQ5TEZ4dVhIUmNkSE4wZVd4bElEMGdaV3hsYlM1emRIbHNaU3hjYmx4MFhIUm9hV1JrWlc0Z1BTQmxiR1Z0TG01dlpHVlVlWEJsSUNZbUlHbHpTR2xrWkdWdUtDQmxiR1Z0SUNrc1hHNWNkRngwWkdGMFlWTm9iM2NnUFNCa1lYUmhYM0J5YVhZdVoyVjBLQ0JsYkdWdExDQmNJbVo0YzJodmQxd2lJQ2s3WEc1Y2JseDBMeThnU0dGdVpHeGxJSEYxWlhWbE9pQm1ZV3h6WlNCd2NtOXRhWE5sYzF4dVhIUnBaaUFvSUNGdmNIUnpMbkYxWlhWbElDa2dlMXh1WEhSY2RHaHZiMnR6SUQwZ2FsRjFaWEo1TGw5eGRXVjFaVWh2YjJ0ektDQmxiR1Z0TENCY0ltWjRYQ0lnS1R0Y2JseDBYSFJwWmlBb0lHaHZiMnR6TG5WdWNYVmxkV1ZrSUQwOUlHNTFiR3dnS1NCN1hHNWNkRngwWEhSb2IyOXJjeTUxYm5GMVpYVmxaQ0E5SURBN1hHNWNkRngwWEhSdmJHUm1hWEpsSUQwZ2FHOXZhM011Wlcxd2RIa3VabWx5WlR0Y2JseDBYSFJjZEdodmIydHpMbVZ0Y0hSNUxtWnBjbVVnUFNCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RGeDBhV1lnS0NBaGFHOXZhM011ZFc1eGRXVjFaV1FnS1NCN1hHNWNkRngwWEhSY2RGeDBiMnhrWm1seVpTZ3BPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5TzF4dVhIUmNkSDFjYmx4MFhIUm9iMjlyY3k1MWJuRjFaWFZsWkNzck8xeHVYRzVjZEZ4MFlXNXBiUzVoYkhkaGVYTW9ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFF2THlCRmJuTjFjbVVnZEdobElHTnZiWEJzWlhSbElHaGhibVJzWlhJZ2FYTWdZMkZzYkdWa0lHSmxabTl5WlNCMGFHbHpJR052YlhCc1pYUmxjMXh1WEhSY2RGeDBZVzVwYlM1aGJIZGhlWE1vWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwWEhSY2RHaHZiMnR6TG5WdWNYVmxkV1ZrTFMwN1hHNWNkRngwWEhSY2RHbG1JQ2dnSVdwUmRXVnllUzV4ZFdWMVpTZ2daV3hsYlN3Z1hDSm1lRndpSUNrdWJHVnVaM1JvSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR2h2YjJ0ekxtVnRjSFI1TG1acGNtVW9LVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlNrN1hHNWNkRngwZlNrN1hHNWNkSDFjYmx4dVhIUXZMeUJJWldsbmFIUXZkMmxrZEdnZ2IzWmxjbVpzYjNjZ2NHRnpjMXh1WEhScFppQW9JR1ZzWlcwdWJtOWtaVlI1Y0dVZ1BUMDlJREVnSmlZZ0tDQmNJbWhsYVdkb2RGd2lJR2x1SUhCeWIzQnpJSHg4SUZ3aWQybGtkR2hjSWlCcGJpQndjbTl3Y3lBcElDa2dlMXh1WEhSY2RDOHZJRTFoYTJVZ2MzVnlaU0IwYUdGMElHNXZkR2hwYm1jZ2MyNWxZV3R6SUc5MWRGeHVYSFJjZEM4dklGSmxZMjl5WkNCaGJHd2dNeUJ2ZG1WeVpteHZkeUJoZEhSeWFXSjFkR1Z6SUdKbFkyRjFjMlVnU1VVNUxURXdJR1J2SUc1dmRGeHVYSFJjZEM4dklHTm9ZVzVuWlNCMGFHVWdiM1psY21ac2IzY2dZWFIwY21saWRYUmxJSGRvWlc0Z2IzWmxjbVpzYjNkWUlHRnVaRnh1WEhSY2RDOHZJRzkyWlhKbWJHOTNXU0JoY21VZ2MyVjBJSFJ2SUhSb1pTQnpZVzFsSUhaaGJIVmxYRzVjZEZ4MGIzQjBjeTV2ZG1WeVpteHZkeUE5SUZzZ2MzUjViR1V1YjNabGNtWnNiM2NzSUhOMGVXeGxMbTkyWlhKbWJHOTNXQ3dnYzNSNWJHVXViM1psY21ac2IzZFpJRjA3WEc1Y2JseDBYSFF2THlCVFpYUWdaR2x6Y0d4aGVTQndjbTl3WlhKMGVTQjBieUJwYm14cGJtVXRZbXh2WTJzZ1ptOXlJR2hsYVdkb2RDOTNhV1IwYUZ4dVhIUmNkQzh2SUdGdWFXMWhkR2x2Ym5NZ2IyNGdhVzVzYVc1bElHVnNaVzFsYm5SeklIUm9ZWFFnWVhKbElHaGhkbWx1WnlCM2FXUjBhQzlvWldsbmFIUWdZVzVwYldGMFpXUmNibHgwWEhSa2FYTndiR0Y1SUQwZ2FsRjFaWEo1TG1OemN5Z2daV3hsYlN3Z1hDSmthWE53YkdGNVhDSWdLVHRjYmx4dVhIUmNkQzh2SUZSbGMzUWdaR1ZtWVhWc2RDQmthWE53YkdGNUlHbG1JR1JwYzNCc1lYa2dhWE1nWTNWeWNtVnVkR3g1SUZ3aWJtOXVaVndpWEc1Y2RGeDBZMmhsWTJ0RWFYTndiR0Y1SUQwZ1pHbHpjR3hoZVNBOVBUMGdYQ0p1YjI1bFhDSWdQMXh1WEhSY2RGeDBaR0YwWVY5d2NtbDJMbWRsZENnZ1pXeGxiU3dnWENKdmJHUmthWE53YkdGNVhDSWdLU0I4ZkNCa1pXWmhkV3gwUkdsemNHeGhlU2dnWld4bGJTNXViMlJsVG1GdFpTQXBJRG9nWkdsemNHeGhlVHRjYmx4dVhIUmNkR2xtSUNnZ1kyaGxZMnRFYVhOd2JHRjVJRDA5UFNCY0ltbHViR2x1WlZ3aUlDWW1JR3BSZFdWeWVTNWpjM01vSUdWc1pXMHNJRndpWm14dllYUmNJaUFwSUQwOVBTQmNJbTV2Ym1WY0lpQXBJSHRjYmx4MFhIUmNkSE4wZVd4bExtUnBjM0JzWVhrZ1BTQmNJbWx1YkdsdVpTMWliRzlqYTF3aU8xeHVYSFJjZEgxY2JseDBmVnh1WEc1Y2RHbG1JQ2dnYjNCMGN5NXZkbVZ5Wm14dmR5QXBJSHRjYmx4MFhIUnpkSGxzWlM1dmRtVnlabXh2ZHlBOUlGd2lhR2xrWkdWdVhDSTdYRzVjZEZ4MFlXNXBiUzVoYkhkaGVYTW9ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJ6ZEhsc1pTNXZkbVZ5Wm14dmR5QTlJRzl3ZEhNdWIzWmxjbVpzYjNkYklEQWdYVHRjYmx4MFhIUmNkSE4wZVd4bExtOTJaWEptYkc5M1dDQTlJRzl3ZEhNdWIzWmxjbVpzYjNkYklERWdYVHRjYmx4MFhIUmNkSE4wZVd4bExtOTJaWEptYkc5M1dTQTlJRzl3ZEhNdWIzWmxjbVpzYjNkYklESWdYVHRjYmx4MFhIUjlLVHRjYmx4MGZWeHVYRzVjZEM4dklITm9iM2N2YUdsa1pTQndZWE56WEc1Y2RHWnZjaUFvSUhCeWIzQWdhVzRnY0hKdmNITWdLU0I3WEc1Y2RGeDBkbUZzZFdVZ1BTQndjbTl3YzFzZ2NISnZjQ0JkTzF4dVhIUmNkR2xtSUNnZ2NtWjRkSGx3WlhNdVpYaGxZeWdnZG1Gc2RXVWdLU0FwSUh0Y2JseDBYSFJjZEdSbGJHVjBaU0J3Y205d2Mxc2djSEp2Y0NCZE8xeHVYSFJjZEZ4MGRHOW5aMnhsSUQwZ2RHOW5aMnhsSUh4OElIWmhiSFZsSUQwOVBTQmNJblJ2WjJkc1pWd2lPMXh1WEhSY2RGeDBhV1lnS0NCMllXeDFaU0E5UFQwZ0tDQm9hV1JrWlc0Z1B5QmNJbWhwWkdWY0lpQTZJRndpYzJodmQxd2lJQ2tnS1NCN1hHNWNibHgwWEhSY2RGeDBMeThnU1dZZ2RHaGxjbVVnYVhNZ1pHRjBZVk5vYjNjZ2JHVm1kQ0J2ZG1WeUlHWnliMjBnWVNCemRHOXdjR1ZrSUdocFpHVWdiM0lnYzJodmR5QmhibVFnZDJVZ1lYSmxJR2R2YVc1bklIUnZJSEJ5YjJObFpXUWdkMmwwYUNCemFHOTNMQ0IzWlNCemFHOTFiR1FnY0hKbGRHVnVaQ0IwYnlCaVpTQm9hV1JrWlc1Y2JseDBYSFJjZEZ4MGFXWWdLQ0IyWVd4MVpTQTlQVDBnWENKemFHOTNYQ0lnSmlZZ1pHRjBZVk5vYjNjZ0ppWWdaR0YwWVZOb2IzZGJJSEJ5YjNBZ1hTQWhQVDBnZFc1a1pXWnBibVZrSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR2hwWkdSbGJpQTlJSFJ5ZFdVN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBZMjl1ZEdsdWRXVTdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUmNkRzl5YVdkYklIQnliM0FnWFNBOUlHUmhkR0ZUYUc5M0lDWW1JR1JoZEdGVGFHOTNXeUJ3Y205d0lGMGdmSHdnYWxGMVpYSjVMbk4wZVd4bEtDQmxiR1Z0TENCd2NtOXdJQ2s3WEc1Y2JseDBYSFF2THlCQmJua2dibTl1TFdaNElIWmhiSFZsSUhOMGIzQnpJSFZ6SUdaeWIyMGdjbVZ6ZEc5eWFXNW5JSFJvWlNCdmNtbG5hVzVoYkNCa2FYTndiR0Y1SUhaaGJIVmxYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEdScGMzQnNZWGtnUFNCMWJtUmxabWx1WldRN1hHNWNkRngwZlZ4dVhIUjlYRzVjYmx4MGFXWWdLQ0FoYWxGMVpYSjVMbWx6Ulcxd2RIbFBZbXBsWTNRb0lHOXlhV2NnS1NBcElIdGNibHgwWEhScFppQW9JR1JoZEdGVGFHOTNJQ2tnZTF4dVhIUmNkRngwYVdZZ0tDQmNJbWhwWkdSbGJsd2lJR2x1SUdSaGRHRlRhRzkzSUNrZ2UxeHVYSFJjZEZ4MFhIUm9hV1JrWlc0Z1BTQmtZWFJoVTJodmR5NW9hV1JrWlc0N1hHNWNkRngwWEhSOVhHNWNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkR1JoZEdGVGFHOTNJRDBnWkdGMFlWOXdjbWwyTG1GalkyVnpjeWdnWld4bGJTd2dYQ0ptZUhOb2IzZGNJaXdnZTMwZ0tUdGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QlRkRzl5WlNCemRHRjBaU0JwWmlCcGRITWdkRzluWjJ4bElDMGdaVzVoWW14bGN5QXVjM1J2Y0NncExuUnZaMmRzWlNncElIUnZJRndpY21WMlpYSnpaVndpWEc1Y2RGeDBhV1lnS0NCMGIyZG5iR1VnS1NCN1hHNWNkRngwWEhSa1lYUmhVMmh2ZHk1b2FXUmtaVzRnUFNBaGFHbGtaR1Z1TzF4dVhIUmNkSDFjYmx4MFhIUnBaaUFvSUdocFpHUmxiaUFwSUh0Y2JseDBYSFJjZEdwUmRXVnllU2dnWld4bGJTQXBMbk5vYjNjb0tUdGNibHgwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWVc1cGJTNWtiMjVsS0daMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEZ4MFhIUnFVWFZsY25rb0lHVnNaVzBnS1M1b2FXUmxLQ2s3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5WEc1Y2RGeDBZVzVwYlM1a2IyNWxLR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwZG1GeUlIQnliM0E3WEc1Y2JseDBYSFJjZEdSaGRHRmZjSEpwZGk1eVpXMXZkbVVvSUdWc1pXMHNJRndpWm5oemFHOTNYQ0lnS1R0Y2JseDBYSFJjZEdadmNpQW9JSEJ5YjNBZ2FXNGdiM0pwWnlBcElIdGNibHgwWEhSY2RGeDBhbEYxWlhKNUxuTjBlV3hsS0NCbGJHVnRMQ0J3Y205d0xDQnZjbWxuV3lCd2NtOXdJRjBnS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5S1R0Y2JseDBYSFJtYjNJZ0tDQndjbTl3SUdsdUlHOXlhV2NnS1NCN1hHNWNkRngwWEhSMGQyVmxiaUE5SUdOeVpXRjBaVlIzWldWdUtDQm9hV1JrWlc0Z1B5QmtZWFJoVTJodmQxc2djSEp2Y0NCZElEb2dNQ3dnY0hKdmNDd2dZVzVwYlNBcE8xeHVYRzVjZEZ4MFhIUnBaaUFvSUNFb0lIQnliM0FnYVc0Z1pHRjBZVk5vYjNjZ0tTQXBJSHRjYmx4MFhIUmNkRngwWkdGMFlWTm9iM2RiSUhCeWIzQWdYU0E5SUhSM1pXVnVMbk4wWVhKME8xeHVYSFJjZEZ4MFhIUnBaaUFvSUdocFpHUmxiaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUjBkMlZsYmk1bGJtUWdQU0IwZDJWbGJpNXpkR0Z5ZER0Y2JseDBYSFJjZEZ4MFhIUjBkMlZsYmk1emRHRnlkQ0E5SUhCeWIzQWdQVDA5SUZ3aWQybGtkR2hjSWlCOGZDQndjbTl3SUQwOVBTQmNJbWhsYVdkb2RGd2lJRDhnTVNBNklEQTdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjYmx4MEx5OGdTV1lnZEdocGN5QnBjeUJoSUc1dmIzQWdiR2xyWlNBdWFHbGtaU2dwTG1ocFpHVW9LU3dnY21WemRHOXlaU0JoYmlCdmRtVnlkM0pwZEhSbGJpQmthWE53YkdGNUlIWmhiSFZsWEc1Y2RIMGdaV3h6WlNCcFppQW9JQ2hrYVhOd2JHRjVJRDA5UFNCY0ltNXZibVZjSWlBL0lHUmxabUYxYkhSRWFYTndiR0Y1S0NCbGJHVnRMbTV2WkdWT1lXMWxJQ2tnT2lCa2FYTndiR0Y1S1NBOVBUMGdYQ0pwYm14cGJtVmNJaUFwSUh0Y2JseDBYSFJ6ZEhsc1pTNWthWE53YkdGNUlEMGdaR2x6Y0d4aGVUdGNibHgwZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJ3Y205d1JtbHNkR1Z5S0NCd2NtOXdjeXdnYzNCbFkybGhiRVZoYzJsdVp5QXBJSHRjYmx4MGRtRnlJR2x1WkdWNExDQnVZVzFsTENCbFlYTnBibWNzSUhaaGJIVmxMQ0JvYjI5cmN6dGNibHh1WEhRdkx5QmpZVzFsYkVOaGMyVXNJSE53WldOcFlXeEZZWE5wYm1jZ1lXNWtJR1Y0Y0dGdVpDQmpjM05JYjI5cklIQmhjM05jYmx4MFptOXlJQ2dnYVc1a1pYZ2dhVzRnY0hKdmNITWdLU0I3WEc1Y2RGeDBibUZ0WlNBOUlHcFJkV1Z5ZVM1allXMWxiRU5oYzJVb0lHbHVaR1Y0SUNrN1hHNWNkRngwWldGemFXNW5JRDBnYzNCbFkybGhiRVZoYzJsdVoxc2dibUZ0WlNCZE8xeHVYSFJjZEhaaGJIVmxJRDBnY0hKdmNITmJJR2x1WkdWNElGMDdYRzVjZEZ4MGFXWWdLQ0JxVVhWbGNua3VhWE5CY25KaGVTZ2dkbUZzZFdVZ0tTQXBJSHRjYmx4MFhIUmNkR1ZoYzJsdVp5QTlJSFpoYkhWbFd5QXhJRjA3WEc1Y2RGeDBYSFIyWVd4MVpTQTlJSEJ5YjNCeld5QnBibVJsZUNCZElEMGdkbUZzZFdWYklEQWdYVHRjYmx4MFhIUjlYRzVjYmx4MFhIUnBaaUFvSUdsdVpHVjRJQ0U5UFNCdVlXMWxJQ2tnZTF4dVhIUmNkRngwY0hKdmNITmJJRzVoYldVZ1hTQTlJSFpoYkhWbE8xeHVYSFJjZEZ4MFpHVnNaWFJsSUhCeWIzQnpXeUJwYm1SbGVDQmRPMXh1WEhSY2RIMWNibHh1WEhSY2RHaHZiMnR6SUQwZ2FsRjFaWEo1TG1OemMwaHZiMnR6V3lCdVlXMWxJRjA3WEc1Y2RGeDBhV1lnS0NCb2IyOXJjeUFtSmlCY0ltVjRjR0Z1WkZ3aUlHbHVJR2h2YjJ0eklDa2dlMXh1WEhSY2RGeDBkbUZzZFdVZ1BTQm9iMjlyY3k1bGVIQmhibVFvSUhaaGJIVmxJQ2s3WEc1Y2RGeDBYSFJrWld4bGRHVWdjSEp2Y0hOYklHNWhiV1VnWFR0Y2JseHVYSFJjZEZ4MEx5OGdUbTkwSUhGMWFYUmxJQ1F1WlhoMFpXNWtMQ0IwYUdseklIZHZiaWQwSUc5MlpYSjNjbWwwWlNCbGVHbHpkR2x1WnlCclpYbHpMbHh1WEhSY2RGeDBMeThnVW1WMWMybHVaeUFuYVc1a1pYZ25JR0psWTJGMWMyVWdkMlVnYUdGMlpTQjBhR1VnWTI5eWNtVmpkQ0JjSW01aGJXVmNJbHh1WEhSY2RGeDBabTl5SUNnZ2FXNWtaWGdnYVc0Z2RtRnNkV1VnS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2dnSVNnZ2FXNWtaWGdnYVc0Z2NISnZjSE1nS1NBcElIdGNibHgwWEhSY2RGeDBYSFJ3Y205d2Mxc2dhVzVrWlhnZ1hTQTlJSFpoYkhWbFd5QnBibVJsZUNCZE8xeHVYSFJjZEZ4MFhIUmNkSE53WldOcFlXeEZZWE5wYm1kYklHbHVaR1Y0SUYwZ1BTQmxZWE5wYm1jN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwYzNCbFkybGhiRVZoYzJsdVoxc2dibUZ0WlNCZElEMGdaV0Z6YVc1bk8xeHVYSFJjZEgxY2JseDBmVnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQkJibWx0WVhScGIyNG9JR1ZzWlcwc0lIQnliM0JsY25ScFpYTXNJRzl3ZEdsdmJuTWdLU0I3WEc1Y2RIWmhjaUJ5WlhOMWJIUXNYRzVjZEZ4MGMzUnZjSEJsWkN4Y2JseDBYSFJwYm1SbGVDQTlJREFzWEc1Y2RGeDBiR1Z1WjNSb0lEMGdZVzVwYldGMGFXOXVVSEpsWm1sc2RHVnljeTVzWlc1bmRHZ3NYRzVjZEZ4MFpHVm1aWEp5WldRZ1BTQnFVWFZsY25rdVJHVm1aWEp5WldRb0tTNWhiSGRoZVhNb0lHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RGeDBMeThnUkc5dUozUWdiV0YwWTJnZ1pXeGxiU0JwYmlCMGFHVWdPbUZ1YVcxaGRHVmtJSE5sYkdWamRHOXlYRzVjZEZ4MFhIUmtaV3hsZEdVZ2RHbGpheTVsYkdWdE8xeHVYSFJjZEgwcExGeHVYSFJjZEhScFkyc2dQU0JtZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJjZEdsbUlDZ2djM1J2Y0hCbFpDQXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJR1poYkhObE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MGRtRnlJR04xY25KbGJuUlVhVzFsSUQwZ1puaE9iM2NnZkh3Z1kzSmxZWFJsUm5oT2IzY29LU3hjYmx4MFhIUmNkRngwY21WdFlXbHVhVzVuSUQwZ1RXRjBhQzV0WVhnb0lEQXNJR0Z1YVcxaGRHbHZiaTV6ZEdGeWRGUnBiV1VnS3lCaGJtbHRZWFJwYjI0dVpIVnlZWFJwYjI0Z0xTQmpkWEp5Wlc1MFZHbHRaU0FwTEZ4dVhIUmNkRngwWEhRdkx5QlRkWEJ3YjNKME9pQkJibVJ5YjJsa0lESXVNMXh1WEhSY2RGeDBYSFF2THlCQmNtTm9ZV2xqSUdOeVlYTm9JR0oxWnlCM2IyNG5kQ0JoYkd4dmR5QjFjeUIwYnlCMWMyVWdZREVnTFNBb0lEQXVOU0I4ZkNBd0lDbGdJQ2dqTVRJME9UY3BYRzVjZEZ4MFhIUmNkSFJsYlhBZ1BTQnlaVzFoYVc1cGJtY2dMeUJoYm1sdFlYUnBiMjR1WkhWeVlYUnBiMjRnZkh3Z01DeGNibHgwWEhSY2RGeDBjR1Z5WTJWdWRDQTlJREVnTFNCMFpXMXdMRnh1WEhSY2RGeDBYSFJwYm1SbGVDQTlJREFzWEc1Y2RGeDBYSFJjZEd4bGJtZDBhQ0E5SUdGdWFXMWhkR2x2Ymk1MGQyVmxibk11YkdWdVozUm9PMXh1WEc1Y2RGeDBYSFJtYjNJZ0tDQTdJR2x1WkdWNElEd2diR1Z1WjNSb0lEc2dhVzVrWlhnckt5QXBJSHRjYmx4MFhIUmNkRngwWVc1cGJXRjBhVzl1TG5SM1pXVnVjMXNnYVc1a1pYZ2dYUzV5ZFc0b0lIQmxjbU5sYm5RZ0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBaR1ZtWlhKeVpXUXVibTkwYVdaNVYybDBhQ2dnWld4bGJTd2dXeUJoYm1sdFlYUnBiMjRzSUhCbGNtTmxiblFzSUhKbGJXRnBibWx1WnlCZEtUdGNibHh1WEhSY2RGeDBhV1lnS0NCd1pYSmpaVzUwSUR3Z01TQW1KaUJzWlc1bmRHZ2dLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ5WlcxaGFXNXBibWM3WEc1Y2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJrWldabGNuSmxaQzV5WlhOdmJIWmxWMmwwYUNnZ1pXeGxiU3dnV3lCaGJtbHRZWFJwYjI0Z1hTQXBPMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdabUZzYzJVN1hHNWNkRngwWEhSOVhHNWNkRngwZlN4Y2JseDBYSFJoYm1sdFlYUnBiMjRnUFNCa1pXWmxjbkpsWkM1d2NtOXRhWE5sS0h0Y2JseDBYSFJjZEdWc1pXMDZJR1ZzWlcwc1hHNWNkRngwWEhSd2NtOXdjem9nYWxGMVpYSjVMbVY0ZEdWdVpDZ2dlMzBzSUhCeWIzQmxjblJwWlhNZ0tTeGNibHgwWEhSY2RHOXdkSE02SUdwUmRXVnllUzVsZUhSbGJtUW9JSFJ5ZFdVc0lIc2djM0JsWTJsaGJFVmhjMmx1WnpvZ2UzMGdmU3dnYjNCMGFXOXVjeUFwTEZ4dVhIUmNkRngwYjNKcFoybHVZV3hRY205d1pYSjBhV1Z6T2lCd2NtOXdaWEowYVdWekxGeHVYSFJjZEZ4MGIzSnBaMmx1WVd4UGNIUnBiMjV6T2lCdmNIUnBiMjV6TEZ4dVhIUmNkRngwYzNSaGNuUlVhVzFsT2lCbWVFNXZkeUI4ZkNCamNtVmhkR1ZHZUU1dmR5Z3BMRnh1WEhSY2RGeDBaSFZ5WVhScGIyNDZJRzl3ZEdsdmJuTXVaSFZ5WVhScGIyNHNYRzVjZEZ4MFhIUjBkMlZsYm5NNklGdGRMRnh1WEhSY2RGeDBZM0psWVhSbFZIZGxaVzQ2SUdaMWJtTjBhVzl1S0NCd2NtOXdMQ0JsYm1RZ0tTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCMGQyVmxiaUE5SUdwUmRXVnllUzVVZDJWbGJpZ2daV3hsYlN3Z1lXNXBiV0YwYVc5dUxtOXdkSE1zSUhCeWIzQXNJR1Z1WkN4Y2JseDBYSFJjZEZ4MFhIUmNkR0Z1YVcxaGRHbHZiaTV2Y0hSekxuTndaV05wWVd4RllYTnBibWRiSUhCeWIzQWdYU0I4ZkNCaGJtbHRZWFJwYjI0dWIzQjBjeTVsWVhOcGJtY2dLVHRjYmx4MFhIUmNkRngwWVc1cGJXRjBhVzl1TG5SM1pXVnVjeTV3ZFhOb0tDQjBkMlZsYmlBcE8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIZGxaVzQ3WEc1Y2RGeDBYSFI5TEZ4dVhIUmNkRngwYzNSdmNEb2dablZ1WTNScGIyNG9JR2R2ZEc5RmJtUWdLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnBibVJsZUNBOUlEQXNYRzVjZEZ4MFhIUmNkRngwTHk4Z1NXWWdkMlVnWVhKbElHZHZhVzVuSUhSdklIUm9aU0JsYm1Rc0lIZGxJSGRoYm5RZ2RHOGdjblZ1SUdGc2JDQjBhR1VnZEhkbFpXNXpYRzVjZEZ4MFhIUmNkRngwTHk4Z2IzUm9aWEozYVhObElIZGxJSE5yYVhBZ2RHaHBjeUJ3WVhKMFhHNWNkRngwWEhSY2RGeDBiR1Z1WjNSb0lEMGdaMjkwYjBWdVpDQS9JR0Z1YVcxaGRHbHZiaTUwZDJWbGJuTXViR1Z1WjNSb0lEb2dNRHRjYmx4MFhIUmNkRngwYVdZZ0tDQnpkRzl3Y0dWa0lDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUIwYUdsek8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSE4wYjNCd1pXUWdQU0IwY25WbE8xeHVYSFJjZEZ4MFhIUm1iM0lnS0NBN0lHbHVaR1Y0SUR3Z2JHVnVaM1JvSURzZ2FXNWtaWGdyS3lBcElIdGNibHgwWEhSY2RGeDBYSFJoYm1sdFlYUnBiMjR1ZEhkbFpXNXpXeUJwYm1SbGVDQmRMbkoxYmlnZ01TQXBPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MEx5OGdVbVZ6YjJ4MlpTQjNhR1Z1SUhkbElIQnNZWGxsWkNCMGFHVWdiR0Z6ZENCbWNtRnRaVHNnYjNSb1pYSjNhWE5sTENCeVpXcGxZM1JjYmx4MFhIUmNkRngwYVdZZ0tDQm5iM1J2Ulc1a0lDa2dlMXh1WEhSY2RGeDBYSFJjZEdSbFptVnljbVZrTG5KbGMyOXNkbVZYYVhSb0tDQmxiR1Z0TENCYklHRnVhVzFoZEdsdmJpd2daMjkwYjBWdVpDQmRJQ2s3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MFpHVm1aWEp5WldRdWNtVnFaV04wVjJsMGFDZ2daV3hsYlN3Z1d5QmhibWx0WVhScGIyNHNJR2R2ZEc5RmJtUWdYU0FwTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGFHbHpPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMHBMRnh1WEhSY2RIQnliM0J6SUQwZ1lXNXBiV0YwYVc5dUxuQnliM0J6TzF4dVhHNWNkSEJ5YjNCR2FXeDBaWElvSUhCeWIzQnpMQ0JoYm1sdFlYUnBiMjR1YjNCMGN5NXpjR1ZqYVdGc1JXRnphVzVuSUNrN1hHNWNibHgwWm05eUlDZ2dPeUJwYm1SbGVDQThJR3hsYm1kMGFDQTdJR2x1WkdWNEt5c2dLU0I3WEc1Y2RGeDBjbVZ6ZFd4MElEMGdZVzVwYldGMGFXOXVVSEpsWm1sc2RHVnljMXNnYVc1a1pYZ2dYUzVqWVd4c0tDQmhibWx0WVhScGIyNHNJR1ZzWlcwc0lIQnliM0J6TENCaGJtbHRZWFJwYjI0dWIzQjBjeUFwTzF4dVhIUmNkR2xtSUNnZ2NtVnpkV3gwSUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhKbGMzVnNkRHRjYmx4MFhIUjlYRzVjZEgxY2JseHVYSFJxVVhWbGNua3ViV0Z3S0NCd2NtOXdjeXdnWTNKbFlYUmxWSGRsWlc0c0lHRnVhVzFoZEdsdmJpQXBPMXh1WEc1Y2RHbG1JQ2dnYWxGMVpYSjVMbWx6Um5WdVkzUnBiMjRvSUdGdWFXMWhkR2x2Ymk1dmNIUnpMbk4wWVhKMElDa2dLU0I3WEc1Y2RGeDBZVzVwYldGMGFXOXVMbTl3ZEhNdWMzUmhjblF1WTJGc2JDZ2daV3hsYlN3Z1lXNXBiV0YwYVc5dUlDazdYRzVjZEgxY2JseHVYSFJxVVhWbGNua3Vabmd1ZEdsdFpYSW9YRzVjZEZ4MGFsRjFaWEo1TG1WNGRHVnVaQ2dnZEdsamF5d2dlMXh1WEhSY2RGeDBaV3hsYlRvZ1pXeGxiU3hjYmx4MFhIUmNkR0Z1YVcwNklHRnVhVzFoZEdsdmJpeGNibHgwWEhSY2RIRjFaWFZsT2lCaGJtbHRZWFJwYjI0dWIzQjBjeTV4ZFdWMVpWeHVYSFJjZEgwcFhHNWNkQ2s3WEc1Y2JseDBMeThnWVhSMFlXTm9JR05oYkd4aVlXTnJjeUJtY205dElHOXdkR2x2Ym5OY2JseDBjbVYwZFhKdUlHRnVhVzFoZEdsdmJpNXdjbTluY21WemN5Z2dZVzVwYldGMGFXOXVMbTl3ZEhNdWNISnZaM0psYzNNZ0tWeHVYSFJjZEM1a2IyNWxLQ0JoYm1sdFlYUnBiMjR1YjNCMGN5NWtiMjVsTENCaGJtbHRZWFJwYjI0dWIzQjBjeTVqYjIxd2JHVjBaU0FwWEc1Y2RGeDBMbVpoYVd3b0lHRnVhVzFoZEdsdmJpNXZjSFJ6TG1aaGFXd2dLVnh1WEhSY2RDNWhiSGRoZVhNb0lHRnVhVzFoZEdsdmJpNXZjSFJ6TG1Gc2QyRjVjeUFwTzF4dWZWeHVYRzVxVVhWbGNua3VRVzVwYldGMGFXOXVJRDBnYWxGMVpYSjVMbVY0ZEdWdVpDZ2dRVzVwYldGMGFXOXVMQ0I3WEc1Y2JseDBkSGRsWlc1bGNqb2dablZ1WTNScGIyNG9JSEJ5YjNCekxDQmpZV3hzWW1GamF5QXBJSHRjYmx4MFhIUnBaaUFvSUdwUmRXVnllUzVwYzBaMWJtTjBhVzl1S0NCd2NtOXdjeUFwSUNrZ2UxeHVYSFJjZEZ4MFkyRnNiR0poWTJzZ1BTQndjbTl3Y3p0Y2JseDBYSFJjZEhCeWIzQnpJRDBnV3lCY0lpcGNJaUJkTzF4dVhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUndjbTl3Y3lBOUlIQnliM0J6TG5Od2JHbDBLRndpSUZ3aUtUdGNibHgwWEhSOVhHNWNibHgwWEhSMllYSWdjSEp2Y0N4Y2JseDBYSFJjZEdsdVpHVjRJRDBnTUN4Y2JseDBYSFJjZEd4bGJtZDBhQ0E5SUhCeWIzQnpMbXhsYm1kMGFEdGNibHh1WEhSY2RHWnZjaUFvSURzZ2FXNWtaWGdnUENCc1pXNW5kR2dnT3lCcGJtUmxlQ3NySUNrZ2UxeHVYSFJjZEZ4MGNISnZjQ0E5SUhCeWIzQnpXeUJwYm1SbGVDQmRPMXh1WEhSY2RGeDBkSGRsWlc1bGNuTmJJSEJ5YjNBZ1hTQTlJSFIzWldWdVpYSnpXeUJ3Y205d0lGMGdmSHdnVzEwN1hHNWNkRngwWEhSMGQyVmxibVZ5YzFzZ2NISnZjQ0JkTG5WdWMyaHBablFvSUdOaGJHeGlZV05ySUNrN1hHNWNkRngwZlZ4dVhIUjlMRnh1WEc1Y2RIQnlaV1pwYkhSbGNqb2dablZ1WTNScGIyNG9JR05oYkd4aVlXTnJMQ0J3Y21Wd1pXNWtJQ2tnZTF4dVhIUmNkR2xtSUNnZ2NISmxjR1Z1WkNBcElIdGNibHgwWEhSY2RHRnVhVzFoZEdsdmJsQnlaV1pwYkhSbGNuTXVkVzV6YUdsbWRDZ2dZMkZzYkdKaFkyc2dLVHRjYmx4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFlXNXBiV0YwYVc5dVVISmxabWxzZEdWeWN5NXdkWE5vS0NCallXeHNZbUZqYXlBcE8xeHVYSFJjZEgxY2JseDBmVnh1ZlNrN1hHNWNibXBSZFdWeWVTNXpjR1ZsWkNBOUlHWjFibU4wYVc5dUtDQnpjR1ZsWkN3Z1pXRnphVzVuTENCbWJpQXBJSHRjYmx4MGRtRnlJRzl3ZENBOUlITndaV1ZrSUNZbUlIUjVjR1Z2WmlCemNHVmxaQ0E5UFQwZ1hDSnZZbXBsWTNSY0lpQS9JR3BSZFdWeWVTNWxlSFJsYm1Rb0lIdDlMQ0J6Y0dWbFpDQXBJRG9nZTF4dVhIUmNkR052YlhCc1pYUmxPaUJtYmlCOGZDQWhabTRnSmlZZ1pXRnphVzVuSUh4OFhHNWNkRngwWEhScVVYVmxjbmt1YVhOR2RXNWpkR2x2YmlnZ2MzQmxaV1FnS1NBbUppQnpjR1ZsWkN4Y2JseDBYSFJrZFhKaGRHbHZiam9nYzNCbFpXUXNYRzVjZEZ4MFpXRnphVzVuT2lCbWJpQW1KaUJsWVhOcGJtY2dmSHdnWldGemFXNW5JQ1ltSUNGcVVYVmxjbmt1YVhOR2RXNWpkR2x2YmlnZ1pXRnphVzVuSUNrZ0ppWWdaV0Z6YVc1blhHNWNkSDA3WEc1Y2JseDBiM0IwTG1SMWNtRjBhVzl1SUQwZ2FsRjFaWEo1TG1aNExtOW1aaUEvSURBZ09pQjBlWEJsYjJZZ2IzQjBMbVIxY21GMGFXOXVJRDA5UFNCY0ltNTFiV0psY2x3aUlEOGdiM0IwTG1SMWNtRjBhVzl1SURwY2JseDBYSFJ2Y0hRdVpIVnlZWFJwYjI0Z2FXNGdhbEYxWlhKNUxtWjRMbk53WldWa2N5QS9JR3BSZFdWeWVTNW1lQzV6Y0dWbFpITmJJRzl3ZEM1a2RYSmhkR2x2YmlCZElEb2dhbEYxWlhKNUxtWjRMbk53WldWa2N5NWZaR1ZtWVhWc2REdGNibHh1WEhRdkx5Qk9iM0p0WVd4cGVtVWdiM0IwTG5GMVpYVmxJQzBnZEhKMVpTOTFibVJsWm1sdVpXUXZiblZzYkNBdFBpQmNJbVo0WENKY2JseDBhV1lnS0NCdmNIUXVjWFZsZFdVZ1BUMGdiblZzYkNCOGZDQnZjSFF1Y1hWbGRXVWdQVDA5SUhSeWRXVWdLU0I3WEc1Y2RGeDBiM0IwTG5GMVpYVmxJRDBnWENKbWVGd2lPMXh1WEhSOVhHNWNibHgwTHk4Z1VYVmxkV1ZwYm1kY2JseDBiM0IwTG05c1pDQTlJRzl3ZEM1amIyMXdiR1YwWlR0Y2JseHVYSFJ2Y0hRdVkyOXRjR3hsZEdVZ1BTQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUnBaaUFvSUdwUmRXVnllUzVwYzBaMWJtTjBhVzl1S0NCdmNIUXViMnhrSUNrZ0tTQjdYRzVjZEZ4MFhIUnZjSFF1YjJ4a0xtTmhiR3dvSUhSb2FYTWdLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUnBaaUFvSUc5d2RDNXhkV1YxWlNBcElIdGNibHgwWEhSY2RHcFJkV1Z5ZVM1a1pYRjFaWFZsS0NCMGFHbHpMQ0J2Y0hRdWNYVmxkV1VnS1R0Y2JseDBYSFI5WEc1Y2RIMDdYRzVjYmx4MGNtVjBkWEp1SUc5d2REdGNibjA3WEc1Y2JtcFJkV1Z5ZVM1bWJpNWxlSFJsYm1Rb2UxeHVYSFJtWVdSbFZHODZJR1oxYm1OMGFXOXVLQ0J6Y0dWbFpDd2dkRzhzSUdWaGMybHVaeXdnWTJGc2JHSmhZMnNnS1NCN1hHNWNibHgwWEhRdkx5QlRhRzkzSUdGdWVTQm9hV1JrWlc0Z1pXeGxiV1Z1ZEhNZ1lXWjBaWElnYzJWMGRHbHVaeUJ2Y0dGamFYUjVJSFJ2SURCY2JseDBYSFJ5WlhSMWNtNGdkR2hwY3k1bWFXeDBaWElvSUdselNHbGtaR1Z1SUNrdVkzTnpLQ0JjSW05d1lXTnBkSGxjSWl3Z01DQXBMbk5vYjNjb0tWeHVYRzVjZEZ4MFhIUXZMeUJCYm1sdFlYUmxJSFJ2SUhSb1pTQjJZV3gxWlNCemNHVmphV1pwWldSY2JseDBYSFJjZEM1bGJtUW9LUzVoYm1sdFlYUmxLSHNnYjNCaFkybDBlVG9nZEc4Z2ZTd2djM0JsWldRc0lHVmhjMmx1Wnl3Z1kyRnNiR0poWTJzZ0tUdGNibHgwZlN4Y2JseDBZVzVwYldGMFpUb2dablZ1WTNScGIyNG9JSEJ5YjNBc0lITndaV1ZrTENCbFlYTnBibWNzSUdOaGJHeGlZV05ySUNrZ2UxeHVYSFJjZEhaaGNpQmxiWEIwZVNBOUlHcFJkV1Z5ZVM1cGMwVnRjSFI1VDJKcVpXTjBLQ0J3Y205d0lDa3NYRzVjZEZ4MFhIUnZjSFJoYkd3Z1BTQnFVWFZsY25rdWMzQmxaV1FvSUhOd1pXVmtMQ0JsWVhOcGJtY3NJR05oYkd4aVlXTnJJQ2tzWEc1Y2RGeDBYSFJrYjBGdWFXMWhkR2x2YmlBOUlHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RGeDBYSFF2THlCUGNHVnlZWFJsSUc5dUlHRWdZMjl3ZVNCdlppQndjbTl3SUhOdklIQmxjaTF3Y205d1pYSjBlU0JsWVhOcGJtY2dkMjl1SjNRZ1ltVWdiRzl6ZEZ4dVhIUmNkRngwWEhSMllYSWdZVzVwYlNBOUlFRnVhVzFoZEdsdmJpZ2dkR2hwY3l3Z2FsRjFaWEo1TG1WNGRHVnVaQ2dnZTMwc0lIQnliM0FnS1N3Z2IzQjBZV3hzSUNrN1hHNWNibHgwWEhSY2RGeDBMeThnUlcxd2RIa2dZVzVwYldGMGFXOXVjeXdnYjNJZ1ptbHVhWE5vYVc1bklISmxjMjlzZG1WeklHbHRiV1ZrYVdGMFpXeDVYRzVjZEZ4MFhIUmNkR2xtSUNnZ1pXMXdkSGtnZkh3Z1pHRjBZVjl3Y21sMkxtZGxkQ2dnZEdocGN5d2dYQ0ptYVc1cGMyaGNJaUFwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR0Z1YVcwdWMzUnZjQ2dnZEhKMVpTQXBPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5TzF4dVhIUmNkRngwWkc5QmJtbHRZWFJwYjI0dVptbHVhWE5vSUQwZ1pHOUJibWx0WVhScGIyNDdYRzVjYmx4MFhIUnlaWFIxY200Z1pXMXdkSGtnZkh3Z2IzQjBZV3hzTG5GMVpYVmxJRDA5UFNCbVlXeHpaU0EvWEc1Y2RGeDBYSFIwYUdsekxtVmhZMmdvSUdSdlFXNXBiV0YwYVc5dUlDa2dPbHh1WEhSY2RGeDBkR2hwY3k1eGRXVjFaU2dnYjNCMFlXeHNMbkYxWlhWbExDQmtiMEZ1YVcxaGRHbHZiaUFwTzF4dVhIUjlMRnh1WEhSemRHOXdPaUJtZFc1amRHbHZiaWdnZEhsd1pTd2dZMnhsWVhKUmRXVjFaU3dnWjI5MGIwVnVaQ0FwSUh0Y2JseDBYSFIyWVhJZ2MzUnZjRkYxWlhWbElEMGdablZ1WTNScGIyNG9JR2h2YjJ0eklDa2dlMXh1WEhSY2RGeDBkbUZ5SUhOMGIzQWdQU0JvYjI5cmN5NXpkRzl3TzF4dVhIUmNkRngwWkdWc1pYUmxJR2h2YjJ0ekxuTjBiM0E3WEc1Y2RGeDBYSFJ6ZEc5d0tDQm5iM1J2Ulc1a0lDazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RHbG1JQ2dnZEhsd1pXOW1JSFI1Y0dVZ0lUMDlJRndpYzNSeWFXNW5YQ0lnS1NCN1hHNWNkRngwWEhSbmIzUnZSVzVrSUQwZ1kyeGxZWEpSZFdWMVpUdGNibHgwWEhSY2RHTnNaV0Z5VVhWbGRXVWdQU0IwZVhCbE8xeHVYSFJjZEZ4MGRIbHdaU0E5SUhWdVpHVm1hVzVsWkR0Y2JseDBYSFI5WEc1Y2RGeDBhV1lnS0NCamJHVmhjbEYxWlhWbElDWW1JSFI1Y0dVZ0lUMDlJR1poYkhObElDa2dlMXh1WEhSY2RGeDBkR2hwY3k1eGRXVjFaU2dnZEhsd1pTQjhmQ0JjSW1aNFhDSXNJRnRkSUNrN1hHNWNkRngwZlZ4dVhHNWNkRngwY21WMGRYSnVJSFJvYVhNdVpXRmphQ2htZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJjZEhaaGNpQmtaWEYxWlhWbElEMGdkSEoxWlN4Y2JseDBYSFJjZEZ4MGFXNWtaWGdnUFNCMGVYQmxJQ0U5SUc1MWJHd2dKaVlnZEhsd1pTQXJJRndpY1hWbGRXVkliMjlyYzF3aUxGeHVYSFJjZEZ4MFhIUjBhVzFsY25NZ1BTQnFVWFZsY25rdWRHbHRaWEp6TEZ4dVhIUmNkRngwWEhSa1lYUmhJRDBnWkdGMFlWOXdjbWwyTG1kbGRDZ2dkR2hwY3lBcE8xeHVYRzVjZEZ4MFhIUnBaaUFvSUdsdVpHVjRJQ2tnZTF4dVhIUmNkRngwWEhScFppQW9JR1JoZEdGYklHbHVaR1Y0SUYwZ0ppWWdaR0YwWVZzZ2FXNWtaWGdnWFM1emRHOXdJQ2tnZTF4dVhIUmNkRngwWEhSY2RITjBiM0JSZFdWMVpTZ2daR0YwWVZzZ2FXNWtaWGdnWFNBcE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUm1iM0lnS0NCcGJtUmxlQ0JwYmlCa1lYUmhJQ2tnZTF4dVhIUmNkRngwWEhSY2RHbG1JQ2dnWkdGMFlWc2dhVzVrWlhnZ1hTQW1KaUJrWVhSaFd5QnBibVJsZUNCZExuTjBiM0FnSmlZZ2NuSjFiaTUwWlhOMEtDQnBibVJsZUNBcElDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGMzUnZjRkYxWlhWbEtDQmtZWFJoV3lCcGJtUmxlQ0JkSUNrN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEdadmNpQW9JR2x1WkdWNElEMGdkR2x0WlhKekxteGxibWQwYURzZ2FXNWtaWGd0TFRzZ0tTQjdYRzVjZEZ4MFhIUmNkR2xtSUNnZ2RHbHRaWEp6V3lCcGJtUmxlQ0JkTG1Wc1pXMGdQVDA5SUhSb2FYTWdKaVlnS0hSNWNHVWdQVDBnYm5Wc2JDQjhmQ0IwYVcxbGNuTmJJR2x1WkdWNElGMHVjWFZsZFdVZ1BUMDlJSFI1Y0dVcElDa2dlMXh1WEhSY2RGeDBYSFJjZEhScGJXVnljMXNnYVc1a1pYZ2dYUzVoYm1sdExuTjBiM0FvSUdkdmRHOUZibVFnS1R0Y2JseDBYSFJjZEZ4MFhIUmtaWEYxWlhWbElEMGdabUZzYzJVN1hHNWNkRngwWEhSY2RGeDBkR2x0WlhKekxuTndiR2xqWlNnZ2FXNWtaWGdzSURFZ0tUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCVGRHRnlkQ0IwYUdVZ2JtVjRkQ0JwYmlCMGFHVWdjWFZsZFdVZ2FXWWdkR2hsSUd4aGMzUWdjM1JsY0NCM1lYTnVKM1FnWm05eVkyVmtMbHh1WEhSY2RGeDBMeThnVkdsdFpYSnpJR04xY25KbGJuUnNlU0IzYVd4c0lHTmhiR3dnZEdobGFYSWdZMjl0Y0d4bGRHVWdZMkZzYkdKaFkydHpMQ0IzYUdsamFGeHVYSFJjZEZ4MEx5OGdkMmxzYkNCa1pYRjFaWFZsSUdKMWRDQnZibXg1SUdsbUlIUm9aWGtnZDJWeVpTQm5iM1J2Ulc1a0xseHVYSFJjZEZ4MGFXWWdLQ0JrWlhGMVpYVmxJSHg4SUNGbmIzUnZSVzVrSUNrZ2UxeHVYSFJjZEZ4MFhIUnFVWFZsY25rdVpHVnhkV1YxWlNnZ2RHaHBjeXdnZEhsd1pTQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMHBPMXh1WEhSOUxGeHVYSFJtYVc1cGMyZzZJR1oxYm1OMGFXOXVLQ0IwZVhCbElDa2dlMXh1WEhSY2RHbG1JQ2dnZEhsd1pTQWhQVDBnWm1Gc2MyVWdLU0I3WEc1Y2RGeDBYSFIwZVhCbElEMGdkSGx3WlNCOGZDQmNJbVo0WENJN1hHNWNkRngwZlZ4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG1WaFkyZ29ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFIyWVhJZ2FXNWtaWGdzWEc1Y2RGeDBYSFJjZEdSaGRHRWdQU0JrWVhSaFgzQnlhWFl1WjJWMEtDQjBhR2x6SUNrc1hHNWNkRngwWEhSY2RIRjFaWFZsSUQwZ1pHRjBZVnNnZEhsd1pTQXJJRndpY1hWbGRXVmNJaUJkTEZ4dVhIUmNkRngwWEhSb2IyOXJjeUE5SUdSaGRHRmJJSFI1Y0dVZ0t5QmNJbkYxWlhWbFNHOXZhM05jSWlCZExGeHVYSFJjZEZ4MFhIUjBhVzFsY25NZ1BTQnFVWFZsY25rdWRHbHRaWEp6TEZ4dVhIUmNkRngwWEhSc1pXNW5kR2dnUFNCeGRXVjFaU0EvSUhGMVpYVmxMbXhsYm1kMGFDQTZJREE3WEc1Y2JseDBYSFJjZEM4dklFVnVZV0pzWlNCbWFXNXBjMmhwYm1jZ1pteGhaeUJ2YmlCd2NtbDJZWFJsSUdSaGRHRmNibHgwWEhSY2RHUmhkR0V1Wm1sdWFYTm9JRDBnZEhKMVpUdGNibHh1WEhSY2RGeDBMeThnUlcxd2RIa2dkR2hsSUhGMVpYVmxJR1pwY25OMFhHNWNkRngwWEhScVVYVmxjbmt1Y1hWbGRXVW9JSFJvYVhNc0lIUjVjR1VzSUZ0ZElDazdYRzVjYmx4MFhIUmNkR2xtSUNnZ2FHOXZhM01nSmlZZ2FHOXZhM011YzNSdmNDQXBJSHRjYmx4MFhIUmNkRngwYUc5dmEzTXVjM1J2Y0M1allXeHNLQ0IwYUdsekxDQjBjblZsSUNrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRXh2YjJzZ1ptOXlJR0Z1ZVNCaFkzUnBkbVVnWVc1cGJXRjBhVzl1Y3l3Z1lXNWtJR1pwYm1semFDQjBhR1Z0WEc1Y2RGeDBYSFJtYjNJZ0tDQnBibVJsZUNBOUlIUnBiV1Z5Y3k1c1pXNW5kR2c3SUdsdVpHVjRMUzA3SUNrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvSUhScGJXVnljMXNnYVc1a1pYZ2dYUzVsYkdWdElEMDlQU0IwYUdseklDWW1JSFJwYldWeWMxc2dhVzVrWlhnZ1hTNXhkV1YxWlNBOVBUMGdkSGx3WlNBcElIdGNibHgwWEhSY2RGeDBYSFIwYVcxbGNuTmJJR2x1WkdWNElGMHVZVzVwYlM1emRHOXdLQ0IwY25WbElDazdYRzVjZEZ4MFhIUmNkRngwZEdsdFpYSnpMbk53YkdsalpTZ2dhVzVrWlhnc0lERWdLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5Qk1iMjlySUdadmNpQmhibmtnWVc1cGJXRjBhVzl1Y3lCcGJpQjBhR1VnYjJ4a0lIRjFaWFZsSUdGdVpDQm1hVzVwYzJnZ2RHaGxiVnh1WEhSY2RGeDBabTl5SUNnZ2FXNWtaWGdnUFNBd095QnBibVJsZUNBOElHeGxibWQwYURzZ2FXNWtaWGdyS3lBcElIdGNibHgwWEhSY2RGeDBhV1lnS0NCeGRXVjFaVnNnYVc1a1pYZ2dYU0FtSmlCeGRXVjFaVnNnYVc1a1pYZ2dYUzVtYVc1cGMyZ2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNYVmxkV1ZiSUdsdVpHVjRJRjB1Wm1sdWFYTm9MbU5oYkd3b0lIUm9hWE1nS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJVZFhKdUlHOW1aaUJtYVc1cGMyaHBibWNnWm14aFoxeHVYSFJjZEZ4MFpHVnNaWFJsSUdSaGRHRXVabWx1YVhOb08xeHVYSFJjZEgwcE8xeHVYSFI5WEc1OUtUdGNibHh1YWxGMVpYSjVMbVZoWTJnb1d5QmNJblJ2WjJkc1pWd2lMQ0JjSW5Ob2IzZGNJaXdnWENKb2FXUmxYQ0lnWFN3Z1puVnVZM1JwYjI0b0lHa3NJRzVoYldVZ0tTQjdYRzVjZEhaaGNpQmpjM05HYmlBOUlHcFJkV1Z5ZVM1bWJsc2dibUZ0WlNCZE8xeHVYSFJxVVhWbGNua3VabTViSUc1aGJXVWdYU0E5SUdaMWJtTjBhVzl1S0NCemNHVmxaQ3dnWldGemFXNW5MQ0JqWVd4c1ltRmpheUFwSUh0Y2JseDBYSFJ5WlhSMWNtNGdjM0JsWldRZ1BUMGdiblZzYkNCOGZDQjBlWEJsYjJZZ2MzQmxaV1FnUFQwOUlGd2lZbTl2YkdWaGJsd2lJRDljYmx4MFhIUmNkR056YzBadUxtRndjR3g1S0NCMGFHbHpMQ0JoY21kMWJXVnVkSE1nS1NBNlhHNWNkRngwWEhSMGFHbHpMbUZ1YVcxaGRHVW9JR2RsYmtaNEtDQnVZVzFsTENCMGNuVmxJQ2tzSUhOd1pXVmtMQ0JsWVhOcGJtY3NJR05oYkd4aVlXTnJJQ2s3WEc1Y2RIMDdYRzU5S1R0Y2JseHVMeThnUjJWdVpYSmhkR1VnYzJodmNuUmpkWFJ6SUdadmNpQmpkWE4wYjIwZ1lXNXBiV0YwYVc5dWMxeHVhbEYxWlhKNUxtVmhZMmdvZTF4dVhIUnpiR2xrWlVSdmQyNDZJR2RsYmtaNEtGd2ljMmh2ZDF3aUtTeGNibHgwYzJ4cFpHVlZjRG9nWjJWdVJuZ29YQ0pvYVdSbFhDSXBMRnh1WEhSemJHbGtaVlJ2WjJkc1pUb2daMlZ1Um5nb1hDSjBiMmRuYkdWY0lpa3NYRzVjZEdaaFpHVkpiam9nZXlCdmNHRmphWFI1T2lCY0luTm9iM2RjSWlCOUxGeHVYSFJtWVdSbFQzVjBPaUI3SUc5d1lXTnBkSGs2SUZ3aWFHbGtaVndpSUgwc1hHNWNkR1poWkdWVWIyZG5iR1U2SUhzZ2IzQmhZMmwwZVRvZ1hDSjBiMmRuYkdWY0lpQjlYRzU5TENCbWRXNWpkR2x2YmlnZ2JtRnRaU3dnY0hKdmNITWdLU0I3WEc1Y2RHcFJkV1Z5ZVM1bWJsc2dibUZ0WlNCZElEMGdablZ1WTNScGIyNG9JSE53WldWa0xDQmxZWE5wYm1jc0lHTmhiR3hpWVdOcklDa2dlMXh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbUZ1YVcxaGRHVW9JSEJ5YjNCekxDQnpjR1ZsWkN3Z1pXRnphVzVuTENCallXeHNZbUZqYXlBcE8xeHVYSFI5TzF4dWZTazdYRzVjYm1wUmRXVnllUzUwYVcxbGNuTWdQU0JiWFR0Y2JtcFJkV1Z5ZVM1bWVDNTBhV05ySUQwZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEhaaGNpQjBhVzFsY2l4Y2JseDBYSFJwSUQwZ01DeGNibHgwWEhSMGFXMWxjbk1nUFNCcVVYVmxjbmt1ZEdsdFpYSnpPMXh1WEc1Y2RHWjRUbTkzSUQwZ2FsRjFaWEo1TG01dmR5Z3BPMXh1WEc1Y2RHWnZjaUFvSURzZ2FTQThJSFJwYldWeWN5NXNaVzVuZEdnN0lHa3JLeUFwSUh0Y2JseDBYSFIwYVcxbGNpQTlJSFJwYldWeWMxc2dhU0JkTzF4dVhIUmNkQzh2SUVOb1pXTnJjeUIwYUdVZ2RHbHRaWElnYUdGeklHNXZkQ0JoYkhKbFlXUjVJR0psWlc0Z2NtVnRiM1psWkZ4dVhIUmNkR2xtSUNnZ0lYUnBiV1Z5S0NrZ0ppWWdkR2x0WlhKeld5QnBJRjBnUFQwOUlIUnBiV1Z5SUNrZ2UxeHVYSFJjZEZ4MGRHbHRaWEp6TG5Od2JHbGpaU2dnYVMwdExDQXhJQ2s3WEc1Y2RGeDBmVnh1WEhSOVhHNWNibHgwYVdZZ0tDQWhkR2x0WlhKekxteGxibWQwYUNBcElIdGNibHgwWEhScVVYVmxjbmt1Wm5ndWMzUnZjQ2dwTzF4dVhIUjlYRzVjZEdaNFRtOTNJRDBnZFc1a1pXWnBibVZrTzF4dWZUdGNibHh1YWxGMVpYSjVMbVo0TG5ScGJXVnlJRDBnWm5WdVkzUnBiMjRvSUhScGJXVnlJQ2tnZTF4dVhIUnFVWFZsY25rdWRHbHRaWEp6TG5CMWMyZ29JSFJwYldWeUlDazdYRzVjZEdsbUlDZ2dkR2x0WlhJb0tTQXBJSHRjYmx4MFhIUnFVWFZsY25rdVpuZ3VjM1JoY25Rb0tUdGNibHgwZlNCbGJITmxJSHRjYmx4MFhIUnFVWFZsY25rdWRHbHRaWEp6TG5CdmNDZ3BPMXh1WEhSOVhHNTlPMXh1WEc1cVVYVmxjbmt1Wm5ndWFXNTBaWEoyWVd3Z1BTQXhNenRjYmx4dWFsRjFaWEo1TG1aNExuTjBZWEowSUQwZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEdsbUlDZ2dJWFJwYldWeVNXUWdLU0I3WEc1Y2RGeDBkR2x0WlhKSlpDQTlJSE5sZEVsdWRHVnlkbUZzS0NCcVVYVmxjbmt1Wm5ndWRHbGpheXdnYWxGMVpYSjVMbVo0TG1sdWRHVnlkbUZzSUNrN1hHNWNkSDFjYm4wN1hHNWNibXBSZFdWeWVTNW1lQzV6ZEc5d0lEMGdablZ1WTNScGIyNG9LU0I3WEc1Y2RHTnNaV0Z5U1c1MFpYSjJZV3dvSUhScGJXVnlTV1FnS1R0Y2JseDBkR2x0WlhKSlpDQTlJRzUxYkd3N1hHNTlPMXh1WEc1cVVYVmxjbmt1Wm5ndWMzQmxaV1J6SUQwZ2UxeHVYSFJ6Ykc5M09pQTJNREFzWEc1Y2RHWmhjM1E2SURJd01DeGNibHgwTHk4Z1JHVm1ZWFZzZENCemNHVmxaRnh1WEhSZlpHVm1ZWFZzZERvZ05EQXdYRzU5TzF4dVhHNWNiaTh2SUVKaGMyVmtJRzltWmlCdlppQjBhR1VnY0d4MVoybHVJR0o1SUVOc2FXNTBJRWhsYkdabGNuTXNJSGRwZEdnZ2NHVnliV2x6YzJsdmJpNWNiaTh2SUdoMGRIQTZMeTlpYkdsdVpITnBaMjVoYkhNdVkyOXRMMmx1WkdWNExuQm9jQzh5TURBNUx6QTNMMnB4ZFdWeWVTMWtaV3hoZVM5Y2JtcFJkV1Z5ZVM1bWJpNWtaV3hoZVNBOUlHWjFibU4wYVc5dUtDQjBhVzFsTENCMGVYQmxJQ2tnZTF4dVhIUjBhVzFsSUQwZ2FsRjFaWEo1TG1aNElEOGdhbEYxWlhKNUxtWjRMbk53WldWa2Mxc2dkR2x0WlNCZElIeDhJSFJwYldVZ09pQjBhVzFsTzF4dVhIUjBlWEJsSUQwZ2RIbHdaU0I4ZkNCY0ltWjRYQ0k3WEc1Y2JseDBjbVYwZFhKdUlIUm9hWE11Y1hWbGRXVW9JSFI1Y0dVc0lHWjFibU4wYVc5dUtDQnVaWGgwTENCb2IyOXJjeUFwSUh0Y2JseDBYSFIyWVhJZ2RHbHRaVzkxZENBOUlITmxkRlJwYldWdmRYUW9JRzVsZUhRc0lIUnBiV1VnS1R0Y2JseDBYSFJvYjI5cmN5NXpkRzl3SUQwZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUmpiR1ZoY2xScGJXVnZkWFFvSUhScGJXVnZkWFFnS1R0Y2JseDBYSFI5TzF4dVhIUjlLVHRjYm4wN1hHNWNibHh1S0daMWJtTjBhVzl1S0NrZ2UxeHVYSFIyWVhJZ2FXNXdkWFFnUFNCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZGYkdWdFpXNTBLQ0JjSW1sdWNIVjBYQ0lnS1N4Y2JseDBYSFJ6Wld4bFkzUWdQU0JrYjJOMWJXVnVkQzVqY21WaGRHVkZiR1Z0Wlc1MEtDQmNJbk5sYkdWamRGd2lJQ2tzWEc1Y2RGeDBiM0IwSUQwZ2MyVnNaV04wTG1Gd2NHVnVaRU5vYVd4a0tDQmtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0NCY0ltOXdkR2x2Ymx3aUlDa2dLVHRjYmx4dVhIUnBibkIxZEM1MGVYQmxJRDBnWENKamFHVmphMkp2ZUZ3aU8xeHVYRzVjZEM4dklGTjFjSEJ2Y25RNklHbFBVenc5TlM0eExDQkJibVJ5YjJsa1BEMDBMaklyWEc1Y2RDOHZJRVJsWm1GMWJIUWdkbUZzZFdVZ1ptOXlJR0VnWTJobFkydGliM2dnYzJodmRXeGtJR0psSUZ3aWIyNWNJbHh1WEhSemRYQndiM0owTG1Ob1pXTnJUMjRnUFNCcGJuQjFkQzUyWVd4MVpTQWhQVDBnWENKY0lqdGNibHh1WEhRdkx5QlRkWEJ3YjNKME9pQkpSVHc5TVRFclhHNWNkQzh2SUUxMWMzUWdZV05qWlhOeklITmxiR1ZqZEdWa1NXNWtaWGdnZEc4Z2JXRnJaU0JrWldaaGRXeDBJRzl3ZEdsdmJuTWdjMlZzWldOMFhHNWNkSE4xY0hCdmNuUXViM0IwVTJWc1pXTjBaV1FnUFNCdmNIUXVjMlZzWldOMFpXUTdYRzVjYmx4MEx5OGdVM1Z3Y0c5eWREb2dRVzVrY205cFpEdzlNaTR6WEc1Y2RDOHZJRTl3ZEdsdmJuTWdhVzV6YVdSbElHUnBjMkZpYkdWa0lITmxiR1ZqZEhNZ1lYSmxJR2x1WTI5eWNtVmpkR3g1SUcxaGNtdGxaQ0JoY3lCa2FYTmhZbXhsWkZ4dVhIUnpaV3hsWTNRdVpHbHpZV0pzWldRZ1BTQjBjblZsTzF4dVhIUnpkWEJ3YjNKMExtOXdkRVJwYzJGaWJHVmtJRDBnSVc5d2RDNWthWE5oWW14bFpEdGNibHh1WEhRdkx5QlRkWEJ3YjNKME9pQkpSVHc5TVRFclhHNWNkQzh2SUVGdUlHbHVjSFYwSUd4dmMyVnpJR2wwY3lCMllXeDFaU0JoWm5SbGNpQmlaV052YldsdVp5QmhJSEpoWkdsdlhHNWNkR2x1Y0hWMElEMGdaRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENnZ1hDSnBibkIxZEZ3aUlDazdYRzVjZEdsdWNIVjBMblpoYkhWbElEMGdYQ0owWENJN1hHNWNkR2x1Y0hWMExuUjVjR1VnUFNCY0luSmhaR2x2WENJN1hHNWNkSE4xY0hCdmNuUXVjbUZrYVc5V1lXeDFaU0E5SUdsdWNIVjBMblpoYkhWbElEMDlQU0JjSW5SY0lqdGNibjBwS0NrN1hHNWNibHh1ZG1GeUlHNXZaR1ZJYjI5ckxDQmliMjlzU0c5dmF5eGNibHgwWVhSMGNraGhibVJzWlNBOUlHcFJkV1Z5ZVM1bGVIQnlMbUYwZEhKSVlXNWtiR1U3WEc1Y2JtcFJkV1Z5ZVM1bWJpNWxlSFJsYm1Rb2UxeHVYSFJoZEhSeU9pQm1kVzVqZEdsdmJpZ2dibUZ0WlN3Z2RtRnNkV1VnS1NCN1hHNWNkRngwY21WMGRYSnVJR0ZqWTJWemN5Z2dkR2hwY3l3Z2FsRjFaWEo1TG1GMGRISXNJRzVoYldVc0lIWmhiSFZsTENCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01TQXBPMXh1WEhSOUxGeHVYRzVjZEhKbGJXOTJaVUYwZEhJNklHWjFibU4wYVc5dUtDQnVZVzFsSUNrZ2UxeHVYSFJjZEhKbGRIVnliaUIwYUdsekxtVmhZMmdvWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwWEhScVVYVmxjbmt1Y21WdGIzWmxRWFIwY2lnZ2RHaHBjeXdnYm1GdFpTQXBPMXh1WEhSY2RIMHBPMXh1WEhSOVhHNTlLVHRjYmx4dWFsRjFaWEo1TG1WNGRHVnVaQ2g3WEc1Y2RHRjBkSEk2SUdaMWJtTjBhVzl1S0NCbGJHVnRMQ0J1WVcxbExDQjJZV3gxWlNBcElIdGNibHgwWEhSMllYSWdhRzl2YTNNc0lISmxkQ3hjYmx4MFhIUmNkRzVVZVhCbElEMGdaV3hsYlM1dWIyUmxWSGx3WlR0Y2JseHVYSFJjZEM4dklHUnZiaWQwSUdkbGRDOXpaWFFnWVhSMGNtbGlkWFJsY3lCdmJpQjBaWGgwTENCamIyMXRaVzUwSUdGdVpDQmhkSFJ5YVdKMWRHVWdibTlrWlhOY2JseDBYSFJwWmlBb0lDRmxiR1Z0SUh4OElHNVVlWEJsSUQwOVBTQXpJSHg4SUc1VWVYQmxJRDA5UFNBNElIeDhJRzVVZVhCbElEMDlQU0F5SUNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1TzF4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUVaaGJHeGlZV05ySUhSdklIQnliM0FnZDJobGJpQmhkSFJ5YVdKMWRHVnpJR0Z5WlNCdWIzUWdjM1Z3Y0c5eWRHVmtYRzVjZEZ4MGFXWWdLQ0IwZVhCbGIyWWdaV3hsYlM1blpYUkJkSFJ5YVdKMWRHVWdQVDA5SUhOMGNuVnVaR1ZtYVc1bFpDQXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQnFVWFZsY25rdWNISnZjQ2dnWld4bGJTd2dibUZ0WlN3Z2RtRnNkV1VnS1R0Y2JseDBYSFI5WEc1Y2JseDBYSFF2THlCQmJHd2dZWFIwY21saWRYUmxjeUJoY21VZ2JHOTNaWEpqWVhObFhHNWNkRngwTHk4Z1IzSmhZaUJ1WldObGMzTmhjbmtnYUc5dmF5QnBaaUJ2Ym1VZ2FYTWdaR1ZtYVc1bFpGeHVYSFJjZEdsbUlDZ2dibFI1Y0dVZ0lUMDlJREVnZkh3Z0lXcFJkV1Z5ZVM1cGMxaE5URVJ2WXlnZ1pXeGxiU0FwSUNrZ2UxeHVYSFJjZEZ4MGJtRnRaU0E5SUc1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1R0Y2JseDBYSFJjZEdodmIydHpJRDBnYWxGMVpYSjVMbUYwZEhKSWIyOXJjMXNnYm1GdFpTQmRJSHg4WEc1Y2RGeDBYSFJjZENnZ2FsRjFaWEo1TG1WNGNISXViV0YwWTJndVltOXZiQzUwWlhOMEtDQnVZVzFsSUNrZ1B5QmliMjlzU0c5dmF5QTZJRzV2WkdWSWIyOXJJQ2s3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBhV1lnS0NCMllXeDFaU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDa2dlMXh1WEc1Y2RGeDBYSFJwWmlBb0lIWmhiSFZsSUQwOVBTQnVkV3hzSUNrZ2UxeHVYSFJjZEZ4MFhIUnFVWFZsY25rdWNtVnRiM1psUVhSMGNpZ2daV3hsYlN3Z2JtRnRaU0FwTzF4dVhHNWNkRngwWEhSOUlHVnNjMlVnYVdZZ0tDQm9iMjlyY3lBbUppQmNJbk5sZEZ3aUlHbHVJR2h2YjJ0eklDWW1JQ2h5WlhRZ1BTQm9iMjlyY3k1elpYUW9JR1ZzWlcwc0lIWmhiSFZsTENCdVlXMWxJQ2twSUNFOVBTQjFibVJsWm1sdVpXUWdLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ5WlhRN1hHNWNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RHVnNaVzB1YzJWMFFYUjBjbWxpZFhSbEtDQnVZVzFsTENCMllXeDFaU0FySUZ3aVhDSWdLVHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFpoYkhWbE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MGZTQmxiSE5sSUdsbUlDZ2dhRzl2YTNNZ0ppWWdYQ0puWlhSY0lpQnBiaUJvYjI5cmN5QW1KaUFvY21WMElEMGdhRzl2YTNNdVoyVjBLQ0JsYkdWdExDQnVZVzFsSUNrcElDRTlQU0J1ZFd4c0lDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlISmxkRHRjYmx4dVhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUnlaWFFnUFNCcVVYVmxjbmt1Wm1sdVpDNWhkSFJ5S0NCbGJHVnRMQ0J1WVcxbElDazdYRzVjYmx4MFhIUmNkQzh2SUU1dmJpMWxlR2x6ZEdWdWRDQmhkSFJ5YVdKMWRHVnpJSEpsZEhWeWJpQnVkV3hzTENCM1pTQnViM0p0WVd4cGVtVWdkRzhnZFc1a1pXWnBibVZrWEc1Y2RGeDBYSFJ5WlhSMWNtNGdjbVYwSUQwOUlHNTFiR3dnUDF4dVhIUmNkRngwWEhSMWJtUmxabWx1WldRZ09seHVYSFJjZEZ4MFhIUnlaWFE3WEc1Y2RGeDBmVnh1WEhSOUxGeHVYRzVjZEhKbGJXOTJaVUYwZEhJNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCMllXeDFaU0FwSUh0Y2JseDBYSFIyWVhJZ2JtRnRaU3dnY0hKdmNFNWhiV1VzWEc1Y2RGeDBYSFJwSUQwZ01DeGNibHgwWEhSY2RHRjBkSEpPWVcxbGN5QTlJSFpoYkhWbElDWW1JSFpoYkhWbExtMWhkR05vS0NCeWJtOTBkMmhwZEdVZ0tUdGNibHh1WEhSY2RHbG1JQ2dnWVhSMGNrNWhiV1Z6SUNZbUlHVnNaVzB1Ym05a1pWUjVjR1VnUFQwOUlERWdLU0I3WEc1Y2RGeDBYSFIzYUdsc1pTQW9JQ2h1WVcxbElEMGdZWFIwY2s1aGJXVnpXMmtySzEwcElDa2dlMXh1WEhSY2RGeDBYSFJ3Y205d1RtRnRaU0E5SUdwUmRXVnllUzV3Y205d1JtbDRXeUJ1WVcxbElGMGdmSHdnYm1GdFpUdGNibHh1WEhSY2RGeDBYSFF2THlCQ2IyOXNaV0Z1SUdGMGRISnBZblYwWlhNZ1oyVjBJSE53WldOcFlXd2dkSEpsWVhSdFpXNTBJQ2dqTVRBNE56QXBYRzVjZEZ4MFhIUmNkR2xtSUNnZ2FsRjFaWEo1TG1WNGNISXViV0YwWTJndVltOXZiQzUwWlhOMEtDQnVZVzFsSUNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwTHk4Z1UyVjBJR052Y25KbGMzQnZibVJwYm1jZ2NISnZjR1Z5ZEhrZ2RHOGdabUZzYzJWY2JseDBYSFJjZEZ4MFhIUmxiR1Z0V3lCd2NtOXdUbUZ0WlNCZElEMGdabUZzYzJVN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJsYkdWdExuSmxiVzkyWlVGMGRISnBZblYwWlNnZ2JtRnRaU0FwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4MGZTeGNibHh1WEhSaGRIUnlTRzl2YTNNNklIdGNibHgwWEhSMGVYQmxPaUI3WEc1Y2RGeDBYSFJ6WlhRNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCMllXeDFaU0FwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0FoYzNWd2NHOXlkQzV5WVdScGIxWmhiSFZsSUNZbUlIWmhiSFZsSUQwOVBTQmNJbkpoWkdsdlhDSWdKaVpjYmx4MFhIUmNkRngwWEhScVVYVmxjbmt1Ym05a1pVNWhiV1VvSUdWc1pXMHNJRndpYVc1d2RYUmNJaUFwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCMllXd2dQU0JsYkdWdExuWmhiSFZsTzF4dVhIUmNkRngwWEhSY2RHVnNaVzB1YzJWMFFYUjBjbWxpZFhSbEtDQmNJblI1Y0dWY0lpd2dkbUZzZFdVZ0tUdGNibHgwWEhSY2RGeDBYSFJwWmlBb0lIWmhiQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR1ZzWlcwdWRtRnNkV1VnUFNCMllXdzdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCMllXeDFaVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4MGZWeHVmU2s3WEc1Y2JpOHZJRWh2YjJ0eklHWnZjaUJpYjI5c1pXRnVJR0YwZEhKcFluVjBaWE5jYm1KdmIyeEliMjlySUQwZ2UxeHVYSFJ6WlhRNklHWjFibU4wYVc5dUtDQmxiR1Z0TENCMllXeDFaU3dnYm1GdFpTQXBJSHRjYmx4MFhIUnBaaUFvSUhaaGJIVmxJRDA5UFNCbVlXeHpaU0FwSUh0Y2JseDBYSFJjZEM4dklGSmxiVzkyWlNCaWIyOXNaV0Z1SUdGMGRISnBZblYwWlhNZ2QyaGxiaUJ6WlhRZ2RHOGdabUZzYzJWY2JseDBYSFJjZEdwUmRXVnllUzV5WlcxdmRtVkJkSFJ5S0NCbGJHVnRMQ0J1WVcxbElDazdYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEdWc1pXMHVjMlYwUVhSMGNtbGlkWFJsS0NCdVlXMWxMQ0J1WVcxbElDazdYRzVjZEZ4MGZWeHVYSFJjZEhKbGRIVnliaUJ1WVcxbE8xeHVYSFI5WEc1OU8xeHVhbEYxWlhKNUxtVmhZMmdvSUdwUmRXVnllUzVsZUhCeUxtMWhkR05vTG1KdmIyd3VjMjkxY21ObExtMWhkR05vS0NBdlhGeDNLeTluSUNrc0lHWjFibU4wYVc5dUtDQnBMQ0J1WVcxbElDa2dlMXh1WEhSMllYSWdaMlYwZEdWeUlEMGdZWFIwY2toaGJtUnNaVnNnYm1GdFpTQmRJSHg4SUdwUmRXVnllUzVtYVc1a0xtRjBkSEk3WEc1Y2JseDBZWFIwY2toaGJtUnNaVnNnYm1GdFpTQmRJRDBnWm5WdVkzUnBiMjRvSUdWc1pXMHNJRzVoYldVc0lHbHpXRTFNSUNrZ2UxeHVYSFJjZEhaaGNpQnlaWFFzSUdoaGJtUnNaVHRjYmx4MFhIUnBaaUFvSUNGcGMxaE5UQ0FwSUh0Y2JseDBYSFJjZEM4dklFRjJiMmxrSUdGdUlHbHVabWx1YVhSbElHeHZiM0FnWW5rZ2RHVnRjRzl5WVhKcGJIa2djbVZ0YjNacGJtY2dkR2hwY3lCbWRXNWpkR2x2YmlCbWNtOXRJSFJvWlNCblpYUjBaWEpjYmx4MFhIUmNkR2hoYm1Sc1pTQTlJR0YwZEhKSVlXNWtiR1ZiSUc1aGJXVWdYVHRjYmx4MFhIUmNkR0YwZEhKSVlXNWtiR1ZiSUc1aGJXVWdYU0E5SUhKbGREdGNibHgwWEhSY2RISmxkQ0E5SUdkbGRIUmxjaWdnWld4bGJTd2dibUZ0WlN3Z2FYTllUVXdnS1NBaFBTQnVkV3hzSUQ5Y2JseDBYSFJjZEZ4MGJtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElEcGNibHgwWEhSY2RGeDBiblZzYkR0Y2JseDBYSFJjZEdGMGRISklZVzVrYkdWYklHNWhiV1VnWFNBOUlHaGhibVJzWlR0Y2JseDBYSFI5WEc1Y2RGeDBjbVYwZFhKdUlISmxkRHRjYmx4MGZUdGNibjBwTzF4dVhHNWNibHh1WEc1MllYSWdjbVp2WTNWellXSnNaU0E5SUM5ZUtEODZhVzV3ZFhSOGMyVnNaV04wZkhSbGVIUmhjbVZoZkdKMWRIUnZiaWtrTDJrN1hHNWNibXBSZFdWeWVTNW1iaTVsZUhSbGJtUW9lMXh1WEhSd2NtOXdPaUJtZFc1amRHbHZiaWdnYm1GdFpTd2dkbUZzZFdVZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUdGalkyVnpjeWdnZEdocGN5d2dhbEYxWlhKNUxuQnliM0FzSUc1aGJXVXNJSFpoYkhWbExDQmhjbWQxYldWdWRITXViR1Z1WjNSb0lENGdNU0FwTzF4dVhIUjlMRnh1WEc1Y2RISmxiVzkyWlZCeWIzQTZJR1oxYm1OMGFXOXVLQ0J1WVcxbElDa2dlMXh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbVZoWTJnb1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUmtaV3hsZEdVZ2RHaHBjMXNnYWxGMVpYSjVMbkJ5YjNCR2FYaGJJRzVoYldVZ1hTQjhmQ0J1WVcxbElGMDdYRzVjZEZ4MGZTazdYRzVjZEgxY2JuMHBPMXh1WEc1cVVYVmxjbmt1WlhoMFpXNWtLSHRjYmx4MGNISnZjRVpwZURvZ2UxeHVYSFJjZEZ3aVptOXlYQ0k2SUZ3aWFIUnRiRVp2Y2x3aUxGeHVYSFJjZEZ3aVkyeGhjM05jSWpvZ1hDSmpiR0Z6YzA1aGJXVmNJbHh1WEhSOUxGeHVYRzVjZEhCeWIzQTZJR1oxYm1OMGFXOXVLQ0JsYkdWdExDQnVZVzFsTENCMllXeDFaU0FwSUh0Y2JseDBYSFIyWVhJZ2NtVjBMQ0JvYjI5cmN5d2dibTkwZUcxc0xGeHVYSFJjZEZ4MGJsUjVjR1VnUFNCbGJHVnRMbTV2WkdWVWVYQmxPMXh1WEc1Y2RGeDBMeThnUkc5dUozUWdaMlYwTDNObGRDQndjbTl3WlhKMGFXVnpJRzl1SUhSbGVIUXNJR052YlcxbGJuUWdZVzVrSUdGMGRISnBZblYwWlNCdWIyUmxjMXh1WEhSY2RHbG1JQ2dnSVdWc1pXMGdmSHdnYmxSNWNHVWdQVDA5SURNZ2ZId2dibFI1Y0dVZ1BUMDlJRGdnZkh3Z2JsUjVjR1VnUFQwOUlESWdLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYRzVjZEZ4MGZWeHVYRzVjZEZ4MGJtOTBlRzFzSUQwZ2JsUjVjR1VnSVQwOUlERWdmSHdnSVdwUmRXVnllUzVwYzFoTlRFUnZZeWdnWld4bGJTQXBPMXh1WEc1Y2RGeDBhV1lnS0NCdWIzUjRiV3dnS1NCN1hHNWNkRngwWEhRdkx5QkdhWGdnYm1GdFpTQmhibVFnWVhSMFlXTm9JR2h2YjJ0elhHNWNkRngwWEhSdVlXMWxJRDBnYWxGMVpYSjVMbkJ5YjNCR2FYaGJJRzVoYldVZ1hTQjhmQ0J1WVcxbE8xeHVYSFJjZEZ4MGFHOXZhM01nUFNCcVVYVmxjbmt1Y0hKdmNFaHZiMnR6V3lCdVlXMWxJRjA3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBhV1lnS0NCMllXeDFaU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHaHZiMnR6SUNZbUlGd2ljMlYwWENJZ2FXNGdhRzl2YTNNZ0ppWWdLSEpsZENBOUlHaHZiMnR6TG5ObGRDZ2daV3hsYlN3Z2RtRnNkV1VzSUc1aGJXVWdLU2tnSVQwOUlIVnVaR1ZtYVc1bFpDQS9YRzVjZEZ4MFhIUmNkSEpsZENBNlhHNWNkRngwWEhSY2RDZ2daV3hsYlZzZ2JtRnRaU0JkSUQwZ2RtRnNkV1VnS1R0Y2JseHVYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdhRzl2YTNNZ0ppWWdYQ0puWlhSY0lpQnBiaUJvYjI5cmN5QW1KaUFvY21WMElEMGdhRzl2YTNNdVoyVjBLQ0JsYkdWdExDQnVZVzFsSUNrcElDRTlQU0J1ZFd4c0lEOWNibHgwWEhSY2RGeDBjbVYwSURwY2JseDBYSFJjZEZ4MFpXeGxiVnNnYm1GdFpTQmRPMXh1WEhSY2RIMWNibHgwZlN4Y2JseHVYSFJ3Y205d1NHOXZhM002SUh0Y2JseDBYSFIwWVdKSmJtUmxlRG9nZTF4dVhIUmNkRngwWjJWME9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHVnNaVzB1YUdGelFYUjBjbWxpZFhSbEtDQmNJblJoWW1sdVpHVjRYQ0lnS1NCOGZDQnlabTlqZFhOaFlteGxMblJsYzNRb0lHVnNaVzB1Ym05a1pVNWhiV1VnS1NCOGZDQmxiR1Z0TG1oeVpXWWdQMXh1WEhSY2RGeDBYSFJjZEdWc1pXMHVkR0ZpU1c1a1pYZ2dPbHh1WEhSY2RGeDBYSFJjZEMweE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBmVnh1ZlNrN1hHNWNibWxtSUNnZ0lYTjFjSEJ2Y25RdWIzQjBVMlZzWldOMFpXUWdLU0I3WEc1Y2RHcFJkV1Z5ZVM1d2NtOXdTRzl2YTNNdWMyVnNaV04wWldRZ1BTQjdYRzVjZEZ4MFoyVjBPaUJtZFc1amRHbHZiaWdnWld4bGJTQXBJSHRjYmx4MFhIUmNkSFpoY2lCd1lYSmxiblFnUFNCbGJHVnRMbkJoY21WdWRFNXZaR1U3WEc1Y2RGeDBYSFJwWmlBb0lIQmhjbVZ1ZENBbUppQndZWEpsYm5RdWNHRnlaVzUwVG05a1pTQXBJSHRjYmx4MFhIUmNkRngwY0dGeVpXNTBMbkJoY21WdWRFNXZaR1V1YzJWc1pXTjBaV1JKYm1SbGVEdGNibHgwWEhSY2RIMWNibHgwWEhSY2RISmxkSFZ5YmlCdWRXeHNPMXh1WEhSY2RIMWNibHgwZlR0Y2JuMWNibHh1YWxGMVpYSjVMbVZoWTJnb1cxeHVYSFJjSW5SaFlrbHVaR1Y0WENJc1hHNWNkRndpY21WaFpFOXViSGxjSWl4Y2JseDBYQ0p0WVhoTVpXNW5kR2hjSWl4Y2JseDBYQ0pqWld4c1UzQmhZMmx1WjF3aUxGeHVYSFJjSW1ObGJHeFFZV1JrYVc1blhDSXNYRzVjZEZ3aWNtOTNVM0JoYmx3aUxGeHVYSFJjSW1OdmJGTndZVzVjSWl4Y2JseDBYQ0oxYzJWTllYQmNJaXhjYmx4MFhDSm1jbUZ0WlVKdmNtUmxjbHdpTEZ4dVhIUmNJbU52Ym5SbGJuUkZaR2wwWVdKc1pWd2lYRzVkTENCbWRXNWpkR2x2YmlncElIdGNibHgwYWxGMVpYSjVMbkJ5YjNCR2FYaGJJSFJvYVhNdWRHOU1iM2RsY2tOaGMyVW9LU0JkSUQwZ2RHaHBjenRjYm4wcE8xeHVYRzVjYmx4dVhHNTJZWElnY21Oc1lYTnpJRDBnTDF0Y1hIUmNYSEpjWEc1Y1hHWmRMMmM3WEc1Y2JtcFJkV1Z5ZVM1bWJpNWxlSFJsYm1Rb2UxeHVYSFJoWkdSRGJHRnpjem9nWm5WdVkzUnBiMjRvSUhaaGJIVmxJQ2tnZTF4dVhIUmNkSFpoY2lCamJHRnpjMlZ6TENCbGJHVnRMQ0JqZFhJc0lHTnNZWHA2TENCcUxDQm1hVzVoYkZaaGJIVmxMRnh1WEhSY2RGeDBjSEp2WTJWbFpDQTlJSFI1Y0dWdlppQjJZV3gxWlNBOVBUMGdYQ0p6ZEhKcGJtZGNJaUFtSmlCMllXeDFaU3hjYmx4MFhIUmNkR2tnUFNBd0xGeHVYSFJjZEZ4MGJHVnVJRDBnZEdocGN5NXNaVzVuZEdnN1hHNWNibHgwWEhScFppQW9JR3BSZFdWeWVTNXBjMFoxYm1OMGFXOXVLQ0IyWVd4MVpTQXBJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVJSFJvYVhNdVpXRmphQ2htZFc1amRHbHZiaWdnYWlBcElIdGNibHgwWEhSY2RGeDBhbEYxWlhKNUtDQjBhR2x6SUNrdVlXUmtRMnhoYzNNb0lIWmhiSFZsTG1OaGJHd29JSFJvYVhNc0lHb3NJSFJvYVhNdVkyeGhjM05PWVcxbElDa2dLVHRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkSDFjYmx4dVhIUmNkR2xtSUNnZ2NISnZZMlZsWkNBcElIdGNibHgwWEhSY2RDOHZJRlJvWlNCa2FYTnFkVzVqZEdsdmJpQm9aWEpsSUdseklHWnZjaUJpWlhSMFpYSWdZMjl0Y0hKbGMzTnBZbWxzYVhSNUlDaHpaV1VnY21WdGIzWmxRMnhoYzNNcFhHNWNkRngwWEhSamJHRnpjMlZ6SUQwZ0tDQjJZV3gxWlNCOGZDQmNJbHdpSUNrdWJXRjBZMmdvSUhKdWIzUjNhR2wwWlNBcElIeDhJRnRkTzF4dVhHNWNkRngwWEhSbWIzSWdLQ0E3SUdrZ1BDQnNaVzQ3SUdrckt5QXBJSHRjYmx4MFhIUmNkRngwWld4bGJTQTlJSFJvYVhOYklHa2dYVHRjYmx4MFhIUmNkRngwWTNWeUlEMGdaV3hsYlM1dWIyUmxWSGx3WlNBOVBUMGdNU0FtSmlBb0lHVnNaVzB1WTJ4aGMzTk9ZVzFsSUQ5Y2JseDBYSFJjZEZ4MFhIUW9JRndpSUZ3aUlDc2daV3hsYlM1amJHRnpjMDVoYldVZ0t5QmNJaUJjSWlBcExuSmxjR3hoWTJVb0lISmpiR0Z6Y3l3Z1hDSWdYQ0lnS1NBNlhHNWNkRngwWEhSY2RGeDBYQ0lnWENKY2JseDBYSFJjZEZ4MEtUdGNibHh1WEhSY2RGeDBYSFJwWmlBb0lHTjFjaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUnFJRDBnTUR0Y2JseDBYSFJjZEZ4MFhIUjNhR2xzWlNBb0lDaGpiR0Y2ZWlBOUlHTnNZWE56WlhOYmFpc3JYU2tnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJwWmlBb0lHTjFjaTVwYm1SbGVFOW1LQ0JjSWlCY0lpQXJJR05zWVhwNklDc2dYQ0lnWENJZ0tTQThJREFnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEdOMWNpQXJQU0JqYkdGNmVpQXJJRndpSUZ3aU8xeHVYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEM4dklHOXViSGtnWVhOemFXZHVJR2xtSUdScFptWmxjbVZ1ZENCMGJ5QmhkbTlwWkNCMWJtNWxaV1JsWkNCeVpXNWtaWEpwYm1jdVhHNWNkRngwWEhSY2RGeDBabWx1WVd4V1lXeDFaU0E5SUdwUmRXVnllUzUwY21sdEtDQmpkWElnS1R0Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSUdWc1pXMHVZMnhoYzNOT1lXMWxJQ0U5UFNCbWFXNWhiRlpoYkhWbElDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFpXeGxiUzVqYkdGemMwNWhiV1VnUFNCbWFXNWhiRlpoYkhWbE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TzF4dVhIUjlMRnh1WEc1Y2RISmxiVzkyWlVOc1lYTnpPaUJtZFc1amRHbHZiaWdnZG1Gc2RXVWdLU0I3WEc1Y2RGeDBkbUZ5SUdOc1lYTnpaWE1zSUdWc1pXMHNJR04xY2l3Z1kyeGhlbm9zSUdvc0lHWnBibUZzVm1Gc2RXVXNYRzVjZEZ4MFhIUndjbTlqWldWa0lEMGdZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQTlQVDBnTUNCOGZDQjBlWEJsYjJZZ2RtRnNkV1VnUFQwOUlGd2ljM1J5YVc1blhDSWdKaVlnZG1Gc2RXVXNYRzVjZEZ4MFhIUnBJRDBnTUN4Y2JseDBYSFJjZEd4bGJpQTlJSFJvYVhNdWJHVnVaM1JvTzF4dVhHNWNkRngwYVdZZ0tDQnFVWFZsY25rdWFYTkdkVzVqZEdsdmJpZ2dkbUZzZFdVZ0tTQXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQjBhR2x6TG1WaFkyZ29ablZ1WTNScGIyNG9JR29nS1NCN1hHNWNkRngwWEhSY2RHcFJkV1Z5ZVNnZ2RHaHBjeUFwTG5KbGJXOTJaVU5zWVhOektDQjJZV3gxWlM1allXeHNLQ0IwYUdsekxDQnFMQ0IwYUdsekxtTnNZWE56VG1GdFpTQXBJQ2s3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5WEc1Y2RGeDBhV1lnS0NCd2NtOWpaV1ZrSUNrZ2UxeHVYSFJjZEZ4MFkyeGhjM05sY3lBOUlDZ2dkbUZzZFdVZ2ZId2dYQ0pjSWlBcExtMWhkR05vS0NCeWJtOTBkMmhwZEdVZ0tTQjhmQ0JiWFR0Y2JseHVYSFJjZEZ4MFptOXlJQ2dnT3lCcElEd2diR1Z1T3lCcEt5c2dLU0I3WEc1Y2RGeDBYSFJjZEdWc1pXMGdQU0IwYUdseld5QnBJRjA3WEc1Y2RGeDBYSFJjZEM4dklGUm9hWE1nWlhod2NtVnpjMmx2YmlCcGN5Qm9aWEpsSUdadmNpQmlaWFIwWlhJZ1kyOXRjSEpsYzNOcFltbHNhWFI1SUNoelpXVWdZV1JrUTJ4aGMzTXBYRzVjZEZ4MFhIUmNkR04xY2lBOUlHVnNaVzB1Ym05a1pWUjVjR1VnUFQwOUlERWdKaVlnS0NCbGJHVnRMbU5zWVhOelRtRnRaU0EvWEc1Y2RGeDBYSFJjZEZ4MEtDQmNJaUJjSWlBcklHVnNaVzB1WTJ4aGMzTk9ZVzFsSUNzZ1hDSWdYQ0lnS1M1eVpYQnNZV05sS0NCeVkyeGhjM01zSUZ3aUlGd2lJQ2tnT2x4dVhIUmNkRngwWEhSY2RGd2lYQ0pjYmx4MFhIUmNkRngwS1R0Y2JseHVYSFJjZEZ4MFhIUnBaaUFvSUdOMWNpQXBJSHRjYmx4MFhIUmNkRngwWEhScUlEMGdNRHRjYmx4MFhIUmNkRngwWEhSM2FHbHNaU0FvSUNoamJHRjZlaUE5SUdOc1lYTnpaWE5iYWlzclhTa2dLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUXZMeUJTWlcxdmRtVWdLbUZzYkNvZ2FXNXpkR0Z1WTJWelhHNWNkRngwWEhSY2RGeDBYSFIzYUdsc1pTQW9JR04xY2k1cGJtUmxlRTltS0NCY0lpQmNJaUFySUdOc1lYcDZJQ3NnWENJZ1hDSWdLU0ErUFNBd0lDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmpkWElnUFNCamRYSXVjbVZ3YkdGalpTZ2dYQ0lnWENJZ0t5QmpiR0Y2ZWlBcklGd2lJRndpTENCY0lpQmNJaUFwTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUmNkQzh2SUU5dWJIa2dZWE56YVdkdUlHbG1JR1JwWm1abGNtVnVkQ0IwYnlCaGRtOXBaQ0IxYm01bFpXUmxaQ0J5Wlc1a1pYSnBibWN1WEc1Y2RGeDBYSFJjZEZ4MFptbHVZV3hXWVd4MVpTQTlJSFpoYkhWbElEOGdhbEYxWlhKNUxuUnlhVzBvSUdOMWNpQXBJRG9nWENKY0lqdGNibHgwWEhSY2RGeDBYSFJwWmlBb0lHVnNaVzB1WTJ4aGMzTk9ZVzFsSUNFOVBTQm1hVzVoYkZaaGJIVmxJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBaV3hsYlM1amJHRnpjMDVoYldVZ1BTQm1hVzVoYkZaaGJIVmxPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseHVYSFJjZEhKbGRIVnliaUIwYUdsek8xeHVYSFI5TEZ4dVhHNWNkSFJ2WjJkc1pVTnNZWE56T2lCbWRXNWpkR2x2YmlnZ2RtRnNkV1VzSUhOMFlYUmxWbUZzSUNrZ2UxeHVYSFJjZEhaaGNpQjBlWEJsSUQwZ2RIbHdaVzltSUhaaGJIVmxPMXh1WEc1Y2RGeDBhV1lnS0NCMGVYQmxiMllnYzNSaGRHVldZV3dnUFQwOUlGd2lZbTl2YkdWaGJsd2lJQ1ltSUhSNWNHVWdQVDA5SUZ3aWMzUnlhVzVuWENJZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2MzUmhkR1ZXWVd3Z1B5QjBhR2x6TG1Ga1pFTnNZWE56S0NCMllXeDFaU0FwSURvZ2RHaHBjeTV5WlcxdmRtVkRiR0Z6Y3lnZ2RtRnNkV1VnS1R0Y2JseDBYSFI5WEc1Y2JseDBYSFJwWmlBb0lHcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQjJZV3gxWlNBcElDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlIUm9hWE11WldGamFDaG1kVzVqZEdsdmJpZ2dhU0FwSUh0Y2JseDBYSFJjZEZ4MGFsRjFaWEo1S0NCMGFHbHpJQ2t1ZEc5bloyeGxRMnhoYzNNb0lIWmhiSFZsTG1OaGJHd29kR2hwY3l3Z2FTd2dkR2hwY3k1amJHRnpjMDVoYldVc0lITjBZWFJsVm1Gc0tTd2djM1JoZEdWV1lXd2dLVHRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkSDFjYmx4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG1WaFkyZ29ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJwWmlBb0lIUjVjR1VnUFQwOUlGd2ljM1J5YVc1blhDSWdLU0I3WEc1Y2RGeDBYSFJjZEM4dklGUnZaMmRzWlNCcGJtUnBkbWxrZFdGc0lHTnNZWE56SUc1aGJXVnpYRzVjZEZ4MFhIUmNkSFpoY2lCamJHRnpjMDVoYldVc1hHNWNkRngwWEhSY2RGeDBhU0E5SURBc1hHNWNkRngwWEhSY2RGeDBjMlZzWmlBOUlHcFJkV1Z5ZVNnZ2RHaHBjeUFwTEZ4dVhIUmNkRngwWEhSY2RHTnNZWE56VG1GdFpYTWdQU0IyWVd4MVpTNXRZWFJqYUNnZ2NtNXZkSGRvYVhSbElDa2dmSHdnVzEwN1hHNWNibHgwWEhSY2RGeDBkMmhwYkdVZ0tDQW9ZMnhoYzNOT1lXMWxJRDBnWTJ4aGMzTk9ZVzFsYzFzZ2FTc3JJRjBwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkQzh2SUVOb1pXTnJJR1ZoWTJnZ1kyeGhjM05PWVcxbElHZHBkbVZ1TENCemNHRmpaU0J6WlhCaGNtRjBaV1FnYkdsemRGeHVYSFJjZEZ4MFhIUmNkR2xtSUNnZ2MyVnNaaTVvWVhORGJHRnpjeWdnWTJ4aGMzTk9ZVzFsSUNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSelpXeG1MbkpsYlc5MlpVTnNZWE56S0NCamJHRnpjMDVoYldVZ0tUdGNibHgwWEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEZ4MGMyVnNaaTVoWkdSRGJHRnpjeWdnWTJ4aGMzTk9ZVzFsSUNrN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklGUnZaMmRzWlNCM2FHOXNaU0JqYkdGemN5QnVZVzFsWEc1Y2RGeDBYSFI5SUdWc2MyVWdhV1lnS0NCMGVYQmxJRDA5UFNCemRISjFibVJsWm1sdVpXUWdmSHdnZEhsd1pTQTlQVDBnWENKaWIyOXNaV0Z1WENJZ0tTQjdYRzVjZEZ4MFhIUmNkR2xtSUNnZ2RHaHBjeTVqYkdGemMwNWhiV1VnS1NCN1hHNWNkRngwWEhSY2RGeDBMeThnYzNSdmNtVWdZMnhoYzNOT1lXMWxJR2xtSUhObGRGeHVYSFJjZEZ4MFhIUmNkR1JoZEdGZmNISnBkaTV6WlhRb0lIUm9hWE1zSUZ3aVgxOWpiR0Z6YzA1aGJXVmZYMXdpTENCMGFHbHpMbU5zWVhOelRtRnRaU0FwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBMeThnU1dZZ2RHaGxJR1ZzWlcxbGJuUWdhR0Z6SUdFZ1kyeGhjM01nYm1GdFpTQnZjaUJwWmlCM1pTZHlaU0J3WVhOelpXUWdZR1poYkhObFlDeGNibHgwWEhSY2RGeDBMeThnZEdobGJpQnlaVzF2ZG1VZ2RHaGxJSGRvYjJ4bElHTnNZWE56Ym1GdFpTQW9hV1lnZEdobGNtVWdkMkZ6SUc5dVpTd2dkR2hsSUdGaWIzWmxJSE5oZG1Wa0lHbDBLUzVjYmx4MFhIUmNkRngwTHk4Z1QzUm9aWEozYVhObElHSnlhVzVuSUdKaFkyc2dkMmhoZEdWMlpYSWdkMkZ6SUhCeVpYWnBiM1Z6YkhrZ2MyRjJaV1FnS0dsbUlHRnVlWFJvYVc1bktTeGNibHgwWEhSY2RGeDBMeThnWm1Gc2JHbHVaeUJpWVdOcklIUnZJSFJvWlNCbGJYQjBlU0J6ZEhKcGJtY2dhV1lnYm05MGFHbHVaeUIzWVhNZ2MzUnZjbVZrTGx4dVhIUmNkRngwWEhSMGFHbHpMbU5zWVhOelRtRnRaU0E5SUhSb2FYTXVZMnhoYzNOT1lXMWxJSHg4SUhaaGJIVmxJRDA5UFNCbVlXeHpaU0EvSUZ3aVhDSWdPaUJrWVhSaFgzQnlhWFl1WjJWMEtDQjBhR2x6TENCY0lsOWZZMnhoYzNOT1lXMWxYMTljSWlBcElIeDhJRndpWENJN1hHNWNkRngwWEhSOVhHNWNkRngwZlNrN1hHNWNkSDBzWEc1Y2JseDBhR0Z6UTJ4aGMzTTZJR1oxYm1OMGFXOXVLQ0J6Wld4bFkzUnZjaUFwSUh0Y2JseDBYSFIyWVhJZ1kyeGhjM05PWVcxbElEMGdYQ0lnWENJZ0t5QnpaV3hsWTNSdmNpQXJJRndpSUZ3aUxGeHVYSFJjZEZ4MGFTQTlJREFzWEc1Y2RGeDBYSFJzSUQwZ2RHaHBjeTVzWlc1bmRHZzdYRzVjZEZ4MFptOXlJQ2dnT3lCcElEd2diRHNnYVNzcklDa2dlMXh1WEhSY2RGeDBhV1lnS0NCMGFHbHpXMmxkTG01dlpHVlVlWEJsSUQwOVBTQXhJQ1ltSUNoY0lpQmNJaUFySUhSb2FYTmJhVjB1WTJ4aGMzTk9ZVzFsSUNzZ1hDSWdYQ0lwTG5KbGNHeGhZMlVvY21Oc1lYTnpMQ0JjSWlCY0lpa3VhVzVrWlhoUFppZ2dZMnhoYzNOT1lXMWxJQ2tnUGowZ01DQXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ5ZFdVN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhHNWNkRngwY21WMGRYSnVJR1poYkhObE8xeHVYSFI5WEc1OUtUdGNibHh1WEc1Y2JseHVkbUZ5SUhKeVpYUjFjbTRnUFNBdlhGeHlMMmM3WEc1Y2JtcFJkV1Z5ZVM1bWJpNWxlSFJsYm1Rb2UxeHVYSFIyWVd3NklHWjFibU4wYVc5dUtDQjJZV3gxWlNBcElIdGNibHgwWEhSMllYSWdhRzl2YTNNc0lISmxkQ3dnYVhOR2RXNWpkR2x2Yml4Y2JseDBYSFJjZEdWc1pXMGdQU0IwYUdseld6QmRPMXh1WEc1Y2RGeDBhV1lnS0NBaFlYSm5kVzFsYm5SekxteGxibWQwYUNBcElIdGNibHgwWEhSY2RHbG1JQ2dnWld4bGJTQXBJSHRjYmx4MFhIUmNkRngwYUc5dmEzTWdQU0JxVVhWbGNua3VkbUZzU0c5dmEzTmJJR1ZzWlcwdWRIbHdaU0JkSUh4OElHcFJkV1Z5ZVM1MllXeEliMjlyYzFzZ1pXeGxiUzV1YjJSbFRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElGMDdYRzVjYmx4MFhIUmNkRngwYVdZZ0tDQm9iMjlyY3lBbUppQmNJbWRsZEZ3aUlHbHVJR2h2YjJ0eklDWW1JQ2h5WlhRZ1BTQm9iMjlyY3k1blpYUW9JR1ZzWlcwc0lGd2lkbUZzZFdWY0lpQXBLU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJ5WlhRN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJ5WlhRZ1BTQmxiR1Z0TG5aaGJIVmxPMXh1WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwZVhCbGIyWWdjbVYwSUQwOVBTQmNJbk4wY21sdVoxd2lJRDljYmx4MFhIUmNkRngwWEhRdkx5QklZVzVrYkdVZ2JXOXpkQ0JqYjIxdGIyNGdjM1J5YVc1bklHTmhjMlZ6WEc1Y2RGeDBYSFJjZEZ4MGNtVjBMbkpsY0d4aFkyVW9jbkpsZEhWeWJpd2dYQ0pjSWlrZ09seHVYSFJjZEZ4MFhIUmNkQzh2SUVoaGJtUnNaU0JqWVhObGN5QjNhR1Z5WlNCMllXeDFaU0JwY3lCdWRXeHNMM1Z1WkdWbUlHOXlJRzUxYldKbGNseHVYSFJjZEZ4MFhIUmNkSEpsZENBOVBTQnVkV3hzSUQ4Z1hDSmNJaUE2SUhKbGREdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEdselJuVnVZM1JwYjI0Z1BTQnFVWFZsY25rdWFYTkdkVzVqZEdsdmJpZ2dkbUZzZFdVZ0tUdGNibHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbVZoWTJnb1puVnVZM1JwYjI0b0lHa2dLU0I3WEc1Y2RGeDBYSFIyWVhJZ2RtRnNPMXh1WEc1Y2RGeDBYSFJwWmlBb0lIUm9hWE11Ym05a1pWUjVjR1VnSVQwOUlERWdLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwYVdZZ0tDQnBjMFoxYm1OMGFXOXVJQ2tnZTF4dVhIUmNkRngwWEhSMllXd2dQU0IyWVd4MVpTNWpZV3hzS0NCMGFHbHpMQ0JwTENCcVVYVmxjbmtvSUhSb2FYTWdLUzUyWVd3b0tTQXBPMXh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBkbUZzSUQwZ2RtRnNkV1U3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklGUnlaV0YwSUc1MWJHd3ZkVzVrWldacGJtVmtJR0Z6SUZ3aVhDSTdJR052Ym5abGNuUWdiblZ0WW1WeWN5QjBieUJ6ZEhKcGJtZGNibHgwWEhSY2RHbG1JQ2dnZG1Gc0lEMDlJRzUxYkd3Z0tTQjdYRzVjZEZ4MFhIUmNkSFpoYkNBOUlGd2lYQ0k3WEc1Y2JseDBYSFJjZEgwZ1pXeHpaU0JwWmlBb0lIUjVjR1Z2WmlCMllXd2dQVDA5SUZ3aWJuVnRZbVZ5WENJZ0tTQjdYRzVjZEZ4MFhIUmNkSFpoYkNBclBTQmNJbHdpTzF4dVhHNWNkRngwWEhSOUlHVnNjMlVnYVdZZ0tDQnFVWFZsY25rdWFYTkJjbkpoZVNnZ2RtRnNJQ2tnS1NCN1hHNWNkRngwWEhSY2RIWmhiQ0E5SUdwUmRXVnllUzV0WVhBb0lIWmhiQ3dnWm5WdVkzUnBiMjRvSUhaaGJIVmxJQ2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCMllXeDFaU0E5UFNCdWRXeHNJRDhnWENKY0lpQTZJSFpoYkhWbElDc2dYQ0pjSWp0Y2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkR2h2YjJ0eklEMGdhbEYxWlhKNUxuWmhiRWh2YjJ0eld5QjBhR2x6TG5SNWNHVWdYU0I4ZkNCcVVYVmxjbmt1ZG1Gc1NHOXZhM05iSUhSb2FYTXVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1NCZE8xeHVYRzVjZEZ4MFhIUXZMeUJKWmlCelpYUWdjbVYwZFhKdWN5QjFibVJsWm1sdVpXUXNJR1poYkd3Z1ltRmpheUIwYnlCdWIzSnRZV3dnYzJWMGRHbHVaMXh1WEhSY2RGeDBhV1lnS0NBaGFHOXZhM01nZkh3Z0lTaGNJbk5sZEZ3aUlHbHVJR2h2YjJ0ektTQjhmQ0JvYjI5cmN5NXpaWFFvSUhSb2FYTXNJSFpoYkN3Z1hDSjJZV3gxWlZ3aUlDa2dQVDA5SUhWdVpHVm1hVzVsWkNBcElIdGNibHgwWEhSY2RGeDBkR2hwY3k1MllXeDFaU0E5SUhaaGJEdGNibHgwWEhSY2RIMWNibHgwWEhSOUtUdGNibHgwZlZ4dWZTazdYRzVjYm1wUmRXVnllUzVsZUhSbGJtUW9lMXh1WEhSMllXeEliMjlyY3pvZ2UxeHVYSFJjZEc5d2RHbHZiam9nZTF4dVhIUmNkRngwWjJWME9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhSY2RGeDBkbUZ5SUhaaGJDQTlJR3BSZFdWeWVTNW1hVzVrTG1GMGRISW9JR1ZzWlcwc0lGd2lkbUZzZFdWY0lpQXBPMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkbUZzSUNFOUlHNTFiR3dnUDF4dVhIUmNkRngwWEhSY2RIWmhiQ0E2WEc1Y2RGeDBYSFJjZEZ4MEx5OGdVM1Z3Y0c5eWREb2dTVVV4TUMweE1TdGNibHgwWEhSY2RGeDBYSFF2THlCdmNIUnBiMjR1ZEdWNGRDQjBhSEp2ZDNNZ1pYaGpaWEIwYVc5dWN5QW9JekUwTmpnMkxDQWpNVFE0TlRncFhHNWNkRngwWEhSY2RGeDBhbEYxWlhKNUxuUnlhVzBvSUdwUmRXVnllUzUwWlhoMEtDQmxiR1Z0SUNrZ0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOUxGeHVYSFJjZEhObGJHVmpkRG9nZTF4dVhIUmNkRngwWjJWME9pQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwWEhSY2RGeDBkbUZ5SUhaaGJIVmxMQ0J2Y0hScGIyNHNYRzVjZEZ4MFhIUmNkRngwYjNCMGFXOXVjeUE5SUdWc1pXMHViM0IwYVc5dWN5eGNibHgwWEhSY2RGeDBYSFJwYm1SbGVDQTlJR1ZzWlcwdWMyVnNaV04wWldSSmJtUmxlQ3hjYmx4MFhIUmNkRngwWEhSdmJtVWdQU0JsYkdWdExuUjVjR1VnUFQwOUlGd2ljMlZzWldOMExXOXVaVndpSUh4OElHbHVaR1Y0SUR3Z01DeGNibHgwWEhSY2RGeDBYSFIyWVd4MVpYTWdQU0J2Ym1VZ1B5QnVkV3hzSURvZ1cxMHNYRzVjZEZ4MFhIUmNkRngwYldGNElEMGdiMjVsSUQ4Z2FXNWtaWGdnS3lBeElEb2diM0IwYVc5dWN5NXNaVzVuZEdnc1hHNWNkRngwWEhSY2RGeDBhU0E5SUdsdVpHVjRJRHdnTUNBL1hHNWNkRngwWEhSY2RGeDBYSFJ0WVhnZ09seHVYSFJjZEZ4MFhIUmNkRngwYjI1bElEOGdhVzVrWlhnZ09pQXdPMXh1WEc1Y2RGeDBYSFJjZEM4dklFeHZiM0FnZEdoeWIzVm5hQ0JoYkd3Z2RHaGxJSE5sYkdWamRHVmtJRzl3ZEdsdmJuTmNibHgwWEhSY2RGeDBabTl5SUNnZ095QnBJRHdnYldGNE95QnBLeXNnS1NCN1hHNWNkRngwWEhSY2RGeDBiM0IwYVc5dUlEMGdiM0IwYVc5dWMxc2dhU0JkTzF4dVhHNWNkRngwWEhSY2RGeDBMeThnU1VVMkxUa2daRzlsYzI0bmRDQjFjR1JoZEdVZ2MyVnNaV04wWldRZ1lXWjBaWElnWm05eWJTQnlaWE5sZENBb0l6STFOVEVwWEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0FvSUc5d2RHbHZiaTV6Wld4bFkzUmxaQ0I4ZkNCcElEMDlQU0JwYm1SbGVDQXBJQ1ltWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzh2SUVSdmJpZDBJSEpsZEhWeWJpQnZjSFJwYjI1eklIUm9ZWFFnWVhKbElHUnBjMkZpYkdWa0lHOXlJR2x1SUdFZ1pHbHpZV0pzWldRZ2IzQjBaM0p2ZFhCY2JseDBYSFJjZEZ4MFhIUmNkRngwS0NCemRYQndiM0owTG05d2RFUnBjMkZpYkdWa0lEOGdJVzl3ZEdsdmJpNWthWE5oWW14bFpDQTZJRzl3ZEdsdmJpNW5aWFJCZEhSeWFXSjFkR1VvSUZ3aVpHbHpZV0pzWldSY0lpQXBJRDA5UFNCdWRXeHNJQ2tnSmlaY2JseDBYSFJjZEZ4MFhIUmNkRngwS0NBaGIzQjBhVzl1TG5CaGNtVnVkRTV2WkdVdVpHbHpZV0pzWldRZ2ZId2dJV3BSZFdWeWVTNXViMlJsVG1GdFpTZ2diM0IwYVc5dUxuQmhjbVZ1ZEU1dlpHVXNJRndpYjNCMFozSnZkWEJjSWlBcElDa2dLU0I3WEc1Y2JseDBYSFJjZEZ4MFhIUmNkQzh2SUVkbGRDQjBhR1VnYzNCbFkybG1hV01nZG1Gc2RXVWdabTl5SUhSb1pTQnZjSFJwYjI1Y2JseDBYSFJjZEZ4MFhIUmNkSFpoYkhWbElEMGdhbEYxWlhKNUtDQnZjSFJwYjI0Z0tTNTJZV3dvS1R0Y2JseHVYSFJjZEZ4MFhIUmNkRngwTHk4Z1YyVWdaRzl1SjNRZ2JtVmxaQ0JoYmlCaGNuSmhlU0JtYjNJZ2IyNWxJSE5sYkdWamRITmNibHgwWEhSY2RGeDBYSFJjZEdsbUlDZ2diMjVsSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnZG1Gc2RXVTdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJjZEM4dklFMTFiSFJwTFZObGJHVmpkSE1nY21WMGRYSnVJR0Z1SUdGeWNtRjVYRzVjZEZ4MFhIUmNkRngwWEhSMllXeDFaWE11Y0hWemFDZ2dkbUZzZFdVZ0tUdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RtRnNkV1Z6TzF4dVhIUmNkRngwZlN4Y2JseHVYSFJjZEZ4MGMyVjBPaUJtZFc1amRHbHZiaWdnWld4bGJTd2dkbUZzZFdVZ0tTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCdmNIUnBiMjVUWlhRc0lHOXdkR2x2Yml4Y2JseDBYSFJjZEZ4MFhIUnZjSFJwYjI1eklEMGdaV3hsYlM1dmNIUnBiMjV6TEZ4dVhIUmNkRngwWEhSY2RIWmhiSFZsY3lBOUlHcFJkV1Z5ZVM1dFlXdGxRWEp5WVhrb0lIWmhiSFZsSUNrc1hHNWNkRngwWEhSY2RGeDBhU0E5SUc5d2RHbHZibk11YkdWdVozUm9PMXh1WEc1Y2RGeDBYSFJjZEhkb2FXeGxJQ2dnYVMwdElDa2dlMXh1WEhSY2RGeDBYSFJjZEc5d2RHbHZiaUE5SUc5d2RHbHZibk5iSUdrZ1hUdGNibHgwWEhSY2RGeDBYSFJwWmlBb0lDaHZjSFJwYjI0dWMyVnNaV04wWldRZ1BTQnFVWFZsY25rdWFXNUJjbkpoZVNnZ2IzQjBhVzl1TG5aaGJIVmxMQ0IyWVd4MVpYTWdLU0ErUFNBd0tTQXBJSHRjYmx4MFhIUmNkRngwWEhSY2RHOXdkR2x2YmxObGRDQTlJSFJ5ZFdVN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MEx5OGdSbTl5WTJVZ1luSnZkM05sY25NZ2RHOGdZbVZvWVhabElHTnZibk5wYzNSbGJuUnNlU0IzYUdWdUlHNXZiaTF0WVhSamFHbHVaeUIyWVd4MVpTQnBjeUJ6WlhSY2JseDBYSFJjZEZ4MGFXWWdLQ0FoYjNCMGFXOXVVMlYwSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkR1ZzWlcwdWMyVnNaV04wWldSSmJtUmxlQ0E5SUMweE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjJZV3gxWlhNN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUjlYRzU5S1R0Y2JseHVMeThnVW1Ga2FXOXpJR0Z1WkNCamFHVmphMkp2ZUdWeklHZGxkSFJsY2k5elpYUjBaWEpjYm1wUmRXVnllUzVsWVdOb0tGc2dYQ0p5WVdScGIxd2lMQ0JjSW1Ob1pXTnJZbTk0WENJZ1hTd2dablZ1WTNScGIyNG9LU0I3WEc1Y2RHcFJkV1Z5ZVM1MllXeEliMjlyYzFzZ2RHaHBjeUJkSUQwZ2UxeHVYSFJjZEhObGREb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lIWmhiSFZsSUNrZ2UxeHVYSFJjZEZ4MGFXWWdLQ0JxVVhWbGNua3VhWE5CY25KaGVTZ2dkbUZzZFdVZ0tTQXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJQ2dnWld4bGJTNWphR1ZqYTJWa0lEMGdhbEYxWlhKNUxtbHVRWEp5WVhrb0lHcFJkV1Z5ZVNobGJHVnRLUzUyWVd3b0tTd2dkbUZzZFdVZ0tTQStQU0F3SUNrN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUjlPMXh1WEhScFppQW9JQ0Z6ZFhCd2IzSjBMbU5vWldOclQyNGdLU0I3WEc1Y2RGeDBhbEYxWlhKNUxuWmhiRWh2YjJ0eld5QjBhR2x6SUYwdVoyVjBJRDBnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdaV3hsYlM1blpYUkJkSFJ5YVdKMWRHVW9YQ0oyWVd4MVpWd2lLU0E5UFQwZ2JuVnNiQ0EvSUZ3aWIyNWNJaUE2SUdWc1pXMHVkbUZzZFdVN1hHNWNkRngwZlR0Y2JseDBmVnh1ZlNrN1hHNWNibHh1WEc1Y2JpOHZJRkpsZEhWeWJpQnFVWFZsY25rZ1ptOXlJR0YwZEhKcFluVjBaWE10YjI1c2VTQnBibU5zZFhOcGIyNWNibHh1WEc1cVVYVmxjbmt1WldGamFDZ2dLRndpWW14MWNpQm1iMk4xY3lCbWIyTjFjMmx1SUdadlkzVnpiM1YwSUd4dllXUWdjbVZ6YVhwbElITmpjbTlzYkNCMWJteHZZV1FnWTJ4cFkyc2daR0pzWTJ4cFkyc2dYQ0lnSzF4dVhIUmNJbTF2ZFhObFpHOTNiaUJ0YjNWelpYVndJRzF2ZFhObGJXOTJaU0J0YjNWelpXOTJaWElnYlc5MWMyVnZkWFFnYlc5MWMyVmxiblJsY2lCdGIzVnpaV3hsWVhabElGd2lJQ3RjYmx4MFhDSmphR0Z1WjJVZ2MyVnNaV04wSUhOMVltMXBkQ0JyWlhsa2IzZHVJR3RsZVhCeVpYTnpJR3RsZVhWd0lHVnljbTl5SUdOdmJuUmxlSFJ0Wlc1MVhDSXBMbk53YkdsMEtGd2lJRndpS1N3Z1puVnVZM1JwYjI0b0lHa3NJRzVoYldVZ0tTQjdYRzVjYmx4MEx5OGdTR0Z1Wkd4bElHVjJaVzUwSUdKcGJtUnBibWRjYmx4MGFsRjFaWEo1TG1adVd5QnVZVzFsSUYwZ1BTQm1kVzVqZEdsdmJpZ2daR0YwWVN3Z1ptNGdLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ1BpQXdJRDljYmx4MFhIUmNkSFJvYVhNdWIyNG9JRzVoYldVc0lHNTFiR3dzSUdSaGRHRXNJR1p1SUNrZ09seHVYSFJjZEZ4MGRHaHBjeTUwY21sbloyVnlLQ0J1WVcxbElDazdYRzVjZEgwN1hHNTlLVHRjYmx4dWFsRjFaWEo1TG1adUxtVjRkR1Z1WkNoN1hHNWNkR2h2ZG1WeU9pQm1kVzVqZEdsdmJpZ2dabTVQZG1WeUxDQm1iazkxZENBcElIdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NXRiM1Z6WldWdWRHVnlLQ0JtYms5MlpYSWdLUzV0YjNWelpXeGxZWFpsS0NCbWJrOTFkQ0I4ZkNCbWJrOTJaWElnS1R0Y2JseDBmU3hjYmx4dVhIUmlhVzVrT2lCbWRXNWpkR2x2YmlnZ2RIbHdaWE1zSUdSaGRHRXNJR1p1SUNrZ2UxeHVYSFJjZEhKbGRIVnliaUIwYUdsekxtOXVLQ0IwZVhCbGN5d2diblZzYkN3Z1pHRjBZU3dnWm00Z0tUdGNibHgwZlN4Y2JseDBkVzVpYVc1a09pQm1kVzVqZEdsdmJpZ2dkSGx3WlhNc0lHWnVJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG05bVppZ2dkSGx3WlhNc0lHNTFiR3dzSUdadUlDazdYRzVjZEgwc1hHNWNibHgwWkdWc1pXZGhkR1U2SUdaMWJtTjBhVzl1S0NCelpXeGxZM1J2Y2l3Z2RIbHdaWE1zSUdSaGRHRXNJR1p1SUNrZ2UxeHVYSFJjZEhKbGRIVnliaUIwYUdsekxtOXVLQ0IwZVhCbGN5d2djMlZzWldOMGIzSXNJR1JoZEdFc0lHWnVJQ2s3WEc1Y2RIMHNYRzVjZEhWdVpHVnNaV2RoZEdVNklHWjFibU4wYVc5dUtDQnpaV3hsWTNSdmNpd2dkSGx3WlhNc0lHWnVJQ2tnZTF4dVhIUmNkQzh2SUNnZ2JtRnRaWE53WVdObElDa2diM0lnS0NCelpXeGxZM1J2Y2l3Z2RIbHdaWE1nV3l3Z1ptNWRJQ2xjYmx4MFhIUnlaWFIxY200Z1lYSm5kVzFsYm5SekxteGxibWQwYUNBOVBUMGdNU0EvSUhSb2FYTXViMlptS0NCelpXeGxZM1J2Y2l3Z1hDSXFLbHdpSUNrZ09pQjBhR2x6TG05bVppZ2dkSGx3WlhNc0lITmxiR1ZqZEc5eUlIeDhJRndpS2lwY0lpd2dabTRnS1R0Y2JseDBmVnh1ZlNrN1hHNWNibHh1ZG1GeUlHNXZibU5sSUQwZ2FsRjFaWEo1TG01dmR5Z3BPMXh1WEc1MllYSWdjbkYxWlhKNUlEMGdLQzljWEQ4dktUdGNibHh1WEc1Y2JpOHZJRk4xY0hCdmNuUTZJRUZ1WkhKdmFXUWdNaTR6WEc0dkx5QlhiM0pyWVhKdmRXNWtJR1poYVd4MWNtVWdkRzhnYzNSeWFXNW5MV05oYzNRZ2JuVnNiQ0JwYm5CMWRGeHVhbEYxWlhKNUxuQmhjbk5sU2xOUFRpQTlJR1oxYm1OMGFXOXVLQ0JrWVhSaElDa2dlMXh1WEhSeVpYUjFjbTRnU2xOUFRpNXdZWEp6WlNnZ1pHRjBZU0FySUZ3aVhDSWdLVHRjYm4wN1hHNWNibHh1THk4Z1EzSnZjM010WW5KdmQzTmxjaUI0Yld3Z2NHRnljMmx1WjF4dWFsRjFaWEo1TG5CaGNuTmxXRTFNSUQwZ1puVnVZM1JwYjI0b0lHUmhkR0VnS1NCN1hHNWNkSFpoY2lCNGJXd3NJSFJ0Y0R0Y2JseDBhV1lnS0NBaFpHRjBZU0I4ZkNCMGVYQmxiMllnWkdGMFlTQWhQVDBnWENKemRISnBibWRjSWlBcElIdGNibHgwWEhSeVpYUjFjbTRnYm5Wc2JEdGNibHgwZlZ4dVhHNWNkQzh2SUZOMWNIQnZjblE2SUVsRk9WeHVYSFIwY25rZ2UxeHVYSFJjZEhSdGNDQTlJRzVsZHlCRVQwMVFZWEp6WlhJb0tUdGNibHgwWEhSNGJXd2dQU0IwYlhBdWNHRnljMlZHY205dFUzUnlhVzVuS0NCa1lYUmhMQ0JjSW5SbGVIUXZlRzFzWENJZ0tUdGNibHgwZlNCallYUmphQ0FvSUdVZ0tTQjdYRzVjZEZ4MGVHMXNJRDBnZFc1a1pXWnBibVZrTzF4dVhIUjlYRzVjYmx4MGFXWWdLQ0FoZUcxc0lIeDhJSGh0YkM1blpYUkZiR1Z0Wlc1MGMwSjVWR0ZuVG1GdFpTZ2dYQ0p3WVhKelpYSmxjbkp2Y2x3aUlDa3ViR1Z1WjNSb0lDa2dlMXh1WEhSY2RHcFJkV1Z5ZVM1bGNuSnZjaWdnWENKSmJuWmhiR2xrSUZoTlREb2dYQ0lnS3lCa1lYUmhJQ2s3WEc1Y2RIMWNibHgwY21WMGRYSnVJSGh0YkR0Y2JuMDdYRzVjYmx4dWRtRnlYRzVjZEhKb1lYTm9JRDBnTHlNdUtpUXZMRnh1WEhSeWRITWdQU0F2S0ZzL0psMHBYejFiWGlaZEtpOHNYRzVjZEhKb1pXRmtaWEp6SUQwZ0wxNG9MaW8vS1RwYklGeGNkRjBxS0Z0ZVhGeHlYRnh1WFNvcEpDOXRaeXhjYmx4MEx5OGdJemMyTlRNc0lDTTRNVEkxTENBak9ERTFNam9nYkc5allXd2djSEp2ZEc5amIyd2daR1YwWldOMGFXOXVYRzVjZEhKc2IyTmhiRkJ5YjNSdlkyOXNJRDBnTDE0b1B6cGhZbTkxZEh4aGNIQjhZWEJ3TFhOMGIzSmhaMlY4TGlzdFpYaDBaVzV6YVc5dWZHWnBiR1Y4Y21WemZIZHBaR2RsZENrNkpDOHNYRzVjZEhKdWIwTnZiblJsYm5RZ1BTQXZYaWcvT2tkRlZIeElSVUZFS1NRdkxGeHVYSFJ5Y0hKdmRHOWpiMndnUFNBdlhseGNMMXhjTHk4c1hHNWNkSEoxY213Z1BTQXZYaWhiWEZ4M0xpc3RYU3M2S1NnL09seGNMMXhjTHlnL09sdGVYRnd2UHlOZEtrQjhLU2hiWGx4Y0x6OGpPbDBxS1NnL09qb29YRnhrS3lsOEtYd3BMeXhjYmx4dVhIUXZLaUJRY21WbWFXeDBaWEp6WEc1Y2RDQXFJREVwSUZSb1pYa2dZWEpsSUhWelpXWjFiQ0IwYnlCcGJuUnliMlIxWTJVZ1kzVnpkRzl0SUdSaGRHRlVlWEJsY3lBb2MyVmxJR0ZxWVhndmFuTnZibkF1YW5NZ1ptOXlJR0Z1SUdWNFlXMXdiR1VwWEc1Y2RDQXFJRElwSUZSb1pYTmxJR0Z5WlNCallXeHNaV1E2WEc1Y2RDQXFJQ0FnSUMwZ1FrVkdUMUpGSUdGemEybHVaeUJtYjNJZ1lTQjBjbUZ1YzNCdmNuUmNibHgwSUNvZ0lDQWdMU0JCUmxSRlVpQndZWEpoYlNCelpYSnBZV3hwZW1GMGFXOXVJQ2h6TG1SaGRHRWdhWE1nWVNCemRISnBibWNnYVdZZ2N5NXdjbTlqWlhOelJHRjBZU0JwY3lCMGNuVmxLVnh1WEhRZ0tpQXpLU0JyWlhrZ2FYTWdkR2hsSUdSaGRHRlVlWEJsWEc1Y2RDQXFJRFFwSUhSb1pTQmpZWFJqYUdGc2JDQnplVzFpYjJ3Z1hDSXFYQ0lnWTJGdUlHSmxJSFZ6WldSY2JseDBJQ29nTlNrZ1pYaGxZM1YwYVc5dUlIZHBiR3dnYzNSaGNuUWdkMmwwYUNCMGNtRnVjM0J2Y25RZ1pHRjBZVlI1Y0dVZ1lXNWtJRlJJUlU0Z1kyOXVkR2x1ZFdVZ1pHOTNiaUIwYnlCY0lpcGNJaUJwWmlCdVpXVmtaV1JjYmx4MElDb3ZYRzVjZEhCeVpXWnBiSFJsY25NZ1BTQjdmU3hjYmx4dVhIUXZLaUJVY21GdWMzQnZjblJ6SUdKcGJtUnBibWR6WEc1Y2RDQXFJREVwSUd0bGVTQnBjeUIwYUdVZ1pHRjBZVlI1Y0dWY2JseDBJQ29nTWlrZ2RHaGxJR05oZEdOb1lXeHNJSE41YldKdmJDQmNJaXBjSWlCallXNGdZbVVnZFhObFpGeHVYSFFnS2lBektTQnpaV3hsWTNScGIyNGdkMmxzYkNCemRHRnlkQ0IzYVhSb0lIUnlZVzV6Y0c5eWRDQmtZWFJoVkhsd1pTQmhibVFnVkVoRlRpQm5ieUIwYnlCY0lpcGNJaUJwWmlCdVpXVmtaV1JjYmx4MElDb3ZYRzVjZEhSeVlXNXpjRzl5ZEhNZ1BTQjdmU3hjYmx4dVhIUXZMeUJCZG05cFpDQmpiMjF0Wlc1MExYQnliMnh2WnlCamFHRnlJSE5sY1hWbGJtTmxJQ2dqTVRBd09UZ3BPeUJ0ZFhOMElHRndjR1ZoYzJVZ2JHbHVkQ0JoYm1RZ1pYWmhaR1VnWTI5dGNISmxjM05wYjI1Y2JseDBZV3hzVkhsd1pYTWdQU0JjSWlvdlhDSXVZMjl1WTJGMEtDQmNJaXBjSWlBcExGeHVYRzVjZEM4dklFUnZZM1Z0Wlc1MElHeHZZMkYwYVc5dVhHNWNkR0ZxWVhoTWIyTmhkR2x2YmlBOUlIZHBibVJ2ZHk1c2IyTmhkR2x2Ymk1b2NtVm1MRnh1WEc1Y2RDOHZJRk5sWjIxbGJuUWdiRzlqWVhScGIyNGdhVzUwYnlCd1lYSjBjMXh1WEhSaGFtRjRURzlqVUdGeWRITWdQU0J5ZFhKc0xtVjRaV01vSUdGcVlYaE1iMk5oZEdsdmJpNTBiMHh2ZDJWeVEyRnpaU2dwSUNrZ2ZId2dXMTA3WEc1Y2JpOHZJRUpoYzJVZ1hDSmpiMjV6ZEhKMVkzUnZjbHdpSUdadmNpQnFVWFZsY25rdVlXcGhlRkJ5WldacGJIUmxjaUJoYm1RZ2FsRjFaWEo1TG1GcVlYaFVjbUZ1YzNCdmNuUmNibVoxYm1OMGFXOXVJR0ZrWkZSdlVISmxabWxzZEdWeWMwOXlWSEpoYm5Od2IzSjBjeWdnYzNSeWRXTjBkWEpsSUNrZ2UxeHVYRzVjZEM4dklHUmhkR0ZVZVhCbFJYaHdjbVZ6YzJsdmJpQnBjeUJ2Y0hScGIyNWhiQ0JoYm1RZ1pHVm1ZWFZzZEhNZ2RHOGdYQ0lxWENKY2JseDBjbVYwZFhKdUlHWjFibU4wYVc5dUtDQmtZWFJoVkhsd1pVVjRjSEpsYzNOcGIyNHNJR1oxYm1NZ0tTQjdYRzVjYmx4MFhIUnBaaUFvSUhSNWNHVnZaaUJrWVhSaFZIbHdaVVY0Y0hKbGMzTnBiMjRnSVQwOUlGd2ljM1J5YVc1blhDSWdLU0I3WEc1Y2RGeDBYSFJtZFc1aklEMGdaR0YwWVZSNWNHVkZlSEJ5WlhOemFXOXVPMXh1WEhSY2RGeDBaR0YwWVZSNWNHVkZlSEJ5WlhOemFXOXVJRDBnWENJcVhDSTdYRzVjZEZ4MGZWeHVYRzVjZEZ4MGRtRnlJR1JoZEdGVWVYQmxMRnh1WEhSY2RGeDBhU0E5SURBc1hHNWNkRngwWEhSa1lYUmhWSGx3WlhNZ1BTQmtZWFJoVkhsd1pVVjRjSEpsYzNOcGIyNHVkRzlNYjNkbGNrTmhjMlVvS1M1dFlYUmphQ2dnY201dmRIZG9hWFJsSUNrZ2ZId2dXMTA3WEc1Y2JseDBYSFJwWmlBb0lHcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQm1kVzVqSUNrZ0tTQjdYRzVjZEZ4MFhIUXZMeUJHYjNJZ1pXRmphQ0JrWVhSaFZIbHdaU0JwYmlCMGFHVWdaR0YwWVZSNWNHVkZlSEJ5WlhOemFXOXVYRzVjZEZ4MFhIUjNhR2xzWlNBb0lDaGtZWFJoVkhsd1pTQTlJR1JoZEdGVWVYQmxjMXRwS3l0ZEtTQXBJSHRjYmx4MFhIUmNkRngwTHk4Z1VISmxjR1Z1WkNCcFppQnlaWEYxWlhOMFpXUmNibHgwWEhSY2RGeDBhV1lnS0NCa1lYUmhWSGx3WlZzd1hTQTlQVDBnWENJclhDSWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFpHRjBZVlI1Y0dVZ1BTQmtZWFJoVkhsd1pTNXpiR2xqWlNnZ01TQXBJSHg4SUZ3aUtsd2lPMXh1WEhSY2RGeDBYSFJjZENoemRISjFZM1IxY21WYklHUmhkR0ZVZVhCbElGMGdQU0J6ZEhKMVkzUjFjbVZiSUdSaGRHRlVlWEJsSUYwZ2ZId2dXMTBwTG5WdWMyaHBablFvSUdaMWJtTWdLVHRjYmx4dVhIUmNkRngwWEhRdkx5QlBkR2hsY25kcGMyVWdZWEJ3Wlc1a1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBLSE4wY25WamRIVnlaVnNnWkdGMFlWUjVjR1VnWFNBOUlITjBjblZqZEhWeVpWc2daR0YwWVZSNWNHVWdYU0I4ZkNCYlhTa3VjSFZ6YUNnZ1puVnVZeUFwTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUjlPMXh1ZlZ4dVhHNHZMeUJDWVhObElHbHVjM0JsWTNScGIyNGdablZ1WTNScGIyNGdabTl5SUhCeVpXWnBiSFJsY25NZ1lXNWtJSFJ5WVc1emNHOXlkSE5jYm1aMWJtTjBhVzl1SUdsdWMzQmxZM1JRY21WbWFXeDBaWEp6VDNKVWNtRnVjM0J2Y25SektDQnpkSEoxWTNSMWNtVXNJRzl3ZEdsdmJuTXNJRzl5YVdkcGJtRnNUM0IwYVc5dWN5d2dhbkZZU0ZJZ0tTQjdYRzVjYmx4MGRtRnlJR2x1YzNCbFkzUmxaQ0E5SUh0OUxGeHVYSFJjZEhObFpXdHBibWRVY21GdWMzQnZjblFnUFNBb0lITjBjblZqZEhWeVpTQTlQVDBnZEhKaGJuTndiM0owY3lBcE8xeHVYRzVjZEdaMWJtTjBhVzl1SUdsdWMzQmxZM1FvSUdSaGRHRlVlWEJsSUNrZ2UxeHVYSFJjZEhaaGNpQnpaV3hsWTNSbFpEdGNibHgwWEhScGJuTndaV04wWldSYklHUmhkR0ZVZVhCbElGMGdQU0IwY25WbE8xeHVYSFJjZEdwUmRXVnllUzVsWVdOb0tDQnpkSEoxWTNSMWNtVmJJR1JoZEdGVWVYQmxJRjBnZkh3Z1cxMHNJR1oxYm1OMGFXOXVLQ0JmTENCd2NtVm1hV3gwWlhKUGNrWmhZM1J2Y25rZ0tTQjdYRzVjZEZ4MFhIUjJZWElnWkdGMFlWUjVjR1ZQY2xSeVlXNXpjRzl5ZENBOUlIQnlaV1pwYkhSbGNrOXlSbUZqZEc5eWVTZ2diM0IwYVc5dWN5d2diM0pwWjJsdVlXeFBjSFJwYjI1ekxDQnFjVmhJVWlBcE8xeHVYSFJjZEZ4MGFXWWdLQ0IwZVhCbGIyWWdaR0YwWVZSNWNHVlBjbFJ5WVc1emNHOXlkQ0E5UFQwZ1hDSnpkSEpwYm1kY0lpQW1KaUFoYzJWbGEybHVaMVJ5WVc1emNHOXlkQ0FtSmlBaGFXNXpjR1ZqZEdWa1d5QmtZWFJoVkhsd1pVOXlWSEpoYm5Od2IzSjBJRjBnS1NCN1hHNWNkRngwWEhSY2RHOXdkR2x2Ym5NdVpHRjBZVlI1Y0dWekxuVnVjMmhwWm5Rb0lHUmhkR0ZVZVhCbFQzSlVjbUZ1YzNCdmNuUWdLVHRjYmx4MFhIUmNkRngwYVc1emNHVmpkQ2dnWkdGMFlWUjVjR1ZQY2xSeVlXNXpjRzl5ZENBcE8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1ptRnNjMlU3WEc1Y2RGeDBYSFI5SUdWc2MyVWdhV1lnS0NCelpXVnJhVzVuVkhKaGJuTndiM0owSUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z0lTZ2djMlZzWldOMFpXUWdQU0JrWVhSaFZIbHdaVTl5VkhKaGJuTndiM0owSUNrN1hHNWNkRngwWEhSOVhHNWNkRngwZlNrN1hHNWNkRngwY21WMGRYSnVJSE5sYkdWamRHVmtPMXh1WEhSOVhHNWNibHgwY21WMGRYSnVJR2x1YzNCbFkzUW9JRzl3ZEdsdmJuTXVaR0YwWVZSNWNHVnpXeUF3SUYwZ0tTQjhmQ0FoYVc1emNHVmpkR1ZrV3lCY0lpcGNJaUJkSUNZbUlHbHVjM0JsWTNRb0lGd2lLbHdpSUNrN1hHNTlYRzVjYmk4dklFRWdjM0JsWTJsaGJDQmxlSFJsYm1RZ1ptOXlJR0ZxWVhnZ2IzQjBhVzl1YzF4dUx5OGdkR2hoZENCMFlXdGxjeUJjSW1ac1lYUmNJaUJ2Y0hScGIyNXpJQ2h1YjNRZ2RHOGdZbVVnWkdWbGNDQmxlSFJsYm1SbFpDbGNiaTh2SUVacGVHVnpJQ001T0RnM1hHNW1kVzVqZEdsdmJpQmhhbUY0UlhoMFpXNWtLQ0IwWVhKblpYUXNJSE55WXlBcElIdGNibHgwZG1GeUlHdGxlU3dnWkdWbGNDeGNibHgwWEhSbWJHRjBUM0IwYVc5dWN5QTlJR3BSZFdWeWVTNWhhbUY0VTJWMGRHbHVaM011Wm14aGRFOXdkR2x2Ym5NZ2ZId2dlMzA3WEc1Y2JseDBabTl5SUNnZ2EyVjVJR2x1SUhOeVl5QXBJSHRjYmx4MFhIUnBaaUFvSUhOeVkxc2dhMlY1SUYwZ0lUMDlJSFZ1WkdWbWFXNWxaQ0FwSUh0Y2JseDBYSFJjZENnZ1pteGhkRTl3ZEdsdmJuTmJJR3RsZVNCZElEOGdkR0Z5WjJWMElEb2dLQ0JrWldWd0lIeDhJQ2hrWldWd0lEMGdlMzBwSUNrZ0tWc2dhMlY1SUYwZ1BTQnpjbU5iSUd0bGVTQmRPMXh1WEhSY2RIMWNibHgwZlZ4dVhIUnBaaUFvSUdSbFpYQWdLU0I3WEc1Y2RGeDBhbEYxWlhKNUxtVjRkR1Z1WkNnZ2RISjFaU3dnZEdGeVoyVjBMQ0JrWldWd0lDazdYRzVjZEgxY2JseHVYSFJ5WlhSMWNtNGdkR0Z5WjJWME8xeHVmVnh1WEc0dktpQklZVzVrYkdWeklISmxjM0J2Ym5ObGN5QjBieUJoYmlCaGFtRjRJSEpsY1hWbGMzUTZYRzRnS2lBdElHWnBibVJ6SUhSb1pTQnlhV2RvZENCa1lYUmhWSGx3WlNBb2JXVmthV0YwWlhNZ1ltVjBkMlZsYmlCamIyNTBaVzUwTFhSNWNHVWdZVzVrSUdWNGNHVmpkR1ZrSUdSaGRHRlVlWEJsS1Z4dUlDb2dMU0J5WlhSMWNtNXpJSFJvWlNCamIzSnlaWE53YjI1a2FXNW5JSEpsYzNCdmJuTmxYRzRnS2k5Y2JtWjFibU4wYVc5dUlHRnFZWGhJWVc1a2JHVlNaWE53YjI1elpYTW9JSE1zSUdweFdFaFNMQ0J5WlhOd2IyNXpaWE1nS1NCN1hHNWNibHgwZG1GeUlHTjBMQ0IwZVhCbExDQm1hVzVoYkVSaGRHRlVlWEJsTENCbWFYSnpkRVJoZEdGVWVYQmxMRnh1WEhSY2RHTnZiblJsYm5SeklEMGdjeTVqYjI1MFpXNTBjeXhjYmx4MFhIUmtZWFJoVkhsd1pYTWdQU0J6TG1SaGRHRlVlWEJsY3p0Y2JseHVYSFF2THlCU1pXMXZkbVVnWVhWMGJ5QmtZWFJoVkhsd1pTQmhibVFnWjJWMElHTnZiblJsYm5RdGRIbHdaU0JwYmlCMGFHVWdjSEp2WTJWemMxeHVYSFIzYUdsc1pTQW9JR1JoZEdGVWVYQmxjMXNnTUNCZElEMDlQU0JjSWlwY0lpQXBJSHRjYmx4MFhIUmtZWFJoVkhsd1pYTXVjMmhwWm5Rb0tUdGNibHgwWEhScFppQW9JR04wSUQwOVBTQjFibVJsWm1sdVpXUWdLU0I3WEc1Y2RGeDBYSFJqZENBOUlITXViV2x0WlZSNWNHVWdmSHdnYW5GWVNGSXVaMlYwVW1WemNHOXVjMlZJWldGa1pYSW9YQ0pEYjI1MFpXNTBMVlI1Y0dWY0lpazdYRzVjZEZ4MGZWeHVYSFI5WEc1Y2JseDBMeThnUTJobFkyc2dhV1lnZDJVbmNtVWdaR1ZoYkdsdVp5QjNhWFJvSUdFZ2EyNXZkMjRnWTI5dWRHVnVkQzEwZVhCbFhHNWNkR2xtSUNnZ1kzUWdLU0I3WEc1Y2RGeDBabTl5SUNnZ2RIbHdaU0JwYmlCamIyNTBaVzUwY3lBcElIdGNibHgwWEhSY2RHbG1JQ2dnWTI5dWRHVnVkSE5iSUhSNWNHVWdYU0FtSmlCamIyNTBaVzUwYzFzZ2RIbHdaU0JkTG5SbGMzUW9JR04wSUNrZ0tTQjdYRzVjZEZ4MFhIUmNkR1JoZEdGVWVYQmxjeTUxYm5Ob2FXWjBLQ0IwZVhCbElDazdYRzVjZEZ4MFhIUmNkR0p5WldGck8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBmVnh1WEc1Y2RDOHZJRU5vWldOcklIUnZJSE5sWlNCcFppQjNaU0JvWVhabElHRWdjbVZ6Y0c5dWMyVWdabTl5SUhSb1pTQmxlSEJsWTNSbFpDQmtZWFJoVkhsd1pWeHVYSFJwWmlBb0lHUmhkR0ZVZVhCbGMxc2dNQ0JkSUdsdUlISmxjM0J2Ym5ObGN5QXBJSHRjYmx4MFhIUm1hVzVoYkVSaGRHRlVlWEJsSUQwZ1pHRjBZVlI1Y0dWeld5QXdJRjA3WEc1Y2RIMGdaV3h6WlNCN1hHNWNkRngwTHk4Z1ZISjVJR052Ym5abGNuUnBZbXhsSUdSaGRHRlVlWEJsYzF4dVhIUmNkR1p2Y2lBb0lIUjVjR1VnYVc0Z2NtVnpjRzl1YzJWeklDa2dlMXh1WEhSY2RGeDBhV1lnS0NBaFpHRjBZVlI1Y0dWeld5QXdJRjBnZkh3Z2N5NWpiMjUyWlhKMFpYSnpXeUIwZVhCbElDc2dYQ0lnWENJZ0t5QmtZWFJoVkhsd1pYTmJNRjBnWFNBcElIdGNibHgwWEhSY2RGeDBabWx1WVd4RVlYUmhWSGx3WlNBOUlIUjVjR1U3WEc1Y2RGeDBYSFJjZEdKeVpXRnJPMXh1WEhSY2RGeDBmVnh1WEhSY2RGeDBhV1lnS0NBaFptbHljM1JFWVhSaFZIbHdaU0FwSUh0Y2JseDBYSFJjZEZ4MFptbHljM1JFWVhSaFZIbHdaU0E5SUhSNWNHVTdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZWeHVYSFJjZEM4dklFOXlJR3AxYzNRZ2RYTmxJR1pwY25OMElHOXVaVnh1WEhSY2RHWnBibUZzUkdGMFlWUjVjR1VnUFNCbWFXNWhiRVJoZEdGVWVYQmxJSHg4SUdacGNuTjBSR0YwWVZSNWNHVTdYRzVjZEgxY2JseHVYSFF2THlCSlppQjNaU0JtYjNWdVpDQmhJR1JoZEdGVWVYQmxYRzVjZEM4dklGZGxJR0ZrWkNCMGFHVWdaR0YwWVZSNWNHVWdkRzhnZEdobElHeHBjM1FnYVdZZ2JtVmxaR1ZrWEc1Y2RDOHZJR0Z1WkNCeVpYUjFjbTRnZEdobElHTnZjbkpsYzNCdmJtUnBibWNnY21WemNHOXVjMlZjYmx4MGFXWWdLQ0JtYVc1aGJFUmhkR0ZVZVhCbElDa2dlMXh1WEhSY2RHbG1JQ2dnWm1sdVlXeEVZWFJoVkhsd1pTQWhQVDBnWkdGMFlWUjVjR1Z6V3lBd0lGMGdLU0I3WEc1Y2RGeDBYSFJrWVhSaFZIbHdaWE11ZFc1emFHbG1kQ2dnWm1sdVlXeEVZWFJoVkhsd1pTQXBPMXh1WEhSY2RIMWNibHgwWEhSeVpYUjFjbTRnY21WemNHOXVjMlZ6V3lCbWFXNWhiRVJoZEdGVWVYQmxJRjA3WEc1Y2RIMWNibjFjYmx4dUx5b2dRMmhoYVc0Z1kyOXVkbVZ5YzJsdmJuTWdaMmwyWlc0Z2RHaGxJSEpsY1hWbGMzUWdZVzVrSUhSb1pTQnZjbWxuYVc1aGJDQnlaWE53YjI1elpWeHVJQ29nUVd4emJ5QnpaWFJ6SUhSb1pTQnlaWE53YjI1elpWaFlXQ0JtYVdWc1pITWdiMjRnZEdobElHcHhXRWhTSUdsdWMzUmhibU5sWEc0Z0tpOWNibVoxYm1OMGFXOXVJR0ZxWVhoRGIyNTJaWEowS0NCekxDQnlaWE53YjI1elpTd2dhbkZZU0ZJc0lHbHpVM1ZqWTJWemN5QXBJSHRjYmx4MGRtRnlJR052Ym5ZeUxDQmpkWEp5Wlc1MExDQmpiMjUyTENCMGJYQXNJSEJ5WlhZc1hHNWNkRngwWTI5dWRtVnlkR1Z5Y3lBOUlIdDlMRnh1WEhSY2RDOHZJRmR2Y21zZ2QybDBhQ0JoSUdOdmNIa2diMllnWkdGMFlWUjVjR1Z6SUdsdUlHTmhjMlVnZDJVZ2JtVmxaQ0IwYnlCdGIyUnBabmtnYVhRZ1ptOXlJR052Ym5abGNuTnBiMjVjYmx4MFhIUmtZWFJoVkhsd1pYTWdQU0J6TG1SaGRHRlVlWEJsY3k1emJHbGpaU2dwTzF4dVhHNWNkQzh2SUVOeVpXRjBaU0JqYjI1MlpYSjBaWEp6SUcxaGNDQjNhWFJvSUd4dmQyVnlZMkZ6WldRZ2EyVjVjMXh1WEhScFppQW9JR1JoZEdGVWVYQmxjMXNnTVNCZElDa2dlMXh1WEhSY2RHWnZjaUFvSUdOdmJuWWdhVzRnY3k1amIyNTJaWEowWlhKeklDa2dlMXh1WEhSY2RGeDBZMjl1ZG1WeWRHVnljMXNnWTI5dWRpNTBiMHh2ZDJWeVEyRnpaU2dwSUYwZ1BTQnpMbU52Ym5abGNuUmxjbk5iSUdOdmJuWWdYVHRjYmx4MFhIUjlYRzVjZEgxY2JseHVYSFJqZFhKeVpXNTBJRDBnWkdGMFlWUjVjR1Z6TG5Ob2FXWjBLQ2s3WEc1Y2JseDBMeThnUTI5dWRtVnlkQ0IwYnlCbFlXTm9JSE5sY1hWbGJuUnBZV3dnWkdGMFlWUjVjR1ZjYmx4MGQyaHBiR1VnS0NCamRYSnlaVzUwSUNrZ2UxeHVYRzVjZEZ4MGFXWWdLQ0J6TG5KbGMzQnZibk5sUm1sbGJHUnpXeUJqZFhKeVpXNTBJRjBnS1NCN1hHNWNkRngwWEhScWNWaElVbHNnY3k1eVpYTndiMjV6WlVacFpXeGtjMXNnWTNWeWNtVnVkQ0JkSUYwZ1BTQnlaWE53YjI1elpUdGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QkJjSEJzZVNCMGFHVWdaR0YwWVVacGJIUmxjaUJwWmlCd2NtOTJhV1JsWkZ4dVhIUmNkR2xtSUNnZ0lYQnlaWFlnSmlZZ2FYTlRkV05qWlhOeklDWW1JSE11WkdGMFlVWnBiSFJsY2lBcElIdGNibHgwWEhSY2RISmxjM0J2Ym5ObElEMGdjeTVrWVhSaFJtbHNkR1Z5S0NCeVpYTndiMjV6WlN3Z2N5NWtZWFJoVkhsd1pTQXBPMXh1WEhSY2RIMWNibHh1WEhSY2RIQnlaWFlnUFNCamRYSnlaVzUwTzF4dVhIUmNkR04xY25KbGJuUWdQU0JrWVhSaFZIbHdaWE11YzJocFpuUW9LVHRjYmx4dVhIUmNkR2xtSUNnZ1kzVnljbVZ1ZENBcElIdGNibHh1WEhSY2RDOHZJRlJvWlhKbEozTWdiMjVzZVNCM2IzSnJJSFJ2SUdSdklHbG1JR04xY25KbGJuUWdaR0YwWVZSNWNHVWdhWE1nYm05dUxXRjFkRzljYmx4MFhIUmNkR2xtSUNnZ1kzVnljbVZ1ZENBOVBUMGdYQ0lxWENJZ0tTQjdYRzVjYmx4MFhIUmNkRngwWTNWeWNtVnVkQ0E5SUhCeVpYWTdYRzVjYmx4MFhIUmNkQzh2SUVOdmJuWmxjblFnY21WemNHOXVjMlVnYVdZZ2NISmxkaUJrWVhSaFZIbHdaU0JwY3lCdWIyNHRZWFYwYnlCaGJtUWdaR2xtWm1WeWN5Qm1jbTl0SUdOMWNuSmxiblJjYmx4MFhIUmNkSDBnWld4elpTQnBaaUFvSUhCeVpYWWdJVDA5SUZ3aUtsd2lJQ1ltSUhCeVpYWWdJVDA5SUdOMWNuSmxiblFnS1NCN1hHNWNibHgwWEhSY2RGeDBMeThnVTJWbGF5QmhJR1JwY21WamRDQmpiMjUyWlhKMFpYSmNibHgwWEhSY2RGeDBZMjl1ZGlBOUlHTnZiblpsY25SbGNuTmJJSEJ5WlhZZ0t5QmNJaUJjSWlBcklHTjFjbkpsYm5RZ1hTQjhmQ0JqYjI1MlpYSjBaWEp6V3lCY0lpb2dYQ0lnS3lCamRYSnlaVzUwSUYwN1hHNWNibHgwWEhSY2RGeDBMeThnU1dZZ2JtOXVaU0JtYjNWdVpDd2djMlZsYXlCaElIQmhhWEpjYmx4MFhIUmNkRngwYVdZZ0tDQWhZMjl1ZGlBcElIdGNibHgwWEhSY2RGeDBYSFJtYjNJZ0tDQmpiMjUyTWlCcGJpQmpiMjUyWlhKMFpYSnpJQ2tnZTF4dVhHNWNkRngwWEhSY2RGeDBYSFF2THlCSlppQmpiMjUyTWlCdmRYUndkWFJ6SUdOMWNuSmxiblJjYmx4MFhIUmNkRngwWEhSY2RIUnRjQ0E5SUdOdmJuWXlMbk53YkdsMEtDQmNJaUJjSWlBcE8xeHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDQjBiWEJiSURFZ1hTQTlQVDBnWTNWeWNtVnVkQ0FwSUh0Y2JseHVYSFJjZEZ4MFhIUmNkRngwWEhRdkx5QkpaaUJ3Y21WMklHTmhiaUJpWlNCamIyNTJaWEowWldRZ2RHOGdZV05qWlhCMFpXUWdhVzV3ZFhSY2JseDBYSFJjZEZ4MFhIUmNkRngwWTI5dWRpQTlJR052Ym5abGNuUmxjbk5iSUhCeVpYWWdLeUJjSWlCY0lpQXJJSFJ0Y0ZzZ01DQmRJRjBnZkh4Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSamIyNTJaWEowWlhKeld5QmNJaW9nWENJZ0t5QjBiWEJiSURBZ1hTQmRPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUnBaaUFvSUdOdmJuWWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwTHk4Z1EyOXVaR1Z1YzJVZ1pYRjFhWFpoYkdWdVkyVWdZMjl1ZG1WeWRHVnljMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkR2xtSUNnZ1kyOXVkaUE5UFQwZ2RISjFaU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RHTnZibllnUFNCamIyNTJaWEowWlhKeld5QmpiMjUyTWlCZE8xeHVYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBMeThnVDNSb1pYSjNhWE5sTENCcGJuTmxjblFnZEdobElHbHVkR1Z5YldWa2FXRjBaU0JrWVhSaFZIbHdaVnh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkSDBnWld4elpTQnBaaUFvSUdOdmJuWmxjblJsY25OYklHTnZibll5SUYwZ0lUMDlJSFJ5ZFdVZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJqZFhKeVpXNTBJRDBnZEcxd1d5QXdJRjA3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhSa1lYUmhWSGx3WlhNdWRXNXphR2xtZENnZ2RHMXdXeUF4SUYwZ0tUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBZbkpsWVdzN1hHNWNkRngwWEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFF2THlCQmNIQnNlU0JqYjI1MlpYSjBaWElnS0dsbUlHNXZkQ0JoYmlCbGNYVnBkbUZzWlc1alpTbGNibHgwWEhSY2RGeDBhV1lnS0NCamIyNTJJQ0U5UFNCMGNuVmxJQ2tnZTF4dVhHNWNkRngwWEhSY2RGeDBMeThnVlc1c1pYTnpJR1Z5Y205eWN5QmhjbVVnWVd4c2IzZGxaQ0IwYnlCaWRXSmliR1VzSUdOaGRHTm9JR0Z1WkNCeVpYUjFjbTRnZEdobGJWeHVYSFJjZEZ4MFhIUmNkR2xtSUNnZ1kyOXVkaUFtSmlCeld5QmNJblJvY205M2Mxd2lJRjBnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJ5WlhOd2IyNXpaU0E5SUdOdmJuWW9JSEpsYzNCdmJuTmxJQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSFJ5ZVNCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEhKbGMzQnZibk5sSUQwZ1kyOXVkaWdnY21WemNHOXVjMlVnS1R0Y2JseDBYSFJjZEZ4MFhIUmNkSDBnWTJGMFkyZ2dLQ0JsSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnZXlCemRHRjBaVG9nWENKd1lYSnpaWEpsY25KdmNsd2lMQ0JsY25KdmNqb2dZMjl1ZGlBL0lHVWdPaUJjSWs1dklHTnZiblpsY25OcGIyNGdabkp2YlNCY0lpQXJJSEJ5WlhZZ0t5QmNJaUIwYnlCY0lpQXJJR04xY25KbGJuUWdmVHRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMWNibHh1WEhSeVpYUjFjbTRnZXlCemRHRjBaVG9nWENKemRXTmpaWE56WENJc0lHUmhkR0U2SUhKbGMzQnZibk5sSUgwN1hHNTlYRzVjYm1wUmRXVnllUzVsZUhSbGJtUW9lMXh1WEc1Y2RDOHZJRU52ZFc1MFpYSWdabTl5SUdodmJHUnBibWNnZEdobElHNTFiV0psY2lCdlppQmhZM1JwZG1VZ2NYVmxjbWxsYzF4dVhIUmhZM1JwZG1VNklEQXNYRzVjYmx4MEx5OGdUR0Z6ZEMxTmIyUnBabWxsWkNCb1pXRmtaWElnWTJGamFHVWdabTl5SUc1bGVIUWdjbVZ4ZFdWemRGeHVYSFJzWVhOMFRXOWthV1pwWldRNklIdDlMRnh1WEhSbGRHRm5PaUI3ZlN4Y2JseHVYSFJoYW1GNFUyVjBkR2x1WjNNNklIdGNibHgwWEhSMWNtdzZJR0ZxWVhoTWIyTmhkR2x2Yml4Y2JseDBYSFIwZVhCbE9pQmNJa2RGVkZ3aUxGeHVYSFJjZEdselRHOWpZV3c2SUhKc2IyTmhiRkJ5YjNSdlkyOXNMblJsYzNRb0lHRnFZWGhNYjJOUVlYSjBjMXNnTVNCZElDa3NYRzVjZEZ4MFoyeHZZbUZzT2lCMGNuVmxMRnh1WEhSY2RIQnliMk5sYzNORVlYUmhPaUIwY25WbExGeHVYSFJjZEdGemVXNWpPaUIwY25WbExGeHVYSFJjZEdOdmJuUmxiblJVZVhCbE9pQmNJbUZ3Y0d4cFkyRjBhVzl1TDNndGQzZDNMV1p2Y20wdGRYSnNaVzVqYjJSbFpEc2dZMmhoY25ObGREMVZWRVl0T0Z3aUxGeHVYSFJjZEM4cVhHNWNkRngwZEdsdFpXOTFkRG9nTUN4Y2JseDBYSFJrWVhSaE9pQnVkV3hzTEZ4dVhIUmNkR1JoZEdGVWVYQmxPaUJ1ZFd4c0xGeHVYSFJjZEhWelpYSnVZVzFsT2lCdWRXeHNMRnh1WEhSY2RIQmhjM04zYjNKa09pQnVkV3hzTEZ4dVhIUmNkR05oWTJobE9pQnVkV3hzTEZ4dVhIUmNkSFJvY205M2N6b2dabUZzYzJVc1hHNWNkRngwZEhKaFpHbDBhVzl1WVd3NklHWmhiSE5sTEZ4dVhIUmNkR2hsWVdSbGNuTTZJSHQ5TEZ4dVhIUmNkQ292WEc1Y2JseDBYSFJoWTJObGNIUnpPaUI3WEc1Y2RGeDBYSFJjSWlwY0lqb2dZV3hzVkhsd1pYTXNYRzVjZEZ4MFhIUjBaWGgwT2lCY0luUmxlSFF2Y0d4aGFXNWNJaXhjYmx4MFhIUmNkR2gwYld3NklGd2lkR1Y0ZEM5b2RHMXNYQ0lzWEc1Y2RGeDBYSFI0Yld3NklGd2lZWEJ3YkdsallYUnBiMjR2ZUcxc0xDQjBaWGgwTDNodGJGd2lMRnh1WEhSY2RGeDBhbk52YmpvZ1hDSmhjSEJzYVdOaGRHbHZiaTlxYzI5dUxDQjBaWGgwTDJwaGRtRnpZM0pwY0hSY0lseHVYSFJjZEgwc1hHNWNibHgwWEhSamIyNTBaVzUwY3pvZ2UxeHVYSFJjZEZ4MGVHMXNPaUF2ZUcxc0x5eGNibHgwWEhSY2RHaDBiV3c2SUM5b2RHMXNMeXhjYmx4MFhIUmNkR3B6YjI0NklDOXFjMjl1TDF4dVhIUmNkSDBzWEc1Y2JseDBYSFJ5WlhOd2IyNXpaVVpwWld4a2N6b2dlMXh1WEhSY2RGeDBlRzFzT2lCY0luSmxjM0J2Ym5ObFdFMU1YQ0lzWEc1Y2RGeDBYSFIwWlhoME9pQmNJbkpsYzNCdmJuTmxWR1Y0ZEZ3aUxGeHVYSFJjZEZ4MGFuTnZiam9nWENKeVpYTndiMjV6WlVwVFQwNWNJbHh1WEhSY2RIMHNYRzVjYmx4MFhIUXZMeUJFWVhSaElHTnZiblpsY25SbGNuTmNibHgwWEhRdkx5QkxaWGx6SUhObGNHRnlZWFJsSUhOdmRYSmpaU0FvYjNJZ1kyRjBZMmhoYkd3Z1hDSXFYQ0lwSUdGdVpDQmtaWE4wYVc1aGRHbHZiaUIwZVhCbGN5QjNhWFJvSUdFZ2MybHVaMnhsSUhOd1lXTmxYRzVjZEZ4MFkyOXVkbVZ5ZEdWeWN6b2dlMXh1WEc1Y2RGeDBYSFF2THlCRGIyNTJaWEowSUdGdWVYUm9hVzVuSUhSdklIUmxlSFJjYmx4MFhIUmNkRndpS2lCMFpYaDBYQ0k2SUZOMGNtbHVaeXhjYmx4dVhIUmNkRngwTHk4Z1ZHVjRkQ0IwYnlCb2RHMXNJQ2gwY25WbElEMGdibThnZEhKaGJuTm1iM0p0WVhScGIyNHBYRzVjZEZ4MFhIUmNJblJsZUhRZ2FIUnRiRndpT2lCMGNuVmxMRnh1WEc1Y2RGeDBYSFF2THlCRmRtRnNkV0YwWlNCMFpYaDBJR0Z6SUdFZ2FuTnZiaUJsZUhCeVpYTnphVzl1WEc1Y2RGeDBYSFJjSW5SbGVIUWdhbk52Ymx3aU9pQnFVWFZsY25rdWNHRnljMlZLVTA5T0xGeHVYRzVjZEZ4MFhIUXZMeUJRWVhKelpTQjBaWGgwSUdGeklIaHRiRnh1WEhSY2RGeDBYQ0owWlhoMElIaHRiRndpT2lCcVVYVmxjbmt1Y0dGeWMyVllUVXhjYmx4MFhIUjlMRnh1WEc1Y2RGeDBMeThnUm05eUlHOXdkR2x2Ym5NZ2RHaGhkQ0J6YUc5MWJHUnVKM1FnWW1VZ1pHVmxjQ0JsZUhSbGJtUmxaRHBjYmx4MFhIUXZMeUI1YjNVZ1kyRnVJR0ZrWkNCNWIzVnlJRzkzYmlCamRYTjBiMjBnYjNCMGFXOXVjeUJvWlhKbElHbG1YRzVjZEZ4MEx5OGdZVzVrSUhkb1pXNGdlVzkxSUdOeVpXRjBaU0J2Ym1VZ2RHaGhkQ0J6YUc5MWJHUnVKM1FnWW1WY2JseDBYSFF2THlCa1pXVndJR1Y0ZEdWdVpHVmtJQ2h6WldVZ1lXcGhlRVY0ZEdWdVpDbGNibHgwWEhSbWJHRjBUM0IwYVc5dWN6b2dlMXh1WEhSY2RGeDBkWEpzT2lCMGNuVmxMRnh1WEhSY2RGeDBZMjl1ZEdWNGREb2dkSEoxWlZ4dVhIUmNkSDFjYmx4MGZTeGNibHh1WEhRdkx5QkRjbVZoZEdWeklHRWdablZzYkNCbWJHVmtaMlZrSUhObGRIUnBibWR6SUc5aWFtVmpkQ0JwYm5SdklIUmhjbWRsZEZ4dVhIUXZMeUIzYVhSb0lHSnZkR2dnWVdwaGVGTmxkSFJwYm1keklHRnVaQ0J6WlhSMGFXNW5jeUJtYVdWc1pITXVYRzVjZEM4dklFbG1JSFJoY21kbGRDQnBjeUJ2YldsMGRHVmtMQ0IzY21sMFpYTWdhVzUwYnlCaGFtRjRVMlYwZEdsdVozTXVYRzVjZEdGcVlYaFRaWFIxY0RvZ1puVnVZM1JwYjI0b0lIUmhjbWRsZEN3Z2MyVjBkR2x1WjNNZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUhObGRIUnBibWR6SUQ5Y2JseHVYSFJjZEZ4MEx5OGdRblZwYkdScGJtY2dZU0J6WlhSMGFXNW5jeUJ2WW1wbFkzUmNibHgwWEhSY2RHRnFZWGhGZUhSbGJtUW9JR0ZxWVhoRmVIUmxibVFvSUhSaGNtZGxkQ3dnYWxGMVpYSjVMbUZxWVhoVFpYUjBhVzVuY3lBcExDQnpaWFIwYVc1bmN5QXBJRHBjYmx4dVhIUmNkRngwTHk4Z1JYaDBaVzVrYVc1bklHRnFZWGhUWlhSMGFXNW5jMXh1WEhSY2RGeDBZV3BoZUVWNGRHVnVaQ2dnYWxGMVpYSjVMbUZxWVhoVFpYUjBhVzVuY3l3Z2RHRnlaMlYwSUNrN1hHNWNkSDBzWEc1Y2JseDBZV3BoZUZCeVpXWnBiSFJsY2pvZ1lXUmtWRzlRY21WbWFXeDBaWEp6VDNKVWNtRnVjM0J2Y25SektDQndjbVZtYVd4MFpYSnpJQ2tzWEc1Y2RHRnFZWGhVY21GdWMzQnZjblE2SUdGa1pGUnZVSEpsWm1sc2RHVnljMDl5VkhKaGJuTndiM0owY3lnZ2RISmhibk53YjNKMGN5QXBMRnh1WEc1Y2RDOHZJRTFoYVc0Z2JXVjBhRzlrWEc1Y2RHRnFZWGc2SUdaMWJtTjBhVzl1S0NCMWNtd3NJRzl3ZEdsdmJuTWdLU0I3WEc1Y2JseDBYSFF2THlCSlppQjFjbXdnYVhNZ1lXNGdiMkpxWldOMExDQnphVzExYkdGMFpTQndjbVV0TVM0MUlITnBaMjVoZEhWeVpWeHVYSFJjZEdsbUlDZ2dkSGx3Wlc5bUlIVnliQ0E5UFQwZ1hDSnZZbXBsWTNSY0lpQXBJSHRjYmx4MFhIUmNkRzl3ZEdsdmJuTWdQU0IxY213N1hHNWNkRngwWEhSMWNtd2dQU0IxYm1SbFptbHVaV1E3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeThnUm05eVkyVWdiM0IwYVc5dWN5QjBieUJpWlNCaGJpQnZZbXBsWTNSY2JseDBYSFJ2Y0hScGIyNXpJRDBnYjNCMGFXOXVjeUI4ZkNCN2ZUdGNibHh1WEhSY2RIWmhjaUIwY21GdWMzQnZjblFzWEc1Y2RGeDBYSFF2THlCVlVrd2dkMmwwYUc5MWRDQmhiblJwTFdOaFkyaGxJSEJoY21GdFhHNWNkRngwWEhSallXTm9aVlZTVEN4Y2JseDBYSFJjZEM4dklGSmxjM0J2Ym5ObElHaGxZV1JsY25OY2JseDBYSFJjZEhKbGMzQnZibk5sU0dWaFpHVnljMU4wY21sdVp5eGNibHgwWEhSY2RISmxjM0J2Ym5ObFNHVmhaR1Z5Y3l4Y2JseDBYSFJjZEM4dklIUnBiV1Z2ZFhRZ2FHRnVaR3hsWEc1Y2RGeDBYSFIwYVcxbGIzVjBWR2x0WlhJc1hHNWNkRngwWEhRdkx5QkRjbTl6Y3kxa2IyMWhhVzRnWkdWMFpXTjBhVzl1SUhaaGNuTmNibHgwWEhSY2RIQmhjblJ6TEZ4dVhIUmNkRngwTHk4Z1ZHOGdhMjV2ZHlCcFppQm5iRzlpWVd3Z1pYWmxiblJ6SUdGeVpTQjBieUJpWlNCa2FYTndZWFJqYUdWa1hHNWNkRngwWEhSbWFYSmxSMnh2WW1Gc2N5eGNibHgwWEhSY2RDOHZJRXh2YjNBZ2RtRnlhV0ZpYkdWY2JseDBYSFJjZEdrc1hHNWNkRngwWEhRdkx5QkRjbVZoZEdVZ2RHaGxJR1pwYm1Gc0lHOXdkR2x2Ym5NZ2IySnFaV04wWEc1Y2RGeDBYSFJ6SUQwZ2FsRjFaWEo1TG1GcVlYaFRaWFIxY0NnZ2UzMHNJRzl3ZEdsdmJuTWdLU3hjYmx4MFhIUmNkQzh2SUVOaGJHeGlZV05yY3lCamIyNTBaWGgwWEc1Y2RGeDBYSFJqWVd4c1ltRmphME52Ym5SbGVIUWdQU0J6TG1OdmJuUmxlSFFnZkh3Z2N5eGNibHgwWEhSY2RDOHZJRU52Ym5SbGVIUWdabTl5SUdkc2IySmhiQ0JsZG1WdWRITWdhWE1nWTJGc2JHSmhZMnREYjI1MFpYaDBJR2xtSUdsMElHbHpJR0VnUkU5TklHNXZaR1VnYjNJZ2FsRjFaWEo1SUdOdmJHeGxZM1JwYjI1Y2JseDBYSFJjZEdkc2IySmhiRVYyWlc1MFEyOXVkR1Y0ZENBOUlITXVZMjl1ZEdWNGRDQW1KaUFvSUdOaGJHeGlZV05yUTI5dWRHVjRkQzV1YjJSbFZIbHdaU0I4ZkNCallXeHNZbUZqYTBOdmJuUmxlSFF1YW5GMVpYSjVJQ2tnUDF4dVhIUmNkRngwWEhScVVYVmxjbmtvSUdOaGJHeGlZV05yUTI5dWRHVjRkQ0FwSURwY2JseDBYSFJjZEZ4MGFsRjFaWEo1TG1WMlpXNTBMRnh1WEhSY2RGeDBMeThnUkdWbVpYSnlaV1J6WEc1Y2RGeDBYSFJrWldabGNuSmxaQ0E5SUdwUmRXVnllUzVFWldabGNuSmxaQ2dwTEZ4dVhIUmNkRngwWTI5dGNHeGxkR1ZFWldabGNuSmxaQ0E5SUdwUmRXVnllUzVEWVd4c1ltRmphM01vWENKdmJtTmxJRzFsYlc5eWVWd2lLU3hjYmx4MFhIUmNkQzh2SUZOMFlYUjFjeTFrWlhCbGJtUmxiblFnWTJGc2JHSmhZMnR6WEc1Y2RGeDBYSFJ6ZEdGMGRYTkRiMlJsSUQwZ2N5NXpkR0YwZFhORGIyUmxJSHg4SUh0OUxGeHVYSFJjZEZ4MEx5OGdTR1ZoWkdWeWN5QW9kR2hsZVNCaGNtVWdjMlZ1ZENCaGJHd2dZWFFnYjI1alpTbGNibHgwWEhSY2RISmxjWFZsYzNSSVpXRmtaWEp6SUQwZ2UzMHNYRzVjZEZ4MFhIUnlaWEYxWlhOMFNHVmhaR1Z5YzA1aGJXVnpJRDBnZTMwc1hHNWNkRngwWEhRdkx5QlVhR1VnYW5GWVNGSWdjM1JoZEdWY2JseDBYSFJjZEhOMFlYUmxJRDBnTUN4Y2JseDBYSFJjZEM4dklFUmxabUYxYkhRZ1lXSnZjblFnYldWemMyRm5aVnh1WEhSY2RGeDBjM1J5UVdKdmNuUWdQU0JjSW1OaGJtTmxiR1ZrWENJc1hHNWNkRngwWEhRdkx5QkdZV3RsSUhob2NseHVYSFJjZEZ4MGFuRllTRklnUFNCN1hHNWNkRngwWEhSY2RISmxZV1I1VTNSaGRHVTZJREFzWEc1Y2JseDBYSFJjZEZ4MEx5OGdRblZwYkdSeklHaGxZV1JsY25NZ2FHRnphSFJoWW14bElHbG1JRzVsWldSbFpGeHVYSFJjZEZ4MFhIUm5aWFJTWlhOd2IyNXpaVWhsWVdSbGNqb2dablZ1WTNScGIyNG9JR3RsZVNBcElIdGNibHgwWEhSY2RGeDBYSFIyWVhJZ2JXRjBZMmc3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0J6ZEdGMFpTQTlQVDBnTWlBcElIdGNibHgwWEhSY2RGeDBYSFJjZEdsbUlDZ2dJWEpsYzNCdmJuTmxTR1ZoWkdWeWN5QXBJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBjbVZ6Y0c5dWMyVklaV0ZrWlhKeklEMGdlMzA3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSGRvYVd4bElDZ2dLRzFoZEdOb0lEMGdjbWhsWVdSbGNuTXVaWGhsWXlnZ2NtVnpjRzl1YzJWSVpXRmtaWEp6VTNSeWFXNW5JQ2twSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RISmxjM0J2Ym5ObFNHVmhaR1Z5YzFzZ2JXRjBZMmhiTVYwdWRHOU1iM2RsY2tOaGMyVW9LU0JkSUQwZ2JXRjBZMmhiSURJZ1hUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RGeDBiV0YwWTJnZ1BTQnlaWE53YjI1elpVaGxZV1JsY25OYklHdGxlUzUwYjB4dmQyVnlRMkZ6WlNncElGMDdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCdFlYUmphQ0E5UFNCdWRXeHNJRDhnYm5Wc2JDQTZJRzFoZEdOb08xeHVYSFJjZEZ4MFhIUjlMRnh1WEc1Y2RGeDBYSFJjZEM4dklGSmhkeUJ6ZEhKcGJtZGNibHgwWEhSY2RGeDBaMlYwUVd4c1VtVnpjRzl1YzJWSVpXRmtaWEp6T2lCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdjM1JoZEdVZ1BUMDlJRElnUHlCeVpYTndiMjV6WlVobFlXUmxjbk5UZEhKcGJtY2dPaUJ1ZFd4c08xeHVYSFJjZEZ4MFhIUjlMRnh1WEc1Y2RGeDBYSFJjZEM4dklFTmhZMmhsY3lCMGFHVWdhR1ZoWkdWeVhHNWNkRngwWEhSY2RITmxkRkpsY1hWbGMzUklaV0ZrWlhJNklHWjFibU4wYVc5dUtDQnVZVzFsTENCMllXeDFaU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnYkc1aGJXVWdQU0J1WVcxbExuUnZURzkzWlhKRFlYTmxLQ2s3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0FoYzNSaGRHVWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnVZVzFsSUQwZ2NtVnhkV1Z6ZEVobFlXUmxjbk5PWVcxbGMxc2diRzVoYldVZ1hTQTlJSEpsY1hWbGMzUklaV0ZrWlhKelRtRnRaWE5iSUd4dVlXMWxJRjBnZkh3Z2JtRnRaVHRjYmx4MFhIUmNkRngwWEhSY2RISmxjWFZsYzNSSVpXRmtaWEp6V3lCdVlXMWxJRjBnUFNCMllXeDFaVHRjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIUm9hWE03WEc1Y2RGeDBYSFJjZEgwc1hHNWNibHgwWEhSY2RGeDBMeThnVDNabGNuSnBaR1Z6SUhKbGMzQnZibk5sSUdOdmJuUmxiblF0ZEhsd1pTQm9aV0ZrWlhKY2JseDBYSFJjZEZ4MGIzWmxjbkpwWkdWTmFXMWxWSGx3WlRvZ1puVnVZM1JwYjI0b0lIUjVjR1VnS1NCN1hHNWNkRngwWEhSY2RGeDBhV1lnS0NBaGMzUmhkR1VnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJ6TG0xcGJXVlVlWEJsSUQwZ2RIbHdaVHRjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIUm9hWE03WEc1Y2RGeDBYSFJjZEgwc1hHNWNibHgwWEhSY2RGeDBMeThnVTNSaGRIVnpMV1JsY0dWdVpHVnVkQ0JqWVd4c1ltRmphM05jYmx4MFhIUmNkRngwYzNSaGRIVnpRMjlrWlRvZ1puVnVZM1JwYjI0b0lHMWhjQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnWTI5a1pUdGNibHgwWEhSY2RGeDBYSFJwWmlBb0lHMWhjQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNnZ2MzUmhkR1VnUENBeUlDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUm1iM0lnS0NCamIyUmxJR2x1SUcxaGNDQXBJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFF2THlCTVlYcDVMV0ZrWkNCMGFHVWdibVYzSUdOaGJHeGlZV05ySUdsdUlHRWdkMkY1SUhSb1lYUWdjSEpsYzJWeWRtVnpJRzlzWkNCdmJtVnpYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBjM1JoZEhWelEyOWtaVnNnWTI5a1pTQmRJRDBnV3lCemRHRjBkWE5EYjJSbFd5QmpiMlJsSUYwc0lHMWhjRnNnWTI5a1pTQmRJRjA3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEM4dklFVjRaV04xZEdVZ2RHaGxJR0Z3Y0hKdmNISnBZWFJsSUdOaGJHeGlZV05yYzF4dVhIUmNkRngwWEhSY2RGeDBYSFJxY1ZoSVVpNWhiSGRoZVhNb0lHMWhjRnNnYW5GWVNGSXVjM1JoZEhWeklGMGdLVHRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUhSb2FYTTdYRzVjZEZ4MFhIUmNkSDBzWEc1Y2JseDBYSFJjZEZ4MEx5OGdRMkZ1WTJWc0lIUm9aU0J5WlhGMVpYTjBYRzVjZEZ4MFhIUmNkR0ZpYjNKME9pQm1kVzVqZEdsdmJpZ2djM1JoZEhWelZHVjRkQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnWm1sdVlXeFVaWGgwSUQwZ2MzUmhkSFZ6VkdWNGRDQjhmQ0J6ZEhKQlltOXlkRHRjYmx4MFhIUmNkRngwWEhScFppQW9JSFJ5WVc1emNHOXlkQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSFJ5WVc1emNHOXlkQzVoWW05eWRDZ2dabWx1WVd4VVpYaDBJQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkR1J2Ym1Vb0lEQXNJR1pwYm1Gc1ZHVjRkQ0FwTzF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCMGFHbHpPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwTHk4Z1FYUjBZV05vSUdSbFptVnljbVZrYzF4dVhIUmNkR1JsWm1WeWNtVmtMbkJ5YjIxcGMyVW9JR3B4V0VoU0lDa3VZMjl0Y0d4bGRHVWdQU0JqYjIxd2JHVjBaVVJsWm1WeWNtVmtMbUZrWkR0Y2JseDBYSFJxY1ZoSVVpNXpkV05qWlhOeklEMGdhbkZZU0ZJdVpHOXVaVHRjYmx4MFhIUnFjVmhJVWk1bGNuSnZjaUE5SUdweFdFaFNMbVpoYVd3N1hHNWNibHgwWEhRdkx5QlNaVzF2ZG1VZ2FHRnphQ0JqYUdGeVlXTjBaWElnS0NNM05UTXhPaUJoYm1RZ2MzUnlhVzVuSUhCeWIyMXZkR2x2YmlsY2JseDBYSFF2THlCQlpHUWdjSEp2ZEc5amIyd2dhV1lnYm05MElIQnliM1pwWkdWa0lDaHdjbVZtYVd4MFpYSnpJRzFwWjJoMElHVjRjR1ZqZENCcGRDbGNibHgwWEhRdkx5QklZVzVrYkdVZ1ptRnNjM2tnZFhKc0lHbHVJSFJvWlNCelpYUjBhVzVuY3lCdlltcGxZM1FnS0NNeE1EQTVNem9nWTI5dWMybHpkR1Z1WTNrZ2QybDBhQ0J2YkdRZ2MybG5ibUYwZFhKbEtWeHVYSFJjZEM4dklGZGxJR0ZzYzI4Z2RYTmxJSFJvWlNCMWNtd2djR0Z5WVcxbGRHVnlJR2xtSUdGMllXbHNZV0pzWlZ4dVhIUmNkSE11ZFhKc0lEMGdLQ0FvSUhWeWJDQjhmQ0J6TG5WeWJDQjhmQ0JoYW1GNFRHOWpZWFJwYjI0Z0tTQXJJRndpWENJZ0tTNXlaWEJzWVdObEtDQnlhR0Z6YUN3Z1hDSmNJaUFwWEc1Y2RGeDBYSFF1Y21Wd2JHRmpaU2dnY25CeWIzUnZZMjlzTENCaGFtRjRURzlqVUdGeWRITmJJREVnWFNBcklGd2lMeTljSWlBcE8xeHVYRzVjZEZ4MEx5OGdRV3hwWVhNZ2JXVjBhRzlrSUc5d2RHbHZiaUIwYnlCMGVYQmxJR0Z6SUhCbGNpQjBhV05yWlhRZ0l6RXlNREEwWEc1Y2RGeDBjeTUwZVhCbElEMGdiM0IwYVc5dWN5NXRaWFJvYjJRZ2ZId2diM0IwYVc5dWN5NTBlWEJsSUh4OElITXViV1YwYUc5a0lIeDhJSE11ZEhsd1pUdGNibHh1WEhSY2RDOHZJRVY0ZEhKaFkzUWdaR0YwWVZSNWNHVnpJR3hwYzNSY2JseDBYSFJ6TG1SaGRHRlVlWEJsY3lBOUlHcFJkV1Z5ZVM1MGNtbHRLQ0J6TG1SaGRHRlVlWEJsSUh4OElGd2lLbHdpSUNrdWRHOU1iM2RsY2tOaGMyVW9LUzV0WVhSamFDZ2djbTV2ZEhkb2FYUmxJQ2tnZkh3Z1d5QmNJbHdpSUYwN1hHNWNibHgwWEhRdkx5QkJJR055YjNOekxXUnZiV0ZwYmlCeVpYRjFaWE4wSUdseklHbHVJRzl5WkdWeUlIZG9aVzRnZDJVZ2FHRjJaU0JoSUhCeWIzUnZZMjlzT21odmMzUTZjRzl5ZENCdGFYTnRZWFJqYUZ4dVhIUmNkR2xtSUNnZ2N5NWpjbTl6YzBSdmJXRnBiaUE5UFNCdWRXeHNJQ2tnZTF4dVhIUmNkRngwY0dGeWRITWdQU0J5ZFhKc0xtVjRaV01vSUhNdWRYSnNMblJ2VEc5M1pYSkRZWE5sS0NrZ0tUdGNibHgwWEhSY2RITXVZM0p2YzNORWIyMWhhVzRnUFNBaElTZ2djR0Z5ZEhNZ0ppWmNibHgwWEhSY2RGeDBLQ0J3WVhKMGMxc2dNU0JkSUNFOVBTQmhhbUY0VEc5alVHRnlkSE5iSURFZ1hTQjhmQ0J3WVhKMGMxc2dNaUJkSUNFOVBTQmhhbUY0VEc5alVHRnlkSE5iSURJZ1hTQjhmRnh1WEhSY2RGeDBYSFJjZENnZ2NHRnlkSE5iSURNZ1hTQjhmQ0FvSUhCaGNuUnpXeUF4SUYwZ1BUMDlJRndpYUhSMGNEcGNJaUEvSUZ3aU9EQmNJaUE2SUZ3aU5EUXpYQ0lnS1NBcElDRTlQVnh1WEhSY2RGeDBYSFJjZEZ4MEtDQmhhbUY0VEc5alVHRnlkSE5iSURNZ1hTQjhmQ0FvSUdGcVlYaE1iMk5RWVhKMGMxc2dNU0JkSUQwOVBTQmNJbWgwZEhBNlhDSWdQeUJjSWpnd1hDSWdPaUJjSWpRME0xd2lJQ2tnS1NBcFhHNWNkRngwWEhRcE8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklFTnZiblpsY25RZ1pHRjBZU0JwWmlCdWIzUWdZV3h5WldGa2VTQmhJSE4wY21sdVoxeHVYSFJjZEdsbUlDZ2djeTVrWVhSaElDWW1JSE11Y0hKdlkyVnpjMFJoZEdFZ0ppWWdkSGx3Wlc5bUlITXVaR0YwWVNBaFBUMGdYQ0p6ZEhKcGJtZGNJaUFwSUh0Y2JseDBYSFJjZEhNdVpHRjBZU0E5SUdwUmRXVnllUzV3WVhKaGJTZ2djeTVrWVhSaExDQnpMblJ5WVdScGRHbHZibUZzSUNrN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1FYQndiSGtnY0hKbFptbHNkR1Z5YzF4dVhIUmNkR2x1YzNCbFkzUlFjbVZtYVd4MFpYSnpUM0pVY21GdWMzQnZjblJ6S0NCd2NtVm1hV3gwWlhKekxDQnpMQ0J2Y0hScGIyNXpMQ0JxY1ZoSVVpQXBPMXh1WEc1Y2RGeDBMeThnU1dZZ2NtVnhkV1Z6ZENCM1lYTWdZV0p2Y25SbFpDQnBibk5wWkdVZ1lTQndjbVZtYVd4MFpYSXNJSE4wYjNBZ2RHaGxjbVZjYmx4MFhIUnBaaUFvSUhOMFlYUmxJRDA5UFNBeUlDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHcHhXRWhTTzF4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUZkbElHTmhiaUJtYVhKbElHZHNiMkpoYkNCbGRtVnVkSE1nWVhNZ2IyWWdibTkzSUdsbUlHRnphMlZrSUhSdlhHNWNkRngwTHk4Z1JHOXVKM1FnWm1seVpTQmxkbVZ1ZEhNZ2FXWWdhbEYxWlhKNUxtVjJaVzUwSUdseklIVnVaR1ZtYVc1bFpDQnBiaUJoYmlCQlRVUXRkWE5oWjJVZ2MyTmxibUZ5YVc4Z0tDTXhOVEV4T0NsY2JseDBYSFJtYVhKbFIyeHZZbUZzY3lBOUlHcFJkV1Z5ZVM1bGRtVnVkQ0FtSmlCekxtZHNiMkpoYkR0Y2JseHVYSFJjZEM4dklGZGhkR05vSUdadmNpQmhJRzVsZHlCelpYUWdiMllnY21WeGRXVnpkSE5jYmx4MFhIUnBaaUFvSUdacGNtVkhiRzlpWVd4eklDWW1JR3BSZFdWeWVTNWhZM1JwZG1Vckt5QTlQVDBnTUNBcElIdGNibHgwWEhSY2RHcFJkV1Z5ZVM1bGRtVnVkQzUwY21sbloyVnlLRndpWVdwaGVGTjBZWEowWENJcE8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklGVndjR1Z5WTJGelpTQjBhR1VnZEhsd1pWeHVYSFJjZEhNdWRIbHdaU0E5SUhNdWRIbHdaUzUwYjFWd2NHVnlRMkZ6WlNncE8xeHVYRzVjZEZ4MEx5OGdSR1YwWlhKdGFXNWxJR2xtSUhKbGNYVmxjM1FnYUdGeklHTnZiblJsYm5SY2JseDBYSFJ6TG1oaGMwTnZiblJsYm5RZ1BTQWhjbTV2UTI5dWRHVnVkQzUwWlhOMEtDQnpMblI1Y0dVZ0tUdGNibHh1WEhSY2RDOHZJRk5oZG1VZ2RHaGxJRlZTVENCcGJpQmpZWE5sSUhkbEozSmxJSFJ2ZVdsdVp5QjNhWFJvSUhSb1pTQkpaaTFOYjJScFptbGxaQzFUYVc1alpWeHVYSFJjZEM4dklHRnVaQzl2Y2lCSlppMU9iMjVsTFUxaGRHTm9JR2hsWVdSbGNpQnNZWFJsY2lCdmJseHVYSFJjZEdOaFkyaGxWVkpNSUQwZ2N5NTFjbXc3WEc1Y2JseDBYSFF2THlCTmIzSmxJRzl3ZEdsdmJuTWdhR0Z1Wkd4cGJtY2dabTl5SUhKbGNYVmxjM1J6SUhkcGRHZ2dibThnWTI5dWRHVnVkRnh1WEhSY2RHbG1JQ2dnSVhNdWFHRnpRMjl1ZEdWdWRDQXBJSHRjYmx4dVhIUmNkRngwTHk4Z1NXWWdaR0YwWVNCcGN5QmhkbUZwYkdGaWJHVXNJR0Z3Y0dWdVpDQmtZWFJoSUhSdklIVnliRnh1WEhSY2RGeDBhV1lnS0NCekxtUmhkR0VnS1NCN1hHNWNkRngwWEhSY2RHTmhZMmhsVlZKTUlEMGdLQ0J6TG5WeWJDQXJQU0FvSUhKeGRXVnllUzUwWlhOMEtDQmpZV05vWlZWU1RDQXBJRDhnWENJbVhDSWdPaUJjSWo5Y0lpQXBJQ3NnY3k1a1lYUmhJQ2s3WEc1Y2RGeDBYSFJjZEM4dklDTTVOamd5T2lCeVpXMXZkbVVnWkdGMFlTQnpieUIwYUdGMElHbDBKM01nYm05MElIVnpaV1FnYVc0Z1lXNGdaWFpsYm5SMVlXd2djbVYwY25sY2JseDBYSFJjZEZ4MFpHVnNaWFJsSUhNdVpHRjBZVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwTHk4Z1FXUmtJR0Z1ZEdrdFkyRmphR1VnYVc0Z2RYSnNJR2xtSUc1bFpXUmxaRnh1WEhSY2RGeDBhV1lnS0NCekxtTmhZMmhsSUQwOVBTQm1ZV3h6WlNBcElIdGNibHgwWEhSY2RGeDBjeTUxY213Z1BTQnlkSE11ZEdWemRDZ2dZMkZqYUdWVlVrd2dLU0EvWEc1Y2JseDBYSFJjZEZ4MFhIUXZMeUJKWmlCMGFHVnlaU0JwY3lCaGJISmxZV1I1SUdFZ0oxOG5JSEJoY21GdFpYUmxjaXdnYzJWMElHbDBjeUIyWVd4MVpWeHVYSFJjZEZ4MFhIUmNkR05oWTJobFZWSk1MbkpsY0d4aFkyVW9JSEowY3l3Z1hDSWtNVjg5WENJZ0t5QnViMjVqWlNzcklDa2dPbHh1WEc1Y2RGeDBYSFJjZEZ4MEx5OGdUM1JvWlhKM2FYTmxJR0ZrWkNCdmJtVWdkRzhnZEdobElHVnVaRnh1WEhSY2RGeDBYSFJjZEdOaFkyaGxWVkpNSUNzZ0tDQnljWFZsY25rdWRHVnpkQ2dnWTJGamFHVlZVa3dnS1NBL0lGd2lKbHdpSURvZ1hDSS9YQ0lnS1NBcklGd2lYejFjSWlBcklHNXZibU5sS3lzN1hHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1UyVjBJSFJvWlNCSlppMU5iMlJwWm1sbFpDMVRhVzVqWlNCaGJtUXZiM0lnU1dZdFRtOXVaUzFOWVhSamFDQm9aV0ZrWlhJc0lHbG1JR2x1SUdsbVRXOWthV1pwWldRZ2JXOWtaUzVjYmx4MFhIUnBaaUFvSUhNdWFXWk5iMlJwWm1sbFpDQXBJSHRjYmx4MFhIUmNkR2xtSUNnZ2FsRjFaWEo1TG14aGMzUk5iMlJwWm1sbFpGc2dZMkZqYUdWVlVrd2dYU0FwSUh0Y2JseDBYSFJjZEZ4MGFuRllTRkl1YzJWMFVtVnhkV1Z6ZEVobFlXUmxjaWdnWENKSlppMU5iMlJwWm1sbFpDMVRhVzVqWlZ3aUxDQnFVWFZsY25rdWJHRnpkRTF2WkdsbWFXVmtXeUJqWVdOb1pWVlNUQ0JkSUNrN1hHNWNkRngwWEhSOVhHNWNkRngwWEhScFppQW9JR3BSZFdWeWVTNWxkR0ZuV3lCallXTm9aVlZTVENCZElDa2dlMXh1WEhSY2RGeDBYSFJxY1ZoSVVpNXpaWFJTWlhGMVpYTjBTR1ZoWkdWeUtDQmNJa2xtTFU1dmJtVXRUV0YwWTJoY0lpd2dhbEYxWlhKNUxtVjBZV2RiSUdOaFkyaGxWVkpNSUYwZ0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNibHgwWEhRdkx5QlRaWFFnZEdobElHTnZjbkpsWTNRZ2FHVmhaR1Z5TENCcFppQmtZWFJoSUdseklHSmxhVzVuSUhObGJuUmNibHgwWEhScFppQW9JSE11WkdGMFlTQW1KaUJ6TG1oaGMwTnZiblJsYm5RZ0ppWWdjeTVqYjI1MFpXNTBWSGx3WlNBaFBUMGdabUZzYzJVZ2ZId2diM0IwYVc5dWN5NWpiMjUwWlc1MFZIbHdaU0FwSUh0Y2JseDBYSFJjZEdweFdFaFNMbk5sZEZKbGNYVmxjM1JJWldGa1pYSW9JRndpUTI5dWRHVnVkQzFVZVhCbFhDSXNJSE11WTI5dWRHVnVkRlI1Y0dVZ0tUdGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QlRaWFFnZEdobElFRmpZMlZ3ZEhNZ2FHVmhaR1Z5SUdadmNpQjBhR1VnYzJWeWRtVnlMQ0JrWlhCbGJtUnBibWNnYjI0Z2RHaGxJR1JoZEdGVWVYQmxYRzVjZEZ4MGFuRllTRkl1YzJWMFVtVnhkV1Z6ZEVobFlXUmxjaWhjYmx4MFhIUmNkRndpUVdOalpYQjBYQ0lzWEc1Y2RGeDBYSFJ6TG1SaGRHRlVlWEJsYzFzZ01DQmRJQ1ltSUhNdVlXTmpaWEIwYzFzZ2N5NWtZWFJoVkhsd1pYTmJNRjBnWFNBL1hHNWNkRngwWEhSY2RITXVZV05qWlhCMGMxc2djeTVrWVhSaFZIbHdaWE5iTUYwZ1hTQXJJQ2dnY3k1a1lYUmhWSGx3WlhOYklEQWdYU0FoUFQwZ1hDSXFYQ0lnUHlCY0lpd2dYQ0lnS3lCaGJHeFVlWEJsY3lBcklGd2lPeUJ4UFRBdU1ERmNJaUE2SUZ3aVhDSWdLU0E2WEc1Y2RGeDBYSFJjZEhNdVlXTmpaWEIwYzFzZ1hDSXFYQ0lnWFZ4dVhIUmNkQ2s3WEc1Y2JseDBYSFF2THlCRGFHVmpheUJtYjNJZ2FHVmhaR1Z5Y3lCdmNIUnBiMjVjYmx4MFhIUm1iM0lnS0NCcElHbHVJSE11YUdWaFpHVnljeUFwSUh0Y2JseDBYSFJjZEdweFdFaFNMbk5sZEZKbGNYVmxjM1JJWldGa1pYSW9JR2tzSUhNdWFHVmhaR1Z5YzFzZ2FTQmRJQ2s3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeThnUVd4c2IzY2dZM1Z6ZEc5dElHaGxZV1JsY25NdmJXbHRaWFI1Y0dWeklHRnVaQ0JsWVhKc2VTQmhZbTl5ZEZ4dVhIUmNkR2xtSUNnZ2N5NWlaV1p2Y21WVFpXNWtJQ1ltSUNnZ2N5NWlaV1p2Y21WVFpXNWtMbU5oYkd3b0lHTmhiR3hpWVdOclEyOXVkR1Y0ZEN3Z2FuRllTRklzSUhNZ0tTQTlQVDBnWm1Gc2MyVWdmSHdnYzNSaGRHVWdQVDA5SURJZ0tTQXBJSHRjYmx4MFhIUmNkQzh2SUVGaWIzSjBJR2xtSUc1dmRDQmtiMjVsSUdGc2NtVmhaSGtnWVc1a0lISmxkSFZ5Ymx4dVhIUmNkRngwY21WMGRYSnVJR3B4V0VoU0xtRmliM0owS0NrN1hHNWNkRngwZlZ4dVhHNWNkRngwTHk4Z1FXSnZjblJwYm1jZ2FYTWdibThnYkc5dVoyVnlJR0VnWTJGdVkyVnNiR0YwYVc5dVhHNWNkRngwYzNSeVFXSnZjblFnUFNCY0ltRmliM0owWENJN1hHNWNibHgwWEhRdkx5Qkpibk4wWVd4c0lHTmhiR3hpWVdOcmN5QnZiaUJrWldabGNuSmxaSE5jYmx4MFhIUm1iM0lnS0NCcElHbHVJSHNnYzNWalkyVnpjem9nTVN3Z1pYSnliM0k2SURFc0lHTnZiWEJzWlhSbE9pQXhJSDBnS1NCN1hHNWNkRngwWEhScWNWaElVbHNnYVNCZEtDQnpXeUJwSUYwZ0tUdGNibHgwWEhSOVhHNWNibHgwWEhRdkx5QkhaWFFnZEhKaGJuTndiM0owWEc1Y2RGeDBkSEpoYm5Od2IzSjBJRDBnYVc1emNHVmpkRkJ5WldacGJIUmxjbk5QY2xSeVlXNXpjRzl5ZEhNb0lIUnlZVzV6Y0c5eWRITXNJSE1zSUc5d2RHbHZibk1zSUdweFdFaFNJQ2s3WEc1Y2JseDBYSFF2THlCSlppQnVieUIwY21GdWMzQnZjblFzSUhkbElHRjFkRzh0WVdKdmNuUmNibHgwWEhScFppQW9JQ0YwY21GdWMzQnZjblFnS1NCN1hHNWNkRngwWEhSa2IyNWxLQ0F0TVN3Z1hDSk9ieUJVY21GdWMzQnZjblJjSWlBcE8xeHVYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJxY1ZoSVVpNXlaV0ZrZVZOMFlYUmxJRDBnTVR0Y2JseHVYSFJjZEZ4MEx5OGdVMlZ1WkNCbmJHOWlZV3dnWlhabGJuUmNibHgwWEhSY2RHbG1JQ2dnWm1seVpVZHNiMkpoYkhNZ0tTQjdYRzVjZEZ4MFhIUmNkR2RzYjJKaGJFVjJaVzUwUTI5dWRHVjRkQzUwY21sbloyVnlLQ0JjSW1GcVlYaFRaVzVrWENJc0lGc2dhbkZZU0ZJc0lITWdYU0FwTzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwTHk4Z1ZHbHRaVzkxZEZ4dVhIUmNkRngwYVdZZ0tDQnpMbUZ6ZVc1aklDWW1JSE11ZEdsdFpXOTFkQ0ErSURBZ0tTQjdYRzVjZEZ4MFhIUmNkSFJwYldWdmRYUlVhVzFsY2lBOUlITmxkRlJwYldWdmRYUW9ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGFuRllTRkl1WVdKdmNuUW9YQ0owYVcxbGIzVjBYQ0lwTzF4dVhIUmNkRngwWEhSOUxDQnpMblJwYldWdmRYUWdLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwZEhKNUlIdGNibHgwWEhSY2RGeDBjM1JoZEdVZ1BTQXhPMXh1WEhSY2RGeDBYSFIwY21GdWMzQnZjblF1YzJWdVpDZ2djbVZ4ZFdWemRFaGxZV1JsY25Nc0lHUnZibVVnS1R0Y2JseDBYSFJjZEgwZ1kyRjBZMmdnS0NCbElDa2dlMXh1WEhSY2RGeDBYSFF2THlCUWNtOXdZV2RoZEdVZ1pYaGpaWEIwYVc5dUlHRnpJR1Z5Y205eUlHbG1JRzV2ZENCa2IyNWxYRzVjZEZ4MFhIUmNkR2xtSUNnZ2MzUmhkR1VnUENBeUlDa2dlMXh1WEhSY2RGeDBYSFJjZEdSdmJtVW9JQzB4TENCbElDazdYRzVjZEZ4MFhIUmNkQzh2SUZOcGJYQnNlU0J5WlhSb2NtOTNJRzkwYUdWeWQybHpaVnh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEhSb2NtOTNJR1U3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2JseDBYSFF2THlCRFlXeHNZbUZqYXlCbWIzSWdkMmhsYmlCbGRtVnllWFJvYVc1bklHbHpJR1J2Ym1WY2JseDBYSFJtZFc1amRHbHZiaUJrYjI1bEtDQnpkR0YwZFhNc0lHNWhkR2wyWlZOMFlYUjFjMVJsZUhRc0lISmxjM0J2Ym5ObGN5d2dhR1ZoWkdWeWN5QXBJSHRjYmx4MFhIUmNkSFpoY2lCcGMxTjFZMk5sYzNNc0lITjFZMk5sYzNNc0lHVnljbTl5TENCeVpYTndiMjV6WlN3Z2JXOWthV1pwWldRc1hHNWNkRngwWEhSY2RITjBZWFIxYzFSbGVIUWdQU0J1WVhScGRtVlRkR0YwZFhOVVpYaDBPMXh1WEc1Y2RGeDBYSFF2THlCRFlXeHNaV1FnYjI1alpWeHVYSFJjZEZ4MGFXWWdLQ0J6ZEdGMFpTQTlQVDBnTWlBcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJUZEdGMFpTQnBjeUJjSW1SdmJtVmNJaUJ1YjNkY2JseDBYSFJjZEhOMFlYUmxJRDBnTWp0Y2JseHVYSFJjZEZ4MEx5OGdRMnhsWVhJZ2RHbHRaVzkxZENCcFppQnBkQ0JsZUdsemRITmNibHgwWEhSY2RHbG1JQ2dnZEdsdFpXOTFkRlJwYldWeUlDa2dlMXh1WEhSY2RGeDBYSFJqYkdWaGNsUnBiV1Z2ZFhRb0lIUnBiV1Z2ZFhSVWFXMWxjaUFwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QkVaWEpsWm1WeVpXNWpaU0IwY21GdWMzQnZjblFnWm05eUlHVmhjbXg1SUdkaGNtSmhaMlVnWTI5c2JHVmpkR2x2Ymx4dVhIUmNkRngwTHk4Z0tHNXZJRzFoZEhSbGNpQm9iM2NnYkc5dVp5QjBhR1VnYW5GWVNGSWdiMkpxWldOMElIZHBiR3dnWW1VZ2RYTmxaQ2xjYmx4MFhIUmNkSFJ5WVc1emNHOXlkQ0E5SUhWdVpHVm1hVzVsWkR0Y2JseHVYSFJjZEZ4MEx5OGdRMkZqYUdVZ2NtVnpjRzl1YzJVZ2FHVmhaR1Z5YzF4dVhIUmNkRngwY21WemNHOXVjMlZJWldGa1pYSnpVM1J5YVc1bklEMGdhR1ZoWkdWeWN5QjhmQ0JjSWx3aU8xeHVYRzVjZEZ4MFhIUXZMeUJUWlhRZ2NtVmhaSGxUZEdGMFpWeHVYSFJjZEZ4MGFuRllTRkl1Y21WaFpIbFRkR0YwWlNBOUlITjBZWFIxY3lBK0lEQWdQeUEwSURvZ01EdGNibHh1WEhSY2RGeDBMeThnUkdWMFpYSnRhVzVsSUdsbUlITjFZMk5sYzNObWRXeGNibHgwWEhSY2RHbHpVM1ZqWTJWemN5QTlJSE4wWVhSMWN5QStQU0F5TURBZ0ppWWdjM1JoZEhWeklEd2dNekF3SUh4OElITjBZWFIxY3lBOVBUMGdNekEwTzF4dVhHNWNkRngwWEhRdkx5QkhaWFFnY21WemNHOXVjMlVnWkdGMFlWeHVYSFJjZEZ4MGFXWWdLQ0J5WlhOd2IyNXpaWE1nS1NCN1hHNWNkRngwWEhSY2RISmxjM0J2Ym5ObElEMGdZV3BoZUVoaGJtUnNaVkpsYzNCdmJuTmxjeWdnY3l3Z2FuRllTRklzSUhKbGMzQnZibk5sY3lBcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJEYjI1MlpYSjBJRzV2SUcxaGRIUmxjaUIzYUdGMElDaDBhR0YwSUhkaGVTQnlaWE53YjI1elpWaFlXQ0JtYVdWc1pITWdZWEpsSUdGc2QyRjVjeUJ6WlhRcFhHNWNkRngwWEhSeVpYTndiMjV6WlNBOUlHRnFZWGhEYjI1MlpYSjBLQ0J6TENCeVpYTndiMjV6WlN3Z2FuRllTRklzSUdselUzVmpZMlZ6Y3lBcE8xeHVYRzVjZEZ4MFhIUXZMeUJKWmlCemRXTmpaWE56Wm5Wc0xDQm9ZVzVrYkdVZ2RIbHdaU0JqYUdGcGJtbHVaMXh1WEhSY2RGeDBhV1lnS0NCcGMxTjFZMk5sYzNNZ0tTQjdYRzVjYmx4MFhIUmNkRngwTHk4Z1UyVjBJSFJvWlNCSlppMU5iMlJwWm1sbFpDMVRhVzVqWlNCaGJtUXZiM0lnU1dZdFRtOXVaUzFOWVhSamFDQm9aV0ZrWlhJc0lHbG1JR2x1SUdsbVRXOWthV1pwWldRZ2JXOWtaUzVjYmx4MFhIUmNkRngwYVdZZ0tDQnpMbWxtVFc5a2FXWnBaV1FnS1NCN1hHNWNkRngwWEhSY2RGeDBiVzlrYVdacFpXUWdQU0JxY1ZoSVVpNW5aWFJTWlhOd2IyNXpaVWhsWVdSbGNpaGNJa3hoYzNRdFRXOWthV1pwWldSY0lpazdYRzVjZEZ4MFhIUmNkRngwYVdZZ0tDQnRiMlJwWm1sbFpDQXBJSHRjYmx4MFhIUmNkRngwWEhSY2RHcFJkV1Z5ZVM1c1lYTjBUVzlrYVdacFpXUmJJR05oWTJobFZWSk1JRjBnUFNCdGIyUnBabWxsWkR0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwYlc5a2FXWnBaV1FnUFNCcWNWaElVaTVuWlhSU1pYTndiMjV6WlVobFlXUmxjaWhjSW1WMFlXZGNJaWs3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0J0YjJScFptbGxaQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR3BSZFdWeWVTNWxkR0ZuV3lCallXTm9aVlZTVENCZElEMGdiVzlrYVdacFpXUTdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBMeThnYVdZZ2JtOGdZMjl1ZEdWdWRGeHVYSFJjZEZ4MFhIUnBaaUFvSUhOMFlYUjFjeUE5UFQwZ01qQTBJSHg4SUhNdWRIbHdaU0E5UFQwZ1hDSklSVUZFWENJZ0tTQjdYRzVjZEZ4MFhIUmNkRngwYzNSaGRIVnpWR1Y0ZENBOUlGd2libTlqYjI1MFpXNTBYQ0k3WEc1Y2JseDBYSFJjZEZ4MEx5OGdhV1lnYm05MElHMXZaR2xtYVdWa1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9JSE4wWVhSMWN5QTlQVDBnTXpBMElDa2dlMXh1WEhSY2RGeDBYSFJjZEhOMFlYUjFjMVJsZUhRZ1BTQmNJbTV2ZEcxdlpHbG1hV1ZrWENJN1hHNWNibHgwWEhSY2RGeDBMeThnU1dZZ2QyVWdhR0YyWlNCa1lYUmhMQ0JzWlhRbmN5QmpiMjUyWlhKMElHbDBYRzVjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwYzNSaGRIVnpWR1Y0ZENBOUlISmxjM0J2Ym5ObExuTjBZWFJsTzF4dVhIUmNkRngwWEhSY2RITjFZMk5sYzNNZ1BTQnlaWE53YjI1elpTNWtZWFJoTzF4dVhIUmNkRngwWEhSY2RHVnljbTl5SUQwZ2NtVnpjRzl1YzJVdVpYSnliM0k3WEc1Y2RGeDBYSFJjZEZ4MGFYTlRkV05qWlhOeklEMGdJV1Z5Y205eU8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUXZMeUJGZUhSeVlXTjBJR1Z5Y205eUlHWnliMjBnYzNSaGRIVnpWR1Y0ZENCaGJtUWdibTl5YldGc2FYcGxJR1p2Y2lCdWIyNHRZV0p2Y25SelhHNWNkRngwWEhSY2RHVnljbTl5SUQwZ2MzUmhkSFZ6VkdWNGREdGNibHgwWEhSY2RGeDBhV1lnS0NCemRHRjBkWE1nZkh3Z0lYTjBZWFIxYzFSbGVIUWdLU0I3WEc1Y2RGeDBYSFJjZEZ4MGMzUmhkSFZ6VkdWNGRDQTlJRndpWlhKeWIzSmNJanRjYmx4MFhIUmNkRngwWEhScFppQW9JSE4wWVhSMWN5QThJREFnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJ6ZEdGMGRYTWdQU0F3TzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCVFpYUWdaR0YwWVNCbWIzSWdkR2hsSUdaaGEyVWdlR2h5SUc5aWFtVmpkRnh1WEhSY2RGeDBhbkZZU0ZJdWMzUmhkSFZ6SUQwZ2MzUmhkSFZ6TzF4dVhIUmNkRngwYW5GWVNGSXVjM1JoZEhWelZHVjRkQ0E5SUNnZ2JtRjBhWFpsVTNSaGRIVnpWR1Y0ZENCOGZDQnpkR0YwZFhOVVpYaDBJQ2tnS3lCY0lsd2lPMXh1WEc1Y2RGeDBYSFF2THlCVGRXTmpaWE56TDBWeWNtOXlYRzVjZEZ4MFhIUnBaaUFvSUdselUzVmpZMlZ6Y3lBcElIdGNibHgwWEhSY2RGeDBaR1ZtWlhKeVpXUXVjbVZ6YjJ4MlpWZHBkR2dvSUdOaGJHeGlZV05yUTI5dWRHVjRkQ3dnV3lCemRXTmpaWE56TENCemRHRjBkWE5VWlhoMExDQnFjVmhJVWlCZElDazdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmtaV1psY25KbFpDNXlaV3BsWTNSWGFYUm9LQ0JqWVd4c1ltRmphME52Ym5SbGVIUXNJRnNnYW5GWVNGSXNJSE4wWVhSMWMxUmxlSFFzSUdWeWNtOXlJRjBnS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdVM1JoZEhWekxXUmxjR1Z1WkdWdWRDQmpZV3hzWW1GamEzTmNibHgwWEhSY2RHcHhXRWhTTG5OMFlYUjFjME52WkdVb0lITjBZWFIxYzBOdlpHVWdLVHRjYmx4MFhIUmNkSE4wWVhSMWMwTnZaR1VnUFNCMWJtUmxabWx1WldRN1hHNWNibHgwWEhSY2RHbG1JQ2dnWm1seVpVZHNiMkpoYkhNZ0tTQjdYRzVjZEZ4MFhIUmNkR2RzYjJKaGJFVjJaVzUwUTI5dWRHVjRkQzUwY21sbloyVnlLQ0JwYzFOMVkyTmxjM01nUHlCY0ltRnFZWGhUZFdOalpYTnpYQ0lnT2lCY0ltRnFZWGhGY25KdmNsd2lMRnh1WEhSY2RGeDBYSFJjZEZzZ2FuRllTRklzSUhNc0lHbHpVM1ZqWTJWemN5QS9JSE4xWTJObGMzTWdPaUJsY25KdmNpQmRJQ2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklFTnZiWEJzWlhSbFhHNWNkRngwWEhSamIyMXdiR1YwWlVSbFptVnljbVZrTG1acGNtVlhhWFJvS0NCallXeHNZbUZqYTBOdmJuUmxlSFFzSUZzZ2FuRllTRklzSUhOMFlYUjFjMVJsZUhRZ1hTQXBPMXh1WEc1Y2RGeDBYSFJwWmlBb0lHWnBjbVZIYkc5aVlXeHpJQ2tnZTF4dVhIUmNkRngwWEhSbmJHOWlZV3hGZG1WdWRFTnZiblJsZUhRdWRISnBaMmRsY2lnZ1hDSmhhbUY0UTI5dGNHeGxkR1ZjSWl3Z1d5QnFjVmhJVWl3Z2N5QmRJQ2s3WEc1Y2RGeDBYSFJjZEM4dklFaGhibVJzWlNCMGFHVWdaMnh2WW1Gc0lFRktRVmdnWTI5MWJuUmxjbHh1WEhSY2RGeDBYSFJwWmlBb0lDRW9JQzB0YWxGMVpYSjVMbUZqZEdsMlpTQXBJQ2tnZTF4dVhIUmNkRngwWEhSY2RHcFJkV1Z5ZVM1bGRtVnVkQzUwY21sbloyVnlLRndpWVdwaGVGTjBiM0JjSWlrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNibHgwWEhSeVpYUjFjbTRnYW5GWVNGSTdYRzVjZEgwc1hHNWNibHgwWjJWMFNsTlBUam9nWm5WdVkzUnBiMjRvSUhWeWJDd2daR0YwWVN3Z1kyRnNiR0poWTJzZ0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUdwUmRXVnllUzVuWlhRb0lIVnliQ3dnWkdGMFlTd2dZMkZzYkdKaFkyc3NJRndpYW5OdmJsd2lJQ2s3WEc1Y2RIMHNYRzVjYmx4MFoyVjBVMk55YVhCME9pQm1kVzVqZEdsdmJpZ2dkWEpzTENCallXeHNZbUZqYXlBcElIdGNibHgwWEhSeVpYUjFjbTRnYWxGMVpYSjVMbWRsZENnZ2RYSnNMQ0IxYm1SbFptbHVaV1FzSUdOaGJHeGlZV05yTENCY0luTmpjbWx3ZEZ3aUlDazdYRzVjZEgxY2JuMHBPMXh1WEc1cVVYVmxjbmt1WldGamFDZ2dXeUJjSW1kbGRGd2lMQ0JjSW5CdmMzUmNJaUJkTENCbWRXNWpkR2x2YmlnZ2FTd2diV1YwYUc5a0lDa2dlMXh1WEhScVVYVmxjbmxiSUcxbGRHaHZaQ0JkSUQwZ1puVnVZM1JwYjI0b0lIVnliQ3dnWkdGMFlTd2dZMkZzYkdKaFkyc3NJSFI1Y0dVZ0tTQjdYRzVjZEZ4MEx5OGdVMmhwWm5RZ1lYSm5kVzFsYm5SeklHbG1JR1JoZEdFZ1lYSm5kVzFsYm5RZ2QyRnpJRzl0YVhSMFpXUmNibHgwWEhScFppQW9JR3BSZFdWeWVTNXBjMFoxYm1OMGFXOXVLQ0JrWVhSaElDa2dLU0I3WEc1Y2RGeDBYSFIwZVhCbElEMGdkSGx3WlNCOGZDQmpZV3hzWW1GamF6dGNibHgwWEhSY2RHTmhiR3hpWVdOcklEMGdaR0YwWVR0Y2JseDBYSFJjZEdSaGRHRWdQU0IxYm1SbFptbHVaV1E3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBjbVYwZFhKdUlHcFJkV1Z5ZVM1aGFtRjRLSHRjYmx4MFhIUmNkSFZ5YkRvZ2RYSnNMRnh1WEhSY2RGeDBkSGx3WlRvZ2JXVjBhRzlrTEZ4dVhIUmNkRngwWkdGMFlWUjVjR1U2SUhSNWNHVXNYRzVjZEZ4MFhIUmtZWFJoT2lCa1lYUmhMRnh1WEhSY2RGeDBjM1ZqWTJWemN6b2dZMkZzYkdKaFkydGNibHgwWEhSOUtUdGNibHgwZlR0Y2JuMHBPMXh1WEc1Y2JtcFJkV1Z5ZVM1ZlpYWmhiRlZ5YkNBOUlHWjFibU4wYVc5dUtDQjFjbXdnS1NCN1hHNWNkSEpsZEhWeWJpQnFVWFZsY25rdVlXcGhlQ2g3WEc1Y2RGeDBkWEpzT2lCMWNtd3NYRzVjZEZ4MGRIbHdaVG9nWENKSFJWUmNJaXhjYmx4MFhIUmtZWFJoVkhsd1pUb2dYQ0p6WTNKcGNIUmNJaXhjYmx4MFhIUmhjM2x1WXpvZ1ptRnNjMlVzWEc1Y2RGeDBaMnh2WW1Gc09pQm1ZV3h6WlN4Y2JseDBYSFJjSW5Sb2NtOTNjMXdpT2lCMGNuVmxYRzVjZEgwcE8xeHVmVHRjYmx4dVhHNXFVWFZsY25rdVptNHVaWGgwWlc1a0tIdGNibHgwZDNKaGNFRnNiRG9nWm5WdVkzUnBiMjRvSUdoMGJXd2dLU0I3WEc1Y2RGeDBkbUZ5SUhkeVlYQTdYRzVjYmx4MFhIUnBaaUFvSUdwUmRXVnllUzVwYzBaMWJtTjBhVzl1S0NCb2RHMXNJQ2tnS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnZEdocGN5NWxZV05vS0daMWJtTjBhVzl1S0NCcElDa2dlMXh1WEhSY2RGeDBYSFJxVVhWbGNua29JSFJvYVhNZ0tTNTNjbUZ3UVd4c0tDQm9kRzFzTG1OaGJHd29kR2hwY3l3Z2FTa2dLVHRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkSDFjYmx4dVhIUmNkR2xtSUNnZ2RHaHBjMXNnTUNCZElDa2dlMXh1WEc1Y2RGeDBYSFF2THlCVWFHVWdaV3hsYldWdWRITWdkRzhnZDNKaGNDQjBhR1VnZEdGeVoyVjBJR0Z5YjNWdVpGeHVYSFJjZEZ4MGQzSmhjQ0E5SUdwUmRXVnllU2dnYUhSdGJDd2dkR2hwYzFzZ01DQmRMbTkzYm1WeVJHOWpkVzFsYm5RZ0tTNWxjU2dnTUNBcExtTnNiMjVsS0NCMGNuVmxJQ2s3WEc1Y2JseDBYSFJjZEdsbUlDZ2dkR2hwYzFzZ01DQmRMbkJoY21WdWRFNXZaR1VnS1NCN1hHNWNkRngwWEhSY2RIZHlZWEF1YVc1elpYSjBRbVZtYjNKbEtDQjBhR2x6V3lBd0lGMGdLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwZDNKaGNDNXRZWEFvWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwWEhSY2RIWmhjaUJsYkdWdElEMGdkR2hwY3p0Y2JseHVYSFJjZEZ4MFhIUjNhR2xzWlNBb0lHVnNaVzB1Wm1seWMzUkZiR1Z0Wlc1MFEyaHBiR1FnS1NCN1hHNWNkRngwWEhSY2RGeDBaV3hsYlNBOUlHVnNaVzB1Wm1seWMzUkZiR1Z0Wlc1MFEyaHBiR1E3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUnlaWFIxY200Z1pXeGxiVHRjYmx4MFhIUmNkSDBwTG1Gd2NHVnVaQ2dnZEdocGN5QXBPMXh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpPMXh1WEhSOUxGeHVYRzVjZEhkeVlYQkpibTVsY2pvZ1puVnVZM1JwYjI0b0lHaDBiV3dnS1NCN1hHNWNkRngwYVdZZ0tDQnFVWFZsY25rdWFYTkdkVzVqZEdsdmJpZ2dhSFJ0YkNBcElDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlIUm9hWE11WldGamFDaG1kVzVqZEdsdmJpZ2dhU0FwSUh0Y2JseDBYSFJjZEZ4MGFsRjFaWEo1S0NCMGFHbHpJQ2t1ZDNKaGNFbHVibVZ5S0NCb2RHMXNMbU5oYkd3b2RHaHBjeXdnYVNrZ0tUdGNibHgwWEhSY2RIMHBPMXh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbVZoWTJnb1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUjJZWElnYzJWc1ppQTlJR3BSZFdWeWVTZ2dkR2hwY3lBcExGeHVYSFJjZEZ4MFhIUmpiMjUwWlc1MGN5QTlJSE5sYkdZdVkyOXVkR1Z1ZEhNb0tUdGNibHh1WEhSY2RGeDBhV1lnS0NCamIyNTBaVzUwY3k1c1pXNW5kR2dnS1NCN1hHNWNkRngwWEhSY2RHTnZiblJsYm5SekxuZHlZWEJCYkd3b0lHaDBiV3dnS1R0Y2JseHVYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MGMyVnNaaTVoY0hCbGJtUW9JR2gwYld3Z0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOUtUdGNibHgwZlN4Y2JseHVYSFIzY21Gd09pQm1kVzVqZEdsdmJpZ2dhSFJ0YkNBcElIdGNibHgwWEhSMllYSWdhWE5HZFc1amRHbHZiaUE5SUdwUmRXVnllUzVwYzBaMWJtTjBhVzl1S0NCb2RHMXNJQ2s3WEc1Y2JseDBYSFJ5WlhSMWNtNGdkR2hwY3k1bFlXTm9LR1oxYm1OMGFXOXVLQ0JwSUNrZ2UxeHVYSFJjZEZ4MGFsRjFaWEo1S0NCMGFHbHpJQ2t1ZDNKaGNFRnNiQ2dnYVhOR2RXNWpkR2x2YmlBL0lHaDBiV3d1WTJGc2JDaDBhR2x6TENCcEtTQTZJR2gwYld3Z0tUdGNibHgwWEhSOUtUdGNibHgwZlN4Y2JseHVYSFIxYm5keVlYQTZJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQjBhR2x6TG5CaGNtVnVkQ2dwTG1WaFkyZ29ablZ1WTNScGIyNG9LU0I3WEc1Y2RGeDBYSFJwWmlBb0lDRnFVWFZsY25rdWJtOWtaVTVoYldVb0lIUm9hWE1zSUZ3aVltOWtlVndpSUNrZ0tTQjdYRzVjZEZ4MFhIUmNkR3BSZFdWeWVTZ2dkR2hwY3lBcExuSmxjR3hoWTJWWGFYUm9LQ0IwYUdsekxtTm9hV3hrVG05a1pYTWdLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlLUzVsYm1Rb0tUdGNibHgwZlZ4dWZTazdYRzVjYmx4dWFsRjFaWEo1TG1WNGNISXVabWxzZEdWeWN5NW9hV1JrWlc0Z1BTQm1kVzVqZEdsdmJpZ2daV3hsYlNBcElIdGNibHgwTHk4Z1UzVndjRzl5ZERvZ1QzQmxjbUVnUEQwZ01USXVNVEpjYmx4MEx5OGdUM0JsY21FZ2NtVndiM0owY3lCdlptWnpaWFJYYVdSMGFITWdZVzVrSUc5bVpuTmxkRWhsYVdkb2RITWdiR1Z6Y3lCMGFHRnVJSHBsY204Z2IyNGdjMjl0WlNCbGJHVnRaVzUwYzF4dVhIUnlaWFIxY200Z1pXeGxiUzV2Wm1aelpYUlhhV1IwYUNBOFBTQXdJQ1ltSUdWc1pXMHViMlptYzJWMFNHVnBaMmgwSUR3OUlEQTdYRzU5TzF4dWFsRjFaWEo1TG1WNGNISXVabWxzZEdWeWN5NTJhWE5wWW14bElEMGdablZ1WTNScGIyNG9JR1ZzWlcwZ0tTQjdYRzVjZEhKbGRIVnliaUFoYWxGMVpYSjVMbVY0Y0hJdVptbHNkR1Z5Y3k1b2FXUmtaVzRvSUdWc1pXMGdLVHRjYm4wN1hHNWNibHh1WEc1Y2JuWmhjaUJ5TWpBZ1BTQXZKVEl3TDJjc1hHNWNkSEppY21GamEyVjBJRDBnTDF4Y1cxeGNYU1F2TEZ4dVhIUnlRMUpNUmlBOUlDOWNYSEkvWEZ4dUwyY3NYRzVjZEhKemRXSnRhWFIwWlhKVWVYQmxjeUE5SUM5ZUtEODZjM1ZpYldsMGZHSjFkSFJ2Ym54cGJXRm5aWHh5WlhObGRIeG1hV3hsS1NRdmFTeGNibHgwY25OMVltMXBkSFJoWW14bElEMGdMMTRvUHpwcGJuQjFkSHh6Wld4bFkzUjhkR1Y0ZEdGeVpXRjhhMlY1WjJWdUtTOXBPMXh1WEc1bWRXNWpkR2x2YmlCaWRXbHNaRkJoY21GdGN5Z2djSEpsWm1sNExDQnZZbW9zSUhSeVlXUnBkR2x2Ym1Gc0xDQmhaR1FnS1NCN1hHNWNkSFpoY2lCdVlXMWxPMXh1WEc1Y2RHbG1JQ2dnYWxGMVpYSjVMbWx6UVhKeVlYa29JRzlpYWlBcElDa2dlMXh1WEhSY2RDOHZJRk5sY21saGJHbDZaU0JoY25KaGVTQnBkR1Z0TGx4dVhIUmNkR3BSZFdWeWVTNWxZV05vS0NCdlltb3NJR1oxYm1OMGFXOXVLQ0JwTENCMklDa2dlMXh1WEhSY2RGeDBhV1lnS0NCMGNtRmthWFJwYjI1aGJDQjhmQ0J5WW5KaFkydGxkQzUwWlhOMEtDQndjbVZtYVhnZ0tTQXBJSHRjYmx4MFhIUmNkRngwTHk4Z1ZISmxZWFFnWldGamFDQmhjbkpoZVNCcGRHVnRJR0Z6SUdFZ2MyTmhiR0Z5TGx4dVhIUmNkRngwWEhSaFpHUW9JSEJ5WldacGVDd2dkaUFwTzF4dVhHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhRdkx5QkpkR1Z0SUdseklHNXZiaTF6WTJGc1lYSWdLR0Z5Y21GNUlHOXlJRzlpYW1WamRDa3NJR1Z1WTI5a1pTQnBkSE1nYm5WdFpYSnBZeUJwYm1SbGVDNWNibHgwWEhSY2RGeDBZblZwYkdSUVlYSmhiWE1vSUhCeVpXWnBlQ0FySUZ3aVcxd2lJQ3NnS0NCMGVYQmxiMllnZGlBOVBUMGdYQ0p2WW1wbFkzUmNJaUEvSUdrZ09pQmNJbHdpSUNrZ0t5QmNJbDFjSWl3Z2Rpd2dkSEpoWkdsMGFXOXVZV3dzSUdGa1pDQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMHBPMXh1WEc1Y2RIMGdaV3h6WlNCcFppQW9JQ0YwY21Ga2FYUnBiMjVoYkNBbUppQnFVWFZsY25rdWRIbHdaU2dnYjJKcUlDa2dQVDA5SUZ3aWIySnFaV04wWENJZ0tTQjdYRzVjZEZ4MEx5OGdVMlZ5YVdGc2FYcGxJRzlpYW1WamRDQnBkR1Z0TGx4dVhIUmNkR1p2Y2lBb0lHNWhiV1VnYVc0Z2IySnFJQ2tnZTF4dVhIUmNkRngwWW5WcGJHUlFZWEpoYlhNb0lIQnlaV1pwZUNBcklGd2lXMXdpSUNzZ2JtRnRaU0FySUZ3aVhWd2lMQ0J2WW1wYklHNWhiV1VnWFN3Z2RISmhaR2wwYVc5dVlXd3NJR0ZrWkNBcE8xeHVYSFJjZEgxY2JseHVYSFI5SUdWc2MyVWdlMXh1WEhSY2RDOHZJRk5sY21saGJHbDZaU0J6WTJGc1lYSWdhWFJsYlM1Y2JseDBYSFJoWkdRb0lIQnlaV1pwZUN3Z2IySnFJQ2s3WEc1Y2RIMWNibjFjYmx4dUx5OGdVMlZ5YVdGc2FYcGxJR0Z1SUdGeWNtRjVJRzltSUdadmNtMGdaV3hsYldWdWRITWdiM0lnWVNCelpYUWdiMlpjYmk4dklHdGxlUzkyWVd4MVpYTWdhVzUwYnlCaElIRjFaWEo1SUhOMGNtbHVaMXh1YWxGMVpYSjVMbkJoY21GdElEMGdablZ1WTNScGIyNG9JR0VzSUhSeVlXUnBkR2x2Ym1Gc0lDa2dlMXh1WEhSMllYSWdjSEpsWm1sNExGeHVYSFJjZEhNZ1BTQmJYU3hjYmx4MFhIUmhaR1FnUFNCbWRXNWpkR2x2YmlnZ2EyVjVMQ0IyWVd4MVpTQXBJSHRjYmx4MFhIUmNkQzh2SUVsbUlIWmhiSFZsSUdseklHRWdablZ1WTNScGIyNHNJR2x1ZG05clpTQnBkQ0JoYm1RZ2NtVjBkWEp1SUdsMGN5QjJZV3gxWlZ4dVhIUmNkRngwZG1Gc2RXVWdQU0JxVVhWbGNua3VhWE5HZFc1amRHbHZiaWdnZG1Gc2RXVWdLU0EvSUhaaGJIVmxLQ2tnT2lBb0lIWmhiSFZsSUQwOUlHNTFiR3dnUHlCY0lsd2lJRG9nZG1Gc2RXVWdLVHRjYmx4MFhIUmNkSE5iSUhNdWJHVnVaM1JvSUYwZ1BTQmxibU52WkdWVlVrbERiMjF3YjI1bGJuUW9JR3RsZVNBcElDc2dYQ0k5WENJZ0t5QmxibU52WkdWVlVrbERiMjF3YjI1bGJuUW9JSFpoYkhWbElDazdYRzVjZEZ4MGZUdGNibHh1WEhRdkx5QlRaWFFnZEhKaFpHbDBhVzl1WVd3Z2RHOGdkSEoxWlNCbWIzSWdhbEYxWlhKNUlEdzlJREV1TXk0eUlHSmxhR0YyYVc5eUxseHVYSFJwWmlBb0lIUnlZV1JwZEdsdmJtRnNJRDA5UFNCMWJtUmxabWx1WldRZ0tTQjdYRzVjZEZ4MGRISmhaR2wwYVc5dVlXd2dQU0JxVVhWbGNua3VZV3BoZUZObGRIUnBibWR6SUNZbUlHcFJkV1Z5ZVM1aGFtRjRVMlYwZEdsdVozTXVkSEpoWkdsMGFXOXVZV3c3WEc1Y2RIMWNibHh1WEhRdkx5QkpaaUJoYmlCaGNuSmhlU0IzWVhNZ2NHRnpjMlZrSUdsdUxDQmhjM04xYldVZ2RHaGhkQ0JwZENCcGN5QmhiaUJoY25KaGVTQnZaaUJtYjNKdElHVnNaVzFsYm5SekxseHVYSFJwWmlBb0lHcFJkV1Z5ZVM1cGMwRnljbUY1S0NCaElDa2dmSHdnS0NCaExtcHhkV1Z5ZVNBbUppQWhhbEYxWlhKNUxtbHpVR3hoYVc1UFltcGxZM1FvSUdFZ0tTQXBJQ2tnZTF4dVhIUmNkQzh2SUZObGNtbGhiR2w2WlNCMGFHVWdabTl5YlNCbGJHVnRaVzUwYzF4dVhIUmNkR3BSZFdWeWVTNWxZV05vS0NCaExDQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUmNkR0ZrWkNnZ2RHaHBjeTV1WVcxbExDQjBhR2x6TG5aaGJIVmxJQ2s3WEc1Y2RGeDBmU2s3WEc1Y2JseDBmU0JsYkhObElIdGNibHgwWEhRdkx5QkpaaUIwY21Ga2FYUnBiMjVoYkN3Z1pXNWpiMlJsSUhSb1pTQmNJbTlzWkZ3aUlIZGhlU0FvZEdobElIZGhlU0F4TGpNdU1pQnZjaUJ2YkdSbGNseHVYSFJjZEM4dklHUnBaQ0JwZENrc0lHOTBhR1Z5ZDJselpTQmxibU52WkdVZ2NHRnlZVzF6SUhKbFkzVnljMmwyWld4NUxseHVYSFJjZEdadmNpQW9JSEJ5WldacGVDQnBiaUJoSUNrZ2UxeHVYSFJjZEZ4MFluVnBiR1JRWVhKaGJYTW9JSEJ5WldacGVDd2dZVnNnY0hKbFptbDRJRjBzSUhSeVlXUnBkR2x2Ym1Gc0xDQmhaR1FnS1R0Y2JseDBYSFI5WEc1Y2RIMWNibHh1WEhRdkx5QlNaWFIxY200Z2RHaGxJSEpsYzNWc2RHbHVaeUJ6WlhKcFlXeHBlbUYwYVc5dVhHNWNkSEpsZEhWeWJpQnpMbXB2YVc0b0lGd2lKbHdpSUNrdWNtVndiR0ZqWlNnZ2NqSXdMQ0JjSWl0Y0lpQXBPMXh1ZlR0Y2JseHVhbEYxWlhKNUxtWnVMbVY0ZEdWdVpDaDdYRzVjZEhObGNtbGhiR2w2WlRvZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MGNtVjBkWEp1SUdwUmRXVnllUzV3WVhKaGJTZ2dkR2hwY3k1elpYSnBZV3hwZW1WQmNuSmhlU2dwSUNrN1hHNWNkSDBzWEc1Y2RITmxjbWxoYkdsNlpVRnljbUY1T2lCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NXRZWEFvWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwWEhRdkx5QkRZVzRnWVdSa0lIQnliM0JJYjI5cklHWnZjaUJjSW1Wc1pXMWxiblJ6WENJZ2RHOGdabWxzZEdWeUlHOXlJR0ZrWkNCbWIzSnRJR1ZzWlcxbGJuUnpYRzVjZEZ4MFhIUjJZWElnWld4bGJXVnVkSE1nUFNCcVVYVmxjbmt1Y0hKdmNDZ2dkR2hwY3l3Z1hDSmxiR1Z0Wlc1MGMxd2lJQ2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdaV3hsYldWdWRITWdQeUJxVVhWbGNua3ViV0ZyWlVGeWNtRjVLQ0JsYkdWdFpXNTBjeUFwSURvZ2RHaHBjenRjYmx4MFhIUjlLVnh1WEhSY2RDNW1hV3gwWlhJb1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUjJZWElnZEhsd1pTQTlJSFJvYVhNdWRIbHdaVHRjYmx4dVhIUmNkRngwTHk4Z1ZYTmxJQzVwY3lnZ1hDSTZaR2x6WVdKc1pXUmNJaUFwSUhOdklIUm9ZWFFnWm1sbGJHUnpaWFJiWkdsellXSnNaV1JkSUhkdmNtdHpYRzVjZEZ4MFhIUnlaWFIxY200Z2RHaHBjeTV1WVcxbElDWW1JQ0ZxVVhWbGNua29JSFJvYVhNZ0tTNXBjeWdnWENJNlpHbHpZV0pzWldSY0lpQXBJQ1ltWEc1Y2RGeDBYSFJjZEhKemRXSnRhWFIwWVdKc1pTNTBaWE4wS0NCMGFHbHpMbTV2WkdWT1lXMWxJQ2tnSmlZZ0lYSnpkV0p0YVhSMFpYSlVlWEJsY3k1MFpYTjBLQ0IwZVhCbElDa2dKaVpjYmx4MFhIUmNkRngwS0NCMGFHbHpMbU5vWldOclpXUWdmSHdnSVhKamFHVmphMkZpYkdWVWVYQmxMblJsYzNRb0lIUjVjR1VnS1NBcE8xeHVYSFJjZEgwcFhHNWNkRngwTG0xaGNDaG1kVzVqZEdsdmJpZ2dhU3dnWld4bGJTQXBJSHRjYmx4MFhIUmNkSFpoY2lCMllXd2dQU0JxVVhWbGNua29JSFJvYVhNZ0tTNTJZV3dvS1R0Y2JseHVYSFJjZEZ4MGNtVjBkWEp1SUhaaGJDQTlQU0J1ZFd4c0lEOWNibHgwWEhSY2RGeDBiblZzYkNBNlhHNWNkRngwWEhSY2RHcFJkV1Z5ZVM1cGMwRnljbUY1S0NCMllXd2dLU0EvWEc1Y2RGeDBYSFJjZEZ4MGFsRjFaWEo1TG0xaGNDZ2dkbUZzTENCbWRXNWpkR2x2YmlnZ2RtRnNJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBjbVYwZFhKdUlIc2dibUZ0WlRvZ1pXeGxiUzV1WVcxbExDQjJZV3gxWlRvZ2RtRnNMbkpsY0d4aFkyVW9JSEpEVWt4R0xDQmNJbHhjY2x4Y2Jsd2lJQ2tnZlR0Y2JseDBYSFJjZEZ4MFhIUjlLU0E2WEc1Y2RGeDBYSFJjZEZ4MGV5QnVZVzFsT2lCbGJHVnRMbTVoYldVc0lIWmhiSFZsT2lCMllXd3VjbVZ3YkdGalpTZ2dja05TVEVZc0lGd2lYRnh5WEZ4dVhDSWdLU0I5TzF4dVhIUmNkSDBwTG1kbGRDZ3BPMXh1WEhSOVhHNTlLVHRjYmx4dVhHNXFVWFZsY25rdVlXcGhlRk5sZEhScGJtZHpMbmhvY2lBOUlHWjFibU4wYVc5dUtDa2dlMXh1WEhSMGNua2dlMXh1WEhSY2RISmxkSFZ5YmlCdVpYY2dXRTFNU0hSMGNGSmxjWFZsYzNRb0tUdGNibHgwZlNCallYUmphQ2dnWlNBcElIdDlYRzU5TzF4dVhHNTJZWElnZUdoeVNXUWdQU0F3TEZ4dVhIUjRhSEpEWVd4c1ltRmphM01nUFNCN2ZTeGNibHgwZUdoeVUzVmpZMlZ6YzFOMFlYUjFjeUE5SUh0Y2JseDBYSFF2THlCbWFXeGxJSEJ5YjNSdlkyOXNJR0ZzZDJGNWN5QjVhV1ZzWkhNZ2MzUmhkSFZ6SUdOdlpHVWdNQ3dnWVhOemRXMWxJREl3TUZ4dVhIUmNkREE2SURJd01DeGNibHgwWEhRdkx5QlRkWEJ3YjNKME9pQkpSVGxjYmx4MFhIUXZMeUFqTVRRMU1Eb2djMjl0WlhScGJXVnpJRWxGSUhKbGRIVnlibk1nTVRJeU15QjNhR1Z1SUdsMElITm9iM1ZzWkNCaVpTQXlNRFJjYmx4MFhIUXhNakl6T2lBeU1EUmNibHgwZlN4Y2JseDBlR2h5VTNWd2NHOXlkR1ZrSUQwZ2FsRjFaWEo1TG1GcVlYaFRaWFIwYVc1bmN5NTRhSElvS1R0Y2JseHVMeThnVTNWd2NHOXlkRG9nU1VVNVhHNHZMeUJQY0dWdUlISmxjWFZsYzNSeklHMTFjM1FnWW1VZ2JXRnVkV0ZzYkhrZ1lXSnZjblJsWkNCdmJpQjFibXh2WVdRZ0tDTTFNamd3S1Z4dUx5OGdVMlZsSUdoMGRIQnpPaTh2YzNWd2NHOXlkQzV0YVdOeWIzTnZablF1WTI5dEwydGlMekk0TlRZM05EWWdabTl5SUcxdmNtVWdhVzVtYjF4dWFXWWdLQ0IzYVc1a2IzY3VZWFIwWVdOb1JYWmxiblFnS1NCN1hHNWNkSGRwYm1SdmR5NWhkSFJoWTJoRmRtVnVkQ2dnWENKdmJuVnViRzloWkZ3aUxDQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MFhIUm1iM0lnS0NCMllYSWdhMlY1SUdsdUlIaG9ja05oYkd4aVlXTnJjeUFwSUh0Y2JseDBYSFJjZEhob2NrTmhiR3hpWVdOcmMxc2dhMlY1SUYwb0tUdGNibHgwWEhSOVhHNWNkSDBwTzF4dWZWeHVYRzV6ZFhCd2IzSjBMbU52Y25NZ1BTQWhJWGhvY2xOMWNIQnZjblJsWkNBbUppQW9JRndpZDJsMGFFTnlaV1JsYm5ScFlXeHpYQ0lnYVc0Z2VHaHlVM1Z3Y0c5eWRHVmtJQ2s3WEc1emRYQndiM0owTG1GcVlYZ2dQU0I0YUhKVGRYQndiM0owWldRZ1BTQWhJWGhvY2xOMWNIQnZjblJsWkR0Y2JseHVhbEYxWlhKNUxtRnFZWGhVY21GdWMzQnZjblFvWm5WdVkzUnBiMjRvSUc5d2RHbHZibk1nS1NCN1hHNWNkSFpoY2lCallXeHNZbUZqYXp0Y2JseHVYSFF2THlCRGNtOXpjeUJrYjIxaGFXNGdiMjVzZVNCaGJHeHZkMlZrSUdsbUlITjFjSEJ2Y25SbFpDQjBhSEp2ZFdkb0lGaE5URWgwZEhCU1pYRjFaWE4wWEc1Y2RHbG1JQ2dnYzNWd2NHOXlkQzVqYjNKeklIeDhJSGhvY2xOMWNIQnZjblJsWkNBbUppQWhiM0IwYVc5dWN5NWpjbTl6YzBSdmJXRnBiaUFwSUh0Y2JseDBYSFJ5WlhSMWNtNGdlMXh1WEhSY2RGeDBjMlZ1WkRvZ1puVnVZM1JwYjI0b0lHaGxZV1JsY25Nc0lHTnZiWEJzWlhSbElDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2FTeGNibHgwWEhSY2RGeDBYSFI0YUhJZ1BTQnZjSFJwYjI1ekxuaG9jaWdwTEZ4dVhIUmNkRngwWEhSY2RHbGtJRDBnS3l0NGFISkpaRHRjYmx4dVhIUmNkRngwWEhSNGFISXViM0JsYmlnZ2IzQjBhVzl1Y3k1MGVYQmxMQ0J2Y0hScGIyNXpMblZ5YkN3Z2IzQjBhVzl1Y3k1aGMzbHVZeXdnYjNCMGFXOXVjeTUxYzJWeWJtRnRaU3dnYjNCMGFXOXVjeTV3WVhOemQyOXlaQ0FwTzF4dVhHNWNkRngwWEhSY2RDOHZJRUZ3Y0d4NUlHTjFjM1J2YlNCbWFXVnNaSE1nYVdZZ2NISnZkbWxrWldSY2JseDBYSFJjZEZ4MGFXWWdLQ0J2Y0hScGIyNXpMbmhvY2tacFpXeGtjeUFwSUh0Y2JseDBYSFJjZEZ4MFhIUm1iM0lnS0NCcElHbHVJRzl3ZEdsdmJuTXVlR2h5Um1sbGJHUnpJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBlR2h5V3lCcElGMGdQU0J2Y0hScGIyNXpMbmhvY2tacFpXeGtjMXNnYVNCZE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJRTkyWlhKeWFXUmxJRzFwYldVZ2RIbHdaU0JwWmlCdVpXVmtaV1JjYmx4MFhIUmNkRngwYVdZZ0tDQnZjSFJwYjI1ekxtMXBiV1ZVZVhCbElDWW1JSGhvY2k1dmRtVnljbWxrWlUxcGJXVlVlWEJsSUNrZ2UxeHVYSFJjZEZ4MFhIUmNkSGhvY2k1dmRtVnljbWxrWlUxcGJXVlVlWEJsS0NCdmNIUnBiMjV6TG0xcGJXVlVlWEJsSUNrN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFF2THlCWUxWSmxjWFZsYzNSbFpDMVhhWFJvSUdobFlXUmxjbHh1WEhSY2RGeDBYSFF2THlCR2IzSWdZM0p2YzNNdFpHOXRZV2x1SUhKbGNYVmxjM1J6TENCelpXVnBibWNnWVhNZ1kyOXVaR2wwYVc5dWN5Qm1iM0lnWVNCd2NtVm1iR2xuYUhRZ1lYSmxYRzVjZEZ4MFhIUmNkQzh2SUdGcmFXNGdkRzhnWVNCcWFXZHpZWGNnY0hWNmVteGxMQ0IzWlNCemFXMXdiSGtnYm1WMlpYSWdjMlYwSUdsMElIUnZJR0psSUhOMWNtVXVYRzVjZEZ4MFhIUmNkQzh2SUNocGRDQmpZVzRnWVd4M1lYbHpJR0psSUhObGRDQnZiaUJoSUhCbGNpMXlaWEYxWlhOMElHSmhjMmx6SUc5eUlHVjJaVzRnZFhOcGJtY2dZV3BoZUZObGRIVndLVnh1WEhSY2RGeDBYSFF2THlCR2IzSWdjMkZ0WlMxa2IyMWhhVzRnY21WeGRXVnpkSE1zSUhkdmJpZDBJR05vWVc1blpTQm9aV0ZrWlhJZ2FXWWdZV3h5WldGa2VTQndjbTkyYVdSbFpDNWNibHgwWEhSY2RGeDBhV1lnS0NBaGIzQjBhVzl1Y3k1amNtOXpjMFJ2YldGcGJpQW1KaUFoYUdWaFpHVnljMXRjSWxndFVtVnhkV1Z6ZEdWa0xWZHBkR2hjSWwwZ0tTQjdYRzVjZEZ4MFhIUmNkRngwYUdWaFpHVnljMXRjSWxndFVtVnhkV1Z6ZEdWa0xWZHBkR2hjSWwwZ1BTQmNJbGhOVEVoMGRIQlNaWEYxWlhOMFhDSTdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhRdkx5QlRaWFFnYUdWaFpHVnljMXh1WEhSY2RGeDBYSFJtYjNJZ0tDQnBJR2x1SUdobFlXUmxjbk1nS1NCN1hHNWNkRngwWEhSY2RGeDBlR2h5TG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSUdrc0lHaGxZV1JsY25OYklHa2dYU0FwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBMeThnUTJGc2JHSmhZMnRjYmx4MFhIUmNkRngwWTJGc2JHSmhZMnNnUFNCbWRXNWpkR2x2YmlnZ2RIbHdaU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9JR05oYkd4aVlXTnJJQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJrWld4bGRHVWdlR2h5UTJGc2JHSmhZMnR6V3lCcFpDQmRPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmpZV3hzWW1GamF5QTlJSGhvY2k1dmJteHZZV1FnUFNCNGFISXViMjVsY25KdmNpQTlJRzUxYkd3N1hHNWNibHgwWEhSY2RGeDBYSFJjZEZ4MGFXWWdLQ0IwZVhCbElEMDlQU0JjSW1GaWIzSjBYQ0lnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MGVHaHlMbUZpYjNKMEtDazdYRzVjZEZ4MFhIUmNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9JSFI1Y0dVZ1BUMDlJRndpWlhKeWIzSmNJaUFwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSamIyMXdiR1YwWlNoY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RDOHZJR1pwYkdVNklIQnliM1J2WTI5c0lHRnNkMkY1Y3lCNWFXVnNaSE1nYzNSaGRIVnpJREE3SUhObFpTQWpPRFl3TlN3Z0l6RTBNakEzWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhSNGFISXVjM1JoZEhWekxGeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBlR2h5TG5OMFlYUjFjMVJsZUhSY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEdOdmJYQnNaWFJsS0Z4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MGVHaHlVM1ZqWTJWemMxTjBZWFIxYzFzZ2VHaHlMbk4wWVhSMWN5QmRJSHg4SUhob2NpNXpkR0YwZFhNc1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUjRhSEl1YzNSaGRIVnpWR1Y0ZEN4Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RDOHZJRk4xY0hCdmNuUTZJRWxGT1Z4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MEx5OGdRV05qWlhOemFXNW5JR0pwYm1GeWVTMWtZWFJoSUhKbGMzQnZibk5sVkdWNGRDQjBhSEp2ZDNNZ1lXNGdaWGhqWlhCMGFXOXVYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFF2THlBb0l6RXhOREkyS1Z4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MGRIbHdaVzltSUhob2NpNXlaWE53YjI1elpWUmxlSFFnUFQwOUlGd2ljM1J5YVc1blhDSWdQeUI3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RIUmxlSFE2SUhob2NpNXlaWE53YjI1elpWUmxlSFJjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEgwZ09pQjFibVJsWm1sdVpXUXNYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFI0YUhJdVoyVjBRV3hzVW1WemNHOXVjMlZJWldGa1pYSnpLQ2xjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFwTzF4dVhIUmNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEZ4MGZUdGNibHh1WEhSY2RGeDBYSFF2THlCTWFYTjBaVzRnZEc4Z1pYWmxiblJ6WEc1Y2RGeDBYSFJjZEhob2NpNXZibXh2WVdRZ1BTQmpZV3hzWW1GamF5Z3BPMXh1WEhSY2RGeDBYSFI0YUhJdWIyNWxjbkp2Y2lBOUlHTmhiR3hpWVdOcktGd2laWEp5YjNKY0lpazdYRzVjYmx4MFhIUmNkRngwTHk4Z1EzSmxZWFJsSUhSb1pTQmhZbTl5ZENCallXeHNZbUZqYTF4dVhIUmNkRngwWEhSallXeHNZbUZqYXlBOUlIaG9ja05oYkd4aVlXTnJjMXNnYVdRZ1hTQTlJR05oYkd4aVlXTnJLRndpWVdKdmNuUmNJaWs3WEc1Y2JseDBYSFJjZEZ4MGRISjVJSHRjYmx4MFhIUmNkRngwWEhRdkx5QkVieUJ6Wlc1a0lIUm9aU0J5WlhGMVpYTjBJQ2gwYUdseklHMWhlU0J5WVdselpTQmhiaUJsZUdObGNIUnBiMjRwWEc1Y2RGeDBYSFJjZEZ4MGVHaHlMbk5sYm1Rb0lHOXdkR2x2Ym5NdWFHRnpRMjl1ZEdWdWRDQW1KaUJ2Y0hScGIyNXpMbVJoZEdFZ2ZId2diblZzYkNBcE8xeHVYSFJjZEZ4MFhIUjlJR05oZEdOb0lDZ2daU0FwSUh0Y2JseDBYSFJjZEZ4MFhIUXZMeUFqTVRRMk9ETTZJRTl1YkhrZ2NtVjBhSEp2ZHlCcFppQjBhR2x6SUdoaGMyNG5kQ0JpWldWdUlHNXZkR2xtYVdWa0lHRnpJR0Z1SUdWeWNtOXlJSGxsZEZ4dVhIUmNkRngwWEhSY2RHbG1JQ2dnWTJGc2JHSmhZMnNnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFIwYUhKdmR5QmxPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTeGNibHh1WEhSY2RGeDBZV0p2Y25RNklHWjFibU4wYVc5dUtDa2dlMXh1WEhSY2RGeDBYSFJwWmlBb0lHTmhiR3hpWVdOcklDa2dlMXh1WEhSY2RGeDBYSFJjZEdOaGJHeGlZV05yS0NrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYSFI5WEc1OUtUdGNibHh1WEc1Y2JseHVMeThnU1c1emRHRnNiQ0J6WTNKcGNIUWdaR0YwWVZSNWNHVmNibXBSZFdWeWVTNWhhbUY0VTJWMGRYQW9lMXh1WEhSaFkyTmxjSFJ6T2lCN1hHNWNkRngwYzJOeWFYQjBPaUJjSW5SbGVIUXZhbUYyWVhOamNtbHdkQ3dnWVhCd2JHbGpZWFJwYjI0dmFtRjJZWE5qY21sd2RDd2dZWEJ3YkdsallYUnBiMjR2WldOdFlYTmpjbWx3ZEN3Z1lYQndiR2xqWVhScGIyNHZlQzFsWTIxaGMyTnlhWEIwWENKY2JseDBmU3hjYmx4MFkyOXVkR1Z1ZEhNNklIdGNibHgwWEhSelkzSnBjSFE2SUM4b1B6cHFZWFpoZkdWamJXRXBjMk55YVhCMEwxeHVYSFI5TEZ4dVhIUmpiMjUyWlhKMFpYSnpPaUI3WEc1Y2RGeDBYQ0owWlhoMElITmpjbWx3ZEZ3aU9pQm1kVzVqZEdsdmJpZ2dkR1Y0ZENBcElIdGNibHgwWEhSY2RHcFJkV1Z5ZVM1bmJHOWlZV3hGZG1Gc0tDQjBaWGgwSUNrN1hHNWNkRngwWEhSeVpYUjFjbTRnZEdWNGREdGNibHgwWEhSOVhHNWNkSDFjYm4wcE8xeHVYRzR2THlCSVlXNWtiR1VnWTJGamFHVW5jeUJ6Y0dWamFXRnNJR05oYzJVZ1lXNWtJR055YjNOelJHOXRZV2x1WEc1cVVYVmxjbmt1WVdwaGVGQnlaV1pwYkhSbGNpZ2dYQ0p6WTNKcGNIUmNJaXdnWm5WdVkzUnBiMjRvSUhNZ0tTQjdYRzVjZEdsbUlDZ2djeTVqWVdOb1pTQTlQVDBnZFc1a1pXWnBibVZrSUNrZ2UxeHVYSFJjZEhNdVkyRmphR1VnUFNCbVlXeHpaVHRjYmx4MGZWeHVYSFJwWmlBb0lITXVZM0p2YzNORWIyMWhhVzRnS1NCN1hHNWNkRngwY3k1MGVYQmxJRDBnWENKSFJWUmNJanRjYmx4MGZWeHVmU2s3WEc1Y2JpOHZJRUpwYm1RZ2MyTnlhWEIwSUhSaFp5Qm9ZV05ySUhSeVlXNXpjRzl5ZEZ4dWFsRjFaWEo1TG1GcVlYaFVjbUZ1YzNCdmNuUW9JRndpYzJOeWFYQjBYQ0lzSUdaMWJtTjBhVzl1S0NCeklDa2dlMXh1WEhRdkx5QlVhR2x6SUhSeVlXNXpjRzl5ZENCdmJteDVJR1JsWVd4eklIZHBkR2dnWTNKdmMzTWdaRzl0WVdsdUlISmxjWFZsYzNSelhHNWNkR2xtSUNnZ2N5NWpjbTl6YzBSdmJXRnBiaUFwSUh0Y2JseDBYSFIyWVhJZ2MyTnlhWEIwTENCallXeHNZbUZqYXp0Y2JseDBYSFJ5WlhSMWNtNGdlMXh1WEhSY2RGeDBjMlZ1WkRvZ1puVnVZM1JwYjI0b0lGOHNJR052YlhCc1pYUmxJQ2tnZTF4dVhIUmNkRngwWEhSelkzSnBjSFFnUFNCcVVYVmxjbmtvWENJOGMyTnlhWEIwUGx3aUtTNXdjbTl3S0h0Y2JseDBYSFJjZEZ4MFhIUmhjM2x1WXpvZ2RISjFaU3hjYmx4MFhIUmNkRngwWEhSamFHRnljMlYwT2lCekxuTmpjbWx3ZEVOb1lYSnpaWFFzWEc1Y2RGeDBYSFJjZEZ4MGMzSmpPaUJ6TG5WeWJGeHVYSFJjZEZ4MFhIUjlLUzV2YmloY2JseDBYSFJjZEZ4MFhIUmNJbXh2WVdRZ1pYSnliM0pjSWl4Y2JseDBYSFJjZEZ4MFhIUmpZV3hzWW1GamF5QTlJR1oxYm1OMGFXOXVLQ0JsZG5RZ0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSelkzSnBjSFF1Y21WdGIzWmxLQ2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUmpZV3hzWW1GamF5QTlJRzUxYkd3N1hHNWNkRngwWEhSY2RGeDBYSFJwWmlBb0lHVjJkQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWTI5dGNHeGxkR1VvSUdWMmRDNTBlWEJsSUQwOVBTQmNJbVZ5Y205eVhDSWdQeUEwTURRZ09pQXlNREFzSUdWMmRDNTBlWEJsSUNrN1hHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUXBPMXh1WEhSY2RGeDBYSFJrYjJOMWJXVnVkQzVvWldGa0xtRndjR1Z1WkVOb2FXeGtLQ0J6WTNKcGNIUmJJREFnWFNBcE8xeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RHRmliM0owT2lCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RGeDBhV1lnS0NCallXeHNZbUZqYXlBcElIdGNibHgwWEhSY2RGeDBYSFJqWVd4c1ltRmpheWdwTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseDBmVnh1ZlNrN1hHNWNibHh1WEc1Y2JuWmhjaUJ2YkdSRFlXeHNZbUZqYTNNZ1BTQmJYU3hjYmx4MGNtcHpiMjV3SUQwZ0x5ZzlLVnhjUHlnL1BTWjhKQ2w4WEZ3L1hGdy9MenRjYmx4dUx5OGdSR1ZtWVhWc2RDQnFjMjl1Y0NCelpYUjBhVzVuYzF4dWFsRjFaWEo1TG1GcVlYaFRaWFIxY0NoN1hHNWNkR3B6YjI1d09pQmNJbU5oYkd4aVlXTnJYQ0lzWEc1Y2RHcHpiMjV3UTJGc2JHSmhZMnM2SUdaMWJtTjBhVzl1S0NrZ2UxeHVYSFJjZEhaaGNpQmpZV3hzWW1GamF5QTlJRzlzWkVOaGJHeGlZV05yY3k1d2IzQW9LU0I4ZkNBb0lHcFJkV1Z5ZVM1bGVIQmhibVJ2SUNzZ1hDSmZYQ0lnS3lBb0lHNXZibU5sS3lzZ0tTQXBPMXh1WEhSY2RIUm9hWE5iSUdOaGJHeGlZV05ySUYwZ1BTQjBjblZsTzF4dVhIUmNkSEpsZEhWeWJpQmpZV3hzWW1GamF6dGNibHgwZlZ4dWZTazdYRzVjYmk4dklFUmxkR1ZqZEN3Z2JtOXliV0ZzYVhwbElHOXdkR2x2Ym5NZ1lXNWtJR2x1YzNSaGJHd2dZMkZzYkdKaFkydHpJR1p2Y2lCcWMyOXVjQ0J5WlhGMVpYTjBjMXh1YWxGMVpYSjVMbUZxWVhoUWNtVm1hV3gwWlhJb0lGd2lhbk52YmlCcWMyOXVjRndpTENCbWRXNWpkR2x2YmlnZ2N5d2diM0pwWjJsdVlXeFRaWFIwYVc1bmN5d2dhbkZZU0ZJZ0tTQjdYRzVjYmx4MGRtRnlJR05oYkd4aVlXTnJUbUZ0WlN3Z2IzWmxjbmR5YVhSMFpXNHNJSEpsYzNCdmJuTmxRMjl1ZEdGcGJtVnlMRnh1WEhSY2RHcHpiMjVRY205d0lEMGdjeTVxYzI5dWNDQWhQVDBnWm1Gc2MyVWdKaVlnS0NCeWFuTnZibkF1ZEdWemRDZ2djeTUxY213Z0tTQS9YRzVjZEZ4MFhIUmNJblZ5YkZ3aUlEcGNibHgwWEhSY2RIUjVjR1Z2WmlCekxtUmhkR0VnUFQwOUlGd2ljM1J5YVc1blhDSWdKaVlnSVNnZ2N5NWpiMjUwWlc1MFZIbHdaU0I4ZkNCY0lsd2lJQ2t1YVc1a1pYaFBaaWhjSW1Gd2NHeHBZMkYwYVc5dUwzZ3RkM2QzTFdadmNtMHRkWEpzWlc1amIyUmxaRndpS1NBbUppQnlhbk52Ym5BdWRHVnpkQ2dnY3k1a1lYUmhJQ2tnSmlZZ1hDSmtZWFJoWENKY2JseDBYSFFwTzF4dVhHNWNkQzh2SUVoaGJtUnNaU0JwWm1ZZ2RHaGxJR1Y0Y0dWamRHVmtJR1JoZEdFZ2RIbHdaU0JwY3lCY0ltcHpiMjV3WENJZ2IzSWdkMlVnYUdGMlpTQmhJSEJoY21GdFpYUmxjaUIwYnlCelpYUmNibHgwYVdZZ0tDQnFjMjl1VUhKdmNDQjhmQ0J6TG1SaGRHRlVlWEJsYzFzZ01DQmRJRDA5UFNCY0ltcHpiMjV3WENJZ0tTQjdYRzVjYmx4MFhIUXZMeUJIWlhRZ1kyRnNiR0poWTJzZ2JtRnRaU3dnY21WdFpXMWlaWEpwYm1jZ2NISmxaWGhwYzNScGJtY2dkbUZzZFdVZ1lYTnpiMk5wWVhSbFpDQjNhWFJvSUdsMFhHNWNkRngwWTJGc2JHSmhZMnRPWVcxbElEMGdjeTVxYzI5dWNFTmhiR3hpWVdOcklEMGdhbEYxWlhKNUxtbHpSblZ1WTNScGIyNG9JSE11YW5OdmJuQkRZV3hzWW1GamF5QXBJRDljYmx4MFhIUmNkSE11YW5OdmJuQkRZV3hzWW1GamF5Z3BJRHBjYmx4MFhIUmNkSE11YW5OdmJuQkRZV3hzWW1GamF6dGNibHh1WEhSY2RDOHZJRWx1YzJWeWRDQmpZV3hzWW1GamF5QnBiblJ2SUhWeWJDQnZjaUJtYjNKdElHUmhkR0ZjYmx4MFhIUnBaaUFvSUdwemIyNVFjbTl3SUNrZ2UxeHVYSFJjZEZ4MGMxc2dhbk52YmxCeWIzQWdYU0E5SUhOYklHcHpiMjVRY205d0lGMHVjbVZ3YkdGalpTZ2djbXB6YjI1d0xDQmNJaVF4WENJZ0t5QmpZV3hzWW1GamEwNWhiV1VnS1R0Y2JseDBYSFI5SUdWc2MyVWdhV1lnS0NCekxtcHpiMjV3SUNFOVBTQm1ZV3h6WlNBcElIdGNibHgwWEhSY2RITXVkWEpzSUNzOUlDZ2djbkYxWlhKNUxuUmxjM1FvSUhNdWRYSnNJQ2tnUHlCY0lpWmNJaUE2SUZ3aVAxd2lJQ2tnS3lCekxtcHpiMjV3SUNzZ1hDSTlYQ0lnS3lCallXeHNZbUZqYTA1aGJXVTdYRzVjZEZ4MGZWeHVYRzVjZEZ4MEx5OGdWWE5sSUdSaGRHRWdZMjl1ZG1WeWRHVnlJSFJ2SUhKbGRISnBaWFpsSUdwemIyNGdZV1owWlhJZ2MyTnlhWEIwSUdWNFpXTjFkR2x2Ymx4dVhIUmNkSE11WTI5dWRtVnlkR1Z5YzF0Y0luTmpjbWx3ZENCcWMyOXVYQ0pkSUQwZ1puVnVZM1JwYjI0b0tTQjdYRzVjZEZ4MFhIUnBaaUFvSUNGeVpYTndiMjV6WlVOdmJuUmhhVzVsY2lBcElIdGNibHgwWEhSY2RGeDBhbEYxWlhKNUxtVnljbTl5S0NCallXeHNZbUZqYTA1aGJXVWdLeUJjSWlCM1lYTWdibTkwSUdOaGJHeGxaRndpSUNrN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSeVpYUjFjbTRnY21WemNHOXVjMlZEYjI1MFlXbHVaWEpiSURBZ1hUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5OGdabTl5WTJVZ2FuTnZiaUJrWVhSaFZIbHdaVnh1WEhSY2RITXVaR0YwWVZSNWNHVnpXeUF3SUYwZ1BTQmNJbXB6YjI1Y0lqdGNibHh1WEhSY2RDOHZJRWx1YzNSaGJHd2dZMkZzYkdKaFkydGNibHgwWEhSdmRtVnlkM0pwZEhSbGJpQTlJSGRwYm1SdmQxc2dZMkZzYkdKaFkydE9ZVzFsSUYwN1hHNWNkRngwZDJsdVpHOTNXeUJqWVd4c1ltRmphMDVoYldVZ1hTQTlJR1oxYm1OMGFXOXVLQ2tnZTF4dVhIUmNkRngwY21WemNHOXVjMlZEYjI1MFlXbHVaWElnUFNCaGNtZDFiV1Z1ZEhNN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4dklFTnNaV0Z1TFhWd0lHWjFibU4wYVc5dUlDaG1hWEpsY3lCaFpuUmxjaUJqYjI1MlpYSjBaWEp6S1Z4dVhIUmNkR3B4V0VoU0xtRnNkMkY1Y3lobWRXNWpkR2x2YmlncElIdGNibHgwWEhSY2RDOHZJRkpsYzNSdmNtVWdjSEpsWlhocGMzUnBibWNnZG1Gc2RXVmNibHgwWEhSY2RIZHBibVJ2ZDFzZ1kyRnNiR0poWTJ0T1lXMWxJRjBnUFNCdmRtVnlkM0pwZEhSbGJqdGNibHh1WEhSY2RGeDBMeThnVTJGMlpTQmlZV05ySUdGeklHWnlaV1ZjYmx4MFhIUmNkR2xtSUNnZ2Mxc2dZMkZzYkdKaFkydE9ZVzFsSUYwZ0tTQjdYRzVjZEZ4MFhIUmNkQzh2SUcxaGEyVWdjM1Z5WlNCMGFHRjBJSEpsTFhWemFXNW5JSFJvWlNCdmNIUnBiMjV6SUdSdlpYTnVKM1FnYzJOeVpYY2dkR2hwYm1keklHRnliM1Z1WkZ4dVhIUmNkRngwWEhSekxtcHpiMjV3UTJGc2JHSmhZMnNnUFNCdmNtbG5hVzVoYkZObGRIUnBibWR6TG1wemIyNXdRMkZzYkdKaFkyczdYRzVjYmx4MFhIUmNkRngwTHk4Z2MyRjJaU0IwYUdVZ1kyRnNiR0poWTJzZ2JtRnRaU0JtYjNJZ1puVjBkWEpsSUhWelpWeHVYSFJjZEZ4MFhIUnZiR1JEWVd4c1ltRmphM011Y0hWemFDZ2dZMkZzYkdKaFkydE9ZVzFsSUNrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRU5oYkd3Z2FXWWdhWFFnZDJGeklHRWdablZ1WTNScGIyNGdZVzVrSUhkbElHaGhkbVVnWVNCeVpYTndiMjV6WlZ4dVhIUmNkRngwYVdZZ0tDQnlaWE53YjI1elpVTnZiblJoYVc1bGNpQW1KaUJxVVhWbGNua3VhWE5HZFc1amRHbHZiaWdnYjNabGNuZHlhWFIwWlc0Z0tTQXBJSHRjYmx4MFhIUmNkRngwYjNabGNuZHlhWFIwWlc0b0lISmxjM0J2Ym5ObFEyOXVkR0ZwYm1WeVd5QXdJRjBnS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGNtVnpjRzl1YzJWRGIyNTBZV2x1WlhJZ1BTQnZkbVZ5ZDNKcGRIUmxiaUE5SUhWdVpHVm1hVzVsWkR0Y2JseDBYSFI5S1R0Y2JseHVYSFJjZEM4dklFUmxiR1ZuWVhSbElIUnZJSE5qY21sd2RGeHVYSFJjZEhKbGRIVnliaUJjSW5OamNtbHdkRndpTzF4dVhIUjlYRzU5S1R0Y2JseHVYRzVjYmx4dUx5OGdaR0YwWVRvZ2MzUnlhVzVuSUc5bUlHaDBiV3hjYmk4dklHTnZiblJsZUhRZ0tHOXdkR2x2Ym1Gc0tUb2dTV1lnYzNCbFkybG1hV1ZrTENCMGFHVWdabkpoWjIxbGJuUWdkMmxzYkNCaVpTQmpjbVZoZEdWa0lHbHVJSFJvYVhNZ1kyOXVkR1Y0ZEN3Z1pHVm1ZWFZzZEhNZ2RHOGdaRzlqZFcxbGJuUmNiaTh2SUd0bFpYQlRZM0pwY0hSeklDaHZjSFJwYjI1aGJDazZJRWxtSUhSeWRXVXNJSGRwYkd3Z2FXNWpiSFZrWlNCelkzSnBjSFJ6SUhCaGMzTmxaQ0JwYmlCMGFHVWdhSFJ0YkNCemRISnBibWRjYm1wUmRXVnllUzV3WVhKelpVaFVUVXdnUFNCbWRXNWpkR2x2YmlnZ1pHRjBZU3dnWTI5dWRHVjRkQ3dnYTJWbGNGTmpjbWx3ZEhNZ0tTQjdYRzVjZEdsbUlDZ2dJV1JoZEdFZ2ZId2dkSGx3Wlc5bUlHUmhkR0VnSVQwOUlGd2ljM1J5YVc1blhDSWdLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHNTFiR3c3WEc1Y2RIMWNibHgwYVdZZ0tDQjBlWEJsYjJZZ1kyOXVkR1Y0ZENBOVBUMGdYQ0ppYjI5c1pXRnVYQ0lnS1NCN1hHNWNkRngwYTJWbGNGTmpjbWx3ZEhNZ1BTQmpiMjUwWlhoME8xeHVYSFJjZEdOdmJuUmxlSFFnUFNCbVlXeHpaVHRjYmx4MGZWeHVYSFJqYjI1MFpYaDBJRDBnWTI5dWRHVjRkQ0I4ZkNCa2IyTjFiV1Z1ZER0Y2JseHVYSFIyWVhJZ2NHRnljMlZrSUQwZ2NuTnBibWRzWlZSaFp5NWxlR1ZqS0NCa1lYUmhJQ2tzWEc1Y2RGeDBjMk55YVhCMGN5QTlJQ0ZyWldWd1UyTnlhWEIwY3lBbUppQmJYVHRjYmx4dVhIUXZMeUJUYVc1bmJHVWdkR0ZuWEc1Y2RHbG1JQ2dnY0dGeWMyVmtJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQmJJR052Ym5SbGVIUXVZM0psWVhSbFJXeGxiV1Z1ZENnZ2NHRnljMlZrV3pGZElDa2dYVHRjYmx4MGZWeHVYRzVjZEhCaGNuTmxaQ0E5SUdwUmRXVnllUzVpZFdsc1pFWnlZV2R0Wlc1MEtDQmJJR1JoZEdFZ1hTd2dZMjl1ZEdWNGRDd2djMk55YVhCMGN5QXBPMXh1WEc1Y2RHbG1JQ2dnYzJOeWFYQjBjeUFtSmlCelkzSnBjSFJ6TG14bGJtZDBhQ0FwSUh0Y2JseDBYSFJxVVhWbGNua29JSE5qY21sd2RITWdLUzV5WlcxdmRtVW9LVHRjYmx4MGZWeHVYRzVjZEhKbGRIVnliaUJxVVhWbGNua3ViV1Z5WjJVb0lGdGRMQ0J3WVhKelpXUXVZMmhwYkdST2IyUmxjeUFwTzF4dWZUdGNibHh1WEc0dkx5QkxaV1Z3SUdFZ1kyOXdlU0J2WmlCMGFHVWdiMnhrSUd4dllXUWdiV1YwYUc5a1hHNTJZWElnWDJ4dllXUWdQU0JxVVhWbGNua3VabTR1Ykc5aFpEdGNibHh1THlvcVhHNGdLaUJNYjJGa0lHRWdkWEpzSUdsdWRHOGdZU0J3WVdkbFhHNGdLaTljYm1wUmRXVnllUzVtYmk1c2IyRmtJRDBnWm5WdVkzUnBiMjRvSUhWeWJDd2djR0Z5WVcxekxDQmpZV3hzWW1GamF5QXBJSHRjYmx4MGFXWWdLQ0IwZVhCbGIyWWdkWEpzSUNFOVBTQmNJbk4wY21sdVoxd2lJQ1ltSUY5c2IyRmtJQ2tnZTF4dVhIUmNkSEpsZEhWeWJpQmZiRzloWkM1aGNIQnNlU2dnZEdocGN5d2dZWEpuZFcxbGJuUnpJQ2s3WEc1Y2RIMWNibHh1WEhSMllYSWdjMlZzWldOMGIzSXNJSFI1Y0dVc0lISmxjM0J2Ym5ObExGeHVYSFJjZEhObGJHWWdQU0IwYUdsekxGeHVYSFJjZEc5bVppQTlJSFZ5YkM1cGJtUmxlRTltS0Z3aUlGd2lLVHRjYmx4dVhIUnBaaUFvSUc5bVppQStQU0F3SUNrZ2UxeHVYSFJjZEhObGJHVmpkRzl5SUQwZ2FsRjFaWEo1TG5SeWFXMG9JSFZ5YkM1emJHbGpaU2dnYjJabUlDa2dLVHRjYmx4MFhIUjFjbXdnUFNCMWNtd3VjMnhwWTJVb0lEQXNJRzltWmlBcE8xeHVYSFI5WEc1Y2JseDBMeThnU1dZZ2FYUW5jeUJoSUdaMWJtTjBhVzl1WEc1Y2RHbG1JQ2dnYWxGMVpYSjVMbWx6Um5WdVkzUnBiMjRvSUhCaGNtRnRjeUFwSUNrZ2UxeHVYRzVjZEZ4MEx5OGdWMlVnWVhOemRXMWxJSFJvWVhRZ2FYUW5jeUIwYUdVZ1kyRnNiR0poWTJ0Y2JseDBYSFJqWVd4c1ltRmpheUE5SUhCaGNtRnRjenRjYmx4MFhIUndZWEpoYlhNZ1BTQjFibVJsWm1sdVpXUTdYRzVjYmx4MEx5OGdUM1JvWlhKM2FYTmxMQ0JpZFdsc1pDQmhJSEJoY21GdElITjBjbWx1WjF4dVhIUjlJR1ZzYzJVZ2FXWWdLQ0J3WVhKaGJYTWdKaVlnZEhsd1pXOW1JSEJoY21GdGN5QTlQVDBnWENKdlltcGxZM1JjSWlBcElIdGNibHgwWEhSMGVYQmxJRDBnWENKUVQxTlVYQ0k3WEc1Y2RIMWNibHh1WEhRdkx5QkpaaUIzWlNCb1lYWmxJR1ZzWlcxbGJuUnpJSFJ2SUcxdlpHbG1lU3dnYldGclpTQjBhR1VnY21WeGRXVnpkRnh1WEhScFppQW9JSE5sYkdZdWJHVnVaM1JvSUQ0Z01DQXBJSHRjYmx4MFhIUnFVWFZsY25rdVlXcGhlQ2g3WEc1Y2RGeDBYSFIxY213NklIVnliQ3hjYmx4dVhIUmNkRngwTHk4Z2FXWWdYQ0owZVhCbFhDSWdkbUZ5YVdGaWJHVWdhWE1nZFc1a1pXWnBibVZrTENCMGFHVnVJRndpUjBWVVhDSWdiV1YwYUc5a0lIZHBiR3dnWW1VZ2RYTmxaRnh1WEhSY2RGeDBkSGx3WlRvZ2RIbHdaU3hjYmx4MFhIUmNkR1JoZEdGVWVYQmxPaUJjSW1oMGJXeGNJaXhjYmx4MFhIUmNkR1JoZEdFNklIQmhjbUZ0YzF4dVhIUmNkSDBwTG1SdmJtVW9ablZ1WTNScGIyNG9JSEpsYzNCdmJuTmxWR1Y0ZENBcElIdGNibHh1WEhSY2RGeDBMeThnVTJGMlpTQnlaWE53YjI1elpTQm1iM0lnZFhObElHbHVJR052YlhCc1pYUmxJR05oYkd4aVlXTnJYRzVjZEZ4MFhIUnlaWE53YjI1elpTQTlJR0Z5WjNWdFpXNTBjenRjYmx4dVhIUmNkRngwYzJWc1ppNW9kRzFzS0NCelpXeGxZM1J2Y2lBL1hHNWNibHgwWEhSY2RGeDBMeThnU1dZZ1lTQnpaV3hsWTNSdmNpQjNZWE1nYzNCbFkybG1hV1ZrTENCc2IyTmhkR1VnZEdobElISnBaMmgwSUdWc1pXMWxiblJ6SUdsdUlHRWdaSFZ0YlhrZ1pHbDJYRzVjZEZ4MFhIUmNkQzh2SUVWNFkyeDFaR1VnYzJOeWFYQjBjeUIwYnlCaGRtOXBaQ0JKUlNBblVHVnliV2x6YzJsdmJpQkVaVzVwWldRbklHVnljbTl5YzF4dVhIUmNkRngwWEhScVVYVmxjbmtvWENJOFpHbDJQbHdpS1M1aGNIQmxibVFvSUdwUmRXVnllUzV3WVhKelpVaFVUVXdvSUhKbGMzQnZibk5sVkdWNGRDQXBJQ2t1Wm1sdVpDZ2djMlZzWldOMGIzSWdLU0E2WEc1Y2JseDBYSFJjZEZ4MEx5OGdUM1JvWlhKM2FYTmxJSFZ6WlNCMGFHVWdablZzYkNCeVpYTjFiSFJjYmx4MFhIUmNkRngwY21WemNHOXVjMlZVWlhoMElDazdYRzVjYmx4MFhIUjlLUzVqYjIxd2JHVjBaU2dnWTJGc2JHSmhZMnNnSmlZZ1puVnVZM1JwYjI0b0lHcHhXRWhTTENCemRHRjBkWE1nS1NCN1hHNWNkRngwWEhSelpXeG1MbVZoWTJnb0lHTmhiR3hpWVdOckxDQnlaWE53YjI1elpTQjhmQ0JiSUdweFdFaFNMbkpsYzNCdmJuTmxWR1Y0ZEN3Z2MzUmhkSFZ6TENCcWNWaElVaUJkSUNrN1hHNWNkRngwZlNrN1hHNWNkSDFjYmx4dVhIUnlaWFIxY200Z2RHaHBjenRjYm4wN1hHNWNibHh1WEc1Y2JpOHZJRUYwZEdGamFDQmhJR0oxYm1Ob0lHOW1JR1oxYm1OMGFXOXVjeUJtYjNJZ2FHRnVaR3hwYm1jZ1kyOXRiVzl1SUVGS1FWZ2daWFpsYm5SelhHNXFVWFZsY25rdVpXRmphQ2dnV3lCY0ltRnFZWGhUZEdGeWRGd2lMQ0JjSW1GcVlYaFRkRzl3WENJc0lGd2lZV3BoZUVOdmJYQnNaWFJsWENJc0lGd2lZV3BoZUVWeWNtOXlYQ0lzSUZ3aVlXcGhlRk4xWTJObGMzTmNJaXdnWENKaGFtRjRVMlZ1WkZ3aUlGMHNJR1oxYm1OMGFXOXVLQ0JwTENCMGVYQmxJQ2tnZTF4dVhIUnFVWFZsY25rdVptNWJJSFI1Y0dVZ1hTQTlJR1oxYm1OMGFXOXVLQ0JtYmlBcElIdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NXZiaWdnZEhsd1pTd2dabTRnS1R0Y2JseDBmVHRjYm4wcE8xeHVYRzVjYmx4dVhHNXFVWFZsY25rdVpYaHdjaTVtYVd4MFpYSnpMbUZ1YVcxaGRHVmtJRDBnWm5WdVkzUnBiMjRvSUdWc1pXMGdLU0I3WEc1Y2RISmxkSFZ5YmlCcVVYVmxjbmt1WjNKbGNDaHFVWFZsY25rdWRHbHRaWEp6TENCbWRXNWpkR2x2YmlnZ1ptNGdLU0I3WEc1Y2RGeDBjbVYwZFhKdUlHVnNaVzBnUFQwOUlHWnVMbVZzWlcwN1hHNWNkSDBwTG14bGJtZDBhRHRjYm4wN1hHNWNibHh1WEc1Y2JuWmhjaUJrYjJORmJHVnRJRDBnZDJsdVpHOTNMbVJ2WTNWdFpXNTBMbVJ2WTNWdFpXNTBSV3hsYldWdWREdGNibHh1THlvcVhHNGdLaUJIWlhSeklHRWdkMmx1Wkc5M0lHWnliMjBnWVc0Z1pXeGxiV1Z1ZEZ4dUlDb3ZYRzVtZFc1amRHbHZiaUJuWlhSWGFXNWtiM2NvSUdWc1pXMGdLU0I3WEc1Y2RISmxkSFZ5YmlCcVVYVmxjbmt1YVhOWGFXNWtiM2NvSUdWc1pXMGdLU0EvSUdWc1pXMGdPaUJsYkdWdExtNXZaR1ZVZVhCbElEMDlQU0E1SUNZbUlHVnNaVzB1WkdWbVlYVnNkRlpwWlhjN1hHNTlYRzVjYm1wUmRXVnllUzV2Wm1aelpYUWdQU0I3WEc1Y2RITmxkRTltWm5ObGREb2dablZ1WTNScGIyNG9JR1ZzWlcwc0lHOXdkR2x2Ym5Nc0lHa2dLU0I3WEc1Y2RGeDBkbUZ5SUdOMWNsQnZjMmwwYVc5dUxDQmpkWEpNWldaMExDQmpkWEpEVTFOVWIzQXNJR04xY2xSdmNDd2dZM1Z5VDJabWMyVjBMQ0JqZFhKRFUxTk1aV1owTENCallXeGpkV3hoZEdWUWIzTnBkR2x2Yml4Y2JseDBYSFJjZEhCdmMybDBhVzl1SUQwZ2FsRjFaWEo1TG1OemN5Z2daV3hsYlN3Z1hDSndiM05wZEdsdmJsd2lJQ2tzWEc1Y2RGeDBYSFJqZFhKRmJHVnRJRDBnYWxGMVpYSjVLQ0JsYkdWdElDa3NYRzVjZEZ4MFhIUndjbTl3Y3lBOUlIdDlPMXh1WEc1Y2RGeDBMeThnVTJWMElIQnZjMmwwYVc5dUlHWnBjbk4wTENCcGJpMWpZWE5sSUhSdmNDOXNaV1owSUdGeVpTQnpaWFFnWlhabGJpQnZiaUJ6ZEdGMGFXTWdaV3hsYlZ4dVhIUmNkR2xtSUNnZ2NHOXphWFJwYjI0Z1BUMDlJRndpYzNSaGRHbGpYQ0lnS1NCN1hHNWNkRngwWEhSbGJHVnRMbk4wZVd4bExuQnZjMmwwYVc5dUlEMGdYQ0p5Wld4aGRHbDJaVndpTzF4dVhIUmNkSDFjYmx4dVhIUmNkR04xY2s5bVpuTmxkQ0E5SUdOMWNrVnNaVzB1YjJabWMyVjBLQ2s3WEc1Y2RGeDBZM1Z5UTFOVFZHOXdJRDBnYWxGMVpYSjVMbU56Y3lnZ1pXeGxiU3dnWENKMGIzQmNJaUFwTzF4dVhIUmNkR04xY2tOVFUweGxablFnUFNCcVVYVmxjbmt1WTNOektDQmxiR1Z0TENCY0lteGxablJjSWlBcE8xeHVYSFJjZEdOaGJHTjFiR0YwWlZCdmMybDBhVzl1SUQwZ0tDQndiM05wZEdsdmJpQTlQVDBnWENKaFluTnZiSFYwWlZ3aUlIeDhJSEJ2YzJsMGFXOXVJRDA5UFNCY0ltWnBlR1ZrWENJZ0tTQW1KbHh1WEhSY2RGeDBLQ0JqZFhKRFUxTlViM0FnS3lCamRYSkRVMU5NWldaMElDa3VhVzVrWlhoUFppaGNJbUYxZEc5Y0lpa2dQaUF0TVR0Y2JseHVYSFJjZEM4dklFNWxaV1FnZEc4Z1ltVWdZV0pzWlNCMGJ5QmpZV3hqZFd4aGRHVWdjRzl6YVhScGIyNGdhV1lnWldsMGFHVnlYRzVjZEZ4MEx5OGdkRzl3SUc5eUlHeGxablFnYVhNZ1lYVjBieUJoYm1RZ2NHOXphWFJwYjI0Z2FYTWdaV2wwYUdWeUlHRmljMjlzZFhSbElHOXlJR1pwZUdWa1hHNWNkRngwYVdZZ0tDQmpZV3hqZFd4aGRHVlFiM05wZEdsdmJpQXBJSHRjYmx4MFhIUmNkR04xY2xCdmMybDBhVzl1SUQwZ1kzVnlSV3hsYlM1d2IzTnBkR2x2YmlncE8xeHVYSFJjZEZ4MFkzVnlWRzl3SUQwZ1kzVnlVRzl6YVhScGIyNHVkRzl3TzF4dVhIUmNkRngwWTNWeVRHVm1kQ0E5SUdOMWNsQnZjMmwwYVc5dUxteGxablE3WEc1Y2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBZM1Z5Vkc5d0lEMGdjR0Z5YzJWR2JHOWhkQ2dnWTNWeVExTlRWRzl3SUNrZ2ZId2dNRHRjYmx4MFhIUmNkR04xY2t4bFpuUWdQU0J3WVhKelpVWnNiMkYwS0NCamRYSkRVMU5NWldaMElDa2dmSHdnTUR0Y2JseDBYSFI5WEc1Y2JseDBYSFJwWmlBb0lHcFJkV1Z5ZVM1cGMwWjFibU4wYVc5dUtDQnZjSFJwYjI1eklDa2dLU0I3WEc1Y2RGeDBYSFJ2Y0hScGIyNXpJRDBnYjNCMGFXOXVjeTVqWVd4c0tDQmxiR1Z0TENCcExDQmpkWEpQWm1aelpYUWdLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUnBaaUFvSUc5d2RHbHZibk11ZEc5d0lDRTlJRzUxYkd3Z0tTQjdYRzVjZEZ4MFhIUndjbTl3Y3k1MGIzQWdQU0FvSUc5d2RHbHZibk11ZEc5d0lDMGdZM1Z5VDJabWMyVjBMblJ2Y0NBcElDc2dZM1Z5Vkc5d08xeHVYSFJjZEgxY2JseDBYSFJwWmlBb0lHOXdkR2x2Ym5NdWJHVm1kQ0FoUFNCdWRXeHNJQ2tnZTF4dVhIUmNkRngwY0hKdmNITXViR1ZtZENBOUlDZ2diM0IwYVc5dWN5NXNaV1owSUMwZ1kzVnlUMlptYzJWMExteGxablFnS1NBcklHTjFja3hsWm5RN1hHNWNkRngwZlZ4dVhHNWNkRngwYVdZZ0tDQmNJblZ6YVc1blhDSWdhVzRnYjNCMGFXOXVjeUFwSUh0Y2JseDBYSFJjZEc5d2RHbHZibk11ZFhOcGJtY3VZMkZzYkNnZ1pXeGxiU3dnY0hKdmNITWdLVHRjYmx4dVhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmpkWEpGYkdWdExtTnpjeWdnY0hKdmNITWdLVHRjYmx4MFhIUjlYRzVjZEgxY2JuMDdYRzVjYm1wUmRXVnllUzVtYmk1bGVIUmxibVFvZTF4dVhIUnZabVp6WlhRNklHWjFibU4wYVc5dUtDQnZjSFJwYjI1eklDa2dlMXh1WEhSY2RHbG1JQ2dnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0FwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJ2Y0hScGIyNXpJRDA5UFNCMWJtUmxabWx1WldRZ1AxeHVYSFJjZEZ4MFhIUjBhR2x6SURwY2JseDBYSFJjZEZ4MGRHaHBjeTVsWVdOb0tHWjFibU4wYVc5dUtDQnBJQ2tnZTF4dVhIUmNkRngwWEhSY2RHcFJkV1Z5ZVM1dlptWnpaWFF1YzJWMFQyWm1jMlYwS0NCMGFHbHpMQ0J2Y0hScGIyNXpMQ0JwSUNrN1hHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RIMWNibHh1WEhSY2RIWmhjaUJrYjJORmJHVnRMQ0IzYVc0c1hHNWNkRngwWEhSbGJHVnRJRDBnZEdocGMxc2dNQ0JkTEZ4dVhIUmNkRngwWW05NElEMGdleUIwYjNBNklEQXNJR3hsWm5RNklEQWdmU3hjYmx4MFhIUmNkR1J2WXlBOUlHVnNaVzBnSmlZZ1pXeGxiUzV2ZDI1bGNrUnZZM1Z0Wlc1ME8xeHVYRzVjZEZ4MGFXWWdLQ0FoWkc5aklDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdU8xeHVYSFJjZEgxY2JseHVYSFJjZEdSdlkwVnNaVzBnUFNCa2IyTXVaRzlqZFcxbGJuUkZiR1Z0Wlc1ME8xeHVYRzVjZEZ4MEx5OGdUV0ZyWlNCemRYSmxJR2wwSjNNZ2JtOTBJR0VnWkdselkyOXVibVZqZEdWa0lFUlBUU0J1YjJSbFhHNWNkRngwYVdZZ0tDQWhhbEYxWlhKNUxtTnZiblJoYVc1ektDQmtiMk5GYkdWdExDQmxiR1Z0SUNrZ0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z1ltOTRPMXh1WEhSY2RIMWNibHh1WEhSY2RDOHZJRk4xY0hCdmNuUTZJRUpzWVdOclFtVnljbmtnTlN3Z2FVOVRJRE1nS0c5eWFXZHBibUZzSUdsUWFHOXVaU2xjYmx4MFhIUXZMeUJKWmlCM1pTQmtiMjRuZENCb1lYWmxJR2RDUTFJc0lHcDFjM1FnZFhObElEQXNNQ0J5WVhSb1pYSWdkR2hoYmlCbGNuSnZjbHh1WEhSY2RHbG1JQ2dnZEhsd1pXOW1JR1ZzWlcwdVoyVjBRbTkxYm1ScGJtZERiR2xsYm5SU1pXTjBJQ0U5UFNCemRISjFibVJsWm1sdVpXUWdLU0I3WEc1Y2RGeDBYSFJpYjNnZ1BTQmxiR1Z0TG1kbGRFSnZkVzVrYVc1blEyeHBaVzUwVW1WamRDZ3BPMXh1WEhSY2RIMWNibHgwWEhSM2FXNGdQU0JuWlhSWGFXNWtiM2NvSUdSdll5QXBPMXh1WEhSY2RISmxkSFZ5YmlCN1hHNWNkRngwWEhSMGIzQTZJR0p2ZUM1MGIzQWdLeUIzYVc0dWNHRm5aVmxQWm1aelpYUWdMU0JrYjJORmJHVnRMbU5zYVdWdWRGUnZjQ3hjYmx4MFhIUmNkR3hsWm5RNklHSnZlQzVzWldaMElDc2dkMmx1TG5CaFoyVllUMlptYzJWMElDMGdaRzlqUld4bGJTNWpiR2xsYm5STVpXWjBYRzVjZEZ4MGZUdGNibHgwZlN4Y2JseHVYSFJ3YjNOcGRHbHZiam9nWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwYVdZZ0tDQWhkR2hwYzFzZ01DQmRJQ2tnZTF4dVhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RIMWNibHh1WEhSY2RIWmhjaUJ2Wm1aelpYUlFZWEpsYm5Rc0lHOW1abk5sZEN4Y2JseDBYSFJjZEdWc1pXMGdQU0IwYUdseld5QXdJRjBzWEc1Y2RGeDBYSFJ3WVhKbGJuUlBabVp6WlhRZ1BTQjdJSFJ2Y0RvZ01Dd2diR1ZtZERvZ01DQjlPMXh1WEc1Y2RGeDBMeThnUm1sNFpXUWdaV3hsYldWdWRITWdZWEpsSUc5bVpuTmxkQ0JtY205dElIZHBibVJ2ZHlBb2NHRnlaVzUwVDJabWMyVjBJRDBnZTNSdmNEb3dMQ0JzWldaME9pQXdmU3dnWW1WallYVnpaU0JwZENCcGN5QnBkSE1nYjI1c2VTQnZabVp6WlhRZ2NHRnlaVzUwWEc1Y2RGeDBhV1lnS0NCcVVYVmxjbmt1WTNOektDQmxiR1Z0TENCY0luQnZjMmwwYVc5dVhDSWdLU0E5UFQwZ1hDSm1hWGhsWkZ3aUlDa2dlMXh1WEhSY2RGeDBMeThnUVhOemRXMWxJR2RsZEVKdmRXNWthVzVuUTJ4cFpXNTBVbVZqZENCcGN5QjBhR1Z5WlNCM2FHVnVJR052YlhCMWRHVmtJSEJ2YzJsMGFXOXVJR2x6SUdacGVHVmtYRzVjZEZ4MFhIUnZabVp6WlhRZ1BTQmxiR1Z0TG1kbGRFSnZkVzVrYVc1blEyeHBaVzUwVW1WamRDZ3BPMXh1WEc1Y2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RDOHZJRWRsZENBcWNtVmhiQ29nYjJabWMyVjBVR0Z5Wlc1MFhHNWNkRngwWEhSdlptWnpaWFJRWVhKbGJuUWdQU0IwYUdsekxtOW1abk5sZEZCaGNtVnVkQ2dwTzF4dVhHNWNkRngwWEhRdkx5QkhaWFFnWTI5eWNtVmpkQ0J2Wm1aelpYUnpYRzVjZEZ4MFhIUnZabVp6WlhRZ1BTQjBhR2x6TG05bVpuTmxkQ2dwTzF4dVhIUmNkRngwYVdZZ0tDQWhhbEYxWlhKNUxtNXZaR1ZPWVcxbEtDQnZabVp6WlhSUVlYSmxiblJiSURBZ1hTd2dYQ0pvZEcxc1hDSWdLU0FwSUh0Y2JseDBYSFJjZEZ4MGNHRnlaVzUwVDJabWMyVjBJRDBnYjJabWMyVjBVR0Z5Wlc1MExtOW1abk5sZENncE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJCWkdRZ2IyWm1jMlYwVUdGeVpXNTBJR0p2Y21SbGNuTmNibHgwWEhSY2RIQmhjbVZ1ZEU5bVpuTmxkQzUwYjNBZ0t6MGdhbEYxWlhKNUxtTnpjeWdnYjJabWMyVjBVR0Z5Wlc1MFd5QXdJRjBzSUZ3aVltOXlaR1Z5Vkc5d1YybGtkR2hjSWl3Z2RISjFaU0FwTzF4dVhIUmNkRngwY0dGeVpXNTBUMlptYzJWMExteGxablFnS3owZ2FsRjFaWEo1TG1OemN5Z2diMlptYzJWMFVHRnlaVzUwV3lBd0lGMHNJRndpWW05eVpHVnlUR1ZtZEZkcFpIUm9YQ0lzSUhSeWRXVWdLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUXZMeUJUZFdKMGNtRmpkQ0J3WVhKbGJuUWdiMlptYzJWMGN5QmhibVFnWld4bGJXVnVkQ0J0WVhKbmFXNXpYRzVjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEhSdmNEb2diMlptYzJWMExuUnZjQ0F0SUhCaGNtVnVkRTltWm5ObGRDNTBiM0FnTFNCcVVYVmxjbmt1WTNOektDQmxiR1Z0TENCY0ltMWhjbWRwYmxSdmNGd2lMQ0IwY25WbElDa3NYRzVjZEZ4MFhIUnNaV1owT2lCdlptWnpaWFF1YkdWbWRDQXRJSEJoY21WdWRFOW1abk5sZEM1c1pXWjBJQzBnYWxGMVpYSjVMbU56Y3lnZ1pXeGxiU3dnWENKdFlYSm5hVzVNWldaMFhDSXNJSFJ5ZFdVZ0tWeHVYSFJjZEgwN1hHNWNkSDBzWEc1Y2JseDBiMlptYzJWMFVHRnlaVzUwT2lCbWRXNWpkR2x2YmlncElIdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NXRZWEFvWm5WdVkzUnBiMjRvS1NCN1hHNWNkRngwWEhSMllYSWdiMlptYzJWMFVHRnlaVzUwSUQwZ2RHaHBjeTV2Wm1aelpYUlFZWEpsYm5RZ2ZId2daRzlqUld4bGJUdGNibHh1WEhSY2RGeDBkMmhwYkdVZ0tDQnZabVp6WlhSUVlYSmxiblFnSmlZZ0tDQWhhbEYxWlhKNUxtNXZaR1ZPWVcxbEtDQnZabVp6WlhSUVlYSmxiblFzSUZ3aWFIUnRiRndpSUNrZ0ppWWdhbEYxWlhKNUxtTnpjeWdnYjJabWMyVjBVR0Z5Wlc1MExDQmNJbkJ2YzJsMGFXOXVYQ0lnS1NBOVBUMGdYQ0p6ZEdGMGFXTmNJaUFwSUNrZ2UxeHVYSFJjZEZ4MFhIUnZabVp6WlhSUVlYSmxiblFnUFNCdlptWnpaWFJRWVhKbGJuUXViMlptYzJWMFVHRnlaVzUwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnYjJabWMyVjBVR0Z5Wlc1MElIeDhJR1J2WTBWc1pXMDdYRzVjZEZ4MGZTazdYRzVjZEgxY2JuMHBPMXh1WEc0dkx5QkRjbVZoZEdVZ2MyTnliMnhzVEdWbWRDQmhibVFnYzJOeWIyeHNWRzl3SUcxbGRHaHZaSE5jYm1wUmRXVnllUzVsWVdOb0tDQjdJSE5qY205c2JFeGxablE2SUZ3aWNHRm5aVmhQWm1aelpYUmNJaXdnYzJOeWIyeHNWRzl3T2lCY0luQmhaMlZaVDJabWMyVjBYQ0lnZlN3Z1puVnVZM1JwYjI0b0lHMWxkR2h2WkN3Z2NISnZjQ0FwSUh0Y2JseDBkbUZ5SUhSdmNDQTlJRndpY0dGblpWbFBabVp6WlhSY0lpQTlQVDBnY0hKdmNEdGNibHh1WEhScVVYVmxjbmt1Wm01YklHMWxkR2h2WkNCZElEMGdablZ1WTNScGIyNG9JSFpoYkNBcElIdGNibHgwWEhSeVpYUjFjbTRnWVdOalpYTnpLQ0IwYUdsekxDQm1kVzVqZEdsdmJpZ2daV3hsYlN3Z2JXVjBhRzlrTENCMllXd2dLU0I3WEc1Y2RGeDBYSFIyWVhJZ2QybHVJRDBnWjJWMFYybHVaRzkzS0NCbGJHVnRJQ2s3WEc1Y2JseDBYSFJjZEdsbUlDZ2dkbUZzSUQwOVBTQjFibVJsWm1sdVpXUWdLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIzYVc0Z1B5QjNhVzViSUhCeWIzQWdYU0E2SUdWc1pXMWJJRzFsZEdodlpDQmRPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJwWmlBb0lIZHBiaUFwSUh0Y2JseDBYSFJjZEZ4MGQybHVMbk5qY205c2JGUnZLRnh1WEhSY2RGeDBYSFJjZENGMGIzQWdQeUIyWVd3Z09pQjNhVzVrYjNjdWNHRm5aVmhQWm1aelpYUXNYRzVjZEZ4MFhIUmNkRngwZEc5d0lEOGdkbUZzSURvZ2QybHVaRzkzTG5CaFoyVlpUMlptYzJWMFhHNWNkRngwWEhSY2RDazdYRzVjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkR1ZzWlcxYklHMWxkR2h2WkNCZElEMGdkbUZzTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDBzSUcxbGRHaHZaQ3dnZG1Gc0xDQmhjbWQxYldWdWRITXViR1Z1WjNSb0xDQnVkV3hzSUNrN1hHNWNkSDA3WEc1OUtUdGNibHh1THk4Z1UzVndjRzl5ZERvZ1UyRm1ZWEpwUERjckxDQkRhSEp2YldVOE16Y3JYRzR2THlCQlpHUWdkR2hsSUhSdmNDOXNaV1owSUdOemMwaHZiMnR6SUhWemFXNW5JR3BSZFdWeWVTNW1iaTV3YjNOcGRHbHZibHh1THk4Z1YyVmlhMmwwSUdKMVp6b2dhSFIwY0hNNkx5OWlkV2R6TG5kbFltdHBkQzV2Y21jdmMyaHZkMTlpZFdjdVkyZHBQMmxrUFRJNU1EZzBYRzR2THlCQ2JHbHVheUJpZFdjNklHaDBkSEJ6T2k4dlkyOWtaUzVuYjI5bmJHVXVZMjl0TDNBdlkyaHliMjFwZFcwdmFYTnpkV1Z6TDJSbGRHRnBiRDlwWkQweU1qa3lPREJjYmk4dklHZGxkRU52YlhCMWRHVmtVM1I1YkdVZ2NtVjBkWEp1Y3lCd1pYSmpaVzUwSUhkb1pXNGdjM0JsWTJsbWFXVmtJR1p2Y2lCMGIzQXZiR1ZtZEM5aWIzUjBiMjB2Y21sbmFIUTdYRzR2THlCeVlYUm9aWElnZEdoaGJpQnRZV3RsSUhSb1pTQmpjM01nYlc5a2RXeGxJR1JsY0dWdVpDQnZiaUIwYUdVZ2IyWm1jMlYwSUcxdlpIVnNaU3dnYW5WemRDQmphR1ZqYXlCbWIzSWdhWFFnYUdWeVpWeHVhbEYxWlhKNUxtVmhZMmdvSUZzZ1hDSjBiM0JjSWl3Z1hDSnNaV1owWENJZ1hTd2dablZ1WTNScGIyNG9JR2tzSUhCeWIzQWdLU0I3WEc1Y2RHcFJkV1Z5ZVM1amMzTkliMjlyYzFzZ2NISnZjQ0JkSUQwZ1lXUmtSMlYwU0c5dmEwbG1LQ0J6ZFhCd2IzSjBMbkJwZUdWc1VHOXphWFJwYjI0c1hHNWNkRngwWm5WdVkzUnBiMjRvSUdWc1pXMHNJR052YlhCMWRHVmtJQ2tnZTF4dVhIUmNkRngwYVdZZ0tDQmpiMjF3ZFhSbFpDQXBJSHRjYmx4MFhIUmNkRngwWTI5dGNIVjBaV1FnUFNCamRYSkRVMU1vSUdWc1pXMHNJSEJ5YjNBZ0tUdGNibHgwWEhSY2RGeDBMeThnU1dZZ1kzVnlRMU5USUhKbGRIVnlibk1nY0dWeVkyVnVkR0ZuWlN3Z1ptRnNiR0poWTJzZ2RHOGdiMlptYzJWMFhHNWNkRngwWEhSY2RISmxkSFZ5YmlCeWJuVnRibTl1Y0hndWRHVnpkQ2dnWTI5dGNIVjBaV1FnS1NBL1hHNWNkRngwWEhSY2RGeDBhbEYxWlhKNUtDQmxiR1Z0SUNrdWNHOXphWFJwYjI0b0tWc2djSEp2Y0NCZElDc2dYQ0p3ZUZ3aUlEcGNibHgwWEhSY2RGeDBYSFJqYjIxd2RYUmxaRHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlYRzVjZENrN1hHNTlLVHRjYmx4dVhHNHZMeUJEY21WaGRHVWdhVzV1WlhKSVpXbG5hSFFzSUdsdWJtVnlWMmxrZEdnc0lHaGxhV2RvZEN3Z2QybGtkR2dzSUc5MWRHVnlTR1ZwWjJoMElHRnVaQ0J2ZFhSbGNsZHBaSFJvSUcxbGRHaHZaSE5jYm1wUmRXVnllUzVsWVdOb0tDQjdJRWhsYVdkb2REb2dYQ0pvWldsbmFIUmNJaXdnVjJsa2RHZzZJRndpZDJsa2RHaGNJaUI5TENCbWRXNWpkR2x2YmlnZ2JtRnRaU3dnZEhsd1pTQXBJSHRjYmx4MGFsRjFaWEo1TG1WaFkyZ29JSHNnY0dGa1pHbHVaem9nWENKcGJtNWxjbHdpSUNzZ2JtRnRaU3dnWTI5dWRHVnVkRG9nZEhsd1pTd2dYQ0pjSWpvZ1hDSnZkWFJsY2x3aUlDc2dibUZ0WlNCOUxDQm1kVzVqZEdsdmJpZ2daR1ZtWVhWc2RFVjRkSEpoTENCbWRXNWpUbUZ0WlNBcElIdGNibHgwWEhRdkx5Qk5ZWEpuYVc0Z2FYTWdiMjVzZVNCbWIzSWdiM1YwWlhKSVpXbG5hSFFzSUc5MWRHVnlWMmxrZEdoY2JseDBYSFJxVVhWbGNua3VabTViSUdaMWJtTk9ZVzFsSUYwZ1BTQm1kVzVqZEdsdmJpZ2diV0Z5WjJsdUxDQjJZV3gxWlNBcElIdGNibHgwWEhSY2RIWmhjaUJqYUdGcGJtRmliR1VnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUNZbUlDZ2daR1ZtWVhWc2RFVjRkSEpoSUh4OElIUjVjR1Z2WmlCdFlYSm5hVzRnSVQwOUlGd2lZbTl2YkdWaGJsd2lJQ2tzWEc1Y2RGeDBYSFJjZEdWNGRISmhJRDBnWkdWbVlYVnNkRVY0ZEhKaElIeDhJQ2dnYldGeVoybHVJRDA5UFNCMGNuVmxJSHg4SUhaaGJIVmxJRDA5UFNCMGNuVmxJRDhnWENKdFlYSm5hVzVjSWlBNklGd2lZbTl5WkdWeVhDSWdLVHRjYmx4dVhIUmNkRngwY21WMGRYSnVJR0ZqWTJWemN5Z2dkR2hwY3l3Z1puVnVZM1JwYjI0b0lHVnNaVzBzSUhSNWNHVXNJSFpoYkhWbElDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ1pHOWpPMXh1WEc1Y2RGeDBYSFJjZEdsbUlDZ2dhbEYxWlhKNUxtbHpWMmx1Wkc5M0tDQmxiR1Z0SUNrZ0tTQjdYRzVjZEZ4MFhIUmNkRngwTHk4Z1FYTWdiMllnTlM4NEx6SXdNVElnZEdocGN5QjNhV3hzSUhscFpXeGtJR2x1WTI5eWNtVmpkQ0J5WlhOMWJIUnpJR1p2Y2lCTmIySnBiR1VnVTJGbVlYSnBMQ0JpZFhRZ2RHaGxjbVZjYmx4MFhIUmNkRngwWEhRdkx5QnBjMjRuZENCaElIZG9iMnhsSUd4dmRDQjNaU0JqWVc0Z1pHOHVJRk5sWlNCd2RXeHNJSEpsY1hWbGMzUWdZWFFnZEdocGN5QlZVa3dnWm05eUlHUnBjMk4xYzNOcGIyNDZYRzVjZEZ4MFhIUmNkRngwTHk4Z2FIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwycHhkV1Z5ZVM5cWNYVmxjbmt2Y0hWc2JDODNOalJjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnWld4bGJTNWtiMk4xYldWdWRDNWtiMk4xYldWdWRFVnNaVzFsYm5SYklGd2lZMnhwWlc1MFhDSWdLeUJ1WVcxbElGMDdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhRdkx5QkhaWFFnWkc5amRXMWxiblFnZDJsa2RHZ2diM0lnYUdWcFoyaDBYRzVjZEZ4MFhIUmNkR2xtSUNnZ1pXeGxiUzV1YjJSbFZIbHdaU0E5UFQwZ09TQXBJSHRjYmx4MFhIUmNkRngwWEhSa2IyTWdQU0JsYkdWdExtUnZZM1Z0Wlc1MFJXeGxiV1Z1ZER0Y2JseHVYSFJjZEZ4MFhIUmNkQzh2SUVWcGRHaGxjaUJ6WTNKdmJHeGJWMmxrZEdndlNHVnBaMmgwWFNCdmNpQnZabVp6WlhSYlYybGtkR2d2U0dWcFoyaDBYU0J2Y2lCamJHbGxiblJiVjJsa2RHZ3ZTR1ZwWjJoMFhTeGNibHgwWEhSY2RGeDBYSFF2THlCM2FHbGphR1YyWlhJZ2FYTWdaM0psWVhSbGMzUmNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdUV0YwYUM1dFlYZ29YRzVjZEZ4MFhIUmNkRngwWEhSbGJHVnRMbUp2WkhsYklGd2ljMk55YjJ4c1hDSWdLeUJ1WVcxbElGMHNJR1J2WTFzZ1hDSnpZM0p2Ykd4Y0lpQXJJRzVoYldVZ1hTeGNibHgwWEhSY2RGeDBYSFJjZEdWc1pXMHVZbTlrZVZzZ1hDSnZabVp6WlhSY0lpQXJJRzVoYldVZ1hTd2daRzlqV3lCY0ltOW1abk5sZEZ3aUlDc2dibUZ0WlNCZExGeHVYSFJjZEZ4MFhIUmNkRngwWkc5ald5QmNJbU5zYVdWdWRGd2lJQ3NnYm1GdFpTQmRYRzVjZEZ4MFhIUmNkRngwS1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjJZV3gxWlNBOVBUMGdkVzVrWldacGJtVmtJRDljYmx4MFhIUmNkRngwWEhRdkx5QkhaWFFnZDJsa2RHZ2diM0lnYUdWcFoyaDBJRzl1SUhSb1pTQmxiR1Z0Wlc1MExDQnlaWEYxWlhOMGFXNW5JR0oxZENCdWIzUWdabTl5WTJsdVp5QndZWEp6WlVac2IyRjBYRzVjZEZ4MFhIUmNkRngwYWxGMVpYSjVMbU56Y3lnZ1pXeGxiU3dnZEhsd1pTd2daWGgwY21FZ0tTQTZYRzVjYmx4MFhIUmNkRngwWEhRdkx5QlRaWFFnZDJsa2RHZ2diM0lnYUdWcFoyaDBJRzl1SUhSb1pTQmxiR1Z0Wlc1MFhHNWNkRngwWEhSY2RGeDBhbEYxWlhKNUxuTjBlV3hsS0NCbGJHVnRMQ0IwZVhCbExDQjJZV3gxWlN3Z1pYaDBjbUVnS1R0Y2JseDBYSFJjZEgwc0lIUjVjR1VzSUdOb1lXbHVZV0pzWlNBL0lHMWhjbWRwYmlBNklIVnVaR1ZtYVc1bFpDd2dZMmhoYVc1aFlteGxMQ0J1ZFd4c0lDazdYRzVjZEZ4MGZUdGNibHgwZlNrN1hHNTlLVHRjYmx4dVhHNHZMeUJVYUdVZ2JuVnRZbVZ5SUc5bUlHVnNaVzFsYm5SeklHTnZiblJoYVc1bFpDQnBiaUIwYUdVZ2JXRjBZMmhsWkNCbGJHVnRaVzUwSUhObGRGeHVhbEYxWlhKNUxtWnVMbk5wZW1VZ1BTQm1kVzVqZEdsdmJpZ3BJSHRjYmx4MGNtVjBkWEp1SUhSb2FYTXViR1Z1WjNSb08xeHVmVHRjYmx4dWFsRjFaWEo1TG1adUxtRnVaRk5sYkdZZ1BTQnFVWFZsY25rdVptNHVZV1JrUW1GamF6dGNibHh1WEc1Y2JseHVMeThnVW1WbmFYTjBaWElnWVhNZ1lTQnVZVzFsWkNCQlRVUWdiVzlrZFd4bExDQnphVzVqWlNCcVVYVmxjbmtnWTJGdUlHSmxJR052Ym1OaGRHVnVZWFJsWkNCM2FYUm9JRzkwYUdWeVhHNHZMeUJtYVd4bGN5QjBhR0YwSUcxaGVTQjFjMlVnWkdWbWFXNWxMQ0JpZFhRZ2JtOTBJSFpwWVNCaElIQnliM0JsY2lCamIyNWpZWFJsYm1GMGFXOXVJSE5qY21sd2RDQjBhR0YwWEc0dkx5QjFibVJsY25OMFlXNWtjeUJoYm05dWVXMXZkWE1nUVUxRUlHMXZaSFZzWlhNdUlFRWdibUZ0WldRZ1FVMUVJR2x6SUhOaFptVnpkQ0JoYm1RZ2JXOXpkQ0J5YjJKMWMzUmNiaTh2SUhkaGVTQjBieUJ5WldkcGMzUmxjaTRnVEc5M1pYSmpZWE5sSUdweGRXVnllU0JwY3lCMWMyVmtJR0psWTJGMWMyVWdRVTFFSUcxdlpIVnNaU0J1WVcxbGN5QmhjbVZjYmk4dklHUmxjbWwyWldRZ1puSnZiU0JtYVd4bElHNWhiV1Z6TENCaGJtUWdhbEYxWlhKNUlHbHpJRzV2Y20xaGJHeDVJR1JsYkdsMlpYSmxaQ0JwYmlCaElHeHZkMlZ5WTJGelpWeHVMeThnWm1sc1pTQnVZVzFsTGlCRWJ5QjBhR2x6SUdGbWRHVnlJR055WldGMGFXNW5JSFJvWlNCbmJHOWlZV3dnYzI4Z2RHaGhkQ0JwWmlCaGJpQkJUVVFnYlc5a2RXeGxJSGRoYm5SelhHNHZMeUIwYnlCallXeHNJRzV2UTI5dVpteHBZM1FnZEc4Z2FHbGtaU0IwYUdseklIWmxjbk5wYjI0Z2IyWWdhbEYxWlhKNUxDQnBkQ0IzYVd4c0lIZHZjbXN1WEc1Y2JpOHZJRTV2ZEdVZ2RHaGhkQ0JtYjNJZ2JXRjRhVzExYlNCd2IzSjBZV0pwYkdsMGVTd2diR2xpY21GeWFXVnpJSFJvWVhRZ1lYSmxJRzV2ZENCcVVYVmxjbmtnYzJodmRXeGtYRzR2THlCa1pXTnNZWEpsSUhSb1pXMXpaV3gyWlhNZ1lYTWdZVzV2Ym5sdGIzVnpJRzF2WkhWc1pYTXNJR0Z1WkNCaGRtOXBaQ0J6WlhSMGFXNW5JR0VnWjJ4dlltRnNJR2xtSUdGdVhHNHZMeUJCVFVRZ2JHOWhaR1Z5SUdseklIQnlaWE5sYm5RdUlHcFJkV1Z5ZVNCcGN5QmhJSE53WldOcFlXd2dZMkZ6WlM0Z1JtOXlJRzF2Y21VZ2FXNW1iM0p0WVhScGIyNHNJSE5sWlZ4dUx5OGdhSFIwY0hNNkx5OW5hWFJvZFdJdVkyOXRMMnB5WW5WeWEyVXZjbVZ4ZFdseVpXcHpMM2RwYTJrdlZYQmtZWFJwYm1jdFpYaHBjM1JwYm1jdGJHbGljbUZ5YVdWekkzZHBhMmt0WVc1dmJseHVYRzVwWmlBb0lIUjVjR1Z2WmlCa1pXWnBibVVnUFQwOUlGd2lablZ1WTNScGIyNWNJaUFtSmlCa1pXWnBibVV1WVcxa0lDa2dlMXh1WEhSa1pXWnBibVVvSUZ3aWFuRjFaWEo1WENJc0lGdGRMQ0JtZFc1amRHbHZiaWdwSUh0Y2JseDBYSFJ5WlhSMWNtNGdhbEYxWlhKNU8xeHVYSFI5S1R0Y2JuMWNibHh1WEc1Y2JseHVkbUZ5WEc1Y2RDOHZJRTFoY0NCdmRtVnlJR3BSZFdWeWVTQnBiaUJqWVhObElHOW1JRzkyWlhKM2NtbDBaVnh1WEhSZmFsRjFaWEo1SUQwZ2QybHVaRzkzTG1wUmRXVnllU3hjYmx4dVhIUXZMeUJOWVhBZ2IzWmxjaUIwYUdVZ0pDQnBiaUJqWVhObElHOW1JRzkyWlhKM2NtbDBaVnh1WEhSZkpDQTlJSGRwYm1SdmR5NGtPMXh1WEc1cVVYVmxjbmt1Ym05RGIyNW1iR2xqZENBOUlHWjFibU4wYVc5dUtDQmtaV1Z3SUNrZ2UxeHVYSFJwWmlBb0lIZHBibVJ2ZHk0a0lEMDlQU0JxVVhWbGNua2dLU0I3WEc1Y2RGeDBkMmx1Wkc5M0xpUWdQU0JmSkR0Y2JseDBmVnh1WEc1Y2RHbG1JQ2dnWkdWbGNDQW1KaUIzYVc1a2IzY3VhbEYxWlhKNUlEMDlQU0JxVVhWbGNua2dLU0I3WEc1Y2RGeDBkMmx1Wkc5M0xtcFJkV1Z5ZVNBOUlGOXFVWFZsY25rN1hHNWNkSDFjYmx4dVhIUnlaWFIxY200Z2FsRjFaWEo1TzF4dWZUdGNibHh1THk4Z1JYaHdiM05sSUdwUmRXVnllU0JoYm1RZ0pDQnBaR1Z1ZEdsbWFXVnljeXdnWlhabGJpQnBiaUJCVFVSY2JpOHZJQ2dqTnpFd01pTmpiMjF0Wlc1ME9qRXdMQ0JvZEhSd2N6b3ZMMmRwZEdoMVlpNWpiMjB2YW5GMVpYSjVMMnB4ZFdWeWVTOXdkV3hzTHpVMU55bGNiaTh2SUdGdVpDQkRiMjF0YjI1S1V5Qm1iM0lnWW5KdmQzTmxjaUJsYlhWc1lYUnZjbk1nS0NNeE16VTJOaWxjYm1sbUlDZ2dkSGx3Wlc5bUlHNXZSMnh2WW1Gc0lEMDlQU0J6ZEhKMWJtUmxabWx1WldRZ0tTQjdYRzVjZEhkcGJtUnZkeTVxVVhWbGNua2dQU0IzYVc1a2IzY3VKQ0E5SUdwUmRXVnllVHRjYm4xY2JseHVYRzVjYmx4dWNtVjBkWEp1SUdwUmRXVnllVHRjYmx4dWZTa3BPMXh1SWl3aWRtRnlJR0poYzJWSmJtUmxlRTltSUQwZ2NtVnhkV2x5WlNnbkxpNHZhVzUwWlhKdVlXd3ZZbUZ6WlVsdVpHVjRUMlluS1N4Y2JpQWdJQ0JpYVc1aGNubEpibVJsZUNBOUlISmxjWFZwY21Vb0p5NHVMMmx1ZEdWeWJtRnNMMkpwYm1GeWVVbHVaR1Y0SnlrN1hHNWNiaThxSUU1aGRHbDJaU0J0WlhSb2IyUWdjbVZtWlhKbGJtTmxjeUJtYjNJZ2RHaHZjMlVnZDJsMGFDQjBhR1VnYzJGdFpTQnVZVzFsSUdGeklHOTBhR1Z5SUdCc2IyUmhjMmhnSUcxbGRHaHZaSE11SUNvdlhHNTJZWElnYm1GMGFYWmxUV0Y0SUQwZ1RXRjBhQzV0WVhnN1hHNWNiaThxS2x4dUlDb2dSMlYwY3lCMGFHVWdhVzVrWlhnZ1lYUWdkMmhwWTJnZ2RHaGxJR1pwY25OMElHOWpZM1Z5Y21WdVkyVWdiMllnWUhaaGJIVmxZQ0JwY3lCbWIzVnVaQ0JwYmlCZ1lYSnlZWGxnWEc0Z0tpQjFjMmx1WnlCZ1UyRnRaVlpoYkhWbFdtVnliMkFnWm05eUlHVnhkV0ZzYVhSNUlHTnZiWEJoY21semIyNXpMaUJKWmlCZ1puSnZiVWx1WkdWNFlDQnBjeUJ1WldkaGRHbDJaU3hjYmlBcUlHbDBJR2x6SUhWelpXUWdZWE1nZEdobElHOW1abk5sZENCbWNtOXRJSFJvWlNCbGJtUWdiMllnWUdGeWNtRjVZQzRnU1dZZ1lHRnljbUY1WUNCcGN5QnpiM0owWldSY2JpQXFJSEJ5YjNacFpHbHVaeUJnZEhKMVpXQWdabTl5SUdCbWNtOXRTVzVrWlhoZ0lIQmxjbVp2Y20xeklHRWdabUZ6ZEdWeUlHSnBibUZ5ZVNCelpXRnlZMmd1WEc0Z0tseHVJQ29nS2lwT2IzUmxPaW9xSUZ0Z1UyRnRaVlpoYkhWbFdtVnliMkJkS0doMGRIQnpPaTh2Y0dWdmNHeGxMbTF2ZW1sc2JHRXViM0puTDM1cWIzSmxibVJ2Y21abUwyVnpOaTFrY21GbWRDNW9kRzFzSTNObFl5MXpZVzFsZG1Gc2RXVjZaWEp2S1Z4dUlDb2dZMjl0Y0dGeWFYTnZibk1nWVhKbElHeHBhMlVnYzNSeWFXTjBJR1Z4ZFdGc2FYUjVJR052YlhCaGNtbHpiMjV6TENCbExtY3VJR0E5UFQxZ0xDQmxlR05sY0hRZ2RHaGhkRnh1SUNvZ1lFNWhUbUFnYldGMFkyaGxjeUJnVG1GT1lDNWNiaUFxWEc0Z0tpQkFjM1JoZEdsalhHNGdLaUJBYldWdFltVnlUMllnWDF4dUlDb2dRR05oZEdWbmIzSjVJRUZ5Y21GNVhHNGdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQmhjbkpoZVNCVWFHVWdZWEp5WVhrZ2RHOGdjMlZoY21Ob0xseHVJQ29nUUhCaGNtRnRJSHNxZlNCMllXeDFaU0JVYUdVZ2RtRnNkV1VnZEc4Z2MyVmhjbU5vSUdadmNpNWNiaUFxSUVCd1lYSmhiU0I3WW05dmJHVmhibnh1ZFcxaVpYSjlJRnRtY205dFNXNWtaWGc5TUYwZ1ZHaGxJR2x1WkdWNElIUnZJSE5sWVhKamFDQm1jbTl0SUc5eUlHQjBjblZsWUZ4dUlDb2dJSFJ2SUhCbGNtWnZjbTBnWVNCaWFXNWhjbmtnYzJWaGNtTm9JRzl1SUdFZ2MyOXlkR1ZrSUdGeWNtRjVMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UyNTFiV0psY24wZ1VtVjBkWEp1Y3lCMGFHVWdhVzVrWlhnZ2IyWWdkR2hsSUcxaGRHTm9aV1FnZG1Gc2RXVXNJR1ZzYzJVZ1lDMHhZQzVjYmlBcUlFQmxlR0Z0Y0d4bFhHNGdLbHh1SUNvZ1h5NXBibVJsZUU5bUtGc3hMQ0F5TENBeExDQXlYU3dnTWlrN1hHNGdLaUF2THlBOVBpQXhYRzRnS2x4dUlDb2dMeThnZFhOcGJtY2dZR1p5YjIxSmJtUmxlR0JjYmlBcUlGOHVhVzVrWlhoUFppaGJNU3dnTWl3Z01Td2dNbDBzSURJc0lESXBPMXh1SUNvZ0x5OGdQVDRnTTF4dUlDcGNiaUFxSUM4dklIQmxjbVp2Y20xcGJtY2dZU0JpYVc1aGNua2djMlZoY21Ob1hHNGdLaUJmTG1sdVpHVjRUMllvV3pFc0lERXNJRElzSURKZExDQXlMQ0IwY25WbEtUdGNiaUFxSUM4dklEMCtJREpjYmlBcUwxeHVablZ1WTNScGIyNGdhVzVrWlhoUFppaGhjbkpoZVN3Z2RtRnNkV1VzSUdaeWIyMUpibVJsZUNrZ2UxeHVJQ0IyWVhJZ2JHVnVaM1JvSUQwZ1lYSnlZWGtnUHlCaGNuSmhlUzVzWlc1bmRHZ2dPaUF3TzF4dUlDQnBaaUFvSVd4bGJtZDBhQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQXRNVHRjYmlBZ2ZWeHVJQ0JwWmlBb2RIbHdaVzltSUdaeWIyMUpibVJsZUNBOVBTQW5iblZ0WW1WeUp5a2dlMXh1SUNBZ0lHWnliMjFKYm1SbGVDQTlJR1p5YjIxSmJtUmxlQ0E4SURBZ1B5QnVZWFJwZG1WTllYZ29iR1Z1WjNSb0lDc2dabkp2YlVsdVpHVjRMQ0F3S1NBNklHWnliMjFKYm1SbGVEdGNiaUFnZlNCbGJITmxJR2xtSUNobWNtOXRTVzVrWlhncElIdGNiaUFnSUNCMllYSWdhVzVrWlhnZ1BTQmlhVzVoY25sSmJtUmxlQ2hoY25KaGVTd2dkbUZzZFdVcExGeHVJQ0FnSUNBZ0lDQnZkR2hsY2lBOUlHRnljbUY1VzJsdVpHVjRYVHRjYmx4dUlDQWdJR2xtSUNoMllXeDFaU0E5UFQwZ2RtRnNkV1VnUHlBb2RtRnNkV1VnUFQwOUlHOTBhR1Z5S1NBNklDaHZkR2hsY2lBaFBUMGdiM1JvWlhJcEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2FXNWtaWGc3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlBdE1UdGNiaUFnZlZ4dUlDQnlaWFIxY200Z1ltRnpaVWx1WkdWNFQyWW9ZWEp5WVhrc0lIWmhiSFZsTENCbWNtOXRTVzVrWlhnZ2ZId2dNQ2s3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdhVzVrWlhoUFpqdGNiaUlzSW5aaGNpQk1ZWHA1VjNKaGNIQmxjaUE5SUhKbGNYVnBjbVVvSnk0dUwybHVkR1Z5Ym1Gc0wweGhlbmxYY21Gd2NHVnlKeWtzWEc0Z0lDQWdURzlrWVhOb1YzSmhjSEJsY2lBOUlISmxjWFZwY21Vb0p5NHVMMmx1ZEdWeWJtRnNMMHh2WkdGemFGZHlZWEJ3WlhJbktTeGNiaUFnSUNCaVlYTmxURzlrWVhOb0lEMGdjbVZ4ZFdseVpTZ25MaTR2YVc1MFpYSnVZV3d2WW1GelpVeHZaR0Z6YUNjcExGeHVJQ0FnSUdselFYSnlZWGtnUFNCeVpYRjFhWEpsS0NjdUxpOXNZVzVuTDJselFYSnlZWGtuS1N4Y2JpQWdJQ0JwYzA5aWFtVmpkRXhwYTJVZ1BTQnlaWEYxYVhKbEtDY3VMaTlwYm5SbGNtNWhiQzlwYzA5aWFtVmpkRXhwYTJVbktTeGNiaUFnSUNCM2NtRndjR1Z5UTJ4dmJtVWdQU0J5WlhGMWFYSmxLQ2N1TGk5cGJuUmxjbTVoYkM5M2NtRndjR1Z5UTJ4dmJtVW5LVHRjYmx4dUx5b3FJRlZ6WldRZ1ptOXlJRzVoZEdsMlpTQnRaWFJvYjJRZ2NtVm1aWEpsYm1ObGN5NGdLaTljYm5aaGNpQnZZbXBsWTNSUWNtOTBieUE5SUU5aWFtVmpkQzV3Y205MGIzUjVjR1U3WEc1Y2JpOHFLaUJWYzJWa0lIUnZJR05vWldOcklHOWlhbVZqZEhNZ1ptOXlJRzkzYmlCd2NtOXdaWEowYVdWekxpQXFMMXh1ZG1GeUlHaGhjMDkzYmxCeWIzQmxjblI1SUQwZ2IySnFaV04wVUhKdmRHOHVhR0Z6VDNkdVVISnZjR1Z5ZEhrN1hHNWNiaThxS2x4dUlDb2dRM0psWVhSbGN5QmhJR0JzYjJSaGMyaGdJRzlpYW1WamRDQjNhR2xqYUNCM2NtRndjeUJnZG1Gc2RXVmdJSFJ2SUdWdVlXSnNaU0JwYlhCc2FXTnBkQ0JqYUdGcGJtbHVaeTVjYmlBcUlFMWxkR2h2WkhNZ2RHaGhkQ0J2Y0dWeVlYUmxJRzl1SUdGdVpDQnlaWFIxY200Z1lYSnlZWGx6TENCamIyeHNaV04wYVc5dWN5d2dZVzVrSUdaMWJtTjBhVzl1Y3lCallXNWNiaUFxSUdKbElHTm9ZV2x1WldRZ2RHOW5aWFJvWlhJdUlFMWxkR2h2WkhNZ2RHaGhkQ0J5WlhSMWNtNGdZU0JpYjI5c1pXRnVJRzl5SUhOcGJtZHNaU0IyWVd4MVpTQjNhV3hzWEc0Z0tpQmhkWFJ2YldGMGFXTmhiR3g1SUdWdVpDQjBhR1VnWTJoaGFXNGdjbVYwZFhKdWFXNW5JSFJvWlNCMWJuZHlZWEJ3WldRZ2RtRnNkV1V1SUVWNGNHeHBZMmwwSUdOb1lXbHVhVzVuWEc0Z0tpQnRZWGtnWW1VZ1pXNWhZbXhsWkNCMWMybHVaeUJnWHk1amFHRnBibUF1SUZSb1pTQmxlR1ZqZFhScGIyNGdiMllnWTJoaGFXNWxaQ0J0WlhSb2IyUnpJR2x6SUd4aGVua3NYRzRnS2lCMGFHRjBJR2x6TENCbGVHVmpkWFJwYjI0Z2FYTWdaR1ZtWlhKeVpXUWdkVzUwYVd3Z1lGOGpkbUZzZFdWZ0lHbHpJR2x0Y0d4cFkybDBiSGtnYjNJZ1pYaHdiR2xqYVhSc2VWeHVJQ29nWTJGc2JHVmtMbHh1SUNwY2JpQXFJRXhoZW5rZ1pYWmhiSFZoZEdsdmJpQmhiR3h2ZDNNZ2MyVjJaWEpoYkNCdFpYUm9iMlJ6SUhSdklITjFjSEJ2Y25RZ2MyaHZjblJqZFhRZ1puVnphVzl1TGlCVGFHOXlkR04xZEZ4dUlDb2dablZ6YVc5dUlHbHpJR0Z1SUc5d2RHbHRhWHBoZEdsdmJpQjBhR0YwSUcxbGNtZGxjeUJwZEdWeVlYUmxaWE1nZEc4Z1lYWnZhV1FnWTNKbFlYUnBibWNnYVc1MFpYSnRaV1JwWVhSbFhHNGdLaUJoY25KaGVYTWdZVzVrSUhKbFpIVmpaU0IwYUdVZ2JuVnRZbVZ5SUc5bUlHbDBaWEpoZEdWbElHVjRaV04xZEdsdmJuTXVYRzRnS2x4dUlDb2dRMmhoYVc1cGJtY2dhWE1nYzNWd2NHOXlkR1ZrSUdsdUlHTjFjM1J2YlNCaWRXbHNaSE1nWVhNZ2JHOXVaeUJoY3lCMGFHVWdZRjhqZG1Gc2RXVmdJRzFsZEdodlpDQnBjMXh1SUNvZ1pHbHlaV04wYkhrZ2IzSWdhVzVrYVhKbFkzUnNlU0JwYm1Oc2RXUmxaQ0JwYmlCMGFHVWdZblZwYkdRdVhHNGdLbHh1SUNvZ1NXNGdZV1JrYVhScGIyNGdkRzhnYkc5a1lYTm9JRzFsZEdodlpITXNJSGR5WVhCd1pYSnpJR2hoZG1VZ1lFRnljbUY1WUNCaGJtUWdZRk4wY21sdVoyQWdiV1YwYUc5a2N5NWNiaUFxWEc0Z0tpQlVhR1VnZDNKaGNIQmxjaUJnUVhKeVlYbGdJRzFsZEdodlpITWdZWEpsT2x4dUlDb2dZR052Ym1OaGRHQXNJR0JxYjJsdVlDd2dZSEJ2Y0dBc0lHQndkWE5vWUN3Z1lISmxkbVZ5YzJWZ0xDQmdjMmhwWm5SZ0xDQmdjMnhwWTJWZ0xDQmdjMjl5ZEdBc1hHNGdLaUJnYzNCc2FXTmxZQ3dnWVc1a0lHQjFibk5vYVdaMFlGeHVJQ3BjYmlBcUlGUm9aU0IzY21Gd2NHVnlJR0JUZEhKcGJtZGdJRzFsZEdodlpITWdZWEpsT2x4dUlDb2dZSEpsY0d4aFkyVmdJR0Z1WkNCZ2MzQnNhWFJnWEc0Z0tseHVJQ29nVkdobElIZHlZWEJ3WlhJZ2JXVjBhRzlrY3lCMGFHRjBJSE4xY0hCdmNuUWdjMmh2Y25SamRYUWdablZ6YVc5dUlHRnlaVHBjYmlBcUlHQmpiMjF3WVdOMFlDd2dZR1J5YjNCZ0xDQmdaSEp2Y0ZKcFoyaDBZQ3dnWUdSeWIzQlNhV2RvZEZkb2FXeGxZQ3dnWUdSeWIzQlhhR2xzWldBc0lHQm1hV3gwWlhKZ0xGeHVJQ29nWUdacGNuTjBZQ3dnWUdsdWFYUnBZV3hnTENCZ2JHRnpkR0FzSUdCdFlYQmdMQ0JnY0d4MVkydGdMQ0JnY21WcVpXTjBZQ3dnWUhKbGMzUmdMQ0JnY21WMlpYSnpaV0FzWEc0Z0tpQmdjMnhwWTJWZ0xDQmdkR0ZyWldBc0lHQjBZV3RsVW1sbmFIUmdMQ0JnZEdGclpWSnBaMmgwVjJocGJHVmdMQ0JnZEdGclpWZG9hV3hsWUN3Z1lIUnZRWEp5WVhsZ0xGeHVJQ29nWVc1a0lHQjNhR1Z5WldCY2JpQXFYRzRnS2lCVWFHVWdZMmhoYVc1aFlteGxJSGR5WVhCd1pYSWdiV1YwYUc5a2N5QmhjbVU2WEc0Z0tpQmdZV1owWlhKZ0xDQmdZWEo1WUN3Z1lHRnpjMmxuYm1Bc0lHQmhkR0FzSUdCaVpXWnZjbVZnTENCZ1ltbHVaR0FzSUdCaWFXNWtRV3hzWUN3Z1lHSnBibVJMWlhsZ0xGeHVJQ29nWUdOaGJHeGlZV05yWUN3Z1lHTm9ZV2x1WUN3Z1lHTm9kVzVyWUN3Z1lHTnZiVzFwZEdBc0lHQmpiMjF3WVdOMFlDd2dZR052Ym1OaGRHQXNJR0JqYjI1emRHRnVkR0FzWEc0Z0tpQmdZMjkxYm5SQ2VXQXNJR0JqY21WaGRHVmdMQ0JnWTNWeWNubGdMQ0JnWkdWaWIzVnVZMlZnTENCZ1pHVm1ZWFZzZEhOZ0xDQmdaR1ZtWlhKZ0xDQmdaR1ZzWVhsZ0xGeHVJQ29nWUdScFptWmxjbVZ1WTJWZ0xDQmdaSEp2Y0dBc0lHQmtjbTl3VW1sbmFIUmdMQ0JnWkhKdmNGSnBaMmgwVjJocGJHVmdMQ0JnWkhKdmNGZG9hV3hsWUN3Z1lHWnBiR3hnTEZ4dUlDb2dZR1pwYkhSbGNtQXNJR0JtYkdGMGRHVnVZQ3dnWUdac1lYUjBaVzVFWldWd1lDd2dZR1pzYjNkZ0xDQmdabXh2ZDFKcFoyaDBZQ3dnWUdadmNrVmhZMmhnTEZ4dUlDb2dZR1p2Y2tWaFkyaFNhV2RvZEdBc0lHQm1iM0pKYm1Bc0lHQm1iM0pKYmxKcFoyaDBZQ3dnWUdadmNrOTNibUFzSUdCbWIzSlBkMjVTYVdkb2RHQXNJR0JtZFc1amRHbHZibk5nTEZ4dUlDb2dZR2R5YjNWd1FubGdMQ0JnYVc1a1pYaENlV0FzSUdCcGJtbDBhV0ZzWUN3Z1lHbHVkR1Z5YzJWamRHbHZibUFzSUdCcGJuWmxjblJnTENCZ2FXNTJiMnRsWUN3Z1lHdGxlWE5nTEZ4dUlDb2dZR3RsZVhOSmJtQXNJR0J0WVhCZ0xDQmdiV0Z3Vm1Gc2RXVnpZQ3dnWUcxaGRHTm9aWE5nTENCZ2JXRjBZMmhsYzFCeWIzQmxjblI1WUN3Z1lHMWxiVzlwZW1WZ0xDQmdiV1Z5WjJWZ0xGeHVJQ29nWUcxcGVHbHVZQ3dnWUc1bFoyRjBaV0FzSUdCdWIyOXdZQ3dnWUc5dGFYUmdMQ0JnYjI1alpXQXNJR0J3WVdseWMyQXNJR0J3WVhKMGFXRnNZQ3dnWUhCaGNuUnBZV3hTYVdkb2RHQXNYRzRnS2lCZ2NHRnlkR2wwYVc5dVlDd2dZSEJwWTJ0Z0xDQmdjR3hoYm5SZ0xDQmdjR3gxWTJ0Z0xDQmdjSEp2Y0dWeWRIbGdMQ0JnY0hKdmNHVnlkSGxQWm1Bc0lHQndkV3hzWUN4Y2JpQXFJR0J3ZFd4c1FYUmdMQ0JnY0hWemFHQXNJR0J5WVc1blpXQXNJR0J5WldGeVoyQXNJR0J5WldwbFkzUmdMQ0JnY21WdGIzWmxZQ3dnWUhKbGMzUmdMQ0JnY21WMlpYSnpaV0FzWEc0Z0tpQmdjMmgxWm1ac1pXQXNJR0J6YkdsalpXQXNJR0J6YjNKMFlDd2dZSE52Y25SQ2VXQXNJR0J6YjNKMFFubEJiR3hnTENCZ2MyOXlkRUo1VDNKa1pYSmdMQ0JnYzNCc2FXTmxZQ3hjYmlBcUlHQnpjSEpsWVdSZ0xDQmdkR0ZyWldBc0lHQjBZV3RsVW1sbmFIUmdMQ0JnZEdGclpWSnBaMmgwVjJocGJHVmdMQ0JnZEdGclpWZG9hV3hsWUN3Z1lIUmhjR0FzWEc0Z0tpQmdkR2h5YjNSMGJHVmdMQ0JnZEdoeWRXQXNJR0IwYVcxbGMyQXNJR0IwYjBGeWNtRjVZQ3dnWUhSdlVHeGhhVzVQWW1wbFkzUmdMQ0JnZEhKaGJuTm1iM0p0WUN4Y2JpQXFJR0IxYm1sdmJtQXNJR0IxYm1seFlDd2dZSFZ1YzJocFpuUmdMQ0JnZFc1NmFYQmdMQ0JnZG1Gc2RXVnpZQ3dnWUhaaGJIVmxjMGx1WUN3Z1lIZG9aWEpsWUN4Y2JpQXFJR0IzYVhSb2IzVjBZQ3dnWUhkeVlYQmdMQ0JnZUc5eVlDd2dZSHBwY0dBc0lHRnVaQ0JnZW1sd1QySnFaV04wWUZ4dUlDcGNiaUFxSUZSb1pTQjNjbUZ3Y0dWeUlHMWxkR2h2WkhNZ2RHaGhkQ0JoY21VZ0tpcHViM1FxS2lCamFHRnBibUZpYkdVZ1lua2daR1ZtWVhWc2RDQmhjbVU2WEc0Z0tpQmdZV1JrWUN3Z1lHRjBkR1Z0Y0hSZ0xDQmdZMkZ0Wld4RFlYTmxZQ3dnWUdOaGNHbDBZV3hwZW1WZ0xDQmdZMnh2Ym1WZ0xDQmdZMnh2Ym1WRVpXVndZQ3dnWUdSbFluVnljbUFzWEc0Z0tpQmdaVzVrYzFkcGRHaGdMQ0JnWlhOallYQmxZQ3dnWUdWelkyRndaVkpsWjBWNGNHQXNJR0JsZG1WeWVXQXNJR0JtYVc1a1lDd2dZR1pwYm1SSmJtUmxlR0FzSUdCbWFXNWtTMlY1WUN4Y2JpQXFJR0JtYVc1a1RHRnpkR0FzSUdCbWFXNWtUR0Z6ZEVsdVpHVjRZQ3dnWUdacGJtUk1ZWE4wUzJWNVlDd2dZR1pwYm1SWGFHVnlaV0FzSUdCbWFYSnpkR0FzSUdCb1lYTmdMRnh1SUNvZ1lHbGtaVzUwYVhSNVlDd2dZR2x1WTJ4MVpHVnpZQ3dnWUdsdVpHVjRUMlpnTENCZ2FXNVNZVzVuWldBc0lHQnBjMEZ5WjNWdFpXNTBjMkFzSUdCcGMwRnljbUY1WUN4Y2JpQXFJR0JwYzBKdmIyeGxZVzVnTENCZ2FYTkVZWFJsWUN3Z1lHbHpSV3hsYldWdWRHQXNJR0JwYzBWdGNIUjVZQ3dnWUdselJYRjFZV3hnTENCZ2FYTkZjbkp2Y21Bc1hHNGdLaUJnYVhOR2FXNXBkR1ZnTEdCcGMwWjFibU4wYVc5dVlDd2dZR2x6VFdGMFkyaGdMQ0JnYVhOT1lYUnBkbVZnTENCZ2FYTk9ZVTVnTENCZ2FYTk9kV3hzWUN3Z1lHbHpUblZ0WW1WeVlDeGNiaUFxSUdCcGMwOWlhbVZqZEdBc0lHQnBjMUJzWVdsdVQySnFaV04wWUN3Z1lHbHpVbVZuUlhod1lDd2dZR2x6VTNSeWFXNW5ZQ3dnWUdselZXNWtaV1pwYm1Wa1lDeGNiaUFxSUdCcGMxUjVjR1ZrUVhKeVlYbGdMQ0JnYW05cGJtQXNJR0JyWldKaFlrTmhjMlZnTENCZ2JHRnpkR0FzSUdCc1lYTjBTVzVrWlhoUFptQXNJR0J0WVhoZ0xDQmdiV2x1WUN4Y2JpQXFJR0J1YjBOdmJtWnNhV04wWUN3Z1lHNXZkMkFzSUdCd1lXUmdMQ0JnY0dGa1RHVm1kR0FzSUdCd1lXUlNhV2RvZEdBc0lHQndZWEp6WlVsdWRHQXNJR0J3YjNCZ0xGeHVJQ29nWUhKaGJtUnZiV0FzSUdCeVpXUjFZMlZnTENCZ2NtVmtkV05sVW1sbmFIUmdMQ0JnY21Wd1pXRjBZQ3dnWUhKbGMzVnNkR0FzSUdCeWRXNUpia052Ym5SbGVIUmdMRnh1SUNvZ1lITm9hV1owWUN3Z1lITnBlbVZnTENCZ2MyNWhhMlZEWVhObFlDd2dZSE52YldWZ0xDQmdjMjl5ZEdWa1NXNWtaWGhnTENCZ2MyOXlkR1ZrVEdGemRFbHVaR1Y0WUN4Y2JpQXFJR0J6ZEdGeWRFTmhjMlZnTENCZ2MzUmhjblJ6VjJsMGFHQXNJR0J6ZFcxZ0xDQmdkR1Z0Y0d4aGRHVmdMQ0JnZEhKcGJXQXNJR0IwY21sdFRHVm1kR0FzWEc0Z0tpQmdkSEpwYlZKcFoyaDBZQ3dnWUhSeWRXNWpZQ3dnWUhWdVpYTmpZWEJsWUN3Z1lIVnVhWEYxWlVsa1lDd2dZSFpoYkhWbFlDd2dZVzVrSUdCM2IzSmtjMkJjYmlBcVhHNGdLaUJVYUdVZ2QzSmhjSEJsY2lCdFpYUm9iMlFnWUhOaGJYQnNaV0FnZDJsc2JDQnlaWFIxY200Z1lTQjNjbUZ3Y0dWa0lIWmhiSFZsSUhkb1pXNGdZRzVnSUdseklIQnliM1pwWkdWa0xGeHVJQ29nYjNSb1pYSjNhWE5sSUdGdUlIVnVkM0poY0hCbFpDQjJZV3gxWlNCcGN5QnlaWFIxY201bFpDNWNiaUFxWEc0Z0tpQkFibUZ0WlNCZlhHNGdLaUJBWTI5dWMzUnlkV04wYjNKY2JpQXFJRUJqWVhSbFoyOXllU0JEYUdGcGJseHVJQ29nUUhCaGNtRnRJSHNxZlNCMllXeDFaU0JVYUdVZ2RtRnNkV1VnZEc4Z2QzSmhjQ0JwYmlCaElHQnNiMlJoYzJoZ0lHbHVjM1JoYm1ObExseHVJQ29nUUhKbGRIVnlibk1nZTA5aWFtVmpkSDBnVW1WMGRYSnVjeUIwYUdVZ2JtVjNJR0JzYjJSaGMyaGdJSGR5WVhCd1pYSWdhVzV6ZEdGdVkyVXVYRzRnS2lCQVpYaGhiWEJzWlZ4dUlDcGNiaUFxSUhaaGNpQjNjbUZ3Y0dWa0lEMGdYeWhiTVN3Z01pd2dNMTBwTzF4dUlDcGNiaUFxSUM4dklISmxkSFZ5Ym5NZ1lXNGdkVzUzY21Gd2NHVmtJSFpoYkhWbFhHNGdLaUIzY21Gd2NHVmtMbkpsWkhWalpTaG1kVzVqZEdsdmJpaHpkVzBzSUc0cElIdGNiaUFxSUNBZ2NtVjBkWEp1SUhOMWJTQXJJRzQ3WEc0Z0tpQjlLVHRjYmlBcUlDOHZJRDArSURaY2JpQXFYRzRnS2lBdkx5QnlaWFIxY201eklHRWdkM0poY0hCbFpDQjJZV3gxWlZ4dUlDb2dkbUZ5SUhOeGRXRnlaWE1nUFNCM2NtRndjR1ZrTG0xaGNDaG1kVzVqZEdsdmJpaHVLU0I3WEc0Z0tpQWdJSEpsZEhWeWJpQnVJQ29nYmp0Y2JpQXFJSDBwTzF4dUlDcGNiaUFxSUY4dWFYTkJjbkpoZVNoemNYVmhjbVZ6S1R0Y2JpQXFJQzh2SUQwK0lHWmhiSE5sWEc0Z0tseHVJQ29nWHk1cGMwRnljbUY1S0hOeGRXRnlaWE11ZG1Gc2RXVW9LU2s3WEc0Z0tpQXZMeUE5UGlCMGNuVmxYRzRnS2k5Y2JtWjFibU4wYVc5dUlHeHZaR0Z6YUNoMllXeDFaU2tnZTF4dUlDQnBaaUFvYVhOUFltcGxZM1JNYVd0bEtIWmhiSFZsS1NBbUppQWhhWE5CY25KaGVTaDJZV3gxWlNrZ0ppWWdJU2gyWVd4MVpTQnBibk4wWVc1alpXOW1JRXhoZW5sWGNtRndjR1Z5S1NrZ2UxeHVJQ0FnSUdsbUlDaDJZV3gxWlNCcGJuTjBZVzVqWlc5bUlFeHZaR0Z6YUZkeVlYQndaWElwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUIyWVd4MVpUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tHaGhjMDkzYmxCeWIzQmxjblI1TG1OaGJHd29kbUZzZFdVc0lDZGZYMk5vWVdsdVgxOG5LU0FtSmlCb1lYTlBkMjVRY205d1pYSjBlUzVqWVd4c0tIWmhiSFZsTENBblgxOTNjbUZ3Y0dWa1gxOG5LU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSGR5WVhCd1pYSkRiRzl1WlNoMllXeDFaU2s3WEc0Z0lDQWdmVnh1SUNCOVhHNGdJSEpsZEhWeWJpQnVaWGNnVEc5a1lYTm9WM0poY0hCbGNpaDJZV3gxWlNrN1hHNTlYRzVjYmk4dklFVnVjM1Z5WlNCM2NtRndjR1Z5Y3lCaGNtVWdhVzV6ZEdGdVkyVnpJRzltSUdCaVlYTmxURzlrWVhOb1lDNWNibXh2WkdGemFDNXdjbTkwYjNSNWNHVWdQU0JpWVhObFRHOWtZWE5vTG5CeWIzUnZkSGx3WlR0Y2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQnNiMlJoYzJnN1hHNGlMQ0oyWVhJZ1ltRnpaVVZoWTJnZ1BTQnlaWEYxYVhKbEtDY3VMaTlwYm5SbGNtNWhiQzlpWVhObFJXRmphQ2NwTEZ4dUlDQWdJR055WldGMFpVWnBibVFnUFNCeVpYRjFhWEpsS0NjdUxpOXBiblJsY201aGJDOWpjbVZoZEdWR2FXNWtKeWs3WEc1Y2JpOHFLbHh1SUNvZ1NYUmxjbUYwWlhNZ2IzWmxjaUJsYkdWdFpXNTBjeUJ2WmlCZ1kyOXNiR1ZqZEdsdmJtQXNJSEpsZEhWeWJtbHVaeUIwYUdVZ1ptbHljM1FnWld4bGJXVnVkRnh1SUNvZ1lIQnlaV1JwWTJGMFpXQWdjbVYwZFhKdWN5QjBjblYwYUhrZ1ptOXlMaUJVYUdVZ2NISmxaR2xqWVhSbElHbHpJR0p2ZFc1a0lIUnZJR0IwYUdselFYSm5ZQ0JoYm1SY2JpQXFJR2x1ZG05clpXUWdkMmwwYUNCMGFISmxaU0JoY21kMWJXVnVkSE02SUNoMllXeDFaU3dnYVc1a1pYaDhhMlY1TENCamIyeHNaV04wYVc5dUtTNWNiaUFxWEc0Z0tpQkpaaUJoSUhCeWIzQmxjblI1SUc1aGJXVWdhWE1nY0hKdmRtbGtaV1FnWm05eUlHQndjbVZrYVdOaGRHVmdJSFJvWlNCamNtVmhkR1ZrSUdCZkxuQnliM0JsY25SNVlGeHVJQ29nYzNSNWJHVWdZMkZzYkdKaFkyc2djbVYwZFhKdWN5QjBhR1VnY0hKdmNHVnlkSGtnZG1Gc2RXVWdiMllnZEdobElHZHBkbVZ1SUdWc1pXMWxiblF1WEc0Z0tseHVJQ29nU1dZZ1lTQjJZV3gxWlNCcGN5QmhiSE52SUhCeWIzWnBaR1ZrSUdadmNpQmdkR2hwYzBGeVoyQWdkR2hsSUdOeVpXRjBaV1FnWUY4dWJXRjBZMmhsYzFCeWIzQmxjblI1WUZ4dUlDb2djM1I1YkdVZ1kyRnNiR0poWTJzZ2NtVjBkWEp1Y3lCZ2RISjFaV0FnWm05eUlHVnNaVzFsYm5SeklIUm9ZWFFnYUdGMlpTQmhJRzFoZEdOb2FXNW5JSEJ5YjNCbGNuUjVYRzRnS2lCMllXeDFaU3dnWld4elpTQmdabUZzYzJWZ0xseHVJQ3BjYmlBcUlFbG1JR0Z1SUc5aWFtVmpkQ0JwY3lCd2NtOTJhV1JsWkNCbWIzSWdZSEJ5WldScFkyRjBaV0FnZEdobElHTnlaV0YwWldRZ1lGOHViV0YwWTJobGMyQWdjM1I1YkdWY2JpQXFJR05oYkd4aVlXTnJJSEpsZEhWeWJuTWdZSFJ5ZFdWZ0lHWnZjaUJsYkdWdFpXNTBjeUIwYUdGMElHaGhkbVVnZEdobElIQnliM0JsY25ScFpYTWdiMllnZEdobElHZHBkbVZ1WEc0Z0tpQnZZbXBsWTNRc0lHVnNjMlVnWUdaaGJITmxZQzVjYmlBcVhHNGdLaUJBYzNSaGRHbGpYRzRnS2lCQWJXVnRZbVZ5VDJZZ1gxeHVJQ29nUUdGc2FXRnpJR1JsZEdWamRGeHVJQ29nUUdOaGRHVm5iM0o1SUVOdmJHeGxZM1JwYjI1Y2JpQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOFQySnFaV04wZkhOMGNtbHVaMzBnWTI5c2JHVmpkR2x2YmlCVWFHVWdZMjlzYkdWamRHbHZiaUIwYnlCelpXRnlZMmd1WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZFOWlhbVZqZEh4emRISnBibWQ5SUZ0d2NtVmthV05oZEdVOVh5NXBaR1Z1ZEdsMGVWMGdWR2hsSUdaMWJtTjBhVzl1SUdsdWRtOXJaV1JjYmlBcUlDQndaWElnYVhSbGNtRjBhVzl1TGx4dUlDb2dRSEJoY21GdElIc3FmU0JiZEdocGMwRnlaMTBnVkdobElHQjBhR2x6WUNCaWFXNWthVzVuSUc5bUlHQndjbVZrYVdOaGRHVmdMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2V5cDlJRkpsZEhWeWJuTWdkR2hsSUcxaGRHTm9aV1FnWld4bGJXVnVkQ3dnWld4elpTQmdkVzVrWldacGJtVmtZQzVjYmlBcUlFQmxlR0Z0Y0d4bFhHNGdLbHh1SUNvZ2RtRnlJSFZ6WlhKeklEMGdXMXh1SUNvZ0lDQjdJQ2QxYzJWeUp6b2dKMkpoY201bGVTY3NJQ0FuWVdkbEp6b2dNellzSUNkaFkzUnBkbVVuT2lCMGNuVmxJSDBzWEc0Z0tpQWdJSHNnSjNWelpYSW5PaUFuWm5KbFpDY3NJQ0FnSUNkaFoyVW5PaUEwTUN3Z0oyRmpkR2wyWlNjNklHWmhiSE5sSUgwc1hHNGdLaUFnSUhzZ0ozVnpaWEluT2lBbmNHVmlZbXhsY3ljc0lDZGhaMlVuT2lBeExDQWdKMkZqZEdsMlpTYzZJSFJ5ZFdVZ2ZWeHVJQ29nWFR0Y2JpQXFYRzRnS2lCZkxuSmxjM1ZzZENoZkxtWnBibVFvZFhObGNuTXNJR1oxYm1OMGFXOXVLR05vY2lrZ2UxeHVJQ29nSUNCeVpYUjFjbTRnWTJoeUxtRm5aU0E4SURRd08xeHVJQ29nZlNrc0lDZDFjMlZ5SnlrN1hHNGdLaUF2THlBOVBpQW5ZbUZ5Ym1WNUoxeHVJQ3BjYmlBcUlDOHZJSFZ6YVc1bklIUm9aU0JnWHk1dFlYUmphR1Z6WUNCallXeHNZbUZqYXlCemFHOXlkR2hoYm1SY2JpQXFJRjh1Y21WemRXeDBLRjh1Wm1sdVpDaDFjMlZ5Y3l3Z2V5QW5ZV2RsSnpvZ01Td2dKMkZqZEdsMlpTYzZJSFJ5ZFdVZ2ZTa3NJQ2QxYzJWeUp5azdYRzRnS2lBdkx5QTlQaUFuY0dWaVlteGxjeWRjYmlBcVhHNGdLaUF2THlCMWMybHVaeUIwYUdVZ1lGOHViV0YwWTJobGMxQnliM0JsY25SNVlDQmpZV3hzWW1GamF5QnphRzl5ZEdoaGJtUmNiaUFxSUY4dWNtVnpkV3gwS0Y4dVptbHVaQ2gxYzJWeWN5d2dKMkZqZEdsMlpTY3NJR1poYkhObEtTd2dKM1Z6WlhJbktUdGNiaUFxSUM4dklEMCtJQ2RtY21Wa0oxeHVJQ3BjYmlBcUlDOHZJSFZ6YVc1bklIUm9aU0JnWHk1d2NtOXdaWEowZVdBZ1kyRnNiR0poWTJzZ2MyaHZjblJvWVc1a1hHNGdLaUJmTG5KbGMzVnNkQ2hmTG1acGJtUW9kWE5sY25Nc0lDZGhZM1JwZG1VbktTd2dKM1Z6WlhJbktUdGNiaUFxSUM4dklEMCtJQ2RpWVhKdVpYa25YRzRnS2k5Y2JuWmhjaUJtYVc1a0lEMGdZM0psWVhSbFJtbHVaQ2hpWVhObFJXRmphQ2s3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1ptbHVaRHRjYmlJc0luWmhjaUJoY25KaGVVVmhZMmdnUFNCeVpYRjFhWEpsS0NjdUxpOXBiblJsY201aGJDOWhjbkpoZVVWaFkyZ25LU3hjYmlBZ0lDQmlZWE5sUldGamFDQTlJSEpsY1hWcGNtVW9KeTR1TDJsdWRHVnlibUZzTDJKaGMyVkZZV05vSnlrc1hHNGdJQ0FnWTNKbFlYUmxSbTl5UldGamFDQTlJSEpsY1hWcGNtVW9KeTR1TDJsdWRHVnlibUZzTDJOeVpXRjBaVVp2Y2tWaFkyZ25LVHRjYmx4dUx5b3FYRzRnS2lCSmRHVnlZWFJsY3lCdmRtVnlJR1ZzWlcxbGJuUnpJRzltSUdCamIyeHNaV04wYVc5dVlDQnBiblp2YTJsdVp5QmdhWFJsY21GMFpXVmdJR1p2Y2lCbFlXTm9JR1ZzWlcxbGJuUXVYRzRnS2lCVWFHVWdZR2wwWlhKaGRHVmxZQ0JwY3lCaWIzVnVaQ0IwYnlCZ2RHaHBjMEZ5WjJBZ1lXNWtJR2x1ZG05clpXUWdkMmwwYUNCMGFISmxaU0JoY21kMWJXVnVkSE02WEc0Z0tpQW9kbUZzZFdVc0lHbHVaR1Y0Zkd0bGVTd2dZMjlzYkdWamRHbHZiaWt1SUVsMFpYSmhkRzl5SUdaMWJtTjBhVzl1Y3lCdFlYa2daWGhwZENCcGRHVnlZWFJwYjI0Z1pXRnliSGxjYmlBcUlHSjVJR1Y0Y0d4cFkybDBiSGtnY21WMGRYSnVhVzVuSUdCbVlXeHpaV0F1WEc0Z0tseHVJQ29nS2lwT2IzUmxPaW9xSUVGeklIZHBkR2dnYjNSb1pYSWdYQ0pEYjJ4c1pXTjBhVzl1YzF3aUlHMWxkR2h2WkhNc0lHOWlhbVZqZEhNZ2QybDBhQ0JoSUdCc1pXNW5kR2hnSUhCeWIzQmxjblI1WEc0Z0tpQmhjbVVnYVhSbGNtRjBaV1FnYkdsclpTQmhjbkpoZVhNdUlGUnZJR0YyYjJsa0lIUm9hWE1nWW1Wb1lYWnBiM0lnWUY4dVptOXlTVzVnSUc5eUlHQmZMbVp2Y2s5M2JtQmNiaUFxSUcxaGVTQmlaU0IxYzJWa0lHWnZjaUJ2WW1wbFkzUWdhWFJsY21GMGFXOXVMbHh1SUNwY2JpQXFJRUJ6ZEdGMGFXTmNiaUFxSUVCdFpXMWlaWEpQWmlCZlhHNGdLaUJBWVd4cFlYTWdaV0ZqYUZ4dUlDb2dRR05oZEdWbmIzSjVJRU52Ykd4bFkzUnBiMjVjYmlBcUlFQndZWEpoYlNCN1FYSnlZWGw4VDJKcVpXTjBmSE4wY21sdVozMGdZMjlzYkdWamRHbHZiaUJVYUdVZ1kyOXNiR1ZqZEdsdmJpQjBieUJwZEdWeVlYUmxJRzkyWlhJdVhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JiYVhSbGNtRjBaV1U5WHk1cFpHVnVkR2wwZVYwZ1ZHaGxJR1oxYm1OMGFXOXVJR2x1ZG05clpXUWdjR1Z5SUdsMFpYSmhkR2x2Ymk1Y2JpQXFJRUJ3WVhKaGJTQjdLbjBnVzNSb2FYTkJjbWRkSUZSb1pTQmdkR2hwYzJBZ1ltbHVaR2x1WnlCdlppQmdhWFJsY21GMFpXVmdMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UwRnljbUY1ZkU5aWFtVmpkSHh6ZEhKcGJtZDlJRkpsZEhWeWJuTWdZR052Ykd4bFkzUnBiMjVnTGx4dUlDb2dRR1Y0WVcxd2JHVmNiaUFxWEc0Z0tpQmZLRnN4TENBeVhTa3VabTl5UldGamFDaG1kVzVqZEdsdmJpaHVLU0I3WEc0Z0tpQWdJR052Ym5OdmJHVXViRzluS0c0cE8xeHVJQ29nZlNrdWRtRnNkV1VvS1R0Y2JpQXFJQzh2SUQwK0lHeHZaM01nWldGamFDQjJZV3gxWlNCbWNtOXRJR3hsWm5RZ2RHOGdjbWxuYUhRZ1lXNWtJSEpsZEhWeWJuTWdkR2hsSUdGeWNtRjVYRzRnS2x4dUlDb2dYeTVtYjNKRllXTm9LSHNnSjJFbk9pQXhMQ0FuWWljNklESWdmU3dnWm5WdVkzUnBiMjRvYml3Z2EyVjVLU0I3WEc0Z0tpQWdJR052Ym5OdmJHVXViRzluS0c0c0lHdGxlU2s3WEc0Z0tpQjlLVHRjYmlBcUlDOHZJRDArSUd4dlozTWdaV0ZqYUNCMllXeDFaUzFyWlhrZ2NHRnBjaUJoYm1RZ2NtVjBkWEp1Y3lCMGFHVWdiMkpxWldOMElDaHBkR1Z5WVhScGIyNGdiM0prWlhJZ2FYTWdibTkwSUdkMVlYSmhiblJsWldRcFhHNGdLaTljYm5aaGNpQm1iM0pGWVdOb0lEMGdZM0psWVhSbFJtOXlSV0ZqYUNoaGNuSmhlVVZoWTJnc0lHSmhjMlZGWVdOb0tUdGNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JtYjNKRllXTm9PMXh1SWl3aWRtRnlJR0Z5Y21GNVRXRndJRDBnY21WeGRXbHlaU2duTGk0dmFXNTBaWEp1WVd3dllYSnlZWGxOWVhBbktTeGNiaUFnSUNCaVlYTmxRMkZzYkdKaFkyc2dQU0J5WlhGMWFYSmxLQ2N1TGk5cGJuUmxjbTVoYkM5aVlYTmxRMkZzYkdKaFkyc25LU3hjYmlBZ0lDQmlZWE5sVFdGd0lEMGdjbVZ4ZFdseVpTZ25MaTR2YVc1MFpYSnVZV3d2WW1GelpVMWhjQ2NwTEZ4dUlDQWdJR2x6UVhKeVlYa2dQU0J5WlhGMWFYSmxLQ2N1TGk5c1lXNW5MMmx6UVhKeVlYa25LVHRjYmx4dUx5b3FYRzRnS2lCRGNtVmhkR1Z6SUdGdUlHRnljbUY1SUc5bUlIWmhiSFZsY3lCaWVTQnlkVzV1YVc1bklHVmhZMmdnWld4bGJXVnVkQ0JwYmlCZ1kyOXNiR1ZqZEdsdmJtQWdkR2h5YjNWbmFGeHVJQ29nWUdsMFpYSmhkR1ZsWUM0Z1ZHaGxJR0JwZEdWeVlYUmxaV0FnYVhNZ1ltOTFibVFnZEc4Z1lIUm9hWE5CY21kZ0lHRnVaQ0JwYm5admEyVmtJSGRwZEdnZ2RHaHlaV1ZjYmlBcUlHRnlaM1Z0Wlc1MGN6b2dLSFpoYkhWbExDQnBibVJsZUh4clpYa3NJR052Ykd4bFkzUnBiMjRwTGx4dUlDcGNiaUFxSUVsbUlHRWdjSEp2Y0dWeWRIa2dibUZ0WlNCcGN5QndjbTkyYVdSbFpDQm1iM0lnWUdsMFpYSmhkR1ZsWUNCMGFHVWdZM0psWVhSbFpDQmdYeTV3Y205d1pYSjBlV0JjYmlBcUlITjBlV3hsSUdOaGJHeGlZV05ySUhKbGRIVnlibk1nZEdobElIQnliM0JsY25SNUlIWmhiSFZsSUc5bUlIUm9aU0JuYVhabGJpQmxiR1Z0Wlc1MExseHVJQ3BjYmlBcUlFbG1JR0VnZG1Gc2RXVWdhWE1nWVd4emJ5QndjbTkyYVdSbFpDQm1iM0lnWUhSb2FYTkJjbWRnSUhSb1pTQmpjbVZoZEdWa0lHQmZMbTFoZEdOb1pYTlFjbTl3WlhKMGVXQmNiaUFxSUhOMGVXeGxJR05oYkd4aVlXTnJJSEpsZEhWeWJuTWdZSFJ5ZFdWZ0lHWnZjaUJsYkdWdFpXNTBjeUIwYUdGMElHaGhkbVVnWVNCdFlYUmphR2x1WnlCd2NtOXdaWEowZVZ4dUlDb2dkbUZzZFdVc0lHVnNjMlVnWUdaaGJITmxZQzVjYmlBcVhHNGdLaUJKWmlCaGJpQnZZbXBsWTNRZ2FYTWdjSEp2ZG1sa1pXUWdabTl5SUdCcGRHVnlZWFJsWldBZ2RHaGxJR055WldGMFpXUWdZRjh1YldGMFkyaGxjMkFnYzNSNWJHVmNiaUFxSUdOaGJHeGlZV05ySUhKbGRIVnlibk1nWUhSeWRXVmdJR1p2Y2lCbGJHVnRaVzUwY3lCMGFHRjBJR2hoZG1VZ2RHaGxJSEJ5YjNCbGNuUnBaWE1nYjJZZ2RHaGxJR2RwZG1WdVhHNGdLaUJ2WW1wbFkzUXNJR1ZzYzJVZ1lHWmhiSE5sWUM1Y2JpQXFYRzRnS2lCTllXNTVJR3h2WkdGemFDQnRaWFJvYjJSeklHRnlaU0JuZFdGeVpHVmtJSFJ2SUhkdmNtc2dZWE1nYVc1MFpYSmhkR1ZsY3lCbWIzSWdiV1YwYUc5a2N5QnNhV3RsWEc0Z0tpQmdYeTVsZG1WeWVXQXNJR0JmTG1acGJIUmxjbUFzSUdCZkxtMWhjR0FzSUdCZkxtMWhjRlpoYkhWbGMyQXNJR0JmTG5KbGFtVmpkR0FzSUdGdVpDQmdYeTV6YjIxbFlDNWNiaUFxWEc0Z0tpQlVhR1VnWjNWaGNtUmxaQ0J0WlhSb2IyUnpJR0Z5WlRwY2JpQXFJR0JoY25sZ0xDQmdZMkZzYkdKaFkydGdMQ0JnWTJoMWJtdGdMQ0JnWTJ4dmJtVmdMQ0JnWTNKbFlYUmxZQ3dnWUdOMWNuSjVZQ3dnWUdOMWNuSjVVbWxuYUhSZ0xDQmdaSEp2Y0dBc1hHNGdLaUJnWkhKdmNGSnBaMmgwWUN3Z1lHVjJaWEo1WUN3Z1lHWnBiR3hnTENCZ1pteGhkSFJsYm1Bc0lHQnBiblpsY25SZ0xDQmdiV0Y0WUN3Z1lHMXBibUFzSUdCd1lYSnpaVWx1ZEdBc1hHNGdLaUJnYzJ4cFkyVmdMQ0JnYzI5eWRFSjVZQ3dnWUhSaGEyVmdMQ0JnZEdGclpWSnBaMmgwWUN3Z1lIUmxiWEJzWVhSbFlDd2dZSFJ5YVcxZ0xDQmdkSEpwYlV4bFpuUmdMRnh1SUNvZ1lIUnlhVzFTYVdkb2RHQXNJR0IwY25WdVkyQXNJR0J5WVc1a2IyMWdMQ0JnY21GdVoyVmdMQ0JnYzJGdGNHeGxZQ3dnWUhOdmJXVmdMQ0JnZFc1cGNXQXNJR0Z1WkNCZ2QyOXlaSE5nWEc0Z0tseHVJQ29nUUhOMFlYUnBZMXh1SUNvZ1FHMWxiV0psY2s5bUlGOWNiaUFxSUVCaGJHbGhjeUJqYjJ4c1pXTjBYRzRnS2lCQVkyRjBaV2R2Y25rZ1EyOXNiR1ZqZEdsdmJseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYeFBZbXBsWTNSOGMzUnlhVzVuZlNCamIyeHNaV04wYVc5dUlGUm9aU0JqYjJ4c1pXTjBhVzl1SUhSdklHbDBaWEpoZEdVZ2IzWmxjaTVjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OFQySnFaV04wZkhOMGNtbHVaMzBnVzJsMFpYSmhkR1ZsUFY4dWFXUmxiblJwZEhsZElGUm9aU0JtZFc1amRHbHZiaUJwYm5admEyVmtYRzRnS2lBZ2NHVnlJR2wwWlhKaGRHbHZiaTVjYmlBcUlDQmpjbVZoZEdVZ1lTQmdYeTV3Y205d1pYSjBlV0FnYjNJZ1lGOHViV0YwWTJobGMyQWdjM1I1YkdVZ1kyRnNiR0poWTJzZ2NtVnpjR1ZqZEdsMlpXeDVMbHh1SUNvZ1FIQmhjbUZ0SUhzcWZTQmJkR2hwYzBGeVoxMGdWR2hsSUdCMGFHbHpZQ0JpYVc1a2FXNW5JRzltSUdCcGRHVnlZWFJsWldBdVhHNGdLaUJBY21WMGRYSnVjeUI3UVhKeVlYbDlJRkpsZEhWeWJuTWdkR2hsSUc1bGR5QnRZWEJ3WldRZ1lYSnlZWGt1WEc0Z0tpQkFaWGhoYlhCc1pWeHVJQ3BjYmlBcUlHWjFibU4wYVc5dUlIUnBiV1Z6VkdoeVpXVW9iaWtnZTF4dUlDb2dJQ0J5WlhSMWNtNGdiaUFxSURNN1hHNGdLaUI5WEc0Z0tseHVJQ29nWHk1dFlYQW9XekVzSURKZExDQjBhVzFsYzFSb2NtVmxLVHRjYmlBcUlDOHZJRDArSUZzekxDQTJYVnh1SUNwY2JpQXFJRjh1YldGd0tIc2dKMkVuT2lBeExDQW5ZaWM2SURJZ2ZTd2dkR2x0WlhOVWFISmxaU2s3WEc0Z0tpQXZMeUE5UGlCYk15d2dObDBnS0dsMFpYSmhkR2x2YmlCdmNtUmxjaUJwY3lCdWIzUWdaM1ZoY21GdWRHVmxaQ2xjYmlBcVhHNGdLaUIyWVhJZ2RYTmxjbk1nUFNCYlhHNGdLaUFnSUhzZ0ozVnpaWEluT2lBblltRnlibVY1SnlCOUxGeHVJQ29nSUNCN0lDZDFjMlZ5SnpvZ0oyWnlaV1FuSUgxY2JpQXFJRjA3WEc0Z0tseHVJQ29nTHk4Z2RYTnBibWNnZEdobElHQmZMbkJ5YjNCbGNuUjVZQ0JqWVd4c1ltRmpheUJ6YUc5eWRHaGhibVJjYmlBcUlGOHViV0Z3S0hWelpYSnpMQ0FuZFhObGNpY3BPMXh1SUNvZ0x5OGdQVDRnV3lkaVlYSnVaWGtuTENBblpuSmxaQ2RkWEc0Z0tpOWNibVoxYm1OMGFXOXVJRzFoY0NoamIyeHNaV04wYVc5dUxDQnBkR1Z5WVhSbFpTd2dkR2hwYzBGeVp5a2dlMXh1SUNCMllYSWdablZ1WXlBOUlHbHpRWEp5WVhrb1kyOXNiR1ZqZEdsdmJpa2dQeUJoY25KaGVVMWhjQ0E2SUdKaGMyVk5ZWEE3WEc0Z0lHbDBaWEpoZEdWbElEMGdZbUZ6WlVOaGJHeGlZV05yS0dsMFpYSmhkR1ZsTENCMGFHbHpRWEpuTENBektUdGNiaUFnY21WMGRYSnVJR1oxYm1Nb1kyOXNiR1ZqZEdsdmJpd2dhWFJsY21GMFpXVXBPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHMWhjRHRjYmlJc0luWmhjaUJwYzA1aGRHbDJaU0E5SUhKbGNYVnBjbVVvSnk0dUwyeGhibWN2YVhOT1lYUnBkbVVuS1R0Y2JseHVMeW9nVG1GMGFYWmxJRzFsZEdodlpDQnlaV1psY21WdVkyVnpJR1p2Y2lCMGFHOXpaU0IzYVhSb0lIUm9aU0J6WVcxbElHNWhiV1VnWVhNZ2IzUm9aWElnWUd4dlpHRnphR0FnYldWMGFHOWtjeTRnS2k5Y2JuWmhjaUJ1WVhScGRtVk9iM2NnUFNCcGMwNWhkR2wyWlNodVlYUnBkbVZPYjNjZ1BTQkVZWFJsTG01dmR5a2dKaVlnYm1GMGFYWmxUbTkzTzF4dVhHNHZLaXBjYmlBcUlFZGxkSE1nZEdobElHNTFiV0psY2lCdlppQnRhV3hzYVhObFkyOXVaSE1nZEdoaGRDQm9ZWFpsSUdWc1lYQnpaV1FnYzJsdVkyVWdkR2hsSUZWdWFYZ2daWEJ2WTJoY2JpQXFJQ2d4SUVwaGJuVmhjbmtnTVRrM01DQXdNRG93TURvd01DQlZWRU1wTGx4dUlDcGNiaUFxSUVCemRHRjBhV05jYmlBcUlFQnRaVzFpWlhKUFppQmZYRzRnS2lCQVkyRjBaV2R2Y25rZ1JHRjBaVnh1SUNvZ1FHVjRZVzF3YkdWY2JpQXFYRzRnS2lCZkxtUmxabVZ5S0daMWJtTjBhVzl1S0hOMFlXMXdLU0I3WEc0Z0tpQWdJR052Ym5OdmJHVXViRzluS0Y4dWJtOTNLQ2tnTFNCemRHRnRjQ2s3WEc0Z0tpQjlMQ0JmTG01dmR5Z3BLVHRjYmlBcUlDOHZJRDArSUd4dlozTWdkR2hsSUc1MWJXSmxjaUJ2WmlCdGFXeHNhWE5sWTI5dVpITWdhWFFnZEc5dmF5Qm1iM0lnZEdobElHUmxabVZ5Y21Wa0lHWjFibU4wYVc5dUlIUnZJR0psSUdsdWRtOXJaV1JjYmlBcUwxeHVkbUZ5SUc1dmR5QTlJRzVoZEdsMlpVNXZkeUI4ZkNCbWRXNWpkR2x2YmlncElIdGNiaUFnY21WMGRYSnVJRzVsZHlCRVlYUmxLQ2t1WjJWMFZHbHRaU2dwTzF4dWZUdGNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0J1YjNjN1hHNGlMQ0oyWVhJZ1kzSmxZWFJsVjNKaGNIQmxjaUE5SUhKbGNYVnBjbVVvSnk0dUwybHVkR1Z5Ym1Gc0wyTnlaV0YwWlZkeVlYQndaWEluS1N4Y2JpQWdJQ0J5WlhCc1lXTmxTRzlzWkdWeWN5QTlJSEpsY1hWcGNtVW9KeTR1TDJsdWRHVnlibUZzTDNKbGNHeGhZMlZJYjJ4a1pYSnpKeWtzWEc0Z0lDQWdjbVZ6ZEZCaGNtRnRJRDBnY21WeGRXbHlaU2duTGk5eVpYTjBVR0Z5WVcwbktUdGNibHh1THlvcUlGVnpaV1FnZEc4Z1kyOXRjRzl6WlNCaWFYUnRZWE5yY3lCbWIzSWdkM0poY0hCbGNpQnRaWFJoWkdGMFlTNGdLaTljYm5aaGNpQkNTVTVFWDBaTVFVY2dQU0F4TEZ4dUlDQWdJRkJCVWxSSlFVeGZSa3hCUnlBOUlETXlPMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCbWRXNWpkR2x2YmlCMGFHRjBJR2x1ZG05clpYTWdZR1oxYm1OZ0lIZHBkR2dnZEdobElHQjBhR2x6WUNCaWFXNWthVzVuSUc5bUlHQjBhR2x6UVhKbllGeHVJQ29nWVc1a0lIQnlaWEJsYm1SeklHRnVlU0JoWkdScGRHbHZibUZzSUdCZkxtSnBibVJnSUdGeVozVnRaVzUwY3lCMGJ5QjBhRzl6WlNCd2NtOTJhV1JsWkNCMGJ5QjBhR1ZjYmlBcUlHSnZkVzVrSUdaMWJtTjBhVzl1TGx4dUlDcGNiaUFxSUZSb1pTQmdYeTVpYVc1a0xuQnNZV05sYUc5c1pHVnlZQ0IyWVd4MVpTd2dkMmhwWTJnZ1pHVm1ZWFZzZEhNZ2RHOGdZRjlnSUdsdUlHMXZibTlzYVhSb2FXTWdZblZwYkdSekxGeHVJQ29nYldGNUlHSmxJSFZ6WldRZ1lYTWdZU0J3YkdGalpXaHZiR1JsY2lCbWIzSWdjR0Z5ZEdsaGJHeDVJR0Z3Y0d4cFpXUWdZWEpuZFcxbGJuUnpMbHh1SUNwY2JpQXFJQ29xVG05MFpUb3FLaUJWYm14cGEyVWdibUYwYVhabElHQkdkVzVqZEdsdmJpTmlhVzVrWUNCMGFHbHpJRzFsZEdodlpDQmtiMlZ6SUc1dmRDQnpaWFFnZEdobElHQnNaVzVuZEdoZ1hHNGdLaUJ3Y205d1pYSjBlU0J2WmlCaWIzVnVaQ0JtZFc1amRHbHZibk11WEc0Z0tseHVJQ29nUUhOMFlYUnBZMXh1SUNvZ1FHMWxiV0psY2s5bUlGOWNiaUFxSUVCallYUmxaMjl5ZVNCR2RXNWpkR2x2Ymx4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdablZ1WXlCVWFHVWdablZ1WTNScGIyNGdkRzhnWW1sdVpDNWNiaUFxSUVCd1lYSmhiU0I3S24wZ2RHaHBjMEZ5WnlCVWFHVWdZSFJvYVhOZ0lHSnBibVJwYm1jZ2IyWWdZR1oxYm1OZ0xseHVJQ29nUUhCaGNtRnRJSHN1TGk0cWZTQmJjR0Z5ZEdsaGJITmRJRlJvWlNCaGNtZDFiV1Z1ZEhNZ2RHOGdZbVVnY0dGeWRHbGhiR3g1SUdGd2NHeHBaV1F1WEc0Z0tpQkFjbVYwZFhKdWN5QjdSblZ1WTNScGIyNTlJRkpsZEhWeWJuTWdkR2hsSUc1bGR5QmliM1Z1WkNCbWRXNWpkR2x2Ymk1Y2JpQXFJRUJsZUdGdGNHeGxYRzRnS2x4dUlDb2dkbUZ5SUdkeVpXVjBJRDBnWm5WdVkzUnBiMjRvWjNKbFpYUnBibWNzSUhCMWJtTjBkV0YwYVc5dUtTQjdYRzRnS2lBZ0lISmxkSFZ5YmlCbmNtVmxkR2x1WnlBcklDY2dKeUFySUhSb2FYTXVkWE5sY2lBcklIQjFibU4wZFdGMGFXOXVPMXh1SUNvZ2ZUdGNiaUFxWEc0Z0tpQjJZWElnYjJKcVpXTjBJRDBnZXlBbmRYTmxjaWM2SUNkbWNtVmtKeUI5TzF4dUlDcGNiaUFxSUhaaGNpQmliM1Z1WkNBOUlGOHVZbWx1WkNobmNtVmxkQ3dnYjJKcVpXTjBMQ0FuYUdrbktUdGNiaUFxSUdKdmRXNWtLQ2NoSnlrN1hHNGdLaUF2THlBOVBpQW5hR2tnWm5KbFpDRW5YRzRnS2x4dUlDb2dMeThnZFhOcGJtY2djR3hoWTJWb2IyeGtaWEp6WEc0Z0tpQjJZWElnWW05MWJtUWdQU0JmTG1KcGJtUW9aM0psWlhRc0lHOWlhbVZqZEN3Z1h5d2dKeUVuS1R0Y2JpQXFJR0p2ZFc1a0tDZG9hU2NwTzF4dUlDb2dMeThnUFQ0Z0oyaHBJR1p5WldRaEoxeHVJQ292WEc1MllYSWdZbWx1WkNBOUlISmxjM1JRWVhKaGJTaG1kVzVqZEdsdmJpaG1kVzVqTENCMGFHbHpRWEpuTENCd1lYSjBhV0ZzY3lrZ2UxeHVJQ0IyWVhJZ1ltbDBiV0Z6YXlBOUlFSkpUa1JmUmt4QlJ6dGNiaUFnYVdZZ0tIQmhjblJwWVd4ekxteGxibWQwYUNrZ2UxeHVJQ0FnSUhaaGNpQm9iMnhrWlhKeklEMGdjbVZ3YkdGalpVaHZiR1JsY25Nb2NHRnlkR2xoYkhNc0lHSnBibVF1Y0d4aFkyVm9iMnhrWlhJcE8xeHVJQ0FnSUdKcGRHMWhjMnNnZkQwZ1VFRlNWRWxCVEY5R1RFRkhPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQmpjbVZoZEdWWGNtRndjR1Z5S0daMWJtTXNJR0pwZEcxaGMyc3NJSFJvYVhOQmNtY3NJSEJoY25ScFlXeHpMQ0JvYjJ4a1pYSnpLVHRjYm4wcE8xeHVYRzR2THlCQmMzTnBaMjRnWkdWbVlYVnNkQ0J3YkdGalpXaHZiR1JsY25NdVhHNWlhVzVrTG5Cc1lXTmxhRzlzWkdWeUlEMGdlMzA3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1ltbHVaRHRjYmlJc0lpOHFLaUJWYzJWa0lHRnpJSFJvWlNCZ1ZIbHdaVVZ5Y205eVlDQnRaWE56WVdkbElHWnZjaUJjSWtaMWJtTjBhVzl1YzF3aUlHMWxkR2h2WkhNdUlDb3ZYRzUyWVhJZ1JsVk9RMTlGVWxKUFVsOVVSVmhVSUQwZ0owVjRjR1ZqZEdWa0lHRWdablZ1WTNScGIyNG5PMXh1WEc0dktpQk9ZWFJwZG1VZ2JXVjBhRzlrSUhKbFptVnlaVzVqWlhNZ1ptOXlJSFJvYjNObElIZHBkR2dnZEdobElITmhiV1VnYm1GdFpTQmhjeUJ2ZEdobGNpQmdiRzlrWVhOb1lDQnRaWFJvYjJSekxpQXFMMXh1ZG1GeUlHNWhkR2wyWlUxaGVDQTlJRTFoZEdndWJXRjRPMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCbWRXNWpkR2x2YmlCMGFHRjBJR2x1ZG05clpYTWdZR1oxYm1OZ0lIZHBkR2dnZEdobElHQjBhR2x6WUNCaWFXNWthVzVuSUc5bUlIUm9aVnh1SUNvZ1kzSmxZWFJsWkNCbWRXNWpkR2x2YmlCaGJtUWdZWEpuZFcxbGJuUnpJR1p5YjIwZ1lITjBZWEowWUNCaGJtUWdZbVY1YjI1a0lIQnliM1pwWkdWa0lHRnpJR0Z1SUdGeWNtRjVMbHh1SUNwY2JpQXFJQ29xVG05MFpUb3FLaUJVYUdseklHMWxkR2h2WkNCcGN5QmlZWE5sWkNCdmJpQjBhR1VnVzNKbGMzUWdjR0Z5WVcxbGRHVnlYU2hvZEhSd2N6b3ZMMlJsZG1Wc2IzQmxjaTV0YjNwcGJHeGhMbTl5Wnk5bGJpMVZVeTlrYjJOekwxZGxZaTlLWVhaaFUyTnlhWEIwTDFKbFptVnlaVzVqWlM5R2RXNWpkR2x2Ym5NdmNtVnpkRjl3WVhKaGJXVjBaWEp6S1M1Y2JpQXFYRzRnS2lCQWMzUmhkR2xqWEc0Z0tpQkFiV1Z0WW1WeVQyWWdYMXh1SUNvZ1FHTmhkR1ZuYjNKNUlFWjFibU4wYVc5dVhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JtZFc1aklGUm9aU0JtZFc1amRHbHZiaUIwYnlCaGNIQnNlU0JoSUhKbGMzUWdjR0Z5WVcxbGRHVnlJSFJ2TGx4dUlDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlGdHpkR0Z5ZEQxbWRXNWpMbXhsYm1kMGFDMHhYU0JVYUdVZ2MzUmhjblFnY0c5emFYUnBiMjRnYjJZZ2RHaGxJSEpsYzNRZ2NHRnlZVzFsZEdWeUxseHVJQ29nUUhKbGRIVnlibk1nZTBaMWJtTjBhVzl1ZlNCU1pYUjFjbTV6SUhSb1pTQnVaWGNnWm5WdVkzUnBiMjR1WEc0Z0tpQkFaWGhoYlhCc1pWeHVJQ3BjYmlBcUlIWmhjaUJ6WVhrZ1BTQmZMbkpsYzNSUVlYSmhiU2htZFc1amRHbHZiaWgzYUdGMExDQnVZVzFsY3lrZ2UxeHVJQ29nSUNCeVpYUjFjbTRnZDJoaGRDQXJJQ2NnSnlBcklGOHVhVzVwZEdsaGJDaHVZVzFsY3lrdWFtOXBiaWduTENBbktTQXJYRzRnS2lBZ0lDQWdLRjh1YzJsNlpTaHVZVzFsY3lrZ1BpQXhJRDhnSnl3Z0ppQW5JRG9nSnljcElDc2dYeTVzWVhOMEtHNWhiV1Z6S1R0Y2JpQXFJSDBwTzF4dUlDcGNiaUFxSUhOaGVTZ25hR1ZzYkc4bkxDQW5abkpsWkNjc0lDZGlZWEp1WlhrbkxDQW5jR1ZpWW14bGN5Y3BPMXh1SUNvZ0x5OGdQVDRnSjJobGJHeHZJR1p5WldRc0lHSmhjbTVsZVN3Z0ppQndaV0ppYkdWekoxeHVJQ292WEc1bWRXNWpkR2x2YmlCeVpYTjBVR0Z5WVcwb1puVnVZeXdnYzNSaGNuUXBJSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQm1kVzVqSUNFOUlDZG1kVzVqZEdsdmJpY3BJSHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLRVpWVGtOZlJWSlNUMUpmVkVWWVZDazdYRzRnSUgxY2JpQWdjM1JoY25RZ1BTQnVZWFJwZG1WTllYZ29kSGx3Wlc5bUlITjBZWEowSUQwOUlDZDFibVJsWm1sdVpXUW5JRDhnS0daMWJtTXViR1Z1WjNSb0lDMGdNU2tnT2lBb0szTjBZWEowSUh4OElEQXBMQ0F3S1R0Y2JpQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lIWmhjaUJoY21keklEMGdZWEpuZFcxbGJuUnpMRnh1SUNBZ0lDQWdJQ0JwYm1SbGVDQTlJQzB4TEZ4dUlDQWdJQ0FnSUNCc1pXNW5kR2dnUFNCdVlYUnBkbVZOWVhnb1lYSm5jeTVzWlc1bmRHZ2dMU0J6ZEdGeWRDd2dNQ2tzWEc0Z0lDQWdJQ0FnSUhKbGMzUWdQU0JCY25KaGVTaHNaVzVuZEdncE8xeHVYRzRnSUNBZ2QyaHBiR1VnS0NzcmFXNWtaWGdnUENCc1pXNW5kR2dwSUh0Y2JpQWdJQ0FnSUhKbGMzUmJhVzVrWlhoZElEMGdZWEpuYzF0emRHRnlkQ0FySUdsdVpHVjRYVHRjYmlBZ0lDQjlYRzRnSUNBZ2MzZHBkR05vSUNoemRHRnlkQ2tnZTF4dUlDQWdJQ0FnWTJGelpTQXdPaUJ5WlhSMWNtNGdablZ1WXk1allXeHNLSFJvYVhNc0lISmxjM1FwTzF4dUlDQWdJQ0FnWTJGelpTQXhPaUJ5WlhSMWNtNGdablZ1WXk1allXeHNLSFJvYVhNc0lHRnlaM05iTUYwc0lISmxjM1FwTzF4dUlDQWdJQ0FnWTJGelpTQXlPaUJ5WlhSMWNtNGdablZ1WXk1allXeHNLSFJvYVhNc0lHRnlaM05iTUYwc0lHRnlaM05iTVYwc0lISmxjM1FwTzF4dUlDQWdJSDFjYmlBZ0lDQjJZWElnYjNSb1pYSkJjbWR6SUQwZ1FYSnlZWGtvYzNSaGNuUWdLeUF4S1R0Y2JpQWdJQ0JwYm1SbGVDQTlJQzB4TzF4dUlDQWdJSGRvYVd4bElDZ3JLMmx1WkdWNElEd2djM1JoY25RcElIdGNiaUFnSUNBZ0lHOTBhR1Z5UVhKbmMxdHBibVJsZUYwZ1BTQmhjbWR6VzJsdVpHVjRYVHRjYmlBZ0lDQjlYRzRnSUNBZ2IzUm9aWEpCY21kelczTjBZWEowWFNBOUlISmxjM1E3WEc0Z0lDQWdjbVYwZFhKdUlHWjFibU11WVhCd2JIa29kR2hwY3l3Z2IzUm9aWEpCY21kektUdGNiaUFnZlR0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0J5WlhOMFVHRnlZVzA3WEc0aUxDSjJZWElnWW1GelpVTnlaV0YwWlNBOUlISmxjWFZwY21Vb0p5NHZZbUZ6WlVOeVpXRjBaU2NwTEZ4dUlDQWdJR0poYzJWTWIyUmhjMmdnUFNCeVpYRjFhWEpsS0NjdUwySmhjMlZNYjJSaGMyZ25LVHRjYmx4dUx5b3FJRlZ6WldRZ1lYTWdjbVZtWlhKbGJtTmxjeUJtYjNJZ1lDMUpibVpwYm1sMGVXQWdZVzVrSUdCSmJtWnBibWwwZVdBdUlDb3ZYRzUyWVhJZ1VFOVRTVlJKVmtWZlNVNUdTVTVKVkZrZ1BTQk9kVzFpWlhJdVVFOVRTVlJKVmtWZlNVNUdTVTVKVkZrN1hHNWNiaThxS2x4dUlDb2dRM0psWVhSbGN5QmhJR3hoZW5rZ2QzSmhjSEJsY2lCdlltcGxZM1FnZDJocFkyZ2dkM0poY0hNZ1lIWmhiSFZsWUNCMGJ5QmxibUZpYkdVZ2JHRjZlU0JsZG1Gc2RXRjBhVzl1TGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJSFpoYkhWbElGUm9aU0IyWVd4MVpTQjBieUIzY21Gd0xseHVJQ292WEc1bWRXNWpkR2x2YmlCTVlYcDVWM0poY0hCbGNpaDJZV3gxWlNrZ2UxeHVJQ0IwYUdsekxsOWZkM0poY0hCbFpGOWZJRDBnZG1Gc2RXVTdYRzRnSUhSb2FYTXVYMTloWTNScGIyNXpYMThnUFNCdWRXeHNPMXh1SUNCMGFHbHpMbDlmWkdseVgxOGdQU0F4TzF4dUlDQjBhR2x6TGw5ZlpISnZjRU52ZFc1MFgxOGdQU0F3TzF4dUlDQjBhR2x6TGw5ZlptbHNkR1Z5WldSZlh5QTlJR1poYkhObE8xeHVJQ0IwYUdsekxsOWZhWFJsY21GMFpXVnpYMThnUFNCdWRXeHNPMXh1SUNCMGFHbHpMbDlmZEdGclpVTnZkVzUwWDE4Z1BTQlFUMU5KVkVsV1JWOUpUa1pKVGtsVVdUdGNiaUFnZEdocGN5NWZYM1pwWlhkelgxOGdQU0J1ZFd4c08xeHVmVnh1WEc1TVlYcDVWM0poY0hCbGNpNXdjbTkwYjNSNWNHVWdQU0JpWVhObFEzSmxZWFJsS0dKaGMyVk1iMlJoYzJndWNISnZkRzkwZVhCbEtUdGNia3hoZW5sWGNtRndjR1Z5TG5CeWIzUnZkSGx3WlM1amIyNXpkSEoxWTNSdmNpQTlJRXhoZW5sWGNtRndjR1Z5TzF4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlFeGhlbmxYY21Gd2NHVnlPMXh1SWl3aWRtRnlJR0poYzJWRGNtVmhkR1VnUFNCeVpYRjFhWEpsS0NjdUwySmhjMlZEY21WaGRHVW5LU3hjYmlBZ0lDQmlZWE5sVEc5a1lYTm9JRDBnY21WeGRXbHlaU2duTGk5aVlYTmxURzlrWVhOb0p5azdYRzVjYmk4cUtseHVJQ29nVkdobElHSmhjMlVnWTI5dWMzUnlkV04wYjNJZ1ptOXlJR055WldGMGFXNW5JR0JzYjJSaGMyaGdJSGR5WVhCd1pYSWdiMkpxWldOMGN5NWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ29nUUhCaGNtRnRJSHNxZlNCMllXeDFaU0JVYUdVZ2RtRnNkV1VnZEc4Z2QzSmhjQzVjYmlBcUlFQndZWEpoYlNCN1ltOXZiR1ZoYm4wZ1cyTm9ZV2x1UVd4c1hTQkZibUZpYkdVZ1kyaGhhVzVwYm1jZ1ptOXlJR0ZzYkNCM2NtRndjR1Z5SUcxbGRHaHZaSE11WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCYllXTjBhVzl1Y3oxYlhWMGdRV04wYVc5dWN5QjBieUJ3WldadmNtMGdkRzhnY21WemIyeDJaU0IwYUdVZ2RXNTNjbUZ3Y0dWa0lIWmhiSFZsTGx4dUlDb3ZYRzVtZFc1amRHbHZiaUJNYjJSaGMyaFhjbUZ3Y0dWeUtIWmhiSFZsTENCamFHRnBia0ZzYkN3Z1lXTjBhVzl1Y3lrZ2UxeHVJQ0IwYUdsekxsOWZkM0poY0hCbFpGOWZJRDBnZG1Gc2RXVTdYRzRnSUhSb2FYTXVYMTloWTNScGIyNXpYMThnUFNCaFkzUnBiMjV6SUh4OElGdGRPMXh1SUNCMGFHbHpMbDlmWTJoaGFXNWZYeUE5SUNFaFkyaGhhVzVCYkd3N1hHNTlYRzVjYmt4dlpHRnphRmR5WVhCd1pYSXVjSEp2ZEc5MGVYQmxJRDBnWW1GelpVTnlaV0YwWlNoaVlYTmxURzlrWVhOb0xuQnliM1J2ZEhsd1pTazdYRzVNYjJSaGMyaFhjbUZ3Y0dWeUxuQnliM1J2ZEhsd1pTNWpiMjV6ZEhKMVkzUnZjaUE5SUV4dlpHRnphRmR5WVhCd1pYSTdYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnVEc5a1lYTm9WM0poY0hCbGNqdGNiaUlzSWk4cUtseHVJQ29nUTI5d2FXVnpJSFJvWlNCMllXeDFaWE1nYjJZZ1lITnZkWEpqWldBZ2RHOGdZR0Z5Y21GNVlDNWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdjMjkxY21ObElGUm9aU0JoY25KaGVTQjBieUJqYjNCNUlIWmhiSFZsY3lCbWNtOXRMbHh1SUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnVzJGeWNtRjVQVnRkWFNCVWFHVWdZWEp5WVhrZ2RHOGdZMjl3ZVNCMllXeDFaWE1nZEc4dVhHNGdLaUJBY21WMGRYSnVjeUI3UVhKeVlYbDlJRkpsZEhWeWJuTWdZR0Z5Y21GNVlDNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1lYSnlZWGxEYjNCNUtITnZkWEpqWlN3Z1lYSnlZWGtwSUh0Y2JpQWdkbUZ5SUdsdVpHVjRJRDBnTFRFc1hHNGdJQ0FnSUNCc1pXNW5kR2dnUFNCemIzVnlZMlV1YkdWdVozUm9PMXh1WEc0Z0lHRnljbUY1SUh4OElDaGhjbkpoZVNBOUlFRnljbUY1S0d4bGJtZDBhQ2twTzF4dUlDQjNhR2xzWlNBb0t5dHBibVJsZUNBOElHeGxibWQwYUNrZ2UxeHVJQ0FnSUdGeWNtRjVXMmx1WkdWNFhTQTlJSE52ZFhKalpWdHBibVJsZUYwN1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUdGeWNtRjVPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHRnljbUY1UTI5d2VUdGNiaUlzSWk4cUtseHVJQ29nUVNCemNHVmphV0ZzYVhwbFpDQjJaWEp6YVc5dUlHOW1JR0JmTG1admNrVmhZMmhnSUdadmNpQmhjbkpoZVhNZ2QybDBhRzkxZENCemRYQndiM0owSUdadmNpQmpZV3hzWW1GamExeHVJQ29nYzJodmNuUm9ZVzVrY3lCaGJtUWdZSFJvYVhOZ0lHSnBibVJwYm1jdVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlHRnljbUY1SUZSb1pTQmhjbkpoZVNCMGJ5QnBkR1Z5WVhSbElHOTJaWEl1WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQnBkR1Z5WVhSbFpTQlVhR1VnWm5WdVkzUnBiMjRnYVc1MmIydGxaQ0J3WlhJZ2FYUmxjbUYwYVc5dUxseHVJQ29nUUhKbGRIVnlibk1nZTBGeWNtRjVmU0JTWlhSMWNtNXpJR0JoY25KaGVXQXVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHRnljbUY1UldGamFDaGhjbkpoZVN3Z2FYUmxjbUYwWldVcElIdGNiaUFnZG1GeUlHbHVaR1Y0SUQwZ0xURXNYRzRnSUNBZ0lDQnNaVzVuZEdnZ1BTQmhjbkpoZVM1c1pXNW5kR2c3WEc1Y2JpQWdkMmhwYkdVZ0tDc3JhVzVrWlhnZ1BDQnNaVzVuZEdncElIdGNiaUFnSUNCcFppQW9hWFJsY21GMFpXVW9ZWEp5WVhsYmFXNWtaWGhkTENCcGJtUmxlQ3dnWVhKeVlYa3BJRDA5UFNCbVlXeHpaU2tnZTF4dUlDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCaGNuSmhlVHRjYm4xY2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQmhjbkpoZVVWaFkyZzdYRzRpTENJdktpcGNiaUFxSUVFZ2MzQmxZMmxoYkdsNlpXUWdkbVZ5YzJsdmJpQnZaaUJnWHk1dFlYQmdJR1p2Y2lCaGNuSmhlWE1nZDJsMGFHOTFkQ0J6ZFhCd2IzSjBJR1p2Y2lCallXeHNZbUZqYTF4dUlDb2djMmh2Y25Sb1lXNWtjeUJoYm1RZ1lIUm9hWE5nSUdKcGJtUnBibWN1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUdGeWNtRjVJRlJvWlNCaGNuSmhlU0IwYnlCcGRHVnlZWFJsSUc5MlpYSXVYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCcGRHVnlZWFJsWlNCVWFHVWdablZ1WTNScGIyNGdhVzUyYjJ0bFpDQndaWElnYVhSbGNtRjBhVzl1TGx4dUlDb2dRSEpsZEhWeWJuTWdlMEZ5Y21GNWZTQlNaWFIxY201eklIUm9aU0J1WlhjZ2JXRndjR1ZrSUdGeWNtRjVMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQmhjbkpoZVUxaGNDaGhjbkpoZVN3Z2FYUmxjbUYwWldVcElIdGNiaUFnZG1GeUlHbHVaR1Y0SUQwZ0xURXNYRzRnSUNBZ0lDQnNaVzVuZEdnZ1BTQmhjbkpoZVM1c1pXNW5kR2dzWEc0Z0lDQWdJQ0J5WlhOMWJIUWdQU0JCY25KaGVTaHNaVzVuZEdncE8xeHVYRzRnSUhkb2FXeGxJQ2dySzJsdVpHVjRJRHdnYkdWdVozUm9LU0I3WEc0Z0lDQWdjbVZ6ZFd4MFcybHVaR1Y0WFNBOUlHbDBaWEpoZEdWbEtHRnljbUY1VzJsdVpHVjRYU3dnYVc1a1pYZ3NJR0Z5Y21GNUtUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2NtVnpkV3gwTzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR0Z5Y21GNVRXRndPMXh1SWl3aWRtRnlJR0poYzJWTllYUmphR1Z6SUQwZ2NtVnhkV2x5WlNnbkxpOWlZWE5sVFdGMFkyaGxjeWNwTEZ4dUlDQWdJR0poYzJWTllYUmphR1Z6VUhKdmNHVnlkSGtnUFNCeVpYRjFhWEpsS0NjdUwySmhjMlZOWVhSamFHVnpVSEp2Y0dWeWRIa25LU3hjYmlBZ0lDQmlZWE5sVUhKdmNHVnlkSGtnUFNCeVpYRjFhWEpsS0NjdUwySmhjMlZRY205d1pYSjBlU2NwTEZ4dUlDQWdJR0pwYm1SRFlXeHNZbUZqYXlBOUlISmxjWFZwY21Vb0p5NHZZbWx1WkVOaGJHeGlZV05ySnlrc1hHNGdJQ0FnYVdSbGJuUnBkSGtnUFNCeVpYRjFhWEpsS0NjdUxpOTFkR2xzYVhSNUwybGtaVzUwYVhSNUp5azdYRzVjYmk4cUtseHVJQ29nVkdobElHSmhjMlVnYVcxd2JHVnRaVzUwWVhScGIyNGdiMllnWUY4dVkyRnNiR0poWTJ0Z0lIZG9hV05vSUhOMWNIQnZjblJ6SUhOd1pXTnBabmxwYm1jZ2RHaGxYRzRnS2lCdWRXMWlaWElnYjJZZ1lYSm5kVzFsYm5SeklIUnZJSEJ5YjNacFpHVWdkRzhnWUdaMWJtTmdMbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZXlwOUlGdG1kVzVqUFY4dWFXUmxiblJwZEhsZElGUm9aU0IyWVd4MVpTQjBieUJqYjI1MlpYSjBJSFJ2SUdFZ1kyRnNiR0poWTJzdVhHNGdLaUJBY0dGeVlXMGdleXA5SUZ0MGFHbHpRWEpuWFNCVWFHVWdZSFJvYVhOZ0lHSnBibVJwYm1jZ2IyWWdZR1oxYm1OZ0xseHVJQ29nUUhCaGNtRnRJSHR1ZFcxaVpYSjlJRnRoY21kRGIzVnVkRjBnVkdobElHNTFiV0psY2lCdlppQmhjbWQxYldWdWRITWdkRzhnY0hKdmRtbGtaU0IwYnlCZ1puVnVZMkF1WEc0Z0tpQkFjbVYwZFhKdWN5QjdSblZ1WTNScGIyNTlJRkpsZEhWeWJuTWdkR2hsSUdOaGJHeGlZV05yTGx4dUlDb3ZYRzVtZFc1amRHbHZiaUJpWVhObFEyRnNiR0poWTJzb1puVnVZeXdnZEdocGMwRnlaeXdnWVhKblEyOTFiblFwSUh0Y2JpQWdkbUZ5SUhSNWNHVWdQU0IwZVhCbGIyWWdablZ1WXp0Y2JpQWdhV1lnS0hSNWNHVWdQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwZVhCbGIyWWdkR2hwYzBGeVp5QTlQU0FuZFc1a1pXWnBibVZrSjF4dUlDQWdJQ0FnUHlCbWRXNWpYRzRnSUNBZ0lDQTZJR0pwYm1SRFlXeHNZbUZqYXlobWRXNWpMQ0IwYUdselFYSm5MQ0JoY21kRGIzVnVkQ2s3WEc0Z0lIMWNiaUFnYVdZZ0tHWjFibU1nUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQnBaR1Z1ZEdsMGVUdGNiaUFnZlZ4dUlDQnBaaUFvZEhsd1pTQTlQU0FuYjJKcVpXTjBKeWtnZTF4dUlDQWdJSEpsZEhWeWJpQmlZWE5sVFdGMFkyaGxjeWhtZFc1aktUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2RIbHdaVzltSUhSb2FYTkJjbWNnUFQwZ0ozVnVaR1ZtYVc1bFpDZGNiaUFnSUNBL0lHSmhjMlZRY205d1pYSjBlU2htZFc1aklDc2dKeWNwWEc0Z0lDQWdPaUJpWVhObFRXRjBZMmhsYzFCeWIzQmxjblI1S0daMWJtTWdLeUFuSnl3Z2RHaHBjMEZ5WnlrN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWW1GelpVTmhiR3hpWVdOck8xeHVJaXdpZG1GeUlHRnljbUY1UTI5d2VTQTlJSEpsY1hWcGNtVW9KeTR2WVhKeVlYbERiM0I1Snlrc1hHNGdJQ0FnWVhKeVlYbEZZV05vSUQwZ2NtVnhkV2x5WlNnbkxpOWhjbkpoZVVWaFkyZ25LU3hjYmlBZ0lDQmlZWE5sUTI5d2VTQTlJSEpsY1hWcGNtVW9KeTR2WW1GelpVTnZjSGtuS1N4Y2JpQWdJQ0JpWVhObFJtOXlUM2R1SUQwZ2NtVnhkV2x5WlNnbkxpOWlZWE5sUm05eVQzZHVKeWtzWEc0Z0lDQWdhVzVwZEVOc2IyNWxRWEp5WVhrZ1BTQnlaWEYxYVhKbEtDY3VMMmx1YVhSRGJHOXVaVUZ5Y21GNUp5a3NYRzRnSUNBZ2FXNXBkRU5zYjI1bFFubFVZV2NnUFNCeVpYRjFhWEpsS0NjdUwybHVhWFJEYkc5dVpVSjVWR0ZuSnlrc1hHNGdJQ0FnYVc1cGRFTnNiMjVsVDJKcVpXTjBJRDBnY21WeGRXbHlaU2duTGk5cGJtbDBRMnh2Ym1WUFltcGxZM1FuS1N4Y2JpQWdJQ0JwYzBGeWNtRjVJRDBnY21WeGRXbHlaU2duTGk0dmJHRnVaeTlwYzBGeWNtRjVKeWtzWEc0Z0lDQWdhWE5JYjNOMFQySnFaV04wSUQwZ2NtVnhkV2x5WlNnbkxpOXBjMGh2YzNSUFltcGxZM1FuS1N4Y2JpQWdJQ0JwYzA5aWFtVmpkQ0E5SUhKbGNYVnBjbVVvSnk0dUwyeGhibWN2YVhOUFltcGxZM1FuS1N4Y2JpQWdJQ0JyWlhseklEMGdjbVZ4ZFdseVpTZ25MaTR2YjJKcVpXTjBMMnRsZVhNbktUdGNibHh1THlvcUlHQlBZbXBsWTNRamRHOVRkSEpwYm1kZ0lISmxjM1ZzZENCeVpXWmxjbVZ1WTJWekxpQXFMMXh1ZG1GeUlHRnlaM05VWVdjZ1BTQW5XMjlpYW1WamRDQkJjbWQxYldWdWRITmRKeXhjYmlBZ0lDQmhjbkpoZVZSaFp5QTlJQ2RiYjJKcVpXTjBJRUZ5Y21GNVhTY3NYRzRnSUNBZ1ltOXZiRlJoWnlBOUlDZGJiMkpxWldOMElFSnZiMnhsWVc1ZEp5eGNiaUFnSUNCa1lYUmxWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1JHRjBaVjBuTEZ4dUlDQWdJR1Z5Y205eVZHRm5JRDBnSjF0dlltcGxZM1FnUlhKeWIzSmRKeXhjYmlBZ0lDQm1kVzVqVkdGbklEMGdKMXR2WW1wbFkzUWdSblZ1WTNScGIyNWRKeXhjYmlBZ0lDQnRZWEJVWVdjZ1BTQW5XMjlpYW1WamRDQk5ZWEJkSnl4Y2JpQWdJQ0J1ZFcxaVpYSlVZV2NnUFNBblcyOWlhbVZqZENCT2RXMWlaWEpkSnl4Y2JpQWdJQ0J2WW1wbFkzUlVZV2NnUFNBblcyOWlhbVZqZENCUFltcGxZM1JkSnl4Y2JpQWdJQ0J5WldkbGVIQlVZV2NnUFNBblcyOWlhbVZqZENCU1pXZEZlSEJkSnl4Y2JpQWdJQ0J6WlhSVVlXY2dQU0FuVzI5aWFtVmpkQ0JUWlhSZEp5eGNiaUFnSUNCemRISnBibWRVWVdjZ1BTQW5XMjlpYW1WamRDQlRkSEpwYm1kZEp5eGNiaUFnSUNCM1pXRnJUV0Z3VkdGbklEMGdKMXR2WW1wbFkzUWdWMlZoYTAxaGNGMG5PMXh1WEc1MllYSWdZWEp5WVhsQ2RXWm1aWEpVWVdjZ1BTQW5XMjlpYW1WamRDQkJjbkpoZVVKMVptWmxjbDBuTEZ4dUlDQWdJR1pzYjJGME16SlVZV2NnUFNBblcyOWlhbVZqZENCR2JHOWhkRE15UVhKeVlYbGRKeXhjYmlBZ0lDQm1iRzloZERZMFZHRm5JRDBnSjF0dlltcGxZM1FnUm14dllYUTJORUZ5Y21GNVhTY3NYRzRnSUNBZ2FXNTBPRlJoWnlBOUlDZGJiMkpxWldOMElFbHVkRGhCY25KaGVWMG5MRnh1SUNBZ0lHbHVkREUyVkdGbklEMGdKMXR2WW1wbFkzUWdTVzUwTVRaQmNuSmhlVjBuTEZ4dUlDQWdJR2x1ZERNeVZHRm5JRDBnSjF0dlltcGxZM1FnU1c1ME16SkJjbkpoZVYwbkxGeHVJQ0FnSUhWcGJuUTRWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1ZXbHVkRGhCY25KaGVWMG5MRnh1SUNBZ0lIVnBiblE0UTJ4aGJYQmxaRlJoWnlBOUlDZGJiMkpxWldOMElGVnBiblE0UTJ4aGJYQmxaRUZ5Y21GNVhTY3NYRzRnSUNBZ2RXbHVkREUyVkdGbklEMGdKMXR2WW1wbFkzUWdWV2x1ZERFMlFYSnlZWGxkSnl4Y2JpQWdJQ0IxYVc1ME16SlVZV2NnUFNBblcyOWlhbVZqZENCVmFXNTBNekpCY25KaGVWMG5PMXh1WEc0dktpb2dWWE5sWkNCMGJ5QnBaR1Z1ZEdsbWVTQmdkRzlUZEhKcGJtZFVZV2RnSUhaaGJIVmxjeUJ6ZFhCd2IzSjBaV1FnWW5rZ1lGOHVZMnh2Ym1WZ0xpQXFMMXh1ZG1GeUlHTnNiMjVsWVdKc1pWUmhaM01nUFNCN2ZUdGNibU5zYjI1bFlXSnNaVlJoWjNOYllYSm5jMVJoWjEwZ1BTQmpiRzl1WldGaWJHVlVZV2R6VzJGeWNtRjVWR0ZuWFNBOVhHNWpiRzl1WldGaWJHVlVZV2R6VzJGeWNtRjVRblZtWm1WeVZHRm5YU0E5SUdOc2IyNWxZV0pzWlZSaFozTmJZbTl2YkZSaFoxMGdQVnh1WTJ4dmJtVmhZbXhsVkdGbmMxdGtZWFJsVkdGblhTQTlJR05zYjI1bFlXSnNaVlJoWjNOYlpteHZZWFF6TWxSaFoxMGdQVnh1WTJ4dmJtVmhZbXhsVkdGbmMxdG1iRzloZERZMFZHRm5YU0E5SUdOc2IyNWxZV0pzWlZSaFozTmJhVzUwT0ZSaFoxMGdQVnh1WTJ4dmJtVmhZbXhsVkdGbmMxdHBiblF4TmxSaFoxMGdQU0JqYkc5dVpXRmliR1ZVWVdkelcybHVkRE15VkdGblhTQTlYRzVqYkc5dVpXRmliR1ZVWVdkelcyNTFiV0psY2xSaFoxMGdQU0JqYkc5dVpXRmliR1ZVWVdkelcyOWlhbVZqZEZSaFoxMGdQVnh1WTJ4dmJtVmhZbXhsVkdGbmMxdHlaV2RsZUhCVVlXZGRJRDBnWTJ4dmJtVmhZbXhsVkdGbmMxdHpkSEpwYm1kVVlXZGRJRDFjYm1Oc2IyNWxZV0pzWlZSaFozTmJkV2x1ZERoVVlXZGRJRDBnWTJ4dmJtVmhZbXhsVkdGbmMxdDFhVzUwT0VOc1lXMXdaV1JVWVdkZElEMWNibU5zYjI1bFlXSnNaVlJoWjNOYmRXbHVkREUyVkdGblhTQTlJR05zYjI1bFlXSnNaVlJoWjNOYmRXbHVkRE15VkdGblhTQTlJSFJ5ZFdVN1hHNWpiRzl1WldGaWJHVlVZV2R6VzJWeWNtOXlWR0ZuWFNBOUlHTnNiMjVsWVdKc1pWUmhaM05iWm5WdVkxUmhaMTBnUFZ4dVkyeHZibVZoWW14bFZHRm5jMXR0WVhCVVlXZGRJRDBnWTJ4dmJtVmhZbXhsVkdGbmMxdHpaWFJVWVdkZElEMWNibU5zYjI1bFlXSnNaVlJoWjNOYmQyVmhhMDFoY0ZSaFoxMGdQU0JtWVd4elpUdGNibHh1THlvcUlGVnpaV1FnWm05eUlHNWhkR2wyWlNCdFpYUm9iMlFnY21WbVpYSmxibU5sY3k0Z0tpOWNiblpoY2lCdlltcGxZM1JRY205MGJ5QTlJRTlpYW1WamRDNXdjbTkwYjNSNWNHVTdYRzVjYmk4cUtseHVJQ29nVlhObFpDQjBieUJ5WlhOdmJIWmxJSFJvWlNCYllIUnZVM1J5YVc1blZHRm5ZRjBvYUhSMGNITTZMeTl3Wlc5d2JHVXViVzk2YVd4c1lTNXZjbWN2Zm1wdmNtVnVaRzl5Wm1ZdlpYTTJMV1J5WVdaMExtaDBiV3dqYzJWakxXOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOXpkSEpwYm1jcFhHNGdLaUJ2WmlCMllXeDFaWE11WEc0Z0tpOWNiblpoY2lCdlltcFViMU4wY21sdVp5QTlJRzlpYW1WamRGQnliM1J2TG5SdlUzUnlhVzVuTzF4dVhHNHZLaXBjYmlBcUlGUm9aU0JpWVhObElHbHRjR3hsYldWdWRHRjBhVzl1SUc5bUlHQmZMbU5zYjI1bFlDQjNhWFJvYjNWMElITjFjSEJ2Y25RZ1ptOXlJR0Z5WjNWdFpXNTBJR3AxWjJkc2FXNW5YRzRnS2lCaGJtUWdZSFJvYVhOZ0lHSnBibVJwYm1jZ1lHTjFjM1J2YldsNlpYSmdJR1oxYm1OMGFXOXVjeTVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUhzcWZTQjJZV3gxWlNCVWFHVWdkbUZzZFdVZ2RHOGdZMnh2Ym1VdVhHNGdLaUJBY0dGeVlXMGdlMkp2YjJ4bFlXNTlJRnRwYzBSbFpYQmRJRk53WldOcFpua2dZU0JrWldWd0lHTnNiMjVsTGx4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdXMk4xYzNSdmJXbDZaWEpkSUZSb1pTQm1kVzVqZEdsdmJpQjBieUJqZFhOMGIyMXBlbVVnWTJ4dmJtbHVaeUIyWVd4MVpYTXVYRzRnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnVzJ0bGVWMGdWR2hsSUd0bGVTQnZaaUJnZG1Gc2RXVmdMbHh1SUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUZ0dlltcGxZM1JkSUZSb1pTQnZZbXBsWTNRZ1lIWmhiSFZsWUNCaVpXeHZibWR6SUhSdkxseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdXM04wWVdOclFUMWJYVjBnVkhKaFkydHpJSFJ5WVhabGNuTmxaQ0J6YjNWeVkyVWdiMkpxWldOMGN5NWNiaUFxSUVCd1lYSmhiU0I3UVhKeVlYbDlJRnR6ZEdGamEwSTlXMTFkSUVGemMyOWphV0YwWlhNZ1kyeHZibVZ6SUhkcGRHZ2djMjkxY21ObElHTnZkVzUwWlhKd1lYSjBjeTVjYmlBcUlFQnlaWFIxY201eklIc3FmU0JTWlhSMWNtNXpJSFJvWlNCamJHOXVaV1FnZG1Gc2RXVXVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHSmhjMlZEYkc5dVpTaDJZV3gxWlN3Z2FYTkVaV1Z3TENCamRYTjBiMjFwZW1WeUxDQnJaWGtzSUc5aWFtVmpkQ3dnYzNSaFkydEJMQ0J6ZEdGamEwSXBJSHRjYmlBZ2RtRnlJSEpsYzNWc2REdGNiaUFnYVdZZ0tHTjFjM1J2YldsNlpYSXBJSHRjYmlBZ0lDQnlaWE4xYkhRZ1BTQnZZbXBsWTNRZ1B5QmpkWE4wYjIxcGVtVnlLSFpoYkhWbExDQnJaWGtzSUc5aWFtVmpkQ2tnT2lCamRYTjBiMjFwZW1WeUtIWmhiSFZsS1R0Y2JpQWdmVnh1SUNCcFppQW9kSGx3Wlc5bUlISmxjM1ZzZENBaFBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJSDFjYmlBZ2FXWWdLQ0ZwYzA5aWFtVmpkQ2gyWVd4MVpTa3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RtRnNkV1U3WEc0Z0lIMWNiaUFnZG1GeUlHbHpRWEp5SUQwZ2FYTkJjbkpoZVNoMllXeDFaU2s3WEc0Z0lHbG1JQ2hwYzBGeWNpa2dlMXh1SUNBZ0lISmxjM1ZzZENBOUlHbHVhWFJEYkc5dVpVRnljbUY1S0haaGJIVmxLVHRjYmlBZ0lDQnBaaUFvSVdselJHVmxjQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR0Z5Y21GNVEyOXdlU2gyWVd4MVpTd2djbVZ6ZFd4MEtUdGNiaUFnSUNCOVhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RtRnlJSFJoWnlBOUlHOWlhbFJ2VTNSeWFXNW5MbU5oYkd3b2RtRnNkV1VwTEZ4dUlDQWdJQ0FnSUNCcGMwWjFibU1nUFNCMFlXY2dQVDBnWm5WdVkxUmhaenRjYmx4dUlDQWdJR2xtSUNoMFlXY2dQVDBnYjJKcVpXTjBWR0ZuSUh4OElIUmhaeUE5UFNCaGNtZHpWR0ZuSUh4OElDaHBjMFoxYm1NZ0ppWWdJVzlpYW1WamRDa3BJSHRjYmlBZ0lDQWdJR2xtSUNocGMwaHZjM1JQWW1wbFkzUW9kbUZzZFdVcEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnZZbXBsWTNRZ1B5QjJZV3gxWlNBNklIdDlPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVZ6ZFd4MElEMGdhVzVwZEVOc2IyNWxUMkpxWldOMEtHbHpSblZ1WXlBL0lIdDlJRG9nZG1Gc2RXVXBPMXh1SUNBZ0lDQWdhV1lnS0NGcGMwUmxaWEFwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdKaGMyVkRiM0I1S0haaGJIVmxMQ0J5WlhOMWJIUXNJR3RsZVhNb2RtRnNkV1VwS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHTnNiMjVsWVdKc1pWUmhaM05iZEdGblhWeHVJQ0FnSUNBZ0lDQS9JR2x1YVhSRGJHOXVaVUo1VkdGbktIWmhiSFZsTENCMFlXY3NJR2x6UkdWbGNDbGNiaUFnSUNBZ0lDQWdPaUFvYjJKcVpXTjBJRDhnZG1Gc2RXVWdPaUI3ZlNrN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUM4dklFTm9aV05ySUdadmNpQmphWEpqZFd4aGNpQnlaV1psY21WdVkyVnpJR0Z1WkNCeVpYUjFjbTRnWTI5eWNtVnpjRzl1WkdsdVp5QmpiRzl1WlM1Y2JpQWdjM1JoWTJ0QklIeDhJQ2h6ZEdGamEwRWdQU0JiWFNrN1hHNGdJSE4wWVdOclFpQjhmQ0FvYzNSaFkydENJRDBnVzEwcE8xeHVYRzRnSUhaaGNpQnNaVzVuZEdnZ1BTQnpkR0ZqYTBFdWJHVnVaM1JvTzF4dUlDQjNhR2xzWlNBb2JHVnVaM1JvTFMwcElIdGNiaUFnSUNCcFppQW9jM1JoWTJ0QlcyeGxibWQwYUYwZ1BUMGdkbUZzZFdVcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCemRHRmphMEpiYkdWdVozUm9YVHRjYmlBZ0lDQjlYRzRnSUgxY2JpQWdMeThnUVdSa0lIUm9aU0J6YjNWeVkyVWdkbUZzZFdVZ2RHOGdkR2hsSUhOMFlXTnJJRzltSUhSeVlYWmxjbk5sWkNCdlltcGxZM1J6SUdGdVpDQmhjM052WTJsaGRHVWdhWFFnZDJsMGFDQnBkSE1nWTJ4dmJtVXVYRzRnSUhOMFlXTnJRUzV3ZFhOb0tIWmhiSFZsS1R0Y2JpQWdjM1JoWTJ0Q0xuQjFjMmdvY21WemRXeDBLVHRjYmx4dUlDQXZMeUJTWldOMWNuTnBkbVZzZVNCd2IzQjFiR0YwWlNCamJHOXVaU0FvYzNWelkyVndkR2xpYkdVZ2RHOGdZMkZzYkNCemRHRmpheUJzYVcxcGRITXBMbHh1SUNBb2FYTkJjbklnUHlCaGNuSmhlVVZoWTJnZ09pQmlZWE5sUm05eVQzZHVLU2gyWVd4MVpTd2dablZ1WTNScGIyNG9jM1ZpVm1Gc2RXVXNJR3RsZVNrZ2UxeHVJQ0FnSUhKbGMzVnNkRnRyWlhsZElEMGdZbUZ6WlVOc2IyNWxLSE4xWWxaaGJIVmxMQ0JwYzBSbFpYQXNJR04xYzNSdmJXbDZaWElzSUd0bGVTd2dkbUZzZFdVc0lITjBZV05yUVN3Z2MzUmhZMnRDS1R0Y2JpQWdmU2s3WEc0Z0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdZbUZ6WlVOc2IyNWxPMXh1SWl3aUx5b3FYRzRnS2lCRGIzQnBaWE1nZEdobElIQnliM0JsY25ScFpYTWdiMllnWUhOdmRYSmpaV0FnZEc4Z1lHOWlhbVZqZEdBdVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnpiM1Z5WTJVZ1ZHaGxJRzlpYW1WamRDQjBieUJqYjNCNUlIQnliM0JsY25ScFpYTWdabkp2YlM1Y2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQmJiMkpxWldOMFBYdDlYU0JVYUdVZ2IySnFaV04wSUhSdklHTnZjSGtnY0hKdmNHVnlkR2xsY3lCMGJ5NWNiaUFxSUVCd1lYSmhiU0I3UVhKeVlYbDlJSEJ5YjNCeklGUm9aU0J3Y205d1pYSjBlU0J1WVcxbGN5QjBieUJqYjNCNUxseHVJQ29nUUhKbGRIVnlibk1nZTA5aWFtVmpkSDBnVW1WMGRYSnVjeUJnYjJKcVpXTjBZQzVjYmlBcUwxeHVablZ1WTNScGIyNGdZbUZ6WlVOdmNIa29jMjkxY21ObExDQnZZbXBsWTNRc0lIQnliM0J6S1NCN1hHNGdJR2xtSUNnaGNISnZjSE1wSUh0Y2JpQWdJQ0J3Y205d2N5QTlJRzlpYW1WamREdGNiaUFnSUNCdlltcGxZM1FnUFNCN2ZUdGNiaUFnZlZ4dUlDQjJZWElnYVc1a1pYZ2dQU0F0TVN4Y2JpQWdJQ0FnSUd4bGJtZDBhQ0E5SUhCeWIzQnpMbXhsYm1kMGFEdGNibHh1SUNCM2FHbHNaU0FvS3l0cGJtUmxlQ0E4SUd4bGJtZDBhQ2tnZTF4dUlDQWdJSFpoY2lCclpYa2dQU0J3Y205d2MxdHBibVJsZUYwN1hHNGdJQ0FnYjJKcVpXTjBXMnRsZVYwZ1BTQnpiM1Z5WTJWYmEyVjVYVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiMkpxWldOME8xeHVmVnh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdKaGMyVkRiM0I1TzF4dUlpd2lkbUZ5SUdselQySnFaV04wSUQwZ2NtVnhkV2x5WlNnbkxpNHZiR0Z1Wnk5cGMwOWlhbVZqZENjcE8xeHVYRzR2S2lwY2JpQXFJRlJvWlNCaVlYTmxJR2x0Y0d4bGJXVnVkR0YwYVc5dUlHOW1JR0JmTG1OeVpXRjBaV0FnZDJsMGFHOTFkQ0J6ZFhCd2IzSjBJR1p2Y2lCaGMzTnBaMjVwYm1kY2JpQXFJSEJ5YjNCbGNuUnBaWE1nZEc4Z2RHaGxJR055WldGMFpXUWdiMkpxWldOMExseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdjSEp2ZEc5MGVYQmxJRlJvWlNCdlltcGxZM1FnZEc4Z2FXNW9aWEpwZENCbWNtOXRMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UwOWlhbVZqZEgwZ1VtVjBkWEp1Y3lCMGFHVWdibVYzSUc5aWFtVmpkQzVjYmlBcUwxeHVkbUZ5SUdKaGMyVkRjbVZoZEdVZ1BTQW9ablZ1WTNScGIyNG9LU0I3WEc0Z0lHWjFibU4wYVc5dUlFOWlhbVZqZENncElIdDlYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaWh3Y205MGIzUjVjR1VwSUh0Y2JpQWdJQ0JwWmlBb2FYTlBZbXBsWTNRb2NISnZkRzkwZVhCbEtTa2dlMXh1SUNBZ0lDQWdUMkpxWldOMExuQnliM1J2ZEhsd1pTQTlJSEJ5YjNSdmRIbHdaVHRjYmlBZ0lDQWdJSFpoY2lCeVpYTjFiSFFnUFNCdVpYY2dUMkpxWldOME8xeHVJQ0FnSUNBZ1QySnFaV04wTG5CeWIzUnZkSGx3WlNBOUlHNTFiR3c3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFFnZkh3Z1oyeHZZbUZzTGs5aWFtVmpkQ2dwTzF4dUlDQjlPMXh1ZlNncEtUdGNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JpWVhObFEzSmxZWFJsTzF4dUlpd2lkbUZ5SUdKaGMyVkdiM0pQZDI0Z1BTQnlaWEYxYVhKbEtDY3VMMkpoYzJWR2IzSlBkMjRuS1N4Y2JpQWdJQ0JqY21WaGRHVkNZWE5sUldGamFDQTlJSEpsY1hWcGNtVW9KeTR2WTNKbFlYUmxRbUZ6WlVWaFkyZ25LVHRjYmx4dUx5b3FYRzRnS2lCVWFHVWdZbUZ6WlNCcGJYQnNaVzFsYm5SaGRHbHZiaUJ2WmlCZ1h5NW1iM0pGWVdOb1lDQjNhWFJvYjNWMElITjFjSEJ2Y25RZ1ptOXlJR05oYkd4aVlXTnJYRzRnS2lCemFHOXlkR2hoYm1SeklHRnVaQ0JnZEdocGMyQWdZbWx1WkdsdVp5NWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYeFBZbXBsWTNSOGMzUnlhVzVuZlNCamIyeHNaV04wYVc5dUlGUm9aU0JqYjJ4c1pXTjBhVzl1SUhSdklHbDBaWEpoZEdVZ2IzWmxjaTVjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHbDBaWEpoZEdWbElGUm9aU0JtZFc1amRHbHZiaUJwYm5admEyVmtJSEJsY2lCcGRHVnlZWFJwYjI0dVhHNGdLaUJBY21WMGRYSnVjeUI3UVhKeVlYbDhUMkpxWldOMGZITjBjbWx1WjMwZ1VtVjBkWEp1Y3lCZ1kyOXNiR1ZqZEdsdmJtQXVYRzRnS2k5Y2JuWmhjaUJpWVhObFJXRmphQ0E5SUdOeVpXRjBaVUpoYzJWRllXTm9LR0poYzJWR2IzSlBkMjRwTzF4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHSmhjMlZGWVdOb08xeHVJaXdpTHlvcVhHNGdLaUJVYUdVZ1ltRnpaU0JwYlhCc1pXMWxiblJoZEdsdmJpQnZaaUJnWHk1bWFXNWtZQ3dnWUY4dVptbHVaRXhoYzNSZ0xDQmdYeTVtYVc1a1MyVjVZQ3dnWVc1a0lHQmZMbVpwYm1STVlYTjBTMlY1WUN4Y2JpQXFJSGRwZEdodmRYUWdjM1Z3Y0c5eWRDQm1iM0lnWTJGc2JHSmhZMnNnYzJodmNuUm9ZVzVrY3lCaGJtUWdZSFJvYVhOZ0lHSnBibVJwYm1jc0lIZG9hV05vSUdsMFpYSmhkR1Z6WEc0Z0tpQnZkbVZ5SUdCamIyeHNaV04wYVc5dVlDQjFjMmx1WnlCMGFHVWdjSEp2ZG1sa1pXUWdZR1ZoWTJoR2RXNWpZQzVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWHhQWW1wbFkzUjhjM1J5YVc1bmZTQmpiMnhzWldOMGFXOXVJRlJvWlNCamIyeHNaV04wYVc5dUlIUnZJSE5sWVhKamFDNWNiaUFxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUhCeVpXUnBZMkYwWlNCVWFHVWdablZ1WTNScGIyNGdhVzUyYjJ0bFpDQndaWElnYVhSbGNtRjBhVzl1TGx4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdaV0ZqYUVaMWJtTWdWR2hsSUdaMWJtTjBhVzl1SUhSdklHbDBaWEpoZEdVZ2IzWmxjaUJnWTI5c2JHVmpkR2x2Ym1BdVhHNGdLaUJBY0dGeVlXMGdlMkp2YjJ4bFlXNTlJRnR5WlhSTFpYbGRJRk53WldOcFpua2djbVYwZFhKdWFXNW5JSFJvWlNCclpYa2diMllnZEdobElHWnZkVzVrSUdWc1pXMWxiblJjYmlBcUlDQnBibk4wWldGa0lHOW1JSFJvWlNCbGJHVnRaVzUwSUdsMGMyVnNaaTVjYmlBcUlFQnlaWFIxY201eklIc3FmU0JTWlhSMWNtNXpJSFJvWlNCbWIzVnVaQ0JsYkdWdFpXNTBJRzl5SUdsMGN5QnJaWGtzSUdWc2MyVWdZSFZ1WkdWbWFXNWxaR0F1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR0poYzJWR2FXNWtLR052Ykd4bFkzUnBiMjRzSUhCeVpXUnBZMkYwWlN3Z1pXRmphRVoxYm1Nc0lISmxkRXRsZVNrZ2UxeHVJQ0IyWVhJZ2NtVnpkV3gwTzF4dUlDQmxZV05vUm5WdVl5aGpiMnhzWldOMGFXOXVMQ0JtZFc1amRHbHZiaWgyWVd4MVpTd2dhMlY1TENCamIyeHNaV04wYVc5dUtTQjdYRzRnSUNBZ2FXWWdLSEJ5WldScFkyRjBaU2gyWVd4MVpTd2dhMlY1TENCamIyeHNaV04wYVc5dUtTa2dlMXh1SUNBZ0lDQWdjbVZ6ZFd4MElEMGdjbVYwUzJWNUlEOGdhMlY1SURvZ2RtRnNkV1U3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnZlZ4dUlDQjlLVHRjYmlBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYm4xY2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQmlZWE5sUm1sdVpEdGNiaUlzSWk4cUtseHVJQ29nVkdobElHSmhjMlVnYVcxd2JHVnRaVzUwWVhScGIyNGdiMllnWUY4dVptbHVaRWx1WkdWNFlDQmhibVFnWUY4dVptbHVaRXhoYzNSSmJtUmxlR0FnZDJsMGFHOTFkRnh1SUNvZ2MzVndjRzl5ZENCbWIzSWdZMkZzYkdKaFkyc2djMmh2Y25Sb1lXNWtjeUJoYm1RZ1lIUm9hWE5nSUdKcGJtUnBibWN1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUdGeWNtRjVJRlJvWlNCaGNuSmhlU0IwYnlCelpXRnlZMmd1WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQndjbVZrYVdOaGRHVWdWR2hsSUdaMWJtTjBhVzl1SUdsdWRtOXJaV1FnY0dWeUlHbDBaWEpoZEdsdmJpNWNiaUFxSUVCd1lYSmhiU0I3WW05dmJHVmhibjBnVzJaeWIyMVNhV2RvZEYwZ1UzQmxZMmxtZVNCcGRHVnlZWFJwYm1jZ1puSnZiU0J5YVdkb2RDQjBieUJzWldaMExseHVJQ29nUUhKbGRIVnlibk1nZTI1MWJXSmxjbjBnVW1WMGRYSnVjeUIwYUdVZ2FXNWtaWGdnYjJZZ2RHaGxJRzFoZEdOb1pXUWdkbUZzZFdVc0lHVnNjMlVnWUMweFlDNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1ltRnpaVVpwYm1SSmJtUmxlQ2hoY25KaGVTd2djSEpsWkdsallYUmxMQ0JtY205dFVtbG5hSFFwSUh0Y2JpQWdkbUZ5SUd4bGJtZDBhQ0E5SUdGeWNtRjVMbXhsYm1kMGFDeGNiaUFnSUNBZ0lHbHVaR1Y0SUQwZ1puSnZiVkpwWjJoMElEOGdiR1Z1WjNSb0lEb2dMVEU3WEc1Y2JpQWdkMmhwYkdVZ0tDaG1jbTl0VW1sbmFIUWdQeUJwYm1SbGVDMHRJRG9nS3l0cGJtUmxlQ0E4SUd4bGJtZDBhQ2twSUh0Y2JpQWdJQ0JwWmlBb2NISmxaR2xqWVhSbEtHRnljbUY1VzJsdVpHVjRYU3dnYVc1a1pYZ3NJR0Z5Y21GNUtTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHbHVaR1Y0TzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdMVEU3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdZbUZ6WlVacGJtUkpibVJsZUR0Y2JpSXNJblpoY2lCamNtVmhkR1ZDWVhObFJtOXlJRDBnY21WeGRXbHlaU2duTGk5amNtVmhkR1ZDWVhObFJtOXlKeWs3WEc1Y2JpOHFLbHh1SUNvZ1ZHaGxJR0poYzJVZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYjJZZ1lHSmhjMlZHYjNKSmJtQWdZVzVrSUdCaVlYTmxSbTl5VDNkdVlDQjNhR2xqYUNCcGRHVnlZWFJsYzF4dUlDb2diM1psY2lCZ2IySnFaV04wWUNCd2NtOXdaWEowYVdWeklISmxkSFZ5Ym1Wa0lHSjVJR0JyWlhselJuVnVZMkFnYVc1MmIydHBibWNnWUdsMFpYSmhkR1ZsWUNCbWIzSmNiaUFxSUdWaFkyZ2djSEp2Y0dWeWRIa3VJRWwwWlhKaGRHOXlJR1oxYm1OMGFXOXVjeUJ0WVhrZ1pYaHBkQ0JwZEdWeVlYUnBiMjRnWldGeWJIa2dZbmtnWlhod2JHbGphWFJzZVZ4dUlDb2djbVYwZFhKdWFXNW5JR0JtWVd4elpXQXVYRzRnS2x4dUlDb2dRSEJ5YVhaaGRHVmNiaUFxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2WW1wbFkzUWdWR2hsSUc5aWFtVmpkQ0IwYnlCcGRHVnlZWFJsSUc5MlpYSXVYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCcGRHVnlZWFJsWlNCVWFHVWdablZ1WTNScGIyNGdhVzUyYjJ0bFpDQndaWElnYVhSbGNtRjBhVzl1TGx4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdhMlY1YzBaMWJtTWdWR2hsSUdaMWJtTjBhVzl1SUhSdklHZGxkQ0IwYUdVZ2EyVjVjeUJ2WmlCZ2IySnFaV04wWUM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRQWW1wbFkzUjlJRkpsZEhWeWJuTWdZRzlpYW1WamRHQXVYRzRnS2k5Y2JuWmhjaUJpWVhObFJtOXlJRDBnWTNKbFlYUmxRbUZ6WlVadmNpZ3BPMXh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdKaGMyVkdiM0k3WEc0aUxDSjJZWElnWW1GelpVWnZjaUE5SUhKbGNYVnBjbVVvSnk0dlltRnpaVVp2Y2ljcExGeHVJQ0FnSUd0bGVYTkpiaUE5SUhKbGNYVnBjbVVvSnk0dUwyOWlhbVZqZEM5clpYbHpTVzRuS1R0Y2JseHVMeW9xWEc0Z0tpQlVhR1VnWW1GelpTQnBiWEJzWlcxbGJuUmhkR2x2YmlCdlppQmdYeTVtYjNKSmJtQWdkMmwwYUc5MWRDQnpkWEJ3YjNKMElHWnZjaUJqWVd4c1ltRmphMXh1SUNvZ2MyaHZjblJvWVc1a2N5QmhibVFnWUhSb2FYTmdJR0pwYm1ScGJtY3VYRzRnS2x4dUlDb2dRSEJ5YVhaaGRHVmNiaUFxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2WW1wbFkzUWdWR2hsSUc5aWFtVmpkQ0IwYnlCcGRHVnlZWFJsSUc5MlpYSXVYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCcGRHVnlZWFJsWlNCVWFHVWdablZ1WTNScGIyNGdhVzUyYjJ0bFpDQndaWElnYVhSbGNtRjBhVzl1TGx4dUlDb2dRSEpsZEhWeWJuTWdlMDlpYW1WamRIMGdVbVYwZFhKdWN5QmdiMkpxWldOMFlDNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1ltRnpaVVp2Y2tsdUtHOWlhbVZqZEN3Z2FYUmxjbUYwWldVcElIdGNiaUFnY21WMGRYSnVJR0poYzJWR2IzSW9iMkpxWldOMExDQnBkR1Z5WVhSbFpTd2dhMlY1YzBsdUtUdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCaVlYTmxSbTl5U1c0N1hHNGlMQ0oyWVhJZ1ltRnpaVVp2Y2lBOUlISmxjWFZwY21Vb0p5NHZZbUZ6WlVadmNpY3BMRnh1SUNBZ0lHdGxlWE1nUFNCeVpYRjFhWEpsS0NjdUxpOXZZbXBsWTNRdmEyVjVjeWNwTzF4dVhHNHZLaXBjYmlBcUlGUm9aU0JpWVhObElHbHRjR3hsYldWdWRHRjBhVzl1SUc5bUlHQmZMbVp2Y2s5M2JtQWdkMmwwYUc5MWRDQnpkWEJ3YjNKMElHWnZjaUJqWVd4c1ltRmphMXh1SUNvZ2MyaHZjblJvWVc1a2N5QmhibVFnWUhSb2FYTmdJR0pwYm1ScGJtY3VYRzRnS2x4dUlDb2dRSEJ5YVhaaGRHVmNiaUFxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2WW1wbFkzUWdWR2hsSUc5aWFtVmpkQ0IwYnlCcGRHVnlZWFJsSUc5MlpYSXVYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCcGRHVnlZWFJsWlNCVWFHVWdablZ1WTNScGIyNGdhVzUyYjJ0bFpDQndaWElnYVhSbGNtRjBhVzl1TGx4dUlDb2dRSEpsZEhWeWJuTWdlMDlpYW1WamRIMGdVbVYwZFhKdWN5QmdiMkpxWldOMFlDNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1ltRnpaVVp2Y2s5M2JpaHZZbXBsWTNRc0lHbDBaWEpoZEdWbEtTQjdYRzRnSUhKbGRIVnliaUJpWVhObFJtOXlLRzlpYW1WamRDd2dhWFJsY21GMFpXVXNJR3RsZVhNcE8xeHVmVnh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdKaGMyVkdiM0pQZDI0N1hHNGlMQ0oyWVhJZ2FXNWtaWGhQWms1aFRpQTlJSEpsY1hWcGNtVW9KeTR2YVc1a1pYaFBaazVoVGljcE8xeHVYRzR2S2lwY2JpQXFJRlJvWlNCaVlYTmxJR2x0Y0d4bGJXVnVkR0YwYVc5dUlHOW1JR0JmTG1sdVpHVjRUMlpnSUhkcGRHaHZkWFFnYzNWd2NHOXlkQ0JtYjNJZ1ltbHVZWEo1SUhObFlYSmphR1Z6TGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCaGNuSmhlU0JVYUdVZ1lYSnlZWGtnZEc4Z2MyVmhjbU5vTGx4dUlDb2dRSEJoY21GdElIc3FmU0IyWVd4MVpTQlVhR1VnZG1Gc2RXVWdkRzhnYzJWaGNtTm9JR1p2Y2k1Y2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQm1jbTl0U1c1a1pYZ2dWR2hsSUdsdVpHVjRJSFJ2SUhObFlYSmphQ0JtY205dExseHVJQ29nUUhKbGRIVnlibk1nZTI1MWJXSmxjbjBnVW1WMGRYSnVjeUIwYUdVZ2FXNWtaWGdnYjJZZ2RHaGxJRzFoZEdOb1pXUWdkbUZzZFdVc0lHVnNjMlVnWUMweFlDNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1ltRnpaVWx1WkdWNFQyWW9ZWEp5WVhrc0lIWmhiSFZsTENCbWNtOXRTVzVrWlhncElIdGNiaUFnYVdZZ0tIWmhiSFZsSUNFOVBTQjJZV3gxWlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJwYm1SbGVFOW1UbUZPS0dGeWNtRjVMQ0JtY205dFNXNWtaWGdwTzF4dUlDQjlYRzRnSUhaaGNpQnBibVJsZUNBOUlHWnliMjFKYm1SbGVDQXRJREVzWEc0Z0lDQWdJQ0JzWlc1bmRHZ2dQU0JoY25KaGVTNXNaVzVuZEdnN1hHNWNiaUFnZDJocGJHVWdLQ3NyYVc1a1pYZ2dQQ0JzWlc1bmRHZ3BJSHRjYmlBZ0lDQnBaaUFvWVhKeVlYbGJhVzVrWlhoZElEMDlQU0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHbHVaR1Y0TzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdMVEU3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdZbUZ6WlVsdVpHVjRUMlk3WEc0aUxDSjJZWElnWW1GelpVbHpSWEYxWVd4RVpXVndJRDBnY21WeGRXbHlaU2duTGk5aVlYTmxTWE5GY1hWaGJFUmxaWEFuS1R0Y2JseHVMeW9xWEc0Z0tpQlVhR1VnWW1GelpTQnBiWEJzWlcxbGJuUmhkR2x2YmlCdlppQmdYeTVwYzBWeGRXRnNZQ0IzYVhSb2IzVjBJSE4xY0hCdmNuUWdabTl5SUdCMGFHbHpZQ0JpYVc1a2FXNW5YRzRnS2lCZ1kzVnpkRzl0YVhwbGNtQWdablZ1WTNScGIyNXpMbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZXlwOUlIWmhiSFZsSUZSb1pTQjJZV3gxWlNCMGJ5QmpiMjF3WVhKbExseHVJQ29nUUhCaGNtRnRJSHNxZlNCdmRHaGxjaUJVYUdVZ2IzUm9aWElnZG1Gc2RXVWdkRzhnWTI5dGNHRnlaUzVjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlGdGpkWE4wYjIxcGVtVnlYU0JVYUdVZ1puVnVZM1JwYjI0Z2RHOGdZM1Z6ZEc5dGFYcGxJR052YlhCaGNtbHVaeUIyWVd4MVpYTXVYRzRnS2lCQWNHRnlZVzBnZTJKdmIyeGxZVzU5SUZ0cGMweHZiM05sWFNCVGNHVmphV1o1SUhCbGNtWnZjbTFwYm1jZ2NHRnlkR2xoYkNCamIyMXdZWEpwYzI5dWN5NWNiaUFxSUVCd1lYSmhiU0I3UVhKeVlYbDlJRnR6ZEdGamEwRmRJRlJ5WVdOcmN5QjBjbUYyWlhKelpXUWdZSFpoYkhWbFlDQnZZbXBsWTNSekxseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdXM04wWVdOclFsMGdWSEpoWTJ0eklIUnlZWFpsY25ObFpDQmdiM1JvWlhKZ0lHOWlhbVZqZEhNdVhHNGdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjBnVW1WMGRYSnVjeUJnZEhKMVpXQWdhV1lnZEdobElIWmhiSFZsY3lCaGNtVWdaWEYxYVhaaGJHVnVkQ3dnWld4elpTQmdabUZzYzJWZ0xseHVJQ292WEc1bWRXNWpkR2x2YmlCaVlYTmxTWE5GY1hWaGJDaDJZV3gxWlN3Z2IzUm9aWElzSUdOMWMzUnZiV2w2WlhJc0lHbHpURzl2YzJVc0lITjBZV05yUVN3Z2MzUmhZMnRDS1NCN1hHNGdJQzh2SUVWNGFYUWdaV0Z5YkhrZ1ptOXlJR2xrWlc1MGFXTmhiQ0IyWVd4MVpYTXVYRzRnSUdsbUlDaDJZV3gxWlNBOVBUMGdiM1JvWlhJcElIdGNiaUFnSUNBdkx5QlVjbVZoZENCZ0t6QmdJSFp6TGlCZ0xUQmdJR0Z6SUc1dmRDQmxjWFZoYkM1Y2JpQWdJQ0J5WlhSMWNtNGdkbUZzZFdVZ0lUMDlJREFnZkh3Z0tERWdMeUIyWVd4MVpTQTlQU0F4SUM4Z2IzUm9aWElwTzF4dUlDQjlYRzRnSUhaaGNpQjJZV3hVZVhCbElEMGdkSGx3Wlc5bUlIWmhiSFZsTEZ4dUlDQWdJQ0FnYjNSb1ZIbHdaU0E5SUhSNWNHVnZaaUJ2ZEdobGNqdGNibHh1SUNBdkx5QkZlR2wwSUdWaGNteDVJR1p2Y2lCMWJteHBhMlVnY0hKcGJXbDBhWFpsSUhaaGJIVmxjeTVjYmlBZ2FXWWdLQ2gyWVd4VWVYQmxJQ0U5SUNkbWRXNWpkR2x2YmljZ0ppWWdkbUZzVkhsd1pTQWhQU0FuYjJKcVpXTjBKeUFtSmlCdmRHaFVlWEJsSUNFOUlDZG1kVzVqZEdsdmJpY2dKaVlnYjNSb1ZIbHdaU0FoUFNBbmIySnFaV04wSnlrZ2ZIeGNiaUFnSUNBZ0lIWmhiSFZsSUQwOUlHNTFiR3dnZkh3Z2IzUm9aWElnUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJQzh2SUZKbGRIVnliaUJnWm1Gc2MyVmdJSFZ1YkdWemN5QmliM1JvSUhaaGJIVmxjeUJoY21VZ1lFNWhUbUF1WEc0Z0lDQWdjbVYwZFhKdUlIWmhiSFZsSUNFOVBTQjJZV3gxWlNBbUppQnZkR2hsY2lBaFBUMGdiM1JvWlhJN1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUdKaGMyVkpjMFZ4ZFdGc1JHVmxjQ2gyWVd4MVpTd2diM1JvWlhJc0lHSmhjMlZKYzBWeGRXRnNMQ0JqZFhOMGIyMXBlbVZ5TENCcGMweHZiM05sTENCemRHRmphMEVzSUhOMFlXTnJRaWs3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdZbUZ6WlVselJYRjFZV3c3WEc0aUxDSjJZWElnWlhGMVlXeEJjbkpoZVhNZ1BTQnlaWEYxYVhKbEtDY3VMMlZ4ZFdGc1FYSnlZWGx6Snlrc1hHNGdJQ0FnWlhGMVlXeENlVlJoWnlBOUlISmxjWFZwY21Vb0p5NHZaWEYxWVd4Q2VWUmhaeWNwTEZ4dUlDQWdJR1Z4ZFdGc1QySnFaV04wY3lBOUlISmxjWFZwY21Vb0p5NHZaWEYxWVd4UFltcGxZM1J6Snlrc1hHNGdJQ0FnYVhOQmNuSmhlU0E5SUhKbGNYVnBjbVVvSnk0dUwyeGhibWN2YVhOQmNuSmhlU2NwTEZ4dUlDQWdJR2x6U0c5emRFOWlhbVZqZENBOUlISmxjWFZwY21Vb0p5NHZhWE5JYjNOMFQySnFaV04wSnlrc1hHNGdJQ0FnYVhOVWVYQmxaRUZ5Y21GNUlEMGdjbVZ4ZFdseVpTZ25MaTR2YkdGdVp5OXBjMVI1Y0dWa1FYSnlZWGtuS1R0Y2JseHVMeW9xSUdCUFltcGxZM1FqZEc5VGRISnBibWRnSUhKbGMzVnNkQ0J5WldabGNtVnVZMlZ6TGlBcUwxeHVkbUZ5SUdGeVozTlVZV2NnUFNBblcyOWlhbVZqZENCQmNtZDFiV1Z1ZEhOZEp5eGNiaUFnSUNCaGNuSmhlVlJoWnlBOUlDZGJiMkpxWldOMElFRnljbUY1WFNjc1hHNGdJQ0FnWm5WdVkxUmhaeUE5SUNkYmIySnFaV04wSUVaMWJtTjBhVzl1WFNjc1hHNGdJQ0FnYjJKcVpXTjBWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1QySnFaV04wWFNjN1hHNWNiaThxS2lCVmMyVmtJR1p2Y2lCdVlYUnBkbVVnYldWMGFHOWtJSEpsWm1WeVpXNWpaWE11SUNvdlhHNTJZWElnYjJKcVpXTjBVSEp2ZEc4Z1BTQlBZbXBsWTNRdWNISnZkRzkwZVhCbE8xeHVYRzR2S2lvZ1ZYTmxaQ0IwYnlCamFHVmpheUJ2WW1wbFkzUnpJR1p2Y2lCdmQyNGdjSEp2Y0dWeWRHbGxjeTRnS2k5Y2JuWmhjaUJvWVhOUGQyNVFjbTl3WlhKMGVTQTlJRzlpYW1WamRGQnliM1J2TG1oaGMwOTNibEJ5YjNCbGNuUjVPMXh1WEc0dktpcGNiaUFxSUZWelpXUWdkRzhnY21WemIyeDJaU0IwYUdVZ1cyQjBiMU4wY21sdVoxUmhaMkJkS0doMGRIQnpPaTh2Y0dWdmNHeGxMbTF2ZW1sc2JHRXViM0puTDM1cWIzSmxibVJ2Y21abUwyVnpOaTFrY21GbWRDNW9kRzFzSTNObFl5MXZZbXBsWTNRdWNISnZkRzkwZVhCbExuUnZjM1J5YVc1bktWeHVJQ29nYjJZZ2RtRnNkV1Z6TGx4dUlDb3ZYRzUyWVhJZ2IySnFWRzlUZEhKcGJtY2dQU0J2WW1wbFkzUlFjbTkwYnk1MGIxTjBjbWx1Wnp0Y2JseHVMeW9xWEc0Z0tpQkJJSE53WldOcFlXeHBlbVZrSUhabGNuTnBiMjRnYjJZZ1lHSmhjMlZKYzBWeGRXRnNZQ0JtYjNJZ1lYSnlZWGx6SUdGdVpDQnZZbXBsWTNSeklIZG9hV05vSUhCbGNtWnZjbTF6WEc0Z0tpQmtaV1Z3SUdOdmJYQmhjbWx6YjI1eklHRnVaQ0IwY21GamEzTWdkSEpoZG1WeWMyVmtJRzlpYW1WamRITWdaVzVoWW14cGJtY2diMkpxWldOMGN5QjNhWFJvSUdOcGNtTjFiR0Z5WEc0Z0tpQnlaV1psY21WdVkyVnpJSFJ2SUdKbElHTnZiWEJoY21Wa0xseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiMkpxWldOMElGUm9aU0J2WW1wbFkzUWdkRzhnWTI5dGNHRnlaUzVjYmlBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCdmRHaGxjaUJVYUdVZ2IzUm9aWElnYjJKcVpXTjBJSFJ2SUdOdmJYQmhjbVV1WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQmxjWFZoYkVaMWJtTWdWR2hsSUdaMWJtTjBhVzl1SUhSdklHUmxkR1Z5YldsdVpTQmxjWFZwZG1Gc1pXNTBjeUJ2WmlCMllXeDFaWE11WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQmJZM1Z6ZEc5dGFYcGxjbDBnVkdobElHWjFibU4wYVc5dUlIUnZJR04xYzNSdmJXbDZaU0JqYjIxd1lYSnBibWNnYjJKcVpXTjBjeTVjYmlBcUlFQndZWEpoYlNCN1ltOXZiR1ZoYm4wZ1cybHpURzl2YzJWZElGTndaV05wWm5rZ2NHVnlabTl5YldsdVp5QndZWEowYVdGc0lHTnZiWEJoY21semIyNXpMbHh1SUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnVzNOMFlXTnJRVDFiWFYwZ1ZISmhZMnR6SUhSeVlYWmxjbk5sWkNCZ2RtRnNkV1ZnSUc5aWFtVmpkSE11WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCYmMzUmhZMnRDUFZ0ZFhTQlVjbUZqYTNNZ2RISmhkbVZ5YzJWa0lHQnZkR2hsY21BZ2IySnFaV04wY3k1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRpYjI5c1pXRnVmU0JTWlhSMWNtNXpJR0IwY25WbFlDQnBaaUIwYUdVZ2IySnFaV04wY3lCaGNtVWdaWEYxYVhaaGJHVnVkQ3dnWld4elpTQmdabUZzYzJWZ0xseHVJQ292WEc1bWRXNWpkR2x2YmlCaVlYTmxTWE5GY1hWaGJFUmxaWEFvYjJKcVpXTjBMQ0J2ZEdobGNpd2daWEYxWVd4R2RXNWpMQ0JqZFhOMGIyMXBlbVZ5TENCcGMweHZiM05sTENCemRHRmphMEVzSUhOMFlXTnJRaWtnZTF4dUlDQjJZWElnYjJKcVNYTkJjbklnUFNCcGMwRnljbUY1S0c5aWFtVmpkQ2tzWEc0Z0lDQWdJQ0J2ZEdoSmMwRnljaUE5SUdselFYSnlZWGtvYjNSb1pYSXBMRnh1SUNBZ0lDQWdiMkpxVkdGbklEMGdZWEp5WVhsVVlXY3NYRzRnSUNBZ0lDQnZkR2hVWVdjZ1BTQmhjbkpoZVZSaFp6dGNibHh1SUNCcFppQW9JVzlpYWtselFYSnlLU0I3WEc0Z0lDQWdiMkpxVkdGbklEMGdiMkpxVkc5VGRISnBibWN1WTJGc2JDaHZZbXBsWTNRcE8xeHVJQ0FnSUdsbUlDaHZZbXBVWVdjZ1BUMGdZWEpuYzFSaFp5a2dlMXh1SUNBZ0lDQWdiMkpxVkdGbklEMGdiMkpxWldOMFZHRm5PMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9iMkpxVkdGbklDRTlJRzlpYW1WamRGUmhaeWtnZTF4dUlDQWdJQ0FnYjJKcVNYTkJjbklnUFNCcGMxUjVjR1ZrUVhKeVlYa29iMkpxWldOMEtUdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2FXWWdLQ0Z2ZEdoSmMwRnljaWtnZTF4dUlDQWdJRzkwYUZSaFp5QTlJRzlpYWxSdlUzUnlhVzVuTG1OaGJHd29iM1JvWlhJcE8xeHVJQ0FnSUdsbUlDaHZkR2hVWVdjZ1BUMGdZWEpuYzFSaFp5a2dlMXh1SUNBZ0lDQWdiM1JvVkdGbklEMGdiMkpxWldOMFZHRm5PMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9iM1JvVkdGbklDRTlJRzlpYW1WamRGUmhaeWtnZTF4dUlDQWdJQ0FnYjNSb1NYTkJjbklnUFNCcGMxUjVjR1ZrUVhKeVlYa29iM1JvWlhJcE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCMllYSWdiMkpxU1hOUFltb2dQU0FvYjJKcVZHRm5JRDA5SUc5aWFtVmpkRlJoWnlCOGZDQW9hWE5NYjI5elpTQW1KaUJ2WW1wVVlXY2dQVDBnWm5WdVkxUmhaeWtwSUNZbUlDRnBjMGh2YzNSUFltcGxZM1FvYjJKcVpXTjBLU3hjYmlBZ0lDQWdJRzkwYUVselQySnFJRDBnS0c5MGFGUmhaeUE5UFNCdlltcGxZM1JVWVdjZ2ZId2dLR2x6VEc5dmMyVWdKaVlnYjNSb1ZHRm5JRDA5SUdaMWJtTlVZV2NwS1NBbUppQWhhWE5JYjNOMFQySnFaV04wS0c5MGFHVnlLU3hjYmlBZ0lDQWdJR2x6VTJGdFpWUmhaeUE5SUc5aWFsUmhaeUE5UFNCdmRHaFVZV2M3WEc1Y2JpQWdhV1lnS0dselUyRnRaVlJoWnlBbUppQWhLRzlpYWtselFYSnlJSHg4SUc5aWFrbHpUMkpxS1NrZ2UxeHVJQ0FnSUhKbGRIVnliaUJsY1hWaGJFSjVWR0ZuS0c5aWFtVmpkQ3dnYjNSb1pYSXNJRzlpYWxSaFp5azdYRzRnSUgxY2JpQWdhV1lnS0dselRHOXZjMlVwSUh0Y2JpQWdJQ0JwWmlBb0lXbHpVMkZ0WlZSaFp5QW1KaUFoS0c5aWFrbHpUMkpxSUNZbUlHOTBhRWx6VDJKcUtTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJSDFjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0IyWVhJZ2RtRnNWM0poY0hCbFpDQTlJRzlpYWtselQySnFJQ1ltSUdoaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2IySnFaV04wTENBblgxOTNjbUZ3Y0dWa1gxOG5LU3hjYmlBZ0lDQWdJQ0FnYjNSb1YzSmhjSEJsWkNBOUlHOTBhRWx6VDJKcUlDWW1JR2hoYzA5M2JsQnliM0JsY25SNUxtTmhiR3dvYjNSb1pYSXNJQ2RmWDNkeVlYQndaV1JmWHljcE8xeHVYRzRnSUNBZ2FXWWdLSFpoYkZkeVlYQndaV1FnZkh3Z2IzUm9WM0poY0hCbFpDa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHVnhkV0ZzUm5WdVl5aDJZV3hYY21Gd2NHVmtJRDhnYjJKcVpXTjBMblpoYkhWbEtDa2dPaUJ2WW1wbFkzUXNJRzkwYUZkeVlYQndaV1FnUHlCdmRHaGxjaTUyWVd4MVpTZ3BJRG9nYjNSb1pYSXNJR04xYzNSdmJXbDZaWElzSUdselRHOXZjMlVzSUhOMFlXTnJRU3dnYzNSaFkydENLVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLQ0ZwYzFOaGJXVlVZV2NwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ0x5OGdRWE56ZFcxbElHTjVZMnhwWXlCMllXeDFaWE1nWVhKbElHVnhkV0ZzTGx4dUlDQXZMeUJHYjNJZ2JXOXlaU0JwYm1admNtMWhkR2x2YmlCdmJpQmtaWFJsWTNScGJtY2dZMmx5WTNWc1lYSWdjbVZtWlhKbGJtTmxjeUJ6WldVZ2FIUjBjSE02THk5bGN6VXVaMmwwYUhWaUxtbHZMeU5LVHk1Y2JpQWdjM1JoWTJ0QklIeDhJQ2h6ZEdGamEwRWdQU0JiWFNrN1hHNGdJSE4wWVdOclFpQjhmQ0FvYzNSaFkydENJRDBnVzEwcE8xeHVYRzRnSUhaaGNpQnNaVzVuZEdnZ1BTQnpkR0ZqYTBFdWJHVnVaM1JvTzF4dUlDQjNhR2xzWlNBb2JHVnVaM1JvTFMwcElIdGNiaUFnSUNCcFppQW9jM1JoWTJ0QlcyeGxibWQwYUYwZ1BUMGdiMkpxWldOMEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2MzUmhZMnRDVzJ4bGJtZDBhRjBnUFQwZ2IzUm9aWEk3WEc0Z0lDQWdmVnh1SUNCOVhHNGdJQzh2SUVGa1pDQmdiMkpxWldOMFlDQmhibVFnWUc5MGFHVnlZQ0IwYnlCMGFHVWdjM1JoWTJzZ2IyWWdkSEpoZG1WeWMyVmtJRzlpYW1WamRITXVYRzRnSUhOMFlXTnJRUzV3ZFhOb0tHOWlhbVZqZENrN1hHNGdJSE4wWVdOclFpNXdkWE5vS0c5MGFHVnlLVHRjYmx4dUlDQjJZWElnY21WemRXeDBJRDBnS0c5aWFrbHpRWEp5SUQ4Z1pYRjFZV3hCY25KaGVYTWdPaUJsY1hWaGJFOWlhbVZqZEhNcEtHOWlhbVZqZEN3Z2IzUm9aWElzSUdWeGRXRnNSblZ1WXl3Z1kzVnpkRzl0YVhwbGNpd2dhWE5NYjI5elpTd2djM1JoWTJ0QkxDQnpkR0ZqYTBJcE8xeHVYRzRnSUhOMFlXTnJRUzV3YjNBb0tUdGNiaUFnYzNSaFkydENMbkJ2Y0NncE8xeHVYRzRnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1ltRnpaVWx6UlhGMVlXeEVaV1Z3TzF4dUlpd2lMeW9xWEc0Z0tpQlVhR1VnWW1GelpTQnBiWEJzWlcxbGJuUmhkR2x2YmlCdlppQmdYeTVwYzBaMWJtTjBhVzl1WUNCM2FYUm9iM1YwSUhOMWNIQnZjblFnWm05eUlHVnVkbWx5YjI1dFpXNTBjMXh1SUNvZ2QybDBhQ0JwYm1OdmNuSmxZM1FnWUhSNWNHVnZabUFnY21WemRXeDBjeTVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUhzcWZTQjJZV3gxWlNCVWFHVWdkbUZzZFdVZ2RHOGdZMmhsWTJzdVhHNGdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjBnVW1WMGRYSnVjeUJnZEhKMVpXQWdhV1lnWUhaaGJIVmxZQ0JwY3lCamIzSnlaV04wYkhrZ1kyeGhjM05wWm1sbFpDd2daV3h6WlNCZ1ptRnNjMlZnTGx4dUlDb3ZYRzVtZFc1amRHbHZiaUJpWVhObFNYTkdkVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0F2THlCQmRtOXBaQ0JoSUVOb1lXdHlZU0JLU1ZRZ1luVm5JR2x1SUdOdmJYQmhkR2xpYVd4cGRIa2diVzlrWlhNZ2IyWWdTVVVnTVRFdVhHNGdJQzh2SUZObFpTQm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZhbUZ6YUd0bGJtRnpMM1Z1WkdWeWMyTnZjbVV2YVhOemRXVnpMekUyTWpFZ1ptOXlJRzF2Y21VZ1pHVjBZV2xzY3k1Y2JpQWdjbVYwZFhKdUlIUjVjR1Z2WmlCMllXeDFaU0E5UFNBblpuVnVZM1JwYjI0bklIeDhJR1poYkhObE8xeHVmVnh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdKaGMyVkpjMFoxYm1OMGFXOXVPMXh1SWl3aWRtRnlJR0poYzJWSmMwVnhkV0ZzSUQwZ2NtVnhkV2x5WlNnbkxpOWlZWE5sU1hORmNYVmhiQ2NwTzF4dVhHNHZLaXBjYmlBcUlGUm9aU0JpWVhObElHbHRjR3hsYldWdWRHRjBhVzl1SUc5bUlHQmZMbWx6VFdGMFkyaGdJSGRwZEdodmRYUWdjM1Z3Y0c5eWRDQm1iM0lnWTJGc2JHSmhZMnRjYmlBcUlITm9iM0owYUdGdVpITWdZVzVrSUdCMGFHbHpZQ0JpYVc1a2FXNW5MbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjJKcVpXTjBJRlJvWlNCdlltcGxZM1FnZEc4Z2FXNXpjR1ZqZEM1Y2JpQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlIQnliM0J6SUZSb1pTQnpiM1Z5WTJVZ2NISnZjR1Z5ZEhrZ2JtRnRaWE1nZEc4Z2JXRjBZMmd1WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCMllXeDFaWE1nVkdobElITnZkWEpqWlNCMllXeDFaWE1nZEc4Z2JXRjBZMmd1WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCemRISnBZM1JEYjIxd1lYSmxSbXhoWjNNZ1UzUnlhV04wSUdOdmJYQmhjbWx6YjI0Z1pteGhaM01nWm05eUlITnZkWEpqWlNCMllXeDFaWE11WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQmJZM1Z6ZEc5dGFYcGxjbDBnVkdobElHWjFibU4wYVc5dUlIUnZJR04xYzNSdmJXbDZaU0JqYjIxd1lYSnBibWNnYjJKcVpXTjBjeTVjYmlBcUlFQnlaWFIxY201eklIdGliMjlzWldGdWZTQlNaWFIxY201eklHQjBjblZsWUNCcFppQmdiMkpxWldOMFlDQnBjeUJoSUcxaGRHTm9MQ0JsYkhObElHQm1ZV3h6WldBdVhHNGdLaTljYm1aMWJtTjBhVzl1SUdKaGMyVkpjMDFoZEdOb0tHOWlhbVZqZEN3Z2NISnZjSE1zSUhaaGJIVmxjeXdnYzNSeWFXTjBRMjl0Y0dGeVpVWnNZV2R6TENCamRYTjBiMjFwZW1WeUtTQjdYRzRnSUhaaGNpQnBibVJsZUNBOUlDMHhMRnh1SUNBZ0lDQWdiR1Z1WjNSb0lEMGdjSEp2Y0hNdWJHVnVaM1JvTEZ4dUlDQWdJQ0FnYm05RGRYTjBiMjFwZW1WeUlEMGdJV04xYzNSdmJXbDZaWEk3WEc1Y2JpQWdkMmhwYkdVZ0tDc3JhVzVrWlhnZ1BDQnNaVzVuZEdncElIdGNiaUFnSUNCcFppQW9LRzV2UTNWemRHOXRhWHBsY2lBbUppQnpkSEpwWTNSRGIyMXdZWEpsUm14aFozTmJhVzVrWlhoZEtWeHVJQ0FnSUNBZ0lDQWdJRDhnZG1Gc2RXVnpXMmx1WkdWNFhTQWhQVDBnYjJKcVpXTjBXM0J5YjNCelcybHVaR1Y0WFYxY2JpQWdJQ0FnSUNBZ0lDQTZJQ0VvY0hKdmNITmJhVzVrWlhoZElHbHVJRzlpYW1WamRDbGNiaUFnSUNBZ0lDQWdLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUdsdVpHVjRJRDBnTFRFN1hHNGdJSGRvYVd4bElDZ3JLMmx1WkdWNElEd2diR1Z1WjNSb0tTQjdYRzRnSUNBZ2RtRnlJR3RsZVNBOUlIQnliM0J6VzJsdVpHVjRYU3hjYmlBZ0lDQWdJQ0FnYjJKcVZtRnNkV1VnUFNCdlltcGxZM1JiYTJWNVhTeGNiaUFnSUNBZ0lDQWdjM0pqVm1Gc2RXVWdQU0IyWVd4MVpYTmJhVzVrWlhoZE8xeHVYRzRnSUNBZ2FXWWdLRzV2UTNWemRHOXRhWHBsY2lBbUppQnpkSEpwWTNSRGIyMXdZWEpsUm14aFozTmJhVzVrWlhoZEtTQjdYRzRnSUNBZ0lDQjJZWElnY21WemRXeDBJRDBnZEhsd1pXOW1JRzlpYWxaaGJIVmxJQ0U5SUNkMWJtUmxabWx1WldRbklIeDhJQ2hyWlhrZ2FXNGdiMkpxWldOMEtUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnY21WemRXeDBJRDBnWTNWemRHOXRhWHBsY2lBL0lHTjFjM1J2YldsNlpYSW9iMkpxVm1Gc2RXVXNJSE55WTFaaGJIVmxMQ0JyWlhrcElEb2dkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJ5WlhOMWJIUWdQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdZbUZ6WlVselJYRjFZV3dvYzNKalZtRnNkV1VzSUc5aWFsWmhiSFZsTENCamRYTjBiMjFwZW1WeUxDQjBjblZsS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0NGeVpYTjFiSFFwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2NtVjBkWEp1SUhSeWRXVTdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1ltRnpaVWx6VFdGMFkyZzdYRzRpTENJdktpcGNiaUFxSUZSb1pTQm1kVzVqZEdsdmJpQjNhRzl6WlNCd2NtOTBiM1I1Y0dVZ1lXeHNJR05vWVdsdWFXNW5JSGR5WVhCd1pYSnpJR2x1YUdWeWFYUWdabkp2YlM1Y2JpQXFYRzRnS2lCQWNISnBkbUYwWlZ4dUlDb3ZYRzVtZFc1amRHbHZiaUJpWVhObFRHOWtZWE5vS0NrZ2UxeHVJQ0F2THlCT2J5QnZjR1Z5WVhScGIyNGdjR1Z5Wm05eWJXVmtMbHh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHSmhjMlZNYjJSaGMyZzdYRzRpTENKMllYSWdZbUZ6WlVWaFkyZ2dQU0J5WlhGMWFYSmxLQ2N1TDJKaGMyVkZZV05vSnlrN1hHNWNiaThxS2x4dUlDb2dWR2hsSUdKaGMyVWdhVzF3YkdWdFpXNTBZWFJwYjI0Z2IyWWdZRjh1YldGd1lDQjNhWFJvYjNWMElITjFjSEJ2Y25RZ1ptOXlJR05oYkd4aVlXTnJJSE5vYjNKMGFHRnVaSE5jYmlBcUlHRnVaQ0JnZEdocGMyQWdZbWx1WkdsdVp5NWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYeFBZbXBsWTNSOGMzUnlhVzVuZlNCamIyeHNaV04wYVc5dUlGUm9aU0JqYjJ4c1pXTjBhVzl1SUhSdklHbDBaWEpoZEdVZ2IzWmxjaTVjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHbDBaWEpoZEdWbElGUm9aU0JtZFc1amRHbHZiaUJwYm5admEyVmtJSEJsY2lCcGRHVnlZWFJwYjI0dVhHNGdLaUJBY21WMGRYSnVjeUI3UVhKeVlYbDlJRkpsZEhWeWJuTWdkR2hsSUc1bGR5QnRZWEJ3WldRZ1lYSnlZWGt1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR0poYzJWTllYQW9ZMjlzYkdWamRHbHZiaXdnYVhSbGNtRjBaV1VwSUh0Y2JpQWdkbUZ5SUhKbGMzVnNkQ0E5SUZ0ZE8xeHVJQ0JpWVhObFJXRmphQ2hqYjJ4c1pXTjBhVzl1TENCbWRXNWpkR2x2YmloMllXeDFaU3dnYTJWNUxDQmpiMnhzWldOMGFXOXVLU0I3WEc0Z0lDQWdjbVZ6ZFd4MExuQjFjMmdvYVhSbGNtRjBaV1VvZG1Gc2RXVXNJR3RsZVN3Z1kyOXNiR1ZqZEdsdmJpa3BPMXh1SUNCOUtUdGNiaUFnY21WMGRYSnVJSEpsYzNWc2REdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCaVlYTmxUV0Z3TzF4dUlpd2lkbUZ5SUdKaGMyVkpjMDFoZEdOb0lEMGdjbVZ4ZFdseVpTZ25MaTlpWVhObFNYTk5ZWFJqYUNjcExGeHVJQ0FnSUdOdmJuTjBZVzUwSUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkdsMGVTOWpiMjV6ZEdGdWRDY3BMRnh1SUNBZ0lHbHpVM1J5YVdOMFEyOXRjR0Z5WVdKc1pTQTlJSEpsY1hWcGNtVW9KeTR2YVhOVGRISnBZM1JEYjIxd1lYSmhZbXhsSnlrc1hHNGdJQ0FnYTJWNWN5QTlJSEpsY1hWcGNtVW9KeTR1TDI5aWFtVmpkQzlyWlhsekp5a3NYRzRnSUNBZ2RHOVBZbXBsWTNRZ1BTQnlaWEYxYVhKbEtDY3VMM1J2VDJKcVpXTjBKeWs3WEc1Y2JpOHFLbHh1SUNvZ1ZHaGxJR0poYzJVZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYjJZZ1lGOHViV0YwWTJobGMyQWdkMmhwWTJnZ1pHOWxjeUJ1YjNRZ1kyeHZibVVnWUhOdmRYSmpaV0F1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCemIzVnlZMlVnVkdobElHOWlhbVZqZENCdlppQndjbTl3WlhKMGVTQjJZV3gxWlhNZ2RHOGdiV0YwWTJndVhHNGdLaUJBY21WMGRYSnVjeUI3Um5WdVkzUnBiMjU5SUZKbGRIVnlibk1nZEdobElHNWxkeUJtZFc1amRHbHZiaTVjYmlBcUwxeHVablZ1WTNScGIyNGdZbUZ6WlUxaGRHTm9aWE1vYzI5MWNtTmxLU0I3WEc0Z0lIWmhjaUJ3Y205d2N5QTlJR3RsZVhNb2MyOTFjbU5sS1N4Y2JpQWdJQ0FnSUd4bGJtZDBhQ0E5SUhCeWIzQnpMbXhsYm1kMGFEdGNibHh1SUNCcFppQW9JV3hsYm1kMGFDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCamIyNXpkR0Z1ZENoMGNuVmxLVHRjYmlBZ2ZWeHVJQ0JwWmlBb2JHVnVaM1JvSUQwOUlERXBJSHRjYmlBZ0lDQjJZWElnYTJWNUlEMGdjSEp2Y0hOYk1GMHNYRzRnSUNBZ0lDQWdJSFpoYkhWbElEMGdjMjkxY21ObFcydGxlVjA3WEc1Y2JpQWdJQ0JwWmlBb2FYTlRkSEpwWTNSRGIyMXdZWEpoWW14bEtIWmhiSFZsS1NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0c5aWFtVmpkQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYjJKcVpXTjBJQ0U5SUc1MWJHd2dKaVlnYjJKcVpXTjBXMnRsZVYwZ1BUMDlJSFpoYkhWbElDWW1YRzRnSUNBZ0lDQWdJQ0FnS0hSNWNHVnZaaUIyWVd4MVpTQWhQU0FuZFc1a1pXWnBibVZrSnlCOGZDQW9hMlY1SUdsdUlIUnZUMkpxWldOMEtHOWlhbVZqZENrcEtUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lIWmhjaUIyWVd4MVpYTWdQU0JCY25KaGVTaHNaVzVuZEdncExGeHVJQ0FnSUNBZ2MzUnlhV04wUTI5dGNHRnlaVVpzWVdkeklEMGdRWEp5WVhrb2JHVnVaM1JvS1R0Y2JseHVJQ0IzYUdsc1pTQW9iR1Z1WjNSb0xTMHBJSHRjYmlBZ0lDQjJZV3gxWlNBOUlITnZkWEpqWlZ0d2NtOXdjMXRzWlc1bmRHaGRYVHRjYmlBZ0lDQjJZV3gxWlhOYmJHVnVaM1JvWFNBOUlIWmhiSFZsTzF4dUlDQWdJSE4wY21samRFTnZiWEJoY21WR2JHRm5jMXRzWlc1bmRHaGRJRDBnYVhOVGRISnBZM1JEYjIxd1lYSmhZbXhsS0haaGJIVmxLVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9iMkpxWldOMEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUc5aWFtVmpkQ0FoUFNCdWRXeHNJQ1ltSUdKaGMyVkpjMDFoZEdOb0tIUnZUMkpxWldOMEtHOWlhbVZqZENrc0lIQnliM0J6TENCMllXeDFaWE1zSUhOMGNtbGpkRU52YlhCaGNtVkdiR0ZuY3lrN1hHNGdJSDA3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdZbUZ6WlUxaGRHTm9aWE03WEc0aUxDSjJZWElnWW1GelpVbHpSWEYxWVd3Z1BTQnlaWEYxYVhKbEtDY3VMMkpoYzJWSmMwVnhkV0ZzSnlrc1hHNGdJQ0FnYVhOVGRISnBZM1JEYjIxd1lYSmhZbXhsSUQwZ2NtVnhkV2x5WlNnbkxpOXBjMU4wY21samRFTnZiWEJoY21GaWJHVW5LU3hjYmlBZ0lDQjBiMDlpYW1WamRDQTlJSEpsY1hWcGNtVW9KeTR2ZEc5UFltcGxZM1FuS1R0Y2JseHVMeW9xWEc0Z0tpQlVhR1VnWW1GelpTQnBiWEJzWlcxbGJuUmhkR2x2YmlCdlppQmdYeTV0WVhSamFHVnpVSEp2Y0dWeWRIbGdJSGRvYVdOb0lHUnZaWE1nYm05MElHTnZaWEpqWlNCZ2EyVjVZRnh1SUNvZ2RHOGdZU0J6ZEhKcGJtY3VYRzRnS2x4dUlDb2dRSEJ5YVhaaGRHVmNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0JyWlhrZ1ZHaGxJR3RsZVNCdlppQjBhR1VnY0hKdmNHVnlkSGtnZEc4Z1oyVjBMbHh1SUNvZ1FIQmhjbUZ0SUhzcWZTQjJZV3gxWlNCVWFHVWdkbUZzZFdVZ2RHOGdZMjl0Y0dGeVpTNWNiaUFxSUVCeVpYUjFjbTV6SUh0R2RXNWpkR2x2Ym4wZ1VtVjBkWEp1Y3lCMGFHVWdibVYzSUdaMWJtTjBhVzl1TGx4dUlDb3ZYRzVtZFc1amRHbHZiaUJpWVhObFRXRjBZMmhsYzFCeWIzQmxjblI1S0d0bGVTd2dkbUZzZFdVcElIdGNiaUFnYVdZZ0tHbHpVM1J5YVdOMFEyOXRjR0Z5WVdKc1pTaDJZV3gxWlNrcElIdGNiaUFnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRvYjJKcVpXTjBLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdiMkpxWldOMElDRTlJRzUxYkd3Z0ppWWdiMkpxWldOMFcydGxlVjBnUFQwOUlIWmhiSFZsSUNZbVhHNGdJQ0FnSUNBZ0lDaDBlWEJsYjJZZ2RtRnNkV1VnSVQwZ0ozVnVaR1ZtYVc1bFpDY2dmSHdnS0d0bGVTQnBiaUIwYjA5aWFtVmpkQ2h2WW1wbFkzUXBLU2s3WEc0Z0lDQWdmVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9iMkpxWldOMEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUc5aWFtVmpkQ0FoUFNCdWRXeHNJQ1ltSUdKaGMyVkpjMFZ4ZFdGc0tIWmhiSFZsTENCdlltcGxZM1JiYTJWNVhTd2diblZzYkN3Z2RISjFaU2s3WEc0Z0lIMDdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1ltRnpaVTFoZEdOb1pYTlFjbTl3WlhKMGVUdGNiaUlzSWk4cUtseHVJQ29nVkdobElHSmhjMlVnYVcxd2JHVnRaVzUwWVhScGIyNGdiMllnWUY4dWNISnZjR1Z5ZEhsZ0lIZG9hV05vSUdSdlpYTWdibTkwSUdOdlpYSmpaU0JnYTJWNVlDQjBieUJoSUhOMGNtbHVaeTVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUd0bGVTQlVhR1VnYTJWNUlHOW1JSFJvWlNCd2NtOXdaWEowZVNCMGJ5Qm5aWFF1WEc0Z0tpQkFjbVYwZFhKdWN5QjdSblZ1WTNScGIyNTlJRkpsZEhWeWJuTWdkR2hsSUc1bGR5Qm1kVzVqZEdsdmJpNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1ltRnpaVkJ5YjNCbGNuUjVLR3RsZVNrZ2UxeHVJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9iMkpxWldOMEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUc5aWFtVmpkQ0E5UFNCdWRXeHNJRDhnZFc1a1pXWnBibVZrSURvZ2IySnFaV04wVzJ0bGVWMDdYRzRnSUgwN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWW1GelpWQnliM0JsY25SNU8xeHVJaXdpZG1GeUlHbGtaVzUwYVhSNUlEMGdjbVZ4ZFdseVpTZ25MaTR2ZFhScGJHbDBlUzlwWkdWdWRHbDBlU2NwTEZ4dUlDQWdJRzFsZEdGTllYQWdQU0J5WlhGMWFYSmxLQ2N1TDIxbGRHRk5ZWEFuS1R0Y2JseHVMeW9xWEc0Z0tpQlVhR1VnWW1GelpTQnBiWEJzWlcxbGJuUmhkR2x2YmlCdlppQmdjMlYwUkdGMFlXQWdkMmwwYUc5MWRDQnpkWEJ3YjNKMElHWnZjaUJvYjNRZ2JHOXZjQ0JrWlhSbFkzUnBiMjR1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHWjFibU1nVkdobElHWjFibU4wYVc5dUlIUnZJR0Z6YzI5amFXRjBaU0J0WlhSaFpHRjBZU0IzYVhSb0xseHVJQ29nUUhCaGNtRnRJSHNxZlNCa1lYUmhJRlJvWlNCdFpYUmhaR0YwWVM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRHZFc1amRHbHZibjBnVW1WMGRYSnVjeUJnWm5WdVkyQXVYRzRnS2k5Y2JuWmhjaUJpWVhObFUyVjBSR0YwWVNBOUlDRnRaWFJoVFdGd0lEOGdhV1JsYm5ScGRIa2dPaUJtZFc1amRHbHZiaWhtZFc1akxDQmtZWFJoS1NCN1hHNGdJRzFsZEdGTllYQXVjMlYwS0daMWJtTXNJR1JoZEdFcE8xeHVJQ0J5WlhSMWNtNGdablZ1WXp0Y2JuMDdYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWW1GelpWTmxkRVJoZEdFN1hHNGlMQ0l2S2lwY2JpQXFJRU52Ym5abGNuUnpJR0IyWVd4MVpXQWdkRzhnWVNCemRISnBibWNnYVdZZ2FYUWdhWE1nYm05MElHOXVaUzRnUVc0Z1pXMXdkSGtnYzNSeWFXNW5JR2x6SUhKbGRIVnlibVZrWEc0Z0tpQm1iM0lnWUc1MWJHeGdJRzl5SUdCMWJtUmxabWx1WldSZ0lIWmhiSFZsY3k1Y2JpQXFYRzRnS2lCQWNISnBkbUYwWlZ4dUlDb2dRSEJoY21GdElIc3FmU0IyWVd4MVpTQlVhR1VnZG1Gc2RXVWdkRzhnY0hKdlkyVnpjeTVjYmlBcUlFQnlaWFIxY201eklIdHpkSEpwYm1kOUlGSmxkSFZ5Ym5NZ2RHaGxJSE4wY21sdVp5NWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1ltRnpaVlJ2VTNSeWFXNW5LSFpoYkhWbEtTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2RtRnNkV1VnUFQwZ0ozTjBjbWx1WnljcElIdGNiaUFnSUNCeVpYUjFjbTRnZG1Gc2RXVTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlIWmhiSFZsSUQwOUlHNTFiR3dnUHlBbkp5QTZJQ2gyWVd4MVpTQXJJQ2NuS1R0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JpWVhObFZHOVRkSEpwYm1jN1hHNGlMQ0oyWVhJZ1ltbHVZWEo1U1c1a1pYaENlU0E5SUhKbGNYVnBjbVVvSnk0dlltbHVZWEo1U1c1a1pYaENlU2NwTEZ4dUlDQWdJR2xrWlc1MGFYUjVJRDBnY21WeGRXbHlaU2duTGk0dmRYUnBiR2wwZVM5cFpHVnVkR2wwZVNjcE8xeHVYRzR2S2lvZ1ZYTmxaQ0JoY3lCeVpXWmxjbVZ1WTJWeklHWnZjaUIwYUdVZ2JXRjRhVzExYlNCc1pXNW5kR2dnWVc1a0lHbHVaR1Y0SUc5bUlHRnVJR0Z5Y21GNUxpQXFMMXh1ZG1GeUlFMUJXRjlCVWxKQldWOU1SVTVIVkVnZ1BTQk5ZWFJvTG5CdmR5Z3lMQ0F6TWlrZ0xTQXhMRnh1SUNBZ0lFaEJURVpmVFVGWVgwRlNVa0ZaWDB4RlRrZFVTQ0E5SUUxQldGOUJVbEpCV1Y5TVJVNUhWRWdnUGo0K0lERTdYRzVjYmk4cUtseHVJQ29nVUdWeVptOXliWE1nWVNCaWFXNWhjbmtnYzJWaGNtTm9JRzltSUdCaGNuSmhlV0FnZEc4Z1pHVjBaWEp0YVc1bElIUm9aU0JwYm1SbGVDQmhkQ0IzYUdsamFDQmdkbUZzZFdWZ1hHNGdLaUJ6YUc5MWJHUWdZbVVnYVc1elpYSjBaV1FnYVc1MGJ5QmdZWEp5WVhsZ0lHbHVJRzl5WkdWeUlIUnZJRzFoYVc1MFlXbHVJR2wwY3lCemIzSjBJRzl5WkdWeUxseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQmhjbkpoZVNCVWFHVWdjMjl5ZEdWa0lHRnljbUY1SUhSdklHbHVjM0JsWTNRdVhHNGdLaUJBY0dGeVlXMGdleXA5SUhaaGJIVmxJRlJvWlNCMllXeDFaU0IwYnlCbGRtRnNkV0YwWlM1Y2JpQXFJRUJ3WVhKaGJTQjdZbTl2YkdWaGJuMGdXM0psZEVocFoyaGxjM1JkSUZOd1pXTnBabmtnY21WMGRYSnVhVzVuSUhSb1pTQm9hV2RvWlhOMElIRjFZV3hwWm1sbFpDQnBibVJsZUM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHR1ZFcxaVpYSjlJRkpsZEhWeWJuTWdkR2hsSUdsdVpHVjRJR0YwSUhkb2FXTm9JR0IyWVd4MVpXQWdjMmh2ZFd4a0lHSmxJR2x1YzJWeWRHVmtYRzRnS2lBZ2FXNTBieUJnWVhKeVlYbGdMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQmlhVzVoY25sSmJtUmxlQ2hoY25KaGVTd2dkbUZzZFdVc0lISmxkRWhwWjJobGMzUXBJSHRjYmlBZ2RtRnlJR3h2ZHlBOUlEQXNYRzRnSUNBZ0lDQm9hV2RvSUQwZ1lYSnlZWGtnUHlCaGNuSmhlUzVzWlc1bmRHZ2dPaUJzYjNjN1hHNWNiaUFnYVdZZ0tIUjVjR1Z2WmlCMllXeDFaU0E5UFNBbmJuVnRZbVZ5SnlBbUppQjJZV3gxWlNBOVBUMGdkbUZzZFdVZ0ppWWdhR2xuYUNBOFBTQklRVXhHWDAxQldGOUJVbEpCV1Y5TVJVNUhWRWdwSUh0Y2JpQWdJQ0IzYUdsc1pTQW9iRzkzSUR3Z2FHbG5hQ2tnZTF4dUlDQWdJQ0FnZG1GeUlHMXBaQ0E5SUNoc2IzY2dLeUJvYVdkb0tTQStQajRnTVN4Y2JpQWdJQ0FnSUNBZ0lDQmpiMjF3ZFhSbFpDQTlJR0Z5Y21GNVcyMXBaRjA3WEc1Y2JpQWdJQ0FnSUdsbUlDaHlaWFJJYVdkb1pYTjBJRDhnS0dOdmJYQjFkR1ZrSUR3OUlIWmhiSFZsS1NBNklDaGpiMjF3ZFhSbFpDQThJSFpoYkhWbEtTa2dlMXh1SUNBZ0lDQWdJQ0JzYjNjZ1BTQnRhV1FnS3lBeE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2FHbG5hQ0E5SUcxcFpEdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR2hwWjJnN1hHNGdJSDFjYmlBZ2NtVjBkWEp1SUdKcGJtRnllVWx1WkdWNFFua29ZWEp5WVhrc0lIWmhiSFZsTENCcFpHVnVkR2wwZVN3Z2NtVjBTR2xuYUdWemRDazdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1ltbHVZWEo1U1c1a1pYZzdYRzRpTENJdktpb2dUbUYwYVhabElHMWxkR2h2WkNCeVpXWmxjbVZ1WTJWekxpQXFMMXh1ZG1GeUlHWnNiMjl5SUQwZ1RXRjBhQzVtYkc5dmNqdGNibHh1THlvZ1RtRjBhWFpsSUcxbGRHaHZaQ0J5WldabGNtVnVZMlZ6SUdadmNpQjBhRzl6WlNCM2FYUm9JSFJvWlNCellXMWxJRzVoYldVZ1lYTWdiM1JvWlhJZ1lHeHZaR0Z6YUdBZ2JXVjBhRzlrY3k0Z0tpOWNiblpoY2lCdVlYUnBkbVZOYVc0Z1BTQk5ZWFJvTG0xcGJqdGNibHh1THlvcUlGVnpaV1FnWVhNZ2NtVm1aWEpsYm1ObGN5Qm1iM0lnZEdobElHMWhlR2x0ZFcwZ2JHVnVaM1JvSUdGdVpDQnBibVJsZUNCdlppQmhiaUJoY25KaGVTNGdLaTljYm5aaGNpQk5RVmhmUVZKU1FWbGZURVZPUjFSSUlEMGdUV0YwYUM1d2IzY29NaXdnTXpJcElDMGdNU3hjYmlBZ0lDQk5RVmhmUVZKU1FWbGZTVTVFUlZnZ1BTQWdUVUZZWDBGU1VrRlpYMHhGVGtkVVNDQXRJREU3WEc1Y2JpOHFLbHh1SUNvZ1ZHaHBjeUJtZFc1amRHbHZiaUJwY3lCc2FXdGxJR0JpYVc1aGNubEpibVJsZUdBZ1pYaGpaWEIwSUhSb1lYUWdhWFFnYVc1MmIydGxjeUJnYVhSbGNtRjBaV1ZnSUdadmNseHVJQ29nWUhaaGJIVmxZQ0JoYm1RZ1pXRmphQ0JsYkdWdFpXNTBJRzltSUdCaGNuSmhlV0FnZEc4Z1kyOXRjSFYwWlNCMGFHVnBjaUJ6YjNKMElISmhibXRwYm1jdUlGUm9aVnh1SUNvZ2FYUmxjbUYwWldVZ2FYTWdhVzUyYjJ0bFpDQjNhWFJvSUc5dVpTQmhjbWQxYldWdWREc2dLSFpoYkhWbEtTNWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdZWEp5WVhrZ1ZHaGxJSE52Y25SbFpDQmhjbkpoZVNCMGJ5QnBibk53WldOMExseHVJQ29nUUhCaGNtRnRJSHNxZlNCMllXeDFaU0JVYUdVZ2RtRnNkV1VnZEc4Z1pYWmhiSFZoZEdVdVhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JwZEdWeVlYUmxaU0JVYUdVZ1puVnVZM1JwYjI0Z2FXNTJiMnRsWkNCd1pYSWdhWFJsY21GMGFXOXVMbHh1SUNvZ1FIQmhjbUZ0SUh0aWIyOXNaV0Z1ZlNCYmNtVjBTR2xuYUdWemRGMGdVM0JsWTJsbWVTQnlaWFIxY201cGJtY2dkR2hsSUdocFoyaGxjM1FnY1hWaGJHbG1hV1ZrSUdsdVpHVjRMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UyNTFiV0psY24wZ1VtVjBkWEp1Y3lCMGFHVWdhVzVrWlhnZ1lYUWdkMmhwWTJnZ1lIWmhiSFZsWUNCemFHOTFiR1FnWW1VZ2FXNXpaWEowWldSY2JpQXFJQ0JwYm5SdklHQmhjbkpoZVdBdVhHNGdLaTljYm1aMWJtTjBhVzl1SUdKcGJtRnllVWx1WkdWNFFua29ZWEp5WVhrc0lIWmhiSFZsTENCcGRHVnlZWFJsWlN3Z2NtVjBTR2xuYUdWemRDa2dlMXh1SUNCMllXeDFaU0E5SUdsMFpYSmhkR1ZsS0haaGJIVmxLVHRjYmx4dUlDQjJZWElnYkc5M0lEMGdNQ3hjYmlBZ0lDQWdJR2hwWjJnZ1BTQmhjbkpoZVNBL0lHRnljbUY1TG14bGJtZDBhQ0E2SURBc1hHNGdJQ0FnSUNCMllXeEpjMDVoVGlBOUlIWmhiSFZsSUNFOVBTQjJZV3gxWlN4Y2JpQWdJQ0FnSUhaaGJFbHpWVzVrWldZZ1BTQjBlWEJsYjJZZ2RtRnNkV1VnUFQwZ0ozVnVaR1ZtYVc1bFpDYzdYRzVjYmlBZ2QyaHBiR1VnS0d4dmR5QThJR2hwWjJncElIdGNiaUFnSUNCMllYSWdiV2xrSUQwZ1pteHZiM0lvS0d4dmR5QXJJR2hwWjJncElDOGdNaWtzWEc0Z0lDQWdJQ0FnSUdOdmJYQjFkR1ZrSUQwZ2FYUmxjbUYwWldVb1lYSnlZWGxiYldsa1hTa3NYRzRnSUNBZ0lDQWdJR2x6VW1WbWJHVjRhWFpsSUQwZ1kyOXRjSFYwWldRZ1BUMDlJR052YlhCMWRHVmtPMXh1WEc0Z0lDQWdhV1lnS0haaGJFbHpUbUZPS1NCN1hHNGdJQ0FnSUNCMllYSWdjMlYwVEc5M0lEMGdhWE5TWldac1pYaHBkbVVnZkh3Z2NtVjBTR2xuYUdWemREdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIWmhiRWx6Vlc1a1pXWXBJSHRjYmlBZ0lDQWdJSE5sZEV4dmR5QTlJR2x6VW1WbWJHVjRhWFpsSUNZbUlDaHlaWFJJYVdkb1pYTjBJSHg4SUhSNWNHVnZaaUJqYjIxd2RYUmxaQ0FoUFNBbmRXNWtaV1pwYm1Wa0p5azdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhObGRFeHZkeUE5SUhKbGRFaHBaMmhsYzNRZ1B5QW9ZMjl0Y0hWMFpXUWdQRDBnZG1Gc2RXVXBJRG9nS0dOdmJYQjFkR1ZrSUR3Z2RtRnNkV1VwTzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvYzJWMFRHOTNLU0I3WEc0Z0lDQWdJQ0JzYjNjZ1BTQnRhV1FnS3lBeE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JvYVdkb0lEMGdiV2xrTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdibUYwYVhabFRXbHVLR2hwWjJnc0lFMUJXRjlCVWxKQldWOUpUa1JGV0NrN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWW1sdVlYSjVTVzVrWlhoQ2VUdGNiaUlzSW5aaGNpQnBaR1Z1ZEdsMGVTQTlJSEpsY1hWcGNtVW9KeTR1TDNWMGFXeHBkSGt2YVdSbGJuUnBkSGtuS1R0Y2JseHVMeW9xWEc0Z0tpQkJJSE53WldOcFlXeHBlbVZrSUhabGNuTnBiMjRnYjJZZ1lHSmhjMlZEWVd4c1ltRmphMkFnZDJocFkyZ2diMjVzZVNCemRYQndiM0owY3lCZ2RHaHBjMkFnWW1sdVpHbHVaMXh1SUNvZ1lXNWtJSE53WldOcFpubHBibWNnZEdobElHNTFiV0psY2lCdlppQmhjbWQxYldWdWRITWdkRzhnY0hKdmRtbGtaU0IwYnlCZ1puVnVZMkF1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHWjFibU1nVkdobElHWjFibU4wYVc5dUlIUnZJR0pwYm1RdVhHNGdLaUJBY0dGeVlXMGdleXA5SUhSb2FYTkJjbWNnVkdobElHQjBhR2x6WUNCaWFXNWthVzVuSUc5bUlHQm1kVzVqWUM1Y2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQmJZWEpuUTI5MWJuUmRJRlJvWlNCdWRXMWlaWElnYjJZZ1lYSm5kVzFsYm5SeklIUnZJSEJ5YjNacFpHVWdkRzhnWUdaMWJtTmdMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UwWjFibU4wYVc5dWZTQlNaWFIxY201eklIUm9aU0JqWVd4c1ltRmpheTVjYmlBcUwxeHVablZ1WTNScGIyNGdZbWx1WkVOaGJHeGlZV05yS0daMWJtTXNJSFJvYVhOQmNtY3NJR0Z5WjBOdmRXNTBLU0I3WEc0Z0lHbG1JQ2gwZVhCbGIyWWdablZ1WXlBaFBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdjbVYwZFhKdUlHbGtaVzUwYVhSNU8xeHVJQ0I5WEc0Z0lHbG1JQ2gwZVhCbGIyWWdkR2hwYzBGeVp5QTlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJtZFc1ak8xeHVJQ0I5WEc0Z0lITjNhWFJqYUNBb1lYSm5RMjkxYm5RcElIdGNiaUFnSUNCallYTmxJREU2SUhKbGRIVnliaUJtZFc1amRHbHZiaWgyWVd4MVpTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHWjFibU11WTJGc2JDaDBhR2x6UVhKbkxDQjJZV3gxWlNrN1hHNGdJQ0FnZlR0Y2JpQWdJQ0JqWVhObElETTZJSEpsZEhWeWJpQm1kVzVqZEdsdmJpaDJZV3gxWlN3Z2FXNWtaWGdzSUdOdmJHeGxZM1JwYjI0cElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbWRXNWpMbU5oYkd3b2RHaHBjMEZ5Wnl3Z2RtRnNkV1VzSUdsdVpHVjRMQ0JqYjJ4c1pXTjBhVzl1S1R0Y2JpQWdJQ0I5TzF4dUlDQWdJR05oYzJVZ05Eb2djbVYwZFhKdUlHWjFibU4wYVc5dUtHRmpZM1Z0ZFd4aGRHOXlMQ0IyWVd4MVpTd2dhVzVrWlhnc0lHTnZiR3hsWTNScGIyNHBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqTG1OaGJHd29kR2hwYzBGeVp5d2dZV05qZFcxMWJHRjBiM0lzSUhaaGJIVmxMQ0JwYm1SbGVDd2dZMjlzYkdWamRHbHZiaWs3WEc0Z0lDQWdmVHRjYmlBZ0lDQmpZWE5sSURVNklISmxkSFZ5YmlCbWRXNWpkR2x2YmloMllXeDFaU3dnYjNSb1pYSXNJR3RsZVN3Z2IySnFaV04wTENCemIzVnlZMlVwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtZFc1akxtTmhiR3dvZEdocGMwRnlaeXdnZG1Gc2RXVXNJRzkwYUdWeUxDQnJaWGtzSUc5aWFtVmpkQ3dnYzI5MWNtTmxLVHRjYmlBZ0lDQjlPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z1puVnVZeTVoY0hCc2VTaDBhR2x6UVhKbkxDQmhjbWQxYldWdWRITXBPMXh1SUNCOU8xeHVmVnh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdKcGJtUkRZV3hzWW1GamF6dGNiaUlzSW5aaGNpQmpiMjV6ZEdGdWRDQTlJSEpsY1hWcGNtVW9KeTR1TDNWMGFXeHBkSGt2WTI5dWMzUmhiblFuS1N4Y2JpQWdJQ0JwYzA1aGRHbDJaU0E5SUhKbGNYVnBjbVVvSnk0dUwyeGhibWN2YVhOT1lYUnBkbVVuS1R0Y2JseHVMeW9xSUU1aGRHbDJaU0J0WlhSb2IyUWdjbVZtWlhKbGJtTmxjeTRnS2k5Y2JuWmhjaUJCY25KaGVVSjFabVpsY2lBOUlHbHpUbUYwYVhabEtFRnljbUY1UW5WbVptVnlJRDBnWjJ4dlltRnNMa0Z5Y21GNVFuVm1abVZ5S1NBbUppQkJjbkpoZVVKMVptWmxjaXhjYmlBZ0lDQmlkV1ptWlhKVGJHbGpaU0E5SUdselRtRjBhWFpsS0dKMVptWmxjbE5zYVdObElEMGdRWEp5WVhsQ2RXWm1aWElnSmlZZ2JtVjNJRUZ5Y21GNVFuVm1abVZ5S0RBcExuTnNhV05sS1NBbUppQmlkV1ptWlhKVGJHbGpaU3hjYmlBZ0lDQm1iRzl2Y2lBOUlFMWhkR2d1Wm14dmIzSXNYRzRnSUNBZ1ZXbHVkRGhCY25KaGVTQTlJR2x6VG1GMGFYWmxLRlZwYm5RNFFYSnlZWGtnUFNCbmJHOWlZV3d1VldsdWREaEJjbkpoZVNrZ0ppWWdWV2x1ZERoQmNuSmhlVHRjYmx4dUx5b3FJRlZ6WldRZ2RHOGdZMnh2Ym1VZ1lYSnlZWGtnWW5WbVptVnljeTRnS2k5Y2JuWmhjaUJHYkc5aGREWTBRWEp5WVhrZ1BTQW9ablZ1WTNScGIyNG9LU0I3WEc0Z0lDOHZJRk5oWm1GeWFTQTFJR1Z5Y205eWN5QjNhR1Z1SUhWemFXNW5JR0Z1SUdGeWNtRjVJR0oxWm1abGNpQjBieUJwYm1sMGFXRnNhWHBsSUdFZ2RIbHdaV1FnWVhKeVlYbGNiaUFnTHk4Z2QyaGxjbVVnZEdobElHRnljbUY1SUdKMVptWmxjaWR6SUdCaWVYUmxUR1Z1WjNSb1lDQnBjeUJ1YjNRZ1lTQnRkV3gwYVhCc1pTQnZaaUIwYUdVZ2RIbHdaV1JjYmlBZ0x5OGdZWEp5WVhrbmN5QmdRbGxVUlZOZlVFVlNYMFZNUlUxRlRsUmdMbHh1SUNCMGNua2dlMXh1SUNBZ0lIWmhjaUJtZFc1aklEMGdhWE5PWVhScGRtVW9ablZ1WXlBOUlHZHNiMkpoYkM1R2JHOWhkRFkwUVhKeVlYa3BJQ1ltSUdaMWJtTXNYRzRnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJRzVsZHlCbWRXNWpLRzVsZHlCQmNuSmhlVUoxWm1abGNpZ3hNQ2tzSURBc0lERXBJQ1ltSUdaMWJtTTdYRzRnSUgwZ1kyRjBZMmdvWlNrZ2UzMWNiaUFnY21WMGRYSnVJSEpsYzNWc2REdGNibjBvS1NrN1hHNWNiaThxS2lCVmMyVmtJR0Z6SUhSb1pTQnphWHBsTENCcGJpQmllWFJsY3l3Z2IyWWdaV0ZqYUNCZ1JteHZZWFEyTkVGeWNtRjVZQ0JsYkdWdFpXNTBMaUFxTDF4dWRtRnlJRVpNVDBGVU5qUmZRbGxVUlZOZlVFVlNYMFZNUlUxRlRsUWdQU0JHYkc5aGREWTBRWEp5WVhrZ1B5QkdiRzloZERZMFFYSnlZWGt1UWxsVVJWTmZVRVZTWDBWTVJVMUZUbFFnT2lBd08xeHVYRzR2S2lwY2JpQXFJRU55WldGMFpYTWdZU0JqYkc5dVpTQnZaaUIwYUdVZ1oybDJaVzRnWVhKeVlYa2dZblZtWm1WeUxseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdlMEZ5Y21GNVFuVm1abVZ5ZlNCaWRXWm1aWElnVkdobElHRnljbUY1SUdKMVptWmxjaUIwYnlCamJHOXVaUzVjYmlBcUlFQnlaWFIxY201eklIdEJjbkpoZVVKMVptWmxjbjBnVW1WMGRYSnVjeUIwYUdVZ1kyeHZibVZrSUdGeWNtRjVJR0oxWm1abGNpNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1luVm1abVZ5UTJ4dmJtVW9ZblZtWm1WeUtTQjdYRzRnSUhKbGRIVnliaUJpZFdabVpYSlRiR2xqWlM1allXeHNLR0oxWm1abGNpd2dNQ2s3WEc1OVhHNXBaaUFvSVdKMVptWmxjbE5zYVdObEtTQjdYRzRnSUM4dklGQm9ZVzUwYjIxS1V5Qm9ZWE1nWUVGeWNtRjVRblZtWm1WeVlDQmhibVFnWUZWcGJuUTRRWEp5WVhsZ0lHSjFkQ0J1YjNRZ1lFWnNiMkYwTmpSQmNuSmhlV0F1WEc0Z0lHSjFabVpsY2tOc2IyNWxJRDBnSVNoQmNuSmhlVUoxWm1abGNpQW1KaUJWYVc1ME9FRnljbUY1S1NBL0lHTnZibk4wWVc1MEtHNTFiR3dwSURvZ1puVnVZM1JwYjI0b1luVm1abVZ5S1NCN1hHNGdJQ0FnZG1GeUlHSjVkR1ZNWlc1bmRHZ2dQU0JpZFdabVpYSXVZbmwwWlV4bGJtZDBhQ3hjYmlBZ0lDQWdJQ0FnWm14dllYUk1aVzVuZEdnZ1BTQkdiRzloZERZMFFYSnlZWGtnUHlCbWJHOXZjaWhpZVhSbFRHVnVaM1JvSUM4Z1JreFBRVlEyTkY5Q1dWUkZVMTlRUlZKZlJVeEZUVVZPVkNrZ09pQXdMRnh1SUNBZ0lDQWdJQ0J2Wm1aelpYUWdQU0JtYkc5aGRFeGxibWQwYUNBcUlFWk1UMEZVTmpSZlFsbFVSVk5mVUVWU1gwVk1SVTFGVGxRc1hHNGdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHNWxkeUJCY25KaGVVSjFabVpsY2loaWVYUmxUR1Z1WjNSb0tUdGNibHh1SUNBZ0lHbG1JQ2htYkc5aGRFeGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ2RtRnlJSFpwWlhjZ1BTQnVaWGNnUm14dllYUTJORUZ5Y21GNUtISmxjM1ZzZEN3Z01Dd2dabXh2WVhSTVpXNW5kR2dwTzF4dUlDQWdJQ0FnZG1sbGR5NXpaWFFvYm1WM0lFWnNiMkYwTmpSQmNuSmhlU2hpZFdabVpYSXNJREFzSUdac2IyRjBUR1Z1WjNSb0tTazdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaGllWFJsVEdWdVozUm9JQ0U5SUc5bVpuTmxkQ2tnZTF4dUlDQWdJQ0FnZG1sbGR5QTlJRzVsZHlCVmFXNTBPRUZ5Y21GNUtISmxjM1ZzZEN3Z2IyWm1jMlYwS1R0Y2JpQWdJQ0FnSUhacFpYY3VjMlYwS0c1bGR5QlZhVzUwT0VGeWNtRjVLR0oxWm1abGNpd2diMlptYzJWMEtTazdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUgwN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWW5WbVptVnlRMnh2Ym1VN1hHNGlMQ0l2S2lCT1lYUnBkbVVnYldWMGFHOWtJSEpsWm1WeVpXNWpaWE1nWm05eUlIUm9iM05sSUhkcGRHZ2dkR2hsSUhOaGJXVWdibUZ0WlNCaGN5QnZkR2hsY2lCZ2JHOWtZWE5vWUNCdFpYUm9iMlJ6TGlBcUwxeHVkbUZ5SUc1aGRHbDJaVTFoZUNBOUlFMWhkR2d1YldGNE8xeHVYRzR2S2lwY2JpQXFJRU55WldGMFpYTWdZVzRnWVhKeVlYa2dkR2hoZENCcGN5QjBhR1VnWTI5dGNHOXphWFJwYjI0Z2IyWWdjR0Z5ZEdsaGJHeDVJR0Z3Y0d4cFpXUWdZWEpuZFcxbGJuUnpMRnh1SUNvZ2NHeGhZMlZvYjJ4a1pYSnpMQ0JoYm1RZ2NISnZkbWxrWldRZ1lYSm5kVzFsYm5SeklHbHVkRzhnWVNCemFXNW5iR1VnWVhKeVlYa2diMllnWVhKbmRXMWxiblJ6TGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZkU5aWFtVmpkSDBnWVhKbmN5QlVhR1VnY0hKdmRtbGtaV1FnWVhKbmRXMWxiblJ6TGx4dUlDb2dRSEJoY21GdElIdEJjbkpoZVgwZ2NHRnlkR2xoYkhNZ1ZHaGxJR0Z5WjNWdFpXNTBjeUIwYnlCd2NtVndaVzVrSUhSdklIUm9iM05sSUhCeWIzWnBaR1ZrTGx4dUlDb2dRSEJoY21GdElIdEJjbkpoZVgwZ2FHOXNaR1Z5Y3lCVWFHVWdZSEJoY25ScFlXeHpZQ0J3YkdGalpXaHZiR1JsY2lCcGJtUmxlR1Z6TGx4dUlDb2dRSEpsZEhWeWJuTWdlMEZ5Y21GNWZTQlNaWFIxY201eklIUm9aU0J1WlhjZ1lYSnlZWGtnYjJZZ1kyOXRjRzl6WldRZ1lYSm5kVzFsYm5SekxseHVJQ292WEc1bWRXNWpkR2x2YmlCamIyMXdiM05sUVhKbmN5aGhjbWR6TENCd1lYSjBhV0ZzY3l3Z2FHOXNaR1Z5Y3lrZ2UxeHVJQ0IyWVhJZ2FHOXNaR1Z5YzB4bGJtZDBhQ0E5SUdodmJHUmxjbk11YkdWdVozUm9MRnh1SUNBZ0lDQWdZWEpuYzBsdVpHVjRJRDBnTFRFc1hHNGdJQ0FnSUNCaGNtZHpUR1Z1WjNSb0lEMGdibUYwYVhabFRXRjRLR0Z5WjNNdWJHVnVaM1JvSUMwZ2FHOXNaR1Z5YzB4bGJtZDBhQ3dnTUNrc1hHNGdJQ0FnSUNCc1pXWjBTVzVrWlhnZ1BTQXRNU3hjYmlBZ0lDQWdJR3hsWm5STVpXNW5kR2dnUFNCd1lYSjBhV0ZzY3k1c1pXNW5kR2dzWEc0Z0lDQWdJQ0J5WlhOMWJIUWdQU0JCY25KaGVTaGhjbWR6VEdWdVozUm9JQ3NnYkdWbWRFeGxibWQwYUNrN1hHNWNiaUFnZDJocGJHVWdLQ3NyYkdWbWRFbHVaR1Y0SUR3Z2JHVm1kRXhsYm1kMGFDa2dlMXh1SUNBZ0lISmxjM1ZzZEZ0c1pXWjBTVzVrWlhoZElEMGdjR0Z5ZEdsaGJITmJiR1ZtZEVsdVpHVjRYVHRjYmlBZ2ZWeHVJQ0IzYUdsc1pTQW9LeXRoY21kelNXNWtaWGdnUENCb2IyeGtaWEp6VEdWdVozUm9LU0I3WEc0Z0lDQWdjbVZ6ZFd4MFcyaHZiR1JsY25OYllYSm5jMGx1WkdWNFhWMGdQU0JoY21kelcyRnlaM05KYm1SbGVGMDdYRzRnSUgxY2JpQWdkMmhwYkdVZ0tHRnlaM05NWlc1bmRHZ3RMU2tnZTF4dUlDQWdJSEpsYzNWc2RGdHNaV1owU1c1a1pYZ3JLMTBnUFNCaGNtZHpXMkZ5WjNOSmJtUmxlQ3NyWFR0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnY21WemRXeDBPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHTnZiWEJ2YzJWQmNtZHpPMXh1SWl3aUx5b2dUbUYwYVhabElHMWxkR2h2WkNCeVpXWmxjbVZ1WTJWeklHWnZjaUIwYUc5elpTQjNhWFJvSUhSb1pTQnpZVzFsSUc1aGJXVWdZWE1nYjNSb1pYSWdZR3h2WkdGemFHQWdiV1YwYUc5a2N5NGdLaTljYm5aaGNpQnVZWFJwZG1WTllYZ2dQU0JOWVhSb0xtMWhlRHRjYmx4dUx5b3FYRzRnS2lCVWFHbHpJR1oxYm1OMGFXOXVJR2x6SUd4cGEyVWdZR052YlhCdmMyVkJjbWR6WUNCbGVHTmxjSFFnZEdoaGRDQjBhR1VnWVhKbmRXMWxiblJ6SUdOdmJYQnZjMmwwYVc5dVhHNGdLaUJwY3lCMFlXbHNiM0psWkNCbWIzSWdZRjh1Y0dGeWRHbGhiRkpwWjJoMFlDNWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYeFBZbXBsWTNSOUlHRnlaM01nVkdobElIQnliM1pwWkdWa0lHRnlaM1Z0Wlc1MGN5NWNiaUFxSUVCd1lYSmhiU0I3UVhKeVlYbDlJSEJoY25ScFlXeHpJRlJvWlNCaGNtZDFiV1Z1ZEhNZ2RHOGdZWEJ3Wlc1a0lIUnZJSFJvYjNObElIQnliM1pwWkdWa0xseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdhRzlzWkdWeWN5QlVhR1VnWUhCaGNuUnBZV3h6WUNCd2JHRmpaV2h2YkdSbGNpQnBibVJsZUdWekxseHVJQ29nUUhKbGRIVnlibk1nZTBGeWNtRjVmU0JTWlhSMWNtNXpJSFJvWlNCdVpYY2dZWEp5WVhrZ2IyWWdZMjl0Y0c5elpXUWdZWEpuZFcxbGJuUnpMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQmpiMjF3YjNObFFYSm5jMUpwWjJoMEtHRnlaM01zSUhCaGNuUnBZV3h6TENCb2IyeGtaWEp6S1NCN1hHNGdJSFpoY2lCb2IyeGtaWEp6U1c1a1pYZ2dQU0F0TVN4Y2JpQWdJQ0FnSUdodmJHUmxjbk5NWlc1bmRHZ2dQU0JvYjJ4a1pYSnpMbXhsYm1kMGFDeGNiaUFnSUNBZ0lHRnlaM05KYm1SbGVDQTlJQzB4TEZ4dUlDQWdJQ0FnWVhKbmMweGxibWQwYUNBOUlHNWhkR2wyWlUxaGVDaGhjbWR6TG14bGJtZDBhQ0F0SUdodmJHUmxjbk5NWlc1bmRHZ3NJREFwTEZ4dUlDQWdJQ0FnY21sbmFIUkpibVJsZUNBOUlDMHhMRnh1SUNBZ0lDQWdjbWxuYUhSTVpXNW5kR2dnUFNCd1lYSjBhV0ZzY3k1c1pXNW5kR2dzWEc0Z0lDQWdJQ0J5WlhOMWJIUWdQU0JCY25KaGVTaGhjbWR6VEdWdVozUm9JQ3NnY21sbmFIUk1aVzVuZEdncE8xeHVYRzRnSUhkb2FXeGxJQ2dySzJGeVozTkpibVJsZUNBOElHRnlaM05NWlc1bmRHZ3BJSHRjYmlBZ0lDQnlaWE4xYkhSYllYSm5jMGx1WkdWNFhTQTlJR0Z5WjNOYllYSm5jMGx1WkdWNFhUdGNiaUFnZlZ4dUlDQjJZWElnY0dGa0lEMGdZWEpuYzBsdVpHVjRPMXh1SUNCM2FHbHNaU0FvS3l0eWFXZG9kRWx1WkdWNElEd2djbWxuYUhSTVpXNW5kR2dwSUh0Y2JpQWdJQ0J5WlhOMWJIUmJjR0ZrSUNzZ2NtbG5hSFJKYm1SbGVGMGdQU0J3WVhKMGFXRnNjMXR5YVdkb2RFbHVaR1Y0WFR0Y2JpQWdmVnh1SUNCM2FHbHNaU0FvS3l0b2IyeGtaWEp6U1c1a1pYZ2dQQ0JvYjJ4a1pYSnpUR1Z1WjNSb0tTQjdYRzRnSUNBZ2NtVnpkV3gwVzNCaFpDQXJJR2h2YkdSbGNuTmJhRzlzWkdWeWMwbHVaR1Y0WFYwZ1BTQmhjbWR6VzJGeVozTkpibVJsZUNzclhUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2NtVnpkV3gwTzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR052YlhCdmMyVkJjbWR6VW1sbmFIUTdYRzRpTENKMllYSWdhWE5NWlc1bmRHZ2dQU0J5WlhGMWFYSmxLQ2N1TDJselRHVnVaM1JvSnlrc1hHNGdJQ0FnZEc5UFltcGxZM1FnUFNCeVpYRjFhWEpsS0NjdUwzUnZUMkpxWldOMEp5azdYRzVjYmk4cUtseHVJQ29nUTNKbFlYUmxjeUJoSUdCaVlYTmxSV0ZqYUdBZ2IzSWdZR0poYzJWRllXTm9VbWxuYUhSZ0lHWjFibU4wYVc5dUxseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JsWVdOb1JuVnVZeUJVYUdVZ1puVnVZM1JwYjI0Z2RHOGdhWFJsY21GMFpTQnZkbVZ5SUdFZ1kyOXNiR1ZqZEdsdmJpNWNiaUFxSUVCd1lYSmhiU0I3WW05dmJHVmhibjBnVzJaeWIyMVNhV2RvZEYwZ1UzQmxZMmxtZVNCcGRHVnlZWFJwYm1jZ1puSnZiU0J5YVdkb2RDQjBieUJzWldaMExseHVJQ29nUUhKbGRIVnlibk1nZTBaMWJtTjBhVzl1ZlNCU1pYUjFjbTV6SUhSb1pTQnVaWGNnWW1GelpTQm1kVzVqZEdsdmJpNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1kzSmxZWFJsUW1GelpVVmhZMmdvWldGamFFWjFibU1zSUdaeWIyMVNhV2RvZENrZ2UxeHVJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9ZMjlzYkdWamRHbHZiaXdnYVhSbGNtRjBaV1VwSUh0Y2JpQWdJQ0IyWVhJZ2JHVnVaM1JvSUQwZ1kyOXNiR1ZqZEdsdmJpQS9JR052Ykd4bFkzUnBiMjR1YkdWdVozUm9JRG9nTUR0Y2JpQWdJQ0JwWmlBb0lXbHpUR1Z1WjNSb0tHeGxibWQwYUNrcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbFlXTm9SblZ1WXloamIyeHNaV04wYVc5dUxDQnBkR1Z5WVhSbFpTazdYRzRnSUNBZ2ZWeHVJQ0FnSUhaaGNpQnBibVJsZUNBOUlHWnliMjFTYVdkb2RDQS9JR3hsYm1kMGFDQTZJQzB4TEZ4dUlDQWdJQ0FnSUNCcGRHVnlZV0pzWlNBOUlIUnZUMkpxWldOMEtHTnZiR3hsWTNScGIyNHBPMXh1WEc0Z0lDQWdkMmhwYkdVZ0tDaG1jbTl0VW1sbmFIUWdQeUJwYm1SbGVDMHRJRG9nS3l0cGJtUmxlQ0E4SUd4bGJtZDBhQ2twSUh0Y2JpQWdJQ0FnSUdsbUlDaHBkR1Z5WVhSbFpTaHBkR1Z5WVdKc1pWdHBibVJsZUYwc0lHbHVaR1Y0TENCcGRHVnlZV0pzWlNrZ1BUMDlJR1poYkhObEtTQjdYRzRnSUNBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdZMjlzYkdWamRHbHZianRjYmlBZ2ZUdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCamNtVmhkR1ZDWVhObFJXRmphRHRjYmlJc0luWmhjaUIwYjA5aWFtVmpkQ0E5SUhKbGNYVnBjbVVvSnk0dmRHOVBZbXBsWTNRbktUdGNibHh1THlvcVhHNGdLaUJEY21WaGRHVnpJR0VnWW1GelpTQm1kVzVqZEdsdmJpQm1iM0lnWUY4dVptOXlTVzVnSUc5eUlHQmZMbVp2Y2tsdVVtbG5hSFJnTGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UySnZiMnhsWVc1OUlGdG1jbTl0VW1sbmFIUmRJRk53WldOcFpua2dhWFJsY21GMGFXNW5JR1p5YjIwZ2NtbG5hSFFnZEc4Z2JHVm1kQzVjYmlBcUlFQnlaWFIxY201eklIdEdkVzVqZEdsdmJuMGdVbVYwZFhKdWN5QjBhR1VnYm1WM0lHSmhjMlVnWm5WdVkzUnBiMjR1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR055WldGMFpVSmhjMlZHYjNJb1puSnZiVkpwWjJoMEtTQjdYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaWh2WW1wbFkzUXNJR2wwWlhKaGRHVmxMQ0JyWlhselJuVnVZeWtnZTF4dUlDQWdJSFpoY2lCcGRHVnlZV0pzWlNBOUlIUnZUMkpxWldOMEtHOWlhbVZqZENrc1hHNGdJQ0FnSUNBZ0lIQnliM0J6SUQwZ2EyVjVjMFoxYm1Nb2IySnFaV04wS1N4Y2JpQWdJQ0FnSUNBZ2JHVnVaM1JvSUQwZ2NISnZjSE11YkdWdVozUm9MRnh1SUNBZ0lDQWdJQ0JwYm1SbGVDQTlJR1p5YjIxU2FXZG9kQ0EvSUd4bGJtZDBhQ0E2SUMweE8xeHVYRzRnSUNBZ2QyaHBiR1VnS0NobWNtOXRVbWxuYUhRZ1B5QnBibVJsZUMwdElEb2dLeXRwYm1SbGVDQThJR3hsYm1kMGFDa3BJSHRjYmlBZ0lDQWdJSFpoY2lCclpYa2dQU0J3Y205d2MxdHBibVJsZUYwN1hHNGdJQ0FnSUNCcFppQW9hWFJsY21GMFpXVW9hWFJsY21GaWJHVmJhMlY1WFN3Z2EyVjVMQ0JwZEdWeVlXSnNaU2tnUFQwOUlHWmhiSE5sS1NCN1hHNGdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2IySnFaV04wTzF4dUlDQjlPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHTnlaV0YwWlVKaGMyVkdiM0k3WEc0aUxDSjJZWElnWTNKbFlYUmxRM1J2Y2xkeVlYQndaWElnUFNCeVpYRjFhWEpsS0NjdUwyTnlaV0YwWlVOMGIzSlhjbUZ3Y0dWeUp5azdYRzVjYmk4cUtseHVJQ29nUTNKbFlYUmxjeUJoSUdaMWJtTjBhVzl1SUhSb1lYUWdkM0poY0hNZ1lHWjFibU5nSUdGdVpDQnBiblp2YTJWeklHbDBJSGRwZEdnZ2RHaGxJR0IwYUdsellGeHVJQ29nWW1sdVpHbHVaeUJ2WmlCZ2RHaHBjMEZ5WjJBdVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJR1oxYm1NZ1ZHaGxJR1oxYm1OMGFXOXVJSFJ2SUdKcGJtUXVYRzRnS2lCQWNHRnlZVzBnZXlwOUlGdDBhR2x6UVhKblhTQlVhR1VnWUhSb2FYTmdJR0pwYm1ScGJtY2diMllnWUdaMWJtTmdMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UwWjFibU4wYVc5dWZTQlNaWFIxY201eklIUm9aU0J1WlhjZ1ltOTFibVFnWm5WdVkzUnBiMjR1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR055WldGMFpVSnBibVJYY21Gd2NHVnlLR1oxYm1Nc0lIUm9hWE5CY21jcElIdGNiaUFnZG1GeUlFTjBiM0lnUFNCamNtVmhkR1ZEZEc5eVYzSmhjSEJsY2lobWRXNWpLVHRjYmx4dUlDQm1kVzVqZEdsdmJpQjNjbUZ3Y0dWeUtDa2dlMXh1SUNBZ0lIWmhjaUJtYmlBOUlDaDBhR2x6SUNZbUlIUm9hWE1nSVQwOUlHZHNiMkpoYkNBbUppQjBhR2x6SUdsdWMzUmhibU5sYjJZZ2QzSmhjSEJsY2lrZ1B5QkRkRzl5SURvZ1puVnVZenRjYmlBZ0lDQnlaWFIxY200Z1ptNHVZWEJ3Ykhrb2RHaHBjMEZ5Wnl3Z1lYSm5kVzFsYm5SektUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2QzSmhjSEJsY2p0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JqY21WaGRHVkNhVzVrVjNKaGNIQmxjanRjYmlJc0luWmhjaUJpWVhObFEzSmxZWFJsSUQwZ2NtVnhkV2x5WlNnbkxpOWlZWE5sUTNKbFlYUmxKeWtzWEc0Z0lDQWdhWE5QWW1wbFkzUWdQU0J5WlhGMWFYSmxLQ2N1TGk5c1lXNW5MMmx6VDJKcVpXTjBKeWs3WEc1Y2JpOHFLbHh1SUNvZ1EzSmxZWFJsY3lCaElHWjFibU4wYVc5dUlIUm9ZWFFnY0hKdlpIVmpaWE1nWVc0Z2FXNXpkR0Z1WTJVZ2IyWWdZRU4wYjNKZ0lISmxaMkZ5Wkd4bGMzTWdiMlpjYmlBcUlIZG9aWFJvWlhJZ2FYUWdkMkZ6SUdsdWRtOXJaV1FnWVhNZ2NHRnlkQ0J2WmlCaElHQnVaWGRnSUdWNGNISmxjM05wYjI0Z2IzSWdZbmtnWUdOaGJHeGdJRzl5SUdCaGNIQnNlV0F1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlFTjBiM0lnVkdobElHTnZibk4wY25WamRHOXlJSFJ2SUhkeVlYQXVYRzRnS2lCQWNtVjBkWEp1Y3lCN1JuVnVZM1JwYjI1OUlGSmxkSFZ5Ym5NZ2RHaGxJRzVsZHlCM2NtRndjR1ZrSUdaMWJtTjBhVzl1TGx4dUlDb3ZYRzVtZFc1amRHbHZiaUJqY21WaGRHVkRkRzl5VjNKaGNIQmxjaWhEZEc5eUtTQjdYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0IyWVhJZ2RHaHBjMEpwYm1ScGJtY2dQU0JpWVhObFEzSmxZWFJsS0VOMGIzSXVjSEp2ZEc5MGVYQmxLU3hjYmlBZ0lDQWdJQ0FnY21WemRXeDBJRDBnUTNSdmNpNWhjSEJzZVNoMGFHbHpRbWx1WkdsdVp5d2dZWEpuZFcxbGJuUnpLVHRjYmx4dUlDQWdJQzh2SUUxcGJXbGpJSFJvWlNCamIyNXpkSEoxWTNSdmNpZHpJR0J5WlhSMWNtNWdJR0psYUdGMmFXOXlMbHh1SUNBZ0lDOHZJRk5sWlNCb2RIUndjem92TDJWek5TNW5hWFJvZFdJdWFXOHZJM2d4TXk0eUxqSWdabTl5SUcxdmNtVWdaR1YwWVdsc2N5NWNiaUFnSUNCeVpYUjFjbTRnYVhOUFltcGxZM1FvY21WemRXeDBLU0EvSUhKbGMzVnNkQ0E2SUhSb2FYTkNhVzVrYVc1bk8xeHVJQ0I5TzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR055WldGMFpVTjBiM0pYY21Gd2NHVnlPMXh1SWl3aWRtRnlJR0poYzJWRFlXeHNZbUZqYXlBOUlISmxjWFZwY21Vb0p5NHZZbUZ6WlVOaGJHeGlZV05ySnlrc1hHNGdJQ0FnWW1GelpVWnBibVFnUFNCeVpYRjFhWEpsS0NjdUwySmhjMlZHYVc1a0p5a3NYRzRnSUNBZ1ltRnpaVVpwYm1SSmJtUmxlQ0E5SUhKbGNYVnBjbVVvSnk0dlltRnpaVVpwYm1SSmJtUmxlQ2NwTEZ4dUlDQWdJR2x6UVhKeVlYa2dQU0J5WlhGMWFYSmxLQ2N1TGk5c1lXNW5MMmx6UVhKeVlYa25LVHRjYmx4dUx5b3FYRzRnS2lCRGNtVmhkR1Z6SUdFZ1lGOHVabWx1WkdBZ2IzSWdZRjh1Wm1sdVpFeGhjM1JnSUdaMWJtTjBhVzl1TGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQmxZV05vUm5WdVl5QlVhR1VnWm5WdVkzUnBiMjRnZEc4Z2FYUmxjbUYwWlNCdmRtVnlJR0VnWTI5c2JHVmpkR2x2Ymk1Y2JpQXFJRUJ3WVhKaGJTQjdZbTl2YkdWaGJuMGdXMlp5YjIxU2FXZG9kRjBnVTNCbFkybG1lU0JwZEdWeVlYUnBibWNnWm5KdmJTQnlhV2RvZENCMGJ5QnNaV1owTGx4dUlDb2dRSEpsZEhWeWJuTWdlMFoxYm1OMGFXOXVmU0JTWlhSMWNtNXpJSFJvWlNCdVpYY2dabWx1WkNCbWRXNWpkR2x2Ymk1Y2JpQXFMMXh1Wm5WdVkzUnBiMjRnWTNKbFlYUmxSbWx1WkNobFlXTm9SblZ1WXl3Z1puSnZiVkpwWjJoMEtTQjdYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaWhqYjJ4c1pXTjBhVzl1TENCd2NtVmthV05oZEdVc0lIUm9hWE5CY21jcElIdGNiaUFnSUNCd2NtVmthV05oZEdVZ1BTQmlZWE5sUTJGc2JHSmhZMnNvY0hKbFpHbGpZWFJsTENCMGFHbHpRWEpuTENBektUdGNiaUFnSUNCcFppQW9hWE5CY25KaGVTaGpiMnhzWldOMGFXOXVLU2tnZTF4dUlDQWdJQ0FnZG1GeUlHbHVaR1Y0SUQwZ1ltRnpaVVpwYm1SSmJtUmxlQ2hqYjJ4c1pXTjBhVzl1TENCd2NtVmthV05oZEdVc0lHWnliMjFTYVdkb2RDazdYRzRnSUNBZ0lDQnlaWFIxY200Z2FXNWtaWGdnUGlBdE1TQS9JR052Ykd4bFkzUnBiMjViYVc1a1pYaGRJRG9nZFc1a1pXWnBibVZrTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1ltRnpaVVpwYm1Rb1kyOXNiR1ZqZEdsdmJpd2djSEpsWkdsallYUmxMQ0JsWVdOb1JuVnVZeWs3WEc0Z0lIMWNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCamNtVmhkR1ZHYVc1a08xeHVJaXdpZG1GeUlHSnBibVJEWVd4c1ltRmpheUE5SUhKbGNYVnBjbVVvSnk0dlltbHVaRU5oYkd4aVlXTnJKeWtzWEc0Z0lDQWdhWE5CY25KaGVTQTlJSEpsY1hWcGNtVW9KeTR1TDJ4aGJtY3ZhWE5CY25KaGVTY3BPMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCbWRXNWpkR2x2YmlCbWIzSWdZRjh1Wm05eVJXRmphR0FnYjNJZ1lGOHVabTl5UldGamFGSnBaMmgwWUM1Y2JpQXFYRzRnS2lCQWNISnBkbUYwWlZ4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdZWEp5WVhsR2RXNWpJRlJvWlNCbWRXNWpkR2x2YmlCMGJ5QnBkR1Z5WVhSbElHOTJaWElnWVc0Z1lYSnlZWGt1WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQmxZV05vUm5WdVl5QlVhR1VnWm5WdVkzUnBiMjRnZEc4Z2FYUmxjbUYwWlNCdmRtVnlJR0VnWTI5c2JHVmpkR2x2Ymk1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRHZFc1amRHbHZibjBnVW1WMGRYSnVjeUIwYUdVZ2JtVjNJR1ZoWTJnZ1puVnVZM1JwYjI0dVhHNGdLaTljYm1aMWJtTjBhVzl1SUdOeVpXRjBaVVp2Y2tWaFkyZ29ZWEp5WVhsR2RXNWpMQ0JsWVdOb1JuVnVZeWtnZTF4dUlDQnlaWFIxY200Z1puVnVZM1JwYjI0b1kyOXNiR1ZqZEdsdmJpd2dhWFJsY21GMFpXVXNJSFJvYVhOQmNtY3BJSHRjYmlBZ0lDQnlaWFIxY200Z0tIUjVjR1Z2WmlCcGRHVnlZWFJsWlNBOVBTQW5ablZ1WTNScGIyNG5JQ1ltSUhSNWNHVnZaaUIwYUdselFYSm5JRDA5SUNkMWJtUmxabWx1WldRbklDWW1JR2x6UVhKeVlYa29ZMjlzYkdWamRHbHZiaWtwWEc0Z0lDQWdJQ0EvSUdGeWNtRjVSblZ1WXloamIyeHNaV04wYVc5dUxDQnBkR1Z5WVhSbFpTbGNiaUFnSUNBZ0lEb2daV0ZqYUVaMWJtTW9ZMjlzYkdWamRHbHZiaXdnWW1sdVpFTmhiR3hpWVdOcktHbDBaWEpoZEdWbExDQjBhR2x6UVhKbkxDQXpLU2s3WEc0Z0lIMDdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1kzSmxZWFJsUm05eVJXRmphRHRjYmlJc0luWmhjaUJoY25KaGVVTnZjSGtnUFNCeVpYRjFhWEpsS0NjdUwyRnljbUY1UTI5d2VTY3BMRnh1SUNBZ0lHTnZiWEJ2YzJWQmNtZHpJRDBnY21WeGRXbHlaU2duTGk5amIyMXdiM05sUVhKbmN5Y3BMRnh1SUNBZ0lHTnZiWEJ2YzJWQmNtZHpVbWxuYUhRZ1BTQnlaWEYxYVhKbEtDY3VMMk52YlhCdmMyVkJjbWR6VW1sbmFIUW5LU3hjYmlBZ0lDQmpjbVZoZEdWRGRHOXlWM0poY0hCbGNpQTlJSEpsY1hWcGNtVW9KeTR2WTNKbFlYUmxRM1J2Y2xkeVlYQndaWEluS1N4Y2JpQWdJQ0JwYzB4aGVtbGhZbXhsSUQwZ2NtVnhkV2x5WlNnbkxpOXBjMHhoZW1saFlteGxKeWtzWEc0Z0lDQWdjbVZ2Y21SbGNpQTlJSEpsY1hWcGNtVW9KeTR2Y21WdmNtUmxjaWNwTEZ4dUlDQWdJSEpsY0d4aFkyVkliMnhrWlhKeklEMGdjbVZ4ZFdseVpTZ25MaTl5WlhCc1lXTmxTRzlzWkdWeWN5Y3BMRnh1SUNBZ0lITmxkRVJoZEdFZ1BTQnlaWEYxYVhKbEtDY3VMM05sZEVSaGRHRW5LVHRjYmx4dUx5b3FJRlZ6WldRZ2RHOGdZMjl0Y0c5elpTQmlhWFJ0WVhOcmN5Qm1iM0lnZDNKaGNIQmxjaUJ0WlhSaFpHRjBZUzRnS2k5Y2JuWmhjaUJDU1U1RVgwWk1RVWNnUFNBeExGeHVJQ0FnSUVKSlRrUmZTMFZaWDBaTVFVY2dQU0F5TEZ4dUlDQWdJRU5WVWxKWlgwSlBWVTVFWDBaTVFVY2dQU0EwTEZ4dUlDQWdJRU5WVWxKWlgwWk1RVWNnUFNBNExGeHVJQ0FnSUVOVlVsSlpYMUpKUjBoVVgwWk1RVWNnUFNBeE5peGNiaUFnSUNCUVFWSlVTVUZNWDBaTVFVY2dQU0F6TWl4Y2JpQWdJQ0JRUVZKVVNVRk1YMUpKUjBoVVgwWk1RVWNnUFNBMk5DeGNiaUFnSUNCQlVsbGZSa3hCUnlBOUlERXlPRHRjYmx4dUx5b2dUbUYwYVhabElHMWxkR2h2WkNCeVpXWmxjbVZ1WTJWeklHWnZjaUIwYUc5elpTQjNhWFJvSUhSb1pTQnpZVzFsSUc1aGJXVWdZWE1nYjNSb1pYSWdZR3h2WkdGemFHQWdiV1YwYUc5a2N5NGdLaTljYm5aaGNpQnVZWFJwZG1WTllYZ2dQU0JOWVhSb0xtMWhlRHRjYmx4dUx5b3FYRzRnS2lCRGNtVmhkR1Z6SUdFZ1puVnVZM1JwYjI0Z2RHaGhkQ0IzY21Gd2N5QmdablZ1WTJBZ1lXNWtJR2x1ZG05clpYTWdhWFFnZDJsMGFDQnZjSFJwYjI1aGJDQmdkR2hwYzJCY2JpQXFJR0pwYm1ScGJtY2diMllzSUhCaGNuUnBZV3dnWVhCd2JHbGpZWFJwYjI0c0lHRnVaQ0JqZFhKeWVXbHVaeTVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym54emRISnBibWQ5SUdaMWJtTWdWR2hsSUdaMWJtTjBhVzl1SUc5eUlHMWxkR2h2WkNCdVlXMWxJSFJ2SUhKbFptVnlaVzVqWlM1Y2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQmlhWFJ0WVhOcklGUm9aU0JpYVhSdFlYTnJJRzltSUdac1lXZHpMaUJUWldVZ1lHTnlaV0YwWlZkeVlYQndaWEpnSUdadmNpQnRiM0psSUdSbGRHRnBiSE11WEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJRnQwYUdselFYSm5YU0JVYUdVZ1lIUm9hWE5nSUdKcGJtUnBibWNnYjJZZ1lHWjFibU5nTGx4dUlDb2dRSEJoY21GdElIdEJjbkpoZVgwZ1czQmhjblJwWVd4elhTQlVhR1VnWVhKbmRXMWxiblJ6SUhSdklIQnlaWEJsYm1RZ2RHOGdkR2h2YzJVZ2NISnZkbWxrWldRZ2RHOGdkR2hsSUc1bGR5Qm1kVzVqZEdsdmJpNWNiaUFxSUVCd1lYSmhiU0I3UVhKeVlYbDlJRnRvYjJ4a1pYSnpYU0JVYUdVZ1lIQmhjblJwWVd4ellDQndiR0ZqWldodmJHUmxjaUJwYm1SbGVHVnpMbHh1SUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnVzNCaGNuUnBZV3h6VW1sbmFIUmRJRlJvWlNCaGNtZDFiV1Z1ZEhNZ2RHOGdZWEJ3Wlc1a0lIUnZJSFJvYjNObElIQnliM1pwWkdWa0lIUnZJSFJvWlNCdVpYY2dablZ1WTNScGIyNHVYRzRnS2lCQWNHRnlZVzBnZTBGeWNtRjVmU0JiYUc5c1pHVnljMUpwWjJoMFhTQlVhR1VnWUhCaGNuUnBZV3h6VW1sbmFIUmdJSEJzWVdObGFHOXNaR1Z5SUdsdVpHVjRaWE11WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCYllYSm5VRzl6WFNCVWFHVWdZWEpuZFcxbGJuUWdjRzl6YVhScGIyNXpJRzltSUhSb1pTQnVaWGNnWm5WdVkzUnBiMjR1WEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ1cyRnllVjBnVkdobElHRnlhWFI1SUdOaGNDQnZaaUJnWm5WdVkyQXVYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnVzJGeWFYUjVYU0JVYUdVZ1lYSnBkSGtnYjJZZ1lHWjFibU5nTGx4dUlDb2dRSEpsZEhWeWJuTWdlMFoxYm1OMGFXOXVmU0JTWlhSMWNtNXpJSFJvWlNCdVpYY2dkM0poY0hCbFpDQm1kVzVqZEdsdmJpNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1kzSmxZWFJsU0hsaWNtbGtWM0poY0hCbGNpaG1kVzVqTENCaWFYUnRZWE5yTENCMGFHbHpRWEpuTENCd1lYSjBhV0ZzY3l3Z2FHOXNaR1Z5Y3l3Z2NHRnlkR2xoYkhOU2FXZG9kQ3dnYUc5c1pHVnljMUpwWjJoMExDQmhjbWRRYjNNc0lHRnllU3dnWVhKcGRIa3BJSHRjYmlBZ2RtRnlJR2x6UVhKNUlEMGdZbWwwYldGemF5QW1JRUZTV1Y5R1RFRkhMRnh1SUNBZ0lDQWdhWE5DYVc1a0lEMGdZbWwwYldGemF5QW1JRUpKVGtSZlJreEJSeXhjYmlBZ0lDQWdJR2x6UW1sdVpFdGxlU0E5SUdKcGRHMWhjMnNnSmlCQ1NVNUVYMHRGV1Y5R1RFRkhMRnh1SUNBZ0lDQWdhWE5EZFhKeWVTQTlJR0pwZEcxaGMyc2dKaUJEVlZKU1dWOUdURUZITEZ4dUlDQWdJQ0FnYVhORGRYSnllVUp2ZFc1a0lEMGdZbWwwYldGemF5QW1JRU5WVWxKWlgwSlBWVTVFWDBaTVFVY3NYRzRnSUNBZ0lDQnBjME4xY25KNVVtbG5hSFFnUFNCaWFYUnRZWE5ySUNZZ1ExVlNVbGxmVWtsSFNGUmZSa3hCUnp0Y2JseHVJQ0IyWVhJZ1EzUnZjaUE5SUNGcGMwSnBibVJMWlhrZ0ppWWdZM0psWVhSbFEzUnZjbGR5WVhCd1pYSW9ablZ1WXlrc1hHNGdJQ0FnSUNCclpYa2dQU0JtZFc1ak8xeHVYRzRnSUdaMWJtTjBhVzl1SUhkeVlYQndaWElvS1NCN1hHNGdJQ0FnTHk4Z1FYWnZhV1FnWUdGeVozVnRaVzUwYzJBZ2IySnFaV04wSUhWelpTQmthWE54ZFdGc2FXWjVhVzVuSUc5d2RHbHRhWHBoZEdsdmJuTWdZbmxjYmlBZ0lDQXZMeUJqYjI1MlpYSjBhVzVuSUdsMElIUnZJR0Z1SUdGeWNtRjVJR0psWm05eVpTQndjbTkyYVdScGJtY2dhWFFnZEc4Z2IzUm9aWElnWm5WdVkzUnBiMjV6TGx4dUlDQWdJSFpoY2lCc1pXNW5kR2dnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvTEZ4dUlDQWdJQ0FnSUNCcGJtUmxlQ0E5SUd4bGJtZDBhQ3hjYmlBZ0lDQWdJQ0FnWVhKbmN5QTlJRUZ5Y21GNUtHeGxibWQwYUNrN1hHNWNiaUFnSUNCM2FHbHNaU0FvYVc1a1pYZ3RMU2tnZTF4dUlDQWdJQ0FnWVhKbmMxdHBibVJsZUYwZ1BTQmhjbWQxYldWdWRITmJhVzVrWlhoZE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2NHRnlkR2xoYkhNcElIdGNiaUFnSUNBZ0lHRnlaM01nUFNCamIyMXdiM05sUVhKbmN5aGhjbWR6TENCd1lYSjBhV0ZzY3l3Z2FHOXNaR1Z5Y3lrN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNod1lYSjBhV0ZzYzFKcFoyaDBLU0I3WEc0Z0lDQWdJQ0JoY21keklEMGdZMjl0Y0c5elpVRnlaM05TYVdkb2RDaGhjbWR6TENCd1lYSjBhV0ZzYzFKcFoyaDBMQ0JvYjJ4a1pYSnpVbWxuYUhRcE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2FYTkRkWEp5ZVNCOGZDQnBjME4xY25KNVVtbG5hSFFwSUh0Y2JpQWdJQ0FnSUhaaGNpQndiR0ZqWldodmJHUmxjaUE5SUhkeVlYQndaWEl1Y0d4aFkyVm9iMnhrWlhJc1hHNGdJQ0FnSUNBZ0lDQWdZWEpuYzBodmJHUmxjbk1nUFNCeVpYQnNZV05sU0c5c1pHVnljeWhoY21kekxDQndiR0ZqWldodmJHUmxjaWs3WEc1Y2JpQWdJQ0FnSUd4bGJtZDBhQ0F0UFNCaGNtZHpTRzlzWkdWeWN5NXNaVzVuZEdnN1hHNGdJQ0FnSUNCcFppQW9iR1Z1WjNSb0lEd2dZWEpwZEhrcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUc1bGQwRnlaMUJ2Y3lBOUlHRnlaMUJ2Y3lBL0lHRnljbUY1UTI5d2VTaGhjbWRRYjNNcElEb2diblZzYkN4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZDBGeWFYUjVJRDBnYm1GMGFYWmxUV0Y0S0dGeWFYUjVJQzBnYkdWdVozUm9MQ0F3S1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZDNOSWIyeGtaWEp6SUQwZ2FYTkRkWEp5ZVNBL0lHRnlaM05JYjJ4a1pYSnpJRG9nYm5Wc2JDeGNiaUFnSUNBZ0lDQWdJQ0FnSUc1bGQwaHZiR1JsY25OU2FXZG9kQ0E5SUdselEzVnljbmtnUHlCdWRXeHNJRG9nWVhKbmMwaHZiR1JsY25Nc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J1WlhkUVlYSjBhV0ZzY3lBOUlHbHpRM1Z5Y25rZ1B5QmhjbWR6SURvZ2JuVnNiQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHNWxkMUJoY25ScFlXeHpVbWxuYUhRZ1BTQnBjME4xY25KNUlEOGdiblZzYkNBNklHRnlaM003WEc1Y2JpQWdJQ0FnSUNBZ1ltbDBiV0Z6YXlCOFBTQW9hWE5EZFhKeWVTQS9JRkJCVWxSSlFVeGZSa3hCUnlBNklGQkJVbFJKUVV4ZlVrbEhTRlJmUmt4QlJ5azdYRzRnSUNBZ0lDQWdJR0pwZEcxaGMyc2dKajBnZmlocGMwTjFjbko1SUQ4Z1VFRlNWRWxCVEY5U1NVZElWRjlHVEVGSElEb2dVRUZTVkVsQlRGOUdURUZIS1R0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvSVdselEzVnljbmxDYjNWdVpDa2dlMXh1SUNBZ0lDQWdJQ0FnSUdKcGRHMWhjMnNnSmowZ2ZpaENTVTVFWDBaTVFVY2dmQ0JDU1U1RVgwdEZXVjlHVEVGSEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0IyWVhJZ2JtVjNSR0YwWVNBOUlGdG1kVzVqTENCaWFYUnRZWE5yTENCMGFHbHpRWEpuTENCdVpYZFFZWEowYVdGc2N5d2dibVYzYzBodmJHUmxjbk1zSUc1bGQxQmhjblJwWVd4elVtbG5hSFFzSUc1bGQwaHZiR1JsY25OU2FXZG9kQ3dnYm1WM1FYSm5VRzl6TENCaGNua3NJRzVsZDBGeWFYUjVYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHTnlaV0YwWlVoNVluSnBaRmR5WVhCd1pYSXVZWEJ3Ykhrb2RXNWtaV1pwYm1Wa0xDQnVaWGRFWVhSaEtUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2FYTk1ZWHBwWVdKc1pTaG1kVzVqS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJSE5sZEVSaGRHRW9jbVZ6ZFd4MExDQnVaWGRFWVhSaEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0J5WlhOMWJIUXVjR3hoWTJWb2IyeGtaWElnUFNCd2JHRmpaV2h2YkdSbGNqdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUhSb2FYTkNhVzVrYVc1bklEMGdhWE5DYVc1a0lEOGdkR2hwYzBGeVp5QTZJSFJvYVhNN1hHNGdJQ0FnYVdZZ0tHbHpRbWx1WkV0bGVTa2dlMXh1SUNBZ0lDQWdablZ1WXlBOUlIUm9hWE5DYVc1a2FXNW5XMnRsZVYwN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNoaGNtZFFiM01wSUh0Y2JpQWdJQ0FnSUdGeVozTWdQU0J5Wlc5eVpHVnlLR0Z5WjNNc0lHRnlaMUJ2Y3lrN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNocGMwRnllU0FtSmlCaGNua2dQQ0JoY21kekxteGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ1lYSm5jeTVzWlc1bmRHZ2dQU0JoY25rN1hHNGdJQ0FnZlZ4dUlDQWdJSFpoY2lCbWJpQTlJQ2gwYUdseklDWW1JSFJvYVhNZ0lUMDlJR2RzYjJKaGJDQW1KaUIwYUdseklHbHVjM1JoYm1ObGIyWWdkM0poY0hCbGNpa2dQeUFvUTNSdmNpQjhmQ0JqY21WaGRHVkRkRzl5VjNKaGNIQmxjaWhtZFc1aktTa2dPaUJtZFc1ak8xeHVJQ0FnSUhKbGRIVnliaUJtYmk1aGNIQnNlU2gwYUdselFtbHVaR2x1Wnl3Z1lYSm5jeWs3WEc0Z0lIMWNiaUFnY21WMGRYSnVJSGR5WVhCd1pYSTdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1kzSmxZWFJsU0hsaWNtbGtWM0poY0hCbGNqdGNiaUlzSW5aaGNpQmpjbVZoZEdWRGRHOXlWM0poY0hCbGNpQTlJSEpsY1hWcGNtVW9KeTR2WTNKbFlYUmxRM1J2Y2xkeVlYQndaWEluS1R0Y2JseHVMeW9xSUZWelpXUWdkRzhnWTI5dGNHOXpaU0JpYVhSdFlYTnJjeUJtYjNJZ2QzSmhjSEJsY2lCdFpYUmhaR0YwWVM0Z0tpOWNiblpoY2lCQ1NVNUVYMFpNUVVjZ1BTQXhPMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCbWRXNWpkR2x2YmlCMGFHRjBJSGR5WVhCeklHQm1kVzVqWUNCaGJtUWdhVzUyYjJ0bGN5QnBkQ0IzYVhSb0lIUm9aU0J2Y0hScGIyNWhiQ0JnZEdocGMyQmNiaUFxSUdKcGJtUnBibWNnYjJZZ1lIUm9hWE5CY21kZ0lHRnVaQ0IwYUdVZ1lIQmhjblJwWVd4ellDQndjbVZ3Wlc1a1pXUWdkRzhnZEdodmMyVWdjSEp2ZG1sa1pXUWdkRzljYmlBcUlIUm9aU0IzY21Gd2NHVnlMbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCbWRXNWpJRlJvWlNCbWRXNWpkR2x2YmlCMGJ5QndZWEowYVdGc2JIa2dZWEJ3YkhrZ1lYSm5kVzFsYm5SeklIUnZMbHh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUdKcGRHMWhjMnNnVkdobElHSnBkRzFoYzJzZ2IyWWdabXhoWjNNdUlGTmxaU0JnWTNKbFlYUmxWM0poY0hCbGNtQWdabTl5SUcxdmNtVWdaR1YwWVdsc2N5NWNiaUFxSUVCd1lYSmhiU0I3S24wZ2RHaHBjMEZ5WnlCVWFHVWdZSFJvYVhOZ0lHSnBibVJwYm1jZ2IyWWdZR1oxYm1OZ0xseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdjR0Z5ZEdsaGJITWdWR2hsSUdGeVozVnRaVzUwY3lCMGJ5QndjbVZ3Wlc1a0lIUnZJSFJvYjNObElIQnliM1pwWkdWa0lIUnZJSFJvWlNCdVpYY2dablZ1WTNScGIyNHVYRzRnS2lCQWNtVjBkWEp1Y3lCN1JuVnVZM1JwYjI1OUlGSmxkSFZ5Ym5NZ2RHaGxJRzVsZHlCaWIzVnVaQ0JtZFc1amRHbHZiaTVjYmlBcUwxeHVablZ1WTNScGIyNGdZM0psWVhSbFVHRnlkR2xoYkZkeVlYQndaWElvWm5WdVl5d2dZbWwwYldGemF5d2dkR2hwYzBGeVp5d2djR0Z5ZEdsaGJITXBJSHRjYmlBZ2RtRnlJR2x6UW1sdVpDQTlJR0pwZEcxaGMyc2dKaUJDU1U1RVgwWk1RVWNzWEc0Z0lDQWdJQ0JEZEc5eUlEMGdZM0psWVhSbFEzUnZjbGR5WVhCd1pYSW9ablZ1WXlrN1hHNWNiaUFnWm5WdVkzUnBiMjRnZDNKaGNIQmxjaWdwSUh0Y2JpQWdJQ0F2THlCQmRtOXBaQ0JnWVhKbmRXMWxiblJ6WUNCdlltcGxZM1FnZFhObElHUnBjM0YxWVd4cFpubHBibWNnYjNCMGFXMXBlbUYwYVc5dWN5QmllVnh1SUNBZ0lDOHZJR052Ym5abGNuUnBibWNnYVhRZ2RHOGdZVzRnWVhKeVlYa2dZbVZtYjNKbElIQnliM1pwWkdsdVp5QnBkQ0JnWm5WdVkyQXVYRzRnSUNBZ2RtRnlJR0Z5WjNOSmJtUmxlQ0E5SUMweExGeHVJQ0FnSUNBZ0lDQmhjbWR6VEdWdVozUm9JRDBnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ3hjYmlBZ0lDQWdJQ0FnYkdWbWRFbHVaR1Y0SUQwZ0xURXNYRzRnSUNBZ0lDQWdJR3hsWm5STVpXNW5kR2dnUFNCd1lYSjBhV0ZzY3k1c1pXNW5kR2dzWEc0Z0lDQWdJQ0FnSUdGeVozTWdQU0JCY25KaGVTaGhjbWR6VEdWdVozUm9JQ3NnYkdWbWRFeGxibWQwYUNrN1hHNWNiaUFnSUNCM2FHbHNaU0FvS3l0c1pXWjBTVzVrWlhnZ1BDQnNaV1owVEdWdVozUm9LU0I3WEc0Z0lDQWdJQ0JoY21kelcyeGxablJKYm1SbGVGMGdQU0J3WVhKMGFXRnNjMXRzWldaMFNXNWtaWGhkTzF4dUlDQWdJSDFjYmlBZ0lDQjNhR2xzWlNBb1lYSm5jMHhsYm1kMGFDMHRLU0I3WEc0Z0lDQWdJQ0JoY21kelcyeGxablJKYm1SbGVDc3JYU0E5SUdGeVozVnRaVzUwYzFzcksyRnlaM05KYm1SbGVGMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhaaGNpQm1iaUE5SUNoMGFHbHpJQ1ltSUhSb2FYTWdJVDA5SUdkc2IySmhiQ0FtSmlCMGFHbHpJR2x1YzNSaGJtTmxiMllnZDNKaGNIQmxjaWtnUHlCRGRHOXlJRG9nWm5WdVl6dGNiaUFnSUNCeVpYUjFjbTRnWm00dVlYQndiSGtvYVhOQ2FXNWtJRDhnZEdocGMwRnlaeUE2SUhSb2FYTXNJR0Z5WjNNcE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCM2NtRndjR1Z5TzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR055WldGMFpWQmhjblJwWVd4WGNtRndjR1Z5TzF4dUlpd2lkbUZ5SUdKaGMyVlRaWFJFWVhSaElEMGdjbVZ4ZFdseVpTZ25MaTlpWVhObFUyVjBSR0YwWVNjcExGeHVJQ0FnSUdOeVpXRjBaVUpwYm1SWGNtRndjR1Z5SUQwZ2NtVnhkV2x5WlNnbkxpOWpjbVZoZEdWQ2FXNWtWM0poY0hCbGNpY3BMRnh1SUNBZ0lHTnlaV0YwWlVoNVluSnBaRmR5WVhCd1pYSWdQU0J5WlhGMWFYSmxLQ2N1TDJOeVpXRjBaVWg1WW5KcFpGZHlZWEJ3WlhJbktTeGNiaUFnSUNCamNtVmhkR1ZRWVhKMGFXRnNWM0poY0hCbGNpQTlJSEpsY1hWcGNtVW9KeTR2WTNKbFlYUmxVR0Z5ZEdsaGJGZHlZWEJ3WlhJbktTeGNiaUFnSUNCblpYUkVZWFJoSUQwZ2NtVnhkV2x5WlNnbkxpOW5aWFJFWVhSaEp5a3NYRzRnSUNBZ2JXVnlaMlZFWVhSaElEMGdjbVZ4ZFdseVpTZ25MaTl0WlhKblpVUmhkR0VuS1N4Y2JpQWdJQ0J6WlhSRVlYUmhJRDBnY21WeGRXbHlaU2duTGk5elpYUkVZWFJoSnlrN1hHNWNiaThxS2lCVmMyVmtJSFJ2SUdOdmJYQnZjMlVnWW1sMGJXRnphM01nWm05eUlIZHlZWEJ3WlhJZ2JXVjBZV1JoZEdFdUlDb3ZYRzUyWVhJZ1FrbE9SRjlHVEVGSElEMGdNU3hjYmlBZ0lDQkNTVTVFWDB0RldWOUdURUZISUQwZ01peGNiaUFnSUNCUVFWSlVTVUZNWDBaTVFVY2dQU0F6TWl4Y2JpQWdJQ0JRUVZKVVNVRk1YMUpKUjBoVVgwWk1RVWNnUFNBMk5EdGNibHh1THlvcUlGVnpaV1FnWVhNZ2RHaGxJR0JVZVhCbFJYSnliM0pnSUcxbGMzTmhaMlVnWm05eUlGd2lSblZ1WTNScGIyNXpYQ0lnYldWMGFHOWtjeTRnS2k5Y2JuWmhjaUJHVlU1RFgwVlNVazlTWDFSRldGUWdQU0FuUlhod1pXTjBaV1FnWVNCbWRXNWpkR2x2YmljN1hHNWNiaThxSUU1aGRHbDJaU0J0WlhSb2IyUWdjbVZtWlhKbGJtTmxjeUJtYjNJZ2RHaHZjMlVnZDJsMGFDQjBhR1VnYzJGdFpTQnVZVzFsSUdGeklHOTBhR1Z5SUdCc2IyUmhjMmhnSUcxbGRHaHZaSE11SUNvdlhHNTJZWElnYm1GMGFYWmxUV0Y0SUQwZ1RXRjBhQzV0WVhnN1hHNWNiaThxS2x4dUlDb2dRM0psWVhSbGN5QmhJR1oxYm1OMGFXOXVJSFJvWVhRZ1pXbDBhR1Z5SUdOMWNuSnBaWE1nYjNJZ2FXNTJiMnRsY3lCZ1puVnVZMkFnZDJsMGFDQnZjSFJwYjI1aGJGeHVJQ29nWUhSb2FYTmdJR0pwYm1ScGJtY2dZVzVrSUhCaGNuUnBZV3hzZVNCaGNIQnNhV1ZrSUdGeVozVnRaVzUwY3k1Y2JpQXFYRzRnS2lCQWNISnBkbUYwWlZ4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJueHpkSEpwYm1kOUlHWjFibU1nVkdobElHWjFibU4wYVc5dUlHOXlJRzFsZEdodlpDQnVZVzFsSUhSdklISmxabVZ5Wlc1alpTNWNiaUFxSUVCd1lYSmhiU0I3Ym5WdFltVnlmU0JpYVhSdFlYTnJJRlJvWlNCaWFYUnRZWE5ySUc5bUlHWnNZV2R6TGx4dUlDb2dJRlJvWlNCaWFYUnRZWE5ySUcxaGVTQmlaU0JqYjIxd2IzTmxaQ0J2WmlCMGFHVWdabTlzYkc5M2FXNW5JR1pzWVdkek9seHVJQ29nSUNBZ0lERWdMU0JnWHk1aWFXNWtZRnh1SUNvZ0lDQWdJRElnTFNCZ1h5NWlhVzVrUzJWNVlGeHVJQ29nSUNBZ0lEUWdMU0JnWHk1amRYSnllV0FnYjNJZ1lGOHVZM1Z5Y25sU2FXZG9kR0FnYjJZZ1lTQmliM1Z1WkNCbWRXNWpkR2x2Ymx4dUlDb2dJQ0FnSURnZ0xTQmdYeTVqZFhKeWVXQmNiaUFxSUNBZ0lERTJJQzBnWUY4dVkzVnljbmxTYVdkb2RHQmNiaUFxSUNBZ0lETXlJQzBnWUY4dWNHRnlkR2xoYkdCY2JpQXFJQ0FnSURZMElDMGdZRjh1Y0dGeWRHbGhiRkpwWjJoMFlGeHVJQ29nSUNBeE1qZ2dMU0JnWHk1eVpXRnlaMkJjYmlBcUlDQWdNalUySUMwZ1lGOHVZWEo1WUZ4dUlDb2dRSEJoY21GdElIc3FmU0JiZEdocGMwRnlaMTBnVkdobElHQjBhR2x6WUNCaWFXNWthVzVuSUc5bUlHQm1kVzVqWUM1Y2JpQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlGdHdZWEowYVdGc2MxMGdWR2hsSUdGeVozVnRaVzUwY3lCMGJ5QmlaU0J3WVhKMGFXRnNiSGtnWVhCd2JHbGxaQzVjYmlBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUZ0b2IyeGtaWEp6WFNCVWFHVWdZSEJoY25ScFlXeHpZQ0J3YkdGalpXaHZiR1JsY2lCcGJtUmxlR1Z6TGx4dUlDb2dRSEJoY21GdElIdEJjbkpoZVgwZ1cyRnlaMUJ2YzEwZ1ZHaGxJR0Z5WjNWdFpXNTBJSEJ2YzJsMGFXOXVjeUJ2WmlCMGFHVWdibVYzSUdaMWJtTjBhVzl1TGx4dUlDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlGdGhjbmxkSUZSb1pTQmhjbWwwZVNCallYQWdiMllnWUdaMWJtTmdMbHh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUZ0aGNtbDBlVjBnVkdobElHRnlhWFI1SUc5bUlHQm1kVzVqWUM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRHZFc1amRHbHZibjBnVW1WMGRYSnVjeUIwYUdVZ2JtVjNJSGR5WVhCd1pXUWdablZ1WTNScGIyNHVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHTnlaV0YwWlZkeVlYQndaWElvWm5WdVl5d2dZbWwwYldGemF5d2dkR2hwYzBGeVp5d2djR0Z5ZEdsaGJITXNJR2h2YkdSbGNuTXNJR0Z5WjFCdmN5d2dZWEo1TENCaGNtbDBlU2tnZTF4dUlDQjJZWElnYVhOQ2FXNWtTMlY1SUQwZ1ltbDBiV0Z6YXlBbUlFSkpUa1JmUzBWWlgwWk1RVWM3WEc0Z0lHbG1JQ2doYVhOQ2FXNWtTMlY1SUNZbUlIUjVjR1Z2WmlCbWRXNWpJQ0U5SUNkbWRXNWpkR2x2YmljcElIdGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtFWlZUa05mUlZKU1QxSmZWRVZZVkNrN1hHNGdJSDFjYmlBZ2RtRnlJR3hsYm1kMGFDQTlJSEJoY25ScFlXeHpJRDhnY0dGeWRHbGhiSE11YkdWdVozUm9JRG9nTUR0Y2JpQWdhV1lnS0NGc1pXNW5kR2dwSUh0Y2JpQWdJQ0JpYVhSdFlYTnJJQ1k5SUg0b1VFRlNWRWxCVEY5R1RFRkhJSHdnVUVGU1ZFbEJURjlTU1VkSVZGOUdURUZIS1R0Y2JpQWdJQ0J3WVhKMGFXRnNjeUE5SUdodmJHUmxjbk1nUFNCdWRXeHNPMXh1SUNCOVhHNGdJR3hsYm1kMGFDQXRQU0FvYUc5c1pHVnljeUEvSUdodmJHUmxjbk11YkdWdVozUm9JRG9nTUNrN1hHNGdJR2xtSUNoaWFYUnRZWE5ySUNZZ1VFRlNWRWxCVEY5U1NVZElWRjlHVEVGSEtTQjdYRzRnSUNBZ2RtRnlJSEJoY25ScFlXeHpVbWxuYUhRZ1BTQndZWEowYVdGc2N5eGNiaUFnSUNBZ0lDQWdhRzlzWkdWeWMxSnBaMmgwSUQwZ2FHOXNaR1Z5Y3p0Y2JseHVJQ0FnSUhCaGNuUnBZV3h6SUQwZ2FHOXNaR1Z5Y3lBOUlHNTFiR3c3WEc0Z0lIMWNiaUFnZG1GeUlHUmhkR0VnUFNCcGMwSnBibVJMWlhrZ1B5QnVkV3hzSURvZ1oyVjBSR0YwWVNobWRXNWpLU3hjYmlBZ0lDQWdJRzVsZDBSaGRHRWdQU0JiWm5WdVl5d2dZbWwwYldGemF5d2dkR2hwYzBGeVp5d2djR0Z5ZEdsaGJITXNJR2h2YkdSbGNuTXNJSEJoY25ScFlXeHpVbWxuYUhRc0lHaHZiR1JsY25OU2FXZG9kQ3dnWVhKblVHOXpMQ0JoY25rc0lHRnlhWFI1WFR0Y2JseHVJQ0JwWmlBb1pHRjBZU2tnZTF4dUlDQWdJRzFsY21kbFJHRjBZU2h1WlhkRVlYUmhMQ0JrWVhSaEtUdGNiaUFnSUNCaWFYUnRZWE5ySUQwZ2JtVjNSR0YwWVZzeFhUdGNiaUFnSUNCaGNtbDBlU0E5SUc1bGQwUmhkR0ZiT1YwN1hHNGdJSDFjYmlBZ2JtVjNSR0YwWVZzNVhTQTlJR0Z5YVhSNUlEMDlJRzUxYkd4Y2JpQWdJQ0EvSUNocGMwSnBibVJMWlhrZ1B5QXdJRG9nWm5WdVl5NXNaVzVuZEdncFhHNGdJQ0FnT2lBb2JtRjBhWFpsVFdGNEtHRnlhWFI1SUMwZ2JHVnVaM1JvTENBd0tTQjhmQ0F3S1R0Y2JseHVJQ0JwWmlBb1ltbDBiV0Z6YXlBOVBTQkNTVTVFWDBaTVFVY3BJSHRjYmlBZ0lDQjJZWElnY21WemRXeDBJRDBnWTNKbFlYUmxRbWx1WkZkeVlYQndaWElvYm1WM1JHRjBZVnN3WFN3Z2JtVjNSR0YwWVZzeVhTazdYRzRnSUgwZ1pXeHpaU0JwWmlBb0tHSnBkRzFoYzJzZ1BUMGdVRUZTVkVsQlRGOUdURUZISUh4OElHSnBkRzFoYzJzZ1BUMGdLRUpKVGtSZlJreEJSeUI4SUZCQlVsUkpRVXhmUmt4QlJ5a3BJQ1ltSUNGdVpYZEVZWFJoV3pSZExteGxibWQwYUNrZ2UxeHVJQ0FnSUhKbGMzVnNkQ0E5SUdOeVpXRjBaVkJoY25ScFlXeFhjbUZ3Y0dWeUxtRndjR3g1S0hWdVpHVm1hVzVsWkN3Z2JtVjNSR0YwWVNrN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2NtVnpkV3gwSUQwZ1kzSmxZWFJsU0hsaWNtbGtWM0poY0hCbGNpNWhjSEJzZVNoMWJtUmxabWx1WldRc0lHNWxkMFJoZEdFcE8xeHVJQ0I5WEc0Z0lIWmhjaUJ6WlhSMFpYSWdQU0JrWVhSaElEOGdZbUZ6WlZObGRFUmhkR0VnT2lCelpYUkVZWFJoTzF4dUlDQnlaWFIxY200Z2MyVjBkR1Z5S0hKbGMzVnNkQ3dnYm1WM1JHRjBZU2s3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdZM0psWVhSbFYzSmhjSEJsY2p0Y2JpSXNJaThxS2x4dUlDb2dRU0J6Y0dWamFXRnNhWHBsWkNCMlpYSnphVzl1SUc5bUlHQmlZWE5sU1hORmNYVmhiRVJsWlhCZ0lHWnZjaUJoY25KaGVYTWdkMmwwYUNCemRYQndiM0owSUdadmNseHVJQ29nY0dGeWRHbGhiQ0JrWldWd0lHTnZiWEJoY21semIyNXpMbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZTBGeWNtRjVmU0JoY25KaGVTQlVhR1VnWVhKeVlYa2dkRzhnWTI5dGNHRnlaUzVjYmlBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUc5MGFHVnlJRlJvWlNCdmRHaGxjaUJoY25KaGVTQjBieUJqYjIxd1lYSmxMbHh1SUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ1pYRjFZV3hHZFc1aklGUm9aU0JtZFc1amRHbHZiaUIwYnlCa1pYUmxjbTFwYm1VZ1pYRjFhWFpoYkdWdWRITWdiMllnZG1Gc2RXVnpMbHh1SUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ1cyTjFjM1J2YldsNlpYSmRJRlJvWlNCbWRXNWpkR2x2YmlCMGJ5QmpkWE4wYjIxcGVtVWdZMjl0Y0dGeWFXNW5JR0Z5Y21GNWN5NWNiaUFxSUVCd1lYSmhiU0I3WW05dmJHVmhibjBnVzJselRHOXZjMlZkSUZOd1pXTnBabmtnY0dWeVptOXliV2x1WnlCd1lYSjBhV0ZzSUdOdmJYQmhjbWx6YjI1ekxseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdXM04wWVdOclFWMGdWSEpoWTJ0eklIUnlZWFpsY25ObFpDQmdkbUZzZFdWZ0lHOWlhbVZqZEhNdVhHNGdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQmJjM1JoWTJ0Q1hTQlVjbUZqYTNNZ2RISmhkbVZ5YzJWa0lHQnZkR2hsY21BZ2IySnFaV04wY3k1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRpYjI5c1pXRnVmU0JTWlhSMWNtNXpJR0IwY25WbFlDQnBaaUIwYUdVZ1lYSnlZWGx6SUdGeVpTQmxjWFZwZG1Gc1pXNTBMQ0JsYkhObElHQm1ZV3h6WldBdVhHNGdLaTljYm1aMWJtTjBhVzl1SUdWeGRXRnNRWEp5WVhsektHRnljbUY1TENCdmRHaGxjaXdnWlhGMVlXeEdkVzVqTENCamRYTjBiMjFwZW1WeUxDQnBjMHh2YjNObExDQnpkR0ZqYTBFc0lITjBZV05yUWlrZ2UxeHVJQ0IyWVhJZ2FXNWtaWGdnUFNBdE1TeGNiaUFnSUNBZ0lHRnlja3hsYm1kMGFDQTlJR0Z5Y21GNUxteGxibWQwYUN4Y2JpQWdJQ0FnSUc5MGFFeGxibWQwYUNBOUlHOTBhR1Z5TG14bGJtZDBhQ3hjYmlBZ0lDQWdJSEpsYzNWc2RDQTlJSFJ5ZFdVN1hHNWNiaUFnYVdZZ0tHRnlja3hsYm1kMGFDQWhQU0J2ZEdoTVpXNW5kR2dnSmlZZ0lTaHBjMHh2YjNObElDWW1JRzkwYUV4bGJtZDBhQ0ErSUdGeWNreGxibWQwYUNrcElIdGNiaUFnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUgxY2JpQWdMeThnUkdWbGNDQmpiMjF3WVhKbElIUm9aU0JqYjI1MFpXNTBjeXdnYVdkdWIzSnBibWNnYm05dUxXNTFiV1Z5YVdNZ2NISnZjR1Z5ZEdsbGN5NWNiaUFnZDJocGJHVWdLSEpsYzNWc2RDQW1KaUFySzJsdVpHVjRJRHdnWVhKeVRHVnVaM1JvS1NCN1hHNGdJQ0FnZG1GeUlHRnljbFpoYkhWbElEMGdZWEp5WVhsYmFXNWtaWGhkTEZ4dUlDQWdJQ0FnSUNCdmRHaFdZV3gxWlNBOUlHOTBhR1Z5VzJsdVpHVjRYVHRjYmx4dUlDQWdJSEpsYzNWc2RDQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQnBaaUFvWTNWemRHOXRhWHBsY2lrZ2UxeHVJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2FYTk1iMjl6WlZ4dUlDQWdJQ0FnSUNBL0lHTjFjM1J2YldsNlpYSW9iM1JvVm1Gc2RXVXNJR0Z5Y2xaaGJIVmxMQ0JwYm1SbGVDbGNiaUFnSUNBZ0lDQWdPaUJqZFhOMGIyMXBlbVZ5S0dGeWNsWmhiSFZsTENCdmRHaFdZV3gxWlN3Z2FXNWtaWGdwTzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvZEhsd1pXOW1JSEpsYzNWc2RDQTlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUNBZ0x5OGdVbVZqZFhKemFYWmxiSGtnWTI5dGNHRnlaU0JoY25KaGVYTWdLSE4xYzJObGNIUnBZbXhsSUhSdklHTmhiR3dnYzNSaFkyc2diR2x0YVhSektTNWNiaUFnSUNBZ0lHbG1JQ2hwYzB4dmIzTmxLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnZkR2hKYm1SbGVDQTlJRzkwYUV4bGJtZDBhRHRjYmlBZ0lDQWdJQ0FnZDJocGJHVWdLRzkwYUVsdVpHVjRMUzBwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnZkR2hXWVd4MVpTQTlJRzkwYUdWeVcyOTBhRWx1WkdWNFhUdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0FvWVhKeVZtRnNkV1VnSmlZZ1lYSnlWbUZzZFdVZ1BUMDlJRzkwYUZaaGJIVmxLU0I4ZkNCbGNYVmhiRVoxYm1Nb1lYSnlWbUZzZFdVc0lHOTBhRlpoYkhWbExDQmpkWE4wYjIxcGVtVnlMQ0JwYzB4dmIzTmxMQ0J6ZEdGamEwRXNJSE4wWVdOclFpazdYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tISmxjM1ZzZENrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWW5KbFlXczdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCeVpYTjFiSFFnUFNBb1lYSnlWbUZzZFdVZ0ppWWdZWEp5Vm1Gc2RXVWdQVDA5SUc5MGFGWmhiSFZsS1NCOGZDQmxjWFZoYkVaMWJtTW9ZWEp5Vm1Gc2RXVXNJRzkwYUZaaGJIVmxMQ0JqZFhOMGIyMXBlbVZ5TENCcGMweHZiM05sTENCemRHRmphMEVzSUhOMFlXTnJRaWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNGdJSEpsZEhWeWJpQWhJWEpsYzNWc2REdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCbGNYVmhiRUZ5Y21GNWN6dGNiaUlzSWk4cUtpQmdUMkpxWldOMEkzUnZVM1J5YVc1bllDQnlaWE4xYkhRZ2NtVm1aWEpsYm1ObGN5NGdLaTljYm5aaGNpQmliMjlzVkdGbklEMGdKMXR2WW1wbFkzUWdRbTl2YkdWaGJsMG5MRnh1SUNBZ0lHUmhkR1ZVWVdjZ1BTQW5XMjlpYW1WamRDQkVZWFJsWFNjc1hHNGdJQ0FnWlhKeWIzSlVZV2NnUFNBblcyOWlhbVZqZENCRmNuSnZjbDBuTEZ4dUlDQWdJRzUxYldKbGNsUmhaeUE5SUNkYmIySnFaV04wSUU1MWJXSmxjbDBuTEZ4dUlDQWdJSEpsWjJWNGNGUmhaeUE5SUNkYmIySnFaV04wSUZKbFowVjRjRjBuTEZ4dUlDQWdJSE4wY21sdVoxUmhaeUE5SUNkYmIySnFaV04wSUZOMGNtbHVaMTBuTzF4dVhHNHZLaXBjYmlBcUlFRWdjM0JsWTJsaGJHbDZaV1FnZG1WeWMybHZiaUJ2WmlCZ1ltRnpaVWx6UlhGMVlXeEVaV1Z3WUNCbWIzSWdZMjl0Y0dGeWFXNW5JRzlpYW1WamRITWdiMlpjYmlBcUlIUm9aU0J6WVcxbElHQjBiMU4wY21sdVoxUmhaMkF1WEc0Z0tseHVJQ29nS2lwT2IzUmxPaW9xSUZSb2FYTWdablZ1WTNScGIyNGdiMjVzZVNCemRYQndiM0owY3lCamIyMXdZWEpwYm1jZ2RtRnNkV1Z6SUhkcGRHZ2dkR0ZuY3lCdlpseHVJQ29nWUVKdmIyeGxZVzVnTENCZ1JHRjBaV0FzSUdCRmNuSnZjbUFzSUdCT2RXMWlaWEpnTENCZ1VtVm5SWGh3WUN3Z2IzSWdZRk4wY21sdVoyQXVYRzRnS2x4dUlDb2dRSEJ5YVhaaGRHVmNiaUFxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0IyWVd4MVpTQlVhR1VnYjJKcVpXTjBJSFJ2SUdOdmJYQmhjbVV1WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IzUm9aWElnVkdobElHOTBhR1Z5SUc5aWFtVmpkQ0IwYnlCamIyMXdZWEpsTGx4dUlDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlIUmhaeUJVYUdVZ1lIUnZVM1J5YVc1blZHRm5ZQ0J2WmlCMGFHVWdiMkpxWldOMGN5QjBieUJqYjIxd1lYSmxMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UySnZiMnhsWVc1OUlGSmxkSFZ5Ym5NZ1lIUnlkV1ZnSUdsbUlIUm9aU0J2WW1wbFkzUnpJR0Z5WlNCbGNYVnBkbUZzWlc1MExDQmxiSE5sSUdCbVlXeHpaV0F1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR1Z4ZFdGc1FubFVZV2NvYjJKcVpXTjBMQ0J2ZEdobGNpd2dkR0ZuS1NCN1hHNGdJSE4zYVhSamFDQW9kR0ZuS1NCN1hHNGdJQ0FnWTJGelpTQmliMjlzVkdGbk9seHVJQ0FnSUdOaGMyVWdaR0YwWlZSaFp6cGNiaUFnSUNBZ0lDOHZJRU52WlhKalpTQmtZWFJsY3lCaGJtUWdZbTl2YkdWaGJuTWdkRzhnYm5WdFltVnljeXdnWkdGMFpYTWdkRzhnYldsc2JHbHpaV052Ym1SeklHRnVaQ0JpYjI5c1pXRnVjMXh1SUNBZ0lDQWdMeThnZEc4Z1lERmdJRzl5SUdBd1lDQjBjbVZoZEdsdVp5QnBiblpoYkdsa0lHUmhkR1Z6SUdOdlpYSmpaV1FnZEc4Z1lFNWhUbUFnWVhNZ2JtOTBJR1Z4ZFdGc0xseHVJQ0FnSUNBZ2NtVjBkWEp1SUN0dlltcGxZM1FnUFQwZ0syOTBhR1Z5TzF4dVhHNGdJQ0FnWTJGelpTQmxjbkp2Y2xSaFp6cGNiaUFnSUNBZ0lISmxkSFZ5YmlCdlltcGxZM1F1Ym1GdFpTQTlQU0J2ZEdobGNpNXVZVzFsSUNZbUlHOWlhbVZqZEM1dFpYTnpZV2RsSUQwOUlHOTBhR1Z5TG0xbGMzTmhaMlU3WEc1Y2JpQWdJQ0JqWVhObElHNTFiV0psY2xSaFp6cGNiaUFnSUNBZ0lDOHZJRlJ5WldGMElHQk9ZVTVnSUhaekxpQmdUbUZPWUNCaGN5QmxjWFZoYkM1Y2JpQWdJQ0FnSUhKbGRIVnliaUFvYjJKcVpXTjBJQ0U5SUN0dlltcGxZM1FwWEc0Z0lDQWdJQ0FnSUQ4Z2IzUm9aWElnSVQwZ0syOTBhR1Z5WEc0Z0lDQWdJQ0FnSUM4dklFSjFkQ3dnZEhKbFlYUWdZQzB3WUNCMmN5NGdZQ3N3WUNCaGN5QnViM1FnWlhGMVlXd3VYRzRnSUNBZ0lDQWdJRG9nS0c5aWFtVmpkQ0E5UFNBd0lEOGdLQ2d4SUM4Z2IySnFaV04wS1NBOVBTQW9NU0F2SUc5MGFHVnlLU2tnT2lCdlltcGxZM1FnUFQwZ0syOTBhR1Z5S1R0Y2JseHVJQ0FnSUdOaGMyVWdjbVZuWlhod1ZHRm5PbHh1SUNBZ0lHTmhjMlVnYzNSeWFXNW5WR0ZuT2x4dUlDQWdJQ0FnTHk4Z1EyOWxjbU5sSUhKbFoyVjRaWE1nZEc4Z2MzUnlhVzVuY3lCaGJtUWdkSEpsWVhRZ2MzUnlhVzVuY3lCd2NtbHRhWFJwZG1WeklHRnVaQ0J6ZEhKcGJtZGNiaUFnSUNBZ0lDOHZJRzlpYW1WamRITWdZWE1nWlhGMVlXd3VJRk5sWlNCb2RIUndjem92TDJWek5TNW5hWFJvZFdJdWFXOHZJM2d4TlM0eE1DNDJMalFnWm05eUlHMXZjbVVnWkdWMFlXbHNjeTVjYmlBZ0lDQWdJSEpsZEhWeWJpQnZZbXBsWTNRZ1BUMGdLRzkwYUdWeUlDc2dKeWNwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJtWVd4elpUdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCbGNYVmhiRUo1VkdGbk8xeHVJaXdpZG1GeUlHdGxlWE1nUFNCeVpYRjFhWEpsS0NjdUxpOXZZbXBsWTNRdmEyVjVjeWNwTzF4dVhHNHZLaW9nVlhObFpDQm1iM0lnYm1GMGFYWmxJRzFsZEdodlpDQnlaV1psY21WdVkyVnpMaUFxTDF4dWRtRnlJRzlpYW1WamRGQnliM1J2SUQwZ1QySnFaV04wTG5CeWIzUnZkSGx3WlR0Y2JseHVMeW9xSUZWelpXUWdkRzhnWTJobFkyc2diMkpxWldOMGN5Qm1iM0lnYjNkdUlIQnliM0JsY25ScFpYTXVJQ292WEc1MllYSWdhR0Z6VDNkdVVISnZjR1Z5ZEhrZ1BTQnZZbXBsWTNSUWNtOTBieTVvWVhOUGQyNVFjbTl3WlhKMGVUdGNibHh1THlvcVhHNGdLaUJCSUhOd1pXTnBZV3hwZW1Wa0lIWmxjbk5wYjI0Z2IyWWdZR0poYzJWSmMwVnhkV0ZzUkdWbGNHQWdabTl5SUc5aWFtVmpkSE1nZDJsMGFDQnpkWEJ3YjNKMElHWnZjbHh1SUNvZ2NHRnlkR2xoYkNCa1pXVndJR052YlhCaGNtbHpiMjV6TGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IySnFaV04wSUZSb1pTQnZZbXBsWTNRZ2RHOGdZMjl0Y0dGeVpTNWNiaUFxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2ZEdobGNpQlVhR1VnYjNSb1pYSWdiMkpxWldOMElIUnZJR052YlhCaGNtVXVYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCbGNYVmhiRVoxYm1NZ1ZHaGxJR1oxYm1OMGFXOXVJSFJ2SUdSbGRHVnliV2x1WlNCbGNYVnBkbUZzWlc1MGN5QnZaaUIyWVd4MVpYTXVYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCYlkzVnpkRzl0YVhwbGNsMGdWR2hsSUdaMWJtTjBhVzl1SUhSdklHTjFjM1J2YldsNlpTQmpiMjF3WVhKcGJtY2dkbUZzZFdWekxseHVJQ29nUUhCaGNtRnRJSHRpYjI5c1pXRnVmU0JiYVhOTWIyOXpaVjBnVTNCbFkybG1lU0J3WlhKbWIzSnRhVzVuSUhCaGNuUnBZV3dnWTI5dGNHRnlhWE52Ym5NdVhHNGdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQmJjM1JoWTJ0QlhTQlVjbUZqYTNNZ2RISmhkbVZ5YzJWa0lHQjJZV3gxWldBZ2IySnFaV04wY3k1Y2JpQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlGdHpkR0ZqYTBKZElGUnlZV05yY3lCMGNtRjJaWEp6WldRZ1lHOTBhR1Z5WUNCdlltcGxZM1J6TGx4dUlDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlJRkpsZEhWeWJuTWdZSFJ5ZFdWZ0lHbG1JSFJvWlNCdlltcGxZM1J6SUdGeVpTQmxjWFZwZG1Gc1pXNTBMQ0JsYkhObElHQm1ZV3h6WldBdVhHNGdLaTljYm1aMWJtTjBhVzl1SUdWeGRXRnNUMkpxWldOMGN5aHZZbXBsWTNRc0lHOTBhR1Z5TENCbGNYVmhiRVoxYm1Nc0lHTjFjM1J2YldsNlpYSXNJR2x6VEc5dmMyVXNJSE4wWVdOclFTd2djM1JoWTJ0Q0tTQjdYRzRnSUhaaGNpQnZZbXBRY205d2N5QTlJR3RsZVhNb2IySnFaV04wS1N4Y2JpQWdJQ0FnSUc5aWFreGxibWQwYUNBOUlHOWlhbEJ5YjNCekxteGxibWQwYUN4Y2JpQWdJQ0FnSUc5MGFGQnliM0J6SUQwZ2EyVjVjeWh2ZEdobGNpa3NYRzRnSUNBZ0lDQnZkR2hNWlc1bmRHZ2dQU0J2ZEdoUWNtOXdjeTVzWlc1bmRHZzdYRzVjYmlBZ2FXWWdLRzlpYWt4bGJtZDBhQ0FoUFNCdmRHaE1aVzVuZEdnZ0ppWWdJV2x6VEc5dmMyVXBJSHRjYmlBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lIMWNiaUFnZG1GeUlITnJhWEJEZEc5eUlEMGdhWE5NYjI5elpTeGNiaUFnSUNBZ0lHbHVaR1Y0SUQwZ0xURTdYRzVjYmlBZ2QyaHBiR1VnS0NzcmFXNWtaWGdnUENCdlltcE1aVzVuZEdncElIdGNiaUFnSUNCMllYSWdhMlY1SUQwZ2IySnFVSEp2Y0hOYmFXNWtaWGhkTEZ4dUlDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCcGMweHZiM05sSUQ4Z2EyVjVJR2x1SUc5MGFHVnlJRG9nYUdGelQzZHVVSEp2Y0dWeWRIa3VZMkZzYkNodmRHaGxjaXdnYTJWNUtUdGNibHh1SUNBZ0lHbG1JQ2h5WlhOMWJIUXBJSHRjYmlBZ0lDQWdJSFpoY2lCdlltcFdZV3gxWlNBOUlHOWlhbVZqZEZ0clpYbGRMRnh1SUNBZ0lDQWdJQ0FnSUc5MGFGWmhiSFZsSUQwZ2IzUm9aWEpiYTJWNVhUdGNibHh1SUNBZ0lDQWdjbVZ6ZFd4MElEMGdkVzVrWldacGJtVmtPMXh1SUNBZ0lDQWdhV1lnS0dOMWMzUnZiV2w2WlhJcElIdGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdhWE5NYjI5elpWeHVJQ0FnSUNBZ0lDQWdJRDhnWTNWemRHOXRhWHBsY2lodmRHaFdZV3gxWlN3Z2IySnFWbUZzZFdVc0lHdGxlU2xjYmlBZ0lDQWdJQ0FnSUNBNklHTjFjM1J2YldsNlpYSW9iMkpxVm1Gc2RXVXNJRzkwYUZaaGJIVmxMQ0JyWlhrcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnlaWE4xYkhRZ1BUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdVbVZqZFhKemFYWmxiSGtnWTI5dGNHRnlaU0J2WW1wbFkzUnpJQ2h6ZFhOalpYQjBhV0pzWlNCMGJ5QmpZV3hzSUhOMFlXTnJJR3hwYldsMGN5a3VYRzRnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJQ2h2WW1wV1lXeDFaU0FtSmlCdlltcFdZV3gxWlNBOVBUMGdiM1JvVm1Gc2RXVXBJSHg4SUdWeGRXRnNSblZ1WXlodlltcFdZV3gxWlN3Z2IzUm9WbUZzZFdVc0lHTjFjM1J2YldsNlpYSXNJR2x6VEc5dmMyVXNJSE4wWVdOclFTd2djM1JoWTJ0Q0tUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tDRnlaWE4xYkhRcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQjlYRzRnSUNBZ2MydHBjRU4wYjNJZ2ZId2dLSE5yYVhCRGRHOXlJRDBnYTJWNUlEMDlJQ2RqYjI1emRISjFZM1J2Y2ljcE8xeHVJQ0I5WEc0Z0lHbG1JQ2doYzJ0cGNFTjBiM0lwSUh0Y2JpQWdJQ0IyWVhJZ2IySnFRM1J2Y2lBOUlHOWlhbVZqZEM1amIyNXpkSEoxWTNSdmNpeGNiaUFnSUNBZ0lDQWdiM1JvUTNSdmNpQTlJRzkwYUdWeUxtTnZibk4wY25WamRHOXlPMXh1WEc0Z0lDQWdMeThnVG05dUlHQlBZbXBsWTNSZ0lHOWlhbVZqZENCcGJuTjBZVzVqWlhNZ2QybDBhQ0JrYVdabVpYSmxiblFnWTI5dWMzUnlkV04wYjNKeklHRnlaU0J1YjNRZ1pYRjFZV3d1WEc0Z0lDQWdhV1lnS0c5aWFrTjBiM0lnSVQwZ2IzUm9RM1J2Y2lBbUpseHVJQ0FnSUNBZ0lDQW9KMk52Ym5OMGNuVmpkRzl5SnlCcGJpQnZZbXBsWTNRZ0ppWWdKMk52Ym5OMGNuVmpkRzl5SnlCcGJpQnZkR2hsY2lrZ0ppWmNiaUFnSUNBZ0lDQWdJU2gwZVhCbGIyWWdiMkpxUTNSdmNpQTlQU0FuWm5WdVkzUnBiMjRuSUNZbUlHOWlha04wYjNJZ2FXNXpkR0Z1WTJWdlppQnZZbXBEZEc5eUlDWW1YRzRnSUNBZ0lDQWdJQ0FnZEhsd1pXOW1JRzkwYUVOMGIzSWdQVDBnSjJaMWJtTjBhVzl1SnlBbUppQnZkR2hEZEc5eUlHbHVjM1JoYm1ObGIyWWdiM1JvUTNSdmNpa3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJSFJ5ZFdVN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWlhGMVlXeFBZbXBsWTNSek8xeHVJaXdpZG1GeUlHMWxkR0ZOWVhBZ1BTQnlaWEYxYVhKbEtDY3VMMjFsZEdGTllYQW5LU3hjYmlBZ0lDQnViMjl3SUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkdsMGVTOXViMjl3SnlrN1hHNWNiaThxS2x4dUlDb2dSMlYwY3lCdFpYUmhaR0YwWVNCbWIzSWdZR1oxYm1OZ0xseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JtZFc1aklGUm9aU0JtZFc1amRHbHZiaUIwYnlCeGRXVnllUzVjYmlBcUlFQnlaWFIxY201eklIc3FmU0JTWlhSMWNtNXpJSFJvWlNCdFpYUmhaR0YwWVNCbWIzSWdZR1oxYm1OZ0xseHVJQ292WEc1MllYSWdaMlYwUkdGMFlTQTlJQ0Z0WlhSaFRXRndJRDhnYm05dmNDQTZJR1oxYm1OMGFXOXVLR1oxYm1NcElIdGNiaUFnY21WMGRYSnVJRzFsZEdGTllYQXVaMlYwS0daMWJtTXBPMXh1ZlR0Y2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQm5aWFJFWVhSaE8xeHVJaXdpZG1GeUlHSmhjMlZRY205d1pYSjBlU0E5SUhKbGNYVnBjbVVvSnk0dlltRnpaVkJ5YjNCbGNuUjVKeWtzWEc0Z0lDQWdZMjl1YzNSaGJuUWdQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNhWFI1TDJOdmJuTjBZVzUwSnlrc1hHNGdJQ0FnY21WaGJFNWhiV1Z6SUQwZ2NtVnhkV2x5WlNnbkxpOXlaV0ZzVG1GdFpYTW5LU3hjYmlBZ0lDQnpkWEJ3YjNKMElEMGdjbVZ4ZFdseVpTZ25MaTR2YzNWd2NHOXlkQ2NwTzF4dVhHNHZLaXBjYmlBcUlFZGxkSE1nZEdobElHNWhiV1VnYjJZZ1lHWjFibU5nTGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQm1kVzVqSUZSb1pTQm1kVzVqZEdsdmJpQjBieUJ4ZFdWeWVTNWNiaUFxSUVCeVpYUjFjbTV6SUh0emRISnBibWQ5SUZKbGRIVnlibk1nZEdobElHWjFibU4wYVc5dUlHNWhiV1V1WEc0Z0tpOWNiblpoY2lCblpYUkdkVzVqVG1GdFpTQTlJQ2htZFc1amRHbHZiaWdwSUh0Y2JpQWdhV1lnS0NGemRYQndiM0owTG1aMWJtTk9ZVzFsY3lrZ2UxeHVJQ0FnSUhKbGRIVnliaUJqYjI1emRHRnVkQ2duSnlrN1hHNGdJSDFjYmlBZ2FXWWdLR052Ym5OMFlXNTBMbTVoYldVZ1BUMGdKMk52Ym5OMFlXNTBKeWtnZTF4dUlDQWdJSEpsZEhWeWJpQmlZWE5sVUhKdmNHVnlkSGtvSjI1aGJXVW5LVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9ablZ1WXlrZ2UxeHVJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQm1kVzVqTG01aGJXVXNYRzRnSUNBZ0lDQWdJR0Z5Y21GNUlEMGdjbVZoYkU1aGJXVnpXM0psYzNWc2RGMHNYRzRnSUNBZ0lDQWdJR3hsYm1kMGFDQTlJR0Z5Y21GNUlEOGdZWEp5WVhrdWJHVnVaM1JvSURvZ01EdGNibHh1SUNBZ0lIZG9hV3hsSUNoc1pXNW5kR2d0TFNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1JoZEdFZ1BTQmhjbkpoZVZ0c1pXNW5kR2hkTEZ4dUlDQWdJQ0FnSUNBZ0lHOTBhR1Z5Um5WdVl5QTlJR1JoZEdFdVpuVnVZenRjYmx4dUlDQWdJQ0FnYVdZZ0tHOTBhR1Z5Um5WdVl5QTlQU0J1ZFd4c0lIeDhJRzkwYUdWeVJuVnVZeUE5UFNCbWRXNWpLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJrWVhSaExtNWhiV1U3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc0Z0lIMDdYRzU5S0NrcE8xeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR2RsZEVaMWJtTk9ZVzFsTzF4dUlpd2lMeW9xWEc0Z0tpQkhaWFJ6SUhSb1pTQnBibVJsZUNCaGRDQjNhR2xqYUNCMGFHVWdabWx5YzNRZ2IyTmpkWEp5Wlc1alpTQnZaaUJnVG1GT1lDQnBjeUJtYjNWdVpDQnBiaUJnWVhKeVlYbGdMbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZTBGeWNtRjVmU0JoY25KaGVTQlVhR1VnWVhKeVlYa2dkRzhnYzJWaGNtTm9MbHh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUdaeWIyMUpibVJsZUNCVWFHVWdhVzVrWlhnZ2RHOGdjMlZoY21Ob0lHWnliMjB1WEc0Z0tpQkFjR0Z5WVcwZ2UySnZiMnhsWVc1OUlGdG1jbTl0VW1sbmFIUmRJRk53WldOcFpua2dhWFJsY21GMGFXNW5JR1p5YjIwZ2NtbG5hSFFnZEc4Z2JHVm1kQzVjYmlBcUlFQnlaWFIxY201eklIdHVkVzFpWlhKOUlGSmxkSFZ5Ym5NZ2RHaGxJR2x1WkdWNElHOW1JSFJvWlNCdFlYUmphR1ZrSUdCT1lVNWdMQ0JsYkhObElHQXRNV0F1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR2x1WkdWNFQyWk9ZVTRvWVhKeVlYa3NJR1p5YjIxSmJtUmxlQ3dnWm5KdmJWSnBaMmgwS1NCN1hHNGdJSFpoY2lCc1pXNW5kR2dnUFNCaGNuSmhlUzVzWlc1bmRHZ3NYRzRnSUNBZ0lDQnBibVJsZUNBOUlHWnliMjFKYm1SbGVDQXJJQ2htY205dFVtbG5hSFFnUHlBd0lEb2dMVEVwTzF4dVhHNGdJSGRvYVd4bElDZ29abkp2YlZKcFoyaDBJRDhnYVc1a1pYZ3RMU0E2SUNzcmFXNWtaWGdnUENCc1pXNW5kR2dwS1NCN1hHNGdJQ0FnZG1GeUlHOTBhR1Z5SUQwZ1lYSnlZWGxiYVc1a1pYaGRPMXh1SUNBZ0lHbG1JQ2h2ZEdobGNpQWhQVDBnYjNSb1pYSXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnBibVJsZUR0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJQzB4TzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR2x1WkdWNFQyWk9ZVTQ3WEc0aUxDSXZLaW9nVlhObFpDQm1iM0lnYm1GMGFYWmxJRzFsZEdodlpDQnlaV1psY21WdVkyVnpMaUFxTDF4dWRtRnlJRzlpYW1WamRGQnliM1J2SUQwZ1QySnFaV04wTG5CeWIzUnZkSGx3WlR0Y2JseHVMeW9xSUZWelpXUWdkRzhnWTJobFkyc2diMkpxWldOMGN5Qm1iM0lnYjNkdUlIQnliM0JsY25ScFpYTXVJQ292WEc1MllYSWdhR0Z6VDNkdVVISnZjR1Z5ZEhrZ1BTQnZZbXBsWTNSUWNtOTBieTVvWVhOUGQyNVFjbTl3WlhKMGVUdGNibHh1THlvcVhHNGdLaUJKYm1sMGFXRnNhWHBsY3lCaGJpQmhjbkpoZVNCamJHOXVaUzVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnWVhKeVlYa2dWR2hsSUdGeWNtRjVJSFJ2SUdOc2IyNWxMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UwRnljbUY1ZlNCU1pYUjFjbTV6SUhSb1pTQnBibWwwYVdGc2FYcGxaQ0JqYkc5dVpTNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z2FXNXBkRU5zYjI1bFFYSnlZWGtvWVhKeVlYa3BJSHRjYmlBZ2RtRnlJR3hsYm1kMGFDQTlJR0Z5Y21GNUxteGxibWQwYUN4Y2JpQWdJQ0FnSUhKbGMzVnNkQ0E5SUc1bGR5QmhjbkpoZVM1amIyNXpkSEoxWTNSdmNpaHNaVzVuZEdncE8xeHVYRzRnSUM4dklFRmtaQ0JoY25KaGVTQndjbTl3WlhKMGFXVnpJR0Z6YzJsbmJtVmtJR0o1SUdCU1pXZEZlSEFqWlhobFkyQXVYRzRnSUdsbUlDaHNaVzVuZEdnZ0ppWWdkSGx3Wlc5bUlHRnljbUY1V3pCZElEMDlJQ2R6ZEhKcGJtY25JQ1ltSUdoaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b1lYSnlZWGtzSUNkcGJtUmxlQ2NwS1NCN1hHNGdJQ0FnY21WemRXeDBMbWx1WkdWNElEMGdZWEp5WVhrdWFXNWtaWGc3WEc0Z0lDQWdjbVZ6ZFd4MExtbHVjSFYwSUQwZ1lYSnlZWGt1YVc1d2RYUTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JwYm1sMFEyeHZibVZCY25KaGVUdGNiaUlzSW5aaGNpQmlkV1ptWlhKRGJHOXVaU0E5SUhKbGNYVnBjbVVvSnk0dlluVm1abVZ5UTJ4dmJtVW5LVHRjYmx4dUx5b3FJR0JQWW1wbFkzUWpkRzlUZEhKcGJtZGdJSEpsYzNWc2RDQnlaV1psY21WdVkyVnpMaUFxTDF4dWRtRnlJR0p2YjJ4VVlXY2dQU0FuVzI5aWFtVmpkQ0JDYjI5c1pXRnVYU2NzWEc0Z0lDQWdaR0YwWlZSaFp5QTlJQ2RiYjJKcVpXTjBJRVJoZEdWZEp5eGNiaUFnSUNCdWRXMWlaWEpVWVdjZ1BTQW5XMjlpYW1WamRDQk9kVzFpWlhKZEp5eGNiaUFnSUNCeVpXZGxlSEJVWVdjZ1BTQW5XMjlpYW1WamRDQlNaV2RGZUhCZEp5eGNiaUFnSUNCemRISnBibWRVWVdjZ1BTQW5XMjlpYW1WamRDQlRkSEpwYm1kZEp6dGNibHh1ZG1GeUlHRnljbUY1UW5WbVptVnlWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1FYSnlZWGxDZFdabVpYSmRKeXhjYmlBZ0lDQm1iRzloZERNeVZHRm5JRDBnSjF0dlltcGxZM1FnUm14dllYUXpNa0Z5Y21GNVhTY3NYRzRnSUNBZ1pteHZZWFEyTkZSaFp5QTlJQ2RiYjJKcVpXTjBJRVpzYjJGME5qUkJjbkpoZVYwbkxGeHVJQ0FnSUdsdWREaFVZV2NnUFNBblcyOWlhbVZqZENCSmJuUTRRWEp5WVhsZEp5eGNiaUFnSUNCcGJuUXhObFJoWnlBOUlDZGJiMkpxWldOMElFbHVkREUyUVhKeVlYbGRKeXhjYmlBZ0lDQnBiblF6TWxSaFp5QTlJQ2RiYjJKcVpXTjBJRWx1ZERNeVFYSnlZWGxkSnl4Y2JpQWdJQ0IxYVc1ME9GUmhaeUE5SUNkYmIySnFaV04wSUZWcGJuUTRRWEp5WVhsZEp5eGNiaUFnSUNCMWFXNTBPRU5zWVcxd1pXUlVZV2NnUFNBblcyOWlhbVZqZENCVmFXNTBPRU5zWVcxd1pXUkJjbkpoZVYwbkxGeHVJQ0FnSUhWcGJuUXhObFJoWnlBOUlDZGJiMkpxWldOMElGVnBiblF4TmtGeWNtRjVYU2NzWEc0Z0lDQWdkV2x1ZERNeVZHRm5JRDBnSjF0dlltcGxZM1FnVldsdWRETXlRWEp5WVhsZEp6dGNibHh1THlvcUlGVnpaV1FnZEc4Z2JXRjBZMmdnWUZKbFowVjRjR0FnWm14aFozTWdabkp2YlNCMGFHVnBjaUJqYjJWeVkyVmtJSE4wY21sdVp5QjJZV3gxWlhNdUlDb3ZYRzUyWVhJZ2NtVkdiR0ZuY3lBOUlDOWNYSGNxSkM4N1hHNWNiaThxS2lCVmMyVmtJSFJ2SUd4dmIydDFjQ0JoSUhSNWNHVWdZWEp5WVhrZ1kyOXVjM1J5ZFdOMGIzSnpJR0o1SUdCMGIxTjBjbWx1WjFSaFoyQXVJQ292WEc1MllYSWdZM1J2Y2tKNVZHRm5JRDBnZTMwN1hHNWpkRzl5UW5sVVlXZGJabXh2WVhRek1sUmhaMTBnUFNCbmJHOWlZV3d1Um14dllYUXpNa0Z5Y21GNU8xeHVZM1J2Y2tKNVZHRm5XMlpzYjJGME5qUlVZV2RkSUQwZ1oyeHZZbUZzTGtac2IyRjBOalJCY25KaGVUdGNibU4wYjNKQ2VWUmhaMXRwYm5RNFZHRm5YU0E5SUdkc2IySmhiQzVKYm5RNFFYSnlZWGs3WEc1amRHOXlRbmxVWVdkYmFXNTBNVFpVWVdkZElEMGdaMnh2WW1Gc0xrbHVkREUyUVhKeVlYazdYRzVqZEc5eVFubFVZV2RiYVc1ME16SlVZV2RkSUQwZ1oyeHZZbUZzTGtsdWRETXlRWEp5WVhrN1hHNWpkRzl5UW5sVVlXZGJkV2x1ZERoVVlXZGRJRDBnWjJ4dlltRnNMbFZwYm5RNFFYSnlZWGs3WEc1amRHOXlRbmxVWVdkYmRXbHVkRGhEYkdGdGNHVmtWR0ZuWFNBOUlHZHNiMkpoYkM1VmFXNTBPRU5zWVcxd1pXUkJjbkpoZVR0Y2JtTjBiM0pDZVZSaFoxdDFhVzUwTVRaVVlXZGRJRDBnWjJ4dlltRnNMbFZwYm5ReE5rRnljbUY1TzF4dVkzUnZja0o1VkdGblczVnBiblF6TWxSaFoxMGdQU0JuYkc5aVlXd3VWV2x1ZERNeVFYSnlZWGs3WEc1Y2JpOHFLbHh1SUNvZ1NXNXBkR2xoYkdsNlpYTWdZVzRnYjJKcVpXTjBJR05zYjI1bElHSmhjMlZrSUc5dUlHbDBjeUJnZEc5VGRISnBibWRVWVdkZ0xseHVJQ3BjYmlBcUlDb3FUbTkwWlRvcUtpQlVhR2x6SUdaMWJtTjBhVzl1SUc5dWJIa2djM1Z3Y0c5eWRITWdZMnh2Ym1sdVp5QjJZV3gxWlhNZ2QybDBhQ0IwWVdkeklHOW1YRzRnS2lCZ1FtOXZiR1ZoYm1Bc0lHQkVZWFJsWUN3Z1lFVnljbTl5WUN3Z1lFNTFiV0psY21Bc0lHQlNaV2RGZUhCZ0xDQnZjaUJnVTNSeWFXNW5ZQzVjYmlBcVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZZbXBsWTNRZ1ZHaGxJRzlpYW1WamRDQjBieUJqYkc5dVpTNWNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0IwWVdjZ1ZHaGxJR0IwYjFOMGNtbHVaMVJoWjJBZ2IyWWdkR2hsSUc5aWFtVmpkQ0IwYnlCamJHOXVaUzVjYmlBcUlFQndZWEpoYlNCN1ltOXZiR1ZoYm4wZ1cybHpSR1ZsY0YwZ1UzQmxZMmxtZVNCaElHUmxaWEFnWTJ4dmJtVXVYRzRnS2lCQWNtVjBkWEp1Y3lCN1QySnFaV04wZlNCU1pYUjFjbTV6SUhSb1pTQnBibWwwYVdGc2FYcGxaQ0JqYkc5dVpTNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z2FXNXBkRU5zYjI1bFFubFVZV2NvYjJKcVpXTjBMQ0IwWVdjc0lHbHpSR1ZsY0NrZ2UxeHVJQ0IyWVhJZ1EzUnZjaUE5SUc5aWFtVmpkQzVqYjI1emRISjFZM1J2Y2p0Y2JpQWdjM2RwZEdOb0lDaDBZV2NwSUh0Y2JpQWdJQ0JqWVhObElHRnljbUY1UW5WbVptVnlWR0ZuT2x4dUlDQWdJQ0FnY21WMGRYSnVJR0oxWm1abGNrTnNiMjVsS0c5aWFtVmpkQ2s3WEc1Y2JpQWdJQ0JqWVhObElHSnZiMnhVWVdjNlhHNGdJQ0FnWTJGelpTQmtZWFJsVkdGbk9seHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QkRkRzl5S0N0dlltcGxZM1FwTzF4dVhHNGdJQ0FnWTJGelpTQm1iRzloZERNeVZHRm5PaUJqWVhObElHWnNiMkYwTmpSVVlXYzZYRzRnSUNBZ1kyRnpaU0JwYm5RNFZHRm5PaUJqWVhObElHbHVkREUyVkdGbk9pQmpZWE5sSUdsdWRETXlWR0ZuT2x4dUlDQWdJR05oYzJVZ2RXbHVkRGhVWVdjNklHTmhjMlVnZFdsdWREaERiR0Z0Y0dWa1ZHRm5PaUJqWVhObElIVnBiblF4TmxSaFp6b2dZMkZ6WlNCMWFXNTBNekpVWVdjNlhHNGdJQ0FnSUNBdkx5QlRZV1poY21rZ05TQnRiMkpwYkdVZ2FXNWpiM0p5WldOMGJIa2dhR0Z6SUdCUFltcGxZM1JnSUdGeklIUm9aU0JqYjI1emRISjFZM1J2Y2lCdlppQjBlWEJsWkNCaGNuSmhlWE11WEc0Z0lDQWdJQ0JwWmlBb1EzUnZjaUJwYm5OMFlXNWpaVzltSUVOMGIzSXBJSHRjYmlBZ0lDQWdJQ0FnUTNSdmNpQTlJR04wYjNKQ2VWUmhaMXQwWVdkZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2RtRnlJR0oxWm1abGNpQTlJRzlpYW1WamRDNWlkV1ptWlhJN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lFTjBiM0lvYVhORVpXVndJRDhnWW5WbVptVnlRMnh2Ym1Vb1luVm1abVZ5S1NBNklHSjFabVpsY2l3Z2IySnFaV04wTG1KNWRHVlBabVp6WlhRc0lHOWlhbVZqZEM1c1pXNW5kR2dwTzF4dVhHNGdJQ0FnWTJGelpTQnVkVzFpWlhKVVlXYzZYRzRnSUNBZ1kyRnpaU0J6ZEhKcGJtZFVZV2M2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibVYzSUVOMGIzSW9iMkpxWldOMEtUdGNibHh1SUNBZ0lHTmhjMlVnY21WblpYaHdWR0ZuT2x4dUlDQWdJQ0FnZG1GeUlISmxjM1ZzZENBOUlHNWxkeUJEZEc5eUtHOWlhbVZqZEM1emIzVnlZMlVzSUhKbFJteGhaM011WlhobFl5aHZZbXBsWTNRcEtUdGNiaUFnSUNBZ0lISmxjM1ZzZEM1c1lYTjBTVzVrWlhnZ1BTQnZZbXBsWTNRdWJHRnpkRWx1WkdWNE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdhVzVwZEVOc2IyNWxRbmxVWVdjN1hHNGlMQ0l2S2lwY2JpQXFJRWx1YVhScFlXeHBlbVZ6SUdGdUlHOWlhbVZqZENCamJHOXVaUzVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5aWFtVmpkQ0JVYUdVZ2IySnFaV04wSUhSdklHTnNiMjVsTGx4dUlDb2dRSEpsZEhWeWJuTWdlMDlpYW1WamRIMGdVbVYwZFhKdWN5QjBhR1VnYVc1cGRHbGhiR2w2WldRZ1kyeHZibVV1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR2x1YVhSRGJHOXVaVTlpYW1WamRDaHZZbXBsWTNRcElIdGNiaUFnZG1GeUlFTjBiM0lnUFNCdlltcGxZM1F1WTI5dWMzUnlkV04wYjNJN1hHNGdJR2xtSUNnaEtIUjVjR1Z2WmlCRGRHOXlJRDA5SUNkbWRXNWpkR2x2YmljZ0ppWWdRM1J2Y2lCcGJuTjBZVzVqWlc5bUlFTjBiM0lwS1NCN1hHNGdJQ0FnUTNSdmNpQTlJRTlpYW1WamREdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2JtVjNJRU4wYjNJN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnYVc1cGRFTnNiMjVsVDJKcVpXTjBPMXh1SWl3aUx5b3FYRzRnS2lCRGFHVmphM01nYVdZZ1lIWmhiSFZsWUNCcGN5QmhJR2h2YzNRZ2IySnFaV04wSUdsdUlFbEZJRHdnT1M1Y2JpQXFYRzRnS2lCQWNISnBkbUYwWlZ4dUlDb2dRSEJoY21GdElIc3FmU0IyWVd4MVpTQlVhR1VnZG1Gc2RXVWdkRzhnWTJobFkyc3VYRzRnS2lCQWNtVjBkWEp1Y3lCN1ltOXZiR1ZoYm4wZ1VtVjBkWEp1Y3lCZ2RISjFaV0FnYVdZZ1lIWmhiSFZsWUNCcGN5QmhJR2h2YzNRZ2IySnFaV04wTENCbGJITmxJR0JtWVd4elpXQXVYRzRnS2k5Y2JuWmhjaUJwYzBodmMzUlBZbXBsWTNRZ1BTQW9ablZ1WTNScGIyNG9LU0I3WEc0Z0lIUnllU0I3WEc0Z0lDQWdUMkpxWldOMEtIc2dKM1J2VTNSeWFXNW5Kem9nTUNCOUlDc2dKeWNwTzF4dUlDQjlJR05oZEdOb0tHVXBJSHRjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b0tTQjdJSEpsZEhWeWJpQm1ZV3h6WlRzZ2ZUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z1puVnVZM1JwYjI0b2RtRnNkV1VwSUh0Y2JpQWdJQ0F2THlCSlJTQThJRGtnY0hKbGMyVnVkSE1nYldGdWVTQm9iM04wSUc5aWFtVmpkSE1nWVhNZ1lFOWlhbVZqZEdBZ2IySnFaV04wY3lCMGFHRjBJR05oYmlCamIyVnlZMlZjYmlBZ0lDQXZMeUIwYnlCemRISnBibWR6SUdSbGMzQnBkR1VnYUdGMmFXNW5JR2x0Y0hKdmNHVnliSGtnWkdWbWFXNWxaQ0JnZEc5VGRISnBibWRnSUcxbGRHaHZaSE11WEc0Z0lDQWdjbVYwZFhKdUlIUjVjR1Z2WmlCMllXeDFaUzUwYjFOMGNtbHVaeUFoUFNBblpuVnVZM1JwYjI0bklDWW1JSFI1Y0dWdlppQW9kbUZzZFdVZ0t5QW5KeWtnUFQwZ0ozTjBjbWx1WnljN1hHNGdJSDA3WEc1OUtDa3BPMXh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUdselNHOXpkRTlpYW1WamREdGNiaUlzSWk4cUtseHVJQ29nVlhObFpDQmhjeUIwYUdVZ1cyMWhlR2x0ZFcwZ2JHVnVaM1JvWFNob2RIUndjem92TDNCbGIzQnNaUzV0YjNwcGJHeGhMbTl5Wnk5K2FtOXlaVzVrYjNKbVppOWxjell0WkhKaFpuUXVhSFJ0YkNOelpXTXRiblZ0WW1WeUxtMWhlRjl6WVdabFgybHVkR1ZuWlhJcFhHNGdLaUJ2WmlCaGJpQmhjbkpoZVMxc2FXdGxJSFpoYkhWbExseHVJQ292WEc1MllYSWdUVUZZWDFOQlJrVmZTVTVVUlVkRlVpQTlJRTFoZEdndWNHOTNLRElzSURVektTQXRJREU3WEc1Y2JpOHFLbHh1SUNvZ1EyaGxZMnR6SUdsbUlHQjJZV3gxWldBZ2FYTWdZU0IyWVd4cFpDQmhjbkpoZVMxc2FXdGxJR2x1WkdWNExseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdleXA5SUhaaGJIVmxJRlJvWlNCMllXeDFaU0IwYnlCamFHVmpheTVjYmlBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCYmJHVnVaM1JvUFUxQldGOVRRVVpGWDBsT1ZFVkhSVkpkSUZSb1pTQjFjSEJsY2lCaWIzVnVaSE1nYjJZZ1lTQjJZV3hwWkNCcGJtUmxlQzVjYmlBcUlFQnlaWFIxY201eklIdGliMjlzWldGdWZTQlNaWFIxY201eklHQjBjblZsWUNCcFppQmdkbUZzZFdWZ0lHbHpJR0VnZG1Gc2FXUWdhVzVrWlhnc0lHVnNjMlVnWUdaaGJITmxZQzVjYmlBcUwxeHVablZ1WTNScGIyNGdhWE5KYm1SbGVDaDJZV3gxWlN3Z2JHVnVaM1JvS1NCN1hHNGdJSFpoYkhWbElEMGdLM1poYkhWbE8xeHVJQ0JzWlc1bmRHZ2dQU0JzWlc1bmRHZ2dQVDBnYm5Wc2JDQS9JRTFCV0Y5VFFVWkZYMGxPVkVWSFJWSWdPaUJzWlc1bmRHZzdYRzRnSUhKbGRIVnliaUIyWVd4MVpTQStJQzB4SUNZbUlIWmhiSFZsSUNVZ01TQTlQU0F3SUNZbUlIWmhiSFZsSUR3Z2JHVnVaM1JvTzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR2x6U1c1a1pYZzdYRzRpTENKMllYSWdUR0Y2ZVZkeVlYQndaWElnUFNCeVpYRjFhWEpsS0NjdUwweGhlbmxYY21Gd2NHVnlKeWtzWEc0Z0lDQWdaMlYwUm5WdVkwNWhiV1VnUFNCeVpYRjFhWEpsS0NjdUwyZGxkRVoxYm1OT1lXMWxKeWtzWEc0Z0lDQWdiRzlrWVhOb0lEMGdjbVZ4ZFdseVpTZ25MaTR2WTJoaGFXNHZiRzlrWVhOb0p5azdYRzVjYmk4cUtseHVJQ29nUTJobFkydHpJR2xtSUdCbWRXNWpZQ0JvWVhNZ1lTQnNZWHA1SUdOdmRXNTBaWEp3WVhKMExseHVJQ3BjYmlBcUlFQndjbWwyWVhSbFhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JtZFc1aklGUm9aU0JtZFc1amRHbHZiaUIwYnlCamFHVmpheTVjYmlBcUlFQnlaWFIxY201eklIdGliMjlzWldGdWZTQlNaWFIxY201eklHQjBjblZsWUNCcFppQmdablZ1WTJBZ2FHRnpJR0VnYkdGNmVTQmpiM1Z1ZEdWeWNHRnlkQ3dnWld4elpTQmdabUZzYzJWZ0xseHVJQ292WEc1bWRXNWpkR2x2YmlCcGMweGhlbWxoWW14bEtHWjFibU1wSUh0Y2JpQWdkbUZ5SUdaMWJtTk9ZVzFsSUQwZ1oyVjBSblZ1WTA1aGJXVW9ablZ1WXlrN1hHNGdJSEpsZEhWeWJpQWhJV1oxYm1OT1lXMWxJQ1ltSUdaMWJtTWdQVDA5SUd4dlpHRnphRnRtZFc1alRtRnRaVjBnSmlZZ1puVnVZMDVoYldVZ2FXNGdUR0Y2ZVZkeVlYQndaWEl1Y0hKdmRHOTBlWEJsTzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR2x6VEdGNmFXRmliR1U3WEc0aUxDSXZLaXBjYmlBcUlGVnpaV1FnWVhNZ2RHaGxJRnR0WVhocGJYVnRJR3hsYm1kMGFGMG9hSFIwY0hNNkx5OXdaVzl3YkdVdWJXOTZhV3hzWVM1dmNtY3ZmbXB2Y21WdVpHOXlabVl2WlhNMkxXUnlZV1owTG1oMGJXd2pjMlZqTFc1MWJXSmxjaTV0WVhoZmMyRm1aVjlwYm5SbFoyVnlLVnh1SUNvZ2IyWWdZVzRnWVhKeVlYa3RiR2xyWlNCMllXeDFaUzVjYmlBcUwxeHVkbUZ5SUUxQldGOVRRVVpGWDBsT1ZFVkhSVklnUFNCTllYUm9MbkJ2ZHlneUxDQTFNeWtnTFNBeE8xeHVYRzR2S2lwY2JpQXFJRU5vWldOcmN5QnBaaUJnZG1Gc2RXVmdJR2x6SUdFZ2RtRnNhV1FnWVhKeVlYa3RiR2xyWlNCc1pXNW5kR2d1WEc0Z0tseHVJQ29nS2lwT2IzUmxPaW9xSUZSb2FYTWdablZ1WTNScGIyNGdhWE1nWW1GelpXUWdiMjRnVzJCVWIweGxibWQwYUdCZEtHaDBkSEJ6T2k4dmNHVnZjR3hsTG0xdmVtbHNiR0V1YjNKbkwzNXFiM0psYm1SdmNtWm1MMlZ6Tmkxa2NtRm1kQzVvZEcxc0kzTmxZeTEwYjJ4bGJtZDBhQ2t1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN0tuMGdkbUZzZFdVZ1ZHaGxJSFpoYkhWbElIUnZJR05vWldOckxseHVJQ29nUUhKbGRIVnlibk1nZTJKdmIyeGxZVzU5SUZKbGRIVnlibk1nWUhSeWRXVmdJR2xtSUdCMllXeDFaV0FnYVhNZ1lTQjJZV3hwWkNCc1pXNW5kR2dzSUdWc2MyVWdZR1poYkhObFlDNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z2FYTk1aVzVuZEdnb2RtRnNkV1VwSUh0Y2JpQWdjbVYwZFhKdUlIUjVjR1Z2WmlCMllXeDFaU0E5UFNBbmJuVnRZbVZ5SnlBbUppQjJZV3gxWlNBK0lDMHhJQ1ltSUhaaGJIVmxJQ1VnTVNBOVBTQXdJQ1ltSUhaaGJIVmxJRHc5SUUxQldGOVRRVVpGWDBsT1ZFVkhSVkk3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdhWE5NWlc1bmRHZzdYRzRpTENJdktpcGNiaUFxSUVOb1pXTnJjeUJwWmlCZ2RtRnNkV1ZnSUdseklHOWlhbVZqZEMxc2FXdGxMbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZXlwOUlIWmhiSFZsSUZSb1pTQjJZV3gxWlNCMGJ5QmphR1ZqYXk1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRpYjI5c1pXRnVmU0JTWlhSMWNtNXpJR0IwY25WbFlDQnBaaUJnZG1Gc2RXVmdJR2x6SUc5aWFtVmpkQzFzYVd0bExDQmxiSE5sSUdCbVlXeHpaV0F1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR2x6VDJKcVpXTjBUR2xyWlNoMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z0lTRjJZV3gxWlNBbUppQjBlWEJsYjJZZ2RtRnNkV1VnUFQwZ0oyOWlhbVZqZENjN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnYVhOUFltcGxZM1JNYVd0bE8xeHVJaXdpZG1GeUlHbHpUMkpxWldOMElEMGdjbVZ4ZFdseVpTZ25MaTR2YkdGdVp5OXBjMDlpYW1WamRDY3BPMXh1WEc0dktpcGNiaUFxSUVOb1pXTnJjeUJwWmlCZ2RtRnNkV1ZnSUdseklITjFhWFJoWW14bElHWnZjaUJ6ZEhKcFkzUWdaWEYxWVd4cGRIa2dZMjl0Y0dGeWFYTnZibk1zSUdrdVpTNGdZRDA5UFdBdVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdLbjBnZG1Gc2RXVWdWR2hsSUhaaGJIVmxJSFJ2SUdOb1pXTnJMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UySnZiMnhsWVc1OUlGSmxkSFZ5Ym5NZ1lIUnlkV1ZnSUdsbUlHQjJZV3gxWldBZ2FXWWdjM1ZwZEdGaWJHVWdabTl5SUhOMGNtbGpkRnh1SUNvZ0lHVnhkV0ZzYVhSNUlHTnZiWEJoY21semIyNXpMQ0JsYkhObElHQm1ZV3h6WldBdVhHNGdLaTljYm1aMWJtTjBhVzl1SUdselUzUnlhV04wUTI5dGNHRnlZV0pzWlNoMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RtRnNkV1VnUFQwOUlIWmhiSFZsSUNZbUlDaDJZV3gxWlNBOVBUMGdNQ0EvSUNnb01TQXZJSFpoYkhWbEtTQStJREFwSURvZ0lXbHpUMkpxWldOMEtIWmhiSFZsS1NrN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnYVhOVGRISnBZM1JEYjIxd1lYSmhZbXhsTzF4dUlpd2lkbUZ5SUdGeWNtRjVRMjl3ZVNBOUlISmxjWFZwY21Vb0p5NHZZWEp5WVhsRGIzQjVKeWtzWEc0Z0lDQWdZMjl0Y0c5elpVRnlaM01nUFNCeVpYRjFhWEpsS0NjdUwyTnZiWEJ2YzJWQmNtZHpKeWtzWEc0Z0lDQWdZMjl0Y0c5elpVRnlaM05TYVdkb2RDQTlJSEpsY1hWcGNtVW9KeTR2WTI5dGNHOXpaVUZ5WjNOU2FXZG9kQ2NwTEZ4dUlDQWdJSEpsY0d4aFkyVkliMnhrWlhKeklEMGdjbVZ4ZFdseVpTZ25MaTl5WlhCc1lXTmxTRzlzWkdWeWN5Y3BPMXh1WEc0dktpb2dWWE5sWkNCMGJ5QmpiMjF3YjNObElHSnBkRzFoYzJ0eklHWnZjaUIzY21Gd2NHVnlJRzFsZEdGa1lYUmhMaUFxTDF4dWRtRnlJRUpKVGtSZlJreEJSeUE5SURFc1hHNGdJQ0FnUTFWU1VsbGZRazlWVGtSZlJreEJSeUE5SURRc1hHNGdJQ0FnUTFWU1VsbGZSa3hCUnlBOUlEZ3NYRzRnSUNBZ1FWSlpYMFpNUVVjZ1BTQXhNamdzWEc0Z0lDQWdVa1ZCVWtkZlJreEJSeUE5SURJMU5qdGNibHh1THlvcUlGVnpaV1FnWVhNZ2RHaGxJR2x1ZEdWeWJtRnNJR0Z5WjNWdFpXNTBJSEJzWVdObGFHOXNaR1Z5TGlBcUwxeHVkbUZ5SUZCTVFVTkZTRTlNUkVWU0lEMGdKMTlmYkc5a1lYTm9YM0JzWVdObGFHOXNaR1Z5WDE4bk8xeHVYRzR2S2lCT1lYUnBkbVVnYldWMGFHOWtJSEpsWm1WeVpXNWpaWE1nWm05eUlIUm9iM05sSUhkcGRHZ2dkR2hsSUhOaGJXVWdibUZ0WlNCaGN5QnZkR2hsY2lCZ2JHOWtZWE5vWUNCdFpYUm9iMlJ6TGlBcUwxeHVkbUZ5SUc1aGRHbDJaVTFwYmlBOUlFMWhkR2d1YldsdU8xeHVYRzR2S2lwY2JpQXFJRTFsY21kbGN5QjBhR1VnWm5WdVkzUnBiMjRnYldWMFlXUmhkR0VnYjJZZ1lITnZkWEpqWldBZ2FXNTBieUJnWkdGMFlXQXVYRzRnS2x4dUlDb2dUV1Z5WjJsdVp5QnRaWFJoWkdGMFlTQnlaV1IxWTJWeklIUm9aU0J1ZFcxaVpYSWdiMllnZDNKaGNIQmxjbk1nY21WeGRXbHlaV1FnZEc4Z2FXNTJiMnRsSUdFZ1puVnVZM1JwYjI0dVhHNGdLaUJVYUdseklHbHpJSEJ2YzNOcFlteGxJR0psWTJGMWMyVWdiV1YwYUc5a2N5QnNhV3RsSUdCZkxtSnBibVJnTENCZ1h5NWpkWEp5ZVdBc0lHRnVaQ0JnWHk1d1lYSjBhV0ZzWUZ4dUlDb2diV0Y1SUdKbElHRndjR3hwWldRZ2NtVm5ZWEprYkdWemN5QnZaaUJsZUdWamRYUnBiMjRnYjNKa1pYSXVJRTFsZEdodlpITWdiR2xyWlNCZ1h5NWhjbmxnSUdGdVpDQmdYeTV5WldGeVoyQmNiaUFxSUdGMVoyMWxiblFnWm5WdVkzUnBiMjRnWVhKbmRXMWxiblJ6TENCdFlXdHBibWNnZEdobElHOXlaR1Z5SUdsdUlIZG9hV05vSUhSb1pYa2dZWEpsSUdWNFpXTjFkR1ZrSUdsdGNHOXlkR0Z1ZEN4Y2JpQXFJSEJ5WlhabGJuUnBibWNnZEdobElHMWxjbWRwYm1jZ2IyWWdiV1YwWVdSaGRHRXVJRWh2ZDJWMlpYSXNJSGRsSUcxaGEyVWdZVzRnWlhoalpYQjBhVzl1SUdadmNpQmhJSE5oWm1WY2JpQXFJR052YlcxdmJpQmpZWE5sSUhkb1pYSmxJR04xY25KcFpXUWdablZ1WTNScGIyNXpJR2hoZG1VZ1lGOHVZWEo1WUNCaGJtUWdiM0lnWUY4dWNtVmhjbWRnSUdGd2NHeHBaV1F1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUdSaGRHRWdWR2hsSUdSbGMzUnBibUYwYVc5dUlHMWxkR0ZrWVhSaExseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdjMjkxY21ObElGUm9aU0J6YjNWeVkyVWdiV1YwWVdSaGRHRXVYRzRnS2lCQWNtVjBkWEp1Y3lCN1FYSnlZWGw5SUZKbGRIVnlibk1nWUdSaGRHRmdMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQnRaWEpuWlVSaGRHRW9aR0YwWVN3Z2MyOTFjbU5sS1NCN1hHNGdJSFpoY2lCaWFYUnRZWE5ySUQwZ1pHRjBZVnN4WFN4Y2JpQWdJQ0FnSUhOeVkwSnBkRzFoYzJzZ1BTQnpiM1Z5WTJWYk1WMHNYRzRnSUNBZ0lDQnVaWGRDYVhSdFlYTnJJRDBnWW1sMGJXRnpheUI4SUhOeVkwSnBkRzFoYzJzc1hHNGdJQ0FnSUNCcGMwTnZiVzF2YmlBOUlHNWxkMEpwZEcxaGMyc2dQQ0JCVWxsZlJreEJSenRjYmx4dUlDQjJZWElnYVhORGIyMWlieUE5WEc0Z0lDQWdLSE55WTBKcGRHMWhjMnNnUFQwZ1FWSlpYMFpNUVVjZ0ppWWdZbWwwYldGemF5QTlQU0JEVlZKU1dWOUdURUZIS1NCOGZGeHVJQ0FnSUNoemNtTkNhWFJ0WVhOcklEMDlJRUZTV1Y5R1RFRkhJQ1ltSUdKcGRHMWhjMnNnUFQwZ1VrVkJVa2RmUmt4QlJ5QW1KaUJrWVhSaFd6ZGRMbXhsYm1kMGFDQThQU0J6YjNWeVkyVmJPRjBwSUh4OFhHNGdJQ0FnS0hOeVkwSnBkRzFoYzJzZ1BUMGdLRUZTV1Y5R1RFRkhJSHdnVWtWQlVrZGZSa3hCUnlrZ0ppWWdZbWwwYldGemF5QTlQU0JEVlZKU1dWOUdURUZIS1R0Y2JseHVJQ0F2THlCRmVHbDBJR1ZoY214NUlHbG1JRzFsZEdGa1lYUmhJR05oYmlkMElHSmxJRzFsY21kbFpDNWNiaUFnYVdZZ0tDRW9hWE5EYjIxdGIyNGdmSHdnYVhORGIyMWlieWtwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdaR0YwWVR0Y2JpQWdmVnh1SUNBdkx5QlZjMlVnYzI5MWNtTmxJR0IwYUdselFYSm5ZQ0JwWmlCaGRtRnBiR0ZpYkdVdVhHNGdJR2xtSUNoemNtTkNhWFJ0WVhOcklDWWdRa2xPUkY5R1RFRkhLU0I3WEc0Z0lDQWdaR0YwWVZzeVhTQTlJSE52ZFhKalpWc3lYVHRjYmlBZ0lDQXZMeUJUWlhRZ2QyaGxiaUJqZFhKeWVXbHVaeUJoSUdKdmRXNWtJR1oxYm1OMGFXOXVMbHh1SUNBZ0lHNWxkMEpwZEcxaGMyc2dmRDBnS0dKcGRHMWhjMnNnSmlCQ1NVNUVYMFpNUVVjcElEOGdNQ0E2SUVOVlVsSlpYMEpQVlU1RVgwWk1RVWM3WEc0Z0lIMWNiaUFnTHk4Z1EyOXRjRzl6WlNCd1lYSjBhV0ZzSUdGeVozVnRaVzUwY3k1Y2JpQWdkbUZ5SUhaaGJIVmxJRDBnYzI5MWNtTmxXek5kTzF4dUlDQnBaaUFvZG1Gc2RXVXBJSHRjYmlBZ0lDQjJZWElnY0dGeWRHbGhiSE1nUFNCa1lYUmhXek5kTzF4dUlDQWdJR1JoZEdGYk0xMGdQU0J3WVhKMGFXRnNjeUEvSUdOdmJYQnZjMlZCY21kektIQmhjblJwWVd4ekxDQjJZV3gxWlN3Z2MyOTFjbU5sV3pSZEtTQTZJR0Z5Y21GNVEyOXdlU2gyWVd4MVpTazdYRzRnSUNBZ1pHRjBZVnMwWFNBOUlIQmhjblJwWVd4eklEOGdjbVZ3YkdGalpVaHZiR1JsY25Nb1pHRjBZVnN6WFN3Z1VFeEJRMFZJVDB4RVJWSXBJRG9nWVhKeVlYbERiM0I1S0hOdmRYSmpaVnMwWFNrN1hHNGdJSDFjYmlBZ0x5OGdRMjl0Y0c5elpTQndZWEowYVdGc0lISnBaMmgwSUdGeVozVnRaVzUwY3k1Y2JpQWdkbUZzZFdVZ1BTQnpiM1Z5WTJWYk5WMDdYRzRnSUdsbUlDaDJZV3gxWlNrZ2UxeHVJQ0FnSUhCaGNuUnBZV3h6SUQwZ1pHRjBZVnMxWFR0Y2JpQWdJQ0JrWVhSaFd6VmRJRDBnY0dGeWRHbGhiSE1nUHlCamIyMXdiM05sUVhKbmMxSnBaMmgwS0hCaGNuUnBZV3h6TENCMllXeDFaU3dnYzI5MWNtTmxXelpkS1NBNklHRnljbUY1UTI5d2VTaDJZV3gxWlNrN1hHNGdJQ0FnWkdGMFlWczJYU0E5SUhCaGNuUnBZV3h6SUQ4Z2NtVndiR0ZqWlVodmJHUmxjbk1vWkdGMFlWczFYU3dnVUV4QlEwVklUMHhFUlZJcElEb2dZWEp5WVhsRGIzQjVLSE52ZFhKalpWczJYU2s3WEc0Z0lIMWNiaUFnTHk4Z1ZYTmxJSE52ZFhKalpTQmdZWEpuVUc5ellDQnBaaUJoZG1GcGJHRmliR1V1WEc0Z0lIWmhiSFZsSUQwZ2MyOTFjbU5sV3pkZE8xeHVJQ0JwWmlBb2RtRnNkV1VwSUh0Y2JpQWdJQ0JrWVhSaFd6ZGRJRDBnWVhKeVlYbERiM0I1S0haaGJIVmxLVHRjYmlBZ2ZWeHVJQ0F2THlCVmMyVWdjMjkxY21ObElHQmhjbmxnSUdsbUlHbDBKM01nYzIxaGJHeGxjaTVjYmlBZ2FXWWdLSE55WTBKcGRHMWhjMnNnSmlCQlVsbGZSa3hCUnlrZ2UxeHVJQ0FnSUdSaGRHRmJPRjBnUFNCa1lYUmhXemhkSUQwOUlHNTFiR3dnUHlCemIzVnlZMlZiT0YwZ09pQnVZWFJwZG1WTmFXNG9aR0YwWVZzNFhTd2djMjkxY21ObFd6aGRLVHRjYmlBZ2ZWeHVJQ0F2THlCVmMyVWdjMjkxY21ObElHQmhjbWwwZVdBZ2FXWWdiMjVsSUdseklHNXZkQ0J3Y205MmFXUmxaQzVjYmlBZ2FXWWdLR1JoZEdGYk9WMGdQVDBnYm5Wc2JDa2dlMXh1SUNBZ0lHUmhkR0ZiT1YwZ1BTQnpiM1Z5WTJWYk9WMDdYRzRnSUgxY2JpQWdMeThnVlhObElITnZkWEpqWlNCZ1puVnVZMkFnWVc1a0lHMWxjbWRsSUdKcGRHMWhjMnR6TGx4dUlDQmtZWFJoV3pCZElEMGdjMjkxY21ObFd6QmRPMXh1SUNCa1lYUmhXekZkSUQwZ2JtVjNRbWwwYldGemF6dGNibHh1SUNCeVpYUjFjbTRnWkdGMFlUdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCdFpYSm5aVVJoZEdFN1hHNGlMQ0oyWVhJZ2FYTk9ZWFJwZG1VZ1BTQnlaWEYxYVhKbEtDY3VMaTlzWVc1bkwybHpUbUYwYVhabEp5azdYRzVjYmk4cUtpQk9ZWFJwZG1VZ2JXVjBhRzlrSUhKbFptVnlaVzVqWlhNdUlDb3ZYRzUyWVhJZ1YyVmhhMDFoY0NBOUlHbHpUbUYwYVhabEtGZGxZV3ROWVhBZ1BTQm5iRzlpWVd3dVYyVmhhMDFoY0NrZ0ppWWdWMlZoYTAxaGNEdGNibHh1THlvcUlGVnpaV1FnZEc4Z2MzUnZjbVVnWm5WdVkzUnBiMjRnYldWMFlXUmhkR0V1SUNvdlhHNTJZWElnYldWMFlVMWhjQ0E5SUZkbFlXdE5ZWEFnSmlZZ2JtVjNJRmRsWVd0TllYQTdYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnYldWMFlVMWhjRHRjYmlJc0lpOHFLaUJWYzJWa0lIUnZJR3h2YjJ0MWNDQjFibTFwYm1sbWFXVmtJR1oxYm1OMGFXOXVJRzVoYldWekxpQXFMMXh1ZG1GeUlISmxZV3hPWVcxbGN5QTlJSHQ5TzF4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlISmxZV3hPWVcxbGN6dGNiaUlzSW5aaGNpQmhjbkpoZVVOdmNIa2dQU0J5WlhGMWFYSmxLQ2N1TDJGeWNtRjVRMjl3ZVNjcExGeHVJQ0FnSUdselNXNWtaWGdnUFNCeVpYRjFhWEpsS0NjdUwybHpTVzVrWlhnbktUdGNibHh1THlvZ1RtRjBhWFpsSUcxbGRHaHZaQ0J5WldabGNtVnVZMlZ6SUdadmNpQjBhRzl6WlNCM2FYUm9JSFJvWlNCellXMWxJRzVoYldVZ1lYTWdiM1JvWlhJZ1lHeHZaR0Z6YUdBZ2JXVjBhRzlrY3k0Z0tpOWNiblpoY2lCdVlYUnBkbVZOYVc0Z1BTQk5ZWFJvTG0xcGJqdGNibHh1THlvcVhHNGdLaUJTWlc5eVpHVnlJR0JoY25KaGVXQWdZV05qYjNKa2FXNW5JSFJ2SUhSb1pTQnpjR1ZqYVdacFpXUWdhVzVrWlhobGN5QjNhR1Z5WlNCMGFHVWdaV3hsYldWdWRDQmhkRnh1SUNvZ2RHaGxJR1pwY25OMElHbHVaR1Y0SUdseklHRnpjMmxuYm1Wa0lHRnpJSFJvWlNCbWFYSnpkQ0JsYkdWdFpXNTBMQ0IwYUdVZ1pXeGxiV1Z1ZENCaGRGeHVJQ29nZEdobElITmxZMjl1WkNCcGJtUmxlQ0JwY3lCaGMzTnBaMjVsWkNCaGN5QjBhR1VnYzJWamIyNWtJR1ZzWlcxbGJuUXNJR0Z1WkNCemJ5QnZiaTVjYmlBcVhHNGdLaUJBY0hKcGRtRjBaVnh1SUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnWVhKeVlYa2dWR2hsSUdGeWNtRjVJSFJ2SUhKbGIzSmtaWEl1WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCcGJtUmxlR1Z6SUZSb1pTQmhjbkpoYm1kbFpDQmhjbkpoZVNCcGJtUmxlR1Z6TGx4dUlDb2dRSEpsZEhWeWJuTWdlMEZ5Y21GNWZTQlNaWFIxY201eklHQmhjbkpoZVdBdVhHNGdLaTljYm1aMWJtTjBhVzl1SUhKbGIzSmtaWElvWVhKeVlYa3NJR2x1WkdWNFpYTXBJSHRjYmlBZ2RtRnlJR0Z5Y2t4bGJtZDBhQ0E5SUdGeWNtRjVMbXhsYm1kMGFDeGNiaUFnSUNBZ0lHeGxibWQwYUNBOUlHNWhkR2wyWlUxcGJpaHBibVJsZUdWekxteGxibWQwYUN3Z1lYSnlUR1Z1WjNSb0tTeGNiaUFnSUNBZ0lHOXNaRUZ5Y21GNUlEMGdZWEp5WVhsRGIzQjVLR0Z5Y21GNUtUdGNibHh1SUNCM2FHbHNaU0FvYkdWdVozUm9MUzBwSUh0Y2JpQWdJQ0IyWVhJZ2FXNWtaWGdnUFNCcGJtUmxlR1Z6VzJ4bGJtZDBhRjA3WEc0Z0lDQWdZWEp5WVhsYmJHVnVaM1JvWFNBOUlHbHpTVzVrWlhnb2FXNWtaWGdzSUdGeWNreGxibWQwYUNrZ1B5QnZiR1JCY25KaGVWdHBibVJsZUYwZ09pQjFibVJsWm1sdVpXUTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHRnljbUY1TzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSEpsYjNKa1pYSTdYRzRpTENJdktpb2dWWE5sWkNCaGN5QjBhR1VnYVc1MFpYSnVZV3dnWVhKbmRXMWxiblFnY0d4aFkyVm9iMnhrWlhJdUlDb3ZYRzUyWVhJZ1VFeEJRMFZJVDB4RVJWSWdQU0FuWDE5c2IyUmhjMmhmY0d4aFkyVm9iMnhrWlhKZlh5YzdYRzVjYmk4cUtseHVJQ29nVW1Wd2JHRmpaWE1nWVd4c0lHQndiR0ZqWldodmJHUmxjbUFnWld4bGJXVnVkSE1nYVc0Z1lHRnljbUY1WUNCM2FYUm9JR0Z1SUdsdWRHVnlibUZzSUhCc1lXTmxhRzlzWkdWeVhHNGdLaUJoYm1RZ2NtVjBkWEp1Y3lCaGJpQmhjbkpoZVNCdlppQjBhR1ZwY2lCcGJtUmxlR1Z6TGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCaGNuSmhlU0JVYUdVZ1lYSnlZWGtnZEc4Z2JXOWthV1o1TGx4dUlDb2dRSEJoY21GdElIc3FmU0J3YkdGalpXaHZiR1JsY2lCVWFHVWdjR3hoWTJWb2IyeGtaWElnZEc4Z2NtVndiR0ZqWlM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRCY25KaGVYMGdVbVYwZFhKdWN5QjBhR1VnYm1WM0lHRnljbUY1SUc5bUlIQnNZV05sYUc5c1pHVnlJR2x1WkdWNFpYTXVYRzRnS2k5Y2JtWjFibU4wYVc5dUlISmxjR3hoWTJWSWIyeGtaWEp6S0dGeWNtRjVMQ0J3YkdGalpXaHZiR1JsY2lrZ2UxeHVJQ0IyWVhJZ2FXNWtaWGdnUFNBdE1TeGNiaUFnSUNBZ0lHeGxibWQwYUNBOUlHRnljbUY1TG14bGJtZDBhQ3hjYmlBZ0lDQWdJSEpsYzBsdVpHVjRJRDBnTFRFc1hHNGdJQ0FnSUNCeVpYTjFiSFFnUFNCYlhUdGNibHh1SUNCM2FHbHNaU0FvS3l0cGJtUmxlQ0E4SUd4bGJtZDBhQ2tnZTF4dUlDQWdJR2xtSUNoaGNuSmhlVnRwYm1SbGVGMGdQVDA5SUhCc1lXTmxhRzlzWkdWeUtTQjdYRzRnSUNBZ0lDQmhjbkpoZVZ0cGJtUmxlRjBnUFNCUVRFRkRSVWhQVEVSRlVqdGNiaUFnSUNBZ0lISmxjM1ZzZEZzckszSmxjMGx1WkdWNFhTQTlJR2x1WkdWNE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnY21WemRXeDBPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlISmxjR3hoWTJWSWIyeGtaWEp6TzF4dUlpd2lkbUZ5SUdKaGMyVlRaWFJFWVhSaElEMGdjbVZ4ZFdseVpTZ25MaTlpWVhObFUyVjBSR0YwWVNjcExGeHVJQ0FnSUc1dmR5QTlJSEpsY1hWcGNtVW9KeTR1TDJSaGRHVXZibTkzSnlrN1hHNWNiaThxS2lCVmMyVmtJSFJ2SUdSbGRHVmpkQ0IzYUdWdUlHRWdablZ1WTNScGIyNGdZbVZqYjIxbGN5Qm9iM1F1SUNvdlhHNTJZWElnU0U5VVgwTlBWVTVVSUQwZ01UVXdMRnh1SUNBZ0lFaFBWRjlUVUVGT0lEMGdNVFk3WEc1Y2JpOHFLbHh1SUNvZ1UyVjBjeUJ0WlhSaFpHRjBZU0JtYjNJZ1lHWjFibU5nTGx4dUlDcGNiaUFxSUNvcVRtOTBaVG9xS2lCSlppQjBhR2x6SUdaMWJtTjBhVzl1SUdKbFkyOXRaWE1nYUc5MExDQnBMbVV1SUdseklHbHVkbTlyWldRZ1lTQnNiM1FnYVc0Z1lTQnphRzl5ZEZ4dUlDb2djR1Z5YVc5a0lHOW1JSFJwYldVc0lHbDBJSGRwYkd3Z2RISnBjQ0JwZEhNZ1luSmxZV3RsY2lCaGJtUWdkSEpoYm5OcGRHbHZiaUIwYnlCaGJpQnBaR1Z1ZEdsMGVTQm1kVzVqZEdsdmJseHVJQ29nZEc4Z1lYWnZhV1FnWjJGeVltRm5aU0JqYjJ4c1pXTjBhVzl1SUhCaGRYTmxjeUJwYmlCV09DNGdVMlZsSUZ0V09DQnBjM04xWlNBeU1EY3dYU2hvZEhSd2N6b3ZMMk52WkdVdVoyOXZaMnhsTG1OdmJTOXdMM1k0TDJsemMzVmxjeTlrWlhSaGFXdy9hV1E5TWpBM01DbGNiaUFxSUdadmNpQnRiM0psSUdSbGRHRnBiSE11WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHWjFibU1nVkdobElHWjFibU4wYVc5dUlIUnZJR0Z6YzI5amFXRjBaU0J0WlhSaFpHRjBZU0IzYVhSb0xseHVJQ29nUUhCaGNtRnRJSHNxZlNCa1lYUmhJRlJvWlNCdFpYUmhaR0YwWVM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRHZFc1amRHbHZibjBnVW1WMGRYSnVjeUJnWm5WdVkyQXVYRzRnS2k5Y2JuWmhjaUJ6WlhSRVlYUmhJRDBnS0daMWJtTjBhVzl1S0NrZ2UxeHVJQ0IyWVhJZ1kyOTFiblFnUFNBd0xGeHVJQ0FnSUNBZ2JHRnpkRU5oYkd4bFpDQTlJREE3WEc1Y2JpQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtHdGxlU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQjJZWElnYzNSaGJYQWdQU0J1YjNjb0tTeGNiaUFnSUNBZ0lDQWdjbVZ0WVdsdWFXNW5JRDBnU0U5VVgxTlFRVTRnTFNBb2MzUmhiWEFnTFNCc1lYTjBRMkZzYkdWa0tUdGNibHh1SUNBZ0lHeGhjM1JEWVd4c1pXUWdQU0J6ZEdGdGNEdGNiaUFnSUNCcFppQW9jbVZ0WVdsdWFXNW5JRDRnTUNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ3NyWTI5MWJuUWdQajBnU0U5VVgwTlBWVTVVS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCclpYazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdOdmRXNTBJRDBnTUR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHSmhjMlZUWlhSRVlYUmhLR3RsZVN3Z2RtRnNkV1VwTzF4dUlDQjlPMXh1ZlNncEtUdGNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0J6WlhSRVlYUmhPMXh1SWl3aWRtRnlJR0poYzJWR2IzSkpiaUE5SUhKbGNYVnBjbVVvSnk0dlltRnpaVVp2Y2tsdUp5a3NYRzRnSUNBZ2FYTkJjbWQxYldWdWRITWdQU0J5WlhGMWFYSmxLQ2N1TGk5c1lXNW5MMmx6UVhKbmRXMWxiblJ6Snlrc1hHNGdJQ0FnYVhOSWIzTjBUMkpxWldOMElEMGdjbVZ4ZFdseVpTZ25MaTlwYzBodmMzUlBZbXBsWTNRbktTeGNiaUFnSUNCcGMwOWlhbVZqZEV4cGEyVWdQU0J5WlhGMWFYSmxLQ2N1TDJselQySnFaV04wVEdsclpTY3BMRnh1SUNBZ0lITjFjSEJ2Y25RZ1BTQnlaWEYxYVhKbEtDY3VMaTl6ZFhCd2IzSjBKeWs3WEc1Y2JpOHFLaUJnVDJKcVpXTjBJM1J2VTNSeWFXNW5ZQ0J5WlhOMWJIUWdjbVZtWlhKbGJtTmxjeTRnS2k5Y2JuWmhjaUJ2WW1wbFkzUlVZV2NnUFNBblcyOWlhbVZqZENCUFltcGxZM1JkSnp0Y2JseHVMeW9xSUZWelpXUWdabTl5SUc1aGRHbDJaU0J0WlhSb2IyUWdjbVZtWlhKbGJtTmxjeTRnS2k5Y2JuWmhjaUJ2WW1wbFkzUlFjbTkwYnlBOUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVN1hHNWNiaThxS2lCVmMyVmtJSFJ2SUdOb1pXTnJJRzlpYW1WamRITWdabTl5SUc5M2JpQndjbTl3WlhKMGFXVnpMaUFxTDF4dWRtRnlJR2hoYzA5M2JsQnliM0JsY25SNUlEMGdiMkpxWldOMFVISnZkRzh1YUdGelQzZHVVSEp2Y0dWeWRIazdYRzVjYmk4cUtseHVJQ29nVlhObFpDQjBieUJ5WlhOdmJIWmxJSFJvWlNCYllIUnZVM1J5YVc1blZHRm5ZRjBvYUhSMGNITTZMeTl3Wlc5d2JHVXViVzk2YVd4c1lTNXZjbWN2Zm1wdmNtVnVaRzl5Wm1ZdlpYTTJMV1J5WVdaMExtaDBiV3dqYzJWakxXOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOXpkSEpwYm1jcFhHNGdLaUJ2WmlCMllXeDFaWE11WEc0Z0tpOWNiblpoY2lCdlltcFViMU4wY21sdVp5QTlJRzlpYW1WamRGQnliM1J2TG5SdlUzUnlhVzVuTzF4dVhHNHZLaXBjYmlBcUlFRWdabUZzYkdKaFkyc2dhVzF3YkdWdFpXNTBZWFJwYjI0Z2IyWWdZRjh1YVhOUWJHRnBiazlpYW1WamRHQWdkMmhwWTJnZ1kyaGxZMnR6SUdsbUlHQjJZV3gxWldCY2JpQXFJR2x6SUdGdUlHOWlhbVZqZENCamNtVmhkR1ZrSUdKNUlIUm9aU0JnVDJKcVpXTjBZQ0JqYjI1emRISjFZM1J2Y2lCdmNpQm9ZWE1nWVNCZ1cxdFFjbTkwYjNSNWNHVmRYV0JjYmlBcUlHOW1JR0J1ZFd4c1lDNWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ29nUUhCaGNtRnRJSHNxZlNCMllXeDFaU0JVYUdVZ2RtRnNkV1VnZEc4Z1kyaGxZMnN1WEc0Z0tpQkFjbVYwZFhKdWN5QjdZbTl2YkdWaGJuMGdVbVYwZFhKdWN5QmdkSEoxWldBZ2FXWWdZSFpoYkhWbFlDQnBjeUJoSUhCc1lXbHVJRzlpYW1WamRDd2daV3h6WlNCZ1ptRnNjMlZnTGx4dUlDb3ZYRzVtZFc1amRHbHZiaUJ6YUdsdFNYTlFiR0ZwYms5aWFtVmpkQ2gyWVd4MVpTa2dlMXh1SUNCMllYSWdRM1J2Y2p0Y2JseHVJQ0F2THlCRmVHbDBJR1ZoY214NUlHWnZjaUJ1YjI0Z1lFOWlhbVZqZEdBZ2IySnFaV04wY3k1Y2JpQWdhV1lnS0NFb2FYTlBZbXBsWTNSTWFXdGxLSFpoYkhWbEtTQW1KaUJ2WW1wVWIxTjBjbWx1Wnk1allXeHNLSFpoYkhWbEtTQTlQU0J2WW1wbFkzUlVZV2NnSmlZZ0lXbHpTRzl6ZEU5aWFtVmpkQ2gyWVd4MVpTa3BJSHg4WEc0Z0lDQWdJQ0FvSVdoaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2RtRnNkV1VzSUNkamIyNXpkSEoxWTNSdmNpY3BJQ1ltWEc0Z0lDQWdJQ0FnSUNoRGRHOXlJRDBnZG1Gc2RXVXVZMjl1YzNSeWRXTjBiM0lzSUhSNWNHVnZaaUJEZEc5eUlEMDlJQ2RtZFc1amRHbHZiaWNnSmlZZ0lTaERkRzl5SUdsdWMzUmhibU5sYjJZZ1EzUnZjaWtwS1NCOGZGeHVJQ0FnSUNBZ0tDRnpkWEJ3YjNKMExtRnlaM05VWVdjZ0ppWWdhWE5CY21kMWJXVnVkSE1vZG1Gc2RXVXBLU2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1SUNBdkx5QkpSU0E4SURrZ2FYUmxjbUYwWlhNZ2FXNW9aWEpwZEdWa0lIQnliM0JsY25ScFpYTWdZbVZtYjNKbElHOTNiaUJ3Y205d1pYSjBhV1Z6TGlCSlppQjBhR1VnWm1seWMzUmNiaUFnTHk4Z2FYUmxjbUYwWldRZ2NISnZjR1Z5ZEhrZ2FYTWdZVzRnYjJKcVpXTjBKM01nYjNkdUlIQnliM0JsY25SNUlIUm9aVzRnZEdobGNtVWdZWEpsSUc1dklHbHVhR1Z5YVhSbFpGeHVJQ0F2THlCbGJuVnRaWEpoWW14bElIQnliM0JsY25ScFpYTXVYRzRnSUhaaGNpQnlaWE4xYkhRN1hHNGdJR2xtSUNoemRYQndiM0owTG05M2JreGhjM1FwSUh0Y2JpQWdJQ0JpWVhObFJtOXlTVzRvZG1Gc2RXVXNJR1oxYm1OMGFXOXVLSE4xWWxaaGJIVmxMQ0JyWlhrc0lHOWlhbVZqZENrZ2UxeHVJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2FHRnpUM2R1VUhKdmNHVnlkSGt1WTJGc2JDaHZZbXBsWTNRc0lHdGxlU2s3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnZlNrN1hHNGdJQ0FnY21WMGRYSnVJSEpsYzNWc2RDQWhQVDBnWm1Gc2MyVTdYRzRnSUgxY2JpQWdMeThnU1c0Z2JXOXpkQ0JsYm5acGNtOXViV1Z1ZEhNZ1lXNGdiMkpxWldOMEozTWdiM2R1SUhCeWIzQmxjblJwWlhNZ1lYSmxJR2wwWlhKaGRHVmtJR0psWm05eVpWeHVJQ0F2THlCcGRITWdhVzVvWlhKcGRHVmtJSEJ5YjNCbGNuUnBaWE11SUVsbUlIUm9aU0JzWVhOMElHbDBaWEpoZEdWa0lIQnliM0JsY25SNUlHbHpJR0Z1SUc5aWFtVmpkQ2R6WEc0Z0lDOHZJRzkzYmlCd2NtOXdaWEowZVNCMGFHVnVJSFJvWlhKbElHRnlaU0J1YnlCcGJtaGxjbWwwWldRZ1pXNTFiV1Z5WVdKc1pTQndjbTl3WlhKMGFXVnpMbHh1SUNCaVlYTmxSbTl5U1c0b2RtRnNkV1VzSUdaMWJtTjBhVzl1S0hOMVlsWmhiSFZsTENCclpYa3BJSHRjYmlBZ0lDQnlaWE4xYkhRZ1BTQnJaWGs3WEc0Z0lIMHBPMXh1SUNCeVpYUjFjbTRnZEhsd1pXOW1JSEpsYzNWc2RDQTlQU0FuZFc1a1pXWnBibVZrSnlCOGZDQm9ZWE5QZDI1UWNtOXdaWEowZVM1allXeHNLSFpoYkhWbExDQnlaWE4xYkhRcE8xeHVmVnh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUhOb2FXMUpjMUJzWVdsdVQySnFaV04wTzF4dUlpd2lkbUZ5SUdselFYSm5kVzFsYm5SeklEMGdjbVZ4ZFdseVpTZ25MaTR2YkdGdVp5OXBjMEZ5WjNWdFpXNTBjeWNwTEZ4dUlDQWdJR2x6UVhKeVlYa2dQU0J5WlhGMWFYSmxLQ2N1TGk5c1lXNW5MMmx6UVhKeVlYa25LU3hjYmlBZ0lDQnBjMGx1WkdWNElEMGdjbVZ4ZFdseVpTZ25MaTlwYzBsdVpHVjRKeWtzWEc0Z0lDQWdhWE5NWlc1bmRHZ2dQU0J5WlhGMWFYSmxLQ2N1TDJselRHVnVaM1JvSnlrc1hHNGdJQ0FnYVhOVGRISnBibWNnUFNCeVpYRjFhWEpsS0NjdUxpOXNZVzVuTDJselUzUnlhVzVuSnlrc1hHNGdJQ0FnYTJWNWMwbHVJRDBnY21WeGRXbHlaU2duTGk0dmIySnFaV04wTDJ0bGVYTkpiaWNwTEZ4dUlDQWdJSE4xY0hCdmNuUWdQU0J5WlhGMWFYSmxLQ2N1TGk5emRYQndiM0owSnlrN1hHNWNiaThxS2lCVmMyVmtJR1p2Y2lCdVlYUnBkbVVnYldWMGFHOWtJSEpsWm1WeVpXNWpaWE11SUNvdlhHNTJZWElnYjJKcVpXTjBVSEp2ZEc4Z1BTQlBZbXBsWTNRdWNISnZkRzkwZVhCbE8xeHVYRzR2S2lvZ1ZYTmxaQ0IwYnlCamFHVmpheUJ2WW1wbFkzUnpJR1p2Y2lCdmQyNGdjSEp2Y0dWeWRHbGxjeTRnS2k5Y2JuWmhjaUJvWVhOUGQyNVFjbTl3WlhKMGVTQTlJRzlpYW1WamRGQnliM1J2TG1oaGMwOTNibEJ5YjNCbGNuUjVPMXh1WEc0dktpcGNiaUFxSUVFZ1ptRnNiR0poWTJzZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYjJZZ1lFOWlhbVZqZEM1clpYbHpZQ0IzYUdsamFDQmpjbVZoZEdWeklHRnVJR0Z5Y21GNUlHOW1JSFJvWlZ4dUlDb2diM2R1SUdWdWRXMWxjbUZpYkdVZ2NISnZjR1Z5ZEhrZ2JtRnRaWE1nYjJZZ1lHOWlhbVZqZEdBdVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZZbXBsWTNRZ1ZHaGxJRzlpYW1WamRDQjBieUJwYm5Od1pXTjBMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UwRnljbUY1ZlNCU1pYUjFjbTV6SUhSb1pTQmhjbkpoZVNCdlppQndjbTl3WlhKMGVTQnVZVzFsY3k1Y2JpQXFMMXh1Wm5WdVkzUnBiMjRnYzJocGJVdGxlWE1vYjJKcVpXTjBLU0I3WEc0Z0lIWmhjaUJ3Y205d2N5QTlJR3RsZVhOSmJpaHZZbXBsWTNRcExGeHVJQ0FnSUNBZ2NISnZjSE5NWlc1bmRHZ2dQU0J3Y205d2N5NXNaVzVuZEdnc1hHNGdJQ0FnSUNCc1pXNW5kR2dnUFNCd2NtOXdjMHhsYm1kMGFDQW1KaUJ2WW1wbFkzUXViR1Z1WjNSb08xeHVYRzRnSUhaaGNpQmhiR3h2ZDBsdVpHVjRaWE1nUFNCc1pXNW5kR2dnSmlZZ2FYTk1aVzVuZEdnb2JHVnVaM1JvS1NBbUpseHVJQ0FnSUNocGMwRnljbUY1S0c5aWFtVmpkQ2tnZkh3Z0tITjFjSEJ2Y25RdWJtOXVSVzUxYlZOMGNtbHVaM01nSmlZZ2FYTlRkSEpwYm1jb2IySnFaV04wS1NrZ2ZIeGNiaUFnSUNBZ0lDaHpkWEJ3YjNKMExtNXZia1Z1ZFcxQmNtZHpJQ1ltSUdselFYSm5kVzFsYm5SektHOWlhbVZqZENrcEtUdGNibHh1SUNCMllYSWdhVzVrWlhnZ1BTQXRNU3hjYmlBZ0lDQWdJSEpsYzNWc2RDQTlJRnRkTzF4dVhHNGdJSGRvYVd4bElDZ3JLMmx1WkdWNElEd2djSEp2Y0hOTVpXNW5kR2dwSUh0Y2JpQWdJQ0IyWVhJZ2EyVjVJRDBnY0hKdmNITmJhVzVrWlhoZE8xeHVJQ0FnSUdsbUlDZ29ZV3hzYjNkSmJtUmxlR1Z6SUNZbUlHbHpTVzVrWlhnb2EyVjVMQ0JzWlc1bmRHZ3BLU0I4ZkNCb1lYTlBkMjVRY205d1pYSjBlUzVqWVd4c0tHOWlhbVZqZEN3Z2EyVjVLU2tnZTF4dUlDQWdJQ0FnY21WemRXeDBMbkIxYzJnb2EyVjVLVHRjYmlBZ0lDQjlYRzRnSUgxY2JpQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0J6YUdsdFMyVjVjenRjYmlJc0luWmhjaUJwYzA5aWFtVmpkQ0E5SUhKbGNYVnBjbVVvSnk0dUwyeGhibWN2YVhOUFltcGxZM1FuS1N4Y2JpQWdJQ0JwYzFOMGNtbHVaeUE5SUhKbGNYVnBjbVVvSnk0dUwyeGhibWN2YVhOVGRISnBibWNuS1N4Y2JpQWdJQ0J6ZFhCd2IzSjBJRDBnY21WeGRXbHlaU2duTGk0dmMzVndjRzl5ZENjcE8xeHVYRzR2S2lwY2JpQXFJRU52Ym5abGNuUnpJR0IyWVd4MVpXQWdkRzhnWVc0Z2IySnFaV04wSUdsbUlHbDBJR2x6SUc1dmRDQnZibVV1WEc0Z0tseHVJQ29nUUhCeWFYWmhkR1ZjYmlBcUlFQndZWEpoYlNCN0tuMGdkbUZzZFdVZ1ZHaGxJSFpoYkhWbElIUnZJSEJ5YjJObGMzTXVYRzRnS2lCQWNtVjBkWEp1Y3lCN1QySnFaV04wZlNCU1pYUjFjbTV6SUhSb1pTQnZZbXBsWTNRdVhHNGdLaTljYm1aMWJtTjBhVzl1SUhSdlQySnFaV04wS0haaGJIVmxLU0I3WEc0Z0lHbG1JQ2h6ZFhCd2IzSjBMblZ1YVc1a1pYaGxaRU5vWVhKeklDWW1JR2x6VTNSeWFXNW5LSFpoYkhWbEtTa2dlMXh1SUNBZ0lIWmhjaUJwYm1SbGVDQTlJQzB4TEZ4dUlDQWdJQ0FnSUNCc1pXNW5kR2dnUFNCMllXeDFaUzVzWlc1bmRHZ3NYRzRnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJRTlpYW1WamRDaDJZV3gxWlNrN1hHNWNiaUFnSUNCM2FHbHNaU0FvS3l0cGJtUmxlQ0E4SUd4bGJtZDBhQ2tnZTF4dUlDQWdJQ0FnY21WemRXeDBXMmx1WkdWNFhTQTlJSFpoYkhWbExtTm9ZWEpCZENocGJtUmxlQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc0Z0lIMWNiaUFnY21WMGRYSnVJR2x6VDJKcVpXTjBLSFpoYkhWbEtTQS9JSFpoYkhWbElEb2dUMkpxWldOMEtIWmhiSFZsS1R0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0IwYjA5aWFtVmpkRHRjYmlJc0luWmhjaUJNWVhwNVYzSmhjSEJsY2lBOUlISmxjWFZwY21Vb0p5NHZUR0Y2ZVZkeVlYQndaWEluS1N4Y2JpQWdJQ0JNYjJSaGMyaFhjbUZ3Y0dWeUlEMGdjbVZ4ZFdseVpTZ25MaTlNYjJSaGMyaFhjbUZ3Y0dWeUp5a3NYRzRnSUNBZ1lYSnlZWGxEYjNCNUlEMGdjbVZ4ZFdseVpTZ25MaTloY25KaGVVTnZjSGtuS1R0Y2JseHVMeW9xWEc0Z0tpQkRjbVZoZEdWeklHRWdZMnh2Ym1VZ2IyWWdZSGR5WVhCd1pYSmdMbHh1SUNwY2JpQXFJRUJ3Y21sMllYUmxYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnZDNKaGNIQmxjaUJVYUdVZ2QzSmhjSEJsY2lCMGJ5QmpiRzl1WlM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRQWW1wbFkzUjlJRkpsZEhWeWJuTWdkR2hsSUdOc2IyNWxaQ0IzY21Gd2NHVnlMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQjNjbUZ3Y0dWeVEyeHZibVVvZDNKaGNIQmxjaWtnZTF4dUlDQnlaWFIxY200Z2QzSmhjSEJsY2lCcGJuTjBZVzVqWlc5bUlFeGhlbmxYY21Gd2NHVnlYRzRnSUNBZ1B5QjNjbUZ3Y0dWeUxtTnNiMjVsS0NsY2JpQWdJQ0E2SUc1bGR5Qk1iMlJoYzJoWGNtRndjR1Z5S0hkeVlYQndaWEl1WDE5M2NtRndjR1ZrWDE4c0lIZHlZWEJ3WlhJdVgxOWphR0ZwYmw5ZkxDQmhjbkpoZVVOdmNIa29kM0poY0hCbGNpNWZYMkZqZEdsdmJuTmZYeWtwTzF4dWZWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJSGR5WVhCd1pYSkRiRzl1WlR0Y2JpSXNJblpoY2lCaVlYTmxRMnh2Ym1VZ1BTQnlaWEYxYVhKbEtDY3VMaTlwYm5SbGNtNWhiQzlpWVhObFEyeHZibVVuS1N4Y2JpQWdJQ0JpYVc1a1EyRnNiR0poWTJzZ1BTQnlaWEYxYVhKbEtDY3VMaTlwYm5SbGNtNWhiQzlpYVc1a1EyRnNiR0poWTJzbktUdGNibHh1THlvcVhHNGdLaUJEY21WaGRHVnpJR0VnWkdWbGNDQmpiRzl1WlNCdlppQmdkbUZzZFdWZ0xpQkpaaUJnWTNWemRHOXRhWHBsY21BZ2FYTWdjSEp2ZG1sa1pXUWdhWFFnYVhNZ2FXNTJiMnRsWkZ4dUlDb2dkRzhnY0hKdlpIVmpaU0IwYUdVZ1kyeHZibVZrSUhaaGJIVmxjeTRnU1dZZ1lHTjFjM1J2YldsNlpYSmdJSEpsZEhWeWJuTWdZSFZ1WkdWbWFXNWxaR0FnWTJ4dmJtbHVaMXh1SUNvZ2FYTWdhR0Z1Wkd4bFpDQmllU0IwYUdVZ2JXVjBhRzlrSUdsdWMzUmxZV1F1SUZSb1pTQmdZM1Z6ZEc5dGFYcGxjbUFnYVhNZ1ltOTFibVFnZEc4Z1lIUm9hWE5CY21kZ1hHNGdLaUJoYm1RZ2FXNTJiMnRsWkNCM2FYUm9JSFIzYnlCaGNtZDFiV1Z1ZERzZ0tIWmhiSFZsSUZzc0lHbHVaR1Y0Zkd0bGVTd2diMkpxWldOMFhTa3VYRzRnS2x4dUlDb2dLaXBPYjNSbE9pb3FJRlJvYVhNZ2JXVjBhRzlrSUdseklHeHZiM05sYkhrZ1ltRnpaV1FnYjI0Z2RHaGxYRzRnS2lCYmMzUnlkV04wZFhKbFpDQmpiRzl1WlNCaGJHZHZjbWwwYUcxZEtHaDBkSEE2THk5M2QzY3Vkek11YjNKbkwxUlNMMmgwYld3MUwybHVabkpoYzNSeWRXTjBkWEpsTG1oMGJXd2phVzUwWlhKdVlXd3RjM1J5ZFdOMGRYSmxaQzFqYkc5dWFXNW5MV0ZzWjI5eWFYUm9iU2t1WEc0Z0tpQlVhR1VnWlc1MWJXVnlZV0pzWlNCd2NtOXdaWEowYVdWeklHOW1JR0JoY21kMWJXVnVkSE5nSUc5aWFtVmpkSE1nWVc1a0lHOWlhbVZqZEhNZ1kzSmxZWFJsWkNCaWVWeHVJQ29nWTI5dWMzUnlkV04wYjNKeklHOTBhR1Z5SUhSb1lXNGdZRTlpYW1WamRHQWdZWEpsSUdOc2IyNWxaQ0IwYnlCd2JHRnBiaUJnVDJKcVpXTjBZQ0J2WW1wbFkzUnpMaUJCYmx4dUlDb2daVzF3ZEhrZ2IySnFaV04wSUdseklISmxkSFZ5Ym1Wa0lHWnZjaUIxYm1Oc2IyNWxZV0pzWlNCMllXeDFaWE1nYzNWamFDQmhjeUJtZFc1amRHbHZibk1zSUVSUFRTQnViMlJsY3l4Y2JpQXFJRTFoY0hNc0lGTmxkSE1zSUdGdVpDQlhaV0ZyVFdGd2N5NWNiaUFxWEc0Z0tpQkFjM1JoZEdsalhHNGdLaUJBYldWdFltVnlUMllnWDF4dUlDb2dRR05oZEdWbmIzSjVJRXhoYm1kY2JpQXFJRUJ3WVhKaGJTQjdLbjBnZG1Gc2RXVWdWR2hsSUhaaGJIVmxJSFJ2SUdSbFpYQWdZMnh2Ym1VdVhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JiWTNWemRHOXRhWHBsY2wwZ1ZHaGxJR1oxYm1OMGFXOXVJSFJ2SUdOMWMzUnZiV2w2WlNCamJHOXVhVzVuSUhaaGJIVmxjeTVjYmlBcUlFQndZWEpoYlNCN0tuMGdXM1JvYVhOQmNtZGRJRlJvWlNCZ2RHaHBjMkFnWW1sdVpHbHVaeUJ2WmlCZ1kzVnpkRzl0YVhwbGNtQXVYRzRnS2lCQWNtVjBkWEp1Y3lCN0tuMGdVbVYwZFhKdWN5QjBhR1VnWkdWbGNDQmpiRzl1WldRZ2RtRnNkV1V1WEc0Z0tpQkFaWGhoYlhCc1pWeHVJQ3BjYmlBcUlIWmhjaUIxYzJWeWN5QTlJRnRjYmlBcUlDQWdleUFuZFhObGNpYzZJQ2RpWVhKdVpYa25JSDBzWEc0Z0tpQWdJSHNnSjNWelpYSW5PaUFuWm5KbFpDY2dmVnh1SUNvZ1hUdGNiaUFxWEc0Z0tpQjJZWElnWkdWbGNDQTlJRjh1WTJ4dmJtVkVaV1Z3S0hWelpYSnpLVHRjYmlBcUlHUmxaWEJiTUYwZ1BUMDlJSFZ6WlhKeld6QmRPMXh1SUNvZ0x5OGdQVDRnWm1Gc2MyVmNiaUFxWEc0Z0tpQXZMeUIxYzJsdVp5QmhJR04xYzNSdmJXbDZaWElnWTJGc2JHSmhZMnRjYmlBcUlIWmhjaUJsYkNBOUlGOHVZMnh2Ym1WRVpXVndLR1J2WTNWdFpXNTBMbUp2Wkhrc0lHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdLaUFnSUdsbUlDaGZMbWx6Uld4bGJXVnVkQ2gyWVd4MVpTa3BJSHRjYmlBcUlDQWdJQ0J5WlhSMWNtNGdkbUZzZFdVdVkyeHZibVZPYjJSbEtIUnlkV1VwTzF4dUlDb2dJQ0I5WEc0Z0tpQjlLVHRjYmlBcVhHNGdLaUJsYkNBOVBUMGdaRzlqZFcxbGJuUXVZbTlrZVZ4dUlDb2dMeThnUFQ0Z1ptRnNjMlZjYmlBcUlHVnNMbTV2WkdWT1lXMWxYRzRnS2lBdkx5QTlQaUJDVDBSWlhHNGdLaUJsYkM1amFHbHNaRTV2WkdWekxteGxibWQwYUR0Y2JpQXFJQzh2SUQwK0lESXdYRzRnS2k5Y2JtWjFibU4wYVc5dUlHTnNiMjVsUkdWbGNDaDJZV3gxWlN3Z1kzVnpkRzl0YVhwbGNpd2dkR2hwYzBGeVp5a2dlMXh1SUNCamRYTjBiMjFwZW1WeUlEMGdkSGx3Wlc5bUlHTjFjM1J2YldsNlpYSWdQVDBnSjJaMWJtTjBhVzl1SnlBbUppQmlhVzVrUTJGc2JHSmhZMnNvWTNWemRHOXRhWHBsY2l3Z2RHaHBjMEZ5Wnl3Z01TazdYRzRnSUhKbGRIVnliaUJpWVhObFEyeHZibVVvZG1Gc2RXVXNJSFJ5ZFdVc0lHTjFjM1J2YldsNlpYSXBPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHTnNiMjVsUkdWbGNEdGNiaUlzSW5aaGNpQnBjMHhsYm1kMGFDQTlJSEpsY1hWcGNtVW9KeTR1TDJsdWRHVnlibUZzTDJselRHVnVaM1JvSnlrc1hHNGdJQ0FnYVhOUFltcGxZM1JNYVd0bElEMGdjbVZ4ZFdseVpTZ25MaTR2YVc1MFpYSnVZV3d2YVhOUFltcGxZM1JNYVd0bEp5a3NYRzRnSUNBZ2MzVndjRzl5ZENBOUlISmxjWFZwY21Vb0p5NHVMM04xY0hCdmNuUW5LVHRjYmx4dUx5b3FJR0JQWW1wbFkzUWpkRzlUZEhKcGJtZGdJSEpsYzNWc2RDQnlaV1psY21WdVkyVnpMaUFxTDF4dWRtRnlJR0Z5WjNOVVlXY2dQU0FuVzI5aWFtVmpkQ0JCY21kMWJXVnVkSE5kSnp0Y2JseHVMeW9xSUZWelpXUWdabTl5SUc1aGRHbDJaU0J0WlhSb2IyUWdjbVZtWlhKbGJtTmxjeTRnS2k5Y2JuWmhjaUJ2WW1wbFkzUlFjbTkwYnlBOUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVN1hHNWNiaThxS2lCVmMyVmtJSFJ2SUdOb1pXTnJJRzlpYW1WamRITWdabTl5SUc5M2JpQndjbTl3WlhKMGFXVnpMaUFxTDF4dWRtRnlJR2hoYzA5M2JsQnliM0JsY25SNUlEMGdiMkpxWldOMFVISnZkRzh1YUdGelQzZHVVSEp2Y0dWeWRIazdYRzVjYmk4cUtseHVJQ29nVlhObFpDQjBieUJ5WlhOdmJIWmxJSFJvWlNCYllIUnZVM1J5YVc1blZHRm5ZRjBvYUhSMGNITTZMeTl3Wlc5d2JHVXViVzk2YVd4c1lTNXZjbWN2Zm1wdmNtVnVaRzl5Wm1ZdlpYTTJMV1J5WVdaMExtaDBiV3dqYzJWakxXOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOXpkSEpwYm1jcFhHNGdLaUJ2WmlCMllXeDFaWE11WEc0Z0tpOWNiblpoY2lCdlltcFViMU4wY21sdVp5QTlJRzlpYW1WamRGQnliM1J2TG5SdlUzUnlhVzVuTzF4dVhHNHZLaW9nVG1GMGFYWmxJRzFsZEdodlpDQnlaV1psY21WdVkyVnpMaUFxTDF4dWRtRnlJSEJ5YjNCbGNuUjVTWE5GYm5WdFpYSmhZbXhsSUQwZ2IySnFaV04wVUhKdmRHOHVjSEp2Y0dWeWRIbEpjMFZ1ZFcxbGNtRmliR1U3WEc1Y2JpOHFLbHh1SUNvZ1EyaGxZMnR6SUdsbUlHQjJZV3gxWldBZ2FYTWdZMnhoYzNOcFptbGxaQ0JoY3lCaGJpQmdZWEpuZFcxbGJuUnpZQ0J2WW1wbFkzUXVYRzRnS2x4dUlDb2dRSE4wWVhScFkxeHVJQ29nUUcxbGJXSmxjazltSUY5Y2JpQXFJRUJqWVhSbFoyOXllU0JNWVc1blhHNGdLaUJBY0dGeVlXMGdleXA5SUhaaGJIVmxJRlJvWlNCMllXeDFaU0IwYnlCamFHVmpheTVjYmlBcUlFQnlaWFIxY201eklIdGliMjlzWldGdWZTQlNaWFIxY201eklHQjBjblZsWUNCcFppQmdkbUZzZFdWZ0lHbHpJR052Y25KbFkzUnNlU0JqYkdGemMybG1hV1ZrTENCbGJITmxJR0JtWVd4elpXQXVYRzRnS2lCQVpYaGhiWEJzWlZ4dUlDcGNiaUFxSUY4dWFYTkJjbWQxYldWdWRITW9ablZ1WTNScGIyNG9LU0I3SUhKbGRIVnliaUJoY21kMWJXVnVkSE03SUgwb0tTazdYRzRnS2lBdkx5QTlQaUIwY25WbFhHNGdLbHh1SUNvZ1h5NXBjMEZ5WjNWdFpXNTBjeWhiTVN3Z01pd2dNMTBwTzF4dUlDb2dMeThnUFQ0Z1ptRnNjMlZjYmlBcUwxeHVablZ1WTNScGIyNGdhWE5CY21kMWJXVnVkSE1vZG1Gc2RXVXBJSHRjYmlBZ2RtRnlJR3hsYm1kMGFDQTlJR2x6VDJKcVpXTjBUR2xyWlNoMllXeDFaU2tnUHlCMllXeDFaUzVzWlc1bmRHZ2dPaUIxYm1SbFptbHVaV1E3WEc0Z0lISmxkSFZ5YmlCcGMweGxibWQwYUNoc1pXNW5kR2dwSUNZbUlHOWlhbFJ2VTNSeWFXNW5MbU5oYkd3b2RtRnNkV1VwSUQwOUlHRnlaM05VWVdjN1hHNTlYRzR2THlCR1lXeHNZbUZqYXlCbWIzSWdaVzUyYVhKdmJtMWxiblJ6SUhkcGRHaHZkWFFnWVNCZ2RHOVRkSEpwYm1kVVlXZGdJR1p2Y2lCZ1lYSm5kVzFsYm5SellDQnZZbXBsWTNSekxseHVhV1lnS0NGemRYQndiM0owTG1GeVozTlVZV2NwSUh0Y2JpQWdhWE5CY21kMWJXVnVkSE1nUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQWdJSFpoY2lCc1pXNW5kR2dnUFNCcGMwOWlhbVZqZEV4cGEyVW9kbUZzZFdVcElEOGdkbUZzZFdVdWJHVnVaM1JvSURvZ2RXNWtaV1pwYm1Wa08xeHVJQ0FnSUhKbGRIVnliaUJwYzB4bGJtZDBhQ2hzWlc1bmRHZ3BJQ1ltSUdoaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2RtRnNkV1VzSUNkallXeHNaV1VuS1NBbUpseHVJQ0FnSUNBZ0lYQnliM0JsY25SNVNYTkZiblZ0WlhKaFlteGxMbU5oYkd3b2RtRnNkV1VzSUNkallXeHNaV1VuS1R0Y2JpQWdmVHRjYm4xY2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQnBjMEZ5WjNWdFpXNTBjenRjYmlJc0luWmhjaUJwYzB4bGJtZDBhQ0E5SUhKbGNYVnBjbVVvSnk0dUwybHVkR1Z5Ym1Gc0wybHpUR1Z1WjNSb0p5a3NYRzRnSUNBZ2FYTk9ZWFJwZG1VZ1BTQnlaWEYxYVhKbEtDY3VMMmx6VG1GMGFYWmxKeWtzWEc0Z0lDQWdhWE5QWW1wbFkzUk1hV3RsSUQwZ2NtVnhkV2x5WlNnbkxpNHZhVzUwWlhKdVlXd3ZhWE5QWW1wbFkzUk1hV3RsSnlrN1hHNWNiaThxS2lCZ1QySnFaV04wSTNSdlUzUnlhVzVuWUNCeVpYTjFiSFFnY21WbVpYSmxibU5sY3k0Z0tpOWNiblpoY2lCaGNuSmhlVlJoWnlBOUlDZGJiMkpxWldOMElFRnljbUY1WFNjN1hHNWNiaThxS2lCVmMyVmtJR1p2Y2lCdVlYUnBkbVVnYldWMGFHOWtJSEpsWm1WeVpXNWpaWE11SUNvdlhHNTJZWElnYjJKcVpXTjBVSEp2ZEc4Z1BTQlBZbXBsWTNRdWNISnZkRzkwZVhCbE8xeHVYRzR2S2lwY2JpQXFJRlZ6WldRZ2RHOGdjbVZ6YjJ4MlpTQjBhR1VnVzJCMGIxTjBjbWx1WjFSaFoyQmRLR2gwZEhCek9pOHZjR1Z2Y0d4bExtMXZlbWxzYkdFdWIzSm5MMzVxYjNKbGJtUnZjbVptTDJWek5pMWtjbUZtZEM1b2RHMXNJM05sWXkxdlltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdmMzUnlhVzVuS1Z4dUlDb2diMllnZG1Gc2RXVnpMbHh1SUNvdlhHNTJZWElnYjJKcVZHOVRkSEpwYm1jZ1BTQnZZbXBsWTNSUWNtOTBieTUwYjFOMGNtbHVaenRjYmx4dUx5b2dUbUYwYVhabElHMWxkR2h2WkNCeVpXWmxjbVZ1WTJWeklHWnZjaUIwYUc5elpTQjNhWFJvSUhSb1pTQnpZVzFsSUc1aGJXVWdZWE1nYjNSb1pYSWdZR3h2WkdGemFHQWdiV1YwYUc5a2N5NGdLaTljYm5aaGNpQnVZWFJwZG1WSmMwRnljbUY1SUQwZ2FYTk9ZWFJwZG1Vb2JtRjBhWFpsU1hOQmNuSmhlU0E5SUVGeWNtRjVMbWx6UVhKeVlYa3BJQ1ltSUc1aGRHbDJaVWx6UVhKeVlYazdYRzVjYmk4cUtseHVJQ29nUTJobFkydHpJR2xtSUdCMllXeDFaV0FnYVhNZ1kyeGhjM05wWm1sbFpDQmhjeUJoYmlCZ1FYSnlZWGxnSUc5aWFtVmpkQzVjYmlBcVhHNGdLaUJBYzNSaGRHbGpYRzRnS2lCQWJXVnRZbVZ5VDJZZ1gxeHVJQ29nUUdOaGRHVm5iM0o1SUV4aGJtZGNiaUFxSUVCd1lYSmhiU0I3S24wZ2RtRnNkV1VnVkdobElIWmhiSFZsSUhSdklHTm9aV05yTGx4dUlDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlJRkpsZEhWeWJuTWdZSFJ5ZFdWZ0lHbG1JR0IyWVd4MVpXQWdhWE1nWTI5eWNtVmpkR3g1SUdOc1lYTnphV1pwWldRc0lHVnNjMlVnWUdaaGJITmxZQzVjYmlBcUlFQmxlR0Z0Y0d4bFhHNGdLbHh1SUNvZ1h5NXBjMEZ5Y21GNUtGc3hMQ0F5TENBelhTazdYRzRnS2lBdkx5QTlQaUIwY25WbFhHNGdLbHh1SUNvZ1h5NXBjMEZ5Y21GNUtHWjFibU4wYVc5dUtDa2dleUJ5WlhSMWNtNGdZWEpuZFcxbGJuUnpPeUI5S0NrcE8xeHVJQ29nTHk4Z1BUNGdabUZzYzJWY2JpQXFMMXh1ZG1GeUlHbHpRWEp5WVhrZ1BTQnVZWFJwZG1WSmMwRnljbUY1SUh4OElHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJSEpsZEhWeWJpQnBjMDlpYW1WamRFeHBhMlVvZG1Gc2RXVXBJQ1ltSUdselRHVnVaM1JvS0haaGJIVmxMbXhsYm1kMGFDa2dKaVlnYjJKcVZHOVRkSEpwYm1jdVkyRnNiQ2gyWVd4MVpTa2dQVDBnWVhKeVlYbFVZV2M3WEc1OU8xeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR2x6UVhKeVlYazdYRzRpTENKMllYSWdZbUZ6WlVselJuVnVZM1JwYjI0Z1BTQnlaWEYxYVhKbEtDY3VMaTlwYm5SbGNtNWhiQzlpWVhObFNYTkdkVzVqZEdsdmJpY3BMRnh1SUNBZ0lHbHpUbUYwYVhabElEMGdjbVZ4ZFdseVpTZ25MaTlwYzA1aGRHbDJaU2NwTzF4dVhHNHZLaW9nWUU5aWFtVmpkQ04wYjFOMGNtbHVaMkFnY21WemRXeDBJSEpsWm1WeVpXNWpaWE11SUNvdlhHNTJZWElnWm5WdVkxUmhaeUE5SUNkYmIySnFaV04wSUVaMWJtTjBhVzl1WFNjN1hHNWNiaThxS2lCVmMyVmtJR1p2Y2lCdVlYUnBkbVVnYldWMGFHOWtJSEpsWm1WeVpXNWpaWE11SUNvdlhHNTJZWElnYjJKcVpXTjBVSEp2ZEc4Z1BTQlBZbXBsWTNRdWNISnZkRzkwZVhCbE8xeHVYRzR2S2lwY2JpQXFJRlZ6WldRZ2RHOGdjbVZ6YjJ4MlpTQjBhR1VnVzJCMGIxTjBjbWx1WjFSaFoyQmRLR2gwZEhCek9pOHZjR1Z2Y0d4bExtMXZlbWxzYkdFdWIzSm5MMzVxYjNKbGJtUnZjbVptTDJWek5pMWtjbUZtZEM1b2RHMXNJM05sWXkxdlltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdmMzUnlhVzVuS1Z4dUlDb2diMllnZG1Gc2RXVnpMbHh1SUNvdlhHNTJZWElnYjJKcVZHOVRkSEpwYm1jZ1BTQnZZbXBsWTNSUWNtOTBieTUwYjFOMGNtbHVaenRjYmx4dUx5b3FJRTVoZEdsMlpTQnRaWFJvYjJRZ2NtVm1aWEpsYm1ObGN5NGdLaTljYm5aaGNpQlZhVzUwT0VGeWNtRjVJRDBnYVhOT1lYUnBkbVVvVldsdWREaEJjbkpoZVNBOUlHZHNiMkpoYkM1VmFXNTBPRUZ5Y21GNUtTQW1KaUJWYVc1ME9FRnljbUY1TzF4dVhHNHZLaXBjYmlBcUlFTm9aV05yY3lCcFppQmdkbUZzZFdWZ0lHbHpJR05zWVhOemFXWnBaV1FnWVhNZ1lTQmdSblZ1WTNScGIyNWdJRzlpYW1WamRDNWNiaUFxWEc0Z0tpQkFjM1JoZEdsalhHNGdLaUJBYldWdFltVnlUMllnWDF4dUlDb2dRR05oZEdWbmIzSjVJRXhoYm1kY2JpQXFJRUJ3WVhKaGJTQjdLbjBnZG1Gc2RXVWdWR2hsSUhaaGJIVmxJSFJ2SUdOb1pXTnJMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UySnZiMnhsWVc1OUlGSmxkSFZ5Ym5NZ1lIUnlkV1ZnSUdsbUlHQjJZV3gxWldBZ2FYTWdZMjl5Y21WamRHeDVJR05zWVhOemFXWnBaV1FzSUdWc2MyVWdZR1poYkhObFlDNWNiaUFxSUVCbGVHRnRjR3hsWEc0Z0tseHVJQ29nWHk1cGMwWjFibU4wYVc5dUtGOHBPMXh1SUNvZ0x5OGdQVDRnZEhKMVpWeHVJQ3BjYmlBcUlGOHVhWE5HZFc1amRHbHZiaWd2WVdKakx5azdYRzRnS2lBdkx5QTlQaUJtWVd4elpWeHVJQ292WEc1MllYSWdhWE5HZFc1amRHbHZiaUE5SUNFb1ltRnpaVWx6Um5WdVkzUnBiMjRvTDNndktTQjhmQ0FvVldsdWREaEJjbkpoZVNBbUppQWhZbUZ6WlVselJuVnVZM1JwYjI0b1ZXbHVkRGhCY25KaGVTa3BLU0EvSUdKaGMyVkpjMFoxYm1OMGFXOXVJRG9nWm5WdVkzUnBiMjRvZG1Gc2RXVXBJSHRjYmlBZ0x5OGdWR2hsSUhWelpTQnZaaUJnVDJKcVpXTjBJM1J2VTNSeWFXNW5ZQ0JoZG05cFpITWdhWE56ZFdWeklIZHBkR2dnZEdobElHQjBlWEJsYjJaZ0lHOXdaWEpoZEc5eVhHNGdJQzh2SUdsdUlHOXNaR1Z5SUhabGNuTnBiMjV6SUc5bUlFTm9jbTl0WlNCaGJtUWdVMkZtWVhKcElIZG9hV05vSUhKbGRIVnliaUFuWm5WdVkzUnBiMjRuSUdadmNpQnlaV2RsZUdWelhHNGdJQzh2SUdGdVpDQlRZV1poY21rZ09DQmxjWFZwZG1Gc1pXNTBjeUIzYUdsamFDQnlaWFIxY200Z0oyOWlhbVZqZENjZ1ptOXlJSFI1Y0dWa0lHRnljbUY1SUdOdmJuTjBjblZqZEc5eWN5NWNiaUFnY21WMGRYSnVJRzlpYWxSdlUzUnlhVzVuTG1OaGJHd29kbUZzZFdVcElEMDlJR1oxYm1OVVlXYzdYRzU5TzF4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHbHpSblZ1WTNScGIyNDdYRzRpTENKMllYSWdaWE5qWVhCbFVtVm5SWGh3SUQwZ2NtVnhkV2x5WlNnbkxpNHZjM1J5YVc1bkwyVnpZMkZ3WlZKbFowVjRjQ2NwTEZ4dUlDQWdJR2x6U0c5emRFOWlhbVZqZENBOUlISmxjWFZwY21Vb0p5NHVMMmx1ZEdWeWJtRnNMMmx6U0c5emRFOWlhbVZqZENjcExGeHVJQ0FnSUdselQySnFaV04wVEdsclpTQTlJSEpsY1hWcGNtVW9KeTR1TDJsdWRHVnlibUZzTDJselQySnFaV04wVEdsclpTY3BPMXh1WEc0dktpb2dZRTlpYW1WamRDTjBiMU4wY21sdVoyQWdjbVZ6ZFd4MElISmxabVZ5Wlc1alpYTXVJQ292WEc1MllYSWdablZ1WTFSaFp5QTlJQ2RiYjJKcVpXTjBJRVoxYm1OMGFXOXVYU2M3WEc1Y2JpOHFLaUJWYzJWa0lIUnZJR1JsZEdWamRDQm9iM04wSUdOdmJuTjBjblZqZEc5eWN5QW9VMkZtWVhKcElENGdOU2t1SUNvdlhHNTJZWElnY21WSWIzTjBRM1J2Y2lBOUlDOWVYRnhiYjJKcVpXTjBJQzRyUDBOdmJuTjBjblZqZEc5eVhGeGRKQzg3WEc1Y2JpOHFLaUJWYzJWa0lHWnZjaUJ1WVhScGRtVWdiV1YwYUc5a0lISmxabVZ5Wlc1alpYTXVJQ292WEc1MllYSWdiMkpxWldOMFVISnZkRzhnUFNCUFltcGxZM1F1Y0hKdmRHOTBlWEJsTzF4dVhHNHZLaW9nVlhObFpDQjBieUJ5WlhOdmJIWmxJSFJvWlNCa1pXTnZiWEJwYkdWa0lITnZkWEpqWlNCdlppQm1kVzVqZEdsdmJuTXVJQ292WEc1MllYSWdabTVVYjFOMGNtbHVaeUE5SUVaMWJtTjBhVzl1TG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1Wnp0Y2JseHVMeW9xWEc0Z0tpQlZjMlZrSUhSdklISmxjMjlzZG1VZ2RHaGxJRnRnZEc5VGRISnBibWRVWVdkZ1hTaG9kSFJ3Y3pvdkwzQmxiM0JzWlM1dGIzcHBiR3hoTG05eVp5OSthbTl5Wlc1a2IzSm1aaTlsY3pZdFpISmhablF1YUhSdGJDTnpaV010YjJKcVpXTjBMbkJ5YjNSdmRIbHdaUzUwYjNOMGNtbHVaeWxjYmlBcUlHOW1JSFpoYkhWbGN5NWNiaUFxTDF4dWRtRnlJRzlpYWxSdlUzUnlhVzVuSUQwZ2IySnFaV04wVUhKdmRHOHVkRzlUZEhKcGJtYzdYRzVjYmk4cUtpQlZjMlZrSUhSdklHUmxkR1ZqZENCcFppQmhJRzFsZEdodlpDQnBjeUJ1WVhScGRtVXVJQ292WEc1MllYSWdjbVZPWVhScGRtVWdQU0JTWldkRmVIQW9KMTRuSUN0Y2JpQWdaWE5qWVhCbFVtVm5SWGh3S0c5aWFsUnZVM1J5YVc1bktWeHVJQ0F1Y21Wd2JHRmpaU2d2ZEc5VGRISnBibWQ4S0daMWJtTjBhVzl1S1M0cVB5Zy9QVnhjWEZ4Y1hDZ3BmQ0JtYjNJZ0xpcy9LRDg5WEZ4Y1hGeGNYU2t2Wnl3Z0p5UXhMaW8vSnlrZ0t5QW5KQ2RjYmlrN1hHNWNiaThxS2x4dUlDb2dRMmhsWTJ0eklHbG1JR0IyWVd4MVpXQWdhWE1nWVNCdVlYUnBkbVVnWm5WdVkzUnBiMjR1WEc0Z0tseHVJQ29nUUhOMFlYUnBZMXh1SUNvZ1FHMWxiV0psY2s5bUlGOWNiaUFxSUVCallYUmxaMjl5ZVNCTVlXNW5YRzRnS2lCQWNHRnlZVzBnZXlwOUlIWmhiSFZsSUZSb1pTQjJZV3gxWlNCMGJ5QmphR1ZqYXk1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRpYjI5c1pXRnVmU0JTWlhSMWNtNXpJR0IwY25WbFlDQnBaaUJnZG1Gc2RXVmdJR2x6SUdFZ2JtRjBhWFpsSUdaMWJtTjBhVzl1TENCbGJITmxJR0JtWVd4elpXQXVYRzRnS2lCQVpYaGhiWEJzWlZ4dUlDcGNiaUFxSUY4dWFYTk9ZWFJwZG1Vb1FYSnlZWGt1Y0hKdmRHOTBlWEJsTG5CMWMyZ3BPMXh1SUNvZ0x5OGdQVDRnZEhKMVpWeHVJQ3BjYmlBcUlGOHVhWE5PWVhScGRtVW9YeWs3WEc0Z0tpQXZMeUE5UGlCbVlXeHpaVnh1SUNvdlhHNW1kVzVqZEdsdmJpQnBjMDVoZEdsMlpTaDJZV3gxWlNrZ2UxeHVJQ0JwWmlBb2RtRnNkV1VnUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1SUNCcFppQW9iMkpxVkc5VGRISnBibWN1WTJGc2JDaDJZV3gxWlNrZ1BUMGdablZ1WTFSaFp5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCeVpVNWhkR2wyWlM1MFpYTjBLR1p1Vkc5VGRISnBibWN1WTJGc2JDaDJZV3gxWlNrcE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCcGMwOWlhbVZqZEV4cGEyVW9kbUZzZFdVcElDWW1JQ2hwYzBodmMzUlBZbXBsWTNRb2RtRnNkV1VwSUQ4Z2NtVk9ZWFJwZG1VZ09pQnlaVWh2YzNSRGRHOXlLUzUwWlhOMEtIWmhiSFZsS1R0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JwYzA1aGRHbDJaVHRjYmlJc0lpOHFLbHh1SUNvZ1EyaGxZMnR6SUdsbUlHQjJZV3gxWldBZ2FYTWdkR2hsSUZ0c1lXNW5kV0ZuWlNCMGVYQmxYU2hvZEhSd2N6b3ZMMlZ6TlM1bmFYUm9kV0l1YVc4dkkzZzRLU0J2WmlCZ1QySnFaV04wWUM1Y2JpQXFJQ2hsTG1jdUlHRnljbUY1Y3l3Z1puVnVZM1JwYjI1ekxDQnZZbXBsWTNSekxDQnlaV2RsZUdWekxDQmdibVYzSUU1MWJXSmxjaWd3S1dBc0lHRnVaQ0JnYm1WM0lGTjBjbWx1Wnlnbkp5bGdLVnh1SUNwY2JpQXFJRUJ6ZEdGMGFXTmNiaUFxSUVCdFpXMWlaWEpQWmlCZlhHNGdLaUJBWTJGMFpXZHZjbmtnVEdGdVoxeHVJQ29nUUhCaGNtRnRJSHNxZlNCMllXeDFaU0JVYUdVZ2RtRnNkV1VnZEc4Z1kyaGxZMnN1WEc0Z0tpQkFjbVYwZFhKdWN5QjdZbTl2YkdWaGJuMGdVbVYwZFhKdWN5QmdkSEoxWldBZ2FXWWdZSFpoYkhWbFlDQnBjeUJoYmlCdlltcGxZM1FzSUdWc2MyVWdZR1poYkhObFlDNWNiaUFxSUVCbGVHRnRjR3hsWEc0Z0tseHVJQ29nWHk1cGMwOWlhbVZqZENoN2ZTazdYRzRnS2lBdkx5QTlQaUIwY25WbFhHNGdLbHh1SUNvZ1h5NXBjMDlpYW1WamRDaGJNU3dnTWl3Z00xMHBPMXh1SUNvZ0x5OGdQVDRnZEhKMVpWeHVJQ3BjYmlBcUlGOHVhWE5QWW1wbFkzUW9NU2s3WEc0Z0tpQXZMeUE5UGlCbVlXeHpaVnh1SUNvdlhHNW1kVzVqZEdsdmJpQnBjMDlpYW1WamRDaDJZV3gxWlNrZ2UxeHVJQ0F2THlCQmRtOXBaQ0JoSUZZNElFcEpWQ0JpZFdjZ2FXNGdRMmh5YjIxbElERTVMVEl3TGx4dUlDQXZMeUJUWldVZ2FIUjBjSE02THk5amIyUmxMbWR2YjJkc1pTNWpiMjB2Y0M5Mk9DOXBjM04xWlhNdlpHVjBZV2xzUDJsa1BUSXlPVEVnWm05eUlHMXZjbVVnWkdWMFlXbHNjeTVjYmlBZ2RtRnlJSFI1Y0dVZ1BTQjBlWEJsYjJZZ2RtRnNkV1U3WEc0Z0lISmxkSFZ5YmlCMGVYQmxJRDA5SUNkbWRXNWpkR2x2YmljZ2ZId2dLQ0VoZG1Gc2RXVWdKaVlnZEhsd1pTQTlQU0FuYjJKcVpXTjBKeWs3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdhWE5QWW1wbFkzUTdYRzRpTENKMllYSWdhWE5CY21kMWJXVnVkSE1nUFNCeVpYRjFhWEpsS0NjdUwybHpRWEpuZFcxbGJuUnpKeWtzWEc0Z0lDQWdhWE5PWVhScGRtVWdQU0J5WlhGMWFYSmxLQ2N1TDJselRtRjBhWFpsSnlrc1hHNGdJQ0FnYzJocGJVbHpVR3hoYVc1UFltcGxZM1FnUFNCeVpYRjFhWEpsS0NjdUxpOXBiblJsY201aGJDOXphR2x0U1hOUWJHRnBiazlpYW1WamRDY3BMRnh1SUNBZ0lITjFjSEJ2Y25RZ1BTQnlaWEYxYVhKbEtDY3VMaTl6ZFhCd2IzSjBKeWs3WEc1Y2JpOHFLaUJnVDJKcVpXTjBJM1J2VTNSeWFXNW5ZQ0J5WlhOMWJIUWdjbVZtWlhKbGJtTmxjeTRnS2k5Y2JuWmhjaUJ2WW1wbFkzUlVZV2NnUFNBblcyOWlhbVZqZENCUFltcGxZM1JkSnp0Y2JseHVMeW9xSUZWelpXUWdabTl5SUc1aGRHbDJaU0J0WlhSb2IyUWdjbVZtWlhKbGJtTmxjeTRnS2k5Y2JuWmhjaUJ2WW1wbFkzUlFjbTkwYnlBOUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVN1hHNWNiaThxS2x4dUlDb2dWWE5sWkNCMGJ5QnlaWE52YkhabElIUm9aU0JiWUhSdlUzUnlhVzVuVkdGbllGMG9hSFIwY0hNNkx5OXdaVzl3YkdVdWJXOTZhV3hzWVM1dmNtY3ZmbXB2Y21WdVpHOXlabVl2WlhNMkxXUnlZV1owTG1oMGJXd2pjMlZqTFc5aWFtVmpkQzV3Y205MGIzUjVjR1V1ZEc5emRISnBibWNwWEc0Z0tpQnZaaUIyWVd4MVpYTXVYRzRnS2k5Y2JuWmhjaUJ2WW1wVWIxTjBjbWx1WnlBOUlHOWlhbVZqZEZCeWIzUnZMblJ2VTNSeWFXNW5PMXh1WEc0dktpb2dUbUYwYVhabElHMWxkR2h2WkNCeVpXWmxjbVZ1WTJWekxpQXFMMXh1ZG1GeUlHZGxkRkJ5YjNSdmRIbHdaVTltSUQwZ2FYTk9ZWFJwZG1Vb1oyVjBVSEp2ZEc5MGVYQmxUMllnUFNCUFltcGxZM1F1WjJWMFVISnZkRzkwZVhCbFQyWXBJQ1ltSUdkbGRGQnliM1J2ZEhsd1pVOW1PMXh1WEc0dktpcGNiaUFxSUVOb1pXTnJjeUJwWmlCZ2RtRnNkV1ZnSUdseklHRWdjR3hoYVc0Z2IySnFaV04wTENCMGFHRjBJR2x6TENCaGJpQnZZbXBsWTNRZ1kzSmxZWFJsWkNCaWVTQjBhR1ZjYmlBcUlHQlBZbXBsWTNSZ0lHTnZibk4wY25WamRHOXlJRzl5SUc5dVpTQjNhWFJvSUdFZ1lGdGJVSEp2ZEc5MGVYQmxYVjFnSUc5bUlHQnVkV3hzWUM1Y2JpQXFYRzRnS2lBcUtrNXZkR1U2S2lvZ1ZHaHBjeUJ0WlhSb2IyUWdZWE56ZFcxbGN5QnZZbXBsWTNSeklHTnlaV0YwWldRZ1lua2dkR2hsSUdCUFltcGxZM1JnSUdOdmJuTjBjblZqZEc5eVhHNGdLaUJvWVhabElHNXZJR2x1YUdWeWFYUmxaQ0JsYm5WdFpYSmhZbXhsSUhCeWIzQmxjblJwWlhNdVhHNGdLbHh1SUNvZ1FITjBZWFJwWTF4dUlDb2dRRzFsYldKbGNrOW1JRjljYmlBcUlFQmpZWFJsWjI5eWVTQk1ZVzVuWEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJSFpoYkhWbElGUm9aU0IyWVd4MVpTQjBieUJqYUdWamF5NWNiaUFxSUVCeVpYUjFjbTV6SUh0aWIyOXNaV0Z1ZlNCU1pYUjFjbTV6SUdCMGNuVmxZQ0JwWmlCZ2RtRnNkV1ZnSUdseklHRWdjR3hoYVc0Z2IySnFaV04wTENCbGJITmxJR0JtWVd4elpXQXVYRzRnS2lCQVpYaGhiWEJzWlZ4dUlDcGNiaUFxSUdaMWJtTjBhVzl1SUVadmJ5Z3BJSHRjYmlBcUlDQWdkR2hwY3k1aElEMGdNVHRjYmlBcUlIMWNiaUFxWEc0Z0tpQmZMbWx6VUd4aGFXNVBZbXBsWTNRb2JtVjNJRVp2YnlrN1hHNGdLaUF2THlBOVBpQm1ZV3h6WlZ4dUlDcGNiaUFxSUY4dWFYTlFiR0ZwYms5aWFtVmpkQ2hiTVN3Z01pd2dNMTBwTzF4dUlDb2dMeThnUFQ0Z1ptRnNjMlZjYmlBcVhHNGdLaUJmTG1selVHeGhhVzVQWW1wbFkzUW9leUFuZUNjNklEQXNJQ2Q1SnpvZ01DQjlLVHRjYmlBcUlDOHZJRDArSUhSeWRXVmNiaUFxWEc0Z0tpQmZMbWx6VUd4aGFXNVBZbXBsWTNRb1QySnFaV04wTG1OeVpXRjBaU2h1ZFd4c0tTazdYRzRnS2lBdkx5QTlQaUIwY25WbFhHNGdLaTljYm5aaGNpQnBjMUJzWVdsdVQySnFaV04wSUQwZ0lXZGxkRkJ5YjNSdmRIbHdaVTltSUQ4Z2MyaHBiVWx6VUd4aGFXNVBZbXBsWTNRZ09pQm1kVzVqZEdsdmJpaDJZV3gxWlNrZ2UxeHVJQ0JwWmlBb0lTaDJZV3gxWlNBbUppQnZZbXBVYjFOMGNtbHVaeTVqWVd4c0tIWmhiSFZsS1NBOVBTQnZZbXBsWTNSVVlXY3BJSHg4SUNnaGMzVndjRzl5ZEM1aGNtZHpWR0ZuSUNZbUlHbHpRWEpuZFcxbGJuUnpLSFpoYkhWbEtTa3BJSHRjYmlBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lIMWNiaUFnZG1GeUlIWmhiSFZsVDJZZ1BTQjJZV3gxWlM1MllXeDFaVTltTEZ4dUlDQWdJQ0FnYjJKcVVISnZkRzhnUFNCcGMwNWhkR2wyWlNoMllXeDFaVTltS1NBbUppQW9iMkpxVUhKdmRHOGdQU0JuWlhSUWNtOTBiM1I1Y0dWUFppaDJZV3gxWlU5bUtTa2dKaVlnWjJWMFVISnZkRzkwZVhCbFQyWW9iMkpxVUhKdmRHOHBPMXh1WEc0Z0lISmxkSFZ5YmlCdlltcFFjbTkwYjF4dUlDQWdJRDhnS0haaGJIVmxJRDA5SUc5aWFsQnliM1J2SUh4OElHZGxkRkJ5YjNSdmRIbHdaVTltS0haaGJIVmxLU0E5UFNCdlltcFFjbTkwYnlsY2JpQWdJQ0E2SUhOb2FXMUpjMUJzWVdsdVQySnFaV04wS0haaGJIVmxLVHRjYm4wN1hHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdhWE5RYkdGcGJrOWlhbVZqZER0Y2JpSXNJblpoY2lCcGMwOWlhbVZqZEV4cGEyVWdQU0J5WlhGMWFYSmxLQ2N1TGk5cGJuUmxjbTVoYkM5cGMwOWlhbVZqZEV4cGEyVW5LVHRjYmx4dUx5b3FJR0JQWW1wbFkzUWpkRzlUZEhKcGJtZGdJSEpsYzNWc2RDQnlaV1psY21WdVkyVnpMaUFxTDF4dWRtRnlJSE4wY21sdVoxUmhaeUE5SUNkYmIySnFaV04wSUZOMGNtbHVaMTBuTzF4dVhHNHZLaW9nVlhObFpDQm1iM0lnYm1GMGFYWmxJRzFsZEdodlpDQnlaV1psY21WdVkyVnpMaUFxTDF4dWRtRnlJRzlpYW1WamRGQnliM1J2SUQwZ1QySnFaV04wTG5CeWIzUnZkSGx3WlR0Y2JseHVMeW9xWEc0Z0tpQlZjMlZrSUhSdklISmxjMjlzZG1VZ2RHaGxJRnRnZEc5VGRISnBibWRVWVdkZ1hTaG9kSFJ3Y3pvdkwzQmxiM0JzWlM1dGIzcHBiR3hoTG05eVp5OSthbTl5Wlc1a2IzSm1aaTlsY3pZdFpISmhablF1YUhSdGJDTnpaV010YjJKcVpXTjBMbkJ5YjNSdmRIbHdaUzUwYjNOMGNtbHVaeWxjYmlBcUlHOW1JSFpoYkhWbGN5NWNiaUFxTDF4dWRtRnlJRzlpYWxSdlUzUnlhVzVuSUQwZ2IySnFaV04wVUhKdmRHOHVkRzlUZEhKcGJtYzdYRzVjYmk4cUtseHVJQ29nUTJobFkydHpJR2xtSUdCMllXeDFaV0FnYVhNZ1kyeGhjM05wWm1sbFpDQmhjeUJoSUdCVGRISnBibWRnSUhCeWFXMXBkR2wyWlNCdmNpQnZZbXBsWTNRdVhHNGdLbHh1SUNvZ1FITjBZWFJwWTF4dUlDb2dRRzFsYldKbGNrOW1JRjljYmlBcUlFQmpZWFJsWjI5eWVTQk1ZVzVuWEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJSFpoYkhWbElGUm9aU0IyWVd4MVpTQjBieUJqYUdWamF5NWNiaUFxSUVCeVpYUjFjbTV6SUh0aWIyOXNaV0Z1ZlNCU1pYUjFjbTV6SUdCMGNuVmxZQ0JwWmlCZ2RtRnNkV1ZnSUdseklHTnZjbkpsWTNSc2VTQmpiR0Z6YzJsbWFXVmtMQ0JsYkhObElHQm1ZV3h6WldBdVhHNGdLaUJBWlhoaGJYQnNaVnh1SUNwY2JpQXFJRjh1YVhOVGRISnBibWNvSjJGaVl5Y3BPMXh1SUNvZ0x5OGdQVDRnZEhKMVpWeHVJQ3BjYmlBcUlGOHVhWE5UZEhKcGJtY29NU2s3WEc0Z0tpQXZMeUE5UGlCbVlXeHpaVnh1SUNvdlhHNW1kVzVqZEdsdmJpQnBjMU4wY21sdVp5aDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlIWmhiSFZsSUQwOUlDZHpkSEpwYm1jbklIeDhJQ2hwYzA5aWFtVmpkRXhwYTJVb2RtRnNkV1VwSUNZbUlHOWlhbFJ2VTNSeWFXNW5MbU5oYkd3b2RtRnNkV1VwSUQwOUlITjBjbWx1WjFSaFp5azdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2FYTlRkSEpwYm1jN1hHNGlMQ0oyWVhJZ2FYTk1aVzVuZEdnZ1BTQnlaWEYxYVhKbEtDY3VMaTlwYm5SbGNtNWhiQzlwYzB4bGJtZDBhQ2NwTEZ4dUlDQWdJR2x6VDJKcVpXTjBUR2xyWlNBOUlISmxjWFZwY21Vb0p5NHVMMmx1ZEdWeWJtRnNMMmx6VDJKcVpXTjBUR2xyWlNjcE8xeHVYRzR2S2lvZ1lFOWlhbVZqZENOMGIxTjBjbWx1WjJBZ2NtVnpkV3gwSUhKbFptVnlaVzVqWlhNdUlDb3ZYRzUyWVhJZ1lYSm5jMVJoWnlBOUlDZGJiMkpxWldOMElFRnlaM1Z0Wlc1MGMxMG5MRnh1SUNBZ0lHRnljbUY1VkdGbklEMGdKMXR2WW1wbFkzUWdRWEp5WVhsZEp5eGNiaUFnSUNCaWIyOXNWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1FtOXZiR1ZoYmwwbkxGeHVJQ0FnSUdSaGRHVlVZV2NnUFNBblcyOWlhbVZqZENCRVlYUmxYU2NzWEc0Z0lDQWdaWEp5YjNKVVlXY2dQU0FuVzI5aWFtVmpkQ0JGY25KdmNsMG5MRnh1SUNBZ0lHWjFibU5VWVdjZ1BTQW5XMjlpYW1WamRDQkdkVzVqZEdsdmJsMG5MRnh1SUNBZ0lHMWhjRlJoWnlBOUlDZGJiMkpxWldOMElFMWhjRjBuTEZ4dUlDQWdJRzUxYldKbGNsUmhaeUE5SUNkYmIySnFaV04wSUU1MWJXSmxjbDBuTEZ4dUlDQWdJRzlpYW1WamRGUmhaeUE5SUNkYmIySnFaV04wSUU5aWFtVmpkRjBuTEZ4dUlDQWdJSEpsWjJWNGNGUmhaeUE5SUNkYmIySnFaV04wSUZKbFowVjRjRjBuTEZ4dUlDQWdJSE5sZEZSaFp5QTlJQ2RiYjJKcVpXTjBJRk5sZEYwbkxGeHVJQ0FnSUhOMGNtbHVaMVJoWnlBOUlDZGJiMkpxWldOMElGTjBjbWx1WjEwbkxGeHVJQ0FnSUhkbFlXdE5ZWEJVWVdjZ1BTQW5XMjlpYW1WamRDQlhaV0ZyVFdGd1hTYzdYRzVjYm5aaGNpQmhjbkpoZVVKMVptWmxjbFJoWnlBOUlDZGJiMkpxWldOMElFRnljbUY1UW5WbVptVnlYU2NzWEc0Z0lDQWdabXh2WVhRek1sUmhaeUE5SUNkYmIySnFaV04wSUVac2IyRjBNekpCY25KaGVWMG5MRnh1SUNBZ0lHWnNiMkYwTmpSVVlXY2dQU0FuVzI5aWFtVmpkQ0JHYkc5aGREWTBRWEp5WVhsZEp5eGNiaUFnSUNCcGJuUTRWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1NXNTBPRUZ5Y21GNVhTY3NYRzRnSUNBZ2FXNTBNVFpVWVdjZ1BTQW5XMjlpYW1WamRDQkpiblF4TmtGeWNtRjVYU2NzWEc0Z0lDQWdhVzUwTXpKVVlXY2dQU0FuVzI5aWFtVmpkQ0JKYm5Rek1rRnljbUY1WFNjc1hHNGdJQ0FnZFdsdWREaFVZV2NnUFNBblcyOWlhbVZqZENCVmFXNTBPRUZ5Y21GNVhTY3NYRzRnSUNBZ2RXbHVkRGhEYkdGdGNHVmtWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1ZXbHVkRGhEYkdGdGNHVmtRWEp5WVhsZEp5eGNiaUFnSUNCMWFXNTBNVFpVWVdjZ1BTQW5XMjlpYW1WamRDQlZhVzUwTVRaQmNuSmhlVjBuTEZ4dUlDQWdJSFZwYm5Rek1sUmhaeUE5SUNkYmIySnFaV04wSUZWcGJuUXpNa0Z5Y21GNVhTYzdYRzVjYmk4cUtpQlZjMlZrSUhSdklHbGtaVzUwYVdaNUlHQjBiMU4wY21sdVoxUmhaMkFnZG1Gc2RXVnpJRzltSUhSNWNHVmtJR0Z5Y21GNWN5NGdLaTljYm5aaGNpQjBlWEJsWkVGeWNtRjVWR0ZuY3lBOUlIdDlPMXh1ZEhsd1pXUkJjbkpoZVZSaFozTmJabXh2WVhRek1sUmhaMTBnUFNCMGVYQmxaRUZ5Y21GNVZHRm5jMXRtYkc5aGREWTBWR0ZuWFNBOVhHNTBlWEJsWkVGeWNtRjVWR0ZuYzF0cGJuUTRWR0ZuWFNBOUlIUjVjR1ZrUVhKeVlYbFVZV2R6VzJsdWRERTJWR0ZuWFNBOVhHNTBlWEJsWkVGeWNtRjVWR0ZuYzF0cGJuUXpNbFJoWjEwZ1BTQjBlWEJsWkVGeWNtRjVWR0ZuYzF0MWFXNTBPRlJoWjEwZ1BWeHVkSGx3WldSQmNuSmhlVlJoWjNOYmRXbHVkRGhEYkdGdGNHVmtWR0ZuWFNBOUlIUjVjR1ZrUVhKeVlYbFVZV2R6VzNWcGJuUXhObFJoWjEwZ1BWeHVkSGx3WldSQmNuSmhlVlJoWjNOYmRXbHVkRE15VkdGblhTQTlJSFJ5ZFdVN1hHNTBlWEJsWkVGeWNtRjVWR0ZuYzF0aGNtZHpWR0ZuWFNBOUlIUjVjR1ZrUVhKeVlYbFVZV2R6VzJGeWNtRjVWR0ZuWFNBOVhHNTBlWEJsWkVGeWNtRjVWR0ZuYzF0aGNuSmhlVUoxWm1abGNsUmhaMTBnUFNCMGVYQmxaRUZ5Y21GNVZHRm5jMXRpYjI5c1ZHRm5YU0E5WEc1MGVYQmxaRUZ5Y21GNVZHRm5jMXRrWVhSbFZHRm5YU0E5SUhSNWNHVmtRWEp5WVhsVVlXZHpXMlZ5Y205eVZHRm5YU0E5WEc1MGVYQmxaRUZ5Y21GNVZHRm5jMXRtZFc1alZHRm5YU0E5SUhSNWNHVmtRWEp5WVhsVVlXZHpXMjFoY0ZSaFoxMGdQVnh1ZEhsd1pXUkJjbkpoZVZSaFozTmJiblZ0WW1WeVZHRm5YU0E5SUhSNWNHVmtRWEp5WVhsVVlXZHpXMjlpYW1WamRGUmhaMTBnUFZ4dWRIbHdaV1JCY25KaGVWUmhaM05iY21WblpYaHdWR0ZuWFNBOUlIUjVjR1ZrUVhKeVlYbFVZV2R6VzNObGRGUmhaMTBnUFZ4dWRIbHdaV1JCY25KaGVWUmhaM05iYzNSeWFXNW5WR0ZuWFNBOUlIUjVjR1ZrUVhKeVlYbFVZV2R6VzNkbFlXdE5ZWEJVWVdkZElEMGdabUZzYzJVN1hHNWNiaThxS2lCVmMyVmtJR1p2Y2lCdVlYUnBkbVVnYldWMGFHOWtJSEpsWm1WeVpXNWpaWE11SUNvdlhHNTJZWElnYjJKcVpXTjBVSEp2ZEc4Z1BTQlBZbXBsWTNRdWNISnZkRzkwZVhCbE8xeHVYRzR2S2lwY2JpQXFJRlZ6WldRZ2RHOGdjbVZ6YjJ4MlpTQjBhR1VnVzJCMGIxTjBjbWx1WjFSaFoyQmRLR2gwZEhCek9pOHZjR1Z2Y0d4bExtMXZlbWxzYkdFdWIzSm5MMzVxYjNKbGJtUnZjbVptTDJWek5pMWtjbUZtZEM1b2RHMXNJM05sWXkxdlltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdmMzUnlhVzVuS1Z4dUlDb2diMllnZG1Gc2RXVnpMbHh1SUNvdlhHNTJZWElnYjJKcVZHOVRkSEpwYm1jZ1BTQnZZbXBsWTNSUWNtOTBieTUwYjFOMGNtbHVaenRjYmx4dUx5b3FYRzRnS2lCRGFHVmphM01nYVdZZ1lIWmhiSFZsWUNCcGN5QmpiR0Z6YzJsbWFXVmtJR0Z6SUdFZ2RIbHdaV1FnWVhKeVlYa3VYRzRnS2x4dUlDb2dRSE4wWVhScFkxeHVJQ29nUUcxbGJXSmxjazltSUY5Y2JpQXFJRUJqWVhSbFoyOXllU0JNWVc1blhHNGdLaUJBY0dGeVlXMGdleXA5SUhaaGJIVmxJRlJvWlNCMllXeDFaU0IwYnlCamFHVmpheTVjYmlBcUlFQnlaWFIxY201eklIdGliMjlzWldGdWZTQlNaWFIxY201eklHQjBjblZsWUNCcFppQmdkbUZzZFdWZ0lHbHpJR052Y25KbFkzUnNlU0JqYkdGemMybG1hV1ZrTENCbGJITmxJR0JtWVd4elpXQXVYRzRnS2lCQVpYaGhiWEJzWlZ4dUlDcGNiaUFxSUY4dWFYTlVlWEJsWkVGeWNtRjVLRzVsZHlCVmFXNTBPRUZ5Y21GNUtUdGNiaUFxSUM4dklEMCtJSFJ5ZFdWY2JpQXFYRzRnS2lCZkxtbHpWSGx3WldSQmNuSmhlU2hiWFNrN1hHNGdLaUF2THlBOVBpQm1ZV3h6WlZ4dUlDb3ZYRzVtZFc1amRHbHZiaUJwYzFSNWNHVmtRWEp5WVhrb2RtRnNkV1VwSUh0Y2JpQWdjbVYwZFhKdUlHbHpUMkpxWldOMFRHbHJaU2gyWVd4MVpTa2dKaVlnYVhOTVpXNW5kR2dvZG1Gc2RXVXViR1Z1WjNSb0tTQW1KaUFoSVhSNWNHVmtRWEp5WVhsVVlXZHpXMjlpYWxSdlUzUnlhVzVuTG1OaGJHd29kbUZzZFdVcFhUdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCcGMxUjVjR1ZrUVhKeVlYazdYRzRpTENJdktpcGNiaUFxSUVOb1pXTnJjeUJwWmlCZ2RtRnNkV1ZnSUdseklHQjFibVJsWm1sdVpXUmdMbHh1SUNwY2JpQXFJRUJ6ZEdGMGFXTmNiaUFxSUVCdFpXMWlaWEpQWmlCZlhHNGdLaUJBWTJGMFpXZHZjbmtnVEdGdVoxeHVJQ29nUUhCaGNtRnRJSHNxZlNCMllXeDFaU0JVYUdVZ2RtRnNkV1VnZEc4Z1kyaGxZMnN1WEc0Z0tpQkFjbVYwZFhKdWN5QjdZbTl2YkdWaGJuMGdVbVYwZFhKdWN5QmdkSEoxWldBZ2FXWWdZSFpoYkhWbFlDQnBjeUJnZFc1a1pXWnBibVZrWUN3Z1pXeHpaU0JnWm1Gc2MyVmdMbHh1SUNvZ1FHVjRZVzF3YkdWY2JpQXFYRzRnS2lCZkxtbHpWVzVrWldacGJtVmtLSFp2YVdRZ01DazdYRzRnS2lBdkx5QTlQaUIwY25WbFhHNGdLbHh1SUNvZ1h5NXBjMVZ1WkdWbWFXNWxaQ2h1ZFd4c0tUdGNiaUFxSUM4dklEMCtJR1poYkhObFhHNGdLaTljYm1aMWJtTjBhVzl1SUdselZXNWtaV1pwYm1Wa0tIWmhiSFZsS1NCN1hHNGdJSEpsZEhWeWJpQjBlWEJsYjJZZ2RtRnNkV1VnUFQwZ0ozVnVaR1ZtYVc1bFpDYzdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2FYTlZibVJsWm1sdVpXUTdYRzRpTENKMllYSWdhWE5NWlc1bmRHZ2dQU0J5WlhGMWFYSmxLQ2N1TGk5cGJuUmxjbTVoYkM5cGMweGxibWQwYUNjcExGeHVJQ0FnSUdselRtRjBhWFpsSUQwZ2NtVnhkV2x5WlNnbkxpNHZiR0Z1Wnk5cGMwNWhkR2wyWlNjcExGeHVJQ0FnSUdselQySnFaV04wSUQwZ2NtVnhkV2x5WlNnbkxpNHZiR0Z1Wnk5cGMwOWlhbVZqZENjcExGeHVJQ0FnSUhOb2FXMUxaWGx6SUQwZ2NtVnhkV2x5WlNnbkxpNHZhVzUwWlhKdVlXd3ZjMmhwYlV0bGVYTW5LU3hjYmlBZ0lDQnpkWEJ3YjNKMElEMGdjbVZ4ZFdseVpTZ25MaTR2YzNWd2NHOXlkQ2NwTzF4dVhHNHZLaUJPWVhScGRtVWdiV1YwYUc5a0lISmxabVZ5Wlc1alpYTWdabTl5SUhSb2IzTmxJSGRwZEdnZ2RHaGxJSE5oYldVZ2JtRnRaU0JoY3lCdmRHaGxjaUJnYkc5a1lYTm9ZQ0J0WlhSb2IyUnpMaUFxTDF4dWRtRnlJRzVoZEdsMlpVdGxlWE1nUFNCcGMwNWhkR2wyWlNodVlYUnBkbVZMWlhseklEMGdUMkpxWldOMExtdGxlWE1wSUNZbUlHNWhkR2wyWlV0bGVYTTdYRzVjYmk4cUtseHVJQ29nUTNKbFlYUmxjeUJoYmlCaGNuSmhlU0J2WmlCMGFHVWdiM2R1SUdWdWRXMWxjbUZpYkdVZ2NISnZjR1Z5ZEhrZ2JtRnRaWE1nYjJZZ1lHOWlhbVZqZEdBdVhHNGdLbHh1SUNvZ0tpcE9iM1JsT2lvcUlFNXZiaTF2WW1wbFkzUWdkbUZzZFdWeklHRnlaU0JqYjJWeVkyVmtJSFJ2SUc5aWFtVmpkSE11SUZObFpTQjBhR1ZjYmlBcUlGdEZVeUJ6Y0dWalhTaG9kSFJ3Y3pvdkwzQmxiM0JzWlM1dGIzcHBiR3hoTG05eVp5OSthbTl5Wlc1a2IzSm1aaTlsY3pZdFpISmhablF1YUhSdGJDTnpaV010YjJKcVpXTjBMbXRsZVhNcFhHNGdLaUJtYjNJZ2JXOXlaU0JrWlhSaGFXeHpMbHh1SUNwY2JpQXFJRUJ6ZEdGMGFXTmNiaUFxSUVCdFpXMWlaWEpQWmlCZlhHNGdLaUJBWTJGMFpXZHZjbmtnVDJKcVpXTjBYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjJKcVpXTjBJRlJvWlNCdlltcGxZM1FnZEc4Z2FXNXpjR1ZqZEM1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRCY25KaGVYMGdVbVYwZFhKdWN5QjBhR1VnWVhKeVlYa2diMllnY0hKdmNHVnlkSGtnYm1GdFpYTXVYRzRnS2lCQVpYaGhiWEJzWlZ4dUlDcGNiaUFxSUdaMWJtTjBhVzl1SUVadmJ5Z3BJSHRjYmlBcUlDQWdkR2hwY3k1aElEMGdNVHRjYmlBcUlDQWdkR2hwY3k1aUlEMGdNanRjYmlBcUlIMWNiaUFxWEc0Z0tpQkdiMjh1Y0hKdmRHOTBlWEJsTG1NZ1BTQXpPMXh1SUNwY2JpQXFJRjh1YTJWNWN5aHVaWGNnUm05dktUdGNiaUFxSUM4dklEMCtJRnNuWVNjc0lDZGlKMTBnS0dsMFpYSmhkR2x2YmlCdmNtUmxjaUJwY3lCdWIzUWdaM1ZoY21GdWRHVmxaQ2xjYmlBcVhHNGdLaUJmTG10bGVYTW9KMmhwSnlrN1hHNGdLaUF2THlBOVBpQmJKekFuTENBbk1TZGRYRzRnS2k5Y2JuWmhjaUJyWlhseklEMGdJVzVoZEdsMlpVdGxlWE1nUHlCemFHbHRTMlY1Y3lBNklHWjFibU4wYVc5dUtHOWlhbVZqZENrZ2UxeHVJQ0JwWmlBb2IySnFaV04wS1NCN1hHNGdJQ0FnZG1GeUlFTjBiM0lnUFNCdlltcGxZM1F1WTI5dWMzUnlkV04wYjNJc1hHNGdJQ0FnSUNBZ0lHeGxibWQwYUNBOUlHOWlhbVZqZEM1c1pXNW5kR2c3WEc0Z0lIMWNiaUFnYVdZZ0tDaDBlWEJsYjJZZ1EzUnZjaUE5UFNBblpuVnVZM1JwYjI0bklDWW1JRU4wYjNJdWNISnZkRzkwZVhCbElEMDlQU0J2WW1wbFkzUXBJSHg4WEc0Z0lDQWdJQ0FvZEhsd1pXOW1JRzlpYW1WamRDQTlQU0FuWm5WdVkzUnBiMjRuSUQ4Z2MzVndjRzl5ZEM1bGJuVnRVSEp2ZEc5MGVYQmxjeUE2SUNoc1pXNW5kR2dnSmlZZ2FYTk1aVzVuZEdnb2JHVnVaM1JvS1NrcEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUhOb2FXMUxaWGx6S0c5aWFtVmpkQ2s3WEc0Z0lIMWNiaUFnY21WMGRYSnVJR2x6VDJKcVpXTjBLRzlpYW1WamRDa2dQeUJ1WVhScGRtVkxaWGx6S0c5aWFtVmpkQ2tnT2lCYlhUdGNibjA3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2EyVjVjenRjYmlJc0luWmhjaUJoY25KaGVVVmhZMmdnUFNCeVpYRjFhWEpsS0NjdUxpOXBiblJsY201aGJDOWhjbkpoZVVWaFkyZ25LU3hjYmlBZ0lDQnBjMEZ5WjNWdFpXNTBjeUE5SUhKbGNYVnBjbVVvSnk0dUwyeGhibWN2YVhOQmNtZDFiV1Z1ZEhNbktTeGNiaUFnSUNCcGMwRnljbUY1SUQwZ2NtVnhkV2x5WlNnbkxpNHZiR0Z1Wnk5cGMwRnljbUY1Snlrc1hHNGdJQ0FnYVhOR2RXNWpkR2x2YmlBOUlISmxjWFZwY21Vb0p5NHVMMnhoYm1jdmFYTkdkVzVqZEdsdmJpY3BMRnh1SUNBZ0lHbHpTVzVrWlhnZ1BTQnlaWEYxYVhKbEtDY3VMaTlwYm5SbGNtNWhiQzlwYzBsdVpHVjRKeWtzWEc0Z0lDQWdhWE5NWlc1bmRHZ2dQU0J5WlhGMWFYSmxLQ2N1TGk5cGJuUmxjbTVoYkM5cGMweGxibWQwYUNjcExGeHVJQ0FnSUdselQySnFaV04wSUQwZ2NtVnhkV2x5WlNnbkxpNHZiR0Z1Wnk5cGMwOWlhbVZqZENjcExGeHVJQ0FnSUdselUzUnlhVzVuSUQwZ2NtVnhkV2x5WlNnbkxpNHZiR0Z1Wnk5cGMxTjBjbWx1WnljcExGeHVJQ0FnSUhOMWNIQnZjblFnUFNCeVpYRjFhWEpsS0NjdUxpOXpkWEJ3YjNKMEp5azdYRzVjYmk4cUtpQmdUMkpxWldOMEkzUnZVM1J5YVc1bllDQnlaWE4xYkhRZ2NtVm1aWEpsYm1ObGN5NGdLaTljYm5aaGNpQmhjbkpoZVZSaFp5QTlJQ2RiYjJKcVpXTjBJRUZ5Y21GNVhTY3NYRzRnSUNBZ1ltOXZiRlJoWnlBOUlDZGJiMkpxWldOMElFSnZiMnhsWVc1ZEp5eGNiaUFnSUNCa1lYUmxWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1JHRjBaVjBuTEZ4dUlDQWdJR1Z5Y205eVZHRm5JRDBnSjF0dlltcGxZM1FnUlhKeWIzSmRKeXhjYmlBZ0lDQm1kVzVqVkdGbklEMGdKMXR2WW1wbFkzUWdSblZ1WTNScGIyNWRKeXhjYmlBZ0lDQnVkVzFpWlhKVVlXY2dQU0FuVzI5aWFtVmpkQ0JPZFcxaVpYSmRKeXhjYmlBZ0lDQnZZbXBsWTNSVVlXY2dQU0FuVzI5aWFtVmpkQ0JQWW1wbFkzUmRKeXhjYmlBZ0lDQnlaV2RsZUhCVVlXY2dQU0FuVzI5aWFtVmpkQ0JTWldkRmVIQmRKeXhjYmlBZ0lDQnpkSEpwYm1kVVlXY2dQU0FuVzI5aWFtVmpkQ0JUZEhKcGJtZGRKenRjYmx4dUx5b3FJRlZ6WldRZ2RHOGdabWw0SUhSb1pTQktVMk55YVhCMElHQmJXMFJ2Ym5SRmJuVnRYVjFnSUdKMVp5NGdLaTljYm5aaGNpQnphR0ZrYjNkUWNtOXdjeUE5SUZ0Y2JpQWdKMk52Ym5OMGNuVmpkRzl5Snl3Z0oyaGhjMDkzYmxCeWIzQmxjblI1Snl3Z0oybHpVSEp2ZEc5MGVYQmxUMlluTENBbmNISnZjR1Z5ZEhsSmMwVnVkVzFsY21GaWJHVW5MRnh1SUNBbmRHOU1iMk5oYkdWVGRISnBibWNuTENBbmRHOVRkSEpwYm1jbkxDQW5kbUZzZFdWUFppZGNibDA3WEc1Y2JpOHFLaUJWYzJWa0lHWnZjaUJ1WVhScGRtVWdiV1YwYUc5a0lISmxabVZ5Wlc1alpYTXVJQ292WEc1MllYSWdaWEp5YjNKUWNtOTBieUE5SUVWeWNtOXlMbkJ5YjNSdmRIbHdaU3hjYmlBZ0lDQnZZbXBsWTNSUWNtOTBieUE5SUU5aWFtVmpkQzV3Y205MGIzUjVjR1VzWEc0Z0lDQWdjM1J5YVc1blVISnZkRzhnUFNCVGRISnBibWN1Y0hKdmRHOTBlWEJsTzF4dVhHNHZLaW9nVlhObFpDQjBieUJqYUdWamF5QnZZbXBsWTNSeklHWnZjaUJ2ZDI0Z2NISnZjR1Z5ZEdsbGN5NGdLaTljYm5aaGNpQm9ZWE5QZDI1UWNtOXdaWEowZVNBOUlHOWlhbVZqZEZCeWIzUnZMbWhoYzA5M2JsQnliM0JsY25SNU8xeHVYRzR2S2lwY2JpQXFJRlZ6WldRZ2RHOGdjbVZ6YjJ4MlpTQjBhR1VnVzJCMGIxTjBjbWx1WjFSaFoyQmRLR2gwZEhCek9pOHZjR1Z2Y0d4bExtMXZlbWxzYkdFdWIzSm5MMzVxYjNKbGJtUnZjbVptTDJWek5pMWtjbUZtZEM1b2RHMXNJM05sWXkxdlltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdmMzUnlhVzVuS1Z4dUlDb2diMllnZG1Gc2RXVnpMbHh1SUNvdlhHNTJZWElnYjJKcVZHOVRkSEpwYm1jZ1BTQnZZbXBsWTNSUWNtOTBieTUwYjFOMGNtbHVaenRjYmx4dUx5b3FJRlZ6WldRZ2RHOGdZWFp2YVdRZ2FYUmxjbUYwYVc1bklHOTJaWElnYm05dUxXVnVkVzFsY21GaWJHVWdjSEp2Y0dWeWRHbGxjeUJwYmlCSlJTQThJRGt1SUNvdlhHNTJZWElnYm05dVJXNTFiVkJ5YjNCeklEMGdlMzA3WEc1dWIyNUZiblZ0VUhKdmNITmJZWEp5WVhsVVlXZGRJRDBnYm05dVJXNTFiVkJ5YjNCelcyUmhkR1ZVWVdkZElEMGdibTl1Ulc1MWJWQnliM0J6VzI1MWJXSmxjbFJoWjEwZ1BTQjdJQ2RqYjI1emRISjFZM1J2Y2ljNklIUnlkV1VzSUNkMGIweHZZMkZzWlZOMGNtbHVaeWM2SUhSeWRXVXNJQ2QwYjFOMGNtbHVaeWM2SUhSeWRXVXNJQ2QyWVd4MVpVOW1Kem9nZEhKMVpTQjlPMXh1Ym05dVJXNTFiVkJ5YjNCelcySnZiMnhVWVdkZElEMGdibTl1Ulc1MWJWQnliM0J6VzNOMGNtbHVaMVJoWjEwZ1BTQjdJQ2RqYjI1emRISjFZM1J2Y2ljNklIUnlkV1VzSUNkMGIxTjBjbWx1WnljNklIUnlkV1VzSUNkMllXeDFaVTltSnpvZ2RISjFaU0I5TzF4dWJtOXVSVzUxYlZCeWIzQnpXMlZ5Y205eVZHRm5YU0E5SUc1dmJrVnVkVzFRY205d2MxdG1kVzVqVkdGblhTQTlJRzV2YmtWdWRXMVFjbTl3YzF0eVpXZGxlSEJVWVdkZElEMGdleUFuWTI5dWMzUnlkV04wYjNJbk9pQjBjblZsTENBbmRHOVRkSEpwYm1jbk9pQjBjblZsSUgwN1hHNXViMjVGYm5WdFVISnZjSE5iYjJKcVpXTjBWR0ZuWFNBOUlIc2dKMk52Ym5OMGNuVmpkRzl5SnpvZ2RISjFaU0I5TzF4dVhHNWhjbkpoZVVWaFkyZ29jMmhoWkc5M1VISnZjSE1zSUdaMWJtTjBhVzl1S0d0bGVTa2dlMXh1SUNCbWIzSWdLSFpoY2lCMFlXY2dhVzRnYm05dVJXNTFiVkJ5YjNCektTQjdYRzRnSUNBZ2FXWWdLR2hoYzA5M2JsQnliM0JsY25SNUxtTmhiR3dvYm05dVJXNTFiVkJ5YjNCekxDQjBZV2NwS1NCN1hHNGdJQ0FnSUNCMllYSWdjSEp2Y0hNZ1BTQnViMjVGYm5WdFVISnZjSE5iZEdGblhUdGNiaUFnSUNBZ0lIQnliM0J6VzJ0bGVWMGdQU0JvWVhOUGQyNVFjbTl3WlhKMGVTNWpZV3hzS0hCeWIzQnpMQ0JyWlhrcE8xeHVJQ0FnSUgxY2JpQWdmVnh1ZlNrN1hHNWNiaThxS2x4dUlDb2dRM0psWVhSbGN5QmhiaUJoY25KaGVTQnZaaUIwYUdVZ2IzZHVJR0Z1WkNCcGJtaGxjbWwwWldRZ1pXNTFiV1Z5WVdKc1pTQndjbTl3WlhKMGVTQnVZVzFsY3lCdlppQmdiMkpxWldOMFlDNWNiaUFxWEc0Z0tpQXFLazV2ZEdVNktpb2dUbTl1TFc5aWFtVmpkQ0IyWVd4MVpYTWdZWEpsSUdOdlpYSmpaV1FnZEc4Z2IySnFaV04wY3k1Y2JpQXFYRzRnS2lCQWMzUmhkR2xqWEc0Z0tpQkFiV1Z0WW1WeVQyWWdYMXh1SUNvZ1FHTmhkR1ZuYjNKNUlFOWlhbVZqZEZ4dUlDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOWlhbVZqZENCVWFHVWdiMkpxWldOMElIUnZJR2x1YzNCbFkzUXVYRzRnS2lCQWNtVjBkWEp1Y3lCN1FYSnlZWGw5SUZKbGRIVnlibk1nZEdobElHRnljbUY1SUc5bUlIQnliM0JsY25SNUlHNWhiV1Z6TGx4dUlDb2dRR1Y0WVcxd2JHVmNiaUFxWEc0Z0tpQm1kVzVqZEdsdmJpQkdiMjhvS1NCN1hHNGdLaUFnSUhSb2FYTXVZU0E5SURFN1hHNGdLaUFnSUhSb2FYTXVZaUE5SURJN1hHNGdLaUI5WEc0Z0tseHVJQ29nUm05dkxuQnliM1J2ZEhsd1pTNWpJRDBnTXp0Y2JpQXFYRzRnS2lCZkxtdGxlWE5KYmlodVpYY2dSbTl2S1R0Y2JpQXFJQzh2SUQwK0lGc25ZU2NzSUNkaUp5d2dKMk1uWFNBb2FYUmxjbUYwYVc5dUlHOXlaR1Z5SUdseklHNXZkQ0JuZFdGeVlXNTBaV1ZrS1Z4dUlDb3ZYRzVtZFc1amRHbHZiaUJyWlhselNXNG9iMkpxWldOMEtTQjdYRzRnSUdsbUlDaHZZbXBsWTNRZ1BUMGdiblZzYkNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJiWFR0Y2JpQWdmVnh1SUNCcFppQW9JV2x6VDJKcVpXTjBLRzlpYW1WamRDa3BJSHRjYmlBZ0lDQnZZbXBsWTNRZ1BTQlBZbXBsWTNRb2IySnFaV04wS1R0Y2JpQWdmVnh1SUNCMllYSWdiR1Z1WjNSb0lEMGdiMkpxWldOMExteGxibWQwYUR0Y2JseHVJQ0JzWlc1bmRHZ2dQU0FvYkdWdVozUm9JQ1ltSUdselRHVnVaM1JvS0d4bGJtZDBhQ2tnSmlaY2JpQWdJQ0FvYVhOQmNuSmhlU2h2WW1wbFkzUXBJSHg4SUNoemRYQndiM0owTG01dmJrVnVkVzFUZEhKcGJtZHpJQ1ltSUdselUzUnlhVzVuS0c5aWFtVmpkQ2twSUh4OFhHNGdJQ0FnSUNBb2MzVndjRzl5ZEM1dWIyNUZiblZ0UVhKbmN5QW1KaUJwYzBGeVozVnRaVzUwY3lodlltcGxZM1FwS1NrZ0ppWWdiR1Z1WjNSb0tTQjhmQ0F3TzF4dVhHNGdJSFpoY2lCRGRHOXlJRDBnYjJKcVpXTjBMbU52Ym5OMGNuVmpkRzl5TEZ4dUlDQWdJQ0FnYVc1a1pYZ2dQU0F0TVN4Y2JpQWdJQ0FnSUhCeWIzUnZJRDBnS0dselJuVnVZM1JwYjI0b1EzUnZjaWtnSmlZZ1EzUnZjaTV3Y205MGIzUjVjR1VwSUh4OElHOWlhbVZqZEZCeWIzUnZMRnh1SUNBZ0lDQWdhWE5RY205MGJ5QTlJSEJ5YjNSdklEMDlQU0J2WW1wbFkzUXNYRzRnSUNBZ0lDQnlaWE4xYkhRZ1BTQkJjbkpoZVNoc1pXNW5kR2dwTEZ4dUlDQWdJQ0FnYzJ0cGNFbHVaR1Y0WlhNZ1BTQnNaVzVuZEdnZ1BpQXdMRnh1SUNBZ0lDQWdjMnRwY0VWeWNtOXlVSEp2Y0hNZ1BTQnpkWEJ3YjNKMExtVnVkVzFGY25KdmNsQnliM0J6SUNZbUlDaHZZbXBsWTNRZ1BUMDlJR1Z5Y205eVVISnZkRzhnZkh3Z2IySnFaV04wSUdsdWMzUmhibU5sYjJZZ1JYSnliM0lwTEZ4dUlDQWdJQ0FnYzJ0cGNGQnliM1J2SUQwZ2MzVndjRzl5ZEM1bGJuVnRVSEp2ZEc5MGVYQmxjeUFtSmlCcGMwWjFibU4wYVc5dUtHOWlhbVZqZENrN1hHNWNiaUFnZDJocGJHVWdLQ3NyYVc1a1pYZ2dQQ0JzWlc1bmRHZ3BJSHRjYmlBZ0lDQnlaWE4xYkhSYmFXNWtaWGhkSUQwZ0tHbHVaR1Y0SUNzZ0p5Y3BPMXh1SUNCOVhHNGdJQzh2SUd4dlpHRnphQ0J6YTJsd2N5QjBhR1VnWUdOdmJuTjBjblZqZEc5eVlDQndjbTl3WlhKMGVTQjNhR1Z1SUdsMElHbHVabVZ5Y3lCcGRDQnBjeUJwZEdWeVlYUnBibWRjYmlBZ0x5OGdiM1psY2lCaElHQndjbTkwYjNSNWNHVmdJRzlpYW1WamRDQmlaV05oZFhObElFbEZJRHdnT1NCallXNG5kQ0J6WlhRZ2RHaGxJR0JiVzBWdWRXMWxjbUZpYkdWZFhXQmNiaUFnTHk4Z1lYUjBjbWxpZFhSbElHOW1JR0Z1SUdWNGFYTjBhVzVuSUhCeWIzQmxjblI1SUdGdVpDQjBhR1VnWUdOdmJuTjBjblZqZEc5eVlDQndjbTl3WlhKMGVTQnZaaUJoWEc0Z0lDOHZJSEJ5YjNSdmRIbHdaU0JrWldaaGRXeDBjeUIwYnlCdWIyNHRaVzUxYldWeVlXSnNaUzVjYmlBZ1ptOXlJQ2gyWVhJZ2EyVjVJR2x1SUc5aWFtVmpkQ2tnZTF4dUlDQWdJR2xtSUNnaEtITnJhWEJRY205MGJ5QW1KaUJyWlhrZ1BUMGdKM0J5YjNSdmRIbHdaU2NwSUNZbVhHNGdJQ0FnSUNBZ0lDRW9jMnRwY0VWeWNtOXlVSEp2Y0hNZ0ppWWdLR3RsZVNBOVBTQW5iV1Z6YzJGblpTY2dmSHdnYTJWNUlEMDlJQ2R1WVcxbEp5a3BJQ1ltWEc0Z0lDQWdJQ0FnSUNFb2MydHBjRWx1WkdWNFpYTWdKaVlnYVhOSmJtUmxlQ2hyWlhrc0lHeGxibWQwYUNrcElDWW1YRzRnSUNBZ0lDQWdJQ0VvYTJWNUlEMDlJQ2RqYjI1emRISjFZM1J2Y2ljZ0ppWWdLR2x6VUhKdmRHOGdmSHdnSVdoaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2IySnFaV04wTENCclpYa3BLU2twSUh0Y2JpQWdJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHdGxlU2s3WEc0Z0lDQWdmVnh1SUNCOVhHNGdJR2xtSUNoemRYQndiM0owTG01dmJrVnVkVzFUYUdGa2IzZHpJQ1ltSUc5aWFtVmpkQ0FoUFQwZ2IySnFaV04wVUhKdmRHOHBJSHRjYmlBZ0lDQjJZWElnZEdGbklEMGdiMkpxWldOMElEMDlQU0J6ZEhKcGJtZFFjbTkwYnlBL0lITjBjbWx1WjFSaFp5QTZJQ2h2WW1wbFkzUWdQVDA5SUdWeWNtOXlVSEp2ZEc4Z1B5Qmxjbkp2Y2xSaFp5QTZJRzlpYWxSdlUzUnlhVzVuTG1OaGJHd29iMkpxWldOMEtTa3NYRzRnSUNBZ0lDQWdJRzV2YmtWdWRXMXpJRDBnYm05dVJXNTFiVkJ5YjNCelczUmhaMTBnZkh3Z2JtOXVSVzUxYlZCeWIzQnpXMjlpYW1WamRGUmhaMTA3WEc1Y2JpQWdJQ0JwWmlBb2RHRm5JRDA5SUc5aWFtVmpkRlJoWnlrZ2UxeHVJQ0FnSUNBZ2NISnZkRzhnUFNCdlltcGxZM1JRY205MGJ6dGNiaUFnSUNCOVhHNGdJQ0FnYkdWdVozUm9JRDBnYzJoaFpHOTNVSEp2Y0hNdWJHVnVaM1JvTzF4dUlDQWdJSGRvYVd4bElDaHNaVzVuZEdndExTa2dlMXh1SUNBZ0lDQWdhMlY1SUQwZ2MyaGhaRzkzVUhKdmNITmJiR1Z1WjNSb1hUdGNiaUFnSUNBZ0lIWmhjaUJ1YjI1RmJuVnRJRDBnYm05dVJXNTFiWE5iYTJWNVhUdGNiaUFnSUNBZ0lHbG1JQ2doS0dselVISnZkRzhnSmlZZ2JtOXVSVzUxYlNrZ0ppWmNiaUFnSUNBZ0lDQWdJQ0FvYm05dVJXNTFiU0EvSUdoaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2IySnFaV04wTENCclpYa3BJRG9nYjJKcVpXTjBXMnRsZVYwZ0lUMDlJSEJ5YjNSdlcydGxlVjBwS1NCN1hHNGdJQ0FnSUNBZ0lISmxjM1ZzZEM1d2RYTm9LR3RsZVNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzRnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2EyVjVjMGx1TzF4dUlpd2lkbUZ5SUdKaGMyVlViMU4wY21sdVp5QTlJSEpsY1hWcGNtVW9KeTR1TDJsdWRHVnlibUZzTDJKaGMyVlViMU4wY21sdVp5Y3BPMXh1WEc0dktpcGNiaUFxSUZWelpXUWdkRzhnYldGMFkyZ2dZRkpsWjBWNGNHQWdXM053WldOcFlXd2dZMmhoY21GamRHVnljMTBvYUhSMGNEb3ZMM2QzZHk1eVpXZDFiR0Z5TFdWNGNISmxjM05wYjI1ekxtbHVabTh2WTJoaGNtRmpkR1Z5Y3k1b2RHMXNJM053WldOcFlXd3BMbHh1SUNvZ1NXNGdZV1JrYVhScGIyNGdkRzhnYzNCbFkybGhiQ0JqYUdGeVlXTjBaWEp6SUhSb1pTQm1iM0ozWVhKa0lITnNZWE5vSUdseklHVnpZMkZ3WldRZ2RHOGdZV3hzYjNjZ1ptOXlYRzRnS2lCbFlYTnBaWElnWUdWMllXeGdJSFZ6WlNCaGJtUWdZRVoxYm1OMGFXOXVZQ0JqYjIxd2FXeGhkR2x2Ymk1Y2JpQXFMMXh1ZG1GeUlISmxVbVZuUlhod1EyaGhjbk1nUFNBdld5NHFLejllSkh0OUtDbDhXMXhjWFZ4Y0wxeGNYRnhkTDJjc1hHNGdJQ0FnY21WSVlYTlNaV2RGZUhCRGFHRnljeUE5SUZKbFowVjRjQ2h5WlZKbFowVjRjRU5vWVhKekxuTnZkWEpqWlNrN1hHNWNiaThxS2x4dUlDb2dSWE5qWVhCbGN5QjBhR1VnWUZKbFowVjRjR0FnYzNCbFkybGhiQ0JqYUdGeVlXTjBaWEp6SUZ3aVhGeGNJaXdnWENJdlhDSXNJRndpWGx3aUxDQmNJaVJjSWl3Z1hDSXVYQ0lzSUZ3aWZGd2lMQ0JjSWo5Y0lpeGNiaUFxSUZ3aUtsd2lMQ0JjSWl0Y0lpd2dYQ0lvWENJc0lGd2lLVndpTENCY0lsdGNJaXdnWENKZFhDSXNJRndpZTF3aUlHRnVaQ0JjSW4xY0lpQnBiaUJnYzNSeWFXNW5ZQzVjYmlBcVhHNGdLaUJBYzNSaGRHbGpYRzRnS2lCQWJXVnRZbVZ5VDJZZ1gxeHVJQ29nUUdOaGRHVm5iM0o1SUZOMGNtbHVaMXh1SUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUZ0emRISnBibWM5SnlkZElGUm9aU0J6ZEhKcGJtY2dkRzhnWlhOallYQmxMbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UzTjBjbWx1WjMwZ1VtVjBkWEp1Y3lCMGFHVWdaWE5qWVhCbFpDQnpkSEpwYm1jdVhHNGdLaUJBWlhoaGJYQnNaVnh1SUNwY2JpQXFJRjh1WlhOallYQmxVbVZuUlhod0tDZGJiRzlrWVhOb1hTaG9kSFJ3Y3pvdkwyeHZaR0Z6YUM1amIyMHZLU2NwTzF4dUlDb2dMeThnUFQ0Z0oxeGNXMnh2WkdGemFGeGNYVnhjS0doMGRIQnpPbHhjTDF4Y0wyeHZaR0Z6YUZ4Y0xtTnZiVnhjTDF4Y0tTZGNiaUFxTDF4dVpuVnVZM1JwYjI0Z1pYTmpZWEJsVW1WblJYaHdLSE4wY21sdVp5a2dlMXh1SUNCemRISnBibWNnUFNCaVlYTmxWRzlUZEhKcGJtY29jM1J5YVc1bktUdGNiaUFnY21WMGRYSnVJQ2h6ZEhKcGJtY2dKaVlnY21WSVlYTlNaV2RGZUhCRGFHRnljeTUwWlhOMEtITjBjbWx1WnlrcFhHNGdJQ0FnUHlCemRISnBibWN1Y21Wd2JHRmpaU2h5WlZKbFowVjRjRU5vWVhKekxDQW5YRnhjWENRbUp5bGNiaUFnSUNBNklITjBjbWx1Wnp0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JsYzJOaGNHVlNaV2RGZUhBN1hHNGlMQ0l2S2lvZ1lFOWlhbVZqZENOMGIxTjBjbWx1WjJBZ2NtVnpkV3gwSUhKbFptVnlaVzVqWlhNdUlDb3ZYRzUyWVhJZ1lYSm5jMVJoWnlBOUlDZGJiMkpxWldOMElFRnlaM1Z0Wlc1MGMxMG5MRnh1SUNBZ0lHOWlhbVZqZEZSaFp5QTlJQ2RiYjJKcVpXTjBJRTlpYW1WamRGMG5PMXh1WEc0dktpb2dWWE5sWkNCbWIzSWdibUYwYVhabElHMWxkR2h2WkNCeVpXWmxjbVZ1WTJWekxpQXFMMXh1ZG1GeUlHRnljbUY1VUhKdmRHOGdQU0JCY25KaGVTNXdjbTkwYjNSNWNHVXNYRzRnSUNBZ1pYSnliM0pRY205MGJ5QTlJRVZ5Y205eUxuQnliM1J2ZEhsd1pTeGNiaUFnSUNCdlltcGxZM1JRY205MGJ5QTlJRTlpYW1WamRDNXdjbTkwYjNSNWNHVTdYRzVjYmk4cUtpQlZjMlZrSUhSdklHUmxkR1ZqZENCRVQwMGdjM1Z3Y0c5eWRDNGdLaTljYm5aaGNpQmtiMk4xYldWdWRDQTlJQ2hrYjJOMWJXVnVkQ0E5SUdkc2IySmhiQzUzYVc1a2IzY3BJQ1ltSUdSdlkzVnRaVzUwTG1SdlkzVnRaVzUwTzF4dVhHNHZLaXBjYmlBcUlGVnpaV1FnZEc4Z2NtVnpiMngyWlNCMGFHVWdXMkIwYjFOMGNtbHVaMVJoWjJCZEtHaDBkSEJ6T2k4dmNHVnZjR3hsTG0xdmVtbHNiR0V1YjNKbkwzNXFiM0psYm1SdmNtWm1MMlZ6Tmkxa2NtRm1kQzVvZEcxc0kzTmxZeTF2WW1wbFkzUXVjSEp2ZEc5MGVYQmxMblJ2YzNSeWFXNW5LVnh1SUNvZ2IyWWdkbUZzZFdWekxseHVJQ292WEc1MllYSWdiMkpxVkc5VGRISnBibWNnUFNCdlltcGxZM1JRY205MGJ5NTBiMU4wY21sdVp6dGNibHh1THlvcUlFNWhkR2wyWlNCdFpYUm9iMlFnY21WbVpYSmxibU5sY3k0Z0tpOWNiblpoY2lCd2NtOXdaWEowZVVselJXNTFiV1Z5WVdKc1pTQTlJRzlpYW1WamRGQnliM1J2TG5CeWIzQmxjblI1U1hORmJuVnRaWEpoWW14bExGeHVJQ0FnSUhOd2JHbGpaU0E5SUdGeWNtRjVVSEp2ZEc4dWMzQnNhV05sTzF4dVhHNHZLaXBjYmlBcUlFRnVJRzlpYW1WamRDQmxiblpwY205dWJXVnVkQ0JtWldGMGRYSmxJR1pzWVdkekxseHVJQ3BjYmlBcUlFQnpkR0YwYVdOY2JpQXFJRUJ0WlcxaVpYSlBaaUJmWEc0Z0tpQkFkSGx3WlNCUFltcGxZM1JjYmlBcUwxeHVkbUZ5SUhOMWNIQnZjblFnUFNCN2ZUdGNibHh1S0daMWJtTjBhVzl1S0hncElIdGNiaUFnZG1GeUlFTjBiM0lnUFNCbWRXNWpkR2x2YmlncElIc2dkR2hwY3k1NElEMGdNVHNnZlN4Y2JpQWdJQ0FnSUc5aWFtVmpkQ0E5SUhzZ0p6QW5PaUF4TENBbmJHVnVaM1JvSnpvZ01TQjlMRnh1SUNBZ0lDQWdjSEp2Y0hNZ1BTQmJYVHRjYmx4dUlDQkRkRzl5TG5CeWIzUnZkSGx3WlNBOUlIc2dKM1poYkhWbFQyWW5PaUF4TENBbmVTYzZJREVnZlR0Y2JpQWdabTl5SUNoMllYSWdhMlY1SUdsdUlHNWxkeUJEZEc5eUtTQjdJSEJ5YjNCekxuQjFjMmdvYTJWNUtUc2dmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkVaWFJsWTNRZ2FXWWdkR2hsSUdCMGIxTjBjbWx1WjFSaFoyQWdiMllnWUdGeVozVnRaVzUwYzJBZ2IySnFaV04wY3lCcGN5QnlaWE52YkhaaFlteGxYRzRnSUNBcUlDaGhiR3dnWW5WMElFWnBjbVZtYjNnZ1BDQTBMQ0JKUlNBOElEa3BMbHh1SUNBZ0tseHVJQ0FnS2lCQWJXVnRZbVZ5VDJZZ1h5NXpkWEJ3YjNKMFhHNGdJQ0FxSUVCMGVYQmxJR0p2YjJ4bFlXNWNiaUFnSUNvdlhHNGdJSE4xY0hCdmNuUXVZWEpuYzFSaFp5QTlJRzlpYWxSdlUzUnlhVzVuTG1OaGJHd29ZWEpuZFcxbGJuUnpLU0E5UFNCaGNtZHpWR0ZuTzF4dVhHNGdJQzhxS2x4dUlDQWdLaUJFWlhSbFkzUWdhV1lnWUc1aGJXVmdJRzl5SUdCdFpYTnpZV2RsWUNCd2NtOXdaWEowYVdWeklHOW1JR0JGY25KdmNpNXdjbTkwYjNSNWNHVmdJR0Z5WlZ4dUlDQWdLaUJsYm5WdFpYSmhZbXhsSUdKNUlHUmxabUYxYkhRZ0tFbEZJRHdnT1N3Z1UyRm1ZWEpwSUR3Z05TNHhLUzVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxiV0psY2s5bUlGOHVjM1Z3Y0c5eWRGeHVJQ0FnS2lCQWRIbHdaU0JpYjI5c1pXRnVYRzRnSUNBcUwxeHVJQ0J6ZFhCd2IzSjBMbVZ1ZFcxRmNuSnZjbEJ5YjNCeklEMGdjSEp2Y0dWeWRIbEpjMFZ1ZFcxbGNtRmliR1V1WTJGc2JDaGxjbkp2Y2xCeWIzUnZMQ0FuYldWemMyRm5aU2NwSUh4OFhHNGdJQ0FnY0hKdmNHVnlkSGxKYzBWdWRXMWxjbUZpYkdVdVkyRnNiQ2hsY25KdmNsQnliM1J2TENBbmJtRnRaU2NwTzF4dVhHNGdJQzhxS2x4dUlDQWdLaUJFWlhSbFkzUWdhV1lnWUhCeWIzUnZkSGx3WldBZ2NISnZjR1Z5ZEdsbGN5QmhjbVVnWlc1MWJXVnlZV0pzWlNCaWVTQmtaV1poZFd4MExseHVJQ0FnS2x4dUlDQWdLaUJHYVhKbFptOTRJRHdnTXk0MkxDQlBjR1Z5WVNBK0lEa3VOVEFnTFNCUGNHVnlZU0E4SURFeExqWXdMQ0JoYm1RZ1UyRm1ZWEpwSUR3Z05TNHhYRzRnSUNBcUlDaHBaaUIwYUdVZ2NISnZkRzkwZVhCbElHOXlJR0VnY0hKdmNHVnlkSGtnYjI0Z2RHaGxJSEJ5YjNSdmRIbHdaU0JvWVhNZ1ltVmxiaUJ6WlhRcFhHNGdJQ0FxSUdsdVkyOXljbVZqZEd4NUlITmxkQ0IwYUdVZ1lGdGJSVzUxYldWeVlXSnNaVjFkWUNCMllXeDFaU0J2WmlCaElHWjFibU4wYVc5dUozTWdZSEJ5YjNSdmRIbHdaV0JjYmlBZ0lDb2djSEp2Y0dWeWRIa2dkRzhnWUhSeWRXVmdMbHh1SUNBZ0tseHVJQ0FnS2lCQWJXVnRZbVZ5VDJZZ1h5NXpkWEJ3YjNKMFhHNGdJQ0FxSUVCMGVYQmxJR0p2YjJ4bFlXNWNiaUFnSUNvdlhHNGdJSE4xY0hCdmNuUXVaVzUxYlZCeWIzUnZkSGx3WlhNZ1BTQndjbTl3WlhKMGVVbHpSVzUxYldWeVlXSnNaUzVqWVd4c0tFTjBiM0lzSUNkd2NtOTBiM1I1Y0dVbktUdGNibHh1SUNBdktpcGNiaUFnSUNvZ1JHVjBaV04wSUdsbUlHWjFibU4wYVc5dWN5QmpZVzRnWW1VZ1pHVmpiMjF3YVd4bFpDQmllU0JnUm5WdVkzUnBiMjRqZEc5VGRISnBibWRnWEc0Z0lDQXFJQ2hoYkd3Z1luVjBJRVpwY21WbWIzZ2dUMU1nWTJWeWRHbG1hV1ZrSUdGd2NITXNJRzlzWkdWeUlFOXdaWEpoSUcxdlltbHNaU0JpY205M2MyVnljeXdnWVc1a1hHNGdJQ0FxSUhSb1pTQlFiR0Y1VTNSaGRHbHZiaUF6T3lCbWIzSmpaV1FnWUdaaGJITmxZQ0JtYjNJZ1YybHVaRzkzY3lBNElHRndjSE1wTGx4dUlDQWdLbHh1SUNBZ0tpQkFiV1Z0WW1WeVQyWWdYeTV6ZFhCd2IzSjBYRzRnSUNBcUlFQjBlWEJsSUdKdmIyeGxZVzVjYmlBZ0lDb3ZYRzRnSUhOMWNIQnZjblF1Wm5WdVkwUmxZMjl0Y0NBOUlDOWNYR0owYUdselhGeGlMeTUwWlhOMEtHWjFibU4wYVc5dUtDa2dleUJ5WlhSMWNtNGdkR2hwY3pzZ2ZTazdYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFUmxkR1ZqZENCcFppQmdSblZ1WTNScGIyNGpibUZ0WldBZ2FYTWdjM1Z3Y0c5eWRHVmtJQ2hoYkd3Z1luVjBJRWxGS1M1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsYldKbGNrOW1JRjh1YzNWd2NHOXlkRnh1SUNBZ0tpQkFkSGx3WlNCaWIyOXNaV0Z1WEc0Z0lDQXFMMXh1SUNCemRYQndiM0owTG1aMWJtTk9ZVzFsY3lBOUlIUjVjR1Z2WmlCR2RXNWpkR2x2Ymk1dVlXMWxJRDA5SUNkemRISnBibWNuTzF4dVhHNGdJQzhxS2x4dUlDQWdLaUJFWlhSbFkzUWdhV1lnZEdobElHQjBiMU4wY21sdVoxUmhaMkFnYjJZZ1JFOU5JRzV2WkdWeklHbHpJSEpsYzI5c2RtRmliR1VnS0dGc2JDQmlkWFFnU1VVZ1BDQTVLUzVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxiV0psY2s5bUlGOHVjM1Z3Y0c5eWRGeHVJQ0FnS2lCQWRIbHdaU0JpYjI5c1pXRnVYRzRnSUNBcUwxeHVJQ0J6ZFhCd2IzSjBMbTV2WkdWVVlXY2dQU0J2WW1wVWIxTjBjbWx1Wnk1allXeHNLR1J2WTNWdFpXNTBLU0FoUFNCdlltcGxZM1JVWVdjN1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUVSbGRHVmpkQ0JwWmlCemRISnBibWNnYVc1a1pYaGxjeUJoY21VZ2JtOXVMV1Z1ZFcxbGNtRmliR1ZjYmlBZ0lDb2dLRWxGSUR3Z09Td2dVbWx1WjI5S1V5d2dVbWhwYm04c0lFNWhjbmRvWVd3cExseHVJQ0FnS2x4dUlDQWdLaUJBYldWdFltVnlUMllnWHk1emRYQndiM0owWEc0Z0lDQXFJRUIwZVhCbElHSnZiMnhsWVc1Y2JpQWdJQ292WEc0Z0lITjFjSEJ2Y25RdWJtOXVSVzUxYlZOMGNtbHVaM01nUFNBaGNISnZjR1Z5ZEhsSmMwVnVkVzFsY21GaWJHVXVZMkZzYkNnbmVDY3NJREFwTzF4dVhHNGdJQzhxS2x4dUlDQWdLaUJFWlhSbFkzUWdhV1lnY0hKdmNHVnlkR2xsY3lCemFHRmtiM2RwYm1jZ2RHaHZjMlVnYjI0Z1lFOWlhbVZqZEM1d2NtOTBiM1I1Y0dWZ0lHRnlaVnh1SUNBZ0tpQnViMjR0Wlc1MWJXVnlZV0pzWlM1Y2JpQWdJQ3BjYmlBZ0lDb2dTVzRnU1VVZ1BDQTVJR0Z1SUc5aWFtVmpkQ2R6SUc5M2JpQndjbTl3WlhKMGFXVnpMQ0J6YUdGa2IzZHBibWNnYm05dUxXVnVkVzFsY21GaWJHVWdiMjVsY3l4Y2JpQWdJQ29nWVhKbElHMWhaR1VnYm05dUxXVnVkVzFsY21GaWJHVWdZWE1nZDJWc2JDQW9ZUzVyTG1FZ2RHaGxJRXBUWTNKcGNIUWdZRnRiUkc5dWRFVnVkVzFkWFdBZ1luVm5LUzVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxiV0psY2s5bUlGOHVjM1Z3Y0c5eWRGeHVJQ0FnS2lCQWRIbHdaU0JpYjI5c1pXRnVYRzRnSUNBcUwxeHVJQ0J6ZFhCd2IzSjBMbTV2YmtWdWRXMVRhR0ZrYjNkeklEMGdJUzkyWVd4MVpVOW1MeTUwWlhOMEtIQnliM0J6S1R0Y2JseHVJQ0F2S2lwY2JpQWdJQ29nUkdWMFpXTjBJR2xtSUc5M2JpQndjbTl3WlhKMGFXVnpJR0Z5WlNCcGRHVnlZWFJsWkNCaFpuUmxjaUJwYm1obGNtbDBaV1FnY0hKdmNHVnlkR2xsY3lBb1NVVWdQQ0E1S1M1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsYldKbGNrOW1JRjh1YzNWd2NHOXlkRnh1SUNBZ0tpQkFkSGx3WlNCaWIyOXNaV0Z1WEc0Z0lDQXFMMXh1SUNCemRYQndiM0owTG05M2JreGhjM1FnUFNCd2NtOXdjMXN3WFNBaFBTQW5lQ2M3WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRVJsZEdWamRDQnBaaUJnUVhKeVlYa2pjMmhwWm5SZ0lHRnVaQ0JnUVhKeVlYa2pjM0JzYVdObFlDQmhkV2R0Wlc1MElHRnljbUY1TFd4cGEyVWdiMkpxWldOMGMxeHVJQ0FnS2lCamIzSnlaV04wYkhrdVhHNGdJQ0FxWEc0Z0lDQXFJRVpwY21WbWIzZ2dQQ0F4TUN3Z1kyOXRjR0YwYVdKcGJHbDBlU0J0YjJSbGN5QnZaaUJKUlNBNExDQmhibVFnU1VVZ1BDQTVJR2hoZG1VZ1luVm5aM2tnUVhKeVlYa2dZSE5vYVdaMEtDbGdYRzRnSUNBcUlHRnVaQ0JnYzNCc2FXTmxLQ2xnSUdaMWJtTjBhVzl1Y3lCMGFHRjBJR1poYVd3Z2RHOGdjbVZ0YjNabElIUm9aU0JzWVhOMElHVnNaVzFsYm5Rc0lHQjJZV3gxWlZzd1hXQXNYRzRnSUNBcUlHOW1JR0Z5Y21GNUxXeHBhMlVnYjJKcVpXTjBjeUJsZG1WdUlIUm9iM1ZuYUNCMGFHVWdZR3hsYm1kMGFHQWdjSEp2Y0dWeWRIa2dhWE1nYzJWMElIUnZJR0F3WUM1Y2JpQWdJQ29nVkdobElHQnphR2xtZENncFlDQnRaWFJvYjJRZ2FYTWdZblZuWjNrZ2FXNGdZMjl0Y0dGMGFXSnBiR2wwZVNCdGIyUmxjeUJ2WmlCSlJTQTRMQ0IzYUdsc1pTQmdjM0JzYVdObEtDbGdYRzRnSUNBcUlHbHpJR0oxWjJkNUlISmxaMkZ5Wkd4bGMzTWdiMllnYlc5a1pTQnBiaUJKUlNBOElEa3VYRzRnSUNBcVhHNGdJQ0FxSUVCdFpXMWlaWEpQWmlCZkxuTjFjSEJ2Y25SY2JpQWdJQ29nUUhSNWNHVWdZbTl2YkdWaGJseHVJQ0FnS2k5Y2JpQWdjM1Z3Y0c5eWRDNXpjR3hwWTJWUFltcGxZM1J6SUQwZ0tITndiR2xqWlM1allXeHNLRzlpYW1WamRDd2dNQ3dnTVNrc0lDRnZZbXBsWTNSYk1GMHBPMXh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkVaWFJsWTNRZ2JHRmpheUJ2WmlCemRYQndiM0owSUdadmNpQmhZMk5sYzNOcGJtY2djM1J5YVc1bklHTm9ZWEpoWTNSbGNuTWdZbmtnYVc1a1pYZ3VYRzRnSUNBcVhHNGdJQ0FxSUVsRklEd2dPQ0JqWVc0bmRDQmhZMk5sYzNNZ1kyaGhjbUZqZEdWeWN5QmllU0JwYm1SbGVDNGdTVVVnT0NCallXNGdiMjVzZVNCaFkyTmxjM01nWTJoaGNtRmpkR1Z5YzF4dUlDQWdLaUJpZVNCcGJtUmxlQ0J2YmlCemRISnBibWNnYkdsMFpYSmhiSE1zSUc1dmRDQnpkSEpwYm1jZ2IySnFaV04wY3k1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsYldKbGNrOW1JRjh1YzNWd2NHOXlkRnh1SUNBZ0tpQkFkSGx3WlNCaWIyOXNaV0Z1WEc0Z0lDQXFMMXh1SUNCemRYQndiM0owTG5WdWFXNWtaWGhsWkVOb1lYSnpJRDBnS0NkNEoxc3dYU0FySUU5aWFtVmpkQ2duZUNjcFd6QmRLU0FoUFNBbmVIZ25PMXh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkVaWFJsWTNRZ2FXWWdkR2hsSUVSUFRTQnBjeUJ6ZFhCd2IzSjBaV1F1WEc0Z0lDQXFYRzRnSUNBcUlFQnRaVzFpWlhKUFppQmZMbk4xY0hCdmNuUmNiaUFnSUNvZ1FIUjVjR1VnWW05dmJHVmhibHh1SUNBZ0tpOWNiaUFnZEhKNUlIdGNiaUFnSUNCemRYQndiM0owTG1SdmJTQTlJR1J2WTNWdFpXNTBMbU55WldGMFpVUnZZM1Z0Wlc1MFJuSmhaMjFsYm5Rb0tTNXViMlJsVkhsd1pTQTlQVDBnTVRFN1hHNGdJSDBnWTJGMFkyZ29aU2tnZTF4dUlDQWdJSE4xY0hCdmNuUXVaRzl0SUQwZ1ptRnNjMlU3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1JHVjBaV04wSUdsbUlHQmhjbWQxYldWdWRITmdJRzlpYW1WamRDQnBibVJsZUdWeklHRnlaU0J1YjI0dFpXNTFiV1Z5WVdKc1pTNWNiaUFnSUNwY2JpQWdJQ29nU1c0Z1JtbHlaV1p2ZUNBOElEUXNJRWxGSUR3Z09Td2dVR2hoYm5SdmJVcFRMQ0JoYm1RZ1UyRm1ZWEpwSUR3Z05TNHhJR0JoY21kMWJXVnVkSE5nSUc5aWFtVmpkRnh1SUNBZ0tpQnBibVJsZUdWeklHRnlaU0J1YjI0dFpXNTFiV1Z5WVdKc1pTNGdRMmh5YjIxbElEd2dNalVnWVc1a0lFNXZaR1V1YW5NZ1BDQXdMakV4TGpBZ2RISmxZWFJjYmlBZ0lDb2dZR0Z5WjNWdFpXNTBjMkFnYjJKcVpXTjBJR2x1WkdWNFpYTWdZWE1nYm05dUxXVnVkVzFsY21GaWJHVWdZVzVrSUdaaGFXd2dZR2hoYzA5M2JsQnliM0JsY25SNVlGeHVJQ0FnS2lCamFHVmphM01nWm05eUlHbHVaR1Y0WlhNZ2RHaGhkQ0JsZUdObFpXUWdkR2hsYVhJZ1puVnVZM1JwYjI0bmN5Qm1iM0p0WVd3Z2NHRnlZVzFsZEdWeWN5QjNhWFJvWEc0Z0lDQXFJR0Z6YzI5amFXRjBaV1FnZG1Gc2RXVnpJRzltSUdBd1lDNWNiaUFnSUNwY2JpQWdJQ29nUUcxbGJXSmxjazltSUY4dWMzVndjRzl5ZEZ4dUlDQWdLaUJBZEhsd1pTQmliMjlzWldGdVhHNGdJQ0FxTDF4dUlDQjBjbmtnZTF4dUlDQWdJSE4xY0hCdmNuUXVibTl1Ulc1MWJVRnlaM01nUFNBaGNISnZjR1Z5ZEhsSmMwVnVkVzFsY21GaWJHVXVZMkZzYkNoaGNtZDFiV1Z1ZEhNc0lERXBPMXh1SUNCOUlHTmhkR05vS0dVcElIdGNiaUFnSUNCemRYQndiM0owTG01dmJrVnVkVzFCY21keklEMGdkSEoxWlR0Y2JpQWdmVnh1ZlNnd0xDQXdLU2s3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2MzVndjRzl5ZER0Y2JpSXNJaThxS2x4dUlDb2dRM0psWVhSbGN5QmhJR1oxYm1OMGFXOXVJSFJvWVhRZ2NtVjBkWEp1Y3lCZ2RtRnNkV1ZnTGx4dUlDcGNiaUFxSUVCemRHRjBhV05jYmlBcUlFQnRaVzFpWlhKUFppQmZYRzRnS2lCQVkyRjBaV2R2Y25rZ1ZYUnBiR2wwZVZ4dUlDb2dRSEJoY21GdElIc3FmU0IyWVd4MVpTQlVhR1VnZG1Gc2RXVWdkRzhnY21WMGRYSnVJR1p5YjIwZ2RHaGxJRzVsZHlCbWRXNWpkR2x2Ymk1Y2JpQXFJRUJ5WlhSMWNtNXpJSHRHZFc1amRHbHZibjBnVW1WMGRYSnVjeUIwYUdVZ2JtVjNJR1oxYm1OMGFXOXVMbHh1SUNvZ1FHVjRZVzF3YkdWY2JpQXFYRzRnS2lCMllYSWdiMkpxWldOMElEMGdleUFuZFhObGNpYzZJQ2RtY21Wa0p5QjlPMXh1SUNvZ2RtRnlJR2RsZEhSbGNpQTlJRjh1WTI5dWMzUmhiblFvYjJKcVpXTjBLVHRjYmlBcVhHNGdLaUJuWlhSMFpYSW9LU0E5UFQwZ2IySnFaV04wTzF4dUlDb2dMeThnUFQ0Z2RISjFaVnh1SUNvdlhHNW1kVzVqZEdsdmJpQmpiMjV6ZEdGdWRDaDJZV3gxWlNrZ2UxeHVJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlIWmhiSFZsTzF4dUlDQjlPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHTnZibk4wWVc1ME8xeHVJaXdpTHlvcVhHNGdLaUJVYUdseklHMWxkR2h2WkNCeVpYUjFjbTV6SUhSb1pTQm1hWEp6ZENCaGNtZDFiV1Z1ZENCd2NtOTJhV1JsWkNCMGJ5QnBkQzVjYmlBcVhHNGdLaUJBYzNSaGRHbGpYRzRnS2lCQWJXVnRZbVZ5VDJZZ1gxeHVJQ29nUUdOaGRHVm5iM0o1SUZWMGFXeHBkSGxjYmlBcUlFQndZWEpoYlNCN0tuMGdkbUZzZFdVZ1FXNTVJSFpoYkhWbExseHVJQ29nUUhKbGRIVnlibk1nZXlwOUlGSmxkSFZ5Ym5NZ1lIWmhiSFZsWUM1Y2JpQXFJRUJsZUdGdGNHeGxYRzRnS2x4dUlDb2dkbUZ5SUc5aWFtVmpkQ0E5SUhzZ0ozVnpaWEluT2lBblpuSmxaQ2NnZlR0Y2JpQXFYRzRnS2lCZkxtbGtaVzUwYVhSNUtHOWlhbVZqZENrZ1BUMDlJRzlpYW1WamREdGNiaUFxSUM4dklEMCtJSFJ5ZFdWY2JpQXFMMXh1Wm5WdVkzUnBiMjRnYVdSbGJuUnBkSGtvZG1Gc2RXVXBJSHRjYmlBZ2NtVjBkWEp1SUhaaGJIVmxPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlHbGtaVzUwYVhSNU8xeHVJaXdpTHlvcVhHNGdLaUJCSUc1dkxXOXdaWEpoZEdsdmJpQm1kVzVqZEdsdmJpQjNhR2xqYUNCeVpYUjFjbTV6SUdCMWJtUmxabWx1WldSZ0lISmxaMkZ5Wkd4bGMzTWdiMllnZEdobFhHNGdLaUJoY21kMWJXVnVkSE1nYVhRZ2NtVmpaV2wyWlhNdVhHNGdLbHh1SUNvZ1FITjBZWFJwWTF4dUlDb2dRRzFsYldKbGNrOW1JRjljYmlBcUlFQmpZWFJsWjI5eWVTQlZkR2xzYVhSNVhHNGdLaUJBWlhoaGJYQnNaVnh1SUNwY2JpQXFJSFpoY2lCdlltcGxZM1FnUFNCN0lDZDFjMlZ5SnpvZ0oyWnlaV1FuSUgwN1hHNGdLbHh1SUNvZ1h5NXViMjl3S0c5aWFtVmpkQ2tnUFQwOUlIVnVaR1ZtYVc1bFpEdGNiaUFxSUM4dklEMCtJSFJ5ZFdWY2JpQXFMMXh1Wm5WdVkzUnBiMjRnYm05dmNDZ3BJSHRjYmlBZ0x5OGdUbThnYjNCbGNtRjBhVzl1SUhCbGNtWnZjbTFsWkM1Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0J1YjI5d08xeHVJaXdpTHlvcVhHNGdLaUJOYjJSMWJHVWdaR1Z3Wlc1a1pXNWphV1Z6TGx4dUlDb3ZYRzVjYm5aaGNpQkZiV2wwZEdWeUlEMGdjbVZ4ZFdseVpTZ25aVzFwZEhSbGNpY3BPMXh1ZG1GeUlISmxaSFZqWlNBOUlISmxjWFZwY21Vb0ozSmxaSFZqWlNjcE8xeHVYRzR2S2lwY2JpQXFJRkp2YjNRZ2NtVm1aWEpsYm1ObElHWnZjaUJwWm5KaGJXVnpMbHh1SUNvdlhHNWNiblpoY2lCeWIyOTBJRDBnSjNWdVpHVm1hVzVsWkNjZ1BUMGdkSGx3Wlc5bUlIZHBibVJ2ZDF4dUlDQS9JSFJvYVhOY2JpQWdPaUIzYVc1a2IzYzdYRzVjYmk4cUtseHVJQ29nVG05dmNDNWNiaUFxTDF4dVhHNW1kVzVqZEdsdmJpQnViMjl3S0NsN2ZUdGNibHh1THlvcVhHNGdLaUJEYUdWamF5QnBaaUJnYjJKcVlDQnBjeUJoSUdodmMzUWdiMkpxWldOMExGeHVJQ29nZDJVZ1pHOXVKM1FnZDJGdWRDQjBieUJ6WlhKcFlXeHBlbVVnZEdobGMyVWdPaWxjYmlBcVhHNGdLaUJVVDBSUE9pQm1kWFIxY21VZ2NISnZiMllzSUcxdmRtVWdkRzhnWTI5dGNHOWxiblFnYkdGdVpGeHVJQ3BjYmlBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCdlltcGNiaUFxSUVCeVpYUjFjbTRnZTBKdmIyeGxZVzU5WEc0Z0tpQkFZWEJwSUhCeWFYWmhkR1ZjYmlBcUwxeHVYRzVtZFc1amRHbHZiaUJwYzBodmMzUW9iMkpxS1NCN1hHNGdJSFpoY2lCemRISWdQU0I3ZlM1MGIxTjBjbWx1Wnk1allXeHNLRzlpYWlrN1hHNWNiaUFnYzNkcGRHTm9JQ2h6ZEhJcElIdGNiaUFnSUNCallYTmxJQ2RiYjJKcVpXTjBJRVpwYkdWZEp6cGNiaUFnSUNCallYTmxJQ2RiYjJKcVpXTjBJRUpzYjJKZEp6cGNiaUFnSUNCallYTmxJQ2RiYjJKcVpXTjBJRVp2Y20xRVlYUmhYU2M2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdJQ0JrWldaaGRXeDBPbHh1SUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQjlYRzU5WEc1Y2JpOHFLbHh1SUNvZ1JHVjBaWEp0YVc1bElGaElVaTVjYmlBcUwxeHVYRzVtZFc1amRHbHZiaUJuWlhSWVNGSW9LU0I3WEc0Z0lHbG1JQ2h5YjI5MExsaE5URWgwZEhCU1pYRjFaWE4wWEc0Z0lDQWdKaVlnS0NkbWFXeGxPaWNnSVQwZ2NtOXZkQzVzYjJOaGRHbHZiaTV3Y205MGIyTnZiQ0I4ZkNBaGNtOXZkQzVCWTNScGRtVllUMkpxWldOMEtTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCdVpYY2dXRTFNU0hSMGNGSmxjWFZsYzNRN1hHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RISjVJSHNnY21WMGRYSnVJRzVsZHlCQlkzUnBkbVZZVDJKcVpXTjBLQ2ROYVdOeWIzTnZablF1V0UxTVNGUlVVQ2NwT3lCOUlHTmhkR05vS0dVcElIdDlYRzRnSUNBZ2RISjVJSHNnY21WMGRYSnVJRzVsZHlCQlkzUnBkbVZZVDJKcVpXTjBLQ2ROYzNodGJESXVXRTFNU0ZSVVVDNDJMakFuS1RzZ2ZTQmpZWFJqYUNobEtTQjdmVnh1SUNBZ0lIUnllU0I3SUhKbGRIVnliaUJ1WlhjZ1FXTjBhWFpsV0U5aWFtVmpkQ2duVFhONGJXd3lMbGhOVEVoVVZGQXVNeTR3SnlrN0lIMGdZMkYwWTJnb1pTa2dlMzFjYmlBZ0lDQjBjbmtnZXlCeVpYUjFjbTRnYm1WM0lFRmpkR2wyWlZoUFltcGxZM1FvSjAxemVHMXNNaTVZVFV4SVZGUlFKeWs3SUgwZ1kyRjBZMmdvWlNrZ2UzMWNiaUFnZlZ4dUlDQnlaWFIxY200Z1ptRnNjMlU3WEc1OVhHNWNiaThxS2x4dUlDb2dVbVZ0YjNabGN5QnNaV0ZrYVc1bklHRnVaQ0IwY21GcGJHbHVaeUIzYUdsMFpYTndZV05sTENCaFpHUmxaQ0IwYnlCemRYQndiM0owSUVsRkxseHVJQ3BjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCelhHNGdLaUJBY21WMGRYSnVJSHRUZEhKcGJtZDlYRzRnS2lCQVlYQnBJSEJ5YVhaaGRHVmNiaUFxTDF4dVhHNTJZWElnZEhKcGJTQTlJQ2NuTG5SeWFXMWNiaUFnUHlCbWRXNWpkR2x2YmloektTQjdJSEpsZEhWeWJpQnpMblJ5YVcwb0tUc2dmVnh1SUNBNklHWjFibU4wYVc5dUtITXBJSHNnY21WMGRYSnVJSE11Y21Wd2JHRmpaU2d2S0Y1Y1hITXFmRnhjY3lva0tTOW5MQ0FuSnlrN0lIMDdYRzVjYmk4cUtseHVJQ29nUTJobFkyc2dhV1lnWUc5aWFtQWdhWE1nWVc0Z2IySnFaV04wTGx4dUlDcGNiaUFxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2WW1wY2JpQXFJRUJ5WlhSMWNtNGdlMEp2YjJ4bFlXNTlYRzRnS2lCQVlYQnBJSEJ5YVhaaGRHVmNiaUFxTDF4dVhHNW1kVzVqZEdsdmJpQnBjMDlpYW1WamRDaHZZbW9wSUh0Y2JpQWdjbVYwZFhKdUlHOWlhaUE5UFQwZ1QySnFaV04wS0c5aWFpazdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1UyVnlhV0ZzYVhwbElIUm9aU0JuYVhabGJpQmdiMkpxWUM1Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjJKcVhHNGdLaUJBY21WMGRYSnVJSHRUZEhKcGJtZDlYRzRnS2lCQVlYQnBJSEJ5YVhaaGRHVmNiaUFxTDF4dVhHNW1kVzVqZEdsdmJpQnpaWEpwWVd4cGVtVW9iMkpxS1NCN1hHNGdJR2xtSUNnaGFYTlBZbXBsWTNRb2IySnFLU2tnY21WMGRYSnVJRzlpYWp0Y2JpQWdkbUZ5SUhCaGFYSnpJRDBnVzEwN1hHNGdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQnZZbW9wSUh0Y2JpQWdJQ0JwWmlBb2JuVnNiQ0FoUFNCdlltcGJhMlY1WFNrZ2UxeHVJQ0FnSUNBZ2NHRnBjbk11Y0hWemFDaGxibU52WkdWVlVrbERiMjF3YjI1bGJuUW9hMlY1S1Z4dUlDQWdJQ0FnSUNBcklDYzlKeUFySUdWdVkyOWtaVlZTU1VOdmJYQnZibVZ1ZENodlltcGJhMlY1WFNrcE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnY0dGcGNuTXVhbTlwYmlnbkppY3BPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFVjRjRzl6WlNCelpYSnBZV3hwZW1GMGFXOXVJRzFsZEdodlpDNWNiaUFxTDF4dVhHNGdjbVZ4ZFdWemRDNXpaWEpwWVd4cGVtVlBZbXBsWTNRZ1BTQnpaWEpwWVd4cGVtVTdYRzVjYmlBdktpcGNiaUFnS2lCUVlYSnpaU0IwYUdVZ1oybDJaVzRnZUMxM2QzY3RabTl5YlMxMWNteGxibU52WkdWa0lHQnpkSEpnTGx4dUlDQXFYRzRnSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhOMGNseHVJQ0FxSUVCeVpYUjFjbTRnZTA5aWFtVmpkSDFjYmlBZ0tpQkFZWEJwSUhCeWFYWmhkR1ZjYmlBZ0tpOWNibHh1Wm5WdVkzUnBiMjRnY0dGeWMyVlRkSEpwYm1jb2MzUnlLU0I3WEc0Z0lIWmhjaUJ2WW1vZ1BTQjdmVHRjYmlBZ2RtRnlJSEJoYVhKeklEMGdjM1J5TG5Od2JHbDBLQ2NtSnlrN1hHNGdJSFpoY2lCd1lYSjBjenRjYmlBZ2RtRnlJSEJoYVhJN1hHNWNiaUFnWm05eUlDaDJZWElnYVNBOUlEQXNJR3hsYmlBOUlIQmhhWEp6TG14bGJtZDBhRHNnYVNBOElHeGxianNnS3l0cEtTQjdYRzRnSUNBZ2NHRnBjaUE5SUhCaGFYSnpXMmxkTzF4dUlDQWdJSEJoY25SeklEMGdjR0ZwY2k1emNHeHBkQ2duUFNjcE8xeHVJQ0FnSUc5aWFsdGtaV052WkdWVlVrbERiMjF3YjI1bGJuUW9jR0Z5ZEhOYk1GMHBYU0E5SUdSbFkyOWtaVlZTU1VOdmJYQnZibVZ1ZENod1lYSjBjMXN4WFNrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2IySnFPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFVjRjRzl6WlNCd1lYSnpaWEl1WEc0Z0tpOWNibHh1Y21WeGRXVnpkQzV3WVhKelpWTjBjbWx1WnlBOUlIQmhjbk5sVTNSeWFXNW5PMXh1WEc0dktpcGNiaUFxSUVSbFptRjFiSFFnVFVsTlJTQjBlWEJsSUcxaGNDNWNiaUFxWEc0Z0tpQWdJQ0FnYzNWd1pYSmhaMlZ1ZEM1MGVYQmxjeTU0Yld3Z1BTQW5ZWEJ3YkdsallYUnBiMjR2ZUcxc0p6dGNiaUFxWEc0Z0tpOWNibHh1Y21WeGRXVnpkQzUwZVhCbGN5QTlJSHRjYmlBZ2FIUnRiRG9nSjNSbGVIUXZhSFJ0YkNjc1hHNGdJR3B6YjI0NklDZGhjSEJzYVdOaGRHbHZiaTlxYzI5dUp5eGNiaUFnZUcxc09pQW5ZWEJ3YkdsallYUnBiMjR2ZUcxc0p5eGNiaUFnZFhKc1pXNWpiMlJsWkRvZ0oyRndjR3hwWTJGMGFXOXVMM2d0ZDNkM0xXWnZjbTB0ZFhKc1pXNWpiMlJsWkNjc1hHNGdJQ2RtYjNKdEp6b2dKMkZ3Y0d4cFkyRjBhVzl1TDNndGQzZDNMV1p2Y20wdGRYSnNaVzVqYjJSbFpDY3NYRzRnSUNkbWIzSnRMV1JoZEdFbk9pQW5ZWEJ3YkdsallYUnBiMjR2ZUMxM2QzY3RabTl5YlMxMWNteGxibU52WkdWa0oxeHVmVHRjYmx4dUx5b3FYRzRnS2lCRVpXWmhkV3gwSUhObGNtbGhiR2w2WVhScGIyNGdiV0Z3TGx4dUlDcGNiaUFxSUNBZ0lDQnpkWEJsY21GblpXNTBMbk5sY21saGJHbDZaVnNuWVhCd2JHbGpZWFJwYjI0dmVHMXNKMTBnUFNCbWRXNWpkR2x2Ymlodlltb3BlMXh1SUNvZ0lDQWdJQ0FnY21WMGRYSnVJQ2RuWlc1bGNtRjBaV1FnZUcxc0lHaGxjbVVuTzF4dUlDb2dJQ0FnSUgwN1hHNGdLbHh1SUNvdlhHNWNiaUJ5WlhGMVpYTjBMbk5sY21saGJHbDZaU0E5SUh0Y2JpQWdJQ2RoY0hCc2FXTmhkR2x2Ymk5NExYZDNkeTFtYjNKdExYVnliR1Z1WTI5a1pXUW5PaUJ6WlhKcFlXeHBlbVVzWEc0Z0lDQW5ZWEJ3YkdsallYUnBiMjR2YW5OdmJpYzZJRXBUVDA0dWMzUnlhVzVuYVdaNVhHNGdmVHRjYmx4dUlDOHFLbHh1SUNBcUlFUmxabUYxYkhRZ2NHRnljMlZ5Y3k1Y2JpQWdLbHh1SUNBcUlDQWdJQ0J6ZFhCbGNtRm5aVzUwTG5CaGNuTmxXeWRoY0hCc2FXTmhkR2x2Ymk5NGJXd25YU0E5SUdaMWJtTjBhVzl1S0hOMGNpbDdYRzRnSUNvZ0lDQWdJQ0FnY21WMGRYSnVJSHNnYjJKcVpXTjBJSEJoY25ObFpDQm1jbTl0SUhOMGNpQjlPMXh1SUNBcUlDQWdJQ0I5TzF4dUlDQXFYRzRnSUNvdlhHNWNibkpsY1hWbGMzUXVjR0Z5YzJVZ1BTQjdYRzRnSUNkaGNIQnNhV05oZEdsdmJpOTRMWGQzZHkxbWIzSnRMWFZ5YkdWdVkyOWtaV1FuT2lCd1lYSnpaVk4wY21sdVp5eGNiaUFnSjJGd2NHeHBZMkYwYVc5dUwycHpiMjRuT2lCS1UwOU9MbkJoY25ObFhHNTlPMXh1WEc0dktpcGNiaUFxSUZCaGNuTmxJSFJvWlNCbmFYWmxiaUJvWldGa1pYSWdZSE4wY21BZ2FXNTBiMXh1SUNvZ1lXNGdiMkpxWldOMElHTnZiblJoYVc1cGJtY2dkR2hsSUcxaGNIQmxaQ0JtYVdWc1pITXVYRzRnS2x4dUlDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlITjBjbHh1SUNvZ1FISmxkSFZ5YmlCN1QySnFaV04wZlZ4dUlDb2dRR0Z3YVNCd2NtbDJZWFJsWEc0Z0tpOWNibHh1Wm5WdVkzUnBiMjRnY0dGeWMyVklaV0ZrWlhJb2MzUnlLU0I3WEc0Z0lIWmhjaUJzYVc1bGN5QTlJSE4wY2k1emNHeHBkQ2d2WEZ4eVAxeGNiaThwTzF4dUlDQjJZWElnWm1sbGJHUnpJRDBnZTMwN1hHNGdJSFpoY2lCcGJtUmxlRHRjYmlBZ2RtRnlJR3hwYm1VN1hHNGdJSFpoY2lCbWFXVnNaRHRjYmlBZ2RtRnlJSFpoYkR0Y2JseHVJQ0JzYVc1bGN5NXdiM0FvS1RzZ0x5OGdkSEpoYVd4cGJtY2dRMUpNUmx4dVhHNGdJR1p2Y2lBb2RtRnlJR2tnUFNBd0xDQnNaVzRnUFNCc2FXNWxjeTVzWlc1bmRHZzdJR2tnUENCc1pXNDdJQ3NyYVNrZ2UxeHVJQ0FnSUd4cGJtVWdQU0JzYVc1bGMxdHBYVHRjYmlBZ0lDQnBibVJsZUNBOUlHeHBibVV1YVc1a1pYaFBaaWduT2ljcE8xeHVJQ0FnSUdacFpXeGtJRDBnYkdsdVpTNXpiR2xqWlNnd0xDQnBibVJsZUNrdWRHOU1iM2RsY2tOaGMyVW9LVHRjYmlBZ0lDQjJZV3dnUFNCMGNtbHRLR3hwYm1VdWMyeHBZMlVvYVc1a1pYZ2dLeUF4S1NrN1hHNGdJQ0FnWm1sbGJHUnpXMlpwWld4a1hTQTlJSFpoYkR0Y2JpQWdmVnh1WEc0Z0lISmxkSFZ5YmlCbWFXVnNaSE03WEc1OVhHNWNiaThxS2x4dUlDb2dVbVYwZFhKdUlIUm9aU0J0YVcxbElIUjVjR1VnWm05eUlIUm9aU0JuYVhabGJpQmdjM1J5WUM1Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYzNSeVhHNGdLaUJBY21WMGRYSnVJSHRUZEhKcGJtZDlYRzRnS2lCQVlYQnBJSEJ5YVhaaGRHVmNiaUFxTDF4dVhHNW1kVzVqZEdsdmJpQjBlWEJsS0hOMGNpbDdYRzRnSUhKbGRIVnliaUJ6ZEhJdWMzQnNhWFFvTHlBcU95QXFMeWt1YzJocFpuUW9LVHRjYm4wN1hHNWNiaThxS2x4dUlDb2dVbVYwZFhKdUlHaGxZV1JsY2lCbWFXVnNaQ0J3WVhKaGJXVjBaWEp6TGx4dUlDcGNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J6ZEhKY2JpQXFJRUJ5WlhSMWNtNGdlMDlpYW1WamRIMWNiaUFxSUVCaGNHa2djSEpwZG1GMFpWeHVJQ292WEc1Y2JtWjFibU4wYVc5dUlIQmhjbUZ0Y3loemRISXBlMXh1SUNCeVpYUjFjbTRnY21Wa2RXTmxLSE4wY2k1emNHeHBkQ2d2SUNvN0lDb3ZLU3dnWm5WdVkzUnBiMjRvYjJKcUxDQnpkSElwZTF4dUlDQWdJSFpoY2lCd1lYSjBjeUE5SUhOMGNpNXpjR3hwZENndklDbzlJQ292S1Z4dUlDQWdJQ0FnTENCclpYa2dQU0J3WVhKMGN5NXphR2xtZENncFhHNGdJQ0FnSUNBc0lIWmhiQ0E5SUhCaGNuUnpMbk5vYVdaMEtDazdYRzVjYmlBZ0lDQnBaaUFvYTJWNUlDWW1JSFpoYkNrZ2IySnFXMnRsZVYwZ1BTQjJZV3c3WEc0Z0lDQWdjbVYwZFhKdUlHOWlhanRjYmlBZ2ZTd2dlMzBwTzF4dWZUdGNibHh1THlvcVhHNGdLaUJKYm1sMGFXRnNhWHBsSUdFZ2JtVjNJR0JTWlhOd2IyNXpaV0FnZDJsMGFDQjBhR1VnWjJsMlpXNGdZSGhvY21BdVhHNGdLbHh1SUNvZ0lDMGdjMlYwSUdac1lXZHpJQ2d1YjJzc0lDNWxjbkp2Y2l3Z1pYUmpLVnh1SUNvZ0lDMGdjR0Z5YzJVZ2FHVmhaR1Z5WEc0Z0tseHVJQ29nUlhoaGJYQnNaWE02WEc0Z0tseHVJQ29nSUVGc2FXRnphVzVuSUdCemRYQmxjbUZuWlc1MFlDQmhjeUJnY21WeGRXVnpkR0FnYVhNZ2JtbGpaVHBjYmlBcVhHNGdLaUFnSUNBZ0lISmxjWFZsYzNRZ1BTQnpkWEJsY21GblpXNTBPMXh1SUNwY2JpQXFJQ0JYWlNCallXNGdkWE5sSUhSb1pTQndjbTl0YVhObExXeHBhMlVnUVZCSkxDQnZjaUJ3WVhOeklHTmhiR3hpWVdOcmN6cGNiaUFxWEc0Z0tpQWdJQ0FnSUhKbGNYVmxjM1F1WjJWMEtDY3ZKeWt1Wlc1a0tHWjFibU4wYVc5dUtISmxjeWw3ZlNrN1hHNGdLaUFnSUNBZ0lISmxjWFZsYzNRdVoyVjBLQ2N2Snl3Z1puVnVZM1JwYjI0b2NtVnpLWHQ5S1R0Y2JpQXFYRzRnS2lBZ1UyVnVaR2x1WnlCa1lYUmhJR05oYmlCaVpTQmphR0ZwYm1Wa09seHVJQ3BjYmlBcUlDQWdJQ0FnY21WeGRXVnpkRnh1SUNvZ0lDQWdJQ0FnSUM1d2IzTjBLQ2N2ZFhObGNpY3BYRzRnS2lBZ0lDQWdJQ0FnTG5ObGJtUW9leUJ1WVcxbE9pQW5kR29uSUgwcFhHNGdLaUFnSUNBZ0lDQWdMbVZ1WkNobWRXNWpkR2x2YmloeVpYTXBlMzBwTzF4dUlDcGNiaUFxSUNCUGNpQndZWE56WldRZ2RHOGdZQzV6Wlc1a0tDbGdPbHh1SUNwY2JpQXFJQ0FnSUNBZ2NtVnhkV1Z6ZEZ4dUlDb2dJQ0FnSUNBZ0lDNXdiM04wS0NjdmRYTmxjaWNwWEc0Z0tpQWdJQ0FnSUNBZ0xuTmxibVFvZXlCdVlXMWxPaUFuZEdvbklIMHNJR1oxYm1OMGFXOXVLSEpsY3lsN2ZTazdYRzRnS2x4dUlDb2dJRTl5SUhCaGMzTmxaQ0IwYnlCZ0xuQnZjM1FvS1dBNlhHNGdLbHh1SUNvZ0lDQWdJQ0J5WlhGMVpYTjBYRzRnS2lBZ0lDQWdJQ0FnTG5CdmMzUW9KeTkxYzJWeUp5d2dleUJ1WVcxbE9pQW5kR29uSUgwcFhHNGdLaUFnSUNBZ0lDQWdMbVZ1WkNobWRXNWpkR2x2YmloeVpYTXBlMzBwTzF4dUlDcGNiaUFxSUU5eUlHWjFjblJvWlhJZ2NtVmtkV05sWkNCMGJ5QmhJSE5wYm1kc1pTQmpZV3hzSUdadmNpQnphVzF3YkdVZ1kyRnpaWE02WEc0Z0tseHVJQ29nSUNBZ0lDQnlaWEYxWlhOMFhHNGdLaUFnSUNBZ0lDQWdMbkJ2YzNRb0p5OTFjMlZ5Snl3Z2V5QnVZVzFsT2lBbmRHb25JSDBzSUdaMWJtTjBhVzl1S0hKbGN5bDdmU2s3WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHRZVFV4SVZGUlFVbVZ4ZFdWemRIMGdlR2h5WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IzQjBhVzl1YzF4dUlDb2dRR0Z3YVNCd2NtbDJZWFJsWEc0Z0tpOWNibHh1Wm5WdVkzUnBiMjRnVW1WemNHOXVjMlVvY21WeExDQnZjSFJwYjI1ektTQjdYRzRnSUc5d2RHbHZibk1nUFNCdmNIUnBiMjV6SUh4OElIdDlPMXh1SUNCMGFHbHpMbkpsY1NBOUlISmxjVHRjYmlBZ2RHaHBjeTU0YUhJZ1BTQjBhR2x6TG5KbGNTNTRhSEk3WEc0Z0lIUm9hWE11ZEdWNGRDQTlJSFJvYVhNdWNtVnhMbTFsZEdodlpDQWhQU2RJUlVGRUp5QmNiaUFnSUNBZ1B5QjBhR2x6TG5ob2NpNXlaWE53YjI1elpWUmxlSFFnWEc0Z0lDQWdJRG9nYm5Wc2JEdGNiaUFnZEdocGN5NXpaWFJUZEdGMGRYTlFjbTl3WlhKMGFXVnpLSFJvYVhNdWVHaHlMbk4wWVhSMWN5azdYRzRnSUhSb2FYTXVhR1ZoWkdWeUlEMGdkR2hwY3k1b1pXRmtaWEp6SUQwZ2NHRnljMlZJWldGa1pYSW9kR2hwY3k1NGFISXVaMlYwUVd4c1VtVnpjRzl1YzJWSVpXRmtaWEp6S0NrcE8xeHVJQ0F2THlCblpYUkJiR3hTWlhOd2IyNXpaVWhsWVdSbGNuTWdjMjl0WlhScGJXVnpJR1poYkhObGJIa2djbVYwZFhKdWN5QmNJbHdpSUdadmNpQkRUMUpUSUhKbGNYVmxjM1J6TENCaWRYUmNiaUFnTHk4Z1oyVjBVbVZ6Y0c5dWMyVklaV0ZrWlhJZ2MzUnBiR3dnZDI5eWEzTXVJSE52SUhkbElHZGxkQ0JqYjI1MFpXNTBMWFI1Y0dVZ1pYWmxiaUJwWmlCblpYUjBhVzVuWEc0Z0lDOHZJRzkwYUdWeUlHaGxZV1JsY25NZ1ptRnBiSE11WEc0Z0lIUm9hWE11YUdWaFpHVnlXeWRqYjI1MFpXNTBMWFI1Y0dVblhTQTlJSFJvYVhNdWVHaHlMbWRsZEZKbGMzQnZibk5sU0dWaFpHVnlLQ2RqYjI1MFpXNTBMWFI1Y0dVbktUdGNiaUFnZEdocGN5NXpaWFJJWldGa1pYSlFjbTl3WlhKMGFXVnpLSFJvYVhNdWFHVmhaR1Z5S1R0Y2JpQWdkR2hwY3k1aWIyUjVJRDBnZEdocGN5NXlaWEV1YldWMGFHOWtJQ0U5SUNkSVJVRkVKMXh1SUNBZ0lEOGdkR2hwY3k1d1lYSnpaVUp2Wkhrb2RHaHBjeTUwWlhoMEtWeHVJQ0FnSURvZ2JuVnNiRHRjYm4xY2JseHVMeW9xWEc0Z0tpQkhaWFFnWTJGelpTMXBibk5sYm5OcGRHbDJaU0JnWm1sbGJHUmdJSFpoYkhWbExseHVJQ3BjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCbWFXVnNaRnh1SUNvZ1FISmxkSFZ5YmlCN1UzUnlhVzVuZlZ4dUlDb2dRR0Z3YVNCd2RXSnNhV05jYmlBcUwxeHVYRzVTWlhOd2IyNXpaUzV3Y205MGIzUjVjR1V1WjJWMElEMGdablZ1WTNScGIyNG9abWxsYkdRcGUxeHVJQ0J5WlhSMWNtNGdkR2hwY3k1b1pXRmtaWEpiWm1sbGJHUXVkRzlNYjNkbGNrTmhjMlVvS1YwN1hHNTlPMXh1WEc0dktpcGNiaUFxSUZObGRDQm9aV0ZrWlhJZ2NtVnNZWFJsWkNCd2NtOXdaWEowYVdWek9seHVJQ3BjYmlBcUlDQWdMU0JnTG5SNWNHVmdJSFJvWlNCamIyNTBaVzUwSUhSNWNHVWdkMmwwYUc5MWRDQndZWEpoYlhOY2JpQXFYRzRnS2lCQklISmxjM0J2Ym5ObElHOW1JRndpUTI5dWRHVnVkQzFVZVhCbE9pQjBaWGgwTDNCc1lXbHVPeUJqYUdGeWMyVjBQWFYwWmkwNFhDSmNiaUFxSUhkcGJHd2djSEp2ZG1sa1pTQjViM1VnZDJsMGFDQmhJR0F1ZEhsd1pXQWdiMllnWENKMFpYaDBMM0JzWVdsdVhDSXVYRzRnS2x4dUlDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHaGxZV1JsY2x4dUlDb2dRR0Z3YVNCd2NtbDJZWFJsWEc0Z0tpOWNibHh1VW1WemNHOXVjMlV1Y0hKdmRHOTBlWEJsTG5ObGRFaGxZV1JsY2xCeWIzQmxjblJwWlhNZ1BTQm1kVzVqZEdsdmJpaG9aV0ZrWlhJcGUxeHVJQ0F2THlCamIyNTBaVzUwTFhSNWNHVmNiaUFnZG1GeUlHTjBJRDBnZEdocGN5NW9aV0ZrWlhKYkoyTnZiblJsYm5RdGRIbHdaU2RkSUh4OElDY25PMXh1SUNCMGFHbHpMblI1Y0dVZ1BTQjBlWEJsS0dOMEtUdGNibHh1SUNBdkx5QndZWEpoYlhOY2JpQWdkbUZ5SUc5aWFpQTlJSEJoY21GdGN5aGpkQ2s3WEc0Z0lHWnZjaUFvZG1GeUlHdGxlU0JwYmlCdlltb3BJSFJvYVhOYmEyVjVYU0E5SUc5aWFsdHJaWGxkTzF4dWZUdGNibHh1THlvcVhHNGdLaUJRWVhKelpTQjBhR1VnWjJsMlpXNGdZbTlrZVNCZ2MzUnlZQzVjYmlBcVhHNGdLaUJWYzJWa0lHWnZjaUJoZFhSdkxYQmhjbk5wYm1jZ2IyWWdZbTlrYVdWekxpQlFZWEp6WlhKelhHNGdLaUJoY21VZ1pHVm1hVzVsWkNCdmJpQjBhR1VnWUhOMWNHVnlZV2RsYm5RdWNHRnljMlZnSUc5aWFtVmpkQzVjYmlBcVhHNGdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdjM1J5WEc0Z0tpQkFjbVYwZFhKdUlIdE5hWGhsWkgxY2JpQXFJRUJoY0drZ2NISnBkbUYwWlZ4dUlDb3ZYRzVjYmxKbGMzQnZibk5sTG5CeWIzUnZkSGx3WlM1d1lYSnpaVUp2WkhrZ1BTQm1kVzVqZEdsdmJpaHpkSElwZTF4dUlDQjJZWElnY0dGeWMyVWdQU0J5WlhGMVpYTjBMbkJoY25ObFczUm9hWE11ZEhsd1pWMDdYRzRnSUhKbGRIVnliaUJ3WVhKelpTQW1KaUJ6ZEhJZ0ppWWdjM1J5TG14bGJtZDBhRnh1SUNBZ0lEOGdjR0Z5YzJVb2MzUnlLVnh1SUNBZ0lEb2diblZzYkR0Y2JuMDdYRzVjYmk4cUtseHVJQ29nVTJWMElHWnNZV2R6SUhOMVkyZ2dZWE1nWUM1dmEyQWdZbUZ6WldRZ2IyNGdZSE4wWVhSMWMyQXVYRzRnS2x4dUlDb2dSbTl5SUdWNFlXMXdiR1VnWVNBeWVIZ2djbVZ6Y0c5dWMyVWdkMmxzYkNCbmFYWmxJSGx2ZFNCaElHQXViMnRnSUc5bUlGOWZkSEoxWlY5ZlhHNGdLaUIzYUdWeVpXRnpJRFY0ZUNCM2FXeHNJR0psSUY5ZlptRnNjMlZmWHlCaGJtUWdZQzVsY25KdmNtQWdkMmxzYkNCaVpTQmZYM1J5ZFdWZlh5NGdWR2hsWEc0Z0tpQmdMbU5zYVdWdWRFVnljbTl5WUNCaGJtUWdZQzV6WlhKMlpYSkZjbkp2Y21BZ1lYSmxJR0ZzYzI4Z1lYWmhhV3hoWW14bElIUnZJR0psSUcxdmNtVmNiaUFxSUhOd1pXTnBabWxqTENCaGJtUWdZQzV6ZEdGMGRYTlVlWEJsWUNCcGN5QjBhR1VnWTJ4aGMzTWdiMllnWlhKeWIzSWdjbUZ1WjJsdVp5Qm1jbTl0SURFdUxqVmNiaUFxSUhOdmJXVjBhVzFsY3lCMWMyVm1kV3dnWm05eUlHMWhjSEJwYm1jZ2NtVnpjRzl1WkNCamIyeHZjbk1nWlhSakxseHVJQ3BjYmlBcUlGd2ljM1ZuWVhKY0lpQndjbTl3WlhKMGFXVnpJR0Z5WlNCaGJITnZJR1JsWm1sdVpXUWdabTl5SUdOdmJXMXZiaUJqWVhObGN5NGdRM1Z5Y21WdWRHeDVJSEJ5YjNacFpHbHVaenBjYmlBcVhHNGdLaUFnSUMwZ0xtNXZRMjl1ZEdWdWRGeHVJQ29nSUNBdElDNWlZV1JTWlhGMVpYTjBYRzRnS2lBZ0lDMGdMblZ1WVhWMGFHOXlhWHBsWkZ4dUlDb2dJQ0F0SUM1dWIzUkJZMk5sY0hSaFlteGxYRzRnS2lBZ0lDMGdMbTV2ZEVadmRXNWtYRzRnS2x4dUlDb2dRSEJoY21GdElIdE9kVzFpWlhKOUlITjBZWFIxYzF4dUlDb2dRR0Z3YVNCd2NtbDJZWFJsWEc0Z0tpOWNibHh1VW1WemNHOXVjMlV1Y0hKdmRHOTBlWEJsTG5ObGRGTjBZWFIxYzFCeWIzQmxjblJwWlhNZ1BTQm1kVzVqZEdsdmJpaHpkR0YwZFhNcGUxeHVJQ0IyWVhJZ2RIbHdaU0E5SUhOMFlYUjFjeUF2SURFd01DQjhJREE3WEc1Y2JpQWdMeThnYzNSaGRIVnpJQzhnWTJ4aGMzTmNiaUFnZEdocGN5NXpkR0YwZFhNZ1BTQnpkR0YwZFhNN1hHNGdJSFJvYVhNdWMzUmhkSFZ6Vkhsd1pTQTlJSFI1Y0dVN1hHNWNiaUFnTHk4Z1ltRnphV056WEc0Z0lIUm9hWE11YVc1bWJ5QTlJREVnUFQwZ2RIbHdaVHRjYmlBZ2RHaHBjeTV2YXlBOUlESWdQVDBnZEhsd1pUdGNiaUFnZEdocGN5NWpiR2xsYm5SRmNuSnZjaUE5SURRZ1BUMGdkSGx3WlR0Y2JpQWdkR2hwY3k1elpYSjJaWEpGY25KdmNpQTlJRFVnUFQwZ2RIbHdaVHRjYmlBZ2RHaHBjeTVsY25KdmNpQTlJQ2cwSUQwOUlIUjVjR1VnZkh3Z05TQTlQU0IwZVhCbEtWeHVJQ0FnSUQ4Z2RHaHBjeTUwYjBWeWNtOXlLQ2xjYmlBZ0lDQTZJR1poYkhObE8xeHVYRzRnSUM4dklITjFaMkZ5WEc0Z0lIUm9hWE11WVdOalpYQjBaV1FnUFNBeU1ESWdQVDBnYzNSaGRIVnpPMXh1SUNCMGFHbHpMbTV2UTI5dWRHVnVkQ0E5SURJd05DQTlQU0J6ZEdGMGRYTWdmSHdnTVRJeU15QTlQU0J6ZEdGMGRYTTdYRzRnSUhSb2FYTXVZbUZrVW1WeGRXVnpkQ0E5SURRd01DQTlQU0J6ZEdGMGRYTTdYRzRnSUhSb2FYTXVkVzVoZFhSb2IzSnBlbVZrSUQwZ05EQXhJRDA5SUhOMFlYUjFjenRjYmlBZ2RHaHBjeTV1YjNSQlkyTmxjSFJoWW14bElEMGdOREEySUQwOUlITjBZWFIxY3p0Y2JpQWdkR2hwY3k1dWIzUkdiM1Z1WkNBOUlEUXdOQ0E5UFNCemRHRjBkWE03WEc0Z0lIUm9hWE11Wm05eVltbGtaR1Z1SUQwZ05EQXpJRDA5SUhOMFlYUjFjenRjYm4wN1hHNWNiaThxS2x4dUlDb2dVbVYwZFhKdUlHRnVJR0JGY25KdmNtQWdjbVZ3Y21WelpXNTBZWFJwZG1VZ2IyWWdkR2hwY3lCeVpYTndiMjV6WlM1Y2JpQXFYRzRnS2lCQWNtVjBkWEp1SUh0RmNuSnZjbjFjYmlBcUlFQmhjR2tnY0hWaWJHbGpYRzRnS2k5Y2JseHVVbVZ6Y0c5dWMyVXVjSEp2ZEc5MGVYQmxMblJ2UlhKeWIzSWdQU0JtZFc1amRHbHZiaWdwZTF4dUlDQjJZWElnY21WeElEMGdkR2hwY3k1eVpYRTdYRzRnSUhaaGNpQnRaWFJvYjJRZ1BTQnlaWEV1YldWMGFHOWtPMXh1SUNCMllYSWdkWEpzSUQwZ2NtVnhMblZ5YkR0Y2JseHVJQ0IyWVhJZ2JYTm5JRDBnSjJOaGJtNXZkQ0FuSUNzZ2JXVjBhRzlrSUNzZ0p5QW5JQ3NnZFhKc0lDc2dKeUFvSnlBcklIUm9hWE11YzNSaGRIVnpJQ3NnSnlrbk8xeHVJQ0IyWVhJZ1pYSnlJRDBnYm1WM0lFVnljbTl5S0cxelp5azdYRzRnSUdWeWNpNXpkR0YwZFhNZ1BTQjBhR2x6TG5OMFlYUjFjenRjYmlBZ1pYSnlMbTFsZEdodlpDQTlJRzFsZEdodlpEdGNiaUFnWlhKeUxuVnliQ0E5SUhWeWJEdGNibHh1SUNCeVpYUjFjbTRnWlhKeU8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCRmVIQnZjMlVnWUZKbGMzQnZibk5sWUM1Y2JpQXFMMXh1WEc1eVpYRjFaWE4wTGxKbGMzQnZibk5sSUQwZ1VtVnpjRzl1YzJVN1hHNWNiaThxS2x4dUlDb2dTVzVwZEdsaGJHbDZaU0JoSUc1bGR5QmdVbVZ4ZFdWemRHQWdkMmwwYUNCMGFHVWdaMmwyWlc0Z1lHMWxkR2h2WkdBZ1lXNWtJR0IxY214Z0xseHVJQ3BjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCdFpYUm9iMlJjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCMWNteGNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaTljYmx4dVpuVnVZM1JwYjI0Z1VtVnhkV1Z6ZENodFpYUm9iMlFzSUhWeWJDa2dlMXh1SUNCMllYSWdjMlZzWmlBOUlIUm9hWE03WEc0Z0lFVnRhWFIwWlhJdVkyRnNiQ2gwYUdsektUdGNiaUFnZEdocGN5NWZjWFZsY25rZ1BTQjBhR2x6TGw5eGRXVnllU0I4ZkNCYlhUdGNiaUFnZEdocGN5NXRaWFJvYjJRZ1BTQnRaWFJvYjJRN1hHNGdJSFJvYVhNdWRYSnNJRDBnZFhKc08xeHVJQ0IwYUdsekxtaGxZV1JsY2lBOUlIdDlPMXh1SUNCMGFHbHpMbDlvWldGa1pYSWdQU0I3ZlR0Y2JpQWdkR2hwY3k1dmJpZ25aVzVrSnl3Z1puVnVZM1JwYjI0b0tYdGNiaUFnSUNCMllYSWdaWEp5SUQwZ2JuVnNiRHRjYmlBZ0lDQjJZWElnY21WeklEMGdiblZzYkR0Y2JseHVJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQnlaWE1nUFNCdVpYY2dVbVZ6Y0c5dWMyVW9jMlZzWmlrN0lGeHVJQ0FnSUgwZ1kyRjBZMmdvWlNrZ2UxeHVJQ0FnSUNBZ1pYSnlJRDBnYm1WM0lFVnljbTl5S0NkUVlYSnpaWElnYVhNZ2RXNWhZbXhsSUhSdklIQmhjbk5sSUhSb1pTQnlaWE53YjI1elpTY3BPMXh1SUNBZ0lDQWdaWEp5TG5CaGNuTmxJRDBnZEhKMVpUdGNiaUFnSUNBZ0lHVnljaTV2Y21sbmFXNWhiQ0E5SUdVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYzJWc1ppNWpZV3hzWW1GamF5aGxjbklzSUhKbGN5azdYRzRnSUgwcE8xeHVmVnh1WEc0dktpcGNiaUFxSUUxcGVHbHVJR0JGYldsMGRHVnlZQzVjYmlBcUwxeHVYRzVGYldsMGRHVnlLRkpsY1hWbGMzUXVjSEp2ZEc5MGVYQmxLVHRjYmx4dUx5b3FYRzRnS2lCQmJHeHZkeUJtYjNJZ1pYaDBaVzV6YVc5dVhHNGdLaTljYmx4dVVtVnhkV1Z6ZEM1d2NtOTBiM1I1Y0dVdWRYTmxJRDBnWm5WdVkzUnBiMjRvWm00cElIdGNiaUFnWm00b2RHaHBjeWs3WEc0Z0lISmxkSFZ5YmlCMGFHbHpPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlGTmxkQ0IwYVcxbGIzVjBJSFJ2SUdCdGMyQXVYRzRnS2x4dUlDb2dRSEJoY21GdElIdE9kVzFpWlhKOUlHMXpYRzRnS2lCQWNtVjBkWEp1SUh0U1pYRjFaWE4wZlNCbWIzSWdZMmhoYVc1cGJtZGNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaTljYmx4dVVtVnhkV1Z6ZEM1d2NtOTBiM1I1Y0dVdWRHbHRaVzkxZENBOUlHWjFibU4wYVc5dUtHMXpLWHRjYmlBZ2RHaHBjeTVmZEdsdFpXOTFkQ0E5SUcxek8xeHVJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JuMDdYRzVjYmk4cUtseHVJQ29nUTJ4bFlYSWdjSEpsZG1sdmRYTWdkR2x0Wlc5MWRDNWNiaUFxWEc0Z0tpQkFjbVYwZFhKdUlIdFNaWEYxWlhOMGZTQm1iM0lnWTJoaGFXNXBibWRjYmlBcUlFQmhjR2tnY0hWaWJHbGpYRzRnS2k5Y2JseHVVbVZ4ZFdWemRDNXdjbTkwYjNSNWNHVXVZMnhsWVhKVWFXMWxiM1YwSUQwZ1puVnVZM1JwYjI0b0tYdGNiaUFnZEdocGN5NWZkR2x0Wlc5MWRDQTlJREE3WEc0Z0lHTnNaV0Z5VkdsdFpXOTFkQ2gwYUdsekxsOTBhVzFsY2lrN1hHNGdJSEpsZEhWeWJpQjBhR2x6TzF4dWZUdGNibHh1THlvcVhHNGdLaUJCWW05eWRDQjBhR1VnY21WeGRXVnpkQ3dnWVc1a0lHTnNaV0Z5SUhCdmRHVnVkR2xoYkNCMGFXMWxiM1YwTGx4dUlDcGNiaUFxSUVCeVpYUjFjbTRnZTFKbGNYVmxjM1I5WEc0Z0tpQkFZWEJwSUhCMVlteHBZMXh1SUNvdlhHNWNibEpsY1hWbGMzUXVjSEp2ZEc5MGVYQmxMbUZpYjNKMElEMGdablZ1WTNScGIyNG9LWHRjYmlBZ2FXWWdLSFJvYVhNdVlXSnZjblJsWkNrZ2NtVjBkWEp1TzF4dUlDQjBhR2x6TG1GaWIzSjBaV1FnUFNCMGNuVmxPMXh1SUNCMGFHbHpMbmhvY2k1aFltOXlkQ2dwTzF4dUlDQjBhR2x6TG1Oc1pXRnlWR2x0Wlc5MWRDZ3BPMXh1SUNCMGFHbHpMbVZ0YVhRb0oyRmliM0owSnlrN1hHNGdJSEpsZEhWeWJpQjBhR2x6TzF4dWZUdGNibHh1THlvcVhHNGdLaUJUWlhRZ2FHVmhaR1Z5SUdCbWFXVnNaR0FnZEc4Z1lIWmhiR0FzSUc5eUlHMTFiSFJwY0d4bElHWnBaV3hrY3lCM2FYUm9JRzl1WlNCdlltcGxZM1F1WEc0Z0tseHVJQ29nUlhoaGJYQnNaWE02WEc0Z0tseHVJQ29nSUNBZ0lDQnlaWEV1WjJWMEtDY3ZKeWxjYmlBcUlDQWdJQ0FnSUNBdWMyVjBLQ2RCWTJObGNIUW5MQ0FuWVhCd2JHbGpZWFJwYjI0dmFuTnZiaWNwWEc0Z0tpQWdJQ0FnSUNBZ0xuTmxkQ2duV0MxQlVFa3RTMlY1Snl3Z0oyWnZiMkpoY2ljcFhHNGdLaUFnSUNBZ0lDQWdMbVZ1WkNoallXeHNZbUZqYXlrN1hHNGdLbHh1SUNvZ0lDQWdJQ0J5WlhFdVoyVjBLQ2N2SnlsY2JpQXFJQ0FnSUNBZ0lDQXVjMlYwS0hzZ1FXTmpaWEIwT2lBbllYQndiR2xqWVhScGIyNHZhbk52Ymljc0lDZFlMVUZRU1MxTFpYa25PaUFuWm05dlltRnlKeUI5S1Z4dUlDb2dJQ0FnSUNBZ0lDNWxibVFvWTJGc2JHSmhZMnNwTzF4dUlDcGNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mRTlpYW1WamRIMGdabWxsYkdSY2JpQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQjJZV3hjYmlBcUlFQnlaWFIxY200Z2UxSmxjWFZsYzNSOUlHWnZjaUJqYUdGcGJtbHVaMXh1SUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFxTDF4dVhHNVNaWEYxWlhOMExuQnliM1J2ZEhsd1pTNXpaWFFnUFNCbWRXNWpkR2x2YmlobWFXVnNaQ3dnZG1Gc0tYdGNiaUFnYVdZZ0tHbHpUMkpxWldOMEtHWnBaV3hrS1NrZ2UxeHVJQ0FnSUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJtYVdWc1pDa2dlMXh1SUNBZ0lDQWdkR2hwY3k1elpYUW9hMlY1TENCbWFXVnNaRnRyWlhsZEtUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDFjYmlBZ2RHaHBjeTVmYUdWaFpHVnlXMlpwWld4a0xuUnZURzkzWlhKRFlYTmxLQ2xkSUQwZ2RtRnNPMXh1SUNCMGFHbHpMbWhsWVdSbGNsdG1hV1ZzWkYwZ1BTQjJZV3c3WEc0Z0lISmxkSFZ5YmlCMGFHbHpPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQlNaVzF2ZG1VZ2FHVmhaR1Z5SUdCbWFXVnNaR0F1WEc0Z0tseHVJQ29nUlhoaGJYQnNaVHBjYmlBcVhHNGdLaUFnSUNBZ0lISmxjUzVuWlhRb0p5OG5LVnh1SUNvZ0lDQWdJQ0FnSUM1MWJuTmxkQ2duVlhObGNpMUJaMlZ1ZENjcFhHNGdLaUFnSUNBZ0lDQWdMbVZ1WkNoallXeHNZbUZqYXlrN1hHNGdLbHh1SUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUdacFpXeGtYRzRnS2lCQWNtVjBkWEp1SUh0U1pYRjFaWE4wZlNCbWIzSWdZMmhoYVc1cGJtZGNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaTljYmx4dVVtVnhkV1Z6ZEM1d2NtOTBiM1I1Y0dVdWRXNXpaWFFnUFNCbWRXNWpkR2x2YmlobWFXVnNaQ2w3WEc0Z0lHUmxiR1YwWlNCMGFHbHpMbDlvWldGa1pYSmJabWxsYkdRdWRHOU1iM2RsY2tOaGMyVW9LVjA3WEc0Z0lHUmxiR1YwWlNCMGFHbHpMbWhsWVdSbGNsdG1hV1ZzWkYwN1hHNGdJSEpsZEhWeWJpQjBhR2x6TzF4dWZUdGNibHh1THlvcVhHNGdLaUJIWlhRZ1kyRnpaUzFwYm5ObGJuTnBkR2wyWlNCb1pXRmtaWElnWUdacFpXeGtZQ0IyWVd4MVpTNWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1ptbGxiR1JjYmlBcUlFQnlaWFIxY200Z2UxTjBjbWx1WjMxY2JpQXFJRUJoY0drZ2NISnBkbUYwWlZ4dUlDb3ZYRzVjYmxKbGNYVmxjM1F1Y0hKdmRHOTBlWEJsTG1kbGRFaGxZV1JsY2lBOUlHWjFibU4wYVc5dUtHWnBaV3hrS1h0Y2JpQWdjbVYwZFhKdUlIUm9hWE11WDJobFlXUmxjbHRtYVdWc1pDNTBiMHh2ZDJWeVEyRnpaU2dwWFR0Y2JuMDdYRzVjYmk4cUtseHVJQ29nVTJWMElFTnZiblJsYm5RdFZIbHdaU0IwYnlCZ2RIbHdaV0FzSUcxaGNIQnBibWNnZG1Gc2RXVnpJR1p5YjIwZ1lISmxjWFZsYzNRdWRIbHdaWE5nTGx4dUlDcGNiaUFxSUVWNFlXMXdiR1Z6T2x4dUlDcGNiaUFxSUNBZ0lDQWdjM1Z3WlhKaFoyVnVkQzUwZVhCbGN5NTRiV3dnUFNBbllYQndiR2xqWVhScGIyNHZlRzFzSnp0Y2JpQXFYRzRnS2lBZ0lDQWdJSEpsY1hWbGMzUXVjRzl6ZENnbkx5Y3BYRzRnS2lBZ0lDQWdJQ0FnTG5SNWNHVW9KM2h0YkNjcFhHNGdLaUFnSUNBZ0lDQWdMbk5sYm1Rb2VHMXNjM1J5YVc1bktWeHVJQ29nSUNBZ0lDQWdJQzVsYm1Rb1kyRnNiR0poWTJzcE8xeHVJQ3BjYmlBcUlDQWdJQ0FnY21WeGRXVnpkQzV3YjNOMEtDY3ZKeWxjYmlBcUlDQWdJQ0FnSUNBdWRIbHdaU2duWVhCd2JHbGpZWFJwYjI0dmVHMXNKeWxjYmlBcUlDQWdJQ0FnSUNBdWMyVnVaQ2g0Yld4emRISnBibWNwWEc0Z0tpQWdJQ0FnSUNBZ0xtVnVaQ2hqWVd4c1ltRmpheWs3WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFI1Y0dWY2JpQXFJRUJ5WlhSMWNtNGdlMUpsY1hWbGMzUjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDb2dRR0Z3YVNCd2RXSnNhV05jYmlBcUwxeHVYRzVTWlhGMVpYTjBMbkJ5YjNSdmRIbHdaUzUwZVhCbElEMGdablZ1WTNScGIyNG9kSGx3WlNsN1hHNGdJSFJvYVhNdWMyVjBLQ2REYjI1MFpXNTBMVlI1Y0dVbkxDQnlaWEYxWlhOMExuUjVjR1Z6VzNSNWNHVmRJSHg4SUhSNWNHVXBPMXh1SUNCeVpYUjFjbTRnZEdocGN6dGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1UyVjBJRUZqWTJWd2RDQjBieUJnZEhsd1pXQXNJRzFoY0hCcGJtY2dkbUZzZFdWeklHWnliMjBnWUhKbGNYVmxjM1F1ZEhsd1pYTmdMbHh1SUNwY2JpQXFJRVY0WVcxd2JHVnpPbHh1SUNwY2JpQXFJQ0FnSUNBZ2MzVndaWEpoWjJWdWRDNTBlWEJsY3k1cWMyOXVJRDBnSjJGd2NHeHBZMkYwYVc5dUwycHpiMjRuTzF4dUlDcGNiaUFxSUNBZ0lDQWdjbVZ4ZFdWemRDNW5aWFFvSnk5aFoyVnVkQ2NwWEc0Z0tpQWdJQ0FnSUNBZ0xtRmpZMlZ3ZENnbmFuTnZiaWNwWEc0Z0tpQWdJQ0FnSUNBZ0xtVnVaQ2hqWVd4c1ltRmpheWs3WEc0Z0tseHVJQ29nSUNBZ0lDQnlaWEYxWlhOMExtZGxkQ2duTDJGblpXNTBKeWxjYmlBcUlDQWdJQ0FnSUNBdVlXTmpaWEIwS0NkaGNIQnNhV05oZEdsdmJpOXFjMjl1SnlsY2JpQXFJQ0FnSUNBZ0lDQXVaVzVrS0dOaGJHeGlZV05yS1R0Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnWVdOalpYQjBYRzRnS2lCQWNtVjBkWEp1SUh0U1pYRjFaWE4wZlNCbWIzSWdZMmhoYVc1cGJtZGNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaTljYmx4dVVtVnhkV1Z6ZEM1d2NtOTBiM1I1Y0dVdVlXTmpaWEIwSUQwZ1puVnVZM1JwYjI0b2RIbHdaU2w3WEc0Z0lIUm9hWE11YzJWMEtDZEJZMk5sY0hRbkxDQnlaWEYxWlhOMExuUjVjR1Z6VzNSNWNHVmRJSHg4SUhSNWNHVXBPMXh1SUNCeVpYUjFjbTRnZEdocGN6dGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1UyVjBJRUYxZEdodmNtbDZZWFJwYjI0Z1ptbGxiR1FnZG1Gc2RXVWdkMmwwYUNCZ2RYTmxjbUFnWVc1a0lHQndZWE56WUM1Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnZFhObGNseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSEJoYzNOY2JpQXFJRUJ5WlhSMWNtNGdlMUpsY1hWbGMzUjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDb2dRR0Z3YVNCd2RXSnNhV05jYmlBcUwxeHVYRzVTWlhGMVpYTjBMbkJ5YjNSdmRIbHdaUzVoZFhSb0lEMGdablZ1WTNScGIyNG9kWE5sY2l3Z2NHRnpjeWw3WEc0Z0lIWmhjaUJ6ZEhJZ1BTQmlkRzloS0hWelpYSWdLeUFuT2ljZ0t5QndZWE56S1R0Y2JpQWdkR2hwY3k1elpYUW9KMEYxZEdodmNtbDZZWFJwYjI0bkxDQW5RbUZ6YVdNZ0p5QXJJSE4wY2lrN1hHNGdJSEpsZEhWeWJpQjBhR2x6TzF4dWZUdGNibHh1THlvcVhHNHFJRUZrWkNCeGRXVnllUzF6ZEhKcGJtY2dZSFpoYkdBdVhHNHFYRzRxSUVWNFlXMXdiR1Z6T2x4dUtseHVLaUFnSUhKbGNYVmxjM1F1WjJWMEtDY3ZjMmh2WlhNbktWeHVLaUFnSUNBZ0xuRjFaWEo1S0NkemFYcGxQVEV3SnlsY2Jpb2dJQ0FnSUM1eGRXVnllU2g3SUdOdmJHOXlPaUFuWW14MVpTY2dmU2xjYmlwY2Jpb2dRSEJoY21GdElIdFBZbXBsWTNSOFUzUnlhVzVuZlNCMllXeGNiaW9nUUhKbGRIVnliaUI3VW1WeGRXVnpkSDBnWm05eUlHTm9ZV2x1YVc1blhHNHFJRUJoY0drZ2NIVmliR2xqWEc0cUwxeHVYRzVTWlhGMVpYTjBMbkJ5YjNSdmRIbHdaUzV4ZFdWeWVTQTlJR1oxYm1OMGFXOXVLSFpoYkNsN1hHNGdJR2xtSUNnbmMzUnlhVzVuSnlBaFBTQjBlWEJsYjJZZ2RtRnNLU0IyWVd3Z1BTQnpaWEpwWVd4cGVtVW9kbUZzS1R0Y2JpQWdhV1lnS0haaGJDa2dkR2hwY3k1ZmNYVmxjbmt1Y0hWemFDaDJZV3dwTzF4dUlDQnlaWFIxY200Z2RHaHBjenRjYm4wN1hHNWNiaThxS2x4dUlDb2dWM0pwZEdVZ2RHaGxJR1pwWld4a0lHQnVZVzFsWUNCaGJtUWdZSFpoYkdBZ1ptOXlJRndpYlhWc2RHbHdZWEowTDJadmNtMHRaR0YwWVZ3aVhHNGdLaUJ5WlhGMVpYTjBJR0p2WkdsbGN5NWNiaUFxWEc0Z0tpQmdZR0FnYW5OY2JpQXFJSEpsY1hWbGMzUXVjRzl6ZENnbkwzVndiRzloWkNjcFhHNGdLaUFnSUM1bWFXVnNaQ2duWm05dkp5d2dKMkpoY2ljcFhHNGdLaUFnSUM1bGJtUW9ZMkZzYkdKaFkyc3BPMXh1SUNvZ1lHQmdYRzRnS2x4dUlDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHNWhiV1ZjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZkVKc2IySjhSbWxzWlgwZ2RtRnNYRzRnS2lCQWNtVjBkWEp1SUh0U1pYRjFaWE4wZlNCbWIzSWdZMmhoYVc1cGJtZGNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaTljYmx4dVVtVnhkV1Z6ZEM1d2NtOTBiM1I1Y0dVdVptbGxiR1FnUFNCbWRXNWpkR2x2YmlodVlXMWxMQ0IyWVd3cGUxeHVJQ0JwWmlBb0lYUm9hWE11WDJadmNtMUVZWFJoS1NCMGFHbHpMbDltYjNKdFJHRjBZU0E5SUc1bGR5QkdiM0p0UkdGMFlTZ3BPMXh1SUNCMGFHbHpMbDltYjNKdFJHRjBZUzVoY0hCbGJtUW9ibUZ0WlN3Z2RtRnNLVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTTdYRzU5TzF4dVhHNHZLaXBjYmlBcUlGRjFaWFZsSUhSb1pTQm5hWFpsYmlCZ1ptbHNaV0FnWVhNZ1lXNGdZWFIwWVdOb2JXVnVkQ0IwYnlCMGFHVWdjM0JsWTJsbWFXVmtJR0JtYVdWc1pHQXNYRzRnS2lCM2FYUm9JRzl3ZEdsdmJtRnNJR0JtYVd4bGJtRnRaV0F1WEc0Z0tseHVJQ29nWUdCZ0lHcHpYRzRnS2lCeVpYRjFaWE4wTG5CdmMzUW9KeTkxY0d4dllXUW5LVnh1SUNvZ0lDQXVZWFIwWVdOb0tHNWxkeUJDYkc5aUtGc25QR0VnYVdROVhDSmhYQ0krUEdJZ2FXUTlYQ0ppWENJK2FHVjVJVHd2WWo0OEwyRStKMTBzSUhzZ2RIbHdaVG9nWENKMFpYaDBMMmgwYld4Y0luMHBLVnh1SUNvZ0lDQXVaVzVrS0dOaGJHeGlZV05yS1R0Y2JpQXFJR0JnWUZ4dUlDcGNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JtYVdWc1pGeHVJQ29nUUhCaGNtRnRJSHRDYkc5aWZFWnBiR1Y5SUdacGJHVmNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JtYVd4bGJtRnRaVnh1SUNvZ1FISmxkSFZ5YmlCN1VtVnhkV1Z6ZEgwZ1ptOXlJR05vWVdsdWFXNW5YRzRnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ292WEc1Y2JsSmxjWFZsYzNRdWNISnZkRzkwZVhCbExtRjBkR0ZqYUNBOUlHWjFibU4wYVc5dUtHWnBaV3hrTENCbWFXeGxMQ0JtYVd4bGJtRnRaU2w3WEc0Z0lHbG1JQ2doZEdocGN5NWZabTl5YlVSaGRHRXBJSFJvYVhNdVgyWnZjbTFFWVhSaElEMGdibVYzSUVadmNtMUVZWFJoS0NrN1hHNGdJSFJvYVhNdVgyWnZjbTFFWVhSaExtRndjR1Z1WkNobWFXVnNaQ3dnWm1sc1pTd2dabWxzWlc1aGJXVXBPMXh1SUNCeVpYUjFjbTRnZEdocGN6dGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1UyVnVaQ0JnWkdGMFlXQXNJR1JsWm1GMWJIUnBibWNnZEdobElHQXVkSGx3WlNncFlDQjBieUJjSW1wemIyNWNJaUIzYUdWdVhHNGdLaUJoYmlCdlltcGxZM1FnYVhNZ1oybDJaVzR1WEc0Z0tseHVJQ29nUlhoaGJYQnNaWE02WEc0Z0tseHVJQ29nSUNBZ0lDQWdMeThnY1hWbGNubHpkSEpwYm1kY2JpQXFJQ0FnSUNBZ0lISmxjWFZsYzNRdVoyVjBLQ2N2YzJWaGNtTm9KeWxjYmlBcUlDQWdJQ0FnSUNBZ0xtVnVaQ2hqWVd4c1ltRmpheWxjYmlBcVhHNGdLaUFnSUNBZ0lDQXZMeUJ0ZFd4MGFYQnNaU0JrWVhSaElGd2lkM0pwZEdWelhDSmNiaUFxSUNBZ0lDQWdJSEpsY1hWbGMzUXVaMlYwS0NjdmMyVmhjbU5vSnlsY2JpQXFJQ0FnSUNBZ0lDQWdMbk5sYm1Rb2V5QnpaV0Z5WTJnNklDZHhkV1Z5ZVNjZ2ZTbGNiaUFxSUNBZ0lDQWdJQ0FnTG5ObGJtUW9leUJ5WVc1blpUb2dKekV1TGpVbklIMHBYRzRnS2lBZ0lDQWdJQ0FnSUM1elpXNWtLSHNnYjNKa1pYSTZJQ2RrWlhOakp5QjlLVnh1SUNvZ0lDQWdJQ0FnSUNBdVpXNWtLR05oYkd4aVlXTnJLVnh1SUNwY2JpQXFJQ0FnSUNBZ0lDOHZJRzFoYm5WaGJDQnFjMjl1WEc0Z0tpQWdJQ0FnSUNCeVpYRjFaWE4wTG5CdmMzUW9KeTkxYzJWeUp5bGNiaUFxSUNBZ0lDQWdJQ0FnTG5SNWNHVW9KMnB6YjI0bktWeHVJQ29nSUNBZ0lDQWdJQ0F1YzJWdVpDZ25lMXdpYm1GdFpWd2lPbHdpZEdwY0luMHBYRzRnS2lBZ0lDQWdJQ0FnSUM1bGJtUW9ZMkZzYkdKaFkyc3BYRzRnS2x4dUlDb2dJQ0FnSUNBZ0x5OGdZWFYwYnlCcWMyOXVYRzRnS2lBZ0lDQWdJQ0J5WlhGMVpYTjBMbkJ2YzNRb0p5OTFjMlZ5SnlsY2JpQXFJQ0FnSUNBZ0lDQWdMbk5sYm1Rb2V5QnVZVzFsT2lBbmRHb25JSDBwWEc0Z0tpQWdJQ0FnSUNBZ0lDNWxibVFvWTJGc2JHSmhZMnNwWEc0Z0tseHVJQ29nSUNBZ0lDQWdMeThnYldGdWRXRnNJSGd0ZDNkM0xXWnZjbTB0ZFhKc1pXNWpiMlJsWkZ4dUlDb2dJQ0FnSUNBZ2NtVnhkV1Z6ZEM1d2IzTjBLQ2N2ZFhObGNpY3BYRzRnS2lBZ0lDQWdJQ0FnSUM1MGVYQmxLQ2RtYjNKdEp5bGNiaUFxSUNBZ0lDQWdJQ0FnTG5ObGJtUW9KMjVoYldVOWRHb25LVnh1SUNvZ0lDQWdJQ0FnSUNBdVpXNWtLR05oYkd4aVlXTnJLVnh1SUNwY2JpQXFJQ0FnSUNBZ0lDOHZJR0YxZEc4Z2VDMTNkM2N0Wm05eWJTMTFjbXhsYm1OdlpHVmtYRzRnS2lBZ0lDQWdJQ0J5WlhGMVpYTjBMbkJ2YzNRb0p5OTFjMlZ5SnlsY2JpQXFJQ0FnSUNBZ0lDQWdMblI1Y0dVb0oyWnZjbTBuS1Z4dUlDb2dJQ0FnSUNBZ0lDQXVjMlZ1WkNoN0lHNWhiV1U2SUNkMGFpY2dmU2xjYmlBcUlDQWdJQ0FnSUNBZ0xtVnVaQ2hqWVd4c1ltRmpheWxjYmlBcVhHNGdLaUFnSUNBZ0lDQXZMeUJrWldaaGRXeDBjeUIwYnlCNExYZDNkeTFtYjNKdExYVnliR1Z1WTI5a1pXUmNiaUFnS2lBZ0lDQWdJSEpsY1hWbGMzUXVjRzl6ZENnbkwzVnpaWEluS1Z4dUlDQXFJQ0FnSUNBZ0lDQXVjMlZ1WkNnbmJtRnRaVDEwYjJKcEp5bGNiaUFnS2lBZ0lDQWdJQ0FnTG5ObGJtUW9KM053WldOcFpYTTlabVZ5Y21WMEp5bGNiaUFnS2lBZ0lDQWdJQ0FnTG1WdVpDaGpZV3hzWW1GamF5bGNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjN4UFltcGxZM1I5SUdSaGRHRmNiaUFxSUVCeVpYUjFjbTRnZTFKbGNYVmxjM1I5SUdadmNpQmphR0ZwYm1sdVoxeHVJQ29nUUdGd2FTQndkV0pzYVdOY2JpQXFMMXh1WEc1U1pYRjFaWE4wTG5CeWIzUnZkSGx3WlM1elpXNWtJRDBnWm5WdVkzUnBiMjRvWkdGMFlTbDdYRzRnSUhaaGNpQnZZbW9nUFNCcGMwOWlhbVZqZENoa1lYUmhLVHRjYmlBZ2RtRnlJSFI1Y0dVZ1BTQjBhR2x6TG1kbGRFaGxZV1JsY2lnblEyOXVkR1Z1ZEMxVWVYQmxKeWs3WEc1Y2JpQWdMeThnYldWeVoyVmNiaUFnYVdZZ0tHOWlhaUFtSmlCcGMwOWlhbVZqZENoMGFHbHpMbDlrWVhSaEtTa2dlMXh1SUNBZ0lHWnZjaUFvZG1GeUlHdGxlU0JwYmlCa1lYUmhLU0I3WEc0Z0lDQWdJQ0IwYUdsekxsOWtZWFJoVzJ0bGVWMGdQU0JrWVhSaFcydGxlVjA3WEc0Z0lDQWdmVnh1SUNCOUlHVnNjMlVnYVdZZ0tDZHpkSEpwYm1jbklEMDlJSFI1Y0dWdlppQmtZWFJoS1NCN1hHNGdJQ0FnYVdZZ0tDRjBlWEJsS1NCMGFHbHpMblI1Y0dVb0oyWnZjbTBuS1R0Y2JpQWdJQ0IwZVhCbElEMGdkR2hwY3k1blpYUklaV0ZrWlhJb0owTnZiblJsYm5RdFZIbHdaU2NwTzF4dUlDQWdJR2xtSUNnbllYQndiR2xqWVhScGIyNHZlQzEzZDNjdFptOXliUzExY214bGJtTnZaR1ZrSnlBOVBTQjBlWEJsS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbDlrWVhSaElEMGdkR2hwY3k1ZlpHRjBZVnh1SUNBZ0lDQWdJQ0EvSUhSb2FYTXVYMlJoZEdFZ0t5QW5KaWNnS3lCa1lYUmhYRzRnSUNBZ0lDQWdJRG9nWkdGMFlUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnZEdocGN5NWZaR0YwWVNBOUlDaDBhR2x6TGw5a1lYUmhJSHg4SUNjbktTQXJJR1JoZEdFN1hHNGdJQ0FnZlZ4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhSb2FYTXVYMlJoZEdFZ1BTQmtZWFJoTzF4dUlDQjlYRzVjYmlBZ2FXWWdLQ0Z2WW1vcElISmxkSFZ5YmlCMGFHbHpPMXh1SUNCcFppQW9JWFI1Y0dVcElIUm9hWE11ZEhsd1pTZ25hbk52YmljcE8xeHVJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JuMDdYRzVjYmk4cUtseHVJQ29nU1c1MmIydGxJSFJvWlNCallXeHNZbUZqYXlCM2FYUm9JR0JsY25KZ0lHRnVaQ0JnY21WellGeHVJQ29nWVc1a0lHaGhibVJzWlNCaGNtbDBlU0JqYUdWamF5NWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UwVnljbTl5ZlNCbGNuSmNiaUFxSUVCd1lYSmhiU0I3VW1WemNHOXVjMlY5SUhKbGMxeHVJQ29nUUdGd2FTQndjbWwyWVhSbFhHNGdLaTljYmx4dVVtVnhkV1Z6ZEM1d2NtOTBiM1I1Y0dVdVkyRnNiR0poWTJzZ1BTQm1kVzVqZEdsdmJpaGxjbklzSUhKbGN5bDdYRzRnSUhaaGNpQm1iaUE5SUhSb2FYTXVYMk5oYkd4aVlXTnJPMXh1SUNCMGFHbHpMbU5zWldGeVZHbHRaVzkxZENncE8xeHVJQ0JwWmlBb01pQTlQU0JtYmk1c1pXNW5kR2dwSUhKbGRIVnliaUJtYmlobGNuSXNJSEpsY3lrN1hHNGdJR2xtSUNobGNuSXBJSEpsZEhWeWJpQjBhR2x6TG1WdGFYUW9KMlZ5Y205eUp5d2daWEp5S1R0Y2JpQWdabTRvY21WektUdGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1NXNTJiMnRsSUdOaGJHeGlZV05ySUhkcGRHZ2dlQzFrYjIxaGFXNGdaWEp5YjNJdVhHNGdLbHh1SUNvZ1FHRndhU0J3Y21sMllYUmxYRzRnS2k5Y2JseHVVbVZ4ZFdWemRDNXdjbTkwYjNSNWNHVXVZM0p2YzNORWIyMWhhVzVGY25KdmNpQTlJR1oxYm1OMGFXOXVLQ2w3WEc0Z0lIWmhjaUJsY25JZ1BTQnVaWGNnUlhKeWIzSW9KMDl5YVdkcGJpQnBjeUJ1YjNRZ1lXeHNiM2RsWkNCaWVTQkJZMk5sYzNNdFEyOXVkSEp2YkMxQmJHeHZkeTFQY21sbmFXNG5LVHRjYmlBZ1pYSnlMbU55YjNOelJHOXRZV2x1SUQwZ2RISjFaVHRjYmlBZ2RHaHBjeTVqWVd4c1ltRmpheWhsY25JcE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCSmJuWnZhMlVnWTJGc2JHSmhZMnNnZDJsMGFDQjBhVzFsYjNWMElHVnljbTl5TGx4dUlDcGNiaUFxSUVCaGNHa2djSEpwZG1GMFpWeHVJQ292WEc1Y2JsSmxjWFZsYzNRdWNISnZkRzkwZVhCbExuUnBiV1Z2ZFhSRmNuSnZjaUE5SUdaMWJtTjBhVzl1S0NsN1hHNGdJSFpoY2lCMGFXMWxiM1YwSUQwZ2RHaHBjeTVmZEdsdFpXOTFkRHRjYmlBZ2RtRnlJR1Z5Y2lBOUlHNWxkeUJGY25KdmNpZ25kR2x0Wlc5MWRDQnZaaUFuSUNzZ2RHbHRaVzkxZENBcklDZHRjeUJsZUdObFpXUmxaQ2NwTzF4dUlDQmxjbkl1ZEdsdFpXOTFkQ0E5SUhScGJXVnZkWFE3WEc0Z0lIUm9hWE11WTJGc2JHSmhZMnNvWlhKeUtUdGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1JXNWhZbXhsSUhSeVlXNXpiV2x6YzJsdmJpQnZaaUJqYjI5cmFXVnpJSGRwZEdnZ2VDMWtiMjFoYVc0Z2NtVnhkV1Z6ZEhNdVhHNGdLbHh1SUNvZ1RtOTBaU0IwYUdGMElHWnZjaUIwYUdseklIUnZJSGR2Y21zZ2RHaGxJRzl5YVdkcGJpQnRkWE4wSUc1dmRDQmlaVnh1SUNvZ2RYTnBibWNnWENKQlkyTmxjM010UTI5dWRISnZiQzFCYkd4dmR5MVBjbWxuYVc1Y0lpQjNhWFJvSUdFZ2QybHNaR05oY21Rc1hHNGdLaUJoYm1RZ1lXeHpieUJ0ZFhOMElITmxkQ0JjSWtGalkyVnpjeTFEYjI1MGNtOXNMVUZzYkc5M0xVTnlaV1JsYm5ScFlXeHpYQ0pjYmlBcUlIUnZJRndpZEhKMVpWd2lMbHh1SUNwY2JpQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0tpOWNibHh1VW1WeGRXVnpkQzV3Y205MGIzUjVjR1V1ZDJsMGFFTnlaV1JsYm5ScFlXeHpJRDBnWm5WdVkzUnBiMjRvS1h0Y2JpQWdkR2hwY3k1ZmQybDBhRU55WldSbGJuUnBZV3h6SUQwZ2RISjFaVHRjYmlBZ2NtVjBkWEp1SUhSb2FYTTdYRzU5TzF4dVhHNHZLaXBjYmlBcUlFbHVhWFJwWVhSbElISmxjWFZsYzNRc0lHbHVkbTlyYVc1bklHTmhiR3hpWVdOcklHQm1iaWh5WlhNcFlGeHVJQ29nZDJsMGFDQmhiaUJwYm5OMFlXNWpaVzltSUdCU1pYTndiMjV6WldBdVhHNGdLbHh1SUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ1ptNWNiaUFxSUVCeVpYUjFjbTRnZTFKbGNYVmxjM1I5SUdadmNpQmphR0ZwYm1sdVoxeHVJQ29nUUdGd2FTQndkV0pzYVdOY2JpQXFMMXh1WEc1U1pYRjFaWE4wTG5CeWIzUnZkSGx3WlM1bGJtUWdQU0JtZFc1amRHbHZiaWhtYmlsN1hHNGdJSFpoY2lCelpXeG1JRDBnZEdocGN6dGNiaUFnZG1GeUlIaG9jaUE5SUhSb2FYTXVlR2h5SUQwZ1oyVjBXRWhTS0NrN1hHNGdJSFpoY2lCeGRXVnllU0E5SUhSb2FYTXVYM0YxWlhKNUxtcHZhVzRvSnlZbktUdGNiaUFnZG1GeUlIUnBiV1Z2ZFhRZ1BTQjBhR2x6TGw5MGFXMWxiM1YwTzF4dUlDQjJZWElnWkdGMFlTQTlJSFJvYVhNdVgyWnZjbTFFWVhSaElIeDhJSFJvYVhNdVgyUmhkR0U3WEc1Y2JpQWdMeThnYzNSdmNtVWdZMkZzYkdKaFkydGNiaUFnZEdocGN5NWZZMkZzYkdKaFkyc2dQU0JtYmlCOGZDQnViMjl3TzF4dVhHNGdJQzh2SUhOMFlYUmxJR05vWVc1blpWeHVJQ0I0YUhJdWIyNXlaV0ZrZVhOMFlYUmxZMmhoYm1kbElEMGdablZ1WTNScGIyNG9LWHRjYmlBZ0lDQnBaaUFvTkNBaFBTQjRhSEl1Y21WaFpIbFRkR0YwWlNrZ2NtVjBkWEp1TzF4dUlDQWdJR2xtSUNnd0lEMDlJSGhvY2k1emRHRjBkWE1wSUh0Y2JpQWdJQ0FnSUdsbUlDaHpaV3htTG1GaWIzSjBaV1FwSUhKbGRIVnliaUJ6Wld4bUxuUnBiV1Z2ZFhSRmNuSnZjaWdwTzF4dUlDQWdJQ0FnY21WMGRYSnVJSE5sYkdZdVkzSnZjM05FYjIxaGFXNUZjbkp2Y2lncE8xeHVJQ0FnSUgxY2JpQWdJQ0J6Wld4bUxtVnRhWFFvSjJWdVpDY3BPMXh1SUNCOU8xeHVYRzRnSUM4dklIQnliMmR5WlhOelhHNGdJR2xtSUNoNGFISXVkWEJzYjJGa0tTQjdYRzRnSUNBZ2VHaHlMblZ3Ykc5aFpDNXZibkJ5YjJkeVpYTnpJRDBnWm5WdVkzUnBiMjRvWlNsN1hHNGdJQ0FnSUNCbExuQmxjbU5sYm5RZ1BTQmxMbXh2WVdSbFpDQXZJR1V1ZEc5MFlXd2dLaUF4TURBN1hHNGdJQ0FnSUNCelpXeG1MbVZ0YVhRb0ozQnliMmR5WlhOekp5d2daU2s3WEc0Z0lDQWdmVHRjYmlBZ2ZWeHVYRzRnSUM4dklIUnBiV1Z2ZFhSY2JpQWdhV1lnS0hScGJXVnZkWFFnSmlZZ0lYUm9hWE11WDNScGJXVnlLU0I3WEc0Z0lDQWdkR2hwY3k1ZmRHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUtDbDdYRzRnSUNBZ0lDQnpaV3htTG1GaWIzSjBLQ2s3WEc0Z0lDQWdmU3dnZEdsdFpXOTFkQ2s3WEc0Z0lIMWNibHh1SUNBdkx5QnhkV1Z5ZVhOMGNtbHVaMXh1SUNCcFppQW9jWFZsY25rcElIdGNiaUFnSUNCeGRXVnllU0E5SUhKbGNYVmxjM1F1YzJWeWFXRnNhWHBsVDJKcVpXTjBLSEYxWlhKNUtUdGNiaUFnSUNCMGFHbHpMblZ5YkNBclBTQitkR2hwY3k1MWNtd3VhVzVrWlhoUFppZ25QeWNwWEc0Z0lDQWdJQ0EvSUNjbUp5QXJJSEYxWlhKNVhHNGdJQ0FnSUNBNklDYy9KeUFySUhGMVpYSjVPMXh1SUNCOVhHNWNiaUFnTHk4Z2FXNXBkR2xoZEdVZ2NtVnhkV1Z6ZEZ4dUlDQjRhSEl1YjNCbGJpaDBhR2x6TG0xbGRHaHZaQ3dnZEdocGN5NTFjbXdzSUhSeWRXVXBPMXh1WEc0Z0lDOHZJRU5QVWxOY2JpQWdhV1lnS0hSb2FYTXVYM2RwZEdoRGNtVmtaVzUwYVdGc2N5a2dlR2h5TG5kcGRHaERjbVZrWlc1MGFXRnNjeUE5SUhSeWRXVTdYRzVjYmlBZ0x5OGdZbTlrZVZ4dUlDQnBaaUFvSjBkRlZDY2dJVDBnZEdocGN5NXRaWFJvYjJRZ0ppWWdKMGhGUVVRbklDRTlJSFJvYVhNdWJXVjBhRzlrSUNZbUlDZHpkSEpwYm1jbklDRTlJSFI1Y0dWdlppQmtZWFJoSUNZbUlDRnBjMGh2YzNRb1pHRjBZU2twSUh0Y2JpQWdJQ0F2THlCelpYSnBZV3hwZW1VZ2MzUjFabVpjYmlBZ0lDQjJZWElnYzJWeWFXRnNhWHBsSUQwZ2NtVnhkV1Z6ZEM1elpYSnBZV3hwZW1WYmRHaHBjeTVuWlhSSVpXRmtaWElvSjBOdmJuUmxiblF0Vkhsd1pTY3BYVHRjYmlBZ0lDQnBaaUFvYzJWeWFXRnNhWHBsS1NCa1lYUmhJRDBnYzJWeWFXRnNhWHBsS0dSaGRHRXBPMXh1SUNCOVhHNWNiaUFnTHk4Z2MyVjBJR2hsWVdSbGNpQm1hV1ZzWkhOY2JpQWdabTl5SUNoMllYSWdabWxsYkdRZ2FXNGdkR2hwY3k1b1pXRmtaWElwSUh0Y2JpQWdJQ0JwWmlBb2JuVnNiQ0E5UFNCMGFHbHpMbWhsWVdSbGNsdG1hV1ZzWkYwcElHTnZiblJwYm5WbE8xeHVJQ0FnSUhob2NpNXpaWFJTWlhGMVpYTjBTR1ZoWkdWeUtHWnBaV3hrTENCMGFHbHpMbWhsWVdSbGNsdG1hV1ZzWkYwcE8xeHVJQ0I5WEc1Y2JpQWdMeThnYzJWdVpDQnpkSFZtWmx4dUlDQjBhR2x6TG1WdGFYUW9KM0psY1hWbGMzUW5MQ0IwYUdsektUdGNiaUFnZUdoeUxuTmxibVFvWkdGMFlTazdYRzRnSUhKbGRIVnliaUIwYUdsek8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCRmVIQnZjMlVnWUZKbGNYVmxjM1JnTGx4dUlDb3ZYRzVjYm5KbGNYVmxjM1F1VW1WeGRXVnpkQ0E5SUZKbGNYVmxjM1E3WEc1Y2JpOHFLbHh1SUNvZ1NYTnpkV1VnWVNCeVpYRjFaWE4wT2x4dUlDcGNiaUFxSUVWNFlXMXdiR1Z6T2x4dUlDcGNiaUFxSUNBZ0lISmxjWFZsYzNRb0owZEZWQ2NzSUNjdmRYTmxjbk1uS1M1bGJtUW9ZMkZzYkdKaFkyc3BYRzRnS2lBZ0lDQnlaWEYxWlhOMEtDY3ZkWE5sY25NbktTNWxibVFvWTJGc2JHSmhZMnNwWEc0Z0tpQWdJQ0J5WlhGMVpYTjBLQ2N2ZFhObGNuTW5MQ0JqWVd4c1ltRmpheWxjYmlBcVhHNGdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdiV1YwYUc5a1hHNGdLaUJBY0dGeVlXMGdlMU4wY21sdVozeEdkVzVqZEdsdmJuMGdkWEpzSUc5eUlHTmhiR3hpWVdOclhHNGdLaUJBY21WMGRYSnVJSHRTWlhGMVpYTjBmVnh1SUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFxTDF4dVhHNW1kVzVqZEdsdmJpQnlaWEYxWlhOMEtHMWxkR2h2WkN3Z2RYSnNLU0I3WEc0Z0lDOHZJR05oYkd4aVlXTnJYRzRnSUdsbUlDZ25ablZ1WTNScGIyNG5JRDA5SUhSNWNHVnZaaUIxY213cElIdGNiaUFnSUNCeVpYUjFjbTRnYm1WM0lGSmxjWFZsYzNRb0owZEZWQ2NzSUcxbGRHaHZaQ2t1Wlc1a0tIVnliQ2s3WEc0Z0lIMWNibHh1SUNBdkx5QjFjbXdnWm1seWMzUmNiaUFnYVdZZ0tERWdQVDBnWVhKbmRXMWxiblJ6TG14bGJtZDBhQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVW1WeGRXVnpkQ2duUjBWVUp5d2diV1YwYUc5a0tUdGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQnVaWGNnVW1WeGRXVnpkQ2h0WlhSb2IyUXNJSFZ5YkNrN1hHNTlYRzVjYmk4cUtseHVJQ29nUjBWVUlHQjFjbXhnSUhkcGRHZ2diM0IwYVc5dVlXd2dZMkZzYkdKaFkyc2dZR1p1S0hKbGN5bGdMbHh1SUNwY2JpQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQjFjbXhjYmlBcUlFQndZWEpoYlNCN1RXbDRaV1I4Um5WdVkzUnBiMjU5SUdSaGRHRWdiM0lnWm01Y2JpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJR1p1WEc0Z0tpQkFjbVYwZFhKdUlIdFNaWEYxWlhOMGZWeHVJQ29nUUdGd2FTQndkV0pzYVdOY2JpQXFMMXh1WEc1eVpYRjFaWE4wTG1kbGRDQTlJR1oxYm1OMGFXOXVLSFZ5YkN3Z1pHRjBZU3dnWm00cGUxeHVJQ0IyWVhJZ2NtVnhJRDBnY21WeGRXVnpkQ2duUjBWVUp5d2dkWEpzS1R0Y2JpQWdhV1lnS0NkbWRXNWpkR2x2YmljZ1BUMGdkSGx3Wlc5bUlHUmhkR0VwSUdadUlEMGdaR0YwWVN3Z1pHRjBZU0E5SUc1MWJHdzdYRzRnSUdsbUlDaGtZWFJoS1NCeVpYRXVjWFZsY25rb1pHRjBZU2s3WEc0Z0lHbG1JQ2htYmlrZ2NtVnhMbVZ1WkNobWJpazdYRzRnSUhKbGRIVnliaUJ5WlhFN1hHNTlPMXh1WEc0dktpcGNiaUFxSUVoRlFVUWdZSFZ5YkdBZ2QybDBhQ0J2Y0hScGIyNWhiQ0JqWVd4c1ltRmpheUJnWm00b2NtVnpLV0F1WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFZ5YkZ4dUlDb2dRSEJoY21GdElIdE5hWGhsWkh4R2RXNWpkR2x2Ym4wZ1pHRjBZU0J2Y2lCbWJseHVJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnWm01Y2JpQXFJRUJ5WlhSMWNtNGdlMUpsY1hWbGMzUjlYRzRnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ292WEc1Y2JuSmxjWFZsYzNRdWFHVmhaQ0E5SUdaMWJtTjBhVzl1S0hWeWJDd2daR0YwWVN3Z1ptNHBlMXh1SUNCMllYSWdjbVZ4SUQwZ2NtVnhkV1Z6ZENnblNFVkJSQ2NzSUhWeWJDazdYRzRnSUdsbUlDZ25ablZ1WTNScGIyNG5JRDA5SUhSNWNHVnZaaUJrWVhSaEtTQm1iaUE5SUdSaGRHRXNJR1JoZEdFZ1BTQnVkV3hzTzF4dUlDQnBaaUFvWkdGMFlTa2djbVZ4TG5ObGJtUW9aR0YwWVNrN1hHNGdJR2xtSUNobWJpa2djbVZ4TG1WdVpDaG1iaWs3WEc0Z0lISmxkSFZ5YmlCeVpYRTdYRzU5TzF4dVhHNHZLaXBjYmlBcUlFUkZURVZVUlNCZ2RYSnNZQ0IzYVhSb0lHOXdkR2x2Ym1Gc0lHTmhiR3hpWVdOcklHQm1iaWh5WlhNcFlDNWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2RYSnNYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCbWJseHVJQ29nUUhKbGRIVnliaUI3VW1WeGRXVnpkSDFjYmlBcUlFQmhjR2tnY0hWaWJHbGpYRzRnS2k5Y2JseHVjbVZ4ZFdWemRDNWtaV3dnUFNCbWRXNWpkR2x2YmloMWNtd3NJR1p1S1h0Y2JpQWdkbUZ5SUhKbGNTQTlJSEpsY1hWbGMzUW9KMFJGVEVWVVJTY3NJSFZ5YkNrN1hHNGdJR2xtSUNobWJpa2djbVZ4TG1WdVpDaG1iaWs3WEc0Z0lISmxkSFZ5YmlCeVpYRTdYRzU5TzF4dVhHNHZLaXBjYmlBcUlGQkJWRU5JSUdCMWNteGdJSGRwZEdnZ2IzQjBhVzl1WVd3Z1lHUmhkR0ZnSUdGdVpDQmpZV3hzWW1GamF5QmdabTRvY21WektXQXVYRzRnS2x4dUlDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIVnliRnh1SUNvZ1FIQmhjbUZ0SUh0TmFYaGxaSDBnWkdGMFlWeHVJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnWm01Y2JpQXFJRUJ5WlhSMWNtNGdlMUpsY1hWbGMzUjlYRzRnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ292WEc1Y2JuSmxjWFZsYzNRdWNHRjBZMmdnUFNCbWRXNWpkR2x2YmloMWNtd3NJR1JoZEdFc0lHWnVLWHRjYmlBZ2RtRnlJSEpsY1NBOUlISmxjWFZsYzNRb0oxQkJWRU5JSnl3Z2RYSnNLVHRjYmlBZ2FXWWdLQ2RtZFc1amRHbHZiaWNnUFQwZ2RIbHdaVzltSUdSaGRHRXBJR1p1SUQwZ1pHRjBZU3dnWkdGMFlTQTlJRzUxYkd3N1hHNGdJR2xtSUNoa1lYUmhLU0J5WlhFdWMyVnVaQ2hrWVhSaEtUdGNiaUFnYVdZZ0tHWnVLU0J5WlhFdVpXNWtLR1p1S1R0Y2JpQWdjbVYwZFhKdUlISmxjVHRjYm4wN1hHNWNiaThxS2x4dUlDb2dVRTlUVkNCZ2RYSnNZQ0IzYVhSb0lHOXdkR2x2Ym1Gc0lHQmtZWFJoWUNCaGJtUWdZMkZzYkdKaFkyc2dZR1p1S0hKbGN5bGdMbHh1SUNwY2JpQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQjFjbXhjYmlBcUlFQndZWEpoYlNCN1RXbDRaV1I5SUdSaGRHRmNiaUFxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUdadVhHNGdLaUJBY21WMGRYSnVJSHRTWlhGMVpYTjBmVnh1SUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFxTDF4dVhHNXlaWEYxWlhOMExuQnZjM1FnUFNCbWRXNWpkR2x2YmloMWNtd3NJR1JoZEdFc0lHWnVLWHRjYmlBZ2RtRnlJSEpsY1NBOUlISmxjWFZsYzNRb0oxQlBVMVFuTENCMWNtd3BPMXh1SUNCcFppQW9KMloxYm1OMGFXOXVKeUE5UFNCMGVYQmxiMllnWkdGMFlTa2dabTRnUFNCa1lYUmhMQ0JrWVhSaElEMGdiblZzYkR0Y2JpQWdhV1lnS0dSaGRHRXBJSEpsY1M1elpXNWtLR1JoZEdFcE8xeHVJQ0JwWmlBb1ptNHBJSEpsY1M1bGJtUW9abTRwTzF4dUlDQnlaWFIxY200Z2NtVnhPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQlFWVlFnWUhWeWJHQWdkMmwwYUNCdmNIUnBiMjVoYkNCZ1pHRjBZV0FnWVc1a0lHTmhiR3hpWVdOcklHQm1iaWh5WlhNcFlDNWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2RYSnNYRzRnS2lCQWNHRnlZVzBnZTAxcGVHVmtmRVoxYm1OMGFXOXVmU0JrWVhSaElHOXlJR1p1WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQm1ibHh1SUNvZ1FISmxkSFZ5YmlCN1VtVnhkV1Z6ZEgxY2JpQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0tpOWNibHh1Y21WeGRXVnpkQzV3ZFhRZ1BTQm1kVzVqZEdsdmJpaDFjbXdzSUdSaGRHRXNJR1p1S1h0Y2JpQWdkbUZ5SUhKbGNTQTlJSEpsY1hWbGMzUW9KMUJWVkNjc0lIVnliQ2s3WEc0Z0lHbG1JQ2duWm5WdVkzUnBiMjRuSUQwOUlIUjVjR1Z2WmlCa1lYUmhLU0JtYmlBOUlHUmhkR0VzSUdSaGRHRWdQU0J1ZFd4c08xeHVJQ0JwWmlBb1pHRjBZU2tnY21WeExuTmxibVFvWkdGMFlTazdYRzRnSUdsbUlDaG1iaWtnY21WeExtVnVaQ2htYmlrN1hHNGdJSEpsZEhWeWJpQnlaWEU3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRVY0Y0c5elpTQmdjbVZ4ZFdWemRHQXVYRzRnS2k5Y2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQnlaWEYxWlhOME8xeHVJaXdpWEc0dktpcGNiaUFxSUVWNGNHOXpaU0JnUlcxcGRIUmxjbUF1WEc0Z0tpOWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JGYldsMGRHVnlPMXh1WEc0dktpcGNiaUFxSUVsdWFYUnBZV3hwZW1VZ1lTQnVaWGNnWUVWdGFYUjBaWEpnTGx4dUlDcGNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaTljYmx4dVpuVnVZM1JwYjI0Z1JXMXBkSFJsY2lodlltb3BJSHRjYmlBZ2FXWWdLRzlpYWlrZ2NtVjBkWEp1SUcxcGVHbHVLRzlpYWlrN1hHNTlPMXh1WEc0dktpcGNiaUFxSUUxcGVHbHVJSFJvWlNCbGJXbDBkR1Z5SUhCeWIzQmxjblJwWlhNdVhHNGdLbHh1SUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5aWFseHVJQ29nUUhKbGRIVnliaUI3VDJKcVpXTjBmVnh1SUNvZ1FHRndhU0J3Y21sMllYUmxYRzRnS2k5Y2JseHVablZ1WTNScGIyNGdiV2w0YVc0b2IySnFLU0I3WEc0Z0lHWnZjaUFvZG1GeUlHdGxlU0JwYmlCRmJXbDBkR1Z5TG5CeWIzUnZkSGx3WlNrZ2UxeHVJQ0FnSUc5aWFsdHJaWGxkSUQwZ1JXMXBkSFJsY2k1d2NtOTBiM1I1Y0dWYmEyVjVYVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdiMkpxTzF4dWZWeHVYRzR2S2lwY2JpQXFJRXhwYzNSbGJpQnZiaUIwYUdVZ1oybDJaVzRnWUdWMlpXNTBZQ0IzYVhSb0lHQm1ibUF1WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJR1YyWlc1MFhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JtYmx4dUlDb2dRSEpsZEhWeWJpQjdSVzFwZEhSbGNuMWNiaUFxSUVCaGNHa2djSFZpYkdsalhHNGdLaTljYmx4dVJXMXBkSFJsY2k1d2NtOTBiM1I1Y0dVdWIyNGdQVnh1UlcxcGRIUmxjaTV3Y205MGIzUjVjR1V1WVdSa1JYWmxiblJNYVhOMFpXNWxjaUE5SUdaMWJtTjBhVzl1S0dWMlpXNTBMQ0JtYmlsN1hHNGdJSFJvYVhNdVgyTmhiR3hpWVdOcmN5QTlJSFJvYVhNdVgyTmhiR3hpWVdOcmN5QjhmQ0I3ZlR0Y2JpQWdLSFJvYVhNdVgyTmhiR3hpWVdOcmMxdGxkbVZ1ZEYwZ1BTQjBhR2x6TGw5allXeHNZbUZqYTNOYlpYWmxiblJkSUh4OElGdGRLVnh1SUNBZ0lDNXdkWE5vS0dadUtUdGNiaUFnY21WMGRYSnVJSFJvYVhNN1hHNTlPMXh1WEc0dktpcGNiaUFxSUVGa1pITWdZVzRnWUdWMlpXNTBZQ0JzYVhOMFpXNWxjaUIwYUdGMElIZHBiR3dnWW1VZ2FXNTJiMnRsWkNCaElITnBibWRzWlZ4dUlDb2dkR2x0WlNCMGFHVnVJR0YxZEc5dFlYUnBZMkZzYkhrZ2NtVnRiM1psWkM1Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnWlhabGJuUmNiaUFxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUdadVhHNGdLaUJBY21WMGRYSnVJSHRGYldsMGRHVnlmVnh1SUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFxTDF4dVhHNUZiV2wwZEdWeUxuQnliM1J2ZEhsd1pTNXZibU5sSUQwZ1puVnVZM1JwYjI0b1pYWmxiblFzSUdadUtYdGNiaUFnZG1GeUlITmxiR1lnUFNCMGFHbHpPMXh1SUNCMGFHbHpMbDlqWVd4c1ltRmphM01nUFNCMGFHbHpMbDlqWVd4c1ltRmphM01nZkh3Z2UzMDdYRzVjYmlBZ1puVnVZM1JwYjI0Z2IyNG9LU0I3WEc0Z0lDQWdjMlZzWmk1dlptWW9aWFpsYm5Rc0lHOXVLVHRjYmlBZ0lDQm1iaTVoY0hCc2VTaDBhR2x6TENCaGNtZDFiV1Z1ZEhNcE8xeHVJQ0I5WEc1Y2JpQWdiMjR1Wm00Z1BTQm1ianRjYmlBZ2RHaHBjeTV2YmlobGRtVnVkQ3dnYjI0cE8xeHVJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JuMDdYRzVjYmk4cUtseHVJQ29nVW1WdGIzWmxJSFJvWlNCbmFYWmxiaUJqWVd4c1ltRmpheUJtYjNJZ1lHVjJaVzUwWUNCdmNpQmhiR3hjYmlBcUlISmxaMmx6ZEdWeVpXUWdZMkZzYkdKaFkydHpMbHh1SUNwY2JpQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmxkbVZ1ZEZ4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdabTVjYmlBcUlFQnlaWFIxY200Z2UwVnRhWFIwWlhKOVhHNGdLaUJBWVhCcElIQjFZbXhwWTF4dUlDb3ZYRzVjYmtWdGFYUjBaWEl1Y0hKdmRHOTBlWEJsTG05bVppQTlYRzVGYldsMGRHVnlMbkJ5YjNSdmRIbHdaUzV5WlcxdmRtVk1hWE4wWlc1bGNpQTlYRzVGYldsMGRHVnlMbkJ5YjNSdmRIbHdaUzV5WlcxdmRtVkJiR3hNYVhOMFpXNWxjbk1nUFZ4dVJXMXBkSFJsY2k1d2NtOTBiM1I1Y0dVdWNtVnRiM1psUlhabGJuUk1hWE4wWlc1bGNpQTlJR1oxYm1OMGFXOXVLR1YyWlc1MExDQm1iaWw3WEc0Z0lIUm9hWE11WDJOaGJHeGlZV05yY3lBOUlIUm9hWE11WDJOaGJHeGlZV05yY3lCOGZDQjdmVHRjYmx4dUlDQXZMeUJoYkd4Y2JpQWdhV1lnS0RBZ1BUMGdZWEpuZFcxbGJuUnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lIUm9hWE11WDJOaGJHeGlZV05yY3lBOUlIdDlPMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNCOVhHNWNiaUFnTHk4Z2MzQmxZMmxtYVdNZ1pYWmxiblJjYmlBZ2RtRnlJR05oYkd4aVlXTnJjeUE5SUhSb2FYTXVYMk5oYkd4aVlXTnJjMXRsZG1WdWRGMDdYRzRnSUdsbUlDZ2hZMkZzYkdKaFkydHpLU0J5WlhSMWNtNGdkR2hwY3p0Y2JseHVJQ0F2THlCeVpXMXZkbVVnWVd4c0lHaGhibVJzWlhKelhHNGdJR2xtSUNneElEMDlJR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQmtaV3hsZEdVZ2RHaHBjeTVmWTJGc2JHSmhZMnR6VzJWMlpXNTBYVHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjenRjYmlBZ2ZWeHVYRzRnSUM4dklISmxiVzkyWlNCemNHVmphV1pwWXlCb1lXNWtiR1Z5WEc0Z0lIWmhjaUJqWWp0Y2JpQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0JqWVd4c1ltRmphM011YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNCallpQTlJR05oYkd4aVlXTnJjMXRwWFR0Y2JpQWdJQ0JwWmlBb1kySWdQVDA5SUdadUlIeDhJR05pTG1adUlEMDlQU0JtYmlrZ2UxeHVJQ0FnSUNBZ1kyRnNiR0poWTJ0ekxuTndiR2xqWlNocExDQXhLVHRjYmlBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnZEdocGN6dGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1JXMXBkQ0JnWlhabGJuUmdJSGRwZEdnZ2RHaGxJR2RwZG1WdUlHRnlaM011WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJR1YyWlc1MFhHNGdLaUJBY0dGeVlXMGdlMDFwZUdWa2ZTQXVMaTVjYmlBcUlFQnlaWFIxY200Z2UwVnRhWFIwWlhKOVhHNGdLaTljYmx4dVJXMXBkSFJsY2k1d2NtOTBiM1I1Y0dVdVpXMXBkQ0E5SUdaMWJtTjBhVzl1S0dWMlpXNTBLWHRjYmlBZ2RHaHBjeTVmWTJGc2JHSmhZMnR6SUQwZ2RHaHBjeTVmWTJGc2JHSmhZMnR6SUh4OElIdDlPMXh1SUNCMllYSWdZWEpuY3lBOUlGdGRMbk5zYVdObExtTmhiR3dvWVhKbmRXMWxiblJ6TENBeEtWeHVJQ0FnSUN3Z1kyRnNiR0poWTJ0eklEMGdkR2hwY3k1ZlkyRnNiR0poWTJ0elcyVjJaVzUwWFR0Y2JseHVJQ0JwWmlBb1kyRnNiR0poWTJ0ektTQjdYRzRnSUNBZ1kyRnNiR0poWTJ0eklEMGdZMkZzYkdKaFkydHpMbk5zYVdObEtEQXBPMXh1SUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3TENCc1pXNGdQU0JqWVd4c1ltRmphM011YkdWdVozUm9PeUJwSUR3Z2JHVnVPeUFySzJrcElIdGNiaUFnSUNBZ0lHTmhiR3hpWVdOcmMxdHBYUzVoY0hCc2VTaDBhR2x6TENCaGNtZHpLVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JuMDdYRzVjYmk4cUtseHVJQ29nVW1WMGRYSnVJR0Z5Y21GNUlHOW1JR05oYkd4aVlXTnJjeUJtYjNJZ1lHVjJaVzUwWUM1Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnWlhabGJuUmNiaUFxSUVCeVpYUjFjbTRnZTBGeWNtRjVmVnh1SUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFxTDF4dVhHNUZiV2wwZEdWeUxuQnliM1J2ZEhsd1pTNXNhWE4wWlc1bGNuTWdQU0JtZFc1amRHbHZiaWhsZG1WdWRDbDdYRzRnSUhSb2FYTXVYMk5oYkd4aVlXTnJjeUE5SUhSb2FYTXVYMk5oYkd4aVlXTnJjeUI4ZkNCN2ZUdGNiaUFnY21WMGRYSnVJSFJvYVhNdVgyTmhiR3hpWVdOcmMxdGxkbVZ1ZEYwZ2ZId2dXMTA3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRU5vWldOcklHbG1JSFJvYVhNZ1pXMXBkSFJsY2lCb1lYTWdZR1YyWlc1MFlDQm9ZVzVrYkdWeWN5NWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1pYWmxiblJjYmlBcUlFQnlaWFIxY200Z2UwSnZiMnhsWVc1OVhHNGdLaUJBWVhCcElIQjFZbXhwWTF4dUlDb3ZYRzVjYmtWdGFYUjBaWEl1Y0hKdmRHOTBlWEJsTG1oaGMweHBjM1JsYm1WeWN5QTlJR1oxYm1OMGFXOXVLR1YyWlc1MEtYdGNiaUFnY21WMGRYSnVJQ0VoSUhSb2FYTXViR2x6ZEdWdVpYSnpLR1YyWlc1MEtTNXNaVzVuZEdnN1hHNTlPMXh1SWl3aVhHNHZLaXBjYmlBcUlGSmxaSFZqWlNCZ1lYSnlZQ0IzYVhSb0lHQm1ibUF1WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdZWEp5WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQm1ibHh1SUNvZ1FIQmhjbUZ0SUh0TmFYaGxaSDBnYVc1cGRHbGhiRnh1SUNwY2JpQXFJRlJQUkU4NklHTnZiV0poZEdsaWJHVWdaWEp5YjNJZ2FHRnVaR3hwYm1jL1hHNGdLaTljYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCbWRXNWpkR2x2YmloaGNuSXNJR1p1TENCcGJtbDBhV0ZzS1hzZ0lGeHVJQ0IyWVhJZ2FXUjRJRDBnTUR0Y2JpQWdkbUZ5SUd4bGJpQTlJR0Z5Y2k1c1pXNW5kR2c3WEc0Z0lIWmhjaUJqZFhKeUlEMGdZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQTlQU0F6WEc0Z0lDQWdQeUJwYm1sMGFXRnNYRzRnSUNBZ09pQmhjbkpiYVdSNEt5dGRPMXh1WEc0Z0lIZG9hV3hsSUNocFpIZ2dQQ0JzWlc0cElIdGNiaUFnSUNCamRYSnlJRDBnWm00dVkyRnNiQ2h1ZFd4c0xDQmpkWEp5TENCaGNuSmJhV1I0WFN3Z0t5dHBaSGdzSUdGeWNpazdYRzRnSUgxY2JpQWdYRzRnSUhKbGRIVnliaUJqZFhKeU8xeHVmVHNpWFgwPQorCisndXNlIHN0cmljdCc7CisKK3dpbmRvdy5Td2FnZ2VyVWkgPSBCYWNrYm9uZS5Sb3V0ZXIuZXh0ZW5kKHsKKworICBkb21faWQ6ICdzd2FnZ2VyX3VpJywKKworICAvLyBBdHRyaWJ1dGVzCisgIG9wdGlvbnM6IG51bGwsCisgIGFwaTogbnVsbCwKKyAgaGVhZGVyVmlldzogbnVsbCwKKyAgbWFpblZpZXc6IG51bGwsCisKKyAgLy8gU3dhZ2dlclVpIGFjY2VwdHMgYWxsIHRoZSBzYW1lIG9wdGlvbnMgYXMgU3dhZ2dlckFwaQorICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKyAgICAvLyBBbGxvdyBkb21faWQgdG8gYmUgb3ZlcnJpZGRlbgorICAgIGlmIChvcHRpb25zLmRvbV9pZCkgeworICAgICAgdGhpcy5kb21faWQgPSBvcHRpb25zLmRvbV9pZDsKKyAgICAgIGRlbGV0ZSBvcHRpb25zLmRvbV9pZDsKKyAgICB9CisKKyAgICBpZiAoIW9wdGlvbnMuc3VwcG9ydGVkU3VibWl0TWV0aG9kcyl7CisgICAgICBvcHRpb25zLnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHMgPSBbCisgICAgICAgICdnZXQnLAorICAgICAgICAncHV0JywKKyAgICAgICAgJ3Bvc3QnLAorICAgICAgICAnZGVsZXRlJywKKyAgICAgICAgJ2hlYWQnLAorICAgICAgICAnb3B0aW9ucycsCisgICAgICAgICdwYXRjaCcKKyAgICAgIF07CisgICAgfQorCisgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9hdXRoMlJlZGlyZWN0VXJsID09PSAnc3RyaW5nJykgeworICAgICAgd2luZG93Lm9BdXRoUmVkaXJlY3RVcmwgPSBvcHRpb25zLnJlZGlyZWN0VXJsOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBkaXYgd2hpY2ggY29udGFpbnMgdGhlIGRvbV9pZAorICAgIGlmICghICQoJyMnICsgdGhpcy5kb21faWQpLmxlbmd0aCl7CisgICAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSInICsgdGhpcy5kb21faWQgKyAnIj48L2Rpdj4nKSA7CisgICAgfQorCisgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKworICAgIC8vIHNldCBtYXJrZWQgb3B0aW9ucworICAgIG1hcmtlZC5zZXRPcHRpb25zKHtnZm06IHRydWV9KTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2tzCisgICAgdmFyIHRoYXQgPSB0aGlzOworICAgIHRoaXMub3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGF0LnJlbmRlcigpOyB9OworICAgIHRoaXMub3B0aW9ucy5wcm9ncmVzcyA9IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRoYXQuc2hvd01lc3NhZ2UoZCk7IH07CisgICAgdGhpcy5vcHRpb25zLmZhaWx1cmUgPSBmdW5jdGlvbihkKSB7IHJldHVybiB0aGF0Lm9uTG9hZEZhaWx1cmUoZCk7IH07CisKKyAgICAvLyBDcmVhdGUgdmlldyB0byBoYW5kbGUgdGhlIGhlYWRlciBpbnB1dHMKKyAgICB0aGlzLmhlYWRlclZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLkhlYWRlclZpZXcoe2VsOiAkKCcjaGVhZGVyJyl9KTsKKworICAgIC8vIEV2ZW50IGhhbmRsZXIgZm9yIHdoZW4gdGhlIGJhc2VVcmwvYXBpS2V5IGlzIGVudGVyZWQgYnkgdXNlcgorICAgIHRoaXMuaGVhZGVyVmlldy5vbigndXBkYXRlLXN3YWdnZXItdWknLCBmdW5jdGlvbihkYXRhKSB7CisgICAgICByZXR1cm4gdGhhdC51cGRhdGVTd2FnZ2VyVWkoZGF0YSk7CisgICAgfSk7CisgIH0sCisKKyAgLy8gU2V0IGFuIG9wdGlvbiBhZnRlciBpbml0aWFsaXppbmcKKyAgc2V0T3B0aW9uOiBmdW5jdGlvbihvcHRpb24sIHZhbHVlKSB7CisgICAgdGhpcy5vcHRpb25zW29wdGlvbl0gPSB2YWx1ZTsKKyAgfSwKKworICAvLyBHZXQgdGhlIHZhbHVlIG9mIGEgcHJldmlvdXNseSBzZXQgb3B0aW9uCisgIGdldE9wdGlvbjogZnVuY3Rpb24ob3B0aW9uKSB7CisgICAgcmV0dXJuIHRoaXMub3B0aW9uc1tvcHRpb25dOworICB9LAorCisgIC8vIEV2ZW50IGhhbmRsZXIgZm9yIHdoZW4gdXJsL2tleSBpcyByZWNlaXZlZCBmcm9tIHVzZXIKKyAgdXBkYXRlU3dhZ2dlclVpOiBmdW5jdGlvbihkYXRhKXsKKyAgICB0aGlzLm9wdGlvbnMudXJsID0gZGF0YS51cmw7CisgICAgdGhpcy5sb2FkKCk7CisgIH0sCisKKyAgLy8gQ3JlYXRlIGFuIGFwaSBhbmQgcmVuZGVyCisgIGxvYWQ6IGZ1bmN0aW9uKCl7CisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgQVBJIG9iamVjdAorICAgIGlmICh0aGlzLm1haW5WaWV3KSB7CisgICAgICB0aGlzLm1haW5WaWV3LmNsZWFyKCk7CisgICAgfQorICAgIHZhciB1cmwgPSB0aGlzLm9wdGlvbnMudXJsOworICAgIGlmICh1cmwgJiYgdXJsLmluZGV4T2YoJ2h0dHAnKSAhPT0gMCkgeworICAgICAgdXJsID0gdGhpcy5idWlsZFVybCh3aW5kb3cubG9jYXRpb24uaHJlZi50b1N0cmluZygpLCB1cmwpOworICAgIH0KKworICAgIHRoaXMub3B0aW9ucy51cmwgPSB1cmw7CisgICAgdGhpcy5oZWFkZXJWaWV3LnVwZGF0ZSh1cmwpOworCisgICAgdGhpcy5hcGkgPSBuZXcgU3dhZ2dlckNsaWVudCh0aGlzLm9wdGlvbnMpOworICB9LAorCisgIC8vIGNvbGxhcHNlIGFsbCBzZWN0aW9ucworICBjb2xsYXBzZUFsbDogZnVuY3Rpb24oKXsKKyAgICBEb2NzLmNvbGxhcHNlRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UoJycpOworICB9LAorCisgIC8vIGxpc3Qgb3BlcmF0aW9ucyBmb3IgYWxsIHNlY3Rpb25zCisgIGxpc3RBbGw6IGZ1bmN0aW9uKCl7CisgICAgRG9jcy5jb2xsYXBzZU9wZXJhdGlvbnNGb3JSZXNvdXJjZSgnJyk7CisgIH0sCisKKyAgLy8gZXhwYW5kIG9wZXJhdGlvbnMgZm9yIGFsbCBzZWN0aW9ucworICBleHBhbmRBbGw6IGZ1bmN0aW9uKCl7CisgICAgRG9jcy5leHBhbmRPcGVyYXRpb25zRm9yUmVzb3VyY2UoJycpOworICB9LAorCisgIC8vIFRoaXMgaXMgYm91bmQgdG8gc3VjY2VzcyBoYW5kbGVyIGZvciBTd2FnZ2VyQXBpCisgIC8vICBzbyBpdCBnZXRzIGNhbGxlZCB3aGVuIFN3YWdnZXJBcGkgY29tcGxldGVzIGxvYWRpbmcKKyAgcmVuZGVyOiBmdW5jdGlvbigpeworICAgIHRoaXMuc2hvd01lc3NhZ2UoJ0ZpbmlzaGVkIExvYWRpbmcgUmVzb3VyY2UgSW5mb3JtYXRpb24uIFJlbmRlcmluZyBTd2FnZ2VyIFVJLi4uJyk7CisgICAgdGhpcy5tYWluVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuTWFpblZpZXcoeworICAgICAgbW9kZWw6IHRoaXMuYXBpLAorICAgICAgZWw6ICQoJyMnICsgdGhpcy5kb21faWQpLAorICAgICAgc3dhZ2dlck9wdGlvbnM6IHRoaXMub3B0aW9ucywKKyAgICAgIHJvdXRlcjogdGhpcworICAgIH0pLnJlbmRlcigpOworICAgIHRoaXMuc2hvd01lc3NhZ2UoKTsKKyAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5kb2NFeHBhbnNpb24pIHsKKyAgICAgIGNhc2UgJ2Z1bGwnOgorICAgICAgICB0aGlzLmV4cGFuZEFsbCgpOyBicmVhazsKKyAgICAgIGNhc2UgJ2xpc3QnOgorICAgICAgICB0aGlzLmxpc3RBbGwoKTsgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgdGhpcy5yZW5kZXJHRk0oKTsKKworICAgIGlmICh0aGlzLm9wdGlvbnMub25Db21wbGV0ZSl7CisgICAgICB0aGlzLm9wdGlvbnMub25Db21wbGV0ZSh0aGlzLmFwaSwgdGhpcyk7CisgICAgfQorCisgICAgc2V0VGltZW91dChEb2NzLnNoZWJhbmcuYmluZCh0aGlzKSwgMTAwKTsKKyAgfSwKKworICBidWlsZFVybDogZnVuY3Rpb24oYmFzZSwgdXJsKXsKKyAgICBpZiAodXJsLmluZGV4T2YoJy8nKSA9PT0gMCkgeworICAgICAgdmFyIHBhcnRzID0gYmFzZS5zcGxpdCgnLycpOworICAgICAgYmFzZSA9IHBhcnRzWzBdICsgJy8vJyArIHBhcnRzWzJdOworICAgICAgcmV0dXJuIGJhc2UgKyB1cmw7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBlbmRPZlBhdGggPSBiYXNlLmxlbmd0aDsKKworICAgICAgaWYgKGJhc2UuaW5kZXhPZignPycpID4gLTEpeworICAgICAgICBlbmRPZlBhdGggPSBNYXRoLm1pbihlbmRPZlBhdGgsIGJhc2UuaW5kZXhPZignPycpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJhc2UuaW5kZXhPZignIycpID4gLTEpeworICAgICAgICBlbmRPZlBhdGggPSBNYXRoLm1pbihlbmRPZlBhdGgsIGJhc2UuaW5kZXhPZignIycpKTsKKyAgICAgIH0KKworICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGVuZE9mUGF0aCk7CisKKyAgICAgIGlmIChiYXNlLmluZGV4T2YoJy8nLCBiYXNlLmxlbmd0aCAtIDEgKSAhPT0gLTEpeworICAgICAgICByZXR1cm4gYmFzZSArIHVybDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJhc2UgKyAnLycgKyB1cmw7CisgICAgfQorICB9LAorCisgIC8vIFNob3dzIG1lc3NhZ2Ugb24gdG9wYmFyIG9mIHRoZSB1aQorICBzaG93TWVzc2FnZTogZnVuY3Rpb24oZGF0YSl7CisgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgeworICAgICAgZGF0YSA9ICcnOworICAgIH0KKyAgICAkKCcjbWVzc2FnZS1iYXInKS5yZW1vdmVDbGFzcygnbWVzc2FnZS1mYWlsJyk7CisgICAgJCgnI21lc3NhZ2UtYmFyJykuYWRkQ2xhc3MoJ21lc3NhZ2Utc3VjY2VzcycpOworICAgICQoJyNtZXNzYWdlLWJhcicpLmh0bWwoZGF0YSk7CisgIH0sCisKKyAgLy8gc2hvd3MgbWVzc2FnZSBpbiByZWQKKyAgb25Mb2FkRmFpbHVyZTogZnVuY3Rpb24oZGF0YSl7CisgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgeworICAgICAgZGF0YSA9ICcnOworICAgIH0KKyAgICAkKCcjbWVzc2FnZS1iYXInKS5yZW1vdmVDbGFzcygnbWVzc2FnZS1zdWNjZXNzJyk7CisgICAgJCgnI21lc3NhZ2UtYmFyJykuYWRkQ2xhc3MoJ21lc3NhZ2UtZmFpbCcpOworCisgICAgdmFyIHZhbCA9ICQoJyNtZXNzYWdlLWJhcicpLmh0bWwoZGF0YSk7CisKKyAgICBpZiAodGhpcy5vcHRpb25zLm9uRmFpbHVyZSkgeworICAgICAgdGhpcy5vcHRpb25zLm9uRmFpbHVyZShkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsOworICB9LAorCisgIC8vIFJlbmRlcnMgR0ZNIGZvciBlbGVtZW50cyB3aXRoICdtYXJrZG93bicgY2xhc3MKKyAgcmVuZGVyR0ZNOiBmdW5jdGlvbigpeworICAgICQoJy5tYXJrZG93bicpLmVhY2goZnVuY3Rpb24oKXsKKyAgICAgICQodGhpcykuaHRtbChtYXJrZWQoJCh0aGlzKS5odG1sKCkpKTsKKyAgICB9KTsKKyAgfQorCit9KTsKKword2luZG93LlN3YWdnZXJVaS5WaWV3cyA9IHt9OworCisvLyBkb24ndCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMgYW5kIHdhcm4gdXNlcnMgdG8gdXBncmFkZSB0aGVpciBjb2RlCisoZnVuY3Rpb24oKXsKKyAgd2luZG93LmF1dGhvcml6YXRpb25zID0geworICAgIGFkZDogZnVuY3Rpb24oKSB7CisgICAgICB3YXJuKCdVc2luZyB3aW5kb3cuYXV0aG9yaXphdGlvbnMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBTd2FnZ2VyVWkuYXBpLmNsaWVudEF1dGhvcml6YXRpb25zLmFkZCgpLicpOworCisgICAgICBpZiAodHlwZW9mIHdpbmRvdy5zd2FnZ2VyVWkgPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dpbmRvdy5zd2FnZ2VyVWkgaXMgbm90IGRlZmluZWQnKTsKKyAgICAgIH0KKworICAgICAgaWYgKHdpbmRvdy5zd2FnZ2VyVWkgaW5zdGFuY2VvZiBTd2FnZ2VyVWkpIHsKKyAgICAgICAgd2luZG93LnN3YWdnZXJVaS5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMuYWRkLmFwcGx5KHdpbmRvdy5zd2FnZ2VyVWkuYXBpLmNsaWVudEF1dGhvcml6YXRpb25zLCBhcmd1bWVudHMpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICB3aW5kb3cuQXBpS2V5QXV0aG9yaXphdGlvbiA9IGZ1bmN0aW9uKCkgeworICAgIHdhcm4oJ3dpbmRvdy5BcGlLZXlBdXRob3JpemF0aW9uIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgU3dhZ2dlckNsaWVudC5BcGlLZXlBdXRob3JpemF0aW9uLicpOworICAgIFN3YWdnZXJDbGllbnQuQXBpS2V5QXV0aG9yaXphdGlvbi5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7CisgIH07CisKKyAgd2luZG93LlBhc3N3b3JkQXV0aG9yaXphdGlvbiA9IGZ1bmN0aW9uKCkgeworICAgIHdhcm4oJ3dpbmRvdy5QYXNzd29yZEF1dGhvcml6YXRpb24gaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBTd2FnZ2VyQ2xpZW50LlBhc3N3b3JkQXV0aG9yaXphdGlvbi4nKTsKKyAgICBTd2FnZ2VyQ2xpZW50LlBhc3N3b3JkQXV0aG9yaXphdGlvbi5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7CisgIH07CisKKyAgZnVuY3Rpb24gd2FybihtZXNzYWdlKSB7CisgICAgaWYgKCdjb25zb2xlJyBpbiB3aW5kb3cgJiYgdHlwZW9mIHdpbmRvdy5jb25zb2xlLndhcm4gPT09ICdmdW5jdGlvbicpIHsKKyAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTsKKyAgICB9CisgIH0KK30pKCk7CisKKworLy8gVU1ECisoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKKyAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CisgICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS4KKyAgICAgICAgZGVmaW5lKFsnYiddLCBmdW5jdGlvbiAoYikgeworICAgICAgICAgICAgcmV0dXJuIChyb290LlN3YWdnZXJVaSA9IGZhY3RvcnkoYikpOworICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykgeworICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKKyAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKKyAgICAgICAgLy8gbGlrZSBOb2RlLgorICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnYicpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMKKyAgICAgICAgcm9vdC5Td2FnZ2VyVWkgPSBmYWN0b3J5KHJvb3QuYik7CisgICAgfQorfSh0aGlzLCBmdW5jdGlvbiAoKSB7CisgICAgcmV0dXJuIFN3YWdnZXJVaTsKK30pKTsKKyd1c2Ugc3RyaWN0JzsKKworU3dhZ2dlclVpLlZpZXdzLkFwaUtleUJ1dHRvbiA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHsgLy8gVE9ETzogYXBwZW5kIHRoaXMgdG8gZ2xvYmFsIFN3YWdnZXJVaQorCisgIGV2ZW50czp7CisgICAgJ2NsaWNrICNhcGlrZXlfYnV0dG9uJyA6ICd0b2dnbGVBcGlLZXlDb250YWluZXInLAorICAgICdjbGljayAjYXBwbHlfYXBpX2tleScgOiAnYXBwbHlBcGlLZXknCisgIH0sCisKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0cyl7CisgICAgdGhpcy5vcHRpb25zID0gb3B0cyB8fCB7fTsKKyAgICB0aGlzLnJvdXRlciA9IHRoaXMub3B0aW9ucy5yb3V0ZXI7CisgIH0sCisKKyAgcmVuZGVyOiBmdW5jdGlvbigpeworICAgIHZhciB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUoKTsKKyAgICAkKHRoaXMuZWwpLmh0bWwodGVtcGxhdGUodGhpcy5tb2RlbCkpOworCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKworICBhcHBseUFwaUtleTogZnVuY3Rpb24oKXsKKyAgICB2YXIga2V5QXV0aCA9IG5ldyBTd2FnZ2VyQ2xpZW50LkFwaUtleUF1dGhvcml6YXRpb24oCisgICAgICB0aGlzLm1vZGVsLm5hbWUsCisgICAgICAkKCcjaW5wdXRfYXBpS2V5X2VudHJ5JykudmFsKCksCisgICAgICB0aGlzLm1vZGVsLmluCisgICAgKTsKKyAgICB0aGlzLnJvdXRlci5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMuYWRkKHRoaXMubW9kZWwubmFtZSwga2V5QXV0aCk7CisgICAgdGhpcy5yb3V0ZXIubG9hZCgpOworICAgICQoJyNhcGlrZXlfY29udGFpbmVyJykuc2hvdygpOworICB9LAorCisgIHRvZ2dsZUFwaUtleUNvbnRhaW5lcjogZnVuY3Rpb24oKXsKKyAgICBpZiAoJCgnI2FwaWtleV9jb250YWluZXInKS5sZW5ndGgpIHsKKworICAgICAgdmFyIGVsZW0gPSAkKCcjYXBpa2V5X2NvbnRhaW5lcicpLmZpcnN0KCk7CisKKyAgICAgIGlmIChlbGVtLmlzKCc6dmlzaWJsZScpKXsKKyAgICAgICAgZWxlbS5oaWRlKCk7CisgICAgICB9IGVsc2UgeworCisgICAgICAgIC8vIGhpZGUgb3RoZXJzCisgICAgICAgICQoJy5hdXRoX2NvbnRhaW5lcicpLmhpZGUoKTsKKyAgICAgICAgZWxlbS5zaG93KCk7CisgICAgICB9CisgICAgfQorICB9LAorCisgIHRlbXBsYXRlOiBmdW5jdGlvbigpeworICAgIHJldHVybiBIYW5kbGViYXJzLnRlbXBsYXRlcy5hcGlrZXlfYnV0dG9uX3ZpZXc7CisgIH0KKworfSk7CisndXNlIHN0cmljdCc7CisKK1N3YWdnZXJVaS5WaWV3cy5CYXNpY0F1dGhCdXR0b24gPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7CisKKworICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0cykgeworICAgIHRoaXMub3B0aW9ucyA9IG9wdHMgfHwge307CisgICAgdGhpcy5yb3V0ZXIgPSB0aGlzLm9wdGlvbnMucm91dGVyOworICB9LAorCisgIHJlbmRlcjogZnVuY3Rpb24oKXsKKyAgICB2YXIgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlKCk7CisgICAgJCh0aGlzLmVsKS5odG1sKHRlbXBsYXRlKHRoaXMubW9kZWwpKTsKKworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIGV2ZW50czogeworICAgICdjbGljayAjYmFzaWNfYXV0aF9idXR0b24nIDogJ3RvZ2dsZVBhc3N3b3JkQ29udGFpbmVyJywKKyAgICAnY2xpY2sgI2FwcGx5X2Jhc2ljX2F1dGgnIDogJ2FwcGx5UGFzc3dvcmQnCisgIH0sCisKKyAgYXBwbHlQYXNzd29yZDogZnVuY3Rpb24oKXsKKyAgICB2YXIgdXNlcm5hbWUgPSAkKCcuaW5wdXRfdXNlcm5hbWUnKS52YWwoKTsKKyAgICB2YXIgcGFzc3dvcmQgPSAkKCcuaW5wdXRfcGFzc3dvcmQnKS52YWwoKTsKKyAgICB2YXIgYmFzaWNBdXRoID0gbmV3IFN3YWdnZXJDbGllbnQuUGFzc3dvcmRBdXRob3JpemF0aW9uKCdiYXNpYycsIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgdGhpcy5yb3V0ZXIuYXBpLmNsaWVudEF1dGhvcml6YXRpb25zLmFkZCh0aGlzLm1vZGVsLnR5cGUsIGJhc2ljQXV0aCk7CisgICAgdGhpcy5yb3V0ZXIubG9hZCgpOworICAgICQoJyNiYXNpY19hdXRoX2NvbnRhaW5lcicpLmhpZGUoKTsKKyAgfSwKKworICB0b2dnbGVQYXNzd29yZENvbnRhaW5lcjogZnVuY3Rpb24oKXsKKyAgICBpZiAoJCgnI2Jhc2ljX2F1dGhfY29udGFpbmVyJykubGVuZ3RoKSB7CisgICAgICB2YXIgZWxlbSA9ICQoJyNiYXNpY19hdXRoX2NvbnRhaW5lcicpLnNob3coKTsKKyAgICAgIGlmIChlbGVtLmlzKCc6dmlzaWJsZScpKXsKKyAgICAgICAgZWxlbS5zbGlkZVVwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBoaWRlIG90aGVycworICAgICAgICAkKCcuYXV0aF9jb250YWluZXInKS5oaWRlKCk7CisgICAgICAgIGVsZW0uc2hvdygpOworICAgICAgfQorICAgIH0KKyAgfSwKKworICB0ZW1wbGF0ZTogZnVuY3Rpb24oKXsKKyAgICByZXR1cm4gSGFuZGxlYmFycy50ZW1wbGF0ZXMuYmFzaWNfYXV0aF9idXR0b25fdmlldzsKKyAgfQorCit9KTsKKyd1c2Ugc3RyaWN0JzsKKworU3dhZ2dlclVpLlZpZXdzLkNvbnRlbnRUeXBlVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7fSwKKworICByZW5kZXI6IGZ1bmN0aW9uKCl7CisgICAgJCh0aGlzLmVsKS5odG1sKEhhbmRsZWJhcnMudGVtcGxhdGVzLmNvbnRlbnRfdHlwZSh0aGlzLm1vZGVsKSk7CisKKyAgICAkKCdsYWJlbFtmb3I9Y29udGVudFR5cGVdJywgJCh0aGlzLmVsKSkudGV4dCgnUmVzcG9uc2UgQ29udGVudCBUeXBlJyk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfSk7CisndXNlIHN0cmljdCc7CisKK1N3YWdnZXJVaS5WaWV3cy5IZWFkZXJWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoeworICBldmVudHM6IHsKKyAgICAnY2xpY2sgI3Nob3ctcGV0LXN0b3JlLWljb24nICAgIDogJ3Nob3dQZXRTdG9yZScsCisgICAgJ2NsaWNrICNzaG93LXdvcmRuaWstZGV2LWljb24nICA6ICdzaG93V29yZG5pa0RldicsCisgICAgJ2NsaWNrICNleHBsb3JlJyAgICAgICAgICAgICAgICA6ICdzaG93Q3VzdG9tJywKKyAgICAna2V5dXAgI2lucHV0X2Jhc2VVcmwnICAgICAgICAgIDogJ3Nob3dDdXN0b21PbktleXVwJywKKyAgICAna2V5dXAgI2lucHV0X2FwaUtleScgICAgICAgICAgIDogJ3Nob3dDdXN0b21PbktleXVwJworICB9LAorCisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCl7fSwKKworICBzaG93UGV0U3RvcmU6IGZ1bmN0aW9uKCl7CisgICAgdGhpcy50cmlnZ2VyKCd1cGRhdGUtc3dhZ2dlci11aScsIHsKKyAgICAgIHVybDonaHR0cDovL3BldHN0b3JlLnN3YWdnZXIuaW8vdjIvc3dhZ2dlci5qc29uJworICAgIH0pOworICB9LAorCisgIHNob3dXb3JkbmlrRGV2OiBmdW5jdGlvbigpeworICAgIHRoaXMudHJpZ2dlcigndXBkYXRlLXN3YWdnZXItdWknLCB7CisgICAgICB1cmw6ICdodHRwOi8vYXBpLndvcmRuaWsuY29tL3Y0L3Jlc291cmNlcy5qc29uJworICAgIH0pOworICB9LAorCisgIHNob3dDdXN0b21PbktleXVwOiBmdW5jdGlvbihlKXsKKyAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeworICAgICAgdGhpcy5zaG93Q3VzdG9tKCk7CisgICAgfQorICB9LAorCisgIHNob3dDdXN0b206IGZ1bmN0aW9uKGUpeworICAgIGlmIChlKSB7CisgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgfQorCisgICAgdGhpcy50cmlnZ2VyKCd1cGRhdGUtc3dhZ2dlci11aScsIHsKKyAgICAgIHVybDogJCgnI2lucHV0X2Jhc2VVcmwnKS52YWwoKSwKKyAgICAgIGFwaUtleTogJCgnI2lucHV0X2FwaUtleScpLnZhbCgpCisgICAgfSk7CisgIH0sCisKKyAgdXBkYXRlOiBmdW5jdGlvbih1cmwsIGFwaUtleSwgdHJpZ2dlcil7CisgICAgaWYgKHRyaWdnZXIgPT09IHVuZGVmaW5lZCkgeworICAgICAgdHJpZ2dlciA9IGZhbHNlOworICAgIH0KKworICAgICQoJyNpbnB1dF9iYXNlVXJsJykudmFsKHVybCk7CisKKyAgICAvLyQoJyNpbnB1dF9hcGlLZXknKS52YWwoYXBpS2V5KTsKKyAgICBpZiAodHJpZ2dlcikgeworICAgICAgdGhpcy50cmlnZ2VyKCd1cGRhdGUtc3dhZ2dlci11aScsIHt1cmw6dXJsfSk7CisgICAgfQorICB9Cit9KTsKKworJ3VzZSBzdHJpY3QnOworCitTd2FnZ2VyVWkuVmlld3MuTWFpblZpZXcgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7CisgIGFwaXNTb3J0ZXIgOiB7CisgICAgYWxwaGEgICA6IGZ1bmN0aW9uKGEsYil7IHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpOyB9CisgIH0sCisgIG9wZXJhdGlvbnNTb3J0ZXJzIDogeworICAgIGFscGhhICAgOiBmdW5jdGlvbihhLGIpeyByZXR1cm4gYS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXRoKTsgfSwKKyAgICBtZXRob2QgIDogZnVuY3Rpb24oYSxiKXsgcmV0dXJuIGEubWV0aG9kLmxvY2FsZUNvbXBhcmUoYi5tZXRob2QpOyB9CisgIH0sCisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpeworICAgIHZhciBzb3J0ZXJPcHRpb24sIHNvcnRlckZuLCBrZXksIHZhbHVlOworICAgIG9wdHMgPSBvcHRzIHx8IHt9OworCisgICAgdGhpcy5yb3V0ZXIgPSBvcHRzLnJvdXRlcjsKKworICAgIC8vIFNvcnQgQVBJcworICAgIGlmIChvcHRzLnN3YWdnZXJPcHRpb25zLmFwaXNTb3J0ZXIpIHsKKyAgICAgIHNvcnRlck9wdGlvbiA9IG9wdHMuc3dhZ2dlck9wdGlvbnMuYXBpc1NvcnRlcjsKKyAgICAgIGlmIChfLmlzRnVuY3Rpb24oc29ydGVyT3B0aW9uKSkgeworICAgICAgICBzb3J0ZXJGbiA9IHNvcnRlck9wdGlvbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNvcnRlckZuID0gdGhpcy5hcGlzU29ydGVyW3NvcnRlck9wdGlvbl07CisgICAgICB9CisgICAgICBpZiAoXy5pc0Z1bmN0aW9uKHNvcnRlckZuKSkgeworICAgICAgICB0aGlzLm1vZGVsLmFwaXNBcnJheS5zb3J0KHNvcnRlckZuKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gU29ydCBvcGVyYXRpb25zIG9mIGVhY2ggQVBJCisgICAgaWYgKG9wdHMuc3dhZ2dlck9wdGlvbnMub3BlcmF0aW9uc1NvcnRlcikgeworICAgICAgc29ydGVyT3B0aW9uID0gb3B0cy5zd2FnZ2VyT3B0aW9ucy5vcGVyYXRpb25zU29ydGVyOworICAgICAgaWYgKF8uaXNGdW5jdGlvbihzb3J0ZXJPcHRpb24pKSB7CisgICAgICAgIHNvcnRlckZuID0gc29ydGVyT3B0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc29ydGVyRm4gPSB0aGlzLm9wZXJhdGlvbnNTb3J0ZXJzW3NvcnRlck9wdGlvbl07CisgICAgICB9CisgICAgICBpZiAoXy5pc0Z1bmN0aW9uKHNvcnRlckZuKSkgeworICAgICAgICBmb3IgKGtleSBpbiB0aGlzLm1vZGVsLmFwaXNBcnJheSkgeworICAgICAgICAgIHRoaXMubW9kZWwuYXBpc0FycmF5W2tleV0ub3BlcmF0aW9uc0FycmF5LnNvcnQoc29ydGVyRm4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gc2V0IHVwIHRoZSBVSSBmb3IgaW5wdXQKKyAgICB0aGlzLm1vZGVsLmF1dGhzID0gW107CisKKyAgICBmb3IgKGtleSBpbiB0aGlzLm1vZGVsLnNlY3VyaXR5RGVmaW5pdGlvbnMpIHsKKyAgICAgIHZhbHVlID0gdGhpcy5tb2RlbC5zZWN1cml0eURlZmluaXRpb25zW2tleV07CisKKyAgICAgIHRoaXMubW9kZWwuYXV0aHMucHVzaCh7CisgICAgICAgIG5hbWU6IGtleSwKKyAgICAgICAgdHlwZTogdmFsdWUudHlwZSwKKyAgICAgICAgdmFsdWU6IHZhbHVlCisgICAgICB9KTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5tb2RlbC5zd2FnZ2VyVmVyc2lvbiA9PT0gJzIuMCcpIHsKKyAgICAgIGlmICgndmFsaWRhdG9yVXJsJyBpbiBvcHRzLnN3YWdnZXJPcHRpb25zKSB7CisKKyAgICAgICAgLy8gVmFsaWRhdG9yIFVSTCBzcGVjaWZpZWQgZXhwbGljaXRseQorICAgICAgICB0aGlzLm1vZGVsLnZhbGlkYXRvclVybCA9IG9wdHMuc3dhZ2dlck9wdGlvbnMudmFsaWRhdG9yVXJsOworCisgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwudXJsLmluZGV4T2YoJ2xvY2FsaG9zdCcpID4gMCkgeworCisgICAgICAgIC8vIExvY2FsaG9zdCBvdmVycmlkZQorICAgICAgICB0aGlzLm1vZGVsLnZhbGlkYXRvclVybCA9IG51bGw7CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgLy8gRGVmYXVsdCB2YWxpZGF0b3IKKyAgICAgICAgdGhpcy5tb2RlbC52YWxpZGF0b3JVcmwgPSAnaHR0cDovL29ubGluZS5zd2FnZ2VyLmlvL3ZhbGlkYXRvcic7CisgICAgICB9CisgICAgfQorICB9LAorCisgIHJlbmRlcjogZnVuY3Rpb24oKXsKKyAgICBpZiAodGhpcy5tb2RlbC5zZWN1cml0eURlZmluaXRpb25zKSB7CisgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMubW9kZWwuc2VjdXJpdHlEZWZpbml0aW9ucykgeworICAgICAgICB2YXIgYXV0aCA9IHRoaXMubW9kZWwuc2VjdXJpdHlEZWZpbml0aW9uc1tuYW1lXTsKKyAgICAgICAgdmFyIGJ1dHRvbjsKKworICAgICAgICBpZiAoYXV0aC50eXBlID09PSAnYXBpS2V5JyAmJiAkKCcjYXBpa2V5X2J1dHRvbicpLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIGJ1dHRvbiA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuQXBpS2V5QnV0dG9uKHttb2RlbDogYXV0aCwgcm91dGVyOiAgdGhpcy5yb3V0ZXJ9KS5yZW5kZXIoKS5lbDsKKyAgICAgICAgICAkKCcuYXV0aF9tYWluX2NvbnRhaW5lcicpLmFwcGVuZChidXR0b24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1dGgudHlwZSA9PT0gJ2Jhc2ljQXV0aCcgJiYgJCgnI2Jhc2ljX2F1dGhfYnV0dG9uJykubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgYnV0dG9uID0gbmV3IFN3YWdnZXJVaS5WaWV3cy5CYXNpY0F1dGhCdXR0b24oe21vZGVsOiBhdXRoLCByb3V0ZXI6IHRoaXMucm91dGVyfSkucmVuZGVyKCkuZWw7CisgICAgICAgICAgJCgnLmF1dGhfbWFpbl9jb250YWluZXInKS5hcHBlbmQoYnV0dG9uKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIFJlbmRlciB0aGUgb3V0ZXIgY29udGFpbmVyIGZvciByZXNvdXJjZXMKKyAgICAkKHRoaXMuZWwpLmh0bWwoSGFuZGxlYmFycy50ZW1wbGF0ZXMubWFpbih0aGlzLm1vZGVsKSk7CisKKyAgICAvLyBSZW5kZXIgZWFjaCByZXNvdXJjZQorCisgICAgdmFyIHJlc291cmNlcyA9IHt9OworICAgIHZhciBjb3VudGVyID0gMDsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubW9kZWwuYXBpc0FycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLm1vZGVsLmFwaXNBcnJheVtpXTsKKyAgICAgIHZhciBpZCA9IHJlc291cmNlLm5hbWU7CisgICAgICB3aGlsZSAodHlwZW9mIHJlc291cmNlc1tpZF0gIT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgIGlkID0gaWQgKyAnXycgKyBjb3VudGVyOworICAgICAgICBjb3VudGVyICs9IDE7CisgICAgICB9CisgICAgICByZXNvdXJjZS5pZCA9IGlkOworICAgICAgcmVzb3VyY2VzW2lkXSA9IHJlc291cmNlOworICAgICAgdGhpcy5hZGRSZXNvdXJjZShyZXNvdXJjZSwgdGhpcy5tb2RlbC5hdXRocyk7CisgICAgfQorCisgICAgJCgnLnByb3BXcmFwJykuaG92ZXIoZnVuY3Rpb24gb25Ib3ZlcigpeworICAgICAgJCgnLm9wdGlvbnNXcmFwcGVyJywgJCh0aGlzKSkuc2hvdygpOworICAgIH0sIGZ1bmN0aW9uIG9mZmhvdmVyKCl7CisgICAgICAkKCcub3B0aW9uc1dyYXBwZXInLCAkKHRoaXMpKS5oaWRlKCk7CisgICAgfSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgYWRkUmVzb3VyY2U6IGZ1bmN0aW9uKHJlc291cmNlLCBhdXRocyl7CisgICAgLy8gUmVuZGVyIGEgcmVzb3VyY2UgYW5kIGFkZCBpdCB0byByZXNvdXJjZXMgbGkKKyAgICByZXNvdXJjZS5pZCA9IHJlc291cmNlLmlkLnJlcGxhY2UoL1xzL2csICdfJyk7CisgICAgdmFyIHJlc291cmNlVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuUmVzb3VyY2VWaWV3KHsKKyAgICAgIG1vZGVsOiByZXNvdXJjZSwKKyAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXIsCisgICAgICB0YWdOYW1lOiAnbGknLAorICAgICAgaWQ6ICdyZXNvdXJjZV8nICsgcmVzb3VyY2UuaWQsCisgICAgICBjbGFzc05hbWU6ICdyZXNvdXJjZScsCisgICAgICBhdXRoczogYXV0aHMsCisgICAgICBzd2FnZ2VyT3B0aW9uczogdGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zCisgICAgfSk7CisgICAgJCgnI3Jlc291cmNlcycpLmFwcGVuZChyZXNvdXJjZVZpZXcucmVuZGVyKCkuZWwpOworICB9LAorCisgIGNsZWFyOiBmdW5jdGlvbigpeworICAgICQodGhpcy5lbCkuaHRtbCgnJyk7CisgIH0KK30pOworCisndXNlIHN0cmljdCc7CisKK1N3YWdnZXJVaS5WaWV3cy5PcGVyYXRpb25WaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoeworICBpbnZvY2F0aW9uVXJsOiBudWxsLAorCisgIGV2ZW50czogeworICAgICdzdWJtaXQgLnNhbmRib3gnICAgICAgICAgOiAnc3VibWl0T3BlcmF0aW9uJywKKyAgICAnY2xpY2sgLnN1Ym1pdCcgICAgICAgICAgIDogJ3N1Ym1pdE9wZXJhdGlvbicsCisgICAgJ2NsaWNrIC5yZXNwb25zZV9oaWRlcicgICA6ICdoaWRlUmVzcG9uc2UnLAorICAgICdjbGljayAudG9nZ2xlT3BlcmF0aW9uJyAgOiAndG9nZ2xlT3BlcmF0aW9uQ29udGVudCcsCisgICAgJ21vdXNlZW50ZXIgLmFwaS1pYycgICAgICA6ICdtb3VzZUVudGVyJywKKyAgICAnbW91c2VvdXQgLmFwaS1pYycgICAgICAgIDogJ21vdXNlRXhpdCcsCisgIH0sCisKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0cykgeworICAgIG9wdHMgPSBvcHRzIHx8IHt9OworICAgIHRoaXMucm91dGVyID0gb3B0cy5yb3V0ZXI7CisgICAgdGhpcy5hdXRocyA9IG9wdHMuYXV0aHM7CisgICAgdGhpcy5wYXJlbnRJZCA9IHRoaXMubW9kZWwucGFyZW50SWQ7CisgICAgdGhpcy5uaWNrbmFtZSA9IHRoaXMubW9kZWwubmlja25hbWU7CisgICAgdGhpcy5tb2RlbC5lbmNvZGVkUGFyZW50SWQgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5wYXJlbnRJZCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgbW91c2VFbnRlcjogZnVuY3Rpb24oZSkgeworICAgIHZhciBlbGVtID0gJCh0aGlzLmVsKS5maW5kKCcuY29udGVudCcpOworICAgIHZhciB4ID0gZS5wYWdlWDsKKyAgICB2YXIgeSA9IGUucGFnZVk7CisgICAgdmFyIHNjWCA9ICQod2luZG93KS5zY3JvbGxMZWZ0KCk7CisgICAgdmFyIHNjWSA9ICQod2luZG93KS5zY3JvbGxUb3AoKTsKKyAgICB2YXIgc2NNYXhYID0gc2NYICsgJCh3aW5kb3cpLndpZHRoKCk7CisgICAgdmFyIHNjTWF4WSA9IHNjWSArICQod2luZG93KS5oZWlnaHQoKTsKKyAgICB2YXIgd2QgPSBlbGVtLndpZHRoKCk7CisgICAgdmFyIGhnaCA9IGVsZW0uaGVpZ2h0KCk7CisKKyAgICBpZiAoeCArIHdkID4gc2NNYXhYKSB7CisgICAgICB4ID0gc2NNYXhYIC0gd2Q7CisgICAgfQorCisgICAgaWYgKHggPCBzY1gpIHsKKyAgICAgIHggPSBzY1g7CisgICAgfQorCisgICAgaWYgKHkgKyBoZ2ggPiBzY01heFkpIHsKKyAgICAgIHkgPSBzY01heFkgLSBoZ2g7CisgICAgfQorCisgICAgaWYgKHkgPCBzY1kpIHsKKyAgICAgIHkgPSBzY1k7CisgICAgfQorCisgICAgdmFyIHBvcyA9IHt9OworICAgIHBvcy50b3AgPSB5OworICAgIHBvcy5sZWZ0ID0geDsKKyAgICBlbGVtLmNzcyhwb3MpOworICAgICQoZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUpLmZpbmQoJyNhcGlfaW5mb3JtYXRpb25fcGFuZWwnKS5zaG93KCk7CisgIH0sCisKKyAgbW91c2VFeGl0OiBmdW5jdGlvbihlKSB7CisgICAgJChlLmN1cnJlbnRUYXJnZXQucGFyZW50Tm9kZSkuZmluZCgnI2FwaV9pbmZvcm1hdGlvbl9wYW5lbCcpLmhpZGUoKTsKKyAgfSwKKworICAvLyBOb3RlOiBjb3BpZWQgZnJvbSBDb2ZmZWVTY3JpcHQgY29tcGlsZWQgZmlsZQorICAvLyBUT0RPOiByZWRhY3RvcgorICByZW5kZXI6IGZ1bmN0aW9uKCkgeworICAgIHZhciBhLCBhdXRoLCBhdXRocywgY29kZSwgY29udGVudFR5cGVNb2RlbCwgaXNNZXRob2RTdWJtaXNzaW9uU3VwcG9ydGVkLCBrLCBrZXksIGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCwgbSwgbW9kZWxBdXRocywgbiwgbywgcCwgcGFyYW0sIHEsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVzcG9uc2VDb250ZW50VHlwZVZpZXcsIHJlc3BvbnNlU2lnbmF0dXJlVmlldywgc2NoZW1hLCBzY2hlbWFPYmosIHNjb3BlSW5kZXgsIHNpZ25hdHVyZU1vZGVsLCBzdGF0dXNDb2RlLCBzdWNjZXNzUmVzcG9uc2UsIHR5cGUsIHYsIHZhbHVlOworICAgIGlzTWV0aG9kU3VibWlzc2lvblN1cHBvcnRlZCA9IGpRdWVyeS5pbkFycmF5KHRoaXMubW9kZWwubWV0aG9kLCB0aGlzLm1vZGVsLnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHMoKSkgPj0gMDsKKyAgICBpZiAoIWlzTWV0aG9kU3VibWlzc2lvblN1cHBvcnRlZCkgeworICAgICAgdGhpcy5tb2RlbC5pc1JlYWRPbmx5ID0gdHJ1ZTsKKyAgICB9CisgICAgdGhpcy5tb2RlbC5kZXNjcmlwdGlvbiA9IHRoaXMubW9kZWwuZGVzY3JpcHRpb24gfHwgdGhpcy5tb2RlbC5ub3RlczsKKyAgICB0aGlzLm1vZGVsLm9hdXRoID0gbnVsbDsKKyAgICBtb2RlbEF1dGhzID0gdGhpcy5tb2RlbC5hdXRob3JpemF0aW9ucyB8fCB0aGlzLm1vZGVsLnNlY3VyaXR5OworICAgIGlmIChtb2RlbEF1dGhzKSB7CisgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbEF1dGhzKSkgeworICAgICAgICBmb3IgKGwgPSAwLCBsZW4gPSBtb2RlbEF1dGhzLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7CisgICAgICAgICAgYXV0aHMgPSBtb2RlbEF1dGhzW2xdOworICAgICAgICAgIGZvciAoa2V5IGluIGF1dGhzKSB7CisgICAgICAgICAgICBhdXRoID0gYXV0aHNba2V5XTsKKyAgICAgICAgICAgIGZvciAoYSBpbiB0aGlzLmF1dGhzKSB7CisgICAgICAgICAgICAgIGF1dGggPSB0aGlzLmF1dGhzW2FdOworICAgICAgICAgICAgICBpZiAoYXV0aC50eXBlID09PSAnb2F1dGgyJykgeworICAgICAgICAgICAgICAgIHRoaXMubW9kZWwub2F1dGggPSB7fTsKKyAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLm9hdXRoLnNjb3BlcyA9IFtdOworICAgICAgICAgICAgICAgIHJlZjEgPSBhdXRoLnZhbHVlLnNjb3BlczsKKyAgICAgICAgICAgICAgICBmb3IgKGsgaW4gcmVmMSkgeworICAgICAgICAgICAgICAgICAgdiA9IHJlZjFba107CisgICAgICAgICAgICAgICAgICBzY29wZUluZGV4ID0gYXV0aHNba2V5XS5pbmRleE9mKGspOworICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlSW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBvID0geworICAgICAgICAgICAgICAgICAgICAgIHNjb3BlOiBrLAorICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwub2F1dGguc2NvcGVzLnB1c2gobyk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGsgaW4gbW9kZWxBdXRocykgeworICAgICAgICAgIHYgPSBtb2RlbEF1dGhzW2tdOworICAgICAgICAgIGlmIChrID09PSAnb2F1dGgyJykgeworICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwub2F1dGggPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgdGhpcy5tb2RlbC5vYXV0aCA9IHt9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwub2F1dGguc2NvcGVzID09PSB2b2lkIDApIHsKKyAgICAgICAgICAgICAgdGhpcy5tb2RlbC5vYXV0aC5zY29wZXMgPSBbXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAobSA9IDAsIGxlbjEgPSB2Lmxlbmd0aDsgbSA8IGxlbjE7IG0rKykgeworICAgICAgICAgICAgICBvID0gdlttXTsKKyAgICAgICAgICAgICAgdGhpcy5tb2RlbC5vYXV0aC5zY29wZXMucHVzaChvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsLnJlc3BvbnNlcyAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIHRoaXMubW9kZWwucmVzcG9uc2VNZXNzYWdlcyA9IFtdOworICAgICAgcmVmMiA9IHRoaXMubW9kZWwucmVzcG9uc2VzOworICAgICAgZm9yIChjb2RlIGluIHJlZjIpIHsKKyAgICAgICAgdmFsdWUgPSByZWYyW2NvZGVdOworICAgICAgICBzY2hlbWEgPSBudWxsOworICAgICAgICBzY2hlbWFPYmogPSB0aGlzLm1vZGVsLnJlc3BvbnNlc1tjb2RlXS5zY2hlbWE7CisgICAgICAgIGlmIChzY2hlbWFPYmogJiYgc2NoZW1hT2JqLiRyZWYpIHsKKyAgICAgICAgICBzY2hlbWEgPSBzY2hlbWFPYmouJHJlZjsKKyAgICAgICAgICBpZiAoc2NoZW1hLmluZGV4T2YoJyMvZGVmaW5pdGlvbnMvJykgPT09IDApIHsKKyAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYS5zdWJzdHJpbmcoJyMvZGVmaW5pdGlvbnMvJy5sZW5ndGgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLm1vZGVsLnJlc3BvbnNlTWVzc2FnZXMucHVzaCh7CisgICAgICAgICAgY29kZTogY29kZSwKKyAgICAgICAgICBtZXNzYWdlOiB2YWx1ZS5kZXNjcmlwdGlvbiwKKyAgICAgICAgICByZXNwb25zZU1vZGVsOiBzY2hlbWEKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlb2YgdGhpcy5tb2RlbC5yZXNwb25zZU1lc3NhZ2VzID09PSAndW5kZWZpbmVkJykgeworICAgICAgdGhpcy5tb2RlbC5yZXNwb25zZU1lc3NhZ2VzID0gW107CisgICAgfQorICAgIHNpZ25hdHVyZU1vZGVsID0gbnVsbDsKKyAgICBpZiAodGhpcy5tb2RlbC5zdWNjZXNzUmVzcG9uc2UpIHsKKyAgICAgIHN1Y2Nlc3NSZXNwb25zZSA9IHRoaXMubW9kZWwuc3VjY2Vzc1Jlc3BvbnNlOworICAgICAgZm9yIChrZXkgaW4gc3VjY2Vzc1Jlc3BvbnNlKSB7CisgICAgICAgIHZhbHVlID0gc3VjY2Vzc1Jlc3BvbnNlW2tleV07CisgICAgICAgIHRoaXMubW9kZWwuc3VjY2Vzc0NvZGUgPSBrZXk7CisgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5jcmVhdGVKU09OU2FtcGxlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgc2lnbmF0dXJlTW9kZWwgPSB7CisgICAgICAgICAgICBzYW1wbGVKU09OOiBKU09OLnN0cmluZ2lmeSh2YWx1ZS5jcmVhdGVKU09OU2FtcGxlKCksIHZvaWQgMCwgMiksCisgICAgICAgICAgICBpc1BhcmFtOiBmYWxzZSwKKyAgICAgICAgICAgIHNpZ25hdHVyZTogdmFsdWUuZ2V0TW9ja1NpZ25hdHVyZSgpCisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbC5yZXNwb25zZUNsYXNzU2lnbmF0dXJlICYmIHRoaXMubW9kZWwucmVzcG9uc2VDbGFzc1NpZ25hdHVyZSAhPT0gJ3N0cmluZycpIHsKKyAgICAgIHNpZ25hdHVyZU1vZGVsID0geworICAgICAgICBzYW1wbGVKU09OOiB0aGlzLm1vZGVsLnJlc3BvbnNlU2FtcGxlSlNPTiwKKyAgICAgICAgaXNQYXJhbTogZmFsc2UsCisgICAgICAgIHNpZ25hdHVyZTogdGhpcy5tb2RlbC5yZXNwb25zZUNsYXNzU2lnbmF0dXJlCisgICAgICB9OworICAgIH0KKyAgICAkKHRoaXMuZWwpLmh0bWwoSGFuZGxlYmFycy50ZW1wbGF0ZXMub3BlcmF0aW9uKHRoaXMubW9kZWwpKTsKKyAgICBpZiAoc2lnbmF0dXJlTW9kZWwpIHsKKyAgICAgIHJlc3BvbnNlU2lnbmF0dXJlVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuU2lnbmF0dXJlVmlldyh7CisgICAgICAgIG1vZGVsOiBzaWduYXR1cmVNb2RlbCwKKyAgICAgICAgcm91dGVyOiB0aGlzLnJvdXRlciwKKyAgICAgICAgdGFnTmFtZTogJ2RpdicKKyAgICAgIH0pOworICAgICAgJCgnLm1vZGVsLXNpZ25hdHVyZScsICQodGhpcy5lbCkpLmFwcGVuZChyZXNwb25zZVNpZ25hdHVyZVZpZXcucmVuZGVyKCkuZWwpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLm1vZGVsLnJlc3BvbnNlQ2xhc3NTaWduYXR1cmUgPSAnc3RyaW5nJzsKKyAgICAgICQoJy5tb2RlbC1zaWduYXR1cmUnLCAkKHRoaXMuZWwpKS5odG1sKHRoaXMubW9kZWwudHlwZSk7CisgICAgfQorICAgIGNvbnRlbnRUeXBlTW9kZWwgPSB7CisgICAgICBpc1BhcmFtOiBmYWxzZQorICAgIH07CisgICAgY29udGVudFR5cGVNb2RlbC5jb25zdW1lcyA9IHRoaXMubW9kZWwuY29uc3VtZXM7CisgICAgY29udGVudFR5cGVNb2RlbC5wcm9kdWNlcyA9IHRoaXMubW9kZWwucHJvZHVjZXM7CisgICAgcmVmMyA9IHRoaXMubW9kZWwucGFyYW1ldGVyczsKKyAgICBmb3IgKG4gPSAwLCBsZW4yID0gcmVmMy5sZW5ndGg7IG4gPCBsZW4yOyBuKyspIHsKKyAgICAgIHBhcmFtID0gcmVmM1tuXTsKKyAgICAgIHR5cGUgPSBwYXJhbS50eXBlIHx8IHBhcmFtLmRhdGFUeXBlIHx8ICcnOworICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJykgeworICAgICAgICBzY2hlbWEgPSBwYXJhbS5zY2hlbWE7CisgICAgICAgIGlmIChzY2hlbWEgJiYgc2NoZW1hLiRyZWYpIHsKKyAgICAgICAgICByZWYgPSBzY2hlbWEuJHJlZjsKKyAgICAgICAgICBpZiAocmVmLmluZGV4T2YoJyMvZGVmaW5pdGlvbnMvJykgPT09IDApIHsKKyAgICAgICAgICAgIHR5cGUgPSByZWYuc3Vic3RyaW5nKCcjL2RlZmluaXRpb25zLycubGVuZ3RoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHlwZSA9IHJlZjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0eXBlICYmIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpbGUnKSB7CisgICAgICAgIGlmICghY29udGVudFR5cGVNb2RlbC5jb25zdW1lcykgeworICAgICAgICAgIGNvbnRlbnRUeXBlTW9kZWwuY29uc3VtZXMgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBhcmFtLnR5cGUgPSB0eXBlOworICAgIH0KKyAgICByZXNwb25zZUNvbnRlbnRUeXBlVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuUmVzcG9uc2VDb250ZW50VHlwZVZpZXcoeworICAgICAgbW9kZWw6IGNvbnRlbnRUeXBlTW9kZWwsCisgICAgICByb3V0ZXI6IHRoaXMucm91dGVyCisgICAgfSk7CisgICAgJCgnLnJlc3BvbnNlLWNvbnRlbnQtdHlwZScsICQodGhpcy5lbCkpLmFwcGVuZChyZXNwb25zZUNvbnRlbnRUeXBlVmlldy5yZW5kZXIoKS5lbCk7CisgICAgcmVmNCA9IHRoaXMubW9kZWwucGFyYW1ldGVyczsKKyAgICBmb3IgKHAgPSAwLCBsZW4zID0gcmVmNC5sZW5ndGg7IHAgPCBsZW4zOyBwKyspIHsKKyAgICAgIHBhcmFtID0gcmVmNFtwXTsKKyAgICAgIHRoaXMuYWRkUGFyYW1ldGVyKHBhcmFtLCBjb250ZW50VHlwZU1vZGVsLmNvbnN1bWVzKTsKKyAgICB9CisgICAgcmVmNSA9IHRoaXMubW9kZWwucmVzcG9uc2VNZXNzYWdlczsKKyAgICBmb3IgKHEgPSAwLCBsZW40ID0gcmVmNS5sZW5ndGg7IHEgPCBsZW40OyBxKyspIHsKKyAgICAgIHN0YXR1c0NvZGUgPSByZWY1W3FdOworICAgICAgdGhpcy5hZGRTdGF0dXNDb2RlKHN0YXR1c0NvZGUpOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICBhZGRQYXJhbWV0ZXI6IGZ1bmN0aW9uKHBhcmFtLCBjb25zdW1lcykgeworICAgIC8vIFJlbmRlciBhIHBhcmFtZXRlcgorICAgIHBhcmFtLmNvbnN1bWVzID0gY29uc3VtZXM7CisgICAgdmFyIHBhcmFtVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuUGFyYW1ldGVyVmlldyh7CisgICAgICBtb2RlbDogcGFyYW0sCisgICAgICB0YWdOYW1lOiAndHInLAorICAgICAgcmVhZE9ubHk6IHRoaXMubW9kZWwuaXNSZWFkT25seQorICAgIH0pOworICAgICQoJy5vcGVyYXRpb24tcGFyYW1zJywgJCh0aGlzLmVsKSkuYXBwZW5kKHBhcmFtVmlldy5yZW5kZXIoKS5lbCk7CisgIH0sCisKKyAgYWRkU3RhdHVzQ29kZTogZnVuY3Rpb24oc3RhdHVzQ29kZSkgeworICAgIC8vIFJlbmRlciBzdGF0dXMgY29kZXMKKyAgICB2YXIgc3RhdHVzQ29kZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlN0YXR1c0NvZGVWaWV3KHsKKyAgICAgIG1vZGVsOiBzdGF0dXNDb2RlLAorICAgICAgdGFnTmFtZTogJ3RyJywKKyAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXIKKyAgICB9KTsKKyAgICAkKCcub3BlcmF0aW9uLXN0YXR1cycsICQodGhpcy5lbCkpLmFwcGVuZChzdGF0dXNDb2RlVmlldy5yZW5kZXIoKS5lbCk7CisgIH0sCisKKyAgLy8gTm90ZTogY29waWVkIGZyb20gQ29mZmVlU2NyaXB0IGNvbXBpbGVkIGZpbGUKKyAgLy8gVE9ETzogcmVkYWN0b3IKKyAgc3VibWl0T3BlcmF0aW9uOiBmdW5jdGlvbihlKSB7CisgICAgdmFyIGVycm9yX2ZyZWUsIGZvcm0sIGlzRmlsZVVwbG9hZCwgbCwgbGVuLCBsZW4xLCBsZW4yLCBtLCBtYXAsIG4sIG8sIG9wdHMsIHJlZjEsIHJlZjIsIHJlZjMsIHZhbDsKKyAgICBpZiAoZSAhPT0gbnVsbCkgeworICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIH0KKyAgICBmb3JtID0gJCgnLnNhbmRib3gnLCAkKHRoaXMuZWwpKTsKKyAgICBlcnJvcl9mcmVlID0gdHJ1ZTsKKyAgICBmb3JtLmZpbmQoJ2lucHV0LnJlcXVpcmVkJykuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2Vycm9yJyk7CisgICAgICBpZiAoalF1ZXJ5LnRyaW0oJCh0aGlzKS52YWwoKSkgPT09ICcnKSB7CisgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2Vycm9yJyk7CisgICAgICAgICQodGhpcykud2lnZ2xlKHsKKyAgICAgICAgICBjYWxsYmFjazogKGZ1bmN0aW9uKF90aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICQoX3RoaXMpLmZvY3VzKCk7CisgICAgICAgICAgICB9OworICAgICAgICAgIH0pKHRoaXMpCisgICAgICAgIH0pOworICAgICAgICBlcnJvcl9mcmVlID0gZmFsc2U7CisgICAgICB9CisgICAgfSk7CisgICAgZm9ybS5maW5kKCd0ZXh0YXJlYS5yZXF1aXJlZCcpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdlcnJvcicpOworICAgICAgaWYgKGpRdWVyeS50cmltKCQodGhpcykudmFsKCkpID09PSAnJykgeworICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdlcnJvcicpOworICAgICAgICAkKHRoaXMpLndpZ2dsZSh7CisgICAgICAgICAgY2FsbGJhY2s6IChmdW5jdGlvbihfdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICByZXR1cm4gJChfdGhpcykuZm9jdXMoKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfSkodGhpcykKKyAgICAgICAgfSk7CisgICAgICAgIGVycm9yX2ZyZWUgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoZXJyb3JfZnJlZSkgeworICAgICAgbWFwID0ge307CisgICAgICBvcHRzID0geworICAgICAgICBwYXJlbnQ6IHRoaXMKKyAgICAgIH07CisgICAgICBpc0ZpbGVVcGxvYWQgPSBmYWxzZTsKKyAgICAgIHJlZjEgPSBmb3JtLmZpbmQoJ2lucHV0Jyk7CisgICAgICBmb3IgKGwgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7CisgICAgICAgIG8gPSByZWYxW2xdOworICAgICAgICBpZiAoKG8udmFsdWUgIT09IG51bGwpICYmIGpRdWVyeS50cmltKG8udmFsdWUpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBtYXBbby5uYW1lXSA9IG8udmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8udHlwZSA9PT0gJ2ZpbGUnKSB7CisgICAgICAgICAgbWFwW28ubmFtZV0gPSBvLmZpbGVzWzBdOworICAgICAgICAgIGlzRmlsZVVwbG9hZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlZjIgPSBmb3JtLmZpbmQoJ3RleHRhcmVhJyk7CisgICAgICBmb3IgKG0gPSAwLCBsZW4xID0gcmVmMi5sZW5ndGg7IG0gPCBsZW4xOyBtKyspIHsKKyAgICAgICAgbyA9IHJlZjJbbV07CisgICAgICAgIGlmICgoby52YWx1ZSAhPT0gbnVsbCkgJiYgalF1ZXJ5LnRyaW0oby52YWx1ZSkubGVuZ3RoID4gMCkgeworICAgICAgICAgIG1hcFtvLm5hbWVdID0gby52YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVmMyA9IGZvcm0uZmluZCgnc2VsZWN0Jyk7CisgICAgICBmb3IgKG4gPSAwLCBsZW4yID0gcmVmMy5sZW5ndGg7IG4gPCBsZW4yOyBuKyspIHsKKyAgICAgICAgbyA9IHJlZjNbbl07CisgICAgICAgIHZhbCA9IHRoaXMuZ2V0U2VsZWN0ZWRWYWx1ZShvKTsKKyAgICAgICAgaWYgKCh2YWwgIT09IG51bGwpICYmIGpRdWVyeS50cmltKHZhbCkubGVuZ3RoID4gMCkgeworICAgICAgICAgIG1hcFtvLm5hbWVdID0gdmFsOworICAgICAgICB9CisgICAgICB9CisgICAgICBvcHRzLnJlc3BvbnNlQ29udGVudFR5cGUgPSAkKCdkaXYgc2VsZWN0W25hbWU9cmVzcG9uc2VDb250ZW50VHlwZV0nLCAkKHRoaXMuZWwpKS52YWwoKTsKKyAgICAgIG9wdHMucmVxdWVzdENvbnRlbnRUeXBlID0gJCgnZGl2IHNlbGVjdFtuYW1lPXBhcmFtZXRlckNvbnRlbnRUeXBlXScsICQodGhpcy5lbCkpLnZhbCgpOworICAgICAgJCgnLnJlc3BvbnNlX3Rocm9iYmVyJywgJCh0aGlzLmVsKSkuc2hvdygpOworICAgICAgaWYgKGlzRmlsZVVwbG9hZCkgeworICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVGaWxlVXBsb2FkKG1hcCwgZm9ybSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdGhpcy5tb2RlbFsnZG8nXShtYXAsIG9wdHMsIHRoaXMuc2hvd0NvbXBsZXRlU3RhdHVzLCB0aGlzLnNob3dFcnJvclN0YXR1cywgdGhpcyk7CisgICAgICB9CisgICAgfQorICB9LAorCisgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlLCBwYXJlbnQpIHsKKyAgICBwYXJlbnQuc2hvd0NvbXBsZXRlU3RhdHVzKHJlc3BvbnNlKTsKKyAgfSwKKworICAvLyBOb3RlOiBUaGlzIGlzIGNvbXBpbGVkIGNvZGUKKyAgLy8gVE9ETzogUmVmYWN0b3IKKyAgaGFuZGxlRmlsZVVwbG9hZDogZnVuY3Rpb24obWFwLCBmb3JtKSB7CisgICAgdmFyIGJvZHlQYXJhbSwgZWwsIGhlYWRlclBhcmFtcywgbCwgbGVuLCBsZW4xLCBsZW4yLCBsZW4zLCBtLCBuLCBvLCBvYmosIHAsIHBhcmFtLCBwYXJhbXMsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQ7CisgICAgcmVmMSA9IGZvcm0uc2VyaWFsaXplQXJyYXkoKTsKKyAgICBmb3IgKGwgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7CisgICAgICBvID0gcmVmMVtsXTsKKyAgICAgIGlmICgoby52YWx1ZSAhPT0gbnVsbCkgJiYgalF1ZXJ5LnRyaW0oby52YWx1ZSkubGVuZ3RoID4gMCkgeworICAgICAgICBtYXBbby5uYW1lXSA9IG8udmFsdWU7CisgICAgICB9CisgICAgfQorICAgIGJvZHlQYXJhbSA9IG5ldyBGb3JtRGF0YSgpOworICAgIHBhcmFtcyA9IDA7CisgICAgcmVmMiA9IHRoaXMubW9kZWwucGFyYW1ldGVyczsKKyAgICBmb3IgKG0gPSAwLCBsZW4xID0gcmVmMi5sZW5ndGg7IG0gPCBsZW4xOyBtKyspIHsKKyAgICAgIHBhcmFtID0gcmVmMlttXTsKKyAgICAgIGlmIChwYXJhbS5wYXJhbVR5cGUgPT09ICdmb3JtJyB8fCBwYXJhbVsnaW4nXSA9PT0gJ2Zvcm1EYXRhJykgeworICAgICAgICBpZiAocGFyYW0udHlwZS50b0xvd2VyQ2FzZSgpICE9PSAnZmlsZScgJiYgbWFwW3BhcmFtLm5hbWVdICE9PSB2b2lkIDApIHsKKyAgICAgICAgICBib2R5UGFyYW0uYXBwZW5kKHBhcmFtLm5hbWUsIG1hcFtwYXJhbS5uYW1lXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaGVhZGVyUGFyYW1zID0ge307CisgICAgcmVmMyA9IHRoaXMubW9kZWwucGFyYW1ldGVyczsKKyAgICBmb3IgKG4gPSAwLCBsZW4yID0gcmVmMy5sZW5ndGg7IG4gPCBsZW4yOyBuKyspIHsKKyAgICAgIHBhcmFtID0gcmVmM1tuXTsKKyAgICAgIGlmIChwYXJhbS5wYXJhbVR5cGUgPT09ICdoZWFkZXInKSB7CisgICAgICAgIGhlYWRlclBhcmFtc1twYXJhbS5uYW1lXSA9IG1hcFtwYXJhbS5uYW1lXTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVmNCA9IGZvcm0uZmluZCgnaW5wdXRbdHlwZX49ImZpbGUiXScpOworICAgIGZvciAocCA9IDAsIGxlbjMgPSByZWY0Lmxlbmd0aDsgcCA8IGxlbjM7IHArKykgeworICAgICAgZWwgPSByZWY0W3BdOworICAgICAgaWYgKHR5cGVvZiBlbC5maWxlc1swXSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgYm9keVBhcmFtLmFwcGVuZCgkKGVsKS5hdHRyKCduYW1lJyksIGVsLmZpbGVzWzBdKTsKKyAgICAgICAgcGFyYW1zICs9IDE7CisgICAgICB9CisgICAgfQorICAgIHRoaXMuaW52b2NhdGlvblVybCA9IHRoaXMubW9kZWwuc3VwcG9ydEhlYWRlclBhcmFtcygpID8gKGhlYWRlclBhcmFtcyA9IHRoaXMubW9kZWwuZ2V0SGVhZGVyUGFyYW1zKG1hcCksIGRlbGV0ZSBoZWFkZXJQYXJhbXNbJ0NvbnRlbnQtVHlwZSddLCB0aGlzLm1vZGVsLnVybGlmeShtYXAsIGZhbHNlKSkgOiB0aGlzLm1vZGVsLnVybGlmeShtYXAsIHRydWUpOworICAgICQoJy5yZXF1ZXN0X3VybCcsICQodGhpcy5lbCkpLmh0bWwoJzxwcmU+PC9wcmU+Jyk7CisgICAgJCgnLnJlcXVlc3RfdXJsIHByZScsICQodGhpcy5lbCkpLnRleHQodGhpcy5pbnZvY2F0aW9uVXJsKTsKKyAgICBvYmogPSB7CisgICAgICB0eXBlOiB0aGlzLm1vZGVsLm1ldGhvZCwKKyAgICAgIHVybDogdGhpcy5pbnZvY2F0aW9uVXJsLAorICAgICAgaGVhZGVyczogaGVhZGVyUGFyYW1zLAorICAgICAgZGF0YTogYm9keVBhcmFtLAorICAgICAgZGF0YVR5cGU6ICdqc29uJywKKyAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSwKKyAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSwKKyAgICAgIGVycm9yOiAoZnVuY3Rpb24oX3RoaXMpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICByZXR1cm4gX3RoaXMuc2hvd0Vycm9yU3RhdHVzKF90aGlzLndyYXAoZGF0YSksIF90aGlzKTsKKyAgICAgICAgfTsKKyAgICAgIH0pKHRoaXMpLAorICAgICAgc3VjY2VzczogKGZ1bmN0aW9uKF90aGlzKSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgcmV0dXJuIF90aGlzLnNob3dSZXNwb25zZShkYXRhLCBfdGhpcyk7CisgICAgICAgIH07CisgICAgICB9KSh0aGlzKSwKKyAgICAgIGNvbXBsZXRlOiAoZnVuY3Rpb24oX3RoaXMpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICByZXR1cm4gX3RoaXMuc2hvd0NvbXBsZXRlU3RhdHVzKF90aGlzLndyYXAoZGF0YSksIF90aGlzKTsKKyAgICAgICAgfTsKKyAgICAgIH0pKHRoaXMpCisgICAgfTsKKyAgICBpZiAod2luZG93LmF1dGhvcml6YXRpb25zKSB7CisgICAgICB3aW5kb3cuYXV0aG9yaXphdGlvbnMuYXBwbHkob2JqKTsKKyAgICB9CisgICAgalF1ZXJ5LmFqYXgob2JqKTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gZW5kIG9mIGZpbGUtdXBsb2FkIG5hc3RpbmVzcworICB9LAorICAvLyB3cmFwcyBhIGpxdWVyeSByZXNwb25zZSBhcyBhIHNocmVkIHJlc3BvbnNlCisKKyAgd3JhcDogZnVuY3Rpb24oZGF0YSkgeworICAgdmFyIGgsIGhlYWRlckFycmF5LCBoZWFkZXJzLCBpLCBsLCBsZW4sIG87CisgICAgaGVhZGVycyA9IHt9OworICAgIGhlYWRlckFycmF5ID0gZGF0YS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgnXHInKTsKKyAgICBmb3IgKGwgPSAwLCBsZW4gPSBoZWFkZXJBcnJheS5sZW5ndGg7IGwgPCBsZW47IGwrKykgeworICAgICAgaSA9IGhlYWRlckFycmF5W2xdOworICAgICAgaCA9IGkubWF0Y2goL14oW146XSo/KTooLiopJC8pOworICAgICAgaWYgKCFoKSB7CisgICAgICAgIGggPSBbXTsKKyAgICAgIH0KKyAgICAgIGguc2hpZnQoKTsKKyAgICAgIGlmIChoWzBdICE9PSB2b2lkIDAgJiYgaFsxXSAhPT0gdm9pZCAwKSB7CisgICAgICAgIGhlYWRlcnNbaFswXS50cmltKCldID0gaFsxXS50cmltKCk7CisgICAgICB9CisgICAgfQorICAgIG8gPSB7fTsKKyAgICBvLmNvbnRlbnQgPSB7fTsKKyAgICBvLmNvbnRlbnQuZGF0YSA9IGRhdGEucmVzcG9uc2VUZXh0OworICAgIG8uaGVhZGVycyA9IGhlYWRlcnM7CisgICAgby5yZXF1ZXN0ID0ge307CisgICAgby5yZXF1ZXN0LnVybCA9IHRoaXMuaW52b2NhdGlvblVybDsKKyAgICBvLnN0YXR1cyA9IGRhdGEuc3RhdHVzOworICAgIHJldHVybiBvOworICB9LAorCisgIGdldFNlbGVjdGVkVmFsdWU6IGZ1bmN0aW9uKHNlbGVjdCkgeworICAgIGlmICghc2VsZWN0Lm11bHRpcGxlKSB7CisgICAgICByZXR1cm4gc2VsZWN0LnZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgb3B0aW9ucyA9IFtdOworICAgICAgZm9yICh2YXIgbCA9IDAsIGxlbiA9IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7CisgICAgICAgIHZhciBvcHQgPSBzZWxlY3Qub3B0aW9uc1tsXTsKKyAgICAgICAgaWYgKG9wdC5zZWxlY3RlZCkgeworICAgICAgICAgIG9wdGlvbnMucHVzaChvcHQudmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorICB9LAorCisgIC8vIGhhbmRsZXIgZm9yIGhpZGUgcmVzcG9uc2UgbGluaworICBoaWRlUmVzcG9uc2U6IGZ1bmN0aW9uKGUpIHsKKyAgICBpZiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH0KKyAgICAkKCcucmVzcG9uc2UnLCAkKHRoaXMuZWwpKS5zbGlkZVVwKCk7CisgICAgJCgnLnJlc3BvbnNlX2hpZGVyJywgJCh0aGlzLmVsKSkuZmFkZU91dCgpOworICB9LAorCisgIC8vIFNob3cgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIKKyAgc2hvd1Jlc3BvbnNlOiBmdW5jdGlvbihyZXNwb25zZSkgeworICAgIHZhciBwcmV0dHlKc29uID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UsIG51bGwsICdcdCcpLnJlcGxhY2UoL1xuL2csICc8YnI+Jyk7CisgICAgJCgnLnJlc3BvbnNlX2JvZHknLCAkKHRoaXMuZWwpKS5odG1sKF8uZXNjYXBlKHByZXR0eUpzb24pKTsKKyAgfSwKKworICAvLyBTaG93IGVycm9yIGZyb20gc2VydmVyCisgIHNob3dFcnJvclN0YXR1czogZnVuY3Rpb24oZGF0YSwgcGFyZW50KSB7CisgICAgcGFyZW50LnNob3dTdGF0dXMoZGF0YSk7CisgIH0sCisKKyAgLy8gc2hvdyB0aGUgc3RhdHVzIGNvZGVzCisgIHNob3dDb21wbGV0ZVN0YXR1czogZnVuY3Rpb24oZGF0YSwgcGFyZW50KXsKKyAgICBwYXJlbnQuc2hvd1N0YXR1cyhkYXRhKTsKKyAgfSwKKworICAvLyBBZGFwdGVkIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjg5MzI1OS80NTQwMDQKKyAgLy8gTm90ZTogZGlyZWN0bHkgcG9ydGVkIGZyb20gQ29mZmVlU2NyaXB0CisgIC8vIFRPRE86IENsZWFudXAgQ29mZmVlU2NyaXB0IGFydGlmYWN0cworICBmb3JtYXRYbWw6IGZ1bmN0aW9uKHhtbCkgeworICAgIHZhciBjb250ZXhwLCBmbiwgZm9ybWF0dGVkLCBpbmRlbnQsIGwsIGxhc3RUeXBlLCBsZW4sIGxpbmVzLCBsbiwgcGFkLCByZWcsIHRyYW5zaXRpb25zLCB3c2V4cDsKKyAgICByZWcgPSAvKD4pKDwpKFwvKikvZzsKKyAgICB3c2V4cCA9IC9bIF0qKC4qKVsgXStcbi9nOworICAgIGNvbnRleHAgPSAvKDwuKz4pKC4rXG4pL2c7CisgICAgeG1sID0geG1sLnJlcGxhY2UocmVnLCAnJDFcbiQyJDMnKS5yZXBsYWNlKHdzZXhwLCAnJDFcbicpLnJlcGxhY2UoY29udGV4cCwgJyQxXG4kMicpOworICAgIHBhZCA9IDA7CisgICAgZm9ybWF0dGVkID0gJyc7CisgICAgbGluZXMgPSB4bWwuc3BsaXQoJ1xuJyk7CisgICAgaW5kZW50ID0gMDsKKyAgICBsYXN0VHlwZSA9ICdvdGhlcic7CisgICAgdHJhbnNpdGlvbnMgPSB7CisgICAgICAnc2luZ2xlLT5zaW5nbGUnOiAwLAorICAgICAgJ3NpbmdsZS0+Y2xvc2luZyc6IC0xLAorICAgICAgJ3NpbmdsZS0+b3BlbmluZyc6IDAsCisgICAgICAnc2luZ2xlLT5vdGhlcic6IDAsCisgICAgICAnY2xvc2luZy0+c2luZ2xlJzogMCwKKyAgICAgICdjbG9zaW5nLT5jbG9zaW5nJzogLTEsCisgICAgICAnY2xvc2luZy0+b3BlbmluZyc6IDAsCisgICAgICAnY2xvc2luZy0+b3RoZXInOiAwLAorICAgICAgJ29wZW5pbmctPnNpbmdsZSc6IDEsCisgICAgICAnb3BlbmluZy0+Y2xvc2luZyc6IDAsCisgICAgICAnb3BlbmluZy0+b3BlbmluZyc6IDEsCisgICAgICAnb3BlbmluZy0+b3RoZXInOiAxLAorICAgICAgJ290aGVyLT5zaW5nbGUnOiAwLAorICAgICAgJ290aGVyLT5jbG9zaW5nJzogLTEsCisgICAgICAnb3RoZXItPm9wZW5pbmcnOiAwLAorICAgICAgJ290aGVyLT5vdGhlcic6IDAKKyAgICB9OworICAgIGZuID0gZnVuY3Rpb24obG4pIHsKKyAgICAgIHZhciBmcm9tVG8sIGosIGtleSwgcGFkZGluZywgdHlwZSwgdHlwZXMsIHZhbHVlOworICAgICAgdHlwZXMgPSB7CisgICAgICAgIHNpbmdsZTogQm9vbGVhbihsbi5tYXRjaCgvPC4rXC8+LykpLAorICAgICAgICBjbG9zaW5nOiBCb29sZWFuKGxuLm1hdGNoKC88XC8uKz4vKSksCisgICAgICAgIG9wZW5pbmc6IEJvb2xlYW4obG4ubWF0Y2goLzxbXiE/XS4qPi8pKQorICAgICAgfTsKKyAgICAgIHR5cGUgPSAoKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcmVzdWx0czsKKyAgICAgICAgcmVzdWx0cyA9IFtdOworICAgICAgICBmb3IgKGtleSBpbiB0eXBlcykgeworICAgICAgICAgIHZhbHVlID0gdHlwZXNba2V5XTsKKyAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHJlc3VsdHMucHVzaChrZXkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgIH0pKCkpWzBdOworICAgICAgdHlwZSA9IHR5cGUgPT09IHZvaWQgMCA/ICdvdGhlcicgOiB0eXBlOworICAgICAgZnJvbVRvID0gbGFzdFR5cGUgKyAnLT4nICsgdHlwZTsKKyAgICAgIGxhc3RUeXBlID0gdHlwZTsKKyAgICAgIHBhZGRpbmcgPSAnJzsKKyAgICAgIGluZGVudCArPSB0cmFuc2l0aW9uc1tmcm9tVG9dOworICAgICAgcGFkZGluZyA9ICgoZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBtLCByZWYxLCByZXN1bHRzOworICAgICAgICByZXN1bHRzID0gW107CisgICAgICAgIGZvciAoaiA9IG0gPSAwLCByZWYxID0gaW5kZW50OyAwIDw9IHJlZjEgPyBtIDwgcmVmMSA6IG0gPiByZWYxOyBqID0gMCA8PSByZWYxID8gKyttIDogLS1tKSB7CisgICAgICAgICAgcmVzdWx0cy5wdXNoKCcgICcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgfSkoKSkuam9pbignJyk7CisgICAgICBpZiAoZnJvbVRvID09PSAnb3BlbmluZy0+Y2xvc2luZycpIHsKKyAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cigwLCBmb3JtYXR0ZWQubGVuZ3RoIC0gMSkgKyBsbiArICdcbic7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXR0ZWQgKz0gcGFkZGluZyArIGxuICsgJ1xuJzsKKyAgICAgIH0KKyAgICB9OworICAgIGZvciAobCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7CisgICAgICBsbiA9IGxpbmVzW2xdOworICAgICAgZm4obG4pOworICAgIH0KKyAgICByZXR1cm4gZm9ybWF0dGVkOworICB9LAorCisgIC8vIHB1dHMgdGhlIHJlc3BvbnNlIGRhdGEgaW4gVUkKKyAgc2hvd1N0YXR1czogZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICB2YXIgdXJsLCBjb250ZW50OworICAgIGlmIChyZXNwb25zZS5jb250ZW50ID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGNvbnRlbnQgPSByZXNwb25zZS5kYXRhOworICAgICAgdXJsID0gcmVzcG9uc2UudXJsOworICAgIH0gZWxzZSB7CisgICAgICBjb250ZW50ID0gcmVzcG9uc2UuY29udGVudC5kYXRhOworICAgICAgdXJsID0gcmVzcG9uc2UucmVxdWVzdC51cmw7CisgICAgfQorICAgIHZhciBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVyczsKKworICAgIC8vIGlmIHNlcnZlciBpcyBuaWNlLCBhbmQgc2VuZHMgY29udGVudC10eXBlIGJhY2ssIHdlIGNhbiB1c2UgaXQKKyAgICB2YXIgY29udGVudFR5cGUgPSBudWxsOworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICBjb250ZW50VHlwZSA9IGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddIHx8IGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddOworICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7CisgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXS50cmltKCk7CisgICAgICB9CisgICAgfQorICAgICQoJy5yZXNwb25zZV9ib2R5JywgJCh0aGlzLmVsKSkucmVtb3ZlQ2xhc3MoJ2pzb24nKTsKKyAgICAkKCcucmVzcG9uc2VfYm9keScsICQodGhpcy5lbCkpLnJlbW92ZUNsYXNzKCd4bWwnKTsKKworICAgIHZhciBzdXBwb3J0c0F1ZGlvUGxheWJhY2sgPSBmdW5jdGlvbihjb250ZW50VHlwZSl7CisgICAgICB2YXIgYXVkaW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXVkaW8nKTsKKyAgICAgIHJldHVybiAhIShhdWRpb0VsZW1lbnQuY2FuUGxheVR5cGUgJiYgYXVkaW9FbGVtZW50LmNhblBsYXlUeXBlKGNvbnRlbnRUeXBlKS5yZXBsYWNlKC9uby8sICcnKSk7CisgICAgfTsKKworICAgIHZhciBwcmU7CisgICAgdmFyIGNvZGU7CisgICAgaWYgKCFjb250ZW50KSB7CisgICAgICBjb2RlID0gJCgnPGNvZGUgLz4nKS50ZXh0KCdubyBjb250ZW50Jyk7CisgICAgICBwcmUgPSAkKCc8cHJlIGNsYXNzPSJqc29uIiAvPicpLmFwcGVuZChjb2RlKTsKKworICAgIC8vIEpTT04KKyAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgfHwgL1wranNvbiQvLnRlc3QoY29udGVudFR5cGUpKSB7CisgICAgICB2YXIganNvbiA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBqc29uID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZShjb250ZW50KSwgbnVsbCwgJyAgJyk7CisgICAgICB9IGNhdGNoIChfZXJyb3IpIHsKKyAgICAgICAganNvbiA9ICdjYW5cJ3QgcGFyc2UgSlNPTi4gIFJhdyByZXN1bHQ6XG5cbicgKyBjb250ZW50OworICAgICAgfQorICAgICAgY29kZSA9ICQoJzxjb2RlIC8+JykudGV4dChqc29uKTsKKyAgICAgIHByZSA9ICQoJzxwcmUgY2xhc3M9Impzb24iIC8+JykuYXBwZW5kKGNvZGUpOworCisgICAgLy8gWE1MCisgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3htbCcgfHwgL1wreG1sJC8udGVzdChjb250ZW50VHlwZSkpIHsKKyAgICAgIGNvZGUgPSAkKCc8Y29kZSAvPicpLnRleHQodGhpcy5mb3JtYXRYbWwoY29udGVudCkpOworICAgICAgcHJlID0gJCgnPHByZSBjbGFzcz0ieG1sIiAvPicpLmFwcGVuZChjb2RlKTsKKworICAgIC8vIEhUTUwKKyAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAndGV4dC9odG1sJykgeworICAgICAgY29kZSA9ICQoJzxjb2RlIC8+JykuaHRtbChfLmVzY2FwZShjb250ZW50KSk7CisgICAgICBwcmUgPSAkKCc8cHJlIGNsYXNzPSJ4bWwiIC8+JykuYXBwZW5kKGNvZGUpOworCisgICAgLy8gSW1hZ2UKKyAgICB9IGVsc2UgaWYgKC9eaW1hZ2VcLy8udGVzdChjb250ZW50VHlwZSkpIHsKKyAgICAgIHByZSA9ICQoJzxpbWc+JykuYXR0cignc3JjJywgdXJsKTsKKworICAgIC8vIEF1ZGlvCisgICAgfSBlbHNlIGlmICgvXmF1ZGlvXC8vLnRlc3QoY29udGVudFR5cGUpICYmIHN1cHBvcnRzQXVkaW9QbGF5YmFjayhjb250ZW50VHlwZSkpIHsKKyAgICAgIHByZSA9ICQoJzxhdWRpbyBjb250cm9scz4nKS5hcHBlbmQoJCgnPHNvdXJjZT4nKS5hdHRyKCdzcmMnLCB1cmwpLmF0dHIoJ3R5cGUnLCBjb250ZW50VHlwZSkpOworCisgICAgLy8gRG93bmxvYWQKKyAgICB9IGVsc2UgaWYgKGhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXS50ZXN0KC9hdHRhY2htZW50LykgfHwKKyAgICAgICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXS50ZXN0KC9hdHRhY2htZW50LykgfHwKKyAgICAgICAgICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtRGVzY3JpcHRpb24nXS50ZXN0KC9GaWxlIFRyYW5zZmVyLykgfHwKKyAgICAgICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtZGVzY3JpcHRpb24nXS50ZXN0KC9GaWxlIFRyYW5zZmVyLykpIHsKKworICAgICAgaWYgKCdCbG9iJyBpbiB3aW5kb3cpIHsKKyAgICAgICAgdmFyIHR5cGUgPSBjb250ZW50VHlwZSB8fCAndGV4dC9odG1sJzsKKyAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHt0eXBlOiB0eXBlfSk7CisgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOworICAgICAgICB2YXIgaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOworICAgICAgICB2YXIgZmlsZU5hbWUgPSByZXNwb25zZS51cmwuc3Vic3RyKHJlc3BvbnNlLnVybC5sYXN0SW5kZXhPZignLycpICsgMSk7CisgICAgICAgIHZhciBkb3dubG9hZCA9IFt0eXBlLCBmaWxlTmFtZSwgaHJlZl0uam9pbignOicpOworCisgICAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7CisgICAgICAgIGEuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGRvd25sb2FkKTsKKyAgICAgICAgYS5pbm5lclRleHQgPSAnRG93bmxvYWQgJyArIGZpbGVOYW1lOworCisgICAgICAgIHByZSA9ICQoJzxkaXYvPicpLmFwcGVuZChhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZSA9ICQoJzxwcmUgY2xhc3M9Impzb24iIC8+JykuYXBwZW5kKCdEb3dubG9hZCBoZWFkZXJzIGRldGVjdGVkIGJ1dCB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBkb3dubG9hZGluZyBiaW5hcnkgdmlhIFhIUiAoQmxvYikuJyk7CisgICAgICB9CisKKyAgICAvLyBMb2NhdGlvbiBoZWFkZXIgYmFzZWQgcmVkaXJlY3QgZG93bmxvYWQKKyAgICB9IGVsc2UgaWYoaGVhZGVycy5sb2NhdGlvbiB8fCBoZWFkZXJzLkxvY2F0aW9uKSB7CisgICAgICB3aW5kb3cubG9jYXRpb24gPSByZXNwb25zZS51cmw7CisKKyAgICAvLyBBbnl0aGluZyBlbHNlIChDT1JTKQorICAgIH0gZWxzZSB7CisgICAgICBjb2RlID0gJCgnPGNvZGUgLz4nKS50ZXh0KGNvbnRlbnQpOworICAgICAgcHJlID0gJCgnPHByZSBjbGFzcz0ianNvbiIgLz4nKS5hcHBlbmQoY29kZSk7CisgICAgfQorICAgIHZhciByZXNwb25zZV9ib2R5ID0gcHJlOworICAgICQoJy5yZXF1ZXN0X3VybCcsICQodGhpcy5lbCkpLmh0bWwoJzxwcmU+PC9wcmU+Jyk7CisgICAgJCgnLnJlcXVlc3RfdXJsIHByZScsICQodGhpcy5lbCkpLnRleHQodXJsKTsKKyAgICAkKCcucmVzcG9uc2VfY29kZScsICQodGhpcy5lbCkpLmh0bWwoJzxwcmU+JyArIHJlc3BvbnNlLnN0YXR1cyArICc8L3ByZT4nKTsKKyAgICAkKCcucmVzcG9uc2VfYm9keScsICQodGhpcy5lbCkpLmh0bWwocmVzcG9uc2VfYm9keSk7CisgICAgJCgnLnJlc3BvbnNlX2hlYWRlcnMnLCAkKHRoaXMuZWwpKS5odG1sKCc8cHJlPicgKyBfLmVzY2FwZShKU09OLnN0cmluZ2lmeShyZXNwb25zZS5oZWFkZXJzLCBudWxsLCAnICAnKSkucmVwbGFjZSgvXG4vZywgJzxicj4nKSArICc8L3ByZT4nKTsKKyAgICAkKCcucmVzcG9uc2UnLCAkKHRoaXMuZWwpKS5zbGlkZURvd24oKTsKKyAgICAkKCcucmVzcG9uc2VfaGlkZXInLCAkKHRoaXMuZWwpKS5zaG93KCk7CisgICAgJCgnLnJlc3BvbnNlX3Rocm9iYmVyJywgJCh0aGlzLmVsKSkuaGlkZSgpOworICAgIHZhciByZXNwb25zZV9ib2R5X2VsID0gJCgnLnJlc3BvbnNlX2JvZHknLCAkKHRoaXMuZWwpKVswXTsKKworICAgIC8vIG9ubHkgaGlnaGxpZ2h0IHRoZSByZXNwb25zZSBpZiByZXNwb25zZSBpcyBsZXNzIHRoYW4gdGhyZXNob2xkLCBkZWZhdWx0IHN0YXRlIGlzIGhpZ2hsaWdodCByZXNwb25zZQorICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zOworICAgIGlmIChvcHRzLmhpZ2hsaWdodFNpemVUaHJlc2hvbGQgJiYgcmVzcG9uc2UuZGF0YS5sZW5ndGggPiBvcHRzLmhpZ2hsaWdodFNpemVUaHJlc2hvbGQpIHsKKyAgICAgIHJldHVybiByZXNwb25zZV9ib2R5X2VsOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaGxqcy5oaWdobGlnaHRCbG9jayhyZXNwb25zZV9ib2R5X2VsKTsKKyAgICB9CisgIH0sCisKKyAgdG9nZ2xlT3BlcmF0aW9uQ29udGVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGVsZW0gPSAkKCcjJyArIERvY3MuZXNjYXBlUmVzb3VyY2VOYW1lKHRoaXMucGFyZW50SWQgKyAnXycgKyB0aGlzLm5pY2tuYW1lICsgJ19jb250ZW50JykpOworICAgIGlmIChlbGVtLmlzKCc6dmlzaWJsZScpKXsKKyAgICAgIERvY3MuY29sbGFwc2VPcGVyYXRpb24oZWxlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERvY3MuZXhwYW5kT3BlcmF0aW9uKGVsZW0pOworICAgIH0KKyAgfQorfSk7CisKKyd1c2Ugc3RyaWN0JzsKKworU3dhZ2dlclVpLlZpZXdzLlBhcmFtZXRlckNvbnRlbnRUeXBlVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gICgpIHt9LAorCisgIHJlbmRlcjogZnVuY3Rpb24oKXsKKyAgICAkKHRoaXMuZWwpLmh0bWwoSGFuZGxlYmFycy50ZW1wbGF0ZXMucGFyYW1ldGVyX2NvbnRlbnRfdHlwZSh0aGlzLm1vZGVsKSk7CisKKyAgICAkKCdsYWJlbFtmb3I9cGFyYW1ldGVyQ29udGVudFR5cGVdJywgJCh0aGlzLmVsKSkudGV4dCgnUGFyYW1ldGVyIGNvbnRlbnQgdHlwZTonKTsKKworICAgIHJldHVybiB0aGlzOworICB9CisKK30pOworJ3VzZSBzdHJpY3QnOworCitTd2FnZ2VyVWkuVmlld3MuUGFyYW1ldGVyVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXsKKyAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdpc0FycmF5JywgZnVuY3Rpb24ocGFyYW0sIG9wdHMpIHsKKyAgICAgIGlmIChwYXJhbS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdhcnJheScgfHwgcGFyYW0uYWxsb3dNdWx0aXBsZSkgeworICAgICAgICBvcHRzLmZuKHRoaXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3B0cy5pbnZlcnNlKHRoaXMpOworICAgICAgfQorICAgIH0pOworICB9LAorCisgIHJlbmRlcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIHR5cGUgPSB0aGlzLm1vZGVsLnR5cGUgfHwgdGhpcy5tb2RlbC5kYXRhVHlwZTsKKworICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgIHZhciBzY2hlbWEgPSB0aGlzLm1vZGVsLnNjaGVtYTsKKyAgICAgIGlmIChzY2hlbWEgJiYgc2NoZW1hLiRyZWYpIHsKKyAgICAgICAgdmFyIHJlZiA9IHNjaGVtYS4kcmVmOworICAgICAgICBpZiAocmVmLmluZGV4T2YoJyMvZGVmaW5pdGlvbnMvJykgPT09IDApIHsKKyAgICAgICAgICB0eXBlID0gcmVmLnN1YnN0cmluZygnIy9kZWZpbml0aW9ucy8nLmxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHlwZSA9IHJlZjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRoaXMubW9kZWwudHlwZSA9IHR5cGU7CisgICAgdGhpcy5tb2RlbC5wYXJhbVR5cGUgPSB0aGlzLm1vZGVsLmluIHx8IHRoaXMubW9kZWwucGFyYW1UeXBlOworICAgIHRoaXMubW9kZWwuaXNCb2R5ID0gdGhpcy5tb2RlbC5wYXJhbVR5cGUgPT09ICdib2R5JyB8fCB0aGlzLm1vZGVsLmluID09PSAnYm9keSc7CisgICAgdGhpcy5tb2RlbC5pc0ZpbGUgPSB0eXBlICYmIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpbGUnOworICAgIHRoaXMubW9kZWwuZGVmYXVsdCA9ICh0aGlzLm1vZGVsLmRlZmF1bHQgfHwgdGhpcy5tb2RlbC5kZWZhdWx0VmFsdWUpOworCisgICAgaWYgKHRoaXMubW9kZWwuYWxsb3dhYmxlVmFsdWVzKSB7CisgICAgICB0aGlzLm1vZGVsLmlzTGlzdCA9IHRydWU7CisgICAgfQorCisgICAgdmFyIHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSgpOworICAgICQodGhpcy5lbCkuaHRtbCh0ZW1wbGF0ZSh0aGlzLm1vZGVsKSk7CisKKyAgICB2YXIgc2lnbmF0dXJlTW9kZWwgPSB7CisgICAgICBzYW1wbGVKU09OOiB0aGlzLm1vZGVsLnNhbXBsZUpTT04sCisgICAgICBpc1BhcmFtOiB0cnVlLAorICAgICAgc2lnbmF0dXJlOiB0aGlzLm1vZGVsLnNpZ25hdHVyZQorICAgIH07CisKKyAgICBpZiAodGhpcy5tb2RlbC5zYW1wbGVKU09OKSB7CisgICAgICB2YXIgc2lnbmF0dXJlVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuU2lnbmF0dXJlVmlldyh7bW9kZWw6IHNpZ25hdHVyZU1vZGVsLCB0YWdOYW1lOiAnZGl2J30pOworICAgICAgJCgnLm1vZGVsLXNpZ25hdHVyZScsICQodGhpcy5lbCkpLmFwcGVuZChzaWduYXR1cmVWaWV3LnJlbmRlcigpLmVsKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAkKCcubW9kZWwtc2lnbmF0dXJlJywgJCh0aGlzLmVsKSkuaHRtbCh0aGlzLm1vZGVsLnNpZ25hdHVyZSk7CisgICAgfQorCisgICAgdmFyIGlzUGFyYW0gPSBmYWxzZTsKKworICAgIGlmICh0aGlzLm1vZGVsLmlzQm9keSkgeworICAgICAgaXNQYXJhbSA9IHRydWU7CisgICAgfQorCisgICAgdmFyIGNvbnRlbnRUeXBlTW9kZWwgPSB7CisgICAgICBpc1BhcmFtOiBpc1BhcmFtCisgICAgfTsKKworICAgIGNvbnRlbnRUeXBlTW9kZWwuY29uc3VtZXMgPSB0aGlzLm1vZGVsLmNvbnN1bWVzOworCisgICAgaWYgKGlzUGFyYW0pIHsKKyAgICAgIHZhciBwYXJhbWV0ZXJDb250ZW50VHlwZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlBhcmFtZXRlckNvbnRlbnRUeXBlVmlldyh7bW9kZWw6IGNvbnRlbnRUeXBlTW9kZWx9KTsKKyAgICAgICQoJy5wYXJhbWV0ZXItY29udGVudC10eXBlJywgJCh0aGlzLmVsKSkuYXBwZW5kKHBhcmFtZXRlckNvbnRlbnRUeXBlVmlldy5yZW5kZXIoKS5lbCk7CisgICAgfQorCisgICAgZWxzZSB7CisgICAgICB2YXIgcmVzcG9uc2VDb250ZW50VHlwZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlJlc3BvbnNlQ29udGVudFR5cGVWaWV3KHttb2RlbDogY29udGVudFR5cGVNb2RlbH0pOworICAgICAgJCgnLnJlc3BvbnNlLWNvbnRlbnQtdHlwZScsICQodGhpcy5lbCkpLmFwcGVuZChyZXNwb25zZUNvbnRlbnRUeXBlVmlldy5yZW5kZXIoKS5lbCk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLy8gUmV0dXJuIGFuIGFwcHJvcHJpYXRlIHRlbXBsYXRlIGJhc2VkIG9uIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBsaXN0LCByZWFkb25seSwgcmVxdWlyZWQKKyAgdGVtcGxhdGU6IGZ1bmN0aW9uKCl7CisgICAgaWYgKHRoaXMubW9kZWwuaXNMaXN0KSB7CisgICAgICByZXR1cm4gSGFuZGxlYmFycy50ZW1wbGF0ZXMucGFyYW1fbGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWFkT25seSkgeworICAgICAgICBpZiAodGhpcy5tb2RlbC5yZXF1aXJlZCkgeworICAgICAgICAgIHJldHVybiBIYW5kbGViYXJzLnRlbXBsYXRlcy5wYXJhbV9yZWFkb25seV9yZXF1aXJlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gSGFuZGxlYmFycy50ZW1wbGF0ZXMucGFyYW1fcmVhZG9ubHk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0aGlzLm1vZGVsLnJlcXVpcmVkKSB7CisgICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtX3JlcXVpcmVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBIYW5kbGViYXJzLnRlbXBsYXRlcy5wYXJhbTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfSk7CisndXNlIHN0cmljdCc7CisKK1N3YWdnZXJVaS5WaWV3cy5SZXNvdXJjZVZpZXcgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpIHsKKyAgICBvcHRzID0gb3B0cyB8fCB7fTsKKyAgICB0aGlzLnJvdXRlciA9IG9wdHMucm91dGVyOworICAgIHRoaXMuYXV0aHMgPSBvcHRzLmF1dGhzOworICAgIGlmICgnJyA9PT0gdGhpcy5tb2RlbC5kZXNjcmlwdGlvbikgeworICAgICAgdGhpcy5tb2RlbC5kZXNjcmlwdGlvbiA9IG51bGw7CisgICAgfQorICAgIGlmICh0aGlzLm1vZGVsLmRlc2NyaXB0aW9uKSB7CisgICAgICB0aGlzLm1vZGVsLnN1bW1hcnkgPSB0aGlzLm1vZGVsLmRlc2NyaXB0aW9uOworICAgIH0KKyAgfSwKKworICByZW5kZXI6IGZ1bmN0aW9uKCl7CisgICAgdmFyIG1ldGhvZHMgPSB7fTsKKworCisgICAgJCh0aGlzLmVsKS5odG1sKEhhbmRsZWJhcnMudGVtcGxhdGVzLnJlc291cmNlKHRoaXMubW9kZWwpKTsKKworICAgIC8vIFJlbmRlciBlYWNoIG9wZXJhdGlvbgorICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5vcGVyYXRpb25zQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBvcGVyYXRpb24gPSB0aGlzLm1vZGVsLm9wZXJhdGlvbnNBcnJheVtpXTsKKyAgICAgIHZhciBjb3VudGVyID0gMDsKKyAgICAgIHZhciBpZCA9IG9wZXJhdGlvbi5uaWNrbmFtZTsKKworICAgICAgd2hpbGUgKHR5cGVvZiBtZXRob2RzW2lkXSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgaWQgPSBpZCArICdfJyArIGNvdW50ZXI7CisgICAgICAgIGNvdW50ZXIgKz0gMTsKKyAgICAgIH0KKworICAgICAgbWV0aG9kc1tpZF0gPSBvcGVyYXRpb247CisKKyAgICAgIG9wZXJhdGlvbi5uaWNrbmFtZSA9IGlkOworICAgICAgb3BlcmF0aW9uLnBhcmVudElkID0gdGhpcy5tb2RlbC5pZDsKKyAgICAgIHRoaXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7CisgICAgfQorCisgICAgJCgnLnRvZ2dsZUVuZHBvaW50TGlzdCcsIHRoaXMuZWwpLmNsaWNrKHRoaXMuY2FsbERvY3MuYmluZCh0aGlzLCAndG9nZ2xlRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UnKSk7CisgICAgJCgnLmNvbGxhcHNlUmVzb3VyY2UnLCB0aGlzLmVsKS5jbGljayh0aGlzLmNhbGxEb2NzLmJpbmQodGhpcywgJ2NvbGxhcHNlT3BlcmF0aW9uc0ZvclJlc291cmNlJykpOworICAgICQoJy5leHBhbmRSZXNvdXJjZScsIHRoaXMuZWwpLmNsaWNrKHRoaXMuY2FsbERvY3MuYmluZCh0aGlzLCAnZXhwYW5kT3BlcmF0aW9uc0ZvclJlc291cmNlJykpOworCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgYWRkT3BlcmF0aW9uOiBmdW5jdGlvbihvcGVyYXRpb24pIHsKKworICAgIG9wZXJhdGlvbi5udW1iZXIgPSB0aGlzLm51bWJlcjsKKworICAgIC8vIFJlbmRlciBhbiBvcGVyYXRpb24gYW5kIGFkZCBpdCB0byBvcGVyYXRpb25zIGxpCisgICAgdmFyIG9wZXJhdGlvblZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLk9wZXJhdGlvblZpZXcoeworICAgICAgbW9kZWw6IG9wZXJhdGlvbiwKKyAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXIsCisgICAgICB0YWdOYW1lOiAnbGknLAorICAgICAgY2xhc3NOYW1lOiAnZW5kcG9pbnQnLAorICAgICAgc3dhZ2dlck9wdGlvbnM6IHRoaXMub3B0aW9ucy5zd2FnZ2VyT3B0aW9ucywKKyAgICAgIGF1dGhzOiB0aGlzLmF1dGhzCisgICAgfSk7CisKKyAgICAkKCcuZW5kcG9pbnRzJywgJCh0aGlzLmVsKSkuYXBwZW5kKG9wZXJhdGlvblZpZXcucmVuZGVyKCkuZWwpOworCisgICAgdGhpcy5udW1iZXIrKzsKKworICB9LAorICAvLyBHZW5lcmljIEV2ZW50IGhhbmRsZXIgKGBEb2NzYCBpcyBnbG9iYWwpCisKKworICBjYWxsRG9jczogZnVuY3Rpb24oZm5OYW1lLCBlKSB7CisgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIERvY3NbZm5OYW1lXShlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJykpOworICB9Cit9KTsKKyd1c2Ugc3RyaWN0JzsKKworU3dhZ2dlclVpLlZpZXdzLlJlc3BvbnNlQ29udGVudFR5cGVWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoeworICBpbml0aWFsaXplOiBmdW5jdGlvbigpe30sCisKKyAgcmVuZGVyOiBmdW5jdGlvbigpeworICAgICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5yZXNwb25zZV9jb250ZW50X3R5cGUodGhpcy5tb2RlbCkpOworCisgICAgJCgnbGFiZWxbZm9yPXJlc3BvbnNlQ29udGVudFR5cGVdJywgJCh0aGlzLmVsKSkudGV4dCgnUmVzcG9uc2UgQ29udGVudCBUeXBlJyk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfSk7CisndXNlIHN0cmljdCc7CisKK1N3YWdnZXJVaS5WaWV3cy5TaWduYXR1cmVWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoeworICBldmVudHM6IHsKKyAgICAnY2xpY2sgYS5kZXNjcmlwdGlvbi1saW5rJyAgICAgICA6ICdzd2l0Y2hUb0Rlc2NyaXB0aW9uJywKKyAgICAnY2xpY2sgYS5zbmlwcGV0LWxpbmsnICAgICAgICAgICA6ICdzd2l0Y2hUb1NuaXBwZXQnLAorICAgICdtb3VzZWRvd24gLnNuaXBwZXQnICAgICAgICAgIDogJ3NuaXBwZXRUb1RleHRBcmVhJworICB9LAorCisgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHsKKworICB9LAorCisgIHJlbmRlcjogZnVuY3Rpb24oKXsKKworICAgICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5zaWduYXR1cmUodGhpcy5tb2RlbCkpOworCisgICAgdGhpcy5zd2l0Y2hUb1NuaXBwZXQoKTsKKworICAgIHRoaXMuaXNQYXJhbSA9IHRoaXMubW9kZWwuaXNQYXJhbTsKKworICAgIGlmICh0aGlzLmlzUGFyYW0pIHsKKyAgICAgICQoJy5ub3RpY2UnLCAkKHRoaXMuZWwpKS50ZXh0KCdDbGljayB0byBzZXQgYXMgcGFyYW1ldGVyIHZhbHVlJyk7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLy8gaGFuZGxlciBmb3Igc2hvdyBzaWduYXR1cmUKKyAgc3dpdGNoVG9EZXNjcmlwdGlvbjogZnVuY3Rpb24oZSl7CisgICAgaWYgKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9CisKKyAgICAkKCcuc25pcHBldCcsICQodGhpcy5lbCkpLmhpZGUoKTsKKyAgICAkKCcuZGVzY3JpcHRpb24nLCAkKHRoaXMuZWwpKS5zaG93KCk7CisgICAgJCgnLmRlc2NyaXB0aW9uLWxpbmsnLCAkKHRoaXMuZWwpKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKKyAgICAkKCcuc25pcHBldC1saW5rJywgJCh0aGlzLmVsKSkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CisgIH0sCisKKyAgLy8gaGFuZGxlciBmb3Igc2hvdyBzYW1wbGUKKyAgc3dpdGNoVG9TbmlwcGV0OiBmdW5jdGlvbihlKXsKKyAgICBpZiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH0KKworICAgICQoJy5kZXNjcmlwdGlvbicsICQodGhpcy5lbCkpLmhpZGUoKTsKKyAgICAkKCcuc25pcHBldCcsICQodGhpcy5lbCkpLnNob3coKTsKKyAgICAkKCcuc25pcHBldC1saW5rJywgJCh0aGlzLmVsKSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CisgICAgJCgnLmRlc2NyaXB0aW9uLWxpbmsnLCAkKHRoaXMuZWwpKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKKyAgfSwKKworICAvLyBoYW5kbGVyIGZvciBzbmlwcGV0IHRvIHRleHQgYXJlYQorICBzbmlwcGV0VG9UZXh0QXJlYTogZnVuY3Rpb24oZSkgeworICAgIGlmICh0aGlzLmlzUGFyYW0pIHsKKyAgICAgIGlmIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgfQorCisgICAgICB2YXIgdGV4dEFyZWEgPSAkKCd0ZXh0YXJlYScsICQodGhpcy5lbC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSkpOworICAgICAgaWYgKCQudHJpbSh0ZXh0QXJlYS52YWwoKSkgPT09ICcnKSB7CisgICAgICAgIHRleHRBcmVhLnZhbCh0aGlzLm1vZGVsLnNhbXBsZUpTT04pOworICAgICAgfQorICAgIH0KKyAgfQorfSk7CisndXNlIHN0cmljdCc7CisKK1N3YWdnZXJVaS5WaWV3cy5TdGF0dXNDb2RlVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdHMpIHsKKyAgICB0aGlzLm9wdGlvbnMgPSBvcHRzIHx8IHt9OworICAgIHRoaXMucm91dGVyID0gdGhpcy5vcHRpb25zLnJvdXRlcjsKKyAgfSwKKworICByZW5kZXI6IGZ1bmN0aW9uKCl7CisgICAgJCh0aGlzLmVsKS5odG1sKEhhbmRsZWJhcnMudGVtcGxhdGVzLnN0YXR1c19jb2RlKHRoaXMubW9kZWwpKTsKKworICAgIGlmICh0aGlzLnJvdXRlci5hcGkubW9kZWxzLmhhc093blByb3BlcnR5KHRoaXMubW9kZWwucmVzcG9uc2VNb2RlbCkpIHsKKyAgICAgIHZhciByZXNwb25zZU1vZGVsID0geworICAgICAgICBzYW1wbGVKU09OOiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlci5hcGkubW9kZWxzW3RoaXMubW9kZWwucmVzcG9uc2VNb2RlbF0uY3JlYXRlSlNPTlNhbXBsZSgpLCBudWxsLCAyKSwKKyAgICAgICAgaXNQYXJhbTogZmFsc2UsCisgICAgICAgIHNpZ25hdHVyZTogdGhpcy5yb3V0ZXIuYXBpLm1vZGVsc1t0aGlzLm1vZGVsLnJlc3BvbnNlTW9kZWxdLmdldE1vY2tTaWduYXR1cmUoKSwKKyAgICAgIH07CisKKyAgICAgIHZhciByZXNwb25zZU1vZGVsVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuU2lnbmF0dXJlVmlldyh7bW9kZWw6IHJlc3BvbnNlTW9kZWwsIHRhZ05hbWU6ICdkaXYnfSk7CisgICAgICAkKCcubW9kZWwtc2lnbmF0dXJlJywgdGhpcy4kZWwpLmFwcGVuZChyZXNwb25zZU1vZGVsVmlldy5yZW5kZXIoKS5lbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICQoJy5tb2RlbC1zaWduYXR1cmUnLCB0aGlzLiRlbCkuaHRtbCgnJyk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICB9Cit9KTt9KS5jYWxsKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3dhZ2dlci9zd2FnZ2VyLXVpLm1pbi5qcyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvc3dhZ2dlci11aS5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyMWI4OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL3N3YWdnZXIvc3dhZ2dlci11aS5taW4uanMKQEAgLTAsMCArMSwyOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7ZS5oaXN0b3J5PWUuaGlzdG9yeXx8W10sZS5oaXN0b3J5LnB1c2goYXJndW1lbnRzKSx0aGlzLmNvbnNvbGUmJmNvbnNvbGUubG9nKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylbMF0pfXRoaXMuSGFuZGxlYmFycz10aGlzLkhhbmRsZWJhcnN8fHt9LHRoaXMuSGFuZGxlYmFycy50ZW1wbGF0ZXM9dGhpcy5IYW5kbGViYXJzLnRlbXBsYXRlc3x8e30sdGhpcy5IYW5kbGViYXJzLnRlbXBsYXRlcy5hcGlrZXlfYnV0dG9uX3ZpZXc9SGFuZGxlYmFycy50ZW1wbGF0ZSh7Y29tcGlsZXI6WzYsIj49IDIuMC4wLWJldGEuMSJdLG1haW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiI8IS0tZGl2IGNsYXNzPSdhdXRoX2J1dHRvbicgaWQ9J2FwaWtleV9idXR0b24nPjxpbWcgY2xhc3M9J2F1dGhfaWNvbicgYWx0PSdhcHBseSBhcGkga2V5JyBzcmM9J2ltYWdlcy9hcGlrZXkuanBlZyc+PC9kaXYtLT5cbjxkaXYgY2xhc3M9J2F1dGhfY29udGFpbmVyJyBpZD0nYXBpa2V5X2NvbnRhaW5lcic+XG4gIDxkaXYgY2xhc3M9J2tleV9pbnB1dF9jb250YWluZXInPlxuICAgIDxkaXYgY2xhc3M9J2F1dGhfbGFiZWwnPiIrcygoaT1udWxsIT0oaT10LmtleU5hbWV8fChudWxsIT1lP2Uua2V5TmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToia2V5TmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrJzwvZGl2PlxuICAgIDxpbnB1dCBwbGFjZWhvbGRlcj0iYXBpX2tleSIgY2xhc3M9ImF1dGhfaW5wdXQiIGlkPSJpbnB1dF9hcGlLZXlfZW50cnkiIG5hbWU9ImFwaUtleSIgdHlwZT0idGV4dCIvPlxuICAgIDxkaXYgY2xhc3M9XCdhdXRoX3N1Ym1pdFwnPjxhIGNsYXNzPVwnYXV0aF9zdWJtaXRfYnV0dG9uXCcgaWQ9ImFwcGx5X2FwaV9rZXkiIGhyZWY9IiMiPmFwcGx5PC9hPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4nfSx1c2VEYXRhOiEwfSksdGhpcy5IYW5kbGViYXJzLnRlbXBsYXRlcy5iYXNpY19hdXRoX2J1dHRvbl92aWV3PUhhbmRsZWJhcnMudGVtcGxhdGUoe2NvbXBpbGVyOls2LCI+PSAyLjAuMC1iZXRhLjEiXSxtYWluOmZ1bmN0aW9uKCl7cmV0dXJuJzxkaXYgY2xhc3M9XCdhdXRoX2J1dHRvblwnIGlkPVwnYmFzaWNfYXV0aF9idXR0b25cJz48aW1nIGNsYXNzPVwnYXV0aF9pY29uXCcgc3JjPVwnaW1hZ2VzL3Bhc3N3b3JkLmpwZWdcJz48L2Rpdj5cbjxkaXYgY2xhc3M9XCdhdXRoX2NvbnRhaW5lclwnIGlkPVwnYmFzaWNfYXV0aF9jb250YWluZXJcJz5cbiAgPGRpdiBjbGFzcz1cJ2tleV9pbnB1dF9jb250YWluZXJcJz5cbiAgICA8ZGl2IGNsYXNzPSJhdXRoX2xhYmVsIj5Vc2VybmFtZTwvZGl2PlxuICAgIDxpbnB1dCBwbGFjZWhvbGRlcj0idXNlcm5hbWUiIGNsYXNzPSJhdXRoX2lucHV0IiBpZD0iaW5wdXRfdXNlcm5hbWUiIG5hbWU9InVzZXJuYW1lIiB0eXBlPSJ0ZXh0Ii8+XG4gICAgPGRpdiBjbGFzcz0iYXV0aF9sYWJlbCI+UGFzc3dvcmQ8L2Rpdj5cbiAgICA8aW5wdXQgcGxhY2Vob2xkZXI9InBhc3N3b3JkIiBjbGFzcz0iYXV0aF9pbnB1dCIgaWQ9ImlucHV0X3Bhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiLz5cbiAgICA8ZGl2IGNsYXNzPVwnYXV0aF9zdWJtaXRcJz48YSBjbGFzcz1cJ2F1dGhfc3VibWl0X2J1dHRvblwnIGlkPSJhcHBseV9iYXNpY19hdXRoIiBocmVmPSIjIj5hcHBseTwvYT48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuJ30sdXNlRGF0YTohMH0pLHRoaXMuSGFuZGxlYmFycy50ZW1wbGF0ZXMuY29udGVudF90eXBlPUhhbmRsZWJhcnMudGVtcGxhdGUoezE6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iIjtyZXR1cm4gaT10LmVhY2guY2FsbChlLG51bGwhPWU/ZS5wcm9kdWNlczplLHtuYW1lOiJlYWNoIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgyLHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvfSwyOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5sYW1iZGEscj0nCTxvcHRpb24gdmFsdWU9Iic7cmV0dXJuIHQ9bihlLGUpLG51bGwhPXQmJihyKz10KSxyKz0nIj4nLHQ9bihlLGUpLG51bGwhPXQmJihyKz10KSxyKyI8L29wdGlvbj5cbiJ9LDQ6ZnVuY3Rpb24oKXtyZXR1cm4nICA8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi9qc29uIj5hcHBsaWNhdGlvbi9qc29uPC9vcHRpb24+XG4nfSxjb21waWxlcjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sbWFpbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSc8bGFiZWwgZm9yPSJjb250ZW50VHlwZSI+PC9sYWJlbD5cbjxzZWxlY3QgbmFtZT0iY29udGVudFR5cGUiPlxuJztyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UucHJvZHVjZXM6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDEsciksaW52ZXJzZTp0aGlzLnByb2dyYW0oNCxyKSxkYXRhOnJ9KSxudWxsIT1pJiYobys9aSksbysiPC9zZWxlY3Q+XG4ifSx1c2VEYXRhOiEwfSksJChmdW5jdGlvbigpeyQuZm4udkFsaWduPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPSQodGhpcykuaGVpZ2h0KCksdD0kKHRoaXMpLnBhcmVudCgpLmhlaWdodCgpLG49KHQtZSkvMjskKHRoaXMpLmNzcygibWFyZ2luLXRvcCIsbil9KX0sJC5mbi5zdHJldGNoRm9ybXRhc3RpY0lucHV0V2lkdGhUb1BhcmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0kKHRoaXMpLmNsb3Nlc3QoImZvcm0iKS5pbm5lcldpZHRoKCksdD1wYXJzZUludCgkKHRoaXMpLmNsb3Nlc3QoImZvcm0iKS5jc3MoInBhZGRpbmctbGVmdCIpLDEwKStwYXJzZUludCgkKHRoaXMpLmNsb3Nlc3QoImZvcm0iKS5jc3MoInBhZGRpbmctcmlnaHQiKSwxMCksbj1wYXJzZUludCgkKHRoaXMpLmNzcygicGFkZGluZy1sZWZ0IiksMTApK3BhcnNlSW50KCQodGhpcykuY3NzKCJwYWRkaW5nLXJpZ2h0IiksMTApOyQodGhpcykuY3NzKCJ3aWR0aCIsZS10LW4pfSl9LCQoImZvcm0uZm9ybXRhc3RpYyBsaS5zdHJpbmcgaW5wdXQsIGZvcm0uZm9ybXRhc3RpYyB0ZXh0YXJlYSIpLnN0cmV0Y2hGb3JtdGFzdGljSW5wdXRXaWR0aFRvUGFyZW50KCksJCgidWwuZG93bnBsYXllZCBsaSBkaXYuY29udGVudCBwIikudkFsaWduKCksJCgiZm9ybS5zYW5kYm94Iikuc3VibWl0KGZ1bmN0aW9uKCl7dmFyIGU9ITA7cmV0dXJuICQodGhpcykuZmluZCgiaW5wdXQucmVxdWlyZWQiKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmVDbGFzcygiZXJyb3IiKSwiIj09PSQodGhpcykudmFsKCkmJigkKHRoaXMpLmFkZENsYXNzKCJlcnJvciIpLCQodGhpcykud2lnZ2xlKCksZT0hMSl9KSxlfSl9KSxGdW5jdGlvbi5wcm90b3R5cGUuYmluZCYmY29uc29sZSYmIm9iamVjdCI9PXR5cGVvZiBjb25zb2xlLmxvZyYmWyJsb2ciLCJpbmZvIiwid2FybiIsImVycm9yIiwiYXNzZXJ0IiwiZGlyIiwiY2xlYXIiLCJwcm9maWxlIiwicHJvZmlsZUVuZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7Y29uc29sZVtlXT10aGlzLmJpbmQoY29uc29sZVtlXSxjb25zb2xlKX0sRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwpLHdpbmRvdy5Eb2NzPXtzaGViYW5nOmZ1bmN0aW9uKCl7dmFyIGU9JC5wYXJhbS5mcmFnbWVudCgpLnNwbGl0KCIvIik7c3dpdGNoKGUuc2hpZnQoKSxlLmxlbmd0aCl7Y2FzZSAxOnZhciB0PSJyZXNvdXJjZV8iK2VbMF07RG9jcy5leHBhbmRFbmRwb2ludExpc3RGb3JSZXNvdXJjZShlWzBdKSwkKCIjIit0KS5zbGlkZXRvKHtoaWdobGlnaHQ6ITF9KTticmVhaztjYXNlIDI6RG9jcy5leHBhbmRFbmRwb2ludExpc3RGb3JSZXNvdXJjZShlWzBdKSwkKCIjIit0KS5zbGlkZXRvKHtoaWdobGlnaHQ6ITF9KTt2YXIgbj1lLmpvaW4oIl8iKSxyPW4rIl9jb250ZW50IjtEb2NzLmV4cGFuZE9wZXJhdGlvbigkKCIjIityKSksJCgiIyIrbikuc2xpZGV0byh7aGlnaGxpZ2h0OiExfSl9fSx0b2dnbGVFbmRwb2ludExpc3RGb3JSZXNvdXJjZTpmdW5jdGlvbihlKXt2YXIgdD0kKCJsaSNyZXNvdXJjZV8iK0RvY3MuZXNjYXBlUmVzb3VyY2VOYW1lKGUpKyIgdWwuZW5kcG9pbnRzIik7dC5pcygiOnZpc2libGUiKT9Eb2NzLmNvbGxhcHNlRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UoZSk6RG9jcy5leHBhbmRFbmRwb2ludExpc3RGb3JSZXNvdXJjZShlKX0sZXhwYW5kRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2U6ZnVuY3Rpb24oZSl7dmFyIGU9RG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUoZSk7aWYoIiI9PWUpcmV0dXJuIHZvaWQgJCgiLnJlc291cmNlIHVsLmVuZHBvaW50cyIpLnNsaWRlRG93bigpOyQoImxpI3Jlc291cmNlXyIrZSkuYWRkQ2xhc3MoImFjdGl2ZSIpO3ZhciB0PSQoImxpI3Jlc291cmNlXyIrZSsiIHVsLmVuZHBvaW50cyIpO3Quc2xpZGVEb3duKCl9LGNvbGxhcHNlRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2U6ZnVuY3Rpb24oZSl7dmFyIGU9RG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUoZSk7aWYoIiI9PWUpcmV0dXJuIHZvaWQgJCgiLnJlc291cmNlIHVsLmVuZHBvaW50cyIpLnNsaWRlVXAoKTskKCJsaSNyZXNvdXJjZV8iK2UpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKTt2YXIgdD0kKCJsaSNyZXNvdXJjZV8iK2UrIiB1bC5lbmRwb2ludHMiKTt0LnNsaWRlVXAoKX0sZXhwYW5kT3BlcmF0aW9uc0ZvclJlc291cmNlOmZ1bmN0aW9uKGUpe3JldHVybiBEb2NzLmV4cGFuZEVuZHBvaW50TGlzdEZvclJlc291cmNlKGUpLCIiPT1lP3ZvaWQgJCgiLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQiKS5zbGlkZURvd24oKTp2b2lkICQoImxpI3Jlc291cmNlXyIrRG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUoZSkrIiBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQiKS5lYWNoKGZ1bmN0aW9uKCl7RG9jcy5leHBhbmRPcGVyYXRpb24oJCh0aGlzKSl9KX0sY29sbGFwc2VPcGVyYXRpb25zRm9yUmVzb3VyY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIERvY3MuZXhwYW5kRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UoZSksIiI9PWU/dm9pZCAkKCIucmVzb3VyY2UgdWwuZW5kcG9pbnRzIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCIpLnNsaWRlVXAoKTp2b2lkICQoImxpI3Jlc291cmNlXyIrRG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUoZSkrIiBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQiKS5lYWNoKGZ1bmN0aW9uKCl7RG9jcy5jb2xsYXBzZU9wZXJhdGlvbigkKHRoaXMpKX0pfSxlc2NhcGVSZXNvdXJjZU5hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvWyEiIyQlJicoKSorLC5cLzo7PD0+P0BcW1xcXF1cXmB7fH1+XS9nLCJcXCQmIil9LGV4cGFuZE9wZXJhdGlvbjpmdW5jdGlvbihlKXtlLnNsaWRlRG93bigpfSxjb2xsYXBzZU9wZXJhdGlvbjpmdW5jdGlvbihlKXtlLnNsaWRlVXAoKX19LEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInNhbml0aXplIixmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksIiIpLG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcoZSl9KSx0aGlzLkhhbmRsZWJhcnMudGVtcGxhdGVzLm1haW49SGFuZGxlYmFycy50ZW1wbGF0ZSh7MTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPXRoaXMubGFtYmRhLGE9dGhpcy5lc2NhcGVFeHByZXNzaW9uLHM9JyAgPGRpdiBjbGFzcz0iaW5mb190aXRsZSI+JythKG8obnVsbCE9KGk9bnVsbCE9ZT9lLmluZm86ZSk/aS50aXRsZTppLGUpKSsnPC9kaXY+XG4gIDxkaXYgY2xhc3M9ImluZm9fZGVzY3JpcHRpb24gbWFya2Rvd24iPic7cmV0dXJuIGk9byhudWxsIT0oaT1udWxsIT1lP2UuaW5mbzplKT9pLmRlc2NyaXB0aW9uOmksZSksbnVsbCE9aSYmKHMrPWkpLHMrPSI8L2Rpdj5cbiIsaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UuZXh0ZXJuYWxEb2NzOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgyLHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihzKz1pKSxzKz0iICAiLGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9KGk9bnVsbCE9ZT9lLmluZm86ZSk/aS50ZXJtc09mU2VydmljZVVybDppLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oNCxyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9KSxudWxsIT1pJiYocys9aSkscys9IlxuICAiLGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9KGk9bnVsbCE9KGk9bnVsbCE9ZT9lLmluZm86ZSk/aS5jb250YWN0OmkpP2kubmFtZTppLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oNixyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9KSxudWxsIT1pJiYocys9aSkscys9IlxuICAiLGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9KGk9bnVsbCE9KGk9bnVsbCE9ZT9lLmluZm86ZSk/aS5jb250YWN0OmkpP2kudXJsOmkse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSg4LHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihzKz1pKSxzKz0iXG4gICIsaT10WyJpZiJdLmNhbGwoZSxudWxsIT0oaT1udWxsIT0oaT1udWxsIT1lP2UuaW5mbzplKT9pLmNvbnRhY3Q6aSk/aS5lbWFpbDppLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMTAsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHMrPWkpLHMrPSJcbiAgIixpPXRbImlmIl0uY2FsbChlLG51bGwhPShpPW51bGwhPWU/ZS5pbmZvOmUpP2kubGljZW5zZTppLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMTIsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHMrPWkpLHMrIlxuIn0sMjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMubGFtYmRhLHI9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIgIDxoNT5Nb3JlIGRvY3VtZW50YXRpb25zPC9oNT5cbiAgPHA+IityKG4obnVsbCE9KHQ9bnVsbCE9ZT9lLmV4dGVybmFsRG9jczplKT90LmRlc2NyaXB0aW9uOnQsZSkpKyc8L3A+XG4gIDxhIGhyZWY9IicrcihuKG51bGwhPSh0PW51bGwhPWU/ZS5leHRlcm5hbERvY3M6ZSk/dC51cmw6dCxlKSkrJyIgdGFyZ2V0PSJfYmxhbmsiPicrcihuKG51bGwhPSh0PW51bGwhPWU/ZS5leHRlcm5hbERvY3M6ZSk/dC51cmw6dCxlKSkrIjwvYT5cbiJ9LDQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLmxhbWJkYSxyPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4nPGRpdiBjbGFzcz0iaW5mb190b3MiPjxhIGhyZWY9IicrcihuKG51bGwhPSh0PW51bGwhPWU/ZS5pbmZvOmUpP3QudGVybXNPZlNlcnZpY2VVcmw6dCxlKSkrJyI+VGVybXMgb2Ygc2VydmljZTwvYT48L2Rpdj4nfSw2OmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5sYW1iZGEscj10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIjxkaXYgY2xhc3M9J2luZm9fbmFtZSc+Q3JlYXRlZCBieSAiK3IobihudWxsIT0odD1udWxsIT0odD1udWxsIT1lP2UuaW5mbzplKT90LmNvbnRhY3Q6dCk/dC5uYW1lOnQsZSkpKyI8L2Rpdj4ifSw4OmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5sYW1iZGEscj10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIjxkaXYgY2xhc3M9J2luZm9fdXJsJz5TZWUgbW9yZSBhdCA8YSBocmVmPVwiIityKG4obnVsbCE9KHQ9bnVsbCE9KHQ9bnVsbCE9ZT9lLmluZm86ZSk/dC5jb250YWN0OnQpP3QudXJsOnQsZSkpKyciPicrcihuKG51bGwhPSh0PW51bGwhPSh0PW51bGwhPWU/ZS5pbmZvOmUpP3QuY29udGFjdDp0KT90LnVybDp0LGUpKSsiPC9hPjwvZGl2PiJ9LDEwOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5sYW1iZGEscj10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIjxkaXYgY2xhc3M9J2luZm9fZW1haWwnPjxhIGhyZWY9XCJtYWlsdG86IityKG4obnVsbCE9KHQ9bnVsbCE9KHQ9bnVsbCE9ZT9lLmluZm86ZSk/dC5jb250YWN0OnQpP3QuZW1haWw6dCxlKSkrIj9zdWJqZWN0PSIrcihuKG51bGwhPSh0PW51bGwhPWU/ZS5pbmZvOmUpP3QudGl0bGU6dCxlKSkrJyI+Q29udGFjdCB0aGUgZGV2ZWxvcGVyPC9hPjwvZGl2Pid9LDEyOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5sYW1iZGEscj10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIjxkaXYgY2xhc3M9J2luZm9fbGljZW5zZSc+PGEgaHJlZj0nIityKG4obnVsbCE9KHQ9bnVsbCE9KHQ9bnVsbCE9ZT9lLmluZm86ZSk/dC5saWNlbnNlOnQpP3QudXJsOnQsZSkpKyInPiIrcihuKG51bGwhPSh0PW51bGwhPSh0PW51bGwhPWU/ZS5pbmZvOmUpP3QubGljZW5zZTp0KT90Lm5hbWU6dCxlKSkrIjwvYT48L2Rpdj4ifSwxNDpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMubGFtYmRhLHI9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybicgICAgLCA8c3BhbiBzdHlsZT0iZm9udC12YXJpYW50OiBzbWFsbC1jYXBzIj5hcGkgdmVyc2lvbjwvc3Bhbj46ICcrcihuKG51bGwhPSh0PW51bGwhPWU/ZS5pbmZvOmUpP3QudmVyc2lvbjp0LGUpKSsiXG4gICAgIn0sMTY6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybicgICAgPHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0Ij48YSBocmVmPSInK3MoKGk9bnVsbCE9KGk9dC52YWxpZGF0b3JVcmx8fChudWxsIT1lP2UudmFsaWRhdG9yVXJsOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJ2YWxpZGF0b3JVcmwiLGhhc2g6e30sZGF0YTpyfSk6aSkpKyIvZGVidWc/dXJsPSIrcygoaT1udWxsIT0oaT10LnVybHx8KG51bGwhPWU/ZS51cmw6ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6InVybCIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrJyI+PGltZyBpZD0idmFsaWRhdG9yIiBzcmM9IicrcygoaT1udWxsIT0oaT10LnZhbGlkYXRvclVybHx8KG51bGwhPWU/ZS52YWxpZGF0b3JVcmw6ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6InZhbGlkYXRvclVybCIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIj91cmw9IitzKChpPW51bGwhPShpPXQudXJsfHwobnVsbCE9ZT9lLnVybDplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToidXJsIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsnIj48L2E+XG4gICAgPC9zcGFuPlxuJ30sY29tcGlsZXI6WzYsIj49IDIuMC4wLWJldGEuMSJdLG1haW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPSJmdW5jdGlvbiIscz10LmhlbHBlck1pc3NpbmcsbD10aGlzLmVzY2FwZUV4cHJlc3Npb24sdT0iPGRpdiBjbGFzcz0naW5mbycgaWQ9J2FwaV9pbmZvJz5cbiI7cmV0dXJuIGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lLmluZm86ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDEsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHUrPWkpLHUrPSI8L2Rpdj5cbjxkaXYgY2xhc3M9J2NvbnRhaW5lcicgaWQ9J3Jlc291cmNlc19jb250YWluZXInPlxuICA8dWwgaWQ9J3Jlc291cmNlcyc+PC91bD5cblxuICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgPGJyPlxuICAgIDxicj5cbiAgICA8aDQgc3R5bGU9XCJjb2xvcjogIzk5OVwiPlsgPHNwYW4gc3R5bGU9XCJmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHNcIj5iYXNlIHVybDwvc3Bhbj46ICIrbCgobz1udWxsIT0obz10LmJhc2VQYXRofHwobnVsbCE9ZT9lLmJhc2VQYXRoOmUpKT9vOnMsdHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJiYXNlUGF0aCIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrIlxuIixpPXRbImlmIl0uY2FsbChlLG51bGwhPShpPW51bGwhPWU/ZS5pbmZvOmUpP2kudmVyc2lvbjppLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMTQsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHUrPWkpLHUrPSJdXG4iLGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lLnZhbGlkYXRvclVybDplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMTYsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHUrPWkpLHUrIiAgICA8L2g0PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4ifSx1c2VEYXRhOiEwfSksdGhpcy5IYW5kbGViYXJzLnRlbXBsYXRlcy5vcGVyYXRpb249SGFuZGxlYmFycy50ZW1wbGF0ZSh7MTpmdW5jdGlvbigpe3JldHVybiJkZXByZWNhdGVkIn0sMzpmdW5jdGlvbigpe3JldHVybiIgICAgICAgICAgICA8aDQ+V2FybmluZzogRGVwcmVjYXRlZDwvaDQ+XG4ifSw1OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT0iZnVuY3Rpb24iLHM9dC5oZWxwZXJNaXNzaW5nLGw9JyAgICAgICAgPGg0PkltcGxlbWVudGF0aW9uIE5vdGVzPC9oND5cbiAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24iPic7cmV0dXJuIG89bnVsbCE9KG89dC5kZXNjcmlwdGlvbnx8KG51bGwhPWU/ZS5kZXNjcmlwdGlvbjplKSk/bzpzLGk9dHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJkZXNjcmlwdGlvbiIsaGFzaDp7fSxkYXRhOnJ9KTpvLG51bGwhPWkmJihsKz1pKSxsKyI8L2Rpdj5cbiJ9LDc6ZnVuY3Rpb24oKXtyZXR1cm4nICAgICAgICA8ZGl2IGNsYXNzPSJhdXRoIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImFwaS1pYyBpYy1lcnJvciI+PC9zcGFuPid9LDk6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0nICAgICAgICAgIDxkaXYgaWQ9ImFwaV9pbmZvcm1hdGlvbl9wYW5lbCIgc3R5bGU9InRvcDogNTI2cHg7IGxlZnQ6IDc3NnB4OyBkaXNwbGF5OiBub25lOyI+XG4nO3JldHVybiBpPXQuZWFjaC5jYWxsKGUsZSx7bmFtZToiZWFjaCIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMTAsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG8rIiAgICAgICAgICA8L2Rpdj5cbiJ9LDEwOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5sYW1iZGEscj10aGlzLmVzY2FwZUV4cHJlc3Npb24saT0iICAgICAgICAgICAgPGRpdiB0aXRsZT0nIjtyZXR1cm4gdD1uKG51bGwhPWU/ZS5kZXNjcmlwdGlvbjplLGUpLG51bGwhPXQmJihpKz10KSxpKyInPiIrcihuKG51bGwhPWU/ZS5zY29wZTplLGUpKSsiPC9kaXY+XG4ifSwxMjpmdW5jdGlvbigpe3JldHVybiI8L2Rpdj4ifSwxNDpmdW5jdGlvbigpe3JldHVybicgICAgICAgIDxkaXYgY2xhc3M9XCdhY2Nlc3NcJz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0iYXBpLWljIGljLW9mZiIgdGl0bGU9ImNsaWNrIHRvIGF1dGhlbnRpY2F0ZSI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbid9LDE2OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89ImZ1bmN0aW9uIixhPXQuaGVscGVyTWlzc2luZyxzPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4iICAgICAgICAgIDxoND5SZXNwb25zZSBDbGFzcyAoU3RhdHVzICIrcygoaT1udWxsIT0oaT10LnN1Y2Nlc3NDb2RlfHwobnVsbCE9ZT9lLnN1Y2Nlc3NDb2RlOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJzdWNjZXNzQ29kZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrJyk8L2g0PlxuICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJtb2RlbC1zaWduYXR1cmUiIC8+PC9wPlxuICAgICAgICAgIDxici8+XG4gICAgICAgICAgPGRpdiBjbGFzcz0icmVzcG9uc2UtY29udGVudC10eXBlIiAvPlxuJ30sMTg6ZnVuY3Rpb24oKXtyZXR1cm4nICAgICAgICAgIDxoND5QYXJhbWV0ZXJzPC9oND5cbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCdmdWxsd2lkdGhcJz5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOiAxMDBweDsgbWF4LXdpZHRoOiAxMDBweCI+UGFyYW1ldGVyPC90aD5cbiAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDMxMHB4OyBtYXgtd2lkdGg6IDMxMHB4Ij5WYWx1ZTwvdGg+XG4gICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOiAyMDBweDsgbWF4LXdpZHRoOiAyMDBweCI+RGVzY3JpcHRpb248L3RoPlxuICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTAwcHg7IG1heC13aWR0aDogMTAwcHgiPlBhcmFtZXRlciBUeXBlPC90aD5cbiAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6IDIyMHB4OyBtYXgtd2lkdGg6IDIzMHB4Ij5EYXRhIFR5cGU8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keSBjbGFzcz0ib3BlcmF0aW9uLXBhcmFtcyI+XG5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4nfSwyMDpmdW5jdGlvbigpe3JldHVybiIgICAgICAgICAgPGRpdiBzdHlsZT0nbWFyZ2luOjA7cGFkZGluZzowO2Rpc3BsYXk6aW5saW5lJz48L2Rpdj5cbiAgICAgICAgICA8aDQ+UmVzcG9uc2UgTWVzc2FnZXM8L2g0PlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz0nZnVsbHdpZHRoJz5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoPkhUVFAgU3RhdHVzIENvZGU8L3RoPlxuICAgICAgICAgICAgICA8dGg+UmVhc29uPC90aD5cbiAgICAgICAgICAgICAgPHRoPlJlc3BvbnNlIE1vZGVsPC90aD5cbiAgICAgICAgICAgICAgPHRoPkhlYWRlcnM8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJvcGVyYXRpb24tc3RhdHVzXCI+XG5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiJ9LDIyOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LDI0OmZ1bmN0aW9uKCl7cmV0dXJuIiAgICAgICAgICA8ZGl2IGNsYXNzPSdzYW5kYm94X2hlYWRlcic+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9J3N1Ym1pdCcgbmFtZT0nY29tbWl0JyB0eXBlPSdidXR0b24nIHZhbHVlPSdUcnkgaXQgb3V0IScgLz5cbiAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdyZXNwb25zZV9oaWRlcicgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+SGlkZSBSZXNwb25zZTwvYT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdyZXNwb25zZV90aHJvYmJlcicgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuIn0sY29tcGlsZXI6WzYsIj49IDIuMC4wLWJldGEuMSJdLG1haW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9ImZ1bmN0aW9uIixsPXQuaGVscGVyTWlzc2luZyx1PXRoaXMuZXNjYXBlRXhwcmVzc2lvbixjPXQuYmxvY2tIZWxwZXJNaXNzaW5nLHA9IlxuICA8dWwgY2xhc3M9J29wZXJhdGlvbnMnID5cbiAgICA8bGkgY2xhc3M9JyIrdSgobz1udWxsIT0obz10Lm1ldGhvZHx8KG51bGwhPWU/ZS5tZXRob2Q6ZSkpP286bCx0eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6Im1ldGhvZCIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrIiBvcGVyYXRpb24nIGlkPSciK3UoKG89bnVsbCE9KG89dC5wYXJlbnRJZHx8KG51bGwhPWU/ZS5wYXJlbnRJZDplKSk/bzpsLHR5cGVvZiBvPT09cz9vLmNhbGwoZSx7bmFtZToicGFyZW50SWQiLGhhc2g6e30sZGF0YTpyfSk6bykpKyJfIit1KChvPW51bGwhPShvPXQubmlja25hbWV8fChudWxsIT1lP2Uubmlja25hbWU6ZSkpP286bCx0eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6Im5pY2tuYW1lIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiJz5cbiAgICAgIDxkaXYgY2xhc3M9J2hlYWRpbmcnPlxuICAgICAgICA8aDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9J2h0dHBfbWV0aG9kJz5cbiAgICAgICAgICA8YSBocmVmPScjIS8iK3UoKG89bnVsbCE9KG89dC5lbmNvZGVkUGFyZW50SWR8fChudWxsIT1lP2UuZW5jb2RlZFBhcmVudElkOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJlbmNvZGVkUGFyZW50SWQiLGhhc2g6e30sZGF0YTpyfSk6bykpKyIvIit1KChvPW51bGwhPShvPXQubmlja25hbWV8fChudWxsIT1lP2Uubmlja25hbWU6ZSkpP286bCx0eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6Im5pY2tuYW1lIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsnXCcgY2xhc3M9InRvZ2dsZU9wZXJhdGlvbiI+Jyt1KChvPW51bGwhPShvPXQubWV0aG9kfHwobnVsbCE9ZT9lLm1ldGhvZDplKSk/bzpsLHR5cGVvZiBvPT09cz9vLmNhbGwoZSx7bmFtZToibWV0aG9kIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiPC9hPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0ncGF0aCc+XG4gICAgICAgICAgPGEgaHJlZj0nIyEvIit1KChvPW51bGwhPShvPXQuZW5jb2RlZFBhcmVudElkfHwobnVsbCE9ZT9lLmVuY29kZWRQYXJlbnRJZDplKSk/bzpsLHR5cGVvZiBvPT09cz9vLmNhbGwoZSx7bmFtZToiZW5jb2RlZFBhcmVudElkIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiLyIrdSgobz1udWxsIT0obz10Lm5pY2tuYW1lfHwobnVsbCE9ZT9lLm5pY2tuYW1lOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJuaWNrbmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrIicgY2xhc3M9XCJ0b2dnbGVPcGVyYXRpb24gIjtyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UuZGVwcmVjYXRlZDplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMSxyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9KSxudWxsIT1pJiYocCs9aSkscCs9JyI+Jyt1KChvPW51bGwhPShvPXQucGF0aHx8KG51bGwhPWU/ZS5wYXRoOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJwYXRoIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiPC9hPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9oMz5cbiAgICAgICAgPHVsIGNsYXNzPSdvcHRpb25zJz5cbiAgICAgICAgICA8bGk+XG4gICAgICAgICAgPGEgaHJlZj0nIyEvIit1KChvPW51bGwhPShvPXQuZW5jb2RlZFBhcmVudElkfHwobnVsbCE9ZT9lLmVuY29kZWRQYXJlbnRJZDplKSk/bzpsLHR5cGVvZiBvPT09cz9vLmNhbGwoZSx7bmFtZToiZW5jb2RlZFBhcmVudElkIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiLyIrdSgobz1udWxsIT0obz10Lm5pY2tuYW1lfHwobnVsbCE9ZT9lLm5pY2tuYW1lOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJuaWNrbmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrJ1wnIGNsYXNzPSJ0b2dnbGVPcGVyYXRpb24iPicsbz1udWxsIT0obz10LnN1bW1hcnl8fChudWxsIT1lP2Uuc3VtbWFyeTplKSk/bzpsLGk9dHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJzdW1tYXJ5IixoYXNoOnt9LGRhdGE6cn0pOm8sbnVsbCE9aSYmKHArPWkpLHArPSI8L2E+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0nY29udGVudCcgaWQ9JyIrdSgobz1udWxsIT0obz10LnBhcmVudElkfHwobnVsbCE9ZT9lLnBhcmVudElkOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJwYXJlbnRJZCIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrIl8iK3UoKG89bnVsbCE9KG89dC5uaWNrbmFtZXx8KG51bGwhPWU/ZS5uaWNrbmFtZTplKSk/bzpsLHR5cGVvZiBvPT09cz9vLmNhbGwoZSx7bmFtZToibmlja25hbWUiLGhhc2g6e30sZGF0YTpyfSk6bykpKyJfY29udGVudCcgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+XG4iLGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lLmRlcHJlY2F0ZWQ6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDMsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHArPWkpLGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lLmRlc2NyaXB0aW9uOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSg1LHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihwKz1pKSxvPW51bGwhPShvPXQub2F1dGh8fChudWxsIT1lP2Uub2F1dGg6ZSkpP286bCxhPXtuYW1lOiJvYXV0aCIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oNyxyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9LGk9dHlwZW9mIG89PT1zP28uY2FsbChlLGEpOm8sdC5vYXV0aHx8KGk9Yy5jYWxsKGUsaSxhKSksbnVsbCE9aSYmKHArPWkpLHArPSJcbiIsaT10LmVhY2guY2FsbChlLG51bGwhPWU/ZS5vYXV0aDplLHtuYW1lOiJlYWNoIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSg5LHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihwKz1pKSxwKz0iICAgICAgICAiLG89bnVsbCE9KG89dC5vYXV0aHx8KG51bGwhPWU/ZS5vYXV0aDplKSk/bzpsLGE9e25hbWU6Im9hdXRoIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgxMixyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9LGk9dHlwZW9mIG89PT1zP28uY2FsbChlLGEpOm8sdC5vYXV0aHx8KGk9Yy5jYWxsKGUsaSxhKSksbnVsbCE9aSYmKHArPWkpLHArPSJcbiIsbz1udWxsIT0obz10Lm9hdXRofHwobnVsbCE9ZT9lLm9hdXRoOmUpKT9vOmwsYT17bmFtZToib2F1dGgiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDE0LHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0saT10eXBlb2Ygbz09PXM/by5jYWxsKGUsYSk6byx0Lm9hdXRofHwoaT1jLmNhbGwoZSxpLGEpKSxudWxsIT1pJiYocCs9aSksaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UudHlwZTplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMTYsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHArPWkpLHArPSIgICAgICAgIDxmb3JtIGFjY2VwdC1jaGFyc2V0PSdVVEYtOCcgY2xhc3M9J3NhbmRib3gnPlxuICAgICAgICAgIDxkaXYgc3R5bGU9J21hcmdpbjowO3BhZGRpbmc6MDtkaXNwbGF5OmlubGluZSc+PC9kaXY+XG4iLGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lLnBhcmFtZXRlcnM6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDE4LHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihwKz1pKSxpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5yZXNwb25zZU1lc3NhZ2VzOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgyMCxyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9KSxudWxsIT1pJiYocCs9aSksaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UuaXNSZWFkT25seTplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMjIsciksaW52ZXJzZTp0aGlzLnByb2dyYW0oMjQsciksZGF0YTpyfSksbnVsbCE9aSYmKHArPWkpLHArIiAgICAgICAgPC9mb3JtPlxuICAgICAgICA8ZGl2IGNsYXNzPSdyZXNwb25zZScgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+XG4gICAgICAgICAgPGg0PlJlcXVlc3QgVVJMPC9oND5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdibG9jayByZXF1ZXN0X3VybCc+PC9kaXY+XG4gICAgICAgICAgPGg0PlJlc3BvbnNlIEJvZHk8L2g0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9J2Jsb2NrIHJlc3BvbnNlX2JvZHknPjwvZGl2PlxuICAgICAgICAgIDxoND5SZXNwb25zZSBDb2RlPC9oND5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdibG9jayByZXNwb25zZV9jb2RlJz48L2Rpdj5cbiAgICAgICAgICA8aDQ+UmVzcG9uc2UgSGVhZGVyczwvaDQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nYmxvY2sgcmVzcG9uc2VfaGVhZGVycyc+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9saT5cbiAgPC91bD5cbiJ9LHVzZURhdGE6ITB9KSx0aGlzLkhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtX2xpc3Q9SGFuZGxlYmFycy50ZW1wbGF0ZSh7MTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSJmdW5jdGlvbiIsYT10LmhlbHBlck1pc3Npbmcscz10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIjx0ZCBjbGFzcz0nY29kZSByZXF1aXJlZCc+IitzKChpPW51bGwhPShpPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiPC90ZD5cbiJ9LDM6ZnVuY3Rpb24oKXtyZXR1cm4iIG11bHRpcGxlPSdtdWx0aXBsZScifSw1OmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LDc6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iIjtyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2VbImRlZmF1bHQiXTplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oNSxyKSxpbnZlcnNlOnRoaXMucHJvZ3JhbSg4LHIpLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvfSw4OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89dC5oZWxwZXJNaXNzaW5nLGE9IiI7cmV0dXJuIGk9KHQuaXNBcnJheXx8ZSYmZS5pc0FycmF5fHxvKS5jYWxsKGUsZSx7bmFtZToiaXNBcnJheSIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oNSxyKSxpbnZlcnNlOnRoaXMucHJvZ3JhbSg5LHIpLGRhdGE6cn0pLG51bGwhPWkmJihhKz1pKSxhfSw5OmZ1bmN0aW9uKCl7cmV0dXJuIiAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkPVwiXCIgdmFsdWU9Jyc+PC9vcHRpb24+XG4ifSwxMTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSIiO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5pc0RlZmF1bHQ6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDEyLHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDE0LHIpLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvfSwxMjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSJmdW5jdGlvbiIsYT10LmhlbHBlck1pc3Npbmcscz10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuJyAgICAgICAgPG9wdGlvbiBzZWxlY3RlZD0iIiB2YWx1ZT1cJycrcygoaT1udWxsIT0oaT10LnZhbHVlfHwobnVsbCE9ZT9lLnZhbHVlOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJ2YWx1ZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIic+IitzKChpPW51bGwhPShpPXQudmFsdWV8fChudWxsIT1lP2UudmFsdWU6ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6InZhbHVlIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiIChkZWZhdWx0KTwvb3B0aW9uPlxuIn0sMTQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIgICAgICAgIDxvcHRpb24gdmFsdWU9JyIrcygoaT1udWxsIT0oaT10LnZhbHVlfHwobnVsbCE9ZT9lLnZhbHVlOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJ2YWx1ZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIic+IitzKChpPW51bGwhPShpPXQudmFsdWV8fChudWxsIT1lP2UudmFsdWU6ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6InZhbHVlIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiPC9vcHRpb24+XG4ifSxjb21waWxlcjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sbWFpbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9ImZ1bmN0aW9uIixzPXQuaGVscGVyTWlzc2luZyxsPXRoaXMuZXNjYXBlRXhwcmVzc2lvbix1PSIiO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5yZXF1aXJlZDplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMSxyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9KSxudWxsIT1pJiYodSs9aSksdSs9Ijx0ZCBjbGFzcz0nY29kZSc+IitsKChvPW51bGwhPShvPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9vOnMsdHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiPC90ZD5cbjx0ZD5cbiAgPHNlbGVjdCAiLGk9KHQuaXNBcnJheXx8ZSYmZS5pc0FycmF5fHxzKS5jYWxsKGUsZSx7bmFtZToiaXNBcnJheSIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMyxyKSxpbnZlcnNlOnRoaXMubm9vcCxkYXRhOnJ9KSxudWxsIT1pJiYodSs9aSksdSs9IiBjbGFzcz0ncGFyYW1ldGVyJyBuYW1lPSciK2woKG89bnVsbCE9KG89dC5uYW1lfHwobnVsbCE9ZT9lLm5hbWU6ZSkpP286cyx0eXBlb2Ygbz09PWE/by5jYWxsKGUse25hbWU6Im5hbWUiLGhhc2g6e30sZGF0YTpyfSk6bykpKyInPlxuIixpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5yZXF1aXJlZDplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oNSxyKSxpbnZlcnNlOnRoaXMucHJvZ3JhbSg3LHIpLGRhdGE6cn0pLG51bGwhPWkmJih1Kz1pKSxpPXQuZWFjaC5jYWxsKGUsbnVsbCE9KGk9bnVsbCE9ZT9lLmFsbG93YWJsZVZhbHVlczplKT9pLmRlc2NyaXB0aXZlVmFsdWVzOmkse25hbWU6ImVhY2giLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDExLHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJih1Kz1pKSx1Kz0nICA8L3NlbGVjdD5cbjwvdGQ+XG48dGQgY2xhc3M9Im1hcmtkb3duIj4nLG89bnVsbCE9KG89dC5kZXNjcmlwdGlvbnx8KG51bGwhPWU/ZS5kZXNjcmlwdGlvbjplKSk/bzpzLGk9dHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJkZXNjcmlwdGlvbiIsaGFzaDp7fSxkYXRhOnJ9KTpvLG51bGwhPWkmJih1Kz1pKSx1Kz0iPC90ZD5cbjx0ZD4iLG89bnVsbCE9KG89dC5wYXJhbVR5cGV8fChudWxsIT1lP2UucGFyYW1UeXBlOmUpKT9vOnMsaT10eXBlb2Ygbz09PWE/by5jYWxsKGUse25hbWU6InBhcmFtVHlwZSIsaGFzaDp7fSxkYXRhOnJ9KTpvLG51bGwhPWkmJih1Kz1pKSx1Kyc8L3RkPlxuPHRkPjxzcGFuIGNsYXNzPSJtb2RlbC1zaWduYXR1cmUiPjwvc3Bhbj48L3RkPid9LHVzZURhdGE6ITB9KSx0aGlzLkhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtX3JlYWRvbmx5X3JlcXVpcmVkPUhhbmRsZWJhcnMudGVtcGxhdGUoezE6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0nYm9keS10ZXh0YXJlYScgIHJlYWRvbmx5PSdyZWFkb25seScgcGxhY2Vob2xkZXI9JyhyZXF1aXJlZCknIG5hbWU9JyIrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIic+IitzKChpPW51bGwhPShpPXRbImRlZmF1bHQiXXx8KG51bGwhPWU/ZVsiZGVmYXVsdCJdOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJkZWZhdWx0IixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiPC90ZXh0YXJlYT5cbiJ9LDM6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iIjtyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2VbImRlZmF1bHQiXTplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oNCxyKSxpbnZlcnNlOnRoaXMucHJvZ3JhbSg2LHIpLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvfSw0OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89ImZ1bmN0aW9uIixhPXQuaGVscGVyTWlzc2luZyxzPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4iICAgICAgICAgICAgIitzKChpPW51bGwhPShpPXRbImRlZmF1bHQiXXx8KG51bGwhPWU/ZVsiZGVmYXVsdCJdOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJkZWZhdWx0IixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiXG4ifSw2OmZ1bmN0aW9uKCl7cmV0dXJuIiAgICAgICAgICAgIChlbXB0eSlcbiJ9LGNvbXBpbGVyOls2LCI+PSAyLjAuMC1iZXRhLjEiXSxtYWluOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT0iZnVuY3Rpb24iLHM9dC5oZWxwZXJNaXNzaW5nLGw9dGhpcy5lc2NhcGVFeHByZXNzaW9uLHU9Ijx0ZCBjbGFzcz0nY29kZSByZXF1aXJlZCc+IitsKChvPW51bGwhPShvPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9vOnMsdHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiPC90ZD5cbjx0ZD5cbiI7cmV0dXJuIGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lLmlzQm9keTplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMSxyKSxpbnZlcnNlOnRoaXMucHJvZ3JhbSgzLHIpLGRhdGE6cn0pLG51bGwhPWkmJih1Kz1pKSx1Kz0nPC90ZD5cbjx0ZCBjbGFzcz0ibWFya2Rvd24iPicsbz1udWxsIT0obz10LmRlc2NyaXB0aW9ufHwobnVsbCE9ZT9lLmRlc2NyaXB0aW9uOmUpKT9vOnMsaT10eXBlb2Ygbz09PWE/by5jYWxsKGUse25hbWU6ImRlc2NyaXB0aW9uIixoYXNoOnt9LGRhdGE6cn0pOm8sbnVsbCE9aSYmKHUrPWkpLHUrPSI8L3RkPlxuPHRkPiIsbz1udWxsIT0obz10LnBhcmFtVHlwZXx8KG51bGwhPWU/ZS5wYXJhbVR5cGU6ZSkpP286cyxpPXR5cGVvZiBvPT09YT9vLmNhbGwoZSx7bmFtZToicGFyYW1UeXBlIixoYXNoOnt9LGRhdGE6cn0pOm8sbnVsbCE9aSYmKHUrPWkpLHUrJzwvdGQ+XG48dGQ+PHNwYW4gY2xhc3M9Im1vZGVsLXNpZ25hdHVyZSI+PC9zcGFuPjwvdGQ+XG4nfSx1c2VEYXRhOiEwfSksdGhpcy5IYW5kbGViYXJzLnRlbXBsYXRlcy5wYXJhbV9yZWFkb25seT1IYW5kbGViYXJzLnRlbXBsYXRlKHsxOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89ImZ1bmN0aW9uIixhPXQuaGVscGVyTWlzc2luZyxzPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4iICAgICAgICA8dGV4dGFyZWEgY2xhc3M9J2JvZHktdGV4dGFyZWEnIHJlYWRvbmx5PSdyZWFkb25seScgbmFtZT0nIitzKChpPW51bGwhPShpPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiJz4iK3MoKGk9bnVsbCE9KGk9dFsiZGVmYXVsdCJdfHwobnVsbCE9ZT9lWyJkZWZhdWx0Il06ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6ImRlZmF1bHQiLGhhc2g6e30sZGF0YTpyfSk6aSkpKyI8L3RleHRhcmVhPlxuIn0sMzpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSIiO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZVsiZGVmYXVsdCJdOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSg0LHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDYsciksZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG99LDQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIgICAgICAgICAgICAiK3MoKGk9bnVsbCE9KGk9dFsiZGVmYXVsdCJdfHwobnVsbCE9ZT9lWyJkZWZhdWx0Il06ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6ImRlZmF1bHQiLGhhc2g6e30sZGF0YTpyfSk6aSkpKyJcbiJ9LDY6ZnVuY3Rpb24oKXtyZXR1cm4iICAgICAgICAgICAgKGVtcHR5KVxuIn0sY29tcGlsZXI6WzYsIj49IDIuMC4wLWJldGEuMSJdLG1haW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPSJmdW5jdGlvbiIscz10LmhlbHBlck1pc3NpbmcsbD10aGlzLmVzY2FwZUV4cHJlc3Npb24sdT0iPHRkIGNsYXNzPSdjb2RlJz4iK2woKG89bnVsbCE9KG89dC5uYW1lfHwobnVsbCE9ZT9lLm5hbWU6ZSkpP286cyx0eXBlb2Ygbz09PWE/by5jYWxsKGUse25hbWU6Im5hbWUiLGhhc2g6e30sZGF0YTpyfSk6bykpKyI8L3RkPlxuPHRkPlxuIjtyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UuaXNCb2R5OmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgxLHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDMsciksZGF0YTpyfSksbnVsbCE9aSYmKHUrPWkpLHUrPSc8L3RkPlxuPHRkIGNsYXNzPSJtYXJrZG93biI+JyxvPW51bGwhPShvPXQuZGVzY3JpcHRpb258fChudWxsIT1lP2UuZGVzY3JpcHRpb246ZSkpP286cyxpPXR5cGVvZiBvPT09YT9vLmNhbGwoZSx7bmFtZToiZGVzY3JpcHRpb24iLGhhc2g6e30sZGF0YTpyfSk6byxudWxsIT1pJiYodSs9aSksdSs9IjwvdGQ+XG48dGQ+IixvPW51bGwhPShvPXQucGFyYW1UeXBlfHwobnVsbCE9ZT9lLnBhcmFtVHlwZTplKSk/bzpzLGk9dHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJwYXJhbVR5cGUiLGhhc2g6e30sZGF0YTpyfSk6byxudWxsIT1pJiYodSs9aSksdSsnPC90ZD5cbjx0ZD48c3BhbiBjbGFzcz0ibW9kZWwtc2lnbmF0dXJlIj48L3NwYW4+PC90ZD5cbid9LHVzZURhdGE6ITB9KSx0aGlzLkhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtX3JlcXVpcmVkPUhhbmRsZWJhcnMudGVtcGxhdGUoezE6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iIjtyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UuaXNGaWxlOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgyLHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDQsciksZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG99LDI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybicJCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT1cJycrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIicvPlxuIn0sNDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSIiO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZVsiZGVmYXVsdCJdOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSg1LHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDcsciksZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG99LDU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIJCQkJPHRleHRhcmVhIGNsYXNzPSdib2R5LXRleHRhcmVhIHJlcXVpcmVkJyBwbGFjZWhvbGRlcj0nKHJlcXVpcmVkKScgbmFtZT0nIitzKChpPW51bGwhPShpPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiJz4iK3MoKGk9bnVsbCE9KGk9dFsiZGVmYXVsdCJdfHwobnVsbCE9ZT9lWyJkZWZhdWx0Il06ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6ImRlZmF1bHQiLGhhc2g6e30sZGF0YTpyfSk6aSkpKyc8L3RleHRhcmVhPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz0icGFyYW1ldGVyLWNvbnRlbnQtdHlwZSIgLz5cbid9LDc6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIJCQkJPHRleHRhcmVhIGNsYXNzPSdib2R5LXRleHRhcmVhIHJlcXVpcmVkJyBwbGFjZWhvbGRlcj0nKHJlcXVpcmVkKScgbmFtZT0nIitzKChpPW51bGwhPShpPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsnXCc+PC90ZXh0YXJlYT5cbgkJCQk8YnIgLz5cbgkJCQk8ZGl2IGNsYXNzPSJwYXJhbWV0ZXItY29udGVudC10eXBlIiAvPlxuJ30sOTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSIiO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5pc0ZpbGU6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDEwLHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDEyLHIpLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvfSwxMDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSJmdW5jdGlvbiIsYT10LmhlbHBlck1pc3Npbmcscz10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIgkJCTxpbnB1dCBjbGFzcz0ncGFyYW1ldGVyJyBjbGFzcz0ncmVxdWlyZWQnIHR5cGU9J2ZpbGUnIG5hbWU9JyIrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIicvPlxuIn0sMTI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iIjtyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2VbImRlZmF1bHQiXTplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMTMsciksaW52ZXJzZTp0aGlzLnByb2dyYW0oMTUsciksZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG99LDEzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89ImZ1bmN0aW9uIixhPXQuaGVscGVyTWlzc2luZyxzPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4iCQkJCTxpbnB1dCBjbGFzcz0ncGFyYW1ldGVyIHJlcXVpcmVkJyBtaW5sZW5ndGg9JzEnIG5hbWU9JyIrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIicgcGxhY2Vob2xkZXI9JyhyZXF1aXJlZCknIHR5cGU9J3RleHQnIHZhbHVlPSciK3MoKGk9bnVsbCE9KGk9dFsiZGVmYXVsdCJdfHwobnVsbCE9ZT9lWyJkZWZhdWx0Il06ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6ImRlZmF1bHQiLGhhc2g6e30sZGF0YTpyfSk6aSkpKyInLz5cbiJ9LDE1OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89ImZ1bmN0aW9uIixhPXQuaGVscGVyTWlzc2luZyxzPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4iCQkJCTxpbnB1dCBjbGFzcz0ncGFyYW1ldGVyIHJlcXVpcmVkJyBtaW5sZW5ndGg9JzEnIG5hbWU9JyIrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIicgcGxhY2Vob2xkZXI9JyhyZXF1aXJlZCknIHR5cGU9J3RleHQnIHZhbHVlPScnLz5cbiJ9LGNvbXBpbGVyOls2LCI+PSAyLjAuMC1iZXRhLjEiXSxtYWluOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT0iZnVuY3Rpb24iLHM9dC5oZWxwZXJNaXNzaW5nLGw9dGhpcy5lc2NhcGVFeHByZXNzaW9uLHU9Ijx0ZCBjbGFzcz0nY29kZSByZXF1aXJlZCc+IitsKChvPW51bGwhPShvPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9vOnMsdHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiPC90ZD5cbjx0ZD5cbiI7cmV0dXJuIGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lLmlzQm9keTplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMSxyKSxpbnZlcnNlOnRoaXMucHJvZ3JhbSg5LHIpLGRhdGE6cn0pLG51bGwhPWkmJih1Kz1pKSx1Kz0nPC90ZD5cbjx0ZD5cbgk8c3Ryb25nPjxzcGFuIGNsYXNzPSJtYXJrZG93biI+JyxvPW51bGwhPShvPXQuZGVzY3JpcHRpb258fChudWxsIT1lP2UuZGVzY3JpcHRpb246ZSkpP286cyxpPXR5cGVvZiBvPT09YT9vLmNhbGwoZSx7bmFtZToiZGVzY3JpcHRpb24iLGhhc2g6e30sZGF0YTpyfSk6byxudWxsIT1pJiYodSs9aSksdSs9Ijwvc3Bhbj48L3N0cm9uZz5cbjwvdGQ+XG48dGQ+IixvPW51bGwhPShvPXQucGFyYW1UeXBlfHwobnVsbCE9ZT9lLnBhcmFtVHlwZTplKSk/bzpzLGk9dHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJwYXJhbVR5cGUiLGhhc2g6e30sZGF0YTpyfSk6byxudWxsIT1pJiYodSs9aSksdSsnPC90ZD5cbjx0ZD48c3BhbiBjbGFzcz0ibW9kZWwtc2lnbmF0dXJlIj48L3NwYW4+PC90ZD5cbid9LHVzZURhdGE6ITB9KSx0aGlzLkhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtPUhhbmRsZWJhcnMudGVtcGxhdGUoezE6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iIjtyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UuaXNGaWxlOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgyLHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDQsciksZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG99LDI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybicJCQk8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT1cJycrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrJ1wnLz5cbgkJCTxkaXYgY2xhc3M9InBhcmFtZXRlci1jb250ZW50LXR5cGUiIC8+XG4nfSw0OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89IiI7cmV0dXJuIGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lWyJkZWZhdWx0Il06ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDUsciksaW52ZXJzZTp0aGlzLnByb2dyYW0oNyxyKSxkYXRhOnJ9KSxudWxsIT1pJiYobys9aSksb30sNTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSJmdW5jdGlvbiIsYT10LmhlbHBlck1pc3Npbmcscz10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIgkJCQk8dGV4dGFyZWEgY2xhc3M9J2JvZHktdGV4dGFyZWEnIG5hbWU9JyIrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIic+IitzKChpPW51bGwhPShpPXRbImRlZmF1bHQiXXx8KG51bGwhPWU/ZVsiZGVmYXVsdCJdOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJkZWZhdWx0IixoYXNoOnt9LGRhdGE6cn0pOmkpKSsnPC90ZXh0YXJlYT5cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9InBhcmFtZXRlci1jb250ZW50LXR5cGUiIC8+XG4nfSw3OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89ImZ1bmN0aW9uIixhPXQuaGVscGVyTWlzc2luZyxzPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4iCQkJCTx0ZXh0YXJlYSBjbGFzcz0nYm9keS10ZXh0YXJlYScgbmFtZT0nIitzKChpPW51bGwhPShpPXQubmFtZXx8KG51bGwhPWU/ZS5uYW1lOmUpKT9pOmEsdHlwZW9mIGk9PT1vP2kuY2FsbChlLHtuYW1lOiJuYW1lIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsnXCc+PC90ZXh0YXJlYT5cbgkJCQk8YnIgLz5cbgkJCQk8ZGl2IGNsYXNzPSJwYXJhbWV0ZXItY29udGVudC10eXBlIiAvPlxuJ30sOTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSIiO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5pc0ZpbGU6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDIsciksaW52ZXJzZTp0aGlzLnByb2dyYW0oMTAsciksZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG99LDEwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89IiI7cmV0dXJuIGk9dFsiaWYiXS5jYWxsKGUsbnVsbCE9ZT9lWyJkZWZhdWx0Il06ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDExLHIpLGludmVyc2U6dGhpcy5wcm9ncmFtKDEzLHIpLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvfSwxMTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSJmdW5jdGlvbiIsYT10LmhlbHBlck1pc3Npbmcscz10aGlzLmVzY2FwZUV4cHJlc3Npb247cmV0dXJuIgkJCQk8aW5wdXQgY2xhc3M9J3BhcmFtZXRlcicgbWlubGVuZ3RoPScwJyBuYW1lPSciK3MoKGk9bnVsbCE9KGk9dC5uYW1lfHwobnVsbCE9ZT9lLm5hbWU6ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6Im5hbWUiLGhhc2g6e30sZGF0YTpyfSk6aSkpKyInIHBsYWNlaG9sZGVyPScnIHR5cGU9J3RleHQnIHZhbHVlPSciK3MoKGk9bnVsbCE9KGk9dFsiZGVmYXVsdCJdfHwobnVsbCE9ZT9lWyJkZWZhdWx0Il06ZSkpP2k6YSx0eXBlb2YgaT09PW8/aS5jYWxsKGUse25hbWU6ImRlZmF1bHQiLGhhc2g6e30sZGF0YTpyfSk6aSkpKyInLz5cbiJ9LDEzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89ImZ1bmN0aW9uIixhPXQuaGVscGVyTWlzc2luZyxzPXRoaXMuZXNjYXBlRXhwcmVzc2lvbjtyZXR1cm4iCQkJCTxpbnB1dCBjbGFzcz0ncGFyYW1ldGVyJyBtaW5sZW5ndGg9JzAnIG5hbWU9JyIrcygoaT1udWxsIT0oaT10Lm5hbWV8fChudWxsIT1lP2UubmFtZTplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToibmFtZSIsaGFzaDp7fSxkYXRhOnJ9KTppKSkrIicgcGxhY2Vob2xkZXI9JycgdHlwZT0ndGV4dCcgdmFsdWU9JycvPlxuIn0sY29tcGlsZXI6WzYsIj49IDIuMC4wLWJldGEuMSJdLG1haW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPSJmdW5jdGlvbiIscz10LmhlbHBlck1pc3NpbmcsbD10aGlzLmVzY2FwZUV4cHJlc3Npb24sdT0iPHRkIGNsYXNzPSdjb2RlJz4iK2woKG89bnVsbCE9KG89dC5uYW1lfHwobnVsbCE9ZT9lLm5hbWU6ZSkpP286cyx0eXBlb2Ygbz09PWE/by5jYWxsKGUse25hbWU6Im5hbWUiLGhhc2g6e30sZGF0YTpyfSk6bykpKyI8L3RkPlxuPHRkPlxuXG4iO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5pc0JvZHk6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDEsciksaW52ZXJzZTp0aGlzLnByb2dyYW0oOSxyKSxkYXRhOnJ9KSxudWxsIT1pJiYodSs9aSksdSs9J1xuPC90ZD5cbjx0ZCBjbGFzcz0ibWFya2Rvd24iPicsbz1udWxsIT0obz10LmRlc2NyaXB0aW9ufHwobnVsbCE9ZT9lLmRlc2NyaXB0aW9uOmUpKT9vOnMsaT10eXBlb2Ygbz09PWE/by5jYWxsKGUse25hbWU6ImRlc2NyaXB0aW9uIixoYXNoOnt9LGRhdGE6cn0pOm8sbnVsbCE9aSYmKHUrPWkpLHUrPSI8L3RkPlxuPHRkPiIsbz1udWxsIT0obz10LnBhcmFtVHlwZXx8KG51bGwhPWU/ZS5wYXJhbVR5cGU6ZSkpP286cyxpPXR5cGVvZiBvPT09YT9vLmNhbGwoZSx7bmFtZToicGFyYW1UeXBlIixoYXNoOnt9LGRhdGE6cn0pOm8sbnVsbCE9aSYmKHUrPWkpLHUrJzwvdGQ+XG48dGQ+XG4JPHNwYW4gY2xhc3M9Im1vZGVsLXNpZ25hdHVyZSI+PC9zcGFuPlxuPC90ZD5cbid9LHVzZURhdGE6ITB9KSx0aGlzLkhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtZXRlcl9jb250ZW50X3R5cGU9SGFuZGxlYmFycy50ZW1wbGF0ZSh7MTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSIiO3JldHVybiBpPXQuZWFjaC5jYWxsKGUsbnVsbCE9ZT9lLmNvbnN1bWVzOmUse25hbWU6ImVhY2giLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDIsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKG8rPWkpLG99LDI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLmxhbWJkYSxyPScgIDxvcHRpb24gdmFsdWU9Iic7cmV0dXJuIHQ9bihlLGUpLG51bGwhPXQmJihyKz10KSxyKz0nIj4nLHQ9bihlLGUpLG51bGwhPXQmJihyKz10KSxyKyI8L29wdGlvbj5cbiJ9LDQ6ZnVuY3Rpb24oKXtyZXR1cm4nICA8b3B0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbi9qc29uIj5hcHBsaWNhdGlvbi9qc29uPC9vcHRpb24+XG4nfSxjb21waWxlcjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sbWFpbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPSc8bGFiZWwgZm9yPSJwYXJhbWV0ZXJDb250ZW50VHlwZSI+PC9sYWJlbD5cbjxzZWxlY3QgbmFtZT0icGFyYW1ldGVyQ29udGVudFR5cGUiPlxuJztyZXR1cm4gaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UuY29uc3VtZXM6ZSx7bmFtZToiaWYiLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDEsciksaW52ZXJzZTp0aGlzLnByb2dyYW0oNCxyKSxkYXRhOnJ9KSxudWxsIT1pJiYobys9aSksbysiPC9zZWxlY3Q+XG4ifSx1c2VEYXRhOiEwfSksdGhpcy5IYW5kbGViYXJzLnRlbXBsYXRlcy5yZXNvdXJjZT1IYW5kbGViYXJzLnRlbXBsYXRlKHsxOmZ1bmN0aW9uKCl7cmV0dXJuIiA6ICJ9LDM6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iZnVuY3Rpb24iLGE9dC5oZWxwZXJNaXNzaW5nLHM9dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIgICAgPGxpPlxuICAgICAgPGEgaHJlZj0nIitzKChpPW51bGwhPShpPXQudXJsfHwobnVsbCE9ZT9lLnVybDplKSk/aTphLHR5cGVvZiBpPT09bz9pLmNhbGwoZSx7bmFtZToidXJsIixoYXNoOnt9LGRhdGE6cn0pOmkpKSsiJz5SYXc8L2E+XG4gICAgPC9saT5cbiIKK30sY29tcGlsZXI6WzYsIj49IDIuMC4wLWJldGEuMSJdLG1haW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9ImZ1bmN0aW9uIixsPXQuaGVscGVyTWlzc2luZyx1PXRoaXMuZXNjYXBlRXhwcmVzc2lvbixjPXQuYmxvY2tIZWxwZXJNaXNzaW5nLHA9IjxkaXYgY2xhc3M9J2hlYWRpbmcnPlxuICA8aDI+XG4gICAgPGEgaHJlZj0nIyEvIit1KChvPW51bGwhPShvPXQuaWR8fChudWxsIT1lP2UuaWQ6ZSkpP286bCx0eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6ImlkIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsnXCcgY2xhc3M9InRvZ2dsZUVuZHBvaW50TGlzdCIgZGF0YS1pZD0iJyt1KChvPW51bGwhPShvPXQuaWR8fChudWxsIT1lP2UuaWQ6ZSkpP286bCx0eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6ImlkIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsnIj4nK3UoKG89bnVsbCE9KG89dC5uYW1lfHwobnVsbCE9ZT9lLm5hbWU6ZSkpP286bCx0eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6Im5hbWUiLGhhc2g6e30sZGF0YTpyfSk6bykpKyI8L2E+ICI7cmV0dXJuIG89bnVsbCE9KG89dC5zdW1tYXJ5fHwobnVsbCE9ZT9lLnN1bW1hcnk6ZSkpP286bCxhPXtuYW1lOiJzdW1tYXJ5IixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgxLHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0saT10eXBlb2Ygbz09PXM/by5jYWxsKGUsYSk6byx0LnN1bW1hcnl8fChpPWMuY2FsbChlLGksYSkpLG51bGwhPWkmJihwKz1pKSxvPW51bGwhPShvPXQuc3VtbWFyeXx8KG51bGwhPWU/ZS5zdW1tYXJ5OmUpKT9vOmwsaT10eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6InN1bW1hcnkiLGhhc2g6e30sZGF0YTpyfSk6byxudWxsIT1pJiYocCs9aSkscCs9IlxuICA8L2gyPlxuICA8dWwgY2xhc3M9J29wdGlvbnMnPlxuICAgIDxsaT5cbiAgICAgIDxhIGhyZWY9JyMhLyIrdSgobz1udWxsIT0obz10LmlkfHwobnVsbCE9ZT9lLmlkOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJpZCIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrIicgaWQ9J2VuZHBvaW50TGlzdFRvZ2dlcl8iK3UoKG89bnVsbCE9KG89dC5pZHx8KG51bGwhPWU/ZS5pZDplKSk/bzpsLHR5cGVvZiBvPT09cz9vLmNhbGwoZSx7bmFtZToiaWQiLGhhc2g6e30sZGF0YTpyfSk6bykpKydcJyBjbGFzcz0idG9nZ2xlRW5kcG9pbnRMaXN0IiBkYXRhLWlkPSInK3UoKG89bnVsbCE9KG89dC5pZHx8KG51bGwhPWU/ZS5pZDplKSk/bzpsLHR5cGVvZiBvPT09cz9vLmNhbGwoZSx7bmFtZToiaWQiLGhhc2g6e30sZGF0YTpyfSk6bykpKyciPlNob3cvSGlkZTwvYT5cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxhIGhyZWY9XCcjXCcgY2xhc3M9ImNvbGxhcHNlUmVzb3VyY2UiIGRhdGEtaWQ9IicrdSgobz1udWxsIT0obz10LmlkfHwobnVsbCE9ZT9lLmlkOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJpZCIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrJyI+XG4gICAgICAgIExpc3QgT3BlcmF0aW9uc1xuICAgICAgPC9hPlxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgPGEgaHJlZj1cJyNcJyBjbGFzcz0iZXhwYW5kUmVzb3VyY2UiIGRhdGEtaWQ9IicrdSgobz1udWxsIT0obz10LmlkfHwobnVsbCE9ZT9lLmlkOmUpKT9vOmwsdHlwZW9mIG89PT1zP28uY2FsbChlLHtuYW1lOiJpZCIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrJyI+XG4gICAgICAgIEV4cGFuZCBPcGVyYXRpb25zXG4gICAgICA8L2E+XG4gICAgPC9saT5cbicsaT10WyJpZiJdLmNhbGwoZSxudWxsIT1lP2UudXJsOmUse25hbWU6ImlmIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgzLHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihwKz1pKSxwKyIgIDwvdWw+XG48L2Rpdj5cbjx1bCBjbGFzcz0nZW5kcG9pbnRzJyBpZD0nIit1KChvPW51bGwhPShvPXQuaWR8fChudWxsIT1lP2UuaWQ6ZSkpP286bCx0eXBlb2Ygbz09PXM/by5jYWxsKGUse25hbWU6ImlkIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsiX2VuZHBvaW50X2xpc3QnIHN0eWxlPSdkaXNwbGF5Om5vbmUnPlxuXG48L3VsPlxuIn0sdXNlRGF0YTohMH0pLHRoaXMuSGFuZGxlYmFycy50ZW1wbGF0ZXMucmVzcG9uc2VfY29udGVudF90eXBlPUhhbmRsZWJhcnMudGVtcGxhdGUoezE6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0iIjtyZXR1cm4gaT10LmVhY2guY2FsbChlLG51bGwhPWU/ZS5wcm9kdWNlczplLHtuYW1lOiJlYWNoIixoYXNoOnt9LGZuOnRoaXMucHJvZ3JhbSgyLHIpLGludmVyc2U6dGhpcy5ub29wLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvfSwyOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5sYW1iZGEscj0nICA8b3B0aW9uIHZhbHVlPSInO3JldHVybiB0PW4oZSxlKSxudWxsIT10JiYocis9dCkscis9JyI+Jyx0PW4oZSxlKSxudWxsIT10JiYocis9dCkscisiPC9vcHRpb24+XG4ifSw0OmZ1bmN0aW9uKCl7cmV0dXJuJyAgPG9wdGlvbiB2YWx1ZT0iYXBwbGljYXRpb24vanNvbiI+YXBwbGljYXRpb24vanNvbjwvb3B0aW9uPlxuJ30sY29tcGlsZXI6WzYsIj49IDIuMC4wLWJldGEuMSJdLG1haW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz0nPGxhYmVsIGZvcj0icmVzcG9uc2VDb250ZW50VHlwZSI+PC9sYWJlbD5cbjxzZWxlY3QgbmFtZT0icmVzcG9uc2VDb250ZW50VHlwZSI+XG4nO3JldHVybiBpPXRbImlmIl0uY2FsbChlLG51bGwhPWU/ZS5wcm9kdWNlczplLHtuYW1lOiJpZiIsaGFzaDp7fSxmbjp0aGlzLnByb2dyYW0oMSxyKSxpbnZlcnNlOnRoaXMucHJvZ3JhbSg0LHIpLGRhdGE6cn0pLG51bGwhPWkmJihvKz1pKSxvKyI8L3NlbGVjdD5cbiJ9LHVzZURhdGE6ITB9KSx0aGlzLkhhbmRsZWJhcnMudGVtcGxhdGVzLnNpZ25hdHVyZT1IYW5kbGViYXJzLnRlbXBsYXRlKHtjb21waWxlcjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sbWFpbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9ImZ1bmN0aW9uIixzPXQuaGVscGVyTWlzc2luZyxsPXRoaXMuZXNjYXBlRXhwcmVzc2lvbix1PSc8ZGl2PlxuPHVsIGNsYXNzPSJzaWduYXR1cmUtbmF2Ij5cbiAgPGxpPjxhIGNsYXNzPSJkZXNjcmlwdGlvbi1saW5rIiBocmVmPSIjIj5Nb2RlbDwvYT48L2xpPlxuICA8bGk+PGEgY2xhc3M9InNuaXBwZXQtbGluayIgaHJlZj0iIyI+TW9kZWwgU2NoZW1hPC9hPjwvbGk+XG48L3VsPlxuPGRpdj5cblxuPGRpdiBjbGFzcz0ic2lnbmF0dXJlLWNvbnRhaW5lciI+XG4gIDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIj5cbiAgICAnO3JldHVybiBvPW51bGwhPShvPXQuc2lnbmF0dXJlfHwobnVsbCE9ZT9lLnNpZ25hdHVyZTplKSk/bzpzLGk9dHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJzaWduYXR1cmUiLGhhc2g6e30sZGF0YTpyfSk6byxudWxsIT1pJiYodSs9aSksdSsnXG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9InNuaXBwZXQiPlxuICAgIDxwcmU+PGNvZGU+JytsKChvPW51bGwhPShvPXQuc2FtcGxlSlNPTnx8KG51bGwhPWU/ZS5zYW1wbGVKU09OOmUpKT9vOnMsdHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJzYW1wbGVKU09OIixoYXNoOnt9LGRhdGE6cn0pOm8pKSsnPC9jb2RlPjwvcHJlPlxuICAgIDxzbWFsbCBjbGFzcz0ibm90aWNlIj48L3NtYWxsPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4nfSx1c2VEYXRhOiEwfSksdGhpcy5IYW5kbGViYXJzLnRlbXBsYXRlcy5zdGF0dXNfY29kZT1IYW5kbGViYXJzLnRlbXBsYXRlKHsxOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMubGFtYmRhLG89dGhpcy5lc2NhcGVFeHByZXNzaW9uO3JldHVybiIgICAgICA8dHI+XG4gICAgICAgIDx0ZD4iK28oaShyJiZyLmtleSxlKSkrIjwvdGQ+XG4gICAgICAgIDx0ZD4iK28oaShudWxsIT1lP2UuZGVzY3JpcHRpb246ZSxlKSkrIjwvdGQ+XG4gICAgICAgIDx0ZD4iK28oaShudWxsIT1lP2UudHlwZTplLGUpKSsiPC90ZD5cbiAgICAgIDwvdHI+XG4ifSxjb21waWxlcjpbNiwiPj0gMi4wLjAtYmV0YS4xIl0sbWFpbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9ImZ1bmN0aW9uIixzPXQuaGVscGVyTWlzc2luZyxsPXRoaXMuZXNjYXBlRXhwcmVzc2lvbix1PSI8dGQgd2lkdGg9JzE1JScgY2xhc3M9J2NvZGUnPiIrbCgobz1udWxsIT0obz10LmNvZGV8fChudWxsIT1lP2UuY29kZTplKSk/bzpzLHR5cGVvZiBvPT09YT9vLmNhbGwoZSx7bmFtZToiY29kZSIsaGFzaDp7fSxkYXRhOnJ9KTpvKSkrIjwvdGQ+XG48dGQ+IjtyZXR1cm4gbz1udWxsIT0obz10Lm1lc3NhZ2V8fChudWxsIT1lP2UubWVzc2FnZTplKSk/bzpzLGk9dHlwZW9mIG89PT1hP28uY2FsbChlLHtuYW1lOiJtZXNzYWdlIixoYXNoOnt9LGRhdGE6cn0pOm8sbnVsbCE9aSYmKHUrPWkpLHUrPSc8L3RkPlxuPHRkIHdpZHRoPVwnNTAlXCc+PHNwYW4gY2xhc3M9Im1vZGVsLXNpZ25hdHVyZSIgLz48L3RkPlxuPHRkIGNsYXNzPSJoZWFkZXJzIj5cbiAgPHRhYmxlPlxuICAgIDx0Ym9keT5cbicsaT10LmVhY2guY2FsbChlLG51bGwhPWU/ZS5oZWFkZXJzOmUse25hbWU6ImVhY2giLGhhc2g6e30sZm46dGhpcy5wcm9ncmFtKDEsciksaW52ZXJzZTp0aGlzLm5vb3AsZGF0YTpyfSksbnVsbCE9aSYmKHUrPWkpLHUrIiAgICA8L3Rib2R5PlxuICA8L3RhYmxlPlxuPC90ZD4ifSx1c2VEYXRhOiEwfSksZnVuY3Rpb24oZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSxlKTtlbHNle3ZhciB0O3Q9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLHQuU3dhZ2dlckNsaWVudD1lKCl9fShmdW5jdGlvbigpe3ZhciBlO3JldHVybiBmdW5jdGlvbiB0KGUsbixyKXtmdW5jdGlvbiBpKGEscyl7aWYoIW5bYV0pe2lmKCFlW2FdKXt2YXIgbD0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighcyYmbClyZXR1cm4gbChhLCEwKTtpZihvKXJldHVybiBvKGEsITApO3ZhciB1PW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2ErIiciKTt0aHJvdyB1LmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLHV9dmFyIGM9blthXT17ZXhwb3J0czp7fX07ZVthXVswXS5jYWxsKGMuZXhwb3J0cyxmdW5jdGlvbih0KXt2YXIgbj1lW2FdWzFdW3RdO3JldHVybiBpKG4/bjp0KX0sYyxjLmV4cG9ydHMsdCxlLG4scil9cmV0dXJuIG5bYV0uZXhwb3J0c31mb3IodmFyIG89ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ci5sZW5ndGg7YSsrKWkoclthXSk7cmV0dXJuIGl9KHsxOltmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1lKCIuL2xpYi9hdXRoIikscj1lKCIuL2xpYi9oZWxwZXJzIiksaT1lKCIuL2xpYi9jbGllbnQiKSxvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIubG9nKCdUaGlzIGlzIGRlcHJlY2F0ZWQsIHVzZSAibmV3IFN3YWdnZXJDbGllbnQiIGluc3RlYWQuJyksbmV3IGkoZSx0KX07QXJyYXkucHJvdG90eXBlLmluZGV4T2Z8fChBcnJheS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10fHwwLHI9dGhpcy5sZW5ndGg7cj5uO24rKylpZih0aGlzW25dPT09ZSlyZXR1cm4gbjtyZXR1cm4tMX0pLFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGh8fChTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoPWZ1bmN0aW9uKGUpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdGhpcy5sZW5ndGgtZS5sZW5ndGgpfSksdC5leHBvcnRzPWksaS5BcGlLZXlBdXRob3JpemF0aW9uPW4uQXBpS2V5QXV0aG9yaXphdGlvbixpLlBhc3N3b3JkQXV0aG9yaXphdGlvbj1uLlBhc3N3b3JkQXV0aG9yaXphdGlvbixpLkNvb2tpZUF1dGhvcml6YXRpb249bi5Db29raWVBdXRob3JpemF0aW9uLGkuU3dhZ2dlckFwaT1vLGkuU3dhZ2dlckNsaWVudD1vfSx7Ii4vbGliL2F1dGgiOjIsIi4vbGliL2NsaWVudCI6MywiLi9saWIvaGVscGVycyI6NH1dLDI6W2Z1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3ZhciBuPWUoImJ0b2EiKSxyPWUoImNvb2tpZWphciIpLGk9dC5leHBvcnRzLlN3YWdnZXJBdXRob3JpemF0aW9ucz1mdW5jdGlvbigpe3RoaXMuYXV0aHo9e319O2kucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmF1dGh6W2VdPXQsdH0saS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiBkZWxldGUgdGhpcy5hdXRoeltlXX0saS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhPW51bGw7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0fHwwPT09T2JqZWN0LmtleXModCkubGVuZ3RoKWZvcihuIGluIHRoaXMuYXV0aHopaT10aGlzLmF1dGh6W25dLG89aS5hcHBseShlLHQpLG89PT0hMCYmKGE9ITApO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGw9dFtzXTtmb3IociBpbiBsKWZvcihuIGluIHRoaXMuYXV0aHopbj09PXImJihpPXRoaXMuYXV0aHpbbl0sbz1pLmFwcGx5KGUsdCksbz09PSEwJiYoYT0hMCkpfWVsc2UgZm9yKHIgaW4gdClmb3IobiBpbiB0aGlzLmF1dGh6KW49PT1yJiYoaT10aGlzLmF1dGh6W25dLG89aS5hcHBseShlLHQpLG89PT0hMCYmKGE9ITApKTtyZXR1cm4gYX07dmFyIG89dC5leHBvcnRzLkFwaUtleUF1dGhvcml6YXRpb249ZnVuY3Rpb24oZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMudmFsdWU9dCx0aGlzLnR5cGU9bn07by5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oZSl7cmV0dXJuInF1ZXJ5Ij09PXRoaXMudHlwZT8oZS51cmw9ZS51cmwuaW5kZXhPZigiPyIpPjA/ZS51cmwrIiYiK3RoaXMubmFtZSsiPSIrdGhpcy52YWx1ZTplLnVybCsiPyIrdGhpcy5uYW1lKyI9Iit0aGlzLnZhbHVlLCEwKToiaGVhZGVyIj09PXRoaXMudHlwZT8oZS5oZWFkZXJzW3RoaXMubmFtZV09dGhpcy52YWx1ZSwhMCk6dm9pZCAwfTt2YXIgYT10LmV4cG9ydHMuQ29va2llQXV0aG9yaXphdGlvbj1mdW5jdGlvbihlKXt0aGlzLmNvb2tpZT1lfTthLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihlKXtyZXR1cm4gZS5jb29raWVKYXI9ZS5jb29raWVKYXJ8fG5ldyByLGUuY29va2llSmFyLnNldENvb2tpZSh0aGlzLmNvb2tpZSksITB9O3ZhciBzPXQuZXhwb3J0cy5QYXNzd29yZEF1dGhvcml6YXRpb249ZnVuY3Rpb24oZSx0LG4pe3RoaXMubmFtZT1lLHRoaXMudXNlcm5hbWU9dCx0aGlzLnBhc3N3b3JkPW59O3MucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKGUpe3JldHVybiBlLmhlYWRlcnMuQXV0aG9yaXphdGlvbj0iQmFzaWMgIituKHRoaXMudXNlcm5hbWUrIjoiK3RoaXMucGFzc3dvcmQpLCEwfX0se2J0b2E6MTYsY29va2llamFyOjE3fV0sMzpbZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49e2JpbmQ6ZSgibG9kYXNoLWNvbXBhdC9mdW5jdGlvbi9iaW5kIiksY2xvbmVEZWVwOmUoImxvZGFzaC1jb21wYXQvbGFuZy9jbG9uZURlZXAiKSxmaW5kOmUoImxvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9maW5kIiksZm9yRWFjaDplKCJsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vZm9yRWFjaCIpLGluZGV4T2Y6ZSgibG9kYXNoLWNvbXBhdC9hcnJheS9pbmRleE9mIiksaXNBcnJheTplKCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNBcnJheSIpLGlzRnVuY3Rpb246ZSgibG9kYXNoLWNvbXBhdC9sYW5nL2lzRnVuY3Rpb24iKSxpc1BsYWluT2JqZWN0OmUoImxvZGFzaC1jb21wYXQvbGFuZy9pc1BsYWluT2JqZWN0IiksaXNVbmRlZmluZWQ6ZSgibG9kYXNoLWNvbXBhdC9sYW5nL2lzVW5kZWZpbmVkIil9LHI9ZSgiLi9hdXRoIiksaT1lKCIuL2hlbHBlcnMiKSxvPWUoIi4vdHlwZXMvbW9kZWwiKSxhPWUoIi4vdHlwZXMvb3BlcmF0aW9uIikscz1lKCIuL3R5cGVzL29wZXJhdGlvbkdyb3VwIiksbD1lKCIuL3Jlc29sdmVyIiksdT1lKCIuL2h0dHAiKSxjPWUoIi4vc3BlYy1jb252ZXJ0ZXIiKSxwPVsiYXV0aG9yaXphdGlvblNjaGVtZSIsImF1dGhvcml6YXRpb25zIiwiYmFzZVBhdGgiLCJidWlsZCIsImJ1aWxkRnJvbTFfMVNwZWMiLCJidWlsZEZyb20xXzJTcGVjIiwiYnVpbGRGcm9tU3BlYyIsImNsaWVudEF1dGhvcml6YXRpb25zIiwiY29udmVydEluZm8iLCJkZWJ1ZyIsImRlZmF1bHRFcnJvckNhbGxiYWNrIiwiZGVmYXVsdFN1Y2Nlc3NDYWxsYmFjayIsImZhaWwiLCJmYWlsdXJlIiwiZmluaXNoIiwiaGVscCIsImlkRnJvbU9wIiwiaW5mbyIsImluaXRpYWxpemUiLCJpc0J1aWx0IiwiaXNWYWxpZCIsIm1vZGVscyIsIm1vZGVsc0FycmF5Iiwib3B0aW9ucyIsInBhcnNlVXJpIiwicHJvZ3Jlc3MiLCJyZXNvdXJjZUNvdW50Iiwic2FtcGxlTW9kZWxzIiwic2VsZlJlZmxlY3QiLCJzZXRDb25zb2xpZGF0ZWRNb2RlbHMiLCJzcGVjIiwic3VwcG9ydGVkU3VibWl0TWV0aG9kcyIsInN3YWdnZXJSZXF1ZXN0SGVhZGVycyIsInRhZ0Zyb21MYWJlbCIsInVybCIsInVzZUpRdWVyeSJdLGg9WyJhcGlzIiwiYXNDdXJsIiwiZGVzY3JpcHRpb24iLCJleHRlcm5hbERvY3MiLCJoZWxwIiwibGFiZWwiLCJuYW1lIiwib3BlcmF0aW9uIiwib3BlcmF0aW9ucyIsIm9wZXJhdGlvbnNBcnJheSIsInBhdGgiLCJ0YWciXSxmPVsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiLCJwYXRjaCIsInBvc3QiLCJwdXQiXSxkPXQuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmF1dGhvcml6YXRpb25TY2hlbWU9bnVsbCx0aGlzLmF1dGhvcml6YXRpb25zPW51bGwsdGhpcy5iYXNlUGF0aD1udWxsLHRoaXMuZGVidWc9ITEsdGhpcy5pbmZvPW51bGwsdGhpcy5pc0J1aWx0PSExLHRoaXMuaXNWYWxpZD0hMSx0aGlzLm1vZGVsc0FycmF5PVtdLHRoaXMucmVzb3VyY2VDb3VudD0wLHRoaXMudXJsPW51bGwsdGhpcy51c2VKUXVlcnk9ITEsInVuZGVmaW5lZCIhPXR5cGVvZiBlP3RoaXMuaW5pdGlhbGl6ZShlLHQpOnRoaXN9O2QucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oZSx0KXt0aGlzLm1vZGVscz17fSx0aGlzLnNhbXBsZU1vZGVscz17fSx0PXR8fHt9LCJzdHJpbmciPT10eXBlb2YgZT90aGlzLnVybD1lOiJvYmplY3QiPT10eXBlb2YgZSYmKHQ9ZSx0aGlzLnVybD10LnVybCksdGhpcy5zd2FnZ2VyUmVxdWVzdEhlYWRlcnM9dC5zd2FnZ2VyUmVxdWVzdEhlYWRlcnN8fCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgsKi8qIix0aGlzLmRlZmF1bHRTdWNjZXNzQ2FsbGJhY2s9dC5kZWZhdWx0U3VjY2Vzc0NhbGxiYWNrfHxudWxsLHRoaXMuZGVmYXVsdEVycm9yQ2FsbGJhY2s9dC5kZWZhdWx0RXJyb3JDYWxsYmFja3x8bnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWNjZXNzJiYodGhpcy5zdWNjZXNzPXQuc3VjY2VzcyksdC51c2VKUXVlcnkmJih0aGlzLnVzZUpRdWVyeT10LnVzZUpRdWVyeSksdGhpcy5jbGllbnRBdXRob3JpemF0aW9ucz10LmF1dGhvcml6YXRpb25zP3QuYXV0aG9yaXphdGlvbnM6bmV3IHIuU3dhZ2dlckF1dGhvcml6YXRpb25zLHRoaXMuc3VwcG9ydGVkU3VibWl0TWV0aG9kcz10LnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHN8fFtdLHRoaXMuZmFpbHVyZT10LmZhaWx1cmV8fGZ1bmN0aW9uKCl7fSx0aGlzLnByb2dyZXNzPXQucHJvZ3Jlc3N8fGZ1bmN0aW9uKCl7fSx0aGlzLnNwZWM9bi5jbG9uZURlZXAodC5zcGVjKSx0aGlzLm9wdGlvbnM9dCwiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWNjZXNzJiYodGhpcy5yZWFkeT0hMCx0aGlzLmJ1aWxkKCkpfSxkLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXtpZih0aGlzLmlzQnVpbHQpcmV0dXJuIHRoaXM7dmFyIHQ9dGhpczt0aGlzLnByb2dyZXNzKCJmZXRjaGluZyByZXNvdXJjZSBsaXN0OiAiK3RoaXMudXJsKTt2YXIgbj17dXNlSlF1ZXJ5OnRoaXMudXNlSlF1ZXJ5LHVybDp0aGlzLnVybCxtZXRob2Q6ImdldCIsaGVhZGVyczp7YWNjZXB0OnRoaXMuc3dhZ2dlclJlcXVlc3RIZWFkZXJzfSxvbjp7ZXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmFpbCgiaHR0cCIhPT10LnVybC5zdWJzdHJpbmcoMCw0KT8iUGxlYXNlIHNwZWNpZnkgdGhlIHByb3RvY29sIGZvciAiK3QudXJsOjA9PT1lLnN0YXR1cz8iQ2FuJ3QgcmVhZCBmcm9tIHNlcnZlci4gIEl0IG1heSBub3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzLWNvbnRyb2wtb3JpZ2luIHNldHRpbmdzLiI6NDA0PT09ZS5zdGF0dXM/IkNhbid0IHJlYWQgc3dhZ2dlciBKU09OIGZyb20gIit0LnVybDplLnN0YXR1cysiIDogIitlLnN0YXR1c1RleHQrIiAiK3QudXJsKX0scmVzcG9uc2U6ZnVuY3Rpb24oZSl7dmFyIG49ZS5vYmp8fEpTT04ucGFyc2UoZS5kYXRhKTtpZih0LnN3YWdnZXJWZXJzaW9uPW4uc3dhZ2dlclZlcnNpb24sbi5zd2FnZ2VyJiYyPT09cGFyc2VJbnQobi5zd2FnZ2VyKSl0LnN3YWdnZXJWZXJzaW9uPW4uc3dhZ2dlciwobmV3IGwpLnJlc29sdmUobix0LmJ1aWxkRnJvbVNwZWMsdCksdC5pc1ZhbGlkPSEwO2Vsc2V7dmFyIHI9bmV3IGM7ci5zZXREb2N1bWVudGF0aW9uTG9jYXRpb24odC51cmwpLHIuY29udmVydChuLGZ1bmN0aW9uKGUpeyhuZXcgbCkucmVzb2x2ZShlLHQuYnVpbGRGcm9tU3BlYyx0KSx0LmlzVmFsaWQ9ITB9KX19fX07aWYodGhpcy5zcGVjKXNldFRpbWVvdXQoZnVuY3Rpb24oKXsobmV3IGwpLnJlc29sdmUodC5zcGVjLHQuYnVpbGRGcm9tU3BlYyx0KX0sMTApO2Vsc2V7aWYodGhpcy5jbGllbnRBdXRob3JpemF0aW9ucy5hcHBseShuKSxlKXJldHVybiBuOyhuZXcgdSkuZXhlY3V0ZShuKX1yZXR1cm4gdGhpc30sZC5wcm90b3R5cGUuYnVpbGRGcm9tU3BlYz1mdW5jdGlvbihlKXtpZih0aGlzLmlzQnVpbHQpcmV0dXJuIHRoaXM7dGhpcy5hcGlzPXt9LHRoaXMuYXBpc0FycmF5PVtdLHRoaXMuYmFzZVBhdGg9ZS5iYXNlUGF0aHx8IiIsdGhpcy5jb25zdW1lcz1lLmNvbnN1bWVzLHRoaXMuaG9zdD1lLmhvc3R8fCIiLHRoaXMuaW5mbz1lLmluZm98fHt9LHRoaXMucHJvZHVjZXM9ZS5wcm9kdWNlcyx0aGlzLnNjaGVtZXM9ZS5zY2hlbWVzfHxbXSx0aGlzLnNlY3VyaXR5RGVmaW5pdGlvbnM9ZS5zZWN1cml0eURlZmluaXRpb25zLHRoaXMudGl0bGU9ZS50aXRsZXx8IiIsZS5leHRlcm5hbERvY3MmJih0aGlzLmV4dGVybmFsRG9jcz1lLmV4dGVybmFsRG9jcyksdGhpcy5hdXRoU2NoZW1lcz1lLnNlY3VyaXR5RGVmaW5pdGlvbnM7dmFyIHQscj17fTtpZihBcnJheS5pc0FycmF5KGUudGFncykpZm9yKHI9e30sdD0wO3Q8ZS50YWdzLmxlbmd0aDt0Kyspe3ZhciBsPWUudGFnc1t0XTtyW2wubmFtZV09bH12YXIgdTsic3RyaW5nIj09dHlwZW9mIHRoaXMudXJsJiYodT10aGlzLnBhcnNlVXJpKHRoaXMudXJsKSksdGhpcy5zY2hlbWU9InVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLnNjaGVtZXN8fDA9PT10aGlzLnNjaGVtZXMubGVuZ3RoP3Uuc2NoZW1lfHwiaHR0cCI6dGhpcy5zY2hlbWVzWzBdLCgidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuaG9zdHx8IiI9PT10aGlzLmhvc3QpJiYodGhpcy5ob3N0PXUuaG9zdCx1LnBvcnQmJih0aGlzLmhvc3Q9dGhpcy5ob3N0KyI6Iit1LnBvcnQpKSx0aGlzLmRlZmluaXRpb25zPWUuZGVmaW5pdGlvbnM7dmFyIGM7Zm9yKGMgaW4gdGhpcy5kZWZpbml0aW9ucyl7dmFyIGQ9bmV3IG8oYyx0aGlzLmRlZmluaXRpb25zW2NdLHRoaXMubW9kZWxzKTtkJiYodGhpcy5tb2RlbHNbY109ZCl9dmFyIG09dGhpcztyZXR1cm4gbS5hcGlzLmhlbHA9bi5iaW5kKG0uaGVscCxtKSxuLmZvckVhY2goZS5wYXRocyxmdW5jdGlvbihlLHQpe24uaXNQbGFpbk9iamVjdChlKSYmbi5mb3JFYWNoKGYsZnVuY3Rpb24obyl7dmFyIGw9ZVtvXTtpZighbi5pc1VuZGVmaW5lZChsKSl7aWYoIW4uaXNQbGFpbk9iamVjdChsKSlyZXR1cm4gdm9pZCBpLmxvZygiVGhlICciK28rIicgb3BlcmF0aW9uIGZvciAnIit0KyInIHBhdGggaXMgbm90IGFuIE9wZXJhdGlvbiBPYmplY3QiKTt2YXIgdT1sLnRhZ3M7KG4uaXNVbmRlZmluZWQodSl8fCFuLmlzQXJyYXkodSl8fDA9PT11Lmxlbmd0aCkmJih1PWwudGFncz1bImRlZmF1bHQiXSk7dmFyIGM9bS5pZEZyb21PcCh0LG8sbCksZj1uZXcgYShtLGwuc2NoZW1lLGMsbyx0LGwsbS5kZWZpbml0aW9ucyxtLm1vZGVscyxtLmNsaWVudEF1dGhvcml6YXRpb25zKTtuLmZvckVhY2godSxmdW5jdGlvbihlKXt2YXIgdD1uLmluZGV4T2YocCxlKT4tMT8iXyIrZTplLG89bi5pbmRleE9mKGgsZSk+LTE/Il8iK2U6ZSxhPW1bdF07aWYodCE9PWUmJmkubG9nKCJUaGUgJyIrZSsiJyB0YWcgY29uZmxpY3RzIHdpdGggYSBTd2FnZ2VyQ2xpZW50IGZ1bmN0aW9uL3Byb3BlcnR5IG5hbWUuICBVc2UgJ2NsaWVudC4iK3QrIicgb3IgJ2NsaWVudC5hcGlzLiIrZSsiJyBpbnN0ZWFkIG9mICdjbGllbnQuIitlKyInLiIpLG8hPT1lJiZpLmxvZygiVGhlICciK2UrIicgdGFnIGNvbmZsaWN0cyB3aXRoIGEgU3dhZ2dlckNsaWVudCBvcGVyYXRpb24gZnVuY3Rpb24vcHJvcGVydHkgbmFtZS4gIFVzZSAnY2xpZW50LmFwaXMuIitvKyInIGluc3RlYWQgb2YgJ2NsaWVudC5hcGlzLiIrZSsiJy4iKSxuLmluZGV4T2YoaCxjKT4tMSYmKGkubG9nKCJUaGUgJyIrYysiJyBvcGVyYXRpb25JZCBjb25mbGljdHMgd2l0aCBhIFN3YWdnZXJDbGllbnQgb3BlcmF0aW9uIGZ1bmN0aW9uL3Byb3BlcnR5IG5hbWUuICBVc2UgJ2NsaWVudC5hcGlzLiIrbysiLl8iK2MrIicgaW5zdGVhZCBvZiAnY2xpZW50LmFwaXMuIitvKyIuIitjKyInLiIpLGM9Il8iK2MsZi5uaWNrbmFtZT1jKSxuLmlzVW5kZWZpbmVkKGEpKXthPW1bdF09bS5hcGlzW29dPXt9LGEub3BlcmF0aW9ucz17fSxhLmxhYmVsPW8sYS5hcGlzPXt9O3ZhciBsPXJbZV07bi5pc1VuZGVmaW5lZChsKXx8KGEuZGVzY3JpcHRpb249bC5kZXNjcmlwdGlvbixhLmV4dGVybmFsRG9jcz1sLmV4dGVybmFsRG9jcyksbVt0XS5oZWxwPW4uYmluZChtLmhlbHAsYSksbS5hcGlzQXJyYXkucHVzaChuZXcgcyhlLGEuZGVzY3JpcHRpb24sYS5leHRlcm5hbERvY3MsZikpfW4uaXNGdW5jdGlvbihhLmhlbHApfHwoYS5oZWxwPW4uYmluZChtLmhlbHAsYSkpLG0uYXBpc1tvXVtjXT1hW2NdPW4uYmluZChmLmV4ZWN1dGUsZiksbS5hcGlzW29dW2NdLmhlbHA9YVtjXS5oZWxwPW4uYmluZChmLmhlbHAsZiksbS5hcGlzW29dW2NdLmFzQ3VybD1hW2NdLmFzQ3VybD1uLmJpbmQoZi5hc0N1cmwsZiksYS5hcGlzW2NdPWEub3BlcmF0aW9uc1tjXT1mO3ZhciB1PW4uZmluZChtLmFwaXNBcnJheSxmdW5jdGlvbih0KXtyZXR1cm4gdC50YWc9PT1lfSk7dSYmdS5vcGVyYXRpb25zQXJyYXkucHVzaChmKX0pfX0pfSksdGhpcy5pc0J1aWx0PSEwLHRoaXMuc3VjY2VzcyYmKHRoaXMuaXNWYWxpZD0hMCx0aGlzLmlzQnVpbHQ9ITAsdGhpcy5zdWNjZXNzKCkpLHRoaXN9LGQucHJvdG90eXBlLnBhcnNlVXJpPWZ1bmN0aW9uKGUpe3ZhciB0PS9eKCgoKFteOlwvI1w/XSs6KT8oPzooXC9cLykoKD86KChbXjpAXC8jXD9dKykoPzpcOihbXjpAXC8jXD9dKykpPylAKT8oKFteOlwvI1w/XF1cW10rfFxbW15cL1xdQCM/XStcXSkoPzpcOihbMC05XSspKT8pKT8pPyk/KChcLz8oPzpbXlwvXD8jXStcLyspKikoW15cPyNdKikpKT8oXD9bXiNdKyk/KSgjLiopPy8sbj10LmV4ZWMoZSk7cmV0dXJue3NjaGVtZTpuWzRdLnJlcGxhY2UoIjoiLCIiKSxob3N0Om5bMTFdLHBvcnQ6blsxMl0scGF0aDpuWzE1XX19LGQucHJvdG90eXBlLmhlbHA9ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkP24uZm9yRWFjaCh0aGlzLmFwaXMsZnVuY3Rpb24oZSxyKXtuLmlzUGxhaW5PYmplY3QoZSkmJih0Kz0ib3BlcmF0aW9ucyBmb3IgdGhlICciK3IrIicgdGFnXG4iLG4uZm9yRWFjaChlLm9wZXJhdGlvbnMsZnVuY3Rpb24oZSxuKXt0Kz0iICAqICIrbisiOiAiK2Uuc3VtbWFyeSsiXG4ifSkpfSk6KHRoaXMgaW5zdGFuY2VvZiBzfHxuLmlzUGxhaW5PYmplY3QodGhpcykpJiYodCs9Im9wZXJhdGlvbnMgZm9yIHRoZSAnIit0aGlzLmxhYmVsKyInIHRhZ1xuIixuLmZvckVhY2godGhpcy5hcGlzLGZ1bmN0aW9uKGUsbil7dCs9IiAgKiAiK24rIjogIitlLnN1bW1hcnkrIlxuIn0pKSxlP3Q6KGkubG9nKHQpLHQpfSxkLnByb3RvdHlwZS50YWdGcm9tTGFiZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGQucHJvdG90eXBlLmlkRnJvbU9wPWZ1bmN0aW9uKGUsdCxuKXtuJiZuLm9wZXJhdGlvbklkfHwobj1ufHx7fSxuLm9wZXJhdGlvbklkPXQrIl8iK2UpO3ZhciByPW4ub3BlcmF0aW9uSWQucmVwbGFjZSgvW1xzIUAjJCVeJiooKV8rPVxbe1xdfTs6PD58LlwvPyxcXCciIi1dL2csIl8iKXx8ZS5zdWJzdHJpbmcoMSkrIl8iK3Q7cmV0dXJuIHI9ci5yZXBsYWNlKC8oKF8pezIsfSkvZywiXyIpLHI9ci5yZXBsYWNlKC9eKF8pKi9nLCIiKSxyPXIucmVwbGFjZSgvKFtfXSkqJC9nLCIiKX0sZC5wcm90b3R5cGUuZmFpbD1mdW5jdGlvbihlKXt0aHJvdyB0aGlzLmZhaWx1cmUoZSksZX19LHsiLi9hdXRoIjoyLCIuL2hlbHBlcnMiOjQsIi4vaHR0cCI6NSwiLi9yZXNvbHZlciI6NiwiLi9zcGVjLWNvbnZlcnRlciI6NywiLi90eXBlcy9tb2RlbCI6OCwiLi90eXBlcy9vcGVyYXRpb24iOjksIi4vdHlwZXMvb3BlcmF0aW9uR3JvdXAiOjEwLCJsb2Rhc2gtY29tcGF0L2FycmF5L2luZGV4T2YiOjE5LCJsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vZmluZCI6MjEsImxvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9mb3JFYWNoIjoyMiwibG9kYXNoLWNvbXBhdC9mdW5jdGlvbi9iaW5kIjoyNSwibG9kYXNoLWNvbXBhdC9sYW5nL2Nsb25lRGVlcCI6OTQsImxvZGFzaC1jb21wYXQvbGFuZy9pc0FycmF5Ijo5NiwibG9kYXNoLWNvbXBhdC9sYW5nL2lzRnVuY3Rpb24iOjk3LCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNQbGFpbk9iamVjdCI6MTAwLCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNVbmRlZmluZWQiOjEwM31dLDQ6W2Z1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHMuX19iaW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX07dmFyIG49dC5leHBvcnRzLmxvZz1mdW5jdGlvbigpe24uaGlzdG9yeT1uLmhpc3Rvcnl8fFtdLG4uaGlzdG9yeS5wdXNoKGFyZ3VtZW50cyksY29uc29sZSYmInRlc3QiIT09ZS5lbnYuTk9ERV9FTlYmJmNvbnNvbGUubG9nKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylbMF0pfTt0LmV4cG9ydHMuZmFpbD1mdW5jdGlvbihlKXtuKGUpfSx0LmV4cG9ydHMub3B0aW9uSHRtbD1mdW5jdGlvbihlLHQpe3JldHVybic8dHI+PHRkIGNsYXNzPSJvcHRpb25OYW1lIj4nK2UrIjo8L3RkPjx0ZD4iK3QrIjwvdGQ+PC90cj4ifSx0LmV4cG9ydHMudHlwZUZyb21Kc29uU2NoZW1hPWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuImludGVnZXIiPT09ZSYmImludDMyIj09PXQ/bj0iaW50ZWdlciI6ImludGVnZXIiPT09ZSYmImludDY0Ij09PXQ/bj0ibG9uZyI6ImludGVnZXIiPT09ZSYmInVuZGVmaW5lZCI9PXR5cGVvZiB0P249ImxvbmciOiJzdHJpbmciPT09ZSYmImRhdGUtdGltZSI9PT10P249ImRhdGUtdGltZSI6InN0cmluZyI9PT1lJiYiZGF0ZSI9PT10P249ImRhdGUiOiJudW1iZXIiPT09ZSYmImZsb2F0Ij09PXQ/bj0iZmxvYXQiOiJudW1iZXIiPT09ZSYmImRvdWJsZSI9PT10P249ImRvdWJsZSI6Im51bWJlciI9PT1lJiYidW5kZWZpbmVkIj09dHlwZW9mIHQ/bj0iZG91YmxlIjoiYm9vbGVhbiI9PT1lP249ImJvb2xlYW4iOiJzdHJpbmciPT09ZSYmKG49InN0cmluZyIpLG59O3ZhciByPXQuZXhwb3J0cy5zaW1wbGVSZWY9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBlP251bGw6MD09PWUuaW5kZXhPZigiIy9kZWZpbml0aW9ucy8iKT9lLnN1YnN0cmluZygiIy9kZWZpbml0aW9ucy8iLmxlbmd0aCk6ZX0saT10LmV4cG9ydHMuZ2V0U3RyaW5nU2lnbmF0dXJlPWZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBlLiRyZWY/bis9cihlLiRyZWYpOiJ1bmRlZmluZWQiPT10eXBlb2YgZS50eXBlP24rPSJvYmplY3QiOiJhcnJheSI9PT1lLnR5cGU/dD9uKz1pKGUuaXRlbXN8fGUuJHJlZnx8e30pOihuKz0iQXJyYXlbIixuKz1pKGUuaXRlbXN8fGUuJHJlZnx8e30pLG4rPSJdIik6bis9ImludGVnZXIiPT09ZS50eXBlJiYiaW50MzIiPT09ZS5mb3JtYXQ/ImludGVnZXIiOiJpbnRlZ2VyIj09PWUudHlwZSYmImludDY0Ij09PWUuZm9ybWF0PyJsb25nIjoiaW50ZWdlciI9PT1lLnR5cGUmJiJ1bmRlZmluZWQiPT10eXBlb2YgZS5mb3JtYXQ/ImxvbmciOiJzdHJpbmciPT09ZS50eXBlJiYiZGF0ZS10aW1lIj09PWUuZm9ybWF0PyJkYXRlLXRpbWUiOiJzdHJpbmciPT09ZS50eXBlJiYiZGF0ZSI9PT1lLmZvcm1hdD8iZGF0ZSI6InN0cmluZyI9PT1lLnR5cGUmJiJ1bmRlZmluZWQiPT10eXBlb2YgZS5mb3JtYXQ/InN0cmluZyI6Im51bWJlciI9PT1lLnR5cGUmJiJmbG9hdCI9PT1lLmZvcm1hdD8iZmxvYXQiOiJudW1iZXIiPT09ZS50eXBlJiYiZG91YmxlIj09PWUuZm9ybWF0PyJkb3VibGUiOiJudW1iZXIiPT09ZS50eXBlJiYidW5kZWZpbmVkIj09dHlwZW9mIGUuZm9ybWF0PyJkb3VibGUiOiJib29sZWFuIj09PWUudHlwZT8iYm9vbGVhbiI6ZS4kcmVmP3IoZS4kcmVmKTplLnR5cGUsbn19KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHtfcHJvY2VzczoxNX1dLDU6W2Z1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3ZhciBuPWUoIi4vaGVscGVycyIpLHI9ZSgianF1ZXJ5IiksaT1lKCJzdXBlcmFnZW50Iiksbz1mdW5jdGlvbigpe30sYT1mdW5jdGlvbigpe30scz10LmV4cG9ydHM9ZnVuY3Rpb24oKXt9O3MucHJvdG90eXBlLmV4ZWN1dGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy51c2VKUXVlcnk9ZSYmImJvb2xlYW4iPT10eXBlb2YgZS51c2VKUXVlcnk/ZS51c2VKUXVlcnk6dGhpcy5pc0lFOCgpLGUmJiJvYmplY3QiPT10eXBlb2YgZS5ib2R5JiYoZS5ib2R5LnR5cGUmJiJmb3JtRGF0YSI9PT1lLmJvZHkudHlwZT8oZS5jb250ZW50VHlwZT0hMSxlLnByb2Nlc3NEYXRhPSExLGRlbGV0ZSBlLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdKTplLmJvZHk9SlNPTi5zdHJpbmdpZnkoZS5ib2R5KSksdGhpcy51c2VKUXVlcnk/bmV3IG8odCkuZXhlY3V0ZShlKTpuZXcgYSh0KS5leGVjdXRlKGUpfSxzLnByb3RvdHlwZS5pc0lFOD1mdW5jdGlvbigpe3ZhciBlPSExO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IudXNlckFnZW50KXt2YXIgdD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7aWYoLTEhPT10LmluZGV4T2YoIm1zaWUiKSl7dmFyIG49cGFyc2VJbnQodC5zcGxpdCgibXNpZSIpWzFdKTs4Pj1uJiYoZT0hMCl9fXJldHVybiBlfSxvLnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKGUpe3ZhciB0PWUub24saT1lO3JldHVybiBlLnR5cGU9ZS5tZXRob2QsZS5jYWNoZT0hMSxkZWxldGUgZS51c2VKUXVlcnksZS5kYXRhPWUuYm9keSxkZWxldGUgZS5ib2R5LGUuY29tcGxldGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciByPXt9LG89ZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgiXG4iKSxhPTA7YTxvLmxlbmd0aDthKyspe3ZhciBzPW9bYV0udHJpbSgpO2lmKDAhPT1zLmxlbmd0aCl7dmFyIGw9cy5pbmRleE9mKCI6Iik7aWYoLTEhPT1sKXt2YXIgdT1zLnN1YnN0cmluZygwLGwpLnRyaW0oKSxjPXMuc3Vic3RyaW5nKGwrMSkudHJpbSgpO3JbdV09Y31lbHNlIHJbc109bnVsbH19dmFyIHA9e3VybDppLnVybCxtZXRob2Q6aS5tZXRob2Qsc3RhdHVzOmUuc3RhdHVzLHN0YXR1c1RleHQ6ZS5zdGF0dXNUZXh0LGRhdGE6ZS5yZXNwb25zZVRleHQsaGVhZGVyczpyfSxoPXJbImNvbnRlbnQtdHlwZSJdfHxyWyJDb250ZW50LVR5cGUiXXx8bnVsbDtpZihoJiYoMD09PWguaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpfHxoLmluZGV4T2YoIitqc29uIik+MCkpdHJ5e3Aub2JqPWUucmVzcG9uc2VKU09OfHxKU09OLnBhcnNlKHAuZGF0YSl8fHt9fWNhdGNoKGYpe24ubG9nKCJ1bmFibGUgdG8gcGFyc2UgSlNPTiBjb250ZW50Iil9aWYoZS5zdGF0dXM+PTIwMCYmZS5zdGF0dXM8MzAwKXQucmVzcG9uc2UocCk7ZWxzZXtpZighKDA9PT1lLnN0YXR1c3x8ZS5zdGF0dXM+PTQwMCYmZS5zdGF0dXM8NTk5KSlyZXR1cm4gdC5yZXNwb25zZShwKTt0LmVycm9yKHApfX0sci5zdXBwb3J0LmNvcnM9ITAsci5hamF4KGUpfSxhLnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWV0aG9kLnRvTG93ZXJDYXNlKCk7ImRlbGV0ZSI9PT10JiYodD0iZGVsIik7dmFyIG4scj1lLmhlYWRlcnN8fHt9LG89aVt0XShlLnVybCk7Zm9yKG4gaW4gcilvLnNldChuLHJbbl0pO2UuYm9keSYmby5zZW5kKGUuYm9keSksby5lbmQoZnVuY3Rpb24odCxuKXtuPW58fHtzdGF0dXM6MCxoZWFkZXJzOntlcnJvcjoibm8gcmVzcG9uc2UgZnJvbSBzZXJ2ZXIifX07dmFyIHIsaT17dXJsOmUudXJsLG1ldGhvZDplLm1ldGhvZCxoZWFkZXJzOm4uaGVhZGVyc307IXQmJm4uZXJyb3ImJih0PW4uZXJyb3IpLHQmJmUub24mJmUub24uZXJyb3I/KGkub2JqPXQsaS5zdGF0dXM9bj9uLnN0YXR1czo1MDAsaS5zdGF0dXNUZXh0PW4/bi50ZXh0OnQubWVzc2FnZSxyPWUub24uZXJyb3IpOm4mJmUub24mJmUub24ucmVzcG9uc2UmJihpLm9iaj0idW5kZWZpbmVkIiE9dHlwZW9mIG4uYm9keT9uLmJvZHk6bi50ZXh0LGkuc3RhdHVzPW4uc3RhdHVzLGkuc3RhdHVzVGV4dD1uLnRleHQscj1lLm9uLnJlc3BvbnNlKSxpLmRhdGE9aS5zdGF0dXNUZXh0LHImJnIoaSl9KX19LHsiLi9oZWxwZXJzIjo0LGpxdWVyeToxOCxzdXBlcmFnZW50OjExMX1dLDY6W2Z1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3ZhciBuPWUoIi4vaHR0cCIpLHI9dC5leHBvcnRzPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLnNjb3BlPXJ8fHRoaXM7dmFyIGksbyxhLHMsbCx1PTAsYz17fSxwPXt9LGg9e307Zm9yKG8gaW4gZS5kZWZpbml0aW9ucyl7dmFyIGY9ZS5kZWZpbml0aW9uc1tvXTtmb3IobCBpbiBmLnByb3BlcnRpZXMpcz1mLnByb3BlcnRpZXNbbF0sdGhpcy5yZXNvbHZlVG8ocyxoKX1mb3IobyBpbiBlLnBhdGhzKXt2YXIgZCxtLGc7YT1lLnBhdGhzW29dO2ZvcihkIGluIGEpaWYoIiRyZWYiPT09ZCl0aGlzLnJlc29sdmVJbmxpbmUoZSxhLGgscCk7ZWxzZXttPWFbZF07dmFyIHksdj1tLnBhcmFtZXRlcnM7Zm9yKHkgaW4gdil7dmFyIGI9dlt5XTsiYm9keSI9PT1iWyJpbiJdJiZiLnNjaGVtYSYmdGhpcy5yZXNvbHZlVG8oYi5zY2hlbWEsaCksYi4kcmVmJiZ0aGlzLnJlc29sdmVJbmxpbmUoZSxiLGgscCl9Zm9yKGcgaW4gbS5yZXNwb25zZXMpe3ZhciB3PW0ucmVzcG9uc2VzW2ddOyJvYmplY3QiPT10eXBlb2YgdyYmdy4kcmVmJiZ0aGlzLnJlc29sdmVJbmxpbmUoZSx3LGgscCksdy5zY2hlbWEmJnRoaXMucmVzb2x2ZVRvKHcuc2NoZW1hLGgpfX19dmFyIHg9e30sQT0wO2ZvcihvIGluIGgpe3ZhciBFPW8uc3BsaXQoIiMiKTsyPT09RS5sZW5ndGg/KGk9RVswXSxhPUVbMV0sQXJyYXkuaXNBcnJheSh4W2ldKXx8KHhbaV09W10sQSs9MSkseFtpXS5wdXNoKGEpKTooQXJyYXkuaXNBcnJheSh4W29dKXx8KHhbb109W10sQSs9MSkseFtvXS5wdXNoKG51bGwpKX1mb3IobyBpbiB4KXt2YXIgaj10aGlzLEM9eFtvXTtpPW87dmFyIFQ9e3VzZUpRdWVyeTohMSx1cmw6aSxtZXRob2Q6ImdldCIsaGVhZGVyczp7YWNjZXB0OnRoaXMuc2NvcGUuc3dhZ2dlclJlcXVlc3RIZWFkZXJzfHwiYXBwbGljYXRpb24vanNvbiJ9LG9uOntlcnJvcjpmdW5jdGlvbigpe3UrPTE7dmFyIG47Zm9yKG49MDtuPEMubGVuZ3RoO24rKyl7dmFyIHI9aSsiIyIrQ1tuXTtwW3JdPW51bGx9dT09PUEmJmouZmluaXNoKGUsaCxjLHAsdCl9LHJlc3BvbnNlOmZ1bmN0aW9uKG4pe3ZhciByLGEscz1uLm9iajtpZihudWxsPT09c3x8MD09PU9iamVjdC5rZXlzKHMpLmxlbmd0aCl0cnl7cz1KU09OLnBhcnNlKG4uZGF0YSl9Y2F0Y2gobCl7cz17fX1mb3IodSs9MSxyPTA7cjxDLmxlbmd0aDtyKyspe3ZhciBmPUNbcl07aWYobnVsbD09ZiljW29dPXtuYW1lOm8sb2JqOnN9O2Vsc2V7dmFyIGQ9cyxtPWYuc3BsaXQoIi8iKTtmb3IoYT0wO2E8bS5sZW5ndGg7YSsrKXt2YXIgZz1tW2FdO2lmKC0xIT09Zy5pbmRleE9mKCJ+MSIpJiYoZz1tW2FdLnJlcGxhY2UoL34wL2csIn4iKS5yZXBsYWNlKC9+MS9nLCIvIiksIi8iIT09Zy5jaGFyQXQoMCkmJihnPSIvIitnKSksInVuZGVmaW5lZCI9PXR5cGVvZiBkKWJyZWFrO2cubGVuZ3RoPjAmJihkPWRbZ10pfXZhciB5PWkrIiMiK2Ysdj1tW2EtMV07InVuZGVmaW5lZCIhPXR5cGVvZiBkP2NbeV09e25hbWU6dixvYmo6ZH06cFt5XT1udWxsfX11PT09QSYmai5maW5pc2goZSxoLGMscCx0KX19fTtyJiZyLmNsaWVudEF1dGhvcml6YXRpb25zJiZyLmNsaWVudEF1dGhvcml6YXRpb25zLmFwcGx5KFQpLChuZXcgbikuZXhlY3V0ZShUKX0wPT09T2JqZWN0LmtleXMoeCkubGVuZ3RoJiZ0LmNhbGwodGhpcy5zY29wZSxlLHApfSxyLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbztmb3IobyBpbiB0KXt2YXIgYSxzPXRbb107Zm9yKGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIGw9bltzW2FdLm9iai4kcmVmXTtpZihsKWlmKGUuZGVmaW5pdGlvbnN8fChlLmRlZmluaXRpb25zPXt9KSwiJHJlZiI9PT1zW2FdLnJlc29sdmVBcyllLmRlZmluaXRpb25zW2wubmFtZV09bC5vYmosc1thXS5vYmouJHJlZj0iIy9kZWZpbml0aW9ucy8iK2wubmFtZTtlbHNlIGlmKCJpbmxpbmUiPT09c1thXS5yZXNvbHZlQXMpe3ZhciB1LGM9c1thXS5vYmo7ZGVsZXRlIGMuJHJlZjtmb3IodSBpbiBsLm9iailjW3VdPWwub2JqW3VdfX19aS5jYWxsKHRoaXMuc2NvcGUsZSxyKX0sci5wcm90b3R5cGUucmVzb2x2ZUlubGluZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10LiRyZWY7aWYoaSl7aWYoMD09PWkuaW5kZXhPZigiaHR0cCIpKUFycmF5LmlzQXJyYXkobltpXSk/bltpXS5wdXNoKHtvYmo6dCxyZXNvbHZlQXM6ImlubGluZSJ9KTpuW2ldPVt7b2JqOnQscmVzb2x2ZUFzOiJpbmxpbmUifV07ZWxzZSBpZigwPT09aS5pbmRleE9mKCIjIikpe3ZhciBvLGE9aS5zdWJzdHJpbmcoMSkscz1hLnNwbGl0KCIvIiksbD1lO2ZvcihvPTA7bzxzLmxlbmd0aDtvKyspe3ZhciB1PXNbb107dS5sZW5ndGg+MCYmKGw9bFt1XSl9aWYobCl7ZGVsZXRlIHQuJHJlZjt2YXIgYztmb3IoYyBpbiBsKXRbY109bFtjXX1lbHNlIHJbaV09bnVsbH19ZWxzZSJhcnJheSI9PT10LnR5cGUmJnRoaXMucmVzb2x2ZVRvKHQuaXRlbXMsbil9LHIucHJvdG90eXBlLnJlc29sdmVUbz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuJHJlZjtpZihuKTA9PT1uLmluZGV4T2YoImh0dHAiKSYmKEFycmF5LmlzQXJyYXkodFtuXSk/dFtuXS5wdXNoKHtvYmo6ZSxyZXNvbHZlQXM6IiRyZWYifSk6dFtuXT1be29iajplLHJlc29sdmVBczoiJHJlZiJ9XSk7ZWxzZSBpZigiYXJyYXkiPT09ZS50eXBlKXt2YXIgcj1lLml0ZW1zO3RoaXMucmVzb2x2ZVRvKHIsdCl9fX0seyIuL2h0dHAiOjV9XSw3OltmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj0oZSgiLi9jbGllbnQiKSxlKCIuL2h0dHAiKSkscj10LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLmVycm9ycz1bXSx0aGlzLndhcm5pbmdzPVtdLHRoaXMubW9kZWxNYXA9e319O3IucHJvdG90eXBlLnNldERvY3VtZW50YXRpb25Mb2NhdGlvbj1mdW5jdGlvbihlKXt0aGlzLmRvY0xvY2F0aW9uPWV9LHIucHJvdG90eXBlLmNvbnZlcnQ9ZnVuY3Rpb24oZSx0KXtpZighZXx8IUFycmF5LmlzQXJyYXkoZS5hcGlzKSlyZXR1cm4gdGhpcy5maW5pc2godCxudWxsKTt2YXIgbj17c3dhZ2dlcjoiMi4wIn07bi5vcmlnaW5hbFZlcnNpb249ZS5zd2FnZ2VyVmVyc2lvbix0aGlzLmFwaUluZm8oZSxuKSx0aGlzLnNlY3VyaXR5RGVmaW5pdGlvbnMoZSxuKTt2YXIgcixpPSExO2ZvcihyPTA7cjxlLmFwaXMubGVuZ3RoO3IrKyl7dmFyIG89ZS5hcGlzW3JdO0FycmF5LmlzQXJyYXkoby5vcGVyYXRpb25zKSYmKGk9ITApfWk/KHRoaXMuZGVjbGFyYXRpb24oZSxuKSx0aGlzLmZpbmlzaCh0LG4pKTp0aGlzLnJlc291cmNlTGlzdGluZyhlLG4sdCl9LHIucHJvdG90eXBlLmRlY2xhcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG4scjtpZihlLmFwaXMpe3tlLmJhc2VQYXRofWlmKDA9PT1lLmJhc2VQYXRoLmluZGV4T2YoImh0dHA6Ly8iKSl7dmFyIGk9ZS5iYXNlUGF0aC5zdWJzdHJpbmcoImh0dHA6Ly8iLmxlbmd0aCksbz1pLmluZGV4T2YoIi8iKTtvPjA/KHQuaG9zdD1pLnN1YnN0cmluZygwLG8pLHQuYmFzZVBhdGg9aS5zdWJzdHJpbmcobykpOih0Lmhvc3Q9aSx0LmJhc2VQYXRoPSIvIil9dmFyIGE7aWYoZS5hdXRob3JpemF0aW9ucyYmKGE9ZS5hdXRob3JpemF0aW9ucyksZS5jb25zdW1lcyYmKHQuY29uc3VtZXM9ZS5jb25zdW1lcyksZS5wcm9kdWNlcyYmKHQucHJvZHVjZXM9ZS5wcm9kdWNlcyksIm9iamVjdCI9PXR5cGVvZiBlKWZvcihuIGluIGUubW9kZWxzKXt2YXIgcz1lLm1vZGVsc1tuXSxsPXMuaWR8fG47dGhpcy5tb2RlbE1hcFtsXT1ufWZvcihyPTA7cjxlLmFwaXMubGVuZ3RoO3IrKyl7dmFyIHU9ZS5hcGlzW3JdLGM9dS5wYXRoLHA9dS5vcGVyYXRpb25zO3RoaXMub3BlcmF0aW9ucyhjLGUucmVzb3VyY2VQYXRoLHAsYSx0KX12YXIgaD1lLm1vZGVsczt0aGlzLm1vZGVscyhoLHQpfX0sci5wcm90b3R5cGUubW9kZWxzPWZ1bmN0aW9uKGUsdCl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgbjt0LmRlZmluaXRpb25zPXQuZGVmaW5pdGlvbnN8fHt9O2ZvcihuIGluIGUpe3ZhciByLGk9ZVtuXSxvPVtdLGE9e3Byb3BlcnRpZXM6e319O2ZvcihyIGluIGkucHJvcGVydGllcyl7dmFyIHM9aS5wcm9wZXJ0aWVzW3JdLGw9e307dGhpcy5kYXRhVHlwZShzLGwpLHMuZGVzY3JpcHRpb24mJihsLmRlc2NyaXB0aW9uPXMuZGVzY3JpcHRpb24pLHNbImVudW0iXSYmKGxbImVudW0iXT1zWyJlbnVtIl0pLCJib29sZWFuIj09dHlwZW9mIHMucmVxdWlyZWQmJnMucmVxdWlyZWQ9PT0hMCYmby5wdXNoKHIpLCJzdHJpbmciPT10eXBlb2Ygcy5yZXF1aXJlZCYmInRydWUiPT09cy5yZXF1aXJlZCYmby5wdXNoKHIpLGEucHJvcGVydGllc1tyXT1sfW8ubGVuZ3RoPjAmJihhWyJlbnVtIl09byksdC5kZWZpbml0aW9uc1tuXT1hfX19LHIucHJvdG90eXBlLmV4dHJhY3RUYWc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8ImRlZmF1bHQiO3JldHVybigwPT09dC5pbmRleE9mKCJodHRwOiIpfHwwPT09dC5pbmRleE9mKCJodHRwczoiKSkmJih0PXQuc3BsaXQoWyIvIl0pLHQ9dFt0Lmxlbmd0aC0xXS5zdWJzdHJpbmcoKSksdC5yZXBsYWNlKCIvIiwiIil9LHIucHJvdG90eXBlLm9wZXJhdGlvbnM9ZnVuY3Rpb24oZSx0LG4scixpKXtpZihBcnJheS5pc0FycmF5KG4pKXt2YXIgbztpLnBhdGhzfHwoaS5wYXRocz17fSk7dmFyIGE9aS5wYXRoc1tlXXx8e30scz10aGlzLmV4dHJhY3RUYWcodCk7aS50YWdzPWkudGFnc3x8W107dmFyIGw9ITE7Zm9yKG89MDtvPGkudGFncy5sZW5ndGg7bysrKXt2YXIgdT1pLnRhZ3Nbb107dS5uYW1lPT09cyYmKGw9ITApfWZvcihsfHxpLnRhZ3MucHVzaCh7bmFtZTpzfSksbz0wO288bi5sZW5ndGg7bysrKXt2YXIgYz1uW29dLHA9KGMubWV0aG9kfHxjLmh0dHBNZXRob2QpLnRvTG93ZXJDYXNlKCksaD17dGFnczpbc119LGY9Yy5hdXRob3JpemF0aW9ucztpZihmJiYwPT09T2JqZWN0LmtleXMoZikubGVuZ3RoJiYoZj1yKSwidW5kZWZpbmVkIiE9dHlwZW9mIGYpZm9yKHZhciBkIGluIGYpe2guc2VjdXJpdHk9aC5zZWN1cml0eXx8W107dmFyIG09ZltkXTtpZihtKXt2YXIgZz1bXTtmb3IodmFyIHkgaW4gbSlnLnB1c2gobVt5XS5zY29wZSk7dmFyIHY9e307dltkXT1nLGguc2VjdXJpdHkucHVzaCh2KX1lbHNle3ZhciB2PXt9O3ZbZF09W10saC5zZWN1cml0eS5wdXNoKHYpfX1jLmNvbnN1bWVzP2guY29uc3VtZXM9Yy5jb25zdW1lczppLmNvbnN1bWVzJiYoaC5jb25zdW1lcz1pLmNvbnN1bWVzKSxjLnByb2R1Y2VzP2gucHJvZHVjZXM9Yy5wcm9kdWNlczppLnByb2R1Y2VzJiYoaC5wcm9kdWNlcz1pLnByb2R1Y2VzKSxjLnN1bW1hcnkmJihoLnN1bW1hcnk9Yy5zdW1tYXJ5KSxjLm5vdGVzJiYoaC5kZXNjcmlwdGlvbj1jLm5vdGVzKSxjLm5pY2tuYW1lJiYoaC5vcGVyYXRpb25JZD1jLm5pY2tuYW1lKSxjLmRlcHJlY2F0ZWQmJihoLmRlcHJlY2F0ZWQ9Yy5kZXByZWNhdGVkKSx0aGlzLmF1dGhvcml6YXRpb25zKGYsaSksdGhpcy5wYXJhbWV0ZXJzKGgsYy5wYXJhbWV0ZXJzLGkpLHRoaXMucmVzcG9uc2VNZXNzYWdlcyhoLGMsaSksYVtwXT1ofWkucGF0aHNbZV09YX19LHIucHJvdG90eXBlLnJlc3BvbnNlTWVzc2FnZXM9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQpe3ZhciBuPXt9O3RoaXMuZGF0YVR5cGUodCxuKSxuLnNjaGVtYXx8KG49e3NjaGVtYTpufSksZS5yZXNwb25zZXM9ZS5yZXNwb25zZXN8fHt9O3ZhciByPSExO2lmKEFycmF5LmlzQXJyYXkodC5yZXNwb25zZU1lc3NhZ2VzKSl7dmFyIGksbz10LnJlc3BvbnNlTWVzc2FnZXM7Zm9yKGk9MDtpPG8ubGVuZ3RoO2krKyl7dmFyIGE9b1tpXSxzPXtkZXNjcmlwdGlvbjphLm1lc3NhZ2V9OzIwMD09PWEuY29kZSYmKHI9ITApLGUucmVzcG9uc2VzWyIiK2EuY29kZV09c319cj9lLnJlc3BvbnNlc1siZGVmYXVsdCJdPW46ZS5yZXNwb25zZXNbMjAwXT1ufX0sci5wcm90b3R5cGUuYXV0aG9yaXphdGlvbnM9ZnVuY3Rpb24oZSl7fSxyLnByb3RvdHlwZS5wYXJhbWV0ZXJzPWZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG47Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXSxpPXt9O2lmKGkubmFtZT1yLm5hbWUsaS5kZXNjcmlwdGlvbj1yLmRlc2NyaXB0aW9uLGkucmVxdWlyZWQ9ci5yZXF1aXJlZCxpWyJpbiJdPXIucGFyYW1UeXBlLCJib2R5Ij09PWlbImluIl0mJihpLm5hbWU9ImJvZHkiKSwiZm9ybSI9PT1pWyJpbiJdJiYoaVsiaW4iXT0iZm9ybURhdGEiKSxyLmFsbG93TXVsdGlwbGU9PT0hMHx8InRydWUiPT09ci5hbGxvd011bHRpcGxlKXt2YXIgbz17fTtpZih0aGlzLmRhdGFUeXBlKHIsbyksaS50eXBlPSJhcnJheSIsaS5pdGVtcz1vLHIuYWxsb3dhYmxlVmFsdWVzKXt2YXIgYT1yLmFsbG93YWJsZVZhbHVlczsiTElTVCI9PT1hLnZhbHVlVHlwZSYmKGlbImVudW0iXT1hLnZhbHVlcyl9fWVsc2UgdGhpcy5kYXRhVHlwZShyLGkpO2UucGFyYW1ldGVycz1lLnBhcmFtZXRlcnN8fFtdLGUucGFyYW1ldGVycy5wdXNoKGkpfX19LHIucHJvdG90eXBlLmRhdGFUeXBlPWZ1bmN0aW9uKGUsdCl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtlLm1pbmltdW0mJih0Lm1pbmltdW09ZS5taW5pbXVtKSxlLm1heGltdW0mJih0Lm1heGltdW09ZS5tYXhpbXVtKSxlLmRlZmF1bHRWYWx1ZSYmKHRbImRlZmF1bHQiXT1lLmRlZmF1bHRWYWx1ZSk7dmFyIG49dGhpcy50b0pzb25TY2hlbWEoZSk7biYmKHQ9dHx8e30sbi50eXBlJiYodC50eXBlPW4udHlwZSksbi5mb3JtYXQmJih0LmZvcm1hdD1uLmZvcm1hdCksbi4kcmVmJiYodC5zY2hlbWE9eyRyZWY6bi4kcmVmfSksbi5pdGVtcyYmKHQuaXRlbXM9bi5pdGVtcykpfX0sci5wcm90b3R5cGUudG9Kc29uU2NoZW1hPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiJvYmplY3QiO3ZhciB0PWUudHlwZXx8ZS5kYXRhVHlwZXx8ZS5yZXNwb25zZUNsYXNzfHwiIixuPXQudG9Mb3dlckNhc2UoKSxyPShlLmZvcm1hdHx8IiIpLnRvTG93ZXJDYXNlKCk7aWYoMD09PW4uaW5kZXhPZigibGlzdFsiKSl7dmFyIGk9dC5zdWJzdHJpbmcoNSx0Lmxlbmd0aC0xKSxvPXRoaXMudG9Kc29uU2NoZW1hKHt0eXBlOml9KTtyZXR1cm57dHlwZToiYXJyYXkiLGl0ZW1zOm99fWlmKCJpbnQiPT09bnx8ImludGVnZXIiPT09biYmImludDMyIj09PXIpcmV0dXJue3R5cGU6ImludGVnZXIiLGZvcm1hdDoiaW50MzIifTtpZigibG9uZyI9PT1ufHwiaW50ZWdlciI9PT1uJiYiaW50NjQiPT09cilyZXR1cm57dHlwZToiaW50ZWdlciIsZm9ybWF0OiJpbnQ2NCJ9O2lmKCJpbnRlZ2VyIj09PW4pcmV0dXJue3R5cGU6ImludGVnZXIiLGZvcm1hdDoiaW50NjQifTtpZigiZmxvYXQiPT09bnx8Im51bWJlciI9PT1uJiYiZmxvYXQiPT09cilyZXR1cm57dHlwZToibnVtYmVyIixmb3JtYXQ6ImZsb2F0In07aWYoImRvdWJsZSI9PT1ufHwibnVtYmVyIj09PW4mJiJkb3VibGUiPT09cilyZXR1cm57dHlwZToibnVtYmVyIixmb3JtYXQ6ImRvdWJsZSJ9O2lmKCJzdHJpbmciPT09biYmImRhdGUtdGltZSI9PT1yfHwiZGF0ZSI9PT1uKXJldHVybnt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZGF0ZS10aW1lIn07aWYoInN0cmluZyI9PT1uKXJldHVybnt0eXBlOiJzdHJpbmcifTtpZigiZmlsZSI9PT1uKXJldHVybnt0eXBlOiJmaWxlIn07aWYoImJvb2xlYW4iPT09bilyZXR1cm57dHlwZToiYm9vbGVhbiJ9O2lmKCJhcnJheSI9PT1ufHwibGlzdCI9PT1uKXtpZihlLml0ZW1zKXt2YXIgYT10aGlzLnRvSnNvblNjaGVtYShlLml0ZW1zKTtyZXR1cm57dHlwZToiYXJyYXkiLGl0ZW1zOmF9fXJldHVybnt0eXBlOiJhcnJheSIsaXRlbXM6e3R5cGU6Im9iamVjdCJ9fX1yZXR1cm4gZS4kcmVmP3skcmVmOiIjL2RlZmluaXRpb25zLyIrdGhpcy5tb2RlbE1hcFtlLiRyZWZdfHxlLiRyZWZ9OnskcmVmOiIjL2RlZmluaXRpb25zLyIrdGhpcy5tb2RlbE1hcFtlLnR5cGVdfHxlLnR5cGV9fSxyLnByb3RvdHlwZS5yZXNvdXJjZUxpc3Rpbmc9ZnVuY3Rpb24oZSx0LHIpe3ZhciBpLG89MCxhPXRoaXMscz1lLmFwaXMubGVuZ3RoLGw9dDtmb3IoMD09PXMmJnRoaXMuZmluaXNoKHIsdCksaT0wO3M+aTtpKyspe3ZhciB1PWUuYXBpc1tpXSxjPXUucGF0aCxwPXRoaXMuZ2V0QWJzb2x1dGVQYXRoKGUuc3dhZ2dlclZlcnNpb24sdGhpcy5kb2NMb2NhdGlvbixjKTt1LmRlc2NyaXB0aW9uJiYodC50YWdzPXQudGFnc3x8W10sdC50YWdzLnB1c2goe25hbWU6dGhpcy5leHRyYWN0VGFnKHUucGF0aCksZGVzY3JpcHRpb246dS5kZXNjcmlwdGlvbnx8IiJ9KSk7dmFyIGg9e3VybDpwLGhlYWRlcnM6e2FjY2VwdDoiYXBwbGljYXRpb24vanNvbiJ9LG9uOnt9LG1ldGhvZDoiZ2V0In07aC5vbi5yZXNwb25zZT1mdW5jdGlvbihlKXtvKz0xLGUub2JqJiZhLmRlY2xhcmF0aW9uKGUub2JqLGwpLG89PT1zJiZhLmZpbmlzaChyLGwpfSxoLm9uLmVycm9yPWZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSksbys9MSxvPT09cyYmYS5maW5pc2gocixsKX0sKG5ldyBuKS5leGVjdXRlKGgpfX0sci5wcm90b3R5cGUuZ2V0QWJzb2x1dGVQYXRoPWZ1bmN0aW9uKGUsdCxuKXtpZigiMS4wIj09PWUmJnQuZW5kc1dpdGgoIi5qc29uIikpe3ZhciByPXQubGFzdEluZGV4T2YoIi8iKTtyPjAmJih0PXQuc3Vic3RyaW5nKDAscikpfXZhciBpPXQ7cmV0dXJuIDA9PT1uLmluZGV4T2YoImh0dHA6Ly8iKXx8MD09PW4uaW5kZXhPZigiaHR0cHM6Ly8iKT9pPW46KHQuZW5kc1dpdGgoIi8iKSYmKGk9dC5zdWJzdHJpbmcoMCx0Lmxlbmd0aC0xKSksaSs9biksaT1pLnJlcGxhY2UoIntmb3JtYXR9IiwianNvbiIpfSxyLnByb3RvdHlwZS5zZWN1cml0eURlZmluaXRpb25zPWZ1bmN0aW9uKGUsdCl7aWYoZS5hdXRob3JpemF0aW9ucyl7dmFyIG47Zm9yKG4gaW4gZS5hdXRob3JpemF0aW9ucyl7dmFyIHI9ITEsaT17fSxvPWUuYXV0aG9yaXphdGlvbnNbbl07aWYoImFwaUtleSI9PT1vLnR5cGUpaS50eXBlPSJhcGlLZXkiLGlbImluIl09by5wYXNzQXMsaS5uYW1lPW8ua2V5bmFtZXx8bixyPSEwO2Vsc2UgaWYoIm9hdXRoMiI9PT1vLnR5cGUpe3ZhciBhLHM9by5zY29wZXN8fFtdLGw9e307Zm9yKGEgaW4gcyl7dmFyIHU9c1thXTtsW3Uuc2NvcGVdPXUuZGVzY3JpcHRpb259aWYoaS50eXBlPSJvYXV0aDIiLGE+MCYmKGkuc2NvcGVzPWwpLG8uZ3JhbnRUeXBlcyl7aWYoby5ncmFudFR5cGVzLmltcGxpY2l0KXt2YXIgYz1vLmdyYW50VHlwZXMuaW1wbGljaXQ7aS5mbG93PSJpbXBsaWNpdCIsaS5hdXRob3JpemF0aW9uVXJsPWMubG9naW5FbmRwb2ludCxyPSEwfWlmKG8uZ3JhbnRUeXBlcy5hdXRob3JpemF0aW9uX2NvZGUmJiFpLmZsb3cpe3ZhciBwPW8uZ3JhbnRUeXBlcy5hdXRob3JpemF0aW9uX2NvZGU7aS5mbG93PSJhY2Nlc3NDb2RlIixpLmF1dGhvcml6YXRpb25Vcmw9cC50b2tlblJlcXVlc3RFbmRwb2ludC51cmwsaS50b2tlblVybD1wLnRva2VuRW5kcG9pbnQudXJsLHI9ITB9fX1yJiYodC5zZWN1cml0eURlZmluaXRpb25zPXQuc2VjdXJpdHlEZWZpbml0aW9uc3x8e30sdC5zZWN1cml0eURlZmluaXRpb25zW25dPWkpfX19LHIucHJvdG90eXBlLmFwaUluZm89ZnVuY3Rpb24oZSx0KXtpZihlLmluZm8pe3ZhciBuPWUuaW5mbzt0LmluZm89e30sbi5jb250YWN0JiYodC5pbmZvLmNvbnRhY3Q9e30sdC5pbmZvLmNvbnRhY3QuZW1haWw9bi5jb250YWN0KSxuLmRlc2NyaXB0aW9uJiYodC5pbmZvLmRlc2NyaXB0aW9uPW4uZGVzY3JpcHRpb24pLG4udGl0bGUmJih0LmluZm8udGl0bGU9bi50aXRsZSksbi50ZXJtc09mU2VydmljZVVybCYmKHQuaW5mby50ZXJtc09mU2VydmljZT1uLnRlcm1zT2ZTZXJ2aWNlVXJsKSwobi5saWNlbnNlfHxuLmxpY2Vuc2VVcmwpJiYodC5saWNlbnNlPXt9LG4ubGljZW5zZSYmKHQubGljZW5zZS5uYW1lPW4ubGljZW5zZSksbi5saWNlbnNlVXJsJiYodC5saWNlbnNlLnVybD1uLmxpY2Vuc2VVcmwpKX1lbHNlIHRoaXMud2FybmluZ3MucHVzaCgibWlzc2luZyBpbmZvIHNlY3Rpb24iKX0sci5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUsdCl7ZSh0KX19LHsiLi9jbGllbnQiOjMsIi4vaHR0cCI6NX1dLDg6W2Z1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3ZhciBuPXtmb3JFYWNoOmUoImxvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9mb3JFYWNoIiksaW5kZXhPZjplKCJsb2Rhc2gtY29tcGF0L2FycmF5L2luZGV4T2YiKSxpc0FycmF5OmUoImxvZGFzaC1jb21wYXQvbGFuZy9pc0FycmF5IiksaXNQbGFpbk9iamVjdDplKCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNQbGFpbk9iamVjdCIpLGlzU3RyaW5nOmUoImxvZGFzaC1jb21wYXQvbGFuZy9pc1N0cmluZyIpLGlzVW5kZWZpbmVkOmUoImxvZGFzaC1jb21wYXQvbGFuZy9pc1VuZGVmaW5lZCIpLGtleXM6ZSgibG9kYXNoLWNvbXBhdC9vYmplY3Qva2V5cyIpLG1hcDplKCJsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vbWFwIil9LHI9ZSgiLi4vaGVscGVycyIpLGk9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5kZWZpbml0aW9uPXR8fHt9LHRoaXMuaXNBcnJheT0iYXJyYXkiPT09dC50eXBlLHRoaXMubW9kZWxzPW58fHt9LHRoaXMubmFtZT1lfHwiSW5saW5lIE1vZGVsIix0aGlzfSxvPWZ1bmN0aW9uKGUsdCxvKXtmb3IodmFyIGE9JzxzcGFuIGNsYXNzPSJzdHJvbmciPicscz0iPC9zcGFuPiIsbD17fSx1PVtdLGM9MCxwPWZ1bmN0aW9uKGUsdCxhKXt2YXIgcyx1PXQ7cmV0dXJuIGUuJHJlZj8odT1yLnNpbXBsZVJlZihlLiRyZWYpLHM9b1t1XSk6bi5pc1VuZGVmaW5lZCh0KSYmKHU9IklubGluZSBNb2RlbCAiKyArK2Mscz1uZXcgaSh1LGUsbykpLGEhPT0hMCYmKGxbdV09bi5pc1VuZGVmaW5lZChzKT97fTpzLmRlZmluaXRpb24pLHV9LGg9ZnVuY3Rpb24oZSl7dmFyIHQ9JzxzcGFuIGNsYXNzPSJwcm9wVHlwZSI+JyxpPWUudHlwZXx8Im9iamVjdCI7cmV0dXJuIGUuJHJlZj90Kz1wKGUsci5zaW1wbGVSZWYoZS4kcmVmKSk6Im9iamVjdCI9PT1pP3QrPW4uaXNVbmRlZmluZWQoZS5wcm9wZXJ0aWVzKT8ib2JqZWN0IjpwKGUpOiJhcnJheSI9PT1pPyh0Kz0iQXJyYXlbIixuLmlzQXJyYXkoZS5pdGVtcyk/dCs9bi5tYXAoZS5pdGVtcyxwKS5qb2luKCIsIik6bi5pc1BsYWluT2JqZWN0KGUuaXRlbXMpP3QrPW4uaXNVbmRlZmluZWQoZS5pdGVtcy4kcmVmKT9uLmlzVW5kZWZpbmVkKGUuaXRlbXMudHlwZSl8fC0xIT09bi5pbmRleE9mKFsiYXJyYXkiLCJvYmplY3QiXSxlLml0ZW1zLnR5cGUpP3AoZS5pdGVtcyk6ZS5pdGVtcy50eXBlOnAoZS5pdGVtcyxyLnNpbXBsZVJlZihlLml0ZW1zLiRyZWYpKTooci5sb2coIkFycmF5IHR5cGUncyAnaXRlbXMnIHNjaGVtYSBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjYW5ub3QgcHJvY2VzcyIpLHQrPSJvYmplY3QiKSx0Kz0iXSIpOnQrPWUudHlwZSx0Kz0iPC9zcGFuPiJ9LGY9ZnVuY3Rpb24oZSx0KXt2YXIgaT0iIixvPWUudHlwZXx8Im9iamVjdCIsYT0iYXJyYXkiPT09bztzd2l0Y2goYSYmKG89bi5pc1BsYWluT2JqZWN0KGUuaXRlbXMpJiYhbi5pc1VuZGVmaW5lZChlLml0ZW1zLnR5cGUpP2UuaXRlbXMudHlwZToib2JqZWN0IiksZVsiZGVmYXVsdCJdJiYoaSs9ci5vcHRpb25IdG1sKCJEZWZhdWx0IixlWyJkZWZhdWx0Il0pKSxvKXtjYXNlInN0cmluZyI6ZS5taW5MZW5ndGgmJihpKz1yLm9wdGlvbkh0bWwoIk1pbi4gTGVuZ3RoIixlLm1pbkxlbmd0aCkpLGUubWF4TGVuZ3RoJiYoaSs9ci5vcHRpb25IdG1sKCJNYXguIExlbmd0aCIsZS5tYXhMZW5ndGgpKSxlLnBhdHRlcm4mJihpKz1yLm9wdGlvbkh0bWwoIlJlZy4gRXhwLiIsZS5wYXR0ZXJuKSk7YnJlYWs7Y2FzZSJpbnRlZ2VyIjpjYXNlIm51bWJlciI6ZS5taW5pbXVtJiYoaSs9ci5vcHRpb25IdG1sKCJNaW4uIFZhbHVlIixlLm1pbmltdW0pKSxlLmV4Y2x1c2l2ZU1pbmltdW0mJihpKz1yLm9wdGlvbkh0bWwoIkV4Y2x1c2l2ZSBNaW4uIiwidHJ1ZSIpKSxlLm1heGltdW0mJihpKz1yLm9wdGlvbkh0bWwoIk1heC4gVmFsdWUiLGUubWF4aW11bSkpLGUuZXhjbHVzaXZlTWF4aW11bSYmKGkrPXIub3B0aW9uSHRtbCgiRXhjbHVzaXZlIE1heC4iLCJ0cnVlIikpLGUubXVsdGlwbGVPZiYmKGkrPXIub3B0aW9uSHRtbCgiTXVsdGlwbGUgT2YiLGUubXVsdGlwbGVPZikpfWlmKGEmJihlLm1pbkl0ZW1zJiYoaSs9ci5vcHRpb25IdG1sKCJNaW4uIEl0ZW1zIixlLm1pbkl0ZW1zKSksZS5tYXhJdGVtcyYmKGkrPXIub3B0aW9uSHRtbCgiTWF4LiBJdGVtcyIsZS5tYXhJdGVtcykpLGUudW5pcXVlSXRlbXMmJihpKz1yLm9wdGlvbkh0bWwoIlVuaXF1ZSBJdGVtcyIsInRydWUiKSksZS5jb2xsZWN0aW9uRm9ybWF0JiYoaSs9ci5vcHRpb25IdG1sKCJDb2xsLiBGb3JtYXQiLGUuY29sbGVjdGlvbkZvcm1hdCkpKSxuLmlzVW5kZWZpbmVkKGUuaXRlbXMpJiZuLmlzQXJyYXkoZVsiZW51bSJdKSl7dmFyIHM7cz0ibnVtYmVyIj09PW98fCJpbnRlZ2VyIj09PW8/ZVsiZW51bSJdLmpvaW4oIiwgIik6JyInK2VbImVudW0iXS5qb2luKCciLCAiJykrJyInLGkrPXIub3B0aW9uSHRtbCgiRW51bSIscyl9cmV0dXJuIGkubGVuZ3RoPjAmJih0PSc8c3BhbiBjbGFzcz0icHJvcFdyYXAiPicrdCsnPHRhYmxlIGNsYXNzPSJvcHRpb25zV3JhcHBlciI+PHRyPjx0aCBjb2xzcGFuPSIyIj4nK28rIjwvdGg+PC90cj4iK2krIjwvdGFibGU+PC9zcGFuPiIpLHR9LGQ9ZnVuY3Rpb24oZSx0KXt2YXIgaT1lLnR5cGV8fCJvYmplY3QiLG89ImFycmF5Ij09PWUudHlwZSxsPWErdCsiICIrKG8/IlsiOiJ7IikrcztyZXR1cm4gdCYmdS5wdXNoKHQpLG8/bi5pc0FycmF5KGUuaXRlbXMpP2wrPSI8ZGl2PiIrbi5tYXAoZS5pdGVtcyxmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGV8fCJvYmplY3QiO3JldHVybiBuLmlzVW5kZWZpbmVkKGUuJHJlZik/bi5pbmRleE9mKFsiYXJyYXkiLCJvYmplY3QiXSx0KT4tMT8ib2JqZWN0Ij09PXQmJm4uaXNVbmRlZmluZWQoZS5wcm9wZXJ0aWVzKT8ib2JqZWN0IjpwKGUpOmYoZSx0KTpwKGUsci5zaW1wbGVSZWYoZS4kcmVmKSl9KS5qb2luKCIsPC9kaXY+PGRpdj4iKTpuLmlzUGxhaW5PYmplY3QoZS5pdGVtcyk/bCs9bi5pc1VuZGVmaW5lZChlLml0ZW1zLiRyZWYpP24uaW5kZXhPZihbImFycmF5Iiwib2JqZWN0Il0sZS5pdGVtcy50eXBlfHwib2JqZWN0Iik+LTE/KG4uaXNVbmRlZmluZWQoZS5pdGVtcy50eXBlKXx8Im9iamVjdCI9PT1lLml0ZW1zLnR5cGUpJiZuLmlzVW5kZWZpbmVkKGUuaXRlbXMucHJvcGVydGllcyk/IjxkaXY+b2JqZWN0PC9kaXY+IjoiPGRpdj4iK3AoZS5pdGVtcykrIjwvZGl2PiI6IjxkaXY+IitmKGUuaXRlbXMsZS5pdGVtcy50eXBlKSsiPC9kaXY+IjoiPGRpdj4iK3AoZS5pdGVtcyxyLnNpbXBsZVJlZihlLml0ZW1zLiRyZWYpKSsiPC9kaXY+Ijooci5sb2coIkFycmF5IHR5cGUncyAnaXRlbXMnIHByb3BlcnR5IGlzIG5vdCBhbiBhcnJheSBvciBhbiBvYmplY3QsIGNhbm5vdCBwcm9jZXNzIiksbCs9IjxkaXY+b2JqZWN0PC9kaXY+Iik6ZS4kcmVmP2wrPSI8ZGl2PiIrcChlLHQpKyI8L2Rpdj4iOiJvYmplY3QiPT09aT8obCs9IjxkaXY+IixuLmlzUGxhaW5PYmplY3QoZS5wcm9wZXJ0aWVzKSYmKGwrPW4ubWFwKGUucHJvcGVydGllcyxmdW5jdGlvbih0LHIpe3ZhciBpPW4uaW5kZXhPZihlLnJlcXVpcmVkfHxbXSxyKT4tMSxvPSc8c3BhbiBjbGFzcz0icHJvcE5hbWUgJytpKyciPicrcisiPC9zcGFuPiAoIjsKK3JldHVybiBvKz1oKHQpLGl8fChvKz0nLCA8c3BhbiBjbGFzcz0icHJvcE9wdEtleSI+b3B0aW9uYWw8L3NwYW4+Jyksbys9IikiLG4uaXNVbmRlZmluZWQodC5kZXNjcmlwdGlvbil8fChvKz0iOiAiK3QuZGVzY3JpcHRpb24pLHRbImVudW0iXSYmKG8rPScgPSA8c3BhbiBjbGFzcz0icHJvcFZhbHMiPltcJycrdFsiZW51bSJdLmpvaW4oIicgb3IgJyIpKyInXTwvc3Bhbj4iKSxmKHQsbyl9KS5qb2luKCIsPC9kaXY+PGRpdj4iKSksbCs9IjwvZGl2PiIpOmw9IjxkaXY+IitmKGUsaSkrIjwvZGl2PiIsbCthKyhvPyJdIjoifSIpK3N9LG09ZCh0LGUpO24ua2V5cyhsKS5sZW5ndGg+MDspbi5mb3JFYWNoKGwsZnVuY3Rpb24oZSx0KXt2YXIgcj1uLmluZGV4T2YodSx0KT4tMTtkZWxldGUgbFt0XSxyfHwodS5wdXNoKHQpLG0rPSI8YnIgLz4iK2QoZSx0KSl9KTtyZXR1cm4gbX0sYT1mdW5jdGlvbihlLHQsaSl7dmFyIG8scyxsPWUudHlwZXx8Im9iamVjdCI7cmV0dXJuIGUuZXhhbXBsZT9zPWUuZXhhbXBsZTpuLmlzVW5kZWZpbmVkKGUuaXRlbXMpJiZuLmlzQXJyYXkoZVsiZW51bSJdKSYmKHM9ZVsiZW51bSJdWzBdKSxuLmlzVW5kZWZpbmVkKHMpJiYoZS4kcmVmPyhvPXRbci5zaW1wbGVSZWYoZS4kcmVmKV0sbi5pc1VuZGVmaW5lZChvKXx8KG4uaXNVbmRlZmluZWQoaVtvLm5hbWVdKT8oaVtvLm5hbWVdPW8scz1hKG8uZGVmaW5pdGlvbix0LGkpLGRlbGV0ZSBpW28ubmFtZV0pOnM9ImFycmF5Ij09PW8udHlwZT9bXTp7fSkpOmVbImRlZmF1bHQiXT9zPWVbImRlZmF1bHQiXToiZGF0ZS10aW1lIj09PWw/cz0obmV3IERhdGUpLnRvSVNPU3RyaW5nKCk6ImRhdGUiPT09bD9zPShuZXcgRGF0ZSkudG9JU09TdHJpbmcoKS5zcGxpdCgiVCIpWzBdOiJzdHJpbmciPT09bD9zPSJzdHJpbmciOiJpbnRlZ2VyIj09PWw/cz0wOiJsb25nIj09PWw/cz0wOiJmbG9hdCI9PT1sP3M9MDoiZG91YmxlIj09PWw/cz0wOiJib29sZWFuIj09PWw/cz0hMDoib2JqZWN0Ij09PWw/KHM9e30sbi5mb3JFYWNoKGUucHJvcGVydGllcyxmdW5jdGlvbihlLG4pe3Nbbl09YShlLHQsaSl9KSk6ImFycmF5Ij09PWwmJihzPVtdLG4uaXNBcnJheShlLml0ZW1zKT9uLmZvckVhY2goZS5pdGVtcyxmdW5jdGlvbihlKXtzLnB1c2goYShlLHQsaSkpfSk6bi5pc1BsYWluT2JqZWN0KGUuaXRlbXMpP3MucHVzaChhKGUuaXRlbXMsdCxpKSk6bi5pc1VuZGVmaW5lZChlLml0ZW1zKT9zLnB1c2goe30pOnIubG9nKCJBcnJheSB0eXBlJ3MgJ2l0ZW1zJyBwcm9wZXJ0eSBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjYW5ub3QgcHJvY2VzcyIpKSksc307aS5wcm90b3R5cGUuY3JlYXRlSlNPTlNhbXBsZT1pLnByb3RvdHlwZS5nZXRTYW1wbGVWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gZT1lfHx7fSxlW3RoaXMubmFtZV09dGhpcyx0aGlzLmV4YW1wbGVzJiZuLmlzUGxhaW5PYmplY3QodGhpcy5leGFtcGxlcykmJnRoaXMuZXhhbXBsZXNbImFwcGxpY2F0aW9uL2pzb24iXT8odGhpcy5kZWZpbml0aW9uLmV4YW1wbGU9dGhpcy5leGFtcGxlc1siYXBwbGljYXRpb24vanNvbiJdLG4uaXNTdHJpbmcodGhpcy5kZWZpbml0aW9uLmV4YW1wbGUpJiYodGhpcy5kZWZpbml0aW9uLmV4YW1wbGU9SlNPTi5wYXJzZSh0aGlzLmRlZmluaXRpb24uZXhhbXBsZSkpKTp0aGlzLmRlZmluaXRpb24uZXhhbXBsZT10aGlzLmV4YW1wbGVzLGEodGhpcy5kZWZpbml0aW9uLHRoaXMubW9kZWxzLGUpfSxpLnByb3RvdHlwZS5nZXRNb2NrU2lnbmF0dXJlPWZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcy5uYW1lLHRoaXMuZGVmaW5pdGlvbix0aGlzLm1vZGVscyl9fSx7Ii4uL2hlbHBlcnMiOjQsImxvZGFzaC1jb21wYXQvYXJyYXkvaW5kZXhPZiI6MTksImxvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9mb3JFYWNoIjoyMiwibG9kYXNoLWNvbXBhdC9jb2xsZWN0aW9uL21hcCI6MjMsImxvZGFzaC1jb21wYXQvbGFuZy9pc0FycmF5Ijo5NiwibG9kYXNoLWNvbXBhdC9sYW5nL2lzUGxhaW5PYmplY3QiOjEwMCwibG9kYXNoLWNvbXBhdC9sYW5nL2lzU3RyaW5nIjoxMDEsImxvZGFzaC1jb21wYXQvbGFuZy9pc1VuZGVmaW5lZCI6MTAzLCJsb2Rhc2gtY29tcGF0L29iamVjdC9rZXlzIjoxMDR9XSw5OltmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj17aXNVbmRlZmluZWQ6ZSgibG9kYXNoLWNvbXBhdC9sYW5nL2lzVW5kZWZpbmVkIil9LHI9ZSgiLi4vaGVscGVycyIpLGk9ZSgiLi9tb2RlbCIpLG89ZSgiLi4vaHR0cCIpLGE9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsbyxhLHMsbCx1KXt2YXIgYz1bXTtpZihlPWV8fHt9LGE9YXx8e30sdGhpcy5hdXRob3JpemF0aW9ucz1hLnNlY3VyaXR5LHRoaXMuYmFzZVBhdGg9ZS5iYXNlUGF0aHx8Ii8iLHRoaXMuY2xpZW50QXV0aG9yaXphdGlvbnM9dSx0aGlzLmNvbnN1bWVzPWEuY29uc3VtZXMsdGhpcy5kZXByZWNhdGVkPWEuZGVwcmVjYXRlZCx0aGlzLmRlc2NyaXB0aW9uPWEuZGVzY3JpcHRpb24sdGhpcy5ob3N0PWUuaG9zdHx8ImxvY2FsaG9zdCIsdGhpcy5tZXRob2Q9cnx8Yy5wdXNoKCJPcGVyYXRpb24gIituKyIgaXMgbWlzc2luZyBtZXRob2QuIiksdGhpcy5tb2RlbHM9bHx8e30sdGhpcy5uaWNrbmFtZT1ufHxjLnB1c2goIk9wZXJhdGlvbnMgbXVzdCBoYXZlIGEgbmlja25hbWUuIiksdGhpcy5vcGVyYXRpb249YSx0aGlzLm9wZXJhdGlvbnM9e30sdGhpcy5wYXJhbWV0ZXJzPW51bGwhPT1hP2EucGFyYW1ldGVyc3x8W106e30sdGhpcy5wYXJlbnQ9ZSx0aGlzLnBhdGg9b3x8Yy5wdXNoKCJPcGVyYXRpb24gIit0aGlzLm5pY2tuYW1lKyIgaXMgbWlzc2luZyBwYXRoLiIpLHRoaXMucHJvZHVjZXM9YS5wcm9kdWNlcyx0aGlzLnJlc3BvbnNlcz1hLnJlc3BvbnNlc3x8e30sdGhpcy5zY2hlbWU9dHx8ZS5zY2hlbWV8fCJodHRwIix0aGlzLnNjaGVtZXM9ZS5zY2hlbWVzLHRoaXMuc2VjdXJpdHk9YS5zZWN1cml0eSx0aGlzLnN1bW1hcnk9YS5zdW1tYXJ5fHwiIix0aGlzLnR5cGU9bnVsbCx0aGlzLnVzZUpRdWVyeT1lLnVzZUpRdWVyeSwic3RyaW5nIj09dHlwZW9mIHRoaXMuZGVwcmVjYXRlZClzd2l0Y2godGhpcy5kZXByZWNhdGVkLnRvTG93ZXJDYXNlKCkpe2Nhc2UidHJ1ZSI6Y2FzZSJ5ZXMiOmNhc2UiMSI6dGhpcy5kZXByZWNhdGVkPSEwO2JyZWFrO2Nhc2UiZmFsc2UiOmNhc2Uibm8iOmNhc2UiMCI6Y2FzZSBudWxsOnRoaXMuZGVwcmVjYXRlZD0hMTticmVhaztkZWZhdWx0OnRoaXMuZGVwcmVjYXRlZD1Cb29sZWFuKHRoaXMuZGVwcmVjYXRlZCl9dmFyIHAsaDtpZihzKXt2YXIgZjtmb3IoZiBpbiB0aGlzLmRlZmluaXRpb25zKWg9bmV3IGkoZixzW2ZdLHRoaXMubW9kZWxzKSxoJiYodGhpcy5tb2RlbHNbZl09aCl9Zm9yKHA9MDtwPHRoaXMucGFyYW1ldGVycy5sZW5ndGg7cCsrKXt2YXIgZD10aGlzLnBhcmFtZXRlcnNbcF07ImFycmF5Ij09PWQudHlwZSYmKGQuaXNMaXN0PSEwLGQuYWxsb3dNdWx0aXBsZT0hMCk7dmFyIG09dGhpcy5nZXRUeXBlKGQpO2lmKG0mJiJib29sZWFuIj09PW0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpJiYoZC5hbGxvd2FibGVWYWx1ZXM9e30sZC5pc0xpc3Q9ITAsZFsiZW51bSJdPVsidHJ1ZSIsImZhbHNlIl0pLCJ1bmRlZmluZWQiIT10eXBlb2YgZFsiZW51bSJdKXt2YXIgZztmb3IoZC5hbGxvd2FibGVWYWx1ZXM9e30sZC5hbGxvd2FibGVWYWx1ZXMudmFsdWVzPVtdLGQuYWxsb3dhYmxlVmFsdWVzLmRlc2NyaXB0aXZlVmFsdWVzPVtdLGc9MDtnPGRbImVudW0iXS5sZW5ndGg7ZysrKXt2YXIgeT1kWyJlbnVtIl1bZ10sdj15PT09ZFsiZGVmYXVsdCJdPyEwOiExO2QuYWxsb3dhYmxlVmFsdWVzLnZhbHVlcy5wdXNoKHkpLGQuYWxsb3dhYmxlVmFsdWVzLmRlc2NyaXB0aXZlVmFsdWVzLnB1c2goe3ZhbHVlOnksaXNEZWZhdWx0OnZ9KX19ImFycmF5Ij09PWQudHlwZSYmKG09W21dLCJ1bmRlZmluZWQiPT10eXBlb2YgZC5hbGxvd2FibGVWYWx1ZXMmJihkZWxldGUgZC5pc0xpc3QsZGVsZXRlIGQuYWxsb3dNdWx0aXBsZSkpLGQuc2lnbmF0dXJlPXRoaXMuZ2V0TW9kZWxTaWduYXR1cmUobSx0aGlzLm1vZGVscykudG9TdHJpbmcoKSxkLnNhbXBsZUpTT049dGhpcy5nZXRNb2RlbFNhbXBsZUpTT04obSx0aGlzLm1vZGVscyksZC5yZXNwb25zZUNsYXNzU2lnbmF0dXJlPWQuc2lnbmF0dXJlfXZhciBiLHcseD10aGlzLnJlc3BvbnNlcztpZih4WzIwMF0/KHc9eFsyMDBdLGI9IjIwMCIpOnhbMjAxXT8odz14WzIwMV0sYj0iMjAxIik6eFsyMDJdPyh3PXhbMjAyXSxiPSIyMDIiKTp4WzIwM10/KHc9eFsyMDNdLGI9IjIwMyIpOnhbMjA0XT8odz14WzIwNF0sYj0iMjA0Iik6eFsyMDVdPyh3PXhbMjA1XSxiPSIyMDUiKTp4WzIwNl0/KHc9eFsyMDZdLGI9IjIwNiIpOnhbImRlZmF1bHQiXSYmKHc9eFsiZGVmYXVsdCJdLGI9ImRlZmF1bHQiKSx3JiZ3LnNjaGVtYSl7dmFyIEEsRT10aGlzLnJlc29sdmVNb2RlbCh3LnNjaGVtYSxzKTtkZWxldGUgeFtiXSxFPyh0aGlzLnN1Y2Nlc3NSZXNwb25zZT17fSxBPXRoaXMuc3VjY2Vzc1Jlc3BvbnNlW2JdPUUpOncuc2NoZW1hLnR5cGUmJiJvYmplY3QiIT09dy5zY2hlbWEudHlwZSYmImFycmF5IiE9PXcuc2NoZW1hLnR5cGU/KHRoaXMuc3VjY2Vzc1Jlc3BvbnNlPXt9LEE9dGhpcy5zdWNjZXNzUmVzcG9uc2VbYl09dy5zY2hlbWEpOih0aGlzLnN1Y2Nlc3NSZXNwb25zZT17fSxBPXRoaXMuc3VjY2Vzc1Jlc3BvbnNlW2JdPW5ldyBpKHZvaWQgMCx3LnNjaGVtYXx8e30sdGhpcy5tb2RlbHMpKSxBJiYody5kZXNjcmlwdGlvbiYmKEEuZGVzY3JpcHRpb249dy5kZXNjcmlwdGlvbiksdy5leGFtcGxlcyYmKEEuZXhhbXBsZXM9dy5leGFtcGxlcyksdy5oZWFkZXJzJiYoQS5oZWFkZXJzPXcuaGVhZGVycykpLHRoaXMudHlwZT13fXJldHVybiBjLmxlbmd0aD4wJiZ0aGlzLnJlc291cmNlJiZ0aGlzLnJlc291cmNlLmFwaSYmdGhpcy5yZXNvdXJjZS5hcGkuZmFpbCYmdGhpcy5yZXNvdXJjZS5hcGkuZmFpbChjKSx0aGlzfTthLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS50eXBlLGk9ZS5mb3JtYXQsbz0hMTsiaW50ZWdlciI9PT1uJiYiaW50MzIiPT09aT90PSJpbnRlZ2VyIjoiaW50ZWdlciI9PT1uJiYiaW50NjQiPT09aT90PSJsb25nIjoiaW50ZWdlciI9PT1uP3Q9ImludGVnZXIiOiJzdHJpbmciPT09bj90PSJkYXRlLXRpbWUiPT09aT8iZGF0ZS10aW1lIjoiZGF0ZSI9PT1pPyJkYXRlIjoic3RyaW5nIjoibnVtYmVyIj09PW4mJiJmbG9hdCI9PT1pP3Q9ImZsb2F0IjoibnVtYmVyIj09PW4mJiJkb3VibGUiPT09aT90PSJkb3VibGUiOiJudW1iZXIiPT09bj90PSJkb3VibGUiOiJib29sZWFuIj09PW4/dD0iYm9vbGVhbiI6ImFycmF5Ij09PW4mJihvPSEwLGUuaXRlbXMmJih0PXRoaXMuZ2V0VHlwZShlLml0ZW1zKSkpLGUuJHJlZiYmKHQ9ZS4kcmVmKTt2YXIgYT1lLnNjaGVtYTtpZihhKXt2YXIgcz1hLiRyZWY7cmV0dXJuIHM/KHM9ci5zaW1wbGVSZWYocyksbz9bc106cyk6dGhpcy5nZXRUeXBlKGEpfXJldHVybiBvP1t0XTp0fSxhLnByb3RvdHlwZS5yZXNvbHZlTW9kZWw9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuJHJlZil7dmFyIHI9ZS4kcmVmO2lmKDA9PT1yLmluZGV4T2YoIiMvZGVmaW5pdGlvbnMvIikmJihyPXIuc3Vic3RyaW5nKCIjL2RlZmluaXRpb25zLyIubGVuZ3RoKSksdFtyXSlyZXR1cm4gbmV3IGkocix0W3JdLHRoaXMubW9kZWxzKX1lbHNlIGlmKCJvYmplY3QiPT09ZS50eXBlfHxuLmlzVW5kZWZpbmVkKGUudHlwZSkpcmV0dXJuIG5ldyBpKHZvaWQgMCxlLHRoaXMubW9kZWxzKTtyZXR1cm4gbnVsbH0sYS5wcm90b3R5cGUuaGVscD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5uaWNrbmFtZSsiOiAiK3RoaXMuc3VtbWFyeSsiXG4iLG49MDtuPHRoaXMucGFyYW1ldGVycy5sZW5ndGg7bisrKXt2YXIgaT10aGlzLnBhcmFtZXRlcnNbbl0sbz1pLnNpZ25hdHVyZTt0Kz0iXG4gICogIitpLm5hbWUrIiAoIitvKyIpOiAiK2kuZGVzY3JpcHRpb259cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBlJiZyLmxvZyh0KSx0fSxhLnByb3RvdHlwZS5nZXRNb2RlbFNpZ25hdHVyZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT8ocj0hMCxlPWVbMF0pOiJ1bmRlZmluZWQiPT10eXBlb2YgZSYmKGU9InVuZGVmaW5lZCIpLG49InN0cmluZyI9PT1lPyEwOnImJnRbcl18fHRbZV0/ITE6ITAsbj9yPyJBcnJheVsiK2UrIl0iOmUudG9TdHJpbmcoKTpyPyJBcnJheVsiK3RbZV0uZ2V0TW9ja1NpZ25hdHVyZSgpKyJdIjp0W2VdLmdldE1vY2tTaWduYXR1cmUoKX0sYS5wcm90b3R5cGUuc3VwcG9ydEhlYWRlclBhcmFtcz1mdW5jdGlvbigpe3JldHVybiEwfSxhLnByb3RvdHlwZS5zdXBwb3J0ZWRTdWJtaXRNZXRob2RzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50LnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHN9LGEucHJvdG90eXBlLmdldEhlYWRlclBhcmFtcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5zZXRDb250ZW50VHlwZXMoZSx7fSksbj0wO248dGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDtuKyspe3ZhciByPXRoaXMucGFyYW1ldGVyc1tuXTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGVbci5uYW1lXSYmImhlYWRlciI9PT1yWyJpbiJdKXt2YXIgaT1lW3IubmFtZV07QXJyYXkuaXNBcnJheShpKSYmKGk9aS50b1N0cmluZygpKSx0W3IubmFtZV09aX19cmV0dXJuIHR9LGEucHJvdG90eXBlLnVybGlmeT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9e30sbj10aGlzLnBhdGgscj0iIixpPTA7aTx0aGlzLnBhcmFtZXRlcnMubGVuZ3RoO2krKyl7dmFyIG89dGhpcy5wYXJhbWV0ZXJzW2ldO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZVtvLm5hbWVdKWlmKCJwYXRoIj09PW9bImluIl0pe3ZhciBhPW5ldyBSZWdFeHAoInsiK28ubmFtZSsifSIsImdpIikscz1lW28ubmFtZV07cz1BcnJheS5pc0FycmF5KHMpP3RoaXMuZW5jb2RlUGF0aENvbGxlY3Rpb24oby5jb2xsZWN0aW9uRm9ybWF0LG8ubmFtZSxzKTp0aGlzLmVuY29kZVBhdGhQYXJhbShzKSxuPW4ucmVwbGFjZShhLHMpfWVsc2UgaWYoInF1ZXJ5Ij09PW9bImluIl0mJiJ1bmRlZmluZWQiIT10eXBlb2YgZVtvLm5hbWVdKWlmKHIrPSIiPT09cj8iPyI6IiYiLCJ1bmRlZmluZWQiIT10eXBlb2Ygby5jb2xsZWN0aW9uRm9ybWF0KXt2YXIgbD1lW28ubmFtZV07cis9QXJyYXkuaXNBcnJheShsKT90aGlzLmVuY29kZVF1ZXJ5Q29sbGVjdGlvbihvLmNvbGxlY3Rpb25Gb3JtYXQsby5uYW1lLGwpOnRoaXMuZW5jb2RlUXVlcnlQYXJhbShvLm5hbWUpKyI9Iit0aGlzLmVuY29kZVF1ZXJ5UGFyYW0oZVtvLm5hbWVdKX1lbHNlIHIrPXRoaXMuZW5jb2RlUXVlcnlQYXJhbShvLm5hbWUpKyI9Iit0aGlzLmVuY29kZVF1ZXJ5UGFyYW0oZVtvLm5hbWVdKTtlbHNlImZvcm1EYXRhIj09PW9bImluIl0mJih0W28ubmFtZV09ZVtvLm5hbWVdKX12YXIgdT10aGlzLnNjaGVtZSsiOi8vIit0aGlzLmhvc3Q7cmV0dXJuIi8iIT09dGhpcy5iYXNlUGF0aCYmKHUrPXRoaXMuYmFzZVBhdGgpLHUrbityfSxhLnByb3RvdHlwZS5nZXRNaXNzaW5nUGFyYW1zPWZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKHQ9MDt0PHRoaXMucGFyYW1ldGVycy5sZW5ndGg7dCsrKXt2YXIgcj10aGlzLnBhcmFtZXRlcnNbdF07ci5yZXF1aXJlZD09PSEwJiYidW5kZWZpbmVkIj09dHlwZW9mIGVbci5uYW1lXSYmKG49ci5uYW1lKX1yZXR1cm4gbn0sYS5wcm90b3R5cGUuZ2V0Qm9keT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLGksbyxhPXt9LHM9MDtzPHRoaXMucGFyYW1ldGVycy5sZW5ndGg7cysrKXt2YXIgbD10aGlzLnBhcmFtZXRlcnNbc107InVuZGVmaW5lZCIhPXR5cGVvZiB0W2wubmFtZV0mJigiYm9keSI9PT1sWyJpbiJdP3I9dFtsLm5hbWVdOiJmb3JtRGF0YSI9PT1sWyJpbiJdJiYoYVtsLm5hbWVdPXRbbC5uYW1lXSkpfWlmKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiPT09ZVsiQ29udGVudC1UeXBlIl0pe3ZhciB1PSIiO2ZvcihpIGluIGEpbz1hW2ldLCJ1bmRlZmluZWQiIT10eXBlb2YgbyYmKCIiIT09dSYmKHUrPSImIiksdSs9ZW5jb2RlVVJJQ29tcG9uZW50KGkpKyI9IitlbmNvZGVVUklDb21wb25lbnQobykpO3I9dX1lbHNlIGlmKGVbIkNvbnRlbnQtVHlwZSJdJiZlWyJDb250ZW50LVR5cGUiXS5pbmRleE9mKCJtdWx0aXBhcnQvZm9ybS1kYXRhIik+PTAmJm4udXNlSlF1ZXJ5KXt2YXIgYz1uZXcgRm9ybURhdGE7Yy50eXBlPSJmb3JtRGF0YSI7Zm9yKGkgaW4gYSlvPXRbaV0sInVuZGVmaW5lZCIhPXR5cGVvZiBvJiYoImZpbGUiPT09by50eXBlJiZvLnZhbHVlPyhkZWxldGUgZVsiQ29udGVudC1UeXBlIl0sYy5hcHBlbmQoaSxvLnZhbHVlKSk6Yy5hcHBlbmQoaSxvKSk7cj1jfXJldHVybiByfSxhLnByb3RvdHlwZS5nZXRNb2RlbFNhbXBsZUpTT049ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYocj1lIGluc3RhbmNlb2YgQXJyYXksbj10W2VdPyExOiEwLGk9bj92b2lkIDA6dFtlXS5jcmVhdGVKU09OU2FtcGxlKCkpe2lmKGk9cj9baV06aSwic3RyaW5nIj09dHlwZW9mIGkpcmV0dXJuIGk7aWYoIm9iamVjdCI9PXR5cGVvZiBpKXt2YXIgbz1pO2lmKGkgaW5zdGFuY2VvZiBBcnJheSYmaS5sZW5ndGg+MCYmKG89aVswXSksby5ub2RlTmFtZSl7dmFyIGE9KG5ldyBYTUxTZXJpYWxpemVyKS5zZXJpYWxpemVUb1N0cmluZyhvKTtyZXR1cm4gdGhpcy5mb3JtYXRYbWwoYSl9cmV0dXJuIEpTT04uc3RyaW5naWZ5KGksbnVsbCwyKX1yZXR1cm4gaX19LGEucHJvdG90eXBlWyJkbyJdPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIHRoaXMuZXhlY3V0ZShlLHQsbixyLGkpfSxhLnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKGUsdCxuLGksYSl7dmFyIHMsbCx1PWV8fHt9LGM9e307Im9iamVjdCI9PXR5cGVvZiB0JiYoYz10LHM9bixsPWkpLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYocz10LGw9bikscz1zfHxyLmxvZyxsPWx8fHIubG9nLGMudXNlSlF1ZXJ5JiYodGhpcy51c2VKUXVlcnk9Yy51c2VKUXVlcnkpO3ZhciBwPXRoaXMuZ2V0TWlzc2luZ1BhcmFtcyh1KTtpZihwLmxlbmd0aD4wKXt2YXIgaD0ibWlzc2luZyByZXF1aXJlZCBwYXJhbXM6ICIrcDtyZXR1cm4gdm9pZCByLmZhaWwoaCl9dmFyIGYsZD10aGlzLmdldEhlYWRlclBhcmFtcyh1KSxtPXRoaXMuc2V0Q29udGVudFR5cGVzKHUsYyksZz17fTtmb3IoZiBpbiBkKWdbZl09ZFtmXTtmb3IoZiBpbiBtKWdbZl09bVtmXTt2YXIgeT10aGlzLmdldEJvZHkoZyx1LGMpLHY9dGhpcy51cmxpZnkodSk7aWYodi5pbmRleE9mKCIue2Zvcm1hdH0iKT4wJiZnKXt2YXIgYj1nLkFjY2VwdHx8Zy5hY2NlcHQ7YiYmYi5pbmRleE9mKCJqc29uIik+MD92PXYucmVwbGFjZSgiLntmb3JtYXR9IiwiLmpzb24iKTpiJiZiLmluZGV4T2YoInhtbCIpPjAmJih2PXYucmVwbGFjZSgiLntmb3JtYXR9IiwiLnhtbCIpKX12YXIgdz17dXJsOnYsbWV0aG9kOnRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCksYm9keTp5LHVzZUpRdWVyeTp0aGlzLnVzZUpRdWVyeSxoZWFkZXJzOmcsb246e3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe3JldHVybiBzKGUsYSl9LGVycm9yOmZ1bmN0aW9uKGUpe3JldHVybiBsKGUsYSl9fX07cmV0dXJuIHRoaXMuY2xpZW50QXV0aG9yaXphdGlvbnMuYXBwbHkodyx0aGlzLm9wZXJhdGlvbi5zZWN1cml0eSksYy5tb2NrPT09ITA/dzp2b2lkKG5ldyBvKS5leGVjdXRlKHcsYyl9LGEucHJvdG90eXBlLnNldENvbnRlbnRUeXBlcz1mdW5jdGlvbihlLHQpe3ZhciBuLGksbz0iYXBwbGljYXRpb24vanNvbiIsYT10aGlzLnBhcmFtZXRlcnMscz1lLnBhcmFtZXRlckNvbnRlbnRUeXBlfHwiYXBwbGljYXRpb24vanNvbiIsbD1bXSx1PVtdLGM9e307Zm9yKGk9MDtpPGEubGVuZ3RoO2krKyl7dmFyIHA9YVtpXTtpZigiZm9ybURhdGEiPT09cFsiaW4iXSkiZmlsZSI9PT1wLnR5cGU/bC5wdXNoKHApOnUucHVzaChwKTtlbHNlIGlmKCJoZWFkZXIiPT09cFsiaW4iXSYmdCl7dmFyIGg9cC5uYW1lLGY9dFtwLm5hbWVdOyJ1bmRlZmluZWQiIT10eXBlb2YgdFtwLm5hbWVdJiYoY1toXT1mKX1lbHNlImJvZHkiPT09cFsiaW4iXSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlW3AubmFtZV0mJihuPWVbcC5uYW1lXSl9cmV0dXJuIW58fCJwb3N0IiE9PXRoaXMubWV0aG9kJiYicHV0IiE9PXRoaXMubWV0aG9kJiYicGF0Y2giIT09dGhpcy5tZXRob2QmJiJkZWxldGUiIT09dGhpcy5tZXRob2Q/dS5sZW5ndGg+MD9zPXQucmVxdWVzdENvbnRlbnRUeXBlP3QucmVxdWVzdENvbnRlbnRUeXBlOmwubGVuZ3RoPjA/Im11bHRpcGFydC9mb3JtLWRhdGEiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOiJERUxFVEUiPT09dGhpcy50eXBlP249Int9IjoiREVMRVRFIiE9PXRoaXMudHlwZSYmKHM9bnVsbCk6dC5yZXF1ZXN0Q29udGVudFR5cGUmJihzPXQucmVxdWVzdENvbnRlbnRUeXBlKSxzJiZ0aGlzLmNvbnN1bWVzJiYtMT09PXRoaXMuY29uc3VtZXMuaW5kZXhPZihzKSYmci5sb2coInNlcnZlciBkb2Vzbid0IGNvbnN1bWUgIitzKyIsIHRyeSAiK0pTT04uc3RyaW5naWZ5KHRoaXMuY29uc3VtZXMpKSxvPXQucmVzcG9uc2VDb250ZW50VHlwZT90LnJlc3BvbnNlQ29udGVudFR5cGU6ImFwcGxpY2F0aW9uL2pzb24iLG8mJnRoaXMucHJvZHVjZXMmJi0xPT09dGhpcy5wcm9kdWNlcy5pbmRleE9mKG8pJiZyLmxvZygic2VydmVyIGNhbid0IHByb2R1Y2UgIitvKSwocyYmIiIhPT1ufHwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09PXMpJiYoY1siQ29udGVudC1UeXBlIl09cyksbyYmKGMuQWNjZXB0PW8pLGN9LGEucHJvdG90eXBlLmFzQ3VybD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4ZWN1dGUoZSx7bW9jazohMH0pO3RoaXMuY2xpZW50QXV0aG9yaXphdGlvbnMuYXBwbHkodCk7dmFyIG49W107aWYobi5wdXNoKCItWCAiK3RoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCkpLHQuaGVhZGVycyl7dmFyIHI7Zm9yKHIgaW4gdC5oZWFkZXJzKW4ucHVzaCgnLS1oZWFkZXIgIicrcisiOiAiK3QuaGVhZGVyc1tyXSsnIicpfWlmKHQuYm9keSl7dmFyIGk7aT0ib2JqZWN0Ij09dHlwZW9mIHQuYm9keT9KU09OLnN0cmluZ2lmeSh0LmJvZHkpOnQuYm9keSxuLnB1c2goJy1kICInK2kucmVwbGFjZSgvIi9nLCdcXCInKSsnIicpfXJldHVybiJjdXJsICIrbi5qb2luKCIgIikrJyAiJyt0LnVybCsnIid9LGEucHJvdG90eXBlLmVuY29kZVBhdGhDb2xsZWN0aW9uPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPSIiLG89IiI7Zm9yKG89InNzdiI9PT1lPyIlMjAiOiJ0c3YiPT09ZT8iXFx0IjoicGlwZXMiPT09ZT8ifCI6IiwiLHI9MDtyPG4ubGVuZ3RoO3IrKykwPT09cj9pPXRoaXMuZW5jb2RlUXVlcnlQYXJhbShuW3JdKTppKz1vK3RoaXMuZW5jb2RlUXVlcnlQYXJhbShuW3JdKTtyZXR1cm4gaX0sYS5wcm90b3R5cGUuZW5jb2RlUXVlcnlDb2xsZWN0aW9uPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPSIiO2lmKCJkZWZhdWx0Ij09PWV8fCJtdWx0aSI9PT1lKWZvcihyPTA7cjxuLmxlbmd0aDtyKyspcj4wJiYoaSs9IiYiKSxpKz10aGlzLmVuY29kZVF1ZXJ5UGFyYW0odCkrIj0iK3RoaXMuZW5jb2RlUXVlcnlQYXJhbShuW3JdKTtlbHNle3ZhciBvPSIiO2lmKCJjc3YiPT09ZSlvPSIsIjtlbHNlIGlmKCJzc3YiPT09ZSlvPSIlMjAiO2Vsc2UgaWYoInRzdiI9PT1lKW89IlxcdCI7ZWxzZSBpZigicGlwZXMiPT09ZSlvPSJ8IjtlbHNlIGlmKCJicmFja2V0cyI9PT1lKWZvcihyPTA7cjxuLmxlbmd0aDtyKyspMCE9PXImJihpKz0iJiIpLGkrPXRoaXMuZW5jb2RlUXVlcnlQYXJhbSh0KSsiW109Iit0aGlzLmVuY29kZVF1ZXJ5UGFyYW0obltyXSk7aWYoIiIhPT1vKWZvcihyPTA7cjxuLmxlbmd0aDtyKyspMD09PXI/aT10aGlzLmVuY29kZVF1ZXJ5UGFyYW0odCkrIj0iK3RoaXMuZW5jb2RlUXVlcnlQYXJhbShuW3JdKTppKz1vK3RoaXMuZW5jb2RlUXVlcnlQYXJhbShuW3JdKX1yZXR1cm4gaX0sYS5wcm90b3R5cGUuZW5jb2RlUXVlcnlQYXJhbT1mdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpfSxhLnByb3RvdHlwZS5lbmNvZGVQYXRoUGFyYW09ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk7aWYoZT1lLnRvU3RyaW5nKCksLTE9PT1lLmluZGV4T2YoIi8iKSlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpO2ZvcihuPWUuc3BsaXQoIi8iKSx0PVtdLHI9MCxpPW4ubGVuZ3RoO2k+cjtyKyspdC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChuW3JdKSk7cmV0dXJuIHQuam9pbigiLyIpfX0seyIuLi9oZWxwZXJzIjo0LCIuLi9odHRwIjo1LCIuL21vZGVsIjo4LCJsb2Rhc2gtY29tcGF0L2xhbmcvaXNVbmRlZmluZWQiOjEwM31dLDEwOltmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5kZXNjcmlwdGlvbj10LHRoaXMuZXh0ZXJuYWxEb2NzPW4sdGhpcy5uYW1lPWUsdGhpcy5vcGVyYXRpb249cix0aGlzLm9wZXJhdGlvbnNBcnJheT1bXSx0aGlzLnBhdGg9ZSx0aGlzLnRhZz1lfTtuLnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKCl7fX0se31dLDExOltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXRoaXM7aWYoIShuIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUsdCk7dmFyIGksbz10eXBlb2YgZTtpZigibnVtYmVyIj09PW8paT0rZTtlbHNlIGlmKCJzdHJpbmciPT09bylpPXIuYnl0ZUxlbmd0aChlLHQpO2Vsc2V7aWYoIm9iamVjdCIhPT1vfHxudWxsPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtdXN0IHN0YXJ0IHdpdGggbnVtYmVyLCBidWZmZXIsIGFycmF5IG9yIHN0cmluZyIpOyJCdWZmZXIiPT09ZS50eXBlJiZJKGUuZGF0YSkmJihlPWUuZGF0YSksaT0rZS5sZW5ndGh9aWYoaT5SKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitSLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7MD5pP2k9MDppPj4+PTAsci5UWVBFRF9BUlJBWV9TVVBQT1JUP249ci5fYXVnbWVudChuZXcgVWludDhBcnJheShpKSk6KG4ubGVuZ3RoPWksbi5faXNCdWZmZXI9ITApO3ZhciBhO2lmKHIuVFlQRURfQVJSQVlfU1VQUE9SVCYmIm51bWJlciI9PXR5cGVvZiBlLmJ5dGVMZW5ndGgpbi5fc2V0KGUpO2Vsc2UgaWYoVChlKSlpZihyLmlzQnVmZmVyKGUpKWZvcihhPTA7aT5hO2ErKyluW2FdPWUucmVhZFVJbnQ4KGEpO2Vsc2UgZm9yKGE9MDtpPmE7YSsrKW5bYV09KGVbYV0lMjU2KzI1NiklMjU2O2Vsc2UgaWYoInN0cmluZyI9PT1vKW4ud3JpdGUoZSwwLHQpO2Vsc2UgaWYoIm51bWJlciI9PT1vJiYhci5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihhPTA7aT5hO2ErKyluW2FdPTA7cmV0dXJuIGk+MCYmaTw9ci5wb29sU2l6ZSYmKG4ucGFyZW50PU0pLG59ZnVuY3Rpb24gaShlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGkpKXJldHVybiBuZXcgaShlLHQpO3ZhciBuPW5ldyByKGUsdCk7cmV0dXJuIGRlbGV0ZSBuLnBhcmVudCxufWZ1bmN0aW9uIG8oZSx0LG4scil7bj1OdW1iZXIobil8fDA7dmFyIGk9ZS5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSxyPmkmJihyPWkpKTpyPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT09MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I+by8yJiYocj1vLzIpO2Zvcih2YXIgYT0wO3I+YTthKyspe3ZhciBzPXBhcnNlSW50KHQuc3Vic3RyKDIqYSwyKSwxNik7aWYoaXNOYU4ocykpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtlW24rYV09c31yZXR1cm4gYX1mdW5jdGlvbiBhKGUsdCxuLHIpe3ZhciBpPUQoXyh0LGUubGVuZ3RoLW4pLGUsbixyKTtyZXR1cm4gaX1mdW5jdGlvbiBzKGUsdCxuLHIpe3ZhciBpPUQoTyh0KSxlLG4scik7cmV0dXJuIGl9ZnVuY3Rpb24gbChlLHQsbixyKXtyZXR1cm4gcyhlLHQsbixyKX1mdW5jdGlvbiB1KGUsdCxuLHIpe3ZhciBpPUQoJCh0KSxlLG4scik7cmV0dXJuIGl9ZnVuY3Rpb24gYyhlLHQsbixyKXt2YXIgaT1EKGsodCxlLmxlbmd0aC1uKSxlLG4scik7cmV0dXJuIGl9ZnVuY3Rpb24gcChlLHQsbil7cmV0dXJuIE4uZnJvbUJ5dGVBcnJheSgwPT09dCYmbj09PWUubGVuZ3RoP2U6ZS5zbGljZSh0LG4pKX1mdW5jdGlvbiBoKGUsdCxuKXt2YXIgcj0iIixpPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bj5vO28rKyllW29dPD0xMjc/KHIrPUwoaSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW29dKSxpPSIiKTppKz0iJSIrZVtvXS50b1N0cmluZygxNik7cmV0dXJuIHIrTChpKX1mdW5jdGlvbiBmKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgaT10O24+aTtpKyspcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gZChlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIGk9dDtuPmk7aSsrKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gbShlLHQsbil7dmFyIHI9ZS5sZW5ndGg7KCF0fHwwPnQpJiYodD0wKSwoIW58fDA+bnx8bj5yKSYmKG49cik7Zm9yKHZhciBpPSIiLG89dDtuPm87bysrKWkrPVMoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gZyhlLHQsbil7Zm9yKHZhciByPWUuc2xpY2UodCxuKSxpPSIiLG89MDtvPHIubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShyW29dKzI1NipyW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIHkoZSx0LG4pe2lmKGUlMSE9PTB8fDA+ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYoZSt0Pm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiB2KGUsdCxuLGksbyxhKXtpZighci5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJidWZmZXIgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZSIpO2lmKHQ+b3x8YT50KXRocm93IG5ldyBSYW5nZUVycm9yKCJ2YWx1ZSBpcyBvdXQgb2YgYm91bmRzIik7aWYobitpPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBiKGUsdCxuLHIpezA+dCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLW4sMik7bz5pO2krKyllW24raV09KHQmMjU1PDw4KihyP2k6MS1pKSk+Pj44KihyP2k6MS1pKX1mdW5jdGlvbiB3KGUsdCxuLHIpezA+dCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtbiw0KTtvPmk7aSsrKWVbbitpXT10Pj4+OCoocj9pOjMtaSkmMjU1fWZ1bmN0aW9uIHgoZSx0LG4scixpLG8pe2lmKHQ+aXx8bz50KXRocm93IG5ldyBSYW5nZUVycm9yKCJ2YWx1ZSBpcyBvdXQgb2YgYm91bmRzIik7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbmRleCBvdXQgb2YgcmFuZ2UiKTtpZigwPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoImluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEEoZSx0LG4scixpKXtyZXR1cm4gaXx8eChlLHQsbiw0LDMuNDAyODIzNDY2Mzg1Mjg4NmUzOCwtMy40MDI4MjM0NjYzODUyODg2ZTM4KSxQLndyaXRlKGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIEUoZSx0LG4scixpKXtyZXR1cm4gaXx8eChlLHQsbiw4LDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgsLTEuNzk3NjkzMTM0ODYyMzE1N2UzMDgpLFAud3JpdGUoZSx0LG4sciw1Miw4KSxuKzh9ZnVuY3Rpb24gaihlKXtpZihlPUMoZSkucmVwbGFjZShILCIiKSxlLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7ZS5sZW5ndGglNCE9PTA7KWUrPSI9IjtyZXR1cm4gZX1mdW5jdGlvbiBDKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gVChlKXtyZXR1cm4gSShlKXx8ci5pc0J1ZmZlcihlKXx8ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYibnVtYmVyIj09dHlwZW9mIGUubGVuZ3RofWZ1bmN0aW9uIFMoZSl7cmV0dXJuIDE2PmU/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIF8oZSx0KXt0PXR8fDEvMDtmb3IodmFyIG4scj1lLmxlbmd0aCxpPW51bGwsbz1bXSxhPTA7cj5hO2ErKyl7aWYobj1lLmNoYXJDb2RlQXQoYSksbj41NTI5NSYmNTczNDQ+bil7aWYoIWkpe2lmKG4+NTYzMTkpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihhKzE9PT1yKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1uO2NvbnRpbnVlfWlmKDU2MzIwPm4peyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPW47Y29udGludWV9bj1pLTU1Mjk2PDwxMHxuLTU2MzIwfDY1NTM2LGk9bnVsbH1lbHNlIGkmJigodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1udWxsKTtpZigxMjg+bil7aWYoKHQtPTEpPDApYnJlYWs7by5wdXNoKG4pfWVsc2UgaWYoMjA0OD5uKXtpZigodC09Mik8MClicmVhaztvLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYoNjU1MzY+bil7aWYoKHQtPTMpPDApYnJlYWs7by5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKDIwOTcxNTI+bikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztvLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIE8oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9ZnVuY3Rpb24gayhlLHQpe2Zvcih2YXIgbixyLGksbz1bXSxhPTA7YTxlLmxlbmd0aCYmISgodC09Mik8MCk7YSsrKW49ZS5jaGFyQ29kZUF0KGEpLHI9bj4+OCxpPW4lMjU2LG8ucHVzaChpKSxvLnB1c2gocik7cmV0dXJuIG99ZnVuY3Rpb24gJChlKXtyZXR1cm4gTi50b0J5dGVBcnJheShqKGUpKX1mdW5jdGlvbiBEKGUsdCxuLHIpe2Zvcih2YXIgaT0wO3I+aSYmIShpK24+PXQubGVuZ3RofHxpPj1lLmxlbmd0aCk7aSsrKXRbaStuXT1lW2ldO3JldHVybiBpfWZ1bmN0aW9uIEwoZSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzMpfX12YXIgTj1lKCJiYXNlNjQtanMiKSxQPWUoImllZWU3NTQiKSxJPWUoImlzLWFycmF5Iik7bi5CdWZmZXI9cixuLlNsb3dCdWZmZXI9aSxuLklOU1BFQ1RfTUFYX0JZVEVTPTUwLHIucG9vbFNpemU9ODE5Mjt2YXIgUj0xMDczNzQxODIzLE09e307ci5UWVBFRF9BUlJBWV9TVVBQT1JUPWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPW5ldyBBcnJheUJ1ZmZlcigwKSx0PW5ldyBVaW50OEFycmF5KGUpO3JldHVybiB0LmZvbz1mdW5jdGlvbigpe3JldHVybiA0Mn0sNDI9PT10LmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWJhcnJheSYmMD09PW5ldyBVaW50OEFycmF5KDEpLnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaChuKXtyZXR1cm4hMX19KCksci5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9LHIuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFyLmlzQnVmZmVyKGUpfHwhci5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciBuPWUubGVuZ3RoLGk9dC5sZW5ndGgsbz0wLGE9TWF0aC5taW4obixpKTthPm8mJmVbb109PT10W29dO28rKyk7cmV0dXJuIG8hPT1hJiYobj1lW29dLGk9dFtvXSksaT5uPy0xOm4+aT8xOjB9LHIuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJyYXciOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sci5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighSShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJsaXN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycy4iKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG5ldyByKDApO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZVswXTt2YXIgbjtpZih2b2lkIDA9PT10KWZvcih0PTAsbj0wO248ZS5sZW5ndGg7bisrKXQrPWVbbl0ubGVuZ3RoO3ZhciBpPW5ldyByKHQpLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXt2YXIgYT1lW25dO2EuY29weShpLG8pLG8rPWEubGVuZ3RofXJldHVybiBpfSxyLmJ5dGVMZW5ndGg9ZnVuY3Rpb24oZSx0KXt2YXIgbjtzd2l0Y2goZSs9IiIsdHx8InV0ZjgiKXtjYXNlImFzY2lpIjpjYXNlImJpbmFyeSI6Y2FzZSJyYXciOm49ZS5sZW5ndGg7YnJlYWs7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOm49MiplLmxlbmd0aDticmVhaztjYXNlImhleCI6bj1lLmxlbmd0aD4+PjE7YnJlYWs7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpuPV8oZSkubGVuZ3RoO2JyZWFrO2Nhc2UiYmFzZTY0IjpuPSQoZSkubGVuZ3RoO2JyZWFrO2RlZmF1bHQ6bj1lLmxlbmd0aH1yZXR1cm4gbn0sci5wcm90b3R5cGUubGVuZ3RoPXZvaWQgMCxyLnByb3RvdHlwZS5wYXJlbnQ9dm9pZCAwLHIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0hMTtpZih0Pj4+PTAsbj12b2lkIDA9PT1ufHwxLzA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPSJ1dGY4IiksMD50JiYodD0wKSxuPnRoaXMubGVuZ3RoJiYobj10aGlzLmxlbmd0aCksdD49bilyZXR1cm4iIjtmb3IoOzspc3dpdGNoKGUpe2Nhc2UiaGV4IjpyZXR1cm4gbSh0aGlzLHQsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gaCh0aGlzLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIGYodGhpcyx0LG4pO2Nhc2UiYmluYXJ5IjpyZXR1cm4gZCh0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBwKHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIGcodGhpcyx0LG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19LHIucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighci5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lPyEwOjA9PT1yLmNvbXBhcmUodGhpcyxlKX0sci5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiLHQ9bi5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLHQpLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD50JiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LHIucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSl7aWYoIXIuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZT8wOnIuY29tcGFyZSh0aGlzLGUpfSxyLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbil7Zm9yKHZhciByPS0xLGk9MDtuK2k8ZS5sZW5ndGg7aSsrKWlmKGVbbitpXT09PXRbLTE9PT1yPzA6aS1yXSl7aWYoLTE9PT1yJiYocj1pKSxpLXIrMT09PXQubGVuZ3RoKXJldHVybiBuK3J9ZWxzZSByPS0xO3JldHVybi0xfWlmKHQ+MjE0NzQ4MzY0Nz90PTIxNDc0ODM2NDc6LTIxNDc0ODM2NDg+dCYmKHQ9LTIxNDc0ODM2NDgpLHQ+Pj0wLDA9PT10aGlzLmxlbmd0aClyZXR1cm4tMTtpZih0Pj10aGlzLmxlbmd0aClyZXR1cm4tMTtpZigwPnQmJih0PU1hdGgubWF4KHRoaXMubGVuZ3RoK3QsMCkpLCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsZSx0KTtpZihyLmlzQnVmZmVyKGUpKXJldHVybiBuKHRoaXMsZSx0KTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIHIuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09PVVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsZSx0KTpuKHRoaXMsW2VdLHQpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfSxyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGNvbnNvbGUubG9nKCIuZ2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4iKSx0aGlzLnJlYWRVSW50OChlKX0sci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNvbnNvbGUubG9nKCIuc2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4iKSx0aGlzLndyaXRlVUludDgoZSx0KX0sci5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LG4scil7aWYoaXNGaW5pdGUodCkpaXNGaW5pdGUobil8fChyPW4sbj12b2lkIDApO2Vsc2V7dmFyIGk9cjtyPXQsdD1uLG49aX1pZih0PU51bWJlcih0KXx8MCwwPm58fDA+dHx8dD50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiYXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTt2YXIgcD10aGlzLmxlbmd0aC10O24/KG49TnVtYmVyKG4pLG4+cCYmKG49cCkpOm49cCxyPVN0cmluZyhyfHwidXRmOCIpLnRvTG93ZXJDYXNlKCk7dmFyIGg7c3dpdGNoKHIpe2Nhc2UiaGV4IjpoPW8odGhpcyxlLHQsbik7YnJlYWs7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpoPWEodGhpcyxlLHQsbik7YnJlYWs7Y2FzZSJhc2NpaSI6aD1zKHRoaXMsZSx0LG4pO2JyZWFrO2Nhc2UiYmluYXJ5IjpoPWwodGhpcyxlLHQsbik7YnJlYWs7Y2FzZSJiYXNlNjQiOmg9dSh0aGlzLGUsdCxuKTticmVhaztjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6aD1jKHRoaXMsZSx0LG4pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1yZXR1cm4gaH0sci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fSxyLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubGVuZ3RoO2U9fn5lLHQ9dm9pZCAwPT09dD9uOn5+dCwwPmU/KGUrPW4sMD5lJiYoZT0wKSk6ZT5uJiYoZT1uKSwwPnQ/KHQrPW4sMD50JiYodD0wKSk6dD5uJiYodD1uKSxlPnQmJih0PWUpO3ZhciBpO2lmKHIuVFlQRURfQVJSQVlfU1VQUE9SVClpPXIuX2F1Z21lbnQodGhpcy5zdWJhcnJheShlLHQpKTtlbHNle3ZhciBvPXQtZTtpPW5ldyByKG8sdm9pZCAwKTtmb3IodmFyIGE9MDtvPmE7YSsrKWlbYV09dGhpc1thK2VdfXJldHVybiBpLmxlbmd0aCYmKGkucGFyZW50PXRoaXMucGFyZW50fHx0aGlzKSxpfSxyLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlPj4+PTAsdD4+Pj0wLG58fHkoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspcis9dGhpc1tlK29dKmk7cmV0dXJuIHJ9LHIucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2U+Pj49MCx0Pj4+PTAsbnx8eShlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2UrLS10XSxpPTE7dD4wJiYoaSo9MjU2KTspcis9dGhpc1tlKy0tdF0qaTtyZXR1cm4gcn0sci5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHkoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxyLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eShlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxyLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eShlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxyLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eShlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LHIucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx5KGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0sci5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxuKXtlPj4+PTAsdD4+Pj0wLG58fHkoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspcis9dGhpc1tlK29dKmk7cmV0dXJuIGkqPTEyOCxyPj1pJiYoci09TWF0aC5wb3coMiw4KnQpKSxyfSxyLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2U+Pj49MCx0Pj4+PTAsbnx8eShlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10LGk9MSxvPXRoaXNbZSstLXJdO3I+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLXJdKmk7cmV0dXJuIGkqPTEyOCxvPj1pJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxyLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx5KGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LHIucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8eShlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxyLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fHkoZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sci5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eShlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sci5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eShlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sci5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eShlLDQsdGhpcy5sZW5ndGgpLFAucmVhZCh0aGlzLGUsITAsMjMsNCl9LHIucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHkoZSw0LHRoaXMubGVuZ3RoKSxQLnJlYWQodGhpcyxlLCExLDIzLDQpfSxyLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eShlLDgsdGhpcy5sZW5ndGgpLFAucmVhZCh0aGlzLGUsITAsNTIsOCl9LHIucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx5KGUsOCx0aGlzLmxlbmd0aCksUC5yZWFkKHRoaXMsZSwhMSw1Miw4KX0sci5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7ZT0rZSx0Pj4+PTAsbj4+Pj0wLHJ8fHYodGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiksMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPG4mJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pPj4+MCYyNTU7cmV0dXJuIHQrbn0sci5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7ZT0rZSx0Pj4+PTAsbj4+Pj0wLHJ8fHYodGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiksMCk7dmFyIGk9bi0xLG89MTtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28+Pj4wJjI1NTtyZXR1cm4gdCtufSxyLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0Pj4+PTAsbnx8dih0aGlzLGUsdCwxLDI1NSwwKSxyLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09ZSx0KzF9LHIucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ+Pj49MCxufHx2KHRoaXMsZSx0LDIsNjU1MzUsMCksci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWUsdGhpc1t0KzFdPWU+Pj44KTpiKHRoaXMsZSx0LCEwKSx0KzJ9LHIucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ+Pj49MCxufHx2KHRoaXMsZSx0LDIsNjU1MzUsMCksci5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT1lKTpiKHRoaXMsZSx0LCExKSx0KzJ9LHIucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ+Pj49MCxufHx2KHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxyLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT1lKTp3KHRoaXMsZSx0LCEwKSx0KzR9LHIucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ+Pj49MCxufHx2KHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxyLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT1lKTp3KHRoaXMsZSx0LCExKSx0KzR9LHIucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7ZT0rZSx0Pj4+PTAscnx8dih0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuLTEpLTEsLU1hdGgucG93KDIsOCpuLTEpKTt2YXIgaT0wLG89MSxhPTA+ZT8xOjA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihvKj0yNTYpOyl0aGlzW3QraV09KGUvbz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sci5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHQ+Pj49MCxyfHx2KHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4tMSktMSwtTWF0aC5wb3coMiw4Km4tMSkpO3ZhciBpPW4tMSxvPTEsYT0wPmU/MTowO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspdGhpc1t0K2ldPShlL28+PjApLWEmMjU1O3JldHVybiB0K259LHIucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD4+Pj0wLG58fHYodGhpcyxlLHQsMSwxMjcsLTEyOCksci5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSwwPmUmJihlPTI1NStlKzEpLHRoaXNbdF09ZSx0KzF9LHIucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD4+Pj0wLG58fHYodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLHIuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lLHRoaXNbdCsxXT1lPj4+OCk6Yih0aGlzLGUsdCwhMCksdCsyfSxyLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ+Pj49MCxufHx2KHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxyLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPWUpOmIodGhpcyxlLHQsITEpLHQrMn0sci5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0Pj4+PTAsbnx8dih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHIuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOncodGhpcyxlLHQsITApLHQrNH0sci5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0Pj4+PTAsbnx8dih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLDA+ZSYmKGU9NDI5NDk2NzI5NStlKzEpLHIuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPWUpOncodGhpcyxlLHQsITEpLHQrNH0sci5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gQSh0aGlzLGUsdCwhMCxuKX0sci5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gQSh0aGlzLGUsdCwhMSxuKX0sci5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEUodGhpcyxlLHQsITAsbil9LHIucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBFKHRoaXMsZSx0LCExLG4pfSxyLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLGkpe2lmKG58fChuPTApLGl8fDA9PT1pfHwoaT10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxpPjAmJm4+aSYmKGk9biksaT09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoMD50KXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYoMD5ufHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKDA+aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtpPnRoaXMubGVuZ3RoJiYoaT10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxpLW4mJihpPWUubGVuZ3RoLXQrbik7dmFyIG89aS1uO2lmKDFlMz5vfHwhci5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgYT0wO28+YTthKyspZVthK3RdPXRoaXNbYStuXTtlbHNlIGUuX3NldCh0aGlzLnN1YmFycmF5KG4sbitvKSx0KTtyZXR1cm4gb30sci5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQsbil7aWYoZXx8KGU9MCksdHx8KHQ9MCksbnx8KG49dGhpcy5sZW5ndGgpLHQ+bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZW5kIDwgc3RhcnQiKTtpZihuIT09dCYmMCE9PXRoaXMubGVuZ3RoKXtpZigwPnR8fHQ+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzdGFydCBvdXQgb2YgYm91bmRzIik7aWYoMD5ufHxuPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJlbmQgb3V0IG9mIGJvdW5kcyIpO3ZhciByO2lmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iocj10O24+cjtyKyspdGhpc1tyXT1lO2Vsc2V7dmFyIGk9XyhlLnRvU3RyaW5nKCkpLG89aS5sZW5ndGg7Zm9yKHI9dDtuPnI7cisrKXRoaXNbcl09aVtyJW9dfXJldHVybiB0aGlzfX0sci5wcm90b3R5cGUudG9BcnJheUJ1ZmZlcj1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSl7aWYoci5UWVBFRF9BUlJBWV9TVVBQT1JUKXJldHVybiBuZXcgcih0aGlzKS5idWZmZXI7Zm9yKHZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMubGVuZ3RoKSx0PTAsbj1lLmxlbmd0aDtuPnQ7dCs9MSllW3RdPXRoaXNbdF07cmV0dXJuIGUuYnVmZmVyfXRocm93IG5ldyBUeXBlRXJyb3IoIkJ1ZmZlci50b0FycmF5QnVmZmVyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyIil9O3ZhciBVPXIucHJvdG90eXBlO3IuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29uc3RydWN0b3I9cixlLl9pc0J1ZmZlcj0hMCxlLl9zZXQ9ZS5zZXQsZS5nZXQ9VS5nZXQsZS5zZXQ9VS5zZXQsZS53cml0ZT1VLndyaXRlLGUudG9TdHJpbmc9VS50b1N0cmluZyxlLnRvTG9jYWxlU3RyaW5nPVUudG9TdHJpbmcsZS50b0pTT049VS50b0pTT04sZS5lcXVhbHM9VS5lcXVhbHMsZS5jb21wYXJlPVUuY29tcGFyZSxlLmluZGV4T2Y9VS5pbmRleE9mLGUuY29weT1VLmNvcHksZS5zbGljZT1VLnNsaWNlLGUucmVhZFVJbnRMRT1VLnJlYWRVSW50TEUsZS5yZWFkVUludEJFPVUucmVhZFVJbnRCRSxlLnJlYWRVSW50OD1VLnJlYWRVSW50OCxlLnJlYWRVSW50MTZMRT1VLnJlYWRVSW50MTZMRSxlLnJlYWRVSW50MTZCRT1VLnJlYWRVSW50MTZCRSxlLnJlYWRVSW50MzJMRT1VLnJlYWRVSW50MzJMRSxlLnJlYWRVSW50MzJCRT1VLnJlYWRVSW50MzJCRSxlLnJlYWRJbnRMRT1VLnJlYWRJbnRMRSxlLnJlYWRJbnRCRT1VLnJlYWRJbnRCRSxlLnJlYWRJbnQ4PVUucmVhZEludDgsZS5yZWFkSW50MTZMRT1VLnJlYWRJbnQxNkxFLGUucmVhZEludDE2QkU9VS5yZWFkSW50MTZCRSxlLnJlYWRJbnQzMkxFPVUucmVhZEludDMyTEUsZS5yZWFkSW50MzJCRT1VLnJlYWRJbnQzMkJFLGUucmVhZEZsb2F0TEU9VS5yZWFkRmxvYXRMRSxlLnJlYWRGbG9hdEJFPVUucmVhZEZsb2F0QkUsZS5yZWFkRG91YmxlTEU9VS5yZWFkRG91YmxlTEUsZS5yZWFkRG91YmxlQkU9VS5yZWFkRG91YmxlQkUsZS53cml0ZVVJbnQ4PVUud3JpdGVVSW50OCxlLndyaXRlVUludExFPVUud3JpdGVVSW50TEUsZS53cml0ZVVJbnRCRT1VLndyaXRlVUludEJFLGUud3JpdGVVSW50MTZMRT1VLndyaXRlVUludDE2TEUsZS53cml0ZVVJbnQxNkJFPVUud3JpdGVVSW50MTZCRSxlLndyaXRlVUludDMyTEU9VS53cml0ZVVJbnQzMkxFLGUud3JpdGVVSW50MzJCRT1VLndyaXRlVUludDMyQkUsZS53cml0ZUludExFPVUud3JpdGVJbnRMRSxlLndyaXRlSW50QkU9VS53cml0ZUludEJFLGUud3JpdGVJbnQ4PVUud3JpdGVJbnQ4LGUud3JpdGVJbnQxNkxFPVUud3JpdGVJbnQxNkxFLGUud3JpdGVJbnQxNkJFPVUud3JpdGVJbnQxNkJFLGUud3JpdGVJbnQzMkxFPVUud3JpdGVJbnQzMkxFLGUud3JpdGVJbnQzMkJFPVUud3JpdGVJbnQzMkJFLGUud3JpdGVGbG9hdExFPVUud3JpdGVGbG9hdExFLGUud3JpdGVGbG9hdEJFPVUud3JpdGVGbG9hdEJFLGUud3JpdGVEb3VibGVMRT1VLndyaXRlRG91YmxlTEUsZS53cml0ZURvdWJsZUJFPVUud3JpdGVEb3VibGVCRSxlLmZpbGw9VS5maWxsLGUuaW5zcGVjdD1VLmluc3BlY3QsZS50b0FycmF5QnVmZmVyPVUudG9BcnJheUJ1ZmZlcixlfTt2YXIgSD0vW14rXC8wLTlBLXpcLV0vZ30seyJiYXNlNjQtanMiOjEyLGllZWU3NTQ6MTMsImlzLWFycmF5IjoxNH1dLDEyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOyFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHQ9PT1hfHx0PT09cD82Mjp0PT09c3x8dD09PWg/NjM6bD50Py0xOmwrMTA+dD90LWwrMjYrMjY6YysyNj50P3QtYzp1KzI2PnQ/dC11KzI2OnZvaWQgMH1mdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIG4oZSl7dVtwKytdPWV9dmFyIHIsaSxhLHMsbCx1O2lmKGUubGVuZ3RoJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgYz1lLmxlbmd0aDtsPSI9Ij09PWUuY2hhckF0KGMtMik/MjoiPSI9PT1lLmNoYXJBdChjLTEpPzE6MCx1PW5ldyBvKDMqZS5sZW5ndGgvNC1sKSxhPWw+MD9lLmxlbmd0aC00OmUubGVuZ3RoO3ZhciBwPTA7Zm9yKHI9MCxpPTA7YT5yO3IrPTQsaSs9MylzPXQoZS5jaGFyQXQocikpPDwxOHx0KGUuY2hhckF0KHIrMSkpPDwxMnx0KGUuY2hhckF0KHIrMikpPDw2fHQoZS5jaGFyQXQociszKSksbigoMTY3MTE2ODAmcyk+PjE2KSxuKCg2NTI4MCZzKT4+OCksbigyNTUmcyk7cmV0dXJuIDI9PT1sPyhzPXQoZS5jaGFyQXQocikpPDwyfHQoZS5jaGFyQXQocisxKSk+PjQsbigyNTUmcykpOjE9PT1sJiYocz10KGUuY2hhckF0KHIpKTw8MTB8dChlLmNoYXJBdChyKzEpKTw8NHx0KGUuY2hhckF0KHIrMikpPj4yLG4ocz4+OCYyNTUpLG4oMjU1JnMpKSx1fWZ1bmN0aW9uIGkoZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gci5jaGFyQXQoZSl9ZnVuY3Rpb24gbihlKXtyZXR1cm4gdChlPj4xOCY2MykrdChlPj4xMiY2MykrdChlPj42JjYzKSt0KDYzJmUpfXZhciBpLG8sYSxzPWUubGVuZ3RoJTMsbD0iIjtmb3IoaT0wLGE9ZS5sZW5ndGgtczthPmk7aSs9MylvPShlW2ldPDwxNikrKGVbaSsxXTw8OCkrZVtpKzJdLGwrPW4obyk7c3dpdGNoKHMpe2Nhc2UgMTpvPWVbZS5sZW5ndGgtMV0sbCs9dChvPj4yKSxsKz10KG88PDQmNjMpLGwrPSI9PSI7YnJlYWs7Y2FzZSAyOm89KGVbZS5sZW5ndGgtMl08PDgpK2VbZS5sZW5ndGgtMV0sbCs9dChvPj4xMCksbCs9dChvPj40JjYzKSxsKz10KG88PDImNjMpLGwrPSI9In1yZXR1cm4gbH12YXIgbz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxhPSIrIi5jaGFyQ29kZUF0KDApLHM9Ii8iLmNoYXJDb2RlQXQoMCksbD0iMCIuY2hhckNvZGVBdCgwKSx1PSJhIi5jaGFyQ29kZUF0KDApLGM9IkEiLmNoYXJDb2RlQXQoMCkscD0iLSIuY2hhckNvZGVBdCgwKSxoPSJfIi5jaGFyQ29kZUF0KDApO2UudG9CeXRlQXJyYXk9bixlLmZyb21CeXRlQXJyYXk9aX0oInVuZGVmaW5lZCI9PXR5cGVvZiBuP3RoaXMuYmFzZTY0anM9e306bil9LHt9XSwxMzpbZnVuY3Rpb24oZSx0LG4pe24ucmVhZD1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscz04Kmktci0xLGw9KDE8PHMpLTEsdT1sPj4xLGM9LTcscD1uP2ktMTowLGg9bj8tMToxLGY9ZVt0K3BdO2ZvcihwKz1oLG89ZiYoMTw8LWMpLTEsZj4+PS1jLGMrPXM7Yz4wO289MjU2Km8rZVt0K3BdLHArPWgsYy09OCk7Zm9yKGE9byYoMTw8LWMpLTEsbz4+PS1jLGMrPXI7Yz4wO2E9MjU2KmErZVt0K3BdLHArPWgsYy09OCk7aWYoMD09PW8pbz0xLXU7ZWxzZXtpZihvPT09bClyZXR1cm4gYT8wLzA6MS8wKihmPy0xOjEpO2ErPU1hdGgucG93KDIsciksby09dX1yZXR1cm4oZj8tMToxKSphKk1hdGgucG93KDIsby1yKX0sbi53cml0ZT1mdW5jdGlvbihlLHQsbixyLGksbyl7dmFyIGEscyxsLHU9OCpvLWktMSxjPSgxPDx1KS0xLHA9Yz4+MSxoPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZj1yPzA6by0xLGQ9cj8xOi0xLG09MD50fHwwPT09dCYmMD4xL3Q/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHwxLzA9PT10PyhzPWlzTmFOKHQpPzE6MCxhPWMpOihhPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKGw9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0sbCo9MiksdCs9YStwPj0xP2gvbDpoKk1hdGgucG93KDIsMS1wKSx0Kmw+PTImJihhKyssbC89MiksYStwPj1jPyhzPTAsYT1jKTphK3A+PTE/KHM9KHQqbC0xKSpNYXRoLnBvdygyLGkpLGErPXApOihzPXQqTWF0aC5wb3coMixwLTEpKk1hdGgucG93KDIsaSksYT0wKSk7aT49ODtlW24rZl09MjU1JnMsZis9ZCxzLz0yNTYsaS09OCk7Zm9yKGE9YTw8aXxzLHUrPWk7dT4wO2VbbitmXT0yNTUmYSxmKz1kLGEvPTI1Nix1LT04KTtlW24rZi1kXXw9MTI4Km19fSx7fV0sMTQ6W2Z1bmN0aW9uKGUsdCl7dmFyIG49QXJyYXkuaXNBcnJheSxyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dC5leHBvcnRzPW58fGZ1bmN0aW9uKGUpe3JldHVybiEhZSYmIltvYmplY3QgQXJyYXldIj09ci5jYWxsKGUpfX0se31dLDE1OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtpZighYSl7YT0hMDtmb3IodmFyIGUsdD1vLmxlbmd0aDt0Oyl7ZT1vLG89W107Zm9yKHZhciBuPS0xOysrbjx0OyllW25dKCk7dD1vLmxlbmd0aH1hPSExfX1mdW5jdGlvbiByKCl7fXZhciBpPXQuZXhwb3J0cz17fSxvPVtdLGE9ITE7aS5uZXh0VGljaz1mdW5jdGlvbihlKXtvLnB1c2goZSksYXx8c2V0VGltZW91dChuLDApCit9LGkudGl0bGU9ImJyb3dzZXIiLGkuYnJvd3Nlcj0hMCxpLmVudj17fSxpLmFyZ3Y9W10saS52ZXJzaW9uPSIiLGkudmVyc2lvbnM9e30saS5vbj1yLGkuYWRkTGlzdGVuZXI9cixpLm9uY2U9cixpLm9mZj1yLGkucmVtb3ZlTGlzdGVuZXI9cixpLnJlbW92ZUFsbExpc3RlbmVycz1yLGkuZW1pdD1yLGkuYmluZGluZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0saS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGkuY2hkaXI9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxpLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sMTY6W2Z1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpeyFmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBuO3JldHVybiBuPXQgaW5zdGFuY2VvZiBlP3Q6bmV3IGUodC50b1N0cmluZygpLCJiaW5hcnkiKSxuLnRvU3RyaW5nKCJiYXNlNjQiKX10LmV4cG9ydHM9bn0oKX0pLmNhbGwodGhpcyxlKCJidWZmZXIiKS5CdWZmZXIpfSx7YnVmZmVyOjExfV0sMTc6W2Z1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZSh0LG4scixpKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGU/KHRoaXMuZG9tYWluPXR8fHZvaWQgMCx0aGlzLnBhdGg9bnx8Ii8iLHRoaXMuc2VjdXJlPSEhcix0aGlzLnNjcmlwdD0hIWksdGhpcyk6bmV3IGUodCxuLHIsaSl9ZnVuY3Rpb24gdChlLG4scil7cmV0dXJuIGUgaW5zdGFuY2VvZiB0P2U6dGhpcyBpbnN0YW5jZW9mIHQ/KHRoaXMubmFtZT1udWxsLHRoaXMudmFsdWU9bnVsbCx0aGlzLmV4cGlyYXRpb25fZGF0ZT0xLzAsdGhpcy5wYXRoPVN0cmluZyhyfHwiLyIpLHRoaXMuZXhwbGljaXRfcGF0aD0hMSx0aGlzLmRvbWFpbj1ufHxudWxsLHRoaXMuZXhwbGljaXRfZG9tYWluPSExLHRoaXMuc2VjdXJlPSExLHRoaXMubm9zY3JpcHQ9ITEsZSYmdGhpcy5wYXJzZShlLG4sciksdGhpcyk6bmV3IHQoZSl9ZnVuY3Rpb24gcigpe3ZhciBlLG4saTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHI/KGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLnNldENvb2tpZT1mdW5jdGlvbihyLG8sYSl7dmFyIHMsbDtpZihyPW5ldyB0KHIsbyxhKSxzPXIuZXhwaXJhdGlvbl9kYXRlPD1EYXRlLm5vdygpLHZvaWQgMCE9PWVbci5uYW1lXSl7Zm9yKG49ZVtyLm5hbWVdLGw9MDtsPG4ubGVuZ3RoO2wrPTEpaWYoaT1uW2xdLGkuY29sbGlkZXNXaXRoKHIpKXJldHVybiBzPyhuLnNwbGljZShsLDEpLDA9PT1uLmxlbmd0aCYmZGVsZXRlIGVbci5uYW1lXSwhMSk6KG5bbF09cixyKTtyZXR1cm4gcz8hMToobi5wdXNoKHIpLHIpfXJldHVybiBzPyExOihlW3IubmFtZV09W3JdLGVbci5uYW1lXSl9LHRoaXMuZ2V0Q29va2llPWZ1bmN0aW9uKHQscil7dmFyIGksbztpZihuPWVbdF0pZm9yKG89MDtvPG4ubGVuZ3RoO28rPTEpaWYoaT1uW29dLGkuZXhwaXJhdGlvbl9kYXRlPD1EYXRlLm5vdygpKTA9PT1uLmxlbmd0aCYmZGVsZXRlIGVbaS5uYW1lXTtlbHNlIGlmKGkubWF0Y2hlcyhyKSlyZXR1cm4gaX0sdGhpcy5nZXRDb29raWVzPWZ1bmN0aW9uKHQpe3ZhciBuLHIsaT1bXTtmb3IobiBpbiBlKXI9dGhpcy5nZXRDb29raWUobix0KSxyJiZpLnB1c2gocik7cmV0dXJuIGkudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gaS5qb2luKCI6Iil9LGkudG9WYWx1ZVN0cmluZz1mdW5jdGlvbigpe3JldHVybiBpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1ZhbHVlU3RyaW5nKCl9KS5qb2luKCI7Iil9LGl9LHRoaXMpOm5ldyByfW4uQ29va2llQWNjZXNzSW5mbz1lLG4uQ29va2llPXQsdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5uYW1lKyI9Iit0aGlzLnZhbHVlXTtyZXR1cm4gMS8wIT09dGhpcy5leHBpcmF0aW9uX2RhdGUmJmUucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHRoaXMuZXhwaXJhdGlvbl9kYXRlKS50b0dNVFN0cmluZygpKSx0aGlzLmRvbWFpbiYmZS5wdXNoKCJkb21haW49Iit0aGlzLmRvbWFpbiksdGhpcy5wYXRoJiZlLnB1c2goInBhdGg9Iit0aGlzLnBhdGgpLHRoaXMuc2VjdXJlJiZlLnB1c2goInNlY3VyZSIpLHRoaXMubm9zY3JpcHQmJmUucHVzaCgiaHR0cG9ubHkiKSxlLmpvaW4oIjsgIil9LHQucHJvdG90eXBlLnRvVmFsdWVTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lKyI9Iit0aGlzLnZhbHVlfTt2YXIgaT0vWzpdKD89XHMqW2EtekEtWjAtOV9cLV0rXHMqWz1dKS9nO3QucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7dmFyIGksbz1lLnNwbGl0KCI7IikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiEhZX0pLGE9b1swXS5tYXRjaCgvKFtePV0rKT0oW1xzXFNdKikvKSxzPWFbMV0sbD1hWzJdO2Zvcih0aGlzLm5hbWU9cyx0aGlzLnZhbHVlPWwsaT0xO2k8by5sZW5ndGg7aSs9MSlzd2l0Y2goYT1vW2ldLm1hdGNoKC8oW149XSspKD86PShbXHNcU10qKSk/Lykscz1hWzFdLnRyaW0oKS50b0xvd2VyQ2FzZSgpLGw9YVsyXSxzKXtjYXNlImh0dHBvbmx5Ijp0aGlzLm5vc2NyaXB0PSEwO2JyZWFrO2Nhc2UiZXhwaXJlcyI6dGhpcy5leHBpcmF0aW9uX2RhdGU9bD9OdW1iZXIoRGF0ZS5wYXJzZShsKSk6MS8wO2JyZWFrO2Nhc2UicGF0aCI6dGhpcy5wYXRoPWw/bC50cmltKCk6IiIsdGhpcy5leHBsaWNpdF9wYXRoPSEwO2JyZWFrO2Nhc2UiZG9tYWluIjp0aGlzLmRvbWFpbj1sP2wudHJpbSgpOiIiLHRoaXMuZXhwbGljaXRfZG9tYWluPSEhdGhpcy5kb21haW47YnJlYWs7Y2FzZSJzZWN1cmUiOnRoaXMuc2VjdXJlPSEwfXJldHVybiB0aGlzLmV4cGxpY2l0X3BhdGh8fCh0aGlzLnBhdGg9cnx8Ii8iKSx0aGlzLmV4cGxpY2l0X2RvbWFpbnx8KHRoaXMuZG9tYWluPW4pLHRoaXN9cmV0dXJuKG5ldyB0KS5wYXJzZShlLG4scil9LHQucHJvdG90eXBlLm1hdGNoZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubm9zY3JpcHQmJmUuc2NyaXB0fHx0aGlzLnNlY3VyZSYmIWUuc2VjdXJlfHwhdGhpcy5jb2xsaWRlc1dpdGgoZSk/ITE6ITB9LHQucHJvdG90eXBlLmNvbGxpZGVzV2l0aD1mdW5jdGlvbihlKXtpZih0aGlzLnBhdGgmJiFlLnBhdGh8fHRoaXMuZG9tYWluJiYhZS5kb21haW4pcmV0dXJuITE7aWYodGhpcy5wYXRoJiYwIT09ZS5wYXRoLmluZGV4T2YodGhpcy5wYXRoKSlyZXR1cm4hMTtpZighdGhpcy5leHBsaWNpdF9wYXRoJiZ0aGlzLnBhdGghPT1lLnBhdGgpcmV0dXJuITE7dmFyIHQ9ZS5kb21haW4mJmUuZG9tYWluLnJlcGxhY2UoL15bXC5dLywiIiksbj10aGlzLmRvbWFpbiYmdGhpcy5kb21haW4ucmVwbGFjZSgvXltcLl0vLCIiKTtpZihuPT09dClyZXR1cm4hMDtpZihuKXtpZighdGhpcy5leHBsaWNpdF9kb21haW4pcmV0dXJuITE7dmFyIHI9dC5pbmRleE9mKG4pO3JldHVybi0xPT09cnx8ciE9PXQubGVuZ3RoLW4ubGVuZ3RoPyExOiEwfXJldHVybiEwfSxuLkNvb2tpZUphcj1yLHIucHJvdG90eXBlLnNldENvb2tpZXM9ZnVuY3Rpb24oZSxuLHIpe2U9QXJyYXkuaXNBcnJheShlKT9lOmUuc3BsaXQoaSk7dmFyIG8sYSxzPVtdO2ZvcihlPWUubWFwKHQpLG89MDtvPGUubGVuZ3RoO28rPTEpYT1lW29dLHRoaXMuc2V0Q29va2llKGEsbixyKSYmcy5wdXNoKGEpO3JldHVybiBzfX0oKX0se31dLDE4OltmdW5jdGlvbih0LG4peyFmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgbiYmIm9iamVjdCI9PXR5cGVvZiBuLmV4cG9ydHM/bi5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKGUpe3ZhciB0PWUubGVuZ3RoLG49ZXQudHlwZShlKTtyZXR1cm4iZnVuY3Rpb24iPT09bnx8ZXQuaXNXaW5kb3coZSk/ITE6MT09PWUubm9kZVR5cGUmJnQ/ITA6ImFycmF5Ij09PW58fDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGV9ZnVuY3Rpb24gaShlLHQsbil7aWYoZXQuaXNGdW5jdGlvbih0KSlyZXR1cm4gZXQuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pO2lmKHQubm9kZVR5cGUpcmV0dXJuIGV0LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQhPT1ufSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZihsdC50ZXN0KHQpKXJldHVybiBldC5maWx0ZXIodCxlLG4pO3Q9ZXQuZmlsdGVyKHQsZSl9cmV0dXJuIGV0LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gSi5jYWxsKHQsZSk+PTAhPT1ufSl9ZnVuY3Rpb24gbyhlLHQpe2Zvcig7KGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlOyk7cmV0dXJuIGV9ZnVuY3Rpb24gYShlKXt2YXIgdD1tdFtlXT17fTtyZXR1cm4gZXQuZWFjaChlLm1hdGNoKGR0KXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH1mdW5jdGlvbiBzKCl7Ry5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixzLCExKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHMsITEpLGV0LnJlYWR5KCl9ZnVuY3Rpb24gbCgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmNhY2hlPXt9LDAse2dldDpmdW5jdGlvbigpe3JldHVybnt9fX0pLHRoaXMuZXhwYW5kbz1ldC5leHBhbmRvK2wudWlkKyt9ZnVuY3Rpb24gdShlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZSh4dCwiLSQxIikudG9Mb3dlckNhc2UoKSxuPWUuZ2V0QXR0cmlidXRlKHIpLCJzdHJpbmciPT10eXBlb2Ygbil7dHJ5e249InRydWUiPT09bj8hMDoiZmFsc2UiPT09bj8hMToibnVsbCI9PT1uP251bGw6K24rIiI9PT1uPytuOnd0LnRlc3Qobik/ZXQucGFyc2VKU09OKG4pOm59Y2F0Y2goaSl7fWJ0LnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1mdW5jdGlvbiBjKCl7cmV0dXJuITB9ZnVuY3Rpb24gcCgpe3JldHVybiExfWZ1bmN0aW9uIGgoKXt0cnl7cmV0dXJuIEcuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gZXQubm9kZU5hbWUoZSwidGFibGUiKSYmZXQubm9kZU5hbWUoMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGUuYXBwZW5kQ2hpbGQoZS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmV9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIG0oZSl7dmFyIHQ9UnQuZXhlYyhlLnR5cGUpO3JldHVybiB0P2UudHlwZT10WzFdOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBnKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtyPm47bisrKXZ0LnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8dnQuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24geShlLHQpe3ZhciBuLHIsaSxvLGEscyxsLHU7aWYoMT09PXQubm9kZVR5cGUpe2lmKHZ0Lmhhc0RhdGEoZSkmJihvPXZ0LmFjY2VzcyhlKSxhPXZ0LnNldCh0LG8pLHU9by5ldmVudHMpKXtkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e307Zm9yKGkgaW4gdSlmb3Iobj0wLHI9dVtpXS5sZW5ndGg7cj5uO24rKylldC5ldmVudC5hZGQodCxpLHVbaV1bbl0pfWJ0Lmhhc0RhdGEoZSkmJihzPWJ0LmFjY2VzcyhlKSxsPWV0LmV4dGVuZCh7fSxzKSxidC5zZXQodCxsKSl9fWZ1bmN0aW9uIHYoZSx0KXt2YXIgbj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKTplLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W107cmV0dXJuIHZvaWQgMD09PXR8fHQmJmV0Lm5vZGVOYW1lKGUsdCk/ZXQubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24gYihlLHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09biYmQ3QudGVzdChlLnR5cGUpP3QuY2hlY2tlZD1lLmNoZWNrZWQ6KCJpbnB1dCI9PT1ufHwidGV4dGFyZWEiPT09bikmJih0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gdyhlLG4pe3ZhciByLGk9ZXQobi5jcmVhdGVFbGVtZW50KGUpKS5hcHBlbmRUbyhuLmJvZHkpLG89dC5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSYmKHI9dC5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZShpWzBdKSk/ci5kaXNwbGF5OmV0LmNzcyhpWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGkuZGV0YWNoKCksb31mdW5jdGlvbiB4KGUpe3ZhciB0PUcsbj1GdFtlXTtyZXR1cm4gbnx8KG49dyhlLHQpLCJub25lIiE9PW4mJm58fChIdD0oSHR8fGV0KCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKHQuZG9jdW1lbnRFbGVtZW50KSx0PUh0WzBdLmNvbnRlbnREb2N1bWVudCx0LndyaXRlKCksdC5jbG9zZSgpLG49dyhlLHQpLEh0LmRldGFjaCgpKSxGdFtlXT1uKSxufWZ1bmN0aW9uIEEoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4gbj1ufHx6dChlKSxuJiYoYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0pLG4mJigiIiE9PWF8fGV0LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8KGE9ZXQuc3R5bGUoZSx0KSkscXQudGVzdChhKSYmQnQudGVzdCh0KSYmKHI9cy53aWR0aCxpPXMubWluV2lkdGgsbz1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPWkscy5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gRShlLHQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD10KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX1mdW5jdGlvbiBqKGUsdCl7aWYodCBpbiBlKXJldHVybiB0O2Zvcih2YXIgbj10WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1YdC5sZW5ndGg7aS0tOylpZih0PVh0W2ldK24sdCBpbiBlKXJldHVybiB0O3JldHVybiByfWZ1bmN0aW9uIEMoZSx0LG4pe3ZhciByPVd0LmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzFdLShufHwwKSkrKHJbMl18fCJweCIpOnR9ZnVuY3Rpb24gVChlLHQsbixyLGkpe2Zvcih2YXIgbz1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT10PzE6MCxhPTA7ND5vO28rPTIpIm1hcmdpbiI9PT1uJiYoYSs9ZXQuY3NzKGUsbitFdFtvXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKGEtPWV0LmNzcyhlLCJwYWRkaW5nIitFdFtvXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYoYS09ZXQuY3NzKGUsImJvcmRlciIrRXRbb10rIldpZHRoIiwhMCxpKSkpOihhKz1ldC5jc3MoZSwicGFkZGluZyIrRXRbb10sITAsaSksInBhZGRpbmciIT09biYmKGErPWV0LmNzcyhlLCJib3JkZXIiK0V0W29dKyJXaWR0aCIsITAsaSkpKTtyZXR1cm4gYX1mdW5jdGlvbiBTKGUsdCxuKXt2YXIgcj0hMCxpPSJ3aWR0aCI9PT10P2Uub2Zmc2V0V2lkdGg6ZS5vZmZzZXRIZWlnaHQsbz16dChlKSxhPSJib3JkZXItYm94Ij09PWV0LmNzcyhlLCJib3hTaXppbmciLCExLG8pO2lmKDA+PWl8fG51bGw9PWkpe2lmKGk9QShlLHQsbyksKDA+aXx8bnVsbD09aSkmJihpPWUuc3R5bGVbdF0pLHF0LnRlc3QoaSkpcmV0dXJuIGk7cj1hJiYoSy5ib3hTaXppbmdSZWxpYWJsZSgpfHxpPT09ZS5zdHlsZVt0XSksaT1wYXJzZUZsb2F0KGkpfHwwfXJldHVybiBpK1QoZSx0LG58fChhPyJib3JkZXIiOiJjb250ZW50IikscixvKSsicHgifWZ1bmN0aW9uIF8oZSx0KXtmb3IodmFyIG4scixpLG89W10sYT0wLHM9ZS5sZW5ndGg7cz5hO2ErKylyPWVbYV0sci5zdHlsZSYmKG9bYV09dnQuZ2V0KHIsIm9sZGRpc3BsYXkiKSxuPXIuc3R5bGUuZGlzcGxheSx0PyhvW2FdfHwibm9uZSIhPT1ufHwoci5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmanQocikmJihvW2FdPXZ0LmFjY2VzcyhyLCJvbGRkaXNwbGF5Iix4KHIubm9kZU5hbWUpKSkpOihpPWp0KHIpLCJub25lIj09PW4mJml8fHZ0LnNldChyLCJvbGRkaXNwbGF5IixpP246ZXQuY3NzKHIsImRpc3BsYXkiKSkpKTtmb3IoYT0wO3M+YTthKyspcj1lW2FdLHIuc3R5bGUmJih0JiYibm9uZSIhPT1yLnN0eWxlLmRpc3BsYXkmJiIiIT09ci5zdHlsZS5kaXNwbGF5fHwoci5zdHlsZS5kaXNwbGF5PXQ/b1thXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGV9ZnVuY3Rpb24gTyhlLHQsbixyLGkpe3JldHVybiBuZXcgTy5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfWZ1bmN0aW9uIGsoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe0t0PXZvaWQgMH0pLEt0PWV0Lm5vdygpfWZ1bmN0aW9uICQoZSx0KXt2YXIgbixyPTAsaT17aGVpZ2h0OmV9O2Zvcih0PXQ/MTowOzQ+cjtyKz0yLXQpbj1FdFtyXSxpWyJtYXJnaW4iK25dPWlbInBhZGRpbmciK25dPWU7cmV0dXJuIHQmJihpLm9wYWNpdHk9aS53aWR0aD1lKSxpfWZ1bmN0aW9uIEQoZSx0LG4pe2Zvcih2YXIgcixpPShyblt0XXx8W10pLmNvbmNhdChyblsiKiJdKSxvPTAsYT1pLmxlbmd0aDthPm87bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBMKGUsdCxuKXt2YXIgcixpLG8sYSxzLGwsdSxjLHA9dGhpcyxoPXt9LGY9ZS5zdHlsZSxkPWUubm9kZVR5cGUmJmp0KGUpLG09dnQuZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChzPWV0Ll9xdWV1ZUhvb2tzKGUsImZ4IiksbnVsbD09cy51bnF1ZXVlZCYmKHMudW5xdWV1ZWQ9MCxsPXMuZW1wdHkuZmlyZSxzLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtzLnVucXVldWVkfHxsKCl9KSxzLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe3MudW5xdWV1ZWQtLSxldC5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8cy5lbXB0eS5maXJlKCl9KX0pKSwxPT09ZS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gdHx8IndpZHRoImluIHQpJiYobi5vdmVyZmxvdz1bZi5vdmVyZmxvdyxmLm92ZXJmbG93WCxmLm92ZXJmbG93WV0sdT1ldC5jc3MoZSwiZGlzcGxheSIpLGM9Im5vbmUiPT09dT92dC5nZXQoZSwib2xkZGlzcGxheSIpfHx4KGUubm9kZU5hbWUpOnUsImlubGluZSI9PT1jJiYibm9uZSI9PT1ldC5jc3MoZSwiZmxvYXQiKSYmKGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihmLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7Zi5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGYub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0sZi5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKTtmb3IociBpbiB0KWlmKGk9dFtyXSxadC5leGVjKGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGQ/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWl8fCFtfHx2b2lkIDA9PT1tW3JdKWNvbnRpbnVlO2Q9ITB9aFtyXT1tJiZtW3JdfHxldC5zdHlsZShlLHIpfWVsc2UgdT12b2lkIDA7aWYoZXQuaXNFbXB0eU9iamVjdChoKSkiaW5saW5lIj09PSgibm9uZSI9PT11P3goZS5ub2RlTmFtZSk6dSkmJihmLmRpc3BsYXk9dSk7ZWxzZXttPyJoaWRkZW4iaW4gbSYmKGQ9bS5oaWRkZW4pOm09dnQuYWNjZXNzKGUsImZ4c2hvdyIse30pLG8mJihtLmhpZGRlbj0hZCksZD9ldChlKS5zaG93KCk6cC5kb25lKGZ1bmN0aW9uKCl7ZXQoZSkuaGlkZSgpfSkscC5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7dnQucmVtb3ZlKGUsImZ4c2hvdyIpO2Zvcih0IGluIGgpZXQuc3R5bGUoZSx0LGhbdF0pfSk7Zm9yKHIgaW4gaClhPUQoZD9tW3JdOjAscixwKSxyIGluIG18fChtW3JdPWEuc3RhcnQsZCYmKGEuZW5kPWEuc3RhcnQsYS5zdGFydD0id2lkdGgiPT09cnx8ImhlaWdodCI9PT1yPzE6MCkpfX1mdW5jdGlvbiBOKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKHI9ZXQuY2FtZWxDYXNlKG4pLGk9dFtyXSxvPWVbbl0sZXQuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLGE9ZXQuY3NzSG9va3Nbcl0sYSYmImV4cGFuZCJpbiBhKXtvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdO2ZvcihuIGluIG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9ZnVuY3Rpb24gUChlLHQsbil7dmFyIHIsaSxvPTAsYT1ubi5sZW5ndGgscz1ldC5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBsLmVsZW19KSxsPWZ1bmN0aW9uKCl7aWYoaSlyZXR1cm4hMTtmb3IodmFyIHQ9S3R8fGsoKSxuPU1hdGgubWF4KDAsdS5zdGFydFRpbWUrdS5kdXJhdGlvbi10KSxyPW4vdS5kdXJhdGlvbnx8MCxvPTEtcixhPTAsbD11LnR3ZWVucy5sZW5ndGg7bD5hO2ErKyl1LnR3ZWVuc1thXS5ydW4obyk7cmV0dXJuIHMubm90aWZ5V2l0aChlLFt1LG8sbl0pLDE+byYmbD9uOihzLnJlc29sdmVXaXRoKGUsW3VdKSwhMSl9LHU9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6ZXQuZXh0ZW5kKHt9LHQpLG9wdHM6ZXQuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6S3R8fGsoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPWV0LlR3ZWVuKGUsdS5vcHRzLHQsbix1Lm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8dS5vcHRzLmVhc2luZyk7cmV0dXJuIHUudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD91LnR3ZWVucy5sZW5ndGg6MDtpZihpKXJldHVybiB0aGlzO2ZvcihpPSEwO3I+bjtuKyspdS50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0P3MucmVzb2x2ZVdpdGgoZSxbdSx0XSk6cy5yZWplY3RXaXRoKGUsW3UsdF0pLHRoaXN9fSksYz11LnByb3BzO2ZvcihOKGMsdS5vcHRzLnNwZWNpYWxFYXNpbmcpO2E+bztvKyspaWYocj1ubltvXS5jYWxsKHUsZSxjLHUub3B0cykpcmV0dXJuIHI7cmV0dXJuIGV0Lm1hcChjLEQsdSksZXQuaXNGdW5jdGlvbih1Lm9wdHMuc3RhcnQpJiZ1Lm9wdHMuc3RhcnQuY2FsbChlLHUpLGV0LmZ4LnRpbWVyKGV0LmV4dGVuZChsLHtlbGVtOmUsYW5pbTp1LHF1ZXVlOnUub3B0cy5xdWV1ZX0pKSx1LnByb2dyZXNzKHUub3B0cy5wcm9ncmVzcykuZG9uZSh1Lm9wdHMuZG9uZSx1Lm9wdHMuY29tcGxldGUpLmZhaWwodS5vcHRzLmZhaWwpLmFsd2F5cyh1Lm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBJKGUpe3JldHVybiBmdW5jdGlvbih0LG4peyJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSIqIik7dmFyIHIsaT0wLG89dC50b0xvd2VyQ2FzZSgpLm1hdGNoKGR0KXx8W107aWYoZXQuaXNGdW5jdGlvbihuKSlmb3IoO3I9b1tpKytdOykiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIFIoZSx0LG4scil7ZnVuY3Rpb24gaShzKXt2YXIgbDtyZXR1cm4gb1tzXT0hMCxldC5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIHU9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB1fHxhfHxvW3VdP2E/IShsPXUpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdCh1KSxpKHUpLCExKX0pLGx9dmFyIG89e30sYT1lPT09eG47cmV0dXJuIGkodC5kYXRhVHlwZXNbMF0pfHwhb1siKiJdJiZpKCIqIil9ZnVuY3Rpb24gTShlLHQpe3ZhciBuLHIsaT1ldC5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmZXQuZXh0ZW5kKCEwLGUsciksZX1mdW5jdGlvbiBVKGUsdCxuKXtmb3IodmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLGw9ZS5kYXRhVHlwZXM7IioiPT09bFswXTspbC5zaGlmdCgpLHZvaWQgMD09PXImJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KHIpKXtsLnVuc2hpZnQoaSk7YnJlYWt9aWYobFswXWluIG4pbz1sWzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIWxbMF18fGUuY29udmVydGVyc1tpKyIgIitsWzBdXSl7bz1pO2JyZWFrfWF8fChhPWkpfW89b3x8YX1yZXR1cm4gbz8obyE9PWxbMF0mJmwudW5zaGlmdChvKSxuW29dKTp2b2lkIDB9ZnVuY3Rpb24gSChlLHQsbixyKXt2YXIgaSxvLGEscyxsLHU9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKXVbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07Zm9yKG89Yy5zaGlmdCgpO287KWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCFsJiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSxsPW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPWw7ZWxzZSBpZigiKiIhPT1sJiZsIT09byl7aWYoYT11W2wrIiAiK29dfHx1WyIqICIrb10sIWEpZm9yKGkgaW4gdSlpZihzPWkuc3BsaXQoIiAiKSxzWzFdPT09byYmKGE9dVtsKyIgIitzWzBdXXx8dVsiKiAiK3NbMF1dKSl7YT09PSEwP2E9dVtpXTp1W2ldIT09ITAmJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZihhIT09ITApaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChwKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP3A6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK2wrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19ZnVuY3Rpb24gRihlLHQsbixyKXt2YXIgaTtpZihldC5pc0FycmF5KHQpKWV0LmVhY2godCxmdW5jdGlvbih0LGkpe258fFRuLnRlc3QoZSk/cihlLGkpOkYoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PWV0LnR5cGUodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClGKGUrIlsiK2krIl0iLHRbaV0sbixyKX1mdW5jdGlvbiBCKGUpe3JldHVybiBldC5pc1dpbmRvdyhlKT9lOjk9PT1lLm5vZGVUeXBlJiZlLmRlZmF1bHRWaWV3fXZhciBxPVtdLHo9cS5zbGljZSxWPXEuY29uY2F0LFc9cS5wdXNoLEo9cS5pbmRleE9mLFk9e30sUT1ZLnRvU3RyaW5nLFg9WS5oYXNPd25Qcm9wZXJ0eSxLPXt9LEc9dC5kb2N1bWVudCxaPSIyLjEuMyIsZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGV0LmZuLmluaXQoZSx0KX0sdHQ9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG50PS9eLW1zLS8scnQ9Ly0oW1xkYS16XSkvZ2ksaXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfTtldC5mbj1ldC5wcm90b3R5cGU9e2pxdWVyeTpaLGNvbnN0cnVjdG9yOmV0LHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gei5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/MD5lP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXTp6LmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD1ldC5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHQuY29udGV4dD10aGlzLmNvbnRleHQsdH0sZWFjaDpmdW5jdGlvbihlLHQpe3JldHVybiBldC5lYWNoKHRoaXMsZSx0KX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhldC5tYXAodGhpcyxmdW5jdGlvbih0LG4pe3JldHVybiBlLmNhbGwodCxuLHQpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayh6LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKDA+ZT90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZ0Pm4/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpXLHNvcnQ6cS5zb3J0LHNwbGljZTpxLnNwbGljZX0sZXQuZXh0ZW5kPWV0LmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxhPWFyZ3VtZW50c1swXXx8e30scz0xLGw9YXJndW1lbnRzLmxlbmd0aCx1PSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYodT1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8ZXQuaXNGdW5jdGlvbihhKXx8KGE9e30pLHM9PT1sJiYoYT10aGlzLHMtLSk7bD5zO3MrKylpZihudWxsIT0oZT1hcmd1bWVudHNbc10pKWZvcih0IGluIGUpbj1hW3RdLHI9ZVt0XSxhIT09ciYmKHUmJnImJihldC5pc1BsYWluT2JqZWN0KHIpfHwoaT1ldC5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZldC5pc0FycmF5KG4pP246W10pOm89biYmZXQuaXNQbGFpbk9iamVjdChuKT9uOnt9LGFbdF09ZXQuZXh0ZW5kKHUsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSxldC5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKForTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09PWV0LnR5cGUoZSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheSxpc1dpbmRvdzpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oZSl7cmV0dXJuIWV0LmlzQXJyYXkoZSkmJmUtcGFyc2VGbG9hdChlKSsxPj0wfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiIT09ZXQudHlwZShlKXx8ZS5ub2RlVHlwZXx8ZXQuaXNXaW5kb3coZSk/ITE6ZS5jb25zdHJ1Y3RvciYmIVguY2FsbChlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpPyExOiEwfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP1lbUS5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsbj1ldmFsO2U9ZXQudHJpbShlKSxlJiYoMT09PWUuaW5kZXhPZigidXNlIHN0cmljdCIpPyh0PUcuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksdC50ZXh0PWUsRy5oZWFkLmFwcGVuZENoaWxkKHQpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCkpOm4oZSkpfSxjYW1lbENhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShudCwibXMtIikucmVwbGFjZShydCxpdCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihlLHQsbil7dmFyIGksbz0wLGE9ZS5sZW5ndGgscz1yKGUpO2lmKG4pe2lmKHMpZm9yKDthPm8mJihpPXQuYXBwbHkoZVtvXSxuKSxpIT09ITEpO28rKyk7ZWxzZSBmb3IobyBpbiBlKWlmKGk9dC5hcHBseShlW29dLG4pLGk9PT0hMSlicmVha31lbHNlIGlmKHMpZm9yKDthPm8mJihpPXQuY2FsbChlW29dLG8sZVtvXSksaSE9PSExKTtvKyspO2Vsc2UgZm9yKG8gaW4gZSlpZihpPXQuY2FsbChlW29dLG8sZVtvXSksaT09PSExKWJyZWFrO3JldHVybiBlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKHR0LCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihyKE9iamVjdChlKSk/ZXQubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOlcuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTpKLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7bj5yO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aCxzPSFuO2E+bztvKyspcj0hdChlW29dLG8pLHIhPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIGksbz0wLGE9ZS5sZW5ndGgscz1yKGUpLGw9W107aWYocylmb3IoO2E+bztvKyspaT10KGVbb10sbyxuKSxudWxsIT1pJiZsLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKWk9dChlW29dLG8sbiksbnVsbCE9aSYmbC5wdXNoKGkpO3JldHVybiBWLmFwcGx5KFtdLGwpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLGV0LmlzRnVuY3Rpb24oZSk/KHI9ei5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdCh6LmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8ZXQuZ3VpZCsrLGkpOnZvaWQgMH0sbm93OkRhdGUubm93LHN1cHBvcnQ6S30pLGV0LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtZWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBvdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCxuLHIpe3ZhciBpLG8sYSxzLGwsdSxwLGYsZCxtO2lmKCh0P3Qub3duZXJEb2N1bWVudHx8dDpIKSE9PUQmJiQodCksdD10fHxELG49bnx8W10scz10Lm5vZGVUeXBlLCJzdHJpbmciIT10eXBlb2YgZXx8IWV8fDEhPT1zJiY5IT09cyYmMTEhPT1zKXJldHVybiBuO2lmKCFyJiZOKXtpZigxMSE9PXMmJihpPXZ0LmV4ZWMoZSkpKWlmKGE9aVsxXSl7aWYoOT09PXMpe2lmKG89dC5nZXRFbGVtZW50QnlJZChhKSwhb3x8IW8ucGFyZW50Tm9kZSlyZXR1cm4gbjtpZihvLmlkPT09YSlyZXR1cm4gbi5wdXNoKG8pLG59ZWxzZSBpZih0Lm93bmVyRG9jdW1lbnQmJihvPXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSkmJk0odCxvKSYmby5pZD09PWEpcmV0dXJuIG4ucHVzaChvKSxufWVsc2V7aWYoaVsyXSlyZXR1cm4gRy5hcHBseShuLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLG47aWYoKGE9aVszXSkmJnguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gRy5hcHBseShuLHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKSksbn1pZih4LnFzYSYmKCFQfHwhUC50ZXN0KGUpKSl7aWYoZj1wPVUsZD10LG09MSE9PXMmJmUsMT09PXMmJiJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtmb3IodT1DKGUpLChwPXQuZ2V0QXR0cmlidXRlKCJpZCIpKT9mPXAucmVwbGFjZSh3dCwiXFwkJiIpOnQuc2V0QXR0cmlidXRlKCJpZCIsZiksZj0iW2lkPSciK2YrIiddICIsbD11Lmxlbmd0aDtsLS07KXVbbF09ZitoKHVbbF0pO2Q9YnQudGVzdChlKSYmYyh0LnBhcmVudE5vZGUpfHx0LG09dS5qb2luKCIsIil9aWYobSl0cnl7cmV0dXJuIEcuYXBwbHkobixkLnF1ZXJ5U2VsZWN0b3JBbGwobSkpLG59Y2F0Y2goZyl7fWZpbmFsbHl7cHx8dC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gUyhlLnJlcGxhY2UobHQsIiQxIiksdCxuLHIpfWZ1bmN0aW9uIG4oKXtmdW5jdGlvbiBlKG4scil7cmV0dXJuIHQucHVzaChuKyIgIik+QS5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbdC5zaGlmdCgpXSxlW24rIiAiXT1yfXZhciB0PVtdO3JldHVybiBlfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGVbVV09ITAsZX1mdW5jdGlvbiBpKGUpe3ZhciB0PUQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gbyhlLHQpe2Zvcih2YXIgbj1lLnNwbGl0KCJ8Iikscj1lLmxlbmd0aDtyLS07KUEuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIGEoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiYofnQuc291cmNlSW5kZXh8fEopLSh+ZS5zb3VyY2VJbmRleHx8Sik7aWYocilyZXR1cm4gcjtpZihuKWZvcig7bj1uLm5leHRTaWJsaW5nOylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09biYmdC50eXBlPT09ZX19ZnVuY3Rpb24gbChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gdShlKXtyZXR1cm4gcihmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxyKGZ1bmN0aW9uKG4scil7Zm9yKHZhciBpLG89ZShbXSxuLmxlbmd0aCx0KSxhPW8ubGVuZ3RoO2EtLTspbltpPW9bYV1dJiYobltpXT0hKHJbaV09bltpXSkpfSl9KX1mdW5jdGlvbiBjKGUpe3JldHVybiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9ZnVuY3Rpb24gcCgpe31mdW5jdGlvbiBoKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjtuPnQ7dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gZihlLHQsbil7dmFyIHI9dC5kaXIsaT1uJiYicGFyZW50Tm9kZSI9PT1yLG89QisrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixvKXtmb3IoO3Q9dFtyXTspaWYoMT09PXQubm9kZVR5cGV8fGkpcmV0dXJuIGUodCxuLG8pfTpmdW5jdGlvbih0LG4sYSl7dmFyIHMsbCx1PVtGLG9dO2lmKGEpe2Zvcig7dD10W3JdOylpZigoMT09PXQubm9kZVR5cGV8fGkpJiZlKHQsbixhKSlyZXR1cm4hMH1lbHNlIGZvcig7dD10W3JdOylpZigxPT09dC5ub2RlVHlwZXx8aSl7aWYobD10W1VdfHwodFtVXT17fSksKHM9bFtyXSkmJnNbMF09PT1GJiZzWzFdPT09bylyZXR1cm4gdVsyXT1zWzJdO2lmKGxbcl09dSx1WzJdPWUodCxuLGEpKXJldHVybiEwfX19ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7Zm9yKHZhciBpPWUubGVuZ3RoO2ktLTspaWYoIWVbaV0odCxuLHIpKXJldHVybiExO3JldHVybiEwfTplWzBdfWZ1bmN0aW9uIG0oZSxuLHIpe2Zvcih2YXIgaT0wLG89bi5sZW5ndGg7bz5pO2krKyl0KGUsbltpXSxyKTtyZXR1cm4gcn1mdW5jdGlvbiBnKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLGw9ZS5sZW5ndGgsdT1udWxsIT10O2w+cztzKyspKG89ZVtzXSkmJighbnx8bihvLHIsaSkpJiYoYS5wdXNoKG8pLHUmJnQucHVzaChzKSk7cmV0dXJuIGF9ZnVuY3Rpb24geShlLHQsbixpLG8sYSl7cmV0dXJuIGkmJiFpW1VdJiYoaT15KGkpKSxvJiYhb1tVXSYmKG89eShvLGEpKSxyKGZ1bmN0aW9uKHIsYSxzLGwpe3ZhciB1LGMscCxoPVtdLGY9W10sZD1hLmxlbmd0aCx5PXJ8fG0odHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHY9IWV8fCFyJiZ0P3k6Zyh5LGgsZSxzLGwpLGI9bj9vfHwocj9lOmR8fGkpP1tdOmE6djtpZihuJiZuKHYsYixzLGwpLGkpZm9yKHU9ZyhiLGYpLGkodSxbXSxzLGwpLGM9dS5sZW5ndGg7Yy0tOykocD11W2NdKSYmKGJbZltjXV09ISh2W2ZbY11dPXApKTtpZihyKXtpZihvfHxlKXtpZihvKXtmb3IodT1bXSxjPWIubGVuZ3RoO2MtLTspKHA9YltjXSkmJnUucHVzaCh2W2NdPXApO28obnVsbCxiPVtdLHUsbCl9Zm9yKGM9Yi5sZW5ndGg7Yy0tOykocD1iW2NdKSYmKHU9bz9ldChyLHApOmhbY10pPi0xJiYoclt1XT0hKGFbdV09cCkpfX1lbHNlIGI9ZyhiPT09YT9iLnNwbGljZShkLGIubGVuZ3RoKTpiKSxvP28obnVsbCxhLGIsbCk6Ry5hcHBseShhLGIpfSl9ZnVuY3Rpb24gdihlKXtmb3IodmFyIHQsbixyLGk9ZS5sZW5ndGgsbz1BLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxBLnJlbGF0aXZlWyIgIl0scz1vPzE6MCxsPWYoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSxhLCEwKSx1PWYoZnVuY3Rpb24oZSl7cmV0dXJuIGV0KHQsZSk+LTF9LGEsITApLGM9W2Z1bmN0aW9uKGUsbixyKXt2YXIgaT0hbyYmKHJ8fG4hPT1fKXx8KCh0PW4pLm5vZGVUeXBlP2woZSxuLHIpOnUoZSxuLHIpKTtyZXR1cm4gdD1udWxsLGl9XTtpPnM7cysrKWlmKG49QS5yZWxhdGl2ZVtlW3NdLnR5cGVdKWM9W2YoZChjKSxuKV07ZWxzZXtpZihuPUEuZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpLG5bVV0pe2ZvcihyPSsrcztpPnImJiFBLnJlbGF0aXZlW2Vbcl0udHlwZV07cisrKTtyZXR1cm4geShzPjEmJmQoYykscz4xJiZoKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UobHQsIiQxIiksbixyPnMmJnYoZS5zbGljZShzLHIpKSxpPnImJnYoZT1lLnNsaWNlKHIpKSxpPnImJmgoZSkpfWMucHVzaChuKX1yZXR1cm4gZChjKX1mdW5jdGlvbiBiKGUsbil7dmFyIGk9bi5sZW5ndGg+MCxvPWUubGVuZ3RoPjAsYT1mdW5jdGlvbihyLGEscyxsLHUpe3ZhciBjLHAsaCxmPTAsZD0iMCIsbT1yJiZbXSx5PVtdLHY9XyxiPXJ8fG8mJkEuZmluZC5UQUcoIioiLHUpLHc9Ris9bnVsbD09dj8xOk1hdGgucmFuZG9tKCl8fC4xLHg9Yi5sZW5ndGg7Zm9yKHUmJihfPWEhPT1EJiZhKTtkIT09eCYmbnVsbCE9KGM9YltkXSk7ZCsrKXtpZihvJiZjKXtmb3IocD0wO2g9ZVtwKytdOylpZihoKGMsYSxzKSl7bC5wdXNoKGMpO2JyZWFrfXUmJihGPXcpfWkmJigoYz0haCYmYykmJmYtLSxyJiZtLnB1c2goYykpfWlmKGYrPWQsaSYmZCE9PWYpe2ZvcihwPTA7aD1uW3ArK107KWgobSx5LGEscyk7aWYocil7aWYoZj4wKWZvcig7ZC0tOyltW2RdfHx5W2RdfHwoeVtkXT1YLmNhbGwobCkpO3k9Zyh5KX1HLmFwcGx5KGwseSksdSYmIXImJnkubGVuZ3RoPjAmJmYrbi5sZW5ndGg+MSYmdC51bmlxdWVTb3J0KGwpfXJldHVybiB1JiYoRj13LF89diksbX07cmV0dXJuIGk/cihhKTphfXZhciB3LHgsQSxFLGosQyxULFMsXyxPLGssJCxELEwsTixQLEksUixNLFU9InNpenpsZSIrMSpuZXcgRGF0ZSxIPWUuZG9jdW1lbnQsRj0wLEI9MCxxPW4oKSx6PW4oKSxWPW4oKSxXPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYoaz0hMCksMH0sSj0xPDwzMSxZPXt9Lmhhc093blByb3BlcnR5LFE9W10sWD1RLnBvcCxLPVEucHVzaCxHPVEucHVzaCxaPVEuc2xpY2UsZXQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO3I+bjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LHR0PSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsbnQ9IltcXHgyMFxcdFxcclxcblxcZl0iLHJ0PSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsaXQ9cnQucmVwbGFjZSgidyIsIncjIiksb3Q9IlxcWyIrbnQrIiooIitydCsiKSg/OiIrbnQrIiooWypeJHwhfl0/PSkiK250KyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIraXQrIikpfCkiK250KyIqXFxdIixhdD0iOigiK3J0KyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitvdCsiKSopfC4qKVxcKXwpIixzdD1uZXcgUmVnRXhwKG50KyIrIiwiZyIpLGx0PW5ldyBSZWdFeHAoIl4iK250KyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK250KyIrJCIsImciKSx1dD1uZXcgUmVnRXhwKCJeIitudCsiKiwiK250KyIqIiksY3Q9bmV3IFJlZ0V4cCgiXiIrbnQrIiooWz4rfl18IitudCsiKSIrbnQrIioiKSxwdD1uZXcgUmVnRXhwKCI9IitudCsiKihbXlxcXSdcIl0qPykiK250KyIqXFxdIiwiZyIpLGh0PW5ldyBSZWdFeHAoYXQpLGZ0PW5ldyBSZWdFeHAoIl4iK2l0KyIkIiksZHQ9e0lEOm5ldyBSZWdFeHAoIl4jKCIrcnQrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrcnQrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK3J0LnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpuZXcgUmVnRXhwKCJeIitvdCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK2F0KSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK250KyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitudCsiKig/OihbKy1dfCkiK250KyIqKFxcZCspfCkpIitudCsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrdHQrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitudCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitudCsiKigoPzotXFxkKT9cXGQqKSIrbnQrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LG10PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksZ3Q9L15oXGQkL2kseXQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLHZ0PS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYnQ9L1srfl0vLHd0PS8nfFxcL2cseHQ9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitudCsiP3woIitudCsiKXwuKSIsImlnIiksQXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIweCIrdC02NTUzNjtyZXR1cm4gciE9PXJ8fG4/dDowPnI/U3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKHI+PjEwfDU1Mjk2LDEwMjMmcnw1NjMyMCl9LEV0PWZ1bmN0aW9uKCl7JCgpfTt0cnl7Ry5hcHBseShRPVouY2FsbChILmNoaWxkTm9kZXMpLEguY2hpbGROb2RlcyksUVtILmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChqdCl7Rz17YXBwbHk6US5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtLLmFwcGx5KGUsWi5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgscj0wO2VbbisrXT10W3IrK107KTtlLmxlbmd0aD1uLTF9fX14PXQuc3VwcG9ydD17fSxqPXQuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmKGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiB0PyJIVE1MIiE9PXQubm9kZU5hbWU6ITF9LCQ9dC5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9ZT9lLm93bmVyRG9jdW1lbnR8fGU6SDtyZXR1cm4gciE9PUQmJjk9PT1yLm5vZGVUeXBlJiZyLmRvY3VtZW50RWxlbWVudD8oRD1yLEw9ci5kb2N1bWVudEVsZW1lbnQsbj1yLmRlZmF1bHRWaWV3LG4mJm4hPT1uLnRvcCYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsRXQsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixFdCkpLE49IWoocikseC5hdHRyaWJ1dGVzPWkoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSkseC5nZXRFbGVtZW50c0J5VGFnTmFtZT1pKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKHIuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSkseC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPXl0LnRlc3Qoci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSx4LmdldEJ5SWQ9aShmdW5jdGlvbihlKXtyZXR1cm4gTC5hcHBlbmRDaGlsZChlKS5pZD1VLCFyLmdldEVsZW1lbnRzQnlOYW1lfHwhci5nZXRFbGVtZW50c0J5TmFtZShVKS5sZW5ndGh9KSx4LmdldEJ5SWQ/KEEuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmTil7dmFyIG49dC5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gbiYmbi5wYXJlbnROb2RlP1tuXTpbXX19LEEuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh4dCxBdCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSk6KGRlbGV0ZSBBLmZpbmQuSUQsQS5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHh0LEF0KTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PXR9fSksQS5maW5kLlRBRz14LmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6eC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7Zm9yKDtuPW9baSsrXTspMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sQS5maW5kLkNMQVNTPXguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtyZXR1cm4gTj90LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSk6dm9pZCAwfSxJPVtdLFA9W10sKHgucXNhPXl0LnRlc3Qoci5xdWVyeVNlbGVjdG9yQWxsKSkmJihpKGZ1bmN0aW9uKGUpe0wuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitVKyInPjwvYT48c2VsZWN0IGlkPSciK1UrIi1cZl0nIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoJiZQLnB1c2goIlsqXiRdPSIrbnQrIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8UC5wdXNoKCJcXFsiK250KyIqKD86dmFsdWV8Iit0dCsiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK1UrIi1dIikubGVuZ3RofHxQLnB1c2goIn49IiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8UC5wdXNoKCI6Y2hlY2tlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiYSMiK1UrIisqIikubGVuZ3RofHxQLnB1c2goIi4jLitbK35dIil9KSxpKGZ1bmN0aW9uKGUpe3ZhciB0PXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJlAucHVzaCgibmFtZSIrbnQrIipbKl4kfCF+XT89IiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8UC5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLFAucHVzaCgiLC4qOiIpfSkpLCh4Lm1hdGNoZXNTZWxlY3Rvcj15dC50ZXN0KFI9TC5tYXRjaGVzfHxMLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8TC5tb3pNYXRjaGVzU2VsZWN0b3J8fEwub01hdGNoZXNTZWxlY3Rvcnx8TC5tc01hdGNoZXNTZWxlY3RvcikpJiZpKGZ1bmN0aW9uKGUpe3guZGlzY29ubmVjdGVkTWF0Y2g9Ui5jYWxsKGUsImRpdiIpLFIuY2FsbChlLCJbcyE9JyddOngiKSxJLnB1c2goIiE9IixhdCl9KSxQPVAubGVuZ3RoJiZuZXcgUmVnRXhwKFAuam9pbigifCIpKSxJPUkubGVuZ3RoJiZuZXcgUmVnRXhwKEkuam9pbigifCIpKSx0PXl0LnRlc3QoTC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksTT10fHx5dC50ZXN0KEwuY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodClmb3IoO3Q9dC5wYXJlbnROb2RlOylpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sVz10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGs9ITAsMDt2YXIgbj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gbj9uOihuPShlLm93bmVyRG9jdW1lbnR8fGUpPT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxLDEmbnx8IXguc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09bj9lPT09cnx8ZS5vd25lckRvY3VtZW50PT09SCYmTShILGUpPy0xOnQ9PT1yfHx0Lm93bmVyRG9jdW1lbnQ9PT1IJiZNKEgsdCk/MTpPP2V0KE8sZSktZXQoTyx0KTowOjQmbj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gaz0hMCwwO3ZhciBuLGk9MCxvPWUucGFyZW50Tm9kZSxzPXQucGFyZW50Tm9kZSxsPVtlXSx1PVt0XTtpZighb3x8IXMpcmV0dXJuIGU9PT1yPy0xOnQ9PT1yPzE6bz8tMTpzPzE6Tz9ldChPLGUpLWV0KE8sdCk6MDtpZihvPT09cylyZXR1cm4gYShlLHQpO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KWwudW5zaGlmdChuKTtmb3Iobj10O249bi5wYXJlbnROb2RlOyl1LnVuc2hpZnQobik7Zm9yKDtsW2ldPT09dVtpXTspaSsrO3JldHVybiBpP2EobFtpXSx1W2ldKTpsW2ldPT09SD8tMTp1W2ldPT09SD8xOjB9LHIpOkR9LHQubWF0Y2hlcz1mdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbnVsbCxudWxsLG4pfSx0Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLG4pe2lmKChlLm93bmVyRG9jdW1lbnR8fGUpIT09RCYmJChlKSxuPW4ucmVwbGFjZShwdCwiPSckMSddIiksISgheC5tYXRjaGVzU2VsZWN0b3J8fCFOfHxJJiZJLnRlc3Qobil8fFAmJlAudGVzdChuKSkpdHJ5e3ZhciByPVIuY2FsbChlLG4pO2lmKHJ8fHguZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaChpKXt9cmV0dXJuIHQobixELG51bGwsW2VdKS5sZW5ndGg+MH0sdC5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09RCYmJChlKSxNKGUsdCl9LHQuYXR0cj1mdW5jdGlvbihlLHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT09RCYmJChlKTt2YXIgbj1BLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxyPW4mJlkuY2FsbChBLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9uKGUsdCwhTik6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1yP3I6eC5hdHRyaWJ1dGVzfHwhTj9lLmdldEF0dHJpYnV0ZSh0KToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9LHQuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSx0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGs9IXguZGV0ZWN0RHVwbGljYXRlcyxPPSF4LnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KFcpLGspe2Zvcig7dD1lW2krK107KXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO2Zvcig7ci0tOyllLnNwbGljZShuW3JdLDEpfXJldHVybiBPPW51bGwsZX0sRT10LmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPUUoZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2UgZm9yKDt0PWVbcisrXTspbis9RSh0KTtyZXR1cm4gbn0sQT10LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOnIsbWF0Y2g6ZHQsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh4dCxBdCksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoeHQsQXQpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHx0LmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJnQuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG49IWVbNl0mJmVbMl07cmV0dXJuIGR0LkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJmh0LnRlc3QobikmJih0PUMobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHh0LEF0KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1xW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitudCsiKSIrZSsiKCIrbnQrInwkKSIpKSYmcShlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihlLG4scil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBvPXQuYXR0cihpLGUpO3JldHVybiBudWxsPT1vPyIhPSI9PT1uOm4/KG8rPSIiLCI9Ij09PW4/bz09PXI6IiE9Ij09PW4/byE9PXI6Il49Ij09PW4/ciYmMD09PW8uaW5kZXhPZihyKToiKj0iPT09bj9yJiZvLmluZGV4T2Yocik+LTE6IiQ9Ij09PW4/ciYmby5zbGljZSgtci5sZW5ndGgpPT09cjoifj0iPT09bj8oIiAiK28ucmVwbGFjZShzdCwiICIpKyIgIikuaW5kZXhPZihyKT4tMToifD0iPT09bj9vPT09cnx8by5zbGljZSgwLHIubGVuZ3RoKzEpPT09cisiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz0ibnRoIiE9PWUuc2xpY2UoMCwzKSxhPSJsYXN0IiE9PWUuc2xpY2UoLTQpLHM9Im9mLXR5cGUiPT09dDtyZXR1cm4gMT09PXImJjA9PT1pP2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbih0LG4sbCl7dmFyIHUsYyxwLGgsZixkLG09byE9PWE/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixnPXQucGFyZW50Tm9kZSx5PXMmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx2PSFsJiYhcztpZihnKXtpZihvKXtmb3IoO207KXtmb3IocD10O3A9cFttXTspaWYocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2Q9bT0ib25seSI9PT1lJiYhZCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihkPVthP2cuZmlyc3RDaGlsZDpnLmxhc3RDaGlsZF0sYSYmdil7Zm9yKGM9Z1tVXXx8KGdbVV09e30pLHU9Y1tlXXx8W10sZj11WzBdPT09RiYmdVsxXSxoPXVbMF09PT1GJiZ1WzJdLHA9ZiYmZy5jaGlsZE5vZGVzW2ZdO3A9KytmJiZwJiZwW21dfHwoaD1mPTApfHxkLnBvcCgpOylpZigxPT09cC5ub2RlVHlwZSYmKytoJiZwPT09dCl7Y1tlXT1bRixmLGhdO2JyZWFrfX1lbHNlIGlmKHYmJih1PSh0W1VdfHwodFtVXT17fSkpW2VdKSYmdVswXT09PUYpaD11WzFdO2Vsc2UgZm9yKDsocD0rK2YmJnAmJnBbbV18fChoPWY9MCl8fGQucG9wKCkpJiYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09eToxIT09cC5ub2RlVHlwZSl8fCErK2h8fCh2JiYoKHBbVV18fChwW1VdPXt9KSlbZV09W0YsaF0pLHAhPT10KSk7KTtyZXR1cm4gaC09aSxoPT09cnx8aCVyPT09MCYmaC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLG4pe3ZhciBpLG89QS5wc2V1ZG9zW2VdfHxBLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8dC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBvW1VdP28obik6by5sZW5ndGg+MT8oaT1bZSxlLCIiLG5dLEEuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP3IoZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIsaT1vKGUsbiksYT1pLmxlbmd0aDthLS07KXI9ZXQoZSxpW2FdKSxlW3JdPSEodFtyXT1pW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBvKGUsMCxpKX0pOm99fSxwc2V1ZG9zOntub3Q6cihmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLGk9VChlLnJlcGxhY2UobHQsIiQxIikpO3JldHVybiBpW1VdP3IoZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBvLGE9aShlLG51bGwscixbXSkscz1lLmxlbmd0aDtzLS07KShvPWFbc10pJiYoZVtzXT0hKHRbc109bykpfSk6ZnVuY3Rpb24oZSxyLG8pe3JldHVybiB0WzBdPWUsaSh0LG51bGwsbyxuKSx0WzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOnIoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbikubGVuZ3RoPjB9fSksY29udGFpbnM6cihmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoeHQsQXQpLGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8RSh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOnIoZnVuY3Rpb24oZSl7cmV0dXJuIGZ0LnRlc3QoZXx8IiIpfHx0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKHh0LEF0KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2RvIGlmKG49Tj90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIG49bi50b0xvd2VyQ2FzZSgpLG49PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKTt3aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1MfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUQuYWN0aXZlRWxlbWVudCYmKCFELmhhc0ZvY3VzfHxELmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworcmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsZS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIUEucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBndC50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gbXQudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dShmdW5jdGlvbihlLHQsbil7cmV0dXJuWzA+bj9uK3Q6bl19KSxldmVuOnUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6dShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wPm4/bit0Om47LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDp1KGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MD5uP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19LEEucHNldWRvcy5udGg9QS5wc2V1ZG9zLmVxO2Zvcih3IGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KUEucHNldWRvc1t3XT1zKHcpO2Zvcih3IGlue3N1Ym1pdDohMCxyZXNldDohMH0pQS5wc2V1ZG9zW3ddPWwodyk7cmV0dXJuIHAucHJvdG90eXBlPUEuZmlsdGVycz1BLnBzZXVkb3MsQS5zZXRGaWx0ZXJzPW5ldyBwLEM9dC50b2tlbml6ZT1mdW5jdGlvbihlLG4pe3ZhciByLGksbyxhLHMsbCx1LGM9eltlKyIgIl07aWYoYylyZXR1cm4gbj8wOmMuc2xpY2UoMCk7Zm9yKHM9ZSxsPVtdLHU9QS5wcmVGaWx0ZXI7czspeyghcnx8KGk9dXQuZXhlYyhzKSkpJiYoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLGwucHVzaChvPVtdKSkscj0hMSwoaT1jdC5leGVjKHMpKSYmKHI9aS5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6cix0eXBlOmlbMF0ucmVwbGFjZShsdCwiICIpfSkscz1zLnNsaWNlKHIubGVuZ3RoKSk7Zm9yKGEgaW4gQS5maWx0ZXIpIShpPWR0W2FdLmV4ZWMocykpfHx1W2FdJiYhKGk9dVthXShpKSl8fChyPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOnIsdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShyLmxlbmd0aCkpO2lmKCFyKWJyZWFrfXJldHVybiBuP3MubGVuZ3RoOnM/dC5lcnJvcihlKTp6KGUsbCkuc2xpY2UoMCl9LFQ9dC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89VltlKyIgIl07aWYoIW8pe2Zvcih0fHwodD1DKGUpKSxuPXQubGVuZ3RoO24tLTspbz12KHRbbl0pLG9bVV0/ci5wdXNoKG8pOmkucHVzaChvKTtvPVYoZSxiKGkscikpLG8uc2VsZWN0b3I9ZX1yZXR1cm4gb30sUz10LnNlbGVjdD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxsLHU9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUscD0hciYmQyhlPXUuc2VsZWN0b3J8fGUpO2lmKG49bnx8W10sMT09PXAubGVuZ3RoKXtpZihvPXBbMF09cFswXS5zbGljZSgwKSxvLmxlbmd0aD4yJiYiSUQiPT09KGE9b1swXSkudHlwZSYmeC5nZXRCeUlkJiY5PT09dC5ub2RlVHlwZSYmTiYmQS5yZWxhdGl2ZVtvWzFdLnR5cGVdKXtpZih0PShBLmZpbmQuSUQoYS5tYXRjaGVzWzBdLnJlcGxhY2UoeHQsQXQpLHQpfHxbXSlbMF0sIXQpcmV0dXJuIG47dSYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9Zm9yKGk9ZHQubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDtpLS0mJihhPW9baV0sIUEucmVsYXRpdmVbcz1hLnR5cGVdKTspaWYoKGw9QS5maW5kW3NdKSYmKHI9bChhLm1hdGNoZXNbMF0ucmVwbGFjZSh4dCxBdCksYnQudGVzdChvWzBdLnR5cGUpJiZjKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSxlPXIubGVuZ3RoJiZoKG8pLCFlKXJldHVybiBHLmFwcGx5KG4sciksbjticmVha319cmV0dXJuKHV8fFQoZSxwKSkocix0LCFOLG4sYnQudGVzdChlKSYmYyh0LnBhcmVudE5vZGUpfHx0KSxufSx4LnNvcnRTdGFibGU9VS5zcGxpdCgiIikuc29ydChXKS5qb2luKCIiKT09PVUseC5kZXRlY3REdXBsaWNhdGVzPSEhaywkKCkseC5zb3J0RGV0YWNoZWQ9aShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEQuY3JlYXRlRWxlbWVudCgiZGl2IikpfSksaShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxvKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/dm9pZCAwOmUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSx4LmF0dHJpYnV0ZXMmJmkoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bygidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnx8ImlucHV0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT92b2lkIDA6ZS5kZWZhdWx0VmFsdWV9KSxpKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxvKHR0LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gbj92b2lkIDA6ZVt0XT09PSEwP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSx0fSh0KTtldC5maW5kPW90LGV0LmV4cHI9b3Quc2VsZWN0b3JzLGV0LmV4cHJbIjoiXT1ldC5leHByLnBzZXVkb3MsZXQudW5pcXVlPW90LnVuaXF1ZVNvcnQsZXQudGV4dD1vdC5nZXRUZXh0LGV0LmlzWE1MRG9jPW90LmlzWE1MLGV0LmNvbnRhaW5zPW90LmNvbnRhaW5zO3ZhciBhdD1ldC5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxzdD0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLGx0PS9eLlteOiNcW1wuLF0qJC87ZXQuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP2V0LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOmV0LmZpbmQubWF0Y2hlcyhlLGV0LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LGV0LmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMubGVuZ3RoLHI9W10saT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soZXQoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDtuPnQ7dCsrKWlmKGV0LmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKHQ9MDtuPnQ7dCsrKWV0LmZpbmQoZSxpW3RdLHIpO3JldHVybiByPXRoaXMucHVzaFN0YWNrKG4+MT9ldC51bmlxdWUocik6ciksci5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2U6ZSxyfSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkodGhpcyxlfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkodGhpcyxlfHxbXSwhMCkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWkodGhpcywic3RyaW5nIj09dHlwZW9mIGUmJmF0LnRlc3QoZSk/ZXQoZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgdXQsY3Q9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxwdD1ldC5mbi5pbml0PWZ1bmN0aW9uKGUsdCl7dmFyIG4scjtpZighZSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKG49IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpjdC5leGVjKGUpLCFufHwhblsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fHV0KS5maW5kKGUpOnRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTtpZihuWzFdKXtpZih0PXQgaW5zdGFuY2VvZiBldD90WzBdOnQsZXQubWVyZ2UodGhpcyxldC5wYXJzZUhUTUwoblsxXSx0JiZ0Lm5vZGVUeXBlP3Qub3duZXJEb2N1bWVudHx8dDpHLCEwKSksc3QudGVzdChuWzFdKSYmZXQuaXNQbGFpbk9iamVjdCh0KSlmb3IobiBpbiB0KWV0LmlzRnVuY3Rpb24odGhpc1tuXSk/dGhpc1tuXSh0W25dKTp0aGlzLmF0dHIobix0W25dKTtyZXR1cm4gdGhpc31yZXR1cm4gcj1HLmdldEVsZW1lbnRCeUlkKG5bMl0pLHImJnIucGFyZW50Tm9kZSYmKHRoaXMubGVuZ3RoPTEsdGhpc1swXT1yKSx0aGlzLmNvbnRleHQ9Ryx0aGlzLnNlbGVjdG9yPWUsdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmV0LmlzRnVuY3Rpb24oZSk/InVuZGVmaW5lZCIhPXR5cGVvZiB1dC5yZWFkeT91dC5yZWFkeShlKTplKGV0KToodm9pZCAwIT09ZS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9ZS5jb250ZXh0KSxldC5tYWtlQXJyYXkoZSx0aGlzKSl9O3B0LnByb3RvdHlwZT1ldC5mbix1dD1ldChHKTt2YXIgaHQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sZnQ9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZXQuZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPXZvaWQgMCE9PW47KGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlOylpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmZXQoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxzaWJsaW5nOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufX0pLGV0LmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PWV0KGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtuPmU7ZSsrKWlmKGV0LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9YXQudGVzdChlKXx8InN0cmluZyIhPXR5cGVvZiBlP2V0KGUsdHx8dGhpcy5jb250ZXh0KTowO2k+cjtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZldC5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP2V0LnVuaXF1ZShvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP0ouY2FsbChldChlKSx0aGlzWzBdKTpKLmNhbGwodGhpcyxlLmpxdWVyeT9lWzBdOmUpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGV0LnVuaXF1ZShldC5tZXJnZSh0aGlzLmdldCgpLGV0KGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLGV0LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGV0LmRpcihlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGV0LmRpcihlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gbyhlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBvKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBldC5kaXIoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihlKXtyZXR1cm4gZXQuZGlyKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBldC5kaXIoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBldC5kaXIoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGV0LnNpYmxpbmcoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiBldC5zaWJsaW5nKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRlbnREb2N1bWVudHx8ZXQubWVyZ2UoW10sZS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGUsdCl7ZXQuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT1ldC5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT1ldC5maWx0ZXIocixpKSksdGhpcy5sZW5ndGg+MSYmKGZ0W2VdfHxldC51bmlxdWUoaSksaHQudGVzdChlKSYmaS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKGkpfX0pO3ZhciBkdD0vXFMrL2csbXQ9e307ZXQuQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP210W2VdfHxhKGUpOmV0LmV4dGVuZCh7fSxlKTt2YXIgdCxuLHIsaSxvLHMsbD1bXSx1PSFlLm9uY2UmJltdLGM9ZnVuY3Rpb24oYSl7Zm9yKHQ9ZS5tZW1vcnkmJmEsbj0hMCxzPWl8fDAsaT0wLG89bC5sZW5ndGgscj0hMDtsJiZvPnM7cysrKWlmKGxbc10uYXBwbHkoYVswXSxhWzFdKT09PSExJiZlLnN0b3BPbkZhbHNlKXt0PSExO2JyZWFrfXI9ITEsbCYmKHU/dS5sZW5ndGgmJmModS5zaGlmdCgpKTp0P2w9W106cC5kaXNhYmxlKCkpfSxwPXthZGQ6ZnVuY3Rpb24oKXtpZihsKXt2YXIgbj1sLmxlbmd0aDshZnVuY3Rpb24gYSh0KXtldC5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj1ldC50eXBlKG4pOyJmdW5jdGlvbiI9PT1yP2UudW5pcXVlJiZwLmhhcyhuKXx8bC5wdXNoKG4pOm4mJm4ubGVuZ3RoJiYic3RyaW5nIiE9PXImJmEobil9KX0oYXJndW1lbnRzKSxyP289bC5sZW5ndGg6dCYmKGk9bixjKHQpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGwmJmV0LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuOyhuPWV0LmluQXJyYXkodCxsLG4pKT4tMTspbC5zcGxpY2UobiwxKSxyJiYobz49biYmby0tLHM+PW4mJnMtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZXQuaW5BcnJheShlLGwpPi0xOiEoIWx8fCFsLmxlbmd0aCl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGw9W10sbz0wLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbD11PXQ9dm9pZCAwLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWx9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdT12b2lkIDAsdHx8cC5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIXV9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIWx8fG4mJiF1fHwodD10fHxbXSx0PVtlLHQuc2xpY2U/dC5zbGljZSgpOnRdLHI/dS5wdXNoKHQpOmModCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW59fTtyZXR1cm4gcH0sZXQuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgdD1bWyJyZXNvbHZlIiwiZG9uZSIsZXQuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsZXQuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLGV0LkNhbGxiYWNrcygibWVtb3J5IildXSxuPSJwZW5kaW5nIixyPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBufSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIGV0LkRlZmVycmVkKGZ1bmN0aW9uKG4pe2V0LmVhY2godCxmdW5jdGlvbih0LG8pe3ZhciBhPWV0LmlzRnVuY3Rpb24oZVt0XSkmJmVbdF07aVtvWzFdXShmdW5jdGlvbigpe3ZhciBlPWEmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJmV0LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9lLnByb21pc2UoKS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCkucHJvZ3Jlc3Mobi5ub3RpZnkpOm5bb1swXSsiV2l0aCJdKHRoaXM9PT1yP24ucHJvbWlzZSgpOnRoaXMsYT9bZV06YXJndW1lbnRzKX0pfSksZT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP2V0LmV4dGVuZChlLHIpOnJ9fSxpPXt9O3JldHVybiByLnBpcGU9ci50aGVuLGV0LmVhY2godCxmdW5jdGlvbihlLG8pe3ZhciBhPW9bMl0scz1vWzNdO3Jbb1sxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtuPXN9LHRbMV5lXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9jayksaVtvWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW29bMF0rIldpdGgiXSh0aGlzPT09aT9yOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW29bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9MCxvPXouY2FsbChhcmd1bWVudHMpLGE9by5sZW5ndGgscz0xIT09YXx8ZSYmZXQuaXNGdW5jdGlvbihlLnByb21pc2UpP2E6MCxsPTE9PT1zP2U6ZXQuRGVmZXJyZWQoKSx1PWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gZnVuY3Rpb24oaSl7bltlXT10aGlzLHJbZV09YXJndW1lbnRzLmxlbmd0aD4xP3ouY2FsbChhcmd1bWVudHMpOmkscj09PXQ/bC5ub3RpZnlXaXRoKG4scik6LS1zfHxsLnJlc29sdmVXaXRoKG4scil9fTtpZihhPjEpZm9yKHQ9bmV3IEFycmF5KGEpLG49bmV3IEFycmF5KGEpLHI9bmV3IEFycmF5KGEpO2E+aTtpKyspb1tpXSYmZXQuaXNGdW5jdGlvbihvW2ldLnByb21pc2UpP29baV0ucHJvbWlzZSgpLmRvbmUodShpLHIsbykpLmZhaWwobC5yZWplY3QpLnByb2dyZXNzKHUoaSxuLHQpKTotLXM7cmV0dXJuIHN8fGwucmVzb2x2ZVdpdGgocixvKSxsLnByb21pc2UoKX19KTt2YXIgZ3Q7ZXQuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGV0LnJlYWR5LnByb21pc2UoKS5kb25lKGUpLHRoaXN9LGV0LmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oZSl7ZT9ldC5yZWFkeVdhaXQrKzpldC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUpeyhlPT09ITA/LS1ldC5yZWFkeVdhaXQ6ZXQuaXNSZWFkeSl8fChldC5pc1JlYWR5PSEwLGUhPT0hMCYmLS1ldC5yZWFkeVdhaXQ+MHx8KGd0LnJlc29sdmVXaXRoKEcsW2V0XSksZXQuZm4udHJpZ2dlckhhbmRsZXImJihldChHKS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxldChHKS5vZmYoInJlYWR5IikpKSl9fSksZXQucmVhZHkucHJvbWlzZT1mdW5jdGlvbihlKXtyZXR1cm4gZ3R8fChndD1ldC5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT1HLnJlYWR5U3RhdGU/c2V0VGltZW91dChldC5yZWFkeSk6KEcuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIscywhMSksdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixzLCExKSkpLGd0LnByb21pc2UoZSl9LGV0LnJlYWR5LnByb21pc2UoKTt2YXIgeXQ9ZXQuYWNjZXNzPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsbD1lLmxlbmd0aCx1PW51bGw9PW47aWYoIm9iamVjdCI9PT1ldC50eXBlKG4pKXtpPSEwO2ZvcihzIGluIG4pZXQuYWNjZXNzKGUsdCxzLG5bc10sITAsbyxhKX1lbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLGV0LmlzRnVuY3Rpb24ocil8fChhPSEwKSx1JiYoYT8odC5jYWxsKGUsciksdD1udWxsKToodT10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB1LmNhbGwoZXQoZSksbil9KSksdCkpZm9yKDtsPnM7cysrKXQoZVtzXSxuLGE/cjpyLmNhbGwoZVtzXSxzLHQoZVtzXSxuKSkpO3JldHVybiBpP2U6dT90LmNhbGwoZSk6bD90KGVbMF0sbik6b307ZXQuYWNjZXB0RGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV8fDk9PT1lLm5vZGVUeXBlfHwhK2Uubm9kZVR5cGV9LGwudWlkPTEsbC5hY2NlcHRzPWV0LmFjY2VwdERhdGEsbC5wcm90b3R5cGU9e2tleTpmdW5jdGlvbihlKXtpZighbC5hY2NlcHRzKGUpKXJldHVybiAwO3ZhciB0PXt9LG49ZVt0aGlzLmV4cGFuZG9dO2lmKCFuKXtuPWwudWlkKys7dHJ5e3RbdGhpcy5leHBhbmRvXT17dmFsdWU6bn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSx0KX1jYXRjaChyKXt0W3RoaXMuZXhwYW5kb109bixldC5leHRlbmQoZSx0KX19cmV0dXJuIHRoaXMuY2FjaGVbbl18fCh0aGlzLmNhY2hlW25dPXt9KSxufSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9dGhpcy5rZXkoZSksbz10aGlzLmNhY2hlW2ldO2lmKCJzdHJpbmciPT10eXBlb2YgdClvW3RdPW47ZWxzZSBpZihldC5pc0VtcHR5T2JqZWN0KG8pKWV0LmV4dGVuZCh0aGlzLmNhY2hlW2ldLHQpO2Vsc2UgZm9yKHIgaW4gdClvW3JdPXRbcl07cmV0dXJuIG99LGdldDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2FjaGVbdGhpcy5rZXkoZSldO3JldHVybiB2b2lkIDA9PT10P246blt0XX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uPyhyPXRoaXMuZ2V0KGUsdCksdm9pZCAwIT09cj9yOnRoaXMuZ2V0KGUsZXQuY2FtZWxDYXNlKHQpKSk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXMua2V5KGUpLGE9dGhpcy5jYWNoZVtvXTtpZih2b2lkIDA9PT10KXRoaXMuY2FjaGVbb109e307ZWxzZXtldC5pc0FycmF5KHQpP3I9dC5jb25jYXQodC5tYXAoZXQuY2FtZWxDYXNlKSk6KGk9ZXQuY2FtZWxDYXNlKHQpLHQgaW4gYT9yPVt0LGldOihyPWkscj1yIGluIGE/W3JdOnIubWF0Y2goZHQpfHxbXSkpLG49ci5sZW5ndGg7Zm9yKDtuLS07KWRlbGV0ZSBhW3Jbbl1dfX0saGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4hZXQuaXNFbXB0eU9iamVjdCh0aGlzLmNhY2hlW2VbdGhpcy5leHBhbmRvXV18fHt9KX0sZGlzY2FyZDpmdW5jdGlvbihlKXtlW3RoaXMuZXhwYW5kb10mJmRlbGV0ZSB0aGlzLmNhY2hlW2VbdGhpcy5leHBhbmRvXV19fTt2YXIgdnQ9bmV3IGwsYnQ9bmV3IGwsd3Q9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyx4dD0vKFtBLVpdKS9nO2V0LmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gYnQuaGFzRGF0YShlKXx8dnQuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGJ0LmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtidC5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2dC5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3Z0LnJlbW92ZShlLHQpfX0pLGV0LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihpPWJ0LmdldChvKSwxPT09by5ub2RlVHlwZSYmIXZ0LmdldChvLCJoYXNEYXRhQXR0cnMiKSkpe2ZvcihuPWEubGVuZ3RoO24tLTspYVtuXSYmKHI9YVtuXS5uYW1lLDA9PT1yLmluZGV4T2YoImRhdGEtIikmJihyPWV0LmNhbWVsQ2FzZShyLnNsaWNlKDUpKSx1KG8scixpW3JdKSkpO3Z0LnNldChvLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gaX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7YnQuc2V0KHRoaXMsZSl9KTp5dCh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBuLHI9ZXQuY2FtZWxDYXNlKGUpO2lmKG8mJnZvaWQgMD09PXQpe2lmKG49YnQuZ2V0KG8sZSksdm9pZCAwIT09bilyZXR1cm4gbjtpZihuPWJ0LmdldChvLHIpLHZvaWQgMCE9PW4pcmV0dXJuIG47aWYobj11KG8scix2b2lkIDApLHZvaWQgMCE9PW4pcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1idC5nZXQodGhpcyxyKTtidC5zZXQodGhpcyxyLHQpLC0xIT09ZS5pbmRleE9mKCItIikmJnZvaWQgMCE9PW4mJmJ0LnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7YnQucmVtb3ZlKHRoaXMsZSl9KX19KSxldC5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gZT8odD0odHx8ImZ4IikrInF1ZXVlIixyPXZ0LmdldChlLHQpLG4mJighcnx8ZXQuaXNBcnJheShuKT9yPXZ0LmFjY2VzcyhlLHQsZXQubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdKTp2b2lkIDB9LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49ZXQucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89ZXQuX3F1ZXVlSG9va3MoZSx0KSxhPWZ1bmN0aW9uKCl7ZXQuZGVxdWV1ZShlLHQpfTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsYSxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiB2dC5nZXQoZSxuKXx8dnQuYWNjZXNzKGUsbix7ZW1wdHk6ZXQuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3Z0LnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSxldC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP2V0LnF1ZXVlKHRoaXNbMF0sZSk6dm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPWV0LnF1ZXVlKHRoaXMsZSx0KTtldC5fcXVldWVIb29rcyh0aGlzLGUpLCJmeCI9PT1lJiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZldC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZXQuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT1ldC5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTtmb3IoInN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSxlPWV8fCJmeCI7YS0tOyluPXZ0LmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSxuJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgQXQ9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsRXQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxqdD1mdW5jdGlvbihlLHQpe3JldHVybiBlPXR8fGUsIm5vbmUiPT09ZXQuY3NzKGUsImRpc3BsYXkiKXx8IWV0LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sQ3Q9L14oPzpjaGVja2JveHxyYWRpbykkL2k7IWZ1bmN0aW9uKCl7dmFyIGU9Ry5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksdD1lLmFwcGVuZENoaWxkKEcuY3JlYXRlRWxlbWVudCgiZGl2IikpLG49Ry5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO24uc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxuLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxuLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSx0LmFwcGVuZENoaWxkKG4pLEsuY2hlY2tDbG9uZT10LmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx0LmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsSy5ub0Nsb25lQ2hlY2tlZD0hIXQuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciBUdD0idW5kZWZpbmVkIjtLLmZvY3VzaW5CdWJibGVzPSJvbmZvY3VzaW4iaW4gdDt2YXIgU3Q9L15rZXkvLF90PS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudSl8Y2xpY2svLE90PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxrdD0vXihbXi5dKikoPzpcLiguKyl8KSQvO2V0LmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLGwsdSxjLHAsaCxmLGQsbSxnPXZ0LmdldChlKTtpZihnKWZvcihuLmhhbmRsZXImJihvPW4sbj1vLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxuLmd1aWR8fChuLmd1aWQ9ZXQuZ3VpZCsrKSwobD1nLmV2ZW50cyl8fChsPWcuZXZlbnRzPXt9KSwoYT1nLmhhbmRsZSl8fChhPWcuaGFuZGxlPWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgZXQhPT1UdCYmZXQuZXZlbnQudHJpZ2dlcmVkIT09dC50eXBlP2V0LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSx0PSh0fHwiIikubWF0Y2goZHQpfHxbIiJdLHU9dC5sZW5ndGg7dS0tOylzPWt0LmV4ZWModFt1XSl8fFtdLGY9bT1zWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxmJiYocD1ldC5ldmVudC5zcGVjaWFsW2ZdfHx7fSxmPShpP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxmLHA9ZXQuZXZlbnQuc3BlY2lhbFtmXXx8e30sYz1ldC5leHRlbmQoe3R5cGU6ZixvcmlnVHlwZTptLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmZXQuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6ZC5qb2luKCIuIil9LG8pLChoPWxbZl0pfHwoaD1sW2ZdPVtdLGguZGVsZWdhdGVDb3VudD0wLHAuc2V0dXAmJnAuc2V0dXAuY2FsbChlLHIsZCxhKSE9PSExfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihmLGEsITEpKSxwLmFkZCYmKHAuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/aC5zcGxpY2UoaC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpoLnB1c2goYyksZXQuZXZlbnQuZ2xvYmFsW2ZdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLGwsdSxjLHAsaCxmLGQsbSxnPXZ0Lmhhc0RhdGEoZSkmJnZ0LmdldChlKTtpZihnJiYobD1nLmV2ZW50cykpe2Zvcih0PSh0fHwiIikubWF0Y2goZHQpfHxbIiJdLHU9dC5sZW5ndGg7dS0tOylpZihzPWt0LmV4ZWModFt1XSl8fFtdLGY9bT1zWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxmKXtmb3IocD1ldC5ldmVudC5zcGVjaWFsW2ZdfHx7fSxmPShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxmLGg9bFtmXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitkLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1oLmxlbmd0aDtvLS07KWM9aFtvXSwhaSYmbSE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFjLnNlbGVjdG9yKXx8KGguc3BsaWNlKG8sMSksYy5zZWxlY3RvciYmaC5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoZSxjKSk7YSYmIWgubGVuZ3RoJiYocC50ZWFyZG93biYmcC50ZWFyZG93bi5jYWxsKGUsZCxnLmhhbmRsZSkhPT0hMXx8ZXQucmVtb3ZlRXZlbnQoZSxmLGcuaGFuZGxlKSxkZWxldGUgbFtmXSl9ZWxzZSBmb3IoZiBpbiBsKWV0LmV2ZW50LnJlbW92ZShlLGYrdFt1XSxuLHIsITApO2V0LmlzRW1wdHlPYmplY3QobCkmJihkZWxldGUgZy5oYW5kbGUsdnQucmVtb3ZlKGUsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIG8sYSxzLGwsdSxjLHAsaD1bcnx8R10sZj1YLmNhbGwoZSwidHlwZSIpP2UudHlwZTplLGQ9WC5jYWxsKGUsIm5hbWVzcGFjZSIpP2UubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoYT1zPXI9cnx8RywzIT09ci5ub2RlVHlwZSYmOCE9PXIubm9kZVR5cGUmJiFPdC50ZXN0KGYrZXQuZXZlbnQudHJpZ2dlcmVkKSYmKGYuaW5kZXhPZigiLiIpPj0wJiYoZD1mLnNwbGl0KCIuIiksZj1kLnNoaWZ0KCksZC5zb3J0KCkpLHU9Zi5pbmRleE9mKCI6Iik8MCYmIm9uIitmLGU9ZVtldC5leHBhbmRvXT9lOm5ldyBldC5FdmVudChmLCJvYmplY3QiPT10eXBlb2YgZSYmZSksZS5pc1RyaWdnZXI9aT8yOjMsZS5uYW1lc3BhY2U9ZC5qb2luKCIuIiksZS5uYW1lc3BhY2VfcmU9ZS5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrZC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGUucmVzdWx0PXZvaWQgMCxlLnRhcmdldHx8KGUudGFyZ2V0PXIpLG49bnVsbD09bj9bZV06ZXQubWFrZUFycmF5KG4sW2VdKSxwPWV0LmV2ZW50LnNwZWNpYWxbZl18fHt9LGl8fCFwLnRyaWdnZXJ8fHAudHJpZ2dlci5hcHBseShyLG4pIT09ITEpKXtpZighaSYmIXAubm9CdWJibGUmJiFldC5pc1dpbmRvdyhyKSl7Zm9yKGw9cC5kZWxlZ2F0ZVR5cGV8fGYsT3QudGVzdChsK2YpfHwoYT1hLnBhcmVudE5vZGUpO2E7YT1hLnBhcmVudE5vZGUpaC5wdXNoKGEpLHM9YTtzPT09KHIub3duZXJEb2N1bWVudHx8RykmJmgucHVzaChzLmRlZmF1bHRWaWV3fHxzLnBhcmVudFdpbmRvd3x8dCl9Zm9yKG89MDsoYT1oW28rK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyllLnR5cGU9bz4xP2w6cC5iaW5kVHlwZXx8ZixjPSh2dC5nZXQoYSwiZXZlbnRzIil8fHt9KVtlLnR5cGVdJiZ2dC5nZXQoYSwiaGFuZGxlIiksYyYmYy5hcHBseShhLG4pLGM9dSYmYVt1XSxjJiZjLmFwcGx5JiZldC5hY2NlcHREYXRhKGEpJiYoZS5yZXN1bHQ9Yy5hcHBseShhLG4pLGUucmVzdWx0PT09ITEmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1mLGl8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fHAuX2RlZmF1bHQmJnAuX2RlZmF1bHQuYXBwbHkoaC5wb3AoKSxuKSE9PSExfHwhZXQuYWNjZXB0RGF0YShyKXx8dSYmZXQuaXNGdW5jdGlvbihyW2ZdKSYmIWV0LmlzV2luZG93KHIpJiYocz1yW3VdLHMmJihyW3VdPW51bGwpLGV0LmV2ZW50LnRyaWdnZXJlZD1mLHJbZl0oKSxldC5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHMmJihyW3VdPXMpKSxlLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe2U9ZXQuZXZlbnQuZml4KGUpO3ZhciB0LG4scixpLG8sYT1bXSxzPXouY2FsbChhcmd1bWVudHMpLGw9KHZ0LmdldCh0aGlzLCJldmVudHMiKXx8e30pW2UudHlwZV18fFtdLHU9ZXQuZXZlbnQuc3BlY2lhbFtlLnR5cGVdfHx7fTtpZihzWzBdPWUsZS5kZWxlZ2F0ZVRhcmdldD10aGlzLCF1LnByZURpc3BhdGNofHx1LnByZURpc3BhdGNoLmNhbGwodGhpcyxlKSE9PSExKXtmb3IoYT1ldC5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsZSxsKSx0PTA7KGk9YVt0KytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKGUuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wOyhvPWkuaGFuZGxlcnNbbisrXSkmJiFlLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KSghZS5uYW1lc3BhY2VfcmV8fGUubmFtZXNwYWNlX3JlLnRlc3Qoby5uYW1lc3BhY2UpKSYmKGUuaGFuZGxlT2JqPW8sZS5kYXRhPW8uZGF0YSxyPSgoZXQuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scyksdm9pZCAwIT09ciYmKGUucmVzdWx0PXIpPT09ITEmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiB1LnBvc3REaXNwYXRjaCYmdS5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGUpLGUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhPVtdLHM9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYocyYmbC5ub2RlVHlwZSYmKCFlLmJ1dHRvbnx8ImNsaWNrIiE9PWUudHlwZSkpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZihsLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1lLnR5cGUpe2ZvcihyPVtdLG49MDtzPm47bisrKW89dFtuXSxpPW8uc2VsZWN0b3IrIiAiLHZvaWQgMD09PXJbaV0mJihyW2ldPW8ubmVlZHNDb250ZXh0P2V0KGksdGhpcykuaW5kZXgobCk+PTA6ZXQuZmluZChpLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCkscltpXSYmci5wdXNoKG8pO3IubGVuZ3RoJiZhLnB1c2goe2VsZW06bCxoYW5kbGVyczpyfSl9cmV0dXJuIHM8dC5sZW5ndGgmJmEucHVzaCh7ZWxlbTp0aGlzLGhhbmRsZXJzOnQuc2xpY2Uocyl9KSxhfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09ZS53aGljaCYmKGUud2hpY2g9bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZSksZX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG89dC5idXR0b247cmV0dXJuIG51bGw9PWUucGFnZVgmJm51bGwhPXQuY2xpZW50WCYmKG49ZS50YXJnZXQub3duZXJEb2N1bWVudHx8RyxyPW4uZG9jdW1lbnRFbGVtZW50LGk9bi5ib2R5LGUucGFnZVg9dC5jbGllbnRYKyhyJiZyLnNjcm9sbExlZnR8fGkmJmkuc2Nyb2xsTGVmdHx8MCktKHImJnIuY2xpZW50TGVmdHx8aSYmaS5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPXQuY2xpZW50WSsociYmci5zY3JvbGxUb3B8fGkmJmkuc2Nyb2xsVG9wfHwwKS0ociYmci5jbGllbnRUb3B8fGkmJmkuY2xpZW50VG9wfHwwKSksZS53aGljaHx8dm9pZCAwPT09b3x8KGUud2hpY2g9MSZvPzE6MiZvPzM6NCZvPzI6MCksZX19LGZpeDpmdW5jdGlvbihlKXtpZihlW2V0LmV4cGFuZG9dKXJldHVybiBlO3ZhciB0LG4scixpPWUudHlwZSxvPWUsYT10aGlzLmZpeEhvb2tzW2ldO2ZvcihhfHwodGhpcy5maXhIb29rc1tpXT1hPV90LnRlc3QoaSk/dGhpcy5tb3VzZUhvb2tzOlN0LnRlc3QoaSk/dGhpcy5rZXlIb29rczp7fSkscj1hLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGEucHJvcHMpOnRoaXMucHJvcHMsZT1uZXcgZXQuRXZlbnQobyksdD1yLmxlbmd0aDt0LS07KW49clt0XSxlW25dPW9bbl07cmV0dXJuIGUudGFyZ2V0fHwoZS50YXJnZXQ9RyksMz09PWUudGFyZ2V0Lm5vZGVUeXBlJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksYS5maWx0ZXI/YS5maWx0ZXIoZSxvKTplfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyE9PWgoKSYmdGhpcy5mb2N1cz8odGhpcy5mb2N1cygpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWgoKSYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4iY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZldC5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpPyh0aGlzLmNsaWNrKCksITEpOnZvaWQgMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGV0Lm5vZGVOYW1lKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1ldC5leHRlbmQobmV3IGV0LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj9ldC5ldmVudC50cmlnZ2VyKGksbnVsbCx0KTpldC5ldmVudC5kaXNwYXRjaC5jYWxsKHQsaSksaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmbi5wcmV2ZW50RGVmYXVsdCgpfX0sZXQucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9LGV0LkV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBldC5FdmVudD8oZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiZlLnJldHVyblZhbHVlPT09ITE/YzpwKTp0aGlzLnR5cGU9ZSx0JiZldC5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8ZXQubm93KCksdm9pZCh0aGlzW2V0LmV4cGFuZG9dPSEwKSk6bmV3IGV0LkV2ZW50KGUsdCl9LGV0LkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOnAsaXNQcm9wYWdhdGlvblN0b3BwZWQ6cCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpwLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWMsZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1jLGUmJmUuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1jLGUmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxldC5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe2V0LmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxvPWUuaGFuZGxlT2JqO3JldHVybighaXx8aSE9PXImJiFldC5jb250YWlucyhyLGkpKSYmKGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksSy5mb2N1c2luQnViYmxlc3x8ZXQuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtldC5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LGV0LmV2ZW50LmZpeChlKSwhMCl9O2V0LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9dnQuYWNjZXNzKHIsdCk7aXx8ci5hZGRFdmVudExpc3RlbmVyKGUsbiwhMCksdnQuYWNjZXNzKHIsdCwoaXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9dnQuYWNjZXNzKHIsdCktMTtpP3Z0LmFjY2VzcyhyLHQsaSk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITApLHZ0LnJlbW92ZShyLHQpKX19fSksZXQuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGE7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPW58fHQsdD12b2lkIDApO2ZvcihhIGluIGUpdGhpcy5vbihhLHQsbixlW2FdLGkpO3JldHVybiB0aGlzfWlmKG51bGw9PW4mJm51bGw9PXI/KHI9dCxuPXQ9dm9pZCAwKTpudWxsPT1yJiYoInN0cmluZyI9PXR5cGVvZiB0PyhyPW4sbj12b2lkIDApOihyPW4sbj10LHQ9dm9pZCAwKSkscj09PSExKXI9cDtlbHNlIGlmKCFyKXJldHVybiB0aGlzO3JldHVybiAxPT09aSYmKG89cixyPWZ1bmN0aW9uKGUpe3JldHVybiBldCgpLm9mZihlKSxvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sci5ndWlkPW8uZ3VpZHx8KG8uZ3VpZD1ldC5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtldC5ldmVudC5hZGQodGhpcyxlLHIsbix0KX0pfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLGV0KGUuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlKyIuIityLm5hbWVzcGFjZTpyLm9yaWdUeXBlLHIuc2VsZWN0b3Isci5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKGkgaW4gZSl0aGlzLm9mZihpLHQsZVtpXSk7cmV0dXJuIHRoaXN9cmV0dXJuKHQ9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpJiYobj10LHQ9dm9pZCAwKSxuPT09ITEmJihuPXApLHRoaXMuZWFjaChmdW5jdGlvbigpe2V0LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2V0LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtyZXR1cm4gbj9ldC5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKTp2b2lkIDB9fSk7dmFyICR0PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksRHQ9LzwoW1x3Ol0rKS8sTHQ9Lzx8JiM/XHcrOy8sTnQ9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxQdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxJdD0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksUnQ9L150cnVlXC8oLiopLyxNdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csVXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtVdC5vcHRncm91cD1VdC5vcHRpb24sVXQudGJvZHk9VXQudGZvb3Q9VXQuY29sZ3JvdXA9VXQuY2FwdGlvbj1VdC50aGVhZCxVdC50aD1VdC50ZCxldC5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY2xvbmVOb2RlKCEwKSxsPWV0LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKEsubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fGV0LmlzWE1MRG9jKGUpKSlmb3IoYT12KHMpLG89dihlKSxyPTAsaT1vLmxlbmd0aDtpPnI7cisrKWIob1tyXSxhW3JdKTtpZih0KWlmKG4pZm9yKG89b3x8dihlKSxhPWF8fHYocykscj0wLGk9by5sZW5ndGg7aT5yO3IrKyl5KG9bcl0sYVtyXSk7ZWxzZSB5KGUscyk7cmV0dXJuIGE9dihzLCJzY3JpcHQiKSxhLmxlbmd0aD4wJiZnKGEsIWwmJnYoZSwic2NyaXB0IikpLHN9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpLG8sYSxzLGwsdSxjPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10saD0wLGY9ZS5sZW5ndGg7Zj5oO2grKylpZihpPWVbaF0saXx8MD09PWkpaWYoIm9iamVjdCI9PT1ldC50eXBlKGkpKWV0Lm1lcmdlKHAsaS5ub2RlVHlwZT9baV06aSk7ZWxzZSBpZihMdC50ZXN0KGkpKXtmb3Iobz1vfHxjLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGE9KER0LmV4ZWMoaSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCkscz1VdFthXXx8VXQuX2RlZmF1bHQsby5pbm5lckhUTUw9c1sxXStpLnJlcGxhY2UoJHQsIjwkMT48LyQyPiIpK3NbMl0sdT1zWzBdO3UtLTspbz1vLmxhc3RDaGlsZDtldC5tZXJnZShwLG8uY2hpbGROb2Rlcyksbz1jLmZpcnN0Q2hpbGQsby50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKGkpKTtmb3IoYy50ZXh0Q29udGVudD0iIixoPTA7aT1wW2grK107KWlmKCghcnx8LTE9PT1ldC5pbkFycmF5KGkscikpJiYobD1ldC5jb250YWlucyhpLm93bmVyRG9jdW1lbnQsaSksbz12KGMuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLGwmJmcobyksbikpZm9yKHU9MDtpPW9bdSsrXTspSXQudGVzdChpLnR5cGV8fCIiKSYmbi5wdXNoKGkpO3JldHVybiBjfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scixpLG89ZXQuZXZlbnQuc3BlY2lhbCxhPTA7dm9pZCAwIT09KG49ZVthXSk7YSsrKXtpZihldC5hY2NlcHREYXRhKG4pJiYoaT1uW3Z0LmV4cGFuZG9dLGkmJih0PXZ0LmNhY2hlW2ldKSkpe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKW9bcl0/ZXQuZXZlbnQucmVtb3ZlKG4scik6ZXQucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTt2dC5jYWNoZVtpXSYmZGVsZXRlIHZ0LmNhY2hlW2ldfWRlbGV0ZSBidC5jYWNoZVtuW2J0LmV4cGFuZG9dXX19fSksZXQuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB5dCh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP2V0LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpJiYodGhpcy50ZXh0Q29udGVudD1lKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9Zih0aGlzLGUpO3QuYXBwZW5kQ2hpbGQoZSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PWYodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scj1lP2V0LmZpbHRlcihlLHRoaXMpOnRoaXMsaT0wO251bGwhPShuPXJbaV0pO2krKyl0fHwxIT09bi5ub2RlVHlwZXx8ZXQuY2xlYW5EYXRhKHYobikpLG4ucGFyZW50Tm9kZSYmKHQmJmV0LmNvbnRhaW5zKG4ub3duZXJEb2N1bWVudCxuKSYmZyh2KG4sInNjcmlwdCIpKSxuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobikpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoZXQuY2xlYW5EYXRhKHYoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGw9PWU/ITE6ZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB5dCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFOdC50ZXN0KGUpJiYhVXRbKER0LmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPWUucmVwbGFjZSgkdCwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7cj5uO24rKyl0PXRoaXNbbl18fHt9LDE9PT10Lm5vZGVUeXBlJiYoZXQuY2xlYW5EYXRhKHYodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChpKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKHQpe2U9dGhpcy5wYXJlbnROb2RlLGV0LmNsZWFuRGF0YSh2KHRoaXMpKSxlJiZlLnJlcGxhY2VDaGlsZCh0LHRoaXMpfSksZSYmKGUubGVuZ3RofHxlLm5vZGVUeXBlKT90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsdCl7ZT1WLmFwcGx5KFtdLGUpO3ZhciBuLHIsaSxvLGEscyxsPTAsdT10aGlzLmxlbmd0aCxjPXRoaXMscD11LTEsaD1lWzBdLGY9ZXQuaXNGdW5jdGlvbihoKTtpZihmfHx1PjEmJiJzdHJpbmciPT10eXBlb2YgaCYmIUsuY2hlY2tDbG9uZSYmUHQudGVzdChoKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWMuZXEobik7ZiYmKGVbMF09aC5jYWxsKHRoaXMsbixyLmh0bWwoKSkpLHIuZG9tTWFuaXAoZSx0KX0pO2lmKHUmJihuPWV0LmJ1aWxkRnJhZ21lbnQoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcykscj1uLmZpcnN0Q2hpbGQsMT09PW4uY2hpbGROb2Rlcy5sZW5ndGgmJihuPXIpLHIpKXtmb3IoaT1ldC5tYXAodihuLCJzY3JpcHQiKSxkKSxvPWkubGVuZ3RoO3U+bDtsKyspYT1uLGwhPT1wJiYoYT1ldC5jbG9uZShhLCEwLCEwKSxvJiZldC5tZXJnZShpLHYoYSwic2NyaXB0IikpKSx0LmNhbGwodGhpc1tsXSxhLGwpO2lmKG8pZm9yKHM9aVtpLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LGV0Lm1hcChpLG0pLGw9MDtvPmw7bCsrKWE9aVtsXSxJdC50ZXN0KGEudHlwZXx8IiIpJiYhdnQuYWNjZXNzKGEsImdsb2JhbEV2YWwiKSYmZXQuY29udGFpbnMocyxhKSYmKGEuc3JjP2V0Ll9ldmFsVXJsJiZldC5fZXZhbFVybChhLnNyYyk6ZXQuZ2xvYmFsRXZhbChhLnRleHRDb250ZW50LnJlcGxhY2UoTXQsIiIpKSl9cmV0dXJuIHRoaXN9fSksZXQuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7ZXQuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10saT1ldChlKSxvPWkubGVuZ3RoLTEsYT0wO28+PWE7YSsrKW49YT09PW8/dGhpczp0aGlzLmNsb25lKCEwKSxldChpW2FdKVt0XShuKSxXLmFwcGx5KHIsbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpfX0pO3ZhciBIdCxGdD17fSxCdD0vXm1hcmdpbi8scXQ9bmV3IFJlZ0V4cCgiXigiK0F0KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksenQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5vcGVuZXI/ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZSxudWxsKTp0LmdldENvbXB1dGVkU3R5bGUoZSxudWxsKX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2Euc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGEuaW5uZXJIVE1MPSIiLGkuYXBwZW5kQ2hpbGQobyk7dmFyIGU9dC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCk7bj0iMSUiIT09ZS50b3Ascj0iNHB4Ij09PWUud2lkdGgsaS5yZW1vdmVDaGlsZChvKX12YXIgbixyLGk9Ry5kb2N1bWVudEVsZW1lbnQsbz1HLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGE9Ry5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGEuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixLLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09YS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxvLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixvLmFwcGVuZENoaWxkKGEpLHQuZ2V0Q29tcHV0ZWRTdHlsZSYmZXQuZXh0ZW5kKEsse3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG59LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXImJmUoKSxyfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGUsbj1hLmFwcGVuZENoaWxkKEcuY3JlYXRlRWxlbWVudCgiZGl2IikpO3JldHVybiBuLnN0eWxlLmNzc1RleHQ9YS5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjAiLG4uc3R5bGUubWFyZ2luUmlnaHQ9bi5zdHlsZS53aWR0aD0iMCIsYS5zdHlsZS53aWR0aD0iMXB4IixpLmFwcGVuZENoaWxkKG8pLGU9IXBhcnNlRmxvYXQodC5nZXRDb21wdXRlZFN0eWxlKG4sbnVsbCkubWFyZ2luUmlnaHQpLGkucmVtb3ZlQ2hpbGQobyksYS5yZW1vdmVDaGlsZChuKSxlfX0pKX0oKSxldC5zd2FwPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiB0KWFbb109ZS5zdHlsZVtvXSxlLnN0eWxlW29dPXRbb107aT1uLmFwcGx5KGUscnx8W10pO2ZvcihvIGluIHQpZS5zdHlsZVtvXT1hW29dO3JldHVybiBpfTt2YXIgVnQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFd0PW5ldyBSZWdFeHAoIl4oIitBdCsiKSguKikkIiwiaSIpLEp0PW5ldyBSZWdFeHAoIl4oWystXSk9KCIrQXQrIikiLCJpIiksWXQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFF0PXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxYdD1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2V0LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUEoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjoiY3NzRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPWV0LmNhbWVsQ2FzZSh0KSxsPWUuc3R5bGU7cmV0dXJuIHQ9ZXQuY3NzUHJvcHNbc118fChldC5jc3NQcm9wc1tzXT1qKGwscykpLGE9ZXQuY3NzSG9va3NbdF18fGV0LmNzc0hvb2tzW3NdLHZvaWQgMD09PW4/YSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLHIpKT9pOmxbdF06KG89dHlwZW9mIG4sInN0cmluZyI9PT1vJiYoaT1KdC5leGVjKG4pKSYmKG49KGlbMV0rMSkqaVsyXStwYXJzZUZsb2F0KGV0LmNzcyhlLHQpKSxvPSJudW1iZXIiKSxudWxsIT1uJiZuPT09biYmKCJudW1iZXIiIT09b3x8ZXQuY3NzTnVtYmVyW3NdfHwobis9InB4IiksSy5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwobFt0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KGxbdF09bikpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9ZXQuY2FtZWxDYXNlKHQpO3JldHVybiB0PWV0LmNzc1Byb3BzW3NdfHwoZXQuY3NzUHJvcHNbc109aihlLnN0eWxlLHMpKSxhPWV0LmNzc0hvb2tzW3RdfHxldC5jc3NIb29rc1tzXSxhJiYiZ2V0ImluIGEmJihpPWEuZ2V0KGUsITAsbikpLHZvaWQgMD09PWkmJihpPUEoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gUXQmJihpPVF0W3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSxuPT09ITB8fGV0LmlzTnVtZXJpYyhvKT9vfHwwOmkpOml9fSksZXQuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx0KXtldC5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbj9WdC50ZXN0KGV0LmNzcyhlLCJkaXNwbGF5IikpJiYwPT09ZS5vZmZzZXRXaWR0aD9ldC5zd2FwKGUsWXQsZnVuY3Rpb24oKXtyZXR1cm4gUyhlLHQscil9KTpTKGUsdCxyKTp2b2lkIDB9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGk9ciYmenQoZSk7cmV0dXJuIEMoZSxuLHI/VChlLHQsciwiYm9yZGVyLWJveCI9PT1ldC5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxpKTowKX19fSksZXQuY3NzSG9va3MubWFyZ2luUmlnaHQ9RShLLnJlbGlhYmxlTWFyZ2luUmlnaHQsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9ldC5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEEsW2UsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLGV0LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihlLHQpe2V0LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIHI9MCxpPXt9LG89InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07ND5yO3IrKylpW2UrRXRbcl0rdF09b1tyXXx8b1tyLTJdfHxvWzBdOworcmV0dXJuIGl9fSxCdC50ZXN0KGUpfHwoZXQuY3NzSG9va3NbZSt0XS5zZXQ9Qyl9KSxldC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB5dCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKGV0LmlzQXJyYXkodCkpe2ZvcihyPXp0KGUpLGk9dC5sZW5ndGg7aT5hO2ErKylvW3RbYV1dPWV0LmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/ZXQuc3R5bGUoZSx0LG4pOmV0LmNzcyhlLHQpfSxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBfKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIF8odGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7anQodGhpcyk/ZXQodGhpcykuc2hvdygpOmV0KHRoaXMpLmhpZGUoKX0pfX0pLGV0LlR3ZWVuPU8sTy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk8saW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8InN3aW5nIix0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KGV0LmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9Ty5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6Ty5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1PLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLnBvcz10PXRoaXMub3B0aW9ucy5kdXJhdGlvbj9ldC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpPLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LE8ucHJvdG90eXBlLmluaXQucHJvdG90eXBlPU8ucHJvdG90eXBlLE8ucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBudWxsPT1lLmVsZW1bZS5wcm9wXXx8ZS5lbGVtLnN0eWxlJiZudWxsIT1lLmVsZW0uc3R5bGVbZS5wcm9wXT8odD1ldC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7ZXQuZnguc3RlcFtlLnByb3BdP2V0LmZ4LnN0ZXBbZS5wcm9wXShlKTplLmVsZW0uc3R5bGUmJihudWxsIT1lLmVsZW0uc3R5bGVbZXQuY3NzUHJvcHNbZS5wcm9wXV18fGV0LmNzc0hvb2tzW2UucHJvcF0pP2V0LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KTplLmVsZW1bZS5wcm9wXT1lLm5vd319fSxPLnByb3BIb29rcy5zY3JvbGxUb3A9Ty5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSxldC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0sZXQuZng9Ty5wcm90b3R5cGUuaW5pdCxldC5meC5zdGVwPXt9O3ZhciBLdCxHdCxadD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sZW49bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK0F0KyIpKFthLXolXSopJCIsImkiKSx0bj0vcXVldWVIb29rcyQvLG5uPVtMXSxybj17IioiOltmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4oZSx0KSxyPW4uY3VyKCksaT1lbi5leGVjKHQpLG89aSYmaVszXXx8KGV0LmNzc051bWJlcltlXT8iIjoicHgiKSxhPShldC5jc3NOdW1iZXJbZV18fCJweCIhPT1vJiYrcikmJmVuLmV4ZWMoZXQuY3NzKG4uZWxlbSxlKSkscz0xLGw9MjA7aWYoYSYmYVszXSE9PW8pe289b3x8YVszXSxpPWl8fFtdLGE9K3J8fDE7ZG8gcz1zfHwiLjUiLGEvPXMsZXQuc3R5bGUobi5lbGVtLGUsYStvKTt3aGlsZShzIT09KHM9bi5jdXIoKS9yKSYmMSE9PXMmJi0tbCl9cmV0dXJuIGkmJihhPW4uc3RhcnQ9K2F8fCtyfHwwLG4udW5pdD1vLG4uZW5kPWlbMV0/YSsoaVsxXSsxKSppWzJdOitpWzJdKSxufV19O2V0LkFuaW1hdGlvbj1ldC5leHRlbmQoUCx7dHdlZW5lcjpmdW5jdGlvbihlLHQpe2V0LmlzRnVuY3Rpb24oZSk/KHQ9ZSxlPVsiKiJdKTplPWUuc3BsaXQoIiAiKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7aT5yO3IrKyluPWVbcl0scm5bbl09cm5bbl18fFtdLHJuW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/bm4udW5zaGlmdChlKTpubi5wdXNoKGUpfX0pLGV0LnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiYib2JqZWN0Ij09dHlwZW9mIGU/ZXQuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8ZXQuaXNGdW5jdGlvbihlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhZXQuaXNGdW5jdGlvbih0KSYmdH07cmV0dXJuIHIuZHVyYXRpb249ZXQuZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiBldC5meC5zcGVlZHM/ZXQuZnguc3BlZWRzW3IuZHVyYXRpb25dOmV0LmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7ZXQuaXNGdW5jdGlvbihyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmZXQuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxldC5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoanQpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWV0LmlzRW1wdHlPYmplY3QoZSksbz1ldC5zcGVlZCh0LG4sciksYT1mdW5jdGlvbigpe3ZhciB0PVAodGhpcyxldC5leHRlbmQoe30sZSksbyk7KGl8fHZ0LmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fG8ucXVldWU9PT0hMT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiZlIT09ITEmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPWV0LnRpbWVycyxhPXZ0LmdldCh0aGlzKTtpZihpKWFbaV0mJmFbaV0uc3RvcCYmcihhW2ldKTtlbHNlIGZvcihpIGluIGEpYVtpXSYmYVtpXS5zdG9wJiZ0bi50ZXN0KGkpJiZyKGFbaV0pO2ZvcihpPW8ubGVuZ3RoO2ktLTspb1tpXS5lbGVtIT09dGhpc3x8bnVsbCE9ZSYmb1tpXS5xdWV1ZSE9PWV8fChvW2ldLmFuaW0uc3RvcChuKSx0PSExLG8uc3BsaWNlKGksMSkpOyh0fHwhbikmJmV0LmRlcXVldWUodGhpcyxlKX0pfSxmaW5pc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT0hMSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj12dC5nZXQodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPWV0LnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAsZXQucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO2E+dDt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksZXQuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSx0KXt2YXIgbj1ldC5mblt0XTtldC5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKCQodCwhMCksZSxyLGkpfX0pLGV0LmVhY2goe3NsaWRlRG93bjokKCJzaG93Iiksc2xpZGVVcDokKCJoaWRlIiksc2xpZGVUb2dnbGU6JCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe2V0LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLGV0LnRpbWVycz1bXSxldC5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49ZXQudGltZXJzO2ZvcihLdD1ldC5ub3coKTt0PG4ubGVuZ3RoO3QrKyllPW5bdF0sZSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHxldC5meC5zdG9wKCksS3Q9dm9pZCAwfSxldC5meC50aW1lcj1mdW5jdGlvbihlKXtldC50aW1lcnMucHVzaChlKSxlKCk/ZXQuZnguc3RhcnQoKTpldC50aW1lcnMucG9wKCl9LGV0LmZ4LmludGVydmFsPTEzLGV0LmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7R3R8fChHdD1zZXRJbnRlcnZhbChldC5meC50aWNrLGV0LmZ4LmludGVydmFsKSl9LGV0LmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKEd0KSxHdD1udWxsfSxldC5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sZXQuZm4uZGVsYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1ldC5meD9ldC5meC5zcGVlZHNbZV18fGU6ZSx0PXR8fCJmeCIsdGhpcy5xdWV1ZSh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9c2V0VGltZW91dCh0LGUpO24uc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChyKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1HLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1HLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLG49dC5hcHBlbmRDaGlsZChHLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtlLnR5cGU9ImNoZWNrYm94IixLLmNoZWNrT249IiIhPT1lLnZhbHVlLEsub3B0U2VsZWN0ZWQ9bi5zZWxlY3RlZCx0LmRpc2FibGVkPSEwLEsub3B0RGlzYWJsZWQ9IW4uZGlzYWJsZWQsZT1HLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksZS52YWx1ZT0idCIsZS50eXBlPSJyYWRpbyIsSy5yYWRpb1ZhbHVlPSJ0Ij09PWUudmFsdWV9KCk7dmFyIG9uLGFuLHNuPWV0LmV4cHIuYXR0ckhhbmRsZTtldC5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geXQodGhpcyxldC5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtldC5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxldC5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKGUmJjMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09PVR0P2V0LnByb3AoZSx0LG4pOigxPT09byYmZXQuaXNYTUxEb2MoZSl8fCh0PXQudG9Mb3dlckNhc2UoKSxyPWV0LmF0dHJIb29rc1t0XXx8KGV0LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2FuOm9uKSksdm9pZCAwPT09bj9yJiYiZ2V0ImluIHImJm51bGwhPT0oaT1yLmdldChlLHQpKT9pOihpPWV0LmZpbmQuYXR0cihlLHQpLG51bGw9PWk/dm9pZCAwOmkpOm51bGwhPT1uP3ImJiJzZXQiaW4gciYmdm9pZCAwIT09KGk9ci5zZXQoZSxuLHQpKT9pOihlLnNldEF0dHJpYnV0ZSh0LG4rIiIpLG4pOnZvaWQgZXQucmVtb3ZlQXR0cihlLHQpKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0wLG89dCYmdC5tYXRjaChkdCk7aWYobyYmMT09PWUubm9kZVR5cGUpZm9yKDtuPW9baSsrXTspcj1ldC5wcm9wRml4W25dfHxuLGV0LmV4cHIubWF0Y2guYm9vbC50ZXN0KG4pJiYoZVtyXT0hMSksZS5yZW1vdmVBdHRyaWJ1dGUobil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIUsucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJmV0Lm5vZGVOYW1lKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fX0pLGFuPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT09ITE/ZXQucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LGV0LmVhY2goZXQuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIG49c25bdF18fGV0LmZpbmQuYXR0cjtzblt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbztyZXR1cm4gcnx8KG89c25bdF0sc25bdF09aSxpPW51bGwhPW4oZSx0LHIpP3QudG9Mb3dlckNhc2UoKTpudWxsLHNuW3RdPW8pLGl9fSk7dmFyIGxuPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2k7ZXQuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHl0KHRoaXMsZXQucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbZXQucHJvcEZpeFtlXXx8ZV19KX19KSxldC5leHRlbmQoe3Byb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSxwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1lLm5vZGVUeXBlO2lmKGUmJjMhPT1hJiY4IT09YSYmMiE9PWEpcmV0dXJuIG89MSE9PWF8fCFldC5pc1hNTERvYyhlKSxvJiYodD1ldC5wcm9wRml4W3RdfHx0LGk9ZXQucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fGxuLnRlc3QoZS5ub2RlTmFtZSl8fGUuaHJlZj9lLnRhYkluZGV4Oi0xfX19fSksSy5vcHRTZWxlY3RlZHx8KGV0LnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfX0pLGV0LmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe2V0LnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7dmFyIHVuPS9bXHRcclxuXGZdL2c7ZXQuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz0ic3RyaW5nIj09dHlwZW9mIGUmJmUsbD0wLHU9dGhpcy5sZW5ndGg7aWYoZXQuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe2V0KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKHMpZm9yKHQ9KGV8fCIiKS5tYXRjaChkdCl8fFtdO3U+bDtsKyspaWYobj10aGlzW2xdLHI9MT09PW4ubm9kZVR5cGUmJihuLmNsYXNzTmFtZT8oIiAiK24uY2xhc3NOYW1lKyIgIikucmVwbGFjZSh1biwiICIpOiIgIikpe2ZvcihvPTA7aT10W28rK107KXIuaW5kZXhPZigiICIraSsiICIpPDAmJihyKz1pKyIgIik7YT1ldC50cmltKHIpLG4uY2xhc3NOYW1lIT09YSYmKG4uY2xhc3NOYW1lPWEpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz0wPT09YXJndW1lbnRzLmxlbmd0aHx8InN0cmluZyI9PXR5cGVvZiBlJiZlLGw9MCx1PXRoaXMubGVuZ3RoO2lmKGV0LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXtldCh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZihzKWZvcih0PShlfHwiIikubWF0Y2goZHQpfHxbXTt1Pmw7bCsrKWlmKG49dGhpc1tsXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodW4sIiAiKToiIikpe2ZvcihvPTA7aT10W28rK107KWZvcig7ci5pbmRleE9mKCIgIitpKyIgIik+PTA7KXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO2E9ZT9ldC50cmltKHIpOiIiLG4uY2xhc3NOYW1lIT09YSYmKG4uY2xhc3NOYW1lPWEpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJiJzdHJpbmciPT09bj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTp0aGlzLmVhY2goZXQuaXNGdW5jdGlvbihlKT9mdW5jdGlvbihuKXtldCh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfTpmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09bilmb3IodmFyIHQscj0wLGk9ZXQodGhpcyksbz1lLm1hdGNoKGR0KXx8W107dD1vW3IrK107KWkuaGFzQ2xhc3ModCk/aS5yZW1vdmVDbGFzcyh0KTppLmFkZENsYXNzKHQpO2Vsc2Uobj09PVR0fHwiYm9vbGVhbiI9PT1uKSYmKHRoaXMuY2xhc3NOYW1lJiZ2dC5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6dnQuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0iICIrZSsiICIsbj0wLHI9dGhpcy5sZW5ndGg7cj5uO24rKylpZigxPT09dGhpc1tuXS5ub2RlVHlwZSYmKCIgIit0aGlzW25dLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodW4sIiAiKS5pbmRleE9mKHQpPj0wKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBjbj0vXHIvZztldC5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPWV0LmlzRnVuY3Rpb24oZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYoaT1yP2UuY2FsbCh0aGlzLG4sZXQodGhpcykudmFsKCkpOmUsbnVsbD09aT9pPSIiOiJudW1iZXIiPT10eXBlb2YgaT9pKz0iIjpldC5pc0FycmF5KGkpJiYoaT1ldC5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLHQ9ZXQudmFsSG9va3NbdGhpcy50eXBlXXx8ZXQudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSx0JiYic2V0ImluIHQmJnZvaWQgMCE9PXQuc2V0KHRoaXMsaSwidmFsdWUiKXx8KHRoaXMudmFsdWU9aSkpfSk7aWYoaSlyZXR1cm4gdD1ldC52YWxIb29rc1tpLnR5cGVdfHxldC52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHQmJiJnZXQiaW4gdCYmdm9pZCAwIT09KG49dC5nZXQoaSwidmFsdWUiKSk/bjoobj1pLnZhbHVlLCJzdHJpbmciPT10eXBlb2Ygbj9uLnJlcGxhY2UoY24sIiIpOm51bGw9PW4/IiI6bil9fX0pLGV0LmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWV0LmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6ZXQudHJpbShldC50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LG89InNlbGVjdC1vbmUiPT09ZS50eXBlfHwwPmksYT1vP251bGw6W10scz1vP2krMTpyLmxlbmd0aCxsPTA+aT9zOm8/aTowO3M+bDtsKyspaWYobj1yW2xdLCEoIW4uc2VsZWN0ZWQmJmwhPT1pfHwoSy5vcHREaXNhYmxlZD9uLmRpc2FibGVkOm51bGwhPT1uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fG4ucGFyZW50Tm9kZS5kaXNhYmxlZCYmZXQubm9kZU5hbWUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1ldChuKS52YWwoKSxvKXJldHVybiB0O2EucHVzaCh0KX1yZXR1cm4gYX0sc2V0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsaT1lLm9wdGlvbnMsbz1ldC5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDthLS07KXI9aVthXSwoci5zZWxlY3RlZD1ldC5pbkFycmF5KHIudmFsdWUsbyk+PTApJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxldC5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7ZXQudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe3JldHVybiBldC5pc0FycmF5KHQpP2UuY2hlY2tlZD1ldC5pbkFycmF5KGV0KGUpLnZhbCgpLHQpPj0wOnZvaWQgMH19LEsuY2hlY2tPbnx8KGV0LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksZXQuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2V0LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSxldC5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfSxiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX19KTt2YXIgcG49ZXQubm93KCksaG49L1w/LztldC5wYXJzZUpTT049ZnVuY3Rpb24oZSl7cmV0dXJuIEpTT04ucGFyc2UoZSsiIil9LGV0LnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7bj1uZXcgRE9NUGFyc2VyLHQ9bi5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChyKXt0PXZvaWQgMH1yZXR1cm4oIXR8fHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmZXQuZXJyb3IoIkludmFsaWQgWE1MOiAiK2UpLHR9O3ZhciBmbj0vIy4qJC8sZG49LyhbPyZdKV89W14mXSovLG1uPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sZ249L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8seW49L14oPzpHRVR8SEVBRCkkLyx2bj0vXlwvXC8vLGJuPS9eKFtcdy4rLV0rOikoPzpcL1wvKD86W15cLz8jXSpAfCkoW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLHduPXt9LHhuPXt9LEFuPSIqLyIuY29uY2F0KCIqIiksRW49dC5sb2NhdGlvbi5ocmVmLGpuPWJuLmV4ZWMoRW4udG9Mb3dlckNhc2UoKSl8fFtdO2V0LmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6RW4sdHlwZToiR0VUIixpc0xvY2FsOmduLnRlc3Qoam5bMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6QW4sdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpldC5wYXJzZUpTT04sInRleHQgeG1sIjpldC5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/TShNKGUsZXQuYWpheFNldHRpbmdzKSx0KTpNKGV0LmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpJKHduKSxhamF4VHJhbnNwb3J0OkkoeG4pLGFqYXg6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuLGEpe3ZhciBsLGMseSx2LHcsQT10OzIhPT1iJiYoYj0yLHMmJmNsZWFyVGltZW91dChzKSxyPXZvaWQgMCxvPWF8fCIiLHgucmVhZHlTdGF0ZT1lPjA/NDowLGw9ZT49MjAwJiYzMDA+ZXx8MzA0PT09ZSxuJiYodj1VKHAseCxuKSksdj1IKHAsdix4LGwpLGw/KHAuaWZNb2RpZmllZCYmKHc9eC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihldC5sYXN0TW9kaWZpZWRbaV09dyksdz14LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKGV0LmV0YWdbaV09dykpLDIwND09PWV8fCJIRUFEIj09PXAudHlwZT9BPSJub2NvbnRlbnQiOjMwND09PWU/QT0ibm90bW9kaWZpZWQiOihBPXYuc3RhdGUsYz12LmRhdGEseT12LmVycm9yLGw9IXkpKTooeT1BLChlfHwhQSkmJihBPSJlcnJvciIsMD5lJiYoZT0wKSkpLHguc3RhdHVzPWUseC5zdGF0dXNUZXh0PSh0fHxBKSsiIixsP2QucmVzb2x2ZVdpdGgoaCxbYyxBLHhdKTpkLnJlamVjdFdpdGgoaCxbeCxBLHldKSx4LnN0YXR1c0NvZGUoZyksZz12b2lkIDAsdSYmZi50cmlnZ2VyKGw/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbeCxwLGw/Yzp5XSksbS5maXJlV2l0aChoLFt4LEFdKSx1JiYoZi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LHBdKSwtLWV0LmFjdGl2ZXx8ZXQuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfSJvYmplY3QiPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksdD10fHx7fTt2YXIgcixpLG8sYSxzLGwsdSxjLHA9ZXQuYWpheFNldHVwKHt9LHQpLGg9cC5jb250ZXh0fHxwLGY9cC5jb250ZXh0JiYoaC5ub2RlVHlwZXx8aC5qcXVlcnkpP2V0KGgpOmV0LmV2ZW50LGQ9ZXQuRGVmZXJyZWQoKSxtPWV0LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxnPXAuc3RhdHVzQ29kZXx8e30seT17fSx2PXt9LGI9MCx3PSJjYW5jZWxlZCIseD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKDI9PT1iKXtpZighYSlmb3IoYT17fTt0PW1uLmV4ZWMobyk7KWFbdFsxXS50b0xvd2VyQ2FzZSgpXT10WzJdO3Q9YVtlLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT10P251bGw6dH0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT1iP286bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYnx8KGU9dltuXT12W25dfHxlLHlbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gYnx8KHAubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKDI+Yilmb3IodCBpbiBlKWdbdF09W2dbdF0sZVt0XV07ZWxzZSB4LmFsd2F5cyhlW3guc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHc7cmV0dXJuIHImJnIuYWJvcnQodCksbigwLHQpLHRoaXN9fTtpZihkLnByb21pc2UoeCkuY29tcGxldGU9bS5hZGQseC5zdWNjZXNzPXguZG9uZSx4LmVycm9yPXguZmFpbCxwLnVybD0oKGV8fHAudXJsfHxFbikrIiIpLnJlcGxhY2UoZm4sIiIpLnJlcGxhY2Uodm4sam5bMV0rIi8vIikscC50eXBlPXQubWV0aG9kfHx0LnR5cGV8fHAubWV0aG9kfHxwLnR5cGUscC5kYXRhVHlwZXM9ZXQudHJpbShwLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goZHQpfHxbIiJdLG51bGw9PXAuY3Jvc3NEb21haW4mJihsPWJuLmV4ZWMocC51cmwudG9Mb3dlckNhc2UoKSkscC5jcm9zc0RvbWFpbj0hKCFsfHxsWzFdPT09am5bMV0mJmxbMl09PT1qblsyXSYmKGxbM118fCgiaHR0cDoiPT09bFsxXT8iODAiOiI0NDMiKSk9PT0oam5bM118fCgiaHR0cDoiPT09am5bMV0/IjgwIjoiNDQzIikpKSkscC5kYXRhJiZwLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIHAuZGF0YSYmKHAuZGF0YT1ldC5wYXJhbShwLmRhdGEscC50cmFkaXRpb25hbCkpLFIod24scCx0LHgpLDI9PT1iKXJldHVybiB4O3U9ZXQuZXZlbnQmJnAuZ2xvYmFsLHUmJjA9PT1ldC5hY3RpdmUrKyYmZXQuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IikscC50eXBlPXAudHlwZS50b1VwcGVyQ2FzZSgpLHAuaGFzQ29udGVudD0heW4udGVzdChwLnR5cGUpLGk9cC51cmwscC5oYXNDb250ZW50fHwocC5kYXRhJiYoaT1wLnVybCs9KGhuLnRlc3QoaSk/IiYiOiI/IikrcC5kYXRhLGRlbGV0ZSBwLmRhdGEpLHAuY2FjaGU9PT0hMSYmKHAudXJsPWRuLnRlc3QoaSk/aS5yZXBsYWNlKGRuLCIkMV89IitwbisrKTppKyhobi50ZXN0KGkpPyImIjoiPyIpKyJfPSIrcG4rKykpLHAuaWZNb2RpZmllZCYmKGV0Lmxhc3RNb2RpZmllZFtpXSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZXQubGFzdE1vZGlmaWVkW2ldKSxldC5ldGFnW2ldJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGV0LmV0YWdbaV0pKSwocC5kYXRhJiZwLmhhc0NvbnRlbnQmJnAuY29udGVudFR5cGUhPT0hMXx8dC5jb250ZW50VHlwZSkmJnguc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixwLmNvbnRlbnRUeXBlKSx4LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIscC5kYXRhVHlwZXNbMF0mJnAuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0/cC5hY2NlcHRzW3AuZGF0YVR5cGVzWzBdXSsoIioiIT09cC5kYXRhVHlwZXNbMF0/IiwgIitBbisiOyBxPTAuMDEiOiIiKTpwLmFjY2VwdHNbIioiXSk7Zm9yKGMgaW4gcC5oZWFkZXJzKXguc2V0UmVxdWVzdEhlYWRlcihjLHAuaGVhZGVyc1tjXSk7aWYocC5iZWZvcmVTZW5kJiYocC5iZWZvcmVTZW5kLmNhbGwoaCx4LHApPT09ITF8fDI9PT1iKSlyZXR1cm4geC5hYm9ydCgpO3c9ImFib3J0Ijtmb3IoYyBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl4W2NdKHBbY10pO2lmKHI9Uih4bixwLHQseCkpe3gucmVhZHlTdGF0ZT0xLHUmJmYudHJpZ2dlcigiYWpheFNlbmQiLFt4LHBdKSxwLmFzeW5jJiZwLnRpbWVvdXQ+MCYmKHM9c2V0VGltZW91dChmdW5jdGlvbigpe3guYWJvcnQoInRpbWVvdXQiKX0scC50aW1lb3V0KSk7dHJ5e2I9MSxyLnNlbmQoeSxuKX1jYXRjaChBKXtpZighKDI+YikpdGhyb3cgQTtuKC0xLEEpfX1lbHNlIG4oLTEsIk5vIFRyYW5zcG9ydCIpO3JldHVybiB4fSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZXQuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBldC5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksZXQuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihlLHQpe2V0W3RdPWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBldC5pc0Z1bmN0aW9uKG4pJiYoaT1pfHxyLHI9bixuPXZvaWQgMCksZXQuYWpheCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0pfX0pLGV0Ll9ldmFsVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBldC5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxldC5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGV0LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe2V0KHRoaXMpLndyYXBBbGwoZS5jYWxsKHRoaXMsdCkpfSk6KHRoaXNbMF0mJih0PWV0KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzO2UuZmlyc3RFbGVtZW50Q2hpbGQ7KWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGV0LmlzRnVuY3Rpb24oZSk/ZnVuY3Rpb24odCl7ZXQodGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX06ZnVuY3Rpb24oKXt2YXIgdD1ldCh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1ldC5pc0Z1bmN0aW9uKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7ZXQodGhpcykud3JhcEFsbCh0P2UuY2FsbCh0aGlzLG4pOmUpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtldC5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGV0KHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxldC5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGUpe3JldHVybiBlLm9mZnNldFdpZHRoPD0wJiZlLm9mZnNldEhlaWdodDw9MH0sZXQuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuIWV0LmV4cHIuZmlsdGVycy5oaWRkZW4oZSl9O3ZhciBDbj0vJTIwL2csVG49L1xbXF0kLyxTbj0vXHI/XG4vZyxfbj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksT249L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2V0LnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPWZ1bmN0aW9uKGUsdCl7dD1ldC5pc0Z1bmN0aW9uKHQpP3QoKTpudWxsPT10PyIiOnQscltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O2lmKHZvaWQgMD09PXQmJih0PWV0LmFqYXhTZXR0aW5ncyYmZXQuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxldC5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIWV0LmlzUGxhaW5PYmplY3QoZSkpZXQuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpRihuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIikucmVwbGFjZShDbiwiKyIpfSxldC5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBldC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPWV0LnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9ldC5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhZXQodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZPbi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhX24udGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IUN0LnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZXQodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpldC5pc0FycmF5KG4pP2V0Lm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoU24sIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKFNuLCJcclxuIil9fSkuZ2V0KCl9fSksZXQuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBrbj0wLCRuPXt9LERuPXswOjIwMCwxMjIzOjIwNH0sTG49ZXQuYWpheFNldHRpbmdzLnhocigpO3QuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiAkbikkbltlXSgpfSksSy5jb3JzPSEhTG4mJiJ3aXRoQ3JlZGVudGlhbHMiaW4gTG4sSy5hamF4PUxuPSEhTG4sZXQuYWpheFRyYW5zcG9ydChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gSy5jb3JzfHxMbiYmIWUuY3Jvc3NEb21haW4/e3NlbmQ6ZnVuY3Rpb24obixyKXt2YXIgaSxvPWUueGhyKCksYT0rK2tuO2lmKG8ub3BlbihlLnR5cGUsZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpLGUueGhyRmllbGRzKWZvcihpIGluIGUueGhyRmllbGRzKW9baV09ZS54aHJGaWVsZHNbaV07ZS5taW1lVHlwZSYmby5vdmVycmlkZU1pbWVUeXBlJiZvLm92ZXJyaWRlTWltZVR5cGUoZS5taW1lVHlwZSksZS5jcm9zc0RvbWFpbnx8blsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoblsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihpIGluIG4pby5zZXRSZXF1ZXN0SGVhZGVyKGksbltpXSk7dD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiYoZGVsZXRlICRuW2FdLHQ9by5vbmxvYWQ9by5vbmVycm9yPW51bGwsImFib3J0Ij09PWU/by5hYm9ydCgpOiJlcnJvciI9PT1lP3Ioby5zdGF0dXMsby5zdGF0dXNUZXh0KTpyKERuW28uc3RhdHVzXXx8by5zdGF0dXMsby5zdGF0dXNUZXh0LCJzdHJpbmciPT10eXBlb2Ygby5yZXNwb25zZVRleHQ/e3RleHQ6by5yZXNwb25zZVRleHR9OnZvaWQgMCxvLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxvLm9ubG9hZD10KCksby5vbmVycm9yPXQoImVycm9yIiksdD0kblthXT10KCJhYm9ydCIpO3RyeXtvLnNlbmQoZS5oYXNDb250ZW50JiZlLmRhdGF8fG51bGwpfWNhdGNoKHMpe2lmKHQpdGhyb3cgc319LGFib3J0OmZ1bmN0aW9uKCl7dCYmdCgpfX06dm9pZCAwfSksZXQuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovKD86amF2YXxlY21hKXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV0Lmdsb2JhbEV2YWwoZSksZX19fSksZXQuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxldC5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24ocixpKXt0PWV0KCI8c2NyaXB0PiIpLnByb3Aoe2FzeW5jOiEwLGNoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKGUpe3QucmVtb3ZlKCksbj1udWxsLGUmJmkoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxHLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIE5uPVtdLFBuPS8oPSlcPyg/PSZ8JCl8XD9cPy87ZXQuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1Obi5wb3AoKXx8ZXQuZXhwYW5kbysiXyIrcG4rKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLGV0LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGEscz1lLmpzb25wIT09ITEmJihQbi50ZXN0KGUudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGUuZGF0YSYmIShlLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJlBuLnRlc3QoZS5kYXRhKSYmImRhdGEiKTtyZXR1cm4gc3x8Impzb25wIj09PWUuZGF0YVR5cGVzWzBdPyhpPWUuanNvbnBDYWxsYmFjaz1ldC5pc0Z1bmN0aW9uKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLHM/ZVtzXT1lW3NdLnJlcGxhY2UoUG4sIiQxIitpKTplLmpzb25wIT09ITEmJihlLnVybCs9KGhuLnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK2kpLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxldC5lcnJvcihpKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsbz10W2ldLHRbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt0W2ldPW8sZVtpXSYmKGUuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssTm4ucHVzaChpKSksYSYmZXQuaXNGdW5jdGlvbihvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksInNjcmlwdCIpOnZvaWQgMH0pLGV0LnBhcnNlSFRNTD1mdW5jdGlvbihlLHQsbil7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDsiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpLHQ9dHx8Rzt2YXIgcj1zdC5leGVjKGUpLGk9IW4mJltdO3JldHVybiByP1t0LmNyZWF0ZUVsZW1lbnQoclsxXSldOihyPWV0LmJ1aWxkRnJhZ21lbnQoW2VdLHQsaSksaSYmaS5sZW5ndGgmJmV0KGkpLnJlbW92ZSgpLGV0Lm1lcmdlKFtdLHIuY2hpbGROb2RlcykpfTt2YXIgSW49ZXQuZm4ubG9hZDtldC5mbi5sb2FkPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUmJkluKXJldHVybiBJbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPj0wJiYocj1ldC50cmltKGUuc2xpY2UocykpLGU9ZS5zbGljZSgwLHMpKSxldC5pc0Z1bmN0aW9uKHQpPyhuPXQsdD12b2lkIDApOnQmJiJvYmplY3QiPT10eXBlb2YgdCYmKGk9IlBPU1QiKSxhLmxlbmd0aD4wJiZldC5hamF4KHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMsYS5odG1sKHI/ZXQoIjxkaXY+IikuYXBwZW5kKGV0LnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmNvbXBsZXRlKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKG4sb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSksdGhpc30sZXQuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7ZXQuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSxldC5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV0LmdyZXAoZXQudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofTt2YXIgUm49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZXQub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsbCx1LGM9ZXQuY3NzKGUsInBvc2l0aW9uIikscD1ldChlKSxoPXt9OyJzdGF0aWMiPT09YyYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1wLm9mZnNldCgpLG89ZXQuY3NzKGUsInRvcCIpLGw9ZXQuY3NzKGUsImxlZnQiKSx1PSgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobytsKS5pbmRleE9mKCJhdXRvIik+LTEsdT8ocj1wLnBvc2l0aW9uKCksYT1yLnRvcCxpPXIubGVmdCk6KGE9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQobCl8fDApLGV0LmlzRnVuY3Rpb24odCkmJih0PXQuY2FsbChlLG4scykpLG51bGwhPXQudG9wJiYoaC50b3A9dC50b3Atcy50b3ArYSksbnVsbCE9dC5sZWZ0JiYoaC5sZWZ0PXQubGVmdC1zLmxlZnQraSksInVzaW5nImluIHQ/dC51c2luZy5jYWxsKGUsaCk6cC5jc3MoaCl9fSxldC5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe2V0Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfSxvPXImJnIub3duZXJEb2N1bWVudDtpZihvKXJldHVybiB0PW8uZG9jdW1lbnRFbGVtZW50LGV0LmNvbnRhaW5zKHQscik/KHR5cGVvZiByLmdldEJvdW5kaW5nQ2xpZW50UmVjdCE9PVR0JiYoaT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxuPUIobykse3RvcDppLnRvcCtuLnBhZ2VZT2Zmc2V0LXQuY2xpZW50VG9wLGxlZnQ6aS5sZWZ0K24ucGFnZVhPZmZzZXQtdC5jbGllbnRMZWZ0fSk6aX0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgZSx0LG49dGhpc1swXSxyPXt0b3A6MCxsZWZ0OjB9O3JldHVybiJmaXhlZCI9PT1ldC5jc3MobiwicG9zaXRpb24iKT90PW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGU9dGhpcy5vZmZzZXRQYXJlbnQoKSx0PXRoaXMub2Zmc2V0KCksZXQubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwocj1lLm9mZnNldCgpKSxyLnRvcCs9ZXQuY3NzKGVbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksci5sZWZ0Kz1ldC5jc3MoZVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6dC50b3Atci50b3AtZXQuY3NzKG4sIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LXIubGVmdC1ldC5jc3MobiwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8Um47ZSYmIWV0Lm5vZGVOYW1lKGUsImh0bWwiKSYmInN0YXRpYyI9PT1ldC5jc3MoZSwicG9zaXRpb24iKTspZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8Um59KX19KSxldC5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsbil7dmFyIHI9InBhZ2VZT2Zmc2V0Ij09PW47ZXQuZm5bZV09ZnVuY3Rpb24oaSl7cmV0dXJuIHl0KHRoaXMsZnVuY3Rpb24oZSxpLG8pe3ZhciBhPUIoZSk7cmV0dXJuIHZvaWQgMD09PW8/YT9hW25dOmVbaV06dm9pZChhP2Euc2Nyb2xsVG8ocj90LnBhZ2VYT2Zmc2V0Om8scj9vOnQucGFnZVlPZmZzZXQpOmVbaV09byl9LGUsaSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLGV0LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXtldC5jc3NIb29rc1t0XT1FKEsucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe3JldHVybiBuPyhuPUEoZSx0KSxxdC50ZXN0KG4pP2V0KGUpLnBvc2l0aW9uKClbdF0rInB4IjpuKTp2b2lkIDB9KX0pLGV0LmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihlLHQpe2V0LmVhY2goe3BhZGRpbmc6ImlubmVyIitlLGNvbnRlbnQ6dCwiIjoib3V0ZXIiK2V9LGZ1bmN0aW9uKG4scil7ZXQuZm5bcl09ZnVuY3Rpb24ocixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2YgciksYT1ufHwocj09PSEwfHxpPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB5dCh0aGlzLGZ1bmN0aW9uKHQsbixyKXt2YXIgaTtyZXR1cm4gZXQuaXNXaW5kb3codCk/dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrZV06OT09PXQubm9kZVR5cGU/KGk9dC5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgodC5ib2R5WyJzY3JvbGwiK2VdLGlbInNjcm9sbCIrZV0sdC5ib2R5WyJvZmZzZXQiK2VdLGlbIm9mZnNldCIrZV0saVsiY2xpZW50IitlXSkpOnZvaWQgMD09PXI/ZXQuY3NzKHQsbixhKTpldC5zdHlsZSh0LG4scixhKX0sdCxvP3I6dm9pZCAwLG8sbnVsbCl9fSl9KSxldC5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxldC5mbi5hbmRTZWxmPWV0LmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYW1kJiZlKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGV0fSk7dmFyIE1uPXQualF1ZXJ5LFVuPXQuJDtyZXR1cm4gZXQubm9Db25mbGljdD1mdW5jdGlvbihlKXtyZXR1cm4gdC4kPT09ZXQmJih0LiQ9VW4pLGUmJnQualF1ZXJ5PT09ZXQmJih0LmpRdWVyeT1NbiksZXR9LHR5cGVvZiBuPT09VHQmJih0LmpRdWVyeT10LiQ9ZXQpLGV0fSl9LHt9XSwxOTpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXt2YXIgYT1lP2UubGVuZ3RoOjA7aWYoIWEpcmV0dXJuLTE7aWYoIm51bWJlciI9PXR5cGVvZiBuKW49MD5uP28oYStuLDApOm47ZWxzZSBpZihuKXt2YXIgcz1pKGUsdCksbD1lW3NdO3JldHVybih0PT09dD90PT09bDpsIT09bCk/czotMX1yZXR1cm4gcihlLHQsbnx8MCl9dmFyIHI9ZSgiLi4vaW50ZXJuYWwvYmFzZUluZGV4T2YiKSxpPWUoIi4uL2ludGVybmFsL2JpbmFyeUluZGV4Iiksbz1NYXRoLm1heDt0LmV4cG9ydHM9bn0seyIuLi9pbnRlcm5hbC9iYXNlSW5kZXhPZiI6NDIsIi4uL2ludGVybmFsL2JpbmFyeUluZGV4Ijo1NH1dLDIwOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7aWYocyhlKSYmIWEoZSkmJiEoZSBpbnN0YW5jZW9mIHIpKXtpZihlIGluc3RhbmNlb2YgaSlyZXR1cm4gZTtpZihjLmNhbGwoZSwiX19jaGFpbl9fIikmJmMuY2FsbChlLCJfX3dyYXBwZWRfXyIpKXJldHVybiBsKGUpfXJldHVybiBuZXcgaShlKX12YXIgcj1lKCIuLi9pbnRlcm5hbC9MYXp5V3JhcHBlciIpLGk9ZSgiLi4vaW50ZXJuYWwvTG9kYXNoV3JhcHBlciIpLG89ZSgiLi4vaW50ZXJuYWwvYmFzZUxvZGFzaCIpLGE9ZSgiLi4vbGFuZy9pc0FycmF5Iikscz1lKCIuLi9pbnRlcm5hbC9pc09iamVjdExpa2UiKSxsPWUoIi4uL2ludGVybmFsL3dyYXBwZXJDbG9uZSIpLHU9T2JqZWN0LnByb3RvdHlwZSxjPXUuaGFzT3duUHJvcGVydHk7bi5wcm90b3R5cGU9by5wcm90b3R5cGUsdC5leHBvcnRzPW59LHsiLi4vaW50ZXJuYWwvTGF6eVdyYXBwZXIiOjI3LCIuLi9pbnRlcm5hbC9Mb2Rhc2hXcmFwcGVyIjoyOCwiLi4vaW50ZXJuYWwvYmFzZUxvZGFzaCI6NDcsIi4uL2ludGVybmFsL2lzT2JqZWN0TGlrZSI6ODIsIi4uL2ludGVybmFsL3dyYXBwZXJDbG9uZSI6OTMsIi4uL2xhbmcvaXNBcnJheSI6OTZ9XSwyMTpbZnVuY3Rpb24oZSx0KXt2YXIgbj1lKCIuLi9pbnRlcm5hbC9iYXNlRWFjaCIpLHI9ZSgiLi4vaW50ZXJuYWwvY3JlYXRlRmluZCIpLGk9cihuKTt0LmV4cG9ydHM9aX0seyIuLi9pbnRlcm5hbC9iYXNlRWFjaCI6MzYsIi4uL2ludGVybmFsL2NyZWF0ZUZpbmQiOjY0fV0sMjI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49ZSgiLi4vaW50ZXJuYWwvYXJyYXlFYWNoIikscj1lKCIuLi9pbnRlcm5hbC9iYXNlRWFjaCIpLGk9ZSgiLi4vaW50ZXJuYWwvY3JlYXRlRm9yRWFjaCIpLG89aShuLHIpO3QuZXhwb3J0cz1vfSx7Ii4uL2ludGVybmFsL2FycmF5RWFjaCI6MzAsIi4uL2ludGVybmFsL2Jhc2VFYWNoIjozNiwiLi4vaW50ZXJuYWwvY3JlYXRlRm9yRWFjaCI6NjV9XSwyMzpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXt2YXIgcz1hKGUpP3I6bztyZXR1cm4gdD1pKHQsbiwzKSxzKGUsdCl9dmFyIHI9ZSgiLi4vaW50ZXJuYWwvYXJyYXlNYXAiKSxpPWUoIi4uL2ludGVybmFsL2Jhc2VDYWxsYmFjayIpLG89ZSgiLi4vaW50ZXJuYWwvYmFzZU1hcCIpLGE9ZSgiLi4vbGFuZy9pc0FycmF5Iik7dC5leHBvcnRzPW59LHsiLi4vaW50ZXJuYWwvYXJyYXlNYXAiOjMxLCIuLi9pbnRlcm5hbC9iYXNlQ2FsbGJhY2siOjMyLCIuLi9pbnRlcm5hbC9iYXNlTWFwIjo0OCwiLi4vbGFuZy9pc0FycmF5Ijo5Nn1dLDI0OltmdW5jdGlvbihlLHQpe3ZhciBuPWUoIi4uL2xhbmcvaXNOYXRpdmUiKSxyPW4ocj1EYXRlLm5vdykmJnIsaT1yfHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt0LmV4cG9ydHM9aX0seyIuLi9sYW5nL2lzTmF0aXZlIjo5OH1dLDI1OltmdW5jdGlvbihlLHQpe3ZhciBuPWUoIi4uL2ludGVybmFsL2NyZWF0ZVdyYXBwZXIiKSxyPWUoIi4uL2ludGVybmFsL3JlcGxhY2VIb2xkZXJzIiksaT1lKCIuL3Jlc3RQYXJhbSIpLG89MSxhPTMyLHM9aShmdW5jdGlvbihlLHQsaSl7dmFyIGw9bztpZihpLmxlbmd0aCl7dmFyIHU9cihpLHMucGxhY2Vob2xkZXIpO2x8PWF9cmV0dXJuIG4oZSxsLHQsaSx1KX0pO3MucGxhY2Vob2xkZXI9e30sdC5leHBvcnRzPXN9LHsiLi4vaW50ZXJuYWwvY3JlYXRlV3JhcHBlciI6NjgsIi4uL2ludGVybmFsL3JlcGxhY2VIb2xkZXJzIjo4OCwiLi9yZXN0UGFyYW0iOjI2fV0sMjY6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3Iocik7cmV0dXJuIHQ9aSgidW5kZWZpbmVkIj09dHlwZW9mIHQ/ZS5sZW5ndGgtMTordHx8MCwwKSxmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMscj0tMSxvPWkobi5sZW5ndGgtdCwwKSxhPUFycmF5KG8pOysrcjxvOylhW3JdPW5bdCtyXTtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiBlLmNhbGwodGhpcyxhKTtjYXNlIDE6cmV0dXJuIGUuY2FsbCh0aGlzLG5bMF0sYSk7Y2FzZSAyOnJldHVybiBlLmNhbGwodGhpcyxuWzBdLG5bMV0sYSl9dmFyIHM9QXJyYXkodCsxKTtmb3Iocj0tMTsrK3I8dDspc1tyXT1uW3JdO3JldHVybiBzW3RdPWEsZS5hcHBseSh0aGlzLHMpfX12YXIgcj0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsaT1NYXRoLm1heDt0LmV4cG9ydHM9bn0se31dLDI3OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7dGhpcy5fX3dyYXBwZWRfXz1lLHRoaXMuX19hY3Rpb25zX189bnVsbCx0aGlzLl9fZGlyX189MSx0aGlzLl9fZHJvcENvdW50X189MCx0aGlzLl9fZmlsdGVyZWRfXz0hMSx0aGlzLl9faXRlcmF0ZWVzX189bnVsbCx0aGlzLl9fdGFrZUNvdW50X189byx0aGlzLl9fdmlld3NfXz1udWxsfXZhciByPWUoIi4vYmFzZUNyZWF0ZSIpLGk9ZSgiLi9iYXNlTG9kYXNoIiksbz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bi5wcm90b3R5cGU9cihpLnByb3RvdHlwZSksbi5wcm90b3R5cGUuY29uc3RydWN0b3I9bix0LmV4cG9ydHM9bn0seyIuL2Jhc2VDcmVhdGUiOjM1LCIuL2Jhc2VMb2Rhc2giOjQ3fV0sMjg6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbil7dGhpcy5fX3dyYXBwZWRfXz1lLHRoaXMuX19hY3Rpb25zX189bnx8W10sdGhpcy5fX2NoYWluX189ISF0fXZhciByPWUoIi4vYmFzZUNyZWF0ZSIpLGk9ZSgiLi9iYXNlTG9kYXNoIik7bi5wcm90b3R5cGU9cihpLnByb3RvdHlwZSksbi5wcm90b3R5cGUuY29uc3RydWN0b3I9bix0LmV4cG9ydHM9bn0seyIuL2Jhc2VDcmVhdGUiOjM1LCIuL2Jhc2VMb2Rhc2giOjQ3fV0sMjk6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPS0xLHI9ZS5sZW5ndGg7Zm9yKHR8fCh0PUFycmF5KHIpKTsrK248cjspdFtuXT1lW25dO3JldHVybiB0fXQuZXhwb3J0cz1ufSx7fV0sMzA6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoOysrbjxyJiZ0KGVbbl0sbixlKSE9PSExOyk7cmV0dXJuIGV9dC5leHBvcnRzPW59LHt9XSwzMTpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT10KGVbbl0sbixlKTtyZXR1cm4gaX10LmV4cG9ydHM9bn0se31dLDMyOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0LG4pe3ZhciBsPXR5cGVvZiBlO3JldHVybiJmdW5jdGlvbiI9PWw/InVuZGVmaW5lZCI9PXR5cGVvZiB0P2U6YShlLHQsbik6bnVsbD09ZT9zOiJvYmplY3QiPT1sP3IoZSk6InVuZGVmaW5lZCI9PXR5cGVvZiB0P28oZSsiIik6aShlKyIiLHQpfXZhciByPWUoIi4vYmFzZU1hdGNoZXMiKSxpPWUoIi4vYmFzZU1hdGNoZXNQcm9wZXJ0eSIpLG89ZSgiLi9iYXNlUHJvcGVydHkiKSxhPWUoIi4vYmluZENhbGxiYWNrIikscz1lKCIuLi91dGlsaXR5L2lkZW50aXR5Iik7dC5leHBvcnRzPW59LHsiLi4vdXRpbGl0eS9pZGVudGl0eSI6MTA5LCIuL2Jhc2VNYXRjaGVzIjo0OSwiLi9iYXNlTWF0Y2hlc1Byb3BlcnR5Ijo1MCwiLi9iYXNlUHJvcGVydHkiOjUxLCIuL2JpbmRDYWxsYmFjayI6NTZ9XSwzMzpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxtLGcseSx2LHcpe3ZhciB4O2lmKG0mJih4PXk/bShlLGcseSk6bShlKSksInVuZGVmaW5lZCIhPXR5cGVvZiB4KXJldHVybiB4O2lmKCFoKGUpKXJldHVybiBlO3ZhciBFPWMoZSk7aWYoRSl7aWYoeD1zKGUpLCF0KXJldHVybiByKGUseCl9ZWxzZXt2YXIgaj1VLmNhbGwoZSksQz1qPT1iO2lmKGohPUEmJmohPWQmJighQ3x8eSkpcmV0dXJuIFJbal0/bChlLGosdCk6eT9lOnt9O2lmKHAoZSkpcmV0dXJuIHk/ZTp7fTtpZih4PXUoQz97fTplKSwhdClyZXR1cm4gbyhlLHgsZihlKSl9dnx8KHY9W10pLHd8fCh3PVtdKTtmb3IodmFyIFQ9di5sZW5ndGg7VC0tOylpZih2W1RdPT1lKXJldHVybiB3W1RdO3JldHVybiB2LnB1c2goZSksdy5wdXNoKHgpLChFP2k6YSkoZSxmdW5jdGlvbihyLGkpe3hbaV09bihyLHQsbSxpLGUsdix3KX0pLHh9dmFyIHI9ZSgiLi9hcnJheUNvcHkiKSxpPWUoIi4vYXJyYXlFYWNoIiksbz1lKCIuL2Jhc2VDb3B5IiksYT1lKCIuL2Jhc2VGb3JPd24iKSxzPWUoIi4vaW5pdENsb25lQXJyYXkiKSxsPWUoIi4vaW5pdENsb25lQnlUYWciKSx1PWUoIi4vaW5pdENsb25lT2JqZWN0IiksYz1lKCIuLi9sYW5nL2lzQXJyYXkiKSxwPWUoIi4vaXNIb3N0T2JqZWN0IiksaD1lKCIuLi9sYW5nL2lzT2JqZWN0IiksZj1lKCIuLi9vYmplY3Qva2V5cyIpLGQ9IltvYmplY3QgQXJndW1lbnRzXSIsbT0iW29iamVjdCBBcnJheV0iLGc9IltvYmplY3QgQm9vbGVhbl0iLHk9IltvYmplY3QgRGF0ZV0iLHY9IltvYmplY3QgRXJyb3JdIixiPSJbb2JqZWN0IEZ1bmN0aW9uXSIsdz0iW29iamVjdCBNYXBdIix4PSJbb2JqZWN0IE51bWJlcl0iLEE9IltvYmplY3QgT2JqZWN0XSIsRT0iW29iamVjdCBSZWdFeHBdIixqPSJbb2JqZWN0IFNldF0iLEM9IltvYmplY3QgU3RyaW5nXSIsVD0iW29iamVjdCBXZWFrTWFwXSIsUz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLF89IltvYmplY3QgRmxvYXQzMkFycmF5XSIsTz0iW29iamVjdCBGbG9hdDY0QXJyYXldIixrPSJbb2JqZWN0IEludDhBcnJheV0iLCQ9IltvYmplY3QgSW50MTZBcnJheV0iLEQ9IltvYmplY3QgSW50MzJBcnJheV0iLEw9IltvYmplY3QgVWludDhBcnJheV0iLE49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixQPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsST0iW29iamVjdCBVaW50MzJBcnJheV0iLFI9e307UltkXT1SW21dPVJbU109UltnXT1SW3ldPVJbX109UltPXT1SW2tdPVJbJF09UltEXT1SW3hdPVJbQV09UltFXT1SW0NdPVJbTF09UltOXT1SW1BdPVJbSV09ITAsUlt2XT1SW2JdPVJbd109UltqXT1SW1RdPSExO3ZhciBNPU9iamVjdC5wcm90b3R5cGUsVT1NLnRvU3RyaW5nO3QuZXhwb3J0cz1ufSx7Ii4uL2xhbmcvaXNBcnJheSI6OTYsIi4uL2xhbmcvaXNPYmplY3QiOjk5LCIuLi9vYmplY3Qva2V5cyI6MTA0LCIuL2FycmF5Q29weSI6MjksIi4vYXJyYXlFYWNoIjozMCwiLi9iYXNlQ29weSI6MzQsIi4vYmFzZUZvck93biI6NDEsIi4vaW5pdENsb25lQXJyYXkiOjc1LCIuL2luaXRDbG9uZUJ5VGFnIjo3NiwiLi9pbml0Q2xvbmVPYmplY3QiOjc3LCIuL2lzSG9zdE9iamVjdCI6Nzh9XSwzNDpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXtufHwobj10LHQ9e30pO2Zvcih2YXIgcj0tMSxpPW4ubGVuZ3RoOysrcjxpOyl7dmFyIG89bltyXTt0W29dPWVbb119cmV0dXJuIHR9dC5leHBvcnRzPW59LHt9XSwzNTpbZnVuY3Rpb24oZSx0KXsoZnVuY3Rpb24obil7dmFyIHI9ZSgiLi4vbGFuZy9pc09iamVjdCIpLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBmdW5jdGlvbih0KXtpZihyKHQpKXtlLnByb3RvdHlwZT10O3ZhciBpPW5ldyBlO2UucHJvdG90eXBlPW51bGx9cmV0dXJuIGl8fG4uT2JqZWN0KCl9fSgpO3QuZXhwb3J0cz1pfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4uL2xhbmcvaXNPYmplY3QiOjk5fV0sMzY6W2Z1bmN0aW9uKGUsdCl7dmFyIG49ZSgiLi9iYXNlRm9yT3duIikscj1lKCIuL2NyZWF0ZUJhc2VFYWNoIiksaT1yKG4pO3QuZXhwb3J0cz1pfSx7Ii4vYmFzZUZvck93biI6NDEsIi4vY3JlYXRlQmFzZUVhY2giOjYwfV0sMzc6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbixyKXt2YXIgaTtyZXR1cm4gbihlLGZ1bmN0aW9uKGUsbixvKXtyZXR1cm4gdChlLG4sbyk/KGk9cj9uOmUsITEpOnZvaWQgMH0pLGl9dC5leHBvcnRzPW59LHt9XSwzODpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXtmb3IodmFyIHI9ZS5sZW5ndGgsaT1uP3I6LTE7bj9pLS06KytpPHI7KWlmKHQoZVtpXSxpLGUpKXJldHVybiBpO3JldHVybi0xfXQuZXhwb3J0cz1ufSx7fV0sMzk6W2Z1bmN0aW9uKGUsdCl7dmFyIG49ZSgiLi9jcmVhdGVCYXNlRm9yIikscj1uKCk7dC5leHBvcnRzPXJ9LHsiLi9jcmVhdGVCYXNlRm9yIjo2MX1dLDQwOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXtyZXR1cm4gcihlLHQsaSl9dmFyIHI9ZSgiLi9iYXNlRm9yIiksaT1lKCIuLi9vYmplY3Qva2V5c0luIik7dC5leHBvcnRzPW59LHsiLi4vb2JqZWN0L2tleXNJbiI6MTA1LCIuL2Jhc2VGb3IiOjM5fV0sNDE6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe3JldHVybiByKGUsdCxpKX12YXIgcj1lKCIuL2Jhc2VGb3IiKSxpPWUoIi4uL29iamVjdC9rZXlzIik7dC5leHBvcnRzPW59LHsiLi4vb2JqZWN0L2tleXMiOjEwNCwiLi9iYXNlRm9yIjozOX1dLDQyOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0LG4pe2lmKHQhPT10KXJldHVybiByKGUsbik7Zm9yKHZhciBpPW4tMSxvPWUubGVuZ3RoOysraTxvOylpZihlW2ldPT09dClyZXR1cm4gaTtyZXR1cm4tMX12YXIgcj1lKCIuL2luZGV4T2ZOYU4iKTt0LmV4cG9ydHM9bn0seyIuL2luZGV4T2ZOYU4iOjc0fV0sNDM6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsaSxvLGEscyl7aWYoZT09PXQpcmV0dXJuIDAhPT1lfHwxL2U9PTEvdDt2YXIgbD10eXBlb2YgZSx1PXR5cGVvZiB0O3JldHVybiJmdW5jdGlvbiIhPWwmJiJvYmplY3QiIT1sJiYiZnVuY3Rpb24iIT11JiYib2JqZWN0IiE9dXx8bnVsbD09ZXx8bnVsbD09dD9lIT09ZSYmdCE9PXQ6cihlLHQsbixpLG8sYSxzKX12YXIgcj1lKCIuL2Jhc2VJc0VxdWFsRGVlcCIpO3QuZXhwb3J0cz1ufSx7Ii4vYmFzZUlzRXF1YWxEZWVwIjo0NH1dLDQ0OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0LG4sZixnLHksdil7dmFyIGI9YShlKSx3PWEodCkseD1jLEE9YztifHwoeD1tLmNhbGwoZSkseD09dT94PWg6eCE9aCYmKGI9bChlKSkpLHd8fChBPW0uY2FsbCh0KSxBPT11P0E9aDpBIT1oJiYodz1sKHQpKSk7dmFyIEU9KHg9PWh8fGcmJng9PXApJiYhcyhlKSxqPShBPT1ofHxnJiZBPT1wKSYmIXModCksQz14PT1BO2lmKEMmJiFiJiYhRSlyZXR1cm4gaShlLHQseCk7aWYoZyl7aWYoIShDfHxFJiZqKSlyZXR1cm4hMX1lbHNle3ZhciBUPUUmJmQuY2FsbChlLCJfX3dyYXBwZWRfXyIpLFM9aiYmZC5jYWxsKHQsIl9fd3JhcHBlZF9fIik7aWYoVHx8UylyZXR1cm4gbihUP2UudmFsdWUoKTplLFM/dC52YWx1ZSgpOnQsZixnLHksdik7CitpZighQylyZXR1cm4hMX15fHwoeT1bXSksdnx8KHY9W10pO2Zvcih2YXIgXz15Lmxlbmd0aDtfLS07KWlmKHlbX109PWUpcmV0dXJuIHZbX109PXQ7eS5wdXNoKGUpLHYucHVzaCh0KTt2YXIgTz0oYj9yOm8pKGUsdCxuLGYsZyx5LHYpO3JldHVybiB5LnBvcCgpLHYucG9wKCksT312YXIgcj1lKCIuL2VxdWFsQXJyYXlzIiksaT1lKCIuL2VxdWFsQnlUYWciKSxvPWUoIi4vZXF1YWxPYmplY3RzIiksYT1lKCIuLi9sYW5nL2lzQXJyYXkiKSxzPWUoIi4vaXNIb3N0T2JqZWN0IiksbD1lKCIuLi9sYW5nL2lzVHlwZWRBcnJheSIpLHU9IltvYmplY3QgQXJndW1lbnRzXSIsYz0iW29iamVjdCBBcnJheV0iLHA9IltvYmplY3QgRnVuY3Rpb25dIixoPSJbb2JqZWN0IE9iamVjdF0iLGY9T2JqZWN0LnByb3RvdHlwZSxkPWYuaGFzT3duUHJvcGVydHksbT1mLnRvU3RyaW5nO3QuZXhwb3J0cz1ufSx7Ii4uL2xhbmcvaXNBcnJheSI6OTYsIi4uL2xhbmcvaXNUeXBlZEFycmF5IjoxMDIsIi4vZXF1YWxBcnJheXMiOjY5LCIuL2VxdWFsQnlUYWciOjcwLCIuL2VxdWFsT2JqZWN0cyI6NzEsIi4vaXNIb3N0T2JqZWN0Ijo3OH1dLDQ1OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV8fCExfXQuZXhwb3J0cz1ufSx7fV0sNDY6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbixpLG8pe2Zvcih2YXIgYT0tMSxzPXQubGVuZ3RoLGw9IW87KythPHM7KWlmKGwmJmlbYV0/blthXSE9PWVbdFthXV06ISh0W2FdaW4gZSkpcmV0dXJuITE7Zm9yKGE9LTE7KythPHM7KXt2YXIgdT10W2FdLGM9ZVt1XSxwPW5bYV07aWYobCYmaVthXSl2YXIgaD0idW5kZWZpbmVkIiE9dHlwZW9mIGN8fHUgaW4gZTtlbHNlIGg9bz9vKGMscCx1KTp2b2lkIDAsInVuZGVmaW5lZCI9PXR5cGVvZiBoJiYoaD1yKHAsYyxvLCEwKSk7aWYoIWgpcmV0dXJuITF9cmV0dXJuITB9dmFyIHI9ZSgiLi9iYXNlSXNFcXVhbCIpO3QuZXhwb3J0cz1ufSx7Ii4vYmFzZUlzRXF1YWwiOjQzfV0sNDc6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpe310LmV4cG9ydHM9bn0se31dLDQ4OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1bXTtyZXR1cm4gcihlLGZ1bmN0aW9uKGUscixpKXtuLnB1c2godChlLHIsaSkpfSksbn12YXIgcj1lKCIuL2Jhc2VFYWNoIik7dC5leHBvcnRzPW59LHsiLi9iYXNlRWFjaCI6MzZ9XSw0OTpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3ZhciB0PWEoZSksbj10Lmxlbmd0aDtpZighbilyZXR1cm4gaSghMCk7aWYoMT09bil7dmFyIGw9dFswXSx1PWVbbF07aWYobyh1KSlyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmVbbF09PT11JiYoInVuZGVmaW5lZCIhPXR5cGVvZiB1fHxsIGluIHMoZSkpfX1mb3IodmFyIGM9QXJyYXkobikscD1BcnJheShuKTtuLS07KXU9ZVt0W25dXSxjW25dPXUscFtuXT1vKHUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmcihzKGUpLHQsYyxwKX19dmFyIHI9ZSgiLi9iYXNlSXNNYXRjaCIpLGk9ZSgiLi4vdXRpbGl0eS9jb25zdGFudCIpLG89ZSgiLi9pc1N0cmljdENvbXBhcmFibGUiKSxhPWUoIi4uL29iamVjdC9rZXlzIikscz1lKCIuL3RvT2JqZWN0Iik7dC5leHBvcnRzPW59LHsiLi4vb2JqZWN0L2tleXMiOjEwNCwiLi4vdXRpbGl0eS9jb25zdGFudCI6MTA4LCIuL2Jhc2VJc01hdGNoIjo0NiwiLi9pc1N0cmljdENvbXBhcmFibGUiOjgzLCIuL3RvT2JqZWN0Ijo5Mn1dLDUwOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXtyZXR1cm4gaSh0KT9mdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmbltlXT09PXQmJigidW5kZWZpbmVkIiE9dHlwZW9mIHR8fGUgaW4gbyhuKSl9OmZ1bmN0aW9uKG4pe3JldHVybiBudWxsIT1uJiZyKHQsbltlXSxudWxsLCEwKX19dmFyIHI9ZSgiLi9iYXNlSXNFcXVhbCIpLGk9ZSgiLi9pc1N0cmljdENvbXBhcmFibGUiKSxvPWUoIi4vdG9PYmplY3QiKTt0LmV4cG9ydHM9bn0seyIuL2Jhc2VJc0VxdWFsIjo0MywiLi9pc1N0cmljdENvbXBhcmFibGUiOjgzLCIuL3RvT2JqZWN0Ijo5Mn1dLDUxOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfX10LmV4cG9ydHM9bn0se31dLDUyOltmdW5jdGlvbihlLHQpe3ZhciBuPWUoIi4uL3V0aWxpdHkvaWRlbnRpdHkiKSxyPWUoIi4vbWV0YU1hcCIpLGk9cj9mdW5jdGlvbihlLHQpe3JldHVybiByLnNldChlLHQpLGV9Om47dC5leHBvcnRzPWl9LHsiLi4vdXRpbGl0eS9pZGVudGl0eSI6MTA5LCIuL21ldGFNYXAiOjg1fV0sNTM6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZTpudWxsPT1lPyIiOmUrIiJ9dC5leHBvcnRzPW59LHt9XSw1NDpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXt2YXIgbz0wLHM9ZT9lLmxlbmd0aDpvO2lmKCJudW1iZXIiPT10eXBlb2YgdCYmdD09PXQmJmE+PXMpe2Zvcig7cz5vOyl7dmFyIGw9bytzPj4+MSx1PWVbbF07KG4/dD49dTp0PnUpP289bCsxOnM9bH1yZXR1cm4gc31yZXR1cm4gcihlLHQsaSxuKX12YXIgcj1lKCIuL2JpbmFyeUluZGV4QnkiKSxpPWUoIi4uL3V0aWxpdHkvaWRlbnRpdHkiKSxvPU1hdGgucG93KDIsMzIpLTEsYT1vPj4+MTt0LmV4cG9ydHM9bn0seyIuLi91dGlsaXR5L2lkZW50aXR5IjoxMDksIi4vYmluYXJ5SW5kZXhCeSI6NTV9XSw1NTpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuLG8pe3Q9bih0KTtmb3IodmFyIHM9MCxsPWU/ZS5sZW5ndGg6MCx1PXQhPT10LGM9InVuZGVmaW5lZCI9PXR5cGVvZiB0O2w+czspe3ZhciBwPXIoKHMrbCkvMiksaD1uKGVbcF0pLGY9aD09PWg7aWYodSl2YXIgZD1mfHxvO2Vsc2UgZD1jP2YmJihvfHwidW5kZWZpbmVkIiE9dHlwZW9mIGgpOm8/dD49aDp0Pmg7ZD9zPXArMTpsPXB9cmV0dXJuIGkobCxhKX12YXIgcj1NYXRoLmZsb29yLGk9TWF0aC5taW4sbz1NYXRoLnBvdygyLDMyKS0xLGE9by0xO3QuZXhwb3J0cz1ufSx7fV0sNTY6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpcmV0dXJuIHI7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0KXJldHVybiBlO3N3aXRjaChuKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlLmNhbGwodCxuKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHIsaSl7cmV0dXJuIGUuY2FsbCh0LG4scixpKX07Y2FzZSA0OnJldHVybiBmdW5jdGlvbihuLHIsaSxvKXtyZXR1cm4gZS5jYWxsKHQsbixyLGksbyl9O2Nhc2UgNTpyZXR1cm4gZnVuY3Rpb24obixyLGksbyxhKXtyZXR1cm4gZS5jYWxsKHQsbixyLGksbyxhKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX12YXIgcj1lKCIuLi91dGlsaXR5L2lkZW50aXR5Iik7dC5leHBvcnRzPW59LHsiLi4vdXRpbGl0eS9pZGVudGl0eSI6MTA5fV0sNTc6W2Z1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHMuY2FsbChlLDApfXZhciBpPWUoIi4uL3V0aWxpdHkvY29uc3RhbnQiKSxvPWUoIi4uL2xhbmcvaXNOYXRpdmUiKSxhPW8oYT1uLkFycmF5QnVmZmVyKSYmYSxzPW8ocz1hJiZuZXcgYSgwKS5zbGljZSkmJnMsbD1NYXRoLmZsb29yLHU9byh1PW4uVWludDhBcnJheSkmJnUsYz1mdW5jdGlvbigpe3RyeXt2YXIgZT1vKGU9bi5GbG9hdDY0QXJyYXkpJiZlLHQ9bmV3IGUobmV3IGEoMTApLDAsMSkmJmV9Y2F0Y2gocil7fXJldHVybiB0fSgpLHA9Yz9jLkJZVEVTX1BFUl9FTEVNRU5UOjA7c3x8KHI9YSYmdT9mdW5jdGlvbihlKXt2YXIgdD1lLmJ5dGVMZW5ndGgsbj1jP2wodC9wKTowLHI9bipwLGk9bmV3IGEodCk7aWYobil7dmFyIG89bmV3IGMoaSwwLG4pO28uc2V0KG5ldyBjKGUsMCxuKSl9cmV0dXJuIHQhPXImJihvPW5ldyB1KGksciksby5zZXQobmV3IHUoZSxyKSkpLGl9OmkobnVsbCkpLHQuZXhwb3J0cz1yfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4uL2xhbmcvaXNOYXRpdmUiOjk4LCIuLi91dGlsaXR5L2NvbnN0YW50IjoxMDh9XSw1ODpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXtmb3IodmFyIGk9bi5sZW5ndGgsbz0tMSxhPXIoZS5sZW5ndGgtaSwwKSxzPS0xLGw9dC5sZW5ndGgsdT1BcnJheShhK2wpOysrczxsOyl1W3NdPXRbc107Zm9yKDsrK288aTspdVtuW29dXT1lW29dO2Zvcig7YS0tOyl1W3MrK109ZVtvKytdO3JldHVybiB1fXZhciByPU1hdGgubWF4O3QuZXhwb3J0cz1ufSx7fV0sNTk6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbil7Zm9yKHZhciBpPS0xLG89bi5sZW5ndGgsYT0tMSxzPXIoZS5sZW5ndGgtbywwKSxsPS0xLHU9dC5sZW5ndGgsYz1BcnJheShzK3UpOysrYTxzOyljW2FdPWVbYV07Zm9yKHZhciBwPWE7KytsPHU7KWNbcCtsXT10W2xdO2Zvcig7KytpPG87KWNbcCtuW2ldXT1lW2ErK107cmV0dXJuIGN9dmFyIHI9TWF0aC5tYXg7dC5leHBvcnRzPW59LHt9XSw2MDpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7dmFyIGE9bj9uLmxlbmd0aDowO2lmKCFyKGEpKXJldHVybiBlKG4sbyk7Zm9yKHZhciBzPXQ/YTotMSxsPWkobik7KHQ/cy0tOisrczxhKSYmbyhsW3NdLHMsbCkhPT0hMTspO3JldHVybiBufX12YXIgcj1lKCIuL2lzTGVuZ3RoIiksaT1lKCIuL3RvT2JqZWN0Iik7dC5leHBvcnRzPW59LHsiLi9pc0xlbmd0aCI6ODEsIi4vdG9PYmplY3QiOjkyfV0sNjE6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLGkpe2Zvcih2YXIgbz1yKHQpLGE9aSh0KSxzPWEubGVuZ3RoLGw9ZT9zOi0xO2U/bC0tOisrbDxzOyl7dmFyIHU9YVtsXTtpZihuKG9bdV0sdSxvKT09PSExKWJyZWFrfXJldHVybiB0fX12YXIgcj1lKCIuL3RvT2JqZWN0Iik7dC5leHBvcnRzPW59LHsiLi90b09iamVjdCI6OTJ9XSw2MjpbZnVuY3Rpb24oZSx0KXsoZnVuY3Rpb24obil7ZnVuY3Rpb24gcihlLHQpe2Z1bmN0aW9uIHIoKXt2YXIgaT10aGlzJiZ0aGlzIT09biYmdGhpcyBpbnN0YW5jZW9mIHI/bzplO3JldHVybiBpLmFwcGx5KHQsYXJndW1lbnRzKX12YXIgbz1pKGUpO3JldHVybiByfXZhciBpPWUoIi4vY3JlYXRlQ3RvcldyYXBwZXIiKTt0LmV4cG9ydHM9cn0pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL2NyZWF0ZUN0b3JXcmFwcGVyIjo2M31dLDYzOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9cihlLnByb3RvdHlwZSksbj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gaShuKT9uOnR9fXZhciByPWUoIi4vYmFzZUNyZWF0ZSIpLGk9ZSgiLi4vbGFuZy9pc09iamVjdCIpO3QuZXhwb3J0cz1ufSx7Ii4uL2xhbmcvaXNPYmplY3QiOjk5LCIuL2Jhc2VDcmVhdGUiOjM1fV0sNjQ6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQpe3JldHVybiBmdW5jdGlvbihuLHMsbCl7aWYocz1yKHMsbCwzKSxhKG4pKXt2YXIgdT1vKG4scyx0KTtyZXR1cm4gdT4tMT9uW3VdOnZvaWQgMH1yZXR1cm4gaShuLHMsZSl9fXZhciByPWUoIi4vYmFzZUNhbGxiYWNrIiksaT1lKCIuL2Jhc2VGaW5kIiksbz1lKCIuL2Jhc2VGaW5kSW5kZXgiKSxhPWUoIi4uL2xhbmcvaXNBcnJheSIpO3QuZXhwb3J0cz1ufSx7Ii4uL2xhbmcvaXNBcnJheSI6OTYsIi4vYmFzZUNhbGxiYWNrIjozMiwiLi9iYXNlRmluZCI6MzcsIi4vYmFzZUZpbmRJbmRleCI6Mzh9XSw2NTpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4sbyxhKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbyYmInVuZGVmaW5lZCI9PXR5cGVvZiBhJiZpKG4pP2UobixvKTp0KG4scihvLGEsMykpfX12YXIgcj1lKCIuL2JpbmRDYWxsYmFjayIpLGk9ZSgiLi4vbGFuZy9pc0FycmF5Iik7dC5leHBvcnRzPW59LHsiLi4vbGFuZy9pc0FycmF5Ijo5NiwiLi9iaW5kQ2FsbGJhY2siOjU2fV0sNjY6W2Z1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHIoZSx0LHgsQSxFLGosQyxULFMsXyl7ZnVuY3Rpb24gTygpe2Zvcih2YXIgZD1hcmd1bWVudHMubGVuZ3RoLG09ZCxnPUFycmF5KGQpO20tLTspZ1ttXT1hcmd1bWVudHNbbV07aWYoQSYmKGc9byhnLEEsRSkpLGomJihnPWEoZyxqLEMpKSxMfHxQKXt2YXIgYj1PLnBsYWNlaG9sZGVyLE09YyhnLGIpO2lmKGQtPU0ubGVuZ3RoLF8+ZCl7dmFyIFU9VD9pKFQpOm51bGwsSD13KF8tZCwwKSxGPUw/TTpudWxsLEI9TD9udWxsOk0scT1MP2c6bnVsbCx6PUw/bnVsbDpnO3R8PUw/eTp2LHQmPX4oTD92OnkpLE58fCh0Jj1+KGh8ZikpO3ZhciBWPVtlLHQseCxxLEYseixCLFUsUyxIXSxXPXIuYXBwbHkodm9pZCAwLFYpO3JldHVybiBsKGUpJiZwKFcsViksVy5wbGFjZWhvbGRlcj1iLFd9fXZhciBKPSQ/eDp0aGlzO0QmJihlPUpbUl0pLFQmJihnPXUoZyxUKSksayYmUzxnLmxlbmd0aCYmKGcubGVuZ3RoPVMpO3ZhciBZPXRoaXMmJnRoaXMhPT1uJiZ0aGlzIGluc3RhbmNlb2YgTz9JfHxzKGUpOmU7cmV0dXJuIFkuYXBwbHkoSixnKX12YXIgaz10JmIsJD10JmgsRD10JmYsTD10Jm0sTj10JmQsUD10JmcsST0hRCYmcyhlKSxSPWU7cmV0dXJuIE99dmFyIGk9ZSgiLi9hcnJheUNvcHkiKSxvPWUoIi4vY29tcG9zZUFyZ3MiKSxhPWUoIi4vY29tcG9zZUFyZ3NSaWdodCIpLHM9ZSgiLi9jcmVhdGVDdG9yV3JhcHBlciIpLGw9ZSgiLi9pc0xhemlhYmxlIiksdT1lKCIuL3Jlb3JkZXIiKSxjPWUoIi4vcmVwbGFjZUhvbGRlcnMiKSxwPWUoIi4vc2V0RGF0YSIpLGg9MSxmPTIsZD00LG09OCxnPTE2LHk9MzIsdj02NCxiPTEyOCx3PU1hdGgubWF4O3QuZXhwb3J0cz1yfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vYXJyYXlDb3B5IjoyOSwiLi9jb21wb3NlQXJncyI6NTgsIi4vY29tcG9zZUFyZ3NSaWdodCI6NTksIi4vY3JlYXRlQ3RvcldyYXBwZXIiOjYzLCIuL2lzTGF6aWFibGUiOjgwLCIuL3Jlb3JkZXIiOjg3LCIuL3JlcGxhY2VIb2xkZXJzIjo4OCwiLi9zZXREYXRhIjo4OX1dLDY3OltmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihuKXtmdW5jdGlvbiByKGUsdCxyLGEpe2Z1bmN0aW9uIHMoKXtmb3IodmFyIHQ9LTEsaT1hcmd1bWVudHMubGVuZ3RoLG89LTEsYz1hLmxlbmd0aCxwPUFycmF5KGkrYyk7KytvPGM7KXBbb109YVtvXTtmb3IoO2ktLTspcFtvKytdPWFyZ3VtZW50c1srK3RdO3ZhciBoPXRoaXMmJnRoaXMhPT1uJiZ0aGlzIGluc3RhbmNlb2Ygcz91OmU7cmV0dXJuIGguYXBwbHkobD9yOnRoaXMscCl9dmFyIGw9dCZvLHU9aShlKTtyZXR1cm4gc312YXIgaT1lKCIuL2NyZWF0ZUN0b3JXcmFwcGVyIiksbz0xO3QuZXhwb3J0cz1yfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vY3JlYXRlQ3RvcldyYXBwZXIiOjYzfV0sNjg6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbixnLHksdixiLHcpe3ZhciB4PXQmcDtpZigheCYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihkKTt2YXIgQT1nP2cubGVuZ3RoOjA7aWYoQXx8KHQmPX4oaHxmKSxnPXk9bnVsbCksQS09eT95Lmxlbmd0aDowLHQmZil7dmFyIEU9ZyxqPXk7Zz15PW51bGx9dmFyIEM9eD9udWxsOnMoZSksVD1bZSx0LG4sZyx5LEUsaix2LGIsd107aWYoQyYmKGwoVCxDKSx0PVRbMV0sdz1UWzldKSxUWzldPW51bGw9PXc/eD8wOmUubGVuZ3RoOm0ody1BLDApfHwwLHQ9PWMpdmFyIFM9aShUWzBdLFRbMl0pO2Vsc2UgUz10IT1oJiZ0IT0oY3xoKXx8VFs0XS5sZW5ndGg/by5hcHBseSh2b2lkIDAsVCk6YS5hcHBseSh2b2lkIDAsVCk7dmFyIF89Qz9yOnU7cmV0dXJuIF8oUyxUKX12YXIgcj1lKCIuL2Jhc2VTZXREYXRhIiksaT1lKCIuL2NyZWF0ZUJpbmRXcmFwcGVyIiksbz1lKCIuL2NyZWF0ZUh5YnJpZFdyYXBwZXIiKSxhPWUoIi4vY3JlYXRlUGFydGlhbFdyYXBwZXIiKSxzPWUoIi4vZ2V0RGF0YSIpLGw9ZSgiLi9tZXJnZURhdGEiKSx1PWUoIi4vc2V0RGF0YSIpLGM9MSxwPTIsaD0zMixmPTY0LGQ9IkV4cGVjdGVkIGEgZnVuY3Rpb24iLG09TWF0aC5tYXg7dC5leHBvcnRzPW59LHsiLi9iYXNlU2V0RGF0YSI6NTIsIi4vY3JlYXRlQmluZFdyYXBwZXIiOjYyLCIuL2NyZWF0ZUh5YnJpZFdyYXBwZXIiOjY2LCIuL2NyZWF0ZVBhcnRpYWxXcmFwcGVyIjo2NywiLi9nZXREYXRhIjo3MiwiLi9tZXJnZURhdGEiOjg0LCIuL3NldERhdGEiOjg5fV0sNjk6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbixyLGksbyxhKXt2YXIgcz0tMSxsPWUubGVuZ3RoLHU9dC5sZW5ndGgsYz0hMDtpZihsIT11JiYhKGkmJnU+bCkpcmV0dXJuITE7Zm9yKDtjJiYrK3M8bDspe3ZhciBwPWVbc10saD10W3NdO2lmKGM9dm9pZCAwLHImJihjPWk/cihoLHAscyk6cihwLGgscykpLCJ1bmRlZmluZWQiPT10eXBlb2YgYylpZihpKWZvcih2YXIgZj11O2YtLSYmKGg9dFtmXSwhKGM9cCYmcD09PWh8fG4ocCxoLHIsaSxvLGEpKSk7KTtlbHNlIGM9cCYmcD09PWh8fG4ocCxoLHIsaSxvLGEpfXJldHVybiEhY310LmV4cG9ydHM9bn0se31dLDcwOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0LG4pe3N3aXRjaChuKXtjYXNlIHI6Y2FzZSBpOnJldHVybitlPT0rdDtjYXNlIG86cmV0dXJuIGUubmFtZT09dC5uYW1lJiZlLm1lc3NhZ2U9PXQubWVzc2FnZTtjYXNlIGE6cmV0dXJuIGUhPStlP3QhPSt0OjA9PWU/MS9lPT0xL3Q6ZT09K3Q7Y2FzZSBzOmNhc2UgbDpyZXR1cm4gZT09dCsiIn1yZXR1cm4hMX12YXIgcj0iW29iamVjdCBCb29sZWFuXSIsaT0iW29iamVjdCBEYXRlXSIsbz0iW29iamVjdCBFcnJvcl0iLGE9IltvYmplY3QgTnVtYmVyXSIscz0iW29iamVjdCBSZWdFeHBdIixsPSJbb2JqZWN0IFN0cmluZ10iO3QuZXhwb3J0cz1ufSx7fV0sNzE6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlLHQsbixpLGEscyxsKXt2YXIgdT1yKGUpLGM9dS5sZW5ndGgscD1yKHQpLGg9cC5sZW5ndGg7aWYoYyE9aCYmIWEpcmV0dXJuITE7Zm9yKHZhciBmPWEsZD0tMTsrK2Q8Yzspe3ZhciBtPXVbZF0sZz1hP20gaW4gdDpvLmNhbGwodCxtKTtpZihnKXt2YXIgeT1lW21dLHY9dFttXTtnPXZvaWQgMCxpJiYoZz1hP2kodix5LG0pOmkoeSx2LG0pKSwidW5kZWZpbmVkIj09dHlwZW9mIGcmJihnPXkmJnk9PT12fHxuKHksdixpLGEscyxsKSl9aWYoIWcpcmV0dXJuITE7Znx8KGY9ImNvbnN0cnVjdG9yIj09bSl9aWYoIWYpe3ZhciBiPWUuY29uc3RydWN0b3Isdz10LmNvbnN0cnVjdG9yO2lmKGIhPXcmJiJjb25zdHJ1Y3RvciJpbiBlJiYiY29uc3RydWN0b3IiaW4gdCYmISgiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGImJiJmdW5jdGlvbiI9PXR5cGVvZiB3JiZ3IGluc3RhbmNlb2YgdykpcmV0dXJuITF9cmV0dXJuITB9dmFyIHI9ZSgiLi4vb2JqZWN0L2tleXMiKSxpPU9iamVjdC5wcm90b3R5cGUsbz1pLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1ufSx7Ii4uL29iamVjdC9rZXlzIjoxMDR9XSw3MjpbZnVuY3Rpb24oZSx0KXt2YXIgbj1lKCIuL21ldGFNYXAiKSxyPWUoIi4uL3V0aWxpdHkvbm9vcCIpLGk9bj9mdW5jdGlvbihlKXtyZXR1cm4gbi5nZXQoZSl9OnI7dC5leHBvcnRzPWl9LHsiLi4vdXRpbGl0eS9ub29wIjoxMTAsIi4vbWV0YU1hcCI6ODV9XSw3MzpbZnVuY3Rpb24oZSx0KXt2YXIgbj1lKCIuL2Jhc2VQcm9wZXJ0eSIpLHI9ZSgiLi4vdXRpbGl0eS9jb25zdGFudCIpLGk9ZSgiLi9yZWFsTmFtZXMiKSxvPWUoIi4uL3N1cHBvcnQiKSxhPWZ1bmN0aW9uKCl7cmV0dXJuIG8uZnVuY05hbWVzPyJjb25zdGFudCI9PXIubmFtZT9uKCJuYW1lIik6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubmFtZSxuPWlbdF0scj1uP24ubGVuZ3RoOjA7ci0tOyl7dmFyIG89bltyXSxhPW8uZnVuYztpZihudWxsPT1hfHxhPT1lKXJldHVybiBvLm5hbWV9cmV0dXJuIHR9OnIoIiIpfSgpO3QuZXhwb3J0cz1hfSx7Ii4uL3N1cHBvcnQiOjEwNywiLi4vdXRpbGl0eS9jb25zdGFudCI6MTA4LCIuL2Jhc2VQcm9wZXJ0eSI6NTEsIi4vcmVhbE5hbWVzIjo4Nn1dLDc0OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0LG4pe2Zvcih2YXIgcj1lLmxlbmd0aCxpPXQrKG4/MDotMSk7bj9pLS06KytpPHI7KXt2YXIgbz1lW2ldO2lmKG8hPT1vKXJldHVybiBpfXJldHVybi0xfXQuZXhwb3J0cz1ufSx7fV0sNzU6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXt2YXIgdD1lLmxlbmd0aCxuPW5ldyBlLmNvbnN0cnVjdG9yKHQpO3JldHVybiB0JiYic3RyaW5nIj09dHlwZW9mIGVbMF0mJmkuY2FsbChlLCJpbmRleCIpJiYobi5pbmRleD1lLmluZGV4LG4uaW5wdXQ9ZS5pbnB1dCksbn12YXIgcj1PYmplY3QucHJvdG90eXBlLGk9ci5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9bn0se31dLDc2OltmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihuKXtmdW5jdGlvbiByKGUsdCxuKXt2YXIgcj1lLmNvbnN0cnVjdG9yO3N3aXRjaCh0KXtjYXNlIGM6cmV0dXJuIGkoZSk7Y2FzZSBvOmNhc2UgYTpyZXR1cm4gbmV3IHIoK2UpO2Nhc2UgcDpjYXNlIGg6Y2FzZSBmOmNhc2UgZDpjYXNlIG06Y2FzZSBnOmNhc2UgeTpjYXNlIHY6Y2FzZSBiOnIgaW5zdGFuY2VvZiByJiYocj14W3RdKTt2YXIgQT1lLmJ1ZmZlcjtyZXR1cm4gbmV3IHIobj9pKEEpOkEsZS5ieXRlT2Zmc2V0LGUubGVuZ3RoKTtjYXNlIHM6Y2FzZSB1OnJldHVybiBuZXcgcihlKTtjYXNlIGw6dmFyIEU9bmV3IHIoZS5zb3VyY2Usdy5leGVjKGUpKTtFLmxhc3RJbmRleD1lLmxhc3RJbmRleH1yZXR1cm4gRX12YXIgaT1lKCIuL2J1ZmZlckNsb25lIiksbz0iW29iamVjdCBCb29sZWFuXSIsYT0iW29iamVjdCBEYXRlXSIscz0iW29iamVjdCBOdW1iZXJdIixsPSJbb2JqZWN0IFJlZ0V4cF0iLHU9IltvYmplY3QgU3RyaW5nXSIsYz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLHA9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsaD0iW29iamVjdCBGbG9hdDY0QXJyYXldIixmPSJbb2JqZWN0IEludDhBcnJheV0iLGQ9IltvYmplY3QgSW50MTZBcnJheV0iLG09IltvYmplY3QgSW50MzJBcnJheV0iLGc9IltvYmplY3QgVWludDhBcnJheV0iLHk9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIix2PSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsYj0iW29iamVjdCBVaW50MzJBcnJheV0iLHc9L1x3KiQvLHg9e307eFtwXT1uLkZsb2F0MzJBcnJheSx4W2hdPW4uRmxvYXQ2NEFycmF5LHhbZl09bi5JbnQ4QXJyYXkseFtkXT1uLkludDE2QXJyYXkseFttXT1uLkludDMyQXJyYXkseFtnXT1uLlVpbnQ4QXJyYXkseFt5XT1uLlVpbnQ4Q2xhbXBlZEFycmF5LHhbdl09bi5VaW50MTZBcnJheSx4W2JdPW4uVWludDMyQXJyYXksdC5leHBvcnRzPXJ9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiLi9idWZmZXJDbG9uZSI6NTd9XSw3NzpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3ZhciB0PWUuY29uc3RydWN0b3I7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQgaW5zdGFuY2VvZiB0fHwodD1PYmplY3QpLG5ldyB0fXQuZXhwb3J0cz1ufSx7fV0sNzg6W2Z1bmN0aW9uKGUsdCl7dmFyIG49ZnVuY3Rpb24oKXt0cnl7T2JqZWN0KHt0b1N0cmluZzowfSsiIil9Y2F0Y2goZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITF9fXJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmInN0cmluZyI9PXR5cGVvZihlKyIiKX19KCk7dC5leHBvcnRzPW59LHt9XSw3OTpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIGU9K2UsdD1udWxsPT10P3I6dCxlPi0xJiZlJTE9PTAmJnQ+ZX12YXIgcj1NYXRoLnBvdygyLDUzKS0xO3QuZXhwb3J0cz1ufSx7fV0sODA6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXt2YXIgdD1pKGUpO3JldHVybiEhdCYmZT09PW9bdF0mJnQgaW4gci5wcm90b3R5cGV9dmFyIHI9ZSgiLi9MYXp5V3JhcHBlciIpLGk9ZSgiLi9nZXRGdW5jTmFtZSIpLG89ZSgiLi4vY2hhaW4vbG9kYXNoIik7dC5leHBvcnRzPW59LHsiLi4vY2hhaW4vbG9kYXNoIjoyMCwiLi9MYXp5V3JhcHBlciI6MjcsIi4vZ2V0RnVuY05hbWUiOjczfV0sODE6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJmU+LTEmJmUlMT09MCYmcj49ZX12YXIgcj1NYXRoLnBvdygyLDUzKS0xO3QuZXhwb3J0cz1ufSx7fV0sODI6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4hIWUmJiJvYmplY3QiPT10eXBlb2YgZX10LmV4cG9ydHM9bn0se31dLDgzOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGU9PT1lJiYoMD09PWU/MS9lPjA6IXIoZSkpfXZhciByPWUoIi4uL2xhbmcvaXNPYmplY3QiKTt0LmV4cG9ydHM9bn0seyIuLi9sYW5nL2lzT2JqZWN0Ijo5OX1dLDg0OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1lWzFdLGQ9dFsxXSxtPW58ZCxnPWM+bSx5PWQ9PWMmJm49PXV8fGQ9PWMmJm49PXAmJmVbN10ubGVuZ3RoPD10WzhdfHxkPT0oY3xwKSYmbj09dTtpZighZyYmIXkpcmV0dXJuIGU7ZCZzJiYoZVsyXT10WzJdLG18PW4mcz8wOmwpO3ZhciB2PXRbM107aWYodil7dmFyIGI9ZVszXTtlWzNdPWI/aShiLHYsdFs0XSk6cih2KSxlWzRdPWI/YShlWzNdLGgpOnIodFs0XSl9cmV0dXJuIHY9dFs1XSx2JiYoYj1lWzVdLGVbNV09Yj9vKGIsdix0WzZdKTpyKHYpLGVbNl09Yj9hKGVbNV0saCk6cih0WzZdKSksdj10WzddLHYmJihlWzddPXIodikpLGQmYyYmKGVbOF09bnVsbD09ZVs4XT90WzhdOmYoZVs4XSx0WzhdKSksbnVsbD09ZVs5XSYmKGVbOV09dFs5XSksZVswXT10WzBdLGVbMV09bSxlfXZhciByPWUoIi4vYXJyYXlDb3B5IiksaT1lKCIuL2NvbXBvc2VBcmdzIiksbz1lKCIuL2NvbXBvc2VBcmdzUmlnaHQiKSxhPWUoIi4vcmVwbGFjZUhvbGRlcnMiKSxzPTEsbD00LHU9OCxjPTEyOCxwPTI1NixoPSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIixmPU1hdGgubWluO3QuZXhwb3J0cz1ufSx7Ii4vYXJyYXlDb3B5IjoyOSwiLi9jb21wb3NlQXJncyI6NTgsIi4vY29tcG9zZUFyZ3NSaWdodCI6NTksIi4vcmVwbGFjZUhvbGRlcnMiOjg4fV0sODU6W2Z1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKG4pe3ZhciByPWUoIi4uL2xhbmcvaXNOYXRpdmUiKSxpPXIoaT1uLldlYWtNYXApJiZpLG89aSYmbmV3IGk7dC5leHBvcnRzPW99KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiLi4vbGFuZy9pc05hdGl2ZSI6OTh9XSw4NjpbZnVuY3Rpb24oZSx0KXt2YXIgbj17fTt0LmV4cG9ydHM9bn0se31dLDg3OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgsYT1vKHQubGVuZ3RoLG4pLHM9cihlKTthLS07KXt2YXIgbD10W2FdO2VbYV09aShsLG4pP3NbbF06dm9pZCAwfXJldHVybiBlfXZhciByPWUoIi4vYXJyYXlDb3B5IiksaT1lKCIuL2lzSW5kZXgiKSxvPU1hdGgubWluO3QuZXhwb3J0cz1ufSx7Ii4vYXJyYXlDb3B5IjoyOSwiLi9pc0luZGV4Ijo3OX1dLDg4OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXtmb3IodmFyIG49LTEsaT1lLmxlbmd0aCxvPS0xLGE9W107KytuPGk7KWVbbl09PT10JiYoZVtuXT1yLGFbKytvXT1uKTtyZXR1cm4gYX12YXIgcj0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyI7dC5leHBvcnRzPW59LHt9XSw4OTpbZnVuY3Rpb24oZSx0KXt2YXIgbj1lKCIuL2Jhc2VTZXREYXRhIikscj1lKCIuLi9kYXRlL25vdyIpLGk9MTUwLG89MTYsYT1mdW5jdGlvbigpe3ZhciBlPTAsdD0wO3JldHVybiBmdW5jdGlvbihhLHMpe3ZhciBsPXIoKSx1PW8tKGwtdCk7aWYodD1sLHU+MCl7aWYoKytlPj1pKXJldHVybiBhfWVsc2UgZT0wO3JldHVybiBuKGEscyl9fSgpO3QuZXhwb3J0cz1hfSx7Ii4uL2RhdGUvbm93IjoyNCwiLi9iYXNlU2V0RGF0YSI6NTJ9XSw5MDpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3ZhciB0O2lmKCFhKGUpfHxwLmNhbGwoZSkhPWx8fG8oZSl8fCFjLmNhbGwoZSwiY29uc3RydWN0b3IiKSYmKHQ9ZS5jb25zdHJ1Y3RvciwiZnVuY3Rpb24iPT10eXBlb2YgdCYmISh0IGluc3RhbmNlb2YgdCkpfHwhcy5hcmdzVGFnJiZpKGUpKXJldHVybiExO3ZhciBuO3JldHVybiBzLm93bkxhc3Q/KHIoZSxmdW5jdGlvbihlLHQscil7cmV0dXJuIG49Yy5jYWxsKHIsdCksITF9KSxuIT09ITEpOihyKGUsZnVuY3Rpb24oZSx0KXtuPXR9KSwidW5kZWZpbmVkIj09dHlwZW9mIG58fGMuY2FsbChlLG4pKX12YXIgcj1lKCIuL2Jhc2VGb3JJbiIpLGk9ZSgiLi4vbGFuZy9pc0FyZ3VtZW50cyIpLG89ZSgiLi9pc0hvc3RPYmplY3QiKSxhPWUoIi4vaXNPYmplY3RMaWtlIikscz1lKCIuLi9zdXBwb3J0IiksbD0iW29iamVjdCBPYmplY3RdIix1PU9iamVjdC5wcm90b3R5cGUsYz11Lmhhc093blByb3BlcnR5LHA9dS50b1N0cmluZzt0LmV4cG9ydHM9bn0seyIuLi9sYW5nL2lzQXJndW1lbnRzIjo5NSwiLi4vc3VwcG9ydCI6MTA3LCIuL2Jhc2VGb3JJbiI6NDAsIi4vaXNIb3N0T2JqZWN0Ijo3OCwiLi9pc09iamVjdExpa2UiOjgyfV0sOTE6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtmb3IodmFyIHQ9bChlKSxuPXQubGVuZ3RoLGM9biYmZS5sZW5ndGgsaD1jJiZhKGMpJiYoaShlKXx8dS5ub25FbnVtU3RyaW5ncyYmcyhlKXx8dS5ub25FbnVtQXJncyYmcihlKSksZj0tMSxkPVtdOysrZjxuOyl7dmFyIG09dFtmXTsoaCYmbyhtLGMpfHxwLmNhbGwoZSxtKSkmJmQucHVzaChtKX1yZXR1cm4gZH12YXIgcj1lKCIuLi9sYW5nL2lzQXJndW1lbnRzIiksaT1lKCIuLi9sYW5nL2lzQXJyYXkiKSxvPWUoIi4vaXNJbmRleCIpLGE9ZSgiLi9pc0xlbmd0aCIpLHM9ZSgiLi4vbGFuZy9pc1N0cmluZyIpLGw9ZSgiLi4vb2JqZWN0L2tleXNJbiIpLHU9ZSgiLi4vc3VwcG9ydCIpLGM9T2JqZWN0LnByb3RvdHlwZSxwPWMuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPW59LHsiLi4vbGFuZy9pc0FyZ3VtZW50cyI6OTUsIi4uL2xhbmcvaXNBcnJheSI6OTYsIi4uL2xhbmcvaXNTdHJpbmciOjEwMSwiLi4vb2JqZWN0L2tleXNJbiI6MTA1LCIuLi9zdXBwb3J0IjoxMDcsIi4vaXNJbmRleCI6NzksIi4vaXNMZW5ndGgiOjgxfV0sOTI6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtpZihvLnVuaW5kZXhlZENoYXJzJiZpKGUpKXtmb3IodmFyIHQ9LTEsbj1lLmxlbmd0aCxhPU9iamVjdChlKTsrK3Q8bjspYVt0XT1lLmNoYXJBdCh0KTtyZXR1cm4gYX1yZXR1cm4gcihlKT9lOk9iamVjdChlKX12YXIgcj1lKCIuLi9sYW5nL2lzT2JqZWN0IiksaT1lKCIuLi9sYW5nL2lzU3RyaW5nIiksbz1lKCIuLi9zdXBwb3J0Iik7dC5leHBvcnRzPW59LHsiLi4vbGFuZy9pc09iamVjdCI6OTksIi4uL2xhbmcvaXNTdHJpbmciOjEwMSwiLi4vc3VwcG9ydCI6MTA3fV0sOTM6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHI/ZS5jbG9uZSgpOm5ldyBpKGUuX193cmFwcGVkX18sZS5fX2NoYWluX18sbyhlLl9fYWN0aW9uc19fKSl9dmFyIHI9ZSgiLi9MYXp5V3JhcHBlciIpLGk9ZSgiLi9Mb2Rhc2hXcmFwcGVyIiksbz1lKCIuL2FycmF5Q29weSIpO3QuZXhwb3J0cz1ufSx7Ii4vTGF6eVdyYXBwZXIiOjI3LCIuL0xvZGFzaFdyYXBwZXIiOjI4LCIuL2FycmF5Q29weSI6Mjl9XSw5NDpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCxuKXtyZXR1cm4gdD0iZnVuY3Rpb24iPT10eXBlb2YgdCYmaSh0LG4sMSkscihlLCEwLHQpfXZhciByPWUoIi4uL2ludGVybmFsL2Jhc2VDbG9uZSIpLGk9ZSgiLi4vaW50ZXJuYWwvYmluZENhbGxiYWNrIik7dC5leHBvcnRzPW59LHsiLi4vaW50ZXJuYWwvYmFzZUNsb25lIjozMywiLi4vaW50ZXJuYWwvYmluZENhbGxiYWNrIjo1Nn1dLDk1OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7dmFyIHQ9aShlKT9lLmxlbmd0aDp2b2lkIDA7cmV0dXJuIHIodCkmJnUuY2FsbChlKT09YX12YXIgcj1lKCIuLi9pbnRlcm5hbC9pc0xlbmd0aCIpLGk9ZSgiLi4vaW50ZXJuYWwvaXNPYmplY3RMaWtlIiksbz1lKCIuLi9zdXBwb3J0IiksYT0iW29iamVjdCBBcmd1bWVudHNdIixzPU9iamVjdC5wcm90b3R5cGUsbD1zLmhhc093blByb3BlcnR5LHU9cy50b1N0cmluZyxjPXMucHJvcGVydHlJc0VudW1lcmFibGU7by5hcmdzVGFnfHwobj1mdW5jdGlvbihlKXt2YXIgdD1pKGUpP2UubGVuZ3RoOnZvaWQgMDtyZXR1cm4gcih0KSYmbC5jYWxsKGUsImNhbGxlZSIpJiYhYy5jYWxsKGUsImNhbGxlZSIpfSksdC5leHBvcnRzPW59LHsiLi4vaW50ZXJuYWwvaXNMZW5ndGgiOjgxLCIuLi9pbnRlcm5hbC9pc09iamVjdExpa2UiOjgyLCIuLi9zdXBwb3J0IjoxMDd9XSw5NjpbZnVuY3Rpb24oZSx0KXt2YXIgbj1lKCIuLi9pbnRlcm5hbC9pc0xlbmd0aCIpLHI9ZSgiLi9pc05hdGl2ZSIpLGk9ZSgiLi4vaW50ZXJuYWwvaXNPYmplY3RMaWtlIiksbz0iW29iamVjdCBBcnJheV0iLGE9T2JqZWN0LnByb3RvdHlwZSxzPWEudG9TdHJpbmcsbD1yKGw9QXJyYXkuaXNBcnJheSkmJmwsdT1sfHxmdW5jdGlvbihlKXtyZXR1cm4gaShlKSYmbihlLmxlbmd0aCkmJnMuY2FsbChlKT09b307dC5leHBvcnRzPXV9LHsiLi4vaW50ZXJuYWwvaXNMZW5ndGgiOjgxLCIuLi9pbnRlcm5hbC9pc09iamVjdExpa2UiOjgyLCIuL2lzTmF0aXZlIjo5OH1dLDk3OltmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihuKXt2YXIgcj1lKCIuLi9pbnRlcm5hbC9iYXNlSXNGdW5jdGlvbiIpLGk9ZSgiLi9pc05hdGl2ZSIpLG89IltvYmplY3QgRnVuY3Rpb25dIixhPU9iamVjdC5wcm90b3R5cGUscz1hLnRvU3RyaW5nLGw9aShsPW4uVWludDhBcnJheSkmJmwsdT1yKC94Lyl8fGwmJiFyKGwpP2Z1bmN0aW9uKGUpe3JldHVybiBzLmNhbGwoZSk9PW99OnI7dC5leHBvcnRzPXV9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiLi4vaW50ZXJuYWwvYmFzZUlzRnVuY3Rpb24iOjQ1LCIuL2lzTmF0aXZlIjo5OH1dLDk4OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGw9PWU/ITE6Yy5jYWxsKGUpPT1hP3AudGVzdCh1LmNhbGwoZSkpOm8oZSkmJihpKGUpP3A6cykudGVzdChlKX12YXIgcj1lKCIuLi9zdHJpbmcvZXNjYXBlUmVnRXhwIiksaT1lKCIuLi9pbnRlcm5hbC9pc0hvc3RPYmplY3QiKSxvPWUoIi4uL2ludGVybmFsL2lzT2JqZWN0TGlrZSIpLGE9IltvYmplY3QgRnVuY3Rpb25dIixzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGw9T2JqZWN0LnByb3RvdHlwZSx1PUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyxjPWwudG9TdHJpbmcscD1SZWdFeHAoIl4iK3IoYykucmVwbGFjZSgvdG9TdHJpbmd8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3QuZXhwb3J0cz1ufSx7Ii4uL2ludGVybmFsL2lzSG9zdE9iamVjdCI6NzgsIi4uL2ludGVybmFsL2lzT2JqZWN0TGlrZSI6ODIsIi4uL3N0cmluZy9lc2NhcGVSZWdFeHAiOjEwNn1dLDk5OltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7dmFyIHQ9dHlwZW9mIGU7cmV0dXJuImZ1bmN0aW9uIj09dHx8ISFlJiYib2JqZWN0Ij09dH10LmV4cG9ydHM9bn0se31dLDEwMDpbZnVuY3Rpb24oZSx0KXt2YXIgbj1lKCIuL2lzQXJndW1lbnRzIikscj1lKCIuL2lzTmF0aXZlIiksaT1lKCIuLi9pbnRlcm5hbC9zaGltSXNQbGFpbk9iamVjdCIpLG89ZSgiLi4vc3VwcG9ydCIpLGE9IltvYmplY3QgT2JqZWN0XSIscz1PYmplY3QucHJvdG90eXBlLGw9cy50b1N0cmluZyx1PXIodT1PYmplY3QuZ2V0UHJvdG90eXBlT2YpJiZ1LGM9dT9mdW5jdGlvbihlKXtpZighZXx8bC5jYWxsKGUpIT1hfHwhby5hcmdzVGFnJiZuKGUpKXJldHVybiExO3ZhciB0PWUudmFsdWVPZixzPXIodCkmJihzPXUodCkpJiZ1KHMpO3JldHVybiBzP2U9PXN8fHUoZSk9PXM6aShlKX06aTt0LmV4cG9ydHM9Y30seyIuLi9pbnRlcm5hbC9zaGltSXNQbGFpbk9iamVjdCI6OTAsIi4uL3N1cHBvcnQiOjEwNywiLi9pc0FyZ3VtZW50cyI6OTUsIi4vaXNOYXRpdmUiOjk4fV0sMTAxOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfHxyKGUpJiZhLmNhbGwoZSk9PWl9dmFyIHI9ZSgiLi4vaW50ZXJuYWwvaXNPYmplY3RMaWtlIiksaT0iW29iamVjdCBTdHJpbmddIixvPU9iamVjdC5wcm90b3R5cGUsYT1vLnRvU3RyaW5nO3QuZXhwb3J0cz1ufSx7Ii4uL2ludGVybmFsL2lzT2JqZWN0TGlrZSI6ODJ9XSwxMDI6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gaShlKSYmcihlLmxlbmd0aCkmJiEhX1trLmNhbGwoZSldfXZhciByPWUoIi4uL2ludGVybmFsL2lzTGVuZ3RoIiksaT1lKCIuLi9pbnRlcm5hbC9pc09iamVjdExpa2UiKSxvPSJbb2JqZWN0IEFyZ3VtZW50c10iLGE9IltvYmplY3QgQXJyYXldIixzPSJbb2JqZWN0IEJvb2xlYW5dIixsPSJbb2JqZWN0IERhdGVdIix1PSJbb2JqZWN0IEVycm9yXSIsYz0iW29iamVjdCBGdW5jdGlvbl0iLHA9IltvYmplY3QgTWFwXSIsaD0iW29iamVjdCBOdW1iZXJdIixmPSJbb2JqZWN0IE9iamVjdF0iLGQ9IltvYmplY3QgUmVnRXhwXSIsbT0iW29iamVjdCBTZXRdIixnPSJbb2JqZWN0IFN0cmluZ10iLHk9IltvYmplY3QgV2Vha01hcF0iLHY9IltvYmplY3QgQXJyYXlCdWZmZXJdIixiPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLHc9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseD0iW29iamVjdCBJbnQ4QXJyYXldIixBPSJbb2JqZWN0IEludDE2QXJyYXldIixFPSJbb2JqZWN0IEludDMyQXJyYXldIixqPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixDPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsVD0iW29iamVjdCBVaW50MTZBcnJheV0iLFM9IltvYmplY3QgVWludDMyQXJyYXldIixfPXt9O19bYl09X1t3XT1fW3hdPV9bQV09X1tFXT1fW2pdPV9bQ109X1tUXT1fW1NdPSEwLF9bb109X1thXT1fW3ZdPV9bc109X1tsXT1fW3VdPV9bY109X1twXT1fW2hdPV9bZl09X1tkXT1fW21dPV9bZ109X1t5XT0hMTt2YXIgTz1PYmplY3QucHJvdG90eXBlLGs9Ty50b1N0cmluZzt0LmV4cG9ydHM9bn0seyIuLi9pbnRlcm5hbC9pc0xlbmd0aCI6ODEsIi4uL2ludGVybmFsL2lzT2JqZWN0TGlrZSI6ODJ9XSwxMDM6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGV9dC5leHBvcnRzPW59LHt9XSwxMDQ6W2Z1bmN0aW9uKGUsdCl7dmFyIG49ZSgiLi4vaW50ZXJuYWwvaXNMZW5ndGgiKSxyPWUoIi4uL2xhbmcvaXNOYXRpdmUiKSxpPWUoIi4uL2xhbmcvaXNPYmplY3QiKSxvPWUoIi4uL2ludGVybmFsL3NoaW1LZXlzIiksYT1lKCIuLi9zdXBwb3J0Iikscz1yKHM9T2JqZWN0LmtleXMpJiZzLGw9cz9mdW5jdGlvbihlKXtpZihlKXZhciB0PWUuY29uc3RydWN0b3Iscj1lLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5wcm90b3R5cGU9PT1lfHwoImZ1bmN0aW9uIj09dHlwZW9mIGU/YS5lbnVtUHJvdG90eXBlczpyJiZuKHIpKT9vKGUpOmkoZSk/cyhlKTpbXX06bzt0LmV4cG9ydHM9bH0seyIuLi9pbnRlcm5hbC9pc0xlbmd0aCI6ODEsIi4uL2ludGVybmFsL3NoaW1LZXlzIjo5MSwiLi4vbGFuZy9pc05hdGl2ZSI6OTgsIi4uL2xhbmcvaXNPYmplY3QiOjk5LCIuLi9zdXBwb3J0IjoxMDd9XSwxMDU6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtpZihudWxsPT1lKXJldHVybltdO3UoZSl8fChlPU9iamVjdChlKSk7dmFyIHQ9ZS5sZW5ndGg7dD10JiZsKHQpJiYobyhlKXx8cC5ub25FbnVtU3RyaW5ncyYmYyhlKXx8cC5ub25FbnVtQXJncyYmaShlKSkmJnR8fDA7Zm9yKHZhciBuPWUuY29uc3RydWN0b3Iscj0tMSxoPWEobikmJm4ucHJvdG90eXBlfHxFLGY9aD09PWUsZD1BcnJheSh0KSxnPXQ+MCx5PXAuZW51bUVycm9yUHJvcHMmJihlPT09QXx8ZSBpbnN0YW5jZW9mIEVycm9yKSxiPXAuZW51bVByb3RvdHlwZXMmJmEoZSk7KytyPHQ7KWRbcl09cisiIjtmb3IodmFyIF8gaW4gZSliJiYicHJvdG90eXBlIj09X3x8eSYmKCJtZXNzYWdlIj09X3x8Im5hbWUiPT1fKXx8ZyYmcyhfLHQpfHwiY29uc3RydWN0b3IiPT1fJiYoZnx8IUMuY2FsbChlLF8pKXx8ZC5wdXNoKF8pO2lmKHAubm9uRW51bVNoYWRvd3MmJmUhPT1FKXt2YXIgTz1lPT09aj93OmU9PT1BP206VC5jYWxsKGUpLGs9U1tPXXx8U1t2XTtmb3IoTz09diYmKGg9RSksdD14Lmxlbmd0aDt0LS07KXtfPXhbdF07dmFyICQ9a1tfXTtmJiYkfHwoJD8hQy5jYWxsKGUsXyk6ZVtfXT09PWhbX10pfHxkLnB1c2goXyl9fXJldHVybiBkfXZhciByPWUoIi4uL2ludGVybmFsL2FycmF5RWFjaCIpLGk9ZSgiLi4vbGFuZy9pc0FyZ3VtZW50cyIpLG89ZSgiLi4vbGFuZy9pc0FycmF5IiksYT1lKCIuLi9sYW5nL2lzRnVuY3Rpb24iKSxzPWUoIi4uL2ludGVybmFsL2lzSW5kZXgiKSxsPWUoIi4uL2ludGVybmFsL2lzTGVuZ3RoIiksdT1lKCIuLi9sYW5nL2lzT2JqZWN0IiksYz1lKCIuLi9sYW5nL2lzU3RyaW5nIikscD1lKCIuLi9zdXBwb3J0IiksaD0iW29iamVjdCBBcnJheV0iLGY9IltvYmplY3QgQm9vbGVhbl0iLGQ9IltvYmplY3QgRGF0ZV0iLG09IltvYmplY3QgRXJyb3JdIixnPSJbb2JqZWN0IEZ1bmN0aW9uXSIseT0iW29iamVjdCBOdW1iZXJdIix2PSJbb2JqZWN0IE9iamVjdF0iLGI9IltvYmplY3QgUmVnRXhwXSIsdz0iW29iamVjdCBTdHJpbmddIix4PVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl0sQT1FcnJvci5wcm90b3R5cGUsRT1PYmplY3QucHJvdG90eXBlLGo9U3RyaW5nLnByb3RvdHlwZSxDPUUuaGFzT3duUHJvcGVydHksVD1FLnRvU3RyaW5nLFM9e307U1toXT1TW2RdPVNbeV09e2NvbnN0cnVjdG9yOiEwLHRvTG9jYWxlU3RyaW5nOiEwLHRvU3RyaW5nOiEwLHZhbHVlT2Y6ITB9LFNbZl09U1t3XT17Y29uc3RydWN0b3I6ITAsdG9TdHJpbmc6ITAsdmFsdWVPZjohMH0sU1ttXT1TW2ddPVNbYl09e2NvbnN0cnVjdG9yOiEwLHRvU3RyaW5nOiEwfSxTW3ZdPXtjb25zdHJ1Y3RvcjohMH0scih4LGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBTKWlmKEMuY2FsbChTLHQpKXt2YXIgbj1TW3RdO25bZV09Qy5jYWxsKG4sZSl9fSksdC5leHBvcnRzPW59LHsiLi4vaW50ZXJuYWwvYXJyYXlFYWNoIjozMCwiLi4vaW50ZXJuYWwvaXNJbmRleCI6NzksIi4uL2ludGVybmFsL2lzTGVuZ3RoIjo4MSwiLi4vbGFuZy9pc0FyZ3VtZW50cyI6OTUsIi4uL2xhbmcvaXNBcnJheSI6OTYsIi4uL2xhbmcvaXNGdW5jdGlvbiI6OTcsIi4uL2xhbmcvaXNPYmplY3QiOjk5LCIuLi9sYW5nL2lzU3RyaW5nIjoxMDEsIi4uL3N1cHBvcnQiOjEwN31dLDEwNjpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiBlPXIoZSksZSYmby50ZXN0KGUpP2UucmVwbGFjZShpLCJcXCQmIik6ZX12YXIgcj1lKCIuLi9pbnRlcm5hbC9iYXNlVG9TdHJpbmciKSxpPS9bLiorP14ke30oKXxbXF1cL1xcXS9nLG89UmVnRXhwKGkuc291cmNlKTt0LmV4cG9ydHM9bn0seyIuLi9pbnRlcm5hbC9iYXNlVG9TdHJpbmciOjUzfV0sMTA3OltmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihlKXt2YXIgbj0iW29iamVjdCBBcmd1bWVudHNdIixyPSJbb2JqZWN0IE9iamVjdF0iLGk9QXJyYXkucHJvdG90eXBlLG89RXJyb3IucHJvdG90eXBlLGE9T2JqZWN0LnByb3RvdHlwZSxzPShzPWUud2luZG93KSYmcy5kb2N1bWVudCxsPWEudG9TdHJpbmcsdT1hLnByb3BlcnR5SXNFbnVtZXJhYmxlLGM9aS5zcGxpY2UscD17fTshZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe3RoaXMueD0xfSx0PXswOjEsbGVuZ3RoOjF9LGk9W107ZS5wcm90b3R5cGU9e3ZhbHVlT2Y6MSx5OjF9O2Zvcih2YXIgYSBpbiBuZXcgZSlpLnB1c2goYSk7cC5hcmdzVGFnPWwuY2FsbChhcmd1bWVudHMpPT1uLHAuZW51bUVycm9yUHJvcHM9dS5jYWxsKG8sIm1lc3NhZ2UiKXx8dS5jYWxsKG8sIm5hbWUiKSxwLmVudW1Qcm90b3R5cGVzPXUuY2FsbChlLCJwcm90b3R5cGUiKSxwLmZ1bmNEZWNvbXA9L1xidGhpc1xiLy50ZXN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxwLmZ1bmNOYW1lcz0ic3RyaW5nIj09dHlwZW9mIEZ1bmN0aW9uLm5hbWUscC5ub2RlVGFnPWwuY2FsbChzKSE9cixwLm5vbkVudW1TdHJpbmdzPSF1LmNhbGwoIngiLDApLHAubm9uRW51bVNoYWRvd3M9IS92YWx1ZU9mLy50ZXN0KGkpLHAub3duTGFzdD0ieCIhPWlbMF0scC5zcGxpY2VPYmplY3RzPShjLmNhbGwodCwwLDEpLCF0WzBdKSxwLnVuaW5kZXhlZENoYXJzPSJ4IlswXStPYmplY3QoIngiKVswXSE9Inh4Ijt0cnl7cC5kb209MTE9PT1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5ub2RlVHlwZX1jYXRjaChoKXtwLmRvbT0hMX10cnl7cC5ub25FbnVtQXJncz0hdS5jYWxsKGFyZ3VtZW50cywxKX1jYXRjaChoKXtwLm5vbkVudW1BcmdzPSEwfX0oMCwwKSx0LmV4cG9ydHM9cH0pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se31dLDEwODpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX10LmV4cG9ydHM9bn0se31dLDEwOTpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiBlfXQuZXhwb3J0cz1ufSx7fV0sMTEwOltmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXt9dC5leHBvcnRzPW59LHt9XSwxMTE6W2Z1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpe31mdW5jdGlvbiByKGUpe3ZhciB0PXt9LnRvU3RyaW5nLmNhbGwoZSk7c3dpdGNoKHQpe2Nhc2UiW29iamVjdCBGaWxlXSI6Y2FzZSJbb2JqZWN0IEJsb2JdIjpjYXNlIltvYmplY3QgRm9ybURhdGFdIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBpKCl7aWYoZy5YTUxIdHRwUmVxdWVzdCYmKCJmaWxlOiIhPWcubG9jYXRpb24ucHJvdG9jb2x8fCFnLkFjdGl2ZVhPYmplY3QpKXJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3Q7dHJ5e3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChlKXt9dHJ5e3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTXN4bWwyLlhNTEhUVFAuNi4wIil9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQLjMuMCIpfWNhdGNoKGUpe310cnl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUCIpfWNhdGNoKGUpe31yZXR1cm4hMX1mdW5jdGlvbiBvKGUpe3JldHVybiBlPT09T2JqZWN0KGUpfWZ1bmN0aW9uIGEoZSl7aWYoIW8oZSkpcmV0dXJuIGU7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpbnVsbCE9ZVtuXSYmdC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChuKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVbbl0pKTtyZXR1cm4gdC5qb2luKCImIil9ZnVuY3Rpb24gcyhlKXtmb3IodmFyIHQsbixyPXt9LGk9ZS5zcGxpdCgiJiIpLG89MCxhPWkubGVuZ3RoO2E+bzsrK28pbj1pW29dLHQ9bi5zcGxpdCgiPSIpLHJbZGVjb2RlVVJJQ29tcG9uZW50KHRbMF0pXT1kZWNvZGVVUklDb21wb25lbnQodFsxXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gbChlKXt2YXIgdCxuLHIsaSxvPWUuc3BsaXQoL1xyP1xuLyksYT17fTtvLnBvcCgpO2Zvcih2YXIgcz0wLGw9by5sZW5ndGg7bD5zOysrcyluPW9bc10sdD1uLmluZGV4T2YoIjoiKSxyPW4uc2xpY2UoMCx0KS50b0xvd2VyQ2FzZSgpLGk9eShuLnNsaWNlKHQrMSkpLGFbcl09aTtyZXR1cm4gYX1mdW5jdGlvbiB1KGUpe3JldHVybiBlLnNwbGl0KC8gKjsgKi8pLnNoaWZ0KCl9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gbShlLnNwbGl0KC8gKjsgKi8pLGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zcGxpdCgvICo9ICovKSxyPW4uc2hpZnQoKSxpPW4uc2hpZnQoKTtyZXR1cm4gciYmaSYmKGVbcl09aSksZX0se30pfWZ1bmN0aW9uIHAoZSx0KXt0PXR8fHt9LHRoaXMucmVxPWUsdGhpcy54aHI9dGhpcy5yZXEueGhyLHRoaXMudGV4dD0iSEVBRCIhPXRoaXMucmVxLm1ldGhvZD90aGlzLnhoci5yZXNwb25zZVRleHQ6bnVsbCx0aGlzLnNldFN0YXR1c1Byb3BlcnRpZXModGhpcy54aHIuc3RhdHVzKSx0aGlzLmhlYWRlcj10aGlzLmhlYWRlcnM9bCh0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksdGhpcy5oZWFkZXJbImNvbnRlbnQtdHlwZSJdPXRoaXMueGhyLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSx0aGlzLnNldEhlYWRlclByb3BlcnRpZXModGhpcy5oZWFkZXIpLHRoaXMuYm9keT0iSEVBRCIhPXRoaXMucmVxLm1ldGhvZD90aGlzLnBhcnNlQm9keSh0aGlzLnRleHQpOm51bGx9ZnVuY3Rpb24gaChlLHQpe3ZhciBuPXRoaXM7ZC5jYWxsKHRoaXMpLHRoaXMuX3F1ZXJ5PXRoaXMuX3F1ZXJ5fHxbXSx0aGlzLm1ldGhvZD1lLHRoaXMudXJsPXQsdGhpcy5oZWFkZXI9e30sdGhpcy5faGVhZGVyPXt9LHRoaXMub24oImVuZCIsZnVuY3Rpb24oKXt2YXIgZT1udWxsLHQ9bnVsbDt0cnl7dD1uZXcgcChuKX1jYXRjaChyKXtlPW5ldyBFcnJvcigiUGFyc2VyIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgcmVzcG9uc2UiKSxlLnBhcnNlPSEwLGUub3JpZ2luYWw9cn1uLmNhbGxiYWNrKGUsdCl9KX1mdW5jdGlvbiBmKGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IGgoIkdFVCIsZSkuZW5kKHQpOjE9PWFyZ3VtZW50cy5sZW5ndGg/bmV3IGgoIkdFVCIsZSk6bmV3IGgoZSx0KX12YXIgZD1lKCJlbWl0dGVyIiksbT1lKCJyZWR1Y2UiKSxnPSJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93P3RoaXM6d2luZG93LHk9IiIudHJpbT9mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltKCl9OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyheXHMqfFxzKiQpL2csIiIpfTtmLnNlcmlhbGl6ZU9iamVjdD1hLGYucGFyc2VTdHJpbmc9cyxmLnR5cGVzPXtodG1sOiJ0ZXh0L2h0bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24iLHhtbDoiYXBwbGljYXRpb24veG1sIix1cmxlbmNvZGVkOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLGZvcm06ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsImZvcm0tZGF0YSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9LGYuc2VyaWFsaXplPXsiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjphLCJhcHBsaWNhdGlvbi9qc29uIjpKU09OLnN0cmluZ2lmeX0sZi5wYXJzZT17ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI6cywiYXBwbGljYXRpb24vanNvbiI6SlNPTi5wYXJzZX0scC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmhlYWRlcltlLnRvTG93ZXJDYXNlKCldfSxwLnByb3RvdHlwZS5zZXRIZWFkZXJQcm9wZXJ0aWVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oZWFkZXJbImNvbnRlbnQtdHlwZSJdfHwiIjt0aGlzLnR5cGU9dShlKTt2YXIgdD1jKGUpO2Zvcih2YXIgbiBpbiB0KXRoaXNbbl09dFtuXX0scC5wcm90b3R5cGUucGFyc2VCb2R5PWZ1bmN0aW9uKGUpe3ZhciB0PWYucGFyc2VbdGhpcy50eXBlXTtyZXR1cm4gdCYmZSYmZS5sZW5ndGg/dChlKTpudWxsfSxwLnByb3RvdHlwZS5zZXRTdGF0dXNQcm9wZXJ0aWVzPWZ1bmN0aW9uKGUpe3ZhciB0PWUvMTAwfDA7dGhpcy5zdGF0dXM9ZSx0aGlzLnN0YXR1c1R5cGU9dCx0aGlzLmluZm89MT09dCx0aGlzLm9rPTI9PXQsdGhpcy5jbGllbnRFcnJvcj00PT10LHRoaXMuc2VydmVyRXJyb3I9NT09dCx0aGlzLmVycm9yPTQ9PXR8fDU9PXQ/dGhpcy50b0Vycm9yKCk6ITEsdGhpcy5hY2NlcHRlZD0yMDI9PWUsdGhpcy5ub0NvbnRlbnQ9MjA0PT1lfHwxMjIzPT1lLHRoaXMuYmFkUmVxdWVzdD00MDA9PWUsdGhpcy51bmF1dGhvcml6ZWQ9NDAxPT1lLHRoaXMubm90QWNjZXB0YWJsZT00MDY9PWUsdGhpcy5ub3RGb3VuZD00MDQ9PWUsdGhpcy5mb3JiaWRkZW49NDAzPT1lfSxwLnByb3RvdHlwZS50b0Vycm9yPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXEsdD1lLm1ldGhvZCxuPWUudXJsLHI9ImNhbm5vdCAiK3QrIiAiK24rIiAoIit0aGlzLnN0YXR1cysiKSIsaT1uZXcgRXJyb3Iocik7cmV0dXJuIGkuc3RhdHVzPXRoaXMuc3RhdHVzLGkubWV0aG9kPXQsaS51cmw9bixpfSxmLlJlc3BvbnNlPXAsZChoLnByb3RvdHlwZSksaC5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUpe3JldHVybiBlKHRoaXMpLHRoaXN9LGgucHJvdG90eXBlLnRpbWVvdXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3RpbWVvdXQ9ZSx0aGlzfSxoLnByb3RvdHlwZS5jbGVhclRpbWVvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGltZW91dD0wLGNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpc30saC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hYm9ydGVkP3ZvaWQgMDoodGhpcy5hYm9ydGVkPSEwLHRoaXMueGhyLmFib3J0KCksdGhpcy5jbGVhclRpbWVvdXQoKSx0aGlzLmVtaXQoImFib3J0IiksdGhpcyl9LGgucHJvdG90eXBlLnNldD1mdW5jdGlvbihlLHQpe2lmKG8oZSkpe2Zvcih2YXIgbiBpbiBlKXRoaXMuc2V0KG4sZVtuXSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuX2hlYWRlcltlLnRvTG93ZXJDYXNlKCldPXQsdGhpcy5oZWFkZXJbZV09dCx0aGlzfSxoLnByb3RvdHlwZS51bnNldD1mdW5jdGlvbihlKXtyZXR1cm4gZGVsZXRlIHRoaXMuX2hlYWRlcltlLnRvTG93ZXJDYXNlKCldLGRlbGV0ZSB0aGlzLmhlYWRlcltlXSx0aGlzfSxoLnByb3RvdHlwZS5nZXRIZWFkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2hlYWRlcltlLnRvTG93ZXJDYXNlKCldfSxoLnByb3RvdHlwZS50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNldCgiQ29udGVudC1UeXBlIixmLnR5cGVzW2VdfHxlKSx0aGlzfSxoLnByb3RvdHlwZS5hY2NlcHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0KCJBY2NlcHQiLGYudHlwZXNbZV18fGUpLHRoaXN9LGgucHJvdG90eXBlLmF1dGg9ZnVuY3Rpb24oZSx0KXt2YXIgbj1idG9hKGUrIjoiK3QpO3JldHVybiB0aGlzLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrbiksdGhpc30saC5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYoZT1hKGUpKSxlJiZ0aGlzLl9xdWVyeS5wdXNoKGUpLHRoaXN9LGgucHJvdG90eXBlLmZpZWxkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2Zvcm1EYXRhfHwodGhpcy5fZm9ybURhdGE9bmV3IEZvcm1EYXRhKSx0aGlzLl9mb3JtRGF0YS5hcHBlbmQoZSx0KSx0aGlzfSxoLnByb3RvdHlwZS5hdHRhY2g9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9mb3JtRGF0YXx8KHRoaXMuX2Zvcm1EYXRhPW5ldyBGb3JtRGF0YSksdGhpcy5fZm9ybURhdGEuYXBwZW5kKGUsdCxuKSx0aGlzfSxoLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3ZhciB0PW8oZSksbj10aGlzLmdldEhlYWRlcigiQ29udGVudC1UeXBlIik7aWYodCYmbyh0aGlzLl9kYXRhKSlmb3IodmFyIHIgaW4gZSl0aGlzLl9kYXRhW3JdPWVbcl07ZWxzZSJzdHJpbmciPT10eXBlb2YgZT8obnx8dGhpcy50eXBlKCJmb3JtIiksbj10aGlzLmdldEhlYWRlcigiQ29udGVudC1UeXBlIiksdGhpcy5fZGF0YT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09bj90aGlzLl9kYXRhP3RoaXMuX2RhdGErIiYiK2U6ZToodGhpcy5fZGF0YXx8IiIpK2UpOnRoaXMuX2RhdGE9ZTtyZXR1cm4gdD8obnx8dGhpcy50eXBlKCJqc29uIiksdGhpcyk6dGhpc30saC5wcm90b3R5cGUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9jYWxsYmFjaztyZXR1cm4gdGhpcy5jbGVhclRpbWVvdXQoKSwyPT1uLmxlbmd0aD9uKGUsdCk6ZT90aGlzLmVtaXQoImVycm9yIixlKTp2b2lkIG4odCl9LGgucHJvdG90eXBlLmNyb3NzRG9tYWluRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoIk9yaWdpbiBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4iKTtlLmNyb3NzRG9tYWluPSEwLHRoaXMuY2FsbGJhY2soZSl9LGgucHJvdG90eXBlLnRpbWVvdXRFcnJvcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3RpbWVvdXQsdD1uZXcgRXJyb3IoInRpbWVvdXQgb2YgIitlKyJtcyBleGNlZWRlZCIpO3QudGltZW91dD1lLHRoaXMuY2FsbGJhY2sodCl9LGgucHJvdG90eXBlLndpdGhDcmVkZW50aWFscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93aXRoQ3JlZGVudGlhbHM9ITAsdGhpc30saC5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbz10aGlzLnhocj1pKCksYT10aGlzLl9xdWVyeS5qb2luKCImIikscz10aGlzLl90aW1lb3V0LGw9dGhpcy5fZm9ybURhdGF8fHRoaXMuX2RhdGE7aWYodGhpcy5fY2FsbGJhY2s9ZXx8bixvLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3JldHVybiA0PT1vLnJlYWR5U3RhdGU/MD09by5zdGF0dXM/dC5hYm9ydGVkP3QudGltZW91dEVycm9yKCk6dC5jcm9zc0RvbWFpbkVycm9yKCk6dm9pZCB0LmVtaXQoImVuZCIpOnZvaWQgMH0sby51cGxvYWQmJihvLnVwbG9hZC5vbnByb2dyZXNzPWZ1bmN0aW9uKGUpe2UucGVyY2VudD1lLmxvYWRlZC9lLnRvdGFsKjEwMCx0LmVtaXQoInByb2dyZXNzIixlKX0pLHMmJiF0aGlzLl90aW1lciYmKHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmFib3J0KCl9LHMpKSxhJiYoYT1mLnNlcmlhbGl6ZU9iamVjdChhKSx0aGlzLnVybCs9fnRoaXMudXJsLmluZGV4T2YoIj8iKT8iJiIrYToiPyIrYSksby5vcGVuKHRoaXMubWV0aG9kLHRoaXMudXJsLCEwKSx0aGlzLl93aXRoQ3JlZGVudGlhbHMmJihvLndpdGhDcmVkZW50aWFscz0hMCksIkdFVCIhPXRoaXMubWV0aG9kJiYiSEVBRCIhPXRoaXMubWV0aG9kJiYic3RyaW5nIiE9dHlwZW9mIGwmJiFyKGwpKXt2YXIgdT1mLnNlcmlhbGl6ZVt0aGlzLmdldEhlYWRlcigiQ29udGVudC1UeXBlIildO3UmJihsPXUobCkpfWZvcih2YXIgYyBpbiB0aGlzLmhlYWRlciludWxsIT10aGlzLmhlYWRlcltjXSYmby5zZXRSZXF1ZXN0SGVhZGVyKGMsdGhpcy5oZWFkZXJbY10pO3JldHVybiB0aGlzLmVtaXQoInJlcXVlc3QiLHRoaXMpLG8uc2VuZChsKSx0aGlzfSxmLlJlcXVlc3Q9aCxmLmdldD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZigiR0VUIixlKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49dCx0PW51bGwpLHQmJnIucXVlcnkodCksbiYmci5lbmQobikscn0sZi5oZWFkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mKCJIRUFEIixlKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49dCx0PW51bGwpLHQmJnIuc2VuZCh0KSxuJiZyLmVuZChuKSxyfSxmLmRlbD1mdW5jdGlvbihlLHQpe3ZhciBuPWYoIkRFTEVURSIsZSk7cmV0dXJuIHQmJm4uZW5kKHQpLG59LGYucGF0Y2g9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWYoIlBBVENIIixlKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49dCx0PW51bGwpLHQmJnIuc2VuZCh0KSxuJiZyLmVuZChuKSxyfSxmLnBvc3Q9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWYoIlBPU1QiLGUpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCksdCYmci5zZW5kKHQpLG4mJnIuZW5kKG4pLHJ9LGYucHV0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mKCJQVVQiLGUpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCksdCYmci5zZW5kKHQpLG4mJnIuZW5kKG4pLHJ9LHQuZXhwb3J0cz1mfSx7ZW1pdHRlcjoxMTIscmVkdWNlOjExM31dLDExMjpbZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiBlP3IoZSk6dm9pZCAwfWZ1bmN0aW9uIHIoZSl7Zm9yKHZhciB0IGluIG4ucHJvdG90eXBlKWVbdF09bi5wcm90b3R5cGVbdF07cmV0dXJuIGV9dC5leHBvcnRzPW4sbi5wcm90b3R5cGUub249bi5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSwodGhpcy5fY2FsbGJhY2tzW2VdPXRoaXMuX2NhbGxiYWNrc1tlXXx8W10pLnB1c2godCksdGhpc30sbi5wcm90b3R5cGUub25jZT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtyLm9mZihlLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciByPXRoaXM7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LG4uZm49dCx0aGlzLm9uKGUsbiksdGhpc30sbi5wcm90b3R5cGUub2ZmPW4ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPW4ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1uLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30sMD09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXt9LHRoaXM7dmFyIG49dGhpcy5fY2FsbGJhY2tzW2VdO2lmKCFuKXJldHVybiB0aGlzO2lmKDE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbZV0sdGhpcztmb3IodmFyIHIsaT0wO2k8bi5sZW5ndGg7aSsrKWlmKHI9bltpXSxyPT09dHx8ci5mbj09PXQpe24uc3BsaWNlKGksMSk7YnJlYWt9cmV0dXJuIHRoaXN9LG4ucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307dmFyIHQ9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbj10aGlzLl9jYWxsYmFja3NbZV07aWYobil7bj1uLnNsaWNlKDApO2Zvcih2YXIgcj0wLGk9bi5sZW5ndGg7aT5yOysrciluW3JdLmFwcGx5KHRoaXMsdCl9cmV0dXJuIHRoaXN9LG4ucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30sdGhpcy5fY2FsbGJhY2tzW2VdfHxbXX0sbi5wcm90b3R5cGUuaGFzTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5saXN0ZW5lcnMoZSkubGVuZ3RofX0se31dLDExMzpbZnVuY3Rpb24oZSx0KXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9ZS5sZW5ndGgsbz0zPT1hcmd1bWVudHMubGVuZ3RoP246ZVtyKytdO2k+cjspbz10LmNhbGwobnVsbCxvLGVbcl0sKytyLGUpO3JldHVybiBvfX0se31dfSx7fSxbMV0pKDEpfSksd2luZG93LlN3YWdnZXJVaT1CYWNrYm9uZS5Sb3V0ZXIuZXh0ZW5kKHtkb21faWQ6InN3YWdnZXJfdWkiLG9wdGlvbnM6bnVsbCxhcGk6bnVsbCxoZWFkZXJWaWV3Om51bGwsbWFpblZpZXc6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe2U9ZXx8e30sZS5kb21faWQmJih0aGlzLmRvbV9pZD1lLmRvbV9pZCxkZWxldGUgZS5kb21faWQpLGUuc3VwcG9ydGVkU3VibWl0TWV0aG9kc3x8KGUuc3VwcG9ydGVkU3VibWl0TWV0aG9kcz1bImdldCIsInB1dCIsInBvc3QiLCJkZWxldGUiLCJoZWFkIiwib3B0aW9ucyIsInBhdGNoIl0pLCJzdHJpbmciPT10eXBlb2YgZS5vYXV0aDJSZWRpcmVjdFVybCYmKHdpbmRvdy5vQXV0aFJlZGlyZWN0VXJsPWUucmVkaXJlY3RVcmwpLCQoIiMiK3RoaXMuZG9tX2lkKS5sZW5ndGh8fCQoImJvZHkiKS5hcHBlbmQoJzxkaXYgaWQ9IicrdGhpcy5kb21faWQrJyI+PC9kaXY+JyksdGhpcy5vcHRpb25zPWUsbWFya2VkLnNldE9wdGlvbnMoe2dmbTohMH0pOwordmFyIHQ9dGhpczt0aGlzLm9wdGlvbnMuc3VjY2Vzcz1mdW5jdGlvbigpe3JldHVybiB0LnJlbmRlcigpfSx0aGlzLm9wdGlvbnMucHJvZ3Jlc3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2hvd01lc3NhZ2UoZSl9LHRoaXMub3B0aW9ucy5mYWlsdXJlPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uTG9hZEZhaWx1cmUoZSl9LHRoaXMuaGVhZGVyVmlldz1uZXcgU3dhZ2dlclVpLlZpZXdzLkhlYWRlclZpZXcoe2VsOiQoIiNoZWFkZXIiKX0pLHRoaXMuaGVhZGVyVmlldy5vbigidXBkYXRlLXN3YWdnZXItdWkiLGZ1bmN0aW9uKGUpe3JldHVybiB0LnVwZGF0ZVN3YWdnZXJVaShlKX0pfSxzZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLm9wdGlvbnNbZV09dH0sZ2V0T3B0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnNbZV19LHVwZGF0ZVN3YWdnZXJVaTpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMudXJsPWUudXJsLHRoaXMubG9hZCgpfSxsb2FkOmZ1bmN0aW9uKCl7dGhpcy5tYWluVmlldyYmdGhpcy5tYWluVmlldy5jbGVhcigpO3ZhciBlPXRoaXMub3B0aW9ucy51cmw7ZSYmMCE9PWUuaW5kZXhPZigiaHR0cCIpJiYoZT10aGlzLmJ1aWxkVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCksZSkpLHRoaXMub3B0aW9ucy51cmw9ZSx0aGlzLmhlYWRlclZpZXcudXBkYXRlKGUpLHRoaXMuYXBpPW5ldyBTd2FnZ2VyQ2xpZW50KHRoaXMub3B0aW9ucyl9LGNvbGxhcHNlQWxsOmZ1bmN0aW9uKCl7RG9jcy5jb2xsYXBzZUVuZHBvaW50TGlzdEZvclJlc291cmNlKCIiKX0sbGlzdEFsbDpmdW5jdGlvbigpe0RvY3MuY29sbGFwc2VPcGVyYXRpb25zRm9yUmVzb3VyY2UoIiIpfSxleHBhbmRBbGw6ZnVuY3Rpb24oKXtEb2NzLmV4cGFuZE9wZXJhdGlvbnNGb3JSZXNvdXJjZSgiIil9LHJlbmRlcjpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLnNob3dNZXNzYWdlKCJGaW5pc2hlZCBMb2FkaW5nIFJlc291cmNlIEluZm9ybWF0aW9uLiBSZW5kZXJpbmcgU3dhZ2dlciBVSS4uLiIpLHRoaXMubWFpblZpZXc9bmV3IFN3YWdnZXJVaS5WaWV3cy5NYWluVmlldyh7bW9kZWw6dGhpcy5hcGksZWw6JCgiIyIrdGhpcy5kb21faWQpLHN3YWdnZXJPcHRpb25zOnRoaXMub3B0aW9ucyxyb3V0ZXI6dGhpc30pLnJlbmRlcigpLHRoaXMuc2hvd01lc3NhZ2UoKSx0aGlzLm9wdGlvbnMuZG9jRXhwYW5zaW9uKXtjYXNlImZ1bGwiOnRoaXMuZXhwYW5kQWxsKCk7YnJlYWs7Y2FzZSJsaXN0Ijp0aGlzLmxpc3RBbGwoKX10aGlzLnJlbmRlckdGTSgpLHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlJiZ0aGlzLm9wdGlvbnMub25Db21wbGV0ZSh0aGlzLmFwaSx0aGlzKSxzZXRUaW1lb3V0KERvY3Muc2hlYmFuZy5iaW5kKHRoaXMpLDEwMCl9LGJ1aWxkVXJsOmZ1bmN0aW9uKGUsdCl7aWYoMD09PXQuaW5kZXhPZigiLyIpKXt2YXIgbj1lLnNwbGl0KCIvIik7cmV0dXJuIGU9blswXSsiLy8iK25bMl0sZSt0fXZhciByPWUubGVuZ3RoO3JldHVybiBlLmluZGV4T2YoIj8iKT4tMSYmKHI9TWF0aC5taW4ocixlLmluZGV4T2YoIj8iKSkpLGUuaW5kZXhPZigiIyIpPi0xJiYocj1NYXRoLm1pbihyLGUuaW5kZXhPZigiIyIpKSksZT1lLnN1YnN0cmluZygwLHIpLC0xIT09ZS5pbmRleE9mKCIvIixlLmxlbmd0aC0xKT9lK3Q6ZSsiLyIrdH0sc2hvd01lc3NhZ2U6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpLCQoIiNtZXNzYWdlLWJhciIpLnJlbW92ZUNsYXNzKCJtZXNzYWdlLWZhaWwiKSwkKCIjbWVzc2FnZS1iYXIiKS5hZGRDbGFzcygibWVzc2FnZS1zdWNjZXNzIiksJCgiI21lc3NhZ2UtYmFyIikuaHRtbChlKX0sb25Mb2FkRmFpbHVyZTpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0iIiksJCgiI21lc3NhZ2UtYmFyIikucmVtb3ZlQ2xhc3MoIm1lc3NhZ2Utc3VjY2VzcyIpLCQoIiNtZXNzYWdlLWJhciIpLmFkZENsYXNzKCJtZXNzYWdlLWZhaWwiKTt2YXIgdD0kKCIjbWVzc2FnZS1iYXIiKS5odG1sKGUpO3JldHVybiB0aGlzLm9wdGlvbnMub25GYWlsdXJlJiZ0aGlzLm9wdGlvbnMub25GYWlsdXJlKGUpLHR9LHJlbmRlckdGTTpmdW5jdGlvbigpeyQoIi5tYXJrZG93biIpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLmh0bWwobWFya2VkKCQodGhpcykuaHRtbCgpKSl9KX19KSx3aW5kb3cuU3dhZ2dlclVpLlZpZXdzPXt9LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXsiY29uc29sZSJpbiB3aW5kb3cmJiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oZSl9d2luZG93LmF1dGhvcml6YXRpb25zPXthZGQ6ZnVuY3Rpb24oKXtpZihlKCJVc2luZyB3aW5kb3cuYXV0aG9yaXphdGlvbnMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBTd2FnZ2VyVWkuYXBpLmNsaWVudEF1dGhvcml6YXRpb25zLmFkZCgpLiIpLCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93LnN3YWdnZXJVaSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ3aW5kb3cuc3dhZ2dlclVpIGlzIG5vdCBkZWZpbmVkIik7d2luZG93LnN3YWdnZXJVaSBpbnN0YW5jZW9mIFN3YWdnZXJVaSYmd2luZG93LnN3YWdnZXJVaS5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMuYWRkLmFwcGx5KHdpbmRvdy5zd2FnZ2VyVWkuYXBpLmNsaWVudEF1dGhvcml6YXRpb25zLGFyZ3VtZW50cyl9fSx3aW5kb3cuQXBpS2V5QXV0aG9yaXphdGlvbj1mdW5jdGlvbigpe2UoIndpbmRvdy5BcGlLZXlBdXRob3JpemF0aW9uIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgU3dhZ2dlckNsaWVudC5BcGlLZXlBdXRob3JpemF0aW9uLiIpLFN3YWdnZXJDbGllbnQuQXBpS2V5QXV0aG9yaXphdGlvbi5hcHBseSh3aW5kb3csYXJndW1lbnRzKX0sd2luZG93LlBhc3N3b3JkQXV0aG9yaXphdGlvbj1mdW5jdGlvbigpe2UoIndpbmRvdy5QYXNzd29yZEF1dGhvcml6YXRpb24gaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBTd2FnZ2VyQ2xpZW50LlBhc3N3b3JkQXV0aG9yaXphdGlvbi4iKSxTd2FnZ2VyQ2xpZW50LlBhc3N3b3JkQXV0aG9yaXphdGlvbi5hcHBseSh3aW5kb3csYXJndW1lbnRzKX19KCksZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImIiXSxmdW5jdGlvbihuKXtyZXR1cm4gZS5Td2FnZ2VyVWk9dChuKX0pOiJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoImIiKSk6ZS5Td2FnZ2VyVWk9dChlLmIpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIFN3YWdnZXJVaX0pLFN3YWdnZXJVaS5WaWV3cy5BcGlLZXlCdXR0b249QmFja2JvbmUuVmlldy5leHRlbmQoe2V2ZW50czp7ImNsaWNrICNhcGlrZXlfYnV0dG9uIjoidG9nZ2xlQXBpS2V5Q29udGFpbmVyIiwiY2xpY2sgI2FwcGx5X2FwaV9rZXkiOiJhcHBseUFwaUtleSJ9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zPWV8fHt9LHRoaXMucm91dGVyPXRoaXMub3B0aW9ucy5yb3V0ZXJ9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMudGVtcGxhdGUoKTtyZXR1cm4gJCh0aGlzLmVsKS5odG1sKGUodGhpcy5tb2RlbCkpLHRoaXN9LGFwcGx5QXBpS2V5OmZ1bmN0aW9uKCl7dmFyIGU9bmV3IFN3YWdnZXJDbGllbnQuQXBpS2V5QXV0aG9yaXphdGlvbih0aGlzLm1vZGVsLm5hbWUsJCgiI2lucHV0X2FwaUtleV9lbnRyeSIpLnZhbCgpLHRoaXMubW9kZWxbImluIl0pO3RoaXMucm91dGVyLmFwaS5jbGllbnRBdXRob3JpemF0aW9ucy5hZGQodGhpcy5tb2RlbC5uYW1lLGUpLHRoaXMucm91dGVyLmxvYWQoKSwkKCIjYXBpa2V5X2NvbnRhaW5lciIpLnNob3coKX0sdG9nZ2xlQXBpS2V5Q29udGFpbmVyOmZ1bmN0aW9uKCl7aWYoJCgiI2FwaWtleV9jb250YWluZXIiKS5sZW5ndGgpe3ZhciBlPSQoIiNhcGlrZXlfY29udGFpbmVyIikuZmlyc3QoKTtlLmlzKCI6dmlzaWJsZSIpP2UuaGlkZSgpOigkKCIuYXV0aF9jb250YWluZXIiKS5oaWRlKCksZS5zaG93KCkpfX0sdGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gSGFuZGxlYmFycy50ZW1wbGF0ZXMuYXBpa2V5X2J1dHRvbl92aWV3fX0pLFN3YWdnZXJVaS5WaWV3cy5CYXNpY0F1dGhCdXR0b249QmFja2JvbmUuVmlldy5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zPWV8fHt9LHRoaXMucm91dGVyPXRoaXMub3B0aW9ucy5yb3V0ZXJ9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMudGVtcGxhdGUoKTtyZXR1cm4gJCh0aGlzLmVsKS5odG1sKGUodGhpcy5tb2RlbCkpLHRoaXN9LGV2ZW50czp7ImNsaWNrICNiYXNpY19hdXRoX2J1dHRvbiI6InRvZ2dsZVBhc3N3b3JkQ29udGFpbmVyIiwiY2xpY2sgI2FwcGx5X2Jhc2ljX2F1dGgiOiJhcHBseVBhc3N3b3JkIn0sYXBwbHlQYXNzd29yZDpmdW5jdGlvbigpe3ZhciBlPSQoIi5pbnB1dF91c2VybmFtZSIpLnZhbCgpLHQ9JCgiLmlucHV0X3Bhc3N3b3JkIikudmFsKCksbj1uZXcgU3dhZ2dlckNsaWVudC5QYXNzd29yZEF1dGhvcml6YXRpb24oImJhc2ljIixlLHQpO3RoaXMucm91dGVyLmFwaS5jbGllbnRBdXRob3JpemF0aW9ucy5hZGQodGhpcy5tb2RlbC50eXBlLG4pLHRoaXMucm91dGVyLmxvYWQoKSwkKCIjYmFzaWNfYXV0aF9jb250YWluZXIiKS5oaWRlKCl9LHRvZ2dsZVBhc3N3b3JkQ29udGFpbmVyOmZ1bmN0aW9uKCl7aWYoJCgiI2Jhc2ljX2F1dGhfY29udGFpbmVyIikubGVuZ3RoKXt2YXIgZT0kKCIjYmFzaWNfYXV0aF9jb250YWluZXIiKS5zaG93KCk7ZS5pcygiOnZpc2libGUiKT9lLnNsaWRlVXAoKTooJCgiLmF1dGhfY29udGFpbmVyIikuaGlkZSgpLGUuc2hvdygpKX19LHRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIEhhbmRsZWJhcnMudGVtcGxhdGVzLmJhc2ljX2F1dGhfYnV0dG9uX3ZpZXd9fSksU3dhZ2dlclVpLlZpZXdzLkNvbnRlbnRUeXBlVmlldz1CYWNrYm9uZS5WaWV3LmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbigpe30scmVuZGVyOmZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5jb250ZW50X3R5cGUodGhpcy5tb2RlbCkpLCQoImxhYmVsW2Zvcj1jb250ZW50VHlwZV0iLCQodGhpcy5lbCkpLnRleHQoIlJlc3BvbnNlIENvbnRlbnQgVHlwZSIpLHRoaXN9fSksU3dhZ2dlclVpLlZpZXdzLkhlYWRlclZpZXc9QmFja2JvbmUuVmlldy5leHRlbmQoe2V2ZW50czp7ImNsaWNrICNzaG93LXBldC1zdG9yZS1pY29uIjoic2hvd1BldFN0b3JlIiwiY2xpY2sgI3Nob3ctd29yZG5pay1kZXYtaWNvbiI6InNob3dXb3JkbmlrRGV2IiwiY2xpY2sgI2V4cGxvcmUiOiJzaG93Q3VzdG9tIiwia2V5dXAgI2lucHV0X2Jhc2VVcmwiOiJzaG93Q3VzdG9tT25LZXl1cCIsImtleXVwICNpbnB1dF9hcGlLZXkiOiJzaG93Q3VzdG9tT25LZXl1cCJ9LGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHNob3dQZXRTdG9yZTpmdW5jdGlvbigpe3RoaXMudHJpZ2dlcigidXBkYXRlLXN3YWdnZXItdWkiLHt1cmw6Imh0dHA6Ly9wZXRzdG9yZS5zd2FnZ2VyLmlvL3YyL3N3YWdnZXIuanNvbiJ9KX0sc2hvd1dvcmRuaWtEZXY6ZnVuY3Rpb24oKXt0aGlzLnRyaWdnZXIoInVwZGF0ZS1zd2FnZ2VyLXVpIix7dXJsOiJodHRwOi8vYXBpLndvcmRuaWsuY29tL3Y0L3Jlc291cmNlcy5qc29uIn0pfSxzaG93Q3VzdG9tT25LZXl1cDpmdW5jdGlvbihlKXsxMz09PWUua2V5Q29kZSYmdGhpcy5zaG93Q3VzdG9tKCl9LHNob3dDdXN0b206ZnVuY3Rpb24oZSl7ZSYmZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMudHJpZ2dlcigidXBkYXRlLXN3YWdnZXItdWkiLHt1cmw6JCgiI2lucHV0X2Jhc2VVcmwiKS52YWwoKSxhcGlLZXk6JCgiI2lucHV0X2FwaUtleSIpLnZhbCgpfSl9LHVwZGF0ZTpmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49ITEpLCQoIiNpbnB1dF9iYXNlVXJsIikudmFsKGUpLG4mJnRoaXMudHJpZ2dlcigidXBkYXRlLXN3YWdnZXItdWkiLHt1cmw6ZX0pfX0pLFN3YWdnZXJVaS5WaWV3cy5NYWluVmlldz1CYWNrYm9uZS5WaWV3LmV4dGVuZCh7YXBpc1NvcnRlcjp7YWxwaGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5uYW1lLmxvY2FsZUNvbXBhcmUodC5uYW1lKX19LG9wZXJhdGlvbnNTb3J0ZXJzOnthbHBoYTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnBhdGgubG9jYWxlQ29tcGFyZSh0LnBhdGgpfSxtZXRob2Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tZXRob2QubG9jYWxlQ29tcGFyZSh0Lm1ldGhvZCl9fSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpO2lmKGU9ZXx8e30sdGhpcy5yb3V0ZXI9ZS5yb3V0ZXIsZS5zd2FnZ2VyT3B0aW9ucy5hcGlzU29ydGVyJiYodD1lLnN3YWdnZXJPcHRpb25zLmFwaXNTb3J0ZXIsbj1fLmlzRnVuY3Rpb24odCk/dDp0aGlzLmFwaXNTb3J0ZXJbdF0sXy5pc0Z1bmN0aW9uKG4pJiZ0aGlzLm1vZGVsLmFwaXNBcnJheS5zb3J0KG4pKSxlLnN3YWdnZXJPcHRpb25zLm9wZXJhdGlvbnNTb3J0ZXImJih0PWUuc3dhZ2dlck9wdGlvbnMub3BlcmF0aW9uc1NvcnRlcixuPV8uaXNGdW5jdGlvbih0KT90OnRoaXMub3BlcmF0aW9uc1NvcnRlcnNbdF0sXy5pc0Z1bmN0aW9uKG4pKSlmb3IociBpbiB0aGlzLm1vZGVsLmFwaXNBcnJheSl0aGlzLm1vZGVsLmFwaXNBcnJheVtyXS5vcGVyYXRpb25zQXJyYXkuc29ydChuKTt0aGlzLm1vZGVsLmF1dGhzPVtdO2ZvcihyIGluIHRoaXMubW9kZWwuc2VjdXJpdHlEZWZpbml0aW9ucylpPXRoaXMubW9kZWwuc2VjdXJpdHlEZWZpbml0aW9uc1tyXSx0aGlzLm1vZGVsLmF1dGhzLnB1c2goe25hbWU6cix0eXBlOmkudHlwZSx2YWx1ZTppfSk7IjIuMCI9PT10aGlzLm1vZGVsLnN3YWdnZXJWZXJzaW9uJiYodGhpcy5tb2RlbC52YWxpZGF0b3JVcmw9InZhbGlkYXRvclVybCJpbiBlLnN3YWdnZXJPcHRpb25zP2Uuc3dhZ2dlck9wdGlvbnMudmFsaWRhdG9yVXJsOnRoaXMubW9kZWwudXJsLmluZGV4T2YoImxvY2FsaG9zdCIpPjA/bnVsbDoiaHR0cDovL29ubGluZS5zd2FnZ2VyLmlvL3ZhbGlkYXRvciIpfSxyZW5kZXI6ZnVuY3Rpb24oKXtpZih0aGlzLm1vZGVsLnNlY3VyaXR5RGVmaW5pdGlvbnMpZm9yKHZhciBlIGluIHRoaXMubW9kZWwuc2VjdXJpdHlEZWZpbml0aW9ucyl7dmFyIHQsbj10aGlzLm1vZGVsLnNlY3VyaXR5RGVmaW5pdGlvbnNbZV07ImFwaUtleSI9PT1uLnR5cGUmJjA9PT0kKCIjYXBpa2V5X2J1dHRvbiIpLmxlbmd0aCYmKHQ9bmV3IFN3YWdnZXJVaS5WaWV3cy5BcGlLZXlCdXR0b24oe21vZGVsOm4scm91dGVyOnRoaXMucm91dGVyfSkucmVuZGVyKCkuZWwsJCgiLmF1dGhfbWFpbl9jb250YWluZXIiKS5hcHBlbmQodCkpLCJiYXNpY0F1dGgiPT09bi50eXBlJiYwPT09JCgiI2Jhc2ljX2F1dGhfYnV0dG9uIikubGVuZ3RoJiYodD1uZXcgU3dhZ2dlclVpLlZpZXdzLkJhc2ljQXV0aEJ1dHRvbih7bW9kZWw6bixyb3V0ZXI6dGhpcy5yb3V0ZXJ9KS5yZW5kZXIoKS5lbCwkKCIuYXV0aF9tYWluX2NvbnRhaW5lciIpLmFwcGVuZCh0KSl9JCh0aGlzLmVsKS5odG1sKEhhbmRsZWJhcnMudGVtcGxhdGVzLm1haW4odGhpcy5tb2RlbCkpO2Zvcih2YXIgcj17fSxpPTAsbz0wO288dGhpcy5tb2RlbC5hcGlzQXJyYXkubGVuZ3RoO28rKyl7Zm9yKHZhciBhPXRoaXMubW9kZWwuYXBpc0FycmF5W29dLHM9YS5uYW1lOyJ1bmRlZmluZWQiIT10eXBlb2YgcltzXTspcz1zKyJfIitpLGkrPTE7YS5pZD1zLHJbc109YSx0aGlzLmFkZFJlc291cmNlKGEsdGhpcy5tb2RlbC5hdXRocyl9cmV0dXJuICQoIi5wcm9wV3JhcCIpLmhvdmVyKGZ1bmN0aW9uKCl7JCgiLm9wdGlvbnNXcmFwcGVyIiwkKHRoaXMpKS5zaG93KCl9LGZ1bmN0aW9uKCl7JCgiLm9wdGlvbnNXcmFwcGVyIiwkKHRoaXMpKS5oaWRlKCl9KSx0aGlzfSxhZGRSZXNvdXJjZTpmdW5jdGlvbihlLHQpe2UuaWQ9ZS5pZC5yZXBsYWNlKC9ccy9nLCJfIik7dmFyIG49bmV3IFN3YWdnZXJVaS5WaWV3cy5SZXNvdXJjZVZpZXcoe21vZGVsOmUscm91dGVyOnRoaXMucm91dGVyLHRhZ05hbWU6ImxpIixpZDoicmVzb3VyY2VfIitlLmlkLGNsYXNzTmFtZToicmVzb3VyY2UiLGF1dGhzOnQsc3dhZ2dlck9wdGlvbnM6dGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zfSk7JCgiI3Jlc291cmNlcyIpLmFwcGVuZChuLnJlbmRlcigpLmVsKX0sY2xlYXI6ZnVuY3Rpb24oKXskKHRoaXMuZWwpLmh0bWwoIiIpfX0pLFN3YWdnZXJVaS5WaWV3cy5PcGVyYXRpb25WaWV3PUJhY2tib25lLlZpZXcuZXh0ZW5kKHtpbnZvY2F0aW9uVXJsOm51bGwsZXZlbnRzOnsic3VibWl0IC5zYW5kYm94Ijoic3VibWl0T3BlcmF0aW9uIiwiY2xpY2sgLnN1Ym1pdCI6InN1Ym1pdE9wZXJhdGlvbiIsImNsaWNrIC5yZXNwb25zZV9oaWRlciI6ImhpZGVSZXNwb25zZSIsImNsaWNrIC50b2dnbGVPcGVyYXRpb24iOiJ0b2dnbGVPcGVyYXRpb25Db250ZW50IiwibW91c2VlbnRlciAuYXBpLWljIjoibW91c2VFbnRlciIsIm1vdXNlb3V0IC5hcGktaWMiOiJtb3VzZUV4aXQifSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3JldHVybiBlPWV8fHt9LHRoaXMucm91dGVyPWUucm91dGVyLHRoaXMuYXV0aHM9ZS5hdXRocyx0aGlzLnBhcmVudElkPXRoaXMubW9kZWwucGFyZW50SWQsdGhpcy5uaWNrbmFtZT10aGlzLm1vZGVsLm5pY2tuYW1lLHRoaXMubW9kZWwuZW5jb2RlZFBhcmVudElkPWVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnBhcmVudElkKSx0aGlzfSxtb3VzZUVudGVyOmZ1bmN0aW9uKGUpe3ZhciB0PSQodGhpcy5lbCkuZmluZCgiLmNvbnRlbnQiKSxuPWUucGFnZVgscj1lLnBhZ2VZLGk9JCh3aW5kb3cpLnNjcm9sbExlZnQoKSxvPSQod2luZG93KS5zY3JvbGxUb3AoKSxhPWkrJCh3aW5kb3cpLndpZHRoKCkscz1vKyQod2luZG93KS5oZWlnaHQoKSxsPXQud2lkdGgoKSx1PXQuaGVpZ2h0KCk7bitsPmEmJihuPWEtbCksaT5uJiYobj1pKSxyK3U+cyYmKHI9cy11KSxvPnImJihyPW8pO3ZhciBjPXt9O2MudG9wPXIsYy5sZWZ0PW4sdC5jc3MoYyksJChlLmN1cnJlbnRUYXJnZXQucGFyZW50Tm9kZSkuZmluZCgiI2FwaV9pbmZvcm1hdGlvbl9wYW5lbCIpLnNob3coKX0sbW91c2VFeGl0OmZ1bmN0aW9uKGUpeyQoZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUpLmZpbmQoIiNhcGlfaW5mb3JtYXRpb25fcGFuZWwiKS5oaWRlKCl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxhLHMsbCx1LGMscCxoLGYsZCxtLGcseSx2LGIsdyx4LEEsRSxqLEMsVCxTLF8sTyxrLEQsTCxOLFAsSSxSLE07aWYobz1qUXVlcnkuaW5BcnJheSh0aGlzLm1vZGVsLm1ldGhvZCx0aGlzLm1vZGVsLnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHMoKSk+PTAsb3x8KHRoaXMubW9kZWwuaXNSZWFkT25seT0hMCksdGhpcy5tb2RlbC5kZXNjcmlwdGlvbj10aGlzLm1vZGVsLmRlc2NyaXB0aW9ufHx0aGlzLm1vZGVsLm5vdGVzLHRoaXMubW9kZWwub2F1dGg9bnVsbCxtPXRoaXMubW9kZWwuYXV0aG9yaXphdGlvbnN8fHRoaXMubW9kZWwuc2VjdXJpdHkpaWYoQXJyYXkuaXNBcnJheShtKSlmb3IobD0wLHU9bS5sZW5ndGg7dT5sO2wrKyl7bj1tW2xdO2ZvcihzIGluIG4pe3Q9bltzXTtmb3IoZSBpbiB0aGlzLmF1dGhzKWlmKHQ9dGhpcy5hdXRoc1tlXSwib2F1dGgyIj09PXQudHlwZSl7dGhpcy5tb2RlbC5vYXV0aD17fSx0aGlzLm1vZGVsLm9hdXRoLnNjb3Blcz1bXSxBPXQudmFsdWUuc2NvcGVzO2ZvcihhIGluIEEpUj1BW2FdLEQ9bltzXS5pbmRleE9mKGEpLEQ+PTAmJih5PXtzY29wZTphLGRlc2NyaXB0aW9uOlJ9LHRoaXMubW9kZWwub2F1dGguc2NvcGVzLnB1c2goeSkpfX19ZWxzZSBmb3IoYSBpbiBtKWlmKFI9bVthXSwib2F1dGgyIj09PWEpZm9yKG51bGw9PT10aGlzLm1vZGVsLm9hdXRoJiYodGhpcy5tb2RlbC5vYXV0aD17fSksdm9pZCAwPT09dGhpcy5tb2RlbC5vYXV0aC5zY29wZXMmJih0aGlzLm1vZGVsLm9hdXRoLnNjb3Blcz1bXSksZD0wLGM9Ui5sZW5ndGg7Yz5kO2QrKyl5PVJbZF0sdGhpcy5tb2RlbC5vYXV0aC5zY29wZXMucHVzaCh5KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMubW9kZWwucmVzcG9uc2VzKXt0aGlzLm1vZGVsLnJlc3BvbnNlTWVzc2FnZXM9W10sRT10aGlzLm1vZGVsLnJlc3BvbnNlcztmb3IociBpbiBFKU09RVtyXSxPPW51bGwsaz10aGlzLm1vZGVsLnJlc3BvbnNlc1tyXS5zY2hlbWEsayYmay4kcmVmJiYoTz1rLiRyZWYsMD09PU8uaW5kZXhPZigiIy9kZWZpbml0aW9ucy8iKSYmKE89Ty5zdWJzdHJpbmcoIiMvZGVmaW5pdGlvbnMvIi5sZW5ndGgpKSksdGhpcy5tb2RlbC5yZXNwb25zZU1lc3NhZ2VzLnB1c2goe2NvZGU6cixtZXNzYWdlOk0uZGVzY3JpcHRpb24scmVzcG9uc2VNb2RlbDpPfSl9aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLm1vZGVsLnJlc3BvbnNlTWVzc2FnZXMmJih0aGlzLm1vZGVsLnJlc3BvbnNlTWVzc2FnZXM9W10pLEw9bnVsbCx0aGlzLm1vZGVsLnN1Y2Nlc3NSZXNwb25zZSl7UD10aGlzLm1vZGVsLnN1Y2Nlc3NSZXNwb25zZTtmb3IocyBpbiBQKU09UFtzXSx0aGlzLm1vZGVsLnN1Y2Nlc3NDb2RlPXMsIm9iamVjdCI9PXR5cGVvZiBNJiYiZnVuY3Rpb24iPT10eXBlb2YgTS5jcmVhdGVKU09OU2FtcGxlJiYoTD17c2FtcGxlSlNPTjpKU09OLnN0cmluZ2lmeShNLmNyZWF0ZUpTT05TYW1wbGUoKSx2b2lkIDAsMiksaXNQYXJhbTohMSxzaWduYXR1cmU6TS5nZXRNb2NrU2lnbmF0dXJlKCl9KX1lbHNlIHRoaXMubW9kZWwucmVzcG9uc2VDbGFzc1NpZ25hdHVyZSYmInN0cmluZyIhPT10aGlzLm1vZGVsLnJlc3BvbnNlQ2xhc3NTaWduYXR1cmUmJihMPXtzYW1wbGVKU09OOnRoaXMubW9kZWwucmVzcG9uc2VTYW1wbGVKU09OLGlzUGFyYW06ITEsc2lnbmF0dXJlOnRoaXMubW9kZWwucmVzcG9uc2VDbGFzc1NpZ25hdHVyZX0pO2ZvcigkKHRoaXMuZWwpLmh0bWwoSGFuZGxlYmFycy50ZW1wbGF0ZXMub3BlcmF0aW9uKHRoaXMubW9kZWwpKSxMPyhfPW5ldyBTd2FnZ2VyVWkuVmlld3MuU2lnbmF0dXJlVmlldyh7bW9kZWw6TCxyb3V0ZXI6dGhpcy5yb3V0ZXIsdGFnTmFtZToiZGl2In0pLCQoIi5tb2RlbC1zaWduYXR1cmUiLCQodGhpcy5lbCkpLmFwcGVuZChfLnJlbmRlcigpLmVsKSk6KHRoaXMubW9kZWwucmVzcG9uc2VDbGFzc1NpZ25hdHVyZT0ic3RyaW5nIiwkKCIubW9kZWwtc2lnbmF0dXJlIiwkKHRoaXMuZWwpKS5odG1sKHRoaXMubW9kZWwudHlwZSkpLGk9e2lzUGFyYW06ITF9LGkuY29uc3VtZXM9dGhpcy5tb2RlbC5jb25zdW1lcyxpLnByb2R1Y2VzPXRoaXMubW9kZWwucHJvZHVjZXMsaj10aGlzLm1vZGVsLnBhcmFtZXRlcnMsZz0wLHA9ai5sZW5ndGg7cD5nO2crKyliPWpbZ10sST1iLnR5cGV8fGIuZGF0YVR5cGV8fCIiLCJ1bmRlZmluZWQiPT10eXBlb2YgSSYmKE89Yi5zY2hlbWEsTyYmTy4kcmVmJiYoeD1PLiRyZWYsST0wPT09eC5pbmRleE9mKCIjL2RlZmluaXRpb25zLyIpP3guc3Vic3RyaW5nKCIjL2RlZmluaXRpb25zLyIubGVuZ3RoKTp4KSksSSYmImZpbGUiPT09SS50b0xvd2VyQ2FzZSgpJiYoaS5jb25zdW1lc3x8KGkuY29uc3VtZXM9Im11bHRpcGFydC9mb3JtLWRhdGEiKSksYi50eXBlPUk7Zm9yKFM9bmV3IFN3YWdnZXJVaS5WaWV3cy5SZXNwb25zZUNvbnRlbnRUeXBlVmlldyh7bW9kZWw6aSxyb3V0ZXI6dGhpcy5yb3V0ZXJ9KSwkKCIucmVzcG9uc2UtY29udGVudC10eXBlIiwkKHRoaXMuZWwpKS5hcHBlbmQoUy5yZW5kZXIoKS5lbCksQz10aGlzLm1vZGVsLnBhcmFtZXRlcnMsdj0wLGg9Qy5sZW5ndGg7aD52O3YrKyliPUNbdl0sdGhpcy5hZGRQYXJhbWV0ZXIoYixpLmNvbnN1bWVzKTtmb3IoVD10aGlzLm1vZGVsLnJlc3BvbnNlTWVzc2FnZXMsdz0wLGY9VC5sZW5ndGg7Zj53O3crKylOPVRbd10sdGhpcy5hZGRTdGF0dXNDb2RlKE4pO3JldHVybiB0aGlzfSxhZGRQYXJhbWV0ZXI6ZnVuY3Rpb24oZSx0KXtlLmNvbnN1bWVzPXQ7dmFyIG49bmV3IFN3YWdnZXJVaS5WaWV3cy5QYXJhbWV0ZXJWaWV3KHttb2RlbDplLHRhZ05hbWU6InRyIixyZWFkT25seTp0aGlzLm1vZGVsLmlzUmVhZE9ubHl9KTskKCIub3BlcmF0aW9uLXBhcmFtcyIsJCh0aGlzLmVsKSkuYXBwZW5kKG4ucmVuZGVyKCkuZWwpfSxhZGRTdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBTd2FnZ2VyVWkuVmlld3MuU3RhdHVzQ29kZVZpZXcoe21vZGVsOmUsdGFnTmFtZToidHIiLHJvdXRlcjp0aGlzLnJvdXRlcn0pOyQoIi5vcGVyYXRpb24tc3RhdHVzIiwkKHRoaXMuZWwpKS5hcHBlbmQodC5yZW5kZXIoKS5lbCl9LHN1Ym1pdE9wZXJhdGlvbjpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxsLHUsYyxwLGgsZixkLG0sZztpZihudWxsIT09ZSYmZS5wcmV2ZW50RGVmYXVsdCgpLG49JCgiLnNhbmRib3giLCQodGhpcy5lbCkpLHQ9ITAsbi5maW5kKCJpbnB1dC5yZXF1aXJlZCIpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCJlcnJvciIpLCIiPT09alF1ZXJ5LnRyaW0oJCh0aGlzKS52YWwoKSkmJigkKHRoaXMpLmFkZENsYXNzKCJlcnJvciIpLCQodGhpcykud2lnZ2xlKHtjYWxsYmFjazpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXskKGUpLmZvY3VzKCl9fSh0aGlzKX0pLHQ9ITEpfSksbi5maW5kKCJ0ZXh0YXJlYS5yZXF1aXJlZCIpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCJlcnJvciIpLCIiPT09alF1ZXJ5LnRyaW0oJCh0aGlzKS52YWwoKSkmJigkKHRoaXMpLmFkZENsYXNzKCJlcnJvciIpLCQodGhpcykud2lnZ2xlKHtjYWxsYmFjazpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gJChlKS5mb2N1cygpfX0odGhpcyl9KSx0PSExKX0pLHQpe2Zvcih1PXt9LGg9e3BhcmVudDp0aGlzfSxyPSExLGY9bi5maW5kKCJpbnB1dCIpLGk9MCxvPWYubGVuZ3RoO28+aTtpKyspcD1mW2ldLG51bGwhPT1wLnZhbHVlJiZqUXVlcnkudHJpbShwLnZhbHVlKS5sZW5ndGg+MCYmKHVbcC5uYW1lXT1wLnZhbHVlKSwiZmlsZSI9PT1wLnR5cGUmJih1W3AubmFtZV09cC5maWxlc1swXSxyPSEwKTtmb3IoZD1uLmZpbmQoInRleHRhcmVhIiksbD0wLGE9ZC5sZW5ndGg7YT5sO2wrKylwPWRbbF0sbnVsbCE9PXAudmFsdWUmJmpRdWVyeS50cmltKHAudmFsdWUpLmxlbmd0aD4wJiYodVtwLm5hbWVdPXAudmFsdWUpO2ZvcihtPW4uZmluZCgic2VsZWN0IiksYz0wLHM9bS5sZW5ndGg7cz5jO2MrKylwPW1bY10sZz10aGlzLmdldFNlbGVjdGVkVmFsdWUocCksbnVsbCE9PWcmJmpRdWVyeS50cmltKGcpLmxlbmd0aD4wJiYodVtwLm5hbWVdPWcpO3JldHVybiBoLnJlc3BvbnNlQ29udGVudFR5cGU9JCgiZGl2IHNlbGVjdFtuYW1lPXJlc3BvbnNlQ29udGVudFR5cGVdIiwkKHRoaXMuZWwpKS52YWwoKSxoLnJlcXVlc3RDb250ZW50VHlwZT0kKCJkaXYgc2VsZWN0W25hbWU9cGFyYW1ldGVyQ29udGVudFR5cGVdIiwkKHRoaXMuZWwpKS52YWwoKSwkKCIucmVzcG9uc2VfdGhyb2JiZXIiLCQodGhpcy5lbCkpLnNob3coKSxyP3RoaXMuaGFuZGxlRmlsZVVwbG9hZCh1LG4pOnRoaXMubW9kZWxbImRvIl0odSxoLHRoaXMuc2hvd0NvbXBsZXRlU3RhdHVzLHRoaXMuc2hvd0Vycm9yU3RhdHVzLHRoaXMpfX0sc3VjY2VzczpmdW5jdGlvbihlLHQpe3Quc2hvd0NvbXBsZXRlU3RhdHVzKGUpfSxoYW5kbGVGaWxlVXBsb2FkOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGwsdSxjLHAsaCxmLGQsbSxnLHksdixiLHc7Zm9yKHk9dC5zZXJpYWxpemVBcnJheSgpLG89MCxhPXkubGVuZ3RoO2E+bztvKyspaD15W29dLG51bGwhPT1oLnZhbHVlJiZqUXVlcnkudHJpbShoLnZhbHVlKS5sZW5ndGg+MCYmKGVbaC5uYW1lXT1oLnZhbHVlKTtmb3Iobj1uZXcgRm9ybURhdGEsZz0wLHY9dGhpcy5tb2RlbC5wYXJhbWV0ZXJzLGM9MCxzPXYubGVuZ3RoO3M+YztjKyspbT12W2NdLCgiZm9ybSI9PT1tLnBhcmFtVHlwZXx8ImZvcm1EYXRhIj09PW1bImluIl0pJiYiZmlsZSIhPT1tLnR5cGUudG9Mb3dlckNhc2UoKSYmdm9pZCAwIT09ZVttLm5hbWVdJiZuLmFwcGVuZChtLm5hbWUsZVttLm5hbWVdKTtmb3IoaT17fSxiPXRoaXMubW9kZWwucGFyYW1ldGVycyxwPTAsbD1iLmxlbmd0aDtsPnA7cCsrKW09YltwXSwiaGVhZGVyIj09PW0ucGFyYW1UeXBlJiYoaVttLm5hbWVdPWVbbS5uYW1lXSk7Zm9yKHc9dC5maW5kKCdpbnB1dFt0eXBlfj0iZmlsZSJdJyksZD0wLHU9dy5sZW5ndGg7dT5kO2QrKylyPXdbZF0sInVuZGVmaW5lZCIhPXR5cGVvZiByLmZpbGVzWzBdJiYobi5hcHBlbmQoJChyKS5hdHRyKCJuYW1lIiksci5maWxlc1swXSksZys9MSk7cmV0dXJuIHRoaXMuaW52b2NhdGlvblVybD10aGlzLm1vZGVsLnN1cHBvcnRIZWFkZXJQYXJhbXMoKT8oaT10aGlzLm1vZGVsLmdldEhlYWRlclBhcmFtcyhlKSxkZWxldGUgaVsiQ29udGVudC1UeXBlIl0sdGhpcy5tb2RlbC51cmxpZnkoZSwhMSkpOnRoaXMubW9kZWwudXJsaWZ5KGUsITApLCQoIi5yZXF1ZXN0X3VybCIsJCh0aGlzLmVsKSkuaHRtbCgiPHByZT48L3ByZT4iKSwkKCIucmVxdWVzdF91cmwgcHJlIiwkKHRoaXMuZWwpKS50ZXh0KHRoaXMuaW52b2NhdGlvblVybCksZj17dHlwZTp0aGlzLm1vZGVsLm1ldGhvZCx1cmw6dGhpcy5pbnZvY2F0aW9uVXJsLGhlYWRlcnM6aSxkYXRhOm4sZGF0YVR5cGU6Impzb24iLGNvbnRlbnRUeXBlOiExLHByb2Nlc3NEYXRhOiExLGVycm9yOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5zaG93RXJyb3JTdGF0dXMoZS53cmFwKHQpLGUpfX0odGhpcyksc3VjY2VzczpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuc2hvd1Jlc3BvbnNlKHQsZSl9fSh0aGlzKSxjb21wbGV0ZTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuc2hvd0NvbXBsZXRlU3RhdHVzKGUud3JhcCh0KSxlKX19KHRoaXMpfSx3aW5kb3cuYXV0aG9yaXphdGlvbnMmJndpbmRvdy5hdXRob3JpemF0aW9ucy5hcHBseShmKSxqUXVlcnkuYWpheChmKSwhMX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscztmb3Iocj17fSxuPWUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoIlxyIiksbz0wLGE9bi5sZW5ndGg7YT5vO28rKylpPW5bb10sdD1pLm1hdGNoKC9eKFteOl0qPyk6KC4qKSQvKSx0fHwodD1bXSksdC5zaGlmdCgpLHZvaWQgMCE9PXRbMF0mJnZvaWQgMCE9PXRbMV0mJihyW3RbMF0udHJpbSgpXT10WzFdLnRyaW0oKSk7cmV0dXJuIHM9e30scy5jb250ZW50PXt9LHMuY29udGVudC5kYXRhPWUucmVzcG9uc2VUZXh0LHMuaGVhZGVycz1yLHMucmVxdWVzdD17fSxzLnJlcXVlc3QudXJsPXRoaXMuaW52b2NhdGlvblVybCxzLnN0YXR1cz1lLnN0YXR1cyxzfSxnZXRTZWxlY3RlZFZhbHVlOmZ1bmN0aW9uKGUpe2lmKGUubXVsdGlwbGUpe2Zvcih2YXIgdD1bXSxuPTAscj1lLm9wdGlvbnMubGVuZ3RoO3I+bjtuKyspe3ZhciBpPWUub3B0aW9uc1tuXTtpLnNlbGVjdGVkJiZ0LnB1c2goaS52YWx1ZSl9cmV0dXJuIHQubGVuZ3RoPjA/dDpudWxsfXJldHVybiBlLnZhbHVlfSxoaWRlUmVzcG9uc2U6ZnVuY3Rpb24oZSl7ZSYmZS5wcmV2ZW50RGVmYXVsdCgpLCQoIi5yZXNwb25zZSIsJCh0aGlzLmVsKSkuc2xpZGVVcCgpLCQoIi5yZXNwb25zZV9oaWRlciIsJCh0aGlzLmVsKSkuZmFkZU91dCgpfSxzaG93UmVzcG9uc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5zdHJpbmdpZnkoZSxudWxsLCIJIikucmVwbGFjZSgvXG4vZywiPGJyPiIpOyQoIi5yZXNwb25zZV9ib2R5IiwkKHRoaXMuZWwpKS5odG1sKF8uZXNjYXBlKHQpKX0sc2hvd0Vycm9yU3RhdHVzOmZ1bmN0aW9uKGUsdCl7dC5zaG93U3RhdHVzKGUpfSxzaG93Q29tcGxldGVTdGF0dXM6ZnVuY3Rpb24oZSx0KXt0LnNob3dTdGF0dXMoZSl9LGZvcm1hdFhtbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxsLHUsYyxwLGgsZjtmb3IocD0vKD4pKDwpKFwvKikvZyxmPS9bIF0qKC4qKVsgXStcbi9nLHQ9Lyg8Lis+KSguK1xuKS9nLGU9ZS5yZXBsYWNlKHAsIiQxXG4kMiQzIikucmVwbGFjZShmLCIkMVxuIikucmVwbGFjZSh0LCIkMVxuJDIiKSxjPTAscj0iIixsPWUuc3BsaXQoIlxuIiksaT0wLGE9Im90aGVyIixoPXsic2luZ2xlLT5zaW5nbGUiOjAsInNpbmdsZS0+Y2xvc2luZyI6LTEsInNpbmdsZS0+b3BlbmluZyI6MCwic2luZ2xlLT5vdGhlciI6MCwiY2xvc2luZy0+c2luZ2xlIjowLCJjbG9zaW5nLT5jbG9zaW5nIjotMSwiY2xvc2luZy0+b3BlbmluZyI6MCwiY2xvc2luZy0+b3RoZXIiOjAsIm9wZW5pbmctPnNpbmdsZSI6MSwib3BlbmluZy0+Y2xvc2luZyI6MCwib3BlbmluZy0+b3BlbmluZyI6MSwib3BlbmluZy0+b3RoZXIiOjEsIm90aGVyLT5zaW5nbGUiOjAsIm90aGVyLT5jbG9zaW5nIjotMSwib3RoZXItPm9wZW5pbmciOjAsIm90aGVyLT5vdGhlciI6MH0sbj1mdW5jdGlvbihlKXt2YXIgdCxuLG8scyxsLHUsYzt1PXtzaW5nbGU6Qm9vbGVhbihlLm1hdGNoKC88LitcLz4vKSksY2xvc2luZzpCb29sZWFuKGUubWF0Y2goLzxcLy4rPi8pKSxvcGVuaW5nOkJvb2xlYW4oZS5tYXRjaCgvPFteIT9dLio+LykpfSxsPWZ1bmN0aW9uKCl7dmFyIGU7ZT1bXTtmb3IobyBpbiB1KWM9dVtvXSxjJiZlLnB1c2gobyk7cmV0dXJuIGV9KClbMF0sbD12b2lkIDA9PT1sPyJvdGhlciI6bCx0PWErIi0+IitsLGE9bCxzPSIiLGkrPWhbdF0scz1mdW5jdGlvbigpe3ZhciBlLHQscjtmb3Iocj1bXSxuPWU9MCx0PWk7dD49MD90PmU6ZT50O249dD49MD8rK2U6LS1lKXIucHVzaCgiICAiKTtyZXR1cm4gcn0oKS5qb2luKCIiKSwib3BlbmluZy0+Y2xvc2luZyI9PT10P3I9ci5zdWJzdHIoMCxyLmxlbmd0aC0xKStlKyJcbiI6cis9cytlKyJcbiJ9LG89MCxzPWwubGVuZ3RoO3M+bztvKyspdT1sW29dLG4odSk7cmV0dXJuIHJ9LHNob3dTdGF0dXM6ZnVuY3Rpb24oZSl7dmFyIHQsbjt2b2lkIDA9PT1lLmNvbnRlbnQ/KG49ZS5kYXRhLHQ9ZS51cmwpOihuPWUuY29udGVudC5kYXRhLHQ9ZS5yZXF1ZXN0LnVybCk7dmFyIHI9ZS5oZWFkZXJzLGk9bnVsbDtyJiYoaT1yWyJDb250ZW50LVR5cGUiXXx8clsiY29udGVudC10eXBlIl0saSYmKGk9aS5zcGxpdCgiOyIpWzBdLnRyaW0oKSkpLCQoIi5yZXNwb25zZV9ib2R5IiwkKHRoaXMuZWwpKS5yZW1vdmVDbGFzcygianNvbiIpLCQoIi5yZXNwb25zZV9ib2R5IiwkKHRoaXMuZWwpKS5yZW1vdmVDbGFzcygieG1sIik7dmFyIG8sYSxzPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImF1ZGlvIik7cmV0dXJuISghdC5jYW5QbGF5VHlwZXx8IXQuY2FuUGxheVR5cGUoZSkucmVwbGFjZSgvbm8vLCIiKSl9O2lmKG4paWYoImFwcGxpY2F0aW9uL2pzb24iPT09aXx8L1wranNvbiQvLnRlc3QoaSkpe3ZhciBsPW51bGw7dHJ5e2w9SlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZShuKSxudWxsLCIgICIpfWNhdGNoKHUpe2w9ImNhbid0IHBhcnNlIEpTT04uICBSYXcgcmVzdWx0OlxuXG4iK259YT0kKCI8Y29kZSAvPiIpLnRleHQobCksbz0kKCc8cHJlIGNsYXNzPSJqc29uIiAvPicpLmFwcGVuZChhKX1lbHNlIGlmKCJhcHBsaWNhdGlvbi94bWwiPT09aXx8L1wreG1sJC8udGVzdChpKSlhPSQoIjxjb2RlIC8+IikudGV4dCh0aGlzLmZvcm1hdFhtbChuKSksbz0kKCc8cHJlIGNsYXNzPSJ4bWwiIC8+JykuYXBwZW5kKGEpO2Vsc2UgaWYoInRleHQvaHRtbCI9PT1pKWE9JCgiPGNvZGUgLz4iKS5odG1sKF8uZXNjYXBlKG4pKSxvPSQoJzxwcmUgY2xhc3M9InhtbCIgLz4nKS5hcHBlbmQoYSk7ZWxzZSBpZigvXmltYWdlXC8vLnRlc3QoaSkpbz0kKCI8aW1nPiIpLmF0dHIoInNyYyIsdCk7ZWxzZSBpZigvXmF1ZGlvXC8vLnRlc3QoaSkmJnMoaSkpbz0kKCI8YXVkaW8gY29udHJvbHM+IikuYXBwZW5kKCQoIjxzb3VyY2U+IikuYXR0cigic3JjIix0KS5hdHRyKCJ0eXBlIixpKSk7ZWxzZSBpZihyWyJDb250ZW50LURpc3Bvc2l0aW9uIl0udGVzdCgvYXR0YWNobWVudC8pfHxyWyJjb250ZW50LWRpc3Bvc2l0aW9uIl0udGVzdCgvYXR0YWNobWVudC8pfHxyWyJDb250ZW50LURlc2NyaXB0aW9uIl0udGVzdCgvRmlsZSBUcmFuc2Zlci8pfHxyWyJjb250ZW50LWRlc2NyaXB0aW9uIl0udGVzdCgvRmlsZSBUcmFuc2Zlci8pKWlmKCJCbG9iImluIHdpbmRvdyl7dmFyIGM9aXx8InRleHQvaHRtbCIscD1uZXcgQmxvYihbbl0se3R5cGU6Y30pLGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLGY9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocCksZD1lLnVybC5zdWJzdHIoZS51cmwubGFzdEluZGV4T2YoIi8iKSsxKSxtPVtjLGQsZl0uam9pbigiOiIpO2guc2V0QXR0cmlidXRlKCJocmVmIixmKSxoLnNldEF0dHJpYnV0ZSgiZG93bmxvYWQiLG0pLGguaW5uZXJUZXh0PSJEb3dubG9hZCAiK2Qsbz0kKCI8ZGl2Lz4iKS5hcHBlbmQoaCl9ZWxzZSBvPSQoJzxwcmUgY2xhc3M9Impzb24iIC8+JykuYXBwZW5kKCJEb3dubG9hZCBoZWFkZXJzIGRldGVjdGVkIGJ1dCB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBkb3dubG9hZGluZyBiaW5hcnkgdmlhIFhIUiAoQmxvYikuIik7ZWxzZSByLmxvY2F0aW9ufHxyLkxvY2F0aW9uP3dpbmRvdy5sb2NhdGlvbj1lLnVybDooYT0kKCI8Y29kZSAvPiIpLnRleHQobiksbz0kKCc8cHJlIGNsYXNzPSJqc29uIiAvPicpLmFwcGVuZChhKSk7ZWxzZSBhPSQoIjxjb2RlIC8+IikudGV4dCgibm8gY29udGVudCIpLG89JCgnPHByZSBjbGFzcz0ianNvbiIgLz4nKS5hcHBlbmQoYSk7dmFyIGc9bzskKCIucmVxdWVzdF91cmwiLCQodGhpcy5lbCkpLmh0bWwoIjxwcmU+PC9wcmU+IiksJCgiLnJlcXVlc3RfdXJsIHByZSIsJCh0aGlzLmVsKSkudGV4dCh0KSwkKCIucmVzcG9uc2VfY29kZSIsJCh0aGlzLmVsKSkuaHRtbCgiPHByZT4iK2Uuc3RhdHVzKyI8L3ByZT4iKSwkKCIucmVzcG9uc2VfYm9keSIsJCh0aGlzLmVsKSkuaHRtbChnKSwkKCIucmVzcG9uc2VfaGVhZGVycyIsJCh0aGlzLmVsKSkuaHRtbCgiPHByZT4iK18uZXNjYXBlKEpTT04uc3RyaW5naWZ5KGUuaGVhZGVycyxudWxsLCIgICIpKS5yZXBsYWNlKC9cbi9nLCI8YnI+IikrIjwvcHJlPiIpLCQoIi5yZXNwb25zZSIsJCh0aGlzLmVsKSkuc2xpZGVEb3duKCksJCgiLnJlc3BvbnNlX2hpZGVyIiwkKHRoaXMuZWwpKS5zaG93KCksJCgiLnJlc3BvbnNlX3Rocm9iYmVyIiwkKHRoaXMuZWwpKS5oaWRlKCk7dmFyIHk9JCgiLnJlc3BvbnNlX2JvZHkiLCQodGhpcy5lbCkpWzBdLHY9dGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zO3JldHVybiB2LmhpZ2hsaWdodFNpemVUaHJlc2hvbGQmJmUuZGF0YS5sZW5ndGg+di5oaWdobGlnaHRTaXplVGhyZXNob2xkP3k6aGxqcy5oaWdobGlnaHRCbG9jayh5KX0sdG9nZ2xlT3BlcmF0aW9uQ29udGVudDpmdW5jdGlvbigpe3ZhciBlPSQoIiMiK0RvY3MuZXNjYXBlUmVzb3VyY2VOYW1lKHRoaXMucGFyZW50SWQrIl8iK3RoaXMubmlja25hbWUrIl9jb250ZW50IikpO2UuaXMoIjp2aXNpYmxlIik/RG9jcy5jb2xsYXBzZU9wZXJhdGlvbihlKTpEb2NzLmV4cGFuZE9wZXJhdGlvbihlKX19KSxTd2FnZ2VyVWkuVmlld3MuUGFyYW1ldGVyQ29udGVudFR5cGVWaWV3PUJhY2tib25lLlZpZXcuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4gJCh0aGlzLmVsKS5odG1sKEhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtZXRlcl9jb250ZW50X3R5cGUodGhpcy5tb2RlbCkpLCQoImxhYmVsW2Zvcj1wYXJhbWV0ZXJDb250ZW50VHlwZV0iLCQodGhpcy5lbCkpLnRleHQoIlBhcmFtZXRlciBjb250ZW50IHR5cGU6IiksdGhpc319KSxTd2FnZ2VyVWkuVmlld3MuUGFyYW1ldGVyVmlldz1CYWNrYm9uZS5WaWV3LmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbigpe0hhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImlzQXJyYXkiLGZ1bmN0aW9uKGUsdCl7ImFycmF5Ij09PWUudHlwZS50b0xvd2VyQ2FzZSgpfHxlLmFsbG93TXVsdGlwbGU/dC5mbih0aGlzKTp0LmludmVyc2UodGhpcyl9KX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tb2RlbC50eXBlfHx0aGlzLm1vZGVsLmRhdGFUeXBlO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZSl7dmFyIHQ9dGhpcy5tb2RlbC5zY2hlbWE7aWYodCYmdC4kcmVmKXt2YXIgbj10LiRyZWY7ZT0wPT09bi5pbmRleE9mKCIjL2RlZmluaXRpb25zLyIpP24uc3Vic3RyaW5nKCIjL2RlZmluaXRpb25zLyIubGVuZ3RoKTpufX10aGlzLm1vZGVsLnR5cGU9ZSx0aGlzLm1vZGVsLnBhcmFtVHlwZT10aGlzLm1vZGVsWyJpbiJdfHx0aGlzLm1vZGVsLnBhcmFtVHlwZSx0aGlzLm1vZGVsLmlzQm9keT0iYm9keSI9PT10aGlzLm1vZGVsLnBhcmFtVHlwZXx8ImJvZHkiPT09dGhpcy5tb2RlbFsiaW4iXSx0aGlzLm1vZGVsLmlzRmlsZT1lJiYiZmlsZSI9PT1lLnRvTG93ZXJDYXNlKCksdGhpcy5tb2RlbFsiZGVmYXVsdCJdPXRoaXMubW9kZWxbImRlZmF1bHQiXXx8dGhpcy5tb2RlbC5kZWZhdWx0VmFsdWUsdGhpcy5tb2RlbC5hbGxvd2FibGVWYWx1ZXMmJih0aGlzLm1vZGVsLmlzTGlzdD0hMCk7dmFyIHI9dGhpcy50ZW1wbGF0ZSgpOyQodGhpcy5lbCkuaHRtbChyKHRoaXMubW9kZWwpKTt2YXIgaT17c2FtcGxlSlNPTjp0aGlzLm1vZGVsLnNhbXBsZUpTT04saXNQYXJhbTohMCxzaWduYXR1cmU6dGhpcy5tb2RlbC5zaWduYXR1cmV9O2lmKHRoaXMubW9kZWwuc2FtcGxlSlNPTil7dmFyIG89bmV3IFN3YWdnZXJVaS5WaWV3cy5TaWduYXR1cmVWaWV3KHttb2RlbDppLHRhZ05hbWU6ImRpdiJ9KTskKCIubW9kZWwtc2lnbmF0dXJlIiwkKHRoaXMuZWwpKS5hcHBlbmQoby5yZW5kZXIoKS5lbCl9ZWxzZSAkKCIubW9kZWwtc2lnbmF0dXJlIiwkKHRoaXMuZWwpKS5odG1sKHRoaXMubW9kZWwuc2lnbmF0dXJlKTt2YXIgYT0hMTt0aGlzLm1vZGVsLmlzQm9keSYmKGE9ITApO3ZhciBzPXtpc1BhcmFtOmF9O2lmKHMuY29uc3VtZXM9dGhpcy5tb2RlbC5jb25zdW1lcyxhKXt2YXIgbD1uZXcgU3dhZ2dlclVpLlZpZXdzLlBhcmFtZXRlckNvbnRlbnRUeXBlVmlldyh7bW9kZWw6c30pOyQoIi5wYXJhbWV0ZXItY29udGVudC10eXBlIiwkKHRoaXMuZWwpKS5hcHBlbmQobC5yZW5kZXIoKS5lbCl9ZWxzZXt2YXIgdT1uZXcgU3dhZ2dlclVpLlZpZXdzLlJlc3BvbnNlQ29udGVudFR5cGVWaWV3KHttb2RlbDpzfSk7JCgiLnJlc3BvbnNlLWNvbnRlbnQtdHlwZSIsJCh0aGlzLmVsKSkuYXBwZW5kKHUucmVuZGVyKCkuZWwpfXJldHVybiB0aGlzfSx0ZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZGVsLmlzTGlzdD9IYW5kbGViYXJzLnRlbXBsYXRlcy5wYXJhbV9saXN0OnRoaXMub3B0aW9ucy5yZWFkT25seT90aGlzLm1vZGVsLnJlcXVpcmVkP0hhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtX3JlYWRvbmx5X3JlcXVpcmVkOkhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtX3JlYWRvbmx5OnRoaXMubW9kZWwucmVxdWlyZWQ/SGFuZGxlYmFycy50ZW1wbGF0ZXMucGFyYW1fcmVxdWlyZWQ6SGFuZGxlYmFycy50ZW1wbGF0ZXMucGFyYW19fSksU3dhZ2dlclVpLlZpZXdzLlJlc291cmNlVmlldz1CYWNrYm9uZS5WaWV3LmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbihlKXtlPWV8fHt9LHRoaXMucm91dGVyPWUucm91dGVyLHRoaXMuYXV0aHM9ZS5hdXRocywiIj09PXRoaXMubW9kZWwuZGVzY3JpcHRpb24mJih0aGlzLm1vZGVsLmRlc2NyaXB0aW9uPW51bGwpLHRoaXMubW9kZWwuZGVzY3JpcHRpb24mJih0aGlzLm1vZGVsLnN1bW1hcnk9dGhpcy5tb2RlbC5kZXNjcmlwdGlvbil9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXt9OyQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5yZXNvdXJjZSh0aGlzLm1vZGVsKSk7Zm9yKHZhciB0PTA7dDx0aGlzLm1vZGVsLm9wZXJhdGlvbnNBcnJheS5sZW5ndGg7dCsrKXtmb3IodmFyIG49dGhpcy5tb2RlbC5vcGVyYXRpb25zQXJyYXlbdF0scj0wLGk9bi5uaWNrbmFtZTsidW5kZWZpbmVkIiE9dHlwZW9mIGVbaV07KWk9aSsiXyIrcixyKz0xO2VbaV09bixuLm5pY2tuYW1lPWksbi5wYXJlbnRJZD10aGlzLm1vZGVsLmlkLHRoaXMuYWRkT3BlcmF0aW9uKG4pfXJldHVybiAkKCIudG9nZ2xlRW5kcG9pbnRMaXN0Iix0aGlzLmVsKS5jbGljayh0aGlzLmNhbGxEb2NzLmJpbmQodGhpcywidG9nZ2xlRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UiKSksJCgiLmNvbGxhcHNlUmVzb3VyY2UiLHRoaXMuZWwpLmNsaWNrKHRoaXMuY2FsbERvY3MuYmluZCh0aGlzLCJjb2xsYXBzZU9wZXJhdGlvbnNGb3JSZXNvdXJjZSIpKSwkKCIuZXhwYW5kUmVzb3VyY2UiLHRoaXMuZWwpLmNsaWNrKHRoaXMuY2FsbERvY3MuYmluZCh0aGlzLCJleHBhbmRPcGVyYXRpb25zRm9yUmVzb3VyY2UiKSksdGhpc30sYWRkT3BlcmF0aW9uOmZ1bmN0aW9uKGUpe2UubnVtYmVyPXRoaXMubnVtYmVyO3ZhciB0PW5ldyBTd2FnZ2VyVWkuVmlld3MuT3BlcmF0aW9uVmlldyh7bW9kZWw6ZSxyb3V0ZXI6dGhpcy5yb3V0ZXIsdGFnTmFtZToibGkiLGNsYXNzTmFtZToiZW5kcG9pbnQiLHN3YWdnZXJPcHRpb25zOnRoaXMub3B0aW9ucy5zd2FnZ2VyT3B0aW9ucyxhdXRoczp0aGlzLmF1dGhzfSk7JCgiLmVuZHBvaW50cyIsJCh0aGlzLmVsKSkuYXBwZW5kKHQucmVuZGVyKCkuZWwpLHRoaXMubnVtYmVyKyt9LGNhbGxEb2NzOmZ1bmN0aW9uKGUsdCl7dC5wcmV2ZW50RGVmYXVsdCgpLERvY3NbZV0odC5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS1pZCIpKX19KSxTd2FnZ2VyVWkuVmlld3MuUmVzcG9uc2VDb250ZW50VHlwZVZpZXc9QmFja2JvbmUuVmlldy5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHJlbmRlcjpmdW5jdGlvbigpe3JldHVybiAkKHRoaXMuZWwpLmh0bWwoSGFuZGxlYmFycy50ZW1wbGF0ZXMucmVzcG9uc2VfY29udGVudF90eXBlKHRoaXMubW9kZWwpKSwkKCJsYWJlbFtmb3I9cmVzcG9uc2VDb250ZW50VHlwZV0iLCQodGhpcy5lbCkpLnRleHQoIlJlc3BvbnNlIENvbnRlbnQgVHlwZSIpLHRoaXN9fSksU3dhZ2dlclVpLlZpZXdzLlNpZ25hdHVyZVZpZXc9QmFja2JvbmUuVmlldy5leHRlbmQoe2V2ZW50czp7ImNsaWNrIGEuZGVzY3JpcHRpb24tbGluayI6InN3aXRjaFRvRGVzY3JpcHRpb24iLCJjbGljayBhLnNuaXBwZXQtbGluayI6InN3aXRjaFRvU25pcHBldCIsIm1vdXNlZG93biAuc25pcHBldCI6InNuaXBwZXRUb1RleHRBcmVhIn0saW5pdGlhbGl6ZTpmdW5jdGlvbigpe30scmVuZGVyOmZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5zaWduYXR1cmUodGhpcy5tb2RlbCkpLHRoaXMuc3dpdGNoVG9TbmlwcGV0KCksdGhpcy5pc1BhcmFtPXRoaXMubW9kZWwuaXNQYXJhbSx0aGlzLmlzUGFyYW0mJiQoIi5ub3RpY2UiLCQodGhpcy5lbCkpLnRleHQoIkNsaWNrIHRvIHNldCBhcyBwYXJhbWV0ZXIgdmFsdWUiKSx0aGlzfSxzd2l0Y2hUb0Rlc2NyaXB0aW9uOmZ1bmN0aW9uKGUpe2UmJmUucHJldmVudERlZmF1bHQoKSwkKCIuc25pcHBldCIsJCh0aGlzLmVsKSkuaGlkZSgpLCQoIi5kZXNjcmlwdGlvbiIsJCh0aGlzLmVsKSkuc2hvdygpLCQoIi5kZXNjcmlwdGlvbi1saW5rIiwkKHRoaXMuZWwpKS5hZGRDbGFzcygic2VsZWN0ZWQiKSwkKCIuc25pcHBldC1saW5rIiwkKHRoaXMuZWwpKS5yZW1vdmVDbGFzcygic2VsZWN0ZWQiKX0sc3dpdGNoVG9TbmlwcGV0OmZ1bmN0aW9uKGUpe2UmJmUucHJldmVudERlZmF1bHQoKSwkKCIuZGVzY3JpcHRpb24iLCQodGhpcy5lbCkpLmhpZGUoKSwkKCIuc25pcHBldCIsJCh0aGlzLmVsKSkuc2hvdygpLCQoIi5zbmlwcGV0LWxpbmsiLCQodGhpcy5lbCkpLmFkZENsYXNzKCJzZWxlY3RlZCIpLCQoIi5kZXNjcmlwdGlvbi1saW5rIiwkKHRoaXMuZWwpKS5yZW1vdmVDbGFzcygic2VsZWN0ZWQiKX0sc25pcHBldFRvVGV4dEFyZWE6ZnVuY3Rpb24oZSl7aWYodGhpcy5pc1BhcmFtKXtlJiZlLnByZXZlbnREZWZhdWx0KCk7dmFyIHQ9JCgidGV4dGFyZWEiLCQodGhpcy5lbC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSkpOyIiPT09JC50cmltKHQudmFsKCkpJiZ0LnZhbCh0aGlzLm1vZGVsLnNhbXBsZUpTT04pfX19KSxTd2FnZ2VyVWkuVmlld3MuU3RhdHVzQ29kZVZpZXc9QmFja2JvbmUuVmlldy5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zPWV8fHt9LHRoaXMucm91dGVyPXRoaXMub3B0aW9ucy5yb3V0ZXJ9LHJlbmRlcjpmdW5jdGlvbigpe2lmKCQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5zdGF0dXNfY29kZSh0aGlzLm1vZGVsKSksdGhpcy5yb3V0ZXIuYXBpLm1vZGVscy5oYXNPd25Qcm9wZXJ0eSh0aGlzLm1vZGVsLnJlc3BvbnNlTW9kZWwpKXt2YXIgZT17c2FtcGxlSlNPTjpKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlci5hcGkubW9kZWxzW3RoaXMubW9kZWwucmVzcG9uc2VNb2RlbF0uY3JlYXRlSlNPTlNhbXBsZSgpLG51bGwsMiksaXNQYXJhbTohMSxzaWduYXR1cmU6dGhpcy5yb3V0ZXIuYXBpLm1vZGVsc1t0aGlzLm1vZGVsLnJlc3BvbnNlTW9kZWxdLmdldE1vY2tTaWduYXR1cmUoKX0sdD1uZXcgU3dhZ2dlclVpLlZpZXdzLlNpZ25hdHVyZVZpZXcoe21vZGVsOmUsdGFnTmFtZToiZGl2In0pOyQoIi5tb2RlbC1zaWduYXR1cmUiLHRoaXMuJGVsKS5hcHBlbmQodC5yZW5kZXIoKS5lbCl9ZWxzZSAkKCIubW9kZWwtc2lnbmF0dXJlIix0aGlzLiRlbCkuaHRtbCgiIik7cmV0dXJuIHRoaXN9fSl9KS5jYWxsKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDAxMzBmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0ltcGxlbWVudGF0aW9uLVRpdGxlOiBjYXRhbG9nLWJlCitJbXBsZW1lbnRhdGlvbi1WZXJzaW9uOiBBUFBMSUNBVElPTl9WRVJTSU9OCitJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQ6IG9yZy5vcGVuZWNvbXAuc2RjCitCdWlsdC1CeTogZXNvZmVyCitCdWlsZC1KZGs6IDEuNy4wXzQ1CitDcmVhdGVkLUJ5OiBBcGFjaGUgTWF2ZW4gMy4yLjEKK0FyY2hpdmVyLVZlcnNpb246IFBsZXh1cyBBcmNoaXZlcgorCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyODdiYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktd2ViLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIENvbmZpZ3VyZSBQVUJMSUMgCisgICAgIi0vL01vcnQgQmF5IENvbnN1bHRpbmcvL0RURCBDb25maWd1cmUvL0VOIiAKKyAgICAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZXR0eS9jb25maWd1cmVfOV8wLmR0ZCI+CisgCis8Q29uZmlndXJlIGNsYXNzPSJvcmcuZWNsaXBzZS5qZXR0eS53ZWJhcHAuV2ViQXBwQ29udGV4dCI+CisgICAgIDxTZXQgbmFtZT0iY29udGV4dFBhdGgiPi88L1NldD4KKzwvQ29uZmlndXJlPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvY2F0YWxvZy1iZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNGE1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwxMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisJdmVyc2lvbj0iMy4wIj4KKwkKKwk8c2VydmxldD4KKwkJPHNlcnZsZXQtbmFtZT5qZXJzZXk8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorCQkJPHBhcmFtLXZhbHVlPmNvbS53b3JkbmlrLnN3YWdnZXIuamF4cnMuanNvbiwgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM8L3BhcmFtLXZhbHVlPgorCQk8L2luaXQtcGFyYW0+CisJCTxpbml0LXBhcmFtPgorCQkJPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKwkJCTxwYXJhbS12YWx1ZT5jb20ud29yZG5pay5zd2FnZ2VyLmplcnNleS5saXN0aW5nLkFwaUxpc3RpbmdSZXNvdXJjZUpTT047b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmUsb3JnLm9wZW5lY29tcC5zZGMuYmUuZmlsdGVycy5CZVNlcnZsZXRGaWx0ZXIsIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmZpbHRlcnMuQ29tcG9uZW50c0F2YWlsYWJpbGl0eUZpbHRlcjwvcGFyYW0tdmFsdWU+CisJCQk8IS0tIDxwYXJhbS12YWx1ZT5jb20ud29yZG5pay5zd2FnZ2VyLmplcnNleS5saXN0aW5nLkFwaUxpc3RpbmdSZXNvdXJjZUpTT047b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmUsb3JnLm9wZW5lY29tcC5zZGMuYmUuZmlsdGVycy5CZVNlcnZsZXRGaWx0ZXI8L3BhcmFtLXZhbHVlPiAtLT4KKwkJPC9pbml0LXBhcmFtPgorCisJCTxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorCTwvc2VydmxldD4KKworCQorCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+amVyc2V5PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vc2RjMi9yZXN0Lyo8L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorCQorCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPkVzR2F0ZXdheTwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5iZS5tb25pdG9yaW5nLkVzR2F0ZXdheTwvc2VydmxldC1jbGFzcz4KKwkJPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+RXNHYXRld2F5PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vc2RjMi9lc0dhdGV3YXkvKjwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisJCisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+amVyc2V5RGlzdHJpYnV0aW9uPC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKwkJPGluaXQtcGFyYW0+CisJCQk8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKwkJCTxwYXJhbS12YWx1ZT5vcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uc2VydmxldCwgb3JnLm9wZW5lY29tcC5zZGMuYmUuZXh0ZXJuYWxhcGkuc2VydmxldDwvcGFyYW0tdmFsdWU+CisJCTwvaW5pdC1wYXJhbT4KKwkJPGluaXQtcGFyYW0+CisJCQk8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorPCEtLSAJCQk8cGFyYW0tdmFsdWU+Y29tLndvcmRuaWsuc3dhZ2dlci5qZXJzZXkubGlzdGluZy5BcGlMaXN0aW5nUmVzb3VyY2VKU09OO29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlLG9yZy5vcGVuZWNvbXAuc2RjLmJlLmZpbHRlcnMuQmVTZXJ2bGV0RmlsdGVyLG9yZy5vcGVuZWNvbXAuc2RjLmJlLmZpbHRlcnMuQmFzaWNBdXRoZW50aWNhdGlvbkZpbHRlciwgb3JnLm9wZW5lY29tcC5zZGMuYmUuZmlsdGVycy5Db21wb25lbnRzQXZhaWxhYmlsaXR5RmlsdGVyPC9wYXJhbS12YWx1ZT4gLS0+CisJCQkKKwkJCTwhLS0gQ2xvc2VkIHRpbGwgdGhlIGZlYXR1cmUgZG9uZSBhbmQgYmFzaWMgYXV0aGVudGljYXRpb24gZGVmaW5lZCB3aXRoIE0gTGFuZG8gLS0+CisJCQk8cGFyYW0tdmFsdWU+Y29tLndvcmRuaWsuc3dhZ2dlci5qZXJzZXkubGlzdGluZy5BcGlMaXN0aW5nUmVzb3VyY2VKU09OO29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlLG9yZy5vcGVuZWNvbXAuc2RjLmJlLmZpbHRlcnMuQmVTZXJ2bGV0RmlsdGVyLG9yZy5vcGVuZWNvbXAuc2RjLmJlLmZpbHRlcnMuQmFzaWNBdXRoZW50aWNhdGlvbkZpbHRlcjwvcGFyYW0tdmFsdWU+CisJCTwvaW5pdC1wYXJhbT4KKworCQk8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKwkJPGFzeW5jLXN1cHBvcnRlZD50cnVlPC9hc3luYy1zdXBwb3J0ZWQ+CisJPC9zZXJ2bGV0PgorCQorCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+amVyc2V5RGlzdHJpYnV0aW9uPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vYXNkYy8qPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPkplcnNleTJDb25maWc8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+Y29tLndvcmRuaWsuc3dhZ2dlci5qZXJzZXkuY29uZmlnLkplcnNleUpheHJzQ29uZmlnPC9zZXJ2bGV0LWNsYXNzPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPmFwaS52ZXJzaW9uPC9wYXJhbS1uYW1lPgorCQkJPHBhcmFtLXZhbHVlPjEuMC4wPC9wYXJhbS12YWx1ZT4KKwkJPC9pbml0LXBhcmFtPiAKKwkJCisJCTxpbml0LXBhcmFtPgorCQkJPHBhcmFtLW5hbWU+c3dhZ2dlci5hcGkuYmFzZXBhdGg8L3BhcmFtLW5hbWU+CisJCQk8cGFyYW0tdmFsdWU+aHR0cDovL2JlaG9zdDo4MDgwL3NkYzIvcmVzdDwvcGFyYW0tdmFsdWU+CisJCTwvaW5pdC1wYXJhbT4KKwkJCisJCTxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKwk8L3NlcnZsZXQ+CisJCisJPCEtLSBFQ09NUCBQb3J0YWwgLS0+CQorCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlZpZXdTdGF0dXNNZXNzYWdlczwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5jaC5xb3MubG9nYmFjay5jbGFzc2ljLlZpZXdTdGF0dXNNZXNzYWdlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+Vmlld1N0YXR1c01lc3NhZ2VzPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vbGJDbGFzc2ljU3RhdHVzPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxmaWx0ZXI+CisJICAgPGZpbHRlci1uYW1lPkd6aXBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorCSAgIDxmaWx0ZXItY2xhc3M+b3JnLmVjbGlwc2UuamV0dHkuc2VydmxldHMuR3ppcEZpbHRlcjwvZmlsdGVyLWNsYXNzPgorCSAgIDxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCSAgIDxpbml0LXBhcmFtPgorCQk8cGFyYW0tbmFtZT5tZXRob2RzPC9wYXJhbS1uYW1lPgorCQk8cGFyYW0tdmFsdWU+R0VULFBPU1Q8L3BhcmFtLXZhbHVlPgorCSAgIDwvaW5pdC1wYXJhbT4KKwkgICA8aW5pdC1wYXJhbT4KKwkgICAgICA8cGFyYW0tbmFtZT5taW1lVHlwZXM8L3BhcmFtLW5hbWU+CisJICAgICAgPHBhcmFtLXZhbHVlPnRleHQvaHRtbCx0ZXh0L3BsYWluLHRleHQvY3NzLGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsYXBwbGljYXRpb24vanNvbjwvcGFyYW0tdmFsdWU+CisJICAgPC9pbml0LXBhcmFtPgorCTwvZmlsdGVyPgorCTxmaWx0ZXItbWFwcGluZz4KKwkgICA8ZmlsdGVyLW5hbWU+R3ppcEZpbHRlcjwvZmlsdGVyLW5hbWU+CisJCTx1cmwtcGF0dGVybj4vc2RjMi9yZXN0Lyo8L3VybC1wYXR0ZXJuPgorCTwvZmlsdGVyLW1hcHBpbmc+CisKKworCTxjb250ZXh0LXBhcmFtPgorCQk8cGFyYW0tbmFtZT5jb250ZXh0Q29uZmlnTG9jYXRpb248L3BhcmFtLW5hbWU+CisJCTxwYXJhbS12YWx1ZT5jbGFzc3BhdGg6YXBwbGljYXRpb24tY29udGV4dC54bWw8L3BhcmFtLXZhbHVlPgorCTwvY29udGV4dC1wYXJhbT4KKworCTxsaXN0ZW5lcj4KKwkJPGxpc3RlbmVyLWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmJlLmxpc3Rlbi5CRUFwcENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+CisJPC9saXN0ZW5lcj4KKworCTxsaXN0ZW5lcj4KKwkJPGxpc3RlbmVyLWNsYXNzPm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlckxpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KKwk8L2xpc3RlbmVyPgorCisKKworCisJPHdlbGNvbWUtZmlsZS1saXN0PgorCQk8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KKwk8L3dlbGNvbWUtZmlsZS1saXN0PgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2NhdGFsb2ctYmUvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNjk4NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKQEAgLTAsMCArMSw3IEBACis8aHRtbD4KKworPGJvZHk+CisgCTxoMT5IZWxsbyBDYXRhbG9nIFNlcnZlcjwvaDE+Cis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9jYXRhbG9nLWJlL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4MTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApAQCAtMCwwICsxLDUgQEAKKzxodG1sPgorPGJvZHk+Cis8aDI+SGVsbG8gV29ybGQhPC9oMj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9BdWRpdGluZ01vY2tNYW5hZ2VyLmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvQXVkaXRpbmdNb2NrTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmYwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvQXVkaXRpbmdNb2NrTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYzsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuYXBpLklBdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEF1ZGl0aW5nTW9ja01hbmFnZXIgaW1wbGVtZW50cyBJQXVkaXRpbmdNYW5hZ2VyIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBdWRpdGluZ01vY2tNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgQXVkaXRpbmdNb2NrTWFuYWdlcihTdHJpbmcgc3RyaW5nKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGF1ZGl0RXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCUF1ZGl0aW5nQWN0aW9uRW51bSBhY3Rpb25FbnVtID0gQXVkaXRpbmdBY3Rpb25FbnVtLmdldEFjdGlvbkJ5TmFtZSgoU3RyaW5nKSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04pKTsKKwkJbG9nLmRlYnVnKCJjYWxsIHdhcyBtYWRlIHRvIGF1ZGl0RXZlbnQgd2l0aCBldmVudCB0eXBlIHt9IiwgYWN0aW9uRW51bS5nZXROYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9FbGVtZW50T3BlcmF0aW9uTW9jay5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL0VsZW1lbnRPcGVyYXRpb25Nb2NrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiNjA1NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9FbGVtZW50T3BlcmF0aW9uTW9jay5qYXZhCkBAIC0wLDAgKzEsMjY2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3RUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhdGVnb3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5U2NvcGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVGFnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5Hcm91cGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklFbGVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2F0ZWdvcnlEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBFbGVtZW50T3BlcmF0aW9uTW9jayBpbXBsZW1lbnRzIElFbGVtZW50T3BlcmF0aW9uIHsKKworCUNhdGVnb3J5RGVmaW5pdGlvbiByZXNvdXJjZUNhdGVnb3J5OworCUNhdGVnb3J5RGVmaW5pdGlvbiBzZXJ2aWNlQ2F0ZWdvcnk7CisJQ2F0ZWdvcnlEZWZpbml0aW9uIHByb2R1Y3RDYXRlZ29yeTsKKworCUNhdGVnb3J5IG9sZFNlcnZpY2U7CisKKwlwdWJsaWMgRWxlbWVudE9wZXJhdGlvbk1vY2soKSB7CisJCXJlc291cmNlQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXJlc291cmNlQ2F0ZWdvcnkuc2V0TmFtZSgiTmV0d29yayBMYXllciAyLTMiKTsKKwkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJc3ViQ2F0ZWdvcnlEZWZpbml0aW9uLnNldE5hbWUoIlJvdXRlciIpOworCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEZWZpbml0aW9uMSA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJc3ViQ2F0ZWdvcnlEZWZpbml0aW9uMS5zZXROYW1lKCJHYXRld2F5Iik7CisKKwkJcmVzb3VyY2VDYXRlZ29yeS5hZGRTdWJDYXRlZ29yeShzdWJDYXRlZ29yeURlZmluaXRpb24pOworCQlyZXNvdXJjZUNhdGVnb3J5LmFkZFN1YkNhdGVnb3J5KHN1YkNhdGVnb3J5RGVmaW5pdGlvbjEpOworCisJCXNlcnZpY2VDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJc2VydmljZUNhdGVnb3J5LnNldE5hbWUoIk1vYmlsaXR5Iik7CisJCW9sZFNlcnZpY2UgPSBuZXcgQ2F0ZWdvcnkoKTsKKwkJb2xkU2VydmljZS5zZXROYW1lKCJNb2JpbGl0eSIpOworCisJCXByb2R1Y3RDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJcHJvZHVjdENhdGVnb3J5LnNldE5hbWUoIk5ldHdvcmsgTGF5ZXIgMi0zMSIpOworCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEZWZpbml0aW9uMTEgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXN1YkNhdGVnb3J5RGVmaW5pdGlvbjExLnNldE5hbWUoIlJvdXRlcjEiKTsKKwkJR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwID0gbmV3IEdyb3VwaW5nRGVmaW5pdGlvbigpOworCQlncm91cC5zZXROYW1lKCJncm91cDEiKTsKKwkJc3ViQ2F0ZWdvcnlEZWZpbml0aW9uMTEuYWRkR3JvdXBpbmcoZ3JvdXApOworCQlwcm9kdWN0Q2F0ZWdvcnkuYWRkU3ViQ2F0ZWdvcnkoc3ViQ2F0ZWdvcnlEZWZpbml0aW9uMTEpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsUmVzb3VyY2VDYXRlZ29yaWVzKCkgeworCisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxDYXRlZ29yeURlZmluaXRpb24+KCk7CisJCWNhdGVnb3JpZXMuYWRkKHJlc291cmNlQ2F0ZWdvcnkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2F0ZWdvcmllcyk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxTZXJ2aWNlQ2F0ZWdvcmllcygpIHsKKworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPigpOworCQljYXRlZ29yaWVzLmFkZChzZXJ2aWNlQ2F0ZWdvcnkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2F0ZWdvcmllcyk7CisKKwl9CisKKwkvKgorCSAqIEBPdmVycmlkZSBwdWJsaWMgRWl0aGVyPENhdGVnb3J5LCBBY3Rpb25TdGF0dXM+IGdldENhdGVnb3J5KFN0cmluZyBuYW1lKSB7IGlmIChuYW1lLmVxdWFscyhyZXNvdXJjZUNhdGVnb3J5LmdldE5hbWUoKSkpeyByZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VDYXRlZ29yeSk7IH0gZWxzZSB7IHJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkNBVEVHT1JZX05PVF9GT1VORCk7IH0gfQorCSAqLworCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFRhZz4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsVGFncygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UHJvcGVydHlTY29wZT4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsUHJvcGVydHlTY29wZXMoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PEFydGlmYWN0VHlwZT4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsQXJ0aWZhY3RUeXBlcygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIE9iamVjdD4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsRGVwbG95bWVudEFydGlmYWN0VHlwZXMoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXRlZ29yeURhdGEoU3RyaW5nIG5hbWUsIE5vZGVUeXBlRW51bSB0eXBlLCBDbGFzczxUPiBjbGF6eikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8SW50ZWdlciwgQWN0aW9uU3RhdHVzPiBnZXREZWZhdWx0SGVhdFRpbWVvdXQoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlQ2F0ZWdvcnkoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5LCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBkZWxldGVDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjYXRlZ29yeUlkKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBBY3Rpb25TdGF0dXM+IGlzQ2F0ZWdvcnlVbmlxdWVGb3JUeXBlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIG5vcm1hbGl6ZWROYW1lKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlU3ViQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5SWQsIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeSwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsQ2F0ZWdvcmllcyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxDYXRlZ29yeURlZmluaXRpb24+KCk7CisJCXN3aXRjaCAobm9kZVR5cGUpIHsKKwkJY2FzZSBSZXNvdXJjZU5ld0NhdGVnb3J5OgorCQkJY2F0ZWdvcmllcy5hZGQocmVzb3VyY2VDYXRlZ29yeSk7CisJCQlicmVhazsKKwkJY2FzZSBQcm9kdWN0Q2F0ZWdvcnk6CisJCQljYXRlZ29yaWVzLmFkZChwcm9kdWN0Q2F0ZWdvcnkpOworCQkJYnJlYWs7CisJCWNhc2UgU2VydmljZU5ld0NhdGVnb3J5OgorCQkJY2F0ZWdvcmllcy5hZGQoc2VydmljZUNhdGVnb3J5KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhdGVnb3JpZXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGdldENhdGVnb3J5KE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNhdGVnb3J5SWQpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBnZXRTdWJDYXRlZ29yeVVuaXF1ZUZvclR5cGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgbm9ybWFsaXplZE5hbWUpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIEFjdGlvblN0YXR1cz4gaXNTdWJDYXRlZ29yeVVuaXF1ZUZvckNhdGVnb3J5KE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHN1YkNhdGVnb3J5Tm9ybU5hbWUsIFN0cmluZyBwYXJlbnRDYXRlZ29yeUlkKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gZGVsZXRlU3ViQ2F0ZWdvcnkoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgc3ViQ2F0ZWdvcnlJZCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNyZWF0ZUdyb3VwaW5nKFN0cmluZyBzdWJDYXRlZ29yeUlkLCBHcm91cGluZ0RlZmluaXRpb24gZ3JvdXBpbmcsIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGRlbGV0ZUdyb3VwaW5nKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGdyb3VwaW5nSWQpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBnZXRTdWJDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBzdWJDYXRlZ29yeUlkKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBBY3Rpb25TdGF0dXM+IGlzR3JvdXBpbmdVbmlxdWVGb3JTdWJDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBncm91cGluZ05vcm1OYW1lLCBTdHJpbmcgcGFyZW50U3ViQ2F0ZWdvcnlJZCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGdldEdyb3VwaW5nVW5pcXVlRm9yVHlwZShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBncm91cGluZ05vcm1hbGl6ZWROYW1lKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBBY3Rpb25TdGF0dXM+IGdldFJlc291cmNlVHlwZXNNYXAoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8b3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuQ2F0ZWdvcnlEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXROZXdDYXRlZ29yeURhdGEoU3RyaW5nIG5hbWUsIE5vZGVUeXBlRW51bSB0eXBlLCBDbGFzczxUPiBjbGF6eikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGdldEFsbFByb2R1Y3RDYXRlZ29yaWVzKCkgeworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPigpOworCQljYXRlZ29yaWVzLmFkZChwcm9kdWN0Q2F0ZWdvcnkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2F0ZWdvcmllcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlQ2F0ZWdvcnkoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5LCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNyZWF0ZVN1YkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeUlkLCBTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnksIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvRXJyb3JDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL0Vycm9yQ29uZmlndXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjg2YjljCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL0Vycm9yQ29uZmlndXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRXJyb3JDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5FcnJvckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5CYXNpY0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuRmlsZUNoYW5nZUNhbGxiYWNrOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEVycm9yQ29uZmlndXJhdGlvblRlc3QgeworCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG51bGw7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEVycm9yQ29uZmlndXJhdGlvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1iZSIpOworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0Q29uZmlnRGlyKCJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnIik7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5saXN0ZW5Gb3JDaGFuZ2VzKCk7CisKKwkJY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksIEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDb25maWdEaXIoKSArIEZpbGUuc2VwYXJhdG9yICsgRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldEFwcE5hbWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWFkQ29uZmlndXJhdGlvbkZpbGUoKSB7CisKKwkJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lciA9IG5ldyBDb25maWd1cmF0aW9uTGlzdGVuZXIoRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzLCBuZXcgRmlsZUNoYW5nZUNhbGxiYWNrKCkgeworCisJCQlwdWJsaWMgdm9pZCByZWNvbmZpZ3VyZShCYXNpY0NvbmZpZ3VyYXRpb24gb2JqKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCWxvZy5kZWJ1ZygiSW4gcmVjb25maWd1cmUgb2Yge30iLCBvYmopOworCQkJfQorCisJCX0pOworCisJCUVycm9yQ29uZmlndXJhdGlvbiB0ZXN0Q29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25Tb3VyY2UuZ2V0QW5kV2F0Y2hDb25maWd1cmF0aW9uKEVycm9yQ29uZmlndXJhdGlvbi5jbGFzcywgY29uZmlndXJhdGlvbkxpc3RlbmVyKTsKKworCQlhc3NlcnRUcnVlKHRlc3RDb25maWd1cmF0aW9uICE9IG51bGwpOworCQlFcnJvckluZm8gZXJyb3JJbmZvID0gdGVzdENvbmZpZ3VyYXRpb24uZ2V0RXJyb3JJbmZvKCJVU0VSX05PVF9GT1VORCIpOworCQlhc3NlcnRUcnVlKGVycm9ySW5mbyAhPSBudWxsKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHRlc3RDb25maWd1cmF0aW9uKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIGVycm9ySW5mbyk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9UZXN0RXh0ZXJuYWxDb25maWd1cmF0aW9uLmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvVGVzdEV4dGVybmFsQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOWFlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvVGVzdEV4dGVybmFsQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkJhc2ljQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5GaWxlQ2hhbmdlQ2FsbGJhY2s7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuQ29uZmlnRmlsZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0RXh0ZXJuYWxDb25maWd1cmF0aW9uPFQgZXh0ZW5kcyBPYmplY3Q+IHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcE5hbWUoImNhdGFsb2ctc2VydmVyIik7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRDb25maWdEaXIoIkM6XFxVc2Vyc1xcZXNvZmVyXFx3b3Jrc3BhY2VMdW5hXFxjYXRhbG9nLXNlcnZlclxcc3JjXFx0ZXN0XFxyZXNvdXJjZXNcXGNvbmZpZyIpOworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24ubGlzdGVuRm9yQ2hhbmdlcygpOworCisJCUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBjb25maWd1cmF0aW9uTGlzdGVuZXIgPSBuZXcgQ29uZmlndXJhdGlvbkxpc3RlbmVyKENvbmZpZ3VyYXRpb24uY2xhc3MsIG5ldyBGaWxlQ2hhbmdlQ2FsbGJhY2soKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcmVjb25maWd1cmUoQmFzaWNDb25maWd1cmF0aW9uIG9iaikgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCQkJfQorCQl9KTsKKworCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UxID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShuZXcgQ29uZmlnRmlsZUNoYW5nZUxpc3RlbmVyKCksIEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDb25maWdEaXIoKSk7CisJCWNvbmZpZ3VyYXRpb25Tb3VyY2UxLmdldEFuZFdhdGNoQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uLmNsYXNzLCBjb25maWd1cmF0aW9uTGlzdGVuZXIpOworCisJCXRyeSB7CisJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCAqIDEwMDApOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9aaXBVdGlsLmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvWmlwVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NTFiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvWmlwVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0LkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworcHVibGljIGNsYXNzIFppcFV0aWwgeworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisJCVN0cmluZyB6aXBGaWxlTmFtZSA9ICIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jb25maWcuemlwIjsKKworCQl6aXBGaWxlTmFtZSA9ICJDOlxcR2l0X3dvcmtcXEQyLVNEbkNcXGNhdGFsb2ctYmVcXHNyY1xcdGVzdFxccmVzb3VyY2VzXFxjb25maWdcXGNvbmZpZy56aXAiOworCQl6aXBGaWxlTmFtZSA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZy56aXAiOworCisJCVBhdGggcGF0aCA9IFBhdGhzLmdldCh6aXBGaWxlTmFtZSk7CisKKwkJdHJ5IHsKKwkJCWJ5dGVbXSB6aXBBc0J5dGVzID0gRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGgpOworCQkJLy8gZW5jb2RlIHRvIGJhc2UKKworCQkJYnl0ZVtdIGRlY29kZWRNZDUgPSBCYXNlNjQuZW5jb2RlQmFzZTY0KHppcEFzQnl0ZXMpOworCQkJU3RyaW5nIGRlY29kZWRTdHIgPSBuZXcgU3RyaW5nKGRlY29kZWRNZDUpOworCisJCQl6aXBBc0J5dGVzID0gQmFzZTY0LmRlY29kZUJhc2U2NChkZWNvZGVkU3RyLmdldEJ5dGVzKCkpOworCisJCQkvLyBTdHJpbmcgc3RyID0gbmV3IFN0cmluZyh6aXBBc0J5dGVzKTsKKworCQkJLy8gcmVhZFppcChzdHIuZ2V0Qnl0ZXMoKSk7CisJCQlyZWFkWmlwKHppcEFzQnl0ZXMpOworCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCX0KKworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIGJ5dGVbXT4gcmVhZFppcChieXRlW10gemlwQXNCeXRlcykgeworCisJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gZmlsZU5hbWVUb0J5dGVBcnJheSA9IG5ldyBIYXNoTWFwPFN0cmluZywgYnl0ZVtdPigpOworCisJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKwkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJemlzID0gbmV3IFppcElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh6aXBBc0J5dGVzKSk7CisJCQkvLyBnZXQgdGhlIHppcHBlZCBmaWxlIGxpc3QgZW50cnkKKwkJCVppcEVudHJ5IHplID0gemlzLmdldE5leHRFbnRyeSgpOworCisJCQl3aGlsZSAoemUgIT0gbnVsbCkgeworCisJCQkJU3RyaW5nIGZpbGVOYW1lID0gemUuZ2V0TmFtZSgpOworCisJCQkJaWYgKGZhbHNlID09IHplLmlzRGlyZWN0b3J5KCkpIHsKKworCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJCXRyeSB7CisJCQkJCQlpbnQgbGVuOworCQkJCQkJd2hpbGUgKChsZW4gPSB6aXMucmVhZChidWZmZXIpKSA+IDApIHsKKwkJCQkJCQlvcy53cml0ZShidWZmZXIsIDAsIGxlbik7CisJCQkJCQl9CisKKwkJCQkJCS8vIGFDbGFzcy5vdXRwdXRTdHJlYW1NZXRob2Qob3MpOworCQkJCQkJU3RyaW5nIGFTdHJpbmcgPSBuZXcgU3RyaW5nKG9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpOworCisJCQkJCQlmaWxlTmFtZVRvQnl0ZUFycmF5LnB1dChmaWxlTmFtZSwgb3MudG9CeXRlQXJyYXkoKSk7CisKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCWlmIChvcyAhPSBudWxsKSB7CisJCQkJCQkJb3MuY2xvc2UoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQl6ZSA9IHppcy5nZXROZXh0RW50cnkoKTsKKworCQkJfQorCisJCQl6aXMuY2xvc2VFbnRyeSgpOworCQkJemlzLmNsb3NlKCk7CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0gZmluYWxseSB7CisJCQlpZiAoemlzICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQl6aXMuY2xvc2VFbnRyeSgpOworCQkJCQl6aXMuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRPRE86IGFkZCBsb2cKKwkJCQl9CisKKwkJCX0KKwkJfQorCisJCXJldHVybiBmaWxlTmFtZVRvQnl0ZUFycmF5OworCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9BdWRpdGluZ01hbmFnZXJUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9BdWRpdGluZ01hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmMGUzYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL0F1ZGl0aW5nTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50czsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmF1ZGl0aW5nLmltcGwuQXVkaXRpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsLkF1ZGl0aW5nRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVGhyZWFkTG9jYWxzSG9sZGVyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5MZXZlbDsKK2ltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLkxvZ2dlcjsKKworcHVibGljIGNsYXNzIEF1ZGl0aW5nTWFuYWdlclRlc3QgZXh0ZW5kcyBCYXNlQ29uZkRlcGVuZGVudFRlc3R7CisKKwlASW5qZWN0TW9ja3MKKwlwcml2YXRlIEF1ZGl0aW5nTWFuYWdlciBhdWRpdGluZ01hbmFnZXIgPSBNb2NraXRvLnNweShBdWRpdGluZ01hbmFnZXIuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQXVkaXRpbmdEYW8gYXVkaXRpbmdEYW8gPSBNb2NraXRvLm1vY2soQXVkaXRpbmdEYW8uY2xhc3MpOworCisJcHVibGljIEF1ZGl0aW5nTWFuYWdlclRlc3QoKSB7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCQlNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCQl3aGVuKGF1ZGl0aW5nRGFvLmFkZFJlY29yZChNb2NraXRvLmFueU1hcCgpLCBNb2NraXRvLmFueVN0cmluZygpKSkudGhlblJldHVybihBY3Rpb25TdGF0dXMuT0spOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplRW1wdHlTdHJpbmdWYWx1ZXNBbmRVdWlkKCkgeworCQlFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMgPSBuZXcgRW51bU1hcDw+KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uY2xhc3MpOworCQlhdWRpdGluZ0ZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04sICJDcmVhdGUiKTsKKwkJYXVkaXRpbmdGaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgbnVsbCk7CisJCWF1ZGl0aW5nRmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQsICIgICAgICBudWxsICIpOworCisJCVN0cmluZyByYW5kb21VVUlEID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJVGhyZWFkTG9jYWxzSG9sZGVyLnNldFV1aWQocmFuZG9tVVVJRCk7CisKKwkJYXVkaXRpbmdNYW5hZ2VyLmF1ZGl0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkvLyBDaGVja2luZyBub3JtYWxpemF0aW9uCisJCUFzc2VydC5hc3NlcnRFcXVhbHMoYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQyksIENvbnN0YW50cy5FTVBUWV9TVFJJTkcpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NPTU1FTlQpLCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyhhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lEKSwgcmFuZG9tVVVJRCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvQmFzZUNvbmZEZXBlbmRlbnRUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9CYXNlQ29uZkRlcGVuZGVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU0NzFlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvQmFzZUNvbmZEZXBlbmRlbnRUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworCitwdWJsaWMgY2xhc3MgQmFzZUNvbmZEZXBlbmRlbnRUZXN0IHsKKwlwcm90ZWN0ZWQgc3RhdGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQmVmb3JlQ2xhc3MoKSB7CisKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcE5hbWUoImNhdGFsb2ctYmUiKTsKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldENvbmZpZ0Rpcigic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZyIpOworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24ubGlzdGVuRm9yQ2hhbmdlcygpOworCisJCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksIEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDb25maWdEaXIoKSArIEZpbGUuc2VwYXJhdG9yICsgRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldEFwcE5hbWUoKSk7CisKKwkJY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpLnNldFRpdGFuSW5NZW1vcnlHcmFwaCh0cnVlKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL0NvbXBvbmVudEJ1c2luZXNzTG9naWNUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9Db21wb25lbnRCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzIzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9Db21wb25lbnRCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ29tcG9uZW50QnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEJ1c2luZXNzTG9naWNUZXN0IHsKKwlDb21wb25lbnRCdXNpbmVzc0xvZ2ljIGJ1c2luZXNzTG9naWMgPSBuZXcgQ29tcG9uZW50QnVzaW5lc3NMb2dpYygpIHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFJlc3BvbnNlRm9ybWF0PiBkZWxldGVNYXJrZWRDb21wb25lbnRzKCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIENvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBnZXRDb21wb25lbnRJbnN0YW5jZUJMKCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgUmVzcG9uc2VGb3JtYXQ+IGdldENvbXBvbmVudEluc3RhbmNlc0ZpbHRlcmVkQnlQcm9wZXJ0aWVzQW5kSW5wdXRzKFN0cmluZyBjb21wb25lbnRJZCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyB1c2VySWQsIFN0cmluZyBzZWFyY2hUZXh0KSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX07CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXMoKSB7CisJCS8vIGJ1c2luZXNzTG9naWMuZ2V0UmVxdWlyZW1lbnRzQW5kQ2FwYWJpbGl0aWVzKGNvbXBvbmVudElkLAorCQkvLyBjb21wb25lbnRUeXBlRW51bSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjMzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9IZWFsdGhDaGVja0J1c2luZXNzTG9naWNUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja0NvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja1N0YXR1czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CisKK3B1YmxpYyBjbGFzcyBIZWFsdGhDaGVja0J1c2luZXNzTG9naWNUZXN0IHsKKworCUhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYyBoZWFsdGhDaGVja0J1c2luZXNzTG9naWMgPSBuZXcgSGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljKCk7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrU3RhdXNVcGRhdGVkKCkgeworCisJCWJvb2xlYW4gc3RhdHVzQ2hhbmdlZCA9IGhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYy5hbnlTdGF0dXNDaGFuZ2VkKG51bGwsIG51bGwpOworCQlhc3NlcnRGYWxzZSgiY2hlY2sgZmFsc2UiLCBzdGF0dXNDaGFuZ2VkKTsKKworCQlMaXN0PEhlYWx0aENoZWNrSW5mbz4gY2hlY2tJbmZvc0xlZnQgPSBuZXcgQXJyYXlMaXN0PEhlYWx0aENoZWNrSW5mbz4oKTsKKwkJTGlzdDxIZWFsdGhDaGVja0luZm8+IGNoZWNrSW5mb3NSaWdodCA9IG5ldyBBcnJheUxpc3Q8SGVhbHRoQ2hlY2tJbmZvPigpOworCisJCXN0YXR1c0NoYW5nZWQgPSBoZWFsdGhDaGVja0J1c2luZXNzTG9naWMuYW55U3RhdHVzQ2hhbmdlZChjaGVja0luZm9zTGVmdCwgY2hlY2tJbmZvc1JpZ2h0KTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIGZhbHNlIiwgc3RhdHVzQ2hhbmdlZCk7CisKKwkJSGVhbHRoQ2hlY2tJbmZvIGNoZWNrSW5mb1RpdGFuVXAgPSBuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LlRJVEFOLCBIZWFsdGhDaGVja1N0YXR1cy5VUCwgbnVsbCwgbnVsbCk7CisJCUhlYWx0aENoZWNrSW5mbyBjaGVja0luZm9UaXRhbkRvd24gPSBuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LlRJVEFOLCBIZWFsdGhDaGVja1N0YXR1cy5ET1dOLCBudWxsLCBudWxsKTsKKworCQlIZWFsdGhDaGVja0luZm8gY2hlY2tJbmZvRXNVcCA9IG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuRVMsIEhlYWx0aENoZWNrU3RhdHVzLlVQLCBudWxsLCBudWxsKTsKKwkJSGVhbHRoQ2hlY2tJbmZvIGNoZWNrSW5mb0VzRG93biA9IG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuRVMsIEhlYWx0aENoZWNrU3RhdHVzLkRPV04sIG51bGwsIG51bGwpOworCisJCS8qCisJCSAqIEhlYWx0aENoZWNrSW5mbyBjaGVja0luZm9VZWJVcCA9IG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuREUsIEhlYWx0aENoZWNrU3RhdHVzLlVQLCBudWxsLCBudWxsKTsgSGVhbHRoQ2hlY2tJbmZvIGNoZWNrSW5mb1VlYkRvd24gPSBuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkRFLCBIZWFsdGhDaGVja1N0YXR1cy5ET1dOLCBudWxsLCBudWxsKTsKKwkJICovCisKKwkJY2hlY2tJbmZvc0xlZnQuYWRkKGNoZWNrSW5mb1RpdGFuVXApOworCQljaGVja0luZm9zTGVmdC5hZGQoY2hlY2tJbmZvRXNVcCk7CisKKwkJY2hlY2tJbmZvc1JpZ2h0LmFkZChjaGVja0luZm9UaXRhblVwKTsKKwkJY2hlY2tJbmZvc1JpZ2h0LmFkZChjaGVja0luZm9Fc1VwKTsKKworCQlzdGF0dXNDaGFuZ2VkID0gaGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljLmFueVN0YXR1c0NoYW5nZWQoY2hlY2tJbmZvc0xlZnQsIGNoZWNrSW5mb3NSaWdodCk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBmYWxzZSIsIHN0YXR1c0NoYW5nZWQpOworCisJCWNoZWNrSW5mb3NSaWdodC5yZW1vdmUoY2hlY2tJbmZvVGl0YW5VcCk7CisJCXN0YXR1c0NoYW5nZWQgPSBoZWFsdGhDaGVja0J1c2luZXNzTG9naWMuYW55U3RhdHVzQ2hhbmdlZChjaGVja0luZm9zTGVmdCwgY2hlY2tJbmZvc1JpZ2h0KTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdHJ1ZSIsIHN0YXR1c0NoYW5nZWQpOworCisJCWNoZWNrSW5mb3NSaWdodC5hZGQoY2hlY2tJbmZvVGl0YW5Eb3duKTsKKwkJc3RhdHVzQ2hhbmdlZCA9IGhlYWx0aENoZWNrQnVzaW5lc3NMb2dpYy5hbnlTdGF0dXNDaGFuZ2VkKGNoZWNrSW5mb3NMZWZ0LCBjaGVja0luZm9zUmlnaHQpOworCQlhc3NlcnRUcnVlKCJjaGVjayB0cnVlIiwgc3RhdHVzQ2hhbmdlZCk7CisKKwkJY2hlY2tJbmZvc1JpZ2h0LnJlbW92ZShjaGVja0luZm9UaXRhbkRvd24pOworCQlzdGF0dXNDaGFuZ2VkID0gaGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljLmFueVN0YXR1c0NoYW5nZWQoY2hlY2tJbmZvc0xlZnQsIGNoZWNrSW5mb3NSaWdodCk7CisJCWFzc2VydFRydWUoImNoZWNrIHRydWUiLCBzdGF0dXNDaGFuZ2VkKTsKKworCQljaGVja0luZm9zUmlnaHQuYWRkKGNoZWNrSW5mb1RpdGFuVXApOworCQlzdGF0dXNDaGFuZ2VkID0gaGVhbHRoQ2hlY2tCdXNpbmVzc0xvZ2ljLmFueVN0YXR1c0NoYW5nZWQoY2hlY2tJbmZvc0xlZnQsIGNoZWNrSW5mb3NSaWdodCk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBmYWxzZSIsIHN0YXR1c0NoYW5nZWQpOworCisJCXN0YXR1c0NoYW5nZWQgPSBoZWFsdGhDaGVja0J1c2luZXNzTG9naWMuYW55U3RhdHVzQ2hhbmdlZChjaGVja0luZm9zTGVmdCwgbnVsbCk7CisJCWFzc2VydFRydWUoImNoZWNrIHRydWUiLCBzdGF0dXNDaGFuZ2VkKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvUHJvcGVydHlCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvUHJvcGVydHlCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTI5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9Qcm9wZXJ0eUJ1c2luZXNzTG9naWNUZXN0LmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Qcm9wZXJ0eUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc291cmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVudHJ5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkZTQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUJ1c2luZXNzTG9naWNUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9wZXJ0eUJ1c2luZXNzTG9naWNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBNb2NraXRvLm1vY2soU2VydmxldENvbnRleHQuY2xhc3MpOworCWZpbmFsIElQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhJUHJvcGVydHlPcGVyYXRpb24uY2xhc3MpOworCWZpbmFsIElSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhJUmVzb3VyY2VPcGVyYXRpb24uY2xhc3MpOworCVdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcENvbnRleHRXcmFwcGVyID0gTW9ja2l0by5tb2NrKFdlYkFwcENvbnRleHRXcmFwcGVyLmNsYXNzKTsKKwlVc2VyQnVzaW5lc3NMb2dpYyBtb2NrVXNlckFkbWluID0gTW9ja2l0by5tb2NrKFVzZXJCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwlXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwQ29udGV4dCA9IE1vY2tpdG8ubW9jayhXZWJBcHBsaWNhdGlvbkNvbnRleHQuY2xhc3MpOworCVByb3BlcnR5QnVzaW5lc3NMb2dpYyBibCA9IG5ldyBQcm9wZXJ0eUJ1c2luZXNzTG9naWMoKTsKKwlVc2VyIHVzZXIgPSBudWxsOworCVJlc291cmNlIHJlc291cmNlUmVzcG9uc2UgPSBudWxsOworCVJlc291cmNlQnVzaW5lc3NMb2dpYyBibFJlc291cmNlID0gbmV3IFJlc291cmNlQnVzaW5lc3NMb2dpYygpOworCVByb3BlcnR5QnVzaW5lc3NMb2dpYyBzcHkgPSBudWxsOworCVN0cmluZyByZXNvdXJjZUlkID0gInJlc291cmNlZm9ycHJvcGVydHkuMC4xIjsKKworCXB1YmxpYyBQcm9wZXJ0eUJ1c2luZXNzTG9naWNUZXN0KCkgeworCisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLWJlIik7CisKKwkJLy8gSW5pdCBDb25maWd1cmF0aW9uCisJCVN0cmluZyBhcHBDb25maWdEaXIgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlIjsKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgYXBwQ29uZmlnRGlyKTsKKwkJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJLy8gVXNlciBkYXRhIGFuZCBtYW5hZ2VtZW50CisJCXVzZXIgPSBuZXcgVXNlcigpOworCQl1c2VyLnNldFVzZXJJZCgiamgwMDMiKTsKKwkJdXNlci5zZXRGaXJzdE5hbWUoIkppbW1pIik7CisJCXVzZXIuc2V0TGFzdE5hbWUoIkhlbmRyaXgiKTsKKwkJdXNlci5zZXRSb2xlKFJvbGUuQURNSU4ubmFtZSgpKTsKKworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJHZXRVc2VyID0gRWl0aGVyLmxlZnQodXNlcik7CisJCXdoZW4obW9ja1VzZXJBZG1pbi5nZXRVc2VyKCJqaDAwMyIsIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJHZXRVc2VyKTsKKworCQkvLyBTZXJ2bGV0IENvbnRleHQgYXR0cmlidXRlcworCQl3aGVuKHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHVVJBVElPTl9NQU5BR0VSX0FUVFIpKS50aGVuUmV0dXJuKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlBST1BFUlRZX09QRVJBVElPTl9NQU5BR0VSKSkudGhlblJldHVybihwcm9wZXJ0eU9wZXJhdGlvbik7CisJCXdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpKS50aGVuUmV0dXJuKHdlYkFwcENvbnRleHRXcmFwcGVyKTsKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlJFU09VUkNFX09QRVJBVElPTl9NQU5BR0VSKSkudGhlblJldHVybihyZXNvdXJjZU9wZXJhdGlvbik7CisJCXdoZW4od2ViQXBwQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChzZXJ2bGV0Q29udGV4dCkpLnRoZW5SZXR1cm4od2ViQXBwQ29udGV4dCk7CisKKwkJLy8gUmVzb3VyY2UgT3BlcmF0aW9uIG1vY2sgbWV0aG9kcworCQkvLyBnZXRDb3VudAorCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQ291bnQgPSBFaXRoZXIubGVmdCgwKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXROdW1iZXJPZlJlc291cmNlc0J5TmFtZSgiTXlSZXNvdXJjZU5hbWUiLnRvTG93ZXJDYXNlKCkpKS50aGVuUmV0dXJuKGVpdGhlckNvdW50KTsKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNvdW50RXhpc3QgPSBFaXRoZXIubGVmdCgxKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXROdW1iZXJPZlJlc291cmNlc0J5TmFtZSgiYWxyZWFkeUV4aXN0Ii50b0xvd2VyQ2FzZSgpKSkudGhlblJldHVybihlaXRoZXJDb3VudEV4aXN0KTsKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNvdW50Um9vdCA9IEVpdGhlci5sZWZ0KDEpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldE51bWJlck9mUmVzb3VyY2VzQnlOYW1lKCJSb290Ii50b0xvd2VyQ2FzZSgpKSkudGhlblJldHVybihlaXRoZXJDb3VudFJvb3QpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyR2V0UmVzb3VyY2UgPSBFaXRoZXIubGVmdChjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2VJZCkpLnRoZW5SZXR1cm4oZWl0aGVyR2V0UmVzb3VyY2UpOworCisJCS8vIC8vIGNyZWF0ZVJlc291cmNlCisJCS8vIHJlc291cmNlUmVzcG9uc2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKwkJLy8gRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdGUgPQorCQkvLyBFaXRoZXIubGVmdChyZXNvdXJjZVJlc3BvbnNlKTsKKwkJLy8gd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5jcmVhdGVSZXNvdXJjZShNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcykpKS50aGVuUmV0dXJuKGVpdGhlckNyZWF0ZSk7CisKKwkJLy8gQkwgb2JqZWN0CisJCS8vIGJsID0gUHJvcGVydHlCdXNpbmVzc0xvZ2ljLmdldEluc3RhbmNlKHNlcnZsZXRDb250ZXh0KTsKKwkJLy8gUHJvcGVydHlCdXNpbmVzc0xvZ2ljIHNweSA9IFBvd2VyTW9ja2l0by5zcHkoYmwpOworCQkvLyB3aGVuKHNweSwgbWV0aG9kKFByb3BlcnR5QnVzaW5lc3NMb2dpYy5jbGFzcywgImdldFJlc291cmNlIiwKKwkJLy8gU3RyaW5nLmNsYXNzKSkud2l0aEFyZ3VtZW50cyhyZXNvdXJjZSkudGhlblJldHVybih0cnVlKTsKKworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VPYmplY3QoYm9vbGVhbiBhZnRlckNyZWF0ZSkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOworCQlyZXNvdXJjZS5zZXROYW1lKCJNeVJlc291cmNlTmFtZSIpOworCQlyZXNvdXJjZS5hZGRDYXRlZ29yeSgiR2VuZXJpYyIsICJWb0lQIik7CisJCXJlc291cmNlLnNldERlc2NyaXB0aW9uKCJNeSBzaG9ydCBkZXNjcmlwdGlvbiIpOworCQlMaXN0PFN0cmluZz4gdGdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRncy5hZGQoInRlc3QiKTsKKwkJcmVzb3VyY2Uuc2V0VGFncyh0Z3MpOworCQlMaXN0PFN0cmluZz4gdGVtcGxhdGUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGVtcGxhdGUuYWRkKCJSb290Iik7CisJCXJlc291cmNlLnNldERlcml2ZWRGcm9tKHRlbXBsYXRlKTsKKwkJcmVzb3VyY2Uuc2V0VmVuZG9yTmFtZSgiTW90b3JvbGEiKTsKKwkJcmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZSgiMS4wLjAiKTsKKwkJcmVzb3VyY2Uuc2V0Q29udGFjdElkKCJ5YXZpdmkiKTsKKwkJcmVzb3VyY2Uuc2V0SWNvbigiTXlJY29uLmpwZyIpOworCisJCWlmIChhZnRlckNyZWF0ZSkgeworCQkJcmVzb3VyY2Uuc2V0TmFtZShyZXNvdXJjZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQlyZXNvdXJjZS5zZXRWZXJzaW9uKCIwLjEiKTsKKwkJCTsKKwkJCXJlc291cmNlLnNldFVuaXF1ZUlkKHJlc291cmNlSWQpOworCQkJcmVzb3VyY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJCXJlc291cmNlLnNldENyZWF0b3JGdWxsTmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJfQorCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCQlsb2cuZGVidWcoZ3Nvbi50b0pzb24ocmVzb3VyY2UpKTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCS8vIEBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhcHB5U2NlbmFyaW8oKSB7CisKKwkJU3RyaW5nIHByb3BlcnR5TmFtZSA9ICJkaXNrX3NpemUiOworCQlQcm9wZXJ0eURlZmluaXRpb24gbmV3UHJvcGVydHlEZWZpbml0aW9uID0gY3JlYXRlUHJvcGVydHlPYmplY3QocHJvcGVydHlOYW1lLCByZXNvdXJjZUlkKTsKKwkJRWl0aGVyPEVudHJ5RGF0YTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFJlc3BvbnNlRm9ybWF0PiBlaXRoZXIgPSBibC5jcmVhdGVQcm9wZXJ0eShyZXNvdXJjZUlkLCBwcm9wZXJ0eU5hbWUsIG5ld1Byb3BlcnR5RGVmaW5pdGlvbiwgdXNlci5nZXRVc2VySWQoKSk7CisKKwkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCUFzc2VydC5hc3NlcnRGYWxzZSh0cnVlKTsKKwkJfQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ld1Byb3BlcnR5RGVmaW5pdGlvbiwgZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5RGVmaW5pdGlvbiBjcmVhdGVQcm9wZXJ0eU9iamVjdChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCQlQcm9wZXJ0eURlZmluaXRpb24gcGQgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PigpOworCQlwZC5zZXRDb25zdHJhaW50cyhudWxsKTsKKwkJcGQuc2V0RGVmYXVsdFZhbHVlKCIxMDAiKTsKKwkJcGQuc2V0RGVzY3JpcHRpb24oIlNpemUgb2YgdGhhc2Rhc2Rhc2Rhc2RlIGxvY2FsIGRpc2ssIGluIEdpZ2FieXRlcyAoR0IpLCBhdmFpbGFibGUgdG8gYXBwbGljYXRpb25zIHJ1bm5pbmcgb24gdGhlIENvbXB1dGUgbm9kZSIpOworCQlwZC5zZXRQYXNzd29yZChmYWxzZSk7CisJCXBkLnNldFJlcXVpcmVkKHRydWUpOworCQlwZC5zZXRUeXBlKCJJbnRlZ2VyIik7CisJCXBkLnNldFVuaXF1ZUlkKHJlc291cmNlSWQgKyAiLiIgKyBwcm9wZXJ0eU5hbWUpOworCQlyZXR1cm4gcGQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvUmVzb3VyY2VJbXBvcnRNYW5hZ2VyVGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvUmVzb3VyY2VJbXBvcnRNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTVjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9SZXNvdXJjZUltcG9ydE1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuYXBpLklBdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlsc1Rlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc291cmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuUmVzb3VyY2VJbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5SZXNwb25zZUZvcm1hdE1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVwbG9hZFJlc291cmNlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5HcmVhdGVyT3JFcXVhbENvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlBvbGljeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VJbXBvcnRNYW5hZ2VyVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKKwlzdGF0aWMgUmVzb3VyY2VJbXBvcnRNYW5hZ2VyIGltcG9ydE1hbmFnZXI7CisJc3RhdGljIElBdWRpdGluZ01hbmFnZXIgYXVkaXRpbmdNYW5hZ2VyID0gTW9ja2l0by5tb2NrKElBdWRpdGluZ01hbmFnZXIuY2xhc3MpOworCXN0YXRpYyBSZXNwb25zZUZvcm1hdE1hbmFnZXIgcmVzcG9uc2VGb3JtYXRNYW5hZ2VyID0gTW9ja2l0by5tb2NrKFJlc3BvbnNlRm9ybWF0TWFuYWdlci5jbGFzcyk7CisJc3RhdGljIFJlc291cmNlQnVzaW5lc3NMb2dpYyByZXNvdXJjZUJ1c2luZXNzTG9naWMgPSBNb2NraXRvLm1vY2soUmVzb3VyY2VCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwlzdGF0aWMgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soUmVzb3VyY2VPcGVyYXRpb24uY2xhc3MpOworCXN0YXRpYyBVc2VyQnVzaW5lc3NMb2dpYyB1c2VyQWRtaW4gPSBNb2NraXRvLm1vY2soVXNlckJ1c2luZXNzTG9naWMuY2xhc3MpOworCXN0YXRpYyBMb2dnZXIgbG9nID0gTW9ja2l0by5zcHkoTG9nZ2VyLmNsYXNzKTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWltcG9ydE1hbmFnZXIgPSBuZXcgUmVzb3VyY2VJbXBvcnRNYW5hZ2VyKCk7CisJCWltcG9ydE1hbmFnZXIuc2V0QXVkaXRpbmdNYW5hZ2VyKGF1ZGl0aW5nTWFuYWdlcik7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0QnlUb3NjYVJlc291cmNlTmFtZShNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueUJvb2xlYW4oKSkpLnRoZW5SZXR1cm4oRWl0aGVyLmxlZnQobnVsbCkpOworCQlpbXBvcnRNYW5hZ2VyLnNldFJlc3BvbnNlRm9ybWF0TWFuYWdlcihyZXNwb25zZUZvcm1hdE1hbmFnZXIpOworCQlpbXBvcnRNYW5hZ2VyLnNldFJlc291cmNlQnVzaW5lc3NMb2dpYyhyZXNvdXJjZUJ1c2luZXNzTG9naWMpOworCQlpbXBvcnRNYW5hZ2VyLnNldFJlc291cmNlT3BlcmF0aW9uKHJlc291cmNlT3BlcmF0aW9uKTsKKwkJUmVzb3VyY2VJbXBvcnRNYW5hZ2VyLnNldExvZyhsb2cpOworCisJCVN0cmluZyBhcHBDb25maWdEaXIgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlIjsKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgYXBwQ29uZmlnRGlyKTsKKwkJY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKwkJY29uZmlndXJhdGlvbi5zZXRUaXRhbkluTWVtb3J5R3JhcGgodHJ1ZSk7CisJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisJCU1vY2tpdG8ucmVzZXQoYXVkaXRpbmdNYW5hZ2VyLCByZXNwb25zZUZvcm1hdE1hbmFnZXIsIHJlc291cmNlQnVzaW5lc3NMb2dpYywgdXNlckFkbWluLCBsb2cpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJhc2ljUmVzb3VyY2VDcmVhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZU1EID0gY3JlYXRlRHVtbXlSZXNvdXJjZU1EKCk7CisKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQocmVzb3VyY2VNRC5nZXRDb250YWN0SWQoKSk7CisJCXVzZXIuc2V0Um9sZSgiQURNSU4iKTsKKwkJdXNlci5zZXRGaXJzdE5hbWUoIkpob24iKTsKKwkJdXNlci5zZXRMYXN0TmFtZSgiRG9oIik7CisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlclVzZXIgPSBFaXRoZXIubGVmdCh1c2VyKTsKKworCQl3aGVuKHVzZXJBZG1pbi5nZXRVc2VyKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihlaXRoZXJVc2VyKTsKKworCQlzZXRSZXNvdXJjZUJ1c2luZXNzTG9naWNNb2NrKCk7CisKKwkJU3RyaW5nIGpzb25Db250ZW50ID0gSW1wb3J0VXRpbHNUZXN0LmxvYWRGaWxlTmFtZVRvSnNvblN0cmluZygibm9ybWF0aXZlLXR5cGVzLW5ldy1ibG9ja1N0b3JhZ2UueW1sIik7CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNvdXJjZSA9IGltcG9ydE1hbmFnZXIuaW1wb3J0Tm9ybWF0aXZlUmVzb3VyY2UoanNvbkNvbnRlbnQsIHJlc291cmNlTUQsIHVzZXIsIHRydWUsIHRydWUpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc291cmNlLmlzTGVmdCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKS5sZWZ0OworCisJCXRlc3RTZXRDb25zdGFudE1ldGFEYXRhKHJlc291cmNlKTsKKwkJdGVzdFNldE1ldGFEYXRhRnJvbUpzb24ocmVzb3VyY2UsIHJlc291cmNlTUQpOworCisJCXRlc3RTZXREZXJpdmVkRnJvbShyZXNvdXJjZSk7CisJCXRlc3RTZXRQcm9wZXJ0aWVzKHJlc291cmNlKTsKKworCQlNb2NraXRvLnZlcmlmeShyZXNvdXJjZUJ1c2luZXNzTG9naWMsIE1vY2tpdG8udGltZXMoMSkpLnByb3BhZ2F0ZVN0YXRlVG9DZXJ0aWZpZWQoTW9ja2l0by5lcSh1c2VyKSwgTW9ja2l0by5lcShyZXNvdXJjZSksIE1vY2tpdG8uYW55KExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uLmNsYXNzKSwgTW9ja2l0by5lcShmYWxzZSksIE1vY2tpdG8uZXEodHJ1ZSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlQ3JlYXRpb25GYWlsZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VNRCA9IGNyZWF0ZUR1bW15UmVzb3VyY2VNRCgpOworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcigpOworCQl1c2VyLnNldFVzZXJJZChyZXNvdXJjZU1ELmdldENvbnRhY3RJZCgpKTsKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyVXNlciA9IEVpdGhlci5sZWZ0KHVzZXIpOworCQl3aGVuKHVzZXJBZG1pbi5nZXRVc2VyKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihlaXRoZXJVc2VyKTsKKwkJUmVzcG9uc2VGb3JtYXQgZHVtbXlSZXNwb25zZUZvcm1hdCA9IGNyZWF0ZUdlbmVyYWxFcnJvckluZm8oKTsKKworCQl3aGVuKHJlc3BvbnNlRm9ybWF0TWFuYWdlci5nZXRSZXNwb25zZUZvcm1hdChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUikpLnRoZW5SZXR1cm4oZHVtbXlSZXNwb25zZUZvcm1hdCk7CisJCXNldFJlc291cmNlQnVzaW5lc3NMb2dpY01vY2soKTsKKworCQlTdHJpbmcganNvbkNvbnRlbnQgPSAidGhpcyBpcyBhbiBpbnZhbGlkIHltbCEiOworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2UgPSBpbXBvcnRNYW5hZ2VyLmltcG9ydE5vcm1hdGl2ZVJlc291cmNlKGpzb25Db250ZW50LCByZXNvdXJjZU1ELCB1c2VyLCB0cnVlLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNvdXJjZS5pc1JpZ2h0KCkpOworCQlSZXNwb25zZUZvcm1hdCBlcnJvckluZm9Gcm9tVGVzdCA9IGNyZWF0ZVJlc291cmNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShlcnJvckluZm9Gcm9tVGVzdC5nZXRTdGF0dXMoKS5lcXVhbHMoZHVtbXlSZXNwb25zZUZvcm1hdC5nZXRTdGF0dXMoKSkpOworCQlhc3NlcnRUcnVlKGVycm9ySW5mb0Zyb21UZXN0LmdldE1lc3NhZ2VJZCgpLmVxdWFscyhkdW1teVJlc3BvbnNlRm9ybWF0LmdldE1lc3NhZ2VJZCgpKSk7CisJCWFzc2VydFRydWUoZXJyb3JJbmZvRnJvbVRlc3QuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpLmVxdWFscyhkdW1teVJlc3BvbnNlRm9ybWF0LmdldEZvcm1hdHRlZE1lc3NhZ2UoKSkpOworCQlNb2NraXRvLnZlcmlmeShsb2cpLmRlYnVnKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55KEV4Y2VwdGlvbi5jbGFzcykpOworCQkvLyBNb2NraXRvLnZlcmlmeShsb2cpLmVycm9yKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksCisJCS8vIE1vY2tpdG8uYW55U3RyaW5nKCkpOworCisJCU1vY2tpdG8udmVyaWZ5KHJlc291cmNlQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygwKSkuY3JlYXRlT3JVcGRhdGVSZXNvdXJjZUJ5SW1wb3J0KE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSwgTW9ja2l0by5lcSh1c2VyKSwgTW9ja2l0by5lcSh0cnVlKSwgTW9ja2l0by5lcShmYWxzZSksIE1vY2tpdG8uZXEodHJ1ZSkpOworCisJCU1vY2tpdG8udmVyaWZ5KHJlc291cmNlQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygwKSkucHJvcGFnYXRlU3RhdGVUb0NlcnRpZmllZChNb2NraXRvLmVxKHVzZXIpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55KExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uLmNsYXNzKSwgTW9ja2l0by5lcShmYWxzZSksIE1vY2tpdG8uZXEodHJ1ZSkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDcmVhdGlvbldpdGhDYXBhYmlsaXRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VNRCA9IGNyZWF0ZUR1bW15UmVzb3VyY2VNRCgpOworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcigpOworCQl1c2VyLnNldFVzZXJJZChyZXNvdXJjZU1ELmdldENvbnRhY3RJZCgpKTsKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyVXNlciA9IEVpdGhlci5sZWZ0KHVzZXIpOworCisJCXdoZW4odXNlckFkbWluLmdldFVzZXIoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpKS50aGVuUmV0dXJuKGVpdGhlclVzZXIpOworCisJCXNldFJlc291cmNlQnVzaW5lc3NMb2dpY01vY2soKTsKKworCQlTdHJpbmcganNvbkNvbnRlbnQgPSBJbXBvcnRVdGlsc1Rlc3QubG9hZEZpbGVOYW1lVG9Kc29uU3RyaW5nKCJub3JtYXRpdmUtdHlwZXMtbmV3LXdlYlNlcnZlci55bWwiKTsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc291cmNlID0gaW1wb3J0TWFuYWdlci5pbXBvcnROb3JtYXRpdmVSZXNvdXJjZShqc29uQ29udGVudCwgcmVzb3VyY2VNRCwgdXNlciwgdHJ1ZSwgdHJ1ZSk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzb3VyY2UuaXNMZWZ0KCkpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlLmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCXRlc3RTZXRDYXBhYmlsaXRpZXMocmVzb3VyY2UpOworCisJCU1vY2tpdG8udmVyaWZ5KHJlc291cmNlQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkucHJvcGFnYXRlU3RhdGVUb0NlcnRpZmllZChNb2NraXRvLmVxKHVzZXIpLCBNb2NraXRvLmVxKHJlc291cmNlKSwgTW9ja2l0by5hbnkoTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb24uY2xhc3MpLCBNb2NraXRvLmVxKGZhbHNlKSwgTW9ja2l0by5lcSh0cnVlKSk7CisJCU1vY2tpdG8udmVyaWZ5KHJlc291cmNlQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkuY3JlYXRlT3JVcGRhdGVSZXNvdXJjZUJ5SW1wb3J0KHJlc291cmNlLCB1c2VyLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNyZWF0aW9uV2l0aFJlcXVpcm1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlTUQgPSBjcmVhdGVEdW1teVJlc291cmNlTUQoKTsKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQocmVzb3VyY2VNRC5nZXRDb250YWN0SWQoKSk7CisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlclVzZXIgPSBFaXRoZXIubGVmdCh1c2VyKTsKKworCQl3aGVuKHVzZXJBZG1pbi5nZXRVc2VyKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihlaXRoZXJVc2VyKTsKKworCQlzZXRSZXNvdXJjZUJ1c2luZXNzTG9naWNNb2NrKCk7CisKKwkJU3RyaW5nIGpzb25Db250ZW50ID0gSW1wb3J0VXRpbHNUZXN0LmxvYWRGaWxlTmFtZVRvSnNvblN0cmluZygibm9ybWF0aXZlLXR5cGVzLW5ldy1wb3J0LnltbCIpOworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzb3VyY2UgPSBpbXBvcnRNYW5hZ2VyLmltcG9ydE5vcm1hdGl2ZVJlc291cmNlKGpzb25Db250ZW50LCByZXNvdXJjZU1ELCB1c2VyLCB0cnVlLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNvdXJjZS5pc0xlZnQoKSk7CisJCXRlc3RTZXRSZXF1aXJtZW50cyhjcmVhdGVSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKS5sZWZ0KTsKKworCX0KKworCXByaXZhdGUgdm9pZCBzZXRSZXNvdXJjZUJ1c2luZXNzTG9naWNNb2NrKCkgeworCQl3aGVuKHJlc291cmNlQnVzaW5lc3NMb2dpYy5nZXRVc2VyQWRtaW4oKSkudGhlblJldHVybih1c2VyQWRtaW4pOworCQl3aGVuKHJlc291cmNlQnVzaW5lc3NMb2dpYy5jcmVhdGVPclVwZGF0ZVJlc291cmNlQnlJbXBvcnQoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpLCBNb2NraXRvLmFueShVc2VyLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpLCBNb2NraXRvLmFueUJvb2xlYW4oKSkpCisJCQkJLnRoZW5BbnN3ZXIobmV3IEFuc3dlcjxFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+PigpIHsKKwkJCQkJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+LCBSZXNwb25zZUZvcm1hdD4gYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgdGhyb3dzIFRocm93YWJsZSB7CisJCQkJCQlPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgSW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPigoUmVzb3VyY2UpIGFyZ3NbMF0sIEFjdGlvblN0YXR1cy5DUkVBVEVEKSk7CisKKwkJCQkJfQorCQkJCX0pOworCQl3aGVuKHJlc291cmNlQnVzaW5lc3NMb2dpYy5wcm9wYWdhdGVTdGF0ZVRvQ2VydGlmaWVkKE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55KExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uLmNsYXNzKSwgTW9ja2l0by5lcShmYWxzZSksIE1vY2tpdG8uZXEodHJ1ZSkpKQorCQkJCS50aGVuQW5zd2VyKG5ldyBBbnN3ZXI8RWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4+KCkgeworCQkJCQlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgdGhyb3dzIFRocm93YWJsZSB7CisJCQkJCQlPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJCQkJCXJldHVybiBFaXRoZXIubGVmdCgoUmVzb3VyY2UpIGFyZ3NbMV0pOworCisJCQkJCX0KKwkJCQl9KTsKKwkJd2hlbihyZXNvdXJjZUJ1c2luZXNzTG9naWMuY3JlYXRlUmVzb3VyY2VCeURhbyhNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueShBdWRpdGluZ0FjdGlvbkVudW0uY2xhc3MpLCBNb2NraXRvLmFueUJvb2xlYW4oKSkpLnRoZW5BbnN3ZXIobmV3IEFuc3dlcjxFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0Pj4oKSB7CisJCQlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgdGhyb3dzIFRocm93YWJsZSB7CisJCQkJT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KChSZXNvdXJjZSkgYXJnc1swXSk7CisKKwkJCX0KKwkJfSk7CisJCXdoZW4ocmVzb3VyY2VCdXNpbmVzc0xvZ2ljLnZhbGlkYXRlUmVzb3VyY2VCZWZvcmVDcmVhdGUoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpLCBNb2NraXRvLmFueShVc2VyLmNsYXNzKSwgTW9ja2l0by5hbnkoQXVkaXRpbmdBY3Rpb25FbnVtLmNsYXNzKSwgTW9ja2l0by5lcShmYWxzZSkpKS50aGVuQW5zd2VyKG5ldyBBbnN3ZXI8RWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4+KCkgeworCQkJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHRocm93cyBUaHJvd2FibGUgeworCQkJCU9iamVjdFtdIGFyZ3MgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpOworCQkJCXJldHVybiBFaXRoZXIubGVmdCgoUmVzb3VyY2UpIGFyZ3NbMF0pOworCisJCQl9CisJCX0pOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCXdoZW4ocmVzb3VyY2VCdXNpbmVzc0xvZ2ljLnZhbGlkYXRlUHJvcGVydGllc0RlZmF1bHRWYWx1ZXMoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpKSkudGhlblJldHVybihlaXRoZXIpOworCX0KKworCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBjcmVhdGVHZW5lcmFsRXJyb3JJbmZvKCkgeworCQlSZXNwb25zZUZvcm1hdCByZXNwb25zZUZvcm1hdCA9IG5ldyBSZXNwb25zZUZvcm1hdCg1MDApOworCQlyZXNwb25zZUZvcm1hdC5zZXRQb2xpY3lFeGNlcHRpb24obmV3IFBvbGljeUV4Y2VwdGlvbigiUE9MNTAwMCIsICJFcnJvcjogSW50ZXJuYWwgU2VydmVyIEVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyIiwgbnVsbCkpOworCQlyZXR1cm4gcmVzcG9uc2VGb3JtYXQ7CisJfQorCisJcHJpdmF0ZSBVcGxvYWRSZXNvdXJjZUluZm8gY3JlYXRlRHVtbXlSZXNvdXJjZU1EKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gcmVzb3VyY2VNRCA9IG5ldyBVcGxvYWRSZXNvdXJjZUluZm8oKTsKKwkJcmVzb3VyY2VNRC5zZXROYW1lKCJ0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UiKTsKKwkJcmVzb3VyY2VNRC5hZGRTdWJDYXRlZ29yeSgiR2VuZXJpYyIsICJJbmZyYXN0cnVjdHVyZSIpOworCQlyZXNvdXJjZU1ELnNldENvbnRhY3RJZCgieWExMDdmIik7CisJCXJlc291cmNlTUQuc2V0UmVzb3VyY2VJY29uUGF0aCgiZGVmYXVsdGljb24iKTsKKwkJcmVzb3VyY2VNRC5zZXRUYWdzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkJsb2NrU3RvcmFnZSIgfSkpOworCQlyZXNvdXJjZU1ELnNldERlc2NyaXB0aW9uKCJSZXByZXNlbnRzIGEgc2VydmVyLWxvY2FsIGJsb2NrIHN0b3JhZ2UgZGV2aWNlIChpLmUuLCBub3Qgc2hhcmVkKSBvZmZlcmluZyBldmVubHkgc2l6ZWQgYmxvY2tzIG9mIGRhdGEgZnJvbSB3aGljaCByYXcgc3RvcmFnZSB2b2x1bWVzIGNhbiBiZSBjcmVhdGVkLiIpOworCQlyZXR1cm4gcmVzb3VyY2VNRDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFNldFByb3BlcnRpZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNMaXN0ID0gcmVzb3VyY2UuZ2V0UHJvcGVydGllcygpOworCisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPigpOworCQlmb3IgKFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gOiBwcm9wZXJ0aWVzTGlzdCkgeworCQkJcHJvcGVydGllcy5wdXQocHJvcGVydHlEZWZpbml0aW9uLmdldE5hbWUoKSwgcHJvcGVydHlEZWZpbml0aW9uKTsKKwkJfQorCisJCWFzc2VydFRydWUocHJvcGVydGllcy5zaXplKCkgPT0gMyk7CisJCWFzc2VydFRydWUocHJvcGVydGllcy5jb250YWluc0tleSgic2l6ZSIpKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IHByb3BlcnRpZXMuZ2V0KCJzaXplIik7CisJCWFzc2VydFRydWUocHJvcGVydHlEZWZpbml0aW9uLmdldFR5cGUoKS5lcXVhbHMoInNjYWxhci11bml0LnNpemUiKSk7CisJCWFzc2VydFRydWUocHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCkuc2l6ZSgpID09IDEpOworCQlQcm9wZXJ0eUNvbnN0cmFpbnQgcHJvcGVydHlDb25zdHJhaW50ID0gcHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCkuZ2V0KDApOworCQlhc3NlcnRUcnVlKHByb3BlcnR5Q29uc3RyYWludCBpbnN0YW5jZW9mIEdyZWF0ZXJPckVxdWFsQ29uc3RyYWludCk7CisKKwkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KCJ2b2x1bWVfaWQiKSk7CisJCXByb3BlcnR5RGVmaW5pdGlvbiA9IHByb3BlcnRpZXMuZ2V0KCJ2b2x1bWVfaWQiKTsKKwkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eURlZmluaXRpb24uZ2V0VHlwZSgpLmVxdWFscygic3RyaW5nIikpOworCQlhc3NlcnRUcnVlKHByb3BlcnR5RGVmaW5pdGlvbi5pc1JlcXVpcmVkKCkgPT0gZmFsc2UpOworCisJCWFzc2VydFRydWUocHJvcGVydGllcy5jb250YWluc0tleSgic25hcHNob3RfaWQiKSk7CisJCXByb3BlcnR5RGVmaW5pdGlvbiA9IHByb3BlcnRpZXMuZ2V0KCJzbmFwc2hvdF9pZCIpOworCQlhc3NlcnRUcnVlKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkuZXF1YWxzKCJzdHJpbmciKSk7CisJCWFzc2VydFRydWUocHJvcGVydHlEZWZpbml0aW9uLmlzUmVxdWlyZWQoKSA9PSBmYWxzZSk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFNldENhcGFiaWxpdGllcyhSZXNvdXJjZSByZXNvdXJjZSkgeworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzID0gcmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzLnNpemUoKSA9PSAzKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludCIpKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0eUxpc3QgPSBjYXBhYmlsaXRpZXMuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiKTsKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHlMaXN0LmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXR5LmdldFR5cGUoKS5lcXVhbHMoInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludCIpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXR5LmdldE5hbWUoKS5lcXVhbHMoImRhdGFfZW5kcG9pbnQiKSk7CisKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIpKTsKKwkJY2FwYWJpbGl0eUxpc3QgPSBjYXBhYmlsaXRpZXMuZ2V0KCJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4iKTsKKwkJY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHlMaXN0LmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXR5LmdldFR5cGUoKS5lcXVhbHMoInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXR5LmdldE5hbWUoKS5lcXVhbHMoImFkbWluX2VuZHBvaW50IikpOworCisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzLmNvbnRhaW5zS2V5KCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIikpOworCQljYXBhYmlsaXR5TGlzdCA9IGNhcGFiaWxpdGllcy5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKTsKKwkJY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHlMaXN0LmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXR5LmdldFR5cGUoKS5lcXVhbHMoInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiKSk7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0eS5nZXROYW1lKCkuZXF1YWxzKCJob3N0IikpOworCisJCUxpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzID0gY2FwYWJpbGl0eS5nZXRWYWxpZFNvdXJjZVR5cGVzKCk7CisJCWFzc2VydFRydWUodmFsaWRTb3VyY2VUeXBlcy5zaXplKCkgPT0gMSk7CisJCWFzc2VydFRydWUodmFsaWRTb3VyY2VUeXBlcy5nZXQoMCkuZXF1YWxzKCJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIpKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0U2V0UmVxdWlybWVudHMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXF1aXJlbWVudHMgPSByZXNvdXJjZS5nZXRSZXF1aXJlbWVudHMoKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlbWVudHMuc2l6ZSgpID09IDIpOworCisJCWFzc2VydFRydWUocmVxdWlyZW1lbnRzLmNvbnRhaW5zS2V5KCJ0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZSIpKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcXVpcmVtZW50TGlzdCA9IHJlcXVpcmVtZW50cy5nZXQoInRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlIik7CisJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudCA9IHJlcXVpcmVtZW50TGlzdC5nZXQoMCk7CisJCWFzc2VydFRydWUocmVxdWlyZW1lbnQuZ2V0Q2FwYWJpbGl0eSgpLmVxdWFscygidG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUiKSk7CisJCWFzc2VydFRydWUocmVxdWlyZW1lbnQuZ2V0UmVsYXRpb25zaGlwKCkuZXF1YWxzKCJ0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuTGlua3NUbyIpKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJsaW5rIikpOworCisJCWFzc2VydFRydWUocmVxdWlyZW1lbnRzLmNvbnRhaW5zS2V5KCJ0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZSIpKTsKKwkJcmVxdWlyZW1lbnRMaXN0ID0gcmVxdWlyZW1lbnRzLmdldCgidG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUiKTsKKwkJcmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudExpc3QuZ2V0KDApOworCQlhc3NlcnRUcnVlKHJlcXVpcmVtZW50LmdldENhcGFiaWxpdHkoKS5lcXVhbHMoInRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlIikpOworCQlhc3NlcnRUcnVlKHJlcXVpcmVtZW50LmdldFJlbGF0aW9uc2hpcCgpLmVxdWFscygidG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkJpbmRzVG8iKSk7CisJCWFzc2VydFRydWUocmVxdWlyZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygiYmluZGluZyIpKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0U2V0RGVyaXZlZEZyb20oUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpLnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5nZXREZXJpdmVkRnJvbSgpLmdldCgwKS5lcXVhbHMoInRvc2NhLm5vZGVzLlJvb3QiKSk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFNldE1ldGFEYXRhRnJvbUpzb24oUmVzb3VyY2UgcmVzb3VyY2UsIFVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZU1EKSB7CisKKwkJLy8gYXNzZXJ0VHJ1ZSggcmVzb3VyY2UuZ2V0Q2F0ZWdvcnkoKS5lcXVhbHMocmVzb3VyY2VNRC5nZXRDYXRlZ29yeSgpKQorCQkvLyApOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKHJlc291cmNlTUQuZ2V0RGVzY3JpcHRpb24oKSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldEljb24oKS5lcXVhbHMocmVzb3VyY2VNRC5nZXRSZXNvdXJjZUljb25QYXRoKCkpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKHJlc291cmNlTUQuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuZ2V0Q29udGFjdElkKCkuZXF1YWxzKHJlc291cmNlTUQuZ2V0Q29udGFjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCkuZXF1YWxzKHJlc291cmNlTUQuZ2V0Q29udGFjdElkKCkpKTsKKworCQkvLyBhc3NlcnRUcnVlKCByZXNvdXJjZS5pc0Fic3RyYWN0KCkgPT0KKwkJLy8gQ29uc3RhbnRzLkFCU1RSQUNUX0NBVEVHT1JZLmVxdWFscyhyZXNvdXJjZU1ELmdldENhdGVnb3J5KCkpKTsKKworCQlhc3NlcnRUcnVlKHJlc291cmNlTUQuZ2V0VGFncygpLnNpemUoKSA9PSByZXNvdXJjZS5nZXRUYWdzKCkuc2l6ZSgpKTsKKwkJZm9yIChTdHJpbmcgdGFnIDogcmVzb3VyY2UuZ2V0VGFncygpKSB7CisJCQlhc3NlcnRUcnVlKHJlc291cmNlTUQuZ2V0VGFncygpLmNvbnRhaW5zKHRhZykpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFNldENvbnN0YW50TWV0YURhdGEoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5nZXRWZXJzaW9uKCkuZXF1YWxzKEltcG9ydFV0aWxzLkNvbnN0YW50cy5GSVJTVF9DRVJUSUZJRURfVkVSU0lPTl9WRVJTSU9OKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSA9PSBJbXBvcnRVdGlscy5Db25zdGFudHMuTk9STUFUSVZFX1RZUEVfTElGRV9DWUNMRSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuaXNIaWdoZXN0VmVyc2lvbigpID09IEltcG9ydFV0aWxzLkNvbnN0YW50cy5OT1JNQVRJVkVfVFlQRV9ISUdIRVNUX1ZFUlNJT04pOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldFZlbmRvck5hbWUoKS5lcXVhbHMoSW1wb3J0VXRpbHMuQ29uc3RhbnRzLlZFTkRPUl9OQU1FKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpLmVxdWFscyhJbXBvcnRVdGlscy5Db25zdGFudHMuVkVORE9SX1JFTEVBU0UpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL1Jlc291cmNlVGVzdFV0aWxzLmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9SZXNvdXJjZVRlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9SZXNvdXJjZVRlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VUZXN0VXRpbHMgeworCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZSBwcmVwYXJlUmVzb3VyY2UoaW50IHJlc291cmNlSW5kZXgpIHsKKwkJUmVzb3VyY2UgciA9IG5ldyBSZXNvdXJjZSgpOworCQlyLnNldE5hbWUoInJlc291cmNlXyIgKyByZXNvdXJjZUluZGV4KTsKKwkJci5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24iKTsKKwkJci5zZXRWZW5kb3JOYW1lKCJ2ZW5kb3IgbmFtZSIpOworCQlyLnNldFZlbmRvclJlbGVhc2UoInZlbmRvciByZWxlYXNlIik7CisJCXIuc2V0Q29udGFjdElkKCJhczEyM3kiKTsKKwkJci5hZGRDYXRlZ29yeSgiR2VuZXJpYyIsICJJbmZyYXN0cnVjdHVyZSIpOworCQlMaXN0PFN0cmluZz4gYXJyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWFyci5hZGQoInRvc2NhLm5vZGVzLlJvb3QiKTsKKwkJci5zZXREZXJpdmVkRnJvbShhcnIpOworCQlMaXN0PFN0cmluZz4gYXJyMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlhcnIxLmFkZChyLmdldE5hbWUoKSk7CisJCXIuc2V0VGFncyhhcnIxKTsKKwkJci5zZXRJY29uKCJib3JkZXJFbGVtZW50Iik7CisJCXJldHVybiByOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgcHJlcGFyZVJlc291cmNlKGludCByZXNvdXJjZUluZGV4LCBSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSkgeworCQlSZXNvdXJjZSByID0gbmV3IFJlc291cmNlKCk7CisJCXIuc2V0TmFtZSgicmVzb3VyY2VfIiArIHJlc291cmNlSW5kZXgpOworCQlyLnNldFRvc2NhUmVzb3VyY2VOYW1lKCJyZXNvdXJjZV8iICsgcmVzb3VyY2VJbmRleCk7CisJCXIuc2V0RGVzY3JpcHRpb24oImRlc2NyaXB0aW9uIik7CisJCXIuc2V0VmVuZG9yTmFtZSgidmVuZG9yIG5hbWUiKTsKKwkJci5zZXRWZW5kb3JSZWxlYXNlKCJ2ZW5kb3IgcmVsZWFzZSIpOworCQlyLnNldENvbnRhY3RJZCgiYXMxMjN5Iik7CisJCXIuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSk7CisJCXIuYWRkQ2F0ZWdvcnkoIkdlbmVyaWMiLCAiSW5mcmFzdHJ1Y3R1cmUiKTsKKwkJTGlzdDxTdHJpbmc+IGFyciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlhcnIuYWRkKCJ0b3NjYS5ub2Rlcy5Sb290Iik7CisJCXIuc2V0RGVyaXZlZEZyb20oYXJyKTsKKwkJTGlzdDxTdHJpbmc+IGFycjEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJYXJyMS5hZGQoci5nZXROYW1lKCkpOworCQlyLnNldFRhZ3MoYXJyMSk7CisJCXIuc2V0SWNvbigiYm9yZGVyRWxlbWVudCIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlcnZpY2UgcHJlcGFyZVNlcnZpY2UoaW50IHNlcnZpY2VJbmRleCkgeworCQlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZSgpOworCQlzZXJ2aWNlLnNldE5hbWUoInNlcnZpY2VfIiArIHNlcnZpY2VJbmRleCk7CisJCXNlcnZpY2Uuc2V0RGVzY3JpcHRpb24oImRlc2MiKTsKKwkJc2VydmljZS5zZXRJY29uKCJpY29uLXNlcnZpY2UtcmVkMSIpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZChzZXJ2aWNlLmdldE5hbWUoKSk7CisJCXNlcnZpY2Uuc2V0VGFncyh0YWdzKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQljYXRlZ29yeS5zZXROYW1lKCJNb2JpbGl0eSIpOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CisJCXNlcnZpY2Uuc2V0Q2F0ZWdvcmllcyhjYXRlZ29yaWVzKTsKKwkJc2VydmljZS5zZXRDb250YWN0SWQoImFzMTIzeSIpOworCQlzZXJ2aWNlLnNldFByb2plY3RDb2RlKCIxMjM0NTYiKTsKKworCQlyZXR1cm4gc2VydmljZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL1NlcnZpY2VCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvU2VydmljZUJ1c2luZXNzTG9naWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4M2FmMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL1NlcnZpY2VCdXNpbmVzc0xvZ2ljVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuRWxlbWVudE9wZXJhdGlvbk1vY2s7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuYXBpLklBdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuaW1wbC5BdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc3BvbnNlRm9ybWF0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuU2VydmljZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuQXVkaXRDYXNzYW5kcmFEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmltcGwuQXVkaXRpbmdEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYWNoZU1hbmdlck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuR3JhcGhMb2NrT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5TZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkRpc3RyaWJ1dGlvbkRlcGxveUV2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkRpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLlJlc291cmNlQWRtaW5FdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5FU1RpbWVCYXNlZEV2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlQnVzaW5lc3NMb2dpY1Rlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlcnZpY2VCdXNpbmVzc0xvZ2ljVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0NBVEVHT1JZID0gIk1vYmlsaXR5IjsKKwlmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IE1vY2tpdG8ubW9jayhTZXJ2bGV0Q29udGV4dC5jbGFzcyk7CisJSUF1ZGl0aW5nTWFuYWdlciBpQXVkaXRpbmdNYW5hZ2VyID0gbnVsbDsKKwlVc2VyQnVzaW5lc3NMb2dpYyBtb2NrVXNlckFkbWluID0gTW9ja2l0by5tb2NrKFVzZXJCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwlmaW5hbCBTZXJ2aWNlT3BlcmF0aW9uIHNlcnZpY2VPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soU2VydmljZU9wZXJhdGlvbi5jbGFzcyk7CisJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwQ29udGV4dFdyYXBwZXIgPSBNb2NraXRvLm1vY2soV2ViQXBwQ29udGV4dFdyYXBwZXIuY2xhc3MpOworCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBDb250ZXh0ID0gTW9ja2l0by5tb2NrKFdlYkFwcGxpY2F0aW9uQ29udGV4dC5jbGFzcyk7CisJU2VydmljZUJ1c2luZXNzTG9naWMgYmwgPSBuZXcgU2VydmljZUJ1c2luZXNzTG9naWMoKTsKKwlSZXNwb25zZUZvcm1hdE1hbmFnZXIgcmVzcG9uc2VNYW5hZ2VyID0gbnVsbDsKKwlJRWxlbWVudE9wZXJhdGlvbiBtb2NrRWxlbWVudERhbzsKKwlBdWRpdGluZ01hbmFnZXIgYXVkaXRpbmdNYW5hZ2VyID0gTW9ja2l0by5tb2NrKEF1ZGl0aW5nTWFuYWdlci5jbGFzcyk7CisJQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscyA9IG5ldyBDb21wb25lbnRzVXRpbHMoKTsKKwlBdWRpdENhc3NhbmRyYURhbyBhdWRpdGluZ0RhbyA9IE1vY2tpdG8ubW9jayhBdWRpdENhc3NhbmRyYURhby5jbGFzcyk7CisJQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyBhcnRpZmFjdEJsID0gTW9ja2l0by5tb2NrKEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MpOworCUdyYXBoTG9ja09wZXJhdGlvbiBncmFwaExvY2tPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soR3JhcGhMb2NrT3BlcmF0aW9uLmNsYXNzKTsKKwlUaXRhbkdlbmVyaWNEYW8gbW9ja1RpdGFuRGFvID0gTW9ja2l0by5tb2NrKFRpdGFuR2VuZXJpY0Rhby5jbGFzcyk7CisKKwlDYWNoZU1hbmdlck9wZXJhdGlvbiBjYWNoZU1hbmFnZXIgPSBNb2NraXRvLm1vY2soQ2FjaGVNYW5nZXJPcGVyYXRpb24uY2xhc3MpOworCisJVXNlciB1c2VyID0gbnVsbDsKKwlTZXJ2aWNlIHNlcnZpY2VSZXNwb25zZSA9IG51bGw7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRJRklFRF9WRVJTSU9OID0gIjEuMCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ0VSVElGSUVEX1ZFUlNJT04gPSAiMC4yIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9OTkVUX0lEID0gIm15VW5pcXVlSWQiOworCXByaXZhdGUgc3RhdGljIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IEZJTFRFUl9NQVBfQ0VSVElGSUVEX1ZFUlNJT04gPSBuZXcgSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KCk7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gRklMVEVSX01BUF9VTkNFUlRJRklFRF9WRVJTSU9OX0NVUlIgPSBuZXcgSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KCk7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gRklMVEVSX01BUF9VTkNFUlRJRklFRF9WRVJTSU9OX1BSRVYgPSBuZXcgSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KCk7CisKKwlwdWJsaWMgU2VydmljZUJ1c2luZXNzTG9naWNUZXN0KCkgeworCisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLWJlIik7CisKKwkJLy8gSW5pdCBDb25maWd1cmF0aW9uCisJCVN0cmluZyBhcHBDb25maWdEaXIgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlIjsKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgYXBwQ29uZmlnRGlyKTsKKwkJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJLy8gRWxlbWVudHMKKwkJbW9ja0VsZW1lbnREYW8gPSBuZXcgRWxlbWVudE9wZXJhdGlvbk1vY2soKTsKKworCQkvLyBVc2VyIGRhdGEgYW5kIG1hbmFnZW1lbnQKKwkJdXNlciA9IG5ldyBVc2VyKCk7CisJCXVzZXIuc2V0VXNlcklkKCJqaDAwMDMiKTsKKwkJdXNlci5zZXRGaXJzdE5hbWUoIkppbW1pIik7CisJCXVzZXIuc2V0TGFzdE5hbWUoIkhlbmRyaXgiKTsKKwkJdXNlci5zZXRSb2xlKFJvbGUuQURNSU4ubmFtZSgpKTsKKworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJHZXRVc2VyID0gRWl0aGVyLmxlZnQodXNlcik7CisJCXdoZW4obW9ja1VzZXJBZG1pbi5nZXRVc2VyKCJqaDAwMDMiLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyR2V0VXNlcik7CisKKwkJLy8gU2VydmxldCBDb250ZXh0IGF0dHJpYnV0ZXMKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkudGhlblJldHVybihjb25maWd1cmF0aW9uTWFuYWdlcik7CisJCXdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX09QRVJBVElPTl9NQU5BR0VSKSkudGhlblJldHVybihzZXJ2aWNlT3BlcmF0aW9uKTsKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLldFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUikpLnRoZW5SZXR1cm4od2ViQXBwQ29udGV4dFdyYXBwZXIpOworCQl3aGVuKHdlYkFwcENvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoc2VydmxldENvbnRleHQpKS50aGVuUmV0dXJuKHdlYkFwcENvbnRleHQpOworCQl3aGVuKHdlYkFwcENvbnRleHQuZ2V0QmVhbihJRWxlbWVudE9wZXJhdGlvbi5jbGFzcykpLnRoZW5SZXR1cm4obW9ja0VsZW1lbnREYW8pOworCQl3aGVuKGdyYXBoTG9ja09wZXJhdGlvbi5sb2NrQ29tcG9uZW50KE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEoTm9kZVR5cGVFbnVtLlNlcnZpY2UpKSkudGhlblJldHVybihTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJd2hlbihncmFwaExvY2tPcGVyYXRpb24ubG9ja0NvbXBvbmVudEJ5TmFtZShNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmVxKE5vZGVUeXBlRW51bS5TZXJ2aWNlKSkpLnRoZW5SZXR1cm4oU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisKKwkJLy8gYXJ0aWZhY3QgYnVzc2luZXNzbG9naWMKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCQl3aGVuKGFydGlmYWN0QmwuY3JlYXRlQXJ0aWZhY3RQbGFjZUhvbGRlckluZm8oTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlNYXAoKSwgTW9ja2l0by5hbnkoVXNlci5jbGFzcyksIE1vY2tpdG8uYW55KEFydGlmYWN0R3JvdXBUeXBlRW51bS5jbGFzcykpKS50aGVuUmV0dXJuKGFydGlmYWN0RGVmKTsKKworCQkvLyBjcmVhdGVTZXJ2aWNlCisJCXNlcnZpY2VSZXNwb25zZSA9IGNyZWF0ZVNlcnZpY2VPYmplY3QodHJ1ZSk7CisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdGUgPSBFaXRoZXIubGVmdChzZXJ2aWNlUmVzcG9uc2UpOworCQl3aGVuKHNlcnZpY2VPcGVyYXRpb24uY3JlYXRlU2VydmljZShNb2NraXRvLmFueShTZXJ2aWNlLmNsYXNzKSkpLnRoZW5SZXR1cm4oZWl0aGVyQ3JlYXRlKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNvdW50ID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCXdoZW4oc2VydmljZU9wZXJhdGlvbi52YWxpZGF0ZVNlcnZpY2VOYW1lRXhpc3RzKCJTZXJ2aWNlIikpLnRoZW5SZXR1cm4oZWl0aGVyQ291bnQpOworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQ291bnRFeGlzdCA9IEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJd2hlbihzZXJ2aWNlT3BlcmF0aW9uLnZhbGlkYXRlU2VydmljZU5hbWVFeGlzdHMoImFscmVhZHlFeGlzdCIpKS50aGVuUmV0dXJuKGVpdGhlckNvdW50RXhpc3QpOworCisJCXdoZW4oc2VydmljZU9wZXJhdGlvbi52YWxpZGF0ZUNvbXBvbmVudE5hbWVFeGlzdHMoImFscmVhZHlFeGlzdCIpKS50aGVuUmV0dXJuKGVpdGhlckNvdW50RXhpc3QpOworCQl3aGVuKHNlcnZpY2VPcGVyYXRpb24udmFsaWRhdGVDb21wb25lbnROYW1lRXhpc3RzKCJTZXJ2aWNlIikpLnRoZW5SZXR1cm4oZWl0aGVyQ291bnQpOworCisJCWJsID0gbmV3IFNlcnZpY2VCdXNpbmVzc0xvZ2ljKCk7CisJCWJsLnNldEVsZW1lbnREYW8obW9ja0VsZW1lbnREYW8pOworCQlibC5zZXRVc2VyQWRtaW4obW9ja1VzZXJBZG1pbik7CisJCWJsLnNldFNlcnZpY2VPcGVyYXRpb24oc2VydmljZU9wZXJhdGlvbik7CisJCWJsLnNldEFydGlmYWN0QmwoYXJ0aWZhY3RCbCk7CisJCWJsLnNldEdyYXBoTG9ja09wZXJhdGlvbihncmFwaExvY2tPcGVyYXRpb24pOworCQlibC5zZXRUaXRhbkdlbmVyaWNEYW8obW9ja1RpdGFuRGFvKTsKKworCQljb21wb25lbnRzVXRpbHMuSW5pdCgpOworCQljb21wb25lbnRzVXRpbHMuc2V0QXVkaXRpbmdNYW5hZ2VyKGF1ZGl0aW5nTWFuYWdlcik7CisJCWJsLnNldENvbXBvbmVudHNVdGlscyhjb21wb25lbnRzVXRpbHMpOworCQlibC5zZXRDYXNzYW5kcmFBdWRpdGluZ0RhbyhhdWRpdGluZ0Rhbyk7CisJCWJsLnNldENhY2hlTWFuYWdlck9wZXJhdGlvbihjYWNoZU1hbmFnZXIpOworCisJCW1vY2tBdWRpdGluZ0Rhb0xvZ2ljKCk7CisKKwkJcmVzcG9uc2VNYW5hZ2VyID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRBdWRpdFJlY29yZHNDZXJ0aWZpZWRWZXJzaW9uKCkgeworCQlFaXRoZXI8TGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiwgUmVzcG9uc2VGb3JtYXQ+IGNvbXBvbmVudEF1ZGl0UmVjb3JkcyA9IGJsLmdldENvbXBvbmVudEF1ZGl0UmVjb3JkcyhDRVJUSUZJRURfVkVSU0lPTiwgQ09NUE9OTkVUX0lELCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0VHJ1ZShjb21wb25lbnRBdWRpdFJlY29yZHMuaXNMZWZ0KCkpOworCQlpbnQgc2l6ZSA9IGNvbXBvbmVudEF1ZGl0UmVjb3Jkcy5sZWZ0KCkudmFsdWUoKS5zaXplKCk7CisJCWFzc2VydFRydWUoc2l6ZSA9PSAzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRBdWRpdFJlY29yZHNVbkNlcnRpZmllZFZlcnNpb24oKSB7CisJCUVpdGhlcjxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+LCBSZXNwb25zZUZvcm1hdD4gY29tcG9uZW50QXVkaXRSZWNvcmRzID0gYmwuZ2V0Q29tcG9uZW50QXVkaXRSZWNvcmRzKFVOQ0VSVElGSUVEX1ZFUlNJT04sIENPTVBPTk5FVF9JRCwgdXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydFRydWUoY29tcG9uZW50QXVkaXRSZWNvcmRzLmlzTGVmdCgpKTsKKwkJaW50IHNpemUgPSBjb21wb25lbnRBdWRpdFJlY29yZHMubGVmdCgpLnZhbHVlKCkuc2l6ZSgpOworCQlhc3NlcnRUcnVlKHNpemUgPT0gMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SGFwcHlTY2VuYXJpbygpIHsKKwkJU2VydmljZSBzZXJ2aWNlID0gY3JlYXRlU2VydmljZU9iamVjdChmYWxzZSk7CisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVTZXJ2aWNlKHNlcnZpY2UsIHVzZXIpOworCisJCWlmIChjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyMDApLCBjcmVhdGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkuZ2V0U3RhdHVzKCkpOworCQl9CisJCWFzc2VydEVxdWFsc1NlcnZpY2VPYmplY3QoY3JlYXRlU2VydmljZU9iamVjdCh0cnVlKSwgY3JlYXRlUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNTZXJ2aWNlT2JqZWN0KFNlcnZpY2Ugb3JpZ1NlcnZpY2UsIFNlcnZpY2UgbmV3U2VydmljZSkgeworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0Q29udGFjdElkKCksIG5ld1NlcnZpY2UuZ2V0Q29udGFjdElkKCkpOworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpLCBuZXdTZXJ2aWNlLmdldENhdGVnb3JpZXMoKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRDcmVhdG9yVXNlcklkKCksIG5ld1NlcnZpY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENyZWF0b3JGdWxsTmFtZSgpLCBuZXdTZXJ2aWNlLmdldENyZWF0b3JGdWxsTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldERlc2NyaXB0aW9uKCksIG5ld1NlcnZpY2UuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRJY29uKCksIG5ld1NlcnZpY2UuZ2V0SWNvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldExhc3RVcGRhdGVyVXNlcklkKCksIG5ld1NlcnZpY2UuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCksIG5ld1NlcnZpY2UuZ2V0TGFzdFVwZGF0ZXJGdWxsTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldE5hbWUoKSwgbmV3U2VydmljZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0TmFtZSgpLCBuZXdTZXJ2aWNlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpLCBuZXdTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0VmVyc2lvbigpLCBuZXdTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRBcnRpZmFjdHMoKSwgbmV3U2VydmljZS5nZXRBcnRpZmFjdHMoKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRDcmVhdGlvbkRhdGUoKSwgbmV3U2VydmljZS5nZXRDcmVhdGlvbkRhdGUoKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRMYXN0VXBkYXRlRGF0ZSgpLCBuZXdTZXJ2aWNlLmdldExhc3RVcGRhdGVEYXRlKCkpOworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSwgbmV3U2VydmljZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldFRhZ3MoKSwgbmV3U2VydmljZS5nZXRUYWdzKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBhc3NlcnRSZXNwb25zZShFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMgZXhwZWN0ZWRTdGF0dXMsIFN0cmluZy4uLiB2YXJpYWJsZXMpIHsKKwkJUmVzcG9uc2VGb3JtYXQgZXhwZWN0ZWRSZXNwb25zZSA9IHJlc3BvbnNlTWFuYWdlci5nZXRSZXNwb25zZUZvcm1hdChleHBlY3RlZFN0YXR1cywgdmFyaWFibGVzKTsKKwkJUmVzcG9uc2VGb3JtYXQgYWN0dWFsUmVzcG9uc2UgPSBjcmVhdGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFJlc3BvbnNlLmdldFN0YXR1cygpLCBhY3R1YWxSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisJCWFzc2VydEVxdWFscygiYXNzZXJ0IGVycm9yIGRlc2NyaXB0aW9uIiwgZXhwZWN0ZWRSZXNwb25zZS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCksIGFjdHVhbFJlc3BvbnNlLmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CisJfQorCisJLyogQ1JFQVRFIHZhbGlkYXRpb25zIC0gc3RhcnQgKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gU2VydmljZSBuYW1lIC0gc3RhcnQKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZhaWxlZFNlcnZpY2VWYWxpZGF0aW9ucygpIHsKKwkJdGVzdFNlcnZpY2VOYW1lQWxyZWFkeUV4aXN0cygpOworCQl0ZXN0U2VydmljZU5hbWVFbXB0eSgpOworCQkvLyB0ZXN0U2VydmljZU5hbWVFeGNlZWRzTGltaXQoKTsKKwkJdGVzdFNlcnZpY2VOYW1lV3JvbmdGb3JtYXQoKTsKKwkJdGVzdFNlcnZpY2VEZXNjcmlwdGlvbkVtcHR5KCk7CisJCXRlc3RTZXJ2aWNlRGVzY3JpcHRpb25NaXNzaW5nKCk7CisJCXRlc3RTZXJ2aWNlRGVzY0V4Y2VlZHNMaW1pdENyZWF0ZSgpOworCQl0ZXN0U2VydmljZURlc2NOb3RFbmdsaXNoKCk7CisJCXRlc3RTZXJ2aWNlSWNvbkVtcHR5KCk7CisJCXRlc3RTZXJ2aWNlSWNvbk1pc3NpbmcoKTsKKwkJdGVzdFJlc291cmNlSWNvbkludmFsaWQoKTsKKwkJdGVzdFJlc291cmNlSWNvbkV4Y2VlZHNMaW1pdCgpOworCQkvLyB0ZXN0VGFnc0V4Y2VlZHNMaW1pdENyZWF0ZSgpOworCQkvLyB0ZXN0VGFnc1NpbmdsZUV4Y2Vzc0xpbWl0KCk7CisJCXRlc3RUYWdzTm9TZXJ2aWNlTmFtZSgpOworCQl0ZXN0SW52YWxpZFRhZygpOworCQl0ZXN0U2VydmljZVRhZ05vdEV4aXN0KCk7CisJCXRlc3RTZXJ2aWNlVGFnRW1wdHkoKTsKKwkJLy8gMTYxME9TIFN1cHBvcnQgLSBCZWNhdXNlIG9mIGNoYW5nZXMgaW4gdGhlIHZhbGlkYXRpb24gaW4gdGhlIHVpIHRoZXNlIHRlc3RzIHdpbGwgZmFpbC4gbmVlZCB0byBmaXggdGhlbQorCQkvL3Rlc3RDb250YWN0SWRUb29Mb25nKCk7CisJCS8vdGVzdENvbnRhY3RJZFdyb25nRm9ybWF0Q3JlYXRlKCk7CisJCXRlc3RSZXNvdXJjZUNvbnRhY3RJZE1pc3NpbmcoKTsKKwkJdGVzdFNlcnZpY2VDYXRlZ29yeUV4aXN0KCk7CisJCXRlc3RTZXJ2aWNlQmFkQ2F0ZWdvcnlDcmVhdGUoKTsKKwkJLy8gMTYxME9TIFN1cHBvcnQgLSBCZWNhdXNlIG9mIGNoYW5nZXMgaW4gdGhlIHZhbGlkYXRpb24gaW4gdGhlIHVpIHRoZXNlIHRlc3RzIHdpbGwgZmFpbC4gbmVlZCB0byBmaXggdGhlbQorCQkvL3Rlc3RJbnZhbGlkUHJvamVjdENvZGUoKTsKKwkJLy90ZXN0UHJvamVjdENvZGVUb29Mb25nKCk7CisJCS8vdGVzdFByb2plY3RDb2RlVG9vU2hvcnQoKTsKKwkJdGVzdE1pc3NpbmdQcm9qZWN0Q29kZSgpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0U2VydmljZU5hbWVBbHJlYWR5RXhpc3RzKCkgeworCQlTdHJpbmcgc2VydmljZU5hbWUgPSAiYWxyZWFkeUV4aXN0IjsKKwkJU2VydmljZSBzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQkvLyA1MSBjaGFycywgdGhlIGxpbWl0IGlzIDUwCisJCXNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0LnNldE5hbWUoc2VydmljZU5hbWUpOworCQlMaXN0PFN0cmluZz4gdGdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRncy5hZGQoc2VydmljZU5hbWUpOworCQlzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdC5zZXRUYWdzKHRncyk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4Y2NlZHNOYW1lTGltaXQsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfQUxSRUFEWV9FWElTVCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpLCBzZXJ2aWNlTmFtZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RTZXJ2aWNlTmFtZUVtcHR5KCkgeworCQlTZXJ2aWNlIHNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0ID0gY3JlYXRlU2VydmljZU9iamVjdChmYWxzZSk7CisJCXNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0LnNldE5hbWUobnVsbCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4Y2NlZHNOYW1lTGltaXQsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuTUlTU0lOR19DT01QT05FTlRfTkFNRSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFNlcnZpY2VOYW1lRXhjZWVkc0xpbWl0KCkgeworCQlTZXJ2aWNlIHNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0ID0gY3JlYXRlU2VydmljZU9iamVjdChmYWxzZSk7CisJCS8vIDUxIGNoYXJzLCB0aGUgbGltaXQgaXMgNTAKKwkJU3RyaW5nIHRvb0xvbmdTZXJ2aWNlTmFtZSA9ICJoMUtTeUpoOUVzcEk4U1B3QUd1NFZFVGZxV2VqZWFudUIxUENKQnhkc2FmZWZlZ2Vzc2UiOworCQlzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdC5zZXROYW1lKHRvb0xvbmdTZXJ2aWNlTmFtZSk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4Y2NlZHNOYW1lTGltaXQsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpLCAiIiArIFZhbGlkYXRpb25VdGlscy5DT01QT05FTlRfTkFNRV9NQVhfTEVOR1RIKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFNlcnZpY2VOYW1lV3JvbmdGb3JtYXQoKSB7CisJCVNlcnZpY2Ugc2VydmljZSA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQkvLyBjb250YWlucyA6CisJCVN0cmluZyBuYW1lV3JvbmdGb3JtYXQgPSAibGpnXGZkIjsKKwkJc2VydmljZS5zZXROYW1lKG5hbWVXcm9uZ0Zvcm1hdCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZSwgdXNlcik7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBPTkVOVF9OQU1FLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLmdldFZhbHVlKCkpOworCX0KKworCS8vIFNlcnZpY2UgbmFtZSAtIGVuZAorCS8vIFNlcnZpY2UgZGVzY3JpcHRpb24gLSBzdGFydAorCXByaXZhdGUgdm9pZCB0ZXN0U2VydmljZURlc2NyaXB0aW9uRW1wdHkoKSB7CisJCVNlcnZpY2Ugc2VydmljZUV4aXN0ID0gY3JlYXRlU2VydmljZU9iamVjdChmYWxzZSk7CisJCXNlcnZpY2VFeGlzdC5zZXREZXNjcmlwdGlvbigiIik7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04sIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RTZXJ2aWNlRGVzY3JpcHRpb25NaXNzaW5nKCkgeworCQlTZXJ2aWNlIHNlcnZpY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlzZXJ2aWNlRXhpc3Quc2V0RGVzY3JpcHRpb24obnVsbCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04sIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RTZXJ2aWNlRGVzY0V4Y2VlZHNMaW1pdENyZWF0ZSgpIHsKKwkJU2VydmljZSBzZXJ2aWNlRXhjY2Vkc0Rlc2NMaW1pdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQkvLyAxMDI1IGNoYXJzLCB0aGUgbGltaXQgaXMgMTAyNAorCQlTdHJpbmcgdG9vTG9uZ1NlcnZpY2VEZXNjID0gIjFHVU9Eb2pRMHNHektSNE5QN2U1ajgyQURRM0tIVFZPYWV6TDk1cWNidWFxRHRqWmhBUUdRM2lGd0tBeTU4MEs0V2lpWHMzdTN6cTdSelhjU0FTbDVmbTBSc1d0Q01PSURQIgorCQkJCSsgIkFPZjlUZjJ4dFh4UEN1Q0lNQ1I1d09Hbk5UYUZ4Z25KRUhBR3hpbEJoWkRnZU1OSG1DTjFyTUs1QjVJUkpPblp4Y3BjTDFOZUczQVBUQ0lNUDFsTkF4bmdZdWxEbTloZUZTQmM4VGZYQUFEcTc3MDNBdmtKVDBRUHBHcTJ6MlAiCisJCQkJKyAidGxpa2NBbklqbVdnZkM1VG03VUg0NjJCQWxUeUhnNEV4blBQTDRBTzhjOTJWckQ3a1pTZ1NxaXk3M2NOM2dMVDh1aWdrS3JVZ1hRRkdWVUZyWFZ5eVFYWXRWTTZiTEJldUNHUWY0QzJqOGxrTmc2TTBKM1BDMFB6TVJvaW5PeGsiCisJCQkJKyAiQWUydGVlQ3RWY0lqNEExS1FvMzIxMGo4cTJ2N3FRVTY5TWFic2E2RFQ5RmdFNHJjcmJpRldyZzBadG80U1hXRDNvMWVKQTlvMjlsVGc2a3h0a2xIM1R1WlRtcGk1S1ZwMU5GaFMxUnBucUY4M3R6djRtWkxLc3g3WmgxZkVnWXZSRnd4MSIKKwkJCQkrICJhcjNSb2x5RGZOb1ppR0JHVE1zWnp6N1JQRkJmMmhUbkxtTnFWR1FuSEtoaEdqMFk1czh0MmNicWJPMm5tSGlKYjl1YVVWckNHeXBnYkFjSkwzS1BPQmZBVlc4UGNwbU5qNHlWakkzTDR4NXpIam1HWmJwOXZLc2hFUU9EY3JtY2dzWUFvS3FlIgorCQkJCSsgInV1NXU3ams4WFZ4RWZRMG01cUw4VU9FclhQbEpvdlNtS1VtUDVCNVQwdzI5OXpJV0RZQ3pTb05hc0hwSGpPTURMQWlERGVIYm96VU9uOXQzUW91MDBlOVBPcTRSTU0wVm5JeDFIMzhuSm9KWnoyWEg4Q0k1WU1RZTdvVGFnYXhnUVRGMmFhMHFhcTIiCisJCQkJKyAiVjZuSnNmUkdSa2xHak5oRkZZUDJjUzRYdjJJSk85RFNYNkxUWE9tRU5yR1ZKSnZNT1pjdm5CYVpQZm9BSE4wTFU0aTFTb2VwTHp1bEl4blpCZmtVV0ZKZ1o1d1EwQmNvMkdDMUhNcXpXMjFyd3k0WEhSeFhwWGJtVzhMVnlvQTFLYm5tVm1ST3ljVTQiCisJCQkJKyAic2NUWjYySXhJY0lXQ1ZlTWpCSWNUdmlYVUxiUFV5cWxmRVBYV3I4SU1KdHBBYUVMV2d5cXVQQ2xBUkVNRHMyYjl6dEttVWVYbE1jY0ZFUzFYV2JGVHJoQkhobW1EeVZSZUVnQ3dmb2tyVUZSMTNMVFVLMWs4STZPRUhPcyI7CisKKwkJc2VydmljZUV4Y2NlZHNEZXNjTGltaXQuc2V0RGVzY3JpcHRpb24odG9vTG9uZ1NlcnZpY2VEZXNjKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlRXhjY2Vkc0Rlc2NMaW1pdCwgdXNlcik7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfREVTQ1JJUFRJT05fRVhDRUVEU19MSU1JVCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpLCAiIiArIFZhbGlkYXRpb25VdGlscy5DT01QT05FTlRfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RTZXJ2aWNlRGVzY05vdEVuZ2xpc2goKSB7CisJCVNlcnZpY2Ugbm90RW5nbGlzaCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQkvLyBOb3QgZW5nbGlzaAorCQlTdHJpbmcgdG9vTG9uZ1NlcnZpY2VEZXNjID0gIlx1QzJCNSI7CisJCW5vdEVuZ2xpc2guc2V0RGVzY3JpcHRpb24odG9vTG9uZ1NlcnZpY2VEZXNjKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShub3RFbmdsaXNoLCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0RFU0NSSVBUSU9OLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLmdldFZhbHVlKCkpOworCX0KKworCS8vIFNlcnZpY2UgZGVzY3JpcHRpb24gLSBzdG9wCisJLy8gU2VydmljZSBpY29uIC0gc3RhcnQKKwlwcml2YXRlIHZvaWQgdGVzdFNlcnZpY2VJY29uRW1wdHkoKSB7CisJCVNlcnZpY2Ugc2VydmljZUV4aXN0ID0gY3JlYXRlU2VydmljZU9iamVjdChmYWxzZSk7CisJCXNlcnZpY2VFeGlzdC5zZXRJY29uKCIiKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlRXhpc3QsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0U2VydmljZUljb25NaXNzaW5nKCkgeworCQlTZXJ2aWNlIHNlcnZpY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlzZXJ2aWNlRXhpc3Quc2V0SWNvbihudWxsKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlRXhpc3QsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19JQ09OLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VJY29uSW52YWxpZCgpIHsKKwkJU2VydmljZSByZXNvdXJjZUV4aXN0ID0gY3JlYXRlU2VydmljZU9iamVjdChmYWxzZSk7CisJCXJlc291cmNlRXhpc3Quc2V0SWNvbigia2prMzQ1M14mIik7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2UocmVzb3VyY2VFeGlzdCwgdXNlcik7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0lDT04sIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZUljb25FeGNlZWRzTGltaXQoKSB7CisJCVNlcnZpY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlyZXNvdXJjZUV4aXN0LnNldEljb24oImRzamZoc2tkZmhza2pkaGZza2pkaGtqZGhma3NoZGZrc2pzZGtmaHNkZnNkZnNkZnNmc2Rmc2YiKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShyZXNvdXJjZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lDT05fRVhDRUVEU19MSU1JVCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpLCAiIiArIFZhbGlkYXRpb25VdGlscy5JQ09OX01BWF9MRU5HVEgpOworCX0KKworCS8vIFNlcnZpY2UgaWNvbiAtIHN0b3AKKwkvLyBTZXJ2aWNlIHRhZ3MgLSBzdGFydAorCXByaXZhdGUgdm9pZCB0ZXN0VGFnc0V4Y2VlZHNMaW1pdENyZWF0ZSgpIHsKKwkJU2VydmljZSBzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlTdHJpbmcgdGFnMSA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqUSI7CisJCVN0cmluZyB0YWcyID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpXIjsKKwkJU3RyaW5nIHRhZzMgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCakUiOworCQlTdHJpbmcgdGFnNCA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqYiI7CisJCVN0cmluZyB0YWc1ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpyIjsKKwkJU3RyaW5nIHRhZzYgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamYiOworCQlTdHJpbmcgdGFnNyA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqZyI7CisJCVN0cmluZyB0YWc4ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpkIjsKKwkJU3RyaW5nIHRhZzkgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamYiOworCQlTdHJpbmcgdGFnMTAgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamciOworCQlTdHJpbmcgdGFnMTEgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamgiOworCQlTdHJpbmcgdGFnMTIgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamoiOworCQlTdHJpbmcgdGFnMTMgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamsiOworCQlTdHJpbmcgdGFnMTQgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCanMiOworCQlTdHJpbmcgdGFnMTUgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCanoiOworCQlTdHJpbmcgdGFnMTYgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCangiOworCQlTdHJpbmcgdGFnMTcgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCajIiOworCQlTdHJpbmcgdGFnMTggPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCajMiOworCQlTdHJpbmcgdGFnMTkgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCajQiOworCQlTdHJpbmcgdGFnMjAgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCajUiOworCQlTdHJpbmcgdGFnMjEgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCajAiOworCisJCUxpc3Q8U3RyaW5nPiB0YWdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzTGlzdC5hZGQodGFnMSk7CisJCXRhZ3NMaXN0LmFkZCh0YWcyKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzMpOworCQl0YWdzTGlzdC5hZGQodGFnNCk7CisJCXRhZ3NMaXN0LmFkZCh0YWc1KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzYpOworCQl0YWdzTGlzdC5hZGQodGFnNyk7CisJCXRhZ3NMaXN0LmFkZCh0YWc4KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzkpOworCQl0YWdzTGlzdC5hZGQodGFnMTApOworCQl0YWdzTGlzdC5hZGQodGFnMTEpOworCQl0YWdzTGlzdC5hZGQodGFnMTIpOworCQl0YWdzTGlzdC5hZGQodGFnMTMpOworCQl0YWdzTGlzdC5hZGQodGFnMTQpOworCQl0YWdzTGlzdC5hZGQodGFnMTUpOworCQl0YWdzTGlzdC5hZGQodGFnMTYpOworCQl0YWdzTGlzdC5hZGQodGFnMTcpOworCQl0YWdzTGlzdC5hZGQodGFnMTgpOworCQl0YWdzTGlzdC5hZGQodGFnMTkpOworCQl0YWdzTGlzdC5hZGQodGFnMjApOworCQl0YWdzTGlzdC5hZGQodGFnMjEpOworCQl0YWdzTGlzdC5hZGQoc2VydmljZUV4Y2NlZHNOYW1lTGltaXQuZ2V0TmFtZSgpKTsKKworCQlzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdC5zZXRUYWdzKHRhZ3NMaXN0KTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdCwgdXNlcik7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfVEFHU19FWENFRURfTElNSVQsICIiICsgVmFsaWRhdGlvblV0aWxzLlRBR19MSVNUX01BWF9MRU5HVEgpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RUYWdzU2luZ2xlRXhjZXNzTGltaXQoKSB7CisJCVNlcnZpY2Ugc2VydmljZUV4Y2NlZHNOYW1lTGltaXQgPSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGZhbHNlKTsKKwkJU3RyaW5nIHRhZzEgPSAiYWZ6czJxTEJiNVg2dFpoaXVua2NFd2lGWDFxUlFZOFlabDN5M0R1NU01eGVRWTVOcTlhIjsKKwkJU3RyaW5nIHRhZzIgPSBzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdC5nZXROYW1lKCk7CisJCUxpc3Q8U3RyaW5nPiB0YWdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzTGlzdC5hZGQodGFnMSk7CisJCXRhZ3NMaXN0LmFkZCh0YWcyKTsKKwkJc2VydmljZUV4Y2NlZHNOYW1lTGltaXQuc2V0VGFncyh0YWdzTGlzdCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4Y2NlZHNOYW1lTGltaXQsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULCAiIiArIFZhbGlkYXRpb25VdGlscy5UQUdfTUFYX0xFTkdUSCk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFRhZ3NOb1NlcnZpY2VOYW1lKCkgeworCQlTZXJ2aWNlIHNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0ID0gY3JlYXRlU2VydmljZU9iamVjdChmYWxzZSk7CisJCVN0cmluZyB0YWcxID0gImFmenMycUxCYiI7CisJCUxpc3Q8U3RyaW5nPiB0YWdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzTGlzdC5hZGQodGFnMSk7CisJCXNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0LnNldFRhZ3ModGFnc0xpc3QpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX1RBR1NfTk9fQ09NUF9OQU1FKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0SW52YWxpZFRhZygpIHsKKwkJU2VydmljZSBzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlTdHJpbmcgdGFnMSA9ICJhZnpzMnFMQmIlIyUiOworCQlMaXN0PFN0cmluZz4gdGFnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEpOworCQlzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdC5zZXRUYWdzKHRhZ3NMaXN0KTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdCwgdXNlcik7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX0ZJRUxEX0ZPUk1BVCwgbmV3IFN0cmluZ1tdIHsgIlNlcnZpY2UiLCAidGFnIiB9KTsKKworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0U2VydmljZVRhZ05vdEV4aXN0KCkgeworCQlTZXJ2aWNlIHNlcnZpY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlzZXJ2aWNlRXhpc3Quc2V0VGFncyhudWxsKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlRXhpc3QsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19UQUdTKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFNlcnZpY2VUYWdFbXB0eSgpIHsKKwkJU2VydmljZSBzZXJ2aWNlRXhpc3QgPSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGZhbHNlKTsKKwkJc2VydmljZUV4aXN0LnNldFRhZ3MobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VFeGlzdCwgdXNlcik7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX1RBR1MpOworCX0KKworCS8vIFNlcnZpY2UgdGFncyAtIHN0b3AKKwkvLyBTZXJ2aWNlIGNvbnRhY3RJZCAtIHN0YXJ0CisJcHJpdmF0ZSB2b2lkIHRlc3RDb250YWN0SWRUb29Mb25nKCkgeworCQlTZXJ2aWNlIHNlcnZpY2VDb250YWN0SWQgPSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGZhbHNlKTsKKwkJLy8gNyBjaGFycyBpbnN0ZWFkIG9mIDYKKwkJU3RyaW5nIGNvbnRhY3RJZFRvb0xvbmcgPSAieXJ0MTIzNCI7CisJCXNlcnZpY2VDb250YWN0SWQuc2V0Q29udGFjdElkKGNvbnRhY3RJZFRvb0xvbmcpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VDb250YWN0SWQsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVCwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdENvbnRhY3RJZFdyb25nRm9ybWF0Q3JlYXRlKCkgeworCQlTZXJ2aWNlIHNlcnZpY2VDb250YWN0SWQgPSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGZhbHNlKTsKKwkJLy8gMyBsZXR0ZXJzIGFuZCAzIGRpZ2l0cworCQlTdHJpbmcgY29udGFjdElkVG9vTG9uZyA9ICJ5cnQxMzQiOworCQlzZXJ2aWNlQ29udGFjdElkLnNldENvbnRhY3RJZChjb250YWN0SWRUb29Mb25nKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlQ29udGFjdElkLCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZUNvbnRhY3RJZE1pc3NpbmcoKSB7CisJCVNlcnZpY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlyZXNvdXJjZUV4aXN0LnNldENvbnRhY3RJZChudWxsKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShyZXNvdXJjZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJLy8gU2VydmljZSBjb250YWN0SWQgLSBzdG9wCisJLy8gU2VydmljZSBjYXRlZ29yeSAtIHN0YXJ0CisJcHJpdmF0ZSB2b2lkIHRlc3RTZXJ2aWNlQ2F0ZWdvcnlFeGlzdCgpIHsKKwkJU2VydmljZSBzZXJ2aWNlRXhpc3QgPSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGZhbHNlKTsKKwkJc2VydmljZUV4aXN0LnNldENhdGVnb3JpZXMobnVsbCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfQ0FURUdPUlksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgbWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWRUZXN0QWxyZWFkeURlcGxveWVkKCkgeworCQlTdHJpbmcgbm90aWZ5QWN0aW9uID0gIkROb3RpZnkiOworCQlTdHJpbmcgcmVxdWVzdEFjdGlvbiA9ICJEUmVxdWVzdCI7CisJCVN0cmluZyByZXN1bHRBY3Rpb24gPSAiRFJlc3VsdCI7CisJCVN0cmluZyBkaWQgPSAiMTIzNDU2IjsKKworCQlzZXR1cEJlZm9yZURlcGxveShub3RpZnlBY3Rpb24sIHJlcXVlc3RBY3Rpb24sIGRpZCk7CisJCUxpc3Q8RGlzdHJpYnV0aW9uRGVwbG95RXZlbnQ+IHJlc3VsdExpc3QgPSBuZXcgQXJyYXlMaXN0PERpc3RyaWJ1dGlvbkRlcGxveUV2ZW50PigpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlEaXN0cmlidXRpb25EZXBsb3lFdmVudCBldmVudCA9IG5ldyBEaXN0cmlidXRpb25EZXBsb3lFdmVudCgpOworCisJCWV2ZW50LnNldEFjdGlvbihyZXN1bHRBY3Rpb24pOworCQlldmVudC5zZXREaWQoZGlkKTsKKwkJZXZlbnQuc2V0U3RhdHVzKCIyMDAiKTsKKwkJLy8gRVNUaW1lQmFzZWRFdmVudCBkZXBsb3lFdmVudCA9IG5ldyBFU1RpbWVCYXNlZEV2ZW50KCk7CisJCS8vIGRlcGxveUV2ZW50LnNldEZpZWxkcyhwYXJhbXMpOworCQlyZXN1bHRMaXN0LmFkZChldmVudCk7CisJCUVpdGhlcjxMaXN0PERpc3RyaWJ1dGlvbkRlcGxveUV2ZW50PiwgQWN0aW9uU3RhdHVzPiBldmVudExpc3QgPSBFaXRoZXIubGVmdChyZXN1bHRMaXN0KTsKKworCQlNb2NraXRvLndoZW4oYXVkaXRpbmdEYW8uZ2V0RGlzdHJpYnV0aW9uRGVwbG95QnlTdGF0dXMoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5lcShyZXN1bHRBY3Rpb24pLCBNb2NraXRvLmFueVN0cmluZygpKSkudGhlblJldHVybihldmVudExpc3QpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gbWFya0RlcGxveWVkID0gYmwubWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWQoZGlkLCBkaWQsIHVzZXIpOworCQlhc3NlcnRUcnVlKG1hcmtEZXBsb3llZC5pc0xlZnQoKSk7CisKKwkJTW9ja2l0by52ZXJpZnkoYXVkaXRpbmdEYW8sIE1vY2tpdG8udGltZXMoMCkpLmdldERpc3RyaWJ1dGlvblJlcXVlc3QoZGlkLCByZXF1ZXN0QWN0aW9uKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWRUZXN0U3VjY2VzcygpIHsKKwkJU3RyaW5nIG5vdGlmeUFjdGlvbiA9ICJETm90aWZ5IjsKKwkJU3RyaW5nIHJlcXVlc3RBY3Rpb24gPSAiRFJlcXVlc3QiOworCQlTdHJpbmcgZGlkID0gIjEyMzQ1NiI7CisKKwkJc2V0dXBCZWZvcmVEZXBsb3kobm90aWZ5QWN0aW9uLCByZXF1ZXN0QWN0aW9uLCBkaWQpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gbWFya0RlcGxveWVkID0gYmwubWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWQoZGlkLCBkaWQsIHVzZXIpOworCQlhc3NlcnRUcnVlKG1hcmtEZXBsb3llZC5pc0xlZnQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1hcmtEaXN0cmlidXRpb25Bc0RlcGxveWVkVGVzdE5vdERpc3RyaWJ1dGVkKCkgeworCQlTdHJpbmcgbm90aWZ5QWN0aW9uID0gIkROb3RpZnkiOworCQlTdHJpbmcgcmVxdWVzdEFjdGlvbiA9ICJEUmVxdWVzdCI7CisJCVN0cmluZyBkaWQgPSAiMTIzNDU2IjsKKworCQlzZXR1cEJlZm9yZURlcGxveShub3RpZnlBY3Rpb24sIHJlcXVlc3RBY3Rpb24sIGRpZCk7CisJCUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiBlbXB0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQWRtaW5FdmVudD4oKTsKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiwgQWN0aW9uU3RhdHVzPiBlbXB0eUV2ZW50TGlzdCA9IEVpdGhlci5sZWZ0KGVtcHR5TGlzdCk7CisJCU1vY2tpdG8ud2hlbihhdWRpdGluZ0Rhby5nZXREaXN0cmlidXRpb25SZXF1ZXN0KE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEocmVxdWVzdEFjdGlvbikpKS50aGVuUmV0dXJuKGVtcHR5RXZlbnRMaXN0KTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbm90Rm91bmQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQlNb2NraXRvLndoZW4oc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKGRpZCkpLnRoZW5SZXR1cm4obm90Rm91bmQpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gbWFya0RlcGxveWVkID0gYmwubWFya0Rpc3RyaWJ1dGlvbkFzRGVwbG95ZWQoZGlkLCBkaWQsIHVzZXIpOworCQlhc3NlcnRUcnVlKG1hcmtEZXBsb3llZC5pc1JpZ2h0KCkpOworCQlhc3NlcnRFcXVhbHMoNDA0LCBtYXJrRGVwbG95ZWQucmlnaHQoKS52YWx1ZSgpLmdldFN0YXR1cygpLmludFZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RTZXJ2aWNlQmFkQ2F0ZWdvcnlDcmVhdGUoKSB7CisKKwkJU2VydmljZSBzZXJ2aWNlRXhpc3QgPSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGZhbHNlKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQljYXRlZ29yeS5zZXROYW1lKCJrb2tvIik7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKKwkJc2VydmljZUV4aXN0LnNldENhdGVnb3JpZXMoY2F0ZWdvcmllcyk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ0FURUdPUlksIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJLy8gU2VydmljZSBjYXRlZ29yeSAtIHN0b3AKKwlwcml2YXRlIHZvaWQgdGVzdEludmFsaWRQcm9qZWN0Q29kZSgpIHsKKworCQlTZXJ2aWNlIHNlcnZpY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlzZXJ2aWNlRXhpc3Quc2V0UHJvamVjdENvZGUoImtva28iKTsKKworCQlFaXRoZXI8U2VydmljZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlU2VydmljZShzZXJ2aWNlRXhpc3QsIHVzZXIpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ERSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RQcm9qZWN0Q29kZVRvb0xvbmcoKSB7CisKKwkJU2VydmljZSBzZXJ2aWNlRXhpc3QgPSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGZhbHNlKTsKKwkJc2VydmljZUV4aXN0LnNldFByb2plY3RDb2RlKCI1NTU1NTU1NTU1NTU1Iik7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9QUk9KRUNUX0NPREUpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UHJvamVjdENvZGVUb29TaG9ydCgpIHsKKworCQlTZXJ2aWNlIHNlcnZpY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlzZXJ2aWNlRXhpc3Quc2V0UHJvamVjdENvZGUoIjU1NSIpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VFeGlzdCwgdXNlcik7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfUFJPSkVDVF9DT0RFKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdE1pc3NpbmdQcm9qZWN0Q29kZSgpIHsKKworCQlTZXJ2aWNlIHNlcnZpY2VFeGlzdCA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCQlzZXJ2aWNlRXhpc3Quc2V0UHJvamVjdENvZGUobnVsbCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVNlcnZpY2Uoc2VydmljZUV4aXN0LCB1c2VyKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuTUlTU0lOR19QUk9KRUNUX0NPREUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlbGV0ZU1hcmtlZFNlcnZpY2VzTm9TZXJ2aWNlcygpIHsKKwkJTGlzdDxTdHJpbmc+IGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJOb1Jlc291cmNlcyA9IEVpdGhlci5sZWZ0KGlkcyk7CisJCXdoZW4oc2VydmljZU9wZXJhdGlvbi5nZXRBbGxDb21wb25lbnRzTWFya2VkRm9yRGVsZXRpb24oKSkudGhlblJldHVybihlaXRoZXJOb1Jlc291cmNlcyk7CisKKwkJRWl0aGVyPExpc3Q8U3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZU1hcmtlZFJlc291cmNlcyA9IGJsLmRlbGV0ZU1hcmtlZENvbXBvbmVudHMoKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVNYXJrZWRSZXNvdXJjZXMuaXNMZWZ0KCkpOworCQlhc3NlcnRUcnVlKGRlbGV0ZU1hcmtlZFJlc291cmNlcy5sZWZ0KCkudmFsdWUoKS5pc0VtcHR5KCkpOworCisJCU1vY2tpdG8udmVyaWZ5KGFydGlmYWN0QmwsIE1vY2tpdG8udGltZXMoMCkpLmRlbGV0ZUFsbENvbXBvbmVudEFydGlmYWN0c0lmTm90T25HcmFwaChNb2NraXRvLmFueUxpc3QoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWxldGVNYXJrZWRTZXJ2aWNlcygpIHsKKwkJTGlzdDxTdHJpbmc+IGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlTdHJpbmcgcmVzb3VyY2VJblVzZSA9ICIxMjMiOworCQlpZHMuYWRkKHJlc291cmNlSW5Vc2UpOworCQlTdHJpbmcgcmVzb3VyY2VGcmVlID0gIjQ1NiI7CisJCWlkcy5hZGQocmVzb3VyY2VGcmVlKTsKKwkJRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyTm9SZXNvdXJjZXMgPSBFaXRoZXIubGVmdChpZHMpOworCQl3aGVuKHNlcnZpY2VPcGVyYXRpb24uZ2V0QWxsQ29tcG9uZW50c01hcmtlZEZvckRlbGV0aW9uKCkpLnRoZW5SZXR1cm4oZWl0aGVyTm9SZXNvdXJjZXMpOworCisJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluVXNlUmVzcG9uc2UgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlRnJlZVJlc3BvbnNlID0gRWl0aGVyLmxlZnQoZmFsc2UpOworCisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QXJ0aWZhY3RzUmVzcG9uc2UgPSBFaXRoZXIubGVmdChhcnRpZmFjdHMpOworCQl3aGVuKHNlcnZpY2VPcGVyYXRpb24uZ2V0Q29tcG9uZW50QXJ0aWZhY3RzRm9yRGVsZXRlKHJlc291cmNlRnJlZSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHRydWUpKS50aGVuUmV0dXJuKGdldEFydGlmYWN0c1Jlc3BvbnNlKTsKKworCQl3aGVuKHNlcnZpY2VPcGVyYXRpb24uaXNDb21wb25lbnRJblVzZShyZXNvdXJjZUZyZWUpKS50aGVuUmV0dXJuKHJlc291cmNlRnJlZVJlc3BvbnNlKTsKKwkJd2hlbihzZXJ2aWNlT3BlcmF0aW9uLmlzQ29tcG9uZW50SW5Vc2UocmVzb3VyY2VJblVzZSkpLnRoZW5SZXR1cm4ocmVzb3VyY2VJblVzZVJlc3BvbnNlKTsKKworCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJEZWxldGUgPSBFaXRoZXIubGVmdChuZXcgUmVzb3VyY2UoKSk7CisJCXdoZW4oc2VydmljZU9wZXJhdGlvbi5kZWxldGVDb21wb25lbnQocmVzb3VyY2VGcmVlLCB0cnVlKSkudGhlblJldHVybihlaXRoZXJEZWxldGUpOworCisJCXdoZW4oYXJ0aWZhY3RCbC5kZWxldGVBbGxDb21wb25lbnRBcnRpZmFjdHNJZk5vdE9uR3JhcGgoYXJ0aWZhY3RzKSkudGhlblJldHVybihTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKTsKKworCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlTWFya2VkUmVzb3VyY2VzID0gYmwuZGVsZXRlTWFya2VkQ29tcG9uZW50cygpOworCQlhc3NlcnRUcnVlKGRlbGV0ZU1hcmtlZFJlc291cmNlcy5pc0xlZnQoKSk7CisJCUxpc3Q8U3RyaW5nPiByZXNvdXJjZUlkTGlzdCA9IGRlbGV0ZU1hcmtlZFJlc291cmNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RmFsc2UocmVzb3VyY2VJZExpc3QuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUlkTGlzdC5jb250YWlucyhyZXNvdXJjZUZyZWUpKTsKKwkJYXNzZXJ0RmFsc2UocmVzb3VyY2VJZExpc3QuY29udGFpbnMocmVzb3VyY2VJblVzZSkpOworCisJCU1vY2tpdG8udmVyaWZ5KGFydGlmYWN0QmwsIE1vY2tpdG8udGltZXMoMSkpLmRlbGV0ZUFsbENvbXBvbmVudEFydGlmYWN0c0lmTm90T25HcmFwaChhcnRpZmFjdHMpOworCX0KKworCXByaXZhdGUgU2VydmljZSBjcmVhdGVTZXJ2aWNlT2JqZWN0KGJvb2xlYW4gYWZ0ZXJDcmVhdGUpIHsKKwkJU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsKKwkJc2VydmljZS5zZXROYW1lKCJTZXJ2aWNlIik7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJY2F0ZWdvcnkuc2V0TmFtZShTRVJWSUNFX0NBVEVHT1JZKTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOworCQlzZXJ2aWNlLnNldENhdGVnb3JpZXMoY2F0ZWdvcmllcyk7CisKKwkJc2VydmljZS5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24iKTsKKwkJTGlzdDxTdHJpbmc+IHRncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0Z3MuYWRkKHNlcnZpY2UuZ2V0TmFtZSgpKTsKKwkJc2VydmljZS5zZXRUYWdzKHRncyk7CisJCS8vIHNlcnZpY2Uuc2V0VmVuZG9yTmFtZSgiTW90b3JvbGEiKTsKKwkJLy8gc2VydmljZS5zZXRWZW5kb3JSZWxlYXNlKCIxLjAuMCIpOworCQkvLyBzZXJ2aWNlLnNldENvbnRhY3RJZCgieWE1NDY3Iik7CisJCXNlcnZpY2Uuc2V0SWNvbigiTXlJY29uIik7CisJCS8vIHNlcnZpY2Uuc2V0U3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlzZXJ2aWNlLnNldENvbnRhY3RJZCgiYWExMjM0Iik7CisJCXNlcnZpY2Uuc2V0UHJvamVjdENvZGUoIjEyMzQ1Iik7CisKKwkJaWYgKGFmdGVyQ3JlYXRlKSB7CisJCQlzZXJ2aWNlLnNldFZlcnNpb24oIjAuMSIpOworCQkJc2VydmljZS5zZXRVbmlxdWVJZChzZXJ2aWNlLmdldE5hbWUoKSArICI6IiArIHNlcnZpY2UuZ2V0VmVyc2lvbigpKTsKKwkJCXNlcnZpY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJCXNlcnZpY2Uuc2V0Q3JlYXRvckZ1bGxOYW1lKHVzZXIuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB1c2VyLmdldExhc3ROYW1lKCkpOworCQl9CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCWxvZy5kZWJ1Zygie30iLCBnc29uLnRvSnNvbihzZXJ2aWNlKSk7CisJCXJldHVybiBzZXJ2aWNlOworCX0KKworCXByaXZhdGUgdm9pZCBtb2NrQXVkaXRpbmdEYW9Mb2dpYygpIHsKKwkJRklMVEVSX01BUF9DRVJUSUZJRURfVkVSU0lPTi5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCBDT01QT05ORVRfSUQpOworCQlGSUxURVJfTUFQX1VOQ0VSVElGSUVEX1ZFUlNJT05fQ1VSUi5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCBDT01QT05ORVRfSUQpOworCQlGSUxURVJfTUFQX1VOQ0VSVElGSUVEX1ZFUlNJT05fUFJFVi5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELCBDT01QT05ORVRfSUQpOworCisJCUZJTFRFUl9NQVBfVU5DRVJUSUZJRURfVkVSU0lPTl9DVVJSLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTiwgVU5DRVJUSUZJRURfVkVSU0lPTik7CisJCUZJTFRFUl9NQVBfVU5DRVJUSUZJRURfVkVSU0lPTl9QUkVWLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfVkVSU0lPTiwgVU5DRVJUSUZJRURfVkVSU0lPTik7CisKKwkJZmluYWwgUmVzb3VyY2VBZG1pbkV2ZW50IGNyZWF0ZVJlc291cmNlQXVkaXQgPSBuZXcgUmVzb3VyY2VBZG1pbkV2ZW50KCk7CisJCWNyZWF0ZVJlc291cmNlQXVkaXQuc2V0TW9kaWZpZXIoIkNhcmxvcyBTYW50YW5hKGNzMDAwOCkiKTsKKwkJY3JlYXRlUmVzb3VyY2VBdWRpdC5zZXRDdXJyU3RhdGUoIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKwkJY3JlYXRlUmVzb3VyY2VBdWRpdC5zZXRDdXJyVmVyc2lvbigiMC4xIik7CisJCWNyZWF0ZVJlc291cmNlQXVkaXQuc2V0U2VydmljZUluc3RhbmNlSWQoIjgyZWRkZDk5LTBiZDktNDc0Mi1hYjBhLTFiZGI1ZTI2MmEwNSIpOworCQljcmVhdGVSZXNvdXJjZUF1ZGl0LnNldFJlcXVlc3RJZCgiM2U2NWNlYTEtNzQwMy00YmM3LWI0NjEtZTI1NDRkODM3OTlmIik7CisJCWNyZWF0ZVJlc291cmNlQXVkaXQuc2V0RGVzYygiT0siKTsKKwkJY3JlYXRlUmVzb3VyY2VBdWRpdC5zZXRSZXNvdXJjZVR5cGUoIlJlc291cmNlIik7CisJCWNyZWF0ZVJlc291cmNlQXVkaXQuc2V0U3RhdHVzKCIyMDEiKTsKKwkJY3JlYXRlUmVzb3VyY2VBdWRpdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWNyZWF0ZVJlc291cmNlQXVkaXQuc2V0QWN0aW9uKCJDcmVhdGUiKTsKKwkJLy8gZmllbGRzLnB1dCgiVElNRVNUQU1QIiwgIjIwMTUtMTEtMjIgMDk6MTk6MTIuOTc3Iik7CisJCWNyZWF0ZVJlc291cmNlQXVkaXQuc2V0UHJldlN0YXRlKCIiKTsKKwkJY3JlYXRlUmVzb3VyY2VBdWRpdC5zZXRSZXNvdXJjZU5hbWUoIk15VGVzdFJlc291cmNlIik7CisJCS8vIGNyZWF0ZVJlc291cmNlQXVkaXQuc2V0RmllbGRzKGZpZWxkcyk7CisKKwkJZmluYWwgUmVzb3VyY2VBZG1pbkV2ZW50IGNoZWNrSW5SZXNvdXJjZUF1ZGl0ID0gbmV3IFJlc291cmNlQWRtaW5FdmVudCgpOworCQljaGVja0luUmVzb3VyY2VBdWRpdC5zZXRNb2RpZmllcigiQ2FybG9zIFNhbnRhbmEoY3MwMDA4KSIpOworCQljaGVja0luUmVzb3VyY2VBdWRpdC5zZXRDdXJyU3RhdGUoIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiIpOworCQljaGVja0luUmVzb3VyY2VBdWRpdC5zZXRDdXJyVmVyc2lvbigiMC4xIik7CisJCWNoZWNrSW5SZXNvdXJjZUF1ZGl0LnNldFNlcnZpY2VJbnN0YW5jZUlkKCI4MmVkZGQ5OS0wYmQ5LTQ3NDItYWIwYS0xYmRiNWUyNjJhMDUiKTsKKwkJY2hlY2tJblJlc291cmNlQXVkaXQuc2V0UmVxdWVzdElkKCJmZmFjYmY1ZC1lZWIxLTQzYzYtYTMxMC0zN2ZlN2UxY2MwOTEiKTsKKwkJY2hlY2tJblJlc291cmNlQXVkaXQuc2V0RGVzYygiT0siKTsKKwkJY2hlY2tJblJlc291cmNlQXVkaXQuc2V0Q29tbWVudCgiU3RhbSIpOworCQljaGVja0luUmVzb3VyY2VBdWRpdC5zZXRSZXNvdXJjZVR5cGUoIlJlc291cmNlIik7CisJCWNoZWNrSW5SZXNvdXJjZUF1ZGl0LnNldFN0YXR1cygiMjAwIik7CisJCWNoZWNrSW5SZXNvdXJjZUF1ZGl0LnNldFByZXZWZXJzaW9uKCIwLjEiKTsKKwkJY2hlY2tJblJlc291cmNlQXVkaXQuc2V0QWN0aW9uKCJDaGVja2luIik7CisJCS8vIGZpZWxkcy5wdXQoIlRJTUVTVEFNUCIsICIyMDE1LTExLTIyIDA5OjI1OjAzLjc5NyIpOworCQljaGVja0luUmVzb3VyY2VBdWRpdC5zZXRQcmV2U3RhdGUoIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKwkJY2hlY2tJblJlc291cmNlQXVkaXQuc2V0UmVzb3VyY2VOYW1lKCJNeVRlc3RSZXNvdXJjZSIpOworCisJCWZpbmFsIFJlc291cmNlQWRtaW5FdmVudCBjaGVja091dFJlc291cmNlQXVkaXQgPSBuZXcgUmVzb3VyY2VBZG1pbkV2ZW50KCk7CisJCWNoZWNrT3V0UmVzb3VyY2VBdWRpdC5zZXRNb2RpZmllcigiQ2FybG9zIFNhbnRhbmEoY3MwMDA4KSIpOworCQljaGVja091dFJlc291cmNlQXVkaXQuc2V0Q3VyclN0YXRlKCJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIik7CisJCWNoZWNrT3V0UmVzb3VyY2VBdWRpdC5zZXRDdXJyVmVyc2lvbigiMC4yIik7CisJCWNoZWNrT3V0UmVzb3VyY2VBdWRpdC5zZXRTZXJ2aWNlSW5zdGFuY2VJZCgiODJlZGRkOTktMGJkOS00NzQyLWFiMGEtMWJkYjVlMjYyYTA1Iik7CisJCWNoZWNrT3V0UmVzb3VyY2VBdWRpdC5zZXRSZXF1ZXN0SWQoIjdhZGQ1MDc4LTRjMTYtNGQ3NC05NjkxLWNjMTUwZTNjOTZiOCIpOworCQljaGVja091dFJlc291cmNlQXVkaXQuc2V0RGVzYygiT0siKTsKKwkJY2hlY2tPdXRSZXNvdXJjZUF1ZGl0LnNldENvbW1lbnQoIiIpOworCQljaGVja091dFJlc291cmNlQXVkaXQuc2V0UmVzb3VyY2VUeXBlKCJSZXNvdXJjZSIpOworCQljaGVja091dFJlc291cmNlQXVkaXQuc2V0U3RhdHVzKCIyMDAiKTsKKwkJY2hlY2tPdXRSZXNvdXJjZUF1ZGl0LnNldFByZXZWZXJzaW9uKCIwLjEiKTsKKwkJY2hlY2tPdXRSZXNvdXJjZUF1ZGl0LnNldEFjdGlvbigiQ2hlY2tvdXQiKTsKKwkJLy8gZmllbGRzLnB1dCgiVElNRVNUQU1QIiwgIjIwMTUtMTEtMjIgMDk6Mzk6NDEuMDI0Iik7CisJCWNoZWNrT3V0UmVzb3VyY2VBdWRpdC5zZXRQcmV2U3RhdGUoIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiIpOworCQljaGVja091dFJlc291cmNlQXVkaXQuc2V0UmVzb3VyY2VOYW1lKCJNeVRlc3RSZXNvdXJjZSIpOworCQkvLyBjaGVja091dFJlc291cmNlQXVkaXQuc2V0RmllbGRzKGZpZWxkcyk7CisKKwkJLy8gTW9ja2l0by5kb0Fuc3dlcihuZXcgQW5zd2VyPEVpdGhlcjxMaXN0PEVTVGltZUJhc2VkRXZlbnQ+LAorCQkvLyBBY3Rpb25TdGF0dXM+ID4oKSB7CisJCS8vIHB1YmxpYyBFaXRoZXI8TGlzdDxFU1RpbWVCYXNlZEV2ZW50PiwgQWN0aW9uU3RhdHVzPgorCQkvLyBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB7CisJCS8vIGZpbmFsIEVpdGhlcjxMaXN0PEVTVGltZUJhc2VkRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGVpdGhlcjsKKwkJLy8gZmluYWwgTGlzdDxFU1RpbWVCYXNlZEV2ZW50PiBsaXN0OworCQkvLyBPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJLy8gTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gZmlsdGVyTWFwID0KKwkJLy8gKE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KSBhcmdzWzBdOworCQkvLyBpZiggZmlsdGVyTWFwLmVxdWFscyhGSUxURVJfTUFQX0NFUlRJRklFRF9WRVJTSU9OKSApeworCQkvLyBsaXN0ID0gbmV3CisJCS8vIEFycmF5TGlzdDxFU1RpbWVCYXNlZEV2ZW50Pigpe3thZGQoY3JlYXRlUmVzb3VyY2VBdWRpdCk7YWRkKGNoZWNrSW5SZXNvdXJjZUF1ZGl0KTthZGQoY2hlY2tPdXRSZXNvdXJjZUF1ZGl0KTt9fTsKKwkJLy8gZWl0aGVyID0gRWl0aGVyLmxlZnQobGlzdCk7CisJCS8vCisJCS8vIH0KKwkJLy8gZWxzZSBpZiggZmlsdGVyTWFwLmVxdWFscyhGSUxURVJfTUFQX1VOQ0VSVElGSUVEX1ZFUlNJT05fUFJFVikgKXsKKwkJLy8gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RVNUaW1lQmFzZWRFdmVudD4oKTsKKwkJLy8gZWl0aGVyID0gRWl0aGVyLmxlZnQobGlzdCk7CisJCS8vIH0KKwkJLy8gZWxzZSBpZiggZmlsdGVyTWFwLmVxdWFscyhGSUxURVJfTUFQX1VOQ0VSVElGSUVEX1ZFUlNJT05fQ1VSUikgKXsKKwkJLy8gbGlzdCA9IG5ldworCQkvLyBBcnJheUxpc3Q8RVNUaW1lQmFzZWRFdmVudD4oKXt7LyphZGQoY3JlYXRlUmVzb3VyY2VBdWRpdCk7YWRkKGNoZWNrSW5SZXNvdXJjZUF1ZGl0KTsqL2FkZChjaGVja091dFJlc291cmNlQXVkaXQpO319OworCQkvLyBlaXRoZXIgPSBFaXRoZXIubGVmdChsaXN0KTsKKwkJLy8gfQorCQkvLyBlbHNleworCQkvLyBlaXRoZXIgPSBudWxsOworCQkvLyB9CisJCS8vIHJldHVybiBlaXRoZXI7CisJCS8vIH0KKwkJLy8gfSkud2hlbihhdWRpdGluZ0RhbykuZ2V0RmlsdGVyZWRSZXNvdXJjZUFkbWluQXVkaXRpbmdFdmVudHMoTW9ja2l0by5hbnlNYXAoKSk7CisJCS8vCisJCS8vCisJCUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+KCkgeworCQkJeworCQkJCWFkZChjcmVhdGVSZXNvdXJjZUF1ZGl0KTsKKwkJCQlhZGQoY2hlY2tJblJlc291cmNlQXVkaXQpOworCQkJCWFkZChjaGVja091dFJlc291cmNlQXVkaXQpOworCQkJfQorCQl9OworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KGxpc3QpOworCQlNb2NraXRvLndoZW4oYXVkaXRpbmdEYW8uZ2V0QnlTZXJ2aWNlSW5zdGFuY2VJZChNb2NraXRvLmFueVN0cmluZygpKSkudGhlblJldHVybihyZXN1bHQpOworCisJCUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiBsaXN0UHJldiA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PigpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IHJlc3VsdFByZXYgPSBFaXRoZXIubGVmdChsaXN0UHJldik7CisJCU1vY2tpdG8ud2hlbihhdWRpdGluZ0Rhby5nZXRBdWRpdEJ5U2VydmljZUlkQW5kUHJldlZlcnNpb24oTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlTdHJpbmcoKSkpLnRoZW5SZXR1cm4ocmVzdWx0UHJldik7CisKKwkJTGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+IGxpc3RDdXJyID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+KCkgeworCQkJeworCQkJCWFkZChjaGVja091dFJlc291cmNlQXVkaXQpOworCQkJfQorCQl9OworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IHJlc3VsdEN1cnIgPSBFaXRoZXIubGVmdChsaXN0Q3Vycik7CisJCU1vY2tpdG8ud2hlbihhdWRpdGluZ0Rhby5nZXRBdWRpdEJ5U2VydmljZUlkQW5kQ3VyclZlcnNpb24oTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlTdHJpbmcoKSkpLnRoZW5SZXR1cm4ocmVzdWx0Q3Vycik7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0dXBCZWZvcmVEZXBsb3koU3RyaW5nIG5vdGlmeUFjdGlvbiwgU3RyaW5nIHJlcXVlc3RBY3Rpb24sIFN0cmluZyBkaWQpIHsKKworCQlEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudCBub3RpZnlFdmVudCA9IG5ldyBEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudCgpOworCQlub3RpZnlFdmVudC5zZXRBY3Rpb24obm90aWZ5QWN0aW9uKTsKKwkJbm90aWZ5RXZlbnQuc2V0RGlkKGRpZCk7CisJCW5vdGlmeUV2ZW50LnNldFN0YXR1cygiMjAwIik7CisKKwkJUmVzb3VyY2VBZG1pbkV2ZW50IHJlcXVlc3RFdmVudCA9IG5ldyBSZXNvdXJjZUFkbWluRXZlbnQoKTsKKwkJcmVxdWVzdEV2ZW50LnNldEFjdGlvbihyZXF1ZXN0QWN0aW9uKTsKKwkJcmVxdWVzdEV2ZW50LnNldERpZChkaWQpOworCQlyZXF1ZXN0RXZlbnQuc2V0U3RhdHVzKCIyMDAiKTsKKworCQlBcnJheUxpc3Q8RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQ+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQ+KCk7CisJCUxpc3Q8RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQ+IG5vdGlmeVJlc3VsdHMgPSBhcnJheUxpc3Q7CisJCW5vdGlmeVJlc3VsdHMuYWRkKG5vdGlmeUV2ZW50KTsKKwkJRWl0aGVyPExpc3Q8RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGVpdGhlck5vdGlmeSA9IEVpdGhlci5sZWZ0KG5vdGlmeVJlc3VsdHMpOworCisJCU1vY2tpdG8ud2hlbihhdWRpdGluZ0Rhby5nZXREaXN0cmlidXRpb25Ob3RpZnkoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5lcShub3RpZnlBY3Rpb24pKSkudGhlblJldHVybihlaXRoZXJOb3RpZnkpOworCisJCUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiByZXF1ZXN0UmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PigpOworCQlyZXF1ZXN0UmVzdWx0cy5hZGQocmVxdWVzdEV2ZW50KTsKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiwgQWN0aW9uU3RhdHVzPiBlaXRoZXJSZXF1ZXN0ID0gRWl0aGVyLmxlZnQocmVxdWVzdFJlc3VsdHMpOworCQlNb2NraXRvLndoZW4oYXVkaXRpbmdEYW8uZ2V0RGlzdHJpYnV0aW9uUmVxdWVzdChNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmVxKHJlcXVlc3RBY3Rpb24pKSkudGhlblJldHVybihlaXRoZXJSZXF1ZXN0KTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU2VydmljZSA9IEVpdGhlci5sZWZ0KGNyZWF0ZVNlcnZpY2VPYmplY3QodHJ1ZSkpOworCQlNb2NraXRvLndoZW4oc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKE1vY2tpdG8uYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKGVpdGhlclNlcnZpY2UpOworCisJCUxpc3Q8RGlzdHJpYnV0aW9uRGVwbG95RXZlbnQ+IGVtcHR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8RGlzdHJpYnV0aW9uRGVwbG95RXZlbnQ+KCk7CisJCUVpdGhlcjxMaXN0PERpc3RyaWJ1dGlvbkRlcGxveUV2ZW50PiwgQWN0aW9uU3RhdHVzPiBlbXB0eUV2ZW50TGlzdCA9IEVpdGhlci5sZWZ0KGVtcHR5TGlzdCk7CisJCU1vY2tpdG8ud2hlbihhdWRpdGluZ0Rhby5nZXREaXN0cmlidXRpb25EZXBsb3lCeVN0YXR1cyhNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmVxKCJEUmVzdWx0IiksIE1vY2tpdG8uYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKGVtcHR5RXZlbnRMaXN0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ1Rlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDkzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9kaXN0cmlidXRpb24vZW5naW5lL0Rpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLkRpc3RyaWJ1dGlvbkVuZ2luZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24uQ29tcG9uZW50QXJ0aWZhY3RUeXBlc0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5DcmVhdGVUb3BpY0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5EaXN0cmlidXRpb25TdGF0dXNUb3BpY0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkZTQ29uZmlndXJhdGlvblNvdXJjZTsKKworcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ1Rlc3QgeworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1iZSIpOworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0Q29uZmlnRGlyKCJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnIik7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5saXN0ZW5Gb3JDaGFuZ2VzKCk7CisKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENvbmZpZ0RpcigpICsgRmlsZS5zZXBhcmF0b3IgKyBFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0QXBwTmFtZSgpKTsKKworCQlDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uU291cmNlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWlzc2luZ0Vudmlyb25tZW50cygpIHsKKworCQlEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGRlQ29uZmlndXJhdGlvbiA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisKKwkJU3RyaW5nIHVlYlB1YmxpY0tleSA9ICJ1ZWJQdWJsaWNLZXkiOworCQlTdHJpbmcgdWViU2VjcmV0S2V5ID0gInVlYlNlY3JldEtleSI7CisKKwkJRGlzdHJpYnV0aW9uRW5naW5lIGRpc3RyaWJ1dGlvbkVuZ2luZSA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmUoKTsKKworCQlMaXN0PFN0cmluZz4gZW52aXJvbm1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWVudmlyb25tZW50cy5hZGQoIlBST0QiKTsKKwkJZGVDb25maWd1cmF0aW9uLnNldEVudmlyb25tZW50cyhlbnZpcm9ubWVudHMpOworCisJCUxpc3Q8U3RyaW5nPiBzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXNlcnZlcnMuYWRkKCJzZXJ2ZXIxOjgwIik7CisJCXNlcnZlcnMuYWRkKCJzZXJ2ZXIyOjgwODAiKTsKKworCQlDcmVhdGVUb3BpY0NvbmZpZyBjcmVhdGVUb3BpYyA9IG5ldyBDcmVhdGVUb3BpY0NvbmZpZygpOworCQljcmVhdGVUb3BpYy5zZXRQYXJ0aXRpb25Db3VudCgxKTsKKwkJY3JlYXRlVG9waWMuc2V0UmVwbGljYXRpb25Db3VudCgxKTsKKwkJZGVDb25maWd1cmF0aW9uLnNldENyZWF0ZVRvcGljKGNyZWF0ZVRvcGljKTsKKworCQlDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnIGRpc3RyaWJOb3RpZlJlc291cmNlQXJ0aWZhY3RUeXBlcyA9IG5ldyBDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnKCk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXREaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXMoZGlzdHJpYk5vdGlmUmVzb3VyY2VBcnRpZmFjdFR5cGVzKTsKKworCQlDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnIGRpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzID0gbmV3IENvbXBvbmVudEFydGlmYWN0VHlwZXNDb25maWcoKTsKKwkJZGVDb25maWd1cmF0aW9uLnNldERpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzKGRpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzKTsKKworCQlkZUNvbmZpZ3VyYXRpb24uc2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoImRpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lIik7CisJCWRlQ29uZmlndXJhdGlvbi5zZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUoInN0YXR1c1RvcGljIik7CisKKwkJRGlzdHJpYnV0aW9uU3RhdHVzVG9waWNDb25maWcgZGlzdHJpYnV0aW9uU3RhdHVzVG9waWMgPSBuZXcgRGlzdHJpYnV0aW9uU3RhdHVzVG9waWNDb25maWcoKTsKKwkJZGlzdHJpYnV0aW9uU3RhdHVzVG9waWMuc2V0Q29uc3VtZXJHcm91cCgiYXNkYy1ncm91cCIpOworCQlkaXN0cmlidXRpb25TdGF0dXNUb3BpYy5zZXRDb25zdW1lcklkKCJhc2RjLWlkIik7CisJCWRpc3RyaWJ1dGlvblN0YXR1c1RvcGljLnNldEZldGNoVGltZVNlYygyMCk7CisJCWRpc3RyaWJ1dGlvblN0YXR1c1RvcGljLnNldFBvbGxpbmdJbnRlcnZhbFNlYygyMCk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXREaXN0cmlidXRpb25TdGF0dXNUb3BpYyhkaXN0cmlidXRpb25TdGF0dXNUb3BpYyk7CisKKwkJZGVDb25maWd1cmF0aW9uLnNldFVlYlNlcnZlcnMoc2VydmVycyk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXRVZWJQdWJsaWNLZXkodWViUHVibGljS2V5KTsKKwkJZGVDb25maWd1cmF0aW9uLnNldFVlYlNlY3JldEtleSh1ZWJTZWNyZXRLZXkpOworCQlkZUNvbmZpZ3VyYXRpb24uc2V0SW5pdE1heEludGVydmFsU2VjKDgpOworCQlkZUNvbmZpZ3VyYXRpb24uc2V0SW5pdFJldHJ5SW50ZXJ2YWxTZWMoMyk7CisKKwkJYm9vbGVhbiBpc1ZhbGlkID0gZGlzdHJpYnV0aW9uRW5naW5lLnZhbGlkYXRlQ29uZmlndXJhdGlvbihkZUNvbmZpZ3VyYXRpb24pOworCQlhc3NlcnRUcnVlKCJjaGVjayBlbXB0eSBjb25maWd1cmF0aW9uIiwgaXNWYWxpZCk7CisKKwkJZGVDb25maWd1cmF0aW9uLnNldFVlYlNlcnZlcnMobnVsbCk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydEZhbHNlKCJjaGVjayBlbXB0eSBjb25maWd1cmF0aW9uIiwgaXNWYWxpZCk7CisKKwkJZGVDb25maWd1cmF0aW9uLnNldFVlYlNlcnZlcnMoc2VydmVycyk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydFRydWUoImNoZWNrIGVtcHR5IGNvbmZpZ3VyYXRpb24iLCBpc1ZhbGlkKTsKKworCQlkZUNvbmZpZ3VyYXRpb24uc2V0RW52aXJvbm1lbnRzKG51bGwpOworCQlpc1ZhbGlkID0gZGlzdHJpYnV0aW9uRW5naW5lLnZhbGlkYXRlQ29uZmlndXJhdGlvbihkZUNvbmZpZ3VyYXRpb24pOworCQlhc3NlcnRGYWxzZSgiY2hlY2sgZW1wdHkgY29uZmlndXJhdGlvbiIsIGlzVmFsaWQpOworCisJCWRlQ29uZmlndXJhdGlvbi5zZXRFbnZpcm9ubWVudHMoZW52aXJvbm1lbnRzKTsKKwkJaXNWYWxpZCA9IGRpc3RyaWJ1dGlvbkVuZ2luZS52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oZGVDb25maWd1cmF0aW9uKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgZW1wdHkgY29uZmlndXJhdGlvbiIsIGlzVmFsaWQpOworCisJCWRlQ29uZmlndXJhdGlvbi5zZXRVZWJQdWJsaWNLZXkobnVsbCk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydEZhbHNlKCJjaGVjayBlbXB0eSBjb25maWd1cmF0aW9uIiwgaXNWYWxpZCk7CisKKwkJZGVDb25maWd1cmF0aW9uLnNldFVlYlB1YmxpY0tleSh1ZWJQdWJsaWNLZXkpOworCQlpc1ZhbGlkID0gZGlzdHJpYnV0aW9uRW5naW5lLnZhbGlkYXRlQ29uZmlndXJhdGlvbihkZUNvbmZpZ3VyYXRpb24pOworCQlhc3NlcnRUcnVlKCJjaGVjayBlbXB0eSBjb25maWd1cmF0aW9uIiwgaXNWYWxpZCk7CisKKwkJZGVDb25maWd1cmF0aW9uLnNldFVlYlNlY3JldEtleShudWxsKTsKKwkJaXNWYWxpZCA9IGRpc3RyaWJ1dGlvbkVuZ2luZS52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oZGVDb25maWd1cmF0aW9uKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIGVtcHR5IGNvbmZpZ3VyYXRpb24iLCBpc1ZhbGlkKTsKKworCQlkZUNvbmZpZ3VyYXRpb24uc2V0VWViU2VjcmV0S2V5KHVlYlB1YmxpY0tleSk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydFRydWUoImNoZWNrIGVtcHR5IGNvbmZpZ3VyYXRpb24iLCBpc1ZhbGlkKTsKKworCQlkZUNvbmZpZ3VyYXRpb24uc2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUobnVsbCk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydEZhbHNlKCJjaGVjayBlbXB0eSBjb25maWd1cmF0aW9uIiwgaXNWYWxpZCk7CisKKwkJZGVDb25maWd1cmF0aW9uLnNldERpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lKHVlYlB1YmxpY0tleSk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydFRydWUoImNoZWNrIGVtcHR5IGNvbmZpZ3VyYXRpb24iLCBpc1ZhbGlkKTsKKworCQlkZUNvbmZpZ3VyYXRpb24uc2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKG51bGwpOworCQlpc1ZhbGlkID0gZGlzdHJpYnV0aW9uRW5naW5lLnZhbGlkYXRlQ29uZmlndXJhdGlvbihkZUNvbmZpZ3VyYXRpb24pOworCQlhc3NlcnRGYWxzZSgiY2hlY2sgZW1wdHkgY29uZmlndXJhdGlvbiIsIGlzVmFsaWQpOworCisJCWRlQ29uZmlndXJhdGlvbi5zZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUodWViUHVibGljS2V5KTsKKwkJaXNWYWxpZCA9IGRpc3RyaWJ1dGlvbkVuZ2luZS52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oZGVDb25maWd1cmF0aW9uKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgZW1wdHkgY29uZmlndXJhdGlvbiIsIGlzVmFsaWQpOworCisJCWRlQ29uZmlndXJhdGlvbi5zZXRJbml0TWF4SW50ZXJ2YWxTZWMobnVsbCk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydEZhbHNlKCJjaGVjayBlbXB0eSBjb25maWd1cmF0aW9uIiwgaXNWYWxpZCk7CisKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRNYXhJbnRlcnZhbFNlYyg4KTsKKwkJaXNWYWxpZCA9IGRpc3RyaWJ1dGlvbkVuZ2luZS52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oZGVDb25maWd1cmF0aW9uKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgZW1wdHkgY29uZmlndXJhdGlvbiIsIGlzVmFsaWQpOworCisJCWRlQ29uZmlndXJhdGlvbi5zZXRJbml0UmV0cnlJbnRlcnZhbFNlYyhudWxsKTsKKwkJaXNWYWxpZCA9IGRpc3RyaWJ1dGlvbkVuZ2luZS52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oZGVDb25maWd1cmF0aW9uKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIGVtcHR5IGNvbmZpZ3VyYXRpb24iLCBpc1ZhbGlkKTsKKworCQlkZUNvbmZpZ3VyYXRpb24uc2V0SW5pdFJldHJ5SW50ZXJ2YWxTZWMoOCk7CisJCWlzVmFsaWQgPSBkaXN0cmlidXRpb25FbmdpbmUudmFsaWRhdGVDb25maWd1cmF0aW9uKGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydFRydWUoImNoZWNrIGVtcHR5IGNvbmZpZ3VyYXRpb24iLCBpc1ZhbGlkKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EaXN0cmlidXRpb25FbmdpbmVIZWFsdGhDaGVja1Rlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lSGVhbHRoQ2hlY2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhMjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lSGVhbHRoQ2hlY2tUZXN0LmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLkJhc2VDb25mRGVwZW5kZW50VGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuQ2FtYnJpYUVycm9yUmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLkNhbWJyaWFIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5EaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5VZWJIZWFsdGhDaGVja0NhbGw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LkNhbWJyaWFPcGVyYXRpb25TdGF0dXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CisKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25FbmdpbmVIZWFsdGhDaGVja1Rlc3QgZXh0ZW5kcyBCYXNlQ29uZkRlcGVuZGVudFRlc3QgeworCisJQE1vY2sKKwlwcml2YXRlIENhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyID0gTW9ja2l0by5tb2NrKENhbWJyaWFIYW5kbGVyLmNsYXNzKTsKKworCURpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGggZGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aCA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoKCk7CisKKwlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJR3NvbiBwcmV0dHlHc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCB2YWxpZGF0ZURvd25XaGVuRW52QXJlRG93bigpIHsKKwkvLworCS8vIE1hcDxTdHJpbmcsIEF0b21pY0Jvb2xlYW4+IGVudk5hbWVQZXJTdGF0dXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJLy8gZW52TmFtZVBlclN0YXR1cy5wdXQoIlBST0QxIiwgbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpKTsKKwkvLyBlbnZOYW1lUGVyU3RhdHVzLnB1dCgiUFJPRDIiLCBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSkpOworCS8vCisJLy8gZGlzdHJpYnV0aW9uRW5naW5lQ2x1c3RlckhlYWx0aC5zdGFydEhlYWx0aENoZWNrVGFzayhlbnZOYW1lUGVyU3RhdHVzKTsKKwkvLworCS8vIEhlYWx0aENoZWNrSW5mbyBoZWFsdGhDaGVja0luZm8gPQorCS8vIGRpc3RyaWJ1dGlvbkVuZ2luZUNsdXN0ZXJIZWFsdGguZ2V0SGVhbHRoQ2hlY2tJbmZvKCk7CisJLy8gYXNzZXJ0RXF1YWxzKCJ2ZXJpZnkgZG93biIsIEhlYWx0aENoZWNrU3RhdHVzLkRPV04sCisJLy8gaGVhbHRoQ2hlY2tJbmZvLmdldEhlYWx0aENoZWNrU3RhdHVzKCkpOworCS8vIGFzc2VydEVxdWFscygidmVyaWZ5IERFIGNvbXBvbmVudCIsIEhlYWx0aENoZWNrQ29tcG9uZW50LkRFLAorCS8vIGhlYWx0aENoZWNrSW5mby5nZXRIZWFsdGhDaGVja0NvbXBvbmVudCgpKTsKKwkvLworCS8vIH0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVVcFdoZW5RdWVyeVN1Y2NlZWQoKSB7CisKKwkJLy8gTWFwPFN0cmluZywgQXRvbWljQm9vbGVhbj4gZW52TmFtZVBlclN0YXR1cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJLy8gZW52TmFtZVBlclN0YXR1cy5wdXQoIlBST0QxIiwgbmV3IEF0b21pY0Jvb2xlYW4odHJ1ZSkpOworCQkvLyBlbnZOYW1lUGVyU3RhdHVzLnB1dCgiUFJPRDIiLCBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSkpOworCQkvLworCQkvLyBkaXN0cmlidXRpb25FbmdpbmVDbHVzdGVySGVhbHRoLnN0YXJ0SGVhbHRoQ2hlY2tUYXNrKGVudk5hbWVQZXJTdGF0dXMsCisJCS8vIGZhbHNlKTsKKworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhT2tSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LLCAyMDApOworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgNTAwKTsKKwkJQ2FtYnJpYUVycm9yUmVzcG9uc2UgY2FtYnJpYU5vdEVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5BVVRIRU5USUNBVElPTl9FUlJPUiwgNDAzKTsKKworCQlMaXN0PFN0cmluZz4gdWViU2VydmVycyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpLmdldFVlYlNlcnZlcnMoKTsKKwkJaWYgKHVlYlNlcnZlcnMuc2l6ZSgpID49IDIpIHsKKwkJCXdoZW4oY2FtYnJpYUhhbmRsZXIuZ2V0QXBpS2V5KE1vY2tpdG8uZXEodWViU2VydmVycy5nZXQoMCkpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpKSkudGhlblJldHVybihjYW1icmlhT2tSZXNwb25zZSk7CisJCQl3aGVuKGNhbWJyaWFIYW5kbGVyLmdldEFwaUtleShNb2NraXRvLmVxKHVlYlNlcnZlcnMuZ2V0KDEpKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSkpLnRoZW5SZXR1cm4oY2FtYnJpYU9rUmVzcG9uc2UpOworCQl9CisKKwkJVWViSGVhbHRoQ2hlY2tDYWxsIGhlYWx0aENoZWNrQ2FsbDEgPSBuZXcgVWViSGVhbHRoQ2hlY2tDYWxsKHVlYlNlcnZlcnMuZ2V0KDApLCAicHVibGljS2V5Iik7CisJCWhlYWx0aENoZWNrQ2FsbDEuc2V0Q2FtYnJpYUhhbmRsZXIoY2FtYnJpYUhhbmRsZXIpOworCQlCb29sZWFuIGNhbGwxID0gaGVhbHRoQ2hlY2tDYWxsMS5jYWxsKCk7CisJCWFzc2VydFRydWUoImNoZWNrIHJlc3BvbnNlIG9rYXkiLCBjYWxsMSk7CisKKwkJVWViSGVhbHRoQ2hlY2tDYWxsIGhlYWx0aENoZWNrQ2FsbDIgPSBuZXcgVWViSGVhbHRoQ2hlY2tDYWxsKHVlYlNlcnZlcnMuZ2V0KDEpLCAicHVibGljS2V5Iik7CisJCWhlYWx0aENoZWNrQ2FsbDIuc2V0Q2FtYnJpYUhhbmRsZXIoY2FtYnJpYUhhbmRsZXIpOworCisJCUJvb2xlYW4gY2FsbDIgPSBoZWFsdGhDaGVja0NhbGwyLmNhbGwoKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzcG9uc2Ugb2theSIsIGNhbGwyKTsKKworCQlpZiAodWViU2VydmVycy5zaXplKCkgPj0gMikgeworCQkJd2hlbihjYW1icmlhSGFuZGxlci5nZXRBcGlLZXkoTW9ja2l0by5lcSh1ZWJTZXJ2ZXJzLmdldCgwKSksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcykpKS50aGVuUmV0dXJuKGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKwkJCXdoZW4oY2FtYnJpYUhhbmRsZXIuZ2V0QXBpS2V5KE1vY2tpdG8uZXEodWViU2VydmVycy5nZXQoMSkpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpKSkudGhlblJldHVybihjYW1icmlhT2tSZXNwb25zZSk7CisJCX0KKwkJaGVhbHRoQ2hlY2tDYWxsMSA9IG5ldyBVZWJIZWFsdGhDaGVja0NhbGwodWViU2VydmVycy5nZXQoMCksICJwdWJsaWNLZXkiKTsKKwkJaGVhbHRoQ2hlY2tDYWxsMS5zZXRDYW1icmlhSGFuZGxlcihjYW1icmlhSGFuZGxlcik7CisKKwkJY2FsbDEgPSBoZWFsdGhDaGVja0NhbGwxLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIHJlc3BvbnNlIG9rYXkiLCBjYWxsMSk7CisKKwkJaGVhbHRoQ2hlY2tDYWxsMiA9IG5ldyBVZWJIZWFsdGhDaGVja0NhbGwodWViU2VydmVycy5nZXQoMSksICJwdWJsaWNLZXkiKTsKKwkJaGVhbHRoQ2hlY2tDYWxsMi5zZXRDYW1icmlhSGFuZGxlcihjYW1icmlhSGFuZGxlcik7CisKKwkJY2FsbDIgPSBoZWFsdGhDaGVja0NhbGwyLmNhbGwoKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzcG9uc2Ugb2theSIsIGNhbGwyKTsKKworCQlpZiAodWViU2VydmVycy5zaXplKCkgPj0gMikgeworCQkJd2hlbihjYW1icmlhSGFuZGxlci5nZXRBcGlLZXkoTW9ja2l0by5lcSh1ZWJTZXJ2ZXJzLmdldCgwKSksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcykpKS50aGVuUmV0dXJuKGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKwkJCXdoZW4oY2FtYnJpYUhhbmRsZXIuZ2V0QXBpS2V5KE1vY2tpdG8uZXEodWViU2VydmVycy5nZXQoMSkpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpKSkudGhlblJldHVybihjYW1icmlhTm90RXJyb3JSZXNwb25zZSk7CisJCX0KKwkJaGVhbHRoQ2hlY2tDYWxsMSA9IG5ldyBVZWJIZWFsdGhDaGVja0NhbGwodWViU2VydmVycy5nZXQoMCksICJwdWJsaWNLZXkiKTsKKwkJaGVhbHRoQ2hlY2tDYWxsMS5zZXRDYW1icmlhSGFuZGxlcihjYW1icmlhSGFuZGxlcik7CisKKwkJY2FsbDEgPSBoZWFsdGhDaGVja0NhbGwxLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIHJlc3BvbnNlIG9rYXkiLCBjYWxsMSk7CisKKwkJaGVhbHRoQ2hlY2tDYWxsMiA9IG5ldyBVZWJIZWFsdGhDaGVja0NhbGwodWViU2VydmVycy5nZXQoMSksICJwdWJsaWNLZXkiKTsKKwkJaGVhbHRoQ2hlY2tDYWxsMi5zZXRDYW1icmlhSGFuZGxlcihjYW1icmlhSGFuZGxlcik7CisKKwkJY2FsbDIgPSBoZWFsdGhDaGVja0NhbGwyLmNhbGwoKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzcG9uc2Ugb2theSIsIGNhbGwyKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvZGlzdHJpYnV0aW9uL2VuZ2luZS9EaXN0cmlidXRpb25FbmdpbmVJbml0VGFza1Rlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3Yjg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2Rpc3RyaWJ1dGlvbi9lbmdpbmUvRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2tUZXN0LmphdmEKQEAgLTAsMCArMSwyNjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5DYW1icmlhRXJyb3JSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuQ2FtYnJpYUhhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLkRpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5TdWJzY3JpYmVyVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uLkNyZWF0ZVRvcGljQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LkNhbWJyaWFPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrVGVzdCB7CisKKwlATW9jaworCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscyA9IE1vY2tpdG8ubW9jayhDb21wb25lbnRzVXRpbHMuY2xhc3MpOworCisJQE1vY2sKKwlwcml2YXRlIENhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyID0gTW9ja2l0by5tb2NrKENhbWJyaWFIYW5kbGVyLmNsYXNzKTsKKworCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgSUF1ZGl0aW5nRGFvIGlBdWRpdGluZ0RhbyA9CisJLy8gTW9ja2l0by5tb2NrKEF1ZGl0aW5nRGFvLmNsYXNzKTsKKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKwkJLy8gRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcE5hbWUoImRpc3RyaWJFbmdpbmUxIik7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLWJlIik7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRDb25maWdEaXIoInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWciKTsKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLmxpc3RlbkZvckNoYW5nZXMoKTsKKworCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcgRlNDb25maWd1cmF0aW9uU291cmNlKEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VMaXN0ZW5lcigpLCBFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q29uZmlnRGlyKCkgKyBGaWxlLnNlcGFyYXRvciArIEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRBcHBOYW1lKCkpOworCisJCUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25Tb3VyY2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tJbmNyZW1lbnQoKSB7CisKKwkJU3RyaW5nIGVudk5hbWUgPSAiUHJPRCI7CisKKwkJRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBkZUNvbmZpZ3VyYXRpb24gPSBuZXcgRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpOworCQlpbnQgcmV0cnkgPSAyOworCQlpbnQgbWF4UmV0cnkgPSA0MDsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRSZXRyeUludGVydmFsU2VjKHJldHJ5KTsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRNYXhJbnRlcnZhbFNlYyhtYXhSZXRyeSk7CisJCURpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrIGluaXRUYXNrID0gbmV3IERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrKDBsLCBkZUNvbmZpZ3VyYXRpb24sIGVudk5hbWUsIG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKSwgY29tcG9uZW50c1V0aWxzLCBudWxsKTsKKworCQlmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgeworCQkJaW5pdFRhc2suaW5jcmVtZW50UmV0cnlJbnRlcnZhbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBuZXh0IHJldHJ5IGludGVydmFsIiwgaW5pdFRhc2suZ2V0Q3VycmVudFJldHJ5SW50ZXJ2YWwoKSwgcmV0cnkgKiAobG9uZykgTWF0aC5wb3coMiwgaSkpOworCQl9CisKKwkJaW5pdFRhc2suaW5jcmVtZW50UmV0cnlJbnRlcnZhbCgpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIG5leHQgcmV0cnkgaW50ZXJ2YWwgcmVhY2ggbWF4IHJldHJ5IGludGVydmFsIiwgaW5pdFRhc2suZ2V0Q3VycmVudFJldHJ5SW50ZXJ2YWwoKSwgbWF4UmV0cnkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdEZsb3dTY2VuYXJpb1N1Y2Nlc3MoKSB7CisKKwkJU3RyaW5nIG5vdGlmVG9waWMgPSAibm90aWYiOworCQlTdHJpbmcgc3RhdHVzVG9waWMgPSAic3RhdHVzIjsKKworCQlMaXN0PFN0cmluZz4gdWViU2VydmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl1ZWJTZXJ2ZXJzLmFkZCgic2VydmVyMSIpOworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCUVpdGhlcjxTZXQ8U3RyaW5nPiwgQ2FtYnJpYUVycm9yUmVzcG9uc2U+IHJpZ2h0ID0gRWl0aGVyLnJpZ2h0KGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5nZXRUb3BpY3MoTW9ja2l0by5hbnkoTGlzdC5jbGFzcykpKS50aGVuUmV0dXJuKHJpZ2h0KTsKKworCQlTdHJpbmcgZW52TmFtZSA9ICJQck9EIjsKKworCQlEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGRlQ29uZmlndXJhdGlvbiA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXRVZWJTZXJ2ZXJzKHVlYlNlcnZlcnMpOworCQlpbnQgcmV0cnkgPSAyOworCQlpbnQgbWF4UmV0cnkgPSA0MDsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRSZXRyeUludGVydmFsU2VjKHJldHJ5KTsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRNYXhJbnRlcnZhbFNlYyhtYXhSZXRyeSk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXREaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZShub3RpZlRvcGljKTsKKwkJZGVDb25maWd1cmF0aW9uLnNldERpc3RyaWJ1dGlvblN0YXR1c1RvcGljTmFtZShzdGF0dXNUb3BpYyk7CisJCUNyZWF0ZVRvcGljQ29uZmlnIGNyZWF0ZVRvcGljID0gbmV3IENyZWF0ZVRvcGljQ29uZmlnKCk7CisJCWNyZWF0ZVRvcGljLnNldFBhcnRpdGlvbkNvdW50KDEpOworCQljcmVhdGVUb3BpYy5zZXRSZXBsaWNhdGlvbkNvdW50KDEpOworCQlkZUNvbmZpZ3VyYXRpb24uc2V0Q3JlYXRlVG9waWMoY3JlYXRlVG9waWMpOworCisJCWNhbWJyaWFFcnJvclJlc3BvbnNlID0gbmV3IENhbWJyaWFFcnJvclJlc3BvbnNlKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuT0spOworCisJCVN0cmluZyByZWFsTm90aWZUb3BpYyA9IG5vdGlmVG9waWMgKyAiLSIgKyBlbnZOYW1lLnRvVXBwZXJDYXNlKCk7CisJCVN0cmluZyByZWFsU3RhdHVzVG9waWMgPSBzdGF0dXNUb3BpYyArICItIiArIGVudk5hbWUudG9VcHBlckNhc2UoKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5jcmVhdGVUb3BpYyhNb2NraXRvLmFueShDb2xsZWN0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5lcShyZWFsTm90aWZUb3BpYyksIE1vY2tpdG8uZXEoMSksIE1vY2tpdG8uZXEoMSkpKS50aGVuUmV0dXJuKGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5jcmVhdGVUb3BpYyhNb2NraXRvLmFueShDb2xsZWN0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5lcShyZWFsU3RhdHVzVG9waWMpLCBNb2NraXRvLmVxKDEpLCBNb2NraXRvLmVxKDEpKSkudGhlblJldHVybihjYW1icmlhRXJyb3JSZXNwb25zZSk7CisKKwkJY2FtYnJpYUVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSyk7CisJCXdoZW4oY2FtYnJpYUhhbmRsZXIucmVnaXN0ZXJUb1RvcGljKE1vY2tpdG8uYW55KENvbGxlY3Rpb24uY2xhc3MpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdWJzY3JpYmVyVHlwZUVudW0uY2xhc3MpKSkKKwkJCQkudGhlblJldHVybihjYW1icmlhRXJyb3JSZXNwb25zZSk7CisKKwkJRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2sgaW5pdFRhc2sgPSBuZXcgRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2soMGwsIGRlQ29uZmlndXJhdGlvbiwgZW52TmFtZSwgbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpLCBjb21wb25lbnRzVXRpbHMsIG51bGwpOworCQlpbml0VGFzay5zZXRDYW1icmlhSGFuZGxlcihjYW1icmlhSGFuZGxlcik7CisKKwkJYm9vbGVhbiBpbml0RmxvdyA9IGluaXRUYXNrLmluaXRGbG93KCk7CisJCWFzc2VydFRydWUoImNoZWNrIGluaXQgZmxvdyBzdWNjZWVkIiwgaW5pdEZsb3cpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdEZsb3dTY2VuYXJpb1N1Y2Nlc3NUb3BpY3NBbHJlYWR5RXhpc3RzKCkgeworCisJCVN0cmluZyBlbnZOYW1lID0gIlByT0QiOworCQlTdHJpbmcgbm90aWZUb3BpYyA9ICJub3RpZiI7CisJCVN0cmluZyBzdGF0dXNUb3BpYyA9ICJzdGF0dXMiOworCisJCVN0cmluZyByZWFsTm90aWZUb3BpYyA9IG5vdGlmVG9waWMgKyAiLSIgKyBlbnZOYW1lLnRvVXBwZXJDYXNlKCk7CisJCVN0cmluZyByZWFsU3RhdHVzVG9waWMgPSBzdGF0dXNUb3BpYyArICItIiArIGVudk5hbWUudG9VcHBlckNhc2UoKTsKKworCQlTZXQ8U3RyaW5nPiB0b3BpY3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCXRvcGljcy5hZGQocmVhbE5vdGlmVG9waWMpOworCQl0b3BpY3MuYWRkKHJlYWxTdGF0dXNUb3BpYyk7CisKKwkJTGlzdDxTdHJpbmc+IHVlYlNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdWViU2VydmVycy5hZGQoInNlcnZlcjEiKTsKKwkJQ2FtYnJpYUVycm9yUmVzcG9uc2UgY2FtYnJpYUVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQlFaXRoZXI8U2V0PFN0cmluZz4sIENhbWJyaWFFcnJvclJlc3BvbnNlPiBsZWZ0ID0gRWl0aGVyLmxlZnQodG9waWNzKTsKKworCQl3aGVuKGNhbWJyaWFIYW5kbGVyLmdldFRvcGljcyhNb2NraXRvLmFueShMaXN0LmNsYXNzKSkpLnRoZW5SZXR1cm4obGVmdCk7CisKKwkJRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBkZUNvbmZpZ3VyYXRpb24gPSBuZXcgRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpOworCQlkZUNvbmZpZ3VyYXRpb24uc2V0VWViU2VydmVycyh1ZWJTZXJ2ZXJzKTsKKwkJaW50IHJldHJ5ID0gMjsKKwkJaW50IG1heFJldHJ5ID0gNDA7CisJCWRlQ29uZmlndXJhdGlvbi5zZXRJbml0UmV0cnlJbnRlcnZhbFNlYyhyZXRyeSk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXRJbml0TWF4SW50ZXJ2YWxTZWMobWF4UmV0cnkpOworCQlkZUNvbmZpZ3VyYXRpb24uc2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUobm90aWZUb3BpYyk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUoc3RhdHVzVG9waWMpOworCQlDcmVhdGVUb3BpY0NvbmZpZyBjcmVhdGVUb3BpYyA9IG5ldyBDcmVhdGVUb3BpY0NvbmZpZygpOworCQljcmVhdGVUb3BpYy5zZXRQYXJ0aXRpb25Db3VudCgxKTsKKwkJY3JlYXRlVG9waWMuc2V0UmVwbGljYXRpb25Db3VudCgxKTsKKwkJZGVDb25maWd1cmF0aW9uLnNldENyZWF0ZVRvcGljKGNyZWF0ZVRvcGljKTsKKworCQljYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5yZWdpc3RlclRvVG9waWMoTW9ja2l0by5hbnkoQ29sbGVjdGlvbi5jbGFzcyksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcyksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcyksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcyksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcyksIE1vY2tpdG8uYW55KFN1YnNjcmliZXJUeXBlRW51bS5jbGFzcykpKQorCQkJCS50aGVuUmV0dXJuKGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKworCQlEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzayBpbml0VGFzayA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzaygwbCwgZGVDb25maWd1cmF0aW9uLCBlbnZOYW1lLCBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSksIGNvbXBvbmVudHNVdGlscywgbnVsbCk7CisJCWluaXRUYXNrLnNldENhbWJyaWFIYW5kbGVyKGNhbWJyaWFIYW5kbGVyKTsKKworCQl0cnkgeworCQkJYm9vbGVhbiBpbml0RmxvdyA9IGluaXRUYXNrLmluaXRGbG93KCk7CisJCQlhc3NlcnRUcnVlKCJjaGVjayBpbml0IGZsb3cgc3VjY2VlZCIsIGluaXRGbG93KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWFzc2VydFRydWUoIlNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIiwgZmFsc2UpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbml0Rmxvd1NjZW5hcmlvRmFpbFRvUmVnaXN0ZXIoKSB7CisKKwkJU3RyaW5nIG5vdGlmVG9waWMgPSAibm90aWYiOworCQlTdHJpbmcgc3RhdHVzVG9waWMgPSAic3RhdHVzIjsKKworCQlMaXN0PFN0cmluZz4gdWViU2VydmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQl1ZWJTZXJ2ZXJzLmFkZCgic2VydmVyMSIpOworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBjYW1icmlhRXJyb3JSZXNwb25zZSA9IG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCUVpdGhlcjxTZXQ8U3RyaW5nPiwgQ2FtYnJpYUVycm9yUmVzcG9uc2U+IHJpZ2h0ID0gRWl0aGVyLnJpZ2h0KGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5nZXRUb3BpY3MoTW9ja2l0by5hbnkoTGlzdC5jbGFzcykpKS50aGVuUmV0dXJuKHJpZ2h0KTsKKworCQlTdHJpbmcgZW52TmFtZSA9ICJQck9EIjsKKworCQlEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGRlQ29uZmlndXJhdGlvbiA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXRVZWJTZXJ2ZXJzKHVlYlNlcnZlcnMpOworCQlpbnQgcmV0cnkgPSAyOworCQlpbnQgbWF4UmV0cnkgPSA0MDsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRSZXRyeUludGVydmFsU2VjKHJldHJ5KTsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRNYXhJbnRlcnZhbFNlYyhtYXhSZXRyeSk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXREaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZShub3RpZlRvcGljKTsKKwkJZGVDb25maWd1cmF0aW9uLnNldERpc3RyaWJ1dGlvblN0YXR1c1RvcGljTmFtZShzdGF0dXNUb3BpYyk7CisJCUNyZWF0ZVRvcGljQ29uZmlnIGNyZWF0ZVRvcGljID0gbmV3IENyZWF0ZVRvcGljQ29uZmlnKCk7CisJCWNyZWF0ZVRvcGljLnNldFBhcnRpdGlvbkNvdW50KDEpOworCQljcmVhdGVUb3BpYy5zZXRSZXBsaWNhdGlvbkNvdW50KDEpOworCQlkZUNvbmZpZ3VyYXRpb24uc2V0Q3JlYXRlVG9waWMoY3JlYXRlVG9waWMpOworCisJCWNhbWJyaWFFcnJvclJlc3BvbnNlID0gbmV3IENhbWJyaWFFcnJvclJlc3BvbnNlKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuT0spOworCisJCVN0cmluZyByZWFsTm90aWZUb3BpYyA9IG5vdGlmVG9waWMgKyAiLSIgKyBlbnZOYW1lLnRvVXBwZXJDYXNlKCk7CisJCVN0cmluZyByZWFsU3RhdHVzVG9waWMgPSBzdGF0dXNUb3BpYyArICItIiArIGVudk5hbWUudG9VcHBlckNhc2UoKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5jcmVhdGVUb3BpYyhNb2NraXRvLmFueShDb2xsZWN0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5lcShyZWFsTm90aWZUb3BpYyksIE1vY2tpdG8uZXEoMSksIE1vY2tpdG8uZXEoMSkpKS50aGVuUmV0dXJuKGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5jcmVhdGVUb3BpYyhNb2NraXRvLmFueShDb2xsZWN0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5hbnkoU3RyaW5nLmNsYXNzKSwgTW9ja2l0by5lcShyZWFsU3RhdHVzVG9waWMpLCBNb2NraXRvLmVxKDEpLCBNb2NraXRvLmVxKDEpKSkudGhlblJldHVybihjYW1icmlhRXJyb3JSZXNwb25zZSk7CisKKwkJd2hlbihjYW1icmlhSGFuZGxlci5yZWdpc3RlclRvVG9waWMoTW9ja2l0by5hbnkoQ29sbGVjdGlvbi5jbGFzcyksIE1vY2tpdG8uZXEocmVhbE5vdGlmVG9waWMpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdWJzY3JpYmVyVHlwZUVudW0uY2xhc3MpKSkKKwkJCQkudGhlblJldHVybihuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSykpOworCisJCXdoZW4oY2FtYnJpYUhhbmRsZXIucmVnaXN0ZXJUb1RvcGljKE1vY2tpdG8uYW55KENvbGxlY3Rpb24uY2xhc3MpLCBNb2NraXRvLmVxKHJlYWxTdGF0dXNUb3BpYyksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcyksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcyksIE1vY2tpdG8uYW55KFN0cmluZy5jbGFzcyksIE1vY2tpdG8uYW55KFN1YnNjcmliZXJUeXBlRW51bS5jbGFzcykpKQorCQkJCS50aGVuUmV0dXJuKG5ldyBDYW1icmlhRXJyb3JSZXNwb25zZShDYW1icmlhT3BlcmF0aW9uU3RhdHVzLkNPTk5ORUNUSU9OX0VSUk9SKSk7CisKKwkJRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2sgaW5pdFRhc2sgPSBuZXcgRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2soMGwsIGRlQ29uZmlndXJhdGlvbiwgZW52TmFtZSwgbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpLCBjb21wb25lbnRzVXRpbHMsIG51bGwpOworCQlpbml0VGFzay5zZXRDYW1icmlhSGFuZGxlcihjYW1icmlhSGFuZGxlcik7CisKKwkJYm9vbGVhbiBpbml0RmxvdyA9IGluaXRUYXNrLmluaXRGbG93KCk7CisJCWFzc2VydEZhbHNlKCJjaGVjayBpbml0IGZsb3cgZmFpbGVkIiwgaW5pdEZsb3cpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdEZsb3dTY2VuYXJpbzFHZXRUb3BpY3NGYWlsZWQoKSB7CisKKwkJTGlzdDxTdHJpbmc+IHVlYlNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdWViU2VydmVycy5hZGQoInNlcnZlcjEiKTsKKwkJQ2FtYnJpYUVycm9yUmVzcG9uc2UgY2FtYnJpYUVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5DT05OTkVDVElPTl9FUlJPUik7CisJCUVpdGhlcjxTZXQ8U3RyaW5nPiwgQ2FtYnJpYUVycm9yUmVzcG9uc2U+IHJpZ2h0ID0gRWl0aGVyLnJpZ2h0KGNhbWJyaWFFcnJvclJlc3BvbnNlKTsKKwkJd2hlbihjYW1icmlhSGFuZGxlci5nZXRUb3BpY3MoTW9ja2l0by5hbnkoTGlzdC5jbGFzcykpKS50aGVuUmV0dXJuKHJpZ2h0KTsKKworCQlTdHJpbmcgZW52TmFtZSA9ICJQck9EIjsKKworCQlEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uIGRlQ29uZmlndXJhdGlvbiA9IG5ldyBEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisJCWRlQ29uZmlndXJhdGlvbi5zZXRVZWJTZXJ2ZXJzKHVlYlNlcnZlcnMpOworCQlpbnQgcmV0cnkgPSAyOworCQlpbnQgbWF4UmV0cnkgPSA0MDsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRSZXRyeUludGVydmFsU2VjKHJldHJ5KTsKKwkJZGVDb25maWd1cmF0aW9uLnNldEluaXRNYXhJbnRlcnZhbFNlYyhtYXhSZXRyeSk7CisJCURpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrIGluaXRUYXNrID0gbmV3IERpc3RyaWJ1dGlvbkVuZ2luZUluaXRUYXNrKDBsLCBkZUNvbmZpZ3VyYXRpb24sIGVudk5hbWUsIG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKSwgY29tcG9uZW50c1V0aWxzLCBudWxsKTsKKwkJaW5pdFRhc2suc2V0Q2FtYnJpYUhhbmRsZXIoY2FtYnJpYUhhbmRsZXIpOworCisJCWJvb2xlYW4gaW5pdEZsb3cgPSBpbml0VGFzay5pbml0RmxvdygpOworCQlhc3NlcnRGYWxzZSgiY2hlY2sgaW5pdCBmbG93IGZhaWxlZCIsIGluaXRGbG93KTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9BcnRpZmFjdEJ1c2luZXNzTG9naWNUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0FydGlmYWN0QnVzaW5lc3NMb2dpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA1YjhjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9BcnRpZmFjdEJ1c2luZXNzTG9naWNUZXN0LmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5JbmplY3RNb2NrczsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3RUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkludGVyZmFjZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklVc2VyQWRtaW5PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuUmVwcmVzZW50YXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RCdXNpbmVzc0xvZ2ljVGVzdCB7CisKKwlzdGF0aWMgQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZSIpOworCXN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uU291cmNlKTsKKworCUBJbmplY3RNb2NrcworCXN0YXRpYyBBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljIGFydGlmYWN0QkwgPSBuZXcgQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYygpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBBcnRpZmFjdE9wZXJhdGlvbiBhcnRpZmFjdE9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhBcnRpZmFjdE9wZXJhdGlvbi5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzID0gTW9ja2l0by5tb2NrKENvbXBvbmVudHNVdGlscy5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGxpZmVjeWNsZU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhJSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElVc2VyQWRtaW5PcGVyYXRpb24gdXNlck9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhJVXNlckFkbWluT3BlcmF0aW9uLmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soSUVsZW1lbnRPcGVyYXRpb24uY2xhc3MpOworCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgSW5mb3JtYXRpb25EZXBsb3llZEFydGlmYWN0c0J1c2luZXNzTG9naWMKKwkvLyBpbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyA9CisJLy8gTW9ja2l0by5tb2NrKEluZm9ybWF0aW9uRGVwbG95ZWRBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSBNb2NraXRvLm1vY2soUmVzb3VyY2UuY2xhc3MpOworCXByaXZhdGUgR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHsKKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBOb3RGb3VuZFJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCXdoZW4oYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RCeUlkKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihOb3RGb3VuZFJlc3VsdCk7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IE5vdEZvdW5kUmVzdWx0MiA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCXdoZW4oYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RzKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEoTm9kZVR5cGVFbnVtLlNlcnZpY2UpLCBNb2NraXRvLmFueUJvb2xlYW4oKSkpLnRoZW5SZXR1cm4oTm90Rm91bmRSZXN1bHQyKTsKKwkJd2hlbihhcnRpZmFjdE9wZXJhdGlvbi5nZXRBcnRpZmFjdHMoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5lcShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCBNb2NraXRvLmFueUJvb2xlYW4oKSkpLnRoZW5SZXR1cm4oTm90Rm91bmRSZXN1bHQyKTsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG5vdEZvdW5kSW50ZXJmYWNlcyA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCXdoZW4obGlmZWN5Y2xlT3BlcmF0aW9uLmdldEFsbEludGVyZmFjZXNPZlJlc291cmNlKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihub3RGb3VuZEludGVyZmFjZXMpOworCisJCVVzZXIgdXNlckpIID0gbmV3IFVzZXIoIkpvaG4iLCAiRG9oIiwgImpoMDAwMyIsICJqaDAwMDNAZ21haWwuY29tIiwgIkFETUlOIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyUmVzdWx0ID0gRWl0aGVyLmxlZnQodXNlckpIKTsKKworCQl3aGVuKHVzZXJPcGVyYXRpb24uZ2V0VXNlckRhdGEoImpoMDAwMyIsIGZhbHNlKSkudGhlblJldHVybihnZXRVc2VyUmVzdWx0KTsKKworCQlFaXRoZXI8TGlzdDxBcnRpZmFjdFR5cGU+LCBBY3Rpb25TdGF0dXM+IGdldFR5cGUgPSBFaXRoZXIubGVmdChnZXRBbGxUeXBlcygpKTsKKwkJd2hlbihlbGVtZW50T3BlcmF0aW9uLmdldEFsbEFydGlmYWN0VHlwZXMoKSkudGhlblJldHVybihnZXRUeXBlKTsKKworCQl3aGVuKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKS50aGVuUmV0dXJuKFJlc291cmNlVHlwZUVudW0uVkZDKTsKKwkJLy8gd2hlbihpbmZvcm1hdGlvbkRlcGxveWVkQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy5nZXRBbGxEZXBsb3lhYmxlQXJ0aWZhY3RzKE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSkpLnRoZW5SZXR1cm4obmV3CisJCS8vIEFycmF5TGlzdDxBcnRpZmFjdERlZmluaXRpb24+KCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIExpc3Q8QXJ0aWZhY3RUeXBlPiBnZXRBbGxUeXBlcygpIHsKKwkJTGlzdDxBcnRpZmFjdFR5cGU+IGFydGlmYWN0VHlwZXMgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0VHlwZT4oKTsKKwkJTGlzdDxTdHJpbmc+IGFydGlmYWN0VHlwZXNMaXN0ID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0QXJ0aWZhY3RUeXBlcygpOworCQlmb3IgKFN0cmluZyBhcnRpZmFjdFR5cGUgOiBhcnRpZmFjdFR5cGVzTGlzdCkgeworCQkJQXJ0aWZhY3RUeXBlIGFydGlmYWN0VCA9IG5ldyBBcnRpZmFjdFR5cGUoKTsKKwkJCWFydGlmYWN0VC5zZXROYW1lKGFydGlmYWN0VHlwZSk7CisJCQlhcnRpZmFjdFR5cGVzLmFkZChhcnRpZmFjdFQpOworCQl9CisJCXJldHVybiBhcnRpZmFjdFR5cGVzOworCX0KKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBpbml0TW9ja3MoKSB7CisJCU1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRKc29uKCkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYWQgPSBjcmVhdGVBcnRpZmFjdERlZigpOworCisJCVN0cmluZyBqc29uQXJ0aWZhY3QgPSBnc29uLnRvSnNvbihhZCk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFmdGVyQ29udmVydCA9IFJlcHJlc2VudGF0aW9uVXRpbHMuY29udmVydEpzb25Ub0FydGlmYWN0RGVmaW5pdGlvbihqc29uQXJ0aWZhY3QsIEFydGlmYWN0RGVmaW5pdGlvbi5jbGFzcyk7CisJCWFzc2VydEVxdWFscyhhZCwgYWZ0ZXJDb252ZXJ0KTsKKwl9CisKKwlwcml2YXRlIEFydGlmYWN0RGVmaW5pdGlvbiBjcmVhdGVBcnRpZmFjdERlZigpIHsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFkID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCQlhZC5zZXRBcnRpZmFjdE5hbWUoImFydGlmYWN0MS55YW1sIik7CisJCWFkLnNldEFydGlmYWN0TGFiZWwoImxhYmVsMSIpOworCQlhZC5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24iKTsKKwkJYWQuc2V0QXJ0aWZhY3RUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworCQlhZC5zZXRBcnRpZmFjdEdyb3VwVHlwZShBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCk7CisJCWFkLnNldENyZWF0aW9uRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCWFkLnNldE1hbmRhdG9yeShmYWxzZSk7CisJCWFkLnNldFRpbWVvdXQoMTUpOworCQlyZXR1cm4gYWQ7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFN0cmluZ0dyb3VwVHlwZSgpIHsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFkID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCQlhZC5zZXRBcnRpZmFjdE5hbWUoImFydGlmYWN0MSIpOworCQlhZC5zZXRDcmVhdGlvbkRhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQlhZC5zZXRNYW5kYXRvcnkoZmFsc2UpOworCQlhZC5zZXRUaW1lb3V0KDE1KTsKKworCQlKc29uRWxlbWVudCBqc29uQXJ0aWZhY3QgPSBnc29uLnRvSnNvblRyZWUoYWQpOworCQlqc29uQXJ0aWZhY3QuZ2V0QXNKc29uT2JqZWN0KCkuYWRkUHJvcGVydHkoImFydGlmYWN0R3JvdXBUeXBlIiwgInd3dyIpOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhZnRlckNvbnZlcnQgPSBSZXByZXNlbnRhdGlvblV0aWxzLmNvbnZlcnRKc29uVG9BcnRpZmFjdERlZmluaXRpb24oanNvbkFydGlmYWN0LnRvU3RyaW5nKCksIEFydGlmYWN0RGVmaW5pdGlvbi5jbGFzcyk7CisJCWFzc2VydE51bGwoYWZ0ZXJDb252ZXJ0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTnVtYmVyR3JvdXBUeXBlKCkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYWQgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJCWFkLnNldEFydGlmYWN0TmFtZSgiYXJ0aWZhY3QxIik7CisJCWFkLnNldENyZWF0aW9uRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCWFkLnNldE1hbmRhdG9yeShmYWxzZSk7CisJCWFkLnNldFRpbWVvdXQoMTUpOworCisJCUpzb25FbGVtZW50IGpzb25BcnRpZmFjdCA9IGdzb24udG9Kc29uVHJlZShhZCk7CisJCWpzb25BcnRpZmFjdC5nZXRBc0pzb25PYmplY3QoKS5hZGRQcm9wZXJ0eSgiYXJ0aWZhY3RHcm91cFR5cGUiLCAxMjMpOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhZnRlckNvbnZlcnQgPSBSZXByZXNlbnRhdGlvblV0aWxzLmNvbnZlcnRKc29uVG9BcnRpZmFjdERlZmluaXRpb24oanNvbkFydGlmYWN0LnRvU3RyaW5nKCksIEFydGlmYWN0RGVmaW5pdGlvbi5jbGFzcyk7CisJCWFzc2VydE51bGwoYWZ0ZXJDb252ZXJ0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkR3JvdXBUeXBlV2l0aFNwYWNlKCkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYWQgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJCWFkLnNldEFydGlmYWN0TmFtZSgiYXJ0aWZhY3QxIik7CisJCWFkLnNldENyZWF0aW9uRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCWFkLnNldE1hbmRhdG9yeShmYWxzZSk7CisJCWFkLnNldFRpbWVvdXQoMTUpOworCisJCUpzb25FbGVtZW50IGpzb25BcnRpZmFjdCA9IGdzb24udG9Kc29uVHJlZShhZCk7CisJCWpzb25BcnRpZmFjdC5nZXRBc0pzb25PYmplY3QoKS5hZGRQcm9wZXJ0eSgiYXJ0aWZhY3RHcm91cFR5cGUiLCAiIERFUExPWU1FTlQiKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYWZ0ZXJDb252ZXJ0ID0gUmVwcmVzZW50YXRpb25VdGlscy5jb252ZXJ0SnNvblRvQXJ0aWZhY3REZWZpbml0aW9uKGpzb25BcnRpZmFjdC50b1N0cmluZygpLCBBcnRpZmFjdERlZmluaXRpb24uY2xhc3MpOworCQlhc3NlcnROdWxsKGFmdGVyQ29udmVydCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRpbWVvdXRXaXRoU3BhY2UoKSB7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhZCA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oKTsKKwkJYWQuc2V0QXJ0aWZhY3ROYW1lKCJhcnRpZmFjdDEiKTsKKwkJYWQuc2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpOworCQlhZC5zZXRDcmVhdGlvbkRhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQlhZC5zZXRNYW5kYXRvcnkoZmFsc2UpOworCisJCUpzb25FbGVtZW50IGpzb25BcnRpZmFjdCA9IGdzb24udG9Kc29uVHJlZShhZCk7CisJCWpzb25BcnRpZmFjdC5nZXRBc0pzb25PYmplY3QoKS5hZGRQcm9wZXJ0eSgidGltZW91dCIsICIgMTUiKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYWZ0ZXJDb252ZXJ0ID0gUmVwcmVzZW50YXRpb25VdGlscy5jb252ZXJ0SnNvblRvQXJ0aWZhY3REZWZpbml0aW9uKGpzb25BcnRpZmFjdC50b1N0cmluZygpLCBBcnRpZmFjdERlZmluaXRpb24uY2xhc3MpOworCQlhc3NlcnROdWxsKGFmdGVyQ29udmVydCk7CisJfQorCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBjb252ZXJ0QW5kVmFsaWRhdGVEZXBsb3ltZW50QXJ0aWZhY3ROb25IZWF0U3VjY2VzcygpeworCS8vIEFydGlmYWN0RGVmaW5pdGlvbiBjcmVhdGVBcnRpZmFjdERlZiA9IGNyZWF0ZUFydGlmYWN0RGVmKCk7CisJLy8gY3JlYXRlQXJ0aWZhY3REZWYuc2V0QXJ0aWZhY3RUeXBlKEFydGlmYWN0VHlwZUVudW0uWUFOR19YTUwuZ2V0VHlwZSgpKTsKKwkvLworCS8vIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVJlc3VsdCA9IGFydGlmYWN0QkwKKwkvLyAuY29udmVydEFuZFZhbGlkYXRlKHJlc291cmNlLCAicmVzb3VyY2VJZCIsCisJLy8gZ3Nvbi50b0pzb24oY3JlYXRlQXJ0aWZhY3REZWYpLCAiamgwMDAzIiwgbnVsbCwgbnVsbCwgdHJ1ZSwKKwkvLyBudWxsLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCS8vCisJLy8gYXNzZXJ0VHJ1ZSh2YWxpZGF0ZVJlc3VsdC5pc0xlZnQoKSk7CisJLy8gQXJ0aWZhY3REZWZpbml0aW9uIHZhbGlkYXRlZEFydGlmYWN0ID0gdmFsaWRhdGVSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJLy8KKwkvLyBhc3NlcnRFcXVhbHMoY3JlYXRlQXJ0aWZhY3REZWYuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSwKKwkvLyB2YWxpZGF0ZWRBcnRpZmFjdC5nZXRBcnRpZmFjdEdyb3VwVHlwZSgpKTsKKwkvLyBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHZhbGlkYXRlZEFydGlmYWN0LmdldFRpbWVvdXQoKSk7CisJLy8gYXNzZXJ0RmFsc2UodmFsaWRhdGVkQXJ0aWZhY3QuZ2V0TWFuZGF0b3J5KCkpOworCS8vIGFzc2VydEZhbHNlKHZhbGlkYXRlZEFydGlmYWN0LmdldFNlcnZpY2VBcGkoKSk7CisJLy8KKwkvLyB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlclRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ2FwYWJpbGl0eVR5cGVJbXBvcnRNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmZlODgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NhcGFiaWxpdHlUeXBlSW1wb3J0TWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uSW5qZWN0TW9ja3M7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLm1vY2tpdG8uaW52b2NhdGlvbi5JbnZvY2F0aW9uT25Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLnN0dWJiaW5nLkFuc3dlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuQ2FwYWJpbGl0eVR5cGVJbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Db21tb25JbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5DYXBhYmlsaXR5VHlwZU5hbWVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVR5cGVJbXBvcnRNYW5hZ2VyVGVzdCB7CisJQEluamVjdE1vY2tzCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXIgbWFuYWdlciA9IG5ldyBDYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXIoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1vbkltcG9ydE1hbmFnZXIgY29tbW9uSW1wb3J0TWFuYWdlciA9IE1vY2tpdG8ubW9jayhDb21tb25JbXBvcnRNYW5hZ2VyLmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENhcGFiaWxpdHlUeXBlT3BlcmF0aW9uIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uID0gTW9ja2l0by5tb2NrKENhcGFiaWxpdHlUeXBlT3BlcmF0aW9uLmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMgPSBNb2NraXRvLm1vY2soQ29tcG9uZW50c1V0aWxzLmNsYXNzKTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHsKKwkJd2hlbihjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbi5hZGRDYXBhYmlsaXR5VHlwZShNb2NraXRvLmFueShDYXBhYmlsaXR5VHlwZURlZmluaXRpb24uY2xhc3MpKSkudGhlbkFuc3dlcihuZXcgQW5zd2VyPEVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+PigpIHsKKwkJCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB7CisJCQkJT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7CisJCQkJRWl0aGVyPENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYW5zID0gRWl0aGVyLmxlZnQoKENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbikgYXJnc1swXSk7CisJCQkJcmV0dXJuIGFuczsKKwkJCX0KKworCQl9KTsKKwkJd2hlbihjb21tb25JbXBvcnRNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRUeXBlc0Zyb21ZbWwoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnkoKSkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOworCX0KKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBpbml0TW9ja3MoKSB7CisJCU1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ2FwYWJpbGl0eVR5cGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHltbENvbnRlbnQgPSBnZXRDYXBhYmlsaXR5VHlwZXNZbWwoKTsKKwkJRWl0aGVyPExpc3Q8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZUNhcGFiaWxpdHlUeXBlcyA9IG1hbmFnZXIuY3JlYXRlQ2FwYWJpbGl0eVR5cGVzKHltbENvbnRlbnQpOworCQlhc3NlcnRUcnVlKGNyZWF0ZUNhcGFiaWxpdHlUeXBlcy5pc0xlZnQoKSk7CisKKwkJTGlzdDxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24+IGNhcGFiaWxpdHlUeXBlc0xpc3QgPSBjcmVhdGVDYXBhYmlsaXR5VHlwZXMubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0eVR5cGVzTGlzdC5zaXplKCkgPT0gMTQpOworCQlNYXA8U3RyaW5nLCBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24+IGNhcGliaWxpdHlUeXBlTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBUeXBlIDogY2FwYWJpbGl0eVR5cGVzTGlzdCkgeworCQkJY2FwaWJpbGl0eVR5cGVNYXAucHV0KGNhcFR5cGUuZ2V0VHlwZSgpLCBjYXBUeXBlKTsKKwkJfQorCQlhc3NlcnRUcnVlKGNhcGFiaWxpdHlUeXBlc0xpc3Quc2l6ZSgpID09IDE0KTsKKworCQlmb3IgKENhcGFiaWxpdHlUeXBlTmFtZUVudW0gY3VyciA6IENhcGFiaWxpdHlUeXBlTmFtZUVudW0udmFsdWVzKCkpIHsKKwkJCWFzc2VydFRydWUoY2FwaWJpbGl0eVR5cGVNYXAuY29udGFpbnNLZXkoY3Vyci5nZXRDYXBhYmlsaXR5TmFtZSgpKSk7CisJCX0KKworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldENhcGFiaWxpdHlUeXBlc1ltbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVBhdGggZmlsZVBhdGggPSBQYXRocy5nZXQoInNyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9jYXBhYmlsaXR5VHlwZXMueW1sIik7CisJCWJ5dGVbXSBmaWxlQ29udGVudCA9IEZpbGVzLnJlYWRBbGxCeXRlcyhmaWxlUGF0aCk7CisJCVN0cmluZyB5bWxDb250ZW50ID0gbmV3IFN0cmluZyhmaWxlQ29udGVudCk7CisJCXJldHVybiB5bWxDb250ZW50OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9DYXRlZ29yaWVzSW1wb3J0TWFuYWdlclRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ2F0ZWdvcmllc0ltcG9ydE1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmYzZhMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ2F0ZWdvcmllc0ltcG9ydE1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbnRlcmZhY2VMaWZlY3ljbGVUeXBlSW1wb3J0TWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUVsZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIENhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyVGVzdCB7CisJQEluamVjdE1vY2tzCisJc3RhdGljIENhdGVnb3JpZXNJbXBvcnRNYW5hZ2VyIGltcG9ydE1hbmFnZXIgPSBuZXcgQ2F0ZWdvcmllc0ltcG9ydE1hbmFnZXIoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soSUVsZW1lbnRPcGVyYXRpb24uY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscyA9IE1vY2tpdG8ubW9jayhDb21wb25lbnRzVXRpbHMuY2xhc3MpOworCisJc3RhdGljIExvZ2dlciBsb2cgPSBNb2NraXRvLnNweShMb2dnZXIuY2xhc3MpOworCisJcHJpdmF0ZSBzdGF0aWMgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YmNhdGVnb3J5OworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXIuc2V0TG9nKGxvZyk7CisKKwkJc3ViY2F0ZWdvcnkgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCXN1YmNhdGVnb3J5LnNldFVuaXF1ZUlkKCIxMjMiKTsKKworCQl3aGVuKGVsZW1lbnRPcGVyYXRpb24uY3JlYXRlQ2F0ZWdvcnkoTW9ja2l0by5hbnkoQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoTm9kZVR5cGVFbnVtLmNsYXNzKSkpLnRoZW5BbnN3ZXIobmV3IEFuc3dlcjxFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+PigpIHsKKwkJCXB1YmxpYyBFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHsKKwkJCQlPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJCQlFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGFucyA9IEVpdGhlci5sZWZ0KChDYXRlZ29yeURlZmluaXRpb24pIGFyZ3NbMF0pOworCQkJCXJldHVybiBhbnM7CisJCQl9CisKKwkJfSk7CisJCXdoZW4oZWxlbWVudE9wZXJhdGlvbi5jcmVhdGVTdWJDYXRlZ29yeShNb2NraXRvLmFueShTdHJpbmcuY2xhc3MpLCBNb2NraXRvLmFueShTdWJDYXRlZ29yeURlZmluaXRpb24uY2xhc3MpLCBNb2NraXRvLmFueShOb2RlVHlwZUVudW0uY2xhc3MpKSkudGhlbkFuc3dlcihuZXcgQW5zd2VyPEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4+KCkgeworCQkJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgeworCQkJCU9iamVjdFtdIGFyZ3MgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpOworCQkJCS8vIHN1YmNhdGVnb3J5LnNldE5hbWUoKChTdWJDYXRlZ29yeURlZmluaXRpb24pYXJnc1swXSkuZ2V0TmFtZSgpKTsKKwkJCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGFucyA9IEVpdGhlci5sZWZ0KHN1YmNhdGVnb3J5KTsKKwkJCQlyZXR1cm4gYW5zOworCQkJfQorCisJCX0pOworCisJCS8vIHdoZW4oTW9ja2l0by5hbnkoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmNsYXNzKS5nZXRVbmlxdWVJZCgpKS50aGVuUmV0dXJuKCIxMjMiKTsKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgaW5pdE1vY2tzKCkgeworCQlNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0Q2F0ZWdvcmllc1Rlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgeW1sQ29udGVudCA9IGdldFltbENvbnRlbnQoKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPj4sIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVDYXBhYmlsaXR5VHlwZXMgPSBpbXBvcnRNYW5hZ2VyLmNyZWF0ZUNhdGVnb3JpZXMoeW1sQ29udGVudCk7CisJCWFzc2VydFRydWUoY3JlYXRlQ2FwYWJpbGl0eVR5cGVzLmlzTGVmdCgpKTsKKworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFltbENvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlQYXRoIGZpbGVQYXRoID0gUGF0aHMuZ2V0KCJzcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvY2F0ZWdvcnlUeXBlcy55bWwiKTsKKwkJYnl0ZVtdIGZpbGVDb250ZW50ID0gRmlsZXMucmVhZEFsbEJ5dGVzKGZpbGVQYXRoKTsKKwkJU3RyaW5nIHltbENvbnRlbnQgPSBuZXcgU3RyaW5nKGZpbGVDb250ZW50KTsKKwkJcmV0dXJuIHltbENvbnRlbnQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Db21wb3NpdGlvbkJ1c2luZXNzTG9naWNUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NvbXBvc2l0aW9uQnVzaW5lc3NMb2dpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVjYWYyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9Db21wb3NpdGlvbkJ1c2luZXNzTG9naWNUZXN0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuT3JpZ2luVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVuaXR0ZXN0cy51dGlscy5GYWN0b3J5VXRpbHM7CisKK3B1YmxpYyBjbGFzcyBDb21wb3NpdGlvbkJ1c2luZXNzTG9naWNUZXN0IHsKKwlDb21wb3NpdGlvbkJ1c2luZXNzTG9naWMgY29tcEJsID0gbmV3IENvbXBvc2l0aW9uQnVzaW5lc3NMb2dpYygpOworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRTcGlyYWxQYXR0ZXJuUG9zaXRpb25pbmdGb3JDb21wb25lbnRJbnN0YW5jZXMoKSB7CisJCWludCBpbnN0YW5jZXNOdW0gPSAxMDsKKwkJUmVzb3VyY2UgY3JlYXRlVkYgPSBGYWN0b3J5VXRpbHMuY3JlYXRlVkYoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZXNOdW07IGkrKykgeworCQkJRmFjdG9yeVV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9WRihjcmVhdGVWRiwgRmFjdG9yeVV0aWxzLmNyZWF0ZVJlc291cmNlSW5zdGFuY2UoKSk7CisJCX0KKwkJTWFwPEltbXV0YWJsZVBhaXI8RG91YmxlLCBEb3VibGU+LCBDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29tcEJsLmJ1aWxkU3BpcmFsUGF0dGVyblBvc2l0aW9uaW5nRm9yQ29tcG9uZW50SW5zdGFuY2VzKGNyZWF0ZVZGKTsKKwkJYXNzZXJ0VHJ1ZShjb21wb25lbnRJbnN0YW5jZXMuc2l6ZSgpID09IGluc3RhbmNlc051bSk7CisJCS8vIFZlcmlmeSBTcGlyYWwgUGF0dGVybgorCQlJbW11dGFibGVQYWlyPERvdWJsZSwgRG91YmxlPiBrZXk7CisJCWtleSA9IG5ldyBJbW11dGFibGVQYWlyPD4oMEQsIDBEKTsKKwkJYXNzZXJ0VHJ1ZShjb21wb25lbnRJbnN0YW5jZXMuY29udGFpbnNLZXkoa2V5KSk7CisJCWtleSA9IG5ldyBJbW11dGFibGVQYWlyPD4oLTFELCAwRCk7CisJCWFzc2VydFRydWUoY29tcG9uZW50SW5zdGFuY2VzLmNvbnRhaW5zS2V5KGtleSkpOworCQlrZXkgPSBuZXcgSW1tdXRhYmxlUGFpcjw+KC0xRCwgMUQpOworCQlhc3NlcnRUcnVlKGNvbXBvbmVudEluc3RhbmNlcy5jb250YWluc0tleShrZXkpKTsKKwkJa2V5ID0gbmV3IEltbXV0YWJsZVBhaXI8PigwRCwgMUQpOworCQlhc3NlcnRUcnVlKGNvbXBvbmVudEluc3RhbmNlcy5jb250YWluc0tleShrZXkpKTsKKwkJa2V5ID0gbmV3IEltbXV0YWJsZVBhaXI8PigxRCwgMUQpOworCQlhc3NlcnRUcnVlKGNvbXBvbmVudEluc3RhbmNlcy5jb250YWluc0tleShrZXkpKTsKKwkJa2V5ID0gbmV3IEltbXV0YWJsZVBhaXI8PigxRCwgMEQpOworCQlhc3NlcnRUcnVlKGNvbXBvbmVudEluc3RhbmNlcy5jb250YWluc0tleShrZXkpKTsKKwkJa2V5ID0gbmV3IEltbXV0YWJsZVBhaXI8PigxRCwgLTFEKTsKKwkJYXNzZXJ0VHJ1ZShjb21wb25lbnRJbnN0YW5jZXMuY29udGFpbnNLZXkoa2V5KSk7CisJCWtleSA9IG5ldyBJbW11dGFibGVQYWlyPD4oMEQsIC0xRCk7CisJCWFzc2VydFRydWUoY29tcG9uZW50SW5zdGFuY2VzLmNvbnRhaW5zS2V5KGtleSkpOworCQlrZXkgPSBuZXcgSW1tdXRhYmxlUGFpcjw+KC0xRCwgLTFEKTsKKwkJYXNzZXJ0VHJ1ZShjb21wb25lbnRJbnN0YW5jZXMuY29udGFpbnNLZXkoa2V5KSk7CisJCWtleSA9IG5ldyBJbW11dGFibGVQYWlyPD4oLTJELCAtMUQpOworCQlhc3NlcnRUcnVlKGNvbXBvbmVudEluc3RhbmNlcy5jb250YWluc0tleShrZXkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRDcHNDb25uZWN0ZWRUb1ZGQygpIHsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gYWxsQ29tcG9uZW50SW5zdGFuY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVJlc291cmNlIGNyZWF0ZVZGID0gRmFjdG9yeVV0aWxzLmNyZWF0ZVZGKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIHZmYyA9IHBvcHVsYXRlVmZXaXRoVmZjQW5kQ3BzKGFsbENvbXBvbmVudEluc3RhbmNlcywgY3JlYXRlVkYpOworCisJCU1hcDxDb21wb25lbnRJbnN0YW5jZSwgTGlzdDxDb21wb25lbnRJbnN0YW5jZT4+IGNwc0Nvbm5lY3RlZFRvVkZDID0gY29tcEJsLmdldENwc0Nvbm5lY3RlZFRvVkZDKGFsbENvbXBvbmVudEluc3RhbmNlcywgY3JlYXRlVkYpOworCQlhc3NlcnRUcnVlKGNwc0Nvbm5lY3RlZFRvVkZDLnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZShjcHNDb25uZWN0ZWRUb1ZGQy5jb250YWluc0tleSh2ZmMpKTsKKwkJU2V0PENvbXBvbmVudEluc3RhbmNlPiBjcHMgPSBjcHNDb25uZWN0ZWRUb1ZGQy5nZXQodmZjKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisJCWFzc2VydFRydWUoY3BzLnNpemUoKSA9PSAzKTsKKwkJY3BzLnN0cmVhbSgpLmZvckVhY2goZSAtPiBhc3NlcnRUcnVlKGUuZ2V0T3JpZ2luVHlwZSgpID09IE9yaWdpblR5cGVFbnVtLkNQKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCdWlsZENpcmNsZVBhdHRlcm5Gb3JDcHMoKSB7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGFsbENvbXBvbmVudEluc3RhbmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlSZXNvdXJjZSBjcmVhdGVWRiA9IEZhY3RvcnlVdGlscy5jcmVhdGVWRigpOworCQlDb21wb25lbnRJbnN0YW5jZSB2ZmNJbnN0YW5jZSA9IHBvcHVsYXRlVmZXaXRoVmZjQW5kQ3BzKGFsbENvbXBvbmVudEluc3RhbmNlcywgY3JlYXRlVkYpOworCQlNYXA8Q29tcG9uZW50SW5zdGFuY2UsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+PiBjcHNDb25uZWN0ZWRUb1ZGQyA9IGNvbXBCbC5nZXRDcHNDb25uZWN0ZWRUb1ZGQyhhbGxDb21wb25lbnRJbnN0YW5jZXMsIGNyZWF0ZVZGKTsKKworCQlNYXA8SW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4sIENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRJbnN0TG9jYXRpb25zID0gbmV3IEhhc2hNYXA8PigpOworCQljb21wb25lbnRJbnN0TG9jYXRpb25zLnB1dChuZXcgSW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4oMEQsIDBEKSwgdmZjSW5zdGFuY2UpOworCQljb21wQmwuYnVpbGRDaXJjbGVQYXR0ZXJuRm9yQ3BzKGNvbXBvbmVudEluc3RMb2NhdGlvbnMsIGNwc0Nvbm5lY3RlZFRvVkZDKTsKKwkJYXNzZXJ0VHJ1ZShjb21wb25lbnRJbnN0TG9jYXRpb25zLnNpemUoKSA9PSA0KTsKKworCQlTZXQ8SW1tdXRhYmxlUGFpcjxEb3VibGUsIERvdWJsZT4+IGNwc0xvY2F0aW9ucyA9IGNvbXBvbmVudEluc3RMb2NhdGlvbnMuZW50cnlTZXQoKS5zdHJlYW0oKS5maWx0ZXIoZW50cnkgLT4gZW50cnkuZ2V0VmFsdWUoKS5nZXRPcmlnaW5UeXBlKCkgPT0gT3JpZ2luVHlwZUVudW0uQ1ApLm1hcChlIC0+IGUuZ2V0S2V5KCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKwkJLy8gVmVyaWZ5IHRoYXQgYWxsIGNwcyBhcmUgbG9jYXRlZCBhdCBkaWZmZXJlbnQgcG9zaXRpb25zCisJCWFzc2VydFRydWUoY3BzTG9jYXRpb25zLnNpemUoKSA9PSAzKTsKKwkJU2V0PERvdWJsZT4gZGlzdGFuY2VzID0gY3BzTG9jYXRpb25zLnN0cmVhbSgpLm1hcChjcExvY2F0aW9uIC0+IE1hdGguc3FydChNYXRoLnBvdyhjcExvY2F0aW9uLmxlZnQsIDIpICsgTWF0aC5wb3coY3BMb2NhdGlvbi5yaWdodCwgMikpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisJCS8vIFZlcmlmeSB0aGF0IGFsbCBjcHMgYXJlIGF0IHRoZSBzYW1lIGRpc3RhbmNlIGZyb20gY2VudGVyCisJCWFzc2VydFRydWUoZGlzdGFuY2VzLnNpemUoKSA9PSAxKTsKKworCX0KKworCS8qKgorCSAqIEFkZHMgNCBpbnN0YW5jZXMgdG8gdGhlIHZmLjxicj4KKwkgKiB2ZmMgaW5zdGFuY2UgYW5kIDMgY3BzIGluc3RhbmNlcy48YnI+CisJICogdGhlIGNwIGluc3RhbmNlcyBhcmUgY29ubmVjdGVkIHRvIHRoZSB2ZmMgaW5zdGFuY2UuPGJyPgorCSAqIAorCSAqIEBwYXJhbSBhbGxDb21wb25lbnRJbnN0YW5jZXMKKwkgKiBAcGFyYW0gY3JlYXRlVkYKKwkgKiBAcmV0dXJuIHZmYyBpbnN0YW5jZQorCSAqLworCXByaXZhdGUgQ29tcG9uZW50SW5zdGFuY2UgcG9wdWxhdGVWZldpdGhWZmNBbmRDcHMoTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gYWxsQ29tcG9uZW50SW5zdGFuY2VzLCBSZXNvdXJjZSBjcmVhdGVWRikgeworCQlDb21wb25lbnRJbnN0YW5jZSB2ZmMgPSBGYWN0b3J5VXRpbHMuY3JlYXRlUmVzb3VyY2VJbnN0YW5jZSgpOworCQl2ZmMuc2V0T3JpZ2luVHlwZShPcmlnaW5UeXBlRW51bS5WRkMpOworCQlGYWN0b3J5VXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb1ZGKGNyZWF0ZVZGLCB2ZmMpOworCQlhbGxDb21wb25lbnRJbnN0YW5jZXMuYWRkKHZmYyk7CisKKwkJY29ubmVjdENwVG9WZmMoYWxsQ29tcG9uZW50SW5zdGFuY2VzLCBjcmVhdGVWRiwgdmZjKTsKKwkJY29ubmVjdENwVG9WZmMoYWxsQ29tcG9uZW50SW5zdGFuY2VzLCBjcmVhdGVWRiwgdmZjKTsKKwkJY29ubmVjdENwVG9WZmMoYWxsQ29tcG9uZW50SW5zdGFuY2VzLCBjcmVhdGVWRiwgdmZjKTsKKwkJcmV0dXJuIHZmYzsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29ubmVjdENwVG9WZmMoTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gYWxsQ29tcG9uZW50SW5zdGFuY2VzLCBSZXNvdXJjZSBjcmVhdGVWRiwgQ29tcG9uZW50SW5zdGFuY2UgdmZjKSB7CisJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiBhbGxSZWxhdGlvbnM7CisJCWlmIChjcmVhdGVWRi5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlhbGxSZWxhdGlvbnMgPSBjcmVhdGVWRi5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKTsKKwkJfSBlbHNlIHsKKwkJCWFsbFJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJY3JlYXRlVkYuc2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKGFsbFJlbGF0aW9ucyk7CisJCX0KKwkJQ29tcG9uZW50SW5zdGFuY2UgY3AxID0gRmFjdG9yeVV0aWxzLmNyZWF0ZVJlc291cmNlSW5zdGFuY2UoKTsKKwkJY3AxLnNldE9yaWdpblR5cGUoT3JpZ2luVHlwZUVudW0uQ1ApOworCQlhZGRWZmNDcFJlbGF0aW9uKHZmYywgY3AxLCBhbGxSZWxhdGlvbnMpOworCQlGYWN0b3J5VXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VUb1ZGKGNyZWF0ZVZGLCBjcDEpOworCQlhbGxDb21wb25lbnRJbnN0YW5jZXMuYWRkKGNwMSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFZmY0NwUmVsYXRpb24oQ29tcG9uZW50SW5zdGFuY2UgdmZjLCBDb21wb25lbnRJbnN0YW5jZSBjcCwgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IGFsbFJlbGF0aW9ucykgeworCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVsID0gbmV3IFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZigpOworCQlyZWwuc2V0VG9Ob2RlKHZmYy5nZXRDb21wb25lbnRVaWQoKSk7CisJCXJlbC5zZXRGcm9tTm9kZShjcC5nZXRDb21wb25lbnRVaWQoKSk7CisJCWFsbFJlbGF0aW9ucy5hZGQocmVsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NzYXJWYWxpZGF0aW9uVXRpbHNUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0NzYXJWYWxpZGF0aW9uVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjODI4NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvQ3NhclZhbGlkYXRpb25VdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5Dc2FyVmFsaWRhdGlvblV0aWxzOworCitwdWJsaWMgY2xhc3MgQ3NhclZhbGlkYXRpb25VdGlsc1Rlc3QgeworCXByaXZhdGUgU3RyaW5nW10gaW52YWxpZEV4dGVuc2lvbnMgPSB7IG51bGwsICIuYmxhIiwgIi55YW1sIiwgIi55bWwiLCAiLnR4dCIsICIuemlwIiB9OworCXByaXZhdGUgU3RyaW5nW10gdmFsaWRFeHRlbnNpb25zID0geyAiLmNzYXIiLCAiLmNTQXIiLCAiLkNzYXIiLCAiLkNTQVIiIH07CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJc0NzYXJQYXlsb2FkTmFtZSgpIHsKKwkJQXJyYXlzLnN0cmVhbShpbnZhbGlkRXh0ZW5zaW9ucykuZm9yRWFjaChlIC0+IEFzc2VydC5hc3NlcnRGYWxzZShDc2FyVmFsaWRhdGlvblV0aWxzLmlzQ3NhclBheWxvYWROYW1lKGUpKSk7CisJCUFycmF5cy5zdHJlYW0odmFsaWRFeHRlbnNpb25zKS5mb3JFYWNoKGUgLT4gQXNzZXJ0LmFzc2VydFRydWUoQ3NhclZhbGlkYXRpb25VdGlscy5pc0NzYXJQYXlsb2FkTmFtZShlKSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW1wb3J0VXRpbHNUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0ltcG9ydFV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDE5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL0ltcG9ydFV0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTA5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkltcG9ydFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5SZXN1bHRTdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5JbXBvcnRVdGlscy5Ub3NjYUVsZW1lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuSW1wb3J0VXRpbHMuVG9zY2FUYWdOYW1lc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb3BlcnR5RGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXR0cmlidXRlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBJbXBvcnRVdGlsc1Rlc3QgeworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFN0cmluZ1R5cGVGaW5kVG9zY2FFbGVtZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUVpdGhlcjxMaXN0PE9iamVjdD4sIFJlc3VsdFN0YXR1c0VudW0+IHRvc2NhRWxlbWVudHMgPSBJbXBvcnRVdGlscy5maW5kVG9zY2FFbGVtZW50cygoTWFwPFN0cmluZywgT2JqZWN0PikgbG9hZEpzb25Gcm9tRmlsZSgibm9ybWF0aXZlLXR5cGVzLXN0cmluZy1saXN0LXRlc3QueW1sIiksICJzdHJpbmdUZXN0VGFnIiwgVG9zY2FFbGVtZW50VHlwZUVudW0uU1RSSU5HLCBuZXcgQXJyYXlMaXN0PD4oKSk7CisJCWFzc2VydFRydWUodG9zY2FFbGVtZW50cy5pc0xlZnQoKSk7CisJCUxpc3Q8T2JqZWN0PiBsaXN0ID0gdG9zY2FFbGVtZW50cy5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShsaXN0LnNpemUoKSA9PSA0KTsKKwkJaW50IGNvdW50ID0gMTsKKwkJZm9yIChPYmplY3QgZWxlbWVudCA6IGxpc3QpIHsKKwkJCWFzc2VydFRydWUoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZyk7CisJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbGVtZW50OworCQkJYXNzZXJ0VHJ1ZSh2YWx1ZS5lcXVhbHMoInN0cmluZ1ZhbCIgKyBjb3VudCkpOworCQkJY291bnQrKzsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJvb2xlYW5UeXBlRmluZFRvc2NhRWxlbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlFaXRoZXI8TGlzdDxPYmplY3Q+LCBSZXN1bHRTdGF0dXNFbnVtPiB0b3NjYUVsZW1lbnRzID0gSW1wb3J0VXRpbHMuZmluZFRvc2NhRWxlbWVudHMoKE1hcDxTdHJpbmcsIE9iamVjdD4pIGxvYWRKc29uRnJvbUZpbGUoIm5vcm1hdGl2ZS10eXBlcy1hbGwtbWFwLXRlc3QueW1sIiksICJyZXF1aXJlZCIsIFRvc2NhRWxlbWVudFR5cGVFbnVtLkJPT0xFQU4sIG5ldyBBcnJheUxpc3Q8PigpKTsKKwkJYXNzZXJ0VHJ1ZSh0b3NjYUVsZW1lbnRzLmlzTGVmdCgpKTsKKwkJTGlzdDxPYmplY3Q+IGxpc3QgPSB0b3NjYUVsZW1lbnRzLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGxpc3Quc2l6ZSgpID09IDMpOworCQlpbnQgY291bnQgPSAxOworCQlmb3IgKE9iamVjdCBlbGVtZW50IDogbGlzdCkgeworCQkJYXNzZXJ0VHJ1ZShlbGVtZW50IGluc3RhbmNlb2YgQm9vbGVhbik7CisJCQlCb29sZWFuIHZhbHVlID0gKEJvb2xlYW4pIGVsZW1lbnQ7CisJCQlpZiAoY291bnQgPT0gMSB8fCBjb3VudCA9PSAzKSB7CisJCQkJYXNzZXJ0RmFsc2UodmFsdWUpOworCQkJfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CisJCQkJYXNzZXJ0VHJ1ZSh2YWx1ZSk7CisJCQl9CisKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMaXN0VHlwZUZpbmRUb3NjYUVsZW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRWl0aGVyPExpc3Q8T2JqZWN0PiwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FFbGVtZW50cyA9IEltcG9ydFV0aWxzLmZpbmRUb3NjYUVsZW1lbnRzKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBsb2FkSnNvbkZyb21GaWxlKCJub3JtYXRpdmUtdHlwZXMtc3RyaW5nLWxpc3QtdGVzdC55bWwiKSwgImxpc3RUZXN0VGFnIiwgVG9zY2FFbGVtZW50VHlwZUVudW0uTElTVCwgbmV3IEFycmF5TGlzdDw+KCkpOworCQlhc3NlcnRUcnVlKHRvc2NhRWxlbWVudHMuaXNMZWZ0KCkpOworCQlMaXN0PE9iamVjdD4gbGlzdCA9IHRvc2NhRWxlbWVudHMubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUobGlzdC5zaXplKCkgPT0gMyk7CisJCWludCBjb3VudCA9IDE7CisJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0KSB7CisJCQlhc3NlcnRUcnVlKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KTsKKworCQkJaWYgKGNvdW50ID09IDEpIHsKKwkJCQl2ZXJpZnlMaXN0RWxlbWVudDEoZWxlbWVudCk7CisJCQl9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKKwkJCQl2ZXJpZnlMaXN0RWxlbWVudDIoZWxlbWVudCk7CisJCQl9CisKKwkJCWVsc2UgaWYgKGNvdW50ID09IDMpIHsKKwkJCQl2ZXJpZnlMaXN0RWxlbWVudDMoZWxlbWVudCk7CisJCQl9CisJCQljb3VudCsrOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsVHlwZUZpbmRUb3NjYUVsZW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRWl0aGVyPExpc3Q8T2JqZWN0PiwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FFbGVtZW50cyA9IEltcG9ydFV0aWxzLmZpbmRUb3NjYUVsZW1lbnRzKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBsb2FkSnNvbkZyb21GaWxlKCJub3JtYXRpdmUtdHlwZXMtYWxsLW1hcC10ZXN0LnltbCIpLCAiYWxsVGVzdFRhZyIsIFRvc2NhRWxlbWVudFR5cGVFbnVtLkFMTCwgbmV3IEFycmF5TGlzdDw+KCkpOworCQlhc3NlcnRUcnVlKHRvc2NhRWxlbWVudHMuaXNMZWZ0KCkpOworCQlMaXN0PE9iamVjdD4gbGlzdCA9IHRvc2NhRWxlbWVudHMubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUobGlzdC5zaXplKCkgPT0gNSk7CisJCWludCBjb3VudCA9IDE7CisJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0KSB7CisJCQlpZiAoY291bnQgPT0gMSkgeworCQkJCWFzc2VydFRydWUoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZyk7CisJCQkJYXNzZXJ0VHJ1ZShlbGVtZW50LmVxdWFscygidG9zY2Eubm9kZXMuUm9vdCIpKTsKKwkJCX0gZWxzZSBpZiAoY291bnQgPT0gMikgeworCQkJCWFzc2VydFRydWUoZWxlbWVudCBpbnN0YW5jZW9mIE1hcCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXBFbGVtZW50ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVsZW1lbnQ7CisJCQkJYXNzZXJ0VHJ1ZShtYXBFbGVtZW50LnNpemUoKSA9PSAyKTsKKwkJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVsZW1lbnRFbnRyaWVzID0gbWFwRWxlbWVudC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCQkJRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVsZW1lbnRFbnRyeSA9IGVsZW1lbnRFbnRyaWVzLm5leHQoKTsKKwkJCQlhc3NlcnRUcnVlKGVsZW1lbnRFbnRyeS5nZXRLZXkoKS5lcXVhbHMoIm1hcFRlc3RUYWciKSk7CisJCQkJYXNzZXJ0VHJ1ZShlbGVtZW50RW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMoInN0cmluZyIpKTsKKworCQkJCWVsZW1lbnRFbnRyeSA9IGVsZW1lbnRFbnRyaWVzLm5leHQoKTsKKwkJCQlhc3NlcnRUcnVlKGVsZW1lbnRFbnRyeS5nZXRLZXkoKS5lcXVhbHMoInJlcXVpcmVkIikpOworCQkJCWFzc2VydFRydWUoZWxlbWVudEVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuKTsKKwkJCQlhc3NlcnRUcnVlKChCb29sZWFuKSBlbGVtZW50RW50cnkuZ2V0VmFsdWUoKSk7CisJCQl9CisKKwkJCWVsc2UgaWYgKGNvdW50ID09IDMpIHsKKwkJCQlhc3NlcnRUcnVlKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpOworCQkJCWFzc2VydFRydWUoZWxlbWVudC5lcXVhbHMoIjEgTUIiKSk7CisJCQl9CisKKwkJCWVsc2UgaWYgKGNvdW50ID09IDQpIHsKKwkJCQlhc3NlcnRUcnVlKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KTsKKwkJCQlMaXN0PE9iamVjdD4gbGlzdEVsZW1lbnQgPSAoTGlzdDxPYmplY3Q+KSBlbGVtZW50OworCQkJCWFzc2VydFRydWUobGlzdEVsZW1lbnQuc2l6ZSgpID09IDIpOworCisJCQkJYXNzZXJ0VHJ1ZShsaXN0RWxlbWVudC5nZXQoMCkgaW5zdGFuY2VvZiBNYXApOworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gaW5uZXJFbGVtZW50ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGxpc3RFbGVtZW50LmdldCgwKTsKKwkJCQlhc3NlcnRUcnVlKGlubmVyRWxlbWVudC5zaXplKCkgPT0gMSk7CisJCQkJRW50cnk8U3RyaW5nLCBPYmplY3Q+IGlubmVyRW50cnkgPSBpbm5lckVsZW1lbnQuZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKwkJCQlhc3NlcnRUcnVlKGlubmVyRW50cnkuZ2V0S2V5KCkuZXF1YWxzKCJncmVhdGVyX29yX2VxdWFsIikpOworCQkJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRWYWx1ZSgpLmVxdWFscygiMSBNQiIpKTsKKworCQkJCWFzc2VydFRydWUobGlzdEVsZW1lbnQuZ2V0KDEpIGluc3RhbmNlb2YgTWFwKTsKKwkJCQlpbm5lckVsZW1lbnQgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgbGlzdEVsZW1lbnQuZ2V0KDEpOworCQkJCWFzc2VydFRydWUoaW5uZXJFbGVtZW50LnNpemUoKSA9PSAxKTsKKwkJCQlpbm5lckVudHJ5ID0gaW5uZXJFbGVtZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJYXNzZXJ0VHJ1ZShpbm5lckVudHJ5LmdldEtleSgpLmVxdWFscygic3RyaW5nVGVzdFRhZyIpKTsKKwkJCQlhc3NlcnRUcnVlKGlubmVyRW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMoInN0cmluZ1ZhbDMiKSk7CisJCQl9IGVsc2UgaWYgKGNvdW50ID09IDUpIHsKKwkJCQlhc3NlcnRUcnVlKGVsZW1lbnQgaW5zdGFuY2VvZiBCb29sZWFuKTsKKwkJCQlhc3NlcnRGYWxzZSgoQm9vbGVhbikgZWxlbWVudCk7CisJCQl9CisJCQljb3VudCsrOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWFwVHlwZUZpbmRUb3NjYUVsZW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRWl0aGVyPExpc3Q8T2JqZWN0PiwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FFbGVtZW50cyA9IEltcG9ydFV0aWxzLmZpbmRUb3NjYUVsZW1lbnRzKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBsb2FkSnNvbkZyb21GaWxlKCJub3JtYXRpdmUtdHlwZXMtYWxsLW1hcC10ZXN0LnltbCIpLCAibWFwVGVzdFRhZyIsIFRvc2NhRWxlbWVudFR5cGVFbnVtLk1BUCwgbmV3IEFycmF5TGlzdDw+KCkpOworCQlhc3NlcnRUcnVlKHRvc2NhRWxlbWVudHMuaXNMZWZ0KCkpOworCQlMaXN0PE9iamVjdD4gbGlzdCA9IHRvc2NhRWxlbWVudHMubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUobGlzdC5zaXplKCkgPT0gMik7CisJCWludCBjb3VudCA9IDE7CisJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0KSB7CisJCQlhc3NlcnRUcnVlKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXApOworCisJCQlpZiAoY291bnQgPT0gMSkgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwRWxlbWVudCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBlbGVtZW50OworCQkJCWFzc2VydFRydWUobWFwRWxlbWVudC5zaXplKCkgPT0gMik7CisJCQkJSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBpdGVyYXRvciA9IG1hcEVsZW1lbnQuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQkJCUVudHJ5PFN0cmluZywgT2JqZWN0PiBpbmVyRWxlbWVudEVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCWFzc2VydFRydWUoaW5lckVsZW1lbnRFbnRyeS5nZXRLZXkoKS5lcXVhbHMoInN0cmluZ1Rlc3RUYWciKSk7CisJCQkJYXNzZXJ0VHJ1ZShpbmVyRWxlbWVudEVudHJ5LmdldFZhbHVlKCkuZXF1YWxzKCJzdHJpbmdWYWwxIikpOworCisJCQkJaW5lckVsZW1lbnRFbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlhc3NlcnRUcnVlKGluZXJFbGVtZW50RW50cnkuZ2V0S2V5KCkuZXF1YWxzKCJsaXN0VGVzdFRhZyIpKTsKKwkJCQlhc3NlcnRUcnVlKGluZXJFbGVtZW50RW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIExpc3QpOworCQkJCUxpc3Q8T2JqZWN0PiBpbm5lclZhbHVlID0gKExpc3Q8T2JqZWN0PikgaW5lckVsZW1lbnRFbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJYXNzZXJ0VHJ1ZShpbm5lclZhbHVlLnNpemUoKSA9PSAzKTsKKworCQkJfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXBFbGVtZW50ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVsZW1lbnQ7CisJCQkJYXNzZXJ0VHJ1ZShtYXBFbGVtZW50LnNpemUoKSA9PSAyKTsKKwkJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5SXRyID0gbWFwRWxlbWVudC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCQkJRW50cnk8U3RyaW5nLCBPYmplY3Q+IGluZXJFbGVtZW50RW50cnkgPSBlbnRyeUl0ci5uZXh0KCk7CisJCQkJYXNzZXJ0VHJ1ZShpbmVyRWxlbWVudEVudHJ5LmdldEtleSgpLmVxdWFscygidHlwZSIpKTsKKwkJCQlhc3NlcnRUcnVlKGluZXJFbGVtZW50RW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMoInRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50IikpOworCQkJCWluZXJFbGVtZW50RW50cnkgPSBlbnRyeUl0ci5uZXh0KCk7CisJCQkJYXNzZXJ0VHJ1ZShpbmVyRWxlbWVudEVudHJ5LmdldEtleSgpLmVxdWFscygiYWxsVGVzdFRhZyIpKTsKKwkJCQlhc3NlcnRUcnVlKGluZXJFbGVtZW50RW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJvb2xlYW4pOworCQkJfQorCisJCQljb3VudCsrOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRnVsbEhlYXRQYXJhbWV0ZXJNb2R1bGVXaXRoU3RyaW5nKCkgeworCisJCXRlc3RDcmVhdGVGdWxsSGVhdFBhcmFtZXRlck1vZHVsZSgic3RyaW5nIiwgImRlZmF1bHQgdmFsdWUiKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZUZ1bGxIZWF0UGFyYW1ldGVyTW9kdWxlV2l0aE51bWJlcigpIHsKKworCQl0ZXN0Q3JlYXRlRnVsbEhlYXRQYXJhbWV0ZXJNb2R1bGUoIm51bWJlciIsICI3NzciKTsKKwkJdGVzdENyZWF0ZUZ1bGxIZWF0UGFyYW1ldGVyTW9kdWxlKCJudW1iZXIiLCAiNzc3LjIzIik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGdWxsSGVhdFBhcmFtZXRlck1vZHVsZVdpdGhCb29sZWFuKCkgeworCisJCXRlc3RDcmVhdGVGdWxsSGVhdFBhcmFtZXRlck1vZHVsZSgiYm9vbGVhbiIsICJ0cnVlIik7CisJCXRlc3RDcmVhdGVGdWxsSGVhdFBhcmFtZXRlck1vZHVsZSgiYm9vbGVhbiIsICJvbiIpOworCQl0ZXN0Q3JlYXRlRnVsbEhlYXRQYXJhbWV0ZXJNb2R1bGUoImJvb2xlYW4iLCAibiIpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRnVsbEhlYXRQYXJhbWV0ZXJNb2R1bGVXaXRoTGlzdCgpIHsKKworCQl0ZXN0Q3JlYXRlRnVsbEhlYXRQYXJhbWV0ZXJNb2R1bGUoImNvbW1hX2RlbGltaXRlZF9saXN0IiwgIltvbmUsIHR3b10iKTsKKworCX0KKworCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgdGVzdENyZWF0ZUZ1bGxIZWF0UGFyYW1ldGVyTW9kdWxlV2l0aEludmFsaWRUeXBlKCl7CisJLy8KKwkvLyBTdHJpbmcgbmFtZSA9ICJmdWxsUGFyYW1ldGVyIjsKKwkvLyBTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb25fdGV4dCI7CisJLy8KKwkvLyBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkvLyBNYXA8U3RyaW5nLCBPYmplY3Q+IGZpcnN0UGFyYW0gPSBjcmVhdGVQYXJhbWV0ZXJNYXAoImFhYSIsICJhYWEiLAorCS8vIG5hbWUsIGRlc2NyaXB0aW9uKTsKKwkvLyBwYXJhbWV0ZXJzTWFwLnB1dChUb3NjYVRhZ05hbWVzRW51bS5QQVJBTUVURVJTLmdldEVsZW1lbnROYW1lKCksCisJLy8gZmlyc3RQYXJhbSk7CisJLy8KKwkvLyBFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sUmVzdWx0U3RhdHVzRW51bT4gaGVhdFBhcmFtZXRlcnMgPQorCS8vIEltcG9ydFV0aWxzLmdldEhlYXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnNNYXApOworCS8vIGFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnMuaXNSaWdodCgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoUmVzdWx0U3RhdHVzRW51bS5JTlZBTElEX1BST1BFUlRZX1RZUEUsCisJLy8gaGVhdFBhcmFtZXRlcnMucmlnaHQoKS52YWx1ZSgpKTsKKwkvLworCS8vIH0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZUZ1bGxIZWF0UGFyYW1ldGVyTW9kdWxlV2l0aE1pc3NpbmdUeXBlKCkgeworCisJCVN0cmluZyBuYW1lID0gImZ1bGxQYXJhbWV0ZXIiOworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiZGVzY3JpcHRpb25fdGV4dCI7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gZmlyc3RQYXJhbSA9IGNyZWF0ZVBhcmFtZXRlck1hcChudWxsLCAiYWFhIiwgbmFtZSwgZGVzY3JpcHRpb24pOworCQlwYXJhbWV0ZXJzTWFwLnB1dChUb3NjYVRhZ05hbWVzRW51bS5QQVJBTUVURVJTLmdldEVsZW1lbnROYW1lKCksIGZpcnN0UGFyYW0pOworCisJCUVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gaGVhdFBhcmFtZXRlcnMgPSBJbXBvcnRVdGlscy5nZXRIZWF0UGFyYW1ldGVycyhwYXJhbWV0ZXJzTWFwLCBBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVycy5pc1JpZ2h0KCkpOworCQlhc3NlcnRFcXVhbHMoUmVzdWx0U3RhdHVzRW51bS5JTlZBTElEX1BST1BFUlRZX1RZUEUsIGhlYXRQYXJhbWV0ZXJzLnJpZ2h0KCkudmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGdWxsSGVhdFBhcmFtZXRlck1vZHVsZVdpdGhNaXNzaW5nRmllbGRzKCkgeworCisJCVN0cmluZyBuYW1lID0gImZ1bGxQYXJhbWV0ZXIiOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlTdHJpbmcgdHlwZSA9ICJudW1iZXIiOworCQlTdHJpbmcgZGVmVmFsdWUgPSAiZGVmdmFsdWUiOworCQkvLyBkZWZhdWx0IHZhbHVlIGNhbm5vdCBiZSBlbXB0eSBpbiBoZWF0IGluIGNhc2UgdGFnIGV4aXN0cworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGZpcnN0UGFyYW0gPSBjcmVhdGVQYXJhbWV0ZXJNYXAodHlwZSwgZGVmVmFsdWUsIG5hbWUsIG51bGwpOworCQlwYXJhbWV0ZXJzTWFwLnB1dChUb3NjYVRhZ05hbWVzRW51bS5QQVJBTUVURVJTLmdldEVsZW1lbnROYW1lKCksIGZpcnN0UGFyYW0pOworCisJCUVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gaGVhdFBhcmFtZXRlcnMgPSBJbXBvcnRVdGlscy5nZXRIZWF0UGFyYW1ldGVycyhwYXJhbWV0ZXJzTWFwLCBBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVycy5pc0xlZnQoKSk7CisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHBhcmFtZXRlckRlZkxpc3QgPSBoZWF0UGFyYW1ldGVycy5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RmFsc2UocGFyYW1ldGVyRGVmTGlzdC5pc0VtcHR5KCkpOworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwYXJhbWV0ZXJEZWZpbml0aW9uID0gcGFyYW1ldGVyRGVmTGlzdC5nZXQoMCk7CisKKwkJYXNzZXJ0UGFyYW1ldGVyKHBhcmFtZXRlckRlZmluaXRpb24sIG5hbWUsIHR5cGUsIG51bGwsIGRlZlZhbHVlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZXNGcm9tWW1sKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBsb2FkSnNvbkZyb21GaWxlKCJpbXBvcnRUb3NjYVdpdGhBdHRyaWJ1dGUueW1sIik7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBBdHRyaWJ1dGVEZWZpbml0aW9uPiwgUmVzdWx0U3RhdHVzRW51bT4gYWN0dWFsQXR0cmlidXRlcyA9IEltcG9ydFV0aWxzLmdldEF0dHJpYnV0ZXModG9zY2FKc29uKTsKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxBdHRyaWJ1dGVzLmlzTGVmdCgpKTsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gZXhwZWN0ZWRBdHRyaWJ1dGVzID0gZ2V0RWxlbWVudHModG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bS5BVFRSSUJVVEVTKTsKKwkJY29tcGFyZUF0dHJpYnV0ZXMoZXhwZWN0ZWRBdHRyaWJ1dGVzLCBhY3R1YWxBdHRyaWJ1dGVzLmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFByb3BlcnRpZXNGcm9tWW1sKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhSnNvbiA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBsb2FkSnNvbkZyb21GaWxlKCJpbXBvcnRUb3NjYVByb3BlcnRpZXMueW1sIik7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBSZXN1bHRTdGF0dXNFbnVtPiBhY3R1YWxQcm9wZXJ0aWVzID0gSW1wb3J0VXRpbHMuZ2V0UHJvcGVydGllcyh0b3NjYUpzb24pOworCQlhc3NlcnRUcnVlKGFjdHVhbFByb3BlcnRpZXMuaXNMZWZ0KCkpOworCQlNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBleHBlY3RlZFByb3BlcnRpZXMgPSBnZXRFbGVtZW50cyh0b3NjYUpzb24sIFRvc2NhVGFnTmFtZXNFbnVtLlBST1BFUlRJRVMpOworCQljb21wYXJlUHJvcGVydGllcyhleHBlY3RlZFByb3BlcnRpZXMsIGFjdHVhbFByb3BlcnRpZXMubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbXBhcmVBdHRyaWJ1dGVzKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGV4cGVjdGVkLCBNYXA8U3RyaW5nLCBBdHRyaWJ1dGVEZWZpbml0aW9uPiBhY3R1YWwpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHNpbmdsZUV4cGVjdGVkQXR0cmlidXRlOworCQlBdHRyaWJ1dGVEZWZpbml0aW9uIGFjdHVhbEF0dHJpYnV0ZSwgZXhwZWN0ZWRBdHRyaWJ1dGVNb2RlbDsKKwkJLy8gYXR0cmlidXRlcyBvZiByZXNvdXJjZQorCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGV4cGVjdGVkQXR0cmlidXRlIDogZXhwZWN0ZWQuZW50cnlTZXQoKSkgeworCisJCQlzaW5nbGVFeHBlY3RlZEF0dHJpYnV0ZSA9IGV4cGVjdGVkQXR0cmlidXRlLmdldFZhbHVlKCk7CisJCQlhc3NlcnROb3ROdWxsKHNpbmdsZUV4cGVjdGVkQXR0cmlidXRlKTsKKwkJCWFjdHVhbEF0dHJpYnV0ZSA9IGFjdHVhbC5nZXQoZXhwZWN0ZWRBdHRyaWJ1dGUuZ2V0S2V5KCkpOworCQkJYXNzZXJ0Tm90TnVsbChhY3R1YWxBdHRyaWJ1dGUpOworCQkJYWN0dWFsQXR0cmlidXRlLnNldE5hbWUoZXhwZWN0ZWRBdHRyaWJ1dGUuZ2V0S2V5KCkudG9TdHJpbmcoKSk7CisJCQlleHBlY3RlZEF0dHJpYnV0ZU1vZGVsID0gSW1wb3J0VXRpbHMuY3JlYXRlTW9kdWxlQXR0cmlidXRlKHNpbmdsZUV4cGVjdGVkQXR0cmlidXRlKTsKKwkJCWV4cGVjdGVkQXR0cmlidXRlTW9kZWwuc2V0TmFtZShleHBlY3RlZEF0dHJpYnV0ZS5nZXRLZXkoKS50b1N0cmluZygpKTsKKworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQXR0cmlidXRlTW9kZWwuZ2V0RGVmYXVsdFZhbHVlKCksIGFjdHVhbEF0dHJpYnV0ZS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBdHRyaWJ1dGVNb2RlbC5nZXREZXNjcmlwdGlvbigpLCBhY3R1YWxBdHRyaWJ1dGUuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBdHRyaWJ1dGVNb2RlbC5nZXROYW1lKCksIGFjdHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQXR0cmlidXRlTW9kZWwuZ2V0U3RhdHVzKCksIGFjdHVhbEF0dHJpYnV0ZS5nZXRTdGF0dXMoKSk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBdHRyaWJ1dGVNb2RlbC5nZXRUeXBlKCksIGFjdHVhbEF0dHJpYnV0ZS5nZXRUeXBlKCkpOworCisJCQljb21wYXJlU2NoZW1hcyhleHBlY3RlZEF0dHJpYnV0ZU1vZGVsLmdldFNjaGVtYSgpLCBhY3R1YWxBdHRyaWJ1dGUuZ2V0U2NoZW1hKCkpOworCisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBjb21wYXJlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBleHBlY3RlZCwgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBhY3R1YWwpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHNpbmdsZUV4cGVjdGVkUHJvcGVydHk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBhY3R1YWxQcm9wZXJ0eSwgZXhwZWN0ZWRQcm9wZXJ0eU1vZGVsOworCQkvLyBhdHRyaWJ1dGVzIG9mIHJlc291cmNlCisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gZXhwZWN0ZWRQcm9wZXJ0eSA6IGV4cGVjdGVkLmVudHJ5U2V0KCkpIHsKKworCQkJc2luZ2xlRXhwZWN0ZWRQcm9wZXJ0eSA9IGV4cGVjdGVkUHJvcGVydHkuZ2V0VmFsdWUoKTsKKwkJCWFzc2VydE5vdE51bGwoc2luZ2xlRXhwZWN0ZWRQcm9wZXJ0eSk7CisJCQlhY3R1YWxQcm9wZXJ0eSA9IGFjdHVhbC5nZXQoZXhwZWN0ZWRQcm9wZXJ0eS5nZXRLZXkoKSk7CisJCQlhc3NlcnROb3ROdWxsKGFjdHVhbFByb3BlcnR5KTsKKwkJCWFjdHVhbFByb3BlcnR5LnNldE5hbWUoZXhwZWN0ZWRQcm9wZXJ0eS5nZXRLZXkoKS50b1N0cmluZygpKTsKKwkJCWV4cGVjdGVkUHJvcGVydHlNb2RlbCA9IEltcG9ydFV0aWxzLmNyZWF0ZU1vZHVsZVByb3BlcnR5KHNpbmdsZUV4cGVjdGVkUHJvcGVydHkpOworCQkJZXhwZWN0ZWRQcm9wZXJ0eU1vZGVsLnNldE5hbWUoZXhwZWN0ZWRQcm9wZXJ0eS5nZXRLZXkoKS50b1N0cmluZygpKTsKKworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvcGVydHlNb2RlbC5nZXREZWZhdWx0VmFsdWUoKSwgYWN0dWFsUHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvcGVydHlNb2RlbC5nZXREZXNjcmlwdGlvbigpLCBhY3R1YWxQcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpKTsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZFByb3BlcnR5TW9kZWwuZ2V0TmFtZSgpLCBhY3R1YWxQcm9wZXJ0eS5nZXROYW1lKCkpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvcGVydHlNb2RlbC5nZXRTdGF0dXMoKSwgYWN0dWFsUHJvcGVydHkuZ2V0U3RhdHVzKCkpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvcGVydHlNb2RlbC5nZXRUeXBlKCksIGFjdHVhbFByb3BlcnR5LmdldFR5cGUoKSk7CisKKwkJCWNvbXBhcmVTY2hlbWFzKGV4cGVjdGVkUHJvcGVydHlNb2RlbC5nZXRTY2hlbWEoKSwgYWN0dWFsUHJvcGVydHkuZ2V0U2NoZW1hKCkpOworCisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBjb21wYXJlU2NoZW1hcyhTY2hlbWFEZWZpbml0aW9uIGV4cGVjdGVkLCBTY2hlbWFEZWZpbml0aW9uIGFjdHVhbCkgeworCisJCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBhY3R1YWxQcm9wZXJ0eVNjaGVtYSA9IGFjdHVhbC5nZXRQcm9wZXJ0eSgpOworCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIGV4cGVjdGVkUHJvcGVydHlTY2hlbWEgPSBleHBlY3RlZC5nZXRQcm9wZXJ0eSgpOworCQlhc3NlcnROb3ROdWxsKGFjdHVhbFByb3BlcnR5U2NoZW1hKTsKKwkJYXNzZXJ0Tm90TnVsbChleHBlY3RlZFByb3BlcnR5U2NoZW1hKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvcGVydHlTY2hlbWEuZ2V0RGVzY3JpcHRpb24oKSwgYWN0dWFsUHJvcGVydHlTY2hlbWEuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFByb3BlcnR5U2NoZW1hLmdldFR5cGUoKSwgYWN0dWFsUHJvcGVydHlTY2hlbWEuZ2V0VHlwZSgpKTsKKworCX0KKworCXByaXZhdGUgPFQ+IE1hcDxTdHJpbmcsIFQ+IGdldEVsZW1lbnRzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FKc29uLCBUb3NjYVRhZ05hbWVzRW51bSBlbGVtZW50VHlwZSkgeworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBUPiwgUmVzdWx0U3RhdHVzRW51bT4gdG9zY2FFeHBlY3RlZEVsZW1lbnRzID0gSW1wb3J0VXRpbHMuZmluZEZpcnN0VG9zY2FNYXBFbGVtZW50KHRvc2NhSnNvbiwgZWxlbWVudFR5cGUpOworCQlhc3NlcnRUcnVlKHRvc2NhRXhwZWN0ZWRFbGVtZW50cy5pc0xlZnQoKSk7CisKKwkJcmV0dXJuIHRvc2NhRXhwZWN0ZWRFbGVtZW50cy5sZWZ0KCkudmFsdWUoKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0Q3JlYXRlRnVsbEhlYXRQYXJhbWV0ZXJNb2R1bGUoU3RyaW5nIHR5cGUsIE9iamVjdCBkZWZhdWx0VmFsKSB7CisKKwkJU3RyaW5nIG5hbWUgPSAiZnVsbFBhcmFtZXRlciI7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJkZXNjcmlwdGlvbl90ZXh0IjsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBmaXJzdFBhcmFtID0gY3JlYXRlUGFyYW1ldGVyTWFwKHR5cGUsIGRlZmF1bHRWYWwsIG5hbWUsIGRlc2NyaXB0aW9uKTsKKwkJcGFyYW1ldGVyc01hcC5wdXQoVG9zY2FUYWdOYW1lc0VudW0uUEFSQU1FVEVSUy5nZXRFbGVtZW50TmFtZSgpLCBmaXJzdFBhcmFtKTsKKworCQlFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sIFJlc3VsdFN0YXR1c0VudW0+IGhlYXRQYXJhbWV0ZXJzID0gSW1wb3J0VXRpbHMuZ2V0SGVhdFBhcmFtZXRlcnMocGFyYW1ldGVyc01hcCwgQXJ0aWZhY3RUeXBlRW51bS5IRUFULmdldFR5cGUoKSk7CisJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnMuaXNMZWZ0KCkpOworCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBwYXJhbWV0ZXJEZWZMaXN0ID0gaGVhdFBhcmFtZXRlcnMubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEZhbHNlKHBhcmFtZXRlckRlZkxpc3QuaXNFbXB0eSgpKTsKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcGFyYW1ldGVyRGVmaW5pdGlvbiA9IHBhcmFtZXRlckRlZkxpc3QuZ2V0KDApOworCisJCWFzc2VydFBhcmFtZXRlcihwYXJhbWV0ZXJEZWZpbml0aW9uLCBuYW1lLCB0eXBlLCBkZXNjcmlwdGlvbiwgZGVmYXVsdFZhbCk7CisKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gY3JlYXRlUGFyYW1ldGVyTWFwKFN0cmluZyB0eXBlLCBPYmplY3QgZGVmYXVsdFZhbCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGZpcnN0UGFyYW0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQl2YWx1ZXNNYXAucHV0KFRvc2NhVGFnTmFtZXNFbnVtLlRZUEUuZ2V0RWxlbWVudE5hbWUoKSwgdHlwZSk7CisJCXZhbHVlc01hcC5wdXQoVG9zY2FUYWdOYW1lc0VudW0uREVTQ1JJUFRJT04uZ2V0RWxlbWVudE5hbWUoKSwgZGVzY3JpcHRpb24pOworCQl2YWx1ZXNNYXAucHV0KFRvc2NhVGFnTmFtZXNFbnVtLkRFRkFVTFRfVkFMVUUuZ2V0RWxlbWVudE5hbWUoKSwgZGVmYXVsdFZhbCk7CisKKwkJZmlyc3RQYXJhbS5wdXQobmFtZSwgdmFsdWVzTWFwKTsKKwkJcmV0dXJuIGZpcnN0UGFyYW07CisJfQorCisJcHJpdmF0ZSB2b2lkIGFzc2VydFBhcmFtZXRlcihIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwYXJhbWV0ZXJEZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgT2JqZWN0IGRlZmF1bHRWYWwpIHsKKwkJYXNzZXJ0RXF1YWxzKG5hbWUsIHBhcmFtZXRlckRlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uLCBwYXJhbWV0ZXJEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHlwZSwgcGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoZGVmYXVsdFZhbCksIHBhcmFtZXRlckRlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoZGVmYXVsdFZhbCksIHBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0RWxlbWVudDMoT2JqZWN0IGVsZW1lbnQpIHsKKwkJTGlzdDxPYmplY3Q+IGxpc3RFbGVtZW50ID0gKExpc3Q8T2JqZWN0PikgZWxlbWVudDsKKwkJYXNzZXJ0VHJ1ZShsaXN0RWxlbWVudC5zaXplKCkgPT0gMik7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBpbm5lckVsZW1lbnQgPSAoTWFwPFN0cmluZywgU3RyaW5nPikgbGlzdEVsZW1lbnQuZ2V0KDApOworCQlhc3NlcnRUcnVlKGlubmVyRWxlbWVudC5zaXplKCkgPT0gMSk7CisJCUVudHJ5PFN0cmluZywgU3RyaW5nPiBpbm5lckVudHJ5ID0gaW5uZXJFbGVtZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRLZXkoKS5lcXVhbHMoInRlc3RUYWcxIikpOworCQlhc3NlcnRUcnVlKGlubmVyRW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMoIjEgTUIiKSk7CisKKwkJaW5uZXJFbGVtZW50ID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIGxpc3RFbGVtZW50LmdldCgxKTsKKwkJYXNzZXJ0VHJ1ZShpbm5lckVsZW1lbnQuc2l6ZSgpID09IDEpOworCQlpbm5lckVudHJ5ID0gaW5uZXJFbGVtZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRLZXkoKS5lcXVhbHMoInR5cGUiKSk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRWYWx1ZSgpLmVxdWFscygic3RyaW5nVmFsMiIpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdEVsZW1lbnQyKE9iamVjdCBlbGVtZW50KSB7CisJCUxpc3Q8T2JqZWN0PiBsaXN0RWxlbWVudCA9IChMaXN0PE9iamVjdD4pIGVsZW1lbnQ7CisJCWFzc2VydFRydWUobGlzdEVsZW1lbnQuc2l6ZSgpID09IDIpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gaW5uZXJFbGVtZW50ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGxpc3RFbGVtZW50LmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZShpbm5lckVsZW1lbnQuc2l6ZSgpID09IDEpOworCQlFbnRyeTxTdHJpbmcsIE9iamVjdD4gaW5uZXJFbnRyeSA9IGlubmVyRWxlbWVudC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQlhc3NlcnRUcnVlKGlubmVyRW50cnkuZ2V0S2V5KCkuZXF1YWxzKCJ0ZXN0VGFnMSIpKTsKKwkJYXNzZXJ0VHJ1ZShpbm5lckVudHJ5LmdldFZhbHVlKCkuZXF1YWxzKCIxIE1CIikpOworCisJCWFzc2VydFRydWUobGlzdEVsZW1lbnQuZ2V0KDEpIGluc3RhbmNlb2YgTWFwKTsKKwkJaW5uZXJFbGVtZW50ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGxpc3RFbGVtZW50LmdldCgxKTsKKwkJYXNzZXJ0VHJ1ZShpbm5lckVsZW1lbnQuc2l6ZSgpID09IDEpOworCQlpbm5lckVudHJ5ID0gaW5uZXJFbGVtZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRLZXkoKS5lcXVhbHMoImxpc3RUZXN0VGFnIikpOworCQlhc3NlcnRUcnVlKGlubmVyRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIExpc3QpOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0RWxlbWVudDEoT2JqZWN0IGVsZW1lbnQpIHsKKwkJTGlzdDxPYmplY3Q+IGxpc3RFbGVtZW50ID0gKExpc3Q8T2JqZWN0PikgZWxlbWVudDsKKwkJYXNzZXJ0VHJ1ZShsaXN0RWxlbWVudC5zaXplKCkgPT0gMyk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBpbm5lckVsZW1lbnQgPSAoTWFwPFN0cmluZywgU3RyaW5nPikgbGlzdEVsZW1lbnQuZ2V0KDApOworCQlhc3NlcnRUcnVlKGlubmVyRWxlbWVudC5zaXplKCkgPT0gMSk7CisJCUVudHJ5PFN0cmluZywgU3RyaW5nPiBpbm5lckVudHJ5ID0gaW5uZXJFbGVtZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRLZXkoKS5lcXVhbHMoImxpc3RUZXN0VGFnIikpOworCQlhc3NlcnRUcnVlKGlubmVyRW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMoIjEgTUIiKSk7CisKKwkJaW5uZXJFbGVtZW50ID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIGxpc3RFbGVtZW50LmdldCgxKTsKKwkJYXNzZXJ0VHJ1ZShpbm5lckVsZW1lbnQuc2l6ZSgpID09IDEpOworCQlpbm5lckVudHJ5ID0gaW5uZXJFbGVtZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRLZXkoKS5lcXVhbHMoImxpc3RUZXN0VGFnIikpOworCQlhc3NlcnRUcnVlKGlubmVyRW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMoIjIgTUIiKSk7CisKKwkJaW5uZXJFbGVtZW50ID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIGxpc3RFbGVtZW50LmdldCgyKTsKKwkJYXNzZXJ0VHJ1ZShpbm5lckVsZW1lbnQuc2l6ZSgpID09IDEpOworCQlpbm5lckVudHJ5ID0gaW5uZXJFbGVtZW50LmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRLZXkoKS5lcXVhbHMoInN0cmluZ1Rlc3RUYWciKSk7CisJCWFzc2VydFRydWUoaW5uZXJFbnRyeS5nZXRWYWx1ZSgpLmVxdWFscygic3RyaW5nVmFsMiIpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkRmlsZU5hbWVUb0pzb25TdHJpbmcoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgc291cmNlRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcyI7CisJCWphdmEubmlvLmZpbGUuUGF0aCBmaWxlUGF0aCA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRQYXRoKHNvdXJjZURpciwgZmlsZU5hbWUpOworCQlieXRlW10gZmlsZUNvbnRlbnQgPSBGaWxlcy5yZWFkQWxsQnl0ZXMoZmlsZVBhdGgpOworCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoZmlsZUNvbnRlbnQpOworCQlyZXR1cm4gY29udGVudDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBPYmplY3QgbG9hZEpzb25Gcm9tRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBjb250ZW50ID0gbG9hZEZpbGVOYW1lVG9Kc29uU3RyaW5nKGZpbGVOYW1lKTsKKwkJT2JqZWN0IGxvYWQgPSBuZXcgWWFtbCgpLmxvYWQoY29udGVudCk7CisJCXJldHVybiBsb2FkOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9JbnRlcmZhY2VMaWZlY3ljbGVUeXBlSW1wb3J0TWFuYWdlclRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhNzRlYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvSW50ZXJmYWNlTGlmZWN5Y2xlVHlwZUltcG9ydE1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkNvbW1vbkltcG9ydE1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkludGVyZmFjZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBJbnRlcmZhY2VMaWZlY3ljbGVUeXBlSW1wb3J0TWFuYWdlclRlc3QgeworCisJQEluamVjdE1vY2tzCisJcHJpdmF0ZSBJbnRlcmZhY2VMaWZlY3ljbGVUeXBlSW1wb3J0TWFuYWdlciBpbXBvcnRNYW5hZ2VyID0gbmV3IEludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyKCk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tb25JbXBvcnRNYW5hZ2VyIGNvbW1vbkltcG9ydE1hbmFnZXIgPSBNb2NraXRvLm1vY2soQ29tbW9uSW1wb3J0TWFuYWdlci5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhJSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMgPSBNb2NraXRvLm1vY2soQ29tcG9uZW50c1V0aWxzLmNsYXNzKTsKKworCXN0YXRpYyBMb2dnZXIgbG9nID0gTW9ja2l0by5zcHkoTG9nZ2VyLmNsYXNzKTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUludGVyZmFjZUxpZmVjeWNsZVR5cGVJbXBvcnRNYW5hZ2VyLnNldExvZyhsb2cpOworCQl3aGVuKGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbi5jcmVhdGVJbnRlcmZhY2VUeXBlKE1vY2tpdG8uYW55KEludGVyZmFjZURlZmluaXRpb24uY2xhc3MpKSkudGhlbkFuc3dlcihuZXcgQW5zd2VyPEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPj4oKSB7CisJCQlwdWJsaWMgRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHsKKwkJCQlPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJCQlFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYW5zID0gRWl0aGVyLmxlZnQoKEludGVyZmFjZURlZmluaXRpb24pIGFyZ3NbMF0pOworCQkJCXJldHVybiBhbnM7CisJCQl9CisKKwkJfSk7CisJCXdoZW4oY29tbW9uSW1wb3J0TWFuYWdlci5jcmVhdGVFbGVtZW50VHlwZXNGcm9tWW1sKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55KCkpKS50aGVuQ2FsbFJlYWxNZXRob2QoKTsKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgaW5pdE1vY2tzKCkgeworCQlNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0TGllY3ljbGVUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHltbENvbnRlbnQgPSBnZXRZbWxDb250ZW50KCk7CisJCUVpdGhlcjxMaXN0PEludGVyZmFjZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlQ2FwYWJpbGl0eVR5cGVzID0gaW1wb3J0TWFuYWdlci5jcmVhdGVMaWZlY3ljbGVUeXBlcyh5bWxDb250ZW50KTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVDYXBhYmlsaXR5VHlwZXMuaXNMZWZ0KCkpOworCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0WW1sQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVBhdGggZmlsZVBhdGggPSBQYXRocy5nZXQoInNyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9pbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy55bWwiKTsKKwkJYnl0ZVtdIGZpbGVDb250ZW50ID0gRmlsZXMucmVhZEFsbEJ5dGVzKGZpbGVQYXRoKTsKKwkJU3RyaW5nIHltbENvbnRlbnQgPSBuZXcgU3RyaW5nKGZpbGVDb250ZW50KTsKKwkJcmV0dXJuIHltbENvbnRlbnQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9SZXNvdXJjZUJ1c2luZXNzTG9naWNUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9pbXBsL1Jlc291cmNlQnVzaW5lc3NMb2dpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTUwM2RjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9SZXNvdXJjZUJ1c2luZXNzTG9naWNUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uSW5qZWN0TW9ja3M7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuRWxlbWVudE9wZXJhdGlvbk1vY2s7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuYXBpLklBdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuaW1wbC5BdWRpdGluZ0xvZ0Zvcm1hdFV0aWw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuYXVkaXRpbmcuaW1wbC5BdWRpdGluZ01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLkFydGlmYWN0c0J1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5pbXBsLlJlc291cmNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuUmVzcG9uc2VGb3JtYXRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlQ2hhbmdlSW5mb1dpdGhBY3Rpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlQ3ljbGVUcmFuc2l0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FjaGVNYW5nZXJPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNzYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkdyYXBoTG9ja09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUJ1c2luZXNzTG9naWNUZXN0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZXNvdXJjZUJ1c2luZXNzTG9naWNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQ0FURUdPUlkgPSAiTmV0d29yayBMYXllciAyLTMvUm91dGVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9DQVRFR09SWTEgPSAiTmV0d29yayBMYXllciAyLTMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1NVQkNBVEVHT1JZID0gIlJvdXRlciI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVEX0NBVEVHT1JZID0gIk5ldHdvcmsgTGF5ZXIgMi0zL0dhdGV3YXkiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURURfU1VCQ0FURUdPUlkgPSAiR2F0ZXdheSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9OQU1FID0gIk15LVJlc291cmNlX05hbWUgd2l0aCAgIHNwYWNlIjsKKworCWZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gTW9ja2l0by5tb2NrKFNlcnZsZXRDb250ZXh0LmNsYXNzKTsKKwlJQXVkaXRpbmdNYW5hZ2VyIGlBdWRpdGluZ01hbmFnZXIgPSBudWxsOworCUlFbGVtZW50T3BlcmF0aW9uIG1vY2tFbGVtZW50RGFvOworCVRpdGFuR2VuZXJpY0RhbyBtb2NrVGl0YW5EYW8gPSBNb2NraXRvLm1vY2soVGl0YW5HZW5lcmljRGFvLmNsYXNzKTsKKwlVc2VyQnVzaW5lc3NMb2dpYyBtb2NrVXNlckFkbWluID0gTW9ja2l0by5tb2NrKFVzZXJCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwlmaW5hbCBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhSZXNvdXJjZU9wZXJhdGlvbi5jbGFzcyk7CisJZmluYWwgTGlmZWN5Y2xlQnVzaW5lc3NMb2dpYyBsaWZlY3ljbGVCbCA9IE1vY2tpdG8ubW9jayhMaWZlY3ljbGVCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwlmaW5hbCBJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soSUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uLmNsYXNzKTsKKwlmaW5hbCBJUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soSVByb3BlcnR5T3BlcmF0aW9uLmNsYXNzKTsKKwlmaW5hbCBBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUgYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlID0gTW9ja2l0by5tb2NrKEFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZS5jbGFzcyk7CisJV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwQ29udGV4dFdyYXBwZXIgPSBNb2NraXRvLm1vY2soV2ViQXBwQ29udGV4dFdyYXBwZXIuY2xhc3MpOworCVdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBDb250ZXh0ID0gTW9ja2l0by5tb2NrKFdlYkFwcGxpY2F0aW9uQ29udGV4dC5jbGFzcyk7CisJQXVkaXRpbmdMb2dGb3JtYXRVdGlsIGF1ZGl0aW5nTG9nRm9ybWF0dGVyID0gTW9ja2l0by5tb2NrKEF1ZGl0aW5nTG9nRm9ybWF0VXRpbC5jbGFzcyk7CisJQEluamVjdE1vY2tzCisJUmVzb3VyY2VCdXNpbmVzc0xvZ2ljIGJsID0gbmV3IFJlc291cmNlQnVzaW5lc3NMb2dpYygpOworCVJlc3BvbnNlRm9ybWF0TWFuYWdlciByZXNwb25zZU1hbmFnZXIgPSBudWxsOworCUF1ZGl0aW5nTWFuYWdlciBhdWRpdGluZ01hbmFnZXIgPSBNb2NraXRvLm1vY2soQXVkaXRpbmdNYW5hZ2VyLmNsYXNzKTsKKwlHcmFwaExvY2tPcGVyYXRpb24gZ3JhcGhMb2NrT3BlcmF0aW9uID0gTW9ja2l0by5tb2NrKEdyYXBoTG9ja09wZXJhdGlvbi5jbGFzcyk7CisJVXNlciB1c2VyID0gbnVsbDsKKwlSZXNvdXJjZSByZXNvdXJjZVJlc3BvbnNlID0gbnVsbDsKKwlDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzID0gbmV3IENvbXBvbmVudHNVdGlscygpOworCUFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RNYW5hZ2VyID0gTW9ja2l0by5tb2NrKEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MpOworCUNzYXJPcGVyYXRpb24gY3Nhck9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhDc2FyT3BlcmF0aW9uLmNsYXNzKTsKKwlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGVtcHR5RGF0YVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+KCk7CisKKwlDYWNoZU1hbmdlck9wZXJhdGlvbiBjYWNoZU1hbmFnZXIgPSBNb2NraXRvLm1vY2soQ2FjaGVNYW5nZXJPcGVyYXRpb24uY2xhc3MpOworCisJcHVibGljIFJlc291cmNlQnVzaW5lc3NMb2dpY1Rlc3QoKSB7CisKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisJCU1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7CisJCU1vY2tpdG8ucmVzZXQocHJvcGVydHlPcGVyYXRpb24pOworCisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLWJlIik7CisKKwkJLy8gSW5pdCBDb25maWd1cmF0aW9uCisJCVN0cmluZyBhcHBDb25maWdEaXIgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlIjsKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgYXBwQ29uZmlnRGlyKTsKKwkJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJLy8gRWxlbWVudHMKKwkJbW9ja0VsZW1lbnREYW8gPSBuZXcgRWxlbWVudE9wZXJhdGlvbk1vY2soKTsKKworCQkvLyBVc2VyIGRhdGEgYW5kIG1hbmFnZW1lbnQKKwkJdXNlciA9IG5ldyBVc2VyKCk7CisJCXVzZXIuc2V0VXNlcklkKCJqaDAwMDMiKTsKKwkJdXNlci5zZXRGaXJzdE5hbWUoIkppbW1pIik7CisJCXVzZXIuc2V0TGFzdE5hbWUoIkhlbmRyaXgiKTsKKwkJdXNlci5zZXRSb2xlKFJvbGUuQURNSU4ubmFtZSgpKTsKKworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJHZXRVc2VyID0gRWl0aGVyLmxlZnQodXNlcik7CisJCXdoZW4obW9ja1VzZXJBZG1pbi5nZXRVc2VyKCJqaDAwMDMiLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyR2V0VXNlcik7CisKKwkJLy8gU2VydmxldCBDb250ZXh0IGF0dHJpYnV0ZXMKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkudGhlblJldHVybihjb25maWd1cmF0aW9uTWFuYWdlcik7CisJCS8vIHdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVURJVElOR19NQU5BR0VSKSkudGhlblJldHVybihpQXVkaXRpbmdNYW5hZ2VyKTsKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlJFU09VUkNFX09QRVJBVElPTl9NQU5BR0VSKSkudGhlblJldHVybihyZXNvdXJjZU9wZXJhdGlvbik7CisJCXdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpKS50aGVuUmV0dXJuKHdlYkFwcENvbnRleHRXcmFwcGVyKTsKKwkJd2hlbih3ZWJBcHBDb250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KHNlcnZsZXRDb250ZXh0KSkudGhlblJldHVybih3ZWJBcHBDb250ZXh0KTsKKwkJd2hlbih3ZWJBcHBDb250ZXh0LmdldEJlYW4oSUVsZW1lbnRPcGVyYXRpb24uY2xhc3MpKS50aGVuUmV0dXJuKG1vY2tFbGVtZW50RGFvKTsKKworCQkvLyBSZXNvdXJjZSBPcGVyYXRpb24gbW9jayBtZXRob2RzCisJCS8vIGdldENvdW50CisJCS8qCisJCSAqIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDb3VudCA9IEVpdGhlci5sZWZ0KDApOyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldE51bWJlck9mUmVzb3VyY2VzQnlOYW1lKCJNeVJlc291cmNlTmFtZSIpKS4gdGhlblJldHVybihlaXRoZXJDb3VudCk7IEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDb3VudEV4aXN0ID0gRWl0aGVyLmxlZnQoMSk7CisJCSAqIHdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0TnVtYmVyT2ZSZXNvdXJjZXNCeU5hbWUoImFscmVhZHlFeGlzdCIpKS4gdGhlblJldHVybihlaXRoZXJDb3VudEV4aXN0KTsKKwkJICovCisJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDb3VudFJvb3QgPSBFaXRoZXIubGVmdCgxKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXROdW1iZXJPZlJlc291cmNlc0J5TmFtZSgiUm9vdCIudG9Mb3dlckNhc2UoKSkpLnRoZW5SZXR1cm4oZWl0aGVyQ291bnRSb290KTsKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckZhbHNlID0gRWl0aGVyLmxlZnQoZmFsc2UpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLnZhbGlkYXRlUmVzb3VyY2VOYW1lRXhpc3RzKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKCJSb290IiksIFJlc291cmNlVHlwZUVudW0uVkZDKSkudGhlblJldHVybihlaXRoZXJGYWxzZSk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNvdW50RXhpc3QgPSBFaXRoZXIubGVmdChmYWxzZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24udmFsaWRhdGVSZXNvdXJjZU5hbWVFeGlzdHMoImFscmVhZHlFeGlzdHMiLCBSZXNvdXJjZVR5cGVFbnVtLlZGQykpLnRoZW5SZXR1cm4oZWl0aGVyQ291bnRFeGlzdCk7CisJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDb3VudCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLnZhbGlkYXRlUmVzb3VyY2VOYW1lRXhpc3RzKFJFU09VUkNFX05BTUUsIFJlc291cmNlVHlwZUVudW0uVkZDKSkudGhlblJldHVybihlaXRoZXJDb3VudCk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlRGVyaXZlZEV4aXN0cyA9IEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi52YWxpZGF0ZVRvc2NhUmVzb3VyY2VOYW1lRXhpc3RzKCJSb290IikpLnRoZW5SZXR1cm4odmFsaWRhdGVEZXJpdmVkRXhpc3RzKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlRGVyaXZlZE5vdEV4aXN0cyA9IEVpdGhlci5sZWZ0KHRydWUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLnZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVFeGlzdHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudE5hbWUoImt1a3UiKSkpLnRoZW5SZXR1cm4odmFsaWRhdGVEZXJpdmVkTm90RXhpc3RzKTsKKworCQl3aGVuKGdyYXBoTG9ja09wZXJhdGlvbi5sb2NrQ29tcG9uZW50KE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEoTm9kZVR5cGVFbnVtLlJlc291cmNlKSkpLnRoZW5SZXR1cm4oU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisJCXdoZW4oZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnRCeU5hbWUoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5lcShOb2RlVHlwZUVudW0uUmVzb3VyY2UpKSkudGhlblJldHVybihTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWYgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisJCWFydGlmYWN0RGVmLnNldFVuaXF1ZUlkKCIxMjMuMTIzIik7CisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJldHVybkVpdGhlciA9IEVpdGhlci5sZWZ0KGFydGlmYWN0RGVmKTsKKwkJd2hlbihhcnRpZmFjdE1hbmFnZXIuY3JlYXRlQXJ0aWZhY3RQbGFjZUhvbGRlckluZm8oTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlNYXAoKSwgTW9ja2l0by5hbnkoVXNlci5jbGFzcyksIE1vY2tpdG8uYW55KEFydGlmYWN0R3JvdXBUeXBlRW51bS5jbGFzcykpKS50aGVuUmV0dXJuKGFydGlmYWN0RGVmKTsKKworCQl3aGVuKGFydGlmYWN0TWFuYWdlci5hZGRIZWF0RW52QXJ0aWZhY3QoTW9ja2l0by5hbnkoQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnkoTm9kZVR5cGVFbnVtLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpKS50aGVuUmV0dXJuKHJldHVybkVpdGhlcik7CisKKwkJLy8gY3JlYXRlUmVzb3VyY2UKKwkJcmVzb3VyY2VSZXNwb25zZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNyZWF0ZSA9IEVpdGhlci5sZWZ0KHJlc291cmNlUmVzcG9uc2UpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclZhbGlkYXRlID0gRWl0aGVyLmxlZnQobnVsbCk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uY3JlYXRlUmVzb3VyY2UoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpLCBNb2NraXRvLmFueUJvb2xlYW4oKSkpLnRoZW5SZXR1cm4oZWl0aGVyQ3JlYXRlKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi52YWxpZGF0ZUNzYXJVdWlkVW5pcXVlbmVzcyhNb2NraXRvLmFueVN0cmluZygpKSkudGhlblJldHVybihlaXRoZXJWYWxpZGF0ZSk7CisJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZW1wdHlEYXRhVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4oKTsKKwkJd2hlbihhcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUuZ2V0QWxsKCkpLnRoZW5SZXR1cm4oRWl0aGVyLmxlZnQoZW1wdHlEYXRhVHlwZXMpKTsKKworCQkvLyBCTCBvYmplY3QKKwkJYmwgPSBuZXcgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljKCk7CisJCWJsLnNldEVsZW1lbnREYW8obW9ja0VsZW1lbnREYW8pOworCQlibC5zZXRVc2VyQWRtaW4obW9ja1VzZXJBZG1pbik7CisJCWJsLnNldFJlc291cmNlT3BlcmF0aW9uKHJlc291cmNlT3BlcmF0aW9uKTsKKwkJYmwuc2V0Q2FwYWJpbGl0eVR5cGVPcGVyYXRpb24oY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24pOworCQljb21wb25lbnRzVXRpbHMuSW5pdCgpOworCQljb21wb25lbnRzVXRpbHMuc2V0QXVkaXRpbmdNYW5hZ2VyKGF1ZGl0aW5nTWFuYWdlcik7CisJCWJsLnNldENvbXBvbmVudHNVdGlscyhjb21wb25lbnRzVXRpbHMpOworCQlibC5zZXRMaWZlY3ljbGVNYW5hZ2VyKGxpZmVjeWNsZUJsKTsKKwkJYmwuc2V0R3JhcGhMb2NrT3BlcmF0aW9uKGdyYXBoTG9ja09wZXJhdGlvbik7CisJCWJsLnNldEFydGlmYWN0c01hbmFnZXIoYXJ0aWZhY3RNYW5hZ2VyKTsKKwkJYmwuc2V0UHJvcGVydHlPcGVyYXRpb24ocHJvcGVydHlPcGVyYXRpb24pOworCQlibC5zZXRUaXRhbkdlbmVyaWNEYW8obW9ja1RpdGFuRGFvKTsKKwkJYmwuc2V0QXBwbGljYXRpb25EYXRhVHlwZUNhY2hlKGFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZSk7CisJCWJsLnNldENzYXJPcGVyYXRpb24oY3Nhck9wZXJhdGlvbik7CisJCWJsLnNldENhY2hlTWFuYWdlck9wZXJhdGlvbihjYWNoZU1hbmFnZXIpOworCisJCVJlc291cmNlIHJlc291cmNlQ3NhciA9IGNyZWF0ZVJlc291cmNlT2JqZWN0Q3Nhcih0cnVlKTsKKwkJc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2VDc2FyKTsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvbGRSZXNvdXJjZVJlcyA9IEVpdGhlci5sZWZ0KHJlc291cmNlQ3Nhcik7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2VDc2FyLmdldFVuaXF1ZUlkKCkpKS50aGVuUmV0dXJuKG9sZFJlc291cmNlUmVzKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RSZXNvdXJjZUJ5Q3Nhck9yTmFtZShyZXNvdXJjZUNzYXIuZ2V0Q3NhclVVSUQoKSwgcmVzb3VyY2VDc2FyLmdldFN5c3RlbU5hbWUoKSkpLnRoZW5SZXR1cm4ob2xkUmVzb3VyY2VSZXMpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLnVwZGF0ZVJlc291cmNlKE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpKS50aGVuUmV0dXJuKG9sZFJlc291cmNlUmVzKTsKKwkJcmVzcG9uc2VNYW5hZ2VyID0gUmVzcG9uc2VGb3JtYXRNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisKKwl9CisKKwlwcml2YXRlIFJlc291cmNlIGNyZWF0ZVJlc291cmNlT2JqZWN0KGJvb2xlYW4gYWZ0ZXJDcmVhdGUpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKKwkJcmVzb3VyY2Uuc2V0TmFtZShSRVNPVVJDRV9OQU1FKTsKKwkJcmVzb3VyY2UuYWRkQ2F0ZWdvcnkoUkVTT1VSQ0VfQ0FURUdPUlkxLCBSRVNPVVJDRV9TVUJDQVRFR09SWSk7CisJCXJlc291cmNlLnNldERlc2NyaXB0aW9uKCJNeSBzaG9ydCBkZXNjcmlwdGlvbiIpOworCQlMaXN0PFN0cmluZz4gdGdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRncy5hZGQoInRlc3QiKTsKKwkJdGdzLmFkZChyZXNvdXJjZS5nZXROYW1lKCkpOworCQlyZXNvdXJjZS5zZXRUYWdzKHRncyk7CisJCUxpc3Q8U3RyaW5nPiB0ZW1wbGF0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0ZW1wbGF0ZS5hZGQoIlJvb3QiKTsKKwkJcmVzb3VyY2Uuc2V0RGVyaXZlZEZyb20odGVtcGxhdGUpOworCQlyZXNvdXJjZS5zZXRWZW5kb3JOYW1lKCJNb3Rvcm9sYSIpOworCQlyZXNvdXJjZS5zZXRWZW5kb3JSZWxlYXNlKCIxLjAuMCIpOworCQlyZXNvdXJjZS5zZXRDb250YWN0SWQoInlhNTQ2NyIpOworCQlyZXNvdXJjZS5zZXRJY29uKCJNeUljb24iKTsKKworCQlpZiAoYWZ0ZXJDcmVhdGUpIHsKKwkJCXJlc291cmNlLnNldE5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCXJlc291cmNlLnNldFZlcnNpb24oIjAuMSIpOworCQkJOworCQkJcmVzb3VyY2Uuc2V0VW5pcXVlSWQocmVzb3VyY2UuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgKyAiOiIgKyByZXNvdXJjZS5nZXRWZXJzaW9uKCkpOworCQkJcmVzb3VyY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJCXJlc291cmNlLnNldENyZWF0b3JGdWxsTmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJfQorCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCQlsb2cuZGVidWcoZ3Nvbi50b0pzb24ocmVzb3VyY2UpKTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VPYmplY3RDc2FyKGJvb2xlYW4gYWZ0ZXJDcmVhdGUpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKKwkJcmVzb3VyY2Uuc2V0TmFtZShSRVNPVVJDRV9OQU1FKTsKKwkJcmVzb3VyY2UuYWRkQ2F0ZWdvcnkoUkVTT1VSQ0VfQ0FURUdPUlkxLCBSRVNPVVJDRV9TVUJDQVRFR09SWSk7CisJCXJlc291cmNlLnNldERlc2NyaXB0aW9uKCJNeSBzaG9ydCBkZXNjcmlwdGlvbiIpOworCQlMaXN0PFN0cmluZz4gdGdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRncy5hZGQoInRlc3QiKTsKKwkJdGdzLmFkZChyZXNvdXJjZS5nZXROYW1lKCkpOworCQlyZXNvdXJjZS5zZXRUYWdzKHRncyk7CisJCUxpc3Q8U3RyaW5nPiB0ZW1wbGF0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0ZW1wbGF0ZS5hZGQoIlJvb3QiKTsKKwkJcmVzb3VyY2Uuc2V0RGVyaXZlZEZyb20odGVtcGxhdGUpOworCQlyZXNvdXJjZS5zZXRWZW5kb3JOYW1lKCJNb3Rvcm9sYSIpOworCQlyZXNvdXJjZS5zZXRWZW5kb3JSZWxlYXNlKCIxLjAuMCIpOworCQlyZXNvdXJjZS5zZXRDb250YWN0SWQoInlhNTQ2NyIpOworCQlyZXNvdXJjZS5zZXRJY29uKCJNeUljb24iKTsKKwkJcmVzb3VyY2Uuc2V0Q3NhclVVSUQoInZhbGlkX3ZmLmNzYXIiKTsKKwkJcmVzb3VyY2Uuc2V0Q3NhclZlcnNpb24oIjEiKTsKKworCQlpZiAoYWZ0ZXJDcmVhdGUpIHsKKwkJCXJlc291cmNlLnNldE5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCXJlc291cmNlLnNldFZlcnNpb24oIjAuMSIpOworCQkJOworCQkJcmVzb3VyY2Uuc2V0VW5pcXVlSWQocmVzb3VyY2UuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgKyAiOiIgKyByZXNvdXJjZS5nZXRWZXJzaW9uKCkpOworCQkJcmVzb3VyY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJCXJlc291cmNlLnNldENyZWF0b3JGdWxsTmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpICsgIiAiICsgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJfQorCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCQlsb2cuZGVidWcoZ3Nvbi50b0pzb24ocmVzb3VyY2UpKTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCXByaXZhdGUgUmVzb3VyY2Ugc2V0Q2FuV29ya09uUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlyZXNvdXJjZS5zZXRMYXN0VXBkYXRlclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhcHB5U2NlbmFyaW8oKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB1c2VyLCBudWxsLCBudWxsKTsKKworCQlpZiAoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMjAwKSwgY3JlYXRlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpLmdldFN0YXR1cygpKTsKKwkJfQorCQlhc3NlcnRFcXVhbHMoY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSksIGNyZWF0ZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIYXBweVNjZW5hcmlvKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0Q3Nhcih0cnVlKTsKKwkJc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiB1cGRhdGVSZXNwb25zZSA9IGJsLnZhbGlkYXRlQW5kVXBkYXRlUmVzb3VyY2VGcm9tQ3NhcihyZXNvdXJjZSwgdXNlciwgbnVsbCwgbnVsbCwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWlmICh1cGRhdGVSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyMDApLCB1cGRhdGVSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkuZ2V0U3RhdHVzKCkpOworCQl9CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1cGRhdGVSZXNwb25zZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKwl9CisKKwkvKiBDUkVBVEUgdmFsaWRhdGlvbnMgLSBzdGFydCAqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBSZXNvdXJjZSBuYW1lIC0gc3RhcnQKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZhaWxlZFJlc291cmNlVmFsaWRhdGlvbnMoKSB7CisJCXRlc3RSZXNvdXJjZU5hbWVFeGlzdCgpOworCQl0ZXN0UmVzb3VyY2VOYW1lRW1wdHkoKTsKKwkJLy8gdGVzdFJlc291cmNlTmFtZUV4Y2VlZHNMaW1pdCgpOworCQl0ZXN0UmVzb3VyY2VOYW1lV3JvbmdGb3JtYXQoKTsKKwkJdGVzdFJlc291cmNlRGVzY0V4Y2VlZHNMaW1pdENyZWF0ZSgpOworCQl0ZXN0UmVzb3VyY2VEZXNjTm90RW5nbGlzaCgpOworCQl0ZXN0UmVzb3VyY2VEZXNjcmlwdGlvbkVtcHR5KCk7CisJCXRlc3RSZXNvdXJjZURlc2NyaXB0aW9uTWlzc2luZygpOworCQl0ZXN0UmVzb3VyY2VJY29uTWlzc2luZygpOworCQl0ZXN0UmVzb3VyY2VJY29uSW52YWxpZCgpOworCQl0ZXN0UmVzb3VyY2VJY29uRXhjZWVkc0xpbWl0KCk7CisJCXRlc3RSZXNvdXJjZVRhZ05vdEV4aXN0KCk7CisJCXRlc3RSZXNvdXJjZVRhZ0VtcHR5KCk7CisJCXRlc3RUYWdzRXhjZWVkc0xpbWl0Q3JlYXRlKCk7CisJCS8vIHRlc3RUYWdzU2luZ2xlRXhjZWVkc0xpbWl0KCk7CisJCXRlc3RUYWdzTm9TZXJ2aWNlTmFtZSgpOworCQl0ZXN0SW52YWxpZFRhZygpOworCQkvLyAxNjEwT1MgU3VwcG9ydCAtIEJlY2F1c2Ugb2YgY2hhbmdlcyBpbiB0aGUgdmFsaWRhdGlvbiBpbiB0aGUgdWkgdGhlc2UgdGVzdHMgd2lsbCBmYWlsLiBuZWVkIHRvIGZpeCB0aGVtCisJCS8vdGVzdENvbnRhY3RJZFRvb0xvbmcoKTsKKwkJLy90ZXN0Q29udGFjdElkV3JvbmdGb3JtYXRDcmVhdGUoKTsKKwkJdGVzdFJlc291cmNlQ29udGFjdElkRW1wdHkoKTsKKwkJdGVzdFJlc291cmNlQ29udGFjdElkTWlzc2luZygpOworCQl0ZXN0VmVuZG9yTmFtZUV4Y2VlZHNMaW1pdCgpOworCQl0ZXN0VmVuZG9yTmFtZVdyb25nRm9ybWF0Q3JlYXRlKCk7CisJCXRlc3RWZW5kb3JSZWxlYXNlV3JvbmdGb3JtYXQoKTsKKwkJdGVzdFZlbmRvclJlbGVhc2VFeGNlZWRzTGltaXRDcmVhdGUoKTsKKwkJdGVzdFJlc291cmNlVmVuZG9yTmFtZU1pc3NpbmcoKTsKKwkJdGVzdFJlc291cmNlVmVuZG9yUmVsZWFzZU1pc3NpbmcoKTsKKwkJdGVzdFJlc291cmNlQ2F0ZWdvcnlFeGlzdCgpOworCQl0ZXN0UmVzb3VyY2VCYWRDYXRlZ29yeUNyZWF0ZSgpOworCQl0ZXN0SGFwcHlTY2VuYXJpb0Nvc3RMaWNlbnNlVHlwZSgpOworCQl0ZXN0Q29zdFdyb25nRm9ybWF0Q3JlYXRlKCk7CisJCXRlc3RMaWNlbnNlVHlwZVdyb25nRm9ybWF0Q3JlYXRlKCk7CisJCXRlc3RSZXNvdXJjZVRlbXBsYXRlTm90RXhpc3QoKTsKKwkJdGVzdFJlc291cmNlVGVtcGxhdGVFbXB0eSgpOworCQl0ZXN0UmVzb3VyY2VUZW1wbGF0ZUludmFsaWQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFJlc291cmNlTmFtZUV4aXN0KCkgeworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gImFscmVhZHlFeGlzdHMiOworCQlSZXNvdXJjZSByZXNvdXJjZUV4aXN0ID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQlyZXNvdXJjZUV4aXN0LnNldE5hbWUocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2VFeGlzdC5nZXRUYWdzKCkuYWRkKHJlc291cmNlTmFtZSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4aXN0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTkFNRV9BTFJFQURZX0VYSVNULCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpLCByZXNvdXJjZU5hbWUpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VOYW1lRW1wdHkoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhpc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCXJlc291cmNlRXhpc3Quc2V0TmFtZShudWxsKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhpc3QsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfQ09NUE9ORU5UX05BTUUsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VOYW1lRXhjZWVkc0xpbWl0KCkgeworCQlSZXNvdXJjZSByZXNvdXJjZUV4Y2NlZHNOYW1lTGltaXQgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCS8vIDUxIGNoYXJzLCB0aGUgbGltaXQgaXMgNTAKKwkJU3RyaW5nIHRvb0xvbmdSZXNvdXJjZU5hbWUgPSAiekNSQ0FXanF0ZTBEdGdjQUFNbWNKY1hlTnViZVgxcDF2T1pOVFNoQUhPWU5BSHZWM2lLIjsKKwkJcmVzb3VyY2VFeGNjZWRzTmFtZUxpbWl0LnNldE5hbWUodG9vTG9uZ1Jlc291cmNlTmFtZSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4Y2NlZHNOYW1lTGltaXQsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSwgIiIgKyBWYWxpZGF0aW9uVXRpbHMuQ09NUE9ORU5UX05BTUVfTUFYX0xFTkdUSCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZU5hbWVXcm9uZ0Zvcm1hdCgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCS8vIGNvbnRhaW5zIDoKKwkJU3RyaW5nIG5hbWVXcm9uZ0Zvcm1hdCA9ICJsamc/ZmQiOworCQlyZXNvdXJjZS5zZXROYW1lKG5hbWVXcm9uZ0Zvcm1hdCk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTVBPTkVOVF9OQU1FLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsKKwl9CisKKwkvLyBSZXNvdXJjZSBuYW1lIC0gZW5kCisJLy8gUmVzb3VyY2UgZGVzY3JpcHRpb24gLSBzdGFydAorCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VEZXNjRXhjZWVkc0xpbWl0Q3JlYXRlKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZUV4Y2NlZHNEZXNjTGltaXQgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCS8vIDEwMjUgY2hhcnMsIHRoZSBsaW1pdCBpcyAxMDI0CisJCVN0cmluZyB0b29Mb25nUmVzb3VyY2VEZXNjID0gIjFHVU9Eb2pRMHNHektSNE5QN2U1ajgyQURRM0tIVFZPYWV6TDk1cWNidWFxRHRqWmhBUUdRM2lGd0tBeTU4MEs0V2lpWHMzdTN6cTdSelhjU0FTbDVmbTBSc1d0Q01PSURQIgorCQkJCSsgIkFPZjlUZjJ4dFh4UEN1Q0lNQ1I1d09Hbk5UYUZ4Z25KRUhBR3hpbEJoWkRnZU1OSG1DTjFyTUs1QjVJUkpPblp4Y3BjTDFOZUczQVBUQ0lNUDFsTkF4bmdZdWxEbTloZUZTQmM4VGZYQUFEcTc3MDNBdmtKVDBRUHBHcTJ6MlAiCisJCQkJKyAidGxpa2NBbklqbVdnZkM1VG03VUg0NjJCQWxUeUhnNEV4blBQTDRBTzhjOTJWckQ3a1pTZ1NxaXk3M2NOM2dMVDh1aWdrS3JVZ1hRRkdWVUZyWFZ5eVFYWXRWTTZiTEJldUNHUWY0QzJqOGxrTmc2TTBKM1BDMFB6TVJvaW5PeGsiCisJCQkJKyAiQWUydGVlQ3RWY0lqNEExS1FvMzIxMGo4cTJ2N3FRVTY5TWFic2E2RFQ5RmdFNHJjcmJpRldyZzBadG80U1hXRDNvMWVKQTlvMjlsVGc2a3h0a2xIM1R1WlRtcGk1S1ZwMU5GaFMxUnBucUY4M3R6djRtWkxLc3g3WmgxZkVnWXZSRnd4MSIKKwkJCQkrICJhcjNSb2x5RGZOb1ppR0JHVE1zWnp6N1JQRkJmMmhUbkxtTnFWR1FuSEtoaEdqMFk1czh0MmNicWJPMm5tSGlKYjl1YVVWckNHeXBnYkFjSkwzS1BPQmZBVlc4UGNwbU5qNHlWakkzTDR4NXpIam1HWmJwOXZLc2hFUU9EY3JtY2dzWUFvS3FlIgorCQkJCSsgInV1NXU3ams4WFZ4RWZRMG01cUw4VU9FclhQbEpvdlNtS1VtUDVCNVQwdzI5OXpJV0RZQ3pTb05hc0hwSGpPTURMQWlERGVIYm96VU9uOXQzUW91MDBlOVBPcTRSTU0wVm5JeDFIMzhuSm9KWnoyWEg4Q0k1WU1RZTdvVGFnYXhnUVRGMmFhMHFhcTIiCisJCQkJKyAiVjZuSnNmUkdSa2xHak5oRkZZUDJjUzRYdjJJSk85RFNYNkxUWE9tRU5yR1ZKSnZNT1pjdm5CYVpQZm9BSE4wTFU0aTFTb2VwTHp1bEl4blpCZmtVV0ZKZ1o1d1EwQmNvMkdDMUhNcXpXMjFyd3k0WEhSeFhwWGJtVzhMVnlvQTFLYm5tVm1ST3ljVTQiCisJCQkJKyAic2NUWjYySXhJY0lXQ1ZlTWpCSWNUdmlYVUxiUFV5cWxmRVBYV3I4SU1KdHBBYUVMV2d5cXVQQ2xBUkVNRHMyYjl6dEttVWVYbE1jY0ZFUzFYV2JGVHJoQkhobW1EeVZSZUVnQ3dmb2tyVUZSMTNMVFVLMWs4STZPRUhPcyI7CisKKwkJcmVzb3VyY2VFeGNjZWRzRGVzY0xpbWl0LnNldERlc2NyaXB0aW9uKHRvb0xvbmdSZXNvdXJjZURlc2MpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGNjZWRzRGVzY0xpbWl0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9ERVNDUklQVElPTl9FWENFRURTX0xJTUlULCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpLCAiIiArIFZhbGlkYXRpb25VdGlscy5DT01QT05FTlRfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZURlc2NOb3RFbmdsaXNoKCkgeworCQlSZXNvdXJjZSBub3RFbmdsaXNoID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQkvLyBOb3QgZW5nbGlzaAorCQlTdHJpbmcgbm90RW5nbGlzaERlc2MgPSAiXHVDMkI1IjsKKwkJbm90RW5nbGlzaC5zZXREZXNjcmlwdGlvbihub3RFbmdsaXNoRGVzYyk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShub3RFbmdsaXNoLCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0RFU0NSSVBUSU9OLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFJlc291cmNlRGVzY3JpcHRpb25FbXB0eSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXREZXNjcmlwdGlvbigiIik7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4aXN0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04sIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VEZXNjcmlwdGlvbk1pc3NpbmcoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhpc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCXJlc291cmNlRXhpc3Quc2V0RGVzY3JpcHRpb24obnVsbCk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4aXN0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX01JU1NJTkdfREVTQ1JJUFRJT04sIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKwkvLyBSZXNvdXJjZSBkZXNjcmlwdGlvbiAtIGVuZAorCS8vIFJlc291cmNlIGljb24gc3RhcnQKKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VJY29uTWlzc2luZygpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRJY29uKG51bGwpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGlzdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0lDT04sIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VJY29uSW52YWxpZCgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRJY29uKCJramszNDUzXiYiKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhpc3QsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9JQ09OLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFJlc291cmNlSWNvbkV4Y2VlZHNMaW1pdCgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRJY29uKCJkc2pmaHNrZGZoc2tqZGhmc2tqZGhramRoZmtzaGRma3Nqc2RrZmhzZGZzZGZzZGZzZnNkZnNmIik7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4aXN0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lDT05fRVhDRUVEU19MSU1JVCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSwgIiIgKyBWYWxpZGF0aW9uVXRpbHMuSUNPTl9NQVhfTEVOR1RIKTsKKwl9CisKKwkvLyBSZXNvdXJjZSBpY29uIGVuZAorCS8vIFJlc291cmNlIHRhZ3MgLSBzdGFydAorCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VUYWdOb3RFeGlzdCgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRUYWdzKG51bGwpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGlzdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX1RBR1MpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VUYWdFbXB0eSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRUYWdzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhpc3QsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19UQUdTKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFRhZ3NFeGNlZWRzTGltaXRDcmVhdGUoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhjY2Vkc05hbWVMaW1pdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJU3RyaW5nIHRhZzEgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCalEiOworCQlTdHJpbmcgdGFnMiA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqVyI7CisJCVN0cmluZyB0YWczID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpFIjsKKwkJU3RyaW5nIHRhZzQgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamIiOworCQlTdHJpbmcgdGFnNSA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqciI7CisJCVN0cmluZyB0YWc2ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpmIjsKKwkJU3RyaW5nIHRhZzcgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamciOworCQlTdHJpbmcgdGFnOCA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqZCI7CisJCVN0cmluZyB0YWc5ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpmIjsKKwkJU3RyaW5nIHRhZzEwID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpnIjsKKwkJU3RyaW5nIHRhZzExID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpoIjsKKwkJU3RyaW5nIHRhZzEyID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpqIjsKKwkJU3RyaW5nIHRhZzEzID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmprIjsKKwkJU3RyaW5nIHRhZzE0ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpzIjsKKwkJU3RyaW5nIHRhZzE1ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmp6IjsKKwkJU3RyaW5nIHRhZzE2ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmp4IjsKKwkJU3RyaW5nIHRhZzE3ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmoyIjsKKwkJU3RyaW5nIHRhZzE4ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmozIjsKKwkJU3RyaW5nIHRhZzE5ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmo0IjsKKwkJU3RyaW5nIHRhZzIwID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmo1IjsKKwkJU3RyaW5nIHRhZzIxID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmowIjsKKworCQlMaXN0PFN0cmluZz4gdGFnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEpOworCQl0YWdzTGlzdC5hZGQodGFnMik7CisJCXRhZ3NMaXN0LmFkZCh0YWczKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzQpOworCQl0YWdzTGlzdC5hZGQodGFnNSk7CisJCXRhZ3NMaXN0LmFkZCh0YWc2KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzcpOworCQl0YWdzTGlzdC5hZGQodGFnOCk7CisJCXRhZ3NMaXN0LmFkZCh0YWc5KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEwKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzExKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEyKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEzKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE0KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE1KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE2KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE3KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE4KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE5KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzIwKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzIxKTsKKwkJdGFnc0xpc3QuYWRkKHJlc291cmNlRXhjY2Vkc05hbWVMaW1pdC5nZXROYW1lKCkpOworCisJCXJlc291cmNlRXhjY2Vkc05hbWVMaW1pdC5zZXRUYWdzKHRhZ3NMaXN0KTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhjY2Vkc05hbWVMaW1pdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfVEFHU19FWENFRURfTElNSVQsICIiICsgVmFsaWRhdGlvblV0aWxzLlRBR19MSVNUX01BWF9MRU5HVEgpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RUYWdzU2luZ2xlRXhjZWVkc0xpbWl0KCkgeworCQlSZXNvdXJjZSByZXNvdXJjZUV4Y2NlZHNOYW1lTGltaXQgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCVN0cmluZyB0YWcxID0gImFmenMycUxCYjVYNnRaaGl1bmtjRXdpRlgxcVJRWThZWmwzeTNEdTVNNXhlUVk1TnE5YWZjRkhEWjlIYVVSdzQzZ0gyN25BVVdNMzZiTWJNeWx3VEZTenpOVjhOTzR2NHJpcGU2UTE1VmMyblBPRkkiOworCQlTdHJpbmcgdGFnMiA9IHJlc291cmNlRXhjY2Vkc05hbWVMaW1pdC5nZXROYW1lKCk7CisJCUxpc3Q8U3RyaW5nPiB0YWdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzTGlzdC5hZGQodGFnMSk7CisJCXRhZ3NMaXN0LmFkZCh0YWcyKTsKKworCQlyZXNvdXJjZUV4Y2NlZHNOYW1lTGltaXQuc2V0VGFncyh0YWdzTGlzdCk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4Y2NlZHNOYW1lTGltaXQsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULCAiIiArIFZhbGlkYXRpb25VdGlscy5UQUdfTUFYX0xFTkdUSCk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFRhZ3NOb1NlcnZpY2VOYW1lKCkgeworCQlSZXNvdXJjZSBzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJU3RyaW5nIHRhZzEgPSAiYWZ6czJxTEJiIjsKKwkJTGlzdDxTdHJpbmc+IHRhZ3NMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRhZ3NMaXN0LmFkZCh0YWcxKTsKKwkJc2VydmljZUV4Y2NlZHNOYW1lTGltaXQuc2V0VGFncyh0YWdzTGlzdCk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9UQUdTX05PX0NPTVBfTkFNRSk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdEludmFsaWRUYWcoKSB7CisJCVJlc291cmNlIHNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0ID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQlTdHJpbmcgdGFnMSA9ICJhZnpzMnFMQmIlIyUiOworCQlMaXN0PFN0cmluZz4gdGFnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEpOworCQlzZXJ2aWNlRXhjY2Vkc05hbWVMaW1pdC5zZXRUYWdzKHRhZ3NMaXN0KTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHNlcnZpY2VFeGNjZWRzTmFtZUxpbWl0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfRklFTERfRk9STUFULCBuZXcgU3RyaW5nW10geyAiUmVzb3VyY2UiLCAidGFnIiB9KTsKKworCX0KKworCS8vIFJlc291cmNlIHRhZ3MgLSBzdG9wCisJLy8gUmVzb3VyY2UgY29udGFjdCBpbmZvIHN0YXJ0CisJcHJpdmF0ZSB2b2lkIHRlc3RDb250YWN0SWRUb29Mb25nKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZUNvbnRhY3RJZCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJLy8gNyBjaGFycyBpbnN0ZWFkIG9mIDYKKwkJU3RyaW5nIGNvbnRhY3RJZFRvb0xvbmcgPSAieXJ0MTIzNCI7CisJCXJlc291cmNlQ29udGFjdElkLnNldENvbnRhY3RJZChjb250YWN0SWRUb29Mb25nKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlQ29udGFjdElkLCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0Q29udGFjdElkV3JvbmdGb3JtYXRDcmVhdGUoKSB7CisJCVJlc291cmNlIHJlc291cmNlQ29udGFjdElkID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQkvLyAzIGxldHRlcnMgYW5kIDMgZGlnaXRzCisJCVN0cmluZyBjb250YWN0SWRUb29Mb25nID0gInlydDEzNCI7CisJCXJlc291cmNlQ29udGFjdElkLnNldENvbnRhY3RJZChjb250YWN0SWRUb29Mb25nKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlQ29udGFjdElkLCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1QsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VDb250YWN0SWRFbXB0eSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRDb250YWN0SWQoIiIpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGlzdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1QsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VDb250YWN0SWRNaXNzaW5nKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZUV4aXN0ID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQlyZXNvdXJjZUV4aXN0LnNldENvbnRhY3RJZChudWxsKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhpc3QsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DT05UQUNULCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFZlbmRvck5hbWVFeGNlZWRzTGltaXQoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhjY2Vkc1ZlbmRvck5hbWVMaW1pdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJU3RyaW5nIHRvb0xvbmdWZW5kb3JOYW1lID0gImgxS1N5Smg5RWgxS1N5Smg5RWgxS1N5Smg5RWgxS1N5Smg5RSI7CisJCXJlc291cmNlRXhjY2Vkc1ZlbmRvck5hbWVMaW1pdC5zZXRWZW5kb3JOYW1lKHRvb0xvbmdWZW5kb3JOYW1lKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhjY2Vkc1ZlbmRvck5hbWVMaW1pdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5WRU5ET1JfTkFNRV9FWENFRURTX0xJTUlULCAiIiArIFZhbGlkYXRpb25VdGlscy5WRU5ET1JfTkFNRV9NQVhfTEVOR1RIKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFZlbmRvck5hbWVXcm9uZ0Zvcm1hdENyZWF0ZSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCS8vIGNvbnRhaW5zICoKKwkJU3RyaW5nIG5hbWVXcm9uZ0Zvcm1hdCA9ICJsamcqZmQiOworCQlyZXNvdXJjZS5zZXRWZW5kb3JOYW1lKG5hbWVXcm9uZ0Zvcm1hdCk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9OQU1FKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFZlbmRvclJlbGVhc2VXcm9uZ0Zvcm1hdCgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCS8vIGNvbnRhaW5zID4KKwkJU3RyaW5nIG5hbWVXcm9uZ0Zvcm1hdCA9ICIxPjIiOworCQlyZXNvdXJjZS5zZXRWZW5kb3JSZWxlYXNlKG5hbWVXcm9uZ0Zvcm1hdCk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX1ZFTkRPUl9SRUxFQVNFKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0VmVuZG9yUmVsZWFzZUV4Y2VlZHNMaW1pdENyZWF0ZSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGNjZWRzTmFtZUxpbWl0ID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQlTdHJpbmcgdG9vTG9uZ1ZlbmRvclJlbGVhc2UgPSAiaDFLU3lKaDlFaDFLU3lKaDlFaDFLU3lKaDlFaDFLU3lKaDlFIjsKKwkJcmVzb3VyY2VFeGNjZWRzTmFtZUxpbWl0LnNldFZlbmRvclJlbGVhc2UodG9vTG9uZ1ZlbmRvclJlbGVhc2UpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGNjZWRzTmFtZUxpbWl0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLlZFTkRPUl9SRUxFQVNFX0VYQ0VFRFNfTElNSVQsICIiICsgVmFsaWRhdGlvblV0aWxzLlZFTkRPUl9SRUxFQVNFX01BWF9MRU5HVEgpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VWZW5kb3JOYW1lTWlzc2luZygpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRWZW5kb3JOYW1lKG51bGwpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGlzdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfVkVORE9SX05BTUUpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2VWZW5kb3JSZWxlYXNlTWlzc2luZygpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXRWZW5kb3JSZWxlYXNlKG51bGwpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGlzdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfVkVORE9SX1JFTEVBU0UpOworCX0KKworCS8vIFJlc291cmNlIHZlbmRvciBuYW1lL3JlbGVhc2Ugc3RvcAorCS8vIENhdGVnb3J5IHN0YXJ0CisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZUNhdGVnb3J5RXhpc3QoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhpc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCXJlc291cmNlRXhpc3Quc2V0Q2F0ZWdvcmllcyhudWxsKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhpc3QsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfTUlTU0lOR19DQVRFR09SWSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZUJhZENhdGVnb3J5Q3JlYXRlKCkgeworCisJCVJlc291cmNlIHJlc291cmNlRXhpc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCXJlc291cmNlRXhpc3Quc2V0Q2F0ZWdvcmllcyhudWxsKTsKKwkJcmVzb3VyY2VFeGlzdC5hZGRDYXRlZ29yeSgia29rbyIsICJrb2tvIik7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4aXN0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ0FURUdPUlksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCS8vIENhdGVnb3J5IHN0b3AKKwkvLyBDb3N0IHN0YXJ0CisJcHJpdmF0ZSB2b2lkIHRlc3RIYXBweVNjZW5hcmlvQ29zdExpY2Vuc2VUeXBlKCkgeworCQlSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZU9iamVjdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKwkJUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VPYmplY3RBZnRlckNyZWF0ZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQkvLyBBZGRpbmcgY29zdCBhbmQgbGljZW5zZVR5cGUgdG8gYmFzaWMgbW9jaworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckNyZWF0ZSA9IEVpdGhlci5sZWZ0KGNyZWF0ZVJlc291cmNlT2JqZWN0QWZ0ZXJDcmVhdGUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmNyZWF0ZVJlc291cmNlKE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpKS50aGVuUmV0dXJuKGVpdGhlckNyZWF0ZSk7CisKKwkJU3RyaW5nIGNvc3QgPSAiMTIzLjQ1NiI7CisJCVN0cmluZyBsaWNlbnNlVHlwZSA9ICJVc2VyIjsKKwkJY3JlYXRlUmVzb3VyY2VPYmplY3Quc2V0Q29zdChjb3N0KTsKKwkJY3JlYXRlUmVzb3VyY2VPYmplY3Quc2V0TGljZW5zZVR5cGUobGljZW5zZVR5cGUpOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKGNyZWF0ZVJlc291cmNlT2JqZWN0LCB1c2VyLCBudWxsLCBudWxsKTsKKworCQlpZiAoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMjAwKSwgY3JlYXRlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpLmdldFN0YXR1cygpKTsKKwkJfQorCQljcmVhdGVSZXNvdXJjZU9iamVjdEFmdGVyQ3JlYXRlLnNldENvc3QoY29zdCk7CisJCWNyZWF0ZVJlc291cmNlT2JqZWN0QWZ0ZXJDcmVhdGUuc2V0TGljZW5zZVR5cGUobGljZW5zZVR5cGUpOworCQlhc3NlcnRFcXVhbHMoY3JlYXRlUmVzb3VyY2VPYmplY3RBZnRlckNyZWF0ZSwgY3JlYXRlUmVzcG9uc2UubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXN0Q29zdFdyb25nRm9ybWF0Q3JlYXRlKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZUNvc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCS8vIENvbW1hIGluc3RlYWQgb2YgZnVsbHN0b3AKKwkJU3RyaW5nIGNvc3QgPSAiMTIzNTYsNDY0IjsKKwkJcmVzb3VyY2VDb3N0LnNldENvc3QoY29zdCk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUNvc3QsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5UKTsKKwl9CisKKwkvLyBDb3N0IHN0b3AKKwkvLyBMaWNlbnNlIHR5cGUgc3RhcnQKKwlwcml2YXRlIHZvaWQgdGVzdExpY2Vuc2VUeXBlV3JvbmdGb3JtYXRDcmVhdGUoKSB7CisJCVJlc291cmNlIHJlc291cmNlTGljZW5zZVR5cGUgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCS8vIGxvd2Nhc2UKKwkJU3RyaW5nIGxpY2Vuc2VUeXBlID0gImNwdSI7CisJCXJlc291cmNlTGljZW5zZVR5cGUuc2V0TGljZW5zZVR5cGUobGljZW5zZVR5cGUpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VMaWNlbnNlVHlwZSwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQpOworCX0KKworCS8vIExpY2Vuc2UgdHlwZSBzdG9wCisJLy8gRGVyaXZlZCBmcm9tIHN0YXJ0CisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZVRlbXBsYXRlTm90RXhpc3QoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhpc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbnVsbDsKKwkJcmVzb3VyY2VFeGlzdC5zZXREZXJpdmVkRnJvbShsaXN0KTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhpc3QsIHVzZXIsIG51bGwsIG51bGwpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5NSVNTSU5HX0RFUklWRURfRlJPTV9URU1QTEFURSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRlc3RSZXNvdXJjZVRlbXBsYXRlRW1wdHkoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhpc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisJCXJlc291cmNlRXhpc3Quc2V0RGVyaXZlZEZyb20obmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VFeGlzdCwgdXNlciwgbnVsbCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfREVSSVZFRF9GUk9NX1RFTVBMQVRFKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGVzdFJlc291cmNlVGVtcGxhdGVJbnZhbGlkKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZUV4aXN0ID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoImt1a3UiKTsKKwkJcmVzb3VyY2VFeGlzdC5zZXREZXJpdmVkRnJvbShkZXJpdmVkRnJvbSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4aXN0LCB1c2VyLCBudWxsLCBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuUEFSRU5UX1JFU09VUkNFX05PVF9GT1VORCk7CisJfQorCS8vIERlcml2ZWQgZnJvbSBzdG9wCisKKwlwcml2YXRlIHZvaWQgYXNzZXJ0UmVzcG9uc2UoRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cyBleHBlY3RlZFN0YXR1cywgU3RyaW5nLi4uIHZhcmlhYmxlcykgeworCQlSZXNwb25zZUZvcm1hdCBleHBlY3RlZFJlc3BvbnNlID0gcmVzcG9uc2VNYW5hZ2VyLmdldFJlc3BvbnNlRm9ybWF0KGV4cGVjdGVkU3RhdHVzLCB2YXJpYWJsZXMpOworCQlSZXNwb25zZUZvcm1hdCBhY3R1YWxSZXNwb25zZSA9IGNyZWF0ZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGFjdHVhbFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhc3NlcnQgZXJyb3IgZGVzY3JpcHRpb24iLCBleHBlY3RlZFJlc3BvbnNlLmdldEZvcm1hdHRlZE1lc3NhZ2UoKSwgYWN0dWFsUmVzcG9uc2UuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpKTsKKwl9CisKKwkvLyBVUERBVEUgdGVzdHMgLSBzdGFydAorCS8vIFJlc291cmNlIG5hbWUKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU5hbWVXcm9uZ0Zvcm1hdF9VUERBVEUoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCisJCS8vIHRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBmYWlsaW5nIHdpdGggNDAzIGVhcmxpZXIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVcGRhdGUgPSBFaXRoZXIubGVmdChzZXRDYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSkpOworCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCS8vIGNvbnRhaW5zICoKKwkJU3RyaW5nIG5hbWVXcm9uZ0Zvcm1hdCA9ICJsamcqZmQiOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0TmFtZShuYW1lV3JvbmdGb3JtYXQpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfQ09NUE9ORU5UX05BTUUsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VOYW1lQWZ0ZXJDZXJ0aWZ5X1VQREFURSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKwkJUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisKKwkJLy8gdGhpcyBpcyBpbiBvcmRlciB0byBwcmV2ZW50IGZhaWxpbmcgd2l0aCA0MDMgZWFybGllcgorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclVwZGF0ZSA9IEVpdGhlci5sZWZ0KHNldENhbldvcmtPblJlc291cmNlKHJlc291cmNlKSk7CisJCS8vIHdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2VfdHgocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSxmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKworCQlTdHJpbmcgbmFtZSA9ICJsamciOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0TmFtZShuYW1lKTsKKwkJcmVzb3VyY2Uuc2V0VmVyc2lvbigiMS4wIik7CisJCTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdXBkYXRlZFJlc291cmNlLCBudWxsLCB1c2VyLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEKTsKKworCX0KKworCUBUZXN0CisJQElnbm9yZQorCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU5hbWVFeGNlZWRzTGltaXRfVVBEQVRFKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKworCQkvLyB0aGlzIGlzIGluIG9yZGVyIHRvIHByZXZlbnQgZmFpbGluZyB3aXRoIDQwMyBlYXJsaWVyCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyVXBkYXRlID0gRWl0aGVyLmxlZnQoc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpKTsKKwkJLy8gd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZV90eChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCisJCS8vIDUxIGNoYXJzLCB0aGUgbGltaXQgaXMgNTAKKwkJU3RyaW5nIHRvb0xvbmdSZXNvdXJjZU5hbWUgPSAiekNSQ0FXanF0ZTBEdGdjQUFNbWNKY1hlTnViZVgxcDF2T1pOVFNoQUhPWU5BSHZWM2lLIjsKKwkJdXBkYXRlZFJlc291cmNlLnNldE5hbWUodG9vTG9uZ1Jlc291cmNlTmFtZSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHVwZGF0ZWRSZXNvdXJjZSwgbnVsbCwgdXNlciwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05BTUVfRVhDRUVEU19MSU1JVCwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZ2V0VmFsdWUoKSwgIiIgKyBWYWxpZGF0aW9uVXRpbHMuQ09NUE9ORU5UX05BTUVfTUFYX0xFTkdUSCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VOYW1lQWxyZWFkeUV4aXN0X1VQREFURSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKwkJUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisKKwkJLy8gdGhpcyBpcyBpbiBvcmRlciB0byBwcmV2ZW50IGZhaWxpbmcgd2l0aCA0MDMgZWFybGllcgorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclVwZGF0ZSA9IEVpdGhlci5sZWZ0KHNldENhbldvcmtPblJlc291cmNlKHJlc291cmNlKSk7CisJCS8vIHdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2VfdHgocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSxmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gImFscmVhZHlFeGlzdHMiOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0TmFtZShyZXNvdXJjZU5hbWUpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1QsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCksIHJlc291cmNlTmFtZSk7CisJfQorCisJLy8KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlRGVzY0V4Y2VlZHNMaW1pdF9VUERBVEUoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCisJCS8vIHRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBmYWlsaW5nIHdpdGggNDAzIGVhcmxpZXIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVcGRhdGUgPSBFaXRoZXIubGVmdChzZXRDYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSkpOworCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisKKwkJLy8gMTAyNSBjaGFycywgdGhlIGxpbWl0IGlzIDEwMjQKKwkJU3RyaW5nIHRvb0xvbmdSZXNvdXJjZURlc2MgPSAiMUdVT0RvalEwc0d6S1I0TlA3ZTVqODJBRFEzS0hUVk9hZXpMOTVxY2J1YXFEdGpaaEFRR1EzaUZ3S0F5NTgwSzRXaWlYczN1M3pxN1J6WGNTQVNsNWZtMFJzV3RDTU9JRFAiCisJCQkJKyAiQU9mOVRmMnh0WHhQQ3VDSU1DUjV3T0duTlRhRnhnbkpFSEFHeGlsQmhaRGdlTU5IbUNOMXJNSzVCNUlSSk9uWnhjcGNMMU5lRzNBUFRDSU1QMWxOQXhuZ1l1bERtOWhlRlNCYzhUZlhBQURxNzcwM0F2a0pUMFFQcEdxMnoyUCIKKwkJCQkrICJ0bGlrY0FuSWptV2dmQzVUbTdVSDQ2MkJBbFR5SGc0RXhuUFBMNEFPOGM5MlZyRDdrWlNnU3FpeTczY04zZ0xUOHVpZ2tLclVnWFFGR1ZVRnJYVnl5UVhZdFZNNmJMQmV1Q0dRZjRDMmo4bGtOZzZNMEozUEMwUHpNUm9pbk94ayIKKwkJCQkrICJBZTJ0ZWVDdFZjSWo0QTFLUW8zMjEwajhxMnY3cVFVNjlNYWJzYTZEVDlGZ0U0cmNyYmlGV3JnMFp0bzRTWFdEM28xZUpBOW8yOWxUZzZreHRrbEgzVHVaVG1waTVLVnAxTkZoUzFScG5xRjgzdHp2NG1aTEtzeDdaaDFmRWdZdlJGd3gxIgorCQkJCSsgImFyM1JvbHlEZk5vWmlHQkdUTXNaeno3UlBGQmYyaFRuTG1OcVZHUW5IS2hoR2owWTVzOHQyY2JxYk8ybm1IaUpiOXVhVVZyQ0d5cGdiQWNKTDNLUE9CZkFWVzhQY3BtTmo0eVZqSTNMNHg1ekhqbUdaYnA5dktzaEVRT0Rjcm1jZ3NZQW9LcWUiCisJCQkJKyAidXU1dTdqazhYVnhFZlEwbTVxTDhVT0VyWFBsSm92U21LVW1QNUI1VDB3Mjk5eklXRFlDelNvTmFzSHBIak9NRExBaUREZUhib3pVT245dDNRb3UwMGU5UE9xNFJNTTBWbkl4MUgzOG5Kb0paejJYSDhDSTVZTVFlN29UYWdheGdRVEYyYWEwcWFxMiIKKwkJCQkrICJWNm5Kc2ZSR1JrbEdqTmhGRllQMmNTNFh2MklKTzlEU1g2TFRYT21FTnJHVkpKdk1PWmN2bkJhWlBmb0FITjBMVTRpMVNvZXBMenVsSXhuWkJma1VXRkpnWjV3UTBCY28yR0MxSE1xelcyMXJ3eTRYSFJ4WHBYYm1XOExWeW9BMUtibm1WbVJPeWNVNCIKKwkJCQkrICJzY1RaNjJJeEljSVdDVmVNakJJY1R2aVhVTGJQVXlxbGZFUFhXcjhJTUp0cEFhRUxXZ3lxdVBDbEFSRU1EczJiOXp0S21VZVhsTWNjRkVTMVhXYkZUcmhCSGhtbUR5VlJlRWdDd2Zva3JVRlIxM0xUVUsxazhJNk9FSE9zIjsKKwkJdXBkYXRlZFJlc291cmNlLnNldERlc2NyaXB0aW9uKHRvb0xvbmdSZXNvdXJjZURlc2MpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9ERVNDUklQVElPTl9FWENFRURTX0xJTUlULCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpLCAiIiArIFZhbGlkYXRpb25VdGlscy5DT01QT05FTlRfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJY29uV3JvbmdGb3JtYXRfVVBEQVRFKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKworCQkvLyB0aGlzIGlzIGluIG9yZGVyIHRvIHByZXZlbnQgZmFpbGluZyB3aXRoIDQwMyBlYXJsaWVyCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyVXBkYXRlID0gRWl0aGVyLmxlZnQoc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpKTsKKwkJLy8gd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZV90eChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCisJCS8vIGNvbnRhaW5zIC4KKwkJU3RyaW5nIGljb24gPSAiaWNvbi5qcGciOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0SWNvbihpY29uKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdXBkYXRlZFJlc291cmNlLCBudWxsLCB1c2VyLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9JQ09OLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEljb25BZnRlckNlcnRpZnlfVVBEQVRFKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKworCQkvLyB0aGlzIGlzIGluIG9yZGVyIHRvIHByZXZlbnQgZmFpbGluZyB3aXRoIDQwMyBlYXJsaWVyCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyVXBkYXRlID0gRWl0aGVyLmxlZnQoc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpKTsKKwkJLy8gd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZV90eChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCisJCS8vIGNvbnRhaW5zCisJCVN0cmluZyBpY29uID0gImljb24iOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0SWNvbihpY29uKTsKKworCQlyZXNvdXJjZS5zZXRWZXJzaW9uKCIxLjAiKTsKKwkJOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLlJFU09VUkNFX0lDT05fQ0FOTk9UX0JFX0NIQU5HRUQpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VGFnc0V4Y2VlZHNMaW1pdF9VUERBVEUoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCisJCS8vIHRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBmYWlsaW5nIHdpdGggNDAzIGVhcmxpZXIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVcGRhdGUgPSBFaXRoZXIubGVmdChzZXRDYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSkpOworCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisKKwkJU3RyaW5nIHRhZzEgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCalEiOworCQlTdHJpbmcgdGFnMiA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqVyI7CisJCVN0cmluZyB0YWczID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpFIjsKKwkJU3RyaW5nIHRhZzQgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamIiOworCQlTdHJpbmcgdGFnNSA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqciI7CisJCVN0cmluZyB0YWc2ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpmIjsKKwkJU3RyaW5nIHRhZzcgPSAiSTYzbGxNU0VGMTJGbnRUd3BNdDY0SmhvcGtqUVp6djVLUzdtQm9Sa3U0MlBZTHJCamciOworCQlTdHJpbmcgdGFnOCA9ICJJNjNsbE1TRUYxMkZudFR3cE10NjRKaG9wa2pRWnp2NUtTN21Cb1JrdTQyUFlMckJqZCI7CisJCVN0cmluZyB0YWc5ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpmIjsKKwkJU3RyaW5nIHRhZzEwID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpnIjsKKwkJU3RyaW5nIHRhZzExID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpoIjsKKwkJU3RyaW5nIHRhZzEyID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpqIjsKKwkJU3RyaW5nIHRhZzEzID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmprIjsKKwkJU3RyaW5nIHRhZzE0ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmpzIjsKKwkJU3RyaW5nIHRhZzE1ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmp6IjsKKwkJU3RyaW5nIHRhZzE2ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmp4IjsKKwkJU3RyaW5nIHRhZzE3ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmoyIjsKKwkJU3RyaW5nIHRhZzE4ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmozIjsKKwkJU3RyaW5nIHRhZzE5ID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmo0IjsKKwkJU3RyaW5nIHRhZzIwID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmo1IjsKKwkJU3RyaW5nIHRhZzIxID0gIkk2M2xsTVNFRjEyRm50VHdwTXQ2NEpob3BralFaenY1S1M3bUJvUmt1NDJQWUxyQmowIjsKKworCQlMaXN0PFN0cmluZz4gdGFnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEpOworCQl0YWdzTGlzdC5hZGQodGFnMik7CisJCXRhZ3NMaXN0LmFkZCh0YWczKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzQpOworCQl0YWdzTGlzdC5hZGQodGFnNSk7CisJCXRhZ3NMaXN0LmFkZCh0YWc2KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzcpOworCQl0YWdzTGlzdC5hZGQodGFnOCk7CisJCXRhZ3NMaXN0LmFkZCh0YWc5KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEwKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzExKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEyKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzEzKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE0KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE1KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE2KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE3KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE4KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzE5KTsKKwkJdGFnc0xpc3QuYWRkKHRhZzIwKTsKKwkJdGFnc0xpc3QuYWRkKHRhZzIxKTsKKwkJdGFnc0xpc3QuYWRkKHJlc291cmNlLmdldE5hbWUoKSk7CisKKwkJdXBkYXRlZFJlc291cmNlLnNldFRhZ3ModGFnc0xpc3QpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1RBR1NfRVhDRUVEX0xJTUlULCAiIiArIFZhbGlkYXRpb25VdGlscy5UQUdfTElTVF9NQVhfTEVOR1RIKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWZW5kb3JOYW1lV3JvbmdGb3JtYXRfVVBEQVRFKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKworCQkvLyB0aGlzIGlzIGluIG9yZGVyIHRvIHByZXZlbnQgZmFpbGluZyB3aXRoIDQwMyBlYXJsaWVyCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyVXBkYXRlID0gRWl0aGVyLmxlZnQoc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpKTsKKwkJLy8gd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZV90eChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCisJCS8vIGNvbnRhaW5zICoKKwkJU3RyaW5nIG5hbWVXcm9uZ0Zvcm1hdCA9ICJsamcqZmQiOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0VmVuZG9yTmFtZShuYW1lV3JvbmdGb3JtYXQpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLklOVkFMSURfVkVORE9SX05BTUUpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmVuZG9yTmFtZUFmdGVyQ2VydGlmeV9VUERBVEUoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCisJCS8vIHRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBmYWlsaW5nIHdpdGggNDAzIGVhcmxpZXIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVcGRhdGUgPSBFaXRoZXIubGVmdChzZXRDYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSkpOworCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisKKwkJLy8gY29udGFpbnMgKgorCQlTdHJpbmcgbmFtZVdyb25nRm9ybWF0ID0gImxqZypmZCI7CisJCXVwZGF0ZWRSZXNvdXJjZS5zZXRWZW5kb3JOYW1lKG5hbWVXcm9uZ0Zvcm1hdCk7CisJCXJlc291cmNlLnNldFZlcnNpb24oIjEuMCIpOworCQk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHVwZGF0ZWRSZXNvdXJjZSwgbnVsbCwgdXNlciwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfVkVORE9SX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmVuZG9yUmVsZWFzZUV4Y2VlZHNMaW1pdF9VUERBVEUoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCisJCS8vIHRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBmYWlsaW5nIHdpdGggNDAzIGVhcmxpZXIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVcGRhdGUgPSBFaXRoZXIubGVmdChzZXRDYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSkpOworCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisKKwkJLy8gMTI5IGNoYXJzLCB0aGUgbGltaXQgaXMgMTI4CisJCVN0cmluZyB0b29Mb25nVmVuZG9yUmVsZWFzZSA9ICJoMUtTeUpoOUVzcEk4U1B3QUd1NFZFVGZxV2VqZWFudUIxUENKQnhKbUpuY1luclcwbG5zRUZGVlJJdWtSSmt3bE9WblpDeThwMzh0amhBTmVacTNCR01ISWF3V1I2SUNsOFdpOW1pa1JZQUxXZ3ZKdWcwMEpybFEwaVBWS1BMeHkiOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZSh0b29Mb25nVmVuZG9yUmVsZWFzZSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHVwZGF0ZWRSZXNvdXJjZSwgbnVsbCwgdXNlciwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuVkVORE9SX1JFTEVBU0VfRVhDRUVEU19MSU1JVCwgIiIgKyBWYWxpZGF0aW9uVXRpbHMuVkVORE9SX1JFTEVBU0VfTUFYX0xFTkdUSCk7CisJfQorCisJLy8gMTYxME9TIFN1cHBvcnQgLSBCZWNhdXNlIG9mIGNoYW5nZXMgaW4gdGhlIHZhbGlkYXRpb24gaW4gdGhlIHVpIHRoaXMgdGVzdCBuZWVkcyB0byBiZSBmaXhlZAorLy8JQFRlc3QKKy8vCXB1YmxpYyB2b2lkIHRlc3RDb250YWN0SWRXcm9uZ0Zvcm1hdF9VUERBVEUoKSB7CisvLwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKy8vCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKy8vCisvLwkJLy8gdGhpcyBpcyBpbiBvcmRlciB0byBwcmV2ZW50IGZhaWxpbmcgd2l0aCA0MDMgZWFybGllcgorLy8JCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyVXBkYXRlID0gRWl0aGVyLmxlZnQoc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpKTsKKy8vCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisvLwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKy8vCisvLwkJU3RyaW5nIHJlc291cmNlSWQgPSByZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworLy8JCS8vIDMgbGV0dGVycyBhbmQgMyBkaWdpdHMKKy8vCQlTdHJpbmcgY29udGFjdElkVG9vTG9uZyA9ICJ5cnQxMzQiOworLy8JCXVwZGF0ZWRSZXNvdXJjZS5zZXRDb250YWN0SWQoY29udGFjdElkVG9vTG9uZyk7CisvLwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKHJlc291cmNlSWQsIHVwZGF0ZWRSZXNvdXJjZSwgbnVsbCwgdXNlciwgZmFsc2UpOworLy8JCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKy8vCisvLwkJYXNzZXJ0UmVzcG9uc2UoY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfSU5WQUxJRF9DT05UQUNULCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5nZXRWYWx1ZSgpKTsKKy8vCX0JCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUJhZENhdGVnb3J5X1VQREFURSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKwkJUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisKKwkJLy8gdGhpcyBpcyBpbiBvcmRlciB0byBwcmV2ZW50IGZhaWxpbmcgd2l0aCA0MDMgZWFybGllcgorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclVwZGF0ZSA9IEVpdGhlci5sZWZ0KHNldENhbldvcmtPblJlc291cmNlKHJlc291cmNlKSk7CisJCS8vIHdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2VfdHgocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSxmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyBiYWRDYXRlZ29yeSA9ICJkZGZkcyI7CisJCXVwZGF0ZWRSZXNvdXJjZS5zZXRDYXRlZ29yaWVzKG51bGwpOworCQl1cGRhdGVkUmVzb3VyY2UuYWRkQ2F0ZWdvcnkoYmFkQ2F0ZWdvcnksICJmaWt0Iik7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZUlkLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOVkFMSURfQ0FURUdPUlksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLmdldFZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlQ2F0ZWdvcnlBZnRlckNlcnRpZnlfVVBEQVRFKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKworCQkvLyB0aGlzIGlzIGluIG9yZGVyIHRvIHByZXZlbnQgZmFpbGluZyB3aXRoIDQwMyBlYXJsaWVyCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyVXBkYXRlID0gRWl0aGVyLmxlZnQoc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpKTsKKwkJLy8gd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZV90eChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCisJCVN0cmluZyByZXNvdXJjZUlkID0gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJdXBkYXRlZFJlc291cmNlLnNldENhdGVnb3JpZXMobnVsbCk7CisJCXVwZGF0ZWRSZXNvdXJjZS5hZGRDYXRlZ29yeShSRVNPVVJDRV9DQVRFR09SWTEsIFVQREFURURfU1VCQ0FURUdPUlkpOworCQlyZXNvdXJjZS5zZXRWZXJzaW9uKCIxLjAiKTsKKwkJOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZUlkLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfQ0FURUdPUllfQ0FOTk9UX0JFX0NIQU5HRUQpOworCX0KKworCS8vIERlcml2ZWQgZnJvbSBzdGFydAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlVGVtcGxhdGVOb3RFeGlzdF9VUERBVEUoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCisJCS8vIHRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBmYWlsaW5nIHdpdGggNDAzIGVhcmxpZXIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVcGRhdGUgPSBFaXRoZXIubGVmdChzZXRDYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSkpOworCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCVN0cmluZyByZXNvdXJjZUlkID0gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlMaXN0PFN0cmluZz4gbGlzdCA9IG51bGw7CisJCXVwZGF0ZWRSZXNvdXJjZS5zZXREZXJpdmVkRnJvbShsaXN0KTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VJZCwgdXBkYXRlZFJlc291cmNlLCBudWxsLCB1c2VyLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfREVSSVZFRF9GUk9NX1RFTVBMQVRFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVRlbXBsYXRlRW1wdHlfVVBEQVRFKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKwkJU3RyaW5nIHJlc291cmNlSWQgPSByZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCS8vIHRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBmYWlsaW5nIHdpdGggNDAzIGVhcmxpZXIKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVcGRhdGUgPSBFaXRoZXIubGVmdChzZXRDYW5Xb3JrT25SZXNvdXJjZShyZXNvdXJjZSkpOworCQkvLyB3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlX3R4KHJlc291cmNlLmdldFVuaXF1ZUlkKCksZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclVwZGF0ZSk7CisKKwkJdXBkYXRlZFJlc291cmNlLnNldERlcml2ZWRGcm9tKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VJZCwgdXBkYXRlZFJlc291cmNlLCBudWxsLCB1c2VyLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLk1JU1NJTkdfREVSSVZFRF9GUk9NX1RFTVBMQVRFKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVRlbXBsYXRlSW52YWxpZF9VUERBVEUoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVJlc291cmNlIHVwZGF0ZWRSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJLy8gdGhpcyBpcyBpbiBvcmRlciB0byBwcmV2ZW50IGZhaWxpbmcgd2l0aCA0MDMgZWFybGllcgorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclVwZGF0ZSA9IEVpdGhlci5sZWZ0KHNldENhbldvcmtPblJlc291cmNlKHJlc291cmNlKSk7CisJCS8vIHdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2VfdHgocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSxmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXBkYXRlKTsKKworCQlBcnJheUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlkZXJpdmVkRnJvbS5hZGQoImt1a3UiKTsKKwkJdXBkYXRlZFJlc291cmNlLnNldERlcml2ZWRGcm9tKGRlcml2ZWRGcm9tKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLnVwZGF0ZVJlc291cmNlTWV0YWRhdGEocmVzb3VyY2VJZCwgdXBkYXRlZFJlc291cmNlLCBudWxsLCB1c2VyLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVzcG9uc2UuaXNSaWdodCgpKTsKKworCQlhc3NlcnRSZXNwb25zZShjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzLlBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlVGVtcGxhdGVDZXJ0aWZ5X1VQREFURSgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdCh0cnVlKTsKKwkJUmVzb3VyY2UgdXBkYXRlZFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVN0cmluZyByZXNvdXJjZUlkID0gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQkvLyB0aGlzIGlzIGluIG9yZGVyIHRvIHByZXZlbnQgZmFpbGluZyB3aXRoIDQwMyBlYXJsaWVyCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyVXBkYXRlID0gRWl0aGVyLmxlZnQoc2V0Q2FuV29ya09uUmVzb3VyY2UocmVzb3VyY2UpKTsKKwkJLy8gd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZV90eChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVcGRhdGUpOworCQlyZXNvdXJjZS5zZXRWZXJzaW9uKCIxLjAiKTsKKwkJOworCisJCUFycmF5TGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWRlcml2ZWRGcm9tLmFkZCgidG9zY2Eubm9kZXMuUm9vdCIpOworCQl1cGRhdGVkUmVzb3VyY2Uuc2V0RGVyaXZlZEZyb20oZGVyaXZlZEZyb20pOworCisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZVJlc3BvbnNlID0gYmwudXBkYXRlUmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZUlkLCB1cGRhdGVkUmVzb3VyY2UsIG51bGwsIHVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCisJCWFzc2VydFJlc3BvbnNlKGNyZWF0ZVJlc3BvbnNlLCBBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfREVSSVZFRF9GUk9NX0NBTk5PVF9CRV9DSEFOR0VEKTsKKwl9CisJLy8gRGVyaXZlZCBmcm9tIHN0b3AKKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlT3JVcGRhdGVSZXNvdXJjZUFscmVhZHlDaGVja291dCgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VFeGlzdCA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSA9IGJsLmNyZWF0ZVJlc291cmNlKHJlc291cmNlRXhpc3QsIHVzZXIsIG51bGwsIG51bGwpOworCisJCWNyZWF0ZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpLnNldExhc3RVcGRhdGVyVXNlcklkKHVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzTGVmdCgpKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdFJlc3VsdCA9IEVpdGhlci5sZWZ0KGNyZWF0ZVJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RCeU5hbWUocmVzb3VyY2VFeGlzdC5nZXROYW1lKCksIHRydWUpKS50aGVuUmV0dXJuKGdldExhdGVzdFJlc3VsdCk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24ub3ZlcnJpZGVSZXNvdXJjZShNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpKS50aGVuUmV0dXJuKGdldExhdGVzdFJlc3VsdCk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VUb1VwZHRhZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2UgPSBibC5jcmVhdGVPclVwZGF0ZVJlc291cmNlQnlJbXBvcnQocmVzb3VyY2VUb1VwZHRhZSwgdXNlciwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlT3JVcGRhdGVSZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJTW9ja2l0by52ZXJpZnkocmVzb3VyY2VPcGVyYXRpb24sIE1vY2tpdG8udGltZXMoMSkpLm92ZXJyaWRlUmVzb3VyY2UoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55Qm9vbGVhbigpKTsKKwkJTW9ja2l0by52ZXJpZnkobGlmZWN5Y2xlQmwsIE1vY2tpdG8udGltZXMoMCkpLmNoYW5nZVN0YXRlKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEodXNlciksIE1vY2tpdG8uZXEoTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0hFQ0tPVVQpLCBNb2NraXRvLmFueShMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbi5jbGFzcyksIE1vY2tpdG8uYW55Qm9vbGVhbigpLCBNb2NraXRvLmFueUJvb2xlYW4oKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VDZXJ0aWZpZWQoKSB7CisJCVJlc291cmNlIHJlc291cmNlRXhpc3QgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UgPSBibC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZUV4aXN0LCB1c2VyLCBudWxsLCBudWxsKTsKKworCQlhc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJUmVzb3VyY2UgY2VydGlmaWVkUmVzb3VyY2UgPSBjcmVhdGVSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJY2VydGlmaWVkUmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCWNlcnRpZmllZFJlc291cmNlLnNldFZlcnNpb24oIjEuMCIpOworCQk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXRlc3RSZXN1bHQgPSBFaXRoZXIubGVmdChjZXJ0aWZpZWRSZXNvdXJjZSk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0QnlOYW1lKHJlc291cmNlRXhpc3QuZ2V0TmFtZSgpLCB0cnVlKSkudGhlblJldHVybihnZXRMYXRlc3RSZXN1bHQpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLm92ZXJyaWRlUmVzb3VyY2UoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihnZXRMYXRlc3RSZXN1bHQpOworCisJCXdoZW4obGlmZWN5Y2xlQmwuY2hhbmdlU3RhdGUoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5lcSh1c2VyKSwgTW9ja2l0by5lcShMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DSEVDS09VVCksIE1vY2tpdG8uYW55KExpZmVjeWNsZUNoYW5nZUluZm9XaXRoQWN0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihjcmVhdGVSZXNwb25zZSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2VUb1VwZHRhZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2UgPSBibC5jcmVhdGVPclVwZGF0ZVJlc291cmNlQnlJbXBvcnQocmVzb3VyY2VUb1VwZHRhZSwgdXNlciwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlT3JVcGRhdGVSZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJTW9ja2l0by52ZXJpZnkocmVzb3VyY2VPcGVyYXRpb24sIE1vY2tpdG8udGltZXMoMSkpLm92ZXJyaWRlUmVzb3VyY2UoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55Qm9vbGVhbigpKTsKKwkJTW9ja2l0by52ZXJpZnkobGlmZWN5Y2xlQmwsIE1vY2tpdG8udGltZXMoMSkpLmNoYW5nZVN0YXRlKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEodXNlciksIE1vY2tpdG8uZXEoTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0hFQ0tPVVQpLCBNb2NraXRvLmFueShMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbi5jbGFzcyksIE1vY2tpdG8uYW55Qm9vbGVhbigpLCBNb2NraXRvLmFueUJvb2xlYW4oKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2VOb3RFeGlzdCgpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2VUb1VwZHRhZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdFJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0QnlOYW1lKHJlc291cmNlVG9VcGR0YWUuZ2V0TmFtZSgpLCB0cnVlKSkudGhlblJldHVybihnZXRMYXRlc3RSZXN1bHQpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0VG9zY2FOYW1lUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RCeVRvc2NhUmVzb3VyY2VOYW1lKHJlc291cmNlVG9VcGR0YWUuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSwgdHJ1ZSkpLnRoZW5SZXR1cm4oZ2V0TGF0ZXN0UmVzdWx0KTsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IGNyZWF0ZU9yVXBkYXRlUmVzb3VyY2UgPSBibC5jcmVhdGVPclVwZGF0ZVJlc291cmNlQnlJbXBvcnQocmVzb3VyY2VUb1VwZHRhZSwgdXNlciwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlT3JVcGRhdGVSZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJTW9ja2l0by52ZXJpZnkocmVzb3VyY2VPcGVyYXRpb24sIE1vY2tpdG8udGltZXMoMCkpLm92ZXJyaWRlUmVzb3VyY2UoTW9ja2l0by5hbnkoUmVzb3VyY2UuY2xhc3MpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55Qm9vbGVhbigpKTsKKwkJTW9ja2l0by52ZXJpZnkobGlmZWN5Y2xlQmwsIE1vY2tpdG8udGltZXMoMCkpLmNoYW5nZVN0YXRlKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEodXNlciksIE1vY2tpdG8uZXEoTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0hFQ0tPVVQpLCBNb2NraXRvLmFueShMaWZlY3ljbGVDaGFuZ2VJbmZvV2l0aEFjdGlvbi5jbGFzcyksIE1vY2tpdG8uYW55Qm9vbGVhbigpLCBNb2NraXRvLmFueUJvb2xlYW4oKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVByb3BlcnRpZXNEZWZhdWx0VmFsdWVzX1N1Y2Nlc3NmdWxsV2l0aG91dFByb3BlcnRpZXMoKSB7CisJCVJlc291cmNlIGJhc2ljID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZVByb3BlcnRpZXNEZWZhdWx0VmFsdWVzID0gYmwudmFsaWRhdGVQcm9wZXJ0aWVzRGVmYXVsdFZhbHVlcyhiYXNpYyk7CisJCWFzc2VydFRydWUodmFsaWRhdGVQcm9wZXJ0aWVzRGVmYXVsdFZhbHVlcy5pc0xlZnQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVQcm9wZXJ0aWVzRGVmYXVsdFZhbHVlc19TdWNjZXNzZnVsbFdpdGhQcm9wZXJ0aWVzKCkgeworCQlSZXNvdXJjZSBiYXNpYyA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KHRydWUpOworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHkgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5LnNldE5hbWUoIm15UHJvcGVydHkiKTsKKwkJcHJvcGVydHkuc2V0VHlwZShUb3NjYVByb3BlcnR5VHlwZS5JTlRFR0VSLmdldFR5cGUoKSk7CisJCXByb3BlcnR5LnNldERlZmF1bHRWYWx1ZSgiMSIpOworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eSk7CisJCWJhc2ljLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisJCXdoZW4ocHJvcGVydHlPcGVyYXRpb24uaXNQcm9wZXJ0eVR5cGVWYWxpZChwcm9wZXJ0eSkpLnRoZW5SZXR1cm4odHJ1ZSk7CisJCXdoZW4ocHJvcGVydHlPcGVyYXRpb24uaXNQcm9wZXJ0eURlZmF1bHRWYWx1ZVZhbGlkKHByb3BlcnR5LCBlbXB0eURhdGFUeXBlcykpLnRoZW5SZXR1cm4odHJ1ZSk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVQcm9wZXJ0aWVzRGVmYXVsdFZhbHVlcyA9IGJsLnZhbGlkYXRlUHJvcGVydGllc0RlZmF1bHRWYWx1ZXMoYmFzaWMpOworCQlhc3NlcnRUcnVlKHZhbGlkYXRlUHJvcGVydGllc0RlZmF1bHRWYWx1ZXMuaXNMZWZ0KCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUHJvcGVydGllc0RlZmF1bHRWYWx1ZXNfRmFpbGVkV2l0aFByb3BlcnRpZXMoKSB7CisJCVJlc291cmNlIGJhc2ljID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkuc2V0TmFtZSgibXlQcm9wZXJ0eSIpOworCQlwcm9wZXJ0eS5zZXRUeXBlKFRvc2NhUHJvcGVydHlUeXBlLklOVEVHRVIuZ2V0VHlwZSgpKTsKKwkJcHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKCIxLjUiKTsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcHJvcGVydGllcy5hZGQocHJvcGVydHkpOworCQliYXNpYy5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisJCXdoZW4ocHJvcGVydHlPcGVyYXRpb24uaXNQcm9wZXJ0eURlZmF1bHRWYWx1ZVZhbGlkKHByb3BlcnR5LCBlbXB0eURhdGFUeXBlcykpLnRoZW5SZXR1cm4oZmFsc2UpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlUHJvcGVydGllc0RlZmF1bHRWYWx1ZXMgPSBibC52YWxpZGF0ZVByb3BlcnRpZXNEZWZhdWx0VmFsdWVzKGJhc2ljKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZGF0ZVByb3BlcnRpZXNEZWZhdWx0VmFsdWVzLmlzUmlnaHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlTWFya2VkUmVzb3VyY2VzTm9SZXNvdXJjZXMoKSB7CisJCUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyTm9SZXNvdXJjZXMgPSBFaXRoZXIubGVmdChpZHMpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldEFsbENvbXBvbmVudHNNYXJrZWRGb3JEZWxldGlvbigpKS50aGVuUmV0dXJuKGVpdGhlck5vUmVzb3VyY2VzKTsKKworCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBSZXNwb25zZUZvcm1hdD4gZGVsZXRlTWFya2VkUmVzb3VyY2VzID0gYmwuZGVsZXRlTWFya2VkQ29tcG9uZW50cygpOworCQlhc3NlcnRUcnVlKGRlbGV0ZU1hcmtlZFJlc291cmNlcy5pc0xlZnQoKSk7CisJCWFzc2VydFRydWUoZGVsZXRlTWFya2VkUmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSk7CisKKwkJTW9ja2l0by52ZXJpZnkoYXJ0aWZhY3RNYW5hZ2VyLCBNb2NraXRvLnRpbWVzKDApKS5kZWxldGVBbGxDb21wb25lbnRBcnRpZmFjdHNJZk5vdE9uR3JhcGgoTW9ja2l0by5hbnlMaXN0KCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlTWFya2VkUmVzb3VyY2VzKCkgeworCQlMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCVN0cmluZyByZXNvdXJjZUluVXNlID0gIjEyMyI7CisJCWlkcy5hZGQocmVzb3VyY2VJblVzZSk7CisJCVN0cmluZyByZXNvdXJjZUZyZWUgPSAiNDU2IjsKKwkJaWRzLmFkZChyZXNvdXJjZUZyZWUpOworCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJOb1Jlc291cmNlcyA9IEVpdGhlci5sZWZ0KGlkcyk7CisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uZ2V0QWxsQ29tcG9uZW50c01hcmtlZEZvckRlbGV0aW9uKCkpLnRoZW5SZXR1cm4oZWl0aGVyTm9SZXNvdXJjZXMpOworCisJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluVXNlUmVzcG9uc2UgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlRnJlZVJlc3BvbnNlID0gRWl0aGVyLmxlZnQoZmFsc2UpOworCisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QXJ0aWZhY3RzUmVzcG9uc2UgPSBFaXRoZXIubGVmdChhcnRpZmFjdHMpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmdldENvbXBvbmVudEFydGlmYWN0c0ZvckRlbGV0ZShyZXNvdXJjZUZyZWUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSkpLnRoZW5SZXR1cm4oZ2V0QXJ0aWZhY3RzUmVzcG9uc2UpOworCisJCXdoZW4ocmVzb3VyY2VPcGVyYXRpb24uaXNDb21wb25lbnRJblVzZShyZXNvdXJjZUZyZWUpKS50aGVuUmV0dXJuKHJlc291cmNlRnJlZVJlc3BvbnNlKTsKKwkJd2hlbihyZXNvdXJjZU9wZXJhdGlvbi5pc0NvbXBvbmVudEluVXNlKHJlc291cmNlSW5Vc2UpKS50aGVuUmV0dXJuKHJlc291cmNlSW5Vc2VSZXNwb25zZSk7CisKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyRGVsZXRlID0gRWl0aGVyLmxlZnQobmV3IFJlc291cmNlKCkpOworCQl3aGVuKHJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZUNvbXBvbmVudChyZXNvdXJjZUZyZWUsIHRydWUpKS50aGVuUmV0dXJuKGVpdGhlckRlbGV0ZSk7CisKKwkJd2hlbihhcnRpZmFjdE1hbmFnZXIuZGVsZXRlQWxsQ29tcG9uZW50QXJ0aWZhY3RzSWZOb3RPbkdyYXBoKGFydGlmYWN0cykpLnRoZW5SZXR1cm4oU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisKKwkJRWl0aGVyPExpc3Q8U3RyaW5nPiwgUmVzcG9uc2VGb3JtYXQ+IGRlbGV0ZU1hcmtlZFJlc291cmNlcyA9IGJsLmRlbGV0ZU1hcmtlZENvbXBvbmVudHMoKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVNYXJrZWRSZXNvdXJjZXMuaXNMZWZ0KCkpOworCQlMaXN0PFN0cmluZz4gcmVzb3VyY2VJZExpc3QgPSBkZWxldGVNYXJrZWRSZXNvdXJjZXMubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEZhbHNlKHJlc291cmNlSWRMaXN0LmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2VJZExpc3QuY29udGFpbnMocmVzb3VyY2VGcmVlKSk7CisJCWFzc2VydEZhbHNlKHJlc291cmNlSWRMaXN0LmNvbnRhaW5zKHJlc291cmNlSW5Vc2UpKTsKKworCQlNb2NraXRvLnZlcmlmeShhcnRpZmFjdE1hbmFnZXIsIE1vY2tpdG8udGltZXMoMSkpLmRlbGV0ZUFsbENvbXBvbmVudEFydGlmYWN0c0lmTm90T25HcmFwaChhcnRpZmFjdHMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvaW1wbC9SZXNvdXJjZUluc3RhbmNlQnVzaW5lc3NMb2dpY1Rlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUmVzb3VyY2VJbnN0YW5jZUJ1c2luZXNzTG9naWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1OTc4OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2ltcGwvUmVzb3VyY2VJbnN0YW5jZUJ1c2luZXNzTG9naWNUZXN0LmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5TZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5VbmlxdWVJZEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdBY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuVXNlckJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkZTQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFJlc291cmNlSW5zdGFuY2VCdXNpbmVzc0xvZ2ljVGVzdCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSURfV0lUSF9IRUFUX1BBUkFNUyA9ICJNeVJlc291cmNlSWQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JRF9OT19QQVlMT0FEID0gIk5vSGVhdFBheWxvYWQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JRF9OT19IRUFUX1BBUkFNUyA9ICJOb0hlYXRQYXJhbXMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JTlNUQU5DRV9JRCA9ICJNeVJlc291cmNlSW5zdGFuY2VJZCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSUQgPSAiTXlTZXJ2aWNlSWQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFUX0xBQkVMID0gIm15SGVhdCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVRfRU5WX0xBQkVMID0gSEVBVF9MQUJFTCArICJFbnYiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0lEID0gImpoMDAwMyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBUlRJRkFDVF9DUkVBVElPTl9USU1FID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwlzdGF0aWMgVXNlciBhZG1pblVzZXIgPSBuZXcgVXNlcigiSm9obiIsICJEb2giLCBVU0VSX0lELCAiIiwgIkFETUlOIiwgbnVsbCk7CisKKwlASW5qZWN0TW9ja3MKKwlzdGF0aWMgU2VydmljZUNvbXBvbmVudEluc3RhbmNlQnVzaW5lc3NMb2dpYyBibCA9IG5ldyBTZXJ2aWNlQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljKCk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljID0gTW9ja2l0by5tb2NrKEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluTWFuYWdlciA9IE1vY2tpdG8ubW9jayhVc2VyQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXJ2aWNlT3BlcmF0aW9uIHNlcnZpY2VPcGVyYXRpb24gPSBNb2NraXRvLm1vY2soU2VydmljZU9wZXJhdGlvbi5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzID0gTW9ja2l0by5tb2NrKENvbXBvbmVudHNVdGlscy5jbGFzcyk7CisKKwlzdGF0aWMgQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZSIpOworCXN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uU291cmNlKTsKKworCS8vIEBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldERlcGxveW1lbnRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGxhY2VIb2xkZXJEYXRhID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cy5nZXQoQ29tcG9uZW50SW5zdGFuY2VCdXNpbmVzc0xvZ2ljLkhFQVRfRU5WX05BTUUpOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBoZWF0QXJ0aWZhY3QgPSBnZXRIZWF0QXJ0aWZhY3REZWZpbml0aW9uKFVTRVJfSUQsIFJFU09VUkNFX0lEX1dJVEhfSEVBVF9QQVJBTVMsIEhFQVRfTEFCRUwsIEFSVElGQUNUX0NSRUFUSU9OX1RJTUUsIGZhbHNlLCB0cnVlKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJYXJ0aWZhY3RzLnB1dChIRUFUX0xBQkVMLnRvTG93ZXJDYXNlKCksIGhlYXRBcnRpZmFjdCk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJHZXRSZXNvdXJjZUFydGlmYWN0ID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3RzKTsKKwkJTW9ja2l0by53aGVuKGFydGlmYWN0QnVzaW5lc3NMb2dpYy5nZXRBcnRpZmFjdHMoUkVTT1VSQ0VfSURfV0lUSF9IRUFUX1BBUkFNUywgTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCkpLnRoZW5SZXR1cm4oZWl0aGVyR2V0UmVzb3VyY2VBcnRpZmFjdCk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRBcnRpZmFjdE5vUGF5bG9hZCA9IGdldEhlYXRBcnRpZmFjdERlZmluaXRpb24oVVNFUl9JRCwgUkVTT1VSQ0VfSURfTk9fUEFZTE9BRCwgSEVBVF9MQUJFTCwgQVJUSUZBQ1RfQ1JFQVRJT05fVElNRSwgdHJ1ZSwgZmFsc2UpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c05vUGF5bG9hZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPigpOworCQlhcnRpZmFjdHNOb1BheWxvYWQucHV0KEhFQVRfTEFCRUwudG9Mb3dlckNhc2UoKSwgaGVhdEFydGlmYWN0Tm9QYXlsb2FkKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckdldFJlc291cmNlQXJ0aWZhY3ROb1BheWxvYWQgPSBFaXRoZXIubGVmdChhcnRpZmFjdHNOb1BheWxvYWQpOworCQlNb2NraXRvLndoZW4oYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljLmdldEFydGlmYWN0cyhSRVNPVVJDRV9JRF9OT19QQVlMT0FELCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUsIEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5UKSkudGhlblJldHVybihlaXRoZXJHZXRSZXNvdXJjZUFydGlmYWN0Tm9QYXlsb2FkKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gaGVhdEFydGlmYWN0Tm9QYXJhbXMgPSBnZXRIZWF0QXJ0aWZhY3REZWZpbml0aW9uKFVTRVJfSUQsIFJFU09VUkNFX0lEX05PX0hFQVRfUEFSQU1TLCBIRUFUX0xBQkVMLCBBUlRJRkFDVF9DUkVBVElPTl9USU1FLCBmYWxzZSwgZmFsc2UpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c05vUGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KCk7CisJCWFydGlmYWN0c05vUGFyYW1zLnB1dChIRUFUX0xBQkVMLnRvTG93ZXJDYXNlKCksIGhlYXRBcnRpZmFjdE5vUGFyYW1zKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckdldFJlc291cmNlQXJ0aWZhY3ROb1BhcmFtcyA9IEVpdGhlci5sZWZ0KGFydGlmYWN0c05vUGFyYW1zKTsKKwkJTW9ja2l0by53aGVuKGFydGlmYWN0QnVzaW5lc3NMb2dpYy5nZXRBcnRpZmFjdHMoUkVTT1VSQ0VfSURfTk9fSEVBVF9QQVJBTVMsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpKS50aGVuUmV0dXJuKGVpdGhlckdldFJlc291cmNlQXJ0aWZhY3ROb1BhcmFtcyk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgUmVzcG9uc2VGb3JtYXQ+IGVpdGhlclBsYWNlSG9sZGVyID0gRWl0aGVyLmxlZnQoZ2V0QXJ0aWZhY3RQbGFjZUhvbGRlcihSRVNPVVJDRV9JTlNUQU5DRV9JRCwgSEVBVF9FTlZfTEFCRUwpKTsKKwkJTW9ja2l0by53aGVuKGFydGlmYWN0QnVzaW5lc3NMb2dpYy5jcmVhdGVBcnRpZmFjdFBsYWNlSG9sZGVySW5mbyhSRVNPVVJDRV9JTlNUQU5DRV9JRCwgSEVBVF9FTlZfTEFCRUwudG9Mb3dlckNhc2UoKSwgcGxhY2VIb2xkZXJEYXRhLCBVU0VSX0lELCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCwgZmFsc2UpKS50aGVuUmV0dXJuKGVpdGhlclBsYWNlSG9sZGVyKTsKKworCQlNb2NraXRvLndoZW4oYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljLmNyZWF0ZUFydGlmYWN0QXVkaXRpbmdGaWVsZHMoTW9ja2l0by5hbnkoQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlTdHJpbmcoKSkpLnRoZW5SZXR1cm4obmV3IEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PihBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmNsYXNzKSk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQXJ0aWZhY3QgPSBFaXRoZXIubGVmdChnZXRIZWF0QXJ0aWZhY3REZWZpbml0aW9uKFVTRVJfSUQsIFJFU09VUkNFX0lOU1RBTkNFX0lELCBIRUFUX0VOVl9MQUJFTCwgQVJUSUZBQ1RfQ1JFQVRJT05fVElNRSwgdHJ1ZSwgZmFsc2UpKTsKKwkJTW9ja2l0by53aGVuKGFydGlmYWN0QnVzaW5lc3NMb2dpYy5hZGRIZWF0RW52QXJ0aWZhY3QoTW9ja2l0by5hbnkoQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnkoTm9kZVR5cGVFbnVtLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpKS50aGVuUmV0dXJuKGVpdGhlckFydGlmYWN0KTsKKworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJVc2VyID0gRWl0aGVyLmxlZnQoYWRtaW5Vc2VyKTsKKwkJTW9ja2l0by53aGVuKHVzZXJBZG1pbk1hbmFnZXIuZ2V0VXNlcihVU0VSX0lELCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXNlcik7CisKKwkJT2JqZWN0IGxpZ2h0U2VydmljZSA9IG5ldyBTZXJ2aWNlKCk7CisJCUVpdGhlcjxPYmplY3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlckxpZ2h0U2VydmljZSA9IEVpdGhlci5sZWZ0KGxpZ2h0U2VydmljZSk7CisJCU1vY2tpdG8ud2hlbihzZXJ2aWNlT3BlcmF0aW9uLmdldExpZ2h0Q29tcG9uZW50KE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55Qm9vbGVhbigpKSkudGhlblJldHVybihlaXRoZXJMaWdodFNlcnZpY2UpOworCisJCU1vY2tpdG8uZG9Ob3RoaW5nKCkud2hlbihjb21wb25lbnRzVXRpbHMpLmF1ZGl0Q29tcG9uZW50KE1vY2tpdG8uYW55KFJlc3BvbnNlRm9ybWF0LmNsYXNzKSwgTW9ja2l0by5hbnkoVXNlci5jbGFzcyksIE1vY2tpdG8uYW55KENvbXBvbmVudC5jbGFzcyksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55KEF1ZGl0aW5nQWN0aW9uRW51bS5jbGFzcyksCisJCQkJTW9ja2l0by5hbnkoQ29tcG9uZW50VHlwZUVudW0uY2xhc3MpLCBNb2NraXRvLmFueShFbnVtTWFwLmNsYXNzKSk7CisKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgaW5pdE1vY2tzKCkgeworCQlNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCQlNb2NraXRvLnJlc2V0KGFydGlmYWN0QnVzaW5lc3NMb2dpYywgc2VydmljZU9wZXJhdGlvbiwgY29tcG9uZW50c1V0aWxzLCB1c2VyQWRtaW5NYW5hZ2VyKTsKKwkJc2V0dXAoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2UoKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXROYW1lKFJFU09VUkNFX0lOU1RBTkNFX0lEKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXRDb21wb25lbnRVaWQoUkVTT1VSQ0VfSURfV0lUSF9IRUFUX1BBUkFNUyk7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0VW5pcXVlSWQoUkVTT1VSQ0VfSU5TVEFOQ0VfSUQpOworCQlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZSgpOworCQlzZXJ2aWNlLnNldFVuaXF1ZUlkKFNFUlZJQ0VfSUQpOworCisJCUVpdGhlcjxBY3Rpb25TdGF0dXMsIFJlc3BvbnNlRm9ybWF0PiBhZGRBcnRpZmFjdHNSZXMgPSBibC5hZGRDb21wb25lbnRJbnN0YW5jZUFydGlmYWN0cyhzZXJ2aWNlLCByZXNvdXJjZUluc3RhbmNlLCBVU0VSX0lELCBmYWxzZSwgbnVsbCk7CisJCWFzc2VydFRydWUoYWRkQXJ0aWZhY3RzUmVzLmlzTGVmdCgpKTsKKworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHMgPSByZXNvdXJjZUluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJYXNzZXJ0Tm90TnVsbChkZXBsb3ltZW50QXJ0aWZhY3RzKTsKKwkJYXNzZXJ0VHJ1ZShkZXBsb3ltZW50QXJ0aWZhY3RzLnNpemUoKSA9PSAyKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gaGVhdERlZmluaXRpb24gPSBkZXBsb3ltZW50QXJ0aWZhY3RzLmdldChIRUFUX0xBQkVMLnRvTG93ZXJDYXNlKCkpOworCQlhc3NlcnROb3ROdWxsKGhlYXREZWZpbml0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKGdldEhlYXRBcnRpZmFjdERlZmluaXRpb24oVVNFUl9JRCwgUkVTT1VSQ0VfSURfV0lUSF9IRUFUX1BBUkFNUywgSEVBVF9MQUJFTCwgQVJUSUZBQ1RfQ1JFQVRJT05fVElNRSwgZmFsc2UsIHRydWUpLCBoZWF0RGVmaW5pdGlvbik7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRFbnZEZWZpbml0aW9uID0gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoSEVBVF9FTlZfTEFCRUwudG9Mb3dlckNhc2UoKSk7CisJCWFzc2VydE5vdE51bGwoaGVhdEVudkRlZmluaXRpb24pOworCisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzID0gaGVhdERlZmluaXRpb24uZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJYXNzZXJ0Tm90TnVsbChoZWF0UGFyYW1ldGVycyk7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdEVudlBhcmFtZXRlcnMgPSBoZWF0RW52RGVmaW5pdGlvbi5nZXRIZWF0UGFyYW1ldGVycygpOworCQlhc3NlcnROb3ROdWxsKGhlYXRFbnZQYXJhbWV0ZXJzKTsKKworCQlhc3NlcnRFcXVhbHMoaGVhdFBhcmFtZXRlcnMuc2l6ZSgpLCBoZWF0RW52UGFyYW1ldGVycy5zaXplKCkpOworCisJCWludCBpbmRleCA9IDA7CisJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdEVudlBhcmFtZXRlciA6IGhlYXRFbnZQYXJhbWV0ZXJzKSB7CisJCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiA9IGhlYXRQYXJhbWV0ZXJzLmdldChpbmRleCk7CisJCQlhc3NlcnRFcXVhbHMoaGVhdEVudlBhcmFtZXRlci5nZXRVbmlxdWVJZCgpLCBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJCWFzc2VydEVxdWFscyhoZWF0RW52UGFyYW1ldGVyLmdldFR5cGUoKSwgaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhoZWF0RW52UGFyYW1ldGVyLmdldE5hbWUoKSwgaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJCWFzc2VydEVxdWFscyhoZWF0RW52UGFyYW1ldGVyLmdldERlc2NyaXB0aW9uKCksIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCQkJYXNzZXJ0RXF1YWxzKGhlYXRFbnZQYXJhbWV0ZXIuZ2V0Q3VycmVudFZhbHVlKCksIGhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwkJCS8vIGN1cnJlbnQgb2YgaGVhdCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGZvciBoZWF0IGVudgorCQkJLy8gcGFyYW1ldGVyCisJCQlhc3NlcnRFcXVhbHMoaGVhdEVudlBhcmFtZXRlci5nZXREZWZhdWx0VmFsdWUoKSwgaGVhdFBhcmFtZXRlckRlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCkpOworCisJCQlpbmRleCsrOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0c05vUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2UoKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXROYW1lKFJFU09VUkNFX0lOU1RBTkNFX0lEKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXRDb21wb25lbnRVaWQoUkVTT1VSQ0VfSURfTk9fSEVBVF9QQVJBTVMpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldFVuaXF1ZUlkKFJFU09VUkNFX0lOU1RBTkNFX0lEKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsKKwkJc2VydmljZS5zZXRVbmlxdWVJZChTRVJWSUNFX0lEKTsKKworCQlFaXRoZXI8QWN0aW9uU3RhdHVzLCBSZXNwb25zZUZvcm1hdD4gYWRkQXJ0aWZhY3RzUmVzID0gYmwuYWRkQ29tcG9uZW50SW5zdGFuY2VBcnRpZmFjdHMoc2VydmljZSwgcmVzb3VyY2VJbnN0YW5jZSwgVVNFUl9JRCwgZmFsc2UsIG51bGwpOworCQlhc3NlcnRUcnVlKGFkZEFydGlmYWN0c1Jlcy5pc0xlZnQoKSk7CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWFzc2VydE5vdE51bGwoZGVwbG95bWVudEFydGlmYWN0cyk7CisJCWFzc2VydFRydWUoZGVwbG95bWVudEFydGlmYWN0cy5zaXplKCkgPT0gMik7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXREZWZpbml0aW9uID0gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoSEVBVF9MQUJFTC50b0xvd2VyQ2FzZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChoZWF0RGVmaW5pdGlvbik7CisJCWFzc2VydEVxdWFscyhnZXRIZWF0QXJ0aWZhY3REZWZpbml0aW9uKFVTRVJfSUQsIFJFU09VUkNFX0lEX05PX0hFQVRfUEFSQU1TLCBIRUFUX0xBQkVMLCBBUlRJRkFDVF9DUkVBVElPTl9USU1FLCBmYWxzZSwgZmFsc2UpLCBoZWF0RGVmaW5pdGlvbik7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRFbnZEZWZpbml0aW9uID0gZGVwbG95bWVudEFydGlmYWN0cy5nZXQoSEVBVF9FTlZfTEFCRUwudG9Mb3dlckNhc2UoKSk7CisJCWFzc2VydE5vdE51bGwoaGVhdEVudkRlZmluaXRpb24pOworCisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzID0gaGVhdERlZmluaXRpb24uZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJYXNzZXJ0TnVsbChoZWF0UGFyYW1ldGVycyk7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdEVudlBhcmFtZXRlcnMgPSBoZWF0RW52RGVmaW5pdGlvbi5nZXRIZWF0UGFyYW1ldGVycygpOworCQlhc3NlcnROdWxsKGhlYXRFbnZQYXJhbWV0ZXJzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHNOb0FydGlmYWN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlID0gbmV3IENvbXBvbmVudEluc3RhbmNlKCk7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0TmFtZShSRVNPVVJDRV9JTlNUQU5DRV9JRCk7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0Q29tcG9uZW50VWlkKFJFU09VUkNFX0lEX05PX1BBWUxPQUQpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldFVuaXF1ZUlkKFJFU09VUkNFX0lOU1RBTkNFX0lEKTsKKwkJU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsKKwkJc2VydmljZS5zZXRVbmlxdWVJZChTRVJWSUNFX0lEKTsKKworCQlFaXRoZXI8QWN0aW9uU3RhdHVzLCBSZXNwb25zZUZvcm1hdD4gYWRkQXJ0aWZhY3RzUmVzID0gYmwuYWRkQ29tcG9uZW50SW5zdGFuY2VBcnRpZmFjdHMoc2VydmljZSwgcmVzb3VyY2VJbnN0YW5jZSwgVVNFUl9JRCwgZmFsc2UsIG51bGwpOworCQlhc3NlcnRUcnVlKGFkZEFydGlmYWN0c1Jlcy5pc0xlZnQoKSk7CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWFzc2VydE5vdE51bGwoZGVwbG95bWVudEFydGlmYWN0cyk7CisJCWFzc2VydFRydWUoZGVwbG95bWVudEFydGlmYWN0cy5zaXplKCkgPT0gMCk7CisKKwkJTW9ja2l0by52ZXJpZnkoYXJ0aWZhY3RCdXNpbmVzc0xvZ2ljLCBNb2NraXRvLnRpbWVzKDApKS5hZGRIZWF0RW52QXJ0aWZhY3QoTW9ja2l0by5hbnkoQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnkoQXJ0aWZhY3REZWZpbml0aW9uLmNsYXNzKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnkoTm9kZVR5cGVFbnVtLmNsYXNzKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIEFydGlmYWN0RGVmaW5pdGlvbiBnZXRIZWF0QXJ0aWZhY3REZWZpbml0aW9uKFN0cmluZyB1c2VySWQsIFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgYXJ0aWZhY3ROYW1lLCBsb25nIHRpbWUsIGJvb2xlYW4gcGxhY2Vob2xkZXJPbmx5LCBib29sZWFuIHdpdGhIZWF0UGFyYW1zKSB7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8gPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0TmFtZShhcnRpZmFjdE5hbWUgKyAiLnltbCIpOworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RUeXBlKCJIRUFUIik7CisJCWFydGlmYWN0SW5mby5zZXREZXNjcmlwdGlvbigiaGRrZmhza2RmZ2giKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0R3JvdXBUeXBlKEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5UKTsKKworCQlhcnRpZmFjdEluZm8uc2V0VXNlcklkQ3JlYXRvcih1c2VySWQpOworCQlTdHJpbmcgZnVsbE5hbWUgPSAiSmltIEgiOworCQlhcnRpZmFjdEluZm8uc2V0VXBkYXRlckZ1bGxOYW1lKGZ1bGxOYW1lKTsKKwkJLy8gbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWFydGlmYWN0SW5mby5zZXRDcmVhdG9yRnVsbE5hbWUoZnVsbE5hbWUpOworCQlhcnRpZmFjdEluZm8uc2V0Q3JlYXRpb25EYXRlKHRpbWUpOworCQlhcnRpZmFjdEluZm8uc2V0TGFzdFVwZGF0ZURhdGUodGltZSk7CisJCWFydGlmYWN0SW5mby5zZXRVc2VySWRMYXN0VXBkYXRlcih1c2VySWQpOworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RMYWJlbChIRUFUX0xBQkVMLnRvTG93ZXJDYXNlKCkpOworCQlhcnRpZmFjdEluZm8uc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChyZXNvdXJjZUlkLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKSk7CisKKwkJaWYgKCFwbGFjZWhvbGRlck9ubHkpIHsKKwkJCWFydGlmYWN0SW5mby5zZXRFc0lkKGFydGlmYWN0SW5mby5nZXRVbmlxdWVJZCgpKTsKKwkJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdENoZWNrc3VtKCJVRXNEQkFvQUFBQUlBQWVMYjBiRFF6Iik7CisKKwkJCWlmICh3aXRoSGVhdFBhcmFtcykgeworCQkJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQkJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbSA9IG5ldyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbigpOworCQkJCWhlYXRQYXJhbS5zZXRDdXJyZW50VmFsdWUoIjExIik7CisJCQkJaGVhdFBhcmFtLnNldERlZmF1bHRWYWx1ZSgiMjIiKTsKKwkJCQloZWF0UGFyYW0uc2V0RGVzY3JpcHRpb24oImRlc2MiKTsKKwkJCQloZWF0UGFyYW0uc2V0TmFtZSgibXlQYXJhbSIpOworCQkJCWhlYXRQYXJhbS5zZXRUeXBlKCJudW1iZXIiKTsKKwkJCQloZWF0UGFyYW1zLmFkZChoZWF0UGFyYW0pOworCQkJCWFydGlmYWN0SW5mby5zZXRIZWF0UGFyYW1ldGVycyhoZWF0UGFyYW1zKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBhcnRpZmFjdEluZm87CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQXJ0aWZhY3REZWZpbml0aW9uIGdldEFydGlmYWN0UGxhY2VIb2xkZXIoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBsb2dpY2FsTmFtZSkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisKKwkJYXJ0aWZhY3Quc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChyZXNvdXJjZUlkLCBsb2dpY2FsTmFtZS50b0xvd2VyQ2FzZSgpKSk7CisJCWFydGlmYWN0LnNldEFydGlmYWN0TGFiZWwobG9naWNhbE5hbWUudG9Mb3dlckNhc2UoKSk7CisKKwkJcmV0dXJuIGFydGlmYWN0OworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvblRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNkODNhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0NlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5BcnRpZmFjdHNCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlLkNlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlQ3ljbGVUcmFuc2l0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIENlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uVGVzdCBleHRlbmRzIExpZmVjeWNsZVRlc3RCYXNlIHsKKworCXByaXZhdGUgQ2VydGlmaWNhdGlvbkNoYW5nZVRyYW5zaXRpb24gY2VydGlmeVRyYW5zaXRpb25PYmogPSBudWxsOworCXByaXZhdGUgQ2VydGlmaWNhdGlvbkNoYW5nZVRyYW5zaXRpb24gY2VydGlmaWNhdGlvbkNhbmNlbE9iaiA9IG51bGw7CisJcHJpdmF0ZSBDZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvbiBjZXJ0aWZpY2F0aW9uRmFpbE9iaiA9IG51bGw7CisKKwlwcml2YXRlIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMgPSBuZXcgQ29tcG9uZW50c1V0aWxzKCk7CisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VOYW1lID0gIm15UmVzb3VyY2UiOworCXByaXZhdGUgVXNlciBvd25lciA9IG51bGw7CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYyBhcnRpZmFjdHNNYW5hZ2VyID0gTW9ja2l0by5tb2NrKEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MpOworCisJUmVzb3VyY2UgcmVzb3VyY2U7CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisKKwkJc3VwZXIuc2V0dXAoKTsKKwkJY29tcG9uZW50c1V0aWxzLkluaXQoKTsKKwkJLy8gY2hlY2tvdXQgdHJhbnNpdGlvbiBvYmplY3QKKwkJY2VydGlmeVRyYW5zaXRpb25PYmogPSBuZXcgQ2VydGlmaWNhdGlvbkNoYW5nZVRyYW5zaXRpb24oTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0VSVElGWSwgY29tcG9uZW50c1V0aWxzLCBsY09wZXJhdGlvbik7CisJCWNlcnRpZnlUcmFuc2l0aW9uT2JqLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKworCQljZXJ0aWZpY2F0aW9uQ2FuY2VsT2JqID0gbmV3IENlcnRpZmljYXRpb25DaGFuZ2VUcmFuc2l0aW9uKExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNFUlRJRlksIGNvbXBvbmVudHNVdGlscywgbGNPcGVyYXRpb24pOworCQljZXJ0aWZpY2F0aW9uQ2FuY2VsT2JqLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKworCQljZXJ0aWZpY2F0aW9uRmFpbE9iaiA9IG5ldyBDZXJ0aWZpY2F0aW9uQ2hhbmdlVHJhbnNpdGlvbihMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DRVJUSUZZLCBjb21wb25lbnRzVXRpbHMsIGxjT3BlcmF0aW9uKTsKKwkJY2VydGlmaWNhdGlvbkZhaWxPYmouc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvbk1hbmFnZXIpOworCisJCW93bmVyID0gbmV3IFVzZXIoImNzMDAwOCIsICJDYXJsb3MiLCAiU2FudGFuYSIsICJjc0BzZGMuY29tIiwgIkRFU0lHTkVSIiwgbnVsbCk7CisKKwkJd2hlbihhcnRpZmFjdHNNYW5hZ2VyLmRlbGV0ZUFsbENvbXBvbmVudEFydGlmYWN0c0lmTm90T25HcmFwaChNb2NraXRvLmFueUxpc3QoKSkpLnRoZW5SZXR1cm4oU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisJCXJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFN0YXRlVmFsaWRhdGlvblN1Y2Nlc3MoKSB7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZVJlc3VsdCA9IGNlcnRpZnlUcmFuc2l0aW9uT2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHVzZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCWFzc2VydEVxdWFscyhjaGFuZ2VTdGF0ZVJlc3VsdC5pc0xlZnQoKSwgdHJ1ZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTdGF0ZVZhbGlkYXRpb25GYWlsKCkgeworCisJCS8vIGNoZWNrb3V0CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2VydGlmeVRyYW5zaXRpb25PYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdXNlciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKworCQlhc3NlcnRWYWxpZGF0aW9uU3RhdGVFcnJvclJlc3BvbnNlKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbik7CisKKwkJLy8gY2hlY2tpbgorCQl2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24gPSBjZXJ0aWZ5VHJhbnNpdGlvbk9iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCB1c2VyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWFzc2VydFZhbGlkYXRpb25TdGF0ZUVycm9yUmVzcG9uc2UodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKTsKKworCQkvLyByZmMKKwkJdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2VydGlmeVRyYW5zaXRpb25PYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdXNlciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCWFzc2VydFZhbGlkYXRpb25TdGF0ZUVycm9yUmVzcG9uc2UodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKTsKKworCQkvLyBjZXJ0aWZpZWQKKwkJdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2VydGlmeVRyYW5zaXRpb25PYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdXNlciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCQlhc3NlcnRWYWxpZGF0aW9uU3RhdGVFcnJvclJlc3BvbnNlKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb2xlc0ZhaWwoKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlUmVzdWx0OworCisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKCJtb2RpZmllciIpOworCQltb2RpZmllci5zZXRGaXJzdE5hbWUoIkFsYmVydCIpOworCQltb2RpZmllci5zZXRMYXN0TmFtZSgiRWluc3RlaW4iKTsKKwkJbW9kaWZpZXIuc2V0Um9sZShSb2xlLkRFU0lHTkVSLm5hbWUoKSk7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXJSZXNwb25zZSA9IGNlcnRpZnlUcmFuc2l0aW9uT2JqLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydFRydWUob3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgb3duZXIgPSBvd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2VydGlmeVRyYW5zaXRpb25PYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgbW9kaWZpZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzdWx0LCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCisJCW1vZGlmaWVyLnNldFJvbGUoUm9sZS5URVNURVIubmFtZSgpKTsKKwkJdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2VydGlmeVRyYW5zaXRpb25PYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgbW9kaWZpZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzdWx0LCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NFUlRfSU5fUFJPR1JFU1NfU1RBVEUsIHJlc291cmNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb2xlc1N1Y2Nlc3MoKSB7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyUmVzcG9uc2UgPSBjZXJ0aWZ5VHJhbnNpdGlvbk9iai5nZXRDb21wb25lbnRPd25lcihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRUcnVlKG93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIG93bmVyID0gb3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbiA9IGNlcnRpZnlUcmFuc2l0aW9uT2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG93bmVyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzTGVmdCgpKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKCJtb2RpZmllciIpOworCQltb2RpZmllci5zZXRGaXJzdE5hbWUoIkFsYmVydCIpOworCQltb2RpZmllci5zZXRMYXN0TmFtZSgiRWluc3RlaW4iKTsKKwkJbW9kaWZpZXIuc2V0Um9sZShSb2xlLkFETUlOLm5hbWUoKSk7CisJCXZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbiA9IGNlcnRpZnlUcmFuc2l0aW9uT2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG1vZGlmaWVyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzTGVmdCgpKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZGF0aW9uU3RhdGVFcnJvclJlc3BvbnNlKEVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKSB7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJUmVzcG9uc2VGb3JtYXQgZXJyb3IgPSB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ucmlnaHQoKS52YWx1ZSgpOworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZVJlc3VsdCA9IEVpdGhlci5yaWdodChlcnJvcik7CisJCWFzc2VydEVxdWFscyhjaGFuZ2VTdGF0ZVJlc3VsdC5pc1JpZ2h0KCksIHRydWUpOworCisJCWFzc2VydFJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzdWx0LCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX05PVF9SRUFEWV9GT1JfQ0VSVElGSUNBVElPTiwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgdXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DZXJ0aWZpY2F0aW9uUmVxdWVzdFRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DZXJ0aWZpY2F0aW9uUmVxdWVzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDVhYTYxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0NlcnRpZmljYXRpb25SZXF1ZXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uSW5qZWN0TW9ja3M7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLlNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5TZXJ2aWNlQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZS5DZXJ0aWZpY2F0aW9uUmVxdWVzdFRyYW5zaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5Ub3NjYUVycm9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnRvc2NhLlRvc2NhRXhwb3J0SGFuZGxlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS50b3NjYS5Ub3NjYVJlcHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGlvblJlcXVlc3RUZXN0IGV4dGVuZHMgTGlmZWN5Y2xlVGVzdEJhc2UgeworCisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzID0gbmV3IENvbXBvbmVudHNVdGlscygpOworCisJcHJvdGVjdGVkIFNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyIHNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyID0gTW9ja2l0by5tb2NrKFNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyLmNsYXNzKTsKKwlwcm90ZWN0ZWQgU2VydmljZUJ1c2luZXNzTG9naWMgc2VydmljZUJ1c2luZXNzTG9naWMgPSBNb2NraXRvLm1vY2soU2VydmljZUJ1c2luZXNzTG9naWMuY2xhc3MpOworCXByb3RlY3RlZCBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhSZXNvdXJjZU9wZXJhdGlvbi5jbGFzcyk7CisJcHJvdGVjdGVkIENhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhDYXBhYmlsaXR5T3BlcmF0aW9uLmNsYXNzKTsKKwlwcm90ZWN0ZWQgVG9zY2FFeHBvcnRIYW5kbGVyIHRvc2NhRXhwb3J0VXRpbHMgPSBNb2NraXRvLm1vY2soVG9zY2FFeHBvcnRIYW5kbGVyLmNsYXNzKTsKKwlASW5qZWN0TW9ja3MKKwlwcml2YXRlIENlcnRpZmljYXRpb25SZXF1ZXN0VHJhbnNpdGlvbiByZmNPYmogPSBuZXcgQ2VydGlmaWNhdGlvblJlcXVlc3RUcmFuc2l0aW9uKGNvbXBvbmVudHNVdGlscywgbGNPcGVyYXRpb24sIHNlcnZpY2VEaXN0cmlidXRpb25BcnRpZmFjdHNCdWlsZGVyLCBzZXJ2aWNlQnVzaW5lc3NMb2dpYywgY2FwYWJpbGl0eU9wZXJhdGlvbiwgdG9zY2FFeHBvcnRVdGlscyk7CisKKwlwcm90ZWN0ZWQgVG9zY2FSZXByZXNlbnRhdGlvbiB0b3NjYVJlcHJlc2VudGF0aW9uID0gTW9ja2l0by5tb2NrKFRvc2NhUmVwcmVzZW50YXRpb24uY2xhc3MpOworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCQlNb2NraXRvLnJlc2V0KHJlc291cmNlT3BlcmF0aW9uKTsKKwkJTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKKwkJc3VwZXIuc2V0dXAoKTsKKworCQkvLyBjaGVja291dCB0cmFuc2l0aW9uIG9iamVjdAorCQlyZmNPYmouc2V0TGlmZUN5Y2xlT3BlcmF0aW9uKGxjT3BlcmF0aW9uKTsKKwkJLy8gY2hlY2tvdXRPYmouc2V0QXVkaXRpbmdNYW5hZ2VyKGlBdWRpdGluZ01hbmFnZXIpOworCQlyZmNPYmouc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvbk1hbmFnZXIpOworCQljb21wb25lbnRzVXRpbHMuSW5pdCgpOworCisJCUVpdGhlcjxUb3NjYVJlcHJlc2VudGF0aW9uLCBUb3NjYUVycm9yPiBlaXRoZXIgPSBFaXRoZXIubGVmdCh0b3NjYVJlcHJlc2VudGF0aW9uKTsKKwkJd2hlbih0b3NjYUV4cG9ydFV0aWxzLmV4cG9ydENvbXBvbmVudChNb2NraXRvLmFueU9iamVjdCgpKSkudGhlblJldHVybihlaXRoZXIpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRTdGF0ZVZhbGlkYXRpb24oKSB7CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGVSZXN1bHQ7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyUmVzcG9uc2UgPSByZmNPYmouZ2V0Q29tcG9uZW50T3duZXIocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0VHJ1ZShvd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciBvd25lciA9IG93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCS8vIGNoYW5nZVN0YXRlUmVzdWx0ID0gcmZjT2JqLmNoYW5nZVN0YXRlT3BlcmF0aW9uKHJlc291cmNlLCB1c2VyLAorCQkvLyBvd25lciwgZmFsc2UpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IHJmY09iai5jaGFuZ2VTdGF0ZShDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgcmVzb3VyY2UsIHNlcnZpY2VCdXNpbmVzc0xvZ2ljLCB1c2VyLCBvd25lciwgZmFsc2UsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKGNoYW5nZVN0YXRlUmVzdWx0LmlzTGVmdCgpLCB0cnVlKTsKKworCQlyZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCS8vIGNoYW5nZVN0YXRlUmVzdWx0ID0gcmZjT2JqLmNoYW5nZVN0YXRlT3BlcmF0aW9uKHJlc291cmNlLCB1c2VyLAorCQkvLyBvd25lciwgZmFsc2UpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IHJmY09iai5jaGFuZ2VTdGF0ZShDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgcmVzb3VyY2UsIHNlcnZpY2VCdXNpbmVzc0xvZ2ljLCB1c2VyLCBvd25lciwgZmFsc2UsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKGNoYW5nZVN0YXRlUmVzdWx0LmlzTGVmdCgpLCB0cnVlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbHJlYWR5UmZjKCkgeworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZVJlc3VsdDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBvd25lclJlc3BvbnNlID0gcmZjT2JqLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydFRydWUob3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgb3duZXIgPSBvd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbiA9IHJmY09iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCB1c2VyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5pc1JpZ2h0KCksIHRydWUpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY2hhbmdlU3RhdGVSZXN1bHQsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfU0VOVF9GT1JfQ0VSVElGSUNBVElPTiwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgdXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENlcnRpZmljYXRpb25JblByb2dyZXNzKCkgeworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZVJlc3VsdDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyUmVzcG9uc2UgPSByZmNPYmouZ2V0Q29tcG9uZW50T3duZXIocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0VHJ1ZShvd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciBvd25lciA9IG93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gcmZjT2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHVzZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzdWx0LCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NFUlRfSU5fUFJPR1JFU1NfU1RBVEUsIHJlc291cmNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbHJlYWR5Q2VydGlmaWVkKCkgeworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZVJlc3VsdDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXJSZXNwb25zZSA9IHJmY09iai5nZXRDb21wb25lbnRPd25lcihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRUcnVlKG93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIG93bmVyID0gb3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24gPSByZmNPYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdXNlciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCQlhc3NlcnRFcXVhbHModmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzUmlnaHQoKSwgdHJ1ZSk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQlhc3NlcnRSZXNwb25zZShjaGFuZ2VTdGF0ZVJlc3VsdCwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9BTFJFQURZX0NFUlRJRklFRCwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgdXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlQWxsUmVzb3VyY2VJbnN0YW5jZUNlcnRpZmllZF9TdWNjZXNzV2l0aG91dFJJKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQWxsUmVzb3VyY2VJbnN0YW5jZUNlcnRpZmllZCA9IHJmY09iai52YWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWQocmVzb3VyY2UpOworCQlhc3NlcnRUcnVlKHZhbGlkYXRlQWxsUmVzb3VyY2VJbnN0YW5jZUNlcnRpZmllZC5pc0xlZnQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVBbGxSZXNvdXJjZUluc3RhbmNlQ2VydGlmaWVkX1N1Y2Nlc3NXaXRoQ2VydGlmaWVkUmVzb3VyY2VzKCkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByaUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlPigpOworCQlDb21wb25lbnRJbnN0YW5jZSByaSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZSgpOworCQlyaS5zZXRDb21wb25lbnRWZXJzaW9uKCIyLjAiKTsKKwkJcmlMaXN0LmFkZChyaSk7CisJCXJlc291cmNlLnNldENvbXBvbmVudEluc3RhbmNlcyhyaUxpc3QpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbGxSZXNvdXJjZUluc3RhbmNlQ2VydGlmaWVkID0gcmZjT2JqLnZhbGlkYXRlQWxsUmVzb3VyY2VJbnN0YW5jZUNlcnRpZmllZChyZXNvdXJjZSk7CisJCWFzc2VydFRydWUodmFsaWRhdGVBbGxSZXNvdXJjZUluc3RhbmNlQ2VydGlmaWVkLmlzTGVmdCgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWRfRmFpbFdpdGhVbkNlcnRpZmllZFJlc291cmNlc01pbm9yVmVyc2lvbigpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVWRldpdGhSSSgiMC4zIik7CisKKwkJc2ltdWxhdGVDZXJ0aWZpZWRWZXJzaW9uRXhpc3RGb3JSSSgpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbGxSZXNvdXJjZUluc3RhbmNlQ2VydGlmaWVkID0gcmZjT2JqLnZhbGlkYXRlQWxsUmVzb3VyY2VJbnN0YW5jZUNlcnRpZmllZChyZXNvdXJjZSk7CisKKwkJYXNzZXJ0VHJ1ZSh2YWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWQuaXNSaWdodCgpKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWQucmlnaHQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKHJlc3BvbnNlRm9ybWF0LmdldFN0YXR1cygpID09IEh0dHBTdGF0dXMuU0NfRk9SQklEREVOKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKS5lcXVhbHMoIlNWQzQ1NTkiKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWRfRmFpbFdpdGhVbkNlcnRpZmllZFJlc291cmNlc01ham9yVmVyc2lvbigpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVWRldpdGhSSSgiMS4zIik7CisKKwkJc2ltdWxhdGVDZXJ0aWZpZWRWZXJzaW9uRXhpc3RGb3JSSSgpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVBbGxSZXNvdXJjZUluc3RhbmNlQ2VydGlmaWVkID0gcmZjT2JqLnZhbGlkYXRlQWxsUmVzb3VyY2VJbnN0YW5jZUNlcnRpZmllZChyZXNvdXJjZSk7CisKKwkJYXNzZXJ0VHJ1ZSh2YWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWQuaXNSaWdodCgpKTsKKwkJUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSB2YWxpZGF0ZUFsbFJlc291cmNlSW5zdGFuY2VDZXJ0aWZpZWQucmlnaHQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKHJlc3BvbnNlRm9ybWF0LmdldFN0YXR1cygpID09IEh0dHBTdGF0dXMuU0NfRk9SQklEREVOKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZUZvcm1hdC5nZXRNZXNzYWdlSWQoKS5lcXVhbHMoIlNWQzQ1NTkiKSk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgc2ltdWxhdGVDZXJ0aWZpZWRWZXJzaW9uRXhpc3RGb3JSSSgpIHsKKwkJUmVzb3VyY2UgZHVtbXlSZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCkgeworCQkJeworCQkJCWFkZChkdW1teVJlc291cmNlKTsKKwkJCX0KKwkJfSk7CisJCU1vY2tpdG8ud2hlbihyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShNb2NraXRvLmFueVN0cmluZygpKSkudGhlblJldHVybihFaXRoZXIubGVmdChkdW1teVJlc291cmNlKSk7CisJCU1vY2tpdG8ud2hlbihyZXNvdXJjZU9wZXJhdGlvbi5maW5kTGFzdENlcnRpZmllZFJlc291cmNlQnlVVUlEKE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSkpLnRoZW5SZXR1cm4ocmVzdWx0KTsKKwl9CisKKwlwcml2YXRlIFJlc291cmNlIGNyZWF0ZVZGV2l0aFJJKFN0cmluZyByaVZlcnNpb24pIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmlMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZT4oKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2UoKTsKKworCQlyaS5zZXRDb21wb25lbnRWZXJzaW9uKHJpVmVyc2lvbik7CisJCXJpLnNldENvbXBvbmVudFVpZCgic29tZVVuaXF1ZUlkIik7CisJCXJpTGlzdC5hZGQocmkpOworCQlyZXNvdXJjZS5zZXRDb21wb25lbnRJbnN0YW5jZXMocmlMaXN0KTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0NoZWNraW5UZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvQ2hlY2tpblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQ5NDJlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0NoZWNraW5UZXN0LmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZS5DaGVja2luVHJhbnNpdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDaGVja2luVGVzdCBleHRlbmRzIExpZmVjeWNsZVRlc3RCYXNlIHsKKworCXByaXZhdGUgQ2hlY2tpblRyYW5zaXRpb24gY2hlY2tpbk9iaiA9IG51bGw7CisJcHJpdmF0ZSBDb21wb25lbnRzVXRpbHMgY29tcG9uZW50c1V0aWxzID0gbmV3IENvbXBvbmVudHNVdGlscygpOworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCisJCXN1cGVyLnNldHVwKCk7CisKKwkJLy8gY2hlY2tvdXQgdHJhbnNpdGlvbiBvYmplY3QKKwkJY2hlY2tpbk9iaiA9IG5ldyBDaGVja2luVHJhbnNpdGlvbihjb21wb25lbnRzVXRpbHMsIGxjT3BlcmF0aW9uKTsKKwkJY2hlY2tpbk9iai5zZXRMaWZlQ3ljbGVPcGVyYXRpb24obGNPcGVyYXRpb24pOworCQljaGVja2luT2JqLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKwkJY29tcG9uZW50c1V0aWxzLkluaXQoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDaGVja2luKCkgeworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlUmVzdWx0OworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlyZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXJSZXNwb25zZSA9IGNoZWNraW5PYmouZ2V0Q29tcG9uZW50T3duZXIocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0VHJ1ZShvd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciBvd25lciA9IG93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gY2hlY2tpbk9iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCB1c2VyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNMZWZ0KCksIHRydWUpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU2VydmljZUNoZWNraW4oKSB7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGVSZXN1bHQ7CisJCVNlcnZpY2Ugc2VydmljZSA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCisJCXNlcnZpY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyUmVzcG9uc2UgPSBjaGVja2luT2JqLmdldENvbXBvbmVudE93bmVyKHNlcnZpY2UsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQlhc3NlcnRUcnVlKG93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIG93bmVyID0gb3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBjaGVja2luT2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihzZXJ2aWNlLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLCB1c2VyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNMZWZ0KCksIHRydWUpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tpblR3aWNlVmFsaWRhdGlvbigpIHsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGVSZXN1bHQ7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyID0gY2hlY2tpbk9iai5nZXRDb21wb25lbnRPd25lcihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRUcnVlKG93bmVyLmlzTGVmdCgpKTsKKwkJLy8gY2hhbmdlU3RhdGVSZXN1bHQgPSBjaGVja2luT2JqLmNoYW5nZVN0YXRlT3BlcmF0aW9uKHJlc291cmNlLCB1c2VyLAorCQkvLyBvd25lci5sZWZ0KCkudmFsdWUoKSk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2hlY2tpbk9iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCB1c2VyLCBvd25lci5sZWZ0KCkudmFsdWUoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY2hhbmdlU3RhdGVSZXN1bHQsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfQUxSRUFEWV9DSEVDS0VEX0lOLCByZXNvdXJjZS5nZXROYW1lKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCB1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyLmdldExhc3ROYW1lKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUNoZWNraW5Ud2ljZVZhbGlkYXRpb24oKSB7CisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGVSZXN1bHQ7CisJCVNlcnZpY2Ugc2VydmljZSA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCisJCXNlcnZpY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXIgPSBjaGVja2luT2JqLmdldENvbXBvbmVudE93bmVyKHNlcnZpY2UsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpOworCQlhc3NlcnRUcnVlKG93bmVyLmlzTGVmdCgpKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbiA9IGNoZWNraW5PYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHNlcnZpY2UsIENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UsIHVzZXIsIG93bmVyLmxlZnQoKS52YWx1ZSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5pc1JpZ2h0KCksIHRydWUpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKworCQlhc3NlcnRTZXJ2aWNlUmVzcG9uc2UoY2hhbmdlU3RhdGVSZXN1bHQsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfQUxSRUFEWV9DSEVDS0VEX0lOLCBzZXJ2aWNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgdXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0QnlBbm90aGVyVXNlclZhbGlkYXRpb24oKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlUmVzdWx0OworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKCJtb2RpZmllciIpOworCQltb2RpZmllci5zZXRGaXJzdE5hbWUoIkFsYmVydCIpOworCQltb2RpZmllci5zZXRMYXN0TmFtZSgiRWluc3RlaW4iKTsKKwkJbW9kaWZpZXIuc2V0Um9sZShSb2xlLkRFU0lHTkVSLm5hbWUoKSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyUmVzcG9uc2UgPSBjaGVja2luT2JqLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydFRydWUob3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgb3duZXIgPSBvd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQkvLyBjaGFuZ2VTdGF0ZVJlc3VsdCA9IGNoZWNraW5PYmouY2hhbmdlU3RhdGVPcGVyYXRpb24ocmVzb3VyY2UsCisJCS8vIG1vZGlmaWVyLCBvd25lcik7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2hlY2tpbk9iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBtb2RpZmllciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5pc1JpZ2h0KCksIHRydWUpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGNoYW5nZVN0YXRlUmVzdWx0LmlzUmlnaHQoKSwgdHJ1ZSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY2hhbmdlU3RhdGVSZXN1bHQsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0hFQ0tPVVRfQllfQU5PVEhFUl9VU0VSLCByZXNvdXJjZS5nZXROYW1lKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCB1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyLmdldExhc3ROYW1lKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUNoZWNrb3V0QnlBbm90aGVyVXNlclZhbGlkYXRpb24oKSB7CisJCUVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGVSZXN1bHQ7CisJCVNlcnZpY2Ugc2VydmljZSA9IGNyZWF0ZVNlcnZpY2VPYmplY3QoZmFsc2UpOworCisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQoIm1vZGlmaWVyIik7CisJCW1vZGlmaWVyLnNldEZpcnN0TmFtZSgiQWxiZXJ0Iik7CisJCW1vZGlmaWVyLnNldExhc3ROYW1lKCJFaW5zdGVpbiIpOworCQltb2RpZmllci5zZXRSb2xlKFJvbGUuREVTSUdORVIubmFtZSgpKTsKKworCQlzZXJ2aWNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBvd25lclJlc3BvbnNlID0gY2hlY2tpbk9iai5nZXRDb21wb25lbnRPd25lcihzZXJ2aWNlLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJYXNzZXJ0VHJ1ZShvd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciBvd25lciA9IG93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2hlY2tpbk9iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24oc2VydmljZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG1vZGlmaWVyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCQlhc3NlcnRFcXVhbHModmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzUmlnaHQoKSwgdHJ1ZSk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNSaWdodCgpLCB0cnVlKTsKKworCQlhc3NlcnRTZXJ2aWNlUmVzcG9uc2UoY2hhbmdlU3RhdGVSZXN1bHQsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0hFQ0tPVVRfQllfQU5PVEhFUl9VU0VSLCBzZXJ2aWNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvQ2hlY2tvdXRUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvQ2hlY2tvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4MTY1MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9DaGVja291dFRlc3QuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMubGlmZWN5Y2xlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5SZXNvdXJjZUJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuQ2hlY2tvdXRUcmFuc2l0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLkNvbXBvbmVudHNVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgQ2hlY2tvdXRUZXN0IGV4dGVuZHMgTGlmZWN5Y2xlVGVzdEJhc2UgeworCisJcHJpdmF0ZSBDaGVja291dFRyYW5zaXRpb24gY2hlY2tvdXRPYmogPSBudWxsOworCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscyA9IG5ldyBDb21wb25lbnRzVXRpbHMoKTsKKwlASW5qZWN0TW9ja3MKKwlSZXNvdXJjZUJ1c2luZXNzTG9naWMgYmwgPSBuZXcgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljKCk7CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisKKwkJc3VwZXIuc2V0dXAoKTsKKworCQkvLyBjaGVja291dCB0cmFuc2l0aW9uIG9iamVjdAorCQljaGVja291dE9iaiA9IG5ldyBDaGVja291dFRyYW5zaXRpb24oY29tcG9uZW50c1V0aWxzLCBsY09wZXJhdGlvbik7CisJCWNoZWNrb3V0T2JqLnNldExpZmVDeWNsZU9wZXJhdGlvbihsY09wZXJhdGlvbik7CisJCWNoZWNrb3V0T2JqLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKwkJY29tcG9uZW50c1V0aWxzLkluaXQoKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0U3RhdGVWYWxpZGF0aW9uKCkgeworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlUmVzdWx0OworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlyZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBvd25lclJlc3BvbnNlID0gY2hlY2tvdXRPYmouZ2V0Q29tcG9uZW50T3duZXIocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0VHJ1ZShvd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciBvd25lciA9IG93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gY2hlY2tvdXRPYmouY2hhbmdlU3RhdGUoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHJlc291cmNlLCBibCwgdXNlciwgb3duZXIsIGZhbHNlLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscyhjaGFuZ2VTdGF0ZVJlc3VsdC5pc0xlZnQoKSwgdHJ1ZSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gY2hlY2tvdXRPYmouY2hhbmdlU3RhdGUoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHJlc291cmNlLCBibCwgdXNlciwgb3duZXIsIGZhbHNlLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscyhjaGFuZ2VTdGF0ZVJlc3VsdC5pc0xlZnQoKSwgdHJ1ZSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbHJlYWR5Q2hlY2tvdXQoKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlUmVzdWx0OworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlyZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXJSZXNwb25zZSA9IGNoZWNrb3V0T2JqLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydFRydWUob3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgb3duZXIgPSBvd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8Qm9vbGVhbiwgUmVzcG9uc2VGb3JtYXQ+IHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbiA9IGNoZWNrb3V0T2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHVzZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKGNoYW5nZVN0YXRlUmVzdWx0LmlzUmlnaHQoKSwgdHJ1ZSk7CisJCWFzc2VydFJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzdWx0LCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0lOX0NIRUNLT1VUX1NUQVRFLCByZXNvdXJjZS5nZXROYW1lKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCB1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyLmdldExhc3ROYW1lKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2VydGlmaWNhdGlvbkluUHJvZ3Jlc3MoKSB7CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGVSZXN1bHQ7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBvd25lclJlc3BvbnNlID0gY2hlY2tvdXRPYmouZ2V0Q29tcG9uZW50T3duZXIocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJYXNzZXJ0VHJ1ZShvd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciBvd25lciA9IG93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gY2hlY2tvdXRPYmouY2hhbmdlU3RhdGUoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHJlc291cmNlLCBibCwgdXNlciwgb3duZXIsIGZhbHNlLCBmYWxzZSk7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24gPSBjaGVja291dE9iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCB1c2VyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlhc3NlcnRFcXVhbHModmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzUmlnaHQoKSwgdHJ1ZSk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNSaWdodCgpLCB0cnVlKTsKKworCQlhc3NlcnRSZXNwb25zZShjaGFuZ2VTdGF0ZVJlc3VsdCwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9JTl9DRVJUX0lOX1BST0dSRVNTX1NUQVRFLCByZXNvdXJjZS5nZXROYW1lKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCB1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyLmdldExhc3ROYW1lKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVhZHlGb3JDZXJ0aWZpY2F0aW9uKCkgeworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZVJlc3VsdDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKworCQkvLyBpZiBtb2RpZmllciA9IG93bmVyCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXJSZXNwb25zZSA9IGNoZWNrb3V0T2JqLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydFRydWUob3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgb3duZXIgPSBvd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQkvLyBjaGFuZ2VTdGF0ZVJlc3VsdCA9IGNoZWNrb3V0T2JqLmNoYW5nZVN0YXRlT3BlcmF0aW9uKHJlc291cmNlLCB1c2VyLAorCQkvLyBvd25lcik7CisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2hlY2tvdXRPYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdXNlciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNMZWZ0KCksIHRydWUpOworCisJCS8vIGVsc2UKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCgibW9kaWZpZXIiKTsKKwkJbW9kaWZpZXIuc2V0Rmlyc3ROYW1lKCJBbGJlcnQiKTsKKwkJbW9kaWZpZXIuc2V0TGFzdE5hbWUoIkVpbnN0ZWluIik7CisKKwkJLy8gYWRtaW4KKwkJbW9kaWZpZXIuc2V0Um9sZShSb2xlLkFETUlOLm5hbWUoKSk7CisJCS8vIGNoYW5nZVN0YXRlUmVzdWx0ID0gY2hlY2tvdXRPYmouY2hhbmdlU3RhdGVPcGVyYXRpb24ocmVzb3VyY2UsIHVzZXIsCisJCS8vIG93bmVyKTsKKwkJdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gY2hlY2tvdXRPYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgbW9kaWZpZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHModmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzTGVmdCgpLCB0cnVlKTsKKworCQkvLyBkZXNpZ25lcgorCQltb2RpZmllci5zZXRSb2xlKFJvbGUuVEVTVEVSLm5hbWUoKSk7CisJCXZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbiA9IGNoZWNrb3V0T2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG1vZGlmaWVyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5pc1JpZ2h0KCksIHRydWUpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNSaWdodCgpLCB0cnVlKTsKKwkJYXNzZXJ0UmVzcG9uc2UoY2hhbmdlU3RhdGVSZXN1bHQsIEFjdGlvblN0YXR1cy5SRVNUUklDVEVEX09QRVJBVElPTiwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgdXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJvbGVzKCkgeworCQlFaXRoZXI8UmVzb3VyY2UsIFJlc3BvbnNlRm9ybWF0PiBjaGFuZ2VTdGF0ZVJlc3VsdDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZU9iamVjdChmYWxzZSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCgibW9kaWZpZXIiKTsKKwkJbW9kaWZpZXIuc2V0Rmlyc3ROYW1lKCJBbGJlcnQiKTsKKwkJbW9kaWZpZXIuc2V0TGFzdE5hbWUoIkVpbnN0ZWluIik7CisJCW1vZGlmaWVyLnNldFJvbGUoUm9sZS5ERVNJR05FUi5uYW1lKCkpOworCQlFaXRoZXI8VXNlciwgUmVzcG9uc2VGb3JtYXQ+IG93bmVyUmVzcG9uc2UgPSBjaGVja291dE9iai5nZXRDb21wb25lbnRPd25lcihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRUcnVlKG93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIG93bmVyID0gb3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJLy8gY2hhbmdlU3RhdGVSZXN1bHQgPSBjaGVja291dE9iai5jaGFuZ2VTdGF0ZU9wZXJhdGlvbihyZXNvdXJjZSwKKwkJLy8gbW9kaWZpZXIsIG93bmVyKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24gPSBjaGVja291dE9iai52YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ocmVzb3VyY2UsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBtb2RpZmllciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlhc3NlcnRFcXVhbHModmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzTGVmdCgpLCB0cnVlKTsKKworCQltb2RpZmllci5zZXRSb2xlKFJvbGUuVEVTVEVSLm5hbWUoKSk7CisJCS8vIGNoYW5nZVN0YXRlUmVzdWx0ID0gY2hlY2tvdXRPYmouY2hhbmdlU3RhdGVPcGVyYXRpb24ocmVzb3VyY2UsCisJCS8vIG1vZGlmaWVyLCBvd25lcik7CisJCXZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbiA9IGNoZWNrb3V0T2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIG1vZGlmaWVyLCBvd25lciwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCWFzc2VydFJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzdWx0LCBBY3Rpb25TdGF0dXMuUkVTVFJJQ1RFRF9PUEVSQVRJT04pOworCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0xpZmVjeWNsZVRlc3RCYXNlLmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvTGlmZWN5Y2xlVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzRhM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbXBvbmVudHMvbGlmZWN5Y2xlL0xpZmVjeWNsZVRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmxpZmVjeWNsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uaW52b2NhdGlvbi5JbnZvY2F0aW9uT25Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLnN0dWJiaW5nLkFuc3dlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5BdWRpdGluZ01vY2tNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmF1ZGl0aW5nLmFwaS5JQXVkaXRpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5BcnRpZmFjdHNCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5SZXNwb25zZUZvcm1hdE1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5MaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkZTQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uUmVzcG9uc2VGb3JtYXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVUZXN0QmFzZSB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpZmVjeWNsZVRlc3RCYXNlLmNsYXNzLmdldE5hbWUoKSk7CisJQEluamVjdE1vY2tzCisJcHJvdGVjdGVkIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gTW9ja2l0by5tb2NrKFNlcnZsZXRDb250ZXh0LmNsYXNzKTsKKwlwcm90ZWN0ZWQgSUF1ZGl0aW5nTWFuYWdlciBpQXVkaXRpbmdNYW5hZ2VyID0gbnVsbDsKKwlwcm90ZWN0ZWQgVXNlckJ1c2luZXNzTG9naWMgbW9ja1VzZXJBZG1pbiA9IE1vY2tpdG8ubW9jayhVc2VyQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJcHJvdGVjdGVkIFdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcENvbnRleHRXcmFwcGVyID0gTW9ja2l0by5tb2NrKFdlYkFwcENvbnRleHRXcmFwcGVyLmNsYXNzKTsKKwlwcm90ZWN0ZWQgV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcENvbnRleHQgPSBNb2NraXRvLm1vY2soV2ViQXBwbGljYXRpb25Db250ZXh0LmNsYXNzKTsKKwlwcm90ZWN0ZWQgTGlmZWN5Y2xlT3BlcmF0aW9uIGxjT3BlcmF0aW9uID0gTW9ja2l0by5tb2NrKExpZmVjeWNsZU9wZXJhdGlvbi5jbGFzcyk7CisJcHJvdGVjdGVkIEFydGlmYWN0c0J1c2luZXNzTG9naWMgYXJ0aWZhY3RzTWFuYWdlciA9IE1vY2tpdG8ubW9jayhBcnRpZmFjdHNCdXNpbmVzc0xvZ2ljLmNsYXNzKTs7CisJcHJvdGVjdGVkIFVzZXIgdXNlciA9IG51bGw7CisJcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlUmVzcG9uc2U7CisJcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZVJlc3BvbnNlOworCXByb3RlY3RlZCBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG51bGw7CisJcHJvdGVjdGVkIFJlc3BvbnNlRm9ybWF0TWFuYWdlciByZXNwb25zZU1hbmFnZXIgPSBudWxsOworCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcE5hbWUoImNhdGFsb2ctYmUiKTsKKworCQkvLyBJbml0IENvbmZpZ3VyYXRpb24KKwkJU3RyaW5nIGFwcENvbmZpZ0RpciA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUiOworCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcgRlNDb25maWd1cmF0aW9uU291cmNlKEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VMaXN0ZW5lcigpLCBhcHBDb25maWdEaXIpOworCQljb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uU291cmNlKTsKKworCQkvLyBBdWRpdGluZworCQlpQXVkaXRpbmdNYW5hZ2VyID0gbmV3IEF1ZGl0aW5nTW9ja01hbmFnZXIoImxsbCIpOworCisJCS8vIFVzZXIgZGF0YSBhbmQgbWFuYWdlbWVudAorCQl1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQoImpoMDAzIik7CisJCXVzZXIuc2V0Rmlyc3ROYW1lKCJKaW1taSIpOworCQl1c2VyLnNldExhc3ROYW1lKCJIZW5kcml4Iik7CisJCXVzZXIuc2V0Um9sZShSb2xlLkFETUlOLm5hbWUoKSk7CisKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyR2V0VXNlciA9IEVpdGhlci5sZWZ0KHVzZXIpOworCQl3aGVuKG1vY2tVc2VyQWRtaW4uZ2V0VXNlcigiamgwMDMiLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyR2V0VXNlcik7CisKKwkJLy8gU2VydmxldCBDb250ZXh0IGF0dHJpYnV0ZXMKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkudGhlblJldHVybihjb25maWd1cmF0aW9uTWFuYWdlcik7CisJCS8vIHdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVURJVElOR19NQU5BR0VSKSkudGhlblJldHVybihpQXVkaXRpbmdNYW5hZ2VyKTsKKwkJLy8gd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlJFU09VUkNFX09QRVJBVElPTl9NQU5BR0VSKSkudGhlblJldHVybihyZXNvdXJjZU9wZXJhdGlvbik7CisJCXdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpKS50aGVuUmV0dXJuKHdlYkFwcENvbnRleHRXcmFwcGVyKTsKKwkJd2hlbih3ZWJBcHBDb250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KHNlcnZsZXRDb250ZXh0KSkudGhlblJldHVybih3ZWJBcHBDb250ZXh0KTsKKwkJd2hlbih3ZWJBcHBDb250ZXh0LmdldEJlYW4oTGlmZWN5Y2xlT3BlcmF0aW9uLmNsYXNzKSkudGhlblJldHVybihsY09wZXJhdGlvbik7CisJCXdoZW4od2ViQXBwQ29udGV4dC5nZXRCZWFuKEFydGlmYWN0c0J1c2luZXNzTG9naWMuY2xhc3MpKS50aGVuUmV0dXJuKGFydGlmYWN0c01hbmFnZXIpOworCisJCS8vIFJlc291cmNlIE9wZXJhdGlvbiBtb2NrIG1ldGhvZHMKKwkJLy8gZ2V0Q291bnQKKworCQkvLyBjcmVhdGVSZXNvdXJjZQorCQlyZXNvdXJjZVJlc3BvbnNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QodHJ1ZSk7CisJCXNlcnZpY2VSZXNwb25zZSA9IGNyZWF0ZVNlcnZpY2VPYmplY3QodHJ1ZSk7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQ3JlYXRlID0gRWl0aGVyLmxlZnQocmVzb3VyY2VSZXNwb25zZSk7CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDcmVhdGVDb21wb25lbnQgPSBFaXRoZXIubGVmdChyZXNvdXJjZVJlc3BvbnNlKTsKKwkJd2hlbigoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGNPcGVyYXRpb24uY2hlY2tvdXRDb21wb25lbnQoTW9ja2l0by5lcShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueShVc2VyLmNsYXNzKSwgTW9ja2l0by5hbnkoQm9vbGVhbi5jbGFzcykpKQorCQkJCS50aGVuQW5zd2VyKGNyZWF0ZUFuc3dlcihlaXRoZXJDcmVhdGUpKTsKKwkJd2hlbihsY09wZXJhdGlvbi5jaGVja291dENvbXBvbmVudChNb2NraXRvLmVxKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSwgTW9ja2l0by5hbnkoVXNlci5jbGFzcyksIE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueShCb29sZWFuLmNsYXNzKSkpLnRoZW5BbnN3ZXIoY3JlYXRlQW5zd2VyKGVpdGhlckNyZWF0ZUNvbXBvbmVudCkpOworCisJCXdoZW4oKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxjT3BlcmF0aW9uLmNoZWNraW5Db21wb25lbnQoTW9ja2l0by5lcShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCBNb2NraXRvLmFueShSZXNvdXJjZS5jbGFzcyksIE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueShVc2VyLmNsYXNzKSwgTW9ja2l0by5hbnkoQm9vbGVhbi5jbGFzcykpKQorCQkJCS50aGVuQW5zd2VyKGNyZWF0ZUFuc3dlcihlaXRoZXJDcmVhdGUpKTsKKworCQl3aGVuKChFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBsY09wZXJhdGlvbi5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChNb2NraXRvLmVxKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIE1vY2tpdG8uYW55KFJlc291cmNlLmNsYXNzKSwgTW9ja2l0by5hbnkoVXNlci5jbGFzcyksIE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueShCb29sZWFuLmNsYXNzKSkpCisJCQkJLnRoZW5BbnN3ZXIoY3JlYXRlQW5zd2VyKGVpdGhlckNyZWF0ZSkpOworCQl3aGVuKGxjT3BlcmF0aW9uLnJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KE1vY2tpdG8uZXEoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgTW9ja2l0by5hbnkoQ29tcG9uZW50LmNsYXNzKSwgTW9ja2l0by5hbnkoVXNlci5jbGFzcyksIE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueShCb29sZWFuLmNsYXNzKSkpLnRoZW5BbnN3ZXIoY3JlYXRlQW5zd2VyKGVpdGhlckNyZWF0ZUNvbXBvbmVudCkpOworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3VsdCA9IEVpdGhlci5sZWZ0KHVzZXIpOworCQl3aGVuKGxjT3BlcmF0aW9uLmdldENvbXBvbmVudE93bmVyKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uZXEoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgTW9ja2l0by5hbnkoQm9vbGVhbi5jbGFzcykpKS50aGVuUmV0dXJuKGdldE93bmVyUmVzdWx0KTsKKwkJd2hlbihsY09wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmVxKE5vZGVUeXBlRW51bS5TZXJ2aWNlKSwgTW9ja2l0by5hbnkoQm9vbGVhbi5jbGFzcykpKS50aGVuUmV0dXJuKGdldE93bmVyUmVzdWx0KTsKKworCQlyZXNwb25zZU1hbmFnZXIgPSBSZXNwb25zZUZvcm1hdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgPFQ+IEFuc3dlcjxUPiBjcmVhdGVBbnN3ZXIoZmluYWwgVCB2YWx1ZSkgeworCQlBbnN3ZXI8VD4gZHVtbXkgPSBuZXcgQW5zd2VyPFQ+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgVCBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisKKwkJfTsKKwkJcmV0dXJuIGR1bW15OworCX0KKworCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZU9iamVjdChib29sZWFuIGFmdGVyQ3JlYXRlKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7CisJCXJlc291cmNlLnNldE5hbWUoIk15UmVzb3VyY2VOYW1lIik7CisJCXJlc291cmNlLmFkZENhdGVnb3J5KCJWb0lQIiwgIklOZnJhIik7CisJCXJlc291cmNlLnNldERlc2NyaXB0aW9uKCJNeSBzaG9ydCBkZXNjcmlwdGlvbiIpOworCQlMaXN0PFN0cmluZz4gdGdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRncy5hZGQoInRlc3QiKTsKKwkJcmVzb3VyY2Uuc2V0VGFncyh0Z3MpOworCQlMaXN0PFN0cmluZz4gdGVtcGxhdGUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGVtcGxhdGUuYWRkKCJSb290Iik7CisJCXJlc291cmNlLnNldERlcml2ZWRGcm9tKHRlbXBsYXRlKTsKKwkJcmVzb3VyY2Uuc2V0VmVuZG9yTmFtZSgiTW90b3JvbGEiKTsKKwkJcmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZSgiMS4wLjAiKTsKKwkJcmVzb3VyY2Uuc2V0Q29udGFjdElkKCJ5YXZpdmkiKTsKKwkJcmVzb3VyY2Uuc2V0SWNvbigiTXlJY29uLmpwZyIpOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCWxvZy5kZWJ1Zyhnc29uLnRvSnNvbihyZXNvdXJjZSkpOworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHJvdGVjdGVkIFNlcnZpY2UgY3JlYXRlU2VydmljZU9iamVjdChib29sZWFuIGIpIHsKKwkJU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsKKwkJc2VydmljZS5zZXROYW1lKCJNeVNlcnZpY2VOYW1lIik7CisJCXNlcnZpY2UuYWRkQ2F0ZWdvcnkoIlZvSVAiLCBudWxsKTsKKwkJc2VydmljZS5zZXREZXNjcmlwdGlvbigiTXkgc2hvcnQgZGVzY3JpcHRpb24iKTsKKwkJTGlzdDxTdHJpbmc+IHRncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0Z3MuYWRkKCJ0ZXN0Iik7CisJCXNlcnZpY2Uuc2V0VGFncyh0Z3MpOworCQlMaXN0PFN0cmluZz4gdGVtcGxhdGUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGVtcGxhdGUuYWRkKCJSb290Iik7CisJCXNlcnZpY2Uuc2V0Q29udGFjdElkKCJhYTAwMDEiKTsKKwkJc2VydmljZS5zZXRJY29uKCJNeUljb24uanBnIik7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKwkJbG9nLmRlYnVnKGdzb24udG9Kc29uKHNlcnZpY2UpKTsKKwkJcmV0dXJuIHNlcnZpY2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVzcG9uc2UoRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFJlc3BvbnNlRm9ybWF0PiBjcmVhdGVSZXNwb25zZSwgQWN0aW9uU3RhdHVzIGV4cGVjdGVkU3RhdHVzLCBTdHJpbmcuLi4gdmFyaWFibGVzKSB7CisJCUFzc2VydC5hc3NlcnRUcnVlKGNyZWF0ZVJlc3BvbnNlLmlzUmlnaHQoKSk7CisJCVJlc3BvbnNlRm9ybWF0IGV4cGVjdGVkUmVzcG9uc2UgPSByZXNwb25zZU1hbmFnZXIuZ2V0UmVzcG9uc2VGb3JtYXQoZXhwZWN0ZWRTdGF0dXMsIHZhcmlhYmxlcyk7CisJCVJlc3BvbnNlRm9ybWF0IGFjdHVhbFJlc3BvbnNlID0gY3JlYXRlUmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGFjdHVhbFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiYXNzZXJ0IGVycm9yIGRlc2NyaXB0aW9uIiwgZXhwZWN0ZWRSZXNwb25zZS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCksIGFjdHVhbFJlc3BvbnNlLmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U2VydmljZVJlc3BvbnNlKEVpdGhlcjxTZXJ2aWNlLCBSZXNwb25zZUZvcm1hdD4gY3JlYXRlUmVzcG9uc2UsIEFjdGlvblN0YXR1cyBleHBlY3RlZFN0YXR1cywgU3RyaW5nLi4uIHZhcmlhYmxlcykgeworCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjcmVhdGVSZXNwb25zZS5pc1JpZ2h0KCkpOworCQlSZXNwb25zZUZvcm1hdCBleHBlY3RlZFJlc3BvbnNlID0gcmVzcG9uc2VNYW5hZ2VyLmdldFJlc3BvbnNlRm9ybWF0KGV4cGVjdGVkU3RhdHVzLCB2YXJpYWJsZXMpOworCQlSZXNwb25zZUZvcm1hdCBhY3R1YWxSZXNwb25zZSA9IGNyZWF0ZVJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZFJlc3BvbnNlLmdldFN0YXR1cygpLCBhY3R1YWxSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoImFzc2VydCBlcnJvciBkZXNjcmlwdGlvbiIsIGV4cGVjdGVkUmVzcG9uc2UuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpLCBhY3R1YWxSZXNwb25zZS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgQXJ0aWZhY3REZWZpbml0aW9uIGdldEFydGlmYWN0UGxhY2VIb2xkZXIoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBsb2dpY2FsTmFtZSkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKCk7CisKKwkJYXJ0aWZhY3Quc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChyZXNvdXJjZUlkLCBsb2dpY2FsTmFtZS50b0xvd2VyQ2FzZSgpKSk7CisJCWFydGlmYWN0LnNldEFydGlmYWN0TGFiZWwobG9naWNhbE5hbWUudG9Mb3dlckNhc2UoKSk7CisKKwkJcmV0dXJuIGFydGlmYWN0OworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb21wb25lbnRzL2xpZmVjeWNsZS9VbmRvQ2hlY2tvdXRUZXN0LmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvVW5kb0NoZWNrb3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzAzODUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29tcG9uZW50cy9saWZlY3ljbGUvVW5kb0NoZWNrb3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5saWZlY3ljbGUuVW5kb0NoZWNrb3V0VHJhbnNpdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Sb2xlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgVW5kb0NoZWNrb3V0VGVzdCBleHRlbmRzIExpZmVjeWNsZVRlc3RCYXNlIHsKKworCXByaXZhdGUgVW5kb0NoZWNrb3V0VHJhbnNpdGlvbiB1bmRvQ2hlY2tvdXRPYmogPSBudWxsOworCXByaXZhdGUgQ29tcG9uZW50c1V0aWxzIGNvbXBvbmVudHNVdGlscyA9IG5ldyBDb21wb25lbnRzVXRpbHMoKTsKKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKworCQlzdXBlci5zZXR1cCgpOworCisJCS8vIGNoZWNrb3V0IHRyYW5zaXRpb24gb2JqZWN0CisJCXVuZG9DaGVja291dE9iaiA9IG5ldyBVbmRvQ2hlY2tvdXRUcmFuc2l0aW9uKGNvbXBvbmVudHNVdGlscywgbGNPcGVyYXRpb24pOworCQl1bmRvQ2hlY2tvdXRPYmouc2V0TGlmZUN5Y2xlT3BlcmF0aW9uKGxjT3BlcmF0aW9uKTsKKwkJdW5kb0NoZWNrb3V0T2JqLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKwkJY29tcG9uZW50c1V0aWxzLkluaXQoKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlTm90Q2hlY2tlZE91dFZhbGlkYXRpb24oKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgUmVzcG9uc2VGb3JtYXQ+IGNoYW5nZVN0YXRlUmVzdWx0OworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlT2JqZWN0KGZhbHNlKTsKKworCQlyZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJRWl0aGVyPFVzZXIsIFJlc3BvbnNlRm9ybWF0PiBvd25lclJlc3BvbnNlID0gdW5kb0NoZWNrb3V0T2JqLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCWFzc2VydFRydWUob3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgb3duZXIgPSBvd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxCb29sZWFuLCBSZXNwb25zZUZvcm1hdD4gdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gdW5kb0NoZWNrb3V0T2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHVzZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5pc1JpZ2h0KCksIHRydWUpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNSaWdodCgpLCB0cnVlKTsKKworCQlhc3NlcnRSZXNwb25zZShjaGFuZ2VTdGF0ZVJlc3VsdCwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9BTFJFQURZX0NIRUNLRURfSU4sIHJlc291cmNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQl2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24gPSB1bmRvQ2hlY2tvdXRPYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdXNlciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5pc1JpZ2h0KCksIHRydWUpOworCQljaGFuZ2VTdGF0ZVJlc3VsdCA9IEVpdGhlci5yaWdodCh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGNoYW5nZVN0YXRlUmVzdWx0LmlzUmlnaHQoKSwgdHJ1ZSk7CisKKwkJYXNzZXJ0UmVzcG9uc2UoY2hhbmdlU3RhdGVSZXN1bHQsIEFjdGlvblN0YXR1cy5DT01QT05FTlRfQUxSRUFEWV9DSEVDS0VEX0lOLCByZXNvdXJjZS5nZXROYW1lKCksIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCB1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyLmdldExhc3ROYW1lKCksIHVzZXIuZ2V0VXNlcklkKCkpOworCisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCQl2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24gPSB1bmRvQ2hlY2tvdXRPYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgdXNlciwgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCQlhc3NlcnRFcXVhbHModmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzUmlnaHQoKSwgdHJ1ZSk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNSaWdodCgpLCB0cnVlKTsKKworCQlhc3NlcnRSZXNwb25zZShjaGFuZ2VTdGF0ZVJlc3VsdCwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9BTFJFQURZX0NIRUNLRURfSU4sIHJlc291cmNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwkJcmVzb3VyY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJdmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uID0gdW5kb0NoZWNrb3V0T2JqLnZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UsIHVzZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHModmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLmlzUmlnaHQoKSwgdHJ1ZSk7CisJCWNoYW5nZVN0YXRlUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQmVmb3JlVHJhbnNpdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoY2hhbmdlU3RhdGVSZXN1bHQuaXNSaWdodCgpLCB0cnVlKTsKKworCQlhc3NlcnRSZXNwb25zZShjaGFuZ2VTdGF0ZVJlc3VsdCwgQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9BTFJFQURZX0NIRUNLRURfSU4sIHJlc291cmNlLmdldE5hbWUoKSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UubmFtZSgpLnRvTG93ZXJDYXNlKCksIHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSwgdXNlci5nZXRVc2VySWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REaWZmZXJlbnRSZXNvdXJjZU93bmVyVmFsaWRhdGlvbigpIHsKKwkJRWl0aGVyPFJlc291cmNlLCBSZXNwb25zZUZvcm1hdD4gY2hhbmdlU3RhdGVSZXN1bHQ7CisJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VPYmplY3QoZmFsc2UpOworCisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZCgibW9kaWZpZXIiKTsKKwkJbW9kaWZpZXIuc2V0Rmlyc3ROYW1lKCJBbGJlcnQiKTsKKwkJbW9kaWZpZXIuc2V0TGFzdE5hbWUoIkVpbnN0ZWluIik7CisJCW1vZGlmaWVyLnNldFJvbGUoUm9sZS5ERVNJR05FUi5uYW1lKCkpOworCisJCUVpdGhlcjxVc2VyLCBSZXNwb25zZUZvcm1hdD4gb3duZXJSZXNwb25zZSA9IHVuZG9DaGVja291dE9iai5nZXRDb21wb25lbnRPd25lcihyZXNvdXJjZSwgQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpOworCQlhc3NlcnRUcnVlKG93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIG93bmVyID0gb3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFJlc3BvbnNlRm9ybWF0PiB2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24gPSB1bmRvQ2hlY2tvdXRPYmoudmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uKHJlc291cmNlLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSwgbW9kaWZpZXIsIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscyh2YWxpZGF0ZUJlZm9yZVRyYW5zaXRpb24uaXNSaWdodCgpLCB0cnVlKTsKKwkJY2hhbmdlU3RhdGVSZXN1bHQgPSBFaXRoZXIucmlnaHQodmFsaWRhdGVCZWZvcmVUcmFuc2l0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhjaGFuZ2VTdGF0ZVJlc3VsdC5pc1JpZ2h0KCksIHRydWUpOworCisJCWFzc2VydFJlc3BvbnNlKGNoYW5nZVN0YXRlUmVzdWx0LCBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NIRUNLT1VUX0JZX0FOT1RIRVJfVVNFUiwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgdXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpLCB1c2VyLmdldFVzZXJJZCgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpY1Rlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRjZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rpc3RyaWJ1dGlvbi9EaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5JbmplY3RNb2NrczsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLkJhc2VDb25mRGVwZW5kZW50VGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuQ2FtYnJpYUVycm9yUmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29tcG9uZW50cy5kaXN0cmlidXRpb24uZW5naW5lLkNhbWJyaWFIYW5kbGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5EaXN0cmlidXRpb25FbmdpbmVJbml0VGFzazsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmRpc3RyaWJ1dGlvbi5lbmdpbmUuU3Vic2NyaWJlclR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5BdWRpdEhhbmRsZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLkRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLmFwaS5jbGllbnQuQ2FtYnJpYU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudC5SZWdpc3RyYXRpb25SZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LlRvcGljUmVnaXN0cmF0aW9uUmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLmFwaS5jbGllbnQuVG9waWNVbnJlZ2lzdHJhdGlvblJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLldyYXBwZXI7CisKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljVGVzdCBleHRlbmRzIEJhc2VDb25mRGVwZW5kZW50VGVzdCB7CisKKwlASW5qZWN0TW9ja3MKKwlEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljIGRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMgPSBNb2NraXRvLnNweShEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKworCUNhbWJyaWFIYW5kbGVyIGNhbWJyaWFIYW5kbGVyID0gTW9ja2l0by5tb2NrKENhbWJyaWFIYW5kbGVyLmNsYXNzKTsKKwlBdWRpdEhhbmRsZXIgYXVkaXRIYW5kbGVyID0gTW9ja2l0by5tb2NrKEF1ZGl0SGFuZGxlci5jbGFzcyk7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYW5kbGVSZWdpc3RyYXRpb25IYXBweVNjZW5hcmlvKCkgeworCQlDYW1icmlhRXJyb3JSZXNwb25zZSBva1Jlc3BvbnNlID0gbmV3IENhbWJyaWFFcnJvclJlc3BvbnNlKENhbWJyaWFPcGVyYXRpb25TdGF0dXMuT0ssIEh0dHBTdGF0dXMuU0NfT0spOworCQlNb2NraXRvLndoZW4oY2FtYnJpYUhhbmRsZXIucmVnaXN0ZXJUb1RvcGljKE1vY2tpdG8uYW55Q29sbGVjdGlvbigpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueShTdWJzY3JpYmVyVHlwZUVudW0uY2xhc3MpKSkudGhlblJldHVybihva1Jlc3BvbnNlKTsKKworCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVJlZ2lzdHJhdGlvblJlcXVlc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IG5ldyBSZWdpc3RyYXRpb25SZXF1ZXN0KCJteVB1YmxpY0tleSIsICJteUVudiIpOworCQlkaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmhhbmRsZVJlZ2lzdHJhdGlvbihyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3QsIGF1ZGl0SGFuZGxlcik7CisKKwkJTW9ja2l0by52ZXJpZnkoZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkucmVnaXN0ZXJEaXN0cmlidXRpb25DbGllbnRUb1RvcGljKHJlc3BvbnNlV3JhcHBlciwgcmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLlBST0RVQ0VSKTsKKwkJTW9ja2l0by52ZXJpZnkoZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkucmVnaXN0ZXJEaXN0cmlidXRpb25DbGllbnRUb1RvcGljKHJlc3BvbnNlV3JhcHBlciwgcmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLkNPTlNVTUVSKTsKKwkJTW9ja2l0by52ZXJpZnkoY2FtYnJpYUhhbmRsZXIsIE1vY2tpdG8udGltZXMoMCkpLnVuUmVnaXN0ZXJGcm9tVG9waWMoTW9ja2l0by5hbnlDb2xsZWN0aW9uKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55KFN1YnNjcmliZXJUeXBlRW51bS5jbGFzcykpOworCisJCWFzc2VydFRydWUoIXJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpOworCQlSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKworCQlUb3BpY1JlZ2lzdHJhdGlvblJlc3BvbnNlIG9rVG9waWNSZXNwb25zZSA9IChUb3BpY1JlZ2lzdHJhdGlvblJlc3BvbnNlKSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRTdGF0dXNUb3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWd1cmF0aW9uTWFuYWdlci5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCkuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQlTdHJpbmcgYWN0dWFsU3RhdHVzVG9waWNOYW1lID0gb2tUb3BpY1Jlc3BvbnNlLmdldERpc3RyU3RhdHVzVG9waWNOYW1lKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFN0YXR1c1RvcGljTmFtZSwgYWN0dWFsU3RhdHVzVG9waWNOYW1lKTsKKworCQlTdHJpbmcgZXhwZWN0ZWROb3RpZmljYXRpb25Ub3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWd1cmF0aW9uTWFuYWdlci5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCkuZ2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisJCVN0cmluZyBhY3R1YWxOb3RpZmljYXRpb25Ub3BpY05hbWUgPSBva1RvcGljUmVzcG9uc2UuZ2V0RGlzdHJOb3RpZmljYXRpb25Ub3BpY05hbWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTm90aWZpY2F0aW9uVG9waWNOYW1lLCBhY3R1YWxOb3RpZmljYXRpb25Ub3BpY05hbWUpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlUmVnaXN0cmF0aW9uRmFpbGVkU2NlbmFyaW8oKSB7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIG9rUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSywgSHR0cFN0YXR1cy5TQ19PSyk7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIGVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5DT05OTkVDVElPTl9FUlJPUiwgSHR0cFN0YXR1cy5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFKTsKKwkJRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWd1cmF0aW9uTWFuYWdlci5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCk7CisJCVJlZ2lzdHJhdGlvblJlcXVlc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IG5ldyBSZWdpc3RyYXRpb25SZXF1ZXN0KCJteVB1YmxpY0tleSIsICJteUVudiIpOworCQlTdHJpbmcgZXhwZWN0ZWRTdGF0dXNUb3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQlTdHJpbmcgZXhwZWN0ZWROb3RpZmljYXRpb25Ub3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisKKwkJTW9ja2l0by53aGVuKGNhbWJyaWFIYW5kbGVyLnJlZ2lzdGVyVG9Ub3BpYyhjb25maWcuZ2V0VWViU2VydmVycygpLCBleHBlY3RlZFN0YXR1c1RvcGljTmFtZSwgY29uZmlnLmdldFVlYlB1YmxpY0tleSgpLCBjb25maWcuZ2V0VWViU2VjcmV0S2V5KCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0QXBpUHVibGljS2V5KCksIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUikpLnRoZW5SZXR1cm4ob2tSZXNwb25zZSk7CisJCU1vY2tpdG8ud2hlbihjYW1icmlhSGFuZGxlci5yZWdpc3RlclRvVG9waWMoY29uZmlnLmdldFVlYlNlcnZlcnMoKSwgZXhwZWN0ZWROb3RpZmljYXRpb25Ub3BpY05hbWUsIGNvbmZpZy5nZXRVZWJQdWJsaWNLZXkoKSwgY29uZmlnLmdldFVlYlNlY3JldEtleSgpLCByZWdpc3RyYXRpb25SZXF1ZXN0LmdldEFwaVB1YmxpY0tleSgpLCBTdWJzY3JpYmVyVHlwZUVudW0uQ09OU1VNRVIpKQorCQkJCS50aGVuUmV0dXJuKGVycm9yUmVzcG9uc2UpOworCisJCVdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKworCQlkaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmhhbmRsZVJlZ2lzdHJhdGlvbihyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3QsIGF1ZGl0SGFuZGxlcik7CisKKwkJTW9ja2l0by52ZXJpZnkoZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkucmVnaXN0ZXJEaXN0cmlidXRpb25DbGllbnRUb1RvcGljKHJlc3BvbnNlV3JhcHBlciwgcmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLlBST0RVQ0VSKTsKKwkJTW9ja2l0by52ZXJpZnkoZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkucmVnaXN0ZXJEaXN0cmlidXRpb25DbGllbnRUb1RvcGljKHJlc3BvbnNlV3JhcHBlciwgcmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLkNPTlNVTUVSKTsKKwkJTW9ja2l0by52ZXJpZnkoY2FtYnJpYUhhbmRsZXIsIE1vY2tpdG8udGltZXMoMSkpLnVuUmVnaXN0ZXJGcm9tVG9waWMoY29uZmlnLmdldFVlYlNlcnZlcnMoKSwgZXhwZWN0ZWRTdGF0dXNUb3BpY05hbWUsIGNvbmZpZy5nZXRVZWJQdWJsaWNLZXkoKSwgY29uZmlnLmdldFVlYlNlY3JldEtleSgpLCByZWdpc3RyYXRpb25SZXF1ZXN0LmdldEFwaVB1YmxpY0tleSgpLCBTdWJzY3JpYmVyVHlwZUVudW0uUFJPRFVDRVIpOworCisJCWFzc2VydFRydWUoIXJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpOworCQlSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSBIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIYW5kbGVVblJlZ2lzdHJhdGlvbkhhcHB5U2NlbmFyaW8oKSB7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIG9rUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSywgSHR0cFN0YXR1cy5TQ19PSyk7CisKKwkJTW9ja2l0by53aGVuKGNhbWJyaWFIYW5kbGVyLnVuUmVnaXN0ZXJGcm9tVG9waWMoTW9ja2l0by5hbnlDb2xsZWN0aW9uKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55KFN1YnNjcmliZXJUeXBlRW51bS5jbGFzcykpKS50aGVuUmV0dXJuKG9rUmVzcG9uc2UpOworCisJCVdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJUmVnaXN0cmF0aW9uUmVxdWVzdCByZWdpc3RyYXRpb25SZXF1ZXN0ID0gbmV3IFJlZ2lzdHJhdGlvblJlcXVlc3QoIm15UHVibGljS2V5IiwgIm15RW52Iik7CisJCWRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuaGFuZGxlVW5SZWdpc3RyYXRpb24ocmVzcG9uc2VXcmFwcGVyLCByZWdpc3RyYXRpb25SZXF1ZXN0LCBhdWRpdEhhbmRsZXIpOworCisJCU1vY2tpdG8udmVyaWZ5KGRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMsIE1vY2tpdG8udGltZXMoMCkpLnJlZ2lzdGVyRGlzdHJpYnV0aW9uQ2xpZW50VG9Ub3BpYyhyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3QsIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUik7CisJCU1vY2tpdG8udmVyaWZ5KGRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMsIE1vY2tpdG8udGltZXMoMCkpLnJlZ2lzdGVyRGlzdHJpYnV0aW9uQ2xpZW50VG9Ub3BpYyhyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3QsIFN1YnNjcmliZXJUeXBlRW51bS5DT05TVU1FUik7CisJCU1vY2tpdG8udmVyaWZ5KGRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMsIE1vY2tpdG8udGltZXMoMSkpLnVuUmVnaXN0ZXJEaXN0cmlidXRpb25DbGllbnRGcm9tVG9waWMocmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLlBST0RVQ0VSKTsKKwkJTW9ja2l0by52ZXJpZnkoZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkudW5SZWdpc3RlckRpc3RyaWJ1dGlvbkNsaWVudEZyb21Ub3BpYyhyZWdpc3RyYXRpb25SZXF1ZXN0LCBTdWJzY3JpYmVyVHlwZUVudW0uQ09OU1VNRVIpOworCisJCU1vY2tpdG8udmVyaWZ5KGNhbWJyaWFIYW5kbGVyLCBNb2NraXRvLnRpbWVzKDIpKS51blJlZ2lzdGVyRnJvbVRvcGljKE1vY2tpdG8uYW55Q29sbGVjdGlvbigpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueShTdWJzY3JpYmVyVHlwZUVudW0uY2xhc3MpKTsKKworCQlhc3NlcnRUcnVlKCFyZXNwb25zZVdyYXBwZXIuaXNFbXB0eSgpKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNwb25zZVdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCk7CisJCWFzc2VydFRydWUocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisKKwkJVG9waWNVbnJlZ2lzdHJhdGlvblJlc3BvbnNlIG9rVG9waWNVbnJlZ2lzdGVyUmVzcG9uc2UgPSAoVG9waWNVbnJlZ2lzdHJhdGlvblJlc3BvbnNlKSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRTdGF0dXNUb3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWd1cmF0aW9uTWFuYWdlci5nZXREaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uKCkuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQlTdHJpbmcgYWN0dWFsU3RhdHVzVG9waWNOYW1lID0gb2tUb3BpY1VucmVnaXN0ZXJSZXNwb25zZS5nZXREaXN0clN0YXR1c1RvcGljTmFtZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGF0dXNUb3BpY05hbWUsIGFjdHVhbFN0YXR1c1RvcGljTmFtZSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkTm90aWZpY2F0aW9uVG9waWNOYW1lID0gRGlzdHJpYnV0aW9uRW5naW5lSW5pdFRhc2suYnVpbGRUb3BpY05hbWUoY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpLmdldERpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lKCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQlTdHJpbmcgYWN0dWFsTm90aWZpY2F0aW9uVG9waWNOYW1lID0gb2tUb3BpY1VucmVnaXN0ZXJSZXNwb25zZS5nZXREaXN0ck5vdGlmaWNhdGlvblRvcGljTmFtZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWROb3RpZmljYXRpb25Ub3BpY05hbWUsIGFjdHVhbE5vdGlmaWNhdGlvblRvcGljTmFtZSk7CisKKwkJYXNzZXJ0RXF1YWxzKG9rVG9waWNVbnJlZ2lzdGVyUmVzcG9uc2UuZ2V0Tm90aWZpY2F0aW9uVW5yZWdpc3RlclJlc3VsdCgpLCBDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJYXNzZXJ0RXF1YWxzKG9rVG9waWNVbnJlZ2lzdGVyUmVzcG9uc2UuZ2V0U3RhdHVzVW5yZWdpc3RlclJlc3VsdCgpLCBDYW1icmlhT3BlcmF0aW9uU3RhdHVzLk9LKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEhhbmRsZVVuUmVnaXN0cmF0aW9uRmFpbGVkU2NlbmFyaW8oKSB7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIG9rUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSywgSHR0cFN0YXR1cy5TQ19PSyk7CisJCUNhbWJyaWFFcnJvclJlc3BvbnNlIGVycm9yUmVzcG9uc2UgPSBuZXcgQ2FtYnJpYUVycm9yUmVzcG9uc2UoQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5BVVRIRU5USUNBVElPTl9FUlJPUiwgSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCisJCVdyYXBwZXI8UmVzcG9uc2U+IHJlc3BvbnNlV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJUmVnaXN0cmF0aW9uUmVxdWVzdCByZWdpc3RyYXRpb25SZXF1ZXN0ID0gbmV3IFJlZ2lzdHJhdGlvblJlcXVlc3QoIm15UHVibGljS2V5IiwgIm15RW52Iik7CisJCURpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpOworCQlTdHJpbmcgZXhwZWN0ZWRTdGF0dXNUb3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKCksIHJlZ2lzdHJhdGlvblJlcXVlc3QuZ2V0RGlzdHJFbnZOYW1lKCkpOworCQlTdHJpbmcgZXhwZWN0ZWROb3RpZmljYXRpb25Ub3BpY05hbWUgPSBEaXN0cmlidXRpb25FbmdpbmVJbml0VGFzay5idWlsZFRvcGljTmFtZShjb25maWcuZ2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXREaXN0ckVudk5hbWUoKSk7CisJCU1vY2tpdG8ud2hlbihjYW1icmlhSGFuZGxlci51blJlZ2lzdGVyRnJvbVRvcGljKGNvbmZpZy5nZXRVZWJTZXJ2ZXJzKCksIGV4cGVjdGVkU3RhdHVzVG9waWNOYW1lLCBjb25maWcuZ2V0VWViUHVibGljS2V5KCksIGNvbmZpZy5nZXRVZWJTZWNyZXRLZXkoKSwgcmVnaXN0cmF0aW9uUmVxdWVzdC5nZXRBcGlQdWJsaWNLZXkoKSwgU3Vic2NyaWJlclR5cGVFbnVtLlBST0RVQ0VSKSkudGhlblJldHVybihva1Jlc3BvbnNlKTsKKwkJTW9ja2l0by53aGVuKGNhbWJyaWFIYW5kbGVyLnVuUmVnaXN0ZXJGcm9tVG9waWMoY29uZmlnLmdldFVlYlNlcnZlcnMoKSwgZXhwZWN0ZWROb3RpZmljYXRpb25Ub3BpY05hbWUsIGNvbmZpZy5nZXRVZWJQdWJsaWNLZXkoKSwgY29uZmlnLmdldFVlYlNlY3JldEtleSgpLCByZWdpc3RyYXRpb25SZXF1ZXN0LmdldEFwaVB1YmxpY0tleSgpLCBTdWJzY3JpYmVyVHlwZUVudW0uQ09OU1VNRVIpKQorCQkJCS50aGVuUmV0dXJuKGVycm9yUmVzcG9uc2UpOworCisJCWRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuaGFuZGxlVW5SZWdpc3RyYXRpb24ocmVzcG9uc2VXcmFwcGVyLCByZWdpc3RyYXRpb25SZXF1ZXN0LCBhdWRpdEhhbmRsZXIpOworCisJCU1vY2tpdG8udmVyaWZ5KGRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMsIE1vY2tpdG8udGltZXMoMCkpLnJlZ2lzdGVyRGlzdHJpYnV0aW9uQ2xpZW50VG9Ub3BpYyhyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3QsIFN1YnNjcmliZXJUeXBlRW51bS5QUk9EVUNFUik7CisJCU1vY2tpdG8udmVyaWZ5KGRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMsIE1vY2tpdG8udGltZXMoMCkpLnJlZ2lzdGVyRGlzdHJpYnV0aW9uQ2xpZW50VG9Ub3BpYyhyZXNwb25zZVdyYXBwZXIsIHJlZ2lzdHJhdGlvblJlcXVlc3QsIFN1YnNjcmliZXJUeXBlRW51bS5DT05TVU1FUik7CisJCU1vY2tpdG8udmVyaWZ5KGRpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMsIE1vY2tpdG8udGltZXMoMSkpLnVuUmVnaXN0ZXJEaXN0cmlidXRpb25DbGllbnRGcm9tVG9waWMocmVnaXN0cmF0aW9uUmVxdWVzdCwgU3Vic2NyaWJlclR5cGVFbnVtLlBST0RVQ0VSKTsKKwkJTW9ja2l0by52ZXJpZnkoZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYywgTW9ja2l0by50aW1lcygxKSkudW5SZWdpc3RlckRpc3RyaWJ1dGlvbkNsaWVudEZyb21Ub3BpYyhyZWdpc3RyYXRpb25SZXF1ZXN0LCBTdWJzY3JpYmVyVHlwZUVudW0uQ09OU1VNRVIpOworCisJCWFzc2VydFRydWUoIXJlc3BvbnNlV3JhcHBlci5pc0VtcHR5KCkpOworCQlSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSBIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisKKwkJVG9waWNVbnJlZ2lzdHJhdGlvblJlc3BvbnNlIG9rVG9waWNVbnJlZ2lzdGVyUmVzcG9uc2UgPSAoVG9waWNVbnJlZ2lzdHJhdGlvblJlc3BvbnNlKSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKworCQlTdHJpbmcgYWN0dWFsU3RhdHVzVG9waWNOYW1lID0gb2tUb3BpY1VucmVnaXN0ZXJSZXNwb25zZS5nZXREaXN0clN0YXR1c1RvcGljTmFtZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGF0dXNUb3BpY05hbWUsIGFjdHVhbFN0YXR1c1RvcGljTmFtZSk7CisKKwkJU3RyaW5nIGFjdHVhbE5vdGlmaWNhdGlvblRvcGljTmFtZSA9IG9rVG9waWNVbnJlZ2lzdGVyUmVzcG9uc2UuZ2V0RGlzdHJOb3RpZmljYXRpb25Ub3BpY05hbWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTm90aWZpY2F0aW9uVG9waWNOYW1lLCBhY3R1YWxOb3RpZmljYXRpb25Ub3BpY05hbWUpOworCisJCWFzc2VydEVxdWFscyhva1RvcGljVW5yZWdpc3RlclJlc3BvbnNlLmdldE5vdGlmaWNhdGlvblVucmVnaXN0ZXJSZXN1bHQoKSwgQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5BVVRIRU5USUNBVElPTl9FUlJPUik7CisJCWFzc2VydEVxdWFscyhva1RvcGljVW5yZWdpc3RlclJlc3BvbnNlLmdldFN0YXR1c1VucmVnaXN0ZXJSZXN1bHQoKSwgQ2FtYnJpYU9wZXJhdGlvblN0YXR1cy5PSyk7CisKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKKwkJTW9ja2l0by5yZXNldChjYW1icmlhSGFuZGxlcik7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGlzdHJpYnV0aW9uL3NlcnZsZXQvRGlzdHJpYnV0aW9uU2VydmxldFRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kaXN0cmlidXRpb24vc2VydmxldC9EaXN0cmlidXRpb25TZXJ2bGV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Mjc0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGlzdHJpYnV0aW9uL3NlcnZsZXQvRGlzdHJpYnV0aW9uU2VydmxldFRlc3QuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5zZXJ2bGV0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuZGlzdHJpYnV0aW9uLmVuZ2luZS5EaXN0cmlidXRpb25FbmdpbmU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLkF1ZGl0SGFuZGxlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kaXN0cmlidXRpb24uYXBpLmNsaWVudC5SZWdpc3RyYXRpb25SZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRpc3RyaWJ1dGlvbi5hcGkuY2xpZW50LlRvcGljUmVnaXN0cmF0aW9uUmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGlzdHJpYnV0aW9uLnNlcnZsZXQuRGlzdHJpYnV0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5pbXBsLldlYkFwcENvbnRleHRXcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitwdWJsaWMgY2xhc3MgRGlzdHJpYnV0aW9uU2VydmxldFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBNb2NraXRvLm1vY2soSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEh0dHBTZXNzaW9uIHNlc3Npb24gPSBNb2NraXRvLm1vY2soSHR0cFNlc3Npb24uY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBNb2NraXRvLm1vY2soU2VydmxldENvbnRleHQuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwQ29udGV4dFdyYXBwZXIgPSBNb2NraXRvLm1vY2soV2ViQXBwQ29udGV4dFdyYXBwZXIuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IE1vY2tpdG8ubW9jayhXZWJBcHBsaWNhdGlvbkNvbnRleHQuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBNb2NraXRvLm1vY2soUmVzcG9uc2VGb3JtYXQuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYyBkaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljID0gTW9ja2l0by5tb2NrKERpc3RyaWJ1dGlvbkJ1c2luZXNzTG9naWMuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzdHJpYnV0aW9uRW5naW5lIGRpc3RyaWJ1dGlvbkVuZ2luZSA9IE1vY2tpdG8ubW9jayhEaXN0cmlidXRpb25FbmdpbmUuY2xhc3MpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX05BTUUgPSAibXlFbnYiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9UT1BJQyA9IEVOVl9OQU1FICsgIl9Ob3RpZmljYXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19UT1BJQyA9IEVOVl9OQU1FICsgIl9TdGF0dXMiOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgeworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1iZSIpOworCQl3aGVuKHJlcXVlc3QuZ2V0U2Vzc2lvbigpKS50aGVuUmV0dXJuKHNlc3Npb24pOworCQl3aGVuKHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5YX0VDT01QX0lOU1RBTkNFX0lEX0hFQURFUikpLnRoZW5SZXR1cm4oIm15QXBwbGljYXRpb25JbnN0YW5jZUlEIik7CisKKwkJd2hlbihzZXNzaW9uLmdldFNlcnZsZXRDb250ZXh0KCkpLnRoZW5SZXR1cm4oc2VydmxldENvbnRleHQpOworCQl3aGVuKHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKSkudGhlblJldHVybih3ZWJBcHBDb250ZXh0V3JhcHBlcik7CisJCXdoZW4od2ViQXBwQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChzZXJ2bGV0Q29udGV4dCkpLnRoZW5SZXR1cm4od2ViQXBwbGljYXRpb25Db250ZXh0KTsKKwkJd2hlbih3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihEaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmNsYXNzKSkudGhlblJldHVybihkaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljKTsKKwkJd2hlbihkaXN0cmlidXRpb25CdXNpbmVzc0xvZ2ljLmdldERpc3RyaWJ1dGlvbkVuZ2luZSgpKS50aGVuUmV0dXJuKGRpc3RyaWJ1dGlvbkVuZ2luZSk7CisJCXdoZW4oZGlzdHJpYnV0aW9uRW5naW5lLmlzRW52aXJvbm1lbnRBdmFpbGFibGUoRU5WX05BTUUpKS50aGVuUmV0dXJuKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spOworCQl3aGVuKGRpc3RyaWJ1dGlvbkVuZ2luZS5pc0Vudmlyb25tZW50QXZhaWxhYmxlKCkpLnRoZW5SZXR1cm4oU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisKKwkJbW9ja0J1c2luZXNzTG9naWNSZXNwb25zZSgpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb2NrQnVzaW5lc3NMb2dpY1Jlc3BvbnNlKCkgeworCQkvLyBNb2NrIFJlZ2lzdGVyCisJCU1vY2tpdG8uZG9BbnN3ZXIobmV3IEFuc3dlcjxPYmplY3Q+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgT2JqZWN0IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHsKKwkJCQlPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSAoV3JhcHBlcjxSZXNwb25zZT4pIGFyZ3NbMF07CisJCQkJVG9waWNSZWdpc3RyYXRpb25SZXNwb25zZSBva1RvcGljUmVzcG9uc2UgPSBuZXcgVG9waWNSZWdpc3RyYXRpb25SZXNwb25zZSgpOworCQkJCW9rVG9waWNSZXNwb25zZS5zZXREaXN0ck5vdGlmaWNhdGlvblRvcGljTmFtZShOT1RJRklDQVRJT05fVE9QSUMpOworCQkJCW9rVG9waWNSZXNwb25zZS5zZXREaXN0clN0YXR1c1RvcGljTmFtZShTVEFUVVNfVE9QSUMpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoUmVzcG9uc2Uuc3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spLmVudGl0eShva1RvcGljUmVzcG9uc2UpLmJ1aWxkKCkpOworCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0pLndoZW4oZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYykuaGFuZGxlUmVnaXN0cmF0aW9uKE1vY2tpdG8uYW55KFdyYXBwZXIuY2xhc3MpLCBNb2NraXRvLmFueShSZWdpc3RyYXRpb25SZXF1ZXN0LmNsYXNzKSwgTW9ja2l0by5hbnkoQXVkaXRIYW5kbGVyLmNsYXNzKSk7CisKKwkJLy8gTW9jayBVbnJlZ2lzdGVyCisJCU1vY2tpdG8uZG9BbnN3ZXIobmV3IEFuc3dlcjxPYmplY3Q+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgT2JqZWN0IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHsKKwkJCQlPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJCQlXcmFwcGVyPFJlc3BvbnNlPiByZXNwb25zZVdyYXBwZXIgPSAoV3JhcHBlcjxSZXNwb25zZT4pIGFyZ3NbMF07CisJCQkJVG9waWNSZWdpc3RyYXRpb25SZXNwb25zZSBva1RvcGljUmVzcG9uc2UgPSBuZXcgVG9waWNSZWdpc3RyYXRpb25SZXNwb25zZSgpOworCQkJCW9rVG9waWNSZXNwb25zZS5zZXREaXN0ck5vdGlmaWNhdGlvblRvcGljTmFtZShOT1RJRklDQVRJT05fVE9QSUMpOworCQkJCW9rVG9waWNSZXNwb25zZS5zZXREaXN0clN0YXR1c1RvcGljTmFtZShTVEFUVVNfVE9QSUMpOworCQkJCXJlc3BvbnNlV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoUmVzcG9uc2Uuc3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spLmVudGl0eShva1RvcGljUmVzcG9uc2UpLmJ1aWxkKCkpOworCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0pLndoZW4oZGlzdHJpYnV0aW9uQnVzaW5lc3NMb2dpYykuaGFuZGxlVW5SZWdpc3RyYXRpb24oTW9ja2l0by5hbnkoV3JhcHBlci5jbGFzcyksIE1vY2tpdG8uYW55KFJlZ2lzdHJhdGlvblJlcXVlc3QuY2xhc3MpLCBNb2NraXRvLmFueShBdWRpdEhhbmRsZXIuY2xhc3MpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlZ2lzdGVyU3VjY2Vzc1Rlc3QoKSB7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCVJlZ2lzdHJhdGlvblJlcXVlc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IG5ldyBSZWdpc3RyYXRpb25SZXF1ZXN0KCJteVB1YmxpY0tleSIsIEVOVl9OQU1FKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvcmVnaXN0ZXJGb3JEaXN0cmlidXRpb24iKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKGdzb24udG9Kc29uKHJlZ2lzdHJhdGlvblJlcXVlc3QpKSwgUmVzcG9uc2UuY2xhc3MpOworCQlhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFN0YXR1cygpID09IEh0dHBTdGF0dXMuU0NfT0spOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1blJlZ2lzdGVyU3VjY2Vzc1Rlc3QoKSB7CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCVJlZ2lzdHJhdGlvblJlcXVlc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IG5ldyBSZWdpc3RyYXRpb25SZXF1ZXN0KCJteVB1YmxpY0tleSIsIEVOVl9OQU1FKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvdW5SZWdpc3RlckZvckRpc3RyaWJ1dGlvbiIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oZ3Nvbi50b0pzb24ocmVnaXN0cmF0aW9uUmVxdWVzdCkpLCBSZXNwb25zZS5jbGFzcyk7CisJCWFzc2VydFRydWUocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworCisJCVJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKERpc3RyaWJ1dGlvblNlcnZsZXQuY2xhc3MpOworCQlmb3JjZVNldChUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVCwgIjAiKTsKKwkJcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKwkJCQliaW5kKHJlcXVlc3QpLnRvKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7CisJCQl9CisJCX0pOworCisJCXJldHVybiByZXNvdXJjZUNvbmZpZzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZWNvbXAvR2VuZXJhdGVFY29tcEVycm9yRmlsZVRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9lY29tcC9HZW5lcmF0ZUVjb21wRXJyb3JGaWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjQ2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZWNvbXAvR2VuZXJhdGVFY29tcEVycm9yRmlsZVRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZWNvbXA7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wQ2xhc3NpZmljYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yQ29kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuZ2VuZXJhdGlvbi5HZW5lcmF0ZUVjb21wRXJyb3JzQ3N2OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIEdlbmVyYXRlRWNvbXBFcnJvckZpbGVUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdmVyaWZ5Tm9EdXBsaWNhdGVzSW5FY29tcEVycm9yQ29kZXMoKSB7CisKKwkJRWNvbXBFcnJvckVudW1bXSBlY29tcEVycm9yRW51bXMgPSBFY29tcEVycm9yRW51bS52YWx1ZXMoKTsKKworCQlNYXA8RWNvbXBFcnJvckNvZGUsIExpc3Q8RWNvbXBDbGFzc2lmaWNhdGlvbj4+IG1hcCA9IG5ldyBIYXNoTWFwPEVjb21wRXJyb3JDb2RlLCBMaXN0PEVjb21wQ2xhc3NpZmljYXRpb24+PigpOworCQlmb3IgKEVjb21wRXJyb3JFbnVtIGVjb21wRXJyb3JFbnVtIDogZWNvbXBFcnJvckVudW1zKSB7CisKKwkJCUxpc3Q8RWNvbXBDbGFzc2lmaWNhdGlvbj4gbGlzdCA9IG1hcC5nZXQoZWNvbXBFcnJvckVudW0uZ2V0RWNvbXBFcnJvckNvZGUoKSk7CisJCQlpZiAobGlzdCA9PSBudWxsKSB7CisJCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCQkJbGlzdC5hZGQoZWNvbXBFcnJvckVudW0uZ2V0Q2xhc3NpZmljYXRpb24oKSk7CisKKwkJCQltYXAucHV0KGVjb21wRXJyb3JFbnVtLmdldEVjb21wRXJyb3JDb2RlKCksIGxpc3QpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGlzdC5jb250YWlucyhlY29tcEVycm9yRW51bS5nZXRDbGFzc2lmaWNhdGlvbigpKSkgeworCQkJCQlhc3NlcnRUcnVlKGVjb21wRXJyb3JFbnVtLmdldEVjb21wRXJyb3JDb2RlKCkgKyAiIGFscmVhZHkgZGVmaW5lZCB3aXRoIGVjb21wIGNsYXNzaWZpY2F0aW9uICIgKyBlY29tcEVycm9yRW51bS5nZXRDbGFzc2lmaWNhdGlvbigpLCBmYWxzZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGlzdC5hZGQoZWNvbXBFcnJvckVudW0uZ2V0Q2xhc3NpZmljYXRpb24oKSk7CisJCQkJfQorCisJCQl9CisKKwkJfQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUVjb21wRXJyb3JGaWxlSW5UYXJnZXQoKSB7CisKKwkJR2VuZXJhdGVFY29tcEVycm9yc0NzdiBlY29tcEVycm9yc0NzdiA9IG5ldyBHZW5lcmF0ZUVjb21wRXJyb3JzQ3N2KCk7CisJCWJvb2xlYW4gcmVzdWx0ID0gZWNvbXBFcnJvcnNDc3YuZ2VuZXJhdGVFY29tcEVycm9yc0NzdkZpbGUoInRhcmdldCIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzdWx0IGZyb20gZmlsZSBnZW5lcmF0aW9uIiwgcmVzdWx0KTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0Fic3RyYWN0VmFsaWRhdGlvbnNTZXJ2bGV0VGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0Fic3RyYWN0VmFsaWRhdGlvbnNTZXJ2bGV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWU5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQWJzdHJhY3RWYWxpZGF0aW9uc1NlcnZsZXRUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5VcGxvYWRSZXNvdXJjZUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuQWJzdHJhY3RWYWxpZGF0aW9uc1NlcnZsZXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uc1NlcnZsZXRUZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFZhbGlkYXRpb25zU2VydmxldCBzZXJ2bGV0ID0gbW9jayhBYnN0cmFjdFZhbGlkYXRpb25zU2VydmxldC5jbGFzcyk7CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2FyRnJvbVBheWxvYWQoKSB7CisKKwkJU3RyaW5nIHBheWxvYWROYW1lID0gInZhbGlkX3ZmLmNzYXIiOworCQlTdHJpbmcgcm9vdFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisJCVBhdGggcGF0aCA9IG51bGw7CisJCWJ5dGVbXSBkYXRhID0gbnVsbDsKKwkJU3RyaW5nIHBheWxvYWREYXRhID0gbnVsbDsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIGJ5dGVbXT4sIFJlc3BvbnNlRm9ybWF0PiByZXR1cm5WYWx1ZSA9IG51bGw7CisJCXRyeSB7CisJCQlwYXRoID0gUGF0aHMuZ2V0KHJvb3RQYXRoICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRfdmYuY3NhciIpOworCQkJZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhwYXRoKTsKKwkJCXBheWxvYWREYXRhID0gQmFzZTY0LmVuY29kZUJhc2U2NFN0cmluZyhkYXRhKTsKKwkJCVVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8gPSBuZXcgVXBsb2FkUmVzb3VyY2VJbmZvKCk7CisJCQlyZXNvdXJjZUluZm8uc2V0UGF5bG9hZE5hbWUocGF5bG9hZE5hbWUpOworCQkJcmVzb3VyY2VJbmZvLnNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKwkJCU1ldGhvZCBwcml2YXRlTWV0aG9kID0gbnVsbDsKKwkJCXByaXZhdGVNZXRob2QgPSBBYnN0cmFjdFZhbGlkYXRpb25zU2VydmxldC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0U2NhckZyb21QYXlsb2FkIiwgVXBsb2FkUmVzb3VyY2VJbmZvLmNsYXNzKTsKKwkJCXByaXZhdGVNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKwkJCXJldHVyblZhbHVlID0gKEVpdGhlcjxNYXA8U3RyaW5nLCBieXRlW10+LCBSZXNwb25zZUZvcm1hdD4pIHByaXZhdGVNZXRob2QuaW52b2tlKHNlcnZsZXQsIHJlc291cmNlSW5mbyk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgU2VjdXJpdHlFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCUFzc2VydC5hc3NlcnRUcnVlKHJldHVyblZhbHVlLmlzTGVmdCgpKTsKKwkJTWFwPFN0cmluZywgYnl0ZVtdPiBjc2FyID0gcmV0dXJuVmFsdWUubGVmdCgpLnZhbHVlKCk7CisJCUFzc2VydC5hc3NlcnRUcnVlKGNzYXIgIT0gbnVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0FwcGxpY2F0aW9uQ29uZmlnLmphdmEgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvQXBwbGljYXRpb25Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRhMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL0FwcGxpY2F0aW9uQ29uZmlnLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzLlJlc291cmNlVXBsb2FkU2VydmxldDsKKworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ29uZmlnIGV4dGVuZHMgQXBwbGljYXRpb24geworCisJcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKwkJZmluYWwgU2V0PENsYXNzPD8+PiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKworCQkvLyBBZGQgeW91ciByZXNvdXJjZXMuCisJCXJlc291cmNlcy5hZGQoUmVzb3VyY2VVcGxvYWRTZXJ2bGV0LmNsYXNzKTsKKwkJcmVzb3VyY2VzLmFkZChNdWx0aVBhcnQuY2xhc3MpOworCQlyZXNvdXJjZXMuYWRkKEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLmNsYXNzKTsKKworCQlmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IE1vY2tpdG8ubW9jayhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCisJCVJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gUmVzb3VyY2VDb25maWcuZm9yQXBwbGljYXRpb24odGhpcyk7CisKKwkJcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJYmluZChyZXF1ZXN0KS50byhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCQkJfQorCQl9KTsKKworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1Jlc291cmNlU2VydmxldFRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZVNlcnZsZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxZTQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZVNlcnZsZXRUZXN0LmphdmEKQEAgLTAsMCArMSwyNjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uaW52b2NhdGlvbi5JbnZvY2F0aW9uT25Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLnN0dWJiaW5nLkFuc3dlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb21wb25lbnRzLmltcGwuUmVzb3VyY2VJbXBvcnRNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXBsb2FkUmVzb3VyY2VJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuUmVzb3VyY2VzU2VydmxldDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlJvbGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR2VuZXJhbFV0aWxpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVNlcnZsZXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IE1vY2tpdG8ubW9jayhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzb3VyY2VJbXBvcnRNYW5hZ2VyIHJlc291cmNlSW1wb3J0TWFuYWdlciA9IE1vY2tpdG8ubW9jayhSZXNvdXJjZUltcG9ydE1hbmFnZXIuY2xhc3MpOworCWZpbmFsIHN0YXRpYyBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gTW9ja2l0by5tb2NrKEh0dHBTZXNzaW9uLmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBNb2NraXRvLm1vY2soU2VydmxldENvbnRleHQuY2xhc3MpOworCWZpbmFsIHN0YXRpYyBXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBDb250ZXh0V3JhcHBlciA9IE1vY2tpdG8ubW9jayhXZWJBcHBDb250ZXh0V3JhcHBlci5jbGFzcyk7CisJZmluYWwgc3RhdGljIFdlYkFwcGxpY2F0aW9uQ29udGV4dCB3ZWJBcHBsaWNhdGlvbkNvbnRleHQgPSBNb2NraXRvLm1vY2soV2ViQXBwbGljYXRpb25Db250ZXh0LmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcnZsZXRVdGlscyBzZXJ2bGV0VXRpbHMgPSBNb2NraXRvLm1vY2soU2VydmxldFV0aWxzLmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscyA9IE1vY2tpdG8ubW9jayhDb21wb25lbnRzVXRpbHMuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluID0gTW9ja2l0by5tb2NrKFVzZXJCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgeworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1iZSIpOworCQl3aGVuKHJlcXVlc3QuZ2V0U2Vzc2lvbigpKS50aGVuUmV0dXJuKHNlc3Npb24pOworCQl3aGVuKHNlc3Npb24uZ2V0U2VydmxldENvbnRleHQoKSkudGhlblJldHVybihzZXJ2bGV0Q29udGV4dCk7CisJCXdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpKS50aGVuUmV0dXJuKHdlYkFwcENvbnRleHRXcmFwcGVyKTsKKwkJd2hlbih3ZWJBcHBDb250ZXh0V3JhcHBlci5nZXRXZWJBcHBDb250ZXh0KHNlcnZsZXRDb250ZXh0KSkudGhlblJldHVybih3ZWJBcHBsaWNhdGlvbkNvbnRleHQpOworCQl3aGVuKHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKFJlc291cmNlSW1wb3J0TWFuYWdlci5jbGFzcykpLnRoZW5SZXR1cm4ocmVzb3VyY2VJbXBvcnRNYW5hZ2VyKTsKKwkJd2hlbih3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihTZXJ2bGV0VXRpbHMuY2xhc3MpKS50aGVuUmV0dXJuKHNlcnZsZXRVdGlscyk7CisJCXdoZW4oc2VydmxldFV0aWxzLmdldENvbXBvbmVudHNVdGlscygpKS50aGVuUmV0dXJuKGNvbXBvbmVudFV0aWxzKTsKKwkJd2hlbihzZXJ2bGV0VXRpbHMuZ2V0VXNlckFkbWluKCkpLnRoZW5SZXR1cm4odXNlckFkbWluKTsKKwkJU3RyaW5nIHVzZXJJZCA9ICJqaDAwMDMiOworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcigpOworCQl1c2VyLnNldFVzZXJJZCh1c2VySWQpOworCQl1c2VyLnNldFJvbGUoUm9sZS5BRE1JTi5uYW1lKCkpOworCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBlaXRoZXJVc2VyID0gRWl0aGVyLmxlZnQodXNlcik7CisJCXdoZW4odXNlckFkbWluLmdldFVzZXIodXNlcklkLCBmYWxzZSkpLnRoZW5SZXR1cm4oZWl0aGVyVXNlcik7CisJCXdoZW4ocmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSkudGhlblJldHVybih1c2VySWQpOworCisJCUltbXV0YWJsZVBhaXI8UmVzb3VyY2UsIEFjdGlvblN0YXR1cz4gcGFpciA9IG5ldyBJbW11dGFibGVQYWlyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+KG5ldyBSZXNvdXJjZSgpLCBBY3Rpb25TdGF0dXMuT0spOworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZSwgQWN0aW9uU3RhdHVzPiwgUmVzcG9uc2VGb3JtYXQ+IHJldCA9IEVpdGhlci5sZWZ0KHBhaXIpOworCQl3aGVuKHJlc291cmNlSW1wb3J0TWFuYWdlci5pbXBvcnRVc2VyRGVmaW5lZFJlc291cmNlKE1vY2tpdG8uYW55U3RyaW5nKCksIE1vY2tpdG8uYW55KFVwbG9hZFJlc291cmNlSW5mby5jbGFzcyksIE1vY2tpdG8uYW55KFVzZXIuY2xhc3MpLCBNb2NraXRvLmFueUJvb2xlYW4oKSwgTW9ja2l0by5hbnlCb29sZWFuKCkpKS50aGVuUmV0dXJuKHJldCk7CisKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpIHsKKwkJTW9ja2l0by5yZXNldChjb21wb25lbnRVdGlscyk7CisKKwkJTW9ja2l0by5kb0Fuc3dlcihuZXcgQW5zd2VyPFJlc3BvbnNlRm9ybWF0PigpIHsKKwkJCXB1YmxpYyBSZXNwb25zZUZvcm1hdCBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB7CisJCQkJT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7CisJCQkJQWN0aW9uU3RhdHVzIGFjdGlvbiA9IChBY3Rpb25TdGF0dXMpIGFyZ3NbMF07CisJCQkJUmVzcG9uc2VGb3JtYXQgcmVzcCA9IChhY3Rpb24gPT0gQWN0aW9uU3RhdHVzLk9LKSA/IG5ldyBSZXNwb25zZUZvcm1hdChIdHRwU3RhdHVzLkNSRUFURUQudmFsdWUoKSkgOiBuZXcgUmVzcG9uc2VGb3JtYXQoSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3A7CisJCQl9CisJCX0pLndoZW4oY29tcG9uZW50VXRpbHMpLmdldFJlc3BvbnNlRm9ybWF0KE1vY2tpdG8uYW55KEFjdGlvblN0YXR1cy5jbGFzcykpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SGFwcHlTY2VuYXJpb1Rlc3QoKSB7CisJCVVwbG9hZFJlc291cmNlSW5mbyB2YWxpZEpzb24gPSBidWlsZFZhbGlkSnNvbigpOworCQlzZXRNRDVPblJlcXVlc3QodHJ1ZSwgdmFsaWRKc29uKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvY2F0YWxvZy9yZXNvdXJjZXMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKGdzb24udG9Kc29uKHZhbGlkSnNvbikpLCBSZXNwb25zZS5jbGFzcyk7CisJCU1vY2tpdG8udmVyaWZ5KGNvbXBvbmVudFV0aWxzLCBNb2NraXRvLnRpbWVzKDEpKS5nZXRSZXNwb25zZUZvcm1hdChNb2NraXRvLmFueShBY3Rpb25TdGF0dXMuY2xhc3MpKTsKKwkJTW9ja2l0by52ZXJpZnkoY29tcG9uZW50VXRpbHMsIE1vY2tpdG8udGltZXMoMSkpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSyk7CisJCWFzc2VydFRydWUocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT0gSHR0cFN0YXR1cy5DUkVBVEVELnZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm9uVmFsaWRNZDVGYWlsKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gdmFsaWRKc29uID0gYnVpbGRWYWxpZEpzb24oKTsKKworCQlzZXRNRDVPblJlcXVlc3QoZmFsc2UsIHZhbGlkSnNvbik7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvY2F0YWxvZy9yZXNvdXJjZXMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKGdzb24udG9Kc29uKHZhbGlkSnNvbikpLCBSZXNwb25zZS5jbGFzcyk7CisJCU1vY2tpdG8udmVyaWZ5KGNvbXBvbmVudFV0aWxzLCBNb2NraXRvLnRpbWVzKDEpKS5nZXRSZXNwb25zZUZvcm1hdChNb2NraXRvLmFueShBY3Rpb25TdGF0dXMuY2xhc3MpKTsKKwkJTW9ja2l0by52ZXJpZnkoY29tcG9uZW50VXRpbHMsIE1vY2tpdG8udGltZXMoMSkpLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5JTlZBTElEX1JFU09VUkNFX0NIRUNLU1VNKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUi52YWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5vblZhbGlkUGF5bG9hZE5hbWVGYWlsKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gbWRKc29uID0gYnVpbGRWYWxpZEpzb24oKTsKKwkJbWRKc29uLnNldFBheWxvYWROYW1lKCJteUNvbXB1dGUueG1sIik7CisKKwkJcnVuQW5kVmVyaWZ5QWN0aW9uU3RhdHVzRXJyb3IobWRKc29uLCBBY3Rpb25TdGF0dXMuSU5WQUxJRF9UT1NDQV9GSUxFX0VYVEVOU0lPTik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROdWxsUGF5bG9hZEZhaWwoKSB7CisJCVVwbG9hZFJlc291cmNlSW5mbyBtZEpzb24gPSBidWlsZFZhbGlkSnNvbigpOworCQltZEpzb24uc2V0UGF5bG9hZERhdGEobnVsbCk7CisJCXJ1bkFuZFZlcmlmeUFjdGlvblN0YXR1c0Vycm9yKG1kSnNvbiwgQWN0aW9uU3RhdHVzLklOVkFMSURfUkVTT1VSQ0VfUEFZTE9BRCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROb25ZbWxQYXlsb2FkRmFpbCgpIHsKKwkJVXBsb2FkUmVzb3VyY2VJbmZvIG1kSnNvbiA9IGJ1aWxkVmFsaWRKc29uKCk7CisJCVN0cmluZyBwYXlsb2FkID0gInsganNvbiA6IHsgaXNOb3QgOiB5YW1sIH0gIjsKKwkJZW5jb2RlQW5kU2V0UGF5bG9hZChtZEpzb24sIHBheWxvYWQpOworCQlydW5BbmRWZXJpZnlBY3Rpb25TdGF0dXNFcnJvcihtZEpzb24sIEFjdGlvblN0YXR1cy5JTlZBTElEX1lBTUxfRklMRSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROb25Ub3NjYVBheWxvYWRGYWlsKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gbWRKc29uID0gYnVpbGRWYWxpZEpzb24oKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9ICJub2RlX3R5cGVzOiBcclxuIiArICIgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuaW1wb3J0UmVzb3VyY2U0dGVzdDpcclxuIiArICIgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290XHJcbiIgKyAiICAgIGRlc2NyaXB0aW9uOiB1cGRhdGUgdXBkYXRlIjsKKwkJZW5jb2RlQW5kU2V0UGF5bG9hZChtZEpzb24sIHBheWxvYWQpOworCQlydW5BbmRWZXJpZnlBY3Rpb25TdGF0dXNFcnJvcihtZEpzb24sIEFjdGlvblN0YXR1cy5JTlZBTElEX1RPU0NBX1RFTVBMQVRFKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNlcnZpY2VUb3NjYVBheWxvYWRGYWlsKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gbWRKc29uID0gYnVpbGRWYWxpZEpzb24oKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9ICJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMFxyXG4iICsgIm5vZGVfdHlwZXM6IFxyXG4iICsgIiAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5pbXBvcnRSZXNvdXJjZTR0ZXN0OlxyXG4iICsgIiAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3RcclxuIiArICIgICAgdG9wb2xvZ3lfdGVtcGxhdGU6IHRoaXNJc1NlcnZpY2VcclxuIgorCQkJCSsgIiAgICBkZXNjcmlwdGlvbjogdXBkYXRlIHVwZGF0ZSI7CisKKwkJZW5jb2RlQW5kU2V0UGF5bG9hZChtZEpzb24sIHBheWxvYWQpOworCQlydW5BbmRWZXJpZnlBY3Rpb25TdGF0dXNFcnJvcihtZEpzb24sIEFjdGlvblN0YXR1cy5OT1RfUkVTT1VSQ0VfVE9TQ0FfVEVNUExBVEUpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVSZXNvdXJjZXNJblBheWxvYWRGYWlsKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gbWRKc29uID0gYnVpbGRWYWxpZEpzb24oKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9ICJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMFxyXG4iICsgIm5vZGVfdHlwZXM6IFxyXG4iICsgIiAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5pbXBvcnRSZXNvdXJjZTR0ZXN0MjpcclxuIiArICIgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290XHJcbiIKKwkJCQkrICIgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuaW1wb3J0UmVzb3VyY2U0dGVzdDpcclxuIiArICIgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290XHJcbiIgKyAiICAgIGRlc2NyaXB0aW9uOiB1cGRhdGUgdXBkYXRlIjsKKworCQllbmNvZGVBbmRTZXRQYXlsb2FkKG1kSnNvbiwgcGF5bG9hZCk7CisJCXJ1bkFuZFZlcmlmeUFjdGlvblN0YXR1c0Vycm9yKG1kSnNvbiwgQWN0aW9uU3RhdHVzLk5PVF9TSU5HTEVfUkVTT1VSQ0UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm9uVmFsaWROYW1lU3BhY2VJblBheWxvYWRGYWlsKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gbWRKc29uID0gYnVpbGRWYWxpZEpzb24oKTsKKworCQlTdHJpbmcgcGF5bG9hZCA9ICJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMFxyXG4iICsgIm5vZGVfdHlwZXM6IFxyXG4iICsgIiAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZVguaW1wb3J0UmVzb3VyY2U0dGVzdDpcclxuIiArICIgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290XHJcbiIgKyAiICAgIGRlc2NyaXB0aW9uOiB1cGRhdGUgdXBkYXRlIjsKKworCQllbmNvZGVBbmRTZXRQYXlsb2FkKG1kSnNvbiwgcGF5bG9hZCk7CisJCXJ1bkFuZFZlcmlmeUFjdGlvblN0YXR1c0Vycm9yKG1kSnNvbiwgQWN0aW9uU3RhdHVzLklOVkFMSURfUkVTT1VSQ0VfTkFNRVNQQUNFKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBlbmNvZGVBbmRTZXRQYXlsb2FkKFVwbG9hZFJlc291cmNlSW5mbyBtZEpzb24sIFN0cmluZyBwYXlsb2FkKSB7CisJCUJhc2U2NC5lbmNvZGVCYXNlNjQocGF5bG9hZC5nZXRCeXRlcygpKTsKKwkJbWRKc29uLnNldFBheWxvYWREYXRhKHBheWxvYWQpOworCX0KKworCXByaXZhdGUgdm9pZCBydW5BbmRWZXJpZnlBY3Rpb25TdGF0dXNFcnJvcihVcGxvYWRSZXNvdXJjZUluZm8gbWRKc29uLCBBY3Rpb25TdGF0dXMgaW52YWxpZFJlc291cmNlUGF5bG9hZCkgeworCQlzZXRNRDVPblJlcXVlc3QodHJ1ZSwgbWRKc29uKTsKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvY2F0YWxvZy9yZXNvdXJjZXMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKGdzb24udG9Kc29uKG1kSnNvbikpLCBSZXNwb25zZS5jbGFzcyk7CisJCU1vY2tpdG8udmVyaWZ5KGNvbXBvbmVudFV0aWxzLCBNb2NraXRvLnRpbWVzKDEpKS5nZXRSZXNwb25zZUZvcm1hdChNb2NraXRvLmFueShBY3Rpb25TdGF0dXMuY2xhc3MpKTsKKwkJTW9ja2l0by52ZXJpZnkoY29tcG9uZW50VXRpbHMsIE1vY2tpdG8udGltZXMoMSkpLmdldFJlc3BvbnNlRm9ybWF0KGludmFsaWRSZXNvdXJjZVBheWxvYWQpOworCQlhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFN0YXR1cygpID09IEh0dHBTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRNRDVPblJlcXVlc3QoYm9vbGVhbiBpc1ZhbGlkLCBVcGxvYWRSZXNvdXJjZUluZm8ganNvbikgeworCQlTdHJpbmcgbWQ1ID0gKGlzVmFsaWQpID8gR2VuZXJhbFV0aWxpdHkuY2FsY3VsYXRlTUQ1QnlTdHJpbmcoZ3Nvbi50b0pzb24oanNvbikpIDogInN0YW09IjsKKwkJd2hlbihyZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuTUQ1X0hFQURFUikpLnRoZW5SZXR1cm4obWQ1KTsKKworCX0KKworCXByaXZhdGUgVXBsb2FkUmVzb3VyY2VJbmZvIGJ1aWxkVmFsaWRKc29uKCkgeworCQlVcGxvYWRSZXNvdXJjZUluZm8gcmV0ID0gbmV3IFVwbG9hZFJlc291cmNlSW5mbygpOworCQlyZXQuc2V0TmFtZSgiTXlDb21wdXRlIik7CisJCXJldC5zZXRQYXlsb2FkTmFtZSgiTXlDb21wdXRlLnltbCIpOworCQlyZXQuYWRkU3ViQ2F0ZWdvcnkoIkFwcGxpY2F0aW9uIExheWVyIDQrIiwgIkFwcGxpY2F0aW9uIFNlcnZlcnMiKTsKKwkJcmV0LnNldERlc2NyaXB0aW9uKCJSZXNvdXJjZURlc2NyaXB0aW9uIik7CisJCXJldC5zZXRWZW5kb3JOYW1lKCJWZW5kb3JOYW1lIik7CisJCXJldC5zZXRWZW5kb3JSZWxlYXNlKCJWZW5kb3JSZWxlYXNlIik7CisJCXJldC5zZXRDb250YWN0SWQoIkFUMTIzNCIpOworCQlyZXQuc2V0SWNvbigicm91dGVyIik7CisJCXJldC5zZXRUYWdzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIk15Q29tcHV0ZSIgfSkpOworCQlyZXQuc2V0UGF5bG9hZERhdGEoCisJCQkJImRHOXpZMkZmWkdWbWFXNXBkR2x2Ym5OZmRtVnljMmx2YmpvZ2RHOXpZMkZmYzJsdGNHeGxYM2xoYld4Zk1WOHdYekFOQ201dlpHVmZkSGx3WlhNNklBMEtJQ0J2Y21jdWIzQmxibVZqYjIxd0xuSmxjMjkxY21ObExrMTVRMjl0Y0hWMFpUb05DaUFnSUNCa1pYSnBkbVZrWDJaeWIyMDZJSFJ2YzJOaExtNXZaR1Z6TGxKdmIzUU5DaUFnSUNCaGRIUnlhV0oxZEdWek9nMEtJQ0FnSUNBZ2NISnBkbUYwWlY5aFpHUnlaWE56T2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNBZ0lIQjFZbXhwWTE5aFpHUnlaWE56T2cwS0lDQWdJQ0FnSUNCMGVYQmxPaUJ6ZEhKcGJtY05DaUFnSUNBZ0lHNWxkSGR2Y210ek9nMEtJQ0FnSUNBZ0lDQjBlWEJsT2lCdFlYQU5DaUFnSUNBZ0lDQWdaVzUwY25sZmMyTm9aVzFoT2cwS0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbVJoZEdGMGVYQmxjeTV1WlhSM2IzSnJMazVsZEhkdmNtdEpibVp2RFFvZ0lDQWdJQ0J3YjNKMGN6b05DaUFnSUNBZ0lDQWdkSGx3WlRvZ2JXRndEUW9nSUNBZ0lDQWdJR1Z1ZEhKNVgzTmphR1Z0WVRvTkNpQWdJQ0FnSUNBZ0lDQjBlWEJsT2lCMGIzTmpZUzVrWVhSaGRIbHdaWE11Ym1WMGQyOXlheTVRYjNKMFNXNW1idzBLSUNBZ0lISmxjWFZwY21WdFpXNTBjem9OQ2lBZ0lDQWdJQzBnYkc5allXeGZjM1J2Y21GblpUb2dEUW9nSUNBZ0lDQWdJQ0FnWTJGd1lXSnBiR2wwZVRvZ2RHOXpZMkV1WTJGd1lXSnBiR2wwYVdWekxrRjBkR0ZqYUcxbGJuUU5DaUFnSUNBZ0lDQWdJQ0J1YjJSbE9pQjBiM05qWVM1dWIyUmxjeTVDYkc5amExTjBiM0poWjJVTkNpQWdJQ0FnSUNBZ0lDQnlaV3hoZEdsdmJuTm9hWEE2SUhSdmMyTmhMbkpsYkdGMGFXOXVjMmhwY0hNdVFYUjBZV05vWlhOVWJ3MEtJQ0FnSUNBZ0lDQWdJRzlqWTNWeWNtVnVZMlZ6T2lCYk1Dd2dWVTVDVDFWT1JFVkVYU0FnRFFvZ0lDQWdZMkZ3WVdKcGJHbDBhV1Z6T2cwS0lDQWdJQ0FnYUc5emREb2dEUW9nSUNBZ0lDQWdJSFI1Y0dVNklIUnZjMk5oTG1OaGNHRmlhV3hwZEdsbGN5NURiMjUwWVdsdVpYSU5DaUFnSUNBZ0lDQWdkbUZzYVdSZmMyOTFjbU5sWDNSNWNHVnpPaUJiZEc5elkyRXVibTlrWlhNdVUyOW1kSGRoY21WRGIyMXdiMjVsYm5SZElBMEtJQ0FnSUNBZ1pXNWtjRzlwYm5RZ09nMEtJQ0FnSUNBZ0lDQjBlWEJsT2lCMGIzTmpZUzVqWVhCaFltbHNhWFJwWlhNdVJXNWtjRzlwYm5RdVFXUnRhVzRnRFFvZ0lDQWdJQ0J2Y3pvZ0RRb2dJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbU5oY0dGaWFXeHBkR2xsY3k1UGNHVnlZWFJwYm1kVGVYTjBaVzBOQ2lBZ0lDQWdJSE5qWVd4aFlteGxPZzBLSUNBZ0lDQWdJQ0IwZVhCbE9pQjBiM05qWVM1allYQmhZbWxzYVhScFpYTXVVMk5oYkdGaWJHVU5DaUFnSUNBZ0lHSnBibVJwYm1jNkRRb2dJQ0FnSUNBZ0lIUjVjR1U2SUhSdmMyTmhMbU5oY0dGaWFXeHBkR2xsY3k1dVpYUjNiM0pyTGtKcGJtUmhZbXhsIik7CisJCXJldHVybiByZXQ7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKworCQlSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZXNTZXJ2bGV0LmNsYXNzKTsKKwkJZm9yY2VTZXQoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX1BPUlQsICIwIik7CisJCXJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisJCQkJYmluZChyZXF1ZXN0KS50byhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCQkJfQorCQl9KTsKKworCQlyZXR1cm4gcmVzb3VyY2VDb25maWc7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1Jlc291cmNlVXBsb2FkU2VydmxldFRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZVVwbG9hZFNlcnZsZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyZTlkOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9SZXNvdXJjZVVwbG9hZFNlcnZsZXRUZXN0LmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5zZXJ2bGV0czsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnlPYmplY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmVxOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuZmlsZS5GaWxlRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmF1ZGl0aW5nLmltcGwuQXVkaXRpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLlJlc291cmNlVXBsb2FkU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXBsb2FkUmVzb3VyY2VJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5hcGkuSVJlc291cmNlVXBsb2FkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRVNBcnRpZmFjdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuUmVzb3VyY2VVcGxvYWRTZXJ2bGV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5XZWJBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworcHVibGljIGNsYXNzIFJlc291cmNlVXBsb2FkU2VydmxldFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzb3VyY2VVcGxvYWRTZXJ2bGV0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCWZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gTW9ja2l0by5tb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7CisJZmluYWwgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IE1vY2tpdG8ubW9jayhIdHRwU2Vzc2lvbi5jbGFzcyk7CisJZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBNb2NraXRvLm1vY2soU2VydmxldENvbnRleHQuY2xhc3MpOworCWZpbmFsIFdlYkFwcENvbnRleHRXcmFwcGVyIHdlYkFwcENvbnRleHRXcmFwcGVyID0gTW9ja2l0by5tb2NrKFdlYkFwcENvbnRleHRXcmFwcGVyLmNsYXNzKTsKKwlmaW5hbCBXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gTW9ja2l0by5tb2NrKFdlYkFwcGxpY2F0aW9uQ29udGV4dC5jbGFzcyk7CisJZmluYWwgSVJlc291cmNlVXBsb2FkZXIgaVJlc291cmNlVXBsb2FkZXIgPSBNb2NraXRvLm1vY2soSVJlc291cmNlVXBsb2FkZXIuY2xhc3MpOworCWZpbmFsIEF1ZGl0aW5nTWFuYWdlciBpQXVkaXRpbmdNYW5hZ2VyID0gTW9ja2l0by5tb2NrKEF1ZGl0aW5nTWFuYWdlci5jbGFzcyk7CisKKwlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJcHVibGljIHZvaWQgemlwRGlyZWN0b3J5KCkgeworCisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1iZSIpOworCisJCXdoZW4oc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5XRUJfQVBQTElDQVRJT05fQ09OVEVYVF9XUkFQUEVSX0FUVFIpKS50aGVuUmV0dXJuKHdlYkFwcENvbnRleHRXcmFwcGVyKTsKKwkJLy8gd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFVRElUSU5HX01BTkFHRVIpKS50aGVuUmV0dXJuKGlBdWRpdGluZ01hbmFnZXIpOworCQl3aGVuKHdlYkFwcENvbnRleHRXcmFwcGVyLmdldFdlYkFwcENvbnRleHQoc2VydmxldENvbnRleHQpKS50aGVuUmV0dXJuKHdlYkFwcGxpY2F0aW9uQ29udGV4dCk7CisJCXdoZW4od2ViQXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oSVJlc291cmNlVXBsb2FkZXIuY2xhc3MpKS50aGVuUmV0dXJuKGlSZXNvdXJjZVVwbG9hZGVyKTsKKwkJd2hlbihpUmVzb3VyY2VVcGxvYWRlci5zYXZlQXJ0aWZhY3QoKEVTQXJ0aWZhY3REYXRhKSBhbnlPYmplY3QoKSwgZXEodHJ1ZSkpKS50aGVuUmV0dXJuKFJlc291cmNlVXBsb2FkU3RhdHVzLk9LKTsKKwkJd2hlbih3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihBdWRpdGluZ01hbmFnZXIuY2xhc3MpKS50aGVuUmV0dXJuKGlBdWRpdGluZ01hbmFnZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisKKwkJUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VVcGxvYWRTZXJ2bGV0LmNsYXNzKTsKKworCQlyZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKwkJcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKwkJCQkvLyBUaGUgYmVsb3cgY29kZSB3YXMgY3V0LXBhc3RlZCB0byBoZXJlIGZyb20gc2V0dXAoKSBiZWNhdXNlCisJCQkJLy8gZHVlIHRvIGl0IG5vdyBoYXMKKwkJCQkvLyB0byBiZSBleGVjdXRlZCBkdXJpbmcgc2VydmxldCBpbml0aWFsaXphdGlvbgorCQkJCWJpbmQocmVxdWVzdCkudG8oSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKTsKKwkJCQl3aGVuKHJlcXVlc3QuZ2V0U2Vzc2lvbigpKS50aGVuUmV0dXJuKHNlc3Npb24pOworCQkJCXdoZW4oc2Vzc2lvbi5nZXRTZXJ2bGV0Q29udGV4dCgpKS50aGVuUmV0dXJuKHNlcnZsZXRDb250ZXh0KTsKKwkJCQlTdHJpbmcgYXBwQ29uZmlnRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZSI7CisJCQkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3IEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgYXBwQ29uZmlnRGlyKTsKKwkJCQlDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uU291cmNlKTsKKwkJCQlmb3IgKFN0cmluZyBtYW5kYXRvcnlIZWFkZXIgOiBjb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0SWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMoKSkgeworCisJCQkJCXdoZW4ocmVxdWVzdC5nZXRIZWFkZXIobWFuZGF0b3J5SGVhZGVyKSkudGhlblJldHVybihtYW5kYXRvcnlIZWFkZXIpOworCisJCQkJfQorCisJCQkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkudGhlblJldHVybihjb25maWd1cmF0aW9uTWFuYWdlcik7CisJCQl9CisJCX0pOworCisJCXJldHVybiByZXNvdXJjZUNvbmZpZzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworCQljb25maWcucmVnaXN0ZXIoTXVsdGlQYXJ0RmVhdHVyZS5jbGFzcyk7CisJfQorCisJcHVibGljIGNsYXNzIERlbGVnYXRpbmdTZXJ2bGV0SW5wdXRTdHJlYW0gZXh0ZW5kcyBTZXJ2bGV0SW5wdXRTdHJlYW0geworCisJCXByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtOworCisJCS8qKgorCQkgKiBDcmVhdGUgYSBEZWxlZ2F0aW5nU2VydmxldElucHV0U3RyZWFtIGZvciB0aGUgZ2l2ZW4gc291cmNlIHN0cmVhbS4KKwkJICogCisJCSAqIEBwYXJhbSBzb3VyY2VTdHJlYW0KKwkJICogICAgICAgICAgICB0aGUgc291cmNlIHN0cmVhbSAobmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4pCisJCSAqLworCQlwdWJsaWMgRGVsZWdhdGluZ1NlcnZsZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0pIHsKKwkJCS8vIEFzc2VydC5ub3ROdWxsKHNvdXJjZVN0cmVhbSwKKwkJCS8vICJTb3VyY2UgSW5wdXRTdHJlYW0gbXVzdCBub3QgYmUgbnVsbCIpOworCQkJdGhpcy5zb3VyY2VTdHJlYW0gPSBzb3VyY2VTdHJlYW07CisJCX0KKworCQkvKioKKwkJICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBzdHJlYW0gKG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+KS4KKwkJICovCisJCXB1YmxpYyBmaW5hbCBJbnB1dFN0cmVhbSBnZXRTb3VyY2VTdHJlYW0oKSB7CisJCQlyZXR1cm4gdGhpcy5zb3VyY2VTdHJlYW07CisJCX0KKworCQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJcmV0dXJuIHRoaXMuc291cmNlU3RyZWFtLnJlYWQoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXN1cGVyLmNsb3NlKCk7CisJCQl0aGlzLnNvdXJjZVN0cmVhbS5jbG9zZSgpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBhcnQoKSB7CisJCUZpbGVEYXRhQm9keVBhcnQgZmlsZVBhcnQgPSBuZXcgRmlsZURhdGFCb2R5UGFydCgicmVzb3VyY2VaaXAiLCBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9ub3JtYXRpdmUtdHlwZXMtcm9vdC56aXAiKSk7CisKKwkJTGlzdDxTdHJpbmc+IHRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGFncy5hZGQoInRhZzEiKTsKKwkJdGFncy5hZGQoInRhZzIiKTsKKwkJVXBsb2FkUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbyA9IG5ldyBVcGxvYWRSZXNvdXJjZUluZm8oInBheWxvYWQiLCAibm9ybWF0aXZlLXR5cGVzLXJvb3QueW1sIiwgIm15X2Rlc2NyaXB0aW9uIiwgImNhdGVnb3J5L215Y2F0ZWdvcnkiLCB0YWdzLCBudWxsKTsKKworCQlGb3JtRGF0YUJvZHlQYXJ0IG1ldGFkYXRhUGFydCA9IG5ldyBGb3JtRGF0YUJvZHlQYXJ0KCJyZXNvdXJjZU1ldGFkYXRhIiwgZ3Nvbi50b0pzb24ocmVzb3VyY2VJbmZvKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisJCU11bHRpUGFydCBtdWx0aXBhcnRFbnRpdHkgPSBuZXcgRm9ybURhdGFNdWx0aVBhcnQoKTsKKwkJbXVsdGlwYXJ0RW50aXR5LmJvZHlQYXJ0KGZpbGVQYXJ0KTsKKwkJbXVsdGlwYXJ0RW50aXR5LmJvZHlQYXJ0KG1ldGFkYXRhUGFydCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvY2F0YWxvZy91cGxvYWQvIiArIFJlc291cmNlVXBsb2FkU2VydmxldC5OT1JNQVRJVkVfVFlQRV9SRVNPVVJDRSkucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikucG9zdChFbnRpdHkuZW50aXR5KG11bHRpcGFydEVudGl0eSwgTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpLCBSZXNwb25zZS5jbGFzcyk7CisJCWxvZy5kZWJ1Zygie30iLCByZXNwb25zZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvc2VydmxldHMvVHlwZXNVcGxvYWRTZXJ2bGV0VGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1R5cGVzVXBsb2FkU2VydmxldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBjYmNjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1R5cGVzVXBsb2FkU2VydmxldFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAudXRpbC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmZpbGUuRmlsZURhdGFCb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbXBvbmVudHMuaW1wbC5DYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuQ29tcG9uZW50c1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuU2VydmxldFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmltcGwuV2ViQXBwQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHMuVHlwZXNVcGxvYWRTZXJ2bGV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXIuUm9sZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51c2VyLlVzZXJCdXNpbmVzc0xvZ2ljOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbi5SZXNwb25zZUZvcm1hdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgVHlwZXNVcGxvYWRTZXJ2bGV0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IE1vY2tpdG8ubW9jayhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IE1vY2tpdG8ubW9jayhIdHRwU2Vzc2lvbi5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IE1vY2tpdG8ubW9jayhTZXJ2bGV0Q29udGV4dC5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBXZWJBcHBDb250ZXh0V3JhcHBlciB3ZWJBcHBDb250ZXh0V3JhcHBlciA9IE1vY2tpdG8ubW9jayhXZWJBcHBDb250ZXh0V3JhcHBlci5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBXZWJBcHBsaWNhdGlvbkNvbnRleHQgd2ViQXBwbGljYXRpb25Db250ZXh0ID0gTW9ja2l0by5tb2NrKFdlYkFwcGxpY2F0aW9uQ29udGV4dC5jbGFzcyk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXIgaW1wb3J0TWFuYWdlciA9IE1vY2tpdG8ubW9jayhDYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXIuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VydmxldFV0aWxzIHNlcnZsZXRVdGlscyA9IE1vY2tpdG8ubW9jayhTZXJ2bGV0VXRpbHMuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluID0gTW9ja2l0by5tb2NrKFVzZXJCdXNpbmVzc0xvZ2ljLmNsYXNzKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRVdGlscyA9IE1vY2tpdG8ubW9jayhDb21wb25lbnRzVXRpbHMuY2xhc3MpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzcG9uc2VGb3JtYXQgcmVzcG9uc2VGb3JtYXQgPSBNb2NraXRvLm1vY2soUmVzcG9uc2VGb3JtYXQuY2xhc3MpOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgeworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1iZSIpOworCQl3aGVuKHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKSkudGhlblJldHVybih3ZWJBcHBDb250ZXh0V3JhcHBlcik7CisJCXdoZW4od2ViQXBwQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChzZXJ2bGV0Q29udGV4dCkpLnRoZW5SZXR1cm4od2ViQXBwbGljYXRpb25Db250ZXh0KTsKKwkJd2hlbih3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihDYXBhYmlsaXR5VHlwZUltcG9ydE1hbmFnZXIuY2xhc3MpKS50aGVuUmV0dXJuKGltcG9ydE1hbmFnZXIpOworCQl3aGVuKHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKFNlcnZsZXRVdGlscy5jbGFzcykpLnRoZW5SZXR1cm4oc2VydmxldFV0aWxzKTsKKwkJd2hlbihzZXJ2bGV0VXRpbHMuZ2V0Q29tcG9uZW50c1V0aWxzKCkpLnRoZW5SZXR1cm4oY29tcG9uZW50VXRpbHMpOworCQl3aGVuKHNlcnZsZXRVdGlscy5nZXRVc2VyQWRtaW4oKSkudGhlblJldHVybih1c2VyQWRtaW4pOworCQlTdHJpbmcgdXNlcklkID0gImpoMDAwMyI7CisJCVVzZXIgdXNlciA9IG5ldyBVc2VyKCk7CisJCXVzZXIuc2V0VXNlcklkKHVzZXJJZCk7CisJCXVzZXIuc2V0Um9sZShSb2xlLkFETUlOLm5hbWUoKSk7CisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlclVzZXIgPSBFaXRoZXIubGVmdCh1c2VyKTsKKwkJd2hlbih1c2VyQWRtaW4uZ2V0VXNlcih1c2VySWQsIGZhbHNlKSkudGhlblJldHVybihlaXRoZXJVc2VyKTsKKwkJd2hlbihyZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpKS50aGVuUmV0dXJuKHVzZXJJZCk7CisJCXdoZW4ocmVzcG9uc2VGb3JtYXQuZ2V0U3RhdHVzKCkpLnRoZW5SZXR1cm4oSHR0cFN0YXR1cy5DUkVBVEVEXzIwMS5nZXRTdGF0dXNDb2RlKCkpOworCQl3aGVuKGNvbXBvbmVudFV0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5DUkVBVEVEKSkudGhlblJldHVybihyZXNwb25zZUZvcm1hdCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0aW5nQ2FwYWJpbGl0eVR5cGVTdWNjZXNzVGVzdCgpIHsKKwkJTGlzdDxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24+IGVtcHR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uPigpOworCQlFaXRoZXI8TGlzdDxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24+LCBSZXNwb25zZUZvcm1hdD4gZWl0aGVyID0gRWl0aGVyLmxlZnQoZW1wdHlMaXN0KTsKKwkJd2hlbihpbXBvcnRNYW5hZ2VyLmNyZWF0ZUNhcGFiaWxpdHlUeXBlcyhNb2NraXRvLmFueVN0cmluZygpKSkudGhlblJldHVybihlaXRoZXIpOworCQlGaWxlRGF0YUJvZHlQYXJ0IGZpbGVQYXJ0ID0gbmV3IEZpbGVEYXRhQm9keVBhcnQoImNhcGFiaWxpdHlUeXBlWmlwIiwgbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9jYXBhYmlsaXR5VHlwZXMuemlwIikpOworCQlNdWx0aVBhcnQgbXVsdGlwYXJ0RW50aXR5ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCk7CisJCW11bHRpcGFydEVudGl0eS5ib2R5UGFydChmaWxlUGFydCk7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvY2F0YWxvZy91cGxvYWRUeXBlL2NhcGFiaWxpdHkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5lbnRpdHkobXVsdGlwYXJ0RW50aXR5LCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSksIFJlc3BvbnNlLmNsYXNzKTsKKworCQlhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFN0YXR1cygpID09IEh0dHBTdGF0dXMuQ1JFQVRFRF8yMDEuZ2V0U3RhdHVzQ29kZSgpKTsKKworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisJCWNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworCQlSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUeXBlc1VwbG9hZFNlcnZsZXQuY2xhc3MpOworCisJCXJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworCQlyZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworCQkJCS8vIFRoZSBiZWxvdyBjb2RlIHdhcyBjdXQtcGFzdGVkIHRvIGhlcmUgZnJvbSBzZXR1cCgpIGJlY2F1c2UKKwkJCQkvLyBkdWUgdG8gaXQgbm93IGhhcworCQkJCS8vIHRvIGJlIGV4ZWN1dGVkIGR1cmluZyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uCisJCQkJYmluZChyZXF1ZXN0KS50byhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCQkJCXdoZW4ocmVxdWVzdC5nZXRTZXNzaW9uKCkpLnRoZW5SZXR1cm4oc2Vzc2lvbik7CisJCQkJd2hlbihzZXNzaW9uLmdldFNlcnZsZXRDb250ZXh0KCkpLnRoZW5SZXR1cm4oc2VydmxldENvbnRleHQpOworCQkJCVN0cmluZyBhcHBDb25maWdEaXIgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlIjsKKwkJCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcgRlNDb25maWd1cmF0aW9uU291cmNlKEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VMaXN0ZW5lcigpLCBhcHBDb25maWdEaXIpOworCQkJCUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25Tb3VyY2UpOworCQkJCWZvciAoU3RyaW5nIG1hbmRhdG9yeUhlYWRlciA6IGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRJZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcygpKSB7CisKKwkJCQkJd2hlbihyZXF1ZXN0LmdldEhlYWRlcihtYW5kYXRvcnlIZWFkZXIpKS50aGVuUmV0dXJuKG1hbmRhdG9yeUhlYWRlcik7CisKKwkJCQl9CisKKwkJCQl3aGVuKHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHVVJBVElPTl9NQU5BR0VSX0FUVFIpKS50aGVuUmV0dXJuKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKwkJCX0KKwkJfSk7CisKKwkJcmV0dXJuIHJlc291cmNlQ29uZmlnOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Vc2VyQWRtaW5TZXJ2bGV0VGVzdC5qYXZhIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3NlcnZsZXRzL1VzZXJBZG1pblNlcnZsZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2OWYxMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9zZXJ2bGV0cy9Vc2VyQWRtaW5TZXJ2bGV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuc2VydmxldHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb1JldHVybjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5hdWRpdGluZy5pbXBsLkF1ZGl0aW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuVXNlclN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5Db21wb25lbnRzVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuaW1wbC5XZWJBcHBDb250ZXh0V3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnNlcnZsZXRzLlVzZXJBZG1pblNlcnZsZXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudXNlci5Vc2VyQnVzaW5lc3NMb2dpYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlJlc3BvbnNlRm9ybWF0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuV2ViQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFVzZXJBZG1pblNlcnZsZXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKwlmaW5hbCBzdGF0aWMgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBtb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7CisJZmluYWwgc3RhdGljIEh0dHBTZXNzaW9uIHNlc3Npb24gPSBtb2NrKEh0dHBTZXNzaW9uLmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBtb2NrKFNlcnZsZXRDb250ZXh0LmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgV2ViQXBwQ29udGV4dFdyYXBwZXIgd2ViQXBwQ29udGV4dFdyYXBwZXIgPSBtb2NrKFdlYkFwcENvbnRleHRXcmFwcGVyLmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgV2ViQXBwbGljYXRpb25Db250ZXh0IHdlYkFwcGxpY2F0aW9uQ29udGV4dCA9IG1vY2soV2ViQXBwbGljYXRpb25Db250ZXh0LmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgVXNlckJ1c2luZXNzTG9naWMgdXNlckFkbWluTWFuYWdlciA9IHNweShVc2VyQnVzaW5lc3NMb2dpYy5jbGFzcyk7CisJZmluYWwgc3RhdGljIEF1ZGl0aW5nTWFuYWdlciBhdWRpdGluZ01hbmFnZXIgPSBtb2NrKEF1ZGl0aW5nTWFuYWdlci5jbGFzcyk7CisJZmluYWwgc3RhdGljIENvbXBvbmVudHNVdGlscyBjb21wb25lbnRzVXRpbHMgPSBtb2NrKENvbXBvbmVudHNVdGlscy5jbGFzcyk7CisJZmluYWwgc3RhdGljIFJlc3BvbnNlRm9ybWF0IG9rUmVzcG9uc2VGb3JtYXQgPSBtb2NrKFJlc3BvbnNlRm9ybWF0LmNsYXNzKTsKKworCWZpbmFsIHN0YXRpYyBTdHJpbmcgQURNSU5fQVRUX1VJRCA9ICJqaDAwMDMiOworCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLWJlIik7CisKKwkJd2hlbihzZXNzaW9uLmdldFNlcnZsZXRDb250ZXh0KCkpLnRoZW5SZXR1cm4oc2VydmxldENvbnRleHQpOworCQl3aGVuKHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuV0VCX0FQUExJQ0FUSU9OX0NPTlRFWFRfV1JBUFBFUl9BVFRSKSkudGhlblJldHVybih3ZWJBcHBDb250ZXh0V3JhcHBlcik7CisJCXdoZW4od2ViQXBwQ29udGV4dFdyYXBwZXIuZ2V0V2ViQXBwQ29udGV4dChzZXJ2bGV0Q29udGV4dCkpLnRoZW5SZXR1cm4od2ViQXBwbGljYXRpb25Db250ZXh0KTsKKworCQl3aGVuKHdlYkFwcGxpY2F0aW9uQ29udGV4dC5nZXRCZWFuKFVzZXJCdXNpbmVzc0xvZ2ljLmNsYXNzKSkudGhlblJldHVybih1c2VyQWRtaW5NYW5hZ2VyKTsKKwkJd2hlbih3ZWJBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QmVhbihDb21wb25lbnRzVXRpbHMuY2xhc3MpKS50aGVuUmV0dXJuKGNvbXBvbmVudHNVdGlscyk7CisJCXdoZW4oY29tcG9uZW50c1V0aWxzLmdldEF1ZGl0aW5nTWFuYWdlcigpKS50aGVuUmV0dXJuKGF1ZGl0aW5nTWFuYWdlcik7CisJCXdoZW4oY29tcG9uZW50c1V0aWxzLmdldFJlc3BvbnNlRm9ybWF0KEFjdGlvblN0YXR1cy5PSykpLnRoZW5SZXR1cm4ob2tSZXNwb25zZUZvcm1hdCk7CisJCXdoZW4ob2tSZXNwb25zZUZvcm1hdC5nZXRTdGF0dXMoKSkudGhlblJldHVybihIdHRwU3RhdHVzLk9LLnZhbHVlKCkpOworCisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisJCXJlc2V0KHVzZXJBZG1pbk1hbmFnZXIpOworCQlkb1JldHVybihidWlsZEVpdGhlclVzZXIoQURNSU5fQVRUX1VJRCwgdHJ1ZSkpLndoZW4odXNlckFkbWluTWFuYWdlcikuZ2V0VXNlcihBRE1JTl9BVFRfVUlELCBmYWxzZSk7CisKKwkJcmVzZXQocmVxdWVzdCk7CisJCXdoZW4ocmVxdWVzdC5nZXRTZXNzaW9uKCkpLnRoZW5SZXR1cm4oc2Vzc2lvbik7CisJCXdoZW4ocmVxdWVzdC5nZXRIZWFkZXIoIlVTRVJfSUQiKSkudGhlblJldHVybihBRE1JTl9BVFRfVUlEKTsKKwl9CisKKwkvKgorCSAqIEBUZXN0IHB1YmxpYyB2b2lkIGRlYWN0aXZhdGVVc2VyU3VjY2Vzc2Z1bGx5VGVzdCgpeyBTdHJpbmcgdXNlclRvRGVsZXRlVXNlcklkID0gImFkbWluMSI7IFVzZXIgYWRtaW5Vc2VyID0gbmV3IFVzZXIoKTsgYWRtaW5Vc2VyLnNldFVzZXJJZChBRE1JTl9BVFRfVUlEKTsgRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyQWN0aXZlVXNlciA9IGJ1aWxkRWl0aGVyVXNlcih1c2VyVG9EZWxldGVVc2VySWQsIHRydWUpOworCSAqIFVzZXIgdXNlclRvRGVsZXRlID0gZWl0aGVyQWN0aXZlVXNlci5sZWZ0KCkudmFsdWUoKTsgZG9SZXR1cm4oZWl0aGVyQWN0aXZlVXNlcikud2hlbih1c2VyQWRtaW5NYW5hZ2VyKS5nZXRVc2VyKCB1c2VyVG9EZWxldGVVc2VySWQpOworCSAqIAorCSAqIEVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlckluYWN0aXZlVXNlciA9IGJ1aWxkRWl0aGVyVXNlcih1c2VyVG9EZWxldGVVc2VySWQsIGZhbHNlKTsgZG9SZXR1cm4oZWl0aGVySW5hY3RpdmVVc2VyKS53aGVuKHVzZXJBZG1pbk1hbmFnZXIpLmRlQWN0aXZhdGVVc2VyKCBhZG1pblVzZXIsIHVzZXJUb0RlbGV0ZS5nZXRVc2VySWQoKSk7CisJICogCisJICogCisJICogUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvdXNlci8iK3VzZXJUb0RlbGV0ZVVzZXJJZCkucmVxdWVzdCgpLmRlbGV0ZSgpOyBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFN0YXR1cygpID09IEh0dHBTdGF0dXMuT0sudmFsdWUoKSk7IHZlcmlmeSh1c2VyQWRtaW5NYW5hZ2VyLCB0aW1lcygxKSkuZGVBY3RpdmF0ZVVzZXIoYWRtaW5Vc2VyLCB1c2VyVG9EZWxldGUuZ2V0VXNlcklkKCkpOyB9CisJICogCisJICogCisJICogQFRlc3QgcHVibGljIHZvaWQgZm9yY2VEZWxldGVVc2VyU3VjY2Vzc2Z1bGx5VGVzdCgpeyBTdHJpbmcgdXNlclRvRGVsZXRlVXNlcklkID0gImFkbWluMSI7IHdoZW4ocmVxdWVzdC5nZXRIZWFkZXIoVXNlci5GT1JDRV9ERUxFVEVfSEVBREVSX0ZMQUcpKS50aGVuUmV0dXJuKFVzZXIuIEZPUkNFX0RFTEVURV9IRUFERVJfRkxBRyk7CisJICogCisJICogVXNlciBhZG1pblVzZXIgPSBuZXcgVXNlcigpOyBhZG1pblVzZXIuc2V0VXNlcklkKEFETUlOX0FUVF9VSUQpOworCSAqIAorCSAqIEVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlckFjdGl2ZVVzZXIgPSBidWlsZEVpdGhlclVzZXIodXNlclRvRGVsZXRlVXNlcklkLCB0cnVlKTsgVXNlciB1c2VyVG9EZWxldGUgPSBlaXRoZXJBY3RpdmVVc2VyLmxlZnQoKS52YWx1ZSgpOyBkb1JldHVybihlaXRoZXJBY3RpdmVVc2VyKS53aGVuKHVzZXJBZG1pbk1hbmFnZXIpLmdldFVzZXIoIHVzZXJUb0RlbGV0ZVVzZXJJZCk7CisJICogCisJICogRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyVXNlciA9IGJ1aWxkRWl0aGVyVXNlcih1c2VyVG9EZWxldGVVc2VySWQsIHRydWUpOyBkb1JldHVybihlaXRoZXJVc2VyKS53aGVuKHVzZXJBZG1pbk1hbmFnZXIpLmRlbGV0ZVVzZXIodXNlclRvRGVsZXRlLiBnZXRVc2VySWQoKSk7CisJICogCisJICogCisJICogUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvdjEvdXNlci8iK3VzZXJUb0RlbGV0ZVVzZXJJZCkucmVxdWVzdCgpLmRlbGV0ZSgpOyBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFN0YXR1cygpID09IEh0dHBTdGF0dXMuT0sudmFsdWUoKSk7IHZlcmlmeSh1c2VyQWRtaW5NYW5hZ2VyLCB0aW1lcygwKSkuZGVBY3RpdmF0ZVVzZXIoYWRtaW5Vc2VyLCB1c2VyVG9EZWxldGUuZ2V0VXNlcklkKCkpOworCSAqIHZlcmlmeSh1c2VyQWRtaW5NYW5hZ2VyLCB0aW1lcygxKSkuZGVsZXRlVXNlcih1c2VyVG9EZWxldGUuZ2V0VXNlcklkKCkpOyB9CisJICovCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworCisJCVJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFVzZXJBZG1pblNlcnZsZXQuY2xhc3MpOworCisJCXJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisJCQkJYmluZChyZXF1ZXN0KS50byhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCQkJfQorCQl9KTsKKworCQlyZXR1cm4gcmVzb3VyY2VDb25maWc7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gYnVpbGRFaXRoZXJVc2VyKFN0cmluZyB1c2VySWQsIGJvb2xlYW4gaXNBY3RpdmUpIHsKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQodXNlcklkKTsKKwkJdXNlci5zZXRSb2xlKFVzZXJSb2xlRW51bS5BRE1JTi5nZXROYW1lKCkpOworCQlpZiAoIWlzQWN0aXZlKSB7CisJCQl1c2VyLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5JTkFDVElWRSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHVzZXIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3VzZXIvVXNlckFkbWluTWFuYWdlclRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS91c2VyL1VzZXJBZG1pbk1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwMWI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS91c2VyL1VzZXJBZG1pbk1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVzZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55T2JqZWN0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnlTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLklVc2Vyc0RBTzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uaW1wbC5OZW80alVzZXJzREFPOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBVc2VyQWRtaW5NYW5hZ2VyVGVzdCB7CisKKwlmaW5hbCBJVXNlcnNEQU8gdXNlcnNEYW8gPSBNb2NraXRvLm1vY2soTmVvNGpVc2Vyc0RBTy5jbGFzcyk7CisJR3NvbiBnc29uOworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCQlFaXRoZXI8VXNlckRhdGEsIEFjdGlvblN0YXR1cz4gZWl0aGVyT2sgPSBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLk9LKTsKKwkJZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCXdoZW4odXNlcnNEYW8uZ2V0VXNlckRhdGEoYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKGVpdGhlck9rKTsKKwkJd2hlbih1c2Vyc0Rhby5zYXZlVXNlckRhdGEoKFVzZXJEYXRhKSBhbnlPYmplY3QoKSkpLnRoZW5SZXR1cm4oQWN0aW9uU3RhdHVzLk9LKTsKKwkJd2hlbih1c2Vyc0Rhby51cGRhdGVVc2VyRGF0YSgoVXNlckRhdGEpIGFueU9iamVjdCgpKSkudGhlblJldHVybihBY3Rpb25TdGF0dXMuT0spOworCQl3aGVuKHVzZXJzRGFvLmRlbGV0ZVVzZXJEYXRhKGFueVN0cmluZygpKSkudGhlblJldHVybihBY3Rpb25TdGF0dXMuT0spOworCX0KKworCS8vIEBUZXN0CisJLy8gcHVibGljIHZvaWQgdGVzdENyZWF0ZVVzZXIoKSB7CisJLy8gU3RyaW5nIGpzb24gPSAie1wiZmlyc3ROYW1lXCI6IFwiSmFtZXNcIixcImxhc3ROYW1lXCI6CisJLy8gXCJCcm93blwiLFwidXNlcklkXCI6IFwiamIxMjM0dVwiLFwiZW1haWxcIjoKKwkvLyBcImpiMTIzNHVAc2RjLmNvbVwiLFwicm9sZVwiOiBcIkFETUlOXCJ9IjsKKwkvLyBVc2VyRGF0YSB1c2VyID0gZ3Nvbi5mcm9tSnNvbihqc29uLCBVc2VyRGF0YS5jbGFzcyk7CisJLy8gRWl0aGVyPFVzZXJEYXRhLEFjdGlvblN0YXR1cz4gZWl0aGVyID0KKwkvLyBVc2VyQWRtaW5NYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlVXNlcih1c2VyKTsKKwkvLyBhc3NlcnRUcnVlKGVpdGhlci5pc1JpZ2h0KCkpOworCS8vIGFzc2VydEVxdWFscyhBY3Rpb25TdGF0dXMuT0ssIGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCS8vIH0KKwkvLworCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVXNlckludmFsaWRFbWFpbCgpIHsKKwkvLyBTdHJpbmcganNvbiA9ICJ7XCJmaXJzdE5hbWVcIjogXCJKYW1lc1wiLFwibGFzdE5hbWVcIjoKKwkvLyBcIkJyb3duXCIsXCJ1c2VySWRcIjogXCJqYjEyMzR1XCIsXCJlbWFpbFwiOiBcIkBzZGMuY29tXCIsXCJyb2xlXCI6CisJLy8gXCJBRE1JTlwifSI7CisJLy8gVXNlckRhdGEgdXNlciA9IGdzb24uZnJvbUpzb24oanNvbiwgVXNlckRhdGEuY2xhc3MpOworCS8vIEVpdGhlcjxVc2VyRGF0YSxBY3Rpb25TdGF0dXM+IGVpdGhlciA9CisJLy8gVXNlckFkbWluTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZVVzZXIodXNlcik7CisJLy8gYXNzZXJ0VHJ1ZShlaXRoZXIuaXNSaWdodCgpKTsKKwkvLyBhc3NlcnRFcXVhbHMoQWN0aW9uU3RhdHVzLklOVkFMSURfRU1BSUxfQUREUkVTUywgZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJLy8gfQorCS8vCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVXNlckludmFsaWRSb2xlKCkgeworCS8vIFN0cmluZyBqc29uID0gIntcImZpcnN0TmFtZVwiOiBcIkphbWVzXCIsXCJsYXN0TmFtZVwiOgorCS8vIFwiQnJvd25cIixcInVzZXJJZFwiOiBcImpiMTIzNHVcIixcImVtYWlsXCI6CisJLy8gXCJqYjEyMzR1QHNkYy5jb21cIixcInJvbGVcIjogXCJNSU5cIn0iOworCS8vIFVzZXJEYXRhIHVzZXIgPSBnc29uLmZyb21Kc29uKGpzb24sIFVzZXJEYXRhLmNsYXNzKTsKKwkvLyBFaXRoZXI8VXNlckRhdGEsQWN0aW9uU3RhdHVzPiBlaXRoZXIgPQorCS8vIFVzZXJBZG1pbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVVc2VyKHVzZXIpOworCS8vIGFzc2VydFRydWUoZWl0aGVyLmlzUmlnaHQoKSk7CisJLy8gYXNzZXJ0RXF1YWxzKEFjdGlvblN0YXR1cy5JTlZBTElEX0VNQUlMX0FERFJFU1MsIGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCS8vIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90cmFuc2FjdGlvbi9tbmdyL1NkbmNUcmFuc2FjdGlvblRlc3QuamF2YSBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9TZG5jVHJhbnNhY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NzAzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdHJhbnNhY3Rpb24vbW5nci9TZG5jVHJhbnNhY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24ubW5ncjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ucmVzZXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udGltZXM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLlJlc291cmNlVXBsb2FkU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsLkVTQ2F0YWxvZ0RBTzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkZTQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLklEQkFjdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlJvbGxiYWNrSGFuZGxlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLmFwaS5UcmFuc2FjdGlvblV0aWxzLkFjdGlvblR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5EQkFjdGlvbkNvZGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5EQlR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5FU0FjdGlvblR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5hcGkuVHJhbnNhY3Rpb25VdGlscy5Mb2dNZXNzYWdlczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuVHJhbnNhY3Rpb25Db2RlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udHJhbnNhY3Rpb24uYXBpLlRyYW5zYWN0aW9uVXRpbHMuVHJhbnNhY3Rpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50cmFuc2FjdGlvbi5tbmdyLkNvbW1pdE1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRyYW5zYWN0aW9uLm1uZ3IuVHJhbnNhY3Rpb25TZG5jSW1wbDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBTZG5jVHJhbnNhY3Rpb25UZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBFU0NhdGFsb2dEQU8gZXNDYXRhbG9nRGFvID0gTW9ja2l0by5tb2NrKEVTQ2F0YWxvZ0RBTy5jbGFzcyk7CisJcHJpdmF0ZSBzdGF0aWMgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbyA9IE1vY2tpdG8ubW9jayhUaXRhbkdlbmVyaWNEYW8uY2xhc3MpOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBNb2NraXRvLnNweShMb2dnZXIuY2xhc3MpOworCXByaXZhdGUgc3RhdGljIGludCB0cmFuc2FjdGlvbklkID0gMDsKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKKworCXB1YmxpYyBlbnVtIFRlc3RBY3Rpb24geworCQlUaXRhbkFjdGlvbiwgUm9sbGJhY2ssIEdlbmVyYWxBY3Rpb24KKwl9CisKKwlwdWJsaWMgZW51bSBUZXN0UmVzcG9uc2UgeworCQlUaXRhblJlc3BvbnNlU3VjY2VzcywgR2VuZXJhbFN1Y2Nlc3MKKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB7CisJCVRyYW5zYWN0aW9uU2RuY0ltcGwuc2V0TG9nKGxvZyk7CisJCUNvbW1pdE1hbmFnZXIuc2V0TG9nKGxvZyk7CisJCVJvbGxiYWNrSGFuZGxlci5zZXRMb2cobG9nKTsKKwkJU3RyaW5nIGFwcENvbmZpZ0RpciA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUiOworCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcgRlNDb25maWd1cmF0aW9uU291cmNlKEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VMaXN0ZW5lcigpLCBhcHBDb25maWdEaXIpOworCQljb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uU291cmNlKTsKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpIHsKKwkJcmVzZXQobG9nKTsKKwkJcmVzZXQoZXNDYXRhbG9nRGFvKTsKKwkJcmVzZXQodGl0YW5HZW5lcmljRGFvKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZva2VUaXRhbkFjdGlvbigpIHsKKwkJaW50IHRyYW5zYWN0aW9uSWQgPSBnZXROZXh0VHJhbnNhY3Rpb25JZCgpOworCQlUcmFuc2FjdGlvblNkbmNJbXBsIHR4ID0gbmV3IFRyYW5zYWN0aW9uU2RuY0ltcGwodHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QsIGVzQ2F0YWxvZ0RhbywgdGl0YW5HZW5lcmljRGFvKTsKKworCQlkb0Jhc2ljVGl0YW5BY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIGZhbHNlLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZSh0eC5nZXRTdGF0dXMoKSA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uT1BFTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52b2tlRVNBY3Rpb24oKSB7CisJCWludCB0cmFuc2FjdGlvbklkID0gZ2V0TmV4dFRyYW5zYWN0aW9uSWQoKTsKKwkJVHJhbnNhY3Rpb25TZG5jSW1wbCB0eCA9IG5ldyBUcmFuc2FjdGlvblNkbmNJbXBsKHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULCBlc0NhdGFsb2dEYW8sIHRpdGFuR2VuZXJpY0Rhbyk7CisKKwkJZG9FU0FkZEFydGlmYWN0QWN0aW9uKHRyYW5zYWN0aW9uSWQsIHR4LCB0cnVlLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZSh0eC5nZXRTdGF0dXMoKSA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uT1BFTik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0ZmluaXNoVHJhbnNhY3Rpb24oKSB7CisJCWludCB0cmFuc2FjdGlvbklkID0gZ2V0TmV4dFRyYW5zYWN0aW9uSWQoKTsKKwkJVHJhbnNhY3Rpb25TZG5jSW1wbCB0eCA9IG5ldyBUcmFuc2FjdGlvblNkbmNJbXBsKHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULCBlc0NhdGFsb2dEYW8sIHRpdGFuR2VuZXJpY0Rhbyk7CisJCWRvRmluaXNoVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIHRydWUpOworCQlhc3NlcnRUcnVlKHR4LmdldFN0YXR1cygpID09IFRyYW5zYWN0aW9uU3RhdHVzRW51bS5DTE9TRUQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZpbmlzaE9uQ2xvc2VkVHJhbnNhY3Rpb24oKSB7CisJCWludCB0cmFuc2FjdGlvbklkID0gZ2V0TmV4dFRyYW5zYWN0aW9uSWQoKTsKKwkJVHJhbnNhY3Rpb25TZG5jSW1wbCB0eCA9IG5ldyBUcmFuc2FjdGlvblNkbmNJbXBsKHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULCBlc0NhdGFsb2dEYW8sIHRpdGFuR2VuZXJpY0Rhbyk7CisJCWRvRmluaXNoVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIHRydWUpOworCisJCVRyYW5zYWN0aW9uQ29kZUVudW0gZmluaXNoVHJhbnNhY3Rpb24gPSB0eC5maW5pc2hUcmFuc2FjdGlvbigpOworCQlhc3NlcnRUcnVlKGZpbmlzaFRyYW5zYWN0aW9uID09IFRyYW5zYWN0aW9uQ29kZUVudW0uVFJBTlNBQ1RJT05fQ0xPU0VEKTsKKwkJLy8gdmVyaWZ5KGxvZykuZXJyb3IoTG9nTWVzc2FnZXMuQ09NTUlUX09OX0NMT1NFRF9UUkFOU0FDVElPTiwKKwkJLy8gdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25TdGF0dXNFbnVtLkNMT1NFRC5uYW1lKCksCisJCS8vIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJCXZlcmlmeShsb2cpLmluZm8oVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLkNPTU1JVF9PTl9DTE9TRURfVFJBTlNBQ1RJT04sIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uU3RhdHVzRW51bS5DTE9TRUQubmFtZSgpLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQlhc3NlcnRUcnVlKHR4LmdldFN0YXR1cygpID09IFRyYW5zYWN0aW9uU3RhdHVzRW51bS5DTE9TRUQpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FsbGluZ0xhc3RBY3Rpb25Ud2ljZSgpIHsKKwkJaW50IHRyYW5zYWN0aW9uSWQgPSBnZXROZXh0VHJhbnNhY3Rpb25JZCgpOworCQlUcmFuc2FjdGlvblNkbmNJbXBsIHR4ID0gbmV3IFRyYW5zYWN0aW9uU2RuY0ltcGwodHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QsIGVzQ2F0YWxvZ0RhbywgdGl0YW5HZW5lcmljRGFvKTsKKwkJZG9CYXNpY1RpdGFuQWN0aW9uKHRyYW5zYWN0aW9uSWQsIHR4LCB0cnVlLCB0cnVlKTsKKwkJRWl0aGVyPFRlc3RSZXNwb25zZSwgVHJhbnNhY3Rpb25Db2RlRW51bT4gZG9CYXNpY1RpdGFuQWN0aW9uID0gZG9CYXNpY1RpdGFuQWN0aW9uKHRyYW5zYWN0aW9uSWQsIHR4LCB0cnVlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoZG9CYXNpY1RpdGFuQWN0aW9uLmlzUmlnaHQoKSk7CisJCWFzc2VydFRydWUodHguZ2V0U3RhdHVzKCkgIT0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLk9QRU4pOworCQl2ZXJpZnkobG9nKS5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5ET1VCTEVfRklOSVNIX0ZMQUdfQUNUSU9OLCB0cmFuc2FjdGlvbklkLCBEQlR5cGVFbnVtLlRJVEFOLm5hbWUoKSwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJLy8gdmVyaWZ5KGxvZykuZXJyb3IoIExvZ01lc3NhZ2VzLkRPVUJMRV9GSU5JU0hfRkxBR19BQ1RJT04sCisJCS8vIHRyYW5zYWN0aW9uSWQsIERCVHlwZUVudW0uVElUQU4ubmFtZSgpLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsCisJCS8vIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFjdGlvbk9uQ2xvc2VkVHJhbnNhY3Rpb24oKSB7CisJCWludCB0cmFuc2FjdGlvbklkID0gZ2V0TmV4dFRyYW5zYWN0aW9uSWQoKTsKKwkJVHJhbnNhY3Rpb25TZG5jSW1wbCB0eCA9IG5ldyBUcmFuc2FjdGlvblNkbmNJbXBsKHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULCBlc0NhdGFsb2dEYW8sIHRpdGFuR2VuZXJpY0Rhbyk7CisJCWRvRmluaXNoVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIHRydWUpOworCisJCUVpdGhlcjxEQkFjdGlvbkNvZGVFbnVtLCBUcmFuc2FjdGlvbkNvZGVFbnVtPiBlaXRoZXJFU1Jlc3VsdCA9IHR4Lmludm9rZUVTQWN0aW9uKGZhbHNlLCBFU0FjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVCwgY3JlYXRlRHVtbXlBcnRpZmFjdERhdGEoKSk7CisJCWFzc2VydFRydWUoZWl0aGVyRVNSZXN1bHQuaXNSaWdodCgpKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJFU1Jlc3VsdC5yaWdodCgpLnZhbHVlKCkgPT0gVHJhbnNhY3Rpb25Db2RlRW51bS5UUkFOU0FDVElPTl9DTE9TRUQpOworCisJCUVpdGhlcjxPYmplY3QsIFRyYW5zYWN0aW9uQ29kZUVudW0+IGVpdGhlclRpdGFuUmVzdWx0ID0gdHguaW52b2tlVGl0YW5BY3Rpb24oZmFsc2UsIGNyZWF0ZUJhc2ljQWN0aW9uKFRlc3RBY3Rpb24uVGl0YW5BY3Rpb24sIFRlc3RSZXNwb25zZS5UaXRhblJlc3BvbnNlU3VjY2VzcykpOworCQlhc3NlcnRUcnVlKGVpdGhlclRpdGFuUmVzdWx0LmlzUmlnaHQoKSk7CisJCWFzc2VydFRydWUoZWl0aGVyVGl0YW5SZXN1bHQucmlnaHQoKS52YWx1ZSgpID09IFRyYW5zYWN0aW9uQ29kZUVudW0uVFJBTlNBQ1RJT05fQ0xPU0VEKTsKKworCQlFaXRoZXI8T2JqZWN0LCBUcmFuc2FjdGlvbkNvZGVFbnVtPiBlaXRoZXJHZW5lcmFsREJBY3Rpb24gPSB0eC5pbnZva2VHZW5lcmFsREJBY3Rpb24odHJ1ZSwgREJUeXBlRW51bS5USVRBTiwgY3JlYXRlQmFzaWNBY3Rpb24oVGVzdEFjdGlvbi5UaXRhbkFjdGlvbiwgVGVzdFJlc3BvbnNlLlRpdGFuUmVzcG9uc2VTdWNjZXNzKSwKKwkJCQljcmVhdGVCYXNpY0FjdGlvbihUZXN0QWN0aW9uLlJvbGxiYWNrLCBUZXN0UmVzcG9uc2UuVGl0YW5SZXNwb25zZVN1Y2Nlc3MpKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJHZW5lcmFsREJBY3Rpb24uaXNSaWdodCgpKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJHZW5lcmFsREJBY3Rpb24ucmlnaHQoKS52YWx1ZSgpID09IFRyYW5zYWN0aW9uQ29kZUVudW0uVFJBTlNBQ1RJT05fQ0xPU0VEKTsKKworCQlhc3NlcnRUcnVlKHR4LmdldFN0YXR1cygpID09IFRyYW5zYWN0aW9uU3RhdHVzRW51bS5DTE9TRUQpOworCQkvLyB2ZXJpZnkobG9nLCB0aW1lcygzKSkuZXJyb3IoTG9nTWVzc2FnZXMuQUNUSU9OX09OX0NMT1NFRF9UUkFOU0FDVElPTiwKKwkJLy8gdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLAorCQkvLyBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJdmVyaWZ5KGxvZywgdGltZXMoMykpLmluZm8oVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLkFDVElPTl9PTl9DTE9TRURfVFJBTlNBQ1RJT04sIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCYXNpY0hhcHB5U2NlbmFyaW8oKSB7CisJCWludCB0cmFuc2FjdGlvbklkID0gZ2V0TmV4dFRyYW5zYWN0aW9uSWQoKTsKKwkJVHJhbnNhY3Rpb25TZG5jSW1wbCB0eCA9IG5ldyBUcmFuc2FjdGlvblNkbmNJbXBsKHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULCBlc0NhdGFsb2dEYW8sIHRpdGFuR2VuZXJpY0Rhbyk7CisKKwkJZG9CYXNpY1RpdGFuQWN0aW9uKHRyYW5zYWN0aW9uSWQsIHR4LCBmYWxzZSwgdHJ1ZSk7CisJCWFzc2VydFRydWUodHguZ2V0U3RhdHVzKCkgPT0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLk9QRU4pOworCisJCWRvRVNBZGRBcnRpZmFjdEFjdGlvbih0cmFuc2FjdGlvbklkLCB0eCwgdHJ1ZSwgdHJ1ZSk7CisJCWFzc2VydFRydWUodHguZ2V0U3RhdHVzKCkgPT0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLk9QRU4pOworCisJCWRvRmluaXNoVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIHRydWUpOworCisJCWFzc2VydFRydWUodHguZ2V0U3RhdHVzKCkgPT0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLkNMT1NFRCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb2xsYmFja1N1Y2NlZWRlZE9uQWN0aW9uKCkgeworCQlpbnQgdHJhbnNhY3Rpb25JZCA9IGdldE5leHRUcmFuc2FjdGlvbklkKCk7CisJCVRyYW5zYWN0aW9uU2RuY0ltcGwgdHggPSBuZXcgVHJhbnNhY3Rpb25TZG5jSW1wbCh0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVCwgZXNDYXRhbG9nRGFvLCB0aXRhbkdlbmVyaWNEYW8pOworCQlkb0VTQWRkQXJ0aWZhY3RBY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIGZhbHNlLCB0cnVlKTsKKworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpKS50aGVuUmV0dXJuKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJU3RyaW5nIGNydXNoTWVzc2FnZSA9ICJEQiBDcnVzaCBTaW11bGF0aW9uIjsKKwkJRWl0aGVyPFRlc3RSZXNwb25zZSwgVHJhbnNhY3Rpb25Db2RlRW51bT4gZWl0aGVyVHJhbnNhY3Rpb25SZXN1bHQgPSB0eC5pbnZva2VUaXRhbkFjdGlvbihmYWxzZSwgY3JlYXRlQ3J1c2hpbmdBY3Rpb24oVGVzdEFjdGlvbi5UaXRhbkFjdGlvbiwgY3J1c2hNZXNzYWdlKSk7CisKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJUcmFuc2FjdGlvblJlc3VsdC5pc1JpZ2h0KCkpOworCQlhc3NlcnRUcnVlKGVpdGhlclRyYW5zYWN0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSA9PSBUcmFuc2FjdGlvbkNvZGVFbnVtLlJPTExCQUNLX1NVQ0NFU1MpOworCQlhc3NlcnRUcnVlKHR4LmdldFN0YXR1cygpID09IFRyYW5zYWN0aW9uU3RhdHVzRW51bS5DTE9TRUQpOworCQkvLyB2ZXJpZnkobG9nKS5lcnJvcihMb2dNZXNzYWdlcy5EQl9BQ1RJT05fRkFJTEVEX1dJVEhfRVhDRVBUSU9OLAorCQkvLyBEQlR5cGVFbnVtLlRJVEFOLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgY3J1c2hNZXNzYWdlLAorCQkvLyBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQl2ZXJpZnkobG9nKS5pbmZvKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5EQl9BQ1RJT05fRkFJTEVEX1dJVEhfRVhDRVBUSU9OLCBEQlR5cGVFbnVtLlRJVEFOLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgY3J1c2hNZXNzYWdlLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCisJCXZlcmlmeShsb2csIHRpbWVzKDEpKS5kZWJ1ZyhMb2dNZXNzYWdlcy5ST0xMQkFDS19QRVJTSVNURU5UX0FDVElPTiwgREJUeXBlRW51bS5FTEFTVElDX1NFQVJDSC5uYW1lKCksIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJCXZlcmlmeShsb2csIHRpbWVzKDEpKS5kZWJ1ZyhUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uRUxBU1RJQ19TRUFSQ0gubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCisJCXZlcmlmeShsb2csIHRpbWVzKDEpKS5kZWJ1ZyhMb2dNZXNzYWdlcy5ST0xMQkFDS19OT05fUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uVElUQU4ubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX05PTl9QRVJTSVNURU5UX0FDVElPTiwgREJUeXBlRW51bS5USVRBTi5uYW1lKCksIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisKKwkJdmVyaWZ5KGxvZykuaW5mbyhMb2dNZXNzYWdlcy5ST0xMQkFDS19TVUNDRUVERURfR0VORVJBTCwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJdmVyaWZ5KGxvZykuaW5mbyhUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuUk9MTEJBQ0tfU1VDQ0VFREVEX0dFTkVSQUwsIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Um9sbGJhY2tGYWlsZWRPbkFjdGlvbigpIHsKKwkJaW50IHRyYW5zYWN0aW9uSWQgPSBnZXROZXh0VHJhbnNhY3Rpb25JZCgpOworCQlUcmFuc2FjdGlvblNkbmNJbXBsIHR4ID0gbmV3IFRyYW5zYWN0aW9uU2RuY0ltcGwodHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QsIGVzQ2F0YWxvZ0RhbywgdGl0YW5HZW5lcmljRGFvKTsKKworCQlkb0VTQWRkQXJ0aWZhY3RBY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIGZhbHNlLCB0cnVlKTsKKworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpKS50aGVuUmV0dXJuKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9DT05ORUNURUQpOworCQlTdHJpbmcgY3J1c2hNZXNzYWdlID0gIkRCIENydXNoIFNpbXVsYXRpb24iOworCQlFaXRoZXI8VGVzdFJlc3BvbnNlLCBUcmFuc2FjdGlvbkNvZGVFbnVtPiBlaXRoZXJUcmFuc2FjdGlvblJlc3VsdCA9IHR4Lmludm9rZVRpdGFuQWN0aW9uKGZhbHNlLCBjcmVhdGVDcnVzaGluZ0FjdGlvbihUZXN0QWN0aW9uLlRpdGFuQWN0aW9uLCBjcnVzaE1lc3NhZ2UpKTsKKworCQlhc3NlcnRUcnVlKGVpdGhlclRyYW5zYWN0aW9uUmVzdWx0LmlzUmlnaHQoKSk7CisJCWFzc2VydFRydWUodHguZ2V0U3RhdHVzKCkgPT0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLkZBSUxFRF9ST0xMQkFDSyk7CisJCWFzc2VydFRydWUoZWl0aGVyVHJhbnNhY3Rpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpID09IFRyYW5zYWN0aW9uQ29kZUVudW0uUk9MTEJBQ0tfRkFJTEVEKTsKKwkJLy8gdmVyaWZ5KGxvZykuZXJyb3IoTG9nTWVzc2FnZXMuREJfQUNUSU9OX0ZBSUxFRF9XSVRIX0VYQ0VQVElPTiwKKwkJLy8gREJUeXBlRW51bS5USVRBTi5uYW1lKCksIHRyYW5zYWN0aW9uSWQsIGNydXNoTWVzc2FnZSwKKwkJLy8gVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJdmVyaWZ5KGxvZykuaW5mbyhUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuREJfQUNUSU9OX0ZBSUxFRF9XSVRIX0VYQ0VQVElPTiwgREJUeXBlRW51bS5USVRBTi5uYW1lKCksIHRyYW5zYWN0aW9uSWQsIGNydXNoTWVzc2FnZSwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uRUxBU1RJQ19TRUFSQ0gubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX1BFUlNJU1RFTlRfQUNUSU9OLCBEQlR5cGVFbnVtLkVMQVNUSUNfU0VBUkNILm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfTk9OX1BFUlNJU1RFTlRfQUNUSU9OLCBEQlR5cGVFbnVtLlRJVEFOLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJdmVyaWZ5KGxvZywgdGltZXMoMSkpLmRlYnVnKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5ST0xMQkFDS19OT05fUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uVElUQU4ubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCisJCS8vIHZlcmlmeShsb2csIHRpbWVzKDEpKS5lcnJvcihMb2dNZXNzYWdlcy5ST0xMQkFDS19GQUlMRURfR0VORVJBTCwKKwkJLy8gdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLAorCQkvLyBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJLy8gdmVyaWZ5KGxvZywgdGltZXMoMSkpLmVycm9yKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLAorCQkvLyBMb2dNZXNzYWdlcy5ST0xMQkFDS19GQUlMRURfR0VORVJBTCwgdHJhbnNhY3Rpb25JZCwKKwkJLy8gVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSb2xsYmFja1N1Y2NlZWRlZE9uQ29tbWl0KCkgeworCQlpbnQgdHJhbnNhY3Rpb25JZCA9IGdldE5leHRUcmFuc2FjdGlvbklkKCk7CisJCVRyYW5zYWN0aW9uU2RuY0ltcGwgdHggPSBuZXcgVHJhbnNhY3Rpb25TZG5jSW1wbCh0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVCwgZXNDYXRhbG9nRGFvLCB0aXRhbkdlbmVyaWNEYW8pOworCQlkb0VTQWRkQXJ0aWZhY3RBY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIGZhbHNlLCB0cnVlKTsKKwkJZG9CYXNpY1RpdGFuQWN0aW9uKHRyYW5zYWN0aW9uSWQsIHR4LCB0cnVlLCB0cnVlKTsKKworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5jb21taXQoKSkudGhlblJldHVybihUaXRhbk9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJd2hlbih0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKSkudGhlblJldHVybihUaXRhbk9wZXJhdGlvblN0YXR1cy5PSyk7CisJCS8vIGZpbmlzaFRyYW5zYWN0aW9uCisJCVRyYW5zYWN0aW9uQ29kZUVudW0gdHJhbnNhY3Rpb25Db2RlID0gdHguZmluaXNoVHJhbnNhY3Rpb24oKTsKKwkJYXNzZXJ0VHJ1ZSh0cmFuc2FjdGlvbkNvZGUgPT0gVHJhbnNhY3Rpb25Db2RlRW51bS5ST0xMQkFDS19TVUNDRVNTKTsKKwkJYXNzZXJ0VHJ1ZSh0eC5nZXRTdGF0dXMoKSA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uQ0xPU0VEKTsKKworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uRUxBU1RJQ19TRUFSQ0gubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX1BFUlNJU1RFTlRfQUNUSU9OLCBEQlR5cGVFbnVtLkVMQVNUSUNfU0VBUkNILm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfTk9OX1BFUlNJU1RFTlRfQUNUSU9OLCBEQlR5cGVFbnVtLlRJVEFOLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJdmVyaWZ5KGxvZywgdGltZXMoMSkpLmRlYnVnKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5ST0xMQkFDS19OT05fUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uVElUQU4ubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCisJCXZlcmlmeShsb2cpLmluZm8oTG9nTWVzc2FnZXMuUk9MTEJBQ0tfU1VDQ0VFREVEX0dFTkVSQUwsIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJCXZlcmlmeShsb2cpLmluZm8oVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX1NVQ0NFRURFRF9HRU5FUkFMLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJvbGxiYWNrRmFpbGVkT25Db21taXQoKSB7CisJCWludCB0cmFuc2FjdGlvbklkID0gZ2V0TmV4dFRyYW5zYWN0aW9uSWQoKTsKKwkJVHJhbnNhY3Rpb25TZG5jSW1wbCB0eCA9IG5ldyBUcmFuc2FjdGlvblNkbmNJbXBsKHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULCBlc0NhdGFsb2dEYW8sIHRpdGFuR2VuZXJpY0Rhbyk7CisJCWRvRVNBZGRBcnRpZmFjdEFjdGlvbih0cmFuc2FjdGlvbklkLCB0eCwgZmFsc2UsIHRydWUpOworCQlkb0Jhc2ljVGl0YW5BY3Rpb24odHJhbnNhY3Rpb25JZCwgdHgsIHRydWUsIHRydWUpOworCisJCXdoZW4odGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpKS50aGVuUmV0dXJuKFRpdGFuT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpKS50aGVuUmV0dXJuKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJU3RyaW5nIGVzRXJyb3IgPSAiTm8gQ29ubmVjdGlvbiB0byBFcyI7CisJCU1vY2tpdG8uZG9UaHJvdyhuZXcgUnVudGltZUV4Y2VwdGlvbihlc0Vycm9yKSkud2hlbihlc0NhdGFsb2dEYW8pLmRlbGV0ZUFydGlmYWN0KE1vY2tpdG8uYW55U3RyaW5nKCkpOworCQkvLyBmaW5pc2hUcmFuc2FjdGlvbgorCQlUcmFuc2FjdGlvbkNvZGVFbnVtIHRyYW5zYWN0aW9uQ29kZSA9IHR4LmZpbmlzaFRyYW5zYWN0aW9uKCk7CisJCWFzc2VydFRydWUodHJhbnNhY3Rpb25Db2RlID09IFRyYW5zYWN0aW9uQ29kZUVudW0uUk9MTEJBQ0tfRkFJTEVEKTsKKwkJYXNzZXJ0VHJ1ZSh0eC5nZXRTdGF0dXMoKSA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uRkFJTEVEX1JPTExCQUNLKTsKKworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uRUxBU1RJQ19TRUFSQ0gubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLlJPTExCQUNLX1BFUlNJU1RFTlRfQUNUSU9OLCBEQlR5cGVFbnVtLkVMQVNUSUNfU0VBUkNILm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKworCQl2ZXJpZnkobG9nLCB0aW1lcygxKSkuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfTk9OX1BFUlNJU1RFTlRfQUNUSU9OLCBEQlR5cGVFbnVtLlRJVEFOLm5hbWUoKSwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJdmVyaWZ5KGxvZywgdGltZXMoMSkpLmRlYnVnKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLCBMb2dNZXNzYWdlcy5ST0xMQkFDS19OT05fUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uVElUQU4ubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCisJCS8vIHZlcmlmeShsb2cpLmVycm9yKExvZ01lc3NhZ2VzLlJPTExCQUNLX0ZBSUxFRF9PTl9EQl9XSVRIX0VYQ0VQVElPTiwKKwkJLy8gdHJhbnNhY3Rpb25JZCwgREJUeXBlRW51bS5FTEFTVElDX1NFQVJDSC5uYW1lKCksIGVzRXJyb3IsCisJCS8vIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJCS8vIHZlcmlmeShsb2cpLmVycm9yKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLAorCQkvLyBMb2dNZXNzYWdlcy5ST0xMQkFDS19GQUlMRURfT05fREJfV0lUSF9FWENFUFRJT04sIHRyYW5zYWN0aW9uSWQsCisJCS8vIERCVHlwZUVudW0uRUxBU1RJQ19TRUFSQ0gubmFtZSgpLCBlc0Vycm9yLAorCQkvLyBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCisJCS8vIHZlcmlmeShsb2csIHRpbWVzKDEpKS5lcnJvcihMb2dNZXNzYWdlcy5ST0xMQkFDS19GQUlMRURfR0VORVJBTCwKKwkJLy8gdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLAorCQkvLyBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJLy8gdmVyaWZ5KGxvZywgdGltZXMoMSkpLmVycm9yKFRyYW5zYWN0aW9uVXRpbHMuVFJBTlNBQ1RJT05fTUFSS0VSLAorCQkvLyBMb2dNZXNzYWdlcy5ST0xMQkFDS19GQUlMRURfR0VORVJBTCwgdHJhbnNhY3Rpb25JZCwKKwkJLy8gVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZva2VHZW5lcmFsQWN0aW9uKCkgeworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpKS50aGVuUmV0dXJuKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJaW50IHRyYW5zYWN0aW9uSWQgPSBnZXROZXh0VHJhbnNhY3Rpb25JZCgpOworCQlUcmFuc2FjdGlvblNkbmNJbXBsIHR4ID0gbmV3IFRyYW5zYWN0aW9uU2RuY0ltcGwodHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QsIGVzQ2F0YWxvZ0RhbywgdGl0YW5HZW5lcmljRGFvKTsKKwkJSURCQWN0aW9uIGdlbmVyYWxBY3Rpb24gPSBjcmVhdGVCYXNpY0FjdGlvbihUZXN0QWN0aW9uLkdlbmVyYWxBY3Rpb24sIFRlc3RSZXNwb25zZS5HZW5lcmFsU3VjY2Vzcyk7CisJCUlEQkFjdGlvbiByb2xsYmFja0FjdGlvbiA9IGNyZWF0ZUJhc2ljQWN0aW9uKFRlc3RBY3Rpb24uUm9sbGJhY2ssIFRlc3RSZXNwb25zZS5HZW5lcmFsU3VjY2Vzcyk7CisJCVN0cmluZyBjcnVzaE1lc3NhZ2UgPSAiTm8gREIgQ29ubmVjdGlvbiI7CisJCUlEQkFjdGlvbiBjcnVzaGluZ0FjdGlvbiA9IGNyZWF0ZUNydXNoaW5nQWN0aW9uKFRlc3RBY3Rpb24uR2VuZXJhbEFjdGlvbiwgY3J1c2hNZXNzYWdlKTsKKworCQlFaXRoZXI8VGVzdFJlc3BvbnNlLCBUcmFuc2FjdGlvbkNvZGVFbnVtPiBlaXRoZXJSZXN1bHQgPSB0eC5pbnZva2VHZW5lcmFsREJBY3Rpb24oZmFsc2UsIERCVHlwZUVudW0uTVlTVEVSWSwgZ2VuZXJhbEFjdGlvbiwgcm9sbGJhY2tBY3Rpb24pOworCQlhc3NlcnRUcnVlKGVpdGhlclJlc3VsdC5pc0xlZnQoKSk7CisJCWFzc2VydFRydWUoZWl0aGVyUmVzdWx0LmxlZnQoKS52YWx1ZSgpID09IFRlc3RSZXNwb25zZS5HZW5lcmFsU3VjY2Vzcyk7CisJCWFzc2VydFRydWUodHguZ2V0U3RhdHVzKCkgPT0gVHJhbnNhY3Rpb25TdGF0dXNFbnVtLk9QRU4pOworCQllaXRoZXJSZXN1bHQgPSB0eC5pbnZva2VHZW5lcmFsREJBY3Rpb24oZmFsc2UsIERCVHlwZUVudW0uTVlTVEVSWSwgY3J1c2hpbmdBY3Rpb24sIHJvbGxiYWNrQWN0aW9uKTsKKworCQlhc3NlcnRUcnVlKGVpdGhlclJlc3VsdC5pc1JpZ2h0KCkpOworCQlhc3NlcnRUcnVlKGVpdGhlclJlc3VsdC5yaWdodCgpLnZhbHVlKCkgPT0gVHJhbnNhY3Rpb25Db2RlRW51bS5ST0xMQkFDS19TVUNDRVNTKTsKKwkJYXNzZXJ0VHJ1ZSh0eC5nZXRTdGF0dXMoKSA9PSBUcmFuc2FjdGlvblN0YXR1c0VudW0uQ0xPU0VEKTsKKworCQkvLyB2ZXJpZnkobG9nKS5lcnJvcihMb2dNZXNzYWdlcy5EQl9BQ1RJT05fRkFJTEVEX1dJVEhfRVhDRVBUSU9OLAorCQkvLyBEQlR5cGVFbnVtLk1ZU1RFUlkubmFtZSgpLCB0cmFuc2FjdGlvbklkLCBjcnVzaE1lc3NhZ2UsCisJCS8vIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJCXZlcmlmeShsb2cpLmluZm8oVHJhbnNhY3Rpb25VdGlscy5UUkFOU0FDVElPTl9NQVJLRVIsIExvZ01lc3NhZ2VzLkRCX0FDVElPTl9GQUlMRURfV0lUSF9FWENFUFRJT04sIERCVHlwZUVudW0uTVlTVEVSWS5uYW1lKCksIHRyYW5zYWN0aW9uSWQsIGNydXNoTWVzc2FnZSwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKworCQl2ZXJpZnkobG9nLCB0aW1lcygyKSkuZGVidWcoTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uTVlTVEVSWS5uYW1lKCksIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJCXZlcmlmeShsb2csIHRpbWVzKDIpKS5kZWJ1ZyhUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuUk9MTEJBQ0tfUEVSU0lTVEVOVF9BQ1RJT04sIERCVHlwZUVudW0uTVlTVEVSWS5uYW1lKCksIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisKKwkJdmVyaWZ5KGxvZykuaW5mbyhMb2dNZXNzYWdlcy5ST0xMQkFDS19TVUNDRUVERURfR0VORVJBTCwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJdmVyaWZ5KGxvZykuaW5mbyhUcmFuc2FjdGlvblV0aWxzLlRSQU5TQUNUSU9OX01BUktFUiwgTG9nTWVzc2FnZXMuUk9MTEJBQ0tfU1VDQ0VFREVEX0dFTkVSQUwsIHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxUZXN0UmVzcG9uc2UsIFRyYW5zYWN0aW9uQ29kZUVudW0+IGRvQmFzaWNUaXRhbkFjdGlvbihpbnQgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25TZG5jSW1wbCB0eCwgYm9vbGVhbiBpc0xhc3RBY3Rpb24sIGJvb2xlYW4gaXNWZXJpZnlBY3Rpb24pIHsKKwkJLy8gQWRkIFRpdGFuIEFjdGlvbgorCQlFaXRoZXI8VGVzdFJlc3BvbnNlLCBUcmFuc2FjdGlvbkNvZGVFbnVtPiBlaXRoZXJUaXRhblJlc3VsdCA9IHR4Lmludm9rZVRpdGFuQWN0aW9uKGlzTGFzdEFjdGlvbiwgY3JlYXRlQmFzaWNBY3Rpb24oVGVzdEFjdGlvbi5UaXRhbkFjdGlvbiwgVGVzdFJlc3BvbnNlLlRpdGFuUmVzcG9uc2VTdWNjZXNzKSk7CisJCWlmIChpc1ZlcmlmeUFjdGlvbikgeworCQkJLy8gQ2hlY2sgVGl0YW4gQWN0aW9uCisJCQlhc3NlcnRUcnVlKGVpdGhlclRpdGFuUmVzdWx0LmlzTGVmdCgpKTsKKwkJCWFzc2VydFRydWUoZWl0aGVyVGl0YW5SZXN1bHQubGVmdCgpLnZhbHVlKCkgPT0gVGVzdFJlc3BvbnNlLlRpdGFuUmVzcG9uc2VTdWNjZXNzKTsKKwkJCXZlcmlmeShsb2cpLmRlYnVnKFRlc3RBY3Rpb24uVGl0YW5BY3Rpb24ubmFtZSgpKTsKKwkJCXZlcmlmeShsb2cpLmRlYnVnKExvZ01lc3NhZ2VzLklOVk9LRV9BQ1RJT04sIHRyYW5zYWN0aW9uSWQsIERCVHlwZUVudW0uVElUQU4ubmFtZSgpLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQkJdmVyaWZ5Tm9FcnJvcnNJbkxvZygpOworCQkJdmVyaWZ5Tm9JbmZvSW5Mb2coKTsKKwkJfQorCQlyZXR1cm4gZWl0aGVyVGl0YW5SZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBUcmFuc2FjdGlvbkNvZGVFbnVtIGRvRmluaXNoVHJhbnNhY3Rpb24oaW50IHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uU2RuY0ltcGwgdHgsIGJvb2xlYW4gaXNWZXJpZnlBY3Rpb24pIHsKKwkJLy8gUHJlcmVxdWlzaXRlIGZpbmlzaFRyYW5zYWN0aW9uCisJCXdoZW4odGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpKS50aGVuUmV0dXJuKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJLy8gZmluaXNoVHJhbnNhY3Rpb24KKwkJVHJhbnNhY3Rpb25Db2RlRW51bSB0cmFuc2FjdGlvbkNvZGUgPSB0eC5maW5pc2hUcmFuc2FjdGlvbigpOworCQlpZiAoaXNWZXJpZnlBY3Rpb24pIHsKKwkJCS8vIENoZWNrIGZpbmlzaFRyYW5zYWN0aW9uCisJCQl2ZXJpZnkobG9nKS5kZWJ1ZyhMb2dNZXNzYWdlcy5DT01NSVRfQUNUSU9OX0FMTF9EQiwgdHJhbnNhY3Rpb25JZCwgVHJhbnNhY3Rpb25VdGlscy5EVU1NWV9VU0VSLCBBY3Rpb25UeXBlRW51bS5BRERfQVJUSUZBQ1QubmFtZSgpKTsKKwkJCXZlcmlmeShsb2cpLmRlYnVnKExvZ01lc3NhZ2VzLkNPTU1JVF9BQ1RJT05fU1BFQ0lGSUNfREIsIHRyYW5zYWN0aW9uSWQsIERCVHlwZUVudW0uVElUQU4ubmFtZSgpLCBUcmFuc2FjdGlvblV0aWxzLkRVTU1ZX1VTRVIsIEFjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVC5uYW1lKCkpOworCQkJYXNzZXJ0VHJ1ZSh0cmFuc2FjdGlvbkNvZGUgPT0gVHJhbnNhY3Rpb25Db2RlRW51bS5TVUNDRVNTKTsKKwkJfQorCQlyZXR1cm4gdHJhbnNhY3Rpb25Db2RlOworCX0KKworCXByaXZhdGUgdm9pZCBkb0VTQWRkQXJ0aWZhY3RBY3Rpb24oaW50IHRyYW5zYWN0aW9uSWQsIFRyYW5zYWN0aW9uU2RuY0ltcGwgdHgsIGJvb2xlYW4gaXNMYXN0QWN0aW9uLCBib29sZWFuIGlzVmVyaWZ5QWN0aW9uKSB7CisJCS8vIFByZXJlcXVpc2l0ZSBFUyBBY3Rpb24KKwkJRWl0aGVyPEVTQXJ0aWZhY3REYXRhLCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZWl0aGVyQmVmb3JlQWRkQXJ0aWZhY3QgPSBFaXRoZXIucmlnaHQoUmVzb3VyY2VVcGxvYWRTdGF0dXMuTk9UX0VYSVNUKTsKKwkJd2hlbihlc0NhdGFsb2dEYW8uZ2V0QXJ0aWZhY3QoTW9ja2l0by5hbnlTdHJpbmcoKSkpLnRoZW5SZXR1cm4oZWl0aGVyQmVmb3JlQWRkQXJ0aWZhY3QpOworCisJCS8vIEFkZCBFUyBBY3Rpb24KKwkJRWl0aGVyPERCQWN0aW9uQ29kZUVudW0sIFRyYW5zYWN0aW9uQ29kZUVudW0+IGVpdGhlckVzQWN0aW9uID0gdHguaW52b2tlRVNBY3Rpb24oaXNMYXN0QWN0aW9uLCBFU0FjdGlvblR5cGVFbnVtLkFERF9BUlRJRkFDVCwgY3JlYXRlRHVtbXlBcnRpZmFjdERhdGEoKSk7CisKKwkJaWYgKGlzVmVyaWZ5QWN0aW9uKSB7CisJCQkvLyBDaGVjayBUaXRhbiBBY3Rpb24KKwkJCWFzc2VydFRydWUoZWl0aGVyRXNBY3Rpb24uaXNMZWZ0KCkpOworCQkJYXNzZXJ0VHJ1ZShlaXRoZXJFc0FjdGlvbi5sZWZ0KCkudmFsdWUoKSA9PSBEQkFjdGlvbkNvZGVFbnVtLlNVQ0NFU1MpOworCQkJdmVyaWZ5KGxvZykuZGVidWcoTG9nTWVzc2FnZXMuSU5WT0tFX0FDVElPTiwgdHJhbnNhY3Rpb25JZCwgREJUeXBlRW51bS5FTEFTVElDX1NFQVJDSC5uYW1lKCksIFRyYW5zYWN0aW9uVXRpbHMuRFVNTVlfVVNFUiwgQWN0aW9uVHlwZUVudW0uQUREX0FSVElGQUNULm5hbWUoKSk7CisJCQl2ZXJpZnlOb0Vycm9yc0luTG9nKCk7CisJCQl2ZXJpZnlOb0luZm9JbkxvZygpOworCQl9CisJfQorCisJcHJpdmF0ZSBFU0FydGlmYWN0RGF0YSBjcmVhdGVEdW1teUFydGlmYWN0RGF0YSgpIHsKKwkJU3RyaW5nIHN0ckRhdGEgPSAicXdlcXdxd2VxdzM0ZTR3cndlciI7CisJCVN0cmluZyBteU5vZGVUeXBlID0gIk15TmV3Tm9kZVR5cGUiOworCQlFU0FydGlmYWN0RGF0YSBhckRhdGEgPSBuZXcgRVNBcnRpZmFjdERhdGEoImFydGlmYWN0TmV3TWFyaW5hMTEiLCBzdHJEYXRhLmdldEJ5dGVzKCkpOworCQlyZXR1cm4gYXJEYXRhOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlOb0Vycm9yc0luTG9nKCkgeworCQl2ZXJpZnkobG9nLCBNb2NraXRvLnRpbWVzKDApKS5lcnJvcihNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueShPYmplY3RbXS5jbGFzcykpOworCQl2ZXJpZnkobG9nLCBNb2NraXRvLnRpbWVzKDApKS5lcnJvcihNb2NraXRvLmFueVN0cmluZygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9JbmZvSW5Mb2coKSB7CisJCXZlcmlmeShsb2csIE1vY2tpdG8udGltZXMoMCkpLmluZm8oTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnkoT2JqZWN0W10uY2xhc3MpKTsKKwkJdmVyaWZ5KGxvZywgTW9ja2l0by50aW1lcygwKSkuaW5mbyhNb2NraXRvLmFueVN0cmluZygpKTsKKwl9CisKKwlwcml2YXRlIElEQkFjdGlvbiBjcmVhdGVCYXNpY0FjdGlvbihUZXN0QWN0aW9uIGFjdGlvbiwgVGVzdFJlc3BvbnNlIHJlc3ApIHsKKwkJZmluYWwgVGVzdEFjdGlvbiBmaW5hbEFjdGlvbiA9IGFjdGlvbjsKKwkJZmluYWwgVGVzdFJlc3BvbnNlIGZpbmFsUmVzcCA9IHJlc3A7CisJCXJldHVybiBuZXcgSURCQWN0aW9uKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgVGVzdFJlc3BvbnNlIGRvQWN0aW9uKCkgeworCQkJCWxvZy5kZWJ1ZyhmaW5hbEFjdGlvbi5uYW1lKCkpOworCQkJCXJldHVybiBmaW5hbFJlc3A7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBJREJBY3Rpb24gY3JlYXRlQ3J1c2hpbmdBY3Rpb24oVGVzdEFjdGlvbiBhY3Rpb24sIGZpbmFsIFN0cmluZyBjcnVzaE1lc3NhZ2UpIHsKKwkJZmluYWwgVGVzdEFjdGlvbiBmaW5hbEFjdGlvbiA9IGFjdGlvbjsKKwkJcmV0dXJuIG5ldyBJREJBY3Rpb24oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBUZXN0UmVzcG9uc2UgZG9BY3Rpb24oKSB7CisJCQkJbG9nLmRlYnVnKGZpbmFsQWN0aW9uLm5hbWUoKSk7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY3J1c2hNZXNzYWdlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwdWJsaWMgaW50IGdldE5leHRUcmFuc2FjdGlvbklkKCkgeworCQl0cmFuc2FjdGlvbklkKys7CisJCXJldHVybiB0cmFuc2FjdGlvbklkOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlL2NvbmZpZ3VyYXRpb24ueWFtbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlL2NvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQyMzcwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUvY29uZmlndXJhdGlvbi55YW1sCkBAIC0wLDAgKzEsNDI3IEBACitpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkczoKKyAgIC0gSFRUUF9JVl9VU0VSCisgICAtIEhUVFBfQ1NQX0ZJUlNUTkFNRQorICAgLSBIVFRQX0NTUF9MQVNUTkFNRQorICAgLSBIVFRQX0lWX1JFTU9URV9BRERSRVNTCisgICAtIEhUVFBfQ1NQX1dTVFlQRQorCisKKworIyBjYXRhbG9nIGJhY2tlbmQgaG9zdG5hbWUKK2JlRnFkbjogbG9jYWxob3N0CisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgcG9ydAorYmVIdHRwUG9ydDogODA4MAorCisjIGNhdGFsb2cgYmFja2VuZCBodHRwIGNvbnRleHQKK2JlQ29udGV4dDogL3NkYy9yZXN0L2NvbmZpZy9nZXQKKworIyBjYXRhbG9nIGJhY2tlbmQgcHJvdG9jb2wKK2JlUHJvdG9jb2w6IGh0dHAKKworIyBjYXRhbG9nIGJhY2tlbmQgc3NsIHBvcnQKK2JlU3NsUG9ydDogODQ0MworCit2ZXJzaW9uOiAxLjAKK3JlbGVhc2VkOiAyMDEyLTExLTMwCisKK3RpdGFuQ2ZnRmlsZTogL2hvbWUvdmFncmFudC9jYXRhbG9nLWJlL2NvbmZpZy9jYXRhbG9nLWJlL3RpdGFuLnByb3BlcnRpZXMKK3RpdGFuSW5NZW1vcnlHcmFwaDogdHJ1ZQordGl0YW5Mb2NrVGltZW91dDogNjAwCit0aXRhblJlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOiAzCit0aXRhbkhlYWx0aENoZWNrUmVhZFRpbWVvdXQ6IDEKK2VzUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM6IDMKK3VlYkhlYWx0aENoZWNrUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM6IDE1Cit1ZWJIZWFsdGhDaGVja1JlYWRUaW1lb3V0OiA0CisKKyMgUHJvdG9jb2xzCitwcm90b2NvbHM6CisgICAtIGh0dHAKKyAgIC0gaHR0cHMKKworIyBVc2VycwordXNlcnM6CisgICAgdG9tOiBwYXNzd2QKKyAgICBib2I6IHBhc3N3ZAorICAgIAorbmVvNGo6CisgICAgaG9zdDogbmVvNGpob3N0CisgICAgcG9ydDogNzQ3NAorICAgIHVzZXI6IG5lbzRqCisgICAgcGFzc3dvcmQ6ICIxMjM0NSIKKyAgICAKKworI0FwcGxpY2F0aW9uLXNwZWNpZmljIHNldHRpbmdzIG9mIEVTCitlbGFzdGljU2VhcmNoOgorICAgICMgTWFwcGluZyBvZiBpbmRleCBwcmVmaXggdG8gdGltZS1iYXNlZCBmcmFtZS4gRm9yIGV4YW1wbGUsIGlmIGJlbG93IGlzIGNvbmZpZ3VyZWQ6CisgICAgIworICAgICMgLSBpbmRleFByZWZpeDogYXVkaXRpbmdldmVudHMKKyAgICAjICAgIGNyZWF0aW9uUGVyaW9kOiBtaW51dGUKKyAgICAjCisgICAgIyB0aGVuIEVTIG9iamVjdCBvZiB0eXBlIHdoaWNoIGlzIG1hcHBlZCB0byAiYXVkaXRpbmdldmVudHMtKiIgdGVtcGxhdGUsIGFuZCBjcmVhdGVkIG9uIDIwMTUtMTItMjMgMTM6MjQ6NTQsIHdpbGwgZW50ZXIgImF1ZGl0aW5nZXZlbnRzLTIwMTUtMTItMjMtMTMtMjQiIGluZGV4LgorICAgICMgQW5vdGhlciBvYmplY3QgY3JlYXRlZCBvbiAyMDE1LTEyLTIzIDEzOjI1OjU0LCB3aWxsIGVudGVyICJhdWRpdGluZ2V2ZW50cy0yMDE1LTEyLTIzLTEzLTI1IiBpbmRleC4KKyAgICAjIElmIGNyZWF0aW9uUGVyaW9kOiBtb250aCwgYm90aCBvZiB0aGUgYWJvdmUgd2lsbCBlbnRlciAiYXVkaXRpbmdldmVudHMtMjAxNS0xMiIgaW5kZXguCisgICAgIworICAgICMgUExFQVNFIE5PVEU6IHRoZSB0aW1lc3RhbXBzIGFyZSBjcmVhdGVkIGluIFVUQy9HTVQgdGltZXpvbmUhIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgdGltZXN0YW1wcyB3aWxsIGJlIGNvcnJlY3RseSBwcmVzZW50ZWQgaW4gS2liYW5hLgorICAgICMKKyAgICAjIExlZ2FsIHZhbHVlcyBmb3IgY3JlYXRpb25QZXJpb2QgLSB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIG5vbmUgKG1lYW5pbmcgbm8gdGltZS1iYXNlZCBiZWhhdmlvdXIpLgorICAgICMKKyAgICAjIElmIG5vIGNyZWF0aW9uUGVyaW9kIGlzIGNvbmZpZ3VyZWQgZm9yIGluZGV4UHJlZml4LCBkZWZhdWx0IGJlaGF2b3VyIGlzIGNyZWF0aW9uUGVyaW9kOiBtb250aC4KKworICAgIGluZGljZXNUaW1lRnJlcXVlbmN5OgorICAgICAgLSBpbmRleFByZWZpeDogYXVkaXRpbmdldmVudHMKKyAgICAgICAgY3JlYXRpb25QZXJpb2Q6IG1vbnRoCisgICAgICAtIGluZGV4UHJlZml4OiBtb25pdG9yaW5nX2V2ZW50cworICAgICAgICBjcmVhdGlvblBlcmlvZDogbW9udGgKKworYXJ0aWZhY3RUeXBlczoKKyAgIC0gQ0hFRgorICAgLSBQVVBQRVQKKyAgIC0gU0hFTEwKKyAgIC0gWUFORworICAgLSBZQU5HX1hNTAorICAgLSBIRUFUCisgICAtIEJQRUwKKyAgIC0gREdfWE1MCisgICAtIE1VUkFOT19QS0cKKyAgIC0gV09SS0ZMT1cKKyAgIC0gTkVUV09SS19DQUxMX0ZMT1cKKyAgIC0gVE9TQ0FfVEVNUExBVEUKKyAgIC0gVE9TQ0FfQ1NBUgorICAgLSBBQUlfU0VSVklDRV9NT0RFTAorICAgLSBBQUlfVkZfTU9ERUwKKyAgIC0gQUFJX1ZGX01PRFVMRV9NT0RFTAorICAgLSBBQUlfVkZfSU5TVEFOQ0VfTU9ERUwKKyAgIC0gT1RIRVIKKworbGljZW5zZVR5cGVzOgorICAgLSBVc2VyCisgICAtIEluc3RhbGxhdGlvbgorICAgLSBDUFUKKworI0RlcGxveW1lbnQgYXJ0aWZhY3RzIHBsYWNlSG9sZGVyCityZXNvdXJjZVR5cGVzOiAmYWxsUmVzb3VyY2VUeXBlcworICAtIFZGQworICAtIENQCisgIC0gVkwKKyAgLSBWRgorIAorIyB2YWxpZEZvclJlc291cmNlVHlwZXMgdXNhZ2UKKyMgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyMgICAgICAgIC0gVkYKKyMgICAgICAgIC0gVkwKK2RlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0czoKKyMgIGhlYXQ6CisjICAgICAgZGlzcGxheU5hbWU6ICJCYXNlIEhFQVQgVGVtcGxhdGUiCisjICAgICAgdHlwZTogSEVBVAorIyAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyMgIGhlYXRWb2w6CisjICAgICAgZGlzcGxheU5hbWU6ICJWb2x1bWUgSEVBVCBUZW1wbGF0ZSIKKyMgICAgICB0eXBlOiBIRUFUX1ZPTAorIyAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyMgIGhlYXROZXQ6CisjICAgICAgZGlzcGxheU5hbWU6ICJOZXR3b3JrIEhFQVQgVGVtcGxhdGUiCisjICAgICAgdHlwZTogSEVBVF9ORVQKKyMgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgIAorZGVwbG95bWVudFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHM6CisgIGhlYXRFbnY6CisgICAgICBkaXNwbGF5TmFtZTogIkhFQVQgRU5WIgorICAgICAgdHlwZTogSEVBVF9FTlYKKyAgICAgIGRlc2NyaXB0aW9uOiAiQXV0by1nZW5lcmF0ZWQgSEVBVCBFbnZpcm9ubWVudCBkZXBsb3ltZW50IGFydGlmYWN0IgorICAgICAgZmlsZUV4dGVuc2lvbjogImVudiIKKyAgICAgIAorI3Rvc2NhIGFydGlmYWN0cyBwbGFjZWhvbGRlcnMKK3Rvc2NhQXJ0aWZhY3RzOgorICBhc3NldFRvc2NhVGVtcGxhdGU6CisgICAgICBhcnRpZmFjdE5hbWU6IC10ZW1wbGF0ZS55bWwKKyAgICAgIGRpc3BsYXlOYW1lOiBUb3NjYSBUZW1wbGF0ZQorICAgICAgdHlwZTogVE9TQ0FfVEVNUExBVEUKKyAgICAgIGRlc2NyaXB0aW9uOiBUT1NDQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXNzZXQKKyAgYXNzZXRUb3NjYUNzYXI6CisgICAgICBhcnRpZmFjdE5hbWU6IC1jc2FyLmNzYXIKKyAgICAgIGRpc3BsYXlOYW1lOiBUb3NjYSBNb2RlbAorICAgICAgdHlwZTogVE9TQ0FfQ1NBUgorICAgICAgZGVzY3JpcHRpb246IFRPU0NBIGRlZmluaXRpb24gcGFja2FnZSBvZiB0aGUgYXNzZXQKKworI0luZm9ybWF0aW9uYWwgYXJ0aWZhY3RzIHBsYWNlSG9sZGVyCitleGNsdWRlUmVzb3VyY2VDYXRlZ29yeToKKyAgLSBHZW5lcmljCitpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHM6CisgIGZlYXR1cmVzOgorICAgICAgZGlzcGxheU5hbWU6IEZlYXR1cmVzCisgICAgICB0eXBlOiBPVEhFUgorICBjYXBhY2l0eToKKyAgICAgIGRpc3BsYXlOYW1lOiBDYXBhY2l0eQorICAgICAgdHlwZTogT1RIRVIKKyAgdmVuZG9yVGVzdFJlc3VsdDoKKyAgICAgIGRpc3BsYXlOYW1lOiBWZW5kb3IgVGVzdCBSZXN1bHQKKyAgICAgIHR5cGU6IE9USEVSCisgIHRlc3RTY3JpcHRzOgorICAgICAgZGlzcGxheU5hbWU6IFRlc3QgU2NyaXB0cworICAgICAgdHlwZTogT1RIRVIKKyAgY2xvdWRRdWVzdGlvbm5haXJlOgorICAgICAgZGlzcGxheU5hbWU6IENsb3VkIFF1ZXN0aW9ubmFpcmUgKGNvbXBsZXRlZCkKKyAgICAgIHR5cGU6IE9USEVSCisgIEhFQVRUZW1wbGF0ZUZyb21WZW5kb3I6CisgICAgICBkaXNwbGF5TmFtZTogSEVBVCBUZW1wbGF0ZSBmcm9tIFZlbmRvcgorICAgICAgdHlwZTogSEVBVAorICByZXNvdXJjZVNlY3VyaXR5VGVtcGxhdGU6CisgICAgICBkaXNwbGF5TmFtZTogUmVzb3VyY2UgU2VjdXJpdHkgVGVtcGxhdGUKKyAgICAgIHR5cGU6IE9USEVSCisgICAgICAgICAgICAKK2V4Y2x1ZGVTZXJ2aWNlQ2F0ZWdvcnk6CisKK2luZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzOgorICBzZXJ2aWNlQXJ0aWZhY3RQbGFuOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2UgQXJ0aWZhY3QgUGxhbgorICAgICAgdHlwZTogT1RIRVIKKyAgc3VtbWFyeU9mSW1wYWN0c1RvRUNPTVBFbGVtZW50czoKKyAgICAgIGRpc3BsYXlOYW1lOiBTdW1tYXJ5IG9mIGltcGFjdHMgdG8gRUNPTVAgZWxlbWVudHMsT1NTcywgQlNTcworICAgICAgdHlwZTogT1RIRVIKKyAgY29udHJvbExvb3BGdW5jdGlvbnM6CisgICAgICBkaXNwbGF5TmFtZTogQ29udHJvbCBMb29wIEZ1bmN0aW9ucworICAgICAgdHlwZTogT1RIRVIKKyAgZGltZW5zaW9uaW5nSW5mbzoKKyAgICAgIGRpc3BsYXlOYW1lOiBEaW1lbnNpb25pbmcgSW5mbworICAgICAgdHlwZTogT1RIRVIKKyAgYWZmaW5pdHlSdWxlczoKKyAgICAgIGRpc3BsYXlOYW1lOiBBZmZpbml0eSBSdWxlcworICAgICAgdHlwZTogT1RIRVIKKyAgb3BlcmF0aW9uYWxQb2xpY2llczoKKyAgICAgIGRpc3BsYXlOYW1lOiBPcGVyYXRpb25hbCBQb2xpY2llcworICAgICAgdHlwZTogT1RIRVIKKyAgc2VydmljZVNwZWNpZmljUG9saWNpZXM6CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZS1zcGVjaWZpYyBQb2xpY2llcworICAgICAgdHlwZTogT1RIRVIKKyAgZW5naW5lZXJpbmdSdWxlczoKKyAgICAgIGRpc3BsYXlOYW1lOiBFbmdpbmVlcmluZyBSdWxlcyAoRVJEKQorICAgICAgdHlwZTogT1RIRVIKKyAgZGlzdHJpYnV0aW9uSW5zdHJ1Y3Rpb25zOgorICAgICAgZGlzcGxheU5hbWU6IERpc3RyaWJ1dGlvbiBJbnN0cnVjdGlvbnMKKyAgICAgIHR5cGU6IE9USEVSCisgIGNlcnRpZmljYXRpb25UZXN0UmVzdWx0czoKKyAgICAgIGRpc3BsYXlOYW1lOiBURCBDZXJ0aWZpY2F0aW9uIFRlc3QgUmVzdWx0cworICAgICAgdHlwZTogT1RIRVIKKyAgZGVwbG95bWVudFZvdGluZ1JlY29yZDoKKyAgICAgIGRpc3BsYXlOYW1lOiBEZXBsb3ltZW50IFZvdGluZyBSZWNvcmQKKyAgICAgIHR5cGU6IE9USEVSCisgIHNlcnZpY2VRdWVzdGlvbm5haXJlOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2UgUXVlc3Rpb25uYWlyZQorICAgICAgdHlwZTogT1RIRVIKKyAgc2VydmljZVNlY3VyaXR5VGVtcGxhdGU6CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZSBTZWN1cml0eSBUZW1wbGF0ZQorICAgICAgdHlwZTogT1RIRVIKKyAgICAgIAorc2VydmljZUFwaUFydGlmYWN0czoKKyAgY29uZmlndXJhdGlvbjoKKyAgICAgIGRpc3BsYXlOYW1lOiBDb25maWd1cmF0aW9uCisgICAgICB0eXBlOiBPVEhFUgorICBpbnN0YW50aWF0aW9uOgorICAgICAgZGlzcGxheU5hbWU6IEluc3RhbnRpYXRpb24KKyAgICAgIHR5cGU6IE9USEVSCisgIG1vbml0b3Jpbmc6CisgICAgICBkaXNwbGF5TmFtZTogTW9uaXRvcmluZworICAgICAgdHlwZTogT1RIRVIKKyAgcmVwb3J0aW5nOgorICAgICAgZGlzcGxheU5hbWU6IFJlcG9ydGluZworICAgICAgdHlwZTogT1RIRVIKKyAgbG9nZ2luZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBMb2dnaW5nCisgICAgICB0eXBlOiBPVEhFUgorICB0ZXN0aW5nOgorICAgICAgZGlzcGxheU5hbWU6IFRlc3RpbmcKKyAgICAgIHR5cGU6IE9USEVSCisKKworYWRkaXRpb25hbEluZm9ybWF0aW9uTWF4TnVtYmVyT2ZLZXlzOiA1MAorCitzeXN0ZW1Nb25pdG9yaW5nOgorICAgIGVuYWJsZWQ6IGZhbHNlCisgICAgaXNQcm94eTogZmFsc2UKKyAgICBwcm9iZUludGVydmFsSW5TZWNvbmRzOiAxNQorCitkZWZhdWx0SGVhdEFydGlmYWN0VGltZW91dE1pbnV0ZXM6IDYwCisKK3NlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3RzOgorICAgIFlBTkdfWE1MOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBWTkZfQ0FUQUxPRzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEU6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIE1PREVMX1FVRVJZX1NQRUM6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIEFBSV9TRVJWSUNFX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBBQUlfVkZfTU9EVUxFX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBBQUlfVkZfSU5TVEFOQ0VfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbCAKKyAgICBPVEhFUjoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKworcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzOgorICAgIEhFQVQ6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHlhbWwKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBIRUFUX1ZPTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEhFQVRfTkVTVEVEOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5YW1sCisgICAgICAgICAgICAtIHltbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgSEVBVF9BUlRJRkFDVDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEhFQVRfTkVUOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5YW1sCisgICAgICAgICAgICAtIHltbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgWUFOR19YTUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgVk5GX0NBVEFMT0c6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgVkZfTElDRU5TRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBWRU5ET1JfTElDRU5TRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBNT0RFTF9JTlZFTlRPUllfUFJPRklMRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBNT0RFTF9RVUVSWV9TUEVDOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEFQUENfQ09ORklHOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisgICAgQUFJX1ZGX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIEFBSV9WRl9NT0RVTEVfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisgICAgT1RIRVI6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKworcmVzb3VyY2VJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdHM6CisgICAgSEVBVF9FTlY6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIGVudgorICAgIFZGX01PRFVMRVNfTUVUQURBVEE6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIGpzb24KKworcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHM6CisKKworcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydDoKKyAgICAgQ1A6CisgICAgICAgLSB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorCitjYXBhYmlsaXRpZXNUb0NvbnN1bWVCZWZvcmVDZXJ0OgorICAgICAgICAgICAgCit1bkxvZ2dlZFVybHM6CisgICAtIC9zZGMyL3Jlc3QvaGVhbHRoQ2hlY2sKKworY2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbjoKKyAgICBjbGVhbkludGVydmFsSW5NaW51dGVzOiAxNDQwCisgICAgY29tcG9uZW50c1RvQ2xlYW46CisgICAgICAgLSBSZXNvdXJjZQorICAgICAgIC0gU2VydmljZQorCithcnRpZmFjdHNJbmRleDogcmVzb3VyY2VzCisKK2Nhc3NhbmRyYUNvbmZpZzoKKyAgICBjYXNzYW5kcmFIb3N0czogWydsb2NhbGhvc3QnXQorICAgIGxvY2FsRGF0YUNlbnRlcjoKKyAgICByZWNvbm5lY3RUaW1lb3V0IDogMzAwMDAKKyAgICBhdXRoZW50aWNhdGU6IGZhbHNlCisgICAgdXNlcm5hbWU6IGtva28KKyAgICBwYXNzd29yZDogYm9ibworICAgIHNzbDogZmFsc2UKKyAgICB0cnVzdHN0b3JlUGF0aCA6IC9wYXRoL3BhdGgKKyAgICB0cnVzdHN0b3JlUGFzc3dvcmQgOiAxMjMxMjMKKyAgICBrZXlTcGFjZXM6CisgICAgICAgIC0geyBuYW1lOiBzZGNhdWRpdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgIC0geyBuYW1lOiBzZGNhcnRpZmFjdCwgcmVwbGljYXRpb25TdHJhdGVneTogU2ltcGxlU3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWycxJ119CisgICAgICAgCitzd2l0Y2hvdmVyRGV0ZWN0b3I6CisgICAgZ0JlRnFkbjogCisgICAgZ0ZlRnFkbjogCisgICAgYmVWaXA6IDEuMi4zLjQKKyAgICBmZVZpcDogMS4yLjMuNAorICAgIGJlUmVzb2x2ZUF0dGVtcHRzOiAzCisgICAgZmVSZXNvbHZlQXR0ZW1wdHM6IDMKKyAgICBlbmFibGVkOiBmYWxzZQorICAgIGludGVydmFsOiA2MAorICAgIGNoYW5nZVByaW9yaXR5VXNlcjogZWNvbXBhc2RjCisgICAgY2hhbmdlUHJpb3JpdHlQYXNzd29yZDogZWNvbXBhc2RjMTIzCisgICAgcHVibGlzaE5ldHdvcmtVcmw6ICJodHRwOi8vY29yYS53ZWIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy91cGRhdGVfbmV0d29yaz91c2VyPXJvb3QiCisgICAgcHVibGlzaE5ldHdvcmtCb2R5OiAneyJub3RlIjoicHVibGlzaCBuZXR3b3JrIn0nCisgICAgZ3JvdXBzOgorICAgICAgYmVTZXQ6IHsgY2hhbmdlUHJpb3JpdHlVcmw6ICJodHRwOi8vY29yYS53ZWIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tQkUuZWNvbXAuaWRucy5jaXA/dXNlcj1yb290IiwKKyAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5Qm9keTogJ3sibmFtZSI6IkFJTy1CRS5lY29tcC5pZG5zLmNpcCIsInVyaSI6Ii9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL3NpdGVzL0FJTy1CRS5lY29tcC5pZG5zLmNpcCIsIm5vX2FkX3JlZGlyZWN0aW9uIjpmYWxzZSwidjRncm91cHMiOnsiZmFpbG92ZXJfZ3JvdXBzIjpbIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9tZ19iZSIsIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9ic19iZSJdLCJmYWlsb3Zlcl9wb2xpY3kiOlsiRkFJTEFMTCJdfSwiY29tbWVudCI6IkFJTyBCRSBHLWZxZG4iLCJpbnRlbmRlZF9hcHBfcHJvdG8iOiJETlMifSd9CisgICAgICBmZVNldDogeyBjaGFuZ2VQcmlvcml0eVVybDogImh0dHA6Ly9jb3JhLndlYi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL3NpdGVzL0FJTy1GRS5lY29tcC5pZG5zLmNpcD91c2VyPXJvb3QiLAorICAgICAgICAgICAgICAgY2hhbmdlUHJpb3JpdHlCb2R5OiAneyJjb21tZW50IjoiQUlPIEctZnFkbiIsIm5hbWUiOiJBSU8tRkUuZWNvbXAuaWRucy5jaXAiLCJ2NGdyb3VwcyI6eyJmYWlsb3Zlcl9ncm91cHMiOlsiL2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvZ3JvdXBzL2dyb3VwX21nX2ZlIiwiL2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvZ3JvdXBzL2dyb3VwX2JzX2ZlIl0sImZhaWxvdmVyX3BvbGljeSI6WyJGQUlMQUxMIl19LCJub19hZF9yZWRpcmVjdGlvbiI6ZmFsc2UsImludGVuZGVkX2FwcF9wcm90byI6IkROUyIsInVyaSI6Ii9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL3NpdGVzL0FJTy1GRS5lY29tcC5pZG5zLmNpcCJ9J30KKyAgICAKKyAgICAgICAKK2hlYXRFbnZBcnRpZmFjdEhlYWRlcjoKKyAgICAiIgoraGVhdEVudkFydGlmYWN0Rm9vdGVyOgorICAgICIiCisKK29uYm9hcmRpbmc6CisgICAgcHJvdG9jb2w6IGh0dHAKKyAgICBob3N0OiBsb2NhbGhvc3QKKyAgICBwb3J0OiA4MDgwCisgICAgZG93bmxvYWRDc2FyVXJpOiAiL29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLXNvZnR3YXJlLXByb2R1Y3RzL3BhY2thZ2VzIgorCithcHBsaWNhdGlvbkwxQ2FjaGU6CisgICAgZGF0YXR5cGVzOgorICAgICAgICBlbmFibGVkOiB0cnVlCisgICAgICAgIGZpcnN0UnVuRGVsYXk6IDEwCisgICAgICAgIHBvbGxJbnRlcnZhbEluU2VjOiA2MAorCithcHBsaWNhdGlvbkwyQ2FjaGU6CisgICAgZW5hYmxlZDogZmFsc2UKKyAgICBjYXRhbG9nTDFDYWNoZToKKyAgICAgICAgZW5hYmxlZDogdHJ1ZQorICAgICAgICByZXNvdXJjZXNTaXplSW5DYWNoZTogMzAwCisgICAgICAgIHNlcnZpY2VzU2l6ZUluQ2FjaGU6IDIwMAorICAgICAgICBwcm9kdWN0c1NpemVJbkNhY2hlOiAxMDAKKyAgICBxdWV1ZToKKyAgICAgICAgc3luY0ludGVydmFsSW5TZWNvbmRlczogNjAKKyAgICAgICAgd2FpdE9uU2h1dERvd25Jbk1pbnV0ZXM6IDMwCisgICAgICAgIG51bWJlck9mQ2FjaGVXb3JrZXJzOiA0CisgICAgICAgIApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUvZGlzdHJpYnV0aW9uLWVuZ2luZS1jb25maWd1cmF0aW9uLnlhbWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZS9kaXN0cmlidXRpb24tZW5naW5lLWNvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRlYTdmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUvZGlzdHJpYnV0aW9uLWVuZ2luZS1jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSw0MyBAQAordWViU2VydmVyczoKKyAgIC0gdWVic2I5MWtjZGMuaXQuYXR0LmNvbTozOTA0CisgICAtIHVlYnNiOTJrY2RjLml0LmF0dC5jb206MzkwNAorIyAgIC0gdWVic2I5M2tjZGMuaXQuYXR0LmNvbTozOTA0CisKK3VlYlB1YmxpY0tleTogOEYzTURBdE1TQnd3cFNNeQorCit1ZWJTZWNyZXRLZXk6IGd6Rm1zVHhTQ3RPNVJRZkFjY002UHFxWAorCitkaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZTogQVNEQy1ESVNUUi1OT1RJRi1UT1BJQworZGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lOiBBU0RDLURJU1RSLVNUQVRVUy1UT1BJQworCitpbml0UmV0cnlJbnRlcnZhbFNlYzogNQoraW5pdE1heEludGVydmFsU2VjOiA2MAorCitkaXN0cmliTm90aWZTZXJ2aWNlQXJ0aWZhY3RUeXBlczoKKyAgaW5mbzoKKyAgICAgIC0gTVVSQU5PLVBLRworCitkaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXM6CisgIGxpZmVjeWNsZToKKyAgICAgIC0gSEVBVAorICAgICAgLSBERy1YTUwKKworZW52aXJvbm1lbnRzOgorICAgLSBQUk9ECisKK2Rpc3RyaWJ1dGlvblN0YXR1c1RvcGljOgorICAgcG9sbGluZ0ludGVydmFsU2VjOiA2MAorICAgZmV0Y2hUaW1lU2VjOiAxNQorICAgY29uc3VtZXJHcm91cDogYXNkYworICAgY29uc3VtZXJJZDogYXNkYy1pZAorCitkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYzoKKyAgIG1pblRocmVhZFBvb2xTaXplOiAwCisgICBtYXhUaHJlYWRQb29sU2l6ZTogMTAKKyAgIG1heFdhaXRpbmdBZnRlclNlbmRpbmdTZWNvbmRzOiA1CisKK2NyZWF0ZVRvcGljOgorICAgcGFydGl0aW9uQ291bnQ6IDEKKyAgIHJlcGxpY2F0aW9uQ291bnQ6IDEKKworc3RhcnREaXN0cmlidXRpb25FbmdpbmU6IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZS9lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZS9lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3Y2Q3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlL2Vjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDM4MyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3RlIHRoZSBjb252ZW50aW9ucyBvZiB0aGUgZmllbGQgdmFsdWVzOgorIyB0eXBlIGNhbiBiZSBvbmUgb2Y6IENPTkZJR19FUlJPUiwgU1lTVEVNX0VSUk9SLCBEQVRBX0VSUk9SLCBDT05ORUNUSU9OX1BST0JMRU0sIEFVVEhFTlRJQ0FUSU9OX1BST0JMRU0KKyMgc2V2ZXJpdHkgY2FuIGJlIG9uZSBvZjogV0FSTiwgRVJST1IsIEZBVEFMCisjIGFsYXJtU2V2ZXJpdHkgY2FuIGJlIG9uZSBvZjogQ1JJVElDQUwsTUFKT1IsTUlOT1IsSU5GT1JNQVRJT05BTCxOT05FCisjIGNvZGUgaXMgYSB1bmlxdWUgaW50ZWdlciBpbiByYW5nZSBvZiAzMDAzLTk5OTkgKDMwMDAtMzAwMiBhcmUgb2NjdXBpZWQgZm9yIGludGVybmFsIHVzYWdlKQorIyBUaGUgYWJvdmUgZW51bWVyYXRpb24gdmFsdWVzIGFyZSBvdXQtb2YtdGhlLWJveCBhbmQgY2FuIGJlIGNoYW5nZWQgaW4gY29kZS4gCisjIEluIGNhc2Ugb2YgY29uZmlnIGFuZCBjb2RlIG1pc21hdGNoLCB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igd2lsbCBiZSBwcmludGVkIHRvIGxvZworIworIyMgUmFuZ2Ugb2YgQkUgY29kZXMgLSAzMDEwLTc5OTkKKworZXJyb3JzOgorCisgICAgQmVSZXN0QXBpR2VuZXJhbEVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDAwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgQkUgUkVTVCBBUEkgZXhlY3V0aW9uIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisKKyAgICBCZUhlYWx0aENoZWNrRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBkdXJpbmcgQkUgSGVhbHRoIENoZWNrIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVJbml0aWFsaXphdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE5LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ2F0YWxvZy1CRSB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisKKyAgICBCZVJlc291cmNlTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDExLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiTWFuZGF0b3J5IHJlc291cmNlICVzIGNhbm5vdCBiZSBmb3VuZCBpbiByZXBvc2l0b3J5IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVTZXJ2aWNlTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDEyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiTWFuZGF0b3J5IHNlcnZpY2UgJXMgY2Fubm90IGJlIGZvdW5kIGluIHJlcG9zaXRvcnkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZEFkZGluZ1Jlc291cmNlSW5zdGFuY2VFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxMywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBhZGQgcmVzb3VyY2UgaW5zdGFuY2Ugb2YgcmVzb3VyY2UgJXMgdG8gc2VydmljZSAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlSW5jb3JyZWN0U2VydmljZUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDE0LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiU2VydmljZSAlcyBpcyBub3QgdmFsaWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAgCisgICAgQmVSZXBvc2l0b3J5RGVsZXRlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTUsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZGVsZXRlIG9iamVjdCAlcyBmcm9tIHJlcG9zaXRvcnkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZVJlcG9zaXRvcnlRdWVyeUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDE2LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGZldGNoIGZyb20gcmVwb3NpdG9yeSAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBDT05GSUdfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxNywKKyAgICAgICAgc2V2ZXJpdHk6IEZBVEFMLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICVzIGlzIGludmFsaWQuIFZhbHVlIGNvbmZpZ3VyZWQgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgIAorICAgIEJlVWViQ29ubmVjdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTk5FQ1RJT05fUFJPQkxFTSwKKyAgICAgICAgY29kZTogQVNEQ180MDAxLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29ubmVjdGlvbiBwcm9ibGVtIHRvd2FyZHMgVS1FQiBzZXJ2ZXIuIFJlYXNvbjogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVlYlN5c3RlbUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDE5LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igb2NjdXJlZCBkdXJpbmcgYWNjZXNzIHRvIFUtRUIgU2VydmVyLiBPcGVyYXRpb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVZWJPYmplY3ROb3RGb3VuZEVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwNSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIG9jY3VyZWQgZHVyaW5nIGFjY2VzcyB0byBVLUVCIFNlcnZlci4gRGF0YSBub3QgZm91bmQ6ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisKKyAgICBCZURpc3RyaWJ1dGlvbkVuZ2luZVN5c3RlbUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDIxLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igb2NjdXJlZCBpbiBEaXN0cmlidXRpb24gRW5naW5lLiBGYWlsZWQgb3BlcmF0aW9uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVWViQXV0aGVudGljYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBBVVRIRU5USUNBVElPTl9QUk9CTEVNLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDMsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJBdXRoZW50aWNhdGlvbiBwcm9ibGVtIHRvd2FyZHMgVS1FQiBzZXJ2ZXIuIFJlYXNvbjogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVlYlVua293bkhvc3RFcnJvcjogeworICAgICAgICB0eXBlOiBDT05ORUNUSU9OX1BST0JMRU0sCisgICAgICAgIGNvZGU6IEFTRENfNDAwMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbm5lY3Rpb24gcHJvYmxlbSB0b3dhcmRzIFUtRUIgc2VydmVyLiBDYW5ub3QgcmVhY2ggaG9zdCAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRGlzdHJpYnV0aW9uRW5naW5lSW52YWxpZEFydGlmYWN0VHlwZTogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDYsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSBhcnRpZmFjdCB0eXBlICVzIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgbGlzdCBvZiB2YWxpZCBhcnRpZmFjdHMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUludmFsaWRUeXBlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDA4LAorICAgICAgICBzZXZlcml0eTogV0FSTiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJUaGUgdHlwZSAlcyBvZiAlcyBpcyBpbnZhbGlkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgQmVJbnZhbGlkVmFsdWVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMjgsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSB2YWx1ZSAlcyBvZiAlcyBmcm9tIHR5cGUgJXMgaXMgaW52YWxpZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfSAKKyAgICAKKyAgICBCZUZhaWxlZERlbGV0aW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDI5LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGRlbGV0ZSByZXNvdXJjZSBpbnN0YW5jZSAlcyBmcm9tIHNlcnZpY2UgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZU1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09ORklHX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMzAsCisgICAgICAgIHNldmVyaXR5OiBGQVRBTCwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlciAlcyBpcyBtaXNzaW5nIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVDb25maWd1cmF0aW9uSW52YWxpZExpc3RTaXplRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09ORklHX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMzEsCisgICAgICAgIHNldmVyaXR5OiBGQVRBTCwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlciAlcyBpcyBpbnZhbGlkLiBBdCBsZWFzdCAlcyB2YWx1ZXMgc2hhbGwgYmUgY29uZmlndXJlZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEVycm9yQ29uZmlnRmlsZUZvcm1hdDogeworICAgICAgICB0eXBlOiBDT05GSUdfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAzMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIGVsZW1lbnQgbm90IGZvdW5kIGluIFlBTUwgbmFtZTogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZU1pc3NpbmdBcnRpZmFjdEluZm9ybWF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDEwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQXJ0aWZhY3QgdXBsb2FkZWQgaGFzIG1pc3NpbmcgaW5mb3JtYXRpb24uIE1pc3NpbmcgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUFydGlmYWN0TWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkFydGlmYWN0ICVzIHJlcXVlc3RlZCBpcyBub3QgZm91bmQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUFydGlmYWN0UGF5bG9hZEludmFsaWQ6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDEyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiUGF5bG9hZCBvZiBhcnRpZmFjdCB1cGxvYWRlZCBpcyBpbnZhbGlkIChpbnZhbGlkIE1ENSBvciBlbmNyeXB0aW9uKSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVXNlck1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJVc2VyICVzIHJlcXVlc3RlZCBpcyBub3QgZm91bmQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUFydGlmYWN0SW5mb3JtYXRpb25JbnZhbGlkRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDEzLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiSW5wdXQgZm9yIGFydGlmYWN0IG1ldGFkYXRhIGlzIGludmFsaWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUZhaWxlZEFkZGluZ0NhcGFiaWxpdHlUeXBlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIGFkZGluZyBjYXBhYmlsaXR5IHR5cGUiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUNhcGFiaWxpdHlUeXBlTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxNiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNhcGFiaWxpdHkgVHlwZSAlcyBub3QgZm91bmQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUludGVyZmFjZU1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMjAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJJbnRlcmZhY2UgJXMgcmVxdWlyZWQgaXMgbWlzc2luZyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRGFvU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTQsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJPcGVyYXRpb24gdG93YXJkcyBkYXRhYmFzZSBmYWlsZWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZVN5c3RlbUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE3LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgb3BlcmF0aW9uIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDcsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBsb2NrIG9iamVjdCBmb3IgdXBkYXRlIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVJbnZhbGlkSnNvbklucHV0OiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE4LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGNvbnZlcnQganNvbiBpbnB1dCB0byBvYmplY3QiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZURpc3RyaWJ1dGlvbk1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMjEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJEaXN0cmlidXRpb24gJXMgcmVxdWlyZWQgaXMgbWlzc2luZyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlSGVhbHRoQ2hlY2tSZWNvdmVyeTogeworICAgICAgICB0eXBlOiBSRUNPVkVSWSwKKyAgICAgICAgY29kZTogQVNEQ180MDIyLAorICAgICAgICBzZXZlcml0eTogSU5GTywKKyAgICAgICAgZGVzY3JpcHRpb246ICJCRSBIZWFsdGggQ2hlY2sgUmVjb3ZlcnkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBJTkZPUk1BVElPTkFMCisgICAgfQorICAgIEJlRmFpbGVkQ3JlYXRlTm9kZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwMCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBjcmVhdGUgbm9kZSAlcyBvbiBncmFwaC4gc3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDAxLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIHVwZGF0ZSBub2RlICVzIG9uIGdyYXBoLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZERlbGV0ZU5vZGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZGVsZXRlIG5vZGUgJXMgb24gZ3JhcGguIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkUmV0cmlldmVOb2RlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDAzLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIHJldHJpZXZlIG5vZGUgJXMgZnJvbSBncmFwaC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVFeGVjdXRlUm9sbGJhY2tFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDQsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkRmluZFBhcmVudEVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwNSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBmaW5kIHBhcmVudCBub2RlICVzIG9uIGdyYXBoLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZEZpbmRBbGxOb2Rlc0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwNiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBmZXRjaCBhbGwgbm9kZXMgd2l0aCB0eXBlICVzIG9mIHBhcmVudCBub2RlICVzIC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRGaW5kQXNzb2NpYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDcsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDYW5ub3QgZmluZCBub2RlIHdpdGggdHlwZSAlcyBhc3NvY2lhdGVkIHdpdGggbm9kZSAlcyAuIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkRmluZEFzc29jaWF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA4LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ2Fubm90IGZpbmQgbm9kZSB3aXRoIHR5cGUgJXMgYXNzb2NpYXRlZCB3aXRoIG5vZGUgJXMgLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUNvbXBvbmVudENsZWFuZXJTeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIG9jY3VyZWQgaW4gQ29tcG9uZW50IENsZWFuZXIgVGFzay4gRmFpbGVkIG9wZXJhdGlvbjogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZS9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZS9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliNDRkOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWJlL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDE1ODMgQEAKK++7vyMgRXJyb3JzCitlcnJvcnM6CisgICAgT0s6IHsKKyAgICAgICAgY29kZTogMjAwLAorICAgICAgICBtZXNzYWdlOiAiT0siCisgICAgfQorICAgIENSRUFURUQ6IHsKKyAgICAgICAgY29kZTogMjAxLAorICAgICAgICBtZXNzYWdlOiAiT0siCisgICAgfQorICAgIE5PX0NPTlRFTlQ6IHsKKyAgICAgICAgY29kZTogMjA0LAorICAgICAgICBtZXNzYWdlOiAiTm8gQ29udGVudCIKKyAgICB9CisjLS0tLS0tLS1QT0w0MDUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIE5PVF9BTExPV0VEOiB7CisgICAgICAgIGNvZGU6IDQwNSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNZXRob2Qgbm90IGFsbG93ZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNDA1MCIKKyAgICB9CisjLS0tLS0tLS1QT0w1MDAwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIEdFTkVSQUxfRVJST1I6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludGVybmFsIFNlcnZlciBFcnJvci4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w1MDAwIgorICAgIH0KKyMtLS0tLS0tLS1QT0w1MDAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBNSVNTSU5HX1hfRUNPTVBfSU5TVEFOQ0VfSUQ6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyAnWC1FQ09NUC1JbnN0YW5jZUlEJyBIVFRQIGhlYWRlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w1MDAxIgorICAgIH0KKyMtLS0tLS0tLS1QT0w1MDAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBBVVRIX1JFUVVJUkVEOiB7CisgICAgICAgIGNvZGU6IDQwMSAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgQVBJLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDUwMDIiCisgICAgfQorIy0tLS0tLS0tLVBPTDUwMDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIEFVVEhfRkFJTEVEOiB7CisgICAgICAgIGNvZGU6IDQwMyAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgQVBJLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDUwMDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX0NPTlRFTlQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTU0lOR19JTkZPUk1BVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBpbmZvcm1hdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDAyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgVVNFUl9JRCAgICAgCisgICAgVVNFUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIGVtYWlsIGFkZHJlc3MgICAgIAorICAgIElOVkFMSURfRU1BSUxfQUREUkVTUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBlbWFpbCBhZGRyZXNzICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSByb2xlCisgICAgSU5WQUxJRF9ST0xFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHJvbGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFVzZXJzJ3MgVVNFUl9JRCAgICAgCisgICAgVVNFUl9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIHdpdGggJyUxJyBJRCBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIERFTEVURV9VU0VSX0FETUlOX0NPTkZMSUNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBbiBhZG1pbmlzdHJhdG9yIGNhbiBvbmx5IGJlIGRlbGV0ZWQgYnkgYW5vdGhlciBhZG1pbmlzdHJhdG9yLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDciCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIHVzZXJJZCAgICAgCisgICAgSU5WQUxJRF9VU0VSX0lEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHVzZXJJZCAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9NSVNTSU5HX0NPTlRBQ1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyAlMSBjb250YWN0IGlkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNDkiCisgICAgfSAKKyMtLS0tLS0tLS1TVkM0MDUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZS9BZGRpdGlvbmFsIHBhcmFtZXRlcgorIyAlMiAtIHNlcnZpY2UvcmVzb3VyY2UvbGFiZWwgbmFtZQorICAgIENPTVBPTkVOVF9OQU1FX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIHdpdGggbmFtZSAnJTInIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gcmVzb3VyY2Uvc2VydmljZSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19DQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTEiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19UQUdTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEF0IGxlYXN0IG9uZSB0YWcgaGFzIHRvIGJlIHNwZWNpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDUyIgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9NSVNTSU5HX0RFU0NSSVBUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgJTEgZGVzY3JpcHRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gcmVzb3VyY2Uvc2VydmljZQorICAgIENPTVBPTkVOVF9JTlZBTElEX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEludmFsaWQgJTEgY2F0ZWdvcnkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX1ZFTkRPUl9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgdmVuZG9yIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX1ZFTkRPUl9SRUxFQVNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgdmVuZG9yIHJlbGVhc2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1NiIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDU3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBNSVNTSU5HX0RFUklWRURfRlJPTV9URU1QTEFURTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIGRlcml2ZWQgZnJvbSB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTciCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX01JU1NJTkdfSUNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGljb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1OCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA1OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgQ09NUE9ORU5UX0lOVkFMSURfSUNPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBJbnZhbGlkICUxIGljb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgUEFSRU5UX1JFU09VUkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBEZXJpdmVkIGZyb20gcmVzb3VyY2UgdGVtcGxhdGUgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDYwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDYxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBNVUxUSVBMRV9QQVJFTlRfUkVTT1VSQ0VfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTXVsdGlwbGUgZGVyaXZlZCBmcm9tIHJlc291cmNlIHRlbXBsYXRlIGlzIG5vdCBhbGxvd2VkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjEiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA2Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBzZXJ2aWNlL3Jlc291cmNlCisgICAgTUlTU0lOR19DT01QT05FTlRfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgIyUxwqAgLcKgIHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyAgICBSRVNPVVJDRV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHJlc291cmNlIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MyIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDY0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyAgICBDT01QT05FTlRfSU5WQUxJRF9ERVNDUklQVElPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBkZXNjcmlwdGlvbiBjb250YWlucyBub24tZW5nbGlzaCBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorIyAlMiAtIG1heCByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgbGVuZ3RoIAorICAgIENPTVBPTkVOVF9ERVNDUklQVElPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIGRlc2NyaXB0aW9uIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDY2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIG1heCBsZW5ndGggICAKKyAgICBDT01QT05FTlRfVEFHU19FWENFRURfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGFncyBvdmVyYWxsIGxlbmd0aCBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIG1heCBsZW5ndGggIAorICAgIFZFTkRPUl9OQU1FX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVmVuZG9yIG5hbWUgZXhjZWVkcyBsaW1pdCBvZiAlMSBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtYXggbGVuZ3RoICAKKyAgICBWRU5ET1JfUkVMRUFTRV9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciByZWxlYXNlIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY4IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZS9Qcm9kdWN0CisgICAgQ09NUE9ORU5UX0lOVkFMSURfQ09OVEFDVF9JRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBjb250YWN0IGlkIHNob3VsZCBiZSBpbiBmb3JtYXQgJ21ubm5ubm4nIG9yICdhYW5ubmEnIG9yICdhYW5ubm4nLCB3aGVyZSBtPW0gLGE9YS16QS1aIGFuZCBuPTAtOSIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorICAgIElOVkFMSURfQ09NUE9ORU5UX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgbmFtZSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGNoYXJhY3RlcnMgbGlrZSA8PjoiXC98PyogYW5kIHNwYWNlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiByZWd1bGFyIHNwYWNlLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNzAiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA3MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1ZFTkRPUl9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciBuYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA3Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1ZFTkRPUl9SRUxFQVNFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciByZWxlYXNlIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA3My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gbWF4ICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgIAorICAgIENPTVBPTkVOVF9OQU1FX0VYQ0VFRFNfTElNSVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgbmFtZSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA3MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA4MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0lOX0NIRUNLT1VUX1NUQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiBpcyBsb2NrZWQgZm9yIG1vZGlmaWNhdGlvbiBieSAlMyAlNCglNSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA4MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfSU5fQ0VSVF9JTl9QUk9HUkVTU19TVEFURTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgbG9ja2VkIGZvciBjZXJ0aWZpY2F0aW9uIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgxIgorICAgIH0KKworIy0tLS0tLS0tLS0tU1ZDNDA4Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX1NFTlRfRk9SX0NFUlRJRklDQVRJT046IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIHNlbnQgZm9yIGNlcnRpZmljYXRpb24gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENPTVBPTkVOVF9WRVJTSU9OX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZlcnNpb24gb2YgdGhpcyAlMSB3YXMgYWxyZWFkeSBwcm9tb3RlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgzIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdMKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlL3Byb2R1Y3QKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0FMUkVBRFlfQ0hFQ0tFRF9JTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiAnJTEnICUyIHdhcyBhbHJlYWR5IGNoZWNrZWQtaW4gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfQ0hFQ0tPVVRfQllfQU5PVEhFUl9VU0VSOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSAlMiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgb3V0IGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg1IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoCAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAgLSByZXNvdXJjZS9zZXJ2aWNlCisgICAgQ09NUE9ORU5UX0lOX1VTRTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgaW4gdXNlIGJ5IGFub3RoZXIgdXNlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg2IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC0gY29tcG9uZW50wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorICAgIENPTVBPTkVOVF9IQVNfTkVXRVJfVkVSU0lPTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQ2hlY2tpbmcgb3V0IG9mIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBvZiB0aGUgJyUxJyAlMiBpcyBub3QgYWxsb3dlZCBhcyBhIG5ld2VyIHZlcnNpb24gZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODciCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEwqBvZsKgbGFzdCBtb2RpZmllcgorICAgIENPTVBPTkVOVF9BTFJFQURZX0NFUlRJRklFRDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICUxICUyIGhhcyBhbHJlYWR5IGJlZW4gY2VydGlmaWVkIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorICAgIENPTVBPTkVOVF9OT1RfUkVBRFlfRk9SX0NFUlRJRklDQVRJT046IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBQUk9QRVJUWV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHByb3BlcnR5IHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoHByb3BlcnR5wqBuYW1lCisgICAgUFJPUEVSVFlfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUHJvcGVydHkgd2l0aCAnJTEnIG5hbWUgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMSIKKyAgICB9CisKKyMtLS0tLS0tLS0tLVNWQzQxMDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoGNhcGFiaWxpdHkgdHlwZSBuYW1lIAorICAgIENBUEFCSUxJVFlfVFlQRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBDYXBhYmlsaXR5IFR5cGUgd2l0aCBuYW1lICclMScgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTE0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQVVUSF9GQUlMRURfSU5WQUxJREVfSEVBREVSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIEF1dGhvcml6YXRpb24gaGVhZGVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgY2FwYWJpbGl0eSB0eXBlIG5hbWUgCisgICAgTUlTU0lOR19DQVBBQklMSVRZX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBDYXBhYmlsaXR5IFR5cGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE1IgorICAgIH0KKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9CQURfUkVRVUVTVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTYiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlMsKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlM8KgLcKgcmVxdWlyZW1lbnQgbmFtZQorICAgIFJFU09VUkNFX0lOU1RBTkNFX01BVENIX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWF0Y2ggbm90IGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2UgJyUxJyBhbmQgcmVzb3VyY2UgaW5zdGFuY2UgJyUyJyBmb3IgcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE3IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTLCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTPCoC3CoHJlcXVpcmVtZW50IG5hbWUKKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSBpbnN0YW5jZXMgJyUxJyBhbmQgJyUyJyBhcmUgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTLCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTPCoC3CoHJlcXVpcmVtZW50IG5hbWUKKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9SRUxBVElPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE5vIHJlbGF0aW9uIGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2VzICclMScgYW5kICclMicgZm9yIHJlcXVpcmVtZW50ICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDExOSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTIwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBVc2VyJ3MgVVNFUl9JRAorICAgIFVTRVJfSU5BQ1RJVkU6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgJTEgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIwIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoFVzZXIncyBVU0VSX0lECisgICAgVVNFUl9IQVNfQUNUSVZFX0VMRU1FTlRTOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIHdpdGggJTEgSUQgY2FuIG5vdCBiZSBkZWxldGVkIHNpbmNlIGl0IGhhcyBhY3RpdmUgZWxlbWVudHMocmVzb3VyY2VzL3NlcnZpY2VzL2FydGlmYWN0cykuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEyMSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTIyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBhcnRpZmFjdCB0eXBlCisgICAgQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGFydGlmYWN0IHR5cGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBUlRJRkFDVF9MT0dJQ0FMX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0IGxvZ2ljYWwgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIzIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX0FSVElGQUNUX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgYXJ0aWZhY3QgdHlwZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI0IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEtYXJ0aWZhY3QgbmFtZQorICAgIEFSVElGQUNUX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBcnRpZmFjdCAnJTEnIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMjYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdC8uLi4KKyMgJTLCoC0gZmllbGQgKHRhZywgdmVuZG9yIG5hbWUuLi4pCisgICAgSU5WQUxJRF9GSUVMRF9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICBJbnZhbGlkICUxICUyIGZvcm1hdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI2IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBUlRJRkFDVF9JTlZBTElEX01ENTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBhcnRpZmFjdCBjaGVja3N1bS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI3IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX0FSVElGQUNUX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gTWlzc2luZyBhcnRpZmFjdCBuYW1lLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfUFJPSkVDVF9DT0RFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgUFJPSkVDVF9DT0RFIG51bWJlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlZBTElEX1BST0pFQ1RfQ09ERTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBQUk9KRUNUX0NPREUgbnVtYmVyIG11c3QgYmUgbnVtZXJpYyBmcm9tIDUgdXAgdG8gMTAgZGlnaXRzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzAiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMS1yZXNvdXJjZS9zZXJ2aWNlCisjICUyLXNydGlmYWN0L2FydGlmYWN0cworIyAlMy1zZW1pY29sb21uIHNlcGFyYXRlZCBsaXN0IG9mIGFydGlmYWN0IAorICAgIENPTVBPTkVOVF9NSVNTSU5HX01BTkRBVE9SWV9BUlRJRkFDVFM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgbWFuZGF0b3J5IGluZm9ybWF0aW9uYWwgJTEgJTI6IFslM10uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzMSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTMyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbGlmZWN5Y2xlICB0eXBlIG5hbWUKKyAgICBMSUZFQ1lDTEVfVFlQRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBMaWZlY3ljbGUgVHlwZSB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTMyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBzZXJ2aWNlIHZlcnNpb24KKyMgJTIgLSBzZXJ2aWNlIG5hbWUKKyAgICBTRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVmVyc2lvbiAlMSBvZiAnJTInIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzdHJpYnV0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzMiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfTElGRUNZQ0xFX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBpbnRlcmZhY2UgbGlmZS1jeWNsZSB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9DQVRFR09SWV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU2VydmljZSBjYXRlZ29yeSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSBzZXJ2aWNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCBuYW1lICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfQVZBSUxBQkxFOiB7CisgICAgICAgIGNvZGU6IDUwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIGVudmlyb25tZW50ICclMScgaXMgbm90IGF2YWlsYWJsZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCBuYW1lICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gZW52aXJvbm1lbnQgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzciCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9JTlZBTElEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyMgJTEgLSBzZXJ2aWNlIG5hbWUKKyAgICBESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTZXJ2aWNlICclMScgY2Fubm90IGJlIGRpc3RyaWJ1dGVkIGR1ZSB0byBtaXNzaW5nIGRlcGxveW1lbnQgYXJ0aWZhY3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQyMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorIyAlMiAtIG1heCBpY29uIG5hbWUgbGVuZ3RoICAgCisgICAgQ09NUE9ORU5UX0lDT05fRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBpY29uIG5hbWUgZXhjZWVkcyBsaW1pdCBvZiAlMiBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQyMDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQzMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTVFJJQ1RFRF9BQ0NFU1M6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc3RyaWN0ZWQgYWNjZXNzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQzMDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQzMDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTVFJJQ1RFRF9PUEVSQVRJT046IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc3RyaWN0ZWQgb3BlcmF0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQzMDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIE1JU1NJTkdfQk9EWTogeworICAgICAgICBjb2RlOiA0MDAgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nIHJlcXVlc3QgYm9keS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTUlTU0lOR19QVUJMSUNfS0VZOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICdhcGlQdWJsaWNLZXknLiIgLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBESVNUUklCVVRJT05fRU5WX0RPRVNfTk9UX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgIEJvZHkgIDogTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICdkaXN0ckVudk5hbWUnLiIgLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ1MDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBzZXJ2aWNlIG5hbWUKKyAgICBTRVJWSUNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgc2VydmljZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDMiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUwNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gc2VydmljZS9yZXNvdXJjZSB2ZXJzaW9uCisgICAgQ09NUE9ORU5UX1ZFUlNJT05fTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSB2ZXJzaW9uICUyIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwNCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0NTA1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyUxLWFydGlmYWN0IG5hbWUKKyAKKyAgICBBUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICclMScgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfRU5WX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgJ2Rpc3RyRW52TmFtZScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUwNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfSU5WQUxJRF9UQUdTX05PX0NPTVBfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBPbmUgb2YgdGhlIHRhZ3Mgc2hvdWxkIGJlIHRoZSBjb21wb25lbnQgbmFtZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA3IgorICAgIH0KKyAKKyMtLS0tLS0tLS1TVkM0NTA4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFNFUlZJQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU2VydmljZSBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHNlcnZpY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDgiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUwOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0lDT05fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEljb24gY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgc2VydmljZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBpY29uIG5hbWUgbWF4IGxlbmd0aAorICAgIFNFUlZJQ0VfSUNPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEljb24gbmFtZSBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBESVNUUklCVVRJT05fUkVRVUVTVEVEX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gRGlzdHJpYnV0aW9uIElECisgICAgRElTVFJJQlVUSU9OX1JFUVVFU1RFRF9GQUlMRUQ6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gJyUxJyBmYWlsZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9DQVRFR09SWV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgY2F0ZWdvcnkgY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgcmVzb3VyY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9JQ09OX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJY29uIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX1ZFTkRPUl9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBWZW5kb3IgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9ERVJJVkVEX0ZST01fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IERlcml2ZWQgZnJvbSByZXNvdXJjZSB0ZW1wbGF0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBtYXggbGVuZ3RoIAorICAgIENPTVBPTkVOVF9TSU5HTEVfVEFHX0VYQ0VFRF9MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBTaW5nbGUgdGFnIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfREVGQVVMVF9WQUxVRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogbWlzbWF0Y2ggaW4gZGF0YS10eXBlIG9jY3VycmVkIGZvciBwcm9wZXJ0eSAlMS4gZGF0YSB0eXBlIGlzICUyIGFuZCBkZWZhdWx0IHZhbHVlIGZvdW5kIGlzICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZSBvciByZXNvdXJjZSAKKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX01BWF9OVU1CRVJfUkVBQ0hFRDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWF4aW1hbCBudW1iZXIgb2YgYWRkaXRpb25hbCAlMSBwYXJhbWV0ZXJzIHdhcyByZWFjaGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX0VNUFRZX1NUUklOR19OT1RfQUxMT1dFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsYWJlbCBhbmQgdmFsdWUgY2Fubm90IGJlIGVtcHR5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gbGFiZWwvdmFsdWUKKyMgJTIgLSBNYXhpbWFsIGxlbmd0aCBvZiAlMQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uICUxIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTIyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9LRVlfTk9UX0FMTE9XRURfQ0hBUkFDVEVSUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBDb250ZW50LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxhYmVsIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9WQUxVRV9OT1RfQUxMT1dFRF9DSEFSQUNURVJTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gY29udGFpbnMgbm9uLWVuZ2xpc2ggY2hhcmFjdGVycy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcmVzb3VyY2UgaW5zdGFuY2Ugd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEFTRENfVkVSU0lPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEFTREMgdmVyc2lvbiBjYW5ub3QgYmUgZGlzcGxheWVkLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxLWFydGlmYWN0IHVybC9hcnRpZmFjdCBsYWJlbC9hcnRpZmFjdCBkZXNjcmlwdGlvbi9WTkYgU2VydmljZSBJbmRpY2F0b3IKKyAgICBNSVNTSU5HX0RBVEE6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gTWlzc2luZyAlMS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMS1hcnRpZmFjdCB1cmwvYXJ0aWZhY3QgbGFiZWwvYXJ0aWZhY3QgZGVzY3JpcHRpb24vYXJ0aWZhY3QgbmFtZQorIyAlMiAtIE1heGltYWwgbGVuZ3RoIG9mICUxCisgICAgRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBBUlRJRkFDVF9JTlZBTElEX1RJTUVPVVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgVGltZW91dCBzaG91bGQgYmUgc2V0IHRvIHZhbGlkIHBvc2l0aXZlIG5vbi16ZXJvIG51bWJlciBvZiBtaW51dGVzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9JU19WTkZfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZORiBJbmRpY2F0b3IgY2Fubm90IGJlIHVwZGF0ZWQgZm9yIGNlcnRpZmllZCBzZXJ2aWNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzEiCisgICAgfQorICMtLS0tLS0tLS1TVkM0NTMyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORF9PTl9TRVJWSUNFOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyByZXNvdXJjZSBpbnN0YW5jZSB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2aWNlICclMi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTMyIgorICAgIH0KKyAjLS0tLS0tLS0tU1ZDNDUzMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAjICUxIC0gICJIRUFUIi8iSEVBVF9FTlYiLyJNVVJBTk9fUEtHIi8iWUFOR19YTUwiIAorICAgIFdST05HX0FSVElGQUNUX0ZJTEVfRVhURU5TSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGZvciAlMSBhcnRpZmFjdCB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzMiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAgIkhFQVQiLyJIRUFUX0VOViIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9ZQU1MOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVcGxvYWRlZCBZQU1MIGZpbGUgZm9yICUxIGFydGlmYWN0IGlzIGludmFsaWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTM1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSEVBVCIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9ERVBMT1lNRU5UX0FSVElGQUNUX0hFQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorIyAlMiAtICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgCisjICUzIC0gICJIRUFUIi8iSEVBVF9FTlYiLyJNVVJBTk9fUEtHIiAKKyMgJTQgLSAgIkhFQVQiLyJIRUFUX0VOViIvIk1VUkFOT19QS0cKKyAgICBERVBMT1lNRU5UX0FSVElGQUNUX09GX1RZUEVfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICclMicgYWxyZWFkeSBoYXMgYSBkZXBsb3ltZW50IGFydGlmYWN0IG9mICUzIHR5cGUgLlBsZWFzZSBkZWxldGUgb3IgdXBkYXRlIGFuIGV4aXN0aW5nICU0IGFydGlmYWN0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzYiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUzNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX0hFQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgSEVBVCBhcnRpZmFjdC4gSEVBVF9FTlYgYXJ0aWZhY3QgY2Fubm90IGJlIHVwbG9hZGVkIHdpdGhvdXQgY29ycmVzcG9uZGluZyBIRUFUIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTTUFUQ0hfSEVBVF9WU19IRUFUX0VOVjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBhcnRpZmFjdCBjb250ZW50LiBQYXJhbWV0ZXIncyBzZXQgaW4gSEVBVF9FTlYgJyUxJyBhcnRpZmFjdCBkb2Vzbid0IG1hdGNoIHRoZSBwYXJhbWV0ZXJzIGluIEhFQVQgJyUyJyBhcnRpZmFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTM4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTM5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfUkVTT1VSQ0VfUEFZTE9BRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBwYXlsb2FkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9UT1NDQV9GSUxFX0VYVEVOU0lPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBmaWxlIGV4dGVuc2lvbiBmb3IgVE9TQ0EgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1lBTUxfRklMRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBZQU1MIGZpbGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1RPU0NBX1RFTVBMQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIFRPU0NBIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTk9UX1JFU09VUkNFX1RPU0NBX1RFTVBMQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBTZXJ2aWNlIFRPU0NBIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTk9UX1NJTkdMRV9SRVNPVVJDRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgVE9TQ0EgdGVtcGxhdGUgc2hvdWxkIGNvbnRhaW4gb25lIHJlc291cmNlIGRlZmluaXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1JFU09VUkNFX05BTUVTUEFDRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBuYW1lc3BhY2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gQVNEQyBDYXRhbG9nLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9SRVNPVVJDRV9DSEVDS1NVTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBjaGVja3N1bS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQ5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICMlMcKgIC3CoCBDb25zdW1lciBzYWx0CisgICAgSU5WQUxJRF9MRU5HVEg6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgbGVuZ3RoLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTAiCisgICAgfQorICAgICMtLS0tLS0tLS1TVkM0NTUxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICAjJTHCoCAtwqAgRUNPTVAgVXNlciBuYW1lCisgICAgRUNPTVBfVVNFUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEVDT01QIFVzZXIgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDT05TVU1FUl9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRUNPTVAgVXNlciBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTUyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTUzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjJTHCoCAtwqAgQ29uc3VtZXIgbmFtZSAvIENvbnN1bWVyIHBhc3N3b3JkLyBDb25zdW1lciBzYWx0IAorICAgIElOVkFMSURfQ09OVEVOVF9QQVJBTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTUzIgorICAgIH0KKyAgICAjLS0tLS0tLS0tU1ZDNDU1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorICAgIENPTVBPTkVOVF9BUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBhcnRpZmFjdCBkb2Vzbid0IGJlbG9uZyB0byBzcGVjaWZpZWQgJTEuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJTZXJ2aWNlIG5hbWUiCisgICAgU0VSVklDRV9ERVBMT1lNRU5UX0FSVElGQUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgc2VydmljZSBpcyBub3QgcmVhZHkgZm9yIGNlcnRpZmljYXRpb24uIFNlcnZpY2UgaGFzIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGRlcGxveW1lbnQgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IgorICAgIENPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEg6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgJTIgbmFtZSBsZW5ndGguIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IgorICAgIENPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgJTIgbmFtZSBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0NBVEVHT1JZX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBjYXRlZ29yeSBuYW1lICclMicgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJzZXJ2aWNlIi8iVkYiCisjICUyIC0gIlJlc291cmNlIG5hbWUiCisgICAgVkFMSURBVEVEX1JFU09VUkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBGT1VORF9BTFJFQURZX1ZBTElEQVRFRF9SRVNPVVJDRTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4gUGxlYXNlIHVzZSBhbHJlYWR5IGF2YWlsYWJsZSB2YWxpZGF0ZWQgcmVzb3VyY2UgdmVyc2lvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTYwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBGT1VORF9MSVNUX1ZBTElEQVRFRF9SRVNPVVJDRVM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFN1Ym1pdCBmb3IgVGVzdGluZyBpcyBub3QgcGVybWl0dGVkIGFzIHlvdXIgJyUxJyBpbmNsdWRlcyBub24tdmFsaWRhdGVkICclMicgcmVzb3VyY2UuIFBsZWFzZSB1c2Ugb25lIG9mIGF2YWlsYWJsZSB2YWxpZGF0ZWQgcmVzb3VyY2UgdmVyc2lvbnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2MCIKKyAgICB9ICAKKyMtLS0tLS0tLS1TVkM0NTYxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInJlc291cmNlIi8icHJvZHVjdCIKKyMgJTIgLSAiY2F0ZWdvcnkiCisjICUyIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICUxICUyICclMycgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTYxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTYyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gIlJlc291cmNlIi8iUHJvZHVjdCIKKyMgJTIgLSAic3ViLWNhdGVnb3J5IG5hbWUiCisjICUyIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9FWElTVFNfRk9SX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBzdWItY2F0ZWdvcnkgJyUyJyBhbHJlYWR5IGV4aXN0cyB1bmRlciAnJTMnIGNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiUHJvZHVjdCIKKyMgJTIgLSAiZ3JvdXBpbmcgbmFtZSIKKyMgJTIgLSAic3ViLWNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0dST1VQSU5HX0VYSVNUU19GT1JfU1VCX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBncm91cGluZyAnJTInIGFscmVhZHkgZXhpc3RzIHVuZGVyICclMycgc3ViLWNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIHByb2R1Y3TCoG5hbWUKKyAgICBQUk9EVUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcHJvZHVjdCB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIkhFQVQiICAgCisjICUyICAtIHBhcmFtZXRlciB0eXBlICgic3RyaW5nIiAsICJib29sZWFuIiAsICJudW1iZXIiKSAKKyMgJTMgLSAgcGFyYW1ldGVyIG5hbWUKKyAgICBJTlZBTElEX0hFQVRfUEFSQU1FVEVSX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkICUxIGFydGlmYWN0LiBJbnZhbGlkICUyIHZhbHVlIHNldCBmb3IgJyUzJyBwYXJhbWV0ZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiSEVBVCIgICAKKyMgJTIgIC0gcGFyYW1ldGVyIHR5cGUgKCJzdHJpbmciICwgImJvb2xlYW4iICwgIm51bWJlciIpIAorICAgIElOVkFMSURfSEVBVF9QQVJBTUVURVJfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSBhcnRpZmFjdC4gVW5zdXBwb3J0ZWQgJyUyJyBwYXJhbWV0ZXIgdHlwZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiWUFOR19YTUwiICAgICAgICAgICAgIAorICAgIElOVkFMSURfWE1MOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVcGxvYWRlZCBYTUwgZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJVc2VyIE5hbWUgYW5kIHVzZXJJZCIgICAKKyMgJTIgIC0iY2hlY2tlZC1vdXQiLyJpbi1jZXJ0aWZpY2F0aW9uIgorICAgIENBTk5PVF9ERUxFVEVfVVNFUl9XSVRIX0FDVElWRV9FTEVNRU5UUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXNlciBjYW5ub3QgYmUgZGVsZXRlZC4gVXNlciAnJTEnIGhhcyAlMiBwcm9qZWN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJVc2VyIE5hbWUgYW5kIHVzZXJJZCIgICAKKyMgJTIgIC0iY2hlY2tlZC1vdXQiLyJpbi1jZXJ0aWZpY2F0aW9uIgorICAgIENBTk5PVF9VUERBVEVfVVNFUl9XSVRIX0FDVElWRV9FTEVNRU5UUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUm9sZSBjYW5ub3QgYmUgY2hhbmdlZC4gVXNlciAnJTEnIGhhcyAlMiBwcm9qZWN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFVQREFURV9VU0VSX0FETUlOX0NPTkZMSUNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBbiBhZG1pbmlzdHJhdG9yIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBoaXMvaGVyIHJvbGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0NBTk5PVF9DT05UQUlOX1NVQkNBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTdWIgY2F0ZWdvcnkgY2Fubm90IGJlIGRlZmluZWQgZm9yIHNlcnZpY2UiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisgICAgQ09NUE9ORU5UX1RPT19NVUNIX0NBVEVHT1JJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIG11c3QgaGF2ZSBvbmx5IDEgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX1RPT19NVUNIX1NVQkNBVEVHT1JJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc291cmNlIG11c3QgaGF2ZSBvbmx5IDEgc3ViIGNhdGVnb3J5IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19TVUJDQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBzdWIgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc1IgorICAgIH0KKyAjLS0tLS0tLS0tU1ZDNDU3Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiY29tcG9uZW50IHR5cGUiCisgICAgVU5TVVBQT1JURURfRVJST1I6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgOiBSZXF1ZXN0ZWQgY29tcG9uZW50IHR5cGUgJTEgaXMgdW5zdXBwb3J0ZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NiIKKyAgICB9CisgICAgIy0tLS0tLS0tLVNWQzQ1NzctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gInJlc291cmNlIHR5cGUiCisgICAgUkVTT1VSQ0VfQ0FOTk9UX0NPTlRBSU5fUkVTT1VSQ0VfSU5TVEFOQ0VTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yIDogUmVzb3VyY2Ugb2YgdHlwZSAlMSBjYW5ub3QgY29udGFpbiByZXNvdXJjZSBpbnN0YW5jZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorIyAlMiAtICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgCisjICUzIC0gICJhcnRpZmFjdCBuYW1lIiAKKyAgICBERVBMT1lNRU5UX0FSVElGQUNUX05BTUVfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICclMicgYWxyZWFkeSBoYXMgYSBkZXBsb3ltZW50IGFydGlmYWN0IG5hbWVkICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3OCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiQ2F0ZWdvcnkiLyJTdWItQ2F0ZWdvcnkiLyJHcm91cCIKKyMgJTIgLSAgY2F0ZWdvcnkvc3ViLWNhdGVnb3J5L2dyb3VwaW5nIG5hbWUuCisgICAgSU5WQUxJRF9HUk9VUF9BU1NPQ0lBVElPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBncm91cCBhc3NvY2lhdGlvbi4gJTEgJyUyJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgRU1QVFlfUFJPRFVDVF9DT05UQUNUU19MSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIEF0IGxlYXN0IG9uZSBQcm9kdWN0IENvbnRhY3QgaGFzIHRvIGJlIHNwZWNpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTgxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHVzZXJJZAorICAgIElOVkFMSURfUFJPRFVDVF9DT05UQUNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIFVzZXIgJyUxJyBjYW5ub3QgYmUgc2V0IGFzIFByb2R1Y3QgQ29udGFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTgyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFByb2R1Y3QKKyMgJTIgLSAiYWJicmV2aWF0ZWQiLyJmdWxsIgorICAgIE1JU1NJTkdfT05FX09GX0NPTVBPTkVOVF9OQU1FUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBNaXNzaW5nICUxICUyIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4MiIKKyAgICB9ICAgIAorIy0tLS0tLS0tLVNWQzQ1ODMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiSWNvbiIKKyMgJTIgLSAicmVzb3VyY2UiLyJzZXJ2aWNlIi8icHJvZHVjdCIKKyAgICBDT01QT05FTlRfUEFSQU1FVEVSX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSAlMiBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAgLSBzZXJ2aWNlL1ZGIG5hbWUgCisjICUyIC0gInNlcnZpY2UiIC8iVkYiCisjICUzIC0gIHJlc291cmNlIGluc3RhbmNlIG9yaWdpbiB0eXBlCisjICU0IC0gIHJlc291cmNlIGluc3RhbmNlIG5hbWUgCisjICU1IC0gIHJlcXVpcmVtZW50L2NhcGFiaWxpdHkKKyMgJTYgLSAgcmVxdWlyZW1lbnQvY2FwYWJpbGl0eSBuYW1lCisjICU3IC0gICJmdWxmaWxsZWQiIChmb3IgcmVxKS8iY29uc3VtZWQgKGZvciBjYXApIgorICAgIFJFUV9DQVBfTk9UX1NBVElTRklFRF9CRUZPUkVfQ0VSVElGSUNBVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogIFJlcXVlc3RlZCAnJTEnICUyIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4gICUzICclNCcgaGFzIHRvIGhhdmUgJTUgJyU2JyAlNy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfT0NDVVJSRU5DRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgb2NjdXJyZW5jZXMgZm9ybWF0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjLS0tLS0tLS0tU1ZDNDU4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1NFUlZJQ0VfQVBJX1VSTDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBTZXJ2aWNlIEFQSSBVUkwuIFBsZWFzZSBjaGVjayB3aGV0aGVyIHlvdXIgVVJMIGhhcyBhIHZhbGlkIGRvbWFpbiBleHRlbnNpb24gYW5kIGRvZXMgbm90IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIC0gIz8mQCUrOyw9JDw+fl5gXFtde318IiohJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUgCisgICAgREFUQV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IERhdGEgdHlwZSAlMSBhbHJlYWR5IGV4aXN0cy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfTk9SX1BST1BFUlRJRVNfTkVJVEhFUl9ERVJJVkVEX0ZST006IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgRGF0YSB0eXBlICUxLiBEYXRhIHR5cGUgbXVzdCBoYXZlIGVpdGhlciBhIHZhbGlkIGRlcml2ZWQgZnJvbSBkZWNsYXJhdGlvbiBvciBhdCBsZWFzdCBvbmUgdmFsaWQgcHJvcGVydHknLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfUFJPUEVSVElFU19DQU5OT1RfQkVfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgRGF0YSB0eXBlICUxLiAncHJvcGVydGllcycgcGFyYW1ldGVyIGNhbm5vdCBiZSBlbXB0eSBpZiBwcm92aWRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBQcm9wZXJ0eSB0eXBlIG5hbWUgCisjICUyICAtIFByb3BlcnR5IG5hbWUKKyAgICBJTlZBTElEX1BST1BFUlRZX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgUHJvcGVydHkgdHlwZSAlMSBpbiBwcm9wZXJ0eSAlMi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTkwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBQcm9wZXJ0eSBpbm5lciB0eXBlCisjICUyICAtIFByb3BlcnR5IG5hbWUgCisgICAgSU5WQUxJRF9QUk9QRVJUWV9JTk5FUl9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHByb3BlcnR5IGlubmVyIHR5cGUgJTEsIGluIHByb3BlcnR5ICUyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gY29tcG9uZW50IGluc3RhbmNlIG5hbWUKKyMgJTIgIC0gInJlc291cmNlIGluc3RhbmNlIi8ic2VydmljZSBpbnN0YW5jZSIKKyAgICBDT01QT05FTlRfSU5TVEFOQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gY29tcG9uZW50IGluc3RhbmNlIG5hbWUKKyMgJTIgLSAicmVzb3VyY2UgaW5zdGFuY2UiLyJzZXJ2aWNlIGluc3RhbmNlIgorIyAlMyAtICJyZXNvdXJjZS8ic2VydmljZSIvInByb2R1Y3QiCisjICU0IC0gY29udGFpbmVyIG5hbWUgCisgICAgQ09NUE9ORU5UX0lOU1RBTkNFX05PVF9GT1VORF9PTl9DT05UQUlORVI6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIHdhcyBub3QgZm91bmQgb24gdGhlICUzICclNCcuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxIC0gcmVxdWlyZW1lbnQgLyBjYXBhYmlsaXR5CisjJTIgLSByZXF1aXJlbWVudCBuYW1lCisgICAgSU1QT1JUX0RVUExJQ0FURV9SRVFfQ0FQX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEltcG9ydGVkIFRPU0NBIHRlbXBsYXRlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgJTEgbmFtZWQgJyUyJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTEgLSByZXF1aXJlbWVudCAvIGNhcGFiaWxpdHkKKyMlMiAtIHJlcXVpcmVtZW50IG5hbWUKKyMlMyAtIHBhcmVudCBjb250YWluaW5nIHRoZSByZXF1aXJlbWVudCAKKyAgICBJTVBPUlRfUkVRX0NBUF9OQU1FX0VYSVNUU19JTl9ERVJJVkVEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBUT1NDQSB0ZW1wbGF0ZSBjb250YWlucyAlMSAnJTInIHRoYXQgaXMgYWxyZWFkeSBkZWZpbmVkIGJ5IGRlcml2ZWQgdGVtcGxhdGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfREVSSVZFRF9JU19NSVNTSU5HOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBhbmNlc3RvciBkYXRhIHR5cGUgJTEgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzeXN0ZW0uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyMgJTIgIC0gUHJvcGVydHkgbmFtZXMKKyAgICBEQVRBX1RZUEVfUFJPUEVSVFlfQUxSRUFEWV9ERUZJTkVEX0lOX0FOQ0VTVE9SOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgcHJvcGVydGllcyBuYW1lZCAlMiB3aGljaCBhcmUgYWxyZWFkeSBkZWZpbmVkIGluIG9uZSBvZiBpdHMgYW5jZXN0b3JzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisgICAgREFUQV9UWVBFX0RVUExJQ0FURV9QUk9QRVJUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZGF0YSB0eXBlICUxIGNvbnRhaW5zIGR1cGxpY2F0ZSBwcm9wZXJ0eS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZQorIyAlMiAgLSBQcm9wZXJ0eSBuYW1lcworICAgIERBVEFfVFlQRV9QUk9FUFJUWV9DQU5OT1RfSEFWRV9TQU1FX1RZUEVfT0ZfREFUQV9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgcHJvcGVydGllcyAlMiB3aGljaCB0aGVpciB0eXBlIGlzIHRoaXMgZGF0YSB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisgICAgREFUQV9UWVBFX0NBTk5PVF9IQVZFX1BST1BFUlRJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGRhdGEgdHlwZSAlMSBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzIHNpbmNlIGl0IGlzIG9mIHR5cGUgc2NhbGFyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBOT1RfVE9QT0xPR1lfVE9TQ0FfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIHlhbWwgZmlsZSAlMSBjYW5ub3QgYmUgbW9kZWxlZCB0byBWRiBhcyBpdCBkb2VzIG5vdCBjb250YWluICd0b3BvbG9neV90ZW1wbGF0ZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjAxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSB5YW1sIGZpbGUgbmFtZQorIyAlMiAtIG5vZGVfdGVtcGxhdGUgbGFiZWwKKyMgJTMgLSBub2RlX3RlbXBsYXRlIHR5cGUKKyAgICBJTlZBTElEX05PREVfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIHlhbWwgZmlsZSAnJTEnIGNvbnRhaW5zIG5vZGVfdGVtcGxhdGUgJyUyJyBvZiB0eXBlICclMycgdGhhdCBkb2VzIG5vdCByZXByZXNlbnQgZXhpc3RpbmcgVkZDL0NQL1ZMIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjb21wb25lbnQgdHlwZQorIyAlMsKgLSBjb21wb25lbnTCoG5hbWUKKyMgJTPCoC0gc3RhdGUKKyAgICBJTExFR0FMX0NPTVBPTkVOVF9TVEFURTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQ29tcG9uZW50IGluc3RhbmNlIG9mICUxIGNhbiBub3QgYmUgY3JlYXRlZCBiZWNhdXNlIHRoZSBjb21wb25lbnQgJyUyJyBpcyBpbiBhbiBpbGxlZ2FsIHN0YXRlICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyAgICBDU0FSX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIENTQVIgJyUxJyBpcyBpbnZhbGlkLiAnVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YScgZmlsZSBtdXN0IGJlIHByb3ZpZGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyAgICBDU0FSX0lOVkFMSURfRk9STUFUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUT1NDQSBDU0FSICclMScgaXMgaW52YWxpZC4gSW52YWxpZCAnVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YScgZmlsZSBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBwcm9wZXJ0eSBuYW1lCisjICUywqAtIHByb3BlcnR5IHR5cGUKKyMgJTMgLSBwcm9wZXJ0eSBpbm5lclR5cGUKKyMgJTTCoC0gZGVmYXVsdCB2YWx1ZSBpcworICAgIElOVkFMSURfQ09NUExFWF9ERUZBVUxUX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgb2YgcHJvcGVydHkgJTEuIERhdGEgdHlwZSBpcyAlMiB3aXRoIGlubmVyIHR5cGUgJTMgYW5kIGRlZmF1bHQgdmFsdWUgZm91bmQgaXMgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIENTQVJfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUT1NDQSBDU0FSICclMScgaXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBjb21wb25lbnQgdHlwZQorIyAlMyAtIGFjdHVhbCBjb21wb25lbnQgdHlwZQorICAgIE1JU01BVENIX0JFVFdFRU5fQVJUSUZBQ1RfVFlQRV9BTkRfQ09NUE9ORU5UX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICUxIGlzIG9ubHkgY29tcGF0aWJsZSB3aXRoIGNvbXBvbmVudCBvZiB0eXBlICUyLCBidXQgY29tcG9uZW50IHR5cGUgaXMgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwOCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NjA5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSU5WQUxJRF9KU09OIiAgICAgICAgICAgICAKKyAgICBJTlZBTElEX0pTT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVwbG9hZGVkIEpTT04gZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjEwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGNzYXIgZmlsZSBuYW1lCisjICUywqAtwqBtaXNzaW5nIGZpbGUgbmFtZQorICAgIFlBTUxfTk9UX0ZPVU5EX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgLSBUT1NDQSBDU0FSICUxIGlzIGludmFsaWQuIFRPU0NBLU1ldGFkYXRhL1Rvc2NhLm1ldGEgcmVmZXJzIHRvIGZpbGUgJTIgdGhhdCBpcyBub3QgcHJvdmlkZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gZ3JvdXAgbmFtZQorICAgIEdST1VQX01FTUJFUl9FTVBUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBHcm91cCAlMSBtZW1iZXIgbGlzdCB3YXMgcHJvdmlkZWQgYnV0IGRvZXMgbm90IGhhdmUgdmFsdWVzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gZ3JvdXAgbmFtZSAKKyAgICBHUk9VUF9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEdyb3VwIHR5cGUgJTEgYWxyZWFkeSBleGlzdHMuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cCBuYW1lCisjICUywqAtIFZGIG5hbWUoY29tcG9uZW50IG5hbWUpCisjICUzIC0gYWN0dWFsIGNvbXBvbmVudCB0eXBlIFtWRl0KKyAgICBHUk9VUF9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBHcm91cCB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cyBpbiAlMiAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjEzIgorICAgIH0gICAKKyMtLS0tLS0tLS1TVkM0NjE0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGdyb3VwIHR5cGUKKyAgICBHUk9VUF9UWVBFX0lTX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gR3JvdXAgdHlwZSAlMSBkb2VzIG5vdCBleGlzdCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXAgbmFtZQorICAgIEdST1VQX01JU1NJTkdfR1JPVVBfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIEdyb3VwIFR5cGUgZm9yIGdyb3VwICclMSciLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWVtYmVyIG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gVkYgbmFtZQorIyAlNCAtIGNvbXBvbmVudCB0eXBlIFtWRiBdCisgICAgR1JPVVBfSU5WQUxJRF9DT01QT05FTlRfSU5TVEFOQ0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IG1lbWJlciAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IHBhcnQgb2YgJTMgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNiIKKyAgICB9ICAgICAgICAgICAgICAgICAKKyMtLS0tLS0tLS1TVkM0NjE3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWVtYmVyIG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gZ3JvdXAgdHlwZQorICAgIEdST1VQX0lOVkFMSURfVE9TQ0FfTkFNRV9PRl9DT01QT05FTlRfSU5TVEFOQ0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IG1lbWJlciAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IHBhcnQgb2YgYWxsb3dlZCBtZW1iZXJzIG9mIGdyb3VwIHR5cGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC3CoG1pc3NpbmcgZmlsZSBuYW1lCisjICUywqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIEFSVElGQUNUX05PVF9GT1VORF9JTl9DU0FSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBhcnRpZmFjdCAlMSBpcyBkZWZpbmVkIGluIENTQVIgJTIgbWFuaWZlc3QgYnV0IGlzIG5vdCBwcm92aWRlZCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIGFydGlmYWN0IG5hbWUKKyMgJTLCoC3CoGFydGlmYWN0IHR5cGUKKyMgJTMgLSBleGlzdGluZyBhcnRpZmFjdCB0eXBlCisgICAgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX0RJRkZFUkVOVF9UWVBFX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGluIHR5cGUgJTIgYWxyZWFkeSBleGlzdHMgaW4gdHlwZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjIwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEZBSUxFRF9SRVRSSVZFX0FSVElGQUNUU19UWVBFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRmFpbGVkIHRvIHJldHJpZXZlIGxpc3Qgb2Ygc3Vwb3J0ZWQgYXJ0aWZhY3QgdHlwZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBtYXN0ZXIgCisgICAgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX01BU1RFUl9JTl9DU0FSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBhcnRpZmFjdCAlMSBhbHJlYWR5IGV4aXN0cyBpbiBtYXN0ZXIgJTIgLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIGFydGlmYWN0IG5hbWUKKyMgJTLCoC0gYXJ0aWZhY3QgdHlwZSAKKyMgJTPCoC0gbWFzdGVyIG5hbWUKKyMgJTQgLSBtYXN0ZXIgdHlwZQorICAgIEFSVElGQUNUX05PVF9WQUxJRF9JTl9NQVNURVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGluIHR5cGUgJTIgY2FuIG5vdCBiZSBleGlzdHMgdW5kZXIgbWFzdGVyICUzIGluIHR5cGUgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBhcnRpZmFjdCB0eXBlIAorIyAlM8KgLSBlbnYgbmFtZQorIyAlNCAtIGV4aXN0aW5nIGVudgorICAgIEFSVElGQUNUX05PVF9WQUxJRF9FTlY6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICUxIGluIHR5cGUgJTIgd2l0aCBlbnYgJTMgYWxyZWFkeSBleGlzdHMgd2l0aCBhbm90aGVyIGVudiAlNCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXBzIG5hbWVzCisjICUyIC0gVkYgbmFtZQorIyAlMyAtIGNvbXBvbmVudCB0eXBlIFtWRiBdCisgICAgR1JPVVBfSVNfTUlTU0lORzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZ3JvdXBzICclMScgY2Fubm90IGJlIGZvdW5kIHVuZGVyICUyICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXBzIG5hbWUKKyAgICBHUk9VUF9BUlRJRkFDVF9BTFJFQURZX0FTU09DSUFURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGdyb3VwICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cHMgbmFtZQorICAgIEdST1VQX0FSVElGQUNUX0FMUkVBRFlfRElTU09DSUFURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgYWxyZWFkeSBkaXNzb2NpYXRlZCBmcm9tIGdyb3VwICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHByb3BlcnR5IG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gZ3JvdXAgdHlwZSBuYW1lCisgICAgR1JPVVBfUFJPUEVSVFlfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBwcm9wZXJ0eSAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IGV4aXN0IGluIGdyb3VwIHR5cGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gY3NhclVVSUQKKyMgJTIgLSBWRiBuYW1lCisgICAgVlNQX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgVlNQIHdpdGggVVVJRCAlMSB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmb3IgVkYgJTIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBvciB1cGRhdGUgdGhlIGV4aXN0aW5nIFZGLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMSAtIFZGIG5hbWUKKyAgICBNSVNTSU5HX0NTQVJfVVVJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIENzYXIgVVVJRCBvciBwYXlsb2FkIG5hbWUgaXMgbWlzc2luZyBmb3IgVkYgJTEuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gVkYgbmFtZQorIyAlMiAtIG5ldyBjc2FyVVVJRAorIyAlMyAtIG9sZCBjc2FyVVVJRAorICAgIFJFU09VUkNFX0xJTktFRF9UT19ESUZGRVJFTlRfVlNQOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSAlMSBjYW5ub3QgYmUgdXBkYXRlZCB1c2luZyBDc2FyVVVJRCAlMiBzaW5jZSB0aGUgcmVzb3VyY2UgaXMgbGlua2VkIHRvIGEgZGlmZmVyZW50IFZTUCB3aXRoIGNzYXJVVUlEICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIHBvbGljeSBuYW1lIAorICAgIFBPTElDWV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFBvbGljeSB0eXBlICUxIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSB0YXJnZXQgbmFtZQorIyAlMiAtIHBvbGljeSB0eXBlIG5hbWUKKyAgICBUQVJHRVRTX05PTl9WQUxJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogdGFyZ2V0ICUxIGxpc3RlZCBpbiBwb2xpY3kgdHlwZSAlMiBpcyBub3QgYSBncm91cCBvciByZXNvdXJjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjMyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gcG9saWN5IG5hbWUKKyAgICBUQVJHRVRTX0VNUFRZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFBvbGljeSAlMSB0YXJnZXQgbGlzdCB3YXMgcHJvdmlkZWQgYnV0IGRvZXMgbm90IGhhdmUgdmFsdWVzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIERBVEFfVFlQRV9DQU5OT1RfQkVfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IERhdGEgdHlwZXMgYXJlIGVtcHR5LiBQbGVhc2UgaW1wb3J0IHRoZSBkYXRhIHR5cGVzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBjc2FyIHV1aWQKKyAgICBSRVNPVVJDRV9GUk9NX0NTQVJfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiByZXNvdXJjZSBmcm9tIGNzYXIgdXVpZCAlMSBub3QgZm91bmQiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfQ0FOTk9UX0JFX1VQREFURURfQkFEX1JFUVVFU1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IERhdGEgdHlwZSAlMSBjYW5ub3QgYmUgdXBncmFkZWQuIFRoZSBuZXcgZGF0YSB0eXBlIGRvZXMgbm90IGNvbnRhaW4gb2xkIHByb3BlcnRpZXMgb3IgdGhlIHR5cGUgb2Ygb25lIG9mIHRoZSBwcm9wZXJ0aWVzIGhhcyBiZWVuIGNoYW5nZWQuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzNiIKKyAgICB9ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZS9uZW80ai1lcnJvcnMtY29uZmlndXJhdGlvbi55YW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUvbmVvNGotZXJyb3JzLWNvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBkNmRiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUvbmVvNGotZXJyb3JzLWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDYwIEBACisjIEVycm9ycworZXJyb3JzOgorICAgIE5lb19DbGllbnRFcnJvcl9HZW5lcmFsX1JlYWRPbmx5OiAiVGhpcyBpcyBhIHJlYWQgb25seSBkYXRhYmFzZSwgd3JpdGluZyBvciBtb2RpZnlpbmcgdGhlIGRhdGFiYXNlIGlzIG5vdCBhbGxvd2VkLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfTGVnYWN5SW5kZXhfTm9TdWNoSW5kZXg6ICJUaGUgcmVxdWVzdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgcmVmZXJyZWQgdG8gYSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfUmVxdWVzdF9JbnZhbGlkOiAiVGhlIGNsaWVudCBwcm92aWRlZCBhbiBpbnZhbGlkIFJlcXVlc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9SZXF1ZXN0X0ludmFsaWRGb3JtYXQ6ICJUaGUgY2xpZW50IHByb3ZpZGVkIGEgcmVxdWVzdCB0aGF0IHdhcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcywgb3IgaGFkIHZhbHVlcyB0aGF0IGFyZSBub3QgYWxsb3dlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9Db25zdHJhaW50QWxyZWFkeUV4aXN0czogIlVuYWJsZSB0byBwZXJmb3JtIG9wZXJhdGlvbiBiZWNhdXNlIGl0IHdvdWxkIGNsYXNoIHdpdGggYSBwcmUtZXhpc3RpbmcgY29uc3RyYWludC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9Db25zdHJhaW50VmVyaWZpY2F0aW9uRmFpbHVyZTogIlVuYWJsZSB0byBjcmVhdGUgY29uc3RyYWludCBiZWNhdXNlIGRhdGEgdGhhdCBleGlzdHMgaW4gdGhlIGRhdGFiYXNlIHZpb2xhdGVzIGl0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0NvbnN0cmFpbnRWaW9sYXRpb246ICJBIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGUgZGF0YWJhc2Ugd2FzIHZpb2xhdGVkLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0lsbGVnYWxUb2tlbk5hbWU6ICJBIHRva2VuIG5hbWUsIHN1Y2ggYXMgYSBsYWJlbCwgcmVsYXRpb25zaGlwIHR5cGUgb3IgcHJvcGVydHkga2V5LCB1c2VkIGlzIG5vdCB2YWxpZC4gVG9rZW5zIGNhbm5vdCBiZSBlbXB0eSBzdHJpbmdzIGFuZCBjYW5ub3QgYmUgbnVsbC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9JbmRleEFscmVhZHlFeGlzdHM6ICJVbmFibGUgdG8gcGVyZm9ybSBvcGVyYXRpb24gYmVjYXVzZSBpdCB3b3VsZCBjbGFzaCB3aXRoIGEgcHJlLWV4aXN0aW5nIGluZGV4LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0luZGV4QmVsb25nc1RvQ29uc3RyYWludDogIkEgcmVxdWVzdGVkIG9wZXJhdGlvbiBjYW4gbm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgc3BlY2lmaWVkIGluZGV4IGJlY2F1c2UgdGhlIGluZGV4IGlzIHBhcnQgb2YgYSBjb25zdHJhaW50LiBJZiB5b3Ugd2FudCB0byBkcm9wIHRoZSBpbmRleCwgZm9yIGluc3RhbmNlLCB5b3UgbXVzdCBkcm9wIHRoZSBjb25zdHJhaW50LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX0luZGV4TGltaXRSZWFjaGVkOiAiVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGV4IGVudHJpZXMgc3VwcG9ydGVkIGhhcyBiZWVuIHJlYWNoZWQsIG5vIG1vcmUgZW50aXRpZXMgY2FuIGJlIGluZGV4ZWQuIgorICAgIE5lb19DbGllbnRFcnJvcl9TY2hlbWFfTGFiZWxMaW1pdFJlYWNoZWQ6ICJUaGUgbWF4aW11bSBudW1iZXIgb2YgbGFiZWxzIHN1cHBvcnRlZCBoYXMgYmVlbiByZWFjaGVkLCBubyBtb3JlIGxhYmVscyBjYW4gYmUgY3JlYXRlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NjaGVtYV9Ob1N1Y2hDb25zdHJhaW50OiAiVGhlIHJlcXVlc3QgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHJlZmVycmVkIHRvIGEgY29uc3RyYWludCB0aGF0IGRvZXMgbm90IGV4aXN0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU2NoZW1hX05vU3VjaEluZGV4OiAiVGhlIHJlcXVlc3QgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHJlZmVycmVkIHRvIGFuIGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9TZWN1cml0eV9BdXRoZW50aWNhdGlvbkZhaWxlZDogIlRoZSBjbGllbnQgcHJvdmlkZWQgYW4gaW5jb3JyZWN0IHVzZXJuYW1lIGFuZC9vciBwYXNzd29yZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1NlY3VyaXR5X0F1dGhlbnRpY2F0aW9uUmF0ZUxpbWl0OiAiVGhlIGNsaWVudCBoYXMgcHJvdmlkZWQgaW5jb3JyZWN0IGF1dGhlbnRpY2F0aW9uIGRldGFpbHMgdG9vIG1hbnkgdGltZXMgaW4gYSByb3cuIgorICAgIE5lb19DbGllbnRFcnJvcl9TZWN1cml0eV9BdXRob3JpemF0aW9uRmFpbGVkOiAiVGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIHByaXZpbGVnZXMgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9Bcml0aG1ldGljRXJyb3I6ICJJbnZhbGlkIHVzZSBvZiBhcml0aG1ldGljLCBzdWNoIGFzIGRpdmlkaW5nIGJ5IHplcm8uIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfQ29uc3RyYWludFZpb2xhdGlvbjogIkEgY29uc3RyYWludCBpbXBvc2VkIGJ5IHRoZSBzdGF0ZW1lbnQgaXMgdmlvbGF0ZWQgYnkgdGhlIGRhdGEgaW4gdGhlIGRhdGFiYXNlLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfU3RhdGVtZW50X0VudGl0eU5vdEZvdW5kOiAiVGhlIHN0YXRlbWVudCBpcyBkaXJlY3RseSByZWZlcnJpbmcgdG8gYW4gZW50aXR5IHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfSW52YWxpZEFyZ3VtZW50czogIlRoZSBzdGF0ZW1lbnQgaXMgYXR0ZW1wdGluZyB0byBwZXJmb3JtIG9wZXJhdGlvbnMgdXNpbmcgaW52YWxpZCBhcmd1bWVudHMiCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9JbnZhbGlkU2VtYW50aWNzOiAiVGhlIHN0YXRlbWVudCBpcyBzeW50YWN0aWNhbGx5IHZhbGlkLCBidXQgZXhwcmVzc2VzIHNvbWV0aGluZyB0aGF0IHRoZSBkYXRhYmFzZSBjYW5ub3QgZG8uIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfSW52YWxpZFN5bnRheDogIlRoZSBzdGF0ZW1lbnQgY29udGFpbnMgaW52YWxpZCBvciB1bnN1cHBvcnRlZCBzeW50YXguIgorICAgIE5lb19DbGllbnRFcnJvcl9TdGF0ZW1lbnRfSW52YWxpZFR5cGU6ICJUaGUgc3RhdGVtZW50IGlzIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIHZhbHVlcyB3aXRoIHR5cGVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG9wZXJhdGlvbi4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9Ob1N1Y2hMYWJlbDogIlRoZSBzdGF0ZW1lbnQgaXMgcmVmZXJyaW5nIHRvIGEgbGFiZWwgdGhhdCBkb2VzIG5vdCBleGlzdC4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9Ob1N1Y2hQcm9wZXJ0eTogIlRoZSBzdGF0ZW1lbnQgaXMgcmVmZXJyaW5nIHRvIGEgcHJvcGVydHkgdGhhdCBkb2VzIG5vdCBleGlzdC4iCisgICAgTmVvX0NsaWVudEVycm9yX1N0YXRlbWVudF9QYXJhbWV0ZXJNaXNzaW5nOiAiVGhlIHN0YXRlbWVudCBpcyByZWZlcnJpbmcgdG8gYSBwYXJhbWV0ZXIgdGhhdCB3YXMgbm90IHByb3ZpZGVkIGluIHRoZSBSZXF1ZXN0LiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfVHJhbnNhY3Rpb25fQ29uY3VycmVudFJlcXVlc3Q6ICJUaGVyZSB3ZXJlIGNvbmN1cnJlbnQgcmVxdWVzdHMgYWNjZXNzaW5nIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iCisgICAgTmVvX0NsaWVudEVycm9yX1RyYW5zYWN0aW9uX0V2ZW50SGFuZGxlclRocmV3RXhjZXB0aW9uOiAiQSB0cmFuc2FjdGlvbiBldmVudCBoYW5kbGVyIHRocmV3IGFuIGV4Y2VwdGlvbi4gVGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgcm9sbGVkIGJhY2suIgorICAgIE5lb19DbGllbnRFcnJvcl9UcmFuc2FjdGlvbl9Ib29rRmFpbGVkOiAiVHJhbnNhY3Rpb24gaG9vayBmYWlsdXJlLiIKKyAgICBOZW9fQ2xpZW50RXJyb3JfVHJhbnNhY3Rpb25fSW52YWxpZFR5cGU6ICJUaGUgdHJhbnNhY3Rpb24gaXMgb2YgdGhlIHdyb25nIHR5cGUgdG8gc2VydmljZSB0aGUgUmVxdWVzdF8gRm9yIGluc3RhbmNlLCBhIHRyYW5zYWN0aW9uIHRoYXQgaGFzIGhhZCBzY2hlbWEgbW9kaWZpY2F0aW9ucyBwZXJmb3JtZWQgaW4gaXQgY2Fubm90IGJlIHVzZWQgdG8gc3Vic2VxdWVudGx5IHBlcmZvcm0gZGF0YSBvcGVyYXRpb25zLCBhbmQgdmljZSB2ZXJzYS4iCisgICAgTmVvX0NsaWVudEVycm9yX1RyYW5zYWN0aW9uX01hcmtlZEFzRmFpbGVkOiAiVHJhbnNhY3Rpb24gd2FzIG1hcmtlZCBhcyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZC4gRmFpbHVyZSB0YWtlcyBwcmVjZWRlbmNlIGFuZCBzbyB0aGlzIHRyYW5zYWN0aW9uIHdhcyByb2xsZWQgYmFjayBhbHRob3VnaCBpdCBtYXkgaGF2ZSBsb29rZWQgbGlrZSBpdCB3YXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIgorICAgIE5lb19DbGllbnRFcnJvcl9UcmFuc2FjdGlvbl9Vbmtub3duSWQ6ICJUaGUgcmVxdWVzdCByZWZlcnJlZCB0byBhIHRyYW5zYWN0aW9uIHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19DbGllbnRFcnJvcl9UcmFuc2FjdGlvbl9WYWxpZGF0aW9uRmFpbGVkOiAiVHJhbnNhY3Rpb24gY2hhbmdlcyBkaWQgbm90IHBhc3MgdmFsaWRhdGlvbiBjaGVja3MiCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfR2VuZXJhbF9Db3JydXB0U2NoZW1hUnVsZTogIkEgbWFsZm9ybWVkIHNjaGVtYSBydWxlIHdhcyBlbmNvdW50ZXJlZC4gUGxlYXNlIGNvbnRhY3QgeW91ciBzdXBwb3J0IHJlcHJlc2VudGF0aXZlLiIKKyAgICBOZW9fRGF0YWJhc2VFcnJvcl9HZW5lcmFsX0ZhaWxlZEluZGV4OiAiVGhlIHJlcXVlc3QgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHJlZmVycmVkIHRvIGFuIGluZGV4IHRoYXQgaXMgaW4gYSBmYWlsZWQgc3RhdGUuIFRoZSBpbmRleCBuZWVkcyB0byBiZSBkcm9wcGVkIGFuZCByZWNyZWF0ZWQgbWFudWFsbHkuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX0dlbmVyYWxfVW5rbm93bkZhaWx1cmU6ICJBbiB1bmtub3duIGZhaWx1cmUgb2NjdXJyZWQuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Db25zdHJhaW50Q3JlYXRpb25GYWlsdXJlOiAiQ3JlYXRpbmcgYSByZXF1ZXN0ZWQgY29uc3RyYWludCBmYWlsZWQuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Db25zdHJhaW50RHJvcEZhaWx1cmU6ICJUaGUgZGF0YWJhc2UgZmFpbGVkIHRvIGRyb3AgYSByZXF1ZXN0ZWQgY29uc3RyYWludC4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfU2NoZW1hX0luZGV4Q3JlYXRpb25GYWlsdXJlOiAiRmFpbGVkIHRvIGNyZWF0ZSBhbiBpbmRleC4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfU2NoZW1hX0luZGV4RHJvcEZhaWx1cmU6ICJUaGUgZGF0YWJhc2UgZmFpbGVkIHRvIGRyb3AgYSByZXF1ZXN0ZWQgaW5kZXguIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Ob1N1Y2hMYWJlbDogIlRoZSByZXF1ZXN0IGFjY2Vzc2VkIGEgbGFiZWwgdGhhdCBkaWQgbm90IGV4aXN0LiIKKyAgICBOZW9fRGF0YWJhc2VFcnJvcl9TY2hlbWFfTm9TdWNoUHJvcGVydHlLZXk6ICJUaGUgcmVxdWVzdCBhY2Nlc3NlZCBhIHByb3BlcnR5IHRoYXQgZG9lcyBub3QgZXhpc3QuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1NjaGVtYV9Ob1N1Y2hSZWxhdGlvbnNoaXBUeXBlOiAiVGhlIHJlcXVlc3QgYWNjZXNzZWQgYSByZWxhdGlvbnNoaXAgdHlwZSB0aGF0IGRvZXMgbm90IGV4aXN0LiIKKyAgICBOZW9fRGF0YWJhc2VFcnJvcl9TY2hlbWFfTm9TdWNoU2NoZW1hUnVsZTogIlRoZSByZXF1ZXN0IHJlZmVycmVkIHRvIGEgc2NoZW1hIHJ1bGUgdGhhdCBkb2VzIG5vdCBleGlzdC4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfU3RhdGVtZW50X0V4ZWN1dGlvbkZhaWx1cmU6ICJUaGUgZGF0YWJhc2Ugd2FzIHVuYWJsZSB0byBleGVjdXRlIHRoZSBTdGF0ZW1lbnQuIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1RyYW5zYWN0aW9uX0NvdWxkTm90QmVnaW46ICJUaGUgZGF0YWJhc2Ugd2FzIHVuYWJsZSB0byBzdGFydCB0aGUgVHJhbnNhY3Rpb24uIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1RyYW5zYWN0aW9uX0NvdWxkTm90Q29tbWl0OiAiVGhlIGRhdGFiYXNlIHdhcyB1bmFibGUgdG8gY29tbWl0IHRoZSBUcmFuc2FjdGlvbi4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfVHJhbnNhY3Rpb25fQ291bGROb3RSb2xsYmFjazogIlRoZSBkYXRhYmFzZSB3YXMgdW5hYmxlIHRvIHJvbGwgYmFjayB0aGUgVHJhbnNhY3Rpb24uIgorICAgIE5lb19EYXRhYmFzZUVycm9yX1RyYW5zYWN0aW9uX0NvdWxkTm90V3JpdGVUb0xvZzogIlRoZSBkYXRhYmFzZSB3YXMgdW5hYmxlIHRvIHdyaXRlIHRyYW5zYWN0aW9uIHRvIGxvZy4iCisgICAgTmVvX0RhdGFiYXNlRXJyb3JfVHJhbnNhY3Rpb25fUmVsZWFzZUxvY2tzRmFpbGVkOiAiVGhlIHRyYW5zYWN0aW9uIHdhcyB1bmFibGUgdG8gcmVsZWFzZSBvbmUgb3IgbW9yZSBvZiBpdHMgbG9ja3MuIgorICAgIE5lb19UcmFuc2llbnRFcnJvcl9HZW5lcmFsX0RhdGFiYXNlVW5hdmFpbGFibGU6ICJUaGUgZGF0YWJhc2UgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgdG8gc2VydmUgeW91ciByZXF1ZXN0LCByZWZlciB0byB0aGUgZGF0YWJhc2UgbG9ncyBmb3IgbW9yZSBkZXRhaWxzLiBSZXRyeWluZyB5b3VyIHJlcXVlc3QgYXQgYSBsYXRlciB0aW1lIG1heSBzdWNjZWVkLiIKKyAgICBOZW9fVHJhbnNpZW50RXJyb3JfTmV0d29ya19Vbmtub3duRmFpbHVyZTogIkFuIHVua25vd24gbmV0d29yayBmYWlsdXJlIG9jY3VycmVkLCBhIHJldHJ5IG1heSByZXNvbHZlIHRoZSBpc3N1ZS4iCisgICAgTmVvX1RyYW5zaWVudEVycm9yX1NjaGVtYV9Nb2RpZmllZENvbmN1cnJlbnRseTogIlRoZSBkYXRhYmFzZSBzY2hlbWEgd2FzIG1vZGlmaWVkIHdoaWxlIHRoaXMgdHJhbnNhY3Rpb24gd2FzIHJ1bm5pbmcsIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcmV0cmllZC4iCisgICAgTmVvX1RyYW5zaWVudEVycm9yX1NlY3VyaXR5X01vZGlmaWVkQ29uY3VycmVudGx5OiAiVGhlIHVzZXIgd2FzIG1vZGlmaWVkIGNvbmN1cnJlbnRseSB0byB0aGlzIFJlcXVlc3QuIgorICAgIE5lb19UcmFuc2llbnRFcnJvcl9TdGF0ZW1lbnRfRXh0ZXJuYWxSZXNvdXJjZUZhaWx1cmU6ICJUaGUgZXh0ZXJuYWwgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZSIKKyAgICBOZW9fVHJhbnNpZW50RXJyb3JfVHJhbnNhY3Rpb25fQWNxdWlyZUxvY2tUaW1lb3V0OiAiVGhlIHRyYW5zYWN0aW9uIHdhcyB1bmFibGUgdG8gYWNxdWlyZSBhIGxvY2ssIGZvciBpbnN0YW5jZSBkdWUgdG8gYSB0aW1lb3V0IG9yIHRoZSB0cmFuc2FjdGlvbiB0aHJlYWQgYmVpbmcgaW50ZXJydXB0ZWQuIgorICAgIE5lb19UcmFuc2llbnRFcnJvcl9UcmFuc2FjdGlvbl9EZWFkbG9ja0RldGVjdGVkOiAiVGhpcyB0cmFuc2FjdGlvbiwgYW5kIGF0IGxlYXN0IG9uZSBtb3JlIHRyYW5zYWN0aW9uLCBoYXMgYWNxdWlyZWQgbG9ja3MgaW4gYSB3YXkgdGhhdCBpdCB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5LCBhbmQgdGhlIGRhdGFiYXNlIGhhcyBhYm9ydGVkIGl0LiBSZXRyeWluZyB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgbW9zdCBsaWtlbHkgYmUgc3VjY2Vzc2Z1bC4iClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUvdXNlcnMtY29uZmlndXJhdGlvbi55YW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctYmUvdXNlcnMtY29uZmlndXJhdGlvbi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzIzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1iZS91c2Vycy1jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSwyIEBACit1c2VyQ3JlZGVudGlhbHM6CisgICAgY2k6IDJhMWY4ODdkNjA3ZDQ1MTVkNDA2NmZlMGY1NDUyYTUwOjBhMGRjNTU3YzNiZjU5NGIxYTQ4MDMwZTNlOTkyMjc1ODAxNjhiMjFmNDRlMjg1YzY5NzQwYjhkNWIxM2UzM2IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY29uZmlndXJhdGlvbjEueWFtbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uMS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYWIyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY29uZmlndXJhdGlvbjEueWFtbApAQCAtMCwwICsxLDE3IEBACit2ZXJzaW9uOiAxLjAKK3JlbGVhc2VkOiAyMDEyLTExLTMwCisKKyMgQ29ubmVjdGlvbiBwYXJhbWV0ZXJzCitjb25uZWN0aW9uOgorICAgIHVybDogamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2L2RiCisgICAgcG9vbFNpemU6IDUKKworIyBQcm90b2NvbHMKK3Byb3RvY29sczoKKyAgIC0gaHR0cAorICAgLSBodHRwcworCisjIFVzZXJzCit1c2VyczoKKyAgICB0b206IHBhc3N3ZAorICAgIGJvYjogcGFzc3dkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2VsYXN0aWNzZWFyY2gueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2VsYXN0aWNzZWFyY2gueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTJjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvZWxhc3RpY3NlYXJjaC55bWwKQEAgLTAsMCArMSwzODcgQEAKKworY2x1c3Rlci5uYW1lOiBlbGFzdGljc2VhcmNoXzFfNV8yCisgIAorZGlzY292ZXJ5Lnplbi5waW5nLm11bHRpY2FzdC5lbmFibGVkOiBmYWxzZQorZGlzY292ZXJ5Lnplbi5waW5nLnVuaWNhc3QuZW5hYmxlZDogdHJ1ZQorZGlzY292ZXJ5Lnplbi5waW5nLnVuaWNhc3QuaG9zdHM6IGVsYXN0aWNzZWFyY2hfaG9zdAorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVsYXN0aWNzZWFyY2ggQ29uZmlndXJhdGlvbiBFeGFtcGxlICMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoaXMgZmlsZSBjb250YWlucyBhbiBvdmVydmlldyBvZiB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsCisjIHRhcmdldGVkIGF0IG9wZXJhdGlvbnMgc3RhZmYuIEFwcGxpY2F0aW9uIGRldmVsb3BlcnMgc2hvdWxkCisjIGNvbnN1bHQgdGhlIGd1aWRlIGF0IDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGU+LgorIworIyBUaGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBpcyBjb3ZlcmVkIGF0CisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9zZXR1cC5odG1sPi4KKyMKKyMgRWxhc3RpY3NlYXJjaCBjb21lcyB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIG1vc3Qgc2V0dGluZ3MsCisjIHNvIHlvdSBjYW4gdHJ5IGl0IG91dCB3aXRob3V0IGJvdGhlcmluZyB3aXRoIGNvbmZpZ3VyYXRpb24uCisjCisjIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZXNlIGRlZmF1bHRzIGFyZSBqdXN0IGZpbmUgZm9yIHJ1bm5pbmcgYSBwcm9kdWN0aW9uCisjIGNsdXN0ZXIuIElmIHlvdSdyZSBmaW5lLXR1bmluZyB5b3VyIGNsdXN0ZXIsIG9yIHdvbmRlcmluZyBhYm91dCB0aGUKKyMgZWZmZWN0IG9mIGNlcnRhaW4gY29uZmlndXJhdGlvbiBvcHRpb24sIHBsZWFzZSBfZG8gYXNrXyBvbiB0aGUKKyMgbWFpbGluZyBsaXN0IG9yIElSQyBjaGFubmVsIFtodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvY29tbXVuaXR5XS4KKworIyBBbnkgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbiBjYW4gYmUgcmVwbGFjZWQgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyMgYnkgcGxhY2luZyB0aGVtIGluICR7Li4ufSBub3RhdGlvbi4gRm9yIGV4YW1wbGU6CisjCisjIG5vZGUucmFjazogJHtSQUNLX0VOVl9WQVJ9CisKKyMgRm9yIGluZm9ybWF0aW9uIG9uIHN1cHBvcnRlZCBmb3JtYXRzIGFuZCBzeW50YXggZm9yIHRoZSBjb25maWcgZmlsZSwgc2VlCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9zZXR1cC1jb25maWd1cmF0aW9uLmh0bWw+CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQ2x1c3RlciAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENsdXN0ZXIgbmFtZSBpZGVudGlmaWVzIHlvdXIgY2x1c3RlciBmb3IgYXV0by1kaXNjb3ZlcnkuIElmIHlvdSdyZSBydW5uaW5nCisjIG11bHRpcGxlIGNsdXN0ZXJzIG9uIHRoZSBzYW1lIG5ldHdvcmssIG1ha2Ugc3VyZSB5b3UncmUgdXNpbmcgdW5pcXVlIG5hbWVzLgorIworIyBjbHVzdGVyLm5hbWU6IGVsYXN0aWNzZWFyY2gKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTm9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTm9kZSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IG9uIHN0YXJ0dXAsIHNvIHlvdSdyZSByZWxpZXZlZAorIyBmcm9tIGNvbmZpZ3VyaW5nIHRoZW0gbWFudWFsbHkuIFlvdSBjYW4gdGllIHRoaXMgbm9kZSB0byBhIHNwZWNpZmljIG5hbWU6CisjCisjIG5vZGUubmFtZTogIkZyYW56IEthZmthIgorCisjIEV2ZXJ5IG5vZGUgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgb3IgZGVueSBiZWluZyBlbGlnaWJsZSBhcyB0aGUgbWFzdGVyLAorIyBhbmQgdG8gYWxsb3cgb3IgZGVueSB0byBzdG9yZSB0aGUgZGF0YS4KKyMKKyMgQWxsb3cgdGhpcyBub2RlIHRvIGJlIGVsaWdpYmxlIGFzIGEgbWFzdGVyIG5vZGUgKGVuYWJsZWQgYnkgZGVmYXVsdCk6CisjCisjIG5vZGUubWFzdGVyOiB0cnVlCisjCisjIEFsbG93IHRoaXMgbm9kZSB0byBzdG9yZSBkYXRhIChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBub2RlLmRhdGE6IHRydWUKKworIyBZb3UgY2FuIGV4cGxvaXQgdGhlc2Ugc2V0dGluZ3MgdG8gZGVzaWduIGFkdmFuY2VkIGNsdXN0ZXIgdG9wb2xvZ2llcy4KKyMKKyMgMS4gWW91IHdhbnQgdGhpcyBub2RlIHRvIG5ldmVyIGJlY29tZSBhIG1hc3RlciBub2RlLCBvbmx5IHRvIGhvbGQgZGF0YS4KKyMgICAgVGhpcyB3aWxsIGJlIHRoZSAid29ya2hvcnNlIiBvZiB5b3VyIGNsdXN0ZXIuCisjCisjIG5vZGUubWFzdGVyOiBmYWxzZQorIyBub2RlLmRhdGE6IHRydWUKKyMKKyMgMi4gWW91IHdhbnQgdGhpcyBub2RlIHRvIG9ubHkgc2VydmUgYXMgYSBtYXN0ZXI6IHRvIG5vdCBzdG9yZSBhbnkgZGF0YSBhbmQKKyMgICAgdG8gaGF2ZSBmcmVlIHJlc291cmNlcy4gVGhpcyB3aWxsIGJlIHRoZSAiY29vcmRpbmF0b3IiIG9mIHlvdXIgY2x1c3Rlci4KKyMKKyMgbm9kZS5tYXN0ZXI6IHRydWUKKyMgbm9kZS5kYXRhOiBmYWxzZQorIworIyAzLiBZb3Ugd2FudCB0aGlzIG5vZGUgdG8gYmUgbmVpdGhlciBtYXN0ZXIgbm9yIGRhdGEgbm9kZSwgYnV0CisjICAgIHRvIGFjdCBhcyBhICJzZWFyY2ggbG9hZCBiYWxhbmNlciIgKGZldGNoaW5nIGRhdGEgZnJvbSBub2RlcywKKyMgICAgYWdncmVnYXRpbmcgcmVzdWx0cywgZXRjLikKKyMKKyMgbm9kZS5tYXN0ZXI6IGZhbHNlCisjIG5vZGUuZGF0YTogZmFsc2UKKworIyBVc2UgdGhlIENsdXN0ZXIgSGVhbHRoIEFQSSBbaHR0cDovL2xvY2FsaG9zdDo5MjAwL19jbHVzdGVyL2hlYWx0aF0sIHRoZQorIyBOb2RlIEluZm8gQVBJIFtodHRwOi8vbG9jYWxob3N0OjkyMDAvX25vZGVzXSBvciBHVUkgdG9vbHMKKyMgc3VjaCBhcyA8aHR0cDovL3d3dy5lbGFzdGljc2VhcmNoLm9yZy9vdmVydmlldy9tYXJ2ZWwvPiwKKyMgPGh0dHA6Ly9naXRodWIuY29tL2thcm1pL2VsYXN0aWNzZWFyY2gtcGFyYW1lZGljPiwKKyMgPGh0dHA6Ly9naXRodWIuY29tL2x1a2FzLXZsY2VrL2JpZ2Rlc2s+IGFuZAorIyA8aHR0cDovL21vYnouZ2l0aHViLmNvbS9lbGFzdGljc2VhcmNoLWhlYWQ+IHRvIGluc3BlY3QgdGhlIGNsdXN0ZXIgc3RhdGUuCisKKyMgQSBub2RlIGNhbiBoYXZlIGdlbmVyaWMgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggaXQsIHdoaWNoIGNhbiBsYXRlciBiZSB1c2VkCisjIGZvciBjdXN0b21pemVkIHNoYXJkIGFsbG9jYXRpb24gZmlsdGVyaW5nLCBvciBhbGxvY2F0aW9uIGF3YXJlbmVzcy4gQW4gYXR0cmlidXRlCisjIGlzIGEgc2ltcGxlIGtleSB2YWx1ZSBwYWlyLCBzaW1pbGFyIHRvIG5vZGUua2V5OiB2YWx1ZSwgaGVyZSBpcyBhbiBleGFtcGxlOgorIworIyBub2RlLnJhY2s6IHJhY2szMTQKKworIyBCeSBkZWZhdWx0LCBtdWx0aXBsZSBub2RlcyBhcmUgYWxsb3dlZCB0byBzdGFydCBmcm9tIHRoZSBzYW1lIGluc3RhbGxhdGlvbiBsb2NhdGlvbgorIyB0byBkaXNhYmxlIGl0LCBzZXQgdGhlIGZvbGxvd2luZzoKKyMgbm9kZS5tYXhfbG9jYWxfc3RvcmFnZV9ub2RlczogMQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJbmRleCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBZb3UgY2FuIHNldCBhIG51bWJlciBvZiBvcHRpb25zIChzdWNoIGFzIHNoYXJkL3JlcGxpY2Egb3B0aW9ucywgbWFwcGluZworIyBvciBhbmFseXplciBkZWZpbml0aW9ucywgdHJhbnNsb2cgc2V0dGluZ3MsIC4uLikgZm9yIGluZGljZXMgZ2xvYmFsbHksCisjIGluIHRoaXMgZmlsZS4KKyMKKyMgTm90ZSwgdGhhdCBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGNvbmZpZ3VyZSBpbmRleCBzZXR0aW5ncyBzcGVjaWZpY2FsbHkgZm9yCisjIGEgY2VydGFpbiBpbmRleCwgZWl0aGVyIHdoZW4gY3JlYXRpbmcgaXQgb3IgYnkgdXNpbmcgdGhlIGluZGV4IHRlbXBsYXRlcyBBUEkuCisjCisjIFNlZSA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvaW5kZXgtbW9kdWxlcy5odG1sPiBhbmQKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L2luZGljZXMtY3JlYXRlLWluZGV4Lmh0bWw+CisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisjIFNldCB0aGUgbnVtYmVyIG9mIHNoYXJkcyAoc3BsaXRzKSBvZiBhbiBpbmRleCAoNSBieSBkZWZhdWx0KToKKyMKKyMgaW5kZXgubnVtYmVyX29mX3NoYXJkczogNQorCisjIFNldCB0aGUgbnVtYmVyIG9mIHJlcGxpY2FzIChhZGRpdGlvbmFsIGNvcGllcykgb2YgYW4gaW5kZXggKDEgYnkgZGVmYXVsdCk6CisjCisjIGluZGV4Lm51bWJlcl9vZl9yZXBsaWNhczogMQorCisjIE5vdGUsIHRoYXQgZm9yIGRldmVsb3BtZW50IG9uIGEgbG9jYWwgbWFjaGluZSwgd2l0aCBzbWFsbCBpbmRpY2VzLCBpdCB1c3VhbGx5CisjIG1ha2VzIHNlbnNlIHRvICJkaXNhYmxlIiB0aGUgZGlzdHJpYnV0ZWQgZmVhdHVyZXM6CisjCitpbmRleC5udW1iZXJfb2Zfc2hhcmRzOiAxCitpbmRleC5udW1iZXJfb2ZfcmVwbGljYXM6IDAKKworIyBUaGVzZSBzZXR0aW5ncyBkaXJlY3RseSBhZmZlY3QgdGhlIHBlcmZvcm1hbmNlIG9mIGluZGV4IGFuZCBzZWFyY2ggb3BlcmF0aW9ucworIyBpbiB5b3VyIGNsdXN0ZXIuIEFzc3VtaW5nIHlvdSBoYXZlIGVub3VnaCBtYWNoaW5lcyB0byBob2xkIHNoYXJkcyBhbmQKKyMgcmVwbGljYXMsIHRoZSBydWxlIG9mIHRodW1iIGlzOgorIworIyAxLiBIYXZpbmcgbW9yZSAqc2hhcmRzKiBlbmhhbmNlcyB0aGUgX2luZGV4aW5nXyBwZXJmb3JtYW5jZSBhbmQgYWxsb3dzIHRvCisjICAgIF9kaXN0cmlidXRlXyBhIGJpZyBpbmRleCBhY3Jvc3MgbWFjaGluZXMuCisjIDIuIEhhdmluZyBtb3JlICpyZXBsaWNhcyogZW5oYW5jZXMgdGhlIF9zZWFyY2hfIHBlcmZvcm1hbmNlIGFuZCBpbXByb3ZlcyB0aGUKKyMgICAgY2x1c3RlciBfYXZhaWxhYmlsaXR5Xy4KKyMKKyMgVGhlICJudW1iZXJfb2Zfc2hhcmRzIiBpcyBhIG9uZS10aW1lIHNldHRpbmcgZm9yIGFuIGluZGV4LgorIworIyBUaGUgIm51bWJlcl9vZl9yZXBsaWNhcyIgY2FuIGJlIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgYW55dGltZSwKKyMgYnkgdXNpbmcgdGhlIEluZGV4IFVwZGF0ZSBTZXR0aW5ncyBBUEkuCisjCisjIEVsYXN0aWNzZWFyY2ggdGFrZXMgY2FyZSBhYm91dCBsb2FkIGJhbGFuY2luZywgcmVsb2NhdGluZywgZ2F0aGVyaW5nIHRoZQorIyByZXN1bHRzIGZyb20gbm9kZXMsIGV0Yy4gRXhwZXJpbWVudCB3aXRoIGRpZmZlcmVudCBzZXR0aW5ncyB0byBmaW5lLXR1bmUKKyMgeW91ciBzZXR1cC4KKworIyBVc2UgdGhlIEluZGV4IFN0YXR1cyBBUEkgKDxodHRwOi8vbG9jYWxob3N0OjkyMDAvQS9fc3RhdHVzPikgdG8gaW5zcGVjdAorIyB0aGUgaW5kZXggc3RhdHVzLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBQYXRocyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gKHRoaXMgZmlsZSBhbmQgbG9nZ2luZy55bWwpOgorIworcGF0aC5jb25mOiAvc3JjL3Rlc3QvcmVzb3VyY2VzCisKKyMgUGF0aCB0byBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgaW5kZXggZGF0YSBhbGxvY2F0ZWQgZm9yIHRoaXMgbm9kZS4KKyMKK3BhdGguZGF0YTogdGFyZ2V0L2VzZGF0YQorIworIyBDYW4gb3B0aW9uYWxseSBpbmNsdWRlIG1vcmUgdGhhbiBvbmUgbG9jYXRpb24sIGNhdXNpbmcgZGF0YSB0byBiZSBzdHJpcGVkIGFjcm9zcworIyB0aGUgbG9jYXRpb25zIChhIGxhIFJBSUQgMCkgb24gYSBmaWxlIGxldmVsLCBmYXZvdXJpbmcgbG9jYXRpb25zIHdpdGggbW9zdCBmcmVlCisjIHNwYWNlIG9uIGNyZWF0aW9uLiBGb3IgZXhhbXBsZToKKyMKKyMgcGF0aC5kYXRhOiAvcGF0aC90by9kYXRhMSwvcGF0aC90by9kYXRhMgorCisjIFBhdGggdG8gdGVtcG9yYXJ5IGZpbGVzOgorIworcGF0aC53b3JrOiAvdGFyZ2V0L2Vzd29yaworCisjIFBhdGggdG8gbG9nIGZpbGVzOgorIworcGF0aC5sb2dzOiAvdGFyZ2V0L2VzbG9ncworCisjIFBhdGggdG8gd2hlcmUgcGx1Z2lucyBhcmUgaW5zdGFsbGVkOgorIworIyBwYXRoLnBsdWdpbnM6IC9wYXRoL3RvL3BsdWdpbnMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUGx1Z2luICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSWYgYSBwbHVnaW4gbGlzdGVkIGhlcmUgaXMgbm90IGluc3RhbGxlZCBmb3IgY3VycmVudCBub2RlLCB0aGUgbm9kZSB3aWxsIG5vdCBzdGFydC4KKyMKKyMgcGx1Z2luLm1hbmRhdG9yeTogbWFwcGVyLWF0dGFjaG1lbnRzLGxhbmctZ3Jvb3Z5CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTWVtb3J5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEVsYXN0aWNzZWFyY2ggcGVyZm9ybXMgcG9vcmx5IHdoZW4gSlZNIHN0YXJ0cyBzd2FwcGluZzogeW91IHNob3VsZCBlbnN1cmUgdGhhdAorIyBpdCBfbmV2ZXJfIHN3YXBzLgorIworIyBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGxvY2sgdGhlIG1lbW9yeToKKyMKKyMgYm9vdHN0cmFwLm1sb2NrYWxsOiB0cnVlCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIEVTX01JTl9NRU0gYW5kIEVTX01BWF9NRU0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKKyMgdG8gdGhlIHNhbWUgdmFsdWUsIGFuZCB0aGF0IHRoZSBtYWNoaW5lIGhhcyBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlCisjIGZvciBFbGFzdGljc2VhcmNoLCBsZWF2aW5nIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGl0c2VsZi4KKyMKKyMgWW91IHNob3VsZCBhbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBFbGFzdGljc2VhcmNoIHByb2Nlc3MgaXMgYWxsb3dlZCB0byBsb2NrCisjIHRoZSBtZW1vcnksIGVnLiBieSB1c2luZyBgdWxpbWl0IC1sIHVubGltaXRlZGAuCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5ldHdvcmsgQW5kIEhUVFAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEVsYXN0aWNzZWFyY2gsIGJ5IGRlZmF1bHQsIGJpbmRzIGl0c2VsZiB0byB0aGUgMC4wLjAuMCBhZGRyZXNzLCBhbmQgbGlzdGVucworIyBvbiBwb3J0IFs5MjAwLTkzMDBdIGZvciBIVFRQIHRyYWZmaWMgYW5kIG9uIHBvcnQgWzkzMDAtOTQwMF0gZm9yIG5vZGUtdG8tbm9kZQorIyBjb21tdW5pY2F0aW9uLiAodGhlIHJhbmdlIG1lYW5zIHRoYXQgaWYgdGhlIHBvcnQgaXMgYnVzeSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5CisjIHRyeSB0aGUgbmV4dCBwb3J0KS4KKworIyBTZXQgdGhlIGJpbmQgYWRkcmVzcyBzcGVjaWZpY2FsbHkgKElQdjQgb3IgSVB2Nik6CisjCisjIG5ldHdvcmsuYmluZF9ob3N0OiAxOTIuMTY4LjAuMQorCisjIFNldCB0aGUgYWRkcmVzcyBvdGhlciBub2RlcyB3aWxsIHVzZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoaXMgbm9kZS4gSWYgbm90CisjIHNldCwgaXQgaXMgYXV0b21hdGljYWxseSBkZXJpdmVkLiBJdCBtdXN0IHBvaW50IHRvIGFuIGFjdHVhbCBJUCBhZGRyZXNzLgorIworIyBuZXR3b3JrLnB1Ymxpc2hfaG9zdDogMTkyLjE2OC4wLjEKKworIyBTZXQgYm90aCAnYmluZF9ob3N0JyBhbmQgJ3B1Ymxpc2hfaG9zdCc6CisjCisjIG5ldHdvcmsuaG9zdDogMTkyLjE2OC4wLjEKKworIyBTZXQgYSBjdXN0b20gcG9ydCBmb3IgdGhlIG5vZGUgdG8gbm9kZSBjb21tdW5pY2F0aW9uICg5MzAwIGJ5IGRlZmF1bHQpOgorIworIyB0cmFuc3BvcnQudGNwLnBvcnQ6IDkzMDAKKworIyBFbmFibGUgY29tcHJlc3Npb24gZm9yIGFsbCBjb21tdW5pY2F0aW9uIGJldHdlZW4gbm9kZXMgKGRpc2FibGVkIGJ5IGRlZmF1bHQpOgorIworIyB0cmFuc3BvcnQudGNwLmNvbXByZXNzOiB0cnVlCisKKyMgU2V0IGEgY3VzdG9tIHBvcnQgdG8gbGlzdGVuIGZvciBIVFRQIHRyYWZmaWM6CisjCisjIGh0dHAucG9ydDogOTIwMAorCisjIFNldCBhIGN1c3RvbSBhbGxvd2VkIGNvbnRlbnQgbGVuZ3RoOgorIworIyBodHRwLm1heF9jb250ZW50X2xlbmd0aDogMTAwbWIKKworIyBEaXNhYmxlIEhUVFAgY29tcGxldGVseToKKyMKKyMgaHR0cC5lbmFibGVkOiBmYWxzZQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdhdGV3YXkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGUgZ2F0ZXdheSBhbGxvd3MgZm9yIHBlcnNpc3RpbmcgdGhlIGNsdXN0ZXIgc3RhdGUgYmV0d2VlbiBmdWxsIGNsdXN0ZXIKKyMgcmVzdGFydHMuIEV2ZXJ5IGNoYW5nZSB0byB0aGUgc3RhdGUgKHN1Y2ggYXMgYWRkaW5nIGFuIGluZGV4KSB3aWxsIGJlIHN0b3JlZAorIyBpbiB0aGUgZ2F0ZXdheSwgYW5kIHdoZW4gdGhlIGNsdXN0ZXIgc3RhcnRzIHVwIGZvciB0aGUgZmlyc3QgdGltZSwKKyMgaXQgd2lsbCByZWFkIGl0cyBzdGF0ZSBmcm9tIHRoZSBnYXRld2F5LgorCisjIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIGdhdGV3YXkgaW1wbGVtZW50YXRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzLWdhdGV3YXkuaHRtbD4uCisKKyMgVGhlIGRlZmF1bHQgZ2F0ZXdheSB0eXBlIGlzIHRoZSAibG9jYWwiIGdhdGV3YXkgKHJlY29tbWVuZGVkKToKKyMKKyMgZ2F0ZXdheS50eXBlOiBsb2NhbAorCisjIFNldHRpbmdzIGJlbG93IGNvbnRyb2wgaG93IGFuZCB3aGVuIHRvIHN0YXJ0IHRoZSBpbml0aWFsIHJlY292ZXJ5IHByb2Nlc3Mgb24KKyMgYSBmdWxsIGNsdXN0ZXIgcmVzdGFydCAodG8gcmV1c2UgYXMgbXVjaCBsb2NhbCBkYXRhIGFzIHBvc3NpYmxlIHdoZW4gdXNpbmcgc2hhcmVkCisjIGdhdGV3YXkpLgorCisjIEFsbG93IHJlY292ZXJ5IHByb2Nlc3MgYWZ0ZXIgTiBub2RlcyBpbiBhIGNsdXN0ZXIgYXJlIHVwOgorIworZ2F0ZXdheS5yZWNvdmVyX2FmdGVyX25vZGVzOiAxCisKKyMgU2V0IHRoZSB0aW1lb3V0IHRvIGluaXRpYXRlIHRoZSByZWNvdmVyeSBwcm9jZXNzLCBvbmNlIHRoZSBOIG5vZGVzCisjIGZyb20gcHJldmlvdXMgc2V0dGluZyBhcmUgdXAgKGFjY2VwdHMgdGltZSB2YWx1ZSk6CisjCisjIGdhdGV3YXkucmVjb3Zlcl9hZnRlcl90aW1lOiA1bQorCisjIFNldCBob3cgbWFueSBub2RlcyBhcmUgZXhwZWN0ZWQgaW4gdGhpcyBjbHVzdGVyLiBPbmNlIHRoZXNlIE4gbm9kZXMKKyMgYXJlIHVwIChhbmQgcmVjb3Zlcl9hZnRlcl9ub2RlcyBpcyBtZXQpLCBiZWdpbiByZWNvdmVyeSBwcm9jZXNzIGltbWVkaWF0ZWx5CisjICh3aXRob3V0IHdhaXRpbmcgZm9yIHJlY292ZXJfYWZ0ZXJfdGltZSB0byBleHBpcmUpOgorIworZ2F0ZXdheS5leHBlY3RlZF9ub2RlczogMQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJlY292ZXJ5IFRocm90dGxpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGVzZSBzZXR0aW5ncyBhbGxvdyB0byBjb250cm9sIHRoZSBwcm9jZXNzIG9mIHNoYXJkcyBhbGxvY2F0aW9uIGJldHdlZW4KKyMgbm9kZXMgZHVyaW5nIGluaXRpYWwgcmVjb3ZlcnksIHJlcGxpY2EgYWxsb2NhdGlvbiwgcmViYWxhbmNpbmcsCisjIG9yIHdoZW4gYWRkaW5nIGFuZCByZW1vdmluZyBub2Rlcy4KKworIyBTZXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHJlY292ZXJpZXMgaGFwcGVuaW5nIG9uIGEgbm9kZToKKyMKKyMgMS4gRHVyaW5nIHRoZSBpbml0aWFsIHJlY292ZXJ5CisjCisjIGNsdXN0ZXIucm91dGluZy5hbGxvY2F0aW9uLm5vZGVfaW5pdGlhbF9wcmltYXJpZXNfcmVjb3ZlcmllczogNAorIworIyAyLiBEdXJpbmcgYWRkaW5nL3JlbW92aW5nIG5vZGVzLCByZWJhbGFuY2luZywgZXRjCisjCisjIGNsdXN0ZXIucm91dGluZy5hbGxvY2F0aW9uLm5vZGVfY29uY3VycmVudF9yZWNvdmVyaWVzOiAyCisKKyMgU2V0IHRvIHRocm90dGxlIHRocm91Z2hwdXQgd2hlbiByZWNvdmVyaW5nIChlZy4gMTAwbWIsIGJ5IGRlZmF1bHQgMjBtYik6CisjCisjIGluZGljZXMucmVjb3ZlcnkubWF4X2J5dGVzX3Blcl9zZWM6IDIwbWIKKworIyBTZXQgdG8gbGltaXQgdGhlIG51bWJlciBvZiBvcGVuIGNvbmN1cnJlbnQgc3RyZWFtcyB3aGVuCisjIHJlY292ZXJpbmcgYSBzaGFyZCBmcm9tIGEgcGVlcjoKKyMKKyMgaW5kaWNlcy5yZWNvdmVyeS5jb25jdXJyZW50X3N0cmVhbXM6IDUKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERpc2NvdmVyeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRGlzY292ZXJ5IGluZnJhc3RydWN0dXJlIGVuc3VyZXMgbm9kZXMgY2FuIGJlIGZvdW5kIHdpdGhpbiBhIGNsdXN0ZXIKKyMgYW5kIG1hc3RlciBub2RlIGlzIGVsZWN0ZWQuIE11bHRpY2FzdCBkaXNjb3ZlcnkgaXMgdGhlIGRlZmF1bHQuCisKKyMgU2V0IHRvIGVuc3VyZSBhIG5vZGUgc2VlcyBOIG90aGVyIG1hc3RlciBlbGlnaWJsZSBub2RlcyB0byBiZSBjb25zaWRlcmVkCisjIG9wZXJhdGlvbmFsIHdpdGhpbiB0aGUgY2x1c3Rlci4gSXRzIHJlY29tbWVuZGVkIHRvIHNldCBpdCB0byBhIGhpZ2hlciB2YWx1ZQorIyB0aGFuIDEgd2hlbiBydW5uaW5nIG1vcmUgdGhhbiAyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorIworIyBkaXNjb3ZlcnkuemVuLm1pbmltdW1fbWFzdGVyX25vZGVzOiAxCisKKyMgU2V0IHRoZSB0aW1lIHRvIHdhaXQgZm9yIHBpbmcgcmVzcG9uc2VzIGZyb20gb3RoZXIgbm9kZXMgd2hlbiBkaXNjb3ZlcmluZy4KKyMgU2V0IHRoaXMgb3B0aW9uIHRvIGEgaGlnaGVyIHZhbHVlIG9uIGEgc2xvdyBvciBjb25nZXN0ZWQgbmV0d29yaworIyB0byBtaW5pbWl6ZSBkaXNjb3ZlcnkgZmFpbHVyZXM6CisjCisjIGRpc2NvdmVyeS56ZW4ucGluZy50aW1lb3V0OiAzcworCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMtZGlzY292ZXJ5LXplbi5odG1sPgorCisjIFVuaWNhc3QgZGlzY292ZXJ5IGFsbG93cyB0byBleHBsaWNpdGx5IGNvbnRyb2wgd2hpY2ggbm9kZXMgd2lsbCBiZSB1c2VkCisjIHRvIGRpc2NvdmVyIHRoZSBjbHVzdGVyLiBJdCBjYW4gYmUgdXNlZCB3aGVuIG11bHRpY2FzdCBpcyBub3QgcHJlc2VudCwKKyMgb3IgdG8gcmVzdHJpY3QgdGhlIGNsdXN0ZXIgY29tbXVuaWNhdGlvbi13aXNlLgorIworIyAxLiBEaXNhYmxlIG11bHRpY2FzdCBkaXNjb3ZlcnkgKGVuYWJsZWQgYnkgZGVmYXVsdCk6CisjCisjIGRpc2NvdmVyeS56ZW4ucGluZy5tdWx0aWNhc3QuZW5hYmxlZDogZmFsc2UKKyMKKyMgMi4gQ29uZmlndXJlIGFuIGluaXRpYWwgbGlzdCBvZiBtYXN0ZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIKKyMgICAgdG8gcGVyZm9ybSBkaXNjb3Zlcnkgd2hlbiBuZXcgbm9kZXMgKG1hc3RlciBvciBkYXRhKSBhcmUgc3RhcnRlZDoKKyMKKyMgZGlzY292ZXJ5Lnplbi5waW5nLnVuaWNhc3QuaG9zdHM6IFsiaG9zdDEiLCAiaG9zdDI6cG9ydCJdCisKKyMgRUMyIGRpc2NvdmVyeSBhbGxvd3MgdG8gdXNlIEFXUyBFQzIgQVBJIGluIG9yZGVyIHRvIHBlcmZvcm0gZGlzY292ZXJ5LgorIworIyBZb3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBjbG91ZC1hd3MgcGx1Z2luIGZvciBlbmFibGluZyB0aGUgRUMyIGRpc2NvdmVyeS4KKyMKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy1kaXNjb3ZlcnktZWMyLmh0bWw+CisjCisjIFNlZSA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL3R1dG9yaWFscy9lbGFzdGljc2VhcmNoLW9uLWVjMi8+CisjIGZvciBhIHN0ZXAtYnktc3RlcCB0dXRvcmlhbC4KKworIyBHQ0UgZGlzY292ZXJ5IGFsbG93cyB0byB1c2UgR29vZ2xlIENvbXB1dGUgRW5naW5lIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGRpc2NvdmVyeS4KKyMKKyMgWW91IGhhdmUgdG8gaW5zdGFsbCB0aGUgY2xvdWQtZ2NlIHBsdWdpbiBmb3IgZW5hYmxpbmcgdGhlIEdDRSBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9lbGFzdGljc2VhcmNoL2VsYXN0aWNzZWFyY2gtY2xvdWQtZ2NlPi4KKworIyBBenVyZSBkaXNjb3ZlcnkgYWxsb3dzIHRvIHVzZSBBenVyZSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBkaXNjb3ZlcnkuCisjCisjIFlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGNsb3VkLWF6dXJlIHBsdWdpbiBmb3IgZW5hYmxpbmcgdGhlIEF6dXJlIGRpc2NvdmVyeS4KKyMKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8aHR0cHM6Ly9naXRodWIuY29tL2VsYXN0aWNzZWFyY2gvZWxhc3RpY3NlYXJjaC1jbG91ZC1henVyZT4uCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU2xvdyBMb2cgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFNoYXJkIGxldmVsIHF1ZXJ5IGFuZCBmZXRjaCB0aHJlc2hvbGQgbG9nZ2luZy4KKworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5xdWVyeS53YXJuOiAxMHMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQucXVlcnkuaW5mbzogNXMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQucXVlcnkuZGVidWc6IDJzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LnRyYWNlOiA1MDBtcworCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLmZldGNoLndhcm46IDFzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLmZldGNoLmluZm86IDgwMG1zCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLmZldGNoLmRlYnVnOiA1MDBtcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC50cmFjZTogMjAwbXMKKworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4Lndhcm46IDEwcworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LmluZm86IDVzCisjaW5kZXguaW5kZXhpbmcuc2xvd2xvZy50aHJlc2hvbGQuaW5kZXguZGVidWc6IDJzCisjaW5kZXguaW5kZXhpbmcuc2xvd2xvZy50aHJlc2hvbGQuaW5kZXgudHJhY2U6IDUwMG1zCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0MgTG9nZ2luZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjbW9uaXRvci5qdm0uZ2MueW91bmcud2FybjogMTAwMG1zCisjbW9uaXRvci5qdm0uZ2MueW91bmcuaW5mbzogNzAwbXMKKyNtb25pdG9yLmp2bS5nYy55b3VuZy5kZWJ1ZzogNDAwbXMKKworI21vbml0b3IuanZtLmdjLm9sZC53YXJuOiAxMHMKKyNtb25pdG9yLmp2bS5nYy5vbGQuaW5mbzogNXMKKyNtb25pdG9yLmp2bS5nYy5vbGQuZGVidWc6IDJzCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9lbGFzdGljc2VhcmNoLnltbC5iYWsgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvZWxhc3RpY3NlYXJjaC55bWwuYmFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YzY4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvZWxhc3RpY3NlYXJjaC55bWwuYmFrCkBAIC0wLDAgKzEsMzg3IEBACisKK2NsdXN0ZXIubmFtZTogZWxhc3RpY3NlYXJjaF9wYXZlbAorICAKK2Rpc2NvdmVyeS56ZW4ucGluZy5tdWx0aWNhc3QuZW5hYmxlZDogZmFsc2UKK2Rpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0LmVuYWJsZWQ6IHRydWUKK2Rpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0Lmhvc3RzOiBlbGFzdGljc2VhcmNoX2hvc3QKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFbGFzdGljc2VhcmNoIENvbmZpZ3VyYXRpb24gRXhhbXBsZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGlzIGZpbGUgY29udGFpbnMgYW4gb3ZlcnZpZXcgb2YgdmFyaW91cyBjb25maWd1cmF0aW9uIHNldHRpbmdzLAorIyB0YXJnZXRlZCBhdCBvcGVyYXRpb25zIHN0YWZmLiBBcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHNob3VsZAorIyBjb25zdWx0IHRoZSBndWlkZSBhdCA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlPi4KKyMKKyMgVGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgaXMgY292ZXJlZCBhdAorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAuaHRtbD4uCisjCisjIEVsYXN0aWNzZWFyY2ggY29tZXMgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBtb3N0IHNldHRpbmdzLAorIyBzbyB5b3UgY2FuIHRyeSBpdCBvdXQgd2l0aG91dCBib3RoZXJpbmcgd2l0aCBjb25maWd1cmF0aW9uLgorIworIyBNb3N0IG9mIHRoZSB0aW1lLCB0aGVzZSBkZWZhdWx0cyBhcmUganVzdCBmaW5lIGZvciBydW5uaW5nIGEgcHJvZHVjdGlvbgorIyBjbHVzdGVyLiBJZiB5b3UncmUgZmluZS10dW5pbmcgeW91ciBjbHVzdGVyLCBvciB3b25kZXJpbmcgYWJvdXQgdGhlCisjIGVmZmVjdCBvZiBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBwbGVhc2UgX2RvIGFza18gb24gdGhlCisjIG1haWxpbmcgbGlzdCBvciBJUkMgY2hhbm5lbCBbaHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2NvbW11bml0eV0uCisKKyMgQW55IGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHJlcGxhY2VkIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzCisjIGJ5IHBsYWNpbmcgdGhlbSBpbiAkey4uLn0gbm90YXRpb24uIEZvciBleGFtcGxlOgorIworIyBub2RlLnJhY2s6ICR7UkFDS19FTlZfVkFSfQorCisjIEZvciBpbmZvcm1hdGlvbiBvbiBzdXBwb3J0ZWQgZm9ybWF0cyBhbmQgc3ludGF4IGZvciB0aGUgY29uZmlnIGZpbGUsIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAtY29uZmlndXJhdGlvbi5odG1sPgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENsdXN0ZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDbHVzdGVyIG5hbWUgaWRlbnRpZmllcyB5b3VyIGNsdXN0ZXIgZm9yIGF1dG8tZGlzY292ZXJ5LiBJZiB5b3UncmUgcnVubmluZworIyBtdWx0aXBsZSBjbHVzdGVycyBvbiB0aGUgc2FtZSBuZXR3b3JrLCBtYWtlIHN1cmUgeW91J3JlIHVzaW5nIHVuaXF1ZSBuYW1lcy4KKyMKKyMgY2x1c3Rlci5uYW1lOiBlbGFzdGljc2VhcmNoCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vZGUgbmFtZXMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBvbiBzdGFydHVwLCBzbyB5b3UncmUgcmVsaWV2ZWQKKyMgZnJvbSBjb25maWd1cmluZyB0aGVtIG1hbnVhbGx5LiBZb3UgY2FuIHRpZSB0aGlzIG5vZGUgdG8gYSBzcGVjaWZpYyBuYW1lOgorIworIyBub2RlLm5hbWU6ICJGcmFueiBLYWZrYSIKKworIyBFdmVyeSBub2RlIGNhbiBiZSBjb25maWd1cmVkIHRvIGFsbG93IG9yIGRlbnkgYmVpbmcgZWxpZ2libGUgYXMgdGhlIG1hc3RlciwKKyMgYW5kIHRvIGFsbG93IG9yIGRlbnkgdG8gc3RvcmUgdGhlIGRhdGEuCisjCisjIEFsbG93IHRoaXMgbm9kZSB0byBiZSBlbGlnaWJsZSBhcyBhIG1hc3RlciBub2RlIChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBub2RlLm1hc3RlcjogdHJ1ZQorIworIyBBbGxvdyB0aGlzIG5vZGUgdG8gc3RvcmUgZGF0YSAoZW5hYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgbm9kZS5kYXRhOiB0cnVlCisKKyMgWW91IGNhbiBleHBsb2l0IHRoZXNlIHNldHRpbmdzIHRvIGRlc2lnbiBhZHZhbmNlZCBjbHVzdGVyIHRvcG9sb2dpZXMuCisjCisjIDEuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBuZXZlciBiZWNvbWUgYSBtYXN0ZXIgbm9kZSwgb25seSB0byBob2xkIGRhdGEuCisjICAgIFRoaXMgd2lsbCBiZSB0aGUgIndvcmtob3JzZSIgb2YgeW91ciBjbHVzdGVyLgorIworIyBub2RlLm1hc3RlcjogZmFsc2UKKyMgbm9kZS5kYXRhOiB0cnVlCisjCisjIDIuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBvbmx5IHNlcnZlIGFzIGEgbWFzdGVyOiB0byBub3Qgc3RvcmUgYW55IGRhdGEgYW5kCisjICAgIHRvIGhhdmUgZnJlZSByZXNvdXJjZXMuIFRoaXMgd2lsbCBiZSB0aGUgImNvb3JkaW5hdG9yIiBvZiB5b3VyIGNsdXN0ZXIuCisjCisjIG5vZGUubWFzdGVyOiB0cnVlCisjIG5vZGUuZGF0YTogZmFsc2UKKyMKKyMgMy4gWW91IHdhbnQgdGhpcyBub2RlIHRvIGJlIG5laXRoZXIgbWFzdGVyIG5vciBkYXRhIG5vZGUsIGJ1dAorIyAgICB0byBhY3QgYXMgYSAic2VhcmNoIGxvYWQgYmFsYW5jZXIiIChmZXRjaGluZyBkYXRhIGZyb20gbm9kZXMsCisjICAgIGFnZ3JlZ2F0aW5nIHJlc3VsdHMsIGV0Yy4pCisjCisjIG5vZGUubWFzdGVyOiBmYWxzZQorIyBub2RlLmRhdGE6IGZhbHNlCisKKyMgVXNlIHRoZSBDbHVzdGVyIEhlYWx0aCBBUEkgW2h0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fY2x1c3Rlci9oZWFsdGhdLCB0aGUKKyMgTm9kZSBJbmZvIEFQSSBbaHR0cDovL2xvY2FsaG9zdDo5MjAwL19ub2Rlc10gb3IgR1VJIHRvb2xzCisjIHN1Y2ggYXMgPGh0dHA6Ly93d3cuZWxhc3RpY3NlYXJjaC5vcmcvb3ZlcnZpZXcvbWFydmVsLz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9rYXJtaS9lbGFzdGljc2VhcmNoLXBhcmFtZWRpYz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9sdWthcy12bGNlay9iaWdkZXNrPiBhbmQKKyMgPGh0dHA6Ly9tb2J6LmdpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC1oZWFkPiB0byBpbnNwZWN0IHRoZSBjbHVzdGVyIHN0YXRlLgorCisjIEEgbm9kZSBjYW4gaGF2ZSBnZW5lcmljIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCB3aGljaCBjYW4gbGF0ZXIgYmUgdXNlZAorIyBmb3IgY3VzdG9taXplZCBzaGFyZCBhbGxvY2F0aW9uIGZpbHRlcmluZywgb3IgYWxsb2NhdGlvbiBhd2FyZW5lc3MuIEFuIGF0dHJpYnV0ZQorIyBpcyBhIHNpbXBsZSBrZXkgdmFsdWUgcGFpciwgc2ltaWxhciB0byBub2RlLmtleTogdmFsdWUsIGhlcmUgaXMgYW4gZXhhbXBsZToKKyMKKyMgbm9kZS5yYWNrOiByYWNrMzE0CisKKyMgQnkgZGVmYXVsdCwgbXVsdGlwbGUgbm9kZXMgYXJlIGFsbG93ZWQgdG8gc3RhcnQgZnJvbSB0aGUgc2FtZSBpbnN0YWxsYXRpb24gbG9jYXRpb24KKyMgdG8gZGlzYWJsZSBpdCwgc2V0IHRoZSBmb2xsb3dpbmc6CisjIG5vZGUubWF4X2xvY2FsX3N0b3JhZ2Vfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSW5kZXggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgWW91IGNhbiBzZXQgYSBudW1iZXIgb2Ygb3B0aW9ucyAoc3VjaCBhcyBzaGFyZC9yZXBsaWNhIG9wdGlvbnMsIG1hcHBpbmcKKyMgb3IgYW5hbHl6ZXIgZGVmaW5pdGlvbnMsIHRyYW5zbG9nIHNldHRpbmdzLCAuLi4pIGZvciBpbmRpY2VzIGdsb2JhbGx5LAorIyBpbiB0aGlzIGZpbGUuCisjCisjIE5vdGUsIHRoYXQgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBjb25maWd1cmUgaW5kZXggc2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvcgorIyBhIGNlcnRhaW4gaW5kZXgsIGVpdGhlciB3aGVuIGNyZWF0aW5nIGl0IG9yIGJ5IHVzaW5nIHRoZSBpbmRleCB0ZW1wbGF0ZXMgQVBJLgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L2luZGV4LW1vZHVsZXMuaHRtbD4gYW5kCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9pbmRpY2VzLWNyZWF0ZS1pbmRleC5odG1sPgorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBTZXQgdGhlIG51bWJlciBvZiBzaGFyZHMgKHNwbGl0cykgb2YgYW4gaW5kZXggKDUgYnkgZGVmYXVsdCk6CisjCisjIGluZGV4Lm51bWJlcl9vZl9zaGFyZHM6IDUKKworIyBTZXQgdGhlIG51bWJlciBvZiByZXBsaWNhcyAoYWRkaXRpb25hbCBjb3BpZXMpIG9mIGFuIGluZGV4ICgxIGJ5IGRlZmF1bHQpOgorIworIyBpbmRleC5udW1iZXJfb2ZfcmVwbGljYXM6IDEKKworIyBOb3RlLCB0aGF0IGZvciBkZXZlbG9wbWVudCBvbiBhIGxvY2FsIG1hY2hpbmUsIHdpdGggc21hbGwgaW5kaWNlcywgaXQgdXN1YWxseQorIyBtYWtlcyBzZW5zZSB0byAiZGlzYWJsZSIgdGhlIGRpc3RyaWJ1dGVkIGZlYXR1cmVzOgorIworaW5kZXgubnVtYmVyX29mX3NoYXJkczogMQoraW5kZXgubnVtYmVyX29mX3JlcGxpY2FzOiAwCisKKyMgVGhlc2Ugc2V0dGluZ3MgZGlyZWN0bHkgYWZmZWN0IHRoZSBwZXJmb3JtYW5jZSBvZiBpbmRleCBhbmQgc2VhcmNoIG9wZXJhdGlvbnMKKyMgaW4geW91ciBjbHVzdGVyLiBBc3N1bWluZyB5b3UgaGF2ZSBlbm91Z2ggbWFjaGluZXMgdG8gaG9sZCBzaGFyZHMgYW5kCisjIHJlcGxpY2FzLCB0aGUgcnVsZSBvZiB0aHVtYiBpczoKKyMKKyMgMS4gSGF2aW5nIG1vcmUgKnNoYXJkcyogZW5oYW5jZXMgdGhlIF9pbmRleGluZ18gcGVyZm9ybWFuY2UgYW5kIGFsbG93cyB0bworIyAgICBfZGlzdHJpYnV0ZV8gYSBiaWcgaW5kZXggYWNyb3NzIG1hY2hpbmVzLgorIyAyLiBIYXZpbmcgbW9yZSAqcmVwbGljYXMqIGVuaGFuY2VzIHRoZSBfc2VhcmNoXyBwZXJmb3JtYW5jZSBhbmQgaW1wcm92ZXMgdGhlCisjICAgIGNsdXN0ZXIgX2F2YWlsYWJpbGl0eV8uCisjCisjIFRoZSAibnVtYmVyX29mX3NoYXJkcyIgaXMgYSBvbmUtdGltZSBzZXR0aW5nIGZvciBhbiBpbmRleC4KKyMKKyMgVGhlICJudW1iZXJfb2ZfcmVwbGljYXMiIGNhbiBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGFueXRpbWUsCisjIGJ5IHVzaW5nIHRoZSBJbmRleCBVcGRhdGUgU2V0dGluZ3MgQVBJLgorIworIyBFbGFzdGljc2VhcmNoIHRha2VzIGNhcmUgYWJvdXQgbG9hZCBiYWxhbmNpbmcsIHJlbG9jYXRpbmcsIGdhdGhlcmluZyB0aGUKKyMgcmVzdWx0cyBmcm9tIG5vZGVzLCBldGMuIEV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgdG8gZmluZS10dW5lCisjIHlvdXIgc2V0dXAuCisKKyMgVXNlIHRoZSBJbmRleCBTdGF0dXMgQVBJICg8aHR0cDovL2xvY2FsaG9zdDo5MjAwL0EvX3N0YXR1cz4pIHRvIGluc3BlY3QKKyMgdGhlIGluZGV4IHN0YXR1cy4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUGF0aHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgUGF0aCB0byBkaXJlY3RvcnkgY29udGFpbmluZyBjb25maWd1cmF0aW9uICh0aGlzIGZpbGUgYW5kIGxvZ2dpbmcueW1sKToKKyMKK3BhdGguY29uZjogL3NyYy90ZXN0L3Jlc291cmNlcworCisjIFBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGluZGV4IGRhdGEgYWxsb2NhdGVkIGZvciB0aGlzIG5vZGUuCisjCitwYXRoLmRhdGE6IHRhcmdldC9lc2RhdGEKKyMKKyMgQ2FuIG9wdGlvbmFsbHkgaW5jbHVkZSBtb3JlIHRoYW4gb25lIGxvY2F0aW9uLCBjYXVzaW5nIGRhdGEgdG8gYmUgc3RyaXBlZCBhY3Jvc3MKKyMgdGhlIGxvY2F0aW9ucyAoYSBsYSBSQUlEIDApIG9uIGEgZmlsZSBsZXZlbCwgZmF2b3VyaW5nIGxvY2F0aW9ucyB3aXRoIG1vc3QgZnJlZQorIyBzcGFjZSBvbiBjcmVhdGlvbi4gRm9yIGV4YW1wbGU6CisjCisjIHBhdGguZGF0YTogL3BhdGgvdG8vZGF0YTEsL3BhdGgvdG8vZGF0YTIKKworIyBQYXRoIHRvIHRlbXBvcmFyeSBmaWxlczoKKyMKK3BhdGgud29yazogL3RhcmdldC9lc3dvcmsKKworIyBQYXRoIHRvIGxvZyBmaWxlczoKKyMKK3BhdGgubG9nczogL3RhcmdldC9lc2xvZ3MKKworIyBQYXRoIHRvIHdoZXJlIHBsdWdpbnMgYXJlIGluc3RhbGxlZDoKKyMKKyMgcGF0aC5wbHVnaW5zOiAvcGF0aC90by9wbHVnaW5zCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBsdWdpbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIElmIGEgcGx1Z2luIGxpc3RlZCBoZXJlIGlzIG5vdCBpbnN0YWxsZWQgZm9yIGN1cnJlbnQgbm9kZSwgdGhlIG5vZGUgd2lsbCBub3Qgc3RhcnQuCisjCisjIHBsdWdpbi5tYW5kYXRvcnk6IG1hcHBlci1hdHRhY2htZW50cyxsYW5nLWdyb292eQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1lbW9yeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoIHBlcmZvcm1zIHBvb3JseSB3aGVuIEpWTSBzdGFydHMgc3dhcHBpbmc6IHlvdSBzaG91bGQgZW5zdXJlIHRoYXQKKyMgaXQgX25ldmVyXyBzd2Fwcy4KKyMKKyMgU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBsb2NrIHRoZSBtZW1vcnk6CisjCisjIGJvb3RzdHJhcC5tbG9ja2FsbDogdHJ1ZQorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBFU19NSU5fTUVNIGFuZCBFU19NQVhfTUVNIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CisjIHRvIHRoZSBzYW1lIHZhbHVlLCBhbmQgdGhhdCB0aGUgbWFjaGluZSBoYXMgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZQorIyBmb3IgRWxhc3RpY3NlYXJjaCwgbGVhdmluZyBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpdHNlbGYuCisjCisjIFlvdSBzaG91bGQgYWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgRWxhc3RpY3NlYXJjaCBwcm9jZXNzIGlzIGFsbG93ZWQgdG8gbG9jaworIyB0aGUgbWVtb3J5LCBlZy4gYnkgdXNpbmcgYHVsaW1pdCAtbCB1bmxpbWl0ZWRgLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOZXR3b3JrIEFuZCBIVFRQICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoLCBieSBkZWZhdWx0LCBiaW5kcyBpdHNlbGYgdG8gdGhlIDAuMC4wLjAgYWRkcmVzcywgYW5kIGxpc3RlbnMKKyMgb24gcG9ydCBbOTIwMC05MzAwXSBmb3IgSFRUUCB0cmFmZmljIGFuZCBvbiBwb3J0IFs5MzAwLTk0MDBdIGZvciBub2RlLXRvLW5vZGUKKyMgY29tbXVuaWNhdGlvbi4gKHRoZSByYW5nZSBtZWFucyB0aGF0IGlmIHRoZSBwb3J0IGlzIGJ1c3ksIGl0IHdpbGwgYXV0b21hdGljYWxseQorIyB0cnkgdGhlIG5leHQgcG9ydCkuCisKKyMgU2V0IHRoZSBiaW5kIGFkZHJlc3Mgc3BlY2lmaWNhbGx5IChJUHY0IG9yIElQdjYpOgorIworIyBuZXR3b3JrLmJpbmRfaG9zdDogMTkyLjE2OC4wLjEKKworIyBTZXQgdGhlIGFkZHJlc3Mgb3RoZXIgbm9kZXMgd2lsbCB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzIG5vZGUuIElmIG5vdAorIyBzZXQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZGVyaXZlZC4gSXQgbXVzdCBwb2ludCB0byBhbiBhY3R1YWwgSVAgYWRkcmVzcy4KKyMKKyMgbmV0d29yay5wdWJsaXNoX2hvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGJvdGggJ2JpbmRfaG9zdCcgYW5kICdwdWJsaXNoX2hvc3QnOgorIworIyBuZXR3b3JrLmhvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGEgY3VzdG9tIHBvcnQgZm9yIHRoZSBub2RlIHRvIG5vZGUgY29tbXVuaWNhdGlvbiAoOTMwMCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5wb3J0OiA5MzAwCisKKyMgRW5hYmxlIGNvbXByZXNzaW9uIGZvciBhbGwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG5vZGVzIChkaXNhYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5jb21wcmVzczogdHJ1ZQorCisjIFNldCBhIGN1c3RvbSBwb3J0IHRvIGxpc3RlbiBmb3IgSFRUUCB0cmFmZmljOgorIworIyBodHRwLnBvcnQ6IDkyMDAKKworIyBTZXQgYSBjdXN0b20gYWxsb3dlZCBjb250ZW50IGxlbmd0aDoKKyMKKyMgaHR0cC5tYXhfY29udGVudF9sZW5ndGg6IDEwMG1iCisKKyMgRGlzYWJsZSBIVFRQIGNvbXBsZXRlbHk6CisjCisjIGh0dHAuZW5hYmxlZDogZmFsc2UKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHYXRld2F5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlIGdhdGV3YXkgYWxsb3dzIGZvciBwZXJzaXN0aW5nIHRoZSBjbHVzdGVyIHN0YXRlIGJldHdlZW4gZnVsbCBjbHVzdGVyCisjIHJlc3RhcnRzLiBFdmVyeSBjaGFuZ2UgdG8gdGhlIHN0YXRlIChzdWNoIGFzIGFkZGluZyBhbiBpbmRleCkgd2lsbCBiZSBzdG9yZWQKKyMgaW4gdGhlIGdhdGV3YXksIGFuZCB3aGVuIHRoZSBjbHVzdGVyIHN0YXJ0cyB1cCBmb3IgdGhlIGZpcnN0IHRpbWUsCisjIGl0IHdpbGwgcmVhZCBpdHMgc3RhdGUgZnJvbSB0aGUgZ2F0ZXdheS4KKworIyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiBnYXRld2F5IGltcGxlbWVudGF0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy1nYXRld2F5Lmh0bWw+LgorCisjIFRoZSBkZWZhdWx0IGdhdGV3YXkgdHlwZSBpcyB0aGUgImxvY2FsIiBnYXRld2F5IChyZWNvbW1lbmRlZCk6CisjCisjIGdhdGV3YXkudHlwZTogbG9jYWwKKworIyBTZXR0aW5ncyBiZWxvdyBjb250cm9sIGhvdyBhbmQgd2hlbiB0byBzdGFydCB0aGUgaW5pdGlhbCByZWNvdmVyeSBwcm9jZXNzIG9uCisjIGEgZnVsbCBjbHVzdGVyIHJlc3RhcnQgKHRvIHJldXNlIGFzIG11Y2ggbG9jYWwgZGF0YSBhcyBwb3NzaWJsZSB3aGVuIHVzaW5nIHNoYXJlZAorIyBnYXRld2F5KS4KKworIyBBbGxvdyByZWNvdmVyeSBwcm9jZXNzIGFmdGVyIE4gbm9kZXMgaW4gYSBjbHVzdGVyIGFyZSB1cDoKKyMKK2dhdGV3YXkucmVjb3Zlcl9hZnRlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZW91dCB0byBpbml0aWF0ZSB0aGUgcmVjb3ZlcnkgcHJvY2Vzcywgb25jZSB0aGUgTiBub2RlcworIyBmcm9tIHByZXZpb3VzIHNldHRpbmcgYXJlIHVwIChhY2NlcHRzIHRpbWUgdmFsdWUpOgorIworIyBnYXRld2F5LnJlY292ZXJfYWZ0ZXJfdGltZTogNW0KKworIyBTZXQgaG93IG1hbnkgbm9kZXMgYXJlIGV4cGVjdGVkIGluIHRoaXMgY2x1c3Rlci4gT25jZSB0aGVzZSBOIG5vZGVzCisjIGFyZSB1cCAoYW5kIHJlY292ZXJfYWZ0ZXJfbm9kZXMgaXMgbWV0KSwgYmVnaW4gcmVjb3ZlcnkgcHJvY2VzcyBpbW1lZGlhdGVseQorIyAod2l0aG91dCB3YWl0aW5nIGZvciByZWNvdmVyX2FmdGVyX3RpbWUgdG8gZXhwaXJlKToKKyMKK2dhdGV3YXkuZXhwZWN0ZWRfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSZWNvdmVyeSBUaHJvdHRsaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlc2Ugc2V0dGluZ3MgYWxsb3cgdG8gY29udHJvbCB0aGUgcHJvY2VzcyBvZiBzaGFyZHMgYWxsb2NhdGlvbiBiZXR3ZWVuCisjIG5vZGVzIGR1cmluZyBpbml0aWFsIHJlY292ZXJ5LCByZXBsaWNhIGFsbG9jYXRpb24sIHJlYmFsYW5jaW5nLAorIyBvciB3aGVuIGFkZGluZyBhbmQgcmVtb3Zpbmcgbm9kZXMuCisKKyMgU2V0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCByZWNvdmVyaWVzIGhhcHBlbmluZyBvbiBhIG5vZGU6CisjCisjIDEuIER1cmluZyB0aGUgaW5pdGlhbCByZWNvdmVyeQorIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2luaXRpYWxfcHJpbWFyaWVzX3JlY292ZXJpZXM6IDQKKyMKKyMgMi4gRHVyaW5nIGFkZGluZy9yZW1vdmluZyBub2RlcywgcmViYWxhbmNpbmcsIGV0YworIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2NvbmN1cnJlbnRfcmVjb3ZlcmllczogMgorCisjIFNldCB0byB0aHJvdHRsZSB0aHJvdWdocHV0IHdoZW4gcmVjb3ZlcmluZyAoZWcuIDEwMG1iLCBieSBkZWZhdWx0IDIwbWIpOgorIworIyBpbmRpY2VzLnJlY292ZXJ5Lm1heF9ieXRlc19wZXJfc2VjOiAyMG1iCisKKyMgU2V0IHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3BlbiBjb25jdXJyZW50IHN0cmVhbXMgd2hlbgorIyByZWNvdmVyaW5nIGEgc2hhcmQgZnJvbSBhIHBlZXI6CisjCisjIGluZGljZXMucmVjb3ZlcnkuY29uY3VycmVudF9zdHJlYW1zOiA1CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEaXNjb3ZlcnkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpc2NvdmVyeSBpbmZyYXN0cnVjdHVyZSBlbnN1cmVzIG5vZGVzIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBjbHVzdGVyCisjIGFuZCBtYXN0ZXIgbm9kZSBpcyBlbGVjdGVkLiBNdWx0aWNhc3QgZGlzY292ZXJ5IGlzIHRoZSBkZWZhdWx0LgorCisjIFNldCB0byBlbnN1cmUgYSBub2RlIHNlZXMgTiBvdGhlciBtYXN0ZXIgZWxpZ2libGUgbm9kZXMgdG8gYmUgY29uc2lkZXJlZAorIyBvcGVyYXRpb25hbCB3aXRoaW4gdGhlIGNsdXN0ZXIuIEl0cyByZWNvbW1lbmRlZCB0byBzZXQgaXQgdG8gYSBoaWdoZXIgdmFsdWUKKyMgdGhhbiAxIHdoZW4gcnVubmluZyBtb3JlIHRoYW4gMiBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyMKKyMgZGlzY292ZXJ5Lnplbi5taW5pbXVtX21hc3Rlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZSB0byB3YWl0IGZvciBwaW5nIHJlc3BvbnNlcyBmcm9tIG90aGVyIG5vZGVzIHdoZW4gZGlzY292ZXJpbmcuCisjIFNldCB0aGlzIG9wdGlvbiB0byBhIGhpZ2hlciB2YWx1ZSBvbiBhIHNsb3cgb3IgY29uZ2VzdGVkIG5ldHdvcmsKKyMgdG8gbWluaW1pemUgZGlzY292ZXJ5IGZhaWx1cmVzOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcudGltZW91dDogM3MKKworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzLWRpc2NvdmVyeS16ZW4uaHRtbD4KKworIyBVbmljYXN0IGRpc2NvdmVyeSBhbGxvd3MgdG8gZXhwbGljaXRseSBjb250cm9sIHdoaWNoIG5vZGVzIHdpbGwgYmUgdXNlZAorIyB0byBkaXNjb3ZlciB0aGUgY2x1c3Rlci4gSXQgY2FuIGJlIHVzZWQgd2hlbiBtdWx0aWNhc3QgaXMgbm90IHByZXNlbnQsCisjIG9yIHRvIHJlc3RyaWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24td2lzZS4KKyMKKyMgMS4gRGlzYWJsZSBtdWx0aWNhc3QgZGlzY292ZXJ5IChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcubXVsdGljYXN0LmVuYWJsZWQ6IGZhbHNlCisjCisjIDIuIENvbmZpZ3VyZSBhbiBpbml0aWFsIGxpc3Qgb2YgbWFzdGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisjICAgIHRvIHBlcmZvcm0gZGlzY292ZXJ5IHdoZW4gbmV3IG5vZGVzIChtYXN0ZXIgb3IgZGF0YSkgYXJlIHN0YXJ0ZWQ6CisjCisjIGRpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0Lmhvc3RzOiBbImhvc3QxIiwgImhvc3QyOnBvcnQiXQorCisjIEVDMiBkaXNjb3ZlcnkgYWxsb3dzIHRvIHVzZSBBV1MgRUMyIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGRpc2NvdmVyeS4KKyMKKyMgWW91IGhhdmUgdG8gaW5zdGFsbCB0aGUgY2xvdWQtYXdzIHBsdWdpbiBmb3IgZW5hYmxpbmcgdGhlIEVDMiBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMtZGlzY292ZXJ5LWVjMi5odG1sPgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy90dXRvcmlhbHMvZWxhc3RpY3NlYXJjaC1vbi1lYzIvPgorIyBmb3IgYSBzdGVwLWJ5LXN0ZXAgdHV0b3JpYWwuCisKKyMgR0NFIGRpc2NvdmVyeSBhbGxvd3MgdG8gdXNlIEdvb2dsZSBDb21wdXRlIEVuZ2luZSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBkaXNjb3ZlcnkuCisjCisjIFlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGNsb3VkLWdjZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBHQ0UgZGlzY292ZXJ5LgorIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxodHRwczovL2dpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC9lbGFzdGljc2VhcmNoLWNsb3VkLWdjZT4uCisKKyMgQXp1cmUgZGlzY292ZXJ5IGFsbG93cyB0byB1c2UgQXp1cmUgQVBJIGluIG9yZGVyIHRvIHBlcmZvcm0gZGlzY292ZXJ5LgorIworIyBZb3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBjbG91ZC1henVyZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBBenVyZSBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9lbGFzdGljc2VhcmNoL2VsYXN0aWNzZWFyY2gtY2xvdWQtYXp1cmU+LgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNsb3cgTG9nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTaGFyZCBsZXZlbCBxdWVyeSBhbmQgZmV0Y2ggdGhyZXNob2xkIGxvZ2dpbmcuCisKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQucXVlcnkud2FybjogMTBzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmluZm86IDVzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmRlYnVnOiAycworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5xdWVyeS50cmFjZTogNTAwbXMKKworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC53YXJuOiAxcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5pbmZvOiA4MDBtcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5kZWJ1ZzogNTAwbXMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQuZmV0Y2gudHJhY2U6IDIwMG1zCisKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC53YXJuOiAxMHMKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC5pbmZvOiA1cworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LmRlYnVnOiAycworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LnRyYWNlOiA1MDBtcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdDIExvZ2dpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI21vbml0b3IuanZtLmdjLnlvdW5nLndhcm46IDEwMDBtcworI21vbml0b3IuanZtLmdjLnlvdW5nLmluZm86IDcwMG1zCisjbW9uaXRvci5qdm0uZ2MueW91bmcuZGVidWc6IDQwMG1zCisKKyNtb25pdG9yLmp2bS5nYy5vbGQud2FybjogMTBzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmluZm86IDVzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmRlYnVnOiAycworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS1lbXB0eS1ub2Rlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS1lbXB0eS1ub2Rlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxN2JjYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9teXNxbC10eXBlLWVtcHR5LW5vZGVzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS1uby1ub2Rlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS1uby1ub2Rlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5OTlmYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9teXNxbC10eXBlLW5vLW5vZGVzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS1uby12ZXJzaW9uLnppcCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9teXNxbC10eXBlLW5vLXZlcnNpb24uemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTMxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS1uby12ZXJzaW9uLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS1vbmx5LXlhbWwuemlwIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL215c3FsLXR5cGUtb25seS15YW1sLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGIxOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL215c3FsLXR5cGUtb25seS15YW1sLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS13aXRoLXNjcmlwdHMuemlwIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL215c3FsLXR5cGUtd2l0aC1zY3JpcHRzLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjg5YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL215c3FsLXR5cGUtd2l0aC1zY3JpcHRzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbXlzcWwtdHlwZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5ODVhMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9teXNxbC10eXBlLnltbApAQCAtMCwwICsxLDgyIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCitkZXNjcmlwdGlvbjogTXlTUUwgUkRCTVMgaW5zdGFsbGF0aW9uIG9uIGEgc3BlY2lmaWMgbW91bnRlZCB2b2x1bWUgcGF0aC4KK3RlbXBsYXRlX25hbWU6IG15c3FsLXR5cGUKK3RlbXBsYXRlX3ZlcnNpb246IDEuMS4xLVNOQVBTSE9UCit0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0CisKK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlczoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICBhbGllbi5ub2Rlcy5NeXNxbDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhCisgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZQorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvbXlzcWwucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRiX3BvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMzMwNgorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLgorICAgICAgZGJfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIGRlZmF1bHQ6IHdvcmRwcmVzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICBkYl91c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogcGFzcworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHNwZWNpYWwgdXNlciBhY2NvdW50IHVzZWQgZm9yIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uLgorICAgICAgZGJfcGFzc3dvcmQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiBwYXNzCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIJFkYl91c2VykiBwcm9wZXJ0eS4KKyAgICAgIGJpbmRfYWRkcmVzczoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZWZhdWx0OiB0cnVlCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogSWYgdHJ1ZSx0aGUgc2VydmVyIGFjY2VwdHMgVENQL0lQIGNvbm5lY3Rpb25zIG9uIGFsbCBzZXJ2ZXIgaG9zdCBJUHY0IGludGVyZmFjZXMuCisgICAgICBzdG9yYWdlX3BhdGg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAvbW91bnRlZFN0b3JhZ2UKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsgIi9tb3VudGVkU3RvcmFnZSIsICIvdmFyL215c3FsIiBdCisgICAgaW50ZXJmYWNlczoKKyAgICAgIFN0YW5kYXJkOgorICAgICAgICBjcmVhdGU6IHNjcmlwdHMvaW5zdGFsbF9teXNxbC5zaAorICAgICAgICBzdGFydDoKKyAgICAgICAgICBpbnB1dHM6CisgICAgICAgICAgICBWT0xVTUVfSE9NRTogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBzdG9yYWdlX3BhdGhdIH0KKyAgICAgICAgICAgIFBPUlQ6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfcG9ydF0gfQorICAgICAgICAgICAgREJfTkFNRTogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9uYW1lXSB9CisgICAgICAgICAgICBEQl9VU0VSOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3VzZXJdIH0KKyAgICAgICAgICAgIERCX1BBU1NXT1JEOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3Bhc3N3b3JkXSB9CisgICAgICAgICAgICBCSU5EX0FEUkVTUzogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBiaW5kX2FkZHJlc3NdIH0KKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogc2NyaXB0cy9zdGFydF9teXNxbC5zaAorICAgICAgZmFzdGNvbm5lY3QuY2xvdWRpZnkuZXh0ZW5zaW9uczoKKyAgICAgICAgIHN0YXJ0X2RldGVjdGlvbjoKKyAgICAgICAgICBpbnB1dHM6CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0KKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogc2NyaXB0cy9teXNxbF9zdGFydF9kZXRlY3Rpb24uZ3Jvb3Z5CisgICAgYXJ0aWZhY3RzOgorICAgICAgLSBzY3JpcHRzOiBzY3JpcHRzCisgICAgICAgIHR5cGU6IHRvc2NhLmFydGlmYWN0cy5GaWxlCisKK2NhcGFiaWxpdHlfdHlwZXM6CisgIGFsaWVuLmNhcGFiaWxpdGllcy5NeXNxbERhdGFiYXNlOgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisKK2FydGlmYWN0X3R5cGVzOgorICB0b3NjYS5hcnRpZmFjdHMuR3Jvb3Z5U2NyaXB0OgorICAgIGRlc2NyaXB0aW9uOiBBIGdyb292eSBzY3JpcHQgKC5ncm9vdnkgZmlsZSkKKyAgICBmaWxlX2V4dDogW2dyb292eV0KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9teXNxbC10eXBlLnppcCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9teXNxbC10eXBlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGIxOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL215c3FsLXR5cGUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9ub3JtYXRpdmUtdHlwZXMtcm9vdC56aXAgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbm9ybWF0aXZlLXR5cGVzLXJvb3QuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzM5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvbm9ybWF0aXZlLXR5cGVzLXJvb3QuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9zYW1wbGUueWFtbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9zYW1wbGUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFiMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL3NhbXBsZS55YW1sCkBAIC0wLDAgKzEsMTcgQEAKK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKworIyBDb25uZWN0aW9uIHBhcmFtZXRlcnMKK2Nvbm5lY3Rpb246CisgICAgdXJsOiBqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYvZGIKKyAgICBwb29sU2l6ZTogNQorCisjIFByb3RvY29scworcHJvdG9jb2xzOgorICAgLSBodHRwCisgICAtIGh0dHBzCisKKyMgVXNlcnMKK3VzZXJzOgorICAgIHRvbTogcGFzc3dkCisgICAgYm9iOiBwYXNzd2QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvc2FtcGxlTm9Qcm90b2NvbC55YW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL3NhbXBsZU5vUHJvdG9jb2wueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk3MjMyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL3NhbXBsZU5vUHJvdG9jb2wueWFtbApAQCAtMCwwICsxLDE3IEBACit2ZXJzaW9uOiAxLjAKK3JlbGVhc2VkOiAyMDEyLTExLTMwCisKKyMgQ29ubmVjdGlvbiBwYXJhbWV0ZXJzCitjb25uZWN0aW9uOgorICAgIHVybDogamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2L2RiCisgICAgcG9vbFNpemU6IDUKKworIyBQcm90b2NvbHMKKyNwcm90b2NvbHM6CisjICAgLSBodHRwCisjICAgLSBodHRwcworCisjIFVzZXJzCit1c2VyczoKKyAgICB0b206IHBhc3N3ZAorICAgIGJvYjogcGFzc3dkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvZWxhc3RpY3NlYXJjaC55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9lbGFzdGljc2VhcmNoLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmE5NDJkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvZWxhc3RpY3NlYXJjaC55bWwKQEAgLTAsMCArMSwzOTEgQEAKKworZWxhc3RpY1NlYXJjaC5sb2NhbDogdHJ1ZQorZWxhc3RpY1NlYXJjaC50cmFuc3BvcnRjbGllbnQ6IGZhbHNlCitjbHVzdGVyLm5hbWU6IGVsYXN0aWNzZWFyY2hfMV81XzIyMjIKKyAgCitkaXNjb3ZlcnkuemVuLnBpbmcubXVsdGljYXN0LmVuYWJsZWQ6IGZhbHNlCitkaXNjb3ZlcnkuemVuLnBpbmcudW5pY2FzdC5lbmFibGVkOiB0cnVlCitkaXNjb3ZlcnkuemVuLnBpbmcudW5pY2FzdC5ob3N0czogMS4yLjMuNAordHJhbnNwb3J0LmNsaWVudC5pbml0aWFsX25vZGVzOgorICAgLSAxLjIuMy40OjkzMDAKKworI3BsdWdpbi50eXBlczogIkRlbGV0ZUJ5UXVlcnlQbHVnaW4iCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFbGFzdGljc2VhcmNoIENvbmZpZ3VyYXRpb24gRXhhbXBsZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGlzIGZpbGUgY29udGFpbnMgYW4gb3ZlcnZpZXcgb2YgdmFyaW91cyBjb25maWd1cmF0aW9uIHNldHRpbmdzLAorIyB0YXJnZXRlZCBhdCBvcGVyYXRpb25zIHN0YWZmLiBBcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHNob3VsZAorIyBjb25zdWx0IHRoZSBndWlkZSBhdCA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlPi4KKyMKKyMgVGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgaXMgY292ZXJlZCBhdAorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAuaHRtbD4uCisjCisjIEVsYXN0aWNzZWFyY2ggY29tZXMgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBtb3N0IHNldHRpbmdzLAorIyBzbyB5b3UgY2FuIHRyeSBpdCBvdXQgd2l0aG91dCBib3RoZXJpbmcgd2l0aCBjb25maWd1cmF0aW9uLgorIworIyBNb3N0IG9mIHRoZSB0aW1lLCB0aGVzZSBkZWZhdWx0cyBhcmUganVzdCBmaW5lIGZvciBydW5uaW5nIGEgcHJvZHVjdGlvbgorIyBjbHVzdGVyLiBJZiB5b3UncmUgZmluZS10dW5pbmcgeW91ciBjbHVzdGVyLCBvciB3b25kZXJpbmcgYWJvdXQgdGhlCisjIGVmZmVjdCBvZiBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBwbGVhc2UgX2RvIGFza18gb24gdGhlCisjIG1haWxpbmcgbGlzdCBvciBJUkMgY2hhbm5lbCBbaHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2NvbW11bml0eV0uCisKKyMgQW55IGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHJlcGxhY2VkIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzCisjIGJ5IHBsYWNpbmcgdGhlbSBpbiAkey4uLn0gbm90YXRpb24uIEZvciBleGFtcGxlOgorIworIyBub2RlLnJhY2s6ICR7UkFDS19FTlZfVkFSfQorCisjIEZvciBpbmZvcm1hdGlvbiBvbiBzdXBwb3J0ZWQgZm9ybWF0cyBhbmQgc3ludGF4IGZvciB0aGUgY29uZmlnIGZpbGUsIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAtY29uZmlndXJhdGlvbi5odG1sPgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENsdXN0ZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDbHVzdGVyIG5hbWUgaWRlbnRpZmllcyB5b3VyIGNsdXN0ZXIgZm9yIGF1dG8tZGlzY292ZXJ5LiBJZiB5b3UncmUgcnVubmluZworIyBtdWx0aXBsZSBjbHVzdGVycyBvbiB0aGUgc2FtZSBuZXR3b3JrLCBtYWtlIHN1cmUgeW91J3JlIHVzaW5nIHVuaXF1ZSBuYW1lcy4KKyMKKyMgY2x1c3Rlci5uYW1lOiBlbGFzdGljc2VhcmNoCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vZGUgbmFtZXMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBvbiBzdGFydHVwLCBzbyB5b3UncmUgcmVsaWV2ZWQKKyMgZnJvbSBjb25maWd1cmluZyB0aGVtIG1hbnVhbGx5LiBZb3UgY2FuIHRpZSB0aGlzIG5vZGUgdG8gYSBzcGVjaWZpYyBuYW1lOgorIworIyBub2RlLm5hbWU6ICJGcmFueiBLYWZrYSIKKworIyBFdmVyeSBub2RlIGNhbiBiZSBjb25maWd1cmVkIHRvIGFsbG93IG9yIGRlbnkgYmVpbmcgZWxpZ2libGUgYXMgdGhlIG1hc3RlciwKKyMgYW5kIHRvIGFsbG93IG9yIGRlbnkgdG8gc3RvcmUgdGhlIGRhdGEuCisjCisjIEFsbG93IHRoaXMgbm9kZSB0byBiZSBlbGlnaWJsZSBhcyBhIG1hc3RlciBub2RlIChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBub2RlLm1hc3RlcjogdHJ1ZQorIworIyBBbGxvdyB0aGlzIG5vZGUgdG8gc3RvcmUgZGF0YSAoZW5hYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgbm9kZS5kYXRhOiB0cnVlCisKKyMgWW91IGNhbiBleHBsb2l0IHRoZXNlIHNldHRpbmdzIHRvIGRlc2lnbiBhZHZhbmNlZCBjbHVzdGVyIHRvcG9sb2dpZXMuCisjCisjIDEuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBuZXZlciBiZWNvbWUgYSBtYXN0ZXIgbm9kZSwgb25seSB0byBob2xkIGRhdGEuCisjICAgIFRoaXMgd2lsbCBiZSB0aGUgIndvcmtob3JzZSIgb2YgeW91ciBjbHVzdGVyLgorIworIyBub2RlLm1hc3RlcjogZmFsc2UKKyMgbm9kZS5kYXRhOiB0cnVlCisjCisjIDIuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBvbmx5IHNlcnZlIGFzIGEgbWFzdGVyOiB0byBub3Qgc3RvcmUgYW55IGRhdGEgYW5kCisjICAgIHRvIGhhdmUgZnJlZSByZXNvdXJjZXMuIFRoaXMgd2lsbCBiZSB0aGUgImNvb3JkaW5hdG9yIiBvZiB5b3VyIGNsdXN0ZXIuCisjCisjIG5vZGUubWFzdGVyOiB0cnVlCisjIG5vZGUuZGF0YTogZmFsc2UKKyMKKyMgMy4gWW91IHdhbnQgdGhpcyBub2RlIHRvIGJlIG5laXRoZXIgbWFzdGVyIG5vciBkYXRhIG5vZGUsIGJ1dAorIyAgICB0byBhY3QgYXMgYSAic2VhcmNoIGxvYWQgYmFsYW5jZXIiIChmZXRjaGluZyBkYXRhIGZyb20gbm9kZXMsCisjICAgIGFnZ3JlZ2F0aW5nIHJlc3VsdHMsIGV0Yy4pCisjCisjIG5vZGUubWFzdGVyOiBmYWxzZQorIyBub2RlLmRhdGE6IGZhbHNlCisKKyMgVXNlIHRoZSBDbHVzdGVyIEhlYWx0aCBBUEkgW2h0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fY2x1c3Rlci9oZWFsdGhdLCB0aGUKKyMgTm9kZSBJbmZvIEFQSSBbaHR0cDovL2xvY2FsaG9zdDo5MjAwL19ub2Rlc10gb3IgR1VJIHRvb2xzCisjIHN1Y2ggYXMgPGh0dHA6Ly93d3cuZWxhc3RpY3NlYXJjaC5vcmcvb3ZlcnZpZXcvbWFydmVsLz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9rYXJtaS9lbGFzdGljc2VhcmNoLXBhcmFtZWRpYz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9sdWthcy12bGNlay9iaWdkZXNrPiBhbmQKKyMgPGh0dHA6Ly9tb2J6LmdpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC1oZWFkPiB0byBpbnNwZWN0IHRoZSBjbHVzdGVyIHN0YXRlLgorCisjIEEgbm9kZSBjYW4gaGF2ZSBnZW5lcmljIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCB3aGljaCBjYW4gbGF0ZXIgYmUgdXNlZAorIyBmb3IgY3VzdG9taXplZCBzaGFyZCBhbGxvY2F0aW9uIGZpbHRlcmluZywgb3IgYWxsb2NhdGlvbiBhd2FyZW5lc3MuIEFuIGF0dHJpYnV0ZQorIyBpcyBhIHNpbXBsZSBrZXkgdmFsdWUgcGFpciwgc2ltaWxhciB0byBub2RlLmtleTogdmFsdWUsIGhlcmUgaXMgYW4gZXhhbXBsZToKKyMKKyMgbm9kZS5yYWNrOiByYWNrMzE0CisKKyMgQnkgZGVmYXVsdCwgbXVsdGlwbGUgbm9kZXMgYXJlIGFsbG93ZWQgdG8gc3RhcnQgZnJvbSB0aGUgc2FtZSBpbnN0YWxsYXRpb24gbG9jYXRpb24KKyMgdG8gZGlzYWJsZSBpdCwgc2V0IHRoZSBmb2xsb3dpbmc6CisjIG5vZGUubWF4X2xvY2FsX3N0b3JhZ2Vfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSW5kZXggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgWW91IGNhbiBzZXQgYSBudW1iZXIgb2Ygb3B0aW9ucyAoc3VjaCBhcyBzaGFyZC9yZXBsaWNhIG9wdGlvbnMsIG1hcHBpbmcKKyMgb3IgYW5hbHl6ZXIgZGVmaW5pdGlvbnMsIHRyYW5zbG9nIHNldHRpbmdzLCAuLi4pIGZvciBpbmRpY2VzIGdsb2JhbGx5LAorIyBpbiB0aGlzIGZpbGUuCisjCisjIE5vdGUsIHRoYXQgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBjb25maWd1cmUgaW5kZXggc2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvcgorIyBhIGNlcnRhaW4gaW5kZXgsIGVpdGhlciB3aGVuIGNyZWF0aW5nIGl0IG9yIGJ5IHVzaW5nIHRoZSBpbmRleCB0ZW1wbGF0ZXMgQVBJLgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L2luZGV4LW1vZHVsZXMuaHRtbD4gYW5kCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9pbmRpY2VzLWNyZWF0ZS1pbmRleC5odG1sPgorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBTZXQgdGhlIG51bWJlciBvZiBzaGFyZHMgKHNwbGl0cykgb2YgYW4gaW5kZXggKDUgYnkgZGVmYXVsdCk6CisjCisjIGluZGV4Lm51bWJlcl9vZl9zaGFyZHM6IDUKKworIyBTZXQgdGhlIG51bWJlciBvZiByZXBsaWNhcyAoYWRkaXRpb25hbCBjb3BpZXMpIG9mIGFuIGluZGV4ICgxIGJ5IGRlZmF1bHQpOgorIworIyBpbmRleC5udW1iZXJfb2ZfcmVwbGljYXM6IDEKKworIyBOb3RlLCB0aGF0IGZvciBkZXZlbG9wbWVudCBvbiBhIGxvY2FsIG1hY2hpbmUsIHdpdGggc21hbGwgaW5kaWNlcywgaXQgdXN1YWxseQorIyBtYWtlcyBzZW5zZSB0byAiZGlzYWJsZSIgdGhlIGRpc3RyaWJ1dGVkIGZlYXR1cmVzOgorIworaW5kZXgubnVtYmVyX29mX3NoYXJkczogMQoraW5kZXgubnVtYmVyX29mX3JlcGxpY2FzOiAwCisKKyMgVGhlc2Ugc2V0dGluZ3MgZGlyZWN0bHkgYWZmZWN0IHRoZSBwZXJmb3JtYW5jZSBvZiBpbmRleCBhbmQgc2VhcmNoIG9wZXJhdGlvbnMKKyMgaW4geW91ciBjbHVzdGVyLiBBc3N1bWluZyB5b3UgaGF2ZSBlbm91Z2ggbWFjaGluZXMgdG8gaG9sZCBzaGFyZHMgYW5kCisjIHJlcGxpY2FzLCB0aGUgcnVsZSBvZiB0aHVtYiBpczoKKyMKKyMgMS4gSGF2aW5nIG1vcmUgKnNoYXJkcyogZW5oYW5jZXMgdGhlIF9pbmRleGluZ18gcGVyZm9ybWFuY2UgYW5kIGFsbG93cyB0bworIyAgICBfZGlzdHJpYnV0ZV8gYSBiaWcgaW5kZXggYWNyb3NzIG1hY2hpbmVzLgorIyAyLiBIYXZpbmcgbW9yZSAqcmVwbGljYXMqIGVuaGFuY2VzIHRoZSBfc2VhcmNoXyBwZXJmb3JtYW5jZSBhbmQgaW1wcm92ZXMgdGhlCisjICAgIGNsdXN0ZXIgX2F2YWlsYWJpbGl0eV8uCisjCisjIFRoZSAibnVtYmVyX29mX3NoYXJkcyIgaXMgYSBvbmUtdGltZSBzZXR0aW5nIGZvciBhbiBpbmRleC4KKyMKKyMgVGhlICJudW1iZXJfb2ZfcmVwbGljYXMiIGNhbiBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGFueXRpbWUsCisjIGJ5IHVzaW5nIHRoZSBJbmRleCBVcGRhdGUgU2V0dGluZ3MgQVBJLgorIworIyBFbGFzdGljc2VhcmNoIHRha2VzIGNhcmUgYWJvdXQgbG9hZCBiYWxhbmNpbmcsIHJlbG9jYXRpbmcsIGdhdGhlcmluZyB0aGUKKyMgcmVzdWx0cyBmcm9tIG5vZGVzLCBldGMuIEV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgdG8gZmluZS10dW5lCisjIHlvdXIgc2V0dXAuCisKKyMgVXNlIHRoZSBJbmRleCBTdGF0dXMgQVBJICg8aHR0cDovL2xvY2FsaG9zdDo5MjAwL0EvX3N0YXR1cz4pIHRvIGluc3BlY3QKKyMgdGhlIGluZGV4IHN0YXR1cy4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUGF0aHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwYXRoLmhvbWU6IC9zcmMvdGVzdC9yZXNvdXJjZXMKKyMgUGF0aCB0byBkaXJlY3RvcnkgY29udGFpbmluZyBjb25maWd1cmF0aW9uICh0aGlzIGZpbGUgYW5kIGxvZ2dpbmcueW1sKToKKyMKK3BhdGguY29uZjogL3NyYy90ZXN0L3Jlc291cmNlcworCisjIFBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGluZGV4IGRhdGEgYWxsb2NhdGVkIGZvciB0aGlzIG5vZGUuCisjCitwYXRoLmRhdGE6IHRhcmdldC9lc2RhdGEKKyMKKyMgQ2FuIG9wdGlvbmFsbHkgaW5jbHVkZSBtb3JlIHRoYW4gb25lIGxvY2F0aW9uLCBjYXVzaW5nIGRhdGEgdG8gYmUgc3RyaXBlZCBhY3Jvc3MKKyMgdGhlIGxvY2F0aW9ucyAoYSBsYSBSQUlEIDApIG9uIGEgZmlsZSBsZXZlbCwgZmF2b3VyaW5nIGxvY2F0aW9ucyB3aXRoIG1vc3QgZnJlZQorIyBzcGFjZSBvbiBjcmVhdGlvbi4gRm9yIGV4YW1wbGU6CisjCisjIHBhdGguZGF0YTogL3BhdGgvdG8vZGF0YTEsL3BhdGgvdG8vZGF0YTIKKworIyBQYXRoIHRvIHRlbXBvcmFyeSBmaWxlczoKKyMKK3BhdGgud29yazogL3RhcmdldC9lc3dvcmsKKworIyBQYXRoIHRvIGxvZyBmaWxlczoKKyMKK3BhdGgubG9nczogL3RhcmdldC9lc2xvZ3MKKworIyBQYXRoIHRvIHdoZXJlIHBsdWdpbnMgYXJlIGluc3RhbGxlZDoKKyMKKyMgcGF0aC5wbHVnaW5zOiAvcGF0aC90by9wbHVnaW5zCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBsdWdpbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIElmIGEgcGx1Z2luIGxpc3RlZCBoZXJlIGlzIG5vdCBpbnN0YWxsZWQgZm9yIGN1cnJlbnQgbm9kZSwgdGhlIG5vZGUgd2lsbCBub3Qgc3RhcnQuCisjCisjIHBsdWdpbi5tYW5kYXRvcnk6IG1hcHBlci1hdHRhY2htZW50cyxsYW5nLWdyb292eQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1lbW9yeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoIHBlcmZvcm1zIHBvb3JseSB3aGVuIEpWTSBzdGFydHMgc3dhcHBpbmc6IHlvdSBzaG91bGQgZW5zdXJlIHRoYXQKKyMgaXQgX25ldmVyXyBzd2Fwcy4KKyMKKyMgU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBsb2NrIHRoZSBtZW1vcnk6CisjCisjIGJvb3RzdHJhcC5tbG9ja2FsbDogdHJ1ZQorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBFU19NSU5fTUVNIGFuZCBFU19NQVhfTUVNIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CisjIHRvIHRoZSBzYW1lIHZhbHVlLCBhbmQgdGhhdCB0aGUgbWFjaGluZSBoYXMgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZQorIyBmb3IgRWxhc3RpY3NlYXJjaCwgbGVhdmluZyBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpdHNlbGYuCisjCisjIFlvdSBzaG91bGQgYWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgRWxhc3RpY3NlYXJjaCBwcm9jZXNzIGlzIGFsbG93ZWQgdG8gbG9jaworIyB0aGUgbWVtb3J5LCBlZy4gYnkgdXNpbmcgYHVsaW1pdCAtbCB1bmxpbWl0ZWRgLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOZXR3b3JrIEFuZCBIVFRQICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoLCBieSBkZWZhdWx0LCBiaW5kcyBpdHNlbGYgdG8gdGhlIDAuMC4wLjAgYWRkcmVzcywgYW5kIGxpc3RlbnMKKyMgb24gcG9ydCBbOTIwMC05MzAwXSBmb3IgSFRUUCB0cmFmZmljIGFuZCBvbiBwb3J0IFs5MzAwLTk0MDBdIGZvciBub2RlLXRvLW5vZGUKKyMgY29tbXVuaWNhdGlvbi4gKHRoZSByYW5nZSBtZWFucyB0aGF0IGlmIHRoZSBwb3J0IGlzIGJ1c3ksIGl0IHdpbGwgYXV0b21hdGljYWxseQorIyB0cnkgdGhlIG5leHQgcG9ydCkuCisKKyMgU2V0IHRoZSBiaW5kIGFkZHJlc3Mgc3BlY2lmaWNhbGx5IChJUHY0IG9yIElQdjYpOgorIworIyBuZXR3b3JrLmJpbmRfaG9zdDogMTkyLjE2OC4wLjEKKworIyBTZXQgdGhlIGFkZHJlc3Mgb3RoZXIgbm9kZXMgd2lsbCB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzIG5vZGUuIElmIG5vdAorIyBzZXQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZGVyaXZlZC4gSXQgbXVzdCBwb2ludCB0byBhbiBhY3R1YWwgSVAgYWRkcmVzcy4KKyMKKyMgbmV0d29yay5wdWJsaXNoX2hvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGJvdGggJ2JpbmRfaG9zdCcgYW5kICdwdWJsaXNoX2hvc3QnOgorIworIyBuZXR3b3JrLmhvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGEgY3VzdG9tIHBvcnQgZm9yIHRoZSBub2RlIHRvIG5vZGUgY29tbXVuaWNhdGlvbiAoOTMwMCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5wb3J0OiA5MzAwCisKKyMgRW5hYmxlIGNvbXByZXNzaW9uIGZvciBhbGwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG5vZGVzIChkaXNhYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5jb21wcmVzczogdHJ1ZQorCisjIFNldCBhIGN1c3RvbSBwb3J0IHRvIGxpc3RlbiBmb3IgSFRUUCB0cmFmZmljOgorIworIyBodHRwLnBvcnQ6IDkyMDAKKworIyBTZXQgYSBjdXN0b20gYWxsb3dlZCBjb250ZW50IGxlbmd0aDoKKyMKKyMgaHR0cC5tYXhfY29udGVudF9sZW5ndGg6IDEwMG1iCisKKyMgRGlzYWJsZSBIVFRQIGNvbXBsZXRlbHk6CisjCisjIGh0dHAuZW5hYmxlZDogZmFsc2UKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHYXRld2F5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlIGdhdGV3YXkgYWxsb3dzIGZvciBwZXJzaXN0aW5nIHRoZSBjbHVzdGVyIHN0YXRlIGJldHdlZW4gZnVsbCBjbHVzdGVyCisjIHJlc3RhcnRzLiBFdmVyeSBjaGFuZ2UgdG8gdGhlIHN0YXRlIChzdWNoIGFzIGFkZGluZyBhbiBpbmRleCkgd2lsbCBiZSBzdG9yZWQKKyMgaW4gdGhlIGdhdGV3YXksIGFuZCB3aGVuIHRoZSBjbHVzdGVyIHN0YXJ0cyB1cCBmb3IgdGhlIGZpcnN0IHRpbWUsCisjIGl0IHdpbGwgcmVhZCBpdHMgc3RhdGUgZnJvbSB0aGUgZ2F0ZXdheS4KKworIyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiBnYXRld2F5IGltcGxlbWVudGF0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy1nYXRld2F5Lmh0bWw+LgorCisjIFRoZSBkZWZhdWx0IGdhdGV3YXkgdHlwZSBpcyB0aGUgImxvY2FsIiBnYXRld2F5IChyZWNvbW1lbmRlZCk6CisjCisjIGdhdGV3YXkudHlwZTogbG9jYWwKKworIyBTZXR0aW5ncyBiZWxvdyBjb250cm9sIGhvdyBhbmQgd2hlbiB0byBzdGFydCB0aGUgaW5pdGlhbCByZWNvdmVyeSBwcm9jZXNzIG9uCisjIGEgZnVsbCBjbHVzdGVyIHJlc3RhcnQgKHRvIHJldXNlIGFzIG11Y2ggbG9jYWwgZGF0YSBhcyBwb3NzaWJsZSB3aGVuIHVzaW5nIHNoYXJlZAorIyBnYXRld2F5KS4KKworIyBBbGxvdyByZWNvdmVyeSBwcm9jZXNzIGFmdGVyIE4gbm9kZXMgaW4gYSBjbHVzdGVyIGFyZSB1cDoKKyMKK2dhdGV3YXkucmVjb3Zlcl9hZnRlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZW91dCB0byBpbml0aWF0ZSB0aGUgcmVjb3ZlcnkgcHJvY2Vzcywgb25jZSB0aGUgTiBub2RlcworIyBmcm9tIHByZXZpb3VzIHNldHRpbmcgYXJlIHVwIChhY2NlcHRzIHRpbWUgdmFsdWUpOgorIworIyBnYXRld2F5LnJlY292ZXJfYWZ0ZXJfdGltZTogNW0KKworIyBTZXQgaG93IG1hbnkgbm9kZXMgYXJlIGV4cGVjdGVkIGluIHRoaXMgY2x1c3Rlci4gT25jZSB0aGVzZSBOIG5vZGVzCisjIGFyZSB1cCAoYW5kIHJlY292ZXJfYWZ0ZXJfbm9kZXMgaXMgbWV0KSwgYmVnaW4gcmVjb3ZlcnkgcHJvY2VzcyBpbW1lZGlhdGVseQorIyAod2l0aG91dCB3YWl0aW5nIGZvciByZWNvdmVyX2FmdGVyX3RpbWUgdG8gZXhwaXJlKToKKyMKK2dhdGV3YXkuZXhwZWN0ZWRfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSZWNvdmVyeSBUaHJvdHRsaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlc2Ugc2V0dGluZ3MgYWxsb3cgdG8gY29udHJvbCB0aGUgcHJvY2VzcyBvZiBzaGFyZHMgYWxsb2NhdGlvbiBiZXR3ZWVuCisjIG5vZGVzIGR1cmluZyBpbml0aWFsIHJlY292ZXJ5LCByZXBsaWNhIGFsbG9jYXRpb24sIHJlYmFsYW5jaW5nLAorIyBvciB3aGVuIGFkZGluZyBhbmQgcmVtb3Zpbmcgbm9kZXMuCisKKyMgU2V0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCByZWNvdmVyaWVzIGhhcHBlbmluZyBvbiBhIG5vZGU6CisjCisjIDEuIER1cmluZyB0aGUgaW5pdGlhbCByZWNvdmVyeQorIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2luaXRpYWxfcHJpbWFyaWVzX3JlY292ZXJpZXM6IDQKKyMKKyMgMi4gRHVyaW5nIGFkZGluZy9yZW1vdmluZyBub2RlcywgcmViYWxhbmNpbmcsIGV0YworIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2NvbmN1cnJlbnRfcmVjb3ZlcmllczogMgorCisjIFNldCB0byB0aHJvdHRsZSB0aHJvdWdocHV0IHdoZW4gcmVjb3ZlcmluZyAoZWcuIDEwMG1iLCBieSBkZWZhdWx0IDIwbWIpOgorIworIyBpbmRpY2VzLnJlY292ZXJ5Lm1heF9ieXRlc19wZXJfc2VjOiAyMG1iCisKKyMgU2V0IHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3BlbiBjb25jdXJyZW50IHN0cmVhbXMgd2hlbgorIyByZWNvdmVyaW5nIGEgc2hhcmQgZnJvbSBhIHBlZXI6CisjCisjIGluZGljZXMucmVjb3ZlcnkuY29uY3VycmVudF9zdHJlYW1zOiA1CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEaXNjb3ZlcnkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpc2NvdmVyeSBpbmZyYXN0cnVjdHVyZSBlbnN1cmVzIG5vZGVzIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBjbHVzdGVyCisjIGFuZCBtYXN0ZXIgbm9kZSBpcyBlbGVjdGVkLiBNdWx0aWNhc3QgZGlzY292ZXJ5IGlzIHRoZSBkZWZhdWx0LgorCisjIFNldCB0byBlbnN1cmUgYSBub2RlIHNlZXMgTiBvdGhlciBtYXN0ZXIgZWxpZ2libGUgbm9kZXMgdG8gYmUgY29uc2lkZXJlZAorIyBvcGVyYXRpb25hbCB3aXRoaW4gdGhlIGNsdXN0ZXIuIEl0cyByZWNvbW1lbmRlZCB0byBzZXQgaXQgdG8gYSBoaWdoZXIgdmFsdWUKKyMgdGhhbiAxIHdoZW4gcnVubmluZyBtb3JlIHRoYW4gMiBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyMKKyMgZGlzY292ZXJ5Lnplbi5taW5pbXVtX21hc3Rlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZSB0byB3YWl0IGZvciBwaW5nIHJlc3BvbnNlcyBmcm9tIG90aGVyIG5vZGVzIHdoZW4gZGlzY292ZXJpbmcuCisjIFNldCB0aGlzIG9wdGlvbiB0byBhIGhpZ2hlciB2YWx1ZSBvbiBhIHNsb3cgb3IgY29uZ2VzdGVkIG5ldHdvcmsKKyMgdG8gbWluaW1pemUgZGlzY292ZXJ5IGZhaWx1cmVzOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcudGltZW91dDogM3MKKworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzLWRpc2NvdmVyeS16ZW4uaHRtbD4KKworIyBVbmljYXN0IGRpc2NvdmVyeSBhbGxvd3MgdG8gZXhwbGljaXRseSBjb250cm9sIHdoaWNoIG5vZGVzIHdpbGwgYmUgdXNlZAorIyB0byBkaXNjb3ZlciB0aGUgY2x1c3Rlci4gSXQgY2FuIGJlIHVzZWQgd2hlbiBtdWx0aWNhc3QgaXMgbm90IHByZXNlbnQsCisjIG9yIHRvIHJlc3RyaWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24td2lzZS4KKyMKKyMgMS4gRGlzYWJsZSBtdWx0aWNhc3QgZGlzY292ZXJ5IChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcubXVsdGljYXN0LmVuYWJsZWQ6IGZhbHNlCisjCisjIDIuIENvbmZpZ3VyZSBhbiBpbml0aWFsIGxpc3Qgb2YgbWFzdGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisjICAgIHRvIHBlcmZvcm0gZGlzY292ZXJ5IHdoZW4gbmV3IG5vZGVzIChtYXN0ZXIgb3IgZGF0YSkgYXJlIHN0YXJ0ZWQ6CisjCisjIGRpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0Lmhvc3RzOiBbImhvc3QxIiwgImhvc3QyOnBvcnQiXQorCisjIEVDMiBkaXNjb3ZlcnkgYWxsb3dzIHRvIHVzZSBBV1MgRUMyIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGRpc2NvdmVyeS4KKyMKKyMgWW91IGhhdmUgdG8gaW5zdGFsbCB0aGUgY2xvdWQtYXdzIHBsdWdpbiBmb3IgZW5hYmxpbmcgdGhlIEVDMiBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMtZGlzY292ZXJ5LWVjMi5odG1sPgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy90dXRvcmlhbHMvZWxhc3RpY3NlYXJjaC1vbi1lYzIvPgorIyBmb3IgYSBzdGVwLWJ5LXN0ZXAgdHV0b3JpYWwuCisKKyMgR0NFIGRpc2NvdmVyeSBhbGxvd3MgdG8gdXNlIEdvb2dsZSBDb21wdXRlIEVuZ2luZSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBkaXNjb3ZlcnkuCisjCisjIFlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGNsb3VkLWdjZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBHQ0UgZGlzY292ZXJ5LgorIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxodHRwczovL2dpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC9lbGFzdGljc2VhcmNoLWNsb3VkLWdjZT4uCisKKyMgQXp1cmUgZGlzY292ZXJ5IGFsbG93cyB0byB1c2UgQXp1cmUgQVBJIGluIG9yZGVyIHRvIHBlcmZvcm0gZGlzY292ZXJ5LgorIworIyBZb3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBjbG91ZC1henVyZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBBenVyZSBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9lbGFzdGljc2VhcmNoL2VsYXN0aWNzZWFyY2gtY2xvdWQtYXp1cmU+LgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNsb3cgTG9nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTaGFyZCBsZXZlbCBxdWVyeSBhbmQgZmV0Y2ggdGhyZXNob2xkIGxvZ2dpbmcuCisKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQucXVlcnkud2FybjogMTBzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmluZm86IDVzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmRlYnVnOiAycworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5xdWVyeS50cmFjZTogNTAwbXMKKworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC53YXJuOiAxcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5pbmZvOiA4MDBtcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5kZWJ1ZzogNTAwbXMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQuZmV0Y2gudHJhY2U6IDIwMG1zCisKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC53YXJuOiAxMHMKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC5pbmZvOiA1cworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LmRlYnVnOiAycworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LnRyYWNlOiA1MDBtcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdDIExvZ2dpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI21vbml0b3IuanZtLmdjLnlvdW5nLndhcm46IDEwMDBtcworI21vbml0b3IuanZtLmdjLnlvdW5nLmluZm86IDcwMG1zCisjbW9uaXRvci5qdm0uZ2MueW91bmcuZGVidWc6IDQwMG1zCisKKyNtb25pdG9yLmp2bS5nYy5vbGQud2FybjogMTBzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmluZm86IDVzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmRlYnVnOiAycworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9sb2diYWNrLXRlc3QueG1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nYmFjay10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI5YmZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nYmFjay10ZXN0LnhtbApAQCAtMCwwICsxLDEzIEBACis8IS0tIG9ubHkgb25lIGxpbmUsIHNodXQgdXAgbG9nYmFjayAhIC0tPgorPGNvbmZpZ3VyYXRpb24+CisgICAgPGFwcGVuZGVyIG5hbWU9IlNURE9VVCIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICA8UGF0dGVybj4KKyAgICAgICAgICAgICAgICAlZHt5eXl5LU1NLWRkIEhIOm1tOnNzfSBbJXRocmVhZF0gJS01bGV2ZWwgJWxvZ2dlcnszNn0gLSAlbXNnJW4KKyAgICAgICAgICAgIDwvUGF0dGVybj4KKyAgICAgICAgPC9lbmNvZGVyPgorICAgIDwvYXBwZW5kZXI+CisgICAgPHJvb3QgbGV2ZWw9Ik9GRiI+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTVERPVVQiIC8+CisgICAgPC9yb290PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL21vY2tfdmYuY3NhciBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL21vY2tfdmYuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM3ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbW9ja192Zi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL2ltcG9ydFRvc2NhUHJvcGVydGllcy55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9pbXBvcnRUb3NjYVByb3BlcnRpZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTY2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9pbXBvcnRUb3NjYVByb3BlcnRpZXMueW1sCkBAIC0wLDAgKzEsNDUyIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTGlua1Rlc3Q6CisgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICAgIHByb3BlcnRpZXM6CisgICAgICAgIHN0cmluZ19wcm9wMDE6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiB2YWwxICwga2V5QiA6IHZhbDJ9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDAyOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogInZhbDEiICwga2V5QiA6ICJ2YWwyIn0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMDM6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDogeyJrZXlBIiA6ICJ2YWwxIiAsIGtleUIgOiB2YWwyfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AwNDoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogMTAgLCBrZXlCIDogPGI+dHJ1ZTwvYj4gfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AwNToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogICwga2V5QiA6ICJCaWciIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMDY6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDogeyJrZXlBIiA6IGFhYUEgICwga2V5QiA6IG51bGwgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AwNzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogTlVMTCAgLCBrZXlCIDogTnVsbCB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDA4OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHsia2V5QSIgOiAiIiAgLCBrZXlCIDogImFiY2QiIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMDk6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDogeyJrZXlBIiA6ICIgICIgICwga2V5QiA6ICJhYmNkIiB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDEwOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHsia2V5QSIgOiAiICAgIGFhYWEiICAsIGtleUIgOiAiICAgIGJiYmIiIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMTE6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDogeyJrZXlBIiA6ICJhYWFhICAgICAgIiAgLCBrZXlCIDogImJiYmIgICAgICIgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxMjoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7ImtleUEiIDogIiAgICAgYWFhYSAgICAgICIgICwga2V5QiA6ICIgICAgIGJiYmIgICAgY2NjY2MgICAiIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMTM6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAiYWFhYSIKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMTQ6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAiICAgICAgYWFhYSAgICAgICAgIgorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxNToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IEFiY0QKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMTY6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAgICAgICAgIEFiY0QKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMTc6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAgICAgICAgIEFiY0QgICAgICAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMTg6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiA8Yj5BYmNEPC9iPiAgICAgIAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgc3RyaW5nX3Byb3AxOToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IDxiPkFiY0QgICAgICAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHN0cmluZ19wcm9wMjA6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiBhYWFhCisgICAgICAgICAgICBrZXlhIDogYWFhYQorICAgICAgICAgICAgS2V5YSA6IEFhYWEKKyAgICAgICAgICAgIEtFWUEgOiBubm5uCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDIxOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogTlVMTAorICAgICAgICAgICAga2V5QiA6IG51bGwKKyAgICAgICAgICAgIGtleUMgOiBOdWxsCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdHJpbmdfcHJvcDIyOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBpbnRlZ2VyX3Byb3AwMToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IDEgLCBrZXlCIDogMTAwMH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AwMjoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IE51bGwgLCBrZXlCIDogTlVMTCAsa2V5QyA6IG51bGwgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDAzOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogICwga2V5QiA6IC02MDB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMDM6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAgICAgICAgICAgIDgwMCAgLCBrZXlCIDogICAgICAgICAgLTYwMH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AwNDoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6ICAgICAgICAgICAgICAsIGtleUIgOiAgICAgICAgICAtNjAwfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDA1OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogMTAwICAgICAgICAgICAgICAsIGtleUIgOiAwICAgICAgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDA2OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogMTAwICwga2V5QiA6IDAwfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDA3OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogICAxMDAgICAgLCBrZXlCIDogICAgMTAwICAgICAgICB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMDg6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAxMDAKKyAgICAgICAgICAgIGtleUIgOiAyMDAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AwOToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6ICAgICAgICAgICAgMTAwCisgICAgICAgICAgICBrZXlCIDogMjAwICAgICAgICAgICAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AxMDoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IG51bGwKKyAgICAgICAgICAgIGtleUEgOiBOdWxsCisgICAgICAgICAgICBrZXlCIDogMTExMQorICAgICAgICAgICAga2V5QiA6IDIyMjIKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBpbnRlZ2VyX3Byb3AxMToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IG51bGwKKyAgICAgICAgICAgIGtleUIgOiBOdWxsCisgICAgICAgICAgICBrZXlDIDogTlVMTAorICAgICAgICAgICAga2V5RCA6IAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGludGVnZXJfcHJvcDEyOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgaW50ZWdlcl9wcm9wMTM6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAxMDAgLCBrZXlBIDogMjAwfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGJvb2xlYW5fcHJvcDAxOgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogdHJ1ZSAsIGtleUIgOiBmYWxzZSAsIGtleUMgOiBmYWxzZSB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgYm9vbGVhbl9wcm9wMDI6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiBUUlVFICwga2V5QiA6IEZBTFNFICwga2V5QyA6IEZhbHNlIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBib29sZWFuX3Byb3AwMzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IG51bGwKKyAgICAgICAgICAgIGtleUIgOiBOdWxsCisgICAgICAgICAgICBrZXlDIDogTlVMTAorICAgICAgICAgICAga2V5RCA6IAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGJvb2xlYW5fcHJvcDA0OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogTnVsbCAsIGtleUIgOiBOVUxMICxrZXlDIDogbnVsbCAsa2V5RCA6IH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBib29sZWFuX3Byb3AwNToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6ICAgICAgdHJ1ZSAsIGtleUIgOiBmYWxzZSAgICAgLCBrZXlDIDogICAgIGZhbHNlICAgICAgIH0KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBib29sZWFuX3Byb3AwNjoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6ICAgICB0cnVlCisgICAgICAgICAgICBrZXlCIDogdHJ1ZQorICAgICAgICAgICAga2V5QyA6ICAgICAgIGZhbHNlCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgICAgYm9vbGVhbl9wcm9wMDc6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBib29sZWFuX3Byb3AwODoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IGZhbHNlCisgICAgICAgICAgICBrZXlBIDogdHJ1ZQorICAgICAgICAgICAga2V5QiA6IHRydWUKKyAgICAgICAgICAgIGtleUIgOiBmYWxzZQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGJvb2xlYW5fcHJvcDA5OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6IHtrZXlBIDogdHJ1ZSxrZXlBIDogZmFsc2Usa2V5QiA6IGZhbHNlLGtleUIgOiB0cnVlfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBib29sZWFuCisgICAgICAgIGZsb2F0X3Byb3AwMToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IDEuMjAgLCBrZXlCIDogMy41NmYgLCBrZXlDIDogMzN9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AwMjoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IDAuMDAsIGtleUIgOiAwLjAgLCBrZXlDIDogMCB9CisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AwMzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IG51bGwsIGtleUIgOiBOdWxsICwga2V5QyA6IE5VTEwgLCBrZXlEIDogfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBmbG9hdF9wcm9wMDQ6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAgICAgIDEuMjAgLCBrZXlCIDogMy41NmYgICAgICAgLCBrZXlDIDogICAgICAzMyAgICAgICAgfQorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBmbG9hdF9wcm9wMDU6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGtleUEgOiAzMworICAgICAgICAgICAga2V5QiA6IDEuMjAwMAorICAgICAgICAgICAga2V5QyA6IDMuNjA3ZgorICAgICAgICAgICAga2V5RCA6IDAKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgZmxvYXRfcHJvcDA2OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogICAgICAgMzMKKyAgICAgICAgICAgIGtleUIgOiAxLjIwMDAgICAgICAKKyAgICAgICAgICAgIGtleUMgOiAgICAzLjYwN2YgCisgICAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgbXkgcHJvcGVydHkKKyAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AwNzoKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAga2V5QSA6IG51bGwKKyAgICAgICAgICAgIGtleUIgOiBOdWxsCisgICAgICAgICAgICBrZXlDIDogTlVMTAorICAgICAgICAgICAga2V5RCA6IAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBmbG9hdF9wcm9wMDg6CisgICAgICAgICAgdHlwZTogbWFwCisgICAgICAgICAgZGVzY3JpcHRpb24gOiBhbm90aGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgICAgZmxvYXRfcHJvcDA5OgorICAgICAgICAgIHR5cGU6IG1hcAorICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBrZXlBIDogMy41CisgICAgICAgICAgICBrZXlBIDogMC4wMQorICAgICAgICAgICAga2V5QiA6IDMuNgorICAgICAgICAgICAga2V5QiA6IAorICAgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICB0eXBlOiBmbG9hdAorICAgICAgICBmbG9hdF9wcm9wMTA6CisgICAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogYW5vdGhlciBkZXNjcmlwdGlvbgorICAgICAgICAgICAgZGVmYXVsdDoge2tleUEgOiAwLjAwMDJ9CisgICAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIG15IHByb3BlcnR5CisgICAgICAgICAgICAgIHR5cGU6IGZsb2F0CisgICAgICAgIGZsb2F0X3Byb3AxMToKKyAgICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgICBkZXNjcmlwdGlvbiA6IGFub3RoZXIgZGVzY3JpcHRpb24KKyAgICAgICAgICBkZWZhdWx0OiB7a2V5QSA6IDAuMDAwICwga2V5QSA6IDAwMy41NmYsIGtleUIgOiAzM30KKyAgICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyBteSBwcm9wZXJ0eQorICAgICAgICAgICAgdHlwZTogZmxvYXQKKyAgICAgIGNhcGFiaWxpdGllczoKKyAgICAgICAgbGluazoKKyAgICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL2ltcG9ydFRvc2NhV2l0aEF0dHJpYnV0ZS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9pbXBvcnRUb3NjYVdpdGhBdHRyaWJ1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTFlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9pbXBvcnRUb3NjYVdpdGhBdHRyaWJ1dGUueW1sCkBAIC0wLDAgKzEsNDEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5NeUNvbXB1dGVUZXN0OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBzdGF0dXM6IHN1cHBvcnRlZAorICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIG15QXR0cjoKKyAgICAgICAgdHlwZTogbGlzdAorICAgICAgICBkZXNjcmlwdGlvbjogdGhpcyBpcyBteSBkZXNjcmlwdGlvbgorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtYWxsLW1hcC10ZXN0LnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1hbGwtbWFwLXRlc3QueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjgyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtYWxsLW1hcC10ZXN0LnltbApAQCAtMCwwICsxLDMwIEBACit0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2U6CisgIGFsbFRlc3RUYWc6IHRvc2NhLm5vZGVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBtYXBUZXN0VGFnOiAKKyAgICAgIHN0cmluZ1Rlc3RUYWc6IHN0cmluZ1ZhbDEKKyAgICAgIGxpc3RUZXN0VGFnOgorICAgICAgICAtIGFsbFRlc3RUYWc6IDEgTUIKKyAgICAgICAgLSBsaXN0VGVzdFRhZzogMiBNQgorICAgICAgICAtIHN0cmluZ1Rlc3RUYWc6IHN0cmluZ1ZhbDIKKyAgICB2b2x1bWVfaWQ6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgYWxsVGVzdFRhZzoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEgTUIKKyAgICAgICAgICAtIHN0cmluZ1Rlc3RUYWc6IHN0cmluZ1ZhbDMKKyAgICBhbGxUZXN0VGFnOgorICAgICAgbWFwVGVzdFRhZzogc3RyaW5nCisgICAgICByZXF1aXJlZDogdHJ1ZQorICAgIHNuYXBzaG90X2lkOgorICAgICAgc3RyaW5nVGVzdFRhZzogc3RyaW5nVmFsNAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBsaXN0VGVzdFRhZzoKKyAgICAgICAgLSB0ZXN0VGFnMTogMSBNQgorICAgICAgICAtIG1hcFRlc3RUYWc6CisgICAgICAgICAgLSB0ZXN0VGFnMTogMSBNQgorICAgICAgICAgIC0gdHlwZTogc3RyaW5nVmFsMgorICBjYXBhYmlsaXRpZXM6CisgICAgbWFwVGVzdFRhZzogCisgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgYWxsVGVzdFRhZzogZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LURCTVMueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvbm9ybWF0aXZlLXR5cGVzLW5ldy1EQk1TLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODkxOWQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvbm9ybWF0aXZlLXR5cGVzLW5ldy1EQk1TLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkRCTVM6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudAorICAgIHByb3BlcnRpZXM6CisgICAgICByb290X3Bhc3N3b3JkOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogdGhlIG9wdGlvbmFsIHJvb3QgcGFzc3dvcmQgZm9yIHRoZSBEQk1TIHNlcnZpY2UKKyAgICAgIHBvcnQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgREJNUyBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhIGFuZCByZXF1ZXN0cyAKKyAgICBjYXBhYmlsaXRpZXM6ICAgIAorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLkRhdGFiYXNlIF0KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1uZXctUm9vdC55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LVJvb3QueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjFkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LVJvb3QueW1sCkBAIC0wLDAgKzEsMjMgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuUm9vdDoKKyAgICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIE5vZGUgVHlwZSBhbGwgb3RoZXIgVE9TQ0EgYmFzZSBOb2RlIFR5cGVzIGRlcml2ZSBmcm9tCisgICAgYXR0cmlidXRlczoKKyAgICAgIHRvc2NhX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHRvc2NhX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc3RhdGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGZlYXR1cmU6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gZGVwZW5kZW5jeSA6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Sb290IAorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24KKyAgICAgICAgICBvY2N1cnJlbmNlczogWyAwLCBVTkJPVU5ERUQgXQorICAgIGludGVyZmFjZXM6IAorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIHR5cGU6IHRvc2NhLmludGVyZmFjZXMubm9kZS5saWZlY3ljbGUuU3RhbmRhcmQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1uZXctYmxvY2tTdG9yYWdlLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1uZXctYmxvY2tTdG9yYWdlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI5NjUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvbm9ybWF0aXZlLXR5cGVzLW5ldy1ibG9ja1N0b3JhZ2UueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBzaXplOiAKKyAgICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEgTUIKKyAgICAgIHZvbHVtZV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgc25hcHNob3RfaWQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBhdHRhY2htZW50OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1uZXctY29tcHV0ZS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LWNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjA3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LWNvbXB1dGUueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMuQ29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LWRhdGFiYXNlLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1uZXctZGF0YWJhc2UueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjYxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LWRhdGFiYXNlLnltbApAQCAtMCwwICsxLDI3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLkRhdGFiYXNlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGRhdGFiYXNlCisgICAgICBwb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcG9ydCB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzZXJ2aWNlIHdpbGwgbGlzdGVuIHRvIGZvciBkYXRhCisgICAgICB1c2VyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBvcHRpb25hbCB1c2VyIGFjY291bnQgbmFtZSBmb3IgREIgYWRtaW5pc3RyYXRpb24KKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBwYXNzd29yZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgb3B0aW9uYWwgcGFzc3dvcmQgZm9yIHRoZSBEQiB1c2VyIGFjY291bnQKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5EQk1TCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgZGF0YWJhc2VfZW5kcG9pbnQ6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuRGF0YWJhc2UKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1uZXctcG9ydC55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTU0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXBvcnQueW1sCkBAIC0wLDAgKzEsMzEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgdG9zY2Eubm9kZXMubmV0d29yay5Qb3J0OgorICAgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICBpcF9hZGRyZXNzOgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBvcmRlcjoKKyAgICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgICBkZWZhdWx0OiAwIAorICAgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwCisgICAgICAgIGlzX2RlZmF1bHQ6CisgICAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgICAgIGlwX3JhbmdlX3N0YXJ0OgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBpcF9yYW5nZV9lbmQ6CisgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlICAKKyAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAtIGxpbms6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuTGlua3NUbyAKKyAgICAgICAtIGJpbmRpbmc6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5CaW5kc1RvIApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvbm9ybWF0aXZlLXR5cGVzLW5ldy1zb2Z0d2FyZUNvbXBvbmVudC55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXNvZnR3YXJlQ29tcG9uZW50LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmViOTNhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvbm9ybWF0aXZlLXR5cGVzLW5ldy1zb2Z0d2FyZUNvbXBvbmVudC55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICB0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgIyBkb21haW4tc3BlY2lmaWMgc29mdHdhcmUgY29tcG9uZW50IHZlcnNpb24KKyAgICAgIGNvbXBvbmVudF92ZXJzaW9uOiAKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICNhZG1pbl9jcmVkZW50aWFsOiAKKyAgICAgICMgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsCisgICAgICAgIyByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXdlYlNlcnZlci55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtbmV3LXdlYlNlcnZlci55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5NTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1uZXctd2ViU2VydmVyLnltbApAQCAtMCwwICsxLDExIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIHRvc2NhLm5vZGVzLldlYlNlcnZlcjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgIyBQcml2YXRlLCBsYXllciA0IGVuZHBvaW50cyAKKyAgICAgIGRhdGFfZW5kcG9pbnQ6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICAgICAgYWRtaW5fZW5kcG9pbnQ6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtc3RyaW5nLWxpc3QtdGVzdC55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy9ub3JtYXRpdmUtdHlwZXMtc3RyaW5nLWxpc3QtdGVzdC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyOTJiMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL25vcm1hdGl2ZS10eXBlcy1zdHJpbmctbGlzdC10ZXN0LnltbApAQCAtMCwwICsxLDI5IEBACit0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2U6CisgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIGxpc3RUZXN0VGFnOiAKKyAgICAgIHN0cmluZ1Rlc3RUYWc6IHN0cmluZ1ZhbDEKKyAgICAgIGxpc3RUZXN0VGFnOgorICAgICAgICAtIGxpc3RUZXN0VGFnOiAxIE1CCisgICAgICAgIC0gbGlzdFRlc3RUYWc6IDIgTUIKKyAgICAgICAgLSBzdHJpbmdUZXN0VGFnOiBzdHJpbmdWYWwyCisgICAgdm9sdW1lX2lkOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHN0cmluZ1Rlc3RUYWc6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxIE1CCisgICAgICAgICAgLSBzdHJpbmdUZXN0VGFnOiBzdHJpbmdWYWwzCisgICAgc3RyaW5nVGVzdFRhZzoKKyAgICAgIGxpc3RUZXN0VGFnOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHNuYXBzaG90X2lkOgorICAgICAgc3RyaW5nVGVzdFRhZzogc3RyaW5nVmFsNAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBsaXN0VGVzdFRhZzoKKyAgICAgICAgLSB0ZXN0VGFnMTogMSBNQgorICAgICAgICAtIGxpc3RUZXN0VGFnOgorICAgICAgICAgIC0gdGVzdFRhZzE6IDEgTUIKKyAgICAgICAgICAtIHR5cGU6IHN0cmluZ1ZhbDIKKyAgY2FwYWJpbGl0aWVzOgorICAgIGF0dGFjaG1lbnQ6IAorICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX2R1cGxpY2F0ZU5vZGUueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfZHVwbGljYXRlTm9kZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxNmY0NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX2R1cGxpY2F0ZU5vZGUueW1sCkBAIC0wLDAgKzEsMjMgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMAorCitkZXNjcmlwdGlvbjogPgorICBUaGlzIFRPU0NBIHNpbXBsZSBwcm9maWxlIGRlcGxveXMgbm9kZWpzLCBtb25nb2RiLCBlYWNoIG9uIGEgc2VwYXJhdGUgc2VydmVyCisgIHdpdGggbW9uaXRvcmluZyBlbmFibGVkIGZvciBub2RlanMgc2VydmVyIHdoZXJlIGEgc2FtcGxlIG5vZGVqcyBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAKKwordG9wb2xvZ3lfdGVtcGxhdGU6CisgIG5vZGVfdGVtcGxhdGVzOgorICAgIG1vbmdvX3NlcnZlcjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgbW9uZ29fc2VydmVyOgorICAgICAgdHlwZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAKKyAgCisKKyAgb3V0cHV0czoKKyAgICBub2RlanNfdXJsOgorICAgICAgZGVzY3JpcHRpb246IFVSTCBmb3IgdGhlIG5vZGVqcyBzZXJ2ZXIsIGh0dHA6Ly88SVA+OjMwMDAKKyAgICAgIHZhbHVlOiB7IGdldF9hdHRyaWJ1dGU6IFsgYXBwX3NlcnZlciwgcHJpdmF0ZV9hZGRyZXNzIF0gfQorICAgIG1vbmdvZGJfdXJsOgorICAgICAgZGVzY3JpcHRpb246IFVSTCBmb3IgdGhlIG1vbmdvZGIgc2VydmVyLgorICAgICAgdmFsdWU6IHsgZ2V0X2F0dHJpYnV0ZTogWyBtb25nb19zZXJ2ZXIsIHByaXZhdGVfYWRkcmVzcyBdIH0KKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX2VtcHR5LnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX2VtcHR5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FkNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfZW1wdHkueW1sCkBAIC0wLDAgKzEsMTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMAorCitkZXNjcmlwdGlvbjogPgorICBUaGlzIFRPU0NBIHNpbXBsZSBwcm9maWxlIGRlcGxveXMgbm9kZWpzLCBtb25nb2RiLCBlYWNoIG9uIGEgc2VwYXJhdGUgc2VydmVyCisgIHdpdGggbW9uaXRvcmluZyBlbmFibGVkIGZvciBub2RlanMgc2VydmVyIHdoZXJlIGEgc2FtcGxlIG5vZGVqcyBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAKKworCisgIAorCisgIG91dHB1dHM6CisgICAgbm9kZWpzX3VybDoKKyAgICAgIGRlc2NyaXB0aW9uOiBVUkwgZm9yIHRoZSBub2RlanMgc2VydmVyLCBodHRwOi8vPElQPjozMDAwCisgICAgICB2YWx1ZTogeyBnZXRfYXR0cmlidXRlOiBbIGFwcF9zZXJ2ZXIsIHByaXZhdGVfYWRkcmVzcyBdIH0KKyAgICBtb25nb2RiX3VybDoKKyAgICAgIGRlc2NyaXB0aW9uOiBVUkwgZm9yIHRoZSBtb25nb2RiIHNlcnZlci4KKyAgICAgIHZhbHVlOiB7IGdldF9hdHRyaWJ1dGU6IFsgbW9uZ29fc2VydmVyLCBwcml2YXRlX2FkZHJlc3MgXSB9CisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy90b3BvbG9neV90ZW1wbGF0ZV9pbnB1dHMueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfaW5wdXRzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM2NGUwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfaW5wdXRzLnltbApAQCAtMCwwICsxLDEwMyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wCisKK2Rlc2NyaXB0aW9uOiA+CisgIFRoaXMgVE9TQ0Egc2ltcGxlIHByb2ZpbGUgZGVwbG95cyBub2RlanMsIG1vbmdvZGIsIGVhY2ggb24gYSBzZXBhcmF0ZSBzZXJ2ZXIKKyAgd2l0aCBtb25pdG9yaW5nIGVuYWJsZWQgZm9yIG5vZGVqcyBzZXJ2ZXIgd2hlcmUgYSBzYW1wbGUgbm9kZWpzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIAorCit0b3BvbG9neV90ZW1wbGF0ZToKKyAgaW5wdXRzOgorICAgIHZmX21vZHVsZV9pZDoKKyAgICAgIGhpZGRlbjogZmFsc2UKKyAgICAgIGltbXV0YWJsZTogZmFsc2UKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBJRCBmb3IgdGhpcyBWRiBNb2R1bGUgaW5zdGFuY2UKKyAgICAgIGRlZmF1bHQ6IGR1bW15CisgICAgY21kX2Z3X3Nydl9ncnBfaWQ6CisgICAgICBoaWRkZW46IGZhbHNlCisgICAgICBpbW11dGFibGU6IGZhbHNlCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiB1dWlkIG9mIHRoZSBzZXJ2ZXIgZ3JvdXAKKyAgICAgIGRlZmF1bHQ6IGJlOTdkNTY2LTM1YzEtNGJjNi1hOWRkLWE1ZjE5M2NiYTMxNAorICAgIG5pbWJ1c19oc2xfaW50ZXJmYWNlX3R5cGU6CisgICAgICBoaWRkZW46IGZhbHNlCisgICAgICBpbW11dGFibGU6IGZhbHNlCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlc2NyaXB0aW9uOiBzZXJ2aWNlX2ludGVyZmFjZV90eXBlIGZvciBTZXJ2aWNlSW5zdGFuY2UKKyAgICAgIGRlZmF1bHQ6IG90aGVyCisgICAgY21kX2Z3X25hbWVzOgorICAgICAgaGlkZGVuOiBmYWxzZQorICAgICAgaW1tdXRhYmxlOiBmYWxzZQorICAgICAgdHlwZTogbGlzdAorICAgICAgZGVzY3JpcHRpb246IENvbW1hIERlbGltaXRlZCBMaXN0IG9mIE5hbWVzIGZvciBTZXJ2aWNlSW5zdGFuY2UgVk1zCisgICAgICBkZWZhdWx0OgorICAgICAgLSBaUkRNMkZDTUQwMUNNRDAwMQorICAgICAgLSAnIFpSRE0yRkNNRDAxQ01EMDAyJworICAgICAgLSAnIFpSRE0yRkNNRDAxQ01EMDAzJworICAgICAgLSAnIFpSRE0yRkNNRDAxQ01EMDA0JworICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBjbWRfZndfc2hjX21heF9yZXRyaWVzOgorICAgICAgaGlkZGVuOiBmYWxzZQorICAgICAgaW1tdXRhYmxlOiBmYWxzZQorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgZGVzY3JpcHRpb246IG1heF9yZXRyaWVzIGZvciB0aGUgU2VydmljZUhlYWx0aENoZWNrCisgICAgICBkZWZhdWx0OiAyCisgICAgY21kX2Z3X3NoY191cmxfcGF0aDoKKyAgICAgIGhpZGRlbjogZmFsc2UKKyAgICAgIGltbXV0YWJsZTogZmFsc2UKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVzY3JpcHRpb246IHVybF9wYXRoIGZvciB0aGUgU2VydmljZUhlYWx0aENoZWNrCisgICAgICBkZWZhdWx0OiBsb2NhbC1pcAorICBub2RlX3RlbXBsYXRlczoKKyAgICBub2RlanM6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIgICAgICAKKyAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAgLSBob3N0OgorICAgICAgICAgICAgbm9kZTogYXBwX3NlcnZlciAgICAgIAorICAgIG1vbmdvX2RiOgorICAgICAgdHlwZTogdG9zY2Eubm9kZXMuRGF0YWJhc2UKKyAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAgLSBob3N0OiBtb25nb19kYm1zICAgICAKKyAgICBtb25nb19kYm1zOgorICAgICAgdHlwZTogdG9zY2Eubm9kZXMuREJNUworICAgICAgcHJvcGVydGllczoKKyAgICAgICByb290X3Bhc3N3b3JkOgorICAgICAgICBnZXRfaW5wdXQ6IG5pbWJ1c19oc2xfaW50ZXJmYWNlX3R5cGUKKyAgICAgICMgZml4ZWRfaXBzOgorICAgICAgIyAgLSBpcF9hZGRyZXNzOgorICAgICAgIyAgICAgIGdldF9pbnB1dDogYXBwMl9pbnRfb3RhX2FwcHNfaXBfMQorICAgICAgIyAgICBzdWJuZXRfaWQ6CisgICAgICAjICAgICAgZ2V0X2lucHV0OiBwbWFhX2RwdV9zdWJuZXRfaWQKKyAgICAgICMgIC0gaXBfYWRkcmVzczoKKyAgICAgICMgICAgICBnZXRfaW5wdXQ6IGFwcDJfaW50X290YV9hcHBzX2lwXzMKKyAgICAgICMgICAgc3VibmV0X2lkOgorICAgICAgIyAgICAgIGdldF9pbnB1dDogcG1hYV9kcHVfc3VibmV0X2lkCisgICAgICAjIG5hbWU6CisgICAgICAjICAgIGdldF9pbnB1dDoKKyAgICAgICMgICAgLSBtbnNvYW12ZndfbmFtZXMKKyAgICAgICAjICAgLSBnZXRfaW5wdXQ6IGluZGV4CisgICAgICAjIG1ldGFkYXRhOgorICAgICAjICAgICBwbWFhLnNiX25pYzoKKyAgICAgICMgICAgICBhZGRyZXNzOgorICAgICAgIyAgICAgICAgZ2V0X2lucHV0OiBwbWFhX2RwdV9maXhlZF9pcAorICAgICAgIyAgICAgIGNpZHI6CisgICAgICAjICAgICAgICBnZXRfaW5wdXQ6IHBtYWFfZHB1X2NpZHIKKyAgICAgICMgICAgICBnYXRld2F5OgorICAgICAgIyAgICAgICAgZ2V0X2lucHV0OiBwbWFhX2RwdV9nYXRld2F5CQkgIAorICAgICAgICNwb3J0OgorICAgICAgICMgZ2V0X2lucHV0OiBjbWRfZndfc2hjX21heF9yZXRyaWVzCisgICAgICByZXF1aXJlbWVudHM6CisgICAgICAgIC0gaG9zdDogbW9uZ29fc2VydmVyICAgICAgCisgICAgYXBwX3NlcnZlcjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUgIAorICAgIG1vbmdvX3NlcnZlcjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAKKyAgb3V0cHV0czoKKyAgICBub2RlanNfdXJsOgorICAgICAgZGVzY3JpcHRpb246IFVSTCBmb3IgdGhlIG5vZGVqcyBzZXJ2ZXIsIGh0dHA6Ly88SVA+OjMwMDAKKyAgICAgIHZhbHVlOiB7IGdldF9hdHRyaWJ1dGU6IFsgYXBwX3NlcnZlciwgcHJpdmF0ZV9hZGRyZXNzIF0gfQorICAgIG1vbmdvZGJfdXJsOgorICAgICAgZGVzY3JpcHRpb246IFVSTCBmb3IgdGhlIG1vbmdvZGIgc2VydmVyLgorICAgICAgdmFsdWU6IHsgZ2V0X2F0dHJpYnV0ZTogWyBtb25nb19zZXJ2ZXIsIHByaXZhdGVfYWRkcmVzcyBdIH0KKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX25vZGVFbXB0eS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy90b3BvbG9neV90ZW1wbGF0ZV9ub2RlRW1wdHkueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOGYzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy90b3BvbG9neV90ZW1wbGF0ZV9ub2RlRW1wdHkueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMAorCitkZXNjcmlwdGlvbjogPgorICBUaGlzIFRPU0NBIHNpbXBsZSBwcm9maWxlIGRlcGxveXMgbm9kZWpzLCBtb25nb2RiLCBlYWNoIG9uIGEgc2VwYXJhdGUgc2VydmVyCisgIHdpdGggbW9uaXRvcmluZyBlbmFibGVkIGZvciBub2RlanMgc2VydmVyIHdoZXJlIGEgc2FtcGxlIG5vZGVqcyBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAKKwordG9wb2xvZ3lfdGVtcGxhdGU6CisgIAorICAKKworICBvdXRwdXRzOgorICAgIG5vZGVqc191cmw6CisgICAgICBkZXNjcmlwdGlvbjogVVJMIGZvciB0aGUgbm9kZWpzIHNlcnZlciwgaHR0cDovLzxJUD46MzAwMAorICAgICAgdmFsdWU6IHsgZ2V0X2F0dHJpYnV0ZTogWyBhcHBfc2VydmVyLCBwcml2YXRlX2FkZHJlc3MgXSB9CisgICAgbW9uZ29kYl91cmw6CisgICAgICBkZXNjcmlwdGlvbjogVVJMIGZvciB0aGUgbW9uZ29kYiBzZXJ2ZXIuCisgICAgICB2YWx1ZTogeyBnZXRfYXR0cmlidXRlOiBbIG1vbmdvX3NlcnZlciwgcHJpdmF0ZV9hZGRyZXNzIF0gfQorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfbm9kZVZGLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX25vZGVWRi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxOTY2MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX25vZGVWRi55bWwKQEAgLTAsMCArMSwzOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wCisKK2Rlc2NyaXB0aW9uOiA+CisgIFRoaXMgVE9TQ0Egc2ltcGxlIHByb2ZpbGUgZGVwbG95cyBub2RlanMsIG1vbmdvZGIsIGVhY2ggb24gYSBzZXBhcmF0ZSBzZXJ2ZXIKKyAgd2l0aCBtb25pdG9yaW5nIGVuYWJsZWQgZm9yIG5vZGVqcyBzZXJ2ZXIgd2hlcmUgYSBzYW1wbGUgbm9kZWpzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIAorCit0b3BvbG9neV90ZW1wbGF0ZToKKyAgbm9kZV90ZW1wbGF0ZXM6CisgICAgbXlfbm9kZToKKyAgICAgIHR5cGU6IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmYuUmVzb3VyY2UxOQorICAgIG5vZGVqczoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLldlYlNlcnZlciAgICAgIAorICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgICAtIGhvc3Q6CisgICAgICAgICAgICBub2RlOiBhcHBfc2VydmVyICAgICAgCisgICAgbW9uZ29fZGI6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgICAtIGhvc3Q6IG1vbmdvX2RibXMgICAgIAorICAgIG1vbmdvX2RibXM6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5EQk1TCisgICAgICByZXF1aXJlbWVudHM6CisgICAgICAgIC0gaG9zdDogbW9uZ29fc2VydmVyICAgICAgCisgICAgYXBwX3NlcnZlcjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUgIAorICAgIG1vbmdvX3NlcnZlcjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgCisgIAorCisgIG91dHB1dHM6CisgICAgbm9kZWpzX3VybDoKKyAgICAgIGRlc2NyaXB0aW9uOiBVUkwgZm9yIHRoZSBub2RlanMgc2VydmVyLCBodHRwOi8vPElQPjozMDAwCisgICAgICB2YWx1ZTogeyBnZXRfYXR0cmlidXRlOiBbIGFwcF9zZXJ2ZXIsIHByaXZhdGVfYWRkcmVzcyBdIH0KKyAgICBtb25nb2RiX3VybDoKKyAgICAgIGRlc2NyaXB0aW9uOiBVUkwgZm9yIHRoZSBtb25nb2RiIHNlcnZlci4KKyAgICAgIHZhbHVlOiB7IGdldF9hdHRyaWJ1dGU6IFsgbW9uZ29fc2VydmVyLCBwcml2YXRlX2FkZHJlc3MgXSB9CisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy90b3BvbG9neV90ZW1wbGF0ZV9ub3RWYWxpZE5vZGUueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfbm90VmFsaWROb2RlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDUzNGZjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfbm90VmFsaWROb2RlLnltbApAQCAtMCwwICsxLDM2IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzAKKworZGVzY3JpcHRpb246ID4KKyAgVGhpcyBUT1NDQSBzaW1wbGUgcHJvZmlsZSBkZXBsb3lzIG5vZGVqcywgbW9uZ29kYiwgZWFjaCBvbiBhIHNlcGFyYXRlIHNlcnZlcgorICB3aXRoIG1vbml0b3JpbmcgZW5hYmxlZCBmb3Igbm9kZWpzIHNlcnZlciB3aGVyZSBhIHNhbXBsZSBub2RlanMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gCisKK3RvcG9sb2d5X3RlbXBsYXRlOgorICBub2RlX3RlbXBsYXRlczoKKyAgICBub2RlanM6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5LVUtVICAgICAgCisgICAgICByZXF1aXJlbWVudHM6CisgICAgICAgIC0gaG9zdDoKKyAgICAgICAgICAgIG5vZGU6IGFwcF9zZXJ2ZXIgICAgICAKKyAgICBtb25nb19kYjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgICByZXF1aXJlbWVudHM6CisgICAgICAgIC0gaG9zdDogbW9uZ29fZGJtcyAgICAgCisgICAgbW9uZ29fZGJtczoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkRCTVMKKyAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAgLSBob3N0OiBtb25nb19zZXJ2ZXIgICAgICAKKyAgICBhcHBfc2VydmVyOgorICAgICAgdHlwZTogdG9zY2Eubm9kZXMuQ29tcHV0ZSAgCisgICAgbW9uZ29fc2VydmVyOgorICAgICAgdHlwZTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAKKyAgCisKKyAgb3V0cHV0czoKKyAgICBub2RlanNfdXJsOgorICAgICAgZGVzY3JpcHRpb246IFVSTCBmb3IgdGhlIG5vZGVqcyBzZXJ2ZXIsIGh0dHA6Ly88SVA+OjMwMDAKKyAgICAgIHZhbHVlOiB7IGdldF9hdHRyaWJ1dGU6IFsgYXBwX3NlcnZlciwgcHJpdmF0ZV9hZGRyZXNzIF0gfQorICAgIG1vbmdvZGJfdXJsOgorICAgICAgZGVzY3JpcHRpb246IFVSTCBmb3IgdGhlIG1vbmdvZGIgc2VydmVyLgorICAgICAgdmFsdWU6IHsgZ2V0X2F0dHJpYnV0ZTogWyBtb25nb19zZXJ2ZXIsIHByaXZhdGVfYWRkcmVzcyBdIH0KKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX25vdFZhbGlkUmVsYXRpb25Ob2RlLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL25vcm1hdGl2ZVR5cGVzL3RvcG9sb2d5X3RlbXBsYXRlX25vdFZhbGlkUmVsYXRpb25Ob2RlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjA2NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfbm90VmFsaWRSZWxhdGlvbk5vZGUueW1sCkBAIC0wLDAgKzEsMzYgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMAorCitkZXNjcmlwdGlvbjogPgorICBUaGlzIFRPU0NBIHNpbXBsZSBwcm9maWxlIGRlcGxveXMgbm9kZWpzLCBtb25nb2RiLCBlYWNoIG9uIGEgc2VwYXJhdGUgc2VydmVyCisgIHdpdGggbW9uaXRvcmluZyBlbmFibGVkIGZvciBub2RlanMgc2VydmVyIHdoZXJlIGEgc2FtcGxlIG5vZGVqcyBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAKKwordG9wb2xvZ3lfdGVtcGxhdGU6CisgIG5vZGVfdGVtcGxhdGVzOgorICAgIG5vZGVqczoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLldlYlNlcnZlciAgICAgIAorICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgICAtIGhvc3Q6CisgICAgICAgICAgICBub2RlOiBLVUtVICAgICAgCisgICAgbW9uZ29fZGI6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5EYXRhYmFzZQorICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgICAtIGhvc3Q6IG1vbmdvX2RibXMgICAgIAorICAgIG1vbmdvX2RibXM6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5EQk1TCisgICAgICByZXF1aXJlbWVudHM6CisgICAgICAgIC0gaG9zdDogbW9uZ29fc2VydmVyICAgICAgCisgICAgYXBwX3NlcnZlcjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUgIAorICAgIG1vbmdvX3NlcnZlcjoKKyAgICAgIHR5cGU6IHRvc2NhLm5vZGVzLkNvbXB1dGUKKyAgICAgCisgIAorCisgIG91dHB1dHM6CisgICAgbm9kZWpzX3VybDoKKyAgICAgIGRlc2NyaXB0aW9uOiBVUkwgZm9yIHRoZSBub2RlanMgc2VydmVyLCBodHRwOi8vPElQPjozMDAwCisgICAgICB2YWx1ZTogeyBnZXRfYXR0cmlidXRlOiBbIGFwcF9zZXJ2ZXIsIHByaXZhdGVfYWRkcmVzcyBdIH0KKyAgICBtb25nb2RiX3VybDoKKyAgICAgIGRlc2NyaXB0aW9uOiBVUkwgZm9yIHRoZSBtb25nb2RiIHNlcnZlci4KKyAgICAgIHZhbHVlOiB7IGdldF9hdHRyaWJ1dGU6IFsgbW9uZ29fc2VydmVyLCBwcml2YXRlX2FkZHJlc3MgXSB9CisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy9ub3JtYXRpdmVUeXBlcy90b3BvbG9neV90ZW1wbGF0ZV9zYW1wbGUueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfc2FtcGxlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY4NWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvbm9ybWF0aXZlVHlwZXMvdG9wb2xvZ3lfdGVtcGxhdGVfc2FtcGxlLnltbApAQCAtMCwwICsxLDM2IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzAKKworZGVzY3JpcHRpb246ID4KKyAgVGhpcyBUT1NDQSBzaW1wbGUgcHJvZmlsZSBkZXBsb3lzIG5vZGVqcywgbW9uZ29kYiwgZWFjaCBvbiBhIHNlcGFyYXRlIHNlcnZlcgorICB3aXRoIG1vbml0b3JpbmcgZW5hYmxlZCBmb3Igbm9kZWpzIHNlcnZlciB3aGVyZSBhIHNhbXBsZSBub2RlanMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gCisKK3RvcG9sb2d5X3RlbXBsYXRlOgorICBub2RlX3RlbXBsYXRlczoKKyAgICBub2RlanM6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIgICAgICAKKyAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAgLSBob3N0OgorICAgICAgICAgICAgbm9kZTogYXBwX3NlcnZlciAgICAgIAorICAgIG1vbmdvX2RiOgorICAgICAgdHlwZTogdG9zY2Eubm9kZXMuRGF0YWJhc2UKKyAgICAgIHJlcXVpcmVtZW50czoKKyAgICAgICAgLSBob3N0OiBtb25nb19kYm1zICAgICAKKyAgICBtb25nb19kYm1zOgorICAgICAgdHlwZTogdG9zY2Eubm9kZXMuREJNUworICAgICAgcmVxdWlyZW1lbnRzOgorICAgICAgICAtIGhvc3Q6IG1vbmdvX3NlcnZlciAgICAgIAorICAgIGFwcF9zZXJ2ZXI6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5Db21wdXRlICAKKyAgICBtb25nb19zZXJ2ZXI6CisgICAgICB0eXBlOiB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgIAorICAKKworICBvdXRwdXRzOgorICAgIG5vZGVqc191cmw6CisgICAgICBkZXNjcmlwdGlvbjogVVJMIGZvciB0aGUgbm9kZWpzIHNlcnZlciwgaHR0cDovLzxJUD46MzAwMAorICAgICAgdmFsdWU6IHsgZ2V0X2F0dHJpYnV0ZTogWyBhcHBfc2VydmVyLCBwcml2YXRlX2FkZHJlc3MgXSB9CisgICAgbW9uZ29kYl91cmw6CisgICAgICBkZXNjcmlwdGlvbjogVVJMIGZvciB0aGUgbW9uZ29kYiBzZXJ2ZXIuCisgICAgICB2YWx1ZTogeyBnZXRfYXR0cmlidXRlOiBbIG1vbmdvX3NlcnZlciwgcHJpdmF0ZV9hZGRyZXNzIF0gfQorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvY2FwYWJpbGl0eVR5cGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2NhcGFiaWxpdHlUeXBlcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkNjYxYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2NhcGFiaWxpdHlUeXBlcy55bWwKQEAgLTAsMCArMSwxNDggQEAKK3Rvc2NhLmNhcGFiaWxpdGllcy5Sb290OiAKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSByb290IENhcGFiaWxpdHkgVHlwZSBhbGwgb3RoZXIgVE9TQ0EgYmFzZSBDYXBhYmlsaXR5IFR5cGVzIGRlcml2ZSBmcm9tCit0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAordG9zY2EuY2FwYWJpbGl0aWVzLk5vZGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKK3Rvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXI6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBudW1fY3B1czogCisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEKKyAgICBjcHVfZnJlcXVlbmN5OgorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuZnJlcXVlbmN5CisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDAuMSBHSHoKKyAgICBkaXNrX3NpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwIE1CCisgICAgbWVtX3NpemU6IAorICAgICAgdHlwZTogc2NhbGFyLXVuaXQuc2l6ZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwIE1CCit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBwcm90b2NvbDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVmYXVsdDogdGNwCisgICAgcG9ydDoKKyAgICAgIHR5cGU6IFBvcnREZWYKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHNlY3VyZToKKyAgICAgIHR5cGU6IGJvb2xlYW4KKyAgICAgIGRlZmF1bHQ6IGZhbHNlCisgICAgdXJsX3BhdGg6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBwb3J0X25hbWU6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBuZXR3b3JrX25hbWU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZSAKKyAgICAgIGRlZmF1bHQ6IFBSSVZBVEUKKyAgICBpbml0aWF0b3I6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGRlZmF1bHQ6IHNvdXJjZQorICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbIHNvdXJjZSwgdGFyZ2V0LCBwZWVyIF0KKyAgICBwb3J0czoKKyAgICAgIHR5cGU6IG1hcAorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBtaW5fbGVuZ3RoOiAxCisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IFBvcnRTcGVjCisgIGF0dHJpYnV0ZXM6CisgICAgaXBfYWRkcmVzczoKKyAgICAgIHR5cGU6IHN0cmluZwordG9zY2EuY2FwYWJpbGl0aWVzLkRhdGFiYXNlRW5kcG9pbnQ6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50Cit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuUHVibGljOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludAorICBwcm9wZXJ0aWVzOgorICAgICMgQ2hhbmdlIHRoZSBkZWZhdWx0IG5ldHdvcmtfbmFtZSB0byB1c2UgdGhlIGZpcnN0IHB1YmxpYyBuZXR3b3JrIGZvdW5kCisgICAgbmV0d29ya19uYW1lOiBQVUJMSUMKKyAgICBmbG9hdGluZzoKKyAgICAgIGRlc2NyaXB0aW9uOiA+IAorICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgcHVibGljIGFkZHJlc3Mgc2hvdWxkIGJlIGFsbG9jYXRlZCBmcm9tIGEgcG9vbCBvZiBmbG9hdGluZyBJUHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXR3b3JrLgorICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgZGVmYXVsdDogZmFsc2UKKyAgICAgIHN0YXR1czogZXhwZXJpbWVudGFsCisgICAgZG5zX25hbWU6CisgICAgICBkZXNjcmlwdGlvbjogVGhlIG9wdGlvbmFsIG5hbWUgdG8gcmVnaXN0ZXIgd2l0aCBETlMgCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZSAgICAKKyAgICAgIHN0YXR1czogZXhwZXJpbWVudGFsCit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW46CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICMgQ2hhbmdlIEVuZHBvaW50IHNlY3VyZSBpbmRpY2F0b3IgdG8gdHJ1ZSBmcm9tIGl0cyBkZWZhdWx0IG9mIGZhbHNlCisgIHByb3BlcnRpZXM6CisgICAgc2VjdXJlOiB0cnVlCit0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuRGF0YWJhc2U6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50IAordG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICBwcm9wZXJ0aWVzOgorICAgIGFyY2hpdGVjdHVyZToKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlIAorICAgIHR5cGU6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGRpc3RyaWJ1dGlvbjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgdmVyc2lvbjoKKyAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgIHJlcXVpcmVkOiBmYWxzZQordG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisgIHByb3BlcnRpZXM6CisgICAgbWluX2luc3RhbmNlczoKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIGRlZmF1bHQ6IDEKKyAgICBtYXhfaW5zdGFuY2VzOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgZGVmYXVsdDogMQorICAgIGRlZmF1bHRfaW5zdGFuY2VzOgorICAgICAgdHlwZTogaW50ZWdlcgordG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGU6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUKKworCit0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyLkRvY2tlcjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgIHByb3BlcnRpZXM6CisgICAgdmVyc2lvbjoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZW50cnlfc2NoZW1hOiB2ZXJzaW9uCisgICAgcHVibGlzaF9hbGw6CisgICAgICB0eXBlOiBib29sZWFuCisgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcHVibGlzaF9wb3J0czoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYTogUG9ydFNwZWMKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGV4cG9zZV9wb3J0czoKKyAgICAgIHR5cGU6IGxpc3QKKyAgICAgIGVudHJ5X3NjaGVtYTogUG9ydFNwZWMKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHZvbHVtZXM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBlbnRyeV9zY2hlbWE6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCit0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZToKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2NhcGFiaWxpdHlUeXBlcy56aXAgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9jYXBhYmlsaXR5VHlwZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTQ1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9jYXBhYmlsaXR5VHlwZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2NhdGVnb3J5VHlwZXMueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvY2F0ZWdvcnlUeXBlcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1M2Y5YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2NhdGVnb3J5VHlwZXMueW1sCkBAIC0wLDAgKzEsNzQgQEAKK3NlcnZpY2VzOgorICAgIE1vYmlsaXR5OgorICAgICAgbmFtZTogIk1vYmlsaXR5IgorICAgICAgaWNvbnM6IFsnbW9iaWxpdHknXQorICAgIE5ldHdvcmtfTDFfMzoKKyAgICAgIG5hbWU6ICJOZXR3b3JrIEwxLTMiCisgICAgICBpY29uczogWyduZXR3b3JrX2xfMS0zJ10KKyAgICBOZXR3b3JrX0w0OgorICAgICAgbmFtZTogIk5ldHdvcmsgTDQiCisgICAgICBpY29uczogWyduZXR3b3JrX2xfNCddCisgICAgVm9JUF9DYWxsX0NvbnRyb2w6CisgICAgICBuYW1lOiAiVm9JUCBDYWxsIENvbnRyb2wiCisgICAgICBpY29uczogWydjYWxsX2NvbnRyb2xsJ10KK3Jlc291cmNlczoKKyAgTmV0d29ya0xheWVyMjM6CisgICAgbmFtZTogIk5ldHdvcmsgTGF5ZXIgMi0zIgorICAgIHN1YmNhdGVnb3JpZXM6IAorICAgICAgUm91dGVyOgorICAgICAgICAgIG5hbWU6ICJSb3V0ZXIiCisgICAgICAgICAgaWNvbnM6IFsncm91dGVyJ10KKyAgICAgIEdhdGV3YXk6CisgICAgICAgICAgbmFtZTogIkdhdGV3YXkiCisgICAgICAgICAgaWNvbnM6IFsnZ2F0ZXdheSddCisgICAgICBXQU5fQ29ubmVjdG9yczoKKyAgICAgICAgICBuYW1lOiAiV0FOIENvbm5lY3RvcnMiCisgICAgICAgICAgaWNvbnM6IFsnY29ubmVjdG9yJ10KKyAgICAgIExBTl9Db25uZWN0b3JzOgorICAgICAgICAgIG5hbWU6ICJMQU4gQ29ubmVjdG9ycyIKKyAgICAgICAgICBpY29uczogWydjb25uZWN0b3InXQorICBOZXR3b3JrTGF5ZXI0OgorICAgIG5hbWU6ICJOZXR3b3JrIExheWVyIDQrIgorICAgIHN1YmNhdGVnb3JpZXM6IAorICAgICAgQ29tbW9uX05ldHdvcmtfUmVzb3VyY2VzOgorICAgICAgICAgIG5hbWU6ICJDb21tb24gTmV0d29yayBSZXNvdXJjZXMiCisgICAgICAgICAgaWNvbnM6IFsnbmV0d29yaycsICdsb2FkQmFsYW5jZXInXQorICBBcHBsaWNhdGlvbkxheWVyNDoKKyAgICBuYW1lOiAiQXBwbGljYXRpb24gTGF5ZXIgNCsiCisgICAgc3ViY2F0ZWdvcmllczogCisgICAgICBCb3JkZXJfRWxlbWVudHM6CisgICAgICAgICAgbmFtZTogIkJvcmRlciBFbGVtZW50cyIKKyAgICAgICAgICBpY29uczogWydib3JkZXJFbGVtZW50J10KKyAgICAgIEFwcGxpY2F0aW9uX1NlcnZlcnM6CisgICAgICAgICAgbmFtZTogIkFwcGxpY2F0aW9uIFNlcnZlcnMiCisgICAgICAgICAgaWNvbnM6IFsnYXBwbGljYXRpb25TZXJ2ZXInLCAnc2VydmVyJ10KKyAgICAgIFdlYl9TZXJ2ZXI6CisgICAgICAgICAgbmFtZTogIldlYiBTZXJ2ZXIiCisgICAgICAgICAgaWNvbnM6IFsnYXBwbGljYXRpb25TZXJ2ZXInLCAnc2VydmVyJ10KKyAgICAgIENhbGxfQ29udHJvbDoKKyAgICAgICAgICBuYW1lOiAiQ2FsbCBDb250cm9sIgorICAgICAgICAgIGljb25zOiBbJ2NhbGxfY29udHJvbGwnXQorICAgICAgTWVkaWFfU2VydmVyczoKKyAgICAgICAgICBuYW1lOiAiTWVkaWEgU2VydmVycyIKKyAgICAgICAgICBpY29uczogWydhcHBsaWNhdGlvblNlcnZlcicsICdzZXJ2ZXInXQorICAgICAgTG9hZF9CYWxhbmNlcjoKKyAgICAgICAgICBuYW1lOiAiTG9hZCBCYWxhbmNlciIKKyAgICAgICAgICBpY29uczogWydsb2FkQmFsYW5jZXInXQorICAgICAgRGF0YWJhc2U6CisgICAgICAgICAgbmFtZTogIkRhdGFiYXNlIgorICAgICAgICAgIGljb25zOiBbJ2RhdGFiYXNlJ10KKyAgR2VuZXJpYzoKKyAgICBuYW1lOiAiR2VuZXJpYyIKKyAgICBzdWJjYXRlZ29yaWVzOiAKKyAgICAgIEluZnJhc3RydWN0dXJlOgorICAgICAgICAgIG5hbWU6ICJJbmZyYXN0cnVjdHVyZSIKKyAgICAgICAgICBpY29uczogWydvYmplY3RTdG9yYWdlJywgJ2NvbXB1dGUnXQorICAgICAgQWJzdHJhY3Q6CisgICAgICAgICAgbmFtZTogIkFic3RyYWN0IgorICAgICAgICAgIGljb25zOiBbJ29iamVjdFN0b3JhZ2UnLCAnY29tcHV0ZSddCisgICAgICBOZXR3b3JrX0VsZW1lbnRzOgorICAgICAgICAgIG5hbWU6ICJOZXR3b3JrIEVsZW1lbnRzIgorICAgICAgICAgIGljb25zOiBbJ3BvcnQnLCAnbmV0d29yaycsICdyb3V0ZXInXQorICAgICAgRGF0YWJhc2U6CisgICAgICAgICAgbmFtZTogIkRhdGFiYXNlIgorICAgICAgICAgIGljb25zOiBbJ2RhdGFiYXNlJ10KZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2NhdGVnb3J5VHlwZXMuemlwIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvY2F0ZWdvcnlUeXBlcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwOGE2YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2NhdGVnb3J5VHlwZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZURlcml2ZUZyb21JbnRlZ2VyV2l0aFByb3BlcnR5LnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZURlcml2ZUZyb21JbnRlZ2VyV2l0aFByb3BlcnR5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQwZjg3MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZURlcml2ZUZyb21JbnRlZ2VyV2l0aFByb3BlcnR5LnltbApAQCAtMCwwICsxLDggQEAKK2ludGVnZXI6CisgIAorbXl0eXBlcy5waG9uZW51bWJlcjoKKyAgZGVyaXZlZF9mcm9tOiBpbnRlZ2VyCisgIGRlc2NyaXB0aW9uOiBteSBwaG9uZSBudW1iZXIgZGF0YXR5cGUKKyAgcHJvcGVydGllczoKKyAgICBjb3VudHJ5Y29kZToKKyAgICAgIHR5cGU6IGludGVnZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZURlcml2ZWRGcm9tUm9vdE5vUHJvcGVydGllcy55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVEZXJpdmVkRnJvbVJvb3ROb1Byb3BlcnRpZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzJjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVEZXJpdmVkRnJvbVJvb3ROb1Byb3BlcnRpZXMueW1sCkBAIC0wLDAgKzEsNCBAQAorIyBkZWZpbmUgYSBuZXcgZGF0YXR5cGUgdGhhdCBkZXJpdmVzIGZyb20gZXhpc3RpbmcgdHlwZSBhbmQgZXh0ZW5kcyBpdAorbXl0eXBlcy5waG9uZW51bWJlci5leHRlbmRlZDoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBkZXNjcmlwdGlvbjogY3VzdG9tIHBob25lIG51bWJlciB0eXBlIHRoYXQgZXh0ZW5kcyB0aGUgYmFzaWMgcGhvbmVudW1iZXIgdHlwZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlRHVwbGljYXRlUHJvcGVydHkueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlRHVwbGljYXRlUHJvcGVydHkueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWQ5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVEdXBsaWNhdGVQcm9wZXJ0eS55bWwKQEAgLTAsMCArMSwxMSBAQAorbXl0eXBlcy5waG9uZW51bWJlcjoKKyAgZGVzY3JpcHRpb246IG15IHBob25lIG51bWJlciBkYXRhdHlwZQorICBwcm9wZXJ0aWVzOgorICAgIGNvdW50cnljb2RlOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgIGFyZWFjb2RlMToKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICBudW1iZXI6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgYXJlYWNvZGUxOgorICAgICAgdHlwZTogaW50ZWdlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlRm9yR3JvdXAueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlRm9yR3JvdXAueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTFhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVGb3JHcm91cC55bWwKQEAgLTAsMCArMSw0MCBAQAordG9zY2EuZGF0YXR5cGVzLlJvb3Q6CisgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0Egcm9vdCBEYXRhIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgRGF0YSBUeXBlcyBkZXJpdmUgZnJvbQorCitpbnRlZ2VyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK3N0cmluZzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCitib29sZWFuOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK2Zsb2F0OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK2xpc3Q6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKworbWFwOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHRva2VuX3R5cGU6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZWZhdWx0OiBwYXNzd29yZAorICAgIHRva2VuOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgIGtleXM6CisgICAgICB0eXBlOiBtYXAKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICB1c2VyOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVQcm9wZXJ0eVJlbW92ZWRfcGFydDEueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlUHJvcGVydHlSZW1vdmVkX3BhcnQxLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNkYzNiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlUHJvcGVydHlSZW1vdmVkX3BhcnQxLnltbApAQCAtMCwwICsxLDE1IEBACit0b3NjYS5kYXRhdHlwZXMuUm9vdDoKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSByb290IERhdGEgVHlwZSBhbGwgb3RoZXIgVE9TQ0EgYmFzZSBEYXRhIFR5cGVzIGRlcml2ZSBmcm9tCisKK3N0cmluZzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCit0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbDogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogCisgICAgcHJvdG9jb2wxOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcHJvdG9jb2wyOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVQcm9wZXJ0eVJlbW92ZWRfcGFydDIueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlUHJvcGVydHlSZW1vdmVkX3BhcnQyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTViZTYwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlUHJvcGVydHlSZW1vdmVkX3BhcnQyLnltbApAQCAtMCwwICsxLDEyIEBACit0b3NjYS5kYXRhdHlwZXMuUm9vdDoKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSByb290IERhdGEgVHlwZSBhbGwgb3RoZXIgVE9TQ0EgYmFzZSBEYXRhIFR5cGVzIGRlcml2ZSBmcm9tCisKK3N0cmluZzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCit0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbDogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogCisgICAgcHJvdG9jb2wxOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aERpZmZlcmVudERlcml2ZWREYXRhVHlwZV9wYXJ0MS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVXaXRoRGlmZmVyZW50RGVyaXZlZERhdGFUeXBlX3BhcnQxLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FhZmYyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aERpZmZlcmVudERlcml2ZWREYXRhVHlwZV9wYXJ0MS55bWwKQEAgLTAsMCArMSwxOSBAQAordG9zY2EuZGF0YXR5cGVzLlJvb3Q6CisgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0Egcm9vdCBEYXRhIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgRGF0YSBUeXBlcyBkZXJpdmUgZnJvbQorCitzdHJpbmc6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKwordG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwyOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDI6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKwordG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWw6IAorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIHByb3BlcnRpZXM6IAorICAgIHByb3RvY29sOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVXaXRoRGlmZmVyZW50RGVyaXZlZERhdGFUeXBlX3BhcnQyLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhEaWZmZXJlbnREZXJpdmVkRGF0YVR5cGVfcGFydDIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODk3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVXaXRoRGlmZmVyZW50RGVyaXZlZERhdGFUeXBlX3BhcnQyLnltbApAQCAtMCwwICsxLDE5IEBACit0b3NjYS5kYXRhdHlwZXMuUm9vdDoKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSByb290IERhdGEgVHlwZSBhbGwgb3RoZXIgVE9TQ0EgYmFzZSBEYXRhIFR5cGVzIGRlcml2ZSBmcm9tCisKK3N0cmluZzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCit0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbDI6IAorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIHByb3BlcnRpZXM6IAorICAgIHByb3RvY29sMjogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorCit0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbDogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwyCisgIHByb3BlcnRpZXM6IAorICAgIHByb3RvY29sOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aERpZmZlcmVudEVudHJ5VHlwZV9wYXJ0MS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVXaXRoRGlmZmVyZW50RW50cnlUeXBlX3BhcnQxLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc4NGQxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aERpZmZlcmVudEVudHJ5VHlwZV9wYXJ0MS55bWwKQEAgLTAsMCArMSwyMCBAQAordG9zY2EuZGF0YXR5cGVzLlJvb3Q6CisgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0Egcm9vdCBEYXRhIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgRGF0YSBUeXBlcyBkZXJpdmUgZnJvbQorCitzdHJpbmc6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgCitpbnRlZ2VyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290IAorCittYXA6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QgCisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBrZXlzOgorICAgICAgdHlwZTogbWFwCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogaW50ZWdlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aERpZmZlcmVudEVudHJ5VHlwZV9wYXJ0Mi55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVXaXRoRGlmZmVyZW50RW50cnlUeXBlX3BhcnQyLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU1MzlkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aERpZmZlcmVudEVudHJ5VHlwZV9wYXJ0Mi55bWwKQEAgLTAsMCArMSwyMCBAQAordG9zY2EuZGF0YXR5cGVzLlJvb3Q6CisgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0Egcm9vdCBEYXRhIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgRGF0YSBUeXBlcyBkZXJpdmUgZnJvbQorCitzdHJpbmc6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgCitpbnRlZ2VyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290IAorCittYXA6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QgCisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBrZXlzOgorICAgICAgdHlwZTogbWFwCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogc3RyaW5nCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVXaXRoRGlmZmVyZW50UHJvcGVydHlUeXBlX3BhcnQxLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhEaWZmZXJlbnRQcm9wZXJ0eVR5cGVfcGFydDEueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTQ5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVVcGRhdGVXaXRoRGlmZmVyZW50UHJvcGVydHlUeXBlX3BhcnQxLnltbApAQCAtMCwwICsxLDIyIEBACit0b3NjYS5kYXRhdHlwZXMuUm9vdDoKKyAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSByb290IERhdGEgVHlwZSBhbGwgb3RoZXIgVE9TQ0EgYmFzZSBEYXRhIFR5cGVzIGRlcml2ZSBmcm9tCisKK3N0cmluZzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICAKK2ludGVnZXI6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QgCisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsMjogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogCisgICAgcHJvdG9jb2wyOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDogCisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICByZXF1aXJlZDogZmFsc2UKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhEaWZmZXJlbnRQcm9wZXJ0eVR5cGVfcGFydDIueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aERpZmZlcmVudFByb3BlcnR5VHlwZV9wYXJ0Mi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlMjZhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhEaWZmZXJlbnRQcm9wZXJ0eVR5cGVfcGFydDIueW1sCkBAIC0wLDAgKzEsMTkgQEAKK3Rvc2NhLmRhdGF0eXBlcy5Sb290OgorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIHJvb3QgRGF0YSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIERhdGEgVHlwZXMgZGVyaXZlIGZyb20KKworc3RyaW5nOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsMjogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogCisgICAgcHJvdG9jb2wyOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhFeGlzdGluZ1Byb3BlcnR5TmFtZUluQW5jZXN0b3JfcGFydDEueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aEV4aXN0aW5nUHJvcGVydHlOYW1lSW5BbmNlc3Rvcl9wYXJ0MS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlMjZhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhFeGlzdGluZ1Byb3BlcnR5TmFtZUluQW5jZXN0b3JfcGFydDEueW1sCkBAIC0wLDAgKzEsMTkgQEAKK3Rvc2NhLmRhdGF0eXBlcy5Sb290OgorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIHJvb3QgRGF0YSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIERhdGEgVHlwZXMgZGVyaXZlIGZyb20KKworc3RyaW5nOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsMjogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogCisgICAgcHJvdG9jb2wyOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgcmVxdWlyZWQ6IGZhbHNlCisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhFeGlzdGluZ1Byb3BlcnR5TmFtZUluQW5jZXN0b3JfcGFydDIueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2RhdGFUeXBlVXBkYXRlV2l0aEV4aXN0aW5nUHJvcGVydHlOYW1lSW5BbmNlc3Rvcl9wYXJ0Mi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5NDVmYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVVwZGF0ZVdpdGhFeGlzdGluZ1Byb3BlcnR5TmFtZUluQW5jZXN0b3JfcGFydDIueW1sCkBAIC0wLDAgKzEsMjUgQEAKK3Rvc2NhLmRhdGF0eXBlcy5Sb290OgorICBkZXNjcmlwdGlvbjogVGhlIFRPU0NBIHJvb3QgRGF0YSBUeXBlIGFsbCBvdGhlciBUT1NDQSBiYXNlIERhdGEgVHlwZXMgZGVyaXZlIGZyb20KKworc3RyaW5nOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIAoraW50ZWdlcjoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdCAKKwordG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwyOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDI6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKwordG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWw6IAorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsMgorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDogCisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBwcm90b2NvbDI6IAorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgcmVxdWlyZWQ6IGZhbHNlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVXaXRoUHJvcGVydHlUeXBlVGhpc0RhdGFUeXBlLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZVdpdGhQcm9wZXJ0eVR5cGVUaGlzRGF0YVR5cGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVXaXRoUHJvcGVydHlUeXBlVGhpc0RhdGFUeXBlLnltbApAQCAtMCwwICsxLDkgQEAKK215dHlwZXMucGhvbmVudW1iZXI6CisgIGRlc2NyaXB0aW9uOiBteSBwaG9uZSBudW1iZXIgZGF0YXR5cGUKKyAgcHJvcGVydGllczoKKyAgICBjb3VudHJ5Y29kZToKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICBhcmVhY29kZToKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICBudW1iZXI6CisgICAgICB0eXBlOiBteXR5cGVzLnBob25lbnVtYmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kYXRhVHlwZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGM4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGF0YVR5cGVzLnltbApAQCAtMCwwICsxLDEyOSBAQAordG9zY2EuZGF0YXR5cGVzLlJvb3Q6CisgIGRlc2NyaXB0aW9uOiBUaGUgVE9TQ0Egcm9vdCBEYXRhIFR5cGUgYWxsIG90aGVyIFRPU0NBIGJhc2UgRGF0YSBUeXBlcyBkZXJpdmUgZnJvbQorCitpbnRlZ2VyOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK3N0cmluZzoKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorCitib29sZWFuOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK2Zsb2F0OgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK2xpc3Q6CisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKworbWFwOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisKK3Rvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsOiAKKyAgZGVyaXZlZF9mcm9tOiB0b3NjYS5kYXRhdHlwZXMuUm9vdAorICBwcm9wZXJ0aWVzOiAKKyAgICBwcm90b2NvbDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHRva2VuX3R5cGU6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICBkZWZhdWx0OiBwYXNzd29yZAorICAgIHRva2VuOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgIGtleXM6CisgICAgICB0eXBlOiBtYXAKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICB1c2VyOgorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKwordG9zY2EuZGF0YXR5cGVzLlRpbWVJbnRlcnZhbDogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczoKKyAgICBzdGFydF90aW1lOiAKKyAgICAgIHR5cGU6IHRpbWVzdGFtcAorICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICBlbmRfdGltZTogCisgICAgICB0eXBlOiB0aW1lc3RhbXAKKyAgICAgIHJlcXVpcmVkOiB0cnVlCisKK3Rvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvOgorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIHByb3BlcnRpZXM6ICAKKyAgICBuZXR3b3JrX25hbWU6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgbmV0d29ya19pZDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICBhZGRyZXNzZXM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IHN0cmluZworCit0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbzogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogIAorICAgIHBvcnRfbmFtZTogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICBwb3J0X2lkOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgIG5ldHdvcmtfaWQ6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgbWFjX2FkZHJlc3M6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgYWRkcmVzc2VzOgorICAgICAgdHlwZTogbGlzdAorICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICB0eXBlOiBzdHJpbmcKKwordG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydERlZjoKKyAgZGVyaXZlZF9mcm9tOiBpbnRlZ2VyCisgIGNvbnN0cmFpbnRzOiAKKyAgICAtIGluX3JhbmdlOiBbIDEsIDY1NTM1IF0KKwordG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydFNwZWM6IAorICBkZXJpdmVkX2Zyb206IHRvc2NhLmRhdGF0eXBlcy5Sb290CisgIHByb3BlcnRpZXM6ICAKKyAgICBwcm90b2NvbDogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICBkZWZhdWx0OiB0Y3AKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIHZhbGlkX3ZhbHVlczogWyB1ZHAsIHRjcCwgaWdtcCBdCisgICAgdGFyZ2V0OiAgCisgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0RGVmCisgICAgdGFyZ2V0X3JhbmdlOgorICAgICAgdHlwZTogcmFuZ2UgCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBpbl9yYW5nZTogWyAxLCA2NTUzNSBdCisgICAgc291cmNlOgorICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydERlZgorICAgIHNvdXJjZV9yYW5nZToKKyAgICAgIHR5cGU6IHJhbmdlCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBpbl9yYW5nZTogWyAxLCA2NTUzNSBdCisKK3Rvc2NhLmRhdGF0eXBlcy5jb21wbGV4RW50cnlUeXBlTWFwTGlzdDogCisgIGRlcml2ZWRfZnJvbTogdG9zY2EuZGF0YXR5cGVzLlJvb3QKKyAgcHJvcGVydGllczogCisgICAgcHJvdG9jb2w6IAorICAgICAgdHlwZTogc3RyaW5nCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICB0b2tlbl90eXBlOiAKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgZGVmYXVsdDogcGFzc3dvcmQKKyAgICB0b2tlbjogCisgICAgICB0eXBlOiBzdHJpbmcKKyAgICBrZXlzOgorICAgICAgdHlwZTogbWFwCisgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLkNyZWRlbnRpYWwKKyAgICBhZGRyZXNzZXM6CisgICAgICB0eXBlOiBsaXN0CisgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5DcmVkZW50aWFsICAgIAorICAgIHVzZXI6CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJlcXVpcmVkOiBmYWxzZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2Rlcml2ZWQzbGV2ZWxEYXRhVHlwZS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGVyaXZlZDNsZXZlbERhdGFUeXBlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTg1MTY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2Rlcml2ZWQzbGV2ZWxEYXRhVHlwZS55bWwKQEAgLTAsMCArMSwzNyBAQAorbXl0eXBlcy5waG9uZW51bWJlcjoKKyAgZGVzY3JpcHRpb246IG15IHBob25lIG51bWJlciBkYXRhdHlwZQorICBwcm9wZXJ0aWVzOgorICAgIGNvdW50cnljb2RlOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgIGFyZWFjb2RlOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgIG51bWJlcjoKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIAorIyBkZWZpbmUgYSBuZXcgZGF0YXR5cGUgdGhhdCBkZXJpdmVzIGZyb20gZXhpc3RpbmcgdHlwZSBhbmQgZXh0ZW5kcyBpdAorbXl0eXBlcy5waG9uZW51bWJlci5leHRlbmRlZDoKKyAgZGVyaXZlZF9mcm9tOiBteXR5cGVzLnBob25lbnVtYmVyCisgIGRlc2NyaXB0aW9uOiBjdXN0b20gcGhvbmUgbnVtYmVyIHR5cGUgdGhhdCBleHRlbmRzIHRoZSBiYXNpYyBwaG9uZW51bWJlciB0eXBlCisgIHByb3BlcnRpZXM6CisgICAgcGhvbmVfZGVzY3JpcHRpb246CisgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAtIG1heF9sZW5ndGg6IDEyOAorICAgICAgCisgICAgICAKKyAgICAgIAorICAgICAgCitteXR5cGVzLnBob25lbnVtYmVyLmV4dGVuZGVkLmV4dGVuZGVkOgorICBkZXJpdmVkX2Zyb206IG15dHlwZXMucGhvbmVudW1iZXIuZXh0ZW5kZWQKKyAgZGVzY3JpcHRpb246IGN1c3RvbSBwaG9uZSBudW1iZXIgdHlwZSB0aGF0IGV4dGVuZHMgdGhlIGJhc2ljIHBob25lbnVtYmVyIHR5cGUKKyAgcHJvcGVydGllczoKKyAgICBlbWFpbDoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gbWF4X2xlbmd0aDogMTI4CisgICAgY29tcGxleDE6CisgICAgICB0eXBlOiBteXR5cGVzLnBob25lbnVtYmVyLmV4dGVuZGVkCisgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgLSBtYXhfbGVuZ3RoOiAxMjgKKyAgICAgICAgICAgIAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGVyaXZlZERhdGFUeXBlLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kZXJpdmVkRGF0YVR5cGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNGNhODgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGVyaXZlZERhdGFUeXBlLnltbApAQCAtMCwwICsxLDE5IEBACitteXR5cGVzLnBob25lbnVtYmVyOgorICBkZXNjcmlwdGlvbjogbXkgcGhvbmUgbnVtYmVyIGRhdGF0eXBlCisgIHByb3BlcnRpZXM6CisgICAgY291bnRyeWNvZGU6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgYXJlYWNvZGU6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgbnVtYmVyOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgCisjIGRlZmluZSBhIG5ldyBkYXRhdHlwZSB0aGF0IGRlcml2ZXMgZnJvbSBleGlzdGluZyB0eXBlIGFuZCBleHRlbmRzIGl0CitteXR5cGVzLnBob25lbnVtYmVyLmV4dGVuZGVkOgorICBkZXJpdmVkX2Zyb206IG15dHlwZXMucGhvbmVudW1iZXIKKyAgZGVzY3JpcHRpb246IGN1c3RvbSBwaG9uZSBudW1iZXIgdHlwZSB0aGF0IGV4dGVuZHMgdGhlIGJhc2ljIHBob25lbnVtYmVyIHR5cGUKKyAgcHJvcGVydGllczoKKyAgICBwaG9uZV9kZXNjcmlwdGlvbjoKKyAgICAgIHR5cGU6IHN0cmluZworICAgICAgY29uc3RyYWludHM6CisgICAgICAgIC0gbWF4X2xlbmd0aDogMTI4CmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGVyaXZlZERhdGFUeXBlTm9Qcm9wZXJ0aWVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9kZXJpdmVkRGF0YVR5cGVOb1Byb3BlcnRpZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmIzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGVyaXZlZERhdGFUeXBlTm9Qcm9wZXJ0aWVzLnltbApAQCAtMCwwICsxLDE1IEBACitteXR5cGVzLnBob25lbnVtYmVyOgorICBkZXNjcmlwdGlvbjogbXkgcGhvbmUgbnVtYmVyIGRhdGF0eXBlCisgIHByb3BlcnRpZXM6CisgICAgY291bnRyeWNvZGU6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgYXJlYWNvZGU6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgbnVtYmVyOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgCisjIGRlZmluZSBhIG5ldyBkYXRhdHlwZSB0aGF0IGRlcml2ZXMgZnJvbSBleGlzdGluZyB0eXBlIGFuZCBleHRlbmRzIGl0CitteXR5cGVzLnBob25lbnVtYmVyLmV4dGVuZGVkOgorICBkZXJpdmVkX2Zyb206IG15dHlwZXMucGhvbmVudW1iZXIKKyAgZGVzY3JpcHRpb246IGN1c3RvbSBwaG9uZSBudW1iZXIgdHlwZSB0aGF0IGV4dGVuZHMgdGhlIGJhc2ljIHBob25lbnVtYmVyIHR5cGUKKyAgICAgIApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2Rlcml2ZWRJbnZhbGlkRGF0YVR5cGUueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2Rlcml2ZWRJbnZhbGlkRGF0YVR5cGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NmNjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZGVyaXZlZEludmFsaWREYXRhVHlwZS55bWwKQEAgLTAsMCArMSwxNSBAQAorbXl0eXBlcy5waG9uZW51bWJlcjI6CisgIGRlc2NyaXB0aW9uOiBteSBwaG9uZSBudW1iZXIgZGF0YXR5cGUKKyAgcHJvcGVydGllczoKKyAgICBjb3VudHJ5Y29kZToKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICBhcmVhY29kZToKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICBudW1iZXI6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAKKyMgZGVmaW5lIGEgbmV3IGRhdGF0eXBlIHRoYXQgZGVyaXZlcyBmcm9tIGV4aXN0aW5nIHR5cGUgYW5kIGV4dGVuZHMgaXQKK215dHlwZXMucGhvbmVudW1iZXIuZXh0ZW5kZWQ6CisgIGRlcml2ZWRfZnJvbTogbXl0eXBlcy5waG9uZW51bWJlcjMKKyAgZGVzY3JpcHRpb246IGN1c3RvbSBwaG9uZSBudW1iZXIgdHlwZSB0aGF0IGV4dGVuZHMgdGhlIGJhc2ljIHBob25lbnVtYmVyIHR5cGUKKyAgICAgIApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2VtcHR5RGF0YVR5cGUueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2VtcHR5RGF0YVR5cGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDMxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZW1wdHlEYXRhVHlwZS55bWwKQEAgLTAsMCArMSw0IEBACitteXR5cGVzLnBob25lbnVtYmVyLmVtcHR5OgorICBkZXNjcmlwdGlvbjogbXkgcGhvbmUgbnVtYmVyIGRhdGF0eXBlCisgIHByb3BlcnRpZXM6CisgICAgCmRpZmYgLS1naXQgYS9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZW1wdHlEYXRhVHlwZU5vUHJvcGVydGllc1RhZy55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvZW1wdHlEYXRhVHlwZU5vUHJvcGVydGllc1RhZy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzYzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9lbXB0eURhdGFUeXBlTm9Qcm9wZXJ0aWVzVGFnLnltbApAQCAtMCwwICsxLDMgQEAKK215dHlwZXMucGhvbmVudW1iZXIuZW1wdHk6CisgIGRlc2NyaXB0aW9uOiBteSBwaG9uZSBudW1iZXIgZGF0YXR5cGUKKyAgICAKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9leGl0aW5nUHJvcGVydHlBdEFuY2VzdG9yLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9leGl0aW5nUHJvcGVydHlBdEFuY2VzdG9yLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQ2Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2V4aXRpbmdQcm9wZXJ0eUF0QW5jZXN0b3IueW1sCkBAIC0wLDAgKzEsMTkgQEAKK215dHlwZXMucGhvbmVudW1iZXI6CisgIGRlc2NyaXB0aW9uOiBteSBwaG9uZSBudW1iZXIgZGF0YXR5cGUKKyAgcHJvcGVydGllczoKKyAgICBjb3VudHJ5Y29kZToKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICBhcmVhY29kZToKKyAgICAgIHR5cGU6IGludGVnZXIKKyAgICBudW1iZXI6CisgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAKKyMgZGVmaW5lIGEgbmV3IGRhdGF0eXBlIHRoYXQgZGVyaXZlcyBmcm9tIGV4aXN0aW5nIHR5cGUgYW5kIGV4dGVuZHMgaXQKK215dHlwZXMucGhvbmVudW1iZXIuZXh0ZW5kZWQ6CisgIGRlcml2ZWRfZnJvbTogbXl0eXBlcy5waG9uZW51bWJlcgorICBkZXNjcmlwdGlvbjogY3VzdG9tIHBob25lIG51bWJlciB0eXBlIHRoYXQgZXh0ZW5kcyB0aGUgYmFzaWMgcGhvbmVudW1iZXIgdHlwZQorICBwcm9wZXJ0aWVzOgorICAgIGFyZWFjb2RlOgorICAgICAgdHlwZTogaW50ZWdlcgorCisgICAgICAKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9pbnZhbGlkRGF0YVR5cGUueW1sIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvZGF0YXR5cGVzL2ludmFsaWREYXRhVHlwZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhZDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9pbnZhbGlkRGF0YVR5cGUueW1sCkBAIC0wLDAgKzEgQEAKK215dHlwZXMucGhvbmVudW1iZXIuZW1wdHkKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2RhdGF0eXBlcy9vbmVEYXRhVHlwZS55bWwgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvb25lRGF0YVR5cGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDIzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9kYXRhdHlwZXMvb25lRGF0YVR5cGUueW1sCkBAIC0wLDAgKzEsOSBAQAorbXl0eXBlcy5waG9uZW51bWJlcjoKKyAgZGVzY3JpcHRpb246IG15IHBob25lIG51bWJlciBkYXRhdHlwZQorICBwcm9wZXJ0aWVzOgorICAgIGNvdW50cnljb2RlOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgIGFyZWFjb2RlOgorICAgICAgdHlwZTogaW50ZWdlcgorICAgIG51bWJlcjoKKyAgICAgIHR5cGU6IGludGVnZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnltbCBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3R5cGVzL2ludGVyZmFjZUxpZmVjeWNsZVR5cGVzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY3MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMueW1sCkBAIC0wLDAgKzEsMTEgQEAKK3Rvc2NhLmludGVyZmFjZXMubm9kZS5saWZlY3ljbGUuU3RhbmRhcmQ6CisgIGNyZWF0ZToKKyAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIGNyZWF0ZSBvcGVyYXRpb24uCisgIGNvbmZpZ3VyZToKKyAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIGNvbmZpZ3VyZSBvcGVyYXRpb24uCisgIHN0YXJ0OgorICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgc3RhcnQgb3BlcmF0aW9uLgorICBzdG9wOgorICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgc3RvcCBvcGVyYXRpb24uCisgIGRlbGV0ZToKKyAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIGRlbGV0ZSBvcGVyYXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMuemlwIGIvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdHlwZXMvaW50ZXJmYWNlTGlmZWN5Y2xlVHlwZXMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliY2Y5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWJlL3NyYy90ZXN0L3Jlc291cmNlcy90eXBlcy9pbnRlcmZhY2VMaWZlY3ljbGVUeXBlcy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRfdmYuY3NhciBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkX3ZmLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiZjE1OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkX3ZmLmNzYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1iZS90YXJiYWxsLnhtbCBiL2NhdGFsb2ctYmUvdGFyYmFsbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkZDI3NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctYmUvdGFyYmFsbC54bWwKQEAgLTAsMCArMSw1NCBAQAorPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgorICA8aWQ+YmluPC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD50YXI8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8ZmlsZXM+CisgICAgPGZpbGU+CisgICAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS53YXI8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8ZGVzdE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS53YXI8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZT4KKyAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9yZXNvdXJjZXMvZWxhc3RpY3NlYXJjaC55bWw8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8ZGVzdE5hbWU+ZWxhc3RpY3NlYXJjaC55bWw8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICA8IS0tZmlsZT4KKyAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9yZXNvdXJjZXMvZWxhc3RpY3NlYXJjaC5wcm9wZXJ0aWVzPC9zb3VyY2U+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Li88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPmVsYXN0aWNzZWFyY2gucHJvcGVydGllczwvZGVzdE5hbWU+CisgICAgPC9maWxlLS0+CisgICAgPGZpbGU+CisgICAgICAgIDxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2pldHR5LXNzbC54bWw8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8ZGVzdE5hbWU+amV0dHktc3NsLnhtbDwvZGVzdE5hbWU+CisgICAgPC9maWxlPgorICAgICA8IS0tPGZpbGU+LS0+CisgICAgICAgIDwhLS08c291cmNlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2Vjb21wRXJyb3JDb2Rlcy5jc3Y8L3NvdXJjZT4tLT4KKyAgICAgICAgPCEtLTxvdXRwdXREaXJlY3Rvcnk+Y29uZmlnPC9vdXRwdXREaXJlY3Rvcnk+LS0+CisgICAgICAgIDwhLS08ZGVzdE5hbWU+ZWNvbXBFcnJvckNvZGVzLmNzdjwvZGVzdE5hbWU+LS0+CisgICAgPCEtLTwvZmlsZT4tLT4KKyAgPC9maWxlcz4KKyAgCisgIDxmaWxlU2V0cz4gIAorICAJPGZpbGVTZXQ+CisJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZzwvZGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNvbmZpZzwvb3V0cHV0RGlyZWN0b3J5PgorCTwvZmlsZVNldD4KKwk8ZmlsZVNldD4KKwkJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0czwvZGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNjcmlwdHM8L291dHB1dERpcmVjdG9yeT4KKwk8L2ZpbGVTZXQ+CisJPGZpbGVTZXQ+CisJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL2tleXN0b3JlPC9kaXJlY3Rvcnk+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+a2V5c3RvcmU8L291dHB1dERpcmVjdG9yeT4KKwk8L2ZpbGVTZXQ+CisJPGZpbGVTZXQ+CisJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydDwvZGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmltcG9ydDwvb3V0cHV0RGlyZWN0b3J5PgorCTwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby8uZ2l0aWdub3JlIGIvY2F0YWxvZy1kYW8vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYThjNGJmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisvdGFyZ2V0CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9wb20ueG1sIGIvY2F0YWxvZy1kYW8vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTc2N2VmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vcG9tLnhtbApAQCAtMCwwICsxLDMzNSBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwk8YXJ0aWZhY3RJZD5jYXRhbG9nLWRhbzwvYXJ0aWZhY3RJZD4KKworCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNkYy1tYWluPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCisJPHByb3BlcnRpZXM+CisJCTxhc3BlY3RqLnZlcnNpb24+MS43LjQ8L2FzcGVjdGoudmVyc2lvbj4KKwkJPGhpYmVybmF0ZS12YWxpZGF0b3IudmVyc2lvbj41LjMuNC5GaW5hbDwvaGliZXJuYXRlLXZhbGlkYXRvci52ZXJzaW9uPgorCQk8Z3Jvb3Z5LnZlcnNpb24+Mi4zLjU8L2dyb292eS52ZXJzaW9uPgorCQk8bHVjZW5lLnZlcnNpb24+NC4xMC4yPC9sdWNlbmUudmVyc2lvbj4KKwkJPG1vY2tpdG8udmVyc2lvbj4xLjkuMDwvbW9ja2l0by52ZXJzaW9uPgorCQk8cmVnZXgudmVyc2lvbj4zLjAuMzwvcmVnZXgudmVyc2lvbj4KKwk8L3Byb3BlcnRpZXM+CisKKworCTxkZXBlbmRlbmNpZXM+CisJCTwhLS0gQ29tbW9uIG9mIFNEJkMgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb24tYXBwLWFwaTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y29tbW9uLWFwcC1hcGkudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGMuYmU8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb24tYmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2NvbW1vbi1iZS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y2gucW9zLmxvZ2JhY2s8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5sb2diYWNrLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWxhc3RpY3NlYXJjaDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmVsYXN0aWNzZWFyY2g8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWxhc3RpY3NlYXJjaC5wbHVnaW48L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zaGllbGQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2VsYXN0aWMtc2VhcmNoLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisKKwkJPCEtLSBFbGFzdGljc2VhcmNoIGRlbGV0ZSBieSBxdWVyeSB3YXMgZXh0cmFjdGVkIHRvIHBsdWdpbjogYWRkaW5nIHRoaXMgCisJCQlwbHVnaW4gcmVxdWlyZXMgdXBkYXRpbmcgZWxhc3RpY3NlYXJjaC55bWwgd2l0aDogcGx1Z2luLnR5cGVzOiAiRGVsZXRlQnlRdWVyeVBsdWdpbiIgCisJCQlhbmQgaW5zdGFsbGluZyB0aGUgcGx1Z2luIGluIHRoZSBzZXJ2ZXIgLS0+CisJCTwhLS0gPGRlcGVuZGVuY3k+IC0tPgorCQk8IS0tIDxncm91cElkPm9yZy5lbGFzdGljc2VhcmNoLnBsdWdpbjwvZ3JvdXBJZD4gLS0+CisJCTwhLS0gPGFydGlmYWN0SWQ+ZGVsZXRlLWJ5LXF1ZXJ5PC9hcnRpZmFjdElkPiAtLT4KKwkJPCEtLSA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPiAtLT4KKwkJPCEtLSA8L2RlcGVuZGVuY3k+IC0tPgorCisKKwkJPCEtLSBTUFJJTkcgLS0+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXNwZWN0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmFzcGVjdGpydDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7YXNwZWN0ai52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFzcGVjdGo8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5hc3BlY3Rqd2VhdmVyPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHthc3BlY3RqLnZlcnNpb259PC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUuanNvbi1zaW1wbGU8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qc29uLXNpbXBsZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisKKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUubHVjZW5lPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bHVjZW5lLXJlZ2V4PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtyZWdleC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7bW9ja2l0by52ZXJzaW9ufTwvdmVyc2lvbj48IS0tJE5PLU1WTi1NQU4tVkVSJCAtLT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnlhbWw8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZ3NvbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZnVuY3Rpb25hbGphdmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5mdW5jdGlvbmFsamF2YTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIGh0dHAgY2xpZW50IC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmh0dHBjb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtndWF2YS52ZXJzaW9ufTwvdmVyc2lvbj48IS0tJE5PLU1WTi1NQU4tVkVSJCAtLT4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIFRFU1QgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNwcmluZy10ZXN0PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWpjaS1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWV4cHJlc3Npb248L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctYW9wPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBUSVRBTiAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udGhpbmthdXJlbGl1cy50aXRhbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRpdGFuLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3RpdGFuLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTxleGNsdXNpb25zPgorCQkJCTxleGNsdXNpb24+CisJCQkJCTxncm91cElkPm9yZy5qc29uPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5qc29uPC9hcnRpZmFjdElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJCTxleGNsdXNpb24+CisJCQkJCTxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisJCQkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCQk8L2V4Y2x1c2lvbj4KKwkJCTwvZXhjbHVzaW9ucz4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLnRoaW5rYXVyZWxpdXMudGl0YW48L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD50aXRhbi1jYXNzYW5kcmE8L2FydGlmYWN0SWQ+CisJCQk8IS0tPGFydGlmYWN0SWQ+YXNkYy10aXRhbi1jYXNzYW5kcmE8L2FydGlmYWN0SWQ+IC0tPgorCQkJPHZlcnNpb24+JHt0aXRhbi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTwhLS08dmVyc2lvbj4xLjAuMC1zbmFwc2hvdDwvdmVyc2lvbj4gLS0+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJPC9leGNsdXNpb25zPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmczPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gVElUQU4gRU5EIC0tPgorCisJCTwhLS0gQ0FTU0FORFJBIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtZHJpdmVyLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2Nhc3NhbmRyYS5kcml2ZXIudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmRhdGFzdGF4LmNhc3NhbmRyYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhc3NhbmRyYS1kcml2ZXItbWFwcGluZzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y2Fzc2FuZHJhLmRyaXZlci52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBDQVNTQU5EUkEgRU5EIC0tPgorCisKKwk8L2RlcGVuZGVuY2llcz4KKworCisKKwk8YnVpbGQ+CisKKwkJPHBsdWdpbk1hbmFnZW1lbnQ+CisJCQk8cGx1Z2lucz4KKwkJCQk8IS0tVGhpcyBwbHVnaW4ncyBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgRWNsaXBzZSBtMmUgc2V0dGluZ3MgCisJCQkJCW9ubHkuIEl0IGhhcyBubyBpbmZsdWVuY2Ugb24gdGhlIE1hdmVuIGJ1aWxkIGl0c2VsZi4gLS0+CisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UubTJlPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5saWZlY3ljbGUtbWFwcGluZzwvYXJ0aWZhY3RJZD4KKwkJCQkJPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJPGxpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKwkJCQkJCQk8cGx1Z2luRXhlY3V0aW9ucz4KKwkJCQkJCQkJPHBsdWdpbkV4ZWN1dGlvbj4KKwkJCQkJCQkJCTxwbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisJCQkJCQkJCQkJPGdyb3VwSWQ+ZnIuZmFzdGNvbm5lY3Q8L2dyb3VwSWQ+CisJCQkJCQkJCQkJPGFydGlmYWN0SWQ+cGxhbnR1bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQkJCQkJCTx2ZXJzaW9uUmFuZ2U+WzEuMC4wLCk8L3ZlcnNpb25SYW5nZT4KKwkJCQkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQkJCTxnb2FsPnBsYW50PC9nb2FsPgorCQkJCQkJCQkJCTwvZ29hbHM+CisJCQkJCQkJCQk8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKwkJCQkJCQkJCTxhY3Rpb24+CisJCQkJCQkJCQkJPGlnbm9yZSAvPgorCQkJCQkJCQkJPC9hY3Rpb24+CisJCQkJCQkJCTwvcGx1Z2luRXhlY3V0aW9uPgorCQkJCQkJCTwvcGx1Z2luRXhlY3V0aW9ucz4KKwkJCQkJCTwvbGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgorCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPC9wbHVnaW4+CisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1kZXBsb3ktcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQk8dmVyc2lvbj4yLjc8L3ZlcnNpb24+CisJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJPHNraXA+dHJ1ZTwvc2tpcD4KKwkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCTwvcGx1Z2luPgorCQkJPC9wbHVnaW5zPgorCQk8L3BsdWdpbk1hbmFnZW1lbnQ+CisJPC9idWlsZD4KKworCisJCisJPHByb2ZpbGVzPgorCQk8cHJvZmlsZT4KKwkJCTxpZD5Gb3J0aWZ5PC9pZD4KKwkJCTxhY3RpdmF0aW9uPgorCQkJCTxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKwkJCTwvYWN0aXZhdGlvbj4KKworCQkJPGJ1aWxkPgorCQkJCTxwbHVnaW5zPgorCQkJCQk8cGx1Z2luPgorCQkJCQkJPGdyb3VwSWQ+Y29tLmZvcnRpZnkucHMubWF2ZW4ucGx1Z2luPC9ncm91cElkPgorCQkJCQkJPGFydGlmYWN0SWQ+c2NhLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJCTx2ZXJzaW9uPjQuMzA8L3ZlcnNpb24+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8c291cmNlPjEuODwvc291cmNlPgorCQkJCQkJCTxidWlsZElkPiR7cHJvamVjdC5wYXJlbnQuYXJ0aWZhY3RJZH08L2J1aWxkSWQ+CisJCQkJCQkJPHRvcGxldmVsQXJ0aWZhY3RJZD4ke3Byb2plY3QucGFyZW50LmFydGlmYWN0SWR9PC90b3BsZXZlbEFydGlmYWN0SWQ+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCTwvcGx1Z2luPgorCQkJCTwvcGx1Z2lucz4KKwkJCTwvYnVpbGQ+CisJCTwvcHJvZmlsZT4KKwk8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vQWNjb3VudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vQWNjb3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjcxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9BY2NvdW50LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhbzsKKworLy9pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKKy8vaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Gcm96ZW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworCitAVGFibGUoa2V5c3BhY2UgPSAiZHN0ZXN0IiwgbmFtZSA9ICJhY2NvdW50cyIpCitwdWJsaWMgY2xhc3MgQWNjb3VudCB7CisKKwlAUGFydGl0aW9uS2V5CisJcHJpdmF0ZSBTdHJpbmcgZW1haWw7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkvLyBAQ29sdW1uIChuYW1lID0gImFkZHIiKQorCS8vIEBGcm96ZW4KKwkvLyBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsKKworCXB1YmxpYyBBY2NvdW50KCkgeworCX0KKworCS8vIHB1YmxpYyBBY2NvdW50KFN0cmluZyBuYW1lLCBTdHJpbmcgZW1haWwsIEFkZHJlc3MgYWRkcmVzcykgeworCXB1YmxpYyBBY2NvdW50KFN0cmluZyBuYW1lLCBTdHJpbmcgZW1haWwpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5lbWFpbCA9IGVtYWlsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7CisJCXJldHVybiBlbWFpbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpIHsKKwkJdGhpcy5lbWFpbCA9IGVtYWlsOworCX0KKwkvLworCS8vIHB1YmxpYyBBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisJLy8gcmV0dXJuIGFkZHJlc3M7CisJLy8gfQorCS8vCisJLy8gcHVibGljIHZvaWQgc2V0QWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKKwkvLyB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworCS8vIH0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKG90aGVyIGluc3RhbmNlb2YgQWNjb3VudCkgeworCQkJQWNjb3VudCB0aGF0ID0gKEFjY291bnQpIG90aGVyOworCQkJcmV0dXJuIE9iamVjdHMuZXF1YWwodGhpcy5uYW1lLCB0aGF0Lm5hbWUpICYmIE9iamVjdHMuZXF1YWwodGhpcy5lbWFpbCwgdGhhdC5lbWFpbCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIGVtYWlsKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9BY3Rpb25TdGF0dXMuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9BY3Rpb25TdGF0dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI1MjhjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0FjdGlvblN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitwdWJsaWMgZW51bSBBY3Rpb25TdGF0dXMgeworCU9LLCBDUkVBVEVELCBOT19DT05URU5ULCBHRU5FUkFMX0VSUk9SLCBOT1RfQUxMT1dFRCwgTUlTU0lOR19JTkZPUk1BVElPTiwgUkVTVFJJQ1RFRF9PUEVSQVRJT04sIFJFU1RSSUNURURfQUNDRVNTLCBJTlZBTElEX0NPTlRFTlQsCisJLy8gVXNlciByZWxhdGVkCisJVVNFUl9BTFJFQURZX0VYSVNULCBVU0VSX0lOQUNUSVZFLCBVU0VSX05PVF9GT1VORCwgVVNFUl9IQVNfQUNUSVZFX0VMRU1FTlRTLCBJTlZBTElEX0VNQUlMX0FERFJFU1MsIElOVkFMSURfUk9MRSwgREVMRVRFX1VTRVJfQURNSU5fQ09ORkxJQ1QsIFVQREFURV9VU0VSX0FETUlOX0NPTkZMSUNULCBDQU5OT1RfREVMRVRFX1VTRVJfV0lUSF9BQ1RJVkVfRUxFTUVOVFMsIENBTk5PVF9VUERBVEVfVVNFUl9XSVRIX0FDVElWRV9FTEVNRU5UUywgSU5WQUxJRF9VU0VSX0lELAorCS8vIENhcGFiaWxpdHlUeXBlIHJlbGF0ZWQKKwlDQVBBQklMSVRZX1RZUEVfQUxSRUFEWV9FWElTVCwgTUlTU0lOR19DQVBBQklMSVRZX1RZUEUsIFJFUV9DQVBfTk9UX1NBVElTRklFRF9CRUZPUkVfQ0VSVElGSUNBVElPTiwgSU1QT1JUX0RVUExJQ0FURV9SRVFfQ0FQX05BTUUsIElNUE9SVF9SRVFfQ0FQX05BTUVfRVhJU1RTX0lOX0RFUklWRUQsCisJLy8gUmVzb3VyY2UgcmVsYXRlZAorCVJFU09VUkNFX05PVF9GT1VORCwgTUlTU0lOR19ERVJJVkVEX0ZST01fVEVNUExBVEUsIFBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQsIElOVkFMSURfREVGQVVMVF9WQUxVRSwgSU5WQUxJRF9DT01QTEVYX0RFRkFVTFRfVkFMVUUsIE1VTFRJUExFX1BBUkVOVF9SRVNPVVJDRV9GT1VORCwgSU5WQUxJRF9SRVNPVVJDRV9QQVlMT0FELCBJTlZBTElEX1RPU0NBX0ZJTEVfRVhURU5TSU9OLCBJTlZBTElEX1lBTUxfRklMRSwgSU5WQUxJRF9UT1NDQV9URU1QTEFURSwgTk9UX1JFU09VUkNFX1RPU0NBX1RFTVBMQVRFLCBOT1RfU0lOR0xFX1JFU09VUkNFLCBJTlZBTElEX1JFU09VUkNFX05BTUVTUEFDRSwgUkVTT1VSQ0VfQUxSRUFEWV9FWElTVFMsIElOVkFMSURfUkVTT1VSQ0VfQ0hFQ0tTVU0sIFJFU09VUkNFX0NBTk5PVF9DT05UQUlOX1JFU09VUkNFX0lOU1RBTkNFUywgTk9fQVNTRVRTX0ZPVU5ELAorCS8vIENvbXBvbmVudCBuYW1lIHJlbGF0ZWQKKwlDT01QT05FTlRfTkFNRV9BTFJFQURZX0VYSVNULCBDT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlULCBNSVNTSU5HX0NPTVBPTkVOVF9OQU1FLCBJTlZBTElEX0NPTVBPTkVOVF9OQU1FLAorCS8vIENvbXBvbmVudCBkZXNjcmlwdGlvbiByZWxhdGVkCisJQ09NUE9ORU5UX0lOVkFMSURfREVTQ1JJUFRJT04sIENPTVBPTkVOVF9NSVNTSU5HX0RFU0NSSVBUSU9OLCBDT01QT05FTlRfREVTQ1JJUFRJT05fRVhDRUVEU19MSU1JVCwKKwkvLyBDb21wb25lbnQgaWNvbiByZWxhdGVkCisJQ09NUE9ORU5UX01JU1NJTkdfSUNPTiwgQ09NUE9ORU5UX0lOVkFMSURfSUNPTiwgQ09NUE9ORU5UX0lDT05fRVhDRUVEU19MSU1JVCwKKwkvLyBUYWcgcmVsYXRlZAorCUNPTVBPTkVOVF9NSVNTSU5HX1RBR1MsIENPTVBPTkVOVF9UQUdTX0VYQ0VFRF9MSU1JVCwgQ09NUE9ORU5UX1NJTkdMRV9UQUdfRVhDRUVEX0xJTUlULCBJTlZBTElEX0ZJRUxEX0ZPUk1BVCwgQ09NUE9ORU5UX0lOVkFMSURfVEFHU19OT19DT01QX05BTUUsCisJLy8gdXNlciBjb250YWN0IHJlbGF0ZWQKKwlDT01QT05FTlRfTUlTU0lOR19DT05UQUNULCBDT01QT05FTlRfSU5WQUxJRF9DT05UQUNULAorCS8vIFZlbmRvciByZWxhdGVkCisJVkVORE9SX05BTUVfRVhDRUVEU19MSU1JVCwgVkVORE9SX1JFTEVBU0VfRVhDRUVEU19MSU1JVCwgSU5WQUxJRF9WRU5ET1JfTkFNRSwgSU5WQUxJRF9WRU5ET1JfUkVMRUFTRSwgTUlTU0lOR19WRU5ET1JfTkFNRSwgTUlTU0lOR19WRU5ET1JfUkVMRUFTRSwKKwkvLyBDYXRlZ29yeSByZWxhdGVkCisJQ09NUE9ORU5UX01JU1NJTkdfQ0FURUdPUlksIENPTVBPTkVOVF9JTlZBTElEX0NBVEVHT1JZLCBDT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfRk9STUFULCBDT01QT05FTlRfRUxFTUVOVF9JTlZBTElEX05BTUVfTEVOR1RILCBDT01QT05FTlRfQ0FURUdPUllfQUxSRUFEWV9FWElTVFMsIENPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQsIENPTVBPTkVOVF9TVUJfQ0FURUdPUllfTk9UX0ZPVU5EX0ZPUl9DQVRFR09SWSwgQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9FWElTVFNfRk9SX0NBVEVHT1JZLCBDT01QT05FTlRfR1JPVVBJTkdfRVhJU1RTX0ZPUl9TVUJfQ0FURUdPUlksCisJLy8gU2VydmljZSBBUEkgVVJMCisJSU5WQUxJRF9TRVJWSUNFX0FQSV9VUkwsCisJLy8gUHJvcGVydHkgcmVsYXRlZAorCVBST1BFUlRZX0FMUkVBRFlfRVhJU1QsIFBST1BFUlRZX05BTUVfQUxSRUFEWV9FWElTVFMsIFBST1BFUlRZX05PVF9GT1VORCwgSU5WQUxJRF9QUk9QRVJUWSwgSU5WQUxJRF9QUk9QRVJUWV9UWVBFLCBJTlZBTElEX1BST1BFUlRZX0lOTkVSX1RZUEUsCisJLy8gQXR0cmlidXRlIHJlbGF0ZWQKKwlBVFRSSUJVVEVfQUxSRUFEWV9FWElTVCwgQVRUUklCVVRFX05PVF9GT1VORCwKKwkvLyBTdGF0ZSByZWxhdGVkCisJQ09NUE9ORU5UX0lOX0NIRUNLT1VUX1NUQVRFLCBJTExFR0FMX0NPTVBPTkVOVF9TVEFURSwgQ09NUE9ORU5UX0lOX0NFUlRfSU5fUFJPR1JFU1NfU1RBVEUsIENPTVBPTkVOVF9TRU5UX0ZPUl9DRVJUSUZJQ0FUSU9OLCBDT01QT05FTlRfVkVSU0lPTl9BTFJFQURZX0VYSVNULCBDT01QT05FTlRfQUxSRUFEWV9DSEVDS0VEX0lOLCBDT01QT05FTlRfQ0hFQ0tPVVRfQllfQU5PVEhFUl9VU0VSLCBDT01QT05FTlRfSU5fVVNFLCBDT01QT05FTlRfSEFTX05FV0VSX1ZFUlNJT04sIENPTVBPTkVOVF9BTFJFQURZX0NFUlRJRklFRCwgQ09NUE9ORU5UX05PVF9SRUFEWV9GT1JfQ0VSVElGSUNBVElPTiwgQ09NUE9ORU5UX0FSVElGQUNUX05PVF9GT1VORCwgQ09NUE9ORU5UX0lOU1RBTkNFX05PVF9GT1VORCwgQ09NUE9ORU5UX0lOU1RBTkNFX05PVF9GT1VORF9PTl9DT05UQUlORVIsIFNFUlZJQ0VfTk9UX0ZPVU5ELCBTRVJWSUNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VELCBTRVJWSUNFX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQsIFNFUlZJQ0VfSUNPTl9DQU5OT1RfQkVfQ0hBTkdFRCwgQ09NUE9ORU5UX1RPT19NVUNIX0NBVEVHT1JJRVMsIFNFUlZJQ0VfQ0FOTk9UX0NPTlRBSU5fU1VCQ0FURUdPUlksIFJFU09VUkNFX0NBVEVHT1JZX0NBTk5PVF9CRV9DSEFOR0VELCBSRVNPVVJDRV9OQU1FX0NBTk5PVF9CRV9DSEFOR0VELCBSRVNPVVJDRV9JQ09OX0NBTk5PVF9CRV9DSEFOR0VELCBSRVNPVVJDRV9WRU5ET1JfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRCwgUkVTT1VSQ0VfREVSSVZFRF9GUk9NX0NBTk5PVF9CRV9DSEFOR0VELCBSRVNPVVJDRV9UT09fTVVDSF9TVUJDQVRFR09SSUVTLCBTRVJWSUNFX0lDT05fRVhDRUVEU19MSU1JVCwgUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5ELCBSRVNPVVJDRV9JTlNUQU5DRV9CQURfUkVRVUVTVCwgUkVTT1VSQ0VfSU5TVEFOQ0VfTUFUQ0hfTk9UX0ZPVU5ELCBSRVNPVVJDRV9JTlNUQU5DRV9BTFJFQURZX0VYSVNULCBSRVNPVVJDRV9JTlNUQU5DRV9SRUxBVElPTl9OT1RfRk9VTkQsIENPTVBPTkVOVF9NSVNTSU5HX1NVQkNBVEVHT1JZLCBBUlRJRkFDVF9UWVBFX05PVF9TVVBQT1JURUQsIE1JU1NJTkdfQVJUSUZBQ1RfVFlQRSwgQVJUSUZBQ1RfTE9HSUNBTF9OQU1FX0NBTk5PVF9CRV9DSEFOR0VELCBBUlRJRkFDVF9FWElTVCwgQVJUSUZBQ1RfTk9UX0ZPVU5ELCBBUlRJRkFDVF9JTlZBTElEX01ENSwgTUlTU0lOR19BUlRJRkFDVF9OQU1FLCBNSVNTSU5HX1BST0pFQ1RfQ09ERSwgSU5WQUxJRF9QUk9KRUNUX0NPREUsIENPTVBPTkVOVF9NSVNTSU5HX01BTkRBVE9SWV9BUlRJRkFDVFMsIExJRkVDWUNMRV9UWVBFX0FMUkVBRFlfRVhJU1QsIFNFUlZJQ0VfTk9UX0FWQUlMQUJMRV9GT1JfRElTVFJJQlVUSU9OLCBNSVNTSU5HX0xJRkVDWUNMRV9UWVBFLAorCS8vIERpc3RyaWJ1dGlvbgorCU1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRCwgTUlTU0lOR19QVUJMSUNfS0VZLCBNSVNTSU5HX0VOVl9OQU1FLCBESVNUUklCVVRJT05fRU5WX0RPRVNfTk9UX0VYSVNULCBNSVNTSU5HX0JPRFksIEVDT01QX1JFU0VORF9XSVRIX0JBU0lDX0FVVEhFTlRJQ0FUSU9OX0NSRURFTlRJQUxTLCBFQ09NUF9DT01QT05FTlRfTk9UX0FVVEhPUklaRUQsIE1FVEhPRF9OT1RfQUxMT1dFRF9UT19ET1dOTE9BRF9BUlRJRkFDVCwgUkVHSVNUUkFUSU9OX0ZBSUxFRCwgRElTVFJJQlVUSU9OX0VOVklST05NRU5UX05PVF9BVkFJTEFCTEUsIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQsIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9JTlZBTElELCBESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5ELCBESVNUUklCVVRJT05fUkVRVUVTVEVEX05PVF9GT1VORCwgRElTVFJJQlVUSU9OX1JFUVVFU1RFRF9GQUlMRUQsIERJU1RSSUJVVElPTl9OT1RfRk9VTkQsIEFERElUSU9OQUxfSU5GT1JNQVRJT05fQUxSRUFEWV9FWElTVFMsIENPTVBPTkVOVF9WRVJTSU9OX05PVF9GT1VORCwgQURESVRJT05BTF9JTkZPUk1BVElPTl9NQVhfTlVNQkVSX1JFQUNIRUQsIEFERElUSU9OQUxfSU5GT1JNQVRJT05fRU1QVFlfU1RSSU5HX05PVF9BTExPV0VELCBBRERJVElPTkFMX0lORk9STUFUSU9OX0VYQ0VFRFNfTElNSVQsIEFERElUSU9OQUxfSU5GT1JNQVRJT05fS0VZX05PVF9BTExPV0VEX0NIQVJBQ1RFUlMsIEFERElUSU9OQUxfSU5GT1JNQVRJT05fVkFMVUVfTk9UX0FMTE9XRURfQ0hBUkFDVEVSUywgQURESVRJT05BTF9JTkZPUk1BVElPTl9OT1RfRk9VTkQsIFNEQ19WRVJTSU9OX05PVF9GT1VORCwgTUlTU0lOR19EQVRBLCBFWENFRURTX0xJTUlULCBVTlNVUFBPUlRFRF9FUlJPUiwgQVJUSUZBQ1RfSU5WQUxJRF9USU1FT1VULCBTRVJWSUNFX0lTX1ZORl9DQU5OT1RfQkVfQ0hBTkdFRCwgUkVTT1VSQ0VfSU5TVEFOQ0VfTk9UX0ZPVU5EX09OX1NFUlZJQ0UsIFdST05HX0FSVElGQUNUX0ZJTEVfRVhURU5TSU9OLCBJTlZBTElEX1lBTUwsIElOVkFMSURfWE1MLCBJTlZBTElEX0pTT04sIElOVkFMSURfREVQTE9ZTUVOVF9BUlRJRkFDVF9IRUFULCBJTlZBTElEX0hFQVRfUEFSQU1FVEVSX1RZUEUsIElOVkFMSURfSEVBVF9QQVJBTUVURVJfVkFMVUUsIERFUExPWU1FTlRfQVJUSUZBQ1RfT0ZfVFlQRV9BTFJFQURZX0VYSVNUUywgREVQTE9ZTUVOVF9BUlRJRkFDVF9OQU1FX0FMUkVBRFlfRVhJU1RTLCBNSVNTSU5HX0hFQVQsIE1JU01BVENIX0hFQVRfVlNfSEVBVF9FTlYsIENPUlJVUFRFRF9GT1JNQVQsIE1JU01BVENIX0JFVFdFRU5fQVJUSUZBQ1RfVFlQRV9BTkRfQ09NUE9ORU5UX1RZUEUsIElOVkFMSURfUEFSQU1TX0lOX0hFQVRfRU5WX0ZJTEUsCisJLy8gYXV0aAorCUFVVEhfRkFJTEVEX0lOVkFMSURFX0hFQURFUiwgQVVUSF9GQUlMRUQsIEFVVEhfUkVRVUlSRUQsIENPTlNVTUVSX0FMUkVBRFlfRVhJU1RTLCBJTlZBTElEX0xFTkdUSCwgRUNPTVBfVVNFUl9OT1RfRk9VTkQsIElOVkFMSURfQ09OVEVOVF9QQVJBTSwgSU5WQUxJRF9GSUxURVJfS0VZLCBTRVJWSUNFX0RFUExPWU1FTlRfQVJUSUZBQ1RfTk9UX0ZPVU5ELCBWQUxJREFURURfUkVTT1VSQ0VfTk9UX0ZPVU5ELCBGT1VORF9BTFJFQURZX1ZBTElEQVRFRF9SRVNPVVJDRSwgRk9VTkRfTElTVF9WQUxJREFURURfUkVTT1VSQ0VTLAorCisJLy8gcHJvZHVjdAorCVBST0RVQ1RfTk9UX0ZPVU5ELCBJTlZBTElEX0dST1VQX0FTU09DSUFUSU9OLCBFTVBUWV9QUk9EVUNUX0NPTlRBQ1RTX0xJU1QsIElOVkFMSURfUFJPRFVDVF9DT05UQUNULCBNSVNTSU5HX09ORV9PRl9DT01QT05FTlRfTkFNRVMsIENPTVBPTkVOVF9QQVJBTUVURVJfQ0FOTk9UX0JFX0NIQU5HRUQsCisKKwkvLyBvY2N1cnJlbmNlcworCUVNUFRZX09DQ1VSUkVOQ0VTX0xJU1QsIElOVkFMSURfT0NDVVJSRU5DRVMsIE5PVF9UT1BPTE9HWV9UT1NDQV9URU1QTEFURSwgSU5WQUxJRF9OT0RFX1RFTVBMQVRFLAorCisJLy8gRGF0YSB0eXBlIHJlbGF0ZWQKKwlEQVRBX1RZUEVfQUxSRUFEWV9FWElTVCwgREFUQV9UWVBFX05PUl9QUk9QRVJUSUVTX05FSVRIRVJfREVSSVZFRF9GUk9NLCBEQVRBX1RZUEVfUFJPUEVSVElFU19DQU5OT1RfQkVfRU1QVFksIERBVEFfVFlQRV9ERVJJVkVEX0lTX01JU1NJTkcsIERBVEFfVFlQRV9QUk9QRVJUWV9BTFJFQURZX0RFRklORURfSU5fQU5DRVNUT1IsIERBVEFfVFlQRV9EVVBMSUNBVEVfUFJPUEVSVFksIERBVEFfVFlQRV9QUk9FUFJUWV9DQU5OT1RfSEFWRV9TQU1FX1RZUEVfT0ZfREFUQV9UWVBFLCBEQVRBX1RZUEVfQ0FOTk9UX0hBVkVfUFJPUEVSVElFUywgREFUQV9UWVBFX0NBTk5PVF9CRV9FTVBUWSwgREFUQV9UWVBFX0NBTk5PVF9CRV9VUERBVEVEX0JBRF9SRVFVRVNULAorCisJLy8gUG9saWN5IFR5cGUgcmVsYXRlZAorCVRBUkdFVFNfRU1QVFksIFRBUkdFVFNfTk9OX1ZBTElELCBQT0xJQ1lfVFlQRV9BTFJFQURZX0VYSVNULAorCisJLy8gR3JvdXAgVHlwZSByZWxhdGVkCisJR1JPVVBfTUVNQkVSX0VNUFRZLCBHUk9VUF9UWVBFX0FMUkVBRFlfRVhJU1QsCisKKwkvLyBDU0FSCisJTUlTU0lOR19DU0FSX1VVSUQsIENTQVJfSU5WQUxJRCwgQ1NBUl9JTlZBTElEX0ZPUk1BVCwgQ1NBUl9OT1RfRk9VTkQsIFlBTUxfTk9UX0ZPVU5EX0lOX0NTQVIsIFZTUF9BTFJFQURZX0VYSVNUUywgUkVTT1VSQ0VfTElOS0VEX1RPX0RJRkZFUkVOVF9WU1AsIFJFU09VUkNFX0ZST01fQ1NBUl9OT1RfRk9VTkQsIEFBSV9BUlRJRkFDVF9HRU5FUkFUSU9OX0ZBSUxFRCwKKworCS8vIEdyb3VwCisJR1JPVVBfQUxSRUFEWV9FWElTVCwgR1JPVVBfVFlQRV9JU19JTlZBTElELCBHUk9VUF9NSVNTSU5HX0dST1VQX1RZUEUsIEdST1VQX0lOVkFMSURfQ09NUE9ORU5UX0lOU1RBTkNFLCBHUk9VUF9JTlZBTElEX1RPU0NBX05BTUVfT0ZfQ09NUE9ORU5UX0lOU1RBTkNFLCBHUk9VUF9JU19NSVNTSU5HLCBHUk9VUF9BUlRJRkFDVF9BTFJFQURZX0FTU09DSUFURUQsIEdST1VQX0FSVElGQUNUX0FMUkVBRFlfRElTU09DSUFURUQsIEdST1VQX1BST1BFUlRZX05PVF9GT1VORCwgSU5WQUxJRF9WRl9NT0RVTEVfTkFNRSwgSU5WQUxJRF9WRl9NT0RVTEVfTkFNRV9NT0RJRklDQVRJT04sIElOVkFMSURfVkZfTU9EVUxFX1RZUEUsCisKKwlBUlRJRkFDVF9OT1RfRk9VTkRfSU5fQ1NBUiwgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX0RJRkZFUkVOVF9UWVBFX0lOX0NTQVIsIEZBSUxFRF9SRVRSSVZFX0FSVElGQUNUU19UWVBFUywgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX01BU1RFUl9JTl9DU0FSLCBBUlRJRkFDVF9OT1RfVkFMSURfSU5fTUFTVEVSLCBBUlRJRkFDVF9OT1RfVkFMSURfRU5WLAorCisJLy8gY2FjaGUKKwlDT05WRVJUX0NPTVBPTkVOVF9FUlJPUiwgQ09NUE9ORU5UX05PVF9GT1VORCwKKworCS8vIElucHV0cworCUlOUFVUX0lTX05PVF9DSElMRF9PRl9DT01QT05FTlQKKwkKKwk7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvQmFzaWNEYW8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9CYXNpY0Rhby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTk1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvQmFzaWNEYW8uamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmltcGwuTmVvNGpSZXNvdXJjZURBTzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouQmF0Y2hCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaE5laWdoYm91clRhYmxlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5OZW80akNsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouTmVvNGpHcmFwaEJhdGNoQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouTmVvNGpPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuTWF0Y2hGaWx0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNpY0RhbyBpbXBsZW1lbnRzIElCYXNpY0RBTyB7CisKKwlOZW80akdyYXBoQmF0Y2hCdWlsZGVyIGdyYXBoQmF0Y2hCdWlsZGVyID0gbmV3IE5lbzRqR3JhcGhCYXRjaEJ1aWxkZXIoKTsKKworCU5lbzRqQ2xpZW50IG5lbzRqQ2xpZW50OworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5lbzRqUmVzb3VyY2VEQU8uY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPFQsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGUoR3JhcGhOZWlnaGJvdXJUYWJsZSBncmFwaE5laWdoYm91clRhYmxlLAorCQkJQ2xhc3M8VD4gY2xhenosIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCisJCWlmIChncmFwaE5laWdoYm91clRhYmxlICE9IG51bGwpIHsKKworCQkJRWl0aGVyPEJhdGNoQnVpbGRlciwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGJiUmVzdWx0ID0gZ3JhcGhCYXRjaEJ1aWxkZXIKKwkJCQkJLmJ1aWxkQmF0Y2hCdWlsZGVyRnJvbVRhYmxlKGdyYXBoTmVpZ2hib3VyVGFibGUpOworCisJCQlpZiAoYmJSZXN1bHQuaXNMZWZ0KCkpIHsKKworCQkJCUJhdGNoQnVpbGRlciBiYXRjaEJ1aWxkZXIgPSBiYlJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQkvLyBOZW80ak9wZXJhdGlvblN0YXR1cyBuZW80ak9wZXJhdGlvblN0YXR1cyA9CisJCQkJLy8gbmVvNGpDbGllbnQuZXhlY3V0ZShiYXRjaEJ1aWxkZXIpOworCQkJCUVpdGhlcjxMaXN0PExpc3Q8R3JhcGhFbGVtZW50Pj4sIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBleGVjdXRlUmVzdWx0ID0gbmVvNGpDbGllbnQKKwkJCQkJCS5leGVjdXRlKGJhdGNoQnVpbGRlcik7CisKKwkJCQlpZiAoZXhlY3V0ZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChleGVjdXRlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCisJCQkJVCByZXN1bHQgPSBudWxsOworCQkJCUxpc3Q8TGlzdDxHcmFwaEVsZW1lbnQ+PiBsaXN0T2ZSZXN1bHRzID0gZXhlY3V0ZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAobGlzdE9mUmVzdWx0cyAhPSBudWxsKSB7CisJCQkJCWZvciAoTGlzdDxHcmFwaEVsZW1lbnQ+IGxpc3RPZkVsZW1lbnRzIDogbGlzdE9mUmVzdWx0cykgeworCQkJCQkJaWYgKGxpc3RPZkVsZW1lbnRzICE9IG51bGwgJiYgZmFsc2UgPT0gbGlzdE9mRWxlbWVudHMuaXNFbXB0eSgpKSB7CisJCQkJCQkJZm9yIChHcmFwaEVsZW1lbnQgZWxlbWVudCA6IGxpc3RPZkVsZW1lbnRzKSB7CisJCQkJCQkJCWxvZ2dlci5kZWJ1ZygiZWxlbWVudCB7fSB3YXMgcmV0dXJuZWQgYWZ0ZXIgcnVubmluZyBiYXRjaCBvcGVyYXRpb24ge30iLCBlbGVtZW50LCBiYXRjaEJ1aWxkZXIpOworCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoTm9kZSkgeworCQkJCQkJCQkJR3JhcGhOb2RlIG5lbzRqTm9kZSA9IChHcmFwaE5vZGUpIGVsZW1lbnQ7CisJCQkJCQkJCQlpZiAoTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShuZW80ak5vZGUuZ2V0TGFiZWwoKSkgPT0gbm9kZVR5cGUpIHsKKwkJCQkJCQkJCQlyZXN1bHQgPSBjbGF6ei5jYXN0KG5lbzRqTm9kZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGJiUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5lcnJvcigiVGhlIHRhYmxlIHNlbnQgaW4gb3JkZXIgdG8gY3JlYXRlIHJlc291cmNlIGlzIGVtcHR5LiIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVCk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPFQsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBnZXROb2RlRGF0YShTdHJpbmcgdW5pcXVlaWQsIENsYXNzPFQ+IGNsYXp6LAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCisJCU1hdGNoRmlsdGVyIGZpbHRlciA9IG5ldyBNYXRjaEZpbHRlcigpOworCQlmaWx0ZXIuYWRkVG9NYXRjaChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCB1bmlxdWVpZCk7CisKKwkJcmV0dXJuIGdldE5vZGVEYXRhKGZpbHRlciwgY2xhenosIG5vZGVUeXBlRW51bSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxULCBOZW80ak9wZXJhdGlvblN0YXR1cz4gZ2V0Tm9kZURhdGEoU3RyaW5nIGtleU5hbWUsIFN0cmluZyB1bmlxdWVpZCwKKwkJCUNsYXNzPFQ+IGNsYXp6LCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisKKwkJTWF0Y2hGaWx0ZXIgZmlsdGVyID0gbmV3IE1hdGNoRmlsdGVyKCk7CisJCWZpbHRlci5hZGRUb01hdGNoKGtleU5hbWUsIHVuaXF1ZWlkKTsKKworCQlyZXR1cm4gZ2V0Tm9kZURhdGEoZmlsdGVyLCBjbGF6eiwgbm9kZVR5cGVFbnVtKTsKKworCX0KKworCXByaXZhdGUgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxULCBOZW80ak9wZXJhdGlvblN0YXR1cz4gZ2V0Tm9kZURhdGEoTWF0Y2hGaWx0ZXIgZmlsdGVyLCBDbGFzczxUPiBjbGF6eiwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0pIHsKKworCQlFaXRoZXI8TGlzdDxHcmFwaEVsZW1lbnQ+LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gbmVvNGpDbGllbnQuZ2V0QnlGaWx0ZXIoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwKKwkJCQlub2RlVHlwZUVudW0uZ2V0TmFtZSgpLCBmaWx0ZXIpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJTGlzdDxHcmFwaEVsZW1lbnQ+IHZhbHVlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2xhenouY2FzdCh2YWx1ZS5nZXQoMCkpKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPExpc3Q8VD4sIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBnZXROb2Rlc0RhdGEoCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoLCBDbGFzczxUPiBjbGF6eiwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCisJCU1hdGNoRmlsdGVyIGZpbHRlciA9IG5ldyBNYXRjaEZpbHRlcigpOworCQlpZiAocHJvcGVydGllc1RvTWF0Y2ggIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHkgOiBwcm9wZXJ0aWVzVG9NYXRjaC5lbnRyeVNldCgpKSB7CisJCQkJZmlsdGVyLmFkZFRvTWF0Y2gocHJvcGVydHkuZ2V0S2V5KCksIHByb3BlcnR5LmdldFZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJRWl0aGVyPExpc3Q8R3JhcGhFbGVtZW50PiwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IG5lbzRqQ2xpZW50LmdldEJ5RmlsdGVyKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsCisJCQkJbm9kZVR5cGVFbnVtLmdldE5hbWUoKSwgZmlsdGVyKTsKKworCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfSBlbHNlIHsKKwkJCUxpc3Q8R3JhcGhFbGVtZW50PiB2YWx1ZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCX0gZWxzZSB7CisJCQkJTGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPigpOworCQkJCWZvciAoR3JhcGhFbGVtZW50IGVsZW1lbnQgOiB2YWx1ZSkgeworCQkJCQlsaXN0LmFkZChjbGF6ei5jYXN0KGVsZW1lbnQpKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGxpc3QpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIE5lbzRqQ2xpZW50IGdldE5lbzRqQ2xpZW50KCkgeworCQlyZXR1cm4gbmVvNGpDbGllbnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmVvNGpDbGllbnQoTmVvNGpDbGllbnQgbmVvNGpDbGllbnQpIHsKKwkJdGhpcy5uZW80akNsaWVudCA9IG5lbzRqQ2xpZW50OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0VTR2VuZXJpY0lkREFPLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvRVNHZW5lcmljSWREQU8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJiMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0VTR2VuZXJpY0lkREFPLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uYWRtaW4uaW5kaWNlcy5kZWxldGUuRGVsZXRlSW5kZXhSZXF1ZXN0OworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmFjdGlvbi5hZG1pbi5pbmRpY2VzLmRlbGV0ZS5EZWxldGVJbmRleFJlc3BvbnNlOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmFjdGlvbi5nZXQuR2V0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guYWN0aW9uLmdldC5NdWx0aUdldEl0ZW1SZXNwb25zZTsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uZ2V0Lk11bHRpR2V0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY2xpZW50LkNsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZXMuRWxhc3RpY1NlYXJjaENsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uSW5kZXhpbmdTZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRVNHZW5lcmljSWREQU8gaW1wbGVtZW50cyBJR2VuZXJpY0lkREFPIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFU0dlbmVyaWNJZERBTy5jbGFzcy5nZXROYW1lKCkpOworCisJQFJlc291cmNlKG5hbWUgPSAiZWxhc3RpY3NlYXJjaC1jbGllbnQiKQorCXByaXZhdGUgRWxhc3RpY1NlYXJjaENsaWVudCBlc0NsaWVudDsKKworCXByaXZhdGUgT2JqZWN0TWFwcGVyIGpzb25NYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHR5cGVzVG9JbmRpY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwlwdWJsaWMgQ2xpZW50IGdldENsaWVudCgpIHsKKwkJcmV0dXJuIHRoaXMuZXNDbGllbnQuZ2V0Q2xpZW50KCk7CisJfQorCisJcHVibGljIEVsYXN0aWNTZWFyY2hDbGllbnQgZ2V0RXNDbGllbnQoKSB7CisJCXJldHVybiBlc0NsaWVudDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0TWFwcGVyIGdldEpzb25NYXBwZXIoKSB7CisJCXJldHVybiBqc29uTWFwcGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEpzb25NYXBwZXIoT2JqZWN0TWFwcGVyIGpzb25NYXBwZXIpIHsKKwkJdGhpcy5qc29uTWFwcGVyID0ganNvbk1hcHBlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRUb0luZGljZXNNYXAoU3RyaW5nIHR5cGUsIFN0cmluZyBpbmRleCkgeworCQl0eXBlc1RvSW5kaWNlcy5wdXQodHlwZSwgaW5kZXgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhGb3JUeXBlKFN0cmluZyB0eXBlKSB7CisJCXJldHVybiB0eXBlc1RvSW5kaWNlcy5nZXQodHlwZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBUIGZpbmRCeUlkKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGlkLCBDbGFzczxUPiBjbGF6eikgeworCisJCVN0cmluZyBpbmRleE5hbWUgPSBnZXRJbmRleEZvclR5cGUodHlwZU5hbWUpOworCQlHZXRSZXNwb25zZSByZXNwb25zZSA9IGdldENsaWVudCgpLnByZXBhcmVHZXQoaW5kZXhOYW1lLCB0eXBlTmFtZSwgaWQpLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKTsKKworCQlpZiAocmVzcG9uc2UgPT0gbnVsbCB8fCAhcmVzcG9uc2UuaXNFeGlzdHMoKSkgeworCQkJbG9nLmRlYnVnKCJOb3RoaW5nIGZvdW5kIGluIGluZGV4IDx7fT4sIHR5cGUgPHt9PiwgZm9yIElkIDx7fT4uIiwgaW5kZXhOYW1lLCB0eXBlTmFtZSwgaWQpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlsb2cuZGVidWcoIkZvdW5kIG9uZSBpbiBpbmRleCA8e30+LCB0eXBlIDx7fT4sIGZvciBJZCA8e30+LiIsIGluZGV4TmFtZSwgdHlwZU5hbWUsIGlkKTsKKworCQlUIHJldCA9IG51bGw7CisJCXRyeSB7CisJCQlyZXQgPSAoVCkganNvbk1hcHBlci5yZWFkVmFsdWUocmVzcG9uc2UuZ2V0U291cmNlQXNTdHJpbmcoKSwgY2xhenopOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlFeGNlcHRpb25zLmNvbnZlcnRUb1J1bnRpbWVFeChlKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gTGlzdDxUPiBmaW5kQnlJZHMoU3RyaW5nIHR5cGVOYW1lLCBDbGFzczxUPiBjbGF6eiwgU3RyaW5nLi4uIGlkcykgeworCQlTdHJpbmcgaW5kZXhOYW1lID0gZ2V0SW5kZXhGb3JUeXBlKHR5cGVOYW1lKTsKKwkJTXVsdGlHZXRSZXNwb25zZSByZXNwb25zZSA9IGdldENsaWVudCgpLnByZXBhcmVNdWx0aUdldCgpLmFkZChpbmRleE5hbWUsIHR5cGVOYW1lLCBpZHMpLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKTsKKworCQlpZiAocmVzcG9uc2UgPT0gbnVsbCB8fCByZXNwb25zZS5nZXRSZXNwb25zZXMoKSA9PSBudWxsIHx8IHJlc3BvbnNlLmdldFJlc3BvbnNlcygpLmxlbmd0aCA9PSAwKSB7CisJCQlsb2cuZGVidWcoIk5vdGhpbmcgZm91bmQgaW4gaW5kZXggPHt9PiwgdHlwZSA8e30+LCBmb3IgSWRzIDx7fT4uIiwgaW5kZXhOYW1lLCB0eXBlTmFtZSwKKwkJCQkJQXJyYXlzLnRvU3RyaW5nKGlkcykpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKE11bHRpR2V0SXRlbVJlc3BvbnNlIGdldEl0ZW1SZXNwb25zZSA6IHJlc3BvbnNlLmdldFJlc3BvbnNlcygpKSB7CisJCQlpZiAoZ2V0SXRlbVJlc3BvbnNlLmdldFJlc3BvbnNlKCkuaXNFeGlzdHMoKSkgeworCQkJCVQgdmFsID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQl2YWwgPSBqc29uTWFwcGVyLnJlYWRWYWx1ZShnZXRJdGVtUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKS5nZXRTb3VyY2VBc1N0cmluZygpLCBjbGF6eik7CisJCQkJCXJlc3VsdC5hZGQodmFsKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCUV4Y2VwdGlvbnMuY29udmVydFRvUnVudGltZUV4KGUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2F2ZVJlc291cmNlRGF0YShTdHJpbmcgdHlwZU5hbWUsIE9iamVjdCBkYXRhLCBTdHJpbmcgaWQpIHRocm93cyBKc29uUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisJCVN0cmluZyBpbmRleE5hbWUgPSBnZXRJbmRleEZvclR5cGUodHlwZU5hbWUpOworCisJCWxvZy5kZWJ1ZygiRVNHZW5lcmljSWREQU8gc2F2ZVJlc291cmNlRGF0YSByZXNvdXJjZSBpbmRleE5hbWU6IHt9IHR5cGVOYW1lIGlzOiB7fSIsIGluZGV4TmFtZSwgdHlwZU5hbWUpOworCisJCVN0cmluZyBqc29uID0gZ2V0SnNvbk1hcHBlcigpLndyaXRlVmFsdWVBc1N0cmluZyhkYXRhKTsKKwkJbG9nLmRlYnVnKCJFU0dlbmVyaWNJZERBTyBzYXZlUmVzb3VyY2VEYXRhIHJlc291cmNlIGlkIGlzOiB7fSIsIGlkKTsKKwkJdHJ5IHsKKwkJCWdldENsaWVudCgpLnByZXBhcmVJbmRleChpbmRleE5hbWUsIHR5cGVOYW1lLCBpZCkuc2V0U291cmNlKGpzb24pLnNldFJlZnJlc2godHJ1ZSkuZXhlY3V0ZSgpLmFjdGlvbkdldCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gd3JpdGUgZGF0YSB3aXRoIGlkIHt9IHRvIGVsYXN0aWNzZWFyY2ggdHlwZSB7fS4gZXJyb3I6IHt9IiwgaWQsIHR5cGVOYW1lLAorCQkJCQllLmdldE1lc3NhZ2UoKSk7CisJCQl0aHJvdyBlOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVsZXRlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGlkKSB7CisJCWFzc2VydElkTm90TnVsbEZvcihpZCwgImRlbGV0ZSIpOworCQlTdHJpbmcgaW5kZXhOYW1lID0gZ2V0SW5kZXhGb3JUeXBlKHR5cGVOYW1lKTsKKwkJZ2V0Q2xpZW50KCkucHJlcGFyZURlbGV0ZShpbmRleE5hbWUsIHR5cGVOYW1lLCBpZCkuc2V0UmVmcmVzaCh0cnVlKS5leGVjdXRlKCkuYWN0aW9uR2V0KCk7CisJfQorCisJcHVibGljIHZvaWQgZGVsZXRlSW5kZXgoU3RyaW5nIGluZGV4TmFtZSkgeworCQlEZWxldGVJbmRleFJlc3BvbnNlIGFjdGlvbkdldCA9IGdldENsaWVudCgpLmFkbWluKCkuaW5kaWNlcygpLmRlbGV0ZShuZXcgRGVsZXRlSW5kZXhSZXF1ZXN0KGluZGV4TmFtZSkpCisJCQkJLmFjdGlvbkdldCgpOworCQlpZiAoIWFjdGlvbkdldC5pc0Fja25vd2xlZGdlZCgpKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBkZWxldGUgaW5kZXgge30iLCBpbmRleE5hbWUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFzc2VydElkTm90TnVsbEZvcihTdHJpbmcgaWQsIFN0cmluZyBvcGVyYXRpb24pIHsKKwkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmlzRW1wdHkoKSkgeworCQkJbG9nLmVycm9yKCJOdWxsIG9yIGVtcHR5IElkIGlzIG5vdCBhbGxvd2VkIGZvciBvcGVyYXRpb24gPCIgKyBvcGVyYXRpb24gKyAiPi4iKTsKKwkJCXRocm93IG5ldyBJbmRleGluZ1NlcnZpY2VFeGNlcHRpb24oIk51bGwgb3IgZW1wdHkgSWQgaXMgbm90IGFsbG93ZWQgZm9yIG9wZXJhdGlvbiA8IiArIG9wZXJhdGlvbiArICI+LiIpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhUeXBlRnJvbUNsYXNzKENsYXNzPD8+IGNsYXp6KSB7CisJCXJldHVybiBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvRVNHZW5lcmljU2VhcmNoREFPLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvRVNHZW5lcmljU2VhcmNoREFPLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0MzI1YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9FU0dlbmVyaWNTZWFyY2hEQU8uamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guYWN0aW9uLnNlYXJjaC5TZWFyY2hSZXF1ZXN0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uc2VhcmNoLlNlYXJjaFJlc3BvbnNlOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmluZGV4LnF1ZXJ5LlF1ZXJ5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5zZWFyY2guc29ydC5Tb3J0QnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZXMuRWxhc3RpY1NlYXJjaENsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuRXhjZXB0aW9uczsKKworLyoqCisgKiBFbGFzdGljIHNlYXJjaCBkYW8gdGhhdCBtYW5hZ2VzIHNlYXJjaCBvcGVyYXRpb25zLgorICoKKyAqIEBhdXRob3IgbHVjIGJvdXRpZXIKKyAqLworcHVibGljIGNsYXNzIEVTR2VuZXJpY1NlYXJjaERBTyBleHRlbmRzIEVTR2VuZXJpY0lkREFPIGltcGxlbWVudHMgSUdlbmVyaWNTZWFyY2hEQU8geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TRUFSQ0hfU0laRSA9IDEwMDA7CisKKwlAUmVzb3VyY2UobmFtZSA9ICJlbGFzdGljc2VhcmNoLWNsaWVudCIpCisJcHJpdmF0ZSBFbGFzdGljU2VhcmNoQ2xpZW50IGVzQ2xpZW50OworCisJQE92ZXJyaWRlCisJcHVibGljIGxvbmcgY291bnQoU3RyaW5nIGluZGV4TmFtZSwgU3RyaW5nIHR5cGVOYW1lLCBRdWVyeUJ1aWxkZXIgcXVlcnkpIHsKKworCQlTZWFyY2hSZXF1ZXN0QnVpbGRlciBzZWFyY2hSZXF1ZXN0QnVpbGRlciA9IGVzQ2xpZW50LmdldENsaWVudCgpLnByZXBhcmVTZWFyY2goaW5kZXhOYW1lKS5zZXRUeXBlcyh0eXBlTmFtZSkKKwkJCQkuc2V0U2l6ZSgwKTsKKwkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKwkJCXNlYXJjaFJlcXVlc3RCdWlsZGVyLnNldFF1ZXJ5KHF1ZXJ5KTsKKwkJfQorCisJCVNlYXJjaFJlc3BvbnNlIHJlc3BvbnNlID0gc2VhcmNoUmVxdWVzdEJ1aWxkZXIuZXhlY3V0ZSgpLmFjdGlvbkdldCgpOworCQlpZiAoIXNvbWV0aGluZ0ZvdW5kKHJlc3BvbnNlKSkgeworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcmVzcG9uc2UuZ2V0SGl0cygpLmdldFRvdGFsSGl0cygpOworCQl9CisJfQorCisJLyoqCisJICogQ29udmVydCBhIFNlYXJjaFJlc3BvbnNlIGludG8gYSBsaXN0IG9mIG9iamVjdHMgKGpzb24gZGVzZXJpYWxpemF0aW9uLikKKwkgKgorCSAqIEBwYXJhbSBzZWFyY2hSZXNwb25zZQorCSAqICAgICAgICAgICAgVGhlIGFjdHVhbCBzZWFyY2ggcmVzcG9uc2UgZnJvbSBlbGFzdGljLXNlYXJjaC4KKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIFRoZSB0eXBlIG9mIG9iamVjdHMgdG8gZGUtc2VyaWFsaXplLgorCSAqIEByZXR1cm4gQSBsaXN0IG9mIGluc3RhbmNlcyB0aGF0IGNvbnRhaW5zIGRlLXNlcmlhbGl6ZWQgZGF0YS4KKwkgKi8KKwlwdWJsaWMgPFQ+IExpc3Q8VD4gdG9HZXRMaXN0T2ZEYXRhKFNlYXJjaFJlc3BvbnNlIHNlYXJjaFJlc3BvbnNlLCBDbGFzczxUPiBjbGF6eikgeworCQkvLyByZXR1cm4gbnVsbCBpZiBubyBkYXRhIGhhcyBiZWVuIGZvdW5kIGluIGVsYXN0aWMgc2VhcmNoLgorCQlpZiAoIXNvbWV0aGluZ0ZvdW5kKHNlYXJjaFJlc3BvbnNlKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoUmVzcG9uc2UuZ2V0SGl0cygpLmdldEhpdHMoKS5sZW5ndGg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlyZXN1bHQuYWRkKGdldEpzb25NYXBwZXIoKS5yZWFkVmFsdWUoc2VhcmNoUmVzcG9uc2UuZ2V0SGl0cygpLmdldEF0KGkpLmdldFNvdXJjZUFzU3RyaW5nKCksIGNsYXp6KSk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJRXhjZXB0aW9ucy5jb252ZXJ0VG9SdW50aW1lRXgoZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyA8VD4gTGlzdDxUPiBkb0N1c3RvbUZpbmQoQ2xhc3M8VD4gY2xhenosIFN0cmluZyBpbmRleE5hbWUsIFN0cmluZyB0eXBlTmFtZSwgUXVlcnlCdWlsZGVyIHF1ZXJ5LAorCQkJU29ydEJ1aWxkZXIgc29ydEJ1aWxkZXIpIHsKKworCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKwkJU2VhcmNoUmVxdWVzdEJ1aWxkZXIgc2VhcmNoUmVxdWVzdEJ1aWxkZXIgPSBnZXRDbGllbnQoKS5wcmVwYXJlU2VhcmNoKGluZGV4TmFtZSkuc2V0VHlwZXModHlwZU5hbWUpCisJCQkJLnNldFNpemUoTUFYX1NFQVJDSF9TSVpFKTsKKwkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKwkJCXNlYXJjaFJlcXVlc3RCdWlsZGVyLnNldFF1ZXJ5KHF1ZXJ5KTsKKwkJfQorCQlpZiAoc29ydEJ1aWxkZXIgIT0gbnVsbCkgeworCQkJc2VhcmNoUmVxdWVzdEJ1aWxkZXIuYWRkU29ydChzb3J0QnVpbGRlcik7CisJCX0KKwkJU2VhcmNoUmVzcG9uc2UgcmVzcG9uc2UgPSBzZWFyY2hSZXF1ZXN0QnVpbGRlci5leGVjdXRlKCkuYWN0aW9uR2V0KCk7CisJCWlmICghc29tZXRoaW5nRm91bmQocmVzcG9uc2UpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2UuZ2V0SGl0cygpLmdldEhpdHMoKS5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBoaXQgPSByZXNwb25zZS5nZXRIaXRzKCkuZ2V0QXQoaSkuc291cmNlQXNTdHJpbmcoKTsKKworCQkJCVQgdmFsID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQl2YWwgPSBnZXRKc29uTWFwcGVyKCkucmVhZFZhbHVlKGhpdCwgY2xhenopOworCQkJCQlyZXN1bHQuYWRkKHZhbCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQlFeGNlcHRpb25zLmNvbnZlcnRUb1J1bnRpbWVFeChlKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHNvbWV0aGluZ0ZvdW5kKGZpbmFsIFNlYXJjaFJlc3BvbnNlIHNlYXJjaFJlc3BvbnNlKSB7CisJCWlmIChzZWFyY2hSZXNwb25zZSA9PSBudWxsIHx8IHNlYXJjaFJlc3BvbnNlLmdldEhpdHMoKSA9PSBudWxsIHx8IHNlYXJjaFJlc3BvbnNlLmdldEhpdHMoKS5nZXRIaXRzKCkgPT0gbnVsbAorCQkJCXx8IHNlYXJjaFJlc3BvbnNlLmdldEhpdHMoKS5nZXRIaXRzKCkubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JQmFzaWNEQU8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JQmFzaWNEQU8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJiZmIzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lCYXNpY0RBTy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoTmVpZ2hib3VyVGFibGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLk5lbzRqT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJQmFzaWNEQU8geworCisJLyoqCisJICogYWRkIHRoZSBjb250ZW50IG9mIHRoZSBncmFwaCBuZWlnaGJvdXIgdGFibGUgdG8gdGhlIGdyYXBoLgorCSAqIAorCSAqIEBwYXJhbSBncmFwaE5laWdoYm91clRhYmxlCisJICogQHBhcmFtIGNsYXp6CisJICogICAgICAgICAgICAtIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgcmV0dXJuZWQKKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiAgICAgICAgICAgIC0gbGFiZWwgb2YgdGhlIG5vZGUKKwkgKiBAcmV0dXJuIE5lbzRqTm9kZSBpbXBsZW1lbnRhdGlvbgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPFQsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGUoR3JhcGhOZWlnaGJvdXJUYWJsZSBncmFwaE5laWdoYm91clRhYmxlLAorCQkJQ2xhc3M8VD4gY2xhenosIE5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKKwkvKioKKwkgKiByZXR1cm4gdGhlIG5vZGUgZGF0YSBieSB1bmlxdWUgaWQuCisJICogCisJICogQHBhcmFtIGlkCisJICogICAgICAgICAgICAtIHVuaXF1ZSBpZCBvZiB0aGUgbm9kZQorCSAqIEBwYXJhbSBjbGF6egorCSAqIEBwYXJhbSBub2RlVHlwZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxULCBOZW80ak9wZXJhdGlvblN0YXR1cz4gZ2V0Tm9kZURhdGEoU3RyaW5nIGlkLCBDbGFzczxUPiBjbGF6eiwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxULCBOZW80ak9wZXJhdGlvblN0YXR1cz4gZ2V0Tm9kZURhdGEoU3RyaW5nIGtleU5hbWUsIFN0cmluZyBpZCwgQ2xhc3M8VD4gY2xhenosCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUpOworCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8TGlzdDxUPiwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGdldE5vZGVzRGF0YSgKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2gsIENsYXNzPFQ+IGNsYXp6LCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JQ2F0YWxvZ0RBTy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lDYXRhbG9nREFPLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5ZTk1NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JQ2F0YWxvZ0RBTy5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZXhjZXB0aW9uLlJlc291cmNlREFPRXhjZXB0aW9uOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2dEQU8geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9TQ0FfRUxFTUVOVF9JTkRFWCA9ICJ0b3NjYWVsZW1lbnQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFU19JTkRFWCA9ICJyZXNvdXJjZXMiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFRl9OQU1FX0ZJRUxEID0gInJlZk5hbWUiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFRl9WRVJTSU9OX0ZJRUxEID0gInJlZlZlcnNpb24iOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFSVElGQUNUX05BTUVfRklFTEQgPSAiYXJ0aWZhY3ROYW1lIjsKKworCXZvaWQgYWRkVG9JbmRpY2VzTWFwKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGluZGV4TmFtZSk7CisKKwkvKioKKwkgKiBTYXZlIGFuIGFydGlmYWN0IGluIHRoZSBEQU8gbGF5ZXIuCisJICogCisJICogQHBhcmFtIGltYWdlRGF0YQorCSAqLworCXZvaWQgd3JpdGVBcnRpZmFjdChFU0FydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEpIHRocm93cyBSZXNvdXJjZURBT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEdldCBhbiBhcnRpZmFjdCBhcyBhIGJ5dGUgYXJyYXkgYmFzZWQgb24gdGhlIGFydGlmYWN0IGlkLgorCSAqIAorCSAqIEBwYXJhbSBpZAorCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBhcnRpZmFjdCB0byByZWFkLgorCSAqIEBwYXJhbSBpZDIKKwkgKiBAcmV0dXJuIFRoZSBhcnRpZmFjdCBhcyBhIGJ5dGUgYXJyYXkuCisJICovCisJRWl0aGVyPEVTQXJ0aWZhY3REYXRhLCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZ2V0QXJ0aWZhY3QoU3RyaW5nIGlkKTsKKworCUVpdGhlcjxMaXN0PEVTQXJ0aWZhY3REYXRhPiwgUmVzb3VyY2VVcGxvYWRTdGF0dXM+IGdldEFydGlmYWN0cyhTdHJpbmdbXSBpZHMpOworCisJLyoqCisJICogRGVsZXRlIHRoZSBnaXZlbiBpbWFnZS4KKwkgKiAKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIElkIG9mIHRoZSBpbWFnZSB0byBkZWxldGUuCisJICovCisJdm9pZCBkZWxldGVBcnRpZmFjdChTdHJpbmcgaWQpOworCisJLyoqCisJICogZGVsZXRlIGFsbCBhcnRpZmFjdHMKKwkgKi8KKwl2b2lkIGRlbGV0ZUFsbEFydGlmYWN0cygpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvSUVsZW1lbnREQU8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JRWxlbWVudERBTy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0M2JkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvSUVsZW1lbnREQU8uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50REFPIHsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxHcmFwaEVsZW1lbnQ+LCBBY3Rpb25TdGF0dXM+IGdldEFsbENhdGVnb3JpZXMoKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxHcmFwaEVsZW1lbnQ+LCBBY3Rpb25TdGF0dXM+IGdldEFsbFRhZ3MoKTsKKworCXB1YmxpYyBFaXRoZXI8R3JhcGhFbGVtZW50LCBBY3Rpb25TdGF0dXM+IGdldENhdGVnb3J5KFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JRXNIZWFsdGhDaGVja0Rhby5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lFc0hlYWx0aENoZWNrRGFvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhYjhhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JRXNIZWFsdGhDaGVja0Rhby5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5IZWFsdGhDaGVja0luZm8uSGVhbHRoQ2hlY2tTdGF0dXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUVzSGVhbHRoQ2hlY2tEYW8geworCisJcHVibGljIEhlYWx0aENoZWNrU3RhdHVzIGdldENsdXN0ZXJIZWFsdGhTdGF0dXMoKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lHZW5lcmljSWREQU8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JR2VuZXJpY0lkREFPLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjMTFkZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JR2VuZXJpY0lkREFPLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIERBTyB0aGF0IGFsbG93cyBhY2Nlc3NpbmcgZGF0YSBieSBJZCBvciAvIGFuZCBtdWx0aXBsZSBJZHMuCisgKiAKKyAqIEBhdXRob3IgSWdvciBOZ291YWduYQorICovCitwdWJsaWMgaW50ZXJmYWNlIElHZW5lcmljSWREQU8geworCisJLyoqCisJICogRmluZCBhbiBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIFRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIGZpbmQuCisJICogQHBhcmFtIGlkCisJICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIG9iamVjdC4KKwkgKiBAcmV0dXJuIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGdpdmVuIGlkIG9yIG51bGwgaWYgbm8gb2JqZWN0IG1hdGNoaW5nCisJICogICAgICAgICB0aGUgcmVxdWVzdCBpcyBmb3VuZC4KKwkgKi8KKwk8VD4gVCBmaW5kQnlJZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpZCwgQ2xhc3M8VD4gY2xhenopOworCisJLyoqCisJICogRmluZCBpbnN0YW5jZXMgYnkgaWQKKwkgKiAKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIFRoZSBjbGFzcyBmb3Igd2hpY2ggdG8gZmluZCBhbiBpbnN0YW5jZS4KKwkgKiBAcGFyYW0gaWRzCisJICogICAgICAgICAgICBhcnJheSBvZiBpZCBvZiB0aGUgZGF0YSB0byBmaW5kLgorCSAqIEByZXR1cm4gTGlzdCBvZiBPYmplY3RzIHRoYXQgaGFzIHRoZSBnaXZlbiBpZHMgb3IgZW1wdHkgbGlzdCBpZiBubyBvYmplY3QKKwkgKiAgICAgICAgIG1hdGNoaW5nIHRoZSByZXF1ZXN0IGlzIGZvdW5kLgorCSAqLworCTxUPiBMaXN0PFQ+IGZpbmRCeUlkcyhTdHJpbmcgdHlwZU5hbWUsIENsYXNzPFQ+IGNsYXp6LCBTdHJpbmcuLi4gaWRzKTsKKworCS8qKgorCSAqIERlbGV0ZSBhbiBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiAgICAgICAgICAgIFRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIGRlbGV0ZS4KKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGRlbGV0ZS4KKwkgKi8KKwl2b2lkIGRlbGV0ZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpZCk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JR2VuZXJpY1NlYXJjaERBTy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lHZW5lcmljU2VhcmNoREFPLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwY2RhYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JR2VuZXJpY1NlYXJjaERBTy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guaW5kZXgucXVlcnkuUXVlcnlCdWlsZGVyOworCisvKioKKyAqIEEgRGFvIHRoYXQgc3VwcG9ydHMgc2VhcmNoIGFuZC9vciBmaWx0ZXIgYmFzZWQgcXVlcmllcy4KKyAqCisgKiBAYXV0aG9yIGx1YyBib3V0aWVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUdlbmVyaWNTZWFyY2hEQU8gZXh0ZW5kcyBJR2VuZXJpY0lkREFPIHsKKworCS8qKgorCSAqIEdldCB0aGUgaW5kZXggaW4gd2hpY2ggYSBjbGFzcyBiZWxvbmdzLgorCSAqCisJICogQHBhcmFtIGNsYXp6CisJICogICAgICAgICAgICBUaGUgY2xhc3MgZm9yIHdoaWNoIHRvIGdldCB0aGUgaW5kZXguCisJICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgaW5kZXggaW4gd2hpY2ggdGhlIGNsYXNzIGxpZXMuCisJICovCisJU3RyaW5nIGdldEluZGV4Rm9yVHlwZShTdHJpbmcgdHlwZSk7CisKKwlsb25nIGNvdW50KFN0cmluZyBpbmRleE5hbWUsIFN0cmluZyB0eXBlTmFtZSwgUXVlcnlCdWlsZGVyIHF1ZXJ5KTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JUHJvcGVydHlEQU8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JUHJvcGVydHlEQU8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2JkZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lQcm9wZXJ0eURBTy5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitwdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eURBTyBleHRlbmRzIElCYXNpY0RBTyB7CisKKwkvLyBFaXRoZXI8UHJvcGVydHlEYXRhLCBOZW80ak9wZXJhdGlvblN0YXR1cz4KKwkvLyBjcmVhdGVQcm9wZXJ0eURhdGEoR3JhcGhOZWlnaGJvdXJUYWJsZSBncmFwaE5laWdoYm91clRhYmxlKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lSZXNvdXJjZURBTy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL0lSZXNvdXJjZURBTy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmJjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvSVJlc291cmNlREFPLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLk5lbzRqQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5OZW80ak9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZURBTyBleHRlbmRzIElCYXNpY0RBTyB7CisKKwlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZURhdGEoU3RyaW5nIGlkKTsKKworCS8vIEVpdGhlcjxSZXNvdXJjZURhdGEsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPgorCS8vIGNyZWF0ZVJlc291cmNlRGF0YShHcmFwaE5laWdoYm91clRhYmxlIGdyYXBoTmVpZ2hib3VyVGFibGUpOworCisJLyoqCisJICogdGhlIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHRoZSByZXNvdXJjZXMgYWNjb3JkaW5nIHRvIHRoZSBzdXBwbGllZAorCSAqIHByb3BlcnRpZXMsIGlmIG5vbmUgb3IgbnVsbCBpcyBzdXBwbGllZCBhbGwgdGhlIHJlc291cmNlcyB3aWxsIGJlCisJICogcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIHByb3BlcnRpZXNUb01hdGNoCisJICogICAgICAgICAgICBhIG1hcCBvZiBwcm9wZXJ0aWVzIHRvIG1hdGNoLgorCSAqIEByZXR1cm4KKwkgKi8KKwlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxSZXNvdXJjZXNEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2gpOworCisJLy8gQWN0aW9uU3RhdHVzIHVwZGF0ZVVzZXJEYXRhKFVzZXJEYXRhIHVzZXJEYXRhKTsKKwkvLworCS8vIEFjdGlvblN0YXR1cyBkZWxldGVVc2VyRGF0YShTdHJpbmcgaWQpOworCisJdm9pZCBzZXROZW80akNsaWVudChOZW80akNsaWVudCBjbGllbnQpOworCisJRWl0aGVyPEludGVnZXIsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBnZXROdW1iZXJPZlJlc291cmNlc0J5TmFtZShTdHJpbmcgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvSVVzZXJzREFPLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9hcGkvSVVzZXJzREFPLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxZThhOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9JVXNlcnNEQU8uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVVzZXJzREFPIHsKKworCUVpdGhlcjxVc2VyRGF0YSwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyRGF0YShTdHJpbmcgaWQpOworCisJQWN0aW9uU3RhdHVzIHNhdmVVc2VyRGF0YShVc2VyRGF0YSB1c2VyRGF0YSk7CisKKwlBY3Rpb25TdGF0dXMgdXBkYXRlVXNlckRhdGEoVXNlckRhdGEgdXNlckRhdGEpOworCisJQWN0aW9uU3RhdHVzIGRlbGV0ZVVzZXJEYXRhKFN0cmluZyBpZCk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9SZXNvdXJjZVVwbG9hZFN0YXR1cy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vYXBpL1Jlc291cmNlVXBsb2FkU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlZjMxOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2FwaS9SZXNvdXJjZVVwbG9hZFN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpOworCitwdWJsaWMgZW51bSBSZXNvdXJjZVVwbG9hZFN0YXR1cyB7CisJT0ssIEFMUkVBRFlfRVhJU1QsIE5PVF9FWElTVCwgRVJST1IsIENPTVBPTkVOVF9OT1RfRVhJU1QsIFNFUlZJQ0VfTk9UX0VYSVNUCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQXJ0aWZhY3RDYXNzYW5kcmFEYW8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9BcnRpZmFjdENhc3NhbmRyYURhby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDliNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQXJ0aWZhY3RDYXNzYW5kcmFEYW8uamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmE7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5FU0FydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5NYXBwaW5nTWFuYWdlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJhcnRpZmFjdC1jYXNzYW5kcmEtZGFvIikKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdENhc3NhbmRyYURhbyBleHRlbmRzIENhc3NhbmRyYURhbyB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXJ0aWZhY3RDYXNzYW5kcmFEYW8uY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBBcnRpZmFjdENhc3NhbmRyYURhbygpIHsKKwkJc3VwZXIoKTsKKworCX0KKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJU3RyaW5nIGtleXNwYWNlID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BUlRJRkFDVF9LRVlTUEFDRTsKKwkJaWYgKGNsaWVudC5pc0Nvbm5lY3RlZCgpKSB7CisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTZXNzaW9uLCBNYXBwaW5nTWFuYWdlcj4sIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gY2xpZW50LmNvbm5lY3Qoa2V5c3BhY2UpOworCQkJaWYgKHJlc3VsdC5pc0xlZnQoKSkgeworCQkJCXNlc3Npb24gPSByZXN1bHQubGVmdCgpLnZhbHVlKCkubGVmdDsKKwkJCQltYW5hZ2VyID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpLnJpZ2h0OworCQkJCWxvZ2dlci5pbmZvKCIqKiBBcnRpZmFjdENhc3NhbmRyYURhbyBjcmVhdGVkIik7CisJCQl9IGVsc2UgeworCQkJCWxvZ2dlci5pbmZvKCIqKiBBcnRpZmFjdENhc3NhbmRyYURhbyBmYWlsZWQiKTsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXJ0aWZhY3Qga2V5c3BhY2UgWyIgKyBrZXlzcGFjZSArICJdIGZhaWxlZCB0byBjb25uZWN0IHdpdGggZXJyb3IgOiAiCisJCQkJCQkrIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nZ2VyLmluZm8oIioqIENhc3NhbmRyYSBjbGllbnQgaXNuJ3QgY29ubmVjdGVkIik7CisJCQlsb2dnZXIuaW5mbygiKiogQXJ0aWZhY3RDYXNzYW5kcmFEYW8gY3JlYXRlZCwgYnV0IG5vdCBjb25uZWN0ZWQiKTsKKwkJfQorCX0KKworCXB1YmxpYyBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgc2F2ZUFydGlmYWN0KEVTQXJ0aWZhY3REYXRhIGFydGlmYWN0KSB7CisJCXJldHVybiBjbGllbnQuc2F2ZShhcnRpZmFjdCwgRVNBcnRpZmFjdERhdGEuY2xhc3MsIG1hbmFnZXIpOworCX0KKworCXB1YmxpYyBFaXRoZXI8RVNBcnRpZmFjdERhdGEsIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gZ2V0QXJ0aWZhY3QoU3RyaW5nIGFydGlmYWN0SWQpIHsKKwkJcmV0dXJuIGNsaWVudC5nZXRCeUlkKGFydGlmYWN0SWQsIEVTQXJ0aWZhY3REYXRhLmNsYXNzLCBtYW5hZ2VyKTsKKwl9CisKKwlwdWJsaWMgQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUFydGlmYWN0KFN0cmluZyBhcnRpZmFjdElkKSB7CisJCXJldHVybiBjbGllbnQuZGVsZXRlKGFydGlmYWN0SWQsIEVTQXJ0aWZhY3REYXRhLmNsYXNzLCBtYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiAtLS0tLS0tLS1mb3IgdXNlIGluIEpVbml0IG9ubHktLS0tLS0tLS0tLS0tLS0gdGhlIG1ldGhvZCBkZWxldGVzIGFsbCB0aGUKKwkgKiB0YWJsZXMgaW4gdGhlIGF1ZGl0IGtleXNwYWNlCisJICogCisJICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBsYXN0IGZhaWxlZCBvcGVyYXRpb24gb3Igb2sgaWYgYWxsIHRoZSBkZWxldGVzCisJICogICAgICAgICB3ZXJlIHN1Y2Nlc3NmdWwKKwkgKi8KKwlwdWJsaWMgQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUFsbEFydGlmYWN0cygpIHsKKwkJbG9nZ2VyLmluZm8oImNsZWFuaW5nIGFsbCBhcnRpZmFjdHMuIik7CisJCVN0cmluZyBxdWVyeSA9ICJ0cnVuY2F0ZSBzZGNBcnRpZmFjdC5yZXNvdXJjZXM7IjsKKwkJdHJ5IHsKKwkJCXNlc3Npb24uZXhlY3V0ZShxdWVyeSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjbGVhbiBhcnRpZmFjdHMiLCBlKTsKKwkJCXJldHVybiBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCQlsb2dnZXIuaW5mbygiY2xlYW5pbmcgYWxsIGFydGlmYWN0cyBmaW5pc2hlZCBzdWNjc2VzZnVsbHkuIik7CisJCXJldHVybiBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjaGVja3MgaWYgdGhlIGdpdmVuIHRhYmxlIGlzIGVtcHR5IGluIHRoZSBhcnRpZmFjdCBrZXlzcGFjZQorCSAqIAorCSAqIEBwYXJhbSB0YWJsZU5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3ZSB3YW50IHRvIGNoZWNrCisJICogQHJldHVybiB0cnVlIGlmIHRoZSB0YWJsZSBpcyBlbXB0eQorCSAqLworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzPiBpc1RhYmxlRW1wdHkoU3RyaW5nIHRhYmxlTmFtZSkgeworCQlyZXR1cm4gc3VwZXIuaXNUYWJsZUVtcHR5KHRhYmxlTmFtZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQXVkaXRBY2Nlc3Nvci5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL0F1ZGl0QWNjZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTI2MjkwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL0F1ZGl0QWNjZXNzb3IuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkRpc3RyaWJ1dGlvbkRlcGxveUV2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkRpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkRpc3RyaWJ1dGlvblN0YXR1c0V2ZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLlJlc291cmNlQWRtaW5FdmVudDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5SZXN1bHQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkFjY2Vzc29yOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUXVlcnk7CisKK0BBY2Nlc3NvcgorcHVibGljIGludGVyZmFjZSBBdWRpdEFjY2Vzc29yIHsKKworCS8vICoqKioqIGRpc3RyaWJ1dGlvbnN0YXR1c2V2ZW50IHRhYmxlCisJQFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHNkY0F1ZGl0LmRpc3RyaWJ1dGlvbnN0YXR1c2V2ZW50IFdIRVJFIERJRCA9IDpkaWQgQU5EIEFDVElPTiA9ICdEU3RhdHVzJyBBTExPVyBGSUxURVJJTkciKQorCVJlc3VsdDxEaXN0cmlidXRpb25TdGF0dXNFdmVudD4gZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU3RhdHVzZXMoQFBhcmFtKCJkaWQiKSBTdHJpbmcgZGlkKTsKKworCS8vICoqKioqIHJlc291cmNlYWRtaW5ldmVudCB0YWJsZQorCUBRdWVyeSgiU0VMRUNUICogRlJPTSBzZGNBdWRpdC5yZXNvdXJjZWFkbWluZXZlbnQgV0hFUkUgU0VSVklDRV9JTlNUQU5DRV9JRCA9IDpzZXJ2aWNlSW5zdGFuY2VJZCBBTkQgQUNUSU9OID0gJ0RSZXF1ZXN0JyBBTExPVyBGSUxURVJJTkciKQorCVJlc3VsdDxSZXNvdXJjZUFkbWluRXZlbnQ+IGdldFNlcnZpY2VEaXN0cmlidXRpb25TdGF0dXMoQFBhcmFtKCJzZXJ2aWNlSW5zdGFuY2VJZCIpIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCk7CisKKwlAUXVlcnkoIlNFTEVDVCAqIEZST00gc2RjQXVkaXQucmVzb3VyY2VhZG1pbmV2ZW50IFdIRVJFIFNFUlZJQ0VfSU5TVEFOQ0VfSUQgPSA6c2VydmljZUluc3RhbmNlSWQgIikKKwlSZXN1bHQ8UmVzb3VyY2VBZG1pbkV2ZW50PiBnZXRCeVNlcnZpY2VJbnN0YW5jZUlkKEBQYXJhbSgic2VydmljZUluc3RhbmNlSWQiKSBTdHJpbmcgc2VydmljZUluc3RhbmNlSWQpOworCisJQFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHNkY0F1ZGl0LnJlc291cmNlYWRtaW5ldmVudCBXSEVSRSBTRVJWSUNFX0lOU1RBTkNFX0lEID0gOnNlcnZpY2VJbnN0YW5jZUlkIEFORCBQUkVWX1ZFUlNJT04gPSA6cHJldlZlcnNpb24gQUxMT1cgRklMVEVSSU5HIikKKwlSZXN1bHQ8UmVzb3VyY2VBZG1pbkV2ZW50PiBnZXRBdWRpdEJ5U2VydmljZUlkQW5kUHJldlZlcnNpb24oQFBhcmFtKCJzZXJ2aWNlSW5zdGFuY2VJZCIpIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCwKKwkJCUBQYXJhbSgicHJldlZlcnNpb24iKSBTdHJpbmcgcHJldlZlcnNpb24pOworCisJQFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHNkY0F1ZGl0LnJlc291cmNlYWRtaW5ldmVudCBXSEVSRSBESUQgPSA6ZGlkIEFORCBBQ1RJT04gPSA6YWN0aW9uIEFMTE9XIEZJTFRFUklORyIpCisJUmVzdWx0PFJlc291cmNlQWRtaW5FdmVudD4gZ2V0RGlzdHJpYnV0aW9uUmVxdWVzdChAUGFyYW0oImRpZCIpIFN0cmluZyBkaWQsIEBQYXJhbSgiYWN0aW9uIikgU3RyaW5nIGFjdGlvbik7CisKKwlAUXVlcnkoIlNFTEVDVCAqIEZST00gc2RjQXVkaXQucmVzb3VyY2VhZG1pbmV2ZW50IFdIRVJFIFNFUlZJQ0VfSU5TVEFOQ0VfSUQgPSA6c2VydmljZUluc3RhbmNlSWQgQU5EIENVUlJfVkVSU0lPTiA9IDpjdXJyVmVyc2lvbiBBTExPVyBGSUxURVJJTkciKQorCVJlc3VsdDxSZXNvdXJjZUFkbWluRXZlbnQ+IGdldEF1ZGl0QnlTZXJ2aWNlSWRBbmRDdXJyVmVyc2lvbihAUGFyYW0oInNlcnZpY2VJbnN0YW5jZUlkIikgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkLAorCQkJQFBhcmFtKCJjdXJyVmVyc2lvbiIpIFN0cmluZyBjdXJyVmVyc2lvbik7CisKKwkvLyAqKioqKiBkaXN0cmlidXRpb25kZXBsb3lldmVudCB0YWJsZQorCUBRdWVyeSgiU0VMRUNUICogRlJPTSBzZGNBdWRpdC5kaXN0cmlidXRpb25kZXBsb3lldmVudCBXSEVSRSBTRVJWSUNFX0lOU1RBTkNFX0lEID0gOnNlcnZpY2VJbnN0YW5jZUlkIEFORCBBQ1RJT04gPSAnRFJlc3VsdCcgQUxMT1cgRklMVEVSSU5HIikKKwlSZXN1bHQ8RGlzdHJpYnV0aW9uRGVwbG95RXZlbnQ+IGdldFNlcnZpY2VEaXN0cmlidXRpb25EZXBsb3koQFBhcmFtKCJzZXJ2aWNlSW5zdGFuY2VJZCIpIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCk7CisKKwlAUXVlcnkoIlNFTEVDVCAqIEZST00gc2RjQXVkaXQuZGlzdHJpYnV0aW9uZGVwbG95ZXZlbnQgV0hFUkUgRElEID0gOmRpZCBBTkQgQUNUSU9OID0gOmFjdGlvbiBBTkQgU1RBVFVTID0gOnN0YXR1cyBBTExPVyBGSUxURVJJTkciKQorCVJlc3VsdDxEaXN0cmlidXRpb25EZXBsb3lFdmVudD4gZ2V0RGlzdHJpYnV0aW9uRGVwbG95QnlTdGF0dXMoQFBhcmFtKCJkaWQiKSBTdHJpbmcgZGlkLAorCQkJQFBhcmFtKCJhY3Rpb24iKSBTdHJpbmcgYWN0aW9uLCBAUGFyYW0oInN0YXR1cyIpIFN0cmluZyBzdGF0dXMpOworCisJLy8gKioqKiogZGlzdHJpYnV0aW9ubm90aWZpY2F0aW9uZXZlbnQgdGFibGUKKwlAUXVlcnkoIlNFTEVDVCAqIEZST00gc2RjQXVkaXQuZGlzdHJpYnV0aW9ubm90aWZpY2F0aW9uZXZlbnQgV0hFUkUgU0VSVklDRV9JTlNUQU5DRV9JRCA9IDpzZXJ2aWNlSW5zdGFuY2VJZCBBTkQgQUNUSU9OID0gJ0ROb3RpZnknIEFMTE9XIEZJTFRFUklORyIpCisJUmVzdWx0PERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50PiBnZXRTZXJ2aWNlRGlzdHJpYnV0aW9uTm90aWZ5KAorCQkJQFBhcmFtKCJzZXJ2aWNlSW5zdGFuY2VJZCIpIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCk7CisKKwlAUXVlcnkoIlNFTEVDVCAqIEZST00gc2RjQXVkaXQuZGlzdHJpYnV0aW9ubm90aWZpY2F0aW9uZXZlbnQgV0hFUkUgRElEID0gOmRpZCBBTkQgQUNUSU9OID0gOmFjdGlvbiBBTExPVyBGSUxURVJJTkciKQorCVJlc3VsdDxEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudD4gZ2V0RGlzdHJpYnV0aW9uTm90aWZ5KEBQYXJhbSgiZGlkIikgU3RyaW5nIGRpZCwKKwkJCUBQYXJhbSgiYWN0aW9uIikgU3RyaW5nIGFjdGlvbik7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9BdWRpdENhc3NhbmRyYURhby5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL0F1ZGl0Q2Fzc2FuZHJhRGFvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiNTViOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9BdWRpdENhc3NhbmRyYURhby5qYXZhCkBAIC0wLDAgKzEsMzgzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdHZW5lcmljRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5EaXN0cmlidXRpb25EZXBsb3lFdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5EaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5EaXN0cmlidXRpb25TdGF0dXNFdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5SZXNvdXJjZUFkbWluRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2Vzc2lvbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuTWFwcGluZ01hbmFnZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLlJlc3VsdDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJhdWRpdC1jYXNzYW5kcmEtZGFvIikKK3B1YmxpYyBjbGFzcyBBdWRpdENhc3NhbmRyYURhbyBleHRlbmRzIENhc3NhbmRyYURhbyB7CisKKwlwcml2YXRlIEF1ZGl0QWNjZXNzb3IgYXVkaXRBY2Nlc3NvcjsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBdWRpdENhc3NhbmRyYURhby5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIEF1ZGl0Q2Fzc2FuZHJhRGFvKCkgeworCQlzdXBlcigpOworCX0KKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJU3RyaW5nIGtleXNwYWNlID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRTsKKwkJaWYgKGNsaWVudC5pc0Nvbm5lY3RlZCgpKSB7CisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTZXNzaW9uLCBNYXBwaW5nTWFuYWdlcj4sIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gY2xpZW50LmNvbm5lY3Qoa2V5c3BhY2UpOworCQkJaWYgKHJlc3VsdC5pc0xlZnQoKSkgeworCQkJCXNlc3Npb24gPSByZXN1bHQubGVmdCgpLnZhbHVlKCkubGVmdDsKKwkJCQltYW5hZ2VyID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpLnJpZ2h0OworCQkJCWF1ZGl0QWNjZXNzb3IgPSBtYW5hZ2VyLmNyZWF0ZUFjY2Vzc29yKEF1ZGl0QWNjZXNzb3IuY2xhc3MpOworCQkJCWxvZ2dlci5pbmZvKCIqKiBBdWRpdENhc3NhbmRyYURhbyBjcmVhdGVkIik7CisJCQl9IGVsc2UgeworCQkJCWxvZ2dlci5pbmZvKCIqKiBBdWRpdENhc3NhbmRyYURhbyBmYWlsZWQiKTsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKwkJCQkJCSJBdWRpdCBrZXlzcGFjZSBbIiArIGtleXNwYWNlICsgIl0gZmFpbGVkIHRvIGNvbm5lY3Qgd2l0aCBlcnJvciA6ICIgKyByZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5pbmZvKCIqKiBDYXNzYW5kcmEgY2xpZW50IGlzbid0IGNvbm5lY3RlZCIpOworCQkJbG9nZ2VyLmluZm8oIioqIEF1ZGl0Q2Fzc2FuZHJhRGFvIGNyZWF0ZWQsIGJ1dCBub3QgY29ubmVjdGVkIik7CisJCX0KKworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8VCBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50PiBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgc2F2ZVJlY29yZChUIGVudGl0eSkgeworCQlyZXR1cm4gY2xpZW50LnNhdmUoZW50aXR5LCAoQ2xhc3M8VD4pIGVudGl0eS5nZXRDbGFzcygpLCBtYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gZGlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxEaXN0cmlidXRpb25TdGF0dXNFdmVudD4sIEFjdGlvblN0YXR1cz4gZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU3RhdHVzZXMoU3RyaW5nIGRpZCkgeworCQlMaXN0PERpc3RyaWJ1dGlvblN0YXR1c0V2ZW50PiByZW1haW5pbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQ+KCk7CisKKwkJdHJ5IHsKKwkJCVJlc3VsdDxEaXN0cmlidXRpb25TdGF0dXNFdmVudD4gZXZlbnRzID0gYXVkaXRBY2Nlc3Nvci5nZXRMaXN0T2ZEaXN0cmlidXRpb25TdGF0dXNlcyhkaWQpOworCQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJub3QgZm91bmQgZGlzdHJpYnV0aW9uIHN0YXR1c2VzIGZvciBkaWQge30iLCBkaWQpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZW1haW5pbmdFbGVtZW50cyk7CisJCQl9CisJCQlldmVudHMuYWxsKCkuZm9yRWFjaChldmVudCAtPiB7CisJCQkJZXZlbnQuZmlsbEZpZWxkcygpOworCQkJCXJlbWFpbmluZ0VsZW1lbnRzLmFkZChldmVudCk7CisJCQkJbG9nZ2VyLmRlYnVnKGV2ZW50LnRvU3RyaW5nKCkpOworCQkJfSk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsCisJCQkJCSJHZXQgRGlzdHJpYnV0aW9uU3RhdHVzZXMgTGlzdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkdldCBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisKKwkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGdldCBkaXN0cmlidXRpb24gc3RhdHVzZXMgZm9yICIsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8RGlzdHJpYnV0aW9uRGVwbG95RXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGdldERpc3RyaWJ1dGlvbkRlcGxveUJ5U3RhdHVzKFN0cmluZyBkaWQsIFN0cmluZyBhY3Rpb24sCisJCQlTdHJpbmcgc3RhdHVzKSB7CisJCUxpc3Q8RGlzdHJpYnV0aW9uRGVwbG95RXZlbnQ+IHJlbWFpbmluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxEaXN0cmlidXRpb25EZXBsb3lFdmVudD4oKTsKKworCQl0cnkgeworCQkJUmVzdWx0PERpc3RyaWJ1dGlvbkRlcGxveUV2ZW50PiBldmVudHMgPSBhdWRpdEFjY2Vzc29yLmdldERpc3RyaWJ1dGlvbkRlcGxveUJ5U3RhdHVzKGRpZCwgYWN0aW9uLCBzdGF0dXMpOworCQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJub3QgZm91bmQgZGlzdHJpYnV0aW9uIHN0YXR1c2VzIGZvciBkaWQge30iLCBkaWQpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZW1haW5pbmdFbGVtZW50cyk7CisJCQl9CisJCQlldmVudHMuYWxsKCkuZm9yRWFjaChldmVudCAtPiB7CisJCQkJZXZlbnQuZmlsbEZpZWxkcygpOworCQkJCXJlbWFpbmluZ0VsZW1lbnRzLmFkZChldmVudCk7CisJCQkJbG9nZ2VyLmRlYnVnKGV2ZW50LnRvU3RyaW5nKCkpOworCQkJfSk7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZW1haW5pbmdFbGVtZW50cyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwKKwkJCQkJIkdldCBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiZ2V0IERpc3RyaWJ1dGlvbiBEZXBsb3kgQnkgU3RhdHVzIik7CisKKwkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGdldCBkaXN0cmlidXRpb24gZGVwbG95IGJ5IHN0YXR1cyBmb3IgIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGdldERpc3RyaWJ1dGlvblJlcXVlc3QoU3RyaW5nIGRpZCwgU3RyaW5nIGFjdGlvbikgeworCQlMaXN0PFJlc291cmNlQWRtaW5FdmVudD4gcmVtYWluaW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQWRtaW5FdmVudD4oKTsKKworCQl0cnkgeworCQkJUmVzdWx0PFJlc291cmNlQWRtaW5FdmVudD4gZXZlbnRzID0gYXVkaXRBY2Nlc3Nvci5nZXREaXN0cmlidXRpb25SZXF1ZXN0KGRpZCwgYWN0aW9uKTsKKwkJCWlmIChldmVudHMgPT0gbnVsbCkgeworCQkJCWxvZ2dlci5kZWJ1Zygibm90IGZvdW5kIGRpc3RyaWJ1dGlvbiByZXF1ZXN0cyBmb3IgZGlkIHt9IiwgZGlkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQkJfQorCQkJZXZlbnRzLmFsbCgpLmZvckVhY2goZXZlbnQgLT4geworCQkJCWV2ZW50LmZpbGxGaWVsZHMoKTsKKwkJCQlyZW1haW5pbmdFbGVtZW50cy5hZGQoZXZlbnQpOworCQkJCWxvZ2dlci5kZWJ1ZyhldmVudC50b1N0cmluZygpKTsKKwkJCX0pOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlbWFpbmluZ0VsZW1lbnRzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLAorCQkJCQkiR2V0IERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJnZXQgRGlzdHJpYnV0aW9uIHJlcXVlc3QiKTsKKworCQkJbG9nZ2VyLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGRpc3RyaWJ1dGlvbiByZXF1ZXN0IGZvciAiLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50PiwgQWN0aW9uU3RhdHVzPiBnZXREaXN0cmlidXRpb25Ob3RpZnkoU3RyaW5nIGRpZCwgU3RyaW5nIGFjdGlvbikgeworCQlMaXN0PERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50PiByZW1haW5pbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQ+KCk7CisKKwkJdHJ5IHsKKwkJCVJlc3VsdDxEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudD4gZXZlbnRzID0gYXVkaXRBY2Nlc3Nvci5nZXREaXN0cmlidXRpb25Ob3RpZnkoZGlkLCBhY3Rpb24pOworCQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJub3QgZm91bmQgZGlzdHJpYnV0aW9uIG5vdGlmeSBmb3IgZGlkIHt9IiwgZGlkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQkJfQorCQkJZXZlbnRzLmFsbCgpLmZvckVhY2goZXZlbnQgLT4geworCQkJCWV2ZW50LmZpbGxGaWVsZHMoKTsKKwkJCQlyZW1haW5pbmdFbGVtZW50cy5hZGQoZXZlbnQpOworCQkJCWxvZ2dlci5kZWJ1ZyhldmVudC50b1N0cmluZygpKTsKKwkJCX0pOworCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsCisJCQkJCSJHZXQgRGlzdHJpYnV0aW9uU3RhdHVzZXMgTGlzdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoImdldCBEaXN0cmlidXRpb24gbm90aWZ5Iik7CisKKwkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGdldCBkaXN0cmlidXRpb24gbm90aWZ5IGZvciAiLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlQWRtaW5FdmVudD4sIEFjdGlvblN0YXR1cz4gZ2V0QnlTZXJ2aWNlSW5zdGFuY2VJZChTdHJpbmcgc2VydmljZUluc3RhbmNlSWQpIHsKKwkJTGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+IHJlbWFpbmluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUFkbWluRXZlbnQ+KCk7CisKKwkJdHJ5IHsKKwkJCVJlc3VsdDxSZXNvdXJjZUFkbWluRXZlbnQ+IGV2ZW50cyA9IGF1ZGl0QWNjZXNzb3IuZ2V0QnlTZXJ2aWNlSW5zdGFuY2VJZChzZXJ2aWNlSW5zdGFuY2VJZCk7CisJCQlpZiAoZXZlbnRzID09IG51bGwpIHsKKwkJCQlsb2dnZXIuZGVidWcoIm5vdCBmb3VuZCBhdWRpdCByZWNvcmRzIGZvciBzZXJ2aWNlSW5zdGFuY2VJZCB7fSIsIHNlcnZpY2VJbnN0YW5jZUlkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQkJfQorCQkJZXZlbnRzLmFsbCgpLmZvckVhY2goZXZlbnQgLT4geworCQkJCWV2ZW50LmZpbGxGaWVsZHMoKTsKKwkJCQlyZW1haW5pbmdFbGVtZW50cy5hZGQoZXZlbnQpOworCQkJCWxvZ2dlci5kZWJ1ZyhldmVudC50b1N0cmluZygpKTsKKwkJCX0pOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlbWFpbmluZ0VsZW1lbnRzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLAorCQkJCQkiR2V0IERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJnZXQgRGlzdHJpYnV0aW9uIG5vdGlmeSIpOworCisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBnZXQgZGlzdHJpYnV0aW9uIG5vdGlmeSBmb3IgIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBzZXJ2aWNlSW5zdGFuY2VJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8PyBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50PiwgQWN0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlRGlzdHJpYnV0aW9uU3RhdHVzZXNMaXN0KAorCQkJU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkKSB7CisKKwkJTGlzdDxBdWRpdGluZ0dlbmVyaWNFdmVudD4gcmVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCXRyeSB7CisJCQlSZXN1bHQ8UmVzb3VyY2VBZG1pbkV2ZW50PiByZXNvdXJjZUFkbWluRXZlbnRzID0gYXVkaXRBY2Nlc3NvcgorCQkJCQkuZ2V0U2VydmljZURpc3RyaWJ1dGlvblN0YXR1cyhzZXJ2aWNlSW5zdGFuY2VJZCk7CisKKwkJCWlmIChyZXNvdXJjZUFkbWluRXZlbnRzICE9IG51bGwpIHsKKwkJCQlyZXNvdXJjZUFkbWluRXZlbnRzLmFsbCgpLmZvckVhY2goZXZlbnQgLT4geworCQkJCQlldmVudC5maWxsRmllbGRzKCk7CisJCQkJCXJlc0xpc3QuYWRkKGV2ZW50KTsKKwkJCQkJbG9nZ2VyLmRlYnVnKGV2ZW50LnRvU3RyaW5nKCkpOworCQkJCX0pOworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwKKwkJCQkJIkdldCBTZXJ2aWNlIERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJHZXQgU2VydmljZSBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBnZXQgIGRpc3RyaWJ1dGlvbiBzdGF0dXNlcyBmb3IgYWN0aW9uIHt9IiwKKwkJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9TVEFURV9DSEFOR0VfUkVRVUVTVC5nZXROYW1lKCksIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwkJdHJ5IHsKKwkJCVJlc3VsdDxEaXN0cmlidXRpb25EZXBsb3lFdmVudD4gZGlzdERlcGxveUV2ZW50cyA9IGF1ZGl0QWNjZXNzb3IKKwkJCQkJLmdldFNlcnZpY2VEaXN0cmlidXRpb25EZXBsb3koc2VydmljZUluc3RhbmNlSWQpOworCQkJaWYgKGRpc3REZXBsb3lFdmVudHMgIT0gbnVsbCkgeworCQkJCWRpc3REZXBsb3lFdmVudHMuYWxsKCkuZm9yRWFjaChldmVudCAtPiB7CisJCQkJCWV2ZW50LmZpbGxGaWVsZHMoKTsKKwkJCQkJcmVzTGlzdC5hZGQoZXZlbnQpOworCQkJCQlsb2dnZXIuZGVidWcoZXZlbnQudG9TdHJpbmcoKSk7CisJCQkJfSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwKKwkJCQkJIkdldCBTZXJ2aWNlIERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJHZXQgU2VydmljZSBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBnZXQgZGlzdHJpYnV0aW9uIHN0YXR1c2VzIGZvciBhY3Rpb24ge30iLAorCQkJCQlBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX0RFUExPWS5nZXROYW1lKCksIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwkJdHJ5IHsKKwkJCVJlc3VsdDxEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudD4gZGlzdE5vdGlmRXZlbnQgPSBhdWRpdEFjY2Vzc29yCisJCQkJCS5nZXRTZXJ2aWNlRGlzdHJpYnV0aW9uTm90aWZ5KHNlcnZpY2VJbnN0YW5jZUlkKTsKKwkJCWlmIChkaXN0Tm90aWZFdmVudCAhPSBudWxsKSB7CisJCQkJZGlzdE5vdGlmRXZlbnQuYWxsKCkuZm9yRWFjaChldmVudCAtPiB7CisJCQkJCWV2ZW50LmZpbGxGaWVsZHMoKTsKKwkJCQkJcmVzTGlzdC5hZGQoZXZlbnQpOworCQkJCQlsb2dnZXIuZGVidWcoZXZlbnQudG9TdHJpbmcoKSk7CisJCQkJfSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwKKwkJCQkJIkdldCBTZXJ2aWNlIERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJHZXQgU2VydmljZSBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBnZXQgZGlzdHJpYnV0aW9uIHN0YXR1c2VzIGZvciBhY3Rpb24ge30iLAorCQkJCQlBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX05PVElGWS5nZXROYW1lKCksIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzTGlzdCk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlQWRtaW5FdmVudD4sIEFjdGlvblN0YXR1cz4gZ2V0QXVkaXRCeVNlcnZpY2VJZEFuZFByZXZWZXJzaW9uKFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCwKKwkJCVN0cmluZyBwcmV2VmVyc2lvbikgeworCQlMaXN0PFJlc291cmNlQWRtaW5FdmVudD4gcmVtYWluaW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQWRtaW5FdmVudD4oKTsKKworCQl0cnkgeworCQkJUmVzdWx0PFJlc291cmNlQWRtaW5FdmVudD4gZXZlbnRzID0gYXVkaXRBY2Nlc3Nvci5nZXRBdWRpdEJ5U2VydmljZUlkQW5kUHJldlZlcnNpb24oc2VydmljZUluc3RhbmNlSWQsCisJCQkJCXByZXZWZXJzaW9uKTsKKwkJCWlmIChldmVudHMgPT0gbnVsbCkgeworCQkJCWxvZ2dlci5kZWJ1Zygibm90IGZvdW5kIGF1ZGl0IHJlY29yZHMgZm9yIHNlcnZpY2VJbnN0YW5jZUlkIHt9IGFuZHByZXZWZXJzaW9uIHt9Iiwgc2VydmljZUluc3RhbmNlSWQsCisJCQkJCQlwcmV2VmVyc2lvbik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlbWFpbmluZ0VsZW1lbnRzKTsKKwkJCX0KKwkJCWV2ZW50cy5hbGwoKS5mb3JFYWNoKGV2ZW50IC0+IHsKKwkJCQlldmVudC5maWxsRmllbGRzKCk7CisJCQkJcmVtYWluaW5nRWxlbWVudHMuYWRkKGV2ZW50KTsKKwkJCQlsb2dnZXIuZGVidWcoZXZlbnQudG9TdHJpbmcoKSk7CisJCQl9KTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZW1haW5pbmdFbGVtZW50cyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwKKwkJCQkJImdldCBBdWRpdCBCeSBTZXJ2aWNlSWQgQW5kIFByZXZWZXJzaW9uIik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiZ2V0IEF1ZGl0IEJ5IFNlcnZpY2VJZCBBbmQgUHJldlZlcnNpb24iKTsKKworCQkJbG9nZ2VyLmRlYnVnKCJmYWlsZWQgdG8gZ2V0QXVkaXRCeVNlcnZpY2VJZEFuZFByZXZWZXJzaW9uICIsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiwgQWN0aW9uU3RhdHVzPiBnZXRBdWRpdEJ5U2VydmljZUlkQW5kQ3VyclZlcnNpb24oU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkLAorCQkJU3RyaW5nIGN1cnJWZXJzaW9uKSB7CisJCUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PiByZW1haW5pbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VBZG1pbkV2ZW50PigpOworCisJCXRyeSB7CisJCQlSZXN1bHQ8UmVzb3VyY2VBZG1pbkV2ZW50PiBldmVudHMgPSBhdWRpdEFjY2Vzc29yLmdldEF1ZGl0QnlTZXJ2aWNlSWRBbmRDdXJyVmVyc2lvbihzZXJ2aWNlSW5zdGFuY2VJZCwKKwkJCQkJY3VyclZlcnNpb24pOworCQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJub3QgZm91bmQgYXVkaXQgcmVjb3JkcyBmb3Igc2VydmljZUluc3RhbmNlSWQge30gYW5kcHJldlZlcnNpb24ge30iLCBzZXJ2aWNlSW5zdGFuY2VJZCwKKwkJCQkJCWN1cnJWZXJzaW9uKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQkJfQorCQkJZXZlbnRzLmFsbCgpLmZvckVhY2goZXZlbnQgLT4geworCQkJCWV2ZW50LmZpbGxGaWVsZHMoKTsKKwkJCQlyZW1haW5pbmdFbGVtZW50cy5hZGQoZXZlbnQpOworCQkJCWxvZ2dlci5kZWJ1ZyhldmVudC50b1N0cmluZygpKTsKKwkJCX0pOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlbWFpbmluZ0VsZW1lbnRzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLAorCQkJCQkiZ2V0IEF1ZGl0IEJ5IFNlcnZpY2VJZCBBbmQgQ3VyclZlcnNpb24iKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJnZXQgQXVkaXQgQnkgU2VydmljZUlkIEFuZCBDdXJyVmVyc2lvbiIpOworCisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBnZXRBdWRpdEJ5U2VydmljZUlkQW5kUHJldlZlcnNpb24gIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY2hlY2tzIGlmIHRoZSBnaXZlbiB0YWJsZSBpcyBlbXB0eSBpbiB0aGUgYXVkaXQga2V5c3BhY2UKKwkgKiAKKwkgKiBAcGFyYW0gdGFibGVOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGFibGUgd2Ugd2FudCB0byBjaGVjaworCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgaXMgZW1wdHkKKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gaXNUYWJsZUVtcHR5KFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJcmV0dXJuIHN1cGVyLmlzVGFibGVFbXB0eSh0YWJsZU5hbWUpOworCX0KKworCS8qKgorCSAqIC0tLS0tLS0tLWZvciB1c2UgaW4gSlVuaXQgb25seS0tLS0tLS0tLS0tLS0tLSB0aGUgbWV0aG9kIGRlbGV0ZXMgYWxsIHRoZQorCSAqIHRhYmxlcyBpbiB0aGUgYXVkaXQga2V5c3BhY2UKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIGxhc3QgZmFpbGVkIG9wZXJhdGlvbiBvciBvayBpZiBhbGwgdGhlIGRlbGV0ZXMKKwkgKiAgICAgICAgIHdlcmUgc3VjY2Vzc2Z1bAorCSAqLworCXB1YmxpYyBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgZGVsZXRlQWxsQXVkaXQoKSB7CisJCWxvZ2dlci5pbmZvKCJjbGVhbmluZyBhbGwgYXVkaXQgdGFibGVzLiIpOworCQlTdHJpbmcgcXVlcnkgPSAidHJ1bmNhdGUgIiArIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UgKyAiLiI7CisJCXRyeSB7CisJCQlmb3IgKFRhYmxlIHRhYmxlIDogVGFibGUudmFsdWVzKCkpIHsKKwkJCQlpZiAodGFibGUuZ2V0VGFibGVEZXNjcmlwdGlvbigpLmdldEtleXNwYWNlKCkuZXF1YWxzKEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UpKSB7CisJCQkJCWxvZ2dlci5kZWJ1ZygiY2xlYW4gQXVkaXQgdGFibGU6e30iLCB0YWJsZS5nZXRUYWJsZURlc2NyaXB0aW9uKCkuZ2V0VGFibGVOYW1lKCkpOworCQkJCQlzZXNzaW9uLmV4ZWN1dGUocXVlcnkgKyB0YWJsZS5nZXRUYWJsZURlc2NyaXB0aW9uKCkuZ2V0VGFibGVOYW1lKCkgKyAiOyIpOworCQkJCQlsb2dnZXIuZGVidWcoImNsZWFuIEF1ZGl0IHRhYmxlOnt9IHdhcyBzdWNjc2VzZnVsbCIsIHRhYmxlLmdldFRhYmxlRGVzY3JpcHRpb24oKS5nZXRUYWJsZU5hbWUoKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY2xlYW4gQXVkaXQiLCBlKTsKKwkJCXJldHVybiBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCQlsb2dnZXIuaW5mbygiY2xlYW4gYWxsIGF1ZGl0IGZpbmlzaGVkIHN1Y2NzZXNmdWxseS4iKTsKKwkJcmV0dXJuIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQ2Fzc2FuZHJhQ2xpZW50LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQ2Fzc2FuZHJhQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiOWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9DYXNzYW5kcmFDbGllbnQuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5wb2xpY2llcy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlcjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2Vzc2lvbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuTWFwcGVyOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5NYXBwaW5nTWFuYWdlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJjYXNzYW5kcmEtY2xpZW50IikKK3B1YmxpYyBjbGFzcyBDYXNzYW5kcmFDbGllbnQgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXNzYW5kcmFDbGllbnQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgQ2x1c3RlciBjbHVzdGVyOworCXByaXZhdGUgYm9vbGVhbiBpc0Nvbm5lY3RlZDsKKworCXB1YmxpYyBDYXNzYW5kcmFDbGllbnQoKSB7CisJCXN1cGVyKCk7CisJCWlzQ29ubmVjdGVkID0gZmFsc2U7CisJCUxpc3Q8U3RyaW5nPiBjYXNzYW5kcmFIb3N0cyA9IG51bGw7CisJCXRyeSB7CisJCQljYXNzYW5kcmFIb3N0cyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldENhc3NhbmRyYUNvbmZpZygpCisJCQkJCS5nZXRDYXNzYW5kcmFIb3N0cygpOworCQkJTG9uZyByZWNvbm5lY3RUaW1lb3V0ID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkJLmdldENhc3NhbmRyYUNvbmZpZygpLmdldFJlY29ubmVjdFRpbWVvdXQoKTsKKworCQkJbG9nZ2VyLmRlYnVnKCJjcmVhdGluZyBjbHVzdGVyIHRvIGhvc3RzOnt9IHdpdGggcmVjb25uZWN0IHRpbWVvdXQ6e30iLCBjYXNzYW5kcmFIb3N0cywgcmVjb25uZWN0VGltZW91dCk7CisJCQlDbHVzdGVyLkJ1aWxkZXIgY2x1c3RlckJ1aWxkZXIgPSBDbHVzdGVyLmJ1aWxkZXIoKQorCQkJCQkud2l0aFJlY29ubmVjdGlvblBvbGljeShuZXcgQ29uc3RhbnRSZWNvbm5lY3Rpb25Qb2xpY3kocmVjb25uZWN0VGltZW91dCkpCisJCQkJCS53aXRoUmV0cnlQb2xpY3koRGVmYXVsdFJldHJ5UG9saWN5LklOU1RBTkNFKTsKKworCQkJY2Fzc2FuZHJhSG9zdHMuZm9yRWFjaChob3N0IC0+IGNsdXN0ZXJCdWlsZGVyLmFkZENvbnRhY3RQb2ludChob3N0KSk7CisJCQllbmFibGVBdXRoZW50aWNhdGlvbihjbHVzdGVyQnVpbGRlcik7CisJCQllbmFibGVTc2woY2x1c3RlckJ1aWxkZXIpOworCQkJc2V0TG9jYWxEYyhjbHVzdGVyQnVpbGRlcik7CisKKwkJCWNsdXN0ZXIgPSBjbHVzdGVyQnVpbGRlci5idWlsZCgpOworCQkJaXNDb25uZWN0ZWQgPSB0cnVlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmluZm8oIioqIENhc3NhbmRyYUNsaWVudCBpc24ndCBjb25uZWN0ZWQgdG8ge30iLCBjYXNzYW5kcmFIb3N0cyk7CisJCX0KKworCQlsb2dnZXIuaW5mbygiKiogQ2Fzc2FuZHJhQ2xpZW50IGNyZWF0ZWQiKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TG9jYWxEYyhDbHVzdGVyLkJ1aWxkZXIgY2x1c3RlckJ1aWxkZXIpIHsKKwkJU3RyaW5nIGxvY2FsRGF0YUNlbnRlciA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldENhc3NhbmRyYUNvbmZpZygpCisJCQkJLmdldExvY2FsRGF0YUNlbnRlcigpOworCQlpZiAobG9jYWxEYXRhQ2VudGVyICE9IG51bGwpIHsKKwkJCWxvZ2dlci5pbmZvKCJsb2NhbERhdGFjZW50ZXIgd2FzIHByb3ZpZGVkLCBzZXR0aW5nIENhc3NuZHJhIGNsaW50IHRvIHVzZSBkYXRhY2VudGVyOiB7fSBhcyBsb2NhbC4iLAorCQkJCQlsb2NhbERhdGFDZW50ZXIpOworCQkJTG9hZEJhbGFuY2luZ1BvbGljeSB0b2tlbkF3YXJlUG9saWN5ID0gbmV3IFRva2VuQXdhcmVQb2xpY3koCisJCQkJCURDQXdhcmVSb3VuZFJvYmluUG9saWN5LmJ1aWxkZXIoKS53aXRoTG9jYWxEYyhsb2NhbERhdGFDZW50ZXIpLmJ1aWxkKCkpOworCQkJY2x1c3RlckJ1aWxkZXIud2l0aExvYWRCYWxhbmNpbmdQb2xpY3kodG9rZW5Bd2FyZVBvbGljeSk7CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuaW5mbygKKwkJCQkJImxvY2FsRGF0YWNlbnRlciB3YXMgcHJvdmlkZWQsICB0aGUgZHJpdmVyIHdpbGwgdXNlIHRoZSBkYXRhY2VudGVyIG9mIHRoZSBmaXJzdCBjb250YWN0IHBvaW50IHRoYXQgd2FzIHJlYWNoZWQgYXQgaW5pdGlhbGl6YXRpb24iKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBlbmFibGVTc2woQ2x1c3Rlci5CdWlsZGVyIGNsdXN0ZXJCdWlsZGVyKSB7CisJCWJvb2xlYW4gc3NsID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2Fzc2FuZHJhQ29uZmlnKCkuaXNTc2woKTsKKwkJaWYgKHNzbCkgeworCQkJU3RyaW5nIHRydXN0c3RvcmVQYXRoID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkJLmdldENhc3NhbmRyYUNvbmZpZygpLmdldFRydXN0c3RvcmVQYXRoKCk7CisJCQlTdHJpbmcgdHJ1c3RzdG9yZVBhc3N3b3JkID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkJLmdldENhc3NhbmRyYUNvbmZpZygpLmdldFRydXN0c3RvcmVQYXNzd29yZCgpOworCQkJaWYgKHRydXN0c3RvcmVQYXRoID09IG51bGwgfHwgdHJ1c3RzdG9yZVBhc3N3b3JkID09IG51bGwpIHsKKwkJCQlsb2dnZXIuZXJyb3IoInNzbCBpcyBlbmFibGVkIGJ1dCB0cnVzdHN0b3JlUGF0aCBvciB0cnVzdHN0b3JlUGFzc3dvcmQgd2VyZSBub3Qgc3VwcGxpZWQuIik7CisJCQl9IGVsc2UgeworCQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgdHJ1c3RzdG9yZVBhdGgpOworCQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiLCB0cnVzdHN0b3JlUGFzc3dvcmQpOworCQkJCWNsdXN0ZXJCdWlsZGVyLndpdGhTU0woKTsKKwkJCX0KKworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGVuYWJsZUF1dGhlbnRpY2F0aW9uKENsdXN0ZXIuQnVpbGRlciBjbHVzdGVyQnVpbGRlcikgeworCQlib29sZWFuIGF1dGhlbnRpY2F0ZSA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldENhc3NhbmRyYUNvbmZpZygpCisJCQkJLmlzQXV0aGVudGljYXRlKCk7CisJCWlmIChhdXRoZW50aWNhdGUpIHsKKwkJCVN0cmluZyB1c2VybmFtZSA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldENhc3NhbmRyYUNvbmZpZygpCisJCQkJCS5nZXRVc2VybmFtZSgpOworCQkJU3RyaW5nIHBhc3N3b3JkID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2Fzc2FuZHJhQ29uZmlnKCkKKwkJCQkJLmdldFBhc3N3b3JkKCk7CisJCQlpZiAodXNlcm5hbWUgPT0gbnVsbCB8fCBwYXNzd29yZCA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLmVycm9yKCJhdXRoZW50aWNhdGlvbiBpcyBlbmFibGVkIGJ1dCB1c2VybmFtZSBvciBwYXNzd29yZCB3ZXJlIG5vdCBzdXBwbGllZC4iKTsKKwkJCX0gZWxzZSB7CisJCQkJY2x1c3RlckJ1aWxkZXIud2l0aENyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCk7CisJCQl9CisKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBrZXlzcGFjZQorCSAqICAgICAgICAgICAgLSBrZXkgc3BhY2UgdG8gY29ubmVjdAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8U2Vzc2lvbiwgTWFwcGluZ01hbmFnZXI+LCBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM+IGNvbm5lY3QoU3RyaW5nIGtleXNwYWNlKSB7CisJCWlmIChjbHVzdGVyICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJU2Vzc2lvbiBzZXNzaW9uID0gY2x1c3Rlci5jb25uZWN0KGtleXNwYWNlKTsKKwkJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisJCQkJCU1hcHBpbmdNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFwcGluZ01hbmFnZXIoc2Vzc2lvbik7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgSW1tdXRhYmxlUGFpcjxTZXNzaW9uLCBNYXBwaW5nTWFuYWdlcj4oc2Vzc2lvbiwgbWFuYWdlcikpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLktFWVNQQUNFX05PVF9DT05ORUNURUQpOworCQkJCX0KKwkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gY29ubmVjdCB0byBrZXlzcGFjZSBbe31dLCBlcnJvciA6Iiwga2V5c3BhY2UsIGUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLktFWVNQQUNFX05PVF9DT05ORUNURUQpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLkNMVVNURVJfTk9UX0NPTk5FQ1RFRCk7CisJfQorCisJcHVibGljIDxUPiBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgc2F2ZShUIGVudGl0eSwgQ2xhc3M8VD4gY2xhenosIE1hcHBpbmdNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJaWYgKCFpc0Nvbm5lY3RlZCkgeworCQkJcmV0dXJuIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5DTFVTVEVSX05PVF9DT05ORUNURUQ7CisJCX0KKwkJdHJ5IHsKKwkJCU1hcHBlcjxUPiBtYXBwZXIgPSBtYW5hZ2VyLm1hcHBlcihjbGF6eik7CisJCQltYXBwZXIuc2F2ZShlbnRpdHkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gc2F2ZSBlbnRpdHkgW3t9XSwgZXJyb3IgOiIsIGVudGl0eSwgZSk7CisJCQlyZXR1cm4gQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwkJcmV0dXJuIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM+IGdldEJ5SWQoU3RyaW5nIGlkLCBDbGFzczxUPiBjbGF6eiwgTWFwcGluZ01hbmFnZXIgbWFuYWdlcikgeworCQlpZiAoIWlzQ29ubmVjdGVkKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5DTFVTVEVSX05PVF9DT05ORUNURUQpOworCQl9CisJCXRyeSB7CisJCQlNYXBwZXI8VD4gbWFwcGVyID0gbWFuYWdlci5tYXBwZXIoY2xhenopOworCQkJVCByZXN1bHQgPSBtYXBwZXIuZ2V0KGlkKTsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGdldCBieSBJZCBbe31dLCBlcnJvciA6IiwgaWQsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwl9CisKKwlwdWJsaWMgPFQ+IENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cyBkZWxldGUoU3RyaW5nIGlkLCBDbGFzczxUPiBjbGF6eiwgTWFwcGluZ01hbmFnZXIgbWFuYWdlcikgeworCQlpZiAoIWlzQ29ubmVjdGVkKSB7CisJCQlyZXR1cm4gQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLkNMVVNURVJfTk9UX0NPTk5FQ1RFRDsKKwkJfQorCQl0cnkgeworCQkJTWFwcGVyPFQ+IG1hcHBlciA9IG1hbmFnZXIubWFwcGVyKGNsYXp6KTsKKwkJCW1hcHBlci5kZWxldGUoaWQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGJ5IGlkIFt7fV0sIGVycm9yIDoiLCBpZCwgZSk7CisJCQlyZXR1cm4gQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwkJcmV0dXJuIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKwkJcmV0dXJuIGlzQ29ubmVjdGVkOworCX0KKworCUBQcmVEZXN0cm95CisJcHVibGljIHZvaWQgY2xvc2VDbGllbnQoKSB7CisJCWlmIChpc0Nvbm5lY3RlZCkgeworCQkJY2x1c3Rlci5jbG9zZSgpOworCQl9CisJCWxvZ2dlci5pbmZvKCIqKiBDYXNzYW5kcmFDbGllbnQgY2x1c3RlciBjbG9zZWQiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQ2Fzc2FuZHJhRGFvLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQ2Fzc2FuZHJhRGFvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyZWIxNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9DYXNzYW5kcmFEYW8uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYTsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5SZXN1bHRTZXQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUucXVlcnlidWlsZGVyLlF1ZXJ5QnVpbGRlcjsKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5NYXBwaW5nTWFuYWdlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIENhc3NhbmRyYURhbyB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2Fzc2FuZHJhRGFvLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcm90ZWN0ZWQgU2Vzc2lvbiBzZXNzaW9uOworCXByb3RlY3RlZCBNYXBwaW5nTWFuYWdlciBtYW5hZ2VyOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBDYXNzYW5kcmFDbGllbnQgY2xpZW50OworCisJLyoqCisJICogdGhlIG1ldGhvZCBjaGVja3MgaWYgdGhlIGdpdmVuIHRhYmxlIGlzIGVtcHR5IHVuZGVyIHRoZSBrZXlzcGFjZSB0aGUKKwkgKiBzZXNzaW9uIHdhcyBvcGVuZWQgdG8uCisJICogCisJICogQHBhcmFtIHRhYmxlTmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdlIHdhbnQgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFibGUgd2FzIGVtcHR5CisJICovCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM+IGlzVGFibGVFbXB0eShTdHJpbmcgdGFibGVOYW1lKSB7CisKKwkJU3RhdGVtZW50IHNlbGVjdCA9IFF1ZXJ5QnVpbGRlci5zZWxlY3QoKS5jb3VudEFsbCgpLmZyb20odGFibGVOYW1lKS5saW1pdCgxMCk7CisJCXRyeSB7CisJCQlSZXN1bHRTZXQgcmVzID0gc2Vzc2lvbi5leGVjdXRlKHNlbGVjdCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoKHJlcy5vbmUoKS5nZXRMb25nKCJjb3VudCIpICE9IDAgPyBmYWxzZSA6IHRydWUpKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgY2hlY2sgaWYgdGFibGUgaXMgZW1wdHkiLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiNzFjNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9DYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYTsKKworcHVibGljIGVudW0gQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzIHsKKwlPSywgQ0xVU1RFUl9OT1RfQ09OTkVDVEVELCBLRVlTUEFDRV9OT1RfQ09OTkVDVEVELCBHRU5FUkFMX0VSUk9SLCBOT1RfRk9VTkQKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL0NvbXBvbmVudENhY2hlQWNjZXNzb3IuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9Db21wb25lbnRDYWNoZUFjY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4MDcyYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9Db21wb25lbnRDYWNoZUFjY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudENhY2hlRGF0YTsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5SZXN1bHQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkFjY2Vzc29yOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUXVlcnk7CisKK0BBY2Nlc3NvcgorcHVibGljIGludGVyZmFjZSBDb21wb25lbnRDYWNoZUFjY2Vzc29yIHsKKworCUBRdWVyeSgiU0VMRUNUICogRlJPTSBzZGNjb21wb25lbnQuY29tcG9uZW50Y2FjaGUgV0hFUkUgaWQgSU4gOmlkcyBBTExPVyBGSUxURVJJTkciKQorCVJlc3VsdDxDb21wb25lbnRDYWNoZURhdGE+IGdldENvbXBvbmVudHMoQFBhcmFtKCJpZHMiKSBMaXN0PFN0cmluZz4gaWRzKTsKKworCUBRdWVyeSgiU0VMRUNUICogRlJPTSBzZGNjb21wb25lbnQuY29tcG9uZW50Y2FjaGUgV0hFUkUgaWQgPSA6aWQgQUxMT1cgRklMVEVSSU5HIikKKwlSZXN1bHQ8Q29tcG9uZW50Q2FjaGVEYXRhPiBnZXRDb21wb25lbnQoQFBhcmFtKCJpZCIpIFN0cmluZyBpZCk7CisKKwlAUXVlcnkoIlNFTEVDVCBpZCxtb2RpZmljYXRpb25fdGltZSx0eXBlIEZST00gc2RjY29tcG9uZW50LmNvbXBvbmVudGNhY2hlIEFMTE9XIEZJTFRFUklORyIpCisJUmVzdWx0PENvbXBvbmVudENhY2hlRGF0YT4gZ2V0QWxsQ29tcG9uZW50SWRUaW1lQW5kVHlwZSgpOworCisJLy8gQFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHNkY2FydGlmYWN0LnJlc291cmNlcyBMSU1JVCAyMDAwIikKKwkvLyBSZXN1bHQ8RVNBcnRpZmFjdERhdGE+IGdldExpc3RPZlJlc291cmNlcygpOworCisJLy8gUmVzdWx0PEVTQXJ0aWZhY3REYXRhPiBnZXRMaXN0T2ZSZXNvdXJjZXMoTGlzdDxTdHJpbmc+IGRpZHMpOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL0NvbXBvbmVudENhc3NhbmRyYURhby5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL0NvbXBvbmVudENhc3NhbmRyYURhby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmRmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvQ29tcG9uZW50Q2Fzc2FuZHJhRGFvLmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50Q2FjaGVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNlc3Npb247CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLk1hcHBpbmdNYW5hZ2VyOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5SZXN1bHQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgiY29tcG9uZW50LWNhc3NhbmRyYS1kYW8iKQorcHVibGljIGNsYXNzIENvbXBvbmVudENhc3NhbmRyYURhbyBleHRlbmRzIENhc3NhbmRyYURhbyB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29tcG9uZW50Q2Fzc2FuZHJhRGFvLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgc3RhdGljIEludGVnZXIgREVGQVVMVF9GRVRDSF9TSVpFID0gNTAwOworCisJcHJpdmF0ZSBDb21wb25lbnRDYWNoZUFjY2Vzc29yIGNvbXBvbmVudENhY2hlQWNjZXNzb3I7CisKKwlwdWJsaWMgQ29tcG9uZW50Q2Fzc2FuZHJhRGFvKCkgeworCQlzdXBlcigpOworCisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlTdHJpbmcga2V5c3BhY2UgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkNPTVBPTkVOVF9LRVlTUEFDRTsKKwkJaWYgKGNsaWVudC5pc0Nvbm5lY3RlZCgpKSB7CisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTZXNzaW9uLCBNYXBwaW5nTWFuYWdlcj4sIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gY2xpZW50LmNvbm5lY3Qoa2V5c3BhY2UpOworCQkJaWYgKHJlc3VsdC5pc0xlZnQoKSkgeworCQkJCXNlc3Npb24gPSByZXN1bHQubGVmdCgpLnZhbHVlKCkubGVmdDsKKwkJCQltYW5hZ2VyID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpLnJpZ2h0OworCQkJCWNvbXBvbmVudENhY2hlQWNjZXNzb3IgPSBtYW5hZ2VyLmNyZWF0ZUFjY2Vzc29yKENvbXBvbmVudENhY2hlQWNjZXNzb3IuY2xhc3MpOworCQkJCWxvZ2dlci5pbmZvKCIqKiBDb21wb25lbnRDYXNzYW5kcmFEYW8gY3JlYXRlZCIpOworCQkJfSBlbHNlIHsKKwkJCQlsb2dnZXIuaW5mbygiKiogQ29tcG9uZW50Q2Fzc2FuZHJhRGFvIGZhaWxlZCIpOworCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBcnRpZmFjdCBrZXlzcGFjZSBbIiArIGtleXNwYWNlICsgIl0gZmFpbGVkIHRvIGNvbm5lY3Qgd2l0aCBlcnJvciA6ICIKKwkJCQkJCSsgcmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuaW5mbygiKiogQ2Fzc2FuZHJhIGNsaWVudCBpc24ndCBjb25uZWN0ZWQiKTsKKwkJCWxvZ2dlci5pbmZvKCIqKiBDb21wb25lbnRDYXNzYW5kcmFEYW8gY3JlYXRlZCwgYnV0IG5vdCBjb25uZWN0ZWQiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBpZHMKKwkgKiAgICAgICAgICAgIC0gbGlzdCBvZiBjb21wb25lbnRzIHVuaXF1ZSBpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50Q2FjaGVEYXRhPiwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRzKExpc3Q8U3RyaW5nPiBpZHMpIHsKKworCQlMaXN0PENvbXBvbmVudENhY2hlRGF0YT4gY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50Q2FjaGVEYXRhPigpOworCQlpZiAoaWRzID09IG51bGwgfHwgdHJ1ZSA9PSBpZHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29tcG9uZW50cyk7CisJCX0KKworCQl0cnkgeworCisJCQlSZXN1bHQ8Q29tcG9uZW50Q2FjaGVEYXRhPiBldmVudHMgPSBjb21wb25lbnRDYWNoZUFjY2Vzc29yLmdldENvbXBvbmVudHMoaWRzKTsKKwkJCWlmIChldmVudHMgPT0gbnVsbCkgeworCQkJCWxvZ2dlci50cmFjZSgibm90IGZvdW5kIGNvbXBvbmVudCBmb3IgaWRzIGxpc3Qgb2YgaW4gc2l6ZSB7fSIsIGlkcy5zaXplKCkpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnRzKTsKKwkJCX0KKwkJCWV2ZW50cy5hbGwoKS5mb3JFYWNoKGV2ZW50IC0+IHsKKwkJCQljb21wb25lbnRzLmFkZChldmVudCk7CisJCQkJaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJCWxvZ2dlci50cmFjZSgiRmV0Y2ggY29tcG9uZW50IHVpZCA9IHt9IGlzRGlydHkgPSB7fSIsIGV2ZW50LmdldElkKCksIGV2ZW50LmdldElzRGlydHkoKSk7CisJCQkJfQorCQkJfSk7CisKKwkJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gZmV0Y2ggd2FzIHt9LiBBY3R1YWxseSwge30gY29tcG9uZW50cyBmZXRjaGVkIiwgaWRzLnNpemUoKSwKKwkJCQkJY29tcG9uZW50cy5zaXplKCkpOworCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29tcG9uZW50cyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiR2V0Q29tcG9uZW50c0Zyb21DYWNoZSIpOworCisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBnZXQgY29tcG9uZW50cyBmcm9tIGNhY2hlIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRDYWNoZURhdGE+LCBBY3Rpb25TdGF0dXM+IGdldEFsbENvbXBvbmVudElkVGltZUFuZFR5cGUoKSB7CisJCXRyeSB7CisJCQlMaXN0PENvbXBvbmVudENhY2hlRGF0YT4gY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50Q2FjaGVEYXRhPigpOworCQkJUmVzdWx0PENvbXBvbmVudENhY2hlRGF0YT4gZXZlbnRzID0gY29tcG9uZW50Q2FjaGVBY2Nlc3Nvci5nZXRBbGxDb21wb25lbnRJZFRpbWVBbmRUeXBlKCk7CisJCQlpZiAoZXZlbnRzID09IG51bGwpIHsKKwkJCQlsb2dnZXIudHJhY2UoIm5vIGNvbXBvbmVudCBmb3VuZCAiKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29tcG9uZW50cyk7CisJCQl9CisJCQlldmVudHMuYWxsKCkuZm9yRWFjaChldmVudCAtPiB7CisJCQkJY29tcG9uZW50cy5hZGQoZXZlbnQpOworCQkJCWlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIudHJhY2UoIkZldGNoIGNvbXBvbmVudCB1aWQgPSB7fSBpc0RpcnR5ID0ge30iLCBldmVudC5nZXRJZCgpLCBldmVudC5nZXRJc0RpcnR5KCkpOworCQkJCX0KKwkJCX0pOworCisJCQlsb2dnZXIuZGVidWcoIk51bWJlciBvZiBjb21wb25lbnRzIGZldGNoZWQgd2FzIHt9LiIsIGNvbXBvbmVudHMuc2l6ZSgpKTsKKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudHMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkdldENvbXBvbmVudHNGcm9tQ2FjaGUiKTsKKworCQkJbG9nZ2VyLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGNvbXBvbmVudHMgZnJvbSBjYWNoZSIsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIC0gY29tcG9uZW50IHVuaXF1ZSBpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudENhY2hlRGF0YSwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnQoU3RyaW5nIGlkKSB7CisKKwkJaWYgKGlkID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCX0KKworCQl0cnkgeworCisJCQlSZXN1bHQ8Q29tcG9uZW50Q2FjaGVEYXRhPiBldmVudHMgPSBjb21wb25lbnRDYWNoZUFjY2Vzc29yLmdldENvbXBvbmVudChpZCk7CisJCQlpZiAoZXZlbnRzID09IG51bGwpIHsKKwkJCQlsb2dnZXIudHJhY2UoIm5vdCBmb3VuZCBjb21wb25lbnQgZm9yIGlkIHt9IiwgaWQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCk7CisJCQl9CisKKwkJCUNvbXBvbmVudENhY2hlRGF0YSBjb21wb25lbnRDYWNoZURhdGEgPSBldmVudHMub25lKCk7CisJCQlpZiAoY29tcG9uZW50Q2FjaGVEYXRhICE9IG51bGwpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkNvbXBvbmVudCB3aXRoIGlkIHt9IHdhcyBmb3VuZC4gaXNEaXJ0eT17fS4iLCBjb21wb25lbnRDYWNoZURhdGEuZ2V0SWQoKSwKKwkJCQkJCWNvbXBvbmVudENhY2hlRGF0YS5nZXRJc0RpcnR5KCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudENhY2hlRGF0YSk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJHZXRDb21wb25lbnRGcm9tQ2FjaGUiKTsKKworCQkJbG9nZ2VyLnRyYWNlKCJGYWlsZWQgdG8gZ2V0IGNvbXBvbmVudCBmcm9tIGNhY2hlIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCX0KKworCXB1YmxpYyBDYXNzYW5kcmFPcGVyYXRpb25TdGF0dXMgc2F2ZUNvbXBvbmVudChDb21wb25lbnRDYWNoZURhdGEgY29tcG9uZW50Q2FjaGVEYXRhKSB7CisJCXJldHVybiBjbGllbnQuc2F2ZShjb21wb25lbnRDYWNoZURhdGEsIENvbXBvbmVudENhY2hlRGF0YS5jbGFzcywgbWFuYWdlcik7CisJfQorCisJLyoqCisJICogLS0tLS0tLS0tZm9yIHVzZSBpbiBKVW5pdCBvbmx5LS0tLS0tLS0tLS0tLS0tIHRoZSBtZXRob2QgZGVsZXRlcyBhbGwgdGhlCisJICogdGFibGVzIGluIHRoZSBhdWRpdCBrZXlzcGFjZQorCSAqIAorCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBmYWlsZWQgb3BlcmF0aW9uIG9yIG9rIGlmIGFsbCB0aGUgZGVsZXRlcworCSAqICAgICAgICAgd2VyZSBzdWNjZXNzZnVsCisJICovCisJLy8gcHVibGljIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cworCS8vIGRlbGV0ZUFsbFBhcnRpYWxDb21wb25lbnRzKENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtKSB7CisJLy8gbG9nZ2VyLmluZm8oImNsZWFuaW5nIGFsbCBwYXJ0aWFsIGNvbXBvbmVudHMgb2YgIiArIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkvLworCS8vIFN0cmluZyB0YWJsZU5hbWUgPSBnZXRUYWJsZU5hbWUoY29tcG9uZW50VHlwZUVudW0pOworCS8vIGlmICh0YWJsZU5hbWUgPT0gbnVsbCkgeworCS8vIEJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnZhbGlkSW5wdXRFcnJvcigiRGVsZXRlUGFydGlhbENvbXBvbmVudERhdGEiLAorCS8vICJpbnB1dCB0eXBlIG5vdCBmb3VuZCAiICsgY29tcG9uZW50VHlwZUVudW0sIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJLy8gcmV0dXJuIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQ7CisJLy8gfQorCS8vIFN0cmluZyBxdWVyeSA9ICJ0cnVuY2F0ZSAiICsgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5DT01QT05FTlRfS0VZU1BBQ0UgKworCS8vICIuIiArIHRhYmxlTmFtZTsKKwkvLyB0cnkgeworCS8vIHNlc3Npb24uZXhlY3V0ZShxdWVyeSk7CisJLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkvLyBsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjbGVhbiBwYXJ0aWFsIGNvbXBvbmVudHMiLCBlKTsKKwkvLyByZXR1cm4gQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJLy8gfQorCS8vIGxvZ2dlci5pbmZvKCJjbGVhbmluZyBhbGwgcGFydGlhbCBjb21wb25lbnRzIGZpbmlzaGVkIHN1Y2NzZXNmdWxseS4iKTsKKwkvLyByZXR1cm4gQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLk9LOworCS8vIH0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY2hlY2tzIGlmIHRoZSBnaXZlbiB0YWJsZSBpcyBlbXB0eSBpbiB0aGUgYXJ0aWZhY3Qga2V5c3BhY2UKKwkgKiAKKwkgKiBAcGFyYW0gdGFibGVOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGFibGUgd2Ugd2FudCB0byBjaGVjaworCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgaXMgZW1wdHkKKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cz4gaXNUYWJsZUVtcHR5KFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJcmV0dXJuIHN1cGVyLmlzVGFibGVFbXB0eSh0YWJsZU5hbWUpOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBpZFRvVGltZXN0YW1wTWFwCisJICogICAgICAgICAgICAtIGxpc3Qgb2YgY29tcG9uZW50cyB1bmlxdWUgaWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50Q2FjaGVEYXRhPiwgU2V0PFN0cmluZz4+LCBBY3Rpb25TdGF0dXM+IGdldENvbXBvbmVudHMoCisJCQlNYXA8U3RyaW5nLCBMb25nPiBpZFRvVGltZXN0YW1wTWFwKSB7CisKKwkJTGlzdDxDb21wb25lbnRDYWNoZURhdGE+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudENhY2hlRGF0YT4oKTsKKwkJU2V0PFN0cmluZz4gbm90RmV0Y2hlZEZyb21DYWNoZSA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudENhY2hlRGF0YT4sIFNldDxTdHJpbmc+PiByZXN1bHQgPSBuZXcgSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudENhY2hlRGF0YT4sIFNldDxTdHJpbmc+PigKKwkJCQljb21wb25lbnRzLCBub3RGZXRjaGVkRnJvbUNhY2hlKTsKKworCQlpZiAoaWRUb1RpbWVzdGFtcE1hcCA9PSBudWxsIHx8IHRydWUgPT0gaWRUb1RpbWVzdGFtcE1hcC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQl9CisKKwkJdHJ5IHsKKworCQkJU2V0PFN0cmluZz4ga2V5U2V0ID0gaWRUb1RpbWVzdGFtcE1hcC5rZXlTZXQoKTsKKwkJCUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWlkcy5hZGRBbGwoa2V5U2V0KTsKKwkJCVJlc3VsdDxDb21wb25lbnRDYWNoZURhdGE+IGV2ZW50cyA9IGNvbXBvbmVudENhY2hlQWNjZXNzb3IuZ2V0Q29tcG9uZW50cyhpZHMpOworCQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7CisJCQkJbG9nZ2VyLnRyYWNlKCJub3QgZm91bmQgY29tcG9uZW50IGZvciBpZHMgbGlzdCBvZiBpbiBzaXplIHt9IiwgaWRzLnNpemUoKSk7CisJCQkJbm90RmV0Y2hlZEZyb21DYWNoZS5hZGRBbGwoaWRUb1RpbWVzdGFtcE1hcC5rZXlTZXQoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQl9CisJCQlldmVudHMuYWxsKCkuZm9yRWFjaChldmVudCAtPiB7CisJCQkJbG9uZyB0aW1lRnJvbUNhY2hlID0gZXZlbnQuZ2V0TW9kaWZpY2F0aW9uVGltZSgpLmdldFRpbWUoKTsKKwkJCQlsb25nIHRpbWVSZXF1ZXN0ZWQgPSBpZFRvVGltZXN0YW1wTWFwLmdldChldmVudC5nZXRJZCgpKTsKKwkJCQlpZiAodGltZUZyb21DYWNoZSA9PSB0aW1lUmVxdWVzdGVkKSB7CisJCQkJCWxvZ2dlci50cmFjZSgiRmV0Y2ggY29tcG9uZW50IHVpZCA9IHt9IGZyb20gY2FjaGUiLCBldmVudC5nZXRJZCgpKTsKKwkJCQkJY29tcG9uZW50cy5hZGQoZXZlbnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZ2dlci50cmFjZSgKKwkJCQkJCQkiRmV0Y2ggYW5kIGlnbm9yZSBjb21wb25lbnQgdWlkID0ge30gZnJvbSBjYWNoZS4gVGltZSByZXF1ZXN0ZWQgaXMge30gd2hpbGUgdGltZXN0YW1wIGluIGNhY2hlIGlzIHt9IiwKKwkJCQkJCQlldmVudC5nZXRJZCgpLCB0aW1lUmVxdWVzdGVkLCB0aW1lRnJvbUNhY2hlKTsKKwkJCQl9CisJCQl9KTsKKworCQkJbG9nZ2VyLmRlYnVnKCJOdW1iZXIgb2YgY29tcG9uZW50cyB0byBmZXRjaCB3YXMge30uIEFjdHVhbGx5LCB7fSBjb21wb25lbnRzIGZldGNoZWQiLCBpZHMuc2l6ZSgpLAorCQkJCQljb21wb25lbnRzLnNpemUoKSk7CisJCQlMaXN0PFN0cmluZz4gZm91bmRDb21wb25lbnRzID0gY29tcG9uZW50cy5zdHJlYW0oKS5tYXAocCAtPiBwLmdldElkKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkvLyBmZXRjaCBhbGwgaWRzIHdoaWNoIHdhcyBub3QgZm91bmQgaW4gY2FjaGUvZm91bmQgaW4gY2FjaGUgYW5kIG5vdAorCQkJLy8gdXBkYXRlZC4KKwkJCVNldDxTdHJpbmc+IG5vdEZvdW5kQ29tcG9uZW50cyA9IGlkVG9UaW1lc3RhbXBNYXAua2V5U2V0KCkuc3RyZWFtKCkKKwkJCQkJLmZpbHRlcihwIC0+IGZhbHNlID09IGZvdW5kQ29tcG9uZW50cy5jb250YWlucyhwKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCisJCQlub3RGZXRjaGVkRnJvbUNhY2hlLmFkZEFsbChub3RGb3VuZENvbXBvbmVudHMpOworCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJHZXRDb21wb25lbnRzRnJvbUNhY2hlIik7CisKKwkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGdldCBjb21wb25lbnRzIGZyb20gY2FjaGUiLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJfQorCisJcHVibGljIENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cyBkZWxldGVDb21wb25lbnQoU3RyaW5nIGlkKSB7CisJCXJldHVybiBjbGllbnQuZGVsZXRlKGlkLCBDb21wb25lbnRDYWNoZURhdGEuY2xhc3MsIG1hbmFnZXIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS9JVGFibGVEZXNjcmlwdGlvbi5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS9JVGFibGVEZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGMzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL0lUYWJsZURlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworCitwdWJsaWMgaW50ZXJmYWNlIElUYWJsZURlc2NyaXB0aW9uIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9GSUVMRCA9ICJ0aW1lc3RhbXAxIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FQkFTRURfVVVJRF9GSUVMRCA9ICJ0aW1lYmFzZWR1dWlkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GSUVMRCA9ICJpZCI7CisKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpOworCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gY2x1c3RlcmluZ0tleXMoKTsKKworCXB1YmxpYyBNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gZ2V0Q29sdW1uRGVzY3JpcHRpb24oKTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5c3BhY2UoKTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvU2RjU2NoZW1hQnVpbGRlci5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS9TZGNTY2hlbWFCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1NGEyNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvU2RjU2NoZW1hQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNDI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWE7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuKjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuc2NoZW1hYnVpbGRlci5BbHRlcjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuc2NoZW1hYnVpbGRlci5DcmVhdGU7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnNjaGVtYWJ1aWxkZXIuU2NoZW1hQnVpbGRlcjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuc2NoZW1hYnVpbGRlci5TY2hlbWFTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLio7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworcHVibGljIGNsYXNzIFNkY1NjaGVtYUJ1aWxkZXIgeworCisJLyoqCisJICogY3JlYXQga2V5IHNwYWNlIHN0YXRtZW50IGZvciBTaW1wbGVTdHJhdGVneQorCSAqLworCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ1JFQVRFX0tFWVNQQUNFX1NJTVBMRV9TVFJBVEVHWSA9ICJDUkVBVEUgS0VZU1BBQ0UgSUYgTk9UIEVYSVNUUyAlcyBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6J1NpbXBsZVN0cmF0ZWd5JywgJXN9OyI7CisJLyoqCisJICogY3JlYXQga2V5IHNwYWNlIHN0YXRtZW50IGZvciBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneQorCSAqLworCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ1JFQVRFX0tFWVNQQUNFX05FVFdPUktfVE9QT0xPR1lfU1RSQVRFR1kgPSAiQ1JFQVRFIEtFWVNQQUNFIElGIE5PVCBFWElTVFMgJXMgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOidOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICVzfTsiOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNkY1NjaGVtYUJ1aWxkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qKgorCSAqIHRoZSBtZXRob2QgY3JlYXRlcyBhbGwga2V5c3BhY2VzLCB0YWJsZXMgYW5kIGluZGV4ZXMgaW4gY2FzZSB0aGV5IGRvIG5vdAorCSAqIGFscmVhZHkgZXhpc3QuIHRoZSBtZXRob2QgY2FuIGJlIHJ1biBtdWx0aXBsZSB0aW1lcy4gdGhlIG1ldGhvZCB1c2VzIHRoZQorCSAqIGludGVybmFsIGVudW1zIGFuZCBleHRlcm5hbCBjb25maWd1cmF0aW9uIGZvciBpdHMgb3BlcmF0aW9uCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZVNjaGVtYSgpIHsKKwkJQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKKwkJU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWxvZy5pbmZvKCJjcmVhdGluZyBTY2hlbWEgZm9yIENhc3NhbmRyYS4iKTsKKwkJCWNsdXN0ZXIgPSBjcmVhdGVDbHVzdGVyKCk7CisJCQlpZiAoY2x1c3RlciA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJc2Vzc2lvbiA9IGNsdXN0ZXIuY29ubmVjdCgpOworCQkJTGlzdDxLZXlzcGFjZU1ldGFkYXRhPiBrZXlzcGFjZXNNZXRhZGF0ZUZyb21DYXNzYW5kcmEgPSBjbHVzdGVyLmdldE1ldGFkYXRhKCkuZ2V0S2V5c3BhY2VzKCk7CisJCQlpZiAoa2V5c3BhY2VzTWV0YWRhdGVGcm9tQ2Fzc2FuZHJhID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoImZpbGVkIHRvIHJldHJpdmUgYSBsaXN0IG9mIGtleXNwYWNlcyBmcm9tIGNhc3NuZHJhIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJbG9nLmRlYnVnKCJyZXRyaXZlZCBDYXNzbmRyYSBtZXRhZGF0YS4iKTsKKwkJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IGNhc3NuZHJhTWV0YWRhdGEgPSBwYXJzZUtleXNwYWNlTWV0YWRhdGEoCisJCQkJCWtleXNwYWNlc01ldGFkYXRlRnJvbUNhc3NhbmRyYSk7CisJCQlNYXA8U3RyaW5nLCBMaXN0PElUYWJsZURlc2NyaXB0aW9uPj4gc2NoZW1lRGF0YSA9IGdldFNjaGVtZURhdGEoKTsKKwkJCWxvZy5pbmZvKCJjcmVhdGluZyBLZXlzcGFjZXMuIik7CisJCQlmb3IgKFN0cmluZyBrZXlzcGFjZSA6IHNjaGVtZURhdGEua2V5U2V0KCkpIHsKKwkJCQlpZiAoIWNyZWF0ZUtleXNwYWNlKGtleXNwYWNlLCBjYXNzbmRyYU1ldGFkYXRhLCBzZXNzaW9uKSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4ga2V5c3BhY2VNZXRhZGF0ZSA9IGNhc3NuZHJhTWV0YWRhdGEuZ2V0KGtleXNwYWNlKTsKKwkJCQljcmVhdGVUYWJsZXMoc2NoZW1lRGF0YS5nZXQoa2V5c3BhY2UpLCBrZXlzcGFjZU1ldGFkYXRlLCBzZXNzaW9uKTsKKworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuaW5mbygiY3JlYXRlU2NoZW1hIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbi4iLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKKwkJCQlzZXNzaW9uLmNsb3NlKCk7CisJCQl9CisJCQlpZiAoY2x1c3RlciAhPSBudWxsKSB7CisJCQkJY2x1c3Rlci5jbG9zZSgpOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZVNjaGVtYSgpIHsKKwkJQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKKwkJU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWxvZy5pbmZvKCJkZWxldGUgRGF0YSBmcm9tIENhc3NhbmRyYS4iKTsKKwkJCWNsdXN0ZXIgPSBjcmVhdGVDbHVzdGVyKCk7CisJCQlpZiAoY2x1c3RlciA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJc2Vzc2lvbiA9IGNsdXN0ZXIuY29ubmVjdCgpOworCQkJTGlzdDxLZXlzcGFjZU1ldGFkYXRhPiBrZXlzcGFjZXNNZXRhZGF0ZUZyb21DYXNzYW5kcmEgPSBjbHVzdGVyLmdldE1ldGFkYXRhKCkuZ2V0S2V5c3BhY2VzKCk7CisJCQlpZiAoa2V5c3BhY2VzTWV0YWRhdGVGcm9tQ2Fzc2FuZHJhID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoImZpbGVkIHRvIHJldHJpdmUgYSBsaXN0IG9mIGtleXNwYWNlcyBmcm9tIGNhc3NuZHJhIik7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJbG9nLmRlYnVnKCJyZXRyaXZlZCBDYXNzbmRyYSBtZXRhZGF0YS4iKTsKKwkJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IGNhc3NuZHJhTWV0YWRhdGEgPSBwYXJzZUtleXNwYWNlTWV0YWRhdGEoCisJCQkJCWtleXNwYWNlc01ldGFkYXRlRnJvbUNhc3NhbmRyYSk7CisJCQljYXNzbmRyYU1ldGFkYXRhLmZvckVhY2goKGssIHYpIC0+IHsKKwkJCQlpZiAoQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5USVRBTl9LRVlTUEFDRS5lcXVhbHMoaykpIHsKKworCQkJCQkvLyBzZXNzaW9uLmV4ZWN1dGUoIiIpCisJCQkJfSBlbHNlIGlmIChBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFSVElGQUNUX0tFWVNQQUNFLmVxdWFscyhrKSkgeworCisJCQkJfSBlbHNlIGlmIChBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFLmVxdWFscyhrKSkgeworCisJCQkJfQorCQkJfSk7CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihjYXNzbmRyYU1ldGFkYXRhKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmluZm8oImRlbGV0ZVNjaGVtYSBmYWlsZWQgd2l0aCBleGNlcHRpb24uIiwgZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisJCQkJc2Vzc2lvbi5jbG9zZSgpOworCQkJfQorCQkJaWYgKGNsdXN0ZXIgIT0gbnVsbCkgeworCQkJCWNsdXN0ZXIuY2xvc2UoKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY3JlYXRlcyB0aGUgY2x1c3RlciBvYmplY3QgdXNpbmcgdGhlIHN1cHBsaWVkIGNhc3NhbmRyYSBub2RlcworCSAqIGluIHRoZSBjb25maWd1cmF0aW9uCisJICogCisJICogQHJldHVybiBjbHVzdGVyIG9iamVjdCBvdXIgbnVsbCBpbiBjYXNlIG9mIGFuIGludmFsaWQgY29uZmlndXJhdGlvbgorCSAqLworCXByaXZhdGUgc3RhdGljIENsdXN0ZXIgY3JlYXRlQ2x1c3RlcigpIHsKKwkJTGlzdDxTdHJpbmc+IG5vZGVzID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2Fzc2FuZHJhQ29uZmlnKCkKKwkJCQkuZ2V0Q2Fzc2FuZHJhSG9zdHMoKTsKKwkJaWYgKG5vZGVzID09IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJubyBub2RlcyB3ZXJlIHN1cHBsaWVkIGluIGNvbmZpZ3VyYXRpb24uIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlsb2cuaW5mbygiY29ubmVjdGluZyB0byBub2RlOnt9LiIsIG5vZGVzKTsKKwkJQ2x1c3Rlci5CdWlsZGVyIGNsdXN0ZXJCdWlsZGVyID0gQ2x1c3Rlci5idWlsZGVyKCk7CisJCW5vZGVzLmZvckVhY2goaG9zdCAtPiBjbHVzdGVyQnVpbGRlci5hZGRDb250YWN0UG9pbnQoaG9zdCkpOworCisJCWNsdXN0ZXJCdWlsZGVyLndpdGhNYXhTY2hlbWFBZ3JlZW1lbnRXYWl0U2Vjb25kcyg2MCk7CisKKwkJYm9vbGVhbiBhdXRoZW50aWNhdGUgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDYXNzYW5kcmFDb25maWcoKQorCQkJCS5pc0F1dGhlbnRpY2F0ZSgpOworCQlpZiAoYXV0aGVudGljYXRlKSB7CisJCQlTdHJpbmcgdXNlcm5hbWUgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDYXNzYW5kcmFDb25maWcoKQorCQkJCQkuZ2V0VXNlcm5hbWUoKTsKKwkJCVN0cmluZyBwYXNzd29yZCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldENhc3NhbmRyYUNvbmZpZygpCisJCQkJCS5nZXRQYXNzd29yZCgpOworCQkJaWYgKHVzZXJuYW1lID09IG51bGwgfHwgcGFzc3dvcmQgPT0gbnVsbCkgeworCQkJCWxvZy5pbmZvKCJhdXRoZW50aWNhdGlvbiBpcyBlbmFibGVkIGJ1dCB1c2VybmFtZSBvciBwYXNzd29yZCB3ZXJlIG5vdCBzdXBwbGllZC4iKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWNsdXN0ZXJCdWlsZGVyLndpdGhDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpOworCQl9CisJCWJvb2xlYW4gc3NsID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2Fzc2FuZHJhQ29uZmlnKCkuaXNTc2woKTsKKwkJaWYgKHNzbCkgeworCQkJU3RyaW5nIHRydXN0c3RvcmVQYXRoID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkJLmdldENhc3NhbmRyYUNvbmZpZygpLmdldFRydXN0c3RvcmVQYXRoKCk7CisJCQlTdHJpbmcgdHJ1c3RzdG9yZVBhc3N3b3JkID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkJLmdldENhc3NhbmRyYUNvbmZpZygpLmdldFRydXN0c3RvcmVQYXNzd29yZCgpOworCQkJaWYgKHRydXN0c3RvcmVQYXRoID09IG51bGwgfHwgdHJ1c3RzdG9yZVBhc3N3b3JkID09IG51bGwpIHsKKwkJCQlsb2cuaW5mbygic3NsIGlzIGVuYWJsZWQgYnV0IHRydXN0c3RvcmVQYXRoIG9yIHRydXN0c3RvcmVQYXNzd29yZCB3ZXJlIG5vdCBzdXBwbGllZC4iKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgdHJ1c3RzdG9yZVBhdGgpOworCQkJU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIsIHRydXN0c3RvcmVQYXNzd29yZCk7CisJCQljbHVzdGVyQnVpbGRlci53aXRoU1NMKCk7CisJCX0KKwkJcmV0dXJuIGNsdXN0ZXJCdWlsZGVyLmJ1aWxkKCk7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBwcmNlc3MgdGhlIG1ldGFkYXRhIHJldHJpZXZlZCBmcm9tIHRoZSBjYXNzYW5kcmEgZm9yIHRoZQorCSAqIGNyZWF0aW9uIG9mIGEgbWFwIGNvbnRpbmcgdGhlIG5hbWVzIG9mIGtleXNwYWNlcyB0YWJscyBhbmQgaW5kZXhlcworCSAqIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgY2Fzc2FuZHJhIGtleXNwYWNlbmFtZSAtPiB0YWJsZW5hbWUgLT4gbGlzdCBvZgorCSAqIGluZGV4ZXMgaW5mbworCSAqIAorCSAqIEBwYXJhbSBrZXlzcGFjZXNNZXRhZGF0YQorCSAqICAgICAgICAgICAgY2Fzc25kcmEgbW1ldGFkYXRhCisJICogQHJldHVybiBhIG1hcCBvZiBtYXBzIG9mIGxpc3RzIGhvbGRpbmcgcGFyc2VkIGluZm8KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBwYXJzZUtleXNwYWNlTWV0YWRhdGEoCisJCQlMaXN0PEtleXNwYWNlTWV0YWRhdGE+IGtleXNwYWNlc01ldGFkYXRhKSB7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IGNhc3NuZHJhTWV0YWRhdGEgPSBrZXlzcGFjZXNNZXRhZGF0YS5zdHJlYW0oKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoa2V5c3BhY2VNZXRhZGF0YSAtPiBrZXlzcGFjZU1ldGFkYXRhLmdldE5hbWUoKSwKKwkJCQkJCWtleXNwYWNlTWV0YWRhdGEgLT4ga2V5c3BhY2VNZXRhZGF0YS5nZXRUYWJsZXMoKS5zdHJlYW0oKQorCQkJCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKHRhYmxlTWV0YWRhdGEgLT4gdGFibGVNZXRhZGF0YS5nZXROYW1lKCksCisJCQkJCQkJCQkJdGFibGVNZXRhZGF0YSAtPiB0YWJsZU1ldGFkYXRhLmdldEluZGV4ZXMoKS5zdHJlYW0oKQorCQkJCQkJCQkJCQkJLm1hcChpbmRleE1ldGFkYXRhIC0+IGluZGV4TWV0YWRhdGEuZ2V0TmFtZSgpKQorCQkJCQkJCQkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpKSkpOworCQlyZXR1cm4gY2Fzc25kcmFNZXRhZGF0YTsKKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIGJ1aWxkcyBhbiBpbmRleCBuYW1lIGFjY29yZGluZyB0byBhIGRlZmluZWQgbG9naWMKKwkgKiA8dGFibGU+CisJICogXzxjb2x1bW4+X2lkeAorCSAqIAorCSAqIEBwYXJhbSB0YWJsZQorCSAqICAgICAgICAgICAgdGFibGUgbmFtZQorCSAqIEBwYXJhbSBjb2x1bW4KKwkgKiAgICAgICAgICAgIGNvbHVtbiBuYW1lCisJICogQHJldHVybiBzdHJpbmcgbmFtZSBvZiB0aGUgaW5kZXgKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlSW5kZXhOYW1lKFN0cmluZyB0YWJsZSwgU3RyaW5nIGNvbHVtbikgeworCQlyZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQodGFibGUpLmFwcGVuZCgiXyIpLmFwcGVuZChjb2x1bW4pLmFwcGVuZCgiX2lkeCIpLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjcmVhdHMgYWxsIHRoZSB0YWJsZXMgYW5kIGluZGV4ZXMgdGhldCBkbyBub3QgYWxyZWFkeSBleGlzdAorCSAqCisJICogQHBhcmFtIGlUYWJsZURlc2NyaXB0aW9ucworCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHRhYmxlIGRlc2NyaXB0aW9uIHdlIHdhbnQgdG8gY3JlYXRlCisJICogQHBhcmFtIGtleXNwYWNlTWV0YWRhdGUKKwkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHRhYmxlcyB0aGF0IGV4aXN0IGluIHRoZSBjYXNzYW5kcmEgdW5kZXIgdGhpcworCSAqICAgICAgICAgICAga2V5c3BhY2UKKwkgKiBAcGFyYW0gc2Vzc2lvbgorCSAqICAgICAgICAgICAgdGhlIHNlc3Npb24gb2JqZWN0IHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIHF1ZXJ5LgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlVGFibGVzKExpc3Q8SVRhYmxlRGVzY3JpcHRpb24+IGlUYWJsZURlc2NyaXB0aW9ucywKKwkJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4ga2V5c3BhY2VNZXRhZGF0ZSwgU2Vzc2lvbiBzZXNzaW9uKSB7CisKKwkJZm9yIChJVGFibGVEZXNjcmlwdGlvbiB0YWJsZURlc2NyaXB0aW9uIDogaVRhYmxlRGVzY3JpcHRpb25zKSB7CisJCQlTdHJpbmcgdGFibGVOYW1lID0gdGFibGVEZXNjcmlwdGlvbi5nZXRUYWJsZU5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQkJTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGNvbHVtbkRlc2NyaXB0aW9uID0gdGFibGVEZXNjcmlwdGlvbi5nZXRDb2x1bW5EZXNjcmlwdGlvbigpOworCQkJbG9nLmluZm8oImNyZWF0aW5nIHRhYmxlczp7fS4iLCB0YWJsZU5hbWUpOworCQkJaWYgKGtleXNwYWNlTWV0YWRhdGUgPT0gbnVsbCB8fCAha2V5c3BhY2VNZXRhZGF0ZS5rZXlTZXQoKS5jb250YWlucyh0YWJsZU5hbWUpKSB7CisJCQkJQ3JlYXRlIGNyZWF0ZSA9IFNjaGVtYUJ1aWxkZXIuY3JlYXRlVGFibGUodGFibGVEZXNjcmlwdGlvbi5nZXRLZXlzcGFjZSgpLAorCQkJCQkJdGFibGVEZXNjcmlwdGlvbi5nZXRUYWJsZU5hbWUoKSk7CisJCQkJZm9yIChJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+IGtleSA6IHRhYmxlRGVzY3JpcHRpb24ucHJpbWFyeUtleXMoKSkgeworCQkJCQljcmVhdGUuYWRkUGFydGl0aW9uS2V5KGtleS5nZXRMZWZ0KCksIGtleS5nZXRSaWdodCgpKTsKKwkJCQl9CisJCQkJaWYgKHRhYmxlRGVzY3JpcHRpb24uY2x1c3RlcmluZ0tleXMoKSAhPSBudWxsKSB7CisJCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPiBrZXkgOiB0YWJsZURlc2NyaXB0aW9uLmNsdXN0ZXJpbmdLZXlzKCkpIHsKKwkJCQkJCWNyZWF0ZS5hZGRDbHVzdGVyaW5nQ29sdW1uKGtleS5nZXRMZWZ0KCksIGtleS5nZXRSaWdodCgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWZvciAoU3RyaW5nIGNvbHVtbk5hbWUgOiBjb2x1bW5EZXNjcmlwdGlvbi5rZXlTZXQoKSkgeworCQkJCQljcmVhdGUuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGNvbHVtbkRlc2NyaXB0aW9uLmdldChjb2x1bW5OYW1lKS5nZXRMZWZ0KCkpOworCQkJCX0KKwkJCQlsb2cudHJhY2UoImV4YWN1dGluZyA6e30iLCBjcmVhdGUudG9TdHJpbmcoKSk7CisJCQkJUmVzdWx0U2V0IHJlc3VsdCA9IHNlc3Npb24uZXhlY3V0ZShjcmVhdGUpOworCQkJCWxvZy5pbmZvKCJ0YWJsZTp7fSBjcmVhdGVkIHN1Y2NzZXNmdWxseS4iLCB0YWJsZU5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuaW5mbygidGFibGU6e30gYWxyZWFkeSBleGlzdHMgc2tpcGluZy4iLCB0YWJsZU5hbWUpOworCQkJfQorCQkJTGlzdDxTdHJpbmc+IGluZGV4TmFtZXMgPSAoa2V5c3BhY2VNZXRhZGF0ZSAhPSBudWxsID8ga2V5c3BhY2VNZXRhZGF0ZS5nZXQodGFibGVOYW1lKSA6IG5ldyBBcnJheUxpc3Q8PigpKTsKKwkJCWxvZy5pbmZvKCJ0YWJsZTp7fSBjcmVhdGluZyBpbmRleGVzLiIsIHRhYmxlTmFtZSk7CisJCQlmb3IgKFN0cmluZyBjb2x1bW5OYW1lIDogY29sdW1uRGVzY3JpcHRpb24ua2V5U2V0KCkpIHsKKwkJCQlTdHJpbmcgaW5kZXhOYW1lID0gY3JlYXRlSW5kZXhOYW1lKHRhYmxlTmFtZSwgY29sdW1uTmFtZSkudG9Mb3dlckNhc2UoKTsKKwkJCQlpZiAoY29sdW1uRGVzY3JpcHRpb24uZ2V0KGNvbHVtbk5hbWUpLmdldFJpZ2h0KCkpIHsKKwkJCQkJaWYgKCFpbmRleE5hbWVzLmNvbnRhaW5zKGluZGV4TmFtZSkpIHsKKwkJCQkJCVNjaGVtYVN0YXRlbWVudCBjcmVhdEluZGV4ID0gU2NoZW1hQnVpbGRlci5jcmVhdGVJbmRleChpbmRleE5hbWUpCisJCQkJCQkJCS5vblRhYmxlKHRhYmxlRGVzY3JpcHRpb24uZ2V0S2V5c3BhY2UoKSwgdGFibGVOYW1lKS5hbmRDb2x1bW4oY29sdW1uTmFtZSk7CisJCQkJCQlsb2cuaW5mbygiZXhlY3V0aW5nIDp7fSIsIGNyZWF0SW5kZXgudG9TdHJpbmcoKSk7CisJCQkJCQlzZXNzaW9uLmV4ZWN1dGUoY3JlYXRJbmRleCk7CisJCQkJCQlsb2cuaW5mbygiaW5kZXg6e30gY3JlYXRlZCBzdWNjc2VzZnVsbHkuIiwgaW5kZXhOYW1lKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxvZy5pbmZvKCJpbmRleDp7fSBhbHJlYWR5IGV4aXN0cyBza2lwaW5nLiIsIGluZGV4TmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJfQorCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY3JlYXRlIHRoZSBrZXlzcGFjZSBpbiBjYXNlIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RzIHRoZQorCSAqIG1ldGhvZCB1c2VzIGNvbmZpZ3VydGlvbiB0byBzZWxlY3QgdGhlIG5lZWRlZCByZXBsaWNhdGlvbiBzdHJhdGVneQorCSAqIAorCSAqIEBwYXJhbSBrZXlzcGFjZQorCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUga2V5c3BhY2Ugd2Ugd2FudCB0byBjcmVhdGUKKwkgKiBAcGFyYW0gY2Fzc25kcmFNZXRhZGF0YQorCSAqICAgICAgICAgICAgY2Fzc25kcmEgbWV0YWRhdGEKKwkgKiBAcGFyYW0gc2Vzc2lvbgorCSAqICAgICAgICAgICAgdGhlIHNlc3Npb24gb2JqZWN0IHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIHF1ZXJ5LgorCSAqIEByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNyZWF0ZUtleXNwYWNlKFN0cmluZyBrZXlzcGFjZSwgTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gY2Fzc25kcmFNZXRhZGF0YSwKKwkJCVNlc3Npb24gc2Vzc2lvbikgeworCQlMaXN0PENvbmZpZ3VyYXRpb24uQ2Fzc2FuZHJDb25maWcuS2V5c3BhY2VDb25maWc+IGtleXNwYWNlQ29uZmlnTGlzdCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyCisJCQkJLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldENhc3NhbmRyYUNvbmZpZygpLmdldEtleVNwYWNlcygpOworCQlsb2cuaW5mbygiY3JlYXRpbmcga2V5c3BhY2U6e30uIiwga2V5c3BhY2UpOworCQlpZiAoIWNhc3NuZHJhTWV0YWRhdGEua2V5U2V0KCkuY29udGFpbnMoa2V5c3BhY2UpKSB7CisJCQlPcHRpb25hbDxDb25maWd1cmF0aW9uLkNhc3NhbmRyQ29uZmlnLktleXNwYWNlQ29uZmlnPiBrZXlzcGFjZUNvbmZpZyA9IGtleXNwYWNlQ29uZmlnTGlzdC5zdHJlYW0oKQorCQkJCQkuZmlsdGVyKGtleXNwYWNlSW5mbyAtPiBrZXlzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKGtleXNwYWNlSW5mby5nZXROYW1lKCkpKS5maW5kRmlyc3QoKTsKKwkJCWlmIChrZXlzcGFjZUNvbmZpZy5pc1ByZXNlbnQoKSkgeworCQkJCUNvbmZpZ3VyYXRpb24uQ2Fzc2FuZHJDb25maWcuS2V5c3BhY2VDb25maWcga2V5c3BhY2VJbmZvID0ga2V5c3BhY2VDb25maWcuZ2V0KCk7CisJCQkJU3RyaW5nIGNyZWF0ZUtleXNwYWNlUXVlcnkgPSBjcmVhdGVLZXlzcGFjZVF1ZXJleVN0cmluZyhrZXlzcGFjZSwga2V5c3BhY2VJbmZvKTsKKwkJCQlpZiAoY3JlYXRlS2V5c3BhY2VRdWVyeSAhPSBudWxsKSB7CisJCQkJCWxvZy50cmFjZSgiZXhhY3V0aW5nOiB7fSIsIGNyZWF0ZUtleXNwYWNlUXVlcnkpOworCQkJCQlzZXNzaW9uLmV4ZWN1dGUoY3JlYXRlS2V5c3BhY2VRdWVyeSk7CisJCQkJCWxvZy5pbmZvKCJrZXlzcGFjZTp7fSBjcmVhdGVkLiIsIGtleXNwYWNlKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbG9nLmluZm8oCisJCQkJCQkia2V5c3BhY2U6e30gbm90IHByZXNlbnQgaW4gY29uZmlndXJhdGlvbiwgbm8gaW5mbyBvbiByZXBsaWNhdGlvbnMgaXMgYXZhaWxhYmxlLiBvcGVyYXRpb24gZmFpbGVkLiIsCisJCQkJCQlrZXlzcGFjZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nLmluZm8oImtleXNwYWNlOnt9IGFscmVhZHkgZXhpc3RzIHNraXBwaW5nLiIsIGtleXNwYWNlKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCByZXRyaWVzIHRoZSBzY2hlbSBpbmZvIGZyb20gdGhlIGVudW1zIGRlc2NyaWJpbmcgdGhlIHRhYmxlcworCSAqIAorCSAqIEByZXR1cm4gYSBtYXAgb2Yga2V5c3BhY2VzIHRvIHRoZXJlIHRhYmxlIGluZm8KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PElUYWJsZURlc2NyaXB0aW9uPj4gZ2V0U2NoZW1lRGF0YSgpIHsKKwkJTWFwPFN0cmluZywgTGlzdDxJVGFibGVEZXNjcmlwdGlvbj4+IHRhYmxlc0J5S2V5c3BhY2UgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SVRhYmxlRGVzY3JpcHRpb24+PigpOworCQlUYWJsZVtdIHRhYmxlcyA9IFRhYmxlLnZhbHVlcygpOworCQlmb3IgKFRhYmxlIHRhYmxlIDogdGFibGVzKSB7CisJCQlTdHJpbmcga2V5c3BhY2UgPSB0YWJsZS5nZXRUYWJsZURlc2NyaXB0aW9uKCkuZ2V0S2V5c3BhY2UoKS50b0xvd2VyQ2FzZSgpOworCQkJTGlzdDxJVGFibGVEZXNjcmlwdGlvbj4gbGlzdCA9IHRhYmxlc0J5S2V5c3BhY2UuZ2V0KGtleXNwYWNlKTsKKwkJCWlmIChsaXN0ID09IG51bGwpIHsKKwkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQl9CisJCQlsaXN0LmFkZCh0YWJsZS5nZXRUYWJsZURlc2NyaXB0aW9uKCkpOworCQkJdGFibGVzQnlLZXlzcGFjZS5wdXQoa2V5c3BhY2UsIGxpc3QpOworCQl9CisJCXJldHVybiB0YWJsZXNCeUtleXNwYWNlOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2VkIGNyZWF0ZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGdpdmVuIGtleXNwYWNlIHRoZSBtZXRob2VkCisJICogdmFsaWRlcyB0aGUgZ2l2ZW4gZGF0YSBhY2NvcmRpbmcgdGhlIHRoZSByZXF1aXJtZW50cyBvZiB0aGUgcmVwbGljYXRpb24KKwkgKiBzdHJhdGVneSBTaW1wbGVTdHJhdGVneTogIkNSRUFURSBLRVlTUEFDRSBJRiBOT1QgRVhJU1RTCisJICogPGtleXNwYWNlTmFtZT48L2tleXNwYWNlTmFtZT4gV0lUSCByZXBsaWNhdGlvbiA9CisJICogeydjbGFzcyc6J1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6Mn07IiBTaW1wbGVTdHJhdGVneToKKwkgKiAiQ1JFQVRFIEtFWVNQQUNFIElGIE5PVCBFWElTVFMgPGtleXNwYWNlTmFtZT48L2tleXNwYWNlTmFtZT4gV0lUSAorCSAqIHJlcGxpY2F0aW9uID0geydjbGFzcyc6J05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RjMScgOiAyICxkYzIgOiAyIH07IgorCSAqIAorCSAqIEBwYXJhbSBrZXlzcGFjZQorCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUga2V5c3BhY2Ugd2Ugd2FudCB0byBjcmVhdGUKKwkgKiBAcGFyYW0ga2V5c3BhY2VJbmZvCisJICogICAgICAgICAgICBjb25maWd1cmF0aW9uIGluZm8gcmVndXJkaW5nIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUga2V5c3BhY2UKKwkgKiBAcmV0dXJuIGEgcXVlcmV5IHN0cmluZyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBrZXlzcGFjZQorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVLZXlzcGFjZVF1ZXJleVN0cmluZyhTdHJpbmcga2V5c3BhY2UsCisJCQlDb25maWd1cmF0aW9uLkNhc3NhbmRyQ29uZmlnLktleXNwYWNlQ29uZmlnIGtleXNwYWNlSW5mbykgeworCQlTdHJpbmcgcXVlcnkgPSBudWxsOworCQlpZiAoUmVwbGljYXRpb25TdHJhdGVneS5ORVRXT1JLX1RPUE9MT0dZX1NUUkFURUdZLmdldE5hbWUoKQorCQkJCS5lcXVhbHNJZ25vcmVDYXNlKGtleXNwYWNlSW5mby5nZXRSZXBsaWNhdGlvblN0cmF0ZWd5KCkpKSB7CisJCQlMaXN0PFN0cmluZz4gZGNMaXN0ID0ga2V5c3BhY2VJbmZvLmdldFJlcGxpY2F0aW9uSW5mbygpOworCQkJaWYgKGRjTGlzdC5zaXplKCkgJSAyICE9IDApIHsKKwkJCQlsb2cuZXJyb3IoInRoZSBzdXBwbGllZCByZXBsaWNhdGlvbiBpbmZvIGlzIGluIHZhbGlkIGV4cGVjdGVkIGRjMSwyLGRjMiwyIGV0YyByZWNlaXZlZDp7fSIsIGRjTGlzdCk7CisJCQkJcmV0dXJuIHF1ZXJ5OworCQkJfQorCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGRjTGlzdC5zaXplKCk7IGkgPSBpICsgMikgeworCQkJCXNiLmFwcGVuZCgiJyIpLmFwcGVuZChkY0xpc3QuZ2V0KGkpKS5hcHBlbmQoIiciKS5hcHBlbmQoIiA6ICIpLmFwcGVuZChkY0xpc3QuZ2V0KGkgKyAxKSk7CisJCQkJaWYgKGkgKyAyIDwgZGNMaXN0LnNpemUoKSkgeworCQkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCQl9CisJCQl9CisKKwkJCXF1ZXJ5ID0gU3RyaW5nLmZvcm1hdChDUkVBVEVfS0VZU1BBQ0VfTkVUV09SS19UT1BPTE9HWV9TVFJBVEVHWSwga2V5c3BhY2UsIHNiLnRvU3RyaW5nKCkpOworCQl9IGVsc2UgaWYgKFJlcGxpY2F0aW9uU3RyYXRlZ3kuU0lNUExFX1NUUkFURUdZLmdldE5hbWUoKQorCQkJCS5lcXVhbHNJZ25vcmVDYXNlKGtleXNwYWNlSW5mby5nZXRSZXBsaWNhdGlvblN0cmF0ZWd5KCkpKSB7CisJCQlMaXN0PFN0cmluZz4gZGNMaXN0ID0ga2V5c3BhY2VJbmZvLmdldFJlcGxpY2F0aW9uSW5mbygpOworCQkJaWYgKGRjTGlzdC5zaXplKCkgIT0gMSkgeworCQkJCWxvZy5lcnJvcigidGhlIHN1cHBsaWVkIHJlcGxpY2F0aW9uIGluZm8gaXMgaW4gdmFsaWQgZXhwZWN0ZWQgPG51bWJlcj4gZXRjIHJlY2VpdmVkOnt9IiwgZGNMaXN0KTsKKwkJCQlyZXR1cm4gcXVlcnk7CisJCQl9CisJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCXNiLmFwcGVuZCgiJ3JlcGxpY2F0aW9uX2ZhY3RvciciKS5hcHBlbmQoIiA6ICIpLmFwcGVuZChkY0xpc3QuZ2V0KDApKTsKKwkJCXF1ZXJ5ID0gU3RyaW5nLmZvcm1hdChDUkVBVEVfS0VZU1BBQ0VfU0lNUExFX1NUUkFURUdZLCBrZXlzcGFjZSwgc2IudG9TdHJpbmcoKSk7CisKKwkJfSBlbHNlIHsKKwkJCWxvZy5lcnJvcigidGhlIHN1cGxpZWQgcmVwbGljYXRpb24gU3RyYXRlZ3kgIGlzIGluIHZhbGlkZSBleHBhY3RlZCB7fS97fSBldGMgcmVjaXZlZDp7fSIsCisJCQkJCVJlcGxpY2F0aW9uU3RyYXRlZ3kuTkVUV09SS19UT1BPTE9HWV9TVFJBVEVHWS5nZXROYW1lKCksCisJCQkJCVJlcGxpY2F0aW9uU3RyYXRlZ3kuU0lNUExFX1NUUkFURUdZLmdldE5hbWUoKSwga2V5c3BhY2VJbmZvLmdldFJlcGxpY2F0aW9uU3RyYXRlZ3koKSk7CisJCX0KKwkJcmV0dXJuIHF1ZXJ5OworCX0KKworCXB1YmxpYyBlbnVtIFJlcGxpY2F0aW9uU3RyYXRlZ3kgeworCQlORVRXT1JLX1RPUE9MT0dZX1NUUkFURUdZKCJOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSIpLCBTSU1QTEVfU1RSQVRFR1koIlNpbXBsZVN0cmF0ZWd5Iik7CisKKwkJcHVibGljIFN0cmluZyBuYW1lOworCisJCXByaXZhdGUgUmVwbGljYXRpb25TdHJhdGVneShTdHJpbmcgbmFtZSkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlNDBhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGUuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWE7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXMuQXJ0aWZhY3RUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5BdXRoRXZlbnRUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5DYXRlZ29yeUV2ZW50VGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXMuQ29tcG9uZW50Q2FjaGVUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5Db25zdW1lckV2ZW50VGFibGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5EaXN0cmliRGVwbG95RXZlbnRUYWJsZURlc2M7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLkRpc3RyaWJEb3dubG9hZEV2ZW50VGFibGVEZXNjOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5EaXN0cmliRW5naW5lRXZlbnRUYWJsZURlc2M7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLkRpc3RyaWJOb3RpZkV2ZW50VGFibGVEZXNjOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5EaXN0cmliU3RhdHVzRXZlbnRUYWJsZURlc2M7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLkV4dGVybmFsQXBpRXZlbnRUYWJsZURlc2M7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLkdldENhdEhpZXJFdmVudFRhYmxlRGVzYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXMuR2V0VWViQ2x1c3RlckV2ZW50VGFibGVEZXNjOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5HZXRVc2Vyc0xpc3RFdmVudFRhYmxlRGVzYzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXMuUmVzQWRtaW5FdmVudFRhYmxlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLlVzZXJBY2Nlc3NFdmVudFRhYmxlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLlVzZXJBZG1pbkV2ZW50VGFibGVEZXNjcmlwdGlvbjsKKworcHVibGljIGVudW0gVGFibGUgeworCisJQVJUSUZBQ1QobmV3IEFydGlmYWN0VGFibGVEZXNjcmlwdGlvbigpKSwgCisJVVNFUl9BRE1JTl9FVkVOVChuZXcgVXNlckFkbWluRXZlbnRUYWJsZURlc2NyaXB0aW9uKCkpLCAKKwlVU0VSX0FDQ0VTU19FVkVOVChuZXcgVXNlckFjY2Vzc0V2ZW50VGFibGVEZXNjcmlwdGlvbigpKSwgCisJUkVTT1VSQ0VfQURNSU5fRVZFTlQobmV3IFJlc0FkbWluRXZlbnRUYWJsZURlc2NyaXB0aW9uKCkpLCAKKwlESVNUUklCVVRJT05fRE9XTkxPQURfRVZFTlQobmV3IERpc3RyaWJEb3dubG9hZEV2ZW50VGFibGVEZXNjKCkpLCAKKwlESVNUUklCVVRJT05fRU5HSU5FX0VWRU5UKG5ldyBEaXN0cmliRW5naW5lRXZlbnRUYWJsZURlc2MoKSksIAorCURJU1RSSUJVVElPTl9OT1RJRklDQVRJT05fRVZFTlQobmV3IERpc3RyaWJOb3RpZkV2ZW50VGFibGVEZXNjKCkpLCAKKwlESVNUUklCVVRJT05fU1RBVFVTX0VWRU5UKG5ldyBEaXN0cmliU3RhdHVzRXZlbnRUYWJsZURlc2MoKSksIAorCURJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlQobmV3IERpc3RyaWJEZXBsb3lFdmVudFRhYmxlRGVzYygpKSwgCisJRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVChuZXcgR2V0VWViQ2x1c3RlckV2ZW50VGFibGVEZXNjKCkpLAorCUFVVEhfRVZFTlQobmV3IEF1dGhFdmVudFRhYmxlRGVzY3JpcHRpb24oKSksIAorCUNPTlNVTUVSX0VWRU5UKG5ldyBDb25zdW1lckV2ZW50VGFibGVEZWZpbml0aW9uKCkpLCAKKwlDQVRFR09SWV9FVkVOVChuZXcgQ2F0ZWdvcnlFdmVudFRhYmxlRGVzY3JpcHRpb24oKSksIAorCUdFVF9VU0VSU19MSVNUX0VWRU5UKG5ldyBHZXRVc2Vyc0xpc3RFdmVudFRhYmxlRGVzYygpKSwgCisJR0VUX0NBVEVHT1JZX0hJRVJBUkNIWV9FVkVOVChuZXcgR2V0Q2F0SGllckV2ZW50VGFibGVEZXNjKCkpLCAKKwlFWFRFUk5BTF9BUElfRVZFTlQobmV3IEV4dGVybmFsQXBpRXZlbnRUYWJsZURlc2MoKSksCisJQ09NUE9ORU5UX0NBQ0hFKG5ldyBDb21wb25lbnRDYWNoZVRhYmxlRGVzY3JpcHRpb24oKSk7CisKKwlJVGFibGVEZXNjcmlwdGlvbiB0YWJsZURlc2NyaXB0aW9uOworCisJVGFibGUoSVRhYmxlRGVzY3JpcHRpb24gdGFibGVEZXNjcmlwdGlvbikgeworCQl0aGlzLnRhYmxlRGVzY3JpcHRpb24gPSB0YWJsZURlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBJVGFibGVEZXNjcmlwdGlvbiBnZXRUYWJsZURlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gdGFibGVEZXNjcmlwdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0FydGlmYWN0VGFibGVEZXNjcmlwdGlvbi5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvQXJ0aWZhY3RUYWJsZURlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyNmJkMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0FydGlmYWN0VGFibGVEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5JVGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RUYWJsZURlc2NyaXB0aW9uIGltcGxlbWVudHMgSVRhYmxlRGVzY3JpcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGtleXNwYWNlVHlwZSA9ICJhcnRpZmFjdCI7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KElEX0ZJRUxELCBEYXRhVHlwZS52YXJjaGFyKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBnZXRDb2x1bW5EZXNjcmlwdGlvbigpIHsKKwkJTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGNvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChBcnRpZmFjdEZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogQXJ0aWZhY3RGaWVsZHNEZXNjcmlwdGlvbi52YWx1ZXMoKSkgeworCQkJY29sdW1ucy5wdXQoZmllbGQuZ2V0TmFtZSgpLCBuZXcgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4oZmllbGQudHlwZSwgZmllbGQuaW5kZXhlZCkpOworCQl9CisKKwkJcmV0dXJuIGNvbHVtbnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRLZXlzcGFjZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVJUSUZBQ1RfS0VZU1BBQ0U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJCXJldHVybiAicmVzb3VyY2VzIjsKKwl9CisKKwllbnVtIEFydGlmYWN0RmllbGRzRGVzY3JpcHRpb24geworCQlEQVRBKCJkYXRhIiwgRGF0YVR5cGUuYmxvYigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlBcnRpZmFjdEZpZWxkc0Rlc2NyaXB0aW9uKFN0cmluZyBuYW1lLCBEYXRhVHlwZSB0eXBlLCBib29sZWFuIGluZGV4ZWQpIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQkJdGhpcy5pbmRleGVkID0gaW5kZXhlZDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisKKwkJcHVibGljIERhdGFUeXBlIGdldFR5cGUoKSB7CisJCQlyZXR1cm4gdHlwZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzSW5kZXhlZCgpIHsKKwkJCXJldHVybiBpbmRleGVkOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gY2x1c3RlcmluZ0tleXMoKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0F1dGhFdmVudFRhYmxlRGVzY3JpcHRpb24uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0F1dGhFdmVudFRhYmxlRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdiZTVkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvQXV0aEV2ZW50VGFibGVEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLklUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5Vc2VyQWRtaW5FdmVudFRhYmxlRGVzY3JpcHRpb24uVUFFRmllbGRzRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5EYXRhVHlwZTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ29sdW1uOworCitwdWJsaWMgY2xhc3MgQXV0aEV2ZW50VGFibGVEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0aW9uIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKEFFRmllbGRzRGVzY3JpcHRpb24gZmllbGQgOiBBRUZpZWxkc0Rlc2NyaXB0aW9uLnZhbHVlcygpKSB7CisJCQljb2x1bW5zLnB1dChmaWVsZC5nZXROYW1lKCksIG5ldyBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPihmaWVsZC50eXBlLCBmaWVsZC5pbmRleGVkKSk7CisJCX0KKworCQlyZXR1cm4gY29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleXNwYWNlKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVUSF9FVkVOVF9UWVBFOworCX0KKworCWVudW0gQUVGaWVsZHNEZXNjcmlwdGlvbiB7CisKKwkJVVJMKCJ1cmwiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgUkVRVUVTVF9JRCgicmVxdWVzdF9pZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFVTRVIoInVzZXIiLAorCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBBVVRIX1NUQVRVUygiYXV0aF9zdGF0dXMiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgUkVBTE0oInJlYWxtIiwKKwkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBBQ1RJT04oImFjdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwKKwkJCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFU0MoImRlc2NyaXB0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlBRUZpZWxkc0Rlc2NyaXB0aW9uKFN0cmluZyBuYW1lLCBEYXRhVHlwZSB0eXBlLCBib29sZWFuIGluZGV4ZWQpIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQkJdGhpcy5pbmRleGVkID0gaW5kZXhlZDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisKKwkJcHVibGljIERhdGFUeXBlIGdldFR5cGUoKSB7CisJCQlyZXR1cm4gdHlwZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzSW5kZXhlZCgpIHsKKwkJCXJldHVybiBpbmRleGVkOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9DYXRlZ29yeUV2ZW50VGFibGVEZXNjcmlwdGlvbi5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvQ2F0ZWdvcnlFdmVudFRhYmxlRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmVmYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvQ2F0ZWdvcnlFdmVudFRhYmxlRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5JVGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CisKK3B1YmxpYyBjbGFzcyBDYXRlZ29yeUV2ZW50VGFibGVEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0aW9uIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKENFRmllbGRzRGVzY3JpcHRpb24gZmllbGQgOiBDRUZpZWxkc0Rlc2NyaXB0aW9uLnZhbHVlcygpKSB7CisJCQljb2x1bW5zLnB1dChmaWVsZC5nZXROYW1lKCksIG5ldyBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPihmaWVsZC50eXBlLCBmaWVsZC5pbmRleGVkKSk7CisJCX0KKworCQlyZXR1cm4gY29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleXNwYWNlKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQ0FURUdPUllfRVZFTlRfVFlQRTsKKwl9CisKKwllbnVtIENFRmllbGRzRGVzY3JpcHRpb24geworCisJCUFDVElPTigiYWN0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLCB0cnVlKSwgU1RBVFVTKCJzdGF0dXMiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgREVTQygiZGVzY3JpcHRpb24iLAorCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBDQVRFR09SWV9OQU1FKCJjYXRlZ29yeV9OYW1lIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJZmFsc2UpLCBTVUJfQ0FURUdPUllfTkFNRSgic3ViX0NhdGVnb3J5X05hbWUiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgR1JPVVBJTkdfTkFNRSgKKwkJCQkJCQkJImdyb3VwaW5nX25hbWUiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgTU9ESUZJRVIoIm1vZGlmaWVyIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJCQkJCWZhbHNlKSwgUkVRVUVTVF9JRCgicmVxdWVzdF9pZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBSRVNPVVJDRV9UWVBFKAorCQkJCQkJCQkJCQkJInJlc291cmNlX3R5cGUiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgU0VSVklDRV9JTlNUQU5DRV9JRCgKKwkJCQkJCQkJCQkJCQkJInNlcnZpY2VfaW5zdGFuY2VfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKTsKKworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIERhdGFUeXBlIHR5cGU7CisJCXByaXZhdGUgYm9vbGVhbiBpbmRleGVkOworCisJCUNFRmllbGRzRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIERhdGFUeXBlIHR5cGUsIGJvb2xlYW4gaW5kZXhlZCkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCXRoaXMudHlwZSA9IHR5cGU7CisJCQl0aGlzLmluZGV4ZWQgPSBpbmRleGVkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQlwdWJsaWMgRGF0YVR5cGUgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiB0eXBlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgeworCQkJcmV0dXJuIGluZGV4ZWQ7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0NvbXBvbmVudENhY2hlVGFibGVEZXNjcmlwdGlvbi5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvQ29tcG9uZW50Q2FjaGVUYWJsZURlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5NmRhNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0NvbXBvbmVudENhY2hlVGFibGVEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5JVGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50Q2FjaGVUYWJsZURlc2NyaXB0aW9uIGltcGxlbWVudHMgSVRhYmxlRGVzY3JpcHRpb24geworCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gcHJpbWFyeUtleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihJRF9GSUVMRCwgRGF0YVR5cGUudmFyY2hhcigpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gZ2V0Q29sdW1uRGVzY3JpcHRpb24oKSB7CisJCU1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBjb2x1bW5zID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoUGFydGlhbENvbXBvbmVudEZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogUGFydGlhbENvbXBvbmVudEZpZWxkc0Rlc2NyaXB0aW9uLnZhbHVlcygpKSB7CisJCQljb2x1bW5zLnB1dChmaWVsZC5nZXROYW1lKCksIG5ldyBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPihmaWVsZC50eXBlLCBmaWVsZC5pbmRleGVkKSk7CisJCX0KKworCQlyZXR1cm4gY29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleXNwYWNlKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5DT01QT05FTlRfS0VZU1BBQ0U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJCXJldHVybiAiY29tcG9uZW50Y2FjaGUiOworCX0KKworCWVudW0gUGFydGlhbENvbXBvbmVudEZpZWxkc0Rlc2NyaXB0aW9uIHsKKwkJREFUQSgiZGF0YSIsIERhdGFUeXBlLmJsb2IoKSwgZmFsc2UpLCBNT0RJRklDQVRJT05fVElNRSgibW9kaWZpY2F0aW9uX3RpbWUiLCBEYXRhVHlwZS50aW1lc3RhbXAoKSwgZmFsc2UpLCBUWVBFKAorCQkJCSJ0eXBlIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIElTX0RJUlRZKCJpc19kaXJ0eSIsIERhdGFUeXBlLmNib29sZWFuKCksCisJCQkJCQlmYWxzZSksIElTX1pJUFBFRCgiaXNfemlwcGVkIiwgRGF0YVR5cGUuY2Jvb2xlYW4oKSwgZmFsc2UpLDsKKworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIERhdGFUeXBlIHR5cGU7CisJCXByaXZhdGUgYm9vbGVhbiBpbmRleGVkOworCisJCVBhcnRpYWxDb21wb25lbnRGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9Db25zdW1lckV2ZW50VGFibGVEZWZpbml0aW9uLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9Db25zdW1lckV2ZW50VGFibGVEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YTdhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0NvbnN1bWVyRXZlbnRUYWJsZURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLklUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlcy5HZXRVZWJDbHVzdGVyRXZlbnRUYWJsZURlc2MuREVFRmllbGRzRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5EYXRhVHlwZTsKKworcHVibGljIGNsYXNzIENvbnN1bWVyRXZlbnRUYWJsZURlZmluaXRpb24gaW1wbGVtZW50cyBJVGFibGVEZXNjcmlwdGlvbiB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKERFRUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogREVFRmllbGRzRGVzY3JpcHRpb24udmFsdWVzKCkpIHsKKwkJCWNvbHVtbnMucHV0KGZpZWxkLmdldE5hbWUoKSwgbmV3IEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+KGZpZWxkLnR5cGUsIGZpZWxkLmluZGV4ZWQpKTsKKwkJfQorCisJCXJldHVybiBjb2x1bW5zOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5c3BhY2UoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5DT05TVU1FUl9FVkVOVF9UWVBFOworCX0KKworCWVudW0gREVFRmllbGRzRGVzY3JpcHRpb24geworCQlBQ1RJT04oImFjdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFU0NSSVBUSU9OKAorCQkJCSJkZXNjcmlwdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQlmYWxzZSksIEVDT01QX1VTRVIoImVjb21wX3VzZXIiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgTU9ESUZJRVIoIm1vZGlmaWVyIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJZmFsc2UpLCBSRVFVRVNUX0lEKCJyZXF1ZXN0X2lkIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlERUVGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYkRlcGxveUV2ZW50VGFibGVEZXNjLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9EaXN0cmliRGVwbG95RXZlbnRUYWJsZURlc2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmMxZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYkRlcGxveUV2ZW50VGFibGVEZXNjLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5JVGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXMuRGlzdHJpYkRvd25sb2FkRXZlbnRUYWJsZURlc2MuRFNFRmllbGRzRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5EYXRhVHlwZTsKKworcHVibGljIGNsYXNzIERpc3RyaWJEZXBsb3lFdmVudFRhYmxlRGVzYyBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0aW9uIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IHByaW1hcnlLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRUJBU0VEX1VVSURfRklFTEQsIERhdGFUeXBlLnRpbWV1dWlkKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gY2x1c3RlcmluZ0tleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihUSU1FU1RBTVBfRklFTEQsIERhdGFUeXBlLnRpbWVzdGFtcCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gZ2V0Q29sdW1uRGVzY3JpcHRpb24oKSB7CisJCU1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBjb2x1bW5zID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoRFNFRmllbGRzRGVzY3JpcHRpb24gZmllbGQgOiBEU0VGaWVsZHNEZXNjcmlwdGlvbi52YWx1ZXMoKSkgeworCQkJY29sdW1ucy5wdXQoZmllbGQuZ2V0TmFtZSgpLCBuZXcgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4oZmllbGQudHlwZSwgZmllbGQuaW5kZXhlZCkpOworCQl9CisKKwkJcmV0dXJuIGNvbHVtbnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRLZXlzcGFjZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlRfVFlQRTsKKwl9CisKKwllbnVtIERTRUZpZWxkc0Rlc2NyaXB0aW9uIHsKKwkJQUNUSU9OKCJhY3Rpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksIHRydWUpLCBTVEFUVVMoInN0YXR1cyIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIERFU0NSSVBUSU9OKAorCQkJCSJkZXNjcmlwdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBSRVFVRVNUX0lEKCJyZXF1ZXN0X2lkIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJZmFsc2UpLCBTRVJWSUNFX0lOU1RfSUQoInNlcnZpY2VfaW5zdGFuY2VfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksIHRydWUpLCBNT0RJRklFUigibW9kaWZpZXIiLAorCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgQ1VSUl9WRVJTSU9OKCJjdXJyX3ZlcnNpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJZmFsc2UpLCBESUQoImRpZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFJFU09VUkNFX05BTUUoInJlc291cmNlX25hbWUiLAorCQkJCQkJCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJCQkJCQkJZmFsc2UpLCBSRVNPVVJDRV9UWVBFKCJyZXNvdXJjZV90eXBlIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlEU0VGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYkRvd25sb2FkRXZlbnRUYWJsZURlc2MuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0Rpc3RyaWJEb3dubG9hZEV2ZW50VGFibGVEZXNjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkNGY1NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0Rpc3RyaWJEb3dubG9hZEV2ZW50VGFibGVEZXNjLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5JVGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworCitwdWJsaWMgY2xhc3MgRGlzdHJpYkRvd25sb2FkRXZlbnRUYWJsZURlc2MgaW1wbGVtZW50cyBJVGFibGVEZXNjcmlwdGlvbiB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKERTRUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogRFNFRmllbGRzRGVzY3JpcHRpb24udmFsdWVzKCkpIHsKKwkJCWNvbHVtbnMucHV0KGZpZWxkLmdldE5hbWUoKSwgbmV3IEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+KGZpZWxkLnR5cGUsIGZpZWxkLmluZGV4ZWQpKTsKKwkJfQorCisJCXJldHVybiBjb2x1bW5zOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5c3BhY2UoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fRE9XTkxPQURfRVZFTlRfVFlQRTsKKwl9CisKKwllbnVtIERTRUZpZWxkc0Rlc2NyaXB0aW9uIHsKKwkJUkVRVUVTVF9JRCgicmVxdWVzdF9JZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBTRVJWSUNFX0lOU1RfSUQoInNlcnZpY2VfSW5zdGFuY2VfSWQiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJZmFsc2UpLCBBQ1RJT04oImFjdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJZmFsc2UpLCBERVNDUklQVElPTigiZGVzY3JpcHRpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgQ09OU1VNRVJfSUQoImNvbnN1bWVyX0lkIiwKKwkJCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIFJFU09VUkNFX1VSTCgicmVzb3VyY2VfVVJMIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlEU0VGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYkVuZ2luZUV2ZW50VGFibGVEZXNjLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9EaXN0cmliRW5naW5lRXZlbnRUYWJsZURlc2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U1YmZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYkVuZ2luZUV2ZW50VGFibGVEZXNjLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5JVGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworCitwdWJsaWMgY2xhc3MgRGlzdHJpYkVuZ2luZUV2ZW50VGFibGVEZXNjIGltcGxlbWVudHMgSVRhYmxlRGVzY3JpcHRpb24geworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IHByaW1hcnlLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRUJBU0VEX1VVSURfRklFTEQsIERhdGFUeXBlLnRpbWV1dWlkKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gY2x1c3RlcmluZ0tleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihUSU1FU1RBTVBfRklFTEQsIERhdGFUeXBlLnRpbWVzdGFtcCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gZ2V0Q29sdW1uRGVzY3JpcHRpb24oKSB7CisJCU1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBjb2x1bW5zID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoREVFRmllbGRzRGVzY3JpcHRpb24gZmllbGQgOiBERUVGaWVsZHNEZXNjcmlwdGlvbi52YWx1ZXMoKSkgeworCQkJY29sdW1ucy5wdXQoZmllbGQuZ2V0TmFtZSgpLCBuZXcgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4oZmllbGQudHlwZSwgZmllbGQuaW5kZXhlZCkpOworCQl9CisKKwkJcmV0dXJuIGNvbHVtbnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRLZXlzcGFjZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9FTkdJTkVfRVZFTlRfVFlQRTsKKwl9CisKKwllbnVtIERFRUZpZWxkc0Rlc2NyaXB0aW9uIHsKKwkJQUNUSU9OKCJhY3Rpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksIHRydWUpLCBTVEFUVVMoInN0YXR1cyIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBERVNDUklQVElPTigKKwkJCQkiZGVzY3JpcHRpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJZmFsc2UpLCBDT05TVU1FUl9JRCgiY29uc3VtZXJfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgUkVRVUVTVF9JRCgicmVxdWVzdF9pZCIsCisJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksIHRydWUpLCBTRVJWSUNFX0lOU1RfSUQoInNlcnZpY2VfaW5zdGFuY2VfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCWZhbHNlKSwgUk9MRSgicm9sZSIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBEX0VOVigiZF9lbnYiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJZmFsc2UpLCBBUElfS0VZKCJhcGlfa2V5IiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERTVEFUVVNfVE9QSUMoCisJCQkJCQkJCQkJCQkiZHN0YXR1c190b3BpYyIsIERhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQkJCQkJCQkJCWZhbHNlKSwgRE5PVElGX1RPUElDKCJkbm90aWZfdG9waWMiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKTsKKworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIERhdGFUeXBlIHR5cGU7CisJCXByaXZhdGUgYm9vbGVhbiBpbmRleGVkOworCisJCURFRUZpZWxkc0Rlc2NyaXB0aW9uKFN0cmluZyBuYW1lLCBEYXRhVHlwZSB0eXBlLCBib29sZWFuIGluZGV4ZWQpIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQkJdGhpcy5pbmRleGVkID0gaW5kZXhlZDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisKKwkJcHVibGljIERhdGFUeXBlIGdldFR5cGUoKSB7CisJCQlyZXR1cm4gdHlwZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzSW5kZXhlZCgpIHsKKwkJCXJldHVybiBpbmRleGVkOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9EaXN0cmliTm90aWZFdmVudFRhYmxlRGVzYy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYk5vdGlmRXZlbnRUYWJsZURlc2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmZhYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYk5vdGlmRXZlbnRUYWJsZURlc2MuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLnRhYmxlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLklUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CisKK3B1YmxpYyBjbGFzcyBEaXN0cmliTm90aWZFdmVudFRhYmxlRGVzYyBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0aW9uIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKERORUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogRE5FRmllbGRzRGVzY3JpcHRpb24udmFsdWVzKCkpIHsKKwkJCWNvbHVtbnMucHV0KGZpZWxkLmdldE5hbWUoKSwgbmV3IEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+KGZpZWxkLnR5cGUsIGZpZWxkLmluZGV4ZWQpKTsKKwkJfQorCisJCXJldHVybiBjb2x1bW5zOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5c3BhY2UoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX0VWRU5UX1RZUEU7CisJfQorCisJZW51bSBETkVGaWVsZHNEZXNjcmlwdGlvbiB7CisJCUFDVElPTigiYWN0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLCB0cnVlKSwgU1RBVFVTKCJzdGF0dXMiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgREVTQ1JJUFRJT04oCisJCQkJImRlc2NyaXB0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCWZhbHNlKSwgUkVRVUVTVF9JRCgicmVxdWVzdF9pZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBTRVJWSUNFX0lOU1RfSUQoInNlcnZpY2VfaW5zdGFuY2VfaWQiLAorCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLCB0cnVlKSwgVE9QSUNfTkFNRSgidG9waWNfbmFtZSIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBNT0RJRklFUigKKwkJCQkJCQkJIm1vZGlmaWVyIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIENVUlJfU1RBVEUoImN1cnJfc3RhdGUiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJZmFsc2UpLCBDVVJSX1ZFUlNJT04oImN1cnJfdmVyc2lvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBESUQoImRpZCIsCisJCQkJCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksIHRydWUpLCBSRVNPVVJDRV9OQU1FKCJyZXNvdXJjZV9uYW1lIiwKKwkJCQkJCQkJCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIFJFU09VUkNFX1RZUEUoInJlc291cmNlX3R5cGUiLAorCQkJCQkJCQkJCQkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpOworCisJCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCXByaXZhdGUgRGF0YVR5cGUgdHlwZTsKKwkJcHJpdmF0ZSBib29sZWFuIGluZGV4ZWQ7CisKKwkJRE5FRmllbGRzRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIERhdGFUeXBlIHR5cGUsIGJvb2xlYW4gaW5kZXhlZCkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCXRoaXMudHlwZSA9IHR5cGU7CisJCQl0aGlzLmluZGV4ZWQgPSBpbmRleGVkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQlwdWJsaWMgRGF0YVR5cGUgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiB0eXBlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgeworCQkJcmV0dXJuIGluZGV4ZWQ7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0Rpc3RyaWJTdGF0dXNFdmVudFRhYmxlRGVzYy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRGlzdHJpYlN0YXR1c0V2ZW50VGFibGVEZXNjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1NjRlMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0Rpc3RyaWJTdGF0dXNFdmVudFRhYmxlRGVzYy5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLklUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CisKK3B1YmxpYyBjbGFzcyBEaXN0cmliU3RhdHVzRXZlbnRUYWJsZURlc2MgaW1wbGVtZW50cyBJVGFibGVEZXNjcmlwdGlvbiB7CisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gcHJpbWFyeUtleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihUSU1FQkFTRURfVVVJRF9GSUVMRCwgRGF0YVR5cGUudGltZXV1aWQoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBjbHVzdGVyaW5nS2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVTVEFNUF9GSUVMRCwgRGF0YVR5cGUudGltZXN0YW1wKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBnZXRDb2x1bW5EZXNjcmlwdGlvbigpIHsKKwkJTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGNvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChEU0VGaWVsZHNEZXNjcmlwdGlvbiBmaWVsZCA6IERTRUZpZWxkc0Rlc2NyaXB0aW9uLnZhbHVlcygpKSB7CisJCQljb2x1bW5zLnB1dChmaWVsZC5nZXROYW1lKCksIG5ldyBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPihmaWVsZC50eXBlLCBmaWVsZC5pbmRleGVkKSk7CisJCX0KKworCQlyZXR1cm4gY29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleXNwYWNlKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX1NUQVRVU19FVkVOVF9UWVBFOworCX0KKworCWVudW0gRFNFRmllbGRzRGVzY3JpcHRpb24geworCQlBQ1RJT04oImFjdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFU0NSSVBUSU9OKAorCQkJCSJkZXNjcmlwdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQlmYWxzZSksIERJRCgiZGlkIiwgRGF0YVR5cGUudmFyY2hhcigpLCB0cnVlKSwgQ09OU1VNRVJfSUQoImNvbnN1bWVyX2lkIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJZmFsc2UpLCBSRVFVRVNUX0lEKCJyZXF1ZXN0X2lkIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIFJFU09VUkNFX1VSTCgicmVzb3VyZV9VUkwiLAorCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgU0VSVklDRV9JTlNUX0lEKCJzZXJ2aWNlX2luc3RhbmNlX2lkIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJCQkJCWZhbHNlKSwgVE9QSUNfTkFNRSgidG9waWNfbmFtZSIsIERhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQkJCQkJCQkJCWZhbHNlKSwgU1RBVFVTX1RJTUUoInN0YXR1c190aW1lIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlEU0VGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0V4dGVybmFsQXBpRXZlbnRUYWJsZURlc2MuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0V4dGVybmFsQXBpRXZlbnRUYWJsZURlc2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjdjOWVmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvRXh0ZXJuYWxBcGlFdmVudFRhYmxlRGVzYy5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLklUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CisKK3B1YmxpYyBjbGFzcyBFeHRlcm5hbEFwaUV2ZW50VGFibGVEZXNjIGltcGxlbWVudHMgSVRhYmxlRGVzY3JpcHRpb24geworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IHByaW1hcnlLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRUJBU0VEX1VVSURfRklFTEQsIERhdGFUeXBlLnRpbWV1dWlkKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gY2x1c3RlcmluZ0tleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihUSU1FU1RBTVBfRklFTEQsIERhdGFUeXBlLnRpbWVzdGFtcCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gZ2V0Q29sdW1uRGVzY3JpcHRpb24oKSB7CisJCU1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBjb2x1bW5zID0gbmV3IEhhc2hNYXA8PigpOworCisJCWZvciAoRUdBRUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogRUdBRUZpZWxkc0Rlc2NyaXB0aW9uLnZhbHVlcygpKSB7CisJCQljb2x1bW5zLnB1dChmaWVsZC5nZXROYW1lKCksIG5ldyBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPihmaWVsZC50eXBlLCBmaWVsZC5pbmRleGVkKSk7CisJCX0KKworCQlyZXR1cm4gY29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleXNwYWNlKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRVhURVJOQUxfQVBJX0VWRU5UX1RZUEU7CisJfQorCisJZW51bSBFR0FFRmllbGRzRGVzY3JpcHRpb24geworCQlBQ1RJT04oImFjdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFU0NSSVBUSU9OKAorCQkJCSJkZXNjcmlwdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBDT05TVU1FUl9JRCgiY29uc3VtZXJfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQlmYWxzZSksIFJFU09VUkNFX1VSTCgicmVzb3VyY2VfVVJMIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIFJFU09VUkNFX05BTUUoInJlc291cmNlX25hbWUiLAorCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCWZhbHNlKSwgUkVTT1VSQ0VfVFlQRSgicmVzb3VyY2VfdHlwZSIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBTRVJWSUNFX0lOU1RfSUQoCisJCQkJCQkJCQkJInNlcnZpY2VfaW5zdGFuY2VfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJdHJ1ZSksIE1PRElGSUVSKCJtb2RpZmllciIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBQUkVWX0FSVElGQUNUX1VVSUQoCisJCQkJCQkJCQkJCQkicHJldl9hcnRpZmFjdF91dWlkIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIENVUlJfQVJUSUZBQ1RfVVVJRCgKKwkJCQkJCQkJCQkJCQkJImN1cnJfYXJ0aWZhY3RfdXVpZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBBUlRJRkFDVF9EQVRBKAorCQkJCQkJCQkJCQkJCQkJCSJhcnRpZmFjdF9kYXRhIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlFR0FFRmllbGRzRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIERhdGFUeXBlIHR5cGUsIGJvb2xlYW4gaW5kZXhlZCkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCXRoaXMudHlwZSA9IHR5cGU7CisJCQl0aGlzLmluZGV4ZWQgPSBpbmRleGVkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQlwdWJsaWMgRGF0YVR5cGUgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiB0eXBlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgeworCQkJcmV0dXJuIGluZGV4ZWQ7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0dldENhdEhpZXJFdmVudFRhYmxlRGVzYy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvR2V0Q2F0SGllckV2ZW50VGFibGVEZXNjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxYTVjMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0dldENhdEhpZXJFdmVudFRhYmxlRGVzYy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS5JVGFibGVEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXMuR2V0VXNlcnNMaXN0RXZlbnRUYWJsZURlc2MuREVFRmllbGRzRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5EYXRhVHlwZTsKKworcHVibGljIGNsYXNzIEdldENhdEhpZXJFdmVudFRhYmxlRGVzYyBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0aW9uIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKERFRUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogREVFRmllbGRzRGVzY3JpcHRpb24udmFsdWVzKCkpIHsKKwkJCWNvbHVtbnMucHV0KGZpZWxkLmdldE5hbWUoKSwgbmV3IEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+KGZpZWxkLnR5cGUsIGZpZWxkLmluZGV4ZWQpKTsKKwkJfQorCisJCXJldHVybiBjb2x1bW5zOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5c3BhY2UoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5HRVRfQ0FURUdPUllfSElFUkFSQ0hZX0VWRU5UX1RZUEU7CisJfQorCisJZW51bSBERUVGaWVsZHNEZXNjcmlwdGlvbiB7CisJCUFDVElPTigiYWN0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLCB0cnVlKSwgU1RBVFVTKCJzdGF0dXMiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgREVTQ1JJUFRJT04oCisJCQkJImRlc2NyaXB0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFVEFJTFMoImRldGFpbHMiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgUkVRVUVTVF9JRCgKKwkJCQkJCSJyZXF1ZXN0X2lkIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIE1PRElGSUVSKCJtb2RpZmllciIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpOworCisJCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCXByaXZhdGUgRGF0YVR5cGUgdHlwZTsKKwkJcHJpdmF0ZSBib29sZWFuIGluZGV4ZWQ7CisKKwkJREVFRmllbGRzRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIERhdGFUeXBlIHR5cGUsIGJvb2xlYW4gaW5kZXhlZCkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCXRoaXMudHlwZSA9IHR5cGU7CisJCQl0aGlzLmluZGV4ZWQgPSBpbmRleGVkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQlwdWJsaWMgRGF0YVR5cGUgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiB0eXBlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgeworCQkJcmV0dXJuIGluZGV4ZWQ7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0dldFVlYkNsdXN0ZXJFdmVudFRhYmxlRGVzYy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvR2V0VWViQ2x1c3RlckV2ZW50VGFibGVEZXNjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmMWYwMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL0dldFVlYkNsdXN0ZXJFdmVudFRhYmxlRGVzYy5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEuSVRhYmxlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLkRpc3RyaWJFbmdpbmVFdmVudFRhYmxlRGVzYy5ERUVGaWVsZHNEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworCitwdWJsaWMgY2xhc3MgR2V0VWViQ2x1c3RlckV2ZW50VGFibGVEZXNjIGltcGxlbWVudHMgSVRhYmxlRGVzY3JpcHRpb24geworCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gcHJpbWFyeUtleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihUSU1FQkFTRURfVVVJRF9GSUVMRCwgRGF0YVR5cGUudGltZXV1aWQoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBjbHVzdGVyaW5nS2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVTVEFNUF9GSUVMRCwgRGF0YVR5cGUudGltZXN0YW1wKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBnZXRDb2x1bW5EZXNjcmlwdGlvbigpIHsKKwkJTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGNvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChERUVGaWVsZHNEZXNjcmlwdGlvbiBmaWVsZCA6IERFRUZpZWxkc0Rlc2NyaXB0aW9uLnZhbHVlcygpKSB7CisJCQljb2x1bW5zLnB1dChmaWVsZC5nZXROYW1lKCksIG5ldyBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPihmaWVsZC50eXBlLCBmaWVsZC5pbmRleGVkKSk7CisJCX0KKworCQlyZXR1cm4gY29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleXNwYWNlKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVF9UWVBFOworCX0KKworCWVudW0gREVFRmllbGRzRGVzY3JpcHRpb24geworCQlBQ1RJT04oImFjdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFU0NSSVBUSU9OKAorCQkJCSJkZXNjcmlwdGlvbiIsIERhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQlmYWxzZSksIENPTlNVTUVSX0lEKCJjb25zdW1lcl9JZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBSRVFVRVNUX0lEKCJyZXF1ZXN0X0lkIiwKKwkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBTRVJWSUNFX0lOU1RfSUQoInNlcnZpY2VfSW5zdGFuY2VfSWQiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKTsKKworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIERhdGFUeXBlIHR5cGU7CisJCXByaXZhdGUgYm9vbGVhbiBpbmRleGVkOworCisJCURFRUZpZWxkc0Rlc2NyaXB0aW9uKFN0cmluZyBuYW1lLCBEYXRhVHlwZSB0eXBlLCBib29sZWFuIGluZGV4ZWQpIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQkJdGhpcy5pbmRleGVkID0gaW5kZXhlZDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisKKwkJcHVibGljIERhdGFUeXBlIGdldFR5cGUoKSB7CisJCQlyZXR1cm4gdHlwZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzSW5kZXhlZCgpIHsKKwkJCXJldHVybiBpbmRleGVkOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9HZXRVc2Vyc0xpc3RFdmVudFRhYmxlRGVzYy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvR2V0VXNlcnNMaXN0RXZlbnRUYWJsZURlc2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk0YmQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvR2V0VXNlcnNMaXN0RXZlbnRUYWJsZURlc2MuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEuSVRhYmxlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzLkdldFVlYkNsdXN0ZXJFdmVudFRhYmxlRGVzYy5ERUVGaWVsZHNEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ1R5cGVzQ29uc3RhbnRzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworCitwdWJsaWMgY2xhc3MgR2V0VXNlcnNMaXN0RXZlbnRUYWJsZURlc2MgaW1wbGVtZW50cyBJVGFibGVEZXNjcmlwdGlvbiB7CisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gcHJpbWFyeUtleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihUSU1FQkFTRURfVVVJRF9GSUVMRCwgRGF0YVR5cGUudGltZXV1aWQoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBjbHVzdGVyaW5nS2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVTVEFNUF9GSUVMRCwgRGF0YVR5cGUudGltZXN0YW1wKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBnZXRDb2x1bW5EZXNjcmlwdGlvbigpIHsKKwkJTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGNvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChERUVGaWVsZHNEZXNjcmlwdGlvbiBmaWVsZCA6IERFRUZpZWxkc0Rlc2NyaXB0aW9uLnZhbHVlcygpKSB7CisJCQljb2x1bW5zLnB1dChmaWVsZC5nZXROYW1lKCksIG5ldyBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPihmaWVsZC50eXBlLCBmaWVsZC5pbmRleGVkKSk7CisJCX0KKworCQlyZXR1cm4gY29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleXNwYWNlKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuR0VUX1VTRVJTX0xJU1RfRVZFTlRfVFlQRTsKKwl9CisKKwllbnVtIERFRUZpZWxkc0Rlc2NyaXB0aW9uIHsKKwkJQUNUSU9OKCJhY3Rpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksIHRydWUpLCBTVEFUVVMoInN0YXR1cyIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBERVNDUklQVElPTigKKwkJCQkiZGVzY3JpcHRpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgREVUQUlMUygiZGV0YWlscyIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBSRVFVRVNUX0lEKAorCQkJCQkJInJlcXVlc3RfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgTU9ESUZJRVIoIm1vZGlmaWVyIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlERUVGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvUmVzQWRtaW5FdmVudFRhYmxlRGVzY3JpcHRpb24uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL1Jlc0FkbWluRXZlbnRUYWJsZURlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmMGJhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9SZXNBZG1pbkV2ZW50VGFibGVEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLklUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKKworcHVibGljIGNsYXNzIFJlc0FkbWluRXZlbnRUYWJsZURlc2NyaXB0aW9uIGltcGxlbWVudHMgSVRhYmxlRGVzY3JpcHRpb24geworCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4gcHJpbWFyeUtleXMoKSB7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlrZXlzLmFkZChuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIERhdGFUeXBlPihUSU1FQkFTRURfVVVJRF9GSUVMRCwgRGF0YVR5cGUudGltZXV1aWQoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBjbHVzdGVyaW5nS2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVTVEFNUF9GSUVMRCwgRGF0YVR5cGUudGltZXN0YW1wKCkpKTsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+PiBnZXRDb2x1bW5EZXNjcmlwdGlvbigpIHsKKwkJTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGNvbHVtbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChBRUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogQUVGaWVsZHNEZXNjcmlwdGlvbi52YWx1ZXMoKSkgeworCQkJY29sdW1ucy5wdXQoZmllbGQuZ2V0TmFtZSgpLCBuZXcgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4oZmllbGQudHlwZSwgZmllbGQuaW5kZXhlZCkpOworCQl9CisKKwkJcmV0dXJuIGNvbHVtbnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRLZXlzcGFjZSgpIHsKKwkJcmV0dXJuIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEU7CisJfQorCisJZW51bSBBRUZpZWxkc0Rlc2NyaXB0aW9uIHsKKwkJUkVRVUVTVF9JRCgicmVxdWVzdF9pZCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBTRVJWSUNFX0lOU1RfSUQoInNlcnZpY2VfaW5zdGFuY2VfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJdHJ1ZSksIElOVkFSSUFOVF9VVUlEKCJpbnZhcmlhbnRfVVVJRCIsIERhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIEFDVElPTigiYWN0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFU0NSSVBUSU9OKCJkZXNjcmlwdGlvbiIsCisJCQkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQkJCQkJZmFsc2UpLCBSRVNPVVJDRV9UWVBFKCJyZXNvdXJjZV90eXBlIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIFBSRVZfVkVSU0lPTigKKwkJCQkJCQkJCQkicHJldl92ZXJzaW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJCQkJCXRydWUpLCBQUkVWX1NUQVRFKCJwcmV2X3N0YXRlIiwgRGF0YVR5cGUudmFyY2hhcigpLCB0cnVlKSwgQ1VSUl9TVEFURSgKKwkJCQkJCQkJCQkJCSJjdXJyX3N0YXRlIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIFJFU09VUkNFX05BTUUoInJlc291cmNlX25hbWUiLAorCQkJCQkJCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgQ1VSUl9WRVJTSU9OKCJjdXJyX3ZlcnNpb24iLAorCQkJCQkJCQkJCQkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIE1PRElGSUVSKCJtb2RpZmllciIsCisJCQkJCQkJCQkJCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJCQkJCQkJCQlmYWxzZSksIFBSRVZfQVJUSUZBQ1RfVVVJRCgicHJldl9hcnRpZmFjdF9VVUlEIiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlmYWxzZSksIENVUlJfX0FSVElGQUNUX1VVSUQoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJImN1cnJfYXJ0aWZhY3RfVVVJRCIsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWZhbHNlKSwgQVJUSUZBQ1RfREFUQSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJhcnRpZmFjdF9kYXRhIiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWZhbHNlKSwgRElEKCJkaWQiLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCXRydWUpLCBEUFJFVl9TVEFUVVMoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJImRwcmV2X3N0YXR1cyIsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWZhbHNlKSwgRENVUlJfU1RBVFVTKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJImRjdXJyX3N0YXR1cyIsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlmYWxzZSksIFRPU0NBX05PREVfVFlQRSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJInRvc2NhX25vZGVfdHlwZSIsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJZmFsc2UpLCBDT01NRU5UKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJjb21tZW50IiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJZmFsc2UpOworCisJCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCXByaXZhdGUgRGF0YVR5cGUgdHlwZTsKKwkJcHJpdmF0ZSBib29sZWFuIGluZGV4ZWQ7CisKKwkJQUVGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvVXNlckFjY2Vzc0V2ZW50VGFibGVEZXNjcmlwdGlvbi5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvVXNlckFjY2Vzc0V2ZW50VGFibGVEZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDgyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9jYXNzYW5kcmEvc2NoZW1hL3RhYmxlcy9Vc2VyQWNjZXNzRXZlbnRUYWJsZURlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhLnNjaGVtYS50YWJsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEuSVRhYmxlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5EYXRhVHlwZTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ29sdW1uOworCitwdWJsaWMgY2xhc3MgVXNlckFjY2Vzc0V2ZW50VGFibGVEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIElUYWJsZURlc2NyaXB0aW9uIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKFVBRUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogVUFFRmllbGRzRGVzY3JpcHRpb24udmFsdWVzKCkpIHsKKwkJCWNvbHVtbnMucHV0KGZpZWxkLmdldE5hbWUoKSwgbmV3IEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+KGZpZWxkLnR5cGUsIGZpZWxkLmluZGV4ZWQpKTsKKwkJfQorCisJCXJldHVybiBjb2x1bW5zOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5c3BhY2UoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5VU0VSX0FDQ0VTU19FVkVOVF9UWVBFOworCX0KKworCWVudW0gVUFFRmllbGRzRGVzY3JpcHRpb24geworCQlSRVFVRVNUX0lEKCJyZXF1ZXN0X0lkIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIFVTRVIoIlVTRVIiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgQUNUSU9OKCJhY3Rpb24iLAorCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgdHJ1ZSksIFNUQVRVUygic3RhdHVzIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIERFU0NSSVBUSU9OKCJkZXNjcmlwdGlvbiIsCisJCQkJCQlEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQlmYWxzZSksIFNFUlZJQ0VfSU5TVEFOQ0VfSUQoInNlcnZpY2VfaW5zdGFuY2VfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKTsKKworCQlAQ29sdW1uCisJCXByaXZhdGUgU3RyaW5nIG1vZGlmaWVyOworCisJCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCXByaXZhdGUgRGF0YVR5cGUgdHlwZTsKKwkJcHJpdmF0ZSBib29sZWFuIGluZGV4ZWQ7CisKKwkJVUFFRmllbGRzRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIERhdGFUeXBlIHR5cGUsIGJvb2xlYW4gaW5kZXhlZCkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCXRoaXMudHlwZSA9IHR5cGU7CisJCQl0aGlzLmluZGV4ZWQgPSBpbmRleGVkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKworCQlwdWJsaWMgRGF0YVR5cGUgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiB0eXBlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgeworCQkJcmV0dXJuIGluZGV4ZWQ7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL1VzZXJBZG1pbkV2ZW50VGFibGVEZXNjcmlwdGlvbi5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vY2Fzc2FuZHJhL3NjaGVtYS90YWJsZXMvVXNlckFkbWluRXZlbnRUYWJsZURlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4ZGYwOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2Nhc3NhbmRyYS9zY2hlbWEvdGFibGVzL1VzZXJBZG1pbkV2ZW50VGFibGVEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5zY2hlbWEudGFibGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5jYXNzYW5kcmEuc2NoZW1hLklUYWJsZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLkF1ZGl0aW5nVHlwZXNDb25zdGFudHM7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CisKK3B1YmxpYyBjbGFzcyBVc2VyQWRtaW5FdmVudFRhYmxlRGVzY3JpcHRpb24gaW1wbGVtZW50cyBJVGFibGVEZXNjcmlwdGlvbiB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBwcmltYXJ5S2V5cygpIHsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWtleXMuYWRkKG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgRGF0YVR5cGU+KFRJTUVCQVNFRF9VVUlEX0ZJRUxELCBEYXRhVHlwZS50aW1ldXVpZCgpKSk7CisJCXJldHVybiBrZXlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGNsdXN0ZXJpbmdLZXlzKCkgeworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJa2V5cy5hZGQobmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBEYXRhVHlwZT4oVElNRVNUQU1QX0ZJRUxELCBEYXRhVHlwZS50aW1lc3RhbXAoKSkpOworCQlyZXR1cm4ga2V5czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgSW1tdXRhYmxlUGFpcjxEYXRhVHlwZSwgQm9vbGVhbj4+IGdldENvbHVtbkRlc2NyaXB0aW9uKCkgeworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPERhdGFUeXBlLCBCb29sZWFuPj4gY29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKFVBRUZpZWxkc0Rlc2NyaXB0aW9uIGZpZWxkIDogVUFFRmllbGRzRGVzY3JpcHRpb24udmFsdWVzKCkpIHsKKwkJCWNvbHVtbnMucHV0KGZpZWxkLmdldE5hbWUoKSwgbmV3IEltbXV0YWJsZVBhaXI8RGF0YVR5cGUsIEJvb2xlYW4+KGZpZWxkLnR5cGUsIGZpZWxkLmluZGV4ZWQpKTsKKwkJfQorCisJCXJldHVybiBjb2x1bW5zOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5c3BhY2UoKSB7CisJCXJldHVybiBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5VU0VSX0FETUlOX0VWRU5UX1RZUEU7CisJfQorCisJZW51bSBVQUVGaWVsZHNEZXNjcmlwdGlvbiB7CisJCVJFUVVFU1RfSUQoInJlcXVlc3RfaWQiLCBEYXRhVHlwZS52YXJjaGFyKCksIGZhbHNlKSwgU0VSVklDRV9JTlNUX0lEKCJzZXJ2aWNlX2luc3RhbmNlX2lkIiwgRGF0YVR5cGUudmFyY2hhcigpLAorCQkJCWZhbHNlKSwgQUNUSU9OKCJhY3Rpb24iLCBEYXRhVHlwZS52YXJjaGFyKCksIHRydWUpLCBTVEFUVVMoInN0YXR1cyIsIERhdGFUeXBlLnZhcmNoYXIoKSwKKwkJCQkJCWZhbHNlKSwgREVTQ1JJUFRJT04oImRlc2NyaXB0aW9uIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSksIE1PRElGSUVSKCJtb2RpZmllciIsCisJCQkJCQkJCURhdGFUeXBlLnZhcmNoYXIoKSwgZmFsc2UpLCBVU0VSX0JFRk9SRSgidXNlcl9iZWZvcmUiLCBEYXRhVHlwZS52YXJjaGFyKCksCisJCQkJCQkJCQkJZmFsc2UpLCBVU0VSX0FGVEVSKCJ1c2VyX2FmdGVyIiwgRGF0YVR5cGUudmFyY2hhcigpLCBmYWxzZSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBEYXRhVHlwZSB0eXBlOworCQlwcml2YXRlIGJvb2xlYW4gaW5kZXhlZDsKKworCQlVQUVGaWVsZHNEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSwgRGF0YVR5cGUgdHlwZSwgYm9vbGVhbiBpbmRleGVkKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy50eXBlID0gdHlwZTsKKwkJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBEYXRhVHlwZSBnZXRUeXBlKCkgeworCQkJcmV0dXJuIHR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKSB7CisJCQlyZXR1cm4gaW5kZXhlZDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vZXMvRWxhc3RpY1NlYXJjaENsaWVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vZXMvRWxhc3RpY1NlYXJjaENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjM2JhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9lcy9FbGFzdGljU2VhcmNoQ2xpZW50LmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZXM7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3lzdGVtVXRpbHM7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guYWN0aW9uLmFkbWluLmNsdXN0ZXIuaGVhbHRoLkNsdXN0ZXJIZWFsdGhBY3Rpb247CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guYWN0aW9uLmFkbWluLmNsdXN0ZXIuaGVhbHRoLkNsdXN0ZXJIZWFsdGhSZXF1ZXN0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uYWRtaW4uY2x1c3Rlci5oZWFsdGguQ2x1c3RlckhlYWx0aFJlc3BvbnNlOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY2xpZW50LnRyYW5zcG9ydC5UcmFuc3BvcnRDbGllbnQ7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY29tbW9uLnNldHRpbmdzLlNldHRpbmdzOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNvbW1vbi50cmFuc3BvcnQuSW5ldFNvY2tldFRyYW5zcG9ydEFkZHJlc3M7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY29tbW9uLnVuaXQuVGltZVZhbHVlOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLm5vZGUuTm9kZTsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5ub2RlLk5vZGVCdWlsZGVyOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLnNoaWVsZC5TaGllbGRQbHVnaW47CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCisvKioKKyAqIFByZXBhcmUgdGhlIG5vZGUgdG8gd29yayB3aXRoIGVsYXN0aWMgc2VhcmNoLgorICogCisgKiBAYXV0aG9yIGx1YyBib3V0aWVyCisgKi8KK0BDb21wb25lbnQoImVsYXN0aWNzZWFyY2gtY2xpZW50IikKK3B1YmxpYyBjbGFzcyBFbGFzdGljU2VhcmNoQ2xpZW50IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFbGFzdGljU2VhcmNoQ2xpZW50LmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIE5vZGUgbm9kZTsKKwlwcml2YXRlIGJvb2xlYW4gaXNMb2NhbDsKKwlwcml2YXRlIFN0cmluZyBjbHVzdGVyTmFtZTsKKwlwcml2YXRlIENsaWVudCBjbGllbnQ7CisKKwlTdHJpbmcgc2VydmVySG9zdDsKKwlTdHJpbmcgc2VydmVyUG9ydDsKKworCUFycmF5TGlzdDxTdHJpbmc+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKwlwcml2YXRlIGJvb2xlYW4gaXNUcmFuc3BvcnRDbGllbnQ7CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKworCQlVUkwgdXJsID0gbnVsbDsKKwkJU2V0dGluZ3Mgc2V0dGluZ3MgPSBudWxsOworCQlVUkwgc3lzdGVtUmVzb3VyY2VFbGFzdGljc2VhcmNoUGF0aCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKCJlbGFzdGljc2VhcmNoLnltbCIpOworCisJCWlmIChzeXN0ZW1SZXNvdXJjZUVsYXN0aWNzZWFyY2hQYXRoICE9IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygidHJ5IHRvIGNyZWF0ZSBVUkkgZm9yIHt9Iiwgc3lzdGVtUmVzb3VyY2VFbGFzdGljc2VhcmNoUGF0aC50b1N0cmluZygpKTsKKwkJCVBhdGggY2xhc3NwYXRoQ29uZmlnID0gUGF0aHMuZ2V0KHN5c3RlbVJlc291cmNlRWxhc3RpY3NlYXJjaFBhdGgudG9VUkkoKSk7CisJCQlzZXR0aW5ncyA9IFNldHRpbmdzLnNldHRpbmdzQnVpbGRlcigpLmxvYWRGcm9tUGF0aChjbGFzc3BhdGhDb25maWcpLmJ1aWxkKCk7CisJCX0KKwkJU3RyaW5nIGNvbmZpZ0hvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbmZpZy5ob21lIik7CisJCWlmIChjb25maWdIb21lICE9IG51bGwgJiYgZmFsc2UgPT0gY29uZmlnSG9tZS5pc0VtcHR5KCkpIHsKKwkJCXRyeSB7CisJCQkJaWYgKFN5c3RlbVV0aWxzLklTX09TX1dJTkRPV1MpIHsKKwkJCQkJdXJsID0gbmV3IFVSTCgiZmlsZTovLy8iICsgY29uZmlnSG9tZSArICIvZWxhc3RpY3NlYXJjaC55bWwiKTsKKwkJCQl9IGVsc2UgeworCQkJCQl1cmwgPSBuZXcgVVJMKCJmaWxlOiIgKyBjb25maWdIb21lICsgIi9lbGFzdGljc2VhcmNoLnltbCIpOworCQkJCX0KKworCQkJCWxvZy5kZWJ1ZygiVVJMIHt9IiwgdXJsKTsKKwkJCQlzZXR0aW5ncyA9IFNldHRpbmdzLnNldHRpbmdzQnVpbGRlcigpLmxvYWRGcm9tUGF0aChQYXRocy5nZXQodXJsLnRvVVJJKCkpKS5idWlsZCgpOworCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHwgVVJJU3ludGF4RXhjZXB0aW9uIGUxKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFVSTCBpbiBvcmRlciB0byBsb2FkIGVsYXN0aWNzZWFyY2ggeW1sIik7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gY3JlYXRlIFVSTCBpbiBvcmRlciB0byBsb2FkIGVsYXN0aWNzZWFyY2ggeW1sIGZyb20gIiArIGNvbmZpZ0hvbWUpOworCQkJfQorCQl9CisJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHNldHRpbmdzIG9mIGVsYXN0aWNzZWFyY2ggeW1sIik7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZhaWxlZCB0byBjcmVhdGUgVVJMIGluIG9yZGVyIHRvIGxvYWQgZWxhc3RpY3NlYXJjaCB5bWwgZnJvbSAiICsgY29uZmlnSG9tZSk7CisJCX0KKwkJaWYgKGlzVHJhbnNwb3J0Q2xpZW50KCkpIHsKKwkJCWxvZy5pbmZvKCIqKioqKioqIEVsYXN0aWNTZWFyY2hDbGllbnQgdHlwZSBpcyBUcmFuc3BvcnQgQ2xpZW50ICoqKioqIik7CisJCQlUcmFuc3BvcnRDbGllbnQgdHJhbnNwb3J0Q2xpZW50ID0gVHJhbnNwb3J0Q2xpZW50LmJ1aWxkZXIoKS5hZGRQbHVnaW4oU2hpZWxkUGx1Z2luLmNsYXNzKS5zZXR0aW5ncyhzZXR0aW5ncykKKwkJCQkJLmJ1aWxkKCk7CisKKwkJCVN0cmluZ1tdIG5vZGVzQXJyYXkgPSB0cmFuc3BvcnRDbGllbnQuc2V0dGluZ3MoKS5nZXRBc0FycmF5KCJ0cmFuc3BvcnQuY2xpZW50LmluaXRpYWxfbm9kZXMiKTsKKwkJCWZvciAoU3RyaW5nIGhvc3QgOiBub2Rlc0FycmF5KSB7CisJCQkJaW50IHBvcnQgPSA5MzAwOworCisJCQkJLy8gb3IgcGFyc2UgaXQgZnJvbSB0aGUgaG9zdCBzdHJpbmcuLi4KKwkJCQlTdHJpbmdbXSBzcGxpdEhvc3QgPSBob3N0LnNwbGl0KCI6IiwgMik7CisJCQkJaWYgKHNwbGl0SG9zdC5sZW5ndGggPT0gMikgeworCQkJCQlob3N0ID0gc3BsaXRIb3N0WzBdOworCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChzcGxpdEhvc3RbMV0pOworCQkJCX0KKworCQkJCXRyYW5zcG9ydENsaWVudC5hZGRUcmFuc3BvcnRBZGRyZXNzKG5ldyBJbmV0U29ja2V0VHJhbnNwb3J0QWRkcmVzcyhuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCkpKTsKKworCQkJfQorCQkJdGhpcy5jbGllbnQgPSB0cmFuc3BvcnRDbGllbnQ7CisJCQlzZXJ2ZXJIb3N0ID0gQXJyYXlzLnRvU3RyaW5nKG5vZGVzQXJyYXkpOworCisJCX0gZWxzZSB7CisJCQlsb2cuaW5mbygiKioqKioqKiBFbGFzdGljU2VhcmNoQ2xpZW50IHR5cGUgaXMgTm9kZSBDbGllbnQgKioqKioiKTsKKwkJCXRoaXMubm9kZSA9IE5vZGVCdWlsZGVyLm5vZGVCdWlsZGVyKCkuc2V0dGluZ3Moc2V0dGluZ3MpLmNsaWVudCghaXNMb2NhbCkuY2x1c3Rlck5hbWUodGhpcy5jbHVzdGVyTmFtZSkKKwkJCQkJLmxvY2FsKGlzTG9jYWwpLm5vZGUoKTsKKwkJCXRoaXMuY2xpZW50ID0gbm9kZS5jbGllbnQoKTsKKworCQkJc2VydmVySG9zdCA9IHRoaXMuY2xpZW50LnNldHRpbmdzKCkuZ2V0KCJkaXNjb3ZlcnkuemVuLnBpbmcudW5pY2FzdC5ob3N0cyIpOworCQkJaWYgKHNlcnZlckhvc3QgPT0gbnVsbCkgeworCQkJCXNlcnZlckhvc3QgPSAiWydsb2NhbGhvc3Q6OTIwMCddIjsKKwkJCX0KKworCQl9CisKKwkJc2VydmVyUG9ydCA9IHRoaXMuY2xpZW50LnNldHRpbmdzKCkuZ2V0KCJodHRwLnBvcnQiKTsKKwkJaWYgKHNlcnZlclBvcnQgPT0gbnVsbCkgeworCQkJc2VydmVyUG9ydCA9ICI5MjAwIjsKKwkJfQorCisJCWxvZy5pbmZvKCJJbml0aWFsaXplZCBFbGFzdGljU2VhcmNoIGNsaWVudCBmb3IgY2x1c3RlciA8e30+IHdpdGggbm9kZXM6IHt9IiwgdGhpcy5jbHVzdGVyTmFtZSwgc2VydmVySG9zdCk7CisJfQorCisJQFByZURlc3Ryb3kKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJaWYgKGNsaWVudCAhPSBudWxsKSB7CisJCQljbGllbnQuY2xvc2UoKTsKKwkJfQorCQlpZiAobm9kZSAhPSBudWxsKSB7CisJCQlub2RlLmNsb3NlKCk7CisJCX0KKwkJbG9nLmluZm8oIkNsb3NlZCBFbGFzdGljU2VhcmNoIGNsaWVudCBmb3IgY2x1c3RlciA8IiArIHRoaXMuY2x1c3Rlck5hbWUgKyAiPiIpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgZWxhc3RpYyBzZWFyY2ggY2xpZW50LgorCSAqIAorCSAqIEByZXR1cm4gVGhlIGVsYXN0aWMgc2VhcmNoIGNsaWVudC4KKwkgKi8KKwlwdWJsaWMgQ2xpZW50IGdldENsaWVudCgpIHsKKwkJcmV0dXJuIHRoaXMuY2xpZW50OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySG9zdCgpIHsKKwkJcmV0dXJuIHNlcnZlckhvc3Q7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJQb3J0KCkgeworCQlyZXR1cm4gc2VydmVyUG9ydDsKKwl9CisKKwkvKioKKwkgKiBXYWl0IGZvciBncmVlbiBzdGF0dXMgZm9yIHRoZSBnaXZlbiBpbmRpY2VzLgorCSAqIAorCSAqIEBwYXJhbSBpbmRpY2VzCisJICogICAgICAgICAgICBUaGUgaW5kaWNlcyB0byB3YWl0IGZvci4KKwkgKiBAcmV0dXJuIEEge0BsaW5rIENsdXN0ZXJIZWFsdGhSZXNwb25zZX0gdGhhdCBjb250YWlucyB0aGUgY2x1c3RlciBoZWFsdGgKKwkgKiAgICAgICAgIGFmdGVyIHdhaXRpbmcgbWF4aW11bSA1IG1pbnV0ZXMgZm9yIGdyZWVuIHN0YXR1cy4KKwkgKi8KKwlwdWJsaWMgQ2x1c3RlckhlYWx0aFJlc3BvbnNlIHdhaXRGb3JHcmVlblN0YXR1cyhTdHJpbmcuLi4gaW5kaWNlcykgeworCQlDbHVzdGVySGVhbHRoQWN0aW9uIGhlYWx0aEFjdGlvbiA9IENsdXN0ZXJIZWFsdGhBY3Rpb24uSU5TVEFOQ0U7CisKKwkJQ2x1c3RlckhlYWx0aFJlcXVlc3RCdWlsZGVyIGJ1aWxkZXIgPSBoZWFsdGhBY3Rpb24ubmV3UmVxdWVzdEJ1aWxkZXIodGhpcy5jbGllbnQuYWRtaW4oKS5jbHVzdGVyKCkpOworCQlidWlsZGVyLnNldEluZGljZXMoaW5kaWNlcyk7CisJCWJ1aWxkZXIuc2V0V2FpdEZvckdyZWVuU3RhdHVzKCk7CisJCWJ1aWxkZXIuc2V0VGltZW91dChUaW1lVmFsdWUudGltZVZhbHVlU2Vjb25kcygzMCkpOworCQlDbHVzdGVySGVhbHRoUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKTsKKwkJbG9nLmRlYnVnKCJnZXRTdGF0dXMgICAgICAgICAgICAgICAgOiB7fSIsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKwkJbG9nLmRlYnVnKCJnZXRBY3RpdmVQcmltYXJ5U2hhcmRzICAgOiB7fSIsIHJlc3BvbnNlLmdldEFjdGl2ZVByaW1hcnlTaGFyZHMoKSk7CisJCWxvZy5kZWJ1ZygiZ2V0QWN0aXZlU2hhcmRzICAgICAgICAgIDoge30iLCByZXNwb25zZS5nZXRBY3RpdmVTaGFyZHMoKSk7CisJCWxvZy5kZWJ1ZygiZ2V0SW5pdGlhbGl6aW5nU2hhcmRzICAgIDoge30iLCByZXNwb25zZS5nZXRJbml0aWFsaXppbmdTaGFyZHMoKSk7CisJCWxvZy5kZWJ1ZygiZ2V0TnVtYmVyT2ZEYXRhTm9kZXMgICAgIDoge30iLCByZXNwb25zZS5nZXROdW1iZXJPZkRhdGFOb2RlcygpKTsKKwkJbG9nLmRlYnVnKCJnZXROdW1iZXJPZk5vZGVzICAgICAgICAgOiB7fSIsIHJlc3BvbnNlLmdldE51bWJlck9mTm9kZXMoKSk7CisJCWxvZy5kZWJ1ZygiZ2V0UmVsb2NhdGluZ1NoYXJkcyAgICAgIDoge30iLCByZXNwb25zZS5nZXRSZWxvY2F0aW5nU2hhcmRzKCkpOworCQlsb2cuZGVidWcoImdldFVuYXNzaWduZWRTaGFyZHMgICAgICA6IHt9IiwgcmVzcG9uc2UuZ2V0VW5hc3NpZ25lZFNoYXJkcygpKTsKKwkJbG9nLmRlYnVnKCJnZXRBbGxWYWxpZGF0aW9uRmFpbHVyZXMgOiB7fSIsIHJlc3BvbnNlLmdldEFsbFZhbGlkYXRpb25GYWlsdXJlcygpKTsKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCUBWYWx1ZSgiI3tlbGFzdGljc2VhcmNoQ29uZmlnWydjbHVzdGVyLm5hbWUnXX0iKQorCXB1YmxpYyB2b2lkIHNldENsdXN0ZXJOYW1lKGZpbmFsIFN0cmluZyBjbHVzdGVyTmFtZSkgeworCQl0aGlzLmNsdXN0ZXJOYW1lID0gY2x1c3Rlck5hbWU7CisJfQorCisJQFZhbHVlKCIje2VsYXN0aWNzZWFyY2hDb25maWdbJ2VsYXN0aWNTZWFyY2gubG9jYWwnXX0iKQorCXB1YmxpYyB2b2lkIHNldExvY2FsKGZpbmFsIFN0cmluZyBzdHJJc0xvY2FsKSB7CisJCWlmIChzdHJJc0xvY2FsICE9IG51bGwgJiYgIXN0cklzTG9jYWwuaXNFbXB0eSgpKQorCQkJdGhpcy5pc0xvY2FsID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oc3RySXNMb2NhbCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNUcmFuc3BvcnRDbGllbnQoKSB7CisJCXJldHVybiBpc1RyYW5zcG9ydENsaWVudDsKKwl9CisKKwlAVmFsdWUoIiN7ZWxhc3RpY3NlYXJjaENvbmZpZ1snZWxhc3RpY1NlYXJjaC50cmFuc3BvcnRjbGllbnQnXX0iKQorCXB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydENsaWVudChmaW5hbCBTdHJpbmcgc3RySXNUcmFuc3BvcnRjbGllbnQpIHsKKwkJaWYgKHN0cklzVHJhbnNwb3J0Y2xpZW50ICE9IG51bGwgJiYgIXN0cklzVHJhbnNwb3J0Y2xpZW50LmlzRW1wdHkoKSkKKwkJCXRoaXMuaXNUcmFuc3BvcnRDbGllbnQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihzdHJJc1RyYW5zcG9ydGNsaWVudCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9HcmFwaEVsZW1lbnRGYWN0b3J5LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9HcmFwaEVsZW1lbnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5M2MyMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL0dyYXBoRWxlbWVudEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFbGVtZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuUmVsYXRpb25FbmRQb2ludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BcnRpZmFjdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXR0cmlidXRlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BdHRyaWJ1dGVWYWx1ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eUluc3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlUeXBlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRJbnN0YW5jZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29uc3VtZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkRhdGFUeXBlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5HcmFwaE5vZGVMb2NrOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkdyb3VwRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Hcm91cFR5cGVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkhlYXRQYXJhbWV0ZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkhlYXRQYXJhbWV0ZXJWYWx1ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuSW5wdXRWYWx1ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuSW5wdXRzRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5JbnRlcmZhY2VEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLk9wZXJhdGlvbkRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUG9saWN5VHlwZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvZHVjdE1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9wZXJ0eURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlWYWx1ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVsYXRpb25zaGlwSW5zdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVxdWlyZW1lbnREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlcXVpcmVtZW50SW1wbERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VDYXRlZ29yeURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuU2VydmljZUNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5TZXJ2aWNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlRhZ0RhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckZ1bmN0aW9uYWxNZW51RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeS5DYXRlZ29yeURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuR3JvdXBpbmdEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGF0YTsKKworcHVibGljIGNsYXNzIEdyYXBoRWxlbWVudEZhY3RvcnkgeworCisJcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gVCBjcmVhdGVFbGVtZW50KFN0cmluZyBsYWJlbCwgR3JhcGhFbGVtZW50VHlwZUVudW0gdHlwZSwKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcywgQ2xhc3M8VD4gY2xhenopIHsKKwkJVCBlbGVtZW50ID0gbnVsbDsKKworCQlpZiAodHlwZS5lcXVhbHMoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSkpIHsKKwkJCWVsZW1lbnQgPSBjcmVhdGVOb2RlKGxhYmVsLCBwcm9wZXJ0aWVzLCBjbGF6eik7CisJCX0KKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJcHVibGljIHN0YXRpYyBHcmFwaE5vZGUgY3JlYXRlRWxlbWVudChTdHJpbmcgbGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlHcmFwaE5vZGUgZWxlbWVudCA9IG51bGw7CisKKwkJaWYgKHR5cGUuZXF1YWxzKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpKSB7CisJCQllbGVtZW50ID0gY3JlYXRlTm9kZShsYWJlbCwgcHJvcGVydGllcyk7CisJCX0KKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJcHVibGljIHN0YXRpYyBHcmFwaFJlbGF0aW9uIGNyZWF0ZVJlbGF0aW9uKFN0cmluZyB0eXBlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMsIEdyYXBoTm9kZSBmcm9tLAorCQkJR3JhcGhOb2RlIHRvKSB7CisJCUdyYXBoUmVsYXRpb24gZWxlbWVudCA9IG5ldyBHcmFwaFJlbGF0aW9uKHR5cGUpOworCQlSZWxhdGlvbkVuZFBvaW50IGVuZFBPaW50RnJvbSA9IG5ldyBSZWxhdGlvbkVuZFBvaW50KE5vZGVUeXBlRW51bS5nZXRCeU5hbWUoZnJvbS5nZXRMYWJlbCgpKSwKKwkJCQlmcm9tLmdldFVuaXF1ZUlkS2V5KCksIGZyb20uZ2V0VW5pcXVlSWQoKSk7CisJCVJlbGF0aW9uRW5kUG9pbnQgZW5kUE9pbnRUbyA9IG5ldyBSZWxhdGlvbkVuZFBvaW50KE5vZGVUeXBlRW51bS5nZXRCeU5hbWUodG8uZ2V0TGFiZWwoKSksIHRvLmdldFVuaXF1ZUlkS2V5KCksCisJCQkJdG8uZ2V0VW5pcXVlSWQoKSk7CisJCWVsZW1lbnQuc2V0RnJvbShlbmRQT2ludEZyb20pOworCQllbGVtZW50LnNldFRvKGVuZFBPaW50VG8pOworCQllbGVtZW50LmFkZFByb3BlcnRpcyhwcm9wZXJ0aWVzKTsKKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgR3JhcGhOb2RlIGNyZWF0ZU5vZGUoU3RyaW5nIGxhYmVsLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJR3JhcGhOb2RlIGVsZW1lbnQgPSBudWxsOworCQlOb2RlVHlwZUVudW0gdHlwZSA9IE5vZGVUeXBlRW51bS5nZXRCeU5hbWUobGFiZWwpOworCQlpZiAodHlwZSAhPSBudWxsKSB7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgVXNlcjoKKwkJCQllbGVtZW50ID0gbmV3IFVzZXJEYXRhKHByb3BlcnRpZXMpOworCQkJCWJyZWFrOworCQkJY2FzZSBSZXNvdXJjZUNhdGVnb3J5OgorCQkJCWVsZW1lbnQgPSBuZXcgUmVzb3VyY2VDYXRlZ29yeURhdGEocHJvcGVydGllcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNlcnZpY2VDYXRlZ29yeToKKwkJCQllbGVtZW50ID0gbmV3IFNlcnZpY2VDYXRlZ29yeURhdGEocHJvcGVydGllcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRhZzoKKwkJCQllbGVtZW50ID0gbmV3IFRhZ0RhdGEocHJvcGVydGllcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNlcnZpY2U6CisJCQkJZWxlbWVudCA9IG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhKHByb3BlcnRpZXMpOworCQkJCWJyZWFrOworCQkJY2FzZSBSZXNvdXJjZToKKwkJCQllbGVtZW50ID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKHByb3BlcnRpZXMpOworCQkJCWJyZWFrOworCQkJY2FzZSBQcm9wZXJ0eToKKwkJCQllbGVtZW50ID0gbmV3IFByb3BlcnR5RGF0YShwcm9wZXJ0aWVzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSGVhdFBhcmFtZXRlcjoKKwkJCQllbGVtZW50ID0gbmV3IEhlYXRQYXJhbWV0ZXJEYXRhKHByb3BlcnRpZXMpOworCQkJCWJyZWFrOworCQkJY2FzZSBIZWF0UGFyYW1ldGVyVmFsdWU6CisJCQkJZWxlbWVudCA9IG5ldyBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhKHByb3BlcnRpZXMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBlbGVtZW50OworCX0KKworCXByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBUIGNyZWF0ZU5vZGUoU3RyaW5nIGxhYmVsLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMsIENsYXNzPFQ+IGNsYXp6KSB7CisJCVQgZWxlbWVudCA9IG51bGw7CisJCU5vZGVUeXBlRW51bSB0eXBlID0gTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShsYWJlbCk7CisJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBVc2VyOgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBVc2VyRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJlc291cmNlQ2F0ZWdvcnk6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IFJlc291cmNlQ2F0ZWdvcnlEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU2VydmljZUNhdGVnb3J5OgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBTZXJ2aWNlQ2F0ZWdvcnlEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUmVzb3VyY2VOZXdDYXRlZ29yeToKKwkJCWNhc2UgU2VydmljZU5ld0NhdGVnb3J5OgorCQkJY2FzZSBQcm9kdWN0Q2F0ZWdvcnk6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IENhdGVnb3J5RGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJlc291cmNlU3ViY2F0ZWdvcnk6CisJCQljYXNlIFByb2R1Y3RTdWJjYXRlZ29yeToKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgU3ViQ2F0ZWdvcnlEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUHJvZHVjdEdyb3VwaW5nOgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBHcm91cGluZ0RhdGEocHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBUYWc6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IFRhZ0RhdGEocHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBTZXJ2aWNlOgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUHJvZHVjdDoKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgUHJvZHVjdE1ldGFkYXRhRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJlc291cmNlOgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEF0dHJpYnV0ZToKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgQXR0cmlidXRlRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFByb3BlcnR5OgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBQcm9wZXJ0eURhdGEocHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBDYXBhYmlsaXR5VHlwZToKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgQ2FwYWJpbGl0eVR5cGVEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUmVxdWlyZW1lbnQ6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IFJlcXVpcmVtZW50RGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJlcXVpcmVtZW50SW1wbDoKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgUmVxdWlyZW1lbnRJbXBsRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENhcGFiaWxpdHk6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IENhcGFiaWxpdHlEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ2FwYWJpbGl0eUluc3Q6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IENhcGFiaWxpdHlJbnN0RGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFByb3BlcnR5VmFsdWU6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IFByb3BlcnR5VmFsdWVEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQXR0cmlidXRlVmFsdWU6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IEF0dHJpYnV0ZVZhbHVlRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElucHV0VmFsdWU6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IElucHV0VmFsdWVEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUmVsYXRpb25zaGlwVHlwZToKKwkJCQlicmVhazsKKwkJCWNhc2UgTG9ja05vZGU6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IEdyYXBoTm9kZUxvY2socHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBBcnRpZmFjdFJlZjoKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgQXJ0aWZhY3REYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSW50ZXJmYWNlOgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBJbnRlcmZhY2VEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSW50ZXJmYWNlT3BlcmF0aW9uOgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBPcGVyYXRpb25EYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSW5wdXQ6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IElucHV0c0RhdGEocHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBSZXNvdXJjZUluc3RhbmNlOgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBDb21wb25lbnRJbnN0YW5jZURhdGEocHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBSZWxhdGlvbnNoaXBJbnN0OgorCQkJCWVsZW1lbnQgPSBjbGF6ei5jYXN0KG5ldyBSZWxhdGlvbnNoaXBJbnN0RGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyczoKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ29uc3VtZXJDcmVkZW50aWFsczoKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgQ29uc3VtZXJEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSGVhdFBhcmFtZXRlcjoKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgSGVhdFBhcmFtZXRlckRhdGEocHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBIZWF0UGFyYW1ldGVyVmFsdWU6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEocHJvcGVydGllcykpOworCQkJCWJyZWFrOworCQkJY2FzZSBEYXRhVHlwZToKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgRGF0YVR5cGVEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgR3JvdXA6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IEdyb3VwRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEdyb3VwVHlwZToKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgR3JvdXBUeXBlRGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVzZXJGdW5jdGlvbmFsTWVudToKKwkJCQllbGVtZW50ID0gY2xhenouY2FzdChuZXcgVXNlckZ1bmN0aW9uYWxNZW51RGF0YShwcm9wZXJ0aWVzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBvbGljeVR5cGU6CisJCQkJZWxlbWVudCA9IGNsYXp6LmNhc3QobmV3IFBvbGljeVR5cGVEYXRhKHByb3BlcnRpZXMpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKwkJfQorCQlyZXR1cm4gZWxlbWVudDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0FjdGlvbkVudW0uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0FjdGlvbkVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VmNThkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vZ3JhcGgvZGF0YXR5cGUvQWN0aW9uRW51bS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGU7CisKK3B1YmxpYyBlbnVtIEFjdGlvbkVudW0geworCUNyZWF0ZSwgVXBkYXRlLCBEZWxldGUsIE5vQWN0aW9uCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9BZGRpdGlvbmFsSW5mb3JtYXRpb25FbnVtLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9BZGRpdGlvbmFsSW5mb3JtYXRpb25FbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1OWVmOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0FkZGl0aW9uYWxJbmZvcm1hdGlvbkVudW0uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlOworCitwdWJsaWMgZW51bSBBZGRpdGlvbmFsSW5mb3JtYXRpb25FbnVtIHsKKwlMYWJlbCwgVmFsdWUsIE5vbmU7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9HcmFwaEVkZ2UuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0dyYXBoRWRnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTVmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9HcmFwaEVkZ2UuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CisKK3B1YmxpYyBjbGFzcyBHcmFwaEVkZ2UgeworCisJcHJpdmF0ZSBHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGU7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKKworCXB1YmxpYyBHcmFwaEVkZ2UoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEdyYXBoRWRnZShHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlzdXBlcigpOworCQl0aGlzLmVkZ2VUeXBlID0gZWRnZVR5cGU7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIEdyYXBoRWRnZUxhYmVscyBnZXRFZGdlVHlwZSgpIHsKKwkJcmV0dXJuIGVkZ2VUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVkZ2VUeXBlKEdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZSkgeworCQl0aGlzLmVkZ2VUeXBlID0gZWRnZVR5cGU7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChlZGdlVHlwZSA9PSBudWxsKSA/IDAgOiBlZGdlVHlwZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHByb3BlcnRpZXMgPT0gbnVsbCkgPyAwIDogcHJvcGVydGllcy5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJR3JhcGhFZGdlIG90aGVyID0gKEdyYXBoRWRnZSkgb2JqOworCQlpZiAoZWRnZVR5cGUgIT0gb3RoZXIuZWRnZVR5cGUpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5wcm9wZXJ0aWVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFwcm9wZXJ0aWVzLmVxdWFscyhvdGhlci5wcm9wZXJ0aWVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJHcmFwaEVkZ2UgW2VkZ2VUeXBlPSIgKyBlZGdlVHlwZSArICIsIHByb3BlcnRpZXM9IiArIHByb3BlcnRpZXMgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9HcmFwaEVsZW1lbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0dyYXBoRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MGUyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9HcmFwaEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoRWxlbWVudCB7CisKKwlwcml2YXRlIEdyYXBoRWxlbWVudFR5cGVFbnVtIGVsZW1lbnRUeXBlOworCXByaXZhdGUgQWN0aW9uRW51bSBhY3Rpb247CisKKwlwcm90ZWN0ZWQgR3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudFR5cGVFbnVtIGVsZW1lbnRUeXBlKSB7CisJCXRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKwkJdGhpcy5hY3Rpb24gPSBBY3Rpb25FbnVtLk5vQWN0aW9uOworCX0KKworCXB1YmxpYyBHcmFwaEVsZW1lbnRUeXBlRW51bSBnZXRFbGVtZW50VHlwZSgpIHsKKwkJcmV0dXJuIGVsZW1lbnRUeXBlOworCX0KKworCXB1YmxpYyBBY3Rpb25FbnVtIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oQWN0aW9uRW51bSBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoR3JhcGhFbGVtZW50VHlwZUVudW0gZWxlbWVudFR5cGUpIHsKKwkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworCX0KKworCXB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiR3JhcGhFbGVtZW50IFtlbGVtZW50VHlwZT0iICsgZWxlbWVudFR5cGUgKyAiLCBhY3Rpb249IiArIGFjdGlvbiArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0dyYXBoRWxlbWVudFR5cGVFbnVtLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9HcmFwaEVsZW1lbnRUeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMzliM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9ncmFwaC9kYXRhdHlwZS9HcmFwaEVsZW1lbnRUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGU7CisKK3B1YmxpYyBlbnVtIEdyYXBoRWxlbWVudFR5cGVFbnVtIHsKKwlOb2RlLCBSZWxhdGlvbnNoaXAKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0dyYXBoTm9kZS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vZ3JhcGgvZGF0YXR5cGUvR3JhcGhOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhMTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0dyYXBoTm9kZS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhOb2RlIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlwcml2YXRlIE5vZGVUeXBlRW51bSBsYWJlbDsKKworCXByb3RlY3RlZCBHc29uIGdldEdzb24oKSB7CisJCXJldHVybiBnc29uOworCX0KKworCXByb3RlY3RlZCBHcmFwaE5vZGUoTm9kZVR5cGVFbnVtIGxhYmVsKSB7CisJCXN1cGVyKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gbGFiZWwuZ2V0TmFtZSgpOworCX0KKworCXB1YmxpYyBJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBnZXRLZXlWYWx1ZUlkKCkgeworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZSA9IG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PihnZXRVbmlxdWVJZEtleSgpLCBnZXRVbmlxdWVJZCgpKTsKKwkJcmV0dXJuIGtleVZhbHVlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZElmRXhpc3RzKE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5IHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXApIHsKKwkJCQl2YWx1ZSA9IGdldEdzb24oKS50b0pzb24odmFsdWUpOworCQkJfQorCQkJbWFwLnB1dChwcm9wZXJ0eS5nZXRQcm9wZXJ0eSgpLCB2YWx1ZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkS2V5KCkgeworCQlyZXR1cm4gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKTsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFVuaXF1ZUlkKCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkdyYXBoTm9kZSBbbGFiZWw9IiArIGxhYmVsICsgIiwgcGFyZW50OiAiICsgc3VwZXIudG9TdHJpbmcoKSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0dyYXBoUmVsYXRpb24uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL0dyYXBoUmVsYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZkMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vZ3JhcGgvZGF0YXR5cGUvR3JhcGhSZWxhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIEdyYXBoUmVsYXRpb24gZXh0ZW5kcyBHcmFwaEVsZW1lbnQgeworCisJcHJpdmF0ZSBSZWxhdGlvbkVuZFBvaW50IGZyb207CisJcHJpdmF0ZSBSZWxhdGlvbkVuZFBvaW50IHRvOworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisKKwlwdWJsaWMgR3JhcGhSZWxhdGlvbigpIHsKKwkJc3VwZXIoR3JhcGhFbGVtZW50VHlwZUVudW0uUmVsYXRpb25zaGlwKTsKKwkJcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCX0KKworCXB1YmxpYyBHcmFwaFJlbGF0aW9uKFN0cmluZyB0eXBlKSB7CisJCXN1cGVyKEdyYXBoRWxlbWVudFR5cGVFbnVtLlJlbGF0aW9uc2hpcCk7CisJCXByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJc2V0VHlwZSh0eXBlKTsKKwl9CisKKwlwdWJsaWMgUmVsYXRpb25FbmRQb2ludCBnZXRGcm9tKCkgeworCQlyZXR1cm4gZnJvbTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGcm9tKFJlbGF0aW9uRW5kUG9pbnQgZnJvbSkgeworCQl0aGlzLmZyb20gPSBmcm9tOworCX0KKworCXB1YmxpYyBSZWxhdGlvbkVuZFBvaW50IGdldFRvKCkgeworCQlyZXR1cm4gdG87CisJfQorCisJcHVibGljIHZvaWQgc2V0VG8oUmVsYXRpb25FbmRQb2ludCB0bykgeworCQl0aGlzLnRvID0gdG87CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKKwkJaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgIXByb3BlcnR5LmlzRW1wdHkoKSAmJiB2YWx1ZSAhPSBudWxsKSB7CisJCQlwcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eSwgdmFsdWUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkUHJvcGVydGlzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMpIHsKKwkJcHJvcGVydGllcy5wdXRBbGwocHJvcHMpOworCX0KKworCXB1YmxpYyB2b2lkIG92ZXJ3cml0ZVByb3BlcnRpcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzKSB7CisJCXByb3BlcnRpZXMgPSBwcm9wczsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworCQlyZXR1cm4gcHJvcGVydGllcy5nZXQocHJvcGVydHkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiR3JhcGhSZWxhdGlvbiBbZnJvbT0iICsgZnJvbSArICIsIHRvPSIgKyB0byArICIsIHR5cGU9IiArIHR5cGUgKyAiLCBwcm9wZXJ0aWVzPSIgKyBwcm9wZXJ0aWVzICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGZyb20gPT0gbnVsbCkgPyAwIDogZnJvbS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHByb3BlcnRpZXMgPT0gbnVsbCkgPyAwIDogcHJvcGVydGllcy5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHRvID09IG51bGwpID8gMCA6IHRvLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodHlwZSA9PSBudWxsKSA/IDAgOiB0eXBlLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL1JlbGF0aW9uRW5kUG9pbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2dyYXBoL2RhdGF0eXBlL1JlbGF0aW9uRW5kUG9pbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDcyNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vZ3JhcGgvZGF0YXR5cGUvUmVsYXRpb25FbmRQb2ludC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFJlbGF0aW9uRW5kUG9pbnQgeworCU5vZGVUeXBlRW51bSBsYWJlbDsKKwlTdHJpbmcgaWROYW1lOworCU9iamVjdCBpZFZhbHVlOworCisJcHVibGljIFJlbGF0aW9uRW5kUG9pbnQoTm9kZVR5cGVFbnVtIGxhYmVsLCBTdHJpbmcgaWROYW1lLCBPYmplY3QgaWRWYWx1ZSkgeworCQlzdXBlcigpOworCQl0aGlzLmxhYmVsID0gbGFiZWw7CisJCXRoaXMuaWROYW1lID0gaWROYW1lOworCQl0aGlzLmlkVmFsdWUgPSBpZFZhbHVlOworCX0KKworCXB1YmxpYyBOb2RlVHlwZUVudW0gZ2V0TGFiZWwoKSB7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChOb2RlVHlwZUVudW0gbGFiZWwpIHsKKwkJdGhpcy5sYWJlbCA9IGxhYmVsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWROYW1lKCkgeworCQlyZXR1cm4gaWROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldElkTmFtZShTdHJpbmcgaWROYW1lKSB7CisJCXRoaXMuaWROYW1lID0gaWROYW1lOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0SWRWYWx1ZSgpIHsKKwkJcmV0dXJuIGlkVmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0SWRWYWx1ZShPYmplY3QgaWRWYWx1ZSkgeworCQl0aGlzLmlkVmFsdWUgPSBpZFZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUmVsYXRpb25FbmRQb2ludCBbbGFiZWw9IiArIGxhYmVsICsgIiwgaWROYW1lPSIgKyBpZE5hbWUgKyAiLCBpZFZhbHVlPSIgKyBpZFZhbHVlICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGlkTmFtZSA9PSBudWxsKSA/IDAgOiBpZE5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpZFZhbHVlID09IG51bGwpID8gMCA6IGlkVmFsdWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChsYWJlbCA9PSBudWxsKSA/IDAgOiBsYWJlbC5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJUmVsYXRpb25FbmRQb2ludCBvdGhlciA9IChSZWxhdGlvbkVuZFBvaW50KSBvYmo7CisJCWlmIChpZE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmlkTmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaWROYW1lLmVxdWFscyhvdGhlci5pZE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaWRWYWx1ZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuaWRWYWx1ZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaWRWYWx1ZS5lcXVhbHMob3RoZXIuaWRWYWx1ZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChsYWJlbCAhPSBvdGhlci5sYWJlbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL0F1ZGl0aW5nRGFvLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL0F1ZGl0aW5nRGFvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmNDc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2ltcGwvQXVkaXRpbmdEYW8uamF2YQpAQCAtMCwwICsxLDI2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guaW5kZXgucXVlcnkuQm9vbFF1ZXJ5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5pbmRleC5xdWVyeS5RdWVyeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guaW5kZXgucXVlcnkuUXVlcnlCdWlsZGVyczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5BdWRpdGluZ0FjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdHZW5lcmljRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmcuQXVkaXRpbmdUeXBlc0NvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZy5SZXNvdXJjZUFkbWluRXZlbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkVTVGltZUJhc2VkRXZlbnQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImF1ZGl0aW5nRGFvIikKK3B1YmxpYyBjbGFzcyBBdWRpdGluZ0RhbyBleHRlbmRzIEVTVGltZUJhc2VkRGFvIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOU1RBTkNFX0lEX0ZJRUxEID0gQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lECisJCQkuZ2V0RGlzcGxheU5hbWUoKTsgLy8gInNlcnZpY2VJbnN0YW5jZUlkIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX0ZJRUxEID0gQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMuZ2V0RGlzcGxheU5hbWUoKTsgLy8gInN0YXR1cyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9GSUVMRCA9IEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLmdldERpc3BsYXlOYW1lKCk7IC8vICJhY3Rpb24iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNUUklCVVRJT05fSURfRklFTEQgPSBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRC5nZXREaXNwbGF5TmFtZSgpOyAvLyAiZGlzdHJpYnV0aW9uSWQiOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBdWRpdGluZ0Rhby5jbGFzcy5nZXROYW1lKCkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElUSU5HX0lOREVYID0gImF1ZGl0aW5nZXZlbnRzIjsKKworCUBQb3N0Q29uc3RydWN0CisJcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisJCUF1ZGl0aW5nQWN0aW9uRW51bVtdIHZhbHVlcyA9IEF1ZGl0aW5nQWN0aW9uRW51bS52YWx1ZXMoKTsKKwkJZm9yIChBdWRpdGluZ0FjdGlvbkVudW0gdmFsdWUgOiB2YWx1ZXMpIHsKKwkJCXR5cGVzVG9DbGFzc2VzLnB1dCh2YWx1ZS5nZXRBdWRpdGluZ0VzVHlwZSgpLCBFU1RpbWVCYXNlZEV2ZW50LmNsYXNzKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhQcmVmaXgoKSB7CisJCXJldHVybiBBVURJVElOR19JTkRFWDsKKwl9CisKKwlwdWJsaWMgQWN0aW9uU3RhdHVzIGFkZFJlY29yZChNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMsIFN0cmluZyB0eXBlKSB7CisKKwkJLy8gVE9ETyByaGFsaWxpIC0gcmVtb3ZlPyBjaGVjayBkZWJ1Z0VuYWJsZWQ/CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gZGlzcGxheUZpZWxkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZm9yIChFbnRyeTxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGVudHJ5IDogcGFyYW1zLmVudHJ5U2V0KCkpIHsKKwkJCWRpc3BsYXlGaWVsZHMucHV0KGVudHJ5LmdldEtleSgpLmdldERpc3BsYXlOYW1lKCksIGVudHJ5LmdldFZhbHVlKCkpOworCQkJc2IuYXBwZW5kKGVudHJ5LmdldEtleSgpLmdldERpc3BsYXlOYW1lKCkpLmFwcGVuZCgiID0gIikuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgiLCIpOworCQl9CisKKwkJLy8gUGVyc2lzaXRpbmcKKwkJLy8gU3RyaW5nIHR5cGUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJQXVkaXRpbmdHZW5lcmljRXZlbnQgYXVkaXRpbmdHZW5lcmljRXZlbnQgPSBuZXcgQXVkaXRpbmdHZW5lcmljRXZlbnQoKTsKKwkJcG9wdWxhdGVDb21tb25GaWVsZHMocGFyYW1zLCBhdWRpdGluZ0dlbmVyaWNFdmVudCk7CisJCWF1ZGl0aW5nR2VuZXJpY0V2ZW50LmdldEZpZWxkcygpLnB1dEFsbChkaXNwbGF5RmllbGRzKTsKKworCQlsb2cuZGVidWcoIkF1ZGl0aW5nOiBQZXJzaXN0aW5nIG9iamVjdCBvZiB0eXBlIHt9LCBmaWVsZHM6IHt9IiwgdHlwZSwgc2IudG9TdHJpbmcoKSk7CisKKwkJcmV0dXJuIHdyaXRlKHR5cGUsIGF1ZGl0aW5nR2VuZXJpY0V2ZW50KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8RVNUaW1lQmFzZWRFdmVudD4sIEFjdGlvblN0YXR1cz4gZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU3RhdHVzZXMoU3RyaW5nIGRpZCkgeworCisJCVF1ZXJ5QnVpbGRlciBjb21wb25lbnROYW1lTWF0Y2ggPSBRdWVyeUJ1aWxkZXJzLm1hdGNoUXVlcnkoRElTVFJJQlVUSU9OX0lEX0ZJRUxELCBkaWQpOworCQlRdWVyeUJ1aWxkZXIgY29tcG9uZW50VmVyc2lvbk1hdGNoID0gUXVlcnlCdWlsZGVycy5tYXRjaFF1ZXJ5KEFDVElPTl9GSUVMRCwKKwkJCQlBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX1NUQVRVUy5nZXROYW1lKCkpOworCQlRdWVyeUJ1aWxkZXIgcmVtYWluaW5nRWxlbWVudFF1ZXJ5QnVpbGRlciA9IFF1ZXJ5QnVpbGRlcnMuYm9vbFF1ZXJ5KCkubXVzdChjb21wb25lbnROYW1lTWF0Y2gpCisJCQkJLm11c3QoY29tcG9uZW50VmVyc2lvbk1hdGNoKTsKKwkJTGlzdDxFU1RpbWVCYXNlZEV2ZW50PiByZW1haW5pbmdFbGVtZW50cyA9IG51bGw7CisJCXRyeSB7CisJCQlyZW1haW5pbmdFbGVtZW50cyA9IGN1c3RvbUZpbmRFdmVudChBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9TVEFUVVNfRVZFTlRfVFlQRSwKKwkJCQkJcmVtYWluaW5nRWxlbWVudFF1ZXJ5QnVpbGRlciwgbnVsbCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwKKwkJCQkJIkdldCBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiR2V0IERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGRpc3RyaWJ1dGlvbiBzdGF0dXNlcyBmb3IgIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCQlpZiAocmVtYWluaW5nRWxlbWVudHMgIT0gbnVsbCAmJiAhcmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJub3QgZm91bmQgZGlzdHJpYnV0aW9uIHN0YXR1c2VzIGZvciBkaWQge30iLCBkaWQpOworCQkJcmVtYWluaW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+KCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVtYWluaW5nRWxlbWVudHMpOworCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8RVNUaW1lQmFzZWRFdmVudD4sIEFjdGlvblN0YXR1cz4gZ2V0U2VydmljZURpc3RyaWJ1dGlvblN0YXR1c2VzTGlzdChTdHJpbmcgc2VydmljZUluc3RhbmNlSWQpIHsKKworCQlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+IHJlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+KCk7CisJCVF1ZXJ5QnVpbGRlciBjb21wb25lbnROYW1lTWF0Y2ggPSBRdWVyeUJ1aWxkZXJzLm1hdGNoUXVlcnkoU0VSVklDRV9JTlNUQU5DRV9JRF9GSUVMRCwgc2VydmljZUluc3RhbmNlSWQpOworCQlRdWVyeUJ1aWxkZXIgY29tcG9uZW50VmVyc2lvbk1hdGNoID0gUXVlcnlCdWlsZGVycy5tYXRjaFF1ZXJ5KEFDVElPTl9GSUVMRCwKKwkJCQlBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX1NUQVRFX0NIQU5HRV9SRVFVRVNULmdldE5hbWUoKSk7CisJCVF1ZXJ5QnVpbGRlciByZW1haW5pbmdFbGVtZW50UXVlcnlCdWlsZGVyID0gUXVlcnlCdWlsZGVycy5ib29sUXVlcnkoKS5tdXN0KGNvbXBvbmVudE5hbWVNYXRjaCkKKwkJCQkubXVzdChjb21wb25lbnRWZXJzaW9uTWF0Y2gpOworCQlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+IHJlbWFpbmluZ0VsZW1lbnRzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJlbWFpbmluZ0VsZW1lbnRzID0gY3VzdG9tRmluZEV2ZW50KEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRSwKKwkJCQkJcmVtYWluaW5nRWxlbWVudFF1ZXJ5QnVpbGRlciwgbnVsbCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwKKwkJCQkJIkdldCBTZXJ2aWNlIERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJHZXQgU2VydmljZSBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgIGRpc3RyaWJ1dGlvbiBzdGF0dXNlcyBmb3IgYWN0aW9uIHt9IiwKKwkJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9TVEFURV9DSEFOR0VfUkVRVUVTVC5nZXROYW1lKCksIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwkJaWYgKHJlbWFpbmluZ0VsZW1lbnRzICE9IG51bGwgJiYgIXJlbWFpbmluZ0VsZW1lbnRzLmlzRW1wdHkoKSkgeworCQkJcmVzTGlzdC5hZGRBbGwocmVtYWluaW5nRWxlbWVudHMpOworCQl9CisKKwkJY29tcG9uZW50VmVyc2lvbk1hdGNoID0gUXVlcnlCdWlsZGVycy5tYXRjaFF1ZXJ5KEFDVElPTl9GSUVMRCwKKwkJCQlBdWRpdGluZ0FjdGlvbkVudW0uRElTVFJJQlVUSU9OX0RFUExPWS5nZXROYW1lKCkpOworCQlyZW1haW5pbmdFbGVtZW50UXVlcnlCdWlsZGVyID0gUXVlcnlCdWlsZGVycy5ib29sUXVlcnkoKS5tdXN0KGNvbXBvbmVudE5hbWVNYXRjaCkubXVzdChjb21wb25lbnRWZXJzaW9uTWF0Y2gpOworCQlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+IGRSZXN1bHRFbGVtZW50cyA9IG51bGw7CisJCXRyeSB7CisJCQlkUmVzdWx0RWxlbWVudHMgPSBjdXN0b21GaW5kRXZlbnQoQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fREVQTE9ZX0VWRU5UX1RZUEUsCisJCQkJCXJlbWFpbmluZ0VsZW1lbnRRdWVyeUJ1aWxkZXIsIG51bGwpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsCisJCQkJCSJHZXQgU2VydmljZSBEaXN0cmlidXRpb25TdGF0dXNlcyBMaXN0Iik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiR2V0IFNlcnZpY2UgRGlzdHJpYnV0aW9uU3RhdHVzZXMgTGlzdCIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGRpc3RyaWJ1dGlvbiBzdGF0dXNlcyBmb3IgYWN0aW9uIHt9IiwKKwkJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9ERVBMT1kuZ2V0TmFtZSgpLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJCWlmIChkUmVzdWx0RWxlbWVudHMgIT0gbnVsbCAmJiAhZFJlc3VsdEVsZW1lbnRzLmlzRW1wdHkoKSkgeworCQkJcmVzTGlzdC5hZGRBbGwoZFJlc3VsdEVsZW1lbnRzKTsKKwkJfQorCisJCWNvbXBvbmVudFZlcnNpb25NYXRjaCA9IFF1ZXJ5QnVpbGRlcnMubWF0Y2hRdWVyeShBQ1RJT05fRklFTEQsCisJCQkJQXVkaXRpbmdBY3Rpb25FbnVtLkRJU1RSSUJVVElPTl9OT1RJRlkuZ2V0TmFtZSgpKTsKKwkJcmVtYWluaW5nRWxlbWVudFF1ZXJ5QnVpbGRlciA9IFF1ZXJ5QnVpbGRlcnMuYm9vbFF1ZXJ5KCkubXVzdChjb21wb25lbnROYW1lTWF0Y2gpLm11c3QoY29tcG9uZW50VmVyc2lvbk1hdGNoKTsKKwkJTGlzdDxFU1RpbWVCYXNlZEV2ZW50PiBkTm90aWZ5RWxlbWVudHMgPSBudWxsOworCQl0cnkgeworCQkJZE5vdGlmeUVsZW1lbnRzID0gY3VzdG9tRmluZEV2ZW50KEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX05PVElGSUNBVElPTl9FVkVOVF9UWVBFLAorCQkJCQlyZW1haW5pbmdFbGVtZW50UXVlcnlCdWlsZGVyLCBudWxsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLAorCQkJCQkiR2V0IFNlcnZpY2UgRGlzdHJpYnV0aW9uU3RhdHVzZXMgTGlzdCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkdldCBTZXJ2aWNlIERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBkaXN0cmlidXRpb24gc3RhdHVzZXMgZm9yIGFjdGlvbiB7fSIsCisJCQkJCUF1ZGl0aW5nQWN0aW9uRW51bS5ESVNUUklCVVRJT05fTk9USUZZLmdldE5hbWUoKSwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCQlpZiAocmVtYWluaW5nRWxlbWVudHMgIT0gbnVsbCAmJiAhcmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKSB7CisJCQlyZXNMaXN0LmFkZEFsbChkTm90aWZ5RWxlbWVudHMpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc0xpc3QpOworCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEVTVGltZUJhc2VkRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGdldEZpbHRlcmVkUmVzb3VyY2VBZG1pbkF1ZGl0aW5nRXZlbnRzKAorCQkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gZmlsdGVyTWFwKSB7CisKKwkJSXRlcmF0b3I8RW50cnk8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0Pj4gZmlsdGVySXRyID0gZmlsdGVyTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJQm9vbFF1ZXJ5QnVpbGRlciBib29sUXVlcnkgPSBRdWVyeUJ1aWxkZXJzLmJvb2xRdWVyeSgpOworCQl3aGlsZSAoZmlsdGVySXRyLmhhc05leHQoKSkgeworCQkJRW50cnk8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBjdXJyID0gZmlsdGVySXRyLm5leHQoKTsKKwkJCWJvb2xRdWVyeSA9IGJvb2xRdWVyeS5tdXN0KFF1ZXJ5QnVpbGRlcnMudGVybVF1ZXJ5KGN1cnIuZ2V0S2V5KCkuZ2V0RGlzcGxheU5hbWUoKSwgY3Vyci5nZXRWYWx1ZSgpKSk7CisJCX0KKworCQl0cnkgeworCQkJTGlzdDxFU1RpbWVCYXNlZEV2ZW50PiBjdXN0b21GaW5kRXZlbnQgPSBjdXN0b21GaW5kRXZlbnQoCisJCQkJCVJlc291cmNlQWRtaW5FdmVudC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKSwgYm9vbFF1ZXJ5LCBudWxsKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChjdXN0b21GaW5kRXZlbnQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcXVlcnkgQXVkaXRSZWNvcmRzIGluIGVzIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEVTVGltZUJhc2VkRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGdldExpc3RPZkRpc3RyaWJ1dGlvbkJ5QWN0aW9uKFN0cmluZyBkaWQsIFN0cmluZyBhY3Rpb25UeXBlLAorCQkJU3RyaW5nIHJlcXVlc3RlZFN0YXR1cywgQ2xhc3M8PyBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50PiBjbGF6eikgeworCisJCVF1ZXJ5QnVpbGRlciBkaXN0cmlidXRpb25JZE1hdGNoID0gUXVlcnlCdWlsZGVycy5tYXRjaFF1ZXJ5KERJU1RSSUJVVElPTl9JRF9GSUVMRCwgZGlkKTsKKwkJUXVlcnlCdWlsZGVyIGRpc3RyaWJ1dGlvbkFjdGlvbk1hdGNoID0gUXVlcnlCdWlsZGVycy5tYXRjaFF1ZXJ5KEFDVElPTl9GSUVMRCwgYWN0aW9uVHlwZSk7CisJCVF1ZXJ5QnVpbGRlciByZW1haW5pbmdFbGVtZW50UXVlcnlCdWlsZGVyOworCisJCWlmIChyZXF1ZXN0ZWRTdGF0dXMgIT0gbnVsbCAmJiAhcmVxdWVzdGVkU3RhdHVzLmlzRW1wdHkoKSkgeworCQkJUXVlcnlCdWlsZGVyIHN0YXR1c01hdGNoID0gUXVlcnlCdWlsZGVycy5tYXRjaFF1ZXJ5KFNUQVRVU19GSUVMRCwgcmVxdWVzdGVkU3RhdHVzKTsKKwkJCXJlbWFpbmluZ0VsZW1lbnRRdWVyeUJ1aWxkZXIgPSBRdWVyeUJ1aWxkZXJzLmJvb2xRdWVyeSgpLm11c3QoZGlzdHJpYnV0aW9uSWRNYXRjaCkKKwkJCQkJLm11c3QoZGlzdHJpYnV0aW9uQWN0aW9uTWF0Y2gpLm11c3Qoc3RhdHVzTWF0Y2gpOworCQl9IGVsc2UgeworCQkJcmVtYWluaW5nRWxlbWVudFF1ZXJ5QnVpbGRlciA9IFF1ZXJ5QnVpbGRlcnMuYm9vbFF1ZXJ5KCkubXVzdChkaXN0cmlidXRpb25JZE1hdGNoKQorCQkJCQkubXVzdChkaXN0cmlidXRpb25BY3Rpb25NYXRjaCk7CisJCX0KKworCQlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+IHJlbWFpbmluZ0VsZW1lbnRzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJlbWFpbmluZ0VsZW1lbnRzID0gY3VzdG9tRmluZEV2ZW50KGNsYXp6LmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpLCByZW1haW5pbmdFbGVtZW50UXVlcnlCdWlsZGVyLAorCQkJCQludWxsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLAorCQkJCQkiR2V0IERpc3RyaWJ1dGlvblN0YXR1c2VzIExpc3QiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJHZXQgRGlzdHJpYnV0aW9uU3RhdHVzZXMgTGlzdCIpOworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGRpc3RyaWJ1dGlvbiBzdGF0dXNlcyBmb3IgYWN0aW9uIHt9IiwgYWN0aW9uVHlwZSwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChyZW1haW5pbmdFbGVtZW50cyk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21tb25GaWVsZHMoTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gcGFyYW1zLAorCQkJQXVkaXRpbmdHZW5lcmljRXZlbnQgdGltZUJhc2VkSW5kZXhlZERhdGEpIHsKKwkJU3RyaW5nIGRhdGVTdHIgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QKTsKKwkJaWYgKGRhdGVTdHIgIT0gbnVsbCkgeworCQkJdGltZUJhc2VkSW5kZXhlZERhdGEuc2V0VGltZXN0YW1wKGRhdGVTdHIpOworCQl9CisJCXRpbWVCYXNlZEluZGV4ZWREYXRhLnNldEFjdGlvbigoU3RyaW5nKSBwYXJhbXMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OKSk7CisJCU9iamVjdCBzdGF0dXNPYmogPSBwYXJhbXMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJLy8gRm9yIEJDLiBzdGF0dXMgd2FzIEludGVnZXIgYW5kIGlzIFN0cmluZworCQlpZiAoc3RhdHVzT2JqICE9IG51bGwpIHsKKwkJCXRpbWVCYXNlZEluZGV4ZWREYXRhLnNldFN0YXR1cyhTdHJpbmcudmFsdWVPZihzdGF0dXNPYmopKTsKKwkJfSBlbHNlIHsKKwkJCXRpbWVCYXNlZEluZGV4ZWREYXRhLnNldFN0YXR1cyhudWxsKTsKKwkJfQorCQkvLyB0aW1lQmFzZWRJbmRleGVkRGF0YS5zZXRTdGF0dXMoKFN0cmluZylwYXJhbXMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKSk7CisJCXRpbWVCYXNlZEluZGV4ZWREYXRhLnNldERlc2MoKFN0cmluZykgcGFyYW1zLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpKTsKKwkJdGltZUJhc2VkSW5kZXhlZERhdGEKKwkJCQkuc2V0U2VydmljZUluc3RhbmNlSWQoKFN0cmluZykgcGFyYW1zLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQpKTsKKwkJdGltZUJhc2VkSW5kZXhlZERhdGEuc2V0UmVxdWVzdElkKChTdHJpbmcpIHBhcmFtcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lEKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL0VTQ2F0YWxvZ0RBTy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vaW1wbC9FU0NhdGFsb2dEQU8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NkOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vaW1wbC9FU0NhdGFsb2dEQU8uamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guYWN0aW9uLmFkbWluLmNsdXN0ZXIuaGVhbHRoLkNsdXN0ZXJIZWFsdGhSZXF1ZXN0OworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmFjdGlvbi5hZG1pbi5jbHVzdGVyLmhlYWx0aC5DbHVzdGVySGVhbHRoU3RhdHVzOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNvbW1vbi51bml0LlRpbWVWYWx1ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5FU0dlbmVyaWNTZWFyY2hEQU87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5JQ2F0YWxvZ0RBTzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLlJlc291cmNlVXBsb2FkU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5leGNlcHRpb24uUmVzb3VyY2VEQU9FeGNlcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5IZWFsdGhDaGVja0luZm8uSGVhbHRoQ2hlY2tTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJyZXNvdXJjZS1kYW8iKQorcHVibGljIGNsYXNzIEVTQ2F0YWxvZ0RBTyBleHRlbmRzIEVTR2VuZXJpY1NlYXJjaERBTyBpbXBsZW1lbnRzIElDYXRhbG9nREFPIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFU0NhdGFsb2dEQU8uY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgaGVhbHRoQ2hlY2tMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcigiZWxhc3RpY3NlYXJjaC5oZWFsdGhjaGVjayIpOworCisJLy8vLy8gSGVhbHRoQ2hlY2svLy8vLy8vLy8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNfSEVBTFRIX0NIRUNLX1NUUiA9ICJlbGFzdGljc2VhcmNoSGVhbHRoQ2hlY2siOworCisJcHJpdmF0ZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgaGVhbHRoQ2hlY2tTY2hlZHVsZXIgPSBFeGVjdXRvcnMKKwkJCS5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7CisJCQkJCXJldHVybiBuZXcgVGhyZWFkKHIsICJFUy1IZWFsdGgtQ2hlY2stVGhyZWFkIik7CisJCQkJfQorCQkJfSk7CisKKwlwcml2YXRlIGNsYXNzIEhlYWx0aENoZWNrU2NoZWR1bGVkVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCWhlYWx0aENoZWNrTG9nZ2VyLnRyYWNlKCJFeGVjdXRpbmcgRUxBU1RJQ1NFQVJDSCBIZWFsdGggQ2hlY2sgVGFzayAtIFN0YXJ0Iik7CisKKwkJCUhlYWx0aENoZWNrU3RhdHVzIGhlYWx0aFN0YXR1cyA9IG51bGw7CisJCQl0cnkgeworCQkJCWhlYWx0aFN0YXR1cyA9IGlzSW5pdENvbXBsZXRlZCgpID8gY2hlY2tIZWFsdGgoKSA6IEhlYWx0aENoZWNrU3RhdHVzLkRPV047CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZy5lcnJvcigiRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZWxhc3RpY3NlYXJjaC4gaG9zdDogIiArIGdldEVzQ2xpZW50KCkuZ2V0U2VydmVySG9zdCgpCisJCQkJCQkrICIgcG9ydDogIiArIGdldEVzQ2xpZW50KCkuZ2V0U2VydmVyUG9ydCgpLCBlLmdldE1lc3NhZ2UoKSk7CisJCQkJbG9nLnRyYWNlKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gY29ubmVjdCB0byBlbGFzdGljc2VhcmNoIiwgZSk7CisJCQkJaGVhbHRoU3RhdHVzID0gSGVhbHRoQ2hlY2tTdGF0dXMuRE9XTjsKKwkJCX0KKwkJCWhlYWx0aENoZWNrTG9nZ2VyLnRyYWNlKCJFeGVjdXRlZCBFTEFTVElDU0VBUkNIIEhlYWx0aCBDaGVjayBUYXNrIC0gU3RhdHVzID0ge30iLCBoZWFsdGhTdGF0dXMpOworCQkJaWYgKGhlYWx0aFN0YXR1cyAhPSBsYXN0SGVhbHRoU3RhdGUpIHsKKwkJCQlsb2cudHJhY2UoIkVMQVNUSUNTRUFSQ0ggSGVhbHRoIFN0YXRlIENoYW5nZWQgdG8ge30uIElzc3VpbmcgYWxhcm0gLyByZWNvdmVyeSBhbGFybS4uLiIsIGhlYWx0aFN0YXR1cyk7CisJCQkJbGFzdEhlYWx0aFN0YXRlID0gaGVhbHRoU3RhdHVzOworCQkJCWxvZ0FsYXJtKCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEhlYWx0aENoZWNrU2NoZWR1bGVkVGFzayBoZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sgPSBuZXcgSGVhbHRoQ2hlY2tTY2hlZHVsZWRUYXNrKCk7CisJcHJpdmF0ZSB2b2xhdGlsZSBIZWFsdGhDaGVja1N0YXR1cyBsYXN0SGVhbHRoU3RhdGUgPSBIZWFsdGhDaGVja1N0YXR1cy5ET1dOOworCisJLyoqCisJICogR2V0IEVTIGNsdXN0ZXIgc3RhdHVzIHN0cmluZyByZXAKKwkgKiAKKwkgKiBAcmV0dXJuICJHUkVFTiIsICJZRUxMT1ciIG9yICJSRUQiCisJICovCisJcHJpdmF0ZSBIZWFsdGhDaGVja1N0YXR1cyBjaGVja0hlYWx0aCgpIHsKKwkJaWYgKCFpc0luaXRDb21wbGV0ZWQoKSkgeworCQkJcmV0dXJuIEhlYWx0aENoZWNrU3RhdHVzLkRPV047CisJCX0KKwkJQ2x1c3RlckhlYWx0aFJlcXVlc3QgaGVhbHRoUmVxdWVzdCA9IG5ldyBDbHVzdGVySGVhbHRoUmVxdWVzdCgiX2FsbCIpOworCQloZWFsdGhSZXF1ZXN0Lm1hc3Rlck5vZGVUaW1lb3V0KFRpbWVWYWx1ZS50aW1lVmFsdWVTZWNvbmRzKDIpKTsKKwkJQ2x1c3RlckhlYWx0aFN0YXR1cyBzdGF0dXMgPSBnZXRDbGllbnQoKS5hZG1pbigpLmNsdXN0ZXIoKS5oZWFsdGgoaGVhbHRoUmVxdWVzdCkuYWN0aW9uR2V0KCkuZ2V0U3RhdHVzKCk7CisJCWhlYWx0aENoZWNrTG9nZ2VyLmRlYnVnKCJFUyBjbHVzdGVyIGhlYWx0aCBzdGF0dXMgaXMge30iLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmVxdWFscyhDbHVzdGVySGVhbHRoU3RhdHVzLlJFRCkpIHsKKwkJCXJldHVybiBIZWFsdGhDaGVja1N0YXR1cy5ET1dOOworCQl9CisJCXJldHVybiBIZWFsdGhDaGVja1N0YXR1cy5VUDsKKwl9CisKKwlwcml2YXRlIHZvaWQgbG9nQWxhcm0oKSB7CisJCWlmIChsYXN0SGVhbHRoU3RhdGUgPT0gSGVhbHRoQ2hlY2tTdGF0dXMuVVApIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUhlYWx0aENoZWNrUmVjb3ZlcnksCisJCQkJCUVTX0hFQUxUSF9DSEVDS19TVFIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSGVhbHRoQ2hlY2tFbGFzdGljU2VhcmNoUmVjb3ZlcnkoRVNfSEVBTFRIX0NIRUNLX1NUUik7CisJCX0gZWxzZSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVIZWFsdGhDaGVja0Vycm9yLCBFU19IRUFMVEhfQ0hFQ0tfU1RSKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUhlYWx0aENoZWNrRWxhc3RpY1NlYXJjaEVycm9yKEVTX0hFQUxUSF9DSEVDS19TVFIpOworCQl9CisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0Q29tcGxldGVkKCkgeworCQlsb25nIGludGVydmFsID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkuZ2V0RXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kcyg1KTsKKwkJdGhpcy5oZWFsdGhDaGVja1NjaGVkdWxlci5zY2hlZHVsZUF0Rml4ZWRSYXRlKGhlYWx0aENoZWNrU2NoZWR1bGVkVGFzaywgMCwgaW50ZXJ2YWwsIFRpbWVVbml0LlNFQ09ORFMpOworCQlpbml0Q29tcGxldGVkID0gdHJ1ZTsKKwl9CisKKwkvLyBJbmRleCBDaGVja2luZyBWYXJpYWJsZXMKKwlwcml2YXRlIGJvb2xlYW4gaW5pdENvbXBsZXRlZCA9IGZhbHNlOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgd3JpdGVBcnRpZmFjdChFU0FydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEpIHRocm93cyBSZXNvdXJjZURBT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlzYXZlUmVzb3VyY2VEYXRhKGFydGlmYWN0RGF0YSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUmVzb3VyY2VEQU9FeGNlcHRpb24oIkVycm9yIHRvIHNhdmUgQXJ0aWZhY3REYXRhIHdpdGggIiArIGFydGlmYWN0RGF0YS5nZXRJZCgpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPiBnZXRBcnRpZmFjdChTdHJpbmcgaWQpIHsKKwkJRVNBcnRpZmFjdERhdGEgcmVzRGF0YSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCXJlc0RhdGEgPSBmaW5kQnlJZChnZXRUeXBlRnJvbUNsYXNzKEVTQXJ0aWZhY3REYXRhLmNsYXNzKSwgaWQsIEVTQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJlc0RhdGEgPSBudWxsOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsCisJCQkJCSJHZXQgQXJ0aWZhY3QgZnJvbSBkYXRhYmFzZSIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkdldCBBcnRpZmFjdCBmcm9tIGRhdGFiYXNlIik7CisJCQlsb2cuZGVidWcoIkVTQ2F0YWxvZ0RBTzpnZXRBcnRpZmFjdCBmYWlsZWQgd2l0aCBleGNlcHRpb24gIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFJlc291cmNlVXBsb2FkU3RhdHVzLkVSUk9SKTsKKwkJfQorCisJCWlmIChyZXNEYXRhICE9IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXNEYXRhKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoUmVzb3VyY2VVcGxvYWRTdGF0dXMuTk9UX0VYSVNUKTsKKwkJfQorCX0KKworCXByaXZhdGUgPFQ+IFN0cmluZyBnZXRUeXBlRnJvbUNsYXNzKENsYXNzPFQ+IGNsYXp6KSB7CisKKwkJcmV0dXJuIGNsYXp6LmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlbGV0ZUFydGlmYWN0KFN0cmluZyBpZCkgeworCQlkZWxldGUoZ2V0VHlwZUZyb21DbGFzcyhFU0FydGlmYWN0RGF0YS5jbGFzcyksIGlkKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8RVNBcnRpZmFjdERhdGE+LCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZ2V0QXJ0aWZhY3RzKFN0cmluZ1tdIGlkcykgeworCQlMaXN0PEVTQXJ0aWZhY3REYXRhPiByZXNEYXRhID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJlc0RhdGEgPSBmaW5kQnlJZHMoZ2V0VHlwZUZyb21DbGFzcyhFU0FydGlmYWN0RGF0YS5jbGFzcyksIEVTQXJ0aWZhY3REYXRhLmNsYXNzLCBpZHMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmVzRGF0YSA9IG51bGw7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFJlc291cmNlVXBsb2FkU3RhdHVzLkVSUk9SKTsKKwkJfQorCisJCWlmIChyZXNEYXRhICE9IG51bGwgJiYgIXJlc0RhdGEuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzRGF0YSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFJlc291cmNlVXBsb2FkU3RhdHVzLk5PVF9FWElTVCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2F2ZVJlc291cmNlRGF0YShFU0FydGlmYWN0RGF0YSBkYXRhKSB0aHJvd3MgSnNvblByb2Nlc3NpbmdFeGNlcHRpb24geworCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlRnJvbUNsYXNzKGRhdGEuZ2V0Q2xhc3MoKSk7CisJCXNhdmVSZXNvdXJjZURhdGEodHlwZU5hbWUsIGRhdGEsIGRhdGEuZ2V0SWQoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVsZXRlQWxsQXJ0aWZhY3RzKCkgeworCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRUeXBlRnJvbUNsYXNzKEVTQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJU3RyaW5nIGluZGV4TmFtZSA9IGdldEluZGV4Rm9yVHlwZSh0eXBlTmFtZSk7CisJCWRlbGV0ZUluZGV4KGluZGV4TmFtZSk7CisKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0luaXRDb21wbGV0ZWQoKSB7CisJCXJldHVybiBpbml0Q29tcGxldGVkOworCX0KKworCXB1YmxpYyBIZWFsdGhDaGVja1N0YXR1cyBnZXRIZWFsdGgoKSB7CisJCXJldHVybiBsYXN0SGVhbHRoU3RhdGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL0VTVGltZUJhc2VkRGFvLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL0VTVGltZUJhc2VkRGFvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2NjYzOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2ltcGwvRVNUaW1lQmFzZWREYW8uamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uaW5kZXguSW5kZXhSZXNwb25zZTsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uc2VhcmNoLlNlYXJjaFJlcXVlc3RCdWlsZGVyOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmFjdGlvbi5zZWFyY2guU2VhcmNoUmVzcG9uc2U7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guY29tbW9uLnVuaXQuVGltZVZhbHVlOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmluZGV4LnF1ZXJ5LlF1ZXJ5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5zZWFyY2guc29ydC5Tb3J0QnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uRWxhc3RpY1NlYXJjaENvbmZpZy5JbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5lcy5FbGFzdGljU2VhcmNoQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkVTVGltZUJhc2VkRXZlbnQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEVTVGltZUJhc2VkRGFvIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUkVfU0NSSVBUID0gIl9zY29yZSAqICgoZG9jLmNvbnRhaW5zS2V5KCdhbGllblNjb3JlJykgJiYgIWRvY1snYWxpZW5TY29yZSddLmVtcHR5KSA/IGRvY1snYWxpZW5TY29yZSddLnZhbHVlIDogMSkiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU0VBUkNIX1NJWkUgPSAxMDAwOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFU1RpbWVCYXNlZERhby5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBHc29uIGdzb247CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5kZXhQcmVmaXgyQ3JlYXRpb25QZXJpb2Q7CisKKwlwcml2YXRlIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOworCisJcHJvdGVjdGVkIEVTVGltZUJhc2VkRGFvKCkgeworCQlnc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKwkJY29uZmlndXJhdGlvbk1hbmFnZXIgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpOworCQlzZXRJbmRleFByZWZpeDJDcmVhdGlvblBlcmlvZCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyKSB7CisJCXRoaXMuY29uZmlndXJhdGlvbk1hbmFnZXIgPSBjb25maWd1cmF0aW9uTWFuYWdlcjsKKwl9CisKKwlAUmVzb3VyY2UobmFtZSA9ICJlbGFzdGljc2VhcmNoLWNsaWVudCIpCisJcHJpdmF0ZSBFbGFzdGljU2VhcmNoQ2xpZW50IGVzQ2xpZW50OworCisJcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPD8+PiB0eXBlc1RvQ2xhc3NlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisKKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEluZGV4UHJlZml4KCk7CisKKwlwdWJsaWMgQWN0aW9uU3RhdHVzIHdyaXRlKFN0cmluZyB0eXBlTmFtZSwgRVNUaW1lQmFzZWRFdmVudCBkYXRhKSB7CisKKwkJU3RyaW5nIGluZGV4UHJlZml4ID0gZ2V0SW5kZXhQcmVmaXgoKTsKKwkJU3RyaW5nIGluZGV4U3VmZml4ID0gZ2V0SW5kZXhTdWZmaXgoaW5kZXhQcmVmaXgsIGRhdGEpOworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJc2IuYXBwZW5kKGluZGV4UHJlZml4KTsKKwkJaWYgKGluZGV4U3VmZml4ICE9IG51bGwpIHsKKwkJCXNiLmFwcGVuZCgiLSIpLmFwcGVuZChpbmRleFN1ZmZpeCk7CisJCX0KKworCQlBY3Rpb25TdGF0dXMgcmVzID0gQWN0aW9uU3RhdHVzLk9LOworCQlKU09OT2JqZWN0IGpzb24gPSBuZXcgSlNPTk9iamVjdChkYXRhLmdldEZpZWxkcygpKTsKKwkJdHJ5IHsKKwkJCUluZGV4UmVzcG9uc2UgYWN0aW9uR2V0ID0gZXNDbGllbnQuZ2V0Q2xpZW50KCkucHJlcGFyZUluZGV4KHNiLnRvU3RyaW5nKCksIHR5cGVOYW1lKQorCQkJCQkuc2V0U291cmNlKGpzb24udG9TdHJpbmcoKSkuc2V0UmVmcmVzaCh0cnVlKS5leGVjdXRlKCkuYWN0aW9uR2V0KFRpbWVWYWx1ZS50aW1lVmFsdWVTZWNvbmRzKDE1KSk7CisKKwkJCWlmIChhY3Rpb25HZXQuaXNDcmVhdGVkKCkpIHsKKwkJCQlsb2cuZGVidWcoIkNyZWF0ZWQgcmVjb3JkIHt9IiwgZGF0YS50b1N0cmluZygpKTsKKwkJCQkvLyB0eXBlc1RvQ2xhc3Nlcy5wdXQodHlwZU5hbWUsIGRhdGEuZ2V0Q2xhc3MoKSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5lcnJvcigiUmVjb3JkIHt9IGNvdWxkbid0IGJlIGNyZWF0ZWQiLCBkYXRhLnRvU3RyaW5nKCkpOworCQkJCXJlcyA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJDb3VsZG4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgIiArIHR5cGVOYW1lICsgIiAsIGVycm9yOiIsIGUpOworCQkJcmVzID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgQWN0aW9uU3RhdHVzIHdyaXRlKEVTVGltZUJhc2VkRXZlbnQgZGF0YSkgeworCisJCVN0cmluZyBpbmRleFByZWZpeCA9IGdldEluZGV4UHJlZml4KCk7CisJCVN0cmluZyBpbmRleFN1ZmZpeCA9IGdldEluZGV4U3VmZml4KGluZGV4UHJlZml4LCBkYXRhKTsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXNiLmFwcGVuZChpbmRleFByZWZpeCk7CisJCWlmIChpbmRleFN1ZmZpeCAhPSBudWxsKSB7CisJCQlzYi5hcHBlbmQoIi0iKS5hcHBlbmQoaW5kZXhTdWZmaXgpOworCQl9CisKKwkJU3RyaW5nIHR5cGVOYW1lID0gZGF0YS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpOworCQlBY3Rpb25TdGF0dXMgcmVzID0gQWN0aW9uU3RhdHVzLk9LOworCQlTdHJpbmcganNvbiA9IGdzb24udG9Kc29uKGRhdGEpOworCQl0cnkgeworCQkJSW5kZXhSZXNwb25zZSBhY3Rpb25HZXQgPSBlc0NsaWVudC5nZXRDbGllbnQoKS5wcmVwYXJlSW5kZXgoc2IudG9TdHJpbmcoKSwgdHlwZU5hbWUpLnNldFNvdXJjZShqc29uKQorCQkJCQkuc2V0UmVmcmVzaCh0cnVlKS5leGVjdXRlKCkuYWN0aW9uR2V0KFRpbWVWYWx1ZS50aW1lVmFsdWVTZWNvbmRzKDE1KSk7CisKKwkJCWlmIChhY3Rpb25HZXQuaXNDcmVhdGVkKCkpIHsKKwkJCQlsb2cuZGVidWcoIkNyZWF0ZWQgcmVjb3JkIHt9IiwgZGF0YS50b1N0cmluZygpKTsKKwkJCQkvLyB0eXBlc1RvQ2xhc3Nlcy5wdXQodHlwZU5hbWUsIGRhdGEuZ2V0Q2xhc3MoKSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5lcnJvcigiUmVjb3JkIHt9IGNvdWxkbid0IGJlIGNyZWF0ZWQiLCBkYXRhLnRvU3RyaW5nKCkpOworCQkJCXJlcyA9IEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUge30iLCB0eXBlTmFtZSk7CisJCQlyZXMgPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRJbmRleFByZWZpeDJDcmVhdGlvblBlcmlvZCgpIHsKKwkJaW5kZXhQcmVmaXgyQ3JlYXRpb25QZXJpb2QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJTGlzdDxJbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJ5PiBpbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJpZXMgPSBjb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkuZ2V0RWxhc3RpY1NlYXJjaCgpLmdldEluZGljZXNUaW1lRnJlcXVlbmN5KCk7CisJCWZvciAoSW5kaWNlc1RpbWVGcmVxdWVuY3lFbnRyeSBlbnRyeSA6IGluZGljZXNUaW1lRnJlcXVlbmN5RW50cmllcykgeworCQkJaW5kZXhQcmVmaXgyQ3JlYXRpb25QZXJpb2QucHV0KGVudHJ5LmdldEluZGV4UHJlZml4KCksIGVudHJ5LmdldENyZWF0aW9uUGVyaW9kKCkpOworCisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRJbmRleFN1ZmZpeChTdHJpbmcgaW5kZXhQcmVmaXgsIEVTVGltZUJhc2VkRXZlbnQgZGF0YSkgeworCQlTdHJpbmcgaW5kZXhTdWZmaXggPSBpbmRleFByZWZpeDJDcmVhdGlvblBlcmlvZC5nZXQoaW5kZXhQcmVmaXgpOworCQlTdHJpbmcgcmVzID0gbnVsbDsKKwkJaWYgKGluZGV4U3VmZml4ICE9IG51bGwpIHsKKwkJCWlmIChpbmRleFN1ZmZpeC5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5ZRUFSKSkgeworCQkJCXJlcyA9IGRhdGEuY2FsY3VsYXRlWWVhckluZGV4U3VmZml4KCk7CisJCQl9IGVsc2UgaWYgKGluZGV4U3VmZml4LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLk1PTlRIKSkgeworCQkJCXJlcyA9IGRhdGEuY2FsY3VsYXRlTW9udGhJbmRleFN1ZmZpeCgpOworCQkJfSBlbHNlIGlmIChpbmRleFN1ZmZpeC5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5EQVkpKSB7CisJCQkJcmVzID0gZGF0YS5jYWxjdWxhdGVEYXlJbmRleFN1ZmZpeCgpOworCQkJfSBlbHNlIGlmIChpbmRleFN1ZmZpeC5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5IT1VSKSkgeworCQkJCXJlcyA9IGRhdGEuY2FsY3VsYXRlSG91ckluZGV4U3VmZml4KCk7CisJCQl9IGVsc2UgaWYgKGluZGV4U3VmZml4LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLk1JTlVURSkpIHsKKwkJCQlyZXMgPSBkYXRhLmNhbGN1bGF0ZU1pbnV0ZUluZGV4U3VmZml4KCk7CisJCQl9IGVsc2UgaWYgKGluZGV4U3VmZml4LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLk5PTkUpKSB7CisJCQkJLy8gZG8gbm90aGluZyAtIG5vIHRpbWUtYmFzZWQgYmVoYXZpb3VyLiBJIHdhbnRlZCB0byBlbnN1cmUKKwkJCQkvLyBwcm9wZXIgc3ludGF4LCB0aGF0J3Mgd2h5IHRoaXMgY2xhdXNlIGlzIG5lZWRlZC4KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIERlZmF1bHQgYmVoYXZpb3VyIC0gdGltZS1iYXNlZCB3aXRoIG1vbnRoIHBlcmlvZAorCQkJcmVzID0gZGF0YS5jYWxjdWxhdGVNb250aEluZGV4U3VmZml4KCk7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgPFQ+IGxvbmcgY291bnQoQ2xhc3M8VD4gY2xhenosIFF1ZXJ5QnVpbGRlciBxdWVyeSkgeworCQlTdHJpbmcgaW5kZXhOYW1lID0gZ2V0SW5kZXhQcmVmaXgoKSArICIqIjsKKwkJU3RyaW5nIHR5cGVOYW1lID0gY2xhenouZ2V0U2ltcGxlTmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJCVNlYXJjaFJlcXVlc3RCdWlsZGVyIHNlYXJjaFJlcXVlc3RCdWlsZGVyID0gZXNDbGllbnQuZ2V0Q2xpZW50KCkucHJlcGFyZVNlYXJjaChpbmRleE5hbWUpLnNldFR5cGVzKHR5cGVOYW1lKQorCQkJCS5zZXRTaXplKDApOworCQlpZiAocXVlcnkgIT0gbnVsbCkgeworCQkJc2VhcmNoUmVxdWVzdEJ1aWxkZXIuc2V0UXVlcnkocXVlcnkpOworCQl9CisKKwkJU2VhcmNoUmVzcG9uc2UgcmVzcG9uc2UgPSBzZWFyY2hSZXF1ZXN0QnVpbGRlci5leGVjdXRlKCkuYWN0aW9uR2V0KCk7CisJCXJldHVybiByZXNwb25zZS5nZXRIaXRzKCkuZ2V0VG90YWxIaXRzKCk7CisJfQorCisJcHJpdmF0ZSA8VD4gTGlzdDxUPiBkb0N1c3RvbUZpbmQoQ2xhc3M8VD4gY2xhenosIFF1ZXJ5QnVpbGRlciBxdWVyeSwgU29ydEJ1aWxkZXIgc29ydEJ1aWxkZXIsIGludCBzaXplKSB7CisJCVN0cmluZyBpbmRleE5hbWUgPSBnZXRJbmRleFByZWZpeCgpICsgIioiOworCQlTdHJpbmcgdHlwZU5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJU2VhcmNoUmVxdWVzdEJ1aWxkZXIgc2VhcmNoUmVxdWVzdEJ1aWxkZXIgPSBlc0NsaWVudC5nZXRDbGllbnQoKS5wcmVwYXJlU2VhcmNoKGluZGV4TmFtZSkuc2V0VHlwZXModHlwZU5hbWUpCisJCQkJLnNldFNpemUoc2l6ZSk7CisJCWlmIChxdWVyeSAhPSBudWxsKSB7CisJCQlzZWFyY2hSZXF1ZXN0QnVpbGRlci5zZXRRdWVyeShxdWVyeSk7CisJCX0KKwkJaWYgKHNvcnRCdWlsZGVyICE9IG51bGwpIHsKKwkJCXNlYXJjaFJlcXVlc3RCdWlsZGVyLmFkZFNvcnQoc29ydEJ1aWxkZXIpOworCQl9CisJCVNlYXJjaFJlc3BvbnNlIHJlc3BvbnNlID0gc2VhcmNoUmVxdWVzdEJ1aWxkZXIuZXhlY3V0ZSgpLmFjdGlvbkdldCgpOworCQlpZiAoIXNvbWV0aGluZ0ZvdW5kKHJlc3BvbnNlKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSB7CisJCQlMaXN0PFQ+IGhpdHMgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3BvbnNlLmdldEhpdHMoKS5nZXRIaXRzKCkubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgaGl0ID0gcmVzcG9uc2UuZ2V0SGl0cygpLmdldEF0KGkpLnNvdXJjZUFzU3RyaW5nKCk7CisKKwkJCQloaXRzLmFkZCgoVCkgZ3Nvbi5mcm9tSnNvbihoaXQsIGNsYXp6KSk7CisKKwkJCX0KKwkJCXJldHVybiBoaXRzOworCQl9CisJfQorCisJcHJpdmF0ZSBMaXN0PEVTVGltZUJhc2VkRXZlbnQ+IGRvQ3VzdG9tRmluZEZvckV2ZW50KFN0cmluZyB0eXBlTmFtZSwgUXVlcnlCdWlsZGVyIHF1ZXJ5LCBTb3J0QnVpbGRlciBzb3J0QnVpbGRlciwKKwkJCWludCBzaXplKSB7CisJCVN0cmluZyBpbmRleE5hbWUgPSBnZXRJbmRleFByZWZpeCgpICsgIioiOworCQkvLyBTdHJpbmcgdHlwZU5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJU2VhcmNoUmVxdWVzdEJ1aWxkZXIgc2VhcmNoUmVxdWVzdEJ1aWxkZXIgPSBlc0NsaWVudC5nZXRDbGllbnQoKS5wcmVwYXJlU2VhcmNoKGluZGV4TmFtZSkuc2V0VHlwZXModHlwZU5hbWUpCisJCQkJLnNldFNpemUoc2l6ZSk7CisJCWlmIChxdWVyeSAhPSBudWxsKSB7CisJCQlzZWFyY2hSZXF1ZXN0QnVpbGRlci5zZXRRdWVyeShxdWVyeSk7CisJCX0KKwkJaWYgKHNvcnRCdWlsZGVyICE9IG51bGwpIHsKKwkJCXNlYXJjaFJlcXVlc3RCdWlsZGVyLmFkZFNvcnQoc29ydEJ1aWxkZXIpOworCQl9CisJCVNlYXJjaFJlc3BvbnNlIHJlc3BvbnNlID0gc2VhcmNoUmVxdWVzdEJ1aWxkZXIuZXhlY3V0ZSgpLmFjdGlvbkdldCgpOworCQlpZiAoIXNvbWV0aGluZ0ZvdW5kKHJlc3BvbnNlKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSB7CisJCQlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+IGhpdHMgPSBuZXcgQXJyYXlMaXN0PEVTVGltZUJhc2VkRXZlbnQ+KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3BvbnNlLmdldEhpdHMoKS5nZXRIaXRzKCkubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgaGl0ID0gcmVzcG9uc2UuZ2V0SGl0cygpLmdldEF0KGkpLnNvdXJjZUFzU3RyaW5nKCk7CisKKwkJCQlFU1RpbWVCYXNlZEV2ZW50IGV2ZW50OworCQkJCXRyeSB7CisJCQkJCWV2ZW50ID0gRVNUaW1lQmFzZWRFdmVudC5jcmVhdGVFdmVudEZyb21Kc29uKGhpdCk7CisJCQkJCWhpdHMuYWRkKGV2ZW50KTsKKwkJCQl9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKwkJCQkJbG9nLndhcm4oImZhaWxlZCB0byBwYXJzZSBoaXQgZnJvbSBhdWRpdCBpbmRleC4gZXJyb3I6IHt9IiwgZS5nZXRNZXNzYWdlKCkpOworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBwYXJzZSBoaXQgZnJvbSBhdWRpdC4gaGl0ID0ge30ge30iLCBoaXQsIGUpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBoaXRzOworCQl9CisJfQorCisJcHVibGljIExpc3Q8RVNUaW1lQmFzZWRFdmVudD4gY3VzdG9tRmluZEV2ZW50KFN0cmluZyB0eXBlTmFtZSwgUXVlcnlCdWlsZGVyIHF1ZXJ5LCBTb3J0QnVpbGRlciBzb3J0QnVpbGRlcikKKwkJCXRocm93cyBKU09ORXhjZXB0aW9uIHsKKwkJTGlzdDxFU1RpbWVCYXNlZEV2ZW50PiByZXN1bHRzID0gZG9DdXN0b21GaW5kRm9yRXZlbnQodHlwZU5hbWUsIHF1ZXJ5LCBzb3J0QnVpbGRlciwgTUFYX1NFQVJDSF9TSVpFKTsKKwkJaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworCQkJcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8RVNUaW1lQmFzZWRFdmVudD4oKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwlwdWJsaWMgPFQ+IFQgY3VzdG9tRmluZChDbGFzczxUPiBjbGF6eiwgUXVlcnlCdWlsZGVyIHF1ZXJ5KSB7CisJCXJldHVybiBjdXN0b21GaW5kKGNsYXp6LCBxdWVyeSwgbnVsbCk7CisJfQorCisJcHVibGljIDxUPiBUIGN1c3RvbUZpbmQoQ2xhc3M8VD4gY2xhenosIFF1ZXJ5QnVpbGRlciBxdWVyeSwgU29ydEJ1aWxkZXIgc29ydEJ1aWxkZXIpIHsKKwkJTGlzdDxUPiByZXN1bHRzID0gZG9DdXN0b21GaW5kKGNsYXp6LCBxdWVyeSwgc29ydEJ1aWxkZXIsIDEpOworCQlpZiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiByZXN1bHRzLml0ZXJhdG9yKCkubmV4dCgpOworCQl9CisJfQorCisJcHVibGljIDxUPiBMaXN0PFQ+IGN1c3RvbUZpbmRBbGwoQ2xhc3M8VD4gY2xhenosIFF1ZXJ5QnVpbGRlciBxdWVyeSkgeworCQlyZXR1cm4gY3VzdG9tRmluZEFsbChjbGF6eiwgcXVlcnksIG51bGwpOworCX0KKworCXB1YmxpYyA8VD4gTGlzdDxUPiBjdXN0b21GaW5kQWxsKENsYXNzPFQ+IGNsYXp6LCBRdWVyeUJ1aWxkZXIgcXVlcnksIFNvcnRCdWlsZGVyIHNvcnRCdWlsZGVyKSB7CisJCXJldHVybiBkb0N1c3RvbUZpbmQoY2xhenosIHF1ZXJ5LCBzb3J0QnVpbGRlciwgSW50ZWdlci5NQVhfVkFMVUUpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBzb21ldGhpbmdGb3VuZChmaW5hbCBTZWFyY2hSZXNwb25zZSBzZWFyY2hSZXNwb25zZSkgeworCQlpZiAoc2VhcmNoUmVzcG9uc2UgPT0gbnVsbCB8fCBzZWFyY2hSZXNwb25zZS5nZXRIaXRzKCkgPT0gbnVsbCB8fCBzZWFyY2hSZXNwb25zZS5nZXRIaXRzKCkuZ2V0SGl0cygpID09IG51bGwKKwkJCQl8fCBzZWFyY2hSZXNwb25zZS5nZXRIaXRzKCkuZ2V0SGl0cygpLmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFc0hvc3QoKSB7CisJCVN0cmluZyBob3N0ID0gbnVsbDsKKwkJaWYgKHRoaXMuZXNDbGllbnQgIT0gbnVsbCkgeworCQkJaG9zdCA9IHRoaXMuZXNDbGllbnQuZ2V0U2VydmVySG9zdCgpOworCQl9IGVsc2UgeworCQkJbG9nLmVycm9yKCJlc0NsaWVudCBpcyB1bmF2aWxhYmxlIGNvdWxkIG5vdCBnZXQgaG9zdC4iKTsKKwkJfQorCQlyZXR1cm4gaG9zdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVzUG9ydCgpIHsKKwkJU3RyaW5nIHBvcnQgPSBudWxsOworCQlpZiAodGhpcy5lc0NsaWVudCAhPSBudWxsKSB7CisJCQlwb3J0ID0gdGhpcy5lc0NsaWVudC5nZXRTZXJ2ZXJQb3J0KCk7CisJCX0gZWxzZSB7CisJCQlsb2cuZXJyb3IoImVzQ2xpZW50IGlzIHVuYXZpbGFibGUgY291bGQgbm90IGdldCBwb3J0LiIpOworCQl9CisKKwkJcmV0dXJuIHBvcnQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL0VzSGVhbHRoQ2hlY2tEYW8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2ltcGwvRXNIZWFsdGhDaGVja0Rhby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDk4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL0VzSGVhbHRoQ2hlY2tEYW8uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmltcGw7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5JRXNIZWFsdGhDaGVja0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZXMuRWxhc3RpY1NlYXJjaENsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja1N0YXR1czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQoImVzSGVhbHRoQ2hlY2tEYW8iKQorcHVibGljIGNsYXNzIEVzSGVhbHRoQ2hlY2tEYW8gaW1wbGVtZW50cyBJRXNIZWFsdGhDaGVja0RhbyB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRXNIZWFsdGhDaGVja0Rhby5jbGFzcy5nZXROYW1lKCkpOworCisJQFJlc291cmNlKG5hbWUgPSAiZWxhc3RpY3NlYXJjaC1jbGllbnQiKQorCXByaXZhdGUgRWxhc3RpY1NlYXJjaENsaWVudCBlc0NsaWVudDsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgRVNDYXRhbG9nREFPIGVzQ2F0YWxvZ0RhbzsKKworCXB1YmxpYyBFc0hlYWx0aENoZWNrRGFvKCkgeworCX0KKworCXB1YmxpYyBIZWFsdGhDaGVja1N0YXR1cyBnZXRDbHVzdGVySGVhbHRoU3RhdHVzKCkgeworCQlyZXR1cm4gdGhpcy5lc0NhdGFsb2dEYW8uZ2V0SGVhbHRoKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL01vbml0b3JpbmdEYW8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2ltcGwvTW9uaXRvcmluZ0Rhby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMTZjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL01vbml0b3JpbmdEYW8uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ubW9uaXRvcmluZy5Nb25pdG9yaW5nRXZlbnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworQENvbXBvbmVudCgibW9uaXRvcmluZ0RhbyIpCitwdWJsaWMgY2xhc3MgTW9uaXRvcmluZ0RhbyBleHRlbmRzIEVTVGltZUJhc2VkRGFvIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PTklUT1JJTkdfSU5ERVggPSAibW9uaXRvcmluZ19ldmVudHMiOworCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRJbmRleFByZWZpeCgpIHsKKwkJcmV0dXJuIE1PTklUT1JJTkdfSU5ERVg7CisJfQorCisJcHVibGljIEFjdGlvblN0YXR1cyBhZGRSZWNvcmQoTW9uaXRvcmluZ0V2ZW50IG1vbml0b3JpbmdFdmVudCkgeworCQlyZXR1cm4gd3JpdGUobW9uaXRvcmluZ0V2ZW50KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2ltcGwvTmVvNGpFbGVtZW50REFPLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL05lbzRqRWxlbWVudERBTy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjhkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL05lbzRqRWxlbWVudERBTy5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLklFbGVtZW50REFPOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5OZW80akNsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouTmVvNGpPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuTWF0Y2hGaWx0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworLy9AQ29tcG9uZW50KCJlbGVtZW50cy1kYW8iKQorcHVibGljIGNsYXNzIE5lbzRqRWxlbWVudERBTyBpbXBsZW1lbnRzIElFbGVtZW50REFPIHsKKworCS8vIEBSZXNvdXJjZQorCU5lbzRqQ2xpZW50IG5lbzRqQ2xpZW50OworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5lbzRqRWxlbWVudERBTy5jbGFzcy5nZXROYW1lKCkpOworCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PEdyYXBoRWxlbWVudD4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsQ2F0ZWdvcmllcygpIHsKKwkJTWF0Y2hGaWx0ZXIgZmlsdGVyID0gbmV3IE1hdGNoRmlsdGVyKCk7CisJCUVpdGhlcjxMaXN0PEdyYXBoRWxlbWVudD4sIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBuZW80akNsaWVudC5nZXRCeUZpbHRlcihHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZUNhdGVnb3J5LmdldE5hbWUoKSwgZmlsdGVyKTsKKwkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9IGVsc2UgeworCQkJTGlzdDxHcmFwaEVsZW1lbnQ+IHZhbHVlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIubGVmdCh2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JhcGhFbGVtZW50PiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxUYWdzKCkgeworCQlNYXRjaEZpbHRlciBmaWx0ZXIgPSBuZXcgTWF0Y2hGaWx0ZXIoKTsKKwkJRWl0aGVyPExpc3Q8R3JhcGhFbGVtZW50PiwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IG5lbzRqQ2xpZW50LmdldEJ5RmlsdGVyKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsCisJCQkJTm9kZVR5cGVFbnVtLlRhZy5nZXROYW1lKCksIGZpbHRlcik7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfSBlbHNlIHsKKwkJCUxpc3Q8R3JhcGhFbGVtZW50PiB2YWx1ZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIubGVmdCh2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEdyYXBoRWxlbWVudCwgQWN0aW9uU3RhdHVzPiBnZXRDYXRlZ29yeShTdHJpbmcgbmFtZSkgeworCQlNYXRjaEZpbHRlciBmaWx0ZXIgPSBuZXcgTWF0Y2hGaWx0ZXIoKTsKKwkJZmlsdGVyLmFkZFRvTWF0Y2goR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIG5hbWUpOworCQlFaXRoZXI8TGlzdDxHcmFwaEVsZW1lbnQ+LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gbmVvNGpDbGllbnQuZ2V0QnlGaWx0ZXIoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2VDYXRlZ29yeS5nZXROYW1lKCksIGZpbHRlcik7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfSBlbHNlIHsKKwkJCUxpc3Q8R3JhcGhFbGVtZW50PiB2YWx1ZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIubGVmdCh2YWx1ZS5nZXQoMCkpOworCQkJfQorCQl9CisKKwl9CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIG5lbzRqQ2xpZW50CisJICovCisJcHVibGljIHZvaWQgc2V0TmVvNGpDbGllbnQoTmVvNGpDbGllbnQgbmVvNGpDbGllbnQpIHsKKwkJdGhpcy5uZW80akNsaWVudCA9IG5lbzRqQ2xpZW50OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vaW1wbC9OZW80alByb3BlcnR5REFPLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL05lbzRqUHJvcGVydHlEQU8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2E3YzUwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vaW1wbC9OZW80alByb3BlcnR5REFPLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkJhc2ljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuSVByb3BlcnR5REFPOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5OZW80akNsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouTmVvNGpHcmFwaEJhdGNoQnVpbGRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKKy8vQENvbXBvbmVudCgibmVvNGotcHJvcGVydHktZGFvIikKK3B1YmxpYyBjbGFzcyBOZW80alByb3BlcnR5REFPIGV4dGVuZHMgQmFzaWNEYW8gaW1wbGVtZW50cyBJUHJvcGVydHlEQU8geworCisJLy8gQFJlc291cmNlCisJTmVvNGpDbGllbnQgbmVvNGpDbGllbnQ7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTmVvNGpQcm9wZXJ0eURBTy5jbGFzcy5nZXROYW1lKCkpOworCisJTmVvNGpHcmFwaEJhdGNoQnVpbGRlciBncmFwaEJhdGNoQnVpbGRlciA9IG5ldyBOZW80akdyYXBoQmF0Y2hCdWlsZGVyKCk7CisKKwlwdWJsaWMgTmVvNGpQcm9wZXJ0eURBTygpIHsKKworCX0KKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJc2V0TmVvNGpDbGllbnQobmVvNGpDbGllbnQpOworCX0KKworCS8vIEBPdmVycmlkZQorCS8vIHB1YmxpYyBFaXRoZXI8UHJvcGVydHlEYXRhLCBOZW80ak9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUHJvcGVydHlEYXRhKAorCS8vIEdyYXBoTmVpZ2hib3VyVGFibGUgZ3JhcGhOZWlnaGJvdXJUYWJsZSkgeworCS8vCisJLy8gRWl0aGVyPEJhdGNoQnVpbGRlciwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGJiUmVzdWx0ID0gZ3JhcGhCYXRjaEJ1aWxkZXIKKwkvLyAuYnVpbGRCYXRjaEJ1aWxkZXJGcm9tVGFibGUoZ3JhcGhOZWlnaGJvdXJUYWJsZSk7CisJLy8KKwkvLyBpZiAoYmJSZXN1bHQuaXNMZWZ0KCkpIHsKKwkvLworCS8vIEJhdGNoQnVpbGRlciBiYXRjaEJ1aWxkZXIgPSBiYlJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkvLyAvL05lbzRqT3BlcmF0aW9uU3RhdHVzIG5lbzRqT3BlcmF0aW9uU3RhdHVzID0KKwkvLyBuZW80akNsaWVudC5leGVjdXRlKGJhdGNoQnVpbGRlcik7CisJLy8gRWl0aGVyPExpc3Q8TGlzdDxOZW80akVsZW1lbnQ+PiwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGV4ZWN1dGVSZXN1bHQgPQorCS8vIG5lbzRqQ2xpZW50LmV4ZWN1dGUoYmF0Y2hCdWlsZGVyKTsKKwkvLworCS8vIGlmIChleGVjdXRlUmVzdWx0LmlzUmlnaHQoKSkgeworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoZXhlY3V0ZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCS8vIH0KKwkvLworCS8vIFByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBudWxsOworCS8vIExpc3Q8TGlzdDxOZW80akVsZW1lbnQ+PiBsaXN0T2ZSZXN1bHRzID0gZXhlY3V0ZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkvLyBpZiAobGlzdE9mUmVzdWx0cyAhPSBudWxsKSB7CisJLy8gZm9yIChMaXN0PE5lbzRqRWxlbWVudD4gbGlzdE9mRWxlbWVudHMgOiBsaXN0T2ZSZXN1bHRzKSB7CisJLy8gaWYgKGxpc3RPZkVsZW1lbnRzICE9IG51bGwgJiYgZmFsc2UgPT0gbGlzdE9mRWxlbWVudHMuaXNFbXB0eSgpKSB7CisJLy8gZm9yIChOZW80akVsZW1lbnQgZWxlbWVudCA6IGxpc3RPZkVsZW1lbnRzKSB7CisJLy8gbG9nZ2VyLmRlYnVnKCJlbGVtZW50IHt9IHdhcyByZXR1cm5lZCBhZnRlciBydW5uaW5nIGJhdGNoIG9wZXJhdGlvbiB7fSIsIGVsZW1lbnQsIGJhdGNoQnVpbGRlcik7CisJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOZW80ak5vZGUpIHsKKwkvLyBOZW80ak5vZGUgbmVvNGpOb2RlID0gKE5lbzRqTm9kZSkgZWxlbWVudDsKKwkvLyBpZiAoTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShuZW80ak5vZGUuZ2V0TGFiZWwoKSkgPT0KKwkvLyBOb2RlVHlwZUVudW0uUHJvcGVydHkpIHsKKwkvLyBwcm9wZXJ0eURhdGEgPSAoUHJvcGVydHlEYXRhKW5lbzRqTm9kZTsKKwkvLyB9CisJLy8gfQorCS8vIH0KKwkvLyB9CisJLy8gfQorCS8vIH0KKwkvLworCS8vIHJldHVybiBFaXRoZXIubGVmdChwcm9wZXJ0eURhdGEpOworCS8vCisJLy8gfSBlbHNlIHsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KGJiUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJLy8gfQorCS8vCisJLy8gfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL05lbzRqUmVzb3VyY2VEQU8uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL2ltcGwvTmVvNGpSZXNvdXJjZURBTy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDdhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL05lbzRqUmVzb3VyY2VEQU8uamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQmFzaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5JUmVzb3VyY2VEQU87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkFjdGlvbkVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFbGVtZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuUmVsYXRpb25FbmRQb2ludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5OZW80akNsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouTmVvNGpHcmFwaEJhdGNoQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouTmVvNGpPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuTWF0Y2hGaWx0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuUmVjdXJzaXZlRmlsdGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvL0BDb21wb25lbnQoIm5lbzRqLXJlc291cmNlLWRhbyIpCitwdWJsaWMgY2xhc3MgTmVvNGpSZXNvdXJjZURBTyBleHRlbmRzIEJhc2ljRGFvIGltcGxlbWVudHMgSVJlc291cmNlREFPIHsKKworCS8vIEBSZXNvdXJjZQorCU5lbzRqQ2xpZW50IG5lbzRqQ2xpZW50OworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5lbzRqUmVzb3VyY2VEQU8uY2xhc3MuZ2V0TmFtZSgpKTsKKworCU5lbzRqR3JhcGhCYXRjaEJ1aWxkZXIgZ3JhcGhCYXRjaEJ1aWxkZXIgPSBuZXcgTmVvNGpHcmFwaEJhdGNoQnVpbGRlcigpOworCisJcHVibGljIE5lbzRqUmVzb3VyY2VEQU8oKSB7CisKKwl9CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCXN1cGVyLnNldE5lbzRqQ2xpZW50KG5lbzRqQ2xpZW50KTsKKwl9CisKKwkvLyBwdWJsaWMgRWl0aGVyPFJlc291cmNlRGF0YSwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlc291cmNlRGF0YSgKKwkvLyBHcmFwaE5laWdoYm91clRhYmxlIGdyYXBoTmVpZ2hib3VyVGFibGUpIHsKKwkvLworCS8vIGlmIChncmFwaE5laWdoYm91clRhYmxlICE9IG51bGwpIHsKKwkvLworCS8vIFN0cmluZyByZXNvdXJjZUlkID0gZmluZFJlc291cmNlRGF0YUlkRnJvbU5vZGVzKGdyYXBoTmVpZ2hib3VyVGFibGUKKwkvLyAuZ2V0Tm9kZXMoKSk7CisJLy8gaWYgKHJlc291cmNlSWQgPT0gbnVsbCB8fCByZXNvdXJjZUlkLmlzRW1wdHkoKSkgeworCS8vIGxvZ2dlci5lcnJvcigiQ2Fubm90IGZpbmQgcmVzb3VyY2UgaWQgaW4gdGhlIGdyYXBoIHRhYmxlIik7CisJLy8gcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVCk7CisJLy8gfQorCS8vCisJLy8gRWl0aGVyPEJhdGNoQnVpbGRlciwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGJiUmVzdWx0ID0gZ3JhcGhCYXRjaEJ1aWxkZXIKKwkvLyAuYnVpbGRCYXRjaEJ1aWxkZXJGcm9tVGFibGUoZ3JhcGhOZWlnaGJvdXJUYWJsZSk7CisJLy8KKwkvLyBpZiAoYmJSZXN1bHQuaXNMZWZ0KCkpIHsKKwkvLworCS8vIEJhdGNoQnVpbGRlciBiYXRjaEJ1aWxkZXIgPSBiYlJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkvLyAvL05lbzRqT3BlcmF0aW9uU3RhdHVzIG5lbzRqT3BlcmF0aW9uU3RhdHVzID0KKwkvLyBuZW80akNsaWVudC5leGVjdXRlKGJhdGNoQnVpbGRlcik7CisJLy8gRWl0aGVyPExpc3Q8TGlzdDxOZW80akVsZW1lbnQ+PiwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGV4ZWN1dGVSZXN1bHQgPQorCS8vIG5lbzRqQ2xpZW50LmV4ZWN1dGUoYmF0Y2hCdWlsZGVyKTsKKwkvLworCS8vIGlmIChleGVjdXRlUmVzdWx0LmlzUmlnaHQoKSkgeworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoZXhlY3V0ZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCS8vIH0KKwkvLworCS8vIFJlc291cmNlRGF0YSByZXNvdXJjZURhdGEgPSBudWxsOworCS8vIExpc3Q8TGlzdDxOZW80akVsZW1lbnQ+PiBsaXN0T2ZSZXN1bHRzID0gZXhlY3V0ZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkvLyBpZiAobGlzdE9mUmVzdWx0cyAhPSBudWxsKSB7CisJLy8gZm9yIChMaXN0PE5lbzRqRWxlbWVudD4gbGlzdE9mRWxlbWVudHMgOiBsaXN0T2ZSZXN1bHRzKSB7CisJLy8gaWYgKGxpc3RPZkVsZW1lbnRzICE9IG51bGwgJiYgZmFsc2UgPT0gbGlzdE9mRWxlbWVudHMuaXNFbXB0eSgpKSB7CisJLy8gZm9yIChOZW80akVsZW1lbnQgZWxlbWVudCA6IGxpc3RPZkVsZW1lbnRzKSB7CisJLy8gbG9nZ2VyLmRlYnVnKCJlbGVtZW50IHt9IHdhcyByZXR1cm5lZCBhZnRlciBydW5uaW5nIGJhdGNoIG9wZXJhdGlvbiB7fSIsIGVsZW1lbnQsIGJhdGNoQnVpbGRlcik7CisJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOZW80ak5vZGUpIHsKKwkvLyBOZW80ak5vZGUgbmVvNGpOb2RlID0gKE5lbzRqTm9kZSkgZWxlbWVudDsKKwkvLyBpZiAoTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShuZW80ak5vZGUuZ2V0TGFiZWwoKSkgPT0KKwkvLyBOb2RlVHlwZUVudW0uUmVzb3VyY2UpIHsKKwkvLyByZXNvdXJjZURhdGEgPSAoUmVzb3VyY2VEYXRhKW5lbzRqTm9kZTsKKwkvLyB9CisJLy8gfQorCS8vIH0KKwkvLyB9CisJLy8gfQorCS8vIH0KKwkvLworCS8vIHJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZURhdGEpOworCS8vCisJLy8gfSBlbHNlIHsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KGJiUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJLy8gfQorCS8vCisJLy8gfSBlbHNlIHsKKwkvLyBsb2dnZXIuZXJyb3IoIlRoZSB0YWJsZSBzZW50IGluIG9yZGVyIHRvIGNyZWF0ZSByZXNvdXJjZSBpcyBlbXB0eS4iKTsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KE5lbzRqT3BlcmF0aW9uU3RhdHVzLkJBRF9SRVFVRVNUKTsKKwkvLyB9CisJLy8gfQorCisJcHJpdmF0ZSBTdHJpbmcgZmluZFJlc291cmNlRGF0YUlkRnJvbU5vZGVzKExpc3Q8R3JhcGhOb2RlPiBub2RlcykgeworCisJCWlmIChub2RlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoR3JhcGhOb2RlIG5lbzRqTm9kZSA6IG5vZGVzKSB7CisJCQkJU3RyaW5nIGxhYmVsID0gbmVvNGpOb2RlLmdldExhYmVsKCk7CisJCQkJaWYgKGxhYmVsLmVxdWFscyhOb2RlVHlwZUVudW0uUmVzb3VyY2UuZ2V0TmFtZSgpKSkgeworCQkJCQlyZXR1cm4gbmVvNGpOb2RlLmdldFVuaXF1ZUlkKCkudG9TdHJpbmcoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEdyYXBoUmVsYXRpb24gYWRkU3RhdGVSZWxhdGlvbihSZWxhdGlvbkVuZFBvaW50IGZyb20sIFJlbGF0aW9uRW5kUG9pbnQgdG8sIEdyYXBoRWRnZUxhYmVscyBlZGdlTGFiZWwsCisJCQlTdHJpbmcgdmFsdWUpIHsKKworCQlHcmFwaFJlbGF0aW9uIHJlbGF0aW9uU3RhdGUgPSBuZXcgR3JhcGhSZWxhdGlvbigpOworCQlyZWxhdGlvblN0YXRlLnNldEZyb20oZnJvbSk7CisJCXJlbGF0aW9uU3RhdGUuc2V0VG8odG8pOworCQlyZWxhdGlvblN0YXRlLnNldFR5cGUoZWRnZUxhYmVsLm5hbWUoKSk7CisJCXJlbGF0aW9uU3RhdGUuc2V0QWN0aW9uKEFjdGlvbkVudW0uQ3JlYXRlKTsKKwkJcmV0dXJuIHJlbGF0aW9uU3RhdGU7CisJfQorCisJLy8gcHJpdmF0ZSBBY3Rpb25TdGF0dXMgY29udmVydE5lbzRqT3BlcmF0aW9uU3RhdHVzVG9BY3Rpb25TdGF0dXMoCisJLy8gTmVvNGpPcGVyYXRpb25TdGF0dXMgdmFsdWUpIHsKKwkvLworCS8vIGlmICh2YWx1ZSA9PSBudWxsKSB7CisJLy8gcmV0dXJuIEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCS8vIH0KKwkvLworCS8vIHN3aXRjaCAodmFsdWUpIHsKKwkvLyBjYXNlIE5PVF9GT1VORDoKKwkvLyByZXR1cm4gQWN0aW9uU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORDsKKwkvLyBjYXNlIEVSUk9SOgorCS8vIHJldHVybiBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkvLyBjYXNlIE5PVF9TVVBQT1JURUQ6CisJLy8gcmV0dXJuIEFjdGlvblN0YXR1cy5JTlZBTElEX0NPTlRFTlQ7CisJLy8gY2FzZSBXUk9OR19JTlBVVDoKKwkvLyByZXR1cm4gQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVDsKKwkvLyBjYXNlIE9LOgorCS8vIHJldHVybiBBY3Rpb25TdGF0dXMuT0s7CisJLy8gZGVmYXVsdDoKKwkvLyByZXR1cm4gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJLy8gfQorCS8vCisJLy8gfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlRGF0YShTdHJpbmcgaWQpIHsKKworCQlNYXRjaEZpbHRlciBmaWx0ZXIgPSBuZXcgTWF0Y2hGaWx0ZXIoKTsKKwkJZmlsdGVyLmFkZFRvTWF0Y2goR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgaWQpOworCQlFaXRoZXI8TGlzdDxHcmFwaEVsZW1lbnQ+LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gbmVvNGpDbGllbnQuZ2V0QnlGaWx0ZXIoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UuZ2V0TmFtZSgpLCBmaWx0ZXIpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJTGlzdDxHcmFwaEVsZW1lbnQ+IHZhbHVlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoKFJlc291cmNlTWV0YWRhdGFEYXRhKSB2YWx1ZS5nZXQoMCkpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBOZW80ak9wZXJhdGlvblN0YXR1cz4gZ2V0TnVtYmVyT2ZSZXNvdXJjZXNCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKworCQlNYXRjaEZpbHRlciBmaWx0ZXIgPSBuZXcgTWF0Y2hGaWx0ZXIoKTsKKwkJZmlsdGVyLmFkZFRvTWF0Y2goR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIG5hbWUpOworCQlFaXRoZXI8TGlzdDxHcmFwaEVsZW1lbnQ+LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gbmVvNGpDbGllbnQuZ2V0QnlGaWx0ZXIoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UuZ2V0TmFtZSgpLCBmaWx0ZXIpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpIHx8IChzdGF0dXMubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0gZWxzZSB7CisJCQlMaXN0PEdyYXBoRWxlbWVudD4gdmFsdWUgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodmFsdWUuc2l6ZSgpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5lbzRqQ2xpZW50KE5lbzRqQ2xpZW50IGNsaWVudCkgeworCQl0aGlzLm5lbzRqQ2xpZW50ID0gY2xpZW50OworCQlzdXBlci5zZXROZW80akNsaWVudChjbGllbnQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxSZXNvdXJjZXNEYXRhKAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCkgeworCisJCVJlY3Vyc2l2ZUZpbHRlciBmaWx0ZXIgPSBuZXcgUmVjdXJzaXZlRmlsdGVyKE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCS8vIGZpbHRlci5hZGRSZWxhdGlvblR5cGUoInR5cGVvZiIpLmFkZFJlbGF0aW9uVHlwZSgiYmVsb25nIikuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzVG9NYXRjaCk7CisKKwkJRWl0aGVyPExpc3Q8TGlzdDxHcmFwaEVsZW1lbnQ+PiwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHJldCA9IG5lbzRqQ2xpZW50LmV4ZWN1dGVHZXQoZmlsdGVyKTsKKwkJaWYgKHJldC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmV0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJTGlzdDxMaXN0PEdyYXBoRWxlbWVudD4+IGxpc3RPZkxpc3RPZk5lbzRqRWxlbWVudCA9IHJldC5sZWZ0KCkudmFsdWUoKTsKKworCQlmb3IgKExpc3Q8R3JhcGhFbGVtZW50PiByb3cgOiBsaXN0T2ZMaXN0T2ZOZW80akVsZW1lbnQpIHsKKworCQkJZm9yIChHcmFwaEVsZW1lbnQgZWxlbSA6IHJvdykgeworCisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChudWxsKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vaW1wbC9OZW80alVzZXJzREFPLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9pbXBsL05lbzRqVXNlcnNEQU8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWE3N2YxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vaW1wbC9OZW80alVzZXJzREFPLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuSVVzZXJzREFPOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5OZW80akNsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouTmVvNGpPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuTWF0Y2hGaWx0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuVXBkYXRlRmlsdGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8vQENvbXBvbmVudCgidXNlcnMtZGFvIikKK3B1YmxpYyBjbGFzcyBOZW80alVzZXJzREFPIGltcGxlbWVudHMgSVVzZXJzREFPIHsKKworCS8vIEBSZXNvdXJjZQorCU5lbzRqQ2xpZW50IG5lbzRqQ2xpZW50OworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5lbzRqVXNlcnNEQU8uY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBOZW80alVzZXJzREFPKCkgeworCisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVJbmRleGVzQW5kQ29uc3RyYWludHMoKSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gc3RhdHVzSW5kID0gbmVvNGpDbGllbnQKKwkJCQkuZ2V0SW5kZXhlcyhOb2RlVHlwZUVudW0uVXNlci5nZXROYW1lKCkpOworCQlpZiAoc3RhdHVzSW5kLmlzUmlnaHQoKSkgeworCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGluZGV4ZXMgZnJvbSBOZW80aiBncmFwaCIpOworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBpbml0aWFsaXplIE5lbzRqVXNlcnNEQU8gLSBGYWlsZWQgdG8gZ2V0IGluZGV4ZXMgZnJvbSBOZW80aiBncmFwaCIpOworCQl9CisJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaW5kZXhlcyA9IHN0YXR1c0luZC5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGluZGV4ZXMgPT0gbnVsbCB8fCBpbmRleGVzLmlzRW1wdHkoKSkgeworCQkJbG9nZ2VyLmluZm8oIkRlZmluZSB1c2VycyBpbmRleGVzIGluIE5lbzRqIik7CisJCQlMaXN0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJcHJvcGVydHlOYW1lcy5hZGQoImZpcnN0TmFtZSIpOworCQkJcHJvcGVydHlOYW1lcy5hZGQoImxhc3ROYW1lIik7CisJCQlwcm9wZXJ0eU5hbWVzLmFkZCgiZW1haWwiKTsKKwkJCXByb3BlcnR5TmFtZXMuYWRkKCJyb2xlIik7CisJCQlsb2dnZXIuaW5mbygiU3RhcnQgY3JlYXRlIFVzZXJzIGluZGV4ZXMgaW4gTmVvNGpHcmFwaCIpOworCQkJTmVvNGpPcGVyYXRpb25TdGF0dXMgY3JlYXRlSW5kZXhTdGF0dXMgPSBuZW80akNsaWVudC5jcmVhdGVJbmRleChOb2RlVHlwZUVudW0uVXNlci5nZXROYW1lKCksCisJCQkJCXByb3BlcnR5TmFtZXMpOworCQkJaWYgKGNyZWF0ZUluZGV4U3RhdHVzLmVxdWFscyhOZW80ak9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlsb2dnZXIuaW5mbygiVXNlcnMgaW5kZXhlcyBjcmVhdGVkIGluIE5lbzRqIik7CisJCQkJTGlzdDxTdHJpbmc+IHByb3BlcnR5VW5pcXVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJcHJvcGVydHlVbmlxdWUuYWRkKCJ1c2VySWQiKTsKKworCQkJCWxvZ2dlci5pbmZvKCJTdGFydCBjcmVhdGUgVXNlcnMgY29uc3RyYWludHMgaW4gTmVvNGpHcmFwaCIpOworCQkJCU5lbzRqT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVVuaXF1ZW5lc3NTdGF0dXMgPSBuZW80akNsaWVudAorCQkJCQkJLmNyZWF0ZVVuaXF1ZW5lc3NDb25zdHJhaW50cyhOb2RlVHlwZUVudW0uVXNlci5nZXROYW1lKCksIHByb3BlcnR5VW5pcXVlKTsKKwkJCQlpZiAoY3JlYXRlVW5pcXVlbmVzc1N0YXR1cy5lcXVhbHMoTmVvNGpPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWxvZ2dlci5pbmZvKCJVc2VycyBjb25zdHJhaW50cyBjcmVhdHllZCBpbiBOZW80aiIpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjb25zdHJhaW50cyBpbiBOZW80aiBncmFwaCBbIiArIGNyZWF0ZVVuaXF1ZW5lc3NTdGF0dXMgKyAiXSIpOworCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKwkJCQkJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgTmVvNGpVc2Vyc0RBTyAtIEZhaWxlZCB0byBjcmVhdGUgY29uc3RyYWludHMgaW4gTmVvNGogZ3JhcGgiKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBpbmRleGVzIGluIE5lbzRqIGdyYXBoIFsiICsgY3JlYXRlSW5kZXhTdGF0dXMgKyAiXSIpOworCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorCQkJCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIE5lbzRqVXNlcnNEQU8gLSBGYWlsZWQgdG8gY3JlYXRlIGluZGV4ZXMgaW4gTmVvNGogZ3JhcGgiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5pbmZvKCJVc2VycyBpbmRleGVzIGFscmVhZHkgZGVmaW5lZCBpbiBOZW80aiIpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxVc2VyRGF0YSwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyRGF0YShTdHJpbmcgaWQpIHsKKwkJTWF0Y2hGaWx0ZXIgZmlsdGVyID0gbmV3IE1hdGNoRmlsdGVyKCk7CisJCWZpbHRlci5hZGRUb01hdGNoKCJ1c2VySWQiLCBpZCk7CisJCUVpdGhlcjxMaXN0PEdyYXBoRWxlbWVudD4sIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBuZW80akNsaWVudC5nZXRCeUZpbHRlcihHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLAorCQkJCU5vZGVUeXBlRW51bS5Vc2VyLmdldE5hbWUoKSwgZmlsdGVyKTsKKwkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9IGVsc2UgeworCQkJTGlzdDxHcmFwaEVsZW1lbnQ+IHZhbHVlID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuVVNFUl9OT1RfRk9VTkQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoKFVzZXJEYXRhKSB2YWx1ZS5nZXQoMCkpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEFjdGlvblN0YXR1cyBzYXZlVXNlckRhdGEoVXNlckRhdGEgdXNlckRhdGEpIHsKKwkJTmVvNGpPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gbmVvNGpDbGllbnQuY3JlYXRlRWxlbWVudCh1c2VyRGF0YSk7CisJCWlmIChzdGF0dXMuZXF1YWxzKE5lbzRqT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIEFjdGlvblN0YXR1cy5PSzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBY3Rpb25TdGF0dXMgdXBkYXRlVXNlckRhdGEoVXNlckRhdGEgdXNlckRhdGEpIHsKKwkJVXBkYXRlRmlsdGVyIGZpbHRlciA9IG5ldyBVcGRhdGVGaWx0ZXIoKTsKKwkJZmlsdGVyLmFkZFRvTWF0Y2goInVzZXJJZCIsIHVzZXJEYXRhLmdldFVzZXJJZCgpKTsKKwkJZmlsdGVyLnNldFRvVXBkYXRlKHVzZXJEYXRhLnRvR3JhcGhNYXAoKSk7CisJCU5lbzRqT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IG5lbzRqQ2xpZW50LnVwZGF0ZUVsZW1lbnQoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgTm9kZVR5cGVFbnVtLlVzZXIuZ2V0TmFtZSgpLAorCQkJCWZpbHRlcik7CisJCWlmIChzdGF0dXMuZXF1YWxzKE5lbzRqT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIEFjdGlvblN0YXR1cy5PSzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBY3Rpb25TdGF0dXMgZGVsZXRlVXNlckRhdGEoU3RyaW5nIGlkKSB7CisJCU1hdGNoRmlsdGVyIGZpbHRlciA9IG5ldyBNYXRjaEZpbHRlcigpOworCQlmaWx0ZXIuYWRkVG9NYXRjaCgidXNlcklkIiwgaWQpOworCQlOZW80ak9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBuZW80akNsaWVudC5kZWxldGVFbGVtZW50KEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIE5vZGVUeXBlRW51bS5Vc2VyLmdldE5hbWUoKSwKKwkJCQlmaWx0ZXIpOworCQlpZiAoc3RhdHVzLmVxdWFscyhOZW80ak9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCXJldHVybiBBY3Rpb25TdGF0dXMuT0s7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwl9CisKKwlwdWJsaWMgTmVvNGpDbGllbnQgZ2V0TmVvNGpDbGllbnQoKSB7CisJCXJldHVybiBuZW80akNsaWVudDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROZW80akNsaWVudChOZW80akNsaWVudCBuZW80akNsaWVudCkgeworCQl0aGlzLm5lbzRqQ2xpZW50ID0gbmVvNGpDbGllbnQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9tb2RlbC9GYWNldGVkU2VhcmNoRmFjZXQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL21vZGVsL0ZhY2V0ZWRTZWFyY2hGYWNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZGI5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9tb2RlbC9GYWNldGVkU2VhcmNoRmFjZXQuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBmYWNldCBpbmZvcm1hdGlvbnMuCisgKiAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlBNRC5VbnVzZWRQcml2YXRlRmllbGQiKQorcHVibGljIGNsYXNzIEZhY2V0ZWRTZWFyY2hGYWNldCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisJcHVibGljIEZhY2V0ZWRTZWFyY2hGYWNldChTdHJpbmcgZmFjZXRWYWx1ZSwgaW50IGNvdW50KSB7CisJCXRoaXMuY291bnQgPSBjb3VudDsKKwkJdGhpcy5mYWNldFZhbHVlID0gZmFjZXRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZhY2V0VmFsdWUoKSB7CisJCXJldHVybiBmYWNldFZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZhY2V0VmFsdWUoU3RyaW5nIGZhY2V0VmFsdWUpIHsKKwkJdGhpcy5mYWNldFZhbHVlID0gZmFjZXRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRDb3VudCgpIHsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCXB1YmxpYyB2b2lkIHNldENvdW50KGxvbmcgY291bnQpIHsKKwkJdGhpcy5jb3VudCA9IGNvdW50OworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCXByaXZhdGUgU3RyaW5nIGZhY2V0VmFsdWU7CisJcHJpdmF0ZSBsb25nIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbW9kZWwvRmFjZXRlZFNlYXJjaFJlc3VsdC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbW9kZWwvRmFjZXRlZFNlYXJjaFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMTRlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9tb2RlbC9GYWNldGVkU2VhcmNoUmVzdWx0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQ29udGFpbnMgcmVzdWx0cyBmb3IgYSBzZWFyY2ggcXVlcnkuCisgKiAKKyAqLworCitAU3VwcHJlc3NXYXJuaW5ncygiUE1ELlVudXNlZFByaXZhdGVGaWVsZCIpCitwdWJsaWMgY2xhc3MgRmFjZXRlZFNlYXJjaFJlc3VsdCBleHRlbmRzIEdldE11bHRpcGxlRGF0YVJlc3VsdCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEZhY2V0ZWRTZWFyY2hGYWNldFtdPiBmYWNldHM7CisKKwkvKioKKwkgKiBBcmd1bWVudCBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gZnJvbQorCSAqICAgICAgICAgICAgVGhlIHN0YXJ0IGluZGV4IG9mIHRoZSByZXR1cm5lZCBlbGVtZW50cy4KKwkgKiBAcGFyYW0gdG8KKwkgKiAgICAgICAgICAgIFRoZSBlbmQgaW5kZXggb2YgdGhlIHJldHVybmVkIGVsZW1lbnRzLgorCSAqIEBwYXJhbSBxdWVyeUR1cmF0aW9uCisJICogICAgICAgICAgICBUaGUgZHVyYXRpb24gb2YgdGhlIHF1ZXJ5LgorCSAqIEBwYXJhbSB0b3RhbFJlc3VsdHMKKwkgKiAgICAgICAgICAgIFRoZSB0b3RhbCByZXN1bHRzIGZvciB0aGlzIHF1ZXJ5LgorCSAqIEBwYXJhbSB0eXBlcworCSAqICAgICAgICAgICAgVGhlIHR5cGVzIG9mIGRhdGEgZm91bmQuCisJICogQHBhcmFtIGRhdGEKKwkgKiAgICAgICAgICAgIFRoZSBmb3VuZCBkYXRhLgorCSAqIEBwYXJhbSBoYXNoTWFwCisJICogICAgICAgICAgICBUaGUgZmFjZXRzIGlmIGFueSBmb3IgdGhlIHF1ZXJ5LgorCSAqLworCXB1YmxpYyBGYWNldGVkU2VhcmNoUmVzdWx0KGZpbmFsIGludCBmcm9tLCBmaW5hbCBpbnQgdG8sIGZpbmFsIGxvbmcgcXVlcnlEdXJhdGlvbiwgZmluYWwgbG9uZyB0b3RhbFJlc3VsdHMsCisJCQlmaW5hbCBTdHJpbmdbXSB0eXBlcywgZmluYWwgT2JqZWN0W10gZGF0YSwgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEZhY2V0ZWRTZWFyY2hGYWNldFtdPiBoYXNoTWFwKSB7CisJCXN1cGVyKHR5cGVzLCBkYXRhLCBxdWVyeUR1cmF0aW9uLCB0b3RhbFJlc3VsdHMsIGZyb20sIHRvKTsKKwkJdGhpcy5mYWNldHMgPSBoYXNoTWFwOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBGYWNldGVkU2VhcmNoRmFjZXRbXT4gZ2V0RmFjZXRzKCkgeworCQlyZXR1cm4gZmFjZXRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZhY2V0cyhNYXA8U3RyaW5nLCBGYWNldGVkU2VhcmNoRmFjZXRbXT4gZmFjZXRzKSB7CisJCXRoaXMuZmFjZXRzID0gZmFjZXRzOworCX0KKworCXB1YmxpYyBGYWNldGVkU2VhcmNoUmVzdWx0KCkgeworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbW9kZWwvRmV0Y2hDb250ZXh0LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9tb2RlbC9GZXRjaENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDJjMzhjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbW9kZWwvRmV0Y2hDb250ZXh0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5tb2RlbDsKKworcHVibGljIGZpbmFsIGNsYXNzIEZldGNoQ29udGV4dCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUlDS19TRUFSQ0ggPSAicXVpY2tfc2VhcmNoIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU1VHR0VTVElPTiA9ICJ0YWdfc3VnZ2VzdGlvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1NVTU1BUlkgPSAiY29tcG9uZW50X3N1bW1hcnkiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlQgPSAiZGVwbG95bWVudCI7CisKKwlwcml2YXRlIEZldGNoQ29udGV4dCgpIHsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9tb2RlbC9HZXRNdWx0aXBsZURhdGFSZXN1bHQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL21vZGVsL0dldE11bHRpcGxlRGF0YVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTA1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9tb2RlbC9HZXRNdWx0aXBsZURhdGFSZXN1bHQuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIFJlc3VsdCBmb3IgYSBtdWx0aXBsZSBkYXRhIHF1ZXJ5LgorICogCisgKiBAYXV0aG9yIGx1YyBib3V0aWVyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJQTUQuVW51c2VkUHJpdmF0ZUZpZWxkIikKK3B1YmxpYyBjbGFzcyBHZXRNdWx0aXBsZURhdGFSZXN1bHQ8VD4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCXB1YmxpYyBTdHJpbmdbXSBnZXRUeXBlcygpIHsKKwkJcmV0dXJuIHR5cGVzOworCX0KKworCXB1YmxpYyBUW10gZ2V0RGF0YSgpIHsKKwkJcmV0dXJuIGRhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZXMoU3RyaW5nW10gdHlwZXMpIHsKKwkJdGhpcy50eXBlcyA9IHR5cGVzLmNsb25lKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YShUW10gZGF0YSkgeworCQl0aGlzLmRhdGEgPSBkYXRhLmNsb25lKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0UXVlcnlEdXJhdGlvbihsb25nIHF1ZXJ5RHVyYXRpb24pIHsKKwkJdGhpcy5xdWVyeUR1cmF0aW9uID0gcXVlcnlEdXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3RhbFJlc3VsdHMobG9uZyB0b3RhbFJlc3VsdHMpIHsKKwkJdGhpcy50b3RhbFJlc3VsdHMgPSB0b3RhbFJlc3VsdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RnJvbShpbnQgZnJvbSkgeworCQl0aGlzLmZyb20gPSBmcm9tOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvKGludCB0bykgeworCQl0aGlzLnRvID0gdG87CisJfQorCisJcHVibGljIGxvbmcgZ2V0UXVlcnlEdXJhdGlvbigpIHsKKwkJcmV0dXJuIHF1ZXJ5RHVyYXRpb247CisJfQorCisJcHVibGljIGxvbmcgZ2V0VG90YWxSZXN1bHRzKCkgeworCQlyZXR1cm4gdG90YWxSZXN1bHRzOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RnJvbSgpIHsKKwkJcmV0dXJuIGZyb207CisJfQorCisJcHVibGljIGludCBnZXRUbygpIHsKKwkJcmV0dXJuIHRvOworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJcHJpdmF0ZSBTdHJpbmdbXSB0eXBlczsKKwlwcml2YXRlIFRbXSBkYXRhOworCXByaXZhdGUgbG9uZyBxdWVyeUR1cmF0aW9uOworCXByaXZhdGUgbG9uZyB0b3RhbFJlc3VsdHM7CisJcHJpdmF0ZSBpbnQgZnJvbTsKKwlwcml2YXRlIGludCB0bzsKKworCS8qKgorCSAqIENvbnN0cnVjdCBhbiBvYmplY3Qgb25seSB3aXRoIGRhdGEgYW5kIHR5cGVzCisJICogCisJICogQHBhcmFtIHR5cGVzCisJICogQHBhcmFtIGRhdGEKKwkgKi8KKwlwdWJsaWMgR2V0TXVsdGlwbGVEYXRhUmVzdWx0KFN0cmluZ1tdIHR5cGVzLCBUW10gZGF0YSkgeworCQl0aGlzLnR5cGVzID0gdHlwZXMuY2xvbmUoKTsKKwkJdGhpcy5kYXRhID0gZGF0YS5jbG9uZSgpOworCX0KKworCXB1YmxpYyBHZXRNdWx0aXBsZURhdGFSZXN1bHQoU3RyaW5nW10gdHlwZXMsIE9iamVjdFtdIGRhdGEsIGxvbmcgcXVlcnlEdXJhdGlvbiwgbG9uZyB0b3RhbFJlc3VsdHMsIGludCBmcm9tLAorCQkJaW50IHRvKSB7CisKKwkJdGhpcy50eXBlcyA9IHR5cGVzLmNsb25lKCk7CisJCXRoaXMuZGF0YSA9IChUW10pIGRhdGEuY2xvbmUoKTsKKwkJdGhpcy5xdWVyeUR1cmF0aW9uID0gcXVlcnlEdXJhdGlvbjsKKwkJdGhpcy50b3RhbFJlc3VsdHMgPSB0b3RhbFJlc3VsdHM7CisJCXRoaXMuZnJvbSA9IGZyb207CisJCXRoaXMudG8gPSB0bzsKKwl9CisKKwlwdWJsaWMgR2V0TXVsdGlwbGVEYXRhUmVzdWx0KCkgeworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL0JhdGNoQnVpbGRlci5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovQmF0Y2hCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3N2QwYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL0JhdGNoQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGo7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFbGVtZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CisKK3B1YmxpYyBjbGFzcyBCYXRjaEJ1aWxkZXIgeworCS8vIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxOZW80ak5vZGU+PiBub2RlczsKKwkvLyBwcml2YXRlIExpc3Q8TmVvNGpSZWxhdGlvbj4gcmVsYXRpb25zOworCS8vCisJcHJpdmF0ZSBMaXN0PEdyYXBoRWxlbWVudD4gZWxlbWVudHM7CisKKwkvLyBUT0RPIGFkZCBmaWx0ZXIKKworCXByb3RlY3RlZCBCYXRjaEJ1aWxkZXIoKSB7CisJCS8vIG5vZGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PE5lbzRqTm9kZT4+KCk7CisJCS8vIHJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TmVvNGpSZWxhdGlvbj4oKTsKKwkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoRWxlbWVudD4oKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEJhdGNoQnVpbGRlciBnZXRCdWlsZGVyKCkgeworCQlyZXR1cm4gbmV3IEJhdGNoQnVpbGRlcigpOworCX0KKworCXB1YmxpYyBCYXRjaEJ1aWxkZXIgYWRkKEdyYXBoRWxlbWVudCBlbGVtZW50KSB7CisJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIExpc3Q8R3JhcGhFbGVtZW50PiBnZXRFbGVtZW50cygpIHsKKwkJcmV0dXJuIGVsZW1lbnRzOworCX0KKworCS8vIHB1YmxpYyBCYXRjaEJ1aWxkZXIgYWRkKCBOZW80ak5vZGUgZWxlbWVudCApeworCS8vIFN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0TGFiZWwoKTsKKwkvLyBMaXN0PE5lbzRqTm9kZT4gbGlzdCA9IG5vZGVzLmdldChsYWJlbCk7CisJLy8gaWYgKCBsaXN0ID09IG51bGwgKXsKKwkvLyBsaXN0ID0gbmV3IEFycmF5TGlzdDxOZW80ak5vZGU+KCk7CisJLy8gfQorCS8vIGxpc3QuYWRkKGVsZW1lbnQpOworCS8vIG5vZGVzLnB1dChsYWJlbCwgbGlzdCk7CisKKwkvLyByZXR1cm4gdGhpczsKKwkvLyB9CisJLy8gcHVibGljIEJhdGNoQnVpbGRlciBhZGQoIE5lbzRqUmVsYXRpb24gcmVsYXRpb24gKXsKKwkvLyByZWxhdGlvbnMuYWRkKHJlbGF0aW9uKTsKKwkvLyByZXR1cm4gdGhpczsKKwkvLyB9CisJLy8KKwkvLyBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxOZW80ak5vZGU+PiBnZXROb2RlcygpIHsKKwkvLyByZXR1cm4gbm9kZXM7CisJLy8gfQorCS8vCisJLy8gcHVibGljIExpc3Q8TmVvNGpSZWxhdGlvbj4gZ2V0UmVsYXRpb25zKCkgeworCS8vIHJldHVybiByZWxhdGlvbnM7CisJLy8gfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9DeXBoZXJUZW1wbGF0ZXMuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL0N5cGhlclRlbXBsYXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjJjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9DeXBoZXJUZW1wbGF0ZXMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqOworCitwdWJsaWMgaW50ZXJmYWNlIEN5cGhlclRlbXBsYXRlcyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDeXBoZXJVcmxUZW1wbGF0ZSA9ICJodHRwOi8vJGhvc3QkOiRwb3J0JC9kYi9kYXRhL3RyYW5zYWN0aW9uL2NvbW1pdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYmF0Y2hUZW1wbGF0ZSA9ICJodHRwOi8vJGhvc3QkOiRwb3J0JC9kYi9kYXRhL2JhdGNoIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBbGxJbmRleHNUZW1wbGF0ZSA9ICJodHRwOi8vJGhvc3QkOiRwb3J0JC9kYi9kYXRhL3NjaGVtYS9pbmRleCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDeXBoZXJDcmVhdGVOb2RlVGVtcGxhdGUgPSAie1xuXCJzdGF0ZW1lbnRzXCIgOiBbIHtcbiBcInN0YXRlbWVudFwiIDogXCJDUkVBVEUgKG46JGxhYmVsJCB7IHByb3BzIH0gKSBSRVRVUk4gblwiLFxuICBcInBhcmFtZXRlcnNcIiA6IHsgXG4gIFwicHJvcHNcIiA6ICRwcm9wcyQgXG4gIH0JICB9IF0JfSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDeXBoZXJNYXRjaFRlbXBsYXRlID0gIntcInN0YXRlbWVudHNcIjogW3tcInN0YXRlbWVudFwiOiBcIk1BVENIIChuOiRsYWJlbCQgeyRmaWx0ZXIkfSkgUkVUVVJOICgkdHlwZSQpIFwiIH1dfSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDeXBoZXJVcGRhdGVUZW1wbGF0ZSA9ICJ7XCJzdGF0ZW1lbnRzXCI6IFt7XCJzdGF0ZW1lbnRcIjogXCJNQVRDSCAobjokbGFiZWwkIHskZmlsdGVyJH0pIFNFVCBuICs9IHtwcm9wc30gUkVUVVJOICgkdHlwZSQpIFwiLFwicGFyYW1ldGVyc1wiIDoge1wicHJvcHNcIiA6IHskcHJvcHMkfX19XX0iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEN5cGhlckRlbGV0ZU5vZGVUZW1wbGF0ZSA9ICJ7XCJzdGF0ZW1lbnRzXCI6IFt7XCJzdGF0ZW1lbnRcIjogXCJNQVRDSCAoIG46JGxhYmVsJCB7JGZpbHRlciR9ICkgREVMRVRFIG4gXCIgfV19IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJhdGNoVGVtcGxhdGUgPSAieyAgXCJzdGF0ZW1lbnRzXCIgOiBbICRzdGF0ZW1lbnRMaXN0JCBdIH0iOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUmVndWxhclN0YXRlbWVudFRlbXBsYXRlID0gInsgXCJzdGF0ZW1lbnRcIiA6ICRzdGF0ZW1lbnQkICB9IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENyZWF0ZVNpbmdsZU5vZGVUZW1wbGF0ZSA9ICIgXCJDUkVBVEUgKG46JGxhYmVsJCB7IHByb3BzIH0gKSBSRVRVUk4gbiwgbGFiZWxzKG4pXCIsICBcInBhcmFtZXRlcnNcIiA6IHsgXCJwcm9wc1wiIDogJHByb3BzJCB9IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENyZWF0ZVJlbGF0aW9uVGVtcGxhdGUgPSAiXCJNQVRDSCAoYTokbGFiZWxGcm9tJCksKGI6JGxhYmVsVG8kKSBXSEVSRSBhLiRpZE5hbWVGcm9tJCA9ICckaWRWYWx1ZUZyb20kJyBBTkQgYi4kaWROYW1lVG8kID0gJyRpZHZhbHVlVG8kJyBDUkVBVEUgKGEpLVtyOiR0eXBlJCB7IHByb3BzIH0gIF0tPihiKSBSRVRVUk4gYSwgbGFiZWxzKGEpLCBiLCBsYWJlbHMoYiksIHIsIHR5cGUocilcIiwgIFwicGFyYW1ldGVyc1wiOiB7XCJwcm9wc1wiOiAkcHJvcHMkIH0gIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENyZWF0ZVJlbGF0aW9uVGVtcGxhdGVOb1Byb3BzID0gIlwiTUFUQ0ggKGE6JGxhYmVsRnJvbSQpLChiOiRsYWJlbFRvJCkgV0hFUkUgYS4kaWROYW1lRnJvbSQgPSAnJGlkVmFsdWVGcm9tJCcgQU5EIGIuJGlkTmFtZVRvJCA9ICckaWR2YWx1ZVRvJCcgQ1JFQVRFIChhKS1bcjokdHlwZSQgXS0+KGIpIFJFVFVSTiBhLGxhYmVscyhhKSwgYiwgbGFiZWxzKGIpLCByLCB0eXBlKHIpXCIiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVXBkYXRlTm9kZVN0YXRlbWVudFRlbXBsYXRlID0gIlwiTUFUQ0ggKG46JGxhYmVsJCB7JGZpbHRlciR9KSBTRVQgbiArPSB7cHJvcHN9IFwiLFwicGFyYW1ldGVyc1wiIDoge1wicHJvcHNcIiA6ICRwcm9wcyR9IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdldE5vZGVSZWN1cnNpdmVUZW1wbGF0ZSA9ICJcIk1BVENIIChtOiRsYWJlbCQgeyRmaWx0ZXIkfSApLVtmJHR5cGVzTGlzdCRdLT5sIFJFVFVSTiBtLCBsYWJlbHMobSksIGwsIGxhYmVscyhsKSxmLCB0eXBlKGYpXCIiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR2V0QnlSZWxhdGlvbk5vZGVSZWN1cnNpdmVUZW1wbGF0ZSA9ICJcIk1BVENIIChuOiRsYWJlbE5vZGUkICgkcHJvcHNOb2RlJH0gKS1bcjokdHlwZSQgeyRwcm9wc1JlbCR9XS0+KG06JGxhYmVsU3JjJCktW2YkdHlwZXNMaXN0JF0tPmwgUkVUVVJOIG4sIGxhYmVscyhuKSwgciwgdHlwZShyKSwgbSwgbGFiZWxzKG0pLCBsLCBsYWJlbHMobCksZiwgdHlwZShmKVwiIjsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovQ3lwaGVyVHJhbnNsYXRvci5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovQ3lwaGVyVHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDA5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9DeXBoZXJUcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGo7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5SZWxhdGlvbkVuZFBvaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5maWx0ZXJzLk1hdGNoRmlsdGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5maWx0ZXJzLlJlY3Vyc2l2ZUJ5UmVsYXRpb25GaWx0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuUmVjdXJzaXZlRmlsdGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5EYW9VdGlsczsKKworcHVibGljIGNsYXNzIEN5cGhlclRyYW5zbGF0b3IgeworCisJcHVibGljIFN0cmluZyB0cmFuc2xhdGUoQmF0Y2hCdWlsZGVyIGJ1aWxkZXIpIHsKKwkJU3RyaW5nIGpzb24gPSBudWxsOworCQlTdHJpbmdCdWlsZGVyIHN0YXRlbWVudExpc3QgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCUxpc3Q8R3JhcGhFbGVtZW50PiBlbGVtZW50cyA9IGJ1aWxkZXIuZ2V0RWxlbWVudHMoKTsKKwkJaW50IHN0YXRlbWVudENvdW50ZXIgPSAwOworCQlmb3IgKEdyYXBoRWxlbWVudCBlbGVtZW50IDogZWxlbWVudHMpIHsKKwkJCVN0cmluZyBzaW5nbGVTdGF0ZW1lbnRCb2R5ID0gbnVsbDsKKwkJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQljYXNlIE5vZGU6CisJCQkJc2luZ2xlU3RhdGVtZW50Qm9keSA9IHByZXBhcmVOb2RlU3RhdGVtZW50KGVsZW1lbnQpOworCQkJCWJyZWFrOworCQkJY2FzZSBSZWxhdGlvbnNoaXA6CisJCQkJc2luZ2xlU3RhdGVtZW50Qm9keSA9IHByZXBhcmVSZWxhdGlvblN0YXRlbWVudChlbGVtZW50KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaW5nbGVTdGF0ZW1lbnRCb2R5ICE9IG51bGwgJiYgIXNpbmdsZVN0YXRlbWVudEJvZHkuaXNFbXB0eSgpKSB7CisKKwkJCQlTdHJpbmcgc2luZ2xlU3RhdGVtZW50ID0gQ3lwaGVyVGVtcGxhdGVzLlJlZ3VsYXJTdGF0ZW1lbnRUZW1wbGF0ZS5yZXBsYWNlKCIkc3RhdGVtZW50JCIsCisJCQkJCQlzaW5nbGVTdGF0ZW1lbnRCb2R5KTsKKworCQkJCXN0YXRlbWVudExpc3QuYXBwZW5kKHNpbmdsZVN0YXRlbWVudCk7CisJCQl9CisJCQkrK3N0YXRlbWVudENvdW50ZXI7CisJCQlpZiAoc3RhdGVtZW50Q291bnRlciA8IGVsZW1lbnRzLnNpemUoKSAmJiBzaW5nbGVTdGF0ZW1lbnRCb2R5ICE9IG51bGwpIHsKKwkJCQlzdGF0ZW1lbnRMaXN0LmFwcGVuZCgiLCIpOworCQkJfQorCisJCX0KKwkJanNvbiA9IEN5cGhlclRlbXBsYXRlcy5CYXRjaFRlbXBsYXRlLnJlcGxhY2UoIiRzdGF0ZW1lbnRMaXN0JCIsIHN0YXRlbWVudExpc3QudG9TdHJpbmcoKSk7CisJCXJldHVybiBqc29uOworCX0KKworCXByaXZhdGUgU3RyaW5nIHByZXBhcmVOb2RlU3RhdGVtZW50KEdyYXBoRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7CisJCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGVsZW1lbnQ7CisKKwkJCXN3aXRjaCAobm9kZS5nZXRBY3Rpb24oKSkgeworCQkJY2FzZSBDcmVhdGU6CisJCQkJcmV0dXJuIGNyZWF0ZU5vZGVTdGF0ZW1lbnQobm9kZSk7CisJCQljYXNlIFVwZGF0ZToKKwkJCQlyZXR1cm4gdXBkYXRlTm9kZVN0YXRlbWVudChub2RlKTsKKwkJCWNhc2UgRGVsZXRlOgorCQkJCS8vIFRPRE8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgdXBkYXRlTm9kZVN0YXRlbWVudChHcmFwaE5vZGUgbm9kZSkgeworCQlTdHJpbmcgc2luZ2xlU3RhdGVtZW50ID0gQ3lwaGVyVGVtcGxhdGVzLlVwZGF0ZU5vZGVTdGF0ZW1lbnRUZW1wbGF0ZS5yZXBsYWNlKCIkbGFiZWwkIiwgbm9kZS5nZXRMYWJlbCgpKTsKKwkJU3RyaW5nIGZpbHRlciA9IHByZXBhcmVLZXlWYWx1ZUZpbHRlcihub2RlKTsKKworCQlzaW5nbGVTdGF0ZW1lbnQgPSBzaW5nbGVTdGF0ZW1lbnQucmVwbGFjZSgiJGZpbHRlciQiLCBmaWx0ZXIpOworCisJCXNpbmdsZVN0YXRlbWVudCA9IHNpbmdsZVN0YXRlbWVudC5yZXBsYWNlKCIkcHJvcHMkIiwgRGFvVXRpbHMuY29udmVydFRvSnNvbihub2RlLnRvR3JhcGhNYXAoKSkpOworCisJCXJldHVybiBzaW5nbGVTdGF0ZW1lbnQ7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTm9kZVN0YXRlbWVudChHcmFwaE5vZGUgbm9kZSkgeworCQlTdHJpbmcgc2luZ2xlU3RhdGVtZW50ID0gQ3lwaGVyVGVtcGxhdGVzLkNyZWF0ZVNpbmdsZU5vZGVUZW1wbGF0ZS5yZXBsYWNlKCIkbGFiZWwkIiwgbm9kZS5nZXRMYWJlbCgpKTsKKworCQlzaW5nbGVTdGF0ZW1lbnQgPSBzaW5nbGVTdGF0ZW1lbnQucmVwbGFjZSgiJHByb3BzJCIsIERhb1V0aWxzLmNvbnZlcnRUb0pzb24obm9kZS50b0dyYXBoTWFwKCkpKTsKKwkJcmV0dXJuIHNpbmdsZVN0YXRlbWVudDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBwcmVwYXJlUmVsYXRpb25TdGF0ZW1lbnQoR3JhcGhFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaFJlbGF0aW9uKSB7CisKKwkJCUdyYXBoUmVsYXRpb24gcmVsYXRpb24gPSAoR3JhcGhSZWxhdGlvbikgZWxlbWVudDsKKworCQkJc3dpdGNoIChyZWxhdGlvbi5nZXRBY3Rpb24oKSkgeworCQkJY2FzZSBDcmVhdGU6CisJCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uU3RhdGVtZW50KHJlbGF0aW9uKTsKKwkJCWNhc2UgVXBkYXRlOgorCQkJCXJldHVybiB1cGRhdGVSZWxhdGlvblN0YXRlbWVudChyZWxhdGlvbik7CisJCQljYXNlIERlbGV0ZToKKwkJCQkvLyBUT0RPCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgU3RyaW5nIGNyZWF0ZVJlbGF0aW9uU3RhdGVtZW50KEdyYXBoUmVsYXRpb24gcmVsYXRpb24pIHsKKwkJUmVsYXRpb25FbmRQb2ludCBmcm9tID0gcmVsYXRpb24uZ2V0RnJvbSgpOworCQlTdHJpbmcgc2luZ2xlU3RhdGVtZW50OworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSByZWxhdGlvbi50b0dyYXBoTWFwKCk7CisJCWlmIChwcm9wcyA9PSBudWxsIHx8IHByb3BzLmlzRW1wdHkoKSkgeworCQkJc2luZ2xlU3RhdGVtZW50ID0gQ3lwaGVyVGVtcGxhdGVzLkNyZWF0ZVJlbGF0aW9uVGVtcGxhdGVOb1Byb3BzLnJlcGxhY2UoIiRsYWJlbEZyb20kIiwKKwkJCQkJZnJvbS5nZXRMYWJlbCgpLmdldE5hbWUoKSk7CisJCX0gZWxzZSB7CisJCQlzaW5nbGVTdGF0ZW1lbnQgPSBDeXBoZXJUZW1wbGF0ZXMuQ3JlYXRlUmVsYXRpb25UZW1wbGF0ZS5yZXBsYWNlKCIkbGFiZWxGcm9tJCIsIGZyb20uZ2V0TGFiZWwoKS5nZXROYW1lKCkpOworCQkJc2luZ2xlU3RhdGVtZW50ID0gc2luZ2xlU3RhdGVtZW50LnJlcGxhY2UoIiRwcm9wcyQiLCBEYW9VdGlscy5jb252ZXJ0VG9Kc29uKHByb3BzKSk7CisJCX0KKworCQlzaW5nbGVTdGF0ZW1lbnQgPSBzaW5nbGVTdGF0ZW1lbnQucmVwbGFjZSgiJGlkTmFtZUZyb20kIiwgZnJvbS5nZXRJZE5hbWUoKSk7CisJCXNpbmdsZVN0YXRlbWVudCA9IHNpbmdsZVN0YXRlbWVudC5yZXBsYWNlKCIkaWRWYWx1ZUZyb20kIiwgZnJvbS5nZXRJZFZhbHVlKCkudG9TdHJpbmcoKSk7CisKKwkJUmVsYXRpb25FbmRQb2ludCB0byA9IHJlbGF0aW9uLmdldFRvKCk7CisJCXNpbmdsZVN0YXRlbWVudCA9IHNpbmdsZVN0YXRlbWVudC5yZXBsYWNlKCIkbGFiZWxUbyQiLCB0by5nZXRMYWJlbCgpLmdldE5hbWUoKSk7CisJCXNpbmdsZVN0YXRlbWVudCA9IHNpbmdsZVN0YXRlbWVudC5yZXBsYWNlKCIkaWROYW1lVG8kIiwgdG8uZ2V0SWROYW1lKCkpOworCQlzaW5nbGVTdGF0ZW1lbnQgPSBzaW5nbGVTdGF0ZW1lbnQucmVwbGFjZSgiJGlkdmFsdWVUbyQiLCB0by5nZXRJZFZhbHVlKCkudG9TdHJpbmcoKSk7CisKKwkJc2luZ2xlU3RhdGVtZW50ID0gc2luZ2xlU3RhdGVtZW50LnJlcGxhY2UoIiR0eXBlJCIsIHJlbGF0aW9uLmdldFR5cGUoKSk7CisJCXJldHVybiBzaW5nbGVTdGF0ZW1lbnQ7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgdXBkYXRlUmVsYXRpb25TdGF0ZW1lbnQoR3JhcGhSZWxhdGlvbiByZWxhdGlvbikgeworCQkvLyBUT0RPCisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgU3RyaW5nIHByZXBhcmVLZXlWYWx1ZUZpbHRlcihHcmFwaE5vZGUgbm9kZSkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZUlkID0gbm9kZS5nZXRLZXlWYWx1ZUlkKCk7CisKKwkJc2IuYXBwZW5kKGtleVZhbHVlSWQuZ2V0S2V5KCkpLmFwcGVuZCgiOiIpOworCQlpZiAoa2V5VmFsdWVJZC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlzYi5hcHBlbmQoIiciKTsKKwkJfQorCQlzYi5hcHBlbmQoa2V5VmFsdWVJZC5nZXRWYWx1ZSgpKTsKKworCQlpZiAoa2V5VmFsdWVJZC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlzYi5hcHBlbmQoIiciKTsKKwkJfQorCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdHJhbnNsYXRlR2V0KFJlY3Vyc2l2ZUZpbHRlciBmaWx0ZXIpIHsKKwkJU3RyaW5nIHJlcXVlc3RKc29uID0gbnVsbDsKKwkJU3RyaW5nIHN0YXRlbWVudDsKKworCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUmVjdXJzaXZlQnlSZWxhdGlvbkZpbHRlcikgeworCQkJUmVjdXJzaXZlQnlSZWxhdGlvbkZpbHRlciBieVJlbGF0aW9uRmlsdGVyID0gKFJlY3Vyc2l2ZUJ5UmVsYXRpb25GaWx0ZXIpIGZpbHRlcjsKKworCQkJc3RhdGVtZW50ID0gQ3lwaGVyVGVtcGxhdGVzLkdldEJ5UmVsYXRpb25Ob2RlUmVjdXJzaXZlVGVtcGxhdGUucmVwbGFjZSgiJGxhYmVsTm9kZSQiLAorCQkJCQlieVJlbGF0aW9uRmlsdGVyLmdldE5vZGUoKS5nZXRMYWJlbCgpKTsKKwkJCVN0cmluZyBrZXlWYWx1ZUlkID0gcHJlcGFyZUtleVZhbHVlRmlsdGVyKGJ5UmVsYXRpb25GaWx0ZXIuZ2V0Tm9kZSgpKTsKKworCQkJc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UoIiRwcm9wc05vZGUkIiwga2V5VmFsdWVJZCk7CisKKwkJCXN0YXRlbWVudCA9IHN0YXRlbWVudC5yZXBsYWNlKCIkdHlwZSQiLCBieVJlbGF0aW9uRmlsdGVyLmdldFJlbGF0aW9uVHlwZSgpKTsKKworCQkJU3RyaW5nIHJlbGF0aW9uUHJvcHMgPSBwcmVwYXJlRmlsdGVyQm9keShmaWx0ZXIpOworCQkJc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UoIiRwcm9wc1JlbCQiLCByZWxhdGlvblByb3BzKTsKKwkJCXN0YXRlbWVudCA9IHN0YXRlbWVudC5yZXBsYWNlKCIkbGFiZWxTcmMkIiwgZmlsdGVyLmdldE5vZGVUeXBlKCkuZ2V0TmFtZSgpKTsKKworCQl9IGVsc2UgeworCisJCQlzdGF0ZW1lbnQgPSBDeXBoZXJUZW1wbGF0ZXMuR2V0Tm9kZVJlY3Vyc2l2ZVRlbXBsYXRlLnJlcGxhY2UoIiRsYWJlbCQiLCBmaWx0ZXIuZ2V0Tm9kZVR5cGUoKS5nZXROYW1lKCkpOworCisJCQkvLyByZXBsYWNlIGZpbHRlcgorCQkJaWYgKGZpbHRlci5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7CisJCQkJLy8gZ2V0IGFsbCByZWNvcmRzIGJ5IGxhYmVsCisJCQkJc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UoInskZmlsdGVyJH0iLCAiIik7CisJCQl9IGVsc2UgeworCQkJCVN0cmluZyBmaWx0ZXJTdHIgPSBwcmVwYXJlRmlsdGVyQm9keShmaWx0ZXIpOworCQkJCXN0YXRlbWVudCA9IHN0YXRlbWVudC5yZXBsYWNlKCIkZmlsdGVyJCIsIGZpbHRlclN0cik7CisJCQl9CisJCX0KKworCQlpZiAoZmlsdGVyLmdldENoaWxkUmVsYXRpb25UeXBlcygpID09IG51bGwgfHwgZmlsdGVyLmdldENoaWxkUmVsYXRpb25UeXBlcygpLmlzRW1wdHkoKSkgeworCQkJc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UoIiR0eXBlc0xpc3QkIiwgIiIpOworCisJCX0gZWxzZSB7CisJCQlTdHJpbmdCdWlsZGVyIHR5cGVzTGlzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlpbnQgY291bnQgPSAwOworCQkJZm9yIChTdHJpbmcgdHlwZSA6IGZpbHRlci5nZXRDaGlsZFJlbGF0aW9uVHlwZXMoKSkgeworCQkJCXR5cGVzTGlzdC5hcHBlbmQoIjoiKS5hcHBlbmQodHlwZSk7CisJCQkJKytjb3VudDsKKwkJCQlpZiAoY291bnQgPCBmaWx0ZXIuZ2V0Q2hpbGRSZWxhdGlvblR5cGVzKCkuc2l6ZSgpKSB7CisJCQkJCXR5cGVzTGlzdC5hcHBlbmQoInwiKTsKKwkJCQl9CisJCQl9CisJCQlzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQucmVwbGFjZSgiJHR5cGVzTGlzdCQiLCB0eXBlc0xpc3QudG9TdHJpbmcoKSk7CisJCX0KKwkJU3RyaW5nIHNpbmdsZVN0YXRlbWVudCA9IEN5cGhlclRlbXBsYXRlcy5SZWd1bGFyU3RhdGVtZW50VGVtcGxhdGUucmVwbGFjZSgiJHN0YXRlbWVudCQiLCBzdGF0ZW1lbnQpOworCQlyZXF1ZXN0SnNvbiA9IEN5cGhlclRlbXBsYXRlcy5CYXRjaFRlbXBsYXRlLnJlcGxhY2UoIiRzdGF0ZW1lbnRMaXN0JCIsIHNpbmdsZVN0YXRlbWVudCk7CisKKwkJcmV0dXJuIHJlcXVlc3RKc29uOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXBhcmVGaWx0ZXJCb2R5KE1hdGNoRmlsdGVyIGZpbHRlcikgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaW50IGNvdW50ID0gMDsKKwkJaW50IHNpemUgPSBmaWx0ZXIuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCkuc2l6ZSgpOworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBmaWx0ZXIuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCkpIHsKKwkJCXNiLmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6Iik7CisJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCXNiLmFwcGVuZCgiJyIpOworCQkJfQorCQkJc2IuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpOworCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlzYi5hcHBlbmQoIiciKTsKKwkJCX0KKwkJCSsrY291bnQ7CisJCQlpZiAoY291bnQgPCBzaXplKSB7CisJCQkJc2IuYXBwZW5kKCIsIik7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9HcmFwaEVkZ2VMYWJlbHMuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL0dyYXBoRWRnZUxhYmVscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2JjYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9HcmFwaEVkZ2VMYWJlbHMuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ajsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBlbnVtIEdyYXBoRWRnZUxhYmVscyB7CisKKwkvLyBmaWVsZCBuYW1lCisJLy8KKwlTVEFURSgiU1RBVEUiKSwgTEFTVF9TVEFURSgiTEFTVF9TVEFURSIpLCBDUkVBVE9SKCJDUkVBVE9SIiksIExBU1RfTU9ESUZJRVIoIkxBU1RfTU9ESUZJRVIiKSwgQVRUUklCVVRFKAorCQkJIkVER0VfQVRUUklCVVRFIiksIFBST1BFUlRZKCJFREdFX1BST1BFUlRZIiksIENBVEVHT1JZKCJDQVRFR09SWSIpLCBERVJJVkVEX0ZST00oCisJCQkJCSJERVJJVkVEX0ZST00iKSwgUkVRVUlSRU1FTlQoIlJFUVVJUkVNRU5UIiksIENBUEFCSUxJVFlfVFlQRSgiQ0FQQUJJTElUWV9UWVBFIiksIFJFTEFUSU9OU0hJUF9UWVBFKAorCQkJCQkJCSJSRUxBVElPTlNISVBfVFlQRSIpLCBDQVBBQklMSVRZKCJDQVBBQklMSVRZIiksIElOU1RBTkNFX09GKCJJTlNUQU5DRV9PRiIpLCBJTlRFUkZBQ0UoCisJCQkJCQkJCQkiSU5URVJGQUNFIiksIElOVEVSRkFDRV9PUEVSQVRJT04oIklOVEVSRkFDRV9PUEVSQVRJT04iKSwgQVJUSUZBQ1RfUkVGKAorCQkJCQkJCQkJCQkiQVJUSUZBQ1RfUkVGIiksIElOUFVUUygiSU5QVVRTIiksIFJFUVVJUkVNRU5UX0lNUEwoCisJCQkJCQkJCQkJCQkJIlJFUVVJUkVNRU5UX0lNUEwiKSwgTk9ERV9JTVBMKCJOT0RFX0lNUEwiKSwgSU1QTEVNRU5UQVRJT05fT0YoCisJCQkJCQkJCQkJCQkJCQkiSU1QTEVNRU5UQVRJT05fT0YiKSwgQVRUUklCVVRFX1ZBTFVFKAorCQkJCQkJCQkJCQkJCQkJCQkiQVRUUklCVVRFX1ZBTFVFIiksIElOUFVUX1ZBTFVFKAorCQkJCQkJCQkJCQkJCQkJCQkJCSJJTlBVVF9WQUxVRSIpLCBQUk9QRVJUWV9WQUxVRSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSJQUk9QRVJUWV9WQUxVRSIpLCBDQVBBQklMSVRZX0lOU1QoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJDQVBBQklMSVRZX0lOU1QiKSwgVFlQRV9PRigKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiVFlQRV9PRiIpLCBSRVNPVVJDRV9JTlNUKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIlJFU09VUkNFX0lOU1QiKSwgUkVMQVRJT05TSElQX0lOU1QoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJSRUxBVElPTlNISVBfSU5TVCIpLCBDQVBBQklMSVRZX05PREUoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIkNBUEFCSUxJVFlfTk9ERSIpLCBMQVNUX0RJU1RSSUJVVElPTl9TVEFURV9NT0RJRkFJRVIoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiTEFTVF9ESVNUUklCVVRJT05fU1RBVEVfTU9ESUZBSUVSIiksIEFUVFJJQlVURV9JTVBMKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiQVRUUklCVVRFX0lNUEwiKSwgSU5QVVRfSU1QTCgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiSU5QVVRfSU1QTCIpLCBQUk9QRVJUWV9JTVBMKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIlBST1BFUlRZX0lNUEwiKSwgQURESVRJT05BTF9JTkZPUk1BVElPTigKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIkFERElUSU9OQUxfSU5GT1JNQVRJT04iKSwgSEVBVF9QQVJBTUVURVIoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIkhFQVRfUEFSQU1FVEVSIiksIFNVQl9DQVRFR09SWSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJTVUJfQ0FURUdPUlkiKSwgR1JPVVBJTkcoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJHUk9VUElORyIpLCBDQVRFR09SSVpFRF9UTygKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiQ0FURUdPUklaRURfVE8iKSwgR0VORVJBVEVEX0ZST00oCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiR0VORVJBVEVEX0ZST00iKSwgUEFSQU1FVEVSX1ZBTFVFKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiUEFSQU1FVEVSX1ZBTFVFIiksIFBBUkFNRVRFUl9JTVBMKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJQQVJBTUVURVJfSU1QTCIpLAorCS8vIFZGIGFkZGl0aW9ucworCUNBTENVTEFURURfUkVRVUlSRU1FTlQoIkNBTENVTEFURURfUkVRVUlSRU1FTlQiKSwgQ0FMQ1VMQVRFRF9DQVBBQklMSVRZKAorCQkJIkNBTENVTEFURURfQ0FQQUJJTElUWSIpLCBSRUxBVElPTlNISVBfT1JJR0lOKCJSRUxBVElPTlNISVBfT1JJR0lOIiksIENBUEFCSUxJVFlfT1JJR0lOKAorCQkJCQkiQ0FQQUJJTElUWV9PUklHSU4iKSwgQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVF9GVUxMRklMTEVEKAorCQkJCQkJCSJDQUxDVUxBVEVEX1JFUVVJUkVNRU5UX0ZVTExGSUxMRUQiKSwgQ0FMQ1VMQVRFRF9DQVBBQklMSVRZX0ZVTExGSUxMRUQoCisJCQkJCQkJCQkiQ0FMQ1VMQVRFRF9DQVBBQklMSVRZX0ZVTExGSUxMRUQiKSwKKwkvLyBHcm91cAorCUdST1VQKCJHUk9VUCIpLCBHUk9VUF9BUlRJRkFDVF9SRUYoIkdST1VQX0FSVElGQUNUX1JFRiIpLCBHUk9VUF9NRU1CRVIoIkdST1VQX01FTUJFUiIpLCBJTlBVVCgKKwkJCSJFREdFX0lOUFVUIiksIEdFVF9JTlBVVCgiR0VUX0lOUFVUIiksOworCisJcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKwlHcmFwaEVkZ2VMYWJlbHMoU3RyaW5nIHByb3BlcnR5KSB7CisJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworCQlyZXR1cm4gcHJvcGVydHk7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbGxQcm9wZXJ0aWVzKCkgeworCisJCUxpc3Q8U3RyaW5nPiBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQlmb3IgKEdyYXBoRWRnZUxhYmVscyBncmFwaFByb3BlcnR5IDogR3JhcGhFZGdlTGFiZWxzLnZhbHVlcygpKSB7CisJCQlhcnJheUxpc3QuYWRkKGdyYXBoUHJvcGVydHkuZ2V0UHJvcGVydHkoKSk7CisJCX0KKworCQlyZXR1cm4gYXJyYXlMaXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgR3JhcGhFZGdlTGFiZWxzIGdldEJ5TmFtZShTdHJpbmcgcHJvcGVydHkpIHsKKwkJZm9yIChHcmFwaEVkZ2VMYWJlbHMgaW5zdCA6IEdyYXBoRWRnZUxhYmVscy52YWx1ZXMoKSkgeworCQkJaWYgKGluc3QuZ2V0UHJvcGVydHkoKS5lcXVhbHMocHJvcGVydHkpKSB7CisJCQkJcmV0dXJuIGluc3Q7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL0dyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjOWVjYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL0dyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ajsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgZW51bSBHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeSB7CisKKwkvLyBmaWVsZCBuYW1lIGNsYXNzIHR5cGUKKwkvLyBzdG9yZWQgaW4gZ3JhcGgKKwlTVEFURSgic3RhdGUiLCBTdHJpbmcuY2xhc3MpLCBOQU1FKCJuYW1lIiwgU3RyaW5nLmNsYXNzKSwgR1JPVVBfVFlQRSgiZ3JvdXBUeXBlIiwgU3RyaW5nLmNsYXNzKSwgU09VUkNFKCJzb3VyY2UiLAorCQkJU3RyaW5nLmNsYXNzKSwgT1dORVJfSUQoIm93bmVySWQiLCBTdHJpbmcuY2xhc3MpLCBSRVFVSVJFRF9PQ0NVUlJFTkNFUygicmVxdWlyZWRPY2N1cnJlbmNlcyIsCisJCQkJCVN0cmluZy5jbGFzcyksIExFRlRfT0NDVVJSRU5DRVMoImxlZnRPY2N1cnJlbmNlcyIsCisJCQkJCQkJU3RyaW5nLmNsYXNzKSwgR0VUX0lOUFVUX0lOREVYKCJnZXRfaW5wdXRfaW5kZXgiLCBTdHJpbmcuY2xhc3MpOworCisJcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisJcHJpdmF0ZSBDbGFzcyBjbGF6ejsKKworCUdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5KFN0cmluZyBwcm9wZXJ0eSwgQ2xhc3MgY2xhenopIHsKKwkJdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworCQl0aGlzLmNsYXp6ID0gY2xheno7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIHByb3BlcnR5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisJfQorCisJcHVibGljIENsYXNzIGdldENsYXp6KCkgeworCQlyZXR1cm4gY2xheno7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2xhenooQ2xhc3MgY2xhenopIHsKKwkJdGhpcy5jbGF6eiA9IGNsYXp6OworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEFsbFByb3BlcnRpZXMoKSB7CisKKwkJTGlzdDxTdHJpbmc+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCWZvciAoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkgZ3JhcGhQcm9wZXJ0eSA6IEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LnZhbHVlcygpKSB7CisJCQlhcnJheUxpc3QuYWRkKGdyYXBoUHJvcGVydHkuZ2V0UHJvcGVydHkoKSk7CisJCX0KKworCQlyZXR1cm4gYXJyYXlMaXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkgZ2V0QnlOYW1lKFN0cmluZyBwcm9wZXJ0eSkgeworCQlmb3IgKEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5IGluc3QgOiBHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS52YWx1ZXMoKSkgeworCQkJaWYgKGluc3QuZ2V0UHJvcGVydHkoKS5lcXVhbHMocHJvcGVydHkpKSB7CisJCQkJcmV0dXJuIGluc3Q7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovR3JhcGhOZWlnaGJvdXJUYWJsZS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovR3JhcGhOZWlnaGJvdXJUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZmI1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9HcmFwaE5laWdoYm91clRhYmxlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ajsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworCitwdWJsaWMgY2xhc3MgR3JhcGhOZWlnaGJvdXJUYWJsZSB7CisKKwlMaXN0PEdyYXBoTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKKworCUxpc3Q8Tm9kZVJlbGF0aW9uPiBkaXJlY3RlZEVkZ2VzID0gbmV3IEFycmF5TGlzdDxOb2RlUmVsYXRpb24+KCk7CisKKwlwdWJsaWMgTGlzdDxHcmFwaE5vZGU+IGdldE5vZGVzKCkgeworCQlyZXR1cm4gbm9kZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9kZXMoTGlzdDxHcmFwaE5vZGU+IG5vZGVzKSB7CisJCXRoaXMubm9kZXMgPSBub2RlczsKKwl9CisKKwlwdWJsaWMgTGlzdDxOb2RlUmVsYXRpb24+IGdldERpcmVjdGVkRWRnZXMoKSB7CisJCXJldHVybiBkaXJlY3RlZEVkZ2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpcmVjdGVkRWRnZXMoTGlzdDxOb2RlUmVsYXRpb24+IGRpcmVjdGVkRWRnZXMpIHsKKwkJdGhpcy5kaXJlY3RlZEVkZ2VzID0gZGlyZWN0ZWRFZGdlczsKKwl9CisKKwlwdWJsaWMgaW50IGFkZE5vZGUoR3JhcGhOb2RlIG5vZGUpIHsKKwkJdGhpcy5ub2Rlcy5hZGQobm9kZSk7CisJCXJldHVybiB0aGlzLm5vZGVzLnNpemUoKSAtIDE7CisJfQorCisJcHVibGljIHZvaWQgYWRkRWRnZShOb2RlUmVsYXRpb24gZGlyZWN0ZWRFZGdlKSB7CisJCXRoaXMuZGlyZWN0ZWRFZGdlcy5hZGQoZGlyZWN0ZWRFZGdlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkdyYXBoTmVpZ2hib3VyVGFibGUgW25vZGVzPSIgKyBub2RlcyArICIsIGRpcmVjdGVkRWRnZXM9IiArIGRpcmVjdGVkRWRnZXMgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MmFiNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL0dyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ajsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworcHVibGljIGVudW0gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeSB7CisvLwkJCQkJCWZpZWxkIG5hbWUJCQkJCWNsYXNzIHR5cGUgICAgCQkJCXVuaXF1ZQkJaW5kZXhlZCAKKy8vCQkJCQkJCQkJCQkJCXN0b3JlZCBpbiBncmFwaCAJCQlpbmRleAkKKwkvLyBDb21tb24KKwlMQUJFTAkJCQkoIm5vZGVMYWJlbCIsCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJdHJ1ZSksCisJSEVBTFRIX0NIRUNLCQkoImhlYWx0aGNoZWNraXMiLAkJCVN0cmluZy5jbGFzcywgCQkJCXRydWUsCQl0cnVlKSwgLy95YXZpdmkKKwkvLyBSZXNvdXJjZQorCU5BTUUJCQkJKCJuYW1lIiwgCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCVRPU0NBX1JFU09VUkNFX05BTUUJKCJ0b3NjYVJlc291cmNlTmFtZSIsCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCUNBVEVHT1JZX05BTUUJCSgiY2F0ZWdvcnlOYW1lIiwgCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQl0cnVlKSwgLy8gPworCVZFUlNJT04JCQkJKCJ2ZXJzaW9uIiwJCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJdHJ1ZSksCisJQ1JFQVRJT05fREFURQkJKCJjcmVhdGlvbkRhdGUiLAkJCUxvbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlMQVNUX1VQREFURV9EQVRFCSgibW9kaWZpY2F0aW9uRGF0ZSIsCQlMb25nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJSVNfSElHSEVTVF9WRVJTSU9OCSgiaGlnaGVzdFZlcnNpb24iLAkJCUJvb2xlYW4uY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCUlTX0FCU1RSQUNUCQkJKCJhYnN0cmFjdCIsCQkJCUJvb2xlYW4uY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCURFU0NSSVBUSU9OCQkJKCJkZXNjcmlwdGlvbiIsCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCVVOSVFVRV9JRAkJCSgidWlkIiwJCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQl0cnVlLAkJdHJ1ZSksCisJU1RBVEUJCQkJKCJzdGF0ZSIsCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCVRZUEUJCQkJKCJ0eXBlIiwJCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJdHJ1ZSksCisJUkVRVUlSRUQJCQkoInJlcXVpcmVkIiwJCQkJQm9vbGVhbi5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCURFRkFVTFRfVkFMVUUJCSgiZGVmYXVsdFZhbHVlIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlDT05TVFJBSU5UUwkJCSgiY29uc3RyYWludHMiLAkJCQlTdHJpbmcuY2xhc3MsIAkJICAgIAlmYWxzZSwJCWZhbHNlKSwKKwlDT05UQUNUX0lECQkJKCJjb250YWN0SWQiLAkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlWRU5ET1JfTkFNRQkJCSgidmVuZG9yTmFtZSIsCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCVZFTkRPUl9SRUxFQVNFCQkoInZlbmRvclJlbGVhc2UiLAkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUlDT04JCQkJKCJpY29uIiwJCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCVRBR1MJCQkJKCJ0YWdzIiwJCQkJCVN0cmluZy5jbGFzcywgCQkgICAgCWZhbHNlLAkJZmFsc2UpLAorCVVVSUQJCQkJKCJ1dWlkIiwJCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJdHJ1ZSksCisJQ09TVAkJCQkoImNvc3QiLAkJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJTElDRU5TRV9UWVBFCQkoImxpY2Vuc2VUeXBlIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJTk9STUFMSVpFRF9OQU1FCQkoIm5vcm1hbGl6ZWROYW1lIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCVNZU1RFTV9OQU1FCQkJKCJzeXN0ZW1OYW1lIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQl0cnVlKSwKKwlJU19ERUxFVEVECQkJKCJkZWxldGVkIiwJCQkJCUJvb2xlYW4uY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCVJFU09VUkNFX1RZUEUJCSgicmVzb3VyY2VUeXBlIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLAorCUVOVFJZX1NDSEVNQQkJKCJlbnRyeV9zY2hlbWEiLAkJCVN0cmluZy5jbGFzcywJCQkJZmFsc2UsCQlmYWxzZSksCisJQ1NBUl9VVUlECQkJKCJjc2FyVXVpZCIsCQkJCVN0cmluZy5jbGFzcywJCQkJZmFsc2UsCQl0cnVlKSwKKwlDU0FSX1ZFUlNJT04JCSgiY3NhclZlcnNpb24iLAkJCQlTdHJpbmcuY2xhc3MsCQkJCWZhbHNlLAkJdHJ1ZSksCisJSU1QT1JURURfVE9TQ0FfQ0hFQ0tTVU0JKCJpbXBvcnRlZFRvc2NhQ2hlY2tzdW0iLAkJCQlTdHJpbmcuY2xhc3MsCQkJCWZhbHNlLAkJdHJ1ZSksCisJR0VORVJBVEVECQkJKCJnZW5lcmF0ZWQiLAkJCQlCb29sZWFuLmNsYXNzLAkJCQlmYWxzZSwJCWZhbHNlKSwKKwkvLyBVc2VyCisJVVNFUl9JRAkJCQkoInVzZXJJZCIsCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQl0cnVlLAkJdHJ1ZSksCisJRU1BSUwJCQkJKCJlbWFpbCIsCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlGSVJTVF9OQU1FCQkJKCJmaXJzdE5hbWUiLAkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlMQVNUX05BTUUJCQkoImxhc3ROYW1lIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJUk9MRQkJCQkoInJvbGUiLAkJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQl0cnVlKSwKKwlVU0VSX1NUQVRVUwkJCSgic3RhdHVzIiwJCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJdHJ1ZSksCisJVkFMSURfU09VUkNFX1RZUEVTICAoInZhbGlkU291cmNlVHlwZXMiLCAgICAgICAgU3RyaW5nLmNsYXNzLCAgICAgICAgICAgICAgIGZhbHNlLAkJZmFsc2UpLAorCU5PREUJCQkJKCJub2RlIiwJCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCVZBTFVFCQkJCSgidmFsdWUiLAkJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJSElEREVOCQkJCSgiSGlkZGVuIiwJCQkJCUJvb2xlYW4uY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlQUk9QRVJUSUVTCQkJKCJwcm9wZXJ0aWVzIiwJCQkJU3RyaW5nLmNsYXNzLAkgCQkJZmFsc2UsCQlmYWxzZSksCisJUE9TSVRJT05fWAkJCSgicG9zaXRpb25YIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJUE9TSVRJT05fWQkJCSgicG9zaXRpb25ZIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJUkVMQVRJT05TSElQX1RZUEUgCSgicmVsYXRpb25zaGlwVHlwZSIsCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlBUlRJRkFDVF9UWVBFCQkoImFydGlmYWN0VHlwZSIsCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQl0cnVlKSwKKwlBUlRJRkFDVF9SRUYJCSgiYXJ0aWZhY3RSZWYiLAkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlBUlRJRkFDVF9SRVBPU0lUT1JZCSgiYXJ0aWZhY3RSZXBvc2l0b3J5IiwJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUFSVElGQUNUX0NIRUNLU1VNCSgiYXJ0aWZhY3RDaGVja3N1bSIsCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlDUkVBVE9SCQkJCSgiY3JlYXRvciIsCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlBVFRfQ1JFQVRPUgkJCSgiYXR0Q3JlYXRvciIsCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUxBU1RfVVBEQVRFUgkJKCJsYXN0VXBkYXRlciIsCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUNSRUFUT1JfRlVMTF9OQU1FCSgiY3JlYXRvckZ1bGxOYW1lIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlVUERBVEVSX0ZVTExfTkFNRQkoInVwZGF0ZXJGdWxsTmFtZSIsCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJRVNfSUQJCQkJKCJlc0lkIiwJCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUFSVElGQUNUX0xBQkVMCQkoImFydGlmYWN0TGFiZWwiLAkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJdHJ1ZSksCisJQVJUSUZBQ1RfRElTUExBWV9OQU1FKCJhcnRpZmFjdERpc3BsYXlOYW1lIiwJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQl0cnVlKSwKKwlJTlNUQU5DRV9DT1VOVEVSCSgiaW5zdGFuY2VDb3VudGVyIiwJCQlJbnRlZ2VyLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJUFJPSkVDVF9DT0RFCQkoInByb2plY3RDb2RlIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJRElTVFJJQlVUSU9OX1NUQVRVUwkoImRpc3RyaWJ1dGlvblN0YXR1cyIsCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlJU19WTkYJCQkJKCJpc1ZORiIsCQkJCQlCb29sZWFuLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJTEFTVF9MT0dJTl9USU1FCQkoImxhc3RMb2dpblRpbWUiLAkJCUxvbmcuY2xhc3MsCQkJCQlmYWxzZSwJCXRydWUpLAorCUFUVFJJQlVURV9DT1VOVEVSCSgiYXR0cmlidXRlQ291bnRlciIsCQlJbnRlZ2VyLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJSU5QVVRfQ09VTlRFUgkJKCJpbnB1dENvdW50ZXIiLAkJCUludGVnZXIuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlQUk9QRVJUWV9DT1VOVEVSCSgicHJvcGVydHlDb3VudGVyIiwJCQlJbnRlZ2VyLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJQVBJX1VSTAkJCQkoImFwaVVybCIsCQkJCQlTdHJpbmcuY2xhc3MsCQkJCWZhbHNlLAkJZmFsc2UpLAorCVNFUlZJQ0VfQVBJCQkJKCJzZXJ2aWNlQXBpIiwJCQkJQm9vbGVhbi5jbGFzcywJCQkJZmFsc2UsCQl0cnVlKSwKKwlBRERJVElPTkFMX0lORk9fUEFSQU1TICgiYWRkaXRpb25hbEluZm8iLCAgICAgICBTdHJpbmcuY2xhc3MsICAgICAgICAgICAgICBmYWxzZSwJCWZhbHNlKSwKKwlBRERJVElPTkFMX0lORk9fSURfVE9fS0VZICgiaWRUb0tleSIsICAgIAkJU3RyaW5nLmNsYXNzLCAgICAgICAgICAgICAgZmFsc2UsCQlmYWxzZSksCisJQVJUSUZBQ1RfR1JPVVBfVFlQRSAoImFydGlmYWN0R3JvdXBUeXBlIiwgICAgCVN0cmluZy5jbGFzcywgICAgICAgICAgICAgIGZhbHNlLAkJdHJ1ZSksCisJQVJUSUZBQ1RfVElNRU9VVAkoInRpbWVvdXQiLAkJCQkJSW50ZWdlci5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUlTX0FDVElWRQkJCSgiaXNBY3RpdmUiLAkJCQlCb29sZWFuLmNsYXNzLCAJCQkJZmFsc2UsCQl0cnVlKSwKKwlQUk9QRVJUWV9WQUxVRV9SVUxFUyAoInByb3BlcnR5VmFsdWVSdWxlcyIsCQlTdHJpbmcuY2xhc3MsCQkJCWZhbHNlLAkJZmFsc2UpLAorCS8vYXV0aGFudGljYXRpb24KKwlDT05TVU1FUl9OQU1FCQkoImNvbnN1bWVyTmFtZSIsCQkJU3RyaW5nLmNsYXNzLCAJCQkJdHJ1ZSwJCXRydWUpLAorCUNPTlNVTUVSX1BBU1NXT1JECSgiY29uc3VtZXJQYXNzd29yZCIsCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlDT05TVU1FUl9TQUxUCQkoImNvbnN1bWVyU2FsdCIsCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJQ09OU1VNRVJfTEFTVF9BVVRIRU5USUNBVElPTl9USU1FCSgiY29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lIiwJCUxvbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlDT05TVU1FUl9ERVRBSUxTX0xBU1RfVVBEQVRFRF9USU1FCSgiY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lIiwJCUxvbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlMQVNUX01PRElGSUVSX1VTRVJfSUQoImxhc3RNb2RmaWVyVXNlcklkIiwJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUFSVElGQUNUX1ZFUlNJT04JKCJhcnRpZmFjdFZlcnNpb24iLAkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUFSVElGQUNUX1VVSUQJCSgiYXJ0aWZhY3RVVUlEIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlQQVlMT0FEX1VQREFURV9EQVRFCSgicGF5bG9hZFVwZGF0ZURhdGUiLAkJTG9uZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCUhFQVRfUEFSQU1TX1VQREFURV9EQVRFCSgiaGVhdFBhcmFtc1VwZGF0ZURhdGUiLExvbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwkvL3Byb2R1Y3QKKwlGVUxMX05BTUUgCQkJKCJmdWxsTmFtZSIsICAgIAkJCVN0cmluZy5jbGFzcywgICAgICAgICAgICAgICBmYWxzZSwJCXRydWUpLAorCS8vd2FzIGNoYW5nZWQgYXMgcGFydCBvZiBtaWdyYXRpb24gZnJvbSAxNjAyIHRvIDE2MDIgKCBpbiAxNjAyIHdhcyBkZWZpbmVkIGFzIHVuaXF1ZS4gaXQncyBwcm9ibGVtIHRvIHJlY29uZmlndXJlIHRoZSBpbmRleCApCisJQ09OU1RBTlRfVVVJRAkJKCJjb25zdGFudFV1aWROZXciLAkJCVN0cmluZy5jbGFzcywgICAgICAgICAgICAgICBmYWxzZSwJCXRydWUpLAorCUNPTlRBQ1RTCQkJKCJjb250YWN0cyIsCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCS8vY2F0ZWdvcnlzCisJSUNPTlMJCQkJKCJpY29ucyIsCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwkvL3JlbGF0aW9uCisJQ0FQQUJJTElUWV9PV05FUl9JRAkoImNhcE93bmVySWQiLAkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlSRVFVSVJFTUVOVF9PV05FUl9JRCAoInJlcU93bmVySWQiLAkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlDQVBBQklMSVRZX0lECQkoImNhcGFiaWx0eUlkIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJUkVRVUlSRU1FTlRfSUQgCQkoInJlcXVpcmVtZW50SWQiLAkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLAorCVBST1BFUlRZX0lEIAkJKCJwcm9wZXJ0eUlkIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJUFJPUEVSVFlfTkFNRSAJCSgicHJvcGVydHlOYW1lIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwkvL2NvbXBvbmVudCBpbnN0YW5jZQorCU9SSUdJTl9UWVBFIAkJKCJvcmlnaW5UeXBlIiwJCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJLy9yZXF1aXJlbWVudCAmIGNhcGFiaWx0eQorCU1JTl9PQ0NVUlJFTkNFUwkJKCJtaW5PY2N1cnJlbmNlcyIsCQkJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJTUFYX09DQ1VSUkVOQ0VTCQkoIm1heE9jY3VycmVuY2VzIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwkvL0RhdGEgdHlwZQorCURFUklWRURfRlJPTQkJKCJkZXJpdmVkRnJvbSIsCQkJCVN0cmluZy5jbGFzcywgCQkJCWZhbHNlLAkJZmFsc2UpLCAKKwlNRU1CRVJTCQkJCSgibWVtYmVycyIsCQkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlUQVJHRVRTCQkJCSgidGFyZ2V0cyAiLAkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlNRVRBREFUQQkJCSgibWV0YWRhdGEiLAkJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlJTlZBUklBTlRfVVVJRAkJKCJpbnZhcmlhbnRVdWlkIiwJCQlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLCAKKwlJU19CQVNFCQkJCSgiaXNCYXNlIiwJCQkJCUJvb2xlYW4uY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLCAKKwlHUk9VUF9VVUlECQkJKCJncm91cFV1aWQiLAkJCSAgICBTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCXRydWUpLCAKKwlTVEFUVVMJCQkJKCJzdGF0dXMiLAkJCSAgICAJU3RyaW5nLmNsYXNzLCAJCQkJZmFsc2UsCQlmYWxzZSksCisJRlVOQ1RJT05BTF9NRU5VCQkoImZ1bmN0aW9uYWxNZW51IiwJCSAgIAlTdHJpbmcuY2xhc3MsIAkJCQlmYWxzZSwJCWZhbHNlKSwKKwlSRVFVSVJFRF9BUlRJRkFDVFMJKCJyZXF1aXJlZEFydGlmYWN0cyIsCQlTdHJpbmcuY2xhc3MsCSAJCQlmYWxzZSwJCWZhbHNlKSwKKwk7CisKKworCisJcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisJcHJpdmF0ZSBDbGFzcyBjbGF6ejsKKwlwcml2YXRlIGJvb2xlYW4gdW5pcXVlOworCXByaXZhdGUgYm9vbGVhbiBpbmRleGVkOworCQorCQorCUdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkoU3RyaW5nIHByb3BlcnR5LENsYXNzIGNsYXp6LCBib29sZWFuIHVuaXF1ZSxib29sZWFuIGluZGV4ZWQpIHsKKwkJdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworCQl0aGlzLmNsYXp6ID0gY2xheno7CisJCXRoaXMudW5pcXVlID0gdW5pcXVlOworCQl0aGlzLmluZGV4ZWQgPSBpbmRleGVkOworCX0KKwkKKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisJCXJldHVybiBwcm9wZXJ0eTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKwkJdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworCX0KKworCXB1YmxpYyBDbGFzcyBnZXRDbGF6eigpIHsKKwkJcmV0dXJuIGNsYXp6OworCX0KKwlwdWJsaWMgdm9pZCBzZXRDbGF6eihDbGFzcyBjbGF6eikgeworCQl0aGlzLmNsYXp6ID0gY2xheno7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzVW5pcXVlKCkgeworCQlyZXR1cm4gdW5pcXVlOworCX0KKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoYm9vbGVhbiB1bmlxdWUpIHsKKwkJdGhpcy51bmlxdWUgPSB1bmlxdWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkgeworCQlyZXR1cm4gaW5kZXhlZDsKKwl9CisKKworCXB1YmxpYyB2b2lkIHNldEluZGV4ZWQoYm9vbGVhbiBpbmRleGVkKSB7CisJCXRoaXMuaW5kZXhlZCA9IGluZGV4ZWQ7CisJfQorCisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbGxQcm9wZXJ0aWVzKCkgeworCisJCUxpc3Q8U3RyaW5nPiBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQlmb3IgKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkgZ3JhcGhQcm9wZXJ0eSA6IEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkKKwkJCQkudmFsdWVzKCkpIHsKKwkJCWFycmF5TGlzdC5hZGQoZ3JhcGhQcm9wZXJ0eS5nZXRQcm9wZXJ0eSgpKTsKKwkJfQorCisJCXJldHVybiBhcnJheUxpc3Q7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9OZW80akNsaWVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovTmVvNGpDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFiOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovTmVvNGpDbGllbnQuamF2YQpAQCAtMCwwICsxLDEwMDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGo7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjb3BlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5hdXRoLlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNsaWVudFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBSZXNwb25zZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuQ2xvc2VhYmxlSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnByb3RvY29sLkh0dHBDbGllbnRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuU3RyaW5nRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmF1dGguQmFzaWNTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljQXV0aENhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5CYXNpY0NyZWRlbnRpYWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljUmVzcG9uc2VIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnV0aWwuRW50aXR5VXRpbHM7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUucGFyc2VyLkpTT05QYXJzZXI7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLnBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLkdyYXBoRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFbGVtZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouZmlsdGVycy5NYXRjaEZpbHRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouZmlsdGVycy5SZWN1cnNpdmVGaWx0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnMuVXBkYXRlRmlsdGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5EYW9VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworLy9AQ29tcG9uZW50KCJuZW80ai1jbGllbnQiKQorcHVibGljIGNsYXNzIE5lbzRqQ2xpZW50IHsKKwlwcml2YXRlIENsb3NlYWJsZUh0dHBDbGllbnQgaHR0cENsaWVudDsKKwlwcml2YXRlIEpTT05QYXJzZXIganNvblBhcnNlcjsKKworCXByaXZhdGUgQ3lwaGVyVHJhbnNsYXRvciBjeXBoZXJUcmFuc2xhdG9yOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5lbzRqQ2xpZW50LmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0U2VydmljZVJvb3QgPSAiaHR0cDovLyRob3N0JDokcG9ydCQvZGIvZGF0YS8iOworCS8vIEVycm9yJ3MgQ2xhc3NpZmljYXRpb24gdGVtcGxhdGVzCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENsaWVudEVycm9yID0gIkNsaWVudEVycm9yIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGF0YWJhc2VFcnJvciA9ICJEYXRhYmFzZUVycm9yIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVHJhbnNpZW50RXJyb3IgPSAiVHJhbnNpZW50RXJyb3IiOworCisJLy8gRXJyb3IncyBDYXRlZ29yeSB0ZW1wbGF0ZXMKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR2VuZXJhbCA9ICJHZW5lcmFsIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTGVnYWN5SW5kZXggPSAiTGVnYWN5SW5kZXgiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSZXF1ZXN0ID0gIlJlcXVlc3QiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTY2hlbWEgPSAiU2NoZW1hIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU2VjdXJpdHkgPSAiU2VjdXJpdHkiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTdGF0ZW1lbnQgPSAiU3RhdGVtZW50IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVHJhbnNhY3Rpb24gPSAiVHJhbnNhY3Rpb24iOworCisJLy8gRXJyb3IncyBUaXRsZSB0ZW1wbGF0ZXMKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRW50aXR5Tm90Rm91bmQgPSAiRW50aXR5Tm90Rm91bmQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDb25zdHJhaW50VmlvbGF0aW9uID0gIkNvbnN0cmFpbnRWaW9sYXRpb24iOworCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCisJCVBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcigpOworCQljb25uZWN0aW9uTWFuYWdlci5zZXRNYXhUb3RhbCgxMDApOworCQljb25uZWN0aW9uTWFuYWdlci5zZXREZWZhdWx0TWF4UGVyUm91dGUoMjApOworCQljb25uZWN0aW9uTWFuYWdlci5zZXRWYWxpZGF0ZUFmdGVySW5hY3Rpdml0eSgxNTAwMCk7CisJCXRoaXMuaHR0cENsaWVudCA9IEh0dHBDbGllbnRzLmN1c3RvbSgpLnNldENvbm5lY3Rpb25NYW5hZ2VyKGNvbm5lY3Rpb25NYW5hZ2VyKS5idWlsZCgpOworCQlqc29uUGFyc2VyID0gbmV3IEpTT05QYXJzZXIoKTsKKwkJY3lwaGVyVHJhbnNsYXRvciA9IG5ldyBDeXBoZXJUcmFuc2xhdG9yKCk7CisKKwl9CisKKwlAUHJlRGVzdHJveQorCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworCQl0cnkgeworCQkJaHR0cENsaWVudC5jbG9zZSgpOworCQkJbG9nZ2VyLmRlYnVnKCJIdHRwIGNsaWVudCB0byBOZW80aiBHcmFwaCBjbG9zZWQiKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5pbmZvKCJGYWlsZWQgdG8gY2xvc2UgaHR0cCBjbGllbnQiLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBidWlsZGVyCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxMaXN0PEdyYXBoRWxlbWVudD4+LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gZXhlY3V0ZShCYXRjaEJ1aWxkZXIgYnVpbGRlcikgeworCisJCVN0cmluZyBqc29uID0gY3lwaGVyVHJhbnNsYXRvci50cmFuc2xhdGUoYnVpbGRlcik7CisJCWxvZ2dlci5kZWJ1ZygiVHJ5IHRvIGV4ZWN1dGUgY3lwaGVyIHJlcXVlc3QgWyB7fSBdIiwganNvbik7CisKKwkJRWl0aGVyPFN0cmluZywgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHNlbmRQb3N0Q3lwaGVyKGpzb24pOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlMaXN0PExpc3Q8R3JhcGhFbGVtZW50Pj4gYmF0Y2hSZXN1bHQ7CisJCXRyeSB7CisJCQliYXRjaFJlc3VsdCA9IHBhcnNlUmVzdWx0KHJlc3VsdC5sZWZ0KCkudmFsdWUoKSwgZmFsc2UpOworCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBiYXRjaHJlc3BvbnNlIiwgZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KE5lbzRqT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGJhdGNoUmVzdWx0KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8TGlzdDxHcmFwaEVsZW1lbnQ+PiwgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGV4ZWN1dGVHZXQoUmVjdXJzaXZlRmlsdGVyIGZpbHRlcikgeworCQlTdHJpbmcganNvbiA9IGN5cGhlclRyYW5zbGF0b3IudHJhbnNsYXRlR2V0KGZpbHRlcik7CisJCWxvZ2dlci5kZWJ1ZygiVHJ5IHRvIGV4ZWN1dGUgY3lwaGVyIHJlcXVlc3QgWyB7fSBdIiwganNvbik7CisKKwkJRWl0aGVyPFN0cmluZywgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHNlbmRQb3N0Q3lwaGVyKGpzb24pOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlMaXN0PExpc3Q8R3JhcGhFbGVtZW50Pj4gYmF0Y2hSZXN1bHQ7CisJCXRyeSB7CisJCQliYXRjaFJlc3VsdCA9IHBhcnNlUmVzdWx0KHJlc3VsdC5sZWZ0KCkudmFsdWUoKSwgdHJ1ZSk7CisJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGJhdGNocmVzcG9uc2UiLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoYmF0Y2hSZXN1bHQpOworCisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGVsZW1lbnQKKwkgKiBAcGFyYW0gaXAKKwkgKiBAcGFyYW0gdXNlcgorCSAqIEBwYXJhbSBwYXNzd29yZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgTmVvNGpPcGVyYXRpb25TdGF0dXMgY3JlYXRlRWxlbWVudChHcmFwaEVsZW1lbnQgZWxlbWVudCkgeworCQlOZW80ak9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5PSzsKKwkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJY2FzZSBOb2RlOgorCQkJRWl0aGVyPFN0cmluZywgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IGNyZWF0ZU5vZGUoZWxlbWVudCk7CisJCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IHN0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSZWxhdGlvbnNoaXA6CisJCQkvLyBUT0RPCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JhcGhFbGVtZW50LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gY3JlYXRlU2luZ2xlRWxlbWVudChHcmFwaEVsZW1lbnQgZWxlbWVudCkgeworCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQljYXNlIE5vZGU6CisJCQlFaXRoZXI8U3RyaW5nLCBOZW80ak9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gY3JlYXRlTm9kZShlbGVtZW50KTsKKwkJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCS8vIHBhcnNlIHJlc3BvbnNlCisJCQlTdHJpbmcgcmVzcG9uc2UgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQl0cnkgeworCQkJCUxpc3Q8R3JhcGhFbGVtZW50PiBsaXN0RWxlbWVudHMgPSBwYXJzZUdldFJlc3BvbnNlKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSwKKwkJCQkJCSgoR3JhcGhOb2RlKSBlbGVtZW50KS5nZXRMYWJlbCgpLCByZXNwb25zZSk7CisJCQkJaWYgKGxpc3RFbGVtZW50cyA9PSBudWxsIHx8IGxpc3RFbGVtZW50cy5pc0VtcHR5KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdChsaXN0RWxlbWVudHMuZ2V0KDApKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGZldGNoZWQgZGF0YSBmcm9tIGdyYXBoIiwgZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJY2FzZSBSZWxhdGlvbnNoaXA6CisJCQkvLyBUT0RPCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KE5lbzRqT3BlcmF0aW9uU3RhdHVzLk5PVF9TVVBQT1JURUQpOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIGxhYmVsCisJICogQHBhcmFtIGZpbHRlcgorCSAqIEBwYXJhbSBpcAorCSAqIEBwYXJhbSB1c2VyCisJICogQHBhcmFtIHBhc3N3b3JkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxHcmFwaEVsZW1lbnQ+LCBOZW80ak9wZXJhdGlvblN0YXR1cz4gZ2V0QnlGaWx0ZXIoR3JhcGhFbGVtZW50VHlwZUVudW0gdHlwZSwgU3RyaW5nIGxhYmVsLAorCQkJTWF0Y2hGaWx0ZXIgZmlsdGVyKSB7CisKKwkJTGlzdDxHcmFwaEVsZW1lbnQ+IHJlc3VsdCA9IG51bGw7CisKKwkJU3RyaW5nIHJlcXVlc3RKc29uOworCQkvLyByZXBsYWNlIHJldHVybiB0eXBlCisJCWlmICh0eXBlLmVxdWFscyhHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlKSkgeworCQkJcmVxdWVzdEpzb24gPSBDeXBoZXJUZW1wbGF0ZXMuQ3lwaGVyTWF0Y2hUZW1wbGF0ZS5yZXBsYWNlKCIkdHlwZSQiLCAibiIpOworCQl9IGVsc2UgeworCQkJcmVxdWVzdEpzb24gPSBDeXBoZXJUZW1wbGF0ZXMuQ3lwaGVyTWF0Y2hUZW1wbGF0ZS5yZXBsYWNlKCIkdHlwZSQiLCAiciIpOworCQl9CisJCS8vIHJlcGxhY2UgbGFiZWwKKwkJaWYgKGxhYmVsICE9IG51bGwgJiYgIWxhYmVsLmlzRW1wdHkoKSkgeworCQkJcmVxdWVzdEpzb24gPSByZXF1ZXN0SnNvbi5yZXBsYWNlKCIkbGFiZWwkIiwgbGFiZWwpOworCQl9IGVsc2UgeworCQkJcmVxdWVzdEpzb24gPSByZXF1ZXN0SnNvbi5yZXBsYWNlKCIkbGFiZWwkIiwgIiIpOworCQl9CisKKwkJLy8gcmVwbGFjZSBmaWx0ZXIKKwkJaWYgKGZpbHRlci5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBnZXQgYWxsIHJlY29yZHMgYnkgbGFiZWwKKwkJCXJlcXVlc3RKc29uID0gcmVxdWVzdEpzb24ucmVwbGFjZSgieyRmaWx0ZXIkfSIsICIiKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBmaWx0ZXJTdHIgPSBDeXBoZXJUcmFuc2xhdG9yLnByZXBhcmVGaWx0ZXJCb2R5KGZpbHRlcik7CisJCQlyZXF1ZXN0SnNvbiA9IHJlcXVlc3RKc29uLnJlcGxhY2UoIiRmaWx0ZXIkIiwgZmlsdGVyU3RyKTsKKwkJfQorCQlsb2dnZXIuZGVidWcoIlRyeSB0byBwZXJmb3JtIHJlcXVlc3QgWyB7fSBdIiwgcmVxdWVzdEpzb24pOworCisJCUVpdGhlcjxTdHJpbmcsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBzZW5kUG9zdEN5cGhlcihyZXF1ZXN0SnNvbik7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KE5lbzRqT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJCS8vIHBhcnNlIHJlc3BvbnNlCisJCVN0cmluZyByZXNwb25zZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJdHJ5IHsKKwkJCXJlc3VsdCA9IHBhcnNlR2V0UmVzcG9uc2UodHlwZSwgbGFiZWwsIHJlc3BvbnNlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGZldGNoZWQgZGF0YSBmcm9tIGdyYXBoIiwgZSk7CisJCQlFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBsYWJlbAorCSAqIEBwYXJhbSB0b01hdGNoCisJICogQHBhcmFtIHRvVXBkYXRlCisJICogQHBhcmFtIGlwCisJICogQHBhcmFtIHVzZXIKKwkgKiBAcGFyYW0gcGFzc3dvcmQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIE5lbzRqT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZUVsZW1lbnQoR3JhcGhFbGVtZW50VHlwZUVudW0gdHlwZSwgU3RyaW5nIGxhYmVsLCBVcGRhdGVGaWx0ZXIgdG9VcGRhdGUpIHsKKworCQlTdHJpbmcgcmVxdWVzdEpzb247CisJCS8vIHJlcGxhY2UgcmV0dXJuIHR5cGUKKwkJaWYgKHR5cGUuZXF1YWxzKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpKSB7CisJCQlyZXF1ZXN0SnNvbiA9IEN5cGhlclRlbXBsYXRlcy5DeXBoZXJVcGRhdGVUZW1wbGF0ZS5yZXBsYWNlKCIkdHlwZSQiLCAibiIpOworCQl9IGVsc2UgeworCQkJcmVxdWVzdEpzb24gPSBDeXBoZXJUZW1wbGF0ZXMuQ3lwaGVyVXBkYXRlVGVtcGxhdGUucmVwbGFjZSgiJHR5cGUkIiwgInIiKTsKKwkJfQorCQkvLyByZXBsYWNlIGxhYmVsCisJCWlmIChsYWJlbCAhPSBudWxsICYmICFsYWJlbC5pc0VtcHR5KCkpIHsKKwkJCXJlcXVlc3RKc29uID0gcmVxdWVzdEpzb24ucmVwbGFjZSgiJGxhYmVsJCIsIGxhYmVsKTsKKwkJfSBlbHNlIHsKKwkJCXJlcXVlc3RKc29uID0gcmVxdWVzdEpzb24ucmVwbGFjZSgiJGxhYmVsJCIsICIiKTsKKwkJfQorCisJCS8vIHJlcGxhY2UgZmlsdGVyCisJCWlmICh0b1VwZGF0ZS5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBnZXQgYWxsIHJlY29yZHMgYnkgbGFiZWwKKwkJCXJlcXVlc3RKc29uID0gcmVxdWVzdEpzb24ucmVwbGFjZSgieyRmaWx0ZXIkfSIsICIiKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBmaWx0ZXJTdHIgPSBDeXBoZXJUcmFuc2xhdG9yLnByZXBhcmVGaWx0ZXJCb2R5KHRvVXBkYXRlKTsKKwkJCXJlcXVlc3RKc29uID0gcmVxdWVzdEpzb24ucmVwbGFjZSgiJGZpbHRlciQiLCBmaWx0ZXJTdHIpOworCQl9CisJCVN0cmluZyBwcm9wcyA9IHByZXBhcmVQcm9wZXJ0aWVzSW5TdGF0ZW1lbnQodG9VcGRhdGUuZ2V0VG9VcGRhdGUoKSk7CisJCXJlcXVlc3RKc29uID0gcmVxdWVzdEpzb24ucmVwbGFjZSgiJHByb3BzJCIsIHByb3BzKTsKKworCQlsb2dnZXIuZGVidWcoIlRyeSB0byBwZXJmb3JtIHJlcXVlc3QgWyB7fSBdIiwgcmVxdWVzdEpzb24pOworCisJCUVpdGhlcjxTdHJpbmcsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBzZW5kUG9zdEN5cGhlcihyZXF1ZXN0SnNvbik7CisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCQlyZXR1cm4gTmVvNGpPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcGFyYW0gbGFiZWwKKwkgKiBAcGFyYW0gcmVzcG9uc2UKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorCSAqLworCisJcHJpdmF0ZSBMaXN0PEdyYXBoRWxlbWVudD4gcGFyc2VHZXRSZXNwb25zZShHcmFwaEVsZW1lbnRUeXBlRW51bSB0eXBlLCBTdHJpbmcgbGFiZWwsIFN0cmluZyByZXNwb25zZSkKKwkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisJCUxpc3Q8R3JhcGhFbGVtZW50PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEdyYXBoRWxlbWVudD4oKTsKKwkJSlNPTk9iamVjdCByZXNwb25zZURhdGEgPSAoSlNPTk9iamVjdCkganNvblBhcnNlci5wYXJzZShyZXNwb25zZSk7CisJCUpTT05BcnJheSByZXN1bHRzID0gKEpTT05BcnJheSkgcmVzcG9uc2VEYXRhLmdldCgicmVzdWx0cyIpOworCQlJdGVyYXRvcjxKU09OT2JqZWN0PiBpdGVyYXRvclJlc3VsdHMgPSByZXN1bHRzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvclJlc3VsdHMuaGFzTmV4dCgpKSB7CisJCQlKU09OT2JqZWN0IGVsZW1lbnRSZXN1bHQgPSBpdGVyYXRvclJlc3VsdHMubmV4dCgpOworCQkJLy8gSlNPTkFycmF5IGRhdGEgPSAoSlNPTkFycmF5KSBlbGVtZW50UmVzdWx0LmdldCgicm93Iik7CisJCQlKU09OQXJyYXkgZGF0YSA9IChKU09OQXJyYXkpIGVsZW1lbnRSZXN1bHQuZ2V0KCJkYXRhIik7CisKKwkJCUl0ZXJhdG9yPEpTT05PYmplY3Q+IGl0ZXJhdG9yID0gZGF0YS5pdGVyYXRvcigpOworCQkJSlNPTk9iamVjdCBlbGVtZW50OworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCWVsZW1lbnQgPSAoSlNPTk9iamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJCUpTT05BcnJheSByb3cgPSAoSlNPTkFycmF5KSBlbGVtZW50LmdldCgicm93Iik7CisKKwkJCQlJdGVyYXRvcjxKU09OT2JqZWN0PiBpdGVyYXRvclJvdyA9IHJvdy5pdGVyYXRvcigpOworCQkJCXdoaWxlIChpdGVyYXRvclJvdy5oYXNOZXh0KCkpIHsKKwkJCQkJSlNPTk9iamVjdCByb3dFbGVtZW50ID0gaXRlcmF0b3JSb3cubmV4dCgpOworCisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiAoU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+KSByb3dFbGVtZW50LmVudHJ5U2V0KCkpIHsKKwkJCQkJCS8vIHByb3BzLnB1dChlbnRyeS5nZXRLZXkoKSwKKwkJCQkJCS8vIHJvd0VsZW1lbnQuZ2V0KGVudHJ5LmdldFZhbHVlKCkpKTsKKwkJCQkJCXByb3BzLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCX0KKwkJCQkJR3JhcGhFbGVtZW50IG5ld0VsZW1lbnQgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQobGFiZWwsIHR5cGUsIHByb3BzKTsKKwkJCQkJcmVzdWx0LmFkZChuZXdFbGVtZW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIExpc3Q8TGlzdDxHcmFwaEVsZW1lbnQ+PiBwYXJzZVJlc3VsdChTdHJpbmcgcmVzcG9uc2UsIGJvb2xlYW4gc3RvcmVSZWxhdGlvbk5vZGUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisKKwkJTGlzdDxMaXN0PEdyYXBoRWxlbWVudD4+IGJhdGNoTGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxHcmFwaEVsZW1lbnQ+PigpOworCisJCUpTT05PYmplY3QgcmVzcG9uc2VEYXRhID0gKEpTT05PYmplY3QpIGpzb25QYXJzZXIucGFyc2UocmVzcG9uc2UpOworCQlKU09OQXJyYXkgcmVzdWx0cyA9IChKU09OQXJyYXkpIHJlc3BvbnNlRGF0YS5nZXQoInJlc3VsdHMiKTsKKwkJSXRlcmF0b3I8SlNPTk9iamVjdD4gaXRlcmF0b3JSZXN1bHRzID0gcmVzdWx0cy5pdGVyYXRvcigpOworCisJCXdoaWxlIChpdGVyYXRvclJlc3VsdHMuaGFzTmV4dCgpKSB7CisJCQlKU09OT2JqZWN0IGVsZW1lbnRSZXN1bHQgPSBpdGVyYXRvclJlc3VsdHMubmV4dCgpOworCQkJSlNPTkFycmF5IGRhdGEgPSAoSlNPTkFycmF5KSBlbGVtZW50UmVzdWx0LmdldCgiZGF0YSIpOworCQkJSlNPTkFycmF5IGNvbHVtbnMgPSAoSlNPTkFycmF5KSBlbGVtZW50UmVzdWx0LmdldCgiY29sdW1ucyIpOworCQkJSXRlcmF0b3I8SlNPTk9iamVjdD4gaXRlcmF0b3JEYXRhID0gZGF0YS5pdGVyYXRvcigpOworCQkJTGlzdDxHcmFwaEVsZW1lbnQ+IHNpbmdsZURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxHcmFwaEVsZW1lbnQ+KCk7CisJCQl3aGlsZSAoaXRlcmF0b3JEYXRhLmhhc05leHQoKSkgeworCisJCQkJSlNPTk9iamVjdCBzaW5nbGVEYXRhID0gaXRlcmF0b3JEYXRhLm5leHQoKTsKKwkJCQlKU09OQXJyYXkgcm93ID0gKEpTT05BcnJheSkgc2luZ2xlRGF0YS5nZXQoInJvdyIpOworCQkJCWlmIChjb2x1bW5zLnNpemUoKSA9PSAyKSB7CisJCQkJCS8vIG5vZGUKKwkJCQkJSlNPTkFycmF5IGxhYmVsQXJyYXkgPSAoSlNPTkFycmF5KSByb3cuZ2V0KDEpOworCQkJCQlKU09OT2JqZWN0IG5vZGUgPSAoSlNPTk9iamVjdCkgcm93LmdldCgwKTsKKworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0ganNvbk9iamVjdFRvTWFwKG5vZGUpOworCQkJCQkvLyBnZXQgb25seSBmaXJzdCBsYWJlbCBvbiBub2RlLiBOb3cgc2luZ2xlIGxhYmVsIHN1cHBvcnRlZAorCQkJCQlHcmFwaEVsZW1lbnQgbmV3RWxlbWVudCA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudCgoU3RyaW5nKSBsYWJlbEFycmF5LmdldCgwKSwKKwkJCQkJCQlHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBwcm9wcyk7CisJCQkJCXNpbmdsZURhdGFMaXN0LmFkZChuZXdFbGVtZW50KTsKKwkJCQl9CisJCQkJaWYgKGNvbHVtbnMuc2l6ZSgpID09IDEwKSB7CisJCQkJCS8vIHJlbGF0aW9uCisJCQkJCUpTT05PYmplY3Qgc3RhcnROb2RlID0gKEpTT05PYmplY3QpIHJvdy5nZXQoMCk7CisJCQkJCUpTT05BcnJheSBzdGFydE5vZGVBcnJheSA9IChKU09OQXJyYXkpIHJvdy5nZXQoMSk7CisKKwkJCQkJSlNPTk9iamVjdCByZWxhdGlvbkZyb21TdGFydCA9IChKU09OT2JqZWN0KSByb3cuZ2V0KDIpOworCQkJCQlTdHJpbmcgcmVsYXRpb25Gcm9tU3RhcnRUeXBlID0gKFN0cmluZykgcm93LmdldCgzKTsKKworCQkJCQlKU09OT2JqZWN0IG5vZGVGcm9tID0gKEpTT05PYmplY3QpIHJvdy5nZXQoNCk7CisJCQkJCUpTT05BcnJheSBsYWJlbEZyb21BcnJheSA9IChKU09OQXJyYXkpIHJvdy5nZXQoNSk7CisKKwkJCQkJSlNPTk9iamVjdCBub2RlVG8gPSAoSlNPTk9iamVjdCkgcm93LmdldCg2KTsKKwkJCQkJSlNPTkFycmF5IGxhYmVsVG9BcnJheSA9IChKU09OQXJyYXkpIHJvdy5nZXQoNyk7CisKKwkJCQkJSlNPTk9iamVjdCByZWxhdGlvbiA9IChKU09OT2JqZWN0KSByb3cuZ2V0KDgpOworCQkJCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHJvdy5nZXQoOSk7CisKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wc1N0YXJ0Tm9kZSA9IGpzb25PYmplY3RUb01hcChzdGFydE5vZGUpOworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzUmVsYXRpb25TdGFydE5vZGUgPSBqc29uT2JqZWN0VG9NYXAocmVsYXRpb25Gcm9tU3RhcnQpOworCisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHNGcm9tID0ganNvbk9iamVjdFRvTWFwKG5vZGVGcm9tKTsKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wc1RvID0ganNvbk9iamVjdFRvTWFwKG5vZGVUbyk7CisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHNSZWxhdGlvbiA9IGpzb25PYmplY3RUb01hcChyZWxhdGlvbik7CisKKwkJCQkJR3JhcGhOb2RlIHN0YXJ0TiA9IChHcmFwaE5vZGUpIEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudCgoU3RyaW5nKSBzdGFydE5vZGVBcnJheS5nZXQoMCksCisJCQkJCQkJR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgcHJvcHNTdGFydE5vZGUpOworCisJCQkJCUdyYXBoTm9kZSBmcm9tID0gKEdyYXBoTm9kZSkgR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KChTdHJpbmcpIGxhYmVsRnJvbUFycmF5LmdldCgwKSwKKwkJCQkJCQlHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBwcm9wc0Zyb20pOworCQkJCQlHcmFwaE5vZGUgdG8gPSAoR3JhcGhOb2RlKSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoKFN0cmluZykgbGFiZWxUb0FycmF5LmdldCgwKSwKKwkJCQkJCQlHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBwcm9wc1RvKTsKKworCQkJCQlzaW5nbGVEYXRhTGlzdC5hZGQoc3RhcnROKTsKKworCQkJCQlHcmFwaEVsZW1lbnQgcmVsYXRpb25Gcm9tU3RhcnROb2RlID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVSZWxhdGlvbih0eXBlLAorCQkJCQkJCXByb3BzUmVsYXRpb25TdGFydE5vZGUsIHN0YXJ0TiwgZnJvbSk7CisJCQkJCXNpbmdsZURhdGFMaXN0LmFkZChyZWxhdGlvbkZyb21TdGFydE5vZGUpOworCisJCQkJCXNpbmdsZURhdGFMaXN0LmFkZChmcm9tKTsKKwkJCQkJc2luZ2xlRGF0YUxpc3QuYWRkKHRvKTsKKwkJCQkJLy8gZ2V0IG9ubHkgZmlyc3QgdHlwZSBvbiByZWxhdGlvbnNoaXAuIE5vdyBzaW5nbGUgdHlwZQorCQkJCQkvLyBzdXBwb3J0ZWQKKwkJCQkJR3JhcGhFbGVtZW50IG5ld0VsZW1lbnQgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZVJlbGF0aW9uKHR5cGUsIHByb3BzUmVsYXRpb24sIGZyb20sIHRvKTsKKwkJCQkJc2luZ2xlRGF0YUxpc3QuYWRkKG5ld0VsZW1lbnQpOworCQkJCX0KKwkJCQlpZiAoY29sdW1ucy5zaXplKCkgPT0gOCkgeworCisJCQkJfQorCQkJfQorCQkJYmF0Y2hMaXN0LmFkZChzaW5nbGVEYXRhTGlzdCk7CisJCX0KKwkJcmV0dXJuIGJhdGNoTGlzdDsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbk9iamVjdFRvTWFwKEpTT05PYmplY3Qgbm9kZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogKFNldDxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+Pikgbm9kZS5lbnRyeVNldCgpKSB7CisJCQlwcm9wcy5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQl9CisJCXJldHVybiBwcm9wczsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBwcmVwYXJlUHJvcGVydGllc0luU3RhdGVtZW50KE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaW50IGNvdW50ID0gMDsKKwkJaW50IHNpemUgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuc2l6ZSgpOworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCXNiLmFwcGVuZCgiXCIiKS5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiXCIiKS5hcHBlbmQoIjoiKTsKKwkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQkJc2IuYXBwZW5kKCJcIiIpOworCQkJfQorCQkJc2IuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpOworCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlzYi5hcHBlbmQoIlwiIik7CisJCQl9CisJCQkrK2NvdW50OworCQkJaWYgKGNvdW50IDwgc2l6ZSkgeworCQkJCXNiLmFwcGVuZCgiLCIpOworCQkJfQorCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFN0cmluZywgTmVvNGpPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUoR3JhcGhFbGVtZW50IGVsZW1lbnQpIHsKKwkJRWl0aGVyPFN0cmluZywgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHN0YXR1czsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaE5vZGUpIHsKKwkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgZWxlbWVudDsKKwkJCVN0cmluZyBqc29uID0gcHJlcGFyZUNyZWF0ZU5vZGVCb2R5KG5vZGUpOworCisJCQlsb2dnZXIuZGVidWcoIlRyeSB0byBzYXZlIE5vZGUgWyB7fSBdIiwganNvbik7CisKKwkJCXN0YXR1cyA9IHNlbmRQb3N0Q3lwaGVyKGpzb24pOworCisJCQlyZXR1cm4gc3RhdHVzOworCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KE5lbzRqT3BlcmF0aW9uU3RhdHVzLldST05HX0lOUFVUKTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPFN0cmluZywgTmVvNGpPcGVyYXRpb25TdGF0dXM+IHNlbmRQb3N0Q3lwaGVyKFN0cmluZyBqc29uKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbmVvNGpQYXJhbXMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXROZW80aigpOworCQlTdHJpbmcgaG9zdCA9IChTdHJpbmcpIG5lbzRqUGFyYW1zLmdldCgiaG9zdCIpOworCQlJbnRlZ2VyIHBvcnQgPSAoSW50ZWdlcikgbmVvNGpQYXJhbXMuZ2V0KCJwb3J0Iik7CisJCVN0cmluZyB1c2VyID0gKFN0cmluZykgbmVvNGpQYXJhbXMuZ2V0KCJ1c2VyIik7CisJCVN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpIG5lbzRqUGFyYW1zLmdldCgicGFzc3dvcmQiKTsKKworCQlTdHJpbmcgdXJpID0gQ3lwaGVyVGVtcGxhdGVzLkN5cGhlclVybFRlbXBsYXRlLnJlcGxhY2UoIiRob3N0JCIsIGhvc3QpOworCQl1cmkgPSB1cmkucmVwbGFjZSgiJHBvcnQkIiwgcG9ydC50b1N0cmluZygpKTsKKworCQlIdHRwQ2xpZW50Q29udGV4dCBjb250ZXh0ID0gY3JlYXRDbGllbnRDb250ZXh0KGhvc3QsIHVzZXIsIHBhc3N3b3JkKTsKKwkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQlIdHRwUG9zdCBwb3N0ID0gbmV3IEh0dHBQb3N0KHVyaSk7CisJCXRyeSB7CisJCQlTdHJpbmdFbnRpdHkgaW5wdXQgPSBuZXcgU3RyaW5nRW50aXR5KGpzb24pOworCQkJaW5wdXQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJCXBvc3Quc2V0RW50aXR5KGlucHV0KTsKKworCQkJcmVzcG9uc2UgPSBodHRwQ2xpZW50LmV4ZWN1dGUocG9zdCwgY29udGV4dCk7CisKKwkJCWludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nOworCQkJcmVzcG9uc2VTdHJpbmcgPSBuZXcgQmFzaWNSZXNwb25zZUhhbmRsZXIoKS5oYW5kbGVSZXNwb25zZShyZXNwb25zZSk7CisJCQlsb2dnZXIuZGVidWcoInJlc3BvbnNlIFsge30gXSIsIHJlc3BvbnNlU3RyaW5nKTsKKworCQkJaWYgKHN0YXR1cyA9PSAyMDAgfHwgc3RhdHVzID09IDIwMSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiY3lwaGVyIHJlcXVlc3QgWyB7fSBdIiwganNvbik7CisJCQkJTmVvNGpPcGVyYXRpb25TdGF0dXMgcmVzcG9uc2VTdGF0dXMgPSBjaGVja1Jlc3BvbnNlKHJlc3BvbnNlU3RyaW5nKTsKKwkJCQlpZiAoTmVvNGpPcGVyYXRpb25TdGF0dXMuT0suZXF1YWxzKHJlc3BvbnNlU3RhdHVzKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzcG9uc2VTdHJpbmcpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzcG9uc2VTdGF0dXMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJjeXBoZXIgcmVxdWVzdCBbIHt9IF0gd2FzIGZhaWxlZDogWyB7fSBdIiwganNvbiwgcmVzcG9uc2VTdHJpbmcpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisKKwkJfSBjYXRjaCAoSHR0cFJlc3BvbnNlRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIHBlcmZvcm0gY3lwaGVyIHJlcXVlc3QgWyB7fSBdLCB7fSIsIGpzb24sIGUpOworCQkJaWYgKGUuZ2V0U3RhdHVzQ29kZSgpID09IDQwMSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuTk9UX0FVVEhPUklaRUQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KE5lbzRqT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQl9IGNhdGNoIChDbGllbnRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBwZXJmb3JtIGN5cGhlciByZXF1ZXN0IFsge30gXSB7fSIsIGpzb24sIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5IVFRQX1BST1RPQ09MX0VSUk9SKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmRlYnVnKCJmYWlsZWQgdG8gcGVyZm9ybSBjeXBoZXIgcmVxdWVzdCBbIHt9IF0ge30iLCBqc29uLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuTk9UX0NPTk5FQ1RFRCk7CisJCX0gZmluYWxseSB7CisJCQlyZWxlYXNlUmVzb3VyY2UocmVzcG9uc2UpOworCQl9CisJfQorCisJcHJpdmF0ZSBOZW80ak9wZXJhdGlvblN0YXR1cyBjaGVja1Jlc3BvbnNlKFN0cmluZyByZXNwb25zZVN0cmluZykgeworCQl0cnkgeworCQkJSlNPTk9iamVjdCByZXNwb25zZSA9IChKU09OT2JqZWN0KSBqc29uUGFyc2VyLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTsKKwkJCUpTT05BcnJheSBlcnJvcnMgPSAoSlNPTkFycmF5KSByZXNwb25zZS5nZXQoImVycm9ycyIpOworCQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMCkgeworCQkJCXJldHVybiBOZW80ak9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0gZWxzZSB7CisJCQkJSXRlcmF0b3I8SlNPTk9iamVjdD4gaXRlcmF0b3IgPSBlcnJvcnMuaXRlcmF0b3IoKTsKKwkJCQlKU09OT2JqZWN0IGVycm9yOworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJZXJyb3IgPSAoSlNPTk9iamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJCQlTdHJpbmcgY29kZSA9IChTdHJpbmcpIGVycm9yLmdldCgiY29kZSIpOworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IChTdHJpbmcpIGVycm9yLmdldCgibWVzc2FnZSIpOworCisJCQkJCU5lbzRqT3BlcmF0aW9uU3RhdHVzIG5lb0Vycm9yID0gbWFwVG9OZW9FcnJvcihjb2RlLCBtZXNzYWdlKTsKKwkJCQkJcmV0dXJuIG5lb0Vycm9yOworCQkJCX0KKwkJCQlyZXR1cm4gTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCX0KKwkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UiLCBlKTsKKwkJCXJldHVybiBOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQl9CisJfQorCisJcHJpdmF0ZSBOZW80ak9wZXJhdGlvblN0YXR1cyBtYXBUb05lb0Vycm9yKFN0cmluZyBjb2RlLCBTdHJpbmcgbWVzc2FnZSkgeworCQlOZW80ak9wZXJhdGlvblN0YXR1cyBlcnJvcjsKKworCQlTdHJpbmdbXSBlcnJvckNvZGUgPSBjb2RlLnNwbGl0KCJcXC4iKTsKKwkJaWYgKGVycm9yQ29kZS5sZW5ndGggPCA0KSB7CisJCQllcnJvciA9IE5lbzRqT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0gZWxzZSB7CisJCQkvLyBieSBDbGFzc2lmaWNhdGlvbgorCQkJc3dpdGNoIChlcnJvckNvZGVbMV0pIHsKKwkJCWNhc2UgQ2xpZW50RXJyb3I6CisJCQkJLy8gYnkgQ2F0ZWdvcnkKKwkJCQlzd2l0Y2ggKGVycm9yQ29kZVsyXSkgeworCQkJCWNhc2UgR2VuZXJhbDoKKwkJCQkJZXJyb3IgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5EQl9SRUFEX09OTFk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTGVnYWN5SW5kZXg6CisJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuTEVHQUNZX0lOREVYX0VSUk9SOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJlcXVlc3Q6CisJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1Q7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2NoZW1hOgorCQkJCQlpZiAoZXJyb3JDb2RlWzNdLmVxdWFscyhDb25zdHJhaW50VmlvbGF0aW9uKSkgeworCQkJCQkJZXJyb3IgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5FTlRJVFlfQUxSRUFEWV9FWElTVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuU0NIRU1BX0VSUk9SOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2VjdXJpdHk6CisJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuTk9UX0FVVEhPUklaRUQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU3RhdGVtZW50OgorCQkJCQkvLyBieSBUaXRsZQorCQkJCQlpZiAoZXJyb3JDb2RlWzNdLmVxdWFscyhFbnRpdHlOb3RGb3VuZCkpIHsKKwkJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGVycm9yQ29kZVszXS5lcXVhbHMoQ29uc3RyYWludFZpb2xhdGlvbikpIHsKKwkJCQkJCQllcnJvciA9IE5lbzRqT3BlcmF0aW9uU3RhdHVzLkVOVElUWV9BTFJFQURZX0VYSVNUOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQllcnJvciA9IE5lbzRqT3BlcmF0aW9uU3RhdHVzLkJBRF9SRVFVRVNUOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVHJhbnNhY3Rpb246CisJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuVFJBTlNBQ1RJT05fRVJST1I7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEYXRhYmFzZUVycm9yOgorCQkJCS8vIGJ5IENhdGVnb3J5CisJCQkJc3dpdGNoIChlcnJvckNvZGVbMl0pIHsKKwkJCQljYXNlIEdlbmVyYWw6CisJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTY2hlbWE6CisJCQkJCWVycm9yID0gTmVvNGpPcGVyYXRpb25TdGF0dXMuU0NIRU1BX0VSUk9SOworCQkJCQlicmVhazsKKwkJCQljYXNlIFN0YXRlbWVudDoKKwkJCQkJZXJyb3IgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5FWEVDVVRJT05fRkFJTEVEOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRyYW5zYWN0aW9uOgorCQkJCQllcnJvciA9IE5lbzRqT3BlcmF0aW9uU3RhdHVzLlRSQU5TQUNUSU9OX0VSUk9SOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQllcnJvciA9IE5lbzRqT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVHJhbnNpZW50RXJyb3I6CisJCQkJZXJyb3IgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5EQl9OT1RfQVZBSUxBQkxFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllcnJvciA9IE5lbzRqT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQkJYnJlYWs7CisJCQl9CisJCQllcnJvci5zZXRPcmlnaW5FcnJvcihjb2RlKS5zZXRNZXNzYWdlKG1lc3NhZ2UpOworCQkJU3RyaW5nIGVycm9yRnJvbUNmZyA9IGNvZGUucmVwbGFjZSgiLiIsICJfIik7CisJCQlTdHJpbmcgaGVscE1lc3NhZ2UgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldE5lbzRqRXJyb3JzQ29uZmlndXJhdGlvbigpCisJCQkJCS5nZXRFcnJvck1lc3NhZ2UoZXJyb3JGcm9tQ2ZnKTsKKwkJCWlmIChoZWxwTWVzc2FnZSAhPSBudWxsICYmICFoZWxwTWVzc2FnZS5pc0VtcHR5KCkpIHsKKwkJCQllcnJvci5zZXRIZWxwRXJyb3JNc2coaGVscE1lc3NhZ2UpOworCQkJfQorCQl9CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBwcmVwYXJlQ3JlYXRlTm9kZUJvZHkoR3JhcGhOb2RlIG5vZGUpIHsKKworCQlTdHJpbmcgYm9keSA9IEN5cGhlclRlbXBsYXRlcy5DeXBoZXJDcmVhdGVOb2RlVGVtcGxhdGUucmVwbGFjZSgiJGxhYmVsJCIsIG5vZGUuZ2V0TGFiZWwoKSk7CisKKwkJYm9keSA9IGJvZHkucmVwbGFjZSgiJHByb3BzJCIsIERhb1V0aWxzLmNvbnZlcnRUb0pzb24obm9kZS50b0dyYXBoTWFwKCkpKTsKKworCQlyZXR1cm4gYm9keTsKKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIHJldHVybnMgYWxsIHRoZSBpbmRleGVzIGZvciB0aGUgZ2l2ZW4gbGFiZWwgaWYgbm8gbGFiZWwgaXMKKwkgKiBzdXBwbGllZCAoIG51bGwgb3IgIiIpIGFsbCBpbmRleGVzIHdpbGwgYmUgcmV0dXJuZWQKKwkgKiAKKwkgKiBAcGFyYW0gbGFiZWwKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBsYWJlbAorCSAqIEBwYXJhbSBpcAorCSAqIEBwYXJhbSB1c2VyCisJICogQHBhcmFtIHBhc3N3b3JkCisJICogQHJldHVybiBhIG1hcCBvZiBsYWJlbHMgYW5kIHRoZXJlIHByb3BlcnRpZXMKKwkgKi8KKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4sIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBnZXRJbmRleGVzKFN0cmluZyBsYWJlbCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5lbzRqUGFyYW1zID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TmVvNGooKTsKKwkJU3RyaW5nIGhvc3QgPSAoU3RyaW5nKSBuZW80alBhcmFtcy5nZXQoImhvc3QiKTsKKwkJSW50ZWdlciBwb3J0ID0gKEludGVnZXIpIG5lbzRqUGFyYW1zLmdldCgicG9ydCIpOworCQlTdHJpbmcgdXNlciA9IChTdHJpbmcpIG5lbzRqUGFyYW1zLmdldCgidXNlciIpOworCQlTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKSBuZW80alBhcmFtcy5nZXQoInBhc3N3b3JkIik7CisKKwkJU3RyaW5nIHVyaSA9IG51bGw7CisJCWlmIChsYWJlbCA9PSBudWxsIHx8ICIiLmVxdWFscyhsYWJlbCkpIHsKKwkJCXVyaSA9IEN5cGhlclRlbXBsYXRlcy5nZXRBbGxJbmRleHNUZW1wbGF0ZS5yZXBsYWNlKCIkaG9zdCQiLCBob3N0KTsKKwkJfSBlbHNlIHsKKwkJCXVyaSA9IEN5cGhlclRlbXBsYXRlcy5nZXRBbGxJbmRleHNUZW1wbGF0ZS5yZXBsYWNlKCIkaG9zdCQiLCBob3N0KSArICIvIiArIGxhYmVsOworCQl9CisJCXVyaSA9IHVyaS5yZXBsYWNlKCIkcG9ydCQiLCBwb3J0LnRvU3RyaW5nKCkpOworCisJCUh0dHBDbGllbnRDb250ZXh0IGNvbnRleHQgPSBjcmVhdENsaWVudENvbnRleHQoaG9zdCwgdXNlciwgcGFzc3dvcmQpOworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCUh0dHBHZXQgZ2V0ID0gbmV3IEh0dHBHZXQodXJpKTsKKwkJZ2V0LnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJZ2V0LnNldEhlYWRlcigiQWNjZXB0IiwgImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiKTsKKworCQl0cnkgeworCisJCQlyZXNwb25zZSA9IGh0dHBDbGllbnQuZXhlY3V0ZShnZXQsIGNvbnRleHQpOworCQkJaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJaWYgKHN0YXR1c0NvZGUgIT0gMjAwKSB7CisJCQkJbG9nZ2VyLmVycm9yKCJmYWlsZWQgdG8gZ2V0IGluZGV4ZXMgcmVxdWVzdGUgcmV0dXJuZWQgIiArIHN0YXR1c0NvZGUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoTmVvNGpPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9IGVsc2UgeworCQkJCU1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbGFiZWxzID0gZ2V0TGVhYmxlc0Zyb21Kc29uKHJlc3BvbnNlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQobGFiZWxzKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGdldCBpbmRleGVzICIsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlbGVhc2VSZXNvdXJjZShyZXNwb25zZSk7CisKKwkJfQorCisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldExlYWJsZXNGcm9tSnNvbihDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UpCisJCQl0aHJvd3MgSHR0cFJlc3BvbnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGxhYmVscyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gbmV3IEJhc2ljUmVzcG9uc2VIYW5kbGVyKCkuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpOworCQlKU09OQXJyYXkgcmVzdWx0cyA9IChKU09OQXJyYXkpIGpzb25QYXJzZXIucGFyc2UocmVzcG9uc2VTdHJpbmcpOworCQlJdGVyYXRvcjxKU09OT2JqZWN0PiBpdGVyYXRvclJlc3VsdHMgPSByZXN1bHRzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyYXRvclJlc3VsdHMuaGFzTmV4dCgpKSB7CisJCQlKU09OT2JqZWN0IGVsZW1lbnRSZXN1bHQgPSBpdGVyYXRvclJlc3VsdHMubmV4dCgpOworCQkJU3RyaW5nIGxhYmVsID0gKFN0cmluZykgZWxlbWVudFJlc3VsdC5nZXQoImxhYmVsIik7CisJCQlMaXN0PFN0cmluZz4gcHJvcHMgPSBsYWJlbHMuZ2V0KGxhYmVsKTsKKwkJCWlmIChwcm9wcyA9PSBudWxsKSB7CisJCQkJcHJvcHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQlsYWJlbHMucHV0KGxhYmVsLCBwcm9wcyk7CisJCQl9CisJCQlKU09OQXJyYXkgcHJvcGVydGllcyA9IChKU09OQXJyYXkpIGVsZW1lbnRSZXN1bHQuZ2V0KCJwcm9wZXJ0eV9rZXlzIik7CisJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gcHJvcGVydGllcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCXByb3BzLmFkZChpdGVyYXRvci5uZXh0KCkpOworCQkJfQorCQl9CisJCXJldHVybiBsYWJlbHM7CisJfQorCisJcHVibGljIE5lbzRqT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUluZGV4KFN0cmluZyBsYWJlbCwgTGlzdDxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKworCQlOZW80ak9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5PSzsKKwkJaWYgKHByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAhcHJvcGVydHlOYW1lcy5pc0VtcHR5KCkpIHsKKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBuZW80alBhcmFtcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpCisJCQkJCS5nZXROZW80aigpOworCQkJU3RyaW5nIGhvc3QgPSAoU3RyaW5nKSBuZW80alBhcmFtcy5nZXQoImhvc3QiKTsKKwkJCUludGVnZXIgcG9ydCA9IChJbnRlZ2VyKSBuZW80alBhcmFtcy5nZXQoInBvcnQiKTsKKwkJCVN0cmluZyB1c2VyID0gKFN0cmluZykgbmVvNGpQYXJhbXMuZ2V0KCJ1c2VyIik7CisJCQlTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKSBuZW80alBhcmFtcy5nZXQoInBhc3N3b3JkIik7CisKKwkJCVN0cmluZyB1cmkgPSBDeXBoZXJUZW1wbGF0ZXMuYmF0Y2hUZW1wbGF0ZS5yZXBsYWNlKCIkaG9zdCQiLCBob3N0KTsKKwkJCXVyaSA9IHVyaS5yZXBsYWNlKCIkcG9ydCQiLCBwb3J0LnRvU3RyaW5nKCkpOworCisJCQlTdHJpbmcgb3BlcnRpb25VcmkgPSAiL3NjaGVtYS9pbmRleC8iICsgbGFiZWw7CisKKwkJCUh0dHBDbGllbnRDb250ZXh0IGNvbnRleHQgPSBjcmVhdENsaWVudENvbnRleHQoaG9zdCwgdXNlciwgcGFzc3dvcmQpOworCisJCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCQlIdHRwUG9zdCBwb3N0ID0gbmV3IEh0dHBQb3N0KHVyaSk7CisKKwkJCVN0cmluZyBqc29uID0gY3JlYXRlQmF0Y2hKc29uKEh0dHBNZXRob2QuUE9TVCwgb3BlcnRpb25VcmksIHByb3BlcnR5TmFtZXMpOworCisJCQl0cnkgeworCQkJCVN0cmluZ0VudGl0eSBpbnB1dCA9IG5ldyBTdHJpbmdFbnRpdHkoanNvbik7CisJCQkJaW5wdXQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJCQlwb3N0LnNldEVudGl0eShpbnB1dCk7CisJCQkJcmVzcG9uc2UgPSBodHRwQ2xpZW50LmV4ZWN1dGUocG9zdCwgY29udGV4dCk7CisJCQkJaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJCWlmIChzdGF0dXNDb2RlICE9IDIwMCkgeworCQkJCQlsb2dnZXIuZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgaW5kZXggZm9yIGxhYmVsIFsiICsgbGFiZWwgKyAiXSB3aXRoIHByb3BlcnRpZXM6IiArIHByb3BlcnR5TmFtZXMKKwkJCQkJCQkrICIgcmVxdWVzdGUgcmV0dXJuZWQgIiArIHN0YXR1c0NvZGUpOworCQkJCQlyZXN1bHQgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZ2dlci5kZWJ1ZygiaW5kZXggZm9yIGxhYmVsIFsge30gXSB3aXRoIHByb3BlcnRpZXMge30gY3JlYXRlZCIsIGxhYmVsLCBwcm9wZXJ0eU5hbWVzKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSBpbmRleCBmb3IgbGFiZWwgWyB7fSBdIHdpdGggcHJvcGVydGllcyB7fSIsIGxhYmVsLCBwcm9wZXJ0eU5hbWVzKTsKKwkJCQlyZXN1bHQgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJfSBmaW5hbGx5IHsKKworCQkJCXJlbGVhc2VSZXNvdXJjZShyZXNwb25zZSk7CisKKwkJCX0KKworCQl9CisKKwkJZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoIm5vIGluZGV4IHdhcyBjcmVhdGVkIGZvciBsYWJlbDoge30sIHRoZSByZWNlaXZlZCBwcm9wZXJ0eU5hbWVzIGxpc3Q6IHt9IGlzIGludmFsaWQiLCBsYWJlbCwgcHJvcGVydHlOYW1lcyk7CisJCQlyZXR1cm4gTmVvNGpPcGVyYXRpb25TdGF0dXMuV1JPTkdfSU5QVVQ7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBOZW80ak9wZXJhdGlvblN0YXR1cyBjcmVhdGVVbmlxdWVuZXNzQ29uc3RyYWludHMoU3RyaW5nIGxhYmVsLCBMaXN0PFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQlOZW80ak9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5PSzsKKwkJaWYgKHByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAhcHJvcGVydHlOYW1lcy5pc0VtcHR5KCkpIHsKKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBuZW80alBhcmFtcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpCisJCQkJCS5nZXROZW80aigpOworCQkJU3RyaW5nIGhvc3QgPSAoU3RyaW5nKSBuZW80alBhcmFtcy5nZXQoImhvc3QiKTsKKwkJCUludGVnZXIgcG9ydCA9IChJbnRlZ2VyKSBuZW80alBhcmFtcy5nZXQoInBvcnQiKTsKKwkJCVN0cmluZyB1c2VyID0gKFN0cmluZykgbmVvNGpQYXJhbXMuZ2V0KCJ1c2VyIik7CisJCQlTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKSBuZW80alBhcmFtcy5nZXQoInBhc3N3b3JkIik7CisKKwkJCVN0cmluZyB1cmkgPSBDeXBoZXJUZW1wbGF0ZXMuYmF0Y2hUZW1wbGF0ZS5yZXBsYWNlKCIkaG9zdCQiLCBob3N0KTsKKwkJCXVyaSA9IHVyaS5yZXBsYWNlKCIkcG9ydCQiLCBwb3J0LnRvU3RyaW5nKCkpOworCisJCQlTdHJpbmcgb3BlcnRpb25VcmkgPSAiL3NjaGVtYS9jb25zdHJhaW50LyIgKyBsYWJlbCArICIvdW5pcXVlbmVzcy8iOworCisJCQlIdHRwQ2xpZW50Q29udGV4dCBjb250ZXh0ID0gY3JlYXRDbGllbnRDb250ZXh0KGhvc3QsIHVzZXIsIHBhc3N3b3JkKTsKKworCQkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCQkJSHR0cFBvc3QgcG9zdCA9IG5ldyBIdHRwUG9zdCh1cmkpOworCisJCQlTdHJpbmcganNvbiA9IGNyZWF0ZUJhdGNoSnNvbihIdHRwTWV0aG9kLlBPU1QsIG9wZXJ0aW9uVXJpLCBwcm9wZXJ0eU5hbWVzKTsKKworCQkJdHJ5IHsKKwkJCQlTdHJpbmdFbnRpdHkgaW5wdXQgPSBuZXcgU3RyaW5nRW50aXR5KGpzb24pOworCQkJCWlucHV0LnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIik7CisJCQkJcG9zdC5zZXRFbnRpdHkoaW5wdXQpOworCQkJCXJlc3BvbnNlID0gaHR0cENsaWVudC5leGVjdXRlKHBvc3QsIGNvbnRleHQpOworCisJCQkJaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJCWlmIChzdGF0dXNDb2RlICE9IDIwMCkgeworCQkJCQlsb2dnZXIuZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgdW5pcXVlbmVzcyBjb25zdHJhaW50ICBmb3IgbGFiZWwgWyIgKyBsYWJlbCArICJdIG9uIHByb3BlcnRpZXM6IgorCQkJCQkJCSsgcHJvcGVydHlOYW1lcyArICIuIHJlcXVlc3QgcmV0dXJuZWQgIiArIHN0YXR1c0NvZGUpOworCQkJCQlyZXN1bHQgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZ2dlci5kZWJ1ZygidW5pcXVlbmVzcyBjb25zdHJhaW50IGZvciBsYWJlbCBbIHt9IF0gb24gcHJvcGVydGllcyB7fSBjcmVhdGVkIiwgbGFiZWwsIHByb3BlcnR5TmFtZXMpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJbG9nZ2VyLmVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIHVuaXF1ZW5lc3MgY29uc3RyYWludCBbIHt9IF0gd2l0aCBwcm9wZXJ0aWVzIHt9LCBlcnJvcjoge30iLGxhYmVsLCBwcm9wZXJ0eU5hbWVzLCBlKTsKKwkJCQlyZXN1bHQgPSBOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJfSBmaW5hbGx5IHsKKwkJCQlyZWxlYXNlUmVzb3VyY2UocmVzcG9uc2UpOworCQkJfQorCisJCX0KKworCQllbHNlIHsKKwkJCWxvZ2dlci5kZWJ1Zygibm8gaW5kZXggd2FzIGNyZWF0ZWQgZm9yIGxhYmVsOiB7fSB0aGUgcmVjZWl2ZWQgcHJvcGVydHlOYW1lcyBsaXN0OiB7fSBpcyBpbnZhbGlkIiwgbGFiZWwsIHByb3BlcnR5TmFtZXMpOworCQkJcmV0dXJuIE5lbzRqT3BlcmF0aW9uU3RhdHVzLldST05HX0lOUFVUOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgTmVvNGpPcGVyYXRpb25TdGF0dXMgZGVsZXRlRWxlbWVudChHcmFwaEVsZW1lbnRUeXBlRW51bSB0eXBlLCBTdHJpbmcgbGFiZWwsIE1hdGNoRmlsdGVyIGZpbHRlcikgeworCisJCVN0cmluZyByZXF1ZXN0SnNvbjsKKwkJLy8gcmVwbGFjZSByZXR1cm4gdHlwZQorCQlpZiAodHlwZS5lcXVhbHMoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSkpIHsKKwkJCWxvZ2dlci5kZWJ1ZygicmVtb3Zpbmcgbm9kZSBsYWJlbDoge30iLCBsYWJlbCk7CisJCQlyZXF1ZXN0SnNvbiA9IGNyZWF0ZURlbGV0ZU5vZGVTdGF0bWVudChsYWJlbCwgZmlsdGVyKTsKKworCQl9IGVsc2UgeworCQkJbG9nZ2VyLmVycm9yKCIgZGVsZXRlIG9uIHR5cGUge30gaXMgbm90IHlldCBzdXBwb3J0ZWQiLCB0eXBlKTsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIgZGVsZXRlIG9uIHR5cGUgIiArIHR5cGUgKyAiIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIik7CisJCX0KKworCQlsb2dnZXIuZGVidWcoIlRyeSB0byBwZXJmb3JtIHJlcXVlc3QgWyB7fSBdIiwgcmVxdWVzdEpzb24pOworCisJCUVpdGhlcjxTdHJpbmcsIE5lbzRqT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBzZW5kUG9zdEN5cGhlcihyZXF1ZXN0SnNvbik7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2dnZXIuZXJyb3IoIiBkZWxldGUgcmVxdWVzdCBmYWlsZWQgd2l0aCB7fSIsIHN0YXR1cy5yaWdodCgpKTsKKwkJCXJldHVybiBOZW80ak9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQl9IGVsc2UgeworCQkJcmV0dXJuIE5lbzRqT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJfQorCisJcHVibGljIFN0cmluZyBnZXROZW80alZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBuZW80alBhcmFtcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldE5lbzRqKCk7CisJCVN0cmluZyBob3N0ID0gKFN0cmluZykgbmVvNGpQYXJhbXMuZ2V0KCJob3N0Iik7CisJCUludGVnZXIgcG9ydCA9IChJbnRlZ2VyKSBuZW80alBhcmFtcy5nZXQoInBvcnQiKTsKKwkJU3RyaW5nIHVzZXIgPSAoU3RyaW5nKSBuZW80alBhcmFtcy5nZXQoInVzZXIiKTsKKwkJU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZykgbmVvNGpQYXJhbXMuZ2V0KCJwYXNzd29yZCIpOworCisJCVN0cmluZyB1cmkgPSBnZXRTZXJ2aWNlUm9vdC5yZXBsYWNlKCIkaG9zdCQiLCBob3N0KS5yZXBsYWNlKCIkcG9ydCQiLCBwb3J0LnRvU3RyaW5nKCkpOworCisJCUh0dHBDbGllbnRDb250ZXh0IGNvbnRleHQgPSBjcmVhdENsaWVudENvbnRleHQoaG9zdCwgdXNlciwgcGFzc3dvcmQpOworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworCQlIdHRwR2V0IGdldCA9IG5ldyBIdHRwR2V0KHVyaSk7CisJCWdldC5zZXRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWdldC5zZXRIZWFkZXIoIkFjY2VwdCIsICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04Iik7CisKKwkJdHJ5IHsKKwkJCXJlc3BvbnNlID0gaHR0cENsaWVudC5leGVjdXRlKGdldCwgY29udGV4dCk7CisJCQlpbnQgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQlpZiAoc3RhdHVzQ29kZSAhPSAyMDApIHsKKwkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZG4ndCBnZXQgTmVvNGogc2VydmljZSByb290LCBIVFRQIHN0YXR1cyAiICsgc3RhdHVzQ29kZSk7CisJCQl9IGVsc2UgeworCQkJCS8vIFBhcnNlIHJlc3BvbnNlCisJCQkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gbmV3IEJhc2ljUmVzcG9uc2VIYW5kbGVyKCkuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpOworCQkJCUpTT05PYmplY3QgcmVzcG9uc2VEYXRhID0gKEpTT05PYmplY3QpIGpzb25QYXJzZXIucGFyc2UocmVzcG9uc2VTdHJpbmcpOworCQkJCU9iamVjdCBvYmogPSByZXNwb25zZURhdGEuZ2V0KCJuZW80al92ZXJzaW9uIik7CisJCQkJaWYgKG9iaiAhPSBudWxsKSB7CisJCQkJCXJlc3VsdCA9IChTdHJpbmcpIG9iajsKKwkJCQl9CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXJlbGVhc2VSZXNvdXJjZShyZXNwb25zZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBjcmVhdGVEZWxldGVOb2RlU3RhdG1lbnQoU3RyaW5nIGxhYmVsLCBNYXRjaEZpbHRlciBmaWx0ZXIpIHsKKwkJU3RyaW5nIHJlcXVlc3RKc29uOworCQlyZXF1ZXN0SnNvbiA9IEN5cGhlclRlbXBsYXRlcy5DeXBoZXJEZWxldGVOb2RlVGVtcGxhdGU7CisKKwkJaWYgKGxhYmVsICE9IG51bGwgJiYgIWxhYmVsLmlzRW1wdHkoKSkgeworCQkJcmVxdWVzdEpzb24gPSByZXF1ZXN0SnNvbi5yZXBsYWNlKCIkbGFiZWwkIiwgbGFiZWwpOworCQl9IGVsc2UgeworCQkJcmVxdWVzdEpzb24gPSByZXF1ZXN0SnNvbi5yZXBsYWNlKCIkbGFiZWwkIiwgIiIpOworCQl9CisKKwkJLy8gcmVwbGFjZSBmaWx0ZXIKKwkJaWYgKGZpbHRlci5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7CisJCQkvLyBnZXQgYWxsIHJlY29yZHMgYnkgbGFiZWwKKwkJCXJlcXVlc3RKc29uID0gcmVxdWVzdEpzb24ucmVwbGFjZSgieyRmaWx0ZXIkfSIsICIiKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBmaWx0ZXJTdHIgPSBDeXBoZXJUcmFuc2xhdG9yLnByZXBhcmVGaWx0ZXJCb2R5KGZpbHRlcik7CisJCQlyZXF1ZXN0SnNvbiA9IHJlcXVlc3RKc29uLnJlcGxhY2UoIiRmaWx0ZXIkIiwgZmlsdGVyU3RyKTsKKwkJfQorCQlyZXR1cm4gcmVxdWVzdEpzb247CisJfQorCisJLyoKKwkgKiByZW1vdmVkIGRvIHRvIGZvcnRpZnkgc2NhbiBDcmVkZW50aWFsc1Byb3ZpZGVyIGNwID0gbmV3CisJICogQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyKCk7IGNwLnNldENyZWRlbnRpYWxzKEF1dGhTY29wZS5BTlksIG5ldworCSAqIFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyh1c2VyLCBwYXNzd29yZCkpOyBBdXRoQ2FjaGUgYXV0aENhY2hlID0gbmV3CisJICogQmFzaWNBdXRoQ2FjaGUoKTsgQmFzaWNTY2hlbWUgYmFzaWNBdXRoID0gbmV3IEJhc2ljU2NoZW1lKCk7CisJICogYXV0aENhY2hlLnB1dChuZXcgSHR0cEhvc3QoaXAsIDc0NzQsICJodHRwIiksIGJhc2ljQXV0aCk7CisJICogY29udGV4dC5zZXRBdXRoQ2FjaGUoYXV0aENhY2hlKTsgY29udGV4dC5zZXRDcmVkZW50aWFsc1Byb3ZpZGVyKGNwKTsKKwkgKiAKKwkgKi8KKwlwcml2YXRlIEh0dHBDbGllbnRDb250ZXh0IGNyZWF0Q2xpZW50Q29udGV4dChTdHJpbmcgaXAsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpIHsKKwkJSHR0cENsaWVudENvbnRleHQgY29udGV4dCA9IEh0dHBDbGllbnRDb250ZXh0LmNyZWF0ZSgpOworCisJCXJldHVybiBjb250ZXh0OworCX0KKworCXByaXZhdGUgdm9pZCByZWxlYXNlUmVzb3VyY2UoQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB7CisJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCUh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisJCQkJRW50aXR5VXRpbHMuY29uc3VtZShlbnRpdHkpOworCQkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5lcnJvcigiZmFpbGVkIHRvIGNsb3NlIGNvbm5lY3Rpb24gZXhjZXB0aW9uIiwgZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBjcmVhdGVCYXRjaEpzb24oSHR0cE1ldGhvZCBtZXRob2QsIFN0cmluZyBvcGVydGlvblVyaSwgTGlzdDxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXNiLmFwcGVuZCgiWyAiKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLnNpemUoKTsgaSsrKSB7CisJCQlzYi5hcHBlbmQoInsgXCJtZXRob2RcIiA6IFwiIiArIG1ldGhvZCArICJcIiAsIFwidG9cIiA6IFwiIiArIG9wZXJ0aW9uVXJpCisJCQkJCSsgIlwiICwgXCJib2R5XCIgOiB7IFwicHJvcGVydHlfa2V5c1wiIDogWyBcIiIgKyBwcm9wZXJ0eU5hbWVzLmdldChpKSArICJcIiBdIH0gfSIpOworCQkJaWYgKGkgKyAxIDwgcHJvcGVydHlOYW1lcy5zaXplKCkpIHsKKwkJCQlzYi5hcHBlbmQoIiwiKTsKKwkJCX0KKwkJfQorCQlzYi5hcHBlbmQoIiBdIik7CisJCVN0cmluZyBqc29uID0gc2IudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGpzb247CisJfQorCisJZW51bSBIdHRwTWV0aG9kIHsKKwkJR0VULCBQVVQsIFBPU1QsIERFTEVURQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovTmVvNGpFZGdlLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9OZW80akVkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI3OGE5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovTmVvNGpFZGdlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ajsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuQWN0aW9uRW51bTsKKworcHVibGljIGNsYXNzIE5lbzRqRWRnZSB7CisKKwlwcml2YXRlIEdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZTsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKKwlwcml2YXRlIEFjdGlvbkVudW0gYWN0aW9uOworCisJcHVibGljIE5lbzRqRWRnZShHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcywgQWN0aW9uRW51bSBhY3Rpb25FbnVtKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZWRnZVR5cGUgPSBlZGdlVHlwZTsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb25FbnVtOworCX0KKworCXB1YmxpYyBHcmFwaEVkZ2VMYWJlbHMgZ2V0RWRnZVR5cGUoKSB7CisJCXJldHVybiBlZGdlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFZGdlVHlwZShHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUpIHsKKwkJdGhpcy5lZGdlVHlwZSA9IGVkZ2VUeXBlOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIEFjdGlvbkVudW0gZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihBY3Rpb25FbnVtIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIk5lbzRqRWRnZSBbZWRnZVR5cGU9IiArIGVkZ2VUeXBlICsgIiwgcHJvcGVydGllcz0iICsgcHJvcGVydGllcyArICIsIGFjdGlvbj0iICsgYWN0aW9uICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovTmVvNGpHcmFwaEJhdGNoQnVpbGRlci5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovTmVvNGpHcmFwaEJhdGNoQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMWZiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9OZW80akdyYXBoQmF0Y2hCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGo7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5BY3Rpb25FbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuUmVsYXRpb25FbmRQb2ludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIE5lbzRqR3JhcGhCYXRjaEJ1aWxkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5lbzRqR3JhcGhCYXRjaEJ1aWxkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBFaXRoZXI8QmF0Y2hCdWlsZGVyLCBOZW80ak9wZXJhdGlvblN0YXR1cz4gYnVpbGRCYXRjaEJ1aWxkZXJGcm9tVGFibGUoCisJCQlHcmFwaE5laWdoYm91clRhYmxlIGdyYXBoTmVpZ2hib3VyVGFibGUpIHsKKworCQlsb2dnZXIuZGVidWcoIlRoZSB0YWJsZSBzZW50IGluIG9yZGVyIHRvIGJ1aWxkIEJhdGNoQnVpbGRlciBpcyB7fSIsIGdyYXBoTmVpZ2hib3VyVGFibGUpOworCisJCUxpc3Q8R3JhcGhOb2RlPiBub2RlcyA9IGdyYXBoTmVpZ2hib3VyVGFibGUuZ2V0Tm9kZXMoKTsKKwkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuc2l6ZSgpID4gMCkgeworCQkJLy8gU3RyaW5nIHJlc291cmNlSWQgPSBmaW5kUmVzb3VyY2VEYXRhSWRGcm9tTm9kZXMobm9kZXMpOworCQkJLy8gaWYgKHJlc291cmNlSWQgPT0gbnVsbCB8fCByZXNvdXJjZUlkLmlzRW1wdHkoKSkgeworCQkJLy8gbG9nZ2VyLmVycm9yKCJDYW5ub3QgZmluZCByZXNvdXJjZSBpZCBpbiB0aGUgZ3JhcGggdGFibGUiKTsKKwkJCS8vIHJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQkvLyB9CisJCQlMaXN0PE5vZGVSZWxhdGlvbj4gZGlyZWN0ZWRFZGdlcyA9IGdyYXBoTmVpZ2hib3VyVGFibGUuZ2V0RGlyZWN0ZWRFZGdlcygpOworCisJCQlMaXN0PFJlbGF0aW9uRW5kUG9pbnQ+IHJlbGF0aW9uRW5kUG9pbnRzID0gbmV3IEFycmF5TGlzdDxSZWxhdGlvbkVuZFBvaW50Pihub2Rlcy5zaXplKCkpOworCQkJU2V0PEludGVnZXI+IG5vZGVzSW5SZWxhdGlvbnMgPSBmaW5kRGlzdGluY3ROb2Rlc0luZGV4KGRpcmVjdGVkRWRnZXMpOworCisJCQlidWlsZFJlbGF0aW9uRW5kUG9pbnRzKG5vZGVzLCBub2Rlc0luUmVsYXRpb25zLCByZWxhdGlvbkVuZFBvaW50cyk7CisKKwkJCUJhdGNoQnVpbGRlciBiYXRjaEJ1aWxkZXIgPSBCYXRjaEJ1aWxkZXIuZ2V0QnVpbGRlcigpOworCisJCQlmb3IgKEdyYXBoRWxlbWVudCBuZW80akVsZW1lbnQgOiBub2RlcykgeworCQkJCWlmIChuZW80akVsZW1lbnQuZ2V0QWN0aW9uKCkgIT0gQWN0aW9uRW51bS5EZWxldGUpIHsKKwkJCQkJbG9nZ2VyLmRlYnVnKCJHb2ludCB0byBhZGQgbm9kZSB7fSB0byBiYXRjaCBidWlsZGVyLiIsIG5lbzRqRWxlbWVudCk7CisJCQkJCWJhdGNoQnVpbGRlci5hZGQobmVvNGpFbGVtZW50KTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChkaXJlY3RlZEVkZ2VzICE9IG51bGwpIHsKKwkJCQlmb3IgKE5vZGVSZWxhdGlvbiBub2RlUmVsYXRpb24gOiBkaXJlY3RlZEVkZ2VzKSB7CisJCQkJCUdyYXBoUmVsYXRpb24gcmVsYXRpb24gPSBidWlsZE5lbzRqUmVsYXRpb24ocmVsYXRpb25FbmRQb2ludHMsIG5vZGVSZWxhdGlvbik7CisJCQkJCWxvZ2dlci5kZWJ1ZygiR29pbnQgdG8gYWRkIHJlbGF0aW9uIHt9IHRvIGNhdGNoIGJ1aWxkZXIuIiwgcmVsYXRpb24pOworCQkJCQliYXRjaEJ1aWxkZXIuYWRkKHJlbGF0aW9uKTsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoR3JhcGhFbGVtZW50IG5lbzRqRWxlbWVudCA6IG5vZGVzKSB7CisJCQkJaWYgKG5lbzRqRWxlbWVudC5nZXRBY3Rpb24oKSA9PSBBY3Rpb25FbnVtLkRlbGV0ZSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkdvaW50IHRvIGFkZCBub2RlIHt9IHRvIGJhdGNoIGJ1aWxkZXIuIiwgbmVvNGpFbGVtZW50KTsKKwkJCQkJYmF0Y2hCdWlsZGVyLmFkZChuZW80akVsZW1lbnQpOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGJhdGNoQnVpbGRlcik7CisKKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5lcnJvcigiTm8gbm9kZSB3YXMgc2VudCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHJlc291cmNlLiIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChOZW80ak9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVCk7CisJCX0KKwl9CisKKwlwcml2YXRlIFBhaXI8U3RyaW5nLCBTdHJpbmc+IGdldFVuaXF1ZUlkS2V5VmFsdWUoR3JhcGhOb2RlIG5lbzRqTm9kZSkgeworCisJCS8vIFN0cmluZyBsYWJlbCA9IG5lbzRqTm9kZS5nZXRMYWJlbCgpOworCQkvLyBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtID0gTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShsYWJlbCk7CisJCS8vCisJCXJldHVybiBQYWlyLmNyZWF0ZVBhaXIobmVvNGpOb2RlLmdldFVuaXF1ZUlkS2V5KCksIG5lbzRqTm9kZS5nZXRVbmlxdWVJZCgpLnRvU3RyaW5nKCkpOworCX0KKworCXByaXZhdGUgU2V0PEludGVnZXI+IGZpbmREaXN0aW5jdE5vZGVzSW5kZXgoTGlzdDxOb2RlUmVsYXRpb24+IGRpcmVjdGVkRWRnZXMpIHsKKworCQlIYXNoU2V0PEludGVnZXI+IG5vZGVzSW5kZXggPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworCisJCWlmIChkaXJlY3RlZEVkZ2VzICE9IG51bGwpIHsKKwkJCWZvciAoTm9kZVJlbGF0aW9uIG5vZGVSZWxhdGlvbiA6IGRpcmVjdGVkRWRnZXMpIHsKKwkJCQlub2Rlc0luZGV4LmFkZChub2RlUmVsYXRpb24uZ2V0RnJvbUluZGV4KCkpOworCQkJCW5vZGVzSW5kZXguYWRkKG5vZGVSZWxhdGlvbi5nZXRUb0luZGV4KCkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG5vZGVzSW5kZXg7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZmluZFJlc291cmNlRGF0YUlkRnJvbU5vZGVzKExpc3Q8R3JhcGhOb2RlPiBub2RlcykgeworCisJCWlmIChub2RlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoR3JhcGhOb2RlIG5lbzRqTm9kZSA6IG5vZGVzKSB7CisJCQkJU3RyaW5nIGxhYmVsID0gbmVvNGpOb2RlLmdldExhYmVsKCk7CisJCQkJaWYgKGxhYmVsLmVxdWFscyhOb2RlVHlwZUVudW0uUmVzb3VyY2UuZ2V0TmFtZSgpKSkgeworCQkJCQlyZXR1cm4gbmVvNGpOb2RlLmdldFVuaXF1ZUlkKCkudG9TdHJpbmcoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEdyYXBoUmVsYXRpb24gYnVpbGROZW80alJlbGF0aW9uKExpc3Q8UmVsYXRpb25FbmRQb2ludD4gcmVsYXRpb25FbmRQb2ludHMsIE5vZGVSZWxhdGlvbiBub2RlUmVsYXRpb24pIHsKKwkJR3JhcGhSZWxhdGlvbiByZWxhdGlvbiA9IG5ldyBHcmFwaFJlbGF0aW9uKCk7CisJCWludCBmcm9tSW5kZXggPSBub2RlUmVsYXRpb24uZ2V0RnJvbUluZGV4KCk7CisJCWludCB0b0luZGV4ID0gbm9kZVJlbGF0aW9uLmdldFRvSW5kZXgoKTsKKwkJTmVvNGpFZGdlIG5lbzRqRWRnZSA9IG5vZGVSZWxhdGlvbi5nZXRFZGdlKCk7CisJCXJlbGF0aW9uLnNldEZyb20ocmVsYXRpb25FbmRQb2ludHMuZ2V0KGZyb21JbmRleCkpOworCQlyZWxhdGlvbi5zZXRUbyhyZWxhdGlvbkVuZFBvaW50cy5nZXQodG9JbmRleCkpOworCQlyZWxhdGlvbi5zZXRUeXBlKG5lbzRqRWRnZS5nZXRFZGdlVHlwZSgpLmdldFByb3BlcnR5KCkpOworCisJCS8vIFRPRE86IGZpeCBpdCBhZnRlciBjaGFuZ2UKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcHMgPSBuZW80akVkZ2UuZ2V0UHJvcGVydGllcygpOworCQlpZiAoZWRnZVByb3BzICE9IG51bGwgJiYgZmFsc2UgPT0gZWRnZVByb3BzLmlzRW1wdHkoKSkgeworCQkJcmVsYXRpb24uYWRkUHJvcGVydGlzKGVkZ2VQcm9wcyk7CisJCX0KKworCQlyZWxhdGlvbi5zZXRBY3Rpb24obmVvNGpFZGdlLmdldEFjdGlvbigpKTsKKwkJcmV0dXJuIHJlbGF0aW9uOworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZFJlbGF0aW9uRW5kUG9pbnRzKExpc3Q8R3JhcGhOb2RlPiBub2RlcywgU2V0PEludGVnZXI+IG5vZGVzSW5SZWxhdGlvbnMsCisJCQlMaXN0PFJlbGF0aW9uRW5kUG9pbnQ+IHJlbGF0aW9uRW5kUG9pbnRzKSB7CisKKwkJaWYgKG5vZGVzSW5SZWxhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChJbnRlZ2VyIG5vZGVJbmRleCA6IG5vZGVzSW5SZWxhdGlvbnMpIHsKKworCQkJCUdyYXBoRWxlbWVudCBuZW80akVsZW1lbnQgPSBub2Rlcy5nZXQobm9kZUluZGV4KTsKKwkJCQlHcmFwaE5vZGUgbmVvNGpOb2RlID0gKEdyYXBoTm9kZSkgbmVvNGpFbGVtZW50OworCQkJCVN0cmluZyBsYWJlbCA9IG5lbzRqTm9kZS5nZXRMYWJlbCgpOworCQkJCVBhaXI8U3RyaW5nLCBTdHJpbmc+IHVuaXF1ZUtleVZhbHVlID0gZ2V0VW5pcXVlSWRLZXlWYWx1ZShuZW80ak5vZGUpOworCisJCQkJUmVsYXRpb25FbmRQb2ludCBlbmRQb2ludCA9IG5ldyBSZWxhdGlvbkVuZFBvaW50KE5vZGVUeXBlRW51bS5nZXRCeU5hbWUobGFiZWwpLCB1bmlxdWVLZXlWYWx1ZS5nZXRLZXkoKSwKKwkJCQkJCXVuaXF1ZUtleVZhbHVlLmdldFZhbHVlKCkpOworCQkJCXJlbGF0aW9uRW5kUG9pbnRzLmFkZChub2RlSW5kZXgsIGVuZFBvaW50KTsKKworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFBhaXI8SywgVj4geworCisJCXByaXZhdGUgZmluYWwgSyBrZXk7CisJCXByaXZhdGUgZmluYWwgViB2YWx1ZTsKKworCQlwdWJsaWMgc3RhdGljIDxLLCBWPiBQYWlyPEssIFY+IGNyZWF0ZVBhaXIoSyBrZXksIFYgdmFsdWUpIHsKKwkJCXJldHVybiBuZXcgUGFpcjxLLCBWPihrZXksIHZhbHVlKTsKKwkJfQorCisJCXB1YmxpYyBQYWlyKEsga2V5LCBWIHZhbHVlKSB7CisJCQl0aGlzLmtleSA9IGtleTsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCisJCXB1YmxpYyBLIGdldEtleSgpIHsKKwkJCXJldHVybiBrZXk7CisJCX0KKworCQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovTmVvNGpPcGVyYXRpb25TdGF0dXMuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL05lbzRqT3BlcmF0aW9uU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0NDQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL05lbzRqT3BlcmF0aW9uU3RhdHVzLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ajsKKworcHVibGljIGVudW0gTmVvNGpPcGVyYXRpb25TdGF0dXMgeworCisJT0ssIE5PVF9DT05ORUNURUQsIE5PVF9BVVRIT1JJWkVELCBIVFRQX1BST1RPQ09MX0VSUk9SLCBEQl9OT1RfQVZBSUxBQkxFLCBEQl9SRUFEX09OTFksIEJBRF9SRVFVRVNULCBMRUdBQ1lfSU5ERVhfRVJST1IsIFNDSEVNQV9FUlJPUiwgVFJBTlNBQ1RJT05fRVJST1IsIEVYRUNVVElPTl9GQUlMRUQsIEVOVElUWV9BTFJFQURZX0VYSVNULAorCisJV1JPTkdfSU5QVVQsIEdFTkVSQUxfRVJST1IsIE5PVF9TVVBQT1JURUQsIE5PVF9GT1VORDsKKworCXByaXZhdGUgU3RyaW5nIG9yaWdpbkVycm9yOworCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisJcHJpdmF0ZSBTdHJpbmcgaGVscEVycm9yTXNnOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BID0gIk5BIjsKKworCU5lbzRqT3BlcmF0aW9uU3RhdHVzKCkgeworCQlvcmlnaW5FcnJvciA9IE5BOworCQltZXNzYWdlID0gTkE7CisJCWhlbHBFcnJvck1zZyA9IE5BOworCX0KKworCXB1YmxpYyBOZW80ak9wZXJhdGlvblN0YXR1cyBzZXRPcmlnaW5FcnJvcihTdHJpbmcgb3JpZ2luRXJyb3IpIHsKKwkJdGhpcy5vcmlnaW5FcnJvciA9IG9yaWdpbkVycm9yOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgTmVvNGpPcGVyYXRpb25TdGF0dXMgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQlpZiAobWVzc2FnZSAhPSBudWxsICYmICFtZXNzYWdlLmlzRW1wdHkoKSkgeworCQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgTmVvNGpPcGVyYXRpb25TdGF0dXMgc2V0SGVscEVycm9yTXNnKFN0cmluZyBoZWxwRXJyb3JNc2cpIHsKKwkJdGhpcy5oZWxwRXJyb3JNc2cgPSBoZWxwRXJyb3JNc2c7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luRXJyb3IoKSB7CisJCXJldHVybiBvcmlnaW5FcnJvcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisJCXJldHVybiBtZXNzYWdlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SGVscEVycm9yTXNnKCkgeworCQlyZXR1cm4gaGVscEVycm9yTXNnOworCX0KKworCXB1YmxpYyBTdHJpbmcgcHJpbnRFcnJvcigpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXNiLmFwcGVuZCgiWyIpLmFwcGVuZCh0b1N0cmluZygpKS5hcHBlbmQoIi0iKS5hcHBlbmQob3JpZ2luRXJyb3IpLmFwcGVuZCgiLSIpLmFwcGVuZChoZWxwRXJyb3JNc2cpLmFwcGVuZCgiLSIpCisJCQkJLmFwcGVuZChtZXNzYWdlKS5hcHBlbmQoIl0iKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9Ob2RlUmVsYXRpb24uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL05vZGVSZWxhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDAyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9Ob2RlUmVsYXRpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqOworCitwdWJsaWMgY2xhc3MgTm9kZVJlbGF0aW9uIHsKKworCXByaXZhdGUgaW50IGZyb21JbmRleDsKKwlwcml2YXRlIGludCB0b0luZGV4OworCXByaXZhdGUgTmVvNGpFZGdlIGVkZ2U7CisKKwlwdWJsaWMgTm9kZVJlbGF0aW9uKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBOZW80akVkZ2UgZWRnZSkgeworCQlzdXBlcigpOworCQl0aGlzLmZyb21JbmRleCA9IGZyb21JbmRleDsKKwkJdGhpcy50b0luZGV4ID0gdG9JbmRleDsKKwkJdGhpcy5lZGdlID0gZWRnZTsKKwl9CisKKwlwdWJsaWMgaW50IGdldEZyb21JbmRleCgpIHsKKwkJcmV0dXJuIGZyb21JbmRleDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGcm9tSW5kZXgoaW50IGZyb21JbmRleCkgeworCQl0aGlzLmZyb21JbmRleCA9IGZyb21JbmRleDsKKwl9CisKKwlwdWJsaWMgaW50IGdldFRvSW5kZXgoKSB7CisJCXJldHVybiB0b0luZGV4OworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvSW5kZXgoaW50IHRvSW5kZXgpIHsKKwkJdGhpcy50b0luZGV4ID0gdG9JbmRleDsKKwl9CisKKwlwdWJsaWMgTmVvNGpFZGdlIGdldEVkZ2UoKSB7CisJCXJldHVybiBlZGdlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVkZ2UoTmVvNGpFZGdlIGVkZ2UpIHsKKwkJdGhpcy5lZGdlID0gZWRnZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIk5vZGVSZWxhdGlvbiBbZnJvbUluZGV4PSIgKyBmcm9tSW5kZXggKyAiLCB0b0luZGV4PSIgKyB0b0luZGV4ICsgIiwgZWRnZT0iICsgZWRnZSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL2ZpbHRlcnMvTWF0Y2hGaWx0ZXIuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL2ZpbHRlcnMvTWF0Y2hGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU5M2MxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovZmlsdGVycy9NYXRjaEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouZmlsdGVyczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBNYXRjaEZpbHRlciB7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvTWF0Y2hQcm9wZXJ0aWVzOworCisJcHVibGljIE1hdGNoRmlsdGVyKCkgeworCQl0b01hdGNoUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCX0KKworCXB1YmxpYyBNYXRjaEZpbHRlcihNYXA8U3RyaW5nLCBPYmplY3Q+IHRvTWF0Y2hQcm9wZXJ0aWVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudG9NYXRjaFByb3BlcnRpZXMgPSB0b01hdGNoUHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gdG9NYXRjaFByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy50b01hdGNoUHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIE1hdGNoRmlsdGVyIGFkZFRvTWF0Y2goU3RyaW5nIHByb3BOYW1lLCBPYmplY3QgdmFsdWUpIHsKKwkJdG9NYXRjaFByb3BlcnRpZXMucHV0KHByb3BOYW1lLCB2YWx1ZSk7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovZmlsdGVycy9SZWN1cnNpdmVCeVJlbGF0aW9uRmlsdGVyLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9maWx0ZXJzL1JlY3Vyc2l2ZUJ5UmVsYXRpb25GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgwNzdkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovZmlsdGVycy9SZWN1cnNpdmVCeVJlbGF0aW9uRmlsdGVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5maWx0ZXJzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgUmVjdXJzaXZlQnlSZWxhdGlvbkZpbHRlciBleHRlbmRzIFJlY3Vyc2l2ZUZpbHRlciB7CisKKwlwcml2YXRlIEdyYXBoTm9kZSBub2RlOworCXByaXZhdGUgU3RyaW5nIHJlbGF0aW9uVHlwZTsKKworCXB1YmxpYyBSZWN1cnNpdmVCeVJlbGF0aW9uRmlsdGVyKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZWN1cnNpdmVCeVJlbGF0aW9uRmlsdGVyKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgR3JhcGhOb2RlIG5vZGUpIHsKKwkJc3VwZXIobm9kZVR5cGUpOworCQl0aGlzLm5vZGUgPSBub2RlOworCX0KKworCXB1YmxpYyBSZWN1cnNpdmVCeVJlbGF0aW9uRmlsdGVyKE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCQlzdXBlcihub2RlVHlwZSk7CisJfQorCisJcHVibGljIFJlY3Vyc2l2ZUJ5UmVsYXRpb25GaWx0ZXIoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBHcmFwaE5vZGUgbm9kZSwgU3RyaW5nIHJlbGF0aW9uVHlwZSkgeworCQlzdXBlcihub2RlVHlwZSk7CisJCXRoaXMubm9kZSA9IG5vZGU7CisJCXRoaXMucmVsYXRpb25UeXBlID0gcmVsYXRpb25UeXBlOworCX0KKworCXB1YmxpYyBSZWN1cnNpdmVCeVJlbGF0aW9uRmlsdGVyIGFkZE5vZGUoR3JhcGhOb2RlIG5vZGUpIHsKKwkJdGhpcy5ub2RlID0gbm9kZTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFJlY3Vyc2l2ZUJ5UmVsYXRpb25GaWx0ZXIgYWRkUmVsYXRpb24oU3RyaW5nIHJlbGF0aW9uVHlwZSkgeworCQl0aGlzLnJlbGF0aW9uVHlwZSA9IHJlbGF0aW9uVHlwZTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIEdyYXBoTm9kZSBnZXROb2RlKCkgeworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb2RlKEdyYXBoTm9kZSBub2RlKSB7CisJCXRoaXMubm9kZSA9IG5vZGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZWxhdGlvblR5cGUoKSB7CisJCXJldHVybiByZWxhdGlvblR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVsYXRpb25UeXBlKFN0cmluZyByZWxhdGlvblR5cGUpIHsKKwkJdGhpcy5yZWxhdGlvblR5cGUgPSByZWxhdGlvblR5cGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZWN1cnNpdmVCeVJlbGF0aW9uRmlsdGVyIFtub2RlPSIgKyBub2RlICsgIiwgcmVsYXRpb25UeXBlPSIgKyByZWxhdGlvblR5cGUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9uZW80ai9maWx0ZXJzL1JlY3Vyc2l2ZUZpbHRlci5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovZmlsdGVycy9SZWN1cnNpdmVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTc4NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovZmlsdGVycy9SZWN1cnNpdmVGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLmZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFJlY3Vyc2l2ZUZpbHRlciBleHRlbmRzIE1hdGNoRmlsdGVyIHsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNoaWxkUmVsYXRpb25UeXBlczsKKwlOb2RlVHlwZUVudW0gbm9kZVR5cGU7CisKKwlwdWJsaWMgUmVjdXJzaXZlRmlsdGVyKCkgeworCQljaGlsZFJlbGF0aW9uVHlwZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwl9CisKKwlwdWJsaWMgUmVjdXJzaXZlRmlsdGVyKE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCQljaGlsZFJlbGF0aW9uVHlwZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJdGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlOworCX0KKworCXB1YmxpYyBSZWN1cnNpdmVGaWx0ZXIgYWRkQ2hpbGRSZWxhdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJY2hpbGRSZWxhdGlvblR5cGVzLmFkZCh0eXBlKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDaGlsZFJlbGF0aW9uVHlwZXMoKSB7CisJCXJldHVybiBjaGlsZFJlbGF0aW9uVHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2hpbGRSZWxhdGlvblR5cGVzKExpc3Q8U3RyaW5nPiBjaGlsZFJlbGF0aW9uVHlwZXMpIHsKKwkJdGhpcy5jaGlsZFJlbGF0aW9uVHlwZXMgPSBjaGlsZFJlbGF0aW9uVHlwZXM7CisJfQorCisJcHVibGljIE5vZGVUeXBlRW51bSBnZXROb2RlVHlwZSgpIHsKKwkJcmV0dXJuIG5vZGVUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGVUeXBlKE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZWN1cnNpdmVGaWx0ZXIgW2NoaWxkUmVsYXRpb25UeXBlcz0iICsgY2hpbGRSZWxhdGlvblR5cGVzICsgIiwgbm9kZVR5cGU9IiArIG5vZGVUeXBlICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vbmVvNGovZmlsdGVycy9VcGRhdGVGaWx0ZXIuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL2ZpbHRlcnMvVXBkYXRlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiZmRlYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL25lbzRqL2ZpbHRlcnMvVXBkYXRlRmlsdGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5maWx0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFVwZGF0ZUZpbHRlciBleHRlbmRzIE1hdGNoRmlsdGVyIHsKKworCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0b1VwZGF0ZTsKKworCXB1YmxpYyBVcGRhdGVGaWx0ZXIoTWFwPFN0cmluZywgT2JqZWN0PiB0b1VwZGF0ZSkgeworCQlzdXBlcigpOworCQl0aGlzLnRvVXBkYXRlID0gdG9VcGRhdGU7CisJfQorCisJcHVibGljIFVwZGF0ZUZpbHRlcigpIHsKKwkJc3VwZXIoKTsKKwkJdG9VcGRhdGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwl9CisKKwlwdWJsaWMgVXBkYXRlRmlsdGVyKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9NYXRjaCwgTWFwPFN0cmluZywgT2JqZWN0PiB0b1VwZGF0ZSkgeworCQlzdXBlcih0b01hdGNoKTsKKwkJdGhpcy50b1VwZGF0ZSA9IHRvVXBkYXRlOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRvVXBkYXRlKCkgeworCQlyZXR1cm4gdG9VcGRhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9VcGRhdGUoTWFwPFN0cmluZywgT2JqZWN0PiB0b1VwZGF0ZSkgeworCQl0aGlzLnRvVXBkYXRlID0gdG9VcGRhdGU7CisJfQorCisJcHVibGljIHZvaWQgYWRkVG9VcGRhdGUoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKKwkJdG9VcGRhdGUucHV0KHByb3BlcnR5LCB2YWx1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vcmVzdC9IdHRwUmVzdENsaWVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vcmVzdC9IdHRwUmVzdENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMDkxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9yZXN0L0h0dHBSZXN0Q2xpZW50LmphdmEKQEAgLTAsMCArMSw0MDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ucmVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5jb25maWcuUmVxdWVzdENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuQ2xvc2VhYmxlSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5TdHJpbmdFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50Lkh0dHBDbGllbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmFwaS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnJlc3QuYXBpLlJlc3RSZXNwb25zZUFzQnl0ZUFycmF5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBIdHRwUmVzdENsaWVudCB7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFID0gMTA7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX1JFQURfVElNRU9VVF9JTl9TRUMgPSAzMDsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUID0gMzA7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX1NPQ0tFVF9USU1FT1VUID0gMzA7CisKKwlwcml2YXRlIENsb3NlYWJsZUh0dHBDbGllbnQgaHR0cENsaWVudCA9IG51bGw7CisKKwlwcml2YXRlIFBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgY20gPSBudWxsOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEh0dHBSZXN0Q2xpZW50LmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZSBlcnJvclJlc3RSZXNwb25zZSA9IG5ldyBSZXN0UmVzcG9uc2UoImludGVybmFsIHNlcnZlciBlcnJvciIsIG51bGwsIDUwMCk7CisJcHJpdmF0ZSBSZXN0UmVzcG9uc2VBc0J5dGVBcnJheSBlcnJvclJlc3RSZXNwb25zZUFzQnl0ZUFycmF5ID0gbmV3IFJlc3RSZXNwb25zZUFzQnl0ZUFycmF5KAorCQkJImludGVybmFsIHNlcnZlciBlcnJvciIuZ2V0Qnl0ZXMoKSwgbnVsbCwgNTAwKTsKKworCWJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLy8gcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgeworCS8vIHRyeSB7CisJLy8gUmVzdENsaWVudFNlcnZpY2UgcmVzdENsaWVudFNlcnZpY2UgPQorCS8vIFJlc3RDbGllbnRTZXJ2aWNlRmFjdG9yeS5jcmVhdGVIdHRwUmVzdENsaWVudFNlcnZpY2UobmV3CisJLy8gUmVzdENvbmZpZ3VyYXRpb25JbmZvKCkpOworCS8vCisJLy8gU3RyaW5nIHVyaUNyZWF0ZUNlbGwgPQorCS8vICJodHRwOi8vMTcyLjIwLjM3LjI0NTo5MDgyL3RvcG9sb2d5L21hbmFnZW1lbnQvY2VsbC91cGRhdGUiOworCS8vIFN0cmluZyBqc29uU3RyID0gIiB7IFwiY2VsbE5hbWVcIiA6IFwibXljZWxsMTE4XCIgfSI7CisJLy8gU3RyaW5nIGpzb25VcGRhdGVTdHIgPQorCS8vICIgeyBcImNlbGxOYW1lXCIgOiBcIm15Y2VsbDExOFwiLCBcImhvc3ROYW1lXCIgOiBcIm15aG9zdDMzM1wiIH0iOworCS8vCisJLy8KKwkvLyAvLyBqc29uU3RyID0gIiA8bm90ZT5kZmQ8L25vdGU+IjsKKwkvLworCS8vIFByb3BlcnRpZXMgaGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJLy8gaGVhZGVycy5wdXQoIkNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIik7CisJLy8gaGVhZGVycy5wdXQoIkFjY2VwdCIsICIqLyoiKTsKKwkvLworCS8vIC8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSByZXN0Q2xpZW50U2VydmljZS5kb1BPU1QodXJpQ3JlYXRlQ2VsbCwKKwkvLyBoZWFkZXJzLCBqc29uU3RyKTsKKwkvLworCS8vIFJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSByZXN0Q2xpZW50U2VydmljZS5kb1BVVCh1cmlDcmVhdGVDZWxsLAorCS8vIGhlYWRlcnMsIGpzb25VcGRhdGVTdHIpOworCS8vCisJLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc3RSZXNwb25zZSk7CisJLy8KKwkvLworCS8vIH0gY2F0Y2ggKFJlc3RDbGllbnRTZXJ2aWNlRXhlcHRpb24gZSkgeworCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCS8vIH0KKwkvLworCS8vIH0KKworCXB1YmxpYyBIdHRwUmVzdENsaWVudCgpIHsKKwkJc3VwZXIoKTsKKwkJaXNJbml0aWFsaXplZCA9IGluaXQobmV3IFJlc3RDb25maWd1cmF0aW9uSW5mbygpKTsKKwl9CisKKwlwdWJsaWMgSHR0cFJlc3RDbGllbnQoUmVzdENvbmZpZ3VyYXRpb25JbmZvIHJlc3RDb25maWd1cmF0aW9uSW5mbykgeworCQlzdXBlcigpOworCQlpc0luaXRpYWxpemVkID0gaW5pdChyZXN0Q29uZmlndXJhdGlvbkluZm8pOworCX0KKworCXB1YmxpYyBib29sZWFuIGluaXQoUmVzdENvbmZpZ3VyYXRpb25JbmZvIHJlc3RDb25maWd1cmF0aW9uSW5mbykgeworCisJCWxvZ2dlci5kZWJ1ZygiY3JlYXRlIEh0dHBSZXN0Q2xpZW50OiByZXN0Q29uZmlndXJhdGlvbkluZm89e30iLCByZXN0Q29uZmlndXJhdGlvbkluZm8pOworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQkvLyB0cnkgeworCQljcmVhdGVIdHRwQ2xpZW50KHJlc3RDb25maWd1cmF0aW9uSW5mbyk7CisJCXJlc3VsdCA9IHRydWU7CisJCS8vIH0gY2F0Y2ggKEtleU1hbmFnZW1lbnRFeGNlcHRpb24gZSkgeworCQkvLyBTdHJpbmcgbXNnID0gIkZhaWxlZCBjcmVhdGluZyBjbGllbnQgY29uZmlnIGZvciByZXN0LiAiCisJCS8vICsgZS5nZXRNZXNzYWdlKCk7CisJCS8vIGxvZ2dlci5kZWJ1Zyhtc2csIGUpOworCQkvLyAvL1RPRE86IGxvZy4gZXJyb3IKKwkJLy8gfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKwkJLy8gU3RyaW5nIG1zZyA9ICJGYWlsZWQgY3JlYXRpbmcgY2xpZW50IGNvbmZpZyBmb3IgcmVzdC4gIgorCQkvLyArIGUuZ2V0TWVzc2FnZSgpOworCQkvLyBsb2dnZXIuZGVidWcobXNnLCBlKTsKKwkJLy8gLy9UT0RPOiBsb2cuIGVycm9yCisJCS8vIH0KKworCQlsb2dnZXIuZGVidWcoIkZpbmlzaCBjcmVhdGluZyBIdHRwUmVzdENsaWVudC4gUmVzdWx0IGlzIHt9IiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisJCXRyeSB7CisJCQlodHRwQ2xpZW50LmNsb3NlKCk7CisJCQlsb2dnZXIuZGVidWcoIkh0dHAgY2xpZW50IGNsb3NlZCIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLnRyYWNlKCJGYWlsZWQgdG8gY2xvc2UgaHR0cCBjbGllbnQiLCBlKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUh0dHBDbGllbnQoUmVzdENvbmZpZ3VyYXRpb25JbmZvIHJlc3RDb25maWd1cmF0aW9uSW5mbykgeworCQkvLyB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKworCQlQb29saW5nSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5NYW5hZ2VyID0gbmV3IFBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIoKTsKKworCQlpbnQgY29ublBvb2xTaXplID0gZ2V0Q29ubmVjdGlvblBvb2xTaXplKHJlc3RDb25maWd1cmF0aW9uSW5mbyk7CisJCWNvbm5NYW5hZ2VyLnNldE1heFRvdGFsKGNvbm5Qb29sU2l6ZSk7CisJCWNvbm5NYW5hZ2VyLnNldERlZmF1bHRNYXhQZXJSb3V0ZSgxMCk7CisJCWNvbm5NYW5hZ2VyLnNldFZhbGlkYXRlQWZ0ZXJJbmFjdGl2aXR5KDE1MDAwKTsKKworCQkvLyBDcmVhdGUgY29tbW9uIGRlZmF1bHQgY29uZmlndXJhdGlvbgorCQlpbnQgc29ja2V0VGltZW91dCA9IGdldFRpbWVvdXQocmVzdENvbmZpZ3VyYXRpb25JbmZvLmdldFNvY2tldFRpbWVvdXRJblNlYygpLCBERUZBVUxUX1NPQ0tFVF9USU1FT1VUKTsKKworCQlpbnQgY29ubmVjdFRpbWVvdXRJblNlYyA9IGdldFRpbWVvdXQocmVzdENvbmZpZ3VyYXRpb25JbmZvLmdldENvbm5lY3RUaW1lb3V0SW5TZWMoKSwgREVGQVVMVF9DT05ORUNUX1RJTUVPVVQpOworCisJCWludCByZWFkVGltZU91dCA9IGdldFRpbWVvdXQocmVzdENvbmZpZ3VyYXRpb25JbmZvLmdldFJlYWRUaW1lb3V0SW5TZWMoKSwgREVGQVVMVF9SRUFEX1RJTUVPVVRfSU5fU0VDKTsKKworCQlSZXF1ZXN0Q29uZmlnIGNsaWVudENvbmZpZyA9IFJlcXVlc3RDb25maWcuY3VzdG9tKCkuc2V0Q29ubmVjdFRpbWVvdXQoY29ubmVjdFRpbWVvdXRJblNlYykKKwkJCQkuc2V0U29ja2V0VGltZW91dChzb2NrZXRUaW1lb3V0KS5zZXRDb25uZWN0aW9uUmVxdWVzdFRpbWVvdXQocmVhZFRpbWVPdXQpLmJ1aWxkKCk7CisKKwkJdGhpcy5jbSA9IGNvbm5NYW5hZ2VyOworCisJCXRoaXMuaHR0cENsaWVudCA9IEh0dHBDbGllbnRzLmN1c3RvbSgpLnNldERlZmF1bHRSZXF1ZXN0Q29uZmlnKGNsaWVudENvbmZpZykuc2V0Q29ubmVjdGlvbk1hbmFnZXIoY29ubk1hbmFnZXIpCisJCQkJLmJ1aWxkKCk7CisKKwl9CisKKwlwcml2YXRlIGludCBnZXRDb25uZWN0aW9uUG9vbFNpemUoUmVzdENvbmZpZ3VyYXRpb25JbmZvIHJlc3RDb25maWd1cmF0aW9uSW5mbykgeworCQlJbnRlZ2VyIGNvbm5Qb29sU2l6ZU9iaiA9IHJlc3RDb25maWd1cmF0aW9uSW5mby5nZXRDb25uZWN0aW9uUG9vbFNpemUoKTsKKwkJaW50IGNvbm5Qb29sU2l6ZSA9IERFRkFVTFRfQ09OTkVDVElPTl9QT09MX1NJWkU7CisJCWlmIChjb25uUG9vbFNpemVPYmogIT0gbnVsbCkgeworCQkJY29ublBvb2xTaXplID0gY29ublBvb2xTaXplT2JqLmludFZhbHVlKCk7CisJCQlpZiAoY29ublBvb2xTaXplIDw9IDApIHsKKwkJCQljb25uUG9vbFNpemUgPSBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFOworCQkJfQorCQl9CisJCXJldHVybiBjb25uUG9vbFNpemU7CisJfQorCisJcHJpdmF0ZSBpbnQgZ2V0VGltZW91dChJbnRlZ2VyIHZhbHVlLCBJbnRlZ2VyIGRlZmF1bHRWYWx1ZSkgeworCisJCWludCBkZWZhdWx0VGltZW91dCA9IGRlZmF1bHRWYWx1ZSAhPSBudWxsID8gZGVmYXVsdFZhbHVlLmludFZhbHVlKCkgKiAxMDAwIDogMDsKKworCQlpbnQgdGltZW91dCA9IGRlZmF1bHRUaW1lb3V0OworCisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQl0aW1lb3V0ID0gZGVmYXVsdFZhbHVlLmludFZhbHVlKCkgKiAxMDAwOworCQkJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkJCXRpbWVvdXQgPSBkZWZhdWx0VGltZW91dDsKKwkJCX0KKwkJfQorCisJCXJldHVybiB0aW1lb3V0OworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIFJTLUdFVCB0byBwZXJmb3JtIEZJTkQuCisJICogCisJICogQHBhcmFtIGhlYWRlclBhcmFtZXRlcktleQorCSAqICAgICAgICAgICAgU3RyaW5nCisJICogQHBhcmFtIGhlYWRlclBhcmFtZXRlclZhbHVlCisJICogICAgICAgICAgICBTdHJpbmcKKwkgKiBAcmV0dXJuIFN0cmluZworCSAqLworCXB1YmxpYyBSZXN0UmVzcG9uc2UgZG9HRVQoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzKSB7CisKKwkJbG9nZ2VyLmRlYnVnKCJCZWZvcmUgZXhlY3V0aW5nIHVyaSB7fS4gaGVhZGVycyA9IHt9IiwgdXJpLCBoZWFkZXJzKTsKKworCQlIdHRwR2V0IGh0dHBHZXQgPSBuZXcgSHR0cEdldCh1cmkpOworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IGV4ZWN1dGUoaHR0cEdldCwgaGVhZGVycyk7CisKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2UgZG9QVVQoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzLCBTdHJpbmcgYm9keSkgeworCisJCWxvZ2dlci5kZWJ1ZygiQmVmb3JlIGV4ZWN1dGluZyB1cmkge30uIGhlYWRlcnMgPSB7fS4gYm9keSA9ICIsIHVyaSwgaGVhZGVycywgYm9keSk7CisKKwkJSHR0cFB1dCBodHRwUHV0ID0gbmV3IEh0dHBQdXQodXJpKTsKKwkJU3RyaW5nRW50aXR5IGRhdGEgPSBuZXcgU3RyaW5nRW50aXR5KGJvZHksIENvbnRlbnRUeXBlLkFQUExJQ0FUSU9OX0pTT04pOworCQlodHRwUHV0LnNldEVudGl0eShkYXRhKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gZXhlY3V0ZShodHRwUHV0LCBoZWFkZXJzKTsKKworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHVibGljIFJlc3RSZXNwb25zZSBkb1BPU1QoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzLCBTdHJpbmcgYm9keSkgeworCisJCWxvZ2dlci5kZWJ1ZygiQmVmb3JlIGV4ZWN1dGluZyB1cmkge30uIGhlYWRlcnMgPSB7fS4gYm9keSA9IHt9IiwgdXJpLCBoZWFkZXJzLCBib2R5KTsKKworCQlIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdCh1cmkpOworCQlTdHJpbmdFbnRpdHkgZGF0YSA9IG5ldyBTdHJpbmdFbnRpdHkoYm9keSwgQ29udGVudFR5cGUuQVBQTElDQVRJT05fSlNPTik7CisJCWh0dHBQb3N0LnNldEVudGl0eShkYXRhKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gZXhlY3V0ZShodHRwUG9zdCwgaGVhZGVycyk7CisKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2VBc0J5dGVBcnJheSBkb0dldEFzQnl0ZUFycmF5KFN0cmluZyB1cmksIFByb3BlcnRpZXMgaGVhZGVycykgeworCisJCWxvZ2dlci5kZWJ1ZygiQmVmb3JlIGV4ZWN1dGluZyB1cmkge30uIGhlYWRlcnMgPSB7fS4iLCB1cmksIGhlYWRlcnMpOworCisJCUh0dHBHZXQgaHR0cEdldCA9IG5ldyBIdHRwR2V0KHVyaSk7CisKKwkJUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXkgcmVzcG9uc2UgPSBleGVjdXRlQW5kUmV0dXJuQnl0ZUFycmF5KGh0dHBHZXQsIGhlYWRlcnMpOworCisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkSGVhZGVyc1RvUmVxdWVzdChIdHRwUmVxdWVzdEJhc2UgaHR0cFJlcXVlc3RCYXNlLCBQcm9wZXJ0aWVzIGhlYWRlcnMpIHsKKworCQlpZiAoaGVhZGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQkJCWh0dHBSZXF1ZXN0QmFzZS5hZGRIZWFkZXIoZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSwgZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgZXhlY3V0ZShIdHRwUmVxdWVzdEJhc2UgaHR0cFJlcXVlc3RCYXNlLCBQcm9wZXJ0aWVzIGhlYWRlcnMpIHsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gbnVsbDsKKworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgaHR0cFJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCisJCQlhZGRIZWFkZXJzVG9SZXF1ZXN0KGh0dHBSZXF1ZXN0QmFzZSwgaGVhZGVycyk7CisKKwkJCWh0dHBSZXNwb25zZSA9IHRoaXMuaHR0cENsaWVudC5leGVjdXRlKGh0dHBSZXF1ZXN0QmFzZSk7CisKKwkJCXJlc3RSZXNwb25zZSA9IGJ1aWxkUmVzdFJlc3BvbnNlRnJvbVJlc3VsdChodHRwUmVzcG9uc2UpOworCisJCQlsb2dnZXIuZGVidWcoIkFmdGVyIGV4ZWN1dGluZyB1cmkge30uIHJlc3BvbnNlID0ge30uIiwgaHR0cFJlcXVlc3RCYXNlLmdldFVSSSgpLnRvU3RyaW5nKCksIHJlc3RSZXNwb25zZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCWh0dHBSZXF1ZXN0QmFzZS5hYm9ydCgpOworCisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiRmFpbGVkIGV4ZWN1dGluZyBodHRwIHJlcXVlc3QgIiArIGh0dHBSZXF1ZXN0QmFzZS5nZXRVUkkoKS50b1N0cmluZygpICsgIigiCisJCQkJCSsgaHR0cFJlcXVlc3RCYXNlLmdldE1ldGhvZCgpICsgIikiOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJFeGVjdXRlUmVzdFJlcXVlc3QiLCBkZXNjcmlwdGlvbiwKKwkJCQkJRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXN0UmVzcG9uc2UgPSBlcnJvclJlc3RSZXNwb25zZTsKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIGVuc3VyZSB0aGUgY29ubmVjdGlvbiBnZXRzIHJlbGVhc2VkIHRvIHRoZSBtYW5hZ2VyCisJCQlyZWxlYXNlUmVzb3VyY2UoaHR0cFJlc3BvbnNlKTsKKwkJfQorCisJCXJldHVybiByZXN0UmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBSZXN0UmVzcG9uc2UgYnVpbGRSZXN0UmVzcG9uc2VGcm9tUmVzdWx0KENsb3NlYWJsZUh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJaW50IHN0YXR1c0NvZGUgPSBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJU3RyaW5nIHN0YXR1c0Rlc2MgPSBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFJlYXNvblBocmFzZSgpOworCisJCUh0dHBFbnRpdHkgZW50aXR5ID0gaHR0cFJlc3BvbnNlLmdldEVudGl0eSgpOworCQlTdHJpbmcgcmVzcG9uc2UgPSBudWxsOworCQlpZiAoZW50aXR5ICE9IG51bGwpIHsKKwkJCXJlc3BvbnNlID0gRW50aXR5VXRpbHMudG9TdHJpbmcoZW50aXR5KTsKKwkJfQorCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBuZXcgUmVzdFJlc3BvbnNlKHJlc3BvbnNlLCBzdGF0dXNEZXNjLCBzdGF0dXNDb2RlKTsKKworCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCX0KKworCXByaXZhdGUgUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXkgYnVpbGRSZXN0UmVzcG9uc2VCeXRlQXJyYXlGcm9tUmVzdWx0KENsb3NlYWJsZUh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCisJCWludCBzdGF0dXNDb2RlID0gaHR0cFJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCVN0cmluZyBzdGF0dXNEZXNjID0gaHR0cFJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRSZWFzb25QaHJhc2UoKTsKKworCQlIdHRwRW50aXR5IGVudGl0eSA9IGh0dHBSZXNwb25zZS5nZXRFbnRpdHkoKTsKKworCQlieXRlW10gcmVzcG9uc2UgPSBudWxsOworCQlpZiAoZW50aXR5ICE9IG51bGwpIHsKKwkJCUlucHV0U3RyZWFtIGNvbnRlbnQgPSBlbnRpdHkuZ2V0Q29udGVudCgpOworCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgeworCQkJCXJlc3BvbnNlID0gSU9VdGlscy50b0J5dGVBcnJheShjb250ZW50KTsKKwkJCX0KKwkJfQorCisJCVJlc3RSZXNwb25zZUFzQnl0ZUFycmF5IHJlc3RSZXNwb25zZSA9IG5ldyBSZXN0UmVzcG9uc2VBc0J5dGVBcnJheShyZXNwb25zZSwgc3RhdHVzRGVzYywgc3RhdHVzQ29kZSk7CisKKwkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZUFzQnl0ZUFycmF5IGV4ZWN1dGVBbmRSZXR1cm5CeXRlQXJyYXkoSHR0cFJlcXVlc3RCYXNlIGh0dHBSZXF1ZXN0QmFzZSwgUHJvcGVydGllcyBoZWFkZXJzKSB7CisKKwkJUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXkgcmVzdFJlc3BvbnNlID0gbnVsbDsKKworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgaHR0cFJlc3BvbnNlID0gbnVsbDsKKworCQl0cnkgeworCisJCQlhZGRIZWFkZXJzVG9SZXF1ZXN0KGh0dHBSZXF1ZXN0QmFzZSwgaGVhZGVycyk7CisKKwkJCWh0dHBSZXNwb25zZSA9IHRoaXMuaHR0cENsaWVudC5leGVjdXRlKGh0dHBSZXF1ZXN0QmFzZSk7CisKKwkJCXJlc3RSZXNwb25zZSA9IGJ1aWxkUmVzdFJlc3BvbnNlQnl0ZUFycmF5RnJvbVJlc3VsdChodHRwUmVzcG9uc2UpOworCisJCQlpZiAocmVzdFJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkFmdGVyIGV4ZWN1dGluZyB1cmkge30uIFJlc3BvbnNlOiB7fS4iLCBodHRwUmVxdWVzdEJhc2UuZ2V0VVJJKCkudG9TdHJpbmcoKSwgcmVzdFJlc3BvbnNlLnRvUHJldHR5U3RyaW5nKCkpOworCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCWh0dHBSZXF1ZXN0QmFzZS5hYm9ydCgpOworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIkZhaWxlZCBleGVjdXRpbmcgaHR0cCByZXF1ZXN0ICIgKyBodHRwUmVxdWVzdEJhc2UuZ2V0VVJJKCkudG9TdHJpbmcoKSArICIoIgorCQkJCQkrIGh0dHBSZXF1ZXN0QmFzZS5nZXRNZXRob2QoKSArICIpIjsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiRXhlY3V0ZVJlc3RSZXF1ZXN0IiwgZGVzY3JpcHRpb24sCisJCQkJCUVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJbG9nZ2VyLmRlYnVnKGRlc2NyaXB0aW9uLCBleGNlcHRpb24pOworCQkJcmVzdFJlc3BvbnNlID0gZXJyb3JSZXN0UmVzcG9uc2VBc0J5dGVBcnJheTsKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIGVuc3VyZSB0aGUgY29ubmVjdGlvbiBnZXRzIHJlbGVhc2VkIHRvIHRoZSBtYW5hZ2VyCisJCQlyZWxlYXNlUmVzb3VyY2UoaHR0cFJlc3BvbnNlKTsKKwkJfQorCisJCXJldHVybiByZXN0UmVzcG9uc2U7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgcHJpbnQgdGhlIEpTT04gcmVzcG9uc2UgZnJvbSB0aGUgUkVTVCBTZXJ2ZXIKKwkgKiAKKwkgKiBAcGFyYW0gcmVzcG9uc2UKKwkgKiAgICAgICAgICAgIHRoZSBKU09OIHJlc3BvbnNlIGZyb20gdGhlIFJFU1Qgc2VydmVyCisJICogQHBhcmFtIG1ldGhvZAorCSAqICAgICAgICAgICAgbmFtZSBvZiBtZXRob2QKKwkgKi8KKwlwcml2YXRlIHZvaWQgbG9nUmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlLCBTdHJpbmcgbWV0aG9kKSB7CisJCWxvZ2dlci50cmFjZShtZXRob2QgKyAiIHJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVsZWFzZVJlc291cmNlKENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSkgeworCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworCQkJCWlmIChlbnRpdHkgIT0gbnVsbCkgeworCQkJCQlFbnRpdHlVdGlscy5jb25zdW1lKGVudGl0eSk7CisJCQkJfQorCQkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5lcnJvcigiZmFpbGVkIHRvIGNsb3NlIGNvbm5lY3Rpb24gZXhjZXB0aW9uIiwgZSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworCQlyZXR1cm4gaXNJbml0aWFsaXplZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3Jlc3QvUmVzdENvbmZpZ3VyYXRpb25JbmZvLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9yZXN0L1Jlc3RDb25maWd1cmF0aW9uSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDViYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby9yZXN0L1Jlc3RDb25maWd1cmF0aW9uSW5mby5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnJlc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXN0Q29uZmlndXJhdGlvbkluZm8geworCisJcHJpdmF0ZSBJbnRlZ2VyIHJlYWRUaW1lb3V0SW5TZWMgPSBudWxsOworCisJcHJpdmF0ZSBCb29sZWFuIGlnbm9yZUNlcnRpZmljYXRlID0gbnVsbDsKKworCXByaXZhdGUgSW50ZWdlciBjb25uZWN0aW9uUG9vbFNpemUgPSBudWxsOworCisJcHJpdmF0ZSBJbnRlZ2VyIGNvbm5lY3RUaW1lb3V0SW5TZWMgPSBudWxsOworCisJcHJpdmF0ZSBJbnRlZ2VyIHNvY2tldFRpbWVvdXRJblNlYyA9IG51bGw7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSByZWFkVGltZW91dEluU2VjCisJICovCisJcHVibGljIEludGVnZXIgZ2V0UmVhZFRpbWVvdXRJblNlYygpIHsKKwkJcmV0dXJuIHJlYWRUaW1lb3V0SW5TZWM7CisJfQorCisJLyoqCisJICogQHBhcmFtIHJlYWRUaW1lb3V0SW5TZWMKKwkgKiAgICAgICAgICAgIHRoZSByZWFkVGltZW91dEluU2VjIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlYWRUaW1lb3V0SW5TZWMoSW50ZWdlciByZWFkVGltZW91dEluU2VjKSB7CisJCXRoaXMucmVhZFRpbWVvdXRJblNlYyA9IHJlYWRUaW1lb3V0SW5TZWM7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaWdub3JlQ2VydGlmaWNhdGUKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRJZ25vcmVDZXJ0aWZpY2F0ZSgpIHsKKwkJcmV0dXJuIGlnbm9yZUNlcnRpZmljYXRlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpZ25vcmVDZXJ0aWZpY2F0ZQorCSAqICAgICAgICAgICAgdGhlIGlnbm9yZUNlcnRpZmljYXRlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldElnbm9yZUNlcnRpZmljYXRlKEJvb2xlYW4gaWdub3JlQ2VydGlmaWNhdGUpIHsKKwkJdGhpcy5pZ25vcmVDZXJ0aWZpY2F0ZSA9IGlnbm9yZUNlcnRpZmljYXRlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbm5lY3Rpb25Qb29sU2l6ZQorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldENvbm5lY3Rpb25Qb29sU2l6ZSgpIHsKKwkJcmV0dXJuIGNvbm5lY3Rpb25Qb29sU2l6ZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29ubmVjdGlvblBvb2xTaXplCisJICogICAgICAgICAgICB0aGUgY29ubmVjdGlvblBvb2xTaXplIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Qb29sU2l6ZShJbnRlZ2VyIGNvbm5lY3Rpb25Qb29sU2l6ZSkgeworCQl0aGlzLmNvbm5lY3Rpb25Qb29sU2l6ZSA9IGNvbm5lY3Rpb25Qb29sU2l6ZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb25uZWN0VGltZW91dEluU2VjCisJICovCisJcHVibGljIEludGVnZXIgZ2V0Q29ubmVjdFRpbWVvdXRJblNlYygpIHsKKwkJcmV0dXJuIGNvbm5lY3RUaW1lb3V0SW5TZWM7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbm5lY3RUaW1lb3V0SW5TZWMKKwkgKiAgICAgICAgICAgIHRoZSBjb25uZWN0VGltZW91dEluU2VjIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbm5lY3RUaW1lb3V0SW5TZWMoSW50ZWdlciBjb25uZWN0VGltZW91dEluU2VjKSB7CisJCXRoaXMuY29ubmVjdFRpbWVvdXRJblNlYyA9IGNvbm5lY3RUaW1lb3V0SW5TZWM7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0U29ja2V0VGltZW91dEluU2VjKCkgeworCQlyZXR1cm4gc29ja2V0VGltZW91dEluU2VjOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXRJblNlYyhJbnRlZ2VyIHNvY2tldFRpbWVvdXRJblNlYykgeworCQl0aGlzLnNvY2tldFRpbWVvdXRJblNlYyA9IHNvY2tldFRpbWVvdXRJblNlYzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlc3RDb25maWd1cmF0aW9uSW5mbyBbcmVhZFRpbWVvdXRJblNlYz0iICsgcmVhZFRpbWVvdXRJblNlYyArICIsIGlnbm9yZUNlcnRpZmljYXRlPSIKKwkJCQkrIGlnbm9yZUNlcnRpZmljYXRlICsgIiwgY29ubmVjdGlvblBvb2xTaXplPSIgKyBjb25uZWN0aW9uUG9vbFNpemUgKyAiLCBjb25uZWN0VGltZW91dEluU2VjPSIKKwkJCQkrIGNvbm5lY3RUaW1lb3V0SW5TZWMgKyAiLCBzb2NrZXRUaW1lb3V0SW5TZWM9IiArIHNvY2tldFRpbWVvdXRJblNlYyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3RpdGFuL1F1ZXJ5VHlwZS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdGl0YW4vUXVlcnlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5ZWQzMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3RpdGFuL1F1ZXJ5VHlwZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW47CisKKy8qKgorICogQ3JlYXRlZCBieSBtbGFuZG8gb24gOS8yMS8yMDE2LgorICovCitwdWJsaWMgZW51bSBRdWVyeVR5cGUgeworCUhBUywgSEFTX05PVAorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdGl0YW4vVGl0YW5HZW5lcmljRGFvLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby90aXRhbi9UaXRhbkdlbmVyaWNEYW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzUxNDZkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdGl0YW4vVGl0YW5HZW5lcmljRGFvLmphdmEKQEAgLTAsMCArMSwxODQ4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVUcmlwbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRGlyZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5UOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS51dGlsLkVsZW1lbnRIZWxwZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5HcmFwaEVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLlJlbGF0aW9uRW5kUG9pbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkdyYXBoTm9kZUxvY2s7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5Qcm9wZXJ0eUtleTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuRWRnZTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoUXVlcnk7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4UXVlcnk7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uZ3JhcGhkYi5xdWVyeS5UaXRhblByZWRpY2F0ZTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJ0aXRhbi1nZW5lcmljLWRhbyIpCitwdWJsaWMgY2xhc3MgVGl0YW5HZW5lcmljRGFvIHsKKworCUBSZXNvdXJjZQorCVRpdGFuR3JhcGhDbGllbnQgdGl0YW5DbGllbnQ7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGl0YW5HZW5lcmljRGFvLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfTk9ERV9QUkVGSVggPSAibG9ja18iOworCisJcHVibGljIFRpdGFuR2VuZXJpY0RhbygpIHsKKwkJbG9nZ2VyLmluZm8oIioqIFRpdGFuR2VuZXJpY0RhbyBjcmVhdGVkIik7CisJfQorCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGNvbW1pdCgpIHsKKwkJbG9nZ2VyLmRlYnVnKCJkb2luZyBjb21taXQuIik7CisJCXJldHVybiB0aXRhbkNsaWVudC5jb21taXQoKTsKKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgcm9sbGJhY2soKSB7CisJCXJldHVybiB0aXRhbkNsaWVudC5yb2xsYmFjaygpOworCX0KKworCXB1YmxpYyBFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEdyYXBoKCkgeworCQlyZXR1cm4gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwl9CisKKwkvLyBGb3IgaGVhbHRoQ2hlY2sKKwlwdWJsaWMgYm9vbGVhbiBpc0dyYXBoT3BlbigpIHsKKwkJcmV0dXJuIHRpdGFuQ2xpZW50LmdldEhlYWx0aCgpOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBub2RlCisJICogQHBhcmFtIGNsYXp6CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPFQsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlKFQgbm9kZSwgQ2xhc3M8VD4gY2xhenopIHsKKwkJbG9nZ2VyLmRlYnVnKCJ0cnkgdG8gY3JlYXRlIG5vZGUgZm9yIElEIFt7fV0iLCBub2RlLmdldEtleVZhbHVlSWQoKSk7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkNsaWVudC5nZXRHcmFwaCgpOworCQlpZiAoZ3JhcGguaXNMZWZ0KCkpIHsKKwkJCVQgbmV3Tm9kZTsKKwkJCXRyeSB7CisJCQkJVGl0YW5HcmFwaCB0R3JhcGggPSBncmFwaC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCVZlcnRleCB2ZXJ0ZXggPSB0R3JhcGguYWRkVmVydGV4KCk7CisKKwkJCQl2ZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBub2RlLmdldExhYmVsKCkpOworCisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbm9kZS50b0dyYXBoTWFwKCk7CisJCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJCQlzZXRQcm9wZXJ0aWVzKHZlcnRleCwgcHJvcGVydGllcyk7CisJCQkJfQorCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbmV3UHJvcHMgPSBnZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisJCQkJbmV3Tm9kZSA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudChub2RlLmdldExhYmVsKCksIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIG5ld1Byb3BzLCBjbGF6eik7CisJCQkJbG9nZ2VyLmRlYnVnKCJjcmVhdGVkIG5vZGUgZm9yIHByb3BzIDoge30iLCBuZXdQcm9wcyk7CisJCQkJbG9nZ2VyLmRlYnVnKCJOb2RlIHdhcyBjcmVhdGVkIGZvciBJRCBbe31dIiwgbm9kZS5nZXRLZXlWYWx1ZUlkKCkpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXdOb2RlKTsKKworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgTm9kZSBmb3IgSUQgW3t9XSIsIG5vZGUuZ2V0S2V5VmFsdWVJZCgpLCBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuR3JhcGhDbGllbnQuaGFuZGxlVGl0YW5FeGNlcHRpb24oZSkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgTm9kZSBmb3IgSUQgW3t9XSAge30iLCBub2RlLmdldEtleVZhbHVlSWQoKSwgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlKEdyYXBoTm9kZSBub2RlKSB7CisJCWxvZ2dlci5kZWJ1ZygidHJ5IHRvIGNyZWF0ZSBub2RlIGZvciBJRCBbe31dIiwgbm9kZS5nZXRLZXlWYWx1ZUlkKCkpOworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQl0cnkgeworCQkJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSB0R3JhcGguYWRkVmVydGV4KCk7CisKKwkJCQl2ZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBub2RlLmdldExhYmVsKCkpOworCisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbm9kZS50b0dyYXBoTWFwKCk7CisJCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJCQlzZXRQcm9wZXJ0aWVzKHZlcnRleCwgcHJvcGVydGllcyk7CisJCQkJfQorCQkJCWxvZ2dlci5kZWJ1ZygiTm9kZSB3YXMgY3JlYXRlZCBmb3IgSUQgW3t9XSIsIG5vZGUuZ2V0S2V5VmFsdWVJZCgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQodmVydGV4KTsKKworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgTm9kZSBmb3IgSUQgW3t9XSIsIG5vZGUuZ2V0S2V5VmFsdWVJZCgpLCBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuR3JhcGhDbGllbnQuaGFuZGxlVGl0YW5FeGNlcHRpb24oZSkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgTm9kZSBmb3IgSUQgW3t9XSAge30iLCBub2RlLmdldEtleVZhbHVlSWQoKSwgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSByZWxhdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvbihHcmFwaFJlbGF0aW9uIHJlbGF0aW9uKSB7CisJCWxvZ2dlci5kZWJ1ZygidHJ5IHRvIGNyZWF0ZSByZWxhdGlvbiBmcm9tIFt7fV0gdG8gW3t9XSAiLCByZWxhdGlvbi5nZXRGcm9tKCksIHJlbGF0aW9uLmdldFRvKCkpOworCisJCVJlbGF0aW9uRW5kUG9pbnQgZnJvbSA9IHJlbGF0aW9uLmdldEZyb20oKTsKKwkJUmVsYXRpb25FbmRQb2ludCB0byA9IHJlbGF0aW9uLmdldFRvKCk7CisJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IGZyb21LZXlJZCA9IG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0Pihmcm9tLmdldElkTmFtZSgpLCBmcm9tLmdldElkVmFsdWUoKSk7CisJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IHRvS2V5SWQgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4odG8uZ2V0SWROYW1lKCksIHRvLmdldElkVmFsdWUoKSk7CisKKwkJcmV0dXJuIGNyZWF0ZUVkZ2UocmVsYXRpb24uZ2V0VHlwZSgpLCBmcm9tS2V5SWQsIHRvS2V5SWQsIGZyb20uZ2V0TGFiZWwoKS5nZXROYW1lKCksIHRvLmdldExhYmVsKCkuZ2V0TmFtZSgpLCByZWxhdGlvbi50b0dyYXBoTWFwKCkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUVkZ2UoU3RyaW5nIHR5cGUsIEltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IGZyb20sIEltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IHRvLCBTdHJpbmcgZnJvbUxhYmVsLCBTdHJpbmcgdG9MYWJlbCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkNsaWVudC5nZXRHcmFwaCgpOworCisJCWlmIChncmFwaC5pc0xlZnQoKSkgeworCQkJdHJ5IHsKKwkJCQlFaXRoZXI8VmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZnJvbVYgPSBnZXRWZXJ0ZXhCeVByb3BlcnR5QW5kTGFiZWwoZnJvbS5nZXRLZXkoKSwgZnJvbS5nZXRWYWx1ZSgpLCBmcm9tTGFiZWwpOworCQkJCWlmIChmcm9tVi5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBmcm9tVi5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWlmIChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQuZXF1YWxzKGVycm9yKSkgeworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQkJCQl9CisJCQkJfQorCQkJCUVpdGhlcjxWZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB0b1YgPSBnZXRWZXJ0ZXhCeVByb3BlcnR5QW5kTGFiZWwodG8uZ2V0S2V5KCksIHRvLmdldFZhbHVlKCksIHRvTGFiZWwpOworCQkJCWlmICh0b1YuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gdG9WLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJaWYgKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORC5lcXVhbHMoZXJyb3IpKSB7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlWZXJ0ZXggZnJvbVZlcnRleCA9IGZyb21WLmxlZnQoKS52YWx1ZSgpOworCQkJCVZlcnRleCB0b1ZlcnRleCA9IHRvVi5sZWZ0KCkudmFsdWUoKTsKKwkJCQlFZGdlIGVkZ2UgPSBmcm9tVmVydGV4LmFkZEVkZ2UodHlwZSwgdG9WZXJ0ZXgpOworCisJCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCisJCQkJCXNldFByb3BlcnRpZXMoZWRnZSwgcHJvcGVydGllcyk7CisJCQkJfQorCisJCQkJVmVydGV4IHZlcnRleE91dCA9IGVkZ2Uub3V0VmVydGV4KCk7CisJCQkJVmVydGV4IHZlcnRleEluID0gZWRnZS5pblZlcnRleCgpOworCisJCQkJR3JhcGhOb2RlIG5vZGVPdXQgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoZnJvbUxhYmVsLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBnZXRQcm9wZXJ0aWVzKHZlcnRleE91dCksIEdyYXBoTm9kZS5jbGFzcyk7CisJCQkJR3JhcGhOb2RlIG5vZGVJbiA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudCh0b0xhYmVsLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBnZXRQcm9wZXJ0aWVzKHZlcnRleEluKSwgR3JhcGhOb2RlLmNsYXNzKTsKKworCQkJCUdyYXBoUmVsYXRpb24gbmV3UmVsYXRpb24gPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZVJlbGF0aW9uKGVkZ2UubGFiZWwoKSwgZ2V0UHJvcGVydGllcyhlZGdlKSwgbm9kZU91dCwgbm9kZUluKTsKKworCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXdSZWxhdGlvbik7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBlZGdlIGZyb20gW3t9XSB0byBbe31dIiwgZnJvbSwgdG8sIGUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgZWRnZSBmcm9tIFt7fV0gdG8gW3t9XSAgIHt9IiwgZnJvbSwgdG8sIGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlRWRnZShUaXRhblZlcnRleCB2ZXJ0ZXhPdXQsIFRpdGFuVmVydGV4IHZlcnRleEluLCBHcmFwaEVkZ2VMYWJlbHMgdHlwZSwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXRyeSB7CisJCQlFZGdlIGVkZ2UgPSB2ZXJ0ZXhPdXQuYWRkRWRnZSh0eXBlLmdldFByb3BlcnR5KCksIHZlcnRleEluKTsKKworCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCisJCQkJc2V0UHJvcGVydGllcyhlZGdlLCBwcm9wZXJ0aWVzKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBlZGdlIGZyb20gW3t9XSB0byBbe31dIiwgdmVydGV4T3V0LCB2ZXJ0ZXhJbiwgZSk7CisJCQlyZXR1cm4gVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKTsKKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlRWRnZShUaXRhblZlcnRleCB2ZXJ0ZXhPdXQsIEdyYXBoTm9kZSB0bywgR3JhcGhFZGdlTGFiZWxzIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCVRpdGFuVmVydGV4IHZlcnRleEluOworCQlFaXRoZXI8VmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdG9WID0gZ2V0VmVydGV4QnlQcm9wZXJ0eUFuZExhYmVsKHRvLmdldFVuaXF1ZUlkS2V5KCksIHRvLmdldFVuaXF1ZUlkKCksIHRvLmdldExhYmVsKCkpOworCQlpZiAodG9WLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSB0b1YucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORC5lcXVhbHMoZXJyb3IpKSB7CisJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJfQorCQl2ZXJ0ZXhJbiA9IChUaXRhblZlcnRleCkgdG9WLmxlZnQoKS52YWx1ZSgpOworCQlyZXR1cm4gY3JlYXRlRWRnZSh2ZXJ0ZXhPdXQsIHZlcnRleEluLCB0eXBlLCBwcm9wZXJ0aWVzKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gZnJvbQorCSAqIEBwYXJhbSB0bworCSAqIEBwYXJhbSBsYWJlbAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uKEdyYXBoTm9kZSBmcm9tLCBHcmFwaE5vZGUgdG8sIEdyYXBoRWRnZUxhYmVscyBsYWJlbCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCWxvZ2dlci5kZWJ1ZygidHJ5IHRvIGNyZWF0ZSByZWxhdGlvbiBmcm9tIFt7fV0gdG8gW3t9XSIsIGZyb20uZ2V0S2V5VmFsdWVJZCgpLCB0by5nZXRLZXlWYWx1ZUlkKCkpOworCQlyZXR1cm4gY3JlYXRlRWRnZShsYWJlbC5nZXRQcm9wZXJ0eSgpLCBmcm9tLmdldEtleVZhbHVlSWQoKSwgdG8uZ2V0S2V5VmFsdWVJZCgpLCBmcm9tLmdldExhYmVsKCksIHRvLmdldExhYmVsKCksIHByb3BlcnRpZXMpOworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcGxhY2VSZWxhdGlvbkxhYmVsKEdyYXBoTm9kZSBmcm9tLCBHcmFwaE5vZGUgdG8sIEdyYXBoRWRnZUxhYmVscyBsYWJlbCwgR3JhcGhFZGdlTGFiZWxzIG5ld0xhYmVsKSB7CisKKwkJbG9nZ2VyLmRlYnVnKCJ0cnkgdG8gcmVwbGFjZSByZWxhdGlvbiB7fSB0byB7fSBmcm9tIFt7fV0gdG8gW3t9XSIsIGxhYmVsLm5hbWUoKSwgbmV3TGFiZWwubmFtZSgpLCBmcm9tLmdldEtleVZhbHVlSWQoKSwgdG8uZ2V0S2V5VmFsdWVJZCgpKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZWxhdGlvblJlc3VsdCA9IGdldFJlbGF0aW9uKGZyb20sIHRvLCBsYWJlbCk7CisJCWlmIChnZXRSZWxhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBnZXRSZWxhdGlvblJlc3VsdDsKKwkJfQorCisJCUdyYXBoUmVsYXRpb24gb3JpZ1JlbGF0aW9uID0gZ2V0UmVsYXRpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb25SZXN1bHQgPSBjcmVhdGVSZWxhdGlvbihmcm9tLCB0bywgbmV3TGFiZWwsIG9yaWdSZWxhdGlvbi50b0dyYXBoTWFwKCkpOworCQlpZiAoY3JlYXRlUmVsYXRpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gY3JlYXRlUmVsYXRpb25SZXN1bHQ7CisJCX0KKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlbGF0aW9uUmVzdWx0ID0gZGVsZXRlUmVsYXRpb24ob3JpZ1JlbGF0aW9uKTsKKwkJaWYgKGRlbGV0ZVJlbGF0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGRlbGV0ZVJlbGF0aW9uUmVzdWx0OworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVSZWxhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGtleU5hbWUKKwkgKiBAcGFyYW0ga2V5VmFsdWUKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8VCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldE5vZGUoU3RyaW5nIGtleU5hbWUsIE9iamVjdCBrZXlWYWx1ZSwgQ2xhc3M8VD4gY2xhenopIHsKKworCQlsb2dnZXIuZGVidWcoIlRyeSB0byBnZXQgbm9kZSBmb3Iga2V5IFt7fV0gd2l0aCB2YWx1ZSBbe31dICIsIGtleU5hbWUsIGtleVZhbHVlKTsKKworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhCeVByb3BlcnR5ID0gZ2V0VmVydGV4QnlQcm9wZXJ0eShrZXlOYW1lLCBrZXlWYWx1ZSk7CisKKwkJaWYgKHZlcnRleEJ5UHJvcGVydHkuaXNMZWZ0KCkpIHsKKwkJCXRyeSB7CisJCQkJVmVydGV4IHZlcnRleCA9IHZlcnRleEJ5UHJvcGVydHkubGVmdCgpLnZhbHVlKCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyh2ZXJ0ZXgpOworCQkJCVQgbm9kZSA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCkpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBwcm9wZXJ0aWVzLCBjbGF6eik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5vZGUpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBnZXQgbm9kZSBmb3Iga2V5IFt7fV0gd2l0aCB2YWx1ZSBbe31dICIsIGtleU5hbWUsIGtleVZhbHVlLCBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuR3JhcGhDbGllbnQuaGFuZGxlVGl0YW5FeGNlcHRpb24oZSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IG5vZGUgZm9yIGtleSBbe31dIHdpdGggdmFsdWUgW3t9XSAgIiwga2V5TmFtZSwga2V5VmFsdWUsIHZlcnRleEJ5UHJvcGVydHkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmVydGV4QnlQcm9wZXJ0eS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGZyb20KKwkgKiBAcGFyYW0gdG8KKwkgKiBAcGFyYW0gbGFiZWwKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UmVsYXRpb24oR3JhcGhOb2RlIGZyb20sIEdyYXBoTm9kZSB0bywgR3JhcGhFZGdlTGFiZWxzIGxhYmVsKSB7CisJCWxvZ2dlci5kZWJ1ZygidHJ5IHRvIGdldCByZWxhdGlvbiBmcm9tIFt7fV0gdG8gW3t9XSIsIGZyb20uZ2V0S2V5VmFsdWVJZCgpLCB0by5nZXRLZXlWYWx1ZUlkKCkpOworCisJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IGtleVZhbHVlSWRGcm9tID0gZnJvbS5nZXRLZXlWYWx1ZUlkKCk7CisJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IGtleVZhbHVlSWRUbyA9IHRvLmdldEtleVZhbHVlSWQoKTsKKworCQlFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVkZ2UgPSBnZXRFZGdlQnlWZXJ0aWNpZXMoa2V5VmFsdWVJZEZyb20uZ2V0S2V5KCksIGtleVZhbHVlSWRGcm9tLmdldFZhbHVlKCksIGtleVZhbHVlSWRUby5nZXRLZXkoKSwga2V5VmFsdWVJZFRvLmdldFZhbHVlKCksIGxhYmVsLmdldFByb3BlcnR5KCkpOworCisJCWlmIChlZGdlLmlzTGVmdCgpKSB7CisJCQl0cnkgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMoZWRnZS5sZWZ0KCkudmFsdWUoKSk7CisJCQkJR3JhcGhSZWxhdGlvbiByZWxhdGlvbiA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlUmVsYXRpb24obGFiZWwuZ2V0UHJvcGVydHkoKSwgcHJvcGVydGllcywgZnJvbSwgdG8pOworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZWxhdGlvbik7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGdldCAgZ2V0IHJlbGF0aW9uIGZyb20gW3t9XSB0byBbe31dIiwgZnJvbS5nZXRLZXlWYWx1ZUlkKCksIHRvLmdldEtleVZhbHVlSWQoKSwgZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbkdyYXBoQ2xpZW50LmhhbmRsZVRpdGFuRXhjZXB0aW9uKGUpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGdldCAgZ2V0IHJlbGF0aW9uIGZyb20gW3t9XSB0byBbe31dICAge30iLCBmcm9tLmdldEtleVZhbHVlSWQoKSwgdG8uZ2V0S2V5VmFsdWVJZCgpLCBlZGdlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVkZ2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKEdyYXBoTm9kZSB0bywgR3JhcGhFZGdlTGFiZWxzIGxhYmVsLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzKSB7CisKKwkJRWl0aGVyPEVkZ2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlZGdlQnlDcml0ZXJpYSA9IGdldEluY29taW5nRWRnZUJ5Q3JpdGVyaWEodG8sIGxhYmVsLCBwcm9wcyk7CisJCWlmIChlZGdlQnlDcml0ZXJpYS5pc0xlZnQoKSkgeworCQkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaCA9IGdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNMZWZ0KCkpIHsKKwkJCQlFZGdlIGVkZ2UgPSBlZGdlQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlsb2dnZXIuZGVidWcoImRlbGV0ZSBlZGdlIHt9IHRvIHt9ICIsIGxhYmVsLmdldFByb3BlcnR5KCksIHRvLmdldFVuaXF1ZUlkKCkpOworCQkJCWVkZ2UucmVtb3ZlKCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyhlZGdlKTsKKwkJCQlWZXJ0ZXggZnJvbVZlcnRleCA9IGVkZ2Uub3V0VmVydGV4KCk7CisJCQkJU3RyaW5nIGZyb21MYWJlbCA9IGZyb21WZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlHcmFwaE5vZGUgbm9kZUZyb20gPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoZnJvbUxhYmVsLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBnZXRQcm9wZXJ0aWVzKGZyb21WZXJ0ZXgpLCBHcmFwaE5vZGUuY2xhc3MpOworCQkJCUdyYXBoUmVsYXRpb24gcmVsYXRpb24gPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZVJlbGF0aW9uKGxhYmVsLmdldFByb3BlcnR5KCksIHByb3BlcnRpZXMsIG5vZGVGcm9tLCB0byk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlbGF0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGdyYXBoIik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBmaW5kIGVkZ2Uge30gdG8ge30iLCBsYWJlbC5nZXRQcm9wZXJ0eSgpLCB0by5nZXRVbmlxdWVJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZWRnZUJ5Q3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEoR3JhcGhOb2RlIHRvLCBHcmFwaEVkZ2VMYWJlbHMgbGFiZWwsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMpIHsKKworCQlFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVkZ2VCeUNyaXRlcmlhID0gZ2V0SW5jb21pbmdFZGdlQnlDcml0ZXJpYSh0bywgbGFiZWwsIHByb3BzKTsKKwkJaWYgKGVkZ2VCeUNyaXRlcmlhLmlzTGVmdCgpKSB7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gZ2V0R3JhcGgoKTsKKwkJCWlmIChncmFwaC5pc0xlZnQoKSkgeworCQkJCUVkZ2UgZWRnZSA9IGVkZ2VCeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpOworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMoZWRnZSk7CisJCQkJVmVydGV4IGZyb21WZXJ0ZXggPSBlZGdlLm91dFZlcnRleCgpOworCQkJCVN0cmluZyBmcm9tTGFiZWwgPSBmcm9tVmVydGV4LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSk7CisJCQkJR3JhcGhOb2RlIG5vZGVGcm9tID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KGZyb21MYWJlbCwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgZ2V0UHJvcGVydGllcyhmcm9tVmVydGV4KSwgR3JhcGhOb2RlLmNsYXNzKTsKKwkJCQlHcmFwaFJlbGF0aW9uIHJlbGF0aW9uID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVSZWxhdGlvbihsYWJlbC5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0aWVzLCBub2RlRnJvbSwgdG8pOworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZWxhdGlvbik7CisJCQl9IGVsc2UgeworCQkJCWxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGdldCBncmFwaCIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJbG9nZ2VyLmRlYnVnKCJmYWlsZWQgdG8gZmluZCBlZGdlIHt9IHRvIHt9IiwgbGFiZWwuZ2V0UHJvcGVydHkoKSwgdG8uZ2V0VW5pcXVlSWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVkZ2VCeUNyaXRlcmlhLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEluY29taW5nRWRnZUJ5Q3JpdGVyaWEoR3JhcGhOb2RlIHRvLCBHcmFwaEVkZ2VMYWJlbHMgbGFiZWwsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMpIHsKKworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZUlkVG8gPSB0by5nZXRLZXlWYWx1ZUlkKCk7CisKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4RnJvbSA9IGdldFZlcnRleEJ5UHJvcGVydHkoa2V5VmFsdWVJZFRvLmdldEtleSgpLCBrZXlWYWx1ZUlkVG8uZ2V0VmFsdWUoKSk7CisJCWlmICh2ZXJ0ZXhGcm9tLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2ZXJ0ZXhGcm9tLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJVmVydGV4IHZlcnRleCA9IHZlcnRleEZyb20ubGVmdCgpLnZhbHVlKCk7CisJCVRpdGFuVmVydGV4IHRpdGFuVmVydGV4ID0gKFRpdGFuVmVydGV4KSB2ZXJ0ZXg7CisJCVRpdGFuVmVydGV4UXVlcnk8Pz4gcXVlcnkgPSB0aXRhblZlcnRleC5xdWVyeSgpOworCQlxdWVyeSA9IHF1ZXJ5LmxhYmVscyhsYWJlbC5nZXRQcm9wZXJ0eSgpKTsKKworCQlpZiAocHJvcHMgIT0gbnVsbCAmJiAhcHJvcHMuaXNFbXB0eSgpKSB7CisJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBwcm9wcy5lbnRyeVNldCgpKSB7CisJCQkJcXVlcnkgPSBxdWVyeS5oYXMoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQkJfQorCQl9CisJCUVkZ2UgbWF0Y2hpbmdFZGdlID0gbnVsbDsKKwkJSXRlcmFibGU8VGl0YW5FZGdlPiBlZGdlcyA9IHF1ZXJ5LmVkZ2VzKCk7CisJCWlmIChlZGdlcyA9PSBudWxsKSB7CisJCQlsb2dnZXIuZGVidWcoIk5vIGVkZ2VzIGluIGdyYXBoIGZvciBjcml0ZXJpYSIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisJCUl0ZXJhdG9yPFRpdGFuRWRnZT4gZUl0ZXIgPSBlZGdlcy5pdGVyYXRvcigpOworCQlpZiAoZUl0ZXIuaGFzTmV4dCgpKSB7CisJCQlUaXRhbkVkZ2UgZWRnZSA9IGVJdGVyLm5leHQoKTsKKwkJCW1hdGNoaW5nRWRnZSA9IGVkZ2U7CisJCX0KKworCQlpZiAobWF0Y2hpbmdFZGdlID09IG51bGwpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiTm8gZWRnZXMgaW4gZ3JhcGggZm9yIGNyaXRlcmlhIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG1hdGNoaW5nRWRnZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEVkZ2VCeVZlcnRpY2llcyhTdHJpbmcga2V5TmFtZUZyb20sIE9iamVjdCBrZXlWYWx1ZUZyb20sIFN0cmluZyBrZXlOYW1lVG8sIE9iamVjdCBrZXlWYWx1ZVRvLCBTdHJpbmcgbGFiZWwpIHsKKwkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaCA9IHRpdGFuQ2xpZW50LmdldEdyYXBoKCk7CisKKwkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQl0cnkgeworCQkJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleEZyb20gPSBnZXRWZXJ0ZXhCeVByb3BlcnR5KGtleU5hbWVGcm9tLCBrZXlWYWx1ZUZyb20pOworCQkJCWlmICh2ZXJ0ZXhGcm9tLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZlcnRleEZyb20ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQkJSXRlcmFibGU8VGl0YW5FZGdlPiBlZGdlcyA9ICgoVGl0YW5WZXJ0ZXgpIHZlcnRleEZyb20ubGVmdCgpLnZhbHVlKCkpLnF1ZXJ5KCkubGFiZWxzKGxhYmVsKS5lZGdlcygpOworCQkJCUl0ZXJhdG9yPFRpdGFuRWRnZT4gZUl0ZXIgPSBlZGdlcy5pdGVyYXRvcigpOworCQkJCXdoaWxlIChlSXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJRWRnZSBlZGdlID0gZUl0ZXIubmV4dCgpOworCQkJCQlWZXJ0ZXggdmVydGV4SW4gPSBlZGdlLmluVmVydGV4KCk7CisJCQkJCWlmICh2ZXJ0ZXhJbi52YWx1ZShrZXlOYW1lVG8pICE9IG51bGwgJiYgdmVydGV4SW4udmFsdWUoa2V5TmFtZVRvKS5lcXVhbHMoa2V5VmFsdWVUbykgJiYgbGFiZWwuZXF1YWxzKGVkZ2UubGFiZWwoKSkpIHsKKwkJCQkJCXJldHVybiBFaXRoZXIubGVmdChlZGdlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlsb2dnZXIuZGVidWcoIk5vIHJlbGF0aW9uIGluIGdyYXBoIGZyb20gW3t9PXt9XSB0byBbe309e31dIiwga2V5TmFtZUZyb20sIGtleVZhbHVlRnJvbSwga2V5TmFtZVRvLCBrZXlWYWx1ZVRvKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGdldCAgZ2V0IHJlbGF0aW9uIGZyb20gW3t9PXt9XSB0byBbe309e31dIiwga2V5TmFtZUZyb20sIGtleVZhbHVlRnJvbSwga2V5TmFtZVRvLCBrZXlWYWx1ZVRvLCBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuR3JhcGhDbGllbnQuaGFuZGxlVGl0YW5FeGNlcHRpb24oZSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0RWRnZXNGb3JOb2RlKEdyYXBoTm9kZSBub2RlLCBEaXJlY3Rpb24gcmVxdWVzdGVkRGlyZWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8RWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQ7CisKKwkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4ga2V5VmFsdWVJZCA9IG5vZGUuZ2V0S2V5VmFsdWVJZCgpOworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJWZXJ0ZXggPSBnZXRWZXJ0ZXhCeVByb3BlcnR5KGtleVZhbHVlSWQuZ2V0S2V5KCksIGtleVZhbHVlSWQuZ2V0VmFsdWUoKSk7CisKKwkJaWYgKGVpdGhlclZlcnRleC5pc0xlZnQoKSkgeworCQkJTGlzdDxFZGdlPiBlZGdlcyA9IHByZXBhcmVFZGdlc0xpc3QoZWl0aGVyVmVydGV4LmxlZnQoKS52YWx1ZSgpLCByZXF1ZXN0ZWREaXJlY3Rpb24pOworCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChlZGdlcyk7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoZWl0aGVyVmVydGV4LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIExpc3Q8RWRnZT4gcHJlcGFyZUVkZ2VzTGlzdChWZXJ0ZXggdmVydGV4LCBEaXJlY3Rpb24gcmVxdWVzdGVkRGlyZWN0aW9uKSB7CisJCUxpc3Q8RWRnZT4gZWRnZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJSXRlcmF0b3I8VGl0YW5FZGdlPiBlZGdlc0l0ciA9ICgoVGl0YW5WZXJ0ZXgpIHZlcnRleCkucXVlcnkoKS5lZGdlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlZGdlc0l0ci5oYXNOZXh0KCkpIHsKKwkJCUVkZ2UgZWRnZSA9IGVkZ2VzSXRyLm5leHQoKTsKKwkJCURpcmVjdGlvbiBjdXJyRWRnZURpcmVjdGlvbiA9IGdldEVkZ2VEaXJlY3Rpb24odmVydGV4LCBlZGdlKTsKKwkJCWlmIChjdXJyRWRnZURpcmVjdGlvbiA9PSByZXF1ZXN0ZWREaXJlY3Rpb24gfHwgcmVxdWVzdGVkRGlyZWN0aW9uID09IERpcmVjdGlvbi5CT1RIKSB7CisJCQkJZWRnZXMuYWRkKGVkZ2UpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIGVkZ2VzOworCX0KKworCXByaXZhdGUgRGlyZWN0aW9uIGdldEVkZ2VEaXJlY3Rpb24oVmVydGV4IHZlcnRleCwgRWRnZSBlZGdlKSB7CisJCURpcmVjdGlvbiByZXN1bHQ7CisJCVZlcnRleCB2ZXJ0ZXhPdXQgPSBlZGdlLm91dFZlcnRleCgpOworCQlpZiAodmVydGV4T3V0LmVxdWFscyh2ZXJ0ZXgpKSB7CisJCQlyZXN1bHQgPSBEaXJlY3Rpb24uT1VUOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gRGlyZWN0aW9uLklOOworCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gZnJvbQorCSAqIEBwYXJhbSB0bworCSAqIEBwYXJhbSBsYWJlbAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlbGF0aW9uKEdyYXBoTm9kZSBmcm9tLCBHcmFwaE5vZGUgdG8sIEdyYXBoRWRnZUxhYmVscyBsYWJlbCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCWxvZ2dlci5kZWJ1ZygidHJ5IHRvIHVwZGF0ZSByZWxhdGlvbiBmcm9tIFt7fV0gdG8gW3t9XSIsIGZyb20uZ2V0S2V5VmFsdWVJZCgpLCB0by5nZXRLZXlWYWx1ZUlkKCkpOworCQlyZXR1cm4gdXBkYXRlRWRnZShsYWJlbC5nZXRQcm9wZXJ0eSgpLCBmcm9tLmdldEtleVZhbHVlSWQoKSwgdG8uZ2V0S2V5VmFsdWVJZCgpLCBmcm9tLmdldExhYmVsKCksIHRvLmdldExhYmVsKCksIHByb3BlcnRpZXMpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVFZGdlKFN0cmluZyB0eXBlLCBJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBmcm9tLCBJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiB0bywgU3RyaW5nIGZyb21MYWJlbCwgU3RyaW5nIHRvTGFiZWwsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCUVpdGhlcjxFZGdlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWRnZVMgPSBnZXRFZGdlQnlWZXJ0aWNpZXMoZnJvbS5nZXRLZXkoKSwgZnJvbS5nZXRWYWx1ZSgpLCB0by5nZXRLZXkoKSwgdG8uZ2V0VmFsdWUoKSwgdHlwZSk7CisJCWlmIChlZGdlUy5pc0xlZnQoKSkgeworCisJCQl0cnkgeworCQkJCUVkZ2UgZWRnZSA9IGVkZ2VTLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCQkJc2V0UHJvcGVydGllcyhlZGdlLCBwcm9wZXJ0aWVzKTsKKwkJCQl9CisKKwkJCQlWZXJ0ZXggdmVydGV4T3V0ID0gZWRnZS5vdXRWZXJ0ZXgoKTsKKwkJCQlWZXJ0ZXggdmVydGV4SW4gPSBlZGdlLmluVmVydGV4KCk7CisKKwkJCQlHcmFwaE5vZGUgbm9kZU91dCA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudChmcm9tTGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIGdldFByb3BlcnRpZXModmVydGV4T3V0KSwgR3JhcGhOb2RlLmNsYXNzKTsKKwkJCQlHcmFwaE5vZGUgbm9kZUluID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHRvTGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIGdldFByb3BlcnRpZXModmVydGV4SW4pLCBHcmFwaE5vZGUuY2xhc3MpOworCisJCQkJR3JhcGhSZWxhdGlvbiBuZXdSZWxhdGlvbiA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlUmVsYXRpb24oZWRnZS5sYWJlbCgpLCBnZXRQcm9wZXJ0aWVzKGVkZ2UpLCBub2RlT3V0LCBub2RlSW4pOworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIlJlbGF0aW9uIHdhcyB1cGRhdGVkIGZyb20gWyB7fSBdIHRvIFsge30gXSIsIGZyb20sIHRvKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ld1JlbGF0aW9uKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSByZWxhdGlvbiBmcm9tIFsge30gXSBbIHt9IF0ge30iLCBmcm9tLCB0bywgZSk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgcmVsYXRpb24gZnJvbSBbIHt9IF0gWyB7fSBdIHt9IiwgZnJvbSwgdG8sIGVkZ2VTLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVkZ2VTLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gcmVsYXRpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVsYXRpb24oR3JhcGhSZWxhdGlvbiByZWxhdGlvbikgeworCQlsb2dnZXIuZGVidWcoInRyeSB0byB1cGRhdGUgcmVsYXRpb24gZnJvbSBbe31dIHRvIFt7fV0iLCByZWxhdGlvbi5nZXRGcm9tKCksIHJlbGF0aW9uLmdldFRvKCkpOworCQlSZWxhdGlvbkVuZFBvaW50IGZyb20gPSByZWxhdGlvbi5nZXRGcm9tKCk7CisJCVJlbGF0aW9uRW5kUG9pbnQgdG8gPSByZWxhdGlvbi5nZXRUbygpOworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBmcm9tS2V5SWQgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4oZnJvbS5nZXRJZE5hbWUoKSwgZnJvbS5nZXRJZFZhbHVlKCkpOworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiB0b0tleUlkID0gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+KHRvLmdldElkTmFtZSgpLCB0by5nZXRJZFZhbHVlKCkpOworCisJCXJldHVybiB1cGRhdGVFZGdlKHJlbGF0aW9uLmdldFR5cGUoKSwgZnJvbUtleUlkLCB0b0tleUlkLCBmcm9tLmdldExhYmVsKCkuZ2V0TmFtZSgpLCB0by5nZXRMYWJlbCgpLmdldE5hbWUoKSwgcmVsYXRpb24udG9HcmFwaE1hcCgpKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPFZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFZlcnRleEJ5UHJvcGVydHlBbmRMYWJlbChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBTdHJpbmcgbGFiZWwpIHsKKworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQl0cnkgeworCQkJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGVjaWVzID0gdEdyYXBoLnF1ZXJ5KCkuaGFzKG5hbWUsIHZhbHVlKS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBsYWJlbCkudmVydGljZXMoKTsKKworCQkJCWphdmEudXRpbC5JdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0ZWNpZXMuaXRlcmF0b3IoKTsKKwkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdCh2ZXJ0ZXgpOworCQkJCX0KKwkJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJbG9nZ2VyLmRlYnVnKCJObyB2ZXJ0ZXggaW4gZ3JhcGggZm9yIGtleSA9IHt9IGFuZCB2YWx1ZSA9IHt9IGxhYmVsID0ge30iLCBuYW1lLCB2YWx1ZSwgbGFiZWwpOworCQkJCX0KKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBnZXQgdmVydGV4IGluIGdyYXBoIGZvciBrZXkgPSB7fSBhbmQgdmFsdWUgPSB7fSBsYWJlbCA9IHt9IiwgbmFtZSwgdmFsdWUsIGxhYmVsKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbkdyYXBoQ2xpZW50LmhhbmRsZVRpdGFuRXhjZXB0aW9uKGUpKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJObyB2ZXJ0ZXggaW4gZ3JhcGggZm9yIGtleSA9IHt9IGFuZCB2YWx1ZSA9IHt9IGxhYmVsID0ge30uIGVycm9yIDoge30iLCBuYW1lLCB2YWx1ZSwgbGFiZWwsIGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0VmVydGV4QnlQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisKKwkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaCA9IHRpdGFuQ2xpZW50LmdldEdyYXBoKCk7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlsb2dnZXIuZGVidWcoIk5vIHZlcnRleCBpbiBncmFwaCBmb3Iga2V5ID0ge30gYW5kIHZhbHVlID0ge30iLCBuYW1lLCB2YWx1ZSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKwkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQl0cnkgeworCQkJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGVjaWVzID0gdEdyYXBoLnF1ZXJ5KCkuaGFzKG5hbWUsIHZhbHVlKS52ZXJ0aWNlcygpOworCisJCQkJamF2YS51dGlsLkl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRlY2llcy5pdGVyYXRvcigpOworCQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJVGl0YW5WZXJ0ZXggdmVydGV4ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCQlyZXR1cm4gRWl0aGVyLmxlZnQodmVydGV4KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJCWxvZ2dlci5kZWJ1ZygiTm8gdmVydGV4IGluIGdyYXBoIGZvciBrZXkgPXt9IGFuZCB2YWx1ZSA9IHt9IiwgbmFtZSwgdmFsdWUpOworCQkJCQl9CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBnZXQgdmVydGV4IGluIGdyYXBoIGZvciBrZXkgPSB7fSBhbmQgdmFsdWUgPSAiLCBuYW1lLCB2YWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlsb2dnZXIuZGVidWcoIk5vIHZlcnRleCBpbiBncmFwaCBmb3Iga2V5ID0ge30gYW5kIHZhbHVlID0ge30gZXJyb3IgOiB7fSIsIG5hbWUsIHZhbHVlLCBncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJfQorCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gaGFzUHJvcHMsIE1hcDxTdHJpbmcsIE9iamVjdD4gaGFzTm90UHJvcHMsIENsYXNzPFQ+IGNsYXp6KSB7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkNsaWVudC5nZXRHcmFwaCgpOworCQlpZiAoZ3JhcGguaXNMZWZ0KCkpIHsKKwkJCXRyeSB7CisJCQkJVGl0YW5HcmFwaCB0R3JhcGggPSBncmFwaC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCVRpdGFuR3JhcGhRdWVyeTw/IGV4dGVuZHMgVGl0YW5HcmFwaFF1ZXJ5PiBxdWVyeSA9IHRHcmFwaC5xdWVyeSgpOworCQkJCXF1ZXJ5ID0gcXVlcnkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgdHlwZS5nZXROYW1lKCkpOworCisJCQkJaWYgKGhhc1Byb3BzICE9IG51bGwgJiYgIWhhc1Byb3BzLmlzRW1wdHkoKSkgeworCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBoYXNQcm9wcy5lbnRyeVNldCgpKSB7CisJCQkJCQlxdWVyeSA9IHF1ZXJ5LmhhcyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGhhc05vdFByb3BzICE9IG51bGwgJiYgIWhhc05vdFByb3BzLmlzRW1wdHkoKSkgeworCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBoYXNOb3RQcm9wcy5lbnRyeVNldCgpKSB7CisJCQkJCQlxdWVyeSA9IHF1ZXJ5Lmhhc05vdChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gcXVlcnkudmVydGljZXMoKTsKKwkJCQlpZiAodmVydGljZXMgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJfQorCisJCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld1Byb3AgPSBnZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisKKwkJCQkJVCBlbGVtZW50ID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUuZ2V0TmFtZSgpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBuZXdQcm9wLCBjbGF6eik7CisJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7CisJCQkJfQorCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIk51bWJlciBvZiBmZXRjZWQgbm9kZXMgaW4gZ3JhcGggZm9yIGNyaXRlcmlhIDogZnJvbSB0eXBlID0ge30gYW5kIHByb3BlcnRpZXMgaGFzID0ge30sIHByb3BlcnRpZXMgaGFzTm90ID0ge30gIGlzIHt9IiwgdHlwZSwgaGFzUHJvcHMsIGhhc05vdFByb3BzLCByZXN1bHQuc2l6ZSgpKTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdC5zaXplKCkgPT0gMCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJfQorCisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCAgZ2V0IGJ5ICBjcml0ZXJpYSBmb3IgdHlwZSA9IHt9IiwgdHlwZSwgZSk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkICBnZXQgYnkgIGNyaXRlcmlhIGZvciB0eXBlID17fSAgZXJyb3IgOiB7fSIsIHR5cGUsIGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxMaXN0PFQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0gdHlwZSwgQ2xhc3M8VD4gY2xhenosIExpc3Q8SW1tdXRhYmxlVHJpcGxlPFF1ZXJ5VHlwZSwgU3RyaW5nLCBPYmplY3Q+PiBwcm9wcykgeworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQl0cnkgeworCQkJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlUaXRhbkdyYXBoUXVlcnk8PyBleHRlbmRzIFRpdGFuR3JhcGhRdWVyeT4gcXVlcnkgPSB0R3JhcGgucXVlcnkoKTsKKwkJCQlxdWVyeSA9IHF1ZXJ5LmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIHR5cGUuZ2V0TmFtZSgpKTsKKwkJCQlmb3IgKEltbXV0YWJsZVRyaXBsZTxRdWVyeVR5cGUsIFN0cmluZywgT2JqZWN0PiBwcm9wIDogcHJvcHMpIHsKKwkJCQkJaWYgKFF1ZXJ5VHlwZS5IQVMuZXF1YWxzKHByb3AuZ2V0TGVmdCgpKSkgeworCQkJCQkJcXVlcnkgPSBxdWVyeS5oYXMocHJvcC5nZXRNaWRkbGUoKSwgcHJvcC5nZXRSaWdodCgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXF1ZXJ5ID0gcXVlcnkuaGFzTm90KHByb3AuZ2V0TWlkZGxlKCksIHByb3AuZ2V0UmlnaHQoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gcXVlcnkudmVydGljZXMoKTsKKwkJCQlpZiAodmVydGljZXMgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJfQorCisJCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld1Byb3AgPSBnZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisKKwkJCQkJVCBlbGVtZW50ID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUuZ2V0TmFtZSgpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBuZXdQcm9wLCBjbGF6eik7CisJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7CisJCQkJfQorCQkJCWlmIChyZXN1bHQuc2l6ZSgpID09IDApIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJCX0KKworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgIGdldCBieSAgY3JpdGVyaWEgZm9yIHR5cGUgPSB7fSIsIHR5cGUsIGUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuR3JhcGhDbGllbnQuaGFuZGxlVGl0YW5FeGNlcHRpb24oZSkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCAgZ2V0IGJ5ICBjcml0ZXJpYSBmb3IgdHlwZSA9e30gIGVycm9yIDoge30iLCB0eXBlLCBncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHZlcnRleExlZnROb3RDb250YWluc0FsbFJpZ2h0UHJvcHMoTWFwPFN0cmluZywgT2JqZWN0PiBsZWZ0UHJvcHMsIE1hcDxTdHJpbmcsIE9iamVjdD4gcmlnaHRQcm9wcykgeworCisJCWlmIChyaWdodFByb3BzICE9IG51bGwpIHsKKworCQkJZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiByaWdodFByb3BzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJT2JqZWN0IGxlZnRWYWx1ZSA9IGxlZnRQcm9wcy5nZXQoa2V5KTsKKwkJCQlPYmplY3QgcmlnaHRWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQlpZiAobGVmdFZhbHVlID09IG51bGwpIHsKKwkJCQkJaWYgKHJpZ2h0VmFsdWUgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAodHJ1ZSA9PSBsZWZ0VmFsdWUuZXF1YWxzKHJpZ2h0VmFsdWUpKSB7CisJCQkJCWxvZ2dlci50cmFjZSgiVGhlIHZhbHVlIG9mIGtleSB7fSAgaXMgZGlmZmVybmV0IGJldHdlZW4gcHJvcGVydGllcy4ge30gdnMge30iLCBrZXksIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCXJldHVybiB0cnVlOworCisJfQorCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMsIENsYXNzPFQ+IGNsYXp6KSB7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkNsaWVudC5nZXRHcmFwaCgpOworCQlpZiAoZ3JhcGguaXNMZWZ0KCkpIHsKKwkJCXRyeSB7CisJCQkJVGl0YW5HcmFwaCB0R3JhcGggPSBncmFwaC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCVRpdGFuR3JhcGhRdWVyeTw/IGV4dGVuZHMgVGl0YW5HcmFwaFF1ZXJ5PiBxdWVyeSA9IHRHcmFwaC5xdWVyeSgpOworCQkJCXF1ZXJ5ID0gcXVlcnkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgdHlwZS5nZXROYW1lKCkpOworCisJCQkJaWYgKHByb3BzICE9IG51bGwgJiYgIXByb3BzLmlzRW1wdHkoKSkgeworCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBwcm9wcy5lbnRyeVNldCgpKSB7CisJCQkJCQlxdWVyeSA9IHF1ZXJ5LmhhcyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gcXVlcnkudmVydGljZXMoKTsKKwkJCQlpZiAodmVydGljZXMgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJfQorCisJCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld1Byb3AgPSBnZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisKKwkJCQkJVCBlbGVtZW50ID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUuZ2V0TmFtZSgpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBuZXdQcm9wLCBjbGF6eik7CisJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7CisJCQkJfQorCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIk51bWJlciBvZiBmZXRjZWQgbm9kZXMgaW4gZ3JhcGggZm9yIGNyaXRlcmlhIDogZnJvbSB0eXBlID0ge30gYW5kIHByb3BlcnRpZXMgPSB7fSBpcyB7fSIsIHR5cGUsIHByb3BzLCByZXN1bHQuc2l6ZSgpKTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdC5zaXplKCkgPT0gMCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJfQorCisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCAgZ2V0IGJ5ICBjcml0ZXJpYSBmb3IgdHlwZSA9IHt9IGFuZCBwcm9wZXJ0aWVzID0ge30iLCB0eXBlLCBwcm9wcywgZSk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkICBnZXQgYnkgIGNyaXRlcmlhIGZvciB0eXBlID17fSBhbmQgcHJvcGVydGllcyA9IHt9IGVycm9yIDoge30iLCB0eXBlLCBwcm9wcywgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCS8vIHB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPgorCS8vIGdldEJ5Q3JpdGVyaWFfdHgoTm9kZVR5cGVFbnVtIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMsIENsYXNzPFQ+CisJLy8gY2xhenopIHsKKwkvLyBFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwkvLyBUaXRhblRyYW5zYWN0aW9uIHR4PW51bGw7CisJLy8gaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJLy8gdHJ5IHsKKwkvLyBUaXRhbkdyYXBoIHRHcmFwaCA9IGdyYXBoLmxlZnQoKS52YWx1ZSgpOworCS8vIHR4ID0gdEdyYXBoLm5ld1RyYW5zYWN0aW9uKCk7CisJLy8KKwkvLyBUaXRhbkdyYXBoUXVlcnk8PyBleHRlbmRzIFRpdGFuR3JhcGhRdWVyeT4gcXVlcnkgPSB0eC5xdWVyeSgpOworCS8vIHF1ZXJ5ID0gcXVlcnkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwKKwkvLyB0eXBlLmdldE5hbWUoKSk7CisJLy8KKwkvLyBpZiAocHJvcHMgIT0gbnVsbCAmJiAhcHJvcHMuaXNFbXB0eSgpKSB7CisJLy8gZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcHJvcHMuZW50cnlTZXQoKSkgeworCS8vIHF1ZXJ5ID0gcXVlcnkuaGFzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkvLyB9CisJLy8gfQorCS8vIEl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IHF1ZXJ5LnZlcnRpY2VzKCk7CisJLy8gaWYgKHZlcnRpY2VzID09IG51bGwpIHsKKwkvLyB0eC5jb21taXQoKTsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJLy8gfQorCS8vCisJLy8KKwkvLyBJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCS8vIExpc3Q8VD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUPigpOworCS8vCisJLy8gd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCS8vIFZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJLy8KKwkvLyBNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld1Byb3AgPSBnZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisJLy8KKwkvLyBUIGVsZW1lbnQgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZS5nZXROYW1lKCksCisJLy8gR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgbmV3UHJvcCwgY2xhenopOworCS8vIHJlc3VsdC5hZGQoZWxlbWVudCk7CisJLy8gfQorCS8vIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCS8vIGxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGZldGNlZCBub2RlcyBpbiBncmFwaCBmb3IgY3JpdGVyaWEgOiBmcm9tIHR5cGUgPSIKKwkvLyArIHR5cGUgKyAiIGFuZCBwcm9wZXJ0aWVzID0gIiArIHByb3BzICsgIiBpcyAiICsgcmVzdWx0LnNpemUoKSk7CisJLy8gfQorCS8vIHR4LmNvbW1pdCgpOworCS8vIGlmIChyZXN1bHQuc2l6ZSgpID09IDApIHsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJLy8gfQorCS8vCisJLy8gcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkvLyBpZiAodHggIT0gbnVsbCkKKwkvLyB0cnkgeworCS8vIHR4LmNvbW1pdCgpOworCS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgeworCS8vIGxvZ2dlci5kZWJ1ZygiZmFpbGVkIHRvIGNvbW1pdCBhZnRlciBnZXQiLCBlKTsKKwkvLyB9CisJLy8gaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJLy8gbG9nZ2VyLmRlYnVnKCJGYWlsZWQgZ2V0IGJ5IGNyaXRlcmlhIGZvciB0eXBlID0ge30gYW5kIHByb3BlcnRpZXMgPSB7fS4ge30iLCB0eXBlLCBwcm9wcywgZSk7CisJLy8gfQorCS8vIHJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJLy8gfQorCS8vCisJLy8gfSBlbHNlIHsKKwkvLyBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkvLyBsb2dnZXIuZGVidWcoIkZhaWxlZCBnZXQgYnkgY3JpdGVyaWEgZm9yIHR5cGUgPSB7fSBhbmQgcHJvcGVydGllcyB7fS4gZXJyb3IgOiB7fSIsIHR5cGUsIHByb3BzLCBncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCS8vIH0KKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJLy8gfQorCS8vIH0KKworCXByaXZhdGUgYm9vbGVhbiB2ZXJ0ZXhMZWZ0Q29udGFpbnNSaWdodFByb3BzKE1hcDxTdHJpbmcsIE9iamVjdD4gbGVmdFByb3BzLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJpZ2h0UHJvcHMpIHsKKworCQlpZiAocmlnaHRQcm9wcyAhPSBudWxsKSB7CisKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcmlnaHRQcm9wcy5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCU9iamVjdCBsZWZ0VmFsdWUgPSBsZWZ0UHJvcHMuZ2V0KGtleSk7CisJCQkJT2JqZWN0IHJpZ2h0VmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCWlmIChsZWZ0VmFsdWUgPT0gbnVsbCkgeworCQkJCQlpZiAocmlnaHRWYWx1ZSA9PSBudWxsKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxvZ2dlci5kZWJ1ZygiVGhlIGtleSB7fSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHByb3BlcnRpZXMge30iLCBrZXksIGxlZnRQcm9wcyk7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoZmFsc2UgPT0gbGVmdFZhbHVlLmVxdWFscyhyaWdodFZhbHVlKSkgeworCQkJCQlsb2dnZXIudHJhY2UoIlRoZSB2YWx1ZSBvZiBrZXkge30gaXMgZGlmZmVybmV0IGJldHdlZW4gcHJvcGVydGllcy4ge30gdnMge30gIiwga2V5LCBsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxMaXN0PFQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QnlDcml0ZXJpYVdpdGhQcmFkaWNhdChOb2RlVHlwZUVudW0gdHlwZSwgTWFwPFN0cmluZywgRW50cnk8VGl0YW5QcmVkaWNhdGUsIE9iamVjdD4+IHByb3BzLCBDbGFzczxUPiBjbGF6eikgeworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQl0cnkgeworCQkJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlUaXRhbkdyYXBoUXVlcnk8PyBleHRlbmRzIFRpdGFuR3JhcGhRdWVyeT4gcXVlcnkgPSB0R3JhcGgucXVlcnkoKTsKKwkJCQlxdWVyeSA9IHF1ZXJ5LmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIHR5cGUuZ2V0TmFtZSgpKTsKKworCQkJCWlmIChwcm9wcyAhPSBudWxsICYmICFwcm9wcy5pc0VtcHR5KCkpIHsKKwkJCQkJVGl0YW5QcmVkaWNhdGUgcHJlZGljYXRlID0gbnVsbDsKKwkJCQkJT2JqZWN0IG9iamVjdCA9IG51bGw7CisJCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgRW50cnk8VGl0YW5QcmVkaWNhdGUsIE9iamVjdD4+IGVudHJ5IDogcHJvcHMuZW50cnlTZXQoKSkgeworCQkJCQkJcHJlZGljYXRlID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRLZXkoKTsKKwkJCQkJCW9iamVjdCA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0VmFsdWUoKTsKKwkJCQkJCXF1ZXJ5ID0gcXVlcnkuaGFzKGVudHJ5LmdldEtleSgpLCBwcmVkaWNhdGUsIG9iamVjdCk7CisJCQkJCX0KKwkJCQl9CisJCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gcXVlcnkudmVydGljZXMoKTsKKwkJCQlpZiAodmVydGljZXMgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJfQorCisJCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKworCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld1Byb3AgPSBnZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisJCQkJCVQgZWxlbWVudCA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgbmV3UHJvcCwgY2xhenopOworCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOworCQkJCX0KKwkJCQlpZiAocmVzdWx0LnNpemUoKSA9PSAwKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQl9CisJCQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJCWxvZ2dlci5kZWJ1ZygiTm8gbm9kZXMgaW4gZ3JhcGggZm9yIGNyaXRlcmlhIDogZnJvbSB0eXBlID0ge30gYW5kIHByb3BlcnRpZXMgPSB7fSIsIHR5cGUsIHByb3BzKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCAgZ2V0IGJ5ICBjcml0ZXJpYSBmb3IgdHlwZSA9IHt9IGFtZCBwcm9wZXJ0aWVzID0ge30uIGVycm9yOiB7fSIsIHR5cGUsIHByb3BzLCBlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbkdyYXBoQ2xpZW50LmhhbmRsZVRpdGFuRXhjZXB0aW9uKGUpKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgIGdldCBieSAgY3JpdGVyaWEgZm9yIHR5cGUgPSB7fSBhbmQgcHJvcGVydGllcyA9IHt9LiBlcnJvciA6IHt9IiwgdHlwZSwgcHJvcHMsIGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxMaXN0PFQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsKE5vZGVUeXBlRW51bSB0eXBlLCBDbGFzczxUPiBjbGF6eikgeworCQlyZXR1cm4gZ2V0QnlDcml0ZXJpYSh0eXBlLCBudWxsLCBjbGF6eik7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcGFyYW0gY2xhenoKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8VCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUoR3JhcGhOb2RlIG5vZGUsIENsYXNzPFQ+IGNsYXp6KSB7CisJCWxvZ2dlci5kZWJ1ZygiVHJ5IHRvIHVwZGF0ZSBub2RlIGZvciB7fSIsIG5vZGUuZ2V0S2V5VmFsdWVJZCgpKTsKKworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZUlkID0gbm9kZS5nZXRLZXlWYWx1ZUlkKCk7CisJCUVpdGhlcjxWZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhCeVByb3BlcnR5ID0gZ2V0VmVydGV4QnlQcm9wZXJ0eUFuZExhYmVsKGtleVZhbHVlSWQuZ2V0S2V5KCksIGtleVZhbHVlSWQuZ2V0VmFsdWUoKSwgbm9kZS5nZXRMYWJlbCgpKTsKKworCQlpZiAodmVydGV4QnlQcm9wZXJ0eS5pc0xlZnQoKSkgeworCQkJdHJ5IHsKKwkJCQlWZXJ0ZXggdmVydGV4ID0gdmVydGV4QnlQcm9wZXJ0eS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwUHJvcHMgPSBub2RlLnRvR3JhcGhNYXAoKTsKKworCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IG1hcFByb3BzLmVudHJ5U2V0KCkpIHsKKwkJCQkJaWYgKCFlbnRyeS5nZXRLZXkoKS5lcXVhbHMobm9kZS5nZXRVbmlxdWVJZEtleSgpKSkgeworCQkJCQkJdmVydGV4LnByb3BlcnR5KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCUVpdGhlcjxWZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhCeVByb3BlcnR5QW5kTGFiZWwgPSBnZXRWZXJ0ZXhCeVByb3BlcnR5QW5kTGFiZWwoa2V5VmFsdWVJZC5nZXRLZXkoKSwga2V5VmFsdWVJZC5nZXRWYWx1ZSgpLCBub2RlLmdldExhYmVsKCkpOworCQkJCWlmICh2ZXJ0ZXhCeVByb3BlcnR5QW5kTGFiZWwuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmVydGV4QnlQcm9wZXJ0eUFuZExhYmVsLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBuZXdQcm9wID0gZ2V0UHJvcGVydGllcyh2ZXJ0ZXhCeVByb3BlcnR5QW5kTGFiZWwubGVmdCgpLnZhbHVlKCkpOworCQkJCQlUIHVwZGF0ZU5vZGUgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQobm9kZS5nZXRMYWJlbCgpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBuZXdQcm9wLCBjbGF6eik7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVOb2RlKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgbm9kZSBmb3Ige30iLCBub2RlLmdldEtleVZhbHVlSWQoKSwgZSk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgbm9kZSBmb3Ige30gZXJyb3IgOnt9Iiwgbm9kZS5nZXRLZXlWYWx1ZUlkKCksIHZlcnRleEJ5UHJvcGVydHkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmVydGV4QnlQcm9wZXJ0eS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgdXBkYXRlVmVydGV4KEdyYXBoTm9kZSBub2RlLCBUaXRhblZlcnRleCB2ZXJ0ZXgpIHsKKwkJbG9nZ2VyLmRlYnVnKCJUcnkgdG8gdXBkYXRlIG5vZGUgZm9yIHt9Iiwgbm9kZS5nZXRLZXlWYWx1ZUlkKCkpOworCQl0cnkgeworCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcFByb3BzID0gbm9kZS50b0dyYXBoTWFwKCk7CisKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IG1hcFByb3BzLmVudHJ5U2V0KCkpIHsKKwkJCQlpZiAoIWVudHJ5LmdldEtleSgpLmVxdWFscyhub2RlLmdldFVuaXF1ZUlkS2V5KCkpKSB7CisJCQkJCXZlcnRleC5wcm9wZXJ0eShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJfQorCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgbm9kZSBmb3Ige30iLCBub2RlLmdldEtleVZhbHVlSWQoKSwgZSk7CisJCQl9CisJCQlyZXR1cm4gVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKTsKKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZQorCSAqIEBwYXJhbSBjbGF6egorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxULCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTm9kZShHcmFwaE5vZGUgbm9kZSwgQ2xhc3M8VD4gY2xhenopIHsKKwkJbG9nZ2VyLmRlYnVnKCJUcnkgdG8gZGVsZXRlIG5vZGUgZm9yIHt9Iiwgbm9kZS5nZXRLZXlWYWx1ZUlkKCkpOworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZUlkID0gbm9kZS5nZXRLZXlWYWx1ZUlkKCk7CisJCXJldHVybiBkZWxldGVOb2RlKGtleVZhbHVlSWQuZ2V0S2V5KCksIGtleVZhbHVlSWQuZ2V0VmFsdWUoKSwgY2xhenopOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBrZXlOYW1lCisJICogQHBhcmFtIGtleVZhbHVlCisJICogQHBhcmFtIGNsYXp6CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPFQsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVOb2RlKFN0cmluZyBrZXlOYW1lLCBPYmplY3Qga2V5VmFsdWUsIENsYXNzPFQ+IGNsYXp6KSB7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleEJ5UHJvcGVydHkgPSBnZXRWZXJ0ZXhCeVByb3BlcnR5KGtleU5hbWUsIGtleVZhbHVlKTsKKworCQlpZiAodmVydGV4QnlQcm9wZXJ0eS5pc0xlZnQoKSkgeworCQkJdHJ5IHsKKwkJCQlWZXJ0ZXggdmVydGV4ID0gdmVydGV4QnlQcm9wZXJ0eS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXModmVydGV4KTsKKwkJCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBsYWJlbCA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSk7CisKKwkJCQkJVCBub2RlID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KGxhYmVsLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBwcm9wZXJ0aWVzLCBjbGF6eik7CisJCQkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQkJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkNsaWVudC5nZXRHcmFwaCgpOworCQkJCQkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQkJCQkJVGl0YW5HcmFwaCB0R3JhcGggPSBncmFwaC5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJCQl2ZXJ0ZXgucmVtb3ZlKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBFaXRoZXIubGVmdChub2RlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBub2RlIGZvciB7fSA9IHt9LiBNaXNzaW5nIGxhYmVsIHByb3BlcnR5IG9uIG5vZGUiLCBrZXlOYW1lLCBrZXlWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk1JU1NJTkdfTk9ERV9MQUJFTCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBub2RlIGZvciB7fSA9IHt9LiBNaXNzaW5nIGxhYmVsIHByb3BlcnR5IG9uIG5vZGUiLCBrZXlOYW1lLCBrZXlWYWx1ZSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5NSVNTSU5HX05PREVfTEFCRUwpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBub2RlIGZvciB7fSA9IHt9LiBlcnJvcjoge30iLCBrZXlOYW1lLCBrZXlWYWx1ZSwgZSk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmVydGV4QnlQcm9wZXJ0eS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVsYXRpb24oR3JhcGhSZWxhdGlvbiByZWxhdGlvbikgeworCQlsb2dnZXIuZGVidWcoInRyeSB0byBkZWxldGUgcmVsYXRpb24gZnJvbSBbe31dIHRvIFt7fV0iLCByZWxhdGlvbi5nZXRGcm9tKCksIHJlbGF0aW9uLmdldFRvKCkpOworCQlSZWxhdGlvbkVuZFBvaW50IGZyb20gPSByZWxhdGlvbi5nZXRGcm9tKCk7CisJCVJlbGF0aW9uRW5kUG9pbnQgdG8gPSByZWxhdGlvbi5nZXRUbygpOworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBmcm9tS2V5SWQgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4oZnJvbS5nZXRJZE5hbWUoKSwgZnJvbS5nZXRJZFZhbHVlKCkpOworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiB0b0tleUlkID0gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+KHRvLmdldElkTmFtZSgpLCB0by5nZXRJZFZhbHVlKCkpOworCisJCXJldHVybiBkZWxldGVFZGdlKHJlbGF0aW9uLmdldFR5cGUoKSwgZnJvbUtleUlkLCB0b0tleUlkLCBmcm9tLmdldExhYmVsKCkuZ2V0TmFtZSgpLCB0by5nZXRMYWJlbCgpLmdldE5hbWUoKSk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZWxhdGlvbihHcmFwaE5vZGUgZnJvbSwgR3JhcGhOb2RlIHRvLCBHcmFwaEVkZ2VMYWJlbHMgbGFiZWwpIHsKKwkJbG9nZ2VyLmRlYnVnKCJ0cnkgdG8gZGVsZXRlIHJlbGF0aW9uIGZyb20gW3t9XSB0byBbe31dIiwgZnJvbS5nZXRLZXlWYWx1ZUlkKCksIHRvLmdldEtleVZhbHVlSWQoKSk7CisJCXJldHVybiBkZWxldGVFZGdlKGxhYmVsLmdldFByb3BlcnR5KCksIGZyb20uZ2V0S2V5VmFsdWVJZCgpLCB0by5nZXRLZXlWYWx1ZUlkKCksIGZyb20uZ2V0TGFiZWwoKSwgdG8uZ2V0TGFiZWwoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUVkZ2UoU3RyaW5nIHR5cGUsIEltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IGZyb21LZXlJZCwgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4gdG9LZXlJZCwgU3RyaW5nIGZyb21MYWJlbCwgU3RyaW5nIHRvTGFiZWwpIHsKKwkJRWl0aGVyPEVkZ2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlZGdlUyA9IGdldEVkZ2VCeVZlcnRpY2llcyhmcm9tS2V5SWQuZ2V0S2V5KCksIGZyb21LZXlJZC5nZXRWYWx1ZSgpLCB0b0tleUlkLmdldEtleSgpLCB0b0tleUlkLmdldFZhbHVlKCksIHR5cGUpOworCQlpZiAoZWRnZVMuaXNMZWZ0KCkpIHsKKwkJCXRyeSB7CisJCQkJRWRnZSBlZGdlID0gZWRnZVMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlWZXJ0ZXggdmVydGV4T3V0ID0gZWRnZS5vdXRWZXJ0ZXgoKTsKKwkJCQlWZXJ0ZXggdmVydGV4SW4gPSBlZGdlLmluVmVydGV4KCk7CisKKwkJCQlHcmFwaE5vZGUgbm9kZU91dCA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudChmcm9tTGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIGdldFByb3BlcnRpZXModmVydGV4T3V0KSwgR3JhcGhOb2RlLmNsYXNzKTsKKwkJCQlHcmFwaE5vZGUgbm9kZUluID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHRvTGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIGdldFByb3BlcnRpZXModmVydGV4SW4pLCBHcmFwaE5vZGUuY2xhc3MpOworCisJCQkJR3JhcGhSZWxhdGlvbiBuZXdSZWxhdGlvbiA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlUmVsYXRpb24oZWRnZS5sYWJlbCgpLCBnZXRQcm9wZXJ0aWVzKGVkZ2UpLCBub2RlT3V0LCBub2RlSW4pOworCisJCQkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaCA9IHRpdGFuQ2xpZW50LmdldEdyYXBoKCk7CisKKwkJCQlpZiAoZ3JhcGguaXNMZWZ0KCkpIHsKKwkJCQkJZWRnZS5yZW1vdmUoKTsKKwkJCQkJOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIHJlbGF0aW9uIHt9IGZyb20ge30gdG8ge30uIGVycm9yOiB7fSIsIHR5cGUsIGZyb21LZXlJZCwgdG9LZXlJZCwgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXdSZWxhdGlvbik7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgcmVsYXRpb24ge30gZnJvbSB7fSB0byB7fS4gZXJyb3I6IHt9IiwgdHlwZSwgZnJvbUtleUlkLCB0b0tleUlkLCBlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbkdyYXBoQ2xpZW50LmhhbmRsZVRpdGFuRXhjZXB0aW9uKGUpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSByZWxhdGlvbiB7fSBmcm9tIHt9IHRvIHt9LiBlcnJvcjoge30iLCB0eXBlLCBmcm9tS2V5SWQsIHRvS2V5SWQsIGVkZ2VTLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVkZ2VTLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaXRhbkdyYXBoQ2xpZW50KFRpdGFuR3JhcGhDbGllbnQgdGl0YW5HcmFwaENsaWVudCkgeworCQl0aGlzLnRpdGFuQ2xpZW50ID0gdGl0YW5HcmFwaENsaWVudDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVJbmNvbWluZ1JlbGF0aW9uKEdyYXBoUmVsYXRpb24gcmVsYXRpb24pIHsKKworCQlSZWxhdGlvbkVuZFBvaW50IHRvID0gcmVsYXRpb24uZ2V0VG8oKTsKKwkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4gdG9LZXlJZCA9IG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0Pih0by5nZXRJZE5hbWUoKSwgdG8uZ2V0SWRWYWx1ZSgpKTsKKworCQlyZXR1cm4gZGVsZXRlSW5jb21pbmdFZGdlKHJlbGF0aW9uLmdldFR5cGUoKSwgdG9LZXlJZCk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlSW5jb21pbmdFZGdlKFN0cmluZyB0eXBlLCBJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiB0b0tleUlkKSB7CisKKwkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaCA9IHRpdGFuQ2xpZW50LmdldEdyYXBoKCk7CisKKwkJaWYgKGdyYXBoLmlzTGVmdCgpKSB7CisJCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByb290VmVydGV4UmVzdWx0ID0gZ2V0VmVydGV4QnlQcm9wZXJ0eSh0b0tleUlkLmdldEtleSgpLCB0b0tleUlkLmdldFZhbHVlKCkpOworCQkJaWYgKHJvb3RWZXJ0ZXhSZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQlWZXJ0ZXggcm9vdFZlcnRleCA9IHJvb3RWZXJ0ZXhSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJSXRlcmF0b3I8RWRnZT4gZWRnZXNJdGVyYXRvciA9IHJvb3RWZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLklOLCB0eXBlKTsKKwkJCQlpZiAoZWRnZXNJdGVyYXRvciAhPSBudWxsKSB7CisKKwkJCQkJRWRnZSBlZGdlID0gbnVsbDsKKworCQkJCQlpZiAoZWRnZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJCWVkZ2UgPSBlZGdlc0l0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCWlmIChlZGdlc0l0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTVVMVElQTEVfRURHRVNfV0lUSF9TQU1FX0xBQkVMKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQkJfQorCisJCQkJCWxvZ2dlci5kZWJ1ZygiRmluZCB0aGUgdGFpbCB2ZXJ0ZXggb2YgdGhlIGVkZ2Ugb2YgdHlwZSB7fSB0byB2ZXJ0ZXgge30iLCB0eXBlLCB0b0tleUlkKTsKKwkJCQkJVmVydGV4IHZlcnRleE91dCA9IGVkZ2Uub3V0VmVydGV4KCk7CisJCQkJCVN0cmluZyBmcm9tTGFiZWwgPSB2ZXJ0ZXhPdXQudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJU3RyaW5nIHRvTGFiZWwgPSByb290VmVydGV4LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSk7CisJCQkJCWxvZ2dlci5kZWJ1ZygiVGhlIGxhYmVsIG9mIHRoZSBvdXRnb2luZyB2ZXJ0ZXggaXMge30iLCBmcm9tTGFiZWwpOworCQkJCQlHcmFwaE5vZGUgbm9kZU91dCA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudChmcm9tTGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIGdldFByb3BlcnRpZXModmVydGV4T3V0KSwgR3JhcGhOb2RlLmNsYXNzKTsKKworCQkJCQlHcmFwaE5vZGUgbm9kZUluID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHRvTGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIGdldFByb3BlcnRpZXMocm9vdFZlcnRleCksIEdyYXBoTm9kZS5jbGFzcyk7CisKKwkJCQkJR3JhcGhSZWxhdGlvbiBuZXdSZWxhdGlvbiA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlUmVsYXRpb24oZWRnZS5sYWJlbCgpLCBnZXRQcm9wZXJ0aWVzKGVkZ2UpLCBub2RlT3V0LCBub2RlSW4pOworCisJCQkJCWVkZ2UucmVtb3ZlKCk7CisKKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ld1JlbGF0aW9uKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU91dGdvaW5nUmVsYXRpb24oR3JhcGhSZWxhdGlvbiByZWxhdGlvbikgeworCisJCVJlbGF0aW9uRW5kUG9pbnQgZnJvbSA9IHJlbGF0aW9uLmdldEZyb20oKTsKKwkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4gZnJvbUtleUlkID0gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+KGZyb20uZ2V0SWROYW1lKCksIGZyb20uZ2V0SWRWYWx1ZSgpKTsKKworCQlyZXR1cm4gZGVsZXRlT3V0Z29pbmdFZGdlKHJlbGF0aW9uLmdldFR5cGUoKSwgZnJvbUtleUlkKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVPdXRnb2luZ0VkZ2UoU3RyaW5nIHR5cGUsIEltbXV0YWJsZVBhaXI8U3RyaW5nLCBPYmplY3Q+IHRvS2V5SWQpIHsKKworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKworCQlpZiAoZ3JhcGguaXNMZWZ0KCkpIHsKKwkJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJvb3RWZXJ0ZXhSZXN1bHQgPSBnZXRWZXJ0ZXhCeVByb3BlcnR5KHRvS2V5SWQuZ2V0S2V5KCksIHRvS2V5SWQuZ2V0VmFsdWUoKSk7CisJCQlpZiAocm9vdFZlcnRleFJlc3VsdC5pc0xlZnQoKSkgeworCQkJCVZlcnRleCByb290VmVydGV4ID0gcm9vdFZlcnRleFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlJdGVyYXRvcjxFZGdlPiBlZGdlc0l0ZXJhdG9yID0gcm9vdFZlcnRleC5lZGdlcyhEaXJlY3Rpb24uT1VULCB0eXBlKTsKKwkJCQlpZiAoZWRnZXNJdGVyYXRvciAhPSBudWxsKSB7CisKKwkJCQkJRWRnZSBlZGdlID0gbnVsbDsKKworCQkJCQlpZiAoZWRnZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJCWVkZ2UgPSBlZGdlc0l0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCWlmIChlZGdlc0l0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTVVMVElQTEVfRURHRVNfV0lUSF9TQU1FX0xBQkVMKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQkJfQorCisJCQkJCWxvZ2dlci5kZWJ1ZygiRmluZCB0aGUgdGFpbCB2ZXJ0ZXggb2YgdGhlIGVkZ2Ugb2YgdHlwZSB7fSAgdG8gdmVydGV4ICIsIHR5cGUsIHRvS2V5SWQpOworCQkJCQlWZXJ0ZXggdmVydGV4SW4gPSBlZGdlLmluVmVydGV4KCk7CisJCQkJCVN0cmluZyB0b0xhYmVsID0gdmVydGV4SW4udmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJU3RyaW5nIGZyb21MYWJlbCA9IHJvb3RWZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJbG9nZ2VyLmRlYnVnKCJUaGUgbGFiZWwgb2YgdGhlIHRhaWwgdmVydGV4IGlzIHt9IiwgdG9MYWJlbCk7CisJCQkJCUdyYXBoTm9kZSBub2RlRnJvbSA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudChmcm9tTGFiZWwsIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIGdldFByb3BlcnRpZXMocm9vdFZlcnRleCksIEdyYXBoTm9kZS5jbGFzcyk7CisKKwkJCQkJR3JhcGhOb2RlIG5vZGVUbyA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudCh0b0xhYmVsLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBnZXRQcm9wZXJ0aWVzKHZlcnRleEluKSwgR3JhcGhOb2RlLmNsYXNzKTsKKworCQkJCQlHcmFwaFJlbGF0aW9uIG5ld1JlbGF0aW9uID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVSZWxhdGlvbihlZGdlLmxhYmVsKCksIGdldFByb3BlcnRpZXMoZWRnZSksIG5vZGVGcm9tLCBub2RlVG8pOworCisJCQkJCWVkZ2UucmVtb3ZlKCk7CisKKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ld1JlbGF0aW9uKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gaWQKKwkgKiBAcmV0dXJuCisJICovCisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgbG9ja0VsZW1lbnQoU3RyaW5nIGlkLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCisJCVN0cmluZ0J1ZmZlciBsb2NrSWQgPSBuZXcgU3RyaW5nQnVmZmVyKExPQ0tfTk9ERV9QUkVGSVgpOworCQlsb2NrSWQuYXBwZW5kKHR5cGUuZ2V0TmFtZSgpKS5hcHBlbmQoIl8iKS5hcHBlbmQoaWQpOworCQlyZXR1cm4gbG9ja05vZGUobG9ja0lkLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBsb2NrRWxlbWVudChHcmFwaE5vZGUgbm9kZSkgeworCisJCVN0cmluZ0J1ZmZlciBsb2NrSWQgPSBjcmVhdGVMb2NrRWxlbWVudElkKG5vZGUpOworCisJCXJldHVybiBsb2NrTm9kZShsb2NrSWQudG9TdHJpbmcoKSk7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBsb2NrTm9kZShTdHJpbmcgbG9ja0lkKSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJCUdyYXBoTm9kZUxvY2sgbG9ja05vZGUgPSBuZXcgR3JhcGhOb2RlTG9jayhsb2NrSWQpOworCisJCUVpdGhlcjxHcmFwaE5vZGVMb2NrLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbG9ja05vZGVOZXcgPSBjcmVhdGVOb2RlKGxvY2tOb2RlLCBHcmFwaE5vZGVMb2NrLmNsYXNzKTsKKwkJaWYgKGxvY2tOb2RlTmV3LmlzTGVmdCgpKSB7CisJCQlsb2dnZXIuZGVidWcoImJlZm9yZSBjb21taXQsIExvY2sgbm9kZSBjcmVhdGVkIGZvciB7fSIsIGxvY2tJZCk7CisJCQlyZXR1cm4gdGl0YW5DbGllbnQuY29tbWl0KCk7CisJCX0gZWxzZSB7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwkJCWlmIChncmFwaC5pc0xlZnQoKSkgeworCQkJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisJCQkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4ID0gZ2V0VmVydGV4QnlQcm9wZXJ0eShsb2NrTm9kZS5nZXRVbmlxdWVJZEtleSgpLCBsb2NrTm9kZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlpZiAodmVydGV4LmlzTGVmdCgpKSB7CisJCQkJCXN0YXR1cyA9IHJlbG9ja05vZGUobG9ja05vZGUsIGxvY2tOb2RlTmV3LCB0R3JhcGgsIHZlcnRleCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RhdHVzID0gdmVydGV4LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IGdyYXBoLnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVsb2NrTm9kZShHcmFwaE5vZGVMb2NrIGxvY2tOb2RlLCBFaXRoZXI8R3JhcGhOb2RlTG9jaywgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGxvY2tOb2RlTmV3LCBUaXRhbkdyYXBoIHRHcmFwaCwgRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4KSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQlMb25nIHRpbWUgPSB2ZXJ0ZXgubGVmdCgpLnZhbHVlKCkudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpOworCQlMb25nIGxvY2tUaW1lb3V0ID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0VGl0YW5Mb2NrVGltZW91dCgpOworCQlpZiAodGltZSArIGxvY2tUaW1lb3V0ICogMTAwMCA8IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSB7CisJCQlsb2dnZXIuZGVidWcoIkZvdW5kIG5vdCByZWxlYXNlZCBsb2NrIG5vZGUgd2l0aCBpZCB7fSIsIGxvY2tOb2RlLmdldFVuaXF1ZUlkKCkpOworCQkJdmVydGV4LmxlZnQoKS52YWx1ZSgpLnJlbW92ZSgpOworCQkJbG9ja05vZGVOZXcgPSBjcmVhdGVOb2RlKGxvY2tOb2RlLCBHcmFwaE5vZGVMb2NrLmNsYXNzKTsKKwkJCWlmIChsb2NrTm9kZU5ldy5pc0xlZnQoKSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiTG9jayBub2RlIGNyZWF0ZWQgZm9yIHt9IiwgbG9ja05vZGUuZ2V0VW5pcXVlSWRLZXkoKSk7CisJCQkJcmV0dXJuIHRpdGFuQ2xpZW50LmNvbW1pdCgpOworCQkJfSBlbHNlIHsKKwkJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCBMb2NrIG5vZGUgZm9yIHt9IC4gIENvbW1pdCB0cmFuc2FjdG9uIGZvciBkZWxldGVkIHByZXZpb3VzIHZlcnRleCAuIiwgbG9ja05vZGUuZ2V0VW5pcXVlSWRLZXkoKSk7CisJCQkJdGl0YW5DbGllbnQuY29tbWl0KCk7CisJCQkJc3RhdHVzID0gY2hlY2tMb2NrRXJyb3IobG9ja05vZGUuZ2V0VW5pcXVlSWRLZXkoKSwgbG9ja05vZGVOZXcpOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nZ2VyLmRlYnVnKCJGYWlsZWQgTG9jayBub2RlIGZvciB7fSAgcm9sbGJhY2sgdHJhbnNhY3RvbiIsIGxvY2tOb2RlLmdldFVuaXF1ZUlkS2V5KCkpOworCQkJdGl0YW5DbGllbnQucm9sbGJhY2soKTsKKwkJCXN0YXR1cyA9IGNoZWNrTG9ja0Vycm9yKGxvY2tOb2RlLmdldFVuaXF1ZUlkS2V5KCksIGxvY2tOb2RlTmV3KTsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENoaWxkcmVuTm9kZXMoU3RyaW5nIGtleSwgU3RyaW5nIHVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIENsYXNzPFQ+IGNsYXp6LCBib29sZWFuIHdpdGhFZGdlcykgeworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiBpbW11dGFibGVQYWlycyA9IG5ldyBBcnJheUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PigpOworCisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXMgPSB0aXRhbkNsaWVudC5nZXRHcmFwaCgpOworCQlpZiAoZ3JhcGhSZXMuaXNSaWdodCgpKSB7CisJCQlsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byByZXRyaWV2ZSBncmFwaC4gc3RhdHVzIGlzIHt9IiwgZ3JhcGhSZXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXMubGVmdCgpLnZhbHVlKCk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkuaGFzKGtleSwgdW5pcXVlSWQpLnZlcnRpY2VzKCk7CisJCWlmICh2ZXJ0aWNlcyA9PSBudWxsIHx8IGZhbHNlID09IHZlcnRpY2VzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQl9CisKKwkJVmVydGV4IHJvb3RWZXJ0ZXggPSB2ZXJ0aWNlcy5pdGVyYXRvcigpLm5leHQoKTsKKworCQlJdGVyYXRvcjxFZGdlPiBlZGdlc0NyZWF0b3JJdGVyYXRvciA9IHJvb3RWZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLk9VVCwgZWRnZVR5cGUuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChlZGdlc0NyZWF0b3JJdGVyYXRvciAhPSBudWxsKSB7CisJCQl3aGlsZSAoZWRnZXNDcmVhdG9ySXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJRWRnZSBlZGdlID0gZWRnZXNDcmVhdG9ySXRlcmF0b3IubmV4dCgpOworCQkJCUdyYXBoRWRnZSBncmFwaEVkZ2UgPSBudWxsOworCisJCQkJaWYgKHdpdGhFZGdlcykgeworCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVkZ2VQcm9wcyA9IGdldFByb3BlcnRpZXMoZWRnZSk7CisJCQkJCUdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZUZyb21HcmFwaCA9IEdyYXBoRWRnZUxhYmVscy5nZXRCeU5hbWUoZWRnZS5sYWJlbCgpKTsKKwkJCQkJZ3JhcGhFZGdlID0gbmV3IEdyYXBoRWRnZShlZGdlVHlwZUZyb21HcmFwaCwgZWRnZVByb3BzKTsKKwkJCQl9CisKKwkJCQlWZXJ0ZXggb3V0Z29pbmdWZXJ0ZXggPSBlZGdlLmluVmVydGV4KCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyhvdXRnb2luZ1ZlcnRleCk7CisJCQkJVCBkYXRhID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KG5vZGVUeXBlRW51bS5nZXROYW1lKCksIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIHByb3BlcnRpZXMsIGNsYXp6KTsKKworCQkJCUltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPiBpbW11dGFibGVQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPihjbGF6ei5jYXN0KGRhdGEpLCBncmFwaEVkZ2UpOworCQkJCWltbXV0YWJsZVBhaXJzLmFkZChpbW11dGFibGVQYWlyKTsKKwkJCX0KKwkJfQorCisJCWlmICh0cnVlID09IGltbXV0YWJsZVBhaXJzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGltbXV0YWJsZVBhaXJzKTsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDaGlsZHJlblZlcnRlY2llcyhTdHJpbmcga2V5LCBTdHJpbmcgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZSkgeworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4+IGltbXV0YWJsZVBhaXJzID0gbmV3IEFycmF5TGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPj4oKTsKKworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoUmVzLmlzUmlnaHQoKSkgeworCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gcmV0cmlldmUgZ3JhcGguIHN0YXR1cyBpcyB7fSIsIGdyYXBoUmVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGhSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVRpdGFuR3JhcGggdGl0YW5HcmFwaCA9IGdyYXBoUmVzLmxlZnQoKS52YWx1ZSgpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gdGl0YW5HcmFwaC5xdWVyeSgpLmhhcyhrZXksIHVuaXF1ZUlkKS52ZXJ0aWNlcygpOworCQlpZiAodmVydGljZXMgPT0gbnVsbCB8fCBmYWxzZSA9PSB2ZXJ0aWNlcy5pdGVyYXRvcigpLmhhc05leHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJfQorCisJCVZlcnRleCByb290VmVydGV4ID0gdmVydGljZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisKKwkJSXRlcmF0b3I8RWRnZT4gZWRnZXNDcmVhdG9ySXRlcmF0b3IgPSByb290VmVydGV4LmVkZ2VzKERpcmVjdGlvbi5PVVQsIGVkZ2VUeXBlLmdldFByb3BlcnR5KCkpOworCQlpZiAoZWRnZXNDcmVhdG9ySXRlcmF0b3IgIT0gbnVsbCkgeworCQkJd2hpbGUgKGVkZ2VzQ3JlYXRvckl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUVkZ2UgZWRnZSA9IGVkZ2VzQ3JlYXRvckl0ZXJhdG9yLm5leHQoKTsKKwkJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSAoVGl0YW5WZXJ0ZXgpIGVkZ2UuaW5WZXJ0ZXgoKTsKKworCQkJCUltbXV0YWJsZVBhaXI8VGl0YW5WZXJ0ZXgsIEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4odmVydGV4LCBlZGdlKTsKKwkJCQlpbW11dGFibGVQYWlycy5hZGQoaW1tdXRhYmxlUGFpcik7CisJCQl9CisJCX0KKwkJaWYgKHRydWUgPT0gaW1tdXRhYmxlUGFpcnMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW1tdXRhYmxlUGFpcnMpOworCisJfQorCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2hpbGRyZW5Ob2RlcyhTdHJpbmcga2V5LCBTdHJpbmcgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZSwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSwgQ2xhc3M8VD4gY2xhenopIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW5Ob2RlcyhrZXksIHVuaXF1ZUlkLCBlZGdlVHlwZSwgbm9kZVR5cGVFbnVtLCBjbGF6eiwgdHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBjaGVja0xvY2tFcnJvcihTdHJpbmcgbG9ja0lkLCBFaXRoZXI8R3JhcGhOb2RlTG9jaywgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGxvY2tOb2RlTmV3KSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1czsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBsb2NrTm9kZU5ldy5yaWdodCgpLnZhbHVlKCk7CisJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIExvY2sgbm9kZSBmb3Ige30gIGVycm9yID0ge30iLCBsb2NrSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5USVRBTl9TQ0hFTUFfVklPTEFUSU9OKSB8fCBlcnJvci5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVCkpIHsKKwkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLkFMUkVBRFlfTE9DS0VEOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gZXJyb3I7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVsZWFzZUVsZW1lbnQoR3JhcGhOb2RlIG5vZGUpIHsKKwkJU3RyaW5nQnVmZmVyIGxvY2tJZCA9IGNyZWF0ZUxvY2tFbGVtZW50SWQobm9kZSk7CisKKwkJcmV0dXJuIHVubG9ja05vZGUobG9ja0lkKTsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHVubG9ja05vZGUoU3RyaW5nQnVmZmVyIGxvY2tJZCkgeworCQlHcmFwaE5vZGVMb2NrIGxvY2tOb2RlID0gbmV3IEdyYXBoTm9kZUxvY2sobG9ja0lkLnRvU3RyaW5nKCkpOworCisJCUVpdGhlcjxHcmFwaE5vZGVMb2NrLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbG9ja05vZGVOZXcgPSBkZWxldGVOb2RlKGxvY2tOb2RlLCBHcmFwaE5vZGVMb2NrLmNsYXNzKTsKKwkJaWYgKGxvY2tOb2RlTmV3LmlzTGVmdCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIkxvY2sgbm9kZSByZWxlYXNlZCBmb3IgbG9jayBpZCA9IHt9IiwgbG9ja0lkKTsKKwkJCXJldHVybiB0aXRhbkNsaWVudC5jb21taXQoKTsKKwkJfSBlbHNlIHsKKwkJCXRpdGFuQ2xpZW50LnJvbGxiYWNrKCk7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IGxvY2tOb2RlTmV3LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIFJlbGVhc2Ugbm9kZSBmb3IgbG9jayBpZCB7fSBlcnJvciA9IHt9IiwgbG9ja0lkLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVsZWFzZUVsZW1lbnQoU3RyaW5nIGlkLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCQlTdHJpbmdCdWZmZXIgbG9ja0lkID0gbmV3IFN0cmluZ0J1ZmZlcihMT0NLX05PREVfUFJFRklYKTsKKwkJbG9ja0lkLmFwcGVuZCh0eXBlLmdldE5hbWUoKSkuYXBwZW5kKCJfIikuYXBwZW5kKGlkKTsKKwkJcmV0dXJuIHVubG9ja05vZGUobG9ja0lkKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZ0J1ZmZlciBjcmVhdGVMb2NrRWxlbWVudElkKEdyYXBoTm9kZSBub2RlKSB7CisJCVN0cmluZ0J1ZmZlciBsb2NrSWQgPSBuZXcgU3RyaW5nQnVmZmVyKExPQ0tfTk9ERV9QUkVGSVgpOworCQlsb2NrSWQuYXBwZW5kKG5vZGUuZ2V0TGFiZWwoKSkuYXBwZW5kKCJfIikuYXBwZW5kKG5vZGUuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBsb2NrSWQ7CisJfQorCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2hpbGQoU3RyaW5nIGtleSwgU3RyaW5nIHVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIENsYXNzPFQ+IGNsYXp6KSB7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSBnZXRDaGlsZHJlbk5vZGVzKGtleSwgdW5pcXVlSWQsIGVkZ2VUeXBlLCBub2RlVHlwZUVudW0sIGNsYXp6KTsKKworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4+IHZhbHVlID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlpZiAodmFsdWUuc2l6ZSgpID4gMSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5NVUxUSVBMRV9DSElMRFNfV0lUSF9TQU1FX0VER0UpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbHVlLmdldCgwKSk7CisKKwl9CisKKwlwdWJsaWMgSW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4gZ2V0Q2hpbGRWZXJ0ZXgoVGl0YW5WZXJ0ZXggdmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUpIHsKKworCQlJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPiBwYWlyID0gbnVsbDsKKwkJSXRlcmF0b3I8RWRnZT4gZWRnZXMgPSB2ZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLk9VVCwgZWRnZVR5cGUuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChlZGdlcy5oYXNOZXh0KCkpIHsKKwkJCS8vIGdldCBvbmx5IGZpcnN0IGVkZ2UKKwkJCUVkZ2UgZWRnZSA9IGVkZ2VzLm5leHQoKTsKKwkJCXBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4oKFRpdGFuVmVydGV4KSBlZGdlLmluVmVydGV4KCksIGVkZ2UpOworCQl9CisJCXJldHVybiBwYWlyOworCX0KKworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFBhcmVudE5vZGVzKFN0cmluZyBrZXksIFN0cmluZyB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VUeXBlLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtLCBDbGFzczxUPiBjbGF6eikgeworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiBpbW11dGFibGVQYWlycyA9IG5ldyBBcnJheUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PigpOworCisJCVQgZGF0YSA9IG51bGw7CisJCUdyYXBoRWRnZSBncmFwaEVkZ2UgPSBudWxsOworCisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXMgPSB0aXRhbkNsaWVudC5nZXRHcmFwaCgpOworCQlpZiAoZ3JhcGhSZXMuaXNSaWdodCgpKSB7CisJCQlsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byByZXRyaWV2ZSBncmFwaC4gc3RhdHVzIGlzIHt9IiwgZ3JhcGhSZXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXMubGVmdCgpLnZhbHVlKCk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkuaGFzKGtleSwgdW5pcXVlSWQpLnZlcnRpY2VzKCk7CisJCWlmICh2ZXJ0aWNlcyA9PSBudWxsIHx8IGZhbHNlID09IHZlcnRpY2VzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQl9CisKKwkJVmVydGV4IHJvb3RWZXJ0ZXggPSB2ZXJ0aWNlcy5pdGVyYXRvcigpLm5leHQoKTsKKworCQlJdGVyYXRvcjxFZGdlPiBlZGdlc0NyZWF0b3JJdGVyYXRvciA9IHJvb3RWZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLklOLCBlZGdlVHlwZS5uYW1lKCkpOworCQlpZiAoZWRnZXNDcmVhdG9ySXRlcmF0b3IgIT0gbnVsbCkgeworCQkJd2hpbGUgKGVkZ2VzQ3JlYXRvckl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUVkZ2UgZWRnZSA9IGVkZ2VzQ3JlYXRvckl0ZXJhdG9yLm5leHQoKTsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVkZ2VQcm9wcyA9IGdldFByb3BlcnRpZXMoZWRnZSk7CisJCQkJR3JhcGhFZGdlTGFiZWxzIGVkZ2VUeXBlRnJvbUdyYXBoID0gR3JhcGhFZGdlTGFiZWxzLmdldEJ5TmFtZShlZGdlLmxhYmVsKCkpOworCQkJCWdyYXBoRWRnZSA9IG5ldyBHcmFwaEVkZ2UoZWRnZVR5cGVGcm9tR3JhcGgsIGVkZ2VQcm9wcyk7CisKKwkJCQlWZXJ0ZXggb3V0Z29pbmdWZXJ0ZXggPSBlZGdlLm91dFZlcnRleCgpOworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMob3V0Z29pbmdWZXJ0ZXgpOworCQkJCWRhdGEgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQobm9kZVR5cGVFbnVtLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgcHJvcGVydGllcywgY2xhenopOworCisJCQkJSW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+KGNsYXp6LmNhc3QoZGF0YSksIGdyYXBoRWRnZSk7CisJCQkJaW1tdXRhYmxlUGFpcnMuYWRkKGltbXV0YWJsZVBhaXIpOworCQkJfQorCQl9CisKKwkJaWYgKHRydWUgPT0gaW1tdXRhYmxlUGFpcnMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW1tdXRhYmxlUGFpcnMpOworCisJfQorCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UGFyZW50Tm9kZShTdHJpbmcga2V5LCBTdHJpbmcgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZSwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSwgQ2xhc3M8VD4gY2xhenopIHsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZXNSZXMgPSB0aGlzLmdldFBhcmVudE5vZGVzKGtleSwgdW5pcXVlSWQsIGVkZ2VUeXBlLCBub2RlVHlwZUVudW0sIGNsYXp6KTsKKworCQlpZiAocGFyZW50Tm9kZXNSZXMuaXNSaWdodCgpKSB7CisJCQlsb2dnZXIuZGVidWcoImZhaWxlZCB0byBnZXQgZWRnZSBrZXk6e30gdW5pcXVlSWQ6e30gZWRnZVR5cGUge30gbm9kZVR5cGVFbnVtOiB7fSwgcmVhc29uOnt9Iiwga2V5LCB1bmlxdWVJZCwgZWRnZVR5cGUsIG5vZGVUeXBlRW51bSwgcGFyZW50Tm9kZXNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocGFyZW50Tm9kZXNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiB2YWx1ZSA9IHBhcmVudE5vZGVzUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCWlmICh2YWx1ZS5zaXplKCkgPiAxKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk1VTFRJUExFX0NISUxEU19XSVRIX1NBTUVfRURHRSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodmFsdWUuZ2V0KDApKTsKKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDaGlsZEJ5RWRnZUNyaXRlcmlhKFN0cmluZyBrZXksIFN0cmluZyB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VUeXBlLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtLCBDbGFzczxUPiBjbGF6eiwgTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcGVydGllcykgeworCisJCUVpdGhlcjxFZGdlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gb3V0Z29pbmdFZGdlQnlDcml0ZXJpYSA9IGdldE91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEoa2V5LCB1bmlxdWVJZCwgZWRnZVR5cGUsIGVkZ2VQcm9wZXJ0aWVzKTsKKwkJaWYgKG91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBvdXRnb2luZ0VkZ2VCeUNyaXRlcmlhLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZ2dlci5kZWJ1ZygiQ2Fubm90IGZpbmQgb3V0Z29pbmcgZWRnZSBmcm9tIHZlcnRleCB7fSB3aXRoIGxhYmVsIHt9IGFuZCBwcm9wZXJ0aWVzIHt9IiwgdW5pcXVlSWQsIGVkZ2VUeXBlLCBlZGdlUHJvcGVydGllcyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlFZGdlIGVkZ2UgPSBvdXRnb2luZ0VkZ2VCeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVkZ2VQcm9wcyA9IGdldFByb3BlcnRpZXMoZWRnZSk7CisJCUdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZUZyb21HcmFwaCA9IEdyYXBoRWRnZUxhYmVscy5nZXRCeU5hbWUoZWRnZS5sYWJlbCgpKTsKKwkJR3JhcGhFZGdlIGdyYXBoRWRnZSA9IG5ldyBHcmFwaEVkZ2UoZWRnZVR5cGVGcm9tR3JhcGgsIGVkZ2VQcm9wcyk7CisKKwkJVmVydGV4IG91dGdvaW5nVmVydGV4ID0gZWRnZS5pblZlcnRleCgpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKG91dGdvaW5nVmVydGV4KTsKKwkJVCBkYXRhID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KG5vZGVUeXBlRW51bS5nZXROYW1lKCksIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIHByb3BlcnRpZXMsIGNsYXp6KTsKKworCQlJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA9IG5ldyBJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4oY2xhenouY2FzdChkYXRhKSwgZ3JhcGhFZGdlKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW1tdXRhYmxlUGFpcik7CisJfQorCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENoaWxkQnlFZGdlQ3JpdGVyaWEoVGl0YW5WZXJ0ZXggdmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gZWRnZVByb3BlcnRpZXMpIHsKKworCQlFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEgPSBnZXRPdXRnb2luZ0VkZ2VCeUNyaXRlcmlhKHZlcnRleCwgZWRnZVR5cGUsIGVkZ2VQcm9wZXJ0aWVzKTsKKwkJaWYgKG91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBvdXRnb2luZ0VkZ2VCeUNyaXRlcmlhLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZ2dlci5kZWJ1ZygiQ2Fubm90IGZpbmQgb3V0Z29pbmcgZWRnZSBmcm9tIHZlcnRleCB7fSB3aXRoIGxhYmVsIHt9IGFuZCBwcm9wZXJ0aWVzIHt9IiwgdmVydGV4LCBlZGdlVHlwZSwgZWRnZVByb3BlcnRpZXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCUVkZ2UgZWRnZSA9IG91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCk7CisKKwkJVGl0YW5WZXJ0ZXggb3V0Z29pbmdWZXJ0ZXggPSAoVGl0YW5WZXJ0ZXgpIGVkZ2UuaW5WZXJ0ZXgoKTsKKworCQlJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPiBpbW11dGFibGVQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8VGl0YW5WZXJ0ZXgsIEVkZ2U+KG91dGdvaW5nVmVydGV4LCBlZGdlKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW1tdXRhYmxlUGFpcik7CisJfQorCisJcHVibGljIEVpdGhlcjxFZGdlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0T3V0Z29pbmdFZGdlQnlDcml0ZXJpYShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIEdyYXBoRWRnZUxhYmVscyBsYWJlbCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcykgeworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleEZyb20gPSBnZXRWZXJ0ZXhCeVByb3BlcnR5KGtleSwgdmFsdWUpOworCQlpZiAodmVydGV4RnJvbS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHZlcnRleEZyb20ucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJcmV0dXJuIGdldE91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEodmVydGV4RnJvbS5sZWZ0KCkudmFsdWUoKSwgbGFiZWwsIHByb3BzKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEVkZ2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRPdXRnb2luZ0VkZ2VCeUNyaXRlcmlhKFRpdGFuVmVydGV4IHZlcnRleCwgR3JhcGhFZGdlTGFiZWxzIGxhYmVsLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzKSB7CisKKwkJVGl0YW5WZXJ0ZXhRdWVyeTw/PiBxdWVyeSA9IHZlcnRleC5xdWVyeSgpOworCQlxdWVyeSA9IHF1ZXJ5LmRpcmVjdGlvbihEaXJlY3Rpb24uT1VUKS5sYWJlbHMobGFiZWwuZ2V0UHJvcGVydHkoKSk7CisKKwkJaWYgKHByb3BzICE9IG51bGwgJiYgIXByb3BzLmlzRW1wdHkoKSkgeworCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcHJvcHMuZW50cnlTZXQoKSkgeworCQkJCXF1ZXJ5ID0gcXVlcnkuaGFzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlFZGdlIG1hdGNoaW5nRWRnZSA9IG51bGw7CisJCUl0ZXJhYmxlPFRpdGFuRWRnZT4gZWRnZXMgPSBxdWVyeS5lZGdlcygpOworCQlpZiAoZWRnZXMgPT0gbnVsbCkgeworCQkJbG9nZ2VyLmRlYnVnKCJObyBlZGdlcyBpbiBncmFwaCBmb3IgY3JpdGVyaWEiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlJdGVyYXRvcjxUaXRhbkVkZ2U+IGVJdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsKKwkJaWYgKGVJdGVyLmhhc05leHQoKSkgeworCQkJRWRnZSBlZGdlID0gZUl0ZXIubmV4dCgpOworCQkJbWF0Y2hpbmdFZGdlID0gZWRnZTsKKwkJfQorCisJCWlmIChtYXRjaGluZ0VkZ2UgPT0gbnVsbCkgeworCQkJbG9nZ2VyLmRlYnVnKCJObyBlZGdlcyBpbiBncmFwaCBmb3IgY3JpdGVyaWEiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQobWF0Y2hpbmdFZGdlKTsKKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDaGlsZHJlbk5vZGVzKFN0cmluZyBrZXksIFN0cmluZyB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VUeXBlLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtLCBDbGFzczxUPiBjbGF6eikgeworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPj4oKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5Ob2Rlc1JlcyA9IGdldENoaWxkcmVuTm9kZXMoa2V5LCB1bmlxdWVJZCwgZWRnZVR5cGUsIG5vZGVUeXBlRW51bSwgY2xhenopOworCisJCWlmIChjaGlsZHJlbk5vZGVzUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2hpbGRyZW5Ob2Rlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPj4gbGlzdCA9IGNoaWxkcmVuTm9kZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCWZvciAoSW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+IHBhaXIgOiBsaXN0KSB7CisJCQlUIG5vZGUgPSBwYWlyLmdldEtleSgpOworCQkJRWl0aGVyPFQsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVOb2RlUmVzID0gdGhpcy5kZWxldGVOb2RlKG5vZGUsIGNsYXp6KTsKKwkJCWlmIChkZWxldGVOb2RlUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRlbGV0ZU5vZGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSBub2RlIHt9IC4gc3RhdHVzIGlzIHt9Iiwgbm9kZSwgc3RhdHVzKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisJCQlJbW11dGFibGVQYWlyPFQsIEdyYXBoRWRnZT4gZGVsZXRlZFBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+KG5vZGUsIHBhaXIuZ2V0VmFsdWUoKSk7CisJCQlyZXN1bHQuYWRkKGRlbGV0ZWRQYWlyKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhFbGVtZW50IGVsZW1lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgZmFsc2UgPT0gcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKworCQkJT2JqZWN0W10gcHJvcGVydHlLZXlWYWx1ZXMgPSBuZXcgT2JqZWN0W3Byb3BlcnRpZXMuc2l6ZSgpICogMl07CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJCXByb3BlcnR5S2V5VmFsdWVzW2krK10gPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlwcm9wZXJ0eUtleVZhbHVlc1tpKytdID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCX0KKworCQkJRWxlbWVudEhlbHBlci5hdHRhY2hQcm9wZXJ0aWVzKGVsZW1lbnQsIHByb3BlcnR5S2V5VmFsdWVzKTsKKworCQl9CisKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKEVsZW1lbnQgZWxlbWVudCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmtleXMoKSAhPSBudWxsICYmIGVsZW1lbnQua2V5cygpLnNpemUoKSA+IDApIHsKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5PiBwcm9wZXJ0eU1hcCA9IEVsZW1lbnRIZWxwZXIucHJvcGVydHlNYXAoZWxlbWVudCwgZWxlbWVudC5rZXlzKCkudG9BcnJheShuZXcgU3RyaW5nW2VsZW1lbnQua2V5cygpLnNpemUoKV0pKTsKKworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFByb3BlcnR5PiBlbnRyeSA6IHByb3BlcnR5TWFwLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKS52YWx1ZSgpOworCisJCQkJcmVzdWx0LnB1dChrZXksIHZhbHVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoVGl0YW5WZXJ0ZXggdmVydGV4LCBTdHJpbmcga2V5KSB7CisJCVByb3BlcnR5S2V5IHByb3BlcnR5S2V5ID0gdGl0YW5DbGllbnQuZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKS5nZXRQcm9wZXJ0eUtleShrZXkpOworCQlPYmplY3QgdmFsdWUgPSB2ZXJ0ZXgudmFsdWVPck51bGwocHJvcGVydHlLZXkpOworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShFZGdlIGVkZ2UsIFN0cmluZyBrZXkpIHsKKwkJT2JqZWN0IHZhbHVlID0gbnVsbDsKKwkJUHJvcGVydHk8T2JqZWN0PiBwcm9wZXJ0eSA9IGVkZ2UucHJvcGVydHkoa2V5KTsKKwkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKKwkJCXJldHVybiBwcm9wZXJ0eS5vckVsc2UobnVsbCk7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENoaWxkcmVuQnlFZGdlQ3JpdGVyaWEoVmVydGV4IHZlcnRleCwgU3RyaW5nIHZlcnRleFVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGUsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIENsYXNzPFQ+IGNsYXp6LAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcGVydGllcykgeworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlFaXRoZXI8TGlzdDxFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEgPSBnZXRPdXRnb2luZ0VkZ2VzQnlDcml0ZXJpYSh2ZXJ0ZXgsIGVkZ2VUeXBlLCBlZGdlUHJvcGVydGllcyk7CisJCWlmIChvdXRnb2luZ0VkZ2VCeUNyaXRlcmlhLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gb3V0Z29pbmdFZGdlQnlDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2dnZXIuZGVidWcoIkNhbm5vdCBmaW5kIG91dGdvaW5nIGVkZ2UgZnJvbSB2ZXJ0ZXgge30gd2l0aCBsYWJlbCB7fSAgYW5kIHByb3BlcnRpZXMge30iLCB2ZXJ0ZXhVbmlxdWVJZCwgZWRnZVR5cGUsIGVkZ2VQcm9wZXJ0aWVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8RWRnZT4gZWRnZXMgPSBvdXRnb2luZ0VkZ2VCeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoZWRnZXMgIT0gbnVsbCkgeworCQkJZm9yIChFZGdlIGVkZ2UgOiBlZGdlcykgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gZWRnZVByb3BzID0gZ2V0UHJvcGVydGllcyhlZGdlKTsKKwkJCQlHcmFwaEVkZ2VMYWJlbHMgZWRnZVR5cGVGcm9tR3JhcGggPSBHcmFwaEVkZ2VMYWJlbHMuZ2V0QnlOYW1lKGVkZ2UubGFiZWwoKSk7CisJCQkJR3JhcGhFZGdlIGdyYXBoRWRnZSA9IG5ldyBHcmFwaEVkZ2UoZWRnZVR5cGVGcm9tR3JhcGgsIGVkZ2VQcm9wcyk7CisKKwkJCQlWZXJ0ZXggb3V0Z29pbmdWZXJ0ZXggPSBlZGdlLmluVmVydGV4KCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyhvdXRnb2luZ1ZlcnRleCk7CisJCQkJVCBkYXRhID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KG5vZGVUeXBlRW51bS5nZXROYW1lKCksIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIHByb3BlcnRpZXMsIGNsYXp6KTsKKworCQkJCUltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPiBpbW11dGFibGVQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPihjbGF6ei5jYXN0KGRhdGEpLCBncmFwaEVkZ2UpOworCQkJCXJlc3VsdC5hZGQoaW1tdXRhYmxlUGFpcik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8RWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRPdXRnb2luZ0VkZ2VzQnlDcml0ZXJpYShWZXJ0ZXggdmVydGV4RnJvbSwgR3JhcGhFZGdlTGFiZWxzIGxhYmVsLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzKSB7CisKKwkJTGlzdDxFZGdlPiBlZGdlc1Jlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCVRpdGFuVmVydGV4IHRpdGFuVmVydGV4ID0gKFRpdGFuVmVydGV4KSB2ZXJ0ZXhGcm9tOworCQlUaXRhblZlcnRleFF1ZXJ5PD8+IHF1ZXJ5ID0gdGl0YW5WZXJ0ZXgucXVlcnkoKTsKKworCQlxdWVyeSA9IHF1ZXJ5LmRpcmVjdGlvbihEaXJlY3Rpb24uT1VUKS5sYWJlbHMobGFiZWwuZ2V0UHJvcGVydHkoKSk7CisKKwkJaWYgKHByb3BzICE9IG51bGwgJiYgIXByb3BzLmlzRW1wdHkoKSkgeworCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcHJvcHMuZW50cnlTZXQoKSkgeworCQkJCXF1ZXJ5ID0gcXVlcnkuaGFzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCisJCUl0ZXJhYmxlPFRpdGFuRWRnZT4gZWRnZXMgPSBxdWVyeS5lZGdlcygpOworCQlJdGVyYXRvcjxUaXRhbkVkZ2U+IGVJdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsKKwkJaWYgKGVkZ2VzID09IG51bGwgfHwgZmFsc2UgPT0gZUl0ZXIuaGFzTmV4dCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIk5vIGVkZ2VzIGZvdW5kIGluIGdyYXBoIGZvciBjcml0ZXJpYSAobGFiZWwgPSB7fSBwcm9wZXJ0aWVzPXt9KSIsIGxhYmVsLmdldFByb3BlcnR5KCksIHByb3BzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCisJCXdoaWxlIChlSXRlci5oYXNOZXh0KCkpIHsKKwkJCUVkZ2UgZWRnZSA9IGVJdGVyLm5leHQoKTsKKwkJCWVkZ2VzUmVzdWx0LmFkZChlZGdlKTsKKwkJfQorCisJCWlmIChlZGdlc1Jlc3VsdC5pc0VtcHR5KCkpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiTm8gZWRnZXMgZm91bmQgaW4gZ3JhcGggZm9yIGNyaXRlcmlhIChsYWJlbCA9IHt9IHByb3BlcnRpZXM9e30pIiwgbGFiZWwuZ2V0UHJvcGVydHkoKSwgcHJvcHMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChlZGdlc1Jlc3VsdCk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3RpdGFuL1RpdGFuR3JhcGhDbGllbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3RpdGFuL1RpdGFuR3JhcGhDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGEwNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdGl0YW4vVGl0YW5HcmFwaENsaWVudC5qYXZhCkBAIC0wLDAgKzEsODcyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29uZmlndXJhdGlvbi5CYXNlQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuQWN0aW9uRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFbGVtZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5Vc2VyU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZUNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5TZXJ2aWNlQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5JbnZhbGlkRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLkludmFsaWRJREV4Y2VwdGlvbjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlByb3BlcnR5S2V5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuUXVlcnlFeGNlcHRpb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5TY2hlbWFWaW9sYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkZhY3Rvcnk7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaFF1ZXJ5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleFByb3BlcnR5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuc2NoZW1hLkNvbnNpc3RlbmN5TW9kaWZpZXI7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5zY2hlbWEuVGl0YW5HcmFwaEluZGV4OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuc2NoZW1hLlRpdGFuTWFuYWdlbWVudDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLnV0aWwuVGl0YW5DbGVhbnVwOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmRpc2tzdG9yYWdlLlJlc291cmNlVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uZGlza3N0b3JhZ2UubG9ja2luZy5QZXJtYW5lbnRMb2NraW5nRXhjZXB0aW9uOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmdyYXBoZGIuZGF0YWJhc2UuaWRhc3NpZ25lci5JRFBvb2xFeGhhdXN0ZWRFeGNlcHRpb247CisKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJ0aXRhbi1jbGllbnQiKQorcHVibGljIGNsYXNzIFRpdGFuR3JhcGhDbGllbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRpdGFuR3JhcGhDbGllbnQuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgaGVhbHRoTG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoInRpdGFuLmhlYWx0aGNoZWNrIik7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBTFRIX0NIRUNLID0gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5IRUFMVEhfQ0hFQ0suZ2V0UHJvcGVydHkoKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0sgPSAiR09PRCI7CisKKwlwcml2YXRlIGNsYXNzIEhlYWx0aENoZWNrVGFzayBpbXBsZW1lbnRzIENhbGxhYmxlPFZlcnRleD4geworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFZlcnRleCBjYWxsKCkgeworCisJCQlUaXRhblZlcnRleCB2ID0gKFRpdGFuVmVydGV4KSBncmFwaC5xdWVyeSgpLmhhcyhIRUFMVEhfQ0hFQ0ssIE9LKS52ZXJ0aWNlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCQkJVGl0YW5WZXJ0ZXhQcm9wZXJ0eTxTdHJpbmc+IHByb3BlcnR5ID0gdi5wcm9wZXJ0eSgiaGVhbHRoY2hlY2siLCBPSyArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJCWhlYWx0aExvZ2dlci50cmFjZSgiSGVhbHRoIENoZWNrIE5vZGUgRm91bmQuLi57fSIsIHYucHJvcGVydHkoSEVBTFRIX0NIRUNLKSk7CisJCQlncmFwaC50eCgpLmNvbW1pdCgpOworCisJCQkvLyBWZXJ0ZXggdiA9IGdyYXBoLmdldFZlcnRpY2VzKEhFQUxUSF9DSEVDSywgT0spLml0ZXJhdG9yKCkubmV4dCgpOworCQkJLy8gdi5zZXRQcm9wZXJ0eSgiaGVhbHRoY2hlY2siLCBPSyArICJfIiArCisJCQkvLyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCQkvLyBncmFwaC5jb21taXQoKTsKKwkJCS8vIGhlYWx0aExvZ2dlci50cmFjZSgiSGVhbHRoIENoZWNrIE5vZGUKKwkJCS8vIEZvdW5kLi4uIit2LmdldFByb3BlcnR5KEhFQUxUSF9DSEVDSykgKTsKKwkJCXJldHVybiB2OworCQl9CisJfQorCisJcHJpdmF0ZSBjbGFzcyBIZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQloZWFsdGhMb2dnZXIudHJhY2UoIkV4ZWN1dGluZyBUSVRBTiBIZWFsdGggQ2hlY2sgVGFzayAtIFN0YXJ0Iik7CisJCQlib29sZWFuIGhlYWx0aFN0YXR1cyA9IGlzR3JhcGhPcGVuKCk7CisJCQloZWFsdGhMb2dnZXIudHJhY2UoIkV4ZWN1dGluZyBUSVRBTiBIZWFsdGggQ2hlY2sgVGFzayAtIFN0YXR1cyA9IHt9IiwgaGVhbHRoU3RhdHVzKTsKKwkJCWlmIChoZWFsdGhTdGF0dXMgIT0gbGFzdEhlYWx0aFN0YXRlKSB7CisJCQkJbG9nZ2VyLnRyYWNlKCJUSVRBTiAgSGVhbHRoIFN0YXRlIENoYW5nZWQgdG8ge30uIElzc3VpbmcgYWxhcm0gLyByZWNvdmVyeSBhbGFybS4uLiIsIGhlYWx0aFN0YXR1cyk7CisJCQkJbGFzdEhlYWx0aFN0YXRlID0gaGVhbHRoU3RhdHVzOworCQkJCWxvZ0FsYXJtKCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIFJlY29ubmVjdFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlsb2dnZXIudHJhY2UoIlRyeWluZyB0byByZWNvbm5lY3QgdG8gVGl0YW4uLi4iKTsKKwkJCWlmIChncmFwaCA9PSBudWxsKSB7CisJCQkJY3JlYXRlR3JhcGgodGl0YW5DZmdGaWxlLCB0cnVlKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5HcmFwaCBncmFwaDsKKworCS8vIEhlYWx0aCBDaGVjayBWYXJpYWJsZXMKKworCS8qKgorCSAqIFRoaXMgZXhlY3V0b3Igd2lsbCBleGVjdXRlIHRoZSBoZWFsdGggY2hlY2sgdGFzayBvbiBhIGNhbGxhYmxlIHRhc2sgdGhhdAorCSAqIGNhbiBiZSBleGVjdXRlZCB3aXRoIGEgdGltZW91dC4KKwkgKi8KKwlFeGVjdXRvclNlcnZpY2UgaGVhbHRoQ2hlY2tFeGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKwkJCXJldHVybiBuZXcgVGhyZWFkKHIsICJUaXRhbi1IZWFsdGgtQ2hlY2stVGhyZWFkIik7CisJCX0KKwl9KTsKKwlwcml2YXRlIGxvbmcgaGVhbHRoQ2hlY2tSZWFkVGltZW91dCA9IDI7CisJSGVhbHRoQ2hlY2tUYXNrIGhlYWx0aENhbGxhYmxlVGFzayA9IG5ldyBIZWFsdGhDaGVja1Rhc2soKTsKKwlIZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sgaGVhbHRoQ2hlY2tTY2hlZHVsZWRUYXNrID0gbmV3IEhlYWx0aENoZWNrU2NoZWR1bGVkVGFzaygpOworCWJvb2xlYW4gbGFzdEhlYWx0aFN0YXRlID0gZmFsc2U7CisKKwkvLyBSZWNvbm5lY3Rpb24gdmFyaWFibGVzCisJcHJpdmF0ZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgcmVjb25uZWN0U2NoZWR1bGVyID0gbnVsbDsKKwlwcml2YXRlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBoZWFsdGhDaGVja1NjaGVkdWxlciA9IG51bGw7CisJcHJpdmF0ZSBSdW5uYWJsZSByZWNvbm5lY3RUYXNrID0gbnVsbDsKKwlwcml2YXRlIGxvbmcgcmVjb25uZWN0SW50ZXJ2YWwgPSAzOworCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisJcHJpdmF0ZSBGdXR1cmUgcmVjb25uZWN0RnV0dXJlOworCisJcHJpdmF0ZSBTdHJpbmcgdGl0YW5DZmdGaWxlID0gbnVsbDsKKworCXB1YmxpYyBUaXRhbkdyYXBoQ2xpZW50KCkgeworCQlzdXBlcigpOworCisJCS8vIEluaXRpYWxpemUgYSBzaW5nbGUgdGhyZWFkZWQgc2NoZWR1bGVyIGZvciBoZWFsdGgtY2hlY2sKKwkJdGhpcy5oZWFsdGhDaGVja1NjaGVkdWxlciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgeworCQkJCXJldHVybiBuZXcgVGhyZWFkKHIsICJUaXRhbi1IZWFsdGgtQ2hlY2stVGFzayIpOworCQkJfQorCQl9KTsKKworCQloZWFsdGhDaGVja1JlYWRUaW1lb3V0ID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkuZ2V0VGl0YW5IZWFsdGhDaGVja1JlYWRUaW1lb3V0KDIpOworCQlyZWNvbm5lY3RJbnRlcnZhbCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpCisJCQkJLmdldFRpdGFuUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHMoMyk7CisKKwkJbG9nZ2VyLmluZm8oIioqIFRpdGFuR3JhcGhDbGllbnQgY3JlYXRlZCIpOworCX0KKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUdyYXBoKCkgeworCisJCWxvZ2dlci5pbmZvKCIqKiBjcmVhdGVHcmFwaCBzdGFydGVkICoqIik7CisKKwkJaWYgKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFRpdGFuSW5NZW1vcnlHcmFwaCgpKSB7CisJCQlCYXNlQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7CisJCQljb25mLnNldFByb3BlcnR5KCJzdG9yYWdlLmJhY2tlbmQiLCAiaW5tZW1vcnkiKTsKKwkJCWdyYXBoID0gVGl0YW5GYWN0b3J5Lm9wZW4oY29uZik7CisKKwkJCWNyZWF0ZUluZGV4ZXNBbmREZWZhdWx0cygpOworCisJCQlsb2dnZXIuaW5mbygiKiogaW4gbWVtb3J5IGdyYXBoIGNyZWF0ZWQiKTsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfSBlbHNlIHsKKwkJCXRoaXMudGl0YW5DZmdGaWxlID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0VGl0YW5DZmdGaWxlKCk7CisJCQlpZiAodGl0YW5DZmdGaWxlID09IG51bGwgfHwgdGl0YW5DZmdGaWxlLmlzRW1wdHkoKSkgeworCQkJCXRpdGFuQ2ZnRmlsZSA9ICJjb25maWcvdGl0YW4ucHJvcGVydGllcyI7CisJCQl9CisKKwkJCS8vIHlhdml2aQorCQkJLy8gSW4gY2FzZSBjb25uZWN0aW9uIGZhaWxlZCBvbiBpbml0IHRpbWUsIHNjaGVkdWxlIGEgcmVjb25uZWN0IHRhc2sKKwkJCS8vIGluIHRoZSBCRworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlR3JhcGgodGl0YW5DZmdGaWxlKTsKKwkJCWxvZ2dlci5kZWJ1ZygiQ3JlYXRlIFRpdGFuIGdyYXBoIHN0YXR1cyB7fSIsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJdGhpcy5zdGFydFJlY29ubmVjdFRhc2soKTsKKwkJCX0KKworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzdGFydEhlYWx0aENoZWNrVGFzaygpIHsKKwkJdGhpcy5oZWFsdGhDaGVja1NjaGVkdWxlci5zY2hlZHVsZUF0Rml4ZWRSYXRlKGhlYWx0aENoZWNrU2NoZWR1bGVkVGFzaywgMCwgcmVjb25uZWN0SW50ZXJ2YWwsIFRpbWVVbml0LlNFQ09ORFMpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBPTkxZIG9uIGluaXQgdGltZSBpbiBjYXNlIFRpdGFuIHN0b3JhZ2UgaXMKKwkgKiBkb3duLgorCSAqLworCXByaXZhdGUgdm9pZCBzdGFydFJlY29ubmVjdFRhc2soKSB7CisJCXRoaXMucmVjb25uZWN0VGFzayA9IG5ldyBSZWNvbm5lY3RUYXNrKCk7CisJCS8vIEluaXRpYWxpemUgYSBzaW5nbGUgdGhyZWFkZWQgc2NoZWR1bGVyCisJCXRoaXMucmVjb25uZWN0U2NoZWR1bGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7CisJCQkJcmV0dXJuIG5ldyBUaHJlYWQociwgIlRpdGFuLVJlY29ubmVjdC1UYXNrIik7CisJCQl9CisJCX0pOworCisJCWxvZ2dlci5pbmZvKCJTY2hlZHVsaW5nIHJlY29ubmVjdCB0YXNrIHt9IHdpdGggaW50ZXJ2YWwgb2Yge30gc2Vjb25kcyIsIHJlY29ubmVjdFRhc2ssIHJlY29ubmVjdEludGVydmFsKTsKKwkJcmVjb25uZWN0RnV0dXJlID0gdGhpcy5yZWNvbm5lY3RTY2hlZHVsZXIuc2NoZWR1bGVBdEZpeGVkUmF0ZSh0aGlzLnJlY29ubmVjdFRhc2ssIDAsIHRoaXMucmVjb25uZWN0SW50ZXJ2YWwsCisJCQkJVGltZVVuaXQuU0VDT05EUyk7CisJfQorCisJcHVibGljIHZvaWQgY2xlYW51cEdyYXBoKCkgeworCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJLy8gZ3JhcGguc2h1dGRvd24oKTsKKwkJCWdyYXBoLmNsb3NlKCk7CisJCQlUaXRhbkNsZWFudXAuY2xlYXIoZ3JhcGgpOworCQl9CisJfQorCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUdyYXBoKFN0cmluZyB0aXRhbkNmZ0ZpbGUpIHsKKwkJbG9nZ2VyLmluZm8oIioqIGNyZWF0ZUdyYXBoIHdpdGggIiArIHRpdGFuQ2ZnRmlsZSArICIgc3RhcnRlZCIpOworCQlyZXR1cm4gY3JlYXRlR3JhcGgodGl0YW5DZmdGaWxlLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlR3JhcGgoU3RyaW5nIHRpdGFuQ2ZnRmlsZSwgYm9vbGVhbiBpbml0aWFsaXplR3JhcGgpIHsKKwkJbG9nZ2VyLmluZm8oIioqIGNyZWF0ZUdyYXBoIHdpdGggIiArIHRpdGFuQ2ZnRmlsZSArICIgYW5kIGluaXRpYWxpemVHcmFwaD0iICsgaW5pdGlhbGl6ZUdyYXBoICsgIiBzdGFydGVkIik7CisJCXRyeSB7CisJCQlsb2dnZXIuaW5mbygiY3JlYXRlR3JhcGggOiB0cnkgdG8gbG9hZCBmaWxlICIgKyB0aXRhbkNmZ0ZpbGUpOworCQkJZ3JhcGggPSBUaXRhbkZhY3Rvcnkub3Blbih0aXRhbkNmZ0ZpbGUpOworCQkJaWYgKGdyYXBoID09IG51bGwpIHsKKwkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0NSRUFURUQ7CisJCQl9CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRoaXMuZ3JhcGggPSBudWxsOworCQkJbG9nZ2VyLmluZm8oImNyZWF0ZUdyYXBoIDogZmFpbGVkIHRvIG9wZW4gVGl0YW4gZ3JhcGggd2l0aCBjb25maWd1cmF0aW9uIGZpbGU6ICIgKyB0aXRhbkNmZ0ZpbGUpOworCQkJbG9nZ2VyLnRyYWNlKCJjcmVhdGVHcmFwaCA6IGZhaWxlZCB0byBvcGVuIFRpdGFuIGdyYXBoLiAiLCBlKTsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfQ09OTkVDVEVEOworCQl9CisJCWlmICh0cnVlID09IGluaXRpYWxpemVHcmFwaCkgeworCQkJY3JlYXRlSW5kZXhlc0FuZERlZmF1bHRzKCk7CisJCX0KKwkJbG9nZ2VyLmluZm8oIioqIFRpdGFuIGdyYXBoIGNyZWF0ZWQgIik7CisKKwkJLy8gRG8gc29tZSBwb3N0IGNyZWF0aW9uIGFjdGlvbnMKKwkJdGhpcy5vbkdyYXBoT3BlbmVkKCk7CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgdm9pZCBvbkdyYXBoT3BlbmVkKCkgeworCQkvLyBpZiBhIHJlY29ubmVjdCB0YXNrIGlzIHJ1bm5pbmcsIGNhbmNlbCBpdC4KKwkJaWYgKHRoaXMucmVjb25uZWN0RnV0dXJlICE9IG51bGwpIHsKKwkJCWxvZ2dlci5pbmZvKCIqKiBDYW5jZWxsaW5nIFRpdGFuIHJlY29ubmVjdCB0YXNrIik7CisJCQlyZWNvbm5lY3RGdXR1cmUuY2FuY2VsKHRydWUpOworCQl9CisKKwkJLy8gY3JlYXRlIGhlYWx0aC1jaGVjayBub2RlCisJCWlmICghZ3JhcGgucXVlcnkoKS5oYXMoSEVBTFRIX0NIRUNLLCBPSykudmVydGljZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSkgeworCQkJbG9nZ2VyLnRyYWNlKCJIZWFsdGhjaGVjayBTaW5nbGV0b24gbm9kZSBkb2VzIG5vdCBleGlzdCwgQ3JlYXRpbmcgaGVhbHRoY2hlY2sgbm9kZS4uLiIpOworCQkJVmVydGV4IGhlYWx0aENoZWNrTm9kZSA9IGdyYXBoLmFkZFZlcnRleCgpOworCQkJaGVhbHRoQ2hlY2tOb2RlLnByb3BlcnR5KEhFQUxUSF9DSEVDSywgT0spOworCQkJbG9nZ2VyLnRyYWNlKCJIZWFsdGhjaGVjayBub2RlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LiBJRD17fSIsIGhlYWx0aENoZWNrTm9kZS5wcm9wZXJ0eShULmlkLmdldEFjY2Vzc29yKCkpKTsKKwkJCWdyYXBoLnR4KCkuY29tbWl0KCk7CisJCX0gZWxzZSB7CisJCQlsb2dnZXIudHJhY2UoIlNraXBwaW5nIEhlYWx0aGNoZWNrIFNpbmdsZXRvbiBub2RlIGNyZWF0aW9uLiBBbHJlYWR5IGV4aXN0Li4uIik7CisJCX0KKwkJdGhpcy5zdGFydEhlYWx0aENoZWNrVGFzaygpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVJbmRleGVzQW5kRGVmYXVsdHMoKSB7CisJCWNyZWF0ZVZlcnRleEluZGl4ZXMoKTsKKwkJY3JlYXRlRWRnZUluZGl4ZXMoKTsKKwkJY3JlYXRlRGVmYXVsdFVzZXJzKCk7CisJCS8vIGNyZWF0ZUNhdGVnb3JpZXMoKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRHcmFwaCgpIHsKKwkJaWYgKGdyYXBoICE9IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChncmFwaCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9DUkVBVEVEKTsKKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlVmVydGV4SW5kaXhlcygpIHsKKwkJbG9nZ2VyLmluZm8oIioqIGNyZWF0ZVZlcnRleEluZGl4ZXMgc3RhcnRlZCIpOworCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJLy8gVGl0YW5NYW5hZ2VtZW50IGdyYXBoTWd0ID0gZ3JhcGguZ2V0TWFuYWdlbWVudFN5c3RlbSgpOworCQkJVGl0YW5NYW5hZ2VtZW50IGdyYXBoTWd0ID0gZ3JhcGgub3Blbk1hbmFnZW1lbnQoKTsKKwkJCVRpdGFuR3JhcGhJbmRleCBpbmRleCA9IG51bGw7CisJCQlmb3IgKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkgcHJvcCA6IEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkudmFsdWVzKCkpIHsKKwkJCQlQcm9wZXJ0eUtleSBwcm9wS2V5ID0gbnVsbDsKKwkJCQlpZiAoIWdyYXBoTWd0LmNvbnRhaW5zUHJvcGVydHlLZXkocHJvcC5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQlDbGFzczw/PiBjbGF6eiA9IHByb3AuZ2V0Q2xhenooKTsKKwkJCQkJaWYgKCFBcnJheUxpc3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGF6ei5nZXROYW1lKCkpCisJCQkJCQkJJiYgIUhhc2hNYXAuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGF6ei5nZXROYW1lKCkpKSB7CisJCQkJCQlwcm9wS2V5ID0gZ3JhcGhNZ3QubWFrZVByb3BlcnR5S2V5KHByb3AuZ2V0UHJvcGVydHkoKSkuZGF0YVR5cGUocHJvcC5nZXRDbGF6eigpKS5tYWtlKCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwcm9wS2V5ID0gZ3JhcGhNZ3QuZ2V0UHJvcGVydHlLZXkocHJvcC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQl9CisJCQkJaWYgKHByb3AuaXNJbmRleGVkKCkpIHsKKwkJCQkJaWYgKCFncmFwaE1ndC5jb250YWluc0dyYXBoSW5kZXgocHJvcC5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJaWYgKHByb3AuaXNVbmlxdWUoKSkgeworCQkJCQkJCWluZGV4ID0gZ3JhcGhNZ3QuYnVpbGRJbmRleChwcm9wLmdldFByb3BlcnR5KCksIFZlcnRleC5jbGFzcykuYWRkS2V5KHByb3BLZXkpLnVuaXF1ZSgpCisJCQkJCQkJCQkuYnVpbGRDb21wb3NpdGVJbmRleCgpOworCisJCQkJCQkJZ3JhcGhNZ3Quc2V0Q29uc2lzdGVuY3kocHJvcEtleSwgQ29uc2lzdGVuY3lNb2RpZmllci5MT0NLKTsgLy8gRW5zdXJlcworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9ubHkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmUKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcGVyCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmVydGV4CisJCQkJCQkJZ3JhcGhNZ3Quc2V0Q29uc2lzdGVuY3koaW5kZXgsIENvbnNpc3RlbmN5TW9kaWZpZXIuTE9DSyk7IC8vIEVuc3VyZXMKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuYW1lCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdW5pcXVlbmVzcworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGluCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZ3JhcGgKKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlncmFwaE1ndC5idWlsZEluZGV4KHByb3AuZ2V0UHJvcGVydHkoKSwgVmVydGV4LmNsYXNzKS5hZGRLZXkocHJvcEtleSkuYnVpbGRDb21wb3NpdGVJbmRleCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZ3JhcGhNZ3QuY29tbWl0KCk7CisJCQlsb2dnZXIuaW5mbygiKiogY3JlYXRlVmVydGV4SW5kaXhlcyBlbmRlZCIpOworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJCWxvZ2dlci5pbmZvKCIqKiBjcmVhdGVWZXJ0ZXhJbmRpeGVzIGVuZGVkLCBubyBJbmRpeGVzIHdlcmUgY3JlYXRlZC4iKTsKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9DUkVBVEVEOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlRWRnZUluZGl4ZXMoKSB7CisJCWxvZ2dlci5pbmZvKCIqKiBjcmVhdGVFZGdlSW5kaXhlcyBzdGFydGVkIik7CisJCWlmIChncmFwaCAhPSBudWxsKSB7CisJCQkvLyBUaXRhbk1hbmFnZW1lbnQgZ3JhcGhNZ3QgPSBncmFwaC5nZXRNYW5hZ2VtZW50U3lzdGVtKCk7CisJCQlUaXRhbk1hbmFnZW1lbnQgZ3JhcGhNZ3QgPSBncmFwaC5vcGVuTWFuYWdlbWVudCgpOworCQkJZm9yIChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeSBwcm9wIDogR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkudmFsdWVzKCkpIHsKKwkJCQlpZiAoIWdyYXBoTWd0LmNvbnRhaW5zR3JhcGhJbmRleChwcm9wLmdldFByb3BlcnR5KCkpKSB7CisJCQkJCVByb3BlcnR5S2V5IHByb3BLZXkgPSBncmFwaE1ndC5tYWtlUHJvcGVydHlLZXkocHJvcC5nZXRQcm9wZXJ0eSgpKS5kYXRhVHlwZShwcm9wLmdldENsYXp6KCkpLm1ha2UoKTsKKwkJCQkJZ3JhcGhNZ3QuYnVpbGRJbmRleChwcm9wLmdldFByb3BlcnR5KCksIEVkZ2UuY2xhc3MpLmFkZEtleShwcm9wS2V5KS5idWlsZENvbXBvc2l0ZUluZGV4KCk7CisKKwkJCQl9CisJCQl9CisJCQlncmFwaE1ndC5jb21taXQoKTsKKwkJCWxvZ2dlci5pbmZvKCIqKiBjcmVhdGVFZGdlSW5kaXhlcyBlbmRlZCIpOworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJCWxvZ2dlci5pbmZvKCIqKiBjcmVhdGVFZGdlSW5kaXhlcyBlbmRlZCwgbm8gSW5kaXhlcyB3ZXJlIGNyZWF0ZWQuIik7CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfQ1JFQVRFRDsKKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgY29tbWl0KCkgeworCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlncmFwaC50eCgpLmNvbW1pdCgpOworCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIGhhbmRsZVRpdGFuRXhjZXB0aW9uKGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9DUkVBVEVEOworCQl9CisJfQorCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHJvbGxiYWNrKCkgeworCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQkvLyBncmFwaC5yb2xsYmFjaygpOworCQkJCWdyYXBoLnR4KCkucm9sbGJhY2soKTsKKwkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBoYW5kbGVUaXRhbkV4Y2VwdGlvbihlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfQ1JFQVRFRDsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgaGFuZGxlVGl0YW5FeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKwkJaWYgKGUgaW5zdGFuY2VvZiBUaXRhbkNvbmZpZ3VyYXRpb25FeGNlcHRpb24pIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5USVRBTl9DT05GSUdVUkFUSU9OOworCQl9CisJCWlmIChlIGluc3RhbmNlb2YgU2NoZW1hVmlvbGF0aW9uRXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuVElUQU5fU0NIRU1BX1ZJT0xBVElPTjsKKwkJfQorCQlpZiAoZSBpbnN0YW5jZW9mIFBlcm1hbmVudExvY2tpbmdFeGNlcHRpb24pIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5USVRBTl9TQ0hFTUFfVklPTEFUSU9OOworCQl9CisJCWlmIChlIGluc3RhbmNlb2YgSURQb29sRXhoYXVzdGVkRXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCQlpZiAoZSBpbnN0YW5jZW9mIEludmFsaWRFbGVtZW50RXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9FTEVNRU5UOworCQl9CisJCWlmIChlIGluc3RhbmNlb2YgSW52YWxpZElERXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJfQorCQlpZiAoZSBpbnN0YW5jZW9mIFF1ZXJ5RXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9RVUVSWTsKKwkJfQorCQlpZiAoZSBpbnN0YW5jZW9mIFJlc291cmNlVW5hdmFpbGFibGVFeGNlcHRpb24pIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5SRVNPVVJDRV9VTkFWQUlMQUJMRTsKKwkJfQorCQlpZiAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgeworCQkJLy8gVE9ETyBjaGVjayB0aGUgZXJyb3IgbWVzc2FnZT8/CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVDsKKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCX0KKworCXB1YmxpYyBib29sZWFuIGdldEhlYWx0aCgpIHsKKwkJcmV0dXJuIHRoaXMubGFzdEhlYWx0aFN0YXRlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0dyYXBoT3BlbigpIHsKKwkJaGVhbHRoTG9nZ2VyLnRyYWNlKCJJbnZva2luZyBUaXRhbiBoZWFsdGggY2hlY2sgLi4uIik7CisJCVZlcnRleCB2ID0gbnVsbDsKKwkJaWYgKGdyYXBoICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJRnV0dXJlPFZlcnRleD4gZnV0dXJlID0gaGVhbHRoQ2hlY2tFeGVjdXRvci5zdWJtaXQoaGVhbHRoQ2FsbGFibGVUYXNrKTsKKwkJCQl2ID0gZnV0dXJlLmdldCh0aGlzLmhlYWx0aENoZWNrUmVhZFRpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMpOworCQkJCWhlYWx0aExvZ2dlci50cmFjZSgiSGVhbHRoIENoZWNrIE5vZGUgRm91bmQuLi4gIiArIHYucHJvcGVydHkoSEVBTFRIX0NIRUNLKSk7CisJCQkJZ3JhcGgudHgoKS5jb21taXQoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKKwkJCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7CisJCQkJCW1lc3NhZ2UgPSBlLmdldENsYXNzKCkuZ2V0TmFtZSgpOworCQkJCX0KKwkJCQlsb2dnZXIuZXJyb3IoIlRpdGFuIEhlYWx0aCBDaGVjayBGYWlsZWQuICIgKyBtZXNzYWdlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlQ2F0ZWdvcmllcygpIHsKKwkJbG9nZ2VyLmluZm8oIioqIGNyZWF0ZUNhdGVnb3JpZXMgc3RhcnRlZCIpOworCQlpZiAoZ3JhcGggIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlMaXN0PENhdGVnb3J5RGF0YT4gY2F0ZWdvcnlEYXRhTGlzdCA9IGdldERlZmF1bHRSZXNvdXJjZUNhdGVnb3J5TGlzdCgpOworCQkJCWdlbmVyYXRlR3JhcGhDYXRlZ29yaWVzKGNhdGVnb3J5RGF0YUxpc3QsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUNhdGVnb3J5LmdldE5hbWUoKSk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5lcnJvcigiY3JlYXRlQ2F0ZWdvcmllcyA6IGZhaWxlZCB0byBsb2FkIGNhdGVnb3JpZXMgIiwgZSk7CisJCQkJcm9sbGJhY2soKTsKKwkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCX0gZmluYWxseSB7CisJCQkJbG9nZ2VyLmluZm8oIioqIGNyZWF0ZUNhdGVnb3JpZXMgZW5kZWQiKTsKKwkJCQljb21taXQoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlR3JhcGhDYXRlZ29yaWVzKExpc3Q8Q2F0ZWdvcnlEYXRhPiBjYXRlZ29yeURhdGFMaXN0LCBTdHJpbmcgbGFiZWwpIHsKKwkJZm9yIChDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhIDogY2F0ZWdvcnlEYXRhTGlzdCkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gY2F0ZWdvcnlEYXRhLnRvR3JhcGhNYXAoKTsKKwkJCXByb3BlcnRpZXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgbGFiZWwpOworCisJCQkvLyBUaGlzIGlzIHRlbXBvcmFyeSBmb3Igb2xkIG1lY2huaXNtIG9mIGNhdGVnb3JpZXMgLSB0aGV5IGRvbjt0CisJCQkvLyBoYXZlIHRoZSBub3JtIG5hbWUKKwkJCXByb3BlcnRpZXMucmVtb3ZlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLmdldFByb3BlcnR5KCkpOworCisJCQlpZiAoaXNWZXJ0ZXhFeGlzdChwcm9wZXJ0aWVzKSkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJVmVydGV4IHZlcnRleCA9IGdyYXBoLmFkZFZlcnRleCgpOworCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcHJvcGVydGllcy5lbnRyeVNldCgpKSB7CisJCQkJdmVydGV4LnByb3BlcnR5KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgTGlzdDxDYXRlZ29yeURhdGE+IGdldERlZmF1bHRSZXNvdXJjZUNhdGVnb3J5TGlzdCgpIHsKKwkJTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBjYXRlZ29yaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7CisJCWNhdGVnb3JpZXMucHV0KCJOZXR3b3JrIExheWVyIDItMyIsIEFycmF5cy5hc0xpc3QoIlJvdXRlciIsICJHYXRld2F5IiwgIldBTiBDb25uZWN0b3JzIiwgIkxBTiBDb25uZWN0b3JzIikpOworCQljYXRlZ29yaWVzLnB1dCgiTmV0d29yayBMYXllciA0KyIsIEFycmF5cy5hc0xpc3QoIkNvbW1vbiBOZXR3b3JrIFJlc291cmNlcyIpKTsKKwkJY2F0ZWdvcmllcy5wdXQoIkFwcGxpY2F0aW9uIExheWVyIDQrIiwgQXJyYXlzLmFzTGlzdCgiQm9yZGVyIEVsZW1lbnRzIiwgIkFwcGxpY2F0aW9uIFNlcnZlcnMiLCAiV2ViIFNlcnZlciIsCisJCQkJIkNhbGwgQ29udHJvbCIsICJNZWRpYSBTZXJ2ZXJzIiwgIkxvYWQgQmFsYW5jZXIiLCAiRGF0YWJhc2UiKSk7CisJCWNhdGVnb3JpZXMucHV0KCJHZW5lcmljIiwgQXJyYXlzLmFzTGlzdCgiSW5mcmFzdHJ1Y3R1cmUiLCAiQWJzdHJhY3QiLCAiTmV0d29yayBFbGVtZW50cyIsICJEYXRhYmFzZSIpKTsKKworCQlMaXN0PENhdGVnb3J5RGF0YT4gY2F0ZWdvcnlEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2F0ZWdvcnlEYXRhPigpOworCQlDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhID0gbnVsbDsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5TGlzdCA6IGNhdGVnb3JpZXMuZW50cnlTZXQoKSkgeworCQkJZm9yIChTdHJpbmcgdmFsIDogZW50cnlMaXN0LmdldFZhbHVlKCkpIHsKKwkJCQljYXRlZ29yeURhdGEgPSBuZXcgUmVzb3VyY2VDYXRlZ29yeURhdGEoZW50cnlMaXN0LmdldEtleSgpLCB2YWwpOworCQkJCWNhdGVnb3J5RGF0YS5zZXRBY3Rpb24oQWN0aW9uRW51bS5DcmVhdGUpOworCQkJCWNhdGVnb3J5RGF0YS5zZXRFbGVtZW50VHlwZShHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlKTsKKwkJCQkvLyBjYXRlZ29yeURhdGEuc2V0Q2F0ZWdvcnlOYW1lKCk7CisJCQkJLy8gY2F0ZWdvcnlEYXRhLnNldE5hbWUoKTsKKwkJCQljYXRlZ29yeURhdGFMaXN0LmFkZChjYXRlZ29yeURhdGEpOworCQkJfQorCQl9CisJCXJldHVybiBjYXRlZ29yeURhdGFMaXN0OworCX0KKworCXByaXZhdGUgTGlzdDxDYXRlZ29yeURhdGE+IGdldERlZmF1bHRTZXJ2aWNlQ2F0ZWdvcnlMaXN0KCkgeworCQlMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXRlZ29yaWVzLmFkZCgiTW9iaWxpdHkiKTsKKwkJY2F0ZWdvcmllcy5hZGQoIk5ldHdvcmsgTDEtMyIpOworCQljYXRlZ29yaWVzLmFkZCgiTmV0d29yayBMNCIpOworCQljYXRlZ29yaWVzLmFkZCgiVm9JUCBDYWxsIENvbnRyb2wiKTsKKworCQlMaXN0PENhdGVnb3J5RGF0YT4gY2F0ZWdvcnlEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2F0ZWdvcnlEYXRhPigpOworCQlDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhID0gbnVsbDsKKwkJZm9yIChTdHJpbmcgY2F0ZWdvcnkgOiBjYXRlZ29yaWVzKSB7CisJCQljYXRlZ29yeURhdGEgPSBuZXcgU2VydmljZUNhdGVnb3J5RGF0YShjYXRlZ29yeSk7CisJCQljYXRlZ29yeURhdGEuc2V0QWN0aW9uKEFjdGlvbkVudW0uQ3JlYXRlKTsKKwkJCWNhdGVnb3J5RGF0YS5zZXRFbGVtZW50VHlwZShHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlKTsKKwkJCS8vIGNhdGVnb3J5RGF0YS5zZXRDYXRlZ29yeU5hbWUoZW50cnlMaXN0LmdldEtleSgpKTsKKwkJCS8vIGNhdGVnb3J5RGF0YS5zZXROYW1lKHZhbCk7CisJCQljYXRlZ29yeURhdGFMaXN0LmFkZChjYXRlZ29yeURhdGEpOworCQl9CisJCXJldHVybiBjYXRlZ29yeURhdGFMaXN0OworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0VXNlcnMoKSB7CisJCWlmIChncmFwaCAhPSBudWxsKSB7CisJCQlMaXN0PFVzZXJEYXRhPiB1c2VycyA9IGNyZWF0ZVVzZXJMaXN0KCk7CisJCQlmb3IgKFVzZXJEYXRhIHVzZXIgOiB1c2VycykgeworCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVTRVJfSUQuZ2V0UHJvcGVydHkoKTsKKwkJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHVzZXIuZ2V0VXNlcklkKCk7CisJCQkJVmVydGV4IHZlcnRleCA9IG51bGw7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbnVsbDsKKwkJCQlpZiAoIWlzVmVydGV4RXhpc3QocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKSkgeworCQkJCQl2ZXJ0ZXggPSBncmFwaC5hZGRWZXJ0ZXgoKTsKKwkJCQkJdmVydGV4LnByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlVzZXIuZ2V0TmFtZSgpKTsKKwkJCQkJcHJvcGVydGllcyA9IHVzZXIudG9HcmFwaE1hcCgpOworCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCQkJCXZlcnRleC5wcm9wZXJ0eShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlncmFwaC50eCgpLmNvbW1pdCgpOworCQl9CisJfQorCisJcHJpdmF0ZSBMaXN0PFVzZXJEYXRhPiBjcmVhdGVVc2VyTGlzdCgpIHsKKwkJTGlua2VkTGlzdDxVc2VyRGF0YT4gdXNlcnMgPSBuZXcgTGlua2VkTGlzdDxVc2VyRGF0YT4oKTsKKwkJdXNlcnMuYWRkKGdldERlZmF1bHRVc2VyQWRtaW4xKCkpOworCQl1c2Vycy5hZGQoZ2V0RGVmYXVsdFVzZXJBZG1pbjIoKSk7CisJCXVzZXJzLmFkZChnZXREZWZhdWx0VXNlckFkbWluMygpKTsKKwkJdXNlcnMuYWRkKGdldERlZmF1bHRVc2VyRGVzaWduZXIxKCkpOworCQl1c2Vycy5hZGQoZ2V0RGVmYXVsdFVzZXJEZXNpZ25lcjIoKSk7CisJCXVzZXJzLmFkZChnZXREZWZhdWx0VXNlckRlc2lnbmVyMygpKTsKKwkJdXNlcnMuYWRkKGdldERlZmF1bHRVc2VyVGVzdGVyMSgpKTsKKwkJdXNlcnMuYWRkKGdldERlZmF1bHRVc2VyVGVzdGVyMigpKTsKKwkJdXNlcnMuYWRkKGdldERlZmF1bHRVc2VyVGVzdGVyMygpKTsKKwkJdXNlcnMuYWRkKGdldERlZmF1bHRVc2VyR292ZXJub3IxKCkpOworCQl1c2Vycy5hZGQoZ2V0RGVmYXVsdFVzZXJPcHMxKCkpOworCQl1c2Vycy5hZGQoZ2V0RGVmYXVsdFVzZXJQcm9kdWN0TWFuYWdlcjEoKSk7CisJCXVzZXJzLmFkZChnZXREZWZhdWx0VXNlclByb2R1Y3RNYW5hZ2VyMigpKTsKKwkJdXNlcnMuYWRkKGdldERlZmF1bHRVc2VyUHJvZHVjdFN0cmF0ZWdpc3QxKCkpOworCQl1c2Vycy5hZGQoZ2V0RGVmYXVsdFVzZXJQcm9kdWN0U3RyYXRlZ2lzdDIoKSk7CisJCXVzZXJzLmFkZChnZXREZWZhdWx0VXNlclByb2R1Y3RTdHJhdGVnaXN0MygpKTsKKwkJcmV0dXJuIHVzZXJzOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1ZlcnRleEV4aXN0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7CisJCS8vIEl0ZXJhYmxlPFZlcnRleD4gdmVydGVjaWVzID0gZ3JhcGguZ2V0VmVydGljZXMocHJvcGVydHlOYW1lLAorCQkvLyBwcm9wZXJ0eVZhbHVlKTsKKwkJLy8gamF2YS51dGlsLkl0ZXJhdG9yPFZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0ZWNpZXMuaXRlcmF0b3IoKTsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRlY2llcyA9IGdyYXBoLnF1ZXJ5KCkuaGFzKEhFQUxUSF9DSEVDSywgT0spLnZlcnRpY2VzKCk7CisKKwkJamF2YS51dGlsLkl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRlY2llcy5pdGVyYXRvcigpOworCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzVmVydGV4RXhpc3QoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCVRpdGFuR3JhcGhRdWVyeSBxdWVyeSA9IGdyYXBoLnF1ZXJ5KCk7CisKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJCXF1ZXJ5ID0gcXVlcnkuaGFzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlJdGVyYWJsZTxWZXJ0ZXg+IHZlcnRlY2llcyA9IHF1ZXJ5LnZlcnRpY2VzKCk7CisJCWphdmEudXRpbC5JdGVyYXRvcjxWZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGVjaWVzLml0ZXJhdG9yKCk7CisJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIFVzZXJEYXRhIGdldERlZmF1bHRVc2VyQWRtaW4xKCkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyRGF0YS5zZXRBY3Rpb24oQWN0aW9uRW51bS5DcmVhdGUpOworCQl1c2VyRGF0YS5zZXRFbGVtZW50VHlwZShHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKCJqaDAwMDMiKTsKKwkJdXNlckRhdGEuc2V0RW1haWwoImFkbWluQHNkYy5jb20iKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKCJKaW1teSIpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZSgiSGVuZHJpeCIpOworCQl1c2VyRGF0YS5zZXRSb2xlKCJBRE1JTiIpOworCQl1c2VyRGF0YS5zZXRTdGF0dXMoVXNlclN0YXR1c0VudW0uQUNUSVZFLm5hbWUoKSk7CisJCXVzZXJEYXRhLnNldExhc3RMb2dpblRpbWUoMEwpOworCQlyZXR1cm4gdXNlckRhdGE7CisJfQorCisJcHJpdmF0ZSBVc2VyRGF0YSBnZXREZWZhdWx0VXNlckFkbWluMigpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0QWN0aW9uKEFjdGlvbkVudW0uQ3JlYXRlKTsKKwkJdXNlckRhdGEuc2V0RWxlbWVudFR5cGUoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCgidHIwMDAxIik7CisJCXVzZXJEYXRhLnNldEVtYWlsKCJhZG1pbkBzZGMuY29tIik7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZSgiVG9kZCIpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZSgiUnVuZGdyZW4iKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiQURNSU4iKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJBZG1pbjMoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldEFjdGlvbihBY3Rpb25FbnVtLkNyZWF0ZSk7CisJCXVzZXJEYXRhLnNldEVsZW1lbnRUeXBlKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCQl1c2VyRGF0YS5zZXRVc2VySWQoImFoMDAwMiIpOworCQl1c2VyRGF0YS5zZXRFbWFpbCgiYWRtaW5Ac2RjLmNvbSIpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoIkFsZXgiKTsKKwkJdXNlckRhdGEuc2V0TGFzdE5hbWUoIkhhcnZleSIpOworCQl1c2VyRGF0YS5zZXRSb2xlKCJBRE1JTiIpOworCQl1c2VyRGF0YS5zZXRTdGF0dXMoVXNlclN0YXR1c0VudW0uQUNUSVZFLm5hbWUoKSk7CisJCXVzZXJEYXRhLnNldExhc3RMb2dpblRpbWUoMEwpOworCQlyZXR1cm4gdXNlckRhdGE7CisJfQorCisJcHJpdmF0ZSBVc2VyRGF0YSBnZXREZWZhdWx0VXNlckRlc2lnbmVyMSgpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0QWN0aW9uKEFjdGlvbkVudW0uQ3JlYXRlKTsKKwkJdXNlckRhdGEuc2V0RWxlbWVudFR5cGUoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCgiY3MwMDA4Iik7CisJCXVzZXJEYXRhLnNldEVtYWlsKCJkZXNpZ25lckBzZGMuY29tIik7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZSgiQ2FybG9zIik7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKCJTYW50YW5hIik7CisJCXVzZXJEYXRhLnNldFJvbGUoIkRFU0lHTkVSIik7CisJCXVzZXJEYXRhLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5BQ1RJVkUubmFtZSgpKTsKKwkJdXNlckRhdGEuc2V0TGFzdExvZ2luVGltZSgwTCk7CisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwcml2YXRlIFVzZXJEYXRhIGdldERlZmF1bHRVc2VyRGVzaWduZXIyKCkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyRGF0YS5zZXRBY3Rpb24oQWN0aW9uRW51bS5DcmVhdGUpOworCQl1c2VyRGF0YS5zZXRFbGVtZW50VHlwZShHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKCJtZTAwMDkiKTsKKwkJdXNlckRhdGEuc2V0RW1haWwoImRlc2lnbmVyQHNkYy5jb20iKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKCJNZWxpc3NhIik7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKCJFdGhlcmlkZ2UiKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiREVTSUdORVIiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJEZXNpZ25lcjMoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldEFjdGlvbihBY3Rpb25FbnVtLkNyZWF0ZSk7CisJCXVzZXJEYXRhLnNldEVsZW1lbnRUeXBlKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCQl1c2VyRGF0YS5zZXRVc2VySWQoImFmMDAwNiIpOworCQl1c2VyRGF0YS5zZXRFbWFpbCgiZGVzaWduZXJAc2RjLmNvbSIpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoIkFyZXRoYSIpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZSgiRnJhbmtsaW4iKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiREVTSUdORVIiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJUZXN0ZXIxKCkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyRGF0YS5zZXRBY3Rpb24oQWN0aW9uRW51bS5DcmVhdGUpOworCQl1c2VyRGF0YS5zZXRFbGVtZW50VHlwZShHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKCJqbTAwMDciKTsKKwkJdXNlckRhdGEuc2V0RW1haWwoInRlc3RlckBzZGMuY29tIik7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZSgiSm9uaSIpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZSgiTWl0Y2hlbGwiKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiVEVTVEVSIik7CisJCXVzZXJEYXRhLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5BQ1RJVkUubmFtZSgpKTsKKwkJdXNlckRhdGEuc2V0TGFzdExvZ2luVGltZSgwTCk7CisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwcml2YXRlIFVzZXJEYXRhIGdldERlZmF1bHRVc2VyVGVzdGVyMigpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0QWN0aW9uKEFjdGlvbkVudW0uQ3JlYXRlKTsKKwkJdXNlckRhdGEuc2V0RWxlbWVudFR5cGUoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCgia2IwMDA0Iik7CisJCXVzZXJEYXRhLnNldEVtYWlsKCJ0ZXN0ZXJAc2RjLmNvbSIpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoIkthdGUiKTsKKwkJdXNlckRhdGEuc2V0TGFzdE5hbWUoIkJ1c2giKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiVEVTVEVSIik7CisJCXVzZXJEYXRhLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5BQ1RJVkUubmFtZSgpKTsKKwkJdXNlckRhdGEuc2V0TGFzdExvZ2luVGltZSgwTCk7CisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwcml2YXRlIFVzZXJEYXRhIGdldERlZmF1bHRVc2VyVGVzdGVyMygpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0QWN0aW9uKEFjdGlvbkVudW0uQ3JlYXRlKTsKKwkJdXNlckRhdGEuc2V0RWxlbWVudFR5cGUoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCgianQwMDA1Iik7CisJCXVzZXJEYXRhLnNldEVtYWlsKCJ0ZXN0ZXJAc2RjLmNvbSIpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoIkphbWVzIik7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKCJUYXlsb3IiKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiVEVTVEVSIik7CisJCXVzZXJEYXRhLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5BQ1RJVkUubmFtZSgpKTsKKwkJdXNlckRhdGEuc2V0TGFzdExvZ2luVGltZSgwTCk7CisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwcml2YXRlIFVzZXJEYXRhIGdldERlZmF1bHRVc2VyT3BzMSgpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0QWN0aW9uKEFjdGlvbkVudW0uQ3JlYXRlKTsKKwkJdXNlckRhdGEuc2V0RWxlbWVudFR5cGUoR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCgib3AwMDAxIik7CisJCXVzZXJEYXRhLnNldEVtYWlsKCJvcHNAc2RjLmNvbSIpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoIlN0ZXZlIik7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKCJSZWdldiIpOworCQl1c2VyRGF0YS5zZXRSb2xlKCJPUFMiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJHb3Zlcm5vcjEoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldEFjdGlvbihBY3Rpb25FbnVtLkNyZWF0ZSk7CisJCXVzZXJEYXRhLnNldEVsZW1lbnRUeXBlKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCQl1c2VyRGF0YS5zZXRVc2VySWQoImd2MDAwMSIpOworCQl1c2VyRGF0YS5zZXRFbWFpbCgiZ292ZXJub3JAc2RjLmNvbSIpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoIkRhdmlkIik7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKCJTaGFkbWkiKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiR09WRVJOT1IiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJQcm9kdWN0TWFuYWdlcjEoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldEFjdGlvbihBY3Rpb25FbnVtLkNyZWF0ZSk7CisJCXVzZXJEYXRhLnNldEVsZW1lbnRUeXBlKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCQl1c2VyRGF0YS5zZXRVc2VySWQoInBtMDAwMSIpOworCQl1c2VyRGF0YS5zZXRFbWFpbCgicG0xQHNkYy5jb20iKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKCJUZWRkeSIpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZSgiSXNhc2hhciIpOworCQl1c2VyRGF0YS5zZXRSb2xlKCJQUk9EVUNUX01BTkFHRVIiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJQcm9kdWN0TWFuYWdlcjIoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldEFjdGlvbihBY3Rpb25FbnVtLkNyZWF0ZSk7CisJCXVzZXJEYXRhLnNldEVsZW1lbnRUeXBlKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCQl1c2VyRGF0YS5zZXRVc2VySWQoInBtMDAwMiIpOworCQl1c2VyRGF0YS5zZXRFbWFpbCgicG0yQHNkYy5jb20iKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKCJTYXJhaCIpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZSgiQmV0dGVucyIpOworCQl1c2VyRGF0YS5zZXRSb2xlKCJQUk9EVUNUX01BTkFHRVIiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJQcm9kdWN0U3RyYXRlZ2lzdDEoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldEFjdGlvbihBY3Rpb25FbnVtLkNyZWF0ZSk7CisJCXVzZXJEYXRhLnNldEVsZW1lbnRUeXBlKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCQl1c2VyRGF0YS5zZXRVc2VySWQoInBzMDAwMSIpOworCQl1c2VyRGF0YS5zZXRFbWFpbCgicHMxQHNkYy5jb20iKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKCJFZGVuIik7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKCJSb3ppbiIpOworCQl1c2VyRGF0YS5zZXRSb2xlKCJQUk9EVUNUX1NUUkFURUdJU1QiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZ2V0RGVmYXVsdFVzZXJQcm9kdWN0U3RyYXRlZ2lzdDIoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldEFjdGlvbihBY3Rpb25FbnVtLkNyZWF0ZSk7CisJCXVzZXJEYXRhLnNldEVsZW1lbnRUeXBlKEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUpOworCQl1c2VyRGF0YS5zZXRVc2VySWQoInBzMDAwMiIpOworCQl1c2VyRGF0YS5zZXRFbWFpbCgicHMyQHNkYy5jb20iKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKCJFbGxhIik7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKCJLdmV0bnkiKTsKKwkJdXNlckRhdGEuc2V0Um9sZSgiUFJPRFVDVF9TVFJBVEVHSVNUIik7CisJCXVzZXJEYXRhLnNldFN0YXR1cyhVc2VyU3RhdHVzRW51bS5BQ1RJVkUubmFtZSgpKTsKKwkJdXNlckRhdGEuc2V0TGFzdExvZ2luVGltZSgwTCk7CisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwcml2YXRlIFVzZXJEYXRhIGdldERlZmF1bHRVc2VyUHJvZHVjdFN0cmF0ZWdpc3QzKCkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyRGF0YS5zZXRBY3Rpb24oQWN0aW9uRW51bS5DcmVhdGUpOworCQl1c2VyRGF0YS5zZXRFbGVtZW50VHlwZShHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKCJwczAwMDMiKTsKKwkJdXNlckRhdGEuc2V0RW1haWwoInBzM0BzZGMuY29tIik7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZSgiR2V2YSIpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZSgiQWxvbiIpOworCQl1c2VyRGF0YS5zZXRSb2xlKCJQUk9EVUNUX1NUUkFURUdJU1QiKTsKKwkJdXNlckRhdGEuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCkpOworCQl1c2VyRGF0YS5zZXRMYXN0TG9naW5UaW1lKDBMKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCVRpdGFuR3JhcGhDbGllbnQgY2xpZW50ID0gbmV3IFRpdGFuR3JhcGhDbGllbnQoKTsKKwkJY2xpZW50LmNyZWF0ZUdyYXBoKCk7CisKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWJvb2xlYW4gaGVhbHRoID0gY2xpZW50LmlzR3JhcGhPcGVuKCk7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oImhlYWx0aD0iICsgaGVhbHRoKTsKKwkJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVEFOX0hFQUxUSF9DSEVDS19TVFIgPSAidGl0YW5IZWFsdGhDaGVjayI7CisKKwlwcml2YXRlIHZvaWQgbG9nQWxhcm0oKSB7CisJCWlmIChsYXN0SGVhbHRoU3RhdGUgPT0gdHJ1ZSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlSGVhbHRoQ2hlY2tSZWNvdmVyeSwKKwkJCQkJVElUQU5fSEVBTFRIX0NIRUNLX1NUUik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVIZWFsdGhDaGVja1RpdGFuUmVjb3ZlcnkoVElUQU5fSEVBTFRIX0NIRUNLX1NUUik7CisJCX0gZWxzZSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVIZWFsdGhDaGVja0Vycm9yLAorCQkJCQlUSVRBTl9IRUFMVEhfQ0hFQ0tfU1RSKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUhlYWx0aENoZWNrVGl0YW5FcnJvcihUSVRBTl9IRUFMVEhfQ0hFQ0tfU1RSKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3RpdGFuL1RpdGFuT3BlcmF0aW9uU3RhdHVzLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby90aXRhbi9UaXRhbk9wZXJhdGlvblN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWVkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby90aXRhbi9UaXRhbk9wZXJhdGlvblN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW47CisKK3B1YmxpYyBlbnVtIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHsKKwlPSywgTk9UX0NPTk5FQ1RFRCwgTk9UX0NSRUFURUQsIElOREVYX0NBTk5PVF9CRV9DSEFOR0VELCBOT1RfRk9VTkQsIE1JU1NJTkdfVU5JUVVFX0lELCBNSVNTSU5HX05PREVfTEFCRUwsIE1VTFRJUExFX0VER0VTX1dJVEhfU0FNRV9MQUJFTCwgQ0FOTk9UX0RFTEVURV9OT05fTEVBRl9OT0RFLCBNVUxUSVBMRV9OT0RFU19XSVRIX1NBTUVfSUQsIEdSQVBIX0lTX05PVF9BVkFJTEFCTEUsIFRJVEFOX0NPTkZJR1VSQVRJT04sIFRJVEFOX1NDSEVNQV9WSU9MQVRJT04sIElOVkFMSURfRUxFTUVOVCwgSU5WQUxJRF9RVUVSWSwgSU5WQUxJRF9JRCwgUkVTT1VSQ0VfVU5BVkFJTEFCTEUsIElMTEVHQUxfQVJHVU1FTlQsIEFMUkVBRFlfTE9DS0VELCBBTFJFQURZX0VYSVNULCBNVUxUSVBMRV9DSElMRFNfV0lUSF9TQU1FX0VER0UsIEdFTkVSQUxfRVJST1IsIE1BVENIX05PVF9GT1VORCwgSU5WQUxJRF9UWVBFLCBQUk9QRVJUWV9OQU1FX0FMUkVBRFlfRVhJU1RTLCBJTlZBTElEX1BST1BFUlRZLAorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9Db2xsZWN0aW9uVXRpbHMuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0NvbGxlY3Rpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzdlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9Db2xsZWN0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uVXRpbHMgeworCXByaXZhdGUgQ29sbGVjdGlvblV0aWxzKCkgeworCX0KKworCS8qKgorCSAqIEFkZCB0aGUgY29udGVudCBvZiB0aGUgJ3NvdXJjZScgU2V0IHRvIHRoZSAndGFyZ2V0JyBzZXQgYW5kIHJldHVybiB0aGUKKwkgKiB1bmlvbiBzZXQuCisJICoKKwkgKiBJZiAnc291cmNlJyBpcyBudWxsIHRoZW4gYSBuZXcgc2V0IGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLiBJZiAndGFyZ2V0JworCSAqIGlzIG51bGwgdGhlbiBubyBjb250ZW50IGlzIGFkZGVkIHRvIHRoZSAnc291cmNlJyBTZXQgb3IgbmV3bHkgY3JlYXRlZAorCSAqIHNldC4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2UKKwkgKiAgICAgICAgICAgIFRoZSBTZXQgdG8gbWVyZ2UgaW4gdGhlIHRhcmdldCBTZXQuCisJICogQHBhcmFtIHRhcmdldAorCSAqICAgICAgICAgICAgVGhlIFNldCBpbiB3aGljaCB0aGUgc291cmNlIHNldCB3aWxsIGJlIG1lcmdlZCAodGhyb3VnaAorCSAqICAgICAgICAgICAgYWRkQWxsKS4KKwkgKiBAcmV0dXJuIFRoZSB0YXJnZXQgU2V0IHdpdGggYWRkaXRpb24gb2Ygc291cmNlIFNldCBlbGVtZW50cywgb3IgYSBuZXcgU2V0CisJICogICAgICAgICAoaW5jbHVkaW5nIGNvbnRlbnQgb2Ygc291cmNlIHNldCkgaWYgdGFyZ2V0IHdhcyBudWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFNldDxUPiBtZXJnZShTZXQ8VD4gc291cmNlLCBTZXQ8VD4gdGFyZ2V0KSB7CisJCVNldDxUPiBtZXJnZWQgPSBuZXcgSGFzaFNldDxUPigpOworCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKKwkJCW1lcmdlZC5hZGRBbGwodGFyZ2V0KTsKKwkJfQorCQlpZiAoc291cmNlICE9IG51bGwpIHsKKwkJCW1lcmdlZC5hZGRBbGwoc291cmNlKTsKKwkJfQorCQlyZXR1cm4gbWVyZ2VkLmlzRW1wdHkoKSA/IG51bGwgOiBtZXJnZWQ7CisJfQorCisJLyoqCisJICogPHA+CisJICogQWRkIHRoZSBjb250ZW50IG9mIHRoZSAnc291cmNlJyBNYXAgdG8gdGhlICd0YXJnZXQnIHNldCBhbmQgcmV0dXJuIHRoZQorCSAqIHVuaW9uIE1hcC4KKwkgKiA8L3A+CisJICogPHA+CisJICogSWYgJ3NvdXJjZScgaXMgbnVsbCB0aGVuIGEgbmV3IE1hcCBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4gSWYgJ3RhcmdldCcKKwkgKiBpcyBudWxsIHRoZW4gbm8gY29udGVudCBpcyBhZGRlZCB0byB0aGUgJ3NvdXJjZScgTWFwIG9yIG5ld2x5IGNyZWF0ZWQKKwkgKiBNYXAuCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIHNvdXJjZQorCSAqICAgICAgICAgICAgVGhlIE1hcCB0byBtZXJnZSBpbiB0aGUgdGFyZ2V0IE1hcC4KKwkgKiBAcGFyYW0gdGFyZ2V0CisJICogICAgICAgICAgICBUaGUgTWFwIGluIHdoaWNoIHRoZSBzb3VyY2UgTWFwIHdpbGwgYmUgbWVyZ2VkICh0aHJvdWdoCisJICogICAgICAgICAgICBhZGRBbGwpLgorCSAqIEBwYXJhbSBvdmVycmlkZQorCSAqICAgICAgICAgICAgSWYgYW4ga2V5IGZyb20gdGhlIHNvdXJjZSBtYXAgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRhcmdldAorCSAqICAgICAgICAgICAgbWFwLCBzaG91bGQgaXQgb3ZlcnJpZGUgKHRydWUpIG9yIG5vdCAoZmFsc2UpIHRoZSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB0YXJnZXQgTWFwIHdpdGggYWRkaXRpb24gb2Ygc291cmNlIE1hcCBlbGVtZW50cywgb3IgYSBuZXcgTWFwCisJICogICAgICAgICAoaW5jbHVkaW5nIGNvbnRlbnQgb2Ygc291cmNlIHNldCkgaWYgdGFyZ2V0IHdhcyBudWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQsIFY+IE1hcDxULCBWPiBtZXJnZShNYXA8VCwgPyBleHRlbmRzIFY+IHNvdXJjZSwgTWFwPFQsIFY+IHRhcmdldCwgYm9vbGVhbiBvdmVycmlkZSkgeworCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKKwkJCXRhcmdldCA9IG5ldyBIYXNoTWFwKCk7CisJCX0KKworCQlpZiAoc291cmNlICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8VCwgPyBleHRlbmRzIFY+IGVudHJ5IDogc291cmNlLmVudHJ5U2V0KCkpIHsKKwkJCQlpZiAob3ZlcnJpZGUgfHwgIXRhcmdldC5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpIHsKKwkJCQkJdGFyZ2V0LnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0YXJnZXQuaXNFbXB0eSgpID8gbnVsbCA6IHRhcmdldDsKKwl9CisKKwkvKioKKwkgKiBNZXJnZSB0d28gbGlzdHMsIHRoZSBtZXJnZSBpcyBwZXJmb3JtZWQgYmFzZWQgb24gdGhlIGNvbnRhaW5zIG1ldGhvZCBzbworCSAqIGVsZW1lbnRzIHByZXNlbnRzIGJvdGggaW4gc291cmNlIGFuZCB0YXJnZXQgYXJlIG5vdCBhZGRlZCB0d2ljZSB0byB0aGUKKwkgKiBsaXN0LgorCSAqCisJICogQHBhcmFtIHNvdXJjZQorCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBsaXN0LgorCSAqIEBwYXJhbSB0YXJnZXQKKwkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgbGlzdC4KKwkgKiBAcmV0dXJuIEEgbGlzdCB0aGF0IHJlcHJlc2VudHMgdGhlIG1lcmdlZCBjb2xsZWN0aW9ucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IG1lcmdlKExpc3Q8VD4gc291cmNlLCBMaXN0PFQ+IHRhcmdldCkgeworCQlMaXN0PFQ+IG1lcmdlZCA9IHRhcmdldCA9PSBudWxsID8gbmV3IEFycmF5TGlzdDxUPigpIDogdGFyZ2V0OworCisJCWlmIChzb3VyY2UgPT0gbnVsbCkgeworCQkJcmV0dXJuIG1lcmdlZDsKKwkJfQorCisJCWZvciAoVCB0IDogc291cmNlKSB7CisJCQlpZiAoIW1lcmdlZC5jb250YWlucyh0KSkgeworCQkJCW1lcmdlZC5hZGQodCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbWVyZ2VkOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0NvbnN0YW50cy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4N2U1MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHM7CisKKy8qKgorICogSG9sZHMgY29uc3RhbnRzIHRvIHVzZSBpbiBBTElFTi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FU19TRUFSQ0hfU0laRSA9IDUwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9FU19TRUFSQ0hfU0laRSA9IDEwMDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUVOX0lOVEVSTkFMX1RBRyA9ICJpY29uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBUEFCSUxJVFlfRklFTERfTkFNRSA9ICJkZWZhdWx0Q2FwYWJpbGl0aWVzIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUVfQUxMX1VTRVJTID0gIkFMTF9VU0VSUyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfRU1QVFlfVkFMVUUgPSAiX19OQU5BTkFfXyI7CisKKwlwcml2YXRlIENvbnN0YW50cygpIHsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9EYW9VdGlscy5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvRGFvVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjFkMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvRGFvVXRpbHMuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKKy8qKgorICogCisgKiBAYXV0aG9yIEV2Z2VuaWEgQWxiZXJzdGVpbgorICogCisgKiAgICAgICAgIFV0aWxpdHkgY2xhc3MgZm9yIGNvbnZlcnRhdGlvbiB0by9mcm9tIEpTT04gc3RyaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBEYW9VdGlscyB7CisKKwkvKioKKwkgKiBDb252ZXJ0IGZyb20gT2JqZWN0IHRvIEpzb24gc3RyaW5nCisJICogCisJICogQHBhcmFtIG9iamVjdAorCSAqIEByZXR1cm4ganNvbiBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9Kc29uKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIG9iamVjdCBjYW5ub3QgYmUgTlVMTCEhISIpOworCQl9CisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7IC8vIE9yIHVzZSBuZXcgR3NvbkJ1aWxkZXIoKS5jcmVhdGUoKTsKKwkJcmV0dXJuIGdzb24udG9Kc29uKG9iamVjdCk7IC8vIHNlcmlhbGl6ZXMgdGFyZ2V0IHRvIEpzb24KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0IGZyb20gSnNvbiBzdHJpbmcgdG8gb2JqZWN0CisJICogCisJICogQHBhcmFtIGNsYXp6CisJICogQHBhcmFtIGpzb24KKwkgKiBAcmV0dXJuIG9iamVjdAorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgY29udmVydEZyb21Kc29uKENsYXNzPFQ+IGNsYXp6LCBTdHJpbmcganNvbikgeworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOyAvLyBPciB1c2UgbmV3IEdzb25CdWlsZGVyKCkuY3JlYXRlKCk7CisJCXJldHVybiBnc29uLmZyb21Kc29uKGpzb24sIGNsYXp6KTsgLy8gZGVzZXJpYWxpemVzIGpzb24gaW50byB0YXJnZXQyCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9FbGFzdGljU2VhcmNoVXRpbC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvRWxhc3RpY1NlYXJjaFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjBiNTIzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvRWxhc3RpY1NlYXJjaFV0aWwuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzOworCitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guYWN0aW9uLnNlYXJjaC5TZWFyY2hSZXNwb25zZTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIHdvcmsgd2l0aCBlbGFzdGljIHNlYXJjaCByZXNwb25zZXMuCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVsYXN0aWNTZWFyY2hVdGlsIHsKKwlwcml2YXRlIEVsYXN0aWNTZWFyY2hVdGlsKCkgeworCX0KKworCS8qKgorCSAqIENoZWNrcyBpZiBhIHNlYXJjaCByZXNwb25zZSBmcm9tIGVsYXN0aWMgc2VhcmNoIGNvbnRhaW5zIHJlc3VsdHMgb3Igbm90LgorCSAqIAorCSAqIEBwYXJhbSBzZWFyY2hSZXNwb25zZQorCSAqICAgICAgICAgICAgVGhlIEVTIHNlYXJjaCByZXNwb25zZSBvYmplY3QuCisJICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFueSByZXN1bHQsIGZhbHNlIGlmIHRoZQorCSAqICAgICAgICAgcmVzcG9uc2UgZG9lcyBjb250YWlucyByZXN1bHRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jlc3BvbnNlRW1wdHkoU2VhcmNoUmVzcG9uc2Ugc2VhcmNoUmVzcG9uc2UpIHsKKwkJaWYgKHNlYXJjaFJlc3BvbnNlID09IG51bGwgfHwgc2VhcmNoUmVzcG9uc2UuZ2V0SGl0cygpID09IG51bGwgfHwgc2VhcmNoUmVzcG9uc2UuZ2V0SGl0cygpLmdldEhpdHMoKSA9PSBudWxsCisJCQkJfHwgc2VhcmNoUmVzcG9uc2UuZ2V0SGl0cygpLmdldEhpdHMoKS5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0V4Y2VwdGlvbnMuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0V4Y2VwdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDBhNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvRXhjZXB0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBFeGNlcHRpb25zIHsKKwlwcml2YXRlIEV4Y2VwdGlvbnMoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGNvbnZlcnRUb1J1bnRpbWVFeChUaHJvd2FibGUgdCkgeworCQlyZXR1cm4gRXhjZXB0aW9ucy48UnVudGltZUV4Y2VwdGlvbj5jb252ZXJ0VG9SVEV4Y2VwdGlvbih0KTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIFRocm93YWJsZT4gVCBjb252ZXJ0VG9SVEV4Y2VwdGlvbihUaHJvd2FibGUgdCkgdGhyb3dzIFQgeworCQl0aHJvdyAoVCkgdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9JbWFnZVF1YWxpdHkuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0ltYWdlUXVhbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjY5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9JbWFnZVF1YWxpdHkuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzOworCisvKioKKyAqIEF2YWlsYWJsZSBxdWFsaXRpZXMgZm9yIGltYWdlcyBpbiBBbGllbiA0IENsb3VkLgorICoKKyAqIEBhdXRob3IgbHVjIGJvdXRpZXIKKyAqLworcHVibGljIGVudW0gSW1hZ2VRdWFsaXR5IHsKKwlRVUFMSVRZXzE2KDE2KSwgUVVBTElUWV8zMigzMiksIFFVQUxJVFlfNjQoNjQpLCBRVUFMSVRZXzEyOCgxMjgpLCBRVUFMSVRZXzUxMig1MTIpLCBRVUFMSVRZX0JFU1QoLTEpOworCisJcHJpdmF0ZSBmaW5hbCBpbnQgc2l6ZTsKKworCXByaXZhdGUgSW1hZ2VRdWFsaXR5KGludCBzaXplKSB7CisJCXRoaXMuc2l6ZSA9IHNpemU7CisJfQorCisJcHVibGljIGludCBnZXRTaXplKCkgeworCQlyZXR1cm4gc2l6ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9JbWFnZVJlc2l6ZVV0aWwuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0ltYWdlUmVzaXplVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjhjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9JbWFnZVJlc2l6ZVV0aWwuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlsczsKKworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKKworLyoqCisgKiBVdGlsaXR5IHRvIHJlc2l6ZSBpbWFnZXMuCisgKiAKKyAqIEBhdXRob3IgbHVjIGJvdXRpZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEltYWdlUmVzaXplVXRpbCB7CisJcHJpdmF0ZSBJbWFnZVJlc2l6ZVV0aWwoKSB7CisJfQorCisJLyoqCisJICogUmVzaXplIGFuIGltYWdlIHdpdGggZGVmYXVsdCBxdWFsaXR5IHNldHRpbmdzLgorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW5hbEltYWdlCisJICogICAgICAgICAgICBUaGUgaW1hZ2UgdG8gcmVzaXplLgorCSAqIEBwYXJhbSB3aWR0aAorCSAqICAgICAgICAgICAgVGhlIHRhcmdldCB3aWR0aC4KKwkgKiBAcGFyYW0gaGVpZ2h0CisJICogICAgICAgICAgICBUaGUgdGFyZ2V0IGhlaWdodC4KKwkgKiBAcGFyYW0gcHJlc2VydmVEaW1lbnNpb25zCisJICogICAgICAgICAgICBGbGFnIHRvIGtub3cgaWYgd2Ugc2hvdWxkIHByZXNlcnZlIG9yaWdpbmFsIGltYWdlIGRpbWVuc2lvbnMuCisJICogQHJldHVybiBUaGUgcmVzaXplZCBpbWFnZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgcmVzaXplSW1hZ2UoZmluYWwgQnVmZmVyZWRJbWFnZSBvcmlnaW5hbEltYWdlLCBmaW5hbCBpbnQgd2lkdGgsIGZpbmFsIGludCBoZWlnaHQsCisJCQlmaW5hbCBib29sZWFuIHByZXNlcnZlRGltZW5zaW9ucykgeworCQlyZXR1cm4gcmVzaXplSW1hZ2Uob3JpZ2luYWxJbWFnZSwgd2lkdGgsIGhlaWdodCwgcHJlc2VydmVEaW1lbnNpb25zLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogPHA+CisJICogUmVzaXplIGFuIGltYWdlIHdpdGggaGlnaCBxdWFsaXR5IHNldHRpbmdzLgorCSAqIDwvcD4KKwkgKiA8dWw+CisJICogPGxpPmcuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfSU5URVJQT0xBVElPTiwKKwkgKiBSZW5kZXJpbmdIaW50cy5WQUxVRV9JTlRFUlBPTEFUSU9OX0JJTElORUFSKTs8L2xpPgorCSAqIDxsaT5nLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX1JFTkRFUklORywKKwkgKiBSZW5kZXJpbmdIaW50cy5WQUxVRV9SRU5ERVJfUVVBTElUWSk7PC9saT4KKwkgKiA8bGk+Zy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsCisJICogUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTs8L2xpPgorCSAqIDwvdWw+CisJICogCisJICogQHBhcmFtIG9yaWdpbmFsSW1hZ2UKKwkgKiAgICAgICAgICAgIFRoZSBpbWFnZSB0byByZXNpemUuCisJICogQHBhcmFtIHdpZHRoCisJICogICAgICAgICAgICBUaGUgdGFyZ2V0IHdpZHRoLgorCSAqIEBwYXJhbSBoZWlnaHQKKwkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgaGVpZ2h0LgorCSAqIEBwYXJhbSBwcmVzZXJ2ZURpbWVuc2lvbnMKKwkgKiAgICAgICAgICAgIEZsYWcgdG8ga25vdyBpZiB3ZSBzaG91bGQgcHJlc2VydmUgb3JpZ2luYWwgaW1hZ2UgZGltZW5zaW9ucy4KKwkgKiBAcmV0dXJuIFRoZSByZXNpemVkIGltYWdlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbWFnZSByZXNpemVJbWFnZVdpdGhIaW50KEJ1ZmZlcmVkSW1hZ2Ugb3JpZ2luYWxJbWFnZSwgZmluYWwgaW50IHdpZHRoLCBmaW5hbCBpbnQgaGVpZ2h0LAorCQkJZmluYWwgYm9vbGVhbiBwcmVzZXJ2ZURpbWVuc2lvbnMpIHsKKwkJcmV0dXJuIHJlc2l6ZUltYWdlKG9yaWdpbmFsSW1hZ2UsIHdpZHRoLCBoZWlnaHQsIHByZXNlcnZlRGltZW5zaW9ucywgdHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRJbWFnZSByZXNpemVJbWFnZShCdWZmZXJlZEltYWdlIG9yaWdpbmFsSW1hZ2UsIGZpbmFsIGludCB3aWR0aCwgZmluYWwgaW50IGhlaWdodCwKKwkJCWZpbmFsIGJvb2xlYW4gcHJlc2VydmVEaW1lbnNpb25zLCBmaW5hbCBib29sZWFuIGVuYWJsZUhpZ2hRdWFsaXR5KSB7CisJCWludCB0eXBlID0gb3JpZ2luYWxJbWFnZS5nZXRUeXBlKCkgPT0gMCA/IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQiA6IG9yaWdpbmFsSW1hZ2UuZ2V0VHlwZSgpOworCisJCWludCB0YXJnZXRXaWR0aCA9IHdpZHRoOworCQlpbnQgdGFyZ2V0SGVpZ2h0ID0gaGVpZ2h0OworCisJCWlmIChwcmVzZXJ2ZURpbWVuc2lvbnMpIHsKKwkJCWludFtdIHRhcmdldERpbWVudGlvbnMgPSBjb21wdXRlRGltZW5zaW9ucyh3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEltYWdlLmdldFdpZHRoKCksCisJCQkJCW9yaWdpbmFsSW1hZ2UuZ2V0SGVpZ2h0KCkpOworCQkJdGFyZ2V0V2lkdGggPSB0YXJnZXREaW1lbnRpb25zWzBdOworCQkJdGFyZ2V0SGVpZ2h0ID0gdGFyZ2V0RGltZW50aW9uc1sxXTsKKwkJfQorCisJCUJ1ZmZlcmVkSW1hZ2UgcmVzaXplZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UodGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgdHlwZSk7CisKKwkJR3JhcGhpY3MyRCBnID0gcmVzaXplZEltYWdlLmNyZWF0ZUdyYXBoaWNzKCk7CisJCWlmIChlbmFibGVIaWdoUXVhbGl0eSkgeworCQkJZy5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9JTlRFUlBPTEFUSU9OLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9JTlRFUlBPTEFUSU9OX0JJTElORUFSKTsKKwkJCWcuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfUkVOREVSSU5HLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9SRU5ERVJfUVVBTElUWSk7CisJCQlnLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywgUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKKwkJfQorCisJCWcuZHJhd0ltYWdlKG9yaWdpbmFsSW1hZ2UuZ2V0U2NhbGVkSW5zdGFuY2UodGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgSW1hZ2UuU0NBTEVfU01PT1RIKSwgMCwgMCwgbnVsbCk7CisJCWcuZGlzcG9zZSgpOworCisJCXJldHVybiByZXNpemVkSW1hZ2U7CisJfQorCisJLyoqCisJICogQ29tcHV0ZSB0YXJnZXQgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiByZXF1ZXN0ZWQgd2lkdGggYW5kIGhlaWdodCBidXQKKwkgKiBtYWtpbmcgc3VyZSB0aGUgb3JpZ2luYWwgZGltZW5zaW9ucyBvZiB0aGUgaW1hZ2Ugd2lsbCBiZSBwcmVzZXJ2ZWQuCisJICogCisJICogQHBhcmFtIHdpZHRoCisJICogICAgICAgICAgICBUaGUgaWRlYWwgKGFuZCBtYXgpIHRhcmdldCB3aWR0aC4KKwkgKiBAcGFyYW0gaGVpZ2h0CisJICogICAgICAgICAgICBUaGUgaWRlYWwgKGFuZCBtYXgpIHRhcmdldCBoZWlnaHQuCisJICogQHBhcmFtIG9yaWdpbmFsV2lkdGgKKwkgKiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCB3aWR0aC4KKwkgKiBAcGFyYW0gb3JpZ2luYWxIZWlnaHQKKwkgKiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBoZWlnaHQuCisJICogQHJldHVybiBBbiBhcnJheSBvZiBpbnQgdGhhdCBjb250YWlucyB0aGUgaWRlYWwgd2lkdGggYW5kIGhlaWdodCB0bworCSAqICAgICAgICAgcHJlc2VydmUgZGltZW5zaW9ucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludFtdIGNvbXB1dGVEaW1lbnNpb25zKGZpbmFsIGludCB3aWR0aCwgZmluYWwgaW50IGhlaWdodCwgZmluYWwgaW50IG9yaWdpbmFsV2lkdGgsCisJCQlmaW5hbCBpbnQgb3JpZ2luYWxIZWlnaHQpIHsKKwkJaW50IHRhcmdldFdpZHRoID0gd2lkdGg7CisJCWludCB0YXJnZXRIZWlnaHQgPSBoZWlnaHQ7CisKKwkJZmxvYXQgdGFyZ2V0RGltZW5zaW9ucyA9IEZsb2F0LnZhbHVlT2Yod2lkdGgpLmZsb2F0VmFsdWUoKSAvIEZsb2F0LnZhbHVlT2YoaGVpZ2h0KS5mbG9hdFZhbHVlKCk7CisJCWZsb2F0IHNvdXJjZURpbWVuc2lvbnMgPSBGbG9hdC52YWx1ZU9mKG9yaWdpbmFsV2lkdGgpLmZsb2F0VmFsdWUoKSAvIEZsb2F0LnZhbHVlT2Yob3JpZ2luYWxIZWlnaHQpLmZsb2F0VmFsdWUoKTsKKwkJaWYgKHRhcmdldERpbWVuc2lvbnMgPiBzb3VyY2VEaW1lbnNpb25zKSB7CisJCQl0YXJnZXRXaWR0aCA9IEZsb2F0LnZhbHVlT2Yod2lkdGggKiBzb3VyY2VEaW1lbnNpb25zIC8gdGFyZ2V0RGltZW5zaW9ucykuaW50VmFsdWUoKTsKKwkJfSBlbHNlIHsKKwkJCXRhcmdldEhlaWdodCA9IEZsb2F0LnZhbHVlT2YoaGVpZ2h0ICogdGFyZ2V0RGltZW5zaW9ucyAvIHNvdXJjZURpbWVuc2lvbnMpLmludFZhbHVlKCk7CisJCX0KKworCQlyZXR1cm4gbmV3IGludFtdIHsgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCB9OworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL0pzb25VdGlsLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9Kc29uVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjZkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9Kc29uVXRpbC5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSW5jbHVkZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUudHlwZS5UeXBlUmVmZXJlbmNlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5KYXZhVHlwZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk1hcHBpbmdFeGNlcHRpb247CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuU2VyaWFsaXphdGlvbkZlYXR1cmU7CisKKy8qKgorICogU2ltcGxlIHV0aWxpdHkgZm9yIEpTb24gcHJvY2Vzc2luZy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpzb25VdGlsIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RNYXBwZXIgZ2V0T25lT2JqZWN0TWFwcGVyKCkgeworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQltYXBwZXIuZW5hYmxlKFNlcmlhbGl6YXRpb25GZWF0dXJlLklOREVOVF9PVVRQVVQpOworCQltYXBwZXIuc2V0U2VyaWFsaXphdGlvbkluY2x1c2lvbihKc29uSW5jbHVkZS5JbmNsdWRlLk5PTl9OVUxMKTsKKwkJbWFwcGVyLmNvbmZpZ3VyZShTZXJpYWxpemF0aW9uRmVhdHVyZS5XUklURV9OVUxMX01BUF9WQUxVRVMsIGZhbHNlKTsKKwkJcmV0dXJuIG1hcHBlcjsKKwl9CisKKwlwcml2YXRlIEpzb25VdGlsKCkgeworCX0KKworCS8vIC8qKgorCS8vICogUGFyc2UgYSB7QGxpbmsgUmVzdFJlc3BvbnNlfSBieSB1c2luZyB0aGUgc3BlY2lmaWVkIGRhdGFUeXBlIGFzIHRoZQorCS8vIGV4cGVjdGVkIGRhdGEgb2JqZWN0J3MgY2xhc3MuCisJLy8gKgorCS8vICogQHBhcmFtIHJlc3BvbnNlQXNTdHJpbmcKKwkvLyAqIFRoZSB7QGxpbmsgUmVzdFJlc3BvbnNlfSBhcyBhIEpTb24gU3RyaW5nCisJLy8gKiBAcGFyYW0gZGF0YVR5cGUKKwkvLyAqIFRoZSB0eXBlIG9mIHRoZSBkYXRhIG9iamVjdC4KKwkvLyAqIEByZXR1cm4gVGhlIHBhcnNlZCB7QGxpbmsgUmVzdFJlc3BvbnNlfSBvYmplY3QgbWF0Y2hpbmcgdGhlIGdpdmVuIEpTb24uCisJLy8gKiBAdGhyb3dzIEpzb25QYXJzZUV4Y2VwdGlvbgorCS8vICogSW4gY2FzZSBvZiBhIEpTb24gcGFyc2luZyBpc3N1ZS4KKwkvLyAqIEB0aHJvd3MgSnNvbk1hcHBpbmdFeGNlcHRpb24KKwkvLyAqIEluIGNhc2Ugb2YgYSBKU29uIHBhcnNpbmcgaXNzdWUuCisJLy8gKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJLy8gKiBJbiBjYXNlIG9mIGFuIElPIGVycm9yLgorCS8vICovCisJLy8gcHVibGljIHN0YXRpYyA8VD4gUmVzdFJlc3BvbnNlPFQ+IHJlYWQoU3RyaW5nIHJlc3BvbnNlQXNTdHJpbmcsIENsYXNzPFQ+CisJLy8gZGF0YVR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJLy8gT2JqZWN0TWFwcGVyIG1hcHBlciA9IGdldE9uZU9iamVjdE1hcHBlcigpOworCS8vIEphdmFUeXBlIHJlc3RSZXNwb25zZVR5cGUgPQorCS8vIG1hcHBlci5nZXRUeXBlRmFjdG9yeSgpLmNvbnN0cnVjdFBhcmFtZXRyaWNUeXBlKFJlc3RSZXNwb25zZS5jbGFzcywKKwkvLyBkYXRhVHlwZSk7CisJLy8gcmV0dXJuIG1hcHBlci5yZWFkVmFsdWUocmVzcG9uc2VBc1N0cmluZywgcmVzdFJlc3BvbnNlVHlwZSk7CisJLy8gfQorCisJLyoqCisJICogRGVzZXJpYWxpemUganNvbiB0ZXh0IHRvIG9iamVjdAorCSAqCisJICogQHBhcmFtIG9iamVjdFRleHQKKwkgKiBAcGFyYW0gb2JqZWN0Q2xhc3MKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBKc29uUGFyc2VFeGNlcHRpb24KKwkgKiBAdGhyb3dzIEpzb25NYXBwaW5nRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgcmVhZE9iamVjdChTdHJpbmcgb2JqZWN0VGV4dCwgQ2xhc3M8VD4gb2JqZWN0Q2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRPbmVPYmplY3RNYXBwZXIoKS5yZWFkVmFsdWUob2JqZWN0VGV4dCwgb2JqZWN0Q2xhc3MpOworCX0KKworCS8qKgorCSAqIERlc2VyaWFsaXplIGpzb24gc3RyZWFtIHRvIG9iamVjdAorCSAqCisJICogQHBhcmFtIGpzb25TdHJlYW0KKwkgKiBAcGFyYW0gb2JqZWN0Q2xhc3MKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBKc29uUGFyc2VFeGNlcHRpb24KKwkgKiBAdGhyb3dzIEpzb25NYXBwaW5nRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgcmVhZE9iamVjdChJbnB1dFN0cmVhbSBqc29uU3RyZWFtLCBDbGFzczxUPiBvYmplY3RDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldE9uZU9iamVjdE1hcHBlcigpLnJlYWRWYWx1ZShqc29uU3RyZWFtLCBvYmplY3RDbGFzcyk7CisJfQorCisJLyoqCisJICogRGVzZXJpYWxpemUganNvbiB0ZXh0IHRvIG9iamVjdAorCSAqCisJICogQHBhcmFtIG9iamVjdFRleHQKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBKc29uUGFyc2VFeGNlcHRpb24KKwkgKiBAdGhyb3dzIEpzb25NYXBwaW5nRXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFQgcmVhZE9iamVjdChTdHJpbmcgb2JqZWN0VGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJVHlwZVJlZmVyZW5jZTxUPiB0eXBlUmVmID0gbmV3IFR5cGVSZWZlcmVuY2U8VD4oKSB7CisJCX07CisJCXJldHVybiBnZXRPbmVPYmplY3RNYXBwZXIoKS5yZWFkVmFsdWUob2JqZWN0VGV4dCwgdHlwZVJlZik7CisJfQorCisJLy8gLyoqCisJLy8gKiBQYXJzZSBhIHtAbGluayBSZXN0UmVzcG9uc2V9IHdpdGhvdXQgYmVpbmcgaW50ZXJlc3RlZCBpbiBwYXJhbWV0ZXJpemVkCisJLy8gdHlwZQorCS8vICoKKwkvLyAqIEBwYXJhbSByZXNwb25zZUFzU3RyaW5nCisJLy8gKiBAcmV0dXJuCisJLy8gKiBAdGhyb3dzIEpzb25QYXJzZUV4Y2VwdGlvbgorCS8vICogQHRocm93cyBKc29uTWFwcGluZ0V4Y2VwdGlvbgorCS8vICogQHRocm93cyBJT0V4Y2VwdGlvbgorCS8vICovCisJLy8gcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2U8Pz4gcmVhZChTdHJpbmcgcmVzcG9uc2VBc1N0cmluZykgdGhyb3dzCisJLy8gSU9FeGNlcHRpb24geworCS8vIHJldHVybiBnZXRPbmVPYmplY3RNYXBwZXIoKS5yZWFkVmFsdWUocmVzcG9uc2VBc1N0cmluZywKKwkvLyBSZXN0UmVzcG9uc2UuY2xhc3MpOworCS8vIH0KKworCS8vIC8qKgorCS8vICogU2VyaWFsaXplIHRoZSBnaXZlbiBvYmplY3QgaW4gYSBKU29uIFN0cmluZy4KKwkvLyAqCisJLy8gKiBAcGFyYW0gb2JqCisJLy8gKiBUaGUgb2JqZWN0IHRvIHNlcmlhbGl6ZS4KKwkvLyAqIEByZXR1cm4gVGhlIEpTb24gc2VyaWFsaXphdGlvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgorCS8vICogQHRocm93cyBKc29uUHJvY2Vzc2luZ0V4Y2VwdGlvbgorCS8vICogSW4gY2FzZSBvZiBhIGZhaWx1cmUgaW4gc2VyaWFsaXphdGlvbi4KKwkvLyAqLworCS8vIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvYmopIHRocm93cyBKc29uUHJvY2Vzc2luZ0V4Y2VwdGlvbgorCS8vIHsKKwkvLyByZXR1cm4gZ2V0T25lT2JqZWN0TWFwcGVyKCkud3JpdGVWYWx1ZUFzU3RyaW5nKG9iaik7CisJLy8gfQorCisJLyoqCisJICogRGVzZXJpYWxpemUgdGhlIGdpdmVuIGpzb24gc3RyaW5nIHRvIGEgbWFwCisJICoKKwkgKiBAcGFyYW0ganNvbgorCSAqICAgICAgICAgICAganNvbiB0ZXh0CisJICogQHJldHVybiBtYXAgb2JqZWN0CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b01hcChTdHJpbmcganNvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IGdldE9uZU9iamVjdE1hcHBlcigpOworCQlKYXZhVHlwZSBtYXBTdHJpbmdPYmplY3RUeXBlID0gbWFwcGVyLmdldFR5cGVGYWN0b3J5KCkuY29uc3RydWN0UGFyYW1ldHJpY1R5cGUoSGFzaE1hcC5jbGFzcywgU3RyaW5nLmNsYXNzLAorCQkJCU9iamVjdC5jbGFzcyk7CisJCXJldHVybiBtYXBwZXIucmVhZFZhbHVlKGpzb24sIG1hcFN0cmluZ09iamVjdFR5cGUpOworCX0KKworCS8qKgorCSAqIERlc2VyaWFsaXplIHRoZSBnaXZlbiBqc29uIHN0cmluZyB0byBhIG1hcAorCSAqCisJICogQHBhcmFtIGpzb24KKwkgKiBAcGFyYW0ga2V5VHlwZUNsYXNzCisJICogQHBhcmFtIHZhbHVlVHlwZUNsYXNzCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gdG9NYXAoU3RyaW5nIGpzb24sIENsYXNzPEs+IGtleVR5cGVDbGFzcywgQ2xhc3M8Vj4gdmFsdWVUeXBlQ2xhc3MpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gZ2V0T25lT2JqZWN0TWFwcGVyKCk7CisJCUphdmFUeXBlIG1hcFN0cmluZ09iamVjdFR5cGUgPSBtYXBwZXIuZ2V0VHlwZUZhY3RvcnkoKS5jb25zdHJ1Y3RQYXJhbWV0cmljVHlwZShIYXNoTWFwLmNsYXNzLCBrZXlUeXBlQ2xhc3MsCisJCQkJdmFsdWVUeXBlQ2xhc3MpOworCQlyZXR1cm4gbWFwcGVyLnJlYWRWYWx1ZShqc29uLCBtYXBTdHJpbmdPYmplY3RUeXBlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIDxWPiBWW10gdG9BcnJheShTdHJpbmcganNvbiwgQ2xhc3M8Vj4gdmFsdWVUeXBlQ2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBnZXRPbmVPYmplY3RNYXBwZXIoKTsKKwkJSmF2YVR5cGUgYXJyYXlTdHJpbmdPYmplY3RUeXBlID0gbWFwcGVyLmdldFR5cGVGYWN0b3J5KCkuY29uc3RydWN0QXJyYXlUeXBlKHZhbHVlVHlwZUNsYXNzKTsKKwkJcmV0dXJuIG1hcHBlci5yZWFkVmFsdWUoanNvbiwgYXJyYXlTdHJpbmdPYmplY3RUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBEZXNlcmlhbGl6ZSB0aGUgZ2l2ZW4ganNvbiBzdHJpbmcgdG8gYSBsaXN0CisJICoKKwkgKiBAcGFyYW0ganNvbgorCSAqICAgICAgICAgICAganNvbiB0ZXh0CisJICogQHJldHVybiBsaXN0IG9iamVjdAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IHRvTGlzdChTdHJpbmcganNvbiwgQ2xhc3M8VD4gY2xhenopIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBnZXRPbmVPYmplY3RNYXBwZXIoKTsKKwkJSmF2YVR5cGUgdHlwZSA9IG1hcHBlci5nZXRUeXBlRmFjdG9yeSgpLmNvbnN0cnVjdENvbGxlY3Rpb25UeXBlKExpc3QuY2xhc3MsIGNsYXp6KTsKKwkJcmV0dXJuIG1hcHBlci5yZWFkVmFsdWUoanNvbiwgdHlwZSk7CisJfQorCisJcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiB0b0xpc3QoU3RyaW5nIGpzb24sIENsYXNzPFQ+IGVsZW1lbnRDbGFzcywgQ2xhc3M8Pz4gZWxlbWVudEdlbmVyaWNDbGFzcykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBnZXRPbmVPYmplY3RNYXBwZXIoKTsKKwkJSmF2YVR5cGUgZWxlbWVudFR5cGUgPSBtYXBwZXIuZ2V0VHlwZUZhY3RvcnkoKS5jb25zdHJ1Y3RQYXJhbWV0cmljVHlwZShlbGVtZW50Q2xhc3MsIGVsZW1lbnRHZW5lcmljQ2xhc3MpOworCQlKYXZhVHlwZSBsaXN0VHlwZSA9IG1hcHBlci5nZXRUeXBlRmFjdG9yeSgpLmNvbnN0cnVjdENvbGxlY3Rpb25UeXBlKExpc3QuY2xhc3MsIGVsZW1lbnRUeXBlKTsKKwkJcmV0dXJuIG1hcHBlci5yZWFkVmFsdWUoanNvbiwgbGlzdFR5cGUpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL01hcEVudHJ5LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9NYXBFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNTYxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9NYXBFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHM7CisKKy8qKgorICogQSBtYXAvc2V0IGVudHJ5IGFzIGEga2V5L3ZhbHVlIG9iamVjdCB0byBiZSBzZXJpYWxpemVkIGFzIGlzLgorICogCisgKiBAYXV0aG9yIGx1YyBib3V0aWVyCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBFbnRyeTxULCBWPiB7CisJcHJpdmF0ZSBUIGtleTsKKwlwcml2YXRlIFYgdmFsdWU7CisKKwlwdWJsaWMgTWFwRW50cnkoKSB7CisJfQorCisJcHVibGljIE1hcEVudHJ5KFQga2V5LCBWIHZhbHVlKSB7CisJCXRoaXMua2V5ID0ga2V5OworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFQgZ2V0S2V5KCkgeworCQlyZXR1cm4ga2V5OworCX0KKworCXB1YmxpYyB2b2lkIHNldEtleShUIGtleSkgeworCQl0aGlzLmtleSA9IGtleTsKKwl9CisKKwlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFYgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL01hcFV0aWwuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL01hcFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDgwMmNlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvTWFwVXRpbC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gZWFzZSBtYXAgbWFuaXB1bGF0aW9uLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWFwVXRpbCB7CisJcHJpdmF0ZSBNYXBVdGlsKCkgeworCX0KKworCS8qKgorCSAqIFRyeSB0byBnZXQgYSB2YWx1ZSBmb2xsb3dpbmcgYSBwYXRoIGluIHRoZSBtYXAuIEZvciBleGFtcGxlIDoKKwkgKiBNYXBVdGlsLmdldChtYXAsICJhLmIuYyIpIGNvcnJlc3BvbmQgdG86IG1hcC5nZXQoYSkuZ2V0KGIpLmdldChjKQorCSAqIAorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIHRoZSBtYXAgdG8gc2VhcmNoIGZvciBwYXRoCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIGtleXMgaW4gdGhlIG1hcCBzZXBhcmF0ZWQgYnkgJy4nCisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE1hcDxTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IG1hcCwgU3RyaW5nIHBhdGgpIHsKKwkJU3RyaW5nW10gdG9rZW5zID0gcGF0aC5zcGxpdCgiXFwuIik7CisJCWlmICh0b2tlbnMubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgeworCQkJT2JqZWN0IHZhbHVlID0gbWFwOworCQkJZm9yIChTdHJpbmcgdG9rZW4gOiB0b2tlbnMpIHsKKwkJCQlpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gbmVzdGVkID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHZhbHVlOworCQkJCQlpZiAobmVzdGVkLmNvbnRhaW5zS2V5KHRva2VuKSkgeworCQkJCQkJdmFsdWUgPSBuZXN0ZWQuZ2V0KHRva2VuKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHZhbHVlOworCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGhhc2ggbWFwIGFuZCBmaWxscyBpdCBmcm9tIHRoZSBnaXZlbiBrZXlzIGFuZCB2YWx1ZXMKKwkgKiAoa2V5c1tpbmRleF0gLT4gdmFsdWVzW2luZGV4XS4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5cworCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIGtleXMuCisJICogQHBhcmFtIHZhbHVlcworCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIHZhbHVlcy4KKwkgKiBAcmV0dXJuIEEgbWFwIHRoYXQgY29udGFpbnMgZm9yIGVhY2gga2V5IGVsZW1lbnQgaW4gdGhlIGtleXMgYXJyYXkgYQorCSAqICAgICAgICAgdmFsdWUgZnJvbSB0aGUgdmFsdWVzIGFycmF5IGF0IHRoZSBzYW1lIGluZGV4LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBuZXdIYXNoTWFwKEtbXSBrZXlzLCBWW10gdmFsdWVzKSB7CisJCU1hcDxLLCBWPiBtYXAgPSBuZXcgSGFzaE1hcDxLLCBWPigpOworCQlpZiAoa2V5cyA9PSBudWxsIHx8IHZhbHVlcyA9PSBudWxsIHx8IGtleXMubGVuZ3RoICE9IHZhbHVlcy5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleXMgYW5kIHZhbHVlcyBtdXN0IGJlIG5vbi1udWxsIGFuZCBoYXZlIHRoZSBzYW1lIHNpemUuIik7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CisJCQltYXAucHV0KGtleXNbaV0sIHZhbHVlc1tpXSk7CisJCX0KKwkJcmV0dXJuIG1hcDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9UeXBlTWFwLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2Rhby91dGlscy9UeXBlTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3ZTY5MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL1R5cGVNYXAuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFR5cGVNYXAgeworCXByaXZhdGUgTWFwPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+LCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBjYWNoZU1hcCA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+LCBNYXA8U3RyaW5nLCBPYmplY3Q+PigpOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE1hcChDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBjbGF6eikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IGNhY2hlTWFwLmdldChjbGF6eik7CisJCWlmIChtYXAgPT0gbnVsbCkgeworCQkJY2FjaGVNYXAucHV0KGNsYXp6LCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSk7CisJCX0KKwkJcmV0dXJuIGNhY2hlTWFwLmdldChjbGF6eik7CisJfQorCisJLyoqCisJICogcHV0IGFuIG9iamVjdCAodmFsdWUpIGluIGl0J3MgdHlwZSBtYXAgdXNpbmcgdGhlIGdpdmVuIGtleS4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICBUaGUga2V5IGluc2lkZSB0aGUgdHlwZSBtYXAuCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGluc2VydCAoYmFzZWQgb24gaXQncyB0eXBlIGFuZCB0aGUgZ2l2ZW4ga2V5KS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisJCWdldE1hcCh2YWx1ZS5nZXRDbGFzcygpKS5wdXQoa2V5LCB2YWx1ZSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBjYWNoZWQgb2JqZWN0IGJhc2VkIG9uIGl0J3MgdHlwZSBhbmQga2V5LgorCSAqIAorCSAqIEBwYXJhbSBjbGF6egorCSAqICAgICAgICAgICAgVGhlIG9iamVjdCdzIHR5cGUuCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgVGhlIG9iamVjdCBrZXkuCisJICogQHJldHVybiBUaGUgb2JqZWN0IHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHR5cGUgYW5kIGtleSBvciBudWxsIGlmIG5vbmUKKwkgKiAgICAgICAgIG1hdGNoZXMuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIDxUPiBUIGdldChDbGFzczxUPiBjbGF6eiwgU3RyaW5nIGtleSkgeworCQlyZXR1cm4gKFQpIChjYWNoZU1hcC5nZXQoY2xhenopID09IG51bGwgPyBudWxsIDogY2FjaGVNYXAuZ2V0KGNsYXp6KS5nZXQoa2V5KSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYW8vdXRpbHMvVXNlclN0YXR1c0VudW0uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL1VzZXJTdGF0dXNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlOWI4NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGFvL3V0aWxzL1VzZXJTdGF0dXNFbnVtLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlsczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLk1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBlbnVtIFVzZXJTdGF0dXNFbnVtIHsKKwlBQ1RJVkUsIElOQUNUSVZFOworCisJcHVibGljIHN0YXRpYyBFaXRoZXI8VXNlclN0YXR1c0VudW0sIE1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtPiBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCUVpdGhlcjxVc2VyU3RhdHVzRW51bSwgTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0+IHJlc3VsdCA9IEVpdGhlci5yaWdodChNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bS5OT1RfRk9VTkQpOworCQlmb3IgKFVzZXJTdGF0dXNFbnVtIHN0YXR1cyA6IFVzZXJTdGF0dXNFbnVtLnZhbHVlcygpKSB7CisJCQlpZiAoc3RhdHVzLm5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChzdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvYXBpL0FydGlmYWN0RGF0YUVudW0uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2FwaS9BcnRpZmFjdERhdGFFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljMDIzZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2FwaS9BcnRpZmFjdERhdGFFbnVtLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5hcGk7CisKK3B1YmxpYyBlbnVtIEFydGlmYWN0RGF0YUVudW0geworCVNFUlZJQ0VfQVJUSUZBQ1QsIENPTVBPTkVOVF9BUlRJRkFDVAorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9hcGkvSVJlc291cmNlVXBsb2FkZXIuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2FwaS9JUmVzb3VyY2VVcGxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWEyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9hcGkvSVJlc291cmNlVXBsb2FkZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLlJlc291cmNlVXBsb2FkU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlNlcnZpY2VBcnRpZmFjdHNEYXRhQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZXhjZXB0aW9uLlJlc291cmNlREFPRXhjZXB0aW9uOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogREFPIHRvIG1hbmFnZSBpbWFnZSB1cGxvYWQgYW5kIHJldHJpZXZhbC4KKyAqIAorICogQGF1dGhvciBsdWMgYm91dGllcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZVVwbG9hZGVyIHsKKworCS8qKgorCSAqIFNhdmUgYW4gYXJ0aWZhY3QgaW4gdGhlIERBTyBsYXllci4KKwkgKiAKKwkgKiBAcGFyYW0gaW1hZ2VEYXRhCisJICovCisJUmVzb3VyY2VVcGxvYWRTdGF0dXMgc2F2ZUFydGlmYWN0KEVTQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSwgYm9vbGVhbiBpc1JlbG9hZCk7CisKKwkvKioKKwkgKiBTYXZlIGFuIGFydGlmYWN0IGluIHRoZSBEQU8gbGF5ZXIuCisJICogCisJICogQHBhcmFtIGltYWdlRGF0YQorCSAqLworCVJlc291cmNlVXBsb2FkU3RhdHVzIHVwZGF0ZUFydGlmYWN0KEVTQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSk7CisKKwkvKioKKwkgKiBHZXQgYW4gYXJ0aWZhY3QgYXMgYSBieXRlIGFycmF5IGJhc2VkIG9uIHRoZSBhcnRpZmFjdCBpZC4KKwkgKiAKKwkgKiBAcGFyYW0gaWQKKwkgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgYXJ0aWZhY3QgdG8gcmVhZC4KKwkgKiBAcmV0dXJuIFRoZSBhcnRpZmFjdCBhcyBhIGJ5dGUgYXJyYXkuCisJICovCisJRWl0aGVyPEVTQXJ0aWZhY3REYXRhLCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZ2V0QXJ0aWZhY3QoU3RyaW5nIGlkKTsKKworCS8qKgorCSAqIERlbGV0ZSB0aGUgZ2l2ZW4gaW1hZ2UuCisJICogCisJICogQHBhcmFtIGlkCisJICogICAgICAgICAgICBJZCBvZiB0aGUgaW1hZ2UgdG8gZGVsZXRlLgorCSAqLworCXZvaWQgZGVsZXRlQXJ0aWZhY3QoU3RyaW5nIGlkKTsKKworCS8qKgorCSAqIGRlbGV0ZSBhbGwgYXJ0aWZhY3RzCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlQWxsQXJ0aWZhY3RzKCk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0FkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTZlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0FkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaWRUb0tleTsKKworCXB1YmxpYyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlcnMpOworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhKEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiwKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgTWFwPFN0cmluZywgU3RyaW5nPiBpZFRvS2V5KSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlcnMpOworCQl0aGlzLmFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24gPSBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uOworCQl0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworCQl0aGlzLmlkVG9LZXkgPSBpZFRvS2V5OworCX0KKworCXB1YmxpYyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJdGhpcygpOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24KKwkJCQkuc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24KKwkJCQkuc2V0Q3JlYXRpb25UaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCisJCWFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24KKwkJCQkuc2V0TW9kaWZpY2F0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uLnNldExhc3RDcmVhdGVkQ291bnRlcigKKwkJCQkoSW50ZWdlcikgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUWV9DT1VOVEVSLmdldFByb3BlcnR5KCkpKTsKKwkJVHlwZSBtYXBUeXBlID0gbmV3IFR5cGVUb2tlbjxIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwcmFtZXRlcnNmcm9tSnNvbiA9IGdldEdzb24oKS5mcm9tSnNvbigKKwkJCQkoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFERElUSU9OQUxfSU5GT19QQVJBTVMuZ2V0UHJvcGVydHkoKSksIG1hcFR5cGUpOworCisJCXRoaXMuc2V0UGFyYW1ldGVycyhwcmFtZXRlcnNmcm9tSnNvbik7CisKKwkJLy8gdGhpcy5zZXRQYXJhbWV0ZXJzKChIYXNoTWFwPFN0cmluZywgU3RyaW5nPikgcHJvcGVydGllcworCQkvLyAuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQURESVRJT05BTF9JTkZPX1BBUkFNUworCQkvLyAuZ2V0UHJvcGVydHkoKSkpOworCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGlkVG9LZXlmcm9tSnNvbiA9IGdldEdzb24oKS5mcm9tSnNvbigKKwkJCQkoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFERElUSU9OQUxfSU5GT19JRF9UT19LRVkuZ2V0UHJvcGVydHkoKSksIG1hcFR5cGUpOworCisJCXRoaXMuc2V0SWRUb0tleShpZFRvS2V5ZnJvbUpzb24pOworCQkvLyB0aGlzLnNldElkVG9LZXkoKEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KSBwcm9wZXJ0aWVzCisJCS8vIC5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BRERJVElPTkFMX0lORk9fSURfVE9fS0VZCisJCS8vIC5nZXRQcm9wZXJ0eSgpKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQsIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisKKwkJLy8gU3RyaW5nIHBhcmFtZXRlcnNUb0pzb24gPSBnZXRHc29uKCkudG9Kc29uKGdldFBhcmFtZXRlcnMoKSk7CisKKwkJLy8gYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFERElUSU9OQUxfSU5GT19QQVJBTVMsCisJCS8vIHBhcmFtZXRlcnNUb0pzb24pOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQURESVRJT05BTF9JTkZPX1BBUkFNUywgZ2V0UGFyYW1ldGVycygpKTsKKworCQkvLyBTdHJpbmcgaWRUb0tleVRvSnNvbiA9IGdldEdzb24oKS50b0pzb24oZ2V0SWRUb0tleSgpKTsKKwkJLy8gYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFERElUSU9OQUxfSU5GT19JRF9UT19LRVksCisJCS8vIGlkVG9LZXlUb0pzb24pOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQURESVRJT05BTF9JTkZPX0lEX1RPX0tFWSwgZ2V0SWRUb0tleSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwKKwkJCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uLmdldENyZWF0aW9uVGltZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwKKwkJCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uLmdldE1vZGlmaWNhdGlvblRpbWUoKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRZX0NPVU5URVIsCisJCQkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbi5nZXRMYXN0Q3JlYXRlZENvdW50ZXIoKSk7CisKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCX0KKworCXB1YmxpYyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uIGdldEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24oKSB7CisJCXJldHVybiBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24oCisJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24pIHsKKwkJdGhpcy5hZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uID0gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKCkgeworCQlyZXR1cm4gcGFyYW1ldGVyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgeworCQl0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldElkVG9LZXkoKSB7CisJCXJldHVybiBpZFRvS2V5OworCX0KKworCXB1YmxpYyB2b2lkIHNldElkVG9LZXkoTWFwPFN0cmluZywgU3RyaW5nPiBpZFRvS2V5KSB7CisJCXRoaXMuaWRUb0tleSA9IGlkVG9LZXk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJQcm9wZXJ0eURhdGEgW3BhcmFtZXRlcnM9ICIgKyBwYXJhbWV0ZXJzICsgIiBpZFRvS2V5PSAiICsgaWRUb0tleQorCQkJCSsgIiwgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbj0iICsgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0FydGlmYWN0RGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9BcnRpZmFjdERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRhMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9BcnRpZmFjdERhdGEuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQXJ0aWZhY3REYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3REYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXByaXZhdGUgQXJ0aWZhY3REYXRhRGVmaW5pdGlvbiBhcnRpZmFjdERhdGFEZWZpbml0aW9uOworCisJcHVibGljIEFydGlmYWN0RGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbiA9IG5ldyBBcnRpZmFjdERhdGFEZWZpbml0aW9uKCk7CisJfQorCisJcHVibGljIEFydGlmYWN0RGF0YShBcnRpZmFjdERhdGFEZWZpbml0aW9uIGFydGlmYWN0RGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmKTsKKwkJdGhpcy5hcnRpZmFjdERhdGFEZWZpbml0aW9uID0gYXJ0aWZhY3REYXRhRGVmaW5pdGlvbjsKKworCX0KKworCXB1YmxpYyBBcnRpZmFjdERhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMoKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQkuc2V0QXJ0aWZhY3RUeXBlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfVFlQRS5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQkuc2V0QXJ0aWZhY3RSZWYoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9SRUYuZ2V0UHJvcGVydHkoKSkpOworCQlhcnRpZmFjdERhdGFEZWZpbml0aW9uLnNldEFydGlmYWN0TmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkpOworCQlhcnRpZmFjdERhdGFEZWZpbml0aW9uLnNldEFydGlmYWN0UmVwb3NpdG9yeSgKKwkJCQkoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX1JFUE9TSVRPUlkuZ2V0UHJvcGVydHkoKSkpOworCQlhcnRpZmFjdERhdGFEZWZpbml0aW9uLnNldEFydGlmYWN0Q2hlY2tzdW0oCisJCQkJKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9DSEVDS1NVTS5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQkuc2V0QXJ0aWZhY3RDcmVhdG9yKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRPUi5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQkuc2V0VXNlcklkQ3JlYXRvcigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFUVF9DUkVBVE9SLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRVc2VySWRMYXN0VXBkYXRlcigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfVVBEQVRFUi5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQkuc2V0Q3JlYXRvckZ1bGxOYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRPUl9GVUxMX05BTUUuZ2V0UHJvcGVydHkoKSkpOworCQlhcnRpZmFjdERhdGFEZWZpbml0aW9uCisJCQkJLnNldFVwZGF0ZXJGdWxsTmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVQREFURVJfRlVMTF9OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRDcmVhdGlvbkRhdGUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURS5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQkuc2V0TGFzdFVwZGF0ZURhdGUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24KKwkJCQkuc2V0RGVzY3JpcHRpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTi5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24uc2V0RXNJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkVTX0lELmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRBcnRpZmFjdExhYmVsKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfTEFCRUwuZ2V0UHJvcGVydHkoKSkpOworCQlhcnRpZmFjdERhdGFEZWZpbml0aW9uCisJCQkJLnNldE1hbmRhdG9yeSgoQm9vbGVhbikgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19BQlNUUkFDVC5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24uc2V0QXJ0aWZhY3RDaGVja3N1bSgKKwkJCQkoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX0NIRUNLU1VNLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5zZXRBcnRpZmFjdERpc3BsYXlOYW1lKAorCQkJCShTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfRElTUExBWV9OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5zZXRBcGlVcmwoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUElfVVJMLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRTZXJ2aWNlQXBpKChCb29sZWFuKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNFUlZJQ0VfQVBJLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRBcnRpZmFjdFZlcnNpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9WRVJTSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRBcnRpZmFjdFVVSUQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9VVUlELmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5zZXRQYXlsb2FkVXBkYXRlRGF0ZSgKKwkJCQkoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QQVlMT0FEX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKwkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5zZXRIZWF0UGFyYW1zVXBkYXRlRGF0ZSgKKwkJCQkoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5IRUFUX1BBUkFNU19VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisJCWFydGlmYWN0RGF0YURlZmluaXRpb24uc2V0R2VuZXJhdGVkKChCb29sZWFuKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkdFTkVSQVRFRC5nZXRQcm9wZXJ0eSgpKSk7CisJCVR5cGUgbGlzdFR5cGUgPSBuZXcgVHlwZVRva2VuPExpc3Q8U3RyaW5nPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlMaXN0PFN0cmluZz4gcmVxdWlyZWRBcnRpZmFjdHNmcm9tSnNvbiA9IGdldEdzb24oKS5mcm9tSnNvbigKKwkJCQkoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX0FSVElGQUNUUy5nZXRQcm9wZXJ0eSgpKSwgbGlzdFR5cGUpOworCQlhcnRpZmFjdERhdGFEZWZpbml0aW9uLnNldFJlcXVpcmVkQXJ0aWZhY3RzKHJlcXVpcmVkQXJ0aWZhY3RzZnJvbUpzb24pOworCisJCVN0cmluZyBncm91cFR5cGUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX0dST1VQX1RZUEUuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChncm91cFR5cGUgIT0gbnVsbCAmJiAhZ3JvdXBUeXBlLmlzRW1wdHkoKSkgeworCisJCQlhcnRpZmFjdERhdGFEZWZpbml0aW9uLnNldEFydGlmYWN0R3JvdXBUeXBlKEFydGlmYWN0R3JvdXBUeXBlRW51bS5maW5kVHlwZShncm91cFR5cGUpKTsKKwkJfQorCisJCUludGVnZXIgdGltZW91dCA9IChJbnRlZ2VyKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX1RJTUVPVVQuZ2V0UHJvcGVydHkoKSk7CisJCWlmICh0aW1lb3V0ICE9IG51bGwpIHsKKworCQkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5zZXRUaW1lb3V0KHRpbWVvdXQpOworCQl9CisKKwl9CisKKwlwdWJsaWMgQXJ0aWZhY3REYXRhRGVmaW5pdGlvbiBnZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gYXJ0aWZhY3REYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKEFydGlmYWN0RGF0YURlZmluaXRpb24gYXJ0aWZhY3REYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmFydGlmYWN0RGF0YURlZmluaXRpb24gPSBhcnRpZmFjdERhdGFEZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfVFlQRSwgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9SRUYsIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0QXJ0aWZhY3RSZWYoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX1JFUE9TSVRPUlksIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfQ0hFQ0tTVU0sIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0QXJ0aWZhY3RDaGVja3N1bSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUT1IsIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0QXJ0aWZhY3RDcmVhdG9yKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVRUX0NSRUFUT1IsIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0VXNlcklkQ3JlYXRvcigpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfVVBEQVRFUiwgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRVc2VySWRMYXN0VXBkYXRlcigpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUT1JfRlVMTF9OQU1FLCBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldENyZWF0b3JGdWxsTmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVQREFURVJfRlVMTF9OQU1FLCBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldFVwZGF0ZXJGdWxsTmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUsIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0Q3JlYXRpb25EYXRlKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRMYXN0VXBkYXRlRGF0ZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuRVNfSUQsIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0RXNJZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX0xBQkVMLCBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19BQlNUUkFDVCwgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRNYW5kYXRvcnkoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9DSEVDS1NVTSwgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRBcnRpZmFjdENoZWNrc3VtKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfRElTUExBWV9OQU1FLAorCQkJCWFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFQSV9VUkwsIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0QXBpVXJsKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU0VSVklDRV9BUEksIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0U2VydmljZUFwaSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX1RJTUVPVVQsIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0VGltZW91dCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX1ZFUlNJT04sIGFydGlmYWN0RGF0YURlZmluaXRpb24uZ2V0QXJ0aWZhY3RWZXJzaW9uKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfVVVJRCwgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRBcnRpZmFjdFVVSUQoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QQVlMT0FEX1VQREFURV9EQVRFLCBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldFBheWxvYWRVcGRhdGVEYXRlKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSEVBVF9QQVJBTVNfVVBEQVRFX0RBVEUsCisJCQkJYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRIZWF0UGFyYW1zVXBkYXRlRGF0ZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX0FSVElGQUNUUywgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRSZXF1aXJlZEFydGlmYWN0cygpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkdFTkVSQVRFRCwgYXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5nZXRHZW5lcmF0ZWQoKSk7CisJCQorCQlTdHJpbmcgZ3JvdXBUeXBlID0gbnVsbDsKKwkJQXJ0aWZhY3RHcm91cFR5cGVFbnVtIGdyb3VwVHlwZUVudW0gPSBhcnRpZmFjdERhdGFEZWZpbml0aW9uLmdldEFydGlmYWN0R3JvdXBUeXBlKCk7CisJCWlmIChncm91cFR5cGVFbnVtICE9IG51bGwpIHsKKwkJCWdyb3VwVHlwZSA9IGdyb3VwVHlwZUVudW0uZ2V0VHlwZSgpOworCQl9CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9HUk9VUF9UWVBFLCBncm91cFR5cGUpOworCisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJBcnRpZmFjdERhdGEgW2FydGlmYWN0RGF0YURlZmluaXRpb249IiArIGFydGlmYWN0RGF0YURlZmluaXRpb24gKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0F0dHJpYnV0ZURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQXR0cmlidXRlRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YThjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0F0dHJpYnV0ZURhdGEuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5BdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlRGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisJQXR0cmlidXRlRGF0YURlZmluaXRpb24gYXR0cmlidXRlRGF0YURlZmluaXRpb247CisKKwlwdWJsaWMgQXR0cmlidXRlRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkF0dHJpYnV0ZSk7CisJCWF0dHJpYnV0ZURhdGFEZWZpbml0aW9uID0gbmV3IEF0dHJpYnV0ZURhdGFEZWZpbml0aW9uKCk7CisJfQorCisJcHVibGljIEF0dHJpYnV0ZURhdGEoQXR0cmlidXRlRGF0YURlZmluaXRpb24gYXR0cmlidXRlRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkF0dHJpYnV0ZSk7CisJCXRoaXMuYXR0cmlidXRlRGF0YURlZmluaXRpb24gPSBhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkF0dHJpYnV0ZURhdGEgW2F0dHJpYnV0ZURhdGFEZWZpbml0aW9uPSIgKyBhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbiArICJdIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gYXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlRGF0YURlZmluaXRpb24gZ2V0QXR0cmlidXRlRGF0YURlZmluaXRpb24oKSB7CisJCXJldHVybiBhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbihBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbiBhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmF0dHJpYnV0ZURhdGFEZWZpbml0aW9uID0gYXR0cmlidXRlRGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIEF0dHJpYnV0ZURhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJdGhpcygpOworCisJCWF0dHJpYnV0ZURhdGFEZWZpbml0aW9uLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKworCQlhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5zZXRUeXBlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJYXR0cmlidXRlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0RGVzY3JpcHRpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTi5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVGQVVMVF9WQUxVRS5nZXRQcm9wZXJ0eSgpKTsKKwkJaWYgKENvbnN0YW50cy5HUkFQSF9FTVBUWV9WQUxVRS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgeworCQkJYXR0cmlidXRlRGF0YURlZmluaXRpb24uc2V0RGVmYXVsdFZhbHVlKG51bGwpOworCQl9IGVsc2UgeworCQkJYXR0cmlidXRlRGF0YURlZmluaXRpb24uc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisJCX0KKworCQlhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5zZXRTdGF0dXMoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFUVVMuZ2V0UHJvcGVydHkoKSkpOworCisJCWF0dHJpYnV0ZURhdGFEZWZpbml0aW9uLnNldE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpKTsKKworCQlhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5zZXRWYWx1ZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTFVFLmdldFByb3BlcnR5KCkpKTsKKworCQlUeXBlIHNjaGVtYVR5cGUgPSBuZXcgVHlwZVRva2VuPFNjaGVtYURlZmluaXRpb24+KCkgeworCQl9LmdldFR5cGUoKTsKKwkJU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWEgPSBnZXRHc29uKCkKKwkJCQkuZnJvbUpzb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5FTlRSWV9TQ0hFTUEuZ2V0UHJvcGVydHkoKSksIHNjaGVtYVR5cGUpOworCQlhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5zZXRTY2hlbWEoc2NoZW1hKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgYXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUsIGF0dHJpYnV0ZURhdGFEZWZpbml0aW9uLmdldFR5cGUoKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7CisJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgeworCQkJZGVmYXVsdFZhbHVlID0gQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFOworCQl9CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFRkFVTFRfVkFMVUUsIGRlZmF1bHRWYWx1ZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRVUywgYXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0U3RhdHVzKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBhdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5nZXROYW1lKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WQUxVRSwgYXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0VmFsdWUoKSk7CisKKwkJU2NoZW1hRGVmaW5pdGlvbiBlbnRyeVNjaGVtYSA9IGF0dHJpYnV0ZURhdGFEZWZpbml0aW9uLmdldFNjaGVtYSgpOworCQlpZiAoZW50cnlTY2hlbWEgIT0gbnVsbCkgeworCQkJU3RyaW5nIGVudHJ5U2NoZW1hU3RyID0gZ2V0R3NvbigpLnRvSnNvbihlbnRyeVNjaGVtYSk7CisJCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuRU5UUllfU0NIRU1BLCBlbnRyeVNjaGVtYVN0cik7CisJCX0KKworCQlyZXR1cm4gbWFwOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9BdHRyaWJ1dGVWYWx1ZURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQXR0cmlidXRlVmFsdWVEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4Y2UxZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQXR0cmlidXRlVmFsdWVEYXRhLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIEF0dHJpYnV0ZVZhbHVlRGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisKKwlwcml2YXRlIEJvb2xlYW4gaGlkZGVuOworCisJcHJpdmF0ZSBMb25nIGNyZWF0aW9uVGltZTsKKworCXByaXZhdGUgTG9uZyBtb2RpZmljYXRpb25UaW1lOworCisJcHVibGljIEF0dHJpYnV0ZVZhbHVlRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkF0dHJpYnV0ZVZhbHVlKTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlVmFsdWVEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQl0aGlzKCk7CisKKwkJdGhpcy5zZXRUeXBlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJU3RyaW5nIHVwZGF0ZWRWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMVUUuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChDb25zdGFudHMuR1JBUEhfRU1QVFlfVkFMVUUuZXF1YWxzKHVwZGF0ZWRWYWx1ZSkpIHsKKwkJCXRoaXMuc2V0VmFsdWUobnVsbCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldFZhbHVlKHVwZGF0ZWRWYWx1ZSk7CisJCX0KKworCQl0aGlzLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldEhpZGRlbigoQm9vbGVhbikgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ISURERU4uZ2V0UHJvcGVydHkoKSkpOworCisJCXRoaXMuc2V0Q3JlYXRpb25UaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCisJCXRoaXMuc2V0TW9kaWZpY2F0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUoTG9uZyBjcmVhdGlvblRpbWUpIHsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TW9kaWZpY2F0aW9uVGltZSgpIHsKKwkJcmV0dXJuIG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uVGltZShMb25nIG1vZGlmaWNhdGlvblRpbWUpIHsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgdW5pcXVlSWQpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLCB0eXBlKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSElEREVOLCBoaWRkZW4pOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBjcmVhdGlvblRpbWUpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBtb2RpZmljYXRpb25UaW1lKTsKKworCQlTdHJpbmcgdXBkYXRlZFZhbHVlID0gT2JqZWN0cy5pc051bGwodmFsdWUpID8gQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFIDogdmFsdWU7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WQUxVRSwgdXBkYXRlZFZhbHVlKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkF0dHJpYnV0ZVZhbHVlRGF0YSBbdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgaGlkZGVuPSIgKyBoaWRkZW4gKyAiLCB0eXBlPSIgKyB0eXBlICsgIiwgY3JlYXRpb25UaW1lPSIKKwkJCQkrIGNyZWF0aW9uVGltZSArICIsIHZhbHVlPSIgKyB2YWx1ZSArICIsIG1vZGlmaWNhdGlvblRpbWU9IiArIG1vZGlmaWNhdGlvblRpbWUgKyAiXSI7CisJfQorCisJcHVibGljIEJvb2xlYW4gaXNIaWRkZW4oKSB7CisJCXJldHVybiBoaWRkZW47CisJfQorCisJcHVibGljIHZvaWQgc2V0SGlkZGVuKEJvb2xlYW4gaGlkZGVuKSB7CisJCXRoaXMuaGlkZGVuID0gaGlkZGVuOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9DYXBhYmlsaXR5RGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9DYXBhYmlsaXR5RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODI0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NhcGFiaWxpdHlEYXRhLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworcHVibGljIGNsYXNzIENhcGFiaWxpdHlEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNSU5fT0NDVVJSRU5DRVMgPSAiMSI7IC8vIG9jY3VycmVuY2VzCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFYX09DQ1VSUkVOQ0VTID0gIlVOQk9VTkRFRCI7CisKKwlwdWJsaWMgQ2FwYWJpbGl0eURhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5KTsKKworCX0KKworCXB1YmxpYyBDYXBhYmlsaXR5RGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcygpOworCisJCXRoaXMuc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCisJCVR5cGUgbGlzdFR5cGUgPSBuZXcgVHlwZVRva2VuPExpc3Q8U3RyaW5nPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlMaXN0PFN0cmluZz4gdmFsaWRTb3VyY2VUeXBlc2Zyb21Kc29uID0gZ2V0R3NvbigpLmZyb21Kc29uKAorCQkJCShTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMSURfU09VUkNFX1RZUEVTLmdldFByb3BlcnR5KCkpLCBsaXN0VHlwZSk7CisKKwkJdGhpcy5zZXRWYWxpZFNvdXJjZVR5cGVzKHZhbGlkU291cmNlVHlwZXNmcm9tSnNvbik7CisKKwkJdGhpcy5zZXRDcmVhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJdGhpcy5zZXRNb2RpZmljYXRpb25UaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfVVBEQVRFX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCisJCXRoaXMuc2V0RGVzY3JpcHRpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTi5nZXRQcm9wZXJ0eSgpKSk7CisJCXRoaXMuc2V0TWluT2NjdXJyZW5jZXMoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5NSU5fT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSkpOworCQl0aGlzLnNldE1heE9jY3VycmVuY2VzKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTUFYX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJLyoqIElkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNhcGFiaWxpdHkuICovCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkU291cmNlVHlwZXM7CisKKwlwcml2YXRlIExvbmcgY3JlYXRpb25UaW1lOworCisJcHJpdmF0ZSBMb25nIG1vZGlmaWNhdGlvblRpbWU7CisKKwlwcml2YXRlIFN0cmluZyBtaW5PY2N1cnJlbmNlcyA9IE1JTl9PQ0NVUlJFTkNFUzsKKwlwcml2YXRlIFN0cmluZyBtYXhPY2N1cnJlbmNlcyA9IE1BWF9PQ0NVUlJFTkNFUzsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsaWRTb3VyY2VUeXBlcygpIHsKKwkJcmV0dXJuIHZhbGlkU291cmNlVHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsaWRTb3VyY2VUeXBlcyhMaXN0PFN0cmluZz4gdmFsaWRTb3VyY2VUeXBlcykgeworCQl0aGlzLnZhbGlkU291cmNlVHlwZXMgPSB2YWxpZFNvdXJjZVR5cGVzOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUoTG9uZyBjcmVhdGlvblRpbWUpIHsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TW9kaWZpY2F0aW9uVGltZSgpIHsKKwkJcmV0dXJuIG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uVGltZShMb25nIG1vZGlmaWNhdGlvblRpbWUpIHsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1pbk9jY3VycmVuY2VzKCkgeworCQlyZXR1cm4gbWluT2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWluT2NjdXJyZW5jZXMoU3RyaW5nIG1pbk9jY3VycmVuY2VzKSB7CisJCWlmIChtaW5PY2N1cnJlbmNlcyAhPSBudWxsKSB7CisJCQl0aGlzLm1pbk9jY3VycmVuY2VzID0gbWluT2NjdXJyZW5jZXM7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1heE9jY3VycmVuY2VzKCkgeworCQlyZXR1cm4gbWF4T2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWF4T2NjdXJyZW5jZXMoU3RyaW5nIG1heE9jY3VycmVuY2VzKSB7CisJCWlmIChtYXhPY2N1cnJlbmNlcyAhPSBudWxsKSB7CisJCQl0aGlzLm1heE9jY3VycmVuY2VzID0gbWF4T2NjdXJyZW5jZXM7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgdW5pcXVlSWQpOworCisJCS8vIFN0cmluZyB2YWxpZFNvdXJjZVR5cGVzVG9Kc29uID0gZ2V0R3NvbigpLnRvSnNvbih2YWxpZFNvdXJjZVR5cGVzKTsKKworCQkvLyBhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMSURfU09VUkNFX1RZUEVTLAorCQkvLyB2YWxpZFNvdXJjZVR5cGVzVG9Kc29uKTsKKwkJLy8gYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTElEX1NPVVJDRV9UWVBFUywKKwkJLy8gdmFsaWRTb3VyY2VUeXBlcyk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTElEX1NPVVJDRV9UWVBFUywgdmFsaWRTb3VyY2VUeXBlcyk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUsIGNyZWF0aW9uVGltZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfVVBEQVRFX0RBVEUsIG1vZGlmaWNhdGlvblRpbWUpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTiwgZGVzY3JpcHRpb24pOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTUlOX09DQ1VSUkVOQ0VTLCBtaW5PY2N1cnJlbmNlcyk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5NQVhfT0NDVVJSRU5DRVMsIG1heE9jY3VycmVuY2VzKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQ2FwYWJpbGl0eURhdGEgW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIHR5cGU9IiArIHR5cGUKKwkJCQkrICIsIHZhbGlkU291cmNlVHlwZXM9IiArIHZhbGlkU291cmNlVHlwZXMgKyAiLCBjcmVhdGlvblRpbWU9IiArIGNyZWF0aW9uVGltZSArICIsIG1vZGlmaWNhdGlvblRpbWU9IgorCQkJCSsgbW9kaWZpY2F0aW9uVGltZSArICIsIG1pbk9jY3VycmVuY2VzPSIgKyBtaW5PY2N1cnJlbmNlcyArICIsIG1heE9jY3VycmVuY2VzPSIgKyBtYXhPY2N1cnJlbmNlcyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQ2FwYWJpbGl0eUluc3REYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NhcGFiaWxpdHlJbnN0RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWJmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NhcGFiaWxpdHlJbnN0RGF0YS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworcHVibGljIGNsYXNzIENhcGFiaWxpdHlJbnN0RGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisKKwlwdWJsaWMgQ2FwYWJpbGl0eUluc3REYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eUluc3QpOworCX0KKworCXB1YmxpYyBDYXBhYmlsaXR5SW5zdERhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMoKTsKKworCQl0aGlzLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKworCQlUeXBlIGxpc3RUeXBlID0gbmV3IFR5cGVUb2tlbjxMaXN0PFN0cmluZz4+KCkgeworCQl9LmdldFR5cGUoKTsKKwkJTGlzdDxTdHJpbmc+IHByb3BlcnRpZXNmcm9tSnNvbiA9IGdldEdzb24oKQorCQkJCS5mcm9tSnNvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRJRVMuZ2V0UHJvcGVydHkoKSksIGxpc3RUeXBlKTsKKworCQl0aGlzLnNldFByb3BlcnRpZXMocHJvcGVydGllc2Zyb21Kc29uKTsKKworCQkvLyB0aGlzLnNldFByb3BlcnRpZXMoKEFycmF5TGlzdDxTdHJpbmc+KSBwcm9wZXJ0aWVzCisJCS8vIC5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUSUVTLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldENyZWF0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldE1vZGlmaWNhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBwcm9wZXJ0aWVzOworCisJcHJpdmF0ZSBMb25nIGNyZWF0aW9uVGltZTsKKworCXByaXZhdGUgTG9uZyBtb2RpZmljYXRpb25UaW1lOworCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIExvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworCQlyZXR1cm4gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShMb25nIGNyZWF0aW9uVGltZSkgeworCQl0aGlzLmNyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRNb2RpZmljYXRpb25UaW1lKCkgeworCQlyZXR1cm4gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25UaW1lKExvbmcgbW9kaWZpY2F0aW9uVGltZSkgeworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhMaXN0PFN0cmluZz4gcHJvcGVydGllcykgeworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCB1bmlxdWVJZCk7CisKKwkJLy8gU3RyaW5nIHByb3BlcnRpZXNUb0pzb24gPSBnZXRHc29uKCkudG9Kc29uKHByb3BlcnRpZXMpOworCisJCS8vIGFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUSUVTLAorCQkvLyBwcm9wZXJ0aWVzVG9Kc29uKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVElFUywgcHJvcGVydGllcyk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUsIGNyZWF0aW9uVGltZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfVVBEQVRFX0RBVEUsIG1vZGlmaWNhdGlvblRpbWUpOworCisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJDYXBhYmlsaXR5SW5zdERhdGEgW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIHByb3BlcnRpZXM9IiArIHByb3BlcnRpZXMgKyAiLCBjcmVhdGlvblRpbWU9IgorCQkJCSsgY3JlYXRpb25UaW1lICsgIiwgbW9kaWZpY2F0aW9uVGltZT0iICsgbW9kaWZpY2F0aW9uVGltZSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQ2FwYWJpbGl0eVR5cGVEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NhcGFiaWxpdHlUeXBlRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZThjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NhcGFiaWxpdHlUeXBlRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5DYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBDYXBhYmlsaXR5VHlwZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJQ2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uOworCisJLy8gcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29uc3RyYWludHM7CisKKwlwdWJsaWMgQ2FwYWJpbGl0eVR5cGVEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUpOworCQljYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uID0gbmV3IENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgQ2FwYWJpbGl0eVR5cGVEYXRhKENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24gY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUpOworCQl0aGlzLmNhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24gPSBjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uOworCQkvLyB0aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7CisJfQorCisJcHVibGljIENhcGFiaWxpdHlUeXBlRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKworCQl0aGlzKCk7CisKKwkJY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5zZXRUeXBlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXREZXNjcmlwdGlvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLmdldFByb3BlcnR5KCkpKTsKKworCQlUeXBlIGxpc3RUeXBlID0gbmV3IFR5cGVUb2tlbjxMaXN0PFN0cmluZz4+KCkgeworCQl9LmdldFR5cGUoKTsKKwkJTGlzdDxTdHJpbmc+IHZhbGlkU291cmNlVHlwZXNmcm9tSnNvbiA9IGdldEdzb24oKS5mcm9tSnNvbigKKwkJCQkoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTElEX1NPVVJDRV9UWVBFUy5nZXRQcm9wZXJ0eSgpKSwgbGlzdFR5cGUpOworCisJCWNhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24uc2V0VmFsaWRTb3VyY2VUeXBlcyh2YWxpZFNvdXJjZVR5cGVzZnJvbUpzb24pOworCisJCS8vIGNhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24uc2V0VmFsaWRTb3VyY2VUeXBlcygoTGlzdDxTdHJpbmc+KQorCQkvLyBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTElEX1NPVVJDRV9UWVBFUworCQkvLyAuZ2V0UHJvcGVydHkoKSkpOworCisJCWNhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0Q3JlYXRpb25UaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCisJCWNhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0TW9kaWZpY2F0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQkvLyBjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uLnNldFZlcnNpb24odmVyc2lvbik7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRSwgY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTiwgY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKworCQkvLyBTdHJpbmcgdmFsaWRTb3VyY2VUeXBlc1RvSnNvbiA9CisJCS8vIGdldEdzb24oKS50b0pzb24oY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5nZXRWYWxpZFNvdXJjZVR5cGVzKCkpOworCisJCS8vIGFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WQUxJRF9TT1VSQ0VfVFlQRVMsCisJCS8vIHZhbGlkU291cmNlVHlwZXNUb0pzb24pOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WQUxJRF9TT1VSQ0VfVFlQRVMsCisJCQkJY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5nZXRWYWxpZFNvdXJjZVR5cGVzKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uLmdldENyZWF0aW9uVGltZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwKKwkJCQljYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uLmdldE1vZGlmaWNhdGlvblRpbWUoKSk7CisKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwdWJsaWMgQ2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbiBnZXRDYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uKENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24gY2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmNhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24gPSBjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQ2FwYWJpbGl0eVR5cGVEYXRhIFtjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uPSIgKyBjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB0aGlzLmNhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQ2F0ZWdvcnlEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NhdGVnb3J5RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmRlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NhdGVnb3J5RGF0YS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2F0ZWdvcnlEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplZE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVVbmlxdWVJZCgpOworCisJcHJvdGVjdGVkIENhdGVnb3J5RGF0YShOb2RlVHlwZUVudW0gbGFiZWwpIHsKKwkJc3VwZXIobGFiZWwpOworCX0KKworCXByb3RlY3RlZCBDYXRlZ29yeURhdGEoU3RyaW5nIG5hbWUsIFN0cmluZyBub3JtYWxpemVkTmFtZSwgTm9kZVR5cGVFbnVtIGxhYmVsKSB7CisJCXN1cGVyKGxhYmVsKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5ub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZWROYW1lOworCX0KKworCXByb3RlY3RlZCBDYXRlZ29yeURhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzLCBOb2RlVHlwZUVudW0gbGFiZWwpIHsKKwkJc3VwZXIobGFiZWwpOworCQlzZXROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisJCXNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKwkJc2V0Tm9ybWFsaXplZE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OT1JNQUxJWkVEX05BTUUuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBuYW1lKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgdW5pcXVlSWQpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLCBub3JtYWxpemVkTmFtZSk7CisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROb3JtYWxpemVkTmFtZSgpIHsKKwkJcmV0dXJuIG5vcm1hbGl6ZWROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vcm1hbGl6ZWROYW1lKFN0cmluZyBub3JtYWxpemVkTmFtZSkgeworCQl0aGlzLm5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplZE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNhdGVnb3J5RGF0YSBbbmFtZT0iICsgbmFtZSArICIsIG5vcm1hbGl6ZWROYW1lPSIgKyBub3JtYWxpemVkTmFtZSArICJ1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiXSI7CisJfQorCisJLyoKKwkgKiBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsgZmluYWwgaW50IHByaW1lID0gMzE7IGludCByZXN1bHQgPSAxOworCSAqIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7IHJlc3VsdAorCSAqID0gcHJpbWUgKiByZXN1bHQgKyAoKHVuaXF1ZUlkID09IG51bGwpID8gMCA6IHVuaXF1ZUlkLmhhc2hDb2RlKCkpOyByZXR1cm4KKwkgKiByZXN1bHQ7IH0KKwkgKiAKKwkgKiBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4KKwkgKiB0cnVlOyBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJICogcmV0dXJuIGZhbHNlOyBDYXRlZ29yeURhdGEgb3RoZXIgPSAoQ2F0ZWdvcnlEYXRhKSBvYmo7IGlmIChuYW1lID09IG51bGwpCisJICogeyBpZiAob3RoZXIubmFtZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7IH0gZWxzZSBpZgorCSAqICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpIHJldHVybiBmYWxzZTsgaWYgKHVuaXF1ZUlkID09IG51bGwpIHsgaWYKKwkgKiAob3RoZXIudW5pcXVlSWQgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOyB9IGVsc2UgaWYKKwkgKiAoIXVuaXF1ZUlkLmVxdWFscyhvdGhlci51bmlxdWVJZCkpIHJldHVybiBmYWxzZTsgcmV0dXJuIHRydWU7IH0KKwkgKi8KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWRLZXkoKSB7CisJCXJldHVybiBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQ29tcG9uZW50Q2FjaGVEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NvbXBvbmVudENhY2hlRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzc0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NvbXBvbmVudENhY2hlRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUGFydGl0aW9uS2V5OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5UYWJsZTsKKworQFRhYmxlKGtleXNwYWNlID0gInNkY2NvbXBvbmVudCIsIG5hbWUgPSAiY29tcG9uZW50Y2FjaGUiKQorcHVibGljIGNsYXNzIENvbXBvbmVudENhY2hlRGF0YSB7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUlJFU09VUkNFX0lEX0ZJRUxEID0gInJlc291cmNlSWQiOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9OQU1FX0ZJRUxEID0gInNlcnZpY2VOYW1lIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWSUNFX1ZFUlNJT05fRklFTEQgPSAic2VydmljZVZlcnNpb24iOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFSVElGQUNUX05BTUVfRklFTEQgPSAiYXJ0aWZhY3ROYW1lIjsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGltID0gIjoiOworCisJQFBhcnRpdGlvbktleQorCUBDb2x1bW4obmFtZSA9ICJpZCIpCisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKwlAQ29sdW1uCisJcHJpdmF0ZSBCeXRlQnVmZmVyIGRhdGE7CisKKwlAQ29sdW1uKG5hbWUgPSAibW9kaWZpY2F0aW9uX3RpbWUiKQorCXByaXZhdGUgRGF0ZSBtb2RpZmljYXRpb25UaW1lOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIHR5cGU7CisKKwlAQ29sdW1uKG5hbWUgPSAiaXNfZGlydHkiKQorCXByaXZhdGUgYm9vbGVhbiBpc0RpcnR5OworCisJQENvbHVtbihuYW1lID0gImlzX3ppcHBlZCIpCisJcHJpdmF0ZSBib29sZWFuIGlzWmlwcGVkOworCisJcHVibGljIENvbXBvbmVudENhY2hlRGF0YSgpIHsKKworCX0KKworCXB1YmxpYyBDb21wb25lbnRDYWNoZURhdGEoU3RyaW5nIGlkLCBieXRlW10gZGF0YSwgRGF0ZSBtb2RpZmljYXRpb25UaW1lLCBTdHJpbmcgdHlwZSwgYm9vbGVhbiBpc0RpcnR5LAorCQkJYm9vbGVhbiBpc1ppcHBlZCkgeworCQlzdXBlcigpOworCQl0aGlzLmlkID0gaWQ7CisJCWlmIChkYXRhICE9IG51bGwpIHsKKwkJCXRoaXMuZGF0YSA9IEJ5dGVCdWZmZXIud3JhcChkYXRhLmNsb25lKCkpOworCQl9CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IG1vZGlmaWNhdGlvblRpbWU7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuaXNEaXJ0eSA9IGlzRGlydHk7CisJCXRoaXMuaXNaaXBwZWQgPSBpc1ppcHBlZDsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50Q2FjaGVEYXRhKFN0cmluZyBpZCkgeworCisJCXRoaXMuaWQgPSBpZDsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50Q2FjaGVEYXRhKFN0cmluZyBhcnRpZmFjdElkLCBieXRlW10gZGF0YSkgeworCQlzdXBlcigpOworCQl0aGlzLmlkID0gYXJ0aWZhY3RJZDsKKwkJaWYgKGRhdGEgIT0gbnVsbCkgeworCQkJdGhpcy5kYXRhID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGEuY2xvbmUoKSk7CisJCQkvLyB0aGlzLmRhdGEgPSBkYXRhLmNsb25lKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgYnl0ZVtdIGdldERhdGFBc0FycmF5KCkgeworCQlpZiAoZGF0YSAhPSBudWxsKSB7CisJCQlyZXR1cm4gZGF0YS5hcnJheSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldERhdGFBc0FycmF5KGJ5dGVbXSBkYXRhKSB7CisJCWlmIChkYXRhICE9IG51bGwpIHsKKwkJCXRoaXMuZGF0YSA9IEJ5dGVCdWZmZXIud3JhcChkYXRhLmNsb25lKCkpOworCQl9CisJfQorCisJcHVibGljIEJ5dGVCdWZmZXIgZ2V0RGF0YSgpIHsKKwkJcmV0dXJuIGRhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YShCeXRlQnVmZmVyIGRhdGEpIHsKKwkJaWYgKGRhdGEgIT0gbnVsbCkgeworCQkJdGhpcy5kYXRhID0gZGF0YS5kdXBsaWNhdGUoKTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKwkJdGhpcy5pZCA9IGlkOworCX0KKworCXB1YmxpYyBEYXRlIGdldE1vZGlmaWNhdGlvblRpbWUoKSB7CisJCXJldHVybiBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblRpbWUoRGF0ZSBtb2RpZmljYXRpb25UaW1lKSB7CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIGJvb2xlYW4gZ2V0SXNEaXJ0eSgpIHsKKwkJcmV0dXJuIGlzRGlydHk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SXNEaXJ0eShib29sZWFuIGlzRGlydHkpIHsKKwkJdGhpcy5pc0RpcnR5ID0gaXNEaXJ0eTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBnZXRJc1ppcHBlZCgpIHsKKwkJcmV0dXJuIGlzWmlwcGVkOworCX0KKworCXB1YmxpYyB2b2lkIHNldElzWmlwcGVkKGJvb2xlYW4gaXNaaXBwZWQpIHsKKwkJdGhpcy5pc1ppcHBlZCA9IGlzWmlwcGVkOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Db21wb25lbnRJbnN0YW5jZURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQ29tcG9uZW50SW5zdGFuY2VEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYjk5YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvQ29tcG9uZW50SW5zdGFuY2VEYXRhLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Db21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk9yaWdpblR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2VEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCUNvbXBvbmVudEluc3RhbmNlRGF0YURlZmluaXRpb24gY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uOworCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpOworCQl0aGlzLmNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbiA9IG5ldyBDb21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uKCk7CisJfQorCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlRGF0YShDb21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSk7CisJCXRoaXMuY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uID0gY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZURhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJdGhpcygpOworCisJCWNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCWNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5zZXRDb21wb25lbnRVaWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldENyZWF0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldE1vZGlmaWNhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisJCWNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldFBvc1goKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QT1NJVElPTl9YLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldFBvc1koKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QT1NJVElPTl9ZLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldFByb3BlcnR5VmFsdWVDb3VudGVyKChJbnRlZ2VyKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRZX0NPVU5URVIuZ2V0UHJvcGVydHkoKSkpOworCQljb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24uc2V0QXR0cmlidXRlVmFsdWVDb3VudGVyKChJbnRlZ2VyKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFUVFJJQlVURV9DT1VOVEVSLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldE5vcm1hbGl6ZWROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLnNldE9yaWdpblR5cGUoT3JpZ2luVHlwZUVudW0uZmluZEJ5VmFsdWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5PUklHSU5fVFlQRS5nZXRQcm9wZXJ0eSgpKSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRSwgY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLmdldENvbXBvbmVudFVpZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUsIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5nZXRDcmVhdGlvblRpbWUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBjb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24uZ2V0TW9kaWZpY2F0aW9uVGltZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBjb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQsIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBPU0lUSU9OX1gsIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5nZXRQb3NYKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUE9TSVRJT05fWSwgY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLmdldFBvc1koKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBjb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRZX0NPVU5URVIsIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5nZXRQcm9wZXJ0eVZhbHVlQ291bnRlcigpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFUVFJJQlVURV9DT1VOVEVSLCBjb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24uZ2V0QXR0cmlidXRlVmFsdWVDb3VudGVyKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLCBjb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24uZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCWlmIChjb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24uZ2V0T3JpZ2luVHlwZSgpICE9IG51bGwpIHsKKwkJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5PUklHSU5fVFlQRSwgY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uLmdldE9yaWdpblR5cGUoKS5nZXRWYWx1ZSgpKTsKKwkJfQorCisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbi5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZEtleSgpIHsKKwkJcmV0dXJuIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCk7CisJfQorCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlRGF0YURlZmluaXRpb24gZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbihDb21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uIGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbiA9IGNvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNvbXBvbmVudEluc3RhbmNlRGF0YSBbY29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uPSIgKyBjb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24gKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NvbXBvbmVudE1ldGFkYXRhRGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Db21wb25lbnRNZXRhZGF0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzlkZmUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Db21wb25lbnRNZXRhZGF0YURhdGEuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5Db21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRNZXRhZGF0YURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJcHJvdGVjdGVkIENvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKKwlwcm90ZWN0ZWQgSW50ZWdlciBjb21wb25lbnRJbnN0YW5jZUNvdW50ZXI7CisKKwlwdWJsaWMgQ29tcG9uZW50TWV0YWRhdGFEYXRhKE5vZGVUeXBlRW51bSBsYWJlbCwgQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBtZXRhZGF0YURhdGFEZWZpbml0aW9uKSB7CisJCXN1cGVyKGxhYmVsKTsKKwkJdGhpcy5tZXRhZGF0YURhdGFEZWZpbml0aW9uID0gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKKwkJdGhpcy5jb21wb25lbnRJbnN0YW5jZUNvdW50ZXIgPSAwOworCX0KKworCXB1YmxpYyBDb21wb25lbnRNZXRhZGF0YURhdGEoTm9kZVR5cGVFbnVtIGxhYmVsLCBDb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uIG1ldGFkYXRhRGF0YURlZmluaXRpb24sCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcyhsYWJlbCwgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbik7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCQltZXRhZGF0YURhdGFEZWZpbml0aW9uCisJCQkJLnNldENyZWF0aW9uRGF0ZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXREZXNjcmlwdGlvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5zZXRJY29uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSUNPTi5nZXRQcm9wZXJ0eSgpKSk7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uc2V0SGlnaGVzdFZlcnNpb24oCisJCQkJKEJvb2xlYW4pIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRMYXN0VXBkYXRlRGF0ZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5zZXROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uc2V0U3RhdGUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpKSk7CisJCVR5cGUgbGlzdFR5cGUgPSBuZXcgVHlwZVRva2VuPExpc3Q8U3RyaW5nPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlMaXN0PFN0cmluZz4gdGFnc0Zyb21Kc29uID0gZ2V0R3NvbigpCisJCQkJLmZyb21Kc29uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVEFHUy5nZXRQcm9wZXJ0eSgpKSwgbGlzdFR5cGUpOworCQltZXRhZGF0YURhdGFEZWZpbml0aW9uLnNldFRhZ3ModGFnc0Zyb21Kc29uKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5zZXRWZXJzaW9uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVSU0lPTi5nZXRQcm9wZXJ0eSgpKSk7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24KKwkJCQkuc2V0Q29udGFjdElkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OVEFDVF9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uc2V0VVVJRCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVVSUQuZ2V0UHJvcGVydHkoKSkpOworCQltZXRhZGF0YURhdGFEZWZpbml0aW9uCisJCQkJLnNldE5vcm1hbGl6ZWROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRTeXN0ZW1OYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1lTVEVNX05BTUUuZ2V0UHJvcGVydHkoKSkpOworCQltZXRhZGF0YURhdGFEZWZpbml0aW9uCisJCQkJLnNldElzRGVsZXRlZCgoQm9vbGVhbikgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ERUxFVEVELmdldFByb3BlcnR5KCkpKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5zZXRQcm9qZWN0Q29kZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST0pFQ1RfQ09ERS5nZXRQcm9wZXJ0eSgpKSk7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uc2V0Q3NhclVVSUQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DU0FSX1VVSUQuZ2V0UHJvcGVydHkoKSkpOworCQltZXRhZGF0YURhdGFEZWZpbml0aW9uCisJCQkJLnNldENzYXJWZXJzaW9uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1NBUl9WRVJTSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5zZXRJbXBvcnRlZFRvc2NhQ2hlY2tzdW0oCisJCQkJKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JTVBPUlRFRF9UT1NDQV9DSEVDS1NVTS5nZXRQcm9wZXJ0eSgpKSk7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24KKwkJCQkuc2V0SW52YXJpYW50VVVJRCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklOVkFSSUFOVF9VVUlELmdldFByb3BlcnR5KCkpKTsKKwkJY29tcG9uZW50SW5zdGFuY2VDb3VudGVyID0gKEludGVnZXIpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5TVEFOQ0VfQ09VTlRFUi5nZXRQcm9wZXJ0eSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQsIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRVJTSU9OLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldFZlcnNpb24oKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldENyZWF0aW9uRGF0ZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSUNPTiwgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXRJY29uKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldExhc3RVcGRhdGVEYXRlKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUsIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0U3RhdGUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UQUdTLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldFRhZ3MoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT05UQUNUX0lELCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldENvbnRhY3RJZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUsIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVVSUQsIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0VVVJRCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRSwgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNZU1RFTV9OQU1FLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldFN5c3RlbU5hbWUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ERUxFVEVELCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmlzRGVsZXRlZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklOU1RBTkNFX0NPVU5URVIsIGNvbXBvbmVudEluc3RhbmNlQ291bnRlcik7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9KRUNUX0NPREUsIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0UHJvamVjdENvZGUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DU0FSX1VVSUQsIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0Q3NhclVVSUQoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DU0FSX1ZFUlNJT04sIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0Q3NhclZlcnNpb24oKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JTVBPUlRFRF9UT1NDQV9DSEVDS1NVTSwKKwkJCQltZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldEltcG9ydGVkVG9zY2FDaGVja3N1bSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklOVkFSSUFOVF9VVUlELCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldEludmFyaWFudFVVSUQoKSk7CisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBnZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKENvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLm1ldGFkYXRhRGF0YURlZmluaXRpb24gPSBtZXRhZGF0YURhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldENvbXBvbmVudEluc3RhbmNlQ291bnRlcigpIHsKKwkJcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlQ291bnRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIoSW50ZWdlciBjb21wb25lbnRJbnN0YW5jZUNvdW50ZXIpIHsKKwkJdGhpcy5jb21wb25lbnRJbnN0YW5jZUNvdW50ZXIgPSBjb21wb25lbnRJbnN0YW5jZUNvdW50ZXI7CisJfQorCisJcHVibGljIEludGVnZXIgaW5jcmVhc2VBbmRHZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIoKSB7CisJCXJldHVybiArK2NvbXBvbmVudEluc3RhbmNlQ291bnRlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNvbXBvbmVudE1ldGFkYXRhRGF0YSBbbWV0YWRhdGFEYXRhRGVmaW5pdGlvbj0iICsgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbiArICIsIGNvbXBvbmVudEluc3RhbmNlQ291bnRlcj0iCisJCQkJKyBjb21wb25lbnRJbnN0YW5jZUNvdW50ZXIgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0NvbnN1bWVyRGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Db25zdW1lckRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE2OTMwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Db25zdW1lckRhdGEuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgQ29uc3VtZXJEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXByaXZhdGUgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBjb25zdW1lckRhdGFEZWZpbml0aW9uOworCisJcHVibGljIENvbnN1bWVyRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkNvbnN1bWVyQ3JlZGVudGlhbHMpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uID0gbmV3IENvbnN1bWVyRGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgQ29uc3VtZXJEYXRhKENvbnN1bWVyRGF0YURlZmluaXRpb24gY29uc3VtZXJEYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihOb2RlVHlwZUVudW0uQ29uc3VtZXJDcmVkZW50aWFscyk7CisJCXRoaXMuY29uc3VtZXJEYXRhRGVmaW5pdGlvbiA9IGNvbnN1bWVyRGF0YURlZmluaXRpb247CisKKwl9CisKKwlwdWJsaWMgQ29uc3VtZXJEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlzdXBlcihOb2RlVHlwZUVudW0uQ29uc3VtZXJDcmVkZW50aWFscyk7CisJCWNvbnN1bWVyRGF0YURlZmluaXRpb24gPSBuZXcgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbigpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT05TVU1FUl9ERVRBSUxTX0xBU1RfVVBEQVRFRF9USU1FLmdldFByb3BlcnR5KCkpKTsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1VNRVJfTEFTVF9BVVRIRU5USUNBVElPTl9USU1FLmdldFByb3BlcnR5KCkpKTsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lck5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT05TVU1FUl9OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5zZXRDb25zdW1lclBhc3N3b3JkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1VNRVJfUEFTU1dPUkQuZ2V0UHJvcGVydHkoKSkpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldENvbnN1bWVyU2FsdCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNVTUVSX1NBTFQuZ2V0UHJvcGVydHkoKSkpOworCQljb25zdW1lckRhdGFEZWZpbml0aW9uLnNldExhc3RNb2RmaWVyQXR1aWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX01PRElGSUVSX1VTRVJfSUQuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWRLZXkoKSB7CisJCXJldHVybiBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNVTUVSX05BTUUuZ2V0UHJvcGVydHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lck5hbWUoKTsKKwl9CisKKwlwdWJsaWMgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBnZXRDb25zdW1lckRhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gY29uc3VtZXJEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1VNRVJfTkFNRSwgdGhpcy5jb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyTmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNVTUVSX1BBU1NXT1JELAorCQkJCXRoaXMuY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRDb25zdW1lclBhc3N3b3JkKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1VNRVJfU0FMVCwgdGhpcy5jb25zdW1lckRhdGFEZWZpbml0aW9uLmdldENvbnN1bWVyU2FsdCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNVTUVSX0xBU1RfQVVUSEVOVElDQVRJT05fVElNRSwKKwkJCQl0aGlzLmNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1VNRVJfREVUQUlMU19MQVNUX1VQREFURURfVElNRSwKKwkJCQl0aGlzLmNvbnN1bWVyRGF0YURlZmluaXRpb24uZ2V0Q29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9NT0RJRklFUl9VU0VSX0lELAorCQkJCXRoaXMuY29uc3VtZXJEYXRhRGVmaW5pdGlvbi5nZXRMYXN0TW9kZmllckF0dWlkKCkpOworCisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJDb25zdW1lckRhdGEgW2NvbnN1bWVyRGF0YURlZmluaXRpb249IiArIGNvbnN1bWVyRGF0YURlZmluaXRpb24gKyAiXSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9EYXRhVHlwZURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvRGF0YVR5cGVEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NDUyNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvRGF0YVR5cGVEYXRhLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5EYXRhVHlwZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBEYXRhVHlwZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJRGF0YVR5cGVEYXRhRGVmaW5pdGlvbiBkYXRhVHlwZURhdGFEZWZpbml0aW9uOworCisJcHVibGljIERhdGFUeXBlRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkRhdGFUeXBlKTsKKwkJZGF0YVR5cGVEYXRhRGVmaW5pdGlvbiA9IG5ldyBEYXRhVHlwZURhdGFEZWZpbml0aW9uKCk7CisJfQorCisJcHVibGljIERhdGFUeXBlRGF0YShEYXRhVHlwZURhdGFEZWZpbml0aW9uIGRhdGFUeXBlRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkRhdGFUeXBlKTsKKwkJdGhpcy5kYXRhVHlwZURhdGFEZWZpbml0aW9uID0gZGF0YVR5cGVEYXRhRGVmaW5pdGlvbjsKKwkJLy8gdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzOworCX0KKworCXB1YmxpYyBEYXRhVHlwZURhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJdGhpcygpOworCisJCWRhdGFUeXBlRGF0YURlZmluaXRpb24uc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCisJCWRhdGFUeXBlRGF0YURlZmluaXRpb24uc2V0TmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkpOworCisJCWRhdGFUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0RGVzY3JpcHRpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTi5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJZGF0YVR5cGVEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXREZXJpdmVkRnJvbU5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVJJVkVEX0ZST00uZ2V0UHJvcGVydHkoKSkpOworCisJCWRhdGFUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0Q3JlYXRpb25UaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCisJCWRhdGFUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0TW9kaWZpY2F0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCBkYXRhVHlwZURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBkYXRhVHlwZURhdGFEZWZpbml0aW9uLmdldE5hbWUoKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBkYXRhVHlwZURhdGFEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVJJVkVEX0ZST00sIGRhdGFUeXBlRGF0YURlZmluaXRpb24uZ2V0RGVyaXZlZEZyb21OYW1lKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBkYXRhVHlwZURhdGFEZWZpbml0aW9uLmdldENyZWF0aW9uVGltZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwgZGF0YVR5cGVEYXRhRGVmaW5pdGlvbi5nZXRNb2RpZmljYXRpb25UaW1lKCkpOworCisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIERhdGFUeXBlRGF0YURlZmluaXRpb24gZ2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIGRhdGFUeXBlRGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbihEYXRhVHlwZURhdGFEZWZpbml0aW9uIGRhdGFUeXBlRGF0YURlZmluaXRpb24pIHsKKwkJdGhpcy5kYXRhVHlwZURhdGFEZWZpbml0aW9uID0gZGF0YVR5cGVEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkRhdGFUeXBlRGF0YSBbZGF0YVR5cGVEYXRhRGVmaW5pdGlvbj0iICsgZGF0YVR5cGVEYXRhRGVmaW5pdGlvbiArICJdIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVHlwZURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0VTQXJ0aWZhY3REYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0VTQXJ0aWZhY3REYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxMDFkMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvRVNBcnRpZmFjdERhdGEuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CisKK0BUYWJsZShrZXlzcGFjZSA9ICJzZGNBcnRpZmFjdCIsIG5hbWUgPSAicmVzb3VyY2VzIikKK3B1YmxpYyBjbGFzcyBFU0FydGlmYWN0RGF0YSB7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUlJFU09VUkNFX0lEX0ZJRUxEID0gInJlc291cmNlSWQiOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9OQU1FX0ZJRUxEID0gInNlcnZpY2VOYW1lIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWSUNFX1ZFUlNJT05fRklFTEQgPSAic2VydmljZVZlcnNpb24iOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFSVElGQUNUX05BTUVfRklFTEQgPSAiYXJ0aWZhY3ROYW1lIjsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGltID0gIjoiOworCisJQFBhcnRpdGlvbktleQorCUBDb2x1bW4obmFtZSA9ICJpZCIpCisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKwkvKgorCSAqIEJhc2U2NCBlbmNvZGVkIEFydGlmYWN0IGZpbGUgZGF0YQorCSAqLworCisJQENvbHVtbgorCXByaXZhdGUgQnl0ZUJ1ZmZlciBkYXRhOworCisJLy8gcHJpdmF0ZSBieXRlW10gZGF0YTsKKworCXB1YmxpYyBFU0FydGlmYWN0RGF0YSgpIHsKKworCX0KKworCXB1YmxpYyBFU0FydGlmYWN0RGF0YShTdHJpbmcgaWQpIHsKKworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJcHVibGljIEVTQXJ0aWZhY3REYXRhKFN0cmluZyBhcnRpZmFjdElkLCBieXRlW10gZGF0YSkgeworCQlzdXBlcigpOworCQl0aGlzLmlkID0gYXJ0aWZhY3RJZDsKKwkJaWYgKGRhdGEgIT0gbnVsbCkgeworCQkJdGhpcy5kYXRhID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGEuY2xvbmUoKSk7CisJCQkvLyB0aGlzLmRhdGEgPSBkYXRhLmNsb25lKCk7CisJCX0KKworCX0KKworCXB1YmxpYyBieXRlW10gZ2V0RGF0YUFzQXJyYXkoKSB7CisJCS8vIHJldHVybiBkYXRhOworCQlpZiAoZGF0YSAhPSBudWxsKSB7CisJCQlyZXR1cm4gZGF0YS5hcnJheSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldERhdGFBc0FycmF5KGJ5dGVbXSBkYXRhKSB7CisJCWlmIChkYXRhICE9IG51bGwpIHsKKwkJCS8vIHRoaXMuZGF0YSA9IGRhdGEuY2xvbmUoKTsKKwkJCXRoaXMuZGF0YSA9IEJ5dGVCdWZmZXIud3JhcChkYXRhLmNsb25lKCkpOworCQl9CisJfQorCisJcHVibGljIEJ5dGVCdWZmZXIgZ2V0RGF0YSgpIHsKKwkJLy8gcmV0dXJuIGRhdGE7CisJCXJldHVybiBkYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldERhdGEoQnl0ZUJ1ZmZlciBkYXRhKSB7CisJCWlmIChkYXRhICE9IG51bGwpIHsKKwkJCS8vIHRoaXMuZGF0YSA9IGRhdGEuY2xvbmUoKTsKKwkJCXRoaXMuZGF0YSA9IGRhdGEuZHVwbGljYXRlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisJCXRoaXMuaWQgPSBpZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvRW50cnlEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0VudHJ5RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjI5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0VudHJ5RGF0YS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBFbnRyeURhdGE8SywgVj4gaW1wbGVtZW50cyBNYXAuRW50cnk8SywgVj4geworCisJcHJpdmF0ZSBmaW5hbCBLIGtleTsKKwlwcml2YXRlIFYgdmFsdWU7CisKKwlwdWJsaWMgRW50cnlEYXRhKEsga2V5LCBWIHZhbHVlKSB7CisJCXRoaXMua2V5ID0ga2V5OworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEsgZ2V0S2V5KCkgeworCQlyZXR1cm4ga2V5OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBWIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgeworCQlWIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJcmV0dXJuIG9sZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvR3JhcGhOb2RlTG9jay5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9HcmFwaE5vZGVMb2NrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNTIxYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvR3JhcGhOb2RlTG9jay5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBHcmFwaE5vZGVMb2NrIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCXByaXZhdGUgTG9uZyB0aW1lOworCisJcHVibGljIEdyYXBoTm9kZUxvY2soKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5Mb2NrTm9kZSk7CisJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwl9CisKKwlwdWJsaWMgR3JhcGhOb2RlTG9jayhTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcygpOworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIEdyYXBoTm9kZUxvY2soTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5Mb2NrTm9kZSk7CisKKwkJc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCQlzZXRUaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgdW5pcXVlSWQpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwgdGltZSk7CisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRUaW1lKCkgeworCQlyZXR1cm4gdGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lKExvbmcgdGltZSkgeworCQl0aGlzLnRpbWUgPSB0aW1lOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Hcm91cERhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvR3JvdXBEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1NGU5NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvR3JvdXBEYXRhLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkdyb3VwRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIEdyb3VwRGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisKKwlHcm91cERhdGFEZWZpbml0aW9uIGdyb3VwRGF0YURlZmluaXRpb247CisKKwlwdWJsaWMgR3JvdXBEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uR3JvdXApOworCQlncm91cERhdGFEZWZpbml0aW9uID0gbmV3IEdyb3VwRGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgR3JvdXBEYXRhKEdyb3VwRGF0YURlZmluaXRpb24gZ3JvdXBEYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihOb2RlVHlwZUVudW0uR3JvdXApOworCQl0aGlzLmdyb3VwRGF0YURlZmluaXRpb24gPSBncm91cERhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBHcm91cERhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkdyb3VwKTsKKworCQlncm91cERhdGFEZWZpbml0aW9uID0gbmV3IEdyb3VwRGF0YURlZmluaXRpb24oKTsKKworCQlncm91cERhdGFEZWZpbml0aW9uLnNldE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJZ3JvdXBEYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCWdyb3VwRGF0YURlZmluaXRpb24uc2V0VHlwZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSkpOworCQlncm91cERhdGFEZWZpbml0aW9uLnNldFZlcnNpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRVJTSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJZ3JvdXBEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRJbnZhcmlhbnRVVUlEKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5WQVJJQU5UX1VVSUQuZ2V0UHJvcGVydHkoKSkpOworCQlncm91cERhdGFEZWZpbml0aW9uLnNldEdyb3VwVVVJRCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkdST1VQX1VVSUQuZ2V0UHJvcGVydHkoKSkpOworCQlncm91cERhdGFEZWZpbml0aW9uCisJCQkJLnNldERlc2NyaXB0aW9uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVTQ1JJUFRJT04uZ2V0UHJvcGVydHkoKSkpOworCQlncm91cERhdGFEZWZpbml0aW9uLnNldFByb3BlcnR5VmFsdWVDb3VudGVyKAorCQkJCShJbnRlZ2VyKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRZX0NPVU5URVIuZ2V0UHJvcGVydHkoKSkpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIGdyb3VwRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRSwgZ3JvdXBEYXRhRGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCBncm91cERhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRSwgZ3JvdXBEYXRhRGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVSU0lPTiwgZ3JvdXBEYXRhRGVmaW5pdGlvbi5nZXRWZXJzaW9uKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5WQVJJQU5UX1VVSUQsIGdyb3VwRGF0YURlZmluaXRpb24uZ2V0SW52YXJpYW50VVVJRCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBncm91cERhdGFEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVFlfQ09VTlRFUiwgZ3JvdXBEYXRhRGVmaW5pdGlvbi5nZXRQcm9wZXJ0eVZhbHVlQ291bnRlcigpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkdST1VQX1VVSUQsIGdyb3VwRGF0YURlZmluaXRpb24uZ2V0R3JvdXBVVUlEKCkpOworCisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIEdyb3VwRGF0YURlZmluaXRpb24gZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIGdyb3VwRGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JvdXBEYXRhRGVmaW5pdGlvbihHcm91cERhdGFEZWZpbml0aW9uIGdyb3VwRGF0YURlZmluaXRpb24pIHsKKwkJdGhpcy5ncm91cERhdGFEZWZpbml0aW9uID0gZ3JvdXBEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkdyb3VwRGF0YSBbICIgKyBncm91cERhdGFEZWZpbml0aW9uLnRvU3RyaW5nKCkgKyAiXSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Hcm91cFR5cGVEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0dyb3VwVHlwZURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y0ZmNmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Hcm91cFR5cGVEYXRhLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkdyb3VwVHlwZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBHcm91cFR5cGVEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXByaXZhdGUgc3RhdGljIFR5cGUgbGlzdFR5cGUgPSBuZXcgVHlwZVRva2VuPExpc3Q8U3RyaW5nPj4oKSB7CisJfS5nZXRUeXBlKCk7CisJcHJpdmF0ZSBzdGF0aWMgVHlwZSBtYXBUeXBlID0gbmV3IFR5cGVUb2tlbjxIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4oKSB7CisJfS5nZXRUeXBlKCk7CisKKwlHcm91cFR5cGVEYXRhRGVmaW5pdGlvbiBncm91cFR5cGVEYXRhRGVmaW5pdGlvbjsKKworCXB1YmxpYyBHcm91cFR5cGVEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uR3JvdXBUeXBlKTsKKwkJZ3JvdXBUeXBlRGF0YURlZmluaXRpb24gPSBuZXcgR3JvdXBUeXBlRGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgR3JvdXBUeXBlRGF0YShHcm91cFR5cGVEYXRhRGVmaW5pdGlvbiBncm91cFR5cGVEYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihOb2RlVHlwZUVudW0uR3JvdXBUeXBlKTsKKwkJdGhpcy5ncm91cFR5cGVEYXRhRGVmaW5pdGlvbiA9IGdyb3VwVHlwZURhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBHcm91cFR5cGVEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCXRoaXMoKTsKKworCQlncm91cFR5cGVEYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJZ3JvdXBUeXBlRGF0YURlZmluaXRpb24uc2V0VHlwZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSkpOworCisJCWdyb3VwVHlwZURhdGFEZWZpbml0aW9uLnNldFZlcnNpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRVJTSU9OLmdldFByb3BlcnR5KCkpKTsKKworCQlncm91cFR5cGVEYXRhRGVmaW5pdGlvbi5zZXRIaWdoZXN0VmVyc2lvbigKKwkJCQkoYm9vbGVhbikgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSkpOworCisJCWdyb3VwVHlwZURhdGFEZWZpbml0aW9uCisJCQkJLnNldERlc2NyaXB0aW9uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVTQ1JJUFRJT04uZ2V0UHJvcGVydHkoKSkpOworCisJCUxpc3Q8U3RyaW5nPiBtZW1iZXJzID0gZ2V0R3NvbigpCisJCQkJLmZyb21Kc29uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTUVNQkVSUy5nZXRQcm9wZXJ0eSgpKSwgbGlzdFR5cGUpOworCQlncm91cFR5cGVEYXRhRGVmaW5pdGlvbi5zZXRNZW1iZXJzKG1lbWJlcnMpOworCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGF0ZGF0YSA9IGdldEdzb24oKQorCQkJCS5mcm9tSnNvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk1FVEFEQVRBLmdldFByb3BlcnR5KCkpLCBtYXBUeXBlKTsKKwkJZ3JvdXBUeXBlRGF0YURlZmluaXRpb24uc2V0TWV0YWRhdGEobWV0YXRkYXRhKTsKKworCQlncm91cFR5cGVEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRDcmVhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJZ3JvdXBUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0TW9kaWZpY2F0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCBncm91cFR5cGVEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRSwgZ3JvdXBUeXBlRGF0YURlZmluaXRpb24uZ2V0VHlwZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVSU0lPTiwgZ3JvdXBUeXBlRGF0YURlZmluaXRpb24uZ2V0VmVyc2lvbigpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLCBncm91cFR5cGVEYXRhRGVmaW5pdGlvbi5pc0hpZ2hlc3RWZXJzaW9uKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTiwgZ3JvdXBUeXBlRGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk1FVEFEQVRBLCBncm91cFR5cGVEYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTUVNQkVSUywgZ3JvdXBUeXBlRGF0YURlZmluaXRpb24uZ2V0TWVtYmVycygpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwgZ3JvdXBUeXBlRGF0YURlZmluaXRpb24uZ2V0Q3JlYXRpb25UaW1lKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBncm91cFR5cGVEYXRhRGVmaW5pdGlvbi5nZXRNb2RpZmljYXRpb25UaW1lKCkpOworCisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIEdyb3VwVHlwZURhdGFEZWZpbml0aW9uIGdldEdyb3VwVHlwZURhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gZ3JvdXBUeXBlRGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JvdXBUeXBlRGF0YURlZmluaXRpb24oR3JvdXBUeXBlRGF0YURlZmluaXRpb24gZ3JvdXBUeXBlRGF0YURlZmluaXRpb24pIHsKKwkJdGhpcy5ncm91cFR5cGVEYXRhRGVmaW5pdGlvbiA9IGdyb3VwVHlwZURhdGFEZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiR3JvdXBUeXBlRGF0YSBbZ3JvdXBUeXBlRGF0YURlZmluaXRpb249IiArIGdyb3VwVHlwZURhdGFEZWZpbml0aW9uICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB0aGlzLmdyb3VwVHlwZURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0hlYXRQYXJhbWV0ZXJEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0hlYXRQYXJhbWV0ZXJEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNWE0NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvSGVhdFBhcmFtZXRlckRhdGEuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuSGVhdFBhcmFtZXRlckRhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBIZWF0UGFyYW1ldGVyRGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisKKwlwcml2YXRlIEhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBoZWF0RGF0YURlZmluaXRpb247CisKKwlwdWJsaWMgSGVhdFBhcmFtZXRlckRhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5IZWF0UGFyYW1ldGVyKTsKKwkJaGVhdERhdGFEZWZpbml0aW9uID0gbmV3IEhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbigpOworCX0KKworCXB1YmxpYyBIZWF0UGFyYW1ldGVyRGF0YShIZWF0UGFyYW1ldGVyRGF0YURlZmluaXRpb24gaGVhdERhdGFEZWYpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkhlYXRQYXJhbWV0ZXIpOworCQl0aGlzLmhlYXREYXRhRGVmaW5pdGlvbiA9IGhlYXREYXRhRGVmOworCX0KKworCXB1YmxpYyBIZWF0UGFyYW1ldGVyRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcygpOworCisJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisJCVN0cmluZyB0eXBlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCkpOworCQloZWF0RGF0YURlZmluaXRpb24uc2V0VHlwZSh0eXBlKTsKKworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLmdldFByb3BlcnR5KCkpOworCQlpZiAoQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFLmVxdWFscyhkZXNjcmlwdGlvbikpIHsKKwkJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbihudWxsKTsKKwkJfSBlbHNlIHsKKwkJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCX0KKworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERUZBVUxUX1ZBTFVFLmdldFByb3BlcnR5KCkpOworCQlpZiAoQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7CisJCQloZWF0RGF0YURlZmluaXRpb24uc2V0RGVmYXVsdFZhbHVlKG51bGwpOworCQl9IGVsc2UgeworCQkJaGVhdERhdGFEZWZpbml0aW9uLnNldERlZmF1bHRWYWx1ZShnZXRWYWx1ZSh0eXBlLCBkZWZhdWx0VmFsdWUpKTsKKwkJfQorCisJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMVUUuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChDb25zdGFudHMuR1JBUEhfRU1QVFlfVkFMVUUuZXF1YWxzKHZhbHVlKSkgeworCQkJaGVhdERhdGFEZWZpbml0aW9uLnNldEN1cnJlbnRWYWx1ZShudWxsKTsKKwkJfSBlbHNlIHsKKwkJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXRDdXJyZW50VmFsdWUoZ2V0VmFsdWUodHlwZSwgdmFsdWUpKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgeworCQlpZiAoQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFLmVxdWFscyh2YWx1ZSkpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCQlpZiAoIm51bWJlciIuZXF1YWxzKHR5cGUpKSB7CisJCQlyZXR1cm4gbmV3IEJpZ0RlY2ltYWwodmFsdWUpLnRvUGxhaW5TdHJpbmcoKTsKKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIEhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBnZXRIZWF0RGF0YURlZmluaXRpb24oKSB7CisJCXJldHVybiBoZWF0RGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0SGVhdERhdGFEZWZpbml0aW9uKEhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBoZWF0RGF0YURlZmluaXRpb24pIHsKKwkJdGhpcy5oZWF0RGF0YURlZmluaXRpb24gPSBoZWF0RGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gaGVhdERhdGFEZWZpbml0aW9uLmdldE5hbWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXROYW1lKG5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIGhlYXREYXRhRGVmaW5pdGlvbi5nZXRUeXBlKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQloZWF0RGF0YURlZmluaXRpb24uc2V0VHlwZSh0eXBlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gaGVhdERhdGFEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VmFsdWUoKSB7CisJCXJldHVybiBoZWF0RGF0YURlZmluaXRpb24uZ2V0Q3VycmVudFZhbHVlKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZhbHVlKFN0cmluZyBjdXJyZW50VmFsdWUpIHsKKwkJaGVhdERhdGFEZWZpbml0aW9uLnNldEN1cnJlbnRWYWx1ZShjdXJyZW50VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQlyZXR1cm4gaGVhdERhdGFEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisJCWhlYXREYXRhRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gaGVhdERhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCBnZXRVbmlxdWVJZCgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRSwgZ2V0TmFtZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRSwgZ2V0VHlwZSgpKTsKKworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbigpOworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworCQkJZGVzY3JpcHRpb24gPSBDb25zdGFudHMuR1JBUEhfRU1QVFlfVkFMVUU7CisJCX0KKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7CisKKwkJU3RyaW5nIGRlZmF1bHRWYWwgPSBnZXREZWZhdWx0VmFsdWUoKTsKKwkJaWYgKGRlZmF1bHRWYWwgPT0gbnVsbCkgeworCQkJZGVmYXVsdFZhbCA9IENvbnN0YW50cy5HUkFQSF9FTVBUWV9WQUxVRTsKKwkJfQorCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVGQVVMVF9WQUxVRSwgZ2V0VmFsdWUoZ2V0VHlwZSgpLCBkZWZhdWx0VmFsKSk7CisKKwkJU3RyaW5nIGN1cnJlbnRWYWwgPSBnZXRDdXJyZW50VmFsdWUoKTsKKwkJaWYgKGN1cnJlbnRWYWwgPT0gbnVsbCkgeworCQkJY3VycmVudFZhbCA9IENvbnN0YW50cy5HUkFQSF9FTVBUWV9WQUxVRTsKKwkJfQorCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WQUxVRSwgZ2V0VmFsdWUoZ2V0VHlwZSgpLCBjdXJyZW50VmFsKSk7CisJCXJldHVybiBtYXA7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0hlYXRQYXJhbWV0ZXJWYWx1ZURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvSGVhdFBhcmFtZXRlclZhbHVlRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWJlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0hlYXRQYXJhbWV0ZXJWYWx1ZURhdGEuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXB1YmxpYyBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uSGVhdFBhcmFtZXRlclZhbHVlKTsKKwl9CisKKwlwdWJsaWMgSGVhdFBhcmFtZXRlclZhbHVlRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcygpOworCisJCXRoaXMuc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTFVFLmdldFByb3BlcnR5KCkpOworCQlpZiAoQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFLmVxdWFscyh2YWx1ZSkpIHsKKwkJCXRoaXMuc2V0VmFsdWUobnVsbCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldFZhbHVlKHZhbHVlKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgdW5pcXVlSWQpOworCisJCVN0cmluZyB1cGRhdGVkVmFsdWUgPSB2YWx1ZTsKKwkJaWYgKHVwZGF0ZWRWYWx1ZSA9PSBudWxsKSB7CisJCQl1cGRhdGVkVmFsdWUgPSBDb25zdGFudHMuR1JBUEhfRU1QVFlfVkFMVUU7CisJCX0KKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTFVFLCB1cGRhdGVkVmFsdWUpOworCisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJIZWF0UGFyYW1ldGVyVmFsdWVEYXRhIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCB2YWx1ZT0iICsgdmFsdWUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0lucHV0VmFsdWVEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0lucHV0VmFsdWVEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkM2VmMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvSW5wdXRWYWx1ZURhdGEuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgSW5wdXRWYWx1ZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCisJcHJpdmF0ZSBCb29sZWFuIGhpZGRlbjsKKworCXByaXZhdGUgTG9uZyBjcmVhdGlvblRpbWU7CisKKwlwcml2YXRlIExvbmcgbW9kaWZpY2F0aW9uVGltZTsKKworCXB1YmxpYyBJbnB1dFZhbHVlRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLklucHV0VmFsdWUpOworCX0KKworCXB1YmxpYyBJbnB1dFZhbHVlRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcygpOworCisJCXRoaXMuc2V0VHlwZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSkpOworCisJCVN0cmluZyB1cGRhdGVkVmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTFVFLmdldFByb3BlcnR5KCkpOworCQlpZiAoQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFLmVxdWFscyh1cGRhdGVkVmFsdWUpKSB7CisJCQl0aGlzLnNldFZhbHVlKG51bGwpOworCQl9IGVsc2UgeworCQkJdGhpcy5zZXRWYWx1ZSh1cGRhdGVkVmFsdWUpOworCQl9CisKKwkJdGhpcy5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJdGhpcy5zZXRIaWRkZW4oKEJvb2xlYW4pIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSElEREVOLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldENyZWF0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldE1vZGlmaWNhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisJCXJldHVybiBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKExvbmcgY3JlYXRpb25UaW1lKSB7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBMb25nIGdldE1vZGlmaWNhdGlvblRpbWUoKSB7CisJCXJldHVybiBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblRpbWUoTG9uZyBtb2RpZmljYXRpb25UaW1lKSB7CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQsIHVuaXF1ZUlkKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRSwgdHlwZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkhJRERFTiwgaGlkZGVuKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwgY3JlYXRpb25UaW1lKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwgbW9kaWZpY2F0aW9uVGltZSk7CisKKwkJU3RyaW5nIHVwZGF0ZWRWYWx1ZSA9IE9iamVjdHMuaXNOdWxsKHZhbHVlKSA/IENvbnN0YW50cy5HUkFQSF9FTVBUWV9WQUxVRSA6IHZhbHVlOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMVUUsIHVwZGF0ZWRWYWx1ZSk7CisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJJbnB1dFZhbHVlRGF0YSBbdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgaGlkZGVuPSIgKyBoaWRkZW4gKyAiLCB0eXBlPSIgKyB0eXBlICsgIiwgY3JlYXRpb25UaW1lPSIKKwkJCQkrIGNyZWF0aW9uVGltZSArICIsIHZhbHVlPSIgKyB2YWx1ZSArICIsIG1vZGlmaWNhdGlvblRpbWU9IiArIG1vZGlmaWNhdGlvblRpbWUgKyAiXSI7CisJfQorCisJcHVibGljIEJvb2xlYW4gaXNIaWRkZW4oKSB7CisJCXJldHVybiBoaWRkZW47CisJfQorCisJcHVibGljIHZvaWQgc2V0SGlkZGVuKEJvb2xlYW4gaGlkZGVuKSB7CisJCXRoaXMuaGlkZGVuID0gaGlkZGVuOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9JbnB1dHNEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0lucHV0c0RhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmI3MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9JbnB1dHNEYXRhLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworCitwdWJsaWMgY2xhc3MgSW5wdXRzRGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisKKwlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BlcnR5RGF0YURlZmluaXRpb247CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBjb25zdHJhaW50czsKKworCXB1YmxpYyBJbnB1dHNEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uSW5wdXQpOworCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uID0gbmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgSW5wdXRzRGF0YShQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BlcnR5RGF0YURlZmluaXRpb24sIExpc3Q8U3RyaW5nPiBjb25zdHJhaW50cykgeworCQlzdXBlcihOb2RlVHlwZUVudW0uSW5wdXQpOworCQl0aGlzLnByb3BlcnR5RGF0YURlZmluaXRpb24gPSBwcm9wZXJ0eURhdGFEZWZpbml0aW9uOworCQl0aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7CisJfQorCisJcHVibGljIElucHV0c0RhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJdGhpcygpOworCisJCXByb3BlcnR5RGF0YURlZmluaXRpb24uc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCisJCXByb3BlcnR5RGF0YURlZmluaXRpb24uc2V0VHlwZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSkpOworCisJCXByb3BlcnR5RGF0YURlZmluaXRpb24uc2V0UmVxdWlyZWQoKEJvb2xlYW4pIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRUQuZ2V0UHJvcGVydHkoKSkpOworCisJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFRkFVTFRfVkFMVUUuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChDb25zdGFudHMuR1JBUEhfRU1QVFlfVkFMVUUuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIHsKKwkJCXByb3BlcnR5RGF0YURlZmluaXRpb24uc2V0RGVmYXVsdFZhbHVlKG51bGwpOworCQl9IGVsc2UgeworCQkJcHJvcGVydHlEYXRhRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKKwkJfQorCisJCXByb3BlcnR5RGF0YURlZmluaXRpb24KKwkJCQkuc2V0RGVzY3JpcHRpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTi5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJVHlwZSBsaXN0VHlwZSA9IG5ldyBUeXBlVG9rZW48TGlzdDxTdHJpbmc+PigpIHsKKwkJfS5nZXRUeXBlKCk7CisJCUxpc3Q8U3RyaW5nPiBjb25zdHJhaW50c2Zyb21Kc29uID0gZ2V0R3NvbigpCisJCQkJLmZyb21Kc29uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1RSQUlOVFMuZ2V0UHJvcGVydHkoKSksIGxpc3RUeXBlKTsKKwkJc2V0Q29uc3RyYWludHMoY29uc3RyYWludHNmcm9tSnNvbik7CisJCS8vIHNldENvbnN0cmFpbnRzKChMaXN0PFN0cmluZz4pCisJCS8vIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1RSQUlOVFMuZ2V0UHJvcGVydHkoKSkpOworCisJCVR5cGUgc2NoZW1hVHlwZSA9IG5ldyBUeXBlVG9rZW48U2NoZW1hRGVmaW5pdGlvbj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYSA9IGdldEdzb24oKQorCQkJCS5mcm9tSnNvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkVOVFJZX1NDSEVNQS5nZXRQcm9wZXJ0eSgpKSwgc2NoZW1hVHlwZSk7CisJCXByb3BlcnR5RGF0YURlZmluaXRpb24uc2V0U2NoZW1hKHNjaGVtYSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgcHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRSwgcHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTiwgcHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKTsKKwkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7CisJCQlkZWZhdWx0VmFsdWUgPSBDb25zdGFudHMuR1JBUEhfRU1QVFlfVkFMVUU7CisJCX0KKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFRkFVTFRfVkFMVUUsIGRlZmF1bHRWYWx1ZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVELCBwcm9wZXJ0eURhdGFEZWZpbml0aW9uLmlzUmVxdWlyZWQoKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNUUkFJTlRTLCBnZXRDb25zdHJhaW50cygpKTsKKworCQlTY2hlbWFEZWZpbml0aW9uIGVudHJ5U2NoZW1hID0gcHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXRTY2hlbWEoKTsKKwkJaWYgKGVudHJ5U2NoZW1hICE9IG51bGwpIHsKKwkJCVN0cmluZyBlbnRyeVNjaGVtYVN0ciA9IGdldEdzb24oKS50b0pzb24oZW50cnlTY2hlbWEpOworCQkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkVOVFJZX1NDSEVNQSwgZW50cnlTY2hlbWFTdHIpOworCQl9CisJCS8vIFN0cmluZyBjb25zdHJhaW50c0FzSnNvbiA9IGdldEdzb24oKS50b0pzb24oZ2V0Q29uc3RyYWludHMoKSk7CisJCS8vIGFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT05TVFJBSU5UUywKKwkJLy8gY29uc3RyYWludHNBc0pzb24pOworCisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIGNvbnN0cmFpbnRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnRzKExpc3Q8U3RyaW5nPiBjb25zdHJhaW50cykgeworCQl0aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHByb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBnZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gcHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKFByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcGVydHlEYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLnByb3BlcnR5RGF0YURlZmluaXRpb24gPSBwcm9wZXJ0eURhdGFEZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUHJvcGVydHlEYXRhIFtwcm9wZXJ0eURhdGFEZWZpbml0aW9uPSIgKyBwcm9wZXJ0eURhdGFEZWZpbml0aW9uICsgIiwgY29uc3RyYWludHM9IiArIGNvbnN0cmFpbnRzICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9JbnRlcmZhY2VEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL0ludGVyZmFjZURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQwN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9JbnRlcmZhY2VEYXRhLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkludGVyZmFjZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBJbnRlcmZhY2VEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXByaXZhdGUgSW50ZXJmYWNlRGF0YURlZmluaXRpb24gaW50ZXJmYWNlRGF0YURlZmluaXRpb247CisKKwlwdWJsaWMgSW50ZXJmYWNlRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkludGVyZmFjZSk7CisJCWludGVyZmFjZURhdGFEZWZpbml0aW9uID0gbmV3IEludGVyZmFjZURhdGFEZWZpbml0aW9uKCk7CisKKwl9CisKKwlwdWJsaWMgSW50ZXJmYWNlRGF0YShJbnRlcmZhY2VEYXRhIHApIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkludGVyZmFjZSk7CisJCWludGVyZmFjZURhdGFEZWZpbml0aW9uID0gcC5nZXRJbnRlcmZhY2VEYXRhRGVmaW5pdGlvbigpOworCisJfQorCisJcHVibGljIEludGVyZmFjZURhdGEoSW50ZXJmYWNlRGF0YURlZmluaXRpb24gaW50ZXJmYWNlRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkludGVyZmFjZSk7CisJCXRoaXMuaW50ZXJmYWNlRGF0YURlZmluaXRpb24gPSBpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbjsKKworCX0KKworCXB1YmxpYyBJbnRlcmZhY2VEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQl0aGlzKCk7CisJCWludGVyZmFjZURhdGFEZWZpbml0aW9uLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKwkJaW50ZXJmYWNlRGF0YURlZmluaXRpb24uc2V0VHlwZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSkpOworCQlpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXREZXNjcmlwdGlvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJaW50ZXJmYWNlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0Q3JlYXRpb25EYXRlKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCQlpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRMYXN0VXBkYXRlRGF0ZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKwl9CisKKwlwdWJsaWMgSW50ZXJmYWNlRGF0YURlZmluaXRpb24gZ2V0SW50ZXJmYWNlRGF0YURlZmluaXRpb24oKSB7CisJCXJldHVybiBpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2VEYXRhRGVmaW5pdGlvbihJbnRlcmZhY2VEYXRhRGVmaW5pdGlvbiBpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmludGVyZmFjZURhdGFEZWZpbml0aW9uID0gaW50ZXJmYWNlRGF0YURlZmluaXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIGludGVyZmFjZURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCBpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUsIGludGVyZmFjZURhdGFEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbi5nZXRDcmVhdGlvbkRhdGUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbi5nZXRMYXN0VXBkYXRlRGF0ZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBpbnRlcmZhY2VEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9PcGVyYXRpb25EYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL09wZXJhdGlvbkRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdjZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9PcGVyYXRpb25EYXRhLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLk9wZXJhdGlvbkRhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBPcGVyYXRpb25EYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCU9wZXJhdGlvbkRhdGFEZWZpbml0aW9uIG9wZXJhdGlvbkRhdGFEZWZpbml0aW9uOworCisJcHJvdGVjdGVkIE9wZXJhdGlvbkRhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5JbnRlcmZhY2VPcGVyYXRpb24pOworCQlvcGVyYXRpb25EYXRhRGVmaW5pdGlvbiA9IG5ldyBPcGVyYXRpb25EYXRhRGVmaW5pdGlvbigpOworCX0KKworCXB1YmxpYyBPcGVyYXRpb25EYXRhKE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uIG9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5JbnRlcmZhY2VPcGVyYXRpb24pOworCQl0aGlzLm9wZXJhdGlvbkRhdGFEZWZpbml0aW9uID0gb3BlcmF0aW9uRGF0YURlZmluaXRpb247CisKKwl9CisKKwlwdWJsaWMgT3BlcmF0aW9uRGF0YShPcGVyYXRpb25EYXRhIG9wZXJhdGlvbkRhdGEpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLkludGVyZmFjZU9wZXJhdGlvbik7CisJCXRoaXMub3BlcmF0aW9uRGF0YURlZmluaXRpb24gPSBvcGVyYXRpb25EYXRhLmdldE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKCk7CisKKwl9CisKKwlwdWJsaWMgT3BlcmF0aW9uRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcygpOworCQlvcGVyYXRpb25EYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCW9wZXJhdGlvbkRhdGFEZWZpbml0aW9uCisJCQkJLnNldERlc2NyaXB0aW9uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVTQ1JJUFRJT04uZ2V0UHJvcGVydHkoKSkpOworCQlvcGVyYXRpb25EYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRDcmVhdGlvbkRhdGUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURS5nZXRQcm9wZXJ0eSgpKSk7CisJCW9wZXJhdGlvbkRhdGFEZWZpbml0aW9uCisJCQkJLnNldExhc3RVcGRhdGVEYXRlKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfVVBEQVRFX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCXB1YmxpYyBPcGVyYXRpb25EYXRhRGVmaW5pdGlvbiBnZXRPcGVyYXRpb25EYXRhRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIG9wZXJhdGlvbkRhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uIG9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKSB7CisJCXRoaXMub3BlcmF0aW9uRGF0YURlZmluaXRpb24gPSBvcGVyYXRpb25EYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gb3BlcmF0aW9uRGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQsIG9wZXJhdGlvbkRhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwgb3BlcmF0aW9uRGF0YURlZmluaXRpb24uZ2V0Q3JlYXRpb25EYXRlKCkpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwgb3BlcmF0aW9uRGF0YURlZmluaXRpb24uZ2V0TGFzdFVwZGF0ZURhdGUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTiwgb3BlcmF0aW9uRGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJcmV0dXJuIG1hcDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUG9saWN5VHlwZURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUG9saWN5VHlwZURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmYyYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Qb2xpY3lUeXBlRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qb2xpY3lUeXBlRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworcHVibGljIGNsYXNzIFBvbGljeVR5cGVEYXRhIGV4dGVuZHMgR3JhcGhOb2RlIHsKKworCXByaXZhdGUgUG9saWN5VHlwZURhdGFEZWZpbml0aW9uIHBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlIG1hcFR5cGUgPSBuZXcgVHlwZVRva2VuPEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+PigpIHsKKwl9LmdldFR5cGUoKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlIGxpc3RUeXBlID0gbmV3IFR5cGVUb2tlbjxMaXN0PFN0cmluZz4+KCkgeworCX0uZ2V0VHlwZSgpOworCisJcHVibGljIFBvbGljeVR5cGVEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUG9saWN5VHlwZSk7CisJCXBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbiA9IG5ldyBQb2xpY3lUeXBlRGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgUG9saWN5VHlwZURhdGEoUG9saWN5VHlwZURhdGFEZWZpbml0aW9uIHBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUG9saWN5VHlwZSk7CisJCXRoaXMucG9saWN5VHlwZURhdGFEZWZpbml0aW9uID0gcG9saWN5VHlwZURhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBQb2xpY3lUeXBlRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKworCQl0aGlzKCk7CisKKwkJcG9saWN5VHlwZURhdGFEZWZpbml0aW9uCisJCQkJLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKworCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhdGRhdGEgPSBnZXRHc29uKCkKKwkJCQkuZnJvbUpzb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5NRVRBREFUQS5nZXRQcm9wZXJ0eSgpKSwgbWFwVHlwZSk7CisJCXBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbi5zZXRNZXRhZGF0YShtZXRhdGRhdGEpOworCisJCUxpc3Q8U3RyaW5nPiBtZW1iZXJzID0gZ2V0R3NvbigpCisJCQkJLmZyb21Kc29uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVEFSR0VUUy5nZXRQcm9wZXJ0eSgpKSwgbGlzdFR5cGUpOworCQlwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uc2V0VGFyZ2V0cyhtZW1iZXJzKTsKKworCQlwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uc2V0VHlwZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSkpOworCisJCXBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXREZXNjcmlwdGlvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLmdldFByb3BlcnR5KCkpKTsKKworCQlwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uc2V0SGlnaGVzdFZlcnNpb24oCisJCQkJKGJvb2xlYW4pIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCkpKTsKKworCQlwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uc2V0VmVyc2lvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZFUlNJT04uZ2V0UHJvcGVydHkoKSkpOworCisJCXBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRDcmVhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJcG9saWN5VHlwZURhdGFEZWZpbml0aW9uCisJCQkJLnNldE1vZGlmaWNhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgcG9saWN5VHlwZURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLCBwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uZ2V0VHlwZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVSU0lPTiwgcG9saWN5VHlwZURhdGFEZWZpbml0aW9uLmdldFZlcnNpb24oKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTiwgcG9saWN5VHlwZURhdGFEZWZpbml0aW9uLmlzSGlnaGVzdFZlcnNpb24oKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRFU0NSSVBUSU9OLCBwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk1FVEFEQVRBLCBwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGEoKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRBUkdFVFMsIHBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbi5nZXRUYXJnZXRzKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uZ2V0Q3JlYXRpb25UaW1lKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uZ2V0TW9kaWZpY2F0aW9uVGltZSgpKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUG9saWN5VHlwZURhdGEgW3BvbGljeVR5cGVEYXRhRGVmaW5pdGlvbj0iICsgcG9saWN5VHlwZURhdGFEZWZpbml0aW9uICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB0aGlzLnBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCX0KKworCXB1YmxpYyBQb2xpY3lUeXBlRGF0YURlZmluaXRpb24gZ2V0UG9saWN5VHlwZURhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gcG9saWN5VHlwZURhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbihQb2xpY3lUeXBlRGF0YURlZmluaXRpb24gcG9saWN5VHlwZURhdGFEZWZpbml0aW9uKSB7CisJCXRoaXMucG9saWN5VHlwZURhdGFEZWZpbml0aW9uID0gcG9saWN5VHlwZURhdGFEZWZpbml0aW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Qcm9kdWN0TWV0YWRhdGFEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1Byb2R1Y3RNZXRhZGF0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmYzY2UyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Qcm9kdWN0TWV0YWRhdGFEYXRhLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBQcm9kdWN0TWV0YWRhdGFEYXRhIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhIHsKKworCXB1YmxpYyBQcm9kdWN0TWV0YWRhdGFEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUHJvZHVjdCwgbmV3IFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpOworCX0KKworCXB1YmxpYyBQcm9kdWN0TWV0YWRhdGFEYXRhKFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uIG1ldGFkYXRhRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlByb2R1Y3QsIG1ldGFkYXRhRGF0YURlZmluaXRpb24pOworCX0KKworCXB1YmxpYyBQcm9kdWN0TWV0YWRhdGFEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUHJvZHVjdCwgbmV3IFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKCksIHByb3BlcnRpZXMpOworCQkoKFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKQorCQkJCS5zZXRGdWxsTmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkZVTExfTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisJCVR5cGUgbGlzdFR5cGUgPSBuZXcgVHlwZVRva2VuPExpc3Q8U3RyaW5nPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlMaXN0PFN0cmluZz4gY29udGFjdHNmcm9tSnNvbiA9IGdldEdzb24oKQorCQkJCS5mcm9tSnNvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlRBQ1RTLmdldFByb3BlcnR5KCkpLCBsaXN0VHlwZSk7CisJCSgoUHJvZHVjdE1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pLnNldENvbnRhY3RzKGNvbnRhY3RzZnJvbUpzb24pOworCQkoKFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKQorCQkJCS5zZXRJc0FjdGl2ZSgoQm9vbGVhbikgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19BQ1RJVkUuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWRLZXkoKSB7CisJCXJldHVybiBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gZ3JhcGhNYXAgPSBzdXBlci50b0dyYXBoTWFwKCk7CisJCWFkZElmRXhpc3RzKGdyYXBoTWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkZVTExfTkFNRSwKKwkJCQkoKFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKS5nZXRGdWxsTmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMoZ3JhcGhNYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OVEFDVFMsCisJCQkJKChQcm9kdWN0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbikuZ2V0Q29udGFjdHMoKSk7CisJCWFkZElmRXhpc3RzKGdyYXBoTWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0FDVElWRSwKKwkJCQkoKFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKS5nZXRJc0FjdGl2ZSgpKTsKKwkJcmV0dXJuIGdyYXBoTWFwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUHJvZHVjdE1ldGFkYXRhRGF0YSBbbWV0YWRhdGFEYXRhRGVmaW5pdGlvbj0iICsgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbiArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1Byb3BlcnR5RGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Qcm9wZXJ0eURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJlYzk0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Qcm9wZXJ0eURhdGEuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5TY2hlbWFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwcm9wZXJ0eURhdGFEZWZpbml0aW9uOworCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29uc3RyYWludHM7CisKKwlwdWJsaWMgUHJvcGVydHlEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUHJvcGVydHkpOworCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uID0gbmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlEYXRhKFByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcGVydHlEYXRhRGVmaW5pdGlvbiwgTGlzdDxTdHJpbmc+IGNvbnN0cmFpbnRzKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSk7CisJCXRoaXMucHJvcGVydHlEYXRhRGVmaW5pdGlvbiA9IHByb3BlcnR5RGF0YURlZmluaXRpb247CisJCXRoaXMuY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCXRoaXMoKTsKKworCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKworCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uLnNldFR5cGUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCkpKTsKKworCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uLnNldFJlcXVpcmVkKChCb29sZWFuKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVELmdldFByb3BlcnR5KCkpKTsKKworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERUZBVUxUX1ZBTFVFLmdldFByb3BlcnR5KCkpOworCQlpZiAoQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7CisJCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uLnNldERlZmF1bHRWYWx1ZShudWxsKTsKKwkJfSBlbHNlIHsKKwkJCXByb3BlcnR5RGF0YURlZmluaXRpb24uc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisJCX0KKworCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uCisJCQkJLnNldERlc2NyaXB0aW9uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVTQ1JJUFRJT04uZ2V0UHJvcGVydHkoKSkpOworCisJCVR5cGUgbGlzdFR5cGUgPSBuZXcgVHlwZVRva2VuPExpc3Q8U3RyaW5nPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlMaXN0PFN0cmluZz4gY29uc3RyYWludHNmcm9tSnNvbiA9IGdldEdzb24oKQorCQkJCS5mcm9tSnNvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNUUkFJTlRTLmdldFByb3BlcnR5KCkpLCBsaXN0VHlwZSk7CisJCXNldENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzZnJvbUpzb24pOworCQkvLyBzZXRDb25zdHJhaW50cygoTGlzdDxTdHJpbmc+KQorCQkvLyBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNUUkFJTlRTLmdldFByb3BlcnR5KCkpKTsKKworCQlUeXBlIHNjaGVtYVR5cGUgPSBuZXcgVHlwZVRva2VuPFNjaGVtYURlZmluaXRpb24+KCkgeworCQl9LmdldFR5cGUoKTsKKwkJU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWEgPSBnZXRHc29uKCkKKwkJCQkuZnJvbUpzb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5FTlRSWV9TQ0hFTUEuZ2V0UHJvcGVydHkoKSksIHNjaGVtYVR5cGUpOworCQlwcm9wZXJ0eURhdGFEZWZpbml0aW9uLnNldFNjaGVtYShzY2hlbWEpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQsIHByb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUsIHByb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0VHlwZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVTQ1JJUFRJT04sIHByb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7CisJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgeworCQkJZGVmYXVsdFZhbHVlID0gQ29uc3RhbnRzLkdSQVBIX0VNUFRZX1ZBTFVFOworCQl9CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERUZBVUxUX1ZBTFVFLCBkZWZhdWx0VmFsdWUpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRCwgcHJvcGVydHlEYXRhRGVmaW5pdGlvbi5pc1JlcXVpcmVkKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT05TVFJBSU5UUywgZ2V0Q29uc3RyYWludHMoKSk7CisKKwkJU2NoZW1hRGVmaW5pdGlvbiBlbnRyeVNjaGVtYSA9IHByb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0U2NoZW1hKCk7CisJCWlmIChlbnRyeVNjaGVtYSAhPSBudWxsKSB7CisJCQlTdHJpbmcgZW50cnlTY2hlbWFTdHIgPSBnZXRHc29uKCkudG9Kc29uKGVudHJ5U2NoZW1hKTsKKwkJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5FTlRSWV9TQ0hFTUEsIGVudHJ5U2NoZW1hU3RyKTsKKwkJfQorCQkvLyBTdHJpbmcgY29uc3RyYWludHNBc0pzb24gPSBnZXRHc29uKCkudG9Kc29uKGdldENvbnN0cmFpbnRzKCkpOworCQkvLyBhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1RSQUlOVFMsCisJCS8vIGNvbnN0cmFpbnRzQXNKc29uKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29uc3RyYWludHMoKSB7CisJCXJldHVybiBjb25zdHJhaW50czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50cyhMaXN0PFN0cmluZz4gY29uc3RyYWludHMpIHsKKwkJdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiBwcm9wZXJ0eURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCk7CisJfQorCisJcHVibGljIFByb3BlcnR5RGF0YURlZmluaXRpb24gZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIHByb3BlcnR5RGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbihQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BlcnR5RGF0YURlZmluaXRpb24pIHsKKwkJdGhpcy5wcm9wZXJ0eURhdGFEZWZpbml0aW9uID0gcHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlByb3BlcnR5RGF0YSBbcHJvcGVydHlEYXRhRGVmaW5pdGlvbj0iICsgcHJvcGVydHlEYXRhRGVmaW5pdGlvbiArICIsIGNvbnN0cmFpbnRzPSIgKyBjb25zdHJhaW50cyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUHJvcGVydHlWYWx1ZURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUHJvcGVydHlWYWx1ZURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTc3ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Qcm9wZXJ0eVZhbHVlRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb3BlcnR5UnVsZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlWYWx1ZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJcHVibGljIFByb3BlcnR5VmFsdWVEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSk7CisJfQorCisJcHVibGljIFByb3BlcnR5VmFsdWVEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQl0aGlzKCk7CisKKwkJdGhpcy5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJU3RyaW5nIHVwZGF0ZWRWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMVUUuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChDb25zdGFudHMuR1JBUEhfRU1QVFlfVkFMVUUuZXF1YWxzKHVwZGF0ZWRWYWx1ZSkpIHsKKwkJCXRoaXMuc2V0VmFsdWUobnVsbCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldFZhbHVlKHVwZGF0ZWRWYWx1ZSk7CisJCX0KKworCQl0aGlzLnNldFR5cGUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldENyZWF0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldE1vZGlmaWNhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJVHlwZSBtYXBUeXBlID0gbmV3IFR5cGVUb2tlbjxMaXN0PFByb3BlcnR5UnVsZT4+KCkgeworCQl9LmdldFR5cGUoKTsKKwkJTGlzdDxQcm9wZXJ0eVJ1bGU+IHByb3BlcnR5UnVsZXMgPSBnZXRHc29uKCkuZnJvbUpzb24oCisJCQkJKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUWV9WQUxVRV9SVUxFUy5nZXRQcm9wZXJ0eSgpKSwgbWFwVHlwZSk7CisJCXRoaXMuc2V0UnVsZXMocHJvcGVydHlSdWxlcyk7CisKKwl9CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXByaXZhdGUgTG9uZyBjcmVhdGlvblRpbWU7CisKKwlwcml2YXRlIExvbmcgbW9kaWZpY2F0aW9uVGltZTsKKworCXByaXZhdGUgTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzOworCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIExvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworCQlyZXR1cm4gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShMb25nIGNyZWF0aW9uVGltZSkgeworCQl0aGlzLmNyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRNb2RpZmljYXRpb25UaW1lKCkgeworCQlyZXR1cm4gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25UaW1lKExvbmcgbW9kaWZpY2F0aW9uVGltZSkgeworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBMaXN0PFByb3BlcnR5UnVsZT4gZ2V0UnVsZXMoKSB7CisJCXJldHVybiBydWxlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSdWxlcyhMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMpIHsKKwkJdGhpcy5ydWxlcyA9IHJ1bGVzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCB1bmlxdWVJZCk7CisKKwkJU3RyaW5nIHVwZGF0ZWRWYWx1ZSA9IHZhbHVlOworCQlpZiAodXBkYXRlZFZhbHVlID09IG51bGwpIHsKKwkJCXVwZGF0ZWRWYWx1ZSA9IENvbnN0YW50cy5HUkFQSF9FTVBUWV9WQUxVRTsKKwkJfQorCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMVUUsIHVwZGF0ZWRWYWx1ZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUsIHR5cGUpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBjcmVhdGlvblRpbWUpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBtb2RpZmljYXRpb25UaW1lKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVFlfVkFMVUVfUlVMRVMsIHJ1bGVzKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUHJvcGVydHlWYWx1ZURhdGEgW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIHZhbHVlPSIgKyB2YWx1ZSArICIsIHR5cGU9IiArIHR5cGUgKyAiLCBjcmVhdGlvblRpbWU9IgorCQkJCSsgY3JlYXRpb25UaW1lICsgIiwgbW9kaWZpY2F0aW9uVGltZT0iICsgbW9kaWZpY2F0aW9uVGltZSArICIsIHJ1bGVzPSIgKyBydWxlcyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUmVsYXRpb25zaGlwSW5zdERhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUmVsYXRpb25zaGlwSW5zdERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM5YTYwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9SZWxhdGlvbnNoaXBJbnN0RGF0YS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwSW5zdERhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJcHJpdmF0ZSBMb25nIGNyZWF0aW9uVGltZTsKKworCXByaXZhdGUgTG9uZyBtb2RpZmljYXRpb25UaW1lOworCisJcHJpdmF0ZSBTdHJpbmcgY2FwYWJpbGl0eU93bmVySWQ7CisJcHJpdmF0ZSBTdHJpbmcgcmVxdWlyZW1lbnRPd25lcklkOworCXByaXZhdGUgU3RyaW5nIGNhcGFiaWx0eUlkOworCXByaXZhdGUgU3RyaW5nIHJlcXVpcmVtZW50SWQ7CisKKwlwdWJsaWMgUmVsYXRpb25zaGlwSW5zdERhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5SZWxhdGlvbnNoaXBJbnN0KTsKKwl9CisKKwlwdWJsaWMgUmVsYXRpb25zaGlwSW5zdERhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJdGhpcygpOworCisJCXRoaXMuc2V0VHlwZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSkpOworCisJCXRoaXMuc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCisJCXRoaXMuc2V0Q3JlYXRpb25UaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNSRUFUSU9OX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCisJCXRoaXMuc2V0TW9kaWZpY2F0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldENhcGFiaWxpdHlPd25lcklkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ0FQQUJJTElUWV9PV05FUl9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCXRoaXMuc2V0UmVxdWlyZW1lbnRPd25lcklkKAorCQkJCShTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRU1FTlRfT1dORVJfSUQuZ2V0UHJvcGVydHkoKSkpOworCQl0aGlzLnNldFJlcXVpcmVtZW50SWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFTUVOVF9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCXRoaXMuc2V0Q2FwYWJpbHR5SWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCkpKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCB1bmlxdWVJZCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUsIHR5cGUpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLCBjcmVhdGlvblRpbWUpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLCBtb2RpZmljYXRpb25UaW1lKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNBUEFCSUxJVFlfT1dORVJfSUQsIGNhcGFiaWxpdHlPd25lcklkKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVNRU5UX09XTkVSX0lELCByZXF1aXJlbWVudE93bmVySWQpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFTUVOVF9JRCwgcmVxdWlyZW1lbnRJZCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNBUEFCSUxJVFlfSUQsIGNhcGFiaWx0eUlkKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUoTG9uZyBjcmVhdGlvblRpbWUpIHsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TW9kaWZpY2F0aW9uVGltZSgpIHsKKwkJcmV0dXJuIG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uVGltZShMb25nIG1vZGlmaWNhdGlvblRpbWUpIHsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWxpdHlPd25lcklkKCkgeworCQlyZXR1cm4gY2FwYWJpbGl0eU93bmVySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0eU93bmVySWQoU3RyaW5nIGNhcGFiaWxpdHlPd25lcklkKSB7CisJCXRoaXMuY2FwYWJpbGl0eU93bmVySWQgPSBjYXBhYmlsaXR5T3duZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVtZW50T3duZXJJZCgpIHsKKwkJcmV0dXJuIHJlcXVpcmVtZW50T3duZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlbWVudE93bmVySWQoU3RyaW5nIHJlcXVpcmVtZW50T3duZXJJZCkgeworCQl0aGlzLnJlcXVpcmVtZW50T3duZXJJZCA9IHJlcXVpcmVtZW50T3duZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWx0eUlkKCkgeworCQlyZXR1cm4gY2FwYWJpbHR5SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbHR5SWQoU3RyaW5nIGNhcGFiaWx0eUlkKSB7CisJCXRoaXMuY2FwYWJpbHR5SWQgPSBjYXBhYmlsdHlJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVtZW50SWQoKSB7CisJCXJldHVybiByZXF1aXJlbWVudElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50SWQoU3RyaW5nIHJlcXVpcmVtZW50SWQpIHsKKwkJdGhpcy5yZXF1aXJlbWVudElkID0gcmVxdWlyZW1lbnRJZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlbGF0aW9uc2hpcEluc3REYXRhIFt0eXBlPSIgKyB0eXBlICsgIiwgdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgY3JlYXRpb25UaW1lPSIgKyBjcmVhdGlvblRpbWUKKwkJCQkrICIsIG1vZGlmaWNhdGlvblRpbWU9IiArIG1vZGlmaWNhdGlvblRpbWUgKyAiLCBjYXBhYmlsaXR5T3duZXJJZD0iICsgY2FwYWJpbGl0eU93bmVySWQKKwkJCQkrICIsIHJlcXVpcmVtZW50T3duZXJJZD0iICsgcmVxdWlyZW1lbnRPd25lcklkICsgIiwgY2FwYWJpbHR5SWQ9IiArIGNhcGFiaWx0eUlkICsgIiwgcmVxdWlyZW1lbnRJZD0iCisJCQkJKyByZXF1aXJlbWVudElkICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9SZWxhdGlvbnNoaXBUeXBlRGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9SZWxhdGlvbnNoaXBUeXBlRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZWVjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1JlbGF0aW9uc2hpcFR5cGVEYXRhLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworCitwdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwVHlwZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJUmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uIHJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbjsKKworCXB1YmxpYyBSZWxhdGlvbnNoaXBUeXBlRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlJlbGF0aW9uc2hpcFR5cGUpOworCQlyZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24gPSBuZXcgUmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uKCk7CisJfQorCisJcHVibGljIFJlbGF0aW9uc2hpcFR5cGVEYXRhKFJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbiByZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlJlbGF0aW9uc2hpcFR5cGUpOworCQl0aGlzLnJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbiA9IHJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgUmVsYXRpb25zaGlwVHlwZURhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisKKwkJdGhpcygpOworCisJCXJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uLnNldFR5cGUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCkpKTsKKworCQlyZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0RGVzY3JpcHRpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ERVNDUklQVElPTi5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJVHlwZSBsaXN0VHlwZSA9IG5ldyBUeXBlVG9rZW48TGlzdDxTdHJpbmc+PigpIHsKKwkJfS5nZXRUeXBlKCk7CisJCUxpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzZnJvbUpzb24gPSBnZXRHc29uKCkuZnJvbUpzb24oCisJCQkJKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WQUxJRF9TT1VSQ0VfVFlQRVMuZ2V0UHJvcGVydHkoKSksIGxpc3RUeXBlKTsKKworCQlyZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24uc2V0VmFsaWRTb3VyY2VUeXBlcyh2YWxpZFNvdXJjZVR5cGVzZnJvbUpzb24pOworCisJCS8vIHJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbi5zZXRWYWxpZFNvdXJjZVR5cGVzKChMaXN0PFN0cmluZz4pCisJCS8vIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMSURfU09VUkNFX1RZUEVTCisJCS8vIC5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uCisJCQkJLnNldENyZWF0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQlyZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0TW9kaWZpY2F0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQVNUX1VQREFURV9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQkvLyBjYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uLnNldFZlcnNpb24odmVyc2lvbik7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLCByZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24uZ2V0VHlwZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuREVTQ1JJUFRJT04sIHJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKworCQkvLyBTdHJpbmcgdmFsaWRTb3VyY2VUeXBlc1RvSnNvbiA9CisJCS8vIGdldEdzb24oKS50b0pzb24ocmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uLmdldFZhbGlkU291cmNlVHlwZXMoKSk7CisKKwkJLy8gYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTElEX1NPVVJDRV9UWVBFUywKKwkJLy8gdmFsaWRTb3VyY2VUeXBlc1RvSnNvbik7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZBTElEX1NPVVJDRV9UWVBFUywKKwkJCQlyZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24uZ2V0VmFsaWRTb3VyY2VUeXBlcygpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwgcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uLmdldENyZWF0aW9uVGltZSgpKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwKKwkJCQlyZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24uZ2V0TW9kaWZpY2F0aW9uVGltZSgpKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCXB1YmxpYyBSZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24gZ2V0UmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbihSZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24gcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uKSB7CisJCXRoaXMucmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uID0gcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUmVsYXRpb25zaGlwVHlwZURhdGEgW3JlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbj0iICsgcmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9SZXF1aXJlbWVudERhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUmVxdWlyZW1lbnREYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3ZTJkMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUmVxdWlyZW1lbnREYXRhLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBSZXF1aXJlbWVudERhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTl9PQ0NVUlJFTkNFUyA9ICIxIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVhfT0NDVVJSRU5DRVMgPSAiVU5CT1VOREVEIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVhfREVGQVVMVF9PQ0NVUlJFTkNFUyA9ICIxIjsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJcHJpdmF0ZSBTdHJpbmcgbm9kZTsKKworCXByaXZhdGUgTG9uZyBjcmVhdGlvblRpbWU7CisKKwlwcml2YXRlIExvbmcgbW9kaWZpY2F0aW9uVGltZTsKKworCXByaXZhdGUgU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGU7CisJcHJpdmF0ZSBTdHJpbmcgbWluT2NjdXJyZW5jZXMgPSBNSU5fT0NDVVJSRU5DRVM7CisJcHJpdmF0ZSBTdHJpbmcgbWF4T2NjdXJyZW5jZXMgPSBNQVhfREVGQVVMVF9PQ0NVUlJFTkNFUzsKKworCXB1YmxpYyBSZXF1aXJlbWVudERhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudCk7CisKKwl9CisKKwlwdWJsaWMgUmVxdWlyZW1lbnREYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCXRoaXMoKTsKKworCQl0aGlzLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldE5vZGUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OT0RFLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldENyZWF0aW9uVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DUkVBVElPTl9EQVRFLmdldFByb3BlcnR5KCkpKTsKKworCQl0aGlzLnNldE1vZGlmaWNhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJdGhpcy5zZXRSZWxhdGlvbnNoaXBUeXBlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVMQVRJT05TSElQX1RZUEUuZ2V0UHJvcGVydHkoKSkpOworCQl0aGlzLnNldE1pbk9jY3VycmVuY2VzKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTUlOX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpKTsKKwkJdGhpcy5zZXRNYXhPY2N1cnJlbmNlcygoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk1BWF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgdW5pcXVlSWQpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OT0RFLCBub2RlKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwgY3JlYXRpb25UaW1lKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwgbW9kaWZpY2F0aW9uVGltZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFTEFUSU9OU0hJUF9UWVBFLCByZWxhdGlvbnNoaXBUeXBlKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk1JTl9PQ0NVUlJFTkNFUywgbWluT2NjdXJyZW5jZXMpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTUFYX09DQ1VSUkVOQ0VTLCBtYXhPY2N1cnJlbmNlcyk7CisKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vZGUoKSB7CisJCXJldHVybiBub2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGUoU3RyaW5nIG5vZGUpIHsKKwkJdGhpcy5ub2RlID0gbm9kZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisJCXJldHVybiBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKExvbmcgY3JlYXRpb25UaW1lKSB7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBMb25nIGdldE1vZGlmaWNhdGlvblRpbWUoKSB7CisJCXJldHVybiBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblRpbWUoTG9uZyBtb2RpZmljYXRpb25UaW1lKSB7CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aW9uc2hpcFR5cGUoKSB7CisJCXJldHVybiByZWxhdGlvbnNoaXBUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcFR5cGUoU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUpIHsKKwkJdGhpcy5yZWxhdGlvbnNoaXBUeXBlID0gcmVsYXRpb25zaGlwVHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1pbk9jY3VycmVuY2VzKCkgeworCQlyZXR1cm4gbWluT2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWluT2NjdXJyZW5jZXMoU3RyaW5nIG1pbk9jY3VycmVuY2VzKSB7CisJCWlmIChtaW5PY2N1cnJlbmNlcyAhPSBudWxsKSB7CisJCQl0aGlzLm1pbk9jY3VycmVuY2VzID0gbWluT2NjdXJyZW5jZXM7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1heE9jY3VycmVuY2VzKCkgeworCQlyZXR1cm4gbWF4T2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWF4T2NjdXJyZW5jZXMoU3RyaW5nIG1heE9jY3VycmVuY2VzKSB7CisJCWlmIChtYXhPY2N1cnJlbmNlcyAhPSBudWxsKSB7CisJCQl0aGlzLm1heE9jY3VycmVuY2VzID0gbWF4T2NjdXJyZW5jZXM7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXF1aXJlbWVudERhdGEgW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIG5vZGU9IiArIG5vZGUgKyAiLCBjcmVhdGlvblRpbWU9IiArIGNyZWF0aW9uVGltZQorCQkJCSsgIiwgbW9kaWZpY2F0aW9uVGltZT0iICsgbW9kaWZpY2F0aW9uVGltZSArICIsIHJlbGF0aW9uc2hpcFR5cGU9IiArIHJlbGF0aW9uc2hpcFR5cGUKKwkJCQkrICIsIG1pbk9jY3VycmVuY2VzPSIgKyBtaW5PY2N1cnJlbmNlcyArICIsIG1heE9jY3VycmVuY2VzPSIgKyBtYXhPY2N1cnJlbmNlcyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUmVxdWlyZW1lbnRJbXBsRGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9SZXF1aXJlbWVudEltcGxEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyNGY4NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUmVxdWlyZW1lbnRJbXBsRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgUmVxdWlyZW1lbnRJbXBsRGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIExvbmcgY3JlYXRpb25UaW1lOworCisJcHJpdmF0ZSBMb25nIG1vZGlmaWNhdGlvblRpbWU7CisKKwlwcml2YXRlIFN0cmluZyBwb3NYOworCisJcHJpdmF0ZSBTdHJpbmcgcG9zWTsKKworCXB1YmxpYyBSZXF1aXJlbWVudEltcGxEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uUmVxdWlyZW1lbnRJbXBsKTsKKwl9CisKKwlwdWJsaWMgUmVxdWlyZW1lbnRJbXBsRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKworCQl0aGlzKCk7CisKKwkJdGhpcy5zZXROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJdGhpcy5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJdGhpcy5zZXRDcmVhdGlvblRpbWUoKExvbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJdGhpcy5zZXRNb2RpZmljYXRpb25UaW1lKChMb25nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfVVBEQVRFX0RBVEUuZ2V0UHJvcGVydHkoKSkpOworCisJCXNldFBvc1goKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QT1NJVElPTl9YLmdldFByb3BlcnR5KCkpKTsKKworCQlzZXRQb3NZKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUE9TSVRJT05fWS5nZXRQcm9wZXJ0eSgpKSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgdW5pcXVlSWQpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBuYW1lKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1JFQVRJT05fREFURSwgY3JlYXRpb25UaW1lKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFTVF9VUERBVEVfREFURSwgbW9kaWZpY2F0aW9uVGltZSk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBPU0lUSU9OX1gsIHBvc1gpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QT1NJVElPTl9ZLCBwb3NZKTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUoTG9uZyBjcmVhdGlvblRpbWUpIHsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TW9kaWZpY2F0aW9uVGltZSgpIHsKKwkJcmV0dXJuIG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uVGltZShMb25nIG1vZGlmaWNhdGlvblRpbWUpIHsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBvc1goKSB7CisJCXJldHVybiBwb3NYOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBvc1goU3RyaW5nIHBvc1gpIHsKKwkJdGhpcy5wb3NYID0gcG9zWDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBvc1koKSB7CisJCXJldHVybiBwb3NZOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBvc1koU3RyaW5nIHBvc1kpIHsKKwkJdGhpcy5wb3NZID0gcG9zWTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlcXVpcmVtZW50SW1wbERhdGEgW25hbWU9IiArIG5hbWUgKyAiLCB1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBjcmVhdGlvblRpbWU9IiArIGNyZWF0aW9uVGltZQorCQkJCSsgIiwgbW9kaWZpY2F0aW9uVGltZT0iICsgbW9kaWZpY2F0aW9uVGltZSArICIsIHBvc1g9IiArIHBvc1ggKyAiLCBwb3NZPSIgKyBwb3NZICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9SZXNvdXJjZUNhdGVnb3J5RGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9SZXNvdXJjZUNhdGVnb3J5RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjc4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1Jlc291cmNlQ2F0ZWdvcnlEYXRhLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNhdGVnb3J5RGF0YSBleHRlbmRzIENhdGVnb3J5RGF0YSB7CisKKwlwcml2YXRlIFN0cmluZyBjYXRlZ29yeU5hbWU7CisKKwlwdWJsaWMgUmVzb3VyY2VDYXRlZ29yeURhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5SZXNvdXJjZUNhdGVnb3J5KTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VDYXRlZ29yeURhdGEoU3RyaW5nIGNhdGVnb3J5TmFtZSwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSwgIiIsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUNhdGVnb3J5KTsKKwkJdGhpcy5jYXRlZ29yeU5hbWUgPSBjYXRlZ29yeU5hbWU7CisJCWNyZWF0ZVVuaXF1ZUlkKCk7CisJfQorCisJcHVibGljIFJlc291cmNlQ2F0ZWdvcnlEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlzdXBlcihwcm9wZXJ0aWVzLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VDYXRlZ29yeSk7CisJCXNldENhdGVnb3J5TmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNBVEVHT1JZX05BTUUuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCkgeworCQlyZXR1cm4gY2F0ZWdvcnlOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5TmFtZShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7CisJCXRoaXMuY2F0ZWdvcnlOYW1lID0gY2F0ZWdvcnlOYW1lOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVVuaXF1ZUlkKCkgeworCQlzZXRVbmlxdWVJZChnZXRMYWJlbCgpICsgIi4iICsgdGhpcy5jYXRlZ29yeU5hbWUgKyAiLiIgKyBnZXROYW1lKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUmVzb3VyY2VDYXRlZ29yeURhdGEgW2NhdGVnb3J5TmFtZT0iICsgY2F0ZWdvcnlOYW1lICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGdyYXBoTWFwID0gc3VwZXIudG9HcmFwaE1hcCgpOworCQlhZGRJZkV4aXN0cyhncmFwaE1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVRFR09SWV9OQU1FLCBjYXRlZ29yeU5hbWUpOworCQlyZXR1cm4gZ3JhcGhNYXA7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1Jlc291cmNlTWV0YWRhdGFEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1Jlc291cmNlTWV0YWRhdGFEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmM2Q3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvUmVzb3VyY2VNZXRhZGF0YURhdGEuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFJlc291cmNlTWV0YWRhdGFEYXRhIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhIHsKKworCXB1YmxpYyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZU1ldGFkYXRhRGF0YShDb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uIG1ldGFkYXRhRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VNZXRhZGF0YURhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLCBwcm9wZXJ0aWVzKTsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pCisJCQkJLnNldFZlbmRvck5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRU5ET1JfTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKQorCQkJCS5zZXRWZW5kb3JSZWxlYXNlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVORE9SX1JFTEVBU0UuZ2V0UHJvcGVydHkoKSkpOworCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbikuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0KKwkJCQkudmFsdWVPZigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSkpKTsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pCisJCQkJLnNldEFic3RyYWN0KChCb29sZWFuKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0FCU1RSQUNULmdldFByb3BlcnR5KCkpKTsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pCisJCQkJLnNldENvc3QoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT1NULmdldFByb3BlcnR5KCkpKTsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pCisJCQkJLnNldExpY2Vuc2VUeXBlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTElDRU5TRV9UWVBFLmdldFByb3BlcnR5KCkpKTsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pLnNldFRvc2NhUmVzb3VyY2VOYW1lKAorCQkJCShTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVE9TQ0FfUkVTT1VSQ0VfTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGdyYXBoTWFwID0gc3VwZXIudG9HcmFwaE1hcCgpOworCQlhZGRJZkV4aXN0cyhncmFwaE1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRU5ET1JfTkFNRSwKKwkJCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbikuZ2V0VmVuZG9yTmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMoZ3JhcGhNYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVORE9SX1JFTEVBU0UsCisJCQkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pLmdldFZlbmRvclJlbGVhc2UoKSk7CisJCWFkZElmRXhpc3RzKGdyYXBoTWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUsCisJCQkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pLmdldFJlc291cmNlVHlwZSgpLm5hbWUoKSk7CisJCWFkZElmRXhpc3RzKGdyYXBoTWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0FCU1RSQUNULAorCQkJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKS5pc0Fic3RyYWN0KCkpOworCQlhZGRJZkV4aXN0cyhncmFwaE1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT1NULAorCQkJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKS5nZXRDb3N0KCkpOworCQlhZGRJZkV4aXN0cyhncmFwaE1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MSUNFTlNFX1RZUEUsCisJCQkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG1ldGFkYXRhRGF0YURlZmluaXRpb24pLmdldExpY2Vuc2VUeXBlKCkpOworCQlhZGRJZkV4aXN0cyhncmFwaE1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UT1NDQV9SRVNPVVJDRV9OQU1FLAorCQkJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKTsKKwkJcmV0dXJuIGdyYXBoTWFwOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9TZXJ2aWNlQXJ0aWZhY3RzRGF0YUNvbGxlY3Rpb24uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvU2VydmljZUFydGlmYWN0c0RhdGFDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwMTI2OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvU2VydmljZUFydGlmYWN0c0RhdGFDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFNlcnZpY2VBcnRpZmFjdHNEYXRhQ29sbGVjdGlvbiB7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8RVNBcnRpZmFjdERhdGE+PiBzZXJ2aWNlQXJ0aWZhY3REYXRhTWFwOworCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8RVNBcnRpZmFjdERhdGE+PiBnZXRTZXJ2aWNlQXJ0aWZhY3REYXRhTWFwKCkgeworCQlyZXR1cm4gc2VydmljZUFydGlmYWN0RGF0YU1hcDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQXJ0aWZhY3REYXRhTWFwKE1hcDxTdHJpbmcsIExpc3Q8RVNBcnRpZmFjdERhdGE+PiBzZXJ2aWNlQXJ0aWZhY3REYXRhTWFwKSB7CisJCXRoaXMuc2VydmljZUFydGlmYWN0RGF0YU1hcCA9IHNlcnZpY2VBcnRpZmFjdERhdGFNYXA7CisJfQorCisJcHVibGljIExpc3Q8RVNBcnRpZmFjdERhdGE+IGdldE5vZGVUZW1wbGF0ZUFydGlmYWN0cyhTdHJpbmcgbm9kZVRlbXBsYXRlTmFtZSkgeworCQlpZiAoc2VydmljZUFydGlmYWN0RGF0YU1hcCAhPSBudWxsICYmIHNlcnZpY2VBcnRpZmFjdERhdGFNYXAuY29udGFpbnNLZXkobm9kZVRlbXBsYXRlTmFtZSkpCisJCQlyZXR1cm4gc2VydmljZUFydGlmYWN0RGF0YU1hcC5nZXQobm9kZVRlbXBsYXRlTmFtZSk7CisJCWVsc2UKKwkJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9TZXJ2aWNlQ2F0ZWdvcnlEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1NlcnZpY2VDYXRlZ29yeURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZlMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9TZXJ2aWNlQ2F0ZWdvcnlEYXRhLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlQ2F0ZWdvcnlEYXRhIGV4dGVuZHMgQ2F0ZWdvcnlEYXRhIHsKKworCXB1YmxpYyBTZXJ2aWNlQ2F0ZWdvcnlEYXRhKCkgeworCQlzdXBlcihOb2RlVHlwZUVudW0uU2VydmljZUNhdGVnb3J5KTsKKwl9CisKKwlwdWJsaWMgU2VydmljZUNhdGVnb3J5RGF0YShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7CisJCXN1cGVyKGNhdGVnb3J5TmFtZSwgIiIsIE5vZGVUeXBlRW51bS5TZXJ2aWNlQ2F0ZWdvcnkpOworCQljcmVhdGVVbmlxdWVJZCgpOworCX0KKworCXB1YmxpYyBTZXJ2aWNlQ2F0ZWdvcnlEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlzdXBlcihwcm9wZXJ0aWVzLCBOb2RlVHlwZUVudW0uU2VydmljZUNhdGVnb3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVbmlxdWVJZCgpIHsKKwkJc2V0VW5pcXVlSWQoZ2V0TGFiZWwoKSArICIuIiArIGdldE5hbWUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1NlcnZpY2VNZXRhZGF0YURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvU2VydmljZU1ldGFkYXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjAxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1NlcnZpY2VNZXRhZGF0YURhdGEuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFNlcnZpY2VNZXRhZGF0YURhdGEgZXh0ZW5kcyBDb21wb25lbnRNZXRhZGF0YURhdGEgeworCisJcHVibGljIFNlcnZpY2VNZXRhZGF0YURhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBuZXcgU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24oKSk7CisJfQorCisJcHVibGljIFNlcnZpY2VNZXRhZGF0YURhdGEoU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24gc2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKTsKKwl9CisKKwlwdWJsaWMgU2VydmljZU1ldGFkYXRhRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLCBwcm9wZXJ0aWVzKTsKKwkJKChTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbikKKwkJCQkuc2V0UHJvamVjdENvZGUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9KRUNUX0NPREUuZ2V0UHJvcGVydHkoKSkpOworCQkoKFNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGFEZWZpbml0aW9uKS5zZXREaXN0cmlidXRpb25TdGF0dXMoCisJCQkJKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5ESVNUUklCVVRJT05fU1RBVFVTLmdldFByb3BlcnR5KCkpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkS2V5KCkgeworCQlyZXR1cm4gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGdyYXBoTWFwID0gc3VwZXIudG9HcmFwaE1hcCgpOworCQlhZGRJZkV4aXN0cyhncmFwaE1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9KRUNUX0NPREUsCisJCQkJKChTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbikuZ2V0UHJvamVjdENvZGUoKSk7CisJCWFkZElmRXhpc3RzKGdyYXBoTWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRJU1RSSUJVVElPTl9TVEFUVVMsCisJCQkJKChTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbikuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCkpOworCQlyZXR1cm4gZ3JhcGhNYXA7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1RhZ0RhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvVGFnRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjQxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1RhZ0RhdGEuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFRhZ0RhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCXByb3RlY3RlZCBUYWdEYXRhKE5vZGVUeXBlRW51bSBsYWJlbCkgeworCQlzdXBlcihsYWJlbCk7CisJfQorCisJcHVibGljIFRhZ0RhdGEoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlRhZyk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFRhZ0RhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5UYWcpOworCX0KKworCXB1YmxpYyBUYWdEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQlzdXBlcihOb2RlVHlwZUVudW0uVGFnKTsKKwkJc2V0TmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBuYW1lKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlRhZyBbTmFtZT0iICsgbmFtZSArICJdIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVRhZ0RhdGEgb3RoZXIgPSAoVGFnRGF0YSkgb2JqOworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuZ2V0Q2xhc3MoKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZEtleSgpIHsKKwkJcmV0dXJuIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9VbmlxdWVJZERhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvVW5pcXVlSWREYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmOWE2NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvVW5pcXVlSWREYXRhLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFVuaXF1ZUlkRGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXB1YmxpYyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtIGxhYmVsLCBTdHJpbmcgdW5pcXVlSWQpIHsKKwkJc3VwZXIobGFiZWwpOworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Vc2VyRGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9Vc2VyRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOWNhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1VzZXJEYXRhLmphdmEKQEAgLTAsMCArMSwyMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5EYW9VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgVXNlckRhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7CisKKwlwcml2YXRlIFN0cmluZyB1c2VySWQ7CisKKwlwcml2YXRlIFN0cmluZyBlbWFpbDsKKworCXByaXZhdGUgU3RyaW5nIHJvbGU7CisKKwlwcml2YXRlIFN0cmluZyBzdGF0dXM7CisKKwlwcml2YXRlIExvbmcgbGFzdExvZ2luVGltZTsKKworCXB1YmxpYyBVc2VyRGF0YShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyB1c2VySWQsIFN0cmluZyBlbWFpbCwgU3RyaW5nIHJvbGUsIFN0cmluZyBzdGF0dXMsCisJCQlMb25nIGxhc3RMb2dpblRpbWUpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlVzZXIpOworCQl0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKKwkJdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOworCQl0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKwkJdGhpcy5lbWFpbCA9IGVtYWlsOworCQl0aGlzLnJvbGUgPSByb2xlOworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwkJdGhpcy5sYXN0TG9naW5UaW1lID0gbGFzdExvZ2luVGltZTsKKwl9CisKKwlwdWJsaWMgVXNlckRhdGEoKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5Vc2VyKTsKKwl9CisKKwlwdWJsaWMgVXNlckRhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5Vc2VyKTsKKworCQlzZXRGaXJzdE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoImZpcnN0TmFtZSIpKTsKKwkJc2V0TGFzdE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoImxhc3ROYW1lIikpOworCQlzZXRVc2VySWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoInVzZXJJZCIpKTsKKwkJc2V0RW1haWwoKFN0cmluZykgcHJvcGVydGllcy5nZXQoImVtYWlsIikpOworCQlzZXRSb2xlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KCJyb2xlIikpOworCQlzZXRTdGF0dXMoKFN0cmluZykgcHJvcGVydGllcy5nZXQoInN0YXR1cyIpKTsKKwkJc2V0TGFzdExvZ2luVGltZSgoTG9uZykgcHJvcGVydGllcy5nZXQoImxhc3RMb2dpblRpbWUiKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKSB7CisJCXJldHVybiBmaXJzdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHsKKwkJdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpIHsKKwkJcmV0dXJuIGxhc3ROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgeworCQl0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VySWQoKSB7CisJCXJldHVybiB1c2VySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyB1c2VySWQpIHsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKwkJcmV0dXJuIGVtYWlsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkgeworCQl0aGlzLmVtYWlsID0gZW1haWw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSb2xlKCkgeworCQlyZXR1cm4gcm9sZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKSB7CisJCXRoaXMucm9sZSA9IHJvbGU7CisJfQorCisJLy8gcmlnaHQgbmFtZT8KKwlwdWJsaWMgdm9pZCBzZXRMYXN0TG9naW5UaW1lKCkgeworCQlEYXRlIGQgPSBuZXcgRGF0ZSgpOworCQl0aGlzLmxhc3RMb2dpblRpbWUgPSBuZXcgTG9uZyhkLmdldFRpbWUoKSk7IC8vIHRoaXMgaXMgaW4gbWlsbGktc2Vjb25kcworCQkJCQkJCQkJCQkJCS8vIGRpdmlkZSBieSAxMDAwIHRvIGdldAorCQkJCQkJCQkJCQkJCS8vIHNlY3M/CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdExvZ2luVGltZShMb25nIHRpbWUpIHsKKwkJdGhpcy5sYXN0TG9naW5UaW1lID0gdGltZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRMYXN0TG9naW5UaW1lKCkgeworCQlyZXR1cm4gdGhpcy5sYXN0TG9naW5UaW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVXNlckRhdGEgW2ZpcnN0TmFtZT0iICsgZmlyc3ROYW1lICsgIiwgbGFzdE5hbWU9IiArIGxhc3ROYW1lICsgIiwgdXNlcklkPSIgKyB1c2VySWQgKyAiLCBlbWFpbD0iICsgZW1haWwKKwkJCQkrICIsIHJvbGU9IiArIHJvbGUgKyAiLCBsYXN0IExvZ2luIHRpbWU9IiArIGxhc3RMb2dpblRpbWUgKyAiLCBwYXJlbnQ6ICIgKyBzdXBlci50b1N0cmluZygpICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHVzZXJJZCA9PSBudWxsKSA/IDAgOiB1c2VySWQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChlbWFpbCA9PSBudWxsKSA/IDAgOiBlbWFpbC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGZpcnN0TmFtZSA9PSBudWxsKSA/IDAgOiBmaXJzdE5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChsYXN0TmFtZSA9PSBudWxsKSA/IDAgOiBsYXN0TmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHJvbGUgPT0gbnVsbCkgPyAwIDogcm9sZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGxhc3RMb2dpblRpbWUgPT0gbnVsbCkgPyAwIDogbGFzdExvZ2luVGltZS5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJVXNlckRhdGEgb3RoZXIgPSAoVXNlckRhdGEpIG9iajsKKwkJaWYgKHVzZXJJZCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudXNlcklkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF1c2VySWQuZXF1YWxzKG90aGVyLnVzZXJJZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChlbWFpbCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuZW1haWwgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWVtYWlsLmVxdWFscyhvdGhlci5lbWFpbCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChmaXJzdE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmZpcnN0TmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghZmlyc3ROYW1lLmVxdWFscyhvdGhlci5maXJzdE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobGFzdE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmxhc3ROYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFsYXN0TmFtZS5lcXVhbHMob3RoZXIubGFzdE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAocm9sZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucm9sZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghcm9sZS5lcXVhbHMob3RoZXIucm9sZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChsYXN0TG9naW5UaW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5sYXN0TG9naW5UaW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFsYXN0TG9naW5UaW1lLmVxdWFscyhvdGhlci5sYXN0TG9naW5UaW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIFN0cmluZyB0b0pzb24oKSB7CisJCXJldHVybiBEYW9VdGlscy5jb252ZXJ0VG9Kc29uKHRvR3JhcGhNYXAoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVTRVJfSUQsIHVzZXJJZCk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5FTUFJTCwgZW1haWwpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuRklSU1RfTkFNRSwgZmlyc3ROYW1lKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfTkFNRSwgbGFzdE5hbWUpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUk9MRSwgcm9sZSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VU0VSX1NUQVRVUywgc3RhdHVzKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBU1RfTE9HSU5fVElNRSwgbGFzdExvZ2luVGltZSk7CisJCXJldHVybiBtYXA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZEtleSgpIHsKKwkJcmV0dXJuIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVVNFUl9JRC5nZXRQcm9wZXJ0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1c2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1VzZXJGdW5jdGlvbmFsTWVudURhdGEuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvVXNlckZ1bmN0aW9uYWxNZW51RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzFmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL1VzZXJGdW5jdGlvbmFsTWVudURhdGEuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuRGFvVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFVzZXJGdW5jdGlvbmFsTWVudURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIFN0cmluZyBmdW5jdGlvbmFsTWVudTsKKworCXB1YmxpYyBVc2VyRnVuY3Rpb25hbE1lbnVEYXRhKFN0cmluZyBmdW5jdGlvbmFsTWVudSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5Vc2VyRnVuY3Rpb25hbE1lbnUpOworCQl0aGlzLmZ1bmN0aW9uYWxNZW51ID0gZnVuY3Rpb25hbE1lbnU7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgVXNlckZ1bmN0aW9uYWxNZW51RGF0YSgpIHsKKwkJc3VwZXIoTm9kZVR5cGVFbnVtLlVzZXJGdW5jdGlvbmFsTWVudSk7CisJfQorCisJcHVibGljIFVzZXJGdW5jdGlvbmFsTWVudURhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXN1cGVyKE5vZGVUeXBlRW51bS5Vc2VyRnVuY3Rpb25hbE1lbnUpOworCisJCXNldEZ1bmN0aW9uYWxNZW51KChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuRlVOQ1RJT05BTF9NRU5VLmdldFByb3BlcnR5KCkpKTsKKwkJc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25hbE1lbnUoKSB7CisJCXJldHVybiBmdW5jdGlvbmFsTWVudTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbmFsTWVudShTdHJpbmcgZnVuY3Rpb25hbE1lbnUpIHsKKwkJdGhpcy5mdW5jdGlvbmFsTWVudSA9IGZ1bmN0aW9uYWxNZW51OworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJVc2VyRnVuY3Rpb25hbE1lbnVEYXRhIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBmdW5jdGlvbmFsTWVudT0iICsgZnVuY3Rpb25hbE1lbnUgKyAiXSI7CisJfQorCisJcHVibGljIFN0cmluZyB0b0pzb24oKSB7CisJCXJldHVybiBEYW9VdGlscy5jb252ZXJ0VG9Kc29uKHRvR3JhcGhNYXAoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9HcmFwaE1hcCgpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELCB1bmlxdWVJZCk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5GVU5DVElPTkFMX01FTlUsIGZ1bmN0aW9uYWxNZW51KTsKKworCQlyZXR1cm4gbWFwOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWRLZXkoKSB7CisJCXJldHVybiBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvQXVkaXRSZWNvcmRGYWN0b3J5LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1ZGl0UmVjb3JkRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOTgzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1ZGl0UmVjb3JkRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZzsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKKworcHVibGljIGZpbmFsIGNsYXNzIEF1ZGl0UmVjb3JkRmFjdG9yeSB7CisJcHVibGljIHN0YXRpYyBBdWRpdGluZ0dlbmVyaWNFdmVudCBjcmVhdGVBdWRpdFJlY29yZChFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIGFjdGlvbkVudW0gPSBBdWRpdGluZ0FjdGlvbkVudW0KKwkJCQkuZ2V0QWN0aW9uQnlOYW1lKChTdHJpbmcpIGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTikpOworCQlTdHJpbmcgdGFibGVOYW1lID0gYWN0aW9uRW51bS5nZXRBdWRpdGluZ0VzVHlwZSgpOworCQlBdWRpdGluZ0dlbmVyaWNFdmVudCBldmVudCA9IG51bGw7CisJCXN3aXRjaCAodGFibGVOYW1lKSB7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5VU0VSX0FETUlOX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBVc2VyQWRtaW5FdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVVEhfRVZFTlRfVFlQRToKKwkJCWV2ZW50ID0gbmV3IEF1dGhFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkNBVEVHT1JZX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBDYXRlZ29yeUV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRToKKwkJCWV2ZW50ID0gbmV3IFJlc291cmNlQWRtaW5FdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlVTRVJfQUNDRVNTX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBVc2VyQWNjZXNzRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fU1RBVFVTX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBEaXN0cmlidXRpb25TdGF0dXNFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9ET1dOTE9BRF9FVkVOVF9UWVBFOgorCQkJZXZlbnQgPSBuZXcgRGlzdHJpYnV0aW9uRG93bmxvYWRFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9FTkdJTkVfRVZFTlRfVFlQRToKKwkJCWV2ZW50ID0gbmV3IERpc3RyaWJ1dGlvbkVuZ2luZUV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX05PVElGSUNBVElPTl9FVkVOVF9UWVBFOgorCQkJZXZlbnQgPSBuZXcgRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fREVQTE9ZX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBEaXN0cmlidXRpb25EZXBsb3lFdmVudChhdWRpdGluZ0ZpZWxkcyk7CisJCQlicmVhazsKKwkJY2FzZSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9HRVRfVUVCX0NMVVNURVJfRVZFTlRfVFlQRToKKwkJCWV2ZW50ID0gbmV3IEF1ZGl0aW5nR2V0VWViQ2x1c3RlckV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQ09OU1VNRVJfRVZFTlRfVFlQRToKKwkJCWV2ZW50ID0gbmV3IENvbnN1bWVyRXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5HRVRfVVNFUlNfTElTVF9FVkVOVF9UWVBFOgorCQkJZXZlbnQgPSBuZXcgR2V0VXNlcnNMaXN0RXZlbnQoYXVkaXRpbmdGaWVsZHMpOworCQkJYnJlYWs7CisJCWNhc2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5HRVRfQ0FURUdPUllfSElFUkFSQ0hZX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBHZXRDYXRlZ29yeUhpZXJhcmNoeUV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQljYXNlIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRVhURVJOQUxfQVBJX0VWRU5UX1RZUEU6CisJCQlldmVudCA9IG5ldyBFeHRlcm5hbEFwaUV2ZW50KGF1ZGl0aW5nRmllbGRzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIGV2ZW50OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9BdWRpdGluZ0FjdGlvbkVudW0uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvQXVkaXRpbmdBY3Rpb25FbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwYmQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvQXVkaXRpbmdBY3Rpb25FbnVtLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZzsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBlbnVtIEF1ZGl0aW5nQWN0aW9uRW51bSB7CisKKwkvLyBVc2VyIGFkbWluaW5zdHJhdGlvbgorCUFERF9VU0VSKCJBZGRVc2VyIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5VU0VSX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlVUERBVEVfVVNFUigiVXBkYXRlVXNlciIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuVVNFUl9BRE1JTl9FVkVOVF9UWVBFKSwgCisJREVMRVRFX1VTRVIoIkRlbGV0ZVVzZXIiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlVTRVJfQURNSU5fRVZFTlRfVFlQRSksIAorCVVTRVJfQUNDRVNTKCJBY2Nlc3MiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlVTRVJfQUNDRVNTX0VWRU5UX1RZUEUpLCAKKwlHRVRfVVNFUlNfTElTVCgiR2V0VXNlcnNMaXN0IiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5HRVRfVVNFUlNfTElTVF9FVkVOVF9UWVBFKSwKKworCS8vIFJlc291cmNlL3NlcnZpY2UgYWRtaW5pc3RyYXRpb24KKwlDUkVBVEVfUkVTT1VSQ0UoIkNyZWF0ZSIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRSksIAorCUlNUE9SVF9SRVNPVVJDRSgiUmVzb3VyY2VJbXBvcnQiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlDSEVDS09VVF9SRVNPVVJDRSgiQ2hlY2tvdXQiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlVTkRPX0NIRUNLT1VUX1JFU09VUkNFKCJVbmRvQ2hlY2tvdXQiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlDSEVDS0lOX1JFU09VUkNFKCJDaGVja2luIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5SRVNPVVJDRV9BRE1JTl9FVkVOVF9UWVBFKSwgCisJQ0VSVElGSUNBVElPTl9SRVFVRVNUX1JFU09VUkNFKCJDZXJ0aWZpY2F0aW9uUmVxdWVzdCIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRSksIAorCVNUQVJUX0NFUlRJRklDQVRJT05fUkVTT1VSQ0UoIkNlcnRpZmljYXRpb25TdGFydCIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRSksIAorCUZBSUxfQ0VSVElGSUNBVElPTl9SRVNPVVJDRSgiQ2VydGlmaWNhdGlvbkZhaWx1cmUiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlDQU5DRUxfQ0VSVElGSUNBVElPTl9SRVNPVVJDRSgiQ2VydGlmaWNhdGlvbkNhbmNlbCIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRSksIAorCUNFUlRJRklDQVRJT05fU1VDQ0VTU19SRVNPVVJDRSgiQ2VydGlmaWNhdGlvblN1Y2Nlc3MiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlVUERBVEVfUkVTT1VSQ0VfTUVUQURBVEEoIlVwZGF0ZVJlc291cmNlTWV0YWRhdGEiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlVUERBVEVfU0VSVklDRV9NRVRBREFUQSgiVXBkYXRlU2VydmljZU1ldGFkYXRhIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5SRVNPVVJDRV9BRE1JTl9FVkVOVF9UWVBFKSwgCisJQVJUSUZBQ1RfVVBMT0FEKCJBcnRpZmFjdFVwbG9hZCIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRSksIAorCUFSVElGQUNUX1VQTE9BRF9CWV9BUEkoIkFydGlmYWN0VXBsb2FkQnlBUEkiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkVYVEVSTkFMX0FQSV9FVkVOVF9UWVBFKSwgCisJQVJUSUZBQ1RfVVBEQVRFX0JZX0FQSSgiQXJ0aWZhY3RVcGRhdGVCeUFQSSIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRVhURVJOQUxfQVBJX0VWRU5UX1RZUEUpLCAKKwlBUlRJRkFDVF9ERUxFVEVfQllfQVBJKCJBcnRpZmFjdERlbGV0ZUJ5QVBJIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5FWFRFUk5BTF9BUElfRVZFTlRfVFlQRSksIAorCUFSVElGQUNUX1BBWUxPQURfVVBEQVRFKCJBcnRpZmFjdFBheWxvYWRVcGRhdGUiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlBUlRJRkFDVF9NRVRBREFUQV9VUERBVEUoIkFydGlmYWN0TWV0YWRhdGFVcGRhdGUiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlBUlRJRkFDVF9ERUxFVEUoIkFydGlmYWN0RGVsZXRlIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5SRVNPVVJDRV9BRE1JTl9FVkVOVF9UWVBFKSwgCisJQVJUSUZBQ1RfRE9XTkxPQUQoIkFydGlmYWN0RG93bmxvYWQiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlET1dOTE9BRF9BUlRJRkFDVCgiRG93bmxvYWRBcnRpZmFjdCIsQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5FWFRFUk5BTF9BUElfRVZFTlRfVFlQRSksCisKKwkvLyBEaXN0cmlidXRpb24KKwlESVNUUklCVVRJT05fQVJUSUZBQ1RfRE9XTkxPQUQoIkRBcnRpZmFjdERvd25sb2FkIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fRE9XTkxPQURfRVZFTlRfVFlQRSksIAorCURJU1RSSUJVVElPTl9TVEFURV9DSEFOR0VfUkVRVUVTVCgiRFJlcXVlc3QiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlESVNUUklCVVRJT05fU1RBVEVfQ0hBTkdFX0FQUFJPVigiREFwcHJvdmUiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpLCAKKwlESVNUUklCVVRJT05fU1RBVEVfQ0hBTkdFX1JFSkVDVCgiRFJlamVjdCIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuUkVTT1VSQ0VfQURNSU5fRVZFTlRfVFlQRSksIAorCUNSRUFURV9ESVNUUklCVVRJT05fVE9QSUMoIkNyZWF0ZURpc3RyaWJ1dGlvblRvcGljIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fRU5HSU5FX0VWRU5UX1RZUEUpLCAKKwlBRERfS0VZX1RPX1RPUElDX0FDTCgiQWRkS2V5VG9Ub3BpY0FDTCIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0VOR0lORV9FVkVOVF9UWVBFKSwgCisJUkVNT1ZFX0tFWV9GUk9NX1RPUElDX0FDTCgiUmVtb3ZlS2V5RnJvbVRvcGljQUNMIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fRU5HSU5FX0VWRU5UX1RZUEUpLCAKKwlESVNUUklCVVRJT05fUkVHSVNURVIoIkRSZWdpc3RlciIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0VOR0lORV9FVkVOVF9UWVBFKSwgCisJRElTVFJJQlVUSU9OX1VOX1JFR0lTVEVSKCJEVW5SZWdpc3RlciIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0VOR0lORV9FVkVOVF9UWVBFKSwKKwlESVNUUklCVVRJT05fTk9USUZZKCJETm90aWZ5IiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX0VWRU5UX1RZUEUpLCAKKwlESVNUUklCVVRJT05fU1RBVFVTKCJEU3RhdHVzIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fU1RBVFVTX0VWRU5UX1RZUEUpLCAKKwlESVNUUklCVVRJT05fREVQTE9ZKCJEUmVzdWx0IixBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlRfVFlQRSksIAorCUdFVF9VRUJfQ0xVU1RFUigiR2V0VWViQ2x1c3RlciIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVF9UWVBFKSwgCisJR0VUX1ZBTElEX0FSVElGQUNUX1RZUEVTKCJHZXRWYWxpZEFydGlmYWN0VHlwZXMiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9HRVRfVkFMSURfQVJUSUZBQ1RfVFlQRVNfRVZFTlRfVFlQRSksCisJLy8gLi4uLgorCUFVVEhfUkVRVUVTVCgiSHR0cEF1dGhlbnRpY2F0aW9uIiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVVRIX0VWRU5UX1RZUEUpLCAKKwlBRERfRUNPTVBfVVNFUl9DUkVERU5USUFMUygiQWRkRUNPTVBVc2VyQ3JlZGVudGlhbHMiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkNPTlNVTUVSX0VWRU5UX1RZUEUpLCAKKwlHRVRfRUNPTVBfVVNFUl9DUkVERU5USUFMUygiR2V0RUNPTVBVc2VyQ3JlZGVudGlhbHMiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkNPTlNVTUVSX0VWRU5UX1RZUEUpLCAKKwlERUxFVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUygiRGVsZXRlRUNPTVBVc2VyQ3JlZGVudGlhbHMiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkNPTlNVTUVSX0VWRU5UX1RZUEUpLCAKKwlVUERBVEVfRUNPTVBfVVNFUl9DUkVERU5USUFMUygiVXBkYXRlRUNPTVBVc2VyQ3JlZGVudGlhbHMiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkNPTlNVTUVSX0VWRU5UX1RZUEUpLAorCS8vIENhdGVnb3J5CisJQUREX0NBVEVHT1JZKCJBZGRDYXRlZ29yeSIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQ0FURUdPUllfRVZFTlRfVFlQRSksIAorCUFERF9TVUJfQ0FURUdPUlkoIkFkZFN1YkNhdGVnb3J5IiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5DQVRFR09SWV9FVkVOVF9UWVBFKSwgCisJQUREX0dST1VQSU5HKCJBZGRHcm91cGluZyIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQ0FURUdPUllfRVZFTlRfVFlQRSksCisJR0VUX0NBVEVHT1JZX0hJRVJBUkNIWSgiR2V0Q2F0ZWdvcnlIaWVyYXJjaHkiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkdFVF9DQVRFR09SWV9ISUVSQVJDSFlfRVZFTlRfVFlQRSksCisKKwkvLyBBc3NldHMKKworCUdFVF9BU1NFVF9MSVNUKCJHZXRBc3NldExpc3QiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkVYVEVSTkFMX0FQSV9FVkVOVF9UWVBFKSwgCisJR0VUX0ZJTFRFUkVEX0FTU0VUX0xJU1QoIkdldEZpbHRlcmVkQXNzZXRMaXN0IiwgQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5FWFRFUk5BTF9BUElfRVZFTlRfVFlQRSksIAorCUdFVF9BU1NFVF9NRVRBREFUQSgiR2V0QXNzZXRNZXRhZGF0YSIsIEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRVhURVJOQUxfQVBJX0VWRU5UX1RZUEUpLCAKKwlHRVRfVE9TQ0FfTU9ERUwoIkdldFRvc2NhTW9kZWwiLCBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkVYVEVSTkFMX0FQSV9FVkVOVF9UWVBFKTsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJLy8gcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQ+IGF1ZGl0aW5nRXNUeXBlOworCXByaXZhdGUgU3RyaW5nIGF1ZGl0aW5nRXNUeXBlOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF1ZGl0aW5nQWN0aW9uRW51bS5jbGFzcy5nZXROYW1lKCkpOworCisJLy8gQXVkaXRpbmdBY3Rpb25FbnVtKFN0cmluZyBuYW1lLCBDbGFzczw/IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQ+CisJLy8gYXVkaXRpbmdFc1R5cGUpeworCS8vIHRoaXMubmFtZSA9IG5hbWU7CisJLy8gdGhpcy5hdWRpdGluZ0VzVHlwZSA9IGF1ZGl0aW5nRXNUeXBlOworCS8vIH0KKworCUF1ZGl0aW5nQWN0aW9uRW51bShTdHJpbmcgbmFtZSwgU3RyaW5nIGF1ZGl0aW5nRXNUeXBlKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuYXVkaXRpbmdFc1R5cGUgPSBhdWRpdGluZ0VzVHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8vIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQ+IGdldEF1ZGl0aW5nRXNUeXBlKCl7CisJLy8gcmV0dXJuIGF1ZGl0aW5nRXNUeXBlOworCS8vIH0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXVkaXRpbmdFc1R5cGUoKSB7CisJCXJldHVybiBhdWRpdGluZ0VzVHlwZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEF1ZGl0aW5nQWN0aW9uRW51bSBnZXRBY3Rpb25CeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJQXVkaXRpbmdBY3Rpb25FbnVtIHJlcyA9IG51bGw7CisJCUF1ZGl0aW5nQWN0aW9uRW51bVtdIHZhbHVlcyA9IHZhbHVlcygpOworCQlmb3IgKEF1ZGl0aW5nQWN0aW9uRW51bSB2YWx1ZSA6IHZhbHVlcykgeworCQkJaWYgKHZhbHVlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXMgPSB2YWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmVzID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiTm8gYXVkaXRpbmcgYWN0aW9uIGlzIG1hcHBlZCB0byBuYW1lIHt9IiwgbmFtZSk7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1ZGl0aW5nR2VuZXJpY0V2ZW50LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1ZGl0aW5nR2VuZXJpY0V2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMjBiZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvQXVkaXRpbmdHZW5lcmljRXZlbnQuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5FU1RpbWVCYXNlZEV2ZW50OworCitwdWJsaWMgY2xhc3MgQXVkaXRpbmdHZW5lcmljRXZlbnQgZXh0ZW5kcyBFU1RpbWVCYXNlZEV2ZW50IHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RJZDsKKwlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkOworCXByb3RlY3RlZCBTdHJpbmcgYWN0aW9uOworCXByb3RlY3RlZCBTdHJpbmcgc3RhdHVzOworCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjOworCisJLy8gcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gZmllbGRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwlwdWJsaWMgQXVkaXRpbmdHZW5lcmljRXZlbnQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0SWQoKSB7CisJCXJldHVybiByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdElkKFN0cmluZyByZXF1ZXN0SWQpIHsKKwkJdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkgeworCQlyZXR1cm4gc2VydmljZUluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZUluc3RhbmNlSWQoU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkKSB7CisJCXRoaXMuc2VydmljZUluc3RhbmNlSWQgPSBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisJLy8gcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0RmllbGRzKCkgeworCS8vIHJldHVybiBmaWVsZHM7CisJLy8gfQorCS8vCisJLy8gcHVibGljIHZvaWQgc2V0RmllbGRzKE1hcDxTdHJpbmcsIE9iamVjdD4gZmllbGRzKSB7CisJLy8gdGhpcy5maWVsZHMgPSBmaWVsZHM7CisJLy8gfQorCisJcHVibGljIHZvaWQgZmlsbEZpZWxkcygpIHsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9BdWRpdGluZ0dldFVlYkNsdXN0ZXJFdmVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9BdWRpdGluZ0dldFVlYkNsdXN0ZXJFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGMwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1ZGl0aW5nR2V0VWViQ2x1c3RlckV2ZW50LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZzsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUudXRpbHMuVVVJRHM7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNsdXN0ZXJpbmdDb2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUGFydGl0aW9uS2V5OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5UYWJsZTsKKworQFRhYmxlKGtleXNwYWNlID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRSwgbmFtZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVF9UWVBFKQorcHVibGljIGNsYXNzIEF1ZGl0aW5nR2V0VWViQ2x1c3RlckV2ZW50IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVNUUklCVVRJT05fR0VUX1VFQl9DTFVTVEVSX0VWRU5UX1RFTVBMQVRFID0gImFjdGlvbj1cIiVzXCIgIgorCQkJKyAiIGNvbnN1bWVySWQ9XCIlc1wiIHN0YXR1c1RpbWU9XCIlc1wiIHN0YXR1cz1cIiVzXCIgc3RhdHVzX2Rlc2M9XCIlc1wiICI7CisKKwlAUGFydGl0aW9uS2V5CisJcHJvdGVjdGVkIFVVSUQgdGltZWJhc2VkdXVpZDsKKworCUBDbHVzdGVyaW5nQ29sdW1uCisJcHJvdGVjdGVkIERhdGUgdGltZXN0YW1wMTsKKworCUBDb2x1bW4obmFtZSA9ICJyZXF1ZXN0X2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RJZDsKKworCUBDb2x1bW4obmFtZSA9ICJzZXJ2aWNlX2luc3RhbmNlX2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIGFjdGlvbjsKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBzdGF0dXM7CisKKwlAQ29sdW1uKG5hbWUgPSAiZGVzY3JpcHRpb24iKQorCXByb3RlY3RlZCBTdHJpbmcgZGVzYzsKKworCUBDb2x1bW4obmFtZSA9ICJjb25zdW1lcl9pZCIpCisJcHJpdmF0ZSBTdHJpbmcgY29uc3VtZXJJZDsKKworCXB1YmxpYyBBdWRpdGluZ0dldFVlYkNsdXN0ZXJFdmVudCgpIHsKKwkJc3VwZXIoKTsKKwkJdGltZXN0YW1wMSA9IG5ldyBEYXRlKCk7CisJCXRpbWViYXNlZHV1aWQgPSBVVUlEcy50aW1lQmFzZWQoKTsKKwl9CisKKwlwdWJsaWMgQXVkaXRpbmdHZXRVZWJDbHVzdGVyRXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCXRoaXMoKTsKKwkJT2JqZWN0IHZhbHVlOworCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVxdWVzdElkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U2VydmljZUluc3RhbmNlSWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFjdGlvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGVzYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfREVTQyk7CisJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCXNldERlc2MoKFN0cmluZykgdmFsdWUpOworCQkJfQorCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldENvbnN1bWVySWQoKFN0cmluZykgdmFsdWUpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsRmllbGRzKCkgeworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRSZXF1ZXN0SWQoKSk7CisKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U2VydmljZUluc3RhbmNlSWQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0QWN0aW9uKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLmdldERpc3BsYXlOYW1lKCksIGdldFN0YXR1cygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0RGVzYygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRDb25zdW1lcklkKCkpOworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh0aW1lc3RhbXAxKSk7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVySWQoKSB7CisJCXJldHVybiBjb25zdW1lcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVySWQoU3RyaW5nIGNvbnN1bWVySWQpIHsKKwkJdGhpcy5jb25zdW1lcklkID0gY29uc3VtZXJJZDsKKwl9CisKKwlwdWJsaWMgVVVJRCBnZXRUaW1lYmFzZWR1dWlkKCkgeworCQlyZXR1cm4gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lYmFzZWR1dWlkKFVVSUQgdGltZWJhc2VkdXVpZCkgeworCQl0aGlzLnRpbWViYXNlZHV1aWQgPSB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcDEoKSB7CisJCXJldHVybiB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcDEoRGF0ZSB0aW1lc3RhbXAxKSB7CisJCXRoaXMudGltZXN0YW1wMSA9IHRpbWVzdGFtcDE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0SWQoKSB7CisJCXJldHVybiByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdElkKFN0cmluZyByZXF1ZXN0SWQpIHsKKwkJdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpIHsKKwkJcmV0dXJuIHNlcnZpY2VJbnN0YW5jZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnN0YW5jZUlkKFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCkgeworCQl0aGlzLnNlcnZpY2VJbnN0YW5jZUlkID0gc2VydmljZUluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJBdWRpdGluZ0dldFVlYkNsdXN0ZXJFdmVudCBbdGltZWJhc2VkdXVpZD0iICsgdGltZWJhc2VkdXVpZCArICIsIHRpbWVzdGFtcDE9IiArIHRpbWVzdGFtcDEKKwkJCQkrICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgc2VydmljZUluc3RhbmNlSWQ9IiArIHNlcnZpY2VJbnN0YW5jZUlkICsgIiwgYWN0aW9uPSIgKyBhY3Rpb24KKwkJCQkrICIsIHN0YXR1cz0iICsgc3RhdHVzICsgIiwgZGVzYz0iICsgZGVzYyArICIsIGNvbnN1bWVySWQ9IiArIGNvbnN1bWVySWQgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1ZGl0aW5nVHlwZXNDb25zdGFudHMuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzc0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1ZGl0aW5nVHlwZXNDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK3B1YmxpYyBpbnRlcmZhY2UgQXVkaXRpbmdUeXBlc0NvbnN0YW50cyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9LRVlTUEFDRSA9ICJzZGNhcnRpZmFjdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESVRfS0VZU1BBQ0UgPSAic2RjYXVkaXQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9LRVlTUEFDRSA9ICJzZGNjb21wb25lbnQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVEFOX0tFWVNQQUNFID0gInRpdGFuIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQURNSU5fRVZFTlRfVFlQRSA9ICJ1c2VyYWRtaW5ldmVudCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9BQ0NFU1NfRVZFTlRfVFlQRSA9ICJ1c2VyYWNjZXNzZXZlbnQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUgPSAicmVzb3VyY2VhZG1pbmV2ZW50IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNUUklCVVRJT05fRE9XTkxPQURfRVZFTlRfVFlQRSA9ICJkaXN0cmlidXRpb25kb3dubG9hZGV2ZW50IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1RSSUJVVElPTl9FTkdJTkVfRVZFTlRfVFlQRSA9ICJkaXN0cmlidXRpb25lbmdpbmVldmVudCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTVFJJQlVUSU9OX05PVElGSUNBVElPTl9FVkVOVF9UWVBFID0gImRpc3RyaWJ1dGlvbm5vdGlmaWNhdGlvbmV2ZW50IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNUUklCVVRJT05fU1RBVFVTX0VWRU5UX1RZUEUgPSAiZGlzdHJpYnV0aW9uc3RhdHVzZXZlbnQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlRfVFlQRSA9ICJkaXN0cmlidXRpb25kZXBsb3lldmVudCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTVFJJQlVUSU9OX0dFVF9VRUJfQ0xVU1RFUl9FVkVOVF9UWVBFID0gImF1ZGl0aW5nZ2V0dWViY2x1c3RlcmV2ZW50IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNUUklCVVRJT05fR0VUX1ZBTElEX0FSVElGQUNUX1RZUEVTX0VWRU5UX1RZUEUgPSAiYXVkaXRpbmdnZXR2YWxpZGFydGlmYWN0dHlwZXNldmVudCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX0VWRU5UX1RZUEUgPSAiYXV0aGV2ZW50IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVU1FUl9FVkVOVF9UWVBFID0gImNvbnN1bWVyZXZlbnQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0VWRU5UX1RZUEUgPSAiY2F0ZWdvcnlldmVudCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1VTRVJTX0xJU1RfRVZFTlRfVFlQRSA9ICJnZXR1c2Vyc2xpc3RldmVudCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0NBVEVHT1JZX0hJRVJBUkNIWV9FVkVOVF9UWVBFID0gImdldGNhdGVnb3J5aGllcmFyY2h5ZXZlbnQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0FQSV9FVkVOVF9UWVBFID0gImV4dGVybmFsYXBpZXZlbnQiOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0F1dGhFdmVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9BdXRoRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWE0MmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9BdXRoRXZlbnQuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS51dGlscy5VVUlEczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ2x1c3RlcmluZ0NvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5QYXJ0aXRpb25LZXk7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlRhYmxlOworCitAVGFibGUoa2V5c3BhY2UgPSAic2RjQXVkaXQiLCBuYW1lID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVVRIX0VWRU5UX1RZUEUpCitwdWJsaWMgY2xhc3MgQXV0aEV2ZW50IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFVVEhfRVZFTlRfVEVNUExBVEUgPSAiYWN0aW9uPVwiJXNcIiB0aW1lc3RhbXA9XCIlc1wiICIKKwkJCSsgIlVSTD1cIiVzXCIgVVNFUj1cIiVzXCIgQVVUSF9TVEFUVVM9XCIlc1wiICIgKyAiUkVBTE09XCIlc1wiIHN0YXR1cz1cIiVzXCIgZGVzYz1cIiVzXCIiOworCisJQFBhcnRpdGlvbktleQorCXByb3RlY3RlZCBVVUlEIHRpbWViYXNlZHV1aWQ7CisKKwlAQ2x1c3RlcmluZ0NvbHVtbgorCXByb3RlY3RlZCBEYXRlIHRpbWVzdGFtcDE7CisKKwlAQ29sdW1uCisJcHJpdmF0ZSBTdHJpbmcgdXJsOworCUBDb2x1bW4KKwlwcml2YXRlIFN0cmluZyB1c2VyOworCisJQENvbHVtbihuYW1lID0gImF1dGhfc3RhdHVzIikKKwlwcml2YXRlIFN0cmluZyBhdXRoU3RhdHVzOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIHJlYWxtOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIGFjdGlvbjsKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBzdGF0dXM7CisKKwlAQ29sdW1uKG5hbWUgPSAiZGVzY3JpcHRpb24iKQorCXByb3RlY3RlZCBTdHJpbmcgZGVzYzsKKworCUBDb2x1bW4obmFtZSA9ICJyZXF1ZXN0X2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RJZDsKKworCXB1YmxpYyBBdXRoRXZlbnQoKSB7CisJCXN1cGVyKCk7CisJCXRpbWVzdGFtcDEgPSBuZXcgRGF0ZSgpOworCQl0aW1lYmFzZWR1dWlkID0gVVVJRHMudGltZUJhc2VkKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VyKCkgeworCQlyZXR1cm4gdXNlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyKSB7CisJCXRoaXMudXNlciA9IHVzZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBdXRoU3RhdHVzKCkgeworCQlyZXR1cm4gYXV0aFN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBdXRoU3RhdHVzKFN0cmluZyBhdXRoU3RhdHVzKSB7CisJCXRoaXMuYXV0aFN0YXR1cyA9IGF1dGhTdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZWFsbSgpIHsKKwkJcmV0dXJuIHJlYWxtOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlYWxtKFN0cmluZyByZWFsbSkgeworCQl0aGlzLnJlYWxtID0gcmVhbG07CisJfQorCisJcHVibGljIFVVSUQgZ2V0VGltZWJhc2VkdXVpZCgpIHsKKwkJcmV0dXJuIHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZWJhc2VkdXVpZChVVUlEIHRpbWViYXNlZHV1aWQpIHsKKwkJdGhpcy50aW1lYmFzZWR1dWlkID0gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAxKCkgeworCQlyZXR1cm4gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAxKERhdGUgdGltZXN0YW1wMSkgeworCQl0aGlzLnRpbWVzdGFtcDEgPSB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdElkKCkgeworCQlyZXR1cm4gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RJZChTdHJpbmcgcmVxdWVzdElkKSB7CisJCXRoaXMucmVxdWVzdElkID0gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyBBdXRoRXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCXRoaXMoKTsKKwkJT2JqZWN0IHZhbHVlOworCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfVVJMKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFVybCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BVVRIX1VTRVIpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0VXNlcigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BVVRIX1NUQVRVUyk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRBdXRoU3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfUkVBTE0pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVhbG0oKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFjdGlvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERlc2MoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSZXF1ZXN0SWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFN0YXR1cygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGxGaWVsZHMoKSB7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BVVRIX1VSTC5nZXREaXNwbGF5TmFtZSgpLCBnZXRVcmwoKSk7CisKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfVVNFUi5nZXREaXNwbGF5TmFtZSgpLCBnZXRVc2VyKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQVVUSF9TVEFUVVMuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0QXV0aFN0YXR1cygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FVVEhfUkVBTE0uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVhbG0oKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0QWN0aW9uKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLmdldERpc3BsYXlOYW1lKCksIGdldFN0YXR1cygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVxdWVzdElkKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQy5nZXREaXNwbGF5TmFtZSgpLCBnZXREZXNjKCkpOworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh0aW1lc3RhbXAxKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9DYXRlZ29yeUV2ZW50LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0NhdGVnb3J5RXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcwYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9DYXRlZ29yeUV2ZW50LmphdmEKQEAgLTAsMCArMSwyNDAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZzsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUudXRpbHMuVVVJRHM7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNsdXN0ZXJpbmdDb2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUGFydGl0aW9uS2V5OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5UYWJsZTsKKworQFRhYmxlKGtleXNwYWNlID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRSwgbmFtZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQ0FURUdPUllfRVZFTlRfVFlQRSkKK3B1YmxpYyBjbGFzcyBDYXRlZ29yeUV2ZW50IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQgeworCUBQYXJ0aXRpb25LZXkKKwlwcm90ZWN0ZWQgVVVJRCB0aW1lYmFzZWR1dWlkOworCisJQENsdXN0ZXJpbmdDb2x1bW4KKwlwcm90ZWN0ZWQgRGF0ZSB0aW1lc3RhbXAxOworCisJQENvbHVtbgorCVN0cmluZyBhY3Rpb247CisJQENvbHVtbgorCVN0cmluZyBzdGF0dXM7CisJQENvbHVtbihuYW1lID0gImRlc2NyaXB0aW9uIikKKwlTdHJpbmcgZGVzYzsKKworCUBDb2x1bW4obmFtZSA9ICJjYXRlZ29yeV9uYW1lIikKKwlTdHJpbmcgY2F0ZWdvcnlOYW1lOworCisJQENvbHVtbihuYW1lID0gInN1Yl9jYXRlZ29yeV9uYW1lIikKKwlTdHJpbmcgc3ViQ2F0ZWdvcnlOYW1lOworCisJQENvbHVtbihuYW1lID0gImdyb3VwaW5nX25hbWUiKQorCVN0cmluZyBncm91cGluZ05hbWU7CisKKwlAQ29sdW1uCisJU3RyaW5nIG1vZGlmaWVyOworCisJQENvbHVtbihuYW1lID0gInNlcnZpY2VfaW5zdGFuY2VfaWQiKQorCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZDsKKworCUBDb2x1bW4obmFtZSA9ICJyZXNvdXJjZV90eXBlIikKKwlTdHJpbmcgcmVzb3VyY2VUeXBlOworCisJQENvbHVtbihuYW1lID0gInJlcXVlc3RfaWQiKQorCVN0cmluZyByZXF1ZXN0SWQ7CisKKwlwdWJsaWMgQ2F0ZWdvcnlFdmVudCgpIHsKKwkJc3VwZXIoKTsKKwkJdGltZXN0YW1wMSA9IG5ldyBEYXRlKCk7CisJCXRpbWViYXNlZHV1aWQgPSBVVUlEcy50aW1lQmFzZWQoKTsKKwl9CisKKwlwdWJsaWMgQ2F0ZWdvcnlFdmVudChFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKwkJdGhpcygpOworCQlPYmplY3QgdmFsdWU7CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFjdGlvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGVzYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DQVRFR09SWV9OQU1FKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldENhdGVnb3J5TmFtZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVUJfQ0FURUdPUllfTkFNRSk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRTdWJDYXRlZ29yeU5hbWUoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfR1JPVVBJTkdfTkFNRSk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRHcm91cGluZ05hbWUoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldE1vZGlmaWVyKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVxdWVzdElkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVzb3VyY2VUeXBlKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U2VydmljZUluc3RhbmNlSWQoKFN0cmluZykgdmFsdWUpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsRmllbGRzKCkgeworCisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0QWN0aW9uKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLmdldERpc3BsYXlOYW1lKCksIGdldFN0YXR1cygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0RGVzYygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0NBVEVHT1JZX05BTUUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0Q2F0ZWdvcnlOYW1lKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1VCX0NBVEVHT1JZX05BTUUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U3ViQ2F0ZWdvcnlOYW1lKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfR1JPVVBJTkdfTkFNRS5nZXREaXNwbGF5TmFtZSgpLCBnZXRHcm91cGluZ05hbWUoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0TW9kaWZpZXIoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELmdldERpc3BsYXlOYW1lKCksIGdldFJlcXVlc3RJZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVzb3VyY2VUeXBlKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpKTsKKwkJU2ltcGxlRGF0ZUZvcm1hdCBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZGF0ZUZvcm1hdFBhdHRlcm4pOworCQlzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAuZ2V0RGlzcGxheU5hbWUoKSwgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQodGltZXN0YW1wMSkpOworCisJfQorCisJcHVibGljIFVVSUQgZ2V0VGltZWJhc2VkdXVpZCgpIHsKKwkJcmV0dXJuIHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZWJhc2VkdXVpZChVVUlEIHRpbWViYXNlZHV1aWQpIHsKKwkJdGhpcy50aW1lYmFzZWR1dWlkID0gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeU5hbWUoU3RyaW5nIGNhdGVnb3J5TmFtZSkgeworCQl0aGlzLmNhdGVnb3J5TmFtZSA9IGNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN1YkNhdGVnb3J5TmFtZSgpIHsKKwkJcmV0dXJuIHN1YkNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdWJDYXRlZ29yeU5hbWUoU3RyaW5nIHN1YkNhdGVnb3J5TmFtZSkgeworCQl0aGlzLnN1YkNhdGVnb3J5TmFtZSA9IHN1YkNhdGVnb3J5TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEdyb3VwaW5nTmFtZSgpIHsKKwkJcmV0dXJuIGdyb3VwaW5nTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cGluZ05hbWUoU3RyaW5nIGdyb3VwaW5nTmFtZSkgeworCQl0aGlzLmdyb3VwaW5nTmFtZSA9IGdyb3VwaW5nTmFtZTsKKwl9CisKKwlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAxKCkgeworCQlyZXR1cm4gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAxKERhdGUgdGltZXN0YW1wMSkgeworCQl0aGlzLnRpbWVzdGFtcDEgPSB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXIoKSB7CisJCXJldHVybiBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIpIHsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUluc3RhbmNlSWQoKSB7CisJCXJldHVybiBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW5zdGFuY2VJZChTdHJpbmcgc2VydmljZUluc3RhbmNlSWQpIHsKKwkJdGhpcy5zZXJ2aWNlSW5zdGFuY2VJZCA9IHNlcnZpY2VJbnN0YW5jZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgcmVzb3VyY2VUeXBlKSB7CisJCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdElkKCkgeworCQlyZXR1cm4gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RJZChTdHJpbmcgcmVxdWVzdElkKSB7CisJCXRoaXMucmVxdWVzdElkID0gcmVxdWVzdElkOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9Db25zdW1lckV2ZW50LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0NvbnN1bWVyRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzViYzMxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9Db25zdW1lckV2ZW50LmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZzsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUudXRpbHMuVVVJRHM7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNsdXN0ZXJpbmdDb2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUGFydGl0aW9uS2V5OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5UYWJsZTsKKworQFRhYmxlKGtleXNwYWNlID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRSwgbmFtZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQ09OU1VNRVJfRVZFTlRfVFlQRSkKK3B1YmxpYyBjbGFzcyBDb25zdW1lckV2ZW50IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBDT05TVU1FUl9FVkVOVF9URU1QTEFURSA9ICJhY3Rpb249XCIlc1wiIHRpbWVzdGFtcD1cIiVzXCIgIgorCQkJKyAibW9kaWZpZXI9XCIlc1wiIGVjb21wVXNlcj1cIiVzXCIgc3RhdHVzPVwiJXNcIiBkZXNjPVwiJXNcIiI7CisKKwlAUGFydGl0aW9uS2V5CisJcHJvdGVjdGVkIFVVSUQgdGltZWJhc2VkdXVpZDsKKworCUBDbHVzdGVyaW5nQ29sdW1uCisJcHJvdGVjdGVkIERhdGUgdGltZXN0YW1wMTsKKworCUBDb2x1bW4obmFtZSA9ICJyZXF1ZXN0X2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RJZDsKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBhY3Rpb247CisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgc3RhdHVzOworCisJQENvbHVtbihuYW1lID0gImRlc2NyaXB0aW9uIikKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2M7CisKKwlAQ29sdW1uCisJcHJpdmF0ZSBTdHJpbmcgbW9kaWZpZXI7CisKKwlAQ29sdW1uKG5hbWUgPSAiZWNvbXBfdXNlciIpCisJcHJpdmF0ZSBTdHJpbmcgZWNvbXBVc2VyOworCisJcHVibGljIENvbnN1bWVyRXZlbnQoKSB7CisJCXN1cGVyKCk7CisJCXRpbWVzdGFtcDEgPSBuZXcgRGF0ZSgpOworCQl0aW1lYmFzZWR1dWlkID0gVVVJRHMudGltZUJhc2VkKCk7CisJfQorCisJcHVibGljIENvbnN1bWVyRXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCXRoaXMoKTsKKwkJT2JqZWN0IHZhbHVlOworCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVxdWVzdElkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTik7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRBY3Rpb24oKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFN0YXR1cygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERlc2MoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldE1vZGlmaWVyKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0VDT01QX1VTRVIpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RWNvbXBVc2VyKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGxGaWVsZHMoKSB7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELmdldERpc3BsYXlOYW1lKCksIGdldFJlcXVlc3RJZCgpKTsKKworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEFjdGlvbigpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUy5nZXREaXNwbGF5TmFtZSgpLCBnZXRTdGF0dXMoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLmdldERpc3BsYXlOYW1lKCksIGdldERlc2MoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0TW9kaWZpZXIoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9FQ09NUF9VU0VSLmdldERpc3BsYXlOYW1lKCksIGdldEVjb21wVXNlcigpKTsKKwkJU2ltcGxlRGF0ZUZvcm1hdCBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZGF0ZUZvcm1hdFBhdHRlcm4pOworCQlzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAuZ2V0RGlzcGxheU5hbWUoKSwgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQodGltZXN0YW1wMSkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXIoKSB7CisJCXJldHVybiBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIpIHsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RWNvbXBVc2VyKCkgeworCQlyZXR1cm4gZWNvbXBVc2VyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVjb21wVXNlcihTdHJpbmcgZWNvbXBVc2VyKSB7CisJCXRoaXMuZWNvbXBVc2VyID0gZWNvbXBVc2VyOworCX0KKworCXB1YmxpYyBVVUlEIGdldFRpbWViYXNlZHV1aWQoKSB7CisJCXJldHVybiB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWViYXNlZHV1aWQoVVVJRCB0aW1lYmFzZWR1dWlkKSB7CisJCXRoaXMudGltZWJhc2VkdXVpZCA9IHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIERhdGUgZ2V0VGltZXN0YW1wMSgpIHsKKwkJcmV0dXJuIHRpbWVzdGFtcDE7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wMShEYXRlIHRpbWVzdGFtcDEpIHsKKwkJdGhpcy50aW1lc3RhbXAxID0gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RJZCgpIHsKKwkJcmV0dXJuIHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0SWQoU3RyaW5nIHJlcXVlc3RJZCkgeworCQl0aGlzLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNvbnN1bWVyRXZlbnQgW3RpbWViYXNlZHV1aWQ9IiArIHRpbWViYXNlZHV1aWQgKyAiLCB0aW1lc3RhbXAxPSIgKyB0aW1lc3RhbXAxICsgIiwgcmVxdWVzdElkPSIKKwkJCQkrIHJlcXVlc3RJZCArICIsIGFjdGlvbj0iICsgYWN0aW9uICsgIiwgc3RhdHVzPSIgKyBzdGF0dXMgKyAiLCBkZXNjPSIgKyBkZXNjICsgIiwgbW9kaWZpZXI9IiArIG1vZGlmaWVyCisJCQkJKyAiLCBlY29tcFVzZXI9IiArIGVjb21wVXNlciArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRGlzdHJpYnV0aW9uRGVwbG95RXZlbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRGlzdHJpYnV0aW9uRGVwbG95RXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWUzMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9EaXN0cmlidXRpb25EZXBsb3lFdmVudC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnV0aWxzLlVVSURzOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5DbHVzdGVyaW5nQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CisKK0BUYWJsZShrZXlzcGFjZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UsIG5hbWUgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9ERVBMT1lfRVZFTlRfVFlQRSkKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25EZXBsb3lFdmVudCBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50IHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVNUUklCVVRJT05fREVQTE9ZX0VWRU5UX1RFTVBMQVRFID0gImFjdGlvbj1cIiVzXCIgdGltZXN0YW1wPVwiJXNcIiAiCisJCQkrICJyZXNvdXJjZU5hbWU9XCIlc1wiIHJlc291cmNlVHlwZT1cIiVzXCIgY3VyclZlcnNpb249XCIlc1wiICIKKwkJCSsgIm1vZGlmaWVyTmFtZT1cIiVzXCIgbW9kaWZpZXJVaWQ9XCIlc1wiIGRpZD1cIiVzXCIgIiArICJzdGF0dXM9XCIlc1wiIGRlc2M9XCIlc1wiIjsKKworCUBQYXJ0aXRpb25LZXkKKwlwcm90ZWN0ZWQgVVVJRCB0aW1lYmFzZWR1dWlkOworCisJQENsdXN0ZXJpbmdDb2x1bW4KKwlwcm90ZWN0ZWQgRGF0ZSB0aW1lc3RhbXAxOworCisJQENvbHVtbihuYW1lID0gInJlcXVlc3RfaWQiKQorCXByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdElkOworCisJQENvbHVtbihuYW1lID0gInNlcnZpY2VfaW5zdGFuY2VfaWQiKQorCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZUluc3RhbmNlSWQ7CisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgYWN0aW9uOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIHN0YXR1czsKKworCUBDb2x1bW4obmFtZSA9ICJkZXNjcmlwdGlvbiIpCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjOworCisJQENvbHVtbihuYW1lID0gInJlc291cmNlX25hbWUiKQorCXByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKKworCUBDb2x1bW4obmFtZSA9ICJyZXNvdXJjZV90eXBlIikKKwlwcml2YXRlIFN0cmluZyByZXNvdXJjZVR5cGU7CisKKwlAQ29sdW1uKG5hbWUgPSAiY3Vycl92ZXJzaW9uIikKKwlwcml2YXRlIFN0cmluZyBjdXJyVmVyc2lvbjsKKworCUBDb2x1bW4KKwlwcml2YXRlIFN0cmluZyBtb2RpZmllcjsKKworCUBDb2x1bW4KKwlwcml2YXRlIFN0cmluZyBkaWQ7CisKKwlwdWJsaWMgRGlzdHJpYnV0aW9uRGVwbG95RXZlbnQoKSB7CisJCXN1cGVyKCk7CisJCXRpbWVzdGFtcDEgPSBuZXcgRGF0ZSgpOworCQl0aW1lYmFzZWR1dWlkID0gVVVJRHMudGltZUJhc2VkKCk7CisJfQorCisJcHVibGljIERpc3RyaWJ1dGlvbkRlcGxveUV2ZW50KEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQl0aGlzKCk7CisJCU9iamVjdCB2YWx1ZTsKKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlcXVlc3RJZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFNlcnZpY2VJbnN0YW5jZUlkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTik7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRBY3Rpb24oKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFN0YXR1cygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERlc2MoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERpZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0TW9kaWZpZXIoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9WRVJTSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEN1cnJWZXJzaW9uKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVzb3VyY2VOYW1lKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVzb3VyY2VUeXBlKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmlsbEZpZWxkcygpIHsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVxdWVzdElkKCkpOworCisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELmdldERpc3BsYXlOYW1lKCksIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEFjdGlvbigpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUy5nZXREaXNwbGF5TmFtZSgpLCBnZXRTdGF0dXMoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLmdldERpc3BsYXlOYW1lKCksIGdldERlc2MoKSk7CisKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXREaWQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0TW9kaWZpZXIoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0Q3VyclZlcnNpb24oKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLmdldERpc3BsYXlOYW1lKCksIGdldFJlc291cmNlTmFtZSgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVzb3VyY2VUeXBlKCkpOworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh0aW1lc3RhbXAxKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisJCXJldHVybiByZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VOYW1lKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKwkJdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDdXJyVmVyc2lvbigpIHsKKwkJcmV0dXJuIGN1cnJWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEN1cnJWZXJzaW9uKFN0cmluZyBjdXJyVmVyc2lvbikgeworCQl0aGlzLmN1cnJWZXJzaW9uID0gY3VyclZlcnNpb247CisJfQorCisJcHVibGljIFVVSUQgZ2V0VGltZWJhc2VkdXVpZCgpIHsKKwkJcmV0dXJuIHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZWJhc2VkdXVpZChVVUlEIHRpbWViYXNlZHV1aWQpIHsKKwkJdGhpcy50aW1lYmFzZWR1dWlkID0gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAxKCkgeworCQlyZXR1cm4gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAxKERhdGUgdGltZXN0YW1wMSkgeworCQl0aGlzLnRpbWVzdGFtcDEgPSB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdElkKCkgeworCQlyZXR1cm4gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RJZChTdHJpbmcgcmVxdWVzdElkKSB7CisJCXRoaXMucmVxdWVzdElkID0gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUluc3RhbmNlSWQoKSB7CisJCXJldHVybiBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW5zdGFuY2VJZChTdHJpbmcgc2VydmljZUluc3RhbmNlSWQpIHsKKwkJdGhpcy5zZXJ2aWNlSW5zdGFuY2VJZCA9IHNlcnZpY2VJbnN0YW5jZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXIoKSB7CisJCXJldHVybiBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIpIHsKKwkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGlkKCkgeworCQlyZXR1cm4gZGlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpZChTdHJpbmcgZGlkKSB7CisJCXRoaXMuZGlkID0gZGlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRGlzdHJpYnV0aW9uRGVwbG95RXZlbnQgW3RpbWViYXNlZHV1aWQ9IiArIHRpbWViYXNlZHV1aWQgKyAiLCB0aW1lc3RhbXAxPSIgKyB0aW1lc3RhbXAxICsgIiwgcmVxdWVzdElkPSIKKwkJCQkrIHJlcXVlc3RJZCArICIsIHNlcnZpY2VJbnN0YW5jZUlkPSIgKyBzZXJ2aWNlSW5zdGFuY2VJZCArICIsIGFjdGlvbj0iICsgYWN0aW9uICsgIiwgc3RhdHVzPSIgKyBzdGF0dXMKKwkJCQkrICIsIGRlc2M9IiArIGRlc2MgKyAiLCByZXNvdXJjZU5hbWU9IiArIHJlc291cmNlTmFtZSArICIsIHJlc291cmNlVHlwZT0iICsgcmVzb3VyY2VUeXBlCisJCQkJKyAiLCBjdXJyVmVyc2lvbj0iICsgY3VyclZlcnNpb24gKyAiLCBtb2RpZmllcj0iICsgbW9kaWZpZXIgKyAiLCBkaWQ9IiArIGRpZCArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRGlzdHJpYnV0aW9uRG93bmxvYWRFdmVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9EaXN0cmlidXRpb25Eb3dubG9hZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5ZmMwMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRGlzdHJpYnV0aW9uRG93bmxvYWRFdmVudC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnV0aWxzLlVVSURzOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5DbHVzdGVyaW5nQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CisKK0BUYWJsZShrZXlzcGFjZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UsIG5hbWUgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9ET1dOTE9BRF9FVkVOVF9UWVBFKQorcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvbkRvd25sb2FkRXZlbnQgZXh0ZW5kcyBBdWRpdGluZ0dlbmVyaWNFdmVudCB7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRElTVFJJQlVUSU9OX0RPV05MT0FEX0VWRU5UX1RFTVBMQVRFID0gImFjdGlvbj1cIiVzXCIgdGltZXN0YW1wPVwiJXNcIiAiCisJCQkrICJjb25zdW1lcklkPVwiJXNcIiByZXNvdXJjZVVybD1cIiVzXCIgc3RhdHVzPVwiJXNcIiBkZXNjPVwiJXNcIiI7CisKKwlAUGFydGl0aW9uS2V5CisJcHJvdGVjdGVkIFVVSUQgdGltZWJhc2VkdXVpZDsKKworCUBDbHVzdGVyaW5nQ29sdW1uCisJcHJvdGVjdGVkIERhdGUgdGltZXN0YW1wMTsKKworCUBDb2x1bW4obmFtZSA9ICJyZXF1ZXN0X2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RJZDsKKworCUBDb2x1bW4obmFtZSA9ICJzZXJ2aWNlX2luc3RhbmNlX2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkOworCisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgYWN0aW9uOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIHN0YXR1czsKKworCUBDb2x1bW4obmFtZSA9ICJkZXNjcmlwdGlvbiIpCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjOworCisJQENvbHVtbihuYW1lID0gImNvbnN1bWVyX2lkIikKKwlwcml2YXRlIFN0cmluZyBjb25zdW1lcklkOworCisJQENvbHVtbihuYW1lID0gInJlc291cmNlX3VybCIpCisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VVcmw7CisKKwlwdWJsaWMgRGlzdHJpYnV0aW9uRG93bmxvYWRFdmVudCgpIHsKKwkJc3VwZXIoKTsKKworCQl0aW1lc3RhbXAxID0gbmV3IERhdGUoKTsKKwkJdGltZWJhc2VkdXVpZCA9IFVVSURzLnRpbWVCYXNlZCgpOworCX0KKworCXB1YmxpYyBEaXN0cmlidXRpb25Eb3dubG9hZEV2ZW50KEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQl0aGlzKCk7CisJCU9iamVjdCB2YWx1ZTsKKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlcXVlc3RJZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFNlcnZpY2VJbnN0YW5jZUlkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTik7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRBY3Rpb24oKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFN0YXR1cygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERlc2MoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldENvbnN1bWVySWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSZXNvdXJjZVVybCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGxGaWVsZHMoKSB7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELmdldERpc3BsYXlOYW1lKCksIGdldFJlcXVlc3RJZCgpKTsKKworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTi5nZXREaXNwbGF5TmFtZSgpLCBnZXRBY3Rpb24oKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U3RhdHVzKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQy5nZXREaXNwbGF5TmFtZSgpLCBnZXREZXNjKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELmdldERpc3BsYXlOYW1lKCksIGdldENvbnN1bWVySWQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUkVTT1VSQ0VfVVJMLmdldERpc3BsYXlOYW1lKCksIGdldFJlc291cmNlVXJsKCkpOworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh0aW1lc3RhbXAxKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb25zdW1lcklkKCkgeworCQlyZXR1cm4gY29uc3VtZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25zdW1lcklkKFN0cmluZyBjb25zdW1lcklkKSB7CisJCXRoaXMuY29uc3VtZXJJZCA9IGNvbnN1bWVySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVybCgpIHsKKwkJcmV0dXJuIHJlc291cmNlVXJsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVXJsKFN0cmluZyByZXNvdXJjZVVybCkgeworCQl0aGlzLnJlc291cmNlVXJsID0gcmVzb3VyY2VVcmw7CisJfQorCisJcHVibGljIFVVSUQgZ2V0VGltZWJhc2VkdXVpZCgpIHsKKwkJcmV0dXJuIHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZWJhc2VkdXVpZChVVUlEIHRpbWViYXNlZHV1aWQpIHsKKwkJdGhpcy50aW1lYmFzZWR1dWlkID0gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAxKCkgeworCQlyZXR1cm4gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAxKERhdGUgdGltZXN0YW1wMSkgeworCQl0aGlzLnRpbWVzdGFtcDEgPSB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdElkKCkgeworCQlyZXR1cm4gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RJZChTdHJpbmcgcmVxdWVzdElkKSB7CisJCXRoaXMucmVxdWVzdElkID0gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUluc3RhbmNlSWQoKSB7CisJCXJldHVybiBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW5zdGFuY2VJZChTdHJpbmcgc2VydmljZUluc3RhbmNlSWQpIHsKKwkJdGhpcy5zZXJ2aWNlSW5zdGFuY2VJZCA9IHNlcnZpY2VJbnN0YW5jZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRGlzdHJpYnV0aW9uRG93bmxvYWRFdmVudCBbdGltZWJhc2VkdXVpZD0iICsgdGltZWJhc2VkdXVpZCArICIsIHRpbWVzdGFtcDE9IiArIHRpbWVzdGFtcDEKKwkJCQkrICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgc2VydmljZUluc3RhbmNlSWQ9IiArIHNlcnZpY2VJbnN0YW5jZUlkICsgIiwgYWN0aW9uPSIgKyBhY3Rpb24KKwkJCQkrICIsIHN0YXR1cz0iICsgc3RhdHVzICsgIiwgZGVzYz0iICsgZGVzYyArICIsIGNvbnN1bWVySWQ9IiArIGNvbnN1bWVySWQgKyAiLCByZXNvdXJjZVVybD0iCisJCQkJKyByZXNvdXJjZVVybCArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRGlzdHJpYnV0aW9uRW5naW5lRXZlbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRGlzdHJpYnV0aW9uRW5naW5lRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTI1ZTdhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9EaXN0cmlidXRpb25FbmdpbmVFdmVudC5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnV0aWxzLlVVSURzOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5DbHVzdGVyaW5nQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CisKK0BUYWJsZShrZXlzcGFjZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UsIG5hbWUgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkRJU1RSSUJVVElPTl9FTkdJTkVfRVZFTlRfVFlQRSkKK3B1YmxpYyBjbGFzcyBEaXN0cmlidXRpb25FbmdpbmVFdmVudCBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50IHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVNUUklCVVRJT05fRU5HSU5FX0VWRU5UX1RFTVBMQVRFID0gImFjdGlvbj1cIiVzXCIgdGltZXN0YW1wPVwiJXNcIiAiCisJCQkrICJlbnZpcm9ubWVudE5hbWU9XCIlc1wiIHRvcGljTmFtZT1cIiVzXCIgcm9sZT1cIiVzXCIgYXBpS2V5PVwiJXNcIiAiICsgInN0YXR1cz1cIiVzXCIgIjsKKworCUBQYXJ0aXRpb25LZXkKKwlwcm90ZWN0ZWQgVVVJRCB0aW1lYmFzZWR1dWlkOworCisJQENsdXN0ZXJpbmdDb2x1bW4KKwlwcm90ZWN0ZWQgRGF0ZSB0aW1lc3RhbXAxOworCisJQENvbHVtbihuYW1lID0gInJlcXVlc3RfaWQiKQorCXByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdElkOworCisJQENvbHVtbihuYW1lID0gInNlcnZpY2VfaW5zdGFuY2VfaWQiKQorCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZUluc3RhbmNlSWQ7CisKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBhY3Rpb247CisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgc3RhdHVzOworCisJQENvbHVtbihuYW1lID0gImRlc2NyaXB0aW9uIikKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2M7CisKKwlAQ29sdW1uKG5hbWUgPSAiY29uc3VtZXJfaWQiKQorCXByaXZhdGUgU3RyaW5nIGNvbnN1bWVySWQ7CisKKwlAQ29sdW1uKG5hbWUgPSAiRFNUQVRVU19UT1BJQyIpCisJcHJpdmF0ZSBTdHJpbmcgZHN0YXR1c1RvcGljOworCisJQENvbHVtbihuYW1lID0gIkROT1RJRl9UT1BJQyIpCisJcHJpdmF0ZSBTdHJpbmcgZG5vdGlmVG9waWM7CisKKwlAQ29sdW1uKG5hbWUgPSAiZF9lbnYiKQorCXByaXZhdGUgU3RyaW5nIGVudmlyb25tZW50TmFtZTsKKworCUBDb2x1bW4KKwlwcml2YXRlIFN0cmluZyByb2xlOworCisJQENvbHVtbihuYW1lID0gImFwaV9rZXkiKQorCXByaXZhdGUgU3RyaW5nIGFwaUtleTsKKworCXB1YmxpYyBEaXN0cmlidXRpb25FbmdpbmVFdmVudCgpIHsKKwkJc3VwZXIoKTsKKwkJdGltZXN0YW1wMSA9IG5ldyBEYXRlKCk7CisJCXRpbWViYXNlZHV1aWQgPSBVVUlEcy50aW1lQmFzZWQoKTsKKwl9CisKKwlwdWJsaWMgRGlzdHJpYnV0aW9uRW5naW5lRXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCXRoaXMoKTsKKwkJT2JqZWN0IHZhbHVlOworCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVxdWVzdElkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U2VydmljZUluc3RhbmNlSWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFjdGlvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGVzYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfREVTQyk7CisJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCXNldERlc2MoKFN0cmluZykgdmFsdWUpOworCQkJfQorCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldENvbnN1bWVySWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1NUQVRVU19UT1BJQ19OQU1FKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERzdGF0dXNUb3BpYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fTk9USUZJQ0FUSU9OX1RPUElDX05BTUUpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RG5vdGlmVG9waWMoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0FQSV9LRVkpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0QXBpS2V5KChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9FTlZSSU9OTUVOVF9OQU1FKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEVudmlyb25tZW50TmFtZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUk9MRSk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSb2xlKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGxGaWVsZHMoKSB7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELmdldERpc3BsYXlOYW1lKCksIGdldFJlcXVlc3RJZCgpKTsKKworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTi5nZXREaXNwbGF5TmFtZSgpLCBnZXRBY3Rpb24oKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U3RhdHVzKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQy5nZXREaXNwbGF5TmFtZSgpLCBnZXREZXNjKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lELmdldERpc3BsYXlOYW1lKCksIGdldENvbnN1bWVySWQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQVBJX0tFWS5nZXREaXNwbGF5TmFtZSgpLCBnZXRBcGlLZXkoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fRU5WUklPTk1FTlRfTkFNRS5nZXREaXNwbGF5TmFtZSgpLCBnZXRFbnZpcm9ubWVudE5hbWUoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUk9MRS5nZXREaXNwbGF5TmFtZSgpLCBnZXRSb2xlKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1NUQVRVU19UT1BJQ19OQU1FLmdldERpc3BsYXlOYW1lKCksIGdldERzdGF0dXNUb3BpYygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9OT1RJRklDQVRJT05fVE9QSUNfTkFNRS5nZXREaXNwbGF5TmFtZSgpLAorCQkJCWdldERub3RpZlRvcGljKCkpOworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh0aW1lc3RhbXAxKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREc3RhdHVzVG9waWMoKSB7CisJCXJldHVybiBkc3RhdHVzVG9waWM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RHN0YXR1c1RvcGljKFN0cmluZyBkc3RhdHVzVG9waWMpIHsKKwkJdGhpcy5kc3RhdHVzVG9waWMgPSBkc3RhdHVzVG9waWM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREbm90aWZUb3BpYygpIHsKKwkJcmV0dXJuIGRub3RpZlRvcGljOworCX0KKworCXB1YmxpYyB2b2lkIHNldERub3RpZlRvcGljKFN0cmluZyBkbm90aWZUb3BpYykgeworCQl0aGlzLmRub3RpZlRvcGljID0gZG5vdGlmVG9waWM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFbnZpcm9ubWVudE5hbWUoKSB7CisJCXJldHVybiBlbnZpcm9ubWVudE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnROYW1lKFN0cmluZyBlbnZpcm9ubWVudE5hbWUpIHsKKwkJdGhpcy5lbnZpcm9ubWVudE5hbWUgPSBlbnZpcm9ubWVudE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSb2xlKCkgeworCQlyZXR1cm4gcm9sZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKSB7CisJCXRoaXMucm9sZSA9IHJvbGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcGlLZXkoKSB7CisJCXJldHVybiBhcGlLZXk7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXBpS2V5KFN0cmluZyBhcGlLZXkpIHsKKwkJdGhpcy5hcGlLZXkgPSBhcGlLZXk7CisJfQorCisJcHVibGljIFVVSUQgZ2V0VGltZWJhc2VkdXVpZCgpIHsKKwkJcmV0dXJuIHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZWJhc2VkdXVpZChVVUlEIHRpbWViYXNlZHV1aWQpIHsKKwkJdGhpcy50aW1lYmFzZWR1dWlkID0gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAxKCkgeworCQlyZXR1cm4gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAxKERhdGUgdGltZXN0YW1wMSkgeworCQl0aGlzLnRpbWVzdGFtcDEgPSB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdElkKCkgeworCQlyZXR1cm4gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RJZChTdHJpbmcgcmVxdWVzdElkKSB7CisJCXRoaXMucmVxdWVzdElkID0gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUluc3RhbmNlSWQoKSB7CisJCXJldHVybiBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW5zdGFuY2VJZChTdHJpbmcgc2VydmljZUluc3RhbmNlSWQpIHsKKwkJdGhpcy5zZXJ2aWNlSW5zdGFuY2VJZCA9IHNlcnZpY2VJbnN0YW5jZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJJZCgpIHsKKwkJcmV0dXJuIGNvbnN1bWVySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29uc3VtZXJJZChTdHJpbmcgY29uc3VtZXJJZCkgeworCQl0aGlzLmNvbnN1bWVySWQgPSBjb25zdW1lcklkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRGlzdHJpYnV0aW9uRW5naW5lRXZlbnQgW3RpbWViYXNlZHV1aWQ9IiArIHRpbWViYXNlZHV1aWQgKyAiLCB0aW1lc3RhbXAxPSIgKyB0aW1lc3RhbXAxICsgIiwgcmVxdWVzdElkPSIKKwkJCQkrIHJlcXVlc3RJZCArICIsIHNlcnZpY2VJbnN0YW5jZUlkPSIgKyBzZXJ2aWNlSW5zdGFuY2VJZCArICIsIGFjdGlvbj0iICsgYWN0aW9uICsgIiwgc3RhdHVzPSIgKyBzdGF0dXMKKwkJCQkrICIsIGRlc2M9IiArIGRlc2MgKyAiLCBjb25zdW1lcklkPSIgKyBjb25zdW1lcklkICsgIiwgZHN0YXR1c1RvcGljPSIgKyBkc3RhdHVzVG9waWMgKyAiLCBkbm90aWZUb3BpYz0iCisJCQkJKyBkbm90aWZUb3BpYyArICIsIGVudmlyb25tZW50TmFtZT0iICsgZW52aXJvbm1lbnROYW1lICsgIiwgcm9sZT0iICsgcm9sZSArICIsIGFwaUtleT0iICsgYXBpS2V5ICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9EaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9EaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjBmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0Rpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50LmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZzsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUudXRpbHMuVVVJRHM7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNsdXN0ZXJpbmdDb2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUGFydGl0aW9uS2V5OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5UYWJsZTsKKworQFRhYmxlKGtleXNwYWNlID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRSwgbmFtZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRElTVFJJQlVUSU9OX05PVElGSUNBVElPTl9FVkVOVF9UWVBFKQorcHVibGljIGNsYXNzIERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERJU1RSSUJVVElPTl9OT1RJRklDQVRJT05fRVZFTlRfVEVNUExBVEUgPSAiYWN0aW9uPVwiJXNcIiB0aW1lc3RhbXA9XCIlc1wiICIKKwkJCSsgInJlc291cmNlTmFtZT1cIiVzXCIgcmVzb3VyY2VUeXBlPVwiJXNcIiBjdXJyVmVyc2lvbj1cIiVzXCIgIiArICJtb2RpZmllck5hbWU9XCIlc1wiIG1vZGlmaWVyVWlkPVwiJXNcIiAiCisJCQkrICJjdXJyU3RhdGU9XCIlc1wiIGRpc3RyaWJ1dGlvbklkPVwiJXNcIiAiICsgInRvcGljTmFtZT1cIiVzXCIgc3RhdHVzPVwiJXNcIiBkZXNjcmlwdGlvbj1cIiVzXCIiOworCisJQFBhcnRpdGlvbktleQorCXByb3RlY3RlZCBVVUlEIHRpbWViYXNlZHV1aWQ7CisKKwlAQ2x1c3RlcmluZ0NvbHVtbgorCXByb3RlY3RlZCBEYXRlIHRpbWVzdGFtcDE7CisKKwlAQ29sdW1uKG5hbWUgPSAicmVxdWVzdF9pZCIpCisJcHJvdGVjdGVkIFN0cmluZyByZXF1ZXN0SWQ7CisKKwlAQ29sdW1uKG5hbWUgPSAic2VydmljZV9pbnN0YW5jZV9pZCIpCisJcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZDsKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBhY3Rpb247CisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgc3RhdHVzOworCisJQENvbHVtbihuYW1lID0gImRlc2NyaXB0aW9uIikKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2M7CisKKwlAQ29sdW1uKG5hbWUgPSAicmVzb3VyY2VfbmFtZSIpCisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VOYW1lOworCisJQENvbHVtbihuYW1lID0gInJlc291cmNlX3R5cGUiKQorCXByaXZhdGUgU3RyaW5nIHJlc291cmNlVHlwZTsKKworCUBDb2x1bW4obmFtZSA9ICJjdXJyX3ZlcnNpb24iKQorCXByaXZhdGUgU3RyaW5nIGN1cnJWZXJzaW9uOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIG1vZGlmaWVyOworCisJQENvbHVtbihuYW1lID0gImN1cnJfc3RhdGUiKQorCXByaXZhdGUgU3RyaW5nIGN1cnJTdGF0ZTsKKworCUBDb2x1bW4obmFtZSA9ICJ0b3BpY19uYW1lIikKKwlwcml2YXRlIFN0cmluZyB0b3BpY05hbWU7CisKKwlAQ29sdW1uCisJcHJpdmF0ZSBTdHJpbmcgZGlkOworCisJcHVibGljIERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50KCkgeworCQlzdXBlcigpOworCQl0aW1lc3RhbXAxID0gbmV3IERhdGUoKTsKKwkJdGltZWJhc2VkdXVpZCA9IFVVSURzLnRpbWVCYXNlZCgpOworCX0KKworCXB1YmxpYyBEaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudChFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKwkJdGhpcygpOworCQlPYmplY3QgdmFsdWU7CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSZXF1ZXN0SWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRTZXJ2aWNlSW5zdGFuY2VJZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0QWN0aW9uKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUyk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRTdGF0dXMoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQyk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXREZXNjKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXREaWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldE1vZGlmaWVyKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0Q3VyclN0YXRlKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTik7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRDdXJyVmVyc2lvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlc291cmNlTmFtZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlc291cmNlVHlwZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fVE9QSUNfTkFNRSk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRUb3BpY05hbWUoKFN0cmluZykgdmFsdWUpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsRmllbGRzKCkgeworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRSZXF1ZXN0SWQoKSk7CisKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U2VydmljZUluc3RhbmNlSWQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0QWN0aW9uKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLmdldERpc3BsYXlOYW1lKCksIGdldFN0YXR1cygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0RGVzYygpKTsKKworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0lELmdldERpc3BsYXlOYW1lKCksIGdldERpZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRNb2RpZmllcigpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0Q3VyclN0YXRlKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9WRVJTSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEN1cnJWZXJzaW9uKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfTkFNRS5nZXREaXNwbGF5TmFtZSgpLCBnZXRSZXNvdXJjZU5hbWUoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLmdldERpc3BsYXlOYW1lKCksIGdldFJlc291cmNlVHlwZSgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9UT1BJQ19OQU1FLmdldERpc3BsYXlOYW1lKCksIGdldFRvcGljTmFtZSgpKTsKKwkJU2ltcGxlRGF0ZUZvcm1hdCBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZGF0ZUZvcm1hdFBhdHRlcm4pOworCQlzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAuZ2V0RGlzcGxheU5hbWUoKSwgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQodGltZXN0YW1wMSkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCXRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgcmVzb3VyY2VUeXBlKSB7CisJCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3VyclZlcnNpb24oKSB7CisJCXJldHVybiBjdXJyVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXJyVmVyc2lvbihTdHJpbmcgY3VyclZlcnNpb24pIHsKKwkJdGhpcy5jdXJyVmVyc2lvbiA9IGN1cnJWZXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3VyclN0YXRlKCkgeworCQlyZXR1cm4gY3VyclN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEN1cnJTdGF0ZShTdHJpbmcgY3VyclN0YXRlKSB7CisJCXRoaXMuY3VyclN0YXRlID0gY3VyclN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VG9waWNOYW1lKCkgeworCQlyZXR1cm4gdG9waWNOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvcGljTmFtZShTdHJpbmcgdG9waWNOYW1lKSB7CisJCXRoaXMudG9waWNOYW1lID0gdG9waWNOYW1lOworCX0KKworCXB1YmxpYyBVVUlEIGdldFRpbWViYXNlZHV1aWQoKSB7CisJCXJldHVybiB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWViYXNlZHV1aWQoVVVJRCB0aW1lYmFzZWR1dWlkKSB7CisJCXRoaXMudGltZWJhc2VkdXVpZCA9IHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIERhdGUgZ2V0VGltZXN0YW1wMSgpIHsKKwkJcmV0dXJuIHRpbWVzdGFtcDE7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wMShEYXRlIHRpbWVzdGFtcDEpIHsKKwkJdGhpcy50aW1lc3RhbXAxID0gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RJZCgpIHsKKwkJcmV0dXJuIHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0SWQoU3RyaW5nIHJlcXVlc3RJZCkgeworCQl0aGlzLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkgeworCQlyZXR1cm4gc2VydmljZUluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZUluc3RhbmNlSWQoU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkKSB7CisJCXRoaXMuc2VydmljZUluc3RhbmNlSWQgPSBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyKCkgeworCQlyZXR1cm4gbW9kaWZpZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyKSB7CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpZCgpIHsKKwkJcmV0dXJuIGRpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaWQoU3RyaW5nIGRpZCkgeworCQl0aGlzLmRpZCA9IGRpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkRpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50IFt0aW1lYmFzZWR1dWlkPSIgKyB0aW1lYmFzZWR1dWlkICsgIiwgdGltZXN0YW1wMT0iICsgdGltZXN0YW1wMQorCQkJCSsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBzZXJ2aWNlSW5zdGFuY2VJZD0iICsgc2VydmljZUluc3RhbmNlSWQgKyAiLCBhY3Rpb249IiArIGFjdGlvbgorCQkJCSsgIiwgc3RhdHVzPSIgKyBzdGF0dXMgKyAiLCBkZXNjPSIgKyBkZXNjICsgIiwgcmVzb3VyY2VOYW1lPSIgKyByZXNvdXJjZU5hbWUgKyAiLCByZXNvdXJjZVR5cGU9IgorCQkJCSsgcmVzb3VyY2VUeXBlICsgIiwgY3VyclZlcnNpb249IiArIGN1cnJWZXJzaW9uICsgIiwgbW9kaWZpZXI9IiArIG1vZGlmaWVyICsgIiwgY3VyclN0YXRlPSIgKyBjdXJyU3RhdGUKKwkJCQkrICIsIHRvcGljTmFtZT0iICsgdG9waWNOYW1lICsgIiwgZGlkPSIgKyBkaWQgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0Rpc3RyaWJ1dGlvblN0YXR1c0V2ZW50LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0Rpc3RyaWJ1dGlvblN0YXR1c0V2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2NWI4MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS51dGlscy5VVUlEczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ2x1c3RlcmluZ0NvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5QYXJ0aXRpb25LZXk7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlRhYmxlOworCitAVGFibGUoa2V5c3BhY2UgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFLCBuYW1lID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5ESVNUUklCVVRJT05fU1RBVFVTX0VWRU5UX1RZUEUpCitwdWJsaWMgY2xhc3MgRGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQgZXh0ZW5kcyBBdWRpdGluZ0dlbmVyaWNFdmVudCB7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRElTVFJJQlVUSU9OX1NUQVRVU19OT1RJRklDQVRJT05fRVZFTlRfVEVNUExBVEUgPSAiYWN0aW9uPVwiJXNcIiB0aW1lc3RhbXA9XCIlc1wiICIKKwkJCSsgImRpZD1cIiVzXCIgY29uc3VtZXJJZD1cIiVzXCIgdG9waWNOYW1lPVwiJXNcIiByZXNvdXJlVVJMPVwiJXNcIiBzdGF0dXNUaW1lPVwiJXNcIiBzdGF0dXM9XCIlc1wiICI7CisKKwlAUGFydGl0aW9uS2V5CisJcHJvdGVjdGVkIFVVSUQgdGltZWJhc2VkdXVpZDsKKworCUBDbHVzdGVyaW5nQ29sdW1uCisJcHJvdGVjdGVkIERhdGUgdGltZXN0YW1wMTsKKworCUBDb2x1bW4obmFtZSA9ICJyZXF1ZXN0X2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RJZDsKKworCUBDb2x1bW4obmFtZSA9ICJzZXJ2aWNlX2luc3RhbmNlX2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkOworCisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgYWN0aW9uOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIHN0YXR1czsKKworCUBDb2x1bW4obmFtZSA9ICJkZXNjcmlwdGlvbiIpCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIGRpZDsKKworCUBDb2x1bW4obmFtZSA9ICJjb25zdW1lcl9pZCIpCisJcHJpdmF0ZSBTdHJpbmcgY29uc3VtZXJJZDsKKworCUBDb2x1bW4obmFtZSA9ICJ0b3BpY19uYW1lIikKKwlwcml2YXRlIFN0cmluZyB0b3BpY05hbWU7CisKKwlAQ29sdW1uKG5hbWUgPSAicmVzb3VyZV91cmwiKQorCXByaXZhdGUgU3RyaW5nIHJlc291cmVVUkw7CisKKwlAQ29sdW1uKG5hbWUgPSAic3RhdHVzX3RpbWUiKQorCXByaXZhdGUgU3RyaW5nIHN0YXR1c1RpbWU7CisKKwlwdWJsaWMgRGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQoKSB7CisJCXN1cGVyKCk7CisJCXRpbWVzdGFtcDEgPSBuZXcgRGF0ZSgpOworCQl0aW1lYmFzZWR1dWlkID0gVVVJRHMudGltZUJhc2VkKCk7CisKKwl9CisKKwlwdWJsaWMgRGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCXRoaXMoKTsKKwkJT2JqZWN0IHZhbHVlOworCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVxdWVzdElkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U2VydmljZUluc3RhbmNlSWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFjdGlvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGVzYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGlkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRDb25zdW1lcklkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9UT1BJQ19OQU1FKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFRvcGljTmFtZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fUkVTT1VSQ0VfVVJMKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlc291cmVVUkwoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1NUQVRVU19USU1FKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFN0YXR1c1RpbWUoKFN0cmluZykgdmFsdWUpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmlsbEZpZWxkcygpIHsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVxdWVzdElkKCkpOworCisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELmdldERpc3BsYXlOYW1lKCksIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEFjdGlvbigpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUy5nZXREaXNwbGF5TmFtZSgpLCBnZXRTdGF0dXMoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLmdldERpc3BsYXlOYW1lKCksIGdldERlc2MoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0Q29uc3VtZXJJZCgpKTsKKworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0lELmdldERpc3BsYXlOYW1lKCksIGdldERpZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9TVEFUVVNfVElNRS5nZXREaXNwbGF5TmFtZSgpLCBnZXRTdGF0dXNUaW1lKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1RPUElDX05BTUUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0VG9waWNOYW1lKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTC5nZXREaXNwbGF5TmFtZSgpLCBnZXRSZXNvdXJlVVJMKCkpOworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh0aW1lc3RhbXAxKSk7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpZCgpIHsKKwkJcmV0dXJuIGRpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaWQoU3RyaW5nIGRpZCkgeworCQl0aGlzLmRpZCA9IGRpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVySWQoKSB7CisJCXJldHVybiBjb25zdW1lcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVySWQoU3RyaW5nIGNvbnN1bWVySWQpIHsKKwkJdGhpcy5jb25zdW1lcklkID0gY29uc3VtZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRvcGljTmFtZSgpIHsKKwkJcmV0dXJuIHRvcGljTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3BpY05hbWUoU3RyaW5nIHRvcGljTmFtZSkgeworCQl0aGlzLnRvcGljTmFtZSA9IHRvcGljTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmVVUkwoKSB7CisJCXJldHVybiByZXNvdXJlVVJMOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmVVUkwoU3RyaW5nIHJlc291cmVVUkwpIHsKKwkJdGhpcy5yZXNvdXJlVVJMID0gcmVzb3VyZVVSTDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RJZCgpIHsKKwkJcmV0dXJuIHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0SWQoU3RyaW5nIHJlcXVlc3RJZCkgeworCQl0aGlzLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkgeworCQlyZXR1cm4gc2VydmljZUluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZUluc3RhbmNlSWQoU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkKSB7CisJCXRoaXMuc2VydmljZUluc3RhbmNlSWQgPSBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgVVVJRCBnZXRUaW1lYmFzZWR1dWlkKCkgeworCQlyZXR1cm4gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lYmFzZWR1dWlkKFVVSUQgdGltZWJhc2VkdXVpZCkgeworCQl0aGlzLnRpbWViYXNlZHV1aWQgPSB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcDEoKSB7CisJCXJldHVybiB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcDEoRGF0ZSB0aW1lc3RhbXApIHsKKwkJdGhpcy50aW1lc3RhbXAxID0gdGltZXN0YW1wOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzVGltZSgpIHsKKwkJcmV0dXJuIHN0YXR1c1RpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzVGltZShTdHJpbmcgc3RhdHVzVGltZSkgeworCQl0aGlzLnN0YXR1c1RpbWUgPSBzdGF0dXNUaW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQgW3RpbWViYXNlZHV1aWQ9IiArIHRpbWViYXNlZHV1aWQgKyAiLCB0aW1lc3RhbXAxPSIgKyB0aW1lc3RhbXAxICsgIiwgcmVxdWVzdElkPSIKKwkJCQkrIHJlcXVlc3RJZCArICIsIHNlcnZpY2VJbnN0YW5jZUlkPSIgKyBzZXJ2aWNlSW5zdGFuY2VJZCArICIsIGFjdGlvbj0iICsgYWN0aW9uICsgIiwgc3RhdHVzPSIgKyBzdGF0dXMKKwkJCQkrICIsIGRlc2M9IiArIGRlc2MgKyAiLCBkaWQ9IiArIGRpZCArICIsIGNvbnN1bWVySWQ9IiArIGNvbnN1bWVySWQgKyAiLCB0b3BpY05hbWU9IiArIHRvcGljTmFtZQorCQkJCSsgIiwgcmVzb3VyZVVSTD0iICsgcmVzb3VyZVVSTCArICIsIHN0YXR1c1RpbWU9IiArIHN0YXR1c1RpbWUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0V4dGVybmFsQXBpRXZlbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvRXh0ZXJuYWxBcGlFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2M1N2M1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9FeHRlcm5hbEFwaUV2ZW50LmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5hdWRpdGluZzsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUudXRpbHMuVVVJRHM7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNsdXN0ZXJpbmdDb2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLkNvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuUGFydGl0aW9uS2V5OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5UYWJsZTsKKworQFRhYmxlKGtleXNwYWNlID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5BVURJVF9LRVlTUEFDRSwgbmFtZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuRVhURVJOQUxfQVBJX0VWRU5UX1RZUEUpCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxBcGlFdmVudCBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50IHsKKwlAUGFydGl0aW9uS2V5CisJcHJvdGVjdGVkIFVVSUQgdGltZWJhc2VkdXVpZDsKKworCUBDbHVzdGVyaW5nQ29sdW1uKCkKKwlwcm90ZWN0ZWQgRGF0ZSB0aW1lc3RhbXAxOworCisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgYWN0aW9uOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIHN0YXR1czsKKworCUBDb2x1bW4obmFtZSA9ICJkZXNjcmlwdGlvbiIpCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjOworCisJQENvbHVtbihuYW1lID0gImNvbnN1bWVyX2lkIikKKwlwcml2YXRlIFN0cmluZyBjb25zdW1lcklkOworCisJQENvbHVtbihuYW1lID0gInJlc291cmNlX3VybCIpCisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VVUkw7CisKKwlAQ29sdW1uKG5hbWUgPSAicmVzb3VyY2VfbmFtZSIpCisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VOYW1lOworCisJQENvbHVtbihuYW1lID0gInJlc291cmNlX3R5cGUiKQorCXByaXZhdGUgU3RyaW5nIHJlc291cmNlVHlwZTsKKworCUBDb2x1bW4obmFtZSA9ICJzZXJ2aWNlX2luc3RhbmNlX2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkOworCisJQENvbHVtbihuYW1lID0gIm1vZGlmaWVyIikKKwlwcml2YXRlIFN0cmluZyBtb2RpZmllcjsKKworCUBDb2x1bW4obmFtZSA9ICJwcmV2X2FydGlmYWN0X3V1aWQiKQorCXByaXZhdGUgU3RyaW5nIHByZXZBcnRpZmFjdFV1aWQ7CisKKwlAQ29sdW1uKG5hbWUgPSAiY3Vycl9hcnRpZmFjdF91dWlkIikKKwlwcml2YXRlIFN0cmluZyBjdXJyQXJ0aWZhY3RVdWlkOworCisJQENvbHVtbihuYW1lID0gImFydGlmYWN0X2RhdGEiKQorCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0RGF0YTsKKworCXB1YmxpYyBFeHRlcm5hbEFwaUV2ZW50KCkgeworCQlzdXBlcigpOworCQl0aW1lc3RhbXAxID0gbmV3IERhdGUoKTsKKwkJdGltZWJhc2VkdXVpZCA9IFVVSURzLnRpbWVCYXNlZCgpOworCX0KKworCXB1YmxpYyBFeHRlcm5hbEFwaUV2ZW50KEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQl0aGlzKCk7CisJCU9iamVjdCB2YWx1ZTsKKworCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTik7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRBY3Rpb24oKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFN0YXR1cygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERlc2MoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0NPTlNVTUVSX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldENvbnN1bWVySWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSZXNvdXJjZVVSTCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlc291cmNlTmFtZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlc291cmNlVHlwZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFNlcnZpY2VJbnN0YW5jZUlkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRNb2RpZmllcigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9QUkVWX0FSVElGQUNUX1VVSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UHJldkFydGlmYWN0VXVpZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DVVJSX0FSVElGQUNUX1VVSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0Q3VyckFydGlmYWN0VXVpZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BUlRJRkFDVF9EQVRBKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFydGlmYWN0RGF0YSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsRmllbGRzKCkgeworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTi5nZXREaXNwbGF5TmFtZSgpLCBnZXRBY3Rpb24oKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U3RhdHVzKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQy5nZXREaXNwbGF5TmFtZSgpLCBnZXREZXNjKCkpOworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh0aW1lc3RhbXAxKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0Q29uc3VtZXJJZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9SRVNPVVJDRV9VUkwuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVzb3VyY2VVUkwoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9OQU1FLmdldERpc3BsYXlOYW1lKCksIGdldFJlc291cmNlTmFtZSgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1RZUEUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVzb3VyY2VUeXBlKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELmdldERpc3BsYXlOYW1lKCksIGdldE1vZGlmaWVyKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUFJFVl9BUlRJRkFDVF9VVUlELmdldERpc3BsYXlOYW1lKCksIGdldFByZXZBcnRpZmFjdFV1aWQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DVVJSX0FSVElGQUNUX1VVSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0Q3VyckFydGlmYWN0VXVpZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FSVElGQUNUX0RBVEEuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0QXJ0aWZhY3REYXRhKCkpOworCX0KKworCXB1YmxpYyBVVUlEIGdldFRpbWViYXNlZHV1aWQoKSB7CisJCXJldHVybiB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWViYXNlZHV1aWQoVVVJRCB0aW1lYmFzZWR1dWlkKSB7CisJCXRoaXMudGltZWJhc2VkdXVpZCA9IHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIERhdGUgZ2V0VGltZXN0YW1wMSgpIHsKKwkJcmV0dXJuIHRpbWVzdGFtcDE7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wMShEYXRlIHRpbWVzdGFtcDEpIHsKKwkJdGhpcy50aW1lc3RhbXAxID0gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVySWQoKSB7CisJCXJldHVybiBjb25zdW1lcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVySWQoU3RyaW5nIGNvbnN1bWVySWQpIHsKKwkJdGhpcy5jb25zdW1lcklkID0gY29uc3VtZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJMKCkgeworCQlyZXR1cm4gcmVzb3VyY2VVUkw7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkwoU3RyaW5nIHJlc291cmNlVVJMKSB7CisJCXRoaXMucmVzb3VyY2VVUkwgPSByZXNvdXJjZVVSTDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU5hbWUoU3RyaW5nIHJlc291cmNlTmFtZSkgeworCQl0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkgeworCQlyZXR1cm4gc2VydmljZUluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZUluc3RhbmNlSWQoU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlkKSB7CisJCXRoaXMuc2VydmljZUluc3RhbmNlSWQgPSBzZXJ2aWNlSW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyKCkgeworCQlyZXR1cm4gbW9kaWZpZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyKSB7CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByZXZBcnRpZmFjdFV1aWQoKSB7CisJCXJldHVybiBwcmV2QXJ0aWZhY3RVdWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByZXZBcnRpZmFjdFV1aWQoU3RyaW5nIHByZXZBcnRpZmFjdFV1aWQpIHsKKwkJdGhpcy5wcmV2QXJ0aWZhY3RVdWlkID0gcHJldkFydGlmYWN0VXVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEN1cnJBcnRpZmFjdFV1aWQoKSB7CisJCXJldHVybiBjdXJyQXJ0aWZhY3RVdWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEN1cnJBcnRpZmFjdFV1aWQoU3RyaW5nIGN1cnJBcnRpZmFjdFV1aWQpIHsKKwkJdGhpcy5jdXJyQXJ0aWZhY3RVdWlkID0gY3VyckFydGlmYWN0VXVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGF0YSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0RGF0YTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdERhdGEoU3RyaW5nIGFydGlmYWN0RGF0YSkgeworCQl0aGlzLmFydGlmYWN0RGF0YSA9IGFydGlmYWN0RGF0YTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkV4dGVybmFsQXBpRXZlbnQgW3RpbWViYXNlZHV1aWQ9IiArIHRpbWViYXNlZHV1aWQgKyAiLCB0aW1lc3RhbXAxPSIgKyB0aW1lc3RhbXAxICsgIiwgYWN0aW9uPSIgKyBhY3Rpb24KKwkJCQkrICIsIHN0YXR1cz0iICsgc3RhdHVzICsgIiwgZGVzYz0iICsgZGVzYyArICIsIGNvbnN1bWVySWQ9IiArIGNvbnN1bWVySWQgKyAiLCByZXNvdXJjZVVSTD0iCisJCQkJKyByZXNvdXJjZVVSTCArICIsIHJlc291cmNlTmFtZT0iICsgcmVzb3VyY2VOYW1lICsgIiwgcmVzb3VyY2VUeXBlPSIgKyByZXNvdXJjZVR5cGUKKwkJCQkrICIsIHNlcnZpY2VJbnN0YW5jZUlkPSIgKyBzZXJ2aWNlSW5zdGFuY2VJZCArICIsIG1vZGlmaWVyPSIgKyBtb2RpZmllciArICIsIHByZXZBcnRpZmFjdFV1aWQ9IgorCQkJCSsgcHJldkFydGlmYWN0VXVpZCArICIsIGN1cnJBcnRpZmFjdFV1aWQ9IiArIGN1cnJBcnRpZmFjdFV1aWQgKyAiLCBhcnRpZmFjdERhdGE9IiArIGFydGlmYWN0RGF0YSArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0dldENhdGVnb3J5SGllcmFyY2h5RXZlbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvR2V0Q2F0ZWdvcnlIaWVyYXJjaHlFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODY2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL0dldENhdGVnb3J5SGllcmFyY2h5RXZlbnQuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS51dGlscy5VVUlEczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ2x1c3RlcmluZ0NvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5QYXJ0aXRpb25LZXk7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlRhYmxlOworCitAVGFibGUoa2V5c3BhY2UgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFLCBuYW1lID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5HRVRfQ0FURUdPUllfSElFUkFSQ0hZX0VWRU5UX1RZUEUpCitwdWJsaWMgY2xhc3MgR2V0Q2F0ZWdvcnlIaWVyYXJjaHlFdmVudCBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50IHsKKwlAUGFydGl0aW9uS2V5CisJcHJvdGVjdGVkIFVVSUQgdGltZWJhc2VkdXVpZDsKKworCUBDbHVzdGVyaW5nQ29sdW1uKCkKKwkvLyBAQ29sdW1uKG5hbWU9InRpbWVzdGFtcCIpCisJcHJvdGVjdGVkIERhdGUgdGltZXN0YW1wMTsKKworCUBDb2x1bW4obmFtZSA9ICJyZXF1ZXN0X2lkIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RJZDsKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBhY3Rpb247CisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgc3RhdHVzOworCisJQENvbHVtbihuYW1lID0gImRlc2NyaXB0aW9uIikKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2M7CisKKwlAQ29sdW1uCisJcHJpdmF0ZSBTdHJpbmcgbW9kaWZpZXI7CisKKwlAQ29sdW1uCisJcHJpdmF0ZSBTdHJpbmcgZGV0YWlsczsKKworCXB1YmxpYyBHZXRDYXRlZ29yeUhpZXJhcmNoeUV2ZW50KCkgeworCQlzdXBlcigpOworCQl0aW1lc3RhbXAxID0gbmV3IERhdGUoKTsKKwkJdGltZWJhc2VkdXVpZCA9IFVVSURzLnRpbWVCYXNlZCgpOworCX0KKworCXB1YmxpYyBHZXRDYXRlZ29yeUhpZXJhcmNoeUV2ZW50KEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQl0aGlzKCk7CisJCU9iamVjdCB2YWx1ZTsKKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlcXVlc3RJZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0QWN0aW9uKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUyk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRTdGF0dXMoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQyk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXREZXNjKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRNb2RpZmllcigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVRBSUxTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERldGFpbHMoKFN0cmluZykgdmFsdWUpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmlsbEZpZWxkcygpIHsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVxdWVzdElkKCkpOworCisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELmdldERpc3BsYXlOYW1lKCksIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEFjdGlvbigpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUy5nZXREaXNwbGF5TmFtZSgpLCBnZXRTdGF0dXMoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLmdldERpc3BsYXlOYW1lKCksIGdldERlc2MoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVRBSUxTLmdldERpc3BsYXlOYW1lKCksIGdldERldGFpbHMoKSk7CisJCVNpbXBsZURhdGVGb3JtYXQgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGRhdGVGb3JtYXRQYXR0ZXJuKTsKKwkJc2ltcGxlRGF0ZUZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLmdldERpc3BsYXlOYW1lKCksIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KHRpbWVzdGFtcDEpKTsKKwl9CisKKwlwdWJsaWMgVVVJRCBnZXRUaW1lYmFzZWR1dWlkKCkgeworCQlyZXR1cm4gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lYmFzZWR1dWlkKFVVSUQgdGltZWJhc2VkdXVpZCkgeworCQl0aGlzLnRpbWViYXNlZHV1aWQgPSB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcDEoKSB7CisJCXJldHVybiB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcDEoRGF0ZSB0aW1lc3RhbXAxKSB7CisJCXRoaXMudGltZXN0YW1wMSA9IHRpbWVzdGFtcDE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0SWQoKSB7CisJCXJldHVybiByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdElkKFN0cmluZyByZXF1ZXN0SWQpIHsKKwkJdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2RpZmllcigpIHsKKwkJcmV0dXJuIG1vZGlmaWVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyKFN0cmluZyBtb2RpZmllcikgeworCQl0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXRhaWxzKCkgeworCQlyZXR1cm4gZGV0YWlsczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXRhaWxzKFN0cmluZyBkZXRhaWxzKSB7CisJCXRoaXMuZGV0YWlscyA9IGRldGFpbHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJHZXRDYXRlZ29yeUhpZXJhcmNoeUV2ZW50IFt0aW1lYmFzZWR1dWlkPSIgKyB0aW1lYmFzZWR1dWlkICsgIiwgdGltZXN0YW1wMT0iICsgdGltZXN0YW1wMQorCQkJCSsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBhY3Rpb249IiArIGFjdGlvbiArICIsIHN0YXR1cz0iICsgc3RhdHVzICsgIiwgZGVzYz0iICsgZGVzYworCQkJCSsgIiwgbW9kaWZpZXI9IiArIG1vZGlmaWVyICsgIiwgZGV0YWlscz0iICsgZGV0YWlscyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvR2V0VXNlcnNMaXN0RXZlbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvR2V0VXNlcnNMaXN0RXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjhhMDQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9HZXRVc2Vyc0xpc3RFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnV0aWxzLlVVSURzOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5DbHVzdGVyaW5nQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CisKK0BUYWJsZShrZXlzcGFjZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UsIG5hbWUgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkdFVF9VU0VSU19MSVNUX0VWRU5UX1RZUEUpCitwdWJsaWMgY2xhc3MgR2V0VXNlcnNMaXN0RXZlbnQgZXh0ZW5kcyBBdWRpdGluZ0dlbmVyaWNFdmVudCB7CisJQFBhcnRpdGlvbktleQorCXByb3RlY3RlZCBVVUlEIHRpbWViYXNlZHV1aWQ7CisKKwlAQ2x1c3RlcmluZ0NvbHVtbgorCXByb3RlY3RlZCBEYXRlIHRpbWVzdGFtcDE7CisKKwlAQ29sdW1uKG5hbWUgPSAicmVxdWVzdF9pZCIpCisJcHJvdGVjdGVkIFN0cmluZyByZXF1ZXN0SWQ7CisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgYWN0aW9uOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIHN0YXR1czsKKworCUBDb2x1bW4obmFtZSA9ICJkZXNjcmlwdGlvbiIpCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIG1vZGlmaWVyOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIGRldGFpbHM7CisKKwlwdWJsaWMgR2V0VXNlcnNMaXN0RXZlbnQoKSB7CisJCXN1cGVyKCk7CisJCXRpbWVzdGFtcDEgPSBuZXcgRGF0ZSgpOworCQl0aW1lYmFzZWR1dWlkID0gVVVJRHMudGltZUJhc2VkKCk7CisJfQorCisJcHVibGljIEdldFVzZXJzTGlzdEV2ZW50KEVudW1NYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBhdWRpdGluZ0ZpZWxkcykgeworCQl0aGlzKCk7CisJCU9iamVjdCB2YWx1ZTsKKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFJlcXVlc3RJZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0QWN0aW9uKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUyk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRTdGF0dXMoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQyk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXREZXNjKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRNb2RpZmllcigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0RFVEFJTFMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGV0YWlscygoU3RyaW5nKSB2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFVEFJTFMpOworCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQlzZXREZXRhaWxzKChTdHJpbmcpIHZhbHVlKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGxGaWVsZHMoKSB7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELmdldERpc3BsYXlOYW1lKCksIGdldFJlcXVlc3RJZCgpKTsKKworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEFjdGlvbigpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUy5nZXREaXNwbGF5TmFtZSgpLCBnZXRTdGF0dXMoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLmdldERpc3BsYXlOYW1lKCksIGdldERlc2MoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0RFVEFJTFMuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0RGV0YWlscygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRNb2RpZmllcigpKTsKKwkJU2ltcGxlRGF0ZUZvcm1hdCBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZGF0ZUZvcm1hdFBhdHRlcm4pOworCQlzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAuZ2V0RGlzcGxheU5hbWUoKSwgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQodGltZXN0YW1wMSkpOworCX0KKworCXB1YmxpYyBVVUlEIGdldFRpbWViYXNlZHV1aWQoKSB7CisJCXJldHVybiB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWViYXNlZHV1aWQoVVVJRCB0aW1lYmFzZWR1dWlkKSB7CisJCXRoaXMudGltZWJhc2VkdXVpZCA9IHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIERhdGUgZ2V0VGltZXN0YW1wMSgpIHsKKwkJcmV0dXJuIHRpbWVzdGFtcDE7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wMShEYXRlIHRpbWVzdGFtcDEpIHsKKwkJdGhpcy50aW1lc3RhbXAxID0gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RJZCgpIHsKKwkJcmV0dXJuIHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0SWQoU3RyaW5nIHJlcXVlc3RJZCkgeworCQl0aGlzLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKKwkJcmV0dXJuIGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisJCXJldHVybiBkZXNjOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKwkJdGhpcy5kZXNjID0gZGVzYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyKCkgeworCQlyZXR1cm4gbW9kaWZpZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyKSB7CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERldGFpbHMoKSB7CisJCXJldHVybiBkZXRhaWxzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERldGFpbHMoU3RyaW5nIGRldGFpbHMpIHsKKwkJdGhpcy5kZXRhaWxzID0gZGV0YWlsczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkdldFVzZXJzTGlzdEV2ZW50IFt0aW1lYmFzZWR1dWlkPSIgKyB0aW1lYmFzZWR1dWlkICsgIiwgdGltZXN0YW1wMT0iICsgdGltZXN0YW1wMSArICIsIHJlcXVlc3RJZD0iCisJCQkJKyByZXF1ZXN0SWQgKyAiLCBhY3Rpb249IiArIGFjdGlvbiArICIsIHN0YXR1cz0iICsgc3RhdHVzICsgIiwgZGVzYz0iICsgZGVzYyArICIsIG1vZGlmaWVyPSIgKyBtb2RpZmllcgorCQkJCSsgIiwgZGV0YWlscz0iICsgZGV0YWlscyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvUmVzb3VyY2VBZG1pbkV2ZW50LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL1Jlc291cmNlQWRtaW5FdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTg0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL1Jlc291cmNlQWRtaW5FdmVudC5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnV0aWxzLlVVSURzOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5DbHVzdGVyaW5nQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CisKK0BUYWJsZShrZXlzcGFjZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UsIG5hbWUgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlJFU09VUkNFX0FETUlOX0VWRU5UX1RZUEUpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VBZG1pbkV2ZW50IGV4dGVuZHMgQXVkaXRpbmdHZW5lcmljRXZlbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0FETUlOX0VWRU5UX1RFTVBMQVRFID0gImFjdGlvbj1cIiVzXCIgdGltZXN0YW1wPVwiJXNcIiAiCisJCQkrICJyZXNvdXJjZU5hbWU9XCIlc1wiIHJlc291cmNlVHlwZT1cIiVzXCIgcHJldlZlcnNpb249XCIlc1wiIGN1cnJWZXJzaW9uPVwiJXNcIiAiCisJCQkrICJtb2RpZmllck5hbWU9XCIlc1wiIG1vZGlmaWVyVWlkPVwiJXNcIiAiICsgInByZXZTdGF0ZT1cIiVzXCIgY3VyclN0YXRlPVwiJXNcIiAiCisJCQkrICJjaGVja2luQ29tbWVudD1cIiVzXCIgcHJldkFydGlmYWN0VXVpZD1cIiVzXCIgY3VyckFydGlmYWN0VXVpZD1cIiVzXCIgIiArICJhcnRpZmFjdERhdGE9XCIlc1wiICIKKwkJCSsgInN0YXR1cz1cIiVzXCIgZGVzYz1cIiVzXCIiOworCisJQFBhcnRpdGlvbktleQorCXByb3RlY3RlZCBVVUlEIHRpbWViYXNlZHV1aWQ7CisKKwlAQ2x1c3RlcmluZ0NvbHVtbgorCXByb3RlY3RlZCBEYXRlIHRpbWVzdGFtcDE7CisKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBhY3Rpb247CisKKwlAQ29sdW1uKG5hbWUgPSAicmVzb3VyY2VfdHlwZSIpCisJcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVR5cGU7CisKKwlAQ29sdW1uKG5hbWUgPSAicHJldl92ZXJzaW9uIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHByZXZWZXJzaW9uOworCisJQENvbHVtbihuYW1lID0gInByZXZfc3RhdGUiKQorCXByb3RlY3RlZCBTdHJpbmcgcHJldlN0YXRlOworCisJQENvbHVtbihuYW1lID0gImN1cnJfc3RhdGUiKQorCXByb3RlY3RlZCBTdHJpbmcgY3VyclN0YXRlOworCisJQENvbHVtbihuYW1lID0gInJlc291cmNlX25hbWUiKQorCXByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKKworCUBDb2x1bW4obmFtZSA9ICJjdXJyX3ZlcnNpb24iKQorCXByaXZhdGUgU3RyaW5nIGN1cnJWZXJzaW9uOworCisJQENvbHVtbihuYW1lID0gInJlcXVlc3RfaWQiKQorCXByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdElkOworCisJQENvbHVtbihuYW1lID0gInNlcnZpY2VfaW5zdGFuY2VfaWQiKQorCXByb3RlY3RlZCBTdHJpbmcgc2VydmljZUluc3RhbmNlSWQ7CisKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBzdGF0dXM7CisKKwlAQ29sdW1uKG5hbWUgPSAiZGVzY3JpcHRpb24iKQorCXByb3RlY3RlZCBTdHJpbmcgZGVzYzsKKworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIG1vZGlmaWVyOworCisJQENvbHVtbihuYW1lID0gInByZXZfYXJ0aWZhY3RfVVVJRCIpCisJcHJvdGVjdGVkIFN0cmluZyBwcmV2QXJ0aWZhY3RVVUlEOworCisJQENvbHVtbihuYW1lID0gImN1cnJfYXJ0aWZhY3RfVVVJRCIpCisJcHJvdGVjdGVkIFN0cmluZyBjdXJyQXJ0aWZhY3RVVUlEOworCisJQENvbHVtbihuYW1lID0gImFydGlmYWN0X2RhdGEiKQorCXByb3RlY3RlZCBTdHJpbmcgYXJ0aWZhY3REYXRhOworCisJQENvbHVtbgorCXByb3RlY3RlZCBTdHJpbmcgZGlkOworCisJQENvbHVtbihuYW1lID0gImRwcmV2X3N0YXR1cyIpCisJcHJvdGVjdGVkIFN0cmluZyBkcHJldlN0YXR1czsKKworCUBDb2x1bW4obmFtZSA9ICJkY3Vycl9zdGF0dXMiKQorCXByb3RlY3RlZCBTdHJpbmcgZGN1cnJTdGF0dXM7CisKKwlAQ29sdW1uKG5hbWUgPSAidG9zY2Ffbm9kZV90eXBlIikKKwlwcm90ZWN0ZWQgU3RyaW5nIHRvc2NhTm9kZVR5cGU7CisKKwlAQ29sdW1uCisJcHJvdGVjdGVkIFN0cmluZyBjb21tZW50OworCisJQENvbHVtbihuYW1lID0gImludmFyaWFudF9VVUlEIikKKwlwcm90ZWN0ZWQgU3RyaW5nIGludmFyaWFudFVVSUQ7CisKKwlwdWJsaWMgUmVzb3VyY2VBZG1pbkV2ZW50KCkgeworCQlzdXBlcigpOworCQl0aW1lc3RhbXAxID0gbmV3IERhdGUoKTsKKwkJdGltZWJhc2VkdXVpZCA9IFVVSURzLnRpbWVCYXNlZCgpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZUFkbWluRXZlbnQoRW51bU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGF1ZGl0aW5nRmllbGRzKSB7CisJCXRoaXMoKTsKKwkJT2JqZWN0IHZhbHVlOworCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVxdWVzdElkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U2VydmljZUluc3RhbmNlSWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRSk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSZXNvdXJjZVR5cGUoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfUFJFVl9WRVJTSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFByZXZWZXJzaW9uKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfU1RBVEUpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UHJldlN0YXRlKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UmVzb3VyY2VOYW1lKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX0NVUlJfVkVSU0lPTik7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRDdXJyVmVyc2lvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1NUQVRFKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEN1cnJTdGF0ZSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGVzYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0QWN0aW9uKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRNb2RpZmllcigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9QUkVWX0FSVElGQUNUX1VVSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0UHJldkFydGlmYWN0VVVJRCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9DVVJSX0FSVElGQUNUX1VVSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0Q3VyckFydGlmYWN0VVVJRCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BUlRJRkFDVF9EQVRBKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFydGlmYWN0RGF0YSgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DT01NRU5UKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldENvbW1lbnQoKFN0cmluZykgdmFsdWUpOworCQl9CisKKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9EQ1VSUl9TVEFUVVMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGN1cnJTdGF0dXMoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfRFBSRVZfU1RBVFVTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldERwcmV2U3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXREaWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVE9TQ0FfTk9ERV9UWVBFKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFRvc2NhTm9kZVR5cGUoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfSU5WQVJJQU5UX1VVSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0SW52YXJpYW50VVVJRCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGZpbGxGaWVsZHMoKSB7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVFVRVNUX0lELmdldERpc3BsYXlOYW1lKCksIGdldFJlcXVlc3RJZCgpKTsKKworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTi5nZXREaXNwbGF5TmFtZSgpLCBnZXRBY3Rpb24oKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U3RhdHVzKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQy5nZXREaXNwbGF5TmFtZSgpLCBnZXREZXNjKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVFlQRS5nZXREaXNwbGF5TmFtZSgpLCBnZXRSZXNvdXJjZVR5cGUoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9QUkVWX1ZFUlNJT04uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UHJldlZlcnNpb24oKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9QUkVWX1NUQVRFLmdldERpc3BsYXlOYW1lKCksIGdldFByZXZTdGF0ZSgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVzb3VyY2VOYW1lKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9WRVJTSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEN1cnJWZXJzaW9uKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9TVEFURS5nZXREaXNwbGF5TmFtZSgpLCBnZXRDdXJyU3RhdGUoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0TW9kaWZpZXIoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9QUkVWX0FSVElGQUNUX1VVSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UHJldkFydGlmYWN0VVVJRCgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0NVUlJfQVJUSUZBQ1RfVVVJRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRDdXJyQXJ0aWZhY3RVVUlEKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQVJUSUZBQ1RfREFUQS5nZXREaXNwbGF5TmFtZSgpLCBnZXRBcnRpZmFjdERhdGEoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DT01NRU5ULmdldERpc3BsYXlOYW1lKCksIGdldENvbW1lbnQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0RGlkKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfRENVUlJfU1RBVFVTLmdldERpc3BsYXlOYW1lKCksIGdldERjdXJyU3RhdHVzKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfRFBSRVZfU1RBVFVTLmdldERpc3BsYXlOYW1lKCksIGdldERwcmV2U3RhdHVzKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfVE9TQ0FfTk9ERV9UWVBFLmdldERpc3BsYXlOYW1lKCksIGdldFRvc2NhTm9kZVR5cGUoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9JTlZBUklBTlRfVVVJRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRJbnZhcmlhbnRVVUlEKCkpOworCisJCVNpbXBsZURhdGVGb3JtYXQgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGRhdGVGb3JtYXRQYXR0ZXJuKTsKKwkJc2ltcGxlRGF0ZUZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLmdldERpc3BsYXlOYW1lKCksIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KHRpbWVzdGFtcDEpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU5hbWUoU3RyaW5nIHJlc291cmNlTmFtZSkgeworCQl0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByZXZWZXJzaW9uKCkgeworCQlyZXR1cm4gcHJldlZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJldlZlcnNpb24oU3RyaW5nIHByZXZWZXJzaW9uKSB7CisJCXRoaXMucHJldlZlcnNpb24gPSBwcmV2VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEN1cnJWZXJzaW9uKCkgeworCQlyZXR1cm4gY3VyclZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3VyclZlcnNpb24oU3RyaW5nIGN1cnJWZXJzaW9uKSB7CisJCXRoaXMuY3VyclZlcnNpb24gPSBjdXJyVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByZXZTdGF0ZSgpIHsKKwkJcmV0dXJuIHByZXZTdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcmV2U3RhdGUoU3RyaW5nIHByZXZTdGF0ZSkgeworCQl0aGlzLnByZXZTdGF0ZSA9IHByZXZTdGF0ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEN1cnJTdGF0ZSgpIHsKKwkJcmV0dXJuIGN1cnJTdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXJyU3RhdGUoU3RyaW5nIGN1cnJTdGF0ZSkgeworCQl0aGlzLmN1cnJTdGF0ZSA9IGN1cnJTdGF0ZTsKKwl9CisKKwlwdWJsaWMgVVVJRCBnZXRUaW1lYmFzZWR1dWlkKCkgeworCQlyZXR1cm4gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lYmFzZWR1dWlkKFVVSUQgdGltZWJhc2VkdXVpZCkgeworCQl0aGlzLnRpbWViYXNlZHV1aWQgPSB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcDEoKSB7CisJCXJldHVybiB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcDEoRGF0ZSB0aW1lc3RhbXAxKSB7CisJCXRoaXMudGltZXN0YW1wMSA9IHRpbWVzdGFtcDE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0SWQoKSB7CisJCXJldHVybiByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdElkKFN0cmluZyByZXF1ZXN0SWQpIHsKKwkJdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpIHsKKwkJcmV0dXJuIHNlcnZpY2VJbnN0YW5jZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnN0YW5jZUlkKFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCkgeworCQl0aGlzLnNlcnZpY2VJbnN0YW5jZUlkID0gc2VydmljZUluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNb2RpZmllcigpIHsKKwkJcmV0dXJuIG1vZGlmaWVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyKFN0cmluZyBtb2RpZmllcikgeworCQl0aGlzLm1vZGlmaWVyID0gbW9kaWZpZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcmV2QXJ0aWZhY3RVVUlEKCkgeworCQlyZXR1cm4gcHJldkFydGlmYWN0VVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcmV2QXJ0aWZhY3RVVUlEKFN0cmluZyBwcmV2QXJ0aWZhY3RVVUlEKSB7CisJCXRoaXMucHJldkFydGlmYWN0VVVJRCA9IHByZXZBcnRpZmFjdFVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDdXJyQXJ0aWZhY3RVVUlEKCkgeworCQlyZXR1cm4gY3VyckFydGlmYWN0VVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXJyQXJ0aWZhY3RVVUlEKFN0cmluZyBjdXJyQXJ0aWZhY3RVVUlEKSB7CisJCXRoaXMuY3VyckFydGlmYWN0VVVJRCA9IGN1cnJBcnRpZmFjdFVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdERhdGEoKSB7CisJCXJldHVybiBhcnRpZmFjdERhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3REYXRhKFN0cmluZyBhcnRpZmFjdERhdGEpIHsKKwkJdGhpcy5hcnRpZmFjdERhdGEgPSBhcnRpZmFjdERhdGE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaWQoKSB7CisJCXJldHVybiBkaWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlkKFN0cmluZyBkaWQpIHsKKwkJdGhpcy5kaWQgPSBkaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREcHJldlN0YXR1cygpIHsKKwkJcmV0dXJuIGRwcmV2U3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERwcmV2U3RhdHVzKFN0cmluZyBkcHJldlN0YXR1cykgeworCQl0aGlzLmRwcmV2U3RhdHVzID0gZHByZXZTdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREY3VyclN0YXR1cygpIHsKKwkJcmV0dXJuIGRjdXJyU3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERjdXJyU3RhdHVzKFN0cmluZyBkY3VyclN0YXR1cykgeworCQl0aGlzLmRjdXJyU3RhdHVzID0gZGN1cnJTdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3NjYU5vZGVUeXBlKCkgeworCQlyZXR1cm4gdG9zY2FOb2RlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYU5vZGVUeXBlKFN0cmluZyB0b3NjYU5vZGVUeXBlKSB7CisJCXRoaXMudG9zY2FOb2RlVHlwZSA9IHRvc2NhTm9kZVR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworCQlyZXR1cm4gY29tbWVudDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisJCXRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbnZhcmlhbnRVVUlEKCkgeworCQlyZXR1cm4gaW52YXJpYW50VVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnZhcmlhbnRVVUlEKFN0cmluZyBpbnZhcmlhbnRVVUlEKSB7CisJCXRoaXMuaW52YXJpYW50VVVJRCA9IGludmFyaWFudFVVSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNvdXJjZUFkbWluRXZlbnQgW3RpbWViYXNlZHV1aWQ9IiArIHRpbWViYXNlZHV1aWQgKyAiLCB0aW1lc3RhbXAxPSIgKyB0aW1lc3RhbXAxICsgIiwgYWN0aW9uPSIKKwkJCQkrIGFjdGlvbiArICIsIHJlc291cmNlVHlwZT0iICsgcmVzb3VyY2VUeXBlICsgIiwgcHJldlZlcnNpb249IiArIHByZXZWZXJzaW9uICsgIiwgcHJldlN0YXRlPSIKKwkJCQkrIHByZXZTdGF0ZSArICIsIGN1cnJTdGF0ZT0iICsgY3VyclN0YXRlICsgIiwgcmVzb3VyY2VOYW1lPSIgKyByZXNvdXJjZU5hbWUgKyAiLCBjdXJyVmVyc2lvbj0iCisJCQkJKyBjdXJyVmVyc2lvbiArICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgc2VydmljZUluc3RhbmNlSWQ9IiArIHNlcnZpY2VJbnN0YW5jZUlkICsgIiwgc3RhdHVzPSIKKwkJCQkrIHN0YXR1cyArICIsIGRlc2M9IiArIGRlc2MgKyAiLCBtb2RpZmllcj0iICsgbW9kaWZpZXIgKyAiLCBwcmV2QXJ0aWZhY3RVVUlEPSIgKyBwcmV2QXJ0aWZhY3RVVUlECisJCQkJKyAiLCBjdXJyQXJ0aWZhY3RVVUlEPSIgKyBjdXJyQXJ0aWZhY3RVVUlEICsgIiwgYXJ0aWZhY3REYXRhPSIgKyBhcnRpZmFjdERhdGEgKyAiLCBpbnZhcmlhbnRVVUlEPSIKKwkJCQkrIGludmFyaWFudFVVSUQgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2F1ZGl0aW5nL1VzZXJBY2Nlc3NFdmVudC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9Vc2VyQWNjZXNzRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWFlMWUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9Vc2VyQWNjZXNzRXZlbnQuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuQXVkaXRpbmdGaWVsZHNLZXlzRW51bTsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS51dGlscy5VVUlEczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ2x1c3RlcmluZ0NvbHVtbjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5QYXJ0aXRpb25LZXk7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlRhYmxlOworCitAVGFibGUoa2V5c3BhY2UgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLkFVRElUX0tFWVNQQUNFLCBuYW1lID0gQXVkaXRpbmdUeXBlc0NvbnN0YW50cy5VU0VSX0FDQ0VTU19FVkVOVF9UWVBFKQorcHVibGljIGNsYXNzIFVzZXJBY2Nlc3NFdmVudCBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50IHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVNFUl9BQ0NFU1NfRVZFTlRfVEVNUExBVEUgPSAiYWN0aW9uPVwiJXNcIiB0aW1lc3RhbXA9XCIlc1wiICIKKwkJCSsgInVzZXJVaWQ9XCIlc1wiIHVzZXJOYW1lPVwiJXNcIiBzdGF0dXM9XCIlc1wiIGRlc2M9XCIlc1wiIjsKKworCUBQYXJ0aXRpb25LZXkKKwlwcm90ZWN0ZWQgVVVJRCB0aW1lYmFzZWR1dWlkOworCisJQENsdXN0ZXJpbmdDb2x1bW4KKwlwcm90ZWN0ZWQgRGF0ZSB0aW1lc3RhbXAxOworCisJQENvbHVtbihuYW1lID0gIlJFUVVFU1RfSUQiKQorCXByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdElkOworCisJQENvbHVtbihuYW1lID0gIlVTRVIiKQorCXByaXZhdGUgU3RyaW5nIHVzZXJVaWQ7CisKKwlAQ29sdW1uCisJcHJpdmF0ZSBTdHJpbmcgc3RhdHVzOworCisJQENvbHVtbihuYW1lID0gIkRFU0NSSVBUSU9OIikKKwlwcml2YXRlIFN0cmluZyBkZXNjOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIGFjdGlvbjsKKworCUBDb2x1bW4obmFtZSA9ICJzZXJ2aWNlX2luc3RhbmNlX2lkIikKKwlwcml2YXRlIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZDsKKworCXB1YmxpYyBVc2VyQWNjZXNzRXZlbnQoKSB7CisJCXN1cGVyKCk7CisJCXRpbWVzdGFtcDEgPSBuZXcgRGF0ZSgpOworCQl0aW1lYmFzZWR1dWlkID0gVVVJRHMudGltZUJhc2VkKCk7CisJfQorCisJcHVibGljIFVzZXJBY2Nlc3NFdmVudChFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKwkJdGhpcygpOworCQlPYmplY3QgdmFsdWU7CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSZXF1ZXN0SWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVVNFUl9VSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0VXNlclVpZCgoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U3RhdHVzKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGVzYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0QWN0aW9uKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0U2VydmljZUluc3RhbmNlSWQoKFN0cmluZykgdmFsdWUpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmaWxsRmllbGRzKCkgeworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRC5nZXREaXNwbGF5TmFtZSgpLCBnZXRSZXF1ZXN0SWQoKSk7CisKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0U2VydmljZUluc3RhbmNlSWQoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9BQ1RJT04uZ2V0RGlzcGxheU5hbWUoKSwgZ2V0QWN0aW9uKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLmdldERpc3BsYXlOYW1lKCksIGdldFN0YXR1cygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0RGVzYygpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1VTRVJfVUlELmdldERpc3BsYXlOYW1lKCksIGdldFVzZXJVaWQoKSk7CisJCVNpbXBsZURhdGVGb3JtYXQgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGRhdGVGb3JtYXRQYXR0ZXJuKTsKKwkJc2ltcGxlRGF0ZUZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLmdldERpc3BsYXlOYW1lKCksIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KHRpbWVzdGFtcDEpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJVaWQoKSB7CisJCXJldHVybiB1c2VyVWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJVaWQoU3RyaW5nIHVzZXJVaWQpIHsKKwkJdGhpcy51c2VyVWlkID0gdXNlclVpZDsKKwl9CisKKwlwdWJsaWMgVVVJRCBnZXRUaW1lYmFzZWR1dWlkKCkgeworCQlyZXR1cm4gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lYmFzZWR1dWlkKFVVSUQgdGltZWJhc2VkdXVpZCkgeworCQl0aGlzLnRpbWViYXNlZHV1aWQgPSB0aW1lYmFzZWR1dWlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdElkKCkgeworCQlyZXR1cm4gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3RJZChTdHJpbmcgcmVxdWVzdElkKSB7CisJCXRoaXMucmVxdWVzdElkID0gcmVxdWVzdElkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgeworCQl0aGlzLmRlc2MgPSBkZXNjOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCXB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcDEoKSB7CisJCXJldHVybiB0aW1lc3RhbXAxOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcDEoRGF0ZSB0aW1lc3RhbXApIHsKKwkJdGhpcy50aW1lc3RhbXAxID0gdGltZXN0YW1wOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVXNlckFjY2Vzc0V2ZW50IFt0aW1lYmFzZWR1dWlkPSIgKyB0aW1lYmFzZWR1dWlkICsgIiwgdGltZXN0YW1wMT0iICsgdGltZXN0YW1wMSArICIsIHJlcXVlc3RJZD0iCisJCQkJKyByZXF1ZXN0SWQgKyAiLCB1c2VyVWlkPSIgKyB1c2VyVWlkICsgIiwgc3RhdHVzPSIgKyBzdGF0dXMgKyAiLCBkZXNjPSIgKyBkZXNjICsgIiwgYWN0aW9uPSIgKyBhY3Rpb24KKwkJCQkrICIsIHNlcnZpY2VJbnN0YW5jZUlkPSIgKyBzZXJ2aWNlSW5zdGFuY2VJZCArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvVXNlckFkbWluRXZlbnQuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvYXVkaXRpbmcvVXNlckFkbWluRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQ3ZDJmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9hdWRpdGluZy9Vc2VyQWRtaW5FdmVudC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuYXVkaXRpbmc7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5BdWRpdGluZ0ZpZWxkc0tleXNFbnVtOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnV0aWxzLlVVSURzOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5DbHVzdGVyaW5nQ29sdW1uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIubWFwcGluZy5hbm5vdGF0aW9ucy5Db2x1bW47CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLmFubm90YXRpb25zLlBhcnRpdGlvbktleTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuYW5ub3RhdGlvbnMuVGFibGU7CisKK0BUYWJsZShrZXlzcGFjZSA9IEF1ZGl0aW5nVHlwZXNDb25zdGFudHMuQVVESVRfS0VZU1BBQ0UsIG5hbWUgPSBBdWRpdGluZ1R5cGVzQ29uc3RhbnRzLlVTRVJfQURNSU5fRVZFTlRfVFlQRSkKK3B1YmxpYyBjbGFzcyBVc2VyQWRtaW5FdmVudCBleHRlbmRzIEF1ZGl0aW5nR2VuZXJpY0V2ZW50IHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBVU0VSX0FETUlOX0VWRU5UX1RFTVBMQVRFID0gImFjdGlvbj1cIiVzXCIgdGltZXN0YW1wPVwiJXNcIiBtb2RpZmllck5hbWU9XCIlc1wiIG1vZGlmaWVyVWlkPVwiJXNcIiAiCisJCQkrICJ1c2VyVWlkPVwiJXNcIiB1c2VyTmFtZT1cIiVzXCIgdXNlckVtYWlsPVwiJXNcIiB1c2VyUm9sZT1cIiVzXCIgIgorCQkJKyAidXNlckJlZm9yZVVpZD1cIiVzXCIgdXNlckJlZm9yZU5hbWU9XCIlc1wiIHVzZXJCZWZvcmVFbWFpbD1cIiVzXCIgdXNlckJlZm9yZVJvbGU9XCIlc1wiICIKKwkJCSsgInVzZXJBZnRlclVpZD1cIiVzXCIgdXNlckFmdGVyTmFtZT1cIiVzXCIgdXNlckFmdGVyRW1haWw9XCIlc1wiIHVzZXJBZnRlclJvbGU9XCIlc1wiICIKKwkJCSsgInN0YXR1cz1cIiVzXCIgZGVzYz1cIiVzXCIiOworCisJQFBhcnRpdGlvbktleQorCXByb3RlY3RlZCBVVUlEIHRpbWViYXNlZHV1aWQ7CisKKwlAQ2x1c3RlcmluZ0NvbHVtbgorCXByb3RlY3RlZCBEYXRlIHRpbWVzdGFtcDE7CisKKwlAQ29sdW1uKG5hbWUgPSAiUkVRVUVTVF9JRCIpCisJcHJvdGVjdGVkIFN0cmluZyByZXF1ZXN0SWQ7CisKKwlAQ29sdW1uKG5hbWUgPSAiU0VSVklDRV9JTlNUQU5DRV9JRCIpCisJcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZDsKKworCUBDb2x1bW4obmFtZSA9ICJBQ1RJT04iKQorCXByb3RlY3RlZCBTdHJpbmcgYWN0aW9uOworCUBDb2x1bW4KKwlwcm90ZWN0ZWQgU3RyaW5nIHN0YXR1czsKKworCUBDb2x1bW4obmFtZSA9ICJkZXNjcmlwdGlvbiIpCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjOworCisJQENvbHVtbgorCXByaXZhdGUgU3RyaW5nIG1vZGlmaWVyOworCisJQENvbHVtbihuYW1lID0gInVzZXJfYmVmb3JlIikKKwlwcml2YXRlIFN0cmluZyB1c2VyQmVmb3JlOworCisJQENvbHVtbihuYW1lID0gInVzZXJfYWZ0ZXIiKQorCXByaXZhdGUgU3RyaW5nIHVzZXJBZnRlcjsKKworCXB1YmxpYyBVc2VyQWRtaW5FdmVudCgpIHsKKwkJc3VwZXIoKTsKKwkJdGltZXN0YW1wMSA9IG5ldyBEYXRlKCk7CisJCXRpbWViYXNlZHV1aWQgPSBVVUlEcy50aW1lQmFzZWQoKTsKKworCX0KKworCXB1YmxpYyBVc2VyQWRtaW5FdmVudChFbnVtTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gYXVkaXRpbmdGaWVsZHMpIHsKKwkJdGhpcygpOworCQlPYmplY3QgdmFsdWU7CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVRVUVTVF9JRCk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRSZXF1ZXN0SWQoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFN0YXR1cygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0TW9kaWZpZXIoKFN0cmluZykgdmFsdWUpOworCQl9CisJCXZhbHVlID0gYXVkaXRpbmdGaWVsZHMuZ2V0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldEFjdGlvbigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lEKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNldFNlcnZpY2VJbnN0YW5jZUlkKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0RGVzYygoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJdmFsdWUgPSBhdWRpdGluZ0ZpZWxkcy5nZXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0JFRk9SRSk7CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlzZXRVc2VyQmVmb3JlKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCQl2YWx1ZSA9IGF1ZGl0aW5nRmllbGRzLmdldChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1VTRVJfQUZURVIpOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2V0VXNlckFmdGVyKChTdHJpbmcpIHZhbHVlKTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmlsbEZpZWxkcygpIHsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFUVVFU1RfSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0UmVxdWVzdElkKCkpOworCisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lELmdldERpc3BsYXlOYW1lKCksIGdldFNlcnZpY2VJbnN0YW5jZUlkKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLmdldERpc3BsYXlOYW1lKCksIGdldEFjdGlvbigpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUy5nZXREaXNwbGF5TmFtZSgpLCBnZXRTdGF0dXMoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLmdldERpc3BsYXlOYW1lKCksIGdldERlc2MoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0JFRk9SRS5nZXREaXNwbGF5TmFtZSgpLCBnZXRVc2VyQmVmb3JlKCkpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVVNFUl9BRlRFUi5nZXREaXNwbGF5TmFtZSgpLCBnZXRVc2VyQWZ0ZXIoKSk7CisJCWZpZWxkcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQuZ2V0RGlzcGxheU5hbWUoKSwgZ2V0TW9kaWZpZXIoKSk7CisJCVNpbXBsZURhdGVGb3JtYXQgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGRhdGVGb3JtYXRQYXR0ZXJuKTsKKwkJc2ltcGxlRGF0ZUZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOworCQlmaWVsZHMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLmdldERpc3BsYXlOYW1lKCksIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KHRpbWVzdGFtcDEpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyKCkgeworCQlyZXR1cm4gbW9kaWZpZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyKSB7CisJCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJCZWZvcmUoKSB7CisJCXJldHVybiB1c2VyQmVmb3JlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJCZWZvcmUoU3RyaW5nIHVzZXJCZWZvcmVOYW1lKSB7CisJCXRoaXMudXNlckJlZm9yZSA9IHVzZXJCZWZvcmVOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlckFmdGVyKCkgeworCQlyZXR1cm4gdXNlckFmdGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJBZnRlcihTdHJpbmcgdXNlckFmdGVyTmFtZSkgeworCQl0aGlzLnVzZXJBZnRlciA9IHVzZXJBZnRlck5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0SWQoKSB7CisJCXJldHVybiByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdElkKFN0cmluZyByZXF1ZXN0SWQpIHsKKwkJdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW5zdGFuY2VJZCgpIHsKKwkJcmV0dXJuIHNlcnZpY2VJbnN0YW5jZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnN0YW5jZUlkKFN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJZCkgeworCQl0aGlzLnNlcnZpY2VJbnN0YW5jZUlkID0gc2VydmljZUluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwkJdGhpcy5hY3Rpb24gPSBhY3Rpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworCQlyZXR1cm4gZGVzYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCXRoaXMuZGVzYyA9IGRlc2M7CisJfQorCisJcHVibGljIFVVSUQgZ2V0VGltZWJhc2VkdXVpZCgpIHsKKwkJcmV0dXJuIHRpbWViYXNlZHV1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZWJhc2VkdXVpZChVVUlEIHRpbWViYXNlZHV1aWQpIHsKKwkJdGhpcy50aW1lYmFzZWR1dWlkID0gdGltZWJhc2VkdXVpZDsKKwl9CisKKwlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAxKCkgeworCQlyZXR1cm4gdGltZXN0YW1wMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAxKERhdGUgdGltZXN0YW1wKSB7CisJCXRoaXMudGltZXN0YW1wMSA9IHRpbWVzdGFtcDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlVzZXJBZG1pbkV2ZW50IFt0aW1lYmFzZWR1dWlkPSIgKyB0aW1lYmFzZWR1dWlkICsgIiwgdGltZXN0YW1wMT0iICsgdGltZXN0YW1wMSArICIsIHJlcXVlc3RJZD0iCisJCQkJKyByZXF1ZXN0SWQgKyAiLCBzZXJ2aWNlSW5zdGFuY2VJZD0iICsgc2VydmljZUluc3RhbmNlSWQgKyAiLCBhY3Rpb249IiArIGFjdGlvbiArICIsIHN0YXR1cz0iICsgc3RhdHVzCisJCQkJKyAiLCBkZXNjPSIgKyBkZXNjICsgIiwgbW9kaWZpZXJVaWQ9IiArIG1vZGlmaWVyICsgIiwgdXNlckJlZm9yZT0iICsgdXNlckJlZm9yZSArICIsIHVzZXJBZnRlcj0iCisJCQkJKyB1c2VyQWZ0ZXIgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2NhdGVnb3J5L0NhdGVnb3J5RGF0YS5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9jYXRlZ29yeS9DYXRlZ29yeURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDJlYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZGF0YS9jYXRlZ29yeS9DYXRlZ29yeURhdGEuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnk7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jYXRlZ29yeS5DYXRlZ29yeURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBDYXRlZ29yeURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCXByaXZhdGUgQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiBjYXRlZ29yeURhdGFEZWZpbml0aW9uOworCisJcHVibGljIENhdGVnb3J5RGF0YShOb2RlVHlwZUVudW0gbGFiZWwpIHsKKwkJc3VwZXIobGFiZWwpOworCQljYXRlZ29yeURhdGFEZWZpbml0aW9uID0gbmV3IENhdGVnb3J5RGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgQ2F0ZWdvcnlEYXRhKE5vZGVUeXBlRW51bSBsYWJlbCwgQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiBjYXRlZ29yeURhdGFEZWZpbml0aW9uKSB7CisJCXN1cGVyKGxhYmVsKTsKKwkJdGhpcy5jYXRlZ29yeURhdGFEZWZpbml0aW9uID0gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgQ2F0ZWdvcnlEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCQl0aGlzKE5vZGVUeXBlRW51bS5nZXRCeU5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpKSkpOworCisJCWNhdGVnb3J5RGF0YURlZmluaXRpb24uc2V0VW5pcXVlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSkpOworCQljYXRlZ29yeURhdGFEZWZpbml0aW9uCisJCQkJLnNldE5vcm1hbGl6ZWROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLmdldFByb3BlcnR5KCkpKTsKKwkJY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5zZXROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisKKwkJVHlwZSBsaXN0VHlwZSA9IG5ldyBUeXBlVG9rZW48TGlzdDxTdHJpbmc+PigpIHsKKwkJfS5nZXRUeXBlKCk7CisJCUxpc3Q8U3RyaW5nPiBpY29uc2Zyb21Kc29uID0gZ2V0R3NvbigpCisJCQkJLmZyb21Kc29uKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSUNPTlMuZ2V0UHJvcGVydHkoKSksIGxpc3RUeXBlKTsKKwkJY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5zZXRJY29ucyhpY29uc2Zyb21Kc29uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCX0KKworCXB1YmxpYyBDYXRlZ29yeURhdGFEZWZpbml0aW9uIGdldENhdGVnb3J5RGF0YURlZmluaXRpb24oKSB7CisJCXJldHVybiBjYXRlZ29yeURhdGFEZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUsIGNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRSwgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJLy8gU3RyaW5nIGljb25zPWdldEdzb24oKS50b0pzb24oY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXRJY29ucygpKTsKKwkJLy8gYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklDT05TLCBpY29ucyk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JQ09OUywgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXRJY29ucygpKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNhdGVnb3J5RGF0YSBbY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbj0iICsgY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvY2F0ZWdvcnkvR3JvdXBpbmdEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2NhdGVnb3J5L0dyb3VwaW5nRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDBhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2NhdGVnb3J5L0dyb3VwaW5nRGF0YS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jYXRlZ29yeS5Hcm91cGluZ0RhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBHcm91cGluZ0RhdGEgZXh0ZW5kcyBHcmFwaE5vZGUgeworCisJcHJpdmF0ZSBHcm91cGluZ0RhdGFEZWZpbml0aW9uIGdyb3VwaW5nRGF0YURlZmluaXRpb247CisKKwlwdWJsaWMgR3JvdXBpbmdEYXRhKE5vZGVUeXBlRW51bSBsYWJlbCkgeworCQlzdXBlcihsYWJlbCk7CisJCWdyb3VwaW5nRGF0YURlZmluaXRpb24gPSBuZXcgR3JvdXBpbmdEYXRhRGVmaW5pdGlvbigpOworCX0KKworCXB1YmxpYyBHcm91cGluZ0RhdGEoTm9kZVR5cGVFbnVtIGxhYmVsLCBHcm91cGluZ0RhdGFEZWZpbml0aW9uIGdyb3VwaW5nRGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIobGFiZWwpOworCQl0aGlzLmdyb3VwaW5nRGF0YURlZmluaXRpb24gPSBncm91cGluZ0RhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBHcm91cGluZ0RhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMoTm9kZVR5cGVFbnVtLmdldEJ5TmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCkpKSk7CisKKwkJZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKSk7CisJCWdyb3VwaW5nRGF0YURlZmluaXRpb24KKwkJCQkuc2V0Tm9ybWFsaXplZE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OT1JNQUxJWkVEX05BTUUuZ2V0UHJvcGVydHkoKSkpOworCQlncm91cGluZ0RhdGFEZWZpbml0aW9uLnNldE5hbWUoKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpKTsKKwl9CisKKwlwdWJsaWMgR3JvdXBpbmdEYXRhRGVmaW5pdGlvbiBnZXRHcm91cGluZ0RhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvR3JhcGhNYXAoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRCwgZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUsIGdyb3VwaW5nRGF0YURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJYWRkSWZFeGlzdHMobWFwLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRSwgZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbi5nZXROb3JtYWxpemVkTmFtZSgpKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2RhdGEvY2F0ZWdvcnkvU3ViQ2F0ZWdvcnlEYXRhLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2NhdGVnb3J5L1N1YkNhdGVnb3J5RGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTJiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9kYXRhL2NhdGVnb3J5L1N1YkNhdGVnb3J5RGF0YS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworcHVibGljIGNsYXNzIFN1YkNhdGVnb3J5RGF0YSBleHRlbmRzIEdyYXBoTm9kZSB7CisKKwlwcml2YXRlIFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjsKKworCXB1YmxpYyBTdWJDYXRlZ29yeURhdGEoTm9kZVR5cGVFbnVtIGxhYmVsKSB7CisJCXN1cGVyKGxhYmVsKTsKKwkJc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiA9IG5ldyBTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uKCk7CisJfQorCisJcHVibGljIFN1YkNhdGVnb3J5RGF0YShOb2RlVHlwZUVudW0gbGFiZWwsIFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihsYWJlbCk7CisJCXRoaXMuc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiA9IHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb247CisJfQorCisJcHVibGljIFN1YkNhdGVnb3J5RGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKwkJdGhpcyhOb2RlVHlwZUVudW0uZ2V0QnlOYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSkpKTsKKworCQlzdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uCisJCQkJLnNldFVuaXF1ZUlkKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpKTsKKwkJc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbgorCQkJCS5zZXROb3JtYWxpemVkTmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisJCXN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uc2V0TmFtZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkpOworCisJCVR5cGUgbGlzdFR5cGUgPSBuZXcgVHlwZVRva2VuPExpc3Q8U3RyaW5nPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlMaXN0PFN0cmluZz4gaWNvbnNmcm9tSnNvbiA9IGdldEdzb24oKQorCQkJCS5mcm9tSnNvbigoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklDT05TLmdldFByb3BlcnR5KCkpLCBsaXN0VHlwZSk7CisJCXN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uc2V0SWNvbnMoaWNvbnNmcm9tSnNvbik7CisJfQorCisJcHVibGljIFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0b0dyYXBoTWFwKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQsIHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLCBzdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCWFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OT1JNQUxJWkVEX05BTUUsIHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCS8vIFN0cmluZyBpY29ucz1nZXRHc29uKCkudG9Kc29uKHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0SWNvbnMoKSk7CisJCS8vIGFkZElmRXhpc3RzKG1hcCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JQ09OUywgaWNvbnMpOworCQlhZGRJZkV4aXN0cyhtYXAsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSUNPTlMsIHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0SWNvbnMoKSk7CisJCXJldHVybiBtYXA7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZXhjZXB0aW9uL0RlbGV0ZURlcGxveWVkRXhjZXB0aW9uLmphdmEgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9leGNlcHRpb24vRGVsZXRlRGVwbG95ZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQzMjAxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZXhjZXB0aW9uL0RlbGV0ZURlcGxveWVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5leGNlcHRpb247CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb24uVGVjaG5pY2FsRXhjZXB0aW9uOworCisvKioKKyAqIFRocm93biB3aGVuIGEgZGVwbG95ZWQgZW52aXJvbm1lbnQgLyB0b3BvbG9neSBpcyBhYm91dCB0byBiZSBkZWxldGVkCisgKiAKKyAqIEBhdXRob3IgbW91cm91dmkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxldGVEZXBsb3llZEV4Y2VwdGlvbiBleHRlbmRzIFRlY2huaWNhbEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTE5MjgzNDg1NTA1NzE3NzI1Mkw7CisKKwlwdWJsaWMgRGVsZXRlRGVwbG95ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJcHVibGljIERlbGV0ZURlcGxveWVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2V4Y2VwdGlvbi9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbi5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvZXhjZXB0aW9uL0luaXRpYWxpemF0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0MzM3NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2V4Y2VwdGlvbi9Jbml0aWFsaXphdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZXhjZXB0aW9uOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlRlY2huaWNhbEV4Y2VwdGlvbjsKKworLyoqCisgKiBFeGNlcHRpb24gdG8gYmUgdGhyb3duIGluIGNhc2Ugb2YgYW4gZXJyb3IgdGhhdCBwcmV2ZW50cyBhbGllbiB0byBzdGFydHVwLgorICovCitwdWJsaWMgY2xhc3MgSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBUZWNobmljYWxFeGNlcHRpb24geworCXB1YmxpYyBJbml0aWFsaXphdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9leGNlcHRpb24vUmVzb3VyY2VEQU9FeGNlcHRpb24uamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2V4Y2VwdGlvbi9SZXNvdXJjZURBT0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTVjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9leGNlcHRpb24vUmVzb3VyY2VEQU9FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuUmVzb3VyY2VVcGxvYWRTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLlRlY2huaWNhbEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFJlc291cmNlREFPRXhjZXB0aW9uIGV4dGVuZHMgVGVjaG5pY2FsRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE3MTkxNzUyMDg0MjMzNjY1M0w7CisKKwlwcml2YXRlIFJlc291cmNlVXBsb2FkU3RhdHVzIHN0YXR1czsKKworCXB1YmxpYyBSZXNvdXJjZURBT0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VEQU9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorCisJcHVibGljIFJlc291cmNlREFPRXhjZXB0aW9uKFJlc291cmNlVXBsb2FkU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBSZXNvdXJjZURBT0V4Y2VwdGlvbihSZXNvdXJjZVVwbG9hZFN0YXR1cyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VVcGxvYWRTdGF0dXMgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhSZXNvdXJjZVVwbG9hZFN0YXR1cyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9pbXBsL1Jlc291cmNlVXBsb2FkZXIuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL2ltcGwvUmVzb3VyY2VVcGxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzBmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9pbXBsL1Jlc291cmNlVXBsb2FkZXIuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5pbXBsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5JQ2F0YWxvZ0RBTzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLlJlc291cmNlVXBsb2FkU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5hcGkuSVJlc291cmNlVXBsb2FkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRVNBcnRpZmFjdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmV4Y2VwdGlvbi5SZXNvdXJjZURBT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJyZXNvdXJjZS11cGxvYWQiKQorcHVibGljIGNsYXNzIFJlc291cmNlVXBsb2FkZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VVcGxvYWRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BUlRJRkFDVF9JTkRFWF9OQU1FID0gInJlc291cmNlcyI7CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIElDYXRhbG9nREFPIHJlc291cmNlREFPOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZXNvdXJjZVVwbG9hZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAUG9zdENvbnN0cnVjdAorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ01nciA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7CisJCVN0cmluZyBhcnRpZmFjdHNJbmRleCA9IG51bGw7CisJCWFydGlmYWN0c0luZGV4ID0gY29uZmlnTWdyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRBcnRpZmFjdHNJbmRleCgpOworCQlpZiAoYXJ0aWZhY3RzSW5kZXggPT0gbnVsbCB8fCBhcnRpZmFjdHNJbmRleC5pc0VtcHR5KCkpIHsKKwkJCWFydGlmYWN0c0luZGV4ID0gREVGQVVMVF9BUlRJRkFDVF9JTkRFWF9OQU1FOworCQl9CisJCXJlc291cmNlREFPLmFkZFRvSW5kaWNlc01hcChFU0FydGlmYWN0RGF0YS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKSwgYXJ0aWZhY3RzSW5kZXgpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZVVwbG9hZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZVVwbG9hZGVyKElDYXRhbG9nREFPIHJlc291cmNldERBTykgeworCQlzdXBlcigpOworCQl0aGlzLnJlc291cmNlREFPID0gcmVzb3VyY2V0REFPOworCX0KKworCXB1YmxpYyBJQ2F0YWxvZ0RBTyBnZXRSZXNvdXJjZURBTygpIHsKKwkJcmV0dXJuIHJlc291cmNlREFPOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlREFPKElDYXRhbG9nREFPIHJlc291cmNlREFPKSB7CisJCXRoaXMucmVzb3VyY2VEQU8gPSByZXNvdXJjZURBTzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VVcGxvYWRTdGF0dXMgc2F2ZUFydGlmYWN0KEVTQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSwgYm9vbGVhbiBpc1JlbG9hZCkgeworCQlSZXNvdXJjZVVwbG9hZFN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZVVwbG9hZFN0YXR1cy5PSzsKKwkJaWYgKHJlc291cmNlREFPID09IG51bGwpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUluaXRpYWxpemF0aW9uRXJyb3IsCisJCQkJCSJTYXZlIEFydGlmYWN0IC0gaW50ZXJuYWwgb2JqZWN0IG5vdCBpbml0aWFsaXplZCIpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpCisJCQkJCS5sb2dCZUluaXRpYWxpemF0aW9uRXJyb3IoIlNhdmUgQXJ0aWZhY3QgLSBpbnRlcm5hbCBvYmplY3Qgbm90IGluaXRpYWxpemVkIik7CisJCQlsb2cuZGVidWcoInVwZGF0ZSBhcnRpZmFjdCBmYWlsZWQgLSByZXNvdXJjZURBTyBpcyBudWxsIik7CisJCQlyZXR1cm4gUmVzb3VyY2VVcGxvYWRTdGF0dXMuRVJST1I7CisJCX0KKworCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPiBnZXRBcnRpZmFjdFN0YXR1cyA9IGdldEFydGlmYWN0KGFydGlmYWN0RGF0YS5nZXRJZCgpKTsKKwkJaWYgKGdldEFydGlmYWN0U3RhdHVzLmlzTGVmdCgpKSB7CisJCQlzdGF0dXMgPSBSZXNvdXJjZVVwbG9hZFN0YXR1cy5BTFJFQURZX0VYSVNUOworCQkJbG9nLmRlYnVnKCJSZXNvdXJjZVVwbG9hZFN0YXR1czpzYXZlQXJ0aWZhY3QgYXJ0aWZhY3Qgd2l0aCBpZCB7fSBhbHJlYWR5IGV4aXN0LiIsIGFydGlmYWN0RGF0YS5nZXRJZCgpKTsKKwkJCWlmIChpc1JlbG9hZCkgeworCQkJCXN0YXR1cyA9IHVwZGF0ZUFydGlmYWN0KGFydGlmYWN0RGF0YSwgZ2V0QXJ0aWZhY3RTdGF0dXMubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJdHJ5IHsKKworCQkJCXJlc291cmNlREFPLndyaXRlQXJ0aWZhY3QoYXJ0aWZhY3REYXRhKTsKKwkJCQlzdGF0dXMgPSBSZXNvdXJjZVVwbG9hZFN0YXR1cy5PSzsKKworCQkJfSBjYXRjaCAoUmVzb3VyY2VEQU9FeGNlcHRpb24gZSkgeworCQkJCXN0YXR1cyA9IFJlc291cmNlVXBsb2FkU3RhdHVzLkVSUk9SOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLAorCQkJCQkJIlNhdmUgQXJ0aWZhY3QgdG8gZGF0YWJhc2UiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiU2F2ZSBBcnRpZmFjdCB0byBkYXRhYmFzZSIpOworCQkJCWxvZy5kZWJ1ZygiUmVzb3VyY2VVcGxvYWRTdGF0dXM6c2F2ZUFydGlmYWN0IGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiLCBlKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VVcGxvYWRTdGF0dXMgdXBkYXRlQXJ0aWZhY3QoRVNBcnRpZmFjdERhdGEgYXJ0aWZhY3RVcGRhdGVEYXRhKSB7CisJCVJlc291cmNlVXBsb2FkU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlVXBsb2FkU3RhdHVzLk9LOworCQlpZiAocmVzb3VyY2VEQU8gPT0gbnVsbCkKKwkJCXJldHVybiBSZXNvdXJjZVVwbG9hZFN0YXR1cy5FUlJPUjsKKworCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPiBnZXRBcnRpZmFjdFN0YXR1cyA9IGdldEFydGlmYWN0KGFydGlmYWN0VXBkYXRlRGF0YS5nZXRJZCgpKTsKKwkJaWYgKGdldEFydGlmYWN0U3RhdHVzLmlzUmlnaHQoKSkgeworCQkJc3RhdHVzID0gZ2V0QXJ0aWZhY3RTdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJSZXNvdXJjZVVwbG9hZFN0YXR1czp1cGRhdGVBcnRpZmFjdHQgYXJ0aWZhY3Qgd2l0aCBpZCB7fSIsIGFydGlmYWN0VXBkYXRlRGF0YS5nZXRJZCgpCisJCQkJCSsgIiBub3QgZXhpc3QuIik7CisJCX0KKwkJaWYgKGdldEFydGlmYWN0U3RhdHVzLmlzTGVmdCgpKSB7CisJCQlzdGF0dXMgPSB1cGRhdGVBcnRpZmFjdChhcnRpZmFjdFVwZGF0ZURhdGEsIGdldEFydGlmYWN0U3RhdHVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyoKKwkgKiBAT3ZlcnJpZGUgcHVibGljIFJlc291cmNlVXBsb2FkU3RhdHVzCisJICogdXBkYXRlU2VydmljZUFydGlmYWN0KFNlcnZpY2VBcnRpZmFjdERhdGEgYXJ0aWZhY3RVcGRhdGVEYXRhKSB7CisJICogUmVzb3VyY2VVcGxvYWRTdGF0dXMgc3RhdHVzID0gUmVzb3VyY2VVcGxvYWRTdGF0dXMuT0s7IGlmKHJlc291cmNlREFPID09CisJICogbnVsbCkgcmV0dXJuIFJlc291cmNlVXBsb2FkU3RhdHVzLkVSUk9SOyBFaXRoZXI8U2VydmljZUFydGlmYWN0RGF0YSwKKwkgKiBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZ2V0U2VydmljZUFydGlmYWN0U3RhdHVzID0KKwkgKiBnZXRTZXJ2aWNlQXJ0aWZhY3QoYXJ0aWZhY3RVcGRhdGVEYXRhLmdldElkKCkpOworCSAqIAorCSAqIGlmKGdldFNlcnZpY2VBcnRpZmFjdFN0YXR1cy5pc1JpZ2h0KCkpeworCSAqIGxvZy5kZWJ1ZygiUmVzb3VyY2VVcGxvYWRTdGF0dXM6dXBkYXRlQXJ0aWZhY3R0IGFydGlmYWN0IHdpdGggaWQge30gbm90IGV4aXN0LiIsIAorCSAqIGFydGlmYWN0VXBkYXRlRGF0YS5nZXRJZCgpKTsgc3RhdHVzID0KKwkgKiBnZXRTZXJ2aWNlQXJ0aWZhY3RTdGF0dXMucmlnaHQoKS52YWx1ZSgpOyB9CisJICogaWYoZ2V0U2VydmljZUFydGlmYWN0U3RhdHVzLmlzTGVmdCgpKXsgc3RhdHVzID0KKwkgKiB1cGRhdGVTZXJ2aWNlQXJ0aWZhY3QoYXJ0aWZhY3RVcGRhdGVEYXRhLAorCSAqIGdldFNlcnZpY2VBcnRpZmFjdFN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7IH0KKwkgKiAKKwkgKiByZXR1cm4gc3RhdHVzOyB9CisJICogCisJICovCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEVTQXJ0aWZhY3REYXRhLCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gZ2V0QXJ0aWZhY3QoU3RyaW5nIGlkKSB7CisJCWlmIChyZXNvdXJjZURBTyA9PSBudWxsKQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChSZXNvdXJjZVVwbG9hZFN0YXR1cy5FUlJPUik7CisKKwkJcmV0dXJuIHJlc291cmNlREFPLmdldEFydGlmYWN0KGlkKTsKKwl9CisKKwkvKgorCSAqIEBPdmVycmlkZSBwdWJsaWMgRWl0aGVyPFNlcnZpY2VBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPgorCSAqIGdldFNlcnZpY2VBcnRpZmFjdChTdHJpbmcgaWQpIHsgaWYocmVzb3VyY2VEQU8gPT0gbnVsbCkgcmV0dXJuCisJICogRWl0aGVyLnJpZ2h0KFJlc291cmNlVXBsb2FkU3RhdHVzLkVSUk9SKTsKKwkgKiAKKwkgKiByZXR1cm4gcmVzb3VyY2VEQU8uZ2V0U2VydmljZUFydGlmYWN0KGlkKTsgfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlbGV0ZUFydGlmYWN0KFN0cmluZyBpZCkgeworCQlpZiAocmVzb3VyY2VEQU8gIT0gbnVsbCkgeworCQkJcmVzb3VyY2VEQU8uZGVsZXRlQXJ0aWZhY3QoaWQpOworCQl9CisKKwl9CisKKwlwcml2YXRlIFJlc291cmNlVXBsb2FkU3RhdHVzIHVwZGF0ZUFydGlmYWN0KEVTQXJ0aWZhY3REYXRhIGFydGlmYWN0VXBkYXRlRGF0YSwgRVNBcnRpZmFjdERhdGEgZXhpc3REYXRhKSB7CisJCVJlc291cmNlVXBsb2FkU3RhdHVzIHN0YXR1czsKKworCQl1cGRhdGVEYXRhKGFydGlmYWN0VXBkYXRlRGF0YSwgZXhpc3REYXRhKTsKKworCQl0cnkgeworCQkJcmVzb3VyY2VEQU8ud3JpdGVBcnRpZmFjdChhcnRpZmFjdFVwZGF0ZURhdGEpOworCQkJc3RhdHVzID0gUmVzb3VyY2VVcGxvYWRTdGF0dXMuT0s7CisKKwkJfSBjYXRjaCAoUmVzb3VyY2VEQU9FeGNlcHRpb24gZSkgeworCQkJc3RhdHVzID0gUmVzb3VyY2VVcGxvYWRTdGF0dXMuRVJST1I7CisJCQlsb2cuZGVidWcoIlJlc291cmNlVXBsb2FkU3RhdHVzOnVwZGF0ZUFydGlmYWN0IGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiLCBlKTsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVEYXRhKEVTQXJ0aWZhY3REYXRhIGFydGlmYWN0VXBkYXRlRGF0YSwgRVNBcnRpZmFjdERhdGEgZXhpc3REYXRhKSB7CisKKwkJaWYgKGFydGlmYWN0VXBkYXRlRGF0YS5nZXREYXRhKCkgPT0gbnVsbCkgeworCQkJYXJ0aWZhY3RVcGRhdGVEYXRhLnNldERhdGEoZXhpc3REYXRhLmdldERhdGEoKSk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbEFydGlmYWN0cygpIHsKKwkJcmVzb3VyY2VEQU8uZGVsZXRlQWxsQXJ0aWZhY3RzKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9BcnRpZmFjdERhb1Rlc3QuamF2YSBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL0FydGlmYWN0RGFvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWQzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9BcnRpZmFjdERhb1Rlc3QuamF2YQpAQCAtMCwwICsxLDU3NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guYWN0aW9uLmFkbWluLmluZGljZXMuZGVsZXRlLkRlbGV0ZUluZGV4UmVxdWVzdDsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uYWRtaW4uaW5kaWNlcy5kZWxldGUuRGVsZXRlSW5kZXhSZXNwb25zZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuSUdlbmVyaWNTZWFyY2hEQU87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5SZXNvdXJjZVVwbG9hZFN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZXMuRWxhc3RpY1NlYXJjaENsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuYXBpLklSZXNvdXJjZVVwbG9hZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkVTQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LkNvbnRleHRDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LlRlc3RFeGVjdXRpb25MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuanVuaXQ0LlNwcmluZ0pVbml0NENsYXNzUnVubmVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LnN1cHBvcnQuRGVwZW5kZW5jeUluamVjdGlvblRlc3RFeGVjdXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5zdXBwb3J0LkRpcnRpZXNDb250ZXh0VGVzdEV4ZWN1dGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxUZXN0RXhlY3V0aW9uTGlzdGVuZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQFJ1bldpdGgoU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitAQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKK0BUZXN0RXhlY3V0aW9uTGlzdGVuZXJzKGxpc3RlbmVycyA9IHsgRGVwZW5kZW5jeUluamVjdGlvblRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzcywKKwkJRGlydGllc0NvbnRleHRUZXN0RXhlY3V0aW9uTGlzdGVuZXIuY2xhc3MsIFRyYW5zYWN0aW9uYWxUZXN0RXhlY3V0aW9uTGlzdGVuZXIuY2xhc3MgfSkgLy8gLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gQ2Fzc2FuZHJhVW5pdFRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzc30pCisvLyBARW1iZWRkZWRDYXNzYW5kcmEoaG9zdCA9ImxvY2FsaG9zdCIsIHBvcnQ9OTA0MikKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdERhb1Rlc3QgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lNQUdFU19ESVJFQ1RPUlkgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2ltYWdlcyI7CisKKwlAUmVzb3VyY2UKKwlFbGFzdGljU2VhcmNoQ2xpZW50IGVzY2xpZW50OworCisJLyoKKwkgKiBAUmVzb3VyY2UobmFtZSA9ICJhcnRpZmFjdC1kYW8iKSBwcml2YXRlIElBcnRpZmFjdERBTyBhcnRpZmFjdERBTzsKKwkgKi8KKworCUBSZXNvdXJjZShuYW1lID0gInJlc291cmNlLXVwbG9hZCIpCisJcHJpdmF0ZSBJUmVzb3VyY2VVcGxvYWRlciBkYW9VcGxvYWRlcjsKKwlFU0FydGlmYWN0RGF0YSBhckRhdGE7CisKKwlAUmVzb3VyY2UobmFtZSA9ICJyZXNvdXJjZS1kYW8iKQorCXByaXZhdGUgSUdlbmVyaWNTZWFyY2hEQU8gcmVzb3VyY2VEQU87CisKKwlwcml2YXRlIFN0cmluZyBub2RlVHlwZSA9ICJOb2RlVHlwZTEiOworCXByaXZhdGUgU3RyaW5nIG5vZGVUeXBlVmVyc2lvbiA9ICIxLjAuMCI7CisKKwlwcml2YXRlIFN0cmluZyBub2RlVHlwZTIgPSAiTm9kZVR5cGUyIjsKKwlwcml2YXRlIFN0cmluZyBub2RlVHlwZVZlcnNpb24yID0gIjEuMC4xIjsKKworCXByaXZhdGUgU3RyaW5nIG5vZGVUeXBlMyA9ICJOb2RlVHlwZTMiOworCXByaXZhdGUgU3RyaW5nIG5vZGVOeXBlVmVyc2lvbjMgPSAiMS4xLjEiOworCisJcHJpdmF0ZSBTdHJpbmcgdG9wb2xvZ3lJZCA9ICJ0b3BvbG9neSI7CisJcHJpdmF0ZSBTdHJpbmcgdG9wb2xvZ3lUZW1wbGF0ZU5hbWUgPSAidG9wb2xvZ3lUZW1wbGF0ZSI7CisJcHJpdmF0ZSBTdHJpbmcgdG9wb2xvZ3lUZW1wbGF0ZVZlcnNpb24gPSAiMS4xLjEiOworCisJcHJpdmF0ZSBTdHJpbmcgbm9kZVR5cGVUZW1wbGF0ZTEgPSAiTm9kZVR5cGVUZW1wbGF0ZTEiOworCXByaXZhdGUgU3RyaW5nIG5vZGVUeXBlVGVtcGxhdGUyID0gIk5vZGVUeXBlVGVtcGxhdGUyIjsKKwlwcml2YXRlIFN0cmluZyBub2RlVHlwZVRlbXBsYXRlMyA9ICJOb2RlVHlwZVRlbXBsYXRlMyI7CisKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB7CisJCS8vIHRyeSB7CisJCS8vIGNsZWFySW5kZXgoSUNhdGFsb2dEQU8uUkVTT1VSQ0VTX0lOREVYLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQkvLyBjbGVhckluZGV4KElDYXRhbG9nREFPLlJFU09VUkNFU19JTkRFWCwgU2VydmljZUFydGlmYWN0RGF0YS5jbGFzcyk7CisJCS8vIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOworCQkvLyB9CisKKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBCZWZvcmVDbGFzcygpIHsKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcE5hbWUoImNhdGFsb2ctZGFvIik7CisJCVN0cmluZyBhcHBDb25maWdEaXIgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWRhbyI7CisJCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksCisJCQkJYXBwQ29uZmlnRGlyKTsKKwkJY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisJfQorCisJLy8gQEJlZm9yZQorCS8vIHB1YmxpYyB2b2lkIGNyZWF0ZVNjaGVtYSgpeworCS8vIFNkY1NjaGVtYUJ1aWxkZXIuY3JlYXRlU2NoZW1hKCk7CisJLy8gfQorCS8vCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTYXZlTmV3QXJ0aWZhY3QoKSB7CisJCS8vIGRhb1VwbG9hZGVyID0gbmV3IEFydGlmYWN0VXBsb2FkZXIoYXJ0aWZhY3REQU8pOworCQlpZiAoZGFvVXBsb2FkZXIgPT0gbnVsbCkgeworCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7CisJCX0KKwkJU3RyaW5nIHN0ckRhdGEgPSAicXdlcXdxd2VxdzM0ZTR3cndlciI7CisKKwkJU3RyaW5nIG15Tm9kZVR5cGUgPSAiTXlOZXdOb2RlVHlwZSI7CisKKwkJRVNBcnRpZmFjdERhdGEgYXJEYXRhID0gbmV3IEVTQXJ0aWZhY3REYXRhKCJhcnRpZmFjdE5ld01hcmluYTExIiwgc3RyRGF0YS5nZXRCeXRlcygpKTsKKworCQlSZXNvdXJjZVVwbG9hZFN0YXR1cyBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlQXJ0aWZhY3QoYXJEYXRhLCB0cnVlKTsKKworCQlhc3NlcnRFcXVhbHMoc3RhdHVzLCBSZXNvdXJjZVVwbG9hZFN0YXR1cy5PSyk7CisKKwkJZGFvVXBsb2FkZXIuZGVsZXRlQXJ0aWZhY3QoYXJEYXRhLmdldElkKCkpOworCisJfQorCisJLyoKKwkgKiBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2F2ZU5ld0ltYWdlKCl7CisJICogCisJICogUGF0aCBpY29uUGF0aCA9IFBhdGhzLmdldChURVNUX0lNQUdFU19ESVJFQ1RPUlksICJhcGFjaGUucG5nIik7CisJICogCisJICogSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoKTsgdHJ5IHsKKwkgKiBpbWFnZURhdGEuc2V0RGF0YShGaWxlcy5yZWFkQWxsQnl0ZXMoaWNvblBhdGgpKTsKKwkgKiBpbWFnZURhdGEuc2V0Q29tcG9uZW50TmFtZSgiQ29tcG9uZW50TWFyaW5hIik7CisJICogaW1hZ2VEYXRhLnNldENvbXBvbmVudFZlcnNpb24oInYuMS4wIik7CisJICogaW1hZ2VEYXRhLnNldEFydGlmYWN0TmFtZSgiYXBhY2hlLnBuZyIpOworCSAqIGltYWdlRGF0YS5zZXRSZXNvdXJjZUNyZWF0b3IoIk1hcmluYSIpOworCSAqIGltYWdlRGF0YS5zZXRSZXNvdXJjZUxhc3RVcGRhdGVyKCJNYXJpbmEiKTsgUmVzb3VyY2VVcGxvYWRTdGF0dXMgc3RhdHVzID0KKwkgKiBkYW9VcGxvYWRlci5zYXZlSW1hZ2UoaW1hZ2VEYXRhLCB0cnVlKTsgYXNzZXJ0RXF1YWxzKHN0YXR1cywKKwkgKiBSZXNvdXJjZVVwbG9hZFN0YXR1cy5PSyk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgLy8gVE9ETworCSAqIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrIGUucHJpbnRTdGFja1RyYWNlKCk7IH0KKwkgKiAKKwkgKiAKKwkgKiB9CisJICovCisKKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdHNMaXN0KCkgeworCS8vIC8vZGFvVXBsb2FkZXIgPSBuZXcgQXJ0aWZhY3RVcGxvYWRlcihhcnRpZmFjdERBTyk7CisJLy8gaWYoZGFvVXBsb2FkZXI9PW51bGwpeworCS8vIGFzc2VydFRydWUoZmFsc2UpOworCS8vIH0KKwkvLyBTdHJpbmcgbXlOb2RlVHlwZSA9ICJNeUxpc3ROb2RlVHlwZSI7CisJLy8KKwkvLworCS8vCisJLy8gLy9yZXNvdXJjZURBTy5zYXZlKGluZGV4ZWROb2RlVHlwZSk7CisJLy8KKwkvLyBTdHJpbmcgc3RyRGF0YSA9ICJxd2Vxd3F3ZXF3MzRlNHdyd2VyIjsKKwkvLyBFU0FydGlmYWN0RGF0YSBhckRhdGExID0gbmV3IEVTQXJ0aWZhY3REYXRhKCJhcnRpZmFjdE5ld01hcmluYV8xIiwKKwkvLyBzdHJEYXRhLmdldEJ5dGVzKCkpOworCS8vCisJLy8KKwkvLyBSZXNvdXJjZVVwbG9hZFN0YXR1cyBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlQXJ0aWZhY3QoYXJEYXRhMSwgdHJ1ZSk7CisJLy8gYXNzZXJ0RXF1YWxzKHN0YXR1cywgUmVzb3VyY2VVcGxvYWRTdGF0dXMuT0spOworCS8vCisJLy8gRVNBcnRpZmFjdERhdGEgYXJEYXRhMiA9IG5ldyBFU0FydGlmYWN0RGF0YSgiYXJ0aWZhY3ROZXdNYXJpbmFfMiIsCisJLy8gc3RyRGF0YS5nZXRCeXRlcygpKTsKKwkvLworCS8vCisJLy8gc3RhdHVzID0gZGFvVXBsb2FkZXIuc2F2ZUFydGlmYWN0KGFyRGF0YTIsIHRydWUpOworCS8vIGFzc2VydEVxdWFscyhzdGF0dXMsIFJlc291cmNlVXBsb2FkU3RhdHVzLk9LKTsKKwkvLworCS8vIEVTQXJ0aWZhY3REYXRhIGFyRGF0YTMgPSBuZXcgRVNBcnRpZmFjdERhdGEoImFydGlmYWN0TmV3TWFyaW5hXzMiLAorCS8vIHN0ckRhdGEuZ2V0Qnl0ZXMoKSk7CisJLy8KKwkvLworCS8vIHN0YXR1cyA9IGRhb1VwbG9hZGVyLnNhdmVBcnRpZmFjdChhckRhdGEzLCB0cnVlKTsKKwkvLyBhc3NlcnRFcXVhbHMoc3RhdHVzLCBSZXNvdXJjZVVwbG9hZFN0YXR1cy5PSyk7CisJLy8KKwkvLworCS8vCisJLy8gRWl0aGVyPExpc3Q8RVNBcnRpZmFjdERhdGE+LCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4gYXJyQXJyYXkgPQorCS8vIGRhb1VwbG9hZGVyLmdldEFydGlmYWN0cyhteU5vZGVUeXBlLCBub2RlVHlwZVZlcnNpb24pOworCS8vIGFzc2VydFRydWUoYXJyQXJyYXkuaXNMZWZ0KCkpOworCS8vCisJLy8gYXNzZXJ0RXF1YWxzKDMsIGFyckFycmF5LmxlZnQoKS52YWx1ZSgpLnNpemUoKSk7CisJLy8KKwkvLyBkYW9VcGxvYWRlci5kZWxldGVBcnRpZmFjdChhckRhdGExLmdldElkKCkpOworCS8vIGRhb1VwbG9hZGVyLmRlbGV0ZUFydGlmYWN0KGFyRGF0YTIuZ2V0SWQoKSk7CisJLy8gZGFvVXBsb2FkZXIuZGVsZXRlQXJ0aWZhY3QoYXJEYXRhMy5nZXRJZCgpKTsKKwkvLworCS8vIC8vcmVzb3VyY2VEQU8uZGVsZXRlKEluZGV4ZWROb2RlVHlwZS5jbGFzcywgaW5kZXhlZE5vZGVUeXBlLmdldElkKCkpOworCS8vCisJLy8gfQorCS8vCisKKwkvKgorCSAqIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHZXRTZXZpY2VBcnRpZmFjdHNMaXN0KCkgeworCSAqIAorCSAqIGlmKGRhb1VwbG9hZGVyPT1udWxsKXsgYXNzZXJ0VHJ1ZShmYWxzZSk7IH0gU3RyaW5nIHN0ckRhdGEgPQorCSAqICJxd2Vxd3F3ZXF3MzRlNHdyd2VyIjsKKwkgKiAKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhIHNlcnZpY2VBckRhdGEgPSBuZXcKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhKCJzZXJ2aWNlQXJEYXRhIiwgdG9wb2xvZ3lUZW1wbGF0ZU5hbWUsCisJICogdG9wb2xvZ3lUZW1wbGF0ZVZlcnNpb24sIG5vZGVUeXBlVGVtcGxhdGUxLCBub2RlVHlwZSwgbm9kZVR5cGVWZXJzaW9uLAorCSAqICJZQU5HIiwgc3RyRGF0YS5nZXRCeXRlcygpLCBzdHJEYXRhLmdldEJ5dGVzKCksICJNYXJpbmEiLCBudWxsKTsKKwkgKiAvL3NlcnZpY2VBckRhdGEuc2V0UmVmQXJ0aWZhY3RJZChhckRhdGEuZ2V0SWQoKSk7IFJlc291cmNlVXBsb2FkU3RhdHVzCisJICogc3RhdHVzID0gZGFvVXBsb2FkZXIuc2F2ZVNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlQXJEYXRhLCB0cnVlKTsKKwkgKiAKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhIHNlcnZpY2VBckRhdGExID0gbmV3CisJICogU2VydmljZUFydGlmYWN0RGF0YSgic2VydmljZUFyRGF0YTEiLCB0b3BvbG9neVRlbXBsYXRlTmFtZSwKKwkgKiB0b3BvbG9neVRlbXBsYXRlVmVyc2lvbiwgbm9kZVR5cGVUZW1wbGF0ZTIsIG5vZGVUeXBlMiwgbm9kZVR5cGVWZXJzaW9uMiwKKwkgKiAiWUFORyIsIHN0ckRhdGEuZ2V0Qnl0ZXMoKSwgc3RyRGF0YS5nZXRCeXRlcygpLCAiTWFyaW5hIiwgbnVsbCk7CisJICogLy9zZXJ2aWNlQXJEYXRhMS5zZXRSZWZBcnRpZmFjdElkKGFyRGF0YTQuZ2V0SWQoKSk7IHN0YXR1cyA9CisJICogZGFvVXBsb2FkZXIuc2F2ZVNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlQXJEYXRhMSwgdHJ1ZSk7CisJICogU2VydmljZUFydGlmYWN0RGF0YSBnZXRTZXJ2aWNlRGF0YSA9CisJICogZGFvVXBsb2FkZXIuZ2V0U2VydmljZUFydGlmYWN0KHNlcnZpY2VBckRhdGEuZ2V0SWQoKSkubGVmdCgpLnZhbHVlKCk7CisJICogCisJICogTGlzdDxTZXJ2aWNlQXJ0aWZhY3REYXRhPiBhcnJBcnJheSA9CisJICogZGFvVXBsb2FkZXIuZ2V0U2VydmljZUFydGlmYWN0cyh0b3BvbG9neVRlbXBsYXRlTmFtZSwKKwkgKiB0b3BvbG9neVRlbXBsYXRlVmVyc2lvbikubGVmdCgpLnZhbHVlKCk7CisJICogCisJICogYXNzZXJ0RXF1YWxzKDIsIGFyckFycmF5LnNpemUoKSk7CisJICogCisJICogZGFvVXBsb2FkZXIuZGVsZXRlQXJ0aWZhY3Qoc2VydmljZUFyRGF0YS5nZXRJZCgpKTsKKwkgKiBkYW9VcGxvYWRlci5kZWxldGVBcnRpZmFjdChzZXJ2aWNlQXJEYXRhMS5nZXRJZCgpKTsKKwkgKiAKKwkgKiAKKwkgKiB9CisJICovCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdCgpIHsKKworCQlTdHJpbmcgbXlOb2RlVHlwZSA9ICJNeU5vZGVUeXBlIjsKKworCQkvLyByZXNvdXJjZURBTy5zYXZlKGluZGV4ZWROb2RlVHlwZSk7CisJCUVTQXJ0aWZhY3REYXRhIGFyRGF0YSA9IGdldEFydGlmYWN0RGF0YShteU5vZGVUeXBlLCBub2RlVHlwZVZlcnNpb24pOworCisJCUVTQXJ0aWZhY3REYXRhIGdldERhdGEgPSBudWxsOworCQlFaXRoZXI8RVNBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPiBnZXRBcnRpZmFjdFN0YXR1cyA9IGRhb1VwbG9hZGVyCisJCQkJLmdldEFydGlmYWN0KG15Tm9kZVR5cGUgKyAiLSBkYXNzYXNkIiArICI6IiArIG5vZGVUeXBlVmVyc2lvbiArICI6dXBkYXRlZEFydGlmYWN0Iik7CisJCWlmIChnZXRBcnRpZmFjdFN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWRhb1VwbG9hZGVyLnNhdmVBcnRpZmFjdChhckRhdGEsIHRydWUpOworCQkJZ2V0QXJ0aWZhY3RTdGF0dXMgPSBkYW9VcGxvYWRlci5nZXRBcnRpZmFjdChhckRhdGEuZ2V0SWQoKSk7CisJCX0KKwkJYXNzZXJ0Tm90TnVsbChnZXRBcnRpZmFjdFN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKKwkvKgorCSAqIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHZXRTZXZpY2VBcnRpZmFjdCgpIHsKKwkgKiAKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhIHNlcnZBckRhdGEgPSBnZXRTZXJ2aWNlQXJ0aWZhY3REYXRhKCk7CisJICogCisJICogRWl0aGVyPFNlcnZpY2VBcnRpZmFjdERhdGEsIFJlc291cmNlVXBsb2FkU3RhdHVzPgorCSAqIGdldFNlcnZpY2VBcnRpZmFjdFN0YXR1cyA9CisJICogZGFvVXBsb2FkZXIuZ2V0U2VydmljZUFydGlmYWN0KCJNeVNlcnZpY2U6di4xLjE6dXBkYXRlZFNlcnZpY2VBcnRpZmFjdCIpOworCSAqIGlmICghZ2V0U2VydmljZUFydGlmYWN0U3RhdHVzLmlzTGVmdCgpKXsKKwkgKiBkYW9VcGxvYWRlci5zYXZlU2VydmljZUFydGlmYWN0KHNlcnZBckRhdGEsIHRydWUpOworCSAqIGdldFNlcnZpY2VBcnRpZmFjdFN0YXR1cyA9CisJICogZGFvVXBsb2FkZXIuZ2V0U2VydmljZUFydGlmYWN0KHNlcnZBckRhdGEuZ2V0SWQoKSk7IH0KKwkgKiAKKwkgKiBhc3NlcnROb3ROdWxsKGdldFNlcnZpY2VBcnRpZmFjdFN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisJICogCisJICogZGFvVXBsb2FkZXIuZGVsZXRlQXJ0aWZhY3QoZ2V0U2VydmljZUFydGlmYWN0U3RhdHVzLmxlZnQoKS52YWx1ZSgpLmdldElkKAorCSAqICkpOworCSAqIAorCSAqIAorCSAqIH0KKwkgKi8KKworCS8qCisJICogQFRlc3QgcHVibGljIHZvaWQgdGVzdEdldFNldmljZUFydGlmYWN0c0NvbGxlY3Rpb24oKSB7CisJICogCisJICogcHJlcGFyZVRvcG9sZ3lTZXJ2aWNlKCk7IHByZXBhcmVUZXN0VG9wb2xneVNlcnZpY2UoKTsKKwkgKiBFaXRoZXI8U2VydmljZUFydGlmYWN0c0RhdGFDb2xsZWN0aW9uLCBSZXNvdXJjZVVwbG9hZFN0YXR1cz4KKwkgKiBnZXRTZXJ2aWNlQXJ0aWZhY3RzQ29sbGVjdGlvblN0YXR1cyA9CisJICogZGFvVXBsb2FkZXIuZ2V0U2VydmljZUFydGlmYWN0c0NvbGxlY3Rpb24odG9wb2xvZ3lUZW1wbGF0ZU5hbWUsCisJICogdG9wb2xvZ3lUZW1wbGF0ZVZlcnNpb24pOyBTZXJ2aWNlQXJ0aWZhY3RzRGF0YUNvbGxlY3Rpb24gc2VydmljZUF0cmlmYWN0cworCSAqID0gZ2V0U2VydmljZUFydGlmYWN0c0NvbGxlY3Rpb25TdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJICogCisJICogTWFwPFN0cmluZywgTGlzdDxBcnRpZmFjdERhdGE+PiBtYXAgPQorCSAqIHNlcnZpY2VBdHJpZmFjdHMuZ2V0U2VydmljZUFydGlmYWN0RGF0YU1hcCgpOworCSAqIAorCSAqIExpc3Q8QXJ0aWZhY3REYXRhPiBsaXN0ID0gbWFwLmdldChub2RlVHlwZSk7IGFzc2VydE5vdE51bGwobGlzdCk7CisJICogYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKwkgKiAKKwkgKiAKKwkgKiBsaXN0ID0gbWFwLmdldChub2RlVHlwZVRlbXBsYXRlMSApOyBhc3NlcnROb3ROdWxsKGxpc3QpOyBhc3NlcnRFcXVhbHMoMSwKKwkgKiBsaXN0LnNpemUoKSk7CisJICogCisJICogbGlzdCA9IG1hcC5nZXQobm9kZVR5cGVUZW1wbGF0ZTIgKTsgYXNzZXJ0Tm90TnVsbChsaXN0KTsgYXNzZXJ0RXF1YWxzKDEsCisJICogbGlzdC5zaXplKCkpOworCSAqIAorCSAqIAorCSAqIH0KKwkgKi8KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFydGlmYWN0KCkgeworCQkvLyBkYW9VcGxvYWRlciA9IG5ldyBBcnRpZmFjdFVwbG9hZGVyKGFydGlmYWN0REFPKTsKKwkJaWYgKGRhb1VwbG9hZGVyID09IG51bGwpIHsKKwkJCWFzc2VydFRydWUoZmFsc2UpOworCQl9CisJCVJlc291cmNlVXBsb2FkU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlVXBsb2FkU3RhdHVzLk9LOworCisJCVN0cmluZyBteU5vZGVUeXBlID0gIk15VXBkYXRlZE5vZGVUeXBlIjsKKworCQkvLyByZXNvdXJjZURBTy5zYXZlKGluZGV4ZWROb2RlVHlwZSk7CisKKwkJRVNBcnRpZmFjdERhdGEgYXJEYXRhID0gZ2V0QXJ0aWZhY3REYXRhKG15Tm9kZVR5cGUsIG5vZGVUeXBlVmVyc2lvbik7CisJCUVpdGhlcjxFU0FydGlmYWN0RGF0YSwgUmVzb3VyY2VVcGxvYWRTdGF0dXM+IGdldEFydGlmYWN0U3RhdHVzID0gZGFvVXBsb2FkZXIuZ2V0QXJ0aWZhY3QoYXJEYXRhLmdldElkKCkpOworCisJCWlmICghZ2V0QXJ0aWZhY3RTdGF0dXMuaXNMZWZ0KCkpCisJCQlzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlQXJ0aWZhY3QoYXJEYXRhLCBmYWxzZSk7CisKKwkJU3RyaW5nIHBheWxvYWQxID0gIm5ldyBwYXlsb2FkamZkc2doIjsKKwkJYXJEYXRhLnNldERhdGFBc0FycmF5KHBheWxvYWQxLmdldEJ5dGVzKCkpOworCisJCXN0YXR1cyA9IGRhb1VwbG9hZGVyLnVwZGF0ZUFydGlmYWN0KGFyRGF0YSk7CisKKwkJYXNzZXJ0RXF1YWxzKHN0YXR1cywgUmVzb3VyY2VVcGxvYWRTdGF0dXMuT0spOworCQkvLyByZXNvdXJjZURBTy5kZWxldGUoSW5kZXhlZE5vZGVUeXBlLmNsYXNzLCBpbmRleGVkTm9kZVR5cGUuZ2V0SWQoKSk7CisKKwl9CisKKwlwcml2YXRlIEVTQXJ0aWZhY3REYXRhIGdldEFydGlmYWN0RGF0YShTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudFZlcnNpb24pIHsKKwkJU3RyaW5nIHN0ckRhdGEgPSAicXdlcXdxd2VxdzM0ZTR3cndlciI7CisJCUVTQXJ0aWZhY3REYXRhIGFyRGF0YSA9IG5ldyBFU0FydGlmYWN0RGF0YSgidXBkYXRlZEFydGlmYWN0Iiwgc3RyRGF0YS5nZXRCeXRlcygpKTsKKworCQlyZXR1cm4gYXJEYXRhOworCX0KKworCS8qCisJICogcHJpdmF0ZSBTZXJ2aWNlQXJ0aWZhY3REYXRhIGdldFNlcnZpY2VBcnRpZmFjdERhdGEoKXsgU3RyaW5nIHN0ckRhdGEgPQorCSAqICJxd2Vxd3F3ZXF3MzRlNHdyd2VyIjsgU2VydmljZUFydGlmYWN0RGF0YSBhckRhdGEgPSBuZXcKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhKCJ1cGRhdGVkU2VydmljZUFydGlmYWN0IiwgIk15U2VydmljZSIsICJ2LjEuMSIsCisJICogIk15Q29tcG9uZW50VGVtcGxhdGUiLCAiTXlDb21wb25lbnQiLCAidi4xLjEiLCAiWUFORyIsCisJICogc3RyRGF0YS5nZXRCeXRlcygpLCBzdHJEYXRhLmdldEJ5dGVzKCksICJNYXJpbmEiLCBudWxsKTsKKwkgKiAKKwkgKiByZXR1cm4gYXJEYXRhOyB9CisJICovCisKKwkvKgorCSAqIHByaXZhdGUgdm9pZCBwcmVwYXJlVG9wb2xneVNlcnZpY2UoKXsKKwkgKiAKKwkgKiBMaXN0PFN0cmluZz4gbGlzdENhcCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOyBsaXN0Q2FwLmFkZCgidmVyeV9ldmlsIik7CisJICogTGlzdDxTdHJpbmc+IGxpc3RDYXAxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IGxpc3RDYXAuYWRkKCJldmlsIik7CisJICogdHJ5eyAvLyBJbml0aWFsaXplIHRlc3QgZGF0YSBJbmRleGVkTm9kZVR5cGUgaW5kZXhlZE5vZGVUeXBlID0gbmV3CisJICogSW5kZXhlZE5vZGVUeXBlKCk7IENTQVJEZXBlbmRlbmN5IGRlcCA9IG5ldyBDU0FSRGVwZW5kZW5jeSgpOworCSAqIGRlcC5zZXROYW1lKG5vZGVUeXBlKTsgZGVwLnNldFZlcnNpb24obm9kZVR5cGVWZXJzaW9uKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUuc2V0RWxlbWVudElkKG5vZGVUeXBlKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUuc2V0QXJjaGl2ZU5hbWUobm9kZVR5cGUpOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXRBcmNoaXZlVmVyc2lvbihub2RlVHlwZVZlcnNpb24pOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSk7CisJICogaW5kZXhlZE5vZGVUeXBlLnNldExhc3RVcGRhdGVEYXRlKG5ldyBEYXRlKCkpOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXREZWZhdWx0Q2FwYWJpbGl0aWVzKGxpc3RDYXApOworCSAqIHJlc291cmNlREFPLnNhdmUoaW5kZXhlZE5vZGVUeXBlKTsKKwkgKiAKKwkgKiAKKwkgKiBJbmRleGVkTm9kZVR5cGUgaW5kZXhlZE5vZGVUeXBlMSA9IG5ldyBJbmRleGVkTm9kZVR5cGUoKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUxLnNldEVsZW1lbnRJZChub2RlVHlwZTIpOworCSAqIGluZGV4ZWROb2RlVHlwZTEuc2V0QXJjaGl2ZU5hbWUobm9kZVR5cGUyKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUxLnNldEFyY2hpdmVWZXJzaW9uKG5vZGVUeXBlVmVyc2lvbjIpOyBDU0FSRGVwZW5kZW5jeSBkZXAxCisJICogPSBuZXcgQ1NBUkRlcGVuZGVuY3koKTsgZGVwMS5zZXROYW1lKG5vZGVUeXBlMik7CisJICogZGVwMS5zZXRWZXJzaW9uKG5vZGVUeXBlVmVyc2lvbjIpOyBpbmRleGVkTm9kZVR5cGUxLnNldENyZWF0aW9uRGF0ZShuZXcKKwkgKiBEYXRlKCkpOyBpbmRleGVkTm9kZVR5cGUxLnNldExhc3RVcGRhdGVEYXRlKG5ldyBEYXRlKCkpOworCSAqIGluZGV4ZWROb2RlVHlwZTEuc2V0RGVmYXVsdENhcGFiaWxpdGllcyhsaXN0Q2FwMSk7CisJICogcmVzb3VyY2VEQU8uc2F2ZShpbmRleGVkTm9kZVR5cGUxKTsKKwkgKiAKKwkgKiAKKwkgKiBpbmRleGVkTm9kZVR5cGUuc2V0RWxlbWVudElkKG5vZGVUeXBlMyk7CisJICogaW5kZXhlZE5vZGVUeXBlLnNldEFyY2hpdmVOYW1lKG5vZGVUeXBlMyk7CisJICogaW5kZXhlZE5vZGVUeXBlLnNldEFyY2hpdmVWZXJzaW9uKG5vZGVOeXBlVmVyc2lvbjMpOyBDU0FSRGVwZW5kZW5jeSBkZXAyCisJICogPSBuZXcgQ1NBUkRlcGVuZGVuY3koKTsgZGVwMi5zZXROYW1lKG5vZGVUeXBlMyk7CisJICogZGVwMi5zZXRWZXJzaW9uKG5vZGVOeXBlVmVyc2lvbjMpOyBpbmRleGVkTm9kZVR5cGUuc2V0Q3JlYXRpb25EYXRlKG5ldworCSAqIERhdGUoKSk7IGluZGV4ZWROb2RlVHlwZS5zZXRMYXN0VXBkYXRlRGF0ZShuZXcgRGF0ZSgpKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUuc2V0RGVmYXVsdENhcGFiaWxpdGllcyhudWxsKTsKKwkgKiByZXNvdXJjZURBTy5zYXZlKGluZGV4ZWROb2RlVHlwZSk7IFN0cmluZyBvc2dpbGlhdGgxMDBJZCA9CisJICogaW5kZXhlZE5vZGVUeXBlLmdldElkKCk7CisJICogCisJICogVG9wb2xvZ3kgdG9wb2xvZ3kgPSBuZXcgVG9wb2xvZ3koKTsgdG9wb2xvZ3kuc2V0SWQodG9wb2xvZ3lJZCk7CisJICogU2V0PENTQVJEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaFNldDxDU0FSRGVwZW5kZW5jeT4oKTsKKwkgKiBkZXBlbmRlbmNpZXMuYWRkKGRlcCk7IGRlcGVuZGVuY2llcy5hZGQoZGVwMik7IGRlcGVuZGVuY2llcy5hZGQoZGVwMSk7CisJICogdG9wb2xvZ3kuc2V0RGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcyk7IE1hcDxTdHJpbmcsIE5vZGVUZW1wbGF0ZT4KKwkgKiBub2RlVGVtcGxhdGVzID0gbmV3IEhhc2hNYXAgPFN0cmluZywgTm9kZVRlbXBsYXRlPigpOworCSAqIAorCSAqIE5vZGVUZW1wbGF0ZSB0ZW1wbGF0ZTEgPSBuZXcgTm9kZVRlbXBsYXRlKG5vZGVUeXBlLCBudWxsLCBudWxsLCBudWxsLAorCSAqIG51bGwsIG51bGwsIG51bGwpOyB0ZW1wbGF0ZTEuc2V0TmFtZShub2RlVHlwZVRlbXBsYXRlMSk7CisJICogbm9kZVRlbXBsYXRlcy5wdXQobm9kZVR5cGVUZW1wbGF0ZTEsIHRlbXBsYXRlMSApOworCSAqIAorCSAqIE5vZGVUZW1wbGF0ZSB0ZW1wbGF0ZTIgPSBuZXcgTm9kZVRlbXBsYXRlKG5vZGVUeXBlMiwgbnVsbCwgbnVsbCwgbnVsbCwKKwkgKiBudWxsLCBudWxsLCBudWxsKTsgdGVtcGxhdGUyLnNldE5hbWUobm9kZVR5cGVUZW1wbGF0ZTIgKTsKKwkgKiBub2RlVGVtcGxhdGVzLnB1dChub2RlVHlwZVRlbXBsYXRlMiwgdGVtcGxhdGUyICk7CisJICogCisJICogTm9kZVRlbXBsYXRlIHRlbXBsYXRlMyA9IG5ldyBOb2RlVGVtcGxhdGUobm9kZVR5cGUsIG51bGwsIG51bGwsIG51bGwsCisJICogbnVsbCwgbnVsbCwgbnVsbCk7IHRlbXBsYXRlMy5zZXROYW1lKG5vZGVUeXBlVGVtcGxhdGUzICk7CisJICogbm9kZVRlbXBsYXRlcy5wdXQobm9kZVR5cGVUZW1wbGF0ZTMsIHRlbXBsYXRlMyk7CisJICogCisJICogdG9wb2xvZ3kuc2V0Tm9kZVRlbXBsYXRlcyhub2RlVGVtcGxhdGVzKTsgcmVzb3VyY2VEQU8uc2F2ZSh0b3BvbG9neSk7CisJICogCisJICogVG9wb2xvZ3lUZW1wbGF0ZSB0b3BvbG9neVRlbXBsYXRlID0gbmV3IFRvcG9sb2d5VGVtcGxhdGUoKTsKKwkgKiB0b3BvbG9neVRlbXBsYXRlLnNldElkKHRvcG9sb2d5VGVtcGxhdGVOYW1lKTsKKwkgKiB0b3BvbG9neVRlbXBsYXRlLnNldE5hbWUodG9wb2xvZ3lUZW1wbGF0ZU5hbWUpOworCSAqIHRvcG9sb2d5VGVtcGxhdGUuc2V0VG9wb2xvZ3lJZCh0b3BvbG9neS5nZXRJZCgpKTsKKwkgKiB0b3BvbG9neVRlbXBsYXRlLnNldERlc2NyaXB0aW9uKCJteSB0b3BvbG9neSB0ZW1wbGF0ZSIpOworCSAqIHJlc291cmNlREFPLnNhdmUodG9wb2xvZ3lUZW1wbGF0ZSk7CisJICogCisJICogU3RyaW5nIHN0ckRhdGEgPSAicXdlcXdxd2VxdzM0ZTR3cndlciI7IEFydGlmYWN0RGF0YSBhckRhdGEgPSBuZXcKKwkgKiBBcnRpZmFjdERhdGEoImFydGlmYWN0MSIsIG5vZGVUeXBlLCBub2RlVHlwZVZlcnNpb24sICJZQU5HIiwKKwkgKiBzdHJEYXRhLmdldEJ5dGVzKCksIHN0ckRhdGEuZ2V0Qnl0ZXMoKSwgIk1hcmluYSIpOyBBcnRpZmFjdERhdGEgYXJEYXRhMSA9CisJICogbmV3IEFydGlmYWN0RGF0YSgiYXJ0aWZhY3QyIiwgbm9kZVR5cGUsIG5vZGVUeXBlVmVyc2lvbiwgIllBTkciLAorCSAqIHN0ckRhdGEuZ2V0Qnl0ZXMoKSwgc3RyRGF0YS5nZXRCeXRlcygpLCAiTWFyaW5hIik7IFJlc291cmNlVXBsb2FkU3RhdHVzCisJICogc3RhdHVzID0gZGFvVXBsb2FkZXIuc2F2ZUFydGlmYWN0KGFyRGF0YSwgdHJ1ZSk7IHN0YXR1cyA9CisJICogZGFvVXBsb2FkZXIuc2F2ZUFydGlmYWN0KGFyRGF0YTEsIHRydWUpOworCSAqIAorCSAqIEFydGlmYWN0RGF0YSBhckRhdGEzID0gbmV3IEFydGlmYWN0RGF0YSgiYXJ0aWZhY3QxIiwgbm9kZVR5cGUyLAorCSAqIG5vZGVUeXBlVmVyc2lvbjIsICJZQU5HIiwgc3RyRGF0YS5nZXRCeXRlcygpLCBzdHJEYXRhLmdldEJ5dGVzKCksCisJICogIk1hcmluYSIpOyBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlQXJ0aWZhY3QoYXJEYXRhMywgdHJ1ZSk7CisJICogCisJICogQXJ0aWZhY3REYXRhIGFyRGF0YTQgPSBuZXcgQXJ0aWZhY3REYXRhKCJhcnRpZmFjdDIiLCBub2RlVHlwZTIsCisJICogbm9kZVR5cGVWZXJzaW9uMiwgIllBTkciLCBzdHJEYXRhLmdldEJ5dGVzKCksIHN0ckRhdGEuZ2V0Qnl0ZXMoKSwKKwkgKiAiTWFyaW5hIik7IHN0YXR1cyA9IGRhb1VwbG9hZGVyLnNhdmVBcnRpZmFjdChhckRhdGE0LCB0cnVlKTsKKwkgKiAKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhIHNlcnZpY2VBckRhdGEgPSBuZXcKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhKCJzZXJ2aWNlQXJEYXRhIiwgdG9wb2xvZ3lUZW1wbGF0ZU5hbWUsCisJICogdG9wb2xvZ3lUZW1wbGF0ZVZlcnNpb24sIG5vZGVUeXBlVGVtcGxhdGUxLCBub2RlVHlwZSwgbm9kZVR5cGVWZXJzaW9uLAorCSAqICJZQU5HIiwgc3RyRGF0YS5nZXRCeXRlcygpLCBzdHJEYXRhLmdldEJ5dGVzKCksICJNYXJpbmEiLAorCSAqIGFyRGF0YS5nZXRJZCgpKTsKKwkgKiAKKwkgKiBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlU2VydmljZUFydGlmYWN0KHNlcnZpY2VBckRhdGEsIHRydWUpOworCSAqIAorCSAqIFNlcnZpY2VBcnRpZmFjdERhdGEgc2VydmljZUFyRGF0YTEgPSBuZXcKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhKCJzZXJ2aWNlQXJEYXRhMSIsIHRvcG9sb2d5VGVtcGxhdGVOYW1lLAorCSAqIHRvcG9sb2d5VGVtcGxhdGVWZXJzaW9uLCBub2RlVHlwZVRlbXBsYXRlMiwgbm9kZVR5cGUyLCBub2RlVHlwZVZlcnNpb24yLAorCSAqICJZQU5HIiwgc3RyRGF0YS5nZXRCeXRlcygpLCBzdHJEYXRhLmdldEJ5dGVzKCksICJNYXJpbmEiLAorCSAqIGFyRGF0YTQuZ2V0SWQoKSk7CisJICogCisJICogc3RhdHVzID0gZGFvVXBsb2FkZXIuc2F2ZVNlcnZpY2VBcnRpZmFjdChzZXJ2aWNlQXJEYXRhMSwgdHJ1ZSk7CisJICogCisJICogCisJICogfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCSAqIGUucHJpbnRTdGFja1RyYWNlKCk7IH0KKwkgKiAKKwkgKiB9CisJICogCisJICogcHJpdmF0ZSB2b2lkIHByZXBhcmVUZXN0VG9wb2xneVNlcnZpY2UoKXsKKwkgKiAKKwkgKiBMaXN0PFN0cmluZz4gbGlzdENhcCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCSAqIGxpc3RDYXAuYWRkKCJ2ZXJ5X2V2aWwgdGVzdCIpOyBMaXN0PFN0cmluZz4gbGlzdENhcDEgPSBuZXcKKwkgKiBBcnJheUxpc3Q8U3RyaW5nPigpOyBsaXN0Q2FwLmFkZCgiZXZpbCB0ZXN0Iik7IHRyeXsgLy8gSW5pdGlhbGl6ZSB0ZXN0CisJICogZGF0YSBJbmRleGVkTm9kZVR5cGUgaW5kZXhlZE5vZGVUeXBlID0gbmV3IEluZGV4ZWROb2RlVHlwZSgpOworCSAqIENTQVJEZXBlbmRlbmN5IGRlcCA9IG5ldyBDU0FSRGVwZW5kZW5jeSgpOyBkZXAuc2V0TmFtZShub2RlVHlwZSArCisJICogIiB0ZXN0Iik7IGRlcC5zZXRWZXJzaW9uKG5vZGVUeXBlVmVyc2lvbik7CisJICogaW5kZXhlZE5vZGVUeXBlLnNldEVsZW1lbnRJZChub2RlVHlwZSArICIgdGVzdCIpOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXRBcmNoaXZlTmFtZShub2RlVHlwZSArICIgdGVzdCIpOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXRBcmNoaXZlVmVyc2lvbihub2RlVHlwZVZlcnNpb24pOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSk7CisJICogaW5kZXhlZE5vZGVUeXBlLnNldExhc3RVcGRhdGVEYXRlKG5ldyBEYXRlKCkpOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXREZWZhdWx0Q2FwYWJpbGl0aWVzKGxpc3RDYXApOworCSAqIHJlc291cmNlREFPLnNhdmUoaW5kZXhlZE5vZGVUeXBlKTsKKwkgKiAKKwkgKiAKKwkgKiBJbmRleGVkTm9kZVR5cGUgaW5kZXhlZE5vZGVUeXBlMSA9IG5ldyBJbmRleGVkTm9kZVR5cGUoKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUxLnNldEVsZW1lbnRJZChub2RlVHlwZTIgKyAiIHRlc3QiKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUxLnNldEFyY2hpdmVOYW1lKG5vZGVUeXBlMiArICIgdGVzdCIpOworCSAqIGluZGV4ZWROb2RlVHlwZTEuc2V0QXJjaGl2ZVZlcnNpb24obm9kZVR5cGVWZXJzaW9uMik7IENTQVJEZXBlbmRlbmN5IGRlcDEKKwkgKiA9IG5ldyBDU0FSRGVwZW5kZW5jeSgpOyBkZXAxLnNldE5hbWUobm9kZVR5cGUyICsgIiB0ZXN0Iik7CisJICogZGVwMS5zZXRWZXJzaW9uKG5vZGVUeXBlVmVyc2lvbjIpOyBpbmRleGVkTm9kZVR5cGUxLnNldENyZWF0aW9uRGF0ZShuZXcKKwkgKiBEYXRlKCkpOyBpbmRleGVkTm9kZVR5cGUxLnNldExhc3RVcGRhdGVEYXRlKG5ldyBEYXRlKCkpOworCSAqIGluZGV4ZWROb2RlVHlwZTEuc2V0RGVmYXVsdENhcGFiaWxpdGllcyhsaXN0Q2FwMSk7CisJICogcmVzb3VyY2VEQU8uc2F2ZShpbmRleGVkTm9kZVR5cGUxKTsKKwkgKiAKKwkgKiAKKwkgKiBpbmRleGVkTm9kZVR5cGUuc2V0RWxlbWVudElkKG5vZGVUeXBlMyArICIgdGVzdCIpOworCSAqIGluZGV4ZWROb2RlVHlwZS5zZXRBcmNoaXZlTmFtZShub2RlVHlwZTMgKyAiIHRlc3QiKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUuc2V0QXJjaGl2ZVZlcnNpb24obm9kZU55cGVWZXJzaW9uMyk7IENTQVJEZXBlbmRlbmN5IGRlcDIKKwkgKiA9IG5ldyBDU0FSRGVwZW5kZW5jeSgpOyBkZXAyLnNldE5hbWUobm9kZVR5cGUzICsgIiB0ZXN0Iik7CisJICogZGVwMi5zZXRWZXJzaW9uKG5vZGVOeXBlVmVyc2lvbjMpOyBpbmRleGVkTm9kZVR5cGUuc2V0Q3JlYXRpb25EYXRlKG5ldworCSAqIERhdGUoKSk7IGluZGV4ZWROb2RlVHlwZS5zZXRMYXN0VXBkYXRlRGF0ZShuZXcgRGF0ZSgpKTsKKwkgKiBpbmRleGVkTm9kZVR5cGUuc2V0RGVmYXVsdENhcGFiaWxpdGllcyhudWxsKTsKKwkgKiByZXNvdXJjZURBTy5zYXZlKGluZGV4ZWROb2RlVHlwZSk7IFN0cmluZyBvc2dpbGlhdGgxMDBJZCA9CisJICogaW5kZXhlZE5vZGVUeXBlLmdldElkKCk7CisJICogCisJICogVG9wb2xvZ3kgdG9wb2xvZ3kgPSBuZXcgVG9wb2xvZ3koKTsgdG9wb2xvZ3kuc2V0SWQodG9wb2xvZ3lJZCArICIgdGVzdCIpOworCSAqIFNldDxDU0FSRGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hTZXQ8Q1NBUkRlcGVuZGVuY3k+KCk7CisJICogZGVwZW5kZW5jaWVzLmFkZChkZXApOyBkZXBlbmRlbmNpZXMuYWRkKGRlcDIpOyBkZXBlbmRlbmNpZXMuYWRkKGRlcDEpOworCSAqIHRvcG9sb2d5LnNldERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXMpOyBNYXA8U3RyaW5nLCBOb2RlVGVtcGxhdGU+CisJICogbm9kZVRlbXBsYXRlcyA9IG5ldyBIYXNoTWFwIDxTdHJpbmcsIE5vZGVUZW1wbGF0ZT4oKTsKKwkgKiAKKwkgKiBOb2RlVGVtcGxhdGUgdGVtcGxhdGUxID0gbmV3IE5vZGVUZW1wbGF0ZShub2RlVHlwZSArICIgdGVzdCIsIG51bGwsIG51bGwsCisJICogbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7IHRlbXBsYXRlMS5zZXROYW1lKG5vZGVUeXBlVGVtcGxhdGUxICsgIiB0ZXN0Iik7CisJICogbm9kZVRlbXBsYXRlcy5wdXQobm9kZVR5cGVUZW1wbGF0ZTEgKyAiIHRlc3QiLCB0ZW1wbGF0ZTEgKTsKKwkgKiAKKwkgKiBOb2RlVGVtcGxhdGUgdGVtcGxhdGUyID0gbmV3IE5vZGVUZW1wbGF0ZShub2RlVHlwZTIgKyAiIHRlc3QiLCBudWxsLAorCSAqIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOyB0ZW1wbGF0ZTIuc2V0TmFtZShub2RlVHlwZVRlbXBsYXRlMiArCisJICogIiB0ZXN0IiApOyBub2RlVGVtcGxhdGVzLnB1dChub2RlVHlwZVRlbXBsYXRlMiArICIgdGVzdCIsIHRlbXBsYXRlMiApOworCSAqIAorCSAqIE5vZGVUZW1wbGF0ZSB0ZW1wbGF0ZTMgPSBuZXcgTm9kZVRlbXBsYXRlKG5vZGVUeXBlLCBudWxsLCBudWxsLCBudWxsLAorCSAqIG51bGwsIG51bGwsIG51bGwpOyB0ZW1wbGF0ZTMuc2V0TmFtZShub2RlVHlwZVRlbXBsYXRlMyArICIgdGVzdCIgKTsKKwkgKiBub2RlVGVtcGxhdGVzLnB1dChub2RlVHlwZVRlbXBsYXRlMyArICIgdGVzdCIsIHRlbXBsYXRlMyk7CisJICogCisJICogdG9wb2xvZ3kuc2V0Tm9kZVRlbXBsYXRlcyhub2RlVGVtcGxhdGVzKTsgcmVzb3VyY2VEQU8uc2F2ZSh0b3BvbG9neSk7CisJICogCisJICogVG9wb2xvZ3lUZW1wbGF0ZSB0b3BvbG9neVRlbXBsYXRlID0gbmV3IFRvcG9sb2d5VGVtcGxhdGUoKTsKKwkgKiB0b3BvbG9neVRlbXBsYXRlLnNldElkKHRvcG9sb2d5VGVtcGxhdGVOYW1lICsgIiB0ZXN0Iik7CisJICogdG9wb2xvZ3lUZW1wbGF0ZS5zZXROYW1lKHRvcG9sb2d5VGVtcGxhdGVOYW1lICsgIiB0ZXN0Iik7CisJICogdG9wb2xvZ3lUZW1wbGF0ZS5zZXRUb3BvbG9neUlkKHRvcG9sb2d5LmdldElkKCkpOworCSAqIHRvcG9sb2d5VGVtcGxhdGUuc2V0RGVzY3JpcHRpb24oIm15IHRvcG9sb2d5IHRlbXBsYXRlIik7CisJICogcmVzb3VyY2VEQU8uc2F2ZSh0b3BvbG9neVRlbXBsYXRlKTsKKwkgKiAKKwkgKiBTdHJpbmcgc3RyRGF0YSA9ICJxd2Vxd3F3ZXF3MzRlNHdyd2VyIjsgQXJ0aWZhY3REYXRhIGFyRGF0YSA9IG5ldworCSAqIEFydGlmYWN0RGF0YSgiYXJ0aWZhY3QxIHRlc3QiLCBub2RlVHlwZSArICIgdGVzdCIsIG5vZGVUeXBlVmVyc2lvbiwKKwkgKiAiWUFORyIsIHN0ckRhdGEuZ2V0Qnl0ZXMoKSwgc3RyRGF0YS5nZXRCeXRlcygpLCAiTWFyaW5hIik7IEFydGlmYWN0RGF0YQorCSAqIGFyRGF0YTEgPSBuZXcgQXJ0aWZhY3REYXRhKCJhcnRpZmFjdDIgdGVzdCIsIG5vZGVUeXBlICsgIiB0ZXN0IiwKKwkgKiBub2RlVHlwZVZlcnNpb24sICJZQU5HIiwgc3RyRGF0YS5nZXRCeXRlcygpLCBzdHJEYXRhLmdldEJ5dGVzKCksCisJICogIk1hcmluYSIpOyBSZXNvdXJjZVVwbG9hZFN0YXR1cyBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlQXJ0aWZhY3QoYXJEYXRhLAorCSAqIHRydWUpOyBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlQXJ0aWZhY3QoYXJEYXRhMSwgdHJ1ZSk7CisJICogCisJICogQXJ0aWZhY3REYXRhIGFyRGF0YTMgPSBuZXcgQXJ0aWZhY3REYXRhKCJhcnRpZmFjdDEgdGVzdCIsIG5vZGVUeXBlMiArCisJICogIiB0ZXN0Iiwgbm9kZVR5cGVWZXJzaW9uMiwgIllBTkciLCBzdHJEYXRhLmdldEJ5dGVzKCksCisJICogc3RyRGF0YS5nZXRCeXRlcygpLCAiTWFyaW5hIik7IHN0YXR1cyA9IGRhb1VwbG9hZGVyLnNhdmVBcnRpZmFjdChhckRhdGEzLAorCSAqIHRydWUpOworCSAqIAorCSAqIEFydGlmYWN0RGF0YSBhckRhdGE0ID0gbmV3IEFydGlmYWN0RGF0YSgiYXJ0aWZhY3QyIHRlc3QiLCBub2RlVHlwZTIgKworCSAqICIgdGVzdCIsIG5vZGVUeXBlVmVyc2lvbjIsICJZQU5HIiwgc3RyRGF0YS5nZXRCeXRlcygpLAorCSAqIHN0ckRhdGEuZ2V0Qnl0ZXMoKSwgIk1hcmluYSIpOyBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlQXJ0aWZhY3QoYXJEYXRhNCwKKwkgKiB0cnVlKTsKKwkgKiAKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhIHNlcnZpY2VBckRhdGEgPSBuZXcKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhKCJzZXJ2aWNlQXJEYXRhIHRlc3QiICwgdG9wb2xvZ3lUZW1wbGF0ZU5hbWUgKworCSAqICIgdGVzdCIsIHRvcG9sb2d5VGVtcGxhdGVWZXJzaW9uLCBub2RlVHlwZVRlbXBsYXRlMSArICIgdGVzdCIsIG5vZGVUeXBlICsKKwkgKiAiIHRlc3QiLCBub2RlVHlwZVZlcnNpb24sICJZQU5HIiwgc3RyRGF0YS5nZXRCeXRlcygpLCBzdHJEYXRhLmdldEJ5dGVzKCksCisJICogIk1hcmluYSIsIGFyRGF0YS5nZXRJZCgpKTsKKwkgKiAKKwkgKiBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlU2VydmljZUFydGlmYWN0KHNlcnZpY2VBckRhdGEsIHRydWUpOworCSAqIAorCSAqIFNlcnZpY2VBcnRpZmFjdERhdGEgc2VydmljZUFyRGF0YTEgPSBuZXcKKwkgKiBTZXJ2aWNlQXJ0aWZhY3REYXRhKCJzZXJ2aWNlQXJEYXRhMSB0ZXN0IiwgdG9wb2xvZ3lUZW1wbGF0ZU5hbWUgKworCSAqICIgdGVzdCIsIHRvcG9sb2d5VGVtcGxhdGVWZXJzaW9uLCBub2RlVHlwZVRlbXBsYXRlMiArICIgdGVzdCIsIG5vZGVUeXBlMgorCSAqICsgIiB0ZXN0Iiwgbm9kZVR5cGVWZXJzaW9uMiwgIllBTkciLCBzdHJEYXRhLmdldEJ5dGVzKCksCisJICogc3RyRGF0YS5nZXRCeXRlcygpLCAiTWFyaW5hIiwgYXJEYXRhNC5nZXRJZCgpKTsKKwkgKiAKKwkgKiBzdGF0dXMgPSBkYW9VcGxvYWRlci5zYXZlU2VydmljZUFydGlmYWN0KHNlcnZpY2VBckRhdGExLCB0cnVlKTsKKwkgKiAKKwkgKiAKKwkgKiB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJICogZS5wcmludFN0YWNrVHJhY2UoKTsgfQorCSAqIAorCSAqIH0KKwkgKi8KKworCXByaXZhdGUgdm9pZCBjbGVhckluZGV4KFN0cmluZyBpbmRleE5hbWUsIENsYXNzPD8+IGNsYXp6KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisJCURlbGV0ZUluZGV4UmVzcG9uc2UgYWN0aW9uR2V0ID0gZXNjbGllbnQuZ2V0Q2xpZW50KCkuYWRtaW4oKS5pbmRpY2VzKCkuZGVsZXRlKG5ldyBEZWxldGVJbmRleFJlcXVlc3QoaW5kZXhOYW1lKSkKKwkJCQkuYWN0aW9uR2V0KCk7CisJCWFzc2VydFRydWUoYWN0aW9uR2V0LmlzQWNrbm93bGVkZ2VkKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvQXVkaXRpbmdEYW9UZXN0LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9BdWRpdGluZ0Rhb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQyNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvQXVkaXRpbmdEYW9UZXN0LmphdmEKQEAgLTAsMCArMSw0NjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uYWRtaW4uaW5kaWNlcy5kZWxldGUuRGVsZXRlSW5kZXhSZXNwb25zZTsKK2ltcG9ydCBvcmcuZWxhc3RpY3NlYXJjaC5hY3Rpb24uc2VhcmNoLlNlYXJjaFJlc3BvbnNlOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmluZGV4LnF1ZXJ5Lk1hdGNoQWxsUXVlcnlCdWlsZGVyOworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLnNlYXJjaC5TZWFyY2hIaXQ7CitpbXBvcnQgb3JnLmVsYXN0aWNzZWFyY2guc2VhcmNoLlNlYXJjaEhpdHM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uRWxhc3RpY1NlYXJjaENvbmZpZy5JbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5lcy5FbGFzdGljU2VhcmNoQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsLkF1ZGl0aW5nRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmF1ZGl0aW5nLio7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkF1ZGl0aW5nRmllbGRzS2V5c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRVNUaW1lQmFzZWRFdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuQ29udGV4dENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuVGVzdEV4ZWN1dGlvbkxpc3RlbmVyczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5qdW5pdDQuU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuc3VwcG9ydC5EZXBlbmRlbmN5SW5qZWN0aW9uVGVzdEV4ZWN1dGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LnN1cHBvcnQuRGlydGllc0NvbnRleHRUZXN0RXhlY3V0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbFRlc3RFeGVjdXRpb25MaXN0ZW5lcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitAUnVuV2l0aChTcHJpbmdKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK0BDb250ZXh0Q29uZmlndXJhdGlvbigiY2xhc3NwYXRoOmFwcGxpY2F0aW9uLWNvbnRleHQtdGVzdC54bWwiKQorQFRlc3RFeGVjdXRpb25MaXN0ZW5lcnMobGlzdGVuZXJzID0geyBEZXBlbmRlbmN5SW5qZWN0aW9uVGVzdEV4ZWN1dGlvbkxpc3RlbmVyLmNsYXNzLAorCQlEaXJ0aWVzQ29udGV4dFRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzcywgVHJhbnNhY3Rpb25hbFRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzcyB9KQorcHVibGljIGNsYXNzIEF1ZGl0aW5nRGFvVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF1ZGl0aW5nRGFvVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCUBSZXNvdXJjZShuYW1lID0gImVsYXN0aWNzZWFyY2gtY2xpZW50IikKKwlwcml2YXRlIEVsYXN0aWNTZWFyY2hDbGllbnQgZXNjbGllbnQ7CisKKwlAUmVzb3VyY2UobmFtZSA9ICJhdWRpdGluZ0RhbyIpCisJcHJpdmF0ZSBBdWRpdGluZ0RhbyBhdWRpdGluZ0RhbzsKKworCXByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOworCS8vIHByaXZhdGUgc3RhdGljIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBTdHJpbmc+IGF1ZGl0RmllbGQyZXNGaWVsZDsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEJlZm9yZUNsYXNzKCkgeworCisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLWRhbyIpOworCQlTdHJpbmcgYXBwQ29uZmlnRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1kYW8iOworCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcgRlNDb25maWd1cmF0aW9uU291cmNlKEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VMaXN0ZW5lcigpLAorCQkJCWFwcENvbmZpZ0Rpcik7CisJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25Tb3VyY2UpOworCQkvLyBpbml0QXVkaXQyRXNNYXAoKTsKKwl9CisKKwlAQWZ0ZXIKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKwkJZGVsZXRlT2xkSW5kZXhlcygpOworCX0KKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKwkJYXVkaXRpbmdEYW8uc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvbk1hbmFnZXIpOworCQlkZWxldGVPbGRJbmRleGVzKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZU9sZEluZGV4ZXMoKSB7CisJCURlbGV0ZUluZGV4UmVzcG9uc2UgZGVsZXRlUmVzcG9uc2UgPSBlc2NsaWVudC5nZXRDbGllbnQoKS5hZG1pbigpLmluZGljZXMoKQorCQkJCS5wcmVwYXJlRGVsZXRlKGF1ZGl0aW5nRGFvLmdldEluZGV4UHJlZml4KCkgKyAiKiIpLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKTsKKwkJaWYgKCFkZWxldGVSZXNwb25zZS5pc0Fja25vd2xlZGdlZCgpKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGRlbGV0ZSBvbGQgYXVkaXRpbmcgaW5kZXhlcyEiKTsKKwkJCWFzc2VydFRydWUoZmFsc2UpOworCQl9CisJfQorCisJLy8gQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkVXBkYXRlQWRtaW5FdmVudE1pbnV0ZSgpIHsKKworCQlTdHJpbmcgdGltZXN0YW1wID0gIjIwMTUtMDYtMjMgMTM6MzQ6NTMuMTIzIjsKKworCQlTdHJpbmcgY3JlYXRpb25QZXJpb2QgPSBDb25zdGFudHMuTUlOVVRFOworCQlTdHJpbmcgZXhwZWN0ZWRJbmRleE5hbWUgPSBhdWRpdGluZ0Rhby5nZXRJbmRleFByZWZpeCgpICsgIi0yMDE1LTA2LTIzLTEzLTM0IjsKKwkJYXNzZXJ0VHJ1ZSghZXNjbGllbnQuZ2V0Q2xpZW50KCkuYWRtaW4oKS5pbmRpY2VzKCkucHJlcGFyZUV4aXN0cyhleHBlY3RlZEluZGV4TmFtZSkuZXhlY3V0ZSgpLmFjdGlvbkdldCgpCisJCQkJLmlzRXhpc3RzKCkpOworCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMgPSBnZXRVc2VyQWRtaW5FdmVudFBhcmFtcyh0aW1lc3RhbXApOworCQl0ZXN0Q3JlYXRpb25QZXJpb2RTY2VuYXJpbyhwYXJhbXMsIGNyZWF0aW9uUGVyaW9kLCBleHBlY3RlZEluZGV4TmFtZSwgVXNlckFkbWluRXZlbnQuY2xhc3MpOworCQlwYXJhbXMgPSBnZXRVc2VyQWNjZXNzRXZlbnRQYXJhbXModGltZXN0YW1wKTsKKwkJdGVzdENyZWF0aW9uUGVyaW9kU2NlbmFyaW8ocGFyYW1zLCBjcmVhdGlvblBlcmlvZCwgZXhwZWN0ZWRJbmRleE5hbWUsIFVzZXJBY2Nlc3NFdmVudC5jbGFzcyk7CisJCXBhcmFtcyA9IGdldFJlc291cmNlQWRtaW5FdmVudFBhcmFtcyh0aW1lc3RhbXAsICJhZGRSZXNvdXJjZSIpOworCQl0ZXN0Q3JlYXRpb25QZXJpb2RTY2VuYXJpbyhwYXJhbXMsIGNyZWF0aW9uUGVyaW9kLCBleHBlY3RlZEluZGV4TmFtZSwgUmVzb3VyY2VBZG1pbkV2ZW50LmNsYXNzKTsKKwl9CisKKwkvLyBAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRVcGRhdGVBZG1pbkV2ZW50WWVhcmx5KCkgeworCisJCVN0cmluZyB0aW1lc3RhbXAgPSAiMjAxNi0wNi0yMyAxMzozNDo1My4xMjMiOworCQlTdHJpbmcgY3JlYXRpb25QZXJpb2QgPSBDb25zdGFudHMuWUVBUjsKKwkJU3RyaW5nIGV4cGVjdGVkSW5kZXhOYW1lID0gYXVkaXRpbmdEYW8uZ2V0SW5kZXhQcmVmaXgoKSArICItMjAxNiI7CisJCWFzc2VydFRydWUoIWVzY2xpZW50LmdldENsaWVudCgpLmFkbWluKCkuaW5kaWNlcygpLnByZXBhcmVFeGlzdHMoZXhwZWN0ZWRJbmRleE5hbWUpLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKQorCQkJCS5pc0V4aXN0cygpKTsKKwkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gcGFyYW1zID0gZ2V0VXNlckFkbWluRXZlbnRQYXJhbXModGltZXN0YW1wKTsKKwkJdGVzdENyZWF0aW9uUGVyaW9kU2NlbmFyaW8ocGFyYW1zLCBjcmVhdGlvblBlcmlvZCwgZXhwZWN0ZWRJbmRleE5hbWUsIFVzZXJBZG1pbkV2ZW50LmNsYXNzKTsKKwkJcGFyYW1zID0gZ2V0VXNlckFjY2Vzc0V2ZW50UGFyYW1zKHRpbWVzdGFtcCk7CisJCXRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvKHBhcmFtcywgY3JlYXRpb25QZXJpb2QsIGV4cGVjdGVkSW5kZXhOYW1lLCBVc2VyQWNjZXNzRXZlbnQuY2xhc3MpOworCQlwYXJhbXMgPSBnZXRSZXNvdXJjZUFkbWluRXZlbnRQYXJhbXModGltZXN0YW1wLCAiYWRkUmVzb3VyY2UiKTsKKwkJdGVzdENyZWF0aW9uUGVyaW9kU2NlbmFyaW8ocGFyYW1zLCBjcmVhdGlvblBlcmlvZCwgZXhwZWN0ZWRJbmRleE5hbWUsIFJlc291cmNlQWRtaW5FdmVudC5jbGFzcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQoKSB7CisKKwkJU3RyaW5nIHRpbWVzdGFtcDEgPSAiMjAxNi0wNi0yMyAxMzozNDo1My4xMjMiOworCQlTdHJpbmcgY3JlYXRpb25QZXJpb2QgPSBDb25zdGFudHMuTU9OVEg7CisJCVN0cmluZyBleHBlY3RlZEluZGV4TmFtZTEgPSBhdWRpdGluZ0Rhby5nZXRJbmRleFByZWZpeCgpICsgIi0yMDE2LTA2IjsKKwkJYXNzZXJ0VHJ1ZSghZXNjbGllbnQuZ2V0Q2xpZW50KCkuYWRtaW4oKS5pbmRpY2VzKCkucHJlcGFyZUV4aXN0cyhleHBlY3RlZEluZGV4TmFtZTEpLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKQorCQkJCS5pc0V4aXN0cygpKTsKKwkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gcGFyYW1zID0gZ2V0RGlzdHJpYnV0aW9uU3RhdHVzRXZlbnRQYXJhbXModGltZXN0YW1wMSk7CisJCXRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvKHBhcmFtcywgY3JlYXRpb25QZXJpb2QsIGV4cGVjdGVkSW5kZXhOYW1lMSwgRGlzdHJpYnV0aW9uU3RhdHVzRXZlbnQuY2xhc3MpOworCQlTdHJpbmcgdGltZXN0YW1wMiA9ICIyMDE1LTA2LTIzIDEzOjM0OjUzLjEyMyI7CisKKwkJU3RyaW5nIGV4cGVjdGVkSW5kZXhOYW1lMiA9IGF1ZGl0aW5nRGFvLmdldEluZGV4UHJlZml4KCkgKyAiLTIwMTUtMDYiOworCQlhc3NlcnRUcnVlKCFlc2NsaWVudC5nZXRDbGllbnQoKS5hZG1pbigpLmluZGljZXMoKS5wcmVwYXJlRXhpc3RzKGV4cGVjdGVkSW5kZXhOYW1lMikuZXhlY3V0ZSgpLmFjdGlvbkdldCgpCisJCQkJLmlzRXhpc3RzKCkpOworCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMyID0gZ2V0RGlzdHJpYnV0aW9uU3RhdHVzRXZlbnRQYXJhbXModGltZXN0YW1wMik7CisJCXRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvKHBhcmFtczIsIGNyZWF0aW9uUGVyaW9kLCBleHBlY3RlZEluZGV4TmFtZTIsIERpc3RyaWJ1dGlvblN0YXR1c0V2ZW50LmNsYXNzKTsKKwkJRWl0aGVyPExpc3Q8RVNUaW1lQmFzZWRFdmVudD4sIEFjdGlvblN0YXR1cz4gc3RhdHVzID0gYXVkaXRpbmdEYW8uZ2V0TGlzdE9mRGlzdHJpYnV0aW9uU3RhdHVzZXMoIjEyMy00NTYiKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHN0YXR1cy5sZWZ0KCkudmFsdWUoKS5zaXplKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldENvdW50QWRtaW5FdmVudE1vbnRobHkoKSB7CisKKwkJU3RyaW5nIHRpbWVzdGFtcDEgPSAiMjAxNi0wNi0yMyAxMzozNDo1My4xMjMiOworCQlTdHJpbmcgdGltZXN0YW1wMiA9ICIyMDE1LTA2LTIzIDEzOjM0OjUzLjEyMyI7CisJCVN0cmluZyBjcmVhdGlvblBlcmlvZCA9IENvbnN0YW50cy5NT05USDsKKwkJU3RyaW5nIGV4cGVjdGVkSW5kZXhOYW1lMSA9IGF1ZGl0aW5nRGFvLmdldEluZGV4UHJlZml4KCkgKyAiLTIwMTYtMDYiOworCQlhc3NlcnRUcnVlKCFlc2NsaWVudC5nZXRDbGllbnQoKS5hZG1pbigpLmluZGljZXMoKS5wcmVwYXJlRXhpc3RzKGV4cGVjdGVkSW5kZXhOYW1lMSkuZXhlY3V0ZSgpLmFjdGlvbkdldCgpCisJCQkJLmlzRXhpc3RzKCkpOworCQlTdHJpbmcgZXhwZWN0ZWRJbmRleE5hbWUyID0gYXVkaXRpbmdEYW8uZ2V0SW5kZXhQcmVmaXgoKSArICItMjAxNS0wNiI7CisJCWFzc2VydFRydWUoIWVzY2xpZW50LmdldENsaWVudCgpLmFkbWluKCkuaW5kaWNlcygpLnByZXBhcmVFeGlzdHMoZXhwZWN0ZWRJbmRleE5hbWUyKS5leGVjdXRlKCkuYWN0aW9uR2V0KCkKKwkJCQkuaXNFeGlzdHMoKSk7CisKKwkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gcGFyYW1zMSA9IGdldFVzZXJBZG1pbkV2ZW50UGFyYW1zKHRpbWVzdGFtcDEpOworCQl0ZXN0Q3JlYXRpb25QZXJpb2RTY2VuYXJpbyhwYXJhbXMxLCBjcmVhdGlvblBlcmlvZCwgZXhwZWN0ZWRJbmRleE5hbWUxLCBVc2VyQWRtaW5FdmVudC5jbGFzcyk7CisJCU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IHBhcmFtczIgPSBnZXRVc2VyQWRtaW5FdmVudFBhcmFtcyh0aW1lc3RhbXAyKTsKKwkJdGVzdENyZWF0aW9uUGVyaW9kU2NlbmFyaW8ocGFyYW1zMiwgY3JlYXRpb25QZXJpb2QsIGV4cGVjdGVkSW5kZXhOYW1lMiwgVXNlckFkbWluRXZlbnQuY2xhc3MpOworCisJCWxvbmcgY291bnQgPSBhdWRpdGluZ0Rhby5jb3VudChVc2VyQWRtaW5FdmVudC5jbGFzcywgbmV3IE1hdGNoQWxsUXVlcnlCdWlsZGVyKCkpOworCQlsb2cuZGVidWcoIlRlc3RpbmcgYXVkaXRpbmcgY291bnQge30iLCBjb3VudCk7CisJCWFzc2VydEVxdWFscygyLCBjb3VudCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZURpc3RyaWJ1dGlvblN0YXR1c2VzKCkgeworCisJCVN0cmluZyB0aW1lc3RhbXAgPSAiMjAxNi0wNi0yMyAxMzozNDo1My4xMjMiOworCQlTdHJpbmcgY3JlYXRpb25QZXJpb2QgPSBDb25zdGFudHMuTU9OVEg7CisJCVN0cmluZyBleHBlY3RlZEluZGV4TmFtZSA9IGF1ZGl0aW5nRGFvLmdldEluZGV4UHJlZml4KCkgKyAiLTIwMTYtMDYiOworCQlhc3NlcnRUcnVlKCFlc2NsaWVudC5nZXRDbGllbnQoKS5hZG1pbigpLmluZGljZXMoKS5wcmVwYXJlRXhpc3RzKGV4cGVjdGVkSW5kZXhOYW1lKS5leGVjdXRlKCkuYWN0aW9uR2V0KCkKKwkJCQkuaXNFeGlzdHMoKSk7CisJCU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IHBhcmFtcyA9IGdldFVzZXJBZG1pbkV2ZW50UGFyYW1zKHRpbWVzdGFtcCk7CisJCXRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvKHBhcmFtcywgY3JlYXRpb25QZXJpb2QsIGV4cGVjdGVkSW5kZXhOYW1lLCBVc2VyQWRtaW5FdmVudC5jbGFzcyk7CisJCXBhcmFtcyA9IGdldFVzZXJBY2Nlc3NFdmVudFBhcmFtcyh0aW1lc3RhbXApOworCQl0ZXN0Q3JlYXRpb25QZXJpb2RTY2VuYXJpbyhwYXJhbXMsIGNyZWF0aW9uUGVyaW9kLCBleHBlY3RlZEluZGV4TmFtZSwgVXNlckFjY2Vzc0V2ZW50LmNsYXNzKTsKKwkJcGFyYW1zID0gZ2V0UmVzb3VyY2VBZG1pbkV2ZW50UGFyYW1zKHRpbWVzdGFtcCwgIkRSZXF1ZXN0Iik7CisJCXRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvKHBhcmFtcywgY3JlYXRpb25QZXJpb2QsIGV4cGVjdGVkSW5kZXhOYW1lLCBSZXNvdXJjZUFkbWluRXZlbnQuY2xhc3MpOworCQlwYXJhbXMgPSBnZXREaXN0cmlidXRpb25Ob3RpZmljYXRpb25FdmVudFBhcmFtcyh0aW1lc3RhbXApOworCQl0ZXN0Q3JlYXRpb25QZXJpb2RTY2VuYXJpbyhwYXJhbXMsIGNyZWF0aW9uUGVyaW9kLCBleHBlY3RlZEluZGV4TmFtZSwgRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQuY2xhc3MpOworCQlFaXRoZXI8TGlzdDxFU1RpbWVCYXNlZEV2ZW50PiwgQWN0aW9uU3RhdHVzPiBzdGF0dXMgPSBhdWRpdGluZ0RhbworCQkJCS5nZXRTZXJ2aWNlRGlzdHJpYnV0aW9uU3RhdHVzZXNMaXN0KCJTZXZpY2VJZCIpOworCQlsb2cuZGVidWcoIlRlc3RpbmcgYXVkaXRpbmcgY291bnQge30iLCBzdGF0dXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFVwZGF0ZUFkbWluRXZlbnRNb250aGx5KCkgeworCisJCVN0cmluZyB0aW1lc3RhbXAgPSAiMjAxNi0wNi0yMyAxMzozNDo1My4xMjMiOworCQlTdHJpbmcgY3JlYXRpb25QZXJpb2QgPSBDb25zdGFudHMuTU9OVEg7CisJCVN0cmluZyBleHBlY3RlZEluZGV4TmFtZSA9IGF1ZGl0aW5nRGFvLmdldEluZGV4UHJlZml4KCkgKyAiLTIwMTYtMDYiOworCQlhc3NlcnRUcnVlKCFlc2NsaWVudC5nZXRDbGllbnQoKS5hZG1pbigpLmluZGljZXMoKS5wcmVwYXJlRXhpc3RzKGV4cGVjdGVkSW5kZXhOYW1lKS5leGVjdXRlKCkuYWN0aW9uR2V0KCkKKwkJCQkuaXNFeGlzdHMoKSk7CisJCU1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IHBhcmFtcyA9IGdldFVzZXJBZG1pbkV2ZW50UGFyYW1zKHRpbWVzdGFtcCk7CisJCXRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvKHBhcmFtcywgY3JlYXRpb25QZXJpb2QsIGV4cGVjdGVkSW5kZXhOYW1lLCBVc2VyQWRtaW5FdmVudC5jbGFzcyk7CisJCXBhcmFtcyA9IGdldFVzZXJBY2Nlc3NFdmVudFBhcmFtcyh0aW1lc3RhbXApOworCQl0ZXN0Q3JlYXRpb25QZXJpb2RTY2VuYXJpbyhwYXJhbXMsIGNyZWF0aW9uUGVyaW9kLCBleHBlY3RlZEluZGV4TmFtZSwgVXNlckFjY2Vzc0V2ZW50LmNsYXNzKTsKKwkJcGFyYW1zID0gZ2V0UmVzb3VyY2VBZG1pbkV2ZW50UGFyYW1zKHRpbWVzdGFtcCwgImFkZFJlc291cmNlIik7CisJCXRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvKHBhcmFtcywgY3JlYXRpb25QZXJpb2QsIGV4cGVjdGVkSW5kZXhOYW1lLCBSZXNvdXJjZUFkbWluRXZlbnQuY2xhc3MpOworCX0KKworCXByaXZhdGUgU2VhcmNoUmVzcG9uc2UgdGVzdENyZWF0aW9uUGVyaW9kU2NlbmFyaW8oTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gcGFyYW1zLCBTdHJpbmcgY3JlYXRpb25QZXJpb2QsCisJCQlTdHJpbmcgZXhwZWN0ZWRJbmRleE5hbWUsIENsYXNzPD8gZXh0ZW5kcyBBdWRpdGluZ0dlbmVyaWNFdmVudD4gY2xhenopIHsKKworCQlTdHJpbmcgdHlwZU5hbWUgPSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKKwkJbG9nLmRlYnVnKCJUZXN0aW5nIGF1ZGl0aW5nIHR5cGUge30iLCB0eXBlTmFtZSk7CisJCXNldENyZWF0aW9uUGVyaW9kKGNyZWF0aW9uUGVyaW9kKTsKKwkJQWN0aW9uU3RhdHVzIHNhdmVVc2VyQWRtaW5FdmVudCA9IGF1ZGl0aW5nRGFvLmFkZFJlY29yZChwYXJhbXMsIHR5cGVOYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKEFjdGlvblN0YXR1cy5PSywgc2F2ZVVzZXJBZG1pbkV2ZW50KTsKKwkJYXNzZXJ0VHJ1ZShlc2NsaWVudC5nZXRDbGllbnQoKS5hZG1pbigpLmluZGljZXMoKS5wcmVwYXJlRXhpc3RzKGV4cGVjdGVkSW5kZXhOYW1lKS5leGVjdXRlKCkuYWN0aW9uR2V0KCkKKwkJCQkuaXNFeGlzdHMoKSk7CisJCU1hdGNoQWxsUXVlcnlCdWlsZGVyIG1hdGNoQWxsUXVlcnlCdWlsZGVyID0gbmV3IE1hdGNoQWxsUXVlcnlCdWlsZGVyKCk7CisKKwkJU2VhcmNoUmVzcG9uc2Ugc2VhcmNoUmVzcG9uc2UgPSBlc2NsaWVudC5nZXRDbGllbnQoKS5wcmVwYXJlU2VhcmNoKGV4cGVjdGVkSW5kZXhOYW1lKS5zZXRUeXBlcyh0eXBlTmFtZSkKKwkJCQkuc2V0UXVlcnkobWF0Y2hBbGxRdWVyeUJ1aWxkZXIpLmV4ZWN1dGUoKS5hY3Rpb25HZXQoKTsKKworCQlTZWFyY2hIaXRzIGhpdHMgPSBzZWFyY2hSZXNwb25zZS5nZXRIaXRzKCk7CisJCWFzc2VydEVxdWFscygxLCBoaXRzLmdldFRvdGFsSGl0cygpKTsKKwkJbG9nLmRlYnVnKCJDaGVja2luZyB0aGF0IGFsbCBleHBlY3RlZCBmaWVsZHMgYXJlIHByb3Blcmx5IHBlcnNpc3RlZCIpOworCQl2YWxpZGF0ZUhpdFZhbHVlcyhwYXJhbXMsIGhpdHMuZ2V0QXQoMCkpOworCQlsb2cuZGVidWcoInRlc3RDcmVhdGlvblBlcmlvZFNjZW5hcmlvIHN1Y2Nlc3NmdWwiKTsKKwkJcmV0dXJuIHNlYXJjaFJlc3BvbnNlOworCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUhpdFZhbHVlcyhNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMsIFNlYXJjaEhpdCBzZWFyY2hIaXQpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBzb3VyY2UgPSBzZWFyY2hIaXQuZ2V0U291cmNlKCk7CisJCWxvZy5kZWJ1ZygiSGl0IHNvdXJjZSBpcyB7fSIsIHNlYXJjaEhpdC5zb3VyY2VBc1N0cmluZygpKTsKKwkJZm9yIChFbnRyeTxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IHBhcmFtc0VudHJ5IDogcGFyYW1zLmVudHJ5U2V0KCkpIHsKKwkJCUF1ZGl0aW5nRmllbGRzS2V5c0VudW0ga2V5ID0gcGFyYW1zRW50cnkuZ2V0S2V5KCk7CisJCQlsb2cuZGVidWcoIlRlc3RpbmcgYXVkaXRpbmcgZmllbGQge30iLCBrZXkubmFtZSgpKTsKKwkJCU9iamVjdCB2YWx1ZSA9IHBhcmFtc0VudHJ5LmdldFZhbHVlKCk7CisJCQkvLyBhc3NlcnRFcXVhbHModmFsdWUsIHNvdXJjZS5nZXQoYXVkaXRGaWVsZDJlc0ZpZWxkLmdldChrZXkpKSk7CisJCQlhc3NlcnRFcXVhbHModmFsdWUsIHNvdXJjZS5nZXQoa2V5LmdldERpc3BsYXlOYW1lKCkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZXRDcmVhdGlvblBlcmlvZChTdHJpbmcgY3JlYXRpb25QZXJpb2QpIHsKKwkJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpOworCQlMaXN0PEluZGljZXNUaW1lRnJlcXVlbmN5RW50cnk+IGluZGljZXNUaW1lRnJlcXVlbmN5RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlJbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJ5IGluZGljZXNUaW1lRnJlcXVlbmN5RW50cnkgPSBuZXcgSW5kaWNlc1RpbWVGcmVxdWVuY3lFbnRyeSgpOworCQlpbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJ5LnNldEluZGV4UHJlZml4KCJhdWRpdGluZ2V2ZW50cyIpOworCQlpbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJ5LnNldENyZWF0aW9uUGVyaW9kKGNyZWF0aW9uUGVyaW9kKTsKKwkJY29uZmlndXJhdGlvbi5nZXRFbGFzdGljU2VhcmNoKCkuc2V0SW5kaWNlc1RpbWVGcmVxdWVuY3koaW5kaWNlc1RpbWVGcmVxdWVuY3lFbnRyaWVzKTsKKwl9CisKKwlwcml2YXRlIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGdldFVzZXJBZG1pbkV2ZW50UGFyYW1zKFN0cmluZyB0aW1lc3RhbXApIHsKKworCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KCk7CisJCVN0cmluZyBhY3Rpb24gPSAidXBkYXRlVXNlciI7CisJCVN0cmluZyBtb2RpZmllck5hbWUgPSAibW9zaGUgbW9zaGUiOworCQlTdHJpbmcgbW9kaWZpZXJVaWQgPSAibW9zaGVVaWQiOworCQlTdHJpbmcgdXNlclVpZCA9ICJtb3NoZVVpZCI7CisJCVN0cmluZyB1c2VyQmVmb3JlTmFtZSA9ICJtb3NoZSBtb3NoZSI7CisJCVN0cmluZyB1c2VyQmVmb3JlRW1haWwgPSAibW9zaGVAbW9zaGUxLmNvbSI7CisJCVN0cmluZyB1c2VyQmVmb3JlUm9sZSA9ICJURVNURVIiOworCQlTdHJpbmcgdXNlckFmdGVyTmFtZSA9ICJtb3NoZSBtb3NoZSI7CisJCVN0cmluZyB1c2VyQWZ0ZXJFbWFpbCA9ICJtb3NoZUBtb3NoZTIuY29tIjsKKwkJU3RyaW5nIHVzZXJBZnRlclJvbGUgPSAiVEVTVEVSIjsKKwkJU3RyaW5nIHVzZXJTdGF0dXMgPSAiMjAwIjsKKwkJU3RyaW5nIHVzZXJEZXNjID0gIk9LIjsKKworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb24pOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfVUlELCBtb2RpZmllck5hbWUgKyAnKCcgKyBtb2RpZmllclVpZCArICcpJyk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX1VJRCwgdXNlclVpZCk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0JFRk9SRSwKKwkJCQl1c2VyVWlkICsgIiwgIiArIHVzZXJCZWZvcmVOYW1lICsgIiwgIiArIHVzZXJCZWZvcmVFbWFpbCArICIsICIgKyB1c2VyQmVmb3JlUm9sZSk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9VU0VSX0FGVEVSLAorCQkJCXVzZXJVaWQgKyAiLCAiICsgdXNlckFmdGVyTmFtZSArICIsICIgKyB1c2VyQWZ0ZXJFbWFpbCArICIsICIgKyB1c2VyQWZ0ZXJSb2xlKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NUQVRVUywgdXNlclN0YXR1cyk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCB1c2VyRGVzYyk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAsIHRpbWVzdGFtcCk7CisKKwkJcmV0dXJuIHBhcmFtczsKKwl9CisKKwlwcml2YXRlIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGdldFVzZXJBY2Nlc3NFdmVudFBhcmFtcyhTdHJpbmcgdGltZXN0YW1wKSB7CisKKwkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gcGFyYW1zID0gbmV3IEhhc2hNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PigpOworCQlTdHJpbmcgYWN0aW9uID0gInVzZXJBY2Nlc3MiOworCQlTdHJpbmcgdXNlclVpZCA9ICJtb3NoZVVpZCI7CisJCVN0cmluZyB1c2VyTmFtZSA9ICJtb3NoZSBtb3NoZSI7CisJCVN0cmluZyB1c2VyU3RhdHVzID0gIjIwMCI7CisJCVN0cmluZyB1c2VyRGVzYyA9ICJPSyI7CisKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1VTRVJfVUlELCB1c2VyTmFtZSArICcoJyArIHVzZXJVaWQgKyAnKScpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCB1c2VyU3RhdHVzKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIHVzZXJEZXNjKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCwgdGltZXN0YW1wKTsKKworCQlyZXR1cm4gcGFyYW1zOworCX0KKworCXByaXZhdGUgTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gZ2V0UmVzb3VyY2VBZG1pbkV2ZW50UGFyYW1zKFN0cmluZyB0aW1lc3RhbXAsIFN0cmluZyBhY3Rpb24pIHsKKworCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KCk7CisKKwkJU3RyaW5nIG1vZGlmaWVyTmFtZSA9ICJtb3NoZSBtb3NoZSI7CisJCVN0cmluZyBtb2RpZmllclVpZCA9ICJtb3NoZVVpZCI7CisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ2VudG9zIjsKKwkJU3RyaW5nIHJlc291cmNlVHlwZSA9ICJSZXNvdXJjZSI7CisJCVN0cmluZyBjdXJyU3RhdGUgPSAiUkVBRFlfRk9SX0NFUlRJRklDQVRJT04iOworCQlTdHJpbmcgcHJldlN0YXRlID0gIkNIRUNLRURfT1VUIjsKKwkJU3RyaW5nIGN1cnJWZXJzaW9uID0gIjEuMS40IjsKKwkJU3RyaW5nIHByZXZWZXJzaW9uID0gIjEuMS4zIjsKKwkJU3RyaW5nIHN0YXR1cyA9ICIyMDAiOworCQlTdHJpbmcgZGVzYyA9ICJPSyI7CisJCVN0cmluZyBkaXN0cmlidXRpb25JZCA9ICIxMjMtNDU2IjsKKwkJU3RyaW5nIHNlcnZpY2VJZCA9ICJTZXZpY2VJZCI7CisKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0FDVElPTiwgYWN0aW9uKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX05BTUUsIG1vZGlmaWVyTmFtZSk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9NT0RJRklFUl9VSUQsIG1vZGlmaWVyVWlkKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHJlc291cmNlTmFtZSk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZVR5cGUpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9TVEFURSwgY3VyclN0YXRlKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfU1RBVEUsIHByZXZTdGF0ZSk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9DVVJSX1ZFUlNJT04sIGN1cnJWZXJzaW9uKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX1BSRVZfVkVSU0lPTiwgcHJldlZlcnNpb24pOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfREVTQywgZGVzYyk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAsIHRpbWVzdGFtcCk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIGRpc3RyaWJ1dGlvbklkKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsIHNlcnZpY2VJZCk7CisKKwkJcmV0dXJuIHBhcmFtczsKKwl9CisKKwlwcml2YXRlIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGdldERpc3RyaWJ1dGlvblN0YXR1c0V2ZW50UGFyYW1zKFN0cmluZyB0aW1lc3RhbXApIHsKKworCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KCk7CisJCVN0cmluZyBhY3Rpb24gPSAiRFN0YXR1cyI7CisJCVN0cmluZyBtb2RpZmllck5hbWUgPSAibW9zaGUgbW9zaGUiOworCQlTdHJpbmcgbW9kaWZpZXJVaWQgPSAibW9zaGVVaWQiOworCQlTdHJpbmcgdG9waWNOYW1lID0gIkNlbnRvcyI7CisJCVN0cmluZyBzZXJ2aWNlSWQgPSAiU2V2aWNlSWQiOworCQlTdHJpbmcgcmVzb3VyY2VVcmwgPSAicmVzb3VyY2VVcmwiOworCQlTdHJpbmcgZGlzdHJpYnV0aW9uSWQgPSAiMTIzLTQ1NiI7CisKKwkJU3RyaW5nIHN0YXR1cyA9ICIyMDAiOworCQlTdHJpbmcgZGVzYyA9ICJPSyI7CisKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RFU0MsIGRlc2MpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfVElNRVNUQU1QLCB0aW1lc3RhbXApOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU1RBVFVTLCBzdGF0dXMpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb24pOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX0lELCBkaXN0cmlidXRpb25JZCk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fQ09OU1VNRVJfSUQsIG1vZGlmaWVyVWlkKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9UT1BJQ19OQU1FLCB0b3BpY05hbWUpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1JFU09VUkNFX1VSTCwgcmVzb3VyY2VVcmwpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfRElTVFJJQlVUSU9OX1NUQVRVU19USU1FLCB0aW1lc3RhbXApOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfU0VSVklDRV9JTlNUQU5DRV9JRCwgc2VydmljZUlkKTsKKworCQlyZXR1cm4gcGFyYW1zOworCX0KKworCS8vIEBUZXN0CisJcHVibGljIHZvaWQgZ2V0TGlzdE9mRGlzdHJpYnV0aW9uQnlBY3Rpb25UZXN0KCkgeworCisJCVN0cmluZyB0aW1lc3RhbXAgPSAiMjAxNi0wNi0yMyAxMzozNDo1My4xMjMiOworCQlTdHJpbmcgZGlzdHJpYnV0aW9uSWQgPSAiMTIzLTQ1NiI7CisKKwkJU3RyaW5nIGNyZWF0aW9uUGVyaW9kID0gQ29uc3RhbnRzLk1PTlRIOworCQlTdHJpbmcgZXhwZWN0ZWRJbmRleE5hbWUgPSBhdWRpdGluZ0Rhby5nZXRJbmRleFByZWZpeCgpICsgIi0yMDE2LTA2IjsKKwkJYXNzZXJ0VHJ1ZSghZXNjbGllbnQuZ2V0Q2xpZW50KCkuYWRtaW4oKS5pbmRpY2VzKCkucHJlcGFyZUV4aXN0cyhleHBlY3RlZEluZGV4TmFtZSkuZXhlY3V0ZSgpLmFjdGlvbkdldCgpCisJCQkJLmlzRXhpc3RzKCkpOworCisJCS8vIENsaWVudCBjbGllbnQgPSBlc2NsaWVudC5nZXRDbGllbnQoKTsKKwkJLy8gZmluYWwgQ3JlYXRlSW5kZXhSZXF1ZXN0QnVpbGRlciBjcmVhdGVJbmRleFJlcXVlc3RCdWlsZGVyID0KKwkJLy8gY2xpZW50LmFkbWluKCkuaW5kaWNlcygpLnByZXBhcmVDcmVhdGUoZXhwZWN0ZWRJbmRleE5hbWUpOworCQkvLyBmaW5hbCBYQ29udGVudEJ1aWxkZXIgbWFwcGluZ0J1aWxkZXIgPQorCQkvLyBqc29uQnVpbGRlcigpLnN0YXJ0T2JqZWN0KCkuc3RhcnRPYmplY3QoInJlc291cmNlYWRtaW5ldmVudCIpCisJCS8vIC5zdGFydE9iamVjdCgiX3R0bCIpLmZpZWxkKCJlbmFibGVkIiwgInRydWUiKS5maWVsZCgiZGVmYXVsdCIsCisJCS8vICIxcyIpLmVuZE9iamVjdCgpLmVuZE9iamVjdCgpCisJCS8vIC5lbmRPYmplY3QoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKG1hcHBpbmdCdWlsZGVyLnN0cmluZygpKTsKKwkJLy8gY3JlYXRlSW5kZXhSZXF1ZXN0QnVpbGRlci5hZGRNYXBwaW5nKGRvY3VtZW50VHlwZSwgbWFwcGluZ0J1aWxkZXIpOworCQkvLworCQkvLyAvLyBNQVBQSU5HIERPTkUKKwkJLy8gY3JlYXRlSW5kZXhSZXF1ZXN0QnVpbGRlci5leGVjdXRlKCkuYWN0aW9uR2V0KCk7CisJCS8vCisJCS8vCisKKwkJTWFwPEF1ZGl0aW5nRmllbGRzS2V5c0VudW0sIE9iamVjdD4gcGFyYW1zID0gZ2V0UmVzb3VyY2VBZG1pbkV2ZW50UGFyYW1zKHRpbWVzdGFtcCwgIkRSZXF1ZXN0Iik7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIGRpc3RyaWJ1dGlvbklkKTsKKwkJdGVzdENyZWF0aW9uUGVyaW9kU2NlbmFyaW8ocGFyYW1zLCBjcmVhdGlvblBlcmlvZCwgZXhwZWN0ZWRJbmRleE5hbWUsIFJlc291cmNlQWRtaW5FdmVudC5jbGFzcyk7CisJCXBhcmFtcyA9IGdldERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50UGFyYW1zKHRpbWVzdGFtcCk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ESVNUUklCVVRJT05fSUQsIGRpc3RyaWJ1dGlvbklkKTsKKworCQl0ZXN0Q3JlYXRpb25QZXJpb2RTY2VuYXJpbyhwYXJhbXMsIGNyZWF0aW9uUGVyaW9kLCBleHBlY3RlZEluZGV4TmFtZSwgRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uRXZlbnQuY2xhc3MpOworCisJCUVpdGhlcjxMaXN0PEVTVGltZUJhc2VkRXZlbnQ+LCBBY3Rpb25TdGF0dXM+IGRpc3RyaWJ1dGlvbkJ5QWN0aW9uID0gYXVkaXRpbmdEYW8KKwkJCQkuZ2V0TGlzdE9mRGlzdHJpYnV0aW9uQnlBY3Rpb24oZGlzdHJpYnV0aW9uSWQsICJEUmVxdWVzdCIsICIyMDAiLCBSZXNvdXJjZUFkbWluRXZlbnQuY2xhc3MpOworCQlhc3NlcnRUcnVlKGRpc3RyaWJ1dGlvbkJ5QWN0aW9uLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RmFsc2UoZGlzdHJpYnV0aW9uQnlBY3Rpb24ubGVmdCgpLnZhbHVlKCkuaXNFbXB0eSgpKTsKKworCQlkaXN0cmlidXRpb25CeUFjdGlvbiA9IGF1ZGl0aW5nRGFvLmdldExpc3RPZkRpc3RyaWJ1dGlvbkJ5QWN0aW9uKGRpc3RyaWJ1dGlvbklkLCAiRE5vdGlmeSIsICIyMDAiLAorCQkJCURpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50LmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShkaXN0cmlidXRpb25CeUFjdGlvbi5pc0xlZnQoKSk7CisJCWFzc2VydEZhbHNlKGRpc3RyaWJ1dGlvbkJ5QWN0aW9uLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSk7CisKKwl9CisKKwlwcml2YXRlIE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+IGdldERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvbkV2ZW50UGFyYW1zKFN0cmluZyB0aW1lc3RhbXApIHsKKworCQlNYXA8QXVkaXRpbmdGaWVsZHNLZXlzRW51bSwgT2JqZWN0PiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLCBPYmplY3Q+KCk7CisKKwkJU3RyaW5nIGFjdGlvbiA9ICJETm90aWZ5IjsKKwkJU3RyaW5nIG1vZGlmaWVyTmFtZSA9ICJtb3NoZSBtb3NoZSI7CisJCVN0cmluZyBtb2RpZmllclVpZCA9ICJtb3NoZVVpZCI7CisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAiQ2VudG9zIjsKKwkJU3RyaW5nIHJlc291cmNlVHlwZSA9ICJSZXNvdXJjZSI7CisKKwkJU3RyaW5nIGN1cnJWZXJzaW9uID0gIjEuMS40IjsKKwkJU3RyaW5nIGN1cnJTdGF0ZSA9ICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI7CisJCVN0cmluZyBzdGF0dXMgPSAiMjAwIjsKKwkJU3RyaW5nIGRlc2MgPSAiT0siOworCQlTdHJpbmcgZGlkID0gIjEwMjciOworCQlTdHJpbmcgdG9waWNOYW1lID0gIkNlbnRvcyI7CisJCVN0cmluZyBzZXJ2aWNlSWQgPSAiU2V2aWNlSWQiOworCQlTdHJpbmcgcmVxdWVzdElkID0gIjEyMzY0IjsKKworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfQUNUSU9OLCBhY3Rpb24pOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSwgcmVxdWVzdElkKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX01PRElGSUVSX1VJRCwgbW9kaWZpZXJVaWQpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfTU9ESUZJRVJfTkFNRSwgbW9kaWZpZXJOYW1lKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1JFU09VUkNFX05BTUUsIHJlc291cmNlTmFtZSk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZVR5cGUpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9TVEFURSwgY3VyclN0YXRlKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9UT1BJQ19OQU1FLCB0b3BpY05hbWUpOworCQlwYXJhbXMucHV0KEF1ZGl0aW5nRmllbGRzS2V5c0VudW0uQVVESVRfUkVTT1VSQ0VfQ1VSUl9WRVJTSU9OLCBjdXJyVmVyc2lvbik7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9TVEFUVVMsIHN0YXR1cyk7CisJCXBhcmFtcy5wdXQoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9ERVNDLCBkZXNjKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUCwgdGltZXN0YW1wKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX0RJU1RSSUJVVElPTl9JRCwgZGlkKTsKKwkJcGFyYW1zLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1NFUlZJQ0VfSU5TVEFOQ0VfSUQsIHNlcnZpY2VJZCk7CisJCXJldHVybiBwYXJhbXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9DYXNzYW5kcmFUZXN0LmphdmEgYi9jYXRhbG9nLWRhby9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9DYXNzYW5kcmFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhZjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvcmVzb3VyY2VzL0Nhc3NhbmRyYVRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNlc3Npb247CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5tYXBwaW5nLk1hcHBlcjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLm1hcHBpbmcuTWFwcGluZ01hbmFnZXI7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uQWNjb3VudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgQ2Fzc2FuZHJhVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENhc3NhbmRyYVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIENsdXN0ZXIgY2x1c3RlcjsKKworCS8vICNcQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3J1ZCgpIHsKKwkJU3RyaW5nIG5vZGUgPSAibXRhbmp2OXNkY2c0NCI7CisKKwkJY2x1c3RlciA9IENsdXN0ZXIuYnVpbGRlcigpLmFkZENvbnRhY3RQb2ludChub2RlKS5idWlsZCgpOworCisJCS8vIFF1ZXJ5CisJCVN0cmluZyBxdWVyeSA9ICJDUkVBVEUgS0VZU1BBQ0UgSUYgTk9UIEVYSVNUUyBkc3Rlc3QgV0lUSCByZXBsaWNhdGlvbiAiCisJCQkJKyAiPSB7J2NsYXNzJzonU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzoxfTsiOworCisJCVN0cmluZyBxdWVyeVRhYmxlID0gIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGFjY291bnRzKGVtYWlsIHZhcmNoYXIgIFBSSU1BUlkgS0VZLCBuYW1lIHZhcmNoYXIpOyI7CisKKwkJU2Vzc2lvbiBzZXNzaW9uID0gY2x1c3Rlci5jb25uZWN0KCk7CisJCS8vIEV4ZWN1dGluZyB0aGUgcXVlcnkKKwkJc2Vzc2lvbi5leGVjdXRlKHF1ZXJ5KTsKKwkJLy8gLy91c2luZyB0aGUgS2V5U3BhY2UKKwkJc2Vzc2lvbi5leGVjdXRlKCJVU0UgZHN0ZXN0Iik7CisJCXNlc3Npb24uZXhlY3V0ZShxdWVyeVRhYmxlKTsKKworCQlNYXBwZXI8QWNjb3VudD4gbWFwcGVyID0gbmV3IE1hcHBpbmdNYW5hZ2VyKHNlc3Npb24pLm1hcHBlcihBY2NvdW50LmNsYXNzKTsKKwkJQWNjb3VudCBhY2NvdW50ID0gbmV3IEFjY291bnQoIkpvaG4gRG9lIiwgImpkQGV4YW1wbGUuY29tIik7CisJCS8vIENsYXNzPD8gZXh0ZW5kcyBBY2NvdW50PiBjbGFzczEgPSBhY2NvdW50LmdldENsYXNzKCk7CisJCS8vIENsYXNzIGNsYXNzMiA9IEFjY291bnQuY2xhc3M7CisJCW1hcHBlci5zYXZlKGFjY291bnQpOworCisJCUFjY291bnQgd2hvc2UgPSBtYXBwZXIuZ2V0KCJqZEBleGFtcGxlLmNvbSIpOworCQlsb2cuZGVidWcoIkFjY291bnQgbmFtZToge30iLCB3aG9zZS5nZXROYW1lKCkpOworCisJCWFjY291bnQuc2V0TmFtZSgiU2FtYW50YSBTbWl0Iik7CisJCW1hcHBlci5zYXZlKGFjY291bnQpOworCQl3aG9zZSA9IG1hcHBlci5nZXQoImpkQGV4YW1wbGUuY29tIik7CisJCWxvZy5kZWJ1ZygiQWNjb3VudCBuYW1lOiB7fSIsIHdob3NlLmdldE5hbWUoKSk7CisKKwkJbWFwcGVyLmRlbGV0ZShhY2NvdW50KTsKKwkJd2hvc2UgPSBtYXBwZXIuZ2V0KCJqZEBleGFtcGxlLmNvbSIpOworCisJCWNsdXN0ZXIuY2xvc2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9FU1VzZXJzREFPVGVzdC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvRVNVc2Vyc0RBT1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTlhY2JlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvRVNVc2Vyc0RBT1Rlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzOworCisvL0BSdW5XaXRoKFNwcmluZ0pVbml0NENsYXNzUnVubmVyLmNsYXNzKQorLy9AQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKKy8vQFRlc3RFeGVjdXRpb25MaXN0ZW5lcnMobGlzdGVuZXJzID0ge0RlcGVuZGVuY3lJbmplY3Rpb25UZXN0RXhlY3V0aW9uTGlzdGVuZXIuY2xhc3MsIERpcnRpZXNDb250ZXh0VGVzdEV4ZWN1dGlvbkxpc3RlbmVyLmNsYXNzLCBUcmFuc2FjdGlvbmFsVGVzdEV4ZWN1dGlvbkxpc3RlbmVyLmNsYXNzfSkKK3B1YmxpYyBjbGFzcyBFU1VzZXJzREFPVGVzdCB7CisKKwkvLyBAUmVzb3VyY2UKKwkvLyBFbGFzdGljU2VhcmNoQ2xpZW50IGVzY2xpZW50OworCS8vCisJLy8vLyBAUmVzb3VyY2UobmFtZSA9ICJ1c2Vycy1kYW8iKQorCS8vIHByaXZhdGUgSVVzZXJzREFPIHVzZXJzRGFvOworCisJLy8gQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmV3VXNlclN0dWIoKSB7CisKKwl9CisKKwkvLyBAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROZXdVc2VyKCkgeworCQkvLyBpZiggdXNlcnNEYW8gPT0gbnVsbCApeworCQkvLyBhc3NlcnRUcnVlKGZhbHNlKTsKKwkJLy8gfQorCQkvLworCQkvLyBTdHJpbmcgaWQgPSAieWh1ZmtzZDU3ODM0NjAxIjsKKwkJLy8gVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoIk15bmFtZSIsICJNeWxhc3RuYW1lIiwgaWQsICJlbWFpbCIsCisJCS8vICJUZXN0ZXIiKTsKKwkJLy8KKwkJLy8gQWN0aW9uU3RhdHVzIHNhdmVVc2VyRGF0YSA9IHVzZXJzRGFvLnNhdmVVc2VyRGF0YSh1c2VyRGF0YSk7CisJCS8vIGFzc2VydEVxdWFscyhzYXZlVXNlckRhdGEsIEFjdGlvblN0YXR1cy5PSyk7CisJCS8vCisJCS8vIEVpdGhlcjxVc2VyRGF0YSwgQWN0aW9uU3RhdHVzPiBzdGF0dXNGcm9tRXMgPQorCQkvLyB1c2Vyc0Rhby5nZXRVc2VyRGF0YShpZCk7CisJCS8vIGFzc2VydFRydWUoc3RhdHVzRnJvbUVzLmlzTGVmdCgpICk7CisJCS8vIFVzZXJEYXRhIGZyb21FcyA9IHN0YXR1c0Zyb21Fcy5sZWZ0KCkudmFsdWUoKTsKKwkJLy8gYXNzZXJ0Tm90TnVsbChmcm9tRXMpOworCQkvLyBhc3NlcnRFcXVhbHModXNlckRhdGEsIGZyb21Fcyk7CisJCS8vCisJCS8vCisJCS8vIHVzZXJzRGFvLmRlbGV0ZVVzZXJEYXRhKGlkKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvVGl0YW5HZW5lcmljRGFvVGVzdC5qYXZhIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9yZXNvdXJjZXMvVGl0YW5HZW5lcmljRGFvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTEwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3Jlc291cmNlcy9UaXRhbkdlbmVyaWNEYW9UZXN0LmphdmEKQEAgLTAsMCArMSw3MjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb25maWd1cmF0aW9uLkJhc2VDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkRpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby51dGlscy5Vc2VyU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudEluc3RhbmNlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5HcmFwaE5vZGVMb2NrOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuQ29udGV4dENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuVGVzdEV4ZWN1dGlvbkxpc3RlbmVyczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5qdW5pdDQuU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuc3VwcG9ydC5EZXBlbmRlbmN5SW5qZWN0aW9uVGVzdEV4ZWN1dGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LnN1cHBvcnQuRGlydGllc0NvbnRleHRUZXN0RXhlY3V0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbFRlc3RFeGVjdXRpb25MaXN0ZW5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuUHJvcGVydHlLZXk7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkVkZ2U7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkZhY3Rvcnk7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5hdHRyaWJ1dGUuVGV4dDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLnNjaGVtYS5UaXRhbk1hbmFnZW1lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQFJ1bldpdGgoU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitAQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKK0BUZXN0RXhlY3V0aW9uTGlzdGVuZXJzKGxpc3RlbmVycyA9IHsgRGVwZW5kZW5jeUluamVjdGlvblRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzcywKKwkJRGlydGllc0NvbnRleHRUZXN0RXhlY3V0aW9uTGlzdGVuZXIuY2xhc3MsIFRyYW5zYWN0aW9uYWxUZXN0RXhlY3V0aW9uTGlzdGVuZXIuY2xhc3MgfSkKK3B1YmxpYyBjbGFzcyBUaXRhbkdlbmVyaWNEYW9UZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGl0YW5HZW5lcmljRGFvVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOworCisJQFJlc291cmNlKG5hbWUgPSAidGl0YW4tZ2VuZXJpYy1kYW8iKQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQmVmb3JlQ2xhc3MoKSB7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLWRhbyIpOworCQlTdHJpbmcgYXBwQ29uZmlnRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1kYW8iOworCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcgRlNDb25maWd1cmF0aW9uU291cmNlKEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VMaXN0ZW5lcigpLAorCQkJCWFwcENvbmZpZ0Rpcik7CisJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25Tb3VyY2UpOworCQljb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkKKwkJCQkuc2V0VGl0YW5DZmdGaWxlKCIuLi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvdGl0YW4ucHJvcGVydGllcyIpOworCQljb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkuc2V0VGl0YW5Jbk1lbW9yeUdyYXBoKHRydWUpOworCX0KKworCS8vIEBUZXN0CisJcHVibGljIHZvaWQgdGVzdGNoZWNrRWRnZVByb3BzKCkgeworCQlUaXRhbkdyYXBoIGdyYXBoID0gdGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKTsKKwkJVGl0YW5WZXJ0ZXggdjEgPSBncmFwaC5hZGRWZXJ0ZXgoKTsKKwkJdjEucHJvcGVydHkoInByb3AxIiwgMTIzKTsKKwkJVGl0YW5WZXJ0ZXggdjIgPSBncmFwaC5hZGRWZXJ0ZXgoKTsKKwkJdjIucHJvcGVydHkoInByb3AxIiwgNDU2KTsKKwkJVGl0YW5FZGdlIGFkZEVkZ2UgPSB2MS5hZGRFZGdlKCJsYWJlbDExIiwgdjIpOworCQlhZGRFZGdlLnByb3BlcnR5KCJlZGdlUHJvcCIsICJteSBwcm9wIGVkZ2UiKTsKKwkJZ3JhcGgudHgoKS5jb21taXQoKTsKKworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2MTEgPSB0aXRhbkRhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KCJwcm9wMSIsIDEyMyk7CisJCUl0ZXJhdG9yPEVkZ2U+IGVkZ2VzID0gdjExLmxlZnQoKS52YWx1ZSgpLmVkZ2VzKERpcmVjdGlvbi5PVVQsICJsYWJlbDExIik7CisJCUVkZ2UgZWRnZSA9IGVkZ2VzLm5leHQoKTsKKwkJLy8gU3RyaW5nIHZhbHVlID0gKFN0cmluZyllZGdlLnZhbHVlKCJlZGdlUHJvcCIpOworCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSB0aXRhbkRhby5nZXRQcm9wZXJ0eShlZGdlLCAiZWRnZVByb3AiKTsKKwkJbG9nLmRlYnVnKHZhbHVlKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENydWROb2RlKCkgeworCisJCVN0cmluZyBpZCA9ICJ1c2VyMTIzNDVhYmMiOworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgiTXluYW1lMTIzIiwgIk15bGFzdG5hbWUiLCBpZCwgImVtYWlsMTIzIiwgIlRlc3RlciIsCisJCQkJVXNlclN0YXR1c0VudW0uQUNUSVZFLm5hbWUoKSwgbnVsbCk7CisKKwkJRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbmV3Tm9kZSA9IHRpdGFuRGFvLmNyZWF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKworCQlhc3NlcnRUcnVlKG5ld05vZGUuaXNMZWZ0KCkpOworCisJCWxvZy5kZWJ1Zygie30iLCBuZXdOb2RlLmxlZnQoKS52YWx1ZSgpKTsKKworCQl0aXRhbkRhby5jb21taXQoKTsKKworCQlJbW11dGFibGVQYWlyPFN0cmluZywgT2JqZWN0PiBrZXlWYWx1ZUlkID0gdXNlckRhdGEuZ2V0S2V5VmFsdWVJZCgpOworCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlID0gdGl0YW5EYW8uZ2V0Tm9kZShrZXlWYWx1ZUlkLmdldEtleSgpLCBrZXlWYWx1ZUlkLmdldFZhbHVlKCksCisJCQkJVXNlckRhdGEuY2xhc3MpOworCQl0aXRhbkRhby5jb21taXQoKTsKKwkJYXNzZXJ0VHJ1ZShub2RlLmlzTGVmdCgpKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIG5vZGUubGVmdCgpLnZhbHVlKCkpOworCisJCXVzZXJEYXRhLnNldFJvbGUoIkRlc2lnbmVyIik7CisJCW5vZGUgPSB0aXRhbkRhby51cGRhdGVOb2RlKHVzZXJEYXRhLCBVc2VyRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUobm9kZS5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCBub2RlLmxlZnQoKS52YWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsICJEZXNpZ25lciIsIG5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0Um9sZSgpKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJbm9kZSA9IHRpdGFuRGFvLmRlbGV0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShub2RlLmlzTGVmdCgpKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIG5vZGUubGVmdCgpLnZhbHVlKCkpOworCQl0aXRhbkRhby5jb21taXQoKTsKKworCQlub2RlID0gdGl0YW5EYW8uZ2V0Tm9kZShrZXlWYWx1ZUlkLmdldEtleSgpLCBrZXlWYWx1ZUlkLmdldFZhbHVlKCksIFVzZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShub2RlLmlzUmlnaHQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCBub2RlLnJpZ2h0KCkudmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRCeUNhdGVnb3J5QW5kQWxsKCkgeworCisJCS8vIGNyZWF0ZSAyIG5vZGVzCisJCVN0cmluZyBpZCA9ICJ1c2VyMTIzNDVhYmMiOworCQlVc2VyRGF0YSB1c2VyRGF0YTEgPSBuZXcgVXNlckRhdGEoIk15bmFtZTEyMyIsICJNeWxhc3RuYW1lIiwgaWQsICJlbWFpbDEyMyIsICJUZXN0ZXIiLAorCQkJCVVzZXJTdGF0dXNFbnVtLkFDVElWRS5uYW1lKCksIG51bGwpOworCisJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5vZGUxID0gdGl0YW5EYW8uY3JlYXRlTm9kZSh1c2VyRGF0YTEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShub2RlMS5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCBub2RlMS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJaWQgPSAidXNlcmRma29lcjQ1YWJjIjsKKwkJVXNlckRhdGEgdXNlckRhdGEyID0gbmV3IFVzZXJEYXRhKCJNeW5hZHlobWUxMjMiLCAiTXlsYXNnaHRuYW1lIiwgaWQsICJlbWFpZ2hkbDEyMyIsICJEZXNpZ25lciIsCisJCQkJVXNlclN0YXR1c0VudW0uQUNUSVZFLm5hbWUoKSwgbnVsbCk7CisJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5vZGUyID0gdGl0YW5EYW8uY3JlYXRlTm9kZSh1c2VyRGF0YTIsIFVzZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShub2RlMi5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCBub2RlMi5sZWZ0KCkudmFsdWUoKSk7CisKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIE9iamVjdD4ga2V5VmFsdWVJZDEgPSB1c2VyRGF0YTEuZ2V0S2V5VmFsdWVJZCgpOworCQkvLyBnZXQgZmlyc3Qgbm9kZQorCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlID0gdGl0YW5EYW8uZ2V0Tm9kZShrZXlWYWx1ZUlkMS5nZXRLZXkoKSwga2V5VmFsdWVJZDEuZ2V0VmFsdWUoKSwKKwkJCQlVc2VyRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUobm9kZS5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCBub2RlLmxlZnQoKS52YWx1ZSgpKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJLy8gZ2V0IGFsbCBtdXN0IGJlIDIgKyAxIGRlZmF1bHQgdXNlciA9IDMKKwkJRWl0aGVyPExpc3Q8VXNlckRhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsID0gdGl0YW5EYW8uZ2V0QWxsKE5vZGVUeXBlRW51bS5Vc2VyLCBVc2VyRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoYWxsLmlzTGVmdCgpKTsKKwkJYXNzZXJ0VHJ1ZShhbGwubGVmdCgpLnZhbHVlKCkuc2l6ZSgpID4gMCk7CisKKwkJbG9nLmRlYnVnKCJ7fSIsIGFsbC5sZWZ0KCkudmFsdWUoKSk7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCXByb3BzLnB1dChrZXlWYWx1ZUlkMS5nZXRLZXkoKSwga2V5VmFsdWVJZDEuZ2V0VmFsdWUoKSk7CisKKwkJLy8gZ2V0IGJ5IGNyaXRlcmlhLiBtdXN0IGJlIDEKKwkJRWl0aGVyPExpc3Q8VXNlckRhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYnlDcml0ZXJpYSA9IHRpdGFuRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlVzZXIsIHByb3BzLAorCQkJCVVzZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuc2l6ZSgpKTsKKworCQlsb2cuZGVidWcoInt9IiwgYnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJLy8gZGVsZXRlIGFsbCBub2RlcworCQlub2RlID0gdGl0YW5EYW8uZGVsZXRlTm9kZSh1c2VyRGF0YTEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShub2RlLmlzTGVmdCgpKTsKKwkJbm9kZSA9IHRpdGFuRGFvLmRlbGV0ZU5vZGUodXNlckRhdGEyLCBVc2VyRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUobm9kZS5pc0xlZnQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RWRnZXNGb3JOb2RlKCkgeworCQlTdHJpbmcgaWQgPSAidXNlcjEyMzQ1YWJjIjsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoIk15bmFtZTEyMyIsICJNeWxhc3RuYW1lIiwgaWQsICJlbWFpbDEyMyIsIFVzZXJSb2xlRW51bS5BRE1JTi5uYW1lKCksCisJCQkJVXNlclN0YXR1c0VudW0uQUNUSVZFLm5hbWUoKSwgbnVsbCk7CisJCXRpdGFuRGFvLmNyZWF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0TmFtZSgicmVzb3VyY2VGb3JMb2NrIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VmVyc2lvbigiMC4xIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3RhdGUoIm5ld1N0YXRlIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkgKyAiLiIKKwkJCQkrIHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKTsKKworCQl0aXRhbkRhby5jcmVhdGVOb2RlKHJlc291cmNlRGF0YSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQl0aXRhbkRhby5jcmVhdGVSZWxhdGlvbih1c2VyRGF0YSwgcmVzb3VyY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9NT0RJRklFUiwgbnVsbCk7CisJCXRpdGFuRGFvLmNvbW1pdCgpOworCisJCUVpdGhlcjxMaXN0PEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyRWRnZXMgPSB0aXRhbkRhby5nZXRFZGdlc0Zvck5vZGUodXNlckRhdGEsIERpcmVjdGlvbi5PVVQpOworCQlhc3NlcnRUcnVlKGVpdGhlckVkZ2VzLmlzTGVmdCgpKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJFZGdlcy5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPT0gMSk7CisKKwkJZWl0aGVyRWRnZXMgPSB0aXRhbkRhby5nZXRFZGdlc0Zvck5vZGUodXNlckRhdGEsIERpcmVjdGlvbi5JTik7CisJCWFzc2VydFRydWUoZWl0aGVyRWRnZXMuaXNMZWZ0KCkpOworCQlhc3NlcnRUcnVlKGVpdGhlckVkZ2VzLmxlZnQoKS52YWx1ZSgpLnNpemUoKSA9PSAwKTsKKworCQllaXRoZXJFZGdlcyA9IHRpdGFuRGFvLmdldEVkZ2VzRm9yTm9kZShyZXNvdXJjZURhdGEsIERpcmVjdGlvbi5PVVQpOworCQlhc3NlcnRUcnVlKGVpdGhlckVkZ2VzLmlzTGVmdCgpKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJFZGdlcy5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPT0gMCk7CisKKwkJZWl0aGVyRWRnZXMgPSB0aXRhbkRhby5nZXRFZGdlc0Zvck5vZGUocmVzb3VyY2VEYXRhLCBEaXJlY3Rpb24uSU4pOworCQlhc3NlcnRUcnVlKGVpdGhlckVkZ2VzLmlzTGVmdCgpKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJFZGdlcy5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPT0gMSk7CisKKwkJZWl0aGVyRWRnZXMgPSB0aXRhbkRhby5nZXRFZGdlc0Zvck5vZGUocmVzb3VyY2VEYXRhLCBEaXJlY3Rpb24uQk9USCk7CisJCWFzc2VydFRydWUoZWl0aGVyRWRnZXMuaXNMZWZ0KCkpOworCQlhc3NlcnRUcnVlKGVpdGhlckVkZ2VzLmxlZnQoKS52YWx1ZSgpLnNpemUoKSA9PSAxKTsKKworCQllaXRoZXJFZGdlcyA9IHRpdGFuRGFvLmdldEVkZ2VzRm9yTm9kZSh1c2VyRGF0YSwgRGlyZWN0aW9uLkJPVEgpOworCQlhc3NlcnRUcnVlKGVpdGhlckVkZ2VzLmlzTGVmdCgpKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXJFZGdlcy5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPT0gMSk7CisKKwkJdGl0YW5EYW8uZGVsZXRlTm9kZSh1c2VyRGF0YSwgVXNlckRhdGEuY2xhc3MpOworCQl0aXRhbkRhby5kZWxldGVOb2RlKHJlc291cmNlRGF0YSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQl0aXRhbkRhby5jb21taXQoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMb2NrRWxlbWVudCgpIHsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoInJlc291cmNlRm9yTG9jayIpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFZlcnNpb24oIjAuMSIpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFN0YXRlKCJuZXdTdGF0ZSIpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpICsgIi4iCisJCQkJKyByZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSk7CisKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2UxID0gdGl0YW5EYW8uY3JlYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHJlc291cmNlMS5pc0xlZnQoKSk7CisJCXRpdGFuRGFvLmNvbW1pdCgpOworCQlTdHJpbmcgbG9ja0lkID0gImxvY2tfIiArIHJlc291cmNlRGF0YS5nZXRMYWJlbCgpICsgIl8iICsgcmVzb3VyY2UxLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPEdyYXBoTm9kZUxvY2ssIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlTG9jayA9IHRpdGFuRGFvCisJCQkJLmdldE5vZGUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgbG9ja0lkLCBHcmFwaE5vZGVMb2NrLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShub2RlTG9jay5pc1JpZ2h0KCkpOworCQlhc3NlcnRFcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELCBub2RlTG9jay5yaWdodCgpLnZhbHVlKCkpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHRpdGFuRGFvLmxvY2tFbGVtZW50KHJlc291cmNlRGF0YSk7CisJCWFzc2VydEVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSywgc3RhdHVzKTsKKworCQlub2RlTG9jayA9IHRpdGFuRGFvLmdldE5vZGUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgbG9ja0lkLCBHcmFwaE5vZGVMb2NrLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShub2RlTG9jay5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhsb2NrSWQsIG5vZGVMb2NrLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCisJCXRpdGFuRGFvLmNvbW1pdCgpOworCisJCXN0YXR1cyA9IHRpdGFuRGFvLmxvY2tFbGVtZW50KHJlc291cmNlRGF0YSk7CisJCWFzc2VydEVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0xPQ0tFRCwgc3RhdHVzKTsKKworCQlzdGF0dXMgPSB0aXRhbkRhby5yZWxlYXNlRWxlbWVudChyZXNvdXJjZURhdGEpOworCQlhc3NlcnRFcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0ssIHN0YXR1cyk7CisKKwkJbm9kZUxvY2sgPSB0aXRhbkRhby5nZXROb2RlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIGxvY2tJZCwgR3JhcGhOb2RlTG9jay5jbGFzcyk7CisJCWFzc2VydFRydWUobm9kZUxvY2suaXNSaWdodCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwgbm9kZUxvY2sucmlnaHQoKS52YWx1ZSgpKTsKKwkJdGl0YW5EYW8uZGVsZXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZUxvY2tFbGVtZW50KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoInJlc291cmNlRm9yUmVMb2NrIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VmVyc2lvbigiMC4xIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3RhdGUoIm5ld1N0YXRlIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkgKyAiLiIKKwkJCQkrIHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKTsKKworCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZTEgPSB0aXRhbkRhby5jcmVhdGVOb2RlKHJlc291cmNlRGF0YSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUocmVzb3VyY2UxLmlzTGVmdCgpKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisJCVN0cmluZyBsb2NrSWQgPSAibG9ja18iICsgcmVzb3VyY2VEYXRhLmdldExhYmVsKCkgKyAiXyIgKyByZXNvdXJjZTEubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8R3JhcGhOb2RlTG9jaywgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5vZGVMb2NrID0gdGl0YW5EYW8KKwkJCQkuZ2V0Tm9kZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCBsb2NrSWQsIEdyYXBoTm9kZUxvY2suY2xhc3MpOworCQlhc3NlcnRUcnVlKG5vZGVMb2NrLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsIG5vZGVMb2NrLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJLy8gbG9jaworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSB0aXRhbkRhby5sb2NrRWxlbWVudChyZXNvdXJjZURhdGEpOworCQlhc3NlcnRFcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0ssIHN0YXR1cyk7CisKKwkJbm9kZUxvY2sgPSB0aXRhbkRhby5nZXROb2RlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIGxvY2tJZCwgR3JhcGhOb2RlTG9jay5jbGFzcyk7CisJCWFzc2VydFRydWUobm9kZUxvY2suaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMobG9ja0lkLCBub2RlTG9jay5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKwkJbG9uZyB0aW1lMSA9IG5vZGVMb2NrLmxlZnQoKS52YWx1ZSgpLmdldFRpbWUoKTsKKworCQl0aXRhbkRhby5jb21taXQoKTsKKworCQkvLyB0aW1lb3V0CisJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKS5zZXRUaXRhbkxvY2tUaW1lb3V0KDJMKTsKKwkJVGhyZWFkLnNsZWVwKDUwMDEpOworCisJCS8vIHJlbG9jaworCQlzdGF0dXMgPSB0aXRhbkRhby5sb2NrRWxlbWVudChyZXNvdXJjZURhdGEpOworCQlhc3NlcnRFcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0ssIHN0YXR1cyk7CisKKwkJbm9kZUxvY2sgPSB0aXRhbkRhby5nZXROb2RlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIGxvY2tJZCwgR3JhcGhOb2RlTG9jay5jbGFzcyk7CisJCWFzc2VydFRydWUobm9kZUxvY2suaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMobG9ja0lkLCBub2RlTG9jay5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKworCQlsb25nIHRpbWUyID0gbm9kZUxvY2subGVmdCgpLnZhbHVlKCkuZ2V0VGltZSgpOworCisJCWFzc2VydFRydWUodGltZTIgPiB0aW1lMSk7CisKKwkJc3RhdHVzID0gdGl0YW5EYW8ucmVsZWFzZUVsZW1lbnQocmVzb3VyY2VEYXRhKTsKKwkJYXNzZXJ0RXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LLCBzdGF0dXMpOworCisJCW5vZGVMb2NrID0gdGl0YW5EYW8uZ2V0Tm9kZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCBsb2NrSWQsIEdyYXBoTm9kZUxvY2suY2xhc3MpOworCQlhc3NlcnRUcnVlKG5vZGVMb2NrLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsIG5vZGVMb2NrLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJdGl0YW5EYW8uZGVsZXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuKCkgeworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoInJlc291cmNlRm9yTG9jayIpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFZlcnNpb24oIjAuMSIpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFN0YXRlKCJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0SGlnaGVzdFZlcnNpb24odHJ1ZSk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkgKyAiLiIKKwkJCQkrIHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKTsKKworCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZTEgPSB0aXRhbkRhby5jcmVhdGVOb2RlKHJlc291cmNlRGF0YSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUocmVzb3VyY2UxLmlzTGVmdCgpKTsKKworCQlyZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoInJlc291cmNlRm9yTG9jayIpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFZlcnNpb24oIjAuMiIpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFN0YXRlKCJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIik7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0SGlnaGVzdFZlcnNpb24oZmFsc2UpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpICsgIi4iCisJCQkJKyByZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSk7CisKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2UyID0gdGl0YW5EYW8uY3JlYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQl0aXRhbkRhby5jb21taXQoKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKwkJcHJvcHMucHV0KCJuYW1lIiwgInJlc291cmNlRm9yTG9jayIpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgZmFsc2UpOworCisJCS8vIGdldCBieSBjcml0ZXJpYS4gbXVzdCBiZSAxCisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkRhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcHMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhLmlzTGVmdCgpKTsKKworCQl0aXRhbkRhby5kZWxldGVOb2RlKHJlc291cmNlMS5sZWZ0KCkudmFsdWUoKSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCXRpdGFuRGFvLmRlbGV0ZU5vZGUocmVzb3VyY2UyLmxlZnQoKS52YWx1ZSgpLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNvbW1pdCgpOworCX0KKworCS8vIEBUZXN0CisJcHVibGljIHZvaWQgdGVzdFN0cmluZ1NlYXJjaCgpIHsKKwkJVGl0YW5HcmFwaCBncmFwaDsKKworCQlCYXNlQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IEJhc2VDb25maWd1cmF0aW9uKCk7CisJCWNvbmYuc2V0UHJvcGVydHkoInN0b3JhZ2UuYmFja2VuZCIsICJpbm1lbW9yeSIpOworCQlncmFwaCA9IFRpdGFuRmFjdG9yeS5vcGVuKGNvbmYpOworCisJCS8vIFRpdGFuTWFuYWdlbWVudCBncmFwaE1ndCA9IGdyYXBoLmdldE1hbmFnZW1lbnRTeXN0ZW0oKTsKKwkJVGl0YW5NYW5hZ2VtZW50IGdyYXBoTWd0ID0gZ3JhcGgub3Blbk1hbmFnZW1lbnQoKTsKKwkJUHJvcGVydHlLZXkgcHJvcEtleSA9IGdyYXBoTWd0Lm1ha2VQcm9wZXJ0eUtleSgic3RyaW5nMSIpLmRhdGFUeXBlKFN0cmluZy5jbGFzcykubWFrZSgpOworCQlncmFwaE1ndC5idWlsZEluZGV4KCJzdHJpbmcxIiwgVmVydGV4LmNsYXNzKS5hZGRLZXkocHJvcEtleSkudW5pcXVlKCkuYnVpbGRDb21wb3NpdGVJbmRleCgpOworCisJCXByb3BLZXkgPSBncmFwaE1ndC5tYWtlUHJvcGVydHlLZXkoInN0cmluZzIiKS5kYXRhVHlwZShTdHJpbmcuY2xhc3MpLm1ha2UoKTsKKworCQkvLyBncmFwaE1ndC5idWlsZEluZGV4KCJzdHJpbmcyIiwgVmVydGV4LmNsYXNzKS5hZGRLZXkocHJvcEtleSwKKwkJLy8gTWFwcGluZy5URVhULmdldFBhcmFtZXRlcigpKS5idWlsZE1peGVkSW5kZXgoInNlYXJjaCIpOworCQlncmFwaE1ndC5idWlsZEluZGV4KCJzdHJpbmcyIiwgVmVydGV4LmNsYXNzKS5hZGRLZXkocHJvcEtleSkudW5pcXVlKCkuYnVpbGRDb21wb3NpdGVJbmRleCgpOworCQlncmFwaE1ndC5jb21taXQoKTsKKworCQkvLyBUaXRhblZlcnRleCB2ID0gZ3JhcGguYWRkVmVydGV4KCk7CisJCS8vIHYuYWRkUHJvcGVydHkoInN0cmluZzEiLCAiTXkgbmV3IFN0cmluZyAxIik7CisJCS8vIHYuYWRkUHJvcGVydHkoInN0cmluZzIiLCAiU3RyaW5nMTEiKTsKKwkJLy8gZ3JhcGguY29tbWl0KCk7CisJCS8vCisJCS8vIHYgPSBncmFwaC5hZGRWZXJ0ZXgoKTsKKwkJLy8gdi5hZGRQcm9wZXJ0eSgic3RyaW5nMSIsICJteSBuZXcgc3RyaW5nIDEiKTsKKwkJLy8gdi5hZGRQcm9wZXJ0eSgic3RyaW5nMiIsICJzdHJpbmcxMSIpOworCQkvLyBncmFwaC5jb21taXQoKTsKKwkJLy8KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaXJzdCBpbmRleCBzZWFyY2ggLSBjYXNlIik7CisJCS8vCisJCS8vIEl0ZXJhYmxlPFZlcnRleD4gdmVydGljZXMgPSBncmFwaC5nZXRWZXJ0aWNlcygic3RyaW5nMSIsICJNeSBuZXcKKwkJLy8gU3RyaW5nIDEiKTsKKwkJLy8gSXRlcmF0b3I8VmVydGV4PiBpdGVyID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJLy8gd2hpbGUgKCBpdGVyLmhhc05leHQoKSApeworCQkvLyBWZXJ0ZXggdmVyID0gaXRlci5uZXh0KCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihjb20udGlua2VycG9wLmJsdWVwcmludHMudXRpbC5FbGVtZW50SGVscGVyLmdldFByb3BlcnRpZXModmVyKSk7CisJCS8vIH0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaXJzdCBpbmRleCBzZWFyY2ggbm9uIGNhc2UiKTsKKwkJLy8KKwkJLy8gdmVydGljZXMgPSBncmFwaC5nZXRWZXJ0aWNlcygic3RyaW5nMSIsICJteSBuZXcgc3RyaW5nIDEiKTsKKwkJLy8gaXRlciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCS8vIHdoaWxlICggaXRlci5oYXNOZXh0KCkgKXsKKwkJLy8gVmVydGV4IHZlciA9IGl0ZXIubmV4dCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLnV0aWwuRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcikpOworCQkvLyB9CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2Vjb25kIGluZGV4IHNlYXJjaCBjYXNlIik7CisJCS8vCisJCS8vIHZlcnRpY2VzID0gZ3JhcGguZ2V0VmVydGljZXMoInN0cmluZzIiLCAiU3RyaW5nMTEiKTsKKwkJLy8gaXRlciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCS8vIHdoaWxlICggaXRlci5oYXNOZXh0KCkgKXsKKwkJLy8gVmVydGV4IHZlciA9IGl0ZXIubmV4dCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLnV0aWwuRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcikpOworCQkvLyB9CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2Vjb25kIGluZGV4IHNlYXJjaCBub24gY2FzZSIpOworCQkvLworCQkvLyB2ZXJ0aWNlcyA9IGdyYXBoLmdldFZlcnRpY2VzKCJzdHJpbmcyIiwgInN0cmluZzExIik7CisJCS8vIGl0ZXIgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkvLyB3aGlsZSAoIGl0ZXIuaGFzTmV4dCgpICl7CisJCS8vIFZlcnRleCB2ZXIgPSBpdGVyLm5leHQoKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy51dGlsLkVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXIpKTsKKwkJLy8gfQorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlF1ZXJ5IGluZGV4IHNlYXJjaCBjYXNlIik7CisJCS8vIHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS5oYXMoInN0cmluZzEiLCAiTXkgbmV3IFN0cmluZworCQkvLyAxIikudmVydGljZXMoKTsKKwkJLy8gaXRlciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCS8vIHdoaWxlICggaXRlci5oYXNOZXh0KCkgKXsKKwkJLy8gVmVydGV4IHZlciA9IGl0ZXIubmV4dCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLnV0aWwuRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcikpOworCQkvLyB9CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUXVlcnkgaW5kZXggc2VhcmNoIG5vbiBjYXNlIik7CisJCS8vIHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS5oYXMoInN0cmluZzEiLCAibXkgbmV3IHN0cmluZworCQkvLyAxIikudmVydGljZXMoKTsKKwkJLy8gaXRlciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCS8vIHdoaWxlICggaXRlci5oYXNOZXh0KCkgKXsKKwkJLy8gVmVydGV4IHZlciA9IGl0ZXIubmV4dCgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLnV0aWwuRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcikpOworCQkvLyB9CisKKwkJbG9nLmRlYnVnKCIqKioqIHByZWRpY2F0IGluZGV4IHNlYXJjaCBub24gY2FzZSIpOworCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSBncmFwaC5xdWVyeSgpLmhhcygic3RyaW5nMSIsIFRleHQuUkVHRVgsICJteSBuZXcgc3RyaW5nIDEiKS52ZXJ0aWNlcygpOworCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJVmVydGV4IHZlciA9IGl0ZXIubmV4dCgpOworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy51dGlsLkVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXIpKTsKKwkJCWxvZy5kZWJ1Zygie30iLCB0aXRhbkRhby5nZXRQcm9wZXJ0aWVzKHZlcikpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVSZXN1bHREdWVUb1RpdGFuQnVnKCkgeworCisJCS8vIFRpdGFuR3JhcGggdGl0YW5HcmFwaCA9IHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCk7CisJCS8vIFRpdGFuTWFuYWdlbWVudCBtYW5hZ2VtZW50U3lzdGVtID0gdGl0YW5HcmFwaC5nZXRNYW5hZ2VtZW50U3lzdGVtKCk7CisKKwkJLy8gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeVtdIHByb3BlcnRpZXMgPSB7CisJCS8vIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfQUJTVFJBQ1QsCisJCS8vIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQURESVRJT05BTF9JTkZPX0lEX1RPX0tFWSwKKwkJLy8gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QT1NJVElPTl9YLAorCQkvLyBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFSVElGQUNUX1RJTUVPVVQgfTsKKwkJLy8KKwkJLy8gZm9yIChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5IHByb3BlcnR5IDogcHJvcGVydGllcykgeworCQkvLyBpZiAoZmFsc2UgPT0KKwkJLy8gbWFuYWdlbWVudFN5c3RlbS5jb250YWluc0dyYXBoSW5kZXgocHJvcGVydHkuZ2V0UHJvcGVydHkoKSkpIHsKKwkJLy8gUHJvcGVydHlLZXkgcHJvcEtleTEgPQorCQkvLyBtYW5hZ2VtZW50U3lzdGVtLm1ha2VQcm9wZXJ0eUtleShwcm9wZXJ0eS5nZXRQcm9wZXJ0eSgpKS5kYXRhVHlwZShwcm9wZXJ0eS5nZXRDbGF6eigpKS5tYWtlKCk7CisJCS8vIG1hbmFnZW1lbnRTeXN0ZW0uYnVpbGRJbmRleChwcm9wZXJ0eS5nZXRQcm9wZXJ0eSgpLAorCQkvLyBWZXJ0ZXguY2xhc3MpLmFkZEtleShwcm9wS2V5MSkudW5pcXVlKCkuYnVpbGRDb21wb3NpdGVJbmRleCgpOworCQkvLyB9CisJCS8vIH0KKworCQkvLyBtYW5hZ2VtZW50U3lzdGVtLmNvbW1pdCgpOworCisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YTEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJcmVzb3VyY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoIkEiKTsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIHJlc291cmNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5zZXRBYnN0cmFjdCh0cnVlKTsKKwkJcmVzb3VyY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0TmFtZSgiYWFhYSIpOworCisJCUVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5ld05vZGUxID0gdGl0YW5EYW8uY3JlYXRlTm9kZShyZXNvdXJjZURhdGExLAorCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShuZXdOb2RlMS5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCBuZXdOb2RlMS5sZWZ0KCkudmFsdWUoKSk7CisJCS8vIHRpdGFuRGFvLmNvbW1pdCgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0FCU1RSQUNULmdldFByb3BlcnR5KCksIHRydWUpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBieUNyaXRlcmlhID0gdGl0YW5EYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoYnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlc3VsdCByZXR1cm5lZCIsIDEsIGJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuc2l6ZSgpKTsKKwkJLy8gdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VUb1VwZGF0ZSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgcmVzb3VyY2VUb1VwZGF0ZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpLnNldEFic3RyYWN0KGZhbHNlKTsKKwkJcmVzb3VyY2VUb1VwZGF0ZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoIkEiKTsKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuRGFvLnVwZGF0ZU5vZGUocmVzb3VyY2VUb1VwZGF0ZSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisJCS8vIHRpdGFuRGFvLmNvbW1pdCgpOworCisJCWJ5Q3JpdGVyaWEgPSB0aXRhbkRhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcHMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlc3VsdCByZXR1cm5lZCBkdWUgdG8gdGl0YW4gYnVnIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELAorCQkJCWJ5Q3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEgaW5mb1BhcmFtZXRlckRhdGEgPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhKCk7CisJCWluZm9QYXJhbWV0ZXJEYXRhLmdldEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZCgiMTIzIik7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaWRUb0tleSA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJaWRUb0tleS5wdXQoImtleTEiLCAidmFsdWUxIik7CisJCWluZm9QYXJhbWV0ZXJEYXRhLnNldElkVG9LZXkoaWRUb0tleSk7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5ld05vZGUyID0gdGl0YW5EYW8uY3JlYXRlTm9kZShpbmZvUGFyYW1ldGVyRGF0YSwKKwkJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKG5ld05vZGUyLmlzTGVmdCgpKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIG5ld05vZGUyLmxlZnQoKS52YWx1ZSgpKTsKKwkJLy8gdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBpZFRvS2V5MiA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJaWRUb0tleTIucHV0KCJrZXkxIiwgInZhbHVlMiIpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMyID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wczIucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksICIxMjMiKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJcHJvcHMyLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFERElUSU9OQUxfSU5GT19JRF9UT19LRVkuZ2V0UHJvcGVydHkoKSwgZ3Nvbi50b0pzb24oaWRUb0tleTIpKTsKKwkJLy8gcHJvcHMyLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFERElUSU9OQUxfSU5GT19JRF9UT19LRVkuZ2V0UHJvcGVydHkoKSwKKwkJLy8gaWRUb0tleTIpOworCisJCUVpdGhlcjxMaXN0PEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBieUNyaXRlcmlhMiA9IHRpdGFuRGFvCisJCQkJLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLkFkZGl0aW9uYWxJbmZvUGFyYW1ldGVycywgcHJvcHMyLCBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGJ5Q3JpdGVyaWEyLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlc3VsdCByZXR1cm5lZCBkdWUgdG8gdGl0YW4gYnVnIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELAorCQkJCWJ5Q3JpdGVyaWEyLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJaW5mb1BhcmFtZXRlckRhdGEuc2V0SWRUb0tleShpZFRvS2V5Mik7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUyID0gdGl0YW5EYW8udXBkYXRlTm9kZShpbmZvUGFyYW1ldGVyRGF0YSwKKwkJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHVwZGF0ZU5vZGUyLmlzTGVmdCgpKTsKKwkJLy8gdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJcHJvcHMyLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFERElUSU9OQUxfSU5GT19JRF9UT19LRVkuZ2V0UHJvcGVydHkoKSwgaWRUb0tleSk7CisJCWJ5Q3JpdGVyaWEyID0gdGl0YW5EYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJzLCBwcm9wczIsCisJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhMi5pc1JpZ2h0KCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIG9uZSByZXN1bHQgcmV0dXJuZWQgZHVlIHRvIHRpdGFuIGJ1ZyIsIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwKKwkJCQlieUNyaXRlcmlhMi5yaWdodCgpLnZhbHVlKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlRGF0YSByZXNvdXJjZUluc3RhbmNlRGF0YSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZURhdGEoKTsKKwkJcmVzb3VyY2VJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoInJpMTIzIik7CisJCXJlc291cmNlSW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLnNldFBvc1goIjIyIik7CisJCXJlc291cmNlSW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoIm15cmVzb3VyY2VfMSIpOworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBuZXdOb2RlMyA9IHRpdGFuRGFvLmNyZWF0ZU5vZGUocmVzb3VyY2VJbnN0YW5jZURhdGEsCisJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShuZXdOb2RlMy5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCBuZXdOb2RlMy5sZWZ0KCkudmFsdWUoKSk7CisJCS8vIHRpdGFuRGFvLmNvbW1pdCgpOworCisJCXJlc291cmNlSW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLnNldFBvc1goIjUwIik7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlMyA9IHRpdGFuRGFvLnVwZGF0ZU5vZGUocmVzb3VyY2VJbnN0YW5jZURhdGEsCisJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZSh1cGRhdGVOb2RlMy5pc0xlZnQoKSk7CisJCS8vIHRpdGFuRGFvLmNvbW1pdCgpOworCisJCXJlc291cmNlSW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoIm15cmVzb3VyY2VfMiIpOworCQl1cGRhdGVOb2RlMyA9IHRpdGFuRGFvLnVwZGF0ZU5vZGUocmVzb3VyY2VJbnN0YW5jZURhdGEsIENvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUodXBkYXRlTm9kZTMuaXNMZWZ0KCkpOworCQkvLyB0aXRhbkRhby5jb21taXQoKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzMyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMzLnB1dCgicG9zaXRpb25YIiwgIjIyIik7CisJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBieUNyaXRlcmlhMyA9IHRpdGFuRGFvCisJCQkJLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsIHByb3BzMywgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhMy5pc1JpZ2h0KCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIG9uZSByZXN1bHQgcmV0dXJuZWQgZHVlIHRvIHRpdGFuIGJ1ZyIsIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwKKwkJCQlieUNyaXRlcmlhMy5yaWdodCgpLnZhbHVlKCkpOworCisJCXByb3BzMy5wdXQoInBvc2l0aW9uWCIsICI1MCIpOworCQlieUNyaXRlcmlhMyA9IHRpdGFuRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsIHByb3BzMywgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhMy5pc0xlZnQoKSk7CisKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGNoZWNrIGludGVnZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IG5ldyBBcnRpZmFjdERhdGEoKTsKKwkJYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZCgiYWQyMzQiKTsKKwkJYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5zZXRUaW1lb3V0KDEwMCk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5ld05vZGU0ID0gdGl0YW5EYW8uY3JlYXRlTm9kZShhcnRpZmFjdERhdGEsIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUobmV3Tm9kZTQuaXNMZWZ0KCkpOworCQlsb2cuZGVidWcoInt9IiwgbmV3Tm9kZTQubGVmdCgpLnZhbHVlKCkpOworCQkvLyB0aXRhbkRhby5jb21taXQoKTsKKworCQlhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLnNldFRpbWVvdXQoNTApOworCQlFaXRoZXI8QXJ0aWZhY3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZTQgPSB0aXRhbkRhby51cGRhdGVOb2RlKGFydGlmYWN0RGF0YSwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZSh1cGRhdGVOb2RlNC5pc0xlZnQoKSk7CisJCS8vIHRpdGFuRGFvLmNvbW1pdCgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHM0ID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wczQucHV0KCJ0aW1lb3V0IiwgMTAwKTsKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWE0ID0gdGl0YW5EYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsCisJCQkJcHJvcHM0LCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGJ5Q3JpdGVyaWE0LmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlc3VsdCByZXR1cm5lZCBkdWUgdG8gdGl0YW4gYnVnIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELAorCQkJCWJ5Q3JpdGVyaWE0LnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJcHJvcHM0LnB1dCgidGltZW91dCIsIDUwKTsKKwkJYnlDcml0ZXJpYTQgPSB0aXRhbkRhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwgcHJvcHM0LCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGJ5Q3JpdGVyaWE0LmlzTGVmdCgpKTsKKworCQl0aXRhbkRhby5yb2xsYmFjaygpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZVJlc3VsdFVTZUhhc05vdFF1ZXJ5RHVlVG9UaXRhbkJ1ZygpIHsKKworCQlTdHJpbmcgbmFtZSA9ICJiYmJiIjsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGExID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKCJBIik7CisJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSByZXNvdXJjZURhdGExLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuc2V0QWJzdHJhY3QodHJ1ZSk7CisJCXJlc291cmNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldE5hbWUobmFtZSk7CisKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbmV3Tm9kZTEgPSB0aXRhbkRhby5jcmVhdGVOb2RlKHJlc291cmNlRGF0YTEsCisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKG5ld05vZGUxLmlzTGVmdCgpKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIG5ld05vZGUxLmxlZnQoKS52YWx1ZSgpKTsKKwkJLy8gdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfQUJTVFJBQ1QuZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkRhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcHMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBvbmUgcmVzdWx0IHJldHVybmVkIiwgMSwgYnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5zaXplKCkpOworCQkvLyB0aXRhbkRhby5jb21taXQoKTsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZVRvVXBkYXRlID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSByZXNvdXJjZVRvVXBkYXRlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuc2V0QWJzdHJhY3QoZmFsc2UpOworCQlyZXNvdXJjZVRvVXBkYXRlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZCgiQSIpOworCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZVRvVXBkYXRlLAorCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZSh1cGRhdGVOb2RlLmlzTGVmdCgpKTsKKwkJLy8gdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJLy8gbm8gcmVzdWx0IHdoZXJlIGlzQWJzdHJhY3QgPSB0cnVlCisJCWJ5Q3JpdGVyaWEgPSB0aXRhbkRhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcHMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlc3VsdCByZXR1cm5lZCBkdWUgdG8gdGl0YW4gYnVnIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELAorCQkJCWJ5Q3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpKTsKKworCQkvLyBvbmUgcmVzdWx0IHdoZXJlIGlzQWJzdHJhY3QgIT0gdHJ1ZQorCQlieUNyaXRlcmlhID0gdGl0YW5EYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIG51bGwsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoYnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlc3VsdCByZXR1cm5lZCIsIDEsIGJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuc2l6ZSgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19BQlNUUkFDVC5nZXRQcm9wZXJ0eSgpLCBmYWxzZSk7CisJCWJ5Q3JpdGVyaWEgPSB0aXRhbkRhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgbnVsbCwgcHJvcHMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShieUNyaXRlcmlhLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlc3VsdCByZXR1cm5lZCBkdWUgdG8gdGl0YW4gYnVnIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELAorCQkJCWJ5Q3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpKTsKKworCQl0aXRhbkRhby5yb2xsYmFjaygpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvdGVzdC9yZXNvdXJjZXMvYXBwbGljYXRpb24tY29udGV4dC10ZXN0LnhtbCBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9hcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGRhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvdGVzdC9yZXNvdXJjZXMvYXBwbGljYXRpb24tY29udGV4dC10ZXN0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpjb250ZXh0PSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2NvbnRleHQiCisJeG1sbnM6dXRpbD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0zLjAueHNkCisgICAgICAgICAgIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dCBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2NvbnRleHQvc3ByaW5nLWNvbnRleHQtMy4wLnhzZAorICAgICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3V0aWwgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsL3NwcmluZy11dGlsLTMuMC54c2QiPgorICAgICAgICAgICAKKwk8dXRpbDpwcm9wZXJ0aWVzIGlkPSJlbGFzdGljc2VhcmNoQ29uZmlnIiBsb2NhdGlvbj0iY2xhc3NwYXRoOmVsYXN0aWNzZWFyY2gueW1sIiAvPgorICAKKworICA8Y29udGV4dDpjb21wb25lbnQtc2NhbgorICAgIGJhc2UtcGFja2FnZT0iCisgICAgICAgCW9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5pbXBsLAkKKyAgICAJb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmVzLAorCQlvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGosCisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbiwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmltcGwKKwkiPgorICAgCisgIDwvY29udGV4dDpjb21wb25lbnQtc2Nhbj4KKworPC9iZWFucz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9jYXNzYW5kcmEueWFtbCBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9jYXNzYW5kcmEueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY5ODcxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvcmVzb3VyY2VzL2Nhc3NhbmRyYS55YW1sCkBAIC0wLDAgKzEsODAxIEBACisjIENhc3NhbmRyYSBzdG9yYWdlIGNvbmZpZyBZQU1MIAorCisjIE5PVEU6CisjICAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL1N0b3JhZ2VDb25maWd1cmF0aW9uIGZvcgorIyAgIGZ1bGwgZXhwbGFuYXRpb25zIG9mIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcworIyAvTk9URQorCisjIFRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyLiBUaGlzIGlzIG1haW5seSB1c2VkIHRvIHByZXZlbnQgbWFjaGluZXMgaW4KKyMgb25lIGxvZ2ljYWwgY2x1c3RlciBmcm9tIGpvaW5pbmcgYW5vdGhlci4KK2NsdXN0ZXJfbmFtZTogJ1Rlc3QgQ2x1c3RlcicKKworIyBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiB0b2tlbnMgcmFuZG9tbHkgYXNzaWduZWQgdG8gdGhpcyBub2RlIG9uIHRoZSByaW5nCisjIFRoZSBtb3JlIHRva2VucywgcmVsYXRpdmUgdG8gb3RoZXIgbm9kZXMsIHRoZSBsYXJnZXIgdGhlIHByb3BvcnRpb24gb2YgZGF0YQorIyB0aGF0IHRoaXMgbm9kZSB3aWxsIHN0b3JlLiBZb3UgcHJvYmFibHkgd2FudCBhbGwgbm9kZXMgdG8gaGF2ZSB0aGUgc2FtZSBudW1iZXIKKyMgb2YgdG9rZW5zIGFzc3VtaW5nIHRoZXkgaGF2ZSBlcXVhbCBoYXJkd2FyZSBjYXBhYmlsaXR5LgorIworIyBJZiB5b3UgbGVhdmUgdGhpcyB1bnNwZWNpZmllZCwgQ2Fzc2FuZHJhIHdpbGwgdXNlIHRoZSBkZWZhdWx0IG9mIDEgdG9rZW4gZm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5LAorIyBhbmQgd2lsbCB1c2UgdGhlIGluaXRpYWxfdG9rZW4gYXMgZGVzY3JpYmVkIGJlbG93LgorIworIyBTcGVjaWZ5aW5nIGluaXRpYWxfdG9rZW4gd2lsbCBvdmVycmlkZSB0aGlzIHNldHRpbmcgb24gdGhlIG5vZGUncyBpbml0aWFsIHN0YXJ0LAorIyBvbiBzdWJzZXF1ZW50IHN0YXJ0cywgdGhpcyBzZXR0aW5nIHdpbGwgYXBwbHkgZXZlbiBpZiBpbml0aWFsIHRva2VuIGlzIHNldC4KKyMKKyMgSWYgeW91IGFscmVhZHkgaGF2ZSBhIGNsdXN0ZXIgd2l0aCAxIHRva2VuIHBlciBub2RlLCBhbmQgd2lzaCB0byBtaWdyYXRlIHRvIAorIyBtdWx0aXBsZSB0b2tlbnMgcGVyIG5vZGUsIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL2Nhc3NhbmRyYS9PcGVyYXRpb25zCitudW1fdG9rZW5zOiAyNTYKKworIyBpbml0aWFsX3Rva2VuIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0b2tlbnMgbWFudWFsbHkuICBXaGlsZSB5b3UgY2FuIHVzZSAjIGl0IHdpdGgKKyMgdm5vZGVzIChudW1fdG9rZW5zID4gMSwgYWJvdmUpIC0tIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBwcm92aWRlIGEgCisjIGNvbW1hLXNlcGFyYXRlZCBsaXN0IC0tIGl0J3MgcHJpbWFyaWx5IHVzZWQgd2hlbiBhZGRpbmcgbm9kZXMgIyB0byBsZWdhY3kgY2x1c3RlcnMgCisjIHRoYXQgZG8gbm90IGhhdmUgdm5vZGVzIGVuYWJsZWQuCisjIGluaXRpYWxfdG9rZW46CisKKyMgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0hpbnRlZEhhbmRvZmYKKyMgTWF5IGVpdGhlciBiZSAidHJ1ZSIgb3IgImZhbHNlIiB0byBlbmFibGUgZ2xvYmFsbHksIG9yIGNvbnRhaW4gYSBsaXN0CisjIG9mIGRhdGEgY2VudGVycyB0byBlbmFibGUgcGVyLWRhdGFjZW50ZXIuCisjIGhpbnRlZF9oYW5kb2ZmX2VuYWJsZWQ6IERDMSxEQzIKK2hpbnRlZF9oYW5kb2ZmX2VuYWJsZWQ6IHRydWUKKyMgdGhpcyBkZWZpbmVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGEgZGVhZCBob3N0IHdpbGwgaGF2ZSBoaW50cworIyBnZW5lcmF0ZWQuICBBZnRlciBpdCBoYXMgYmVlbiBkZWFkIHRoaXMgbG9uZywgbmV3IGhpbnRzIGZvciBpdCB3aWxsIG5vdCBiZQorIyBjcmVhdGVkIHVudGlsIGl0IGhhcyBiZWVuIHNlZW4gYWxpdmUgYW5kIGdvbmUgZG93biBhZ2Fpbi4KK21heF9oaW50X3dpbmRvd19pbl9tczogMTA4MDAwMDAgIyAzIGhvdXJzCisjIE1heGltdW0gdGhyb3R0bGUgaW4gS0JzIHBlciBzZWNvbmQsIHBlciBkZWxpdmVyeSB0aHJlYWQuICBUaGlzIHdpbGwgYmUKKyMgcmVkdWNlZCBwcm9wb3J0aW9uYWxseSB0byB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBjbHVzdGVyLiAgKElmIHRoZXJlCisjIGFyZSB0d28gbm9kZXMgaW4gdGhlIGNsdXN0ZXIsIGVhY2ggZGVsaXZlcnkgdGhyZWFkIHdpbGwgdXNlIHRoZSBtYXhpbXVtCisjIHJhdGU7IGlmIHRoZXJlIGFyZSB0aHJlZSwgZWFjaCB3aWxsIHRocm90dGxlIHRvIGhhbGYgb2YgdGhlIG1heGltdW0sCisjIHNpbmNlIHdlIGV4cGVjdCB0d28gbm9kZXMgdG8gYmUgZGVsaXZlcmluZyBoaW50cyBzaW11bHRhbmVvdXNseS4pCitoaW50ZWRfaGFuZG9mZl90aHJvdHRsZV9pbl9rYjogMTAyNAorIyBOdW1iZXIgb2YgdGhyZWFkcyB3aXRoIHdoaWNoIHRvIGRlbGl2ZXIgaGludHM7CisjIENvbnNpZGVyIGluY3JlYXNpbmcgdGhpcyBudW1iZXIgd2hlbiB5b3UgaGF2ZSBtdWx0aS1kYyBkZXBsb3ltZW50cywgc2luY2UKKyMgY3Jvc3MtZGMgaGFuZG9mZiB0ZW5kcyB0byBiZSBzbG93ZXIKK21heF9oaW50c19kZWxpdmVyeV90aHJlYWRzOiAyCisKKyMgTWF4aW11bSB0aHJvdHRsZSBpbiBLQnMgcGVyIHNlY29uZCwgdG90YWwuIFRoaXMgd2lsbCBiZQorIyByZWR1Y2VkIHByb3BvcnRpb25hbGx5IHRvIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCitiYXRjaGxvZ19yZXBsYXlfdGhyb3R0bGVfaW5fa2I6IDEwMjQKKworIyBBdXRoZW50aWNhdGlvbiBiYWNrZW5kLCBpbXBsZW1lbnRpbmcgSUF1dGhlbnRpY2F0b3I7IHVzZWQgdG8gaWRlbnRpZnkgdXNlcnMKKyMgT3V0IG9mIHRoZSBib3gsIENhc3NhbmRyYSBwcm92aWRlcyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLntBbGxvd0FsbEF1dGhlbnRpY2F0b3IsCisjIFBhc3N3b3JkQXV0aGVudGljYXRvcn0uCisjCisjIC0gQWxsb3dBbGxBdXRoZW50aWNhdG9yIHBlcmZvcm1zIG5vIGNoZWNrcyAtIHNldCBpdCB0byBkaXNhYmxlIGF1dGhlbnRpY2F0aW9uLgorIyAtIFBhc3N3b3JkQXV0aGVudGljYXRvciByZWxpZXMgb24gdXNlcm5hbWUvcGFzc3dvcmQgcGFpcnMgdG8gYXV0aGVudGljYXRlCisjICAgdXNlcnMuIEl0IGtlZXBzIHVzZXJuYW1lcyBhbmQgaGFzaGVkIHBhc3N3b3JkcyBpbiBzeXN0ZW1fYXV0aC5jcmVkZW50aWFscyB0YWJsZS4KKyMgICBQbGVhc2UgaW5jcmVhc2Ugc3lzdGVtX2F1dGgga2V5c3BhY2UgcmVwbGljYXRpb24gZmFjdG9yIGlmIHlvdSB1c2UgdGhpcyBhdXRoZW50aWNhdG9yLgorYXV0aGVudGljYXRvcjogQWxsb3dBbGxBdXRoZW50aWNhdG9yCisKKyMgQXV0aG9yaXphdGlvbiBiYWNrZW5kLCBpbXBsZW1lbnRpbmcgSUF1dGhvcml6ZXI7IHVzZWQgdG8gbGltaXQgYWNjZXNzL3Byb3ZpZGUgcGVybWlzc2lvbnMKKyMgT3V0IG9mIHRoZSBib3gsIENhc3NhbmRyYSBwcm92aWRlcyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLntBbGxvd0FsbEF1dGhvcml6ZXIsCisjIENhc3NhbmRyYUF1dGhvcml6ZXJ9LgorIworIyAtIEFsbG93QWxsQXV0aG9yaXplciBhbGxvd3MgYW55IGFjdGlvbiB0byBhbnkgdXNlciAtIHNldCBpdCB0byBkaXNhYmxlIGF1dGhvcml6YXRpb24uCisjIC0gQ2Fzc2FuZHJhQXV0aG9yaXplciBzdG9yZXMgcGVybWlzc2lvbnMgaW4gc3lzdGVtX2F1dGgucGVybWlzc2lvbnMgdGFibGUuIFBsZWFzZQorIyAgIGluY3JlYXNlIHN5c3RlbV9hdXRoIGtleXNwYWNlIHJlcGxpY2F0aW9uIGZhY3RvciBpZiB5b3UgdXNlIHRoaXMgYXV0aG9yaXplci4KK2F1dGhvcml6ZXI6IEFsbG93QWxsQXV0aG9yaXplcgorCisjIFZhbGlkaXR5IHBlcmlvZCBmb3IgcGVybWlzc2lvbnMgY2FjaGUgKGZldGNoaW5nIHBlcm1pc3Npb25zIGNhbiBiZSBhbgorIyBleHBlbnNpdmUgb3BlcmF0aW9uIGRlcGVuZGluZyBvbiB0aGUgYXV0aG9yaXplciwgQ2Fzc2FuZHJhQXV0aG9yaXplciBpcworIyBvbmUgZXhhbXBsZSkuIERlZmF1bHRzIHRvIDIwMDAsIHNldCB0byAwIHRvIGRpc2FibGUuCisjIFdpbGwgYmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBmb3IgQWxsb3dBbGxBdXRob3JpemVyLgorcGVybWlzc2lvbnNfdmFsaWRpdHlfaW5fbXM6IDIwMDAKKworIyBSZWZyZXNoIGludGVydmFsIGZvciBwZXJtaXNzaW9ucyBjYWNoZSAoaWYgZW5hYmxlZCkuCisjIEFmdGVyIHRoaXMgaW50ZXJ2YWwsIGNhY2hlIGVudHJpZXMgYmVjb21lIGVsaWdpYmxlIGZvciByZWZyZXNoLiBVcG9uIG5leHQKKyMgYWNjZXNzLCBhbiBhc3luYyByZWxvYWQgaXMgc2NoZWR1bGVkIGFuZCB0aGUgb2xkIHZhbHVlIHJldHVybmVkIHVudGlsIGl0CisjIGNvbXBsZXRlcy4gSWYgcGVybWlzc2lvbnNfdmFsaWRpdHlfaW5fbXMgaXMgbm9uLXplcm8sIHRoZW4gdGhpcyBtdXN0IGJlCisjIGFsc28uCisjIERlZmF1bHRzIHRvIHRoZSBzYW1lIHZhbHVlIGFzIHBlcm1pc3Npb25zX3ZhbGlkaXR5X2luX21zLgorIyBwZXJtaXNzaW9uc191cGRhdGVfaW50ZXJ2YWxfaW5fbXM6IDEwMDAKKworIyBUaGUgcGFydGl0aW9uZXIgaXMgcmVzcG9uc2libGUgZm9yIGRpc3RyaWJ1dGluZyBncm91cHMgb2Ygcm93cyAoYnkKKyMgcGFydGl0aW9uIGtleSkgYWNyb3NzIG5vZGVzIGluIHRoZSBjbHVzdGVyLiAgWW91IHNob3VsZCBsZWF2ZSB0aGlzCisjIGFsb25lIGZvciBuZXcgY2x1c3RlcnMuICBUaGUgcGFydGl0aW9uZXIgY2FuIE5PVCBiZSBjaGFuZ2VkIHdpdGhvdXQKKyMgcmVsb2FkaW5nIGFsbCBkYXRhLCBzbyB3aGVuIHVwZ3JhZGluZyB5b3Ugc2hvdWxkIHNldCB0aGlzIHRvIHRoZQorIyBzYW1lIHBhcnRpdGlvbmVyIHlvdSB3ZXJlIGFscmVhZHkgdXNpbmcuCisjCisjIEJlc2lkZXMgTXVybXVyM1BhcnRpdGlvbmVyLCBwYXJ0aXRpb25lcnMgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcworIyBjb21wYXRpYmlsaXR5IGluY2x1ZGUgUmFuZG9tUGFydGl0aW9uZXIsIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIsIGFuZAorIyBPcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lci4KKyMKK3BhcnRpdGlvbmVyOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyCisKKyMgRGlyZWN0b3JpZXMgd2hlcmUgQ2Fzc2FuZHJhIHNob3VsZCBzdG9yZSBkYXRhIG9uIGRpc2suICBDYXNzYW5kcmEKKyMgd2lsbCBzcHJlYWQgZGF0YSBldmVubHkgYWNyb3NzIHRoZW0sIHN1YmplY3QgdG8gdGhlIGdyYW51bGFyaXR5IG9mCisjIHRoZSBjb25maWd1cmVkIGNvbXBhY3Rpb24gc3RyYXRlZ3kuCisjIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpcyAkQ0FTU0FORFJBX0hPTUUvZGF0YS9kYXRhLgorIyBkYXRhX2ZpbGVfZGlyZWN0b3JpZXM6CisjICAgICAtIC92YXIvbGliL2Nhc3NhbmRyYS9kYXRhCisKKyMgY29tbWl0IGxvZy4gIHdoZW4gcnVubmluZyBvbiBtYWduZXRpYyBIREQsIHRoaXMgc2hvdWxkIGJlIGEKKyMgc2VwYXJhdGUgc3BpbmRsZSB0aGFuIHRoZSBkYXRhIGRpcmVjdG9yaWVzLgorIyBJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgaXMgJENBU1NBTkRSQV9IT01FL2RhdGEvY29tbWl0bG9nLgorIyBjb21taXRsb2dfZGlyZWN0b3J5OiAvdmFyL2xpYi9jYXNzYW5kcmEvY29tbWl0bG9nCisKKyMgcG9saWN5IGZvciBkYXRhIGRpc2sgZmFpbHVyZXM6CisjIGRpZTogc2h1dCBkb3duIGdvc3NpcCBhbmQgVGhyaWZ0IGFuZCBraWxsIHRoZSBKVk0gZm9yIGFueSBmcyBlcnJvcnMgb3IKKyMgICAgICBzaW5nbGUtc3N0YWJsZSBlcnJvcnMsIHNvIHRoZSBub2RlIGNhbiBiZSByZXBsYWNlZC4KKyMgc3RvcF9wYXJhbm9pZDogc2h1dCBkb3duIGdvc3NpcCBhbmQgVGhyaWZ0IGV2ZW4gZm9yIHNpbmdsZS1zc3RhYmxlIGVycm9ycy4KKyMgc3RvcDogc2h1dCBkb3duIGdvc3NpcCBhbmQgVGhyaWZ0LCBsZWF2aW5nIHRoZSBub2RlIGVmZmVjdGl2ZWx5IGRlYWQsIGJ1dAorIyAgICAgICBjYW4gc3RpbGwgYmUgaW5zcGVjdGVkIHZpYSBKTVguCisjIGJlc3RfZWZmb3J0OiBzdG9wIHVzaW5nIHRoZSBmYWlsZWQgZGlzayBhbmQgcmVzcG9uZCB0byByZXF1ZXN0cyBiYXNlZCBvbgorIyAgICAgICAgICAgICAgcmVtYWluaW5nIGF2YWlsYWJsZSBzc3RhYmxlcy4gIFRoaXMgbWVhbnMgeW91IFdJTEwgc2VlIG9ic29sZXRlCisjICAgICAgICAgICAgICBkYXRhIGF0IENMLk9ORSEKKyMgaWdub3JlOiBpZ25vcmUgZmF0YWwgZXJyb3JzIGFuZCBsZXQgcmVxdWVzdHMgZmFpbCwgYXMgaW4gcHJlLTEuMiBDYXNzYW5kcmEKK2Rpc2tfZmFpbHVyZV9wb2xpY3k6IHN0b3AKKworIyBwb2xpY3kgZm9yIGNvbW1pdCBkaXNrIGZhaWx1cmVzOgorIyBkaWU6IHNodXQgZG93biBnb3NzaXAgYW5kIFRocmlmdCBhbmQga2lsbCB0aGUgSlZNLCBzbyB0aGUgbm9kZSBjYW4gYmUgcmVwbGFjZWQuCisjIHN0b3A6IHNodXQgZG93biBnb3NzaXAgYW5kIFRocmlmdCwgbGVhdmluZyB0aGUgbm9kZSBlZmZlY3RpdmVseSBkZWFkLCBidXQKKyMgICAgICAgY2FuIHN0aWxsIGJlIGluc3BlY3RlZCB2aWEgSk1YLgorIyBzdG9wX2NvbW1pdDogc2h1dGRvd24gdGhlIGNvbW1pdCBsb2csIGxldHRpbmcgd3JpdGVzIGNvbGxlY3QgYnV0CisjICAgICAgICAgICAgICBjb250aW51aW5nIHRvIHNlcnZpY2UgcmVhZHMsIGFzIGluIHByZS0yLjAuNSBDYXNzYW5kcmEKKyMgaWdub3JlOiBpZ25vcmUgZmF0YWwgZXJyb3JzIGFuZCBsZXQgdGhlIGJhdGNoZXMgZmFpbAorY29tbWl0X2ZhaWx1cmVfcG9saWN5OiBzdG9wCisKKyMgTWF4aW11bSBzaXplIG9mIHRoZSBrZXkgY2FjaGUgaW4gbWVtb3J5LgorIworIyBFYWNoIGtleSBjYWNoZSBoaXQgc2F2ZXMgMSBzZWVrIGFuZCBlYWNoIHJvdyBjYWNoZSBoaXQgc2F2ZXMgMiBzZWVrcyBhdCB0aGUKKyMgbWluaW11bSwgc29tZXRpbWVzIG1vcmUuIFRoZSBrZXkgY2FjaGUgaXMgZmFpcmx5IHRpbnkgZm9yIHRoZSBhbW91bnQgb2YKKyMgdGltZSBpdCBzYXZlcywgc28gaXQncyB3b3J0aHdoaWxlIHRvIHVzZSBpdCBhdCBsYXJnZSBudW1iZXJzLgorIyBUaGUgcm93IGNhY2hlIHNhdmVzIGV2ZW4gbW9yZSB0aW1lLCBidXQgbXVzdCBjb250YWluIHRoZSBlbnRpcmUgcm93LAorIyBzbyBpdCBpcyBleHRyZW1lbHkgc3BhY2UtaW50ZW5zaXZlLiBJdCdzIGJlc3QgdG8gb25seSB1c2UgdGhlCisjIHJvdyBjYWNoZSBpZiB5b3UgaGF2ZSBob3Qgcm93cyBvciBzdGF0aWMgcm93cy4KKyMKKyMgTk9URTogaWYgeW91IHJlZHVjZSB0aGUgc2l6ZSwgeW91IG1heSBub3QgZ2V0IHlvdSBob3R0ZXN0IGtleXMgbG9hZGVkIG9uIHN0YXJ0dXAuCisjCisjIERlZmF1bHQgdmFsdWUgaXMgZW1wdHkgdG8gbWFrZSBpdCAiYXV0byIgKG1pbig1JSBvZiBIZWFwIChpbiBNQiksIDEwME1CKSkuIFNldCB0byAwIHRvIGRpc2FibGUga2V5IGNhY2hlLgora2V5X2NhY2hlX3NpemVfaW5fbWI6CisKKyMgRHVyYXRpb24gaW4gc2Vjb25kcyBhZnRlciB3aGljaCBDYXNzYW5kcmEgc2hvdWxkCisjIHNhdmUgdGhlIGtleSBjYWNoZS4gQ2FjaGVzIGFyZSBzYXZlZCB0byBzYXZlZF9jYWNoZXNfZGlyZWN0b3J5IGFzCisjIHNwZWNpZmllZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyMKKyMgU2F2ZWQgY2FjaGVzIGdyZWF0bHkgaW1wcm92ZSBjb2xkLXN0YXJ0IHNwZWVkcywgYW5kIGlzIHJlbGF0aXZlbHkgY2hlYXAgaW4KKyMgdGVybXMgb2YgSS9PIGZvciB0aGUga2V5IGNhY2hlLiBSb3cgY2FjaGUgc2F2aW5nIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgYW5kCisjIGhhcyBsaW1pdGVkIHVzZS4KKyMKKyMgRGVmYXVsdCBpcyAxNDQwMCBvciA0IGhvdXJzLgora2V5X2NhY2hlX3NhdmVfcGVyaW9kOiAxNDQwMAorCisjIE51bWJlciBvZiBrZXlzIGZyb20gdGhlIGtleSBjYWNoZSB0byBzYXZlCisjIERpc2FibGVkIGJ5IGRlZmF1bHQsIG1lYW5pbmcgYWxsIGtleXMgYXJlIGdvaW5nIHRvIGJlIHNhdmVkCisjIGtleV9jYWNoZV9rZXlzX3RvX3NhdmU6IDEwMAorCisjIE1heGltdW0gc2l6ZSBvZiB0aGUgcm93IGNhY2hlIGluIG1lbW9yeS4KKyMgTk9URTogaWYgeW91IHJlZHVjZSB0aGUgc2l6ZSwgeW91IG1heSBub3QgZ2V0IHlvdSBob3R0ZXN0IGtleXMgbG9hZGVkIG9uIHN0YXJ0dXAuCisjCisjIERlZmF1bHQgdmFsdWUgaXMgMCwgdG8gZGlzYWJsZSByb3cgY2FjaGluZy4KK3Jvd19jYWNoZV9zaXplX2luX21iOiAwCisKKyMgRHVyYXRpb24gaW4gc2Vjb25kcyBhZnRlciB3aGljaCBDYXNzYW5kcmEgc2hvdWxkCisjIHNhdmUgdGhlIHJvdyBjYWNoZS4gQ2FjaGVzIGFyZSBzYXZlZCB0byBzYXZlZF9jYWNoZXNfZGlyZWN0b3J5IGFzIHNwZWNpZmllZAorIyBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyMKKyMgU2F2ZWQgY2FjaGVzIGdyZWF0bHkgaW1wcm92ZSBjb2xkLXN0YXJ0IHNwZWVkcywgYW5kIGlzIHJlbGF0aXZlbHkgY2hlYXAgaW4KKyMgdGVybXMgb2YgSS9PIGZvciB0aGUga2V5IGNhY2hlLiBSb3cgY2FjaGUgc2F2aW5nIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgYW5kCisjIGhhcyBsaW1pdGVkIHVzZS4KKyMKKyMgRGVmYXVsdCBpcyAwIHRvIGRpc2FibGUgc2F2aW5nIHRoZSByb3cgY2FjaGUuCityb3dfY2FjaGVfc2F2ZV9wZXJpb2Q6IDAKKworIyBOdW1iZXIgb2Yga2V5cyBmcm9tIHRoZSByb3cgY2FjaGUgdG8gc2F2ZQorIyBEaXNhYmxlZCBieSBkZWZhdWx0LCBtZWFuaW5nIGFsbCBrZXlzIGFyZSBnb2luZyB0byBiZSBzYXZlZAorIyByb3dfY2FjaGVfa2V5c190b19zYXZlOiAxMDAKKworIyBNYXhpbXVtIHNpemUgb2YgdGhlIGNvdW50ZXIgY2FjaGUgaW4gbWVtb3J5LgorIworIyBDb3VudGVyIGNhY2hlIGhlbHBzIHRvIHJlZHVjZSBjb3VudGVyIGxvY2tzJyBjb250ZW50aW9uIGZvciBob3QgY291bnRlciBjZWxscy4KKyMgSW4gY2FzZSBvZiBSRiA9IDEgYSBjb3VudGVyIGNhY2hlIGhpdCB3aWxsIGNhdXNlIENhc3NhbmRyYSB0byBza2lwIHRoZSByZWFkIGJlZm9yZQorIyB3cml0ZSBlbnRpcmVseS4gV2l0aCBSRiA+IDEgYSBjb3VudGVyIGNhY2hlIGhpdCB3aWxsIHN0aWxsIGhlbHAgdG8gcmVkdWNlIHRoZSBkdXJhdGlvbgorIyBvZiB0aGUgbG9jayBob2xkLCBoZWxwaW5nIHdpdGggaG90IGNvdW50ZXIgY2VsbCB1cGRhdGVzLCBidXQgd2lsbCBub3QgYWxsb3cgc2tpcHBpbmcKKyMgdGhlIHJlYWQgZW50aXJlbHkuIE9ubHkgdGhlIGxvY2FsIChjbG9jaywgY291bnQpIHR1cGxlIG9mIGEgY291bnRlciBjZWxsIGlzIGtlcHQKKyMgaW4gbWVtb3J5LCBub3QgdGhlIHdob2xlIGNvdW50ZXIsIHNvIGl0J3MgcmVsYXRpdmVseSBjaGVhcC4KKyMKKyMgTk9URTogaWYgeW91IHJlZHVjZSB0aGUgc2l6ZSwgeW91IG1heSBub3QgZ2V0IHlvdSBob3R0ZXN0IGtleXMgbG9hZGVkIG9uIHN0YXJ0dXAuCisjCisjIERlZmF1bHQgdmFsdWUgaXMgZW1wdHkgdG8gbWFrZSBpdCAiYXV0byIgKG1pbigyLjUlIG9mIEhlYXAgKGluIE1CKSwgNTBNQikpLiBTZXQgdG8gMCB0byBkaXNhYmxlIGNvdW50ZXIgY2FjaGUuCisjIE5PVEU6IGlmIHlvdSBwZXJmb3JtIGNvdW50ZXIgZGVsZXRlcyBhbmQgcmVseSBvbiBsb3cgZ2NncywgeW91IHNob3VsZCBkaXNhYmxlIHRoZSBjb3VudGVyIGNhY2hlLgorY291bnRlcl9jYWNoZV9zaXplX2luX21iOgorCisjIER1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggQ2Fzc2FuZHJhIHNob3VsZAorIyBzYXZlIHRoZSBjb3VudGVyIGNhY2hlIChrZXlzIG9ubHkpLiBDYWNoZXMgYXJlIHNhdmVkIHRvIHNhdmVkX2NhY2hlc19kaXJlY3RvcnkgYXMKKyMgc3BlY2lmaWVkIGluIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLgorIworIyBEZWZhdWx0IGlzIDcyMDAgb3IgMiBob3Vycy4KK2NvdW50ZXJfY2FjaGVfc2F2ZV9wZXJpb2Q6IDcyMDAKKworIyBOdW1iZXIgb2Yga2V5cyBmcm9tIHRoZSBjb3VudGVyIGNhY2hlIHRvIHNhdmUKKyMgRGlzYWJsZWQgYnkgZGVmYXVsdCwgbWVhbmluZyBhbGwga2V5cyBhcmUgZ29pbmcgdG8gYmUgc2F2ZWQKKyMgY291bnRlcl9jYWNoZV9rZXlzX3RvX3NhdmU6IDEwMAorCisjIFRoZSBvZmYtaGVhcCBtZW1vcnkgYWxsb2NhdG9yLiAgQWZmZWN0cyBzdG9yYWdlIGVuZ2luZSBtZXRhZGF0YSBhcworIyB3ZWxsIGFzIGNhY2hlcy4gIEV4cGVyaW1lbnRzIHNob3cgdGhhdCBKRU1BbGxvYyBzYXZlcyBzb21lIG1lbW9yeQorIyB0aGFuIHRoZSBuYXRpdmUgR0NDIGFsbG9jYXRvciAoaS5lLiwgSkVNYWxsb2MgaXMgbW9yZQorIyBmcmFnbWVudGF0aW9uLXJlc2lzdGFudCkuCisjIAorIyBTdXBwb3J0ZWQgdmFsdWVzIGFyZTogTmF0aXZlQWxsb2NhdG9yLCBKRU1hbGxvY0FsbG9jYXRvcgorIworIyBJZiB5b3UgaW50ZW5kIHRvIHVzZSBKRU1hbGxvY0FsbG9jYXRvciB5b3UgaGF2ZSB0byBpbnN0YWxsIEpFTWFsbG9jIGFzIGxpYnJhcnkgYW5kCisjIG1vZGlmeSBjYXNzYW5kcmEtZW52LnNoIGFzIGRpcmVjdGVkIGluIHRoZSBmaWxlLgorIworIyBEZWZhdWx0cyB0byBOYXRpdmVBbGxvY2F0b3IKKyMgbWVtb3J5X2FsbG9jYXRvcjogTmF0aXZlQWxsb2NhdG9yCisKKyMgc2F2ZWQgY2FjaGVzCisjIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpcyAkQ0FTU0FORFJBX0hPTUUvZGF0YS9zYXZlZF9jYWNoZXMuCisjIHNhdmVkX2NhY2hlc19kaXJlY3Rvcnk6IC92YXIvbGliL2Nhc3NhbmRyYS9zYXZlZF9jYWNoZXMKKworIyBjb21taXRsb2dfc3luYyBtYXkgYmUgZWl0aGVyICJwZXJpb2RpYyIgb3IgImJhdGNoLiIgCisjIAorIyBXaGVuIGluIGJhdGNoIG1vZGUsIENhc3NhbmRyYSB3b24ndCBhY2sgd3JpdGVzIHVudGlsIHRoZSBjb21taXQgbG9nCisjIGhhcyBiZWVuIGZzeW5jZWQgdG8gZGlzay4gIEl0IHdpbGwgd2FpdAorIyBjb21taXRsb2dfc3luY19iYXRjaF93aW5kb3dfaW5fbXMgbWlsbGlzZWNvbmRzIGJldHdlZW4gZnN5bmNzLgorIyBUaGlzIHdpbmRvdyBzaG91bGQgYmUga2VwdCBzaG9ydCBiZWNhdXNlIHRoZSB3cml0ZXIgdGhyZWFkcyB3aWxsCisjIGJlIHVuYWJsZSB0byBkbyBleHRyYSB3b3JrIHdoaWxlIHdhaXRpbmcuICAoWW91IG1heSBuZWVkIHRvIGluY3JlYXNlCisjIGNvbmN1cnJlbnRfd3JpdGVzIGZvciB0aGUgc2FtZSByZWFzb24uKQorIworIyBjb21taXRsb2dfc3luYzogYmF0Y2gKKyMgY29tbWl0bG9nX3N5bmNfYmF0Y2hfd2luZG93X2luX21zOiAyCisjCisjIHRoZSBvdGhlciBvcHRpb24gaXMgInBlcmlvZGljIiB3aGVyZSB3cml0ZXMgbWF5IGJlIGFja2VkIGltbWVkaWF0ZWx5CisjIGFuZCB0aGUgQ29tbWl0TG9nIGlzIHNpbXBseSBzeW5jZWQgZXZlcnkgY29tbWl0bG9nX3N5bmNfcGVyaW9kX2luX21zCisjIG1pbGxpc2Vjb25kcy4gCitjb21taXRsb2dfc3luYzogcGVyaW9kaWMKK2NvbW1pdGxvZ19zeW5jX3BlcmlvZF9pbl9tczogMTAwMDAKKworIyBUaGUgc2l6ZSBvZiB0aGUgaW5kaXZpZHVhbCBjb21taXRsb2cgZmlsZSBzZWdtZW50cy4gIEEgY29tbWl0bG9nCisjIHNlZ21lbnQgbWF5IGJlIGFyY2hpdmVkLCBkZWxldGVkLCBvciByZWN5Y2xlZCBvbmNlIGFsbCB0aGUgZGF0YQorIyBpbiBpdCAocG90ZW50aWFsbHkgZnJvbSBlYWNoIGNvbHVtbmZhbWlseSBpbiB0aGUgc3lzdGVtKSBoYXMgYmVlbgorIyBmbHVzaGVkIHRvIHNzdGFibGVzLiAgCisjCisjIFRoZSBkZWZhdWx0IHNpemUgaXMgMzIsIHdoaWNoIGlzIGFsbW9zdCBhbHdheXMgZmluZSwgYnV0IGlmIHlvdSBhcmUKKyMgYXJjaGl2aW5nIGNvbW1pdGxvZyBzZWdtZW50cyAoc2VlIGNvbW1pdGxvZ19hcmNoaXZpbmcucHJvcGVydGllcyksCisjIHRoZW4geW91IHByb2JhYmx5IHdhbnQgYSBmaW5lciBncmFudWxhcml0eSBvZiBhcmNoaXZpbmc7IDggb3IgMTYgTUIKKyMgaXMgcmVhc29uYWJsZS4KK2NvbW1pdGxvZ19zZWdtZW50X3NpemVfaW5fbWI6IDMyCisKKyMgYW55IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgU2VlZFByb3ZpZGVyIGludGVyZmFjZSBhbmQgaGFzIGEKKyMgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIE1hcDxTdHJpbmcsIFN0cmluZz4gb2YgcGFyYW1ldGVycyB3aWxsIGRvLgorc2VlZF9wcm92aWRlcjoKKyAgICAjIEFkZHJlc3NlcyBvZiBob3N0cyB0aGF0IGFyZSBkZWVtZWQgY29udGFjdCBwb2ludHMuIAorICAgICMgQ2Fzc2FuZHJhIG5vZGVzIHVzZSB0aGlzIGxpc3Qgb2YgaG9zdHMgdG8gZmluZCBlYWNoIG90aGVyIGFuZCBsZWFybgorICAgICMgdGhlIHRvcG9sb2d5IG9mIHRoZSByaW5nLiAgWW91IG11c3QgY2hhbmdlIHRoaXMgaWYgeW91IGFyZSBydW5uaW5nCisgICAgIyBtdWx0aXBsZSBub2RlcyEKKyAgICAtIGNsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyCisgICAgICBwYXJhbWV0ZXJzOgorICAgICAgICAgICMgc2VlZHMgaXMgYWN0dWFsbHkgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBhZGRyZXNzZXMuCisgICAgICAgICAgIyBFeDogIjxpcDE+LDxpcDI+LDxpcDM+IgorICAgICAgICAgIC0gc2VlZHM6ICIxMjcuMC4wLjEiCisKKyMgRm9yIHdvcmtsb2FkcyB3aXRoIG1vcmUgZGF0YSB0aGFuIGNhbiBmaXQgaW4gbWVtb3J5LCBDYXNzYW5kcmEncworIyBib3R0bGVuZWNrIHdpbGwgYmUgcmVhZHMgdGhhdCBuZWVkIHRvIGZldGNoIGRhdGEgZnJvbQorIyBkaXNrLiAiY29uY3VycmVudF9yZWFkcyIgc2hvdWxkIGJlIHNldCB0byAoMTYgKiBudW1iZXJfb2ZfZHJpdmVzKSBpbgorIyBvcmRlciB0byBhbGxvdyB0aGUgb3BlcmF0aW9ucyB0byBlbnF1ZXVlIGxvdyBlbm91Z2ggaW4gdGhlIHN0YWNrCisjIHRoYXQgdGhlIE9TIGFuZCBkcml2ZXMgY2FuIHJlb3JkZXIgdGhlbS4gU2FtZSBhcHBsaWVzIHRvCisjICJjb25jdXJyZW50X2NvdW50ZXJfd3JpdGVzIiwgc2luY2UgY291bnRlciB3cml0ZXMgcmVhZCB0aGUgY3VycmVudAorIyB2YWx1ZXMgYmVmb3JlIGluY3JlbWVudGluZyBhbmQgd3JpdGluZyB0aGVtIGJhY2suCisjCisjIE9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSB3cml0ZXMgYXJlIGFsbW9zdCBuZXZlciBJTyBib3VuZCwgdGhlIGlkZWFsCisjIG51bWJlciBvZiAiY29uY3VycmVudF93cml0ZXMiIGlzIGRlcGVuZGVudCBvbiB0aGUgbnVtYmVyIG9mIGNvcmVzIGluCisjIHlvdXIgc3lzdGVtOyAoOCAqIG51bWJlcl9vZl9jb3JlcykgaXMgYSBnb29kIHJ1bGUgb2YgdGh1bWIuCitjb25jdXJyZW50X3JlYWRzOiAzMgorY29uY3VycmVudF93cml0ZXM6IDMyCitjb25jdXJyZW50X2NvdW50ZXJfd3JpdGVzOiAzMgorCisjIFRvdGFsIG1lbW9yeSB0byB1c2UgZm9yIHNzdGFibGUtcmVhZGluZyBidWZmZXJzLiAgRGVmYXVsdHMgdG8KKyMgdGhlIHNtYWxsZXIgb2YgMS80IG9mIGhlYXAgb3IgNTEyTUIuCisjIGZpbGVfY2FjaGVfc2l6ZV9pbl9tYjogNTEyCisKKyMgVG90YWwgcGVybWl0dGVkIG1lbW9yeSB0byB1c2UgZm9yIG1lbXRhYmxlcy4gQ2Fzc2FuZHJhIHdpbGwgc3RvcCAKKyMgYWNjZXB0aW5nIHdyaXRlcyB3aGVuIHRoZSBsaW1pdCBpcyBleGNlZWRlZCB1bnRpbCBhIGZsdXNoIGNvbXBsZXRlcywKKyMgYW5kIHdpbGwgdHJpZ2dlciBhIGZsdXNoIGJhc2VkIG9uIG1lbXRhYmxlX2NsZWFudXBfdGhyZXNob2xkCisjIElmIG9taXR0ZWQsIENhc3NhbmRyYSB3aWxsIHNldCBib3RoIHRvIDEvNCB0aGUgc2l6ZSBvZiB0aGUgaGVhcC4KKyMgbWVtdGFibGVfaGVhcF9zcGFjZV9pbl9tYjogMjA0OAorIyBtZW10YWJsZV9vZmZoZWFwX3NwYWNlX2luX21iOiAyMDQ4CisKKyMgUmF0aW8gb2Ygb2NjdXBpZWQgbm9uLWZsdXNoaW5nIG1lbXRhYmxlIHNpemUgdG8gdG90YWwgcGVybWl0dGVkIHNpemUKKyMgdGhhdCB3aWxsIHRyaWdnZXIgYSBmbHVzaCBvZiB0aGUgbGFyZ2VzdCBtZW10YWJsZS4gIExhZ2VyIG1jdCB3aWxsCisjIG1lYW4gbGFyZ2VyIGZsdXNoZXMgYW5kIGhlbmNlIGxlc3MgY29tcGFjdGlvbiwgYnV0IGFsc28gbGVzcyBjb25jdXJyZW50CisjIGZsdXNoIGFjdGl2aXR5IHdoaWNoIGNhbiBtYWtlIGl0IGRpZmZpY3VsdCB0byBrZWVwIHlvdXIgZGlza3MgZmVkCisjIHVuZGVyIGhlYXZ5IHdyaXRlIGxvYWQuCisjCisjIG1lbXRhYmxlX2NsZWFudXBfdGhyZXNob2xkIGRlZmF1bHRzIHRvIDEgLyAobWVtdGFibGVfZmx1c2hfd3JpdGVycyArIDEpCisjIG1lbXRhYmxlX2NsZWFudXBfdGhyZXNob2xkOiAwLjExCisKKyMgU3BlY2lmeSB0aGUgd2F5IENhc3NhbmRyYSBhbGxvY2F0ZXMgYW5kIG1hbmFnZXMgbWVtdGFibGUgbWVtb3J5LgorIyBPcHRpb25zIGFyZToKKyMgICBoZWFwX2J1ZmZlcnM6ICAgIG9uIGhlYXAgbmlvIGJ1ZmZlcnMKKyMgICBvZmZoZWFwX2J1ZmZlcnM6IG9mZiBoZWFwIChkaXJlY3QpIG5pbyBidWZmZXJzCisjICAgb2ZmaGVhcF9vYmplY3RzOiBuYXRpdmUgbWVtb3J5LCBlbGltaW5hdGluZyBuaW8gYnVmZmVyIGhlYXAgb3ZlcmhlYWQKK21lbXRhYmxlX2FsbG9jYXRpb25fdHlwZTogaGVhcF9idWZmZXJzCisKKyMgVG90YWwgc3BhY2UgdG8gdXNlIGZvciBjb21taXRsb2dzLiAgU2luY2UgY29tbWl0bG9nIHNlZ21lbnRzIGFyZQorIyBtbWFwcGVkLCBhbmQgaGVuY2UgdXNlIHVwIGFkZHJlc3Mgc3BhY2UsIHRoZSBkZWZhdWx0IHNpemUgaXMgMzIKKyMgb24gMzItYml0IEpWTXMsIGFuZCA4MTkyIG9uIDY0LWJpdCBKVk1zLgorIworIyBJZiBzcGFjZSBnZXRzIGFib3ZlIHRoaXMgdmFsdWUgKGl0IHdpbGwgcm91bmQgdXAgdG8gdGhlIG5leHQgbmVhcmVzdAorIyBzZWdtZW50IG11bHRpcGxlKSwgQ2Fzc2FuZHJhIHdpbGwgZmx1c2ggZXZlcnkgZGlydHkgQ0YgaW4gdGhlIG9sZGVzdAorIyBzZWdtZW50IGFuZCByZW1vdmUgaXQuICBTbyBhIHNtYWxsIHRvdGFsIGNvbW1pdGxvZyBzcGFjZSB3aWxsIHRlbmQKKyMgdG8gY2F1c2UgbW9yZSBmbHVzaCBhY3Rpdml0eSBvbiBsZXNzLWFjdGl2ZSBjb2x1bW5mYW1pbGllcy4KKyMgY29tbWl0bG9nX3RvdGFsX3NwYWNlX2luX21iOiA4MTkyCisKKyMgVGhpcyBzZXRzIHRoZSBhbW91bnQgb2YgbWVtdGFibGUgZmx1c2ggd3JpdGVyIHRocmVhZHMuICBUaGVzZSB3aWxsCisjIGJlIGJsb2NrZWQgYnkgZGlzayBpbywgYW5kIGVhY2ggb25lIHdpbGwgaG9sZCBhIG1lbXRhYmxlIGluIG1lbW9yeQorIyB3aGlsZSBibG9ja2VkLiAKKyMKKyMgbWVtdGFibGVfZmx1c2hfd3JpdGVycyBkZWZhdWx0cyB0byB0aGUgc21hbGxlciBvZiAobnVtYmVyIG9mIGRpc2tzLAorIyBudW1iZXIgb2YgY29yZXMpLCB3aXRoIGEgbWluaW11bSBvZiAyIGFuZCBhIG1heGltdW0gb2YgOC4KKyMgCisjIElmIHlvdXIgZGF0YSBkaXJlY3RvcmllcyBhcmUgYmFja2VkIGJ5IFNTRCwgeW91IHNob3VsZCBpbmNyZWFzZSB0aGlzCisjIHRvIHRoZSBudW1iZXIgb2YgY29yZXMuCisjbWVtdGFibGVfZmx1c2hfd3JpdGVyczogOAorCisjIEEgZml4ZWQgbWVtb3J5IHBvb2wgc2l6ZSBpbiBNQiBmb3IgZm9yIFNTVGFibGUgaW5kZXggc3VtbWFyaWVzLiBJZiBsZWZ0CisjIGVtcHR5LCB0aGlzIHdpbGwgZGVmYXVsdCB0byA1JSBvZiB0aGUgaGVhcCBzaXplLiBJZiB0aGUgbWVtb3J5IHVzYWdlIG9mCisjIGFsbCBpbmRleCBzdW1tYXJpZXMgZXhjZWVkcyB0aGlzIGxpbWl0LCBTU1RhYmxlcyB3aXRoIGxvdyByZWFkIHJhdGVzIHdpbGwKKyMgc2hyaW5rIHRoZWlyIGluZGV4IHN1bW1hcmllcyBpbiBvcmRlciB0byBtZWV0IHRoaXMgbGltaXQuICBIb3dldmVyLCB0aGlzCisjIGlzIGEgYmVzdC1lZmZvcnQgcHJvY2Vzcy4gSW4gZXh0cmVtZSBjb25kaXRpb25zIENhc3NhbmRyYSBtYXkgbmVlZCB0byB1c2UKKyMgbW9yZSB0aGFuIHRoaXMgYW1vdW50IG9mIG1lbW9yeS4KK2luZGV4X3N1bW1hcnlfY2FwYWNpdHlfaW5fbWI6CisKKyMgSG93IGZyZXF1ZW50bHkgaW5kZXggc3VtbWFyaWVzIHNob3VsZCBiZSByZXNhbXBsZWQuICBUaGlzIGlzIGRvbmUKKyMgcGVyaW9kaWNhbGx5IHRvIHJlZGlzdHJpYnV0ZSBtZW1vcnkgZnJvbSB0aGUgZml4ZWQtc2l6ZSBwb29sIHRvIHNzdGFibGVzCisjIHByb3BvcnRpb25hbCB0aGVpciByZWNlbnQgcmVhZCByYXRlcy4gIFNldHRpbmcgdG8gLTEgd2lsbCBkaXNhYmxlIHRoaXMKKyMgcHJvY2VzcywgbGVhdmluZyBleGlzdGluZyBpbmRleCBzdW1tYXJpZXMgYXQgdGhlaXIgY3VycmVudCBzYW1wbGluZyBsZXZlbC4KK2luZGV4X3N1bW1hcnlfcmVzaXplX2ludGVydmFsX2luX21pbnV0ZXM6IDYwCisKKyMgV2hldGhlciB0bywgd2hlbiBkb2luZyBzZXF1ZW50aWFsIHdyaXRpbmcsIGZzeW5jKCkgYXQgaW50ZXJ2YWxzIGluCisjIG9yZGVyIHRvIGZvcmNlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGZsdXNoIHRoZSBkaXJ0eQorIyBidWZmZXJzLiBFbmFibGUgdGhpcyB0byBhdm9pZCBzdWRkZW4gZGlydHkgYnVmZmVyIGZsdXNoaW5nIGZyb20KKyMgaW1wYWN0aW5nIHJlYWQgbGF0ZW5jaWVzLiBBbG1vc3QgYWx3YXlzIGEgZ29vZCBpZGVhIG9uIFNTRHM7IG5vdAorIyBuZWNlc3NhcmlseSBvbiBwbGF0dGVycy4KK3RyaWNrbGVfZnN5bmM6IGZhbHNlCit0cmlja2xlX2ZzeW5jX2ludGVydmFsX2luX2tiOiAxMDI0MAorCisjIFRDUCBwb3J0LCBmb3IgY29tbWFuZHMgYW5kIGRhdGEKKyMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHlvdSBzaG91bGQgbm90IGV4cG9zZSB0aGlzIHBvcnQgdG8gdGhlIGludGVybmV0LiAgRmlyZXdhbGwgaXQgaWYgbmVlZGVkLgorc3RvcmFnZV9wb3J0OiA3MDAwCisKKyMgU1NMIHBvcnQsIGZvciBlbmNyeXB0ZWQgY29tbXVuaWNhdGlvbi4gIFVudXNlZCB1bmxlc3MgZW5hYmxlZCBpbgorIyBlbmNyeXB0aW9uX29wdGlvbnMKKyMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHlvdSBzaG91bGQgbm90IGV4cG9zZSB0aGlzIHBvcnQgdG8gdGhlIGludGVybmV0LiAgRmlyZXdhbGwgaXQgaWYgbmVlZGVkLgorc3NsX3N0b3JhZ2VfcG9ydDogNzAwMQorCisjIEFkZHJlc3Mgb3IgaW50ZXJmYWNlIHRvIGJpbmQgdG8gYW5kIHRlbGwgb3RoZXIgQ2Fzc2FuZHJhIG5vZGVzIHRvIGNvbm5lY3QgdG8uCisjIFlvdSBfbXVzdF8gY2hhbmdlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgbm9kZXMgdG8gYmUgYWJsZSB0byBjb21tdW5pY2F0ZSEKKyMKKyMgU2V0IGxpc3Rlbl9hZGRyZXNzIE9SIGxpc3Rlbl9pbnRlcmZhY2UsIG5vdCBib3RoLiBJbnRlcmZhY2VzIG11c3QgY29ycmVzcG9uZAorIyB0byBhIHNpbmdsZSBhZGRyZXNzLCBJUCBhbGlhc2luZyBpcyBub3Qgc3VwcG9ydGVkLgorIworIyBMZWF2aW5nIGl0IGJsYW5rIGxlYXZlcyBpdCB1cCB0byBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS4gVGhpcworIyB3aWxsIGFsd2F5cyBkbyB0aGUgUmlnaHQgVGhpbmcgX2lmXyB0aGUgbm9kZSBpcyBwcm9wZXJseSBjb25maWd1cmVkCisjIChob3N0bmFtZSwgbmFtZSByZXNvbHV0aW9uLCBldGMpLCBhbmQgdGhlIFJpZ2h0IFRoaW5nIGlzIHRvIHVzZSB0aGUKKyMgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGhvc3RuYW1lIChpdCBtaWdodCBub3QgYmUpLgorIworIyBTZXR0aW5nIGxpc3Rlbl9hZGRyZXNzIHRvIDAuMC4wLjAgaXMgYWx3YXlzIHdyb25nLgorIworIyBJZiB5b3UgY2hvb3NlIHRvIHNwZWNpZnkgdGhlIGludGVyZmFjZSBieSBuYW1lIGFuZCB0aGUgaW50ZXJmYWNlIGhhcyBhbiBpcHY0IGFuZCBhbiBpcHY2IGFkZHJlc3MKKyMgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIHNob3VsZCBiZSBjaG9zZW4gdXNpbmcgbGlzdGVuX2ludGVyZmFjZV9wcmVmZXJfaXB2Ni4gSWYgZmFsc2UgdGhlIGZpcnN0IGlwdjQKKyMgYWRkcmVzcyB3aWxsIGJlIHVzZWQuIElmIHRydWUgdGhlIGZpcnN0IGlwdjYgYWRkcmVzcyB3aWxsIGJlIHVzZWQuIERlZmF1bHRzIHRvIGZhbHNlIHByZWZlcnJpbmcKKyMgaXB2NC4gSWYgdGhlcmUgaXMgb25seSBvbmUgYWRkcmVzcyBpdCB3aWxsIGJlIHNlbGVjdGVkIHJlZ2FyZGxlc3Mgb2YgaXB2NC9pcHY2LgorbGlzdGVuX2FkZHJlc3M6IGxvY2FsaG9zdAorIyBsaXN0ZW5faW50ZXJmYWNlOiBldGgwCisjIGxpc3Rlbl9pbnRlcmZhY2VfcHJlZmVyX2lwdjY6IGZhbHNlCisKKyMgQWRkcmVzcyB0byBicm9hZGNhc3QgdG8gb3RoZXIgQ2Fzc2FuZHJhIG5vZGVzCisjIExlYXZpbmcgdGhpcyBibGFuayB3aWxsIHNldCBpdCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBsaXN0ZW5fYWRkcmVzcworIyBicm9hZGNhc3RfYWRkcmVzczogMS4yLjMuNAorCisjIEludGVybm9kZSBhdXRoZW50aWNhdGlvbiBiYWNrZW5kLCBpbXBsZW1lbnRpbmcgSUludGVybm9kZUF1dGhlbnRpY2F0b3I7CisjIHVzZWQgdG8gYWxsb3cvZGlzYWxsb3cgY29ubmVjdGlvbnMgZnJvbSBwZWVyIG5vZGVzLgorIyBpbnRlcm5vZGVfYXV0aGVudGljYXRvcjogb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BbGxvd0FsbEludGVybm9kZUF1dGhlbnRpY2F0b3IKKworIyBXaGV0aGVyIHRvIHN0YXJ0IHRoZSBuYXRpdmUgdHJhbnNwb3J0IHNlcnZlci4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWRkcmVzcyBvbiB3aGljaCB0aGUgbmF0aXZlIHRyYW5zcG9ydCBpcyBib3VuZCBpcyB0aGUKKyMgc2FtZSBhcyB0aGUgcnBjX2FkZHJlc3MuIFRoZSBwb3J0IGhvd2V2ZXIgaXMgZGlmZmVyZW50IGFuZCBzcGVjaWZpZWQgYmVsb3cuCitzdGFydF9uYXRpdmVfdHJhbnNwb3J0OiB0cnVlCisjIHBvcnQgZm9yIHRoZSBDUUwgbmF0aXZlIHRyYW5zcG9ydCB0byBsaXN0ZW4gZm9yIGNsaWVudHMgb24KKyMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHlvdSBzaG91bGQgbm90IGV4cG9zZSB0aGlzIHBvcnQgdG8gdGhlIGludGVybmV0LiAgRmlyZXdhbGwgaXQgaWYgbmVlZGVkLgorbmF0aXZlX3RyYW5zcG9ydF9wb3J0OiA5MDQyCisjIFRoZSBtYXhpbXVtIHRocmVhZHMgZm9yIGhhbmRsaW5nIHJlcXVlc3RzIHdoZW4gdGhlIG5hdGl2ZSB0cmFuc3BvcnQgaXMgdXNlZC4KKyMgVGhpcyBpcyBzaW1pbGFyIHRvIHJwY19tYXhfdGhyZWFkcyB0aG91Z2ggdGhlIGRlZmF1bHQgZGlmZmVycyBzbGlnaHRseSAoYW5kCisjIHRoZXJlIGlzIG5vIG5hdGl2ZV90cmFuc3BvcnRfbWluX3RocmVhZHMsIGlkbGUgdGhyZWFkcyB3aWxsIGFsd2F5cyBiZSBzdG9wcGVkCisjIGFmdGVyIDMwIHNlY29uZHMpLgorIyBuYXRpdmVfdHJhbnNwb3J0X21heF90aHJlYWRzOiAxMjgKKyMKKyMgVGhlIG1heGltdW0gc2l6ZSBvZiBhbGxvd2VkIGZyYW1lLiBGcmFtZSAocmVxdWVzdHMpIGxhcmdlciB0aGFuIHRoaXMgd2lsbAorIyBiZSByZWplY3RlZCBhcyBpbnZhbGlkLiBUaGUgZGVmYXVsdCBpcyAyNTZNQi4KKyMgbmF0aXZlX3RyYW5zcG9ydF9tYXhfZnJhbWVfc2l6ZV9pbl9tYjogMjU2CisKKyMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50IGNvbm5lY3Rpb25zLgorIyBUaGUgZGVmYXVsdCBpcyAtMSwgd2hpY2ggbWVhbnMgdW5saW1pdGVkLgorIyBuYXRpdmVfdHJhbnNwb3J0X21heF9jb25jdXJyZW50X2Nvbm5lY3Rpb25zOiAtMQorCisjIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudCBjb25uZWN0aW9ucyBwZXIgc291cmNlIGlwLgorIyBUaGUgZGVmYXVsdCBpcyAtMSwgd2hpY2ggbWVhbnMgdW5saW1pdGVkLgorIyBuYXRpdmVfdHJhbnNwb3J0X21heF9jb25jdXJyZW50X2Nvbm5lY3Rpb25zX3Blcl9pcDogLTEKKworIyBXaGV0aGVyIHRvIHN0YXJ0IHRoZSB0aHJpZnQgcnBjIHNlcnZlci4KK3N0YXJ0X3JwYzogdHJ1ZQorCisjIFRoZSBhZGRyZXNzIG9yIGludGVyZmFjZSB0byBiaW5kIHRoZSBUaHJpZnQgUlBDIHNlcnZpY2UgYW5kIG5hdGl2ZSB0cmFuc3BvcnQKKyMgc2VydmVyIHRvLgorIworIyBTZXQgcnBjX2FkZHJlc3MgT1IgcnBjX2ludGVyZmFjZSwgbm90IGJvdGguIEludGVyZmFjZXMgbXVzdCBjb3JyZXNwb25kCisjIHRvIGEgc2luZ2xlIGFkZHJlc3MsIElQIGFsaWFzaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisjCisjIExlYXZpbmcgcnBjX2FkZHJlc3MgYmxhbmsgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBvbiBsaXN0ZW5fYWRkcmVzcworIyAoaS5lLiBpdCB3aWxsIGJlIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGhvc3RuYW1lIG9mIHRoZSBub2RlKS4KKyMKKyMgTm90ZSB0aGF0IHVubGlrZSBsaXN0ZW5fYWRkcmVzcywgeW91IGNhbiBzcGVjaWZ5IDAuMC4wLjAsIGJ1dCB5b3UgbXVzdCBhbHNvCisjIHNldCBicm9hZGNhc3RfcnBjX2FkZHJlc3MgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIDAuMC4wLjAuCisjCisjIEZvciBzZWN1cml0eSByZWFzb25zLCB5b3Ugc2hvdWxkIG5vdCBleHBvc2UgdGhpcyBwb3J0IHRvIHRoZSBpbnRlcm5ldC4gIEZpcmV3YWxsIGl0IGlmIG5lZWRlZC4KKyMKKyMgSWYgeW91IGNob29zZSB0byBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UgYnkgbmFtZSBhbmQgdGhlIGludGVyZmFjZSBoYXMgYW4gaXB2NCBhbmQgYW4gaXB2NiBhZGRyZXNzCisjIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBzaG91bGQgYmUgY2hvc2VuIHVzaW5nIHJwY19pbnRlcmZhY2VfcHJlZmVyX2lwdjYuIElmIGZhbHNlIHRoZSBmaXJzdCBpcHY0CisjIGFkZHJlc3Mgd2lsbCBiZSB1c2VkLiBJZiB0cnVlIHRoZSBmaXJzdCBpcHY2IGFkZHJlc3Mgd2lsbCBiZSB1c2VkLiBEZWZhdWx0cyB0byBmYWxzZSBwcmVmZXJyaW5nCisjIGlwdjQuIElmIHRoZXJlIGlzIG9ubHkgb25lIGFkZHJlc3MgaXQgd2lsbCBiZSBzZWxlY3RlZCByZWdhcmRsZXNzIG9mIGlwdjQvaXB2Ni4KK3JwY19hZGRyZXNzOiAwLjAuMC4wCisjIHJwY19pbnRlcmZhY2U6IGV0aDEKKyMgcnBjX2ludGVyZmFjZV9wcmVmZXJfaXB2NjogZmFsc2UKKworIyBwb3J0IGZvciBUaHJpZnQgdG8gbGlzdGVuIGZvciBjbGllbnRzIG9uCitycGNfcG9ydDogOTE2MAorCisjIFJQQyBhZGRyZXNzIHRvIGJyb2FkY2FzdCB0byBkcml2ZXJzIGFuZCBvdGhlciBDYXNzYW5kcmEgbm9kZXMuIFRoaXMgY2Fubm90CisjIGJlIHNldCB0byAwLjAuMC4wLiBJZiBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZgorIyBycGNfYWRkcmVzcy4gSWYgcnBjX2FkZHJlc3MgaXMgc2V0IHRvIDAuMC4wLjAsIGJyb2FkY2FzdF9ycGNfYWRkcmVzcyBtdXN0CisjIGJlIHNldC4KK2Jyb2FkY2FzdF9ycGNfYWRkcmVzczogMTI3LjAuMC4xCisKKworCisKKworCisjIGVuYWJsZSBvciBkaXNhYmxlIGtlZXBhbGl2ZSBvbiBycGMvbmF0aXZlIGNvbm5lY3Rpb25zCitycGNfa2VlcGFsaXZlOiB0cnVlCisKKyMgQ2Fzc2FuZHJhIHByb3ZpZGVzIHR3byBvdXQtb2YtdGhlLWJveCBvcHRpb25zIGZvciB0aGUgUlBDIFNlcnZlcjoKKyMKKyMgc3luYyAgLT4gT25lIHRocmVhZCBwZXIgdGhyaWZ0IGNvbm5lY3Rpb24uIEZvciBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIGNsaWVudHMsIG1lbW9yeQorIyAgICAgICAgICB3aWxsIGJlIHlvdXIgbGltaXRpbmcgZmFjdG9yLiBPbiBhIDY0IGJpdCBKVk0sIDE4MEtCIGlzIHRoZSBtaW5pbXVtIHN0YWNrIHNpemUKKyMgICAgICAgICAgcGVyIHRocmVhZCwgYW5kIHRoYXQgd2lsbCBjb3JyZXNwb25kIHRvIHlvdXIgdXNlIG9mIHZpcnR1YWwgbWVtb3J5IChidXQgcGh5c2ljYWwgbWVtb3J5CisjICAgICAgICAgIG1heSBiZSBsaW1pdGVkIGRlcGVuZGluZyBvbiB1c2Ugb2Ygc3RhY2sgc3BhY2UpLgorIworIyBoc2hhICAtPiBTdGFuZHMgZm9yICJoYWxmIHN5bmNocm9ub3VzLCBoYWxmIGFzeW5jaHJvbm91cy4iIEFsbCB0aHJpZnQgY2xpZW50cyBhcmUgaGFuZGxlZAorIyAgICAgICAgICBhc3luY2hyb25vdXNseSB1c2luZyBhIHNtYWxsIG51bWJlciBvZiB0aHJlYWRzIHRoYXQgZG9lcyBub3QgdmFyeSB3aXRoIHRoZSBhbW91bnQKKyMgICAgICAgICAgb2YgdGhyaWZ0IGNsaWVudHMgKGFuZCB0aHVzIHNjYWxlcyB3ZWxsIHRvIG1hbnkgY2xpZW50cykuIFRoZSBycGMgcmVxdWVzdHMgYXJlIHN0aWxsCisjICAgICAgICAgIHN5bmNocm9ub3VzIChvbmUgdGhyZWFkIHBlciBhY3RpdmUgcmVxdWVzdCkuIElmIGhzaGEgaXMgc2VsZWN0ZWQgdGhlbiBpdCBpcyBlc3NlbnRpYWwKKyMgICAgICAgICAgdGhhdCBycGNfbWF4X3RocmVhZHMgaXMgY2hhbmdlZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHVubGltaXRlZC4KKyMKKyMgVGhlIGRlZmF1bHQgaXMgc3luYyBiZWNhdXNlIG9uIFdpbmRvd3MgaHNoYSBpcyBhYm91dCAzMCUgc2xvd2VyLiAgT24gTGludXgsCisjIHN5bmMvaHNoYSBwZXJmb3JtYW5jZSBpcyBhYm91dCB0aGUgc2FtZSwgd2l0aCBoc2hhIG9mIGNvdXJzZSB1c2luZyBsZXNzIG1lbW9yeS4KKyMKKyMgQWx0ZXJuYXRpdmVseSwgIGNhbiBwcm92aWRlIHlvdXIgb3duIFJQQyBzZXJ2ZXIgYnkgcHJvdmlkaW5nIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQorIyBvZiBhbiBvLmEuYy50LlRTZXJ2ZXJGYWN0b3J5IHRoYXQgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpdC4KK3JwY19zZXJ2ZXJfdHlwZTogc3luYworCisjIFVuY29tbWVudCBycGNfbWlufG1heF90aHJlYWQgdG8gc2V0IHJlcXVlc3QgcG9vbCBzaXplIGxpbWl0cy4KKyMKKyMgUmVnYXJkbGVzcyBvZiB5b3VyIGNob2ljZSBvZiBSUEMgc2VydmVyIChzZWUgYWJvdmUpLCB0aGUgbnVtYmVyIG9mIG1heGltdW0gcmVxdWVzdHMgaW4gdGhlCisjIFJQQyB0aHJlYWQgcG9vbCBkaWN0YXRlcyBob3cgbWFueSBjb25jdXJyZW50IHJlcXVlc3RzIGFyZSBwb3NzaWJsZSAoYnV0IGlmIHlvdSBhcmUgdXNpbmcgdGhlIHN5bmMKKyMgUlBDIHNlcnZlciwgaXQgYWxzbyBkaWN0YXRlcyB0aGUgbnVtYmVyIG9mIGNsaWVudHMgdGhhdCBjYW4gYmUgY29ubmVjdGVkIGF0IGFsbCkuCisjCisjIFRoZSBkZWZhdWx0IGlzIHVubGltaXRlZCBhbmQgdGh1cyBwcm92aWRlcyBubyBwcm90ZWN0aW9uIGFnYWluc3QgY2xpZW50cyBvdmVyd2hlbG1pbmcgdGhlIHNlcnZlci4gWW91IGFyZQorIyBlbmNvdXJhZ2VkIHRvIHNldCBhIG1heGltdW0gdGhhdCBtYWtlcyBzZW5zZSBmb3IgeW91IGluIHByb2R1Y3Rpb24sIGJ1dCBkbyBrZWVwIGluIG1pbmQgdGhhdAorIyBycGNfbWF4X3RocmVhZHMgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2xpZW50IHJlcXVlc3RzIHRoaXMgc2VydmVyIG1heSBleGVjdXRlIGNvbmN1cnJlbnRseS4KKyMKKyMgcnBjX21pbl90aHJlYWRzOiAxNgorIyBycGNfbWF4X3RocmVhZHM6IDIwNDgKKworIyB1bmNvbW1lbnQgdG8gc2V0IHNvY2tldCBidWZmZXIgc2l6ZXMgb24gcnBjIGNvbm5lY3Rpb25zCisjIHJwY19zZW5kX2J1ZmZfc2l6ZV9pbl9ieXRlczoKKyMgcnBjX3JlY3ZfYnVmZl9zaXplX2luX2J5dGVzOgorCisjIFVuY29tbWVudCB0byBzZXQgc29ja2V0IGJ1ZmZlciBzaXplIGZvciBpbnRlcm5vZGUgY29tbXVuaWNhdGlvbgorIyBOb3RlIHRoYXQgd2hlbiBzZXR0aW5nIHRoaXMsIHRoZSBidWZmZXIgc2l6ZSBpcyBsaW1pdGVkIGJ5IG5ldC5jb3JlLndtZW1fbWF4CisjIGFuZCB3aGVuIG5vdCBzZXR0aW5nIGl0IGl0IGlzIGRlZmluZWQgYnkgbmV0LmlwdjQudGNwX3dtZW0KKyMgU2VlOgorIyAvcHJvYy9zeXMvbmV0L2NvcmUvd21lbV9tYXgKKyMgL3Byb2Mvc3lzL25ldC9jb3JlL3JtZW1fbWF4CisjIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfd21lbQorIyAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3dtZW0KKyMgYW5kOiBtYW4gdGNwCisjIGludGVybm9kZV9zZW5kX2J1ZmZfc2l6ZV9pbl9ieXRlczoKKyMgaW50ZXJub2RlX3JlY3ZfYnVmZl9zaXplX2luX2J5dGVzOgorCisjIEZyYW1lIHNpemUgZm9yIHRocmlmdCAobWF4aW11bSBtZXNzYWdlIGxlbmd0aCkuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9zaXplX2luX21iOiAxNQorCisjIFNldCB0byB0cnVlIHRvIGhhdmUgQ2Fzc2FuZHJhIGNyZWF0ZSBhIGhhcmQgbGluayB0byBlYWNoIHNzdGFibGUKKyMgZmx1c2hlZCBvciBzdHJlYW1lZCBsb2NhbGx5IGluIGEgYmFja3Vwcy8gc3ViZGlyZWN0b3J5IG9mIHRoZQorIyBrZXlzcGFjZSBkYXRhLiAgUmVtb3ZpbmcgdGhlc2UgbGlua3MgaXMgdGhlIG9wZXJhdG9yJ3MKKyMgcmVzcG9uc2liaWxpdHkuCitpbmNyZW1lbnRhbF9iYWNrdXBzOiBmYWxzZQorCisjIFdoZXRoZXIgb3Igbm90IHRvIHRha2UgYSBzbmFwc2hvdCBiZWZvcmUgZWFjaCBjb21wYWN0aW9uLiAgQmUKKyMgY2FyZWZ1bCB1c2luZyB0aGlzIG9wdGlvbiwgc2luY2UgQ2Fzc2FuZHJhIHdvbid0IGNsZWFuIHVwIHRoZQorIyBzbmFwc2hvdHMgZm9yIHlvdS4gIE1vc3RseSB1c2VmdWwgaWYgeW91J3JlIHBhcmFub2lkIHdoZW4gdGhlcmUKKyMgaXMgYSBkYXRhIGZvcm1hdCBjaGFuZ2UuCitzbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbjogZmFsc2UKKworIyBXaGV0aGVyIG9yIG5vdCBhIHNuYXBzaG90IGlzIHRha2VuIG9mIHRoZSBkYXRhIGJlZm9yZSBrZXlzcGFjZSB0cnVuY2F0aW9uCisjIG9yIGRyb3BwaW5nIG9mIGNvbHVtbiBmYW1pbGllcy4gVGhlIFNUUk9OR0xZIGFkdmlzZWQgZGVmYXVsdCBvZiB0cnVlIAorIyBzaG91bGQgYmUgdXNlZCB0byBwcm92aWRlIGRhdGEgc2FmZXR5LiBJZiB5b3Ugc2V0IHRoaXMgZmxhZyB0byBmYWxzZSwgeW91IHdpbGwKKyMgbG9zZSBkYXRhIG9uIHRydW5jYXRpb24gb3IgZHJvcC4KK2F1dG9fc25hcHNob3Q6IHRydWUKKworIyBXaGVuIGV4ZWN1dGluZyBhIHNjYW4sIHdpdGhpbiBvciBhY3Jvc3MgYSBwYXJ0aXRpb24sIHdlIG5lZWQgdG8ga2VlcCB0aGUKKyMgdG9tYnN0b25lcyBzZWVuIGluIG1lbW9yeSBzbyB3ZSBjYW4gcmV0dXJuIHRoZW0gdG8gdGhlIGNvb3JkaW5hdG9yLCB3aGljaAorIyB3aWxsIHVzZSB0aGVtIHRvIG1ha2Ugc3VyZSBvdGhlciByZXBsaWNhcyBhbHNvIGtub3cgYWJvdXQgdGhlIGRlbGV0ZWQgcm93cy4KKyMgV2l0aCB3b3JrbG9hZHMgdGhhdCBnZW5lcmF0ZSBhIGxvdCBvZiB0b21ic3RvbmVzLCB0aGlzIGNhbiBjYXVzZSBwZXJmb3JtYW5jZQorIyBwcm9ibGVtcyBhbmQgZXZlbiBleGF1c3QgdGhlIHNlcnZlciBoZWFwLgorIyAoaHR0cDovL3d3dy5kYXRhc3RheC5jb20vZGV2L2Jsb2cvY2Fzc2FuZHJhLWFudGktcGF0dGVybnMtcXVldWVzLWFuZC1xdWV1ZS1saWtlLWRhdGFzZXRzKQorIyBBZGp1c3QgdGhlIHRocmVzaG9sZHMgaGVyZSBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgZGFuZ2VycyBhbmQgd2FudCB0bworIyBzY2FuIG1vcmUgdG9tYnN0b25lcyBhbnl3YXkuICBUaGVzZSB0aHJlc2hvbGRzIG1heSBhbHNvIGJlIGFkanVzdGVkIGF0IHJ1bnRpbWUKKyMgdXNpbmcgdGhlIFN0b3JhZ2VTZXJ2aWNlIG1iZWFuLgordG9tYnN0b25lX3dhcm5fdGhyZXNob2xkOiAxMDAwCit0b21ic3RvbmVfZmFpbHVyZV90aHJlc2hvbGQ6IDEwMDAwMAorCisjIEdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24uCisjIEluY3JlYXNlIGlmIHlvdXIgcm93cyBhcmUgbGFyZ2UsIG9yIGlmIHlvdSBoYXZlIGEgdmVyeSBsYXJnZQorIyBudW1iZXIgb2Ygcm93cyBwZXIgcGFydGl0aW9uLiAgVGhlIGNvbXBldGluZyBnb2FscyBhcmUgdGhlc2U6CisjICAgMSkgYSBzbWFsbGVyIGdyYW51bGFyaXR5IG1lYW5zIG1vcmUgaW5kZXggZW50cmllcyBhcmUgZ2VuZXJhdGVkCisjICAgICAgYW5kIGxvb2tpbmcgdXAgcm93cyB3aXRoaW5nIHRoZSBwYXJ0aXRpb24gYnkgY29sbGF0aW9uIGNvbHVtbgorIyAgICAgIGlzIGZhc3RlcgorIyAgIDIpIGJ1dCwgQ2Fzc2FuZHJhIHdpbGwga2VlcCB0aGUgY29sbGF0aW9uIGluZGV4IGluIG1lbW9yeSBmb3IgaG90CisjICAgICAgcm93cyAoYXMgcGFydCBvZiB0aGUga2V5IGNhY2hlKSwgc28gYSBsYXJnZXIgZ3JhbnVsYXJpdHkgbWVhbnMKKyMgICAgICB5b3UgY2FuIGNhY2hlIG1vcmUgaG90IHJvd3MKK2NvbHVtbl9pbmRleF9zaXplX2luX2tiOiA2NAorCisKKyMgTG9nIFdBUk4gb24gYW55IGJhdGNoIHNpemUgZXhjZWVkaW5nIHRoaXMgdmFsdWUuIDVrYiBwZXIgYmF0Y2ggYnkgZGVmYXVsdC4KKyMgQ2F1dGlvbiBzaG91bGQgYmUgdGFrZW4gb24gaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGlzIHRocmVzaG9sZCBhcyBpdCBjYW4gbGVhZCB0byBub2RlIGluc3RhYmlsaXR5LgorYmF0Y2hfc2l6ZV93YXJuX3RocmVzaG9sZF9pbl9rYjogNQorCisjIE51bWJlciBvZiBzaW11bHRhbmVvdXMgY29tcGFjdGlvbnMgdG8gYWxsb3csIE5PVCBpbmNsdWRpbmcKKyMgdmFsaWRhdGlvbiAiY29tcGFjdGlvbnMiIGZvciBhbnRpLWVudHJvcHkgcmVwYWlyLiAgU2ltdWx0YW5lb3VzCisjIGNvbXBhY3Rpb25zIGNhbiBoZWxwIHByZXNlcnZlIHJlYWQgcGVyZm9ybWFuY2UgaW4gYSBtaXhlZCByZWFkL3dyaXRlCisjIHdvcmtsb2FkLCBieSBtaXRpZ2F0aW5nIHRoZSB0ZW5kZW5jeSBvZiBzbWFsbCBzc3RhYmxlcyB0byBhY2N1bXVsYXRlCisjIGR1cmluZyBhIHNpbmdsZSBsb25nIHJ1bm5pbmcgY29tcGFjdGlvbnMuIFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkKKyMgZmluZSBhbmQgaWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCBjb21wYWN0aW9uIHJ1bm5pbmcgdG9vCisjIHNsb3dseSBvciB0b28gZmFzdCwgeW91IHNob3VsZCBsb29rIGF0CisjIGNvbXBhY3Rpb25fdGhyb3VnaHB1dF9tYl9wZXJfc2VjIGZpcnN0LgorIworIyBjb25jdXJyZW50X2NvbXBhY3RvcnMgZGVmYXVsdHMgdG8gdGhlIHNtYWxsZXIgb2YgKG51bWJlciBvZiBkaXNrcywKKyMgbnVtYmVyIG9mIGNvcmVzKSwgd2l0aCBhIG1pbmltdW0gb2YgMiBhbmQgYSBtYXhpbXVtIG9mIDguCisjIAorIyBJZiB5b3VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlIGJhY2tlZCBieSBTU0QsIHlvdSBzaG91bGQgaW5jcmVhc2UgdGhpcworIyB0byB0aGUgbnVtYmVyIG9mIGNvcmVzLgorI2NvbmN1cnJlbnRfY29tcGFjdG9yczogMQorCisjIFRocm90dGxlcyBjb21wYWN0aW9uIHRvIHRoZSBnaXZlbiB0b3RhbCB0aHJvdWdocHV0IGFjcm9zcyB0aGUgZW50aXJlCisjIHN5c3RlbS4gVGhlIGZhc3RlciB5b3UgaW5zZXJ0IGRhdGEsIHRoZSBmYXN0ZXIgeW91IG5lZWQgdG8gY29tcGFjdCBpbgorIyBvcmRlciB0byBrZWVwIHRoZSBzc3RhYmxlIGNvdW50IGRvd24sIGJ1dCBpbiBnZW5lcmFsLCBzZXR0aW5nIHRoaXMgdG8KKyMgMTYgdG8gMzIgdGltZXMgdGhlIHJhdGUgeW91IGFyZSBpbnNlcnRpbmcgZGF0YSBpcyBtb3JlIHRoYW4gc3VmZmljaWVudC4KKyMgU2V0dGluZyB0aGlzIHRvIDAgZGlzYWJsZXMgdGhyb3R0bGluZy4gTm90ZSB0aGF0IHRoaXMgYWNjb3VudCBmb3IgYWxsIHR5cGVzCisjIG9mIGNvbXBhY3Rpb24sIGluY2x1ZGluZyB2YWxpZGF0aW9uIGNvbXBhY3Rpb24uCitjb21wYWN0aW9uX3Rocm91Z2hwdXRfbWJfcGVyX3NlYzogMTYKKworIyBXaGVuIGNvbXBhY3RpbmcsIHRoZSByZXBsYWNlbWVudCBzc3RhYmxlKHMpIGNhbiBiZSBvcGVuZWQgYmVmb3JlIHRoZXkKKyMgYXJlIGNvbXBsZXRlbHkgd3JpdHRlbiwgYW5kIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHByaW9yIHNzdGFibGVzIGZvcgorIyBhbnkgcmFuZ2UgdGhhdCBoYXMgYmVlbiB3cml0dGVuLiBUaGlzIGhlbHBzIHRvIHNtb290aGx5IHRyYW5zZmVyIHJlYWRzIAorIyBiZXR3ZWVuIHRoZSBzc3RhYmxlcywgcmVkdWNpbmcgcGFnZSBjYWNoZSBjaHVybiBhbmQga2VlcGluZyBob3Qgcm93cyBob3QKK3NzdGFibGVfcHJlZW1wdGl2ZV9vcGVuX2ludGVydmFsX2luX21iOiA1MAorCisjIFRocm90dGxlcyBhbGwgb3V0Ym91bmQgc3RyZWFtaW5nIGZpbGUgdHJhbnNmZXJzIG9uIHRoaXMgbm9kZSB0byB0aGUKKyMgZ2l2ZW4gdG90YWwgdGhyb3VnaHB1dCBpbiBNYnBzLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIENhc3NhbmRyYSBkb2VzCisjIG1vc3RseSBzZXF1ZW50aWFsIElPIHdoZW4gc3RyZWFtaW5nIGRhdGEgZHVyaW5nIGJvb3RzdHJhcCBvciByZXBhaXIsIHdoaWNoCisjIGNhbiBsZWFkIHRvIHNhdHVyYXRpbmcgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBhbmQgZGVncmFkaW5nIHJwYyBwZXJmb3JtYW5jZS4KKyMgV2hlbiB1bnNldCwgdGhlIGRlZmF1bHQgaXMgMjAwIE1icHMgb3IgMjUgTUIvcy4KKyMgc3RyZWFtX3Rocm91Z2hwdXRfb3V0Ym91bmRfbWVnYWJpdHNfcGVyX3NlYzogMjAwCisKKyMgVGhyb3R0bGVzIGFsbCBzdHJlYW1pbmcgZmlsZSB0cmFuc2ZlciBiZXR3ZWVuIHRoZSBkYXRhY2VudGVycywKKyMgdGhpcyBzZXR0aW5nIGFsbG93cyB1c2VycyB0byB0aHJvdHRsZSBpbnRlciBkYyBzdHJlYW0gdGhyb3VnaHB1dCBpbiBhZGRpdGlvbgorIyB0byB0aHJvdHRsaW5nIGFsbCBuZXR3b3JrIHN0cmVhbSB0cmFmZmljIGFzIGNvbmZpZ3VyZWQgd2l0aAorIyBzdHJlYW1fdGhyb3VnaHB1dF9vdXRib3VuZF9tZWdhYml0c19wZXJfc2VjCisjIGludGVyX2RjX3N0cmVhbV90aHJvdWdocHV0X291dGJvdW5kX21lZ2FiaXRzX3Blcl9zZWM6CisKKyMgSG93IGxvbmcgdGhlIGNvb3JkaW5hdG9yIHNob3VsZCB3YWl0IGZvciByZWFkIG9wZXJhdGlvbnMgdG8gY29tcGxldGUKK3JlYWRfcmVxdWVzdF90aW1lb3V0X2luX21zOiA1MDAwCisjIEhvdyBsb25nIHRoZSBjb29yZGluYXRvciBzaG91bGQgd2FpdCBmb3Igc2VxIG9yIGluZGV4IHNjYW5zIHRvIGNvbXBsZXRlCityYW5nZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXM6IDEwMDAwCisjIEhvdyBsb25nIHRoZSBjb29yZGluYXRvciBzaG91bGQgd2FpdCBmb3Igd3JpdGVzIHRvIGNvbXBsZXRlCit3cml0ZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXM6IDIwMDAKKyMgSG93IGxvbmcgdGhlIGNvb3JkaW5hdG9yIHNob3VsZCB3YWl0IGZvciBjb3VudGVyIHdyaXRlcyB0byBjb21wbGV0ZQorY291bnRlcl93cml0ZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXM6IDUwMDAKKyMgSG93IGxvbmcgYSBjb29yZGluYXRvciBzaG91bGQgY29udGludWUgdG8gcmV0cnkgYSBDQVMgb3BlcmF0aW9uCisjIHRoYXQgY29udGVuZHMgd2l0aCBvdGhlciBwcm9wb3NhbHMgZm9yIHRoZSBzYW1lIHJvdworY2FzX2NvbnRlbnRpb25fdGltZW91dF9pbl9tczogMTAwMAorIyBIb3cgbG9uZyB0aGUgY29vcmRpbmF0b3Igc2hvdWxkIHdhaXQgZm9yIHRydW5jYXRlcyB0byBjb21wbGV0ZQorIyAoVGhpcyBjYW4gYmUgbXVjaCBsb25nZXIsIGJlY2F1c2UgdW5sZXNzIGF1dG9fc25hcHNob3QgaXMgZGlzYWJsZWQKKyMgd2UgbmVlZCB0byBmbHVzaCBmaXJzdCBzbyB3ZSBjYW4gc25hcHNob3QgYmVmb3JlIHJlbW92aW5nIHRoZSBkYXRhLikKK3RydW5jYXRlX3JlcXVlc3RfdGltZW91dF9pbl9tczogNjAwMDAKKyMgVGhlIGRlZmF1bHQgdGltZW91dCBmb3Igb3RoZXIsIG1pc2NlbGxhbmVvdXMgb3BlcmF0aW9ucworcmVxdWVzdF90aW1lb3V0X2luX21zOiAxMDAwMAorCisjIEVuYWJsZSBvcGVyYXRpb24gdGltZW91dCBpbmZvcm1hdGlvbiBleGNoYW5nZSBiZXR3ZWVuIG5vZGVzIHRvIGFjY3VyYXRlbHkKKyMgbWVhc3VyZSByZXF1ZXN0IHRpbWVvdXRzLiAgSWYgZGlzYWJsZWQsIHJlcGxpY2FzIHdpbGwgYXNzdW1lIHRoYXQgcmVxdWVzdHMKKyMgd2VyZSBmb3J3YXJkZWQgdG8gdGhlbSBpbnN0YW50bHkgYnkgdGhlIGNvb3JkaW5hdG9yLCB3aGljaCBtZWFucyB0aGF0CisjIHVuZGVyIG92ZXJsb2FkIGNvbmRpdGlvbnMgd2Ugd2lsbCB3YXN0ZSB0aGF0IG11Y2ggZXh0cmEgdGltZSBwcm9jZXNzaW5nIAorIyBhbHJlYWR5LXRpbWVkLW91dCByZXF1ZXN0cy4KKyMKKyMgV2FybmluZzogYmVmb3JlIGVuYWJsaW5nIHRoaXMgcHJvcGVydHkgbWFrZSBzdXJlIHRvIG50cCBpcyBpbnN0YWxsZWQKKyMgYW5kIHRoZSB0aW1lcyBhcmUgc3luY2hyb25pemVkIGJldHdlZW4gdGhlIG5vZGVzLgorY3Jvc3Nfbm9kZV90aW1lb3V0OiBmYWxzZQorCisjIEVuYWJsZSBzb2NrZXQgdGltZW91dCBmb3Igc3RyZWFtaW5nIG9wZXJhdGlvbi4KKyMgV2hlbiBhIHRpbWVvdXQgb2NjdXJzIGR1cmluZyBzdHJlYW1pbmcsIHN0cmVhbWluZyBpcyByZXRyaWVkIGZyb20gdGhlIHN0YXJ0CisjIG9mIHRoZSBjdXJyZW50IGZpbGUuIFRoaXMgX2Nhbl8gaW52b2x2ZSByZS1zdHJlYW1pbmcgYW4gaW1wb3J0YW50IGFtb3VudCBvZgorIyBkYXRhLCBzbyB5b3Ugc2hvdWxkIGF2b2lkIHNldHRpbmcgdGhlIHZhbHVlIHRvbyBsb3cuCisjIERlZmF1bHQgdmFsdWUgaXMgMCwgd2hpY2ggbmV2ZXIgdGltZW91dCBzdHJlYW1zLgorIyBzdHJlYW1pbmdfc29ja2V0X3RpbWVvdXRfaW5fbXM6IDAKKworIyBwaGkgdmFsdWUgdGhhdCBtdXN0IGJlIHJlYWNoZWQgZm9yIGEgaG9zdCB0byBiZSBtYXJrZWQgZG93bi4KKyMgbW9zdCB1c2VycyBzaG91bGQgbmV2ZXIgbmVlZCB0byBhZGp1c3QgdGhpcy4KKyMgcGhpX2NvbnZpY3RfdGhyZXNob2xkOiA4CisKKyMgZW5kcG9pbnRfc25pdGNoIC0tIFNldCB0aGlzIHRvIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCisjIElFbmRwb2ludFNuaXRjaC4gIFRoZSBzbml0Y2ggaGFzIHR3byBmdW5jdGlvbnM6CisjIC0gaXQgdGVhY2hlcyBDYXNzYW5kcmEgZW5vdWdoIGFib3V0IHlvdXIgbmV0d29yayB0b3BvbG9neSB0byByb3V0ZQorIyAgIHJlcXVlc3RzIGVmZmljaWVudGx5CisjIC0gaXQgYWxsb3dzIENhc3NhbmRyYSB0byBzcHJlYWQgcmVwbGljYXMgYXJvdW5kIHlvdXIgY2x1c3RlciB0byBhdm9pZAorIyAgIGNvcnJlbGF0ZWQgZmFpbHVyZXMuIEl0IGRvZXMgdGhpcyBieSBncm91cGluZyBtYWNoaW5lcyBpbnRvCisjICAgImRhdGFjZW50ZXJzIiBhbmQgInJhY2tzLiIgIENhc3NhbmRyYSB3aWxsIGRvIGl0cyBiZXN0IG5vdCB0byBoYXZlCisjICAgbW9yZSB0aGFuIG9uZSByZXBsaWNhIG9uIHRoZSBzYW1lICJyYWNrIiAod2hpY2ggbWF5IG5vdCBhY3R1YWxseQorIyAgIGJlIGEgcGh5c2ljYWwgbG9jYXRpb24pCisjCisjIElGIFlPVSBDSEFOR0UgVEhFIFNOSVRDSCBBRlRFUiBEQVRBIElTIElOU0VSVEVEIElOVE8gVEhFIENMVVNURVIsCisjIFlPVSBNVVNUIFJVTiBBIEZVTEwgUkVQQUlSLCBTSU5DRSBUSEUgU05JVENIIEFGRkVDVFMgV0hFUkUgUkVQTElDQVMKKyMgQVJFIFBMQUNFRC4KKyMKKyMgT3V0IG9mIHRoZSBib3gsIENhc3NhbmRyYSBwcm92aWRlcworIyAgLSBTaW1wbGVTbml0Y2g6CisjICAgIFRyZWF0cyBTdHJhdGVneSBvcmRlciBhcyBwcm94aW1pdHkuIFRoaXMgY2FuIGltcHJvdmUgY2FjaGUKKyMgICAgbG9jYWxpdHkgd2hlbiBkaXNhYmxpbmcgcmVhZCByZXBhaXIuICBPbmx5IGFwcHJvcHJpYXRlIGZvcgorIyAgICBzaW5nbGUtZGF0YWNlbnRlciBkZXBsb3ltZW50cy4KKyMgIC0gR29zc2lwaW5nUHJvcGVydHlGaWxlU25pdGNoCisjICAgIFRoaXMgc2hvdWxkIGJlIHlvdXIgZ28tdG8gc25pdGNoIGZvciBwcm9kdWN0aW9uIHVzZS4gIFRoZSByYWNrCisjICAgIGFuZCBkYXRhY2VudGVyIGZvciB0aGUgbG9jYWwgbm9kZSBhcmUgZGVmaW5lZCBpbgorIyAgICBjYXNzYW5kcmEtcmFja2RjLnByb3BlcnRpZXMgYW5kIHByb3BhZ2F0ZWQgdG8gb3RoZXIgbm9kZXMgdmlhCisjICAgIGdvc3NpcC4gIElmIGNhc3NhbmRyYS10b3BvbG9neS5wcm9wZXJ0aWVzIGV4aXN0cywgaXQgaXMgdXNlZCBhcyBhCisjICAgIGZhbGxiYWNrLCBhbGxvd2luZyBtaWdyYXRpb24gZnJvbSB0aGUgUHJvcGVydHlGaWxlU25pdGNoLgorIyAgLSBQcm9wZXJ0eUZpbGVTbml0Y2g6CisjICAgIFByb3hpbWl0eSBpcyBkZXRlcm1pbmVkIGJ5IHJhY2sgYW5kIGRhdGEgY2VudGVyLCB3aGljaCBhcmUKKyMgICAgZXhwbGljaXRseSBjb25maWd1cmVkIGluIGNhc3NhbmRyYS10b3BvbG9neS5wcm9wZXJ0aWVzLgorIyAgLSBFYzJTbml0Y2g6CisjICAgIEFwcHJvcHJpYXRlIGZvciBFQzIgZGVwbG95bWVudHMgaW4gYSBzaW5nbGUgUmVnaW9uLiBMb2FkcyBSZWdpb24KKyMgICAgYW5kIEF2YWlsYWJpbGl0eSBab25lIGluZm9ybWF0aW9uIGZyb20gdGhlIEVDMiBBUEkuIFRoZSBSZWdpb24gaXMKKyMgICAgdHJlYXRlZCBhcyB0aGUgZGF0YWNlbnRlciwgYW5kIHRoZSBBdmFpbGFiaWxpdHkgWm9uZSBhcyB0aGUgcmFjay4KKyMgICAgT25seSBwcml2YXRlIElQcyBhcmUgdXNlZCwgc28gdGhpcyB3aWxsIG5vdCB3b3JrIGFjcm9zcyBtdWx0aXBsZQorIyAgICBSZWdpb25zLgorIyAgLSBFYzJNdWx0aVJlZ2lvblNuaXRjaDoKKyMgICAgVXNlcyBwdWJsaWMgSVBzIGFzIGJyb2FkY2FzdF9hZGRyZXNzIHRvIGFsbG93IGNyb3NzLXJlZ2lvbgorIyAgICBjb25uZWN0aXZpdHkuICAoVGh1cywgeW91IHNob3VsZCBzZXQgc2VlZCBhZGRyZXNzZXMgdG8gdGhlIHB1YmxpYworIyAgICBJUCBhcyB3ZWxsLikgWW91IHdpbGwgbmVlZCB0byBvcGVuIHRoZSBzdG9yYWdlX3BvcnQgb3IKKyMgICAgc3NsX3N0b3JhZ2VfcG9ydCBvbiB0aGUgcHVibGljIElQIGZpcmV3YWxsLiAgKEZvciBpbnRyYS1SZWdpb24KKyMgICAgdHJhZmZpYywgQ2Fzc2FuZHJhIHdpbGwgc3dpdGNoIHRvIHRoZSBwcml2YXRlIElQIGFmdGVyCisjICAgIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24uKQorIyAgLSBSYWNrSW5mZXJyaW5nU25pdGNoOgorIyAgICBQcm94aW1pdHkgaXMgZGV0ZXJtaW5lZCBieSByYWNrIGFuZCBkYXRhIGNlbnRlciwgd2hpY2ggYXJlCisjICAgIGFzc3VtZWQgdG8gY29ycmVzcG9uZCB0byB0aGUgM3JkIGFuZCAybmQgb2N0ZXQgb2YgZWFjaCBub2RlJ3MgSVAKKyMgICAgYWRkcmVzcywgcmVzcGVjdGl2ZWx5LiAgVW5sZXNzIHRoaXMgaGFwcGVucyB0byBtYXRjaCB5b3VyCisjICAgIGRlcGxveW1lbnQgY29udmVudGlvbnMsIHRoaXMgaXMgYmVzdCB1c2VkIGFzIGFuIGV4YW1wbGUgb2YKKyMgICAgd3JpdGluZyBhIGN1c3RvbSBTbml0Y2ggY2xhc3MgYW5kIGlzIHByb3ZpZGVkIGluIHRoYXQgc3Bpcml0LgorIworIyBZb3UgY2FuIHVzZSBhIGN1c3RvbSBTbml0Y2ggYnkgc2V0dGluZyB0aGlzIHRvIHRoZSBmdWxsIGNsYXNzIG5hbWUKKyMgb2YgdGhlIHNuaXRjaCwgd2hpY2ggd2lsbCBiZSBhc3N1bWVkIHRvIGJlIG9uIHlvdXIgY2xhc3NwYXRoLgorZW5kcG9pbnRfc25pdGNoOiBTaW1wbGVTbml0Y2gKKworIyBjb250cm9scyBob3cgb2Z0ZW4gdG8gcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgcGFydCBvZiBob3N0IHNjb3JlCisjIGNhbGN1bGF0aW9uCitkeW5hbWljX3NuaXRjaF91cGRhdGVfaW50ZXJ2YWxfaW5fbXM6IDEwMCAKKyMgY29udHJvbHMgaG93IG9mdGVuIHRvIHJlc2V0IGFsbCBob3N0IHNjb3JlcywgYWxsb3dpbmcgYSBiYWQgaG9zdCB0bworIyBwb3NzaWJseSByZWNvdmVyCitkeW5hbWljX3NuaXRjaF9yZXNldF9pbnRlcnZhbF9pbl9tczogNjAwMDAwCisjIGlmIHNldCBncmVhdGVyIHRoYW4gemVybyBhbmQgcmVhZF9yZXBhaXJfY2hhbmNlIGlzIDwgMS4wLCB0aGlzIHdpbGwgYWxsb3cKKyMgJ3Bpbm5pbmcnIG9mIHJlcGxpY2FzIHRvIGhvc3RzIGluIG9yZGVyIHRvIGluY3JlYXNlIGNhY2hlIGNhcGFjaXR5LgorIyBUaGUgYmFkbmVzcyB0aHJlc2hvbGQgd2lsbCBjb250cm9sIGhvdyBtdWNoIHdvcnNlIHRoZSBwaW5uZWQgaG9zdCBoYXMgdG8gYmUKKyMgYmVmb3JlIHRoZSBkeW5hbWljIHNuaXRjaCB3aWxsIHByZWZlciBvdGhlciByZXBsaWNhcyBvdmVyIGl0LiAgVGhpcyBpcworIyBleHByZXNzZWQgYXMgYSBkb3VibGUgd2hpY2ggcmVwcmVzZW50cyBhIHBlcmNlbnRhZ2UuICBUaHVzLCBhIHZhbHVlIG9mCisjIDAuMiBtZWFucyBDYXNzYW5kcmEgd291bGQgY29udGludWUgdG8gcHJlZmVyIHRoZSBzdGF0aWMgc25pdGNoIHZhbHVlcworIyB1bnRpbCB0aGUgcGlubmVkIGhvc3Qgd2FzIDIwJSB3b3JzZSB0aGFuIHRoZSBmYXN0ZXN0LgorZHluYW1pY19zbml0Y2hfYmFkbmVzc190aHJlc2hvbGQ6IDAuMQorCisjIHJlcXVlc3Rfc2NoZWR1bGVyIC0tIFNldCB0aGlzIHRvIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCisjIFJlcXVlc3RTY2hlZHVsZXIsIHdoaWNoIHdpbGwgc2NoZWR1bGUgaW5jb21pbmcgY2xpZW50IHJlcXVlc3RzCisjIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWMgcG9saWN5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktdGVuYW5jeQorIyB3aXRoIGEgc2luZ2xlIENhc3NhbmRyYSBjbHVzdGVyLgorIyBOT1RFOiBUaGlzIGlzIHNwZWNpZmljYWxseSBmb3IgcmVxdWVzdHMgZnJvbSB0aGUgY2xpZW50IGFuZCBkb2VzCisjIG5vdCBhZmZlY3QgaW50ZXIgbm9kZSBjb21tdW5pY2F0aW9uLgorIyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlZHVsZXIuTm9TY2hlZHVsZXIgLSBObyBzY2hlZHVsaW5nIHRha2VzIHBsYWNlCisjIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVkdWxlci5Sb3VuZFJvYmluU2NoZWR1bGVyIC0gUm91bmQgcm9iaW4gb2YKKyMgY2xpZW50IHJlcXVlc3RzIHRvIGEgbm9kZSB3aXRoIGEgc2VwYXJhdGUgcXVldWUgZm9yIGVhY2gKKyMgcmVxdWVzdF9zY2hlZHVsZXJfaWQuIFRoZSBzY2hlZHVsZXIgaXMgZnVydGhlciBjdXN0b21pemVkIGJ5CisjIHJlcXVlc3Rfc2NoZWR1bGVyX29wdGlvbnMgYXMgZGVzY3JpYmVkIGJlbG93LgorcmVxdWVzdF9zY2hlZHVsZXI6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVkdWxlci5Ob1NjaGVkdWxlcgorCisjIFNjaGVkdWxlciBPcHRpb25zIHZhcnkgYmFzZWQgb24gdGhlIHR5cGUgb2Ygc2NoZWR1bGVyCisjIE5vU2NoZWR1bGVyIC0gSGFzIG5vIG9wdGlvbnMKKyMgUm91bmRSb2JpbgorIyAgLSB0aHJvdHRsZV9saW1pdCAtLSBUaGUgdGhyb3R0bGVfbGltaXQgaXMgdGhlIG51bWJlciBvZiBpbi1mbGlnaHQKKyMgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgcGVyIGNsaWVudC4gIFJlcXVlc3RzIGJleW9uZCAKKyMgICAgICAgICAgICAgICAgICAgICAgdGhhdCBsaW1pdCBhcmUgcXVldWVkIHVwIHVudGlsCisjICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgcmVxdWVzdHMgY2FuIGNvbXBsZXRlLgorIyAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgODAgaGVyZSBpcyB0d2ljZSB0aGUgbnVtYmVyIG9mCisjICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbnRfcmVhZHMgKyBjb25jdXJyZW50X3dyaXRlcy4KKyMgIC0gZGVmYXVsdF93ZWlnaHQgLS0gZGVmYXVsdF93ZWlnaHQgaXMgb3B0aW9uYWwgYW5kIGFsbG93cyBmb3IKKyMgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCB3aGljaCBpcyAxLgorIyAgLSB3ZWlnaHRzIC0tIFdlaWdodHMgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gMSBvciB0aGUKKyMgICAgICAgICAgICAgICBvdmVycmlkZGVuIGRlZmF1bHRfd2VpZ2h0LiBUaGUgd2VpZ2h0IHRyYW5zbGF0ZXMgaW50byBob3cKKyMgICAgICAgICAgICAgICBtYW55IHJlcXVlc3RzIGFyZSBoYW5kbGVkIGR1cmluZyBlYWNoIHR1cm4gb2YgdGhlCisjICAgICAgICAgICAgICAgUm91bmRSb2JpbiwgYmFzZWQgb24gdGhlIHNjaGVkdWxlciBpZC4KKyMKKyMgcmVxdWVzdF9zY2hlZHVsZXJfb3B0aW9uczoKKyMgICAgdGhyb3R0bGVfbGltaXQ6IDgwCisjICAgIGRlZmF1bHRfd2VpZ2h0OiA1CisjICAgIHdlaWdodHM6CisjICAgICAgS2V5c3BhY2UxOiAxCisjICAgICAgS2V5c3BhY2UyOiA1CisKKyMgcmVxdWVzdF9zY2hlZHVsZXJfaWQgLS0gQW4gaWRlbnRpZmllciBiYXNlZCBvbiB3aGljaCB0byBwZXJmb3JtCisjIHRoZSByZXF1ZXN0IHNjaGVkdWxpbmcuIEN1cnJlbnRseSB0aGUgb25seSB2YWxpZCBvcHRpb24gaXMga2V5c3BhY2UuCisjIHJlcXVlc3Rfc2NoZWR1bGVyX2lkOiBrZXlzcGFjZQorCisjIEVuYWJsZSBvciBkaXNhYmxlIGludGVyLW5vZGUgZW5jcnlwdGlvbgorIyBEZWZhdWx0IHNldHRpbmdzIGFyZSBUTFMgdjEsIFJTQSAxMDI0LWJpdCBrZXlzIChpdCBpcyBpbXBlcmF0aXZlIHRoYXQKKyMgdXNlcnMgZ2VuZXJhdGUgdGhlaXIgb3duIGtleXMpIFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgYXMgdGhlIGNpcGhlcgorIyBzdWl0ZSBmb3IgYXV0aGVudGljYXRpb24sIGtleSBleGNoYW5nZSBhbmQgZW5jcnlwdGlvbiBvZiB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXJzLgorIyBVc2UgdGhlIERIRS9FQ0RIRSBjaXBoZXJzIGlmIHJ1bm5pbmcgaW4gRklQUyAxNDAgY29tcGxpYW50IG1vZGUuCisjIE5PVEU6IE5vIGN1c3RvbSBlbmNyeXB0aW9uIG9wdGlvbnMgYXJlIGVuYWJsZWQgYXQgdGhlIG1vbWVudAorIyBUaGUgYXZhaWxhYmxlIGludGVybm9kZSBvcHRpb25zIGFyZSA6IGFsbCwgbm9uZSwgZGMsIHJhY2sKKyMKKyMgSWYgc2V0IHRvIGRjIGNhc3NhbmRyYSB3aWxsIGVuY3J5cHQgdGhlIHRyYWZmaWMgYmV0d2VlbiB0aGUgRENzCisjIElmIHNldCB0byByYWNrIGNhc3NhbmRyYSB3aWxsIGVuY3J5cHQgdGhlIHRyYWZmaWMgYmV0d2VlbiB0aGUgcmFja3MKKyMKKyMgVGhlIHBhc3N3b3JkcyB1c2VkIGluIHRoZXNlIG9wdGlvbnMgbXVzdCBtYXRjaCB0aGUgcGFzc3dvcmRzIHVzZWQgd2hlbiBnZW5lcmF0aW5nCisjIHRoZSBrZXlzdG9yZSBhbmQgdHJ1c3RzdG9yZS4gIEZvciBpbnN0cnVjdGlvbnMgb24gZ2VuZXJhdGluZyB0aGVzZSBmaWxlcywgc2VlOgorIyBodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvNi9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvc2VjdXJpdHkvanNzZS9KU1NFUmVmR3VpZGUuaHRtbCNDcmVhdGVLZXlzdG9yZQorIworc2VydmVyX2VuY3J5cHRpb25fb3B0aW9uczoKKyAgICBpbnRlcm5vZGVfZW5jcnlwdGlvbjogbm9uZQorICAgIGtleXN0b3JlOiBjb25mLy5rZXlzdG9yZQorICAgIGtleXN0b3JlX3Bhc3N3b3JkOiBjYXNzYW5kcmEKKyAgICB0cnVzdHN0b3JlOiBjb25mLy50cnVzdHN0b3JlCisgICAgdHJ1c3RzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCisgICAgIyBNb3JlIGFkdmFuY2VkIGRlZmF1bHRzIGJlbG93OgorICAgICMgcHJvdG9jb2w6IFRMUworICAgICMgYWxnb3JpdGhtOiBTdW5YNTA5CisgICAgIyBzdG9yZV90eXBlOiBKS1MKKyAgICAjIGNpcGhlcl9zdWl0ZXM6IFtUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLFRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSxUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBXQorICAgICMgcmVxdWlyZV9jbGllbnRfYXV0aDogZmFsc2UKKworIyBlbmFibGUgb3IgZGlzYWJsZSBjbGllbnQvc2VydmVyIGVuY3J5cHRpb24uCitjbGllbnRfZW5jcnlwdGlvbl9vcHRpb25zOgorICAgIGVuYWJsZWQ6IGZhbHNlCisgICAga2V5c3RvcmU6IGNvbmYvLmtleXN0b3JlCisgICAga2V5c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQorICAgICMgcmVxdWlyZV9jbGllbnRfYXV0aDogZmFsc2UKKyAgICAjIFNldCB0cnVzdG9yZSBhbmQgdHJ1c3RzdG9yZV9wYXNzd29yZCBpZiByZXF1aXJlX2NsaWVudF9hdXRoIGlzIHRydWUKKyAgICAjIHRydXN0c3RvcmU6IGNvbmYvLnRydXN0c3RvcmUKKyAgICAjIHRydXN0c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQorICAgICMgTW9yZSBhZHZhbmNlZCBkZWZhdWx0cyBiZWxvdzoKKyAgICAjIHByb3RvY29sOiBUTFMKKyAgICAjIGFsZ29yaXRobTogU3VuWDUwOQorICAgICMgc3RvcmVfdHlwZTogSktTCisgICAgIyBjaXBoZXJfc3VpdGVzOiBbVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSxUTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLFRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQV0KKworIyBpbnRlcm5vZGVfY29tcHJlc3Npb24gY29udHJvbHMgd2hldGhlciB0cmFmZmljIGJldHdlZW4gbm9kZXMgaXMKKyMgY29tcHJlc3NlZC4KKyMgY2FuIGJlOiAgYWxsICAtIGFsbCB0cmFmZmljIGlzIGNvbXByZXNzZWQKKyMgICAgICAgICAgZGMgICAtIHRyYWZmaWMgYmV0d2VlbiBkaWZmZXJlbnQgZGF0YWNlbnRlcnMgaXMgY29tcHJlc3NlZAorIyAgICAgICAgICBub25lIC0gbm90aGluZyBpcyBjb21wcmVzc2VkLgoraW50ZXJub2RlX2NvbXByZXNzaW9uOiBhbGwKKworIyBFbmFibGUgb3IgZGlzYWJsZSB0Y3Bfbm9kZWxheSBmb3IgaW50ZXItZGMgY29tbXVuaWNhdGlvbi4KKyMgRGlzYWJsaW5nIGl0IHdpbGwgcmVzdWx0IGluIGxhcmdlciAoYnV0IGZld2VyKSBuZXR3b3JrIHBhY2tldHMgYmVpbmcgc2VudCwKKyMgcmVkdWNpbmcgb3ZlcmhlYWQgZnJvbSB0aGUgVENQIHByb3RvY29sIGl0c2VsZiwgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZworIyBsYXRlbmN5IGlmIHlvdSBibG9jayBmb3IgY3Jvc3MtZGF0YWNlbnRlciByZXNwb25zZXMuCitpbnRlcl9kY190Y3Bfbm9kZWxheTogZmFsc2UKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1kYW8vY29uZmlndXJhdGlvbi55YW1sIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWRhby9jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0M2UzYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1kYW8vY29uZmlndXJhdGlvbi55YW1sCkBAIC0wLDAgKzEsMTIwIEBACitpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkczoKKyAgIC0gSFRUUF9JVl9VU0VSCisgICAtIEhUVFBfQ1NQX0ZJUlNUTkFNRQorICAgLSBIVFRQX0NTUF9MQVNUTkFNRQorICAgLSBIVFRQX0lWX1JFTU9URV9BRERSRVNTCisgICAtIEhUVFBfQ1NQX1dTVFlQRQorCisKKyMgY2F0YWxvZyBiYWNrZW5kIGhvc3RuYW1lCitiZUZxZG46IDE3Mi4yMC40My4xMjQ6ODA4MAorCisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgcG9ydAorYmVIdHRwUG9ydDogODA4MAorCisjIGNhdGFsb2cgYmFja2VuZCBodHRwIGNvbnRleHQKK2JlQ29udGV4dDogL3NkYy9yZXN0L2NvbmZpZy9nZXQKKworIyBjYXRhbG9nIGJhY2tlbmQgcHJvdG9jb2wKK2JlUHJvdG9jb2w6IGh0dHAKKworIyBjYXRhbG9nIGJhY2tlbmQgc3NsIHBvcnQKK2JlU3NsUG9ydDogODQ0MworCit2ZXJzaW9uOiAxLjAKK3JlbGVhc2VkOiAyMDEyLTExLTMwCisKK3RpdGFuQ2ZnRmlsZTogc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy90aXRhbi5wcm9wZXJ0aWVzCit0aXRhbkluTWVtb3J5R3JhcGg6IHRydWUKK3RpdGFuTG9ja1RpbWVvdXQ6IDMwCisKKyMgUHJvdG9jb2xzCitwcm90b2NvbHM6CisgICAtIGh0dHAKKyAgIC0gaHR0cHMKKworIyBVc2VycwordXNlcnM6CisgICAgdG9tOiBwYXNzd2QKKyAgICBib2I6IHBhc3N3ZAorI05lb2o0CituZW80ajoKKyAgICBob3N0OiBuZW80amhvc3QKKyAgICBwb3J0OiA3NDc0CisgICAgdXNlcjogbmVvNGoKKyAgICBwYXNzd29yZDogIjEyMzQ1IgorICAgIG1heEh0dHBDb25uZWN0aW9uOiAxMDAKKyAgICBtYXhIdHRwUGVyUm91dGU6IDIwCisKK2Nhc3NhbmRyYUNvbmZpZzoKKyAgICBjYXNzYW5kcmFIb3N0czogWydtdGFuanY5c2RjZzQ0J10KKyAgICBsb2NhbERhdGFDZW50ZXI6CisgICAgcmVjb25uZWN0VGltZW91dCA6IDMwMDAwCisgICAgYXV0aGVudGljYXRlOiBmYWxzZQorICAgIHVzZXJuYW1lOiBrb2tvCisgICAgcGFzc3dvcmQ6IGJvYm8KKyAgICBzc2w6IGZhbHNlCisgICAgdHJ1c3RzdG9yZVBhdGggOiAvcGF0aC9wYXRoCisgICAgdHJ1c3RzdG9yZVBhc3N3b3JkIDogMTIzMTIzCisgICAga2V5U3BhY2VzOgorICAgICAgICAtIHsgbmFtZTogc2RjYXVkaXQsIHJlcGxpY2F0aW9uU3RyYXRlZ3k6IFNpbXBsZVN0cmF0ZWd5LCByZXBsaWNhdGlvbkluZm86IFsnMSddfQorICAgICAgICAtIHsgbmFtZTogc2RjYXJ0aWZhY3QsIHJlcGxpY2F0aW9uU3RyYXRlZ3k6IFNpbXBsZVN0cmF0ZWd5LCByZXBsaWNhdGlvbkluZm86IFsnMSddfQorCisjQXBwbGljYXRpb24tc3BlY2lmaWMgc2V0dGluZ3Mgb2YgRVMKK2VsYXN0aWNTZWFyY2g6CisgICAgIyBNYXBwaW5nIG9mIGluZGV4IHByZWZpeCB0byB0aW1lLWJhc2VkIGZyYW1lLiBGb3IgZXhhbXBsZSwgaWYgYmVsb3cgaXMgY29uZmlndXJlZDoKKyAgICAjCisgICAgIyAtIGluZGV4UHJlZml4OiBhdWRpdGluZ2V2ZW50cworICAgICMgICAgY3JlYXRpb25QZXJpb2Q6IG1pbnV0ZQorICAgICMKKyAgICAjIHRoZW4gRVMgb2JqZWN0IG9mIHR5cGUgd2hpY2ggaXMgbWFwcGVkIHRvICJhdWRpdGluZ2V2ZW50cy0qIiB0ZW1wbGF0ZSwgYW5kIGNyZWF0ZWQgb24gMjAxNS0xMi0yMyAxMzoyNDo1NCwgd2lsbCBlbnRlciAiYXVkaXRpbmdldmVudHMtMjAxNS0xMi0yMy0xMy0yNCIgaW5kZXguCisgICAgIyBBbm90aGVyIG9iamVjdCBjcmVhdGVkIG9uIDIwMTUtMTItMjMgMTM6MjU6NTQsIHdpbGwgZW50ZXIgImF1ZGl0aW5nZXZlbnRzLTIwMTUtMTItMjMtMTMtMjUiIGluZGV4LgorICAgICMgSWYgY3JlYXRpb25QZXJpb2Q6IG1vbnRoLCBib3RoIG9mIHRoZSBhYm92ZSB3aWxsIGVudGVyICJhdWRpdGluZ2V2ZW50cy0yMDE1LTEyIiBpbmRleC4KKyAgICAjCisgICAgIyBMZWdhbCB2YWx1ZXMgZm9yIGNyZWF0aW9uUGVyaW9kIC0geWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBub25lIChtZWFuaW5nIG5vIHRpbWUtYmFzZWQgYmVoYXZpb3VyKS4KKyAgICAjCisgICAgIyBJZiBubyBjcmVhdGlvblBlcmlvZCBpcyBjb25maWd1cmVkIGZvciBpbmRleFByZWZpeCwgZGVmYXVsdCBiZWhhdm91ciBpcyBjcmVhdGlvblBlcmlvZDogbW9udGguCisgCisgICAgaW5kaWNlc1RpbWVGcmVxdWVuY3k6CisgICAgICAtIGluZGV4UHJlZml4OiBhdWRpdGluZ2V2ZW50cworICAgICAgICBjcmVhdGlvblBlcmlvZDogbW9udGgKKworc3dpdGNob3ZlckRldGVjdG9yOgorICAgIGdCZUZxZG46IEFJTy1CRS5lY29tcC5pZG5zLmNpcAorICAgIGdGZUZxZG46IEFJTy1GRS5lY29tcC5pZG5zLmNpcAorICAgIGJlVmlwOiAxLjIuMy40CisgICAgZmVWaXA6IDEuMi4zLjQKKyAgICBiZVJlc29sdmVBdHRlbXB0czogMworICAgIGZlUmVzb2x2ZUF0dGVtcHRzOiAzCisgICAgZW5hYmxlZDogZmFsc2UKKyAgICBpbnRlcnZhbDogNjAKKyAgICBjaGFuZ2VQcmlvcml0eVVzZXI6IGVjb21wYXNkYworICAgIGNoYW5nZVByaW9yaXR5UGFzc3dvcmQ6IGVjb21wYXNkYzEyMworICAgIHB1Ymxpc2hOZXR3b3JrVXJsOiAiaHR0cDovL2NvcmEud2ViL2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvdXBkYXRlX25ldHdvcms/dXNlcj1yb290IgorICAgIHB1Ymxpc2hOZXR3b3JrQm9keTogJ3sibm90ZSI6InB1Ymxpc2ggbmV0d29yayJ9JworICAgIGdyb3VwczoKKyAgICAgIGJlU2V0OiB7IGNoYW5nZVByaW9yaXR5VXJsOiAiaHR0cDovL2NvcmEud2ViL2NydC9DaXBEb21haW4uRUNPTVAtQVNEQy1ERVZTVC9jb25maWcvc2l0ZXMvQUlPLUJFLmVjb21wLmlkbnMuY2lwP3VzZXI9cm9vdCIsCisgICAgICAgICAgICAgICBjaGFuZ2VQcmlvcml0eUJvZHk6ICd7Im5hbWUiOiJBSU8tQkUuZWNvbXAuaWRucy5jaXAiLCJ1cmkiOiIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tQkUuZWNvbXAuaWRucy5jaXAiLCJub19hZF9yZWRpcmVjdGlvbiI6ZmFsc2UsInY0Z3JvdXBzIjp7ImZhaWxvdmVyX2dyb3VwcyI6WyIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfbWdfYmUiLCIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9ncm91cHMvZ3JvdXBfYnNfYmUiXSwiZmFpbG92ZXJfcG9saWN5IjpbIkZBSUxBTEwiXX0sImNvbW1lbnQiOiJBSU8gQkUgRy1mcWRuIiwiaW50ZW5kZWRfYXBwX3Byb3RvIjoiRE5TIn0nfQorICAgICAgZmVTZXQ6IHsgY2hhbmdlUHJpb3JpdHlVcmw6ICJodHRwOi8vY29yYS53ZWIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tRkUuZWNvbXAuaWRucy5jaXA/dXNlcj1yb290IiwKKyAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5Qm9keTogJ3siY29tbWVudCI6IkFJTyBHLWZxZG4iLCJuYW1lIjoiQUlPLUZFLmVjb21wLmlkbnMuY2lwIiwidjRncm91cHMiOnsiZmFpbG92ZXJfZ3JvdXBzIjpbIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9tZ19mZSIsIi9jcnQvQ2lwRG9tYWluLkVDT01QLUFTREMtREVWU1QvY29uZmlnL2dyb3Vwcy9ncm91cF9ic19mZSJdLCJmYWlsb3Zlcl9wb2xpY3kiOlsiRkFJTEFMTCJdfSwibm9fYWRfcmVkaXJlY3Rpb24iOmZhbHNlLCJpbnRlbmRlZF9hcHBfcHJvdG8iOiJETlMiLCJ1cmkiOiIvY3J0L0NpcERvbWFpbi5FQ09NUC1BU0RDLURFVlNUL2NvbmZpZy9zaXRlcy9BSU8tRkUuZWNvbXAuaWRucy5jaXAifSd9CisKK2FwcGxpY2F0aW9uTDFDYWNoZToKKyAgICBkYXRhdHlwZXM6CisgICAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICAgICAgZmlyc3RSdW5EZWxheTogMTAKKyAgICAgICAgcG9sbEludGVydmFsSW5TZWM6IDYwCisKK2FwcGxpY2F0aW9uTDJDYWNoZToKKyAgICBlbmFibGVkOiB0cnVlCisgICAgY2F0YWxvZ0wxQ2FjaGU6CisgICAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICAgICAgcmVzb3VyY2VzU2l6ZUluQ2FjaGU6IDMwMAorICAgICAgICBzZXJ2aWNlc1NpemVJbkNhY2hlOiAyMDAKKyAgICAgICAgcHJvZHVjdHNTaXplSW5DYWNoZTogMTAwCisgICAgcXVldWU6CisgICAgICAgIHN5bmNJbnRlcnZhbEluU2Vjb25kZXM6IDYwCisgICAgICAgIHdhaXRPblNodXREb3duSW5NaW51dGVzOiAzMAorICAgICAgICBudW1iZXJPZkNhY2hlV29ya2VyczogNAordG9zY2FWYWxpZGF0b3JzOgorICAgIHN0cmluZ01heExlbmd0aDogMTAyNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1kYW8vZWNvbXAtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWRhby9lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3Y2Q3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1kYW8vZWNvbXAtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sCkBAIC0wLDAgKzEsMzgzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5vdGUgdGhlIGNvbnZlbnRpb25zIG9mIHRoZSBmaWVsZCB2YWx1ZXM6CisjIHR5cGUgY2FuIGJlIG9uZSBvZjogQ09ORklHX0VSUk9SLCBTWVNURU1fRVJST1IsIERBVEFfRVJST1IsIENPTk5FQ1RJT05fUFJPQkxFTSwgQVVUSEVOVElDQVRJT05fUFJPQkxFTQorIyBzZXZlcml0eSBjYW4gYmUgb25lIG9mOiBXQVJOLCBFUlJPUiwgRkFUQUwKKyMgYWxhcm1TZXZlcml0eSBjYW4gYmUgb25lIG9mOiBDUklUSUNBTCxNQUpPUixNSU5PUixJTkZPUk1BVElPTkFMLE5PTkUKKyMgY29kZSBpcyBhIHVuaXF1ZSBpbnRlZ2VyIGluIHJhbmdlIG9mIDMwMDMtOTk5OSAoMzAwMC0zMDAyIGFyZSBvY2N1cGllZCBmb3IgaW50ZXJuYWwgdXNhZ2UpCisjIFRoZSBhYm92ZSBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlIG91dC1vZi10aGUtYm94IGFuZCBjYW4gYmUgY2hhbmdlZCBpbiBjb2RlLiAKKyMgSW4gY2FzZSBvZiBjb25maWcgYW5kIGNvZGUgbWlzbWF0Y2gsIHRoZSBhcHByb3ByaWF0ZSBlcnJvciB3aWxsIGJlIHByaW50ZWQgdG8gbG9nCisjCisjIyBSYW5nZSBvZiBCRSBjb2RlcyAtIDMwMTAtNzk5OQorCitlcnJvcnM6CisKKyAgICBCZVJlc3RBcGlHZW5lcmFsRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBCRSBSRVNUIEFQSSBleGVjdXRpb24iLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKworICAgIEJlSGVhbHRoQ2hlY2tFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxMCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIGR1cmluZyBCRSBIZWFsdGggQ2hlY2siLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUluaXRpYWxpemF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDYXRhbG9nLUJFIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKworICAgIEJlUmVzb3VyY2VNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJNYW5kYXRvcnkgcmVzb3VyY2UgJXMgY2Fubm90IGJlIGZvdW5kIGluIHJlcG9zaXRvcnkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVNlcnZpY2VNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJNYW5kYXRvcnkgc2VydmljZSAlcyBjYW5ub3QgYmUgZm91bmQgaW4gcmVwb3NpdG9yeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkQWRkaW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDEzLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGFkZCByZXNvdXJjZSBpbnN0YW5jZSBvZiByZXNvdXJjZSAlcyB0byBzZXJ2aWNlICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVJbmNvcnJlY3RTZXJ2aWNlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTQsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJTZXJ2aWNlICVzIGlzIG5vdCB2YWxpZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgICAKKyAgICBCZVJlcG9zaXRvcnlEZWxldGVFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxNSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBkZWxldGUgb2JqZWN0ICVzIGZyb20gcmVwb3NpdG9yeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlUmVwb3NpdG9yeVF1ZXJ5RXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTYsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZmV0Y2ggZnJvbSByZXBvc2l0b3J5ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTkZJR19FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDE3LAorICAgICAgICBzZXZlcml0eTogRkFUQUwsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJXMgaXMgaW52YWxpZC4gVmFsdWUgY29uZmlndXJlZCBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgCisgICAgQmVVZWJDb25uZWN0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09OTkVDVElPTl9QUk9CTEVNLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25uZWN0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gUmVhc29uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVWViU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBvY2N1cmVkIGR1cmluZyBhY2Nlc3MgdG8gVS1FQiBTZXJ2ZXIuIE9wZXJhdGlvbjogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVlYk9iamVjdE5vdEZvdW5kRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDA1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igb2NjdXJlZCBkdXJpbmcgYWNjZXNzIHRvIFUtRUIgU2VydmVyLiBEYXRhIG5vdCBmb3VuZDogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKworICAgIEJlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMjEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBvY2N1cmVkIGluIERpc3RyaWJ1dGlvbiBFbmdpbmUuIEZhaWxlZCBvcGVyYXRpb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVZWJBdXRoZW50aWNhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IEFVVEhFTlRJQ0FUSU9OX1BST0JMRU0sCisgICAgICAgIGNvZGU6IEFTRENfNDAwMywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkF1dGhlbnRpY2F0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gUmVhc29uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVWViVW5rb3duSG9zdEVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTk5FQ1RJT05fUFJPQkxFTSwKKyAgICAgICAgY29kZTogQVNEQ180MDAyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29ubmVjdGlvbiBwcm9ibGVtIHRvd2FyZHMgVS1FQiBzZXJ2ZXIuIENhbm5vdCByZWFjaCBob3N0ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVEaXN0cmlidXRpb25FbmdpbmVJbnZhbGlkQXJ0aWZhY3RUeXBlOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwNiwKKyAgICAgICAgc2V2ZXJpdHk6IFdBUk4sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhlIGFydGlmYWN0IHR5cGUgJXMgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBsaXN0IG9mIHZhbGlkIGFydGlmYWN0cyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlSW52YWxpZFR5cGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDgsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSB0eXBlICVzIG9mICVzIGlzIGludmFsaWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUludmFsaWRWYWx1ZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAyOCwKKyAgICAgICAgc2V2ZXJpdHk6IFdBUk4sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhlIHZhbHVlICVzIG9mICVzIGZyb20gdHlwZSAlcyBpcyBpbnZhbGlkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9IAorICAgIAorICAgIEJlRmFpbGVkRGVsZXRpbmdSZXNvdXJjZUluc3RhbmNlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMjksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZGVsZXRlIHJlc291cmNlIGluc3RhbmNlICVzIGZyb20gc2VydmljZSAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBDT05GSUdfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAzMCwKKyAgICAgICAgc2V2ZXJpdHk6IEZBVEFMLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICVzIGlzIG1pc3NpbmciLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUNvbmZpZ3VyYXRpb25JbnZhbGlkTGlzdFNpemVFcnJvcjogeworICAgICAgICB0eXBlOiBDT05GSUdfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAzMSwKKyAgICAgICAgc2V2ZXJpdHk6IEZBVEFMLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICVzIGlzIGludmFsaWQuIEF0IGxlYXN0ICVzIHZhbHVlcyBzaGFsbCBiZSBjb25maWd1cmVkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgRXJyb3JDb25maWdGaWxlRm9ybWF0OiB7CisgICAgICAgIHR5cGU6IENPTkZJR19FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDMyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3IgZWxlbWVudCBub3QgZm91bmQgaW4gWUFNTCBuYW1lOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlTWlzc2luZ0FydGlmYWN0SW5mb3JtYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJBcnRpZmFjdCB1cGxvYWRlZCBoYXMgbWlzc2luZyBpbmZvcm1hdGlvbi4gTWlzc2luZyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlQXJ0aWZhY3RNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDExLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQXJ0aWZhY3QgJXMgcmVxdWVzdGVkIGlzIG5vdCBmb3VuZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlQXJ0aWZhY3RQYXlsb2FkSW52YWxpZDogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJQYXlsb2FkIG9mIGFydGlmYWN0IHVwbG9hZGVkIGlzIGludmFsaWQgKGludmFsaWQgTUQ1IG9yIGVuY3J5cHRpb24pIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVc2VyTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIlVzZXIgJXMgcmVxdWVzdGVkIGlzIG5vdCBmb3VuZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlQXJ0aWZhY3RJbmZvcm1hdGlvbkludmFsaWRFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTMsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJJbnB1dCBmb3IgYXJ0aWZhY3QgbWV0YWRhdGEgaXMgaW52YWxpZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlRmFpbGVkQWRkaW5nQ2FwYWJpbGl0eVR5cGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTUsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgYWRkaW5nIGNhcGFiaWxpdHkgdHlwZSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlQ2FwYWJpbGl0eVR5cGVNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE2LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ2FwYWJpbGl0eSBUeXBlICVzIG5vdCBmb3VuZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlSW50ZXJmYWNlTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAyMCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkludGVyZmFjZSAlcyByZXF1aXJlZCBpcyBtaXNzaW5nIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVEYW9TeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIk9wZXJhdGlvbiB0b3dhcmRzIGRhdGFiYXNlIGZhaWxlZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTcsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBvcGVyYXRpb24iLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZExvY2tPYmplY3RFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwNywKKyAgICAgICAgc2V2ZXJpdHk6IFdBUk4sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGxvY2sgb2JqZWN0IGZvciB1cGRhdGUiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUludmFsaWRKc29uSW5wdXQ6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTgsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gY29udmVydCBqc29uIGlucHV0IHRvIG9iamVjdCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRGlzdHJpYnV0aW9uTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAyMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkRpc3RyaWJ1dGlvbiAlcyByZXF1aXJlZCBpcyBtaXNzaW5nIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVIZWFsdGhDaGVja1JlY292ZXJ5OiB7CisgICAgICAgIHR5cGU6IFJFQ09WRVJZLAorICAgICAgICBjb2RlOiBBU0RDXzQwMjIsCisgICAgICAgIHNldmVyaXR5OiBJTkZPLAorICAgICAgICBkZXNjcmlwdGlvbjogIkJFIEhlYWx0aCBDaGVjayBSZWNvdmVyeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IElORk9STUFUSU9OQUwKKyAgICB9CisgICAgQmVGYWlsZWRDcmVhdGVOb2RlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDAwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGNyZWF0ZSBub2RlICVzIG9uIGdyYXBoLiBzdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUZhaWxlZFVwZGF0ZU5vZGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gdXBkYXRlIG5vZGUgJXMgb24gZ3JhcGguIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkRGVsZXRlTm9kZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBkZWxldGUgbm9kZSAlcyBvbiBncmFwaC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDMsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gcmV0cmlldmUgbm9kZSAlcyBmcm9tIGdyYXBoLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUV4ZWN1dGVSb2xsYmFja0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRGaW5kUGFyZW50RXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGZpbmQgcGFyZW50IG5vZGUgJXMgb24gZ3JhcGguIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkRmluZEFsbE5vZGVzRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA2LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGZldGNoIGFsbCBub2RlcyB3aXRoIHR5cGUgJXMgb2YgcGFyZW50IG5vZGUgJXMgLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZEZpbmRBc3NvY2lhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwNywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNhbm5vdCBmaW5kIG5vZGUgd2l0aCB0eXBlICVzIGFzc29jaWF0ZWQgd2l0aCBub2RlICVzIC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRGaW5kQXNzb2NpYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDgsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDYW5ub3QgZmluZCBub2RlIHdpdGggdHlwZSAlcyBhc3NvY2lhdGVkIHdpdGggbm9kZSAlcyAuIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlQ29tcG9uZW50Q2xlYW5lclN5c3RlbUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA5LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igb2NjdXJlZCBpbiBDb21wb25lbnQgQ2xlYW5lciBUYXNrLiBGYWlsZWQgb3BlcmF0aW9uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9lbGFzdGljc2VhcmNoLnltbCBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9lbGFzdGljc2VhcmNoLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTgwOGFkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvcmVzb3VyY2VzL2VsYXN0aWNzZWFyY2gueW1sCkBAIC0wLDAgKzEsMzkyIEBACisKK2VsYXN0aWNTZWFyY2gubG9jYWw6IHRydWUKK2VsYXN0aWNTZWFyY2gudHJhbnNwb3J0Y2xpZW50OiBmYWxzZQorY2x1c3Rlci5uYW1lOiBlbGFzdGljc2VhcmNoXzFfNV8yMjIyCisgIAorZGlzY292ZXJ5Lnplbi5waW5nLm11bHRpY2FzdC5lbmFibGVkOiBmYWxzZQorZGlzY292ZXJ5Lnplbi5waW5nLnVuaWNhc3QuZW5hYmxlZDogdHJ1ZQorZGlzY292ZXJ5Lnplbi5waW5nLnVuaWNhc3QuaG9zdHM6IDEuMi4zLjQKK3RyYW5zcG9ydC5jbGllbnQuaW5pdGlhbF9ub2RlczoKKyAgIC0gMS4yLjMuNDo5MzAwCisKKworI3BsdWdpbi50eXBlczogIkRlbGV0ZUJ5UXVlcnlQbHVnaW4iCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFbGFzdGljc2VhcmNoIENvbmZpZ3VyYXRpb24gRXhhbXBsZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGlzIGZpbGUgY29udGFpbnMgYW4gb3ZlcnZpZXcgb2YgdmFyaW91cyBjb25maWd1cmF0aW9uIHNldHRpbmdzLAorIyB0YXJnZXRlZCBhdCBvcGVyYXRpb25zIHN0YWZmLiBBcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHNob3VsZAorIyBjb25zdWx0IHRoZSBndWlkZSBhdCA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlPi4KKyMKKyMgVGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgaXMgY292ZXJlZCBhdAorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAuaHRtbD4uCisjCisjIEVsYXN0aWNzZWFyY2ggY29tZXMgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBtb3N0IHNldHRpbmdzLAorIyBzbyB5b3UgY2FuIHRyeSBpdCBvdXQgd2l0aG91dCBib3RoZXJpbmcgd2l0aCBjb25maWd1cmF0aW9uLgorIworIyBNb3N0IG9mIHRoZSB0aW1lLCB0aGVzZSBkZWZhdWx0cyBhcmUganVzdCBmaW5lIGZvciBydW5uaW5nIGEgcHJvZHVjdGlvbgorIyBjbHVzdGVyLiBJZiB5b3UncmUgZmluZS10dW5pbmcgeW91ciBjbHVzdGVyLCBvciB3b25kZXJpbmcgYWJvdXQgdGhlCisjIGVmZmVjdCBvZiBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBwbGVhc2UgX2RvIGFza18gb24gdGhlCisjIG1haWxpbmcgbGlzdCBvciBJUkMgY2hhbm5lbCBbaHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2NvbW11bml0eV0uCisKKyMgQW55IGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHJlcGxhY2VkIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzCisjIGJ5IHBsYWNpbmcgdGhlbSBpbiAkey4uLn0gbm90YXRpb24uIEZvciBleGFtcGxlOgorIworIyBub2RlLnJhY2s6ICR7UkFDS19FTlZfVkFSfQorCisjIEZvciBpbmZvcm1hdGlvbiBvbiBzdXBwb3J0ZWQgZm9ybWF0cyBhbmQgc3ludGF4IGZvciB0aGUgY29uZmlnIGZpbGUsIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvc2V0dXAtY29uZmlndXJhdGlvbi5odG1sPgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENsdXN0ZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDbHVzdGVyIG5hbWUgaWRlbnRpZmllcyB5b3VyIGNsdXN0ZXIgZm9yIGF1dG8tZGlzY292ZXJ5LiBJZiB5b3UncmUgcnVubmluZworIyBtdWx0aXBsZSBjbHVzdGVycyBvbiB0aGUgc2FtZSBuZXR3b3JrLCBtYWtlIHN1cmUgeW91J3JlIHVzaW5nIHVuaXF1ZSBuYW1lcy4KKyMKKyMgY2x1c3Rlci5uYW1lOiBlbGFzdGljc2VhcmNoCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vZGUgbmFtZXMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBvbiBzdGFydHVwLCBzbyB5b3UncmUgcmVsaWV2ZWQKKyMgZnJvbSBjb25maWd1cmluZyB0aGVtIG1hbnVhbGx5LiBZb3UgY2FuIHRpZSB0aGlzIG5vZGUgdG8gYSBzcGVjaWZpYyBuYW1lOgorIworIyBub2RlLm5hbWU6ICJGcmFueiBLYWZrYSIKKworIyBFdmVyeSBub2RlIGNhbiBiZSBjb25maWd1cmVkIHRvIGFsbG93IG9yIGRlbnkgYmVpbmcgZWxpZ2libGUgYXMgdGhlIG1hc3RlciwKKyMgYW5kIHRvIGFsbG93IG9yIGRlbnkgdG8gc3RvcmUgdGhlIGRhdGEuCisjCisjIEFsbG93IHRoaXMgbm9kZSB0byBiZSBlbGlnaWJsZSBhcyBhIG1hc3RlciBub2RlIChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBub2RlLm1hc3RlcjogdHJ1ZQorIworIyBBbGxvdyB0aGlzIG5vZGUgdG8gc3RvcmUgZGF0YSAoZW5hYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgbm9kZS5kYXRhOiB0cnVlCisKKyMgWW91IGNhbiBleHBsb2l0IHRoZXNlIHNldHRpbmdzIHRvIGRlc2lnbiBhZHZhbmNlZCBjbHVzdGVyIHRvcG9sb2dpZXMuCisjCisjIDEuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBuZXZlciBiZWNvbWUgYSBtYXN0ZXIgbm9kZSwgb25seSB0byBob2xkIGRhdGEuCisjICAgIFRoaXMgd2lsbCBiZSB0aGUgIndvcmtob3JzZSIgb2YgeW91ciBjbHVzdGVyLgorIworIyBub2RlLm1hc3RlcjogZmFsc2UKKyMgbm9kZS5kYXRhOiB0cnVlCisjCisjIDIuIFlvdSB3YW50IHRoaXMgbm9kZSB0byBvbmx5IHNlcnZlIGFzIGEgbWFzdGVyOiB0byBub3Qgc3RvcmUgYW55IGRhdGEgYW5kCisjICAgIHRvIGhhdmUgZnJlZSByZXNvdXJjZXMuIFRoaXMgd2lsbCBiZSB0aGUgImNvb3JkaW5hdG9yIiBvZiB5b3VyIGNsdXN0ZXIuCisjCisjIG5vZGUubWFzdGVyOiB0cnVlCisjIG5vZGUuZGF0YTogZmFsc2UKKyMKKyMgMy4gWW91IHdhbnQgdGhpcyBub2RlIHRvIGJlIG5laXRoZXIgbWFzdGVyIG5vciBkYXRhIG5vZGUsIGJ1dAorIyAgICB0byBhY3QgYXMgYSAic2VhcmNoIGxvYWQgYmFsYW5jZXIiIChmZXRjaGluZyBkYXRhIGZyb20gbm9kZXMsCisjICAgIGFnZ3JlZ2F0aW5nIHJlc3VsdHMsIGV0Yy4pCisjCisjIG5vZGUubWFzdGVyOiBmYWxzZQorIyBub2RlLmRhdGE6IGZhbHNlCisKKyMgVXNlIHRoZSBDbHVzdGVyIEhlYWx0aCBBUEkgW2h0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fY2x1c3Rlci9oZWFsdGhdLCB0aGUKKyMgTm9kZSBJbmZvIEFQSSBbaHR0cDovL2xvY2FsaG9zdDo5MjAwL19ub2Rlc10gb3IgR1VJIHRvb2xzCisjIHN1Y2ggYXMgPGh0dHA6Ly93d3cuZWxhc3RpY3NlYXJjaC5vcmcvb3ZlcnZpZXcvbWFydmVsLz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9rYXJtaS9lbGFzdGljc2VhcmNoLXBhcmFtZWRpYz4sCisjIDxodHRwOi8vZ2l0aHViLmNvbS9sdWthcy12bGNlay9iaWdkZXNrPiBhbmQKKyMgPGh0dHA6Ly9tb2J6LmdpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC1oZWFkPiB0byBpbnNwZWN0IHRoZSBjbHVzdGVyIHN0YXRlLgorCisjIEEgbm9kZSBjYW4gaGF2ZSBnZW5lcmljIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCB3aGljaCBjYW4gbGF0ZXIgYmUgdXNlZAorIyBmb3IgY3VzdG9taXplZCBzaGFyZCBhbGxvY2F0aW9uIGZpbHRlcmluZywgb3IgYWxsb2NhdGlvbiBhd2FyZW5lc3MuIEFuIGF0dHJpYnV0ZQorIyBpcyBhIHNpbXBsZSBrZXkgdmFsdWUgcGFpciwgc2ltaWxhciB0byBub2RlLmtleTogdmFsdWUsIGhlcmUgaXMgYW4gZXhhbXBsZToKKyMKKyMgbm9kZS5yYWNrOiByYWNrMzE0CisKKyMgQnkgZGVmYXVsdCwgbXVsdGlwbGUgbm9kZXMgYXJlIGFsbG93ZWQgdG8gc3RhcnQgZnJvbSB0aGUgc2FtZSBpbnN0YWxsYXRpb24gbG9jYXRpb24KKyMgdG8gZGlzYWJsZSBpdCwgc2V0IHRoZSBmb2xsb3dpbmc6CisjIG5vZGUubWF4X2xvY2FsX3N0b3JhZ2Vfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSW5kZXggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgWW91IGNhbiBzZXQgYSBudW1iZXIgb2Ygb3B0aW9ucyAoc3VjaCBhcyBzaGFyZC9yZXBsaWNhIG9wdGlvbnMsIG1hcHBpbmcKKyMgb3IgYW5hbHl6ZXIgZGVmaW5pdGlvbnMsIHRyYW5zbG9nIHNldHRpbmdzLCAuLi4pIGZvciBpbmRpY2VzIGdsb2JhbGx5LAorIyBpbiB0aGlzIGZpbGUuCisjCisjIE5vdGUsIHRoYXQgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBjb25maWd1cmUgaW5kZXggc2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvcgorIyBhIGNlcnRhaW4gaW5kZXgsIGVpdGhlciB3aGVuIGNyZWF0aW5nIGl0IG9yIGJ5IHVzaW5nIHRoZSBpbmRleCB0ZW1wbGF0ZXMgQVBJLgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L2luZGV4LW1vZHVsZXMuaHRtbD4gYW5kCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9pbmRpY2VzLWNyZWF0ZS1pbmRleC5odG1sPgorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBTZXQgdGhlIG51bWJlciBvZiBzaGFyZHMgKHNwbGl0cykgb2YgYW4gaW5kZXggKDUgYnkgZGVmYXVsdCk6CisjCisjIGluZGV4Lm51bWJlcl9vZl9zaGFyZHM6IDUKKworIyBTZXQgdGhlIG51bWJlciBvZiByZXBsaWNhcyAoYWRkaXRpb25hbCBjb3BpZXMpIG9mIGFuIGluZGV4ICgxIGJ5IGRlZmF1bHQpOgorIworIyBpbmRleC5udW1iZXJfb2ZfcmVwbGljYXM6IDEKKworIyBOb3RlLCB0aGF0IGZvciBkZXZlbG9wbWVudCBvbiBhIGxvY2FsIG1hY2hpbmUsIHdpdGggc21hbGwgaW5kaWNlcywgaXQgdXN1YWxseQorIyBtYWtlcyBzZW5zZSB0byAiZGlzYWJsZSIgdGhlIGRpc3RyaWJ1dGVkIGZlYXR1cmVzOgorIworaW5kZXgubnVtYmVyX29mX3NoYXJkczogMQoraW5kZXgubnVtYmVyX29mX3JlcGxpY2FzOiAwCisKKyMgVGhlc2Ugc2V0dGluZ3MgZGlyZWN0bHkgYWZmZWN0IHRoZSBwZXJmb3JtYW5jZSBvZiBpbmRleCBhbmQgc2VhcmNoIG9wZXJhdGlvbnMKKyMgaW4geW91ciBjbHVzdGVyLiBBc3N1bWluZyB5b3UgaGF2ZSBlbm91Z2ggbWFjaGluZXMgdG8gaG9sZCBzaGFyZHMgYW5kCisjIHJlcGxpY2FzLCB0aGUgcnVsZSBvZiB0aHVtYiBpczoKKyMKKyMgMS4gSGF2aW5nIG1vcmUgKnNoYXJkcyogZW5oYW5jZXMgdGhlIF9pbmRleGluZ18gcGVyZm9ybWFuY2UgYW5kIGFsbG93cyB0bworIyAgICBfZGlzdHJpYnV0ZV8gYSBiaWcgaW5kZXggYWNyb3NzIG1hY2hpbmVzLgorIyAyLiBIYXZpbmcgbW9yZSAqcmVwbGljYXMqIGVuaGFuY2VzIHRoZSBfc2VhcmNoXyBwZXJmb3JtYW5jZSBhbmQgaW1wcm92ZXMgdGhlCisjICAgIGNsdXN0ZXIgX2F2YWlsYWJpbGl0eV8uCisjCisjIFRoZSAibnVtYmVyX29mX3NoYXJkcyIgaXMgYSBvbmUtdGltZSBzZXR0aW5nIGZvciBhbiBpbmRleC4KKyMKKyMgVGhlICJudW1iZXJfb2ZfcmVwbGljYXMiIGNhbiBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGFueXRpbWUsCisjIGJ5IHVzaW5nIHRoZSBJbmRleCBVcGRhdGUgU2V0dGluZ3MgQVBJLgorIworIyBFbGFzdGljc2VhcmNoIHRha2VzIGNhcmUgYWJvdXQgbG9hZCBiYWxhbmNpbmcsIHJlbG9jYXRpbmcsIGdhdGhlcmluZyB0aGUKKyMgcmVzdWx0cyBmcm9tIG5vZGVzLCBldGMuIEV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgdG8gZmluZS10dW5lCisjIHlvdXIgc2V0dXAuCisKKyMgVXNlIHRoZSBJbmRleCBTdGF0dXMgQVBJICg8aHR0cDovL2xvY2FsaG9zdDo5MjAwL0EvX3N0YXR1cz4pIHRvIGluc3BlY3QKKyMgdGhlIGluZGV4IHN0YXR1cy4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUGF0aHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwYXRoLmhvbWU6IC9zcmMvdGVzdC9yZXNvdXJjZXMKKyMgUGF0aCB0byBkaXJlY3RvcnkgY29udGFpbmluZyBjb25maWd1cmF0aW9uICh0aGlzIGZpbGUgYW5kIGxvZ2dpbmcueW1sKToKKyMKK3BhdGguY29uZjogL3NyYy90ZXN0L3Jlc291cmNlcworCisjIFBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGluZGV4IGRhdGEgYWxsb2NhdGVkIGZvciB0aGlzIG5vZGUuCisjCitwYXRoLmRhdGE6IHRhcmdldC9lc2RhdGEKKyMKKyMgQ2FuIG9wdGlvbmFsbHkgaW5jbHVkZSBtb3JlIHRoYW4gb25lIGxvY2F0aW9uLCBjYXVzaW5nIGRhdGEgdG8gYmUgc3RyaXBlZCBhY3Jvc3MKKyMgdGhlIGxvY2F0aW9ucyAoYSBsYSBSQUlEIDApIG9uIGEgZmlsZSBsZXZlbCwgZmF2b3VyaW5nIGxvY2F0aW9ucyB3aXRoIG1vc3QgZnJlZQorIyBzcGFjZSBvbiBjcmVhdGlvbi4gRm9yIGV4YW1wbGU6CisjCisjIHBhdGguZGF0YTogL3BhdGgvdG8vZGF0YTEsL3BhdGgvdG8vZGF0YTIKKworIyBQYXRoIHRvIHRlbXBvcmFyeSBmaWxlczoKKyMKK3BhdGgud29yazogL3RhcmdldC9lc3dvcmsKKworIyBQYXRoIHRvIGxvZyBmaWxlczoKKyMKK3BhdGgubG9nczogL3RhcmdldC9lc2xvZ3MKKworIyBQYXRoIHRvIHdoZXJlIHBsdWdpbnMgYXJlIGluc3RhbGxlZDoKKyMKKyMgcGF0aC5wbHVnaW5zOiAvcGF0aC90by9wbHVnaW5zCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBsdWdpbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIElmIGEgcGx1Z2luIGxpc3RlZCBoZXJlIGlzIG5vdCBpbnN0YWxsZWQgZm9yIGN1cnJlbnQgbm9kZSwgdGhlIG5vZGUgd2lsbCBub3Qgc3RhcnQuCisjCisjIHBsdWdpbi5tYW5kYXRvcnk6IG1hcHBlci1hdHRhY2htZW50cyxsYW5nLWdyb292eQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1lbW9yeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoIHBlcmZvcm1zIHBvb3JseSB3aGVuIEpWTSBzdGFydHMgc3dhcHBpbmc6IHlvdSBzaG91bGQgZW5zdXJlIHRoYXQKKyMgaXQgX25ldmVyXyBzd2Fwcy4KKyMKKyMgU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBsb2NrIHRoZSBtZW1vcnk6CisjCisjIGJvb3RzdHJhcC5tbG9ja2FsbDogdHJ1ZQorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBFU19NSU5fTUVNIGFuZCBFU19NQVhfTUVNIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CisjIHRvIHRoZSBzYW1lIHZhbHVlLCBhbmQgdGhhdCB0aGUgbWFjaGluZSBoYXMgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZQorIyBmb3IgRWxhc3RpY3NlYXJjaCwgbGVhdmluZyBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpdHNlbGYuCisjCisjIFlvdSBzaG91bGQgYWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgRWxhc3RpY3NlYXJjaCBwcm9jZXNzIGlzIGFsbG93ZWQgdG8gbG9jaworIyB0aGUgbWVtb3J5LCBlZy4gYnkgdXNpbmcgYHVsaW1pdCAtbCB1bmxpbWl0ZWRgLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOZXR3b3JrIEFuZCBIVFRQICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbGFzdGljc2VhcmNoLCBieSBkZWZhdWx0LCBiaW5kcyBpdHNlbGYgdG8gdGhlIDAuMC4wLjAgYWRkcmVzcywgYW5kIGxpc3RlbnMKKyMgb24gcG9ydCBbOTIwMC05MzAwXSBmb3IgSFRUUCB0cmFmZmljIGFuZCBvbiBwb3J0IFs5MzAwLTk0MDBdIGZvciBub2RlLXRvLW5vZGUKKyMgY29tbXVuaWNhdGlvbi4gKHRoZSByYW5nZSBtZWFucyB0aGF0IGlmIHRoZSBwb3J0IGlzIGJ1c3ksIGl0IHdpbGwgYXV0b21hdGljYWxseQorIyB0cnkgdGhlIG5leHQgcG9ydCkuCisKKyMgU2V0IHRoZSBiaW5kIGFkZHJlc3Mgc3BlY2lmaWNhbGx5IChJUHY0IG9yIElQdjYpOgorIworIyBuZXR3b3JrLmJpbmRfaG9zdDogMTkyLjE2OC4wLjEKKworIyBTZXQgdGhlIGFkZHJlc3Mgb3RoZXIgbm9kZXMgd2lsbCB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzIG5vZGUuIElmIG5vdAorIyBzZXQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZGVyaXZlZC4gSXQgbXVzdCBwb2ludCB0byBhbiBhY3R1YWwgSVAgYWRkcmVzcy4KKyMKKyMgbmV0d29yay5wdWJsaXNoX2hvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGJvdGggJ2JpbmRfaG9zdCcgYW5kICdwdWJsaXNoX2hvc3QnOgorIworIyBuZXR3b3JrLmhvc3Q6IDE5Mi4xNjguMC4xCisKKyMgU2V0IGEgY3VzdG9tIHBvcnQgZm9yIHRoZSBub2RlIHRvIG5vZGUgY29tbXVuaWNhdGlvbiAoOTMwMCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5wb3J0OiA5MzAwCisKKyMgRW5hYmxlIGNvbXByZXNzaW9uIGZvciBhbGwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG5vZGVzIChkaXNhYmxlZCBieSBkZWZhdWx0KToKKyMKKyMgdHJhbnNwb3J0LnRjcC5jb21wcmVzczogdHJ1ZQorCisjIFNldCBhIGN1c3RvbSBwb3J0IHRvIGxpc3RlbiBmb3IgSFRUUCB0cmFmZmljOgorIworIyBodHRwLnBvcnQ6IDkyMDAKKworIyBTZXQgYSBjdXN0b20gYWxsb3dlZCBjb250ZW50IGxlbmd0aDoKKyMKKyMgaHR0cC5tYXhfY29udGVudF9sZW5ndGg6IDEwMG1iCisKKyMgRGlzYWJsZSBIVFRQIGNvbXBsZXRlbHk6CisjCisjIGh0dHAuZW5hYmxlZDogZmFsc2UKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHYXRld2F5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlIGdhdGV3YXkgYWxsb3dzIGZvciBwZXJzaXN0aW5nIHRoZSBjbHVzdGVyIHN0YXRlIGJldHdlZW4gZnVsbCBjbHVzdGVyCisjIHJlc3RhcnRzLiBFdmVyeSBjaGFuZ2UgdG8gdGhlIHN0YXRlIChzdWNoIGFzIGFkZGluZyBhbiBpbmRleCkgd2lsbCBiZSBzdG9yZWQKKyMgaW4gdGhlIGdhdGV3YXksIGFuZCB3aGVuIHRoZSBjbHVzdGVyIHN0YXJ0cyB1cCBmb3IgdGhlIGZpcnN0IHRpbWUsCisjIGl0IHdpbGwgcmVhZCBpdHMgc3RhdGUgZnJvbSB0aGUgZ2F0ZXdheS4KKworIyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiBnYXRld2F5IGltcGxlbWVudGF0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorIyA8aHR0cDovL2VsYXN0aWNzZWFyY2gub3JnL2d1aWRlL2VuL2VsYXN0aWNzZWFyY2gvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy1nYXRld2F5Lmh0bWw+LgorCisjIFRoZSBkZWZhdWx0IGdhdGV3YXkgdHlwZSBpcyB0aGUgImxvY2FsIiBnYXRld2F5IChyZWNvbW1lbmRlZCk6CisjCisjIGdhdGV3YXkudHlwZTogbG9jYWwKKworIyBTZXR0aW5ncyBiZWxvdyBjb250cm9sIGhvdyBhbmQgd2hlbiB0byBzdGFydCB0aGUgaW5pdGlhbCByZWNvdmVyeSBwcm9jZXNzIG9uCisjIGEgZnVsbCBjbHVzdGVyIHJlc3RhcnQgKHRvIHJldXNlIGFzIG11Y2ggbG9jYWwgZGF0YSBhcyBwb3NzaWJsZSB3aGVuIHVzaW5nIHNoYXJlZAorIyBnYXRld2F5KS4KKworIyBBbGxvdyByZWNvdmVyeSBwcm9jZXNzIGFmdGVyIE4gbm9kZXMgaW4gYSBjbHVzdGVyIGFyZSB1cDoKKyMKK2dhdGV3YXkucmVjb3Zlcl9hZnRlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZW91dCB0byBpbml0aWF0ZSB0aGUgcmVjb3ZlcnkgcHJvY2Vzcywgb25jZSB0aGUgTiBub2RlcworIyBmcm9tIHByZXZpb3VzIHNldHRpbmcgYXJlIHVwIChhY2NlcHRzIHRpbWUgdmFsdWUpOgorIworIyBnYXRld2F5LnJlY292ZXJfYWZ0ZXJfdGltZTogNW0KKworIyBTZXQgaG93IG1hbnkgbm9kZXMgYXJlIGV4cGVjdGVkIGluIHRoaXMgY2x1c3Rlci4gT25jZSB0aGVzZSBOIG5vZGVzCisjIGFyZSB1cCAoYW5kIHJlY292ZXJfYWZ0ZXJfbm9kZXMgaXMgbWV0KSwgYmVnaW4gcmVjb3ZlcnkgcHJvY2VzcyBpbW1lZGlhdGVseQorIyAod2l0aG91dCB3YWl0aW5nIGZvciByZWNvdmVyX2FmdGVyX3RpbWUgdG8gZXhwaXJlKToKKyMKK2dhdGV3YXkuZXhwZWN0ZWRfbm9kZXM6IDEKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSZWNvdmVyeSBUaHJvdHRsaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlc2Ugc2V0dGluZ3MgYWxsb3cgdG8gY29udHJvbCB0aGUgcHJvY2VzcyBvZiBzaGFyZHMgYWxsb2NhdGlvbiBiZXR3ZWVuCisjIG5vZGVzIGR1cmluZyBpbml0aWFsIHJlY292ZXJ5LCByZXBsaWNhIGFsbG9jYXRpb24sIHJlYmFsYW5jaW5nLAorIyBvciB3aGVuIGFkZGluZyBhbmQgcmVtb3Zpbmcgbm9kZXMuCisKKyMgU2V0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCByZWNvdmVyaWVzIGhhcHBlbmluZyBvbiBhIG5vZGU6CisjCisjIDEuIER1cmluZyB0aGUgaW5pdGlhbCByZWNvdmVyeQorIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2luaXRpYWxfcHJpbWFyaWVzX3JlY292ZXJpZXM6IDQKKyMKKyMgMi4gRHVyaW5nIGFkZGluZy9yZW1vdmluZyBub2RlcywgcmViYWxhbmNpbmcsIGV0YworIworIyBjbHVzdGVyLnJvdXRpbmcuYWxsb2NhdGlvbi5ub2RlX2NvbmN1cnJlbnRfcmVjb3ZlcmllczogMgorCisjIFNldCB0byB0aHJvdHRsZSB0aHJvdWdocHV0IHdoZW4gcmVjb3ZlcmluZyAoZWcuIDEwMG1iLCBieSBkZWZhdWx0IDIwbWIpOgorIworIyBpbmRpY2VzLnJlY292ZXJ5Lm1heF9ieXRlc19wZXJfc2VjOiAyMG1iCisKKyMgU2V0IHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3BlbiBjb25jdXJyZW50IHN0cmVhbXMgd2hlbgorIyByZWNvdmVyaW5nIGEgc2hhcmQgZnJvbSBhIHBlZXI6CisjCisjIGluZGljZXMucmVjb3ZlcnkuY29uY3VycmVudF9zdHJlYW1zOiA1CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEaXNjb3ZlcnkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpc2NvdmVyeSBpbmZyYXN0cnVjdHVyZSBlbnN1cmVzIG5vZGVzIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBjbHVzdGVyCisjIGFuZCBtYXN0ZXIgbm9kZSBpcyBlbGVjdGVkLiBNdWx0aWNhc3QgZGlzY292ZXJ5IGlzIHRoZSBkZWZhdWx0LgorCisjIFNldCB0byBlbnN1cmUgYSBub2RlIHNlZXMgTiBvdGhlciBtYXN0ZXIgZWxpZ2libGUgbm9kZXMgdG8gYmUgY29uc2lkZXJlZAorIyBvcGVyYXRpb25hbCB3aXRoaW4gdGhlIGNsdXN0ZXIuIEl0cyByZWNvbW1lbmRlZCB0byBzZXQgaXQgdG8gYSBoaWdoZXIgdmFsdWUKKyMgdGhhbiAxIHdoZW4gcnVubmluZyBtb3JlIHRoYW4gMiBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyMKKyMgZGlzY292ZXJ5Lnplbi5taW5pbXVtX21hc3Rlcl9ub2RlczogMQorCisjIFNldCB0aGUgdGltZSB0byB3YWl0IGZvciBwaW5nIHJlc3BvbnNlcyBmcm9tIG90aGVyIG5vZGVzIHdoZW4gZGlzY292ZXJpbmcuCisjIFNldCB0aGlzIG9wdGlvbiB0byBhIGhpZ2hlciB2YWx1ZSBvbiBhIHNsb3cgb3IgY29uZ2VzdGVkIG5ldHdvcmsKKyMgdG8gbWluaW1pemUgZGlzY292ZXJ5IGZhaWx1cmVzOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcudGltZW91dDogM3MKKworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisjIDxodHRwOi8vZWxhc3RpY3NlYXJjaC5vcmcvZ3VpZGUvZW4vZWxhc3RpY3NlYXJjaC9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzLWRpc2NvdmVyeS16ZW4uaHRtbD4KKworIyBVbmljYXN0IGRpc2NvdmVyeSBhbGxvd3MgdG8gZXhwbGljaXRseSBjb250cm9sIHdoaWNoIG5vZGVzIHdpbGwgYmUgdXNlZAorIyB0byBkaXNjb3ZlciB0aGUgY2x1c3Rlci4gSXQgY2FuIGJlIHVzZWQgd2hlbiBtdWx0aWNhc3QgaXMgbm90IHByZXNlbnQsCisjIG9yIHRvIHJlc3RyaWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24td2lzZS4KKyMKKyMgMS4gRGlzYWJsZSBtdWx0aWNhc3QgZGlzY292ZXJ5IChlbmFibGVkIGJ5IGRlZmF1bHQpOgorIworIyBkaXNjb3ZlcnkuemVuLnBpbmcubXVsdGljYXN0LmVuYWJsZWQ6IGZhbHNlCisjCisjIDIuIENvbmZpZ3VyZSBhbiBpbml0aWFsIGxpc3Qgb2YgbWFzdGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisjICAgIHRvIHBlcmZvcm0gZGlzY292ZXJ5IHdoZW4gbmV3IG5vZGVzIChtYXN0ZXIgb3IgZGF0YSkgYXJlIHN0YXJ0ZWQ6CisjCisjIGRpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0Lmhvc3RzOiBbImhvc3QxIiwgImhvc3QyOnBvcnQiXQorCisjIEVDMiBkaXNjb3ZlcnkgYWxsb3dzIHRvIHVzZSBBV1MgRUMyIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGRpc2NvdmVyeS4KKyMKKyMgWW91IGhhdmUgdG8gaW5zdGFsbCB0aGUgY2xvdWQtYXdzIHBsdWdpbiBmb3IgZW5hYmxpbmcgdGhlIEVDMiBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyMgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy9ndWlkZS9lbi9lbGFzdGljc2VhcmNoL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMtZGlzY292ZXJ5LWVjMi5odG1sPgorIworIyBTZWUgPGh0dHA6Ly9lbGFzdGljc2VhcmNoLm9yZy90dXRvcmlhbHMvZWxhc3RpY3NlYXJjaC1vbi1lYzIvPgorIyBmb3IgYSBzdGVwLWJ5LXN0ZXAgdHV0b3JpYWwuCisKKyMgR0NFIGRpc2NvdmVyeSBhbGxvd3MgdG8gdXNlIEdvb2dsZSBDb21wdXRlIEVuZ2luZSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBkaXNjb3ZlcnkuCisjCisjIFlvdSBoYXZlIHRvIGluc3RhbGwgdGhlIGNsb3VkLWdjZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBHQ0UgZGlzY292ZXJ5LgorIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxodHRwczovL2dpdGh1Yi5jb20vZWxhc3RpY3NlYXJjaC9lbGFzdGljc2VhcmNoLWNsb3VkLWdjZT4uCisKKyMgQXp1cmUgZGlzY292ZXJ5IGFsbG93cyB0byB1c2UgQXp1cmUgQVBJIGluIG9yZGVyIHRvIHBlcmZvcm0gZGlzY292ZXJ5LgorIworIyBZb3UgaGF2ZSB0byBpbnN0YWxsIHRoZSBjbG91ZC1henVyZSBwbHVnaW4gZm9yIGVuYWJsaW5nIHRoZSBBenVyZSBkaXNjb3ZlcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9lbGFzdGljc2VhcmNoL2VsYXN0aWNzZWFyY2gtY2xvdWQtYXp1cmU+LgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNsb3cgTG9nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTaGFyZCBsZXZlbCBxdWVyeSBhbmQgZmV0Y2ggdGhyZXNob2xkIGxvZ2dpbmcuCisKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQucXVlcnkud2FybjogMTBzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmluZm86IDVzCisjaW5kZXguc2VhcmNoLnNsb3dsb2cudGhyZXNob2xkLnF1ZXJ5LmRlYnVnOiAycworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5xdWVyeS50cmFjZTogNTAwbXMKKworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC53YXJuOiAxcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5pbmZvOiA4MDBtcworI2luZGV4LnNlYXJjaC5zbG93bG9nLnRocmVzaG9sZC5mZXRjaC5kZWJ1ZzogNTAwbXMKKyNpbmRleC5zZWFyY2guc2xvd2xvZy50aHJlc2hvbGQuZmV0Y2gudHJhY2U6IDIwMG1zCisKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC53YXJuOiAxMHMKKyNpbmRleC5pbmRleGluZy5zbG93bG9nLnRocmVzaG9sZC5pbmRleC5pbmZvOiA1cworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LmRlYnVnOiAycworI2luZGV4LmluZGV4aW5nLnNsb3dsb2cudGhyZXNob2xkLmluZGV4LnRyYWNlOiA1MDBtcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdDIExvZ2dpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI21vbml0b3IuanZtLmdjLnlvdW5nLndhcm46IDEwMDBtcworI21vbml0b3IuanZtLmdjLnlvdW5nLmluZm86IDcwMG1zCisjbW9uaXRvci5qdm0uZ2MueW91bmcuZGVidWc6IDQwMG1zCisKKyNtb25pdG9yLmp2bS5nYy5vbGQud2FybjogMTBzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmluZm86IDVzCisjbW9uaXRvci5qdm0uZ2Mub2xkLmRlYnVnOiAycworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvdGVzdC9yZXNvdXJjZXMvaW1hZ2VzL2FwYWNoZS5wbmcgYi9jYXRhbG9nLWRhby9zcmMvdGVzdC9yZXNvdXJjZXMvaW1hZ2VzL2FwYWNoZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5ZjQwMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9pbWFnZXMvYXBhY2hlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLWRhby9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGMzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWRhby9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDggQEAKKyMgUm9vdCBsb2dnZXIgb3B0aW9uCitsb2c0ai5yb290TG9nZ2VyPWluZm8sIHN0ZG91dAorCisjIERpcmVjdCBsb2cgbWVzc2FnZXMgdG8gc3Rkb3V0Citsb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5UYXJnZXQ9U3lzdGVtLm91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7eXl5eS1NTS1kZCBISDptbTpzc30gJS01cCAlY3sxfTolTCAtICVtJW4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9sb2diYWNrLXRlc3QueG1sIGIvY2F0YWxvZy1kYW8vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3ZWI5NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZGFvL3NyYy90ZXN0L3Jlc291cmNlcy9sb2diYWNrLXRlc3QueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzwhLS0gb25seSBvbmUgbGluZSwgc2h1dCB1cCBsb2diYWNrICEgLS0+Cis8Y29uZmlndXJhdGlvbiA+CisgICAgPGFwcGVuZGVyIG5hbWU9IlNURE9VVCIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICA8UGF0dGVybj4KKyAgICAgICAgICAgICAgICAlZHt5eXl5LU1NLWRkIEhIOm1tOnNzfSBbJXRocmVhZF0gJS01bGV2ZWwgJWxvZ2dlcnszNn0gLSAlbXNnJW4KKyAgICAgICAgICAgIDwvUGF0dGVybj4KKyAgICAgICAgPC9lbmNvZGVyPgorICAgIDwvYXBwZW5kZXI+CisgICAgPHJvb3QgbGV2ZWw9Ik9GRiI+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTVERPVVQiIC8+CisgICAgPC9yb290PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS8uZ2l0aWdub3JlIGIvY2F0YWxvZy1mZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMWI5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlLy5naXRpZ25vcmUKQEAgLTAsMCArMSw1IEBACisvdGFyZ2V0CisvdGFyZ2V0CisvdGFyZ2V0CisvdGFyZ2V0CisvYnVpbGQvCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3BvbS54bWwgYi9jYXRhbG9nLWZlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0MWQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvcG9tLnhtbApAQCAtMCwwICsxLDQ0MSBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKwk8YXJ0aWZhY3RJZD5jYXRhbG9nLWZlPC9hcnRpZmFjdElkPgorCTxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKworCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNkYy1tYWluPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCisKKwk8ZGVwZW5kZW5jaWVzPgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZnVuY3Rpb25hbGphdmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5mdW5jdGlvbmFsamF2YTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNlY3VyaXR5LXV0aWxzPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtzZWN1cml0eS11dGlscy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4gICAgICAgIDwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Y29tbW9uLWFwcC1hcGk8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtjb21tb24tYXBwLWFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPCEtLSBGaWxlIGNoYW5nZXMgbGlzdGVuZXIgLS0+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y2gucW9zLmxvZ2JhY2s8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y2gucW9zLmxvZ2JhY2s8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKwkJCQorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdyb292eTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5ncm9vdnktYWxsPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKwkJCQorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmphbmlubzwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qYW5pbm88L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1qY2ktY29yZTwvYXJ0aWZhY3RJZD4KKwkJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKwkJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKwkJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPmphdmF4Lm1haWw8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amF2YXgubWFpbC1hcGk8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+MS41LjI8L3ZlcnNpb24+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKwkJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmphY2tzb24tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIGh0dHAgY2xpZW50IC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KKwkJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+aHR0cG1pbWU8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+NC4zLjI8L3ZlcnNpb24+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKwkJCTwhLS0gaHR0cCBjbGllbnQgRU5EIC0tPgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTwhLS0gSlNPTiBhbmQgWUFNTCBQYXJzaW5nIC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQ8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhZm9ybWF0LXlhbWw8L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIEpldHR5IFByb3h5IC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amV0dHktcHJveHk8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXRzPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7amV0dHkuc2VydmxldHMudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIFByb3h5IHNlcnZsZXQgLS0+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKwkJCQorCQkJPCEtLSBBc3BlY3RzIC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmpjYWJpPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmpjYWJpLWFzcGVjdHM8L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmFzcGVjdGo8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+YXNwZWN0anJ0PC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmczPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKwkJCQorCQkJPCEtLSBJbnNlcnRlZCBmb3IgRUNPTVAgUG9ydGFsIEludGVncmF0aW9uIC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5lY29tcHNka29zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmVjb21wRlc8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtlY29tcC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCQkJPGV4Y2x1c2lvbnM+CisJCQkJCTxleGNsdXNpb24+CisJCQkJCQk8Z3JvdXBJZD5jb20uYXR0Lm5zYTwvZ3JvdXBJZD4KKwkJCQkJCTxhcnRpZmFjdElkPmNhbWJyaWFDbGllbnQ8L2FydGlmYWN0SWQ+CisJCQkJCTwvZXhjbHVzaW9uPgorCQkJCQk8ZXhjbHVzaW9uPgorCQkJCQkJPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKwkJCQkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCQkJPC9leGNsdXNpb24+CisJCQkJPC9leGNsdXNpb25zPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIFRFU1QgLS0+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKwkJCQk8dHlwZT5wb208L3R5cGU+CisJCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amV0dHktd2ViYXBwPC9hcnRpZmFjdElkPgorCQkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c3ByaW5nLXRlc3Q8L2FydGlmYWN0SWQ+CisJCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCQk8L2RlcGVuZGVuY2llcz4KKworCisKKworCisJCTxidWlsZD4KKworCQkJPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+CisKKwkJCTxwbHVnaW5zPgorCQkJCQorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxhcmNoaXZlPgorCQkJCQkJPG1hbmlmZXN0PgorCQkJCQkJCTxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisJCQkJCQk8L21hbmlmZXN0PgorCQkJCQk8L2FyY2hpdmU+CisJCQkJCQorCQkJCQk8d2ViUmVzb3VyY2VzPgorCQkJCQkJPHJlc291cmNlPgorCQkJCQkJCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisJCQkJCQk8L3Jlc291cmNlPgorCQkJCQk8L3dlYlJlc291cmNlcz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKworCisKKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPGlkPmNvcHktZGVwZW5kZW5jaWVzPC9pZD4KKwkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5jb3B5LWRlcGVuZGVuY2llczwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8aW5jbHVkZVNjb3BlPmNvbXBpbGU8L2luY2x1ZGVTY29wZT4KKwkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+Y29weS1pbnN0YWxsZWQ8L2lkPgorCQkJCQkJPHBoYXNlPmluc3RhbGw8L3BoYXNlPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPmNvcHk8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGFydGlmYWN0SXRlbXM+CisJCQkJCQkJCTxhcnRpZmFjdEl0ZW0+CisJCQkJCQkJCQk8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+CisJCQkJCQkJCQk8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisJCQkJCQkJCQk8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJCQkJCQk8dHlwZT4ke3Byb2plY3QucGFja2FnaW5nfTwvdHlwZT4KKwkJCQkJCQkJPC9hcnRpZmFjdEl0ZW0+CisJCQkJCQkJPC9hcnRpZmFjdEl0ZW1zPgorCQkJCQkJCTxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LnBhcmVudC5iYXNlZGlyfS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvPC9vdXRwdXREaXJlY3Rvcnk+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCTwvZXhlY3V0aW9uPgorCisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisKKworCisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj45LjAuNi52MjAxMzA5MzA8L3ZlcnNpb24+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKwkJCQkJPHdlYkFwcD4KKwkJCQkJCTxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKwkJCQkJCTx3ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4uKi8uKmplcnNleS1bXi9dXC5qYXIkPC93ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4KKwkJCQkJPC93ZWJBcHA+CisJCQkJCTx3YXI+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0ud2FyPC93YXI+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9wbHVnaW4+CisKKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJPC9wbHVnaW4+CisKKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+Y29tLmpjYWJpPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmpjYWJpLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2pjYWJpLnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5hamM8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKyAgICAgICAgICAgIAkJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQkJCTwhLS0gQ3JlYXRlIHRoZSBUQVIgZmlsZSAtLT4KKwkJCQkJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQkJCTxwbHVnaW4+CisJCQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQk8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke2Z1bGwucmVsZWFzZS52ZXJzaW9ufSR7YnVpbGQudHlwZX08L2ZpbmFsTmFtZT4KKwkJCQkJCQk8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KKwkJCQkJCQk8ZGVzY3JpcHRvcj4ke3Byb2plY3QuYmFzZWRpcn0vdGFyYmFsbC54bWw8L2Rlc2NyaXB0b3I+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQkKKwkJCQkJCTxleGVjdXRpb25zPgorCQkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJCTxpZD5hc3NlbWJseS10YXItZmlsZTwvaWQ+CisJCQkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKwkJCQkJCQkJPGdvYWxzPgorCQkJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCTwvZXhlY3V0aW9uPgorCQkJCQkJPC9leGVjdXRpb25zPgorCQkJCQk8L3BsdWdpbj4JCisJCTwvcGx1Z2lucz4KKworCisJCTxwbHVnaW5NYW5hZ2VtZW50PgorCQkJPHBsdWdpbnM+CisJCQkJPCEtLVRoaXMgcGx1Z2luJ3MgY29uZmlndXJhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIEVjbGlwc2UgbTJlIHNldHRpbmdzIAorCQkJCW9ubHkuIEl0IGhhcyBubyBpbmZsdWVuY2Ugb24gdGhlIE1hdmVuIGJ1aWxkIGl0c2VsZi4gLS0+CisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UubTJlPC9ncm91cElkPgorCQkJCQk8YXJ0aWZhY3RJZD5saWZlY3ljbGUtbWFwcGluZzwvYXJ0aWZhY3RJZD4KKwkJCQkJPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJPGxpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKwkJCQkJCQk8cGx1Z2luRXhlY3V0aW9ucz4KKwkJCQkJCQkJCisJCQkJCQkJCTxwbHVnaW5FeGVjdXRpb24+CisJCQkJCQkJCQk8cGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorCQkJCQkJCQkJCTxncm91cElkPmNvbS5qY2FiaTwvZ3JvdXBJZD4KKwkJCQkJCQkJCQk8YXJ0aWZhY3RJZD5qY2FiaS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQkJCQkJPHZlcnNpb25SYW5nZT5bMC4wLCk8L3ZlcnNpb25SYW5nZT4KKwkJCQkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQkJCTxnb2FsPmFqYzwvZ29hbD4KKwkJCQkJCQkJCQk8L2dvYWxzPgorCQkJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisJCQkJCQkJCQk8YWN0aW9uPgorCQkJCQkJCQkJCTxleGVjdXRlIC8+CisJCQkJCQkJCQk8L2FjdGlvbj4KKwkJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb24+CisJCQkJCQkJCQorCQkJCQkJCTwvcGx1Z2luRXhlY3V0aW9ucz4KKwkJCQkJCTwvbGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgorCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPC9wbHVnaW4+CisJCQkJCisJCQkJPCEtLSBqYWNiaSAobG9nIGluamVjdGlvbikgLS0+CisKKwkJCTwvcGx1Z2lucz4KKwkJPC9wbHVnaW5NYW5hZ2VtZW50PgorCQkKKwk8L2J1aWxkPgorCisKKworCisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9yZWFkTWUudHh0IGIvY2F0YWxvZy1mZS9yZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmI2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3JlYWRNZS50eHQKQEAgLTAsMCArMSwxNCBAQAorUnVubmluZyBKZXR0eQorCisxLiBpbiBBcmd1bWVudHMgVGFiIGFkZCB0byBWTSBBcmd1bWVudHM6CisKKy1EY29uZmlnLmhvbWU9QzpcR2l0X3dvcmtcRDItU0RuQ1xjYXRhbG9nLWZlXHNyY1x0ZXN0XHJlc291cmNlc1xjb25maWcgCistRGxvZy5ob21lPUM6XEdpdF93b3JrXEQyLVNEbkNcY2F0YWxvZy1mZVx0YXJnZXRcbG9nXAorLURsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPUM6XEdpdF93b3JrXEQyLVNEbkNcY2F0YWxvZy1mZVxzcmNcbWFpblxyZXNvdXJjZXNcY29uZmlnXGxvZ2JhY2sueG1sCisKKzIuIEluIFJ1biBDb25maWd1cmF0aW9uIG1ha2Ugc3VyZSB0byBydW4gamV0dHkgdmVyc2lvbiA4Lnggb3IgbmV3ZXIKKworMy4gaW4gb3JkZXIgdG8gdGVzdCB0cnk6CitodHRwOi8vbG9jYWxob3N0OjgwODAvc2RjMS9yZXN0L2NvbmZpZ21nci9nZXQKK29yCitodHRwOi8vbG9jYWxob3N0OjgwODAvc2RjMS9wcm94eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9Db25zdGFudHMuamF2YSBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU3ZWZjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmU7CisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9JVl9VU0VSID0gIkhUVFBfSVZfVVNFUiI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFUl9JRCA9ICJVU0VSX0lEIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX0NTUF9GSVJTVE5BTUUgPSAiSFRUUF9DU1BfRklSU1ROQU1FIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX0NTUF9MQVNUTkFNRSA9ICJIVFRQX0NTUF9MQVNUTkFNRSI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9JVl9SRU1PVEVfQUREUkVTUyA9ICJIVFRQX0lWX1JFTU9URV9BRERSRVNTIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX0NTUF9XU1RZUEUgPSAiSFRUUF9DU1BfV1NUWVBFIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX0NTUF9FTUFJTCA9ICJIVFRQX0NTUF9FTUFJTCI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VBTF9VU0VSX0lEX0hFQURFUiA9ICJjc3AtYXR0dWlkIjsKKwkKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jbGllbnQvQmFja2VuZENsaWVudC5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2NsaWVudC9CYWNrZW5kQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlMTcxNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jbGllbnQvQmFja2VuZENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5UcnVzdFNlbGZTaWduZWRTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LklucHV0U3RyZWFtRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuSHR0cENsaWVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnNzbC5TU0xDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlJlc3BvbnNlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlJlc3BvbnNlSW5mby5SZXNwb25zZVN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuaW1wbC5BdWRpdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5pbXBsLkh0dHBSZXF1ZXN0SW5mbzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgQmFja2VuZENsaWVudCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmFja2VuZENsaWVudC5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBIb3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1lVmVyaWZpZXIgPSBudWxsOworCisJcHJpdmF0ZSBDbG9zZWFibGVIdHRwQ2xpZW50IGJhY2tlbmRIdHRwQ2xpZW50OworCXByaXZhdGUgU3RyaW5nIGJhY2tlbmRIb3N0OworCXByaXZhdGUgU3RyaW5nIGJhY2tlbmRDb250ZXh0OworCisJcHVibGljIEJhY2tlbmRDbGllbnQoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgYmFja2VuZEhvc3QsIFN0cmluZyBiYWNrZW5kQ29udGV4dCkgeworCisJCXRoaXMuYmFja2VuZENvbnRleHQgPSBiYWNrZW5kQ29udGV4dDsKKwkJaG9zdG5hbWVWZXJpZmllciA9IG5ldyBIb3N0bmFtZVZlcmlmaWVyKCkgeworCisJCQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoU3RyaW5nIGhvc3RuYW1lLCBTU0xTZXNzaW9uIHNlc3Npb24pIHsKKworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCisJCWlmIChwcm90b2NvbCA9PSBudWxsIHx8IHByb3RvY29sLmlzRW1wdHkoKSB8fCBwcm90b2NvbC5lcXVhbHMoQ29uc3RhbnRzLkhUVFApKSB7CisJCQliYWNrZW5kSHR0cENsaWVudCA9IEh0dHBDbGllbnRzLmNyZWF0ZURlZmF1bHQoKTsKKwkJCXRoaXMuYmFja2VuZEhvc3QgPSBDb25zdGFudHMuSFRUUCArICI6Ly8iICsgYmFja2VuZEhvc3Q7CisJCX0gZWxzZSB7CisJCQkvLyBOVUxMIGNhbiBiZSByZXR1cm5lZCBpbiBjYXNlIG9mIGVycm9yCisJCQliYWNrZW5kSHR0cENsaWVudCA9IGdldFNzbENsaWVudCgpOworCQkJdGhpcy5iYWNrZW5kSG9zdCA9IENvbnN0YW50cy5IVFRQUyArICI6Ly8iICsgYmFja2VuZEhvc3Q7CisJCX0KKworCX0KKworCXB1YmxpYyBIb3N0bmFtZVZlcmlmaWVyIGdldEhvc3RuYW1lVmVyaWZpZXIoKSB7CisJCXJldHVybiBob3N0bmFtZVZlcmlmaWVyOworCX0KKworCXByaXZhdGUgQ2xvc2VhYmxlSHR0cENsaWVudCBnZXRTc2xDbGllbnQoKSB7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwQ2xpZW50ID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJLy8gU1NMQ29udGV4dEJ1aWxkZXIgaXMgbm90IHRocmVhZCBzYWZlCisJCQlTU0xDb250ZXh0QnVpbGRlciBidWlsZGVyID0gbmV3IFNTTENvbnRleHRCdWlsZGVyKCk7CisJCQlidWlsZGVyLmxvYWRUcnVzdE1hdGVyaWFsKG51bGwsIG5ldyBUcnVzdFNlbGZTaWduZWRTdHJhdGVneSgpKTsKKwkJCVNTTENvbnRleHQgc3NsQ29udGV4dCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworCQkJaHR0cENsaWVudCA9IEh0dHBDbGllbnRCdWlsZGVyLmNyZWF0ZSgpLnNldFNTTEhvc3RuYW1lVmVyaWZpZXIoaG9zdG5hbWVWZXJpZmllcikuc2V0U3NsY29udGV4dChzc2xDb250ZXh0KQorCQkJCQkuYnVpbGQoKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGh0dHBzIGNsaWVudCIsIGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gaHR0cENsaWVudDsKKworCX0KKworCXB1YmxpYyBSZXNwb25zZUluZm8gZm9yd2FyZFJlcXVlc3RUb0JhY2tlbmQoSHR0cFJlcXVlc3RJbmZvIHJlcXVlc3RJbmZvLCBMaXN0PFN0cmluZz4gcmVxdWlyZWRIZWFkZXJzLAorCQkJQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisKKwkJUmVzcG9uc2VJbmZvIHJlc3BvbnNlSW5mbyA9IG51bGw7CisJCWxvZy5kZWJ1ZygiZm9yd2FyZFJlcXVlc3RUb0JhY2tlbmQiKTsKKwkJaWYgKGJhY2tlbmRIdHRwQ2xpZW50ID09IG51bGwpIHsKKwkJCXJlc3BvbnNlSW5mbyA9IG5ldyBSZXNwb25zZUluZm8oUmVzcG9uc2VTdGF0dXNFbnVtLklOVEVSTkFMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBodHRwcyBjbGllbnQiKTsKKwkJCUF1ZGl0LmVycm9yKGxvZywgcmVxdWVzdEluZm8sIEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKwkJCWFzeW5jUmVzcG9uc2UucmVzdW1lKAorCQkJCQlSZXNwb25zZS5zdGF0dXMoSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpLmVudGl0eShyZXNwb25zZUluZm8udG9TdHJpbmcoKSkuYnVpbGQoKSk7CisJCQlyZXR1cm4gcmVzcG9uc2VJbmZvOworCQl9CisKKwkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKwkJaW50IHN0YXR1cyA9IEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworCQlIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdChiYWNrZW5kSG9zdCArIGJhY2tlbmRDb250ZXh0KTsKKwkJdHJ5IHsKKworCQkJbG9nLmRlYnVnKCJFeGVjdXRpbmcgcmVxdWVzdCB7fSIsIGh0dHBQb3N0LmdldFJlcXVlc3RMaW5lKCkpOworCQkJaHR0cFBvc3Quc2V0RW50aXR5KG5ldyBJbnB1dFN0cmVhbUVudGl0eShyZXF1ZXN0SW5mby5nZXRSZXF1ZXN0RGF0YSgpKSk7CisJCQlib29sZWFuIGFsbEhlYWRlcnNBcmVTZXQgPSBjb3B5SGVhZGVyc1RvUmVxdWVzdChyZXF1aXJlZEhlYWRlcnMsIHJlcXVlc3RJbmZvLCBodHRwUG9zdCk7CisJCQlpZiAoIWFsbEhlYWRlcnNBcmVTZXQpIHsKKwkJCQlyZXNwb25zZUluZm8gPSBuZXcgUmVzcG9uc2VJbmZvKFJlc3BvbnNlU3RhdHVzRW51bS5NSVNTSU5HX0hFQURFUlMsICJSZXF1aXJlZCBoZWFkZXJzIGFyZSBtaXNzaW5nIik7CisJCQkJYXN5bmNSZXNwb25zZQorCQkJCQkJLnJlc3VtZShSZXNwb25zZS5zdGF0dXMoSHR0cFN0YXR1cy5TQ19CQURfUkVRVUVTVCkuZW50aXR5KHJlc3BvbnNlSW5mby50b1N0cmluZygpKS5idWlsZCgpKTsKKwkJCQlBdWRpdC5lcnJvcihsb2csIHJlcXVlc3RJbmZvLCBIdHRwU3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2UgPSBiYWNrZW5kSHR0cENsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCQlzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJCWFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmVudGl0eShyZXNwb25zZS5nZXRFbnRpdHkoKSkuYnVpbGQoKSk7CisJCQl9CisJCQlBdWRpdC5pbmZvKGxvZywgcmVxdWVzdEluZm8sIHN0YXR1cyk7CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJjb25uZWN0aW9uIHdpdGggYmFja2VuZCBmYWlsZWQgd2l0aCBleGNlcHRpb24iLCBlKTsKKwkJCXJlc3BvbnNlSW5mbyA9IG5ldyBSZXNwb25zZUluZm8oUmVzcG9uc2VTdGF0dXNFbnVtLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7CisJCQlBdWRpdC5lcnJvcihsb2csIHJlcXVlc3RJbmZvLCBIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisJCQlhc3luY1Jlc3BvbnNlLnJlc3VtZSgKKwkJCQkJUmVzcG9uc2Uuc3RhdHVzKEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKS5lbnRpdHkocmVzcG9uc2VJbmZvLnRvU3RyaW5nKCkpLmJ1aWxkKCkpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJCQlyZXNwb25zZS5jbG9zZSgpOworCQkJCX0KKwkJCQliYWNrZW5kSHR0cENsaWVudC5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGNsb3NlIGh0dHBDbGllbnQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiByZXNwb25zZUluZm87CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29weUhlYWRlcnNUb1JlcXVlc3QoTGlzdDxTdHJpbmc+IHJlcXVpcmVkSGVhZGVycywgSHR0cFJlcXVlc3RJbmZvIHJlcXVlc3RJbmZvLCBIdHRwUG9zdCBodHRwUG9zdCkgeworCQlib29sZWFuIGFsbEhlYWRlcnNBcmVTZXQgPSBmYWxzZTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBvcmlnaW5hbEhlYWRlcnMgPSByZXF1ZXN0SW5mby5nZXRIZWFkZXJzKCk7CisJCWZvciAoU3RyaW5nIGhlYWRlck5hbWUgOiByZXF1aXJlZEhlYWRlcnMpIHsKKwkJCVN0cmluZyBoZWFkZXJWYWx1ZSA9IG9yaWdpbmFsSGVhZGVycy5nZXQoaGVhZGVyTmFtZSk7CisJCQlpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkgeworCQkJCWh0dHBQb3N0LnNldEhlYWRlcihoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5lcnJvcigibWlzc2luZyByZXF1aXJlZCBoZWFkZXIgIiArIGhlYWRlck5hbWUpOworCQkJCXJldHVybiBhbGxIZWFkZXJzQXJlU2V0OworCQkJfQorCQl9CisJCWFsbEhlYWRlcnNBcmVTZXQgPSB0cnVlOworCQlyZXR1cm4gYWxsSGVhZGVyc0FyZVNldDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9pbXBsL0F1ZGl0LmphdmEgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvaW1wbC9BdWRpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWQ4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvaW1wbC9BdWRpdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5mZS5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitwdWJsaWMgY2xhc3MgQXVkaXQgeworCisJcHJpdmF0ZSBBdWRpdCgpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoTG9nZ2VyIGxvZywgSHR0cFJlcXVlc3RJbmZvIHJlcXVlc3RJbmZvLCBpbnQgc3RhdHVzKSB7CisJCVN0cmluZyBlcnJvck1zZyA9ICJJbnRlcm5hbCBFcnJvciI7CisJCWlmIChyZXF1ZXN0SW5mbyAhPSBudWxsICYmIHJlcXVlc3RJbmZvLmdldEhlYWRlcnMoKSAhPSBudWxsKSB7CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcXVlc3RIZWFkZXJzID0gcmVxdWVzdEluZm8uZ2V0SGVhZGVycygpOworCQkJZXJyb3JNc2cgPSBTdHJpbmcuZm9ybWF0KENvbnN0YW50cy5FUlJPUl9MT0dfRk9STUFULCByZXF1ZXN0SGVhZGVycy5nZXQoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSwKKwkJCQkJcmVxdWVzdEhlYWRlcnMuZ2V0KENvbnN0YW50cy5GSVJTVF9OQU1FX0hFQURFUikgKyAiICIKKwkJCQkJCQkrIHJlcXVlc3RIZWFkZXJzLmdldChDb25zdGFudHMuTEFTVF9OQU1FX0hFQURFUiksCisJCQkJCXJlcXVlc3RIZWFkZXJzLmdldChDb25zdGFudHMuT1JJR0lOX0hFQURFUiksIHJlcXVlc3RIZWFkZXJzLmdldChDb25zdGFudHMuQUNDRVNTX0hFQURFUiksCisJCQkJCXJlcXVlc3RJbmZvLmdldFJlcXVlc3RVUkwoKSwgc3RhdHVzKTsKKwkJfQorCQlsb2cuZXJyb3IoZXJyb3JNc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihMb2dnZXIgbG9nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgaW50IHN0YXR1cykgeworCQlTdHJpbmcgZXJyb3JNc2cgPSAiSW50ZXJuYWwgRXJyb3IiOworCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7CisKKwkJCWVycm9yTXNnID0gU3RyaW5nLmZvcm1hdChDb25zdGFudHMuRVJST1JfTE9HX0ZPUk1BVCwgcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSURfSEVBREVSKSwKKwkJCQkJcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLkZJUlNUX05BTUVfSEVBREVSKSArICIgIgorCQkJCQkJCSsgcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLkxBU1RfTkFNRV9IRUFERVIpLAorCQkJCQlyZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuT1JJR0lOX0hFQURFUiksIHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5BQ0NFU1NfSEVBREVSKSwKKwkJCQkJcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCksIHN0YXR1cyk7CisJCX0KKwkJbG9nLmVycm9yKGVycm9yTXNnKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5mbyhMb2dnZXIgbG9nLCBIdHRwUmVxdWVzdEluZm8gcmVxdWVzdEluZm8sIGludCBzdGF0dXMpIHsKKwkJU3RyaW5nIGVycm9yTXNnID0gIkludGVybmFsIEVycm9yIjsKKwkJaWYgKHJlcXVlc3RJbmZvICE9IG51bGwgJiYgcmVxdWVzdEluZm8uZ2V0SGVhZGVycygpICE9IG51bGwpIHsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVxdWVzdEhlYWRlcnMgPSByZXF1ZXN0SW5mby5nZXRIZWFkZXJzKCk7CisJCQllcnJvck1zZyA9IFN0cmluZy5mb3JtYXQoQ29uc3RhbnRzLkVSUk9SX0xPR19GT1JNQVQsIHJlcXVlc3RIZWFkZXJzLmdldChDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpLAorCQkJCQlyZXF1ZXN0SGVhZGVycy5nZXQoQ29uc3RhbnRzLkZJUlNUX05BTUVfSEVBREVSKSArICIgIgorCQkJCQkJCSsgcmVxdWVzdEhlYWRlcnMuZ2V0KENvbnN0YW50cy5MQVNUX05BTUVfSEVBREVSKSwKKwkJCQkJcmVxdWVzdEhlYWRlcnMuZ2V0KENvbnN0YW50cy5PUklHSU5fSEVBREVSKSwgcmVxdWVzdEhlYWRlcnMuZ2V0KENvbnN0YW50cy5BQ0NFU1NfSEVBREVSKSwKKwkJCQkJcmVxdWVzdEluZm8uZ2V0UmVxdWVzdFVSTCgpLCBzdGF0dXMpOworCQl9CisJCWxvZy5pbmZvKGVycm9yTXNnKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvaW1wbC9DcnVkT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvaW1wbC9DcnVkT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmYzAyYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9pbXBsL0NydWRPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmUuaW1wbDsKKworcHVibGljIGVudW0gQ3J1ZE9wZXJhdGlvbiB7CisKKwlDUkVBVEUsIFJFVFJJRVZFLCBVUERBVEUsIERFTEVURQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2ltcGwvSHR0cFJlcXVlc3RJbmZvLmphdmEgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvaW1wbC9IdHRwUmVxdWVzdEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJhNDFmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2ltcGwvSHR0cFJlcXVlc3RJbmZvLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmZlLmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKK3B1YmxpYyBjbGFzcyBIdHRwUmVxdWVzdEluZm8geworCisJcHVibGljIEh0dHBSZXF1ZXN0SW5mbyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwLCBTdHJpbmcgZGF0YSkgeworCQloZWFkZXJzID0gaGVhZGVyc01hcDsKKwkJcmVxdWVzdFVSTCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlyZXF1ZXN0RGF0YSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhLmdldEJ5dGVzKCkpOworCQlvcmlnaW5TZXJ2bGV0Q29udGV4dCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyczsKKwlwcml2YXRlIFN0cmluZyByZXF1ZXN0VVJMOworCXByaXZhdGUgSW5wdXRTdHJlYW0gcmVxdWVzdERhdGE7CisJcHJpdmF0ZSBTdHJpbmcgb3JpZ2luU2VydmxldENvbnRleHQ7CisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRIZWFkZXJzKCkgeworCQlyZXR1cm4gaGVhZGVyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIZWFkZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgeworCQl0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSTCgpIHsKKwkJcmV0dXJuIHJlcXVlc3RVUkw7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSTChTdHJpbmcgcmVxdWVzdFVSTCkgeworCQl0aGlzLnJlcXVlc3RVUkwgPSByZXF1ZXN0VVJMOworCX0KKworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXF1ZXN0RGF0YSgpIHsKKwkJcmV0dXJuIHJlcXVlc3REYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVlc3REYXRhKElucHV0U3RyZWFtIHJlcXVlc3REYXRhKSB7CisJCXRoaXMucmVxdWVzdERhdGEgPSByZXF1ZXN0RGF0YTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE9yaWdpblNlcnZsZXRDb250ZXh0KCkgeworCQlyZXR1cm4gb3JpZ2luU2VydmxldENvbnRleHQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3JpZ2luU2VydmxldENvbnRleHQoU3RyaW5nIG9yaWdpblNlcnZsZXRDb250ZXh0KSB7CisJCXRoaXMub3JpZ2luU2VydmxldENvbnRleHQgPSBvcmlnaW5TZXJ2bGV0Q29udGV4dDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvaW1wbC9JbXBvcnRNZXRhZGF0YS5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2ltcGwvSW1wb3J0TWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDBhYTdiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2ltcGwvSW1wb3J0TWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmUuaW1wbDsKKworcHVibGljIGNsYXNzIEltcG9ydE1ldGFkYXRhIHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBsb25nIHNpemU7CisJcHJpdmF0ZSBTdHJpbmcgbWltZTsKKwlwcml2YXRlIFN0cmluZyBjcmVhdG9yOworCXByaXZhdGUgU3RyaW5nIG1kNUNoZWNrc3VtOworCisJcHVibGljIEltcG9ydE1ldGFkYXRhKFN0cmluZyBuYW1lLCBsb25nIHNpemUsIFN0cmluZyBtaW1lLCBTdHJpbmcgY3JlYXRvciwgU3RyaW5nIG1kNUNoZWNrc3VtKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuc2l6ZSA9IHNpemU7CisJCXRoaXMubWltZSA9IG1pbWU7CisJCXRoaXMuY3JlYXRvciA9IGNyZWF0b3I7CisJCXRoaXMubWQ1Q2hlY2tzdW0gPSBtZDVDaGVja3N1bTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworCQlyZXR1cm4gc2l6ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTaXplKGxvbmcgc2l6ZSkgeworCQl0aGlzLnNpemUgPSBzaXplOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWltZSgpIHsKKwkJcmV0dXJuIG1pbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWltZShTdHJpbmcgbWltZSkgeworCQl0aGlzLm1pbWUgPSBtaW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRvcigpIHsKKwkJcmV0dXJuIGNyZWF0b3I7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRvcihTdHJpbmcgY3JlYXRvcikgeworCQl0aGlzLmNyZWF0b3IgPSBjcmVhdG9yOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWQ1Q2hlY2tzdW0oKSB7CisJCXJldHVybiBtZDVDaGVja3N1bTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZDVDaGVja3N1bShTdHJpbmcgbWQ1Q2hlY2tzdW0pIHsKKwkJdGhpcy5tZDVDaGVja3N1bSA9IG1kNUNoZWNrc3VtOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2xpc3Rlbi9GRUFwcENvbnRleHRMaXN0ZW5lci5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2xpc3Rlbi9GRUFwcENvbnRleHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzJjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvbGlzdGVuL0ZFQXBwQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmZlLmxpc3RlbjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0RXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRXh0ZXJuYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5saXN0ZW5lci5BcHBDb250ZXh0TGlzdGVuZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLm1vbml0b3JpbmcuRmVNb25pdG9yaW5nU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy5IZWFsdGhDaGVja1NlcnZpY2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEZFQXBwQ29udGV4dExpc3RlbmVyIGV4dGVuZHMgQXBwQ29udGV4dExpc3RlbmVyIGltcGxlbWVudHMgU2VydmxldENvbnRleHRMaXN0ZW5lciB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRkVBcHBDb250ZXh0TGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyB2b2lkIGNvbnRleHRJbml0aWFsaXplZChTZXJ2bGV0Q29udGV4dEV2ZW50IGNvbnRleHQpIHsKKworCQlzdXBlci5jb250ZXh0SW5pdGlhbGl6ZWQoY29udGV4dCk7CisKKwkJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoCisJCQkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyYXRpb25Tb3VyY2UoKSk7CisJCWxvZy5kZWJ1ZygibG9hZGluZyBjb25maWd1cmF0aW9uIGZyb20gY29uZmlnRGlyOnt9IGFwcE5hbWU6e30iLCBFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q29uZmlnRGlyKCksCisJCQkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldEFwcE5hbWUoKSk7CisJCWNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSLCBjb25maWd1cmF0aW9uTWFuYWdlcik7CisKKwkJLy8gSGVhbHRoIENoZWNrIHNlcnZpY2UKKwkJSGVhbHRoQ2hlY2tTZXJ2aWNlIGhjcyA9IG5ldyBIZWFsdGhDaGVja1NlcnZpY2UoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKwkJaGNzLnN0YXJ0KGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRIZWFsdGhDaGVja0ludGVydmFsSW5TZWNvbmRzKDUpKTsKKwkJY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuSEVBTFRIX0NIRUNLX1NFUlZJQ0VfQVRUUiwgaGNzKTsKKworCQkvLyBNb25pdG9yaW5nIHNlcnZpY2UKKwkJRmVNb25pdG9yaW5nU2VydmljZSBmbXMgPSBuZXcgRmVNb25pdG9yaW5nU2VydmljZShjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpOworCQlmbXMuc3RhcnQoY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpLmdldFN5c3RlbU1vbml0b3JpbmcoKS5nZXRQcm9iZUludGVydmFsSW5TZWNvbmRzKDE1KSk7CisKKwkJaWYgKGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkVSUk9SOiBjb25maWd1cmF0aW9uIHdhcyBub3QgcHJvcGVybHkgbG9hZGVkIik7CisJCQlyZXR1cm47CisJCX0KKworCQlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JQb29sID0gRXhlY3V0b3JzCisJCQkJLm5ld0ZpeGVkVGhyZWFkUG9vbChjb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0VGhyZWFkcG9vbFNpemUoKSk7CisJCWNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlRIUkVBRF9FWEVDVVRPUl9BVFRSLCBleGVjdXRvclBvb2wpOworCisJCWxvZy5kZWJ1ZygiQWZ0ZXIgZXhlY3V0aW5nIHt9IiwgdGhpcy5nZXRDbGFzcygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgY29udGV4dCkgeworCisJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvclBvb2wgPSAoRXhlY3V0b3JTZXJ2aWNlKSBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkKKwkJCQkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5USFJFQURfRVhFQ1VUT1JfQVRUUik7CisJCWlmIChleGVjdXRvclBvb2wgIT0gbnVsbCkgeworCQkJZXhlY3V0b3JQb29sLnNodXRkb3duKCk7CisJCX0KKworCQlzdXBlci5jb250ZXh0RGVzdHJveWVkKGNvbnRleHQpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvbGlzdGVuL015T2JqZWN0TWFwcGVyUHJvdmlkZXIuamF2YSBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9saXN0ZW4vTXlPYmplY3RNYXBwZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OTFiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvbGlzdGVuL015T2JqZWN0TWFwcGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmUubGlzdGVuOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5TZXJpYWxpemF0aW9uRmVhdHVyZTsKKworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgTXlPYmplY3RNYXBwZXJQcm92aWRlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxPYmplY3RNYXBwZXI+IHsKKwlmaW5hbCBPYmplY3RNYXBwZXIgZGVmYXVsdE9iamVjdE1hcHBlcjsKKworCXB1YmxpYyBNeU9iamVjdE1hcHBlclByb3ZpZGVyKCkgeworCQlkZWZhdWx0T2JqZWN0TWFwcGVyID0gY3JlYXRlRGVmYXVsdE1hcHBlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3RNYXBwZXIgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisJCXJldHVybiBkZWZhdWx0T2JqZWN0TWFwcGVyOworCX0KKworCXByaXZhdGUgc3RhdGljIE9iamVjdE1hcHBlciBjcmVhdGVEZWZhdWx0TWFwcGVyKCkgeworCQlmaW5hbCBPYmplY3RNYXBwZXIgcmVzdWx0ID0gbmV3IE9iamVjdE1hcHBlcigpOworCQlyZXN1bHQuY29uZmlndXJlKFNlcmlhbGl6YXRpb25GZWF0dXJlLklOREVOVF9PVVRQVVQsIHRydWUpOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvc2VydmxldHMvQ29uZmlnTWdyU2VydmxldC5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0NvbmZpZ01nclNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzkyMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0NvbmZpZ01nclNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGkuUmVzdENvbmZpZ3VyYXRpb25JbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5zZXJ2bGV0cy5CYXNpY1NlcnZsZXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogUm9vdCByZXNvdXJjZSAoZXhwb3NlZCBhdCAiLyIgcGF0aCkKKyAqLworQFBhdGgoIi9jb25maWdtZ3IiKQorcHVibGljIGNsYXNzIENvbmZpZ01nclNlcnZsZXQgZXh0ZW5kcyBCYXNpY1NlcnZsZXQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbmZpZ01nclNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBHRVQKKwlAUGF0aCgiL2dldCIpCisJQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnKEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBAUXVlcnlQYXJhbSgidHlwZSIpIFN0cmluZyB0eXBlKSB7CisKKwkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKwkJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSAoQ29uZmlndXJhdGlvbk1hbmFnZXIpIGNvbnRleHQKKwkJCQkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5DT05GSUdVUkFUSU9OX01BTkFHRVJfQVRUUik7CisKKwkJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlLmVxdWFscygiY29uZmlndXJhdGlvbiIpKSB7CisKKwkJCUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKTsKKwkJCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKKwkJCQlsb2cud2FybigiQ29uZmlndXJhdGlvbiBvZiB0eXBlICIgKyBDb25maWd1cmF0aW9uLmNsYXNzICsgIiB3YXMgbm90IGZvdW5kIik7CisJCQl9IGVsc2UgeworCQkJCWxvZy5pbmZvKCJUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBnZXRDb25maWcgaXMgIiArIGNvbmZpZ3VyYXRpb24pOworCisJCQkJcmVzdWx0ID0gZ3Nvbi50b0pzb24oY29uZmlndXJhdGlvbik7CisKKwkJCX0KKwkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygicmVzdCIpKSB7CisKKwkJCVJlc3RDb25maWd1cmF0aW9uSW5mbyBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0UmVzdENsaWVudENvbmZpZ3VyYXRpb24oKTsKKwkJCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKKwkJCQlsb2cud2FybigiQ29uZmlndXJhdGlvbiBvZiB0eXBlICIgKyBSZXN0Q29uZmlndXJhdGlvbkluZm8uY2xhc3MgKyAiIHdhcyBub3QgZm91bmQiKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmluZm8oIlRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGdldENvbmZpZyBpcyAiICsgY29uZmlndXJhdGlvbik7CisKKwkJCQlyZXN1bHQgPSBnc29uLnRvSnNvbihjb25maWd1cmF0aW9uKTsKKworCQkJfQorCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0NvbmZpZ1NlcnZsZXQuamF2YSBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9Db25maWdTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiYjllOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9Db25maWdTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlRpbWVvdXRIYW5kbGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5zZXJ2bGV0cy5CYXNpY1NlcnZsZXQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBSb290IHJlc291cmNlIChleHBvc2VkIGF0ICIvIiBwYXRoKQorICovCitAUGF0aCgiL2NvbmZpZyIpCitwdWJsaWMgY2xhc3MgQ29uZmlnU2VydmxldCBleHRlbmRzIEJhc2ljU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29uZmlnU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQEdFVAorCUBQYXRoKCIvZ2V0IikKKwlAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisJcHVibGljIFN0cmluZyBnZXRDb25maWcoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworCQlTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKTsKKworCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSAoQ29uZmlndXJhdGlvblNvdXJjZSkgY29udGV4dAorCQkJCS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fU09VUkNFX0FUVFIpOworCQlpZiAoY29uZmlndXJhdGlvblNvdXJjZSAhPSBudWxsKSB7CisJCQlDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uU291cmNlLmdldEFuZFdhdGNoQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uLmNsYXNzLCBudWxsKTsKKworCQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworCQkJCWxvZy53YXJuKCJDb25maWd1cmF0aW9uIG9mIHR5cGUgIiArIENvbmZpZ3VyYXRpb24uY2xhc3MgKyAiIHdhcyBub3QgZm91bmQiKTsKKwkJCX0KKwkJCWxvZy5kZWJ1Zygie30iLCBjb25maWd1cmF0aW9uKTsKKwkJCWlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisJCQkJbG9nLmluZm8oIkluZm8gbGV2ZWwgRU5BQkxFRC4uLiIpOworCQkJfQorCQkJbG9nLmluZm8oIlRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGdldENvbmZpZyBpcyAiICsgY29uZmlndXJhdGlvbik7CisKKwkJCXJlc3VsdCA9IGdzb24udG9Kc29uKGNvbmZpZ3VyYXRpb24pOworCisJCX0gZWxzZSB7CisJCQlsb2cud2FybigiU291cmNlIENvbmZpZ3VyYXRpb24gb2JqZWN0IHdhcyBub3QgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnRleHQuIik7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJQEdFVAorCUBQYXRoKCIvYXN5bmNnZXQiKQorCXB1YmxpYyB2b2lkIGFzeW5jR2V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisKKwkJYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0SGFuZGxlcihuZXcgVGltZW91dEhhbmRsZXIoKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKwkJCQlhc3luY1Jlc3BvbnNlLnJlc3VtZSgKKwkJCQkJCVJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkuZW50aXR5KCJPcGVyYXRpb24gdGltZSBvdXQuIikuYnVpbGQoKSk7CisJCQl9CisJCX0pOworCQlhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQoMywgVGltZVVuaXQuU0VDT05EUyk7CisKKwkJbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTdHJpbmcgcmVzdWx0ID0gdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpOworCQkJCWFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisJCQl9CisKKwkJCXByaXZhdGUgU3RyaW5nIHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKSB7CisKKwkJCQlyZXR1cm4gInZlcnlFeHBlbnNpdmVPcGVyYXRpb24gU1VDQ0VTUyI7CisKKwkJCX0KKwkJfSkuc3RhcnQoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9GZUhlYWx0aENoZWNrU2VydmxldC5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0ZlSGVhbHRoQ2hlY2tTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1YjMyMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9GZUhlYWx0aENoZWNrU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5zZXJ2bGV0cy5CYXNpY1NlcnZsZXQ7CisKK2ltcG9ydCBjb20uamNhYmkuYXNwZWN0cy5Mb2dnYWJsZTsKKworQExvZ2dhYmxlKHByZXBlbmQgPSB0cnVlLCB2YWx1ZSA9IExvZ2dhYmxlLlRSQUNFLCB0cmltID0gZmFsc2UpCitAUGF0aCgiL2hlYWx0aENoZWNrIikKK3B1YmxpYyBjbGFzcyBGZUhlYWx0aENoZWNrU2VydmxldCBleHRlbmRzIEJhc2ljU2VydmxldCB7CisKKwkvLyBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0KKwkvLyBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGZUhlYWx0aENoZWNrU2VydmxldC5jbGFzcy5nZXROYW1lKCkpOworCisJQEdFVAorCXB1YmxpYyBSZXNwb25zZSBnZXRGRWFuZEJlSGVhbHRoQ2hlY2soQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJU2VydmxldENvbnRleHQgY29udGV4dCA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CisJCUhlYWx0aENoZWNrU2VydmljZSBoY3MgPSAoKEhlYWx0aENoZWNrU2VydmljZSkgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkhFQUxUSF9DSEVDS19TRVJWSUNFX0FUVFIpKTsKKwkJcmV0dXJuIGhjcy5nZXRGZUhlYWx0aCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0ZlUHJveHlTZXJ2bGV0LmphdmEgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvc2VydmxldHMvRmVQcm94eVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QyOGRlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0ZlUHJveHlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQuYXBpLlJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5GZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNsZjRqLk1EQzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlQnVpbGRlcjsKKworcHVibGljIGNsYXNzIEZlUHJveHlTZXJ2bGV0IGV4dGVuZHMgU1NMUHJveHlTZXJ2bGV0IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gIiVzOi8vJXM6JXMlcyI7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZlUHJveHlTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgQ2FjaGU8U3RyaW5nLCBNZGNEYXRhPiBtZGNEYXRhQ2FjaGUgPSBDYWNoZUJ1aWxkZXIubmV3QnVpbGRlcigpLmV4cGlyZUFmdGVyV3JpdGUoMTAsIFRpbWVVbml0LlNFQ09ORFMpLmJ1aWxkKCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVVJJIHJld3JpdGVVUkkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJdHJ5IHsKKwkJCWxvZ0ZlUmVxdWVzdChyZXF1ZXN0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUZlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5GZUh0dHBMb2dnaW5nRXJyb3IsICJGRSBSZXF1ZXN0Iik7CisJCQlGZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nRmVIdHRwTG9nZ2luZ0Vycm9yKCJGRSBSZXF1ZXN0Iik7CisJCQlsb2cuZXJyb3IoIlVuZXhwZWN0ZWQgRkUgcmVxdWVzdCBsb2dnaW5nIGVycm9yIDoiLCBlKTsKKwkJfQorCQlTdHJpbmcgb3JpZ2luYWxVcmwgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOworCQlTdHJpbmcgcmVkaXJlY3RlZFVybCA9IGdldE1vZGlmaWVkVXJsKHJlcXVlc3QpOworCisJCWxvZy5kZWJ1ZygiRmVQcm94eVNlcnZsZXQgUmVkaXJlY3RpbmcgcmVxdWVzdCBmcm9tOiB7fSAsIHRvOiB7fSIsIG9yaWdpbmFsVXJsLCByZWRpcmVjdGVkVXJsKTsKKworCQlyZXR1cm4gVVJJLmNyZWF0ZShyZWRpcmVjdGVkVXJsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBvblJlc3BvbnNlU3VjY2VzcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgUmVzcG9uc2UgcHJveHlSZXNwb25zZSkgeworCQl0cnkgeworCQkJbG9nRmVSZXNwb25zZShyZXF1ZXN0LCBwcm94eVJlc3BvbnNlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUZlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5GZUh0dHBMb2dnaW5nRXJyb3IsICJGRSBSZXNwb25zZSIpOworCQkJRmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ZlSHR0cExvZ2dpbmdFcnJvcigiRkUgUmVzcG9uc2UiKTsKKwkJCWxvZy5lcnJvcigiVW5leHBlY3RlZCBGRSByZXNwb25zZSBsb2dnaW5nIGVycm9yIDoiLCBlKTsKKwkJfQorCQlzdXBlci5vblJlc3BvbnNlU3VjY2VzcyhyZXF1ZXN0LCByZXNwb25zZSwgcHJveHlSZXNwb25zZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvZ0ZlUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgaHR0cFJlcXVlc3QpIHsKKworCQlNREMuY2xlYXIoKTsKKworCQlMb25nIHRyYW5zYWN0aW9uU3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCS8vIFVVSUQgLSBJbiBGRSwgd2UgYXJlIHN1cHBvc2VkIHRvIGdldCB0aGUgYmVsb3cgaGVhZGVyIGZyb20gVUkuCisJCS8vIFdlIGRvIG5vdCBnZW5lcmF0ZSBpdCBpZiBpdCdzIG1pc3NpbmcgLSBCRSBkb2VzLgorCQlTdHJpbmcgdXVpZCA9IGh0dHBSZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUik7CisJCVN0cmluZyBzZXJ2aWNlSW5zdGFuY2VJRCA9IGh0dHBSZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuWF9FQ09NUF9TRVJWSUNFX0lEX0hFQURFUik7CisKKwkJaWYgKHV1aWQgIT0gbnVsbCAmJiB1dWlkLmxlbmd0aCgpID4gMCkgeworCQkJLy8gVXNlciBJZCBmb3IgbG9nZ2luZworCQkJU3RyaW5nIHVzZXJJZCA9IGh0dHBSZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuVVNFUl9JRF9IRUFERVIpOworCisJCQlTdHJpbmcgcmVtb3RlQWRkciA9IGh0dHBSZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKwkJCVN0cmluZyBsb2NhbEFkZHIgPSBodHRwUmVxdWVzdC5nZXRMb2NhbEFkZHIoKTsKKworCQkJbWRjRGF0YUNhY2hlLnB1dCh1dWlkLCBuZXcgTWRjRGF0YShzZXJ2aWNlSW5zdGFuY2VJRCwgdXNlcklkLCByZW1vdGVBZGRyLCBsb2NhbEFkZHIsIHRyYW5zYWN0aW9uU3RhcnRUaW1lKSk7CisKKwkJCXVwZGF0ZU1kYyh1dWlkLCBzZXJ2aWNlSW5zdGFuY2VJRCwgdXNlcklkLCByZW1vdGVBZGRyLCBsb2NhbEFkZHIsIG51bGwpOworCQl9CisJCWluSHR0cFJlcXVlc3QoaHR0cFJlcXVlc3QpOworCX0KKworCXByaXZhdGUgdm9pZCBsb2dGZVJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSBwcm94eVJlc3BvbnNlKSB7CisJCVN0cmluZyB1dWlkID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfUkVRVUVTVF9JRF9IRUFERVIpOworCQlTdHJpbmcgdHJhbnNhY3Rpb25Sb3VuZFRpbWUgPSBudWxsOworCisJCWlmICh1dWlkICE9IG51bGwpIHsKKwkJCU1kY0RhdGEgbWRjRGF0YSA9IG1kY0RhdGFDYWNoZS5nZXRJZlByZXNlbnQodXVpZCk7CisJCQlpZiAobWRjRGF0YSAhPSBudWxsKSB7CisJCQkJTG9uZyB0cmFuc2FjdGlvblN0YXJ0VGltZSA9IG1kY0RhdGEuZ2V0VHJhbnNhY3Rpb25TdGFydFRpbWUoKTsKKwkJCQlpZiAodHJhbnNhY3Rpb25TdGFydFRpbWUgIT0gbnVsbCkgey8vIHNob3VsZCduIGV2ZXIgYmUgbnVsbCwgYnV0CisJCQkJCQkJCQkJCQkJLy8ganVzdCB0byBiZSBkZWZlbnNpdmUKKwkJCQkJdHJhbnNhY3Rpb25Sb3VuZFRpbWUgPSBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdHJhbnNhY3Rpb25TdGFydFRpbWUpOworCQkJCX0KKwkJCQl1cGRhdGVNZGModXVpZCwgbWRjRGF0YS5nZXRTZXJ2aWNlSW5zdGFuY2VJRCgpLCBtZGNEYXRhLmdldFVzZXJJZCgpLCBtZGNEYXRhLmdldFJlbW90ZUFkZHIoKSwgbWRjRGF0YS5nZXRMb2NhbEFkZHIoKSwgdHJhbnNhY3Rpb25Sb3VuZFRpbWUpOworCQkJfQorCQl9CisJCW91dEh0dHBSZXNwb25zZShwcm94eVJlc3BvbnNlKTsKKworCQlNREMuY2xlYXIoKTsKKwl9CisKKwkvLyBFeHRyYWN0ZWQgZm9yIHB1cnBvc2Ugb2YgY2xlYXIgbWV0aG9kIG5hbWUsIGZvciBsb2diYWNrICVNIHBhcmFtZXRlcgorCXByaXZhdGUgdm9pZCBpbkh0dHBSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwUmVxdWVzdCkgeworCQlsb2cuaW5mbygie30ge30ge30iLCBodHRwUmVxdWVzdC5nZXRNZXRob2QoKSwgaHR0cFJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpLCBodHRwUmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKwl9CisKKwkvLyBFeHRyYWN0ZWQgZm9yIHB1cnBvc2Ugb2YgY2xlYXIgbWV0aG9kIG5hbWUsIGZvciBsb2diYWNrICVNIHBhcmFtZXRlcgorCXByaXZhdGUgdm9pZCBvdXRIdHRwUmVzcG9uc2UoUmVzcG9uc2UgcHJveHlSZXNwb25zZSkgeworCQlsb2cuaW5mbygiU0M9XCJ7fVwiIiwgcHJveHlSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZU1kYyhTdHJpbmcgdXVpZCwgU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlELCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgcmVtb3RlQWRkciwgU3RyaW5nIGxvY2FsQWRkciwgU3RyaW5nIHRyYW5zYWN0aW9uU3RhcnRUaW1lKSB7CisJCU1EQy5wdXQoInV1aWQiLCB1dWlkKTsKKwkJTURDLnB1dCgic2VydmljZUluc3RhbmNlSUQiLCBzZXJ2aWNlSW5zdGFuY2VJRCk7CisJCU1EQy5wdXQoInVzZXJJZCIsIHVzZXJJZCk7CisJCU1EQy5wdXQoInJlbW90ZUFkZHIiLCByZW1vdGVBZGRyKTsKKwkJTURDLnB1dCgibG9jYWxBZGRyIiwgbG9jYWxBZGRyKTsKKwkJTURDLnB1dCgidGltZXIiLCB0cmFuc2FjdGlvblN0YXJ0VGltZSk7CisJfQorCisJcHJpdmF0ZSBjbGFzcyBNZGNEYXRhIHsKKwkJcHJpdmF0ZSBTdHJpbmcgc2VydmljZUluc3RhbmNlSUQ7CisJCXByaXZhdGUgU3RyaW5nIHVzZXJJZDsKKwkJcHJpdmF0ZSBTdHJpbmcgcmVtb3RlQWRkcjsKKwkJcHJpdmF0ZSBTdHJpbmcgbG9jYWxBZGRyOworCQlwcml2YXRlIExvbmcgdHJhbnNhY3Rpb25TdGFydFRpbWU7CisKKwkJcHVibGljIE1kY0RhdGEoU3RyaW5nIHNlcnZpY2VJbnN0YW5jZUlELCBTdHJpbmcgdXNlcklkLCBTdHJpbmcgcmVtb3RlQWRkciwgU3RyaW5nIGxvY2FsQWRkciwgTG9uZyB0cmFuc2FjdGlvblN0YXJ0VGltZSkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuc2VydmljZUluc3RhbmNlSUQgPSBzZXJ2aWNlSW5zdGFuY2VJRDsKKwkJCXRoaXMudXNlcklkID0gdXNlcklkOworCQkJdGhpcy5yZW1vdGVBZGRyID0gcmVtb3RlQWRkcjsKKwkJCXRoaXMubG9jYWxBZGRyID0gbG9jYWxBZGRyOworCQkJdGhpcy50cmFuc2FjdGlvblN0YXJ0VGltZSA9IHRyYW5zYWN0aW9uU3RhcnRUaW1lOworCQl9CisKKwkJcHVibGljIExvbmcgZ2V0VHJhbnNhY3Rpb25TdGFydFRpbWUoKSB7CisJCQlyZXR1cm4gdHJhbnNhY3Rpb25TdGFydFRpbWU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFVzZXJJZCgpIHsKKwkJCXJldHVybiB1c2VySWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUFkZHIoKSB7CisJCQlyZXR1cm4gcmVtb3RlQWRkcjsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxBZGRyKCkgeworCQkJcmV0dXJuIGxvY2FsQWRkcjsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUluc3RhbmNlSUQoKSB7CisJCQlyZXR1cm4gc2VydmljZUluc3RhbmNlSUQ7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVkVXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKHJlcXVlc3QpOworCQlpZiAoY29uZmlnID09IG51bGwpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIHJldHJpdmUgY29uZmlndXJhdGlvbi4iKTsKKwkJfQorCQlTdHJpbmcgc2NoZW1lID0gY29uZmlnLmdldEJlUHJvdG9jb2woKTsKKwkJU3RyaW5nIHVyaSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpLnRvU3RyaW5nKCk7CisJCVN0cmluZ0J1aWxkZXIgdXJsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJdXJsLmFwcGVuZChzY2hlbWUpLmFwcGVuZCgiOi8vIikuYXBwZW5kKGNvbmZpZy5nZXRCZUhvc3QoKSk7CisJCXVybC5hcHBlbmQoIjoiKTsKKwkJaWYgKGNvbmZpZy5nZXRCZVByb3RvY29sKCkuZXF1YWxzKEJFX1BST1RPQ09MLkhUVFAuZ2V0UHJvdG9jb2xOYW1lKCkpKSB7CisJCQl1cmwuYXBwZW5kKGNvbmZpZy5nZXRCZUh0dHBQb3J0KCkpOworCQl9IGVsc2UgeworCQkJdXJsLmFwcGVuZChjb25maWcuZ2V0QmVTc2xQb3J0KCkpOworCQl9CisJCXVybC5hcHBlbmQodXJpKTsKKwkJU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOyAvLyBkPTc4OQorCQlpZiAocXVlcnlTdHJpbmcgIT0gbnVsbCkgeworCQkJdXJsLmFwcGVuZCgiPyIpLmFwcGVuZChxdWVyeVN0cmluZyk7CisJCX0KKworCQlTdHJpbmcgcmVkaXJlY3RlZFVybCA9IHVybC50b1N0cmluZygpOworCQlTdHJpbmcgb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0ID0gY29uZmlnLmdldE9uYm9hcmRpbmdGb3J3YXJkQ29udGV4dCgpOworCQlpZiAob25ib2FyZGluZ0ZvcndhcmRDb250ZXh0ID09IG51bGwgfHwgb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0LmlzRW1wdHkoKSkgeworCQkJb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0ID0gIi9vbmJvYXJkaW5nLWFwaSI7CisJCX0KKwkJcmVkaXJlY3RlZFVybCA9IHJlZGlyZWN0ZWRVcmwucmVwbGFjZSgiL3NkYzEvZmVQcm94eS9vbmJvYXJkaW5nLWFwaSIsIG9uYm9hcmRpbmdGb3J3YXJkQ29udGV4dCk7CisJCXJlZGlyZWN0ZWRVcmwgPSByZWRpcmVjdGVkVXJsLnJlcGxhY2UoIi9zZGMxL2ZlUHJveHkiLCAiL3NkYzIiKTsKKwkJcmV0dXJuIHJlZGlyZWN0ZWRVcmw7CisKKwl9CisKKwlwcml2YXRlIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgoQ29uZmlndXJhdGlvbk1hbmFnZXIpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5DT05GSUdVUkFUSU9OX01BTkFHRVJfQVRUUikpLmdldENvbmZpZ3VyYXRpb24oKTsKKwkJcmV0dXJuIGNvbmZpZzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvc2VydmxldHMvSGVhbHRoQ2hlY2tTZXJ2aWNlLmphdmEgYi9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvc2VydmxldHMvSGVhbHRoQ2hlY2tTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4ZThkNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9IZWFsdGhDaGVja1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5jb25maWcuUmVxdWVzdENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuQ2xvc2VhYmxlSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja0NvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrSW5mby5IZWFsdGhDaGVja1N0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkhlYWx0aENoZWNrV3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JOYW1lOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkZlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBIZWFsdGhDaGVja1NlcnZpY2UgeworCisJcHJpdmF0ZSBjbGFzcyBIZWFsdGhTdGF0dXMgeworCQlwdWJsaWMgU3RyaW5nIGJvZHk7CisJCXB1YmxpYyBpbnQgc3RhdHVzQ29kZTsKKworCQlwdWJsaWMgSGVhbHRoU3RhdHVzKGludCBjb2RlLCBTdHJpbmcgYm9keSkgeworCQkJdGhpcy5ib2R5ID0gYm9keTsKKwkJCXRoaXMuc3RhdHVzQ29kZSA9IGNvZGU7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gIiVzOi8vJXM6JXMvc2RjMi9yZXN0L2hlYWx0aENoZWNrIjsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgaGVhbHRoTG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoImFzZGMuZmUuaGVhbHRoY2hlY2siKTsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSGVhbHRoQ2hlY2tTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIEhlYWx0aFN0YXR1cyBsYXN0SGVhbHRoU3RhdHVzID0gbmV3IEhlYWx0aFN0YXR1cyg1MDAsICJ7fSIpOworCisJcHJpdmF0ZSBjbGFzcyBIZWFsdGhDaGVja1NjaGVkdWxlZFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQloZWFsdGhMb2dnZXIudHJhY2UoIkV4ZWN1dGluZyBGRSBIZWFsdGggQ2hlY2sgVGFzayAtIFN0YXJ0Iik7CisJCQlIZWFsdGhTdGF0dXMgY3VycmVudEhlYWx0aCA9IGNoZWNrSGVhbHRoKCk7CisJCQlpbnQgY3VycmVudEhlYWx0aFN0YXR1cyA9IGN1cnJlbnRIZWFsdGguc3RhdHVzQ29kZTsKKwkJCWhlYWx0aExvZ2dlci50cmFjZSgiRXhlY3V0aW5nIEZFIEhlYWx0aCBDaGVjayBUYXNrIC0gU3RhdHVzID0ge30iLCBjdXJyZW50SGVhbHRoU3RhdHVzKTsKKworCQkJLy8gSW4gY2FzZSBoZWFsdGggc3RhdHVzIHdhcyBjaGFuZ2VkLCBpc3N1ZSBhbGFybS9yZWNvdmVyeQorCQkJaWYgKGN1cnJlbnRIZWFsdGhTdGF0dXMgIT0gbGFzdEhlYWx0aFN0YXR1cy5zdGF0dXNDb2RlKSB7CisJCQkJbG9nLnRyYWNlKCJGRSBIZWFsdGggU3RhdGUgQ2hhbmdlZCB0byB7fS4gSXNzdWluZyBhbGFybSAvIHJlY292ZXJ5IGFsYXJtLi4uIiwgY3VycmVudEhlYWx0aFN0YXR1cyk7CisJCQkJbG9nRmVBbGFybShjdXJyZW50SGVhbHRoU3RhdHVzKTsKKwkJCX0KKworCQkJLy8gQW55d2F5LCB1cGRhdGUgbGF0ZXN0IHJlc3BvbnNlCisJCQlsYXN0SGVhbHRoU3RhdHVzID0gY3VycmVudEhlYWx0aDsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZXhlY3V0b3Igd2lsbCBleGVjdXRlIHRoZSBoZWFsdGggY2hlY2sgdGFzay4KKwkgKi8KKwlTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgaGVhbHRoQ2hlY2tFeGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKwkJCXJldHVybiBuZXcgVGhyZWFkKHIsICJGRS1IZWFsdGgtQ2hlY2stVGhyZWFkIik7CisJCX0KKwl9KTsKKwlwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisKKwlwdWJsaWMgSGVhbHRoQ2hlY2tTZXJ2aWNlKFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdGFydChpbnQgaW50ZXJ2YWwpIHsKKwkJdGhpcy5oZWFsdGhDaGVja0V4ZWN1dG9yLnNjaGVkdWxlQXRGaXhlZFJhdGUobmV3IEhlYWx0aENoZWNrU2NoZWR1bGVkVGFzaygpLCAwLCBpbnRlcnZhbCwgVGltZVVuaXQuU0VDT05EUyk7CisJfQorCisJLyoqCisJICogVG8gYmUgdXNlZCBieSB0aGUgSGVhbHRoQ2hlY2tTZXJ2bGV0CisJICogCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBSZXNwb25zZSBnZXRGZUhlYWx0aCgpIHsKKwkJcmV0dXJuIHRoaXMuYnVpbGRSZXNwb25zZShsYXN0SGVhbHRoU3RhdHVzLnN0YXR1c0NvZGUsIGxhc3RIZWFsdGhTdGF0dXMuYm9keSk7CisJfQorCisJcHJpdmF0ZSBIZWFsdGhTdGF0dXMgY2hlY2tIZWFsdGgoKSB7CisJCUNsb3NlYWJsZUh0dHBDbGllbnQgaHR0cENsaWVudCA9IG51bGw7CisJCXRyeSB7CisJCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCQkJQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKENvbmZpZ3VyYXRpb25NYW5hZ2VyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHVVJBVElPTl9NQU5BR0VSX0FUVFIpKQorCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOworCQkJU3RyaW5nIHJlZGlyZWN0ZWRVcmwgPSBTdHJpbmcuZm9ybWF0KFVSTCwgY29uZmlnLmdldEJlUHJvdG9jb2woKSwgY29uZmlnLmdldEJlSG9zdCgpLAorCQkJCQljb25maWcuZ2V0QmVIdHRwUG9ydCgpKTsKKwkJCWh0dHBDbGllbnQgPSBnZXRIdHRwQ2xpZW50KGNvbmZpZyk7CisJCQlIdHRwR2V0IGh0dHBHZXQgPSBuZXcgSHR0cEdldChyZWRpcmVjdGVkVXJsKTsKKwkJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSBiZVJlc3BvbnNlOworCQkJaW50IGJlU3RhdHVzOworCQkJU3RyaW5nIGZlQWdnSGVhbHRoQ2hlY2s7CisJCQl0cnkgeworCQkJCWJlUmVzcG9uc2UgPSBodHRwQ2xpZW50LmV4ZWN1dGUoaHR0cEdldCk7CisJCQkJYmVTdGF0dXMgPSBiZVJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQkJU3RyaW5nIGJlSnNvblJlc3BvbnNlID0gRW50aXR5VXRpbHMudG9TdHJpbmcoYmVSZXNwb25zZS5nZXRFbnRpdHkoKSk7CisJCQkJZmVBZ2dIZWFsdGhDaGVjayA9IGdldEZlSGVhbHRoQ2hlY2tJbmZvcyhnc29uLCBiZUpzb25SZXNwb25zZSk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZy5lcnJvcigiSGVhbHRoIENoZWNrIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gQkUiLCBlKTsKKwkJCQlTdHJpbmcgYmVEb3duZVJlc3BvbnNlID0gZ3Nvbi50b0pzb24oZ2V0QmVEb3duQ2hlY2tJbmZvcygpKTsKKwkJCQlyZXR1cm4gbmV3IEhlYWx0aFN0YXR1cyg1MDAsIGJlRG93bmVSZXNwb25zZSk7CisJCQl9CisJCQlyZXR1cm4gbmV3IEhlYWx0aFN0YXR1cyhiZVN0YXR1cywgZmVBZ2dIZWFsdGhDaGVjayk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlGZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuRmVIZWFsdGhDaGVja0dlbmVyYWxFcnJvciwgIlVuZXhwZWN0ZWQgRkUgSGVhbHRoIGNoZWNrIGVycm9yIik7CisJCQlGZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nRmVIZWFsdGhDaGVja0dlbmVyYWxFcnJvcigiVW5leHBlY3RlZCBGRSBIZWFsdGggY2hlY2sgZXJyb3IiKTsKKwkJCWxvZy5lcnJvcigiVW5leHBlY3RlZCBGRSBoZWFsdGggY2hlY2sgZXJyb3Ige30iLCBlLmdldE1lc3NhZ2UoKSk7CisJCQlyZXR1cm4gbmV3IEhlYWx0aFN0YXR1cyg1MDAsIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChodHRwQ2xpZW50ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlodHRwQ2xpZW50LmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgUmVzcG9uc2UgYnVpbGRSZXNwb25zZShpbnQgc3RhdHVzLCBTdHJpbmcganNvblJlc3BvbnNlKSB7CisJCWhlYWx0aExvZ2dlci50cmFjZSgiRkUgYW5kIEJFIGhlYWx0aCBjaGVjayBzdGF0dXM6IHt9IiwganNvblJlc3BvbnNlKTsKKwkJcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmVudGl0eShqc29uUmVzcG9uc2UpLmJ1aWxkKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvZ0ZlQWxhcm0oaW50IGxhc3RGZVN0YXR1cykgeworCisJCXN3aXRjaCAobGFzdEZlU3RhdHVzKSB7CisJCWNhc2UgMjAwOgorCQkJRmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkZlSGVhbHRoQ2hlY2tSZWNvdmVyeSwKKwkJCQkJIkZFIEhlYWx0aCBSZWNvdmVyZWQiKTsKKwkJCUZlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dGZUhlYWx0aENoZWNrUmVjb3ZlcnkoIkZFIEhlYWx0aCBSZWNvdmVyZWQiKTsKKwkJCWJyZWFrOworCQljYXNlIDUwMDoKKwkJCUZlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5GZUhlYWx0aENoZWNrQ29ubmVjdGlvbkVycm9yLAorCQkJCQkiQ29ubmVjdGlvbiB3aXRoIEFTREMtQkUgaXMgcHJvYmFibHkgZG93biIpOworCQkJRmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ZlSGVhbHRoQ2hlY2tFcnJvcigiQ29ubmVjdGlvbiB3aXRoIEFTREMtQkUgaXMgcHJvYmFibHkgZG93biIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RmVIZWFsdGhDaGVja0luZm9zKEdzb24gZ3NvbiwgU3RyaW5nIHJlc3BvbnNlU3RyaW5nKSB7CisJCVR5cGUgd3JhcHBlclR5cGUgPSBuZXcgVHlwZVRva2VuPEhlYWx0aENoZWNrV3JhcHBlcj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCQlIZWFsdGhDaGVja1dyYXBwZXIgaGVhbHRoQ2hlY2tXcmFwcGVyID0gZ3Nvbi5mcm9tSnNvbihyZXNwb25zZVN0cmluZywgd3JhcHBlclR5cGUpOworCQlTdHJpbmcgYXBwVmVyc2lvbiA9IEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRBcHBWZXJzaW9uKCk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJPSyI7CisJCWhlYWx0aENoZWNrV3JhcHBlci5nZXRDb21wb25lbnRzSW5mbygpCisJCQkJLmFkZChuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkZFLCBIZWFsdGhDaGVja1N0YXR1cy5VUCwgYXBwVmVyc2lvbiwgZGVzY3JpcHRpb24pKTsKKwkJcmV0dXJuIGdzb24udG9Kc29uKGhlYWx0aENoZWNrV3JhcHBlcik7CisJfQorCisJcHJpdmF0ZSBIZWFsdGhDaGVja1dyYXBwZXIgZ2V0QmVEb3duQ2hlY2tJbmZvcygpIHsKKwkJTGlzdDxIZWFsdGhDaGVja0luZm8+IGhlYWx0aENoZWNrSW5mb3MgPSBuZXcgQXJyYXlMaXN0PEhlYWx0aENoZWNrSW5mbz4oKTsKKwkJaGVhbHRoQ2hlY2tJbmZvcy5hZGQobmV3IEhlYWx0aENoZWNrSW5mbyhIZWFsdGhDaGVja0NvbXBvbmVudC5GRSwgSGVhbHRoQ2hlY2tTdGF0dXMuVVAsCisJCQkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldEFwcFZlcnNpb24oKSwgIk9LIikpOworCQloZWFsdGhDaGVja0luZm9zLmFkZChuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkJFLCBIZWFsdGhDaGVja1N0YXR1cy5ET1dOLCBudWxsLCBudWxsKSk7CisJCWhlYWx0aENoZWNrSW5mb3MuYWRkKG5ldyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQuRVMsIEhlYWx0aENoZWNrU3RhdHVzLlVOS05PV04sIG51bGwsIG51bGwpKTsKKwkJaGVhbHRoQ2hlY2tJbmZvcy5hZGQobmV3IEhlYWx0aENoZWNrSW5mbyhIZWFsdGhDaGVja0NvbXBvbmVudC5USVRBTiwgSGVhbHRoQ2hlY2tTdGF0dXMuVU5LTk9XTiwgbnVsbCwgbnVsbCkpOworCQloZWFsdGhDaGVja0luZm9zLmFkZChuZXcgSGVhbHRoQ2hlY2tJbmZvKEhlYWx0aENoZWNrQ29tcG9uZW50LkRFLCBIZWFsdGhDaGVja1N0YXR1cy5VTktOT1dOLCBudWxsLCBudWxsKSk7CisJCUhlYWx0aENoZWNrV3JhcHBlciBoY1dyYXBwZXIgPSBuZXcgSGVhbHRoQ2hlY2tXcmFwcGVyKGhlYWx0aENoZWNrSW5mb3MsICJVTktOT1dOIiwgIlVOS05PV04iKTsKKwkJcmV0dXJuIGhjV3JhcHBlcjsKKwl9CisKKwlwcml2YXRlIENsb3NlYWJsZUh0dHBDbGllbnQgZ2V0SHR0cENsaWVudChDb25maWd1cmF0aW9uIGNvbmZpZykgeworCQlpbnQgdGltZW91dCA9IDMwMDA7CisJCWludCBzb2NrZXRUaW1lb3V0ID0gY29uZmlnLmdldEhlYWx0aENoZWNrU29ja2V0VGltZW91dEluTXMoNTAwMCk7CisJCVJlcXVlc3RDb25maWcuQnVpbGRlciByZXF1ZXN0QnVpbGRlciA9IFJlcXVlc3RDb25maWcuY3VzdG9tKCk7CisJCXJlcXVlc3RCdWlsZGVyLnNldENvbm5lY3RUaW1lb3V0KHRpbWVvdXQpLnNldENvbm5lY3Rpb25SZXF1ZXN0VGltZW91dCh0aW1lb3V0KS5zZXRTb2NrZXRUaW1lb3V0KHNvY2tldFRpbWVvdXQpOworCisJCUh0dHBDbGllbnRCdWlsZGVyIGJ1aWxkZXIgPSBIdHRwQ2xpZW50QnVpbGRlci5jcmVhdGUoKTsKKwkJYnVpbGRlci5zZXREZWZhdWx0UmVxdWVzdENvbmZpZyhyZXF1ZXN0QnVpbGRlci5idWlsZCgpKTsKKwkJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvc2VydmxldHMvS2liYW5hU2VydmxldC5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0tpYmFuYVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDc4NGIzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL0tpYmFuYVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50LmFwaS5SZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkucHJveHkuUHJveHlTZXJ2bGV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgS2liYW5hU2VydmxldCBleHRlbmRzIFByb3h5U2VydmxldCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEtpYmFuYVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBVUkkgcmV3cml0ZVVSSShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCVN0cmluZyBvcmlnaW5hbFVybCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCisJCVN0cmluZyByZWRpcmVjdGVkVXJsID0gZ2V0TW9kaWZpZWRVcmwocmVxdWVzdCk7CisKKwkJbG9nLmRlYnVnKCJLaWJhbmFTZXJ2bGV0IFJlZGlyZWN0aW5nIHJlcXVlc3QgZnJvbToge30gLCB0bzoge30iLCBvcmlnaW5hbFVybCwgcmVkaXJlY3RlZFVybCk7CisKKwkJcmV0dXJuIFVSSS5jcmVhdGUocmVkaXJlY3RlZFVybCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3VzdG9taXplUHJveHlSZXF1ZXN0KFJlcXVlc3QgcHJveHlSZXF1ZXN0LCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlzdXBlci5jdXN0b21pemVQcm94eVJlcXVlc3QocHJveHlSZXF1ZXN0LCByZXF1ZXN0KTsKKworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIG9uUmVzcG9uc2VTdWNjZXNzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBSZXNwb25zZSBwcm94eVJlc3BvbnNlKSB7CisKKwkJc3VwZXIub25SZXNwb25zZVN1Y2Nlc3MocmVxdWVzdCwgcmVzcG9uc2UsIHByb3h5UmVzcG9uc2UpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZWRVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKHJlcXVlc3QpOworCQlpZiAoY29uZmlnID09IG51bGwpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIHJldHJpdmUgY29uZmlndXJhdGlvbi4iKTsKKwkJfQorCQkvLyBTdHJpbmcgc2NoZW1lID0gcmVxdWVzdC5nZXRTY2hlbWUoKTsKKwkJU3RyaW5nIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOyAvLyAvbXl3ZWJhcHAKKwkJU3RyaW5nIHNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOyAvLyAvc2VydmxldC9NeVNlcnZsZXQKKwkJU3RyaW5nIHBhdGhJbmZvID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOyAvLyAvYS9iO2M9MTIzCisJCVN0cmluZyBxdWVyeVN0cmluZyA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsgLy8gZD03ODkKKworCQlTdHJpbmdCdWlsZGVyIHVybCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXVybC5hcHBlbmQoY29uZmlnLmdldEtpYmFuYVByb3RvY29sKCkpLmFwcGVuZCgiOi8vIikuYXBwZW5kKGNvbmZpZy5nZXRLaWJhbmFIb3N0KCkpOworCQl1cmwuYXBwZW5kKCI6IikuYXBwZW5kKGNvbmZpZy5nZXRLaWJhbmFQb3J0KCkpOworCQl1cmwuYXBwZW5kKGNvbnRleHRQYXRoKS5hcHBlbmQoc2VydmxldFBhdGgpOworCisJCWlmIChwYXRoSW5mbyAhPSBudWxsKSB7CisJCQl1cmwuYXBwZW5kKHBhdGhJbmZvKTsKKwkJfQorCQlpZiAocXVlcnlTdHJpbmcgIT0gbnVsbCkgeworCQkJdXJsLmFwcGVuZCgiPyIpLmFwcGVuZChxdWVyeVN0cmluZyk7CisJCX0KKworCQlTdHJpbmcgcmVkaXJlY3RlZFVybCA9IHVybC50b1N0cmluZygpLnJlcGxhY2UoIi9zZGMxL2tpYmFuYVByb3h5LyIsICIvIik7CisJCXJldHVybiByZWRpcmVjdGVkVXJsOworCisJfQorCisJcHJpdmF0ZSBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKENvbmZpZ3VyYXRpb25NYW5hZ2VyKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpCisJCQkJLmdldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHVVJBVElPTl9NQU5BR0VSX0FUVFIpKS5nZXRDb25maWd1cmF0aW9uKCk7CisJCXJldHVybiBjb25maWc7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL1BvcnRhbFNlcnZsZXQuamF2YSBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9Qb3J0YWxTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViYTJlNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9Qb3J0YWxTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnBvcnRhbHNkay5jb3JlLm9uYm9hcmRpbmcuY3Jvc3NhcGkuRUNPTVBTU087CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5NdXRhYmxlSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkZlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBSb290IHJlc291cmNlIChleHBvc2VkIGF0ICIvIiBwYXRoKQorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUG9ydGFsU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQb3J0YWxTZXJ2bGV0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19IRUFERVJTX01TRyA9ICJNaXNzaW5nIEhlYWRlcnMgSW4gUmVxdWVzdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVpBVElPTl9FUlJPUl9NU0cgPSAiQXV0aGVyaXphdGlvbiBlcnJvciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKwkvKioKKwkgKiBFbnRyeSBwb2ludCBmcm9tIEVDT01QIHBvcnRhbAorCSAqLworCUBHRVQKKwlAUGF0aCgiL3BvcnRhbCIpCisJcHVibGljIHZvaWQgZG9HZXQoQENvbnRleHQgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBDb250ZXh0IGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkJdHJ5IHsKKwkJCWFkZFJlcXVlc3RIZWFkZXJzVXNpbmdXZWJzZWFsKHJlcXVlc3QsIHJlc3BvbnNlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUZlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5GZVBvcnRhbFNlcnZsZXRFcnJvciwgIlBvcnRhbCBTZXJ2bGV0Iik7CisJCQlGZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nRmVQb3J0YWxTZXJ2bGV0RXJyb3IoIlBvcnRhbCBTZXJ2bGV0Iik7CisJCQlsb2cuZXJyb3IoIkVycm9yIGR1cmluZyBnZXR0aW5nIHBvcnRhbCBwYWdlIiwgZSk7CisJCX0KKwl9CisJCisJLyoqCisJICogQnVpbGRpbmcgbmV3IEhUVFAgcmVxdWVzdCBhbmQgc2V0dGluZyBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBUaGUgcmVxdWVzdAorCSAqIHdpbGwgZGlzcGF0Y2ggdG8gaW5kZXguaHRtbAorCSAqIAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIHJlc3BvbnNlCisJICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRSZXF1ZXN0SGVhZGVyc1VzaW5nV2Vic2VhbChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJCisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKworCQkvLyBDcmVhdGUgbmV3IHJlcXVlc3Qgb2JqZWN0IHRvIGRpc3BhdGNoCisJCU11dGFibGVIdHRwU2VydmxldFJlcXVlc3QgbXV0YWJsZVJlcXVlc3QgPSBuZXcgTXV0YWJsZUh0dHBTZXJ2bGV0UmVxdWVzdChyZXF1ZXN0KTsKKworCQkvLyBHZXQgY29uZmlndXJhdGlvbiBvYmplY3QgKHJlYWRzIGRhdGEgZnJvbSBjb25maWd1cmF0aW9uLnlhbWwpCisJCUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldENvbmZpZ3VyYXRpb24ocmVxdWVzdCk7CisKKwkJLy8gQ2hlY2sgaWYgd2UgZ290IGhlYWRlciBmcm9tIHdlYnNlYWwKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKENvbnN0YW50cy5XRUJTRUFMX1VTRVJfSURfSEVBREVSKTsKKwkJaWYgKG51bGwgPT0gdXNlcklkKSB7CisJCQkvLyBBdXRoZW50aWNhdGlvbiB2aWEgZWNvbXAgcG9ydGFsCisJCQl0cnkgeworCQkJCVN0cmluZyB2YWxkaWF0ZUVDT01QU1NPID0gRUNPTVBTU08udmFsZGlhdGVFQ09NUFNTTyhyZXF1ZXN0KTsKKwkJCQlTdHJpbmcgdXNlcklkRnJvbUNvb2tpZSA9IEVDT01QU1NPLmdldFVzZXJJZEZyb21Db29raWUocmVxdWVzdCk7CisJCQkJaWYgKHZhbGRpYXRlRUNPTVBTU08gPT0gbnVsbCB8fCAoIiIpLmVxdWFscyh1c2VySWRGcm9tQ29va2llKSkgeworCQkJCQkvLyBUaGlzIGlzIHByb2JhYmx5IGEgd2Vic2VhbCByZXF1ZXN0LCBzbyBtaXNzaW5nIGhlYWRlciBpbiByZXF1ZXN0IHNob3VsZCBiZSBwcmludGVkLgorCQkJCQlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VU0VfUFJPWFksIE1JU1NJTkdfSEVBREVSU19NU0cpOworCQkJCX0KKwkJCQl1c2VySWQgPSB1c2VySWRGcm9tQ29va2llOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VU0VfUFJPWFksIEFVVEhPUklaQVRJT05fRVJST1JfTVNHKTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gUmVwbGFjZSB3ZWJzZWFsIGhlYWRlciB3aXRoIG9wZW4gc291cmNlIGhlYWRlcgorCQltdXRhYmxlUmVxdWVzdC5wdXRIZWFkZXIoQ29uc3RhbnRzLlVTRVJfSUQsIHVzZXJJZCk7CQorCQkKKwkJLy8gR2V0dGluZyBpZGVudGlmaWNhdGlvbiBoZWFkZXJzIGZyb20gY29uZmlndXJhdGlvbi55YW1sCisJCS8vIChpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcykgYW5kIHNldHRpbmcgdGhlbSB0byBuZXcgcmVxdWVzdAorCQkvLyBtdXRhYmxlUmVxdWVzdAorCQlMaXN0PExpc3Q8U3RyaW5nPj4gaWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMgPSBjb25maWd1cmF0aW9uLmdldElkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzKCk7CisJCWZvciAoTGlzdDxTdHJpbmc+IHBvc3NpYmxlSGVhZGVyc1RvUmVjaWV2ZSA6IGlkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzKSB7CisJCQlTdHJpbmcgYWxsb3dlZEhlYWRlclRvUGFzcyA9IHBvc3NpYmxlSGVhZGVyc1RvUmVjaWV2ZS5nZXQoMCk7CisJCQlzZXROZXdIZWFkZXIocG9zc2libGVIZWFkZXJzVG9SZWNpZXZlLCBhbGxvd2VkSGVhZGVyVG9QYXNzLCByZXF1ZXN0LCBtdXRhYmxlUmVxdWVzdCk7CisJCX0KKworCQkvLyBHZXR0aW5nIG9wdGlvbmFsIGhlYWRlcnMgZnJvbSBjb25maWd1cmF0aW9uLnlhbWwKKwkJLy8gKG9wdGlvbmFsSGVhZGVyRmllbGRzKSBhbmQgc2V0dGluZyB0aGVtIHRvIG5ldyByZXF1ZXN0IG11dGFibGVSZXF1ZXN0CisJCUxpc3Q8TGlzdDxTdHJpbmc+PiBvcHRpb25hbEhlYWRlckZpZWxkcyA9IGNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uYWxIZWFkZXJGaWVsZHMoKTsKKwkJZm9yIChMaXN0PFN0cmluZz4gcG9zc2libGVIZWFkZXJzVG9SZWNpZXZlIDogb3B0aW9uYWxIZWFkZXJGaWVsZHMpIHsKKwkJCVN0cmluZyBhbGxvd2VkSGVhZGVyVG9QYXNzID0gcG9zc2libGVIZWFkZXJzVG9SZWNpZXZlLmdldCgwKTsKKwkJCXNldE5ld0hlYWRlcihwb3NzaWJsZUhlYWRlcnNUb1JlY2lldmUsIGFsbG93ZWRIZWFkZXJUb1Bhc3MsIHJlcXVlc3QsIG11dGFibGVSZXF1ZXN0KTsKKwkJfQorCisJCS8vIFByaW50IGhlYWRlcnMgZnJvbSBvcmlnaW5hbCByZXF1ZXN0IGZvciBkZWJ1ZyBwdXJwb3NlcworCQlwcmludEhlYWRlcnMocmVxdWVzdCk7CisKKwkJLy8gSW4gY2FzZSB1c2luZyB3ZWJzZWFsLCB2YWxpZGF0ZSBhbGwgbWFuZGF0b3J5IGhlYWRlcnMgKGlkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzKSBhcmUgaW5jbHVkZWQgaW4gdGhlIG5ldyByZXF1ZXN0IChtdXRhYmxlUmVxdWVzdCkuCisJCS8vIFZpYSBlY29tcCBwb3J0YWwgZG8gbm90IG5lZWQgdG8gY2hlY2sgdGhlIGhlYWRlcnMuCisJCWJvb2xlYW4gYWxsSGVhZGVyc0V4aXN0ID0gdHJ1ZTsKKwkJaWYgKG51bGwgIT0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLldFQlNFQUxfVVNFUl9JRF9IRUFERVIpKSB7CisJCQlhbGxIZWFkZXJzRXhpc3QgPSBjaGVja0hlYWRlcnMobXV0YWJsZVJlcXVlc3QpOworCQl9CisJCQorCQlpZiAoYWxsSGVhZGVyc0V4aXN0KSB7CisJCQlhZGRDb29raWVzKHJlc3BvbnNlLCBtdXRhYmxlUmVxdWVzdCwgZ2V0TWFuZGF0b3J5SGVhZGVycyhyZXF1ZXN0KSk7CisJCQlhZGRDb29raWVzKHJlc3BvbnNlLCBtdXRhYmxlUmVxdWVzdCwgZ2V0T3B0aW9uYWxIZWFkZXJzKHJlcXVlc3QpKTsKKwkJCVJlcXVlc3REaXNwYXRjaGVyIHJkID0gcmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiaW5kZXguaHRtbCIpOworCQkJcmQuZm9yd2FyZChtdXRhYmxlUmVxdWVzdCwgcmVzcG9uc2UpOworCQl9IGVsc2UgeworCQkJcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVVNFX1BST1hZLCBNSVNTSU5HX0hFQURFUlNfTVNHKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFByaW50IGFsbCByZXF1ZXN0IGhlYWRlcnMgdG8gdGhlIGxvZworCSAqIAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICovCisJcHJpdmF0ZSB2b2lkIHByaW50SGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCVN0cmluZyBzZXNzaW9uSWQgPSAiIjsKKwkJCWlmIChyZXF1ZXN0LmdldFNlc3Npb24oKSAhPSBudWxsKSB7CisJCQkJU3RyaW5nIGlkID0gcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0SWQoKTsKKwkJCQlpZiAoaWQgIT0gbnVsbCkgeworCQkJCQlzZXNzaW9uSWQgPSBpZDsKKwkJCQl9CisJCQl9CisKKwkJCWJ1aWxkZXIuYXBwZW5kKCJSZWNlaXZpbmcgcmVxdWVzdCB3aXRoIGhlYWRlcnM6IiArIE5FV19MSU5FKTsKKwkJCWxvZy5kZWJ1Zygie30iLCByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCkpOworCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGhlYWRlck5hbWVzID0gcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworCQkJaWYgKGhlYWRlck5hbWVzICE9IG51bGwpIHsKKwkJCQl3aGlsZSAoaGVhZGVyTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQkJU3RyaW5nIGhlYWRlck5hbWUgPSBoZWFkZXJOYW1lcy5uZXh0RWxlbWVudCgpOworCQkJCQlTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihoZWFkZXJOYW1lKTsKKwkJCQkJYnVpbGRlci5hcHBlbmQoInNlc3Npb24gIiArIHNlc3Npb25JZCArICIgaGVhZGVyOiBuYW1lID0gIiArIGhlYWRlck5hbWUgKyAiLCB2YWx1ZSA9ICIgKyBoZWFkZXJWYWx1ZSArIE5FV19MSU5FKTsKKwkJCQl9CisJCQl9CisKKwkJCWxvZy5kZWJ1ZyhidWlsZGVyLnRvU3RyaW5nKCkpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBBZGQgY29va2llcyAodGhhdCB3aGVyZSBzZXQgaW4gdGhlIG5ldyByZXF1ZXN0IGhlYWRlcnMpIGluIHRoZSByZXNwb25zZQorCSAqIAorCSAqIEBwYXJhbSByZXNwb25zZQorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHBhcmFtIGhlYWRlcnMKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkQ29va2llcyhIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nW10gaGVhZGVycykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBjdXJySGVhZGVyID0gaGVhZGVyc1tpXTsKKwkJCVN0cmluZyBoZWFkZXJWYWx1ZSA9IHJlcXVlc3QuZ2V0SGVhZGVyKGN1cnJIZWFkZXIpOworCQkJaWYgKGhlYWRlclZhbHVlICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5hZGRDb29raWUobmV3IENvb2tpZShjdXJySGVhZGVyLCBoZWFkZXJWYWx1ZSkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogR2V0IG1hbmRhdG9yeSBoZWFkZXJzIChpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcykgU3RyaW5nIGFycmF5LCBhbmQKKwkgKiBjaGVja3MgdGhhdCBlYWNoIGhlYWRlciBleGlzdHMgaW4gdGhlIG5ldyByZXF1ZXN0CisJICogCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tIZWFkZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCVN0cmluZ1tdIG1hbmRhdG9yeUhlYWRlcnMgPSBnZXRNYW5kYXRvcnlIZWFkZXJzKHJlcXVlc3QpOworCisJCWJvb2xlYW4gYWxsSGVhZGVyc0V4aXN0ID0gdHJ1ZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYW5kYXRvcnlIZWFkZXJzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihtYW5kYXRvcnlIZWFkZXJzW2ldKTsKKwkJCWlmIChoZWFkZXJWYWx1ZSA9PSBudWxsKSB7CisJCQkJYWxsSGVhZGVyc0V4aXN0ID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFsbEhlYWRlcnNFeGlzdDsKKwl9CisKKwkvKioKKwkgKiBHZXQgbWFuZGF0b3J5IGhlYWRlcnMgKGlkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzKSBmcm9tCisJICogY29uZmlndXJhdGlvbi55YW1sIGZpbGUgYW5kIHJldHVybiBTdHJpbmdbXQorCSAqIAorCSAqIEBwYXJhbSByZXF1ZXN0CisJICogQHJldHVybiBTdHJpbmdbXQorCSAqLworCXByaXZhdGUgU3RyaW5nW10gZ2V0TWFuZGF0b3J5SGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRDb25maWd1cmF0aW9uKHJlcXVlc3QpOworCQlMaXN0PExpc3Q8U3RyaW5nPj4gaWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMgPSBjb25maWd1cmF0aW9uLmdldElkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzKCk7CisJCVN0cmluZ1tdIG1hbmRhdG9yeUhlYWRlcnMgPSBuZXcgU3RyaW5nW2lkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzLnNpemUoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMuc2l6ZSgpOyBpKyspIHsKKwkJCW1hbmRhdG9yeUhlYWRlcnNbaV0gPSBpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcy5nZXQoaSkuZ2V0KDApOworCQl9CisJCXJldHVybiBtYW5kYXRvcnlIZWFkZXJzOworCX0KKworCS8qKgorCSAqIEdldCBvcHRpb25hbCBoZWFkZXJzIChvcHRpb25hbEhlYWRlckZpZWxkcykgZnJvbSBjb25maWd1cmF0aW9uLnlhbWwgZmlsZQorCSAqIGFuZCByZXR1cm4gU3RyaW5nW10KKwkgKiAKKwkgKiBAcGFyYW0gcmVxdWVzdAorCSAqIEByZXR1cm4gU3RyaW5nW10KKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIGdldE9wdGlvbmFsSGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRDb25maWd1cmF0aW9uKHJlcXVlc3QpOworCQlMaXN0PExpc3Q8U3RyaW5nPj4gb3B0aW9uYWxIZWFkZXJGaWVsZHMgPSBjb25maWd1cmF0aW9uLmdldE9wdGlvbmFsSGVhZGVyRmllbGRzKCk7CisJCVN0cmluZ1tdIG9wdGlvbmFsSGVhZGVycyA9IG5ldyBTdHJpbmdbb3B0aW9uYWxIZWFkZXJGaWVsZHMuc2l6ZSgpXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25hbEhlYWRlckZpZWxkcy5zaXplKCk7IGkrKykgeworCQkJb3B0aW9uYWxIZWFkZXJzW2ldID0gb3B0aW9uYWxIZWFkZXJGaWVsZHMuZ2V0KGkpLmdldCgwKTsKKwkJfQorCQlyZXR1cm4gb3B0aW9uYWxIZWFkZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybiBDb25maWd1cmF0aW9uIG9iamVjdCB0byByZWFkIGZyb20gY29uZmlndXJhdGlvbi55YW1sCisJICogCisJICogQHBhcmFtIHJlcXVlc3QKKwkgKiBAcmV0dXJuIENvbmZpZ3VyYXRpb24KKwkgKi8KKwlwcml2YXRlIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWdNYW5hZ2VyID0gKENvbmZpZ3VyYXRpb25NYW5hZ2VyKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEF0dHJpYnV0ZShvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50cy5DT05GSUdVUkFUSU9OX01BTkFHRVJfQVRUUik7CisJCXJldHVybiBjb25maWdNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gc2V0TmV3SGVhZGVyKExpc3Q8U3RyaW5nPiBwb3NzaWJsZU9sZEhlYWRlcnMsIFN0cmluZyBuZXdIZWFkZXJUb1NldCwgSHR0cFNlcnZsZXRSZXF1ZXN0IG9sZFJlcXVlc3QsIE11dGFibGVIdHRwU2VydmxldFJlcXVlc3QgbmV3UmVxdWVzdCkgeworCQlib29sZWFuIG5ld0hlYWRlcklzU2V0ID0gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVPbGRIZWFkZXJzLnNpemUoKSAmJiAhbmV3SGVhZGVySXNTZXQ7IGkrKykgeworCQkJU3RyaW5nIGhlYWRlclZhbHVlID0gb2xkUmVxdWVzdC5nZXRIZWFkZXIocG9zc2libGVPbGRIZWFkZXJzLmdldChpKSk7CisJCQlpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkgeworCQkJCW5ld1JlcXVlc3QucHV0SGVhZGVyKG5ld0hlYWRlclRvU2V0LCBoZWFkZXJWYWx1ZSk7CisJCQkJbmV3SGVhZGVySXNTZXQgPSB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBuZXdIZWFkZXJJc1NldDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9TU0xQcm94eVNlcnZsZXQuamF2YSBiL2NhdGFsb2ctZmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9zZXJ2bGV0cy9TU0xQcm94eVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JhMjc5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL3NlcnZsZXRzL1NTTFByb3h5U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZmUuc2VydmxldHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5IdHRwQ2xpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5odHRwLkh0dHBIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkucHJveHkuUHJveHlTZXJ2bGV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc3NsLlNzbENvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NMUHJveHlTZXJ2bGV0IGV4dGVuZHMgUHJveHlTZXJ2bGV0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTU0xQcm94eVNlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBlbnVtIEJFX1BST1RPQ09MIHsKKwkJSFRUUCgiaHR0cCIpLCBTU0woInNzbCIpOworCQlwcml2YXRlIFN0cmluZyBwcm90b2NvbE5hbWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRQcm90b2NvbE5hbWUoKSB7CisJCQlyZXR1cm4gcHJvdG9jb2xOYW1lOworCQl9CisKKwkJQkVfUFJPVE9DT0woU3RyaW5nIHByb3RvY29sTmFtZSkgeworCQkJdGhpcy5wcm90b2NvbE5hbWUgPSBwcm90b2NvbE5hbWU7CisJCX0KKwl9OworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY3VzdG9taXplUHJveHlSZXF1ZXN0KFJlcXVlc3QgcHJveHlSZXF1ZXN0LCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCQlzdXBlci5jdXN0b21pemVQcm94eVJlcXVlc3QocHJveHlSZXF1ZXN0LCByZXF1ZXN0KTsKKwkJLy8gQWRkIE1pc3NpbmcgSGVhZGVycyB0byBwcm94eSByZXF1ZXN0CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGhlYWRlck5hbWVzID0gcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworCQl3aGlsZSAoaGVhZGVyTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCVN0cmluZyBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZXMubmV4dEVsZW1lbnQoKTsKKwkJCWlmICghcHJveHlSZXF1ZXN0LmdldEhlYWRlcnMoKS5jb250YWluc0tleShoZWFkZXJOYW1lKSkgeworCQkJCVN0cmluZyBoZWFkZXJWYWwgPSByZXF1ZXN0LmdldEhlYWRlcihoZWFkZXJOYW1lKTsKKwkJCQlsb2cuZGVidWcoIkFkZGluZyBtaXNzaW5nIGhlYWRlciB0byByZXF1ZXN0LCAgaGVhZGVyIG5hbWU6IHt9ICwgaGVhZGVyIHZhbHVlOiB7fSIsIGhlYWRlck5hbWUsCisJCQkJCQloZWFkZXJWYWwpOworCQkJCXByb3h5UmVxdWVzdC5oZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsKTsKKwkJCX0KKwkJfQorCQlwcm94eVJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShIdHRwSGVhZGVyLkhPU1QpOworCisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEh0dHBDbGllbnQgY3JlYXRlSHR0cENsaWVudCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwkJQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKENvbmZpZ3VyYXRpb25NYW5hZ2VyKSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldENvbnRleHQoKQorCQkJCS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkuZ2V0Q29uZmlndXJhdGlvbigpOworCQlib29sZWFuIGlzU2VjdXJlQ2xpZW50ID0gIWNvbmZpZy5nZXRCZVByb3RvY29sKCkuZXF1YWxzKEJFX1BST1RPQ09MLkhUVFAuZ2V0UHJvdG9jb2xOYW1lKCkpOworCQlIdHRwQ2xpZW50IGNsaWVudCA9IChpc1NlY3VyZUNsaWVudCkgPyBnZXRTZWN1cmVIdHRwQ2xpZW50KCkgOiBzdXBlci5jcmVhdGVIdHRwQ2xpZW50KCk7CisJCXNldFRpbWVvdXQoNjAwMDAwKTsKKwkJY2xpZW50LnNldElkbGVUaW1lb3V0KDYwMDAwMCk7CisJCWNsaWVudC5zZXRTdG9wVGltZW91dCg2MDAwMDApOworCisJCXJldHVybiBjbGllbnQ7CisJfQorCisJcHJpdmF0ZSBIdHRwQ2xpZW50IGdldFNlY3VyZUh0dHBDbGllbnQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisJCS8vIEluc3RhbnRpYXRlIGFuZCBjb25maWd1cmUgdGhlIFNzbENvbnRleHRGYWN0b3J5CisJCVNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFNzbENvbnRleHRGYWN0b3J5KHRydWUpOworCisJCS8vIEluc3RhbnRpYXRlIEh0dHBDbGllbnQgd2l0aCB0aGUgU3NsQ29udGV4dEZhY3RvcnkKKwkJSHR0cENsaWVudCBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoc3NsQ29udGV4dEZhY3RvcnkpOworCisJCS8vIENvbmZpZ3VyZSBIdHRwQ2xpZW50LCBmb3IgZXhhbXBsZToKKwkJaHR0cENsaWVudC5zZXRGb2xsb3dSZWRpcmVjdHMoZmFsc2UpOworCisJCS8vIFN0YXJ0IEh0dHBDbGllbnQKKwkJdHJ5IHsKKwkJCWh0dHBDbGllbnQuc3RhcnQoKTsKKworCQkJcmV0dXJuIGh0dHBDbGllbnQ7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisJCQl0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbih4KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWNvbnRleHQueG1sIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlYzkyNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWNvbnRleHQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmNvbnRleHQ9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dCIKKyAgeG1sbnM6YW9wPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2FvcCIgeG1sbnM6dXRpbD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsIgorICB4c2k6c2NoZW1hTG9jYXRpb249IgorICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTMuMS54c2QKKyAgICAgICAgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9jb250ZXh0IGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dC9zcHJpbmctY29udGV4dC0zLjEueHNkCisgICAgICAgIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYW9wIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYW9wL3NwcmluZy1hb3AtMy4wLnhzZAorICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3V0aWwgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsL3NwcmluZy11dGlsLTMuMC54c2QiPgorCisgIDxjb250ZXh0OmFubm90YXRpb24tY29uZmlnIC8+CisgIDxhb3A6YXNwZWN0ai1hdXRvcHJveHkgcHJveHktdGFyZ2V0LWNsYXNzPSJ0cnVlIiAvPgorCisgIDxjb250ZXh0OmNvbXBvbmVudC1zY2FuCisgICAgYmFzZS1wYWNrYWdlPSJvcmcub3BlbmVjb21wLnNkbmMuY2F0YWxvZy5iYWNrZW5kLmRhbywJICAgCisJCW9yZy5lbGFzdGljc2VhcmNoLm1hcHBpbmcsCQkKKwkJb3JnLm9wZW5lY29tcC5zZG5jLmNhdGFsb2cuYmFja2VuZC5hcnRpZmFjdHMiPgorIAorICA8L2NvbnRleHQ6Y29tcG9uZW50LXNjYW4+CisKKyAKKworICA8IS0tIDxiZWFuIGlkPSJ2YWxpZGF0b3IiIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uYmVhbnZhbGlkYXRpb24uTG9jYWxWYWxpZGF0b3JGYWN0b3J5QmVhbiIgLz4gLS0+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZ3VyYXRpb24ueWFtbCBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlOTNiMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSw3OCBAQAorIyBOZWVkZWQgZm9yIGxvZ2dpbmcgcHVycG9zZXMuIFRvIGJlIHBvcHVsYXRlZCBieSBEZXZPcHMgLSBjdXJyZW50bHkgZHVtbXkKK2ZlRnFkbjogYXNkY0ZlLmF0dC5jb20KKworIyBjYXRhbG9nIGJhY2tlbmQgaG9zdG5hbWUKK2JlSG9zdDogbG9jYWxob3N0CisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgcG9ydAorYmVIdHRwUG9ydDogODA4MAorCisjIGNhdGFsb2cgYmFja2VuZCBodHRwIGNvbnRleHQKK2JlQ29udGV4dDogL3NkYzIvcmVzdC92MS9jYXRhbG9nL3VwbG9hZC9yZXNvdXJjZXMKKworIyBjYXRhbG9nIGJhY2tlbmQgcHJvdG9jb2wKK2JlUHJvdG9jb2w6IGh0dHAKKworIyBjYXRhbG9nIGJhY2tlbmQgc3NsIHBvcnQKK2JlU3NsUG9ydDogODQ0MworCisjIHRocmVhZHBvb2wgc2l6ZSBmb3IgaGFuZGxpbmcgcmVxdWVzdHMKK3RocmVhZHBvb2xTaXplOiA1MCAKKworIyByZXF1ZXN0IHByb2Nlc3NpbmcgdGltZW91dCAoc2Vjb25kcykKK3JlcXVlc3RUaW1lb3V0OiAxMAorCitoZWFsdGhDaGVja1NvY2tldFRpbWVvdXRJbk1zOiA1MDAwCisKK2hlYWx0aENoZWNrSW50ZXJ2YWxJblNlY29uZHM6IDUKKworaWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHM6IAorICAgLQorICAgICAgICAtICZIVFRQX0lWX1VTRVIgSFRUUF9JVl9VU0VSCisgICAgICAgIC0gJml2LXVzZXIgaXYtdXNlcgorICAgLQorICAgICAgICAtICZVU0VSX0lEIFVTRVJfSUQKKyAgICAgICAgLSAmdXNlci1pZCB1c2VyLWlkCisgICAtCisgICAgICAgIC0gJkhUVFBfQ1NQX0FUVFVJRCBIVFRQX0NTUF9BVFRVSUQKKyAgICAgICAgLSAmY3NwLWF0dHVpZCBjc3AtYXR0dWlkCisgICAtCisgICAgICAgIC0gJkhUVFBfQ1NQX1dTVFlQRSBIVFRQX0NTUF9XU1RZUEUgCisgICAgICAgIC0gJmNzcC13c3R5cGUgY3NwLXdzdHlwZQorCitvcHRpb25hbEhlYWRlckZpZWxkczogCisgICAtCisgICAgICAgIC0gJkhUVFBfQ1NQX0ZJUlNUTkFNRSBIVFRQX0NTUF9GSVJTVE5BTUUKKyAgICAgICAgLSAmY3NwLWZpcnN0bmFtZSBjc3AtZmlyc3RuYW1lCisgICAtCisgICAgICAgIC0gJkhUVFBfQ1NQX0xBU1ROQU1FIEhUVFBfQ1NQX0xBU1ROQU1FCisgICAgICAgIC0gJmNzcC1sYXN0bmFtZSBjc3AtbGFzdG5hbWUKKyAgIC0KKyAgICAgICAgLSAmSFRUUF9JVl9SRU1PVEVfQUREUkVTUyBIVFRQX0lWX1JFTU9URV9BRERSRVNTCisgICAgICAgIC0gJml2LXJlbW90ZS1hZGRyZXNzIGl2LXJlbW90ZS1hZGRyZXNzCisgICAtCisgICAgICAgIC0gJkhUVFBfQ1NQX0VNQUlMIEhUVFBfQ1NQX0VNQUlMCisgICAgICAgIC0gJmNzcC1lbWFpbCBjc3AtZW1haWwKKwordmVyc2lvbjogMS4wCityZWxlYXNlZDogMjAxMi0xMS0zMAorCisjIENvbm5lY3Rpb24gcGFyYW1ldGVycworY29ubmVjdGlvbjoKKyAgICB1cmw6IGpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNi9kYgorICAgIHBvb2xTaXplOiAxNworCisjIFByb3RvY29scworcHJvdG9jb2xzOgorICAgLSBodHRwCisgICAtIGh0dHBzCisKKworc3lzdGVtTW9uaXRvcmluZzoKKyAgICBlbmFibGVkOiBmYWxzZQorICAgIGlzUHJveHk6IHRydWUKKyAgICBwcm9iZUludGVydmFsSW5TZWNvbmRzOiAxNQorCitraWJhbmFIb3N0OiBsb2NhbGhvc3QKK2tpYmFuYVBvcnQ6IDU2MDEKK2tpYmFuYVByb3RvY29sOiBodHRwCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvZWNvbXAtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgyYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDQ4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5vdGUgdGhlIGNvbnZlbnRpb25zIG9mIHRoZSBmaWVsZCB2YWx1ZXM6CisjIHR5cGUgY2FuIGJlIG9uZSBvZjogQ09ORklHX0VSUk9SLCBTWVNURU1fRVJST1IsIERBVEFfRVJST1IsIENPTk5FQ1RJT05fUFJPQkxFTQorIyBzZXZlcml0eSBjYW4gYmUgb25lIG9mOiBXQVJOLCBFUlJPUiwgRkFUQUwKKyMgYWxhcm1TZXZlcml0eSBjYW4gYmUgb25lIG9mOiBDUklUSUNBTCxNQUpPUixNSU5PUixJTkZPUk1BVElPTkFMLE5PTkUKKyMgY29kZSBpcyBhIHVuaXF1ZSBpbnRlZ2VyIGluIHJhbmdlIG9mIDMwMDMtOTk5OSAoMzAwMC0zMDAyIGFyZSBvY2N1cGllZCBmb3IgaW50ZXJuYWwgdXNhZ2UpCisjIFRoZSBhYm92ZSBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlIG91dC1vZi10aGUtYm94IGFuZCBjYW4gYmUgY2hhbmdlZCBpbiBjb2RlLiAKKyMgSW4gY2FzZSBvZiBjb25maWcgYW5kIGNvZGUgbWlzbWF0Y2gsIHRoZSBhcHByb3ByaWF0ZSBlcnJvciB3aWxsIGJlIHByaW50ZWQgdG8gbG9nCisjCisjIFJhbmdlIG9mIEZFIGNvZGVzIC0gODAwMC05OTk5CisKKworZXJyb3JzOgorICAgIEZlSGVhbHRoQ2hlY2tDb25uZWN0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09OTkVDVElPTl9QUk9CTEVNLAorICAgICAgICBjb2RlOiBBU0RDXzgwMDAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25uZWN0aW9uIGVycm9yIGR1cmluZyBGRSBIZWFsdGggQ2hlY2siLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICBGZUh0dHBMb2dnaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzgwMDEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciB3aGVuIGxvZ2dpbmcgRkUgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUlOT1IKKyAgICB9CisgICAgRmVQb3J0YWxTZXJ2bGV0RXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzgwMDIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciB3aGVuIHRyeWluZyB0byBhY2Nlc3MgRkUgUG9ydGFsIHBhZ2UiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBGZUhlYWx0aENoZWNrR2VuZXJhbEVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ184MDA0LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiR2VuZXJhbCBlcnJvciBkdXJpbmcgRkUgSGVhbHRoIENoZWNrIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgRmVIZWFsdGhDaGVja1JlY292ZXJ5OiB7CisgICAgICAgIHR5cGU6IFJFQ09WRVJZLAorICAgICAgICBjb2RlOiBBU0RDXzgwMDUsCisgICAgICAgIHNldmVyaXR5OiBJTkZPLAorICAgICAgICBkZXNjcmlwdGlvbjogIkJFIEhlYWx0aCBDaGVjayBSZWNvdmVyeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IElORk9STUFUSU9OQUwKKyAgICB9ICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9sb2diYWNrLnhtbCBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9sb2diYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDJlMTNjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2xvZ2JhY2sueG1sCkBAIC0wLDAgKzEsMTI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNvbmZpZ3VyYXRpb24gc2Nhbj0idHJ1ZSIgc2NhblBlcmlvZD0iNSBzZWNvbmRzIj4KKworCTxwcm9wZXJ0eSBzY29wZT0ic3lzdGVtIiBuYW1lPSJFQ09NUC1jb21wb25lbnQtbmFtZSIgdmFsdWU9IkFTREMiIC8+CisJPHByb3BlcnR5IHNjb3BlPSJzeXN0ZW0iIG5hbWU9IkVDT01QLXN1YmNvbXBvbmVudC1uYW1lIiB2YWx1ZT0iQVNEQy1GRSIgLz4KKwk8cHJvcGVydHkgc2NvcGU9ImNvbnRleHQiIG5hbWU9ImVuYWJsZS1hbGwtbG9nIiB2YWx1ZT0iZmFsc2UiIC8+CisJPHByb3BlcnR5IGZpbGU9IiR7Y29uZmlnLmhvbWV9L2NhdGFsb2ctZmUvY29uZmlndXJhdGlvbi55YW1sIiAvPgorCTwhLS0gdmFsdWUgdXNlZCBieSBwYXR0ZXJuIGZpZWxkIGxpc3QgKHwgLSBpcyBpbnRlci1maWVsZCBzZXBhcmF0b3IsIHx8IC0gdW5hdmFpbGFibGUgb3Igbm90IGFwcGxpY2FibGUgZmllbGQgdmFsdWUpIChtIC0gbWFuZGF0b3J5LCBvLSBvcHRpb25hbCktLT4KKwk8IS0tdGltZXN0YW1wKG0pfCByZXF1ZXN0SUQobSl8IHNlcnZpY2VJbnN0YW5jZUlEKG8pfCB0aHJlYWRJRChtKXwgcGh5c2ljYWxTZXJ2ZXJOYW1lKG8pfCBzZXJ2aWNlTmFtZShtKXwgdXNlcklEKG0pfCBsb2dMZXZlbChtKXwgc2V2ZXJpdHkobyl8IHNlcnZlcklwQWRkcmVzcyhtKXwgc2VydmVyTmFtZShtKXwgY2xpZW50SXBBZGRyZXNzKG8pfCBjbGFzc05hbWUobSl8IHRpbWVyKG8pfCBkZXRhaWxlZE1lc3NhZ2UobyktLT4KKwk8cHJvcGVydHkgbmFtZT0iZGVmYXVsdC1sb2ctcGF0dGVybiIKKwkJdmFsdWU9IiVke3l5eXktTU0tZGQnVCdISDptbTpzcy5TU1NYWFh9fCVYe3V1aWR9fCVYe3NlcnZpY2VJbnN0YW5jZUlEfXwldGhyZWFkfHwke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfXwlWHt1c2VySWR9fCVsZXZlbHwlWHthbGFybVNldmVyaXR5fXwlWHtsb2NhbEFkZHJ9fCR7ZmVGcWRufXwlWHtyZW1vdGVBZGRyfXwlbG9nZ2VyezM1fXwlWHt0aW1lcn18QWN0aXZpdHlUeXBlPSZsdDslTSZndDssIERlc2M9Jmx0OyVtc2cmZ3Q7JW4iIC8+CisKKwk8IS0tIEFsbCBsb2cgLS0+CisJPGlmIGNvbmRpdGlvbj0ncHJvcGVydHkoImVuYWJsZS1hbGwtbG9nIikuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpJz4KKwkJPHRoZW4+CisJCQk8YXBwZW5kZXIgbmFtZT0iQUxMX1JPTExJTkciCisJCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKwkJCQk8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9hbGwubG9nCisJCQkJPC9maWxlPgorCisJCQkJPHJvbGxpbmdQb2xpY3kKKwkJCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorCQkJCQk8ZmlsZU5hbWVQYXR0ZXJuPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2FsbC5sb2cuJWkKKwkJCQkJPC9maWxlTmFtZVBhdHRlcm4+CisJCQkJCTxtaW5JbmRleD4xPC9taW5JbmRleD4KKwkJCQkJPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKwkJCQk8L3JvbGxpbmdQb2xpY3k+CisKKwkJCQk8dHJpZ2dlcmluZ1BvbGljeQorCQkJCQljbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVCYXNlZFRyaWdnZXJpbmdQb2xpY3kiPgorCQkJCQk8bWF4RmlsZVNpemU+MjBNQjwvbWF4RmlsZVNpemU+CisJCQkJPC90cmlnZ2VyaW5nUG9saWN5PgorCQkJCTxlbmNvZGVyPgorCQkJCQk8cGF0dGVybj4ke2RlZmF1bHQtbG9nLXBhdHRlcm59PC9wYXR0ZXJuPgorCQkJCTwvZW5jb2Rlcj4KKwkJCTwvYXBwZW5kZXI+CisJCQkKKwkJICA8YXBwZW5kZXIgbmFtZT0iQVNZTkNfRVJST1IiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgorCSAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJBTExfUk9MTElORyIgLz4KKwk8L2FwcGVuZGVyPgorCQorCQk8L3RoZW4+CisJPC9pZj4KKworCTwhLS0gRXJyb3IgbG9nIC0tPgorCTxhcHBlbmRlciBuYW1lPSJFUlJPUl9ST0xMSU5HIgorCQljbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgorCQk8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9lcnJvci5sb2cKKwkJPC9maWxlPgorCisJCTwhLS0gZGVueSBhbGwgZXZlbnRzIHdpdGggYSBsZXZlbCBiZWxvdyBJTkZPLCB0aGF0IGlzIFRSQUNFIGFuZCBERUJVRyAtLT4KKwkJPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKwkJCTxsZXZlbD5JTkZPPC9sZXZlbD4KKwkJPC9maWx0ZXI+CisKKwkJPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorCQkJPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9lcnJvci5sb2cuJWkKKwkJCTwvZmlsZU5hbWVQYXR0ZXJuPgorCQkJPG1pbkluZGV4PjE8L21pbkluZGV4PgorCQkJPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKwkJPC9yb2xsaW5nUG9saWN5PgorCisJCTx0cmlnZ2VyaW5nUG9saWN5CisJCQljbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVCYXNlZFRyaWdnZXJpbmdQb2xpY3kiPgorCQkJPG1heEZpbGVTaXplPjIwTUI8L21heEZpbGVTaXplPgorCQk8L3RyaWdnZXJpbmdQb2xpY3k+CisJCTxlbmNvZGVyPgorCQkJPHBhdHRlcm4+JHtkZWZhdWx0LWxvZy1wYXR0ZXJufTwvcGF0dGVybj4KKwkJPC9lbmNvZGVyPgorCTwvYXBwZW5kZXI+CisKKwk8IS0tIERlYnVnIGxvZyAtLT4KKwk8YXBwZW5kZXIgbmFtZT0iREVCVUdfUk9MTElORyIKKwkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKwkJPGZpbGU+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nCisJCTwvZmlsZT4KKworCQk8IS0tIGFjY2VwdCBERUJVRyBhbmQgVFJBQ0UgbGV2ZWwgLS0+CisJCTxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+CisJCQk8ZXZhbHVhdG9yIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmJvb2xleC5HRXZlbnRFdmFsdWF0b3IiPgorCQkJCTxleHByZXNzaW9uPgorCQkJCQllLmxldmVsLnRvSW50KCkgJmx0Oz0gREVCVUcudG9JbnQoKQorCQkJCTwvZXhwcmVzc2lvbj4KKwkJCTwvZXZhbHVhdG9yPgorCQkJPE9uTWlzbWF0Y2g+REVOWTwvT25NaXNtYXRjaD4KKwkJCTxPbk1hdGNoPk5FVVRSQUw8L09uTWF0Y2g+CisJCTwvZmlsdGVyPgorCisJCTxyb2xsaW5nUG9saWN5IGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuRml4ZWRXaW5kb3dSb2xsaW5nUG9saWN5Ij4KKwkJCTxmaWxlTmFtZVBhdHRlcm4+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nLiVpCisJCQk8L2ZpbGVOYW1lUGF0dGVybj4KKwkJCTxtaW5JbmRleD4xPC9taW5JbmRleD4KKwkJCTxtYXhJbmRleD4xMDwvbWF4SW5kZXg+CisJCTwvcm9sbGluZ1BvbGljeT4KKworCQk8dHJpZ2dlcmluZ1BvbGljeQorCQkJY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKwkJCTxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKwkJPC90cmlnZ2VyaW5nUG9saWN5PgorCQk8ZW5jb2Rlcj4KKwkJCTxwYXR0ZXJuPiR7ZGVmYXVsdC1sb2ctcGF0dGVybn08L3BhdHRlcm4+CisJCTwvZW5jb2Rlcj4KKwk8L2FwcGVuZGVyPgorCQorCQk8IS0tIEFzeW5jaHJvbmljaXR5IENvbmZpZ3VyYXRpb25zIC0tPgorCTxhcHBlbmRlciBuYW1lPSJBU1lOQ19ERUJVRyIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisJICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkRFQlVHX1JPTExJTkciIC8+CisJPC9hcHBlbmRlcj4KKworCTxhcHBlbmRlciBuYW1lPSJBU1lOQ19FUlJPUiIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisJICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkVSUk9SX1JPTExJTkciIC8+CisJPC9hcHBlbmRlcj4KKworCTxyb290IGxldmVsPSJJTkZPIj4KKwkJPGFwcGVuZGVyLXJlZiByZWY9IkFTWU5DX0VSUk9SIiAvPgorCQk8YXBwZW5kZXItcmVmIHJlZj0iQVNZTkNfREVCVUciIC8+CisJCTxpZiBjb25kaXRpb249J3Byb3BlcnR5KCJlbmFibGUtYWxsLWxvZyIpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSc+CisJCQk8dGhlbj4KKwkJCQk8YXBwZW5kZXItcmVmIHJlZj0iQUxMX1JPTExJTkciIC8+CisJCQk8L3RoZW4+CisJCTwvaWY+CisJPC9yb290PgorCisJPGxvZ2dlciBuYW1lPSJvcmcub3BlbmVjb21wLnNkYyIgbGV2ZWw9IklORk8iIC8+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL3Jlc3QtY29uZmlndXJhdGlvbi1pbmZvLnlhbWwgYi9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvcmVzdC1jb25maWd1cmF0aW9uLWluZm8ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODNhZGNmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL3Jlc3QtY29uZmlndXJhdGlvbi1pbmZvLnlhbWwKQEAgLTAsMCArMSwxMiBAQAorIyByZXN0IHJlYWQgdGltZW91dCAtIG1lYW5zIG5vIHRpbWVvdXQKK3JlYWRUaW1lb3V0SW5TZWM6IDAKKworIyB3aGV0aGVyIHRvIGlnbm9yZSBjZXJ0aWZpY2F0ZQoraWdub3JlQ2VydGlmaWNhdGU6IGZhbHNlCisKKyMgdGhlIGNvbm5lY3Rpb24gcG9vbCBzaXplCitjb25uZWN0aW9uUG9vbFNpemU6IDEwIAorCisjIGNyZWF0ZSBjb25uZWN0aW9uIHRpbWVvdXQKK2Nvbm5lY3RUaW1lb3V0SW5TZWM6IDEwCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2pldHR5LWlwYWNjZXNzLnhtbCBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL2pldHR5LWlwYWNjZXNzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RiNTUxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvamV0dHktaXBhY2Nlc3MueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIENvbmZpZ3VyZSBQVUJMSUMgIi0vL0pldHR5Ly9Db25maWd1cmUvL0VOIiAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZXR0eS9jb25maWd1cmVfOV8wLmR0ZCI+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSBNaXhpbiB0aGUgU3RhdGlzdGljcyBIYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCis8Q29uZmlndXJlIGlkPSJTZXJ2ZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuU2VydmVyIj4KKworICAgIDxHZXQgaWQ9Im9sZGhhbmRsZXIiIG5hbWU9ImhhbmRsZXIiLz4KKworICAgIDxTZXQgbmFtZT0iaGFuZGxlciI+CisgICAgIDxOZXcgaWQ9IklQQWNjZXNzSGFuZGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5oYW5kbGVyLklQQWNjZXNzSGFuZGxlciI+CisgICAgICA8U2V0IG5hbWU9ImhhbmRsZXIiPjxSZWYgcmVmaWQ9Im9sZGhhbmRsZXIiLz48L1NldD4KKyAgICAgIDxTZXQgbmFtZT0id2hpdGUiPgorICAgICAgICA8QXJyYXkgdHlwZT0iU3RyaW5nIj4KKwkgICAgICA8SXRlbT4wLTI1NS4wLTI1NS4wLTI1NS4wLTI1NTwvSXRlbT4KKwk8L0FycmF5PgorICAgICAgPC9TZXQ+CisgICAgICA8U2V0IG5hbWU9ImJsYWNrIj4KKyAgICAgICAgPEFycmF5IHR5cGU9IlN0cmluZyI+CisJICAgICAgPEl0ZW0+MTI3LjAuMC4xL2JsYWNrbGlzdGVkPC9JdGVtPgorCSAgICAgIDxJdGVtPjEyNy4wLjAuMi9ibGFjay5odG1sPC9JdGVtPgorCSAgICA8L0FycmF5PgorICAgICAgPC9TZXQ+CisgICAgICA8U2V0IG5hbWU9IndoaXRlTGlzdEJ5UGF0aCI+ZmFsc2U8L1NldD4KKyAgICAgPC9OZXc+CisgICAgPC9TZXQ+Cis8L0NvbmZpZ3VyZT4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL3BvcnRhbC5wcm9wZXJ0aWVzIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvcG9ydGFsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwYzRmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL3BvcnRhbC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjggQEAKKyMgUG9ydGFsIFJFU1QgVVJMLCBlbmRzICIvYXV4YXBpIgorZWNvbXBfcmVzdF91cmwgPSBodHRwczovL3BvcnRhbC5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnL2Vjb21wcG9ydGFsL2F1eGFwaQorIAorIyBKYXZhIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZQorcG9ydGFsLmFwaS5pbXBsLmNsYXNzID0gb3JnLm9wZW5lY29tcC5zZGMuYmUuZWNvbXAuRWNvbXBJbnRJbXBsCisKKyMgQ1NQLVNTTyBVUkwKK2Vjb21wX3JlZGlyZWN0X3VybCA9IGh0dHA6Ly9wb3J0YWwuYXBpLnNpbXBsZWRlbW8ub3BlbmVjb21wLm9yZzo4OTg5L0VDT01QUE9SVEFML2xvZ2luLmh0bQorIAorIyBDb29raWUgc2V0IGJ5IENTUC1TU08KK2NzcF9jb29raWVfbmFtZSA9IGF0dEVTU2VjCisjIENTUCBzZXR0aW5nLCBtb3N0IHVzZSBQUk9EOyBERVYgYWxzbyByZWNvZ25pemVkCitjc3BfZ2F0ZV9rZWVwZXJfcHJvZF9rZXkgPSBQUk9ECisKKyMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVUVCIHNlcnZlciBuYW1lcwordWViX3VybF9saXN0ID0gCisjIFVFQiB0b3BpYyB3aGVyZSBQb3J0YWwgbGlzdGVucworZWNvbXBfcG9ydGFsX2luYm94X25hbWUgPSBFQ09NUC1QT1JUQUwtSU5CT1gtVEVTVAorIyBVRUIga2V5IGdlbmVyYXRlZCB3aGlsZSBvbi1ib2FyZGluZwordWViX2FwcF9rZXkgPSBhcHBfa2V5X2hlcmUKKyMgVUVCIHNlY3JldCBnZW5lcmF0ZWQgd2hpbGUgb24tYm9hcmRpbmcKK3VlYl9hcHBfc2VjcmV0ID0gYXBwX3NlY3JldF9oZXJlCisjIFVFQiB0b3BpYyB3aGVyZSBBcHAgbGlzdGVucwordWViX2FwcF9tYWlsYm94X25hbWUgPSBhcHBfdG9waWNfbmFtZV9oZXJlCisjIENvbnN1bWVyIGdyb3VwIG5hbWU7IG1vc3QgQXBwcyBzaG91bGQgdXNlIHtVVUlEfQordWViX2FwcF9jb25zdW1lcl9ncm91cF9uYW1lID0ge1VVSUR9CisKK2RlY3J5cHRpb25fa2V5ID0gQUdMRGRHNEQwNEJLbTJJeElXRXI4bz09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbnN0YWxsLnNoIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9pbnN0YWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDk0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2luc3RhbGwuc2gKQEAgLTAsMCArMSw2MSBAQAorIyEvYmluL3NoCisKK2V4cG9ydCBKRVRUWV9CQVNFPS9ob21lL2pldHR5L2Jhc2UKKworQ09NUD0kMQorCitmdW5jdGlvbiB1c2FnZSgpIHsKKwllY2hvICIkMCA8ZmUgfCBiZT4iCit9CisKK2Z1bmN0aW9uIGV4aXRPbkVycm9yKCkgeworCWlmIFsgJDEgLW5lIDAgXQorCXRoZW4KKwkJZWNobyAiRmFpbGVkIHJ1bm5pbmcgdGFzayAkMiIKKwkJZXhpdCAyCisJZmkKK30KKworaWYgWyAkIyAtbmUgMSBdCit0aGVuCisJdXNhZ2UKKwlleGl0IDEKKworZmkKKworL29wdC9hcHAvc2RjL2NhdGFsb2ctJHtDT01QfS9zY3JpcHRzL2luc3RhbGxKZXR0eUJhc2Uuc2gKK2V4aXRPbkVycm9yICQ/ICJpbnN0YWxsSmV0dHlCYXNlIgorCitjZCAke0pFVFRZX0JBU0V9CitleGl0T25FcnJvciAkPyAibW92ZV90b19iYXNlX2RpciIKKworbWtkaXIgLXAgc2NyaXB0cworCitjcCAvb3B0L2FwcC9zZGMvY2F0YWxvZy0ke0NPTVB9L3NjcmlwdHMvKiBzY3JpcHRzCitleGl0T25FcnJvciAkPyAiY29weV9zY3JpcHRzX2Zyb21fcnBtIgorCitjcCAvb3B0L2FwcC9zZGMvY2F0YWxvZy0ke0NPTVB9L2V4dC9qZXR0eS1pcGFjY2Vzcy54bWwgZXRjCitleGl0T25FcnJvciAkPyAib3ZlcnJpZGVfamV0dHktaXBhY2Nlc3NfbW9kdWxlLiIKKworY3AgL29wdC9hcHAvc2RjL2NhdGFsb2ctJHtDT01QfS9jYXRhbG9nLSR7Q09NUH0tKi53YXIgd2ViYXBwcworZXhpdE9uRXJyb3IgJD8gImNvcHlfd2FyIgorCitjcCAvb3B0L2FwcC9zZGMvY2F0YWxvZy0ke0NPTVB9L3NjcmlwdHMvc3RhcnRKZXR0eS5zaCAuCitleGl0T25FcnJvciAkPyAiY29weV9zdGFydEpldHR5IgorCitjcCAvb3B0L2FwcC9zZGMvY2F0YWxvZy0ke0NPTVB9L3NjcmlwdHMvanZtLnByb3BlcnRpZXMgLgorZXhpdE9uRXJyb3IgJD8gImNvcHlfanZtX3Byb3BlcnRpZXMiCisKKy4vc2NyaXB0cy91cGRhdGVTc2xQYXJhbXMuc2ggJHtKRVRUWV9CQVNFfQorZXhpdE9uRXJyb3IgJD8gInVwZGF0ZVNzbFBhcmFtc19zY3JpcHQiCisJIAorI09OTFkgRk9SIEJFCSAKKyNjcCAvb3B0L2FwcC9zZGMvY29uZmlnL2NhdGFsb2ctJHtDT01QfS9lbGFzdGljc2VhcmNoLnltbCBjb25maWcKKyNleGl0T25FcnJvciAkPyAiY29weV9lbGFzdGljc2VhcmNoX3lhbWxfdG9fY29uZmlnIgorCitta2RpciAtcCAke0pFVFRZX0JBU0V9L2NvbmZpZy9jYXRhbG9nLSR7Q09NUH0KK2NwIC1yIC9vcHQvYXBwL3NkYy9jb25maWcvY2F0YWxvZy0ke0NPTVB9LyoueG1sICR7SkVUVFlfQkFTRX0vY29uZmlnL2NhdGFsb2ctJHtDT01QfQorZXhpdE9uRXJyb3IgJD8gImNvcHlfeG1sX2ZpbGVzX3RvX2NvbmZpZyIKKworY3AgLXIgL29wdC9hcHAvc2RjL2NvbmZpZy9jYXRhbG9nLSR7Q09NUH0vKi55YW1sICR7SkVUVFlfQkFTRX0vY29uZmlnL2NhdGFsb2ctJHtDT01QfQorZXhpdE9uRXJyb3IgJD8gImNvcHlfeWFtbF9maWxlc190b19jb25maWciCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2luc3RhbGxKZXR0eUJhc2Uuc2ggYi9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2luc3RhbGxKZXR0eUJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4YWM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvaW5zdGFsbEpldHR5QmFzZS5zaApAQCAtMCwwICsxLDE0IEBACisjIS9iaW4vc2gKKworZXhwb3J0IEpFVFRZX0hPTUU9L2hvbWUvamV0dHkvamV0dHktZGlzdHJpYnV0aW9uLTkuMi43LnYyMDE1MDExNgorZXhwb3J0IEpFVFRZX0JBU0U9L2hvbWUvamV0dHkvYmFzZQorCitta2RpciAtcCAke0pFVFRZX0JBU0V9Citta2RpciAtcCAke0pFVFRZX0JBU0V9L2NvbmZpZworCitjZCAke0pFVFRZX0JBU0V9CisKK2phdmEgLWphciAkSkVUVFlfSE9NRS9zdGFydC5qYXIgLS1hZGQtdG8tc3RhcnQ9ZGVwbG95CitqYXZhIC1qYXIgJEpFVFRZX0hPTUUvc3RhcnQuamFyIC0tYWRkLXRvLXN0YXJ0ZD1odHRwLGh0dHBzLGxvZ2dpbmcsaXBhY2Nlc3MKKworY2QgLQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9qdm0ucHJvcGVydGllcyBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvanZtLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiNTEzNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvanZtLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACistWFg6TWF4UGVybVNpemU9MjU2bQorLVhteDE1MDBtCistRGNvbmZpZy5ob21lPSR7SkVUVFlfQkFTRX0vY29uZmlnCistRGxvZy5ob21lPSR7SkVUVFlfQkFTRX0vbG9ncworLURsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPSR7SkVUVFlfQkFTRX0vY29uZmlnL2NhdGFsb2ctZmUvbG9nYmFjay54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3N0YXJ0SmV0dHkuc2ggYi9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3N0YXJ0SmV0dHkuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0ZDkxZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvc3RhcnRKZXR0eS5zaApAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKKworZXhwb3J0IEpFVFRZX0hPTUU9L2hvbWUvamV0dHkvamV0dHktZGlzdHJpYnV0aW9uLTkuMi43LnYyMDE1MDExNgorZXhwb3J0IEpFVFRZX0JBU0U9L2hvbWUvamV0dHkvYmFzZQorCitldmFsICJqdm1hcmdzPWBzZWQgJy9eIy9kJyAganZtLnByb3BlcnRpZXMgfCBwYXN0ZSAtcyAtZCIjImAiCitqdm1hcmdzPWBlY2hvICRqdm1hcmdzIHwgc2VkICdzLyMvIC9nJ2AKK2VjaG8gJGp2bWFyZ3MKKworamF2YSAgLWphciAkSkVUVFlfSE9NRS9zdGFydC5qYXIgJGp2bWFyZ3MgJEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3VwZGF0ZVNzbFBhcmFtcy5zaCBiL2NhdGFsb2ctZmUvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvdXBkYXRlU3NsUGFyYW1zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTk1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3VwZGF0ZVNzbFBhcmFtcy5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKworZnVuY3Rpb24gdXNhZ2UoKSB7CisgICAgICAgIGVjaG8gIiQwIDx3b3JraW5nIGRpcj4iCit9CisKK2Z1bmN0aW9uIGV4aXRPbkVycm9yKCkgeworICAgICAgICBpZiBbICQxIC1uZSAwIF0KKyAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIkZhaWxlZCBydW5uaW5nIHRhc2sgJDIiCisgICAgICAgICAgICAgICAgZXhpdCAyCisgICAgICAgIGZpCit9CisKK2lmIFsgJCMgLW5lIDEgXQordGhlbgorICAgICAgICB1c2FnZQorCWlmIFsgJHsjT0xEUFdEfSAtbmUgMCBdCisJdGhlbgorCQljZCAtCisJZmkKKyAgICAgICAgZXhpdCAxCisKK2ZpCisKK1dPUktfRElSPSQxCisKK2NkICRXT1JLX0RJUgorCitzZWQgLWkgJ3MvXCheaHR0cHMucG9ydD1cKVwoLipcKS9cMTQ0My9nJyBzdGFydC5kL2h0dHBzLmluaQorZXhpdE9uRXJyb3IgJD8gInVwZGF0ZV9wb3J0X2luX2h0dHBzX2luaSIKKworY2QgLQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jYXRhbG9nLWZlL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDc4OTljCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0ltcGxlbWVudGF0aW9uLVRpdGxlOiBjYXRhbG9nLWZlCitJbXBsZW1lbnRhdGlvbi1WZXJzaW9uOiBBUFBMSUNBVElPTl9WRVJTSU9OCitJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQ6IG9yZy5vcGVuZWNvbXAuc2RjCitCdWlsdC1CeTogZXNvZmVyCitCdWlsZC1KZGs6IDEuNy4wXzQ1CitDcmVhdGVkLUJ5OiBBcGFjaGUgTWF2ZW4gMy4yLjEKK0FyY2hpdmVyLVZlcnNpb246IFBsZXh1cyBBcmNoaXZlcgorCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwgYi9jYXRhbG9nLWZlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiMDdiMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktd2ViLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIENvbmZpZ3VyZSBQVUJMSUMgCisgICAgIi0vL01vcnQgQmF5IENvbnN1bHRpbmcvL0RURCBDb25maWd1cmUvL0VOIiAKKyAgICAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZXR0eS9jb25maWd1cmVfOV8wLmR0ZCI+CisgCis8Q29uZmlndXJlIGNsYXNzPSJvcmcuZWNsaXBzZS5qZXR0eS53ZWJhcHAuV2ViQXBwQ29udGV4dCI+CisgICAgIDxTZXQgbmFtZT0iY29udGV4dFBhdGgiPi9zZGMxPC9TZXQ+Cis8L0NvbmZpZ3VyZT4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2NhdGFsb2ctZmUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ3MDllCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjgwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorCXZlcnNpb249IjMuMCI+CisKKwk8c2VydmxldD4KKwkJPHNlcnZsZXQtbmFtZT5qZXJzZXk8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorCQkJPHBhcmFtLXZhbHVlPm9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzPC9wYXJhbS12YWx1ZT4KKwkJPC9pbml0LXBhcmFtPgorCisJCTxpbml0LXBhcmFtPgorCQkJPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKwkJCTxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTwvcGFyYW0tdmFsdWU+CisJCTwvaW5pdC1wYXJhbT4KKwkJPGluaXQtcGFyYW0+CisJCQk8cGFyYW0tbmFtZT5jb20uc3VuLmplcnNleS5hcGkuanNvbi5QT0pPTWFwcGluZ0ZlYXR1cmU8L3BhcmFtLW5hbWU+CisJCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisJCTwvaW5pdC1wYXJhbT4KKwkJPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+amVyc2V5PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vcmVzdC8qPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlZpZXdTdGF0dXNNZXNzYWdlczwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5jaC5xb3MubG9nYmFjay5jbGFzc2ljLlZpZXdTdGF0dXNNZXNzYWdlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+Vmlld1N0YXR1c01lc3NhZ2VzPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vbGJDbGFzc2ljU3RhdHVzPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTwhLS0gUHJveHkgU2VydmVyIE9ubHkgdXNlZCBmb3IgdGVzdHMgdG8gc2ltdWxhdGUgd2ViU2VhbCAjIyBTdGFydCAjIyAtLT4KKzwhLS0gICAJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlBZG1pbjE8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+b3JnLm9wZW5lY29tcC5zZGMuZmUuc2VydmxldHMud2Vic2VhbG1vY2suV2ViU2VhbFNpbXVsYXRvclNlcnZsZXRBZG1pbjE8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlBZG1pbjE8L3NlcnZsZXQtbmFtZT4KKwkJPHVybC1wYXR0ZXJuPi9wcm94eS1hZG1pbjE8L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldD4KKwkJPHNlcnZsZXQtbmFtZT5Qcm94eUFkbWluMjwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy53ZWJzZWFsbW9jay5XZWJTZWFsU2ltdWxhdG9yU2VydmxldEFkbWluMjwvc2VydmxldC1jbGFzcz4KKwkJPGFzeW5jLXN1cHBvcnRlZD50cnVlPC9hc3luYy1zdXBwb3J0ZWQ+CisJPC9zZXJ2bGV0PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5Qcm94eUFkbWluMjwvc2VydmxldC1uYW1lPgorCQk8dXJsLXBhdHRlcm4+L3Byb3h5LWFkbWluMjwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlByb3h5QWRtaW4zPC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzLndlYnNlYWxtb2NrLldlYlNlYWxTaW11bGF0b3JTZXJ2bGV0QWRtaW4zPC9zZXJ2bGV0LWNsYXNzPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKwk8L3NlcnZsZXQ+CisKKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPlByb3h5QWRtaW4zPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vcHJveHktYWRtaW4zPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworICAgCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlByb3h5RGVzaWduZXIxPC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzLndlYnNlYWxtb2NrLldlYlNlYWxTaW11bGF0b3JTZXJ2bGV0RGVzaWduZXIxPC9zZXJ2bGV0LWNsYXNzPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKwk8L3NlcnZsZXQ+CisKKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPlByb3h5RGVzaWduZXIxPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vcHJveHktZGVzaWduZXIxPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlEZXNpZ25lcjI8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+b3JnLm9wZW5lY29tcC5zZGMuZmUuc2VydmxldHMud2Vic2VhbG1vY2suV2ViU2VhbFNpbXVsYXRvclNlcnZsZXREZXNpZ25lcjI8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlEZXNpZ25lcjI8L3NlcnZsZXQtbmFtZT4KKwkJPHVybC1wYXR0ZXJuPi9wcm94eS1kZXNpZ25lcjI8L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlByb3h5RGVzaWduZXIzPC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzLndlYnNlYWxtb2NrLldlYlNlYWxTaW11bGF0b3JTZXJ2bGV0RGVzaWduZXIzPC9zZXJ2bGV0LWNsYXNzPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKwk8L3NlcnZsZXQ+CisKKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPlByb3h5RGVzaWduZXIzPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vcHJveHktZGVzaWduZXIzPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlByb3h5VGVzdGVyMTwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy53ZWJzZWFsbW9jay5XZWJTZWFsU2ltdWxhdG9yU2VydmxldFRlc3RlcjE8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlUZXN0ZXIxPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vcHJveHktdGVzdGVyMTwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlByb3h5VGVzdGVyMjwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy53ZWJzZWFsbW9jay5XZWJTZWFsU2ltdWxhdG9yU2VydmxldFRlc3RlcjI8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlUZXN0ZXIyPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vcHJveHktdGVzdGVyMjwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisKKwk8c2VydmxldD4KKwkJPHNlcnZsZXQtbmFtZT5Qcm94eVRlc3RlcjM8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+b3JnLm9wZW5lY29tcC5zZGMuZmUuc2VydmxldHMud2Vic2VhbG1vY2suV2ViU2VhbFNpbXVsYXRvclNlcnZsZXRUZXN0ZXIzPC9zZXJ2bGV0LWNsYXNzPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKwk8L3NlcnZsZXQ+CisKKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPlByb3h5VGVzdGVyMzwvc2VydmxldC1uYW1lPgorCQk8dXJsLXBhdHRlcm4+L3Byb3h5LXRlc3RlcjM8L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5Qcm94eUdvdmVybm9yMTwvc2VydmxldC1uYW1lPgorCQk8dXJsLXBhdHRlcm4+L3Byb3h5LWdvdmVybm9yMTwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisKKwk8c2VydmxldD4KKwkJPHNlcnZsZXQtbmFtZT5Qcm94eUdvdmVybm9yMTwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy53ZWJzZWFsbW9jay5XZWJTZWFsU2ltdWxhdG9yU2VydmxldEdvdmVybm9yMTwvc2VydmxldC1jbGFzcz4KKwkJPGFzeW5jLXN1cHBvcnRlZD50cnVlPC9hc3luYy1zdXBwb3J0ZWQ+CisJPC9zZXJ2bGV0PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5Qcm94eU9wczE8L3NlcnZsZXQtbmFtZT4KKwkJPHVybC1wYXR0ZXJuPi9wcm94eS1vcHMxPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlByb3h5T3BzMTwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy53ZWJzZWFsbW9jay5XZWJTZWFsU2ltdWxhdG9yU2VydmxldE9wczE8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKworCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlQczE8L3NlcnZsZXQtbmFtZT4KKwkJPHVybC1wYXR0ZXJuPi9wcm94eS1wczE8L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorCisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHlQczE8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+b3JnLm9wZW5lY29tcC5zZGMuZmUuc2VydmxldHMud2Vic2VhbG1vY2suV2ViU2VhbFNpbXVsYXRvclNlcnZsZXRQcm9kdWN0U3RyYXRlZ2lzdDE8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4KKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPlByb3h5UG0xPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vcHJveHktcG0xPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlByb3h5UG0xPC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzLndlYnNlYWxtb2NrLldlYlNlYWxTaW11bGF0b3JTZXJ2bGV0UHJvZHVjdE1hbmdlcjE8L3NlcnZsZXQtY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCTwvc2VydmxldD4gLS0+CisJCisJPCEtLSBQcm94eSBTZXJ2ZXIgT25seSB1c2VkIGZvciB0ZXN0cyB0byBzaW11bGF0ZSB3ZWJTZWFsICMjIEVuZCAjIyAtLT4KKworCTwhLS0gRmUgUHJveHkgU2VydmxldCAtLT4KKwk8c2VydmxldD4KKwkJPHNlcnZsZXQtbmFtZT5GZVByb3h5PC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzLkZlUHJveHlTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorCisJCTxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKworCisJPC9zZXJ2bGV0PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5GZVByb3h5PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vZmVQcm94eS8qPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPlBvcnRhbDwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy5Qb3J0YWxTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKwk8L3NlcnZsZXQ+CisKKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPlBvcnRhbDwvc2VydmxldC1uYW1lPgorCQk8dXJsLXBhdHRlcm4+L3BvcnRhbDwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisJCisJPCEtLSBLaWJhbmEgcHJveHkgIC0tPgorCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPktpYmFuYVByb3h5PC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzLktpYmFuYVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisJCTxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorCQk8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKwk8L3NlcnZsZXQ+CisKKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPktpYmFuYVByb3h5PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4va2liYW5hUHJveHkvKjwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisKKworCisJPGZpbHRlcj4KKwkJPGZpbHRlci1uYW1lPmNyb3NzLW9yaWdpbi1hdHQ8L2ZpbHRlci1uYW1lPgorCQk8ZmlsdGVyLWNsYXNzPm9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXRzLkNyb3NzT3JpZ2luRmlsdGVyPC9maWx0ZXItY2xhc3M+CisJCTxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPmFsbG93ZWRPcmlnaW5zPC9wYXJhbS1uYW1lPgorCQkJPHBhcmFtLXZhbHVlPio8L3BhcmFtLXZhbHVlPgorCQk8L2luaXQtcGFyYW0+CisJCTxpbml0LXBhcmFtPgorCQkJPHBhcmFtLW5hbWU+YWxsb3dlZE1ldGhvZHM8L3BhcmFtLW5hbWU+CisJCQk8cGFyYW0tdmFsdWU+R0VULFBPU1QsT1BUSU9OUyxERUxFVEUsUFVULEhFQUQ8L3BhcmFtLXZhbHVlPgorCQk8L2luaXQtcGFyYW0+CisJCTxpbml0LXBhcmFtPgorCQkJPHBhcmFtLW5hbWU+YWxsb3dlZEhlYWRlcnM8L3BhcmFtLW5hbWU+CisJCQk8cGFyYW0tdmFsdWU+SFRUUF9DU1BfRklSU1ROQU1FLCBIVFRQX0NTUF9MQVNUTkFNRSwgVVNFUl9JRCwKKwkJCQlIVFRQX0NTUF9FTUFJTCwgWC1FQ09NUC1SZXF1ZXN0SUQsIG9yaWdpbiwgY29udGVudC10eXBlLCBhY2NlcHQsIGF1dGhvcml6YXRpb24sIENvbnRlbnQtTUQ1LFgtRUNPTVAtU2VydmljZUlEPC9wYXJhbS12YWx1ZT4KKwkJPC9pbml0LXBhcmFtPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPmFsbG93Q3JlZGVudGlhbDwvcGFyYW0tbmFtZT4KKwkJCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KKwkJPC9pbml0LXBhcmFtPgorCTwvZmlsdGVyPgorCTxmaWx0ZXItbWFwcGluZz4KKwkJPGZpbHRlci1uYW1lPmNyb3NzLW9yaWdpbi1hdHQ8L2ZpbHRlci1uYW1lPgorCQk8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorCTwvZmlsdGVyLW1hcHBpbmc+CisKKzwhLS0gIAorCTxmaWx0ZXI+CisJCTxmaWx0ZXItbmFtZT5HemlwRmlsdGVyPC9maWx0ZXItbmFtZT4KKwkJPGZpbHRlci1jbGFzcz5vcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0cy5HemlwRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxhc3luYy1zdXBwb3J0ZWQ+dHJ1ZTwvYXN5bmMtc3VwcG9ydGVkPgorCQk8aW5pdC1wYXJhbT4KKwkJCTxwYXJhbS1uYW1lPjwvcGFyYW0tbmFtZT4KKwkJCTxwYXJhbS12YWx1ZT50ZXh0L2h0bWwsdGV4dC9wbGFpbix0ZXh0L2NzcyxhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LGFwcGxpY2F0aW9uL2pzb248L3BhcmFtLXZhbHVlPgorCQk8L2luaXQtcGFyYW0+CisJCTxpbml0LXBhcmFtPgorCQkJPHBhcmFtLW5hbWU+bWV0aG9kczwvcGFyYW0tbmFtZT4KKwkJCTxwYXJhbS12YWx1ZT5nZXQscG9zdDwvcGFyYW0tdmFsdWU+CisJCTwvaW5pdC1wYXJhbT4KKwk8L2ZpbHRlcj4KKworCisJPGZpbHRlci1tYXBwaW5nPgorCQk8ZmlsdGVyLW5hbWU+R3ppcEZpbHRlcjwvZmlsdGVyLW5hbWU+CisJCTx1cmwtcGF0dGVybj4vc2RjMi8qPC91cmwtcGF0dGVybj4KKwk8L2ZpbHRlci1tYXBwaW5nPgorLS0+CisKKwk8bGlzdGVuZXI+CisJCTxsaXN0ZW5lci1jbGFzcz5vcmcub3BlbmVjb21wLnNkYy5mZS5saXN0ZW4uRkVBcHBDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgorCTwvbGlzdGVuZXI+CisKKwk8d2VsY29tZS1maWxlLWxpc3Q+CisJCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgorCTwvd2VsY29tZS1maWxlLWxpc3Q+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L1NwZWNSdW5uZXIuaHRtbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvU3BlY1J1bm5lci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjE3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L1NwZWNSdW5uZXIuaHRtbApAQCAtMCwwICsxLDM2IEBACis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorCTxoZWFkPgorCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CisJCTx0aXRsZT5KYXNtaW5lIFNwZWMgUnVubmVyIHYyLjAuMDwvdGl0bGU+CisKKwkJPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS9wbmciIGhyZWY9Imphc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9qYXNtaW5lX2Zhdmljb24ucG5nIj4KKwkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL2xpYi9qYXNtaW5lLTIuMC4wL2phc21pbmUuY3NzIj4KKworCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvamFzbWluZS5qcyI+PC9zY3JpcHQ+CisJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imphc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9qYXNtaW5lLWh0bWwuanMiPjwvc2NyaXB0PgorCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvYm9vdC5qcyI+PC9zY3JpcHQ+CisJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KKwkJPCEtLXNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMi4xLjMvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQtLT4KKwkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdFNjcmlwdHMvamFzbWluZS1maXh0dXJlLmpzIj48L3NjcmlwdD4KKwkJCisJCTxsaW5rIGhyZWY9Ii4uL21haW4vd2ViYXBwL3NjcmlwdHMvc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+CisJCTwhLS0gaW5jbHVkZSBzb3VyY2UgZmlsZXMgaGVyZS4uLiAtLT4KKworCQk8IS0tIEpTWklQIC0tPgorCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9tYWluL3dlYmFwcC9zY3JpcHRzL2pzemlwLm1pbi5qcyI+PC9zY3JpcHQ+CisJCTwhLS0gTUQ1IC0tPgorCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vY3J5cHRvLWpzLmdvb2dsZWNvZGUuY29tL3N2bi90YWdzLzMuMS4yL2J1aWxkL3JvbGx1cHMvbWQ1LmpzIj48L3NjcmlwdD4KKwkJCisJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL21haW4vd2ViYXBwL3NjcmlwdHMvZG9tSGFuZGxlci5qcyI+PC9zY3JpcHQ+CisJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL21haW4vd2ViYXBwL3NjcmlwdHMvZmlsZUhhbmRsZXIuanMiPjwvc2NyaXB0PgorCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9tYWluL3dlYmFwcC9zY3JpcHRzL2pzSGFuZGxlci5qcyI+PC9zY3JpcHQ+CisJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3RTY3JpcHRzL2ZpbGVzQ29udGVudHMuanMiPjwvc2NyaXB0PgorCQk8IS0tIGluY2x1ZGUgc3BlYyBmaWxlcyBoZXJlLi4uIC0tPgorCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJzcGVjL2NvZGVTcGVjLmpzIj48L3NjcmlwdD4KKworCTwvaGVhZD4KKworCTxib2R5PgorCTwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL01JVC5MSUNFTlNFIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvTUlULkxJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0MzViYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL01JVC5MSUNFTlNFCkBAIC0wLDAgKzEsMjAgQEAKK0NvcHlyaWdodCAoYykgMjAwOC0yMDExIFBpdm90YWwgTGFicworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9TcGVjUnVubmVyLmh0bWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9TcGVjUnVubmVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMzlmNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL1NwZWNSdW5uZXIuaHRtbApAQCAtMCwwICsxLDI2IEBACis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgPHRpdGxlPkphc21pbmUgU3BlYyBSdW5uZXIgdjIuMC4wPC90aXRsZT4KKworICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0ibGliL2phc21pbmUtMi4wLjAvamFzbWluZV9mYXZpY29uLnBuZyI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImxpYi9qYXNtaW5lLTIuMC4wL2phc21pbmUuY3NzIj4KKworICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJsaWIvamFzbWluZS0yLjAuMC9qYXNtaW5lLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibGliL2phc21pbmUtMi4wLjAvamFzbWluZS1odG1sLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibGliL2phc21pbmUtMi4wLjAvYm9vdC5qcyI+PC9zY3JpcHQ+CisKKyAgPCEtLSBpbmNsdWRlIHNvdXJjZSBmaWxlcyBoZXJlLi4uIC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJzcmMvUGxheWVyLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ic3JjL1NvbmcuanMiPjwvc2NyaXB0PgorCisgIDwhLS0gaW5jbHVkZSBzcGVjIGZpbGVzIGhlcmUuLi4gLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InNwZWMvU3BlY0hlbHBlci5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InNwZWMvUGxheWVyU3BlYy5qcyI+PC9zY3JpcHQ+CisKKzwvaGVhZD4KKworPGJvZHk+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9ib290LmpzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvYm9vdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTY4NmFmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvYm9vdC5qcwpAQCAtMCwwICsxLDIwMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKioKKyBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4wLCB0aGlzIGZpbGUgImJvb3RzIiBKYXNtaW5lLCBwZXJmb3JtaW5nIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIGJlZm9yZSBleGVjdXRpbmcgdGhlIGxvYWRlZCBlbnZpcm9ubWVudCBhbmQgYWxsIG9mIGEgcHJvamVjdCdzIHNwZWNzLiBUaGlzIGZpbGUgc2hvdWxkIGJlIGxvYWRlZCBhZnRlciBgamFzbWluZS5qc2AsIGJ1dCBiZWZvcmUgYW55IHByb2plY3Qgc291cmNlIGZpbGVzIG9yIHNwZWMgZmlsZXMgYXJlIGxvYWRlZC4gVGh1cyB0aGlzIGZpbGUgY2FuIGFsc28gYmUgdXNlZCB0byBjdXN0b21pemUgSmFzbWluZSBmb3IgYSBwcm9qZWN0LgorCisgSWYgYSBwcm9qZWN0IGlzIHVzaW5nIEphc21pbmUgdmlhIHRoZSBzdGFuZGFsb25lIGRpc3RyaWJ1dGlvbiwgdGhpcyBmaWxlIGNhbiBiZSBjdXN0b21pemVkIGRpcmVjdGx5LiBJZiBhIHByb2plY3QgaXMgdXNpbmcgSmFzbWluZSB2aWEgdGhlIFtSdWJ5IGdlbV1bamFzbWluZS1nZW1dLCB0aGlzIGZpbGUgY2FuIGJlIGNvcGllZCBpbnRvIHRoZSBzdXBwb3J0IGRpcmVjdG9yeSB2aWEgYGphc21pbmUgY29weV9ib290X2pzYC4gT3RoZXIgZW52aXJvbm1lbnRzIChlLmcuLCBQeXRob24pIHdpbGwgaGF2ZSBkaWZmZXJlbnQgbWVjaGFuaXNtcy4KKworIFRoZSBsb2NhdGlvbiBvZiBgYm9vdC5qc2AgY2FuIGJlIHNwZWNpZmllZCBhbmQvb3Igb3ZlcnJpZGRlbiBpbiBgamFzbWluZS55bWxgLgorCisgW2phc21pbmUtZ2VtXTogaHR0cDovL2dpdGh1Yi5jb20vcGl2b3RhbC9qYXNtaW5lLWdlbQorICovCisKKyhmdW5jdGlvbigpIHsKKworICAvKioKKyAgICogIyMgUmVxdWlyZSAmYW1wOyBJbnN0YW50aWF0ZQorICAgKgorICAgKiBSZXF1aXJlIEphc21pbmUncyBjb3JlIGZpbGVzLiBTcGVjaWZpY2FsbHksIHRoaXMgcmVxdWlyZXMgYW5kIGF0dGFjaGVzIGFsbCBvZiBKYXNtaW5lJ3MgY29kZSB0byB0aGUgYGphc21pbmVgIHJlZmVyZW5jZS4KKyAgICovCisgIHdpbmRvdy5qYXNtaW5lID0gamFzbWluZVJlcXVpcmUuY29yZShqYXNtaW5lUmVxdWlyZSk7CisKKyAgLyoqCisgICAqIFNpbmNlIHRoaXMgaXMgYmVpbmcgcnVuIGluIGEgYnJvd3NlciBhbmQgdGhlIHJlc3VsdHMgc2hvdWxkIHBvcHVsYXRlIHRvIGFuIEhUTUwgcGFnZSwgcmVxdWlyZSB0aGUgSFRNTC1zcGVjaWZpYyBKYXNtaW5lIGNvZGUsIGluamVjdGluZyB0aGUgc2FtZSByZWZlcmVuY2UuCisgICAqLworICBqYXNtaW5lUmVxdWlyZS5odG1sKGphc21pbmUpOworCisgIC8qKgorICAgKiBDcmVhdGUgdGhlIEphc21pbmUgZW52aXJvbm1lbnQuIFRoaXMgaXMgdXNlZCB0byBydW4gYWxsIHNwZWNzIGluIGEgcHJvamVjdC4KKyAgICovCisgIHZhciBlbnYgPSBqYXNtaW5lLmdldEVudigpOworCisgIC8qKgorICAgKiAjIyBUaGUgR2xvYmFsIEludGVyZmFjZQorICAgKgorICAgKiBCdWlsZCB1cCB0aGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBleHBvc2VkIGFzIHRoZSBKYXNtaW5lIHB1YmxpYyBpbnRlcmZhY2UuIEEgcHJvamVjdCBjYW4gY3VzdG9taXplLCByZW5hbWUgb3IgYWxpYXMgYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBhcyBkZXNpcmVkLCBwcm92aWRlZCB0aGUgaW1wbGVtZW50YXRpb24gcmVtYWlucyB1bmNoYW5nZWQuCisgICAqLworICB2YXIgamFzbWluZUludGVyZmFjZSA9IHsKKyAgICBkZXNjcmliZTogZnVuY3Rpb24oZGVzY3JpcHRpb24sIHNwZWNEZWZpbml0aW9ucykgeworICAgICAgcmV0dXJuIGVudi5kZXNjcmliZShkZXNjcmlwdGlvbiwgc3BlY0RlZmluaXRpb25zKTsKKyAgICB9LAorCisgICAgeGRlc2NyaWJlOiBmdW5jdGlvbihkZXNjcmlwdGlvbiwgc3BlY0RlZmluaXRpb25zKSB7CisgICAgICByZXR1cm4gZW52LnhkZXNjcmliZShkZXNjcmlwdGlvbiwgc3BlY0RlZmluaXRpb25zKTsKKyAgICB9LAorCisgICAgaXQ6IGZ1bmN0aW9uKGRlc2MsIGZ1bmMpIHsKKyAgICAgIHJldHVybiBlbnYuaXQoZGVzYywgZnVuYyk7CisgICAgfSwKKworICAgIHhpdDogZnVuY3Rpb24oZGVzYywgZnVuYykgeworICAgICAgcmV0dXJuIGVudi54aXQoZGVzYywgZnVuYyk7CisgICAgfSwKKworICAgIGJlZm9yZUVhY2g6IGZ1bmN0aW9uKGJlZm9yZUVhY2hGdW5jdGlvbikgeworICAgICAgcmV0dXJuIGVudi5iZWZvcmVFYWNoKGJlZm9yZUVhY2hGdW5jdGlvbik7CisgICAgfSwKKworICAgIGFmdGVyRWFjaDogZnVuY3Rpb24oYWZ0ZXJFYWNoRnVuY3Rpb24pIHsKKyAgICAgIHJldHVybiBlbnYuYWZ0ZXJFYWNoKGFmdGVyRWFjaEZ1bmN0aW9uKTsKKyAgICB9LAorCisgICAgZXhwZWN0OiBmdW5jdGlvbihhY3R1YWwpIHsKKyAgICAgIHJldHVybiBlbnYuZXhwZWN0KGFjdHVhbCk7CisgICAgfSwKKworICAgIHBlbmRpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIGVudi5wZW5kaW5nKCk7CisgICAgfSwKKworICAgIHNweU9uOiBmdW5jdGlvbihvYmosIG1ldGhvZE5hbWUpIHsKKyAgICAgIHJldHVybiBlbnYuc3B5T24ob2JqLCBtZXRob2ROYW1lKTsKKyAgICB9LAorCisgICAganNBcGlSZXBvcnRlcjogbmV3IGphc21pbmUuSnNBcGlSZXBvcnRlcih7CisgICAgICB0aW1lcjogbmV3IGphc21pbmUuVGltZXIoKQorICAgIH0pCisgIH07CisKKyAgLyoqCisgICAqIEFkZCBhbGwgb2YgdGhlIEphc21pbmUgZ2xvYmFsL3B1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIHByb3BlciBnbG9iYWwsIHNvIGEgcHJvamVjdCBjYW4gdXNlIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGRpcmVjdGx5LiBGb3IgZXhhbXBsZSwgY2FsbGluZyBgZGVzY3JpYmVgIGluIHNwZWNzIGluc3RlYWQgb2YgYGphc21pbmUuZ2V0RW52KCkuZGVzY3JpYmVgLgorICAgKi8KKyAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIpIHsKKyAgICBleHRlbmQoZXhwb3J0cywgamFzbWluZUludGVyZmFjZSk7CisgIH0gZWxzZSB7CisgICAgZXh0ZW5kKHdpbmRvdywgamFzbWluZUludGVyZmFjZSk7CisgIH0KKworICAvKioKKyAgICogRXhwb3NlIHRoZSBpbnRlcmZhY2UgZm9yIGFkZGluZyBjdXN0b20gZXF1YWxpdHkgdGVzdGVycy4KKyAgICovCisgIGphc21pbmUuYWRkQ3VzdG9tRXF1YWxpdHlUZXN0ZXIgPSBmdW5jdGlvbih0ZXN0ZXIpIHsKKyAgICBlbnYuYWRkQ3VzdG9tRXF1YWxpdHlUZXN0ZXIodGVzdGVyKTsKKyAgfTsKKworICAvKioKKyAgICogRXhwb3NlIHRoZSBpbnRlcmZhY2UgZm9yIGFkZGluZyBjdXN0b20gZXhwZWN0YXRpb24gbWF0Y2hlcnMKKyAgICovCisgIGphc21pbmUuYWRkTWF0Y2hlcnMgPSBmdW5jdGlvbihtYXRjaGVycykgeworICAgIHJldHVybiBlbnYuYWRkTWF0Y2hlcnMobWF0Y2hlcnMpOworICB9OworCisgIC8qKgorICAgKiBFeHBvc2UgdGhlIG1vY2sgaW50ZXJmYWNlIGZvciB0aGUgSmF2YVNjcmlwdCB0aW1lb3V0IGZ1bmN0aW9ucworICAgKi8KKyAgamFzbWluZS5jbG9jayA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBlbnYuY2xvY2s7CisgIH07CisKKyAgLyoqCisgICAqICMjIFJ1bm5lciBQYXJhbWV0ZXJzCisgICAqCisgICAqIE1vcmUgYnJvd3NlciBzcGVjaWZpYyBjb2RlIC0gd3JhcCB0aGUgcXVlcnkgc3RyaW5nIGluIGFuIG9iamVjdCBhbmQgdG8gYWxsb3cgZm9yIGdldHRpbmcvc2V0dGluZyBwYXJhbWV0ZXJzIGZyb20gdGhlIHJ1bm5lciB1c2VyIGludGVyZmFjZS4KKyAgICovCisKKyAgdmFyIHF1ZXJ5U3RyaW5nID0gbmV3IGphc21pbmUuUXVlcnlTdHJpbmcoeworICAgIGdldFdpbmRvd0xvY2F0aW9uOiBmdW5jdGlvbigpIHsgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbjsgfQorICB9KTsKKworICB2YXIgY2F0Y2hpbmdFeGNlcHRpb25zID0gcXVlcnlTdHJpbmcuZ2V0UGFyYW0oImNhdGNoIik7CisgIGVudi5jYXRjaEV4Y2VwdGlvbnModHlwZW9mIGNhdGNoaW5nRXhjZXB0aW9ucyA9PT0gInVuZGVmaW5lZCIgPyB0cnVlIDogY2F0Y2hpbmdFeGNlcHRpb25zKTsKKworICAvKioKKyAgICogIyMgUmVwb3J0ZXJzCisgICAqIFRoZSBgSHRtbFJlcG9ydGVyYCBidWlsZHMgYWxsIG9mIHRoZSBIVE1MIFVJIGZvciB0aGUgcnVubmVyIHBhZ2UuIFRoaXMgcmVwb3J0ZXIgcGFpbnRzIHRoZSBkb3RzLCBzdGFycywgYW5kIHgncyBmb3Igc3BlY3MsIGFzIHdlbGwgYXMgYWxsIHNwZWMgbmFtZXMgYW5kIGFsbCBmYWlsdXJlcyAoaWYgYW55KS4KKyAgICovCisgIHZhciBodG1sUmVwb3J0ZXIgPSBuZXcgamFzbWluZS5IdG1sUmVwb3J0ZXIoeworICAgIGVudjogZW52LAorICAgIG9uUmFpc2VFeGNlcHRpb25zQ2xpY2s6IGZ1bmN0aW9uKCkgeyBxdWVyeVN0cmluZy5zZXRQYXJhbSgiY2F0Y2giLCAhZW52LmNhdGNoaW5nRXhjZXB0aW9ucygpKTsgfSwKKyAgICBnZXRDb250YWluZXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZG9jdW1lbnQuYm9keTsgfSwKKyAgICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigpIHsgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQuYXBwbHkoZG9jdW1lbnQsIGFyZ3VtZW50cyk7IH0sCisgICAgY3JlYXRlVGV4dE5vZGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUuYXBwbHkoZG9jdW1lbnQsIGFyZ3VtZW50cyk7IH0sCisgICAgdGltZXI6IG5ldyBqYXNtaW5lLlRpbWVyKCkKKyAgfSk7CisKKyAgLyoqCisgICAqIFRoZSBganNBcGlSZXBvcnRlcmAgYWxzbyByZWNlaXZlcyBzcGVjIHJlc3VsdHMsIGFuZCBpcyB1c2VkIGJ5IGFueSBlbnZpcm9ubWVudCB0aGF0IG5lZWRzIHRvIGV4dHJhY3QgdGhlIHJlc3VsdHMgIGZyb20gSmF2YVNjcmlwdC4KKyAgICovCisgIGVudi5hZGRSZXBvcnRlcihqYXNtaW5lSW50ZXJmYWNlLmpzQXBpUmVwb3J0ZXIpOworICBlbnYuYWRkUmVwb3J0ZXIoaHRtbFJlcG9ydGVyKTsKKworICAvKioKKyAgICogRmlsdGVyIHdoaWNoIHNwZWNzIHdpbGwgYmUgcnVuIGJ5IG1hdGNoaW5nIHRoZSBzdGFydCBvZiB0aGUgZnVsbCBuYW1lIGFnYWluc3QgdGhlIGBzcGVjYCBxdWVyeSBwYXJhbS4KKyAgICovCisgIHZhciBzcGVjRmlsdGVyID0gbmV3IGphc21pbmUuSHRtbFNwZWNGaWx0ZXIoeworICAgIGZpbHRlclN0cmluZzogZnVuY3Rpb24oKSB7IHJldHVybiBxdWVyeVN0cmluZy5nZXRQYXJhbSgic3BlYyIpOyB9CisgIH0pOworCisgIGVudi5zcGVjRmlsdGVyID0gZnVuY3Rpb24oc3BlYykgeworICAgIHJldHVybiBzcGVjRmlsdGVyLm1hdGNoZXMoc3BlYy5nZXRGdWxsTmFtZSgpKTsKKyAgfTsKKworICAvKioKKyAgICogU2V0dGluZyB1cCB0aW1pbmcgZnVuY3Rpb25zIHRvIGJlIGFibGUgdG8gYmUgb3ZlcnJpZGRlbi4gQ2VydGFpbiBicm93c2VycyAoU2FmYXJpLCBJRSA4LCBwaGFudG9tanMpIHJlcXVpcmUgdGhpcyBoYWNrLgorICAgKi8KKyAgd2luZG93LnNldFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dDsKKyAgd2luZG93LnNldEludGVydmFsID0gd2luZG93LnNldEludGVydmFsOworICB3aW5kb3cuY2xlYXJUaW1lb3V0ID0gd2luZG93LmNsZWFyVGltZW91dDsKKyAgd2luZG93LmNsZWFySW50ZXJ2YWwgPSB3aW5kb3cuY2xlYXJJbnRlcnZhbDsKKworICAvKioKKyAgICogIyMgRXhlY3V0aW9uCisgICAqCisgICAqIFJlcGxhY2UgdGhlIGJyb3dzZXIgd2luZG93J3MgYG9ubG9hZGAsIGVuc3VyZSBpdCdzIGNhbGxlZCwgYW5kIHRoZW4gcnVuIGFsbCBvZiB0aGUgbG9hZGVkIHNwZWNzLiBUaGlzIGluY2x1ZGVzIGluaXRpYWxpemluZyB0aGUgYEh0bWxSZXBvcnRlcmAgaW5zdGFuY2UgYW5kIHRoZW4gZXhlY3V0aW5nIHRoZSBsb2FkZWQgSmFzbWluZSBlbnZpcm9ubWVudC4gQWxsIG9mIHRoaXMgd2lsbCBoYXBwZW4gYWZ0ZXIgYWxsIG9mIHRoZSBzcGVjcyBhcmUgbG9hZGVkLgorICAgKi8KKyAgdmFyIGN1cnJlbnRXaW5kb3dPbmxvYWQgPSB3aW5kb3cub25sb2FkOworCisgIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoY3VycmVudFdpbmRvd09ubG9hZCkgeworICAgICAgY3VycmVudFdpbmRvd09ubG9hZCgpOworICAgIH0KKyAgICBodG1sUmVwb3J0ZXIuaW5pdGlhbGl6ZSgpOworICAgIGVudi5leGVjdXRlKCk7CisgIH07CisKKyAgLyoqCisgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcmVhZGFiaWxpdHkgYWJvdmUuCisgICAqLworICBmdW5jdGlvbiBleHRlbmQoZGVzdGluYXRpb24sIHNvdXJjZSkgeworICAgIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkgZGVzdGluYXRpb25bcHJvcGVydHldID0gc291cmNlW3Byb3BlcnR5XTsKKyAgICByZXR1cm4gZGVzdGluYXRpb247CisgIH0KKworfSgpKTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL2xpYi9qYXNtaW5lLTIuMC4wL2NvbnNvbGUuanMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9jb25zb2xlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzEzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9jb25zb2xlLmpzCkBAIC0wLDAgKzEsMTgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMyBQaXZvdGFsIExhYnMKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KK2Z1bmN0aW9uIGdldEphc21pbmVSZXF1aXJlT2JqKCkgeworICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gInVuZGVmaW5lZCIgJiYgbW9kdWxlLmV4cG9ydHMpIHsKKyAgICByZXR1cm4gZXhwb3J0czsKKyAgfSBlbHNlIHsKKyAgICB3aW5kb3cuamFzbWluZVJlcXVpcmUgPSB3aW5kb3cuamFzbWluZVJlcXVpcmUgfHwge307CisgICAgcmV0dXJuIHdpbmRvdy5qYXNtaW5lUmVxdWlyZTsKKyAgfQorfQorCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLmNvbnNvbGUgPSBmdW5jdGlvbihqUmVxdWlyZSwgaiQpIHsKKyAgaiQuQ29uc29sZVJlcG9ydGVyID0galJlcXVpcmUuQ29uc29sZVJlcG9ydGVyKCk7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLkNvbnNvbGVSZXBvcnRlciA9IGZ1bmN0aW9uKCkgeworCisgIHZhciBub29wVGltZXIgPSB7CisgICAgc3RhcnQ6IGZ1bmN0aW9uKCl7fSwKKyAgICBlbGFwc2VkOiBmdW5jdGlvbigpeyByZXR1cm4gMDsgfQorICB9OworCisgIGZ1bmN0aW9uIENvbnNvbGVSZXBvcnRlcihvcHRpb25zKSB7CisgICAgdmFyIHByaW50ID0gb3B0aW9ucy5wcmludCwKKyAgICAgIHNob3dDb2xvcnMgPSBvcHRpb25zLnNob3dDb2xvcnMgfHwgZmFsc2UsCisgICAgICBvbkNvbXBsZXRlID0gb3B0aW9ucy5vbkNvbXBsZXRlIHx8IGZ1bmN0aW9uKCkge30sCisgICAgICB0aW1lciA9IG9wdGlvbnMudGltZXIgfHwgbm9vcFRpbWVyLAorICAgICAgc3BlY0NvdW50LAorICAgICAgZmFpbHVyZUNvdW50LAorICAgICAgZmFpbGVkU3BlY3MgPSBbXSwKKyAgICAgIHBlbmRpbmdDb3VudCwKKyAgICAgIGFuc2kgPSB7CisgICAgICAgIGdyZWVuOiAnXHgxQlszMm0nLAorICAgICAgICByZWQ6ICdceDFCWzMxbScsCisgICAgICAgIHllbGxvdzogJ1x4MUJbMzNtJywKKyAgICAgICAgbm9uZTogJ1x4MUJbMG0nCisgICAgICB9OworCisgICAgdGhpcy5qYXNtaW5lU3RhcnRlZCA9IGZ1bmN0aW9uKCkgeworICAgICAgc3BlY0NvdW50ID0gMDsKKyAgICAgIGZhaWx1cmVDb3VudCA9IDA7CisgICAgICBwZW5kaW5nQ291bnQgPSAwOworICAgICAgcHJpbnQoIlN0YXJ0ZWQiKTsKKyAgICAgIHByaW50TmV3bGluZSgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICB9OworCisgICAgdGhpcy5qYXNtaW5lRG9uZSA9IGZ1bmN0aW9uKCkgeworICAgICAgcHJpbnROZXdsaW5lKCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZhaWxlZFNwZWNzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHNwZWNGYWlsdXJlRGV0YWlscyhmYWlsZWRTcGVjc1tpXSk7CisgICAgICB9CisKKyAgICAgIHByaW50TmV3bGluZSgpOworICAgICAgdmFyIHNwZWNDb3VudHMgPSBzcGVjQ291bnQgKyAiICIgKyBwbHVyYWwoInNwZWMiLCBzcGVjQ291bnQpICsgIiwgIiArCisgICAgICAgIGZhaWx1cmVDb3VudCArICIgIiArIHBsdXJhbCgiZmFpbHVyZSIsIGZhaWx1cmVDb3VudCk7CisKKyAgICAgIGlmIChwZW5kaW5nQ291bnQpIHsKKyAgICAgICAgc3BlY0NvdW50cyArPSAiLCAiICsgcGVuZGluZ0NvdW50ICsgIiBwZW5kaW5nICIgKyBwbHVyYWwoInNwZWMiLCBwZW5kaW5nQ291bnQpOworICAgICAgfQorCisgICAgICBwcmludChzcGVjQ291bnRzKTsKKworICAgICAgcHJpbnROZXdsaW5lKCk7CisgICAgICB2YXIgc2Vjb25kcyA9IHRpbWVyLmVsYXBzZWQoKSAvIDEwMDA7CisgICAgICBwcmludCgiRmluaXNoZWQgaW4gIiArIHNlY29uZHMgKyAiICIgKyBwbHVyYWwoInNlY29uZCIsIHNlY29uZHMpKTsKKworICAgICAgcHJpbnROZXdsaW5lKCk7CisKKyAgICAgIG9uQ29tcGxldGUoZmFpbHVyZUNvdW50ID09PSAwKTsKKyAgICB9OworCisgICAgdGhpcy5zcGVjRG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgc3BlY0NvdW50Kys7CisKKyAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09ICJwZW5kaW5nIikgeworICAgICAgICBwZW5kaW5nQ291bnQrKzsKKyAgICAgICAgcHJpbnQoY29sb3JlZCgieWVsbG93IiwgIioiKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT0gInBhc3NlZCIpIHsKKyAgICAgICAgcHJpbnQoY29sb3JlZCgiZ3JlZW4iLCAnLicpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PSAiZmFpbGVkIikgeworICAgICAgICBmYWlsdXJlQ291bnQrKzsKKyAgICAgICAgZmFpbGVkU3BlY3MucHVzaChyZXN1bHQpOworICAgICAgICBwcmludChjb2xvcmVkKCJyZWQiLCAnRicpKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIHRoaXM7CisKKyAgICBmdW5jdGlvbiBwcmludE5ld2xpbmUoKSB7CisgICAgICBwcmludCgiXG4iKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjb2xvcmVkKGNvbG9yLCBzdHIpIHsKKyAgICAgIHJldHVybiBzaG93Q29sb3JzID8gKGFuc2lbY29sb3JdICsgc3RyICsgYW5zaS5ub25lKSA6IHN0cjsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBwbHVyYWwoc3RyLCBjb3VudCkgeworICAgICAgcmV0dXJuIGNvdW50ID09IDEgPyBzdHIgOiBzdHIgKyAicyI7CisgICAgfQorCisgICAgZnVuY3Rpb24gcmVwZWF0KHRoaW5nLCB0aW1lcykgeworICAgICAgdmFyIGFyciA9IFtdOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aW1lczsgaSsrKSB7CisgICAgICAgIGFyci5wdXNoKHRoaW5nKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgZnVuY3Rpb24gaW5kZW50KHN0ciwgc3BhY2VzKSB7CisgICAgICB2YXIgbGluZXMgPSAoc3RyIHx8ICcnKS5zcGxpdCgiXG4iKTsKKyAgICAgIHZhciBuZXdBcnIgPSBbXTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgbmV3QXJyLnB1c2gocmVwZWF0KCIgIiwgc3BhY2VzKS5qb2luKCIiKSArIGxpbmVzW2ldKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXdBcnIuam9pbigiXG4iKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzcGVjRmFpbHVyZURldGFpbHMocmVzdWx0KSB7CisgICAgICBwcmludE5ld2xpbmUoKTsKKyAgICAgIHByaW50KHJlc3VsdC5mdWxsTmFtZSk7CisKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LmZhaWxlZEV4cGVjdGF0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgZmFpbGVkRXhwZWN0YXRpb24gPSByZXN1bHQuZmFpbGVkRXhwZWN0YXRpb25zW2ldOworICAgICAgICBwcmludE5ld2xpbmUoKTsKKyAgICAgICAgcHJpbnQoaW5kZW50KGZhaWxlZEV4cGVjdGF0aW9uLnN0YWNrLCAyKSk7CisgICAgICB9CisKKyAgICAgIHByaW50TmV3bGluZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiBDb25zb2xlUmVwb3J0ZXI7Cit9OwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvamFzbWluZS1odG1sLmpzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvamFzbWluZS1odG1sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDY5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9qYXNtaW5lLWh0bWwuanMKQEAgLTAsMCArMSwzNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKK0NvcHlyaWdodCAoYykgMjAwOC0yMDEzIFBpdm90YWwgTGFicworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqLworamFzbWluZVJlcXVpcmUuaHRtbCA9IGZ1bmN0aW9uKGokKSB7CisgIGokLlJlc3VsdHNOb2RlID0gamFzbWluZVJlcXVpcmUuUmVzdWx0c05vZGUoKTsKKyAgaiQuSHRtbFJlcG9ydGVyID0gamFzbWluZVJlcXVpcmUuSHRtbFJlcG9ydGVyKGokKTsKKyAgaiQuUXVlcnlTdHJpbmcgPSBqYXNtaW5lUmVxdWlyZS5RdWVyeVN0cmluZygpOworICBqJC5IdG1sU3BlY0ZpbHRlciA9IGphc21pbmVSZXF1aXJlLkh0bWxTcGVjRmlsdGVyKCk7Cit9OworCitqYXNtaW5lUmVxdWlyZS5IdG1sUmVwb3J0ZXIgPSBmdW5jdGlvbihqJCkgeworCisgIHZhciBub29wVGltZXIgPSB7CisgICAgc3RhcnQ6IGZ1bmN0aW9uKCkge30sCisgICAgZWxhcHNlZDogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9CisgIH07CisKKyAgZnVuY3Rpb24gSHRtbFJlcG9ydGVyKG9wdGlvbnMpIHsKKyAgICB2YXIgZW52ID0gb3B0aW9ucy5lbnYgfHwge30sCisgICAgICBnZXRDb250YWluZXIgPSBvcHRpb25zLmdldENvbnRhaW5lciwKKyAgICAgIGNyZWF0ZUVsZW1lbnQgPSBvcHRpb25zLmNyZWF0ZUVsZW1lbnQsCisgICAgICBjcmVhdGVUZXh0Tm9kZSA9IG9wdGlvbnMuY3JlYXRlVGV4dE5vZGUsCisgICAgICBvblJhaXNlRXhjZXB0aW9uc0NsaWNrID0gb3B0aW9ucy5vblJhaXNlRXhjZXB0aW9uc0NsaWNrIHx8IGZ1bmN0aW9uKCkge30sCisgICAgICB0aW1lciA9IG9wdGlvbnMudGltZXIgfHwgbm9vcFRpbWVyLAorICAgICAgcmVzdWx0cyA9IFtdLAorICAgICAgc3BlY3NFeGVjdXRlZCA9IDAsCisgICAgICBmYWlsdXJlQ291bnQgPSAwLAorICAgICAgcGVuZGluZ1NwZWNDb3VudCA9IDAsCisgICAgICBodG1sUmVwb3J0ZXJNYWluLAorICAgICAgc3ltYm9sczsKKworICAgIHRoaXMuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkgeworICAgICAgaHRtbFJlcG9ydGVyTWFpbiA9IGNyZWF0ZURvbSgiZGl2Iiwge2NsYXNzTmFtZTogImh0bWwtcmVwb3J0ZXIifSwKKyAgICAgICAgY3JlYXRlRG9tKCJkaXYiLCB7Y2xhc3NOYW1lOiAiYmFubmVyIn0sCisgICAgICAgICAgY3JlYXRlRG9tKCJzcGFuIiwge2NsYXNzTmFtZTogInRpdGxlIn0sICJKYXNtaW5lIiksCisgICAgICAgICAgY3JlYXRlRG9tKCJzcGFuIiwge2NsYXNzTmFtZTogInZlcnNpb24ifSwgaiQudmVyc2lvbikKKyAgICAgICAgKSwKKyAgICAgICAgY3JlYXRlRG9tKCJ1bCIsIHtjbGFzc05hbWU6ICJzeW1ib2wtc3VtbWFyeSJ9KSwKKyAgICAgICAgY3JlYXRlRG9tKCJkaXYiLCB7Y2xhc3NOYW1lOiAiYWxlcnQifSksCisgICAgICAgIGNyZWF0ZURvbSgiZGl2Iiwge2NsYXNzTmFtZTogInJlc3VsdHMifSwKKyAgICAgICAgICBjcmVhdGVEb20oImRpdiIsIHtjbGFzc05hbWU6ICJmYWlsdXJlcyJ9KQorICAgICAgICApCisgICAgICApOworICAgICAgZ2V0Q29udGFpbmVyKCkuYXBwZW5kQ2hpbGQoaHRtbFJlcG9ydGVyTWFpbik7CisKKyAgICAgIHN5bWJvbHMgPSBmaW5kKCIuc3ltYm9sLXN1bW1hcnkiKTsKKyAgICB9OworCisgICAgdmFyIHRvdGFsU3BlY3NEZWZpbmVkOworICAgIHRoaXMuamFzbWluZVN0YXJ0ZWQgPSBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgICB0b3RhbFNwZWNzRGVmaW5lZCA9IG9wdGlvbnMudG90YWxTcGVjc0RlZmluZWQgfHwgMDsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgfTsKKworICAgIHZhciBzdW1tYXJ5ID0gY3JlYXRlRG9tKCJkaXYiLCB7Y2xhc3NOYW1lOiAic3VtbWFyeSJ9KTsKKworICAgIHZhciB0b3BSZXN1bHRzID0gbmV3IGokLlJlc3VsdHNOb2RlKHt9LCAiIiwgbnVsbCksCisgICAgICBjdXJyZW50UGFyZW50ID0gdG9wUmVzdWx0czsKKworICAgIHRoaXMuc3VpdGVTdGFydGVkID0gZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBjdXJyZW50UGFyZW50LmFkZENoaWxkKHJlc3VsdCwgInN1aXRlIik7CisgICAgICBjdXJyZW50UGFyZW50ID0gY3VycmVudFBhcmVudC5sYXN0KCk7CisgICAgfTsKKworICAgIHRoaXMuc3VpdGVEb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBpZiAoY3VycmVudFBhcmVudCA9PSB0b3BSZXN1bHRzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgY3VycmVudFBhcmVudCA9IGN1cnJlbnRQYXJlbnQucGFyZW50OworICAgIH07CisKKyAgICB0aGlzLnNwZWNTdGFydGVkID0gZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBjdXJyZW50UGFyZW50LmFkZENoaWxkKHJlc3VsdCwgInNwZWMiKTsKKyAgICB9OworCisgICAgdmFyIGZhaWx1cmVzID0gW107CisgICAgdGhpcy5zcGVjRG9uZSA9IGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT0gImRpc2FibGVkIikgeworICAgICAgICBzcGVjc0V4ZWN1dGVkKys7CisgICAgICB9CisKKyAgICAgIHN5bWJvbHMuYXBwZW5kQ2hpbGQoY3JlYXRlRG9tKCJsaSIsIHsKKyAgICAgICAgICBjbGFzc05hbWU6IHJlc3VsdC5zdGF0dXMsCisgICAgICAgICAgaWQ6ICJzcGVjXyIgKyByZXN1bHQuaWQsCisgICAgICAgICAgdGl0bGU6IHJlc3VsdC5mdWxsTmFtZQorICAgICAgICB9CisgICAgICApKTsKKworICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT0gImZhaWxlZCIpIHsKKyAgICAgICAgZmFpbHVyZUNvdW50Kys7CisKKyAgICAgICAgdmFyIGZhaWx1cmUgPQorICAgICAgICAgIGNyZWF0ZURvbSgiZGl2Iiwge2NsYXNzTmFtZTogInNwZWMtZGV0YWlsIGZhaWxlZCJ9LAorICAgICAgICAgICAgY3JlYXRlRG9tKCJkaXYiLCB7Y2xhc3NOYW1lOiAiZGVzY3JpcHRpb24ifSwKKyAgICAgICAgICAgICAgY3JlYXRlRG9tKCJhIiwge3RpdGxlOiByZXN1bHQuZnVsbE5hbWUsIGhyZWY6IHNwZWNIcmVmKHJlc3VsdCl9LCByZXN1bHQuZnVsbE5hbWUpCisgICAgICAgICAgICApLAorICAgICAgICAgICAgY3JlYXRlRG9tKCJkaXYiLCB7Y2xhc3NOYW1lOiAibWVzc2FnZXMifSkKKyAgICAgICAgICApOworICAgICAgICB2YXIgbWVzc2FnZXMgPSBmYWlsdXJlLmNoaWxkTm9kZXNbMV07CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQuZmFpbGVkRXhwZWN0YXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmFyIGV4cGVjdGF0aW9uID0gcmVzdWx0LmZhaWxlZEV4cGVjdGF0aW9uc1tpXTsKKyAgICAgICAgICBtZXNzYWdlcy5hcHBlbmRDaGlsZChjcmVhdGVEb20oImRpdiIsIHtjbGFzc05hbWU6ICJyZXN1bHQtbWVzc2FnZSJ9LCBleHBlY3RhdGlvbi5tZXNzYWdlKSk7CisgICAgICAgICAgbWVzc2FnZXMuYXBwZW5kQ2hpbGQoY3JlYXRlRG9tKCJkaXYiLCB7Y2xhc3NOYW1lOiAic3RhY2stdHJhY2UifSwgZXhwZWN0YXRpb24uc3RhY2spKTsKKyAgICAgICAgfQorCisgICAgICAgIGZhaWx1cmVzLnB1c2goZmFpbHVyZSk7CisgICAgICB9CisKKyAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09ICJwZW5kaW5nIikgeworICAgICAgICBwZW5kaW5nU3BlY0NvdW50Kys7CisgICAgICB9CisgICAgfTsKKworICAgIHRoaXMuamFzbWluZURvbmUgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBiYW5uZXIgPSBmaW5kKCIuYmFubmVyIik7CisgICAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoY3JlYXRlRG9tKCJzcGFuIiwge2NsYXNzTmFtZTogImR1cmF0aW9uIn0sICJmaW5pc2hlZCBpbiAiICsgdGltZXIuZWxhcHNlZCgpIC8gMTAwMCArICJzIikpOworCisgICAgICB2YXIgYWxlcnQgPSBmaW5kKCIuYWxlcnQiKTsKKworICAgICAgYWxlcnQuYXBwZW5kQ2hpbGQoY3JlYXRlRG9tKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJleGNlcHRpb25zIiB9LAorICAgICAgICBjcmVhdGVEb20oImxhYmVsIiwgeyBjbGFzc05hbWU6ICJsYWJlbCIsICdmb3InOiAicmFpc2UtZXhjZXB0aW9ucyIgfSwgInJhaXNlIGV4Y2VwdGlvbnMiKSwKKyAgICAgICAgY3JlYXRlRG9tKCJpbnB1dCIsIHsKKyAgICAgICAgICBjbGFzc05hbWU6ICJyYWlzZSIsCisgICAgICAgICAgaWQ6ICJyYWlzZS1leGNlcHRpb25zIiwKKyAgICAgICAgICB0eXBlOiAiY2hlY2tib3giCisgICAgICAgIH0pCisgICAgICApKTsKKyAgICAgIHZhciBjaGVja2JveCA9IGZpbmQoImlucHV0Iik7CisKKyAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSAhZW52LmNhdGNoaW5nRXhjZXB0aW9ucygpOworICAgICAgY2hlY2tib3gub25jbGljayA9IG9uUmFpc2VFeGNlcHRpb25zQ2xpY2s7CisKKyAgICAgIGlmIChzcGVjc0V4ZWN1dGVkIDwgdG90YWxTcGVjc0RlZmluZWQpIHsKKyAgICAgICAgdmFyIHNraXBwZWRNZXNzYWdlID0gIlJhbiAiICsgc3BlY3NFeGVjdXRlZCArICIgb2YgIiArIHRvdGFsU3BlY3NEZWZpbmVkICsgIiBzcGVjcyAtIHJ1biBhbGwiOworICAgICAgICBhbGVydC5hcHBlbmRDaGlsZCgKKyAgICAgICAgICBjcmVhdGVEb20oInNwYW4iLCB7Y2xhc3NOYW1lOiAiYmFyIHNraXBwZWQifSwKKyAgICAgICAgICAgIGNyZWF0ZURvbSgiYSIsIHtocmVmOiAiPyIsIHRpdGxlOiAiUnVuIGFsbCBzcGVjcyJ9LCBza2lwcGVkTWVzc2FnZSkKKyAgICAgICAgICApCisgICAgICAgICk7CisgICAgICB9CisgICAgICB2YXIgc3RhdHVzQmFyTWVzc2FnZSA9ICIiICsgcGx1cmFsaXplKCJzcGVjIiwgc3BlY3NFeGVjdXRlZCkgKyAiLCAiICsgcGx1cmFsaXplKCJmYWlsdXJlIiwgZmFpbHVyZUNvdW50KTsKKyAgICAgIGlmIChwZW5kaW5nU3BlY0NvdW50KSB7IHN0YXR1c0Jhck1lc3NhZ2UgKz0gIiwgIiArIHBsdXJhbGl6ZSgicGVuZGluZyBzcGVjIiwgcGVuZGluZ1NwZWNDb3VudCk7IH0KKworICAgICAgdmFyIHN0YXR1c0JhckNsYXNzTmFtZSA9ICJiYXIgIiArICgoZmFpbHVyZUNvdW50ID4gMCkgPyAiZmFpbGVkIiA6ICJwYXNzZWQiKTsKKyAgICAgIGFsZXJ0LmFwcGVuZENoaWxkKGNyZWF0ZURvbSgic3BhbiIsIHtjbGFzc05hbWU6IHN0YXR1c0JhckNsYXNzTmFtZX0sIHN0YXR1c0Jhck1lc3NhZ2UpKTsKKworICAgICAgdmFyIHJlc3VsdHMgPSBmaW5kKCIucmVzdWx0cyIpOworICAgICAgcmVzdWx0cy5hcHBlbmRDaGlsZChzdW1tYXJ5KTsKKworICAgICAgc3VtbWFyeUxpc3QodG9wUmVzdWx0cywgc3VtbWFyeSk7CisKKyAgICAgIGZ1bmN0aW9uIHN1bW1hcnlMaXN0KHJlc3VsdHNUcmVlLCBkb21QYXJlbnQpIHsKKyAgICAgICAgdmFyIHNwZWNMaXN0Tm9kZTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzVHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciByZXN1bHROb2RlID0gcmVzdWx0c1RyZWUuY2hpbGRyZW5baV07CisgICAgICAgICAgaWYgKHJlc3VsdE5vZGUudHlwZSA9PSAic3VpdGUiKSB7CisgICAgICAgICAgICB2YXIgc3VpdGVMaXN0Tm9kZSA9IGNyZWF0ZURvbSgidWwiLCB7Y2xhc3NOYW1lOiAic3VpdGUiLCBpZDogInN1aXRlLSIgKyByZXN1bHROb2RlLnJlc3VsdC5pZH0sCisgICAgICAgICAgICAgIGNyZWF0ZURvbSgibGkiLCB7Y2xhc3NOYW1lOiAic3VpdGUtZGV0YWlsIn0sCisgICAgICAgICAgICAgICAgY3JlYXRlRG9tKCJhIiwge2hyZWY6IHNwZWNIcmVmKHJlc3VsdE5vZGUucmVzdWx0KX0sIHJlc3VsdE5vZGUucmVzdWx0LmRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBzdW1tYXJ5TGlzdChyZXN1bHROb2RlLCBzdWl0ZUxpc3ROb2RlKTsKKyAgICAgICAgICAgIGRvbVBhcmVudC5hcHBlbmRDaGlsZChzdWl0ZUxpc3ROb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJlc3VsdE5vZGUudHlwZSA9PSAic3BlYyIpIHsKKyAgICAgICAgICAgIGlmIChkb21QYXJlbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpICE9ICJzcGVjcyIpIHsKKyAgICAgICAgICAgICAgc3BlY0xpc3ROb2RlID0gY3JlYXRlRG9tKCJ1bCIsIHtjbGFzc05hbWU6ICJzcGVjcyJ9KTsKKyAgICAgICAgICAgICAgZG9tUGFyZW50LmFwcGVuZENoaWxkKHNwZWNMaXN0Tm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcGVjTGlzdE5vZGUuYXBwZW5kQ2hpbGQoCisgICAgICAgICAgICAgIGNyZWF0ZURvbSgibGkiLCB7CisgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IHJlc3VsdE5vZGUucmVzdWx0LnN0YXR1cywKKyAgICAgICAgICAgICAgICAgIGlkOiAic3BlYy0iICsgcmVzdWx0Tm9kZS5yZXN1bHQuaWQKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGNyZWF0ZURvbSgiYSIsIHtocmVmOiBzcGVjSHJlZihyZXN1bHROb2RlLnJlc3VsdCl9LCByZXN1bHROb2RlLnJlc3VsdC5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCkgeworICAgICAgICBhbGVydC5hcHBlbmRDaGlsZCgKKyAgICAgICAgICBjcmVhdGVEb20oJ3NwYW4nLCB7Y2xhc3NOYW1lOiAibWVudSBiYXIgc3BlYy1saXN0In0sCisgICAgICAgICAgICBjcmVhdGVEb20oInNwYW4iLCB7fSwgIlNwZWMgTGlzdCB8ICIpLAorICAgICAgICAgICAgY3JlYXRlRG9tKCdhJywge2NsYXNzTmFtZTogImZhaWx1cmVzLW1lbnUiLCBocmVmOiAiIyJ9LCAiRmFpbHVyZXMiKSkpOworICAgICAgICBhbGVydC5hcHBlbmRDaGlsZCgKKyAgICAgICAgICBjcmVhdGVEb20oJ3NwYW4nLCB7Y2xhc3NOYW1lOiAibWVudSBiYXIgZmFpbHVyZS1saXN0In0sCisgICAgICAgICAgICBjcmVhdGVEb20oJ2EnLCB7Y2xhc3NOYW1lOiAic3BlYy1saXN0LW1lbnUiLCBocmVmOiAiIyJ9LCAiU3BlYyBMaXN0IiksCisgICAgICAgICAgICBjcmVhdGVEb20oInNwYW4iLCB7fSwgIiB8IEZhaWx1cmVzICIpKSk7CisKKyAgICAgICAgZmluZCgiLmZhaWx1cmVzLW1lbnUiKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgc2V0TWVudU1vZGVUbygnZmFpbHVyZS1saXN0Jyk7CisgICAgICAgIH07CisgICAgICAgIGZpbmQoIi5zcGVjLWxpc3QtbWVudSIpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICBzZXRNZW51TW9kZVRvKCdzcGVjLWxpc3QnKTsKKyAgICAgICAgfTsKKworICAgICAgICBzZXRNZW51TW9kZVRvKCdmYWlsdXJlLWxpc3QnKTsKKworICAgICAgICB2YXIgZmFpbHVyZU5vZGUgPSBmaW5kKCIuZmFpbHVyZXMiKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmYWlsdXJlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGZhaWx1cmVOb2RlLmFwcGVuZENoaWxkKGZhaWx1cmVzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4gdGhpczsKKworICAgIGZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IpIHsKKyAgICAgIHJldHVybiBnZXRDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjcmVhdGVEb20odHlwZSwgYXR0cnMsIGNoaWxkcmVuVmFyQXJncykgeworICAgICAgdmFyIGVsID0gY3JlYXRlRWxlbWVudCh0eXBlKTsKKworICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGNoaWxkID0gYXJndW1lbnRzW2ldOworCisgICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoY3JlYXRlVGV4dE5vZGUoY2hpbGQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoY2hpbGQpIHsKKyAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGNoaWxkKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yICh2YXIgYXR0ciBpbiBhdHRycykgeworICAgICAgICBpZiAoYXR0ciA9PSAiY2xhc3NOYW1lIikgeworICAgICAgICAgIGVsW2F0dHJdID0gYXR0cnNbYXR0cl07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJzW2F0dHJdKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZWw7CisgICAgfQorCisgICAgZnVuY3Rpb24gcGx1cmFsaXplKHNpbmd1bGFyLCBjb3VudCkgeworICAgICAgdmFyIHdvcmQgPSAoY291bnQgPT0gMSA/IHNpbmd1bGFyIDogc2luZ3VsYXIgKyAicyIpOworCisgICAgICByZXR1cm4gIiIgKyBjb3VudCArICIgIiArIHdvcmQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gc3BlY0hyZWYocmVzdWx0KSB7CisgICAgICByZXR1cm4gIj9zcGVjPSIgKyBlbmNvZGVVUklDb21wb25lbnQocmVzdWx0LmZ1bGxOYW1lKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzZXRNZW51TW9kZVRvKG1vZGUpIHsKKyAgICAgIGh0bWxSZXBvcnRlck1haW4uc2V0QXR0cmlidXRlKCJjbGFzcyIsICJodG1sLXJlcG9ydGVyICIgKyBtb2RlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gSHRtbFJlcG9ydGVyOworfTsKKworamFzbWluZVJlcXVpcmUuSHRtbFNwZWNGaWx0ZXIgPSBmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gSHRtbFNwZWNGaWx0ZXIob3B0aW9ucykgeworICAgIHZhciBmaWx0ZXJTdHJpbmcgPSBvcHRpb25zICYmIG9wdGlvbnMuZmlsdGVyU3RyaW5nKCkgJiYgb3B0aW9ucy5maWx0ZXJTdHJpbmcoKS5yZXBsYWNlKC9bLVtcXXt9KCkqKz8uLFxcXiR8I1xzXS9nLCAiXFwkJiIpOworICAgIHZhciBmaWx0ZXJQYXR0ZXJuID0gbmV3IFJlZ0V4cChmaWx0ZXJTdHJpbmcpOworCisgICAgdGhpcy5tYXRjaGVzID0gZnVuY3Rpb24oc3BlY05hbWUpIHsKKyAgICAgIHJldHVybiBmaWx0ZXJQYXR0ZXJuLnRlc3Qoc3BlY05hbWUpOworICAgIH07CisgIH0KKworICByZXR1cm4gSHRtbFNwZWNGaWx0ZXI7Cit9OworCitqYXNtaW5lUmVxdWlyZS5SZXN1bHRzTm9kZSA9IGZ1bmN0aW9uKCkgeworICBmdW5jdGlvbiBSZXN1bHRzTm9kZShyZXN1bHQsIHR5cGUsIHBhcmVudCkgeworICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisKKyAgICB0aGlzLmNoaWxkcmVuID0gW107CisKKyAgICB0aGlzLmFkZENoaWxkID0gZnVuY3Rpb24ocmVzdWx0LCB0eXBlKSB7CisgICAgICB0aGlzLmNoaWxkcmVuLnB1c2gobmV3IFJlc3VsdHNOb2RlKHJlc3VsdCwgdHlwZSwgdGhpcykpOworICAgIH07CisKKyAgICB0aGlzLmxhc3QgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CisgICAgfTsKKyAgfQorCisgIHJldHVybiBSZXN1bHRzTm9kZTsKK307CisKK2phc21pbmVSZXF1aXJlLlF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIGZ1bmN0aW9uIFF1ZXJ5U3RyaW5nKG9wdGlvbnMpIHsKKworICAgIHRoaXMuc2V0UGFyYW0gPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICB2YXIgcGFyYW1NYXAgPSBxdWVyeVN0cmluZ1RvUGFyYW1NYXAoKTsKKyAgICAgIHBhcmFtTWFwW2tleV0gPSB2YWx1ZTsKKyAgICAgIG9wdGlvbnMuZ2V0V2luZG93TG9jYXRpb24oKS5zZWFyY2ggPSB0b1F1ZXJ5U3RyaW5nKHBhcmFtTWFwKTsKKyAgICB9OworCisgICAgdGhpcy5nZXRQYXJhbSA9IGZ1bmN0aW9uKGtleSkgeworICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nVG9QYXJhbU1hcCgpW2tleV07CisgICAgfTsKKworICAgIHJldHVybiB0aGlzOworCisgICAgZnVuY3Rpb24gdG9RdWVyeVN0cmluZyhwYXJhbU1hcCkgeworICAgICAgdmFyIHFTdHJQYWlycyA9IFtdOworICAgICAgZm9yICh2YXIgcHJvcCBpbiBwYXJhbU1hcCkgeworICAgICAgICBxU3RyUGFpcnMucHVzaChlbmNvZGVVUklDb21wb25lbnQocHJvcCkgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1NYXBbcHJvcF0pKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAiPyIgKyBxU3RyUGFpcnMuam9pbignJicpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nVG9QYXJhbU1hcCgpIHsKKyAgICAgIHZhciBwYXJhbVN0ciA9IG9wdGlvbnMuZ2V0V2luZG93TG9jYXRpb24oKS5zZWFyY2guc3Vic3RyaW5nKDEpLAorICAgICAgICBwYXJhbXMgPSBbXSwKKyAgICAgICAgcGFyYW1NYXAgPSB7fTsKKworICAgICAgaWYgKHBhcmFtU3RyLmxlbmd0aCA+IDApIHsKKyAgICAgICAgcGFyYW1zID0gcGFyYW1TdHIuc3BsaXQoJyYnKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICB2YXIgcCA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOworICAgICAgICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChwWzFdKTsKKyAgICAgICAgICBpZiAodmFsdWUgPT09ICJ0cnVlIiB8fCB2YWx1ZSA9PT0gImZhbHNlIikgeworICAgICAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGFyYW1NYXBbZGVjb2RlVVJJQ29tcG9uZW50KHBbMF0pXSA9IHZhbHVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBwYXJhbU1hcDsKKyAgICB9CisKKyAgfQorCisgIHJldHVybiBRdWVyeVN0cmluZzsKK307CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9qYXNtaW5lLmNzcyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL2xpYi9qYXNtaW5lLTIuMC4wL2phc21pbmUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDM1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9saWIvamFzbWluZS0yLjAuMC9qYXNtaW5lLmNzcwpAQCAtMCwwICsxLDU1IEBACitib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsgcGFkZGluZzogMDsgbWFyZ2luOiA1cHg7IG92ZXJmbG93LXk6IHNjcm9sbDsgfQorCisuaHRtbC1yZXBvcnRlciB7IGZvbnQtc2l6ZTogMTFweDsgZm9udC1mYW1pbHk6IE1vbmFjbywgIkx1Y2lkYSBDb25zb2xlIiwgbW9ub3NwYWNlOyBsaW5lLWhlaWdodDogMTRweDsgY29sb3I6ICMzMzMzMzM7IH0KKy5odG1sLXJlcG9ydGVyIGEgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KKy5odG1sLXJlcG9ydGVyIGE6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQorLmh0bWwtcmVwb3J0ZXIgcCwgLmh0bWwtcmVwb3J0ZXIgaDEsIC5odG1sLXJlcG9ydGVyIGgyLCAuaHRtbC1yZXBvcnRlciBoMywgLmh0bWwtcmVwb3J0ZXIgaDQsIC5odG1sLXJlcG9ydGVyIGg1LCAuaHRtbC1yZXBvcnRlciBoNiB7IG1hcmdpbjogMDsgbGluZS1oZWlnaHQ6IDE0cHg7IH0KKy5odG1sLXJlcG9ydGVyIC5iYW5uZXIsIC5odG1sLXJlcG9ydGVyIC5zeW1ib2wtc3VtbWFyeSwgLmh0bWwtcmVwb3J0ZXIgLnN1bW1hcnksIC5odG1sLXJlcG9ydGVyIC5yZXN1bHQtbWVzc2FnZSwgLmh0bWwtcmVwb3J0ZXIgLnNwZWMgLmRlc2NyaXB0aW9uLCAuaHRtbC1yZXBvcnRlciAuc3BlYy1kZXRhaWwgLmRlc2NyaXB0aW9uLCAuaHRtbC1yZXBvcnRlciAuYWxlcnQgLmJhciwgLmh0bWwtcmVwb3J0ZXIgLnN0YWNrLXRyYWNlIHsgcGFkZGluZy1sZWZ0OiA5cHg7IHBhZGRpbmctcmlnaHQ6IDlweDsgfQorLmh0bWwtcmVwb3J0ZXIgLmJhbm5lciAudmVyc2lvbiB7IG1hcmdpbi1sZWZ0OiAxNHB4OyB9CisuaHRtbC1yZXBvcnRlciAjamFzbWluZV9jb250ZW50IHsgcG9zaXRpb246IGZpeGVkOyByaWdodDogMTAwJTsgfQorLmh0bWwtcmVwb3J0ZXIgLnZlcnNpb24geyBjb2xvcjogI2FhYWFhYTsgfQorLmh0bWwtcmVwb3J0ZXIgLmJhbm5lciB7IG1hcmdpbi10b3A6IDE0cHg7IH0KKy5odG1sLXJlcG9ydGVyIC5kdXJhdGlvbiB7IGNvbG9yOiAjYWFhYWFhOyBmbG9hdDogcmlnaHQ7IH0KKy5odG1sLXJlcG9ydGVyIC5zeW1ib2wtc3VtbWFyeSB7IG92ZXJmbG93OiBoaWRkZW47ICp6b29tOiAxOyBtYXJnaW46IDE0cHggMDsgfQorLmh0bWwtcmVwb3J0ZXIgLnN5bWJvbC1zdW1tYXJ5IGxpIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBoZWlnaHQ6IDhweDsgd2lkdGg6IDE0cHg7IGZvbnQtc2l6ZTogMTZweDsgfQorLmh0bWwtcmVwb3J0ZXIgLnN5bWJvbC1zdW1tYXJ5IGxpLnBhc3NlZCB7IGZvbnQtc2l6ZTogMTRweDsgfQorLmh0bWwtcmVwb3J0ZXIgLnN5bWJvbC1zdW1tYXJ5IGxpLnBhc3NlZDpiZWZvcmUgeyBjb2xvcjogIzVlN2QwMDsgY29udGVudDogIlwwMjAyMiI7IH0KKy5odG1sLXJlcG9ydGVyIC5zeW1ib2wtc3VtbWFyeSBsaS5mYWlsZWQgeyBsaW5lLWhlaWdodDogOXB4OyB9CisuaHRtbC1yZXBvcnRlciAuc3ltYm9sLXN1bW1hcnkgbGkuZmFpbGVkOmJlZm9yZSB7IGNvbG9yOiAjYjAzOTExOyBjb250ZW50OiAieCI7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tbGVmdDogLTFweDsgfQorLmh0bWwtcmVwb3J0ZXIgLnN5bWJvbC1zdW1tYXJ5IGxpLmRpc2FibGVkIHsgZm9udC1zaXplOiAxNHB4OyB9CisuaHRtbC1yZXBvcnRlciAuc3ltYm9sLXN1bW1hcnkgbGkuZGlzYWJsZWQ6YmVmb3JlIHsgY29sb3I6ICNiYWJhYmE7IGNvbnRlbnQ6ICJcMDIwMjIiOyB9CisuaHRtbC1yZXBvcnRlciAuc3ltYm9sLXN1bW1hcnkgbGkucGVuZGluZyB7IGxpbmUtaGVpZ2h0OiAxN3B4OyB9CisuaHRtbC1yZXBvcnRlciAuc3ltYm9sLXN1bW1hcnkgbGkucGVuZGluZzpiZWZvcmUgeyBjb2xvcjogI2JhOWQzNzsgY29udGVudDogIioiOyB9CisuaHRtbC1yZXBvcnRlciAuZXhjZXB0aW9ucyB7IGNvbG9yOiAjZmZmOyBmbG9hdDogcmlnaHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IH0KKy5odG1sLXJlcG9ydGVyIC5iYXIgeyBsaW5lLWhlaWdodDogMjhweDsgZm9udC1zaXplOiAxNHB4OyBkaXNwbGF5OiBibG9jazsgY29sb3I6ICNlZWU7IH0KKy5odG1sLXJlcG9ydGVyIC5iYXIuZmFpbGVkIHsgYmFja2dyb3VuZC1jb2xvcjogI2IwMzkxMTsgfQorLmh0bWwtcmVwb3J0ZXIgLmJhci5wYXNzZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYTZiNzc5OyB9CisuaHRtbC1yZXBvcnRlciAuYmFyLnNraXBwZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYmFiYWJhOyB9CisuaHRtbC1yZXBvcnRlciAuYmFyLm1lbnUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBjb2xvcjogI2FhYWFhYTsgfQorLmh0bWwtcmVwb3J0ZXIgLmJhci5tZW51IGEgeyBjb2xvcjogIzMzMzMzMzsgfQorLmh0bWwtcmVwb3J0ZXIgLmJhciBhIHsgY29sb3I6IHdoaXRlOyB9CisuaHRtbC1yZXBvcnRlci5zcGVjLWxpc3QgLmJhci5tZW51LmZhaWx1cmUtbGlzdCwgLmh0bWwtcmVwb3J0ZXIuc3BlYy1saXN0IC5yZXN1bHRzIC5mYWlsdXJlcyB7IGRpc3BsYXk6IG5vbmU7IH0KKy5odG1sLXJlcG9ydGVyLmZhaWx1cmUtbGlzdCAuYmFyLm1lbnUuc3BlYy1saXN0LCAuaHRtbC1yZXBvcnRlci5mYWlsdXJlLWxpc3QgLnN1bW1hcnkgeyBkaXNwbGF5OiBub25lOyB9CisuaHRtbC1yZXBvcnRlciAucnVubmluZy1hbGVydCB7IGJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7IH0KKy5odG1sLXJlcG9ydGVyIC5yZXN1bHRzIHsgbWFyZ2luLXRvcDogMTRweDsgfQorLmh0bWwtcmVwb3J0ZXIuc2hvd0RldGFpbHMgLnN1bW1hcnlNZW51SXRlbSB7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsgfQorLmh0bWwtcmVwb3J0ZXIuc2hvd0RldGFpbHMgLnN1bW1hcnlNZW51SXRlbTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisuaHRtbC1yZXBvcnRlci5zaG93RGV0YWlscyAuZGV0YWlsc01lbnVJdGVtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisuaHRtbC1yZXBvcnRlci5zaG93RGV0YWlscyAuc3VtbWFyeSB7IGRpc3BsYXk6IG5vbmU7IH0KKy5odG1sLXJlcG9ydGVyLnNob3dEZXRhaWxzICNkZXRhaWxzIHsgZGlzcGxheTogYmxvY2s7IH0KKy5odG1sLXJlcG9ydGVyIC5zdW1tYXJ5TWVudUl0ZW0geyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KKy5odG1sLXJlcG9ydGVyIC5zdW1tYXJ5IHsgbWFyZ2luLXRvcDogMTRweDsgfQorLmh0bWwtcmVwb3J0ZXIgLnN1bW1hcnkgdWwgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IG1hcmdpbi1sZWZ0OiAxNHB4OyBwYWRkaW5nLXRvcDogMDsgcGFkZGluZy1sZWZ0OiAwOyB9CisuaHRtbC1yZXBvcnRlciAuc3VtbWFyeSB1bC5zdWl0ZSB7IG1hcmdpbi10b3A6IDdweDsgbWFyZ2luLWJvdHRvbTogN3B4OyB9CisuaHRtbC1yZXBvcnRlciAuc3VtbWFyeSBsaS5wYXNzZWQgYSB7IGNvbG9yOiAjNWU3ZDAwOyB9CisuaHRtbC1yZXBvcnRlciAuc3VtbWFyeSBsaS5mYWlsZWQgYSB7IGNvbG9yOiAjYjAzOTExOyB9CisuaHRtbC1yZXBvcnRlciAuc3VtbWFyeSBsaS5wZW5kaW5nIGEgeyBjb2xvcjogI2JhOWQzNzsgfQorLmh0bWwtcmVwb3J0ZXIgLmRlc2NyaXB0aW9uICsgLnN1aXRlIHsgbWFyZ2luLXRvcDogMDsgfQorLmh0bWwtcmVwb3J0ZXIgLnN1aXRlIHsgbWFyZ2luLXRvcDogMTRweDsgfQorLmh0bWwtcmVwb3J0ZXIgLnN1aXRlIGEgeyBjb2xvcjogIzMzMzMzMzsgfQorLmh0bWwtcmVwb3J0ZXIgLmZhaWx1cmVzIC5zcGVjLWRldGFpbCB7IG1hcmdpbi1ib3R0b206IDI4cHg7IH0KKy5odG1sLXJlcG9ydGVyIC5mYWlsdXJlcyAuc3BlYy1kZXRhaWwgLmRlc2NyaXB0aW9uIHsgYmFja2dyb3VuZC1jb2xvcjogI2IwMzkxMTsgfQorLmh0bWwtcmVwb3J0ZXIgLmZhaWx1cmVzIC5zcGVjLWRldGFpbCAuZGVzY3JpcHRpb24gYSB7IGNvbG9yOiB3aGl0ZTsgfQorLmh0bWwtcmVwb3J0ZXIgLnJlc3VsdC1tZXNzYWdlIHsgcGFkZGluZy10b3A6IDE0cHg7IGNvbG9yOiAjMzMzMzMzOyB3aGl0ZS1zcGFjZTogcHJlOyB9CisuaHRtbC1yZXBvcnRlciAucmVzdWx0LW1lc3NhZ2Ugc3Bhbi5yZXN1bHQgeyBkaXNwbGF5OiBibG9jazsgfQorLmh0bWwtcmVwb3J0ZXIgLnN0YWNrLXRyYWNlIHsgbWFyZ2luOiA1cHggMCAwIDA7IG1heC1oZWlnaHQ6IDIyNHB4OyBvdmVyZmxvdzogYXV0bzsgbGluZS1oZWlnaHQ6IDE4cHg7IGNvbG9yOiAjNjY2NjY2OyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgd2hpdGUtc3BhY2U6IHByZTsgfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvamFzbWluZS5qcyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL2xpYi9qYXNtaW5lLTIuMC4wL2phc21pbmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzOTBhMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL2xpYi9qYXNtaW5lLTIuMC4wL2phc21pbmUuanMKQEAgLTAsMCArMSwyNDIyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMyBQaXZvdGFsIExhYnMKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KK2Z1bmN0aW9uIGdldEphc21pbmVSZXF1aXJlT2JqKCkgeworICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gInVuZGVmaW5lZCIgJiYgbW9kdWxlLmV4cG9ydHMpIHsKKyAgICByZXR1cm4gZXhwb3J0czsKKyAgfSBlbHNlIHsKKyAgICB3aW5kb3cuamFzbWluZVJlcXVpcmUgPSB3aW5kb3cuamFzbWluZVJlcXVpcmUgfHwge307CisgICAgcmV0dXJuIHdpbmRvdy5qYXNtaW5lUmVxdWlyZTsKKyAgfQorfQorCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLmNvcmUgPSBmdW5jdGlvbihqUmVxdWlyZSkgeworICB2YXIgaiQgPSB7fTsKKworICBqUmVxdWlyZS5iYXNlKGokKTsKKyAgaiQudXRpbCA9IGpSZXF1aXJlLnV0aWwoKTsKKyAgaiQuQW55ID0galJlcXVpcmUuQW55KCk7CisgIGokLkNhbGxUcmFja2VyID0galJlcXVpcmUuQ2FsbFRyYWNrZXIoKTsKKyAgaiQuQ2xvY2sgPSBqUmVxdWlyZS5DbG9jaygpOworICBqJC5EZWxheWVkRnVuY3Rpb25TY2hlZHVsZXIgPSBqUmVxdWlyZS5EZWxheWVkRnVuY3Rpb25TY2hlZHVsZXIoKTsKKyAgaiQuRW52ID0galJlcXVpcmUuRW52KGokKTsKKyAgaiQuRXhjZXB0aW9uRm9ybWF0dGVyID0galJlcXVpcmUuRXhjZXB0aW9uRm9ybWF0dGVyKCk7CisgIGokLkV4cGVjdGF0aW9uID0galJlcXVpcmUuRXhwZWN0YXRpb24oKTsKKyAgaiQuYnVpbGRFeHBlY3RhdGlvblJlc3VsdCA9IGpSZXF1aXJlLmJ1aWxkRXhwZWN0YXRpb25SZXN1bHQoKTsKKyAgaiQuSnNBcGlSZXBvcnRlciA9IGpSZXF1aXJlLkpzQXBpUmVwb3J0ZXIoKTsKKyAgaiQubWF0Y2hlcnNVdGlsID0galJlcXVpcmUubWF0Y2hlcnNVdGlsKGokKTsKKyAgaiQuT2JqZWN0Q29udGFpbmluZyA9IGpSZXF1aXJlLk9iamVjdENvbnRhaW5pbmcoaiQpOworICBqJC5wcCA9IGpSZXF1aXJlLnBwKGokKTsKKyAgaiQuUXVldWVSdW5uZXIgPSBqUmVxdWlyZS5RdWV1ZVJ1bm5lcigpOworICBqJC5SZXBvcnREaXNwYXRjaGVyID0galJlcXVpcmUuUmVwb3J0RGlzcGF0Y2hlcigpOworICBqJC5TcGVjID0galJlcXVpcmUuU3BlYyhqJCk7CisgIGokLlNweVN0cmF0ZWd5ID0galJlcXVpcmUuU3B5U3RyYXRlZ3koKTsKKyAgaiQuU3VpdGUgPSBqUmVxdWlyZS5TdWl0ZSgpOworICBqJC5UaW1lciA9IGpSZXF1aXJlLlRpbWVyKCk7CisgIGokLnZlcnNpb24gPSBqUmVxdWlyZS52ZXJzaW9uKCk7CisKKyAgaiQubWF0Y2hlcnMgPSBqUmVxdWlyZS5yZXF1aXJlTWF0Y2hlcnMoalJlcXVpcmUsIGokKTsKKworICByZXR1cm4gaiQ7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLnJlcXVpcmVNYXRjaGVycyA9IGZ1bmN0aW9uKGpSZXF1aXJlLCBqJCkgeworICB2YXIgYXZhaWxhYmxlTWF0Y2hlcnMgPSBbCisgICAgICAidG9CZSIsCisgICAgICAidG9CZUNsb3NlVG8iLAorICAgICAgInRvQmVEZWZpbmVkIiwKKyAgICAgICJ0b0JlRmFsc3kiLAorICAgICAgInRvQmVHcmVhdGVyVGhhbiIsCisgICAgICAidG9CZUxlc3NUaGFuIiwKKyAgICAgICJ0b0JlTmFOIiwKKyAgICAgICJ0b0JlTnVsbCIsCisgICAgICAidG9CZVRydXRoeSIsCisgICAgICAidG9CZVVuZGVmaW5lZCIsCisgICAgICAidG9Db250YWluIiwKKyAgICAgICJ0b0VxdWFsIiwKKyAgICAgICJ0b0hhdmVCZWVuQ2FsbGVkIiwKKyAgICAgICJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsCisgICAgICAidG9NYXRjaCIsCisgICAgICAidG9UaHJvdyIsCisgICAgICAidG9UaHJvd0Vycm9yIgorICAgIF0sCisgICAgbWF0Y2hlcnMgPSB7fTsKKworICBmb3IgKHZhciBpID0gMDsgaSA8IGF2YWlsYWJsZU1hdGNoZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgdmFyIG5hbWUgPSBhdmFpbGFibGVNYXRjaGVyc1tpXTsKKyAgICBtYXRjaGVyc1tuYW1lXSA9IGpSZXF1aXJlW25hbWVdKGokKTsKKyAgfQorCisgIHJldHVybiBtYXRjaGVyczsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkuYmFzZSA9IGZ1bmN0aW9uKGokKSB7CisgIGokLnVuaW1wbGVtZW50ZWRNZXRob2RfID0gZnVuY3Rpb24oKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmltcGxlbWVudGVkIG1ldGhvZCIpOworICB9OworCisgIGokLk1BWF9QUkVUVFlfUFJJTlRfREVQVEggPSA0MDsKKyAgaiQuREVGQVVMVF9USU1FT1VUX0lOVEVSVkFMID0gNTAwMDsKKworICBqJC5nZXRHbG9iYWwgPSAoZnVuY3Rpb24oKSB7CisgICAgdmFyIGphc21pbmVHbG9iYWwgPSBldmFsLmNhbGwobnVsbCwgInRoaXMiKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gamFzbWluZUdsb2JhbDsKKyAgICB9OworICB9KSgpOworCisgIGokLmdldEVudiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICB2YXIgZW52ID0gaiQuY3VycmVudEVudl8gPSBqJC5jdXJyZW50RW52XyB8fCBuZXcgaiQuRW52KG9wdGlvbnMpOworICAgIC8vamFzbWluZS4gc2luZ2xldG9ucyBpbiBoZXJlIChzZXRUaW1lb3V0IGJsYWggYmxhaCkuCisgICAgcmV0dXJuIGVudjsKKyAgfTsKKworICBqJC5pc0FycmF5XyA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIGokLmlzQV8oIkFycmF5IiwgdmFsdWUpOworICB9OworCisgIGokLmlzU3RyaW5nXyA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIGokLmlzQV8oIlN0cmluZyIsIHZhbHVlKTsKKyAgfTsKKworICBqJC5pc051bWJlcl8gPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIHJldHVybiBqJC5pc0FfKCJOdW1iZXIiLCB2YWx1ZSk7CisgIH07CisKKyAgaiQuaXNBXyA9IGZ1bmN0aW9uKHR5cGVOYW1lLCB2YWx1ZSkgeworICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHZhbHVlKSA9PT0gJ1tvYmplY3QgJyArIHR5cGVOYW1lICsgJ10nOworICB9OworCisgIGokLmlzRG9tTm9kZSA9IGZ1bmN0aW9uKG9iaikgeworICAgIHJldHVybiBvYmoubm9kZVR5cGUgPiAwOworICB9OworCisgIGokLmFueSA9IGZ1bmN0aW9uKGNsYXp6KSB7CisgICAgcmV0dXJuIG5ldyBqJC5BbnkoY2xhenopOworICB9OworCisgIGokLm9iamVjdENvbnRhaW5pbmcgPSBmdW5jdGlvbihzYW1wbGUpIHsKKyAgICByZXR1cm4gbmV3IGokLk9iamVjdENvbnRhaW5pbmcoc2FtcGxlKTsKKyAgfTsKKworICBqJC5jcmVhdGVTcHkgPSBmdW5jdGlvbihuYW1lLCBvcmlnaW5hbEZuKSB7CisKKyAgICB2YXIgc3B5U3RyYXRlZ3kgPSBuZXcgaiQuU3B5U3RyYXRlZ3koeworICAgICAgICBuYW1lOiBuYW1lLAorICAgICAgICBmbjogb3JpZ2luYWxGbiwKKyAgICAgICAgZ2V0U3B5OiBmdW5jdGlvbigpIHsgcmV0dXJuIHNweTsgfQorICAgICAgfSksCisgICAgICBjYWxsVHJhY2tlciA9IG5ldyBqJC5DYWxsVHJhY2tlcigpLAorICAgICAgc3B5ID0gZnVuY3Rpb24oKSB7CisgICAgICAgIGNhbGxUcmFja2VyLnRyYWNrKHsKKyAgICAgICAgICBvYmplY3Q6IHRoaXMsCisgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzcHlTdHJhdGVneS5leGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICB9OworCisgICAgZm9yICh2YXIgcHJvcCBpbiBvcmlnaW5hbEZuKSB7CisgICAgICBpZiAocHJvcCA9PT0gJ2FuZCcgfHwgcHJvcCA9PT0gJ2NhbGxzJykgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkphc21pbmUgc3BpZXMgd291bGQgb3ZlcndyaXRlIHRoZSAnYW5kJyBhbmQgJ2NhbGxzJyBwcm9wZXJ0aWVzIG9uIHRoZSBvYmplY3QgYmVpbmcgc3BpZWQgdXBvbiIpOworICAgICAgfQorCisgICAgICBzcHlbcHJvcF0gPSBvcmlnaW5hbEZuW3Byb3BdOworICAgIH0KKworICAgIHNweS5hbmQgPSBzcHlTdHJhdGVneTsKKyAgICBzcHkuY2FsbHMgPSBjYWxsVHJhY2tlcjsKKworICAgIHJldHVybiBzcHk7CisgIH07CisKKyAgaiQuaXNTcHkgPSBmdW5jdGlvbihwdXRhdGl2ZVNweSkgeworICAgIGlmICghcHV0YXRpdmVTcHkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHB1dGF0aXZlU3B5LmFuZCBpbnN0YW5jZW9mIGokLlNweVN0cmF0ZWd5ICYmCisgICAgICBwdXRhdGl2ZVNweS5jYWxscyBpbnN0YW5jZW9mIGokLkNhbGxUcmFja2VyOworICB9OworCisgIGokLmNyZWF0ZVNweU9iaiA9IGZ1bmN0aW9uKGJhc2VOYW1lLCBtZXRob2ROYW1lcykgeworICAgIGlmICghaiQuaXNBcnJheV8obWV0aG9kTmFtZXMpIHx8IG1ldGhvZE5hbWVzLmxlbmd0aCA9PT0gMCkgeworICAgICAgdGhyb3cgImNyZWF0ZVNweU9iaiByZXF1aXJlcyBhIG5vbi1lbXB0eSBhcnJheSBvZiBtZXRob2QgbmFtZXMgdG8gY3JlYXRlIHNwaWVzIGZvciI7CisgICAgfQorICAgIHZhciBvYmogPSB7fTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGhvZE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBvYmpbbWV0aG9kTmFtZXNbaV1dID0gaiQuY3JlYXRlU3B5KGJhc2VOYW1lICsgJy4nICsgbWV0aG9kTmFtZXNbaV0pOworICAgIH0KKyAgICByZXR1cm4gb2JqOworICB9OworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS51dGlsID0gZnVuY3Rpb24oKSB7CisKKyAgdmFyIHV0aWwgPSB7fTsKKworICB1dGlsLmluaGVyaXQgPSBmdW5jdGlvbihjaGlsZENsYXNzLCBwYXJlbnRDbGFzcykgeworICAgIHZhciBTdWJjbGFzcyA9IGZ1bmN0aW9uKCkgeworICAgIH07CisgICAgU3ViY2xhc3MucHJvdG90eXBlID0gcGFyZW50Q2xhc3MucHJvdG90eXBlOworICAgIGNoaWxkQ2xhc3MucHJvdG90eXBlID0gbmV3IFN1YmNsYXNzKCk7CisgIH07CisKKyAgdXRpbC5odG1sRXNjYXBlID0gZnVuY3Rpb24oc3RyKSB7CisgICAgaWYgKCFzdHIpIHsKKyAgICAgIHJldHVybiBzdHI7CisgICAgfQorICAgIHJldHVybiBzdHIucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQorICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKQorICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKKyAgfTsKKworICB1dGlsLmFyZ3NUb0FycmF5ID0gZnVuY3Rpb24oYXJncykgeworICAgIHZhciBhcnJheU9mQXJncyA9IFtdOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgYXJyYXlPZkFyZ3MucHVzaChhcmdzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGFycmF5T2ZBcmdzOworICB9OworCisgIHV0aWwuaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvYmopIHsKKyAgICByZXR1cm4gb2JqID09PSB2b2lkIDA7CisgIH07CisKKyAgcmV0dXJuIHV0aWw7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLlNwZWMgPSBmdW5jdGlvbihqJCkgeworICBmdW5jdGlvbiBTcGVjKGF0dHJzKSB7CisgICAgdGhpcy5leHBlY3RhdGlvbkZhY3RvcnkgPSBhdHRycy5leHBlY3RhdGlvbkZhY3Rvcnk7CisgICAgdGhpcy5yZXN1bHRDYWxsYmFjayA9IGF0dHJzLnJlc3VsdENhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307CisgICAgdGhpcy5pZCA9IGF0dHJzLmlkOworICAgIHRoaXMuZGVzY3JpcHRpb24gPSBhdHRycy5kZXNjcmlwdGlvbiB8fCAnJzsKKyAgICB0aGlzLmZuID0gYXR0cnMuZm47CisgICAgdGhpcy5iZWZvcmVGbnMgPSBhdHRycy5iZWZvcmVGbnMgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfTsKKyAgICB0aGlzLmFmdGVyRm5zID0gYXR0cnMuYWZ0ZXJGbnMgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfTsKKyAgICB0aGlzLm9uU3RhcnQgPSBhdHRycy5vblN0YXJ0IHx8IGZ1bmN0aW9uKCkge307CisgICAgdGhpcy5leGNlcHRpb25Gb3JtYXR0ZXIgPSBhdHRycy5leGNlcHRpb25Gb3JtYXR0ZXIgfHwgZnVuY3Rpb24oKSB7fTsKKyAgICB0aGlzLmdldFNwZWNOYW1lID0gYXR0cnMuZ2V0U3BlY05hbWUgfHwgZnVuY3Rpb24oKSB7IHJldHVybiAnJzsgfTsKKyAgICB0aGlzLmV4cGVjdGF0aW9uUmVzdWx0RmFjdG9yeSA9IGF0dHJzLmV4cGVjdGF0aW9uUmVzdWx0RmFjdG9yeSB8fCBmdW5jdGlvbigpIHsgfTsKKyAgICB0aGlzLnF1ZXVlUnVubmVyRmFjdG9yeSA9IGF0dHJzLnF1ZXVlUnVubmVyRmFjdG9yeSB8fCBmdW5jdGlvbigpIHt9OworICAgIHRoaXMuY2F0Y2hpbmdFeGNlcHRpb25zID0gYXR0cnMuY2F0Y2hpbmdFeGNlcHRpb25zIHx8IGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfTsKKworICAgIHRoaXMudGltZXIgPSBhdHRycy50aW1lciB8fCB7c2V0VGltZW91dDogc2V0VGltZW91dCwgY2xlYXJUaW1lb3V0OiBjbGVhclRpbWVvdXR9OworCisgICAgaWYgKCF0aGlzLmZuKSB7CisgICAgICB0aGlzLnBlbmQoKTsKKyAgICB9CisKKyAgICB0aGlzLnJlc3VsdCA9IHsKKyAgICAgIGlkOiB0aGlzLmlkLAorICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sCisgICAgICBmdWxsTmFtZTogdGhpcy5nZXRGdWxsTmFtZSgpLAorICAgICAgZmFpbGVkRXhwZWN0YXRpb25zOiBbXQorICAgIH07CisgIH0KKworICBTcGVjLnByb3RvdHlwZS5hZGRFeHBlY3RhdGlvblJlc3VsdCA9IGZ1bmN0aW9uKHBhc3NlZCwgZGF0YSkgeworICAgIGlmIChwYXNzZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGhpcy5yZXN1bHQuZmFpbGVkRXhwZWN0YXRpb25zLnB1c2godGhpcy5leHBlY3RhdGlvblJlc3VsdEZhY3RvcnkoZGF0YSkpOworICB9OworCisgIFNwZWMucHJvdG90eXBlLmV4cGVjdCA9IGZ1bmN0aW9uKGFjdHVhbCkgeworICAgIHJldHVybiB0aGlzLmV4cGVjdGF0aW9uRmFjdG9yeShhY3R1YWwsIHRoaXMpOworICB9OworCisgIFNwZWMucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihvbkNvbXBsZXRlKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzLAorICAgICAgICB0aW1lb3V0OworCisgICAgdGhpcy5vblN0YXJ0KHRoaXMpOworCisgICAgaWYgKHRoaXMubWFya2VkUGVuZGluZyB8fCB0aGlzLmRpc2FibGVkKSB7CisgICAgICBjb21wbGV0ZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRpbWVvdXRhYmxlKGZuKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oZG9uZSkgeworICAgICAgICB0aW1lb3V0ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmFwcGx5KHNlbGYudGltZXIuc2V0VGltZW91dCwgW2okLmdldEdsb2JhbCgpLCBbZnVuY3Rpb24oKSB7CisgICAgICAgICAgb25FeGNlcHRpb24obmV3IEVycm9yKCdUaW1lb3V0IC0gQXN5bmMgY2FsbGJhY2sgd2FzIG5vdCBpbnZva2VkIHdpdGhpbiB0aW1lb3V0IHNwZWNpZmllZCBieSBqYXNtaW5lLkRFRkFVTFRfVElNRU9VVF9JTlRFUlZBTC4nKSk7CisgICAgICAgICAgZG9uZSgpOworICAgICAgICB9LCBqJC5ERUZBVUxUX1RJTUVPVVRfSU5URVJWQUxdXSk7CisKKyAgICAgICAgdmFyIGNhbGxEb25lID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgY2xlYXJUaW1lb3V0YWJsZSgpOworICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfTsKKworICAgICAgICBmbi5jYWxsKHRoaXMsIGNhbGxEb25lKTsgLy9UT0RPOiBkbyB3ZSBjYXJlIGFib3V0IG1vcmUgdGhhbiAxIGFyZz8KKyAgICAgIH07CisgICAgfQorCisgICAgZnVuY3Rpb24gY2xlYXJUaW1lb3V0YWJsZSgpIHsKKyAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShzZWxmLnRpbWVyLmNsZWFyVGltZW91dCwgW2okLmdldEdsb2JhbCgpLCBbdGltZW91dF1dKTsKKyAgICAgIHRpbWVvdXQgPSB2b2lkIDA7CisgICAgfQorCisgICAgdmFyIGFsbEZucyA9IHRoaXMuYmVmb3JlRm5zKCkuY29uY2F0KHRoaXMuZm4pLmNvbmNhdCh0aGlzLmFmdGVyRm5zKCkpLAorICAgICAgYWxsVGltZW91dGFibGVGbnMgPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbEZucy5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIGZuID0gYWxsRm5zW2ldOworICAgICAgYWxsVGltZW91dGFibGVGbnMucHVzaChmbi5sZW5ndGggPiAwID8gdGltZW91dGFibGUoZm4pIDogZm4pOworICAgIH0KKworICAgIHRoaXMucXVldWVSdW5uZXJGYWN0b3J5KHsKKyAgICAgIGZuczogYWxsVGltZW91dGFibGVGbnMsCisgICAgICBvbkV4Y2VwdGlvbjogb25FeGNlcHRpb24sCisgICAgICBvbkNvbXBsZXRlOiBjb21wbGV0ZQorICAgIH0pOworCisgICAgZnVuY3Rpb24gb25FeGNlcHRpb24oZSkgeworICAgICAgY2xlYXJUaW1lb3V0YWJsZSgpOworICAgICAgaWYgKFNwZWMuaXNQZW5kaW5nU3BlY0V4Y2VwdGlvbihlKSkgeworICAgICAgICBzZWxmLnBlbmQoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBzZWxmLmFkZEV4cGVjdGF0aW9uUmVzdWx0KGZhbHNlLCB7CisgICAgICAgIG1hdGNoZXJOYW1lOiAiIiwKKyAgICAgICAgcGFzc2VkOiBmYWxzZSwKKyAgICAgICAgZXhwZWN0ZWQ6ICIiLAorICAgICAgICBhY3R1YWw6ICIiLAorICAgICAgICBlcnJvcjogZQorICAgICAgfSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gY29tcGxldGUoKSB7CisgICAgICBzZWxmLnJlc3VsdC5zdGF0dXMgPSBzZWxmLnN0YXR1cygpOworICAgICAgc2VsZi5yZXN1bHRDYWxsYmFjayhzZWxmLnJlc3VsdCk7CisKKyAgICAgIGlmIChvbkNvbXBsZXRlKSB7CisgICAgICAgIG9uQ29tcGxldGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgU3BlYy5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOworICB9OworCisgIFNwZWMucHJvdG90eXBlLnBlbmQgPSBmdW5jdGlvbigpIHsKKyAgICB0aGlzLm1hcmtlZFBlbmRpbmcgPSB0cnVlOworICB9OworCisgIFNwZWMucHJvdG90eXBlLnN0YXR1cyA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CisgICAgICByZXR1cm4gJ2Rpc2FibGVkJzsKKyAgICB9CisKKyAgICBpZiAodGhpcy5tYXJrZWRQZW5kaW5nKSB7CisgICAgICByZXR1cm4gJ3BlbmRpbmcnOworICAgIH0KKworICAgIGlmICh0aGlzLnJlc3VsdC5mYWlsZWRFeHBlY3RhdGlvbnMubGVuZ3RoID4gMCkgeworICAgICAgcmV0dXJuICdmYWlsZWQnOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gJ3Bhc3NlZCc7CisgICAgfQorICB9OworCisgIFNwZWMucHJvdG90eXBlLmdldEZ1bGxOYW1lID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0U3BlY05hbWUodGhpcyk7CisgIH07CisKKyAgU3BlYy5wZW5kaW5nU3BlY0V4Y2VwdGlvbk1lc3NhZ2UgPSAiPT4gbWFya2VkIFBlbmRpbmciOworCisgIFNwZWMuaXNQZW5kaW5nU3BlY0V4Y2VwdGlvbiA9IGZ1bmN0aW9uKGUpIHsKKyAgICByZXR1cm4gZS50b1N0cmluZygpLmluZGV4T2YoU3BlYy5wZW5kaW5nU3BlY0V4Y2VwdGlvbk1lc3NhZ2UpICE9PSAtMTsKKyAgfTsKKworICByZXR1cm4gU3BlYzsKK307CisKK2lmICh0eXBlb2Ygd2luZG93ID09IHZvaWQgMCAmJiB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IikgeworICBleHBvcnRzLlNwZWMgPSBqYXNtaW5lUmVxdWlyZS5TcGVjOworfQorCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLkVudiA9IGZ1bmN0aW9uKGokKSB7CisgIGZ1bmN0aW9uIEVudihvcHRpb25zKSB7CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdmFyIGdsb2JhbCA9IG9wdGlvbnMuZ2xvYmFsIHx8IGokLmdldEdsb2JhbCgpOworCisgICAgdmFyIHRvdGFsU3BlY3NEZWZpbmVkID0gMDsKKworICAgIHZhciBjYXRjaEV4Y2VwdGlvbnMgPSB0cnVlOworCisgICAgdmFyIHJlYWxTZXRUaW1lb3V0ID0gaiQuZ2V0R2xvYmFsKCkuc2V0VGltZW91dDsKKyAgICB2YXIgcmVhbENsZWFyVGltZW91dCA9IGokLmdldEdsb2JhbCgpLmNsZWFyVGltZW91dDsKKyAgICB0aGlzLmNsb2NrID0gbmV3IGokLkNsb2NrKGdsb2JhbCwgbmV3IGokLkRlbGF5ZWRGdW5jdGlvblNjaGVkdWxlcigpKTsKKworICAgIHZhciBydW5uYWJsZUxvb2t1cFRhYmxlID0ge307CisKKyAgICB2YXIgc3BpZXMgPSBbXTsKKworICAgIHZhciBjdXJyZW50U3BlYyA9IG51bGw7CisgICAgdmFyIGN1cnJlbnRTdWl0ZSA9IG51bGw7CisKKyAgICB2YXIgcmVwb3J0ZXIgPSBuZXcgaiQuUmVwb3J0RGlzcGF0Y2hlcihbCisgICAgICAiamFzbWluZVN0YXJ0ZWQiLAorICAgICAgImphc21pbmVEb25lIiwKKyAgICAgICJzdWl0ZVN0YXJ0ZWQiLAorICAgICAgInN1aXRlRG9uZSIsCisgICAgICAic3BlY1N0YXJ0ZWQiLAorICAgICAgInNwZWNEb25lIgorICAgIF0pOworCisgICAgdGhpcy5zcGVjRmlsdGVyID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgdmFyIGVxdWFsaXR5VGVzdGVycyA9IFtdOworCisgICAgdmFyIGN1c3RvbUVxdWFsaXR5VGVzdGVycyA9IFtdOworICAgIHRoaXMuYWRkQ3VzdG9tRXF1YWxpdHlUZXN0ZXIgPSBmdW5jdGlvbih0ZXN0ZXIpIHsKKyAgICAgIGN1c3RvbUVxdWFsaXR5VGVzdGVycy5wdXNoKHRlc3Rlcik7CisgICAgfTsKKworICAgIGokLkV4cGVjdGF0aW9uLmFkZENvcmVNYXRjaGVycyhqJC5tYXRjaGVycyk7CisKKyAgICB2YXIgbmV4dFNwZWNJZCA9IDA7CisgICAgdmFyIGdldE5leHRTcGVjSWQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAnc3BlYycgKyBuZXh0U3BlY0lkKys7CisgICAgfTsKKworICAgIHZhciBuZXh0U3VpdGVJZCA9IDA7CisgICAgdmFyIGdldE5leHRTdWl0ZUlkID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gJ3N1aXRlJyArIG5leHRTdWl0ZUlkKys7CisgICAgfTsKKworICAgIHZhciBleHBlY3RhdGlvbkZhY3RvcnkgPSBmdW5jdGlvbihhY3R1YWwsIHNwZWMpIHsKKyAgICAgIHJldHVybiBqJC5FeHBlY3RhdGlvbi5GYWN0b3J5KHsKKyAgICAgICAgdXRpbDogaiQubWF0Y2hlcnNVdGlsLAorICAgICAgICBjdXN0b21FcXVhbGl0eVRlc3RlcnM6IGN1c3RvbUVxdWFsaXR5VGVzdGVycywKKyAgICAgICAgYWN0dWFsOiBhY3R1YWwsCisgICAgICAgIGFkZEV4cGVjdGF0aW9uUmVzdWx0OiBhZGRFeHBlY3RhdGlvblJlc3VsdAorICAgICAgfSk7CisKKyAgICAgIGZ1bmN0aW9uIGFkZEV4cGVjdGF0aW9uUmVzdWx0KHBhc3NlZCwgcmVzdWx0KSB7CisgICAgICAgIHJldHVybiBzcGVjLmFkZEV4cGVjdGF0aW9uUmVzdWx0KHBhc3NlZCwgcmVzdWx0KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdmFyIHNwZWNTdGFydGVkID0gZnVuY3Rpb24oc3BlYykgeworICAgICAgY3VycmVudFNwZWMgPSBzcGVjOworICAgICAgcmVwb3J0ZXIuc3BlY1N0YXJ0ZWQoc3BlYy5yZXN1bHQpOworICAgIH07CisKKyAgICB2YXIgYmVmb3JlRm5zID0gZnVuY3Rpb24oc3VpdGUpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGJlZm9yZXMgPSBbXTsKKyAgICAgICAgd2hpbGUoc3VpdGUpIHsKKyAgICAgICAgICBiZWZvcmVzID0gYmVmb3Jlcy5jb25jYXQoc3VpdGUuYmVmb3JlRm5zKTsKKyAgICAgICAgICBzdWl0ZSA9IHN1aXRlLnBhcmVudFN1aXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiZWZvcmVzLnJldmVyc2UoKTsKKyAgICAgIH07CisgICAgfTsKKworICAgIHZhciBhZnRlckZucyA9IGZ1bmN0aW9uKHN1aXRlKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBhZnRlcnMgPSBbXTsKKyAgICAgICAgd2hpbGUoc3VpdGUpIHsKKyAgICAgICAgICBhZnRlcnMgPSBhZnRlcnMuY29uY2F0KHN1aXRlLmFmdGVyRm5zKTsKKyAgICAgICAgICBzdWl0ZSA9IHN1aXRlLnBhcmVudFN1aXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZnRlcnM7CisgICAgICB9OworICAgIH07CisKKyAgICB2YXIgZ2V0U3BlY05hbWUgPSBmdW5jdGlvbihzcGVjLCBzdWl0ZSkgeworICAgICAgcmV0dXJuIHN1aXRlLmdldEZ1bGxOYW1lKCkgKyAnICcgKyBzcGVjLmRlc2NyaXB0aW9uOworICAgIH07CisKKyAgICAvLyBUT0RPOiB3ZSBtYXkganVzdCBiZSBhYmxlIHRvIHBhc3MgaW4gdGhlIGZuIGluc3RlYWQgb2Ygd3JhcHBpbmcgaGVyZQorICAgIHZhciBidWlsZEV4cGVjdGF0aW9uUmVzdWx0ID0gaiQuYnVpbGRFeHBlY3RhdGlvblJlc3VsdCwKKyAgICAgICAgZXhjZXB0aW9uRm9ybWF0dGVyID0gbmV3IGokLkV4Y2VwdGlvbkZvcm1hdHRlcigpLAorICAgICAgICBleHBlY3RhdGlvblJlc3VsdEZhY3RvcnkgPSBmdW5jdGlvbihhdHRycykgeworICAgICAgICAgIGF0dHJzLm1lc3NhZ2VGb3JtYXR0ZXIgPSBleGNlcHRpb25Gb3JtYXR0ZXIubWVzc2FnZTsKKyAgICAgICAgICBhdHRycy5zdGFja0Zvcm1hdHRlciA9IGV4Y2VwdGlvbkZvcm1hdHRlci5zdGFjazsKKworICAgICAgICAgIHJldHVybiBidWlsZEV4cGVjdGF0aW9uUmVzdWx0KGF0dHJzKTsKKyAgICAgICAgfTsKKworICAgIC8vIFRPRE86IGZpeCB0aGlzIG5hbWluZywgYW5kIGhlcmUncyB3aGVyZSB0aGUgdmFsdWUgY29tZXMgaW4KKyAgICB0aGlzLmNhdGNoRXhjZXB0aW9ucyA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBjYXRjaEV4Y2VwdGlvbnMgPSAhIXZhbHVlOworICAgICAgcmV0dXJuIGNhdGNoRXhjZXB0aW9uczsKKyAgICB9OworCisgICAgdGhpcy5jYXRjaGluZ0V4Y2VwdGlvbnMgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBjYXRjaEV4Y2VwdGlvbnM7CisgICAgfTsKKworICAgIHZhciBtYXhpbXVtU3BlY0NhbGxiYWNrRGVwdGggPSAyMDsKKyAgICB2YXIgY3VycmVudFNwZWNDYWxsYmFja0RlcHRoID0gMDsKKworICAgIGZ1bmN0aW9uIGNsZWFyU3RhY2soZm4pIHsKKyAgICAgIGN1cnJlbnRTcGVjQ2FsbGJhY2tEZXB0aCsrOworICAgICAgaWYgKGN1cnJlbnRTcGVjQ2FsbGJhY2tEZXB0aCA+PSBtYXhpbXVtU3BlY0NhbGxiYWNrRGVwdGgpIHsKKyAgICAgICAgY3VycmVudFNwZWNDYWxsYmFja0RlcHRoID0gMDsKKyAgICAgICAgcmVhbFNldFRpbWVvdXQoZm4sIDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm4oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgY2F0Y2hFeGNlcHRpb24gPSBmdW5jdGlvbihlKSB7CisgICAgICByZXR1cm4gaiQuU3BlYy5pc1BlbmRpbmdTcGVjRXhjZXB0aW9uKGUpIHx8IGNhdGNoRXhjZXB0aW9uczsKKyAgICB9OworCisgICAgdmFyIHF1ZXVlUnVubmVyRmFjdG9yeSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnMuY2F0Y2hFeGNlcHRpb24gPSBjYXRjaEV4Y2VwdGlvbjsKKyAgICAgIG9wdGlvbnMuY2xlYXJTdGFjayA9IG9wdGlvbnMuY2xlYXJTdGFjayB8fCBjbGVhclN0YWNrOworCisgICAgICBuZXcgaiQuUXVldWVSdW5uZXIob3B0aW9ucykuZXhlY3V0ZSgpOworICAgIH07CisKKyAgICB2YXIgdG9wU3VpdGUgPSBuZXcgaiQuU3VpdGUoeworICAgICAgZW52OiB0aGlzLAorICAgICAgaWQ6IGdldE5leHRTdWl0ZUlkKCksCisgICAgICBkZXNjcmlwdGlvbjogJ0phc21pbmVfX1RvcExldmVsX19TdWl0ZScsCisgICAgICBxdWV1ZVJ1bm5lcjogcXVldWVSdW5uZXJGYWN0b3J5LAorICAgICAgcmVzdWx0Q2FsbGJhY2s6IGZ1bmN0aW9uKCkge30gLy8gVE9ETyAtIGhvb2sgdGhpcyB1cAorICAgIH0pOworICAgIHJ1bm5hYmxlTG9va3VwVGFibGVbdG9wU3VpdGUuaWRdID0gdG9wU3VpdGU7CisgICAgY3VycmVudFN1aXRlID0gdG9wU3VpdGU7CisKKyAgICB0aGlzLnRvcFN1aXRlID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdG9wU3VpdGU7CisgICAgfTsKKworICAgIHRoaXMuZXhlY3V0ZSA9IGZ1bmN0aW9uKHJ1bm5hYmxlc1RvUnVuKSB7CisgICAgICBydW5uYWJsZXNUb1J1biA9IHJ1bm5hYmxlc1RvUnVuIHx8IFt0b3BTdWl0ZS5pZF07CisKKyAgICAgIHZhciBhbGxGbnMgPSBbXTsKKyAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBydW5uYWJsZXNUb1J1bi5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgcnVubmFibGUgPSBydW5uYWJsZUxvb2t1cFRhYmxlW3J1bm5hYmxlc1RvUnVuW2ldXTsKKyAgICAgICAgYWxsRm5zLnB1c2goKGZ1bmN0aW9uKHJ1bm5hYmxlKSB7IHJldHVybiBmdW5jdGlvbihkb25lKSB7IHJ1bm5hYmxlLmV4ZWN1dGUoZG9uZSk7IH07IH0pKHJ1bm5hYmxlKSk7CisgICAgICB9CisKKyAgICAgIHJlcG9ydGVyLmphc21pbmVTdGFydGVkKHsKKyAgICAgICAgdG90YWxTcGVjc0RlZmluZWQ6IHRvdGFsU3BlY3NEZWZpbmVkCisgICAgICB9KTsKKworICAgICAgcXVldWVSdW5uZXJGYWN0b3J5KHtmbnM6IGFsbEZucywgb25Db21wbGV0ZTogcmVwb3J0ZXIuamFzbWluZURvbmV9KTsKKyAgICB9OworCisgICAgdGhpcy5hZGRSZXBvcnRlciA9IGZ1bmN0aW9uKHJlcG9ydGVyVG9BZGQpIHsKKyAgICAgIHJlcG9ydGVyLmFkZFJlcG9ydGVyKHJlcG9ydGVyVG9BZGQpOworICAgIH07CisKKyAgICB0aGlzLmFkZE1hdGNoZXJzID0gZnVuY3Rpb24obWF0Y2hlcnNUb0FkZCkgeworICAgICAgaiQuRXhwZWN0YXRpb24uYWRkTWF0Y2hlcnMobWF0Y2hlcnNUb0FkZCk7CisgICAgfTsKKworICAgIHRoaXMuc3B5T24gPSBmdW5jdGlvbihvYmosIG1ldGhvZE5hbWUpIHsKKyAgICAgIGlmIChqJC51dGlsLmlzVW5kZWZpbmVkKG9iaikpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJzcHlPbiBjb3VsZCBub3QgZmluZCBhbiBvYmplY3QgdG8gc3B5IHVwb24gZm9yICIgKyBtZXRob2ROYW1lICsgIigpIik7CisgICAgICB9CisKKyAgICAgIGlmIChqJC51dGlsLmlzVW5kZWZpbmVkKG9ialttZXRob2ROYW1lXSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1ldGhvZE5hbWUgKyAnKCkgbWV0aG9kIGRvZXMgbm90IGV4aXN0Jyk7CisgICAgICB9CisKKyAgICAgIGlmIChvYmpbbWV0aG9kTmFtZV0gJiYgaiQuaXNTcHkob2JqW21ldGhvZE5hbWVdKSkgeworICAgICAgICAvL1RPRE8/OiBzaG91bGQgdGhpcyByZXR1cm4gdGhlIGN1cnJlbnQgc3B5PyBEb3duc2lkZTogbWF5IGNhdXNlIHVzZXIgY29uZnVzaW9uIGFib3V0IHNweSBzdGF0ZQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWV0aG9kTmFtZSArICcgaGFzIGFscmVhZHkgYmVlbiBzcGllZCB1cG9uJyk7CisgICAgICB9CisKKyAgICAgIHZhciBzcHkgPSBqJC5jcmVhdGVTcHkobWV0aG9kTmFtZSwgb2JqW21ldGhvZE5hbWVdKTsKKworICAgICAgc3BpZXMucHVzaCh7CisgICAgICAgIHNweTogc3B5LAorICAgICAgICBiYXNlT2JqOiBvYmosCisgICAgICAgIG1ldGhvZE5hbWU6IG1ldGhvZE5hbWUsCisgICAgICAgIG9yaWdpbmFsVmFsdWU6IG9ialttZXRob2ROYW1lXQorICAgICAgfSk7CisKKyAgICAgIG9ialttZXRob2ROYW1lXSA9IHNweTsKKworICAgICAgcmV0dXJuIHNweTsKKyAgICB9OworCisgICAgdmFyIHN1aXRlRmFjdG9yeSA9IGZ1bmN0aW9uKGRlc2NyaXB0aW9uKSB7CisgICAgICB2YXIgc3VpdGUgPSBuZXcgaiQuU3VpdGUoeworICAgICAgICBlbnY6IHNlbGYsCisgICAgICAgIGlkOiBnZXROZXh0U3VpdGVJZCgpLAorICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sCisgICAgICAgIHBhcmVudFN1aXRlOiBjdXJyZW50U3VpdGUsCisgICAgICAgIHF1ZXVlUnVubmVyOiBxdWV1ZVJ1bm5lckZhY3RvcnksCisgICAgICAgIG9uU3RhcnQ6IHN1aXRlU3RhcnRlZCwKKyAgICAgICAgcmVzdWx0Q2FsbGJhY2s6IGZ1bmN0aW9uKGF0dHJzKSB7CisgICAgICAgICAgcmVwb3J0ZXIuc3VpdGVEb25lKGF0dHJzKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIHJ1bm5hYmxlTG9va3VwVGFibGVbc3VpdGUuaWRdID0gc3VpdGU7CisgICAgICByZXR1cm4gc3VpdGU7CisgICAgfTsKKworICAgIHRoaXMuZGVzY3JpYmUgPSBmdW5jdGlvbihkZXNjcmlwdGlvbiwgc3BlY0RlZmluaXRpb25zKSB7CisgICAgICB2YXIgc3VpdGUgPSBzdWl0ZUZhY3RvcnkoZGVzY3JpcHRpb24pOworCisgICAgICB2YXIgcGFyZW50U3VpdGUgPSBjdXJyZW50U3VpdGU7CisgICAgICBwYXJlbnRTdWl0ZS5hZGRDaGlsZChzdWl0ZSk7CisgICAgICBjdXJyZW50U3VpdGUgPSBzdWl0ZTsKKworICAgICAgdmFyIGRlY2xhcmF0aW9uRXJyb3IgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgc3BlY0RlZmluaXRpb25zLmNhbGwoc3VpdGUpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBkZWNsYXJhdGlvbkVycm9yID0gZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlY2xhcmF0aW9uRXJyb3IpIHsKKyAgICAgICAgdGhpcy5pdCgiZW5jb3VudGVyZWQgYSBkZWNsYXJhdGlvbiBleGNlcHRpb24iLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB0aHJvdyBkZWNsYXJhdGlvbkVycm9yOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgY3VycmVudFN1aXRlID0gcGFyZW50U3VpdGU7CisKKyAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9OworCisgICAgdGhpcy54ZGVzY3JpYmUgPSBmdW5jdGlvbihkZXNjcmlwdGlvbiwgc3BlY0RlZmluaXRpb25zKSB7CisgICAgICB2YXIgc3VpdGUgPSB0aGlzLmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBzcGVjRGVmaW5pdGlvbnMpOworICAgICAgc3VpdGUuZGlzYWJsZSgpOworICAgICAgcmV0dXJuIHN1aXRlOworICAgIH07CisKKyAgICB2YXIgc3BlY0ZhY3RvcnkgPSBmdW5jdGlvbihkZXNjcmlwdGlvbiwgZm4sIHN1aXRlKSB7CisgICAgICB0b3RhbFNwZWNzRGVmaW5lZCsrOworCisgICAgICB2YXIgc3BlYyA9IG5ldyBqJC5TcGVjKHsKKyAgICAgICAgaWQ6IGdldE5leHRTcGVjSWQoKSwKKyAgICAgICAgYmVmb3JlRm5zOiBiZWZvcmVGbnMoc3VpdGUpLAorICAgICAgICBhZnRlckZuczogYWZ0ZXJGbnMoc3VpdGUpLAorICAgICAgICBleHBlY3RhdGlvbkZhY3Rvcnk6IGV4cGVjdGF0aW9uRmFjdG9yeSwKKyAgICAgICAgZXhjZXB0aW9uRm9ybWF0dGVyOiBleGNlcHRpb25Gb3JtYXR0ZXIsCisgICAgICAgIHJlc3VsdENhbGxiYWNrOiBzcGVjUmVzdWx0Q2FsbGJhY2ssCisgICAgICAgIGdldFNwZWNOYW1lOiBmdW5jdGlvbihzcGVjKSB7CisgICAgICAgICAgcmV0dXJuIGdldFNwZWNOYW1lKHNwZWMsIHN1aXRlKTsKKyAgICAgICAgfSwKKyAgICAgICAgb25TdGFydDogc3BlY1N0YXJ0ZWQsCisgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwKKyAgICAgICAgZXhwZWN0YXRpb25SZXN1bHRGYWN0b3J5OiBleHBlY3RhdGlvblJlc3VsdEZhY3RvcnksCisgICAgICAgIHF1ZXVlUnVubmVyRmFjdG9yeTogcXVldWVSdW5uZXJGYWN0b3J5LAorICAgICAgICBmbjogZm4sCisgICAgICAgIHRpbWVyOiB7c2V0VGltZW91dDogcmVhbFNldFRpbWVvdXQsIGNsZWFyVGltZW91dDogcmVhbENsZWFyVGltZW91dH0KKyAgICAgIH0pOworCisgICAgICBydW5uYWJsZUxvb2t1cFRhYmxlW3NwZWMuaWRdID0gc3BlYzsKKworICAgICAgaWYgKCFzZWxmLnNwZWNGaWx0ZXIoc3BlYykpIHsKKyAgICAgICAgc3BlYy5kaXNhYmxlKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBzcGVjOworCisgICAgICBmdW5jdGlvbiByZW1vdmVBbGxTcGllcygpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBzcHlFbnRyeSA9IHNwaWVzW2ldOworICAgICAgICAgIHNweUVudHJ5LmJhc2VPYmpbc3B5RW50cnkubWV0aG9kTmFtZV0gPSBzcHlFbnRyeS5vcmlnaW5hbFZhbHVlOworICAgICAgICB9CisgICAgICAgIHNwaWVzID0gW107CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHNwZWNSZXN1bHRDYWxsYmFjayhyZXN1bHQpIHsKKyAgICAgICAgcmVtb3ZlQWxsU3BpZXMoKTsKKyAgICAgICAgaiQuRXhwZWN0YXRpb24ucmVzZXRNYXRjaGVycygpOworICAgICAgICBjdXN0b21FcXVhbGl0eVRlc3RlcnMgPSBbXTsKKyAgICAgICAgY3VycmVudFNwZWMgPSBudWxsOworICAgICAgICByZXBvcnRlci5zcGVjRG9uZShyZXN1bHQpOworICAgICAgfQorICAgIH07CisKKyAgICB2YXIgc3VpdGVTdGFydGVkID0gZnVuY3Rpb24oc3VpdGUpIHsKKyAgICAgIHJlcG9ydGVyLnN1aXRlU3RhcnRlZChzdWl0ZS5yZXN1bHQpOworICAgIH07CisKKyAgICB0aGlzLml0ID0gZnVuY3Rpb24oZGVzY3JpcHRpb24sIGZuKSB7CisgICAgICB2YXIgc3BlYyA9IHNwZWNGYWN0b3J5KGRlc2NyaXB0aW9uLCBmbiwgY3VycmVudFN1aXRlKTsKKyAgICAgIGN1cnJlbnRTdWl0ZS5hZGRDaGlsZChzcGVjKTsKKyAgICAgIHJldHVybiBzcGVjOworICAgIH07CisKKyAgICB0aGlzLnhpdCA9IGZ1bmN0aW9uKGRlc2NyaXB0aW9uLCBmbikgeworICAgICAgdmFyIHNwZWMgPSB0aGlzLml0KGRlc2NyaXB0aW9uLCBmbik7CisgICAgICBzcGVjLnBlbmQoKTsKKyAgICAgIHJldHVybiBzcGVjOworICAgIH07CisKKyAgICB0aGlzLmV4cGVjdCA9IGZ1bmN0aW9uKGFjdHVhbCkgeworICAgICAgcmV0dXJuIGN1cnJlbnRTcGVjLmV4cGVjdChhY3R1YWwpOworICAgIH07CisKKyAgICB0aGlzLmJlZm9yZUVhY2ggPSBmdW5jdGlvbihiZWZvcmVFYWNoRnVuY3Rpb24pIHsKKyAgICAgIGN1cnJlbnRTdWl0ZS5iZWZvcmVFYWNoKGJlZm9yZUVhY2hGdW5jdGlvbik7CisgICAgfTsKKworICAgIHRoaXMuYWZ0ZXJFYWNoID0gZnVuY3Rpb24oYWZ0ZXJFYWNoRnVuY3Rpb24pIHsKKyAgICAgIGN1cnJlbnRTdWl0ZS5hZnRlckVhY2goYWZ0ZXJFYWNoRnVuY3Rpb24pOworICAgIH07CisKKyAgICB0aGlzLnBlbmRpbmcgPSBmdW5jdGlvbigpIHsKKyAgICAgIHRocm93IGokLlNwZWMucGVuZGluZ1NwZWNFeGNlcHRpb25NZXNzYWdlOworICAgIH07CisgIH0KKworICByZXR1cm4gRW52OworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5Kc0FwaVJlcG9ydGVyID0gZnVuY3Rpb24oKSB7CisKKyAgdmFyIG5vb3BUaW1lciA9IHsKKyAgICBzdGFydDogZnVuY3Rpb24oKXt9LAorICAgIGVsYXBzZWQ6IGZ1bmN0aW9uKCl7IHJldHVybiAwOyB9CisgIH07CisKKyAgZnVuY3Rpb24gSnNBcGlSZXBvcnRlcihvcHRpb25zKSB7CisgICAgdmFyIHRpbWVyID0gb3B0aW9ucy50aW1lciB8fCBub29wVGltZXIsCisgICAgICAgIHN0YXR1cyA9ICJsb2FkZWQiOworCisgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7CisgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlOworCisgICAgdGhpcy5qYXNtaW5lU3RhcnRlZCA9IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTsKKyAgICAgIHN0YXR1cyA9ICdzdGFydGVkJzsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgfTsKKworICAgIHZhciBleGVjdXRpb25UaW1lOworCisgICAgdGhpcy5qYXNtaW5lRG9uZSA9IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7CisgICAgICBleGVjdXRpb25UaW1lID0gdGltZXIuZWxhcHNlZCgpOworICAgICAgc3RhdHVzID0gJ2RvbmUnOworICAgIH07CisKKyAgICB0aGlzLnN0YXR1cyA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9OworCisgICAgdmFyIHN1aXRlcyA9IHt9OworCisgICAgdGhpcy5zdWl0ZVN0YXJ0ZWQgPSBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIHN0b3JlU3VpdGUocmVzdWx0KTsKKyAgICB9OworCisgICAgdGhpcy5zdWl0ZURvbmUgPSBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIHN0b3JlU3VpdGUocmVzdWx0KTsKKyAgICB9OworCisgICAgZnVuY3Rpb24gc3RvcmVTdWl0ZShyZXN1bHQpIHsKKyAgICAgIHN1aXRlc1tyZXN1bHQuaWRdID0gcmVzdWx0OworICAgIH0KKworICAgIHRoaXMuc3VpdGVzID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gc3VpdGVzOworICAgIH07CisKKyAgICB2YXIgc3BlY3MgPSBbXTsKKyAgICB0aGlzLnNwZWNTdGFydGVkID0gZnVuY3Rpb24ocmVzdWx0KSB7IH07CisKKyAgICB0aGlzLnNwZWNEb25lID0gZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBzcGVjcy5wdXNoKHJlc3VsdCk7CisgICAgfTsKKworICAgIHRoaXMuc3BlY1Jlc3VsdHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKSB7CisgICAgICByZXR1cm4gc3BlY3Muc2xpY2UoaW5kZXgsIGluZGV4ICsgbGVuZ3RoKTsKKyAgICB9OworCisgICAgdGhpcy5zcGVjcyA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHNwZWNzOworICAgIH07CisKKyAgICB0aGlzLmV4ZWN1dGlvblRpbWUgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBleGVjdXRpb25UaW1lOworICAgIH07CisKKyAgfQorCisgIHJldHVybiBKc0FwaVJlcG9ydGVyOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5BbnkgPSBmdW5jdGlvbigpIHsKKworICBmdW5jdGlvbiBBbnkoZXhwZWN0ZWRPYmplY3QpIHsKKyAgICB0aGlzLmV4cGVjdGVkT2JqZWN0ID0gZXhwZWN0ZWRPYmplY3Q7CisgIH0KKworICBBbnkucHJvdG90eXBlLmphc21pbmVNYXRjaGVzID0gZnVuY3Rpb24ob3RoZXIpIHsKKyAgICBpZiAodGhpcy5leHBlY3RlZE9iamVjdCA9PSBTdHJpbmcpIHsKKyAgICAgIHJldHVybiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycgfHwgb3RoZXIgaW5zdGFuY2VvZiBTdHJpbmc7CisgICAgfQorCisgICAgaWYgKHRoaXMuZXhwZWN0ZWRPYmplY3QgPT0gTnVtYmVyKSB7CisgICAgICByZXR1cm4gdHlwZW9mIG90aGVyID09ICdudW1iZXInIHx8IG90aGVyIGluc3RhbmNlb2YgTnVtYmVyOworICAgIH0KKworICAgIGlmICh0aGlzLmV4cGVjdGVkT2JqZWN0ID09IEZ1bmN0aW9uKSB7CisgICAgICByZXR1cm4gdHlwZW9mIG90aGVyID09ICdmdW5jdGlvbicgfHwgb3RoZXIgaW5zdGFuY2VvZiBGdW5jdGlvbjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5leHBlY3RlZE9iamVjdCA9PSBPYmplY3QpIHsKKyAgICAgIHJldHVybiB0eXBlb2Ygb3RoZXIgPT0gJ29iamVjdCc7CisgICAgfQorICAgIAorICAgIGlmICh0aGlzLmV4cGVjdGVkT2JqZWN0ID09IEJvb2xlYW4pIHsKKyAgICAgIHJldHVybiB0eXBlb2Ygb3RoZXIgPT0gJ2Jvb2xlYW4nOworICAgIH0KKworICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIHRoaXMuZXhwZWN0ZWRPYmplY3Q7CisgIH07CisKKyAgQW55LnByb3RvdHlwZS5qYXNtaW5lVG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gJzxqYXNtaW5lLmFueSgnICsgdGhpcy5leHBlY3RlZENsYXNzICsgJyk+JzsKKyAgfTsKKworICByZXR1cm4gQW55OworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5DYWxsVHJhY2tlciA9IGZ1bmN0aW9uKCkgeworCisgIGZ1bmN0aW9uIENhbGxUcmFja2VyKCkgeworICAgIHZhciBjYWxscyA9IFtdOworCisgICAgdGhpcy50cmFjayA9IGZ1bmN0aW9uKGNvbnRleHQpIHsKKyAgICAgIGNhbGxzLnB1c2goY29udGV4dCk7CisgICAgfTsKKworICAgIHRoaXMuYW55ID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gISFjYWxscy5sZW5ndGg7CisgICAgfTsKKworICAgIHRoaXMuY291bnQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBjYWxscy5sZW5ndGg7CisgICAgfTsKKworICAgIHRoaXMuYXJnc0ZvciA9IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgICB2YXIgY2FsbCA9IGNhbGxzW2luZGV4XTsKKyAgICAgIHJldHVybiBjYWxsID8gY2FsbC5hcmdzIDogW107CisgICAgfTsKKworICAgIHRoaXMuYWxsID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gY2FsbHM7CisgICAgfTsKKworICAgIHRoaXMuYWxsQXJncyA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGNhbGxBcmdzID0gW107CisgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY2FsbHMubGVuZ3RoOyBpKyspeworICAgICAgICBjYWxsQXJncy5wdXNoKGNhbGxzW2ldLmFyZ3MpOworICAgICAgfQorCisgICAgICByZXR1cm4gY2FsbEFyZ3M7CisgICAgfTsKKworICAgIHRoaXMuZmlyc3QgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBjYWxsc1swXTsKKyAgICB9OworCisgICAgdGhpcy5tb3N0UmVjZW50ID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gY2FsbHNbY2FsbHMubGVuZ3RoIC0gMV07CisgICAgfTsKKworICAgIHRoaXMucmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgICAgIGNhbGxzID0gW107CisgICAgfTsKKyAgfQorCisgIHJldHVybiBDYWxsVHJhY2tlcjsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkuQ2xvY2sgPSBmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gQ2xvY2soZ2xvYmFsLCBkZWxheWVkRnVuY3Rpb25TY2hlZHVsZXIpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXMsCisgICAgICByZWFsVGltaW5nRnVuY3Rpb25zID0geworICAgICAgICBzZXRUaW1lb3V0OiBnbG9iYWwuc2V0VGltZW91dCwKKyAgICAgICAgY2xlYXJUaW1lb3V0OiBnbG9iYWwuY2xlYXJUaW1lb3V0LAorICAgICAgICBzZXRJbnRlcnZhbDogZ2xvYmFsLnNldEludGVydmFsLAorICAgICAgICBjbGVhckludGVydmFsOiBnbG9iYWwuY2xlYXJJbnRlcnZhbAorICAgICAgfSwKKyAgICAgIGZha2VUaW1pbmdGdW5jdGlvbnMgPSB7CisgICAgICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsCisgICAgICAgIGNsZWFyVGltZW91dDogY2xlYXJUaW1lb3V0LAorICAgICAgICBzZXRJbnRlcnZhbDogc2V0SW50ZXJ2YWwsCisgICAgICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwKKyAgICAgIH0sCisgICAgICBpbnN0YWxsZWQgPSBmYWxzZSwKKyAgICAgIHRpbWVyOworCisgICAgc2VsZi5pbnN0YWxsID0gZnVuY3Rpb24oKSB7CisgICAgICByZXBsYWNlKGdsb2JhbCwgZmFrZVRpbWluZ0Z1bmN0aW9ucyk7CisgICAgICB0aW1lciA9IGZha2VUaW1pbmdGdW5jdGlvbnM7CisgICAgICBpbnN0YWxsZWQgPSB0cnVlOworICAgIH07CisKKyAgICBzZWxmLnVuaW5zdGFsbCA9IGZ1bmN0aW9uKCkgeworICAgICAgZGVsYXllZEZ1bmN0aW9uU2NoZWR1bGVyLnJlc2V0KCk7CisgICAgICByZXBsYWNlKGdsb2JhbCwgcmVhbFRpbWluZ0Z1bmN0aW9ucyk7CisgICAgICB0aW1lciA9IHJlYWxUaW1pbmdGdW5jdGlvbnM7CisgICAgICBpbnN0YWxsZWQgPSBmYWxzZTsKKyAgICB9OworCisgICAgc2VsZi5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oZm4sIGRlbGF5LCBwYXJhbXMpIHsKKyAgICAgIGlmIChsZWdhY3lJRSgpKSB7CisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSUUgPCA5IGNhbm5vdCBzdXBwb3J0IGV4dHJhIHBhcmFtcyB0byBzZXRUaW1lb3V0IHdpdGhvdXQgYSBwb2x5ZmlsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aW1lci5zZXRUaW1lb3V0KGZuLCBkZWxheSk7CisgICAgICB9CisgICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmFwcGx5KHRpbWVyLnNldFRpbWVvdXQsIFtnbG9iYWwsIGFyZ3VtZW50c10pOworICAgIH07CisKKyAgICBzZWxmLnNldEludGVydmFsID0gZnVuY3Rpb24oZm4sIGRlbGF5LCBwYXJhbXMpIHsKKyAgICAgIGlmIChsZWdhY3lJRSgpKSB7CisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSUUgPCA5IGNhbm5vdCBzdXBwb3J0IGV4dHJhIHBhcmFtcyB0byBzZXRJbnRlcnZhbCB3aXRob3V0IGEgcG9seWZpbGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGltZXIuc2V0SW50ZXJ2YWwoZm4sIGRlbGF5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkodGltZXIuc2V0SW50ZXJ2YWwsIFtnbG9iYWwsIGFyZ3VtZW50c10pOworICAgIH07CisKKyAgICBzZWxmLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uKGlkKSB7CisgICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYXBwbHkodGltZXIuY2xlYXJUaW1lb3V0LCBbZ2xvYmFsLCBpZF0pOworICAgIH07CisKKyAgICBzZWxmLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbihpZCkgeworICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLmFwcGx5KHRpbWVyLmNsZWFySW50ZXJ2YWwsIFtnbG9iYWwsIGlkXSk7CisgICAgfTsKKworICAgIHNlbGYudGljayA9IGZ1bmN0aW9uKG1pbGxpcykgeworICAgICAgaWYgKGluc3RhbGxlZCkgeworICAgICAgICBkZWxheWVkRnVuY3Rpb25TY2hlZHVsZXIudGljayhtaWxsaXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNb2NrIGNsb2NrIGlzIG5vdCBpbnN0YWxsZWQsIHVzZSBqYXNtaW5lLmNsb2NrKCkuaW5zdGFsbCgpIik7CisgICAgICB9CisgICAgfTsKKworICAgIHJldHVybiBzZWxmOworCisgICAgZnVuY3Rpb24gbGVnYWN5SUUoKSB7CisgICAgICAvL2lmIHRoZXNlIG1ldGhvZHMgYXJlIHBvbHlmaWxsZWQsIGFwcGx5IHdpbGwgYmUgcHJlc2VudAorICAgICAgcmV0dXJuICEocmVhbFRpbWluZ0Z1bmN0aW9ucy5zZXRUaW1lb3V0IHx8IHJlYWxUaW1pbmdGdW5jdGlvbnMuc2V0SW50ZXJ2YWwpLmFwcGx5OworICAgIH0KKworICAgIGZ1bmN0aW9uIHJlcGxhY2UoZGVzdCwgc291cmNlKSB7CisgICAgICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkgeworICAgICAgICBkZXN0W3Byb3BdID0gc291cmNlW3Byb3BdOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHNldFRpbWVvdXQoZm4sIGRlbGF5KSB7CisgICAgICByZXR1cm4gZGVsYXllZEZ1bmN0aW9uU2NoZWR1bGVyLnNjaGVkdWxlRnVuY3Rpb24oZm4sIGRlbGF5LCBhcmdTbGljZShhcmd1bWVudHMsIDIpKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjbGVhclRpbWVvdXQoaWQpIHsKKyAgICAgIHJldHVybiBkZWxheWVkRnVuY3Rpb25TY2hlZHVsZXIucmVtb3ZlRnVuY3Rpb25XaXRoSWQoaWQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHNldEludGVydmFsKGZuLCBpbnRlcnZhbCkgeworICAgICAgcmV0dXJuIGRlbGF5ZWRGdW5jdGlvblNjaGVkdWxlci5zY2hlZHVsZUZ1bmN0aW9uKGZuLCBpbnRlcnZhbCwgYXJnU2xpY2UoYXJndW1lbnRzLCAyKSwgdHJ1ZSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gY2xlYXJJbnRlcnZhbChpZCkgeworICAgICAgcmV0dXJuIGRlbGF5ZWRGdW5jdGlvblNjaGVkdWxlci5yZW1vdmVGdW5jdGlvbldpdGhJZChpZCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gYXJnU2xpY2UoYXJnc09iaiwgbikgeworICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3NPYmosIDIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBDbG9jazsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkuRGVsYXllZEZ1bmN0aW9uU2NoZWR1bGVyID0gZnVuY3Rpb24oKSB7CisgIGZ1bmN0aW9uIERlbGF5ZWRGdW5jdGlvblNjaGVkdWxlcigpIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdmFyIHNjaGVkdWxlZExvb2t1cCA9IFtdOworICAgIHZhciBzY2hlZHVsZWRGdW5jdGlvbnMgPSB7fTsKKyAgICB2YXIgY3VycmVudFRpbWUgPSAwOworICAgIHZhciBkZWxheWVkRm5Db3VudCA9IDA7CisKKyAgICBzZWxmLnRpY2sgPSBmdW5jdGlvbihtaWxsaXMpIHsKKyAgICAgIG1pbGxpcyA9IG1pbGxpcyB8fCAwOworICAgICAgdmFyIGVuZFRpbWUgPSBjdXJyZW50VGltZSArIG1pbGxpczsKKworICAgICAgcnVuU2NoZWR1bGVkRnVuY3Rpb25zKGVuZFRpbWUpOworICAgICAgY3VycmVudFRpbWUgPSBlbmRUaW1lOworICAgIH07CisKKyAgICBzZWxmLnNjaGVkdWxlRnVuY3Rpb24gPSBmdW5jdGlvbihmdW5jVG9DYWxsLCBtaWxsaXMsIHBhcmFtcywgcmVjdXJyaW5nLCB0aW1lb3V0S2V5LCBydW5BdE1pbGxpcykgeworICAgICAgdmFyIGY7CisgICAgICBpZiAodHlwZW9mKGZ1bmNUb0NhbGwpID09PSAnc3RyaW5nJykgeworICAgICAgICAvKiBqc2hpbnQgZXZpbDogdHJ1ZSAqLworICAgICAgICBmID0gZnVuY3Rpb24oKSB7IHJldHVybiBldmFsKGZ1bmNUb0NhbGwpOyB9OworICAgICAgICAvKiBqc2hpbnQgZXZpbDogZmFsc2UgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGYgPSBmdW5jVG9DYWxsOworICAgICAgfQorCisgICAgICBtaWxsaXMgPSBtaWxsaXMgfHwgMDsKKyAgICAgIHRpbWVvdXRLZXkgPSB0aW1lb3V0S2V5IHx8ICsrZGVsYXllZEZuQ291bnQ7CisgICAgICBydW5BdE1pbGxpcyA9IHJ1bkF0TWlsbGlzIHx8IChjdXJyZW50VGltZSArIG1pbGxpcyk7CisKKyAgICAgIHZhciBmdW5jVG9TY2hlZHVsZSA9IHsKKyAgICAgICAgcnVuQXRNaWxsaXM6IHJ1bkF0TWlsbGlzLAorICAgICAgICBmdW5jVG9DYWxsOiBmLAorICAgICAgICByZWN1cnJpbmc6IHJlY3VycmluZywKKyAgICAgICAgcGFyYW1zOiBwYXJhbXMsCisgICAgICAgIHRpbWVvdXRLZXk6IHRpbWVvdXRLZXksCisgICAgICAgIG1pbGxpczogbWlsbGlzCisgICAgICB9OworCisgICAgICBpZiAocnVuQXRNaWxsaXMgaW4gc2NoZWR1bGVkRnVuY3Rpb25zKSB7CisgICAgICAgIHNjaGVkdWxlZEZ1bmN0aW9uc1tydW5BdE1pbGxpc10ucHVzaChmdW5jVG9TY2hlZHVsZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzY2hlZHVsZWRGdW5jdGlvbnNbcnVuQXRNaWxsaXNdID0gW2Z1bmNUb1NjaGVkdWxlXTsKKyAgICAgICAgc2NoZWR1bGVkTG9va3VwLnB1c2gocnVuQXRNaWxsaXMpOworICAgICAgICBzY2hlZHVsZWRMb29rdXAuc29ydChmdW5jdGlvbiAoYSwgYikgeworICAgICAgICAgIHJldHVybiBhIC0gYjsKKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aW1lb3V0S2V5OworICAgIH07CisKKyAgICBzZWxmLnJlbW92ZUZ1bmN0aW9uV2l0aElkID0gZnVuY3Rpb24odGltZW91dEtleSkgeworICAgICAgZm9yICh2YXIgcnVuQXRNaWxsaXMgaW4gc2NoZWR1bGVkRnVuY3Rpb25zKSB7CisgICAgICAgIHZhciBmdW5jcyA9IHNjaGVkdWxlZEZ1bmN0aW9uc1tydW5BdE1pbGxpc107CisgICAgICAgIHZhciBpID0gaW5kZXhPZkZpcnN0VG9QYXNzKGZ1bmNzLCBmdW5jdGlvbiAoZnVuYykgeworICAgICAgICAgIHJldHVybiBmdW5jLnRpbWVvdXRLZXkgPT09IHRpbWVvdXRLZXk7CisgICAgICAgIH0pOworCisgICAgICAgIGlmIChpID4gLTEpIHsKKyAgICAgICAgICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgICBkZWxldGUgc2NoZWR1bGVkRnVuY3Rpb25zW3J1bkF0TWlsbGlzXTsKKyAgICAgICAgICAgIGRlbGV0ZUZyb21Mb29rdXAocnVuQXRNaWxsaXMpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmdW5jcy5zcGxpY2UoaSwgMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaW50ZXJ2YWxzIGdldCByZXNjaGVkdWxlZCB3aGVuIGV4ZWN1dGVkLCBzbyB0aGVyZSdzIG5ldmVyIG1vcmUKKyAgICAgICAgICAvLyB0aGFuIGEgc2luZ2xlIHNjaGVkdWxlZCBmdW5jdGlvbiB3aXRoIGEgZ2l2ZW4gdGltZW91dEtleQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIHNlbGYucmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgICAgIGN1cnJlbnRUaW1lID0gMDsKKyAgICAgIHNjaGVkdWxlZExvb2t1cCA9IFtdOworICAgICAgc2NoZWR1bGVkRnVuY3Rpb25zID0ge307CisgICAgICBkZWxheWVkRm5Db3VudCA9IDA7CisgICAgfTsKKworICAgIHJldHVybiBzZWxmOworCisgICAgZnVuY3Rpb24gaW5kZXhPZkZpcnN0VG9QYXNzKGFycmF5LCB0ZXN0Rm4pIHsKKyAgICAgIHZhciBpbmRleCA9IC0xOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmICh0ZXN0Rm4oYXJyYXlbaV0pKSB7CisgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBkZWxldGVGcm9tTG9va3VwKGtleSkgeworICAgICAgdmFyIHZhbHVlID0gTnVtYmVyKGtleSk7CisgICAgICB2YXIgaSA9IGluZGV4T2ZGaXJzdFRvUGFzcyhzY2hlZHVsZWRMb29rdXAsIGZ1bmN0aW9uIChtaWxsaXMpIHsKKyAgICAgICAgcmV0dXJuIG1pbGxpcyA9PT0gdmFsdWU7CisgICAgICB9KTsKKworICAgICAgaWYgKGkgPiAtMSkgeworICAgICAgICBzY2hlZHVsZWRMb29rdXAuc3BsaWNlKGksIDEpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHJlc2NoZWR1bGUoc2NoZWR1bGVkRm4pIHsKKyAgICAgIHNlbGYuc2NoZWR1bGVGdW5jdGlvbihzY2hlZHVsZWRGbi5mdW5jVG9DYWxsLAorICAgICAgICBzY2hlZHVsZWRGbi5taWxsaXMsCisgICAgICAgIHNjaGVkdWxlZEZuLnBhcmFtcywKKyAgICAgICAgdHJ1ZSwKKyAgICAgICAgc2NoZWR1bGVkRm4udGltZW91dEtleSwKKyAgICAgICAgc2NoZWR1bGVkRm4ucnVuQXRNaWxsaXMgKyBzY2hlZHVsZWRGbi5taWxsaXMpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHJ1blNjaGVkdWxlZEZ1bmN0aW9ucyhlbmRUaW1lKSB7CisgICAgICBpZiAoc2NoZWR1bGVkTG9va3VwLmxlbmd0aCA9PT0gMCB8fCBzY2hlZHVsZWRMb29rdXBbMF0gPiBlbmRUaW1lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZG8geworICAgICAgICBjdXJyZW50VGltZSA9IHNjaGVkdWxlZExvb2t1cC5zaGlmdCgpOworCisgICAgICAgIHZhciBmdW5jc1RvUnVuID0gc2NoZWR1bGVkRnVuY3Rpb25zW2N1cnJlbnRUaW1lXTsKKyAgICAgICAgZGVsZXRlIHNjaGVkdWxlZEZ1bmN0aW9uc1tjdXJyZW50VGltZV07CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jc1RvUnVuLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgdmFyIGZ1bmNUb1J1biA9IGZ1bmNzVG9SdW5baV07CisgICAgICAgICAgZnVuY1RvUnVuLmZ1bmNUb0NhbGwuYXBwbHkobnVsbCwgZnVuY1RvUnVuLnBhcmFtcyB8fCBbXSk7CisKKyAgICAgICAgICBpZiAoZnVuY1RvUnVuLnJlY3VycmluZykgeworICAgICAgICAgICAgcmVzY2hlZHVsZShmdW5jVG9SdW4pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc2NoZWR1bGVkTG9va3VwLmxlbmd0aCA+IDAgJiYKKyAgICAgICAgICAgICAgLy8gY2hlY2tpbmcgZmlyc3QgaWYgd2UncmUgb3V0IG9mIHRpbWUgcHJldmVudHMgc2V0VGltZW91dCgwKQorICAgICAgICAgICAgICAvLyBzY2hlZHVsZWQgaW4gYSBmdW5jVG9SdW4gZnJvbSBmb3JjaW5nIGFuIGV4dHJhIGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgICBjdXJyZW50VGltZSAhPT0gZW5kVGltZSAgJiYKKyAgICAgICAgICAgICAgICAgc2NoZWR1bGVkTG9va3VwWzBdIDw9IGVuZFRpbWUpOworICAgIH0KKyAgfQorCisgIHJldHVybiBEZWxheWVkRnVuY3Rpb25TY2hlZHVsZXI7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLkV4Y2VwdGlvbkZvcm1hdHRlciA9IGZ1bmN0aW9uKCkgeworICBmdW5jdGlvbiBFeGNlcHRpb25Gb3JtYXR0ZXIoKSB7CisgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgIHZhciBtZXNzYWdlID0gZXJyb3IubmFtZSArCisgICAgICAgICc6ICcgKworICAgICAgICBlcnJvci5tZXNzYWdlOworCisgICAgICBpZiAoZXJyb3IuZmlsZU5hbWUgfHwgZXJyb3Iuc291cmNlVVJMKSB7CisgICAgICAgIG1lc3NhZ2UgKz0gIiBpbiAiICsgKGVycm9yLmZpbGVOYW1lIHx8IGVycm9yLnNvdXJjZVVSTCk7CisgICAgICB9CisKKyAgICAgIGlmIChlcnJvci5saW5lIHx8IGVycm9yLmxpbmVOdW1iZXIpIHsKKyAgICAgICAgbWVzc2FnZSArPSAiIChsaW5lICIgKyAoZXJyb3IubGluZSB8fCBlcnJvci5saW5lTnVtYmVyKSArICIpIjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfTsKKworICAgIHRoaXMuc3RhY2sgPSBmdW5jdGlvbihlcnJvcikgeworICAgICAgcmV0dXJuIGVycm9yID8gZXJyb3Iuc3RhY2sgOiBudWxsOworICAgIH07CisgIH0KKworICByZXR1cm4gRXhjZXB0aW9uRm9ybWF0dGVyOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5FeHBlY3RhdGlvbiA9IGZ1bmN0aW9uKCkgeworCisgIHZhciBtYXRjaGVycyA9IHt9OworCisgIGZ1bmN0aW9uIEV4cGVjdGF0aW9uKG9wdGlvbnMpIHsKKyAgICB0aGlzLnV0aWwgPSBvcHRpb25zLnV0aWwgfHwgeyBidWlsZEZhaWx1cmVNZXNzYWdlOiBmdW5jdGlvbigpIHt9IH07CisgICAgdGhpcy5jdXN0b21FcXVhbGl0eVRlc3RlcnMgPSBvcHRpb25zLmN1c3RvbUVxdWFsaXR5VGVzdGVycyB8fCBbXTsKKyAgICB0aGlzLmFjdHVhbCA9IG9wdGlvbnMuYWN0dWFsOworICAgIHRoaXMuYWRkRXhwZWN0YXRpb25SZXN1bHQgPSBvcHRpb25zLmFkZEV4cGVjdGF0aW9uUmVzdWx0IHx8IGZ1bmN0aW9uKCl7fTsKKyAgICB0aGlzLmlzTm90ID0gb3B0aW9ucy5pc05vdDsKKworICAgIGZvciAodmFyIG1hdGNoZXJOYW1lIGluIG1hdGNoZXJzKSB7CisgICAgICB0aGlzW21hdGNoZXJOYW1lXSA9IG1hdGNoZXJzW21hdGNoZXJOYW1lXTsKKyAgICB9CisgIH0KKworICBFeHBlY3RhdGlvbi5wcm90b3R5cGUud3JhcENvbXBhcmUgPSBmdW5jdGlvbihuYW1lLCBtYXRjaGVyRmFjdG9yeSkgeworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSwKKyAgICAgICAgZXhwZWN0ZWQgPSBhcmdzLnNsaWNlKDApLAorICAgICAgICBtZXNzYWdlID0gIiI7CisKKyAgICAgIGFyZ3MudW5zaGlmdCh0aGlzLmFjdHVhbCk7CisKKyAgICAgIHZhciBtYXRjaGVyID0gbWF0Y2hlckZhY3RvcnkodGhpcy51dGlsLCB0aGlzLmN1c3RvbUVxdWFsaXR5VGVzdGVycyksCisgICAgICAgICAgbWF0Y2hlckNvbXBhcmUgPSBtYXRjaGVyLmNvbXBhcmU7CisKKyAgICAgIGZ1bmN0aW9uIGRlZmF1bHROZWdhdGl2ZUNvbXBhcmUoKSB7CisgICAgICAgIHZhciByZXN1bHQgPSBtYXRjaGVyLmNvbXBhcmUuYXBwbHkobnVsbCwgYXJncyk7CisgICAgICAgIHJlc3VsdC5wYXNzID0gIXJlc3VsdC5wYXNzOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorCisgICAgICBpZiAodGhpcy5pc05vdCkgeworICAgICAgICBtYXRjaGVyQ29tcGFyZSA9IG1hdGNoZXIubmVnYXRpdmVDb21wYXJlIHx8IGRlZmF1bHROZWdhdGl2ZUNvbXBhcmU7CisgICAgICB9CisKKyAgICAgIHZhciByZXN1bHQgPSBtYXRjaGVyQ29tcGFyZS5hcHBseShudWxsLCBhcmdzKTsKKworICAgICAgaWYgKCFyZXN1bHQucGFzcykgeworICAgICAgICBpZiAoIXJlc3VsdC5tZXNzYWdlKSB7CisgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMuaXNOb3QpOworICAgICAgICAgIGFyZ3MudW5zaGlmdChuYW1lKTsKKyAgICAgICAgICBtZXNzYWdlID0gdGhpcy51dGlsLmJ1aWxkRmFpbHVyZU1lc3NhZ2UuYXBwbHkobnVsbCwgYXJncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVzc2FnZSA9IHJlc3VsdC5tZXNzYWdlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChleHBlY3RlZC5sZW5ndGggPT0gMSkgeworICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkWzBdOworICAgICAgfQorCisgICAgICAvLyBUT0RPOiBob3cgbWFueSBvZiB0aGVzZSBwYXJhbXMgYXJlIG5lZWRlZD8KKyAgICAgIHRoaXMuYWRkRXhwZWN0YXRpb25SZXN1bHQoCisgICAgICAgIHJlc3VsdC5wYXNzLAorICAgICAgICB7CisgICAgICAgICAgbWF0Y2hlck5hbWU6IG5hbWUsCisgICAgICAgICAgcGFzc2VkOiByZXN1bHQucGFzcywKKyAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLAorICAgICAgICAgIGFjdHVhbDogdGhpcy5hY3R1YWwsCisgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIC8vIFRPRE86IHRoaXMgbWF5IG5lZWQgdG8gYmUgYXJyYXlpZmllZC9zbGljZWQKKyAgICAgICAgfQorICAgICAgKTsKKyAgICB9OworICB9OworCisgIEV4cGVjdGF0aW9uLmFkZENvcmVNYXRjaGVycyA9IGZ1bmN0aW9uKG1hdGNoZXJzKSB7CisgICAgdmFyIHByb3RvdHlwZSA9IEV4cGVjdGF0aW9uLnByb3RvdHlwZTsKKyAgICBmb3IgKHZhciBtYXRjaGVyTmFtZSBpbiBtYXRjaGVycykgeworICAgICAgdmFyIG1hdGNoZXIgPSBtYXRjaGVyc1ttYXRjaGVyTmFtZV07CisgICAgICBwcm90b3R5cGVbbWF0Y2hlck5hbWVdID0gcHJvdG90eXBlLndyYXBDb21wYXJlKG1hdGNoZXJOYW1lLCBtYXRjaGVyKTsKKyAgICB9CisgIH07CisKKyAgRXhwZWN0YXRpb24uYWRkTWF0Y2hlcnMgPSBmdW5jdGlvbihtYXRjaGVyc1RvQWRkKSB7CisgICAgZm9yICh2YXIgbmFtZSBpbiBtYXRjaGVyc1RvQWRkKSB7CisgICAgICB2YXIgbWF0Y2hlciA9IG1hdGNoZXJzVG9BZGRbbmFtZV07CisgICAgICBtYXRjaGVyc1tuYW1lXSA9IEV4cGVjdGF0aW9uLnByb3RvdHlwZS53cmFwQ29tcGFyZShuYW1lLCBtYXRjaGVyKTsKKyAgICB9CisgIH07CisKKyAgRXhwZWN0YXRpb24ucmVzZXRNYXRjaGVycyA9IGZ1bmN0aW9uKCkgeworICAgIGZvciAodmFyIG5hbWUgaW4gbWF0Y2hlcnMpIHsKKyAgICAgIGRlbGV0ZSBtYXRjaGVyc1tuYW1lXTsKKyAgICB9CisgIH07CisKKyAgRXhwZWN0YXRpb24uRmFjdG9yeSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKworICAgIHZhciBleHBlY3QgPSBuZXcgRXhwZWN0YXRpb24ob3B0aW9ucyk7CisKKyAgICAvLyBUT0RPOiB0aGlzIHdvdWxkIGJlIG5pY2UgYXMgaXRzIG93biBPYmplY3QgLSBOZWdhdGl2ZUV4cGVjdGF0aW9uCisgICAgLy8gVE9ETzogY29weSBpbnN0ZWFkIG9mIG11dGF0ZSBvcHRpb25zCisgICAgb3B0aW9ucy5pc05vdCA9IHRydWU7CisgICAgZXhwZWN0Lm5vdCA9IG5ldyBFeHBlY3RhdGlvbihvcHRpb25zKTsKKworICAgIHJldHVybiBleHBlY3Q7CisgIH07CisKKyAgcmV0dXJuIEV4cGVjdGF0aW9uOworfTsKKworLy9UT0RPOiBleHBlY3RhdGlvbiByZXN1bHQgbWF5IG1ha2UgbW9yZSBzZW5zZSBhcyBhIHByZXNlbnRhdGlvbiBvZiBhbiBleHBlY3RhdGlvbi4KK2dldEphc21pbmVSZXF1aXJlT2JqKCkuYnVpbGRFeHBlY3RhdGlvblJlc3VsdCA9IGZ1bmN0aW9uKCkgeworICBmdW5jdGlvbiBidWlsZEV4cGVjdGF0aW9uUmVzdWx0KG9wdGlvbnMpIHsKKyAgICB2YXIgbWVzc2FnZUZvcm1hdHRlciA9IG9wdGlvbnMubWVzc2FnZUZvcm1hdHRlciB8fCBmdW5jdGlvbigpIHt9LAorICAgICAgc3RhY2tGb3JtYXR0ZXIgPSBvcHRpb25zLnN0YWNrRm9ybWF0dGVyIHx8IGZ1bmN0aW9uKCkge307CisKKyAgICByZXR1cm4geworICAgICAgbWF0Y2hlck5hbWU6IG9wdGlvbnMubWF0Y2hlck5hbWUsCisgICAgICBleHBlY3RlZDogb3B0aW9ucy5leHBlY3RlZCwKKyAgICAgIGFjdHVhbDogb3B0aW9ucy5hY3R1YWwsCisgICAgICBtZXNzYWdlOiBtZXNzYWdlKCksCisgICAgICBzdGFjazogc3RhY2soKSwKKyAgICAgIHBhc3NlZDogb3B0aW9ucy5wYXNzZWQKKyAgICB9OworCisgICAgZnVuY3Rpb24gbWVzc2FnZSgpIHsKKyAgICAgIGlmIChvcHRpb25zLnBhc3NlZCkgeworICAgICAgICByZXR1cm4gIlBhc3NlZC4iOworICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMubWVzc2FnZTsKKyAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lcnJvcikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZvcm1hdHRlcihvcHRpb25zLmVycm9yKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzdGFjaygpIHsKKyAgICAgIGlmIChvcHRpb25zLnBhc3NlZCkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgICB9CisKKyAgICAgIHZhciBlcnJvciA9IG9wdGlvbnMuZXJyb3I7CisgICAgICBpZiAoIWVycm9yKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICBlcnJvciA9IGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzdGFja0Zvcm1hdHRlcihlcnJvcik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJ1aWxkRXhwZWN0YXRpb25SZXN1bHQ7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLk9iamVjdENvbnRhaW5pbmcgPSBmdW5jdGlvbihqJCkgeworCisgIGZ1bmN0aW9uIE9iamVjdENvbnRhaW5pbmcoc2FtcGxlKSB7CisgICAgdGhpcy5zYW1wbGUgPSBzYW1wbGU7CisgIH0KKworICBPYmplY3RDb250YWluaW5nLnByb3RvdHlwZS5qYXNtaW5lTWF0Y2hlcyA9IGZ1bmN0aW9uKG90aGVyLCBtaXNtYXRjaEtleXMsIG1pc21hdGNoVmFsdWVzKSB7CisgICAgaWYgKHR5cGVvZih0aGlzLnNhbXBsZSkgIT09ICJvYmplY3QiKSB7IHRocm93IG5ldyBFcnJvcigiWW91IG11c3QgcHJvdmlkZSBhbiBvYmplY3QgdG8gb2JqZWN0Q29udGFpbmluZywgbm90ICciK3RoaXMuc2FtcGxlKyInLiIpOyB9CisKKyAgICBtaXNtYXRjaEtleXMgPSBtaXNtYXRjaEtleXMgfHwgW107CisgICAgbWlzbWF0Y2hWYWx1ZXMgPSBtaXNtYXRjaFZhbHVlcyB8fCBbXTsKKworICAgIHZhciBoYXNLZXkgPSBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKKyAgICAgIHJldHVybiBvYmogIT09IG51bGwgJiYgIWokLnV0aWwuaXNVbmRlZmluZWQob2JqW2tleU5hbWVdKTsKKyAgICB9OworCisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcy5zYW1wbGUpIHsKKyAgICAgIGlmICghaGFzS2V5KG90aGVyLCBwcm9wZXJ0eSkgJiYgaGFzS2V5KHRoaXMuc2FtcGxlLCBwcm9wZXJ0eSkpIHsKKyAgICAgICAgbWlzbWF0Y2hLZXlzLnB1c2goImV4cGVjdGVkIGhhcyBrZXkgJyIgKyBwcm9wZXJ0eSArICInLCBidXQgbWlzc2luZyBmcm9tIGFjdHVhbC4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFqJC5tYXRjaGVyc1V0aWwuZXF1YWxzKHRoaXMuc2FtcGxlW3Byb3BlcnR5XSwgb3RoZXJbcHJvcGVydHldKSkgeworICAgICAgICBtaXNtYXRjaFZhbHVlcy5wdXNoKCInIiArIHByb3BlcnR5ICsgIicgd2FzICciICsgKG90aGVyW3Byb3BlcnR5XSA/IGokLnV0aWwuaHRtbEVzY2FwZShvdGhlcltwcm9wZXJ0eV0udG9TdHJpbmcoKSkgOiBvdGhlcltwcm9wZXJ0eV0pICsgIicgaW4gYWN0dWFsLCBidXQgd2FzICciICsgKHRoaXMuc2FtcGxlW3Byb3BlcnR5XSA/IGokLnV0aWwuaHRtbEVzY2FwZSh0aGlzLnNhbXBsZVtwcm9wZXJ0eV0udG9TdHJpbmcoKSkgOiB0aGlzLnNhbXBsZVtwcm9wZXJ0eV0pICsgIicgaW4gZXhwZWN0ZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChtaXNtYXRjaEtleXMubGVuZ3RoID09PSAwICYmIG1pc21hdGNoVmFsdWVzLmxlbmd0aCA9PT0gMCk7CisgIH07CisKKyAgT2JqZWN0Q29udGFpbmluZy5wcm90b3R5cGUuamFzbWluZVRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICI8amFzbWluZS5vYmplY3RDb250YWluaW5nKCIgKyBqJC5wcCh0aGlzLnNhbXBsZSkgKyAiKT4iOworICB9OworCisgIHJldHVybiBPYmplY3RDb250YWluaW5nOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5wcCA9IGZ1bmN0aW9uKGokKSB7CisKKyAgZnVuY3Rpb24gUHJldHR5UHJpbnRlcigpIHsKKyAgICB0aGlzLnBwTmVzdExldmVsXyA9IDA7CisgIH0KKworICBQcmV0dHlQcmludGVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIHRoaXMucHBOZXN0TGV2ZWxfKys7CisgICAgdHJ5IHsKKyAgICAgIGlmIChqJC51dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkgeworICAgICAgICB0aGlzLmVtaXRTY2FsYXIoJ3VuZGVmaW5lZCcpOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkgeworICAgICAgICB0aGlzLmVtaXRTY2FsYXIoJ251bGwnKTsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IGokLmdldEdsb2JhbCgpKSB7CisgICAgICAgIHRoaXMuZW1pdFNjYWxhcignPGdsb2JhbD4nKTsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUuamFzbWluZVRvU3RyaW5nKSB7CisgICAgICAgIHRoaXMuZW1pdFNjYWxhcih2YWx1ZS5qYXNtaW5lVG9TdHJpbmcoKSk7CisgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgdGhpcy5lbWl0U3RyaW5nKHZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAoaiQuaXNTcHkodmFsdWUpKSB7CisgICAgICAgIHRoaXMuZW1pdFNjYWxhcigic3B5IG9uICIgKyB2YWx1ZS5hbmQuaWRlbnRpdHkoKSk7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7CisgICAgICAgIHRoaXMuZW1pdFNjYWxhcih2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIHRoaXMuZW1pdFNjYWxhcignRnVuY3Rpb24nKTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlLm5vZGVUeXBlID09PSAnbnVtYmVyJykgeworICAgICAgICB0aGlzLmVtaXRTY2FsYXIoJ0hUTUxOb2RlJyk7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgeworICAgICAgICB0aGlzLmVtaXRTY2FsYXIoJ0RhdGUoJyArIHZhbHVlICsgJyknKTsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUuX19KYXNtaW5lX2JlZW5faGVyZV9iZWZvcmVfXykgeworICAgICAgICB0aGlzLmVtaXRTY2FsYXIoJzxjaXJjdWxhciByZWZlcmVuY2U6ICcgKyAoaiQuaXNBcnJheV8odmFsdWUpID8gJ0FycmF5JyA6ICdPYmplY3QnKSArICc+Jyk7CisgICAgICB9IGVsc2UgaWYgKGokLmlzQXJyYXlfKHZhbHVlKSB8fCBqJC5pc0FfKCdPYmplY3QnLCB2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUuX19KYXNtaW5lX2JlZW5faGVyZV9iZWZvcmVfXyA9IHRydWU7CisgICAgICAgIGlmIChqJC5pc0FycmF5Xyh2YWx1ZSkpIHsKKyAgICAgICAgICB0aGlzLmVtaXRBcnJheSh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5lbWl0T2JqZWN0KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgdmFsdWUuX19KYXNtaW5lX2JlZW5faGVyZV9iZWZvcmVfXzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuZW1pdFNjYWxhcih2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgdGhpcy5wcE5lc3RMZXZlbF8tLTsKKyAgICB9CisgIH07CisKKyAgUHJldHR5UHJpbnRlci5wcm90b3R5cGUuaXRlcmF0ZU9iamVjdCA9IGZ1bmN0aW9uKG9iaiwgZm4pIHsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmopIHsKKyAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkgeyBjb250aW51ZTsgfQorICAgICAgaWYgKHByb3BlcnR5ID09ICdfX0phc21pbmVfYmVlbl9oZXJlX2JlZm9yZV9fJykgeyBjb250aW51ZTsgfQorICAgICAgZm4ocHJvcGVydHksIG9iai5fX2xvb2t1cEdldHRlcl9fID8gKCFqJC51dGlsLmlzVW5kZWZpbmVkKG9iai5fX2xvb2t1cEdldHRlcl9fKHByb3BlcnR5KSkgJiYKKyAgICAgICAgICBvYmouX19sb29rdXBHZXR0ZXJfXyhwcm9wZXJ0eSkgIT09IG51bGwpIDogZmFsc2UpOworICAgIH0KKyAgfTsKKworICBQcmV0dHlQcmludGVyLnByb3RvdHlwZS5lbWl0QXJyYXkgPSBqJC51bmltcGxlbWVudGVkTWV0aG9kXzsKKyAgUHJldHR5UHJpbnRlci5wcm90b3R5cGUuZW1pdE9iamVjdCA9IGokLnVuaW1wbGVtZW50ZWRNZXRob2RfOworICBQcmV0dHlQcmludGVyLnByb3RvdHlwZS5lbWl0U2NhbGFyID0gaiQudW5pbXBsZW1lbnRlZE1ldGhvZF87CisgIFByZXR0eVByaW50ZXIucHJvdG90eXBlLmVtaXRTdHJpbmcgPSBqJC51bmltcGxlbWVudGVkTWV0aG9kXzsKKworICBmdW5jdGlvbiBTdHJpbmdQcmV0dHlQcmludGVyKCkgeworICAgIFByZXR0eVByaW50ZXIuY2FsbCh0aGlzKTsKKworICAgIHRoaXMuc3RyaW5nID0gJyc7CisgIH0KKworICBqJC51dGlsLmluaGVyaXQoU3RyaW5nUHJldHR5UHJpbnRlciwgUHJldHR5UHJpbnRlcik7CisKKyAgU3RyaW5nUHJldHR5UHJpbnRlci5wcm90b3R5cGUuZW1pdFNjYWxhciA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgdGhpcy5hcHBlbmQodmFsdWUpOworICB9OworCisgIFN0cmluZ1ByZXR0eVByaW50ZXIucHJvdG90eXBlLmVtaXRTdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIHRoaXMuYXBwZW5kKCInIiArIHZhbHVlICsgIiciKTsKKyAgfTsKKworICBTdHJpbmdQcmV0dHlQcmludGVyLnByb3RvdHlwZS5lbWl0QXJyYXkgPSBmdW5jdGlvbihhcnJheSkgeworICAgIGlmICh0aGlzLnBwTmVzdExldmVsXyA+IGokLk1BWF9QUkVUVFlfUFJJTlRfREVQVEgpIHsKKyAgICAgIHRoaXMuYXBwZW5kKCJBcnJheSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuYXBwZW5kKCdbICcpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChpID4gMCkgeworICAgICAgICB0aGlzLmFwcGVuZCgnLCAnKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZm9ybWF0KGFycmF5W2ldKTsKKyAgICB9CisgICAgdGhpcy5hcHBlbmQoJyBdJyk7CisgIH07CisKKyAgU3RyaW5nUHJldHR5UHJpbnRlci5wcm90b3R5cGUuZW1pdE9iamVjdCA9IGZ1bmN0aW9uKG9iaikgeworICAgIGlmICh0aGlzLnBwTmVzdExldmVsXyA+IGokLk1BWF9QUkVUVFlfUFJJTlRfREVQVEgpIHsKKyAgICAgIHRoaXMuYXBwZW5kKCJPYmplY3QiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgdGhpcy5hcHBlbmQoJ3sgJyk7CisgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKworICAgIHRoaXMuaXRlcmF0ZU9iamVjdChvYmosIGZ1bmN0aW9uKHByb3BlcnR5LCBpc0dldHRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLmFwcGVuZCgnLCAnKTsKKyAgICAgIH0KKworICAgICAgc2VsZi5hcHBlbmQocHJvcGVydHkpOworICAgICAgc2VsZi5hcHBlbmQoJyA6ICcpOworICAgICAgaWYgKGlzR2V0dGVyKSB7CisgICAgICAgIHNlbGYuYXBwZW5kKCc8Z2V0dGVyPicpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VsZi5mb3JtYXQob2JqW3Byb3BlcnR5XSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0aGlzLmFwcGVuZCgnIH0nKTsKKyAgfTsKKworICBTdHJpbmdQcmV0dHlQcmludGVyLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIHRoaXMuc3RyaW5nICs9IHZhbHVlOworICB9OworCisgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgeworICAgIHZhciBzdHJpbmdQcmV0dHlQcmludGVyID0gbmV3IFN0cmluZ1ByZXR0eVByaW50ZXIoKTsKKyAgICBzdHJpbmdQcmV0dHlQcmludGVyLmZvcm1hdCh2YWx1ZSk7CisgICAgcmV0dXJuIHN0cmluZ1ByZXR0eVByaW50ZXIuc3RyaW5nOworICB9OworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5RdWV1ZVJ1bm5lciA9IGZ1bmN0aW9uKCkgeworCisgIGZ1bmN0aW9uIFF1ZXVlUnVubmVyKGF0dHJzKSB7CisgICAgdGhpcy5mbnMgPSBhdHRycy5mbnMgfHwgW107CisgICAgdGhpcy5vbkNvbXBsZXRlID0gYXR0cnMub25Db21wbGV0ZSB8fCBmdW5jdGlvbigpIHt9OworICAgIHRoaXMuY2xlYXJTdGFjayA9IGF0dHJzLmNsZWFyU3RhY2sgfHwgZnVuY3Rpb24oZm4pIHtmbigpO307CisgICAgdGhpcy5vbkV4Y2VwdGlvbiA9IGF0dHJzLm9uRXhjZXB0aW9uIHx8IGZ1bmN0aW9uKCkge307CisgICAgdGhpcy5jYXRjaEV4Y2VwdGlvbiA9IGF0dHJzLmNhdGNoRXhjZXB0aW9uIHx8IGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfTsKKyAgICB0aGlzLnVzZXJDb250ZXh0ID0ge307CisgIH0KKworICBRdWV1ZVJ1bm5lci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMucnVuKHRoaXMuZm5zLCAwKTsKKyAgfTsKKworICBRdWV1ZVJ1bm5lci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24oZm5zLCByZWN1cnNpdmVJbmRleCkgeworICAgIHZhciBsZW5ndGggPSBmbnMubGVuZ3RoLAorICAgICAgICBzZWxmID0gdGhpcywKKyAgICAgICAgaXRlcmF0aXZlSW5kZXg7CisKKyAgICBmb3IoaXRlcmF0aXZlSW5kZXggPSByZWN1cnNpdmVJbmRleDsgaXRlcmF0aXZlSW5kZXggPCBsZW5ndGg7IGl0ZXJhdGl2ZUluZGV4KyspIHsKKyAgICAgIHZhciBmbiA9IGZuc1tpdGVyYXRpdmVJbmRleF07CisgICAgICBpZiAoZm4ubGVuZ3RoID4gMCkgeworICAgICAgICByZXR1cm4gYXR0ZW1wdEFzeW5jKGZuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF0dGVtcHRTeW5jKGZuKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgcnVubmVyRG9uZSA9IGl0ZXJhdGl2ZUluZGV4ID49IGxlbmd0aDsKKworICAgIGlmIChydW5uZXJEb25lKSB7CisgICAgICB0aGlzLmNsZWFyU3RhY2sodGhpcy5vbkNvbXBsZXRlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhdHRlbXB0U3luYyhmbikgeworICAgICAgdHJ5IHsKKyAgICAgICAgZm4uY2FsbChzZWxmLnVzZXJDb250ZXh0KTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGF0dGVtcHRBc3luYyhmbikgeworICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiAoKSB7IHNlbGYucnVuKGZucywgaXRlcmF0aXZlSW5kZXggKyAxKTsgfTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZm4uY2FsbChzZWxmLnVzZXJDb250ZXh0LCBuZXh0KTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpOworICAgICAgICBuZXh0KCk7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gaGFuZGxlRXhjZXB0aW9uKGUpIHsKKyAgICAgIHNlbGYub25FeGNlcHRpb24oZSk7CisgICAgICBpZiAoIXNlbGYuY2F0Y2hFeGNlcHRpb24oZSkpIHsKKyAgICAgICAgLy9UT0RPOiBzZXQgYSB2YXIgd2hlbiB3ZSBjYXRjaCBhbiBleGNlcHRpb24gYW5kCisgICAgICAgIC8vdXNlIGEgZmluYWxseSBibG9jayB0byBjbG9zZSB0aGUgbG9vcCBpbiBhIG5pY2Ugd2F5Li4KKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgcmV0dXJuIFF1ZXVlUnVubmVyOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5SZXBvcnREaXNwYXRjaGVyID0gZnVuY3Rpb24oKSB7CisgIGZ1bmN0aW9uIFJlcG9ydERpc3BhdGNoZXIobWV0aG9kcykgeworCisgICAgdmFyIGRpc3BhdGNoZWRNZXRob2RzID0gbWV0aG9kcyB8fCBbXTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBtZXRob2QgPSBkaXNwYXRjaGVkTWV0aG9kc1tpXTsKKyAgICAgIHRoaXNbbWV0aG9kXSA9IChmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBkaXNwYXRjaChtLCBhcmd1bWVudHMpOworICAgICAgICB9OworICAgICAgfShtZXRob2QpKTsKKyAgICB9CisKKyAgICB2YXIgcmVwb3J0ZXJzID0gW107CisKKyAgICB0aGlzLmFkZFJlcG9ydGVyID0gZnVuY3Rpb24ocmVwb3J0ZXIpIHsKKyAgICAgIHJlcG9ydGVycy5wdXNoKHJlcG9ydGVyKTsKKyAgICB9OworCisgICAgcmV0dXJuIHRoaXM7CisKKyAgICBmdW5jdGlvbiBkaXNwYXRjaChtZXRob2QsIGFyZ3MpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwb3J0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciByZXBvcnRlciA9IHJlcG9ydGVyc1tpXTsKKyAgICAgICAgaWYgKHJlcG9ydGVyW21ldGhvZF0pIHsKKyAgICAgICAgICByZXBvcnRlclttZXRob2RdLmFwcGx5KHJlcG9ydGVyLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBSZXBvcnREaXNwYXRjaGVyOworfTsKKworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLlNweVN0cmF0ZWd5ID0gZnVuY3Rpb24oKSB7CisKKyAgZnVuY3Rpb24gU3B5U3RyYXRlZ3kob3B0aW9ucykgeworICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgICAgdmFyIGlkZW50aXR5ID0gb3B0aW9ucy5uYW1lIHx8ICJ1bmtub3duIiwKKyAgICAgICAgb3JpZ2luYWxGbiA9IG9wdGlvbnMuZm4gfHwgZnVuY3Rpb24oKSB7fSwKKyAgICAgICAgZ2V0U3B5ID0gb3B0aW9ucy5nZXRTcHkgfHwgZnVuY3Rpb24oKSB7fSwKKyAgICAgICAgcGxhbiA9IGZ1bmN0aW9uKCkge307CisKKyAgICB0aGlzLmlkZW50aXR5ID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gaWRlbnRpdHk7CisgICAgfTsKKworICAgIHRoaXMuZXhlYyA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHBsYW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworCisgICAgdGhpcy5jYWxsVGhyb3VnaCA9IGZ1bmN0aW9uKCkgeworICAgICAgcGxhbiA9IG9yaWdpbmFsRm47CisgICAgICByZXR1cm4gZ2V0U3B5KCk7CisgICAgfTsKKworICAgIHRoaXMucmV0dXJuVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcGxhbiA9IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9OworICAgICAgcmV0dXJuIGdldFNweSgpOworICAgIH07CisKKyAgICB0aGlzLnRocm93RXJyb3IgPSBmdW5jdGlvbihzb21ldGhpbmcpIHsKKyAgICAgIHZhciBlcnJvciA9IChzb21ldGhpbmcgaW5zdGFuY2VvZiBFcnJvcikgPyBzb21ldGhpbmcgOiBuZXcgRXJyb3Ioc29tZXRoaW5nKTsKKyAgICAgIHBsYW4gPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICB9OworICAgICAgcmV0dXJuIGdldFNweSgpOworICAgIH07CisKKyAgICB0aGlzLmNhbGxGYWtlID0gZnVuY3Rpb24oZm4pIHsKKyAgICAgIHBsYW4gPSBmbjsKKyAgICAgIHJldHVybiBnZXRTcHkoKTsKKyAgICB9OworCisgICAgdGhpcy5zdHViID0gZnVuY3Rpb24oZm4pIHsKKyAgICAgIHBsYW4gPSBmdW5jdGlvbigpIHt9OworICAgICAgcmV0dXJuIGdldFNweSgpOworICAgIH07CisgIH0KKworICByZXR1cm4gU3B5U3RyYXRlZ3k7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLlN1aXRlID0gZnVuY3Rpb24oKSB7CisgIGZ1bmN0aW9uIFN1aXRlKGF0dHJzKSB7CisgICAgdGhpcy5lbnYgPSBhdHRycy5lbnY7CisgICAgdGhpcy5pZCA9IGF0dHJzLmlkOworICAgIHRoaXMucGFyZW50U3VpdGUgPSBhdHRycy5wYXJlbnRTdWl0ZTsKKyAgICB0aGlzLmRlc2NyaXB0aW9uID0gYXR0cnMuZGVzY3JpcHRpb247CisgICAgdGhpcy5vblN0YXJ0ID0gYXR0cnMub25TdGFydCB8fCBmdW5jdGlvbigpIHt9OworICAgIHRoaXMucmVzdWx0Q2FsbGJhY2sgPSBhdHRycy5yZXN1bHRDYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9OworICAgIHRoaXMuY2xlYXJTdGFjayA9IGF0dHJzLmNsZWFyU3RhY2sgfHwgZnVuY3Rpb24oZm4pIHtmbigpO307CisKKyAgICB0aGlzLmJlZm9yZUZucyA9IFtdOworICAgIHRoaXMuYWZ0ZXJGbnMgPSBbXTsKKyAgICB0aGlzLnF1ZXVlUnVubmVyID0gYXR0cnMucXVldWVSdW5uZXIgfHwgZnVuY3Rpb24oKSB7fTsKKyAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7CisKKyAgICB0aGlzLmNoaWxkcmVuID0gW107CisKKyAgICB0aGlzLnJlc3VsdCA9IHsKKyAgICAgIGlkOiB0aGlzLmlkLAorICAgICAgc3RhdHVzOiB0aGlzLmRpc2FibGVkID8gJ2Rpc2FibGVkJyA6ICcnLAorICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sCisgICAgICBmdWxsTmFtZTogdGhpcy5nZXRGdWxsTmFtZSgpCisgICAgfTsKKyAgfQorCisgIFN1aXRlLnByb3RvdHlwZS5nZXRGdWxsTmFtZSA9IGZ1bmN0aW9uKCkgeworICAgIHZhciBmdWxsTmFtZSA9IHRoaXMuZGVzY3JpcHRpb247CisgICAgZm9yICh2YXIgcGFyZW50U3VpdGUgPSB0aGlzLnBhcmVudFN1aXRlOyBwYXJlbnRTdWl0ZTsgcGFyZW50U3VpdGUgPSBwYXJlbnRTdWl0ZS5wYXJlbnRTdWl0ZSkgeworICAgICAgaWYgKHBhcmVudFN1aXRlLnBhcmVudFN1aXRlKSB7CisgICAgICAgIGZ1bGxOYW1lID0gcGFyZW50U3VpdGUuZGVzY3JpcHRpb24gKyAnICcgKyBmdWxsTmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZ1bGxOYW1lOworICB9OworCisgIFN1aXRlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24oKSB7CisgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7CisgIH07CisKKyAgU3VpdGUucHJvdG90eXBlLmJlZm9yZUVhY2ggPSBmdW5jdGlvbihmbikgeworICAgIHRoaXMuYmVmb3JlRm5zLnVuc2hpZnQoZm4pOworICB9OworCisgIFN1aXRlLnByb3RvdHlwZS5hZnRlckVhY2ggPSBmdW5jdGlvbihmbikgeworICAgIHRoaXMuYWZ0ZXJGbnMudW5zaGlmdChmbik7CisgIH07CisKKyAgU3VpdGUucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oY2hpbGQpIHsKKyAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOworICB9OworCisgIFN1aXRlLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ob25Db21wbGV0ZSkgeworICAgIHZhciBzZWxmID0gdGhpczsKKyAgICBpZiAodGhpcy5kaXNhYmxlZCkgeworICAgICAgY29tcGxldGUoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgYWxsRm5zID0gW107CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgIGFsbEZucy5wdXNoKHdyYXBDaGlsZEFzQXN5bmModGhpcy5jaGlsZHJlbltpXSkpOworICAgIH0KKworICAgIHRoaXMub25TdGFydCh0aGlzKTsKKworICAgIHRoaXMucXVldWVSdW5uZXIoeworICAgICAgZm5zOiBhbGxGbnMsCisgICAgICBvbkNvbXBsZXRlOiBjb21wbGV0ZQorICAgIH0pOworCisgICAgZnVuY3Rpb24gY29tcGxldGUoKSB7CisgICAgICBzZWxmLnJlc3VsdENhbGxiYWNrKHNlbGYucmVzdWx0KTsKKworICAgICAgaWYgKG9uQ29tcGxldGUpIHsKKyAgICAgICAgb25Db21wbGV0ZSgpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHdyYXBDaGlsZEFzQXN5bmMoY2hpbGQpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihkb25lKSB7IGNoaWxkLmV4ZWN1dGUoZG9uZSk7IH07CisgICAgfQorICB9OworCisgIHJldHVybiBTdWl0ZTsKK307CisKK2lmICh0eXBlb2Ygd2luZG93ID09IHZvaWQgMCAmJiB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IikgeworICBleHBvcnRzLlN1aXRlID0gamFzbWluZVJlcXVpcmUuU3VpdGU7Cit9CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkuVGltZXIgPSBmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gVGltZXIob3B0aW9ucykgeworICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCisgICAgdmFyIG5vdyA9IG9wdGlvbnMubm93IHx8IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH0sCisgICAgICAgIHN0YXJ0VGltZTsKKworICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHN0YXJ0VGltZSA9IG5vdygpOworICAgIH07CisKKyAgICB0aGlzLmVsYXBzZWQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBub3coKSAtIHN0YXJ0VGltZTsKKyAgICB9OworICB9CisKKyAgcmV0dXJuIFRpbWVyOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS5tYXRjaGVyc1V0aWwgPSBmdW5jdGlvbihqJCkgeworICAvLyBUT0RPOiB3aGF0IHRvIGRvIGFib3V0IGphc21pbmUucHAgbm90IGJlaW5nIGluamVjdD8gbW92ZSB0byBKU09OLnN0cmluZ2lmeT8gZ3V0IFByZXR0eVByaW50ZXI/CisKKyAgcmV0dXJuIHsKKyAgICBlcXVhbHM6IGZ1bmN0aW9uKGEsIGIsIGN1c3RvbVRlc3RlcnMpIHsKKyAgICAgIGN1c3RvbVRlc3RlcnMgPSBjdXN0b21UZXN0ZXJzIHx8IFtdOworCisgICAgICByZXR1cm4gZXEoYSwgYiwgW10sIFtdLCBjdXN0b21UZXN0ZXJzKTsKKyAgICB9LAorCisgICAgY29udGFpbnM6IGZ1bmN0aW9uKGhheXN0YWNrLCBuZWVkbGUsIGN1c3RvbVRlc3RlcnMpIHsKKyAgICAgIGN1c3RvbVRlc3RlcnMgPSBjdXN0b21UZXN0ZXJzIHx8IFtdOworCisgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoYXlzdGFjaykgPT09ICJbb2JqZWN0IEFycmF5XSIpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYXlzdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChlcShoYXlzdGFja1tpXSwgbmVlZGxlLCBbXSwgW10sIGN1c3RvbVRlc3RlcnMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIGhheXN0YWNrLmluZGV4T2YobmVlZGxlKSA+PSAwOworICAgIH0sCisKKyAgICBidWlsZEZhaWx1cmVNZXNzYWdlOiBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSwKKyAgICAgICAgbWF0Y2hlck5hbWUgPSBhcmdzWzBdLAorICAgICAgICBpc05vdCA9IGFyZ3NbMV0sCisgICAgICAgIGFjdHVhbCA9IGFyZ3NbMl0sCisgICAgICAgIGV4cGVjdGVkID0gYXJncy5zbGljZSgzKSwKKyAgICAgICAgZW5nbGlzaHlQcmVkaWNhdGUgPSBtYXRjaGVyTmFtZS5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihzKSB7IHJldHVybiAnICcgKyBzLnRvTG93ZXJDYXNlKCk7IH0pOworCisgICAgICB2YXIgbWVzc2FnZSA9ICJFeHBlY3RlZCAiICsKKyAgICAgICAgaiQucHAoYWN0dWFsKSArCisgICAgICAgIChpc05vdCA/ICIgbm90ICIgOiAiICIpICsKKyAgICAgICAgZW5nbGlzaHlQcmVkaWNhdGU7CisKKyAgICAgIGlmIChleHBlY3RlZC5sZW5ndGggPiAwKSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgKz0gIiwiOworICAgICAgICAgIH0KKyAgICAgICAgICBtZXNzYWdlICs9ICIgIiArIGokLnBwKGV4cGVjdGVkW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gbWVzc2FnZSArICIuIjsKKyAgICB9CisgIH07CisKKyAgLy8gRXF1YWxpdHkgZnVuY3Rpb24gbG92aW5nbHkgYWRhcHRlZCBmcm9tIGlzRXF1YWwgaW4KKyAgLy8gICBbVW5kZXJzY29yZV0oaHR0cDovL3VuZGVyc2NvcmVqcy5vcmcpCisgIGZ1bmN0aW9uIGVxKGEsIGIsIGFTdGFjaywgYlN0YWNrLCBjdXN0b21UZXN0ZXJzKSB7CisgICAgdmFyIHJlc3VsdCA9IHRydWU7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1c3RvbVRlc3RlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBjdXN0b21UZXN0ZXJSZXN1bHQgPSBjdXN0b21UZXN0ZXJzW2ldKGEsIGIpOworICAgICAgaWYgKCFqJC51dGlsLmlzVW5kZWZpbmVkKGN1c3RvbVRlc3RlclJlc3VsdCkpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbVRlc3RlclJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYSBpbnN0YW5jZW9mIGokLkFueSkgeworICAgICAgcmVzdWx0ID0gYS5qYXNtaW5lTWF0Y2hlcyhiKTsKKyAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGIgaW5zdGFuY2VvZiBqJC5BbnkpIHsKKyAgICAgIHJlc3VsdCA9IGIuamFzbWluZU1hdGNoZXMoYSk7CisgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChiIGluc3RhbmNlb2YgaiQuT2JqZWN0Q29udGFpbmluZykgeworICAgICAgcmVzdWx0ID0gYi5qYXNtaW5lTWF0Y2hlcyhhKTsKKyAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGEgaW5zdGFuY2VvZiBFcnJvciAmJiBiIGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgIHJldHVybiBhLm1lc3NhZ2UgPT0gYi5tZXNzYWdlOworICAgIH0KKworICAgIC8vIElkZW50aWNhbCBvYmplY3RzIGFyZSBlcXVhbC4gYDAgPT09IC0wYCwgYnV0IHRoZXkgYXJlbid0IGlkZW50aWNhbC4KKyAgICAvLyBTZWUgdGhlIFtIYXJtb255IGBlZ2FsYCBwcm9wb3NhbF0oaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9aGFybW9ueTplZ2FsKS4KKyAgICBpZiAoYSA9PT0gYikgeyByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PSAxIC8gYjsgfQorICAgIC8vIEEgc3RyaWN0IGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYG51bGwgPT0gdW5kZWZpbmVkYC4KKyAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSB7IHJldHVybiBhID09PSBiOyB9CisgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTsKKyAgICBpZiAoY2xhc3NOYW1lICE9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBzd2l0Y2ggKGNsYXNzTmFtZSkgeworICAgICAgLy8gU3RyaW5ncywgbnVtYmVycywgZGF0ZXMsIGFuZCBib29sZWFucyBhcmUgY29tcGFyZWQgYnkgdmFsdWUuCisgICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOgorICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYCI1ImAgaXMKKyAgICAgICAgLy8gZXF1aXZhbGVudCB0byBgbmV3IFN0cmluZygiNSIpYC4KKyAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpOworICAgICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzoKKyAgICAgICAgLy8gYE5hTmBzIGFyZSBlcXVpdmFsZW50LCBidXQgbm9uLXJlZmxleGl2ZS4gQW4gYGVnYWxgIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGZvcgorICAgICAgICAvLyBvdGhlciBudW1lcmljIHZhbHVlcy4KKyAgICAgICAgcmV0dXJuIGEgIT0gK2EgPyBiICE9ICtiIDogKGEgPT09IDAgPyAxIC8gYSA9PSAxIC8gYiA6IGEgPT0gK2IpOworICAgICAgY2FzZSAnW29iamVjdCBEYXRlXSc6CisgICAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzoKKyAgICAgICAgLy8gQ29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1lcmljIHByaW1pdGl2ZSB2YWx1ZXMuIERhdGVzIGFyZSBjb21wYXJlZCBieSB0aGVpcgorICAgICAgICAvLyBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnMuIE5vdGUgdGhhdCBpbnZhbGlkIGRhdGVzIHdpdGggbWlsbGlzZWNvbmQgcmVwcmVzZW50YXRpb25zCisgICAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC4KKyAgICAgICAgcmV0dXJuICthID09ICtiOworICAgICAgLy8gUmVnRXhwcyBhcmUgY29tcGFyZWQgYnkgdGhlaXIgc291cmNlIHBhdHRlcm5zIGFuZCBmbGFncy4KKyAgICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6CisgICAgICAgIHJldHVybiBhLnNvdXJjZSA9PSBiLnNvdXJjZSAmJgorICAgICAgICAgIGEuZ2xvYmFsID09IGIuZ2xvYmFsICYmCisgICAgICAgICAgYS5tdWx0aWxpbmUgPT0gYi5tdWx0aWxpbmUgJiYKKyAgICAgICAgICBhLmlnbm9yZUNhc2UgPT0gYi5pZ25vcmVDYXNlOworICAgIH0KKyAgICBpZiAodHlwZW9mIGEgIT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgLy8gQXNzdW1lIGVxdWFsaXR5IGZvciBjeWNsaWMgc3RydWN0dXJlcy4gVGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpYworICAgIC8vIHN0cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjMsIGFic3RyYWN0IG9wZXJhdGlvbiBgSk9gLgorICAgIHZhciBsZW5ndGggPSBhU3RhY2subGVuZ3RoOworICAgIHdoaWxlIChsZW5ndGgtLSkgeworICAgICAgLy8gTGluZWFyIHNlYXJjaC4gUGVyZm9ybWFuY2UgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mCisgICAgICAvLyB1bmlxdWUgbmVzdGVkIHN0cnVjdHVyZXMuCisgICAgICBpZiAoYVN0YWNrW2xlbmd0aF0gPT0gYSkgeyByZXR1cm4gYlN0YWNrW2xlbmd0aF0gPT0gYjsgfQorICAgIH0KKyAgICAvLyBBZGQgdGhlIGZpcnN0IG9iamVjdCB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuCisgICAgYVN0YWNrLnB1c2goYSk7CisgICAgYlN0YWNrLnB1c2goYik7CisgICAgdmFyIHNpemUgPSAwOworICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyBhbmQgYXJyYXlzLgorICAgIGlmIChjbGFzc05hbWUgPT0gJ1tvYmplY3QgQXJyYXldJykgeworICAgICAgLy8gQ29tcGFyZSBhcnJheSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkuCisgICAgICBzaXplID0gYS5sZW5ndGg7CisgICAgICByZXN1bHQgPSBzaXplID09IGIubGVuZ3RoOworICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAvLyBEZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLCBpZ25vcmluZyBub24tbnVtZXJpYyBwcm9wZXJ0aWVzLgorICAgICAgICB3aGlsZSAoc2l6ZS0tKSB7CisgICAgICAgICAgaWYgKCEocmVzdWx0ID0gZXEoYVtzaXplXSwgYltzaXplXSwgYVN0YWNrLCBiU3RhY2ssIGN1c3RvbVRlc3RlcnMpKSkgeyBicmVhazsgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE9iamVjdHMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1aXZhbGVudCwgYnV0IGBPYmplY3RgcworICAgICAgLy8gZnJvbSBkaWZmZXJlbnQgZnJhbWVzIGFyZS4KKyAgICAgIHZhciBhQ3RvciA9IGEuY29uc3RydWN0b3IsIGJDdG9yID0gYi5jb25zdHJ1Y3RvcjsKKyAgICAgIGlmIChhQ3RvciAhPT0gYkN0b3IgJiYgIShpc0Z1bmN0aW9uKGFDdG9yKSAmJiAoYUN0b3IgaW5zdGFuY2VvZiBhQ3RvcikgJiYKKyAgICAgICAgaXNGdW5jdGlvbihiQ3RvcikgJiYgKGJDdG9yIGluc3RhbmNlb2YgYkN0b3IpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy4KKyAgICAgIGZvciAodmFyIGtleSBpbiBhKSB7CisgICAgICAgIGlmIChoYXMoYSwga2V5KSkgeworICAgICAgICAgIC8vIENvdW50IHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcHJvcGVydGllcy4KKyAgICAgICAgICBzaXplKys7CisgICAgICAgICAgLy8gRGVlcCBjb21wYXJlIGVhY2ggbWVtYmVyLgorICAgICAgICAgIGlmICghKHJlc3VsdCA9IGhhcyhiLCBrZXkpICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaywgY3VzdG9tVGVzdGVycykpKSB7IGJyZWFrOyB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEVuc3VyZSB0aGF0IGJvdGggb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzLgorICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBmb3IgKGtleSBpbiBiKSB7CisgICAgICAgICAgaWYgKGhhcyhiLCBrZXkpICYmICEoc2l6ZS0tKSkgeyBicmVhazsgfQorICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9ICFzaXplOworICAgICAgfQorICAgIH0KKyAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy4KKyAgICBhU3RhY2sucG9wKCk7CisgICAgYlN0YWNrLnBvcCgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGZ1bmN0aW9uIGhhcyhvYmosIGtleSkgeworICAgICAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7CisgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJzsKKyAgICB9CisgIH0KK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9CZSA9IGZ1bmN0aW9uKCkgeworICBmdW5jdGlvbiB0b0JlKCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgcGFzczogYWN0dWFsID09PSBleHBlY3RlZAorICAgICAgICB9OworICAgICAgfQorICAgIH07CisgIH0KKworICByZXR1cm4gdG9CZTsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9CZUNsb3NlVG8gPSBmdW5jdGlvbigpIHsKKworICBmdW5jdGlvbiB0b0JlQ2xvc2VUbygpIHsKKyAgICByZXR1cm4geworICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgcHJlY2lzaW9uKSB7CisgICAgICAgIGlmIChwcmVjaXNpb24gIT09IDApIHsKKyAgICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gfHwgMjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgcGFzczogTWF0aC5hYnMoZXhwZWN0ZWQgLSBhY3R1YWwpIDwgKE1hdGgucG93KDEwLCAtcHJlY2lzaW9uKSAvIDIpCisgICAgICAgIH07CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHJldHVybiB0b0JlQ2xvc2VUbzsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9CZURlZmluZWQgPSBmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gdG9CZURlZmluZWQoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIHBhc3M6ICh2b2lkIDAgIT09IGFjdHVhbCkKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcmV0dXJuIHRvQmVEZWZpbmVkOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS50b0JlRmFsc3kgPSBmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gdG9CZUZhbHN5KCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBwYXNzOiAhISFhY3R1YWwKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcmV0dXJuIHRvQmVGYWxzeTsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9CZUdyZWF0ZXJUaGFuID0gZnVuY3Rpb24oKSB7CisKKyAgZnVuY3Rpb24gdG9CZUdyZWF0ZXJUaGFuKCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgcGFzczogYWN0dWFsID4gZXhwZWN0ZWQKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcmV0dXJuIHRvQmVHcmVhdGVyVGhhbjsKK307CisKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS50b0JlTGVzc1RoYW4gPSBmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gdG9CZUxlc3NUaGFuKCkgeworICAgIHJldHVybiB7CisKKyAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBwYXNzOiBhY3R1YWwgPCBleHBlY3RlZAorICAgICAgICB9OworICAgICAgfQorICAgIH07CisgIH0KKworICByZXR1cm4gdG9CZUxlc3NUaGFuOworfTsKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9CZU5hTiA9IGZ1bmN0aW9uKGokKSB7CisKKyAgZnVuY3Rpb24gdG9CZU5hTigpIHsKKyAgICByZXR1cm4geworICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsKSB7CisgICAgICAgIHZhciByZXN1bHQgPSB7CisgICAgICAgICAgcGFzczogKGFjdHVhbCAhPT0gYWN0dWFsKQorICAgICAgICB9OworCisgICAgICAgIGlmIChyZXN1bHQucGFzcykgeworICAgICAgICAgIHJlc3VsdC5tZXNzYWdlID0gIkV4cGVjdGVkIGFjdHVhbCBub3QgdG8gYmUgTmFOLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSAiRXhwZWN0ZWQgIiArIGokLnBwKGFjdHVhbCkgKyAiIHRvIGJlIE5hTi4iOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcmV0dXJuIHRvQmVOYU47Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLnRvQmVOdWxsID0gZnVuY3Rpb24oKSB7CisKKyAgZnVuY3Rpb24gdG9CZU51bGwoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIHBhc3M6IGFjdHVhbCA9PT0gbnVsbAorICAgICAgICB9OworICAgICAgfQorICAgIH07CisgIH0KKworICByZXR1cm4gdG9CZU51bGw7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLnRvQmVUcnV0aHkgPSBmdW5jdGlvbigpIHsKKworICBmdW5jdGlvbiB0b0JlVHJ1dGh5KCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBwYXNzOiAhIWFjdHVhbAorICAgICAgICB9OworICAgICAgfQorICAgIH07CisgIH0KKworICByZXR1cm4gdG9CZVRydXRoeTsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9CZVVuZGVmaW5lZCA9IGZ1bmN0aW9uKCkgeworCisgIGZ1bmN0aW9uIHRvQmVVbmRlZmluZWQoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIHBhc3M6IHZvaWQgMCA9PT0gYWN0dWFsCisgICAgICAgIH07CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHJldHVybiB0b0JlVW5kZWZpbmVkOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS50b0NvbnRhaW4gPSBmdW5jdGlvbigpIHsKKyAgZnVuY3Rpb24gdG9Db250YWluKHV0aWwsIGN1c3RvbUVxdWFsaXR5VGVzdGVycykgeworICAgIGN1c3RvbUVxdWFsaXR5VGVzdGVycyA9IGN1c3RvbUVxdWFsaXR5VGVzdGVycyB8fCBbXTsKKworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7CisKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBwYXNzOiB1dGlsLmNvbnRhaW5zKGFjdHVhbCwgZXhwZWN0ZWQsIGN1c3RvbUVxdWFsaXR5VGVzdGVycykKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcmV0dXJuIHRvQ29udGFpbjsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9FcXVhbCA9IGZ1bmN0aW9uKCkgeworCisgIGZ1bmN0aW9uIHRvRXF1YWwodXRpbCwgY3VzdG9tRXF1YWxpdHlUZXN0ZXJzKSB7CisgICAgY3VzdG9tRXF1YWxpdHlUZXN0ZXJzID0gY3VzdG9tRXF1YWxpdHlUZXN0ZXJzIHx8IFtdOworCisgICAgcmV0dXJuIHsKKyAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IHsKKyAgICAgICAgICBwYXNzOiBmYWxzZQorICAgICAgICB9OworCisgICAgICAgIHJlc3VsdC5wYXNzID0gdXRpbC5lcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgY3VzdG9tRXF1YWxpdHlUZXN0ZXJzKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH07CisgIH0KKworICByZXR1cm4gdG9FcXVhbDsKK307CisKK2dldEphc21pbmVSZXF1aXJlT2JqKCkudG9IYXZlQmVlbkNhbGxlZCA9IGZ1bmN0aW9uKGokKSB7CisKKyAgZnVuY3Rpb24gdG9IYXZlQmVlbkNhbGxlZCgpIHsKKyAgICByZXR1cm4geworICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsKSB7CisgICAgICAgIHZhciByZXN1bHQgPSB7fTsKKworICAgICAgICBpZiAoIWokLmlzU3B5KGFjdHVhbCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgc3B5LCBidXQgZ290ICcgKyBqJC5wcChhY3R1YWwpICsgJy4nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndG9IYXZlQmVlbkNhbGxlZCBkb2VzIG5vdCB0YWtlIGFyZ3VtZW50cywgdXNlIHRvSGF2ZUJlZW5DYWxsZWRXaXRoJyk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQucGFzcyA9IGFjdHVhbC5jYWxscy5hbnkoKTsKKworICAgICAgICByZXN1bHQubWVzc2FnZSA9IHJlc3VsdC5wYXNzID8KKyAgICAgICAgICAiRXhwZWN0ZWQgc3B5ICIgKyBhY3R1YWwuYW5kLmlkZW50aXR5KCkgKyAiIG5vdCB0byBoYXZlIGJlZW4gY2FsbGVkLiIgOgorICAgICAgICAgICJFeHBlY3RlZCBzcHkgIiArIGFjdHVhbC5hbmQuaWRlbnRpdHkoKSArICIgdG8gaGF2ZSBiZWVuIGNhbGxlZC4iOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHJldHVybiB0b0hhdmVCZWVuQ2FsbGVkOworfTsKKworZ2V0SmFzbWluZVJlcXVpcmVPYmooKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCA9IGZ1bmN0aW9uKGokKSB7CisKKyAgZnVuY3Rpb24gdG9IYXZlQmVlbkNhbGxlZFdpdGgodXRpbCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApLAorICAgICAgICAgIGFjdHVhbCA9IGFyZ3NbMF0sCisgICAgICAgICAgZXhwZWN0ZWRBcmdzID0gYXJncy5zbGljZSgxKSwKKyAgICAgICAgICByZXN1bHQgPSB7IHBhc3M6IGZhbHNlIH07CisKKyAgICAgICAgaWYgKCFqJC5pc1NweShhY3R1YWwpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHNweSwgYnV0IGdvdCAnICsgaiQucHAoYWN0dWFsKSArICcuJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFjdHVhbC5jYWxscy5hbnkoKSkgeworICAgICAgICAgIHJlc3VsdC5tZXNzYWdlID0gIkV4cGVjdGVkIHNweSAiICsgYWN0dWFsLmFuZC5pZGVudGl0eSgpICsgIiB0byBoYXZlIGJlZW4gY2FsbGVkIHdpdGggIiArIGokLnBwKGV4cGVjdGVkQXJncykgKyAiIGJ1dCBpdCB3YXMgbmV2ZXIgY2FsbGVkLiI7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1dGlsLmNvbnRhaW5zKGFjdHVhbC5jYWxscy5hbGxBcmdzKCksIGV4cGVjdGVkQXJncykpIHsKKyAgICAgICAgICByZXN1bHQucGFzcyA9IHRydWU7CisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSAiRXhwZWN0ZWQgc3B5ICIgKyBhY3R1YWwuYW5kLmlkZW50aXR5KCkgKyAiIG5vdCB0byBoYXZlIGJlZW4gY2FsbGVkIHdpdGggIiArIGokLnBwKGV4cGVjdGVkQXJncykgKyAiIGJ1dCBpdCB3YXMuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQubWVzc2FnZSA9ICJFeHBlY3RlZCBzcHkgIiArIGFjdHVhbC5hbmQuaWRlbnRpdHkoKSArICIgdG8gaGF2ZSBiZWVuIGNhbGxlZCB3aXRoICIgKyBqJC5wcChleHBlY3RlZEFyZ3MpICsgIiBidXQgYWN0dWFsIGNhbGxzIHdlcmUgIiArIGokLnBwKGFjdHVhbC5jYWxscy5hbGxBcmdzKCkpLnJlcGxhY2UoL15cWyB8IFxdJC9nLCAnJykgKyAiLiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH07CisgIH0KKworICByZXR1cm4gdG9IYXZlQmVlbkNhbGxlZFdpdGg7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLnRvTWF0Y2ggPSBmdW5jdGlvbigpIHsKKworICBmdW5jdGlvbiB0b01hdGNoKCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICAgIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKGV4cGVjdGVkKTsKKworICAgICAgICByZXR1cm4geworICAgICAgICAgIHBhc3M6IHJlZ2V4cC50ZXN0KGFjdHVhbCkKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcmV0dXJuIHRvTWF0Y2g7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLnRvVGhyb3cgPSBmdW5jdGlvbihqJCkgeworCisgIGZ1bmN0aW9uIHRvVGhyb3codXRpbCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICAgIHZhciByZXN1bHQgPSB7IHBhc3M6IGZhbHNlIH0sCisgICAgICAgICAgdGhyZXcgPSBmYWxzZSwKKyAgICAgICAgICB0aHJvd247CisKKyAgICAgICAgaWYgKHR5cGVvZiBhY3R1YWwgIT0gImZ1bmN0aW9uIikgeworICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWN0dWFsIGlzIG5vdCBhIEZ1bmN0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIGFjdHVhbCgpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgdGhyZXcgPSB0cnVlOworICAgICAgICAgIHRocm93biA9IGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRocmV3KSB7CisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSAiRXhwZWN0ZWQgZnVuY3Rpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLiI7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICByZXN1bHQucGFzcyA9IHRydWU7CisgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSAiRXhwZWN0ZWQgZnVuY3Rpb24gbm90IHRvIHRocm93LCBidXQgaXQgdGhyZXcgIiArIGokLnBwKHRocm93bikgKyAiLiI7CisKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHV0aWwuZXF1YWxzKHRocm93biwgZXhwZWN0ZWQpKSB7CisgICAgICAgICAgcmVzdWx0LnBhc3MgPSB0cnVlOworICAgICAgICAgIHJlc3VsdC5tZXNzYWdlID0gIkV4cGVjdGVkIGZ1bmN0aW9uIG5vdCB0byB0aHJvdyAiICsgaiQucHAoZXhwZWN0ZWQpICsgIi4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC5tZXNzYWdlID0gIkV4cGVjdGVkIGZ1bmN0aW9uIHRvIHRocm93ICIgKyBqJC5wcChleHBlY3RlZCkgKyAiLCBidXQgaXQgdGhyZXcgIiArICBqJC5wcCh0aHJvd24pICsgIi4iOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcmV0dXJuIHRvVGhyb3c7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLnRvVGhyb3dFcnJvciA9IGZ1bmN0aW9uKGokKSB7CisgIGZ1bmN0aW9uIHRvVGhyb3dFcnJvciAodXRpbCkgeworICAgIHJldHVybiB7CisgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwpIHsKKyAgICAgICAgdmFyIHRocmV3ID0gZmFsc2UsCisgICAgICAgICAgdGhyb3duLAorICAgICAgICAgIGVycm9yVHlwZSwKKyAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgIHJlZ2V4cCwKKyAgICAgICAgICBuYW1lLAorICAgICAgICAgIGNvbnN0cnVjdG9yTmFtZTsKKworICAgICAgICBpZiAodHlwZW9mIGFjdHVhbCAhPSAiZnVuY3Rpb24iKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBY3R1YWwgaXMgbm90IGEgRnVuY3Rpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGV4dHJhY3RFeHBlY3RlZFBhcmFtcy5hcHBseShudWxsLCBhcmd1bWVudHMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgYWN0dWFsKCk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICB0aHJldyA9IHRydWU7CisgICAgICAgICAgdGhyb3duID0gZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGhyZXcpIHsKKyAgICAgICAgICByZXR1cm4gZmFpbCgiRXhwZWN0ZWQgZnVuY3Rpb24gdG8gdGhyb3cgYW4gRXJyb3IuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISh0aHJvd24gaW5zdGFuY2VvZiBFcnJvcikpIHsKKyAgICAgICAgICByZXR1cm4gZmFpbCgiRXhwZWN0ZWQgZnVuY3Rpb24gdG8gdGhyb3cgYW4gRXJyb3IsIGJ1dCBpdCB0aHJldyAiICsgdGhyb3duICsgIi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICByZXR1cm4gcGFzcygiRXhwZWN0ZWQgZnVuY3Rpb24gbm90IHRvIHRocm93IGFuIEVycm9yLCBidXQgaXQgdGhyZXcgIiArIGZuTmFtZUZvcih0aHJvd24pICsgIi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnJvclR5cGUpIHsKKyAgICAgICAgICBuYW1lID0gZm5OYW1lRm9yKGVycm9yVHlwZSk7CisgICAgICAgICAgY29uc3RydWN0b3JOYW1lID0gZm5OYW1lRm9yKHRocm93bi5jb25zdHJ1Y3Rvcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3JUeXBlICYmIG1lc3NhZ2UpIHsKKyAgICAgICAgICBpZiAodGhyb3duLmNvbnN0cnVjdG9yID09IGVycm9yVHlwZSAmJiB1dGlsLmVxdWFscyh0aHJvd24ubWVzc2FnZSwgbWVzc2FnZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzKCJFeHBlY3RlZCBmdW5jdGlvbiBub3QgdG8gdGhyb3cgIiArIG5hbWUgKyAiIHdpdGggbWVzc2FnZSBcIiIgKyBtZXNzYWdlICsgIlwiLiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFpbCgiRXhwZWN0ZWQgZnVuY3Rpb24gdG8gdGhyb3cgIiArIG5hbWUgKyAiIHdpdGggbWVzc2FnZSBcIiIgKyBtZXNzYWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgYnV0IGl0IHRocmV3ICIgKyBjb25zdHJ1Y3Rvck5hbWUgKyAiIHdpdGggbWVzc2FnZSBcIiIgKyB0aHJvd24ubWVzc2FnZSArICJcIi4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3JUeXBlICYmIHJlZ2V4cCkgeworICAgICAgICAgIGlmICh0aHJvd24uY29uc3RydWN0b3IgPT0gZXJyb3JUeXBlICYmIHJlZ2V4cC50ZXN0KHRocm93bi5tZXNzYWdlKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhc3MoIkV4cGVjdGVkIGZ1bmN0aW9uIG5vdCB0byB0aHJvdyAiICsgbmFtZSArICIgd2l0aCBtZXNzYWdlIG1hdGNoaW5nICIgKyByZWdleHAgKyAiLiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFpbCgiRXhwZWN0ZWQgZnVuY3Rpb24gdG8gdGhyb3cgIiArIG5hbWUgKyAiIHdpdGggbWVzc2FnZSBtYXRjaGluZyAiICsgcmVnZXhwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIGJ1dCBpdCB0aHJldyAiICsgY29uc3RydWN0b3JOYW1lICsgIiB3aXRoIG1lc3NhZ2UgXCIiICsgdGhyb3duLm1lc3NhZ2UgKyAiXCIuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVycm9yVHlwZSkgeworICAgICAgICAgIGlmICh0aHJvd24uY29uc3RydWN0b3IgPT0gZXJyb3JUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gcGFzcygiRXhwZWN0ZWQgZnVuY3Rpb24gbm90IHRvIHRocm93ICIgKyBuYW1lICsgIi4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhaWwoIkV4cGVjdGVkIGZ1bmN0aW9uIHRvIHRocm93ICIgKyBuYW1lICsgIiwgYnV0IGl0IHRocmV3ICIgKyBjb25zdHJ1Y3Rvck5hbWUgKyAiLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXNzYWdlKSB7CisgICAgICAgICAgaWYgKHRocm93bi5tZXNzYWdlID09IG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzKCJFeHBlY3RlZCBmdW5jdGlvbiBub3QgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggbWVzc2FnZSAiICsgaiQucHAobWVzc2FnZSkgKyAiLiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFpbCgiRXhwZWN0ZWQgZnVuY3Rpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggbWVzc2FnZSAiICsgaiQucHAobWVzc2FnZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgYnV0IGl0IHRocmV3IGFuIGV4Y2VwdGlvbiB3aXRoIG1lc3NhZ2UgIiArIGokLnBwKHRocm93bi5tZXNzYWdlKSArICIuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlZ2V4cCkgeworICAgICAgICAgIGlmIChyZWdleHAudGVzdCh0aHJvd24ubWVzc2FnZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzKCJFeHBlY3RlZCBmdW5jdGlvbiBub3QgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIG1hdGNoaW5nICIgKyBqJC5wcChyZWdleHApICsgIi4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhaWwoIkV4cGVjdGVkIGZ1bmN0aW9uIHRvIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBtYXRjaGluZyAiICsgaiQucHAocmVnZXhwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBidXQgaXQgdGhyZXcgYW4gZXhjZXB0aW9uIHdpdGggbWVzc2FnZSAiICsgaiQucHAodGhyb3duLm1lc3NhZ2UpICsgIi4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBmbk5hbWVGb3IoZnVuYykgeworICAgICAgICAgICAgcmV0dXJuIGZ1bmMubmFtZSB8fCBmdW5jLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvblxzKihcdyopXHMqXCgvKVsxXTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHBhc3Mobm90TWVzc2FnZSkgeworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBwYXNzOiB0cnVlLAorICAgICAgICAgICAgbWVzc2FnZTogbm90TWVzc2FnZQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgcGFzczogZmFsc2UsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlCisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGV4dHJhY3RFeHBlY3RlZFBhcmFtcygpIHsKKyAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gYXJndW1lbnRzWzFdOworCisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgaW5zdGFuY2VvZiBSZWdFeHApIHsKKyAgICAgICAgICAgICAgcmVnZXhwID0gZXhwZWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBlY3RlZCA9PSAic3RyaW5nIikgeworICAgICAgICAgICAgICBtZXNzYWdlID0gZXhwZWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrRm9yQW5FcnJvclR5cGUoZXhwZWN0ZWQpKSB7CisgICAgICAgICAgICAgIGVycm9yVHlwZSA9IGV4cGVjdGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShlcnJvclR5cGUgfHwgbWVzc2FnZSB8fCByZWdleHApKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgaXMgbm90IGFuIEVycm9yLCBzdHJpbmcsIG9yIFJlZ0V4cC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNoZWNrRm9yQW5FcnJvclR5cGUoYXJndW1lbnRzWzFdKSkgeworICAgICAgICAgICAgICBlcnJvclR5cGUgPSBhcmd1bWVudHNbMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGVycm9yIHR5cGUgaXMgbm90IGFuIEVycm9yLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXJndW1lbnRzWzJdIGluc3RhbmNlb2YgUmVnRXhwKSB7CisgICAgICAgICAgICAgIHJlZ2V4cCA9IGFyZ3VtZW50c1syXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1syXSA9PSAic3RyaW5nIikgeworICAgICAgICAgICAgICBtZXNzYWdlID0gYXJndW1lbnRzWzJdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBlcnJvciBtZXNzYWdlIGlzIG5vdCBhIHN0cmluZyBvciBSZWdFeHAuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gY2hlY2tGb3JBbkVycm9yVHlwZSh0eXBlKSB7CisgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgdmFyIFN1cnJvZ2F0ZSA9IGZ1bmN0aW9uKCkge307CisgICAgICAgICAgU3Vycm9nYXRlLnByb3RvdHlwZSA9IHR5cGUucHJvdG90eXBlOworICAgICAgICAgIHJldHVybiAobmV3IFN1cnJvZ2F0ZSgpKSBpbnN0YW5jZW9mIEVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHJldHVybiB0b1Rocm93RXJyb3I7Cit9OworCitnZXRKYXNtaW5lUmVxdWlyZU9iaigpLnZlcnNpb24gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuICIyLjAuMCI7Cit9OwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvbGliL2phc21pbmUtMi4wLjAvamFzbWluZV9mYXZpY29uLnBuZyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL2xpYi9qYXNtaW5lLTIuMC4wL2phc21pbmVfZmF2aWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2MmUyNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL2xpYi9qYXNtaW5lLTIuMC4wL2phc21pbmVfZmF2aWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvc3BlYy9QbGF5ZXJTcGVjLmpzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvc3BlYy9QbGF5ZXJTcGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NmMwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9zcGVjL1BsYXllclNwZWMuanMKQEAgLTAsMCArMSw3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitkZXNjcmliZSgiUGxheWVyIiwgZnVuY3Rpb24oKSB7CisgIHZhciBwbGF5ZXI7CisgIHZhciBzb25nOworCisgIGJlZm9yZUVhY2goZnVuY3Rpb24oKSB7CisgICAgcGxheWVyID0gbmV3IFBsYXllcigpOworICAgIHNvbmcgPSBuZXcgU29uZygpOworICB9KTsKKworICBpdCgic2hvdWxkIGJlIGFibGUgdG8gcGxheSBhIFNvbmciLCBmdW5jdGlvbigpIHsKKyAgICBwbGF5ZXIucGxheShzb25nKTsKKyAgICBleHBlY3QocGxheWVyLmN1cnJlbnRseVBsYXlpbmdTb25nKS50b0VxdWFsKHNvbmcpOworCisgICAgLy9kZW1vbnN0cmF0ZXMgdXNlIG9mIGN1c3RvbSBtYXRjaGVyCisgICAgZXhwZWN0KHBsYXllcikudG9CZVBsYXlpbmcoc29uZyk7CisgIH0pOworCisgIGRlc2NyaWJlKCJ3aGVuIHNvbmcgaGFzIGJlZW4gcGF1c2VkIiwgZnVuY3Rpb24oKSB7CisgICAgYmVmb3JlRWFjaChmdW5jdGlvbigpIHsKKyAgICAgIHBsYXllci5wbGF5KHNvbmcpOworICAgICAgcGxheWVyLnBhdXNlKCk7CisgICAgfSk7CisKKyAgICBpdCgic2hvdWxkIGluZGljYXRlIHRoYXQgdGhlIHNvbmcgaXMgY3VycmVudGx5IHBhdXNlZCIsIGZ1bmN0aW9uKCkgeworICAgICAgZXhwZWN0KHBsYXllci5pc1BsYXlpbmcpLnRvQmVGYWxzeSgpOworCisgICAgICAvLyBkZW1vbnN0cmF0ZXMgdXNlIG9mICdub3QnIHdpdGggYSBjdXN0b20gbWF0Y2hlcgorICAgICAgZXhwZWN0KHBsYXllcikubm90LnRvQmVQbGF5aW5nKHNvbmcpOworICAgIH0pOworCisgICAgaXQoInNob3VsZCBiZSBwb3NzaWJsZSB0byByZXN1bWUiLCBmdW5jdGlvbigpIHsKKyAgICAgIHBsYXllci5yZXN1bWUoKTsKKyAgICAgIGV4cGVjdChwbGF5ZXIuaXNQbGF5aW5nKS50b0JlVHJ1dGh5KCk7CisgICAgICBleHBlY3QocGxheWVyLmN1cnJlbnRseVBsYXlpbmdTb25nKS50b0VxdWFsKHNvbmcpOworICAgIH0pOworICB9KTsKKworICAvLyBkZW1vbnN0cmF0ZXMgdXNlIG9mIHNwaWVzIHRvIGludGVyY2VwdCBhbmQgdGVzdCBtZXRob2QgY2FsbHMKKyAgaXQoInRlbGxzIHRoZSBjdXJyZW50IHNvbmcgaWYgdGhlIHVzZXIgaGFzIG1hZGUgaXQgYSBmYXZvcml0ZSIsIGZ1bmN0aW9uKCkgeworICAgIHNweU9uKHNvbmcsICdwZXJzaXN0RmF2b3JpdGVTdGF0dXMnKTsKKworICAgIHBsYXllci5wbGF5KHNvbmcpOworICAgIHBsYXllci5tYWtlRmF2b3JpdGUoKTsKKworICAgIGV4cGVjdChzb25nLnBlcnNpc3RGYXZvcml0ZVN0YXR1cykudG9IYXZlQmVlbkNhbGxlZFdpdGgodHJ1ZSk7CisgIH0pOworCisgIC8vZGVtb25zdHJhdGVzIHVzZSBvZiBleHBlY3RlZCBleGNlcHRpb25zCisgIGRlc2NyaWJlKCIjcmVzdW1lIiwgZnVuY3Rpb24oKSB7CisgICAgaXQoInNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgc29uZyBpcyBhbHJlYWR5IHBsYXlpbmciLCBmdW5jdGlvbigpIHsKKyAgICAgIHBsYXllci5wbGF5KHNvbmcpOworCisgICAgICBleHBlY3QoZnVuY3Rpb24oKSB7CisgICAgICAgIHBsYXllci5yZXN1bWUoKTsKKyAgICAgIH0pLnRvVGhyb3dFcnJvcigic29uZyBpcyBhbHJlYWR5IHBsYXlpbmciKTsKKyAgICB9KTsKKyAgfSk7Cit9KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL3NwZWMvU3BlY0hlbHBlci5qcyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL3NwZWMvU3BlY0hlbHBlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmI2NmRhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvc3BlYy9TcGVjSGVscGVyLmpzCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7CisgIGphc21pbmUuYWRkTWF0Y2hlcnMoeworICAgIHRvQmVQbGF5aW5nOiBmdW5jdGlvbiAoKSB7CisgICAgICByZXR1cm4geworICAgICAgICBjb21wYXJlOiBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCkgeworICAgICAgICAgIHZhciBwbGF5ZXIgPSBhY3R1YWw7CisKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgcGFzczogcGxheWVyLmN1cnJlbnRseVBsYXlpbmdTb25nID09PSBleHBlY3RlZCAmJiBwbGF5ZXIuaXNQbGF5aW5nCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworICAgIH0KKyAgfSk7Cit9KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamFzbWluZS1zdGFuZGFsb25lLTIuMC4wL3NyYy9QbGF5ZXIuanMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9zcmMvUGxheWVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmU5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9zcmMvUGxheWVyLmpzCkBAIC0wLDAgKzEsNDIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworZnVuY3Rpb24gUGxheWVyKCkgeworfQorUGxheWVyLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24oc29uZykgeworICB0aGlzLmN1cnJlbnRseVBsYXlpbmdTb25nID0gc29uZzsKKyAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlOworfTsKKworUGxheWVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmlzUGxheWluZyA9IGZhbHNlOworfTsKKworUGxheWVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHsKKyAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCJzb25nIGlzIGFscmVhZHkgcGxheWluZyIpOworICB9CisKKyAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlOworfTsKKworUGxheWVyLnByb3RvdHlwZS5tYWtlRmF2b3JpdGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jdXJyZW50bHlQbGF5aW5nU29uZy5wZXJzaXN0RmF2b3JpdGVTdGF0dXModHJ1ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvc3JjL1NvbmcuanMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phc21pbmUtc3RhbmRhbG9uZS0yLjAuMC9zcmMvU29uZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZkNzdlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXNtaW5lLXN0YW5kYWxvbmUtMi4wLjAvc3JjL1NvbmcuanMKQEAgLTAsMCArMSwyNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitmdW5jdGlvbiBTb25nKCkgeworfQorCitTb25nLnByb3RvdHlwZS5wZXJzaXN0RmF2b3JpdGVTdGF0dXMgPSBmdW5jdGlvbih2YWx1ZSkgeworICAvLyBzb21ldGhpbmcgY29tcGxpY2F0ZWQKKyAgdGhyb3cgbmV3IEVycm9yKCJub3QgeWV0IGltcGxlbWVudGVkIik7Cit9OwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL0FwcGxpY2F0aW9uQ29uZmlnLmphdmEgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvQXBwbGljYXRpb25Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjk3MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL0FwcGxpY2F0aW9uQ29uZmlnLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKKworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ29uZmlnIGV4dGVuZHMgQXBwbGljYXRpb24geworCisJcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKwkJZmluYWwgU2V0PENsYXNzPD8+PiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKworCQkvLyBBZGQgYWRkaXRpb25hbCBmZWF0dXJlcyBzdWNoIGFzIHN1cHBvcnQgZm9yIE11bHRpcGFydC4KKwkJcmVzb3VyY2VzLmFkZChNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL0NvbnRlbnREaXNwb3Npb3Rpb25EZWxlZ2F0b3IuamF2YSBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9Db250ZW50RGlzcG9zaW90aW9uRGVsZWdhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NzM4NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9Db250ZW50RGlzcG9zaW90aW9uRGVsZWdhdG9yLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CisKK3B1YmxpYyBjbGFzcyBDb250ZW50RGlzcG9zaW90aW9uRGVsZWdhdG9yIGV4dGVuZHMgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24geworCisJcHVibGljIENvbnRlbnREaXNwb3Npb3Rpb25EZWxlZ2F0b3IoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZU5hbWUsIERhdGUgY3JlYXRpb25EYXRlLAorCQkJRGF0ZSBtb2RpZmljYXRpb25EYXRlLCBEYXRlIHJlYWREYXRlLCBsb25nIHNpemUpIHsKKwkJc3VwZXIodHlwZSwgbmFtZSwgZmlsZU5hbWUsIGNyZWF0aW9uRGF0ZSwgbW9kaWZpY2F0aW9uRGF0ZSwgcmVhZERhdGUsIHNpemUpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9NYWluLmphdmEgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MzdiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvTWFpbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5TZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5jb21wb25lbnQuQ29udGFpbmVyLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LndlYmFwcC5XZWJBcHBDb250ZXh0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmxpc3Rlbi5GRUFwcENvbnRleHRMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIE1haW4geworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBUaGUgcG9ydCB0aGF0IHdlIHNob3VsZCBydW4gb24gY2FuIGJlIHNldCBpbnRvIGFuIGVudmlyb25tZW50CisJCS8vIHZhcmlhYmxlCisJCS8vIExvb2sgZm9yIHRoYXQgdmFyaWFibGUgYW5kIGRlZmF1bHQgdG8gODA4MCBpZiBpdCBpc24ndCB0aGVyZS4KKwkJU3RyaW5nIHdlYlBvcnQgPSBTeXN0ZW0uZ2V0ZW52KCJQT1JUIik7CisJCWlmICh3ZWJQb3J0ID09IG51bGwgfHwgd2ViUG9ydC5pc0VtcHR5KCkpIHsKKwkJCXdlYlBvcnQgPSAiODA4MCI7CisJCX0KKwkJLy8gU3RyaW5nIHdlYlBvcnQgPSAiOTk5OCI7CisKKwkJZmluYWwgU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIoSW50ZWdlci52YWx1ZU9mKHdlYlBvcnQpKTsKKwkJc2VydmVyLmFkZEV2ZW50TGlzdGVuZXIoKExpc3RlbmVyKSBuZXcgRkVBcHBDb250ZXh0TGlzdGVuZXIoKSk7CisJCWZpbmFsIFdlYkFwcENvbnRleHQgcm9vdCA9IG5ldyBXZWJBcHBDb250ZXh0KCk7CisKKwkJcm9vdC5zZXRDb250ZXh0UGF0aCgiL3NkYzEiKTsKKwkJLy8gUGFyZW50IGxvYWRlciBwcmlvcml0eSBpcyBhIGNsYXNzIGxvYWRlciBzZXR0aW5nIHRoYXQgSmV0dHkgYWNjZXB0cy4KKwkJLy8gQnkgZGVmYXVsdCBKZXR0eSB3aWxsIGJlaGF2ZSBsaWtlIG1vc3Qgd2ViIGNvbnRhaW5lcnMgaW4gdGhhdCBpdCB3aWxsCisJCS8vIGFsbG93IHlvdXIgYXBwbGljYXRpb24gdG8gcmVwbGFjZSBub24tc2VydmVyIGxpYnJhcmllcyB0aGF0IGFyZSBwYXJ0CisJCS8vIG9mIHRoZQorCQkvLyBjb250YWluZXIuIFNldHRpbmcgcGFyZW50IGxvYWRlciBwcmlvcml0eSB0byB0cnVlIGNoYW5nZXMgdGhpcworCQkvLyBiZWhhdmlvci4KKwkJLy8gUmVhZCBtb3JlIGhlcmU6CisJCS8vIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0pldHR5L1JlZmVyZW5jZS9KZXR0eV9DbGFzc2xvYWRpbmcKKwkJcm9vdC5zZXRQYXJlbnRMb2FkZXJQcmlvcml0eSh0cnVlKTsKKworCQlmaW5hbCBTdHJpbmcgd2ViYXBwRGlyTG9jYXRpb24gPSAic3JjL21haW4vd2ViYXBwLyI7CisJCXJvb3Quc2V0RGVzY3JpcHRvcih3ZWJhcHBEaXJMb2NhdGlvbiArICIvV0VCLUlORi93ZWIueG1sIik7CisJCXJvb3Quc2V0UmVzb3VyY2VCYXNlKHdlYmFwcERpckxvY2F0aW9uKTsKKworCQlzZXJ2ZXIuc2V0SGFuZGxlcihyb290KTsKKworCQlzZXJ2ZXIuc3RhcnQoKTsKKwkJc2VydmVyLmpvaW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvVGVzdEV4dGVybmFsQ29uZmlndXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL1Rlc3RFeHRlcm5hbENvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JjMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL1Rlc3RFeHRlcm5hbENvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5CYXNpY0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuRmlsZUNoYW5nZUNhbGxiYWNrOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkNvbmZpZ0ZpbGVDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgVGVzdEV4dGVybmFsQ29uZmlndXJhdGlvbjxUIGV4dGVuZHMgT2JqZWN0PiB7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRBcHBOYW1lKCJjYXRhbG9nLXNlcnZlciIpOworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24KKwkJCQkuc2V0Q29uZmlnRGlyKCJDOlxcVXNlcnNcXGVzb2Zlclxcd29ya3NwYWNlTHVuYVxcY2F0YWxvZy1zZXJ2ZXJcXHNyY1xcdGVzdFxccmVzb3VyY2VzXFxjb25maWciKTsKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLmxpc3RlbkZvckNoYW5nZXMoKTsKKworCQlDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyID0gbmV3IENvbmZpZ3VyYXRpb25MaXN0ZW5lcihDb25maWd1cmF0aW9uLmNsYXNzLAorCQkJCW5ldyBGaWxlQ2hhbmdlQ2FsbGJhY2soKSB7CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHJlY29uZmlndXJlKEJhc2ljQ29uZmlndXJhdGlvbiBvYmopIHsKKwkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCQkJCQl9CisJCQkJfSk7CisKKwkJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlMSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UobmV3IENvbmZpZ0ZpbGVDaGFuZ2VMaXN0ZW5lcigpLAorCQkJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDb25maWdEaXIoKSk7CisJCWNvbmZpZ3VyYXRpb25Tb3VyY2UxLmdldEFuZFdhdGNoQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uLmNsYXNzLCBjb25maWd1cmF0aW9uTGlzdGVuZXIpOworCisJCXRyeSB7CisJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCAqIDEwMDApOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9zZXJ2bGV0cy9GZVByb3h5U2VydmxldFRlc3QuamF2YSBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9zZXJ2bGV0cy9GZVByb3h5U2VydmxldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRlYjFjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3NlcnZsZXRzL0ZlUHJveHlTZXJ2bGV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuc2VydmxldHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5odHRwLkh0dHBGaWVsZHM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLnNlcnZsZXRzLkZlUHJveHlTZXJ2bGV0OworCitwdWJsaWMgY2xhc3MgRmVQcm94eVNlcnZsZXRUZXN0IHsKKwkvKgorCSAqIEV4YW1wbGUgVXJsIE1hcHBpbmdzOgorCSAqIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zZGMxL2ZlUHJveHkvcmVzdC9zZXJ2aWNlcy9NaWNoYWVsVGVzdDIvMC4wLjEvY3NhcgorCSAqIC0tPiBodHRwOi8vbG9jYWxob3N0OjgwOTAvc2RjMi9yZXN0L3NlcnZpY2VzL01pY2hhZWxUZXN0Mi8wLjAuMS9jc2FyCisJICogaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NkYzEvZmVQcm94eS9kdW1teS9ub3Qvd29ya2luZyAtLT4KKwkgKiBodHRwOi8vbG9jYWxob3N0OjgwOTAvc2RjMi9kdW1teS9ub3Qvd29ya2luZworCSAqLworCUZlUHJveHlTZXJ2bGV0IGZlUHJveHkgPSBuZXcgRmVQcm94eVNlcnZsZXQoKTsKKwlmaW5hbCBzdGF0aWMgSHR0cFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0ID0gTW9ja2l0by5tb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7CisJZmluYWwgc3RhdGljIEh0dHBTZXNzaW9uIGh0dHBTZXNzaW9uID0gTW9ja2l0by5tb2NrKEh0dHBTZXNzaW9uLmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBNb2NraXRvLm1vY2soU2VydmxldENvbnRleHQuY2xhc3MpOworCWZpbmFsIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IE1vY2tpdG8ubW9jayhDb25maWd1cmF0aW9uTWFuYWdlci5jbGFzcyk7CisJZmluYWwgc3RhdGljIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IE1vY2tpdG8ubW9jayhDb25maWd1cmF0aW9uLmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgUmVxdWVzdCBwcm94eVJlcXVlc3QgPSBNb2NraXRvLnNweShSZXF1ZXN0LmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgSHR0cEZpZWxkcyBodHRwRmllbGRzID0gTW9ja2l0by5tb2NrKEh0dHBGaWVsZHMuY2xhc3MpOworCisJZmluYWwgc3RhdGljIFN0cmluZyBCRV9QUk9UT0NPTCA9ICJodHRwIjsKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIEJFX0hPU1QgPSAiMTcyLjIwLjQzLjEyNCI7CisJZmluYWwgc3RhdGljIGludCBCRV9QT1JUID0gODA5MDsKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIEhFQURFUl8xID0gIkhlYWRlcjEiOworCWZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBREVSXzIgPSAiSGVhZGVyMiI7CisJZmluYWwgc3RhdGljIFN0cmluZyBIRUFERVJfMyA9ICJIZWFkZXIzIjsKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIEhFQURFUl8xX1ZBTCA9ICJIZWFkZXIxX1ZhbCI7CisJZmluYWwgc3RhdGljIFN0cmluZyBIRUFERVJfMl9WQUwgPSAiSGVhZGVyMl9WYWwiOworCWZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBREVSXzNfVkFMID0gIkhlYWRlcjNfVmFsIjsKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIFJFUVVFU1RfSURfVkFMID0gIjQ4Njc0OTVhLTVlZDctNDllNC04YmUyLWNjOGQ2NmZkZDUyYiI7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB7CisJCXdoZW4oc2VydmxldFJlcXVlc3QuZ2V0U2Vzc2lvbigpKS50aGVuUmV0dXJuKGh0dHBTZXNzaW9uKTsKKwkJd2hlbihodHRwU2Vzc2lvbi5nZXRTZXJ2bGV0Q29udGV4dCgpKS50aGVuUmV0dXJuKHNlcnZsZXRDb250ZXh0KTsKKwkJd2hlbihzZXJ2bGV0Q29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkudGhlblJldHVybihjb25maWd1cmF0aW9uTWFuYWdlcik7CisJCXdoZW4oY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKS50aGVuUmV0dXJuKGNvbmZpZ3VyYXRpb24pOworCQl3aGVuKGNvbmZpZ3VyYXRpb24uZ2V0QmVQcm90b2NvbCgpKS50aGVuUmV0dXJuKEJFX1BST1RPQ09MKTsKKwkJd2hlbihjb25maWd1cmF0aW9uLmdldEJlSG9zdCgpKS50aGVuUmV0dXJuKEJFX0hPU1QpOworCQl3aGVuKGNvbmZpZ3VyYXRpb24uZ2V0QmVIdHRwUG9ydCgpKS50aGVuUmV0dXJuKEJFX1BPUlQpOworCisJCUxpc3Q8U3RyaW5nPiBzdHJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXN0ckxpc3QuYWRkKEhFQURFUl8xKTsKKwkJc3RyTGlzdC5hZGQoSEVBREVSXzIpOworCQlzdHJMaXN0LmFkZChIRUFERVJfMyk7CisKKwkJd2hlbihzZXJ2bGV0UmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpKS50aGVuUmV0dXJuKENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHN0ckxpc3QpKTsKKwkJd2hlbihzZXJ2bGV0UmVxdWVzdC5nZXRIZWFkZXIoSEVBREVSXzEpKS50aGVuUmV0dXJuKEhFQURFUl8xX1ZBTCk7CisJCXdoZW4oc2VydmxldFJlcXVlc3QuZ2V0SGVhZGVyKEhFQURFUl8yKSkudGhlblJldHVybihIRUFERVJfMl9WQUwpOworCQl3aGVuKHNlcnZsZXRSZXF1ZXN0LmdldEhlYWRlcihIRUFERVJfMykpLnRoZW5SZXR1cm4oSEVBREVSXzNfVkFMKTsKKwkJd2hlbihzZXJ2bGV0UmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLlhfRUNPTVBfUkVRVUVTVF9JRF9IRUFERVIpKS50aGVuUmV0dXJuKFJFUVVFU1RfSURfVkFMKTsKKworCQl3aGVuKHByb3h5UmVxdWVzdC5nZXRIZWFkZXJzKCkpLnRoZW5SZXR1cm4oaHR0cEZpZWxkcyk7CisJCXdoZW4oaHR0cEZpZWxkcy5jb250YWluc0tleShIRUFERVJfMSkpLnRoZW5SZXR1cm4odHJ1ZSk7CisJCXdoZW4oaHR0cEZpZWxkcy5jb250YWluc0tleShIRUFERVJfMikpLnRoZW5SZXR1cm4odHJ1ZSk7CisJCXdoZW4oaHR0cEZpZWxkcy5jb250YWluc0tleShIRUFERVJfMykpLnRoZW5SZXR1cm4oZmFsc2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZVVSSV9BUElSZXF1ZXN0KCkgeworCQl3aGVuKHNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSkudGhlblJldHVybigiL3NkYzEvZmVQcm94eS9yZXN0L2R1bW15QmVBUEkiKTsKKwkJU3RyaW5nIHJlcXVlc3RSZXNvdXJjZVVybCA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvc2RjMS9mZVByb3h5L3Jlc3QvZHVtbXlCZUFQSSI7CisJCVN0cmluZyBleHBlY3RlZENoYW5nZWRVcmwgPSBCRV9QUk9UT0NPTCArICI6Ly8iICsgQkVfSE9TVCArICI6IiArIEJFX1BPUlQgKyAiL3NkYzIvcmVzdC9kdW1teUJlQVBJIjsKKwkJd2hlbihzZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkpLnRoZW5SZXR1cm4obmV3IFN0cmluZ0J1ZmZlcihyZXF1ZXN0UmVzb3VyY2VVcmwpKTsKKworCQl3aGVuKHNlcnZsZXRSZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpLnRoZW5SZXR1cm4oIi9zZGMxIik7CisJCXdoZW4oc2VydmxldFJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkudGhlblJldHVybigiL2ZlUHJveHkvcmVzdC9kdW1teUJlQVBJIik7CisKKwkJVVJJIHJld3JpdGVVUkkgPSBmZVByb3h5LnJld3JpdGVVUkkoc2VydmxldFJlcXVlc3QpOworCisJCWFzc2VydFRydWUocmV3cml0ZVVSSS50b1N0cmluZygpLmVxdWFscyhleHBlY3RlZENoYW5nZWRVcmwpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlVVJJV2l0aFF1cmV5UGFyYW1fQVBJUmVxdWVzdCgpIHsKKwkJd2hlbihzZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpLnRoZW5SZXR1cm4oIi9zZGMxL2ZlUHJveHkvcmVzdC9nZyUyMGc/c3VidHlwZT1WRiIpOworCQlTdHJpbmcgcmVxdWVzdFJlc291cmNlVXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zZGMxL2ZlUHJveHkvcmVzdC9nZyUyMGc/c3VidHlwZT1WRiI7CisJCVN0cmluZyBleHBlY3RlZENoYW5nZWRVcmwgPSBCRV9QUk9UT0NPTCArICI6Ly8iICsgQkVfSE9TVCArICI6IiArIEJFX1BPUlQgKyAiL3NkYzIvcmVzdC9nZyUyMGc/c3VidHlwZT1WRiI7CisJCXdoZW4oc2VydmxldFJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpKS50aGVuUmV0dXJuKG5ldyBTdHJpbmdCdWZmZXIocmVxdWVzdFJlc291cmNlVXJsKSk7CisKKwkJd2hlbihzZXJ2bGV0UmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKS50aGVuUmV0dXJuKCIvc2RjMSIpOworCQl3aGVuKHNlcnZsZXRSZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpLnRoZW5SZXR1cm4oIi9mZVByb3h5L3Jlc3QvZ2clMjBnP3N1YnR5cGU9VkYiKTsKKworCQlVUkkgcmV3cml0ZVVSSSA9IGZlUHJveHkucmV3cml0ZVVSSShzZXJ2bGV0UmVxdWVzdCk7CisKKwkJYXNzZXJ0VHJ1ZShyZXdyaXRlVVJJLnRvU3RyaW5nKCkuZXF1YWxzKGV4cGVjdGVkQ2hhbmdlZFVybCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEN1c3RvbWl6ZVByb3h5UmVxdWVzdCgpIHsKKwkJZmVQcm94eS5jdXN0b21pemVQcm94eVJlcXVlc3QocHJveHlSZXF1ZXN0LCBzZXJ2bGV0UmVxdWVzdCk7CisJCXZlcmlmeShwcm94eVJlcXVlc3QpLmhlYWRlcihIRUFERVJfMywgSEVBREVSXzNfVkFMKTsKKwkJdmVyaWZ5KHByb3h5UmVxdWVzdCwgdGltZXMoMSkpLmhlYWRlcihNb2NraXRvLmFueVN0cmluZygpLCBNb2NraXRvLmFueVN0cmluZygpKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9zZXJ2bGV0cy9Qb3J0YWxTZXJ2bGV0VGVzdC5qYXZhIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3NlcnZsZXRzL1BvcnRhbFNlcnZsZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmZjg3MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9zZXJ2bGV0cy9Qb3J0YWxTZXJ2bGV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuc2VydmxldHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5zZXJ2bGV0cy5Qb3J0YWxTZXJ2bGV0OworCitwdWJsaWMgY2xhc3MgUG9ydGFsU2VydmxldFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKwkKKwlmaW5hbCBzdGF0aWMgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBNb2NraXRvLm1vY2soSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgSHR0cFNlc3Npb24gaHR0cFNlc3Npb24gPSBNb2NraXRvLm1vY2soSHR0cFNlc3Npb24uY2xhc3MpOworCWZpbmFsIHN0YXRpYyBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IE1vY2tpdG8ubW9jayhTZXJ2bGV0Q29udGV4dC5jbGFzcyk7CisJZmluYWwgc3RhdGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gTW9ja2l0by5tb2NrKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmNsYXNzKTsKKwlmaW5hbCBzdGF0aWMgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gTW9ja2l0by5tb2NrKENvbmZpZ3VyYXRpb24uY2xhc3MpOworCWZpbmFsIHN0YXRpYyBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gTW9ja2l0by5zcHkoSHR0cFNlcnZsZXRSZXNwb25zZS5jbGFzcyk7CisJZmluYWwgc3RhdGljIFJlcXVlc3REaXNwYXRjaGVyIHJkID0gTW9ja2l0by5zcHkoUmVxdWVzdERpc3BhdGNoZXIuY2xhc3MpOworCisJQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFVwVGVzdHMoKSB7CisJCXdoZW4ocmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihNb2NraXRvLmFueVN0cmluZygpKSkudGhlblJldHVybihyZCk7CisJCXdoZW4ocmVxdWVzdC5nZXRTZXNzaW9uKCkpLnRoZW5SZXR1cm4oaHR0cFNlc3Npb24pOworCQl3aGVuKGh0dHBTZXNzaW9uLmdldFNlcnZsZXRDb250ZXh0KCkpLnRoZW5SZXR1cm4oc2VydmxldENvbnRleHQpOworCQl3aGVuKHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHVVJBVElPTl9NQU5BR0VSX0FUVFIpKS50aGVuUmV0dXJuKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKKwkJd2hlbihjb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpLnRoZW5SZXR1cm4oY29uZmlndXJhdGlvbik7CisJCUxpc3Q8TGlzdDxTdHJpbmc+PiBtYW5kYXRvcnlIZWFkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0PFN0cmluZz4+KCk7CisJCW1hbmRhdG9yeUhlYWRlcnMuYWRkKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIHsKKwkJCXsKKwkJCQlhZGQoIkhUVFBfSVZfVVNFUiIpOworCQkJCWFkZCgiaXYtdXNlciIpOworCQkJfQorCQl9KTsKKwkJbWFuZGF0b3J5SGVhZGVycy5hZGQobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgeworCQkJeworCQkJCWFkZCgiSFRUUF9DU1BfQVRUVUlEIik7CisJCQkJYWRkKCJjc3AtYXR0dWlkIik7CisJCQl9CisJCX0pOworCQltYW5kYXRvcnlIZWFkZXJzLmFkZChuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSB7CisJCQl7CisJCQkJYWRkKCJVU0VSX0lEIik7CisJCQkJYWRkKCJjc3AtdXNlcklkIik7CisJCQl9CisJCX0pOworCQltYW5kYXRvcnlIZWFkZXJzLmFkZChuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSB7CisJCQl7CisJCQkJYWRkKCJIVFRQX0NTUF9XU1RZUEUiKTsKKwkJCQlhZGQoImNzcC13c3R5cGUgY3NwLXdzdHlwZSIpOworCQkJfQorCQl9KTsKKworCQlMaXN0PExpc3Q8U3RyaW5nPj4gb3B0aW9uYWxIZWFkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0PFN0cmluZz4+KCk7CisJCW9wdGlvbmFsSGVhZGVycy5hZGQobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgeworCQkJeworCQkJCWFkZCgiSFRUUF9DU1BfRklSU1ROQU1FIik7CisJCQkJYWRkKCJjc3AtZmlyc3RuYW1lIik7CisJCQl9CisJCX0pOworCQlvcHRpb25hbEhlYWRlcnMuYWRkKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIHsKKwkJCXsKKwkJCQlhZGQoIkhUVFBfQ1NQX0xBU1ROQU1FIik7CisJCQkJYWRkKCJjc3AtbGFzdG5hbWUiKTsKKwkJCX0KKwkJfSk7CisJCW9wdGlvbmFsSGVhZGVycy5hZGQobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgeworCQkJeworCQkJCWFkZCgiSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIpOworCQkJCWFkZCgiaXYtcmVtb3RlLWFkZHJlc3MiKTsKKwkJCX0KKwkJfSk7CisKKwkJd2hlbihjb25maWd1cmF0aW9uLmdldElkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzKCkpLnRoZW5SZXR1cm4obWFuZGF0b3J5SGVhZGVycyk7CisJCXdoZW4oY29uZmlndXJhdGlvbi5nZXRPcHRpb25hbEhlYWRlckZpZWxkcygpKS50aGVuUmV0dXJuKG9wdGlvbmFsSGVhZGVycyk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nSGVhZGVyc1JlcXVlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl3aGVuKHJlcXVlc3QuZ2V0SGVhZGVyKE1vY2tpdG8uYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKG51bGwpOworCQl0YXJnZXQoKS5wYXRoKCIvcG9ydGFsIikucmVxdWVzdCgpLmdldCgpOworCQlNb2NraXRvLnZlcmlmeShyZXNwb25zZSwgdGltZXMoMSkpLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1VTRV9QUk9YWSwgUG9ydGFsU2VydmxldC5NSVNTSU5HX0hFQURFUlNfTVNHKTsKKwkJTW9ja2l0by5yZXNldChyZXNwb25zZSwgcmQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFN1Y2Nlc2Z1bFJlcXVlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCQlNb2NraXRvLmRvQW5zd2VyKG5ldyBBbnN3ZXI8T2JqZWN0PigpIHsKKwkJCXB1YmxpYyBPYmplY3QgYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgeworCQkJCU9iamVjdFtdIGFyZ3MgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpOworCQkJCVN0cmluZyBoZWFkZXJOYW1lID0gKFN0cmluZykgYXJnc1swXTsKKwkJCQlyZXR1cm4gaGVhZGVyTmFtZTsKKwkJCX0KKwkJfSkud2hlbihyZXF1ZXN0KS5nZXRIZWFkZXIoTW9ja2l0by5hbnlTdHJpbmcoKSk7CisJCXRhcmdldCgpLnBhdGgoIi9wb3J0YWwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisJCXZlcmlmeShyZCkuZm9yd2FyZChNb2NraXRvLmFueShTZXJ2bGV0UmVxdWVzdC5jbGFzcyksIE1vY2tpdG8uYW55KFNlcnZsZXRSZXNwb25zZS5jbGFzcykpOworCQlNb2NraXRvLnJlc2V0KHJlc3BvbnNlLCByZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKwkJUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUG9ydGFsU2VydmxldC5jbGFzcyk7CisKKwkJcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisJCQkJYmluZChyZXF1ZXN0KS50byhIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworCQkJCWJpbmQocmVzcG9uc2UpLnRvKEh0dHBTZXJ2bGV0UmVzcG9uc2UuY2xhc3MpOworCQkJfQorCQl9KTsKKworCQlyZXR1cm4gcmVzb3VyY2VDb25maWc7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvUmVhZE1lLnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL1JlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyMDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL1JlYWRNZS50eHQKQEAgLTAsMCArMSw1IEBACitJbiBPcmRlciB0byBSdW4gdGhlIENJOgorCisxLiBDb25maWd1cmUgaXAgYW5kIHBvcnQgZm9yIGNhdGFsb2ctZmUgaW4gZW52LnNoIGZpbGUgbG9jYXRlZCBpbiBDSVx0ZXN0c1xlbnYKKzIuIHJ1biBzY3JpcHQgcnVuVGVzdHMuc2ggd2l0aCB0aGUgZW52IGZpbGUgYXMgcGFyYW1ldGVyOiAJLi9ydW5UZXN0cy5zaCBlbnYvZW52LnNoCisgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL2FwYWNoZS10eXBlLnltbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL2FwYWNoZS10eXBlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjBiMWEyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvYXBhY2hlLXR5cGUueW1sCkBAIC0wLDAgKzEsNTAgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKK2Rlc2NyaXB0aW9uOiBUT1NDQSBzaW1wbGUgcHJvZmlsZSB3aXRoIEFwYWNoZS4KK3RlbXBsYXRlX25hbWU6IGFwYWNoZS10eXBlCit0ZW1wbGF0ZV92ZXJzaW9uOiAyLjAuMC1TTkFQU0hPVAordGVtcGxhdGVfYXV0aG9yOiBGYXN0Q29ubmVjdAorCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtd2ViU2VydmVyOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIGFsaWVuLm5vZGVzLkFwYWNoZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLldlYlNlcnZlcgorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBUaGUgVE9TQ0EgQXBhY2hlIE5vZGUgVHlwZSByZXByZXNlbnRzIGFuIGFwYWNoZSBjb21wb25lbnQKKyAgICAgIHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIFRPU0NBIENvbXB1dGUgTm9kZSBUeXBlLgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6CisgICAgICAgIHR5cGU6IGFsaWVuLmNhcGFiaWxpdGllcy5BcGFjaGVDb250YWluZXIKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbIHRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIF0KKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy9hcGFjaGUucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIHZlcnNpb246CisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgICAgZGVmYXVsdDogMi40CisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZXF1YWw6IDIuNAorICAgICAgcG9ydDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogUG9ydCBmb3IgdGhlIEFwYWNoZSBzZXJ2ZXIKKyAgICAgICAgZGVmYXVsdDogODAKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAxCisgICAgICBkb2N1bWVudF9yb290OgorICAgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICAgIGRlZmF1bHQ6ICIvdmFyL3d3dyIKKyAgICBpbnRlcmZhY2VzOgorICAgICAgU3RhbmRhcmQ6CisgICAgICAgIGNyZWF0ZToKKyAgICAgICAgICBpbnB1dHM6CisgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIHBvcnRdIH0KKyAgICAgICAgICAgIERPQ19ST09UOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRvY3VtZW50X3Jvb3RdIH0KKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogc2NyaXB0cy9pbnN0YWxsX2FwYWNoZS5zaAorICAgICAgICBzdGFydDogc2NyaXB0cy9zdGFydF9hcGFjaGUuc2gKKworY2FwYWJpbGl0eV90eXBlczoKKyAgYWxpZW4uY2FwYWJpbGl0aWVzLkFwYWNoZUNvbnRhaW5lcjoKKyAgICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL2FwYWNoZS5wbmcgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvYXBhY2hlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTlmNDAyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL2FwYWNoZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL2NvbXB1dGUucG5nIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL2NvbXB1dGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTI5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvY29tcHV0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL2xvYWRiYWxhbmNlci5wbmcgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvbG9hZGJhbGFuY2VyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmYwZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL2xvYWRiYWxhbmNlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL25ldHdvcmsucG5nIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL25ldHdvcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmYxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvbmV0d29yay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL29iamVjdHN0b3JlLnBuZyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL2ltYWdlcy9vYmplY3RzdG9yZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMDYzYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL2ltYWdlcy9vYmplY3RzdG9yZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3JlbGF0aW9uYWxfZGIucG5nIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3JlbGF0aW9uYWxfZGIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTYzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvcmVsYXRpb25hbF9kYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3Jvb3QucG5nIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3Jvb3QucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MGYxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvcm9vdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3JvdXRlci5wbmcgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvcm91dGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzljZGNlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3JvdXRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3NvZnR3YXJlLnBuZyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL2ltYWdlcy9zb2Z0d2FyZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5YzUzMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL2ltYWdlcy9zb2Z0d2FyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3ZvbHVtZS5wbmcgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9pbWFnZXMvdm9sdW1lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZhMTdiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvaW1hZ2VzL3ZvbHVtZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLURCTVMueW1sIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLURCTVMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTI0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtREJNUy55bWwKQEAgLTAsMCArMSwzNiBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtREJNUwordGVtcGxhdGVfYXV0aG9yOiBUT1NDQSBUQwordGVtcGxhdGVfdmVyc2lvbjogMS4wLjAud2QwMy1TTkFQU0hPVAorCitkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLgoraW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIAorbm9kZV90eXBlczoKKyAgdG9zY2Eubm9kZXMuREJNUzoKKyAgICBhYnN0cmFjdDogdHJ1ZQorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgVGhlIFRPU0NBIERCTVMgbm9kZSByZXByZXNlbnRzIGEgdHlwaWNhbCByZWxhdGlvbmFsLCBTUUwgRGF0YWJhc2UgTWFuYWdlbWVudCBTeXN0ZW0gc29mdHdhcmUgY29tcG9uZW50IG9yIHNlcnZpY2UuCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvcmVsYXRpb25hbF9kYi5wbmcKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgZGJtc19yb290X3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiB0aGUgcm9vdCBwYXNzd29yZCBmb3IgdGhlIERCTVMgc2VydmljZS4KKyAgICAgIGRibXNfcG9ydDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IHRoZSBwb3J0IHRoZSBEQk1TIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZm9yIGRhdGEgYW5kIHJlcXVlc3RzCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICBwcm9wZXJ0aWVzOgorICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFt0b3NjYS5ub2Rlcy5EYXRhYmFzZV0KKyAgICAgIGVuZHBvaW50OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRGF0YWJhc2VFbmRwb2ludAorCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtYmxvY2tTdG9yYWdlLnltbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy1ibG9ja1N0b3JhZ2UueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTQyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtYmxvY2tTdG9yYWdlLnltbApAQCAtMCwwICsxLDQwIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCisKK3RlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy1ibG9ja1N0b3JhZ2UKK3RlbXBsYXRlX2F1dGhvcjogVE9TQ0EgVEMKK3RlbXBsYXRlX3ZlcnNpb246IDEuMC4wLndkMDMtU05BUFNIT1QKKworZGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBub3JtYXRpdmUgdHlwZXMgZGVmaW5pdGlvbi4KK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisgIHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgVGhlIFRPU0NBIEJsb2NrU3RvcmFnZSBub2RlIGN1cnJlbnRseSByZXByZXNlbnRzIGEgc2VydmVyLWxvY2FsIGJsb2NrIHN0b3JhZ2UgZGV2aWNlIChpLmUuLCBub3Qgc2hhcmVkKQorICAgICAgb2ZmZXJpbmcgZXZlbmx5IHNpemVkIGJsb2NrcyBvZiBkYXRhIGZyb20gd2hpY2ggcmF3IHN0b3JhZ2Ugdm9sdW1lcyBjYW4gYmUgY3JlYXRlZC4KKyAgICB0YWdzOgorICAgICAgaWNvbjogL2ltYWdlcy92b2x1bWUucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIHNpemU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl90aGFuOiAwCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcmVxdWVzdGVkIHN0b3JhZ2Ugc2l6ZSBpbiBNZWdhQnl0ZXMgKE1CKS4KKyAgICAgIHZvbHVtZV9pZDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogSUQgb2YgYW4gZXhpc3Rpbmcgdm9sdW1lICh0aGF0IGlzIGluIHRoZSBhY2Nlc3NpYmxlIHNjb3BlIG9mIHRoZSByZXF1ZXN0aW5nIGFwcGxpY2F0aW9uKS4KKyAgICAgIHNuYXBzaG90X2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBTb21lIGlkZW50aWZpZXIgdGhhdCByZXByZXNlbnRzIGFuIGV4aXN0aW5nIHNuYXBzaG90IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgYmxvY2sgc3RvcmFnZSAodm9sdW1lKS4KKyAgICBhdHRyaWJ1dGVzOgorICAgICAgdm9sdW1lX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb246IElEIHByb3ZpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgZm9yIG5ld2x5IGNyZWF0ZWQgdm9sdW1lcy4KKyAgICByZXF1aXJlbWVudHM6CisgICAgICBhdHRhY2htZW50OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGUueW1sIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLWNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTcyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZS55bWwKQEAgLTAsMCArMSw3NyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtY29tcHV0ZQordGVtcGxhdGVfYXV0aG9yOiBUT1NDQSBUQwordGVtcGxhdGVfdmVyc2lvbjogMS4wLjAud2QwMy1TTkFQU0hPVAorCitkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLgoraW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgIyBJbmZyYXN0cnVjdHVyZSBjb21wb25lbnRzCisgIHRvc2NhLm5vZGVzLkNvbXB1dGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFJlcHJlc2VudHMgYSByZWFsIG9yIHZpcnR1YWwgbWFjaGluZSBvciDigJhzZXJ2ZXLigJkuIEluZm9ybWF0aW9ucyBzcGVjaWZpZWQgb24gdGhlIENvbXB1dGUKKyAgICAgIG5vZGUgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIG1hY2hpbmUgdGhhdCBmaXRzIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgaW4gdGhlIGNsb3VkCisgICAgICBhdmFpbGFibGUgbWFjaGluZXMuIElmIG5vIHNpemluZyBpbmZvcm1hdGlvbnMgYXJlIHNwZWNpZmllZCB0aGUgY2xvdWTigJlzIHByb3ZpZGVyIGRlZmF1bHQKKyAgICAgIG1hY2hpbmUgd2lsbCBiZSB1c2VkLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzcGVjaWZ5IHRoZSByZXF1aXJlZCBjcHVzIGFuZCBtZW1vcnkKKyAgICAgIGF0IGxlYXN0LgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL2NvbXB1dGUucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIG51bV9jcHVzOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBjb25zdHJhaW50czoKKyAgICAgICAgICAtICBncmVhdGVyX3RoYW46IDAKKyAgICAgICAgZGVzY3JpcHRpb246IE51bWJlciBvZiAoYWN0dWFsIG9yIHZpcnR1YWwpIENQVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDb21wdXRlIG5vZGUuCisgICAgICBtZW1fc2l6ZToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX3RoYW46IDAKKyAgICAgICAgZGVzY3JpcHRpb246IFNpemUgb2YgbWVtb3J5LCBpbiBNZWdhYnl0ZXMgKE1CKSwgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBDb21wdXRlIG5vZGUuCisgICAgICBkaXNrX3NpemU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl90aGFuOiAwCisgICAgICAgIGRlc2NyaXB0aW9uOiBTaXplIG9mIHRoZSBsb2NhbCBkaXNrLCBpbiBHaWdhYnl0ZXMgKEdCKSwgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBDb21wdXRlIG5vZGUuCisgICAgICBvc19hcmNoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSB2YWxpZF92YWx1ZXM6IFsieDg2XzMyIiwgIng4Nl82NCJdCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgaG9zdCBPcGVyYXRpbmcgU3lzdGVtIChPUykgYXJjaGl0ZWN0dXJlLgorICAgICAgb3NfdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbImxpbnV4IiwgImFpeCIsICJtYWMgb3MiLCAid2luZG93cyJdCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgaG9zdCBPcGVyYXRpbmcgU3lzdGVtIChPUykgdHlwZS4KKyAgICAgIG9zX2Rpc3RyaWJ1dGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGhvc3QgT3BlcmF0aW5nIFN5c3RlbSAoT1MpIGRpc3RyaWJ1dGlvbi4KKyAgICAgIG9zX3ZlcnNpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBob3N0IE9wZXJhdGluZyBTeXN0ZW0gdmVyc2lvbi4KKyAgICBhdHRyaWJ1dGVzOgorICAgICAgaXBfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICAgICAgVGhlIHByaW1hcnkgSVAgYWRkcmVzcyBhc3NpZ25lZCBieSB0aGUgY2xvdWQgcHJvdmlkZXIgdGhhdCBhcHBsaWNhdGlvbnMgbWF5IHVzZSB0byBhY2Nlc3MgdGhlIENvbXB1dGUgbm9kZS4KKyAgICAgICAgICBOb3RlOiBUaGlzIGlzIHVzZWQgYnkgdGhlIHBsYXRmb3JtIHByb3ZpZGVyIHRvIGNvbnZleSB0aGUgcHJpbWFyeSBhZGRyZXNzIHVzZWQgdG8gYWNjZXNzIHRoZSBjb21wdXRlIG5vZGUuICBGdXR1cmUgd29ya2luZyBkcmFmdHMgd2lsbCBhZGRyZXNzIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgZmxvYXRpbmcgb3IgbXVsdGlwbGUgSVAgYWRkcmVzc2VzLgorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIG5ldHdvcms6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db25uZWN0aXZpdHkKKyAgICAgICAgbG93ZXJfYm91bmQ6IDAKKyAgICAgICAgdXBwZXJfYm91bmQ6IHVuYm91bmRlZAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgcHJvcGVydGllczoKKyAgICAgICAgICB2YWxpZF9ub2RlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdCisgICAgICBhdHRhY2g6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICBzY2FsYWJsZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2UueW1sIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJmNWQxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLWRhdGFiYXNlLnltbApAQCAtMCwwICsxLDQxIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCisKK3RlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy1kYXRhYmFzZQordGVtcGxhdGVfYXV0aG9yOiBUT1NDQSBUQwordGVtcGxhdGVfdmVyc2lvbjogMS4wLjAud2QwMy1TTkFQU0hPVAorCitkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLgoraW1wb3J0czoKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLXJvb3Q6MS4wLjAud2QwMy1TTkFQU0hPVCIKKyAgLSAidG9zY2Etbm9ybWF0aXZlLXR5cGVzLURCTVM6MS4wLjAud2QwMy1TTkFQU0hPVCIKKworbm9kZV90eXBlczoKKyAgdG9zY2Eubm9kZXMuRGF0YWJhc2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEJhc2UgdHlwZSBmb3IgdGhlIHNjaGVtYSBhbmQgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSBEQk1TLgorICAgICAgVGhlIFRPU0NBIERhdGFiYXNlIG5vZGUgcmVwcmVzZW50cyBhIGxvZ2ljYWwgZGF0YWJhc2UgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgaG9zdGVkIGJ5IGEgVE9TQ0EgREJNUyBub2RlLgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL3JlbGF0aW9uYWxfZGIucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIGRiX3VzZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgZGVzY3JpcHRpb246IFRoZSBzcGVjaWFsIHVzZXIgYWNjb3VudCB1c2VkIGZvciBkYXRhYmFzZSBhZG1pbmlzdHJhdGlvbi4KKyAgICAgIGRiX3Bhc3N3b3JkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIOKAmGRiX3VzZXLigJkgcHJvcGVydHkuCisgICAgICBkYl9wb3J0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLgorICAgICAgZGJfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBob3N0OiB0b3NjYS5ub2Rlcy5EQk1TCisgICAgICAgIHJlbGF0aW9uc2hpcF90eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgZGF0YWJhc2VfZW5kcG9pbnQ6IHRvc2NhLmNhcGFiaWxpdGllcy5EYXRhYmFzZUVuZHBvaW50CmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtbmV0d29yay55bWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtbmV0d29yay55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4NjBmOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy1uZXR3b3JrLnltbApAQCAtMCwwICsxLDM5IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCisKK3RlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy1uZXR3b3JrCit0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UCisKK2Rlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgbm9ybWF0aXZlIHR5cGVzIGRlZmluaXRpb24uCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICB0b3NjYS5ub2Rlcy5OZXR3b3JrOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICBUaGUgVE9TQ0EgTmV0d29yayBub2RlIHJlcHJlc2VudHMgYSBzaW1wbGUsIGxvZ2ljYWwgbmV0d29yayBzZXJ2aWNlLgorICAgIHByb3BlcnRpZXM6CisgICAgICBpcF92ZXJzaW9uOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgICBkZWZhdWx0OiA0CisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbIDQsIDYgXQorICAgICAgY2lkcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgZ2F0ZXdheV9pcDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgbmV0d29ya19uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICBuZXR3b3JrX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgY29ubmVjdGlvbjoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbm5lY3Rpdml0eQorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL25ldHdvcmsucG5nCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtb2JqZWN0U3RvcmFnZS55bWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtb2JqZWN0U3RvcmFnZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2ZmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy1vYmplY3RTdG9yYWdlLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCisKK3RlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy1vYmplY3RTdG9yYWdlCit0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UCisKK2Rlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgbm9ybWF0aXZlIHR5cGVzIGRlZmluaXRpb24uCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICB0b3NjYS5ub2Rlcy5PYmplY3RTdG9yYWdlOgorICAgIGFic3RyYWN0OiB0cnVlCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoZSBUT1NDQSBPYmplY3RTdG9yYWdlIG5vZGUgcmVwcmVzZW50cyBzdG9yYWdlIHRoYXQgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gc3RvcmUgZGF0YSBhcyBvYmplY3RzIChvciBCTE9CcyBvZiBkYXRhKQorICAgICAgd2l0aG91dCBjb25zaWRlcmF0aW9uIGZvciB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIG9yIGRldmljZXMuCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvb2JqZWN0c3RvcmUucG5nCisgICAgcHJvcGVydGllczoKKyAgICAgIHN0b3JlX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgb2JqZWN0IHN0b3JlIChvciBjb250YWluZXIpLgorICAgICAgc3RvcmVfc2l6ZToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBncmVhdGVyX29yX2VxdWFsOiAwCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcmVxdWVzdGVkIGluaXRpYWwgc3RvcmFnZSBzaXplIGluIEdpZ2FieXRlcy4KKyAgICAgIHN0b3JlX21heHNpemU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICAgIGNvbnN0cmFpbnRzOgorICAgICAgICAgIC0gZ3JlYXRlcl90aGFuOiAwCisgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcmVxdWVzdGVkIG1heGltdW0gc3RvcmFnZSBzaXplIGluIEdpZ2FieXRlcy4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy1yb290LnltbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy1yb290LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRjMTZjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLXJvb3QueW1sCkBAIC0wLDAgKzEsMTY4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCisKK3RlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290Cit0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UCisKK2Rlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgbm9ybWF0aXZlIHR5cGVzIGRlZmluaXRpb24uCisKK25vZGVfdHlwZXM6CisgIHRvc2NhLm5vZGVzLlJvb3Q6CisgICAgYWJzdHJhY3Q6IHRydWUKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCAocm9vdCkgVE9TQ0EgTm9kZSBUeXBlIHRoYXQgYWxsIG90aGVyIFRPU0NBIG5vZGVzIHNob3VsZCBleHRlbmRzLgorICAgICAgVGhpcyBhbGxvd3MgYWxsIFRPU0NBIG5vZGVzIHRvIGhhdmUgYSBjb25zaXN0ZW50IHNldCBvZiBmZWF0dXJlcyBmb3IgbW9kZWxpbmcgYW5kIG1hbmFnZW1lbnQKKyAgICAgIChlLmcsIGNvbnNpc3RlbnQgZGVmaW5pdGlvbnMgZm9yIHJlcXVpcmVtZW50cywgY2FwYWJpbGl0aWVzLCBhbmQgbGlmZWN5Y2xlIGludGVyZmFjZXMpLgorICAgIHRhZ3M6CisgICAgICBpY29uOiAvaW1hZ2VzL3Jvb3QucG5nCisgICAgYXR0cmlidXRlczoKKyAgICAgIHRvc2NhX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHRvc2NhX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIGRlcGVuZGVuY3k6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisgICAgICAgIGxvd2VyX2JvdW5kOiAwCisgICAgICAgIHVwcGVyX2JvdW5kOiB1bmJvdW5kZWQKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICByb290OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgIGludGVyZmFjZXM6CisgICAgICB0b3NjYS5pbnRlcmZhY2VzLm5vZGUubGlmZWN5Y2xlLlN0YW5kYXJkOgorICAgICAgICBkZXNjcmlwdGlvbjogPgorICAgICAgICAgIFRoaXMgbGlmZWN5Y2xlIGludGVyZmFjZSBkZWZpbmVzIHRoZSBlc3NlbnRpYWwsIG5vcm1hdGl2ZSBvcGVyYXRpb25zIHRoYXQgVE9TQ0Egbm9kZXMgbWF5IHN1cHBvcnQuCisgICAgICAgIGNyZWF0ZToKKyAgICAgICAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIGNyZWF0ZSBvcGVyYXRpb24uCisgICAgICAgIGNvbmZpZ3VyZToKKyAgICAgICAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIGNvbmZpZ3VyZSBvcGVyYXRpb24gKHByZS1zdGFydCkuCisgICAgICAgIHN0YXJ0OgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgc3RhcnQgb3BlcmF0aW9uLgorICAgICAgICBwb3N0X3N0YXJ0OgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgcG9zdC1jb25maWd1cmUgb3BlcmF0aW9uIChwb3N0LXN0YXJ0KQorICAgICAgICBzdG9wOgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgc3RvcCBvcGVyYXRpb24uCisgICAgICAgIGRlbGV0ZToKKyAgICAgICAgICBkZXNjcmlwdGlvbjogU3RhbmRhcmQgbGlmZWN5Y2xlIGRlbGV0ZSBvcGVyYXRpb24uCisKKworY2FwYWJpbGl0eV90eXBlczoKKyAgdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3Q6CisgICAgZGVzY3JpcHRpb246IFRoaXMgaXMgdGhlIGRlZmF1bHQgKHJvb3QpIFRPU0NBIENhcGFiaWxpdHkgVHlwZSBkZWZpbml0aW9uIHRoYXQgYWxsIG90aGVyIFRPU0NBIENhcGFiaWxpdHkgVHlwZXMgZGVyaXZlIGZyb20uCisgIHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXI6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICB2YWxpZF9ub2RlX3R5cGVzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgQSBsaXN0IG9mIG9uZSBvciBtb3JlIG5hbWVzIG9mIE5vZGUgVHlwZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGFzICBjb250YWluZWVzIHRoYXQgZGVjbGFyZSB0aGUgQ29udGFpbmVyIHR5cGUgYXMgYSBDYXBhYmlsaXR5LgorICB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICBwcm90b2NvbDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHRjcAorICAgICAgcG9ydDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAtIGdyZWF0ZXJfb3JfZXF1YWw6IDEKKyAgICAgICAgIC0gbGVzc19vcl9lcXVhbDogNjU1MzUKKyAgICAgIHNlY3VyZToKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgdXJsX3BhdGg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgdG9zY2EuY2FwYWJpbGl0aWVzLkRhdGFiYXNlRW5kcG9pbnQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyB0aGUgZGVmYXVsdCBUT1NDQSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgb3IgZXh0ZW5kZWQgdG8gZGVmaW5lIGEgc3BlY2lhbGl6ZWQgZGF0YWJhc2UgZW5kcG9pbnQgY2FwYWJpbGl0eS4KKyAgdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQ6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBkZWZhdWx0IFRPU0NBIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCBvciBleHRlbmRlZCB0byBkZWZpbmUgYSBuZXR3b3JrIGVuZHBvaW50IGNhcGFiaWxpdHkuCisgIHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIG1pbl9pbnRhbmNlczoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZWZhdWx0OiAxCisgICAgICBtYXhfaW50YW5jZXM6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMQorICAgICAgZGVmYXVsdF9pbnN0YW5jZXM6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMQorICB0b3NjYS5jYXBhYmlsaXRpZXMuQ29ubmVjdGl2aXR5OgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QKKworcmVsYXRpb25zaGlwX3R5cGVzOgorICB0b3NjYS5yZWxhdGlvbnNoaXBzLlJvb3Q6CisgICAgYWJzdHJhY3Q6IHRydWUKKyAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyB0aGUgZGVmYXVsdCAocm9vdCkgVE9TQ0EgUmVsYXRpb25zaGlwIFR5cGUgZGVmaW5pdGlvbiB0aGF0IGFsbCBvdGhlciBUT1NDQSBSZWxhdGlvbnNoaXAgVHlwZXMgZGVyaXZlIGZyb20uCisgICAgdmFsaWRfdGFyZ2V0czogWyB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCBdCisgICAgYXR0cmlidXRlczoKKyAgICAgIHRvc2NhX2lkOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHRvc2NhX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgIGludGVyZmFjZXM6CisgICAgICB0b3NjYS5pbnRlcmZhY2VzLnJlbGF0aW9uc2hpcC5Db25maWd1cmU6CisgICAgICAgIGRlc2NyaXB0aW9uOiA+CisgICAgICAgICAgVGhlIGxpZmVjeWNsZSBpbnRlcmZhY2VzIGRlZmluZSB0aGUgZXNzZW50aWFsLCBub3JtYXRpdmUgb3BlcmF0aW9ucyB0aGF0IGVhY2ggVE9TQ0EgUmVsYXRpb25zaGlwIFR5cGVzIG1heSBzdXBwb3J0LgorICAgICAgICBwcmVfY29uZmlndXJlX3NvdXJjZToKKyAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIHByZS1jb25maWd1cmUgdGhlIHNvdXJjZSBlbmRwb2ludC4KKyAgICAgICAgcHJlX2NvbmZpZ3VyZV90YXJnZXQ6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBwcmUtY29uZmlndXJlIHRoZSB0YXJnZXQgZW5kcG9pbnQuCisgICAgICAgIHBvc3RfY29uZmlndXJlX3NvdXJjZToKKyAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIHBvc3QtY29uZmlndXJlIHRoZSBzb3VyY2UgZW5kcG9pbnQuCisgICAgICAgIHBvc3RfY29uZmlndXJlX3RhcmdldDoKKyAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIHBvc3QtY29uZmlndXJlIHRoZSB0YXJnZXQgZW5kcG9pbnQuCisgICAgICAgIGFkZF90YXJnZXQ6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgdGhlIHNvdXJjZSBub2RlIG9mIGEgdGFyZ2V0IG5vZGUgYmVpbmcgYWRkZWQgdmlhIGEgcmVsYXRpb25zaGlwLgorICAgICAgICBhZGRfc291cmNlOgorICAgICAgICAgIGRlc2NyaXB0aW9uOiBPcGVyYXRpb24gdG8gbm90aWZ5IHRoZSB0YXJnZXQgbm9kZSBvZiBhIHNvdXJjZSBub2RlIHdoaWNoIGlzIG5vdyAgYXZhaWxhYmxlIHZpYSBhIHJlbGF0aW9uc2hpcC4KKyAgICAgICAgcmVtb3ZlX3RhcmdldDoKKyAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIG5vdGlmeSB0aGUgc291cmNlIG5vZGUgb2YgYSB0YXJnZXQgbm9kZSBiZWluZyByZW1vdmVkIGZyb20gYSByZWxhdGlvbnNoaXAuCisgICAgICAgIHJlbW92ZV9zb3VyY2U6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgdGhlIHRhcmdldCBub2RlIG9mIGEgc291cmNlIG5vZGUgYmVpbmcgcmVtb3ZlZCBmcm9tIGEgcmVsYXRpb25zaGlwLgorICAgICAgICB0YXJnZXRfY2hhbmdlZDoKKyAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIG5vdGlmeSBzb3VyY2Ugc29tZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldC4KKyAgICAgICAgc291cmNlX2NoYW5nZWQ6CisgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgdGFyZ2V0IHNvbWUgcHJvcGVydHkgb3IgYXR0cmlidXRlIG9mIHRoZSBzb3VyY2UuCisgIHRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EucmVsYXRpb25zaGlwcy5Sb290CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIEEgZ2VuZXJpYyBkZXBlbmRzIG9uIHJlbGF0aW9uc2hpcC4KKyAgdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uCisgICAgZGVzY3JpcHRpb246IFJlbGF0aW9uc2hpcCB0byB1c2UgdG8gZGVzY3JpYmUgdGhhdCB0aGUgc291cmNlIGlzIGhvc3RlZCAoaW5zdGFsbGVkLyBkZXBsb3llZCkgb24gdGhlIHRhcmdldCBub2RlLgorICAgIHZhbGlkX3RhcmdldHM6IFsgdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciBdCisgIHRvc2NhLnJlbGF0aW9uc2hpcHMuQ29ubmVjdHNUbzoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uCisgICAgdmFsaWRfdGFyZ2V0czogWyB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQgXQorICB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaFRvOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EucmVsYXRpb25zaGlwcy5Sb290CisgICAgdmFsaWRfdGFyZ2V0czogWyB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudCBdCisgICAgcHJvcGVydGllczoKKyAgICAgIGxvY2F0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgY29uc3RyYWludHM6CisgICAgICAgICAgLSBtaW5fbGVuZ3RoOiAxCisgICAgICBkZXZpY2U6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgdG9zY2EucmVsYXRpb25zaGlwcy5OZXR3b3JrOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2EucmVsYXRpb25zaGlwcy5Sb290CisgICAgdmFsaWRfc291cmNlczogWyB0b3NjYS5jYXBhYmlsaXRpZXMuQ29ubmVjdGl2aXR5IF0KKyAgICB2YWxpZF90YXJnZXRzOiBbIHRvc2NhLmNhcGFiaWxpdGllcy5Db25uZWN0aXZpdHkgXQorCithcnRpZmFjdF90eXBlczoKKyAgdG9zY2EuYXJ0aWZhY3RzLlJvb3Q6CisgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBBcnRpZmFjdCBUeXBlIGFsbCBvdGhlciBUT1NDQSBBcnRpZmFjdCBUeXBlcyBkZXJpdmUgZnJvbS4KKyAgdG9zY2EuYXJ0aWZhY3RzLkZpbGU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5hcnRpZmFjdHMuUm9vdAorICAgIGRlc2NyaXB0aW9uOiBUaGlzIGFydGlmYWN0IHR5cGUgaXMgdXNlZCB3aGVuIGFuIGFydGlmYWN0IGRlZmluaXRpb24gbmVlZHMgdG8gaGF2ZSBpdHMgYXNzb2NpYXRlZCBmaWxlIHNpbXBseSB0cmVhdGVkIGFzIGEgZmlsZSBhbmQgbm8gc3BlY2lhbCBoYW5kbGluZy9oYW5kbGVycyBhcmUgaW52b2tlZC4KKyAgdG9zY2EuYXJ0aWZhY3RzLlNoZWxsU2NyaXB0OgorICAgIGRlc2NyaXB0aW9uOiBBIHNoZWxsIHNjcmlwdCAoLnNoIGZpbGUpCisgICAgZmlsZV9leHQ6IFsgc2ggXQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvbm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50LnltbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy1zb2Z0d2FyZUNvbXBvbmVudC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlMDRhZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy1zb2Z0d2FyZUNvbXBvbmVudC55bWwKQEAgLTAsMCArMSwyNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzBfd2QwMworCit0ZW1wbGF0ZV9uYW1lOiB0b3NjYS1ub3JtYXRpdmUtdHlwZXMtc29mdHdhcmVDb21wb25lbnQKK3RlbXBsYXRlX2F1dGhvcjogVE9TQ0EgVEMKK3RlbXBsYXRlX3ZlcnNpb246IDEuMC4wLndkMDMtU05BUFNIT1QKKworZGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBub3JtYXRpdmUgdHlwZXMgZGVmaW5pdGlvbi4KK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1jb21wdXRlOjEuMC4wLndkMDMtU05BUFNIT1QiCisKK25vZGVfdHlwZXM6CisKKyAgdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQ6CisgICAgYWJzdHJhY3Q6IHRydWUKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBkZXNjcmlwdGlvbjogPgorICAgICAgVGhlIFRPU0NBIFNvZnR3YXJlQ29tcG9uZW50IE5vZGUgVHlwZSByZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQKKyAgICAgIHRoYXQgY2FuIGJlIG1hbmFnZWQgYW5kIHJ1biBieSBhIFRPU0NBIENvbXB1dGUgTm9kZSBUeXBlLgorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvc29mdHdhcmUucG5nCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy13ZWJBcHBsaWNhdGlvbi55bWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtd2ViQXBwbGljYXRpb24ueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDAwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtd2ViQXBwbGljYXRpb24ueW1sCkBAIC0wLDAgKzEsMjEgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wX3dkMDMKKwordGVtcGxhdGVfbmFtZTogdG9zY2Etbm9ybWF0aXZlLXR5cGVzLXdlYkFwcGxpY2F0aW9uCit0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDCit0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UCisKK2Rlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgbm9ybWF0aXZlIHR5cGVzIGRlZmluaXRpb24uCitpbXBvcnRzOgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtcm9vdDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorICAtICJ0b3NjYS1ub3JtYXRpdmUtdHlwZXMtd2ViU2VydmVyOjEuMC4wLndkMDMtU05BUFNIT1QiCisgIAorbm9kZV90eXBlczoKKyAgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb246CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoZSBUT1NDQSBXZWJBcHBsaWNhdGlvbiBub2RlIHJlcHJlc2VudHMgYSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBydW4gYnkgYSBUT1NDQSBXZWJTZXJ2ZXIgbm9kZS4gIFNwZWNpZmljIHR5cGVzIG9mIHdlYiBhcHBsaWNhdGlvbnMgc3VjaCBhcyBKYXZhLCBldGMuIGNvdWxkIGJlIGRlcml2ZWQgZnJvbSB0aGlzIHR5cGUuCisgICAgdGFnczoKKyAgICAgIGljb246IC9pbWFnZXMvbmV0d29yay5wbmcKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGhvc3Q6IHRvc2NhLm5vZGVzLldlYlNlcnZlcgorICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtd2ViU2VydmVyLnltbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL25vcm1hdGl2ZS10eXBlcy13ZWJTZXJ2ZXIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmU0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9ub3JtYXRpdmUtdHlwZXMtd2ViU2VydmVyLnltbApAQCAtMCwwICsxLDI0IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzCisKK3RlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy13ZWJTZXJ2ZXIKK3RlbXBsYXRlX2F1dGhvcjogVE9TQ0EgVEMKK3RlbXBsYXRlX3ZlcnNpb246IDEuMC4wLndkMDMtU05BUFNIT1QKKworZGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBub3JtYXRpdmUgdHlwZXMgZGVmaW5pdGlvbi4KK2ltcG9ydHM6CisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290OjEuMC4wLndkMDMtU05BUFNIT1QiCisgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlcy1zb2Z0d2FyZUNvbXBvbmVudDoxLjAuMC53ZDAzLVNOQVBTSE9UIgorCitub2RlX3R5cGVzOgorICB0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXI6CisgICAgYWJzdHJhY3Q6IHRydWUKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50CisgICAgZGVzY3JpcHRpb246ID4KKyAgICAgIFRoZSBUT1NDQSBXZWJTZXJ2ZXIgTm9kZSBUeXBlIHJlcHJlc2VudHMgYW4gYWJzdHJhY3Qgc29mdHdhcmUgY29tcG9uZW50IG9yIHNlcnZpY2UgdGhhdCBpcyBjYXBhYmxlIG9mIGhvc3RpbmcgYW5kIHByb3ZpZGluZyBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgZm9yIG9uZSBvciBtb3JlIFdlYkFwcGxpY2F0aW9uIG5vZGVzCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYXBwX2VuZHBvaW50OiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKKyAgICAgIHNlY3VyZV9lbmRwb2ludDogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50CisgICAgICBob3N0OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHByb3BlcnRpZXM6CisgICAgICAgICAgdmFsaWRfbm9kZV90eXBlczogWyB0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiBdCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS9vcmlnaW5hbFJlc291cmNlcy9zY3JpcHRzL2FwYWNoZV9zdGFydF9kZXRlY3Rpb24uZ3Jvb3Z5IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvc2NyaXB0cy9hcGFjaGVfc3RhcnRfZGV0ZWN0aW9uLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Q3MzJlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvc2NyaXB0cy9hcGFjaGVfc3RhcnRfZGV0ZWN0aW9uLmdyb292eQpAQCAtMCwwICsxLDYgQEAKK2ltcG9ydCBvcmcuY2xvdWRpZnlzb3VyY2UuZHNsLnV0aWxzLlNlcnZpY2VVdGlscworCitwcmludGxuICJhcGFjaGVfc3RhcnRfZGV0ZWN0aW9uLmdyb292eTogcG9ydCBodHRwPSR7UE9SVH0gLi4uIgorZGVmIGlzUG9ydE9jY3VwaWVkID0gU2VydmljZVV0aWxzLmlzUG9ydE9jY3VwaWVkKEludGVnZXIucGFyc2VJbnQoUE9SVCkpCitwcmludGxuICJhcGFjaGVfc3RhcnRfZGV0ZWN0aW9uLmdyb292eTogaXNQb3J0T2NjdXBpZWQgaHR0cD0ke1BPUlR9IC4uLiAke2lzUG9ydE9jY3VwaWVkfSIKK3JldHVybiBpc1BvcnRPY2N1cGllZApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvc2NyaXB0cy9pbnN0YWxsX2FwYWNoZS5zaCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL3NjcmlwdHMvaW5zdGFsbF9hcGFjaGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3ZjlhMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL3NjcmlwdHMvaW5zdGFsbF9hcGFjaGUuc2gKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL2Jhc2gKKworZWNobyAiVXNpbmcgYXB0LWdldC4gSW5zdGFsbGluZyBhcGFjaGUyIG9uIG9uZSBvZiB0aGUgZm9sbG93aW5nIDogRGViaWFuLCBVYnVudHUsIE1pbnQiCitMT0NLPSIvdG1wL2xvY2thcHRnZXQiCitERUZBVUxUX1BPUlQ9ODAKKword2hpbGUgdHJ1ZTsgZG8KKyAgaWYgbWtkaXIgIiR7TE9DS30iICY+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiQXBhY2hlIHRha2UgdGhlIGxvY2siCisgICAgYnJlYWs7CisgIGZpCisgIGVjaG8gIldhaXRpbmcgdGhlIGVuZCBvZiBvbmUgb2Ygb3VyIHJlY2lwZXMuLi4iCisgIHNsZWVwIDAuNQorZG9uZQorCit3aGlsZSBzdWRvIGZ1c2VyIC92YXIvbGliL2Rwa2cvbG9jayA+L2Rldi9udWxsIDI+JjEgOyBkbworICBlY2hvICJXYWl0aW5nIGZvciBvdGhlciBzb2Z0d2FyZSBtYW5hZ2VycyB0byBmaW5pc2guLi4iCisgIHNsZWVwIDAuNQorZG9uZQorCitzdWRvIHJtIC1mIC92YXIvbGliL2Rwa2cvbG9jaworc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCAoc2xlZXAgMTU7IHN1ZG8gYXB0LWdldCB1cGRhdGUgfHwgZXhpdCAkezF9KQorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgYXBhY2hlMiB8fCBleGl0ICR7MX0KK3JtIC1yZiAiJHtMT0NLfSIKKworc3VkbyAvZXRjL2luaXQuZC9hcGFjaGUyIHN0b3AKK2lmIFsgISAtZCAkRE9DX1JPT1QgXTsgdGhlbgorICBldmFsICJzdWRvIG1rZGlyIC1wICRET0NfUk9PVCIKK2ZpCitldmFsICJzdWRvIGNob3duIC1SIHd3dy1kYXRhOnd3dy1kYXRhICRET0NfUk9PVCIKKworaWYgW1sgKCIkUE9SVCIgPT0gIiRERUZBVUxUX1BPUlQiKSBdXTsgdGhlbgorICBlY2hvICJVc2UgZGVmYXVsdCBwb3J0IGZvciBBcGFjaGUgOiAkREVGQVVMVF9QT1JUIgorZWxzZQorICBlY2hvICJSZXBsYWNpbmcgcG9ydCAkREVGQVVMVF9QT1JUIHdpdGggJFBPUlQuLi4iCisgIHN1ZG8gc2VkIC1pIC1lICJzLyRERUZBVUxUX1BPUlQvJFBPUlQvZyIgL2V0Yy9hcGFjaGUyL3BvcnRzLmNvbmYgfHwgZXhpdCAkezF9CitmaQorCitlY2hvICJDaGFuZ2UgY29uZmlnIG9mIGFwYWNoZTIiCitpZiBzdWRvIHRlc3QgLWYgIi9ldGMvYXBhY2hlMi9zaXRlcy1hdmFpbGFibGUvZGVmYXVsdCI7IHRoZW4KKyAgZWNobyAiQ2hhbmdlIHRoZSBEb2N1bWVudFJvb3Qgb2YgYXBhY2hlMiBvbiBVYnVudHUgPCAxNC4wNCIKKyAgc3VkbyBzZWQgLWkgLWUgInMjRG9jdW1lbnRSb290IC92YXIvd3d3I0RvY3VtZW50Um9vdCAkRE9DX1JPT1QjZyIgL2V0Yy9hcGFjaGUyL3NpdGVzLWF2YWlsYWJsZS9kZWZhdWx0CitmaQoraWYgc3VkbyB0ZXN0IC1mICIvZXRjL2FwYWNoZTIvc2l0ZXMtYXZhaWxhYmxlLzAwMC1kZWZhdWx0LmNvbmYiOyB0aGVuCisgIGVjaG8gIkNoYW5nZSB0aGUgRG9jdW1lbnRSb290IG9mIEFwYWNoZTIgb24gVWJ1bnR1ID49IDE0LjA0IgorICBzdWRvIHNlZCAtaSAtZSAicyNEb2N1bWVudFJvb3QgL3Zhci93d3cvaHRtbCNEb2N1bWVudFJvb3QgJERPQ19ST09UI2ciIC9ldGMvYXBhY2hlMi9zaXRlcy1hdmFpbGFibGUvMDAwLWRlZmF1bHQuY29uZgorZmkKKworc3VkbyBiYXNoIC1jICJlY2hvIFNlcnZlck5hbWUgbG9jYWxob3N0ID4+IC9ldGMvYXBhY2hlMi9hcGFjaGUyLmNvbmYiCisKK2VjaG8gIlN0YXJ0IGFwYWNoZTIgd2hpdGggbmV3IGNvbmYiCitzdWRvIC9ldGMvaW5pdC5kL2FwYWNoZTIgc3RhcnQKK2VjaG8gIkVuZCBvZiAkMCIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL3NjcmlwdHMvc3RhcnRfYXBhY2hlLnNoIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvb3JpZ2luYWxSZXNvdXJjZXMvc2NyaXB0cy9zdGFydF9hcGFjaGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4YzU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL29yaWdpbmFsUmVzb3VyY2VzL3NjcmlwdHMvc3RhcnRfYXBhY2hlLnNoCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9iYXNoCisKK3NlcnZpY2U9ImFwYWNoZTIiCisKK2lmICgoICQocHMgLWVmIHwgZ3JlcCAtdiBncmVwIHwgZ3JlcCAkc2VydmljZSB8IHdjIC1sKSA+IDAgKSkKK3RoZW4KKyAgc3VkbyAvZXRjL2luaXQuZC8kc2VydmljZSByZXN0YXJ0CitlbHNlCisgIHN1ZG8gL2V0Yy9pbml0LmQvJHNlcnZpY2Ugc3RhcnQKK2ZpCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMV9Ob3JtYXRpdmVUeXBlQ0ktcm9vdC9ib2R5LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2JvZHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTMzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMV9Ob3JtYXRpdmVUeXBlQ0ktcm9vdC9ib2R5LnR4dApAQCAtMCwwICsxIEBACit7InBheWxvYWROYW1lIjoibm9ybWF0aXZlLXR5cGVzLXJvb3QuemlwIiwiaXNFbmNvZGVkIjp0cnVlLCJpc0NvbXByZXNzZWQiOnRydWUsImFydGlmYWN0TGlzdCI6W3siYXJ0aWZhY3ROYW1lIjoicm9vdC5wbmciLCJhcnRpZmFjdFR5cGUiOiJJQ09OIiwiYXJ0aWZhY3REZXNjcmlwdGlvbiI6IiIsImFydGlmYWN0UGF0aCI6ImltYWdlcy9yb290LnBuZyJ9XSwicGF5bG9hZERhdGEiOiJVRXNEQkFvQUFBQUlBRnh4YkViYitFT0I4QVVBQUJzWkFBQVlBQUFBYm05eWJXRjBhWFpsTFhSNWNHVnpMWEp2YjNRdWVXMXN0VmxMYjlzNEVMNzdWL0NZQUxXU29zZ2VmRmpBU0x2b0tWblV1UzBDZ1JiSEZsR0sxSktVWGUrdjN5R3BCMlZMdHVVaXlTRTJPVzhPWjc1aHJESVpUUmxzdU9TV0syblNIV2lESHhiRStpM0RpMUpBZXFDRlNEK25qL2k3WjQ5ZlpqTUx1RTR0cEpJV1VCUFBwZElGdFh3SGMzc293Y3kxVXJhanBKWE5sVjZRdDlmVjg1SzhQWGM3cmM3UHlTUCtPZzN6MWN2eTc5WDMxN2ZaaklISk5DK3RwM2hXMGxJdURiRTVrRllmOGZwSTUwY3ltMG5GSVBYcml4a0pCaVp1elNRLzBDeTNSZ2hkRzZ0cFp0RUJYWUZmNm1uNzB5OFI4cFp6UTNoUWlrcG9KU3k1Yzk3ZDE5NjhvR0R5aHNxUWhGcENoU0FLaVhXOTdmVVNrNnRLTUFLL0xFaG1rbGcyTXFpOS85UGpzSXJrRk4yakpNT3o0UVlaTFRGZ2lkcVFEVkJiYVNUYUtFMEtKQmRjYmdtVmpCUlUwaTBVU0Z1cnVJTmsreWtXRVIyNFo5ZndiOFcxWnpGSVNFdTY1Z0wzQWI4NWlZSnZJRHRrQWdpWEZ2U0dabUR1Z3dPV2JzMmkxc016RjdRSFhxQjY4K0RpazVSeUd5SnRyZWJyeWtKTEhQS0xzK1k3OFllNElIZ2l2R1pxaUh5T2paUEYxamRrREVvTU1zanNjTXdZTWlIMjBTZEVTNFVIQVRwZHEwcXlCWGxzbDZ1eTdKWXI2VDhBODl1eHJFYWJiblBzT3MxZFhIdnhTYnAxbjd4SmV4TEp5dUxKVUIzRmJ6QjEyeFFiT01PUUJ4RHlHb3pCQUhJcVBrWDNTcUhUTk9TSlQrdzRPUXQ2SUFiRG9yUk5XbVdaeHJTTUR1dklxc2JveUpyQTBXbUtaQ201NFZ2TThVbmlHcVpPSXJrck5jeU5wZHJlZDlMOTl5bVNQY09RbmFVeU5wMHN6bkhOaDYxMU84SGN5RnBWVGpOV2xVTzJZcG1BYWVjVE9HSlpzMW1idzRmakNudVMzWXZUcW5xeG1qNjM0a05ON2NyVmNIazlvbmVOUUx2czNXaFZKTU9tMVgwRWRHT2ZZMkNwNHpoL1VVdnRJaEZmOVIwVm5LWDlkaE5mKzE1QmE2c1Z1OVJ6bG5nR3hsZDZKVEg4cnNaam1yaFNhTnhpMjNIcW0wbHhzNzZOd0FnMS92cDRGeHNLQnBsd1ZDN3NyZnZlUmtkT295aU94T3liWktYQzR2SDdJY01WcXpJbExvU3FUZzZVbnBVTnA5SW5kZFhWc3kzb2dRaHZxREFRMXhQWDdublVKdkJuVHJhK0F1bFU2UlE1cVVBY0VtOExySXpSM2g5UFQxK2U2bjBEV2E4OEJYdldTZ21nOHRTTjJKeEtpN1NrTnI4Nld4cm1nVWgvcFphdXFZR0pCOVNRWDNkRHcxV3pMY2FwMGN3YVNHVXc0ekJCQTdEQnp3aGJRbWZCckRJbFpOaFUrSCs0em1vN0NkU2F1OVk1bG5OTGEybVd1OVkrTmVzK3lpRUpkcS8wendrK3JESXE2RnJBNzkrYmdzc1VWVktablphWjQxdlFabDJUekFYOWRUdHp2WUFDekEwU2hndXdoQXhCQnNadFNtQm1Ha1JBSkRrdmo3dFB2RGNGNTEvc1NEOGl3ZGYxcEJPT2s2N1VkQTVzOUZ2QWtrVCtHWE9hdkg4NGhyNENmOGJCZGNkM2pNM093RThZbkNDYU8zVTErZ1FzQmVQaEhjU2ppUHpTRm1TbFJsVTZHMGMvcnkwR3d3dnZNR01IejV5TmdidTkrR05Ld25uZXFpUndEeWx4S1BOR1YvcFE4N3d2ZlRXVG5EbFZNK29OWld5U2JLa3MzeHhpMHgzZ2NrQ0lOa3I4d2hyOEZNeGMxZDV4aXJ1OXRPM3BueExDU0grc3p1dVBEZHJuSEhNVVM0bFVlOVN5bzl5WC9yTzI0T2lxZHROQ1BTMGNRUUh6bGVlU0ZSOFJsQWxXQkRscGxsTzVCVGJKakZxalVRVTByZlBndW5oYk5wMWhuYTNSSk9nWmI5Slp1MzFaWjlEUkFZUitwL3JxWHl2TXF4enZoS2V0N2R6b3NBWEU5anlybjBGd1lKQW44UjRTK3gxdk1MRHJ6V2p0UHJXbFY2QXhZSWlwQW94eU5Pc2Fja1g1aTFjbTk5ckpuY2NZUWdCN2NQWUxkUUIyVDN5ZjdlWFo5VDIwbTNiZVJ4eXYwWWg1VTdlNWZvMFZEZHdlTlNKZzNldE5hSlBnR3UwZGtLN1J4Q202RkNyejBpK01KTU5qRkE1S0RwMEtrRnNjYWlMY3VPUFpPZUFSU3Mvd2tOTjM5eVVBN3h1akU5THNUSWEwYUxTT3o1V0pGYlBOS01ZVG9ZMDl4cVhOK3BrbkVhaUJ6YkltRFNqekdGWDJka2ZlT1RwbGYvRnpRMGZmcUJGUTNCQ0ZPUWtYL0d5MHowRVNLcnZkQ0ExTEFOYTlYSE9MTW94Uk9BTzZ1NzNoN20zSy9VOEJhNmNmdTFsNGZQQWI3cWxacW1aa1JBR1N1VWZ0Qi84QnRQR1BIRnp1MUU5Z1EvNnVjaEJpNVQwWWlQRVNKenpjSjJHSjNDVW05MnJESTV2N2xPTEE1MDRhTjk1bi93TlFTd01FQ2dBQUFBQUFYSEZzUmdBQUFBQUFBQUFBQUFBQUFBY0FBQUJwYldGblpYTXZVRXNEQkFvQUFBQUFBRnh4YkVZWm55TFQxeFFBQU5jVUFBQVBBQUFBYVcxaFoyVnpMM0p2YjNRdWNHNW5pVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBZVFBQUFJQUNBWUFBQUJUa3gvd0FBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBYnZRQUFHNzBCYVBCQ1h3QUFBQmwwUlZoMFUyOW1kSGRoY21VQWQzZDNMbWx1YTNOallYQmxMbTl5WjV2dVBCb0FBQlJVU1VSQlZIaWM3ZDF2aUdYM1hjZnhUeVpOcTVacXFXSW9iVVpwb0NVVVhZcUM2QU1wYUlRK3NDM2FxYXcyYmEwZ3hRZWFJRGhXOWtFQ3EzRUVNWVVpQmZzbnJYOFd2RVVFS1VMcW94UXFnbHFtVWdwQ0JhZVdObEpEVmFKdFlqbyttSHMzczd1ek0vZlBPZmQ4ei9tOVhqQlBkdStmNy9MNzNmdmVjNFo3N2gzSHg4ZGhIQzVkdlhaUGtwODh2SEw1bzBQUHd2a3VYYjMyNGlTL2Zuamw4cU5EejlLbFMxZXZ2Uy9KN3g5ZXVmenMwTE53dmt0WHIvMWlrcjg1dkhMNVMwUFB3bkoyaGg2QWxkeVo1RVB6RnhwRnpXTThTL0tXb1dmcHdWdVN6T2IvUm9xYXYwZDhLQ2Z2R1l5RUlJL1BUa1M1ckZNeGZ2UFFzL1RvelJIbHNrN0YyUHY3eUZpd2NSTGxnaHFKOFlJb0Z5VEc0MmJSeGt1VUMya3N4Z3VpWElnWWo1K0ZHemRSTHFEUkdDK0ljZ0ZpUEEwV2IveEVlVUNOeDNoQmxBY2t4dE5oQWFkQmxBY2d4amNRNVFHSThiUll4T2xZUlBuZFF3L1NBakUra3lodjBmeTFMc1lUWWlHblpTZkpoMFc1WDJKOExsSGVndmxyL01QeEhqNHBGbk42UkxsSFlyd1VVZTZSR0UrWEJaMG1VZTZCR0s5RWxIc2d4dE5tVWFkTGxEc2t4bXNSNVE2SjhmUloyR2tUNVE2SThVWkV1UU5pM0FhTE8zMml2QUV4N29Rb2IwQ00yMkdCMjdDSThydUdIbVJNeExoVG9yeUcrV3RXakJ0aGtkdXhrK1Fqb3J3Y01lNkZLSzlnL2xyOVNMeFBOOE5DdDBXVWx5REd2UkxsSlloeG15eDJlMFQ1SEdLOEZhSjhEakZ1bHdWdmt5aWZRWXkzU3BUUElNWnRzK2p0RXVWVHhIZ1FvbnlLR0dQaDJ5YktFZU9CaVhMRW1CTVduNmFqTE1ZbE5CMWxNV2JCQmlCNUljcnZISHFRYlJMalVwcU04dncxSjhZa3NRbDR3VTZTajdZU1pURXVxYWtvejE5ckg0MzNZZVpzQkU1cklzcGlYRm9UVVJaanptSXpjTE5KUjFtTVIySFNVUlpqYnNlRzRDeVRqTElZajhva295ekduTWVtNEhZbUZXVXhIcVZKUlZtTXVZaU53WGttRVdVeEhyVkpSRm1NV1liTndVVkdIV1V4bm9SUlIxbU1XWllOd2pJV1VYNWc2RUZXSWNhVE1zb296MTh6WXN4U2JCS1d0WlBrOGJGRVdZd25hVlJSbnI5V0hvLzNXWlprbzdDS1VVUlpqQ2R0RkZFV1k5WmhzN0NxMGxFVzR5YVVqcklZc3k0YmhuV1VqTElZTjZWa2xNV1lUZGcwckt0VWxNVzRTYVdpTE1ac3lzWmhFeVdpTE1aTkt4RmxNYVlMTmcrYkdqVEtZa3dHanJJWTB4VWJpQzRzb3Z5T2JUNnBHSFBLSUZHZTcvbkg0NzJVRHRoRWRHVW55Y2UyRldVeDVneGJqZko4cjM4czNrZnBpSTFFbDdZU1pUSG1IRnVKc2hqVEI1dUpydlVhWlRGbUNiMUdXWXpwaXcxRkgzcUpzaGl6Z2w2aUxNYjB5YWFpTDUxR1dZeFpRNmRSRm1QNlptUFJwMDZpTE1ac29KTW9pekhiWUhQUnQ0MmlMTVowWUtNb2l6SGJZb094RFlzby84SXFkeEpqT3JSV2xPZDdWb3paQ3B1TWJkbEo4dkZsb3l6RzlHQ2xLTS8zNnNmamZaSXRzZEhZcHFXT2xNV1lIaTBWWlVmR0RNRm1ZOXZ1ekRsUkZtTzI0TndvbjRyeG5WdWRpdVlKTWtNNE04cGl6QmFkR1dVeFpraUN6RkJ1aUxJWU00QWJvaXpHRE8xRlF3OUEweFpSZm5HU3QwYU0yYjVGbFA4eXlSOUZqQm1RSURPME81TjhaT2doYU5xYjR6K0RGT0NVTlFBVUlNZ0FVSUFnQTBBQmdnd0FCUWd5QUJRZ3lBQlFnQ0FEUUFHQ0RBQUZDRElBRkNESUFGQ0FJQU5BQVlJTUFBVUlNZ0FVSU1nQVVJQWdBMEFCZ2d3QUJRZ3lBQlFneUFCUWdDQURRQUdDREFBRkNESUFGQ0RJQUZDQUlBTkFBWUlNQUFVSU1nQVVJTWdBVUlBZ0EwQUJnZ3dBQlFneUFCUWd5QUJRZ0NBRFFBR0NEQUFGQ0RJQUZDRElBRkNBSUFOQUFZSU1BQVVJTWdBVUlNZ0FVSUFnQTBBQmdnd0FCUWd5QUJRZ3lBQlFnQ0FEUUFHQ0RBQUZDRElBRkNESUFGQ0FJQU5BQVlJTUFBVUlNZ0FVSU1nQVVJQWdBMEFCZ2d3QUJRZ3lBQlFneUFCUWdDQURRQUdDREFBRkNESUFGQ0RJQUZDQUlBTkFBWUlNQUFVSU1nQVVJTWdBVUlBZ0EwQUJMeHA2QUZieWxTUS9PdlFRTE8yL2h4NmdCNytVNUdWREQ4SFN2akwwQUN6dmp1UGo0NkZuQUlEbU9XVU5BQVVJTWdBVUlNZ0FVSUFnQTBBQmdnd0FCZlQrc2FmZHZmMXZUM0xQcVo5WEpibXI3K2NGZ0EwOGwrVExTYjYwK0RtYUhmeHZuMC9ZK2NlZWR2ZjJYNTdrWjVKY1R2S0dKTi9kNlJNQXdERCtJOGxuazF4TDhoZEhzNE92ZC9uZ25RUjVmaFQ4MDBsK1BzbWJrcng0NHdjRmdMcWVUZkxYU2Y0c3lWOTFjZlM4VVpCMzkvYnZ5TW1WZXc2U3ZHTFRZUUJnaEo1T3NwL2t3MGV6ZzdXanVuYVFkL2YyZnlESkI1UDgyTHBQRGdBVDhwa2s3ejJhSGZ6VE9uZGVPY2k3ZS9zdlRmSndrZ2ZqV3RnQWNOci9KWGtzeWNOSHM0Tm5Wcm5qU2tIZTNkdC9aWkpQSlhuOVN1TUJRRnMrbitUK285bkIwbC93c2ZUbmtIZjM5cjgveWFjanhnQndrZGNuK2ZTOG5VdFpLc2k3ZS91dnkwbU03MTF2TGdCb3pyMDVpZkxybHJueGhVSGUzZHUvbE9USkpLL2VjREFBYU0ycmt6dzViK201enYwZDh1N2UvdmNtK1Z5U3U3dWJEUUNhODFTU0h6eWFIZno3N1c1dzJ5UGsrV2VNSDQ4WUE4Q203azd5K0x5dFp6cnZsUFd2NXVTcVd3REE1dDZVazdhZTZjeFQxdk56M1grWDVDWDl6UVVBemZsbWtoODVtaDBjM3Z3WHR3UjVmbDNxZjBoeTMzWm1BNENtZkNISkQ5MTgvZXV6VGxuL2NzUVlBUHB5WDA1YWU0TWJqcEIzOS9idlN2SXY4UkVuQU9qVHZ5VjV6ZEhzNExuRkg5eDhoUHhBeEJnQSt2YnFuRFQzdXV0SHlMdDcrenM1T2EvOTJ1M1BCUUROK2Vjazl4M05EcjZWM0hpRS9MTVJZd0RZbHRmbXBMMUpiZ3p5cjIxL0ZnQm8ydlgyM25GOGZKemR2ZjJYSi9sYWtqdUhtd2tBbXZOOGt1ODVtaDE4ZlhHRS9CTVJZd0RZdGp0ejB1RHJwNnp2SDI0V0FHamEvWWtnQThEUTdrK1NPKzU1MjIrOEpza1hCeDRHQUZwMjcwNlNOdzQ5QlFBMDdvMDdTZTRaZWdvQWFOdzlPem41MG1RQVlEaDNDeklBREUrUUFhQUFRUWFBQWdRWkFBcTRleWZKeTRhZUFnQWE5N0tkaTI4REFQUk5rQUdnQUVFR2dBSUVHUUFLRUdRQUtFQ1FBYUFBUVFhQUFnUVpBQW9RWkFBb1FKQUJvQUJCQm9BQ0JCa0FDaEJrQUNoQWtBR2dBRUVHZ0FJRUdRQUtFR1FBS0VDUUFhQUFRUWFBQWdRWkFBb1FaQUFvUUpBQm9BQkJCb0FDQkJrQUNoQmtBQ2hBa0FHZ0FFRUdnQUlFR1FBS0VHUUFLRUNRQWFBQVFRYUFBZ1FaQUFvUVpBQW9RSkFCb0FCQkJvQUNCQmtBQ2hCa0FDaEFrQUdnQUVFR2dBSUVHUUFLRUdRQUtFQ1FBYUFBUVFhQUFnUVpBQW9RWkFBb1FKQUJvQUJCQm9BQ0JCa0FDaEJrQUNoQWtBR2dBRUVHZ0FJRUdRQUtFR1FBS0VDUUFhQUFRUWFBQWdRWkFBb1FaQUFvUUpBQm9BQkJCb0FDQkJrQUNoQmtBQ2hBa0FHZ0FFRUdnQUlFR1FBS0VHUUFLRUNRQWFBQVFRYUFBZ1FaQUFvUVpBQW9RSkFCb0FCQkJvQUNCQmtBQ2hCa0FDaEFrQUdnQUVFR2dBSUVHUUFLRUdRQUtFQ1FBYUFBUVFhQUFnUVpBQW9RWkFBb1FKQUJvQUJCQm9BQ0JCa0FDaEJrQUNoQWtBR2dBRUVHZ0FJRUdRQUtFR1FBS0VDUUFhQUFRUWFBQWdRWkFBb1FaQUFvUUpBQm9BQkJCb0FDQkJrQUNoQmtBQ2hBa0FHZ0FFRUdnQUlFR1FBS0VHUUFLRUNRQWFBQVFRYUFBZ1FaQUFvUVpBQW9RSkFCb0FCQkJvQUNCQmtBQ2hCa0FDaEFrQUdnQUVFR2dBSUVHUUFLRUdRQUtFQ1FBYUFBUVFhQUFnUVpBQW9RWkFBb1FKQUJvQUJCQm9BQ0JCa0FDaEJrQUNoQWtBR2dBRUVHZ0FJRUdRQUtFR1FBS0VDUUFhQUFRUWFBQWdRWkFBb1FaQUFvUUpBQm9BQkJCb0FDQkJrQUNoQmtBQ2hBa0FHZ0FFRUdnQUlFR1FBS0VHUUFLRUNRQWFBQVFRYUFBZ1FaQUFvUVpBQW9RSkFCb0FCQkJvQUNCQmtBQ2hCa0FDaEFrQUdnQUVFR2dBSUVHUUFLRUdRQUtFQ1FBYUFBUVFhQUFnUVpBQW9RWkFBb1FKQUJvQUJCQm9BQ0JCa0FDaEJrQUNoQWtBR2dBRUVHZ0FJRUdRQUtFR1FBS0VDUUFhQUFRUWFBQWdRWkFBb1FaQUFvUUpBQm9BQkJCb0FDQkJrQUNoQmtBQ2hBa0FHZ0FFRUdnQUlFR1FBS0VHUUFLRUNRQWFBQVFRYUFBZ1FaQUFvUVpBQW9RSkFCb0FCQkJvQUNCQmtBQ2hCa0FDaEFrQUdnQUVFR2dBSUVHUUFLRUdRQUtFQ1FBYUFBUVFhQUFnUVpBQW9RWkFBb1FKQUJvQUJCQm9BQ0JCa0FDaEJrQUNoQWtBR2dBRUVHZ0FJRUdRQUsyRW55L05CREFFRGpudDlKOHJXaHB3Q0F4bjF0SjhsVFEwOEJBSTE3U3BBQllIaUNEQUFGQ0RJQUZQRFVUcEt2RGowRkFEVHVxenRKUGovMEZBRFF1TS92SkhreXliTkRUd0lBalhvMnlaTTdSN09EWjVKOFp1aHBBS0JSbnptYUhUeXp1SFRtcHdZZEJRRGE5YW5raFd0WlB6SGdJQURRc2llU0Y0TDhqMG1lSG00V0FHalMwemxwOEVtUWoyWUgzMHJ5aVNFbkFvQUdmV0xlNEJ1K2Z2SDM0cHVmQUdCYm5zOUplNU9jQ3ZMUjdPQ0xTV1pEVEFRQURack4yNXZreGlQa0pIbDB5OE1BUUt0dWFPNE5RVDZhSFh3dXlTZTNPZzRBdE9lVDgrWmVkL01SY3BMOGRwTGo3Y3dEQU0wNXprbHJiM0JMa0k5bUIzK2I1UDNibUFnQUd2VCtlV3R2Y05ZUmNwTDhacExEZnVjQmdPWWM1cVN4dDdqaitQanNzOU83ZS92M0pmbjdKTi9SMzF3QTBJei9TZkxEUjdPREw1ejFsN2M3UXM3OERnLzFOUlVBTk9haDI4VTRPZWNJZVdGM2IvOVBrdnhDMTFNQlFFUCs5R2gyOEk3emJuRGJJK1JUM3BYazhVN0dBWUQyUEo2VGxwN3J3aUFmelE2ZVQvS2VKQi9ZZkNZQWFNb0hrcnhuM3RKelhYaksrclRkdmYzZlNmSytEUVlEZ0ZZOGVqUTcrSzFsYjd4U2tKTmtkMi8vd1p4Yzd1dmJWaHdNQUZyd2pTVHZPNW9kUExiS25WWU9jcExzN3UzZm0rUVBrL3pVeW5jR2dPbDZJc212blA3U2lHV3RGZVNGM2IzOXR5ZDVMTWtyMTM0UUFCaS9yeVI1OEdoMjhPZnJQc0JHUVU2UzNiMzk3OHpKNzVVZlNQS3FqUjRNQU1ibHkwbitPQ2UvTC82dlRSNW80eUF2N083dDd5VDU4U1NYazd3dHlTczZlV0FBcU9YcEpKOUljaTNKazBlemcyOTE4YUNkQmZtMDNiMzl1M0x5KytVM0pMbm5wcC92NnZ3SkFhQjcvNW5rU3pmOWZEYkpFMGV6ZytlNmZySmVnbnllM2IzOWx5YTVhNnRQQ2dDcmVlNW9kdkRNTnA5dzYwRUdBRzYxektVekFZQ2VDVElBRkNESUFGQ0FJQU5BQVlJTUFBVzhhT2dCTG5McDZyVVBKbm41MEhPd3RBY09yMXp1L1BONVhibDA5ZHJIazd4NDZEbFl5ck9IVnk2L2MrZ2hidWZTMVd0MzVlUUtUWXpEMXcrdlhIN3YwRU9jcDN5UWs3dzF5ZDFERDhIUzNwMmtiSkNUdkQzSlM0WWVncVY4TTBuWklDZTVNOG5QRFQwRVMzc3FTZWtnTzJVTkFBVUlNZ0FVSU1nQVVJQWdBMEFCZ2d3QUJRZ3lBQlFneUFCUWdDQURRQUdDREFBRkNESUFGQ0RJQUZDQUlBTkFBWUlNQUFVSU1nQVVJTWdBVUlBZ0EwQUJnZ3dBQlFneUFCUWd5QUJRZ0NBRFFBR0NEQUFGQ0RJQUZDRElBRkNBSUFOQUFZSU1BQVVJTWdBVUlNZ0FVSUFnQTBBQmdnd0FCUWd5QUJRZ3lBQlFnQ0FEUUFHQ0RBQUZDRElBRkNESUFGQ0FJQU5BQVlJTUFBVUlNZ0FVSU1nQVVJQWdBMEFCZ2d3QUJRZ3lBQlFneUFCUWdDQURRQUdDREFBRkNESUFGQ0RJQUZDQUlBTkFBWUlNQUFVSU1nQVVJTWdBVUlBZ0EwQUJnZ3dBQlFneUFCUWd5QUJRZ0NBRFFBR0NEQUFGQ0RJQUZDRElBRkNBSUFOQUFZSU1BQVdNSWNpL08vUUFMTzJ4d3l1WHZ6SDBFQmQ0ZE9nQldGcnB0WnJ2OWNlR25vT2xsVzlKK1NBZlhybjhXSktIaHA2REN6MTJlT1Z5K1hVNnZITDVrU1NQREQwSEYzcGt2bGFsemZlOEtOZjMwTHdscFpVUGNpTEtJekNLR0M4Y1hybjhjRVM1c2tmbWF6UUtvbHplS0dLY2pDVElpU2dYTnFvWUw0aHlXYU9LOFlJb2x6V2FHQ2NqQ25JaXlnV05Nc1lMb2x6T0tHTzhJTXJsakNyR3ljaUNuSWh5SWFPTzhZSW9sekhxR0MrSWNobWppM0V5d2lBbm9sekFKR0s4SU1xRG0wU01GMFI1Y0tPTWNUTFNJQ2VpUEtCSnhYaEJsQWN6cVJndmlQSmdSaHZqWk1SQlRrUjVBSk9NOFlJb2I5MGtZN3dneWxzMzZoZ25Jdzl5SXNwYk5Pa1lMNGp5MWt3NnhndWl2RFdqajNFeWdTQW5vcndGVGNSNFFaUjcxMFNNRjBTNWQ1T0ljVEtSSUNlaTNLT21ZcndneXIxcEtzWUxvdHlieWNRNG1WQ1FFMUh1UVpNeFhoRGx6alVaNHdWUjd0eWtZcHhNTE1pSktIZW82Umd2aUhKbm1vN3hnaWgzWm5JeFRpWVk1RVNVT3lER3A0anl4c1Q0RkZIZTJDUmpuRXcweUlrb2IwQ016eURLYXhQak00ankyaVliNDJUQ1FVNUVlUTFpZkE1Ulhwa1luME9VVnpicEdDY1REM0lpeWlzUTR5V0k4dExFZUFtaXZMVEp4emhwSU1pSktDOUJqRmNneWhjUzR4V0k4b1dhaUhIU1NKQVRVVDZIR0s5QmxHOUxqTmNneXJmVlRJeVRob0tjaVBJWnhIZ0RvbndMTWQ2QUtOK2lxUmdualFVNUVlVlR4TGdEb255ZEdIZEFsSzlyTHNaSmcwRk9SRGxpM0NsUkZ1TXVpWEtiTVU0YURYTFNkSlRGdUFjTlIxbU1lOUJ3bEp1TmNkSndrSk1tb3l6R1BXb3d5bUxjb3dhajNIU01rOGFEbkRRVlpUSGVnb2FpTE1aYjBGQ1VtNDl4SXNoSm1vaXlHRzlSQTFFVzR5MXFJTXBpUENmSWN4T09zaGdQWU1KUkZ1TUJURGpLWW55S0lKOHl3U2lMOFlBbUdHVXhIdEFFb3l6R054SGttMHdveW1KY3dJU2lMTVlGVENqS1lud0dRVDdEQktJc3hvVk1JTXBpWE1nRW9pekd0eUhJdHpIaUtJdHhRU09Pc2hnWE5PSW9pL0U1QlBrY0k0eXlHQmMyd2lpTGNXRWpqTElZWDBDUUx6Q2lLSXZ4Q0l3b3ltSThBaU9Lc2hndlFaQ1hNSUlvaS9HSWpDREtZandpSTRpeUdDOUprSmRVT01waVBFS0ZveXpHSTFRNHltSzhBa0ZlUWNFb2kvR0lGWXl5R0k5WXdTaUw4WW9FZVVXRm9pekdFMUFveW1JOEFZV2lMTVpyRU9RMUZJaXlHRTlJZ1NpTDhZUVVpTElZcjBtUTF6UmdsTVY0Z2dhTXNoaFAwSUJSRnVNTkNQSUdCb2l5R0UvWUFGRVc0d2tiSU1waXZDRkIzdEFXb3l6R0RkaGlsTVc0QVZ1TXNoaDNRSkE3c0lVb2kzRkR0aEJsTVc3SUZxSXN4aDBSNUk3MEdHVXhibENQVVJiakJ2VVlaVEh1a0NCM3FJY29pM0hEZW9peUdEZXNoeWlMY2NjRXVXTWRSbG1NNlRMS1lreVhVUmJqSGdoeUR6cUlzaGh6WFFkUkZtT3U2eURLWXR3VFFlN0pCbEVXWTI2eFFaVEZtRnRzRUdVeDdwRWc5MmlOS0lzeHQ3VkdsTVdZMjFvanltTGNNMEh1MlFwUkZtTXV0RUtVeFpnTHJSQmxNZDRDUWQ2Q0phSXN4aXh0aVNpTE1VdGJJc3BpdkNXQ3ZDWG5SRm1NV2RrNVVSWmpWblpPbE1WNGl3UjVpODZJc2hpenRqT2lMTWFzN1l3b2kvR1czWEY4ZkR6MERNMjVkUFhhZzBtK1Q0enB3cVdyMXg1T3JnY2FObkxwNnJVL1NQS3ZZcng5L3cvQ3VzVjR0MVk5aUFBQUFBQkpSVTVFcmtKZ2dsQkxBUUlVQUFvQUFBQUlBRnh4YkViYitFT0I4QVVBQUJzWkFBQVlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQnViM0p0WVhScGRtVXRkSGx3WlhNdGNtOXZkQzU1Yld4UVN3RUNGQUFLQUFBQUFBQmNjV3hHQUFBQUFBQUFBQUFBQUFBQUJ3QUFBQUFBQUFBQUFCQUFBQUFtQmdBQWFXMWhaMlZ6TDFCTEFRSVVBQW9BQUFBQUFGeHhiRVlabnlMVDF4UUFBTmNVQUFBUEFBQUFBQUFBQUFBQUFBQUFBRXNHQUFCcGJXRm5aWE12Y205dmRDNXdibWRRU3dVR0FBQUFBQU1BQXdDNEFBQUFUeHNBQUFBQSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDFfTm9ybWF0aXZlVHlwZUNJLXJvb3QvY29tbWFuZCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhNWIzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2NvbW1hbmQKQEAgLTAsMCArMSwxNSBAQAoraGVhZGVycz1gcGFzdGUgLXMgLWQiICIgaGVhZGVyc2AKKworY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMS9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiAke2hlYWRlcnN9IC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgICIKKworZWNobyAkY29tbWFuZCA+IHRvRXhlYworY2htb2QgK3ggdG9FeGVjCisuL3RvRXhlYworCisKKyMkY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMV9Ob3JtYXRpdmVUeXBlQ0ktcm9vdC9jb21tYW5kVHJpYWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMV9Ob3JtYXRpdmVUeXBlQ0ktcm9vdC9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2NvbW1hbmRUcmlhbApAQCAtMCwwICsxLDEyIEBACitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiIgorY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCitjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2NvbnRlbnRNRDUudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDFfTm9ybWF0aXZlVHlwZUNJLXJvb3QvY29udGVudE1ENS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlNzViMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK1ltRXpZV0V3WldOallqazNOMkV5WkRCaFlUYzVNMk0wTmpreU0yWTVPVEU9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDFfTm9ybWF0aXZlVHlwZUNJLXJvb3QvaGVhZGVycyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2hlYWRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZGIwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMV9Ob3JtYXRpdmVUeXBlQ0ktcm9vdC9yZXN1bHRzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDFfTm9ybWF0aXZlVHlwZUNJLXJvb3QvcmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNlNWZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDFfTm9ybWF0aXZlVHlwZUNJLXJvb3QvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDQ6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L3RvRXhlYyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAxX05vcm1hdGl2ZVR5cGVDSS1yb290L3RvRXhlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUyNmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDFfTm9ybWF0aXZlVHlwZUNJLXJvb3QvdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLVhQT1NUICJodHRwOi8vMTcyLjIwLjQzLjEyMTo4MDgwL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcbiIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2JvZHkudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDJfTm9ybWF0aXZlVHlwZUNJLWNvbXB1dGUvYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5N2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2JvZHkudHh0CkBAIC0wLDAgKzEgQEAKK3sicGF5bG9hZE5hbWUiOiJub3JtYXRpdmUtdHlwZXMtY29tcHV0ZS56aXAiLCJpc0VuY29kZWQiOnRydWUsImlzQ29tcHJlc3NlZCI6dHJ1ZSwiYXJ0aWZhY3RMaXN0IjpbeyJhcnRpZmFjdE5hbWUiOiJjb21wdXRlLnBuZyIsImFydGlmYWN0VHlwZSI6IklDT04iLCJhcnRpZmFjdERlc2NyaXB0aW9uIjoiIiwiYXJ0aWZhY3RQYXRoIjoiaW1hZ2VzL2NvbXB1dGUucG5nIn1dLCJwYXlsb2FkRGF0YSI6IlVFc0RCQW9BQUFBSUFKaGRiRVloZ1RrSUJnUUFBRlVMQUFBYkFBQUFibTl5YldGMGFYWmxMWFI1Y0dWekxXTnZiWEIxZEdVdWVXMXN6VmJiYmhzM0VIM1hWd3pjRnh1d0ZLY3Bna0lQQVZ3QlRmTVEyNGpjcHlCWVVMdmNGWkZkY3N1TGxNMVRQaVA5dlh4SnozQXZvaHdsU05zVXFHVFlhM0oyemptYzRjeDQ0M0tSRmJKVVdubGx0TXQyMGpvOExNbkhMYWVhdHBaWko1bzZlNXhkNGJzdnJwN01abDVpWFhpWmFkSEl3WGl1alcyRVZ6czU5MTByM1R3M1RSdThQQmlMNExmR0x1bitkcjI2cHZ2VllXZUNmYnk0d3BkQjV1dWI2N3YxYjdmM3Mxa2hYVzVWNjZQRnltZ3ZsSGJrdDVJbVNJcVFkSkN5bUlHNnNkNHRaMFJ6T2p0TjBScmpseWN3ejJZemJRcVpSU3YyOEFPOTBLVVZ6dHVRKzJBbHNUaWpwZllPdTlINWd0OXdpMVd2bWw4aThMRUFLN0xTbW1aNVpQWUt5SU5KSXU1WlhDSjZKVnNySFhzblFWYUttb3lsbmJJKzRMRVIrVlpweVV1ZlBueDAwdUwwUG4zNGM4RVVlMzJJSkxsVzVxcFVzaUNqNDFrTnhBWUVaa0Y3VmRlMGtSUWN6THdoSEY0UmJVY0l2eFVlcTc0LzdRcGFOT2o4RVpTVlRXU25ldDk1YlVJeGVCWTdvV3F4cVNjdkRzeEtBSkpUNzVXdThFNUNVK0FzRDFRblg5RGpxTFZtcDNDRUhGWVJhajhBak9SUzlvRHdwS0RhVzZPcnVnTkxSQWdjaTE1WkQ5RkZnRUZBUVhrYlFBQ1NHOWtZMjQzOFBkVVNrVjdFLzcybzNITFlVVG5INkpGcVJDWGRveUc5RjYydTRqN1l0dEo2SlNkN0hacU1NY2IvS1dicEVnZmdaU1h0dERvU1dsSXBhaWVuZGNCQkQ1TGRKeTQ0bTZsQ1RuaHBNOFFIaks2bXphTmt1Z25OQm9kblNqb1hlY3ljUXhKZDBPcnVkNGgzenVRS3JncWNwdCttZVJJelpERWV1V3hRQzk3TDc2N2ttNFNzZ2N3eStqQmRjdEs5bEpYWWRCNVgvdnpsTHhlWFNkSWgyS0p0YTVVUENXYUQxcHgxeDdmZ1NGMmgzTnYvZ1R5bVY1c2NjV0pDVWVaek5jbDgvcTlsR3BjSm0yOGZpZ1J6TmFUd1Y3WHNSSzJLREw4RE1weGVuNzM3K1duMjVNZXpTNHBQVDM4NmUzTmEzajNvYkkzemRJdnJBYllndWU0Y1NqK2QzNjR2aUNrcEwyTlZUWmhHYnQrSmFhMTBlTWRFaFlwL1VFQUF3VTk3RkR5emQvK1FPck5LS0NOcUlMZ0o4ZDJ2VS85U0l2MGQ5QlF1WVRHMjB2K1V3QURTd3dyZjh6Z1VQdFZtb2lqUXdUNHJmUTlvbkd4Ky9HSG8xcUxTMm81ZTNOSGdqZXVWcWpTcTFhWTc5SXBEbjRqdDZ1aGFOS0xqL2hDdlM1NnppeS9kRHY3Y0dEUnVZS09SNENkMnhRR0l4eFR1V2dtVzRRVGN5V0YvNERvU0hUdHFBcHFub0VTL2hqaEg3STE5eXdkYldGR2luOGFlTmpxSnd4ZjMyVUZNbE9kQ3kzTU5sYlhwUTRLaTNxQTVLdGdtUjRXdU8wc0NIYnYxMUpla1o5aUhzZW5IazF5MFlxTnF4WTBNdzR6V3VKcHFwM3czV2RkbWo1SzJNVUVYYVUwRHI4TnkwUEZCOWtOQjZuTkU1Y1Q2TmdZODdpVkYrUE0reTUvK3ppZERHNzFPeDYyMUtmMGVzOFpxSE52R0c0L2t4VGh4RXZvNmJ2SEpEYmF3aU1YM3BQVjYySno5QlZCTEF3UUtBQUFBQUFDWVhXeEdBQUFBQUFBQUFBQUFBQUFBQndBQUFHbHRZV2RsY3k5UVN3TUVDZ0FBQUFBQW1GMXNScWFJLzNpaDd3QUFvZThBQUJJQUFBQnBiV0ZuWlhNdlkyOXRjSFYwWlM1d2JtZUpVRTVIRFFvYUNnQUFBQTFKU0VSU0FBQUNBQUFBQWdBSUJnQUFBUFI0MVBvQUFBQUVjMEpKVkFnSUNBaDhDR1NJQUFBQUNYQklXWE1BQUJyV0FBQWExZ0VyZjI0cEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCM2QzY3VhVzVyYzJOaGNHVXViM0pubSs0OEdnQUFBQ04wUlZoMFZHbDBiR1VBUTFCVklDaERaVzUwY21Gc0lGQnliMk5sYzNOcGJtY2dWVzVwZENsU29VelNBQUFBQzNSRldIUkJkWFJvYjNJQWFYWmhhOGdMQkp3QUFBQnRkRVZZZEVSbGMyTnlhWEIwYVc5dUFHTm9hWEFzSUdOc2FYQWdZWEowTENCamJHbHdZWEowTENCamIyMXdkWFJsY2l3Z1kzQjFMQ0JsYkdWamRISnZibWxqY3l3Z2JXbGpjbTlqYjI1MGNtOXNiR1Z5TENCdGFXTnliM0J5YjJObGMzTnZjaXdnY0hKdlkyVnpjMjl5TENDUkpxTDlBQUFBSVhSRldIUkRjbVZoZEdsdmJpQlVhVzFsQURJd01UQXRNVEl0TVRCVU1UQTZORFU2TkRhREQ4cGVBQUFBV0hSRldIUlRiM1Z5WTJVQWFIUjBjRG92TDI5d1pXNWpiR2x3WVhKMExtOXlaeTlrWlhSaGFXd3ZNVEF3TWpZM0wyTndkUzBvWTJWdWRISmhiQzF3Y205alpYTnphVzVuTFhWdWFYUXBMV0o1TFdsMllXc3RNVEF3TWpZM0xtL3dHQUFBQUVsMFJWaDBRMjl3ZVhKcFoyaDBBRkIxWW14cFl5QkViMjFoYVc0Z2FIUjBjRG92TDJOeVpXRjBhWFpsWTI5dGJXOXVjeTV2Y21jdmJHbGpaVzV6WlhNdmNIVmliR2xqWkc5dFlXbHVMMW5EL3NvQUFDQUFTVVJCVkhpYzdMMTN2R1JIZGUvN3ErNlR6K1RSakNZSXpZdzBJMm1VTlVwSVJrSklJT0RLTnRtSVpENDRYdUJodjJzYmY1eHRISzc5SWQwTG1HQmp6QVdERGZjWmpFMFFJSVFrQkJxQmhFQkNZYVRKU1pQenlkMjk2LzJ4VStWZFZYdDNuOUMxNWpPbmQ2aTFWbFgxN3ZxdVdqc1JTaW5hTFlRUTBuWW5RWUxNUXFHZCtBRUdDUklraUVLSXkvaHozVHV2N2lXRXZCSUFBVUMxLzNPVEZBQ2xKUDRrSnAxWWo5V25JUGsrQWhMYnlzcFRWaGNtdTZrdUFFcHFKRkw2Wlh5eFBqSmRxdkZGNG4yVXJWTlNsbEJDS1dpMkhpL1J1Q3lsbEVieC82aEZhZFNLYUd1cVJSdmpEVHArYklMdTJidzNnQ0ZJa0NDelNrSkFPN3ZFT2dCSTRQOS9BYnpTelVQNjRaZ0VJT3lpZ3k0UlZ5MTBOVVVLZFEyN3RicUZKcFVGdUFCRjk1OE5kTUFHS0VXQlYrelhSMC8yVzZ3SFNkZXlqaDU2VUcwblJORlBZaENxNlVkbEg1dUNVRVVRVy9oZkVZd1NqUitidmkvMHE5ZFR0MG1qUTdObGF2YXA5Z2ZHcjUyZTRydXlQSTdWeHdVVDdOTk1qNnJySXRTQlBSNHBRRUdwMmhjN1dhQ3hIcnVlVFJLeXoyU1NFRkVhTlNNYU5WdTBPZG1pazZPVGRPVHdDSDNtdTF0VEgwSG1pSFF5aUxJS0FLNTc1OVU5aEpBdkFuaTFtL1gwSThDL1NLZU1ubGJYc3VzSTMrRk9VbHJYNCtTUXJ4NEFlSjJONnVSeHJQd2FPMzhjRy9WOGorTXl1ajYvQWFlaFkzWWR4MHFKMDQxMlFhYkxmeWJRU3V5alhmWVpIOFpnemRlMndZK2ZMNE45alE4S2ltM2YvTXU3UDZEOUhoWFNycUNnTUFDNDdwMVgxd2toL3diZ2RXNlcwNDhBL3lLZE1ucGEzUUIvV1RmQXY3eGVnTCtzT3pQZ0QvYmNhNVYyODhYMjJxL2NoOEZVSlg0S1RKaDhVRXJmL2EyLy9NNEgzYTFtK3BWMGxERUFTT0QvT1FCM3VsbE5Qd0w4aTNUSzZHbDFBL3hsM1FELzhub0Ivckp1Z0g4bDlpdjNNWVBobnhhSld0R2QzLzdyZTc1a1lWVnJyR3dnVURQdEpJVDhBUUw4Qy9XTXVnSCtzbTZBdjFiSFNYYzJ3SitVMUMyUUFQOEEveUxibGZzcEQzOEFJTFY2N1RNdi9zTmJiMFQrSzFIOWgySTlONUtJYmRWRk1RWUFBSlk3V1F2d3Q5WXBvNmZWRGZDWGRRUDh5K3QxK2pqMjFRM3dyOHh1dmhqZ2IydmZ3OGRBVDEvOXk5ZTg2YXI1aUkrTVd2TGZKaGpneERjSTZDbllid3dRVml4Y2lBdFhyTXlyQlk5QnMwRDJuemlCN1VjT3l6c0MvSjMxSk4wQWY1WEQzSytIbnBOdWdIOTF1Z0grbGRuTkZ3UDhiZTJYOEhGVzcyRGZmQUJqakJmQ2VHT1hJWlRoYWtVSUlhNm5CRW9GQU9jdVhZcFhiYnJheForemZPL1paK1FBSU1EZldVL1NEZkJYT2N6OWV1ZzU2UWI0VjZjYjRGK1ozWHd4d04vV2Zpa2ZGR2hPTm51UXM1WnFQblcxNGdJRTF5Q2dLQUNvZGpwZmhRVDRPK3RKdWdIK0tvZTVYdzg5SjkwQS8rcDBBL3dyczVzdkJ2amIyaS9sSTFHTG1sRWRRQjA4OUZXM0pSSmhPMUZzZHdvQ1NtVUFPaTRCL3M1NmttNkF2OHBoN3RkRHowazN3TDg2M1FEL3l1em1pd0grdHZaTCtXRFVrZ3lBS2dCUS9kZFo4d29DL0FPQVR1Y0dBdnlkOVNUZEFIK1Z3OXl2aDU2VGJvQi9kYm9CL3BYWnpSY0QvRzN0bC9JaHFMVWFyVjdFTE5aQlgzNTh2UndRZUFVQmZxY0FmQWROWHdud2Q5YVRkQVA4VlE1enZ4NTZUcm9CL3RYcEJ2aFhaamRmRFBDM3RWL0toMEl0YWtZOVVBY0FLZmlKc0I0WnJITkJRSkc0WndBQy9LMTF5dWhwZFFQOFpkMEEvL0o2QWY2eWJvQi9KZllyOXpHSDRBOEFyVWFyRDBBdlpQQkh5WCtDSFBxcEZhc2dvQ2dMNEpZQjZEVDhCUW53TDlhVGRBUDhWUTV6dng1NlRyb0IvdFhwQnZoWFpqZGZEUEMzdFYvS2gwR3QxWWo2QVBSQkJqLzd2d1UrRUlDd25IcHd5Z0Jvei9FbkR4Ykk5d2Y0Vyt1VTBkUHFCdmpMdWdIKzVmVUMvR1hkQVA5SzdGZnVZdzdDSHdDaVpoWUFwSmtBOW45NmdXRDZXVWYrd0NEVlE0TlNzVG9hN1U0QkJQaGI2NVRSMCtvRytNdTZBZjdsOVFMOFpkMEEvMHJzVis1ampzSWZBS0pXcXg5QVAvS1pQdnVaZ2o3TkFMUlVKaUFmZ1ZZWEF4YWZBZ2p3dDlZcG82ZlZEZkNYZFFQOHkrc0YrTXU2QWY2VjJLL2N4eHlHUHdCRVRkcVAvQlJBQ3YvMFB6dkxaeTJ6dHd5eSsxbXZKRjNYQlFIbUFJREVHWURwZ3IrVkJQZ0grQmM3elAxNjZEbnBCdmhYcHh2Z1g1bmRmREhBMzlaK0tSOE9hbEVyNmdjd0FCNzhMUUJONkFNQWRwa3krM1hsbEZKNENpREF2MWluako1V044QmYxZzN3TDY4WDRDL3JCdmhYWXI5eUgxMEFmd29LR2tYcEtRQVYvSnNLNjZiLzJhdy9FWEdkRTJVQWtMNVppSURNckNjQnNoTGdIK0JmN0REMzY2SG5wQnZnWDUxdWdIOWxkdlBGQUg5Yis2VjhPTUlmQUtLSURvQVBBRkw0cDdOLzFycjRQejMvbi81M2VoYUFGQUFJcnhXY21RRkFnSCtBZjdIRDNLK0hucE51Z0g5MXVnSCtsZG5ORndQOGJlMlg4dUVCZndDZ0VlMURmQXFnaVRnQVNLLzBGNDgwRnZyc0JZS3FEQUJoZExReXU5NEZBQVQ0aTdvQi9pcUh1VjhQUFNmZEFQL3FkQVA4SzdPYkx3YjQyOW92NWNNVC9rQVdBUFFqQnIvcHZML3ErUUExeUZrQVpRWkFkU0hnN0hvYllJQi9nSCt4dzl5dmg1NlRib0IvZGJvQi9wWFp6UmNEL0czdGwvSlJBdjdKeHZRdUFQYitmdFk2QzMvMk5rSFZzd0JTVVFZQm9wVExBSFF5UEFqd0QvQXZkcGo3OWRCejBnM3dyMDQzd0w4eXUvbGlnTCt0L1ZJK3lzSWZBS1UwZlFpUTdydy9DLzg2WlBpcnNnQ3BNMk1nWUFvQVVzUDZ2WjJTQVA4QS8yS0h1VjhQUFNmZEFQL3FkQVA4SzdPYkx3YjQyOW92NWFNQytDZlNpendBU0k4MkVmd3AvRjJmQm1pOEtMRFUyd0NuVXdMOE82UWI0Sy9WY2RJTjhBL3dEL0F2dEYyNW41a1BmMUNhUGZhWHRjNEdBRTJvNFc4Q3YzSG1uNG81QUtDb1NUOEFvbDNwbUFUNGQwZzN3RityNDZRYjRCL2dIK0JmYUx0eVA3TUEva21wOUhYQXFhVGc3d0UvODY4cC9vdEJnTk5SNjNZTmdNK2dXYkVFK0hkSU44QmZxK09rRytBZjRCL2dYMmk3Y2orekJ2NEFZZzczSUovMTk0QS81NS9DbjcwOVVIZnhuMDZVR1lHaVJ3RVRabG01dVpNUzROOGgzUUIvclk2VGJvQi9nSCtBZjZIdHl2M01MdmdET2VUWjF3R0xzLzZpOC81c0lHQjlCRHU5RFRCZURQQVA4SzlHRHdqd3IwUXZ3Ri9XRGZDdnhIN2xQZ0w4VlFwc0FNQSs0TWNHK0NMMDJjOTBXVnVob2dmOTFPQXphRllzQWY0ZDBnM3cxK280NlFiNEIvZ0grQmZhcnR6UDdJUS9RSWdLK0xyL2xjejhVeW02ejU4b0ZtZVdCUGhYb3h2Z3I5VngwZzN3RC9BUDhDKzBYYm1mMlFwL0FNUjhnWjh0K0wyT1lLdFRBQUgreFhwYTNVN0N2NE9EWDRDL25aNlZib0MvckJ2Z0w5bk5Gd1A4YmUyWDh0RUIrQU5JRC93VTlxcFBIZmdCK2VoMUNnWUtud05nR29TZTNMOFBIL2pXQ1cxVnlneWFxWXhPVGpyckJmZzc2QWI0YTNXY2RBUDhBL3dEL0F0dFYrNW50c00vRmhic3RyTjlGZWlkajJaakFFQUtYZ2M4TmpXRnNha3BwZXZwR0RTTnVnSCtzbTZBdjFiSFNYY3V3OS9uT0hiUWszUUQvQ1c3K1dLQXY2MzlVajQ2QzMvQUR2S21tYjMza1Z4OEVhQ05CUGc3NjBtNkFmNHFoN2xmRHowbjNRQi9MejJsYm9CL1pYYnp4UUIvVy91bGZIUWUvaUR4UllBczZLVWl6S2NxTU5EcEZVb1I0SXVOQnZnNzYwbTZBZjRxaDdsZkR6MG4zUUIvTHoybGJvQi9aWGJ6eFFCL1cvdWxmRXdEL0FHd3g2TUllQlhvMVpybWZkcHk1VElBQWY3T2VwSnVnTC9LWWU3WFE4OUpOOERmUzArcEcrQmZtZDE4TWNEZjFuNHBIOU1GLzNnL0MzcVZXTUhjUi93RGdBQi9aejFKTjhCZjVURDM2NkhucEJ2Zzc2V24xQTN3cjh4dXZoamdiMnUvbEkvcGhEK2dPeTRyQmIxTy9FNEJCUGc3NjBtNkFmNHFoN2xmRHowbjNRQi9MejJsYm9CL1pYYnp4UUIvVy91bGZFdzMvQUdRZkxBc09rcHRNZ0ZPUjdwN0JpREEzMWxQMGczd1Z6bk0vWHJvT2VrRytIdnBLWFVEL0N1em15OEcrSE8yNXpEOE5hSUN2UTM4VFhhVTRoWUFCUGc3NjBtNkFmNHFoN2xmRHowbjNRQi9MejJsYm9CL1pYYnp4UUIvRzl1bGZjd2srUE0vTEIvUWU0djlLWUFBZjJjOVNUZkFYK1V3OSt1aDU2UWI0TytscDlRTjhLL01icjRZNEc5anU3U1BtUVIvb094eFdpcGdzTXNBQlBnNzYwbTZBZjRxaDdsZkR6MG4zUUIvTHoybGJvQi9aWGJ6eFFCL0c5dWxmY3d3K0ZOUUVQZ01ucHg0Nnp1OURURDJGT0J2SXdIK2hRNXp2eDU2VHJvQi9sNTZTdDBBLzhyczVvc0IvamEyUy91WWdmQUhVTzN4V2lCRUdLeXQzd2FvV05YcDJKaXkxalBxem9aQk04QmY1VEQzNjZIbnBCdmc3NlduMUEzd3I4eHV2aGpnYjJPN3RJK1pDbi9BWmtEUzdTOTl0RnRmQXhEZ1g2d242UWI0cXh6bWZqMzBuSFFEL0wzMGxMb0IvcFhaelJjRC9HMXNsL1l4aytFUGo3R3dRckc2QmlEQXYxaFAwZzN3VnpuTS9Ycm9PZWtHK0h2cEtYVUQvQ3V6bXk4RytOdllMdTFqaHNNZlFMWEhycU1VWmdBQy9JdjFKTjBBZjVYRDNLK0hucE51Z0wrWG5sSTN3TDh5dS9saWdMK043ZEkrWmdQOEFkY2oyS2FzdFQxakFFQUtYZ2RzY2hYZzc2Z2I0Sy9WYzlJTjhQZlNVK29HK0ZkbU4xOE04TGV4WGRySExJRS9BSlMvQ2NCZnlyME5NTUEvd0wvWVllN1hRODlKTjhEZlMwK3BHK0JmbWQxOE1jRGZ4blpwSDdNSi9vREg0RmlkVlBZeW9IeHpnTCtUYm9DL1ZzOUpOOERmUzArcEcrQmZtZDE4TWNEZnhuWnBIN01OL25EOHVWVmlKcGVpQUtEdTRpckEzMUUzd0YrcjU2UWI0TytscDlRTjhLL01icjRZNEc5anU3U1BXUWgvQUo0RGJEVlNmSTVmbEFEL0FQOWloN2xmRHowbjNRQi9MejJsYm9CL1pYYnp4UUIvRzl1bGZjeFcrT2YyWFk1czRsaGVLNlZlQnBSdkR2QjMwZzN3MStvNTZRYjRlK2twZFFQOEs3T2JMd2I0MjlndTdXTzJ3MTk5WEl0YjI1SWxzQThBQXZ3RC9Jc2Q1bjQ5OUp4MEEveTk5SlM2QWY2VjJjMFhBL3h0YkpmMk1kdmhEeFRkYTk4VzhLZGlkeGRBZ0grQWY3SEQzSytIbnBOdWdMK1hubEkzd0w4eXUvbGlnTCtON2RJKzVnRDhZMmtyNDQzaS9ES2dWQUw4SFhVRC9MVjZUcm9CL2w1NlN0MEEvOHJzNW9zQi9qYTJTL3VZTS9DSDZSaHZlMlJROURJZzVmNEFmMGZkQUgrdG5wTnVnTCtYbmxJM3dMOHl1L2xpZ0wrTjdkSSs1aEw4QVpzanZXMkJnUE9EZ0FMOEhYVUQvTFY2VHJvQi9sNTZTdDBBLzhyczVvc0IvamEyUy91WVkvQUhnSkpQQWl5bDdIUVhRSUMvbzI2QXYxYlBTVGZBMzB0UHFSdmdYNW5kZkRIQTM4WjJhUjl6RWY2eGlCdzIvUUtJWnRsTGRBRUFFZmNIK0R2cUJ2aHI5WngwQS95OTlKUzZBZjZWMmMwWEEveHRiSmYyTVhmaHp4N3p2a2UvOTYvRzZoUkFnTCtqYm9DL1ZzOUpOOERmUzArcEcrQmZtZDE4TWNEZnhuWnBIM01aL3FqMnNIZVZ3bE1BQWY2T3VnSCtXajBuM1FCL0x6Mmxib0IvWlhienhRQi9HOXVsZmN4eCtBTVFCMlBUTDZIeVdLSEh0Sk1VdlE0NHdKL1hEZkRYNmpucEJ2aDc2U2wxSGI2dWhmMkRXRHcwcE5VN09qcUMwYWtwYnR1NWl4YURHSjVrc3YvMEtUU2ppTnZXVzY5ajFmd0ZlUVVGNWRHcEtSd2JHK1cyblRVOGpLSGVQbTNkVDR5UDRjemtaSUMvaGUxSy9RVDRsN2MvalNrQVl3QUFVOVc2Q1A3WHJsbUxjeFl2MW1yL2JQOCtiRDk2eE02WjZKZng5NGUzdnh5SEQ1MlV5ZzBPOWVOTU5JblAvSEF6cDNmTGhndHh3N3J6Y1BUSUtiUmF3aURiMTROZG95ZndyYWVmNUgwRytKZlhtdzNIc1lOZXFudlI4ck54MWxnUG5uaGlsN1QvdGErOUNkL2N2Z1ZQSFRySWJYL2psVmRqMTg1RGVIRHpVNUxPN1MvWmhIK2ZlQktuSnNhNTdRdjZCL0RpVmVmajIzYy9LdW5jZU1QRkdCc0d2cmFGUDI1ZnNPWThyRis4RkYvNDR2MlN6c2FONStMa3N2bDRlTytlQVA4QzI1WDZDZkN2eEw3bFZNNDJTK0FrUlFHQU9nUFFSZkFIZ0EzTHo4WlhQL01BVHA4WmwvWmRjdkVhckxocW1YTUFvSnJCOTlkNjhKWTN2VmNxZS90TE51RVg3L3c1VEp5YTRQVEdUbzdqelBGUi9QYTdQbzRqUjA1eE9sZGRlVDdlK3U0N2VKK084QjhlR01DYTVTdXk5WW1wS2V3OGRBQUFzR2I1Q2d6MTkyZjdqcDQ2aFNPbm1lREZBLzZybGk3Rnd1RjVmSjAxdXRzTzdFZWoyWlI4MmVpbWN1RTU1NkxHOU1uV0EvdlFiTFd3Wk40Q25MMW9TYlo5ZkdvQ3V3OGZNdm9xOUtuWlBOdy9nT2N0VzU3cGprOU9ZdmVSMk5lNXk4N20rL2pNS1J3OWZVcHBwNnEwLytiTlQrTnpuLyt1Vkdac2JCSTd6NXpBNFpFejNQYlA3Zjh1bm4xMlArNjk5ekZKNTVKTDFtaDk3bi91R0Q3K2lhOUwyN2M4c3crTFZpM0V0cVFQVXZuR2xsRXM2aHZBcC83NVc1TE9MNzN1Wmx4Nng4WFdnL1NHbGF0UnErVkQyNDZEQjlCb05iRndlQjVXTE1vRC9jbEdBN3VZZ0tkS01DK2VOeCtMaCtjcDRDL0xnUk5ITVM1a1hxd2t3TCtVYlM4ZlBrMnU3bVdBem9iY013QmRCdjlVTmorMEJjZVBuMUh1dSttcVpYWU9XYjhPWDlXMzczNVVPVnZhakIvWisvUTR5QzQrZHgzKzdxMi9tYTF2UC9nY2Z2UHYzd2NBK08xZmVDMHVYM2QrdHUrejMvMFdQdnZkYnliT0dMOE9NLzgzM1hJN2JyL3lXcXZpYi9uZzMrRFF5ZU9sWnY0ZmVOczcwTnVUL3dUdWZQOTdjSEprQkxkY2VpVis4MlcvbUczZnNtOFAvdDkvK2toYmp1T056MXVEdjNyanIyYnJ6K3pmZy8veHFZOENBTjc1MzE2Snk5YWNsKzM3L1BlK2c4L2ZmM2V4WDAvNG0vUSs4OW52S0xkdndiUDJ6bFErQlZFRkVnRHdOSjRwc0dvLzh2N1ZHMzhWdy8wRDJmcXZmdlI5T0h6cUJHNjg4Qks4NDJXdnlMYnZQSFFBdi9WUEgwbXNWenZ6Zi9tbTYvSEdtMjZ6S3ZzSC8vS1ArTm51SFc0T0F2eEwyZmJ5NGQydDFQU0wxZTJySkdxbzVHMkE4YTY1Qy84cXBmSUxubXg4bGtqN2w5RXJrL1l2b3pmYjB2NWw5S2JyZ2o5Zm1ZN2p2NngwSXUzZktkc0IvbTN5NGQxa3Fzc0F0SG5raUtYMDJ3RGpYUUgrMW41bkVmeWROV2N4L012b2xJUC85SjN6OTlFckl3SCttZEgyU1lCL0tkdGVQc3JBZjVxbDFOc0E0MTBCL3RaK093My9Fa3JUZGNGZkdXa0wvSDE5K2g3SHZuNEQvR2VIQlBoNzJmYjJNVHZnMzlZMHYwbUtMd0lNOEM4dFpRZS94WXZuWWVueWhUaDg1alMzZmVIZ0VCYjBEK0RacmZ2UmFEUkwxaElTL0ovYXV3dnYrb2YvbmUyZVlDNUUrdEJYL3oyL1FJM0VGd0d5dXJhK1dQblgrKzdHMXgvZWJLVitmSVR2Q3gvNC8rNm5QNFlhYzZmcm1mRXhBTUI5VC93VVQrL2JrK21NVDA1b1RKWS9qcmZzM1kzZitlZVBadHZIcHlhejVZL2U5UlVNOWZFWEFTcjlkZ0Qrdi81ckw4UDIwOGR4NkF4L0hjeXQ2eS9BbHFmMzR1N3Z5TmVvY0Q0dGZiM2t4WnV3K0p4RmVQTHdBVzc3WlN0V1lWSHZBRDd4RC9LRmc2N3lwLy82S2U0aXdCUEpoWTBQYm5rU093NCtsMjJmYUhoY2VHY1Nac3kvNS9FZjQvSGQyNjNVZGh3NlVGd293TCtVYlM4ZkZjMzhMWkswTnI4ZUw4S1lBZ0JpR2xXN0RmNGZlUCt2NHgzdi9Dakd4L01CK3BLTDErQ2Q3L2dGUEg1Sy93TjFHZndJSVZpL2ZwVzAvZFlYWFluYmZ2RnFmT0w3OTNQYlg3cnhFdHk4ZmdOKzkvYytpU05IK2F2RHp6bm5MRHVuZVVYeitpWXlPakdCcC9mdVZoYmZmZmdncHlmcTJ2amlOeEU4ZC93WW5qdCt6RW5QeXE5bTk3UDc5eXEzbnhnNWd4T2o2Z3MrQzMwNkhzZWpreFBZd2dRYnJPd1Jyb1JYK3EwWS9qZmNzQkh6NXc5SzIxLzcycHZ3cmUzUDRLbkQvRzJBdi9UQ203QnI1eUdzWDc5UzBsbTlhaW5JamtOS1g2dFhMY1hiLy9zZDB2YjBOc0J4NFRiQWwxeDhHZFl2WHFvY0xEZHVQQmNuRWNrN05MTDF3SDU1SXdWT2pZN2cxT2hJUjlMK0IwOGV4OEdUeDl0aW05OFY0TjhXSDVXbS9aMkFWT25VVlJzQUxEeG5RWUIvb2p2ZWFPQzhOYXRRcS9IS2c4UDlXTEo4QWFhT3FVSGlPdlAveWY0OStILys0alZ4SlFXOXA1aVpTU3A3VHh6SGozYnZ3dXZmOVJMR1p5NjdURERsSzVyWDEwVXFoTCtQbnBXdWo5NXNPSTRkOUNSZGpkNld3NGV3ZUdnSTVKS0ZrcHN2UC8wNGpnb1A1d0dBZjN2c1VSQUFOVUVIQUw3ejNBNk1OaWFsN2FjbkovQ2RBenRRdTNTUnRPK2hNODloOUpnODgvNys3aDE0ZFA4K3BaOW5jQXJIRDh1MzZGcEx1TS9mMlhacEh3SCt1WlE1RjFoU0NLVmlPb0lRQU9SNXp6K241M25QWHkzOWVyc04vcXplRHo3OEVKcVRlYXA5eWJyRnVPeTFsK2gxUGI3V01xY0x3a04rS3RDYkRjZXhnNTZrNi9NYjZQQnhySlR3aEw5QzI1WDZDZkN2ekg2UmorMzM3L2o2amdkMlBRbWdDYUFCWUNyNVB3bGdJdmsvbnZ5ZllENG5rakpUaVY0anNkRUUwQUlRSmY4cDh4K1VnYjQyQXpDd3NOLytWY0N6WWRBc0NYOW4zUUIvclk2VGJvQi9nSCtBZjZIdHF2d1FFUFRXNndDQWlGSTBXNjFxZlFUNHE4VDIxeUtXSXc2NlN0RUdBTFdlUE44OTZ3Zk5BSCtWdzl5dmg1NlRib0MvbDU1U044Qy9NcnY1WW9BL0FjSFBYM3NEWG5IZEM3QnF5ZEpzKzA5MmJNWC85NFA3OE5PZDIwcjdDUERYeWJTZEFkRGZCdGpUWDY4QmMyRFFEUEJYT2N6OWV1ZzU2UWI0ZStrcGRic00vcFRTQVA4QzIxWDV1WHp0ZVhqN3kxN0J3UjhBcmpwdkEvN29kVzlHWC9MRXpBRC9pbjNFendGcVJ3UmdaVk9mQWVpdG0xOEZQQnNHellyZ3YyQmdBUDA5dmRJVnlMMzFPcGJObTQrUnlRbE1OSm9CL2dZZEo5MEEvd0IvMmdZd0E5TUMvM3F0aHQ2YS9wRXJqU2hDUzNoalluOVBqOXlkak8zSlZvdnJvN0p0ZWVsVjEybjN6UnNZeFBVWFhJenZQYVYrVEhPaEJQaTcybGI5a2tqQmZpL1JCd0ExQTExbXc2Qlo0Y3ovamtzdngrV3J6OEUzMzNjdkdzZ3ZBbHk3OUN6OHptMHZ3ZGVmK0JsK3NHT2JyR2pqYzRiQWY2aXZENWVzbEc5QlRPWHd5Qm5zUG42TTAxMi9iQmtXRHc1cGZlMDZmaHhIbUpmSHNMb2JWcDJEZFdmTHQ0NmxSUjdadWdYSEdkMTZyWTRYWDNHMXRuNEE4TjJmUFNxZHMweDlYclp5RmZwN2hNTTk4ZFZvdGZEWWMveXRZY3ZtemNPYXhmeHNpSldUNDJQWWZ1eW9kbitBdjc5VUNmK0xsNi9BUUcveXZYUHdCMXBSaE1lRVd3S1hEZzFqemVJbDBNbnBpWEZzMDMzdm1wbi9sU3RYNDVMaFpYanVPZm11bktzM2JjQTN0ejR0MWVPM2Z1NkZhRFdBWThma3V4dVdMUnZDcHgvZGpHT2pvNXdmYjZIQTB1ejF6R3BaVXJEZlpOdSthSmZDUDdudzNzOWJPZUZHUk1KUWhkUTFJV3VYd1QrVnQ3L2pJeGdiNDIrS2VQeXhIZmpBQjcrTWkyN2Y0T1lRNVFiTmRzejhGdzRNNHZ6YVF2ekhmendvN1h2RG5iZGc1WUlGMkhPY3YyLzV1blBYWWxuUGtQS3RicmUrNkFwZ3laSXNBQkQ5M256SkZYajlUYmRxcS92dVQzOHNDd0FJQ0hwcU5menVLMSt2YngrQUI3YzhnWkZXUG1DeVBsKzRiajArL3VHdlNqcWJOcTNIUzI2N1hBb0ExaXhlaWpzMlhvS1AvUDEvNGRRcC92YTNOV3VXNDdxWFhxb05BSFRIOGVMQkliejhvb3UxOWQ5NjlBZ2UyYnVIMjNiTCtnMVlhUmg4SDk2N0I5dU9IWkg5QnZnREFHNWFkeDQrL2ZHN01ESFI0TFpmZU1FNStNVlgzU0NCZC9YQ2hYajVoUnZ4TDUrN0I3dDNIK2IyTFZ3NGpEdmUrSFBxQUtBZzdmKzFyLzFRK1piRmovL1BYOEhvOFVQQWNmNDE0SHNmMjRteHFVSHNQU2svaytHNmEvTVhHWFhpYXY5TzJPNWErUHRMSlJrQlV3WkFEZ0M2RlA0QXNIZmZVVVFSLzgyTlQwemg4SkdUdU1qTjVZeURmeW9Ibmp1T2I5ejFzTFQ5eUpGVElFTjE3RDF4Z3R2K3FRZVBvTjRpK040RFA1TjAxcXhaamtYSld4TExuT0x5MVJYMW9vZ3EyL2JFRTd2d28wZWV3Uk1IODRjNUVSQWNHTjZObnl4OEhQZmU5emozOENjZ2Z0WHlkUys5MUw2K3lhYituaDdzZmVJNS9NKy8vWUpVNUMvKzdNMVl2bWErcExkeS9nTDBqVlA4NnEvOUwwbm5WMy9sWlZoNCtWbXkzd3JodjNiNUNweDcxbkt0SnF2MzA1M2JzcWNwdXNyOHdTRmN1ZmI4NG9JQTlodzlqRjNDQTRsTTh1MjdIOFhJQ1A4MHh4Ly9lQ3VlZW1ZUG5qekkyOWt6dEIyUExmd1pIdnFoL1BiUEZTc1c0NDQzL3B6c29NUTUvKzBmdXdkTDZuV0lDZmdkOTN3TFE1ZGNqUE5lOHlwSlozQ3d1cGwvS2xPTmhyNGNnS21tZWIvSmRuSFI3b1ovd1pEZTFzeUEva21BSW1tNkdQNVZ5a3lGdjBrZWZrVDl5dGNES0I2RVp3TDhUYkpuN3hIczJYdEUycjRmd09OVitCVTJOUnN0Q1VZQThDZC85bG1RR2tFajRrOWgzRmU3RHdDazdCTUFURTAxWkw4VnoveGZlTWtWZU8wTkw3U3k5ZTdQZmdMUDdQY0xBRll1WG9KM3YvSk9xN0wvdnZsK3B3QkFKWWNPbjhTM3Z2bGphZnMrQUhJNGE1Q1NGL3pkZU41YUxPbnJVNXRlZno3b3VuWFM5cjdlSGJKalZ4SFVIM2pxWjdoNi9ZWEtvaEdOOE5BelQzbmJOaGZ0YnZnblVqV0JyTzFwQXdCU3Mzc1RZTHc3d04vYXA0ZS9UNzdyOTNIK3l0V0Y1VVluSnZDTGYvVUhyTVBjN3pSSU9iL3RoMytWVXVZNEJvQ0pDZlZ6NTVzb2VzZEQ1OVArVlVzbkx2anJoSDJmR2ZuU29VR2NOVENnM05lY040eUo0V0ZwZTlTcU8vdmhSRkhOKzUvOEtXNjU3RXBjdVc0OXQzMnEyY1NYSC9xZTlPNE5GOXY2b2dIK0FNUVVRRWQva2NVWmdBRC9TcVRqZyswMHczODZaTGJDdjZKS09CWVA4Sy9Tdm04Ni9zR2R1N0ZBdkRnMWtmNitmc3pidVZQYXZ1d3N2eXdMQUcyL1REWWErS04vK1dSOHltZloyWEZSU3ZIVFhkdHdXdkVJYUJmYjZxSUIvcWt3djBUZGVmMHk1L3VKcVFiNkRBQWh4amNCeHBZRC9LMTl6ckswZjl0bEdvS2g5cGdPOFBlVmJvYy9BQnhkTXc5Yng4ZHdZcHlIN0NVclZxSjNtS0pQRVFETUcrNzFjMlpSeloySEQyRG5ZWXUzRDNyWXpvc0crRnRLMjMrbGRxY0FWUHU3RFA1Zi9MYy9WQTVZOVo0NnZydnRHYTNlZ29GQjlOVDFYVGt5T1ltRzVuR2IwM1dmdnlpLzhlc3ZSMjFKUDM2NG14K01ibGwvQWZxbkNQN3V2ZiszTWwrVlM0R3ZHMjdZaUY5NHhmUHg1Y2Y1ZTV6WEwxdUc2ODVkZzcvNjYzL0ZpUk1qR3RQVndiK25wdzZRK1BHcnJOU1NwNFEwR3VwanBOM3cvN2NIN3NHL2I3N2ZTbTk4MHY3MXVlSnZhZXR6KzNIbkIvL1NTcmZSTkp3V3NielAvOUpMMStJdHYzd2J2dlF6L250ZnQyUUpyajkzTFQ3NnNhOWkrM1lGQ0QzaHYySERLcno0dGl1bDdTLzluVmZoM2ozYmNQREFmczcyYmJmY2h0TW5HbmpxYWZtT0F3TEhOMzNHRmJVb0VoN3lVNmtQVzl2VEdJd2JUZ0hvcTlWdDhQL0NJdzk3NlJFUXZPSHE2ekIxWFAybXNpVkw1dU5yMjU3RXM0Y1ZyMzFsNFAvRkI3NkxSY1B6Q3YwMVdzM01yMk5GQVFCWFhIRWUvdTV2M3lidHZ1elNkZGgyNWhpMjFVOXhPcGRkdFE1ckZpekdvc1h5ZWNwMTYxYmdzVk9LQzdWOEQzWWZQVWFudDdldWJOdXFsVXV4OHR5bCtON1lQazd2L0hQT3dmTTNYb1EvLzlNM1lVSUEyOEtGODlRVnNxaGpyVjVEYjYvOHMvdWJ2MzRyaHRZdXdEZTI4QmRidmVIS3E5RTdSdkdXWDM2ZnBGTTNCSllxOFpuNVR6V2JhRFJibFE1U3FrQTZvaEZHSitTTEk5ME1zNHY1eWwvODJadWw1ME1zWGJvQTZ5OVlqZTlOOExjQm5yZHlGWjYvOFNJTUR2YmoxQ2srOEJ2bzV5L1dzd1hON3BNbnNPYWN4YmpoRGRkSSt4N1l0d1A3VHAyVVlQSHRaN2VncDFZRGxzdCtOaDg2aVJHSFlLdHErQzhlbm9lWGdLMDZRZ0FBSUFCSlJFRlVYLzE4WExQK1FxU1BpOWwzOUFpKyt2Q0RlRWJ6aW0xWEg0bUNzOHc2K0FNUUx3SXdGWFN4YW1XUS9URXl6d0VnMS83RzFhdjdobnYzU0FwZEJ2K3k5MGUvNWFycjhTdDN5b00zQUx6NVRiZGllTk5TS1FDWWpwbC9qUkFNOS9Wcml6VmFMVXltTTY5RVo2QzNOeDZrTkg0bm0wMCt1OEVVR2V6cngyQjI5Yk9zZTJaOExCKzBrOTJMNS9HM3lZaytUNDZPNUhBUlRBNzE5WUY5dGhXckcxR0tzYWtwVHErblZzZUE1dHdzQVVFemlqREIzaHBsMGUxTGhvYnd5a3V1RUkxbHN1WHdJV3dXc2l5M1gzQVJWaStVWDV1Ynl1YmRPL0hNa2NQYS9XeWRPM244NjZUVFQvZ2I2dTJGNm83bXROem9GQS9TbmxvTkF6MjlZc0ZNMHU5OU5qemV0OGkycjQ5UHZ2UGRPR2ZwTXVXK2QvM2poN0JOZUxhQ2o0L3VnVCt3NjZFOWQyKzlaOXRQVWZ3MlFQR3RnT3piQU5NM0FxWnZBa3ovVS9CdkJMUjdHeUFoOGltQUFQLzI2Z0hUbC9hbk5ENGQ0YUl6MFZEY2htYWhCd0RqVTVNWW41b3MxbVYybjlBOFZiRElGNEFjOENaZFpuTXphbUZrU2s2N2x6bU9UNHlONDlNUFArU2s5KzFudDhoK08zVE9mN2JESHdER0N1NXZGNlVaUlJpWlluNEhpaXAzTS93dmZ0NGFMZndCNE9WWFg0K1BmTzNMcFh4MEUvd0JsUG1WbGY1MVdwOEM2RHI0KzRBWTVRYk44R3ovQ3ZRS1RjNkE0OWhCVDlJTjhCY01zNHNWK3dqd2wyVGRjc1hqdXhrNWZ3WC9PUEVBZndzcDl6c2ptbVVyTVp4RXpQTm1NMkxRRFBCWE9jejlldWc1NlFiNGUra3BkUVA4S3pMTUxnYjQyOWl1eklkVk5RTDg3Y1RxeDFZSzlEb3BQQVV3SXdiTkFIK1Z3OXl2aDU2VGJvQy9sNTZrNjNzYysrb0crSmUyM1JZZkdsT1YrR2p6MWY3aVhTcWlwUHNEL0IyRTBDcCtjU29iQkFXMU0xMUdySDlOOFd3WU5HY0kvSHZxZFd5NmFyMjBmY1dLeFZoenJ1NFo2NFVPYzc4ZWVrNjZBZjVlZXBKdWdIK0ZodG5GQVA4aTI1WDRTZFFlMjJsKzYrbFB0bThOOEhmM1VlR3Z6azIwQVFDQjV0TFoyVEJvemhENEEwRC9RQy9lODU2M1NOdHZ2dWt5M0hHSC9oM2NCb2U1WHc4OUo5MEFmeTg5U1RmQXYwTEQ3R0tBZjVIdFN2d3dhczhkUDZaOUw4Q1o4VEhjOWVnUHZXM2JxOHdwK01QemgxZkpyOVYwRWFEejJ3RGpJZ0grckh4djI3TWdrL0tSc3VQWUVmelh6eDdENFpFekNpMnR3OXl2aXdUNE8rbHBkUVA4clNUQTM4NStaVDQ2QlA5VTN2T0YvNE1yMXEzSDlSZHN6TWJPdlVjTzR6dVBQNEpKbDdzdUF2d0JLRlB0UkxOY3VlZ0RBUEhoQkxOaDBKeGg4QWVBcHc0ZXdOU28vTkNPUTZkUDQwZTdkN2s0elAyNlNJQy9rNTVXTjhEZlNnTDg3ZXhYNXFQRDhFL2xzWjNidU5NQkllMWZzUTkvY2ZvMTZ5OENoUDNiQU9NaWN4ZitMOXh3QWM1YnlqNStreDgwZjdScko1NDY2UEg4YkZzSjhMZlNLZFNkRGNleHIyNkFmMm5iYmZFeEIrRmYya2VBUHkvRkEyeFJSc0Q3VjF6OEhJRFpNR2kyZWVhL2NzRkNmT1J2dm95VHArUzNZbDI5YVQzVzMzYStld1ZzSmNEZlNxZFFkelljeDc2NkFmNmxiYmZGUjRCL0tkdGVQbVliL0FHME9jdHZGTU1wQU51eGYyN0RQNVVkT3cvaStISDVmUDNLbFV1d0htMEtBQUw4clhRS2RXZkRjZXlyRytCZjJuWmJmQVQ0bDdMdDVXTld3bC9NSnh1bDhrakI3U0pBcVVoM3dMK012UGlpamVockVQd0FEM0hiTDFoK05uNXAwelc0Zjl0V0hEeDlTbFlNOExmU0tkUU44SzlFVHljQi9uYjJLL014aStEL1d6Ly9HZ3dQREdhMnYvYklnL2pacmgyVittQUtlOGwwd3g4VXV0OGowZTZwVUV3WkFQZlhBYzlSK0R0RG1KRjFpNWZpUi9mS3Q4MmNPVEtDM2pNVTgvdjdJYjB6TDhEZlNxZFFOOEMvRWoyZEJQamIyYS9NeHl5Q1B3RGNjTkVsV0R5Y3Y4RHJrVzFiOERQWUJRQmRBLzlwRmoza0RTUHl0QSthbllhLzU2QkpDTUhrWkFQLyswTmZrZmI5Nk9GbjhkM3YvbFRsTVBmcjVJeGREUEFQOEs5R1R5Y0IvbmIySy9NeHkrQmZScm9RL3AxTlN6TmltdVVyOTAzN29EbUw0Ty9oTVBmcm9lZWtHK0R2cFNmcEJ2aFhhSmhkRFBBdnNsMkpuM0RPdjFMYlZqNkVYWmFzYUV1UVlId1VzTHloZStIL3VjKytHOFBEQTF5WlRWZXR4NS8rOFJ1cThSbmdiNlZUcUJ2Z1g0bWVVbWlBdjYzOXlud0UrRmRtMzlySDlLYjliWDZ0UlBqMEZxdTNBY2FldWhmK1IwZEhjSVkycEMrMlJTaE9OQ1p3Wm1LaW5NOEFmeXVkUXQwQS8wcjBsRUxibVA0TjhIZXlYWW1mQVA5S2JWdjUwTjhGT0cybkFLd2VCRFR0ZytZMHAvMi9zK1ZwZkFkUFk2clo0cmJ2UFhFY24vaisvZVY4emhMNDEwZ3Q2UnZDbUNLU3Z2UjljK1haRXNKMnduL1hPcnQ1SDJ2MDAyM1NneXpsdWdJa0w2YW9KeXMxTmg1VzluMWFQNzZRMUU4ay9xL3ROMGsvcmFOUVh0RSthWjNSVTllcjJDNUFrb0dMcGdXVStwSTk3WEd0MTJmSFI3RysrWnBGZlEzMW85bFd1YisxYmJMcGE1VWtteW1OTU40WXczaGpCR09ORVl3M1J0Rm9UYXAxVWdud3I4eSt0WTg1ZnNHZlNnb2ZCTlR0OEMvcnM2KzNCMjkrMDYzS2ZaczJyY2N6T0RFajROOWZIOFNTZ1dWWU1yZ2NpL3JQUW45OUVIMzFBZlQxOUtPdjNvODY2ZEY4bitLQUM4V0FxZDdPMVVMYUpZSkxLR1FLbkhSSHJySmU2dU5NZmZ3eGlOQUFLdCtucXBlaXI5SXRranYzZXZGVmNxaFhrSTVMSzJwaXJIRUdSMGNQNE1EcDNUaHdaamRPamgrSmQzWUovRHNSWEZqN21VYjRreGdlcmo5TUlueDZpU0VEUUdvQi91VjlQblp3UHk2NmJZUEtJY1lBSE44LzV1aU1YU3dILytXRHE3QjI0VVU0YTNBRmhucm04OFhaTmtWQWhGYXVxWUcxM0lYeTl5alZtWjJsYXJiejFsVGZrem1JNEZWay8wb3M2K29GUU1vMmFPcWxQNDRadTVwQXdnaHI1WXU2ZWY5V3dZM0N2MXdkaDNvRnNaWjZyUWZ6K3hkamZ2OWlyRnR5TVFCZ3ZER0tnMmQyNDdsVHU3RDkyQlBhTEVHQWY4VitadmJNdjYwL05yZm5BQVQ0Ty90OFpNOXVsY1BjcjVNemR0RVAvdjMxQWF5WmR3SFdMcmdJODNvWFpMdWpWa3RaM2g0V1NpUkpzKzdNcW1zUXdSVlJ3VnE1Ui9KUE5OdkwxcXRkUVVSU0s2OGdRbHV2eEw5ZEVNRXM2WTQvaFg5amNKUDREOExMWU84dzFpMjVHT3VXWEl4cm5uY3Juano0RUo0NCtDTXVFT2dFL0YrMDRRSU05ZlpxOTM5LzV3NmNIR2NtTGdIK1pXMFQ0Yk5qWW40VXNIN05vRFQzNEw5eXdVTE1IeGpBRHdRZnczMzkyTEJzT1k2TWpQQS9DTFBEM0s5YlJabEZkL2pYU0EwWExyd1NHeFpjbXB6UEptZzFtM25SbVRyanpDc24rVmQvNVVSUkRiY2dRcXBGT0tXaDNLNCtMcEt5dXUvQTNPM2NDci9Qb1Y2elR1UTI5Tlg3c2VtY1czRHB5dWZqaVFNL3hKTUhmNGpKMW9SQzEwSWNaLzduRGl6RXh6NzhYOHI5TDMvWk5aZzMwSmVQZHdIKzVXMFhIOEpFczF4YTdESUFGaTcxQTZxZHpGVDRBL0hiQUM5YnRScWY3L2txcHBDLzczclZva1Y0Ni9VMzRCdFBQb0VIZDI2M2NaajdkYXNvWDJkSG5YazlDN0JweVF1d3NHOHBhRVRSb3Myc0VBVlZYRkFtMjdDYWNjSVZGaFhQT0UxcjJtTmtlazVwY0VzRy84WDFrdjBydk92ckJjQTJHMUVZUkhDclFzOFpqZ3YxSHRXeFFhQWFXZTJ2aTNDb1Y2ZUV5RzBpeVRaS0tYcHIvYmhxOWMyNGRPWDErTUhPYjJEN3NTZmM3SHVrL1NjbnAvREFBMm8vbDE2eUJ0aVFQOTdYSkp1M1BKay9DaGpBd1pQSDdTdGpZVit2Tm92Z0QvVUkxQ2twRGdDNkhQNnB2UHExZjRXUkVUNENmL2poWi9BbmYvb1ozSGpuMVRZT2M3OHVVaEwrYTRjdndFWHpyMFNkMUxrWlA1QWN4TW5CbXQvZlRiT1JYRGtvUzJ1Nm1WMGJZQUhkOTIwUDBWS25OTm9XUktoVnBlOUFVYStzNXNxcTJkYXJjMEZFVWl0bFhRVVg5dlZLL05zRkVjeVM3cmVsOEc4OFhoUC9wWVVreHhoRmZBVVdxUUdnSUFUb3JmWGpSZXRmallIZUlUeDU4RWQyOXFiNW5QK0h2L2FsdHRwWHE4MHUrQU53NFpDcHBOY0JXUDNiQU9jZy9BRmdhcW9wYllzaWlvWndhNkRHWWU3WFJVckMvL3poalZqVnZ4YUlJTTM2YVJRaG9oU2dGQkVGUUtNc0lCQnZ0UU1NNDV0aHNDNExpMUpCaE5wejVsL0RTN1crZHhDaHFaZDFFTU52VndLNzhOaFM5SVR1Sit0eFNrTzRlWTliMU1OYVUrTnBQNldoTzJKVU8xVGhoakxhZ05RVGduOUNDQ2lscU5WcXFOVnFJSVRFbjdVYUNFbTNVVkFLM0xEbVpSam9HY2FQOTkycnJHa203WVMvb3dUNHoxeXA5bTJBRG53cmM2MEEwRm40bDVKcGd2L0t3WE54d2J6TEVVVVJScWZPWUtBMkNKQmtwaDlSdEtJSXJWWUxOR3FoUmFNNElJaW9hRVkvS0ZzM3gySlFOc0pDRjBRb1BlZ2hxdGxtQ2lKeTk3YXdJUHA2U1NYMVFZUmNUVlVRSVJkbGJuSlhHVkhVV1lhbzlTa04wNXJDdnpHSUtJaE9qTUdjcEs2cmwveUZGUVVScG5ycGh4OWRiZldCSEtubEFRQ3AxVkN2MWRIVDA0dWUzaDdVNjNYVTZuWFVTQjBnQkRWQ2NNV0tHekhRTTRnSGQ5MmxCbEtBZjZXMnJYeVVzYTE3V0lZN3Faeko1aDBBQlBoYk9jejlldWc1NlRMRkZ2ZWRoYXNXM1FBYXhSdjdhd09ZYUk2aGgvU0NSaFJSMUVLejJVS3oyVUNyMlVTejJZeURBUnFmZHpUMms2bE5XbGhZVkZwdFJ1VllxMjhlazR0bm5DWmpwclExNDhMb1g3VkQyd09xNWdvYmltYjl1dFZzcyttVWhtYVB6ZmRpR2h1VVlGUnRVeDVlNXQrdk51RFNCVmpXOWRKR1ZvWDFLZzR3U1p3QkFGQ3Z4YkN2MTN2UTE5K0h2dDUrOVBiMW9hZW5CL1dlWHRScWRkQjZQQ3l2VzNRSnlCcUM3Ky8rT204d3dMOVMyMVkrU3RwMjVrT0ZZbjhYQUxjandOL0NZZTdYUTg5Smx5bFdJM1Zjcy9TRnFKR2UrTjU5U2tFQTlLQVhrMVBqOGVtQVJndFRqU2swR2xPWW1wcENzOUZBcTlWQ0ZFV2dORW9NaWtlMUFSYldUWlMvZTBNSVlOeGttdGtWK2ZkNjk0WmxjT05lTDhzZ3d1UTVjU1U5cGw4ejQzU3BsNEZkQmZWcXgzR2hxSmV4c0VlQWFUQ2wvZll0L1hQNjR1RkZDT3IxZU1iZjI5ZUh2cjUrREF3TW9YOWdJUDdmMzQ5NnZRZTFxQWZOcUlIZWVoL1dMYjRZeng1N0RJZEg5c1ZHS29ML2tpWHo4WmZ2K1dYODJaOS9sdHYrQ3o5L1BWNytzbXZ4bjl1TEwwUU04SGVRb3RtRmV0MjNMQ2R1endIQTlNRy8xTDM2WlhTVFVXemU4QUNtcGhyUy9zR0JQcFhEM0srVE0zYlJIZjRBc0hiZUJSaXNEeU9LV3Z5QlN5bHF0STZKeGhpbUppY3dOZEhBeE1RRUppY24wR2cwMEd3MkVMVWlwRmNmVzNXWUhSMTBWZVgzV00zc1N2ZzNUK0kwNW91aDRHRlVvK0VURGNzcmhWWU1VWWJ6dDJqbnpEVU9rbmF3dTdnSlFEbkRRdmVWN2Y5OGcvdXZnWUxVYXFqVjZ1anA2VUYvZno4R0JnWXhPVFNCd2NZd1dxMG1XcTBtK3ZyNlFkSENRUCs4K0pRQmFuakJtanZ3bjAvOUUxcVJ4YlZJbVRjenRhWVE0WncxWjBuYkZ5MmRoOEVGL1doRlp2MEEvd3A5cUtXeXFheFRBTkN0OEIrZG1zSW4vdm0zdGVYdWZmWVoxbUh1MThrWnUrZ0gvenFwNDRLRmwwbkZLSTBQc1ZhcmhhalJ3dVQ0SkViR1JqQTFQb21KaWZFa0FHZ2lhc1VYQXRxODhVMEpzTW9PUzcybjRsbXlXaXhER2t0eHMyUmY1NUkxVktxWGdiM0pqNThGczViL0dGSGsxVEZKWUczWHVvUXB3RTFPQTlScWNmby9uZlVQVFV5Z01UV0ZWcU9CVm1NWVV3T1RHQjZjaHlocW9aYWNDbGpRdndSWHJIb0JIdDEzdjFXTmJXRHp5WWQrZ05Ham85TDJCM2Z1eE9GNzd5bHRYMUR3a2k2R2Y2VmlmUXFnVytFUEFGOTc0bkY4emViMjIybUVQd0NzbTc4UkE4bnNQNVg0dkg2RUtHcWgxV3BpYW1vS1U1T1RtQnFmd09qWUtDWW5KdEdZbWtLOTNvT0ZDeGNpb2xGeUtpQUpCTEs3QkdnU1NGRFFTUGhNeTBVMEx5ZjlSM0o2SWJrUXNTM0JRdHd4YlRPdGQxbTJRSHZkYTVVNjNsT1dVbnlYeHN3USt5eFpVZUJEQ0VCcU5mVDA5R0ppWWd6OS9RT1ltcHhFczlsQXN6R0ZWdFRFUExJUWpaNnArS0xBZWgyMVdneVBqY3V2eFdQUC9RQ3RTTDVUaVpWd3pyOGlIeFhEdjhSekFGeE9DeWpGRUFBUS9kc0Fad1A4Uzl5WE8xdmY2cmRCTWZzbnRScG9reUJLcnZwdk5CcVlTczc5VDA3RUdZQmFyWVozL2M3djRienoxN3ZWdllTa1dRWWFSYURzSjQyeVlFSDhCQVdpNUZPNUh5UmJCeUpRU3VMYkd5bEFrV3huQXBuWVRycWNCeXR4dmRqZ2h2RUxNY2dCQU1yVVB3bUdzbko1RUpiWlpYeEdsT2J0U2ZvQlFIYUxwaFIwc2VVVndWVVVSVno5cy9Xc2JNVFVpVitIWm4vYy9yUnZhTjRHeXZoUWZDZjViYWJDcC9pZFIxSGVScVp2Yzcya0RsRUVQcWprMnhDM05RNUVPVHVDWHRvbjBuYXEzdDV1U1gvMzhSMEFrMmowOXFMUmFLRFZpaS9RcFZHRVdxMkdlcjBudmp1Z3B4ZFJUd1JhajcrUHZuby96bHQ2TWJZZWVWenJvOTF3RHZBdjRXTWFBOXZDREVDQXY0MVMrakY5OEovZnR3aUR2Y1BaTS8wemtDVURYdFNLc2l2K0cxTU5URTNHRndHMm1rMzh5anZlMVZINEEzay9rM285M3BCK2V0a0N1UE92NHBGTG1EWGh1eUo4SWFaNytiaWNNSVZ0ZkxCbmcxa2ZSUHpPdVdvSjZ4M3hJVDlzeU1wSHZsbnJJeSt1UDQ4dnRWUGhRMW52Z3U4ck8vNlpQK2x5TnZqU2RCZFRGbWxRbDVlbE5BNU9vaVRvU2dPTUtHcGxnVWRFb3l5QWlTaE5icXVOQTV5bzFVb0NKUnJmZ2l2WW9iU0ZLQUwyNzl1SDk3NzNiekU1TVlGV3N4WHJVYUNuWGtlOXB3Yzl2WDNvNzQ4dkNPeU5XbG5RQndBYmwxK2pEUUFDL0N2eU1iUFMvcFdFRFlhM0FVSitHMkNBdjBJcC9aZysrQVBBV1FNckZXVUowcU0yb2hGYU5JcG5GY25Nb3RWczRhWmJic1BWMTF6blZ2Y1pKREpNUkVpN1ExT0NxTWxIc2k3RUVkbUNQcUFvaGliYkR2SDM1QVYvVTczRmRqSWRxSU05dTg3MWtDMzhsVDdzK3RMa0l3OStnUnpyWURJNFlMWXh3ekd6ek0vOENVZ05xS01PU29GNlBRMG1laE03Rkl4WnRSM0sxU1RQSERGdVZxOWVqZmU5LzRQNDB6LytRNXc0Y1JJVU5KbjUxOUhiMTQvK2dVRk1UazVpb05GQVg5VEtBZzRDWU5tODFWZ3l0QnpIeHc2REZSODRMeDRhUXQrUXJEZlUxNGV6aHVmaDVQZ1ltbWxtS2NDL0NoOG1BQkJodncvZ2NoQUlvcjNYbnpDbkFGemRCdmpiNlRucEd1QVBBTXNHVjBwN0FXWVFwSEdxTldvbC8ybUVWdFRDZ2dVTG5LbytrMFNDaVhLR3pzS2ZwQXQ2YUpKOG5UQStzbDhoSWN4eXZwN2E1SHd3bW9WZ0pySk5GZnc1SDFtVDQzYm05WTR2S3JPR1B6R0FtYWtJWCs5OG5iT3BBN1BKQi9Nbjd3Tk5Yd28rQ09Nak81VUJCckRwTXVWQm5aM0tRVkpPQjIzUlRncnQxQTdOYllJeU5xbGdKL1ZLb1lCL2ZxcGg3YnJ6OElFUGZnakx6MTZPWnJPQnljbUo1UDg0cGlZbnNxeGQraHRPV3dNQWE1ZHNCQ3UrY0g3ck5kZmpqWnV1bFhaZmQrNGF2UE1GTjJORk1tWUUrRmZnZzViakZyeHBHWXZkUllBQi9ncWw5R1A2NFEvRUFVREtRRGx6azU4YlQ4L1pScTFXZlBEVlNoMC8weUt6S2VYUHJ1dG16MVkreEhZemhVTEt2OXFVUDFkV0FuVzJKR1VTMkdWR0piT3B0TU9rQUZMZFpXZWZqWTBiTDhhaGcvZWkxWW9mMk5Wb3hQK2JqUVphVFBxZnpTQXNtN2VLc2VVUDUyTkhUK1AzZisrVFVwRi8vOUwzc2V5c2hjRFpBZjZWK01nM1Rkc2dYTW5MZ0ZJSjhMZlRjOUsxZ1A5dzd3SU05cVJYLytkRE9DRUF5V1lsQk9MUlRHbVV2QnA0OW9nTlROcWY4bmYzNFpUeUYrcmc3Y01oNWMrMlNRS3p3Z2ZoRmUzZ3p3WXd6QisrWHhVMkMzeFVrZktYUVMxbkVuSTd6S3hmWjVOeU5WR20vS2tRTkxEMVRoL01sVjIvMDJvaGl2SnQ2Y1dpckp3MXZDcXZuNHNJeFp1dEZwNDdJTCs1NzlTcFVadzZQUXA2OWtBcCsvWnFYUUYvVVV4Z3NJR0dFNVRNandJTzhGY29wUjh6QS80QU1OZ3pKSTdhZVhtU0pXdWxsQ1pJL05LUjJTSlZ3YVRNK1gzV0Ixc0hvdzhYTUJPdUZid1BabDM4dXAzYUlaWm4rNUlGUDljOFJUdWxiSUpsOW9MNVkvWWhmbmQ4dmQxQXpVT2JtM2x6eTZJZEFlaGM5Z0FDOE5uc2dYN1d6MmNTQkp1SnZWWVVBUVJJNy9ZQWN4ZEcxb25KQllmMVpOdGc3ekNHK3hkZ1pQSVVyS1VpeUZWdHY2dmc3d3lUNnNRVUFGaFhLc0RmVHM5SjF4TCtBTkJUNnhNTEtvUWlPdzhKSURrZk1Dc0NBQ01FczEydU1KbU9sTCtERDZIZDNpbC9DTWU2WlR1a3ZsVDQwQWNDdVEvQy8vSDNJYlM3OHlsL3dVNkZLZi84STI5RGZJcU81bTNMZ2dBSXRubFpOcnpLUGdBSThHK0xiYU1QdGUwWkdBQVlMaEJrcFJ2Zy80THoxbVBOMHFYYS9ZL3UzWU10aHc0cTk3M3F4cHR4MWJvTld0MjdIdjBoSHRyeXBGQkJ1WndwY09pdDlhcVZBSURFci8vbDJzd2NoR1NHQndBaDVWL09COXRzblErMkw2djBvWjcxYS9wU2dMM0poMnZLbjEzV2c1cUhObStIeng2MEkrVXZCakRwc3doWVlZTUkzZk1KRmc4dHg4N2pUeXYzOGNhS2k1U1NBSDlyMjVhVHdyWUVDYVVDZ0c2QVB3Q3NYclFJLy9UK3IrTDBxVEZwMzFWWG5ZOTFMMXlyY1Fac1dIa09idHg0cWRiMlk3dTJTVHF5R1hPZHN3eUFWQ3pmUUdsaWh4MGNBZFRLWFlIYVZtbDN5cDlkVjRKWjZVT0VsOEtIQ00xMnBQeGRmQWp0OWs3NWk0R1ViOHBmTEsvOTduZ2ZaVkwrdWx2OFprcktYN1FUTWVmNGhUQUFKdW1yOXh2M1c1Z29Md0grYnJiMVEzRGJCMmV2dHdIR083c0QvbWs5bjNsbUg0NGZQeVB0WHJKMFB0WmhyVmJQeHhlL3FkaFFiMTMxUXFKWWp6dnVFbFBzQVRvVFR3RzBKK1V2UURBMzdBYW9YRTFhYjF2S1gyeW5LUkJJbEYzYjRkU1hMaWwvc2QyS2RxaS9yeElwZnlFUVVNM0MxZnVyVC9sYndWOFJ3RVNLaS95eTQ0d1FicGtWNVZqQWlnWGtsaTlmaEc5LzgyK1UrL3I3ZS9HWlIzOVl5cjVhclV2aEg0c3JMU29MREx3eUFOMEcvNDdvZWNJZkJPaXA5VnBWSUR1bG1LNkR6cmhUQU40WGl3RTgwQVJDbVZQK25GVjdhQnBCTEt4MzZMU0NMdUJoZmJCOTZReG1VMlpCYktkdFFGSGdZN3BTL21vN3BwUy9tRjJRbDIwRG1Qak5uTEx3NDVoTUZ1bDZJRllzSWZlaEIrNERVME43Q2ZEM3N5MFAxNVVCdmtqS3ZRNjRDK0EvMHk3NFUrbkpBWUFzVkZxSnQ4eWtETURNVFBsYitDaUV2V3ZLWC82dFZKYnlGOXVwOEdFTFp2ZnZTd3dFWkpzK0tYOTJXUUkxUkJDTGRueFQvb211NzZ5L3dHYjJlbDhpMUI4Nm9RQ0lQZ1BnelBJQS85SStMRzB6UDRkMmc1OUFxSlhUS1lBQWZ6czlMMTNPakQzOEFhQ1dhTVI5ck5MTmhsU2szMy9hTHpNaEFKZ3BLWC9XQjR2WFdadnlkL0VodHR2UWw2d1B3di9SQmhqdUtYOUFEMm9abW1vb00vQms5N00yRGFCbWlnaysrVm0vTS96Wm9JVnBLeHZBaUJmNXFjWXhLYWdubXNsQWdIOWJiQnQ5bExmdENoQXY0RmhuQUFMODdmUzhkRGt6YnZBSGtuWXk0RW4vY3lNd0kvSGdRbkxkYVJUWGxEKzd6b0haQUpPUTh1Y3I0Z1JtajVRLzYwUFpONFh3dHdXeHVOOCs1YytEbXMwa2lIYllURUtCblJJcGY5RmUrbEt2cEhlU0JjVnZOWTNwazEzU0tZQUEvN2JZTnZwd3R1MDBCaFBGc3ZjZ2JwcitxVjhIM0tYdy85US8vUThNRGZGWDJGNTU1Zm40ZzkvL3BXbUZmN3lwcGl4RHdCYlBCeGxDQ05Kbm1FOW5CaUQramhnSUp1czYrRE43SldnU3hxWUsvbmxRSlBnZ1JBMW00Z0JtUXBqNjVaWExJQ2o1RU5ydDZDTlYxSUtaOFpIM1pWd0hwc3N6SDB4dG5IeW9zeDBzL0Fsbk13dElSQi9KU255ck93TllicGtCZGJaTTg1eVdrUElYNFUrNVpRSGF1Vmx1bGs2NTVVU1hXNmJjY2xKVUNtQ3kyaFRCbjduUHZ5VmNCTWkrK1M5dnFMeEpkN3V2alFUNFYrRER4elk3SUxob1ZTQnVyd1B1VXZpZkhCL0hzbVh6NVFpOFRqQlpqekE2T2FYVlBYenFCSFljZkU3cjl0VG9xRlpYVjBkUjlJL3pUZnVmYW8rdzZRZ0FuRkwreWJyTitlT3FVdjdpdWptYllQWlJQdVV2K0JEYjdldERiS2Z3VTYwazVXLzAwYjBwZnphWVVXY2FxUEl1QUZDbS80cEFNNDN3di9uODlWZ3dNS2hWZkdqM0xod1prZStvc3JGdEk3TUsvc1hpRXh4WWkvRVVRSUIvTE4vZThoUyt2ZVVwVERXYjNQYTlKNDdqbzkrL3o2ajdtWHUraWMvYzgwM0pGKy9lSC83eGpLdW1LTU1yaUhjQXBIczdIUUM0WGl6RzdyVk8rVE9GYlh5b1llK2E4dStFRCtGSXNmV1JiOWI2VUFZWGdDTGdrVzJ5NjhwNkY4TGZGc1RDZm03MmJBL3R0cVQ4V2QwS0FwZ29paUJOT0pUQ1U0ZklteXdzVkR2elAyL1JVbno4Zy8rbDNQZWlXeTdId3FVRCtnQ2dHK0Z2bnphdVBCRFFCZ0RjVDdTTDRXOW53bEszRGZBSFZPM08rMTk2WWxnMk9NWGJPeGtBZU44eUJtaWhLVUZVTVZzVzE0VTRJbHZRQnhURjBHVGJJUWJPOGd6ZHdvZXAza3c3ODZLYXZsVDQ0TDRGVy9ncmZkajFwYzZINmlyL2ZOa0YxQXlJRlRhbFdiaGg1cDA2aytHc0JyVjIxcC9ac2JNcDJwRXpBTVF5SUhBYng5cVI5bSsxSWp6d3dCUEtmV3ZPWFk3NVM1ZDUyemJKcklRL3lyRkhNdVVvbGI0Tk1DNGU0Ry95NWF4YkFIOUFiTHZKcG55a2R1bzVBSlhjTXFhQmZXN0NEUHZNcWhCYzZJT05BakNiNmkyMmt3VS81MXFFZEhFNzJwSHl0L1lodHR2QmgrcEZQcW9aYzdibU1HUG05ck0yTllEdGZNcWYyUzhzcXdJWTVTa0FScXE0ZUxkVDUvdzdZWHUyd24rNnhSd0FCUGhYSTIyRVB3Q1E3Qm9BWGYrbmdJamZDNUJlVkFYUXRqOEtlRGFsL05sMTNleTVySStROGhkbnovRWZiYnJjT3VVdjdPZEFiWmRKS0lLL2JjcWY5V2tid0loMjBnQ0FDSDNuUGNBS1lnUC8xNy9nVnZUMTVJaTQ1N0ZIOGR6eG81WDRGeXBUVW4yV3c3OGNoRW9kRUpXOERUQXJQa2ZodjN6ZWZBejM5K01Cd2RkZ2J5L1dMVjJLWTZPak9EMHhvZFI5M3JMbFdESi9nY285QUdEL3NhTTRlbHJ4OWk1TCtPdTJzWHNwNHBjQmlXY0RnUGFlQXVpS0YvbXc5c3Y0Y0VqNXN6NTFzR2ZYQ2E5b0IzL0dzRDdnVWRnczhPSDZWRDg3VVBQTGVoRHpkbFRaQTg2T0Z0VEYyWVBpb0VTMHd3Y2U3RzJBVEMwQXhOK044K3lkczJLbisvb1gzSXJoZ1lGcy9lbTllNm9QQUxvZC92WlNUZVFuU09tM0FRSnpHLzRBY011R0MzRFpxdFg0UXMvWE1JVkd0bjMxb3NWNDIvVTM0cTZubjhUbW5UdVV2dTY4K1RiY2Z1VzFXdHVmdU9zLzhlWE4zMVBXVVRhbjNzSGVUaWZza0RhSngyMjdUZ0hNcUpTL1VBZWpEeE9ZVGZVV2ZURHJ3bWEzZG9qbDJiNWtnd3V1ZVlwMlN0bUU2VW41czh0Mk0yWXhSUzZueTduWmN4RmdNL015dEwxVC9rcWI0bjYzYXhiRVV3RHg3YTJFMTFmOHZvdkd4REtCUStVUzRBOUEvbWwyVXF5ZUEyQ1N1UTcvVk8vT04vd3RSa2NudWMyUFBQSXMvdUk5bnpQNmNoWkgrQU5BRFRXUWdxOGhQcENaZ1NmVnJUZ0FJRVFOckN4RVNXQ1R3WVNCRCtGZ1FuakFGVjFBcUFBYXlVMEJLaDhNL0VucWd6MUdTcHp2ejlxZE5aenhrWHVYNEUvRWR1UVZkTHVtUU94THBxS1NEN1pIUkI4Qy9JbldCM3Y4OGQ4WFRjNDVVY2pRcHNrL0Zwcjg3Sm1CS3JlYzdvY0MvbGtCRGJUdDRKL2Y1NitZcGJQcC85UU9UYXRQR2VESGJSRGhML2FGMkMrUktsMm5FZHVTbllMLzRHQWYzdi9lWDVPMnYvaTJLL0dhMTd3Z3JVd3BtU3Z3OXpSWldjRGcvVGJBdUVCM3dCOEFSa1lucEN2cVc2MEk0eE5UV2gxbjhZQS9BT1lhZ0h3UTErb0lnMTZWQVVCWHBQeUZPbFRwZzIyMlRjcS9TaDh6SmVYUExxdG0xMlZTL2l5MEdVL09LWDh4Z01ucktOb3haUStQRWVnMEFBQWdBRWxFUVZURS9YeFFFa1dxVXdEKzQ2YlBCWDlUelFiNm1qa2lJbXErTURIMU05RnM0cHp6bGt2NzVpOGF4dkNpUWJSMkZkc3A4bUhZV1lsMER2NFVxQkRvQmlGUXRNRDdGRUEzd2IvdE9nYTl3am9yWWMvUDZFZzJvd0dYU2dUNDRLR016TXdYK1lpQmdNS0hDTTJDMHdwZUtYOFhIMEs3dlZQK1lpRFZnWlEvNjZOTXlyOG9YYTRHY1ZaQUEzeTdXYjhaMmdVcGY5WU8yd2JXam1XLzZONEc2Q08rVi92ZitiNzNlUG41ek1NUFlXcEVuaGo5ZU84ZXZPK2V1OTNxb3ZHaDJWbUpkQmorSm1hVURRd0s5VTBYQVpwZkI5eEY4TGZXVlJTejBpd0JmNERwRjVFOEFBQ2FYU01RRjB0R3EyUkFLcHNCTUVLUXFaTXJUTHlmdU1mYXpOV2tkZm1DT1FjZlFyc0wwL0ZnNnNTdEM4ZTBaVHVjK2xJNjk1L3JFUDZQY3p0MHdZYnJjL0RWQUMwenV5Nkd0aFA4SFFNWXAyc1dOSDNCWHdPUWREYU43Wm5HUVhITThJVy9xM1RpOU1LY2hEL2tvYTk2YjNweFBnWGdDLzh5UVFNd1crRnZvVnNTL2dEQTNRYW90QnV2VU1vT2ZMR1VDUUNtSitYUFdiV0hwdmlkbXNEY29kTUszSzllYzFxQjdVdG5NRHVuL0MwQ2lnSWY3VS81aTNaa20rb01nTUtPQXRSeXZUSXZKWU1TY2I5Z1IvQ3ZUN2ZiMDZncy9GOTF3MDNvNjhuZkxuai9Fei9Gd1JQSHkvdnhrTGtLLzNqUmlVK1ZCZ2hPcHdDNkdmNTlmVDNvN1pXN3E3ZW5yakhqMzJBWCtBTnAveERsdm56MndBeDJvQWtCcUhjQUVGTCtPZnpsYklLREQ2SGROdWw0MW9jVm1BM3RjT3BMS1pzd1cxTCtpYTdMckYrb1Y2Rk42NVMvT29BUjI2QjdFRkQ4TEErZ2FFQ3RZdWIvbGx0ZXl0MEd1UDNBYzFJQUVPQmZ3azg1Kzh5Zzd5OXVyd1B1VXZpUE54cjQ3T2QvWDZ0Mno5WXRncGxjZDNSaUFpY01MNzZZbU9MUGxibkNINGp2QWxDWGpRdnpReE4vMUxrR0FDSGx6L3VRMm1rS0JCTGwwajdFZGhzaG5lc1Evbzgyd0hCUCtRTjZVTXZRVkVPWmdUKzduN1ZwQURWVFRQREp3OWNaL3NLTW5lWk95Z2N3Z2gxV053c0FqT01mVlM1UGQ5cC8wZUFRbWxHdnRIMndweGRuRGMvRDZZbHhUQ21mYzJEdkk5bFppY3dDK0x0QzBMcThLUUJnckhVZS90N1hDbFFNZndENDZoT1A0NnRQUEc3VTBlbCs3QnRmd2NlKzhaVkNQWld1alQ4QThTa0FhWi9PRnNrT1BrS0lVd0RnZXJFWXU4NkIyUUNUa1BMbksrSUVabE5tUVd5bndvZXlid3JocjVqcEpuK3FTdm56b0padHFrRXMyOUdmbStmclhSVEFxSU1KUnp2YXZrZ3lBTUpGZ1BGM0wvK21TM09xWXZnRHdCczJYWVBlQnNGLzRGdmM5aXRXbjROMzNYd0wvdVdSSDJMYmtTT2xmTXdwK052RHlnZUtST0V4azhJTVFMZkQzMGJIU2JkcStDZi9paVErQUFrenk0by9iZnZhKy93eG9JZG02WlIvdnFBTktBcGh6L3VZRXlsL0Z4OWl1dzE5NlpQeVo1Zkx6Smpac3BJZEoxRFBqSlMvMm1lK1hQUXVnRXFrQUhRN0R4L0FVRjkvdGo0Mk9aR29tUlhIeHlmeHJuZjlvN1Q5cm04K2pMUFBYZ3lzSDFCb2lWWHJFdmhEZzVKOHM4MEE3UWxNVXdCQVVXY2ZqT0lpQWY3MmVsYTZCWG8xSXJ5Mm9hQVAyZGxXVVFiQUtlV2ZyTnVjUDNaTitiTlE1UENxRFRiY2ZaUlArUXMreEhiNytoRGJLZnk4aXA4WllBNHdiQzc4NjlhVWYyYXpaQUFqOTRYWkRtVXVBcFFDWmNONFlUMStXb0R1ZHovMVVZVmFzV0lVVWV6ZmYwemFmdWJNT0U2Y09JUDVNQWNBM1FUL1JMd0JYdGFXK1hYQXN3aitucFZsRm1jbi9ObGxraXp6d1FDU0F5K2J1M0YyVEFHQTY4eVJxd3RmU0F1VHVaYnlaMzJJMzRPVkQ2Wmk1VlArc2sxMlhWbnZRdmpiZ2xqWXo4MmU3YUZkSnVYUDJlRXVnbVYwS3doZ25PMVFIaitxMHloUnBLTkY5b1AyRjA5MXEyc0xTbGV0NitBUCtISlBzR0pka0JCQ2s0UE82emtBZXBVQWYxczlLMTFMdmZ3NUFEd0FDS0ErOEpoWmlDNEFzRGwvM05hVWY3SXV4QkhaZ2phZ0tJUTkzdzZ1TDRWMWEvalB5cFMvd3FiUXpxS1VmNzdzQW1wNXhzd3VjN1B3U2xMK3BxQmw1cVQ4UlR0UkZDbCs1MUFMelZTTEpjQy9iYmExZm9ydDJ3Q29raWhCbEVwZUJnUUUrTHZvV2VrNjZNV3hHaEUzSmdNZnlZTUJVS21jS2dDbzVQeXhTOHBmTEM5QWtTdXBEVFlLd0d5cXQ5aE9GdnljYS80WXQybEhPMUwrMWo3RWRsdjdzRS81WjJzT00yWnVQMnRUQUtWNldRUTFEMTlkSUtDRlA5c0cxaVlUSkh0ZnMrQnFoNm0zZEEyQU9FYnlrWU9kQlBpM3piYlNqNjN0Y21ndnBWM3FYUUI1d2RrSGZ4ZmRYN3JxYXB3enVBQXRSVnF1djY4SDM5KzdBNXQzN1ZUNityWHJYNEFocW41V3dOQmdINzcwNUdQWWR2U0lwS2V1dW5xSC9vMStoUHRJRitNdWo2Y04zSHNFSEdIUDdyVk8rVE9GN1FNS2hROW12VGdkNytjanBQekYyWFA4UnpzTDcyREt2OUNPWmNxZjlXa2J3RmoxQld2SEl1VXZ0a0VNQUNobEk0bmt1MWNDUmpONEJQaTN6YmJTajROdGY0cVZsOUlaZ0xrTy83VG9tMy81ZlRoK1hMNmYvNmFiTHNXTGZ2bDZyZDdZMkFSZS8vcjNLazIvK1UyM1lzRzF3a3N6SE9FdjdWTVVZd2RGOGJoTU13QmQ4U0lmOGJqeDlWRTY1Uy8vYnFZcjVXL3k0WHFMbngybytXWG5HVFBsYXFLWVBZdWdWdFJidVN6YXNjaElzUFYyN0plaWF4YWlLTXF6YzJXWjNtSDREdzMxNDl2Zi9CdGw4YjYrWG56eDhSL2IrZWdDK0NkU0dkQmRiWnF1QVNnMDBDM3c5L1ZWbFo2eHpnU1FYK2hESUl6MHljRVpiMkFIeTFxdDFwWmJ4cnhUL2tJZDlKQXVBTE9wM3FJUFpsM1k3TnlPOGlsL3dhYUxEN0hkV2g5aUlNQzMwdzNVUExTVjk5cXpnTTNzektTVVA3TmZXSGE2WnNFbWdHRjEyWHF6ZGlqTnl2UGZVYmFVL0pYSEJXbExoK0VQQUovYy9BUGpFTmpLdnBjQWZ3RDhvTlpobVYxdkF3endWK3J3MzRXdWZMcWRIMEJyOVZxK3R3RDI3TjZaa3ZJWDExM2hQNXRTL3F3UEhlelpkV1c5Qzc2djlxVDhoZjBjcU9VWk03dk1xQmpoMyttVVA5OHZnaDJQbEQ5Ykw5VXpBT1JmdFQrZ2k5WEsyVzVaUE1NZ3dKK1RhWXNBdkFLQUFQL082Tm5BSDRpZkErQldqM3hncTlYcVdwak0rcFMvVUFkdkh3NHBmeldrL2RxaDg5RU5LWC8raW4rRkhTMm9GZlZXTG90MlROa0RjYjlnMDZKZmJPRVB5QUJsZ3h1ZFpDWFM0MlNhNEYvYVIvZkJueFViZ3BqS09CTklGUUFRNFZQWTJWM3d0OWFkSnZnRFFNMzBsUkgrMkV6SGt2UzdxTmRyUE9BY1lLS0RQYnV1aEkzZ1E1M3lWL2h3QWJOd3pMUWw1UytXWjhITWdwOXJYbkU3TzVIeVozMVVudkpYMmhHQXptVVBJQUJmaHJaM3lsOXBVN0REZ3BxMVV5S0E4VDUxUUNsb1pQZWMvRnlvY2RYZVNvQy9sNStTdHNWRUg3dXJuT1ZpNmNqYkFJSFpELy96MXEzQXlaT2pYSHB1YUtnZnExWXUwWEEzM2xpcjFiQnUzUXJzM0htUTI3OW80VENXbmJVUWs4cHEyTU1maVB1V0pCQ1Jkck1IWnpvNW9NZ0dPY0krUmRBVEpyUDJSVDZtNEVKYUY0NWh5M1k0OWFWbHlyL1FoNklkdW1Dajh5bC93VTZGS2YvOG93TUJqQWh0UUxMak11dG43ZWhUNktSd0hQVWxoZ3FhZi9mVzM4UlFYLzdVdm8vZjlSVTh2WGUzcDRjQS80cUZvSUlBd1hTZXY1SzNBUUt6SC80QThPRVB2UjFEUTMzY3Rzc3VXNGZmL3ExWEtremx1b09EZmZqd2g5NHVsYm45OXF2eHV0ZmRaTlF0cW1PK3VTWVZJNnErb3pRZi9KUFBlcTJXSFVxRWdRbGg2cElIRm1LUVFZUVpNQkhBekZvQi8zMmFvSm1ia1lBV3J6djRLQUgvN0JkRzVIYXEycEgyTzJOVkJyTWwvRmtmSkRQTSsxQitYMnk5VlQ1VThNOENRZ0grRkJ6a2tsMHhxQlR3cDlreUR6a2VlREx3T1loUzFnNERZaXJEbjZiTHFSMUZBQ1BDbjNMTGdwMXNPUytiMjJIN1JRTi81dUk5WC9nRFFDUzhLYzlyREhRUUhaZ3ZYSFV1TGpvbi96OXZZTEJ5SDhuT1NtVDJ3cjhRa01Lb1haMVlQUWVnMitILzVNRURPRG82Z3Fid2hxN2pZNk80Yjl1ejJIdnlwRmIzMFgxN1FDYmxJMlhmcVpPNGIvdFdIQjhiMCtxYTZzanRxdFVVQjJNT1NVSWd6SkR5ei9naXdQYWsvTFAxNUk4NUVGRDRFTUhjanBTL2l3K2gzWDdwZUxtZDNpbC9zYndob0tncTVWK1U1dGJPbU9kNHl0OTh2dCtjOGhmN1JaVUJ5STg3V2pDbXVvMlpWbW4va2hMZ1h5RHRqZStNMHJhM0FRSnpBLzRBOE5UQkEzanE0QUUwSXprQXVIZmJzMGJkUi9mdHhlVElsTFI5MzhrVHVLOUFWMWRIZVRkSE5GbUJHYWk1cjRSUzRTSkFGVXpFUUVDQUlHUFVIbEJFcUF1LzNyYVV2OWhPVXlDUUtKZjJJYmJiQ09sY2gvQi96QUVHVjIveCt5cVI4bGZNbmtVNzNIN1dwZ0hVN0xJSzJ0N3dad0diRmFrb2dCSHNGTDVhbUswMzJ6NmhEYXIyaTY4Q1ZncGhHdXdwQWY2ZWZ0cmZiUjBUWXdBUTRPOWlxazI2RnZBblJKVUJFSFhqRlVwcGtsNk9KVHNGd05URC95cC8xZ3FzNGU5MExsNmFvVmZuUXdkbTNaMEVMSWlkd1d6S0xJanRWUGhROWsyQkQ5ZXIvTmxsUGFqMTBEWURUd0ZZeGs0aFlKay9wZ0RHTG9CUTFKdTFvKzBMMDZ6Zm95K1NuZHBYQVF1bm9oZ1Y1OUVud04vVFQzdTZ6ZlQxK1lQRlFpcC9HeUFRNEYrWnJnWDhzMDlDczYxS1E0US9oMHFUWVlQVWlCb2VCdGl6Nnl4c3NuVmxJR0Rob3hEMnJpbC8zcWF6RDZIZE5pbC8xZ2VIZEZ2NG0zeUk3VGJZOUVuNXM4dWxaOHpXS2Y5RVZ3Rk5NN1Ria2ZKWDk0WGFweG4rV2pzVy9jSUZBTXl4d1Q0Z1NONXRUeVlyK0pjRVhZQy9td2NMYVVzZ1VPbmJBSUVBZnh0L1ZycVc4QWZpNXdCRXRBV21NL0p5NHF5Qjh2dXlad2hvSVcwek8rVUJwWnlwS3RiTjJRUkxDR1pGUlp0RktYL0JSN0plMm9mWVRrTmZzajRJLzBjYllMaW4vQUU5cUdWb3FxSE13Si9kejlvMGdKb3BKdmpVejVpdDRNOENsclZaUlFEamFvZXR0MUFYcWQ0RmZTRmVBMENTQzBCTmtnZms1bklCL3A1KzJnVC94TDdxQ3paOWtTNWxqV0tDdkxQUnVRci9LMWVmZzVkZmZBbDY2bngzTFJ1ZWg1ZHR2QmhybHl6VjZqNS83VHJjdXY0Q2FmdmFKVXZ4c29zdXhsbkQ4d3JyS085V0ZkQkZHZkYyU3RNL1FIdzB4N1AvdElnZUppd0VpUldZVmZCbmZZaFgrYlBaaEJod3JBK2k5SkV0NjhETS9LUkVhS3A4c0tkRnBLdjhtWGFXdXNwZjZFc1YvRE1mQXZ3SjVIWVV3NThpQnhLN3JJQS8xY0NmaXZDbitYNEovbFFKNm53NWg1d0ovdHdWLzZ3ZG1pK25kY21BbjY1emJaQ2huZjhNUkR0TVg3RHdweG83V2I4b2dwWkMrT2Q5SVFkQ0ZGSFJjd0E4aDlrQWYwOC83WVIveHYvcGtjb0NnTGtLZndEWXNHdzVoazhURVBFTm5RMWdlV3NBS3hZczBQcmJ1SHdGZWsvS1AramFSSVRuOWM3SG9zRkJTY2NrWXAzajl3QndWT0JLWjhuK2hNQnA2aCtVZ3RScUVqUTVDREwyZUVoREFXWUJtc3lDOWJsNGtnTXQ5NUVEVXI3OUxxZDhHUjlzdDRucCtOUUhEMmwxZ01IVVJvYS93UWZYbDZ3UHNaMkNEeUw2U0ZaeU9QR0Jud1FueXNNcEIxNXFSNFkyRDFDK0xHT1dCelczbk9oeXk0SWRwS0NtakowTTkrb0FoZ3RhK0FCQ2VidWpzaSt5U0VJTjdZSlRCOHIwUDlzR1piL2tBVXhhci9RaVFFTHl1Z1BwMWY4azg2MFV6ZmdSNE8vcHArM3doL2lkdWNLUUNKOU9ZbnFQclBVcGdMa00vN1RZSC83eHB6RSt3Vi9OLy9UVGUvQVBuN3pMcURjeE1ZVS8rdVAvSSsyKzc3N0g4WlgvM0d5c28yeFNMa0J5UFBCN3RkOEp5UTd1ZXIyZWxUV2w0M1ZQOVNONUFRYlNNckRTMmtrK1JEQXJiUElRekp1V3paNnpBSU1CYzdwbThzRzBJOTFvZktwZjVnT01UY0xCUCswQUNjdzJQcGcvZVI4dzdWYjR5R3FoT044dnpuUkZPTkZzT1VPOGNxYkx3U2xaNXdIS1F4c3M4Q1JRTS9BRkZNdUNIV1k1ODYyeXlRQmZTdFVMMEJZRG1OeVVKb0FCaEg3SjZ5M2FvV2tibFAwaUJFSk1BQ0VHTURiUDBzK2xtRkFCL3A1K09nSC9XRHdCV2w3S3Z3NjRDK0R2TEQ1Nkh2QUhrdGY1c21BRkFDcWJTMmRaK2FCRTQvUC8zT3hVbkQxREJqTUVvS2tBbGFzcGJBcFFGdGM3NGtQb1RWc2YrV2F0RHlYNElZQmZiS2ZDaDdMZW9nK2gzZTE1cWg4LzAyWExGcWU1Wlp1NmxEOVRsQWUrcVEwTXRQbGd3ckV2V0R1VXgwd1ZEL1l4OXlsdms0S3FYd1prT2M2SzQwU0F2NmVmenNGZk5iS2J2dXhLZ3dXckJ3RnBDd1Q0VjZQbkNYOWxQN0tnb1RTZFNDS2JLZFpJZGdEV0REQnhmdzF1dnFBUEtJcWhtZnNUMnVZTGYxTzl4WFl5Tk5iQm5sM25lc2dXL2tvZmRuMXA4bEhGaTN3cWYvVXQ1V3JDelo2bGV1Y0ZMQUFxMnVGVC9xSWQ1a01Hc1ZXL2lHMFFmVHIycjdKZjh2MjYyd0NMaHhZcXJKV0QveGNmdUFlOVBiM1ordjVqUnhYcUFmNU85bFcydldCWWpSZ0NBT2tsOC96ZUFQOXE5RXJBSHlqNEhwSmRsSFhESElDMVdsMnlZUU43NVV4VnNXNE5aaVVFMWRCazE4MlFMbTZIem9keDFzKzFVN0RwNGtOc3Q5YUhHQWp3MzVjYnFJdG56Tnorekk0RllETmQzVXhYOUdtMktiV0JyVnVuQWhoV2w2MDNhNmVTdnVEdGlJOENaaVcvTGlBTzZObTZzTC90S21iK1gzamd1d1hxQWY1TzlyVzJwNDMvZmhtQUFIOTd2VEpmYlJIODQ4VWFzMDFWUHUwODl1aUxEOGI0SWtBRC9FMWcxc0tlWDlmTm5xMThaSFlVWURiWlZBUWJQS1R0MnFFTE1KUmduak1wZjJGL3dVeVhYV1pVak1DelRmbXpQbTBER0xVZHRsOEVPeDFQK1J2c1pMNkxyZ0ZnRHdMR0oyRnNGa2xKME5uQS85VTMzc3k5UCtCN1R6Nk9YWWNPbFBNeDUrQVB3QjRUUkxQc1l3dUE4VUZBNm1zQXVnMytxZTdOTjEyS2taRnhhZi9HamVjYXpCSDA5TlR4NHR1dVZPN2ZzR0VWRGtNZDdkdkFIMEJ5RjRDd1E5ZGNTcEVlaVlTUStQcUJ6STRoRUVnV3Fqb1h6MEtUOWFGNzRwNlRENGVVUDlzbUNjd0tINFJYdElNL0c4QXdmL2grVmRnczhGRkZ5bCtHRTcrc0I3SEdKdVZxNHBqeVYwT3pPQ2lSN1VpQWRleVhxbEwrckUrNVg0UkFpR2xEaTNrVWNIWW9aYmQ0Y01ZVllqSFdkUUQrQVBEcUcxNklzeGN0enRiM0hqbHNIUUIwRWZ3ZGtWMlJaaUp1cndQdVV2anZPSFlVdDk1NXZWYjF5WVBQNlhWUEhzTXJmdTBXcmErdGUzWnBkVzNxV0dQdlIxTW84SU5hUE5Da3k5bFRBRzFUL2xsUk1SQkl5dmlDV1RnK2JGTCs4ZmFpb01VU3pDejR1ZVlwMmprTktYL1doMy9LWHcwY3RSMEI2RnoyQUFMd1pXaDdwL3lWTmdVN0xLaFpPeVVDR085VEIwSy95TTlMMFBXRktSQ2lhT21lQTZBZHloem8xU0g0Vis1anJzSWY4czlkWGFROVluMEtvRnZoRDhRdjlIbDAzMTRyUFZIM0J6dDNXT21vZEYxOUNkOVl2c2dOVlBtNXcvUXVnS3kwY25hcUFCUjRhTExyaGVmaVRUNnlvZ293bTRJTGFWMDRYaTNiSVlGWjRVTWZDT1ErQ1AvSDM0ZlE3czZuL0FVN0ZhYjg4NDl5QVl5cUw2UUFSb0EyT3liUGhKUy9hRlA1TWlBQkpLckhBZ01GdzB1QXYreG5tdUZmSUw3Z3Q5YXp5Z0IwTS94ZDlBcDFLNFkvQU9ZVWdLQmduQzNFUjJaNkNrQ0NkR2JDQXBvdVlHNUh5cjhBek5ZdjhxbkloL0ZPQXJHZEF1eE5QanJ4SWgvZURnL2ZkcVQ4alFHTWRWQWk3aGRBcklYMnpFbjVpMzJoZlJrUUFQaU94ZE1BLzdISkNZeE9UR1RyRGNQRmpWb2YzUUIvWDh4WElGa0FRR1RLMTVMdGZwWUQvSzEwQ25VdDlQaXZTS01nSHBDVW9sYXJ5V0FtUW0yVWdVQlN4Z1ROZHFUOFhYekFBR1lXL0l3Qm0zWjZwL3pGOHRwQWdQZFJKdVZmbE9aV2d6Z3JvQUcrQU5pOE9PeWhQYjBwZnpQOHk2WDgxUUdNT1JBUyt6U2k4cnNBcE4rYVRsVGo5VFRBSHdCKzQrL2ZWODVITjhBZlFFRlUxOWJ3d0hnS0lNRGZUcTlRdDAzd0I0QWFxV2RGNVdBZ3RaTnZwRFFmc09PSENNM1FsSCsrV2VGRENBUVNaZGQybU9FdmdOa2w1UysyVzlFT05meExwUHlGUUVBRkgvWCs2bFArVnZCbkFac1Y0YUh0ZmMyQ3RSMUZHOWoyQ1czUUJ5MzZ2bkRPemxEMUtRQktxZCtZT2szd0wrMmphK0J2TFVTenJDdGpKZnE3QU5TNTVXSUo4TGZTS2RTMXFnNVI2aE53UEZJT2hBRHlERUJTdHQwcC95cDk2TUJzbmZKbjFrdWwvTVYyMmdZVUJUNm1LK1d2dG1OSytWc0FsdmxqQ21ES3AveE5mVEV6VXY2c2Z5a1FTdXdZVHdFd1lvUXpZOXRYeXNML0Y2NjdFY1BNYllBUFB2MEU5aHc1Vk93andMOWpVdnBSd0p3RStGdnBGT3Bhd2g5Z1lLVEoxbVFoQXFGWktwRW1Qd2RDYWhtMWVFam5DN3JaYWZVcGY5Nm1zdysyTHdRZmhQa2p1TTU4MklMWi9SWS9NUkNRYmZxay9ObGxOZVJNd1BGTitTZTZDbWlhb2QyT2xMOUhBS08wWTUveXQrOFhNZml4RFlUaVpkTzdBTGpmQ2lNVWxOOHl6ZkFIZ05mZmRCdDNHK0NoRThlNUFDREFQeEV2YUZZanBSNEZMSllPOEMvV0tkUjFnRCtRWE1rdmQwanlSelJHT2UzNElzQWNpaXhlWjIzSzM4V0gyRzdlcmZaT0FzTC8wUVlZN2lsL1FBOXFHVGhGOE9IMnN6WU5vR2FLS2VIVXpwUy9kd0JqYlVmUkJyWjkyZ0RDdmk5OFV2NXNtQkdmb21PZUErQThESlBTb092cnFldXYvYUxBVkxPSmlKWnpFdUNmUzBuNnF3WjZhNmttQXhEZ2I2VlRxT3NJLzhKNkFNaVB6cVFjelFlci9DSkFQZnhEeXAvM29RNTRlQi9LdmltRXZ5Mkl4ZjMyS2Y4aVVLa0JXbUNuNHBTL2p4MjJYN3phWU5rWFJmM0wyV0g3aGJVamxGVUZNT3cxQUJSSWhuZ0M2S0Jjb1ZCUS9PYnpiOExvOFRIbC9zV0w1K0dMVHp5S3ZTZFBsUEtoMkZpNXpBYjRKK0x5eFZaNkVKUVBBTG9JL3JkZmRTMmV0M1I1dHY2VEhWdnhreDFiQzMxWitmV0FQd0FRNW1sK0hIbFpVVVhybEtKV0l4S3dkSUN5U2Nmbis0UzZDdXZXOEo4cktYK2huVVVwLzN4WmhCTVBDcDhaTTF0V3N1TUU2dG1hOGpmWXFTRGxMOW54Q0lUeWF3RFVnNEwzeGRrRmt0YnQyTEhUZU51YjM2OHM4L2IvZmdkd1hyK1Z2ZDJIRDJKMEluOTY2cG54OFFCL2xiUXZyaXUwWE80VVFCZkJId0JlZU1tVnVHYjloZG42VkxQSkJ3QWRocis2LzdscHB5VHhEeU0rY212MW1nSll5VjhXbW9VejRLcFQvb0tQWkwyMEQ3R2R2TnRxVXY1R0g5MmI4czlzVmhIQXVOcGg2eTNVcFd4ZlZKSHlGOXZRS3JoZnZoMWlQT2Z2S1gvOEw1OHM5dEh0OEFlZ0dheFZHMG5CZm1meHp3QjBHZndObXkxMkFyMjFubmpHblVncml1S0xmVXJBSHdCeklaK2hFdkdWZjlsZ0V6OEprT1lQQW1LaHFaZ3Q1NWFGZGFzWnNBTE1UajdFQytZc2ZURGRVVDdsTDl0azE1WDFMb1MvTFlpRi9TelFTb0pLQmRCQ084YlVkcmtBeHRrTzVaSFMvcWY2OFRhclN2bUxBWXp1WlVEcFd3Qk51UGJKRHJRRC9sWStBdnhUSWNKbng4UXZBT2hLK0J0MEM4d1NFUHpGRzkrR3E4Ky9JTnYyK2Z2dnh1ZnV2OXVpT25yNDgvdUp0RSs1SVFzRUNBaXBsVG9YbiswVGp3ZGh2WE1wZjk0bXU4NGgzUmIrU2g5aXdLT3dXZUREQkNyNzFEWURITW1PeDR4WkNXY1RxUGxsUFVEMU5sVjI5SDFoMnk5aVg0ZytIZnUzSUdpUit5WHo0dFFYckowb2tnbERBS2paVGpYTGRoTGc3MmkvRGJZck9xUGpaY1g5RkVBWHcvL00rQmhPakp6SnRrOU1UVnJCMzFlSzRBL0Vkd0VRZWJOR2FQNDlFTUxkUVdBTlppVUVOZEJVekpaRiswb2Z5WHBwSDVsdXZzRDFrNjBQc2QwT1B0aUF3aTIxVFRYUTBNQ0p0VmtFMkV5WHRhT0hacEZOcVExczNSd0NHTHQrc2JERDFwdTFVMEZmdENQbEw3WWhpbHFkdU40dndOL1ZmdnU2cStqYjF1MHZmWlM0WlFDNkdQNEE4SGRmK2xjckhTZS9McnJhdHVXZzRvS0JaSUZTS2d4cUZLQVU5VHAvQ2tBM2U4NU1tZURQUXBDeENZU1VQK0E0UzdSTytRdjdDMENsQW1naDhDeFQvcXhQMndER3FpOVlPM00wNWM5c0JrQ2xCd0VWWFR2a3d5VVQvUHQ2ZTdCeDQ3bDQrdWs5M1BZVks1Ymc3TE1YWXpmVWR3aFkrUWp3Vnpsb2gxakJ4M1NlbjRocjNReC9XeDBudnk2NnVqcW1EMnhVOUZrV0VKQ1lURlE0MEdxMW1oTCtoRm5QQWdxU2JZMjNFNExTOENleUR4SE12SSs4RG15OUNSUDFTUFYyZ1g5bW1JVS95ZnBTaEwvUmh3citOUHZEQTQ4aUIwUUNoMnhaQVgrYUxkTU1HbFFCUE00T1V4Y21CcFNBeDc0dW1nVTFwWlNEWEJaU1pzc3k4RVg0VThGbTFoYzB0OE8xbFdyZ1QybEY4R2NEWTZZTkt2aFR4ZzdYTDR4TlRWL3cvU0xEUCsrWGVKOFlBRWh2L1NQOGNTdnRMQkRqeko4Q2k1Zk14NS85eVJ1bFhYZjh0MnR4KzBzMkZkclgrZ2p3VnprQUxRT0xrbUtYQWVneStPdjBicjE4RTFZdE9TdlRlWHpYZGp5K2E3dWZYMjExN09FUGFBWUNOdTBNbWdjQ2lhMTBQS25YMC9jSUtNRE1sT2RxSlJ3TGJLcWNYUmMybSs4a1NOYU5ZRllGRjR3Qk9SaVJiVTVYeXA5ZHRwMGxPajBIWHdDY2Vsa0IyTHdJWjZmSUpsTk1zQ25ZS1pqcDJ2VkxSWGE4KzBJVnRKajdvakFvTVg2ZnBpY0JsdWRFRWZ3QjRMNnR6K0xNc1JGcDk5WWpoM0hYMDAvaXhMZzVBeERnYisxQTkzMm92bWhTc045TGlnT0FBUDlNYnJ0OEU2NW1iZ1A4SENBRkFKMkVmN3hiZkE2QTFJa0E0b0VtbldrQnlZRkhpQUJtTVJBUWFtV0NKZ3RtRnZ5aVRXbGRDR0pZSHl4b1JSK01BZGVVUCt1RDhIK1VQdFQxRnVFLzgxTCs3TEllVklJZFJXbzcvNmcrNWMvM2kyQ240eWwvZzUwMnB2ekZ2cUJNQUpEK051UkFueXBYVGNPRkRmd0I0TkY5ZXpCNlRJYjh2cE1uc0hubkRvT0hBSDhIQjFrYjFDTzJhcGUzRUdoYW93OEFTRHF1QnZpYmRLejByYXJqRG45QUhCaUljakY5U2pqSmJrT01qNFY2cmNZVWxhSEptdEU5Y1k4cENsdjQ2OEJjZkI5K3RUNDZlcFYvOHNjZjFMWWdGdTBvQU12YTBZSmFEMjM3b0VSamg2MjNvVi9VQUJYYm9MQnBZWWYxS2ZlTENHcFRBR09DdjMzL3N2Vld2UXpJeUNLdXd6VkZMT0ZmUmdMOHJSM3dmV1VHVDFWQmdGSk1BVUF0d04rc1k2WGJSdmdEeWJzQWpHVkpIdjlsYVlCNGUvd2dJRWl3dDAyVnMrdkNaaG5NblVqNUM4RkJKMUwrckk4eUtYL1hXV0tteTJVUEdEc1NxUFhRTkVQYk0rWFAybkhxRjlHbkNmNldLWDh3ZlZyVUJxYXNGdFNHWmR1c2lxcmU2YklVQUFpQk1mdDl5S0NTQjRNQWYwZjduWVQvTkl2K2RjRHdlQjN3SElmL25pT0h1ZGRiSGoxOWFscmhIeWRwMGx2NXVHbXcwUkJOZ29GYXJjNkRXVGtEOWdDemNZYXVuK2x6b0MzeUlaWTN6TWhaSDRULzQzOWFRUWcydks5czV3QmFCQ2N6cU5sbEZiU2Q0TzhZd0RoZHM2RHRDN1dkYVVuNXMzMmhzNmxwZzA4d3gvclh2UTZZWklFOEdHZG1DZkIzdEQvejRlOHhLOWRMcFc4RGpEL21KdndCNEIrKzlWLzJ1aDJBUHdEVVRGY0RzNXhObnY3SEhuNDFEdjdpRE4wU3pFYlltOEhjOFJmNUVFN0xQcUFvOE5IK2xMOW94d1E4VThwZkExaXBYcG1Ya2tHSnVGK3dvKzJMbVpIeVovMnJRQzNEMy9HVWlxWmZxQlFBeEsveVRvdXhSNStJRXk0bzlZVC9TemRlakROSFJyQVpQK1MyYnp4N0JlNjQvRXJjdDIwcmpvK042bjBFK0tzY21MNlBTcUh1SXFaWnZ0UGJBT09QdVF0L0oxMnJwcFNIUHdEdGJZQ2NVQkg5c2RScTlReitCRGtVMmR2dlNCWUk4UEFuUmZCbmJ2RkxGVTFnVG4yd00vVE1od0IvcGpaNkg4UUcvbms3d2RSQnNxbnhFWjlSNGFGTjAyVUJPUEZ5c2o5UnlDR1hmeitTblRSc1MrMVExaVpqaDZaMmtPMVBJWlBaWVZJTjVpdmJMZUZQRGRtRHBCTWtVR2Y5NGdQL3BHNEtFSE8zS1NyN1JRYTFDSDhxTFdlOW45VTd0NU8zVCt5WCtGWkt1WDNzY1NHMWdlWmxsWGNCT01LcHpMTlpNSFFBQUNBQVNVUkJWTXgvL2VKbEdOMTdSdG8rZVdJU1N6R0E0YjQrdlk4QWY1VUQ4L2RSN3FsUHBaUXJlUnRnL0JIZ2I5TDcvUDEzNCtzLzNwenA3anQ2Mk5xZjFqZUpBNEFVaU55TU5aWDB1Q01rRzBUanlVVDZOc0QycC93cjhaSHA1Z3U2NElMMVFmZy9BdnpWN1ZENkVBSWVjMnBiaHFZU29NaUJ3KzFuYmFvQUt5MkxQbGxvaWo3Tk5obm1DbmJZTmpCbDJUWVU5b3RzUnovelZyU0JiWi9RQnFhWWRWK1VTdm16Tmt1bS9NVitrVE1BdVdUSFlIWStJSmQ0alpTQ1B3Q2NQRG1DRC95dkwwdmJ2M1BQVDdCaHd5cmd2UDRBZjNzSDV1OGpGbHQ0RXNmbFFpbjlOc0Q0SThDL1NPL3BmYnYxdXA3d0IvaFpibG9tSGh1RWcwNWNSL0lnSU1iZW5FdjVNNVhYK1dCdGFuMUk4QzhBc1F0VXNpSnVvRktEV0xaVENGam1qenFZNE92Q0x6dmFtWTZVdjNPLzhHMWdmWXFnTnR0eDZ4ZTIzdHJuQUJobmlnV1FxUkJ5QWY3V0Rtemc3MGJzaWsyVmVodGcvQkhnWDZSbjFMVnFodFJ4bWRTNGZXSXdrUHpoQnV4OEVJd3ZBdFRQeVBOMUhzVGl1Z1RhWkYwTFpvc1pPZXVEUTdvdC9FMCtNbE5pd0pPVTRZMW0rOVFwNld5VEFDY2VGTjZ6UkJZa3JCMG5VRnZNK20xc3NtMWc3YWdBcStnTHRjK0NBRVpueDd0ZlJEZzdnRnJYcCt6M0tmV0wvWEdSblNwZ253T0ErRGhsUVNJOUdiQkkyZ201TnRudkZ2Z0RTQWVpQ3VNQXdicWhwZDV2QTR3L0F2eUw5SXk2SmVFUElMOEdRQUEwQUc3UVN3OEJGblR4YllBYWFGck15TFBObnJjUmVxZjhBVVUyUVlhOXVPN21vM3RUL3BsTkRhaktwUHdMN2JEMUZ1cFN0aTg2bi9JM3dWL2ZMK2xkQUxvSnY5TXJmd1A4MWZabkN2ekxTZW1nd2V0dGdQRkhnSCtSbmxHM0F2aWI3TWNQL1JIMzBYd1RwYWpYNnBsZEZ1SGVUL1V6bklzMyttRGFWajdsTDl0azE1WDFMb1MvTFlpRi9TelFTb0pLRFZER2s4cU9ZbWFxQnJVY2xMREwzaWwvMWc3bGg4UzUraUlmMjM1UkhoZUp6WWpxcndGZ2o2NVkrTjg0OSt1WVp2aGZ1K0VpOVBYMFp1dGJEK3pENFpNbkNrd0crQ3VrTk9oMTR2dzJ3UGdqd0w5SXo2aGJFZndCeEJrQTVZd2dSVnRNTmdyS3dESStRRWt0Qlo4NFEwODBUZkNmbFNsL2hVMmhuVVVwLzN6WkJkUXlLTmhsRGo2VnBQeEZVUFBMZW9EcWJYSjJDdnZDdGw5a08vYndkMC81eS8yU2VhbW1mdzE5b1dxL3JpK2lsdTQ1QUlROW9zMllLY0dnd2NGK3ZQSVZOeWozWGJCaE5SNXJIYkd5Ly91dmVTTVd6NXVmcmIvdnkvK0diejM2STIzNXJvVy9PcVZUQnZyV3V2WUJRSUMvdFo1UnQwTDR4N3RxNGdhdEFxWGdCckg0SWtEN0dYbHUzZ0IvWlVCaDRTUFR6UmU0VnJUOXFYNzJLZjlzalFGRklYelkvYXhORldDbFpSRk9lbWdXMlpUYXdOYk5JWUN4NnhjTE8yeTlXVHNWOU1Wc1NmbUxObFVaQUVJSTFPZitoVzFFM3VRcXo1dzhqQnRlZlpWeTN4U0EwN3NueWpsUVNOZkMzMTZJWnJtVTJKMENDUEMzMWpQcVZneC9nQWtlVmUxUG52MmYzaU10NnRXU1V3QWg1VzlLK2NkLzFQQUJEeFVXYUtxeVdsRExvRktCb2hCNGxpbC8xcWNNcDVEeXR3VTEzNmUyL2NLRFFubTdZK1FPRWdxQVZBU2dCN1p2UzJ1aWRsU3hkRHY4eGJtT3Z4bDNLUTRBQXZ5dDlZeTZiWUEva0x3TFFGUlM2VEhwZjVvY3NMVmFyWU1wZjk0bXU4NGgzUmIrcGxsL2JrcTJXZUREOWFsK2RxRG1sL1h3NGUyb3NnZWNIUzJvRmZWV0xvdDJMRElTYkwwZCs2V1NsSDlodjRpZzV2dWlDTlR1cDFURWVndnQ4emd1ak84QzREYkwyNTNHYVlNRStGczdLQVgvNlJiektZQUFmMnM5bzI2YjRBOGdPUzhvUkd1TVVGQVFVdVBUaHdrczYvVmE3cGtGcytsZSttU2RCNjBHektaWmY2YXJzT25pZy9sajlpRUdBbnc3M1VETlExdDVMemdMbGN6TzdFMzUyL1ZMc1oxMnB2ek5kbXhCYk5FR1JmdUwrc0xGWmhTMW9CS0M1Smd0OStTNFFnbnd0M1pRRGZ6ZG9yWkt2M3p6NjREaFdMY0FmMGx1dWV4S1hMajZlVnE5QjdjOGlTZDI3M1R5eFVvTitXMkFhU0FnZ3BSU21wMURwQlRaU0ZlcjFXZDh5cC8xb1lNOXU2NnN0d1QvbVpmeVo1ZjFvQkxzZERqbHovZUxZS2ZqS1grRG5RNm4vSTAyQlVnb1UvNkNqVWh6Q29EZFdsVzZYL1lSNEcvcG9CcjRtMFVhenFzV1l3WWd3TDlZejZoTGdFM25YWUFYWDNHMVZ2ZlF5Wk44QU9EVTVTU1p4WEsweXhZSnpUZFJoZTFhalVPaUJIdE9wZkNwZmlLa0U2c1dBWWFOajI1SStiT2c0c0tNMUk0VzFJcDZLNWRGTzZic2diaGZzR25STDFXbC9GbWZjcitJb0ZhMHdkQVg2bjZ4NkY5bHYyanFyZXdMZlNZaG9rd0dRUHdkdGxFQy9LMGRWQTMvVG55OVNqRzlEdGkrVWdIK3pucGxkWExnMWpVRk9BVEdwZmtSRHJWYUxTbktsL1UrMzIrYTlTZnJ1bGw0SjFMK1BrLzFrMEdoQm83YWpnQjBMbnNBQWZneXRMMVQva3FiZ2gwVzFLd2RwMzRSN1BpZU9oRDZoVCtOWW1nRFU5YTJMd3FERXN2c1FWRmZsRG1ONEg0UklGdGVQWWpjdVBGU3ZPN25YcFJsSXltQXgzZHR3eGNmdUJjLzNiRTF3Ti9lUWRYd24xYXA3R1ZBK1dxQWY2ZmdEeVF3bG5TNS9IYWNDZ0J5S0NXcjlWb3RnemtMVGRhQ2JxYlBnUll1OERmUHlOWFpCQXNmcHN5Q0VHeDBQdVV2MktrdzVaOS9kQ0NBRWFETkRvTWg1WjhmVDdZcGYyNC9VMGk2Q0RBUjlsWkFQWUxrUGF1V25JVy9lTVBicElzR3IxbC9FUzVmdXg2dmYrK2Y0OHo0V0pHWjBoTGdyeEY1cnEyakFiRW80eVRsWGdjYzRPK3NWMWFIODBzZy9haTFpUnZLRm9uTDFPcDF4bjBPelRRTHdNLzBpUkxtaEhPcEFiTWwvTVhYRUNkL09CK0U4VUVZSDFtOVZUNVU4S2ZaSDM3Z3BtQUdjd0hVQ3ZqVGJKbUhFdzhxR2ZnaXFLaGdNN1ludzUrbXk2a2RDZFJVZ2hQbGxnVTcyWEplTnJmRDlvc0cvcFNpR3ZobkhybnZJcmNwOUlXeVgvZytaWDNLOEUvNkZ5bzcvejk3Yng3dnlWWFdDWCtyZm5lL3ZTZWswNTIxUXhJU2trQ0NnYkFFQXdSd3haRVBPQ0lxNnNqZzZQdUtqakt2T2grWGNVZEVYM1dVWmN3STRvczZLQUlCRWlBWUlCdlp5TDUydXROSmQ5TDdtdTdidCsvMk8rOGZ0VDNubk9kc1ZhZnUwcmNlU1AvcVZwMzZQdWQ4NjlUelBlZXBUZTRYT2k4S0Y0ejRaNGRJNWtMdEY1VlBjanloRHdEa1RKazlYSERidnYvS1Z4dGZIencwTUlBM1hLWTg4OSt5aUxZRHUwVEZINDJWdk5IdTliOEcySWwvOEg1TlRSVi9nTjRFYUs1UEdZeVZONG1WWHdPY3A3ZjZSVW41cStXdDJZUTRLZjg2czBSdEFFRnhhRERSaEQvSFlRVlV3VnpnbEwvTVN3Q09OeThxRjdKUXkxenduTHI0YlNmbDc4ZUZ6a3YyRDVzQnNGeVJwZGljclYrenpyd1J3UG8xYXhXd2xxd1RmeE4reThwaHRrWWZBNnIrN01SL0ljUWZJT0tzS3JDeXQ1S3doVUQrRG9INWZxdGZTTXFmL01ObUZtRHdvUXcyWXQ4WUptMm5tQmFocHN1Y2FOY1dmeW9rWlJHelVEWDVrSS96MDdlMDNyUjlTaHU0OWp1Rm1zR3hZdEkyVU16WUtYOHJMM0liTkJ6REFLYjRHcUFnMlJYV3BNNVJZRFFJUkpFMTd0MGYvajBKZTlid2VHTVRPd25FWHc1YzlhejJRUThmQUhUaUg3eGZVek9KUHdCSVh3Tmt5dENBSU1vMGE3WXUreHBnQ1dTYzlWTXhsOGNaelI3eHM5NTh5UGlnbUw0K1F1L3lwOHRtb1E0VEtrMklEZUlVNWR2eWhnR0VFVWNaUVBEaTVEdlRyY0VGYlVjd0x6SVgxR2VZVUlmeDBscS95UGZ0bTBSZjZ0aktyOFZtNW1hdDIyZm41bG9SMGVuWm1XeWhKZjA4S2NRL001ZUNtR2QyRFMzc0VrQW4vc0g3VGMzT1lHTEsvTzdzV2NmSmFSTi9BRWlWdEQ1WE9YcXRFNmc2ZGZVMXdIWlMvdDdpYi9OUlFxbVpCUjJ6VHNxZkx2TUIyU1k0ZFZQKytiNnNVTTkzeXAvbmd2ZHBGMzhqVGtzcGY1bC9QMzRYWThwZnhSSGNKWUM4VU5HLzlXdjZRdHBPN2ZiSEhzWmJMcitTMlpMWkhZOC9ZdHhXMStqeGFNTk9JdkZYL2JROG5aUXQrR05BMVorZCtQczA0eU0zZkI0ZnVlSHpRZnV3Zm8xVlNNdk4wZ01CYkFlV2cydWFwbWc5NVE4dW02Q0x2ZnAzVUdZQmFzby9iMnZPZzBzb1hPSWpiYWVZRnFFbXhSU2ZzbWdHaXo4VkVvcHBFS29tS1g4bkRxMjNVaGV0M29GY0xPYVV2ejh2cXVDNyt3VUVjeE5nMGROcjZ0R2RUejZLQjdadHdlV2J6cGZXQ3lGd3k2TVBZdlB6TytvQkc2d1RmemQrdFNnQTJ3MGVsU1dHNVVibU53RG94RDk0UDNiZnlPSVBnRndDa1BkVm53NGtFcHVaRU9qMWV2eU1nb2k1UE5PUG5mSzMrNkNZUmgrYStQc0tzYktkQnU2R1FzVUxCZkhFNFZobnBoRlQvaFljeWdzTmYvSHU4cThhYUV1ZGM5a0RuaGU3VUVlL3BLSUlnODliL1Z4Y2NObUQ4bXVBZVhhdmVKTm5aYlpBb20rYjYvZnhnYi83RzF5NDhTejVQUURidG1MN3ZqMFdySERyeE4rTlh5MW1mN1Q4Wm1lcmVYOE1xRnJaaWY5aUVYOEFodmNBVUJOSUVwRUZFZ2hrUFR6cmVPeUxnRHhtNU9VYVJZaTl4ZC9tbzRSU013dDVHUm0wM01ZRjBtbzVKQ0RUQUYvdXFRa0ZMYXZoTkJKcWVaa1RUVjZjVHE2VXY4NUw2U1dJWC91N0UvZzJjTzF2TStWUDJ3QUJ3NHVBMUVFQWIxeUp3dVBtblR1d2VlZU9ZbVYwNjhUZmpWOHR0dGtRZi9QNkdGQmhuZmk3OTJQM2JVbjhzeUtwOUJjM25FeVNGQUw2L2NGSm1rUjRxNTg2RUFDOEx5dVFmOEo4K0tmOHk3L1VJRnRzNGNTSGJxZVlpbER5eTZvNHlZSmpGQ29HVTJzRHhUUUlWZjAwdHdjT3JiZFNsNlpjekgvSzN5YitkWGxSQlYvbVF1T3RjaVhobUY0RWxGa0NVak9ua0xEYk8vSG5IRGk1YklwZkxXcCtRbklBWWVrZmg5aytCcFRLZjNiaVgwZjhWNDJQWTNSb3lGais2T1J4SEorYTB2ZjFwZHMySzFDbTdVTHBkNzFlcnl4SDB6MnhQdVF6L3luLzdCOWprSjNIbEw4VHAwSEtueE9OWUM0VW9hSmRvLzIzK3NtWXNWTCtkUVpDZGw3a1lCMGo1ZS9EaFgwQTRERDZoY3RPL0gwZExLVDRtMko5c0pqWE1hK25BRHJ4ZCsvSDdwc0E3MzN6OStQYWw1ay9CdlMvdnZZbGZPSHUyMnFKUDBCZUJHUjdVWWphd2ZQektYc1ZjT1hRSlBiMGIwblNmY1hmTnV1dm9IUk1oNDhZSC9LSi91bGJJZFdFbnlYR1NQbEw0cVBqa0I5ZGlMMTRVZHVnK2d6a2wrVkY1VjgraGk2aERyK2tvdFpiYVorM1VQdG1FbFF1ZEJ4YXR0eFg4QzhDb3IxZkNLSEZHMm13MG9tL3I0T0ZGZi9NWXM3cWc4bzdid0xzeE4rOUg3dHZ3R0dvSy80QThwc0FUYjRUR3IyMUdYYmFxL1lOK3BDUDVmRzdySnluK0J0OXFBTUJlVUFSSnRUeTh0Sk0rWlB0eW5MMEFRemRsOWFiNGtUaHdvWXozeWwvMVdkNHlsOXZqK3cvWkFDalpRQUM3eExyeE4vYndXSVFmd1FFL1pDQmdoZG9uTThCZCtJZnZBOWJORlQ4a1NCSlRTOXNKSGwwSVo5SVJhQXEzZ1BRcGZ5VjdaSlFVOUZRTUZ0SStWT2ZwU2Uyam5ZdVpGNFVuSGxQK1Z0dzVqbmxiOFZVQkNFMDVlL2l4WlR5MXppbEIxbXg3S2Jmd0VEUmlUL25ZSkdJUHdCejVBK2QvUWRiODg4QmQrSWZ2RTlkWDVwZlpiWXRUY09SQlJscDVseXN6QzFOVWxuOEphZ0c0bStiOVZkUU9xYkRSNHlVdnowZys4K1lxVkNSbWdTbS9IblI1QVhmbGoxUXR5dVlIcnpFU3ZsVG56b3ZxbEF6YmJCd3dmUGl3Uy9MaTZIZUxCZnRwdnpWTnZUN2ZTTHlvdHd1UkwveVl3alBXanlxb1hIdnYrYU5HT3p6RTR2aDRVSDgvYjEzNHJuRGh6cnh0K0JYaTI0L05SOERqREk0WUFjQWE4OVoyNG4vRWhCL0FPZ2wyY01heXR4Ync2VEJxTERpRW9BOUhROU5pT2NqNVIvclF6NjFQMzByWlErZ0NMNHUyclZUL2l5bWdrTkZoZUlFOGFMZzFMMTBvUEFpWDBheHRJR1U5ZVhDT1NqeHpCNjR1SWh5R1lHVzFYaXBGbng0NFc0Q3pNNTVhVGlzbGRHc3BzWWQzSDhVUC9NVEgyYTMvZngvK1FFa213WTc4YmZnVjR0dE5xUTBtM280bFlVZEFJeXZHM05MVWlmK3dmdlU5YVg1dGN6VTVjRkFab0ttMENHeUVrSWdUWHU2TUFmTStxbjRKL0kvOVM4cllLRlQvZ3BPeEpSLzlkTnNBTU54SWZPaTRIUXBmd012Y3BDMnBmeWw3YVNRdTEvSW1NWkxCNlRlMGsyQXJxOEExdHE0T0cwWmkzK1UyWHdkWXdjQUswNGJ0M3hqRnAzNHh4TC9RRlBGSDREeUprQjlNRkR0SUFlekpFblFHMGhyaTc4NzVlOHowN2Y3bUk4UCtRVFBFb1ZVaytDVXZ5elVWRUJWbk9XVjhxYytkZkdmNzVRLzN5LzBPc3FZZFZQK0toZjZxNERKTWh0cmhMemNpVC9uSUZTVWcvR3J4WGs3QUkyVmh4MEFESzBZOHY0VWNMYXFFLysyalJOL3VUN2N4bnhkSG13U3lPZFltcWFNU09lb1N0UWhFM3FKZzNwdjlWTUhBcktQSmluL09yTkVUVWdvamliVVp0RzBpL2JDcHZ4ZFFtWEVhU1hsejNQcTRuZHhmOGhINTZJdUw5WlBBRU1lZklkc20yOTd4MnV2d1lyUjBmTHZXeDU1RU52MjdOTEtMWHZ4RHo5azBRNHlPd0RvRGZSNEI1MzRCKy96VjEvNk4vejFEWitUOXlXTHMzUHVsMzZZeEI4b01nRG03Vlc1N0ZYQVdiR3NrMVpmQTR5UThpZi96RnZLM3lQSVN0c3Bwa1dvNlRJbjJyWEZud3BKV1VRV3F0cjNMSGpqTUcyZzdWUGF3TFhmS2RRTWpoV1R0b0ZpeGs3NVczbVIyNkRoZUF4ZzNGa1ZEeTVnZUJOZ1lwcjlWOWlMUi9vemU4ZnJyc0g2TmV2S3Y3ZnYyNnNOQUphOStHZm1PblNKbzR6UG9WZm5md0JNQTRDaEh2ZUZHV1pWSi80dW0rM1BJZW56NHU5ak52RUhBTzVqUUpJQ0sxWUpyTWkvQnVnbi92b2pmcXJ3bDdXMXpQVHRQaFlxNWMvajJGTCtIZ0pML3VGRkk5L21KUlRxZGdYSHlNWGlTUGxULzAyRXVnNHZ2djJpRGhleFV2NXlIM0c5Q3JoOUcrajFzSEhET3V6Y2RWQmF2M3IxT0ZhdkdzZHhURWZ4MDRsL1lRczNkR05UL2IzQjFQb3A0R3hWSi80KzF1Z2xQNTR6ZTI3UHl2S2dKT1RaRFFEMGVpa3YxSzdyL1pyNEp5amZVMVptQ1JoTWd3OGhkUEVYeGJJbS9xSU13bXB3RmtKb1FWNUl5MVdBRm9Jc1U1eUNxNG82Rk9KUXpSSkppQ2VCWFJXcXNqWXU4UmRVZk1vSzUrMFhVbGxCS2wxd0lmc2ttSVJmVmFnRWcxbnhZaGdJQ1psRG1SY1l1VkRGdjJSR3hWRTVGWUxoVk80WFdodUVYTFpxZ3lMVURpNnFaU0xVSEtkQ1dhWnRZSGdwajJlMVF1OXJqZ0VBN1g5dDJDbW5yc0tmZmZoOTJ2cDN2dU5xL05BUHZUcUtqMDc4SzJPaWZJelp2cGV4R1lCRW0rNnA2SjM0KzFqYjRnOWt6L0xMUHFSOE9wU05Vc2ROMDU1VjdDc3hielBsbjFXS0Q0aTZhTElDQ2hJVTZYYUt5UW1zdHF6NnBFS2grdlJJN1ZJaElXMlZZcDh5Z1BIanBRWU9yVGR0bjlJR1VzeWJpK0RzREcwRHhhekJCZlhmakJjRng2TmZ1SG54NElMaHhYUVBnSUFqSkFpNFNualozYzl1dzlIOUU5cjZadzhld0MxYm44SUxKMDU0NFJ5Zm1zSUVLVHM3TjV0WGt4NmdGb3h5MnhKK3RSakJ6d0pldStFSEFMM2lPN0hNdGs3OHZXdyt4Ri96UTVaRkFtVzkwSzRocHIyZTM2dy8zMTR0Szk2VmxIOVZ4Q1grdmtLc2JwL3YxSzZDWTB4UGwxNzROcWhDVEFOSklBN2xoWWFnT0kvNCtmTXI0VkJlS0k2SFVFZS9wS0tJUUl3UCtYRFpBeU1YV3ZzTldSV05pK285QU5YTnM0bjhOMTJtbFlzZ0pBSUN0Mng5Q3NmM0g5ZTJiZDIvRC8zSEgvUEdldTlmL1FtTDM0bS9abm5LZFA2TkhRQ2t4ZHRsRk92RTM4L21TL3lCUEFOZ0xaOUEvV0p3a1o0c3hubk4zK3FYa0dYU0VobTAzQllXU0dXaHFEMUxwRUpDY1JvSnRiek1pU1l2VHFRTkZNZVRDOTZuZlFCanhLbk5TeVNocGtMTURDQmNiZURhN3hKdHFWK1lNQlhSNXRMODFIL1FQUXNLRnlvdjNNZUExQUU1YlFQVm9ib3FJb2xaUy9yWmlYOWppejVJNEY4RnpGeFk3c1RmeitaVC9JdDlFdklyNzU5QXZwNHE3NXVtU1p5VWY3bHZ0VkFuNVYvK1pRbU9GUTRqS2hSVEVVcCtXUlVuV1hDTVFzVmdhbTJnbUFhaHFwL205c0NoOVZicTBwU0wrVS81VzRTNk5pOEtUb3dCRE1NRnhiVDJDNExUNzFkcjFWQk03eTJvOW14bWJZbi9EMTMxT295UGpKWSs3bmpzWVR5N2QwODhCOVNFMG80VzhLdkZGdjNNcy9HWEFGTDUxdkpPL1AyTUUvOHJ6cnNBWjU5Nm1uR2ZSN1p2dzliZE8ydUpQd0R0YTRCSitSKzVIR0M0cHRqcjlRaU9tdklIVkxHUG0vTFAvakVHV1dsbWFranQxaEFxVGlpY09OYlV0bWVxWGhXZlJaWHl0M0VxWThaSytkY1pDTmw1a1FOempKUi9FQmRhK3hsTXozN0JQZ1ZRbG5FRnY3QWcwdWJNLzEzZmZhMzBHT0NlZ3dmYkdRQXNaZkhQNEd3SHJkVkxBNFlCUUpVMDdzVGZ6MHd6L3pkY2NqbXVmZGtyalB2OTdVMWZ3dE83ZDlVVGZ5VFZUWURjTVVqSXhTVW1nS1hsMXdCRFUvN1ZnalJzb0gvN1BPSVhHSkJydjcvZWhNTUdZWnRReTh0bUFUVmpjamhtTG54NVVibFFmUWJ5UzRXSzFpMXl5bC9Ia1RFMUxtajdZcWY4UFhCb1dXNGd4TFZCNWtYRk1YQmhHTEJySjNsU1hneW9aU2J4Lys0WFg0Q2pheVp3Sis2UnlyLzQxQmZoelJlL0ZIYzlzdzFISmlkcis0MXFTMS84VVZQam93d01ERy84UzlTd0gxU05UdndEOTYwcC90bi91ZmNBc0FjbE8xbktBQ1dROWxKLzhjOUhFdm9qZmduVVIvd1M1aEUvQVRrZ3ErSWt5bVZCZ3FOQm5EU2NQSkFXT0lJRVdVRXdoWUpUZUdYRlNiakZYMUFjU0Q0bG9hSkNRUVZmNDRVWEoxVzBaVjZxZWxNYzJTZmxSZVpDNWFYS01GZVlRdUhDK2JnajJVL2lWT0ZDbUxnZ09CSVhWV1VOb2wyeXBmVUxpcVB5QXVLLzRrTDJLZk9pY0VxNHFKYkxJNnIxQzhvdnh3Vi9ENEMyS2w5ZlR3ZHNNLy9MTjU2SnNXTTY3dEJVZ3Blc09CV3JSa1pxK1l4dVFtbEhDL2pWWW1RL0JNNmdBSzNPL0FzelBBYUl0Qk4vUDJzaS9uWDNrUjYxUzFVQWt2b25BVWdYZW1DZ3lBQ1FmeFoveWwvWlRnT3BKQm93Q2dYRlpISG9USmZ1cTdTQitpeHJ6OVl4a0F1S0krVFEwNlg4b1cvWGVIRno0ZUxGeVlYV2ZnWW5vRjlRbjl5M0FJUzZnalZoMjBoSzBRcm8ydzhkT29yZi80Ti8xTmJmY09NOU9PZWMwNEJOZzE0K250MjdHOGRJcHVEb3BQNWtRVzFUam45MGt5aUs3RWVGU3l4L3hUZXBPeGtHQUtuOVkwQUZqTGFxRS8rMlRjMFlTQmtBeDJ5QUJqQUFTTkowZmxQKytULzFoVnBlTm91UGpHTlBiZHVFbXFrM3U2emlVUEZSY1JoUkNlU2xtZmo3OHFLS2s4eUZ0MUNIOHF2d0ltVVBxcVlHOXd1NjdNZXBYSlliQ0hGY3lMejRjYUhXM2ZVaUlMdDV4SURxajFhczRPclhQL254dGh6STdXZ0J2MXFNN0llQkU4cEQyOFI4VkNVaHY4RXFaTW9BMklFNjhWOFU0Zy9rTTN2QlZFTDVVd2locFF0N3Zlb0dRbE1Xd0gyWHY1eGRDQk5xSmNneWdzUGo2S25WYXBOYnREblJkSWsySno1c1lIZk1kUDE0aVlSVG13dWJVUHZQbUNWT3JjZlRYNmo5TXdrV1RGcVc0ckJDWFhlQTZJbERlY3RYOUdsQllrbFNQK1dmMTREKzBZcXBrNHdXSEp4czRsOEhLWnJpR0I0RE5OMGJ3THZ1eEw5OU05MHJvRDRGb080Rm9CeGZpdnprS2VKTGRST2c1RVVXL3lXVzhxZkxacUZTY0pqVWR2VVRQK1V2ODZMZ0NEa2t0Si95dCtBd3ZQaHhJZnVQOGxZL0pmRGJVdjdTZGxMSTNTOWtUR1Avb3ZXbU9BWXVRZ2UyM0QwQTFBU0FKRkE0T3ZIM3c2OFdJL3RoNEJnZnRrRE9iV3VzUHZ3QXdKUkw3c1IvVVlrL0FLUnFLRENVMCs0c0ZzQkFMeTJQdE0vei9ERlQvblRaTHlEN3o1aXBVQkZQRlk2WFVNZys2NmY4MWUyS0VDdjc4UUtxdG9IQjlNQmhoWXBnK3FiOHFVOWQ4QUpuekN3dmhub2J1T0JtK25vZFpVeXVmOUd5M0VDSTU4SXltRE53UVgyeU9PUTlBSVdaNHAyQWV6RFFpYjhmZnJVWTJROEQxMnBiQXN4NEU2QytraW5YaVgvcjVucEtJRTE2NklzNWRzOWlQeHA0YUFveDdmVlF0aW9nNWU5NnE1K2ZVRUFKeUo3QnNTcWc0OUFnb1lsR2pzTUtxSUpwblQwck9MUU5GQ2VJRjlXblhhaU1PQW92K2hNUGhqYVFzam9YUEtjdWZuMnpCMjF3b2ZOQ3ltcThWQXZOZVBIRW9XMHc4TkozWkFCTUprQXY2Slcxa0F0NDJNaklFTjU4N2VYc3RuUFBQUjJQNFlEaVYzaGoxektodEtNRi9Hb3hzaDhHVHZQaGRjYzlLZDFzdTJTR0RBQ2FmdzJ3RTM4QXdFZSs4bm44N1UxZk11NHpQVE5yOStuSm8vVE12N09DV1FkTTA5NzhwZnhOd2RFcFRuYWhwc3RrRjZzNEdUR2RRaTBMVmUxN0ZyeHhMQUlyaVoyNS9TNHVnck16aGpaRVQvbGJlWkhiSUhIbDB3YUNZZVlsRUtkaHY1QzRVRzhDVEJLQ2t6anVBeUQrWkdYenRoM0hqK0R0Ly9tTnh1MFRtM2ZKUGdLd2cwMG83V2dCdjFxTTdJZUJXeXd6LzhKTUE0Q0VXU0tyT3ZIM3RlbVpXVXpQbWtYZTZ0UEZoK0ZUd01WQUlFMFM1UVk5SVFXa1hwb3U0cFMvaW1NVFBFWmdLWTVMWU1rL1Voc1VURCtoVUxjck9FWXViRE5kQnRQRkJXMUhNQzh5RjlTbkx0VCtNMllYTDgzN2hTekVydXlCSk5vVXg5SXY1RDdpeHdYMXlXUEtQb1VReHF1d1BwWUE2Rk9oRWNhaXJIM2xzVWU5eW5YaTc0ZnQ4cEUwT2RnRlJFMHpmUXVnL3RjQU8vR1g5NjF4YUh6M1M3UVBBVW5UOXl6b0NJRkU2WGNpUDdIU1hzcWsvS0dKZloyVVAxM21BN0pmY05TRWhPTFFBTUVHWWY5TUFpYytMQ1p0QThVSkVpclZaM2lhdXhrdnFzakpnc2RsRCtneXl5azlua3BkVEZ4dzdhL0RoYzRMS1V0eENCZDFlTkg2cFE4T2JVTzVpNmxmNUhoQ2YySW5SQ1BxenZ4RHJCTi9QK3pJUHFKZmVHWUhBS0l2Nm4wTnNCTi9lZDhXeGI4c1MvN2lDOUVzUUhiU0ZuLzEwbDVneWovRDRBT2lMaml1NENodHA1aUtVUExML3VMa3d0UkVoYlRWSkZUemx2S243VlBhUUlwNWN4R2NuYUZ0b0pnMXVLRCtPVjZjbUdyUUZsd2JlQzdjdkhod1Flb2kxWnZpTk9TQy9RNkFaTUt3VEN4SmtJL3lXN0ZPL1Ayd3ZYMkUzUU1RMWJ6ZkE5Q0pmK0MrTFlzL2dPbzdBTXJNbnlJV3BqNEZrQ1FKZWdQa1RZQk84WGNJY2QxQVdoV0hTNmg0b2RCeDJrejVCK01ZdWJDM29RNFhMbjdqcFB4YjRIZGUrb1hDaFFuSEl0bzZGNGFCTGZISlk1cjVsZDRCVUdieTlIVk9FKzRpZGV4a0VmOVdmRENRcmJZbGdubTlCNkFULzhCOXlUNi8vTFozNHRyTHpCOER1dTdyWDhZWDdyNjkxcUNoZkFjQUk5UlV2VldCS0RwbEwwMUw4WmN5akF1WThxZGxOUnlYa0JpVzdVTHNFaWZTQm9yakZKVzZRbVhCcWMyTHNtK0VnWkQ5M1FuKy9jSWwybDU5alphbE9JekFhblgzNWtYSFpQbWxiYUE0bnYyaVA2Yy8wZU1YRnFyS0pKVHJpT1lyL3Q5ejhTVllPelptM1A2dHB6Wmoxd3RIT0Fma0tMWmc5QmkwaEMydmFyRXRrUzRIT0o4QzZNUS9jTjk1bVBsTCsra3JBY2hCcnZKQlJ3cEFrcVpLdW1mNXB2eExUSU5RTlVuNSs2ZTJGWDZOYmZEbklqZzdROXRBTWIyNVVIMHFtTFY0VVhCaURHQjh1R0I1VVhBaXpQb3BqdmEranR3U0tTeGw1ekpmc2gwTG1mbWZ0WElOUHZ6N24yRzN2Zld0cjhESzlTUDZBSUJ5M29hcDUzc0wyUEtxUUQ4Smo0UG1RcTllSjVhOFdKOEM2TVEvY04rNmg2cm1mdWJIZ2VUVXY5UVp5V0t2MTZ1ZjhpK1hsZTAwNERZVUtsNG9pQ2NPaDVtWitnb0ZMeG9xRndFNFFnNER5LzFEUG15LzBIZ0o0WUxueFoxVlVkdlBZQWIwQ3hjWDFEL0hMeDBnei9YbERJRHZxMzhGNU10M01TMUUvQUZncnQvSC9ROXNaYmRkY3NrNUdGOS9pdW9BSXNSQnFORmowQksydkNyY1Q1SWtpV253MTZZWm53TG94RDl3M3dXNGpTTUJ1VmRUWDVEV0NlaUJ0bGQ4ODhtUjhxZjcrQXUxSGh6cHNqazRFaHlYOXBuTWpBQUFJQUJKUkVGVWtCZ0NjbEV2dm83K21CS09rd3RmWG5TY1lNRnp0a0hsbjNKUmVvbkRyNFVMcnYxMkxud3pDUVljbDhDYTJzRHlvbVBXNWplZ1gzQnZBU3dzVVI3cjFVeWdhblFrQ3hYL0dnNGcyblJBKzA5TDJQS3FLSDVjYWhKTmJkZ0JRSXJFL2pYQVR2emxmUmZvSHM2VVBLMlpnTFNEcTA5eGFRRFZJMGE5M2dEN0lSOHVrSlYvaFFSSHVwMWljZ0tyTGF2aVpCWk5GNmJXQmxxM2dBR01IeThlT0xUZUZDY0NGNXpnYUZ4UUhIbzhLYVkzRjZwUHN4RDc4NkpnUmhqQWhQVTFoU3VLVTN0Z0szTmh3bkUvQlZDVlRaS3FIUkNJSG9jNjhYZGp5NnZxKzBtU0pHbVZDNE81WHdUa3Y2VVQvM20ySktIK2svTGY0cjhzT0NUWnJ4Q0FITkx5cndIbWY0Y0VXVnFXQnR5Z2dLd0xGU2NVVHNHamdaVHVHeFNRYlROZEJ4Y1VSOGluOEhKUCtWZTh5TUV4Tk9YdjRpVW9VMFhyVFhFQytvV0xDK3FmNDVkOVJYT09hZm9Ra0JTbkJQbVArSXhwbmZpN3NlVlZEZjI0ZGNRMHJYTmZCN1pZMk5jQU8vR1g5MTFBOGMvcVlIOE1NTW12NjB0M2dXVFRCcVFwSS80MGtPYi8xQmRxZWRrY0hHVWM5ajN0RkljSnlMcFE4S0xKQjNhUFdhSWFUQUo0YVNiK3ZyeW80aVJ6UWZtM0NuVW92d292WFBhZ1RyK2d5MzZjS2dKTGNTeGN5THo0Y2VIQzFJNG54ZkhnaGMwQTVGazZJV0M5UkZCZ1ZKOElyMmRGRy83Yk8zNE1JNFBENWZwLy9OWk4yTHJyK2ZyQWxRT0lKaFgwd005K1d2REJRTWJ3d3oxNmJ5cGFCeDZHSHFFS2ZXSlkzNG0vdXU4Q2kzOVpqOUFCWU40TmtpVEpaeHg2UUM2U0JUUUlaOHV5SU1uTGVWa1Zwd2lBQlk0Z1FWWVFURktYS2tDSUtua2hCV1JoRWFlcUxxemdDU1VnVTZHZ1hHaThLSmpWbnhaZUtzSXBqdXlUOGlKem9mSWlGSEZTeFY4b3l3VVhramlWT0lSZmhndWhjTUgxaS9KSWs3cm9BeGhSWXVwY1FNTlJlUUh4WDNHaDlEV0pGd1dIY0VGOXlyeHdPRHdYT2k5QzQ2WDBwSEphMFNJZGkvSm9DS0R2dUFjZ1h6Q1dhV3IwT0h6M0pTL0hHMTkyUmZuZktTdFhlV0dNalEzam94LzVSVzM5OTMzdmxYajNqNzBCcElmRU45cWZXc0tXVjdYWWxpcUl0M2JBL1M0QmRPSXY3eHV3ejZlKzhWWDg2eDNmTXU1M2VPSllXQVVLRTQ2bkFLU01JWTNRV1RES01nQ20yWkF1bW1VeEtzUmNXYnFkQmxKSk5CUk02OHhJd2FIdG9EZ1dVU2s5c1hWVWhVTEZzY3dTaFh6NnQ1L3l0K0F3dlBoeElmdVBrdWFtYmRCNGNYUGg0b1hqMTRoRDYwMXhBdnBGSXk0b2pzYUw2bE9nMytlKzdGbVo3MU1CZFl4eTJNUU9UMDVpYk8yb3RuNWdaQkN6QTZqMWJSUXZvOGVpSld4NVZTUS9BdHlnTHZSQUo0WmxxN2t2QVhUaUwrOGJ1TS9CWTBkeDZOaXh1R080UEpCWWIvclRMSkZtSHIyMEp3ZFNnbXNXSjkrQWJBdU9Ca3doMVlRSmprUklxZ0s2NEdqTEtnNFZIeDFIRTZkQVhwcUp2ME9vQ09aaVNQbVhxeHIyQzdyc3g2a2lzQlNuN21ET3dBVmZkNFZmZWp3cFpvMEJqUFlsUU1tS2ZVVDBMRUFzOFFlQVQ5OXpGNllucHJYMTkrL1lqaisvK2FZNFRsUlQrMllMMlBLcVNINHFtQmdITkJqRGtBRXdmd3lvOHRTSmY1djdHWTBFa29SN1dFTUpERlZBbER1c25nRmdCSWNHV1Vad3NtVW9PRXFRbGJJSHFJS2lKazVtMFpRRlZNRzB6cDRWSENvcUZNZFRxSGh4MHJud3dsRjRZV2VKRG5IeTVjSTVLUEhNSHJpNDhNOGtXREJwV1kyWGFpR01GeGVuQmh6S200VVg3bnh4RFdCTU9IM0RUWUI2REtISFRDaEZ3d0pPVFBGZkVLTTh0b1F0cjRya2g4QzBtZG5oTEgvdmdPQy9CZURVOTA3ODI5elBhRUx1ZlBvQWdPTW5nVUQyL0hEMVpFQTJBREFHUjBtY3FJRDZCMUpPbk9peVdhZ1VIRWFjcXA5NUdNQkk0aVNmK2wzSzM4NnZVMkJKSVhlL3NQSGlnUk94WDlUaFFzSzB0S0c0QjBETzUrWlArTFFnRXAzNHU3SGxWWkg4cURCK2g3YlJIZitjaFQwRmdFNzgyOTdQYUVMdmZISzd6TTRTNXJXaGFacEt3VEYzVVRzZ2N6TTZIb2NSV0lMcE82T2pBYm4rb0VUZHJnaXhxdzBHTGpSTUR4eFdxQWltYjhxZit0VEZLWkJmbGhkRHZRMWNtUHVGTEpxdUdiTWtzQlRIeW9WbE1HZmdndm8wOHFzTWtKdnpVbTF3dndjZ3NXYi9Rd1NxRTM4M3Ryd3FraDhHSnVBcGdLZ1c5QjZBVHZ6YjNjOW9ndTk4YVpLOUNUQlJHVXJLM2ZLRk11UkJJQXRnU1pwWWhBSktRUFlManBxUVVCemFCaTA0NWppc2dDcVkxdG16Z2tQYlFIRVlnVEVMcU9xelhtclhueGVWQzFYa1pNSGpPSFh4MjA3SzM0OExuUmRTbHVLdy9iSXVMNTQ0dEEwVUo1Q1hzUDRsNDZqM0FOaGVEOXZrMWJGdGl2LzZWYXN3MTlOdjlGc3hNb3l6MXE3RHZtTkhjV0ptcHBrVHltVnNZeURiRlAvTWdnVWppc0k0UHdaVWVldkV2ODUrNTd4b1BVNVp1ZHBZL3JrRGU3SDN5R0V6b0RCM3Z1eEZRSld6aFB4WC9Gc0ZRaG1qeWdDVVRxekJVZHFlL3kySkN2SEJMUk1kc29xVEMxTUxwR1VSVzBBbWdxY0ZaTnNzVWQxWFg1YnFUZHVudElGcnY0dUw0T3dNYlFQRnJNRUY5Ui9HaTl3R0RTZkdBTWFIQzFJWFdlc01BNkUydWFDWXRBME1MOFo3QUFLQ2tldFNRZHN6L3grNTRyc3dOSnZpWC9BVmFmM0xOcDZKbjMvOU5mamtuWGRnODk0OTlSMG81MzlVWXlEYkYzK0UzN2poWjA3TTVwOEQ3c1RmdXQvYnI3b2FiM0o4RHZqNmUrN2dOd3A3NTlPdTFDVFZnandZS09IS1FOUHI5Y0lEYVZVY0xxSFNoTmdnVGs2QkpmL3dvaUhYUlJPZndOUzJ0UTJ4dUtEdENPWkY1b0w2REJPbk1GNWE2eGNzanRJR2ltUHBGM0lmVVhFTUExdmlrOGUwOEZ1YmwycURpc08vNkVkSXkxd0pYMnRiL0NHQXllTlQrTm4zL3JXMjZmb3Yzb2sxYTFZQUx6Ri9LdGdIUC90cG9SRU01SHlJdjRCbzg5VU9Wbk5lQXVqRXY5MzlqQ2JjbmE5Nk1ZaGNFMjJkeUU3NmhPeVRaUUJNQVRrZ09OWk9iUWZPK24wd2FSc29EaE9RemFsZDFhZGQvSTA0dFhsUlJjNHNlTDc4TG9lVXY4eUxKdzV0QThVSjVLVTJGeFFuUDU3MEhnRDNwRkE0dHF1bFJlZ3VZVmEwUVFnY1BxeS8zK1RFaVdrY1AzNENZNmc1QUtBY3hqWUdjcjdFSHdCTjIvaW9pSzFNa0FwWkx3RjA0dC91ZmtZVGZwM1ArUlJBVlRDREpVR3JmQXJBRUJ5bDRKbi9MUWRIS0VGWURxUys2VndYcGhaSUthWXhJQlBCMHdLeVRTZzhjR2k5bGJwbzlRN2tnc094WXRJMlVNeTZnemtWc3hZdkNvNzNBTWJHaXdjWExDOEtUaVF1L0IvOVZOcGc0YVZvZy8xVndOVk1rUTZHZkVKUEhmRy84OG5ITURJNFZQNTk2TmhSbXdPSVVBY2hwc2FBRnJEbFZaSDhXR0NvandWS0FMQURnQVNBL1hQQW5mZzMzczlvQVNkU3lqa3VWbFZxVVA2dmdFMlNKUCtTSUowOU54TXFYaWpLRWpWbXBuVXlDWEpnOU1HaEFabXlIdWNSUDE2b25Ka0V6eGs3SjA1bW9RN2poZTBYR2kvMXVPQkUwOGlGMW40R2srWENNTEFsUGprdXFIK09YL05iL1d5OFZCdDBYdVIrWWJvSElKSHU5ZEZ1KzYwcW41ZVF0d2g1czZmOTRmLzVsRjlCaFl2b1JvOUxTOWp5cWtoK0xEQ2FEL00xQU5kc3Y1SDZHTjREWUh1bXpBN1lpWDhEQ3p5UjVBd0FQeGpRc2dSQ29IZ1ZjSzJaVWUzVXRrMm8zY0dSRnljaUtoVEhLU3AxaFVyMno0bDJPQzhxLzVTTDBrc1F2L1ozSi9CY2NPMTNpVFlubWhvbUxVdHhYQUtyY1dIalJjZGsreHB0QThWcDNDOXMvQnB3NlBFa09MWTNBYnB2N3RPalFGM3g5emFsSFczZ1p6OHQrR0FnRjBUOGdaQ2JBS01tQzd5ZkF2QngzWWwvQTZ0eElsWGlicW9MTXhQSXJmZ2E0SEpLK1pkL2hlRFFlaXQxYWNxRkhZY1pDRkd4bzVqZVhLZytGY3hhdkNnNE1RWXdEQmNVVThPUnNqZUdnVkJRdjVDNUNIcmJvelFRTlBOaTRxSlBpVVVsK3FaSC9yajFaUkpRT3FBdEdHMUhTL2paVHdzK0dNZ0ZFMzk0U21RTFpuZ0tnSG5IN0RJVy85Vmo0eGdtMThMVS9ZNmRPSTdqVTFOaHpxblZQSkhzbkNlU3VBT1FYZ2pVNi9YWWRHYVQxSzRUaDVtWitnb0ZMeHBLd0EzQkVUTGo3Yi9WVDhia3NnYzhMM1p4cWpNUXN2TWk5OFVZS2Y4Z0xyVDJPd1pDam43aDRvTDY1L2dOK1pDUGMyQ3I0akRuaXprRGtCZklQK2NOMkNlTkN5bitJeU5EdU9XV0R4dDMvZFJkMy9iQ3ozNWFhQVFEdVpEaUQ4Q2QzbW5Keks4Q1ZsYlk3R1FXZndENHViZStEYTkvNmN1TTI2MlA4bmxZM2M2WEdqL1pvSzhSUWc0SVNaa0J5R3BBbDgzQkViemcwT0JKY1ppQUhCWWNWUnlQV2FJYU9JaG84RDV0cVYzVnB5K09qUmRWbkdnYlNNMER1TkJ4WkV4dDFrL2I1eTNVdnBrRWxRc2RSeEpZaW1QaFF1WkZ4YkdKdjROZmVqd3BUb3dCak1ZRnJaZk9peEErYndKVVRlaHJFbloxUEtOOWs3R1AzUHJOeHZqWlR3dU5ZQ0FYWFB3QjF5V0ExZ1lIN2tzQXkxejhtOW8vMy80TjNIai8zZnhHQWV3NWZLZzJkcUsrQkNqUk9SVksyU0lJcFduQ3o0eGNBcHYvWTV2Rm1JU0t3OVJFcGNRazI1WGxvSlNzVlp4MEhLbmVGQ2NLRnpZY3gweVhZbnJQK2xWeE1uUGh6NHVDT1Y4REdJb2paVzhNR2FhZ2ZpSHpNcDhwZjcwTitnQWcrNDRIdWQvTC9pNWdjb0JiTU5xV2x2Q3pueFo4TUpDTFF2ejlMYnBxMlFjQW5mZzN0dDJIRG1MM29ZUDZoZ2dua3Y3SmhxVDhOeUhOTENiL2xUaUo2bXVBWEJDU1JBTnVvYXFLeURnMGtOSjlnd0t5VFNoVUhNc3NVY2hzdDUveXQrQlllYkdMazcvNGUySXEvVEEwNWUvaXhYZkdyTFdCNGdUMGkwWmNVQnlORjlWbjNjR3lEYWY2R0pDUFVaNnkvNFQ1ZHFBWXBuRFNCbjcyMDRJUEJuSXhpWCtFdzFacmYvT0xnRHJ4bC9hTWFwRk9KUGxGUUh3ZDFjRkE0Ylo2Q3NCL3hreUZpb1E0ZnBZWU9HTjJCMGNkUnhNbmlxbnN4d3VvMmdZRzB3T0hGU3FDMlNUbDd4SThJNzhzTDRaNnMxelV5eVJ3T0xTc2IvWkE1c1dQQzc3dUNyLzBlRkxNaGdNWWE3OHc4TUpsVmN5dkFpNHNvUTF3QitwWVJ2dG5TL2paVHdzK0dNakZKUDRBaXF5T2VqQmJ2eXd3a1BsV2NrcVdyd0ZtbTVlUCtDK0d1LzFOeGg0bTdtbkFKTDhoVUZUYnkvY0FsSFdDTENUNTM3dzRtVVZURmxBRjB6cDdWbkNvcUZBY1Q2SGl4VWtYQ2k4Y2hSZDJsdWdRSjE4dW5JTVN6K3lCaXd2L1RJSUZrNWJWZUtrV3duaHhjV3JBb2J4WmVOSHIxYUJmbVBpbGJhQTRyallBMXNjQXF4MlUzM3hSdmlBWTBaVDJSRGZLYlV2WThxcElmaXd3d1Q2QzdycHo3QjFnWVk4Qm9oUC9SaGI1UkVycFk0Q2NKZGwxZmlGSEcwQUFhWSs4QjZCWWIxZzJDMVcyMGlaTzFVL2RnR3dUSjhzc1VjaE1keW4vc3BnaVR1WTJTTnRKSVhlL2tERTVUclUyVUp5SS9jTEtCY1hSZUZHNXNBOXNpV3VsajVoeHFQK1NVMllBSUlTb2NzVEZ2b25ReXJWaUNpOXQ0R2MvTGZoZ0lCZWwrQU94UGdjY2pCSG5jOENkK0J2dFBXOTRLMTV6NFNYRzdaKzU0eHU0K2VIN2EyRkxpUnV0cm9uV1NRV0UvQzBBdUFTUEVWaHd3ZEVtRktXWG9PQm94RkVEaHZCc0E2azNnZFl4UFhCWW9TS1l2aWwvNmxNWHA4QVpNOHVMb2Q0R0xyaVp2bDVIR1pPYk1Vc0NTM0dzWEZnR2N3WXVxRThqdjFMMmhtREdHTUNFNGtnRFFWcVhxdDdzUFFETXFzQUM5WXllcnkzaFp6OHQrR0Jwak9USEFsUGZCeGZBL1F2WHRlYWZBKzdFMzJyclZxekVHYWVjYXR5K2NyVCtsN0ZNVjJyMExxaXNTYkxzZ2YvYjY4eWlLUXRvVmNnV0hObkFUa1dGNGpBQ1l4WlExYWRkcUl3NENpOXhVdjQ4cHk1K2w4T0hmRGhPblRpMERSU0g1Y0xNUzFqL011RFFObEFjOW54UnVaQjk2dmNBVkxGSVlCNU5hVk1iK05sUEN6NFl5TVV0L3RFeUFNRm0raHh3WXZtVGJuRGF5U0QrTjk1M0YrNTdlck54bjgwN253dDNGTUg0NDZLdUs0S2JITHlxREFDVWdHeWIwV1FyZzhSZk9kSFpXV0tOMUM0WGtNMDRUQnRvKzVRMmNPMTNjUkU4UzZSdG9KaVNPUGx4UWYySDhTSzNRY1B4R01DNHN5b2VYRkFjS3JBVVo3NjRvSmkwRGQ2OHlQdHEvQm9IUWhrSzl4Z2d0U1N4UHdVSWlPYnZsS0Z0YXNPVW1OQUd0cndxa2g4TFRLdDh0V2pPRE1CeUYzOEFlR1Q3Tmp5eWZWczRvTEQybVdZbTZEMEF1ZVVuZnZiR1B6VzRRWG9YUVBrMVFHNldhQkFucDhDU2YwS0RJeGRZTllHbE9FWlJzYzN1R0V6RlA0ZFR0aU9ZRjVrTDZ0TlhuT3J3WWhYWWhseHdNMmFwRFJUSDBpL2tQcUxpOEtKSmZmS1lpaytLV1p1WGFrTW9EcGZ5ZDdWQnVnVEF4Q0xUSzRHakdUMW5XOExQZmxyd3dVQXVDZkVYUU1Db0xURXMxN0o2bndOZVJ1SmYyOW84a1FyWVF2QzVNa25tbjlhQS9wWDJlbFV3bzNWbGczRGdyTjhIazRvS3hlRUNxU1JPZFlXS3g5SGFRSEdjdktnaVp4WTg3NEdRSkJweVhheHRDT0xDRTVPV3BUaWtEYzE1OGNTaGJTaDNNZlVMTXkrMXVhQTQ5SGhTSFBaOFVibFEyeS8zQzlOVEFBbmtUN1FKdGxSRFU5clZCbjcyMDRJUEJuTEppRDljV1oxZzgwWXpEUUE2OFc5aWJaNUk1Q1FxUHdlY1ZCOElsWWFIU1pYbTE5NEVXSHdYUUF0Q3NtZ2FoWW9VTWdwVldjUVdrSmxBV29GYWhNSURoOWFidGs5cEF5bm16UVdIWThXa2JhQ1lOYmlnL3B2eG91QllVOXUrdkhod3dmS2k0RVRpd3Y4UlA2VU4zcnpJKzJyOFdnWkNQS2Q2Q3Q4OE9SU0c5VFdNMXFjTlUrSkNHOWp5cWtoK0xEQ3h4Ti9UVEoyZ2tYS1pQZ2RjNjJ1QStiN0IrN0Q3ZHVMUFltYy8yUUwzemFhaU9lcGdRQWdoQmNNa1NSV2hxQnlFejB6clpCTFU0T2pHb1FHWk1oem5FVDllcUp5WkJNOFp1MXVjOU9WZ2ZwVytGL3BXUDQ0TFRqU05YR2p0WnpCWkx2aCtRWDF5WEZEL1ZuNkRlS2syNkx6WSs0VVh2d292NmdEWi9TSWczVWh0QVZnbWJ4YUFUdno5c0tQNVVIYzNqL0xxcXBQWGZ2N3ZBVmpHNHYvRFYxMk5TODQ2MTdqOXBnZnZ4ZDFQUGRIdWljU2NST3dBUU4wbWdBUkN5UXdrNUI0QUxnajd6bUpzc3pzRmg0b0t4WEdLU2wyaHN1RFFObEFjVnh2SXZqb3ZwUmNQSFB2QXl0VUdydjFSMHR3T2NUSUtyTWFGalJjZGsrMXJ0QTBVcDNHL3FNR3ZjbDZ6R1NiaithSzJYKzhYRWhmS0pZRFExTEJ3RjlGMjZNVGZEenVhRDJiM2hma1dvTzk3QUpheCtBUEFCUnZPeEZVWFhHemMvdkN6VHh0UHBDL2Vjd2Z1ZlBJeDQ3N1A3dHZ0cm9EaEpESy9CeUFweTVlcGZ3a3YveFlBcVRNZnpEeG1SbXJkQ2t5RFVOV2YzWG5nMEhvcmRlSGJ3TlRid0lVZGh4a0kwUUJQTWIyNXNJbFRYVjRVbkJnREdJWUxpbW50RnhRbjlxeWY0Qmd4YVJzc3ZQaHlRZjM3OWpYcVU4RHlOY0FreWM3bGVjaFd2dlhpbDJLTWZQNWN0Vzl0Mll4RHg0OGJ0Ny94d3BkZzljZ29kU1BaSFU5dnhkNmpMd1JYVnpLOTJteGJZbUZIODJIZWZWNmUrMWV0OGRjQXN5SW5yL2o3bXFsamJOMjlFMXQzNzJ3Q2JNVG4zd09ndDAxTi95UEp2d1ZnRXp4cmFqdGdSbU1NamdFNFFtNTkrMi8xa3pHNTdBSFBpMTJjNmd5RTdMekkvU0pHeWorSUM2MzlER1pBdjNCeFFmMXovTGFaOHRkNVVYSDhlTkd6S3JKUDg2dUFoV0Y5VFZNNG9uYnVpblg0NkY5OWtkMzJmZDk3SlZZTWoxZ0hBQmVzT3cwZi9YK3ZaN2U5OFEwdnc1cFZvODBHQUV5MWw3ajQrNllBZko0QUNGSzJSbDhEeklwMDR0K2EwZURDV0twMUdxNWhnbHdPcUFZQzFjZUFjZzlNUUE0TGppcU94eXhSYlYrQjZTRlV6Y1NmRVdJcUtyUnV4alEzcVhrQUZ6cU9qS25OK21uN0F0TGNuR2pTWlY4Y1NXQXBqcVVOTWk4cWprMzhIZnpTNDBseFhHMm9xaGplTHd5WTVxd0tVKzhBTGdxLzZxZStnOHdsSnJSZWpFMU5UZVBXV3g5aHQxMTZ5VG5BT2NaN3h3RUFzN056eHYzUE9mczBqRjYrMWw0L216SFZYdkxpRHl5eUZ3RjUza2ZTaVgrTHBvb2pZL0k5QUhMYnFzQ1N5TFAvM0lvWEFabUVTZy9zaktqa2Z6Y0twQ3FtVVp4MEhLbmVGQ2N3RGVzN2dOQzRvRGcwd0ZOTTcxbS82bFBCck1XTGdobGhBTU54UVRHdC9ZTGkxTzRYTWhkQk9MU3VGTWZWQmdNWEdxWkhYM1B4MGllREFHcmxCNzAwNDlaWmpOYWxEV3NSbXNNK0djUy8xZVBoTU1PYkFDMTNseFZGT3ZGdnoyamdzNWgxbEphVS82aXdFQUpJMHZ4cmdGeEF6Z3R4UWxIK3hRWmtXM0NVY2V5cGJibmxYY3FmRVJXTkZ6Y1hMbDZDWnN5MDNoUW5vRis0dUtEK09YN05LWC9WWjRNQmpCR25MaStrTE1PRjE5Y0FqWlpoR2FPQ3dsTjBheEdhdys3RXZ6VDFvUzl2TXp3R0dQZzU0RTc4NHhrTk1BNnpqOU9TUE5BVUFiMVVOQUJBbWlhYStMc0RvbTl3VkhFWVVhR1lYQ0JWbHB1SlB4TndxYWpRdWtrQldlYUNpbE5vYXBmblJhMjMwajV2b2ZiTkpLaGM2RGlTd0ZJY0N4Y3lMMzVjOEhWWCtLWEhrK0xFR01BRTRmQlpsVGI2QlgwTU1IdjVqM3paVjQyOUFwNmhqZGF0RFZQUDdSYXc1VldSL0ZoZzVsWDh3eTRCUkZPem9LOEJaaHM2OFcvTkFrK2lsRFFzMFJZWWVBRWthVllnVlRNQVJRR3l6QVZITnBnNVpycDBtUk1xWHB4cTRuZ01ZTUxUdWY2Q0kzSHFtVDF3Y2VHZlNiQmcwcklVaHhXbndBRk1LQTdsemNLTExxQk4rcGVCWDBVWWJkbURNQzc4ZUpGd2hOcStmTm1ZL2plWmVoZXczTWJvUnZsdUNWdGVGY21QQldhK1ovNk52OTlRMDB3ZkEyS25sc3RWL0wvMTZJUFl0bWVYOFVSNmJNY3p6WjNVT0luVURFQlMvcGVVSzBTZUJVaFFYRWZNTm1WZkF5U3VsZURzRjBodHdWSEZzY3dTaGR6cTlsUCtGaHhQMGJhS2lvcGo0Y0tLcVltVHVRM1NkbExJeG92dmpGbHJBOFV4Y09IL2ZZUWE0cS94b25MaGtZMVNjZGcrYmU5cmZyekEyUzhrSE9NbGdBUUVrUlVNQVNBUitzcFFNVnUzYmlWKzczZmZnOS8rblU5SjY5LzJnMWZoKzc3M2xmaVh4OG5ueXlrL3VZMk9EdVBESDNvdlB2RC9YQ2Z0Lytackw4YzczbkUxYnRqNnFGOUZtR3Fmak9KdnNSaWpBaXRHL2M4Qkx4UHhCNEM3bjNvY2QyOStQRjduVTQwNWlYeE1HZ0FvS1lDRS9GZXVyNmFtU0h2Vng0REtLaWdCdWRZc2h1S283U0xCa2U3SEI4cXlSQTN4ZHdnVndmUk4rVk9mdWpnRnpoSlpYZ3oxTm5EQnpmVDFPc3FZbk9EUXN0eEFpT2ZDTXBnemNFRjlHdnNhUFo0VU04WUFKZ2hIYVlOVWwrWmNHTThYQUlKK0RDalVCT1I3Z1VrYlEyeTZQNGN6enRZL1liNW0zUXFNckJ6R1hERklVZnR4YmlkbXAzSG1wdE8wL1ZldUhzZjQ2bEhNK3R6bndGVDdwQlovLzBzQVBvOENlcHZYSllEbExQNEFhcDlJdnRqWlR6aSszbWNTNmFjTVBrejlreVNCVDNCa2d4a1ZGZUlvTENXcityUUxsUkdIdGdGRWNGeHRJR1c1Z0d4TzU4cUNRekVYOTRkOGRDNmE4K0tKUTl0ZzRVWEhxOGVGRlVjNUYyelpBNTBMMmFlNWo1Z3g5Zk5GeGl6dUFUQTlDVkJ0STQwVCtUSU5CMG83USt4dmJ2a21qaC9Rbi9PL2RldFQyUEhWYWRJUTNzZDFkOXlHNllscGJmM2R6MjdEd2E5ODJWMEJwdG9udGZoRHl1ak02N1dBOE04QmQrSWZGVHY3cVllZnFvOEJXbnlVZitTQnBYZ01NRFFnMTBudGh1RXd3WkVWTzFMdkVsNFB5RUhwWEJPbWx6ajVjVUg5MStMWEtFNk9OaEFNTXkrQk9KUUxpak5mWEZCTTJnYUs0ekdBOFJOL1gxNlU3Ukl2cElZR0xseFBBUWgxUVVBNTlRVWc1TStCUnpkNjdGckNsbGRGOG1PQldVanh6NjJ1YWpYS0NGZ3pBSjM0dDlUSmMrenNwejYrZGgyd25QbUxLaG9sZ0JUVmNxdGVCR1NhMGVUYnZJUkMzYTdnR0lPbmJYYkhZQ3IrT1p5eUhWUlVDS2EvcU5qRUtUQzFhK0hGTENSS3ZhWDI2OHQrbk1wbEpSekxURmZ1STM1Y1VKODhwdUtUWXM3WEFJYmd5TmtieWtzSUYzei9NdllMcFY3U3NtVDVwNEJGRVZmdFFhNFRmei9zYUQ0Y3Uzdmh1M1dybGN5QU1RUFFpWCtMSjFLa2s4aHdyNmJtU2gwb0NNaXZBdGFEVUY0N29pU0M3Q3VuTUgyRlNzYXBuZHFWUklQZ3VOb0FlMEEyYzJFUkhFazA1THFZdU9EYVg0Y0xuUmRTbHVLd1FoVTRnS2wyOThPaGJTaDNNZlVMTXk5Qi9jS0VvNXpIZWliRnhvWGFmcjEvOFZ3WUJpVjBPOHNMREJrQTJqQ3kxbkRuZUdzM2xGUGVXOEtXVjBYeVk0RlpGT0tQY29nWDI1eVlmcDhEN3NRL0tuYjIweHpmK2dYSkpKRThpRHdnRnV1eXp3SExkV0ZUdXpYUzNGeEFEa3I1bDd2THdkRTBvNlBMdnRrREt5WnRBOFdzd1FYMWJ4VXFFeVlWSjdwdmpBR01EeGVrTHJJT0dRWkNEYmp3ZjhSUGFZTTNML0srR3IrQkEwU3VYOGk4Mk5yQWM5R25GVXBrVHJJWVIvNXV5ZGFOajJQa2hCNWJ4b2FHY2VxS0ZUaDAvRGhtKzNQRy9kZU9qV0VXK3NlRXhnYUg4S0lWSzNGa2NoTFRjN1BWQnFaSnkwbjhBWEQ2TlMvM0FwaW1rTXdENW03cnhOK05uZjNFd1dkZkJLUU1DcElrZ1dENFNaSXNBMUFHSVJKWXEwQ3BpNU9BSHN5RXRKd1hJTXYwSlVSVThJM1grNHRqb0FpVkxKcW1nQ3dxSENnNG9teG83b2NFWk9KVEVoV3lMeTlVUXVKQzUwWEdMUGtWRmFiS2hTcitJajhXRXFjU0wyUmZ3M0tGbzNPcWM2SDNDN2tOTFlwL3lZVWd2RlQ5QWt3YmVGNDRMa3l6ZE5JdldWNFVIRXUva0hraE9JNStVU3czZXhOZ1ljMEM0bnRmZXpWKzZxclhhdXRmYzk1NStKVnIzNEtOcTFkYjkvL0pWNzBHUC9mNmE3VDFWNXgxTm43bDJyZmczRk5PcVZZS3JWaDFiamMxQzh5aUVuOUFQV1NtNi9wTnJ2ZXo1UnQvREtoQzc4VGZoWjM5eE1OUFhXOXNwak1JSWpKQTlpYkFjbjFSc3lxU1ZVRXQvN3Y2MFVWRkRmQjB2eXJlMGtBWmdFTURNOFdoeDRwcmc3cXZNcU5UQTdJWnh5QjJHaTk4RzdqMjI3bmdSVlBEcEdVcERpTXFXdDI5ZWRFeFdYNXBHeWhPNDM3aHlRWEZVYzVoZFRCbDd5TnErL1YrNGV3amxWTjVPOFhreXViTFVnWWd0K3d6d0Z5Z28vMVJSQXVGQi9hL2dGLzd3SFhhK24vOTdHMTQwYW1yZ1RYMi9TY25wL0grWC9wZjJ2b2J2M0lQMXE5ZlczMU1TRytxZE93YW1RVm0wWWsvQU1lRm05YXlBU1lGU1R2eGo0dWQvY1RGcDd4bm53cm5IeVlWQWhWWCtSUXpUWHNrSUJuRVg1MHhRNTNSVkFGUlh0WngxQ0F2elhUTGZlV1pyaHFjQlJQa3l4bTFJamoyTzdqMWdNek9FbTB6WFRwTEpPMm55NVZvbUFTdlpFc1dLZ1pIemdCVXg2TGdoUk9uYXJscVB6dlRKVnpJdktnNDVIaWEra1hCTDljR2hRdXVYNmlZWlZ1RmlrT09yV2xRU0RtRnVxeHpJWEZLY1FxV2lFOStnRmhXWHVtTGxGUEtDK1Zma0hwVXRoQnZpSnVkbThQT1hRZTE5VWVPVE9ESUN4UE8vZnY5UHA1Ly9vQzIvdWpSU1J3NmREVDdRMmliSzg2Ym1nVm1jWXAvaS9kdE9NejBKa0R2Nm5UaTc4Yk9mdUxqeXpjQnFvTUJJSkdVWHo1VzVVMkFUSUFIMU9DWWI4K1hyVE1qSWJlMC9iZjY2UUczTE1yTTJNa3VXdnZKcnBwUWtkVVNGeTVlcXNHRTNBZnFQKzdJOCtMa1Ftcy9nOGx5d2ZjTEZ4ZlVQOGV2K2ExK05sNnFEV0Y5Uk1YeDQ2WGt0SVYrd1hLQlREeFZLN1luaWZwdEFONFc2TXV5ald3NWkzOXVJUWN0MmdIMmZoTWdYNHRPL0YzWTJVOEwrTUkrTzhoOEp0a2dnTTQwODEvNk1TQmprSFdLaXA5UU5STi9UNEdGR3BDcFVKQ1dPM0ZjczBRN0Yxejc3Vnp3b3VuQzVIQk1vaEk3NWE5anFqaDErNFdOWHhzT3JaZU9HV1ZnNjlNdmZEQWRBeGdoelBjQUNPT1d5RFp2amdwM2tSeGFZQmExK0F2TTgrdC9LcXM5QU9qRTM0MmQvUWlzWDcwV2IzdmxhM0graGpPeWRVTGcvbTFiOEpYNzc4WUx4OTBwTlJPMmRnOUFJditSSkNwZlZVOUw4aGNCMVpuUmxIOFp4WW5Cb1FKTGNTeTNIQTdUQUFBZ0FFbEVRVlNCdE1tTWppNnJRVllLOEJUVG13dlZwNEpaaXhjRk04SUFodU9DWW5MaVJHcFk0YmdFbHVHRjR5SUloOWFWNHJqYVlPQkN3L1RvYTI1ZTFEWW8yNWwrNmV3WDVhdUE1Y3hkb3AzSEZtc1NJeDNRc2EwVC8vcTdFcXQ5eElPL0JwaHQ3TVRmaFozOUNLeGJzUklmLzRWZnhVRGFrNHBjZHM1NStNRXJYNE9mK1o4ZnJONnRIWUFOT0I0RFZIWXFZa3l4VDZwOFlheEwrVWRPN1NyOUt6VGw3K0lsYU1aTTYwMXhXQzVzczM0ekY5US94Njg1NWEvNnJEdUFxZEhYbkx5UXNtMXdRWmE1d1piTi9Fb0ZXaXVnTm5lUkhGcGdsb3I0UjNnUFFLMG5CSUl6QUozNHU3R3puMnpoclplL1VoUC93dGF0V0lrcnozOEo3dHI4ZUJCMllkWVhBZVZQQUpodVhrdVVWd0ZyeTBvN2FIQ2taZmxBV1ZVMnlzeUlCbEphdHhnREdJUGdHUVZINFlYTEh1aUNKQzl6UWtHWC9UaFZSSVhpV0xpUWVmSGp3b1dwSFUrS0UyTUFFNFREWjFYYTdCZFdUQ21Ub2ZacHZRMTl5eVdBSXZiS0EzODlrdFc2QjRBY2c5Tk9XNE92ZmVVUDJXTER3NE80N3R1M1dhSEd4a2FNK3c4TkRlTFQzN21McVhWTnM4QXNGZkVIRUtKdlRSNEYxQ3hvQU5DSnZ4czcrNm53aTdTL3lWNTgraGwrQXdDbXlub0dJQUZIRmhXY1lyOWUybXVRMm9VaVRnRTRFV1owZGh4L3dmR2YzYW5pWk9haU5tYmdBS1o1bXRzVEo2aGZ5THpFdW5SQVorenRjT0dIS2VHdzIya2ZJZlZXbG0yODBIc0FmRjc3SzV0d0Y3SHNWdFR3UTEvL2FqMmMzUDdudC83ZFdxVk8vTm0xc1ZTT3cwbE1YcjB2QVhUaTc4Yk9mbHJBTjV4RTdIc0FFcldjdkU5WkxIOFBBQ2M0c3ZoVUMxcFFnMDBvY2h5djRNZ0haQ2NPRGFRVU0wUlVWQndMRjFaTXBXOHRWTXBmYXdQRk1YQmhma3RqVFM0b2pzYUx6SVhNaTg0RmNhMzBFUnRPWFY0UXYxOW9PRXkvb0pqYzU0QVRmVllmN1U1L1d2L1l4a0IyNHMrdnppZHo4MzRyb0ZjR29CTi9OM2IybytPN3J1azVyL2xaVGlMbnR3RHlQcFdnK2pwWThaczlCb2dxOEtodElNR3hLbWFhMFZRVmJUSXpZb1dLWUM2R2xIKzVxclpRNjh0K25DcWlRbkVzWE1pOCtIRkJmUnI1cGNlVFlqWWN3Rmo3aFlFWHFRMVNYWnB6d2ZVTGExK2paUW1PM2diVnA5QXlBSVFaclY0bXMyL2xDM2ZpNzRmZEdOKzJhMzJ0YTZTUzVoY0JsZWlkK0x1d3N4OGUvNkZubjdidS9zajJiVTVzZVZXMVVyMEVvTi82cDY0b0FwREl2d1VnVUFVaFVRVmtFdVJGZ2FQTWpHeENKVWhnazNDeUNLZmppR0paRDhpcStBdGx1YWlyR3BCRnVaempFTXpTTnpQekZrcjdwVGF3SWlja254d1hLbzdLUytGWUZvM0tweTVVQkVjVEtwa0xWZkE0TGlRY1VmbXYyaW8wWHNvU1FyQzhWUHhUTHNqeDVIQWtUaUgzQzRvajVHV3BEWlJUSXhlRVg0MEx2VjhRYWpWTUFsWDFvV0xaS1A1VnZ5eHF4ZzF5cVpFYVNXdDQ4d2llOURqRU5nYXlFMzluQ1ZQcTNyYTlzVm0vQmRDSnZ4czcrekhqMy96d2ZUaDJZcExkdG4zZkhqenk3RFlydHJ4S1hzazlCWkFBNWFkRHM1MUVHZEFwYnBvbUpDRExRaUdMazFBRW54RUtOU0FYQVZjb09JVjdBV053VkFOeWlZTUtoeTZ6Z3hiU0dGRlYzSkJKcU9wV0JmaXlJaklYaWxEcHZQQmNsTnVMcW1xOHlJSlhjVUV3TlY2ZzhTTHhTOXBQaGJxc3Q3UXNpMVBaTHlSZU9DNW9OMk1HTUJTVFZFNXR2N3lzRCtib01aV0Z1anlNbG9HUWtISFV2bWJrcGF5OEx0U1UzNUlYYzc4d0Q0U1U4NDRPR2hpTDlsWkFlanhqR3dQWmliKzdTQXR2ZlBRQzlQc2NjQ2YrTEhiMlk4ZWZPSEVDUC8xWEg4UWJMN3NDNTYzZlVLNS84Sm10K1BhVGovTDdlNTVFcVRwK1MrU0Y0cXBTTmlpUXZ3NVlmQTFRRG82b2dsNitYTVZiZVhZbkIvaThob3BRdUhEVVFLcGkrcWI4cVU5ZG5GeENvV0NxeDFWd2JaQ0ZSS3UzMUg1OTJZOVR1YXlFWStWQ0ZoVWZMcWhQSTcvVUo4V3N6VXUxSVJpSDFsdmlwVGtYeG42aDFJczlYMmpkdERhb1BnM25pL0pJY0NVTXRzR0J2TjRhUXRYK0hkTVl5Q2grSEJCTFhmeHo4MUUrVjBZZ1dEMU5ud09tYjZFSXNrNzhkVHN4TTQwYjc3c3JDRnRleGZ0aHZ3WlkzUEJKdUJTUWd4MGd2d3E0OUdFUUo1ZFFTVUtoaUlQVUpOUHNydGpUTXlCek16cFh3UFc5WWJBTkxuUmVTRm1LMDFDb09FNmRPTFFORkNlUWw2QitZY0pSenRtd1diL3MwOXhIekpnU3AzUTd5d3NwcTNDaDkwVmZYdWpuZ0t1RzB0bWhPcERYekpKQmtIeGE3QjgrOEZzNGZjMDY0L2IzZi93djhQaU9aMWxzZVpYZGo1YzVJRTRTOFk5NFYyZVlSZnNhWUZhOEUvOFkyUElxc3grLzk0TEwveGJwMlNSTlNlQ1JnNUQ1cnZDdzRNZ0ZSRDA0NWppczRGU0ZqSmkwRFJSVFMwbURiTGZNZEMxQzVieGJub29UM1RmR0FNYUhDMUlYV204Slo3NjRvSmkwRGQ2OHlQdHEvQm9IUWpaZWxPMFNMNlNHZ1Z6VTZXdGF2Zk45YmE4Q0xpeVJCdmRBSXZJRkFYSU5VREhhRG9jTjlRWXdPR0NTQmlidU1KQ2QrSWNVRGZZVFRTM05BNEJPL0ZuczdLY0YvQm9ua2Y0VUFIZGk1azhBS0RPRE5FbjFJT1E5MDgxcnB3UkhGMDU1YkdnZ0paaitvbEpYbkdUQjBkcFFRVG1FcERrWG5PQklYRkFjeTB4WEV4V0ZGMDQwcVU4ZTA4SnZiVjZxRGRINERlSWlzRjhvOVhKaWFtMlE2KzNMaGZVdWYrNHVYMUd0RjB5UnlnbHBTMHhqSUR2eER5bWFGelpuQUVKZkJoRmtqYjhHV0JidnhMOHh0cnpLN2NmdlBRQlZvQkhsOWlSN0QwQk44VGVtaUpVWkRadmFkWWlUSGh4Sks1dzRocGt1eGJTMGdXdS9TN1E1MGRRd2FWbUt3NHBLWFY0OGNXZ2JLRTRnTDdXNW9EaksrYXBuVW14Y3FPM1grNFd6ajFSTzVlMFVreXVyY0VIOUI1MHZHbzZRK3EwODAwN0tNZ29KbWtraGdQcU5iUXhrSi80aFJjbXhydSt4a1RYNkdpRFFpWDhzYkhtVm54L25KWUNFVEEwVWYyVUdBRkFDdXlNZzV4ajI0S2dHWkNiSVdnSWlYZGFDTEEzd0ZMTkdHcGI2MTBVamhCY0Z4MXVvYkx4NGNNSHlvdUJFNHNML3JYNUtHeXk4K0E3bXFIL2Z2a1o5OHJ5b2JWRDdvcjdzM1M4b0YwcGRLcThFaC9ZRjIzZEJoUExyTWxyLzJNWkFkdUlmVWxRcDNNSmpBRDdXL0hQQW5mZzN4cFpYK2Z1eHZ3aUl5UmVXczUzaUhnRFpXNXkzK3RXY0dURXpkbDl4TWdka1dTamtnR3dSSDZVL2hiN1ZqNitYMm42YitLanRaekJaTG5qUnBENDVMcWgvamwvelcvMXN2RlFiZEY1VS9tdndxL0NpWjFWa24wRXZPYXFnekZ5WTJrOHg2M0JCRHlBQS8wQko5MHZrNHhyYkdFak96NGYrMHkvZ2xGV3J5NzgvZnNQbmNiZnR0ZWVPcXA2MDRoOW1VUWNLdGI0R21CWG94RDhHdHJ3cXpJOXgwSmdrVlRBeFFLYjBibUtyVU9VMTR3S3l4NHpHVDV4b2NDeTllT0FZWnJxazhxR3BiWmRvYzZLcFlUckZ5VU5VYUJ0WVhuUk1kc1pNMjBCeDJEYUVjVUdxR0lCRDI2clcyemJyVjl1djl3c25GNlRDUmt5bERYeDdLdit4QnNzVkY2VGluUGxNRktudmVUQ1RuM05QT3gzcjExWlBFNndjSGJPQjFQTGhiVzNpQit4cTlNTy8wc1ZsaWZJYmJMVXlBSjM0eDhHV1Y0WDdVZThCU01oLzBzcDhnY2FXdEpkL0RkQVZrUFA2Mm9PakdwRERBaUpkMW9Jc0RmQVUwM3QycC9wVU1LdE5BVUtsNE1RWXdEQmNVRXdOUjhyZUdBWkNHaGMxWnYwRWg4ZFVCTmJDaXk4WEdxWkhYM1B6b3JhQjd4YzZMekptL1hjbkVCd0xGOFZUQU5wYlBwUEVQMHVjRVB5V0xZb2ZCOFJKTC80TGFLYWJBTzJmQSs3RXZ6RzJ2S3FlSCswd0thOXZTQUJJVVpXKzJ5bEorVmtpSzA0ME9FSU9zb2FBN0F5NHpJemRWNXlpcDNhVnZoUWo1Ui9FaGRaK3gwQ0lGZEJBY2JMd2EwNzVxejd0QXhpL1BxTGkxT1ZGOXJsa1V2NXF2ekJtQUV6cm01YlY3UXQzM29ZVlk2Tkd5UDB2SE1sWE5mT2o0dktiRy9wb0V6OWdWNWVmWkpIZEE4QldwaFAvT05qeXF2cCtySDFHdXdWQTVJRW8reTMyalpmQ1pBSXB3WXlkOHRkeFpFeHRSa2ZiNXkzVXZwa0VsUXNkUnhJVmltUGhRdVpGeGJHSnY0TmZlandwVG93QmpNWUZyWmZPaXptcnd0UTdrQXV1WDFneGxSbTcrUkcvR09lTEFZZjVHcURwUEpkcksrM0JsdmUxZi96V1Rad2paUlhuVjdadlBudy9Wbyt2S1AvZWRlaUFFemZVaHdPZ1BmeUFYUVA5aEI2OFJwY0J2QzhCZE9JZkIxdGVWZCtQejVPYVdXQkpKT2ZGWG1tYThqTTZVdGZRTkd5NFVEdG11aFRUZTNhbkJtR0txZnAwWURMaXBMZEg5aDkxQUVOeGpLbHRoOEF5dk9nQ0dvZ2pDYVdRNm1odFF4UXVmSGxSMjZCc2wvcUlnaE15Z0tHOG1QcGFBQmZjaTRDYzl3WGtWV2hsQ3NtNDlvMWJIL255NTRKdzYvaFlFUHlBWGIzOXVBTjZLNGZYLzNQQW5mZzN4cFpYTmZQRHZ3WVkrbnNBeW1BcXBBSkovc1dnOE9ESUIyUW5EZzJrRk5ORG5PcWtkcTJZU2o4S1RmbTdlUEdkTVd0dG9EZ3NGN1paZjAwdUtJN0dpK3FUOHFKelFWejdDMTV0WGhDL1gyZzRUTCtnbUlIOXd1ZDhVY1crbXZ6bkYvV0tGYlkzL3NReUJpNUtmSFJBTER2eGgzWTQ1KzF5Z1BNU3dFa3YvalNndG93ZjA0L1hKYVB5M1NGNlVLc3lBSG1OTEFHWkM3aXNVSUVJWGtoS3VseXVGbXlDWnhRYzJnYUs2UzNVOVRJSkhJNGtLaFRId29YTWl4OFhmTjBWZnVueHBKZ05CekRXZm1IZ2hjdXF4T0tDNnhmV3ZpWmxNZ2luV2h0VW53M09Gd05tTmRnZ0RWdW90OE1BcEtQVFZjeEtpLzNCZTk2SFUxYXVLdisrN210ZnhIYzJQK2x3RythREFXZ1BQMkRYWUQ5Kzl3QXdiNFpxWnRZTVFDZis4ZkJqKzlHK0JDaFpvdDgxTE9URkpFMnIybkFpNXhFY3d3T3l2K0J3d1ZIRFlZTXdGUXJWcCsrTTBZSkp5MnE4VkF1aFF1VTdZNVp3S0c4V1h2UjZxVndRSEFzWFZoemxITFZsRDNRdVpKL2NqTm5GaThRcDNVNXhsTEo4SDdIMVN4c3ZNbzc5bmhnekYrb2xnR3hiV0RCdCtsMlpkMS96RnF3WUhUVnUvOXkzYjhIZXc0ZWNPQmR1UEZONkRIRE4yQXBMYWJuLzFETEg3b3RXL0JmUTdKOEQ3c1EvQ241MFA4THg2dWlFQksvcWpiOVNIZElrSWNIVEZoejVnT3ljRFhtS3RsdWNHRkdwUVAwd05YRXl0MEhhVGdyWmVIRU9ZQ2dPclRmRk1YRGgvMzBFZjM0WE11VlAvWWZ4QW1lLzRIa0o1NWNiUUxpNGFIeStGRGlVS00xczJ5S1pBUDdEcTYrV2hGdTFXeDk5eUdzQUVPYTJZZHNjdXk5cThRL2Z4YWF3UWVwci9oeHdKLzVSOEtQN3lXR005d0JZZHBQZk01NVc5VktEVUxtVFE2aFFCVGJmbEQvMXFRZmt3TlF1eGF1Z2pBSFpuZHJXbDNueFVYRVVVYUU0Vmk3b0ROV1BDK3JUeUsrVXZTR1l0WG1wTmdUalNBTkJXcGZtWEJqN2hWSXYybjVDRXpzUTRnY3REdEd1S21iaFJjRmhCc2pxZW1wSlFxNy9relp3ZjlXT3dienIxcTBUZjlSVTNPWVcvQjRBazNYaXIrTkg5ME5nL0FjQXhlTisxYzVKa21UM0FDamlRRjNFU2Ztcisvb0YzSFpTL2hXQWJaYW9ZZEt5RktlaFVIR2NPbkZvR3lnT3k0V1pseVl6Wm5vc2ZMTUhPaGV5VDNNZk1XTktuTkx0TEMra3JNS0YzaGQ5ZVZGeG1BRU15NHVqWDFnekFDMWFDMjQvL2MyYnNHS2t1cFN3WmVmempOdUdqaDI3THdYeHo4enc1TDFsbzhXOHl6ZitHRkRtclJOL0ZUKzZId1dHKzE2ekVLSjZHMkM1bVFScDhtZFN2QzQ0MjVFTmlIcHd6RmJXbmlXeXdWRXUyK2JkM0JLbTJoY0Uxd1liRnpaZVBMaWdPRlJVS001OGNVRXhhUnU4ZVpIMzlSYzh4NHlaYnBkNElUVnNrd3ZhUHU4QmN0M3pwZGl1UGdhWVNHLy85WGo0Ti93ZUFPRXVVc2UrOE8xYkhXNGJPbmJzdm5URUg4MXYzS2hwdGI4RlVCWHN4Ri9Gais2SGdiRmxBSXFBaytTOUtsRVBrUkI1QmdCS0VQWVhiZjlBR2g2UXVlQ29CZElLeWlFa1lRR1o0NElUSEtrTkZNY3kwOVZFUmVHRkUwM3FrOGRVZkZMTTJyeFVHMEp4dUpTL3F3MisvVUpycTRhajl3dENFeXZhL0tERmx3dkhBSWJpU0x3UVRMVU5OVElBNFh2RTJyaytiaWYrM3FhcWE4ajFmNmN5TnhvQWRPS3Y0MGYzWTRCeHZ3Y2d1OGxQaWlkQ1ZQVktFajZZY1lIVUlFNTZjTXpMZXVIWWc2TWtjRlJJRktFSUVXMHZURnFXNHJCQ1ZaY1hUeHphaG5JWHZkNHVYbXB6UVhHVWMxUFBwTmk0VU51djl3dG5INm1jeXR0WlhraFpoUXZxbngzQUdQbFZjWmpqeWZJU2RyNXdid0lFeUt1OTRmdkVtSWN4cnFMRUxRZEVKLzY2MWJ3SG9IRkhtUGV2QVJwTlJPcDhERzYxMkM1K2REOFdHRHYxOHN0Q3NnQWtneVZsQmtBTnlFeVF0UVJFdXF3RldUWTR5bVZqcGJtZG1Hby9FRndiZUM3Y3ZIaHd3ZktpNEVUaXd2OE9lYVVOM3J6SSs0WUlucGxmaFRlSkYxc2JHdllMeW9WU0YrS2l3b2wydmhod0NBTzgyYmU3OXJZVjdNUS9wR2dOUDlaZEdvbHA3YWNDNXZWcmdFWVRrVG9mZzFzdHRvc2YzWThGUmtCWUxnR1lIdzhVcUdZUGFab2FoY281TS9LY3NidkZTVi9tQTdKRmZKUytFL3BXUDE0bzFQWmJ1TkRhNzVnbHNnTHFMMDdVdjVYZklGNnFEVG92OW43aHhhL0NpNTVWa1gzR2VZbVVBWWZXbTJJR2NxSHo0dWFDNTBYR29lOEJxQ2FGQ1lRUVVDOFBTSWtBcVFHTzRDeTRWZFZLOVIzK3FoMmVPT3FOYS9KUnk5ckVEOWcxdnZoajBkMERFUDFyZ0VZVEVUcUdBYmRhYkJjL3VoOExUT0hEOVNHZ0txaGtRVWtOWEdtU1dBT3BXWnpDQWpJYkhKa0JCUGxSZ3FkWktLS2t1WjNpNUNFcXRBMHNMem9tTzJPbWJhQTRGbEh4NVlKVTBZOWY1YnpVTXltMldiL2FmcjFmT1BzSXFUQW4ybDRDcS9pdlBZRFJlTkZ4b2cxc2xVc0F4V2t1cnlVbWlIWUl1R016QTZUR0xlczcvQU53YlQ0V0ZYN0FycTJJUHhidXBZL3o4alZBbzRrSUhjT0FXeTIyaXgvZGp3V0crdkI1REZBSUlVMFRwUGRJcGlrVEhITXZsb0JJbDdVZ2F3aU8vbWxZbXpnWmhNcUVxZllCd2JWQjl1ODlnR0c0b0pqYUxKSFdtK0xFbnZVVEhDTW1iWU9GRjE4dXFIOHZMaWdtN1VNU0wyb2IrSDZoOHlKajFyK1JrdUFFOVF2YitjSnpvZUpVZFpZRGJUbmdKeS93SXVSSjFoZHovQWFtZkpTNDVZRG94TDhWcS91SW9HU3RmdzNRYUNKUzUyTndxOFYyOGFQN3NjQ29QdXl2QWk2TXZEaEV5T3ZUSkZXQ2tDWGdNak4yWDNHcUU1Q3RNMGFsMzhSSStlc0IyU1krYXZzZHMwUldOQUxGeWNKdm15bC9tMUNGOGFLMlFmWVpwVjlvT0V5OUtlWThjRUhjS2R1VnZpYTFvYm9FSUtmOFJmbm9iZ1hNMjh6Y2xMNlNLZCtKZjBqUkduNUNkbkZyYStKVnlvMGgxY293QUVpaWZBM1FhQ0pTNTJOd3E4VjI4YVA3c2NCd1BweDNBcGZiU1ZDRXFJSUtmUStBRXRoaXAveDFITi9nQ0NVZ1U5RlE2KzJiU1hEalNBR1o0bGphSVBPaTR0akUzOEV2RlJXS0UyTUFvM0ZCNjZYellzNnFNUFVPNU1MTnFZS3B6TmpOai9ncC9ZbjQ5K2ZGZ1dNZElQdWVMeklPTmVaVWx2MHBOalU3NVN6VWlYOUkwUnArd25lSkllN0IxdHJYQUkwbUluVStCcmRhYkJjL3VoOExqTWxIeUQwaldhQ1RJZzJTSk5XQ2tIMFdZNXZSS2NIUmUzYW4rbFF3QmFIR2hjbUlFeTBiSHBBREJ6QVV4NWphMXV2dDRvWGpJZ2hIRWtvaDFkSGFoaWhjK1BLaXRrSFp6dlJMNzM1QkttZm1oZUMwekFXTGsvdjJmd2VBdmR6TTNMUzFhQ2YrSVVWcitBbmNSVUJ3R3R2MGZmOWVBbUg0RmtDenJ3RWFUVVRxZkF4dXRkZ3VmblEvRmhpYmo1bitOTHUrZU9sUEFtU0JSVmJHMHRJMHl3YXhRZFk2bzdHTFUvVFVydEpuUWxQK1doc1V6S0FaTTYwM3hXRzVzTTM2elZ4US94eS81cFMvNnBQeW9uTkJYSHNMWG4xZVNOazJ1Q0RMVXIwcFptQy8wUHVJbXd2aVR0bXU5RFVqTCtwYkFLbnByL1FtM2tzL1dmcGZxSnVrTWk2N2JPTVpHQm93elEyQkozYnZ4c1FVYzVraHdJZlZITHVmZE9JUFFIbW1ZOTRzK3RjQWpTWWlkQXdEYnJYWUxuNTBQeFlZbDQvSm1RbkRGbkxUSHgwTUtIbkVORTBOTTFNNWtORkFhaFZxZytDRkJVY1lBN0x2akprdTgwRld4NUZFaGVKWXVKQjU4ZU9Dcjd2Q3J4Uzc5Vm1pbXhkZW5EZ3VuUHlxNTVhQXVkNkJYSEQ5d29xcHpOamJUUG5ybUFxT2RZRHN5NHVNdy8yZG43ams3NlQ4S0pCSkxzcnIvMExmNWh1M3J0bDBJYjd4MWZ2WmJhKzQ0bnpzR3o5cUhBQjA0bC9UeHdJOUJoRDFhNEJHRXhFNmhnRzNXbXdYUDdvZkM0eVBqNm5aU2ZSRkg2bmphWURzWGdIOWNKWmZBelFHWkgvQjhRK09haENXQTJLOTFLNEZrNWFsT0t3NEJRNWdRbkVvYnhaZVhFTGhPeERpY05nME44VnB6SVVmTHhJTzNVNXhsTEsrL2NLUEZ3TU81WTNsSlp3TEY2ZVNjZXNBWkJIWkx5QlB6MDZSUmhMb2dMaDE3TmdrUHZxeEw3UGJmdjYvL0FCd0ZoOXpPdkd2NzRQTzFlYlRvbjBOMEdnaVFzY3c0RmFMN2VKSDkyT0JDZkV4TlhzY280UE1DenNTR21DcTFLRVVkRWlaK1U3NVd6RTFjZklMcEhwQWJqWmoxdHBBY1F4Y21KOEZyOGtGeGRGNFVia3dDS3kyckFxVkRhY3VMM0QyQzU2WGNINjVBWVNMQzY1ZjZIM0Vrd3VsL1pRWlBudGpQc05wKzdMc1hZSTByV2I3UlViUGRxL0F3ZU43ZFZ5angzaldpWDlESC83U0gzV1FFT1ZyZ0VZVExYVStLZ0F0NDBmM1k0RUo5VEU1TThFUEFFb3o5NVdVelFDUVdqZ0RjdURNU0FtTzVhcmFRcTB2OCtLajRpaWlRbkdzWE5BWnFoOFgxQ2VQbzRnS3hZd3hnQW5DVWRvZzFhVTVGMXkvMExpZ21MUXN3ZEhib1BxMGl6YlhSMXlZdmlsL2pUZTFyMW1FbTI0dnNuYUZKVVhxSHdsRWtadzFRTzA4OG95TWFTb1kwVHJ4aitIRHF1dXRaUVlhZnczUWFLS2x6cWNHcVJieG8vdXh3TlR4Y1h6bUdOWmhQYnV0ZkZGUWtzOGNrZ1JKV2dXV0pFMDF3VE9uYytzR1J6VUl5d0hSbk5xdEFHeXpSQTJUbHFWMWF5aFUzSXpaaVVQYllPR0ZFNG82WEZoeGxIUFJsajNRdVpCOW12dUlHVlBpbEc2bk9FcFp2bytvZmRHWEZ3TW01WTNsSmFSZjJMaVF6eE9UQ2RFdlUvMUprcURYNnlGTmkvOVM5SHBwZmg2bklDMlRiQmNaQUN5MCtGOXd4bGtZNmxVU3MyUC9Ycnh3WExsM3lWSEY1U0grcVBzcTRGWStCcFNnYVFaQXROVDU2QW5WTW41MFB4YVl1ajUySDMwV1o2NStNYk9sdUtKRVhoYVZaQjhITGdjQ3JsbWlsemd4b2xLQmVndVZNM1d1SG5kUjFkdmFCb0pCaWt1WXdUaVVDNG96WDF4UVROb0dJeTh1Y2ZJVlBNZU1XVXB0VTE1SURkdmtncmJQSTN2QXRrSGlWSkE2cWx6NDQ5aFMvcXIxKzlsVEFHbmFROXBMTTlFZkdNREF3QUI2QXdQbFFDQkJNWml2L0FGWlJ2RFE1UDZxL2kyYnk4Y2Z2dWQ5T0gzdHV2THYzLzNIdjhPL1AvQWRDdEFJMzdGelFORWFmZ0ozY2Zrd0tIbnI5d1NZaEw3K0FFQzAxUGxVRVdnUlA3b2ZDMHdUSHpzT2IySFg1MUlQb0FvbXZWNFBhUzhMSUFNRGc1bHZnU3BBQ1ZUSGpnM0lBb0lSZjFFdU0rS1U0Nm1pTGNwbGdxTXRFNXdjWFFoQjZpaUtLa3RCVm1nQk9kOUh3aUZ0S0hBMExraTlLUTdsZ3VJUS95Wnhxbnd5L0FvaEM1WEdTOFdwekV2WmFJa0xWYWdxWHVSNmEvd3FYS2k4bERpVVU2VmZGTWVYOWd1VkY2NWZWTHpBd2dWcHY5YlhTa2NNcDZJNjE3UStvbkFxcW9wSW1FcS9rTTRYUWhESGk0ODljZjl0U0pMc3V2OUFid0NEUTBNWUhoN0c0TkF3aG9hR3NvRkFmZzRMQWVuSk1RRmc5d3ZiaTVZRWVOVnQ1Y294dk9jbnI5WFdYM1hWUlhqbGxSZEc4ZUhhZlRtSlB3QTFBOUMyOEpmNG9aK1VzNXVJMERFTXVOVml1L2pSL1ZoZ212bzRlSHdQams4YnZzeVZaSS82WllJL2dJR0JRUXdORFdGd2FBaElnQ05IamxRMTBBSnlKUlNWNE9WMUprRlZFaHdTRU5WWlZDWDRkQlpaQldSK2xtaWFqVkhSa0RGMXdhZWlJdVRBcnMxMExUTktEYWVpbVJWcXlxbkVTNGxRQ29YS0N6ZUFxUVMwd2hRVVJ6a1dFSVg0S0RpU2dGYU5vSU1TWHFodFhKUTFaeml0K29XS1dWUmFLbHUwZ1lxLzFrZlVRVXUxck9GVURTUzhNUHd5Z3psUjh1STVnQ0hIaGVMNDJ0T1AzNGRkMjU5Q3I5ZERMeGYva1pGUkRBK1BZSGhrQkVOREl4Z2NHc0xBd0NDU05Cc2txRDZlTy9JMFNLdHIyOWpZTUw3dmUxK3ByYi8wa25OdzBVVm5OZmZoMkgzWmlUOEFpK1NHdlBRbitFbUNlQmtBMGZEQVdYQ3J4WGJ4by91eHdFVHhJZVFzUVBuSVg1SWdTZEp5NWo4NE9JeWg0V0VNRFkza3FjUVVIL3VidjhUMHpJd1VrUFhnaUZLb3NrVXFHcEFDYXlrVlVrQ21vc0VFNUJKVEZ5b09SNW85cStKRXBvSFdBUXhwQnhVS0ZiT2E2WG9NaElnNGFMTkV0UTBTTDFCbXoyV3ROTUVwQlZiaWxBZ29GYm5Lc2N3cDFHV2RDMVhrSUMzTFB2blpjMWw1ZlRCSCsxckpCVE9BS1hreDhFdjZtdG92UkxsdjBYNjFQZXBBcURwR3J1djlLaTljdjVBR01KNjJiOWQyYkg3b1R2VHlWSDkycmc1aGVHUUVvMk5qR0IwZHhjaklDQVlIaC9Jc1hnOUpra3FQQms3T1RPQ3BmUThGK1dWTkFCKzc1WnU0N3JaYnRFMjNiWGtLSC96cWpkaDUrSEFqZlB2bU1PNUNzQnY3Q2R6RjIwZFdMSFRTSFNWTEVPY21RTkh3d0Zsd3E4VjI4YVA3c2NERUVuOEEySDdvU2J6a3RDdTB6YjM4SnFMQndlRThsVGlDa2RGUkRBejFNRG95aHAzUDc4QS9mT0k2dk92SDMxUE9nQVQ2eVA1ZmlFMnhYcFNmS2MyVyszTGd6WU8xNkpPZzNTOENkcjhLdHYzTVJ4V0FpK1Vpb0FycHYycGRqcE8zVzhJc1JVV2dYd0hMYlJLUTJsR0pjN0VQd1NyOGx3SlRZRVBHTHJibjdTaTIwL1lqYno5UStVZGZvSThLaC9KWEZPeExzK2RDUUJYeExVV0gvdXFERW5WZ3dGNUdVUVlRQlpaVWIzWFFWcFludjE2RENiWGVzdmdXZk5COXRRRVZPUTdGL3RWK3RJd2dkVkZGWDdCWS9MSWk2a0xCbGZwS1dVamlVem9tQUlCcUJuLzB5SDcwZXRtbHVlSmNIUnNmdzhqSUNFWkh4ekU2Tm82aDRSRU1EQTZpMSt0SndsOHNQN2p6RHN6Mlo5SEk4cW9kbVp6RThSTW50TTJUTXpNNHBON0VaN0hmL2ZUZllXaXdrcGhuZHU5MnVHOFFGd04yWFlUaWIvcG9xNC9OejljQWpTWWFIamdMYnJYWUxuNTBQeGFZbU9JUEFOc1BQNFVEeDNmamxMSFR5M1ZKQ2lCSmtLWTlEQXdNWUdRNG0wa2NQTElicThiWElCVTlDQUNQUHZvUWZ2MEQ3MGUvUDRkK1gxaDdVdWlzcHE2MWNxemRUZzJyRjZBdWxmTkZablVydEZCZk9vOXZNZnREOFZtMkpFblFTM3RJOCt2OHhVQjlmR3djWStQakdCNGF3c2pJQ0lhSGh6RXdNSWhlZm5OZ0p2eFpmU1puSnZERTN2dWFWYWlGL3ZibzltM2UrTXRaL0QydGxSY0ZOUnNBZE9MdmhSM1ZCd054NzQ1djRIdGU4bU1Bc29BaVJIWUpvTmZyWVdCb0VJTXpRempSbjhBcHE5ZmphSElrTDVkaWFtb1MwNFBUNk0vTllhNC9od1Q2ZFVXclkrK3Rhb0c0eHpUVzRFU0hjZU42dmFGTlNEL21Bb3ZWUFBpTmRBUzhRUmVDc1ppRDRPTDEzR21TSU8zMU1EQTRpT0doWVF5UGpHSjhmQnlqbzJONStuOE12VFRGd09BZ0JnWUdwTlIvT2Z2ZmRXZXoyWDlMWko2N2ZnTUdlNzBTZjllaEF6ZzJPY200NzhRLzBLSU5CT3BmQXVqRTN3czdxZzhEeEhPSHQyRDMwZTA0ZmVYWitab2t2NXM0bXkwY256dUd0U3RlaEtuZUpBU3lKd01HQmdkeDRzUXdwcWVuTVRjN1d6NkNKQWU1b0xPTC9OUnZxMCtRTllsdTB3QmRad0JRZDJCakxCbllCbXZwT3UyeEdVZDcwNWphY0dBNFgrSVIzTE9GdHFCWVVqN1QzMHQ3R0J3YUxHZi9ZMlBaQUdCa05Mc0pjR0J3QUtMZno3N1FRbDhMaU96TmYwL3M0OS9iSDFiUCtQYWgvL1FMOG1PQW4xWWVBMFFuL2h1L0NkTUFBQ0FBU1VSQlZLWDV2dXZaejd5eDZyMEt1Qk4vTCt5b1Bod1E5K3o0ZDd6dHBUOERBR1NHa0dKcTlqakdCc2NoRW9GZU9wQm5Cdks3aktkT1lHWjZHblA5dVd3QUlDdzFyU0d1ZmVzK3pwd2c0enE4RGttaXZQUEF5d1M3S0pkb1B0TDN3b2k4ZjFCZlZJK2ZkNHpTVXg2MWNnak8vZjM3VUxXcTduRVQ5czFzY1Z1cGFnQXcwQnZJTWdERHd4Z2V5UVlCb3lPajJlTi8rWTEvdlRSRmYzWVdTZjRJTDVDbC9yKys5Yk9ZcXp2N04xVHZsNjk5TTE3WU40R2Yvb1I4V2VHTkY3NEVQL1dEYjhIZjNuNExuanQwcUo1UHlYMG4vc1NhRGdCcTdVOEhBQlRBUEFEb3hOOExPNm9QWjV3VDJITjBCKzdaY1ROZWVkYWJzcFVKTURzM2c3bTVXUXdQamFMZjZ5UEozd1V3a0Q5aU5EVTloYm5aV2N6TnpXWTNrQlZaZ05ES2lianBVZDVMblh5d0pla2VOblZtOWhjZU9DNlE2dk92TVFjbm5GRFhPVDcxajZud0UzOXRZQmN3VENqSEdQNTFwSk9zc0xicEF4cHVGYnVQdzNwcEQwbWFZbkJvQ0lQNUlHQW9mL1ovY0dDd2ZPNC9lL3NmTURjN2c5N3dBT2JFTEw2eDdRdVlNRDBHN0RKTDlhWW1adkIzMTMxVlczLzc3WS9oc2t2T1JScHcyY3U4dVJQL3hXQmhsd0E2OGZmQ2p1b2o0RVI2Y09kdFdEMnlEaGVjK25Ja1NZSkR4L2RoOWNpNjdNNzNYaitmU2ZRd09EaUltZUVSak03TlpRT0EvaHpBM2UxY3VHOGlsbHFnREQ2N1FqMlNVc0p4Zkh6OTIwdUdEazZFQmRPZGdRa1lLa2hGK2YyTW1VZXljOS9iSmFmNmdUTm4rSXF6WTNEbk9TalVpMlZycXZleStQUGRON1RaWkFteVYzS25hUys3WDJlZ2g4SEJJZlFHQmpIUUc5REV2emhXYzNPemVHVC9QZGczc2N1N2JwSTVxamQ1WWdxMzNQcXd0bjdMbHAzWSt2UXU0Q3pIQUtBVC8yRGNnTy92THRESGdEcng5OEtPNnFQR2lYVGJ0aTloeGRCcVlBNDRaZXkwTEEyZlprRTFleXRnRHdQOUlRem0xLzFGL2dSQTRjd1VlMDJCTXF5WlRJYkJYNFg1dGV3bW4ra25tQ2JVT1dhNm9MZ0VyQlRka0hHRFhkVXNPRXI5bUZtc2gzZExuZHo3MlhjVGh2WGVBUHBtdGg3dVBrRlhTd01qMVYrTjgxSW8vcXQzZG1TWDZ0STB2eGt3ejlMMTBoNlE2amY4VGMyZHdDM1Azb0RkRXp2c2xUQlhMcmp1ZGZIZjk1ZC9nalN0cE9UWTVHUW4vb3ZNL0FZQW5maDdZVWYxVWZORTdZcytidDd5cjdqNm5CL0lYaG9DbE0va293ZjBSQjlDQ1BRSCt2bHo0M1BWczk2ZWRYRzFyd3lkdW1MWVlCbS8vblA5c0EzbXdwSStOcGlKZWcxT2dtQ0xBVnI5b0JPUU83Q2VtMTdEZ3hvRE8vbFplNzk5akd1OWFiTFYyM01tYnhnc3NNTVFJY3J5UW9oczZwZFVqd01XWC83TGhMTVNmd0hnNE9SZTNMcmpCa3pNeEUvN1o1dmppVDhBSEo0NEZnLy9aQmYvZWpjQnR2SXhJQm00RTM4djdLZytHcDZvSjJZbjhmV3QvNHJMMXI4YVYyejhidlFHZWlTNFp1OEFFQVA1UzNqeTYvNWhGN04xc2FURzkyWHp0TXZzMmFOT2dZTVRNN1JiNU9UWmM5M0JpWloyOEVZSjE2YWFneE5YMjdRbUJFZFBiWitnd1lublZtSEttb1IzSzgrTjRZT1RKS2tlQ1FTUVhWOW5YdlN6NWVDanVQdjVtekVuNW13MU05czhpMzlVL0pOZC9PZlhxaGRJd0pVQjZNVGZDenVxajRnbjBzTjc3c1NlaVIxNHczbHZ6eTRMb0pwbENaTGtvYk1TZDEwQ0FyZndLbVhHcTNVVEdoRkw3OTJYL3VCRUx1Q1hMVmlTZzVOZzJIa2VuRmpqZzJVTmMxbElRT0NadzAvaTBiMzM0dURrWHU5YWVEaFdObmZpSDkxSElLNWovdC9hRXdMbUFVQW4vbDdZVVgyMGNDTHRQZlk4L3UzaGorSENGMTJPeXphK0JpdUgxMVpvL1ZCRVRkRnNmN3EzR0ZmWG5hSXQ1c0dKTWw5ZTVvT1RZRGNuMGVCRXFDc1VtK2xQWS9PK0IvSG8zbnR4Zk9ZWVc4YmJhc1NVdFd0VzRNLy83SDFzK2JQUFBnMmYyL3hBSTN4dld5YmluNXNxMHZQeUNrMStBQ0NRZE9MdnhvN3FvNjBUU1FDelloYVA3YmtYaisvOURzNWI5MUpjdHZHMU9IVjhBNUxVLzliVCtUWGhta3p4Ky9qLzZkN1NEVTVDdlVxcmF3OU9tcHpEUzNSd010dWZ3ZjZKWGRoejlIbnNQZlk4ZHIrd0hkUDlxUkF3bXd2TFpyN0F2ejcwSFF5a1BYYmJnMXYyWU84TFJ4dmhlOW55RXY4NmN0L2V4NEFFUkh4ZDZNUy9GbjRqSDZvSUNvR3RCeDdGMWdPUFlzWHdhbXhjdFFrYlYyL0N4bFhuWW14b1pUMGZyVmhTL0Q5c0gvOC9HMWczT0RHVkVnVTNTZkZkQ1ZIZVlGcktuZlRSb0VJNHErMVZ1ZUl2VWVIbWVLVjRLampTcDRtTGZXbjVBa2Q2NFZXK1REOGVKSzJUOTVQcWplTERUYlo2WkRpei9Wbk16RTFoZW02cS9KMmFQWUVERTN0d1lHSTMrdEk3SVJZMnBtdy9lTEJWL0tiWWpmMHNOdkhQckc2SWF2U05nT1lmQS9LeFR2eHI0VGZ5NGRqdDJOUVJiTjczQURidnk5SjU0OE9yTURhNEVxT0Q0eGdkSE1mSTREZ0dlMFBsbEpBTmpFeWdxK1kxSkhBU0NiQUhlK2k0aW4rNlhjVTBCdjF5SDJaL3RYMnFQeUZ0bGJDMGZTemlKTGZid0lXZ0pUanhNZ2lhZExEMU5wajJvYXloVDlyTTFOOTFyRTFXY2R5U2FlMlBpMTB0THFHNDFhWTRlK0Jmc0g0OXhnWUhqZHUzN3QrSG84elhCbjJ3NWFJbmgvZ0h0Q1A2bHdMamZBN1laa3YxSkRKZ1IvV3hRT0xQK1RrMmRRVEhwbzYwaGg5UXVKYk4weWpkN0NkaTEyWjlSRDUxaEh4aXRtS2QrUHZoUi9XendPSXZJUERXbDd3VTM3NzVVWGI3eFJlZmhjblZNM2p5QlBOcDRPVXMvbUdQQWRaOVpGQ3JxVG9BS0lEalpBQ1c2a2xrd0k3cVl4R0ovNkxCNzhTL0UzOS9CNTM0ZStCRzllR0pQejA5ZzcvOHE4K3paWDdpeDkrRTRaZXREc2JtL0FUWlloWi9zOUgwdm8vb0J3OE1URUxmUEFPd1ZFOGlBM1pVSDUzNE44WU85dEdKdis2akUzOFd1MXBjUW5GcmtZaC9HOWlOL1N3QjhZLzZMY0FjMHFlUWFRRFFMQU93VkU4aUEzWlVINTM0TjhZTzl0R0p2KzZqRTM4V3UxcGNRbkdyRS84bytFRSsycDM1TnpIdm9VU1NKRW44bXdDWDZrbGt3STdxb3hQL3h0akJQanJ4MTMxMDRzOWlWNHZ6RTdkV2o0L2piVmU5RHErLzVPWG85YkxIN25ZZFBJRHI3N3dWOXp6MWhOOXJuenZ4ajRJZjVLTWQ4VjlVSHdPcTU2UVQvMXI0alh4MDRoOGQzK21uRTMvZVJ5ZitUbnpxNTQ5KzZ1ZHd5VG1icFBYbmJ6Z0RyNy9rWmZpTlQzNE1kenorU0RDdTZxT1JkZUxmR05mYlIzTlpyNFVRN3hKQUovNjE4QnY1Nk1RL09yN1RUeWYrdkk5Ty9KMzQxTTk1cDIvVXhKL2E5Ny95dGNHNHFvOUcxZ0IvYUdnUVAvV2VOMnZyWDNiWkpyem1OUmQzNHMvYXdud01LTTRBb0JQL1d2aU5mSFRpSHgzZjZhY1RmOTVISi81T2ZOWFBwdlVickx1ZWM5cjZJRnpPUjIxcmlEODQyTU03My9sNmJmMUZGNTJGS3k1L2NVQTFsb3Y0dC9yZVh5dDA4MHNBbmZqWHdtL2tveFAvNlBoT1A1MzQ4ejQ2OFhmaVIvV3p5TVVmQUQ3NTdUc3dOem1qcmI5dit6UDQ4TmUrZ3NPVGt4N1ZXRDdpbnhkWmtMZXlEeVQ4Q3dqOE1nQkw5U1F5WUVmMXNRakVmMUdkUkRXd2czMTA0cS83Nk1TZnhhNFdGeVp1elpGWC8zTFc3NGYzazhVZy9nQnc2UGdFcGlmMEFjRHg2Um5zUFhyVW94cUxLRzdOai9ndmtQdzN1UVN3Q0U2aW1OaFJmWFRpM3hnNzJFY24vcnFQVHZ4WjdHcHg0ZUxXL1Z1ZndzemNuQkhtM3FlZWNPSzZmQVJaMi9qZTFWaEVjV3UreEYrM3BpLzk4UjVPMUhzUjBDSTVpV0poUi9YUmlYOWo3R0FmbmZqclB0clNUOUdKdncrK3k4K1JpV1A0MHQyM3M5dU9UaDZYdDNYaWI5dXBIUi96THY3V213QmJ5dytFdndkZ0VaMUVNYkNqK3VqRXZ6RjJzSTlPL0hVZmJZcC9tN1pNeEwrd3YvajhaL0NsdSsvQU5aZGVqb0g4UFFBN0QrN0hUZmZkZ3hNejAwYmNFQjlPNjhTL01XNndENlpJZ3pjQnp1UFhBQmZoU2RRRU82cVBUdndiWXdmNzZNUmY5OUdKUDR0ZExTNnV1TFZsNTNQWXN2TTViOXc2UGl3QXJlQy83K3ByTURTWDRGMGZ2MWRhZjlXbVRmajVIL3hCZlBxdXU3QjEzOTVtZms0aThjOHRKTzBmTFNQZy83amZJajZKNm1CSDlkR0pmMlBzWUIrZCtPcytPdkZuc2F2RkpSUzNscWo0QThCZ2t1S1QvL3NtYmYxREQyekRmWGMvaFlHMGtwMUZGYmNXVHZ3WHowMkFHeTQ5WFI4VUxOV1R5SUFkMVVjbi9vMnhnMzEwNHEvNzZNU2Z4YTRXbDFEY1dzTGlEd0hNek16aUsxKzVWOXUwOWVsZGVPU1JaNXY1T1JuRlA3TUZHUUpvWXIveXRKWHl1cVY2RWhtd28vcm94TDh4ZHJDUFR2eDFINTM0czlqVjRoS0tXMHRjL1AyTExxSzR0ZkRpai94cC9IbS9FVkM3QjJCd2VLQnl0RlJQSWdOMlZCK2QrRGZHNW55TURnMWpkR2pJaUQ4NU00M0pxYW5HZmxSY0h4c2RITVR3d0tCeCs5VHNESTRYTjIvVndQZTE0Y0VCakZyck1ZdmowMHc5UEd5bzE4UDQ4TEJSL0dmbitqZzZkYUlXdG1TZCtIdmhSdlhSaVg5ajNHQWY4YnRmdXg4REdob2Z5aklBUy9Va01tQkg5ZEdKZjJOc2s0OTNYL05tL09qVmJ6S1cvOXkzYjhWSGIveDhZejlrZzdlOTRZSUxjVWE2QWxOVCtrdE9Sa2FIOE16VUVYenR5Y2RxNC91WWdNQnJONzBZRjQyZmlva0pYWWlIaGdheEY4ZnhoWWNmcklWLzBmclQ4WVl6ejhlUkl4UHM5b0YxdzdqdWp0dHFZWmZXaWI4WGJsUWZpMFQ4NXdOL2lZcS82UWEva0t4QThPQkFHd0FNakF5a1MvWWtNbUJIOWRHSmYyUHNXajRhV015MC8yLys5cWV3WmN0T2JmMGxMejBINy9tMUgyaU1ielBhamovOXM4L2lycnVlME1xY2ZmWnArTlUvZmxjREg4QW4vLzRtZlA0TDMyYTNmL29MLzcwMmR1R2dFMzgzYmxRZm5mZzN4ZzMyTVQraHJiRnBBNEEwVGN0UnhKSTZpUXpZVVgyMEtQN1hYSG81ZnYwZDd5NVhUVXlkd0RzLytOc0FnSjk0dzF2dzQ5ZThwZHcyTXplTHQvM0JiM2pEWDNQSjVmaU5kLzY0ZC9uditSOGY4QzY3bk1RLzBIRmtPRW5kV3JHRnZPWS9rUFp3elFVWEduYzlNSEVNRHp5M1ExcDMwZnJUY2NhYXRid2pBRS92MzQrbjkrOXpWdXMxbTE2TThXSCtzdFBzWEIvZmZPcEppZk1OcTFmamtnMGJqWWZod01ReDNMOWp1OU12cWFwbHMvOHh1ZkNNc3pEWU16M1pYZG5VekRTMjdIdytHRjh6dzY0ancwUDQ0Qi8vREx2dHJMTk93NzgvOTJRamZIUHhKU3orK3R3OWREWmY2eEZCcmJmMEJyTm5OT1pEL0tQNldNTGkzNnExaWQrSi83emduK3ppRHdBRHZSUVhyM3dSL3ZUUFBxdHRlL3NQdndaWHZPUXNkZ0R3cW5NMzRlczNQNi90czNIREdIQXEvQVlBNTUySFAvcWRmOUxXditxVkYrTHQ3M2dkdnJsWkZxeU5xOWZnMm9zdXhvZi83TE40ZnVjQmFkc1pHMC9CRC8zazFYNERnTWd4NVU5Lzl2L0MyaFVybmVXMjc5dURuL2pRNzdVMjgvL0N3dzlnaE55alF2MXNmdTRRbmp0OHFCRStYM3dKaTM5bUMvTXhJSzBXYVpwMDR1K1AzOGpIRWhPaUdOaWQrSWZDbmZ6aVg5akV4QW4yc3NhSy9VZHh5YW1yY2NxUnc5TDZKNyt4Rjd0SHg3RDJCL1JMSGdNREtkRGY3VjFGenUvV3JUdHg1MTFQWU9zK2VSRHh6T2hXM0w3cU8zajQ0VzA0Zmx5K0lmWDg4emZpaDNDMTIySGJhWCtuKy9iUy9zOGVxQVpGaStweTVlSVZmL0RmNUd2L3FRQjlBTkJML0Y4TzVHdWQrQWZqMWl6YWNLZDJzVTk2OFk5c3kwbjhiWGJxSkhEWjVCQXVHenBOM2pBRllFcGd6WG5uYWZ1TWpVNWd4NTdOamZ6dTMvOEM5dTkvUVZ0L0VNQ3oyRlVmZUlIRnY1RUZ4YTFPL0FOc2tXUUFZZzhBVGtMeEh4a2N3bXN1dXFSOFhPM281Q1MrL2VTam1KbWJyWTM3NExZdCtMVy8vM2o1OTF4L0xpOHFjTk1EOStDaFo3Wld1N3VDdHJMNW9XZTI0amYvdit0Q3F1T043Yi9iQXArb2ticmR5eTdiaEIwNzlrbFBBcXhZTVlKTEx6MG5qb1BjWE9KLzhVVm40dEZIbjhHeFk5V1RBTVBEZzdqODVib1lHbjBZK3RHbVRhZmoxRk5YYWVMM3FsZWFyOUh6RHVLY2grZS82RlM4NGZ6empkdVBiTnFrcmV2UDdRSDJOSFlkM3pyeGo0SWY1R1B4aS8rQ0hYZDlBR0RJUmRTeWsxRDhYM2Z4cGZqbHQ3MFQ0eU9qMHZwREU4ZndKNS85TkI0a1FoMkNlM2ppR0E1UEhGT0tab1gzSEQ2RVBUN1h6UXo0aDQ0ZHhiMWIrQnR2RnRYZC9vdGMvQUhnQTcvNkR0eng3Y2V3ZTNkMVBNNDVlejErNmYwL2pGdTNib25pdzJmbS83Ny8vUDI0NTU2bjhPaGoxWnZWMXE1ZGdWLy90ZitJZTU1OXh1M0RNb2o4a1hlK0hrOCsrUnh1dVBFZWFmMkgvdVM5ZVA3b1ljTmVxb040NS91QmlRbHNPM0RBdUQwNXBKOGJBejMrTWNZRnRaYkYvNWMvOXBmbFI0VnMrTk96bmhNVmVlZUFvcDM0aC9vSmxOM0VzR3dxWXpUbUhvQklHWUNUVVB3QjRFZXZmcE1tL2dDd2Rud0ZmdVIxYjdRUEFKYnFTVlFETzloSFh1ejJ4eCsyRG5hZTNxTS9namRmNHYvSXJwM1lkK3dZSnFmbDl3QWNtanlPNng5NUNMdU9IR25zdzBmOG45eXpHOGVtVHVEUXBDeHlrOU16dVA3aEI3SDM2Rkc3RDR2NFAzZjRFTDd3MElQWWZ1aWd0dTJMRHorRXliN0hDNFlpaWo4QWJObDNBTitZTlB2ZHRHMmJ0bTd0bWhvaTE2YTFQZk1Yd0xZOTVzc1MzVXQrV3ZBUmQrYmZaT0lkNzJ1QVNSSmhBSENTaXY4cEsxZmgvQTFuR0xlLzRzVVhZR1J3cVBxVXB5ZXVYblFSblVRMXNJTjlrR0pQUExjZFR6em4rUWlWeTBmVWJpZXcvZEJCYkQ5MEVGUEtwWjVqVTFOZXMyNGZIK1FQb3oxLzVEQ2VQM0lZeDZia2ZqWTFONHU3SGZWd1hUNDZPREdCdXllMllmK3hZOXEyZTdjL2czVEFFUjRpaXo4QW5QMzlWK0QwSzgvRkZ4NnFYbTRrSVBER0MxK0N5emFlZ2JzMzZ3T0EyVE5IZ0pGbWZxOSszU1Y0ejArL0dSKzc5VnZTK3BkdTJJQzNYUFJTL05admZ3cmJkN2lmTXBnUDhXOE5mNm5HcmFVbC9yNFNIdjArQVdZQTBOREpTU3IrQU5EcjJZTmZnZ1M5WGc5UVh4UzNWRStpR3RqQlBwWkEybjgrcnM5MU4vd0JHODQ0RlIvOTZDL3E2emVzdzhIWlNmUjNqK1Z1TWgvalo2L0RLZWVjanU5YWVWemJaMlJrQVB0MitkVmxydDluL2E1WnN3S25uTFlLSzU0Y2w5YWZ1bkVOTnIxNEEzN3Y5OStEU1NVek1UbzZoTGwrdjFyUmlYOFUvQ0FmUzAzOE0ydmpqbi9uZm5FdkFaekU0ajgvZC9zdm9wT29CbmF3ajA3OGRSL0xWUHhQek16Z2o3NStBNy94YWVxbThuSDlRdy9pK29mcXZmS1kybC9lL08vUzM2NTIzTGRqTys1YmdPZjg1eFYvcWNhdFJTNytpKzBtVDEzczYxNENXQWJpZjJSaWdrL3Y1M2JrK0FST1RKUG5ncGZxU1ZRRE85akhVaFIvRVJkZjg3Rk14ZCtGWFMyMjRLT3R1TldKZnhUOElCOUxXUHdUOTJ4OWZyNEc2RkVSM1phQitBUEFpWmxwM1ByWVEzakx5NjlreTk3MHdMMVYrbStwbmtRMXNJTjlXSXE5OGJJcjhOcUxMelZ1djJ2elk3anBBZjFiNHk3Y1VPUEUvL0l6ejhLRkx6b05Ed3pkaHhPb0hyODdaWHdjLy9HSzc4SVRlM2Jqb1ozNlcrbThmQVRVL1pJTkczSHBobzNZOXRuTmVBSFZvM3JqUTBQNDBWZGNpUzM3OStFNzI3T25BMExGLyt5MTYvRGE4MTZNVDk1NUFMdVY1K2grNUJYZmhVTW5Kbkh6WnZMU25FNzhuYmo2NXViaTMwdFQ0NTNqUXZReDI1ZDlKRW1DWG1xZTJ3a2hzdGpGVk0za1MwQUFRbUNXWHZKdytSTEVsNGN0Qi9IUE5ubkxiclFuQUFCbUFJQ0V5UXJZYkptSWYyR2YrUG9OT0hqMEtONzg4bGRnWkdnWUFIQjA4amkrZHY4OXVQNmVPN3h3WFQ0OGRnb3N2alRFSHdET08zMGpycm4wY3VQMmcwZGY0QWNBYmMvOEFXeGN0UnFIbno2TTJlazVhZlBVeERTT1BuTUVwNjlmN1QwQWFETHpYNzl5RlNhZm44RFVoSnlObXAyZXc4RXRCM0htT1d2d0hUeGJhK2EvWm13TXljRVpUQnpVcjZzLzkrQXVYUGE2ODNGejhYNmRUdnlkdVBybU9EUC8vM3J0VzdCamkvNmlnMVBXcmNMNmpXdngyMStVdjVqNThqUE94THRmOVdvODhjUU9ISitVMzE0NE5qcU1vVk5IOExGdmZaTjErZjQzWFl0RHo3K0FFOHBOcCtQakl6aG4wM3I4MXZXZmszMmRlUlorL0ZXdnhyWm45dURRSWZtSmxEUkpzT3FNVmZqb3Q3N2gwZFRsSXY1WW9OY0FOWDBQd0RJVGZ5QjczditUTjkrSVQ5NThZeTFjazQvTE41MHZmZkRIc2hObTVtYngzLy9oYjcxOVhIVG0yWGpYMWRlVzYyYm1adkdILy9JUEFJRFhYWHlabHRINEgvLzBDUzlzNnNPellEczJEK0pmMk45ZWQ2UDJxZHlkT3cvZ0U1KzhTZjhhb0krUG1uWC9wMy8rSm5ZcTc2RS9jbVFDSC8zWWwvR3JmL3l1Um1uL0cyNjhCdzg5dkUxYi84RVBmYWI2R21Bbi9rNWNmWFBjdFAvLy9Zc2YwWXBjZGRWRitORjNYWU1qTytTWE9EMS9ZaS91Rzl5Q1AvN2cvOEh6ejh2OTV2enpOK0ovL09sUFdWMy8zaC84STdadjN5dXRPL2ZjOVhqL0wvMHdqanluK0pyS2ZQM2RKNzZHKys2VDM0MHhPRGlBVDN6bXYxbDlBY3RNL0ROYkhHOENoTzlUQU10US9KdmkybnlzSGwrQnk4N3hlNHZiak9lTFBBb2Y2MWFzd21zdXVvVGQvOHhUWGlSdEM3WGxKUDdSZmJTdm42MDVtQS94UCt0RnArRlR2L3FiWHJ0ZGY5ZnQrUFBQL1hNUWZ2WW4zNDRiZnZkUHBmZDkvT2dIZndlN0R4M0FmM2oxMWZpVnQxZmZIdGl5NjNuODdGLzg4YnlMdjhudXV1c0o5cnNHRHdQNEhMN1pyQTZLUGZQTUh2ektmLzI0dHY0UlBJYlBOL0MxRE1VL2h2d25kVkNZZEwvSFRZQ2QrQWZqUnZFUllJdktSeWYrdW8vMkQwOXIxczM4N2JqNjV2a1IvNVBCbHFYNDE3TW9HUU5ON0JQWFBRQ2QrQWZqUnZFUllJdktSeWYrdW85bEZOQzliYW1LdjlOdEovNit0c3pGdjgxTEFFWnMvUktBclNLZCtBZmordnJZdm04UFBuUDdON3p3aXc4RitmcDQ3c0ErZk9hMkNudTIyRjhBais5NFZ0cm1ZNTM0Ti9DeGpBSzZ0M1hpYndKWUZEWWYxVmptNG0rNzhzNXQ4SGtTd012OG53TG94RDhZTjhUSHRqMjc5SGQ1QjFiTDVHUDd2ajM0MzEvL01vdjkwRE5icFM4TjF2WEJGRnowVmtmOHYrZXQzNFZYWEtGL21XN0RoblZ1SHhFNXVlYTdMOE01WjUrbXJWKzNibVZqN0N1dnZCQkRRNE9OY2J6TUl2NkhqaDNGWDMvcDM3eGdudDVsZVBxaVp0ejYrSTNYWTJpZ0NvOUg4Kzh1UFB6TTAvanJMMzYyWEgrWWVXVnlpQitqMWR4OXc0WjF1T2lpcy9Ed3p1ZWs5V3RIeDNET0thZmd6cnVleExGai8zOTc1OVpyeVhHVzRhLzMzdU50QnhnbkVsankySTRUQklqSUtBcVdRM3dUcElpVHVFRGlFc0VkNGsvd0E1QzRKZmtQaEFzdW5NQ0ZoUklSNGtRQ1JZcWRCQlNjTVRPT2s0dzlUcHpZazNoTys5QmN6T3JWMVZWZmRYM1ZWZDE3SFo1WFdscTlWMVcvYjY5ZTNmdXBydTZ1dnBPeEdQRUZlZlRSWDVKbm4vMk5hTlozL3Z2N2N2Tm0raUZtK3c1L0VmRmJBSXRkRUtqMEFLZzNmSHAvQXYrYThDLzF6ODZZL0pYbjMxRy9lZTE3Y3YvVUgwdTUxM2QvOFAxb1dZNm13UC9xajkrV3B6NTVSYTdJRmJYOC8zNHlIQmQrTHZoZmYrY244dEdQL2FwOC9HTWZVc3RmdmZuV1pPK2J0MjdKcnoxeFJUNyt4RzgvK0tBZExubzN2a0FWSlk3OGYzN250dnh6WnU5VXpEK1dFZE1YL3ZNbDlmTnJiOTJRYTIrR0Q2U2FtaE14TVBsLyt0UGhlQm5QUGZ1YjhtZC8vbnh3RytBbm5ueEsvdkwzbnBkLytPd0xjdVBONFlPZXJoZ2FyNTk4N3JmazZhZUhEYzZuUC95WS9QWGYvTW53TnNCVzVCTlBmVmorNmxQUHkrZi82U3Z5eXJldURlYTVkRFI4V2lId3I2TEpqUWYzeXNGR1JKby8vdHMvZU9iU0k1ZmNwMjRNQlB6VHZzVVpld3IvcFhhaVhlajJiMzB5ejZGMnh1N3liZTMybit0L1NxYi9wejd5Ni9LQjQ0ZlVPcWRuWi9MU2ExY0huejMySzVmbG1jZjFocXVJeUx1M2I4dkx6dkRHQS9oLzVLUHl5OGZIa2F4emVlbTE3dzJXL2JITGwrV1pLNG1zTjk2NCtQOHBGZnlUR1Vidm4xMS85MXV2L3V2VnI0akkyZXAxNHJ6dU9hODdJbkozOWQ1TmQ2OTdJbkovOVRvUmtkUFY2M3psZWI1YW91NmxYZ1BRbndJQS90bSt4Um5BdjZwdk1nZjR4MEtBZjhJM0xGNEcvaUlpLy9YNnRaR2FvZDYrZFV2ZXZuVXJXVS83RHQ5NC9YbzZ3Sm5Oa25YaC8xTXErQ2N6Y3J4TEg4STM1andpN1h6L2d4bUFmN1p2Y1Fid3IrcWJ6QUgrc1JEZ24vQU5pNWVEZjIzdjRveTUvbS90Qy93bE9nVC83TmNDS0E4RGtnUGduKzlibkFIOHEvb21jNEIvTEFUNEozekRZdUJ2cnc3OGRWVjlGb0JaWVFPZ0hRNEVCUHpUdnNVWndMK3FieklIK01kQ2dIL0NOeXdHL3ZicXdEK3E4QlRBSEhjRkJEN2hRRUJPSmVDZjlpM09BUDVWZlpNNXdEOFdBdndUdm1FeDhMZFhCLzZGbXVWMFFOQUFhTnYyVUFUNFczeUxNNEIvVmQ5a0R2Q1BoUUQvaEc5WURQenQxWUgvcGtxN0NQQUErS2Q5aXpPQWYxWGZaQTd3ajRVQS80UnZXQXo4N2RXQnYwbjVkd0ZVNlJFSWJnTnNtN1plVndQd0wvYlB6cGdUL3B1K0U4VnlnSDhzQlBnbmZNTmk0Ryt2RHZ3M1hkT2VCbWdSOEMvMno4NEEvc0RmSGdMOEU3NWhNZkMzVndmK21SbWxCOTZUNXRjdUFpeHZBQUQvWXYvc0RPQVAvTzBod0QvaEd4WURmM3QxNEorZGtZZnYyQjBDMlhjT3hBY0NtaXJnWCt5Zm5RSDhnYjg5QlBnbmZNTmk0Ryt2RHZ5clpKVEp6SEI5SUtDcEF2N0YvdGtad0IvNDIwT0FmOEkzTEFiKzl1ckF2MExHb2tNQ3EzY0JUTElIL3NYKzJSbkFIL2piUTRCL3dqY3NCdjcyNnNDL0pDTXlGTEJWaytldGN3b0ErQmY3WjJjQWYrQnZEd0grQ2Qrd0dQamJxd1Avb294V1pBUzdjNHdJdUZaNUR3RHdML2JQemdEK3dOOGVBdndUdm1FeDhMZFhCLzVGR2YxSGMzVDlKejIxYXdEc0N3TDhpLzJ6TTRBLzhMZUhBUCtFYjFnTS9PM1ZnWDlSaHZ1Um5ib3pQd3pJT2c0QThDLzJ6ODRBL3NEZkhnTDhFNzVoTWZDM1Z3ZitSUm5oUjQzVTZRWEk4cGcyRGdEd0wvYlB6Z0Qrd044ZUF2d1R2bUV4OExkWEIvNUZHWFB2L3huS3Z3Z1ErQmY3WjJjQWYrQnZEd0grQ2Qrd0dQamJxd1Avb295SWQ1Ti83Ri9sbW9HOGl3Q0JmN0YvZGdid0IvNzJFT0NmOEEyTGdiKzlPdkF2eWhqMUhtMEMxRG85RU1oK0VTRHdML2JQemdEK3dOOGVBdndUdm1FeDhMZFhCLzVGR1NudnVZYi9TY2gyQ2dENEYvdG5ad0IvNEc4UEFmNEozN0FZK051ckEvK2lESnYzaFRRQjBxY0FnSCt4ZjNZRzhBZis5aERnbi9BTmk0Ry92VHJ3TDhvbzg0NDFDcXJkQ2pqZUFBRCt4ZjdaR2NBZitOdERnSC9DTnl3Ry92YnF3TDhvSThPN3lSbC9KMkl4WmFiNEtRRGdYK3lmblFIOGdiODlCUGduZk1OaTRHK3ZEdnlMTXViZS95dEo3d0VBL3NYKzJSbkFIL2piUTRCL3dqY3NCdjcyNnNDL0tHT1NkeFA5WTZxSlJXRURvSTNmQmdqOFo4b0Evc0RmSGdMOEU3NWhNZkMzVndmK1JSbno3ditXYXdLeVpCNElDUGpQbEFIOGdiODlCUGduZk1OaTRHK3ZEdnlMTXNxOGZlNHVjbGVBTWc1QStDd0E0RDlUQnZBSC92WVE0Si93RFl1QnY3MDY4Qy9LS1BYZWxJY0IrYzhDQVA0elpRQi80RzhQQWY0SjM3QVkrTnVyQS8raWpEcmVHek1Pd0hwQmdQOU1HY0FmK050RGdIL0NOeXdHL3ZicXdMOG9vNUwzQlEwRUdCOEhBUGpQbEFIOGdiODlCUGduZk1OaTRHK3ZEdnlMTW1ydU52bmpBS1NlSFdDUzJnQUEvak5sQUgvZ2J3OEIvZ25mc0JqNDI2c0QvNktNeXJ2TmlOMnNuUVBhQlgvbGdjQy8yRHNyWXd0MklqVUgrTWRDZ0gvQ055d0cvdmJxd0w4b296cjhUWVkxZXdqV3luc2NzRVhBdjlnN0syTUxkaUkxQi9qSFFvQi93amNzQnY3MjZzQy9LR011K09lZEFzanB4YkVPbGdBQURTVkpSRUZVL2gvMU5ZOERZQkx3TC9iT3l0aUNuVWpOQWY2eEVPQ2Y4QTJMZ2IrOU92QXZ5cGp4eUw4Wjk1N3RORUM5SGdEZ1greWRsYkVGTzVHYUEveGpJY0EvNFJzV0EzOTdkZUJmbERGbnQzOHJVeTRDN0ZUNWFZRE5oQVlBOEMvMnpzcllncDFJelFIK3NSRGduL0FOaTRHL3ZUcndMOHFZRy81MU5PbXVnUEpUQU1DLzJEc3JZd3QySWpVSCtNZENnSC9DTnl3Ry92YnF3TDhvWXpINE54c3pFSkM5QndENEYzdG5aV3pCVHFUbUFQOVlDUEJQK0liRndOOWVIZmdYWlN4NTVIOUJJd0VkZVg4M1ltMEFBUDlpNzZ5TUxkaUoxQnpnSHdzQi9nbmZzQmo0MjZ0dkFQd3JiQlo3QWY5eXpmODB3SUdBZjdGM1ZnYncxek9BdityZFR3TC9SZnlCZjFWdlU4YnV3WDhLeEl2bnlUOEZBUHlMdmJNeWdMK2VBZnhWNzM0UytDL2lEL3lyZXBzeWRnLytWalZTYVFqZ1Rua05BT0JmN0oyVkFmejFET0N2ZXZlVHdIOFJmK0JmMWR1VXNhUHduK2tTZ0tTdC9SUUE4Qy8yenNvQS9ub0c4RmU5KzBuZ3Y0Zy84Sy9xYmNyWVVmaUxTTzJIQVpsbDZ3RUEvc1hlV1JuQVg4OEEvcXAzUHduOEYvRUgvbFc5VFJtN0RQOExsTklBYUlhZkFmOWk3NndNNEs5bkFIL1Z1NThFL292NEEvK3EzcWFNdllDL2VrQS8rODJCNDZjQWdIK3hkMVlHOE5jemdML3EzVThDLzBYOGdYOVZiMVBHWHNCZlNvWUNMbExRQUdpNno0Qi9zWGRXQnZEWE00Qy82dDFQQXY5Ri9JRi9WVzlUeHI3QVAxL1ZHZ3RkQTZBWmZBYjhpNzJ6TW9DL25nSDhWZTkrRXZndjRnLzhxM3FiTXZZTS9rM1A0RVY3QXJJSEFnTCtsVE9BdjU0Qi9GWHZmaEw0TCtJUC9LdDZtekwyRFA0aVlzRityRWJscHdHT0dBTC95aG5BWDg4QS9xcDNQd244Ri9FSC9sVzlUUm43Q1A4SFd2b2FnRVlrb3dFQS9DdG5BSDg5QS9pcjN2MGs4Ri9FSC9oWDlUWmw3Qy84eHpSbGZBRHpQUDdEZ0VTVVJzRkd3bjlTV3dINEYrVUEvMWdJOEUvNGhzWEEzMTRkK0JkbGJBWDhBMlpiSU41RXBzMUtEZ1FFL0N0bkFIODlBL2lyM3YwazhGL0VIL2hYOVRabDdEMzhKWFViWUFydTh6d05FUGhYemdEK2VnYndWNzM3U2VDL2lEL3dyK3B0eWdEK25TeEg4MW5kK3haRmV3Q0FmK1VNNEs5bkFIL1Z1NThFL292NEEvK3EzcVlNNEwvV0JLcFg2UlZRR3dEQXYzSUc4TmN6Z0wvcTNVOEMvMFg4Z1g5VmIxTUc4QjltTkhQLzA5S2xYZkEzcllzQitGZjFObVVBLzlBZitKdjhxMllBLzdnMzhKL0ZQNXF4amZEdi8yK1ZkdTluejI5N0dtQkt3TCtxdHlrRCtJZit3Ti9rWHpVRCtCZDVUOG9CL3ZzTy8rcERBZmNMZE42K0xDTG5aZ2ZnWDlYYmxBSDhRMy9nYi9Ldm1nSDhpN3duNVFEL1hZUy9TTk5jK01PQUdoR1JmL3U3TC8vajZiM1R2eENSMjhtNWdYOVZiMU1HOEEvOWdiL0p2Mm9HOEMveW5wUUQvSGNUL2hjb3Ridi9TMy8vNzErOC9kUGJmeVN0dkJtZEUvaFg5VFpsQVAvUUgvaWIvS3RtQVA4aTcwazV3Qi80dXhhVkZEM2YvOVhQZmYyVnQ2LysrRFB0ZWZ2dGtuamdYeWtEK0lmK3dOL2tYelVEK0JkNVQ4b0IvanNQLzJhWTJrNWNndXg1M0FhQVAzUDd6YysvY3VPN0w3NzZwK2VuNXk5T2lRRCtsVEtBZitnUC9FMytWVE9BZjVIM3BCemd2L1B3RnhGM0pNQ0F3ODVuL3ZSVXJhODNPSlRoNkVLTi8zcnZ4cTJ6SDc3OG8zOTU4bmVmdUh4NGRQaWNOUUg0VjhvQS9xRS84RGY1VjgwQS9rWGVrM0tBLzE3QS8vejAvTjRiWC92aGwrKzhjK2U5MVJLY2U2OHpFVGwxM3J2WGlmZCs1cjI2K1Z2bk5aRGZBQkFaTmdBT1JLUTV1MzkyY1AzcnIzLzE4ZDk1L0oySFBuRHBNNUs0VlJENFY4b0EvcUUvOERmNVY4MEEva1hlazNLQS8xN0EvK3plMmZ1dnZYanRoWGV2di9lVzlQRHYzbDJZbjhvNC9OMEdnZ3YvckFhQTN3Tnc0THdPMy9qR0QvN25nMDkrOE51UGZPaVJQMnlhNWpqNlpYTUUvR2Z4SHMwQi9yRVE0Si93RFl1QnYzMFc0RitVc1dQd1Azbi81S2V2ZnZIcUM3KzQrZjdQcEFlMGYrUWZhd0Q0alFBWC9zVU5BSGY2d0hrL3VQR2ROMzkwZEh6MEg0OCtmdm4zbTRQbWN2Qmxjd1Q4Wi9FZXpRSCtzUkRnbi9BTmk0Ry9mUmJnWDVTeFkvQy8rKzdkRy8vN3d0VXYzSDN2M3ZzeVBPcDM0ZTgyQXNZYUFHNFB3Smszcjl1ckVDeE43T2gvZmRTL2VoMnRYcGRFNUtIVjYxaEVIaGFSNCthZ2VVUkVIcFpXSG00TzVPRzJsZVBtb0RtV1ZvNUY1SkkwY3FuemFKck9zem1Vcm5IUjlObnI4UkQ2ei9yckk1eEhKZzZHVGVobWNqNXJsRC9VZWR6WjNNRVl1c2pCOEF4Tm1COFp3S0hwRnNDMUROeUQ4a2JhNGZjWUxLZVMxQ2pMM05kczE1TnI3Mkc2dWhxODhqQjF2VDZiOVk3a1BjMHkvRDFHZkx6bENNdWRkYUw2dU1zMC9OMlZjdmV6eE9BYnp2Y2NmT3BOTlpIZjA2bldpS3oydnZROHlyWTZYT2pCWjYyenJVbS9oemZhaWhoK01yTGRETkppNjF0ZE9tZEdaWDBIZFJ0L29ib1BXMlZqVlpkRitaNkp6TmpTaisrbzdyWTRrcTB0Wit2dDFOSHY0ZjE3VnJlNzRaeUo5YUZLMitkRzk2bVJ4SEI3MFRjMjAzNDJtdVFYNnVzK3RsVjZYdjMveGZXL3I4Zzg4VzFwNVA5Vlo5enE4NXpjUHZuRnRTKzkvcld6KzJlbnF3S3QyNzhEL0ltSTNGKzk3b25JM2RYcmpqUGR2ZTQ1ZGQzckFrNUY3dzFvajhKdk1WQTc4bHEzVXRyemR0MUNhYy9rVkVRTzIvTzI2em53dmR3V1RsZW5FV1ZRb2gzVXJuNHZoTkJ5NHYvSTlrdmpxZC90NzE4TUdPdldkNC91L2FOOHJROWkvVm1zQWVCM0YyZ0xxaTF3MXhEb2VnNjZ2enZJYXhsZDJibFRaOU0yOEUxYkhvUjJVZXhuYUYva01sWTdCWkR6MGhvQmFwZS8vNW5mQVBBN29HT3RGTzBXaFNNWndyODdqZURDMy8zQ2g2TDNBQ2pkaEdqUHhHK08wQU94TCt5bVlnMEEvNEE2ZG11ZjFnaUluZXVQWHVXZzlRQjBqUUFOL3JHdUN2L0kzMjBBYUYvNmNPWGhOeEppUFFEc0JQc3RmbisweVdMN1JMbEtOUUJpRi9kcDkvakhUZ21NblJvUUVaR2p0bTNiMVlWVjd0Ry9QNjJkcCtpNitIMzRhMGYrbmMrUjQzT2cxTlVhQU94Yzg0cjFpelN4WGFDNXRhL2JtTlpWci9XcWF5L3RTbjlMTDRCNG43VWk4V3NBdElVN1VCYXlXOUR1amdIM2xrSGZ4NTNYYlNqNDg5UzhEbUJmTjdCOUVML3Qvb3JmSHZuYXBtMWlhZ1BBdjlkZk95VXcxZ3NRS0hZS1FDUThEZUEyQXJvcitFKzlkLzlJWGlUZWU2RDFGb3lkQmxoSzI3UWg3YlA0bmJaZi9JYTdLMzdiY1ZtdUFYRHY5KzllV20vQWxMc0RSR1Q4SXNCWUs2VzdZdDl0QkhSSDhCYjRIOG13eHlDbkFjQkd0VG5pdDdoWXNmNjNUL3htbTYrNWZ5TWZ5UDQxZHY2NS9oUGxwZlVHeEs0SGNMUDg2ZEZUQU80TUx2ejlCc0FZdU4xV1RkZjEzMTB2MERVQ3RNYkRSZllDc0pNdUs5YjNzbUo5YjdiNGZTNVdTelVBdW1uL0FOczl0KytQK2pmV0E1QWEvbGM5RlhBa0l1SmNDS2d0cEhZcTRHejFlZmR1T2ZMdmp2Nzk3djlhcHdEWWNlWVQ2M1krc1c2WEUrdDZPYkd1eDZXZEF1aDZBTFM3QWJSZUFLMFJZTGtHb0JWNXdQMngyd0FIbGFVSHVzZ1EvbU5mcm1zQUhEbGZ4dG9BRUpsbkkyTERyQ1BXNDN4aTNTNGoxdk44WXQyT3kzSWhZS3dYWUt3Um9CMzlSNVc2QzhELzJ6OGRjQmFaeis4dGNDLzhpOTBCc0l1M0FXN3pzbStTV0kvMXhMcGNScXpuZXRxMWRUbDJIWURiQURpWDRmbitzUWNBYVhjRHVON3hVd0Fpd1dtQXJoZkFQMTl4THVPS1hmU25YZm12TlFCRWVaZkkzMmdvMWs4OXNTNlhFZXU1bmxpWGRiVDBOUURkdTk4QThHOEp0SXdOa0QwcTRLQUhJTklJOEdmVUdnR3g4dzdkQXJsUEZyUWUvWS85RUd6czg0cjFPNTlZdDh1STlUeWZXTGZsMG5vQnRHY0MrTGNGdWcyQjNKRUIrL0MyYlVYc2R3Rm9uOFY2QS96dWYvZUsvekg0Vzg3L3MrRXRJOWJ6Y21KZEx5Zlc5WHhpM2VZcGRqZUFOdVIrYk9qOTJJQkEwNjhCTUp3S0VCa09DdVIvaVFQbkN4dzQ3OTF0Z3luNDc4cjVmNUh0WC81dEYrdC9zOFh2czZ4WTM4dktIMVBIVit3OC9kanBBUCtxLzlpUXdOclJmL3dhZ0JGWkd3Ris0SUVNR3dBYStGUG4vcmQ5ZzkzMjVkOEg4UnR0bi9qTkxsYXMvem9hdXhqUWYvZVA4blBBNzJhc3UvOUZJZzJBeUxnQVdtdW11eHZBUGZKM3Y0UUcvdFNSUHhmL1hieFk1N3NyZnR2dEY3L2hkaWpWQStDV3hjWUYwSzRMMEY2eEMvOUdUd05FZXdBU2d3TnBjaHNEYnE5Qjk3a0cvbDArK3E4cDFnWHl4VGF4ditLMzN4M0ZlZ0hHcmd2UXBtTVg0cnZlZzZOL2tjUXBnSkdlQUwrRjRVTzk5ZDRiR1E0bDdBS2ZJLy9seERwRlM0anRER2xpdXhocTdKYkFidHFIdTlZN1lJSy9wc1pyRU9pVmhvMEFFZjNJWFFQNzJCRi96bEUvR3c2NmFMRU5vazBXMitkMkt0WUk2TjVqcjdIeC9sWDQrMGYvSXNZR2dJaTVFZEM5VzZhMWQ4MGZJWXZZWGhEcXhmNndIZklCSE9zSkdJTjliSjdlTkFKNmN3TkFSRzBFaUtTaGJvRStSLzRJMVJmN0QwTEx5TEt2cFdCcjdRMFFaVnA3Zi9ESENPU3pHZ0RybWVLOUFiRnBLL1Q1aDRXc1lsdEJDSlhxSXY2UFdPNEtjS2V0NzRIM0dQeEZKallBUkpLOUFkcmZIUEVqZFBGaUgwTm9NeFU3SFJDYkhyM2RMd1Yva1lJR3dOcEFid2lJMks3cTU1L1Jmb25mR3lHRXhqWFdFUEQvVmdGdWdiOUloUWJBMmlqZUVCQVovOGNQRkJCQ3FFejhIOTFlNVZ3Yk1EcVBGZnlkcWpVQUJxYmpqWUYxdGVyQkNDR0VVRjNWWk5WVTRJN09sd3YrVHJNMEFBWUJ0c1lBUWdnaERvejJWZGtnbmdwOVY3TTNBS0xCTkF3UVFnZ2hrMm9BMzlmL0EvU0xUK0MxR2FSQUFBQUFBRWxGVGtTdVFtQ0NVRXNCQWhRQUNnQUFBQWdBbUYxc1JpR0JPUWdHQkFBQVZRc0FBQnNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRzV2Y20xaGRHbDJaUzEwZVhCbGN5MWpiMjF3ZFhSbExubHRiRkJMQVFJVUFBb0FBQUFBQUpoZGJFWUFBQUFBQUFBQUFBQUFBQUFIQUFBQUFBQUFBQUFBRUFBQUFEOEVBQUJwYldGblpYTXZVRXNCQWhRQUNnQUFBQUFBbUYxc1JxYUkvM2loN3dBQW9lOEFBQklBQUFBQUFBQUFBQUFBQUFBQVpBUUFBR2x0WVdkbGN5OWpiMjF3ZFhSbExuQnVaMUJMQlFZQUFBQUFBd0FEQUw0QUFBQTE5QUFBQUFBPSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDJfTm9ybWF0aXZlVHlwZUNJLWNvbXB1dGUvY29tbWFuZCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhNWIzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2NvbW1hbmQKQEAgLTAsMCArMSwxNSBAQAoraGVhZGVycz1gcGFzdGUgLXMgLWQiICIgaGVhZGVyc2AKKworY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMS9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiAke2hlYWRlcnN9IC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgICIKKworZWNobyAkY29tbWFuZCA+IHRvRXhlYworY2htb2QgK3ggdG9FeGVjCisuL3RvRXhlYworCisKKyMkY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMl9Ob3JtYXRpdmVUeXBlQ0ktY29tcHV0ZS9jb21tYW5kVHJpYWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMl9Ob3JtYXRpdmVUeXBlQ0ktY29tcHV0ZS9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2NvbW1hbmRUcmlhbApAQCAtMCwwICsxLDEyIEBACitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiIgorY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCitjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2NvbnRlbnRNRDUudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDJfTm9ybWF0aXZlVHlwZUNJLWNvbXB1dGUvY29udGVudE1ENS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK1pqY3lZelV4TnpNNVl6SmxOemswWVRsbU56TTVaamM1T0RFMk5EUXdNV0k9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDJfTm9ybWF0aXZlVHlwZUNJLWNvbXB1dGUvaGVhZGVycyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2hlYWRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZGIwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wMl9Ob3JtYXRpdmVUeXBlQ0ktY29tcHV0ZS9yZXN1bHRzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDJfTm9ybWF0aXZlVHlwZUNJLWNvbXB1dGUvcmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNlNWZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDJfTm9ybWF0aXZlVHlwZUNJLWNvbXB1dGUvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDQ6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL3RvRXhlYyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAyX05vcm1hdGl2ZVR5cGVDSS1jb21wdXRlL3RvRXhlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUyNmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDJfTm9ybWF0aXZlVHlwZUNJLWNvbXB1dGUvdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLVhQT1NUICJodHRwOi8vMTcyLjIwLjQzLjEyMTo4MDgwL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcbiIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvYm9keS50eHQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wM19Ob3JtYXRpdmVUeXBlQ0ktYmxvY2tTdG9yYWdlL2JvZHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Yjc5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wM19Ob3JtYXRpdmVUeXBlQ0ktYmxvY2tTdG9yYWdlL2JvZHkudHh0CkBAIC0wLDAgKzEgQEAKK3sicGF5bG9hZE5hbWUiOiJub3JtYXRpdmUtdHlwZXMtYmxvY2tTdG9yYWdlLnppcCIsImlzRW5jb2RlZCI6dHJ1ZSwiaXNDb21wcmVzc2VkIjp0cnVlLCJhcnRpZmFjdExpc3QiOlt7ImFydGlmYWN0TmFtZSI6InZvbHVtZS5wbmciLCJhcnRpZmFjdFR5cGUiOiJJQ09OIiwiYXJ0aWZhY3REZXNjcmlwdGlvbiI6IiIsImFydGlmYWN0UGF0aCI6ImltYWdlcy92b2x1bWUucG5nIn1dLCJwYXlsb2FkRGF0YSI6IlVFc0RCQW9BQUFBSUFMWmRiRWJRYWxyQ1pnSUFBSGtGQUFBZ0FBQUFibTl5YldGMGFYWmxMWFI1Y0dWekxXSnNiMk5yVTNSdmNtRm5aUzU1Yld5dGswMXYyekFNaHUvK0ZjUk9LYkM0S1hiellVRGJIYlpEMTJISjNWQmsyaVptUzU1SUo4dCsvU2paZFpLaUdIWVlqQUFDeFkvbnBkNklaMnZLQ210eUpPUWRsd2NNckljQ0pGMHg5VU9INWNuMFhYbFhidlE3VnBzUFdTYW9jU05ZT3RQam5MeDJQdlJHNklCck9RM0k2MzNuN1krdCtHQWFQRmVZVVZvZkN0ZzlieC92WWZkNHZsbG0zK1ViL2VLazlmYnIvYmZ0NStkZGxsWElOdEFnS2VQUk96SGtHS1JGV09aQ21ndG5QWG1tL0Q0SUZ4bkFHdDY5elJtOGwrS05tZSt5elBrS3k1UVZPNlR5UE1ZNGY3Z1FGKzlBeHdidFdaVjE4SDF4bGZ0ZEI4d3BGeG8rcGhEQVRpVk15N2pzQ2JFVTdCZ0NPdWxPRUhBSXlIcG1NTUFZZEZsclRUY2RwRFVEejJVVkhzZ2lyQ2pIL0wwMkVlRFdCS3h1NW1tK3JwWFROWUFIZE5xWDZUZFdVdy9XUzZpTUdJZ1M0TmlTYlNHWTQ5TDc0THV4MXdWYjQyQ3ZjQUgxMmFvOGRSYlRjREhQSUJ2MTNWS3ZSWHc3VmVXRGE5TDFFUHlBUVFpWDlJandjb2IwaGdXUUUyd3dMTkdBUDBkU0dRWFVwbU5jNGpxSkphZ1ZoTTh0NGxzM0NTNlUwaHBsMlN4M1YwOFFWeDg3STZ1T1JXYmtVUUI0d3NZOG5FUUZyNTRlYnZLNXhTU25wT28xc25MUXJQRnZ4RmNBWHo3Rm5lczY4UmV4eEdlWjJzTkt1UVdJSTBmMHVMRVdtV25mS1o3VkJjWXlPZFBIU2pNTUhWa1RHeSt3N016QXJaZi9oTHYxaWthVnVwQnF3Z0FKOHRLWkYwSmVSazlKZWhxN0tycG1aRjMxc1VVMytTZW1SaUhYTGw1TmE1aDFHRkhXL1NobnkvenJJN3hldHBydm9Qd0tja3BUZmJBdFJnUHBYS2oxNS9Db2Y0cloyUytHbnlqbURmVjQ0VFVsTTdhTm9kY2cwLy9mbXNIc3FhTm85L3grU2M3K0FGQkxBd1FLQUFBQUFBQzJYV3hHQUFBQUFBQUFBQUFBQUFBQUJ3QUFBR2x0WVdkbGN5OVFTd01FQ2dBQUFBQUF0bDFzUmhEQ3hCNERRUUFBQTBFQUFCRUFBQUJwYldGblpYTXZkbTlzZFcxbExuQnVaNGxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUk3QUFBQmR3Z0dBQUFBUTZTSzBRQUFBQVJ6UWtsVUNBZ0lDSHdJWklnQUFBQUpjRWhaY3dBQUd0WUFBQnJXQVN0L2Jpa0FBQUFaZEVWWWRGTnZablIzWVhKbEFIZDNkeTVwYm10elkyRndaUzV2Y21lYjdqd2FBQUFBRjNSRldIUlVhWFJzWlFCVlUwSWdTRVFnS0VWNGRHVnlibUZzS1ljNHp6QUFBQUFPZEVWWWRFRjFkR2h2Y2dCdGVYTjBhV05oM05ZSUtnQUFBQ3gwUlZoMFJHVnpZM0pwY0hScGIyNEFRU0JWVTBJZ1NFUWdLRVY0ZEdWeWJtRnNLUzR1TG1WdWFtOTVJU0E2TFNuVjdQL3JBQUFBSVhSRldIUkRjbVZoZEdsdmJpQlVhVzFsQURJd01EZ3RNRE10TURWVU1UTTZNREU2TURkSTVXeTlBQUFBUjNSRldIUlRiM1Z5WTJVQWFIUjBjRG92TDI5d1pXNWpiR2x3WVhKMExtOXlaeTlrWlhSaGFXd3ZNVFUwTmpNdmRYTmlMV2hrTFNobGVIUmxjbTVoYkNrdFlua3RiWGx6ZEdsallRTlNMR1VBQUFCSmRFVllkRU52Y0hseWFXZG9kQUJRZFdKc2FXTWdSRzl0WVdsdUlHaDBkSEE2THk5amNtVmhkR2wyWldOdmJXMXZibk11YjNKbkwyeHBZMlZ1YzJWekwzQjFZbXhwWTJSdmJXRnBiaTlady83S0FBQWdBRWxFUVZSNG5PM2RlWlJVOVozLy8rZW5sbDVaUk9NU2crdzdzc2dpaXlpS0tJc2dJaWhMRkJleW1jekVtRXdXczdwRVRTWi9mTFBNbWZPYkpOL2Y3MHd5TTRtZ0l1SUdMb0FLeUM0YTR6S0tnZ2FrdTJtVzdxYTYxdnY3NDNaMU4wMTFkM1YzVmQxN3ExNlBjempkdHo1OXE5N2RCN3Bldk8vbmZqN0dzaXhFUkFyQnZuMXZuZzE4SC9nS2NBaDRIM2dQZU44WTNnZnovdWpSb3lxY3JGRkVNczhvN0loSXZudmpqWDNseHZBdE1OOEZlcWI2R21NQURNQUo3QkIwMmg5amVIL1VxRkcxdWFsWVJESkpZVWRFOHRZYmIrd3J3dTdpL05nWXptOElNeWsxQ3p0dGpTZTdRYzMvUEQ5cTFNWFJqQlV0SWhrWGNMb0FFWkZNZStPTmZUN2dGdUIrb0Y4R24vckNoajlYTm52c2VtQmRCbDlEUkRMTTUzUUJJaUtaOU1ZYisyNEEzZ1Qrazh3R25kYmNsSVBYRUpFdTBHVXNFY2tMZS9lK2NaVXg1aEZnVXFyeE5DOVRkV2I4aERHY2YvSEZGNGZUTGxaRWNrcVhzVVRFMC9idWZXTUM4REJ3alVNbDlBVG1BRSsyOVVWdnYvMzNIc0FpWUI2d0g5Z0I3Qmc1Y3NTQnJGY29VdURVMlJFUlQ5cTc5NDFod00reEF3UUF4bVNsYzlQdXVERllZSFlEendPN2dEcWdIdmdjTU00WXhvR1pBWlNtT0xjQzJBRm1oLzJSblNOR0RLOXV0UkFSNlRDRkhSSHhsTDE3MytnRC9BeTREZkEzSDNNdzdIVHgzRFBHUHdCMkdFTXlBTzBkUG54NGZhc3ZJQ0p0VXRnUkVVL1lzMmZ2dVdCK2FBeDNBY1dwdmlhUHdrNkxNV0pnM29URzhMTURlR2Y0OEdHSlZsOVVSQm9wN0lpSXErM1pzN2NIOEIzZzIyQzZ0WkZuOGpuc3BCcXZOWWJkTklZZnMyUFlzS0VIV3kxQ3BJQXA3SWlJSyszWnM3Y0UrRHB3TC9iY0Y4Q2dzTlBtK0dmQVRwb3VnZTBjT25Ub3NWWUxFeWtRQ2pzaTRpcDc5dXoxQTNkZ3o4dnBmZnFvd2s2NjR3MWpGdkJCczhuUE80QzlRNGNPMFczeVVsQVVka1RFRlhidjNtT0FtNHd4RHdKRFVuK1Z3azY2NDIyTVJZMmh4ZndmOCs2UUlZTTEvMGZ5bHNLT2lEaHU5KzQ5czdEWHloblhWbUJSMkVsL1BQMHhBRk9EZmN2OERob3VnUTBlUFBqVGxBV0xlSkRDam9nNFp2ZnVQVk9BUjREcHljY1VkbEtOZFh5OGcyRW4xZmhobWsxK0JuWU9IanpveEJsRmlIaUF3bzZJNU56dTNYdEdBUThCODF1T0tleWtHdXY0ZUFiQ1RzdHhDM2kvMmRvL080Qjlnd1lOMHZ3ZmNUMkZIUkhKbVYyN2RnOEFjNzh4TEtlVmpZZ1ZkbEtOZFh3OEMyRW4xVmdFMk5kOEFyUXh2RGR3NEVDOXNZaXJLT3lJU05idDJyWDdBdUFud0pmQkJEc2JXQlIyMGgvUFVkaEpOWDZDWnZOL2dCMERCdzQ4bE9vc2tWeFIyQkdSck5tMWEvZFp3UGVBdTRFeSs5SE9CeGFGbmZUSEhRdzdxY2IvUWJQSno4Q3VBUU1HbkV6MWxTTFpvTEFqSWhtM2MrZnVNbVA0SnZCOTRLelRSeFYyemh4TFBaNUhZYWZsdUFXOHkra1RvTjhjTUtCL0pOWFpJbDJsc0NNaUdiTno1NjRnbUM4RFB6R0dDMUovbGNMT21XT3B4L000N0tRYUR4dkRHNXkrLzlmLzl1L2ZYMjlTMG1VS095TFNaVHQzN3ZJQnk0QUh3QXlBMXQ3VVFHRW4xVmpxOFFJTE82bkdqb1BaUmJNZDRQdjE2M2M0MVRPSXRFVmhSMFM2Wk9mT1hmT3hieU1mWlQvUzZoc1h5WEdGblpaanFjY1ZkbEtPZmNycHF6L3Y2dGV2YjAycU0wV1NGSFpFcEZOMjd0dzFIWHZWNDZtbmp5anNkUHpjMU9NS08rMk5BWmlFTWMzbi83QURlTE52Mzc3UjFzNlF3cU93SXlJZHNtUEhybkhBUThZd08vVlhLT3gwL056VTR3bzc3WTNaNHluRzZpRTUvOGZzTUlZZGZmcjArZC9XbmtIeW44S09pS1JseDQ2ZFE0QUh3ZHhFbTdsQ1lhZmo1NlllVjlocGI4d2ViL092VE5QNE1XQW56VHBBZmZyME9kTFdtWkkvRkhaRXBFMDdkdXpzRGZ3TXVCMElwUFBtMDk2NHdrN0xzZFRqQ2p2dGpkbmphWWFkVkE0YVk1cGYvdHA5MFVVWDFiYjFiT0pOQ2pzaWt0TDI3VHZQTVlaN2dXOEFKVTBqQ2p1WlB6ZjF1TUpPZTJQMmVCZkNUc3UvTXduZzd6VHIvaGhqM3VyZHUzZXNyVmNROTFQWUVaSFRiTisrc3h2d2JlQTd4dERqeks5UTJNbjh1YW5IRlhiYUc3UEhNeGgyVW8ySGdMMDBDMEM5ZS9mK3NNMlR4SFVVZGtRRWdPM2JkeFFEZDRINUlYQXVkUDdOcDcxeGhaMldZNm5IRlhiYUc3UEhzeHgyem5qTXNxeWpOSnYvWTFuV2pqNTkrbFMyK1VUaUtJVWRrUUszZmZzT1A3QUN1QS9vMDdVM3B2VEdGWFphanFVZVY5aHBiOHdlZHlEc3BEcittR2JoQjlqVHQyL2Z1amFmWEhKR1lVZWtnRzNmdm1NUjhITmdXTk9qQ2pzZEhWZllVZGhKY1J3SDNxWXAvT3dBM3U3WHI1L20vemhBWVVla0FMMysrbzZad0NQR01PSE1VWVdkam80cjdDanNwSGw4Q3RqVExQenM2TisvLzBkdEZpQVpvYkFqVWtCZWYzMzdKT0JoTURNZ0cyOU02WTByN0xRY1N6MnVzTlBlbUQzdW9iQnp4ckZsV1ZYWXdXY25EVjJnZ1FNSFZyVlpsSFNZd281SUFYajk5ZTBqc1BldnVzRitwUDAzbC9iR0ZYWXllVzdxY1lXZDlzYnNjWStIblZSakg5RmkvcytnUVlOT3RWbW90RWxoUnlTUGJkdTJ2Wjh4M0EvY0F2aWFSaFIyTWptdXNLT3cwOW5qTkw4MlJvcjVQNE1IRDQ2M1didzBVdGdSeVVQYnRtMC9IL2dSOEZWaktEcnpLeFIyTWptdXNLT3cwOW5qTHB4YlI0djVQME9HRFBrNDVUY2hDanNpK1dUYnR0ZDdBdDhGOHkyZ0hEci81dEs1YzlNYlY5aHBPWlo2WEdHbnZURjd2RUREVHFyanl1Ymh4N0tzbmNPR0RUdDZ4amRRZ0JSMlJQTEF0bTJ2bHdML0JQd0FPRHNUYnk2ZE96ZTljWVdkbG1PcHh4VjIyaHV6eHhWMjJuenVEemw5L3MvZTRjT0hoeWd3Q2pzaUhyWjE2K3NCWTFnSi9CUzRzR2xFWWVmTXNhYmFNajJ1c0tPdzA5bmpISVNkbHNjeDRDMU9uLy96OXhFalJpVElZd283SWg2MGRldnJCbGdLUEdBTWc4NzhDb1dkTThlYWFzdjB1TUtPd2s1bmp4MElPNm1PYTRIZHpTK0JqUnc1OGlCNVJHRkh4R08yYnQwMkY4ekR3QmpJM3B0TDU4NU5iMXhocCtWWTZuR0ZuZmJHN0hHRm5hdzg5NUdXODM5R2pScDFESTlTMkJIeGlLMWJ0MDBESGdHbTVlTE5wWFBucGpldXNOTnlMUFc0d2s1N1kvYTR3azcybjd2aDgvL2w5UGsvYjR3ZVBib2VEMURZRVhHNUxWdTJqVEdHaDRHNVRZOHE3SFQwWElXZDFzWTZOcTZ3NDk1QWtzM25ibVVzQ3J6SjZmTi8zaDB6Wm96cjV2OG83SWk0MUpZdDJ3WUJEd0JMalduNVRxZXcwOUZ6RlhaYUcrdll1TUtPZXdOSk5wKzdBMTliQSt4cUNEOS9IanQyN051NFFNRHBBa1RrZEZ1MmJMMFF6RStCbGVqZnFJaDRTM2ZncW9ZLzNiQ1h4SENjZnBHS3VNU1dMVnZQeGw0bjU1K0FVb2ZMRVJIcHFrbXREZXpaczZjWXVHamN1SEVmNUtJUVhjWVNjZGhycjIwdEI3NWxETjhGZXRxUDV1YXlnaTVqWldaY2w3RjBHYXV6eDNsNEdhdmw4WXF4WThmK3VmblluajE3emdQV0FGT0JDc3V5dGdKYmdTM0E3dkhqeDRmSk1JVWRFWWU4OXRyV0l1Q3IySHRZbmQvWk55ZUZuZlRPVmRocGJheGo0d283cmdrUk9YM3VMajdYeTVabC9RZlFBMWhvV2RiVlFIRXJYeHUyTEdzM1RlRm42NFFKRXlyb0lvVWRrUng3N2JVdFBqQzNBUGNEL1pLUEsrd2tYMU5oNTh5eGpvOHI3S1EzcnJEamllZjZnR2JoeDdLc3R5Kzk5TklPaFJlRkhaRWNldTIxTFRjQUQ0RVowWEpNWVNmNW1nbzdaNDUxZkZ4aEo3MXhoUjFQUHRjSllCdDI4TmtDYko4MGFWSWRiVkRZRWNtQlYxL2RNc1BZYStVMFROanJ5aHZYNmVNS08rbWRxN0RUMmxqSHhoVjJYUGZHbjVQbmR2bHp4WUY5TklXZnJaTW5UejV0dXd1RkhaRXNldlhWTFJPd1Z6MmVtYmszcnRQSEZYYlNPMWRocDdXeGpvMHI3TGozalQrYnorM0I1L29VK09ya3laT2ZCZkFoSWhuMzZxdGJocjM2NnBiSGdKM0FUS2ZyRVJFcE1MMkJiMi9idHMwSDZ1eUlaTlNycjc3V0I3Z1B6QXJBMzN4TW5aMm1jWFYyV282bEhsZG5wNzB4ZTF5ZG5ldy90NGVmcXdxWW8wVUZSVExnbFZkZU94ZjRvVEhjUmJOYktrVkV4REg3NC9INDRvTUgvN0ZFWVVla0MxNTU1YlVld0hlQWIyTXZqUzRpSXM1N3NhcXErcDZUSjJ2K0NKeXRzQ1BTQ2ErODhtb0ptRzhBOXdMbk9GMlBpSWcwK3ZWSEh4MTh6cktzbDRGemdWY1Vka1E2NEpWWFhnMEF0d00vdzU0QUp5SWk3aEFHdnJwLy80RXZBTS9SZEJQV1lZVWRrVFJzM3Z5cUFXNHloZ2VCSVU3WEl5SWlwemtVRGtkV2ZQcnBvYnVCK1MzSEZIWkUyckY1ODZ1emdZZUFjVTdYSWlJaVo5aFdVVkgxazVxYTJ0OERBMUtNcTdNajBwck5tMStkQ2p3TVRIZTZGaEVSU2VuLy9mampUN1lsRW9sMVFHa3JYNk93STlMUzVzMnZqTUxldjZwbEsxUkVSTndoWmxuV2QvZnZQekFDK0VNN1g2dkxXQ0pKbXphOU1nQjR3QmlXb2RYRlJVVGNxaW9VcXYvbTRjT2ZmUWNZbjhiWHE3TWpzbW5US3hjQVB3RytEQVFkTGtkRVJGcTM3OGlSeWwvWDFaMzZOK0RzTk05UjJKSEN0V25USzcyQTd3SGZCTW9jTGtkRVJOcjIyTWNmZi9KK1BCNy92NlRmZlE4dFg3N2t1TUtPRkp4Tm16YVhBWGVEK1I1d2x0UDFpSWhJbXhMeGVPSVhCdzU4TXM2eXJCOTI4TnpEQUFvN1VqQTJidHdjQkw1c0REOEJMbkM2SGhFUmFkZkp1cnBUOXgwNVVuazMwTGNUNXl2c1NHSFl1SEd6RDFnTzNFL3FOUmhFUk1SOTNqOXlwT0svYTJ0UFBVTEtEWllOWUozNThPa1VkaVQvYmR5NGVUNzJnb0Nqbks1RlJFVFM5c0tCQTU5V3hlT3grN3Y0UElkQVlVZnkxTWFObTZhRGVRU1k0blF0SWlLU3ZsZ3MvdnVEQnorZEJGeVRnYWRUWjBmeXo4c3ZieG9IUEd3TXM1eXVSVVJFT2lSVVcxdjM3MGVPVks0a2N6ZVBLT3hJL25qNTVVMURnQWVCbTdBdjVJcUlpSGQ4Y3VSSTVZdDFkYWUrVFdaL2grc3lsbmpmeXk5djZnMzhETGdEOER0Y2pvaUlkSkJsV2E5LzhzbWhhQ3dXdXlNTFQ2L09qbmpYeXk5di9CeVllNEd2QXlWTzF5TWlJaDBYaThYV2ZQTEpQeTVOSkt3dlpPa2xGSGJFZTE1NmFXTTM0TnZHOEIyZ2g5UDFpSWhJcDBScmFtb2ZyNnc4dWdpc2JHM1RFMW0rZk1sUlVOZ1JqM2pwcFkzRndGM0FENEZ6SFM1SFJFUTZyN0tpb3ZLTjJ0cFRTN1A4T29lVG55anNpS3U5OU5KR1AzQWI5cnljUGc2WEl5SWlYV0JaMXR1ZmZISW9HSXRGTTNGYmVYc1Vkc1Q5WG5ycDVVVmdmZzRNYzdvV0VSSHBtbWcwK3Vxbm54NGVhMWxXOXh5OTVLSGtKd283NGpvdnZ2anlOZGhyNVV4d3VoWVJFZW15UkUxTjdXdVZsVWV2eVBIcnFyTWo3dlBpaXk5UEFoNEJybks2RmhFUnlZaVRGUlZWQjJ0cmEzTWRkRUJoUjl6a3hSZGZIZ244SExqQjZWcEVSQ1F6TE1zNjhPbW5oOHVpMGVqRkRwV2d5MWppdkJkZWVLbWZNZVorNEJiQTUzUTlJaUtTR2RGbzlPMURoejRiR284bm5Nd1o2dXlJYzE1NDRhWHpnUjhEWHdHS0hDNUhSRVF5cUthbTlwM0t5cXFSblQzZkdMQ3NqSlNpc0NPNTk4SUxML1VFdmd0OEN5aDN1QndSRWNtc1VHVmxWWFZOVGQxd3B3dHBvTEFqdWZQQ0N5K1ZBdjhNZkI4NDIrRnlSRVFrd3hJSnEvTHc0Yys2UlNLUmJHMzdBSFNvNnhNRktwTUhDanVTTlJzMnZCZ3d4cXdFZmdwYzZIUTlJaUtTZVpGSTlOTkRoejdyblVqRW16MXFnTXhjaStxa0k4dVhMMmtzUUdGSE1tN0RoaGNOc0JSNEFCamtjRGtpSXBJbHRiVjFoeXNycTNwbmFJNU5KaDF1ZnFDd0l4bTFZY09MMXdFUEFXT2Nya1ZFUkxJbVdsVlZIYXFwcWZtOEM0TU9OTHZ0SEJSMkpFTTJiSGh4R3ZhQ2dOT2Nya1ZFUkxJbmtiQnFEaDgrVWg0T2gzczRYVXNiMU5tUnpGbS8vc1d4eHZBUU1OZnBXa1JFSkx1aTBlaXh3NGVQOUlyRjR1MS9zYk1VZHFUcjFxOS9ZUkR3SUpnbDJEUFJSRVFrajlYVm5hcXByS3pxWmJuMHVsVUx1b3dsbmJkKy9Rc1hZdDlkdFJMOS9SRVJLUVNKNnVwajhSTW5hcm83ZklkVlI2aXpJeDIzZnYwTFp3TS9BUDRKS0hXNEhCRVJ5UUhMc3NKSGpsUVVoMEwxWHR2U1IyRkgwdmY4OHkrVUEvY1l3NzhBUFoydVIwUkVjaU1hallVKysreElhU3dXYzdxVXp0QmxMR25mODg5dktBSytDdWJId0hsTzF5TWlJcmx6NmxRb1VsRlJXWnBJSkp3dXBUUGlRRVh6QnhSMjVEVFBQNy9CQjl3SzNBLzBkYmdjRVJISkxldllzZU1jUDM2aXlCdnprRk9xV0w1OHlXa3BUV0ZIR2ozLy9JYUZ3TStCRVU3WElpSWl1V1ZaVnF5aW9pcHc2dFFwcDB2cHFrTXRIMURZRVo1N2JzTU1ZM2dFdU5UcFdrUkVKUGRpc1ZqMHM4OHFncEZJMU9sU011Rnd5d2NVZGdyWWM4K3Rud2c4REdhbTA3V0lpSWd6UXFINlJFVkZaVERiODNNNnNHTjVWeW5zQ0R6MzNQcmgySmVyYm5TNkZoRVJjYzZKRXllcHJqN210ZHZLMjZPd1U4aWVlMjU5SCtBK1lBWGdkN1lhRVJGeGltVlppYXFxbzc2YW1qcW5TOGtHemRrcFJNOCt1LzVjWS9nUjhEV2cyT2w2UkVURU9mRjRQSEhrU0lVdkhJNDRYVXEycUxOVFNKNTk5dmtld0hmQWZCdm81blE5SWlMaXJIQTR6SkVqVmI1NDNKTUxCYVpMWWFjUVBQdnM4eVhBTjRCN2dYTWNMa2RFUkZ5Z3BxYVc2dXBqSkJMZVhVQW5UYnFNbGMrZWZmYjVBSEFIOWthZHZSMHVSMFJFWE1DeUxLdTYrcGc1ZWJMRzZWSnlJUUVjYWZtZ3drNGVlT2FaNXcxd2t6RThDQXh4dWg0UkVYR0hlRHhCWldXbENZWHFuUzZsRFlZTTdxWmV0WHo1a2pPdTBTbnNlTnd6enp3M0c4ekR3Q1ZPMXlJaUl1NFJpVVNvcUtqQ294dDVOdWh3RURyakVoWW83SGpXTTg4OE54VjRCTGpDNlZwRVJNUmQ2dXBPVVZsWmhlWGhEYTQ2Nll6SnlhQ3c0em5QUFBQY0tPQWhZTDdUdFlpSWlQdllHM21lSklPWGhyeEVZY2ZMbm43NnVRSEFBOGF3RE1pMzFTNUZSS1NMRW9rRUZSVlZoRUlocDB0eGtpNWplZEhUVHovN2VUQS9BYjRFQkoydVIwUkUzQ2NhalhMa1NDWFJhRjVzNU5rVjZ1eDR5ZE5QUDlzTCtCN3dUYURNNFhKRVJNU2xRcUVRbFpWSGljZmpUcGZpQmdvN1h2RDAwOCtXQVhkakI1MnpIQzVIUkVSYzdNU0preHc3ZHR6cE10eEVsN0hjYk4yNlo0UEFWNHpoeDhBRlR0Y2pJaUx1WlZrV1ZWVkhxYTExZmlOUFk4QkZOMzJwcytORzY5WTk0d096SEhnQTZPOTBQU0lpNG02eFdJeUtpaW9pa2J6ZHlMT3pMT0N6VkFNS093NWF0KzZaNjdGdkk3L1k2VnBFUk1UOTZ1dkRWRlpXRW84bm5DN0ZqYXFYTDErU01nRXE3RGhnM2JwbnBtTXZDRGpGNlZwRVJNUWJhbXBxT1hyMHFKc3VHYmxOeXZrNm9MQ1RVMDg5OWN3NDRHRmptT1YwTFNJaTRnMldaVkZkZll5YW1sb0ZuYmFsbks4RENqczU4ZFJUVHc4Rjh5Q3dHSHVqRHhFUmtYYkY0M0VxS3FvSWg4Tk9sK0lGQ2p0T2VPcXBwM3NEOXdHM0EzNUhpeEVSRVU4Smh5TlVWRlFRaTJuOW5EVHBNbFl1clYzNzlPZU00VjdnNjBDSjAvV0lpSWkzMU5iV2NmUm9OWmFsaWNnZG9NNU9McXhkKzNSMzROdkFkNER1RHBjaklpSWVWRjE5bkpNblQrYndGUTE1c21tb3drNDJyVjI3cmhqTVhjQVBnWE9kcmtkRVJMd25rVWhRV1ZuRnFWTUZ2WkZuVitneVZqYXNYYnZPRDl5R1BTL25JbWVyRVJFUnIwcHU1Qm1MeFp3dXBRVlBkWDNVMmNta0o1OWNaNHhoRWZBZ01NenBla1JFeEx0T25RcFJWWFdVUkVMemM3cElZU2RUbm54eTNUWEF3OEFFcDJzUkVSRnZPM0hpSk1lUEg5ZjZPVjEzYlBueUpmV3REU3JzcE9uSko5ZE53bDcxK0NxbmF4RVJFVyt6TEl2S3lxT2NPblhLNlZMeVJhdGRIVkRZYWRlVFR6NDFFbmdJekFLbmF4RVJFZSt6Ti9Lc0pCS0pPbDJLMjNZczd3cUZuYzVZcythcGZzWndQM0FMNEhPNkhoRVI4Yjc2K25vcUtxcElKTFJRWUlhMWVpY1dLT3ljWWMyYXA4NEhmZ3g4QlNoeXVCd1JFY2tUSjAvV1VGMTl6T2t5OHBVNk8rbFlzK2FwbnNEM2dMdUJjb2ZMRVJHUlBHRnY1RmxOVFUyZDA2WGtNNFdkdHF4WnM3WVUrR2N3UHdCNk9WMlBpSWprRDNzanowcHQ1Smw5Q2p1cFBQSEUyb0F4ZkFuNENYQ2gwL1dJaUVoK0NZZkRWRlJVRVk5cmZrNE9hTTVPYzA4OHNkWUFTN0VYQkJ6b2NEa2lJcEtIYW12cnFLNnVKcEhJajF1ZFBFQ2RuYVFubmxoN0hmQVFNTWJwV2tSRUpEOVZWeCtqcHFZV0QyMnprQThVZHA1NDRzbkx3VHdDWE9aMExTSWlrcCtTRzNtR1FxMHU1Q3ZaY1hMWnNwdmJuUDJkMTJIbjhjZWZIR3NNRHdOem5LNUZSRVR5VnlRU3BiTFNqUnQ1Rm9RMnV6cVFwMkhuOGNlZkhBdzhBQ3pCM3JKVlJFUWtLMDZkT2tWVlZUV1dwWTA4SGZKeGUxK1FWMkhuOGNlZi9BTHdVK0JPOHV4N0V4RVI5emwrL0RqSGo1L3M0ck1ZTkwrbjAvWUJkN1QzUlhrUkNCNS9mTTNaRGV2ay9CTlE2blE5SWlLUzN4S0pCRlZWMVlSQzJzalRRUnVCRzVZdHU3bmR0T25wc1BQWVkydktqZUVlNEYrQW5rN1hJeUlpK2MvZXlMT0thRFFYRzNrV1J0ZW5FeHVTUGdxc1dMYnM1a2c2WCt6SnNQUFlZMnVLZ0s4QlB3TE9jN2djRVJFcEVLRlFQVlZWVmNUam1wK1RLeW1DMEcrQWU1WXV2U250ZU9TcHNQUFlZMnQ4d0szQS9VQmZoOHNSRVpFQ2N2SmtEY2VPZVdNanowNTBTcnpBQXI2L2RPbE52K3JvaVo0Sk80ODk5c1JDTUQ4SFJqaGRpNGlJRkE3THNqaDZ0SnE2T3MzUGFWdFdMN2xGZ1R1WExMbnB2enB6c3V2RHp1clZUMXpkc0ZiT3BVN1hJaUlpaFNVZWoxTlpXVVU0bk5iVUVHbFZsNEpRTGJCb3laTEZHenI3Qks0Tk82dFhQekVSZUJpWTZYUXRJaUpTZU1MaENFZVBIdFZHbnM0NkFseTNaTW5pM1YxNUV0ZUZuZFdybnhnTy9CeTQwZWxhUkVTa01OWFYxWEhzMkFrdEZPaXNENEJaTjkrOGVIOVhuOGcxWVdmMTZzZjdnTGtmZXdLeTMrbDZSRVNrOEZpV3hmSGpKNmlycTh2SENiNWVzZ3VZZS9QTml5b3o4V1NPaDUxVnF4NC96eGgraUgwcmViSFQ5WWlJU0dGS0pCSWNQVnBOT0J4MnVwUkM5enl3K09hYkY3VzV1V2RIT0JaMlZxMTZ2QWYyWW9EM0FOMmNxa05FUkNRYWpYTDBhRFd4bU9ibk9PeFB3TXFiYjE2VTBSMVZjeDUyVnExNnZBUjdXNGNmQU9mayt2VkZSRVNhTzNVcXhQSGp4N0YwM2NwcHY3anBwaHZ2emNZVDV5enNyRnIxV0FETUhjRFBnQy9rNm5WRlJFUmFjK0pFRGJXMU5VNlhVZWdTd0xkdXV1bkczMlhyQmJJZWRoNTk5REVEM0d3TUR3S0RzLzE2SWlJaTdVa2tFaHcvZm9MNmVzM1BjVmdZdUdYeDRoc2Z5K2FMWkRYc1BQcm9ZN094MThxNUpKdXZJeUlpa3E1WUxNYXhZOGMwUDhkNUo0QUZpeGN2M0p6dEY4cEsySG4wMGNlbUFvOEFWMlRqK1VWRVJEb2pIQTVyL1J4MytBY3daL0hpaFcvbDRzVXlHblllZmZTeDBjQkR3THhNUHErSWlFaFgxZGJXVVZ0YnEvVnpjcWlWRFVuZkFXWXZYcnp3WUs3cXlFalkrZXRmVnc4RTdqZkdMQU44bVhoT0VSR1JUTEFzaXhNblRsSmZYOStKczdPNnVXWHFWOHpQSGN1VHRnTHpGeTFhV0ozTEYrMVMyUG5yWDFkL0h2Z0o4Q1VnbUpHS1JFUkVNaVFlajNQOCtBbGlzYWpUcFFpc0JaWXRXblJES05jdjNLbXc4OWUvcnU0RmZCLzRaNkFzb3hXSmlJaGtRQ1FTNWVUSms4VGptcC9qQXI4SHZyNW8wUTJPekFydlVOajU2MTlYbHdGM0E5OER6c3BLUlNJaUlsMFVDb1dvcWFrRjh2NnlrQmY4N01ZYkZ6emdaQUZwaFoyLy9HVlZFUGlLTWViSHdBWFpMVWxFUktUemFtcHFDWVU2TXo5SE1pd09mTzNHR3hmODBlbEMyZ3c3Zi9uTEtoL3dSZUIrb0g5T0toSVJFZW1FUkNMQnlaTW5pVVl6dXExU25zajVST3NRc0dUaHdnWHJjdm1pcldrMTdQemxMNnV1eDc2Ti9PTGNsU01pSXRKeHNWaU1FeWRPa2tob2ZvNExIQVhtTDF5NFlKdlRoU1NkRVhiKzhwZFZWMkl2Q0RnNTU5V0lpSWgwVURnY3ByYTJUa0hISFE0QXN4Y3V2UDVkcHd0cHJqSHMvTS8vUERvZWVOZ1ljNjJEOVlpSWlLU3RycTZ1ayt2blNCYThDY3hadVBENlEwNFgwbExnZi83bjBhSEFnOEJpN0l0NklpSWlybVpaRmpVMXRVU2pXai9ISlRZQ045eHd3L1VublM0a2xRRHcvd0ZUbkM1RVJFUWtIZkY0bkpxYVd1SnhiZVRwRXF1QVcyKzRZWDdFNlVKYTQwTjNXWW1JaUVmWUN3WFdhSDZPZS93R1dPcm1vQU4yWitkajRBSmpkQVZMUkVUY0t4U3FKeFRLK1U0RGtwb0YvR0RCZ3ZuLzZuUWg2ZkFCKzFNTkdHTWEvNGlJaURqRnNpeHFhelVST2RmYWVQdVBBaXNXTEpqbmlhQURkbWNuWmRocHJubm9zYlRtdG9pSTVFZ2lrYUN1cms3emM5eWpGbGkwWU1HOERVNFgwaEVCNEtPT25HQUhId0RUR0h3VWdFUkVKTk5pc1JoMWRhZjBIdU1lRmNEYzY2K2Z0OXZwUWpvcXJjNU9hNUxkSG5WOVJFUWtrOExoQ1BYMTlYbjF2dUx4RFVrL0FHWmZmLzI4RDUwdXBETzZGSGFhVStBUkVaRk1PSFVxMUxoK2pqRkc3eXZPMndWY2QvMzExMVU0WFVobitZQlBnWXpjTXFiSnpDSWkwbG1XWlZGWGQ2b0RDd1hxUFNjSDFnTlh6cC92M2FBRDRGdStmRWtDZXkrTGpGRGdFUkdSam9ySDQ5VFdhaUt5eS93Sm1EZC8vblYxVGhmU1ZjbTlzZllEZ3pQeGhNa0p6SWxFMjIxSFhmWVNFUkdBYURTcTI4cmQ1NWZ6NXMzOWdkTkZaRXJ6c0pNeHhoaDhQdnM2YS9Nd2s3eUYzZWRMZG4rU0h5MFNpWVNYSjI2SmlFZ25oTU1Sb2xGWEw3NmJJUVo3SFQ3WFN3RGZtamR2N3UrY0xpU1RzaEoyNFBTMWVaSzNxcmYxdFg2L24rVHQ3SlpsYVNsd0VaRThabGtXOWZWaFhiWnlsekJ3Njd4NWMxYzdYVWltWlMzc2RGYXk4K1AzKzdBc0dqbytDajRpSXZraWtVZ1FDdVhYYmVWNTRBU3dZTjY4T1p1ZExpUWJYQmQybWt0MmZJenhOM1I3ckRNdWpZbUlpSGZFWW5IQzRiQitqN3ZMSVdEMmRkZk5lY3ZwUXJMRjFXR25PVHY0K0JvV1piSXZjOW1Ub1BVUFJrVEVDNkxSYUFkdUs1Y2NlUWM3NkJ4MHVwQnM4Z0VzWDc3a0pIRFU0VnJTbHV6NEJJTkJnc0ZnUS9kSHQ3eUxpTGlSWlZsRUltRUZIZmZaQ2t5NzdyclplUjEwb0NIc05IQjlkeWVWcHVBVFVQQVJFWEVaeTdJSWh6VVIyWVhXQWpQbnpwMWQ3WFFodWRBODdIUm9RMUEzTXNZUUNQZ3BLZ3BTVkJRa0VBZ28rSWlJT0NRZVQyaCtqZ3NadysrQlJYUG56ZzQ1WFV1dUJKcDk3c25PVG11U2Mzd0NBWC9qSEo5NFBLRi9kQ0lpT1JDTHhYWFp5cDN1bXpObjF2MU9GNUZyZVJ0Mm1rdGU2dkw3QTRCRlBKN1FMZTBpSWxrU2pVYUp4L1ByOTZ2SGR5d0hpQU4zelprejZ3OU9GK0tFZ2dnN3pTVXZkWUcvWVIyZmVMTTd1MFJFcExNc3l5SWFqVGIrUHMyRGdKQXZRc0NTT1hObXJYTzZFS2NVWE5ocHpnNCs5bzhndVk1UFBCN1g2czBpSWgyVUREcnBUaFZRRU1xWmFtRGVuRG5YYm5PNkVDYzFEenNIZ1ZpTHh3cEd5emsrOXFVdUJSOFJrZllrRWdsaXNSaGE5OHgxRGdDelo4Kys5bDJuQzNGYTQ5MVl5NWJkSE1jT1BBV3Y2YTZ1WWtwS1NpZ3FLc0x2OTdWL29vaElnWW5INHcxQlIxem1UV0NxZ282dDVUdDR3VjNLYWs5eWNuTlJVVkd6NE9OM3Vpd1JFY2ZGWXVwK3U5UW00SXJaczY4OTVIUWhidEh5a3BYQ1RodU1nVURBM3pEQnVhbDFxOFd5UktTUTJKZjY0NXB6NDA2cmdCV3pabDBUZHJvUU4xSFk2UUw3ZG5ZNytOaXQzRGlKaEg0QmlFaitzaXlMV0V6L3dYT3Azd0wzekpwMWpkcHRMU2pzWkVneStCaGppTWZqalgrMGlLR0k1QXR2cjA5bXlPTUoxQmJ3ZzFtenJ2bFhwd3R4SzRXZExHZ0tQdlp5NmZhbExxM2VMQ0xlWlFlZGZQYWMreFFBQUI4cVNVUkJWUDBkNXVrZ0ZBVldYbnZ0ekQ4N1hZaWJLZXhrV2ZOTFhZbUVmYWxMSFI4UjhSSmRubmV0V21EUnRkZk8zT0IwSVc1MzJ0MVl5NWJkZkF3NDRWQXRlYy92OTFOY1hFeFpXUmtsSlNVRWcwRnRWQ29pcm1Xdk1xK1U0MUlWd0pVS091bEp0WGlNdWpzNVlBZWZJc3JMeXlrdFZmQVJFZmRSQjlwOUd0NG5QZ1NtWG5QTjFic2RMc2N6RkhaY0lCbDh1blVybzdTMGxLS2lJbncrTFdJb0lzNndMRXRCeDcxMllRZWRENTB1eEV0U2JRMmhzT09nNUJ5Zm9xS2l4blY4dEhDWGlJZ0E2NEhGMTF4emRhM1RoWGlOd282TCtmMCsvUDVpaW90cEZueGlDajRpSWhuaW9RMUovd1I4YWViTUdWR25DL0VpaFIyUDhQbDhGQmNYVVZ4YzNDejRSSW5IRlh4RXBPczY4cWJ2b1lDUUwzNEozRHR6NWd6OTFEdEpZY2VEbW9KUEVZbUVSVFNhN1Bob1ZWTVI2UmpkR09GcUNlQ2VtVE5uL05icFFyd3VWZGc1QU1RQjdYYnBBYzJEajJVbGlNWGlSS05SN2RjbEl1M3krWHdOSFJvMURGd29ETng2OWRWWHJYYTZrSHh3eGkwL3k1YmRIQVUrZGFBVzZTS2Z6MGRSa1gwN2UvZnUzU2d0TFNFUVNKVm5SYVN3R2QzeDZXNG5nTmtLT3BuVDJqdmhmcUJ2TGd1UnpFb0duNktpNG9hTis2S05sN3RFcEhBWmt3dzY2dWE0MUNGZ3p0VlhYL1dtMDRYa2s5YWl2ZWJ0NUJGalRFUEhwNHdlUFhwUVdscXFqbzlJQWZMNWZPcm91TnU3d0pRWk14UjBNcTJ0em83a29XVHdzZWY0MkpPYm85R29PajRpZWM3djkyR00wVjFVN3JVVm1EOWp4cFhWVGhlU2p4UjJDbGd5K0JRVkZRR25CeCt0bmlxU0grekxWbjUwMDVXclBRVXNuVEhqeXBEVGhlU3Ixc0xPUnptdFFoeG5CNThnUlVWQkxBdGlzUmpSYUlSb1ZEdTBpM2lWeitmRDcvZnJqaXQzK3ozdzlSa3pydFF0dEZta3pvNmNJWFh3aVJLTlJoVjhSRHpDNy9lN2JINk9RWUhyRFBkZGRkWDArNTB1b2hDay9KZXdiTm5ObFVCTmptc1JGekxHRUF3R0tTOHY0Nnl6ZXRLdFd6bkZ4VVZhaUV6RXhZTEJBRDZmbDVaS0s3amZKM0hnS3dvNnVkUFdMVGtmQWFOelZZaDRRekFZYkxpekM2TFJLSkdJT2o0aWJtSC81eVNnaWNqdUZnS1dYbm5sOUtlY0xxU1F0QlYyOXFPd0kyMElCb01FZzBHTU1VU2pNU0tSQ05Gb1ZCdVZpampBNS9NUkRHcEpDWmVyQnVaZGVlVVYyNXd1cE5DMEYzWkUwaElNQmhwLzBjWmljU0tSQ0pGSVJCMGZrUndJQkFMNC9RRUtiVTZNTXh1U2RucnUwUUZnOXBWWFh2RnVadXVSZENqc1NNWWxnMDk1ZVJteFdJeElKRW9rRWxISFJ5UUxnc0Znc3p1dTJsY29PNWE3TEFpOUNjeVpQdjJLUTdtdFI1SVVkaVNyQW9GQTR3Um5PL2hFaUVTMFVhbElWeVhYeWZMNUNtNXlyOWRzQW02WVB2M3lFMDRYVXNnVWRpUm5Bb0VBZ1VDQThuS2o0Q1BTQlQ2ZmorTGlJako5TzNlaGRIMXlhQld3WXZyMHk4Tk9GMUxvMmdvN0gyUC9LOUovR3lUamtzR25yQXdTaVFUaGNJUndPS3pnSTlLT1FDQkFVVkVRVURCeHVkOEM5MHlmZnJtdTM3dEFxeXRPTFYxNlV4ajRSdzVya1FMbDkvc3BLeXVsVjYrejZOWHJMTXJMeTdSUnFVZ0t4Y1ZGalVGSFhNc0NmbkRGRmRQdXZ1SUtCUjIzYU84ZFpUL1FPeGVGaUVBeStKUlJWbFpHUEc3ZjFSVU9SN1JScVJRMFl3ekZ4U1g0L1Q3ZDRlaHVVV0RsRlZkTSs3UFRoY2pwMGdrN1YrU2lFSkdXL0g0L3BhV2xsSldWTlZ6cUNoTU8yMnY1aUJRS244OUhTVW1KVmkxM3YxcGc4ZVdYVDF2dmRDRnlwdmJDampZRUZWZncrWHlVbHBaU1dscUtaVmtLUGxJUUFvRUF4Y1VsRk5yNk9SNVVBY3k5L1BMTGRqdGRpS1NXVG1kSHhGVk9EejRKd3VFbzRYQ1lTQ1RpZEdraUdXUFB6eW5TSkdUMyt4Q1lkZm5sbDMzb2RDSFNPb1VkOFRRNytKUlFXbHBDSXBGb21PT2o0Q1BlWll5aHBLU0VRTUJMRzNrV3JGM0FkWmRmZmxtRjA0VkkyeFIySkc4MEJaL21sN3JDUkNMYXFGUzh3ZWZ6VVZaV3F2azUzckFlV0R4dDJtVzFUaGNpN1d2MTFuT0FwVXR2K2d3NGxhTmFSREltK2IvanM4N3F5Ym5ubmtQUG5qMG9MaTdXbTRpNGxyM2daaGsrWDV1L2xydEFmL2N6Nk0vQS9HblRwaXJvZUVRNmk1bDhCSXpNZGlFaTJaSU1QaVVsOWtUUDVBS0c0YkEyS2hWM0tDb3Fhdmo3S1I3d1MrRGVhZE9tNnBlSGg2UVRkdmFqc0NONXdnNCt4WlNVbEdCWkZ0Rm9oUHI2TVBYMVlRVWZ5VGxqREtXbEpTNVlSRE96MjA3a3FRUnd6MldYVGZtdDA0Vkl4NlViZGtUeWpyMVFXekhGeGNYMDZFSGo1T1p3T0t3ZDJpWHJmRDVEYVdrcGZyOG1JcmZrd2oyNndzQ3RsMTAyWmJYVGhVam5LT3lJMEJSOFNrcUtBUm92ZGRYWEsvaEk1dm45ZmtwS2lyTTRQMGN5NkFSd3c5U3BVelk1WFloMG5zS09TQXJKamsvUG5uYkhKeFFLVTE5ZmoyVXArRWpYQklNQmlvdUxNLzY4THV5R1pFbE9MN2tkQXVaTW5Ucmx6Vnk5b0dTSHdvNUlPNHFLaWlncUtxWm56eDROYzN6cXFhOFBFNDhyK0VqSEZCY1h1V0IrVGo3TGFCQjZGNWcxZGVya2c1bDZRbkZPdW5kamlRako0Rk5Fang2R2FEUktmWDA5b1ZBOThYamM2ZExFeFpLWFNUVS94ek8yQXZPblRwMWM3WFFoa2hudFhqQmV1dlNtRUhBNEI3V0llRXBSVVpBZVBicHovdm5uY3U2NW42TmJ0Mjc2WDd1Y0libVJwK2JuZU1aVHdNd3BVeFIwOGttNnY1ay9BajZmelVKRXZDd1lEQklNQmpHbWUwUEhKMHdvVkU4c0ZuTzZOSEZRSU9DbnFLaElpMWw2eHgrQXU2Wk1tYXhXYlo1Sk4renNCNlptc3hDUmZHRUhueUo2OU9oT0xCWWpGS3B2Q0Q3YW9iMlFCSU1CZ3NHZzAyVkkrdTZmUEhuU2ZVNFhJZG5Sa2JBakloMFVDQVRvM3IwYjNidDNKeDVQQnA4UTBhZzZQdm5LR0h0dWx5NWJlVVljK1Bya3laTis3M1Foa2owS095STUwaFI4dWhHUEp3aUZRb1JDOWRxaFBZOFlZeWdxQ2lyb2VFY0lXRHA1OHFWUE9WMklaSmZDam9nRC9INS9zK0FUSnhTcXA3NCtSRGlzNE9OVlBwK1BvaUpkdHZLUWFtRCtwRW1YYm5XNkVNaytoUjBSaC9uOWZycDFPejM0aEVMMWhNTmhwMHVUTkFVQ0FkMVc3aTBIZ1ZtVEpsMzZydE9GU0c2a0czWU9BZldBdHVVVnlTSTcrSlRUclZzM0xNdSsxSFhxVkVqQng4V0NRUVVkajNrVG1ETnAwcVdIbkM1RWNpZXRDOHRMbDk1a0FSOW50eFFSYWM3bjgxRmVYczY1NTM2T0N5KzhrTFBQN2tWcGFZbHVZM1lKWXd6QllPQzArVGxXWWV6WDRHV2JnQ3NtVFpxb29GTmdPcklDMm41Z1dMWUtFWkhXSllOUGVYazVpVVNDK3Zvd3AwNkZxSyt2SjRmN0JFbURaTkNSTTdsNGo2N1Z3SzJYWGpwUmJkSUMxTkd3SXlJT3M0TlBHZVhsWlZpVzFYaXB5OTZvMUozdk12bkU1L1BoOSt0dUs0LzVMWERQcFpkTzFJWjJCVXBoUjhURGpER1VsWlZSV2xyYUVIenNkWHpxNjhNS1Bsbmc5L3QwVzNrWE9ORDFzWUI3SjA2YzhNdWN2cXE0anNLT1NKNHd4bEJhV2tKcGFRbUpSSUp3T0VJb0ZDSVNDWk5JS1BoMGxkL3ZkMlMrbElzdkM3bGRGUGpTeElrVC91UjBJZUk4aFIyUlBHU01vYVNrbU9MaUlnRHE2OE9Fdy9hZlJFS2QvSTR3eHVEMyt6UXh2SkhCQS9QRWFvSEZFeWRPV085MEllSU9IUWs3SDJXdENoSEpxdUxpSW9xTGk3Q3Nia1FpRWVyckkwUWlFU3hMd2FjdHlhQWpubElCWERkaHd2aGRUaGNpN3BIMnYrSWxTeGJYQXBWWnJFVkVjcUNvcUlqdTNjczU1NXhlOU9qUmc1S1NFczFEU2NIbk0vaDg2dVowak9NL3J3K0JxUW82MGxKSGY4UHBVcFpJSGdrR0E1U1hsOUdyMTFtVWxaVTZYWTVyK0h3bVo1ZXROSkU4WTNaakI1MFBuUzVFM0VkaFIwUUF1K01qOW9SZzhaejF3SlVUSm95cmNMb1FjU2VGSFJFQjdQVmpDdjF5bG9LT0ovMFptRDkrL0xoYXB3c1I5MUxZRVpGR2dVQmhyZ3JjMVpDalMxR08rVmZndHZIangwV2RMa1RjcmFPLzJSUjJSUEpZU1VreGtVaWh2VzlZdUdCaXJYUk1BcmhuM0xoTGZ1dDBJZUlONnV5SVNLTkFJRUJwYVVtN1gyZFA0TTFCUVZtbmpvd0hoWUZsQ2pyU0VSM3Q3SHdLUkFETlpCVEpVeVVseGZqOVB1cnFRclFNQThZWWlvcUNCSU5CQU9MeE9QRjRna1RDL3VnZEZwWmxhYUZBN3prQjNEQnUzQ1dibkM1RXZLVkRuWjBsU3hZbmdBTlpxa1ZFWENJWUROS3paM2U2ZFN0djJJS2lsUEx5TXJwMUsyOE1PbUJQYWc0R0F4UVZGVkZhV2tKUlVaQkF3Ty9xOVdrc3k5SWNHMjg2QkZ3eGJ0ellUVTRYSXQ3VG1kbUkrNEhCbVM1RVJOekg3L2MzM3FHVlRrQ3c3K2dDeTdMUFNTUVNXSlpGSXVHT2dHRlpDWFYwdk9sZFlQWWxsNHpWZjdhbFV6b1RkclJnazRpa3hSalQ4TWNPT3NrTlNaMElQdG9UckdzYzNKQjBHekR2a2t2R1Zqdnk2cElYT3JPb3hqM0FFdXhGblBUYlEwVFNac3laZjdJOVNkanVMTVZkMFZtU0Ruc0t1RnBCUjdyS2RPVVh3S3BWai9jQmJnZnVNTWIwYTN4U0E4MXY1VXg5M1BSWVI0NVA3ejduK3BqVDJ0K3BXdUduanpkOUQ1aytidmt6YW04OC9XUDdzYmJHVzM3ZlRoNW44KzlhZThjdGYyYnRqV2Z5dU9YUEpQbnZ1TE1mYzNWT09zOWhmNit0YmRmUTlsMWdaLzVjRWlRU2ljYkhPL0t4TStkMDVkem10YmY4dlp6cTUyVi9EczNEWW10alRROWJHUml6ajFOLzN2bXgwNzluQzh2aUQ4QmRZOGVPaVNQU1JWMEtPMG1yVmoxdWpERlhBeXVCaGNaUXJMQ2pzSk9MWTRVZFd6NkZuZVlmN2UvVDRQUDVHajlQTit3MDcrWW83RFErbW9FeCt6akxZZWYrTVdQRzNJZElobVFrN0RTM2V2VVRaeHZERjhHc0JNYUF3azQyamhWMmtwODMxZGo2Y2ROakNqdmVDanZKajM1L29HR2lkRHBoeHlJV2l6VTdWdGp4VU5pSkExOGZNMmIwN3hISm9JeUhuZVllZTJ6TmVHQ2xNU3dEYzFiaml5cnNkUGxZWVNmNWVWT05yUjgzUGFhd2s5OWhCeUFlanpWMmhmSXo3RUNxWU5MKzE2VSt6MFZoSndRc0hUTm05Rk9JWkZoV2QvMWJ2SGpoN3NXTEYzNGR1QkM0RmRoSTgzK1pJaUlaa2tna2lFWWpad1FGOFlScVlLYUNqbVJMVmpzN3FUeisrSk1EamVFTzRIWXdYd0IxZGpwenJNNU84dk9tR2xzL2JucE1uWjM4N096RTQ3SEdXOHVkN001MDVkek1kSFpTajdtOHMzTVFtRDE2OUtoM0VNbVNySFoyVWxtMDZJWVBiN3p4aGg4RGZZSHJnQ2VBUXR0NVVFUXl3aUlXaXhLUDY0WWRqM29MbUtLZ0k5bVc4ODVPS212V3JEMFhXSUU5cVhtNE9qdnRINnV6ay95OHFjYldqNXNlVTJjbmZ6bzdsbVVSalViTytKbW9zK09aenM0bXkrS0cwYU5IblVBa3kxd1JkcHBicythcEtjYXdFbGdDcGhzbzdLUTZWdGhKZnQ1VVkrdkhUWThwN0hnejdQaDgvb2JiejMwWVk5OVdIbzFHVC90WnVDR3dkT1hjQWdzN3E0RmJSNDI2T0l4SURyZ3U3Q1E5K2VSVDVXQ1dBSGNhdzJYMm93bzdDanNLTy9ickZGYllhZmJSc2l6TE5QOFp1Q213ZE9YY0Fnbzd2d08rTldyVXhWcUJYM0xHdFdHbnViVnIxdzBEN2dTendoak9ieHBSMkZIWWFhcXg5ZU9teHhSMlBCOTJHais2TWJCMDVUa0tKT3o4NE9LTEwvNGxJam1XOHduS25iRmd3ZngzRnl5WS96MmdON0FRZUJwNzhTa1JFWEcvR0hDYmdvNDR4Uk9kblZTZWV1cnBDOEhjWmd4M0FvUHNSOVhaVVdjbjFYSFRZK3JzcUxPVGkzTTc4eHpaN095ME5aYUR6azR0c1BqaWkwZXVSOFFobmcwN3phMWI5OHgwWUNXWXhjWlEyalNpc0tPdzAvaFp4bzhWZHZJNzdHVGlPYndRZHRvYXkwRFlxYkFzcnJ2NDRwRzdFSEdRSnk1anRXZisvT3MyejU5LzNRcmc4OEJkd0U2SFN4SVJLWFFmQXBjcDZJZ2I1RVZuSjVXbm4zNTJGSmlWeG5BTGNJNzlxRG83NnV4azdsaWRIWFYyTW5sdW5uVjJkZ056UjQ0Y1VZR0lDK1JGWnllVmVmUG12alZ2M3B4dkFWOEFsZ0FiQU4zcUtGSkE4dlUvY3k2M0FiaFNRVWZjSkc4N082azg4OHp6Zll5OUw5Y2RRRjkxZGxJZDI0K3BzNlBPVGo1MGRwSWYxZG5KV1dmbnoyQ3RIREZpaExZQUVsZkoyODVPS3RkZE4vdmczTG16N3dmNkE5Y0Nqd0phd1ZORXBPditGYmhOUVVmY3FLQTZPNms4OTl6NnM0RmJzQmN0SEtQT2p2MllPanZxN0tpejQ5eTVIdXZzV0piRlBTTkdEUDhOSWk1VjhHR251ZWVlMnpEZTJQdHlMUWQ2S3V5a0hsZllzWThWZGhSMnNuV3VoOEpPQkt4Ymh3OGZ2Z29SRnl1b3kxanRtVFBuMnQyeloxLzdkZXhiMkc4Rk50SDhONEtJaUNTZEFHWXI2SWdYcUxQVGp2WHJYeGdJM0FuY0RseW96bzQ2TzhsamRYYlUyY25XdVI3bzdCeXlMT1lNSHo3c1RVUThRSjJkZHN5YWRjMkhzMlpkOHlPZ0R6QVBXQU5vQXA2SUZLcDNnYWtLT3VJbDZ1eDB3b1lOTDU0SHJEREczQWtNYno2bXpvNDZPNjJOcTdPanprNGVkSGEyQWZPSERSdDZGQkVQVWRqcG9oZGVlR2tLc0JKNzRjSnVDanNLTzYyTksrd283SGc4N0t5ekxKWU1HelkwaElqSDZESldGMTF6emRYYnJybm02aTloVDJwZUNXeDF1Q1FSa1M0eUxSLzRBN0JRUVVlOFNwMmRMSGp4eFplSEFTdU5ZUVdZODVLUHE3T1QrV04xZG16cTdMaXZPNU9Mems1YlkxM3I3TmpIRFovZlAzVG9rUHNROFRCMWRySmc1c3daNzg2Y09lTzdRRy9nUnVBWklPNXNWU0lpSFJJSHZxcWdJL2xBblowY2VlbWxqUmNhdysxZzdnQUdnVG83bVRoV1o4ZW16bzc3dWpNZTcreUV3Rm8yWk1pUXRZamtBWFYyY3VUcXE2ODZOR1BHVlE4RFE0QXJnVDhEdXY0dEltNVREY3hVMEpGOG9zNk9nelp1M05RVHpETHNpYzBUMU5ucCtMRTZPeloxZHJMZm5lbk1jM213czNQUXNwZzlaTWpnZHhESkl3bzdMckZ4NCtiUnhyQVN6QzNBMmFDd2s4Nnh3bzVOWVVkaHArVllKOExPVzhDY3dZTUgvd09SUEtQTFdDNXgxVlhUMzd6eXl1bDNBeGNDUzRFWGdJU3pWWWxJZ2RnTVhLNmdJL2xLblIwWDI3ejVsYjdZRTVwdkIvcXFzM1Btc1RvN05uVjJzdCtkNmNxNUx1L3NyTFlzYmgwOGVGQVlrVHlsem82TFRaOSt4WUhwMHkrL0R4Z0FYQXM4Q3VnWGtvaGt5dStBcFFvNmt1L1UyZkdZVjE1NTdXemdGbU5ZQ1l4V1o2ZXB4dGFQbXg1VFowZWRIWFYyR2orL2Q5Q2dRYjlBcEFBbzdIallxNisrTmdITVNtQVowRk5oUjJGSFlVZGhKNDJ3RTdNc1ZnNGFOUEJQaUJRSVhjYnlzTXN2bjdicjhzc3Z1d3Q3WDY0VjJKTU1sVjVGcERWMXdId0ZIU2swNnV6a21kZGUyem9JdU5NWWJnTXVWR2VuOGJPTUg2dXpvODVPdXVlNnBMTlRDZGJjZ1FNSDdrS2t3S2l6azJlbVRadjZ3YlJwVTM4STlBSG1BV3VBcUxOVmlSUW1GLzFuOGtOZ3FvS09GQ3AxZGdyQWxpM2J6ak9HRmNCS01NTkFuUjExZHRUWnljVzVuVDBudzUyZDNjRGNBUU1HVkNCU29CUjJDc3pXcmE5UEJWWWF3ODFBTjRXZHpoOHI3QlJHMkdudHViSjVUbXMvSS90ejZFRFkyUUFzR2pCZ1FDMGlCVXlYc1FyTTFLbVR0MDZkT25rbDlxVG1Md0hiSEM1SlJMTGp2NEI1Q2pvaTZ1d0lzRzNiOXVIR1hyZm5WdUE4ZFhiU08xWm5SNTJkYkozVDJzL0kvaHpTNk96OHlyTDQvb0FCL2ZVTFhnU0ZIV25tOWRlM0I0RjVZRllhdzJ6QXI3RFQrckhDam5mQ1RzdVBlUngyTExEdTZkKy8vMjhRa1VZS081TFM5dTA3dmdEY0J1Wk9ZS0RDanNLT3dvN3J3MDdFc2xqUnYzKy9SeEdSMHlqc1NKdTJiOTlwZ09uR3ZzeTFDQ2hWMkxHUEZYWVVkckoxVG1zL0kvdHpTQkYyVGdJMzlPdlhieU1pY2dhRkhVbmJqaDA3ZXdMTGpURXJnZkhKeHhWMjBodFgyRkhZeVZMWU9Rek02ZGV2M3o1RUpDV0ZIZW1VblR0M2pRRldBbDgweHB6ZGZFeGhKL1c0d283Q1RoYkN6cnVXWmMzdTE2L2ZBVVNrVmJyMVhEcGw0c1FKK3laT25QQk40RUxzalVoZkFPM0xKWkpEMjRCcENqb2k3Vk5uUnpKbTE2N2RmWUU3akRGM1lHOVhBYWl6azQxamRYWUt2ck96RGxqU3QyL2ZFQ0xTTG5WMkpHTW1UQmgvWU1LRThmY0IvWUZad0NvZzRtaFJJdm5uajhCQ0JSMlI5S216STFtMWUvZWVjNHd4dDJEUDd4a0Y2dXhrNGxpZG5ZTHQ3RHpRcDArZm55RWlIYUt3SXptelo4L2VpY0JLWTh3eW9FZnljWVdkamg4cjdCUmMySWtEMytqVHA4OS9JQ0lkcHJBak9iZDM3eHRsd0dMZ1RtQzZ3azdIanhWMkNpcnNoQ3pMV3RhblQ1KzFpRWluS095SW8vYnVmV09RTWVaTzREYnNPN3NVZHRJNFZ0Z3BtTEJURFZ4LzBVVVhiVUZFT2sxaFIxemhqVGYyK1lFNTJKZTU1Z0dCNUpqQ3pwbkhDanNGRVhZT0FyTXZ1dWlpZHhDUkxsSFlFZGZadCsvTjg0RVYySmU1aGluc25IbXNzT1BOc0pQdWN3QnZXWlkxNTZLTEx2b0hJdEpsQ2p2aWF2djJ2WG1ac2JlbnVCa29CNFVkKzNVVWR2STQ3R3dHRnZUdTNmc0VJcElSV21kSFhHM01tTkZiUm84ZWRTZHdBZkJsN0ZWalJSeVQ1ZjhnUGdiTVV0QVJ5U3gxZHNSejNucnJieU93TDNHdE1JWnoxZG5KZm9jbGV1Z2YxTDZ5a1pMUll5a2VOaUpucjl2V1I2YzZPNTE1ampRN08vOW1qTG03ZCsvZUNVUWtveFIyeExQZWV1dHZRV09ZRDJZbDlvck5mb1dkekllT3FqLzhPMVYvL0grZzRiaDgyaFY4L2hmL0IrUDNLK3gwOEd2Yk9QZmVpeTY2NkJlSVNGWW83RWhlK052ZjN2NENjTHN4M0FsbVFQSnhoWjJ1aFk0VHo2N2o4SDAvcEtXZWk1Wnczci9jNjltd2svem9nckFUQTc3VXAwK2YvMFJFc2taaFIvTEsyMisvYmNCY2liMDl4WTNHVUdxUEtPeTA5VEhWWTRsd21BL216U1IrL0JpcDlQM3Z4d24ySDVEeDF5MmdzRk5uakZuY3AwK2Y1eEdSck5JRVpja3JJMGVPdEVhT0hMRng1TWdSdDJBdlV2Z05ZTGZEWlhuU3lSZWVielhvQUp4NC9ORWNWcE4zS29HckZIUkVja05oUi9MV3lKRWpqbzhZTWVMZlI0d1lNUUVZQy93T2UwVmFTY1BKWjllMVBmNzhNNDN6ZUp6ZzRhNzBmbUJxMzc1OWR6cGRpRWloVU5pUmdqQml4UEI5STBZTS95WjJ0MmNaOENMZzJYZkxYSWdjK0tqTjhjU3BPdUpWVlRtcUptL3N3UTQ2SHpoZGlFZ2hVZGlSZ2pKOCtQRHc4T0hEL3pwOCtMQnJnQUhBQThCQmg4dHlIU3NhSlZaVjJlN1hSUTlyZ2Q4TzJBQk03OWV2M3hHbkN4RXBOQW83VXJDR0R4LzI4YkJodzM0RzlBZG1BNnVCaUxOVnVVUDg1QW1zUlB2THZjU1BIODlCTmQ1bldkWi9BZlA2OSs5ZjYzUXRJb1VvMFA2WGlPUzNZY09HSllEMXdQcjMzbnZ2SE9CVzdFVUxSemxhbUlQOHZjN0dCSU5ZMFdpYlh4YzQ3N3djVmVScHZ3SyszNzkvZjEwMkZYR0l3bzVJTTBPSERqMEsvQnI0OVh2dnZUOFIreGIyWlVBUFJ3dkxNZVB6RVR6L0FpS2ZmdExtMXdVdStIeU9LdklrQzdobndJQUJ2M0c2RUpGQ3A4dFlJcTBZT25USXppRkRobndOK0R4d0cvQ0t3eVhsVk5HZ0lXMk9CODQ5Ri85WnZYSlVqZWRFZ0dVREJ3NVUwQkZ4QVlVZGtYWU1HVExrMUpBaGcvODBaTWpnNmNBUTRCZkFZWWZMeXJwZU45N1U1bmpQQll0eVZJbm5uQVJtRHh3NFVBc1JpYmlFd281SUJ3d2VQUGgvQnc4ZWZDOXdFWEE5c0JhSU9WdFZkcFJQbWtwUm43NHB4MHdnUUErRm5WUU9BMWNNR2pSb285T0ZpRWdUaFIyUlRoZzhlRkI4MEtCQjZ3WU5HblFEMEJ2NFB2Q2V3MlZsbGpGYytNQXZNTVVsWnd5ZCs5MGZFZmpjdVE0VTVXcnZBVk1HRFJxMHorbENST1IwMmh0TEpJTSsvUEREeTRDVllHNDJodkttRWUvdGpaWDhXUHZhWm83ODZtR2lody9oNzlHVFhpdnVwTmNYYjh2NjY2WnpiaTczdDJybjNOZU5NZk1HRHg1OEZCRnhIWVVka1N6NDhNUDkzWTFoQ2ZiZFhKTzlISFlzeXdMTG92NkQ5eW5xMng4Q2dmVE95Y1RydG5PdVM4TE9PbURwa0NGRFRpRWlycVN3STVKbCsvZnZId0ZtcFRIY0NqUmMrL0ZZMk1uUU9Ya1lkdjVvalBuYWtDRkQ0b2lJYXluc2lPVElSeDk5Rk1TZTFMd1N6Q3hqbXMrWlU5anhZTmg1WU9qUW9UOURSRnhQWVVmRUFSOTk5SEZ2WTdnZHVBTVlvTERqcWJBVE44WjhZOWl3WWYrQmlIaUN3bzZJZ3o3KytHTURYTmx3bVdzUjBIRHJrOEtPUzhOT0NGZzJmUGp3dFlpSVp5anNpTGpFZ1FNSHpnS1dZMS9tR3FldzQ3cXdVMjJNdVg3NDhPRmJFQkZQVWRnUmNhRURCdzZPTllhVndCZUJYZ283am9lZGc4RHNFU05HdklPSWVJN0Nqb2lMSFR4NHNBUlkySENaYXdaZ1FHRW5xWGxnYVhtY3diRHpsakZtem9nUkkvNkJpSGlTd282SVIzenl5U2Y5Z0R1QjI0MHhGelVmVTlnNTh6aERZV2N6c0dEa3lKRW5FQkhQVXRnUjhaaFBQdm5FWjR5NUJudkJ3Z1ZBa2NMT21jY1pDRHVQR1dOdUdUbHlaQmdSOFRTRkhSRVArL1RUVHo4SDNHSloxa3JnWW9XZGpJV2Rmd1B1dnZqaWl4T0lpT2NwN0lqa2lVOCsrZVRTaHRDejFMS3NIcUN3MDk3SFZzWitPR3JVcUVjUWtieWhzQ09TWnc0ZVBGaG1XZFpOd0VyTHNpNEhoWjNXUHJaNExHYU0rZEtvVWFQK0V4SEpLd283SW5uczQ0OC9Ib3dkZWxZQW4xZllhVFhzMUFHTFI0OGUvVHdpa25jVWRrUUt3RWNmZlJRQTVqUmM1cnJPc3F3QUtPdzBmRjVwakxsdTlPalJPMVA5N0VURSt4UjJSQXJNL3YzN0wyam85S3kwTEd0STh2RUNEVHY3Z1ZsanhvejVvTlVmbUloNG5zS09TQUg3NElNUHBtSGZ3bjZUWlZubFVGQmhadzh3ZCt6WXNVZmErVEdKaU1jcDdJZ0lIM3p3UVhmTHNwWmlkM3NtUWQ2SG5SZU1NVGVPSFR1Mk5xMGZrSWg0bXNLT2lKem0vZmZmSDRrZGVtNEZQdWYyc05QeVl4cGg1NytCT3k2NTVKSm9CMzRzSXVKaENqc2lrdEo3NzcxWEJNeHZtTlE4eTdJc0gzZys3UHpLR1BQOVN5NjVSTC80UkFxSXdvNkl0T3ZkZDkvdGJWblc3Y0NkbG1YMVR6N3VvYkJqR1dPK1BXN2N1RjkzOGtjZ0loNm1zQ01pYVh2bm5YZU1aVmxYWVU5cXZ0R3lyQkp3ZmRpSkFDdkdqeC8vYUJlL2ZSSHhLSVVkRWVtVXYvLzk3MmRabHZWRjdQazlsNEFydzg1Slk4ekM4ZVBIdjV5UmIxcEVQRWxoUjBTNjdHOS8rOXNsMktGbk9kRExKV0huTURCbndvUUorekwzbllxSUZ5bnNpRWpHdlBYV1d5WEF3b1pKelRNc3k3SW56T1ErN0x4bmpKazlZY0tFanpQOExZcUlCeW5zaUVoV3ZQbm1tLzB0eTdvRHVOMnlySXNnWjJIbmRXRGV4SWtUajJibEd4TVJ6MUhZRVpHczJyZHZuOCt5ckd1eEwzTmREeFJsTWV3OGJZeFpNbkhpeEZQWis0NUV4R3NVZGtRa1ovYnUzZnM1NE5hR3kxd2pJYU5oNS84YVk3NTY2YVdYeHJQOWZZaUl0eWpzaUlnajl1elpNd203MjdNVTZON0ZzUFBncEVtVGZwcWowa1hFWXhSMlJNUlJ1M2Z2TGdOdXRpenJUdUR5RG9hZE9QQ055Wk1uLzBjdWF4WVJiMUhZRVJIWDJMVnIxNUNHMEhPYlpWa1hRSnRocDk0WXMyenk1TWxQT2xDcWlIaUl3bzZJdU03T25Uc0RsbVhOeGI3TU5SY0l0QWc3SWVDYUtWT21iSEd1U2hIeENvVWRFWEcxN2R1M1g0RGQ2YmtUR05Md08rdi9USmt5NWR2T1ZpWWlYcUd3SXlLZXNXM2J0bjhEemdOZW5USmx5dStjcmtkRXZPSC9CeTJGdzJTZ0t3eGFBQUFBQUVsRlRrU3VRbUNDVUVzQkFoUUFDZ0FBQUFnQXRsMXNSdEJxV3NKbUFnQUFlUVVBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUc1dmNtMWhkR2wyWlMxMGVYQmxjeTFpYkc5amExTjBiM0poWjJVdWVXMXNVRXNCQWhRQUNnQUFBQUFBdGwxc1JnQUFBQUFBQUFBQUFBQUFBQWNBQUFBQUFBQUFBQUFRQUFBQXBBSUFBR2x0WVdkbGN5OVFTd0VDRkFBS0FBQUFBQUMyWFd4R0VNTEVIZ05CQUFBRFFRQUFFUUFBQUFBQUFBQUFBQUFBQUFESkFnQUFhVzFoWjJWekwzWnZiSFZ0WlM1d2JtZFFTd1VHQUFBQUFBTUFBd0RDQUFBQSswTUFBQUFBIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wM19Ob3JtYXRpdmVUeXBlQ0ktYmxvY2tTdG9yYWdlL2NvbW1hbmQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wM19Ob3JtYXRpdmVUeXBlQ0ktYmxvY2tTdG9yYWdlL2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhNWIzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvY29tbWFuZApAQCAtMCwwICsxLDE1IEBACitoZWFkZXJzPWBwYXN0ZSAtcyAtZCIgIiBoZWFkZXJzYAorCitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMxL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiICR7aGVhZGVyc30gLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiAgIgorCitlY2hvICRjb21tYW5kID4gdG9FeGVjCitjaG1vZCAreCB0b0V4ZWMKKy4vdG9FeGVjCisKKworIyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDNfTm9ybWF0aXZlVHlwZUNJLWJsb2NrU3RvcmFnZS9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvY29tbWFuZFRyaWFsCkBAIC0wLDAgKzEsMTIgQEAKK2NvbW1hbmQ9ImN1cmwgIC1YUE9TVCBcImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlc1wiIC1kIFwiQGJvZHkudHh0XCIiCitjb21tYW5kPSIkY29tbWFuZCBgcGFzdGUgLXMgLWRcIiBcIiBoZWFkZXJzYCIKK2NvbW1hbmQ9IiRjb21tYW5kIC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIiIAorCitlY2hvICRjb21tYW5kID4gMS5sb2cKKworJGNvbW1hbmQKKworI2N1cmwgIC1YUE9TVCAiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiICAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuIgorCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDNfTm9ybWF0aXZlVHlwZUNJLWJsb2NrU3RvcmFnZS9jb250ZW50TUQ1LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvY29udGVudE1ENS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3ZjM3NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvY29udGVudE1ENS50eHQKQEAgLTAsMCArMSBAQAorTnpNMk5EVm1OREk0T0RNM01XWXhOV1JtTkRjd05HSmhabUUwTmpkaU1tUT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wM19Ob3JtYXRpdmVUeXBlQ0ktYmxvY2tTdG9yYWdlL2hlYWRlcnMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wM19Ob3JtYXRpdmVUeXBlQ0ktYmxvY2tTdG9yYWdlL2hlYWRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZGIwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvaGVhZGVycwpAQCAtMCwwICsxLDggQEAKKy0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIAorLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAKKy0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAKKy0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAKKy0taGVhZGVyICJIVFRQX0NTUF9XU1RZUEU6IEhUVFBfQ1NQX1dTVFlQRSIKKy0taGVhZGVyICJVU0VSX0lEOiBVU0VSX0lEIgorLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvcmVzdWx0cyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzAzX05vcm1hdGl2ZVR5cGVDSS1ibG9ja1N0b3JhZ2UvcmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNlNWZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDNfTm9ybWF0aXZlVHlwZUNJLWJsb2NrU3RvcmFnZS9yZXN1bHRzCkBAIC0wLDAgKzEgQEAKKy4qOjIwNDouKjouKgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDNfTm9ybWF0aXZlVHlwZUNJLWJsb2NrU3RvcmFnZS90b0V4ZWMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wM19Ob3JtYXRpdmVUeXBlQ0ktYmxvY2tTdG9yYWdlL3RvRXhlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUyNmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDNfTm9ybWF0aXZlVHlwZUNJLWJsb2NrU3RvcmFnZS90b0V4ZWMKQEAgLTAsMCArMSBAQAorY3VybCAtWFBPU1QgImh0dHA6Ly8xNzIuMjAuNDMuMTIxOjgwODAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJIVFRQX0NTUF9XU1RZUEU6IEhUVFBfQ1NQX1dTVFlQRSIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxuIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDRfTm9ybWF0aXZlVHlwZUNJLW9iamVjdFN0b3JhZ2UvYm9keS50eHQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9ib2R5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMzNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDRfTm9ybWF0aXZlVHlwZUNJLW9iamVjdFN0b3JhZ2UvYm9keS50eHQKQEAgLTAsMCArMSBAQAoreyJwYXlsb2FkTmFtZSI6Im5vcm1hdGl2ZS10eXBlcy1vYmplY3RTdG9yYWdlLnppcCIsImlzRW5jb2RlZCI6dHJ1ZSwiaXNDb21wcmVzc2VkIjp0cnVlLCJhcnRpZmFjdExpc3QiOlt7ImFydGlmYWN0TmFtZSI6Im9iamVjdHN0b3JlLnBuZyIsImFydGlmYWN0VHlwZSI6IklDT04iLCJhcnRpZmFjdERlc2NyaXB0aW9uIjoiIiwiYXJ0aWZhY3RQYXRoIjoiaW1hZ2VzL29iamVjdHN0b3JlLnBuZyJ9XSwicGF5bG9hZERhdGEiOiJVRXNEQkFvQUFBQUlBTTVkYkVheUdBQmI3QUVBQUhvRUFBQWhBQUFBYm05eWJXRjBhWFpsTFhSNWNHVnpMVzlpYW1WamRGTjBiM0poWjJVdWVXMXN0Vkk5Yjl0QUROMzFLNGhNeldERlFUY05CUklQelJEVVJlMWRvQ1ZLWmlIZHFUektxZnJyeXp2TGRveWtSWmZpbHNQangzdVBwUHBRWVZsVHc0NlZ2UXZsZ1NUWXB3Qk5vY0Q5MEZFNVlkK1Y5K1hTM2t1OS9KaGxTb2FqVXVtd3B6bDU0YnowcUh5Z2hVNERoWVhmZmFkS04rb0ZXN3FVNEtoN0x3VnMxNXZWQTJ4WGw4aVovRDVmMm90VWk4MlhoNiticC9VMnkyb0tsZkNnS1dQbG5TSzdBTG9uT0JORElvYUxvVHd6QTE0MEZCbkFBbTdlRnlyZWEvRU81MDJXT1Y5VG1iSmloMVNlUnl6azY5ZnVZaEFBZDBFRks3V0J5RWdKcWttTXB5NGI4WDF4VmYvTlNPZVVWNzQrSlFoZ2E3YU9BN3JpZ1ZnTFFvTlFJS2NCd296ckhoVUc4UWUyZG1rb3VPT09kVExPbEVSUW95SmdnT05hQW56d0FvL1A2MGREbWhTOG5ibGYyQlkwS2xSMkVOWk9NRXFEeHRKajM5RVoxRTNzV21pNG96QUYyeDlZc0tZRFYyWXNkVkZzUXpIMzR5bzZ1K1BlaElhN21UNUt5Z2ZYcGh3VFBwQW8wN2tteFkvWE5TT1FsbHRZUkhndWV6TzlPTFhPdDF4aEI3RTJPb3VhajV6ekhLTHY2bmcrSkxmNUZXSGdYMjhJMlNtMUpHZFU2TWZJUW5VQkRYYUJ6bmdjbDYzZjBzT2xSYnk2VnNpdVcwb3ZwWlZpVjhEeXovSmpkN0tSMXBCTzJJeWNWaHkxR1FpZnVjWGRwS2RKbjZUMytQTy9xcmNMYy8rbzNLUndQL1ovVS80YlVFc0RCQW9BQUFBQUFNNWRiRVlBQUFBQUFBQUFBQUFBQUFBSEFBQUFhVzFoWjJWekwxQkxBd1FLQUFBQUFBRE9YV3hHdkZXMHdBSVJBQUFDRVFBQUZnQUFBR2x0WVdkbGN5OXZZbXBsWTNSemRHOXlaUzV3Ym1lSlVFNUhEUW9hQ2dBQUFBMUpTRVJTQUFBQjlRQUFBZ0FJQmdBQUFKdi85U1lBQUFBRWMwSkpWQWdJQ0FoOENHU0lBQUFBQ1hCSVdYTUFBQnd1QUFBY0xnRnBodGRnQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUIzZDNjdWFXNXJjMk5oY0dVdWIzSm5tKzQ4R2dBQUVIOUpSRUZVZUp6dDNYK001UFZkeC9IMzdPMzFLaFFwUDl6cjBvUTdKUzFkcXdlbUVCT0Zjc1pVWTZMeFY3eFU0eDlHMGtnVGtKcGF2VVJTMjdxMlcwRlQ1WStlaHphaEpDV2MxZ3JHMU5SZnRCWGpENkt5YUErS0xUZGdPdTd5UTQ1Q3VPTnVkL3luUnV3aGQ3TTdNNStaMXo0ZS84L24rL3FENVpuOXpOeE9wOS92RjdCMXJkNjc4L3VxNnA3V095Ykk0dHplbGNYV0kyQWpabG9QQUFDR1E5UUJJTVRzNGZuNXQ3Y2V3VlI3ZEtIWCsvdldJd0NvbXEycU8xdVBZS3JkWGxXaURqQUJYTDhEUUFoUkI0QVFvZzRBSVVRZEFFS0lPZ0NFRUhVQUNDSHFBQkJDMUFFZ2hLZ0RRQWhSQjRBUW9nNEFJVVFkQUVLSU9nQ0VtRzA5QURicXQyNTQ2L3ZmK09xbnJtKzlZMUk4Zk96Q1c5NTk2MmMvMUhvSDBJNm9NN1YyZE5hKytaSWRUNS9mZXNla2VQVDRlYnRhYndEYWN2ME9BQ0ZFSFFCQ2lEb0FoQkIxQUFnaDZnQVF3cWZmQVlaZzE3NzlsMWZWMWExM01OWHU3QjVhZW5JekI0ZzZ3SEJjWFZVM3R4N0JWUHRjVlcwcTZxN2ZBU0NFcUFOQUNGRUhnQkNpRGdBaFJCMEFRb2c2QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVFvZzZBSVFRZFFBSUllb0FFRUxVQVNDRXFBTkFDRkVIZ0JDaURnQWhSQjBBUW9nNkFJUVFkUUFJSWVvQUVFTFVBU0NFcUFOQUNGRUhnQkNpRGdBaFJCMEFRb2c2QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVFvZzZBSVFRZFFBSUllb0FFRUxVQVNDRXFBTkFDRkVIZ0JDaURnQWhSQjBBUW9nNkFJUVFkUUFJSWVvQUVFTFVBU0NFcUFOQUNGRUhnQkNpRGdBaFJCMEFRb2c2QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BaU5uV0EyQ2orbFVuVHZSbitxMTNUSXArMVZyckRVQmJvczdVdXY1MzdydTJxcTV0dldOUzdHazlBR2pPOVRzQWhCQjFBQWdoNmdBUVF0UUJJSVNvQTBBSVVRZUFFS0lPQUNGRUhRQkNpRG9BaEJCMUFBZ2g2Z0FRUXRRQklJU29BMEFJVVFlQUVLSU9BQ0ZFSFFCQ2lEb0FoQkIxQUFnaDZnQVFRdFFCSUlTb0EwQUlVUWVBRUtJT0FDRkVIUUJDaURvQWhCQjFBQWdoNmdBUVF0UUJJSVNvQTBBSVVRZUFFS0lPQUNGRUhRQkNpRG9BaEJCMUFBZ2g2Z0FRUXRRQklJU29BMEFJVVFlQUVLSU9BQ0ZFSFFCQ3pMWWVBTk5vOWQ2ZDUxZlYzVU04OHROemUxYytPTVR6Z0MxSTFHRmp0bGZWbFVNODcrRWhuZ1ZzVWE3ZkFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVFvZzZBSVFRZFFBSUllb0FFRUxVQVNDRXFBTkFDRkVIZ0JDaURnQWhmS0VMOEZ4VmZiSDFpQW55Vk9zQnNGR2lEbHZjM042VnY2MnFQYTEzQUp2bitoMEFRb2c2QUlRUWRRQUk0VDExMkppMXFsb2Q0bmxIaDNnV3NFV0pPbXpBM042Vko2dnE0dFk3QUY1cXRxb1dXbzlncXZrTkUyQkN6QzcwZWcrMUhnRUFiSjRQeWdGQUNGRUhnQkNpRGdBaFJCMEFRb2c2QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVFvZzZBSVFRZFFBSUllb0FFRUxVQVNDRXFBTkFDRkVIZ0JDenJRZkFwUGozTjd4aHgrekprNTFCWDdmN3lKRVhxOTlmSDhVbWdFR0lPbnpOaWVlZVd6bFJkZTZnci92Qy9Qd1BmR3ZWbjQxaUU4QWdSaEwxUGZ0M25WVlYxNDdpYk1idTRQSlM5M2pyRVRBRkRsYlZIYTFITU5XK3V0a0RSdldiK2psVmRmT0l6bWE4N3FncVVZZlQ2QjVhT2w1K1Ztak1CK1VBSUlTb0EwQUlVUWVBRUtJT0FDRkVIUUJDaURvQWhCQjFBQWdoNmdBUVF0UUJJSVNvQTBBSVVRZUFFTDZsRGY3SDJ0cVYyN1p2M3pib3k0NnRyVDAraWprQWd4SjErSnFGMWRWSFdtOEEyQXpYN3dBUVF0UUJJSVNvQTBBSVVRZUFFRDRvQjhEVU96dy92NjJxM3RGNlIxWGR2dERydmREcTRhSU9RSUx0VmZYUjFpT3E2bytycWxuVVhiOERRQWhSQjRBUW9nNEFJVVFkQUVMNG9Cd0QyZjBUKzc5cnZkTy9zT1dHMmJYdEQzejVrNHZkbGhzQUpwR29NNUIrcDk3ZnFjN1ZMVGVzelo2OG9hcHVhN2tCWUJLNWZnZUFFS0lPQUNGRUhRQkNpRG9BaEJCMUFBamgwKzhBRStid1RmT0xWWFZWNngwajhDOExpNzEzdFI2UlROUUJKcyszVmRVMXJVY3dmVnkvQTBBSVVRZUFFS0lPQUNGRUhRQkMrS0FjYkFIWDdWeDlmVlZkMG5wSFl5OGVXSm43dTlZallKUkVIYmFHSDZ1cW0xdVBhR3kxcWk1dVBRSkd5ZlU3QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVFvZzZBSVFRZFFBSUllb0FFRUxVQVNDRUwzUUJJTUZhVmQzZGVrUlZIV3Y1Y0ZFSFlPb3Q5SG9ucXVwSFd1OW96ZlU3QUlRUWRRQUlJZW9BRUVMVUFTQ0VEOG94bUU0ZHJuNjl1dVdFL25xdHRudyt3S1FTZFFiU3ZXdnA1MXR2QU9EbHVYNEhnQkNpRGdBaFJCMEFRb2c2QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVFvZzZBSVFRZFFBSUllb0FFRUxVQVNDRXFBTkFDRkVIZ0JDaURnQWhSQjBBUW9nNkFJUVFkUUFJTWR0NkFJemJudjI3cnF5cUgyNjlZd1B1V2w3cVB0aDZCREM1UkoydDZQS3Erc1hXSXpaZ3VhcEVIZmgvdVg0SGdCQ2lEZ0FoUkIwQVFuaFBIV0R5Zkw2cWpyVWVNUUpmYUQwZ25hZ0RUSmlGeGQ1dnR0N0FkSEw5RGdBaFJCMEFRb2c2QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVFvZzZBSVFRZFFBSUllb0FFRUxVQVNDRXIxNEZnSmU0N0pjdS9zbjFtYzZGZzc1dVpxMy8xdy9jL05pL2ptTFRtUkoxQUhpSi9rem5GenBWZXdaKzNiYk9EVlhWTk9xdTN3RWdoS2dEUUFoUkI0QVFvZzRBSVVRZEFFS0lPZ0NFOEUvYVlHdTR2YXJ1YVQyaXNiWFdBMkRVUkIyMmdBTXJjODlXMWJPdGR3Q2o1Zm9kQUVLSU9nQ0VHTlgxK3d0VjlYc2pPcHZ4T3Q1NkFBQm5aaVJSWDE3cVBsdFYxNC9pYkFEZzVmbWdIQUQ4WC85VVZVY0hmVkYvdlhvajJESVFVUWVBbDFoZTZsN1hlc05HK2FBY0FJUVFkUUFJNGZvZFlBTHMyYi9yZ3FwNlorc2RBMXBaWHVyZTFub0UvMHZVQVNiRGhWVjFVK3NSQTFxdUtsR2ZJSzdmQVNDRXFBTkFDRkVIZ0JDaURnQWhSQjBBUXZqMCs1aXQzcnZ6cjZycU5hMTNET2lMYzN0WGZycjFpQ0g2WkZYOVErc1JHOUJ0UFFDWWJLSStmbSt1cW5OYmo5aktscGU2VDFmVjA2MTNBQXliNjNjQUNDSHFBQkRDOVR2UXhLNTkrKytvcXQwak92NTd1NGVXWGh6UjJUQ3hSQjFvNWJLcWV1T0l6bllMeVpia1Azd0FDQ0hxQUJCQzFBRWdoS2dEUUFoUkI0QVFvZzRBSVVRZEFFS0lPZ0NFbUlnL1BuUDRwdmxycXVwSEc4OTRjR0d4OS91Tk53REFoazFFMUt2cU82cnF4c1liN3E0cVVRZGdhcmwrQjRBUW9nNEFJVVFkQUVLSU9nQ0VFSFVBQ0NIcUFCQkMxQUVnaEtnRFFBaFJCNEFRb2c0QUlTYmx6OFFTWk5lKy9kdXE2cWRhNzVnU3g3cUhsdjZnOVFnZ2c2Z3pDdHVyNnJiV0k2YkVhbFZ0MWFoL2QxVnRHOFhCM1VOTHgwWnhMa3c2VVFlYTZCNWErbXJyRFpER2Urb0FFRUxVQVNDRXFBTkFDRkVIZ0JDaURnQWhSQjBBUW9nNkFJUVFkUUFJNFkvUEFEQjJ1L2J0Ly9FYTBWOFVuQUl2ZEE4dC9ja29EaFoxZ01td1dsWHZhVDFpUUU5dTRyVWZxNm9kd3hveVpWYXJTdFFCVWkwdmRmK3JxbTV0dllQcDVqMTFBQWdoNmdBUVF0UUJJSVNvQTBBSVVRZUFFRDc5UG42UFY5WFIxaU1HMUdzOUFJRFRFL1V4bTl1N2NrWHJEUUJrbXBTby8yTlZmYmp4aG45ci9Id0EySlNKaVByQ1l1KytxcnF2OVE0QW1HWStLQWNBSVVRZEFFS0lPZ0NFRUhVQUNDSHFBQkJDMUFFZ2hLZ0RRSWlKK0hmcVFGdUg1K2V2cjYzMy80Ti9YdWoxUHR0NkJBelRWdnNoQmw3ZUxWVzFvL1dJTWZ2dHFoSjFvcmgrQjRBUW9nNEFJVVFkQUVLSU9nQ0U4RUU1Z0VCUGZHN3VaOWZYNjMyak9IdG1wdDczVFc5ZC9kZ296bVp6UlAzcjdObS9hMmRWWGRONng0ajg2ZkpTOS9uV0k0QXg2TmZabmVyTWplYnMvdGtqT1pkTkUvVlRYVlpWSDI4OVlrUXVyU3BSQndqbFBYVUFDQ0hxQUJCQzFBRWdoS2dEUUFoUkI0QVFvZzRBSVVRZEFFS0lPZ0NFRUhVQUNDSHFBQkJDMUFFZ2hLZ0RRQWhSQjRBUW9nNEFJVVFkQUVLSU9nQ0VFSFVBQ0NIcUFCQkMxQUVneEd6ckFRQU1YMzk5NW5qTjlJK083R3dta3FnREJKcjdudjg4V0ZVSFcrOWd2RnkvQTBBSVVRZUFFS0lPQUNGRUhRQkNpRG9BaEJCMUFBZ2g2Z0FRUXRRQklJU29BMEFJVVFlQUVLSU9BQ0ZFSFFCQ2lEb0FoQkIxQUFnaDZnQVF3dmVwTXdvbnEycXg5WWdwOFh6ckFkRElVbFZ0YXoyaWtaSDkzSXM2UTljOXRDVHF3Q3ZxSGxyNlVPc05pVnkvQTBBSVVRZUFFS0lPQUNGRUhRQkNpRG9BaEJCMUFBZ2g2Z0FRUXRRQklJU29BMEFJVVFlQUVQNU1MTUFyK0p2OWw5eFpWYTlxdldPSVZxOWErdEk3VzQ5Z05FUWQ0Slg5WUZYdGFEMWlpQjVyUFlEUmNmME9BQ0ZFSFFCQ2lEb0FoUENlK3FuK29xcGUyM3JFaUJ4dlBZQ0p0Yk9xT3ExSGpKbWZCK0tJK3RkWlh1cXVWOVd4MWp0Z25CWjZ2YU90TndDYjUvb2RBRUtJT2dDRWNQM09WTG5zbDcvbDBuNW43WUVSSEgxMGVhbTdjd1RuQWk5eGVINytJMVYxNDVnZmUvdENyL2N6WTM1bUUzNVRCNEFRb2c0QUlVUWRBRUtJT2dDRUVIVUFDQ0hxQUJCQzFBRWdoS2dEUUFoUkI0QVFvZzRBSVVRZEFFS0lPZ0NFRUhVQUNDSHFBQkJDMUFFZ2hLZ0RRSWpaMWdOZzBsMjNjL1ZYcXVwTmpXY2NQTEF5OS9uR0c0QUpKK3B3ZW51cjZ1ckdHejVUVmFJT1lhN2J1WHBlVmIxcVdPZUpPZ0MwOC9HcWV0dXdEdk9lT2dDRThKdjZoRHA4MC96YnF1cmRyWGVjb1hjdExQWWVhajBDWUtzVDljbjErcXI2L3RZanp0QnJ4L1dnNWJNZWZlVHlaM2EvYnRqbmJ0c3gweC8ybVFEakp1cE1sZjZ2OXRlcjZwbldPd0Fta2ZmVUFTQ0VxQU5BQ0ZFSGdCQ2lEZ0FoUkIwQVF2ajBPd0RqOU1HcU9qRG1aeDRkOC9PYUVYVUF4bWFoMTF1dHF0WFdPMUs1ZmdlQUVLSU9BQ0VtNnZyOW9Zc3Vla2UvMy8rMUJvOCt1TkRydmJmQmN3RmdhQ1lxNnYycXM2dHE1OWdmM09sODQ5aWZDUUJENXZvZEFFS0lPZ0NFRUhVQUNERlI3NmtEd0JiemwxVzFNcXpEUkIwQUdqbXdNdmVSWVo3bitoMEFRb2c2QUlRUWRRQUlJZW9BRU1JSDVRQmUyWnVycXRONnhCQ2RiRDJBMFJGMTRCU1g3TnQvN29sKzV6dGI3eGhVdjcvMjZPTi8rQnVQRFBQTXE1YSs5Tmd3ejROUkVuWGdGQzlXLzlLWlR0M1Rlc2VnWmpyYmJxbXFtMXJ2Z0ZhOHB3NEFJVVFkQUVLSU9nQ0U4SjQ2bk41SHE1cS92M3gvNCtjRFUwRFU0VFFPck16OVVlc05BR2ZDOVRzQWhCQjFBQWdoNmdBUVF0UUJJSVNvQTBBSVVRZUFFUDVKR3dCVlZYWEZ6MTJ4L2NYem52akVvSy9yOSt2Z2d4L3UvdmtvTmpFWVVRZWdxcXFldXVpcGJlZThVRDgwNk9zNm5mck1LUFl3T0ZFSGdDRjU2TDJ2Ky9aK2Y5c2xnNzV1cHQvL2owc1h2N0xwdnh3cDZnQXdKUDIxbVd1cnMzN2pvSzlicjdxcnF0NisyZWY3b0J3QWhKaW8zOVFYZXIxYmoremVmV0RjenoxeTVNakpoWEUvOVBTT1Z0WERyVWVjb1JkYUR3Qmd3cUplL2Y3YTdxcTFjVDkyOTdnZmVBWVdGbnVmcXFwUHRkNEJ3UFJ3L1E0QUlVUWRBRUtJT2dDRUVIVUFDQ0hxQUJCaXNqNzl6cGJ6eEwxenIzbStUZ3o5djhPbnpubm0rYmU4cFg5aTJPY0NUREpScDZsK2RUNTlWcjNxeW1HZit3M1A3dHhYVmZjTSsxeElkc0ZYTGxnN2NmNFRHL2hpbHZYSGg3K0dqUkIxQUtxcTZ2N2Z2ZjlFMWVCZjZNTGs4SjQ2QUlUd216b0FERW1uMDMrNlg5VWQ5SFg5cWllRzhYeFJCNEFoZWROaTd3TlY5WUZXejNmOURnQWhSQjBBUW9nNkFJUVFkUUFJSWVvQUVFTFVBU0NFcUFOQUNGRUhnQkNpRGdBaFJCMEFRb2c2QUlRUWRRQUlJZW9BRUVMVUFTQ0VxQU5BQ04rbkRweGkrK3hzZCszRTJudGE3eGhZcDNOLzZ3blFrcWdEcC9qeUozNTlwYXB1YmIwREdNeC9BNXZKNXhsWUwzOENBQUFBQUVsRlRrU3VRbUNDVUVzQkFoUUFDZ0FBQUFnQXpsMXNScklZQUZ2c0FRQUFlZ1FBQUNFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUc1dmNtMWhkR2wyWlMxMGVYQmxjeTF2WW1wbFkzUlRkRzl5WVdkbExubHRiRkJMQVFJVUFBb0FBQUFBQU01ZGJFWUFBQUFBQUFBQUFBQUFBQUFIQUFBQUFBQUFBQUFBRUFBQUFDc0NBQUJwYldGblpYTXZVRXNCQWhRQUNnQUFBQUFBemwxc1JyeFZ0TUFDRVFBQUFoRUFBQllBQUFBQUFBQUFBQUFBQUFBQVVBSUFBR2x0WVdkbGN5OXZZbXBsWTNSemRHOXlaUzV3Ym1kUVN3VUdBQUFBQUFNQUF3RElBQUFBaGhNQUFBQUEifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA0X05vcm1hdGl2ZVR5cGVDSS1vYmplY3RTdG9yYWdlL2NvbW1hbmQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTViMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9jb21tYW5kCkBAIC0wLDAgKzEsMTUgQEAKK2hlYWRlcnM9YHBhc3RlIC1zIC1kIiAiIGhlYWRlcnNgCisKK2NvbW1hbmQ9ImN1cmwgIC1YUE9TVCBcImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzEvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlc1wiIC1kIFwiQGJvZHkudHh0XCIgJHtoZWFkZXJzfSAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiICAiCisKK2VjaG8gJGNvbW1hbmQgPiB0b0V4ZWMKK2NobW9kICt4IHRvRXhlYworLi90b0V4ZWMKKworCisjJGNvbW1hbmQKKworI2N1cmwgIC1YUE9TVCAiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiICAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuIgorCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDRfTm9ybWF0aXZlVHlwZUNJLW9iamVjdFN0b3JhZ2UvY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDRfTm9ybWF0aXZlVHlwZUNJLW9iamVjdFN0b3JhZ2UvY29tbWFuZFRyaWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTZhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9jb21tYW5kVHJpYWwKQEAgLTAsMCArMSwxMiBAQAorY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiIKK2NvbW1hbmQ9IiRjb21tYW5kIGBwYXN0ZSAtcyAtZFwiIFwiIGhlYWRlcnNgIgorY29tbWFuZD0iJGNvbW1hbmQgLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiIgCisKK2VjaG8gJGNvbW1hbmQgPiAxLmxvZworCiskY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9jb250ZW50TUQ1LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA0X05vcm1hdGl2ZVR5cGVDSS1vYmplY3RTdG9yYWdlL2NvbnRlbnRNRDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNzAzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9jb250ZW50TUQ1LnR4dApAQCAtMCwwICsxIEBACitaRGRtWWpGbU9EZzRPRFpsT0dSa01ERTBOV05oTkdZd1lqUmhObUV4TjJRPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA0X05vcm1hdGl2ZVR5cGVDSS1vYmplY3RTdG9yYWdlL2hlYWRlcnMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9oZWFkZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMWRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS9oZWFkZXJzCkBAIC0wLDAgKzEsOCBAQAorLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgCistLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAKKy0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX1dTVFlQRTogSFRUUF9DU1BfV1NUWVBFIgorLS1oZWFkZXIgIlVTRVJfSUQ6IFVTRVJfSUQiCistLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDRfTm9ybWF0aXZlVHlwZUNJLW9iamVjdFN0b3JhZ2UvcmVzdWx0cyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA0X05vcm1hdGl2ZVR5cGVDSS1vYmplY3RTdG9yYWdlL3Jlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA0X05vcm1hdGl2ZVR5cGVDSS1vYmplY3RTdG9yYWdlL3Jlc3VsdHMKQEAgLTAsMCArMSBAQAorLio6MjA0Oi4qOi4qCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS90b0V4ZWMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNF9Ob3JtYXRpdmVUeXBlQ0ktb2JqZWN0U3RvcmFnZS90b0V4ZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlMjZmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA0X05vcm1hdGl2ZVR5cGVDSS1vYmplY3RTdG9yYWdlL3RvRXhlYwpAQCAtMCwwICsxIEBACitjdXJsIC1YUE9TVCAiaHR0cDovLzE3Mi4yMC40My4xMjE6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkhUVFBfQ1NQX1dTVFlQRTogSFRUUF9DU1BfV1NUWVBFIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXG4iCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvYm9keS50eHQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiNmZhYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC9ib2R5LnR4dApAQCAtMCwwICsxIEBACit7InBheWxvYWROYW1lIjoibm9ybWF0aXZlLXR5cGVzLXNvZnR3YXJlQ29tcG9uZW50LnppcCIsImlzRW5jb2RlZCI6dHJ1ZSwiaXNDb21wcmVzc2VkIjp0cnVlLCJhcnRpZmFjdExpc3QiOlt7ImFydGlmYWN0TmFtZSI6InNvZnR3YXJlLnBuZyIsImFydGlmYWN0VHlwZSI6IklDT04iLCJhcnRpZmFjdERlc2NyaXB0aW9uIjoiIiwiYXJ0aWZhY3RQYXRoIjoiaW1hZ2VzL3NvZnR3YXJlLnBuZyJ9XSwicGF5bG9hZERhdGEiOiJVRXNEQkFvQUFBQUlBT0pkYkVZcVhmZ0ZhUUVBQVBRQ0FBQWxBQUFBYm05eWJXRjBhWFpsTFhSNWNHVnpMWE52Wm5SM1lYSmxRMjl0Y0c5dVpXNTBMbmx0YkgxU1MyL0NNQXkrNTFkWTNOdUJkdXRoMHRRTEo1aEc3NVhYR0JxSkpKM2pidUxmencwRjlrQlRMcEh6UGV6UGtaZzZiQzN0WFhEaVlranRCM0hTU3dXU241THp3NUhhRS9wanUycVhlajd0OHRFWUlhMmpVQnZRMHd3dVFtU1A0ajZva05OQXFVaHhMNS9JVkVjL3hFQkJialFjcFk5Y1FiUGQxYy9RMUxlWGF3T3JjcWxuc2l0Mm0rZVgzWHJiR0dNcGRld0d5WWc2QmtFWEVraFBjRFdIYkE2M29VcWpRMFNXVkJtQUFoYjNtK1VZcGJyanVmaVAxT2xrbzlCOW5nblJVcHVCbFZHVkxGRk94VlR1ZmtjejlRYUFiMGtZTzlGRWVhUmNzc1RxWjlzOVIxLzkwSGpWam1mSXQxQ2VjZ21nMFV6TzZmN3hnbzN5b2RIR2dHbGdTbHBMZ0hDZ29HWWRYUFlHM1hWeFowM3BVYUREQUc4RUhnTWV5QUlHQ3p4cTZhUUtaOFA2bk1yTnBzeDhwdmZSTWZuSnJab1ZDK2hqa3A5enpmUVpBWG1mRndTVGZwTHBvL1p1U09WYXVXUzNJVU1GRDFkWjEwMVJQRGl2TGFhSHl6emxFQTdHZkFGUVN3TUVDZ0FBQUFBQTRsMXNSZ0FBQUFBQUFBQUFBQUFBQUFjQUFBQnBiV0ZuWlhNdlVFc0RCQW9BQUFBQUFPSmRiRWFjamlFVGI5Z0FBRy9ZQUFBVEFBQUFhVzFoWjJWekwzTnZablIzWVhKbExuQnVaNGxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUdIQUFBQ0FBZ0dBQUFBYVVPZ2d3QUFBQVJ6UWtsVUNBZ0lDSHdJWklnQUFBQUpjRWhaY3dBQUd6UUFBQnMwQWJzT0pFMEFBQUFaZEVWWWRGTnZablIzWVhKbEFIZDNkeTVwYm10elkyRndaUzV2Y21lYjdqd2FBQUFBS1hSRldIUlVhWFJzWlFCVGIyWjBkMkZ5WlNCRFlYSjBiMjRnUW05NElGZGxZaUF5TGpBZ0tISmxiV2w0S1YvYXNrc0FBQUFWZEVWWWRFRjFkR2h2Y2dCd1lXeHZiV0ZwY205dWFYRjFaWkR3Ty9rQUFBRFRkRVZZZEVSbGMyTnlhWEIwYVc5dUFGTnZablIzWVhKbElFTmhjblJ2YmlCQ2IzZ2dWMlZpSURJdU1DQW9jbVZ0YVhobFpDQnBiR3gxYzNSeVlYUnBiMjRnWm5KdmJTQjBhR1VnWlhoalpXeHNaVzUwSUhkdmNtc2diMllnSW14bFlXNWtjbTl6WTJsdmJHRkFaMjFoYVd3dVkyOXRJaWtnTFNCQ2I4T3VkR1VnWlc0Z1kyRnlkRzl1SUdSMUlHeHZaMmxqYVdWc0lGZGxZaUF5TGpBZ0xTQlRiMlowZDJGeVpTQkxZWEowYjI0Z1YyVmlJREl1TUNBdElFTmhjblJ2Ym1VZ1kyOXVJSE52Wm5SM1lYSmxJRmRsWWlBeUxqQVpFLzByQUFBQUlYUkZXSFJEY21WaGRHbHZiaUJVYVcxbEFESXdNVEF0TURZdE1UQlVNVGs2TlRVNk1USU1XeDJCQUFBQVlIUkZXSFJUYjNWeVkyVUFhSFIwY0RvdkwyOXdaVzVqYkdsd1lYSjBMbTl5Wnk5a1pYUmhhV3d2TmpVMk1qa3ZjMjltZEhkaGNtVXRZMkZ5ZEc5dUxXSnZlQzEzWldJdE1pNHdMU2h5WlcxcGVDa3RZbmt0Y0dGc2IyMWhhWEp2Ym1seGRXV3hJaW9RQUFBQVNYUkZXSFJEYjNCNWNtbG5hSFFBVUhWaWJHbGpJRVJ2YldGcGJpQm9kSFJ3T2k4dlkzSmxZWFJwZG1WamIyMXRiMjV6TG05eVp5OXNhV05sYm5ObGN5OXdkV0pzYVdOa2IyMWhhVzR2V2NQK3lnQUFJQUJKUkVGVWVKenN2WG1jRk5XNVB2NVVyOVByRExNd3JHb0FFUVFGa1VWQUJLOXhpemU1Smk2Ulg4STFha3hJRkplckpncmZSS05KY00xaWdoS1hFR09Ja1NodWFJeUp4aGdXQlJTREdCVkZnZGxnbUpudW5xMlhxbFBuOTBkMTkvUlNhM2QxZDFWUFBaOFAybE5WWjZucXJ2YzU3L08rNXh5R1Vnb0xGaXhZcUdaTXYrSEhOZ0RCakgrMUFBSTV4MUwvQWdCVEMrQUlnSDhCMkxMbnZsVXRsZWgzSmNGWTVHREJnZ1d6WWZyLzNlR0ZZT0Jya1RiMlRERGo3NkhQREFJQS9BQVlBSmtHVCtZemszdjhJSWFJb2wzZnV6RW1MSEt3WU1GQ1JUSDkranVjWUZBTG9BNURSajNIOEdjZER3QndKSXRuR0RCRzNOZ3phZ2toODNNZU9XUisvZ3pBWmdoRWNWamg5a3dMaXh3c1dMQ2dHNlpkZjdzTmd2Rk9HZnRNUTEvTDVQeWRsRzlxaG14eElZWThoYktSUStibmZXQ3dHY0RXUGZldU9vSXFna1VPRml4WWtNUzA2MzZVa20vcU1rYjNkVW1qTGtZQUFXUllWdVFZVkNidk9DTjhOaTQ1S0pkaDBwLzNBdGdLZ1NpNllYSlk1R0RCd2pEQnRPdHVjeWFOZXAzSXY1UnhINUh4dVE2QUUvbEdFR21qUGdSVm4vUEpBUUNZY3BKRGNYWEprME1LUElDUElCREZ0ajMzcmdyQmhMREl3WUlGRTJMYXRiY3hFSFQ0bEhFZkFTWnQ1RWRneU9EWFljamcrd28xNmdCRWpLQUdBNXI4WEFKeVVOY256ZDVEVWVTUVF4VE1meUFReFZ0NzdsMFpnVWxna1lNRkN3YkF0R3R2OVdESXFPZjhuMG45WFpkeFBBakFsaXl1eGtnVk5lSVhyNzhrNUZCNC8rVDZWRGx5eUpTb0NJRDNJUkRGOWozM3J1eURnV0dSZ3dVTE9tUGFOVCswSncxNjZsOGRnSG9JdW4zbTM3VVoxN2d5cWlnME9LckNDSmFkSExMK1pxVDZWRkJjUU94ekJZTFM2c2toOHpnQjhCNEVvdGl4NTk2VkF6QVlMSEt3WUVFRzA2NzVJUU1oeUZxUElVTXU5azh3L3NMblFJVXlaMHBGRHNMZmVkS1A5cnFHSnpta0w1SWlUUTdBYmdoRXNYUFB2U3VqTUFBc2NyQXdyREJ0eFE5cU1HVE1NdzErUGNBSWZ6TjVodDhPTXhncFZmVnJxQ3YzczBVTzRwK0xKNGZNenl5QWR3RnNBL0RPbm50WHhsQWhXT1Jnd2JTWXR1TC8yUUdNU0VvNDlRQWFNR1Q0UjJUOG5Ybk1reXd1L1FJYk42MVNmbVF2MUY5c1hTVWxCOENVNmF6bEpJZk16d2tBdThCZ0c0QjM5OXl6TW80eXdpSUhDNGJCdEt2L1h3Q0NRYS9QK0pkcDhJZitNYWlIRUpSbGl0TFI4ejZYTmExUzJkakwxVldRb2JMSVFYMmRGU2NINGJOUWZ4ekFPd0MyQWN5Lzk5eHpDNHNTd3lJSEN5WEJ0S3RYdVNBWTl0Uy9UR09ma25CeWljQ1JVWVdHRjlMdzVKQjl6aGlaTXhZNUtINHVhYXhIZlQveW4zc013RTRBYndIWXZlZWVXemlVQUJZNVdGREV0S3RXMmlESU55bUQzb2doUTU5cC9GT2ovRVl3OEtGVVJncW9ORG1vcjB2c3VFVU80dlZZNUNEK1dmNjVEMktJS1Bic3VlY1dBcDFna2NNd3hMVHZydlFCYUFLVE51eGl4ajdUNkk4QVlET01rY3FydjJoeXlLNnJxb09qbFgvdXc0d2N0TmRWT0NuM1k0Z29QaWlXS0N4eU1EbW1mZmNXRndRRDNnUmtHZnRHNFRPVGVTeGw3TjBBU2p1Q1ZheS9wRWFxOEhvdGNyRElJZjFaOUZtSmw2bXN4eVpXdmcvWlJLSFowRnZrWUNCTSs4N05ERkt5REJqQndETlp4ajVsNEJzd1JBYUJqQ3JFalYxQnhsdnNjMW5KUWI2TnJCZW1TSU9YOWJuYXlTRjlrWUhJQVNoeklrQnhkWldlSExML3p2dTlhUDY5UndEc0FMQWR3RjYxUkdHUlF3a3g3VHMzKzVCdDJKdVFiZVNiTWo2bi9wOWNFc0dJbzZtaXlLRzR1c3BKRG9aNzdrWWxCNkNRNzdFRTVLQ3VUOGFMOWFqclIvSGtrUGs1RElFa3RnUFlKMGNVRmptb3hMVHYzT3hBdGtIUE5mWmlmM3RFS3hOZ1FpTWxrNEdqK1lXeHlFRmJuY09LSEFydm4xeWZMSExJL2R3RE1OdkJZUHVldTIvK0xLZGZ3NU1ja3ZKTkxkUVorTlRmdFVET3o3YzRHTTFJRlZlWFJRNGludzBYSEswVU9XVDl6VWoxcWFybHZDTElvZFMvZCtHNWRFSHdKbmJzdWZ2bUEwQ1ZrTU8wNzl6c2dmclJmRXFyZDRoV1ZqNlUya2psMXlWMm5mRkdVNVYvV1N4eWtQNnNRenJyOENTSDlFV0dJZ2RLd1JPZVJEbENXSTdqQ09FSVRiQnNieUlSZjd6U0JqSVAwNzV6c3gzSUM4SXFHWHhmUlRwYlhqQVkrbkxWZkxaZ1FTMnMzMWFWZ1ZMS0UwSmlIQ0VKanVNNGpoQ2U0emdiNFhrYklieUw1L2thU3FtWFV1cEZ6dmVhcEo0WERFRU94eTYvNWZ0T2hsN0NBRWRCeU5iUlU3NHhLcXdYc2hoUTVBeWdoc05QUmpVTS9kdVMvTGFzcjFFUmxGSkNDQmZqT0Q3QkVZN2pPRUk1d2pHRUVIR2puL2M4OCtLR1FNNXZJZmsxSkF4QkRnUVlTeWd6MGNuUVR4eENIcjRGQ3hXQ0lTMlVvWTI5aGVKQktTVWNJVkdPSTNIQjZIT1VJd1E4SVhiQ3A0MitqMUxVUWZ4N0ZqZjZOSmNnS0NOQkVMbUlHNEljQUF3QUNMQ1VPWWtEUG5BeHRONEdORmU2VXhZczZJZ2g0MDNCWk9qZmxyR3ZCa2lNS1pKR2YxQXcrb1RqT0k3bk9NS1FQS05QUGNqOXZwbTgrRXlxRWJIZmh2VHZKYTl2b2dTUjZ6MFloaHdHVXg4b01EVk9tWVFkMk81aTZHd01iWVU0UEdISWdhd0ZxRExxcWtkcEZrd0dTaWtualBTNU9NY1JsaU1jNVVqYTZEdDVudmNralg0TmhLMWU4Nm9RcVRiYndGT0FNbUN5Q1VMV0lHZ2pEZm55eHBDVklIZ09tWEFSWUc2VU12dmRET1Z0d0lTSzlNckNjSUxCcFJ0cmxGQU9VRW81amlOUmpuQXhsaU9zRU1nVmpENHZqUFJUUmo4QVllZS9iT1NuaHd0SFFXbk85NmY2dDBRaFNoRGFqTDUyZWNrd25vUFUvcW5IeENsRGJjQU9GME5QWUlDYXN2YktRbkdvckQwenVMRTNLVXpLVVlMUjUvbzVRdUlzeDdFY04yVDBDU1V1bnFjZXl2TitLbVErMW1hWEhrcEJaZkpQWlA5K3NpWEQzRjdrMXFBODBwZC8zcVdVbHd6ck9XU0M0WUU1TWNvY2NUSjBud09ZVnJaZVZSUW1mUXRMQjh2WTZ3WWovcllLNnhQUFU1WVFib0FsSk1hbGpENGhJSVE0Q0NFdW5zTEQ4N3dmZ0JmWjY1QmxOcHpiZE03dlNPTklYWndnQ3BWM0tpVXZHWVljQnBVdlFSTkxtU1lPZU5mTjBNOHhlZXh1UVJwR05BWUdOL2FHZkdSR1JHa2VGTS96aVdRZ044WnhYSUxsQ0Mra2JQSjJ3aE1YcGRTYk5Qb2V5Qmw5SUxOL1JSdE53VTRYWHQ0azhoTHAvZU92aUNISXdlTjB4S0tzdXMyTUtEQXpScGwrQi9DMms2RW5sN2hyRnRURDJNYmVnaUhBODN5Y0kyU0FDTG8rTzJUMGlaMFEzc1ZUM3N2ejFBOGdDREN5UnA4Wk1uSUtSbCtSd0VTTXBxajNJRldibWVRbE5RUVJCeXEvaEFRQTRFdlRKeDFWNzNYajhaMGZvRCtlVUZQRXp3RW5FOHA4NUdKb3dBYU1LWFVmaHlIVVpPQll4dDZJcUlEWHcvTjhUQmpwYzFHT0U1Wmk0QWdCUjRpREZ5Wm5lWGxLQTJBUUFPQ1g2SFh1SWRtVVMwcXpDRUlNUldyeXBwS1g5SXcvR0ljY2VNcjN6RDFxTkthTWJNRHZkNzZQdDFzT3F5cEhnZVBpbEdHVGFhOG5BN0NYdHFlbWcvSUlYanJudmd5d3RCdWpJem5TNytjNExzcHlKTUVSam5DRU1Cd2hkcDd3TlpUblBieVF1U05pOUljQ3VjZy9vWi9SVkZVKzY3ZG1Kbm1wSlBHSEdxZURHVk5mNng1VkczQTNCLzAxVFFHL3V6SGdjOVg3dkRVTWd6N0FJT1RBRVJvQ2dHQ05DMWVmZWhLMkgrelE0a1U0azJtdkxTNkd4dTNBcE5MMnRxS3dwQnNMdW9EbitSakhrVDZXY0ZHTzR4SkM5ZzRIamlkMm50Q2E5RWdmOElHQlY2U0tJWGxuNkpqeVNGdXpQQ0tmY3BualBaaEpYdEk5L21CamJMYVJRYjlqZEYzUTNWenJkemNGL2U1R3Y4L2RHUEM2Ui9pODdoRmVqN3ZXNjNIWGVXdmNIcGZUS1ZWM2U2ajNDR0FRY3VBcDdjNzh1eEF2QXNENEJHVmdBM2E2R0RxTmtkOUx3U2l3akgweHlIbzdMUzhFQUFqUFJ6bU85SEdFaXlZWFhTUHMwSXpjR3A3bnZja2NmUy9FMzVIa2I0M0pQQ0lyajZoNDhtSUVvZUYzYlZ4NXFSenhoNkNueGptbUx1aHNyZ3U0UndiOTdxYUF6OTBROExrYmZGN1hDSi9IWGVjVi9nVThicGVOVVhnU0tzRHhmQUl3Q0Rtd2hPL0tQVmFnRndFZW1CMmpUTGVUb1I4N2dCTjE3NnlGWVFEakVVM1M2UGR5SElteWhJc25sMkVBUjRnenVReURuMUlhWU1Ca0cvMmgyNmlRdktOZDh0QzMvVnlvbEpkS0hIOXdPZXpNcU5wZ3phaTZnTE01R0hBM0JmMnVSci9QWGUvM3V1djlYbGU5VHhqbDEzcHFYQzZIdmF4eU9VdUljY2hoa0dYenlDR0ZBcjJJQnBZeURSeXcyODNROFl5dzBxc0ZDOFpCMGxnUVFnWTRralQ2SEJmbkNPRlpqZ01odklQd3ZEdGw5Q0VZZkxGSm9DVXkram1TaCt6b040OEN6Q1F2NlJaL1lCZ0dEWDZ2YzNSZDBOVmNHM0NORFBwZGpRR2Z1OEh2ZFRYNGZlNFJmbytyenV0eDFYbzlicC9iNVRUVzhHTUlLYy9CTUp2OXZQcVBmMUNIVFg0WkphMWVSQktERHVBL1RtR2RKaU9DU24vTzBFekVSNEFhUHVjRkI0YyttM1hEbjd6NlplNVI4MmZOZXhwbi9VMEk2ZU1JNldNNVlkRTFWc2plWVFnaG1VWS9DR0h0c014MnhaNlphQnRTeDVqYzU4QklYNnQ4TEU4MGtTM1BpQnpMT1VORkRxdnRFeVFJWXFoOVRmY3EwYWZNYXhuQTUzYlpVd2EvT2VoM05pWkgrUTBCcjZ2ZTUzV044SGxkZGQ0YWQ5QlQ0N0xiYkVhMSthcnhuN2JEdTc5NDJvSVpodkFjQUNEQkVlcHd5VC9ZQXIwSUx3Zk1KcFQ1Mk1WUWp3MFlWM3h2TFF3RGlNVjlLQ0drbitWSUwwZTRBWlpMYWZvY1EzanFJRHlwNFhucVN4cDlEMVBvU0YrekpwOTlyUkJUelJpcEs2dGtKcEtYOUlrLzJHMDJwcmsyNkJ4VkczQTExL3BkVFVHL3N5bmd6ekw0STN3ZVY2M1g0NnB4T29aVkZpVEg4OFpKWlFVQWx2QThWS1NpRmhxTG9NQ3hjY3FRWk5yckxCam8zcXNheHBIdjVRTCtQQ2VNOUhzNWpneXd3b3hjTGprajEwRjQ0dUY1bXBKM2FnQzRJZXhHbUZGNy9vaVc1bVdVNUxVdEFuMGxqK0xMbDAxZTB1VmVSL2c4anRFamdxN21ZTUE1TWlnWS9jYUF6MVh2SHpMNGRWNlBLMURqZHVvUXU2MUtFSjZQQVFZeWtBbVY1SkJDZ1Y2RVBabjIydVppNklBZG1GeFFaOHNHNDFoV2cwQnpkaGRIU0VRSTVISURMTWZGV1k2UTVJeGNCK0Y1RDA4aGIvVFZhdnFVTW1JRW9lSStSSTRsVld4Tm1yeW85NURSUDJUV3A5RVE1L3dPdFdVdkZSMS9xSEU2bVZGMUFXZHpiY0RWWEJ0d05RWDh6c2FBMzVrYzVUdnJmVjVYbldEMG5RNjdnalp0UVJHRXA4WWlCNDduT1FDU3ViZGlLTlNMQURBMm1mYjZ0b3VoVTVoaHNRZTFJWWxHczdHSDhBZFBoRkYrbUNYY0lKdXQ2VHNKNFd0NFNnT1pScCtSTXZwTStqK2liVWtjRTRjSVFVaDREMUl3c0x4VUZFSGt3Y1l3VEZQUTd4aFZGM1ExQi8zT3BwU1dIL0E1Ni8xZVo3M1A2MHlPOHAxZXQ4c3dkbW80Z0NNa0NoaUlIRmhDMUMydUpJSUN2UWp3d01reHlvU1MyNVBPS0xSOUMya1VaT3hURURaRjV5TWM0Y0lzUndaWmpvdXhHU21iUE05N2VOQkFVdE4zQXhncFlvSkVSL3JKc2JoRVh4V3RabEdrVVVsNVNZWWdwTW9YZGE4QlQ0MWpURjNRTWJJMjRHd08rbDJOQWIrek1lQnpOZ1M4em5xZnp6bkM3M0dPOEhwZFFXK05RNCtjZkF2NmcvRFVZT1NRVEo4cUZFVjRFU05ZeW96Z2dEMXVobzVpZ01aaStsRmxrRERxMnRaWFNocjlFRXU0TUNjWS9TaWJYRTgvYmZRcERTWkgra21qbjE5TlZxL1NuOVRQTWhXaEFCVXpZbVZoZUhtcHdHdXo0SEk0bUtTazQyaXVEVGlUT3I2endlOXpOZ1I4emhIQ0tOOVo1L000M1E2SEpldVlISVRuQndFRGtRUGhhVkhra0VLaFhnUUZwc2NvRTNNQU81SnByOVU0cWhFMzlnV3VyeVRzajh1SE9jS0ZXSTRiU01zN1NhTlBoRjJ6Z3BSU1B3QTNHSXpNdDhNRkdMSThLNTkzUUpzaHBFaHluUkhscFRSQkZHejB4ZUlQakkxQmc5L3JhSzROT3B0ckE0Nm1vTi9SRkJDTWZZTWc3VGpxZlY1bm5jL3I5TmU0SGRYNE1sZ1FoK0hJZ1NOQytwUWVLTUtMcU9HQU9SeGw5cmtaNnJBQlIrdlZweEtoS0JsSENzbE4wWHM0amtSWXd2V3hySkM5d3hMT1JnanZKRHoxMGlGTjN3V2xrZjdRRVlZeW1mS09TSEJTSGtWbnRKaElYaW9vL3VCenUyeWo2b0xPa2JVQng4aWczeUdNOHYwT1laVHZkZFQ3ZktsUnZxTWFjdkl0NkEvQzB3SEFRT1JBcUpBK3BTY0s5U0lBVEl4VGhrK212WjRFallIeUlsQVNZNTlDY2xQMGJwWWpZWmJqK3JsazlrN1M2RHNJei91eVJ2cEFFeGlwN0ozQ1IrcWk4bzVXbzV0ZFNUbmxKWFY5bFpDWENvay9PT3dNTXpJWWREVFhwUTIrb3pIb2R6UUtzbzZqM3U5MTF2dDlqaEUrajdQRzZiUmtIUXRGZ1ZEZVdPVEFKWU1nZXFNSUw4S1dUSHM5NUdKb3lBNU1MVVgvVUlTeFR5SEQ2SWRZanVzWFVqWTVqaVVrT2RMbmZaVG5nMVJZVXRrTk1DT1JITzFuaXcwaWZkTmRrOC9OY3BFZHJaZFRYa3JlcTZLOHBMNnZDdkdIRVQ2dnZiazI0Qmlaa25XQ2ZrZGp3T2RvQ1BnY0RYNWYwdUI3SFVGdmpTWHJXQ2diQ0UvN0FRT1JRMHJuS2hXSzhDSkdKU2d6eWdhODQyTG9zWXo0bG9RbEFhV1VGWXcrRnhMa0hSSlBES1ZzdWdoUGZaVG5hNm1RaXB1U2R3U0pKMXU3eWEwNU02Q2Nnb0ltbjN0dDRjc05sMWxlRXIxV1JGN0s2RXJoOFljYXA1TnByZ3M0QkIxL3lPZzNCSHlPUnIvUFVlLzNPZXI5WGtlZHorTncydTJXemJkZ09CQ2VOeG81MEpLU0ExQ1VGd0VlbUJXalRLK1RvYnNjd0VuRjlJT25sT1U0MHNVUnJpZkJrbjZXNDJJczRWTFpPeTZlOGo2ZXAzVVFsbFhPTnZwRFJrdVhqSlFjdTYreGZIR0I0Q0xsSmVHNHNyd2tCZFh4Qnh2RG9ESG9kelRYQnV3amt3YS9VVEQ2OWdhL3o1SFU4aDBqL0Y2SHorMnlaQjBMcG9ieHlJRUtya3c1VUlRWEVXUXBjeElIL01mRjBBWWIwSng1a3VkcGdpT2tpK1c0RU10eC9RbEIzaUVjUjJ3Y0lXNmVwejZlMGhFUVZ0aDBRU2lmcmlPWjlhMVBHbUtlMGN5OWRzaDdVQXpEbGxCZUdtbzcvYWxzOFllZ3A4YVdsSFhzSXdXRGIyOEtCaHlOQVo5ZDBQSjlqbnEvMTE3cjlUaHNWa3EraFdFQ2p1Y2pnSUhJZ2VmTFJ3NUFjVjRFQlk2UFV5WVJEb1grUFRnNEdPTjVQc0JUV2dmQjZDc3NyU3h0dEpLTGhpa1lYUTJTaDZMVkw2dThWSmI0Zzh0aFowWUdBL2FSdFFIN3lOcWdZMlRRYjI4VXRIeDdRMEFZNmRmN3ZmWjZ2OWZoY2xoU3ZnVUx1ZUNJd1R3SG50TGVTclJiaEJmaDRubDZMRWVJV0FwdTBTbVg4dVgxVDdsVUxTOVZJUDdBTUF6cS9WNTdjMjNBTnJJMllHOEtCdXhObVFZLzRMTTMrSDMyZXIvWEVmRFVXTEtPQlF0RndIQ2VBK0g1aXBBRFVMZ1h3ZGdZSm4vMEsxOUV5WkFxTERsY1RubXA1UEVIcjl2Rk5OY0c3TTExUVh0VDBHOGZHUXpZRzRNK2UyUEFueHJsMitvRFhzY0luOWRtNWVSYnNGQWVETVFTdllDQnlJR25pRlM2RDFxOUNCdGo0d0dJeUNNQWlqQ2tKWmFYU2hwL2NOaHRhRXJKT2tHL3JTa1lzRGNHL2JiR1FNcm8rK3dOQVorOTN1K3plNHk3R1pZRkM4TVdrV2pVV0o0RFQybTQwbjBBdEhrUmpJMVJXaXl3blBKU1NlTVBJM3hlMjhqYWdLMHBhZlNGNEszZjFoRHcyeHNEUGx0RHdHK3Y5L3ZzdFY2UEZidTFZTUdrb0FDZTJQWnU1RGZYR0lnY0tHaW8wbjNJaEJvdmdtRVlBbUdiUnludlFRcGE1S1dTeFI5cVhFNm11VFpnYXdvRzdDT0RBVnRUYmNEV0dQRGJrdEtPclNIZ3N6WDRmZmI2Z005bTVlUmJzRkQ5WURsQ2VwLzROUWNZaUJ3SWJ5eHlBSlM5aUtTc05CUUExU1l2bFNUK1lMZlphRVBBSjR6eWd3RmJrekRDWnhxRGZydGcrSk5HUCtDMys5d3V5K0Jic0dBaERaWVFrdnBzR0hMZ0tlMnFkQitrSU9WRk1EYUd6N3U0UlBHSG9LY0dhWU5mRzdBMUNkS09NTkxQTVBwMVBxL04wblVzV0xCUUNEakNwNlZ5dzVBREEzUlh1Zzl5RVBNaWJJeW1yTWs4Z25BNUhFeFRyWjhaR1F3bWpiN2YxaGp3TTJuREx4aC9waUhnczFrNStSWXNXQ2cxRWhtYnJobUdIQngyMjVGSzkwRU5NcjJJclo4Y1RBMzdjM1B5YlNOckE0d3d3Zzh3alVHL3JTbm9aNXFDQVZ0alVERDJEUUcvTGVpcHNReStCUXNXREFPT0VEYjFtYUZVYlF5MTlQakg2NjlUTTBraWJ4N29pRGtjVGx0ajBNODBCdnkyaHFDUHFmZjdiTlllNXhZc1dEQWpXbnJDaDViTU9YazBZQ0RQQVFEaUhLRWVwM25razZQcmF4MXpwazQyMURPMFlNR0NoVUxCa3FIdG1nMDF4RTBRa2gvZ05UQnNqSHdPcVFVTEZpeVlDY1NvNU1BUzNsVGtZR2RNcElGWnNHREJnZ0k0M3Jqa29EVGoyRkF3VTN6RWdnVUxGcFNRdVpDb29jaUI0ODFGRGc1ck1UZ0xGaXhVRVFqUHgxS2ZEUlZNNVRMMExqUEEyZ0dtdW5EdzRFRzB0YldCNHppd0xJdWFtaG9jZi96eHFLdXIwMVFQeTdKd09wMGw2cVdGU3VLOTk5N0R0bTNiOFBiYmIyUHYzcjNnazBxNDErdkYzTGx6Y2RwcHAySEJnZ1h3ZUR3VjdtbGg0SGhxVUhMZ1RVWU9kbnVsdTJDaFNHemZ2aDNyMTYvSGpoMDcwTm5aS1hyTjJMRmpzWHo1Y2l4ZHVsU3h2aWVmZkJLSlJBTExsaTNUdTZzV0tvajMzMzhmOTk1N0wvNzFyMzlKWHZQeHh4OWovZnIxYUdwcXdzMDMzNHovK1ovL0tXTVA5UUhoK1dqcXM4SElnWXB0bkdOWU9PMkdVdVVzYUVCWFZ4ZFdyMTZONTU1N1R2SGF0clkyUkNMS0s4by84TUFEK05uUGZvWWJiN3hSank1YTBBbWRuWjE0L2ZYWHNXZlBIbmk5WHRUVjFXSCsvUG1ZTVdPR3F2SS8vL25QOGNBREQwRHRuTEFqUjQ3Z2hodHV3Rk5QUFlVMWE5WWdHQXdXMC8yeXdyRGtrS2wzbVFFTUFFb3ByS1FsY3lFVUN1R1NTeTdCL3YzN1ZaY1pPWEtrNURsS0tlNjQ0dzc4L3ZlL0J3QU1EZzRXMjBVTE91RzU1NTdERDM3d0E5SHZaTTZjT2JqaGhoc3dlL1pzMGJLRUVLeGN1UkpQUC8xMFFXMXYyN1lOMy96bU4vSFlZNCtaUm1iaURFc09sRWFWcnpJV09FTGdkQmpxTVZxUVFTd1d3emUvK1UxTnhBQklrd1BMc3JqcHBwdXdhZE9tOUxGbzFIUS9ZMU5oLy83OStPeXp6M0RvMENGMGRIVGcwS0ZENmMrTEZpM0NEMy80UXdEQXM4OCtLK3ZGN2RpeEE3dDI3WklraDFXclZoVk1EQ204ODg0N1dMNThPWDc3MjkvQ2JnSVptdWZwUU9xem9hd2E0WG5URGJsaUNaWTZyVVh4VElNbm4zd1MvLzczdnpXWGEyNXV6anMyT0RpSTczNzN1OWk4ZVhQVzhWak1WQTZ3NlhEYmJiZmxQZk1VcGsrZkRnQm9hV25CcmJmZXFsalhyRm16Ukk4Lzk5eHplT3FwcHdydlpBYTJiTm1DMy8vKzk3anNzc3QwcWErVTRESnNzS0hJZ2VPcDZjZ2h6cklJd0J3dTQzQUh6L040N0xISENpcWI2em4wOVBUZ2lpdXV3SHZ2dlpkM3JTVXJBZTN0N2RpK2ZUdmVldXN0N04yN0Z5ekxwclBBT0k3RDVNbVRzWERoUWl4WXNBQ1RKazNTVkxmWDY1VThsL0xhYnIvOWRnd01ERWhlQndBT2h5Tk5KcG5ZdjM4L2Z2Q0RIMmpxa3hMdXYvOStmT2xMWDBKRFE0T3U5ZW9OdzNvT1BLWDlsZTZEVnNSWlUwM05HTmJZdlhzM0RoNDhxTG1jMisxR2JXMXQrdS91N201Y2Nza2wrT3l6ejBTdkg2NmV3OEdEQi9IQUF3L2d6VGZmUkd0cnEreTFMUzB0ZVBYVlZ3RUFwNTU2S3U2KysyN1p1RTRtNVBUN1dDeUdEejc0QVAvNHh6OFU2NWsyYlJyY2JuZmU4Wi85N0dlNkUzeGZYeC91dSs4Ky9QU25QOVcxWHIzQjhjU1k1RUI0MmxmcFBtaEZnbU1WOStrMEVpaWwrUFRUVC9IdXUrL2l5SkVqaUVhakdCd2NCS1VVUng5OU5DWk9uSWhqanowV1RVMU5sZTZxN3RpM2I1L2lOUTZIQTNQbnpzV1VLVk13T0RpSWdZRUIxTlRVWkYzVDB0SWlTUXhBZGNVY0tLVmdXUll1bDB2MnVnMGJOdURIUC81eFFVWjE4K2JOT08rODgzRC8vZmRqL3Z6NWl0ZkxrVU0wR3NWdmZ2TWJWZTJlZE5KSmVjZjI3ZHVIbDE5K1diYWN5K1hDdWVlZWk0c3Z2aGlmKzl6bjhObG5uK0h2Zi84N2Z2ZTczOGxtTkQzenpETzQrZWFiRFoyOVJQaWhBYnFoeUlGU001SURNVHd4aEVJaC9PbFBmOEtPSFR2dzdydnZvcmUzVi9aNmhtR3dZTUVDWEhMSkpmajg1ejlmTlJPNjVBdzZBUGg4UHF4YnQwNVNoMDRobHl4eVlUWnlDSWZEMkxselp6cTQyOUhSa2Y1MzZOQWgzSDMzM2ZqU2w3NGtXallVQ3VHV1cyN0IzLy8rOTZMNkVBcUZzR0xGQ3J6MDBrdUtIb1FjT2V6ZnZ4L3Z2dnV1cWpiRnlHSHQyclhwaVcxaWNEZ2NlUGpoaDdGdzRjTDBzWkVqUjJMZXZIbVlQWHMyYnJycEprbUNaRmtXZi92YjMzREJCUmVvNmw4bHdHY00wQTFGRG9UeThsYkxnR0NIdGx3MUhFS2hFQjU1NUJFOC92ampta1owbEZKczJiSUZXN1pzd2FSSms3Qm16UnBNbkRpeGhEMHREOXJiMjJYUG4zLysrWXJFQU1ocjNvQXh5RUZMaXZVenp6eURuL3prSjVMbnhYVDVWQnZMbHkvSDIyKy9YVkFmY3hFT2gvRzk3MzBQdi92ZDcyU3ZreU9IN203MUcwcm1ra00wR3NXTEw3NG9lVDNETUxqcnJydXlpQ0VUWjU5OU50cmIyMldmNWFaTm13eE5EaHcvWklNTlJRNDhwY296alF3R2pqTW1PYXhmdng1MzNYVlgwZHJwSjU5OGd2UFBQeDkzMzMwM3pqMzNYSjE2Vnhtd0xDdDdmdEdpUmFycU1Zcm4wTkhSZ1k4Ly9oZ2RIUjFvYjIvUCtuOUhSd2RlZWVVVmpCczNUckdldlh2M1NwN3plcjA0NXBoalJNODk4Y1FUdWhGRENwczNiMFpyYTZ0c3Y1WElXUXlOalkyZ2xLYkpvN201R1dQR2pNbTZadHUyYlVna3BCZHBXTGh3b2VLczU2VkxsK0toaHg3Q2tTUGlHMXR1M2JvVjRYQlk4NUlzNVFMUDg4YjBIQ2hGdU5KOTBBcENlTVBGSE82Ly8zN2NmLy85dXRVWGpVWngzWFhYb2I2K0h2UG16ZE90M25KRGFZWnJadEJaRGtvVG1zcEZEcmZlZWl0ZWUrMDF5Zk03ZCs1VVJRNGZmZlNSNUxscDA2YkJKckt6WVdkbkorNjU1eDUxSGRXSUxWdTI0S3RmL2Fya2VTVnl6c1JSUngyRk8rKzhFM1BtekFIRE1PanE2c0tERHo2SVVDaVVkKzAvLy9sUDJicSsvT1V2SzdaWFUxT0RLNjY0QW5mZWVhZm9lVUlJZHUvZWpkTk9PMDNkRFpRWmNZNFkxblBvcVhRZnRJSlE0MnhCUVNuRjdiZmZqc2NmZjF6M3Vna2h1T3FxcS9Ec3M4K3FNamhHaEJJNXFEVTZ4WkxEZ1FNSDBON2VualhLVDQzNjYrcnE4S2MvL1VsVlA1UmlLRHQyN01ENTU1OHZldzNQOC9qNDQ0OGx6MCtiTmszMCtFOSs4aFAwOVpVbVJMaDU4MlpaY2xEck9Zd2FOUW9iTjI3TUdxVTNOamJpQnovNEFZaUlIQ3hIRGw2dkYyZWRkWmFxZHVmT25TdDcvc01QUHpRc09iQ0VwTlViUTVFRGhmazhCN25nVmJueGh6LzhvU1RFa0VJNEhNYXR0OTZLUng5OXRHUnRsQkpLMzVYYXRYTWNEZ2ZzZHJ1b2dRR0FnWUVCUFBQTU0zbXpkNy8xclcvaGkxLzhJcTY5OWxyczJiTkh0Q3pETUFpRlFoZ3hZb1JzSHppT1UwekwzYmx6cCtLOXRMUzB5SktaR0RrTURBemdyMy85cTJ5OVRxY1RYL2pDRjdCZ3dRS01IVHNXaEJBTURBeGd3NFlOZVAzMTEyWEw3dHExUy9hOFdoSy8rdXFySmVXYjNObkswV2hVTnYxMjJyUnBxcGZBbURScEVoaUdrZnc5eVhscWxVWTB3UnFUSEVEUlZla3VhQVdsVUdkUlNvenU3bTc4L09jL0wzazcvL3puUC9IMjIyL2o1Sk5QTG5sYmVrTXNwejBUY2thU0VJTERodytuRGI0Y09TUVNDZHgwMDAxNXgzdDZCTWQ0eVpJbGt1UkFLY1cyYmR2d2hTOThRYmF2Qnc0Y2tHdy9oWDM3OXFHbnB3ZjE5ZldTMXlnWktyRmc5TFp0MjhCeDB2Tjd4bzBiaHdjZWVBREhIMzk4M3Jtenpqb0x2L2pGTC9EclgvOWFzbnhYbDd3WlVPTTVlRHdlVFlGZkphTDRJT2NzQUFBZ0FFbEVRVlJWS3prQ1F2L0dqQm1EdHJZMjBmTkdKb2VQT2pxTktTdlpiWXpweUVIMWNMUEV1T3V1dXhSVFZQWEMvZmZmWC9CTTQwcENhZVQzM252dklSUUs1UVY0Zi9TakgrR2xsMTdDd3c4L1hGVDdLZkpac21TSnJISGN1bldySWptb21iTUJDTkxTMldlZkxYbGV6bEI1UEI1TW1EQWg3N2pjc3RVTXcrQ2VlKzRSSllZVXZ2M3RiMlA5K3ZXaXVqOGdlRVdSU0VUU0lLc1p3Wjk4OHNtYVVyQmJXbHBrejZzaGg3Nit2dlRnUVk3QTl1M2JCNTduUldNNWxRVEg4L3cvUC96VW1BdnZOZmc4NnZQUURBSWpNTU9ISDM2SVo1NTVSdlgxTnBzTlU2ZE94Zmp4NDVGSUpCQ1B4N0YzNzE3SkRJdGNiTnUyVFpYMFlRU2tNbFE2T2pvVTB4eWxnb2lSU0VTWFZUVlRtV01ubm5naTZ1cnFFQTZMcTZoYnQyNVZyT3ZUVHo5VjFlYk9uVHNMSm9jcFU2YUlMaGIzeGh0dlNKWTU0NHd6TUdmT0hOaytlVHdlbkhqaWliSWFmMWRYVjFIa29EVnhRb2tjbkU1bk9qTXNjOEcvekppUjJzeEFsbVhSMjl0cnVJd2xsaU9rNzA5cjBpYk5VT1J3emRJTEIvL3grdXVtMnB2WkNEMTk1WlZYVkRrdzgrYk53N0pseTNES0thZmsvVEJqc1JpZWVPSUpyRjI3VnRHSThqeVBOOTU0dy9DYm1aeC8vdm5ZdTNldmJIcWlHc1JpTVYzSUllVTUyR3cybkhiYWFYaisrZWRGcnp0NDhLQmlPcWRhY3RpeFk0ZnNlYVZNcFZ4MGRIUklib29FUUhXNjg4U0pFMlhKb2FlblIzSnVqWnJ2NHFpampsTFZqeFNVOXV2NDA1LytwRHBSUUcxN2hpT0hISjNTVU9RQUFBbkMweHFIM1FnMlZ5VXE3enZJcFRNQ1F2QnR4WW9WK081M3Z5dnB5dGJVMU9DeXl5N0RyRm16Y1BIRkZ5dnEyYSsvL3JxdTVCQ05SdkhXVzI5aHk1WXRXY2FudWJrWnA1eHlDdWJNbVlOQUlLQ3B6cTZ1cnFLSkFSRElvWkRjK2x4a3hqUVdMMTRzU1E2QTRKMWRkTkZGa3VmVnlrb2ZmUEFCQmdZRzRQUDU4czdGWWpFY09IQkFzcXhZdkdIMDZOSFlzMmNQdXJxNjBOYldodGJXVnJTMnRxWS9MMTY4V0ZXL3hvNGRLM3RlTHU2Z2hoeTAvbGFVZnU5Nkl4d080K2lqank1cm0wcGdDWjhWU0RJY09iQWM0V3RNdFA5bXBiMmN6czVPdlAvKys3TFgzSGZmZmZqdi8vNXZWZlhObURFRHk1Y3Z4NW8xYTJTdisvREREMVgzVVFxVVV2ejV6My9Hczg4K2kxMjdka2xPVWt1dGhYL09PZWZnZTkvN25xSmhTVUd2RFZhaTBhaW0zSHE1ZWxJNDdiVFRZTFBaSkRPb3RtN2RLa3NPU21tc0tSQkNzR3ZYTHB4NjZxbDU1ejc1NUJQWkRDNnBORmFHWWREVTFJU21waWJNbkRsVFZUOHk4ZFpiYjhuT1JBWWdteWFyaHFqOWZyK21QcFU3NjFCS1Vxd2tPRUt5eU1GWUVSRUFDVUtNa3h1cUFyWUtDMHM3ZHV5UWxaVG16NSt2bWhoU3VQcnFxMFZIbXBsb2FXa3BLaGEvYjk4K0xGMjZGQ3RYcnNUMjdkc1ZaeThUUXZEaWl5L2lyTFBPd2k5LytVdFZMN01lQmgwb2plY3dZc1FJbkhEQ0NaTFhidDI2VmZMNWRuVjFhVW8ra0pLVzVDUWxsOHVGeVpNbnEyNURDWVFRYk5xMENlZWZmejYrOXJXdjRaMTMzcEc5WG01bFd6WGZxMWJQUVM3N3FoUXdJam13aEdTOWhJYnpIRGllNXdDWVpxVTNXNFhaSVpVZUtZWFRUejlkYzUxT3B4UHo1OCtYWFV3dEZvdmg4T0hER0RWcWxLYTZlWjdIZ3c4K2lEVnIxaFFrK2NUamNmenFWNy9DWjU5OWh2dnV1MDkyZDYxS2VnNU9weFBOemMwWVBYbzBSbzBhaFZHalJ1V3Q1Yk40OFdMSmpZZTZ1N3V4ZCs5ZUhIZmNjWG5uMU1ZYlV0aStmYnZvOFVLQzBWb3hPRGlJRFJzMjRIZS8rNTNpTXQ2WmlNZWx0NU12aGVlZzkxYS9OcHNOalkyTjZlOS85T2pSNlgralJvM0NzY2NlcTJ0N2VvQWpmTllMYVRoeXlOVzlqQTU3aFRlUVZocUI1SzRmb3hhTEZpM0tJNGN4WThaZzh1VEpPUGJZWTNIc3NjZHFIcDBCd3N4YVBkSmdOMjNhaE1IQlFmejYxNytXWEU2NlZKNkR6V2FEdytHUUpiZWYvZXhuaXNIWkpVdVd5QzV6c25YclZsRnlVQnR2U0dIMzd0MWdXVFl2dFZOdVRTVXBTVWt0dXJ1N3NXN2RPanp4eEJPS3dWNHh5SGtPU3BNUUFXaE9FOVh5bmpBTWcvcjYraXhqbjJ2OFI0MGFCWWZKdGcvbWVON29uZ010UG9KWVJ0Z1pXMFhKUVVsZU9IVG9VRUgxbm43NjZkaS9mejhtVDU2TXlaTW5ZOUtrU1lwU2t4TFdyVnVuNi95STExNTdEYXRYcjViY0RsSXJPVEFNZzhiR3h2VExudnIvZ2dVTE1HN2NPRHo1NUpNWVBYbzBtcHViOGRPZi9sVDJYdFNzcjNUQ0NTZWdvYUZCTWp0czY5YXRvbHRMYXZVYzR2RTRkdS9lblRkeFVjNXprRnFKVlFuaGNCZ1BQZlFRSG4vODhhTFdtSkx6SEFEQmU1Q0xTMmlWaWFRV0YweGgyclJwV0xWcVZmcjdWOXJmd296Z0NKLzEwQTFJRHJ5NXlLSENpVlZLTCtDV0xWdndqVzk4UTNPOVk4YU13YXBWcXdyc1ZUNWVmdmxsckY2OVdyZjZVbmo4OGNleFpNa1MwU3laWEZuSjQvSElQcSt6empwTE5oQ2ZhVnoxV0h5UFlSZ3NXclFJeno3N3JPajU3ZHUzZ3hDU0orOUlrWVBmNzBkL3YvaG1panQyN01qcWZ5Z1VrcDNYb3RWemlFUWllT1NSUi9EWVk0L3Bzb3VhRWpsNFBCNWR5VUVwYzJoZ1lFQnh6U1N6ZytPenljRndBZW5jRGhvZFRsdGxQUWVsalZIKzhZOS9ZTk9tVFdYcWpUamEydHB3d3cwM2xDd2o1T2FiYnhhVjF5Ni8vSEw4NFE5L3dOLy8vbmU4OTk1NytQM3ZmeTliajVhUnJwSlhvdFpBTGxteVJQTGN3TUNBYUV4Q1NsWTY1NXh6SkpjSXlWMW5TYzVyY0RnY29uS1dHS0xSS0g3NXkxOWk4ZUxGZVBEQkIzWGJYbE1OT2NoQkt6bU1HemRPTnNiUzB0S2kyQ2V6dy9DZUErR3BxVGJnZGRvcnk2OXFBc0kzM0hBRHRtelpnbXV2dlZaekFGa1BQUExJSTZwZnJKUzBvM2EyTmdBY09YSUU2OWF0dy9YWFg1OTFmTWFNR1ZsLzY3a1BnMTdMZHA5NjZxbXkrdm1XTFZ1eU5pQ0t4K09TbXhaTm1USUZyYTJ0ZVBQTk4vUE92ZjMyMjFsTE5zaVJ3K1RKazFVdFBSR0x4WERGRlZkSUJyekZZTFBaY09hWlorS0xYL3dpcnI3NmF0bTY1YUFVbEZiS2ZzdUYzVzdIK1BIanNYLy9mdEh6aEJCOCt1bW5tRHAxcXFyNmJybmxGc1JpTVRRM042TzV1VGtkaDJodWJzYklrU01OR1k4Z1BKLzFvelZjRDNNN2FIUTRLcncraXBxWm9JUVEvUG5QZjhienp6K1BDeTY0QUlzWEw4YmN1WE1MQ2loclJVOVBELzc4NXo4clh0ZmMzSXdMTDd3UUYxMTBFY2FORzRmKy9uN3MyN2NQNjlhdFUrWDVyRisvSHN1WEw1YzEybnJ1NEtZWE9kVFYxV0hHakJtU3FaMWJ0MjdGaWhVcjBuL3YzNzlmMGdPYk9IRWkrdnI2Uk1taHI2OFBIMzMwVWRxNGFaMFpuUXRDQ0pZdlg2NmFHRHdlRHk2NjZDSmNkdGxsR0Q5K3ZPSnkzMHFEQ1NXaUx5UTE5WmhqanBFa0IwQWdXRFhrME52Ymk2ZWZmbHJ5ZTNJNEhIanp6VGNOTjBPYThFYjNIQ2pWeHk4dEk3UnN5YWczWnMyYUJhL1hxOHFkajhmaitPTWYvNGcvL3ZHUHNOdnRtRDU5T3ViUG40LzU4K2RqMXF4WnVxVitabUxkdW5XS284QUpFeVpndzRZTldTK0wzKy9IakJrejhJdGYvQUlUSmt4UTNMd29IQTdqNmFlZnh0ZS8vblhKYS9UY3BFZlB1cFlzV1NKSkR1KysreTZpMFdpNlBibGc5SVFKRTJSWG50MnhZNGNxY2xBVGpIN3l5U2V4ZWZObXhldmNiamN1dSt3eVhIbmxsVmxySlNtTm5JdjFIQXFaOGF3VWQzajQ0WWZ4MWE5K1ZkR3JldlBOTjJVbDFEbHo1aGlPR0lEOGdibmhZZzZFNTAxSERuRzJjdG0zTHBlcm9JMURDQ0g0OTcvL2piVnIxK0xTU3kvRlNTZWRoSXN1dWdqMzNuc3YzbmpqRFF3TURCVGR0NEdCQWZ6aEQzK1F2YWErdmg2UFB2cW83TXR5elRYWDRQdmYvNzVpZXhzM2JwUTliMlJ5a0FMTHNsbVQyS1RpRFI2UEIyUEdqTUhNbVRNbENTSlZENlZVTm8xVmlSeWkwU2grOWF0ZnlWNWpzOW53bGE5OEJhKysraXB1dlBIR3ZFWDBsR1NmWWowSHJiSVNvRHducUsydERSczJiRkNzNTdlLy9hM3NlYU51dDh2bDJGNERrZ01WVDdjd01HSXNXOUVGbHZSWTQ0ampPT3phdFF0cjE2N0Y1WmRmamxtelptSEZpaFdLQzdmSlljdVdMWXJ5d1pvMWF6QisvSGpGdWk2OTlGTEY0UHY3Nzc4djI1NlNRZGNTVE5VemZqRjE2bFEwTlRWSm5zOWNwVlhLY3pqbW1HUEFNQXhjTHBma2toYXBvTFRjQmo5MnUxMHhHTDF4NDBiWm1OQzRjZVB3L1BQUDQrNjc3NWFNY1JWTERrcWVReUVUTEJjdVhLaVkwdnJyWC85YWxsaGZmUEZGMlUyVzdIYTc3Q3E1bFFUaHFiSEpnYWUwTkhzUGxoRHhoUFpSaXA3NC9PYy9YL1NrcFZ3UVF2Q1h2L3dGUzVjdXhYbm5uU2VaYmlrSEpUMzYrT09QVjF6ZU9RV1h5NFVycnJoQzlocENpQ3laT1J3T1dUbERTY3JJaEo3eEM0WmhaQmVzVTBNT21TdVlTaTFYZmVUSUVSdzRjRUJXVXBvMGFaSWk4U250NVBiREgvNFFVNlpNa2IxR3lYaExwZVNtb05SSExkOWxDZ3pENEd0Zis1cnNOVWVPSE1HRkYxNll0eE1lcFJSUFB2a2ticmpoQnRueWMrZk9SVU5EZythK2xRTzgwVDBIVTVKREFTNnNubUFZQmpmZWVHUEo2di9vbzQ5dzQ0MDM0b1liYnRCazlKVElRV2wvNDF3c1hicFVVYXZkdG0yYjdIazU3eUVXaTZsT3Q5VXJsVFVGT1ducGd3OCtTRytNSTBVT21adnl5TzFsc0dQSGpxS0MwWWxFUWpUZ25jSnh4eDJILy9xdi81S3RBMUQySElyZERhN1FsTm9MTDd4UWxZZDU5ZFZYNC9UVFQ4YzN2dkVOWEgvOTlWaTRjQ0ZXclZxbEdBaFhJcDlLZ3N0UmJReElEaWpQZG1ZNklzR1ZkN2xmTVN4YXRFaDBOcTJlZU82NTUzRGhoUmRLYm4rWWlkN2VYdG1WVzIwMm0rWUZBYjFlTDA0NTVSVFphejc1NUJQWjgwb3Z2dHFVVzZWNnRJNWNGeTVjS0psblR5bkZtMisraVVPSERra2F2VXh5bURsenB1UU0zcDA3ZHhZVmpONi9mNy9zQUdIU3BFbXk1Vk00ZlBpdzdQbWVuaDVab3RZejVwT0pRQ0NnU3FhbGxLS2xwUVdiTjIvR0N5KzhJTHZIUlFybm5ITU96am5ubklMNlZRN2t4bnNOU0E1VSswSXNGUVpIakxFYzFNMDMzNHo1OCtlWHRJMlBQdm9JSzFhc1VCd2g3ZHk1VS9ibG5qVnJsbUlNUVF4S0dTVktSa2V2dUlPZThRdEFNRXFaOHhseXNYWHJWdGxNcFV4WnllMTI1ODN4U0dINzl1MUZyYW1rbEtpZ2RuZEFKV21LRUNLN2JsaXB5QUVBbGkxYnB2c1dudlgxOWJqOTl0dDFyVk52OER4dmJNK0JVaXErc2F5QndSckFjd0NFWU5jamp6eUNLNis4VXBjVk5hV3dlL2R1L1B6blA1ZTlSbW5EOWtLSUFWQmVBMGRwQktkWHJLQVV4a2xPV3RxeVpZc2tPVEFNay9kY3BEeXNnd2NQU3U0RlliUFpaUGQrQnBUSjRlT1BQNVk5RHdqeEJEVXhMRGxwU2MrWVR5Nk9PKzQ0eGRpQlZ0eCsrKzJvcjYvWHRVNjl3ZkY4bHFSdk9ISUFZRHB5NE1xOGk1UWMzRzQzdnYvOTcyUERoZzJTMnl6cWdZY2ZmbGcySzBNcG9CZ01CZ3RxVjhsekNJZkRzdEtRWGxsR3BTQUh1YUQwd1lNSEpmZHVIak5tVEY1LzVPSU9VaDdkNXo3M09jWDdVcHJQODk1Nzc2WGpJMUw0NlU5L3F1amhBZkxrb0dlMm1CaSsvZTF2NjVJRnlEQU1WcXhZWVdnNUtZWGNlSy9oeU1HTW5nTm53UDJKWnN5WWdSZGVlQUUzM1hTVDRtaXdFUEE4TDd0V2tSSTVGRG83VzgzV2luS2pXNzFHbkhvSHBBRmgrWXZtNW1iSjgxSlNUR2E4SVlXWk0yZXFXZ0lqRTJvbXZ5bWx1UTRPRHVLdXUrNFNQVWNJd1IxMzNLRnFyZ0JRT2M4aGhkV3JWNnNLcmt1aG9hRUI2OWF0dzdYWFhsdDBYOG9Cd2h1Y0hPdzJtL3p1OWdZRW9jWWpCMEJJLy96MnQ3K041NTkvSHYvNjE3OXc2NjIzNHRSVFQ5VnRYWmRYWDMxVmNsNUJxY2hCelVZdmN2ZW4xNGpUWnJQSkx0c2NpOFVLbXFVcjV6MUlqZmpGeUtHbXBrYnpGcDVxeUtHeHNWRjJUZ1lBUFBYVVUxaTFhbFg2V2ZJOGp4MDdkdUNLSzY3UXRHUjdKVDBIUUhoL0hucm9JZHgxMTEyYVBkMTU4K2JoaFJkZUVOMmUxYWpnQ01tSzl4cHUrUXkzd3k2ZncyWkE4RHhQZ1FydkY2cUEwYU5IWTlteVpWaTJiQm42K3Zxd2RldFc3Tml4QTl1M2I4ZUhIMzVZMElxcDhYZ2NMNy84c3VoZXgwcmtvSFducmhTVUp0VUJrQjB4NjVrQzZmVjZKZlAxS2FYbzYrdlR2RXpDa2lWTFZJK3NVeEFqQjBBd1VGb21NYXFkS3pObHloVEZoUkdmZlBKSlBQLzg4eGcxYWhRR0JnWlVaZlBrNHMwMzM4VGxsMTh1ZXE0Y25rTUtGMXh3QVJZdFdvU05HemZpalRmZXdEdnZ2Sk9Ya09GeXVUQjM3bHdzV3JRSXA1MTJtaUYzZWxNQ3gvTlptYUtHSTRmSlRTTk1SdzZvNlB4bzdRZ0VBamo3N0xQVE16WDcrL3Z4OXR0dnA4bmkzWGZmVlUwV1V1U2dGQkJYeW1PWFFySGtvR2NLcXQvdmw4Mm9pVVFpbXNsaDRjS0ZjRGdjbWhhT2s0b3RhZGwvZ0dFWTFmTGp0R25UOEs5Ly9Vdnh1bWcwS2huOEJvVDRtTVBoa0pRQnQyelprcld1VkNiSzRUbGtZdVRJa1ZpK2ZEbVdMMStPd2NGQkhEaHdBSVNROUh0eTdMSEhsbVJ0c25JaXdXVjdEb2FUbGM0LzkreG9NUnZYVndMVWJCM09nZC92eCtMRmkzSGpqVGRpdzRZTmVPV1ZWMFFOdmhpa1ZyRlUyblpSYnZWTE9TaVJnOHZsa3BXVjlFeEJWVXJiTEdSN1RKL1BoOW16WjJzcUkrVTV6Sm8xUzNYYzRlaWpqMWJ0elgzOTYxOVhKZThwNGNjLy9ySHN1bUR4ZUJ6Ly9PYy9SYytWMDNNUWEzdnExS21ZUG4wNlRqenhSSng0NG9tbUp3WUFhQS8xR3BzY0FDQkJlTE1aVzdQMVZ4YkhISE1NVnE5ZWpUdnV1RU14TzZXOXZWM1V5eGc3ZHF4c09ia1JwUnlVeUVIS1VLYWdwK2VnNUJVb2JlRXFCYm1VMWx6NC9YN0p0T0NhbWhySitRNjUwTEw4eXFoUm8zRGRkZGVwdmw0TWwxNTZLYjc4NVM4cjN1c3JyN3dpZWp6emUvUjRQSmd3WVFJV0xGaUFyM3psSzdqcXFxdXdkT25Tb3ZvMzNFQXBwWC9lL205ankwb0F3QkxDdXgwbFROVFhHWVlPTmhTQnBVdVg0cW1ubmhMZGpTd0ZsbVhSMmRtWnQ4Q2FFamtjT0hDZ29ENjF0cmJLbmxlYW9hdW41NkNVdDM3Z3dJRzhnR1E0SEZZa2xTVkxsdURPTys5VTFRZWxkT1c1YytmS3BoeW5vSFhQNkVzdnZSVFBQUE1NUHZqZ0EwM2xBT0RpaXkvR3lwVXJBUWdyb2Rwc05ra1pjK3ZXcmFKYnBZNGRPeGFiTm0zQzZOR2o4MVo4dGFBZENVTDQvaWNmeUJya0dwSWNFb1RuQVppSEhLcVZIU0RzcXl4SERvQmdzSFBKUVVsV0dod2NSR2RucCtiSmNDKzk5SkxzZVNWeTBGT09VSktWMXF4Wmc5bXpaMlBpeEluNHkxLytnc2NlZXd4TlRVMTQ4TUVIWmN0Tm1qUUpZOGVPVmJWTXllYys5em5aOC9QbXpjTUREenlnV0kvV2hSdnRkanZ1dmZkZXJGaXhRbmJtZGlZWWhzSC8vZC8vNFR2ZitVNzZXSDE5UFM2NjZDSkVvMUdNR2pVS28wZVB6dm9uUmNCdXQxdHhjVDhMNnNHS1ROWXlKRG13aE9jQWFFdlNyaUNNeEEzdDdlM1l2bjA3M25yckxiei8vdnZZdUhGalVhbXJaNTU1SnU2NTV4N1phOFFDaWtya0FBQXZ2UENDNGtxcm1XaHZiMWNjQlN1TmdQVU1aQ3A1QUoyZG5UanZ2UFBnZERyVEM4MnAzV1p5OGVMRitPTWYvNmg0blpMbk1HdldMRlVCN2tKVzlUM3V1T1B3d2dzdjRCZS8rQVYrKzl2ZnlxYnVMbGl3QURmZGRCTk9PT0dFdkhNLytjbFBOTGR0UVY4a2JXNFdERWtPSEovZlVTUERWcWx0NENCSUY5dTNiMC8veXgxdHZ2UE9PNXF5Vm5JeGR1eFlNQXdEdVppN1dBNjR4K1BCdUhIalpHV2dSeDk5Rk11V0xaT2RMNUNKVFpzMnlmYkQ3L2Rqd1lJRnNuV1UwM05JSVhNRlVpVlpMSVVsUzVhb0lnYzFNWllUVHp4UmNxYzVRTmgvb1ZCcEpqVWovOXh6ejhYZi92WTNkSFYxb2J1N0cwZU9IRUVnRUVpbmQ2cU5mVmlvREZpU3YwQ2NVY2xCKzA0ZEZZUzlRdHpRMnRxS004NDRRL2FhTjk1NG95aHlhR2xwa1RYSWdQU0V0alBQUEJQcjFxMlRMTmZaMlltTkd6Zmlra3N1VWV4SEpCSlJOSlpubkhHR0l0SG82VGtveFZYRTBOZlhoOTdlWHNWSlZmUG56NGZMNVZMYzkwRE5FaW56NXMyVEpRZXQ4UVl4cExKMkxKZ1RMQ0Y1YTZnYk1sdkpkT1JncXd3N3FCbnhTYVVDcW9XYWxGTXBRNmRtUFptMWE5Y3F6bm5nT0E1WFhYV1Y0cWhiemZhTGVub084K2ZQTHlpbFUwMHN3ZVB4S0pLNjNXNVh0WnhJNWpwTHRiVzFtREpsQ3BZc1dZS2xTNWZpK3V1dng1VlhYcW5jYVF0VkRZN3dlZVJnU00rQkVLcHVVWDJEd0s3ejhyNWFNSFhxVk5uTlZ6Nzg4RU8wdDdlcmlnR0lRV24xVElaaEpNa2h0U3kzM096WTF0WldmUG5MWDhaRER6MGtxc2RUU3JGcTFTclpld1FFb2xTVEFxcW41K0IydTdGa3lSTEZJSGt1V2x0YlZjVWVGaTllak0yYk4wdWVIejkrdktwNURQUG16Y01ycjd5QzBhTkhWMFUrdmdYOXdmSDU1R0JNejRIeTJ2ZjRxeUFxNVRrQXlvRkVTaWx1dSsyMmd1cmV0V3NYWG43NVpkbHJUampoQkVtRHl6Q01xdjF5T3pvNmNQSEZGK1BSUngvRjl1M2IwZFBUZ3lOSGptRHQyclU0NDR3ejhQVFRUeXZXY2YzMTE2c0t2T3M5ZWFxUTFUYlZ4aDB5MTFseXU5MDQrdWlqY2NvcHA2UnorVysrK1daVjlUaWRUa3lZTU1FaUJndVM0QWpKRzVBYjAzUGdhZW1tTjVZQVRwdXRZdVJ3OHNrbjQ5RkhINVc5NXJYWFhzTnp6ejJuYVFuaXdjRkIzSEhISFlyWEthMWFlY0VGRjJEOSt2V0t5M0ZFbzFHc1hyMDYvYmRTRUR3VFU2Wk13UmUvK0VWVjErcTk3TUxwcDUrT280OCtXdE84RFRWTGdBQkNzRG0xUHBIUjl3S3dZRzV3SkYvS042VG5rTHRkbmRIaHRGZnVNUzVhdEVqVmlQQ09PKzVRblk5KzRNQUJYSERCQmRpOWU3Zml0VXJrTUgzNmRQenYvLzZ2cW5Zem9aWVliRFliVnExYXBYcm5McjA5QjQvSGcwY2VlUVJISFhXVTRyV1RKazNDbWpWcmNNMDExNml1Ly9qamo3ZUl3VUxKUWZoOHRjYVE1TUJUYWlweWNGUXc1dUR4ZUdTWGVVNGhIQTdqdlBQT3c3MzMzaXRwQU52YTJyQisvWHA4NVN0ZlViV2pWM056czZyRjJtNjQ0UWFNSHo5ZThicENjTjExMTJuYUdsWHY3VDBCWVNMYXl5Ky9qSlVyVjJMMjdObnAyYncxTlRXWU0yY09saTlmamtjZmZSUXZ2ZlNTS3BuTmdvVnlneE1oQjZQS1N2THJQUnNRaE9jckZwZys5OXh6RldNRGdKQnZ2M2J0V216Y3VCSFRwMDlIWFYwZDZ1cnFrRWdrRlBjb0ZzUFh2dlkxVmRkNVBCNnNYcjBheTVZdFUrMFJxTUdaWjU2Wk5kdFdiVi9rb0dWdHBVeTRYQzVjZnZubGtrdE1XN0JnQk1RNWpuVDNEY1E3ZS90amh5UDlzWTV3YjZ3OUZJbTFkSWRmdmVpTTdFR21JY21oUDhFcTd5Rm9NTVFTTEh3MTdvcTBmZmJaWnl0T09NdEVaMmNuWG52dHRhTGFIRGR1bktiWnphZWNjZ3ErOTczdjRaNTc3aWxvNzRoY0xGeTRFUGZlZTYvaXdvQzVjTHZkc05sc0NBYUQ2U1VheG93WmsvNWNLZy9IZ29WeVlEQ2U0STcwRGNRNmUvdmloeU45c1k1d2I3eXRKeEp0NlFuSEQzU0ZZMGQ2KzFOWlNibWp0RHpqWVVoeStQMk85MS9kM3hOWi92V1RqNitvbnE4RjhRcVNnOFBod0hYWFhZY2JiN3l4YkcydVhMa1NicmUyKzczeXlpc3hkZXBVWEgvOTlZcjdETXZocTEvOUttNi8vWGJGUFNPa3NIdjNic1hBdEFVTFJrUmtNTVllNmV1UGRVYjY0NGNpZmJIMlVDVGVIb3JFQk9QZkU0c014c1JXbDhnZ0FpYnpReVpCbUNOYkNjRGdHL3RhY2FDbkYxZWRlaEthL01aUHdZdXpiRVYzZy92U2w3NkVoeDU2Q0h2MzdpMTVXd3NYTHNSWlo1MVZVTmxUVHowVnp6MzNIRmFzV0tHNG9GOHVSbzBhaFd1dXVRWVhYM3h4UVcybllCR0RCU09DcDVTR0JnWVRSM3I3NDRjai9mR09jRys4SXh5SnRmWkU0aTNkNGRpQnJsQThtbUF6M2U2MGNjOXdvSE9OZnM0eFNUTmxHbklZQUlBRG9WNzg2SzliY2VYOEV6RmpqUHkrdFpWR2pNMmJRMUpXMkd3MjNIZmZmYmo0NG90THV0SEpqQmt6OE10Zi9yS29Pc2FNR1lPbm5ub0tPM2Z1eEhQUFBZZS8vT1V2c2h2alRKbzBDY3VXTGNQRkYxK3Nldk1hQ3hhTUJvN3d0THQvSU43WjJ4OC9GTzZOSDRyMHhkdERrWGhiVHlSK3NEc1VQOWdkaW5QQ1hqWVNnVGxHMHVoVHFyZzZ0QUpwNUpNRFk4Uk56Q1lzdjJVMmdQVG10d3lBLzU0MkVWOCtZWkptamJsY0dJQ05IamR1VE1VNzkrS0xMK0xhYTY4dFNkMExGaXpBMnJWcmRka0ZMQk9wZ1BpUkkwY3dNRENBYURRS2xtVXhkZXBVeko0OVcvVUNkeFlzVkJKeGx1Tzcrb1JSLytGSWI3d2ozQnR2RDBVU3JUMlIrSUVqb1hoSHVEZk9VekdGUjVRTVJJN2xrVVBXdFRtbVVhRk9KdmY0UGYwYkhzeWE2bTlvenlFRkN1Q0Y5L2RoWDNjWTMxa3dBMzYzdWxVOHl3bU9rMTZ1dUp3NDc3enowTm5aaVR2dnZGTjJDZVZDNnIzbm5udFVyNkNxQlM2WFM5UHVaeFlzVkFJRDhRVHA3TzJQZDBiNjRvY2l2WW1PVUcrOExSUkp0SFNIWXdlN1F2RWpmZjFjenVnd3gwQXoyYU4zZVNGYVpLUlBHUm1DeVBVZXRNcExwcEdWUkpQTi8zT29HN2UrdkJWWG5Ub1RFeHEwYmR4ZWFyQ2srQXdjdlhEWlpaZGgrdlRwdVBiYWEyWFhOVktEeFlzWDQrcXJyOFpKSjUya1UrOHNXREFtSW9OUnRyTzNQM0U0MHBjNEZPNk5kNFI2NDYwOTRVUkxkemgrb0N1VTZJM0doTkVXSXowcVZ4RjRGQ01JTVVNdUFWR0MwRU5lTWcwNTVPOGVrMFRQWUF5ci83NGRsOHlhZ2pPT1ZaNlZXaTZJYktSVVVjeVpNd2ViTm0zQyt2WHJzV0hEQm5SMGRLZ3VPMkxFQ015ZlB4L2YrdGEzZEZuTzJZS0ZTb09ubFBiMEQ3S2R2WDBwNDU5bzY0bkUyM29paVpidVVPSmdkeWdSVGJCaUx6RlZtV2VpcE9sRGdUcFVsQysyL2R6aldmMHhUY3pCQXdudklST25IRDBhMzVnN0hXNUg1WGNVYmV1UDBYbFRKbFU4NWlBR1FnZzJiOTZNOTk1N0Q1OTg4Z2srK2VRVFJLTlJPSjFPdUZ3dStIdytUSjA2RlRObnpzVE1tVE5WTFFWaHdZS1J3QkdlZHZVSm8vN0RrYjVFZXlpU2FBLzFKdHFTSS8rVzdoREw4WHltc1ZPcDg2ZU81N3phTXQ2RGNGcXVYaWIvR0tQVWZpNTBqejljMDcvaHdhejFjZ3hKRGdBd1lma3RCQ3FXOXhoYjY4ZlZwNTZFVVVGZkdYb2xqWU85ZzNUQjhaTU5TUTRXTEpnZGNZN2pPeVA5aWNPUlh2WlF1RGZSRWVwTnRJVWlpZGFlY09KZ1Z5aHhLTnpMSm9POVdRYU55VFhFbW94bTdyR0NDVUtNSFBLUDYwTVFZdW10VXZWbUVzUzMremM4K0ZIbVNhUEtTZ0FRQmFCbzhkc2kvZmpSSzl0d3hid1RNSHQ4Y3htNkpRNnF3NnhmQ3hhR0t3YmlDWEk0MHNzZURndVNUM3U0bDIwZmtuellycjRCc1Z4eEdja2tkUUVGa3hrSVZnNEtsRUhlU1hmQ1NQRUgwOFFjQUNIdW9Nb2RpTEVjMW16ZWhiT25ISU9MWng2SFNteXZRRlgvZGl4WUdINElEMFM1dzcxOTdPRndiNklqM010MmhDSnNhM2M0UGZMdmpjWkVKM2NCVE1xWWwxT1RseWhQYVk0L3dFaDREd3lFaXpPdk5tcjhJZFVmMDVHREp2ejF3LzM0ckR1Qzd5eWNpVHBQbVpleW9Hb1NGU3hZcUQ1UVN0SFZOOEFlanZTeGg4TzliRWU0bDIwTFJSSnRQV0cycFR2TXRuU0gyR2lDNVJuMWtrbDJ5aVZsNU40c1JVT1k5QjZ5VzFPZDhwbDdYRFZCaURRbFNoQkdTVyt0Ym5JQWdMMUhRcmp0NWEzNHpzSVpPRzVrV2RmQnQxd0hDMVVKanZEMFNHOGZkempTeHg0Szl5YmFReEcyclNmQ3BveC9hMCtJVGM3c3pRYVRiYlNTZHFxdzBhOW15VVdUdktSeHBKMWp3Y1VKWWtqZWdlS28wUWp5a3FuSW9lQTlIU0t4T081K2JRY3VtamtaNTB6NW5KNTlrb1RsTWxnd0srSXNSdzlIK3RqREVVSHVhUS8xc2tlMFRaOEFBQ0FBU1VSQlZPMmhDTmZhSFU0YzdBNnhoOE85SEU5ejdYeGhrQ0FJSmNrREdXOVlBU21icVZvTUhYK29VUHRwbUlvY0N2SWNVdUFweFpPN1BzSW5YV0ZjTWU4RWVKeWx2VldHa1hidExGaW9KUHBqY1Q0NTZ1Y0U0eStNL0Z1N1ExeExkNGp0N2h0STVmZlRvVGhwR29VYklrcVpYTzlCVTNscGVjbE04WWZrYVVQTFM2Ui93OXE4MVZ5cmxoeFNlTHZsTUZyRGZWaXhhQmJHMXZyMXFGSVVES013QnJGZ29VUUlEMFRKb1hDRU95VG8vVng3VDRSdDdRbHpyWUxlejZWbjltYURpdjVnS1pJMnBxQ1J1a2g5K1FRaEl5OXBJUWd4bERQK2tGZllaUEtTYktZU01BeklBUUFPOXczaTlyOXV3emZtVHNQOFk4Ym9WVzBXN0FaZEVOQ0N1U0VFZS91NVErRSs3bEE0d3JXSGVybTJuakRiMWgzbVdudkNiR3QzaUlzS3k4V25pNmdVT1JtYVR4RFpobGkrSHZXR1ZCdEJLTGRWMnZpRGN2dlN4NG9vcjVlOFZGRDh3WFRrb09zKzBnbEM4TkMyM2ZpNEs0ei9iOVlVM2ZkOXRzakJRaUhnQ0tHZHZmMGtLZmx3N1QwUnJqMlVHdm1IdUxhZU1KRlp4bm5vV05hSWtPWVNoS1FoRXpGSlROSjZacDVWcGVrcnRTWFNkam5qRDJJd2s3eFV5bnMxSFRubzVqbGs0aDhmSDhTQm5naStlK3BKYVBEcXQrbUxyUktUS3l3WUhuR1dvNGZDdmR5aGNDOXBEMFhZOXA0d2FRdEZ1TFp1d2ZnZml2UnkyYXNVcEsxeUx1U05RNTZWenpzZ1dWNmVJR1RMUzZHYzhZY0N5aHRLWGpKQy9NRWloeFErN1k3Z3RwZTM0dHNMVHNUMFVZMjYxS20zSjJMQkhPaVB4ZmxENFY3U0VZb0lJLzlRaExRSmVqL1gwaDNpdXZzR0pDWjNwY0dBeVpSM1JJeEQ1clhxQ0NKNVREMUJpTjVjWmVNUFlqQ3d2R1RxK0lORkRwbm9qeWZ3czlmZnh2blRKK0dMMHllcVUybGw0TEE4aDZwRWFHQ1E3d2hGdUVPaFh0SWVpcEQyVUpocjY0bHdyZDBoMHRJZEluM0N6TjdrUzVqM0UxQ3B5WU9oNmdsQ0RFVkxEbVdMUDRqQVVQS1N2SXlqYjF1U3gvU0tQNmd1YnpweTBEWG1JQVpLS1o1NTcyUHM2dzdqVy9OUGhNOVYrQmFVVHB2TklnZVRnYWNVWGIzOXBDTWNJUjBwNDk4VDV0cTZ3NlMxTzBSYWU4SmNMTUdLdlhScUpSZE5MN0tvdktQVkVPVEpJM3JGSDFTMnI5Ulg0OHBMWm9vL1NMUmZzTHlVRUR0dlpISW9xZWVRaWQzdFIzRGJ5MXR4MWFrbjRaajZZRUYxT08yVlh6YmNRalpZUW1obnBJL3ZDRVZJUnloQzJrTVIwdFlkRm1TZm5oQnA3NGtRTm1zZkR1RkZVc0h5RWtZenp4QkxsODh6bXJtR3BJalJZeEh4QjlIV0RDMHZwUW1pWUlJMlVQeEJET1dRbDJKaUpTMXlTS0pySUlxZi9PMU5mSDMyVkN5ZU9GNXplYnZsT0pRZE1aYWxoMEs5cENNVTRaT2pmdEtXL05mYUhTYUh3NzE4MWpMTzJWK1J5TXNsdkVqeUk3cWNHcFFKUW9QUnRPUWxEZkpTa1VhemxQRUg3ZTJMSHl1YnZHUTZXYW1zNUFBQUhNL2pkOXZmeHlkZFlTeWJmVHhjR3IwQmx1UGdkQmo1a1pvTGZkRTRQUlNPa0k1UWhHL3JDYWVNUDkvV0V5WXRYU0crcHo4MXN6ZHZtSndMNFVWUUhoRm1WYUpBRU9wSGo1YThwRnBlMGtnUVlqMHVnOUZXS204YWVZa0JRQ20xeUVFMU5uL2FoZ005dmJoNjBVa1k2ZmVxTGhlTkp5eHkwSUJRL3lEZkhncno3VDNwa1QvZjFoUG1XN3REcExVN1RQcWlNVUhtRVY0RW1kR2pvbkVZZ2lKQkRMMUlxbHgrM1kxbTFjcExxZ2xDQWdwdHBlV2xBc3RYbGJ5a2hTQUFFM29PSlE5SXk2RWwzSWNmL1hVYnZubktDVGhwN0VoVlpXSXNpOElpRnRVSG5sSWNFZlIrdmowVTRkdDd3bng3VDVpMENzYWZiK3NKODhsZ2IvSUhtL2RxREwyMHduQlN2OUdqNHBzb3I5UEtONTI2dGtybHBlSUlJaDlWbmQ2cXZYM3hZK2xPRkhtdmtyOXIwNUZEeFR5SEZBWVRMSDcxeGp2NHd2RVQ4SlVUajFYY1JDak81cTFkVmJWZ0NjSGhjQy9mM2hNUkNDREQ2TGQxaC9tT2NHNndONDBTdmtpS2I3TG1GOW5FOHBLRWxLYWF0TXdVZnhncVpVNTVTWkIzb0NndmxhcXZGamtVQWdyZ3hmOThpays3STFpK1lBYUNOUzdKYXhNc3A4STdOQWRpQ1paMmhDSTBKZnUwOVlSb1cwK1liKzhPazlhZU1PMU1CM3ZUdDV2LzQ1VFJXZk91VlRCYUNtdlNhMzg1ekNzdjZYQ3Y1b2cvcUM1dlhIbEpDMEdJTkNWS0VHTGVneFRVeWtzV09SU0REdzUzNDdhWHQrSzdwODdFcE1ZNjBXc1NuSGs4aDc1b2pMYUhJclJER09uVHRwQXc0bS9yQ2RQVzdoRGYweitRK2dIbC9aQ1ovQitzZUNNS09xdFlBUlVFVWEzeWtpaEJpTWhMVXAzVmVLL0ZlVFhEWEY0cXpvTTBYbnFyNmNpaG9qRUhNWVNpTWR6NTZsdjQ2a2xUY09ia28vUE9zNXlvakZJUjlQUVAwUGFlc0REYTd3a0xuN3ZEZkd0M2lMYjJoR2wvTk1hTC9BUnpSNFNpeUg5cFJVWTA4aWl4eTYrLzVDRS9vcE10cjJta0x0S3djZU1QUS8wcFdmc1NCRkVxZVVrTFFZaWh4TDlyeFU0VTJyNDF6MEVQRUo3aWoyOS9nRStPaEhINXZPbHdPNGJTWFRseGpWMTNKSU85dEMxcDlKTWtRSk9hUDIzdkR2TXhsczBzb242a1huSjVSS204YWVRbDhiYnluNTlvUTFyN0ttSVNkTGpYWVNNdmxjRm9LNVUzdEx4a0xzL2gwN1dyNHhPVzMwSUFHSExxOGZhREhXZ045K0hxUlNkaGROQUhBT0I0ZmNpQkpRU0hRcEVzNDkvYUhhWnRQU0hhMWgybUhhRUk1UWdCa3l0NUNEOE9kWktGWm5raysxb0o3MEg4aHN3bEwya2hDREZZNmEzRkdGSnJjNkIwZVZXL3RYeUMwUEJiUy8rdXpVVU9TUXdBeHMwT2JlL3R4NC8rdWhXWHp6c0JjNDhhQlVKNDVVSUFZZ2tXU2NNUHdmQ0gwcVAvdHU0UU9pTjlmTTZldllESUYwNUJtU3lDMFB6aktFN3lrQ0NJTW8vSUZJeERZUVFoQWl1OU5XbHFKY29yUGtEMTdac3IvcURjdnZTeElzb1hNVURJQW1VQXhwVGtNQWdEa3dNQXhEbUNCN2U4aTMxZHgyRCtoSEVBZ041b0RPMDlZZHJlSFVKcmQ1aTI5NFFnR0g1aDlOL1RONEQwRnl1VDJxYmltQlNLRzlHVVpmU3JWRjYxdktTRklOVDFWZUZlNVYxK3BmTEZqZFJGN2tiN2J5VnY5R3R0RHFTbWZYM0tHM0p6SUZPU2d5SGpEbUo0NWFQOWVPMzl2ZlRRbzAveS9iRTRvR0ZFcU0xb1psOHI0VDJvTGk5eFRLb3VrZlpMSmk5cElRZ3g2R0EwYzYrMTVDWEEyaHdvVmFYOGIwWERBS0h5bXdPSmtvUFJkNmd4RFRrQVFIZi9JSkxFQUNqYWpxenZWK3hhaGZLWnhYTzhmYXF0dkhCdDN1OVlRL3U1MTFMcDhwcnZWYjVmVk5XOVp0VWgzNzZpT2NwVlZoVGF6Nit2cUdjTm1xdHR5VHhyOWZmSzVCNVFWVDYvYjdsMUZQVzdCczEvMXZtL05Wbm84RjVrRnM5NTFzclVKWFAvdWZaWi9sbXBZTWxpN3RVaWgxS0RZWmpjaVE0S0w0ZmlWMTdjeTZXNXZJaHhFRFZ1b2lYVkU0UTRTbnl2K2ovcm5CcDFKVDNaOHRvSVFneEZQMnVScDFtMjM3VUVRZWczUUZDR0RNR3FxbGZuNzByMmVhdHAzNVRrWUxpNURuSmdiRGExcytEeXZ6QlZNd3lreTB0NEQrcmJseHM5cWlRSTFXMXB2bGRWM29QNjlwWDZuMTJmeUxWRHoxclZpRTc5ODlQVVYza0RyVnhlcEJKTlhvMW8rN3IvVmtROU5mWGxjMG1yeU44S0hhcEFCNk92eW52SU9DM1hsc2dBUWYyOWlzNXpNRG81bU1wenNObHN2TW9YTmdNVms1ZDBrRWZ5TGxFL29obGU4cEtFMFZRcnFhc2gyQ0pHajNsRnExbGVva1cvRnpUZnFHc3FMMWU0UXZLU0tUMEhVNUVEd3pBOFVNaUlUajgzM0ZUeEI4bjJWUjByc0x5ZWtvZndyRlhJUzFKTkYvV3NMWGxKVTNrZDNvdk00bnJHSDdTM0wzNnM0QUdDUlE2bGhzMW1rODhUeUVmK2l5VHRXcGJoeDVXSllTMHZDY2VWUjRSRGJSZmVWbjVwUzE1U0xTOFpLdjVRY1BtS3lrc1krUE52UlBlUU5qbzVtQ3ZtTUpSNnB6Q2lVamh1bVBpRENNd3RMekVpZFdnMG1ua1hhSFA1UzA2d1ZTTXZxU1lJMWVYRjVhVUN5MWVOdkNUcU5RREdKd2R6ZVE1TVZ0YTlGb0pJb21MeEJ6RVlXRjR5ZGZ4aGVNbExobzQvb05ybEpUWDNhcEZET2NEWWJHSS8zTHpMeElyS2x0QlVYaEZta3BkS2ZLLzZQK3RoTEMrWktmNHdWRXFuOXZVcHIxcGVZb1RUY20ycDlpQXRjaWdIR0NadnZtNnBqS2FxOGdhV2wzUzQxN0xGSDVJVktsMXJXSGxKN2IxS2pYNDFlVFdWakQrb0xtOWNlVWtMUVlnMHBjSmJ6NzlYMDVLRDJXSU9kckVYb1dybEpYUEhIOFRxTUpPOEpFb1FJdktTRkRUZWEwWGpEeUwxbVVwZUt1NTNYZHI0ZytnY0I4RDQ1R0EyejBGeWVYR1R5MHVhUm8rNUtHMzhRWS95aHBLWGlucldobzQvRFBXblpPMlhXVjdTUWhDSzVSWGFLckM4NGdEQnRKNkQyY2pCQVZBRHBIem1GcGVVbDRvZnFWZjhYazBqTDRtM0pkay9VOGNmekM0dmxYUGdKVkcrYlBLU1JRNWx3cERuVUZsNVNRdEJxQ292MDlad2w1ZTBFSVFZclBSV0xlWHo2dE1rTDJraGlBTEs2eHAveUN0Y0lubkp0T1JncXBnREFOaHNOa2hvendDS2xKZU1ISDlRMWI2cDVDV05Sak1YVm5wcjJlUWxjOFVmbE51WFBsWkVlY2xPbUpZY3pPWTVZQ2hoU1ZwZU1ubjhBU2FYbDhyK3JJdUlQNGoxcDRya0pUcDBUQnhGRG9ZS0thK2pWMk1PZWNrS1NKY0wyZG1zcG9vL3FHdmZ1UEtTRm9LUUtLKzZyV1NGU3RkYThwSkVxMmFLUHhSUTNsRHlraEpCV0o1RHVjRFlSQjVwWmVNUElqV1pTRjR5Vi94QnJLN3FrWmZ5dkM5VHh4L0VZR0I1cVdUeEI5T1NnL2xpRG5uejRFb1VmeENIYWVRbGs4VWZkR20vWXZLU2VvSW9pYndEeGNGUWFYL1hKcE9YeXRCVzFyMVpzbEs1a0Q5SkdxaHVlY25VOFFkMTdSdFhYdExVVjJQSEgxUzJyM1N0Y2VVbEpsV2xRbm1adGtvU2Z4QmRrUlV3T0RsOHVuWTFDNEN0ZEQrMFFHeDlwVFRNTFMvcElJL2tYU0kzb3NrOU5aemtKV3R6SUMzbDgrcXpOZ2VTdUZvTXB2VWNBSk41RDBuUFFYYjBtSGRHcEJxeHFtVkxhQ3FmV1pPSjRnK1M3YXM2Vm1CNVBTVVBhM01nRThsTE9yd1htY1gxakQ5b2IxLzhHQVZNSEhNQVRCWjN5STg1WkVKUGVZbW0vbGRCN1RJVHcxcGUwaXdaVkN6K0lGWjZHTWxMSm9zL1NKVFhWVjR5TlRtWXkzTVl5bFlxbGJ5a2c5SE1MVjYxNmExaWRXbVJseGlST2pRYXpid0x0TGo4Vlp2ZUtvcmk1Q1hWQktHNnZMaThWR0I1dzhwTGxxeFVMdVFFcEtXTmc3bmpEMkl3c0x4azZ2akQ4SktYREIxL1FEWEtTNWJuVUM2SXlFcXlvOGU4TS9tSGxFYzA4aGhPOGxLSjcxWC9aejJNNVNVenhSK0dTdW5Vdmo3bFZjdExqSEJhdEMxVGs0T3BZZzZpaytCRVVjM3ByU0lvVGw3UzRWN0xGbjlJVnFoMGJkWEtTNXE4bWtyR0gxU1hONjY4cElVZ1JKb0NBMHRXS2g4WWh1SEZEa3NXR0U3eWtybmpEMkoxbUVsZUVpVUlEZktTeG51dGFQeEJwRDVUeVV2Ri9hNjF4UjlNN1RtWWloeHNOaHNuY1dvNHlVdWFSbys1S0czOFFZL3locEtYaW5yV2hvNC9EUFduWk8yWFdWN1NRaENLNVJYYVVsdmVJb2R5Z2JIWmlMWVNwcEtYaWgrcFYveGVUU012aWJjbDJUOVR4eC9NTGkrVmMrQWxVYjVnZWNuVTVHQ3FtSU5OWEZaS3dhanlraGFDVUZWZXBxM2hMaTlwSVFneG1DbitJSGJBVFBLU0ZvSW9vTHl1OFllOHdpcmxKVk9UZzlrOEJ6bHlBTW9wTHhrNS9xQ3FmVlBKU3hxTlppNnM5TmF5eVV2bWlqOG90eTk5VEUxNUt5QmRMdGdZc2QrNEdsaWJBeFhWdnJVNWtGUi9xa2hlb2tQSHhGSGtZS2lROGpwNk5aV1JseXpQb1Z4UW1jb3E4WVdaS3Y2Z3JuM2p5a3RhQ0VLaXZPcTJraFVxWFd2SlN4S3RtaW4rVUVENWlzbExpY0duSHBMc3VSbkl3VlF4QjBaOHpXN1JTeVhQVkRiK0lGS1RpZVFsYzhVZnhPcXFIbmtwei9zeWRmeEJEQWFXbDFRUmhPUnkzWUE1eU1GVW5vTk5QVGtBQ3FQSHZET3F5bGVudkdTeStJTXU3VmRNWHJJMkJ6S1R2RlJNVzVLU0VtQ1JnKzVnYktxblNNdWdtdVVsVThjZjFMVnZYSGxKVTErTkhYOVEyYjdTdGNhVmw1aFVsUXJsWmRwUzlCNGtnOUdBUlE2Nmd3SHMyb3RJd056eWtnN3lTTjRsWXQ2RFZIM0RTVjZ5TmdmU1VqNnZ2bUc3T1pEcFBRZFR4UnpBTUk1Q1N1VWZNcWE4WktyNGcyVDdxbzRWV0Y1UHljUGFITWhFOHBJTzcwVm1jVDNqRDVLd1BJZHlnbUVZclo2RERLek5nWXBxMzdqeWttYkpvR0x4QjdIU3cwaGVNbG44UWFLOHBQZGdlcy9CVk9RQVFNUEtyTm5GSk04VUp5L3BZRFJ6aTFkdGVxdFlYVnJrSlVha0RvMUdNKytDOURHZDR3L2k1Zk9hcjFwNVNUVkJxQzR2TGk4VldMNHM4cExsT1pRYjhsdUZ5a0xhT0pnNy9pQUdBOHRMcG80L0RDOTV5ZER4QnhoZFhqSzk1MkN1bUFPUXV4dWM1dUw1aDR3WmY5Q25mRVhscFJMZnEvN1BlaGpMUzJhS1B3eVYwcWw5ZmNybmVRK21Kd2ZUZVE1RmtvTUVxam05VlFURnlVczYzR3ZaNGcvSkNwV3VyVnA1U1pOWFU4bjRnK3J5eHBXWGNwKzF1Y25oMDdXckNSUnV3bWdvTU9hUVZZWGttZUVrTDVrNy9pQldoNW5rSlZHQzBDQXZhYnpYaXNZZlJPb3psYnhVNk8vYTlERUh3R1RlUXhFeGgwd01KM2xKMCtneEY2V05QK2hSM2xEeVVsSFAydER4aDZIK2xLejlNc3RMV2doQ3NieklNWE43RGttWUt1NmdnK2NnQTFQSlM4V1AxQ3QrcjZhUmw4VGJrdXlmcWVNUFpwZVh5am53a2loUGdTb2hCMU41RGpyR0hJd3FMMmtoQ0ZYbFpkb2E3dktTRm9JUWc1bmlEMklIekNRdmFTR0lBc3JyR244QVFDMVpxZHpRU1ZaS29YenlrcEhqRDZyYU41VzhwTkZvNXNKS2J5MmJ2R1N1K0lOeSswUEhMTStoM0NpdHJKU0N0VGxRVWUxYm13Tko5YWVLNUNVNmRFd2NSUTZHQ2ltdm8xZFRmUG1xOEJ6TUZYUFFQNVZWb2tKVHhSL1V0VzljZVVrTFFVaVVWOTFXc2tLbGF5MTVTYUpWTThVZkNpaXZtN3hrZVE3bFJtbm1PV2d6bW1XTVA0alVaQ0o1eVZ6eEI3RzZxa2RleXZPK1RCMS9FSVBSNUNXTEhNb05YYlowRUlmczZESHZqS3J5MVNrdm1TeitvRXY3eHBHWEpKOTFTZVFkS0E2R1N2dTdOcG04bEhtOEttUWxVNUZEaVR3SEdWU3p2R1RxK0lPNjlvMHJMNm5ySzVXUmQ5UWR5NndyNTFxOTRnOHEyMWU2MXJqeUVwT3FVcUY4SnFyQ2N6Qlh6TUZtNDBwWnZlUVpjOHRMT3NnamVaZW8xOFNIbDd4a2JRNmtwWHhlZlZXek9aRGxPWlFiTm9ZaEpXN0NOUEtTcWVJUGt1MnJPbFpnZVQwbEQydHpJQlBKU3pxOEY1bkZDNG8vVklYbllDcHlZR3kyVXBPREJLek5nWXBxMzdqeWttYkp3RGp4aDBMYXo2dkVOUEtTeWVJUGx1ZFFidGdZaGk5RE02V1NsM1F3bXJuRnF6YTlWYXd1TGZJU0kxS0hScU9aZDBINm1NN3hCL0h5ZWMxWHJieWttaUJVbHhlWGx3b3NYNUM4VkJXZWc5bGlEcXJGMjJLYnlqOWtiUTRrM240cDVTVlR4eCtHbDd4azZQZ0R5aTB2V1o1RHVhSHo4aGxLa0IwOTVwMVJWYjU4T3EzMjhoV1ZsMHA4ci9vLzYyRXNMNWtwL2pCVVNxZjJWWmF2Q3MvQlZPUlFudVV6bEZETjZhMGlLRTVlMHVGZXl4Wi9TRmFvZEczVnlrdWF2SnBLeGg5VWw2K012TVFOUHYyd2JHelVDRlpNRGN4RkR1V2Y2S0RKYUZhdHZHVHUrSU5ZSGNOSlh0SjRyeFdOUDRqVVp5cDVpWUdLRGRUTVFnN21pamt3VENXZTYzQ1NsNG95V3FXTlAraFIzbER5a3RwbkxWN2V5UEdIb2Y2VXJQMHl5MHRhQ0VJMjNnQ1loeHpNNWpuWUs5MkhJWmhLWGlwK3BGN3hleldOdkNUZWxtVC9UQjEvTUx1OFZJckJTTlY0RGhZNXFHeGE4a3hsNVNVdEJLR3F2RXhidzExZTBrSVFZakJUL0VIc2dKbmtKUzBFVVVCNTJmaURSUTZWQU1Nd2prbzJuMy9JMmh4SXZIMVR5VXNhaldZdVRCVi9FSU41NUNWenhCK3FSbFl5VmN3QlFBVVczMU9DdFRsUVVlMWJtd05KOWFlSzVDV1o3RFhwNDBVTVJ0U1UxOUdyeWI2MmFqd0g4NUZEWmROWkpYNHdwb28vcUd2ZnVQS1NGb0tRS0srNnJXU0ZTdGRhOHBKRXEyYUtQeFJRWGxSZXFnN1A0ZE8xcTNrQTBVcjNRd3ZLUEJGT0RKcU1aaG5qRHlJMW1VaGVNbGY4UWF5dTZwR1g4cnd2VThjZnhGQktlYWxxUEFmQWZIR0hTbmNCS0dmOFFYWDd4cFNYVEJaLzBLVjk0OGhMa3MrNkpQSU95aGwvRUlGQjVLWHE4QnlTTUpXMFpJeFowbEtvWm5uSjFQRUhkZTFYaWJ4azdQaUR5dmFWcmpXdXZHUjVEcFdDQVdTbEZLcFZYdEpCSHNtN1JMMG1QcnprSmJXYkE2bi9yZ3dTZnhDRm9lVWxXdlI3a1NRSWl4d3FCWVBJU2ltWVJsNHlWZnhCc24xVnh3b3NyNmZrWVcwT1pDSjVTWWYzSXJNNHJTcFp5VnprWUdoWktRVnJjNkNpMmpldXZDUWNWNVNYTXRvdXZLMzgwa1hGSHdwcFA2OFMwOGhMRll3L1ZCVTVtQ3ZtWUN6UEFTaWR2S1NEMGN3dFhyWHByV0oxYVpHWEdKRTZOQnJOdkF2U3g0WnplcXNvaXBPWFZCT0U2dkw2eGg4c1dhbFNNRkRNSVJQU3hzSGM4UWN4R0ZoZU1uWDhZWGpKUzRhT1A2QVllYW1xUEFkVGtZT0JaU1haMFdQZUdWWGx5NmZUYWk5ZlVYbXB4UGRhemVtdGhiU2ZWNGtXMGpKVC9HR29WT0h0VzU1RHBXQkFXVWtCMVp6ZUtvTGk1Q1VkN3RWS2I4MXV2bVR5a2lhdlpoaWx0MVlWT1ZneEIvMmd5V2hXcmJ4azd2aURXQjNEU1Y3U2VLL1ZuTjZLUXQ0TFMxYXFGR3pHbFpWU0dFN3lVbEZHYTNpbHQ0cldXSXBuTFY3ZXlQR0hvZjZVclAweXlrc1dPVlFLRENQMkd6TURUQ1V2bVNuK0lGSGVOUEtTZUZ1Uy9UTjEvTUhzOHBLYVoxVlZzcEtweU1GbXMzR1Y3b01LR0ZWZU1sUDhRYXcrTThsTHd5bitJSGJBVFBLU252R0hxdkljekJWenNObElwZnVnRXVXVGw0d2NmMURWdnFua3BlRVVmeENEZWVTbHlzUWZMTStoVXJBeERGL3BQaFFIYTNPZ290cTNOZ2VTNms4VnlVc3kyV3ZTeDQwU2Y2Z3F6OEZVNU1EWWJHYUtPVWo4NEV3VmYxRFh2bkhsSlRQRkg4VGJyMUo1eWVUeEI2bnlGam5rSXRaeEVQSE9kajJxa29YTmZBRnBvOFlmUkdveWtieGtydmlEV0YzVkl5L2xlVittamorSVFjdDdVVld5a2k0eGg5NzMza2JIQzA4ZzBkMnBSM1dTTVBBTWFUbVVMLzZndW4xanlrc21pei9vMHI1eDVDWEpaMTBTZVFmbGpEK0lvRVR5a3VVNTVNTHVDNEJ5TERwZjJRZytvZmg4Q2daajhGbHcybEROOHBLcDR3L3EycThTZWNuWThRZVY3U3RkV3g1NWlZOXVmSVJWcW56WWtZUDM2SW13MTNqZ0hqMGVSMTU5UVk4cVJjRXdqSm1lYlNhcVZWNHlVL3hCckM0enlVdlc1a0JheXVmVlYzSjVTZFdvMkV3R1RCZHlxQmw5RkJ5QldqUXRPUTgybHh1aG5adjFxRFlQSmlZSHdFVHlrcW5pRDVMdHF6cFdZSGs5SlE5cmN5QVR5VXZabm5IMmU2RVlid0RNUlE2NnhCd1l1eDEyWHhEY1FCOGFGNStMd2YxN01YaHdueDVWWjdmRE1IYmRLNjA0ck0yQmltcmZ1UEtTY0Z4UlhzcG91L0MyOGtzWEZYOG9wUDI4U2t3akwra1VmNmc2Y29oQ2xlU3BETy9SRXhGdCtSU013NG02V1F2UTljKy9nUEw2VGt1b0FuSW9sYnhrNFBpRENNd3RMMldQSGhYYnltdk9zUEdIekFPYXlodFhYaXBuL0NHcXBrTFRrTU9uYTFkVDZPUTllTWRQVEhzTE5yY0haTEFmZkZ6MzRIUTF4S1NsallPNTR3OWlNTEM4Wk9yNHcvQ1NsOHdSZjBpb0tXZ2Fja2lpNkxnRDVRbTRnVjdZSEU2d29XN1kzVzRBS0VubVVoV1FBMkNpK0lNKzVTc3FMNWtvL2lCYTQzQ1NsOHdVZnhncUphRHFBdEtBRHA0RDI5T0Zybis5Z3JyWml4Qitad3RzcmhvQUFCK1BnK3Z2TGJxRG1URHBYQWVWcU9iMFZoRVVKeStaS2Y2UXJGRHAycXFWbDB3VGYxQmRQbDllcWtweUtOcHpjTlkzZ1l2MElORjFDRFozRGRpK0NBREJjNGkxSDBTMDdVRFJuVXpCb1B0SUY0SlN4Ui95S3pHeXZHVHUrSU5ZSGNOSlhqSlQvRUdrUGwzbHBhb0xTQU02a0FOanM4RTNjU29pdTdlamJ0WUM5UDFuRndEQmM2Z1pjeFI2ZDI4dnVwUHB0cXFISElEaEpTOFpPUDZnUi9rcWtwZU1ISDhZNmsvSjJpOVFYckk4QnlrNGduVncrQUt3ZS8xdzFvNEFJSGdPRG44UU5uY05FbDJIOVdpbXltV2xGRXdsTDVrcC9pQlIzalR5a25oYmtzL1AxUEVIczhsTFZVa091bVFyeFErM2dVU0ZiSzdhbWZOZ2M5ZWtzNVZxWjh4RCtOMDM5V2ltbW1TbEZJd3FMNWtwL2lCV241bmtwZUVVZnhBN1lDWjVTYW90UzFhU1F0MnNCWWdmYVVlMDVWUFlYRFdvbTNrS3VJRStBSUNyWVNUNFJCeHNiN2pvZHFwTVZrcWhmUEtTa2VNUHF0bzNsYncwbk9JUFlqQ1B2RlI4L0tFcVBRZGR5TUU5Y2d3Q1UyYWtQWVRnOU5rWTNQOHhZdTBIQUFEZW95Wmk0SlAzaTI1bmVNaEtLVmliQXhYVnZyVTVrRlIvcWtoZWtzbGVrejVlaXZpRDVUbklZY1RjeGVBaW9mK2Z2VGNOanVOS3J3WFB2VGVYS2xRVmdBSUt4RTRVS0pLU1FJS0FxRzd0YXFyZHJWN2M2aDYzUGZKN1l6dmllVHc5dHQvOG1COHp2K2RSbkRjVGJ5Wm1Kc0l4OFNhZXd4T2V4VDhjWVRQc3NkM2gxNjNldGJSYVVrdXRoU0lrVVNLYklyRnZoYVdBcXNyTWUrLzhxTXhrRmxBRkZLcXdWQmJ1aVVBQXlNcTg5MVlSekpQZk9kLzNYZVJuN29Cb0dqcWZmQmJ6UC93SE9PdXJpUFFQSVQ5OXQrNDVtalJ5QUNyK3dZYktmNmh1L3NhVmw4TGtQNVNmdjBubHBSRDREMDBaT2V6YlB0SlVOOUQ1MUZldzlQTWZBVktpSlgwR0xla3ptSHZ4NzBBMURmbTVxYnBiYXREbWpod2ExWDhvTTFLSTVLVncrUS9seG1vZWVXbGI5QlZxL3lHSXBpU0hmZG9ON2k0Mjc5eEVTL29NOU5ZazF0eDAxbzRudmd4aEZYRDNyLzhjMHJGaExjN1dOVThUUnc0ZURzOS9xSHIreHBTWFF1WS83TXY4alNNdlZmeXNEMFRld1dINkQyVlFoYnlrWktWS3lOMjloZmtYL3g3NTZUdm9mUEpackw3M0prUWhENm9iT1BIc2I0RWF4WllhaFFWRkRyV2htZVdsVVBzUDFjM2ZKUEpTWS9zUFZjNi8yN20xeVVzcWNxZ0lLU0VGeC94UHZndWk2MmdiZXdUTHIvOEVBR0IyOWFMN04zOFhWRGZBb2kxMVRYTk1ET2xtbFpmQzVEK1VHK3M0eVVzTjZ6K1V4ZEhMUzAxSkR2dmlPZWdkWFFDS1QvYVpOMzZHMW5NWFlXZVdrSis1QXdDSWRQZGo2SS8rRzhTRzc2OXJuaWFzYzZpRTBNaExvZklmS3M1ZjFiRWFyOTlQeWFQcXpZRkloYWtieDMrb1pmN0dsWmVVckZRSlJrY1hpS2FoNzdmL0ZUWS8reFQ1MlVsMFh2bzZsbDc5SVNUbjkwNnM4K1pPS09XN245WE1VSnNEMVRWLzQ4cEw1VzdtSWZFZmFwbC8yeUNoa1pjcUVFUlRSZzc3UWc1Nk1nWENOQUFFWGMvK0ZwWmUvUUgwdGlSYTBtZXc4cXZYOW1NS0FBQWw1RGlSdzBISlN3M3NQNVJCdU9XbGNyNUtVL2dQd1FON3VyNXg1YVY2L0FkRkRwWGdOZDhyekU4ajB0MFBzN3NQcSsrOGp2YUxUMkR6MXgvRHppenV4elRITVhLb2ZITUl0LzlRRG1HU2w0NlQvMUJ1dk1hVmw0N0dmMmhLY3RpM09vZjRtWFBJVGQ0R0FFUjZCckh5em10dzFsZlIrZFN6V0h6NSsvc3lCeVhsL2lhYUhxSHhIL2JuK2lPVmx5cXN0ZW8vdTBQL3JJK3h2TlJJL29QeUhIYUNtZXBHZm5ZU0lwK0RrZW9HcE1UaXk5OUhwRzhJZWxzSDFpZmVyWHNPUXVseEpJY0thT2IwMWpLb1QxNEtrLy9nRHJqYnVVMHJMNFhHZndpZ0tTT0hmU09IOVEvZlJkdUZ6MlAxMmxzdzJqdEJOQjBzR3NQYTlWK2g0L0hmd09yN2I0QnYxamZkTWNwVzJvcUQ4aCsyRDlMSThsSzQvWWR5WXh3bmVTbE0va09aOFhhVWx4UTU3SVROT3pjUjdSdENidW8yaEdORGIrOUE3TDRIc2ZMT0x5QnNDKzJmZXhwTHYvaFJYWE1ja3pxSFNqaE84bEtZL0ljYXJtOGllYW1SL1lkNzZ6bXcrZDIvdGFZa2gzM3pITnJHSDBQbVZ6OUhnUWRkNGdBQUlBQkpSRUZVMitqbklXMGJSbWMzbk93cTJrWS9oNlZYWGtUODlBaW9wdGMxQnlFa2JKL3ZJU0JVOGxLWS9JY0sxemVydkJScS8rRW81U1VKd0twbXdGRGR2Rzc5K2IvTEE2aXZHNTZMYUg4YWZHTWRScW9iTE5vQ0k5V053dHcwV2tjL0IzdDFHZGxQcmlQNStTL1VOWWNpaDRhVmw4TGtQNVFiTDB6eVVyVUVVZm5mS2p6K1E3a0RqU1l2V2JuLzd5K3I4a0xEZVBQYXY3YmRuLzhDTW0rOURCQ0M2TUF3Q3ZQVElKU2hiZnd4TEwzMm85S0N1QnBBQ0dIN3ROUXc0L0RrcFViMkg2cWFQMVR5MG5IeUg4b2hQUEpTS1VGVUpTa0J4NXdjak00VElGUkRZV0VXZW1zN3FHNkFiMllSUHowQ0NJRzVIL3c5cEtpZElCUTU3QVMxT1ZCZDg2dk5nU3F0cDRua3BSMnkxeW9mMyszdm9xbkpZVjk4aDQyYkgwSnlqdVRubjhiS1c2OEFBT0puejJQajFzY2dtbzc0L2FNZ2hNREpydGN6RFRtK25WbExVT0ZEQ0pYL1VOMzhqU3N2TmJIL1VCVWFWbDQ2WlAraHFjbGhYeUlIZTIwRnk2Ly9CRnE4RlhveWhkemtyNUY0WUF6Wkd4OEFBR0wzUFlqb3lkT2dyTDZIZjBVT1BoclZmeWd6VW9qa3BYRDVEK1hHYWg1NWFWdjAxWkQrUTFVRmNNQXhKb2Y0ZlE5aWZlSmRiUDc2QnRvZmVoeXI3NzRCR29uQzZEeUI3S2NUTUZNOXlFL2ZBWXNsNnBybm1LZXpic1hoK1E5Vno5K1k4bExJL0lkOW1iOXg1S1dLbi9WK3lqc2w1eDVpZW11dXVpVWRZM0xRV3R2UmV2NGlGbjcySHlHc0FxSW5UeUg3NlFUYVAvY1VWdDU2QmFLUWh4UU9uUFdWdXVZNXhvVndlMEF6eTB1aDloK3FtNzlKNUtYRzloK3FuSCszYzZXc0tvMFZDQ2M1MU93NWJOMFR1djNpa3dDQStSLy9JeElQam1QOXcvZkFvakhFVGoyQXVlOWZCZC9JSWo4eldkZGlsYXkwRGMwcUw0WEpmeWczMW5HU2x4cldmeWlML1pXWFZPUlFEdGJDYkVsNktqVWphTC80T0p6c09sYmUvamtTOTQ5aWZlSWR0RDMwT0tUandNbXV3VnFhcjJ1eFNsWXFpOURJUzZIeUh5ck9YOVd4R3EvZlQ4bERiUTUwQ1BLUzhoektRVy92d09yN2J3SUFoSldIc0MyMG52OGM5TloyYk42NUNXcEdzUG5acHdDQTdxOC9EeGFOd1Y3TDFMVllGVG5zQldwem9Mcm1iMXg1cWR6TlBDVCtReTN6Ynh1a2tlUWxsYTFVRHRsUFBrQmhZUWIyeWhLazdXRHBsUmRCR0VQaXdYRkUrNGV3OU9vUEVMdnZBYXk5L3lhMFJCdTZ2L1k3aVBRTzFyVlk1VGxVeEVISlN3M3NQNVJCdU9XbGNyNUtVL2dQd1FON3VyNXg1U1h2ZUZPVFE4MmV3OXExdHhCTG44WGl5eStDUmlJb3pFMWovYVAzRUQ5ekR2WnFCbTFqanlCNzR3TVU1bWZBODVzd1QvU2g3Y0lqZFMxV3lVbzdvdkxOSWR6K1F6bUVTVjQ2VHY1RHVmRWFWMTZxMzM5b2FuS29YVmJxT0lIOHpGMW9zVGl5bjF4SDdQU0RXSDc5cDdDV0Y5QTI5aWg0YmhOYW9nMVNTcXk4dlQvYmhTcFphVmVFeG4vWW4rdVBWRjZxc05ZcW50RjN2UDdleFBWZHZ4M0hXRjQ2S1A5QmVRN2xFT25waDdPeGhvNG52NHpWZDkvQStvZnZvdjNpRTVqLzRUL0FQTkVMZTJVWjdSZWZnSk5kdzhhdGorcE9Zd1VVT2RTT1prNXZMWVA2NUtVdytRL3VnTHVkMjdUeTBsSDdEeXB5S0lmNDZYT3dsaGJBSWkxb2YvaEo4TndtQ0tXSTlBeGc2WlVYMGY3d2sxaDk3MDJjK1BKL0FsSElJL1BMVitwZUxGV3lValU0S1A5aCt5Q05MQytGMjM4b044WnhrcGZDNGo4MGRlUlFzK2ZBWW5GRSswNGlQLzBaNG1mT3dlam9nckFLNkh6cVdWaVpSUlRtcC8xek81LzhNcktmWEllMU5GZlhZbFhrVURXT2s3d1VKditoaHV1YlNGNXFaUC9oM25yMk1yK3FjNmlFMWd1UFlQbU5sd0FBTEpiQStrZnZBMUtpKzlsdkkvUFdLNGdOMzQrVnQxOUY0c0h4b2lmaG5sc3JGRG5VaTFESlMySHlIeXBjMzZ6eVVxajloLzJVbDVvNmNxaUxITXl1SHVqdG5kaTQrU0Zpdy9lRDV6YVFlZXRWYUszdFNEMzlOU3o5NGtmUTRxM0lUZDFHNmd0Zmg3TzJzdXYvaUoyZ1pLVTlvVkhscFRENUQrWEdDNU84VkMxQlZQNjNDby8vVU83QVFjdEx5blBZQ1IyUFBZUE1XNjhpUC8wWk9oNzlJbkpUdDJFdHpxRmw2RFJpUTJkZ3I2MWc5YjAzUVhXajZEODRkczF6RVZMdUhxYXdBdzVQWG1way82R3ErVU1sTHgwbi82RWNHa1ZlYW1weXFIcy9CeGFOb2ZYY1E5aTQ5UkZ5MDU4aDlmUlhzZmp5OXdFcGtYemtFb1JsUWVSenlONzRBRWFxRzFRM2FwNkxVRnJmZG5JS0x0VG1RSFhOcnpZSHFyU2VKcEtYZHNoZXUzZThxY2xoWDdxeXRwNTdHRWFxR3p5N0J2TkVIOHp1UHF4ZWV3c2dCQ2UrL0Mzdy9DWXliNzBDeVoyNjVxR0VLSExZT3lyOGNZZktmNmh1L3NhVmw1cllmNmdLRFNzdjFlay9LSExZRllRZ2Z2OEZPT3RyeFIzaEhybUU5US9mZ1pOZEE0dkcwUFViM3dUZldNZmF0YmZxbTRaU0pTdlZoa2IxSDhxTUZDSjVLVnorUTdteG1rZGUyaFo5SFlyL29NaWhHbWpSR0hoK0V5dnZ2QWFxRytoNDlJdFlldVZGQUVDa1p3REpSNS9CeWp1L2dNaFhuZjIxRFpRUXNmdFpDaFZ3ZVA1RDFmTTNwcndVTXY5aFgrWnZISG1wNG1lOWs3eFQ5VnpsenEzRGYyanFiS1Y5MlVNYUFGclNaMkIyOVdEajFzZXdNMHRvU1o4QllSbzJibjRFQUdpNzhBaWkvV2xzM0w1Ujh4eXF0OUpCb0pubHBWRDdEOVhOM3lUeVVtUDdEeFd2Yjk0NmgxdC8vdThzQVBVWkFSNElRZWZUWDBQSFkxL0U0aXZmQndCMFB2a3NNcjk4R2NJcVJsK3BaMzRUekl6V1BJWHF5bG8zbWxWZUNwUC9VRzZzNHlRdk5hei9VQlk3eTB0TkhUa0EreWd0bVYwOWFEbDVIN1JFTzlZL2ZCY3NGa2ZyaGM5aitmV2ZBUUNvWWFKbCtHek40eE5LRlR2VWo5RElTNkh5SHlyT1g5V3hHcTgvUW5tcGtmMkhXdWF2VFY1cWFzOEIyRWR5Y05aWEFRQ2RqLzhHVnQ5N0EzeHpBNjBqRDhIT0xCYnJIektMZFkxUENBbnJaeHdDcU0yQjZwcS9jZVdsY2pmenZjaExSK2cvMURML3RrRU9VbDVxZW5MWUY5K0I1elp4OTYvL0E1WmUvUUZvSklyMmkwOWk2YlVmQWdBNnYvQTFMTDcwZlN6OCtKL0E2ekNrRlRuc0d3NUtYbXBnLzZFTXdpMHZsZk5WbXNKL0NCN1kwL1dIS3k4NStYLzR2NnBPa0FucmpXdGZJZ2RoV3dDQXRldS93dkxyUDBYODdIbUlRaDZiZDI3Q1NLYVFlSEFNMXRJOE1xLy90T1k1Q0NGc1A5YXFBR0NubTBPNC9ZZHlDSk84ZEp6OGgzTGpOYTY4VkVvUWUzcktQZGJrb0xlMlE0dTNnaG9tVnQ5N0E1dDNicUx6NmE5aCtSYy9nWFJzdEkwOUNyT3JCL201cVhxbW9hcjUzcjRpTlA3RC9seC9wUEpTaGJWVzhZeSs0L1gzSnE3dit1MDR4dkpTTmY1RDFXWTBjTXpKQVFDaS9XbDBQdmxzTVdQcHBlK0JtUkVrN2g5RjVwY3ZnMUNLMUJlZkF6VWpkYzJoeU9FdzBNenByV1ZRbjd3VUp2L0JIWEMzYzV0V1h0cFAvNkZxdndFSUx6bnNXNjFEWkNDTnd1SnNNVW80MFlmRlYxNUU2NFZIa0p1K2c4TENMSXhrQ3IzZit2MjY1bERrc084NEtQOWgreUNOTEMrRjIzOG9OOFp4a3BlT3duODRGdVJRYytUQWN4dFluM2pILzh1TjlnOGhkK2NtQUtEcmk5K0F0VENEL05SbnhmYmRyeFNiOGRWYnlLWUs0UTRFeDBsZUNwUC9VTVAxVFNRdk5iTC9jRXdpaDVySm9UQTdoY1ZYWHNUaVM5OERVT3pRU28wSTdNd1NxR0hpeEZlK2plVTNYNEtSNm9iWjNZL1ZhNytzZTdHcUVPNHdFU3A1S1V6K1E0WHJtMVZlQ3JYL1VFbGVVdVN3RSt5MURBQmcvZVAzc2Y3UmV3Q0E5b3RQWU9QWEh3TUFqTTV1dEF3T1kzM2lIYmNaMzd0K0xVU3RVTExTZ2FGUjVhVXcrUS9seG1zYWVTbHdhdVYvcS9ENEQrVU83T1hmNmxpUVE4MmVnOWJhRGdDZ3VvR2xWMzlZM09RbmZRYUZ1U20vWlViYitHTlkrK0J0UUFoMFBQcEZMTHJOK0dxRmtwVU9GSWNuTHpXeS8xRFYvS0dTbDZxOWFWYVlQMVQrUXprY2hMeWtzcFYyZ3BucUFRQ2NlUGJiaUo4NWg5WDMzZ0JRM0Z0NjVaM1hBUlJiWnJTZXU0ak1XNitpSlgwR1ZOZGhMYzNYdkZnVk9Sd0YxT1pBZGMydk5nZXF0SjR3eTB2SEluS29tUnkwUkp1Ym1pclIrZlJYb1NkVEFJckd0SjFaQk45WUJ3QWt6ajJFM04xYnNGZVcwZm5FczVDODlqMTdsT2R3NEtqODlIamtOODJ0bHpldHZOVEUva05WYUZoNUtYQ21Jb2ZkRU8xUG96QS9EVUlwMmg5NjNEL2VmdkZKWk41NkZRQkFLRVA3NTU3QzJnZHZnY1hpTUUvMDFqeWZrcFVPQlkzcVA1UVpLVVR5VWhQNUQ3dU1XV204eHBHWHRrVmZlNDVxamdVNTFGWG5FTDkvRlBsWnQrbzU4RlJ2bnVpRnNQS3czV1o3OGRNanNKWVgvRFlidFVMSlNvZUd3L01mcXA2L01lV2xrUGtQK3pKLzQ4aExGVC9ySGFLeTZ1Y3FkNjQ3LzdFZ2g3b2loNWJCVTNBMjFzdkd1ZTBQUDRXbDEzN2t2eFlidmg4Ym4welVNeDJvaWh5T0dNMHNMNFhhZjZodS9pYVJseHJBZjFEa3NDc0lRV3pvTkRadWZienRKYU9qQ3l3YXc4cXZYZ01BdEtSUFkyM2lWM1ZPcHlLSFEwU3p5a3RoOGgvS2pYV2M1S1ZHOVI4VU9WU0R4TWc0VnQ1OXZlU1l2YklFWWVXUmZPUVNWcS85RXJtcDI5QVM3WUNVc0JibmFwNUxrY09oSXpUeVVxajhoNHJ6VjNXc3h1dVBVRjVxWlAraGx2bVBDVG5VM1Z0SlM3UWowdDJIelYvZjJ4OTYvc2YvaER0LzllL2hySytpODRrdlllSEgzd1hmekNJNk1JemM5SjJhNTFMazBDaFFtd1BWTlgvanlrdmxidVo3a1plTzBIK29aZjV0ZzFSTFdxck9vVnEwUC93a01tLy9IS0tRUjJGK0d0YmlIQ1IzTVAramYwUjA0QlRNbm43TS92UGZJRGQxRzRXNXlacm5VWjdEa2VDZzVLVUc5aC9LSU56eVVqbGZwU244aCtDQlBWMWZuN3lrOW5Pb0Zpd2FROHZRZlpoNzhlLzhGRllBNEp0WnpQL29INUY2K3FzUWhUeXNwWG5rWjJvbkIwSkkxYnN2S2V3ckt0OGN3dTAvbEVPWTVLWGo1RCtVRysrbzVLVmpJU3Z0MjM0T2JlT1B3ZGxZUis3dXJYdkh4aDRGejI5Zzg3T2I2UG5tNzRHMXhDRWR1K1k1S0tXMVY5QXAxSXZRK0EvN2MvMlJ5a3NWMWxyRk0vcU8xOStidUw3cnQrT1l5VXZIUWxiYXQvMGNxRzdneEpkL0M0UVdkL05rc1FRNkhuMEczVi85SGF5OS95YTBlQUs5My9wOWRENzFiTTF6RUVwVjVOQndhT2IwMWpLb1QxNEtrLy9nRHJqYnVVMHJMKzMwV1RlL3JIVHJ6LytkQTZDK3lyUUF6SzRlZEQ3OUZSQk5RL3Y0WXdBaDBOczZrQmdaeDlvSGIwTnZTeUorZHJUbThhbVNsWTRhQitVL2JCK2trZVdsY1BzUDVjWTRUdkxTZnZnUHgwSldBdlpSV2dLQXhBTmpHUHo5L3dxSmtZZnVIUnQ1Q0JzM1AvUzd0ZFlLMVQ2aklYQ2M1S1V3K1E4MVhOOUU4dExoK2crS0hHb0ZpN1NVM01nSlpVaU1YTVQ2eEx0MWphdFNXUnNab1pLWHd1US9WTGkrV2VXbFVQZ1B4NFljOXMxMzJBbXgreDVBOXVaSGRZMmh5S0ZoMEtqeVVwajhoM0xqTlkyOEZEaTE4cjlWZVB5SHJRZU9oU0VOSEVEa1VBNVVOMkIwcEpDZnJhUE9nWkF3Zjg3TmhzT1RseHJaZjZocS9sREpTOVhlTkN2TUh5ci9vUnlxV1gvekc5SXVEb1VjQUtEbDVIM0lmdlIremRjVFZRVVhBcWpOZ2VxYVgyME9WR2s5alNRdkhSdFo2VURKUVFvQnlSMEFnTjdSaGV6TkQvM2Y5d3BDQ052UHRTblVqY3BQajBkKzA5eDZlZFBLUzAzc1AxU0Z3NWFYZU9FZi8rODkzY0RDVEE0SDZqa1FTckg4aTU4QUFQUzJEa2pIcnFmNVhwZy81MlpGby9vUFpVWUtrYnpVUlA3RExtTldHcTl4NUtYUzZHdlBLWmRodm1rZHVLeVVuNTNFMnNRNy90YWhoWVdabXNkU3lsSkQ0dkQ4aDZybmIweDVLV1Qrdzc3TUgySjVxZHp4UFpuUkFLRHQ5WUlHd29HVFErZFRYOEhzZC84YUs0WUpBQ2pNMTA0T0ttTXBUSkFFa214OUJpYW9TbTJvY0s0RUtYc3Jydko2Q1VsSThLRlNZcWRiVTdtMXVzZTJYVWdndHozdkgvSjdsVnU1cDJSTUtZRWQvdnZzOEY0cm9QUWpLSE91SkY2d3VQUEg3RjUvUUovZnZibjluK3A1cjNzeW93RVZPZXlJU004QWtvOWNBczhYUDFkbmZiWG1zVlFoWE1PaVdlV2xNUGtQNWNZNlR2TFNZZmdQZTQ0Y3duekhPcFE2aDdheFI5R1NQZ01BMEZyYmF4NUhSUTROamRESVM2SHlIeXJPWDlXeEdxOC9Rbm1wa2YwSDVUa2NETHArNDV1STN6K0tTTTlBeldOUVJRNGhoTm9jcUs3NW03ZDZPa3orZ3pmSW5tVWw1VGxVQWFvYjZIcm1HM1dOb1dTbGhrZGw3WGE3OEV6azl0Q2kwdlVON0QrVVFabjN1bjEra05JNytRNExLUDllZDlESnkzZ2kyLzJIWFQ3cmtqRjJmdjhoOFIrQ0IzWll4VTd2VlVVT2pRb2xLNFVDbFo4ZXcrMC9sRU9ZNUtYajVEK1VHMjgvNUtWalJRNkg0am5zRjVTc0ZCcUV4bi9Zbit1UFZGNnFzTlpxSDdRYjJIK281dXJEbFplT0ZUbW95RUhoRUtHcXA4dWNVaTU2S0Q5dTgvb1A1ZWMvOEwrVlBXY3ZIWjlzcFZPZDdUUk10MXZsT1lRS2U3cHBOcTI4cE5KYnQ0NFZKbmxwNi9IalUrZnd5TW1lanE4OGtEN3FaVlFORlRtRURzZEpYZ3FULzFERDlVMGtMOVh1UCt4WlZncHR0cEtRY3VVL0hUdUxEK2VXY1NlemR0VEwyUldxZlVheklGVFYwenRscjVSQm1Vd2hWVDE5UU5sTE8yZGw3YmJXTW5Odk8vZFVkOHE0T0R4b1hCanFOelBaelFkMlh1cDJoSlljSkxDc1VZby9mV0lNTDN6L05WaWNIL1dTZG9TS0hFS0p5amVTK3RKYnR3K3l0NVRQdlJCRU9lenRwaG51OU5aeVkrejgvbmU5NjVjbGlNci9Wb2VRM3RvZWE2RVhod2VOc2ZTQU9UcllaNDRNOWtaYW94SC9pZlM3YjEwenE1elBSMmpKQWNBeUFQUzJ4dkNmWFh3QS8rOHZyeC8xZW5hRUlvZlFZc2VueDYybzVvbXU5RmpOQkZGbTdySUVzY2NiMGM1UDZqdlBYNVlnNnJzUjFuc2pyZlJaNzNiOXp0RVhLdndON0pGZ2EvdXNkY2JJdWNGZVkzeDQwQmdiNmpQUEQvYVovWjFKZmFkMzVnaXg1K3pPMEpJREkyVFIrL21aMDRQNFlHWVJiMC9XM0ZMN3dLRU02V1pEWlhtcExvSW9qd08rYVc1RnFPV2xhai9ycXFPeUhjNHRIYkdtNjNlWGx3WlRTZjNpOEtBK25oNHd6dy8ybVdmN3VnMURZM3Q2MnVSQzdEbTdNN1RrMEJtTExBVi8vODhmUFk5YlM2dkk1UGJzdXh3S1ZKMURxRkg1NlRFOC9rTjE4emV1dk5URS9zTTlKS0lSK2xCNlFCOVBEeGlqUS8zbXVZRmVJeGx2cVh1ek1JZUw3RjZ2Q1MwNS9MZC84Qytzbi96MFoyQnVRbXZNMFBGZlBuNEIvOHRQZndtNVN4TDBVWUJReWdHb0hlSENpMGIxSDhxTUZDSjVxWW44aDBwcnFqUTFveFFQOXZjWTQwWFQyRGcvMkdla3V6cjBnNUNndVRoRzVBQUFGdWN5U2pYL2szeXd1d08vK2VBdy9ubmkxbEV1cXl3b0lZb2N3by9EOHgrcW5yOHg1YVdtOGgrcW5IODNlYWszMmFaZEhCN1V4NFlIalBPRGZjYUQvVDFHeE5qUkt0ZzMySnl2Ny9XYVVKT0R6WVdJNnFVMzNHK1Buc0hFN0JKK3ZWejczZ3NIQVVKcDQ0VXpDdnVFWnBhWFF1MC9WRGYvQWNoTExhWkJ4b1lHalBIaEFYMzBaTDl4L21TZjBkVWFQN0tIUTRlTDQwWU9YR0RMMHppakJILzZ4QmoremZkL2pvTFRPT210bEpSL3VsUUlIWnBWWGdxVC8xQnVyQ09UbHlnaE9OTjdRbjlvK0tRK2x1NDNSay8yNjZkT3BIVGFRRDBjYk01WDlucE5xTW5CRWNJQm9HODlmaUxSZ2o5NGVBUi8rY2ExSTFoVmVhaklvYWtRR25rcFZQNUR4ZmtiUzE3cWFrMndpNmNHOWJHaEFYMTBxRjhmR2VnMVlxYlJPRXhRQnJiRDkxd3BISEp5a0U2bDE1NDYxWTlyTTR0NDgwN3Qrejd2SjRncWREZ0dPRlI1S1RUK1E5WHpONkM4Wk9vYXVURFVyNDJuQjQwTFEvMzYrWk45ZW0reUxYVGVZZDYyOTZ5emg1d2NoTFhUNjMvNHlEbmNYRnJCMHNhZWUwN3RPeFE1TkIwT1NsN2FydlUzalA5UUJrMGtMeEZDY09wRVNudG9lRkM3a083WFIwLzI2MmQ2VCtnYUMzK04wc3BHN3BqSlNsellPNzBlMVRYOHllTVg4RC85K0UySUkwNXZKWVNFL3k5TVlTc3F5MHZoOWgvS0lVenlVbFVFa1l5M3NJZUdCOWxZZWxDL2NMSVlGU1Npa2FaOGlMczF0M2k4eUlGTHVXdVA4ak5kU1h6ejNIMzR4dzgrUFl3bFZRUWhKSFNocUVKVkNJMy9zRC9YSDZtOFZHR3QyMGhyR3d5TllXU2dUeDhmSHRERzBnUDY2TWwrYmFBemVTeitUenBDeVBmdlRCMnZPZ2N1UkZYbDBOODZmeCt1enk3aTA3MlQ1NzVCUlE3SERjMmMzbG9HOWNsTCsrNC9uRXgxc0l1bkJyV3g5SUEyT3RTdjM5L1h3L2JhY3FKWllObU9MUHpULzdQbnpYNUNUZzZ5S2pPQkVvSS9lV0lNLytaN1AwZk9ydWhoSHpnb3BSQkNITm44Q2dlR2cvSWZ0ZzhTTG5ucFVQeUgxbWlFakE4UGF1UHBRZTFDZWtBN2Y3SlBTOFphMU1PWWk0TGoxSFRUQ1RjNXlPcklBUUJTc1NqKzFlZlA0YzlmZSs4Z2w3UWpsQ2ZkMURoTzhsSjVndGd1TDVWRlBmNkRSaWtlR09qUnhvY0gyZGpRZ0RZNjFLK2x1MUpNL2RlcURPczRrb01RY2srZEJoOGQ2c1cxbVVYOC9OZFRCN1drSGFISTRUZ2lWUEpTdy9rUGZjbDI5dENwUVRhV0htQVhoZ2EwQndkNldFUS9uSllUelFMTHFXMnptMUNUQTVkN0l3Y0ErSU9ISDhRbkN4bk1aL2ZjM3J4dXFMYmRUWTlHbFpkQzRUL0VUSk5jU0ErdzhmUWdHeHNlMEVaUDlyTlVhMXo5cDZrVGxzTnIwdEpEVFE1U3lqMDc4QkZkdzU4OE1ZYi84WWV2SDNwNnEycmJmU3h3ZVBKU3VQeUhFbEJDY0thdm0xMHNwcEt5QzBQOTdGUlBGMVAvUi9ZZkRqK0c1Q0JxSUFjQU9OWFpobStQbnNIZnZYOWp2NWUwSTVTc2RKeHh2RGNIT3RHV29BOE5uNlJqNlFFMmxoNWdJNE45ck5GYlRqUUxMSWZ2V0N4Y0NhRW1CeW5sbnZ1RmVQakd5REN1enk3aW8vbmwvVnpTamxDeTByRkJoUnRwcVB5SDZ1WXZjeXhpNkJnOTJjL0doejJ2b0ovMkpOdlVILzhSd2VGOHgyTGhTbWhJY3FpbTFZU1VFcUlPY2lDRTRJOGZ2NEQvN25zL3g0WlYwMmRYMDV3S3h3YU42aitVR2FsMmVZa1FnbFBkS2ZiUThFa3lsaDVrRjlMOTdHeGZOMlhxUWFoaFlITys1eG9Ib0lISVlTc2hWTE9iRzZXMHJxcTJaRXNFZi9qSWVmd2ZyNzVUenpCVlErbXB4dzVObDk3YUVZL1I4ZUZCNGtZRjlQekpmdHFzTFNlYUJRN2Z1UWRkSlJ3cE9SQkNpSlJTdXQ4cm5uZmx5aFZ5K2ZKbFdlYjN1bmYwK2R4Z043NXczd0JldmpsWjcxQzdRc2xLQ2tXRVExNHlkQTNuQm52cDJQQWdIVThQc2d2cEFUclFtVlJFRURJNFhJUW5jdkNpQkpjUVNvamh5cFVyWmYvNHRoNi9jdVVLaWFiUFp2WmpQYi8vOElPNHNaREI3TnFlTTJQM0JDVXJIVXVFUmw0NjJkVkJMNTQ2U2NiU2cvUkNlb0ErTU5CRGRYWXMyZzgxTld6T3Eyb3p0QldIVGc1YmlBSEE5aHYvNWN1WDhidS8rN3ZrK2VlZjMzR3NHVTUzZEpNZHg0R203ZjRXRGNid3AwK000WC80d2V0d0RyQzloU0tIWTR1R2s1ZmFXcUprYkhpUWpLY0g2Vmg2Z0Y1SUQ1RDJXSXY2QTIxQ2NDRnEyclBnTU1taGhCUThhZWpLbFN0a1pHU2s1SS95NnRXckNCSkRWMWNYV1ZoWWtCTVRFK1RTcFV2d2Z1NjUvOXlPa2NQR3hnWTBUVU1zRnR0MWNVUEpWdnpPMkZuOHpUc2YxZkRXcWdOVnNwSkNDUTVIWHRJWXc0TURQWFE4UFVqR2hnZkpoZlFBVFhkMXFpMUdqZ2tjem11cStEMHNjdkQvQ3IwbzRmTGx5d0JRUWd6ZXpUK0lHemR1a0V3bUF3Q2t0N2NYTjI3Y0FBRHkzSFBQWVdadWZrZERtakVHeGhpa2xGVTl0WC8xZ1RRK21GbkE5ZG1sNnQvWkhxRCtNeDVySEpTODVCNi9OMGgvUnpzZEh6NkpzZUVCTWo0OFNFY0crb2lwTjB6dWljSWh3Mm5ReUdHYlR3QUFJeU1qeEkwWVpGZFhGd0dLSk5EYjI0dUZoUVdTeVdSa01sazB2Z3FGQXVucDZaRUFFSS9IU1RhYmxRQVFqVVlSTlkxZDMzUXFsY0xNekF3U2lVUlZpLzNPWThYMDFteWhKb04vNS9FVk9SeDNWSmFYYWlTSVdNVEVXSHFBaktVSHlmandTVEkyUEVBN0UvSDlYN2xDYU9Gd1VaT1plcERrUUlCU1A4R0xFcnE2dXNpbFM1ZHc0OFlObXNsa2tFd21TVEtaeE96c0xJbkg0NGpINCtUTW1UTjQ5ZFZYeWVqb0tBQ1EyN2R2KzJOdWJHeklOOTk4RStsMHVyQ3IyZ29na1VqQXRtM291cjdyb3R1akpyN3oyQ2orN0tXM2EzblBPMEpsS3ltZ0R2K0JVWW96ZlNmbytQQkpqQThQWWl3OVNFNzFkQkdWSXEyd0V4d2hHa3BXSWx2a0kxeTllcFY0c2xFaWtTQUFrRXdtaVVjSWMzTnpwS2VuaDJTenhZNFlIMzMwRVVtbFV2Qis3K3ZySTNOemN3Q0FWQ29sTTVrTXlXYXpNdElTa3pxak8vN3Z1UFhwcCtqdTdhMktIQUJncks4TFh6bzdoSjk4Y3FlcWVvdHFRUW1waHNzVWppVzIrdy9kN2Exa2ZIZ1E0OE9EWkN3OWlOR2hmaEkxaktOYm9rSW93Ym1vcWMzUWZwT0RIeTFjdjM2ZFBQLzg4N2g2OVNvbUppWkliMit2THh0ZHUzYU5uRDU5R2hzYkd6NGhNTVpvUHA5SEpGSXNxSm1mbnllcFZBb0FzTDYrVG9CN2h1N3E2cXEzY1k2ME9SYzZvMlh6N2J3Yis4VDE2OGhrTWhnNWZ4N1JhTFNxTi9Jdnh1L0h4L1BMbUZyTmxveFZEd2lsSEExVWVLaHdaTmdXUFVRTkhhTkRneGdyRnBoaGJIaUE5TFMzSGRIeUZKb0pqaERydFZ5M1h6ZXFFZ2xwWkdTRWpJeU1ZR0ppZ2dCQWIyOHZtWm1aSVNNakk0akg0eVNSU0pDN2QrL1N2cjQrWkRJWkVvbEVTRnRiRzFsZlh5ZVpUSVlrazBra0Vna0lJUWhRV2ozZDF0YUcxZFZpN1pzUVFqcENjQUE3Sm1NVFFqQXpOWVdSOCtlcmZrTTZvL2lUeHkvZzMvN3dkZGhjZ0JCU04wRlFRdFEyY0FxZ2hPQlVUeGNaSHg2VVk4TW55VVBEZ3pqVDF3MUdkNDZBRlJScWdjUDVrVVVPMjJvVWd0RUNBQlFLQlRvME5FUzZ1cnB3NDhZTkdvMUdTVEtaSlBQejg2UzN0NWRrczFraWhDQ0VFSkpNSmtrdWx5T0pSQUxlZHoyd3VjZm01cVl2RCtWeU9Sa3hvN3R1Wk1FMERZVmNEajk2OFVWODhjdGZSanhlbldFMzBKN0E4Mk5uOGRkdmZ3Z1FVamRCRUVvUHQwZTRRa09nTXhISFdGRWV3dmp3U1Z4SUR5QWVNUUVsTVNvY0Ftek9hK3BCVnhjNUJOdGV1SFVMdUhMbENnV0swVUl5bVNUeGVKek16YzJSV0N4R3N0a3NTU2FUMURSTm91czYyZGpZb0psTWh1aTZUbks1SE5WMW5jVGpjVGlPUS9QNVBEUk5JeXNySzZTbHBRVUFZRmtXQVFERE1DUUFGQW9GY0NFcTlpb25oRUFJQVYzWHNibXhnV3ZYcnVIYzZDaE0wNnphZi9qeTJTRjhNTE9JOTJjVy9UR0IybVFtMTNOUWFHS1l1b2FSd1Q3NHB2SHdJQVk2azBlOUxJVmpqRU1saDYxVnpwNmNkUFhxVlQ5YUdCd2NwSE56Y3dRQVNhVlN4REFNa3MvbktRQXFoQ0RaYkphMnRiVVJ4M0dvcG1rRUFHV01FZHUyaVJDQ01zWklQcDhua1VnRW5IUFBLL0NmdERqbjBqUk5jQ0VydGxSMWZRa1loZ0hIdGtFWnd3ZnZ2NC91bnA2cXlRRUEvb3ZIUm5INWU2OWhKWmN2N2w5Vi9BejJUQkFxVzZuNU1OeWR3bGg2MENlQ0J3ZDZvYW1XRXdvTmhJTGwxTlNEcmlaeTJFb0tJeU1qWkdKaWdtUXlHVEl6TTBNNk9qcElOQm9sbG1WUnhoZ3hUWk91cnE1U1Z4NmlVa3FTeitlWnBtbkVORTNxT0E3bG5GUGJ0aW1sbEJpR1FXemJKb1poa0VLaFFFelR4TnJhV2trSXJ1dTZCQUF1eGE3a1lKb21iTnNHcFJTZjNiNk45dloycksydFZXMU9KMHdEZi9Ub2VmelpTMjlEZXUrL0JwbEpsYVNHRysyeEZvd1ZVMGd4UGp5SUMra0J0TWRham5wWkNnbzdvdUFjSGpuNDV2UFd1b1dGaFFVeU9EaElzdGtzOVNRa3k3Sm9vVkFndG0xVFRkTm9QQjZuMld5VzZicE9PZWVVTVVZc3kySkNDQ3FFb0tacEVpRUVkVytraEJESzJuajJBQUFnQUVsRVFWUkNITWNocG1rQ0FCekg4VEtYcEJCQ2lsMGlCODQ1VE5PRTR6aGdqRUVJZ1RkZmZ4M3A0ZUdxeVFFQXp2ZW04T3o5YWZ6ZzQ5dWxIOFllQ0lJUW9rS0hrRURYR0I0YzZDMkpDdEluVWtlOUxBV0ZQU09iTDlTMHRVSFY1TEJWU3ZLTTU2NnVMcEpJSk1pdFc3ZUlXOEZNbzlFb2ljZmpsREZHQzRVQ3RXMmI2cnJPOHZrOGxWSlN4aGhEVVVaaStYeWU2cnBPTGN0aXNWaU1DQ0dvNHppTVVrb29wU1FTaVJESGNZampPSENQQVFBY3g1RlNTaWsxVkN4bDlzaEIwM1VJSVh4eVdNNWtrTS9uTVRvMlZyVTVEUUMvTTNZR0g4MHY0VTVtL1I0aDdDR0NVT1RRdUJoSUpUR2VQb214NFVFOGRHb1FJNE45TUtwbzJxaWcwT2k0T2Jkd2NPUlF6bU80ZlBteW41R1VUQ2JKeHNZR0JVRHkrVHhkWDErbmpER1N5V1JZTkJxbCtYeWVFVUtZYVpxVWM4NEFNQ0VFTlF5RFdaYkZBRkJLcVZZb0ZDaGpqTHJ3dkFkSUtXbXd1Nm9RZ2tncEpXTk1XcWdjT1RER3dEbUhvZXZnbklOU0NzZTJvV3NhM243ckxRd05EeU1TaVZUVnVSVUFORXJ4eDQrUDRiOS84UmV3ZURGSmFpOFNFeUZFaWRFTmdFUTBnZ3ZwQVJUN0R3MWlQRDJJanNUdXpSa1ZGTUlHSVNUZXV6MjUvNFowSmVQWjY0MFV6RWlDU3d4dGJXMjBVQ2pRYkRiTENDRTBuODh6WGRjWkFNWTVaNFFRNXBHQ1pWa3NRQkNNRU1JSUlWUkt5UnpIb2JxdUU4ZHhDR09Nd0pXekhLY2tPVWxDeW9xUmczZkQ5aUlHUmlsc0tZdGVoSlQ0N05ZdHRMYTI3aWw2NkcyTjRWOWVmQUIvOWN2ckpYTjRCQkg4dkhaYWs4TGhnRkdLKy90N2ZHbG9mSGdRcDdxN1ZKOHJoV09CdkcxTEFBZXpuOFBXYU9IcTFhdWtxNnVyaEJpeTJTek41L1BVdG0xYUtCUW9BT1k0RGdYQXRPSmpPZk8rS0tXYVpWa2E1MXpUZFowNWpzT2tsUDQ1anVNd3hoaVZVbExPdWU4OWNNNEpJWVJvbWliZGRYbDMyRjAzZ05iY3lHRnJoOVliSDMrTUU5M2QwQVlIRVlsRXF2N1FMdDAzZ0E5bUZ2SDIzVm1RWU5SUXhRM0hrN29VRGdhOXlUYVhCSXBSd2ZtVC9ZZ2ExV2VtS1NnMEV5ekhFZFozLzZxbXA5R0s1TEJiWnMzRER6K00rZmw1MzJOdzkxeWdBRmcwR3FXNVhNNi80VFBHTk51Mk5VcXBCa0RUZFYyamxHcUVFRTBJb1VrcE5VM1RQTGxKUTlHUG9GSks2amdPSlM0QVFMaWI4VkJLcFVzUU83WlBGVUpBMXpSSUwySW92amNRQUp4enZQcnl5L2pkMy91OTZqOHhGMy80eURuOGVta1ZtVnplKzd3QW9JUjh5a1VJNm9sMS85QmlHaGdkR2lpSkNrNjB0Ujcxc2hRVUdnYVd3MnZ1eWxDV0hJSnlVbEJLOGd6b2wxNTZpWFowZEpEUjBWSENPU2U1WEk1T1QwOHpWalFNR0FCbVdaWkdDR0dNTWMyZFJ3ZWdPWTZqZThSQUtkVTQ1M3JnSFA5NjI3WVpwWlFTUXJ6b29ZU3czSnV3b0VERklqZ1BYaXByTkJvdE5yVVJBbEpLT0p4akk1dEZSMGNIRmhjWHE5b1V5RVBNMFBHZHgwZnh2LzNzTFFoUm5wakxTVWlLSEdvREpRU25lMC80VWNINDhDQk85NTRBVTdVakNnb1ZVWENjbW1XS2lwRkQ4S1lXYklueDNIUFBrWkdSRVhSMWRSSFROSWxsV1dSMWRaWEc0M0ZLQ0tGZUJCQ05ScGx0MjVvUVFnZWdhWnFtQ3lGMFFvanVFb0l1aE5Bb3BUb2hSSk5TNm03VXdGeFFGQ09Qa3NqQkErY2NoQkFCS25ja0J5a2xrcDJkWUpTQ01RWVFBczQ1cEpUZ2pnTUo0TVh2ZlE5bjc3OGYwV2gwVDd1MVBYQ2lBMTk3SUkzL09IRUw5NUtYZHBhWVZDRmNkZWhxVFpTMG5CZ2Q2a2VzMkhKQ1FVR2hTdGdPMy9YaHVSSzJrY1BXbGhoQXNmSVpLTGJFdUhYcmxwK1oxTmJXUnZQNVBJM0ZZbFJLU1FIUVFxRkFEY1BRS0tXYXBtazZwVlFUUXVpMmJSdU1NWjBRWXJpRW9Fc3BkU21sVHhpRUVFOXFZa0lJcG1rYVJiRm9qdUxlTnFPRTNHdERJU213SXpNU1FtQVlCcDUrNWhsOCtza25XTXBrSUtRRVpIRi9GU2tFT09kNDUxZS93aGVlZVdaUDBRTUEvTmI1TS9od2RobTNNMnMrb2U0a01hbmUrOXNSMFhXY0grcjNNNGZHaGdmUjE5RisxTXRTVUFnOXJQMGtoNjBJMWpPY09uVUtyNzMyR3VucDZTSDVmSjZhcGtrTGhRSnRiVzJsbTV1YnJKaGRXdlFYb3RHb1p0dTI3amlPcm1tYURzQWdoQmdBRENHRUlhWFVBUmdBZENHRXdSalRwSlE2WTR3SklUVDNPMFV4Y3ZBSUFvQi8wNVd5ZUhCSGNqQU1BMnRyYTNqeTZhY3hOajZPLy8zUC9nd0VnQ2ZFQ2M2aGFSb3N5OEt2Yjk3RTJRY2VnTEdIbnZtTUV2enhFeGR3NWZ1dm9jQ0xjbFc1YlVtOWlPSzR5MHFFRUp6cVRnVXFqVS9pZ1lFZUpROHBLQndBYkw1UDVCQ01Hang0VWNPTkd6ZElNcGtraVVUQ2E2dE52TXlrdGJVMVZpZ1VtS1pwbWhCQzAzVmR5K1Z5dXFacEd1ZGNsMUlhbEZKVENHRUlJVXhLcVE3QUJHQXd4blRPdWVGRkVaeHpqVkxLM09oQlk0d1JLU1YxMTBZQ2E1VUFKQ0c3YjhadUdBYlcxOWVSU0NUd2pXOStFM2Z2M0NtNWlMaFMwMDkvOUNQY2QrYk1uai9FRS9FVy9NSG5SdkNYYjF6engvTytiNVdZanB1c2xJekh2RjNMM0pZVGcyaHRxVDR6VEVGQm9YYllEcTk1ditPS2tVTWdkZFdQR3VibjV3a0E0dlpMSWtJSWtzdmxhQ3dXb3dDb3J1dXNVQ2hvanVOb2hCRGQ5UnNNSVlTSll1UmdhcHBtMnJadE1zWU14cGlCWXZSZ0NDRU1Rb2huVFB2bXRCQ0NvU2dwbGR4VmhSQ2dsQXJJM2NtQk1ZWmNMb2Q0UEk3UkN4ZkFiUnR2dmZXVzM3V1ZVZ3JIY2JDNnVvcWxoUVYwcEZMd09zRldpOGZUZmZoZ1poRnYzcG1GaEN6eElJQjdFbE16Unc2R3B1SEJ3VjZmREI0NmRSS0RxWTZqWHBhQ3dyR0Z3L2VCSENwNURWMWRYY1NMR2pZMk5vaGxXY0dvZ1hyMURDaG1HSGszZFUzWGRZMXo3dC84Q1NFbUljUjBIQ2RDS1RVcHBRYm4zQVJnU0NsTlNxbE9LZFc5MUZZQW1sY1FGOHhZOGp3SFY3NFJkSGR1QUFCRW8xRXNMeStqczdNVFBYMTl4WnUxbTlvcU9QZUw2LzcyYi80R2YveXYvM1ZORXRBZmZHNEVONWRXc0pqTlZTeDJheWJQNFdSWHAyc1lGMzJDa1lFKzZKb3FBbGRRYUJRNFF1eC81QkNFVjlPQVFOU1F6V1pwb1ZCZ3VxNnp6YzFOWmhpR1ZpZ1V0SmFXRnMyeUxFMEk0Wm5OWG1SZ1Npa2poQkFUUU1TTkprd3BwWWw3M29QdWVoRWFBT1lTQS9NTWFUZVRpQkJDcEh2emxaVHNiY09VUXFHQXZ2NStQUFhrazNqbm5YZjh6cTIyWGF5bDI4emxvREdHalkyTlBWVk9BMEJVMS9DZHh5N2dmLzNwTCtHSTB2UmlqeXhvU05zNXQ3VkVNWm9ld0VOdWNkbFllZ0RKdUdvNW9hRFF5TEE1cjZrNkdnaVFRNlUyM0pjdVhZTGJWQThEQXdPWW5Kd2tMUzB0dEZBb2tHZzBTdHgyMjB4S3lRekRZSTdqYUVJSTNmVVYvS2dCUlkvQnBKUkdPT2NSU3FsSkNERmQwakFCNkZKS3cxMlRKcVhVS0tYTTlSc28zQ3BwU3FtM1Zra3BsYklvTzFVRjB6U3h2cjRPMHpUeHhOTlA0OW9ISDRBUzRtY3NBVVYvSXJlNWllWGxaWmpwOUo3MmZRQ0EwNmwyZkdQa0ZMNTcvV1l4R3dxbGFjRitINUFHYnFPaE1ZWUgrbnY4Vk5LeDRVRU1uMGcxdFNTbW9OQ01jRGd2MUhxdEJwUTNvajBrRWdtU3krWElSeDk5UkZPcEZLWEZIRlVTalVicHlzb0tTeVFTTkovUE04ZHgvT3BuTit0SUYwTG9uclFrcFRROWFZbFNHbkVKd1hTTmF0T1ZsQXhDaUE2WEhJUVF2cVFrcGFRMHNNZXVWekR0bmwvOUc5WTAzNXoreWxlK2dyKy9laFZBc1djVFpReWFwcUZRS09EbnI3eUMzdjcrUFpNREFIeGo1QlFtWnBmdzZXSUdrS1daU3F3Qkk0ZitqbmFNQlhZdU8zZXlENUVhM3JlQ2drSmp3ZUVpVit1MVdyazJHZDQrRFY1ZFF6d2VSeXdXSTVGSWhBQWdDd3NMMUhFY1pwb216ZVZ5ek8yZXlqam5QakU0am1PNFdVbzZBSU5TYXNDTkh0eXZDSUNJR3kyWVFnZ0R4U3BxM1YxWHNDY1RDV1lyQldvZHBOdmx0Zm8zckduWTNOeEVJcEhBQXlNamFHdHJBK0NTQTZXK09iMjJ1b29QUC9nQUk2T2plOXIzQVNqNkN0OTViQlQvOWdlL3dJWmwrNTU1MEpUMmZqN3M2Q0VXTVhGaGFLQWtLdWhxVFJ6cUdoUVVGQTRIanFpREhDcTk4UHp6eitNdi91SXZBQURSYUpUMDlmVkJDT0ZuS0xsTjhhaGhHRjRYVlVZcDFkeWlOdzJBWnpDYkFFeFBXdko4QnltbEp5ZDVYNFpYR09kbExibHlraWN0K1ZYU2dadXJyT1htMnRMU2dxV2xKWFIyZHVLcnYvbWIrUFRHamVKT2NlNVR2V2RPWjdOWjJMYU5TQ1N5WjBtbE14YkY3ejg4Z3YvekYrOFhEeEFKZ0d3cm5ONnBEMU85WUpUaWpOZHk0dFJKaktjSGNWL3ZpYVl5eFJVVUZDckQ0WHl6MW1zMVlMdmZBQUEvKzluUENBREU0M0d5c0xCQTh2azhTYVZTUkFoQlROTWtxNnVyeENNR3VCbEtia3R1VFFpaDY3cXVDU0VNVHk2QzZ6L0FsWmc4bVFuRkNNSTc3bGRPd3pXazRSYkJBU0J1eE9DdlYvcW9xaUZxQ2FTVXNHMGJENHlNd0RSTnZQM09PekIwSFhDUGUvajV5eS9qQzEvODRwNHJwd0hnOHlkN2NIMTJFYS85ZXJwNGdBQ1VzVkpDMk1jYjlZbTIxbUwya0VzRW8wUDlpSnJWRi9RcEtDZzBGemdYOVpGREVKY3ZYOGFWSzFmSXBVdVg4UERERCtQYXRXdCsrbW8ybXlXNVhJN3F1azdkalh1bzR6ak1NQXlmSUlRUUdpRkVjeHhIZC8wQW5WTHFtYzBHcGRTcmFRaEdERjVLcXk4cklkRG1HMFZpb0ZzaUIza3ZlaERZNnlacmtVZ0VLeXNyNk9ycVFxcXJDNHhTYUl5QkJ6S1hBT0M5ZDkvRjZOZ1lETU9veVgvNGx4Y2Z3S2VMSzVoZkwvNGJiWHRxcjNFLzZxaWg0M3l3STJsNkVEM0p0ajJ2VDBGQm9YbmhDTEZSNjdYYnlNR3JpQWFBVzdkdUVRRHdKQ1czUFRkbGpGSE91YmRmQTdWdG16SEdtS1pwekhFY2pUSG1OOXp6U0FIM2l0MjhxR0hyY1NNUU5mams0TlU2QUNCQ2lLMFYwb0FiUUFCN1Mya0ZpdjdEeHNZR0VxMnQrUFp2L3piKytidmZoY1E5V2NremtOLzcxYS93eFdlZnJZa2NJcHFHN3p3Mml2LzV4MitDQ3drQ0lnZ0I5Wlpia3NsVWdTQUlJYml2cHl0QUJDZHh0cjlidFp4UVVGRFlFUTRYMlZxdjlja2hLQ2tCeFN5bGE5ZXVrWjZlSHBMSlpFZ3FsU0p0Ylcyd0xJc1VDZ1VDVis1eE4rZnhkbnJUNE83SjROVTR1TEpTc09iQml5Z01Rb2docGZTSndZczBwSlFhS1c2cDZVbEwzbnhBZ0FROFUxcElpVnB5Z0hSZFJ6YWJSU3dXdzduUlVYei9uLzhaRHVjbGtRTmpESi9ldkltVDZUUk9uejI3WjNNYUFOSWRiZmpXK2RQNGgydWZnREhHSVVHQjdVMzZQSW1wTXhHL1p4aTdqZWppcWlPcGdvTENIdUdJZlNBSDRGNlR2VXVYTGdFQWxwZVhpV21hV3lVbFlwb205UnJ2b2JqL3MxOGxUZHoyMjR3eEpxWFUzRzZydnBjUWtKZzhDVWwzTndIU3ZaWWJXektWcVB0RjRHN3BFS2lTZHMwSDFCUTVBRVZ6ZW5sNUdSMGRIWGppcWFmd3M1LzlyR1FyVXNvWUNJQTNYbnNOL1lPRE5aRURBSHp0Z1RRbTVwYncvcDBaU1FncGNnT1JNRFFOSTROOS9wN0c0OE9ENk85TTFqU0hnb0tDUWhDMnc5ZHJ2VmJiS21OTVRFejRXNEFPRFEwaGxVb2hIby9qOXUzYnBLMnREUnNiRzVReFJoaGpSQWhCTlUyamJ2K2pJRGw0MFlPWGt1cDlMOGxHY3VjUGtvTC9tdHRDdysvSTZxV3lDaUg4VGhwK0c0MHFXMmlVQTNHYjdqbU9nOGVmZWdvZmZmd3hITWZ4bitpcDZ3ZFlsb1UzWG51dFpuT2FFSUkvZXZROC9uM0J3dWY2dXpDV0hzU0Y5QUFlR09pQjFvQzFEd29LQ3VHSEkwVHQ1RkRwaGRuWldaSklKSkRKWklnUWdoaUdRUnpIb1pxbUVjNjU1em40MWRIZUpqOXdaU1d2UStzdXBLQzVaT0ovZDE4THlrcGVwcEluc1B1NzFMbHROR3BLWncwaUdvMGlrOG1ncTZzTHYvR2xMMkhpK25Vd3h1QTREaGhqRUc0YjdyZmVmQk9QUFBZWVROTkVjV3ZzdlNFWmplQy8vdktUK3JtaC9ycldxNkNnb0ZBTkxNZFpxL1hhRWtmVE02TWZmdmpoa3BOMFhTZTZyaE1BWUl3UlNpblJkWjFxbWtZTnd5Q01NZW80ams4TTNwNE1nUnMrODc3alh0ZFZMNkpnM3BlN1JhaFBERjZkQTBvTmF0K0xjTDgwN0VPTmdGY2NONVJPNDZ0Zi8zcXg1eExueFozaFhEOUFTSWxDUGcvTHFybVgxYmFlU3dvS0Nnb0hCWnZ6MVZxdjljbmg4dVhMMjE2TXhXSUVBTzdldlVzQXdIRWNhbGtXc1cyYlVFcEpvVkNnYmxzTDZtM3JLYVVza1ptOEd6NmxsQVVqQjQ4NGdsOG9UVi8xNnh4d3o1RDIvQWR2YjJrdm02blc5KzlEMTNXc3J4Y2pNT3B1S1dyYmRwRWNDQUYzMjJ2WXRvMVlMRll6UVhCUjg1YXVDZ29LQ250Q3diWnJKZ2NOS0dtMjU1dlJwMCtmUmphYlJTUVNJWkZJQkpxbUVkTTBzYm01NlhrTjNwNE92aW50L3V5UkF2VzIreVRGenFyK1BnMElSQUZlRVYwZ1piV0VBRnc1aWNwN0cvMXNNNTREcjlVRlQxNUtKcE40K1BPZngyZWZmUWJHR0tSbGdRc0I1cmJXTUUwVDJXeDJUenZHZWVBcWNsQlFVRGdrckc3bVZtcTl0bXlpL050dnY0MjV1VG1TeVdTSWFacGtZMk9ENVBONVVpZ1UvS2dobjg5VEwzTFkrdVhKUVlRUVNpbGxsTkxnamQ3M0VyWlVRUHRFNEgwRmYzZWI3Z1hKZ2dvaHFKU1N5SG9jNmVDSFFTbHMyd2JuSE8zSkpMaHQrNDN5Qk9kK05NRVlxN25kaFJUN1EyUUtDZ29LdTJGbU1iTkN0cURhYTh1U1F6S1o5SXZmQUtDOXZSMkpSQUtNTVJLSlJFQXBKWkZJaEppbTZUWEU4K1VsRDU2OEZDUUVGRDBKRnJ6QmV4R0RkRGYxd1QzejJYc2pYdnJxMW1NK1dVanMzdzNYUzIzdDZlMkZiaGlnbEJaYmVnc0I2cHJVZTYxbURrSklGVGtvS0NnY1BJU1UrR1I2WnYyRkYxNGdMN3p3Z3Q5NXUxcVM4TW5CNjhSNjQ4WU5BZ0RwZE5vL2FYTnprK1J5T1dKWkZ1R2NVOU0wNFRnT2NSekhiMnZoa1lSSERMZ1hPWlJFQUFIZndKT1Nnb1JBM1d1OGJVR0pGeUhBclhOd0pTU2ZOQUFRdWM5U0RXTU1zWGdjanozeEJBWUdCeUZSM0piVXkyQ3FDdzI2aDRPQ2drSnp3YklkZWI0allWMi9mcDFjdjM2ZFhMbHlaUnRKN0hTOVR3N1BQLys4bkppWUlBQnc3dHc1QUVBbWt5SHI2K3NrbDh1VkRPSkpTMFcxcUhnMzk2SUh6cmxmbHdEdnlUNGdON2s4RW93Q3ZHT0FlL01QRUFBTkhQZmVqMytPZDU3WVozSXdEQU5yYTJzWXZ1OCtmT25aWnhFeFRYRE93VnpaeVYxSVRXTXJibEJRVURnTTVHMUhmcUcvUXdCZ3lXU1NBcUJCa2dCMkpnaWZISUk5bFg3ODR4K1QyN2R2bzd1N0d3RFEydG9LVGRPSVYvem1SUTJjYzBJSThRclRTaVNmSUNuQUpRQzRrY0FXazVrSUlmelhnMThlQVpCaUlacDNESUhYSUlRNGtIYlhYbU8rZUNLQnIzNzk2OFhJUWRQcWpoekkvdGdqQ2dvS0NqdkNjaHd4UFQydHhXSXhhcG9tblo2ZUp1Zk9uU1BYcjE4bkFMQWJRWlI0RGlNakl4SUFlbnA2L0R0WVIwZkh0b3NjeC9FSDlmWjRDTUlsQUQ4eVFFQTJDajd4QnlLSmJjUUErRmxJd2FnaStCM2VXUHNkT1FCRmFhbFFLRUFJZ2ZNWExxQXJsZkt6bGVvQlVkeWdvS0J3Q0xBZGg3ZTN0N05VS3NVMFRhT1daYkhyMTYvVElFSHNKREdWa0VOWFZ4Y0JpdFhSc1ZpTXpNM05sWndjckhGd0MrSDhnYjJPcVFIWngvTUpFQ0FOWDRvS1NrT3V3ZXUzNC9iSXdKdlhpeEtDYitZZ29vV3RpTVZpV0ZwYUFpRUVYL3ZHTi94c3BucWdJZ2NGQllYRGdPVnd2clMwcEsrdHJXbUZRb0VaaGtGanNSZ05Fc1NWSzFjcWJoRmQ0am04OU5KTEFJbzFEZ0RRM2QyTjVlVmxBRUErbnlkYm04NTVzaEpqREY3MDRKRUV2ZGRPT2hncElCQTViSHNkVzZRazRCN1pvRFNpZ0JDQ2NNNko0empFdHUwRFN3OGxoQ0NYeStIOGhRczRPVFJVdCtkQUQyeWxDZ29LQ3ZkZ093N1hkVjNUZFYxekhJZTVIUzFvVDA4UG1aNmVyajViS2RnNjQ5TlBQd1VBdUx1OWtkYldWditDU0NRQ29FZ01Xd2NMRXNNVzB4akFQUm1JRU9LUlI3RDk5azdybE83MS9qanVmQkJDZ1BPRHF6cU9SQ0pZWFMwV0dYN3hTMStxZXc4RnBzaEJRVUhoRUdCejdnRFFPZWNzRm9zeHgzRllhMnNyV1Y5Zko1bE1oZ1NqQjJDN3RMVE5jM2o3N2JmUjA5TWp1N3E2L0ZoamJlMWU3Nlo4UGw5MklZd3hVRXJ2cFJRUklpbWw4TDc3RTdybmJLMXEzaHJhQkxTd1luUHJnSnpra2NKaGtBTndqeUJTWFYzNDFyZS9YZGRZdExiTzRnb0tDZ3BWUXdpSjViWHN2TmVsZ2xKS1cxcGF5T2JtSmtrbWs2U25wMmZYRzFGSmE5R3VyaTZTeVdUOGZhTzk0N2xjenZjWElwRUlDQ0Z3SEdlYlVDV0U4Q1FtZU45bG9NMzJWaS9CZ3lzM2VkK0RXNEVHSXhUcGVROWJDV0p6Y3hPV1pkWFV6cUlhYUpxR2JEYUwxdFpXWHk2clZWWlNrWU9DZ3NKK2d3dUJPL09MMmJ2eml6Zm5GcGQrdm5EM3p0OXR6RS9mZGZmYW9aWmxFY2R4U0tGUUlJN2pFTk0wNFVwTEZVM1FFbko0NmFXWDhOeHp6MkYrZmg0QWtNL25wU2NqQVVBdWwwTTBHb1ZsV2FCdTVrNndkYlVRd3I5NWVqZHU5OGsvR0FuNDV3Y0p3U01EYkpHUUFzZTNSUm9lU1RpT2c4bkpTWnc2ZFdwUEgraGVFSS9Ic2JpNGlLNnVycnJHVVZ0N0tpZ28xQXN1Qk83TXptL2NuVis0UFRzLy84YkNuZHZmeTYrdXpGRktMYzY1eFJpekFJQXhKZ2twelpHTXhXTFNjUnowOWZYSlRDWlRjWTRTY3JoMDZSTGVmdnR0RkFvRjlQVDBBQUFzeXlvWk9KL1BnekVHempuUjNMeC9UejdTTkUzSzRwMWVia2t2OWNlUTk2clpKTzV0MkNQTGtJRi9TWkFnUEZMWUdrR3NycTVpYm03T3I4MDRLTlFib2JBYUl3NEZCWVhqQzRkejNKbWQzNWljbTdzN016djM3dnhudi81cFlTTzdSQ20xaEJBV3BkU1NVZ3BDQ1BlK3BKVEMreUtFQ002NTZPam9FSXVMaTNKalkwTjJkbmJ1T0tkUERoTVRFeElBNmUzdHhaZSs5Q1Y1L2ZwMS82Um9OQ29keDRGaEdCS0FwSlJLU3Ftd0xFc3l4cVFRd3J1QlN3REJpRUZTU3FXN2FZN0hBTVY5bjkwb0kwQUVKUkdEaHpKa3NRMGVVZHk5ZXhkdGJXMElSanY3Q2E5cmEzZDNkKzJ5RWxPUmc0S0N3czZ3SFFkM1p1WTJKMmZucG1kblp6Nll1L1BaYTNZK3R5cWx0QWdobGhEQ1lvejV4T0I5dDIzYlpvelpRZ2hIMTNWSDEzV0hjODRkeHhHTzQ0aTF0VFdaU0NTa1lSankrdlhyOHR5NWMvTHk1Y3Z5aFJkZThPL2ZIbnh5R0JrWklSTVRFemg3OXF5OGZ2MDZtWnljUkNxVjhrK01SQ0xTS3dDekxBdHVHMjhwcFpTdXR5QUQ2YWMrQ1hpUkJBTGJlZ1pmOTM0T0h0KzZ5Q0FDY3dCQVNSVEJPY2NubjN5QzBkSFIrdjkxS3NCcnJWRXJsS3lrb0tDd0ZaWnQ0ODdNN09iVXpOemM5TXowaDNOM2JyL0ZiVHZyRVlFYkdWaU1zWUlRd2dMZy9XNEpJU3hDaUUwcHRSekhzUjNIc1FIWUFHeEtxZU00anFOcEdzOW1zMElJSVRLWmpEeDM3cHd2S1ZWNjBBMm1tcEtyVjYrU1RDWkRrOGtrNmVycW9uZnYzbVh1SmoyTWM2NUhJaEZkMTNYZHRtMVRDQkdSVWtZQVJDbWxMVUtJRmtwcERFQWNRSXdRRWdNUWwxTEdBTVFKSVMxU3loWkNTSXNRSWtvSWlSQkNEQ0dFU1FneFpISGJVSDhQYXBSMmJmWFRZcjEyR1c3N0R0aTJEZHUyNFRnT2JOdUdaVms0ZGVvVSt2c1BiaXZPOWZWMU1NYlEwdEt5NTJ1bGxCZ2NIRHlBVlNrb0tJUUZCY3VXZDJabThwUFRNM016MDlPZnpFL2VlWjg3emdZaHhKSlNXbExLZ3ZjekljUUNVQUJnZTBUaEVRR2wxQUpnRTBKc3pybERDTEVkeDNFTXczQWN4M0VZWTN4dGJZMVRTamxqaktmVGFRRkFCS09Hb09vVGhML1p6K1hMbHpFeE1VRXVYYm9rRnhZV3lPM2J0NUZLcGFTWDR4K0pSS1JwbW5KemM5UDNGNFFRbmtRa2k3MzNwS1NVZWpxWEh4MEV2aEE4SG93V1NPVzlvQ1g4V2ppNVBSZTM2SGVVUkJTM2J0MUNSMGNIdGhidDdSZmk4VGlXbHBacUlnZENTTEdKbjd0UGhJS0NRdk1qWHlqSXo2Wm44bE16TXdzemsxT2Z6azlQVGtnaE5sMGlzQWdoUVJJb2tZcTg3d0JzeHBqdE9JN05PYmU5MzRVUWpoRENNUXpENFp3NzBXaVViMjV1Y3NZWUo0VHdXQ3dtTE1zU2xZaWhFalFBdUh6NXNnUkFSa1pHNUkwYk4yZ3ltZlJQS0JRS3NxT2pROXEyamMzTlRmKzRFTUx6R2lRaFJCQkNCQURCT1pkdUxZUDNKUUNVa0VWeGt6Z1JkTkdEOGxLSkRJVjdXVXArUnBPVTB2TXdpT2RkZUlWMVhvdUxEei84RUJjdlhxejdIN1VjQ0NFbGt0dGU0WG93KzdnaUJRV0ZSa0l1bjVkM3BtZnlrOU16Q3pQVFV6Zm5KKzkrTEtYTUJ5SURpMUxxRTRHVTBnSlFRZ2dvU2tNV3BkUW1oTmhDQ0FmRktNRVJRamlhcGptV1pUbVVVbTZhcHBQTDVUam5YRERHdUpSUzVISTVrVXFsQkdOTW9IZ2Y5bjBHb0VTYUwvdFVYaEk1QU1EWnMyZGxJcEhBdFd2WC9KTldWbFlncFVSYlc1c0VJUFA1dkg4alo0ejUwWU43WS9jVzRybmszbzFlU0NsOW9uQi9sNVJTZ1lEUDRKS05GeVdBY3c0M0tuRmZKcjVKVFNtVmhCRGlrWUtiUlFWS0tWWldWakE1T1ltQmdZSDkvRGZmRjlpMkRkTTBqM29aQ2dvSys0VE5YRTUrTmpXZG01cVpXWnk2TzNscmNYYjZVeW1FVHdZZUVjRDFDand2SWZqZFBkY1dRdmllZ1NzUitkRUJwWlJMS1IwdktqQk5rNHRpSVJrM1RWTnd6b1hqT0tLdHJVMDZqaU1tSnlkbE1wbVVOMjdja0o3WEVJd1lkdkozTlU5dnVuTGxDaGtaR1NsNWNYcDZHc2xrVW01c2JDQVNpY2pOelUyWXBpbDFYWmVVVWxrb0ZLUnQyOEVNSmlsY2x2RGtKUVFpaHlCeHVPc3F5V0RDOWpZWjJCSTlTSmNjaUpmcHRMWG9Ma2dVbjN6eUNUbzdPdzlNWHFvVjlUYnZVMUJRT0Zwa056ZmxuYW5wM09UMDlPTDA1T1RONWJuWm05NU5QaUFURlZ5cGFOdVgrN29kaUJBOFVuQjBYZmZKUU5NMDdqaU9ReW5sdXE1ejEwTVE3ZTN0WEVvcE9PZENTaW1XbHBaa0twVVM2K3ZyTXAxT2krbnBhZG5YMXlkbloyZGxKcFBCTTg4OEl3SGdoUmRla0MrODhBS0FuWWtCQUxUZzY4OC8vN3k4Y3VVSzZlM3RSYUZRa043VGJTd1drNXFtU2NkeEpPZGNSaUlSYWR1Mk5FM1RKd0FQVWtxcGFSb0g0RWxOTWtnUzJDSTNlUkVFc00yZjhDSU80aEtMMzNRdkVEbDQ3NUY0Qk9IdDcreGxMMDFNVE9EaGh4K3U2dzlodjFIM2JuSUtDZ3FIaXZYc1JqRXltSjVlbUptYXZMVTRPL05yNytZZjlBMjhLQ0g0T3lIRTRwemJybnhrdXdWcXRwVFNvWlRhUWdpSGMrNW9tdVlBY0tTVWptM2JuRkxLQ1NIZXZaUnp6b1ZsV1lJUUlncUZnblFjUjhSaU1RbEEzSGZmZlhKNmVscW0wMmtKQUpsTVJ2YjE5VWx2NDdZWFhuaGhXNjNaYnZBaUIvL0FwVXVYY09QR0RadytmUnJaYk5aL1lYMTlIYnF1UzlNMHBlYzNvQ2duQ1ZmZUVRQ0VHL2I0aE9EK3prV3hLczczSnR6WGZTa3FHRm5JWXJ2dm5kSlpKYVhVTDRpamxFTFRORWdwL2U4ZVdXUXltWWFUbHc2NkY1U0Nna0o5V0YxZmwzZW1wamVucG1jV3BpZnYzbHBaWExpOTlZWVAxenplK2xXT0VJSytBZWZjMWpUTkp3Rk4weHhkMTNtaFVPQ1VVdTQ0RGdjZ2JOc1duSE9SU0NRRTUxeGtzMW1aU3FWRUpwT1JqREc1c0xBZ0FjaSt2ajU1L2ZwMUNRQjlmWDBTQVA3MmIvKzJ4R3l1bGhDQzhIZFg4enJ6all5TWJFdG5UYVZTTEp2TmFwcW1hWnVibTRaaEdMcmpPQ2FsMUpSdU9xdW1hVkVwWmN4TldZMUpONFhWL1lwSktXT1UwaGIzbktpVU1pcWxqQkJDVEFDRys2VUIwQUV3S2FWRzd1MDM3ZTlWN2ZWcEN2UnQ4bHBvRU00NUxNdnkwMXU5MUZZQWVQenh4dytzT0s0V05CSlpLU2djZDJUVzF1VGRJaG5NVDk2OWMzTjllZW1PRU1MMm9nQzROMzN2OTRCMHRJME00TXBFUVJOWjB6UkhDT0VRUXJqbkhYaGtRRFczUjBjQUFDQUFTVVJCVkNubFFnakJPUzhoZy9YMWRaOE1Fb21FbkoyZGxjbGtzb1FNUEhNWktJME9nTm9JSVlqZzFwdkFsbHFIalkwTm1rcWw2T3JxcXRiZTNzNDJOemUxWEM1bkdJYWhFMElNU3FrcGhJZ1FRcUlBb2tGaThHb2VoQkJ4eGxpTFN4WWVhVVNsbEZGQ1NBU0FSdzRtaXNTZ0VVSjhjcERGbWdlUEhJREFGcUhlZDg0NWhCQ3diZHV2ZmRoS0V1M3Q3UWVXdmJSWGNNNHhORFIwMU10UVVEaTJXRjVaRlhlbXBqYW5wbWZtcGlmdmZycWVXWjdhS3htNE5RVWx0UWFIUlFaYjAxRHJKWUp5OEN1a0E1SER0b3dsejNqT1pyT0lScVBTTUF5cGFackk1WExTTTUvaG1zNmVjKzUrRndCOFNVbEtLYndQQnRzOUIvOW56NFB3NEhrTHFMRC9nOWZzejYzWUpvd3hhSnJtN3k4dGhNRHk4akttcHFZT3REaXVXaHpFdHFZS0NncVZzYmljRVhlbXB6ZW1wMmZtcHU1ODltbDJkV1dtbkR6a0VzTTJJOWx0YU9jVGdaVFNpdzRjS2FWUEJweHo3a3BHM0xJc253eHMyeFpTU21GWmxrOEdBRVJyYTZ2MHlDQ2Z6OHVOalEyWlRxY3J5a1JYcjE3MWllQUErS0FFL3I3TVFKRWdSa1pHU0ZkWEYzbnBwWmZvME5BUXRTeUxKcE5KbWt3bTJmcjZ1dVk0anM0NTEwbXh1amxpbXFicE9FNVVDQkdobExaNDBRT2xOTFpGWG9vRlpLY1dTbWtVZ0ZkbDdVVVBPZ0JkU3FrRFlJUVFCb0FTUXFnUWdycm1kRERhOGFNZXpqbWtsTEJ0bTNqVjBsdS9wSlI0NG9rbmpqeU5OSi9QKzd2dEtTZ283RC9tbDViRjNhbnA3UFRNOU56VVo1OTlzckcrTnJlVkRJSy9CeU1DbHlEc0xmVUd0cFRTOFg2dUpUTHdER1NQREFxRmdnQ0tCQkNzUHdCcU01RDNHOXJXQTRHTUpkbmQzUzA5VXpxVHlhQzF0VlV1THk5TDB6UWxBT2taSmxKSzdrWVBmczR0QVA4cmFFNEQ4Qng0UDdyd1h2Y0s2dHlmZzF1SGxoVEVTVGRqQ1lGb2dsTHExemdFRGVyZ3ZnKzJiZVA2OWV0SExpK3B5RUZCWWY4Z0Fjd3ZMb3E3VTlQcmsxUFRjOU4zUDd1UnkyWVh0aGpJMitvTXRtUWIrYjJKdk9pQUYzZFNLeUVEejBEZWEyVGdwWmR1Ykd6QWl3eTJTa1RCcU1Dck96dEthRUJwNTFOdnUxQUF5R2F6MG0zQUp5bWxjbkp5RXE2a0pIVmRGNVJTNFVsS2p1TUlUZE9FbEpLN0ZYbytPUkJDSEFDTys3dFhITWU5VEthdDlROG96VmdLdHZVTzZtd2xtd0lGT3J4S3o0dllLaTlKS2JHMHRJU1ptUm4wOXZZZStJZGJDWW9jRkJScWg1UVNzd3VML083VVZIWjZlbVptNnU1bk4vSWJHMHU3WlJLNUJHRWpJQlY1VGVwYzJjZ2h4UVoyRGlIRTlvaEFDRkZDQmxMS2ZTZURJd29PZGdSeG44SjllY2FUbHJhYTBrSUlsczFtTlYzWE5jNjViaGlHTHFVMHZLd2xBRkVoUkF0akxPbzRUa3pUdEdEV1Vvd1FFaU9FeElRUWNUZGJxUVZGWXpvQ0lFSUlNUUFZVWtxREVLS2hTRnpic3Bad0wzc0oyQ0tMZWVZMDU1eHd6ckZWWHZKTWFnQkhLaSt0cjYvandRY2ZQSks1RlJUQ0JpRWxadWJtK2QzcDZmWHA2Wm1aNlR1ZjNTamtOcGUzU2tHQm43ZkpSSVNRRWpJZ2hQaFZ5SXd4SjFCMDVsY2lCNldpM1dRaWp3eUE3VEpSdFJYSmpRWU44QmRjMG9GcFptWkd6c3pNa0VjZWVVUm1zMWxwbWlZc3k1TFJhRlI0Qm5Va0V2SDdKREhHQkdPTUErQ1VVb2NYay9sOUNRbEZHWW5qWGdUaG5jdUZFTncxcTRWN25PRmVieVdCZTlLU3Y2MmRSMmh1eE9DLzdFVVFYclcwVnprdGhQQ2xKc3V5OE9HSEgySjhmUHhRUHVTdFVKR0Rna0psQ0NFd1BUZnZGTWxnZW1iNjdwMGJoYzNObFdDUkdRSVJnUkNpeEVEMmVoV1JRQnRyRkdVaW14QlNrUXcwVGVPRlFvRzd0VnQ4S3hsZ2k0SHMxUmtFRGVSZ2U0cXJWNjhDS0pKRGlEakJoKzg1YkMyR0E0RG5ubnRPenMvUEU2Q1lzUlNMeGFSYkRDZUVFTUsyYldHYXB0ZHdUekRHdkV5a29PZmdiUGs5U0F5T0t5dHhsR1l2Y1pUV053aFNoQmVDQmZjKzllVWxvT2c5ZUFWd0FFcEl3U01OVGRPd3VMaDQ1UEtTZ29KQ2Njdkw2ZGs1NTg3VTFOcjAxUFQwek9UZFQ2eDhiblZMMnFoUEFKenpFb0p3aldQYmZkMG14WDVGTmdEYnR1MnQ3U2djMjdhNXJ1dE9PVEx3aUlCekxuSzVYRWxxYVRreThMS0pybDY5Nm4wUExSbHN4VFpEMnNQSXlJaGNYMTlITnB1VlhWMWQ4dTdkdXpLVlNra0F3Vllhd25FYzMyZ09Fb09uMjNIT1BSTHdTOE1CT0VLSWtxZ2ljSDJ3THhOMWY2YTQxNXpQSXdicUVacjdYVzZKSm54akdvRGZKanNZU1h6ODhjZm83T3lzYTl2UFd0QU1memdLQ3JXQ2M0NjdNN1BPNVBUMDJ0VFUxTlRzNU9RTmJsdi9mM3Z2dHR6R2xXUU41ejVVRlVDUW9pQ0xFdDF0OWJnVmJvMC8yWE1LMzdUVUhaLzlSOHpGdklDZVI5SnI5Q3ZvY200bll1eVlpTDVUekVXSEdQNWt0MjJSS1BBQVNSQ0pZOVhlTy9PL3FKMmJHMFZRbG16S09yaFdCQUlBQ1pGQVNhcFZLMWZteWxHdFd5aVl5UDVrSDg4ZWhOZkFzV0ZjK3U0aEU5OG5TUktpS05JMHRaUEpCTDJCdkpRTWhCQTRHbzFldXJYMFRUQ1F6eHFCSFBqRWUvdjJiYnA3OXk1Y3YzNDlsSmw0dDRNeEpnVHRjUXlzTVlhMDFtaU1RWitwdEV3ZFdBQ3d2aWZZQ2lHc1VzcEExYm9hRzlmYzNjUm1OQk1EZ3E4a0hiL1YwS2xFZEx5d2lIYzdrSlF5K0JETDRqWGk4dEsvL011L3ZLcmoyNkRCcng3V1d0alozVE85ZnYrbzM4dnozZDdPTitqc0FobXdLbUJDWUE4aElvR1NpQXdQbjdGbklLSklDaTRQT2VlczlNdHRmS3VwTThaZ3U5MTI1ODZkT3hNeUFIajNML0pPVlE2M2J0MmlMNy84VWd5SFE3cHk1UXJ0N094QXQ5dWxzaXhKQ0VHVHlZUmFyUllwcGRESHhycktzM0ZPYSsyY2M3em8yakpCTURGNHNuQ2l5aVUvb1NDZzhod1FxdExTUWhCZlRUMkl1bm9BZ0pEWXloNUUzWHZnOHBKU0NnYURBZXp2NzhQbHk1ZGY2WUZ1ME9EWGd0SVk2UFYzelU1Lzk3RGZ6M3Y3dmQ0M3pwb3AxZVlLNEJUZmdQejZTKzhSTENXRDJDL2dVcEZTaWhXQ1EwVFVXanNpd25hN2paUEpoSlJTWVJMNVpjZ0E0TzMxRFg0T0ZzaWgzdEs2c2JFQm4zMzJHZnoxcjMrRnpjMU5tcy9ubENRSmFxMngxV3FodFJhZGM4NFlvNlNVdkdUQ3duRlpLVllMaGdsQ0tXVjkyMWo4bW9XWkNDR0VJeUpKVmR0clhGWWlJUVQ1aktYNjdFUG91dUtwYWZJdHJmRTlFd09yaUsrLy9ocTYzZTR2Vmw2SzJuRWJOSGpyVVpRbDdQUjN5MTYvZjlqUCs3MjkzdmEzdk9Wc21XOFFxWUdDL1FFZU9FTy9ENWw4V0owL1o1aGxaRUMrYmQ3SFdTTVRnbk1PSjVNSlhiaHdBWStPanNpM205S2pSNCtvMiszU2h4OStTRjkrK1NWc2JHeFFRd2FuSTg1Vld0clN1ckd4SVFhRGdhenZsRDUzN3B3cXl6Snh6aVhHbUN6THNsUUlrU0ZpQzN4YkswUjVTM3dQZnA4MEluYWtsS0dsVlFqUkloL0VoNGdwQUtSQ2lFUlVPNlUxVkdwQ1FhVW02cTJ0d04xS2ZJK0lJbFlKdnNVMTdKdXVaeTlkdkhnUi92bWYvL2tYT2VoSFIwZFEzNTNSb01IYmdubFJ3SGJlTDN2OTNXZTcvVjV2UDgrL0pjVFprakxSUWtzcDF0WmVDaDlXQjM3T2dLSUo1SmdNUkRTRnpPVWlqTURlWjUwTTNudnZQZUs5Qmt3R3YyUTIwZHVPQmVVUW03b3hoc01ocmE2dTBtdzJvMjYzaTVQSlJCcGp5RGtYV2xpTk1Ud1U1NGlJdHhYeEFBa1B3Vm1xTWttc3Z5cElmR2twN2xweWJIQjd2eUgySE1UeFd3eHZjbGw1S2ZnT2lCaDJUTWZsSlI2T1krTFkzOStIZzRNRHVIVHAwaXMrNUkxeWFQQjJZVFl2WUR2UHkxNS9kN2liOTNZTyt2bmZLVnA1R1plSTZpYXlXSnd6Q010dGZIZlJpUmhySmdPdUpqQVJKRWtTWmczS3NseEtCcXVycTNSMGRMU2dESmdNdnZqaUM3aHo1dzQxeXVERmNZSUlZSEhlUWR5OWUxZSsvLzc3NHNxVkszSThIc3YxOVhYcG5Bc1IzbkhXa3BReTQ2UldWZzVRRGJwMWhCQXJTcWtWUkZ3bG9oVlJEY1h4SUJ5L3RnVUFtZkF4M29pWUNpRVNxRWdzcUFjUnBiWEdOMjlNQ3o3NUlxTHc5eHpySFdJMGxxa0hLU1hjdkhrVGtpUjVOVWZiWXp3ZXc4Y2ZmL3hLZjBlREJqOFYwOWtNSHVYOUlzL3pZVC9QdHgvdjczMVBpTUVvcmkremdlUHkwSUl5Z0lvRUZpS3MvZGZDNmt1ZVFpN0wwcVZwYW5uZ0xGWUhMNklNQUFEZXhIeWl0eGtuREdtKzh1YXlFa0MxVjNvd0dOQmtNcUg1ZkE1U1NsN2ZHYnFXd0Vkb0NDRzREc2hiamhKRU5GcHJFNDJuRzk5NVlCQXhnV01sd1FTZ3lTZTRlaExnM3hHOEI2OXlRaGtwZnU4QW9VdUptQ0NFRUdIMmdiMkhldjZTdFJhKy92cHIrS2QvK3FkWGV0RFpEMm5RNEUzQVpEcUZIM3I1UE8vM2gvMDgzMzY2di9jREVTME5wNFBLUEdabFVEQVplSStBWDN0Q0dTaWxGaUlwWnJNWmt3RUNnR3UzMnd0VHlQUDVQSkJCcDlNaGF5M0d5Z0RnSkJuRUMyNkkzczMyMGw4U1M3dVZ1UFBIdDdRQ2VEWGhnL2dRanEvV1hWRVVFaXQzR0lVUXpzcy9wNVN5ZnFOUjZGUUNIM1hyUzB0OGI2SDZ4NlQ5WSszTmFTdUVrTjZZWm04aC9HNmVmeERWMEp5c0V3UXpoaENDdUpRRVVIa1RTaWtpMzg3SzVFQStqMmx2Ync4Mk56ZGhZMlBqbFJ4d2dJWWNHcnhlakNZVGV0VExpMTdlZjdxYjl4NDlQZGgvQkxWUU9vb21rV3NtOGdsMTRMOGUvbS9ISldYMkR1S1FPb2pJUUFpQjF0cm5rc0g2K25vZ0E0RGwyODVZR1RRQzRleHdnaHpZZCtEbjkrN2RnMXUzYnRIR3hnWjZZNXAyZG5aSVNrbm56NStuNlhRYVJzc1IwZkZRSFAvREVFSllyWFc0a29nSmdlL1pld0EvQ3dFVm9TaXM0amFjNzFaeWNMS0V4SDVEbUpZV1ZiSXJzTmNBVVdxcjcxaWlldWVTOXg4SUVZVlNDcmEydHVCUGYvcFRHS0E3YTdDQ2FkRGdsOERoYUV6YmVWN2tlZjlKM3R2NTRkbmp3UTRzSVlPNG93aGcrZXBMcndRQ0dhQmZibE1uQStuWFhkYkpBQkYvTmhuOG1tWU5YaWVXbnYwaVk1cnUzcjBMNEUrd1cxdGI4QS8vOEE5dzhlSkZPamc0SUdNTVdXdEphNDNPT2RkcXRhUXh4dkZFb2xjUDFwZVltQ3hDU1ltdk5Id3RVZ3NoRWpvZW1GTkNDQ1lJQ1FEYzFvcFFUVWRqWkVETCtLM1hQdzYvZithOHVNMDE3bWhpSlZHV0pYejk5ZGZ3NmFlZm51V3hEbWlVUTROWGlXZEhSN1RkeStlOVBIL1M3L1YrT0h6NnBBZW5rQUhVVEdSV0NCVEZXSU1uQXU0c2l1TW9raVFKMlVReEdmZ3F3Z3VSd1dReWdlZnRRVzdJNFBWZ21TRmRmV094YSttRU1RM0hyYVdxYmt4YmF6T2xWS2FVNG1VK1lZMm9FR0xGT2NkbTlBb0FkUHozVndCZ1JmaVdWdkRtTkJ6dmwyWmpPcUVxcVRVc0F2SmxKZUZKZ3RYRlFudXJmeDV1bk5yS056YWxpNklJeTRMKzlWLy9GUzVldkhqbUJ4MmcyU0hkNE96dzlOa3oyczc3czRvTWRyNGZEWWU3VUx2cWw3VjFsM1ZqbWRWQXRNdUFZeW1XRHA1SktSZjJHY1FtTWh2SXJWYUxPTG5VV290c0lBTUF2SzdWbHcxZUhLZldUZnhmekltZVM4NWFHby9IaUloaVBCNUxQd3lIV1pZaElycVZsUlZyclZWc1JDbWxqTFZXKzM5a2JGeHBJa3I4bFlxT1NrNXNTRnRQQUFxcWtoSzN0YnE0N09YQlJNYUpyWUVRc0VwbkRZcWl2aFFvTGk4aElpUkpFcDV2YlczQnpaczNYMGw1aWJPZUdqUjRXVHdlRG1tbmwwL3ovdTdqdkxmei9malpjQitXbElCaTM4QjdCSEdicVlsOUE2cFdYWWFOWjBvcHppZ0tRWFhXMnFBT3JMV2h2ZFJhRzhqQU9SZGlyQzlkdWhSMkdpd2pnMmJ3N00zR3FjcUJ2eC90bGc0RGNaUEpSSFk2SFFGZU9adzdkMDVOcDFOdHJVM204M202dXJxYThKNEgzNWJhdHRZdXFBZmY2dG9CZ0JXcVdsdERXNnNRb2lXRWFHRzFlalFGZ0l5cVBRL3hDdEhRMnVvVkE2dUloZlpXUk9RNGphQWVBR0JoTUk2SDQ2SzlENElmYjI1dXdpZWZmSExtQi82OTk5NkRkcnQ5NWorM3didUh3Wk9udEozbjAzN2VIK1E3Mjk5UFJrY0g4Qnd5aUJXQ3FBMmgrUTZpVWtUN0RMaFpCSEV4dGZSbGxNRnBPdzBBR21Yd3R1SzU1TUNsSlc1cnZYWHJGdnpsTDMrUlJWSEl0YlUxb1pRS0U5TkprbWlsbEhiT0plQkxRVXdPaU5oeXpyV2xsQzFFWEdHQ0lLSXdQUzJsYlB2dnRjSFBQUGp5VXBoN2dHb1owTEtwNlRBNTdWVUZsNWdBRmdraWRDWHg1N2JXTHBTWW90a0hVWllsV0d2aDMvN3QzK0M5OTk0NzB3Ty92cjRPYTJ0clovb3pHN3o5Q0NzdmUvMXB2dHNmN083c2ZEOFpIUTNnRkRLSTIwenJYM2ZPaGZiU09obXdrY3hCZFQrVkRCNDhlQURkYnBjYU1uajM4S1BrQUFBTGN3K3NIbFpYVjhYT3pvN3FkcnR5TXBubzlmVjFwWlRTbzlFb1NkTTAwVm9uMXRyTU9aY3BwVnB3dlBXdHpTb2g5aCtrbEczblhNZC9uUWtpZzVQZVF3cFZHZXBFckFZUktlRVIrdy8rTTdML3NFQVE3RDhZWStvS1FqQlJhSzNoNXMyYloxb0c2blE2ME8xMnorem5OWGc3UVFDd2R6REFuVHlmOVB1N0IvMmQ3ZTluay9FVHFFN2tCVlFuODFJSXNUQjRWaDlFaThrQXZIZkFEU0RnVlFFckEwNHRUZFBVeHZzTW1CQ2NjM2orL0hrY2o4Y0xaTEMydGtaN2UzdlVrTUd2QTg4dHB0ZDloM3YzN3NFbm4zd0M3Ny8vUHUzdDdZbk56VTFhWDErbnNpd3hUVk14blU2eDNXNjdORTNsYkRaanI4QjU3eUg0Q1ZEVlFMWHdtNXFJU1B2bkJSRXBJbEpTU3VVZnMvY1FNcFc4MFJ4S1I2eHcvTmZrY1dNRGNYUUdMNkZlNkZyeUx3b0RjdVFINDdqa3hJL0xzb1NIRHgrZTZXcFBYbGZhNE5jRklvTGRnd1BjeWZ1VFBNOFBkbnU5djgrbmt5SDRKVFh4Q1ovOHVrdUlvaW40T1ZWdHBBdWVnWlF5VENFNzUwNlFRYnZkdGtWUk9DSkNJbkt6Mll5M04yS1NKR0UvUzZmVG9ZT0RneDlkY05ONEJ1ODJmc3h6Q0s4RE9Cbkd4L3VsRHc0TzFOcmFtdFJhNi9sOHJyTXNTNXh6SjlRRCt3OThpMHRNL0JpaU9BMGhSQXQ4ZVltSU11OC9wSWlZU2ltMUx6R0YwaEpWMDlRY3F4R1VBNU5INUVjc1ZROWNYaXJMVXNRZFRLd2dQdnZzTTdodzRjS1pISGlsVkxPRjdsY0FKSUwrM3I3cjVmMUozcy8zZDNlMnZ5dUw0ckIrMVUrMXBGTC9QRllPOGV0Q2llaDV5a0JHTzVEcnlpRExzZ1V5YUpSQmd6cGVpaHo0Y2IydGRUNmZTeW1sU3ROVUE0QXFpa0puV1pZVVJaRm1XUmI4QjBSc1dXdmJYR2FDbWtGTlJDdHhVaXRFM29NbmxxV3RyUkI1RDJJeGR5bHViUldlRUpiNkQ5eXRaSXdSY2ZaU1RCSm5YVjVxMmxuZlBUaEV5UGYyWEMvdmovTzh2Ny9iMi83ZWx1V3BaUEJqSm5KY0tvSm9ud0ZVYmFZV3E5QzZVOG1BMS9jMlpORGdaZkZDUFpwY3E3OTc5NjY0ZmZzMlhMOStuZjdydi81TGRMdGRta3dtVkpZbGRidGRUSklFajQ2T1JKSWtDRldxS29kcVNhaXU3SzN2bGxET09hMlUwbEJkTFdsWUROZGJDTm56ajhOTWczL01VOUl5ZW8vOEw1bS9Iby9YMTlOUXVkb1VPbU45ZVltWU5PSzJWdWZjbVphWG5ITS8rMmMwZVAxd3prRnZkOC90NVAxeHY1L3Y3ZlYydnJQR2hDMW52blY3WWJ1WmlMYWR4V1VqYng0dlRDQnpTeWtza29IVFdsc2lDck1HUk9TTU1VaEU2SVBwUW5KQlRBWk5tYWpCaStLbEcvanYzcjBMdDIvZnBxMnRMUm9PaDNEbHloVWFqOGMwbjgrcExFdlVXZ3V0TlNxbHNOVnFoZWdMUHpoanVMdEpWWmZmQ2dDVWM0NkgyalFpMXR0VTY2VWlDVkVDS3l1QktxYWxtcHFHYUNJNkpwRDRheEV4QklKZ0VsUktFZnA5RUQ2Y2o0aElJQ0xrZVE2Ym01cy8yMHh1eU9IdGhMVVdlcnQ3ZGlmUFBSbmszemxyeGo0ZVppR3BORllIc0dUN0dYdHUxbHIyM2dJUllKUmMrakprTUp2TjZPTEZpOWlRUVlPZml4Y2loL2dzeW5NUG4zLytPUUFBcmEydElRQkF1OTBXaUVoRlVhRFdHdWZ6T2UrVWxxd2VraVJSZnRjcm4vUlpMWlNJcVAwVmxoUkN4S1RBQnJYMEJyV1VVZ3FLcHFKckJuVjlPNXhjOWkrK2JrNXpxU25LWUZxSTFvZ0g1QjQ4ZUVBM2J0d1FQNmU4aEQ0SXNNR2JEV010N1BSM2JTL1BSM25lMjkzUDgrK2R0V0hMV2RROVZCSlJXSGZKNVNJNERxVUw2c0JhRzBwRWZoV21jYzVacFpRbElxdTFEdHNSWDVZTW10V1hEYzRLTDZVY3hIRmFxN2grL1RwdGJHeUVPczFzTnFQMTlYVWNqVVlpU1JLbnRlWnBac25xb1NnS0s2VlVVa29EQUVwS3ljcEJhYTBWSWdZeTRBNGxST1FPcFREb0JsNUZNQ2xFQ29GUCtJNy8wZnNaaDRYa1ZvRGpNbE4wSDlSRFZGNEtyMFZFY3M0SnJUVVVSUUhmZlBNTmZmenh4ejk1YTArakhONU1sTWJBVHQ0M3ZYNS8xTS96M2IyODl3TTZOeFdMY3dVbnlNQVBtSjBJcTR2SkFId3NoUkRpUkZDZHFIYXRPNjIxaTl0TEd6Sm84THJ3d3VTd1VKeUg0N1JXZ0NwU1l6S1pVTHZkcGpSTjBSZ2pack1acnEydGliSXNVU25sdE5ZV0FLUnpUaUdpOHJzZWdrSnd6aWtBVUVvcGlZZ0txd2p2dXRFY2s0SUVQK0FHVVo1UzdEMzR0eXVxLzJjU0VYRVpRWEFiTFBIenVucFFTdkdOK0RtWGw4NmZQLytURG56em4vVE5RRkdXc0ozM1RkN3ZIL1Y3K2U1ZXYvY0RJYzdpenFEWUovQzNvazRHVEJaeHFRaWVRd1k4aFZ3bkErZGNJSUtHREJxOFRyeVVjcWlWbHdEOENmbnExYXYwMTcvK2xUcWREclhiYlVSRVlZekIrWHd1ZkdsSndIRjVTYVZweWdwQVFVMUJWT2RteVNwaVliWUJGajBIQ1lzekR2d2U2OFkwbi9pbDl5YWs4Q3REdVd3VUVVWWdsWmdnS0ZvTUJIQzhXWTdMU3o4bFpiWDVUL3Q2TUpzWHNKUG5wdGZ2SC9ienZIL1F6eDhSMFJ5aWx0R1lER3BxSUpDQ0h6SXovQmo4Z2hzQU1NWVlHeWVYbmtZR3hwaWxaQ0NFd05GbzFKQkJnOWVLRjIxbFBmNEQ0aml0ZGRuY1E2ZlRFZXZyNi9MdzhEQmMrWE9zQmxaYjMxSUFTSk1rU1oxekdSMVBUUy9NUU5CaU8ydGJDTkZ5enExSUtYbGl1dVYvVmlhcXpLV1VpQkkvLzZEWjFLWnFpbHJXYnFITmxRVVJsNlh3ZUxXb2lHWWZ5Rm9yYW5NUFpJeUIzLzN1ZCtMYXRXc3ZYVjQ2T2pyaVJVb05YaUdtczNtMS96alBEM2Y3ZVg3UTcrK1FIeTZqSmUybHRjbGpMaGt0REtpQm4wRG01Rktzb3F1WGtnR1hodWJ6dVZ1bURFYWowWUl5YUZwTEc3d3BlT2x1cFVnOUxIeDlPQnhTVVJRRUFOQnV0eW5MTW56NjlLbFlYMThYNEZOVmt5UVI4L2xjZGpvZE1adk5wQkJDK2FsTzZaeVRBS0Q5WkhUd0dYdzlTSHBGd1dvQklCcG04MjhobEpiODF4ZEtURDZabGI4ZGI1V1QzcGNnL3pwZUZFVGUrSTdMUzhUR05LdUg3ZTF0dW56NXNsaGZYMy9aNC9oU3IyL3dZcGhNcDdEZHk0dGV2My9ZNytYOUo0UDliWFN1dnVnK3pCbUkyaTREdnNGeGx4R0gxUm1sVklpa2lPK1ZVczRZWTJXMXc4UUpJVnk3M1hhejJjeDFPaDBrSW15MzI0MHlhUEJXNGFXVkE4Q1BaeTZOeDJPNXZyNHVCNE9CNm5RNmNqYWJhYTMxUWpCZldaWnBtcWFwRUNJenhyU1NKTW1vbW9RT0EzTDFtdy91YTR2anhOYU1pT3E1UzRsWEVzdm1KdUwwMWhOdHNYQk1PSks3bEp4emZDK3N0UlFwQjFHV0pWbHJJY3N5Y2VQR0Rma3k1YVhEdzhOWGt2YjZhOE40TW9GSHZiekkrLzFuL2J5WER3ZURIVi9uUDZFS29pdi9CUk81cmlBZ21qeUcydUNaYjhsMjhlQVprd0lpb3RiYUVWRlFCaXNySytTY1c2b012dnp5UzlqWTJLQkdHVFI0RS9HVEZoWFV6V2tBZ01GZ0VGYUoxczFwclRVQ2dDdkxVaXFsV0c0TEFCRFdXdWs3bTRSelRzcnFmNTVLa2tRNjU2UVFRaUtpVkVweENTaDBLWkdmZUlacXA3VHdzdzRoRXFQdUpVRFY1c3JHYzd4cm11Y2x1S3lFc1RIdHYwK3kyZ0ZCVWtxaGxDS3ROU0VpVEtkVCt2YmJiK0hhdFd2TmlyZFhqS1B4bUxaN2Vkbkw4MkhlNi9XZVBSNzA0NU42VEFBUVpSSkJwQVQ0M2o4T0VkWk1DR0xKY2hzdUZTbWxuQSt0TzBFR2s4bUVlTnVaN3pDaVI0OGVVYmZicFE4Ly9EQ1FBU3VELy83di8yNlVRWU0zRmo5NWkwM2RuTDUrL2ZvSmMzbytuOVA2K2pvaW9pQWlvYlcyU2ltdzFvcWlLR1NTSkphSUZKT0NVaXFVa3Z6Sm11L3JKKzl3MW8vS1JXR05JTGVqUmdSQkFJQmVUZkNhVGlhS1lHeDdjcEgrWThWUkc4Ums0WTFwWkdYQjRYeVBIajF5bTV1YjR0eTVjeis1dmJYQlNmaVZsMFd2MzMrMjIrdnRQSHZ5ZUhlWkQwRFJYQUUvNXpaVE9HNHJEZFBIVEFqZ0k2ekpENkRWeVlDSUFpRWtTZktqWk1Dckx4c3lhUEMyNHllVmxjSWZmZ0Z6bW5PWGhCQ3FLQXE5dXJxNjFLQkd4RXdJRVJZRWNYbUppRnBLcVRZaXRxbktXT0t5VTR1SVdteFExOHRMUW9nRXFwV2lDUkZwN29qeVpqWG5Md1dUT2lZSGdPTmdQdkFtTmU5OTRIQytPSkNQYjFtV2lULzk2VTlKVFZRdFJWTldXbzdoczBQYXp2TWl6L09uZWErM2N6Ujh1bjhhR2NRbEluNk9QcWswdm9kby9TVXNXVzdqL1FPZTRsOG9FekU0bDZoT0JyejZzaWtUTlhqWDhMUDJYNzZJT2MyNVM4UGhVSFM3WGJlNnVncXoyVXhBTmZNZ2hCQlNheTJrbE9IcUhZNkgzR1NzRnJpY3hLL2pOdE5sOEtZeUFBQkpLUkdxMWFNRWxXTFFVT1V1OFE0SWdxbzBKUkdSUzJaY3VpSXBKUWdoSkEvR1NiOWVORGFtZlhsSi9QM3ZmN2NmZmZUUmp4N1hGeUdRWHdPZURJZTAzY3ZuZWIvL05OL1oyUmtmUGp1QVdsc3BSSU5sVURPUjY3NkJVaXAwRWZuWFdQL3pBaGxRbGZIbGhKOUNWa290a0lGekRzdXlYRW9HeTVRQms4RVhYM3dCZCs3Y29VWVpOSGdYOExPVUE4RHA2bUZ0YlUyMDIyMXhjSEFneCtQeFFxdzMrUGJXb2loMHJCNmd1dUpQaFJCQlBiQTZpSlZFM1pnR3Z5M08vNWtGQlVGUmV5c2NKN2h5ZSt1Q2VvRGplWXFReDhRS2dsdGJpU2dzQm9vTWFsR1dKWlJsS1p4ejhNYy8vckgxWStXbDhYZ01IMy84OGM4NjltOGpIajk5U285NithemY3ei9OdDdkMy9KWXpKZ01qYWt0dHFOWmVXbGNHVUNtQWhkUlMvN1dGc0xxNk1rQTgzblQyVTVVQkFNQ2RPM2ZDNDRZSkdyeEwrRm5LQVdDNWV2QmhYM0QvL24yNGN1VUt6V1l6U3BJRXk3SVVTWkp3dElVQUFNSHRyVW1TQ0dNTW04dFNheTJjYzFKckhZeG45Z0FBUWl3R0FJUWhOMzdNYnd1OElrQWlRcWhhVjFrMUlGVEVRT0EzeUVVUkcreHpJUDhPNXh3cm14RElSejZnenpuSDA5TkNheTBRVWZ6dGIzOHJidDY4MlhxZU92ZzFLQWNDZ01Iako3aVQ1L084bnovdGJlOXN6OGFqSjNEc0N4aW94VmJEc1ZFYzd6V0kyMUFObTgrKzFCUU1aQTZxTThad0dyQlRTbGttZ1NSSlFveTFjdzduOC9semxRRUF3SU1IRDA1VkJrUkV0Mi9mZmgySHRrR0RWNDZmclJ6Q0R4S0wrNmEzdHJiRSsrKy9MN3Jkcm9pSDR6ZytZenFkYWdCUVpWbHFSRXpTTkUwUU1kRmFKODY1VEd1ZEltTG1mWWFnSXJ4Q0NQNUQ1RThzN0p1dUtZaDQ5OFBDZ054ei9BY085dVBFVjBGRTVKd1R6am1LVjR0NjFjQzdJSVF4Umw2OWVqWDc2S09QMHRPTzEydzJnei84NFE5bmN1emZGQkFBN0E4R3VKUDNaM25lZjlMZmViUTltMHlHNE1Qbm9MWURHU0svSURyNUY5NU1EbDZCOEhzTm9LWU1sRkpXQ0dGaU1saldYcnBNR1hRNkhiTFdZcXdNQUJiSkFLQlJCZzErdmZqWnltRVp0cmEyNlByMTY3QzF0UVVBQUVWUjBIQTRGTzEybTJhekdRK2ZPUUNBYnJjTFIwZEhRa29KeGhpK1FwZk9PWkVraWZDK0JGaHJoVGlPdFJEQ2R5T0IzOWxBSHVBN2sxZzFBQUJpZFhiSDZweGZQZmJFZ0o0WVl0V2cySFB3bmdjSUlUaDJnK1R4b3FBUXJjRmRURjVoU0tVVWZ2ZmRkM2o1OG1XOXRyYTJ0TDMxcDBSdXZHa2dvbXIvY1QrZjlucjVrLzdPem5ZeG16NkRpQWdnSWdOYTBsSEVyK0ZTRVIxdk9nczdEZnpOMXZPSkV6c3BsQUFBRllGSlJFRlVZaklBQU5kdXR3TVpXR3NYbEFHVEFTdUQ5ZlgxUUFZQUp3ZlAvT2RybEVHRFh5M09qQnlpOGhMZHZYdFgzTHAxaSs3ZHU4Y0VRUmN1WE1EVjFkVVFUZkgwNlZNaHBSVHorVndrU2VMbTg3bm9kRHFtS0FyUmFyVkNKeEFpQ3Q4K0twSWtDUmR2VEF4d2ZFRkhVa3BpQXZEZlF3QkFiMGc3cXRhS0loRTVJWVNEYUttUW4yQlQvbldodk9SL0Y1dmdBSENjdmNSekRoemx6U1V3UkZUT09mbTN2LzF0Zk9QR2pYUExTa2hudFUzdWx3UVN3ZDcrQVc3bitiU2Y1NDkzZTczdCtXeDZDTThoQTY4UTZzRjFDNjhUdFFVMzdCZlV5VUJLNmF5MVA0a01KcE1KeEpFVXk2YVF3eitrUmlBMGFIQjJaU1dBaytiMDdkdTM0ZDY5ZTJJNEhNcHV0eXZpNmVuNWZDNHhTbVgxYmE1Nk1wbUU4aEpFeGpLM3Vnb2hzcmpjNU10SUM2dEVpU2lZMDZKcWFZMm5welZWN2EwSmw1ZUUzeDhocW9FNzVRZjBPQzQ4SENmbVAxeWNuSTUzVFFzL09TMk5NZElZbzY5ZHU3WjI5ZXJWVnYxWUVSRmN1WExsekk3OXF3QWlRbjl2SDNmeWZKTDM4OGU3TzcxSHhYdzI1aE0rbkVJR2RSTTVOcE1oYWl1TnVvcE1QWnVJemVOWUhjUW04bytWaVFBQWZpeWZxQ2tUTldod09zNlVIQUJPRWdRQVFIMys0Ui8vOFIvRi8vN3YvNm9QUHZoQUlLS2F6V1lhQUZTbjAxSGo4VGhCeEtUZGJtdXRkVktXNVFKQktLVUNVY1IrQkJPRmM2NEZWZGRUQmdDWmxESkJ4QXdxdnlFRlAvdmdTVUlMSWVMTmMxeFdDdGxPRkUxUkF3Q1hyOEJhQzRoSVdPMmRCcjkzV3ZqT0pWV1dwVExHS0VSTS92em5QNyszdXJwNlFpcjg5cmUvZmFPTWFlY2M3eitlNW5rKzJNMTcyK1Y4em1Sd1FoM0kydTdqT2ltY1JnWmE2NlZUeUM5Q0JxMVdpM2dQOHN1U0FVQkRDQTBhdkNoZUNUa0FIRXZ6ZW52cmQ5OTlGd3hxcUF4cDZVL1FDZ0NVMWxvYlkzVFZYSklrVWtvTmk5bEpnU1NFRUptMU5oQURFV1ZVdGJxbVJKUkpLVk5QREF1NVMrQ05hVVJrOVJEdmpwQmNWb0xqN0tYdzBid0hna1FVaHVLY2MrUUg0MFJabHRJckNGMFVoYkxXSnVmT25XdmZ1SEhqWXAwSU5qYzNvZXJzZlQyd3prSGUzM1U3L2Y0azcvVU85dkxldGpWbUNqVURHWmI0QnJTa3paUXpqV0l5MEZvdkhUemoxTktYSVlQaGNFZ2ZmdmdoTm1UUW9NR3J4NW1UQThDaWVnQjQvdnpEYkRhVHcrRlFyYTZ1eW5QbnpnVVZFVTlSeHdUaHIvb3o4Q1RCS2lKV0ZFd1VUQTVFbENxbEVrUmM2RjVpWXZDekZtRVZhYXdjL0dmaG9UdkNhaUNQNkhnN0hERkpjRm1wS0FwcGpGRmxXU1psV1dwcmJmcC9ybCsvZVBYM3YrL0V4K25DaFF1d3NySnk1c2YvTkJocm9WZXR2SnprZVQ3WTcrZmIxcGdwK1h3aGVBRXlFTFZBTzZ5RzBCYmlLS0JHQmh4VTE1QkJnd1p2RDE3SlpTdEZsOXJ4LzlXdnZ2b0tQdi84YzdwLy96NFVSVUdibTV2VWJyZHhOQnFKYnJkTC9YNWZuRHQzanZkbmhoM05Va29xeTVManM4bGZiWk9Va2hDUnU1TlFDRUZ4bHhKVUhWRW9xaW5aMUQ5M1VKM0FFaUxpRmxjYnhXc284TW10NGppOUZYeStVL2dzL0x1RUVDaWxGTTQ1a2xJS0g4b25uWE5LU21tMTFna2k0di83K3V2QjVVdVhXcDFPSjVTWHJMVm5mL0FqbE1iQVRyOXZlM2wvbk9lOXdVSGUzM0hPVG9VUVlhY3hSSjFEOGIwUW9xZ1RodlE3RExpOVZGUXgxb0VNbkhPaFRNUmtZSzExQU9DVVVzNWFHMllOckxWNC92eDVISS9INUp3TFpIRHAwaVY4OE9BQkFNQkNqRFdUUVJOajNhREJMNE5Yb2h6Q0Q0OUtUS3dlQUFEWWY5amIyeE9ibTV1eTNXNkwyV3dtQVVBZEhSMHBLYVh5TlhvMW1Vd1NyYlhtRXBOU0tqSEdwRXFwQmNNYUlpWEJLa0pyblJCUkZpbUdWRlJ4M2lGM2liMEhKZ2VvQ0VLQ1gwMEtVWlMzSDRvalB3UkhSRVIrYWhvUk1Td0VZcytoS0FwdGpFbkxzc3lNTWRtRkN4Zk8zYmh4NDdkOHBkdGVXWUgzTGx3NHMrTmRsQ1hzNUgzYnkvTngzdXNkSE96dTdpQzZXVVFHQnFxMDByRDY4c2RNWkNZRDhONEIrajBHNEZWQlRBWStyZFRHYXk5WkhUam5BaG5FeXFCWmNOT2d3WnVKVjFyd0pscU05dWFkMC9mdTNZUGhjRWlibTV1d3VycUs0L0ZZenVkek1zYmd1WFBuRm41R3A5TUJZd3dCQUZsclNXdE5XbXN5eHBCU0tueGRDTUhQRVFDNGJCSFVBbFY5OGdZUlV5bGxJQWd1TFhuRndBWTFFNFNJUzB2OG1hRGlQZlNmai93ME5hc0o2UlVFbDhhNEpkTTllZkxFL2ZEbzBlcnZQL3h3SFFEQS9VemxNQzhLMk1sejI4djdvMTZ2dHovWTI4MEpjUzZPWndoT2hOV1JuenlHS0tlSW4xUFZSaG84QXlJeWZpS1o5eUdmSUlOMnUyMkxvbkJVSmRXNjJXeUdTaWtIQUpna0NYRzVxTlBwME1IQkFhMnRyWkdmb0c4VzNEUm84QWJqbFNxSDhFdkV5ZnlsVzdkdXdWLys4cGVGRnRmNWZDNWJyWllBZndVL0hvK0RnakRHYUtXVWxsSnFSRXlJS0xTOFNpa1RBRWlkY3lrQXBQdzh2bmt5T09FNWtFOXRqVHFXRkhqVlVGMzhWb0dBRVRuRVY2OElBT1RqR01JNlVXc3RsR1dwaTZMUVpWbW14cGlzTE11V044OVh2dmppLy91NDAxblJVaW40emZ2dnYvQnhuTTNuc04zTFRkN3ZqM3E5M3NIanZkMDhQdG5IUG9DTXRwMUJOSWtNaThvaEhrWmJXRzREcHlnREthVXJpdUtFYitDY3d5ekxGc2lnVVFZTkdyeTkrRVhJZ1g4WFAxZ1dzY0VFc2F6RTFHcTFwTlphdDl0dE5abE1FaW1sVHROVUlXS0NpS0hNeEFRZ3BVeGlvdURudm95VVFyV09OSlNWRUhHaHRPU0pnU00xRmtMNHZLZEJRZ2l5MXJKcVFFUUVheTBoSXZtT0pXbU0wZlA1UERYR3BNYVl0clcyYmExdFhieDRjZVBHalJ0L1FBRDQzUWNmbkhyQXByTVpiUGR5MCt2bm83elhPM2l5djkrSDR5VTJoaFozSVlkc0luL0ZQei9OUkk1TFJWRGJkTVp0cGM4akErY2NLcVZjUXdZTkdyeTcrQ1g3S0U4RTlGMi9mcDIydHJiZzJyVnJ4QnZrQUFEaUV0UEt5Z29kSFIwcG5pdndNUnVFaUpTbUtRRUFLYVZJU3VtTU1haVVRa1IwU2lubk8yWlNmNkt6VkNXMEdrOFV4am1YeUdyWEJIY3RhYVVVRTRPQzR4anZCZVVBZnZxNmFtNnFGdjhBQUdxdDBSZ0RTaW1SSklsQVJKMVVybXptTzNxTUVNSU1CZ096dmIyOS92NXZQOWlBaURUSGt5bnM1SlV5eUhkMkRwNDhIdXdERWNkTmhQdW9UTFJBRGdCUU91ZENSQVY0RTFuVUpwQjllYTFPQnM3SFdZZFpBeUp5eGhna0l2VEJkT2ljUXdCWUlJT21UTlNnd2J1SFgxSTVWTDlRSEFmMDhRVDFzaEpUdTkwV3E2dXJvZFZWQ0tFNm5ZNmFUcWVxM1c0cklsSThEOEdsSmltbExzc3lVVW9sVWtyTmlrRnJ2VEFWN1p4TGhSQ2FiNGk0VUZaQ3hORE9Dc2Q3SFVUMEdRaXJ2US9vejNTSWlPUlBvb0NJVkJTRmRNNnBvaWowYkRiTG5ITlpXWlp0YTIzYk9aZEpLVmYrK09mLys0WFdDdk4rLzJnM3ovZUhqd2VQb2JxYXR3REFiYUlGVkdxaDhHUlFJR0pRQm9oWVJPRjBKVlN4RTRXMU5xaUR1SzIwbmx4Nm1qSnd6Z1V5R0kxR2RQSGl4YVY3a0J0bDBLREJ1NG5YUmc2TWVBYmk0Y09IQ3ltdVhHTGlRYmwydXkzSDQ3SHk3YUFLQUpSemptY1V0TFYyd1pOZ2dyRFdKa0lJTGFVTThSbE1ETlphM3ZHZ1ZDVTd0SjkzaU9jY0ZzcEtpTWpyU1VscjdjcXlaQVhoaEJCVUZJVXd4Z2pubkpqUDU0a3hKcG5OWnBtMXR1V2NheGxqTWtSTXZXK2kvTThtOE1ZNVZYTUhCVlFFVVJEUlhFcFpZTFgya2ttaUJJQUNFUTB2dUttWGk5QW5sOWFua0JzeWFOQ2d3WS9oRngvUGpVNGVDK1BDZzhHQWRuZDM0ZHExYXdRQXNMcTZLdHJ0ZG5oTldaWWdoS0RWMVZVWWo4ZlFhclU0Z1pXTU1UckxNcFJTRXZqeVRsRVVxTFhtNkdici9RZ0xBTm81WjFVMVJCSFVBL2daQnlKU1dHVXE4YlIwVUE1OEV2UWI0VWdJUWM0NWxOVXVDS1NxcFJWOTV4UjRjdEZFbEhCYkxSRmxTcW1NanJPZEpKZWwvUHV6WERKaXBRQmVPVEJoZUtMZzFaa0dFWTF6anNrZ1RDRUxJYXlVMG1tdFhkeGVXaThUeldhekJUS1l6K2MwbVV5YU1sR0RCcjlpL09MS1llR1hSeVVtZ09NTXBvY1BINHJkM1YxeDRjSUZzYmEySnNxeWxOMXVWMlpaSmhCUkdXT2t0VmF5Z3VDVHVqRkdXMnQxbXFhS1ZVU1NKT0d4YzA1SEoyWGxQUWFGaUF1ZFNsVURqZ3B0ckVLRTlhVUFBRUUxTUR3aE9DNHhPZWZRNXkwSlB5bXQ1dk81OXNaMDZvMTBiYTFWVkUxZkEzalZBTDZUQ0NyL0lCQ0NFS0p3enNXN2xBMGlXZzZzRTM2dlFaSWtRUjB3R2NTcW9GRUdEUm8wZUJHOEVlVEFPSzJMYVg5L1g1UmxLZHZ0dGxoZlg1Yytua0lLSVZTcjFaS1R5VVFKSVZTYXBsSXBwWWxJV1dzMStISVQzenZuZE9XN2FpYUJRQkpKa2tqblhCaUM0eDVXSmdpQWFnZ09ZSkVjaE44VElZVEFvaWhRU29uV1dpSWlLb29DakRIU3J3L1ZuaUFTVDJRS0VaVWZxRVBuSEZLMTI5aDRMOEV3SVFnaFNtdXRVVXFWbmdSQ21TaEpFbXVNY2RaYTI1QkJnd1lOemdxdkwvVU5scThZOVlOeWRPL2V2WkRrZXZueVpkamYzOGRXcXlVT0R3L0JHQU5yYTJ2Zzl6dW9MTXNveXpLY1RxZktPVWNBZ0sxV0M0dWlVQUNBWlZtcU5FMGRJcm8wVFMzNW1IQldFRXdNcXFvWFNTbWx0TlpLVmc5WTVTcUJjeTRNd2pGQitEWldqdEZ3UWdpRUtySUR0TlprclJWS0tTR2xGT3huR0dPWWlBVC9MUEREZW13a0N5R01sTkpRdFVyVHROdnRzaWdLbDJXWkVVSzRMTXZzWkRKQlJIUkZVYmlZREdhekdRa2hjRFFhTldXaUJnMGEvQ1M4VnVVUTNvUllqTmtBcUVwTVcxdGJBZ0RndEZtSUxNdEVVUlFTQUpTMVZyWmFMV210WmIrQTkwU29UcWNqb1VxQVZXbWFoaDBTdnN3a3RkYkJaMkFqbW05S0tWaFdWbkxPZ2RZYS9YUTJlaUhoMGpSRll3ek5aak5TU3FGWEQ0Q0lNSmxNRkJFSi94NmhLQW9BQUNyTGtzbUI1d3VNbE5LT3gyTkxSTGJWYWxtcUpyemRhRFN5aUlqZGJ0Y0JBQTRHQXpUR1lLTU1HalJvY0paNEk4Z0JZSG1KaVZ0ZDY1MU13K0ZRZERvZDhlR0hINHBlcnlmWDF0WmtraVNpM1c1TFk0d2NqVVlxeXpJSkZRRUVzdEJheXlSSjVHUXkwZnpjR0tQOGJJTlVTcDNvVW9vOUI1K3JKQkNSbEZLa2xDTGZxUlFJUW12dG5Lc1dsQlZGUWNZWWdNbzRCMk1NT2VmRWREcVZ6am5DYWg4RStYZ1FhNHpCU3JSWTUxV0RnOHBnTjBTRTgvbmNKVW5pSnBNSmJXeHM0TmJXRm0xdWJtSk1CbDkrK1NWc2JHeFFRd1lOR2pUNE9YaGp5QUZnK2FLZ0J3OGVpRnUzYnNIVzFwYjQvUFBQWVRBWVNQWWg0bmJYMWRWVldSU0ZUSkpFbEdVcHJiVXl5ekxwUzAxU0NLRzhqYUMwMWhJcXI0RzN2U2xXSVY0dFNGOEdrczQ1b2JXR3VuS3cxb0tQOE9ZcGFmSW5YdWN6bmx4WmxpU0V3TWxrQWtvcG1rNm5QQVBCbnhlbjB5a0lJZEJhNjdUV1RnaGhwOU1wcFducUFNRE81M05xdFZwdU9wM1M0ZUdoZS8vOTkvSHAwNmQwNGNJRkVrSmdRd1lOR2pSNEZYaWp5QUZnK2JLZ1dFRUFBUERTSUNhSml4Y3Z5alJOeGVIaFlWalIyZWwwcE5aYXRGb3RhWXdKSklHSU1rbVNoWHV0ZFNBRHZqbm54TXJLQ2pqbmhMVld5R3AxS0FCVXJhekdHUEFCZ0ZBSkM2UTBUWjF2czBXc29zU2QzL2VBU1pJUVQ0QkxLWEU4SHROb05LSWtTUWdBMEZycmpER1FwcWs3T2pyQ1Zxdmx3RWVQajBZak1zYmdwNTkraXZmdjM0ZUhEeDhTRTBKREJnMGFOSGdWZU9QSUFXQzVnZ0NvZkFpQUt2S2JDUUlBb0Q0MGwyV1pHSTFHb3RQcFNHNTcxVm9MYTYxMHpza3N5NlJTU2pqbnBITk9wbWtxWmJXVFFjNW1NOGtHc3BSU1dHdEZtcVpnclYyWXk5QmFFeUlTMzBjbEl2UzdIYkRUNmFCempwZ0lWbGRYMGFmSjRtUXlBYThxc0NnS09uLytQRW9wVVNtRlAvendBem5uOFBlLy96Myt6Ly84RDNXN1hmcjNmLzkzQkFEWTJ0cWlPM2Z1aEwrMGhnd2FOR2p3S3ZCR2tnUEFjZ1h4NE1FRDhja25ueENiMVo5Ly92bUNpbWkzMjJJd0dBaE9kODJ5VENSSkl1SnlVNUlrWWpnY3lsYXJKWlZTSWlZTll3d3Y2eEdJS0kweElzc3lNTVlJQUlBc3k4TDdTNUtFaXFLQUpFa0kvVVk0cFJUeS9XdzJnNklvY0cxdERWdXRGczNuYzdUVzBwTW5UMGdwaGUxMm04cXlwS0lvU0VxSjU4NmRvOEZnZ0VkSFIvVDA2VlA2OU5OUDhkcTFhL1RWVjE4QkVTSC8zanQzN2lBMGFOQ2d3U3ZHRzBzT0FNdE5hb0JqQlFFQUVNOUVBRlNUMWVQeFdBNkhROUZ1dDBXcjFSS2owVWhrV1NZNm5ZNmNUcWNpU1JMQmFvTEpRU2tseXJJVVNpbkJqOXZ0Tmt3bUU5bHF0VTY4dC9sOERuNWZBUUVBcEdsSzNMM2tkMHFURCtJTGo4dXlwTTNOVFh6eTVBa2NIaDdpMnRvYXRWb3QzTmpZb0I5KytBRTZuUTVldlhxVi92TS8vNVA4Wnp0Uk9tcVVRb01HRFg0SnZOSGtBSEJTUVFDY0pBbnVaZ0lBaUFmbk9wMk8rT0NERCtESmt5ZGlOcHRKSm9rMFRVV1NKS0pPRkt1cnF6Q2Z6OFY4UGhkYWF3RUF3RVRCdjN0bFpRV3lMS1BoY0NqU05LWHBkQXArem1LQkZLeTF0TEt5UXNZWU1zWlFsbVZZRkFVVlJVRjdlM3NncGNRTEZ5N1FhRFNpemMxTkdnNkg1Tk5wYVd0cks1akwvaGlBUHdadjlsOVdnd1lOM2huSTEvMEdmZ3pSSkhJNFNmSkpjMnRyaTI3ZHVrV0R3WUM2M1M1ZXUzWXQ3Q0h1ZERxNHVycUt6NTQ5dzIrKytZYUd3eUZldW5USklhSUR2eW5PendxNGRydHRqVEVXRWUzS3lvcHR0VnFXNFhPWWpESEdHbVBzNGVHaFBUbzZza29wNDV5emZsclpPT2VzdFpaZjR3REFQWHYyekVrcEhRQzR3OE5ESEE2SCtNRUhIN2hQUHZuRS9zZC8vSWZyZERxWVpSbHViR3hndDl2Rk9qSHdaK1pqOEpyK0NobzBhUEFyeEJ1dkhHS2NwaUs0bXdrQVFzc3J3SEZYMDk3ZVh1aHk2blE2WWpnY2l0Lzg1amZBSFU1c1lBTUFwR2txQUFDU0pCRUFBTlBwTktpRzlmVjFBQURZMjlzVDdYYWJBQUQ4QUJzQUFIUTZIVnBkWFNWakRCVkZRZlA1bkFBQVpyTVpkYnRkbWt3bWRQbnlaYnAwNlJJQ0FJeEdJd0tvUWdmcmFzRi8za1l0TkdqUTRMWGdqVmNPTWZoRUdiZHUrcE1wc1lxNGZ2MDZEUVlER2d3R05CcU5hRGdjMHMyYk4zRnpjNU5ZVGFScGlvOGZQMGErbXBkU3VvMk5EWmVtS1FLQUc0MUd5SkhXUkJSdS9EVS9zZXlJeUYyNGNNRWhZbEFrang4L2RsSktOeHdPc2RWcW9YUE9YYmx5eGUzdDdXR24wOEdkblIwY2pVWTBHbzNDKzF4R0RQN2pOc1RRb0VHRDE0SzNTam5FcUp2VmpHV21OUURBY0RnTVJNam05ZDdlbm5qNjlHbFFHb1BCUUFBQWNGVDRjRGdNUCtQeTVjdHdlSGdvV0EzNHZDZm9kcnZoVGN4bU13SUE0SG1HeTVjdjA3ZmZmZ3ZzS1FCQWlDUWZEQVowNzk0OVlNTzU5akhlenIrVUJnMGF2RE40YThtQmNWcEhFeU1tQ1I2aUF3QjQrUENoK095eno0RGJZT00vczcrL0g4amhnK2ZzZU9ZdUk4Ymx5NWNKQUdBWklYejExVmR3L2ZyMThFWlBVd3N2OUtFYk5HalE0QlhqclNjSGdPVXFna25pOXUzYjRXdnNTd0FjZXhQYzVRUndyQ2dBS2xXeHVibEplM3Q3NHFPUFBnS0E2cVFQQVBEUlJ4OEZBcWkvbDZ0WHJ4TEFzWjhBVUtrRWdKQTRDM2Z2M3EyVEFrQkREQTBhTkhpRDhFNlFBK08wVWhQQThrbHJnRVUxQVFDQkxLNWR1MFpyYTJ2aS92MzdBRkFSQjUvNDc5Ky9ENTk5OWhudzl4aXNFSHdHMUFtVndHalVRb01HRGQ1MHZGUGtBSERjMFFTdzJOVUVzRWdRc2FJQU9La3ErUEgxNjllSkNZUlAvSFVNQmdQeXV5ZkNMNHhWZ3Y5OUMxMUkvdjI5V3dlL1FZTUc3d3plT1hJQVdDUUlnSk1rd1hoUnNuaFJiRzF0MGUzYnR3TWgrSis3OE11Yjl0UUdEUnE4RFhnbnlTSEc4NVFFd0VrRCszbmdFNy9QZGpyMXdDM3hFeHExMEtCQmc3Y0s3enc1eEhoUlJSRWpNcmFwL3R3UDRKMzZReHBDYU5DZ3dkdUsveDhuQjhhbHpDVWg0UUFBQUFCSlJVNUVya0pnZ2xCTEFRSVVBQW9BQUFBSUFPSmRiRVlxWGZnRmFRRUFBUFFDQUFBbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCdWIzSnRZWFJwZG1VdGRIbHdaWE10YzI5bWRIZGhjbVZEYjIxd2IyNWxiblF1ZVcxc1VFc0JBaFFBQ2dBQUFBQUE0bDFzUmdBQUFBQUFBQUFBQUFBQUFBY0FBQUFBQUFBQUFBQVFBQUFBckFFQUFHbHRZV2RsY3k5UVN3RUNGQUFLQUFBQUFBRGlYV3hHbkk0aEUyL1lBQUJ2MkFBQUV3QUFBQUFBQUFBQUFBQUFBQURSQVFBQWFXMWhaMlZ6TDNOdlpuUjNZWEpsTG5CdVoxQkxCUVlBQUFBQUF3QURBTWtBQUFCeDJnQUFBQUE9In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvY29tbWFuZCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTViMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvY29tbWFuZApAQCAtMCwwICsxLDE1IEBACitoZWFkZXJzPWBwYXN0ZSAtcyAtZCIgIiBoZWFkZXJzYAorCitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMxL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiICR7aGVhZGVyc30gLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiAgIgorCitlY2hvICRjb21tYW5kID4gdG9FeGVjCitjaG1vZCAreCB0b0V4ZWMKKy4vdG9FeGVjCisKKworIyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC9jb21tYW5kVHJpYWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvY29tbWFuZFRyaWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTZhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvY29tbWFuZFRyaWFsCkBAIC0wLDAgKzEsMTIgQEAKK2NvbW1hbmQ9ImN1cmwgIC1YUE9TVCBcImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlc1wiIC1kIFwiQGJvZHkudHh0XCIiCitjb21tYW5kPSIkY29tbWFuZCBgcGFzdGUgLXMgLWRcIiBcIiBoZWFkZXJzYCIKK2NvbW1hbmQ9IiRjb21tYW5kIC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIiIAorCitlY2hvICRjb21tYW5kID4gMS5sb2cKKworJGNvbW1hbmQKKworI2N1cmwgIC1YUE9TVCAiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiICAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuIgorCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDVfTm9ybWF0aXZlVHlwZUNJLXNvZnR3YXJlQ29tcG9uZW50L2NvbnRlbnRNRDUudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDVfTm9ybWF0aXZlVHlwZUNJLXNvZnR3YXJlQ29tcG9uZW50L2NvbnRlbnRNRDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjEzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvY29udGVudE1ENS50eHQKQEAgLTAsMCArMSBAQAorTnpFeVlqaGpNRFk0WkdOaU1HTTRNR00zT1RZMk56RmpZMlk0T1ROak4yRT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvaGVhZGVycyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC9oZWFkZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMWRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNV9Ob3JtYXRpdmVUeXBlQ0ktc29mdHdhcmVDb21wb25lbnQvaGVhZGVycwpAQCAtMCwwICsxLDggQEAKKy0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIAorLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAKKy0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAKKy0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAKKy0taGVhZGVyICJIVFRQX0NTUF9XU1RZUEU6IEhUVFBfQ1NQX1dTVFlQRSIKKy0taGVhZGVyICJVU0VSX0lEOiBVU0VSX0lEIgorLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC9yZXN1bHRzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDVfTm9ybWF0aXZlVHlwZUNJLXNvZnR3YXJlQ29tcG9uZW50L3Jlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC9yZXN1bHRzCkBAIC0wLDAgKzEgQEAKKy4qOjIwNDouKjouKgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDVfTm9ybWF0aXZlVHlwZUNJLXNvZnR3YXJlQ29tcG9uZW50L3RvRXhlYyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC90b0V4ZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlMjZmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA1X05vcm1hdGl2ZVR5cGVDSS1zb2Z0d2FyZUNvbXBvbmVudC90b0V4ZWMKQEAgLTAsMCArMSBAQAorY3VybCAtWFBPU1QgImh0dHA6Ly8xNzIuMjAuNDMuMTIxOjgwODAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJIVFRQX0NTUF9XU1RZUEU6IEhUVFBfQ1NQX1dTVFlQRSIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxuIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDZfTm9ybWF0aXZlVHlwZUNJLXdlYlNlcnZlci9ib2R5LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA2X05vcm1hdGl2ZVR5cGVDSS13ZWJTZXJ2ZXIvYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhODNlZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA2X05vcm1hdGl2ZVR5cGVDSS13ZWJTZXJ2ZXIvYm9keS50eHQKQEAgLTAsMCArMSBAQAoreyJwYXlsb2FkTmFtZSI6Im5vcm1hdGl2ZS10eXBlcy13ZWJTZXJ2ZXIuemlwIiwiaXNFbmNvZGVkIjp0cnVlLCJpc0NvbXByZXNzZWQiOnRydWUsImFydGlmYWN0TGlzdCI6W10sInBheWxvYWREYXRhIjoiVUVzREJBb0FBQUFJQUFwZWJFYi9mUWdFbFFFQUFKTURBQUFkQUFBQWJtOXliV0YwYVhabExYUjVjR1Z6TFhkbFlsTmxjblpsY2k1NWJXeVZVazFyNHpBUXZmdFhETDNicE96TmgwSUloVDIxQlJ2MlVJcFFySEVqc0RWaU5Fbm92KzlZdFJPM1pCZld1dGlhZVIvelBFS3BzOFpoNzRNWFR5R1pFM0xTbHhva2w1SWY0NERtdzQ2RHVUY2JQV2UzK1ZVVWducHZCVTJ3STg3TlpTQWVyZmdUbHZJUk1aVm4zRGZJeW5odHQwYzVFTmZRUGplN0xiUzdhK1VpZkY5dDlFd3laZk8wZldsK1A3ZEY0VEIxN0tQa2poMEZzVDRra0FQQ1JSU3lLRnlIcVFvMVR5eXBMZ0JLdUx0dGtvbWt2cUY1OXk5UW9sN09sbkZIcWhBdy9JV2hDT1RRWk1qa0lYTlYwMTJxL2l6WlRBVUF1MC9DdGhPTmtvK1lyeHl5Q2pyVE00MzFOMnp6VTMzdVgwWDBrSzhBV2szb0srdUxJRHdwQ2JScUNoZ2pZMUtDQkRaY1BNQXlIWFNMQUJCRFVyVHZOT2FERmZBSk9odnRma0NnSGc2VXhJZDNKWEVRbVU3ZVRWK2pEZllkeHd5UHlEWXZHUFJLcFp3VDQwaXFvYjYyTVE2K3kzWElFMmJ6bWQ4UCtpdS8wc3N4eFdnd3VFZyt5SkxKdXE5Nm5JdHpmOEx1eVBoZmtHbVdSUTd5VHQxRXpUdW91NzIwNnVBNjVkcnQ5SnpzNEoxWjdRRzgvdHlEOWZodnhTZFFTd0VDRkFBS0FBQUFDQUFLWG14Ry8zMElCSlVCQUFDVEF3QUFIUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFibTl5YldGMGFYWmxMWFI1Y0dWekxYZGxZbE5sY25abGNpNTViV3hRU3dVR0FBQUFBQUVBQVFCTEFBQUEwQUVBQUFBQSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDZfTm9ybWF0aXZlVHlwZUNJLXdlYlNlcnZlci9jb21tYW5kIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDZfTm9ybWF0aXZlVHlwZUNJLXdlYlNlcnZlci9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTViMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL2NvbW1hbmQKQEAgLTAsMCArMSwxNSBAQAoraGVhZGVycz1gcGFzdGUgLXMgLWQiICIgaGVhZGVyc2AKKworY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMS9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiAke2hlYWRlcnN9IC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgICIKKworZWNobyAkY29tbWFuZCA+IHRvRXhlYworY2htb2QgK3ggdG9FeGVjCisuL3RvRXhlYworCisKKyMkY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL2NvbW1hbmRUcmlhbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA2X05vcm1hdGl2ZVR5cGVDSS13ZWJTZXJ2ZXIvY29tbWFuZFRyaWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTZhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL2NvbW1hbmRUcmlhbApAQCAtMCwwICsxLDEyIEBACitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiIgorY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCitjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA2X05vcm1hdGl2ZVR5cGVDSS13ZWJTZXJ2ZXIvY29udGVudE1ENS50eHQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL2NvbnRlbnRNRDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhM2MxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK1ltWmtPR1ZoWmpneE1tUmpNak5tT0RneE16UTNOMk5rT0dNek5tVmlNR0k9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDZfTm9ybWF0aXZlVHlwZUNJLXdlYlNlcnZlci9oZWFkZXJzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDZfTm9ybWF0aXZlVHlwZUNJLXdlYlNlcnZlci9oZWFkZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMWRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL3Jlc3VsdHMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wNl9Ob3JtYXRpdmVUeXBlQ0ktd2ViU2VydmVyL3Jlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA2X05vcm1hdGl2ZVR5cGVDSS13ZWJTZXJ2ZXIvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDQ6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA2X05vcm1hdGl2ZVR5cGVDSS13ZWJTZXJ2ZXIvdG9FeGVjIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDZfTm9ybWF0aXZlVHlwZUNJLXdlYlNlcnZlci90b0V4ZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0ZTU4MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA2X05vcm1hdGl2ZVR5cGVDSS13ZWJTZXJ2ZXIvdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLVhQT1NUICJodHRwOi8vMTcyLjIwLjQzLjEyMjo4MDgwL3NkYzEvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiIC0taGVhZGVyICJVU0VSX0lEOiBVU0VSX0lEIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXG4iCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vYm9keS50eHQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMjQyNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA3X05vcm1hdGl2ZVR5cGVDSS13ZWJBcHBsaWNhdGlvbi9ib2R5LnR4dApAQCAtMCwwICsxIEBACit7InBheWxvYWROYW1lIjoibm9ybWF0aXZlLXR5cGVzLXdlYkFwcGxpY2F0aW9uLnppcCIsImlzRW5jb2RlZCI6dHJ1ZSwiaXNDb21wcmVzc2VkIjp0cnVlLCJhcnRpZmFjdExpc3QiOlt7ImFydGlmYWN0TmFtZSI6Im5ldHdvcmsucG5nIiwiYXJ0aWZhY3RUeXBlIjoiSUNPTiIsImFydGlmYWN0RGVzY3JpcHRpb24iOiIiLCJhcnRpZmFjdFBhdGgiOiJpbWFnZXMvbmV0d29yay5wbmcifV0sInBheWxvYWREYXRhIjoiVUVzREJBb0FBQUFJQUNCZWJFWW40V3IzZ3dFQUFCOERBQUFpQUFBQWJtOXliV0YwYVhabExYUjVjR1Z6TFhkbFlrRndjR3hwWTJGMGFXOXVMbmx0YkgxUU8yL2JNQkRlOVNzT21TdkdRVGNOQVF3dlFZYzRxQXgwRkM3a3lTSXFrU3p2Wk1QL3ZpU3QrQkdrQlJmaTdydnZKWjQxZG9aNjY2eFk3N2c3VU9UMGFVREtpdTBVUnVwT09JM2RVN2RLNzJoVzM2dEtLTTFScUhNNDBRS3VuWThUaWoxUUxhZEFYQi9wZlIzQ2FEVm03dXNOempMNDJNQnUyMjdXc050Y054ZjFKN1ZLTDJ2VjdldjZyWDNaN3FyS0VPdG9neFRFeGp0QjZ4aGtJTGdvUTFHR2F5SlZwUVErQ2pjVlFBMFBYenVOM2t2emhlYkQvNDVTdkpaaXN2eXZ5OHA1UTEwQlovWENvdktNMWErN2F2SVdrdW1ZeUUzWFJ6ODFkK2lmeWQ0Q3VXbmd1WXdBZHFtQWM1WDNySkNQSVZLSXhPU0VBWUY5TDBlTUJIZ0Rrd0VGTkRwNEo1alE0WjRNb0RNUTV6UTZwYXNMK1RsdTRWVUFiU0J0ZTZ1WHpuMFBxWkZiWmdhZTlRREk4QU1QK0ExSXRBTHQ1OUZrcVNVdTVMakpnK1hDbzBvb3dUMDNTenlyYzloSE95VmovT2hJamo3K1ZzSHR5ejdTbjlsR21uTEFqNHNhQnMvU2ZDNzg3SDdCUUZIN3dFUWF6NDRIRzFpOXBHc3lXMWY5QlZCTEF3UUtBQUFBQUFBZ1hteEdBQUFBQUFBQUFBQUFBQUFBQndBQUFHbHRZV2RsY3k5UVN3TUVDZ0FBQUFBQUlGNXNSZ1NsZTNIYmJ3SUEyMjhDQUJJQUFBQnBiV0ZuWlhNdmJtVjBkMjl5YXk1d2JtZUpVRTVIRFFvYUNnQUFBQTFKU0VSU0FBQUIrUUFBQWdBSUJnQUFBSUhERmFnQUFBQUVjMEpKVkFnSUNBaDhDR1NJQUFBQUNYQklXWE1BQUtITUFBQ2h6QUhTWnIra0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCM2QzY3VhVzVyYzJOaGNHVXViM0pubSs0OEdnQUFBQk4wUlZoMFFYVjBhRzl5QUhkaGNuTjZZWGRwWVc1cllReStTNWNBQUFFamRFVllkRVJsYzJOeWFYQjBhVzl1QUNKSmJuUmxjbTVsZENJZ2FXTnZiaUJtY205dElEeGhJR2h5WldZOUltaDBkSEE2THk5MFlXNW5ieTVtY21WbFpHVnphM1J2Y0M1dmNtY3ZWR0Z1WjI5ZlJHVnphM1J2Y0Y5UWNtOXFaV04wSWo0Z1ZHRnVaMjhnVUhKdmFtVmpkQ0E4TDJFK0lGeHVQR0p5UGp4aWNqNWNibE5wYm1ObElIWmxjbk5wYjI0Z01DNDRMamt3SUZSaGJtZHZJRkJ5YjJwbFkzUWdhV052Ym5NZ1lYSmxJRkIxWW14cFl5QkViMjFoYVc0NklEeGhJR2h5WldZOUltaDBkSEE2THk5MFlXNW5ieTVtY21WbFpHVnphM1J2Y0M1dmNtY3ZSbkpsY1hWbGJuUnNlVjlCYzJ0bFpGOVJkV1Z6ZEdsdmJuTWpWR1Z5YlhOZmIyWmZWWE5sTGpOR0lqNGdWR0Z1WjI4Z1VISnZhbVZqZENCR1FWRWdQQzloUGhTdFlpZ0FBQUFoZEVWWWRFTnlaV0YwYVc5dUlGUnBiV1VBTWpBeE1DMHdNeTB5T1ZRd09Ub3dNVG95T0RSVFFUMEFBQUJXZEVWWWRGTnZkWEpqWlFCb2RIUndPaTh2YjNCbGJtTnNhWEJoY25RdWIzSm5MMlJsZEdGcGJDOHpOVE00T1M5MFlXNW5ieTFoY0hCc2FXTmhkR2x2Ym5NdGFXNTBaWEp1WlhRdFlua3RkMkZ5YzNwaGQybGhibXRobzF5eGFnQUFBRWwwUlZoMFEyOXdlWEpwWjJoMEFGQjFZbXhwWXlCRWIyMWhhVzRnYUhSMGNEb3ZMMk55WldGMGFYWmxZMjl0Ylc5dWN5NXZjbWN2YkdsalpXNXpaWE12Y0hWaWJHbGpaRzl0WVdsdUwxbkQvc29BQUNBQVNVUkJWSGljN0wxM21DWkpYdC81eVh4ZHZWWDFsbmZkWFYzdC9YaS9OYnV6dzg0T01Dd2dzeHg3UXB4T1FpdmdKUG9PaVR2UVNTZUJoS1NURG9GMEtoMGNDd0t0Rmg0RUVpQ0RGamZMN3JJejcwenZUTSswOTk1VmQzbjMxbXN6UTM5a1JtWkVaTDVsZXFxN2VucmUzL05VcFl1TWpJek1Oejd4L1lWSlN3aEJ3eHJXc0FmZmhvY1B0Z0hkUUkreFZOZXpRRnI1eXhqYjZ2NE00QUlWLzYrc3JGZnE3QzhBay83ZlJOd3lueDhwM0xOTWFGakRHcllxc3hxUWIxakQxdCtHaHc5MkFOdjh2KzNLK2lEUWl3ZncxTG9sY0hWV3dvUCtPSEFkdUF4YzhwZVhnY3Y1L01qQytpV3ZZUTM3NkZnRDhnMXIySDJ5NGVHRFc0QUR3Rlowa0c4RE90WXZaZXRpRTRUUVZ5c0F4L1A1a2R2cm1iQ0dOZXhoc2dia0c5YXdOYmJoNFlNNTRGSGdNZVh2VWFCdFBkUDFJYkp4NERod1RQazdsYytQRk5jMVZRMXIySWZRR3BCdldNTStnQTBQSHh3Q25rTUgrbGJBV3Nka1BZem1BQmZRd1g4b254KzVzNjZwYWxqREhuQnJRTDVoRFZ1aERROGZUT0JCL0VYLzcrTjRiZVlOV3orN0FMeXAvSjNPNTBjYWhWckRHdVpiQS9JTmExZ2Q4OTN1THhCQy9RV2dkVjBUMWJEbGJBcDRpeEQ2N3pUYy9BMzdLRnNEOGcxcm1HL0R3d2V6d012QXR3TXY0YldqSjlZelRRMzd3RllGRGdOZkIvNEFlRE9mSDZtdWI1SWExckQ3WnczSU4rd2piY1BEQjNjQnIvbC9Md05ONjVxZ2h0MXJtd2RlQjM0ZitQMThmdVRHT3FlbllRMjdwOWFBZk1NK1VqWThmTEFaRCtZUzdEdldOVUVOVzI4N2dROTg0STJHeW0vWXcyWU55RGZzb2JmaDRZT2JnYy9pUWYwbEdtcTlZZkUyRDN3RkQvaS9tOCtQaks5emVocldzQTlzRGNnMzdLRzA0ZUdERzRIdkFUNEhmSXlIZkVpYmJkdWtVZ21TeVFUSlZKSmtLa2tpNlMyVHlTVEpaSUtFM09ldko1TUpCT0JVYTlScWpyYXMxbW80dFNwTzFhRmFkWEJxTldyKzhWcXRodXMrOU9XR0Evd0o4SnQ0d0o5YTUvUTByR0YzWlEzSU4reWhzZUhoZy8xNGl2MXplTVBiN1BWTjBRZXpkRHBKVzJjYm5kMmR0TFMxME55YXBibTFtV3h6bG14ekU5bVdMSmxzRTAzTlRhUXphVkxwRk1sMGlyaWZ0UG83RjhxL2NEMVl4Snp2aFJOQ1VLdFVxWllyVkVwbFNvdGxTcVVTeGNVU3BVS1JvdkszTUR2UHpQZ1VpNHNsYWpWblRmTmxIYXlLMTQ3L1c4Qi95dWRIWnRZNVBRMXIySXF0QWZtR2ZhaHRlUGhnRHg3WXZ4ZjRKQitpM3ZDcFZJS1cxaXpkZlQxMDluWFMxZE5GUjNjNzdWM3R0SFhreUxZMmsweXAwOVVMRGNCeGdBNk8xZmxkeS8waTNLSEZKYlN3MnBuS09US2MwTTR4S3hMQ0ZWUktKWW9MaXl6TXpETTdQY2ZjOUJ5elV6UE1Ua3d6TXpsTHFWakNjZHpZdEQ2Z1ZnSCtFQS80L3ptZkg1bGY1L1EwckdGTFdnUHlEZnZRMmZEd1FSdjROdUR6d0hjRHlmVk4wZEtXU2lYcDZtbG40NVpOREF6MjA3ZXhsNjdlVGxweUxhU2Jtc0F5SUczOEpsV1lCM2l0QTNzenFDQW1Mb1hNRVZXdkg0NjVsb2paYjFRK2pJcERYWStCNjFJdWxpak9GNWllbkdaaWRKTHhXM2NZdjNtSCtkbUZEd1A4aThCdkFMK1V6NCs4dmQ2SmFWakQ0cXdCK1laOWFNeWZRdllIL0wvTjY1eWNpRm1XUld1dW1VMWJOckJoYUFQOUcvdm9IZWltbzZlVFROYnI2MWRYSFd0NzVZcUkyYWV2ckVUWm03OXhMZFo2c0svcndoY3grOEs0WWxYOUV2SEdoNFhTNGlKekV6Tk1qazB4ZVh1YzhWdGpUSXlPVTF3czhZRGFDZUNYZ1M4MTJ1OGI5aUJaQS9JTmU2QnRlUGhnQ2srdGZ4NzRWaDZnZHZaME9zbW1MUnZZdG1jclE5czNNekRZVDJ0SERzc3lraWpxd0h3WjRKc0szbVNxdXJKYTJNZDVEbGJ1d3I4TDBBZUhSVXljUmlWRXEzaUUxM0lkaDhMc1BHTTN4cmg5N1NZM0w5MWc4czdFZzZiNFM4RHY0S243cjYxeldocldzQWJrRy9aZzJ2RHd3ZDE0WVArZmdiNTFUZzRBdWJabXR1N2F3cmJkVzltMGJTUDlHL3BJWnpPeFllTTZyNm1yMFRaMFBXd01PK3NlMC9ZdkIzdkRoVi9YYTdDc3FxL3YzbC9PZlMrVUUrSXFCR3B5VE5BSGNmazdLc1VpRTdmR3VIMXRsTkVyTjdsemZaUlNxY0lEWXVmeDFQMFhHeC9TYWRoNldRUHlEWHRnYkhqNG9BVjhKL0MzOENhc1dWZHJiMjlseitPNzJiNW5LNE5iTjlMWjA0V2RURUFjSkNNYmNjZGkzT1l4UDc5WTRNY3Bjek8rT2dHWGc3MklDYWpDUHc3bWNTNzIxWUJldlM4VDVMSHhMZ0Y2dGRMZzFHck1qRTl5NThZZGJsNjR5bzBMMXg0RTZGZUIvd0w4aTN4KzVNMzFUa3pEUGxyV2dIekQxdDJHaHc4MkFYOEpEKzU3MWlzZGlVU0NMVHNIT2ZERVhyYnYyMGIveGo3c1JIeG4vZWl2SmdxOU9rZWpBSzRUNmZLOTJ5TkhsR1AxWVYrdE9WUXFWY3FWS3VWeWxhYW1OTzF0TGZXYkIxVDFyeTJFQWVLVmdUNjh0M3NEZXZWNHJWcGwvT1lkYmx5NHh0VXpsNWdhbTF6dk1mNXZBeitMTi9iK1F6KzJzR0VQdmpVZzM3QjFNMy80Mjkvdy8zclhJdzN0SGEzc2YzSXZ1eC9aeFphZG0ybkptUitaaTROYnZFVjBlZ1I2YXJnbDRsMVMzUzhOZTlkeEtWZXFsTXBWS3BVYTVYSWxnSG01NHUyVGJkaXFXczlrVXZUMWR0RFgwMEhLSDdZWGNlc2JEZi8xUUsvZndpcEJiNFJSTDdzYTBLdnBGVW84aFprNVJxL2U0UHJaSzF5L2NKVlNzY3c2MlNYZ1h3Sy9rcytQRk5ZckVRMTcrSzBCK1liZGQvUGIyLzhtWG50NzluNWUyN1l0QnJkdTVQSG5IbVhuZmsrdFczYUNTcVZLb1ZpbVZLcFFxVlRac3JsZm15SXZWcmt2QTM2aC80c05HMkJvQmVyZUZTN2xjczBIZG9XU0JIZTVTc2tIdWVNNE1mQmZLb0VHd0Mzb2JHK2x0N2VUcm81V3dOTGQrZ2JKVGRDclVRbHRXNFY3MU90aGRzaUxDeFBHb2xRc1ZnQjZMUytVODV4cWpjbmJZOXk0Y0kzTEo4NHhOVDdOT3RnMDhBdkFTRDQvY25zOUV0Q3doOXNha0cvWWZiUGg0WU1mQi81MzRMdTRqNzNrTGN0aWNNc0FqejcvR050MmJ5SFQyc0ppc1VLeFdLSllxbEFzVlJCdTJFTmJBSHQyYkdLZ3Z5c2FXUjExSGdWZnpGR2hoNDEzVFh0UVdsZ29NajJ6d0h5aFNLWHNBYnhTcXhsaGpXdkh4cmRVQ1AyQTJScytuVTdTMjkxQlgyODdtVXhhRHk3aTdyZSsrOTRFdlhxOU1PemFnajVPeld2aGxHT3U2eko3WjV6THB5OXg2ZmhaWmlabnVjOVdBWDRkK0xsOGZ1VEUvYjU0d3g1ZWEwQytZZmZjaG9jUHZnajhOUEF0OSt1YWxtV3hZYkNQcDRlZllQL2p1NWtwMTdnMU9oa2JOdTQza0VvbmVlN0pQU1FTOFhXUjVSaHJ0bUZIZ2h2UUs1V3JUTThzTUQwN3ovUk1nWnJqMUUyYmpLUmFjNms2anJlc3VkUWNoMnJOd1hFRnJoQUlWK0RLZGVHcjEyQmI3dk84R3haZ1d4WllscmR0Z1cxNSt5ekxwcnM3eCtaTnZRejBkWkJLSkxBdFNGZ1d0dTNsdFhibmNhQlhWTDkyR3lzRWZXeUZaUVd1KzZYVXZIbGVVSGx3WGFadmozUDUxRVV1blRqTDNQUjluZFJPQUw4TC9HUUQ5ZzFiQzJ0QXZtSDN6SWFIRHo0SC9FTzgyZW51dVZrV0RHenM1YW1QUGNHQnAvYlN0NkVQTExoNFpaUWJveE42NERqNEdyK0Z3WTA5N05pMlFUbGUvOXIxb0s5cFkyVy80N2pNekMwd05iUEE5TXdDUmFWdHVPYTRsQ28xNzY4Y0xpWFVheldYbXVQaXNkVUR0TEQ4TC9CWXkzK0pKM0liZ2JMMS9rbmdlYnRkN2I1VHFTUkRnMzFzSGVvbmwyc0o2R3piRnJibC9TVnNTTmdXeVlSTk1tR1J0QzFTQ2E4Q0VZQWM1WnBHYzhDYWdWNnJRTlFEZlhpL2NjMFBydU13TlRyR2xWTVh1SHp5SFBPejk2MzUzTVdiT3Zlbjh2bVJzL2Zyb2cxNytLd0IrWWF0dVEwUEgzd1NEKzdmZVQrdTE1Uk44OHpIbitUWkY1OWs0NWFOV0hhSXVmTVhSN2wxWjZMK3lVdW9jTXV5ZU9hSjNUUm4wM1hQcWZmckVURUI1aGVLVE0vTU16Vzd3T1RrSEhPTEZZbyt4TXNLMEtXS2wrYXgwWU81WlVtc1k0VHg5d1dId2d0cm9XUFNidDZEY01QOW9VY2k5QVo0ZFFGQlowZU9MVVA5REc3c0pabXc2NElTUDN6Q3RrZ2tMRksyVFVMQ1AybVRUdHJZbHA1bnk0RmVyMVN0SHZSNmhVRlYvZUU5Q3lVZEFHN05aZXo2VGM2L2Y0ckxweTU2L1IvdXZUbkFyd0gvTUo4ZnVYUS9MdGl3aDhzYWtHL1ltdG53OE1GSGdIOEEvRG51OGFkZExjdGk2ODdOREwveUhQdWYyRU5UTnZxSitIT1hibkhyZHJ5TFBtTEMzUFIyZEhYa2VHei90dWl4K2w3MHdDcVZHcFBUYzl5OE04UDFXNU5NenhVcEZDc1VTaFdxTlZjN1NUMHZBTGtsZkxCYitrRVp4anlKTU5OVkQ0SmxQZ2tqN2VhSU1xMkNJcUh1NzRpNHc0WDNtZHRORzdyWk10UlBSMGN1OUF5WTV5emhtdmVBYjVGT0pnTHdweEsrbHdMamZCUDBJa2hSZkRqbHVuRmVnZURjWlVBZk9oMEVwWVVDbDA5ZDRQemhFL2VydzE0TitGWGdwL1A1a2V2MzQ0SU5lemlzQWZtR2ZXQWJIajY0Qi9ncHZDL0IzZE1PZGEydFdaNy81RE04UGZ3NEE0TURzV0VFZ3ZPWFJybDVld2tGSDM5aVlNbGtncDd1Tm5xN08ranFhR0dwT29zRWd1TUliay9NY2UzV0pKZXVqM1Byemd5bGNyV3UybGROVmVncTFDM0x3dkpoSHdRMHprT1k3ZUw2TFZtV2lrcmpJS0U2anozZnJ3RzRBVmdWWlUrd2l2QmhubXZKTXJTNWowMmIra2duazZzQ3ZYbmNBcElKaTNUU0pwTk0wSlJPa0VyNjRMOEwwTmM3cHQyWkFmcDZIb0hndm9YTHhJM2JYRGh5bXN1bnpsT3QxTGpIVmdHK0FQeVRmSDVrOUY1ZnJHRWZmbXRBdm1GM2JjUERCN3Z3bFBzUGN3Ky9CR2RaRnJzUGJHZjRXNTVqejJNN1NXZThxV1FkeDJXeFZLWlVyRkFzbFNrV0t5eVd5aFNMWlNwVnZiQmR5VnVlVENUbzZXcWp0NmVkem82YzF4RXRPRGNhZytNS0ptY0tYTDA1eWNWcjQxeTZQazZ0V2x2UnRlUjlXWDRidW1WWjJyNGdFaXQwenNjSWVsM0JTektxMThEU1ZIMnNHYjNxNDlxK2hXdTJhWXRZVjdqcnkvNjl1d2JadFhNelFnaS9nbUIyeURQSHg2K3NJbUJaa0VuYU5LVVRaRklKbWxLMmwzY0s3ZVBVZUpCbWpHdm90UVFsN0JMcFVpc1V5bnBsc2NTMU14YzU5OTRKSnN3K0lHdHZCZUNmQXY4OG54OTVZTC9hMDdEMXR3YmtHN1pxR3g0K21BVCtPcDU2Nzd4WDEwbW1Fcnp3eWFmNStDc3YwTC9KbTc1K2NucWVHNk1URkFwbEtwVnd1bElCRVpVYkhxei9qaWRzWDdIM3ROUGRrUXZhOHlObkNLZzVncm5GQ3RkdVRYTHgyaGlYcm8yeFdDeEZ3c1djcXBuc3pXNkMzZkx2UWVOMzBLUE9hSS8zZmZYaHRyWlFMTnhUSC9aQzI2VzY3ME1HK3FEMWczcVZBV1hZb1ZBZ0t1Q1ZsNThpMjVUMndybGgrTkFqd0YyRFhqc3VJSjIwYUVwNVNqK1RUcENVZlRJTTBDL2R6cS9ranFibW8ra3kwK1NIQ005MUJSTTNibkg2MEZHdW43OXlyMmZZdXdyOFJENC84cHYzOGlJTisvQmFBL0lOVzVVTkR4OThEZmc1WU8rOXVrWkxhNVpQZnZ1TFBQL0pwMm5yYUVNSXdmakVETmR1VHJCUUtDNTU3a3JmNWx4TGxzRU5QZlQxdG1QYllhY3hOUllob0ZSMXVINTdtdk5YeHJoeWZaeUo2YmtsNmd5aTdtYWcwQW5oTG1FdndTNTd5L3U3bExaNUdaY2FoMzZwZXUzdWNXNThFL2JhL2Zqd01ySWloSmpQZGRjL01hNjl1NmU3ZytlZjJlZERVQVRxWG9ZSmh2VEpPQWlQM3kzbzFmTlNTWXZtZEpKc0prRTJsUUJMVWVocUhKR09lT2IxbE9zU1UxR0lwTW5vYkloZ2ZueWFzNGVQYytIb0dXclZlK3JLZnhQNDBYeCs1TjE3ZVpHR2ZmaXNBZm1HcmNpR2h3L3V4WVA3YS9mcUduMGJ1bm5sTXkveHhIT1BrTTQySVZ5WDBiRnBydCtjb0ZoYS9mU2pFUVZ0V2ZUMWREQzRzWnRjYTNQc09kV2FTNm5xVXF5NlZLb3ViNzV6bXRQbjZ2ZHpXdnJYSXdLNDIraXEzZC9RNEc2QzNVSlIrRXA0QVlyYTE3dmF5VzJacm5vOUNWVFFtMFZBN0l4MEtpUUQwSXNRc0g0Z0llRHBKM2N6ME9kTkpPUUJYdUJLR1BwZ2xPQVB4dXo3aVZvVjZHTWdyYnJaRVY1K05LWHRBUHFwaEIzYnpGRFhiYTljZDhrZSswWmxRTTFiQVpRWENsdzhlcHF6N3h4bmNabUs2Z2N3QVh3UitEdU45dnFHU1d0QXZtRkwydkR3d1U0OHQveGY1eDYwdTFzVzdOaTlsVTk5NWhQc2VYUW5kaktKNjdqY3ZEM0pqVnNUbEt2Vk1QQmR2cXFaZElwTkc3clpPTkJOS3FsL2NFYUFCL1dLUTZucTRyaXlvQmE4Y2VnVVp5L2NYTlcxQXJoS3VGdUdNcmNzTEtHRG5YcGdWOVcvM0NiY0ZrUW5vbEczZzhyQUV2a21VS0FZN0F6bHNqeHVna3NHY3hYZnRzQ2JKZStWbDU3R3NpR1ljTWNQN0FLNCtNQVhnZXZlRllTdS9BOEllbE5acXg0RWdGVENwam1UcERtVElKdE9hTWMwTmE5Q1hqa1c1N1kzS3hlbW1sZVZmNjFhNGZxcGk1eis1aEdtNzEydi9BWGcvOGFiUGEvUlh2OFJ0d2JrUHh4bTFWbks5ZWpJS2QyRWNjemNqcGovMmRjZkJ2NFJFRE8vNndjenk3SjQ1TWs5dlByZEx6TzBZeEFzaTFyTjRjYm9KRGR1VGxCMVBOZG0zVDd0eTRBcm1ValEzdDdDeHY1dWVycHljaDZXd0R5d2UzQjNsZHlRaGY2ZnZuV0M4NWR2cmZyYUp0d2xxQzFGdFd1S25SRHNXbmk1SHU0T1hmY283ZmxDd2o1SWdaWkFvMC9hTXJkakt0RVFnRUd6c3FtZUZaQUxZUHZXQWZidEhncUJMVHpudjRDZzg1N1hmZzhDTjJ5djk0KzdpR0RmM1lIZTdDVmZ2N05kd29hV3BoUXRUVW1hVXJaeUxBYjBCc1JYN3JiWDB5UDN1NDdEMk9WckhIL2pNT08zeG1LZnl4cllGZURIOHZtUjM3bFhGMmpZZzI4TnlEOVlwZ0xiaXRsV2wrYjZjbVkrYUtFc0JaNFRWZ0RDZDgzL0V2RHhWY1MvSXJNczJQdklUbDc3N0NzTTdSaENjdXZxalRHdVhoL0RVZWFRWDdFSnlHWXp0TGUxMEo1cnByMnRoWmJtVENSWXVlcXlXUEgrM0RydnZTc0VYMzNqR0pldXJ1SmJJUUlENUZiWW1VN1pod0ozZVF4ZmZRY1BXb0k5QnVvcXg4UGhkc0V1WDducnlsN2RYQkwyS3FEVTNZcXE5L0luREtGQjNnLzI4b3VQMGR5U0FhRU11L1BEU0FVdnc4dDJmZWtOQ0xjaDZKVWZCMm1VL1FiTTllYUR1TEJoMnZWeCtoN3dXN05KTXNrRVdnVkR5NlA0ODNYUW0wMGdxa2RERCsrNkxyY3ZYdVhFRys4d3VkSTVIVlp2L3duNEcvbjhTSjFhYThNZVptdEFmbjNOcXZOSHpMcTZOTmRYYWlKbVBWais3dSsra2ZyWC8vby8vVmkxV3ZzL2hSQ1pjSDd6dFhsSGR1M2J4bmQ4OWhXMjdkbW1kUlM3TXo3REthM2RlL25yV1piTjVvMDlkTFMzMEpackpwV0tiMG1RWUM4dUFYWnBydXZ5K3RlUGNQWEcyQXBTNEtjRHNHd0Q3bUFBWDY4RXlKdlhPOTdKU1d2MDg0Vi9FVlh0cTNGRUpycUx2QllydXhNVmFLcWFEZEN2eklLbjVxT0VuWENocTZPVkY1N2JIN3d6RW5icU8rUzU3UDAyZWxmV0xLVjZEOTgzNmRwM2ZGa2ZyOFpObFd3YzA1UzREdnFsT3VJbGJKdldwaVN0VFVreVV1RnIrYlRFc0xwVnFIbHQzbnpYWWZUQ1pZNS80OTE3NWNhZkJYNGMrS1Y4ZnFSUjZIK0VyQUg1KzI4VzNvUXhTNEc5SHR6allNOFMrNkMrZ2xmWHhmZC8vejk1ZG5SMDZ2OXpYWGMvcUFXelV2QzY0cTZBdjMzWFpsNzc3S2ZaZFdCSHBMZDNzVlRoM1NQbnFUbExLWGo5bXNsa2tzZjNiNkc5emZ6MnUyYzFWN0JZZGlpVXd6YjJsZGlSRTVmNDV2dm5sMHlER3B0bFdkZ1dkWlc3T2dZK292QzlDSUo0d3JDRVNsMFE3QmRHKzd5Wmo0SDdYa3V0K2xMbytTQ01GZldvYXg0a1ZPUCtoallVVHI0VGorM2Z4c1lOUGNGWlVxRUhVK0VHTUEvakM5dnRsYzU0dmh2QXhWZjh3bFZjK1BHZ1h3cTZRU2hEUmNjMUJaam5weEkyYmMwcGN0a1V0ai8zcmdueHVHRjFXc1VpVElIV244Rk1yMEFnYWk0M3oxL2s1QnZ2M3FzdjRmMHA4TmZ5K1pGejl5THloajE0MW9EOC9iRjZZRitKZ2w5T3hhOUUwZGNEdmZnUC8rSHJMVi84NGgvOVgrVnk1WWVFRUxhbVBvUlJDUG5RbDdEWEN2NFlHOXEya2M5OHo2dnNmbXhYMkFFTjFBWmtSdTlNY1dkaWxrS2hTTG5lYkdIS0hXWlNLWjU0WkJ1dExmcG42SVh3aHJzdGxGM0sxWlc3L0RYbnRJQlRaNi94OW50bnFkWHF4eEdxZDQvQ3RqOHUyelpCSDZmd2cyMHZKcjJUbmRtYlhua0IxSjcxaHVzZW9wQ1g5N1BVMjZHeTNNd0h1UWdCcUVKZUJUY2dCSWxFZ2srOTlDUzJiWVhIbFBjbkJMaEg2N0RYUFpIT2VBSlpRVEI2NFFmZ1Z5c2ZmdXBFZUQ5THFldDQxYStBdXM3NWxnWE5tU1J0elNteTZiRHo1bXJjOXRGd1JNTEpNSzdqY1AzMEJVNjllWmk1bWJsNmovQnVyWVQzYlltZnllZEg3dmtVZlExYlgydEEvdDdaU3NHK1dsZjkzYnJzaGJuKzEvN2F6Mzc2NXMySm4zRmRkN1BwbHRkbU5GTUxTODJGNzMvSzFGRDQzYjJkL05udmU0MUhudHJuZmFvMVpxeDJ4Q3lvVmgwS2hSS0ZSZTl2b1ZCaW9WaWlWdk0rQk5LU3pmREVnUjAwTmFXQzA2cU9ZTEhpc0ZoZTNoMi8wbGQ5ZG02UlAzbnpLR01UaXBMeXo5WFZld2h3TzRDdDkwOVQrS2pBOTI3Vzl1T0t1T0pWTjd6YVdVL05LaVUvOVE1MzBheldaN3d6YmtiWkVuVThIcUZpRDZWMHBQSUhERzNxWWQrZXJkNDUvb2xCaHpzL2tBUjRzSTJJNzR6bnI3dHVlTDVRd3J2Q2ZGZnJLK2lsajRrVm5hOVZGSVFnbWJCcHk2YklOU2RKMkhZa0xqTzhrdEtZWnBHbHozV2NHbGVQbmVYNEcrOVFMcTUrR09reWRnVDRmRDQvY25pdEkyN1lnMk1OeUsrOXFXQmZLOGpIZ1gwMWdKY21BSDduZDc3UjhldS8vcFYvWENwVlBtcytmMU9oaHdXUXVsOTM0Y3Z0VkNyQnE5LzlNcC80MW8rUmFkSTd2a1VTYXkxL0MvSm9xVnlsc0ZnaWw4c0c4NkVYSzU0N3ZyeUU0cjViay9mMi9vbExIRDU2QVZlSWlES1huZ25iY05XckZRQkFxUWdvQ3QrbnRtMUpsN3hTQWJEMHlvQmVDUkRldHJEcXd6MEc4dmluUnRHdWJvWDAwZFduQ2lzRGlrbzcvUXZQN3FjdGwxVmdMYzhoY0xtSGVSdXFWKzlQQVR2NnV4WjJ5Z3ZiN1YzWGYvY1VON3V1b1BWckIzZG5ncmVPaW80OVB4YkkwTnlVb0MyYnBxVXBXZGR0ci8vR1lqcmhHZkhHblZ0WkxITG03ZmM0Lzk0cDNMdnBuRnJmSE9CZkFIOC9ueCs1WndQNEc3Wisxb0Q4MnBrRStnZUYvRXJVdkxrZXR5MU5lOEEvL3VPLytPSzVjemYvWDlkMUIwemw3aTFObFJRV3VISEFGOExyTVBiMEM0L3g3WC8rRmRxNzIwMStLS21MVDJKRTZOZDVKWVdBUXRsaG9iSzZ0dmE2cHNFc1ByNkpxVG0rK28xanpNd1hZdFc3Q200Vi9CTGlzdE1kS01wZTJiYjlmRkhCcnZiQVI5a0hlalphaEVxOW5yUEViTHVQL3R4RlpFMVY5VXNEMHlOUnJyV1pqejIzUDNDeFM0Z0pQeTRaV3dCc1B4RnFyM3JodW43NEVHNUJPRVh0dTc2SElPaUJMK2MxTU5LMEpLaVZZeEhRS3hXSHV1MzdKc3p4eHQ5M3RLYklOYVc4aDFFbmZ2TWFTNlUxYnYvOHhCVEh2dlkybzVkdm1BL3lnOXBwNFB2eStaRWpheDF4dzliWEdwRC80R2JDZlNXUVYvZFRKd3dyV0pycjlVeGN1emFXK3NtZi9MYy9NVE96OEhsNVRteTdaQVR3OWVFT3NHWDdKajd6dmQvSzBQYk5ma0owWElxWTVOVUZVbHpDQWNlRmhiSkRvZXdneE4yNU1PSnMyVGZmdjFiTmRYam4vZk9jUEhzMWdIazRKQzdHZlU4SWI5dW50d3dEUWdHOVdtbFFGYnV4cnJYSGgvSEljTjR5dkI4dGYrTXlPd2IwYWpIZ0J1UWhvamFGRWw1dTc5ODl4T0NtM2tDTnE4ZUQ2VzlCT3lmc1RhOVVDbVN2ZXhFTzFRdlZ1OTUrTDRmWWFhQ1BWRUxpUVIwZ05qYU1lcDlMbkY4SDRyWUY3UzFwMnB2VEpHeWk0WlU0WmJ4cW5vYjc2cVhQdS9jN2w2NXg3R3R2TVRlMXB1MzFGZUR2QWovYjZJSC84RmdEOG5kdjllQytIT1JYMHJQK2J0VjhySDNoQzcrMzg2dGZQZkl2cTlYYVBvZ3YxS1NaaWw0SGZIaThyYTJGMXo3N0NvOCtmUUE3WVFlcDBSU0xra2p6TFZ0SndxdU9ZTDdrVUt5NE1TZlU4UW9ZMi9YZmJySGtwaHFoeDJPTDBUdVRmT090VXhRV1N4NjA3YkROM2ZZbGU1eDczbFQ0RmhhMkxSQ0dhamRWZmpBem50S3BMbkRqcTJrejcxdHRzNjk3Ly9vdFM0QjQ2OGI3RVlSUndPUERKbUhidkRUOG1OZjNBZ2xySFh4cWIza2dVUGRCNTd0QTJldnZtUVNjcTFRSVhPSEZiN2JudTlJVEVJRzU4VTdIS1AyVmhJa29mUzI4ZWsxL2h3VnQyVFFkTFNsdktsM2xuTHA1SE9NeGlidXUzT2ZVcWx3NWVwcFQrZmVvbE1PUE5hMkJmUVg0UzQxeDlRK0hOU0MvZWpPQnZoVGNWd3I1NVVDLzFISkorN0VmKzRYdnYzbHo0c2VGRUUyeExzTmduOEFFdkF5bkFqK1JTUERTdDc3QWk2ODhUMU0yYkhlUFUreUtadklTckJTOGRjMkNVbFd3VUhJbzErSmp2WmNXcEZWKzVVMUEwRTRPVktvMTNuN3ZMSmV1akdvS1hYUFJleEZvdmU2eHdCSVdYait0NkN4NDhrWnR5MUQ1UWNyMENvR1E1MGtsYjRXMFVEdmJMZGZuMFFTNTloN0lQYTU2ekZ0ei9RTWIrcnM1c0hkTEFMSGd1QXBiUlpHcThBNFZ1d1MvN2dFUVNzYzdWOGJqVDMrcnZwT3VDTjM0NGZYcXcxeldaN1JqUXErWTNLM2JQdTdhTFUxSk9sb3lOS1h0R0dpcitWOWZ6VWNxQU1ydnRyU3d5T244dTF3K2ZvNDFMTStuOEliYU5XYkwrNUJiQS9Lck01dDRzSzlFMVM4SCtUalFFN05PekhwaysrdGZQOXI5cFMvOThUOHVGRW92cWZ2ak90cDV5N2pDVEZmdlE5czI4bDJmK3piNk52UktlZXVGVnhKd2UzeUcvdDRPNVFKaGlMQ2dEVThvRnF0TXpTd3dNenVQZzgyR2pRTlVIU1dOZFNEMVFlRmY5NjBYSVJnOUFDdFhzdkR3S2VEYWpYSGVldThNbFhKTjYzU245NnlYNTRmSEFyajcxMUZkOVg2TklvVDdNbTU4L0RCaGZvZ2dqSnJtbFdTRzNzVkJxZUNoUEVJTmxoNkVubmxpTisxdExWNGMvcm55bVBEUENXZStDd0d1S1hqNXdac0EvRXBsd0ZmdDBpV3Z6bk1meE9lL3AycDdmUURlWlNCWjN5MnVRRHh5YkhtM2ZWd252R3dtU1hjdVRTYVZNRHduY1drSjk4V3ErZUQwTUk3SjZ6ZDUvL1UzbVp0YTAvSDF2NHozZGJ2Q1drYmFzUHRuRGNpdnpGVFZ2cFNLWDg1bHY5cXg4aXRSOFpGaS9KLy84OS82NVBIamwvNmg0N2hkb0VBMXNKakN6SEFsaGtvSk1wa2tyMzczeXp6NS9LUFlTWDJNc0FxY3hXS0Z3MGN2OE5Sak8yaldWTDcvenhLVVNqV21aeGVZbWxsZ2VtYUJZcm5DOUZ5UlM3ZW1hVzF0NWMrKzluejhUUzJ4OTROYmVPOGEweldBU3VpSGFTbVZ5dVFQbitIVzZLUTJWTTRPd0J4MTM0UHF0amZDK1Ftd0ZOakxkTWc2bGRvR0gvYW8xL01sMlBTZnowcCs0Y3FuNFJWVmFyNG51bUp0em1aNDRkbDlHdUFDc0NtS1BXeGJEOEdvS25NSnRSRGE4dHErU2c4cUN6N016VXBBekRGdFN0eFlpT3Z0ODNFS2UwV1ZCQzI4R3E5NnJyb3RhTTRrNmM1bFNDZlYrZkxqMHJLeU5LanJ0V3FWODRlT2NQYWRZMnZaQy84OFhxZTh4bWRzUDRUV2dQenlack04NE5jUzh2VVUvTEtBbjVsWlNQNzBUMy9wYjQ2UHovN0ZwVzRvcmwzUlA2SzVRUUgySE5qT3EzL21XK2pvN2dob0lTQjBEL3ZuVzFoY3VETEs2SjBwZXJyYjJiZGowRHVtcEhCNnRzQ1JFeGVEQW4xNm9jaWxHOU5NejNzamR6THBOSC8xKzE2TnBIYzVsL05hbTk3cFRmajdnb002YUlFTGwyL3g3ckdMT0k2anFIb2Y2TnFFT0Fxd2JTdTRUbkRjdTJBQWNBc3YvelMzdmdaNXBSS2k1VkZJZVhYM2ltQXZWT2dvWStRZ2NLRkwyN0Z0STBPRHZSSFZLYmREWmU3SEpyZjlDMmt6M0VtNCt4VUMyY2xPNE9LNmFPcGZ3bHlxL25DdWV3UDBycDhxRWQ1N25CcFdBUnFueUdVV3JOUnRIMWNCME5MaGgyL0pwdWh1VFpOSzJzcHZTNmswdHRaRFVRQUFJQUJKUkVGVXFQc2lGUlZWemF2cDlBTE9qVTF3NUN0dk1qazZIditnVjI5VjRHL244eU0vdDFZUk51eitXQVB5OWMxVTd5YlU0OEMrVnBCZkN1NnhrRDkwNkhUM0Y3LzRSLzlQcVZSK290NGpOWHYxUnZlRkx2cVcxaXpmOW1kZVpzK2p1N0JzNzJ2b1M3MHBWY2ZoM2ZmTzQvZ2RvSjU2YkFmTi9saDU0YWYweVBGTHpNd1ZtRnNvYzJsMG11blpvdll4RWlFRWYvbHpuNktsdWFudWRTSzhYMjBOd01nY3VSVzJmNXZUeDZKNUxFSkZIU2JJQWhZV1NyeDErQXdUazNQMTNmZkliVjNaVzJvNExDVTlvZUtYbFF2TFVxL3J5WFMxVGQvTUpiV3RYcjNmYUw2RXErYTB0cWE2RmE1M3pSZGZlSVNrNzlrSktvZitSamdoam9RVHdidWx0cjBMQ0R2cVFlUkxkSkVlOXhHWUsrK1BQTmNBL2NyYzl1b3h2ZktyM2xkWVdRalBYekplb3dJUXJRaEFhelpKZDJ1R1ZOTFdJTC9hNndSUHpRL2pPZzVYajV6aVpQNHd0ZXFhVFd6M204QmZiYmp2UHp6V2dIeThMUWYzMWJqczF4THlzWUQvdFY5Ny9iRnZmT1A0UDNVY3A4ZThFZlB4aHM4N3BpRHoxeDkvZWg4dmZkc3dMYmxtSmFScVZyRFRnNytnVktseStPaUZvQkR2N1c1bno4NU5udW9YTUQyendGdnZuK2ZTelJrbVp4ZTFBbHBlMnhXQ2w0Y2ZaZGZXRGFSU2lSVUJmTFVpUCs1dFZ6dTRXVDdWVlhXc3RvY0gwQlg0NnlJSUl3U2NQbitERTJldUl2dzRkTmdiYXQ3U085ckpiWGt0czIxZVRXK1FWdlFYUkF1dzVGMGJJWlFnQVpSaVZDeDR6Nm0zdTUxSDltME5ucUdNUTRhVjc0RlUyK0h4VU8zckhmRU1hS3VnRjBMekNzaHRzemUrTi9WdDJJWXZJTmhYdisxOTdkejJHc3doa2pleHNGYldjOWtVM2JrTXlZU2xQdzlSTC8xMTFMengzSW96c3h6N2s3ZTRmZlhtc3UvQkN1MEU4T2Z5K1pFTGF4Vmh3KzZkTlNBZk5SUG1jWC9MS2ZxMWdQeUsxUHpQL014dmZ2YkNoWnMvS2dUeG4yRkRMNkROL1dvaDFkcWE1VHUrNTlOczlUOEJxN3JhQXptdUpFQ04xWFZkM2pwOE5pamdFSjZhenpabGNJWGd2M3psQ0NjdmpBYUtTMVh2UVJ1clg5QzdycUFwa3lMWG1xV3R0Wm5XbGliYVdyUGtXcHZKNWJMa1dyTmttOUwxYm5kVnBtV3VPdlRNVk80aURCaFI4MEZjWHNEWnVRTDVkMDZ6c0ZnS1lGMXZvaHhRT3VYNWFiRFViZFJqeXJXVVdvaFdDWW03UWRYcS9OeUZjaUNzQjRaQUM3RGhBK2V4QTl2b2JNOHB5dFp3MWN1d0lvUlJWTW5yeDF3bERnRkJqL3Nvek1QdFlLcGJQN3lycVBjQTlQSmJDOHE5TFFmeHFPS09WbmpxZ1R2dVhLMENFRlBaa1BzdEN6cGIwblRrTXNHalc2MmFEL1lyMTNSZHdjMVRaem4ydFVOcnBlcG5nZjhwbngvNXIyc1JXY1B1blRVZ0gxcWNXbDlMUlg4M2tLOEhkMnR5Y2k3OWN6LzNIMzU4YW1yKzIxZHljNlk3ejF1RzI3djJidVhUMy8xSldscGJ0QUxmblB2Y2hEdks5cUhENTNCY0p5aUErcnJiMlRUWXovbXJFL3orVjkvWFlHNUNIaEVXMG1yQlhzK1NpUVM1MW16NDE5Sk1ycldKclp2N2FNcXNyQUpnV1VxYnRkRytiUkdDM1lvN0x0Tm15VndLMWJ3RkhENStrVXRYUjdXeDhab2IzNEM3SEc2bmRiSlR3Sy9tdnhWSWZDM3BBZVExcnNkd0h3alZYN0FaQjNsdjRScnZUaWFkNHZtbjkzcVZRQkhDcDc2aTkzYUdiZlBxdGpsSHZRU3pEbnIxbmRIZkkvOHJkUUx0V0J6b2cvZk1UMDhzS09zcWZoWFc5U29NQnJUVjlianJ4cWg1Q2VXRWJkUFRsaUdYVFMyVE51VzhPcjl4TlMyRnFXa08vOEhYbVJsYmsyL1hDK0NuZ1grUXo0K3MvZnpTRFZzVGEwRGVzNVVBZmpub0x3ZjdwU0F2OXhOekRIUDk3YmRQRC96V2IzM3RINVhMbFYyUkcvRkwvTGpuYWhaS0FDS1I0aE92UE1NVHp4NGdtVWpVVlg0V1JKUzlzTUpqQU84ZHUwU3BYRUVBTS9NbHJvN084dXJMVC9MMXQwNHlQalduZkwxT0tkQ2wwbENBN3hwS2Z6WDIrUDV0ZlBKakI1WU5KKzhuZ0tZd0FLOTBMQXpjNGdyMEJSamoySlc4c09Ed3NZdGN2bmJIYjJjUHdXeCtiMTZEdTFvWklMeUFDbnJ0ZUhCQkk1MXhOYkVsck42SGZUUzRLWldDclp2NzJEellGMVdtRXBZS3dBVzYyMTBDVG4vK1NxVVB3aWx1QTRncmdGNEM5SzRTWG43SUpxZ0FFRllpNHlHK09yZjl2VkR6WVR6aDhXd3FRYTdKSm1sRE5wc0JXZWxlcVpwWG40Ti9mYWRXNDB6K01CZmZPN0gwaTdGeSt6THcvZm44eVBSYVJkaXd0Yk1HNUwxaU1zRUhBL3pkZE1LcnQ0K1lNSElmLy83ZmYvWFp0OTQ2OWZkYzE4MXBOMUduL2RwOHZ1cDJWMDhIMjU5NmhLWnMyc3VFWklKTUtra21reUtUU2RPZWE2WWxtNGtxZHdsM0FWSUxXOER4czFjWm41em55dWdNVTNORmhJRDJ0bWFtWnhhVWdsMUNYUUg1Q3R6M3k1dVhqbVRDNWk5LzdoVmFtdlVQNUtqM3JjTThSc0VUVmdDODNWSmRDdzN3WHNWQW1aeEd4aUVFaDQ5ZjRzcTFPMkNoOTdUM0l3M2EzazI0bThQcDFEUXF5aitFdk9kckVlYTlhTG1pNUVOTXpzVjJ5SXc1NXZvZDdwNTdjamZwVENvQ014azBiSVBYb2FWK1hqWjRIOVJ3S3JUUjN3RzVKSGhQTU40VEVBYm92Y3FpcnZUVk1Pcjk2UkJtZVZocjUrcnhCUHY4bkRUQkhRZG91ZDhWZ3NWQ2libTVCZWJtQ3N6UEY2aFdhM1MzTnpPMG9aT3V6aHh0YlMwMFpadVdWUE15dmpBdFJyb0VqRjI1enZ0LzlLZFVpcVdZdDJMVmRoSDQ4L244eUxHMWlLeGhhMmNmZGNndkJmRTQ4TmRUL011cCtEamdMNlhzaWR2K1YvL3FkejUzOGVLdHoxdjFpTDRDazgvN2thZjM4OWl6QjdoMmF3TDFGZEFLZktDN004ZW1nVzZ2STV4bVZnZzI0U21sYjd4em5pTm5yaXV1VWJXOU5RUTRTZ0VkdHEvcWM1R0hCYmkxQ3RCNzl1UWoyM2pwaFhnMXI4SWNRa1VkN0JNaWNsdzlEMEdrdlY1WkJKV0E5NDk3U2w3OUtFMzBlL1BlR2Q3Q0dFNm5nRjFOSXhpOS84MEVFS1l2U0wrUmRVYTFML2I1aTNCSHVMQmdZMzgzMjdZTVJFRG9LaERUQWU0RlVNZXRSNGJXS2RQZ1JrRHZSczlaeVdRNFFUaFhRdDhIdmV0OTAxNTZGK29xNGpwcWV6bFl5enhjc29LZ3hPTzRMdlB6QmVibUNnSFVIY2NOanF0bTJ4WWJlbkwwZGJhUVRxZkk1VnJJNVZwSVo5SjFyMi9lazFxUkVRTEtoUUpIL3ZnTnhxK3V5UWR2aW5qVDRmN0h0WWlzWVd0akgyWElyd1RxOTdJVDNsS1ExMEJmcWRRU1AvdXp2L1VqWTJNem53RmR0YThVOS9JeHB6TnBYdm11bDlpMlk1REwxKzR3Tzc4WUJCQkdXUGx1MkxiTlFGOEgvYjBkMkxZdE9laUZBYXFPeTF4SjhNMzN6M0h1OG1pZ0tHU0JHNm92cFhPVksySkFidzZUVXRXWXFQdk5jOU9TU1p1LzhqKys0azNJWTV4aTlxU1BxSFpqSFN3Ti9EcmdRNEJxN24zZ3ZST1h1SHoxanEvZTYzK3dwcDVxbCtQclVWUStSSjk5QUhGTEFsOTVPQ2lWQU1PMGJGSGt1d1NCV2l5a1Vna0crcm9ZNk9za0ZjeldGcU1RQStVdWo0ZkFWdFcrMEZTNmQrRncxanMzcURRR3M5d3A3ZXJlTmdqYytJbHlsQ0Y0OHV0MjZyUzNjdTU3eDcrT0NYRlRXZGVEdGN6RDVjN1Y5d3RxVllmWnVRSnpzL1BNemhWWVdGaXNXNEdOQTcwQW1wdFNiQm5vb0RtVEFnVHBUSnJXWERPNVhDdXBWREtpNXBlQ1BINGVYVHg2aXJQZitDWnJ3QU1CL0VRK1AvSXpIelNpaHEyTmZWUWh2eEs0THdmOU9GVy9Va1cvRXNoYkFPUGpNODAvLy9QLzVlL016UldlVVZVYzZBVyt0eDJ1eHozV0Rac0hlT1U3UDBGcmE1WnExZUhVK2V1YXFnQ2pjRk5NQ0Vpbmt1emZzNW1FSFg1d1k2RXNLRlc5RXZyRTJXdis4REVWMnJKQUQ1V2FPVFplRGFlNzcvM3pYSEFVNksvRW5ucHNCNTk0Zm44a2YzU0FHL3ZRand2MFh1MmhtaGNobEZGT0VqS3M0UDNqbDdoeVl3emJyeDJZaWg3UWV0cDdTeTh5RSs3NlpEZ0UxdzZXUVRwQ3I0TjhndG83RXBOMXdqaWdRaXZYMnN5R2dTNjZPOXF3YkZPSmhzOE93bmRJM1I5WENYRE5NRDZRMVVwQTRKWW5IdlFDZklpNzRjUTVRdUFFeHhUUXh5bDlWMi9EMSs4NzNtMy9RZFI4emFseDllb2RwbWZtS0JTS09raWpIRmNPeFVNZXdCTFEzOTNLaHA1V2JDdnNISnZKcEdsdWJhWXBuU0xkbENhWlNPamVBd3pBSyttZUhwL2kvUy8vQ2NYWk5mbXkzZjhQL0VnK1ArS3NSV1FOdTN2N0tFSitLWkRmclpwZmFTZThwZFlqZjJmUFh1Lyt0Vjk3L2FkS3BjcjJxSktyRDNqVjVPTjk0dmxIZVdiNE1XenZDeW1NamM5d2UzdzZFZzdDd2tEYjc1YzNUenk2RGR1eUtOZGdvVlJUUlNBWEw5L204UEVMOGVPWGhjQVZsdGIrM3RuUnd0Q0dIaTVkdjhQVVRDR29EQVFUbXl3SCtpVzhHS2xrZ2gvNEM1OE9odHJwc0xaaTlxRjB4Qk5LS0FYK1dnVkxqVWtvK3p3N2N1SXlWNjdmMGNBZWdOa0hkOXhIYlN4RTJFbFByV1RFdE0vTGNmdkJ0Wldla1Y0bFJVVDdhc1NCWG5uNGxtM1IwOVhHaHY0dVdwcWJGR1Zxd0UxUnJacGFqVkcvcXV2ZTdQaW05cmpYTzlJSjVieFE5YnNpZExVTFE3VzdyaHVteVQvbXVldWpvSGRjUGE1NDVSMnVvNlJEelRPekFxQ2RLd1NUVTNPY08zK05jcm1pZ1ZiUC8rZ3pDUitYRG5xaEh5U1RTckJ6Y3lkOW5hMDRycURxdU5RY2wxck5jL2tuRWduU2FhK1BUU2FUSnBWT2tVcW5wTThuVWptcGxNc2NmZjFOeGk1ZXFaK29sZHVYZ2MvbDh5TUxheEZadys3T1BtcVF0d2hCdmhMQXJ3VDZTeWw2RS9ZcmhudytmM0xibDc5ODZDZXIxVnEzcXVDMVRsakJMZFczVkRyRnQ3ejJJa1BiTjJuN3o1eS9RYlZXVXhTSnQxOVlRdWxRcHhkWXRtM3o2UDV0TEpRZHFqV3RLb0FROE83UkMxeStka2R2ZjhlSzZTMHZPTEI3aU1jZjNZYnROVXd6TlZQZzBwVlJMbHk1emN4Y3daajBSUGlWZzlVcCttY2YzOG5Ibjl1bktHTUR6b1pDMTVTOGN0QTdMcFJqK3NtYWQwQUlITmZsRzIrZlluYStvUFdtRDF6MVdHQjcxNGdiSXkvLzVITTNaOEd6TEhsZDNiT0RId2RDdjdkbGMwcEFPcDFrb0srVDNwNE93eVVmd3N3RXZRNDlIK3ArT0JQbUVyemUweGQ2ajNzSmRmOEVyYjFkVWZyQnNEcloxbzRKK3JCNVJ3aUJFMVFjakVwaThDNGFsWVpsMWJvS2M3VkNFNjBnMUdvTzV5OWM1L1lkWmFoYVVDRTJub2pPY1FCeXpXbTYyckowdERYUm1jdlMzWmFsMC8vcmtzdGNscTcyTEszWjZKQlJBVGlPUzdYbVVLazZWR3JlZXJYcVVLMjUxRndYeHdYSEZTeFdIR1lLRlNibkswek5sWmhkckhEeHZaT2NlK3VkRlRlUkxXSHZBOS9aK0d6dCt0bEhDZklxNEUyQTExdGZLMFVmdDZ3TCtmLzIzOTUrOHMwM1QvNkVFQ0tyd2p5K1hiWSs1RHQ3T25qbE14K25yVjEyeFBmQ3poY1d1WEo5ek5zbFMyV2ZCdkp0MEJXOFYzRE5GNnM4Y21DSG9Ud3NxbzdETysrZjQ4YnRLZDFWcXlnb1djQzNOS2NaZm1ZZnZUMGRTdnlBRlFKamZHcWVDMWRHdVhENU5uUHppeHJvdGJuSzNhVS9SWnRLSmZuODk3MUt0aWtWaG90MHRKUHc5RGJxVmdMazBxd1l5S3p6NDNBY2IxS2dpYW5aQU95cXExNHFlRjJWcTNCWGdlL1BVcUNsT2FiQ2gxVHVxdjlCRFZQbk55NGcxOWJNUUc4SFhSMjVJQkxWeGU0dG82QlhLMzhTY01HMmhEdjZ1d0RLckhiS01mMXJkT3FrT0g0RkFCRjJ3QXZnSHUxODV3cFpHUWdyRHZyUXpQQzlDU29OSW5UenIxVE5FOXl2WHBHUit5Y21aemg3N2lybGNqVTJ6MlgrdG1iVDdOemN6ZTZoYm5adDdtYjdwazU2TzVycHlHVzkrZXcvb01sMGFaVnN3MFBtdXZvb0JZQkt6V1ZxdnNUb25SbmVmK005cmx5NnhjMmJFNHlQejNLWHZMZ09mQ2FmSHpuK2dXK3FZYXUyanhMa0U4U3IrS1VBdjFyZ3h3RitWWkQvOVYvL3lxc25UMTc1SVNBUmRLd2lCSUZudWxzMnpuYnQzODRMTHoxRklwWDB6d2dEWHIwNXhyei9VWmlnN1JZUXdncjNLQVZjdGVaeS9mWXNkakxKeDUvZnIxMi9XS3FRZi9jTTA3TUw0UGVFMTVTYm90UzJEZlh6ek9NN3cvbk9aU1JhWWVyajF2SUt6RnUzSi9uYW15ZVluaXRFUUM4THI2VnMwNFp1bm5sOEJ6dUcrdjNPYkxvbnhETFdoYXFjd1lkc3FJakRDb0dTbzc3S2R4M0JXNGZQTURZNXAvZWt0NGpkUmk2Smd6dkJjYldGUm5QaHF3by9ybitHd0hoQnZMeXlMWnVlN2pZRytqcG9Wb1ppQlNHV0FiMEdPQWxqZWI0QmNBL2EzakgxYzdINEtqMVU3aUhFVGRCTGVPdWcxMVc3MnMvRDdOQ3BkYnlURlFBRjlNNHExTHhheVpINUlvOVhxalhPbmIvT25UdFRRVjdMZk9udmF2Vmgzc1d1emQzc0d1cG1ZNDgyQ25aTlRmNytZanV3Q2ptQ1JhMGd5ZCtXT2hMQkMxc3BGS21VeTVUTFZXN2RtdVRtelFrdVhMakpzV09YbUoxZDhSVDJjOEQva00rUC9ORTl1K21HeGRwSEJmSXE0RlY0MzQyYU40OVpkY0t0R3ZLLzlFdi83WE5YcnR6K1hsWDV4UlhrOVZ6MWxtVmhKMnllZitrcGR1M2I1b2ZRNVdpdDVuRDI0czJ3MEZKTWZSVmtBVjBvVnJsNmU0WnF6YVczdTUzbm50emxLMGFZbml2dzFydG5LWldyUVFGdURvY1R3dXV3OTh3VE94bmMySzE3QVFRSUxIL21OQWdLUmhFY0RseWZieDAreTlIVFYzRmRWMU1tUzRIZXRqM1ZiRnNXdVZ5V1IvY01jV0R2WmxxYW0wTFh2S0xvSlVRakxuZ2x0K1hBUWNNcmp1dDZnQitmbU5XQmJvZlFOcjh6SHlwN0wvWUErTFlPOHRDbEx3SlZIK2xsYnp4blN6M29aMDhtazZLL3Q0TytubmFTQ1R2cXRVR0huUG84TkFBR3owNkZYTGl1QWxKdGM1ZnhCK3JlQjNkMDNIejBQVktIV2k0RitnamdEWmlaYm4zTmhlL3FhZFFVZkIzVkx2ZVBqVTl6NXR4VlhNZGw2MEFIdTRaOG1HL3VadWZtTHRwYTlIa2I3cVZGWnBaMHcwcVRXbEdPUWw5WCswSkFNdWwxM0Z1Y1c2QzRzQmo4L3J5bHk0VUx0emh5NUFKSGoxNWlibTVaNE5lQUg4em5SMzcxM3VkQ3c2UjlGQ0J2QW4wMXNMOWI5LzFLRkwyMi9vdS8rRi8vMG8wYkU5K2x0Y1ZHUUIvdnN2ZTJvU1hYd2t1dnZrQjNYNWQrVEZrZm41eGpiSExHMjFBTGQvOWZVSXdMR0pzdU1EWmRDSG8wYnhybzR2RURYdVZoOU00TWg0OWZwRlp6dEVMWlZGYjlmUjA4KzhRdXNwbTBvZzRWaXNxQ00xZ1BKNXp4OW9VOWg2L2ZtdVFyYnh4bGRuNHhCSDBBQ2YwOXRpeXdiUnRicW1IYmF3dFBKaEpzMzlMUG8zdTNzR2xEVndUbXFyTDNtUnJtb2FYbXBZU3VEL2gzenpJMk9ZT3RQRHR0K0p6VzBjNVU3c2FTY0JsQ1BlYjVpekJOa1lsdy9KVkV3cWF6dlpYdXJqWTYybG93TFlCWjNMWlcyVElxWUFxUVRlQ3JybmxWK1dwd045Yk5pVzdDTVBHZ0Q5dlVqYmtYSk1TVjlWQ2hSbDNVYm1RN1d0R1JsWnc0TmUrNkRzbktJcnMzdGZIa25nMXMzOVJKS21uT0tYSC9UTTRwb2M0dG9YclR3Z3F5NHRFUVFqa1c1a1VpbVFSQzcxeWxXR0orYWdiSGNiMngvRUlFMEhjY2w4dVhSemwyN0RJblQxNW1ibTZ4WGhJRjhML204eVAvK2o1bHlVZmVIbmJJeDRGOHBiQ3ZCL2lsb0IrbjZ1TlVmTEIwWFdILzRpLysxeDhZSFozNlZoUHNKZ0E4TTlXOGQ3eTN2NHRQdlBvQ1RjM1pNSlFGMVVxTllxbE1zVnlsVktwUUxGVjBSYWFzeUVLdDVyamNHSnRqb1ZnSkMyb0JXNGY2MkxkemtFdlh4amg1N3BwWCtBVXVXTDNkejA3YVBMWjNDenZreENucTlZSnI2ZnUxaW9aTWs2WHNBOHJWR3Q5NCt4UW56bDdUQ3kxWGFQRW5KR0J0UzFQMEVycTJiZEhaM3NvamU0Yll2V01qbVhReUJMNGloeTAvWlRyNFE2QTZyc3ZiaDg4eU5qSGpWU1FzVmJtYmJmSGVnNHR6MzZ2bkJHNTV3M3NUZWhrc3RCRUFscDRteTdib2JHc0p3RzRuYkMzVDFmd05WMVhWU2dBeU5lOWpBWThKK3hDS1pvYzdoRjhoTTRiTXFhQTNsYjdwdnBld2xoV0NpRUlGVURyWmVjYzg5N09qcUgvUEN5U252UFhPZFF3MXI5NnJtaCtkdVF3N0JsclpPWkJqcUxlWlRHU2lxUFV4RmU3cVVnaHZNS2plRmgrdjVDWDRFOGtFbG1VcFlieGxyVkpsZG55U2FxWHE1YUhqSW9TTDR3aE41Vis5ZW9lVEo2OXcrdlExNXVkamdmKzM4L21SZjNhLzgraWphQTh6NUMzaTIrSFhDdlozcStpRFphM21KTDd3aGQvNzRiR3htWmZxZzkwczdFMEZiekc0ZFNNZmUvbHBzQ3lLeFFxbGNvVlNxZUs3MFpYdlJnUnU4U2h3NWRTb2hWS1ZHMk56Z1VJUHB5aUYzZHMzMHRuUlN2N2RzNTZxVVFvQXJ6RDAxanZhV25qbThaMjB0bVNONndndEhiTGJuQTc4RUVUYXErbUhsd1h1NWV0anZQN0dVZVlYU2tIaEpaV0xiU2xnOTZlU3RXMGJ5L0k2T3FndzdzaGwrY3dyVDlPV3kycjVxeXAzbVcycXlnOEJmNDZ4OGVuUUxhOUIzSXFvOWdEdUh2SDk0ekdLSGlzRzdPRXp0Nnd3amZLZTI5dGE2TzdNMGRuUjZvMlBGbUhseFB5WkMyV25WcWxDYU9IamdDOGkyK0U1T3J4MVNLcXpJR3BmbkF2MmhVcTlIdWk5U21SME5qd1Q5T2FJanNEakU5TjUwNnNBQ0UzMXkzUUtBZW1reFZCdkN6c0djdXdZYUtXemRXMitnTGlXcG9MZDhlL2RYSHJRanNMZFZQSjJ3c2EyRXhIdmhqelBxZFdZdkRORnVlWmdWU3NJeDlVQUw0U243T1gyOWV0akhEOSttWk1ucitBNDJuZHNmanFmSC9uNzY1Vm5IeFY3bUNHZllIV1FYOHZPZUthaWo4QytYSzRtdi9DRjMvc2JVMVB6TCtnRmZEelU0MXoxbG1XeGE5ODJubmp1RWNyVkdqZEhKeldvQjQ5V3J4Zm9oQ2NzcE1kbkZwbVlLUmp0cHdJaHZDckFnVDFEVEUzUGMyTjBLbEJTWHVFYkZ0UVc4SzB2UDBsVE9yV2tnZy9BWXVrSzNpSUVSQkRlTWlvQy9ucXhYT1dyK2VPY09YL1RWMkVlR2V5RTRhYTNWT0RMQ2dEMGRyWHpIYTg4UmRhZnUxOVQ4aFlFRFFXV2VpeE0vMXZ2bnVIT1dBaDRDWEJQamVzOTZ6WFlLNVVNa09rTTNlNXhidnR3N0R5YUM3K3R0Wm51cmh4ZG5iblFUU3lNaENvVkozVkY3bzE0VmJSbkZLL2FOWlZ2d04xeFhVYnZUREUyTWN2ZVhadEpwNUlhOU1QM0pqd25mSThJb0tOVkFLVDZEMkFkdHEwRHVoSTFRYVpXQURUQWVXa0ZYL25MeVhOY1FXOTdFOXY2VzlneDBNcGdkek1KMi93UlBSZ204MGdGdWh2TThxZk05dWZmbCt6dkVkY21MNFQvdmlYc29GSVdsNStPSzFnc0ZKbWZLMUFxVlVqVUtnakhVZHJxaGJIdUxlZm1Dbnp6bTJkTTJQOWNQai95WSt1WWhRKzlQYXlRVjhHOUZOVFhxalBlU3FGdkFYYXhXRTcvOGk5LytYK2JubDU0TXZ4b1NhZzRnYnF3VjljZmYvWUFleDdad1dLeHpLMDdVeXNlMHhvS2FxOEFyVGt1dHlibUtSU3JFZmRrVUFnTHdhTjd0M0Q4N0RWcWpodTRYaVhzWmNFOHRMR1hKeC9aWnRRanJLQWdELytyUUFrVnVyQkN3c3Q5MVpwRElwa0lvYUxGSVRoL2VaVFh2M0dNUXFHczVLTUJkZ1h1dG0yeGFhQ2JiMy81U2RMcGhORXVId0pVZ1A2NVdVU2dxZ0crbGovTzlPeENCUEI2RDNvZjhJWXIzeHhlaHp5WHFMS0g4QmdXdERSbjZlbkswZFBWUmpxZDFITkVyZGlaOE5hQzZRZkRTbFc0UDRDNThpd0N1Q3Z2aHhwMlltcWU2emZIS1pjOWQyNVRKc1crM1VNa2tyYm1wdGZWc3RLRDNnQzlES2Uyd2N0M0wrNHpzbnF6a1Rjcm5qcC92UWM5RUhqanhJVVB3MHd5d1dCdk05djZtdG5hMTBwclU1SUgzWUo3Y3RIQjd1ZUhCTDhySU9GN2RtUVJZZHNZZVIxVzZxTjlJUFI4TFpYSzFLb09ybkNabjF1a3VGakNybGJBZFhBY1dXa0kyKzNONWZ6OEl1KzlkNTVUcDY1SzJQOGk4TC9rOHlNUEpZelcyeDVHeUZ0QWtxVWhmejg3NDJtQW41OWZiUHFWWC9tRHZ6VS92M2hBVis5K1lXN3IyMXFiYkJERzYwRS91R1VEaGNVU3Q4ZW1pWDJPZ1pvTEVPVnZoMkVYUzFWdVRjNzdNMlQ1aFh5Z3VzSkNmL09tSHByU2FjNWN1R0c0VzVYMlZsZnd5WTg5RXJpK1JTRFRkU2hyWUZjc1ZQQ2hDL1diUjg5ejRzeDFkZ3dOOE9qK0libzcycnkwK1pISytBcWxDbi84OVNOY3ZIYkhHN3R1WVNqM2NMbGo2d0N2ZnZ3eEVnbGJVK2x4aXQweWo0dHcvNTJKR2Q1ODUwd0U4SExlK1FEMlM3anlRNWQ5MUpzREJIRm5tekwwZHJmUjA5bEdVMU1xU0l2dzAySStma3ZtZFpDNXhPUzN2aWNFZmZnTTFIQnFwU3RvNS9lUHp4ZEtYTDh4em55aEdJTERoM0JyUzViZE96Y0ZiYnlCT3g0TWw3dmlLVERBWW9KZTYweW1WQW84YUh0dmlLUEFYUWhQclNPOFNYSmNWMkJic0tXdmhiMGIyOWpTMXh5TWJ2Z3dtS3FxWlg4QzRkWjMxd1BZL2hTM011OFN0cVg5enVQQmJyVEoxMnFVaWhYQ2J3UUlGaGFLTE13WFNOU3FpRm90QW5aVjNjdjJld243UTRkT2MrblNLTUNYZ0wvU21BWjM3ZTFoaEh3OXdLOVUzZCtObWwvSnNEcHJlbnErNWQvOXV6LzZzWVdGNG00Vjd0RUN2cjdMUHBWSzhlSXJ6OUxkMThuQ1FvazdFelBSRWg1ME1rRWtqQUFtWnhiOVQ4S3FibGdNeFNiWXRtV0E3VVA5dlBIT2FRcUw1YUJBeFNoY3U3dHl2UERVbnVBQzRkQTRQUW5xL3ZCNktHMzEzZ3g0WDgwZloycDZJU3pBaEdCd29KdkhEbXhqc3pJY1R5Z0VPMzNoSmw5NzZ3U2xjalhXVGYvbzNpRmVlbjVmQ0ZJRjJqSUphcnU4bkFGUVBTNVBzQVQ4NmFHVFRNM09LK0QyTzlBcFBlc3Q5Wmd2MVUxWGZnQjdPMVR1Q2R0bXcwQW52VjF0dERRM0tVL084eVlJUW0rTXZCVWp5OVZUd3J4UzltbGg1WHVnUEJqNVhuaUh2ZTFyTjhhWm5sMGcxNUtsdFRYTDNQd2lrOVB6QnNCRGw3Z3JCSjJkdWFBVHBnbjZjUHk4QW05dlJ6QnlJbFRxR0ZBUE8zdkt1TlFQMHdRVmdlQzRTMTk3RTdzMjVOZzUwRUw2QWVrMHR4cUw2MXpuU3Rpcis4ME9lRUF5bWRUQWJkdmV1eGFuNE0xSmlXcU9TN0ZZMGtlMitPRUtoUkx6c3d2WWxUSTRUc1JWSCtlK2w4UHdidDZjNU5DaDA4elBMLzQyOEJmeStaR1lXWVFhZHJmMnNFSGVabTBodjJacWZtcHF2dVdMWC96RHY3MjRXTjZxS2p1NURtanJjYkRQTm1kNThaWG5hR3R2Wlc1K2tmR3BXYTJVTnJtdW1oQWhBQnpYNWZia0FvdWxxc2IrY01nVFFjbStZOXRHTm0vb1ptcDJnY1BITG1wd0Q5dEx2VUxnbVNkMjBkZmRGclNoZTllelF1Q2p4SS9xV1FoVnZSQ0NrK2R1OE83UmkxU2RtbEtZNkVPQXV0cHpQUEhJTm5adTNZQ3R0SmRhd1B4aWlkZS9jWlJyTnlZQzVXemJGczgvdFp0bkg5OFpacEhsUVRKYzkxYWtNbFpWdkNYVFQraXV0NER4cVZueTc1NVZGTG9DZUtLQUQ5MzJlbnU3M3R2ZTI3OWxjeStERzdxakQxTzUxeERzSXN4dmhlQngwSStBM3FnRWhNOUZ3bG9QZC83U0xlWVhpZ0ZrQXpjNXBnb01sYlVRZ3Y2K1RnWTM5b1FxZmdXZ1YrSHR0Y21INFYyVStJMHcrbkE1YUdsS3NMMi9oWjBET2RxYUgzeFhmRDJUdjRGU3BjYlViSkdwdVVXbTVrcE16UzFTY3dUSmhFM1N0a2dtYkJKSm02UnRrMGpZSkJOZXBUR1RTZEhha2cyOFdnbS91VENac09zbytOQ3J0cmhZUXArblFxOUVsSW9WcHFmbVNGUktHdWhOZDcwS2VVL1Z1OTRIczA1ZDVjeVphLys1Vm5PK0o1OGZxYTEzWGo4czlqQkJQczVOdnh6WTExTFJ5MzBSRlQ4L3Y1ajkxVi85Zy8ralVDanQxTnkyZnZ1NzdzNk5xbmpMZ2x4N2poYy85UnhOMlF4ejh3VW1wdVlDMkFSM0gxME5DbXdMcjVBdWxxdmNtU3BRazkrc0JxMFFsejlxeTRLOU93ZnA2MmxIQUNmUFh1UDIrRXc0LzdoUkVMUTBOL0hTQy9zVllQanQ4SW82OTlLanBFZ1c5bjZ3d21LWk45ODlFMHlQcTQzcDFWUkpXTmhsbTlJTVA3T1h2VHMzUlloMjR1eDEzdnptYVJ6SDVlWGhBenl5ZDhpQU5rYUh1M0JEQjcrZXI1YVIxMis4YzVycG1RV2wwb2F1MUlrQzNoeGVKNWZ5cTNXdHpVMDh2bjlyZUsyZzVrRUliOE5sTHpOU0JsTnoyelFON01xR3JPQnZzSmVvQUFBZ0FFbEVRVlJKTlMrMDhONHpQM24yR3BWcUxXd2ZWeXQ5SWh5Um9VMHY2ME44OTg1TnRMWTIrKytSMmdhdk5BR2h4aFY2RU9UN29PN1h2emFuSzlDRURVTTlMV3pyYjZhL3ZZa1BnMDNObDVrcFZKZ3ZWcGt2MWxnb1ZyaDJhNHBMVis4d05WY00vZ3JGaW5hZXFMTVNlZjRDY20ydGJOc3hpR1ZaWk5OSnVuTVoranF6Yk92TDBabExrOHVteWFZVFFYNDZycUJZTE9IVUhLUGpZdmo3ZFB4blhTcFZtSnFjeFM0WHNSekhjTmViYmZRZTROV0t3T3hzZ1dQSEx2MzI3ZHRUMzV2UGo3aG04aHUyZW51WUlMOVN3Sytsb2w5V3pSZUxsZlN2L01xWC85YjhmSEVmNEkvYmpvZTdWS1E2NkMwNnU5dDU0ZVdueVdUU1RNOHNlSjI5MUR2WFhNbng3WW9DbUpvck1qTmZqQ204dzRMZUZRTGJzdGkzZXpOZEhhMEFWS3NPYjd4enhuZUI2aTQ4VDhFSjl1OGVZbWhqaitIK2pWSHRHSUR4bDZWeWpkOTcvVjBLZ1Rzd0xOVFZqOUxFRlN6Yk52ZnhuYTgrSGNSdFdSSldGdk9GUmFabkMyemQxQnUwWTVzQTE2RHRINHpBM1JJeCs3eVFFMU56dkhYNGJOQ3BMOXIrSHFyMStPbHVkZURibHRlczBOcmFaS1RFeTdHUTUxYWc0T05NcVdOcG1SOVI5cnAwRDEzMmFuZ1Jlb0dPbjdxaWRKelQyOHhsZTNnQVhMOVNtRXdrR0Jyc3BhMnROWUMyQ1hwdFdCM2h1Ukd3Sys5ZzNMNitqZ3hiZWxvWTdNNCtzTDNpSGRmbHlxMFp6bDJiNU1ydFdaeFVNMk56WllvVkovQ2dJTHh3Nzc1N2ltcFZGN1pxRTVXM2piRlJIL0lDYU8vSXNYWGJKb0lHSC85bDZXMXJvcjBsVFNwaDA1cE5rY3VtY0N0Rm1sTUp1dHViYVc1S0tSMzZ3dCtsRTNodFhDcVZHaFBqTXlSS2k0aGFyWTZyM2h4dUZ4NnYxVnl1WGJ2ekg0OGR1L1M5amM1NEg5dyt2SDRyM2FRZ1c2NWRmQ1YvOWNiS3I3cDl2bEtwcHI3NHhULzhrZm41NGo3Vk5SKzNEaWpyWVlIZjA5ZkZzNTk0a2xRcXlkVDBQSFB6aTFvSElVc3J3NklGbW9VMzFHaGl1a0NoV1BYaWwyREhMK0FGUVR0NU1wbGcvKzdOdE9ma0dIZUwyK016eUNsVmJZdWd3RVVJYkN4U2lSU0RBOTFnZVRjZVZCd3NGWmRoUVVLd3g4TDJyOTNVbE9MVmx4N2pqVytlWVdKcURwZndZekcyRHcwSlFobU5iY2xLaWEyNTBQRWZnQURhVzF0b2IyMEpGYnNWTG9PRjhZVzVJSWxhR0N2b2FTOUJLd1AwZHJYUjI1Vmpha2J2YWE4K1g3VnpuWTBjMmlkZDlxSFN0eXlMRFgyZDVISlpUNlZIdkFsZTA0YThQenUrRlY3TGl5Q0VML2xsTzc0OExhZ1VtWlVHb1J6MFhVSFZhaTI0UCs4OXNFamd0WVBiZnNZTEFiYU15WWF1amh5Yk52WmcyM1p3SGFNMjVyODdsamVmUFlEd2hoWDZEMTVKbDU4RDhsNzhlRHF5S1RiM1pObmMwMHhUeW83TmovV3lVcm5HaFJ0VG5MczJ3YmxyazV5N05zbkZtOU5VYXc1dHVSWWVlV1FIaVVReHVFZlZRek14TVJNQmZKeEYzd0p2VDcyM1kzWm1ubXRYYmpHMGRWTlFXUlFDeG1hS1ZHb3VQVzFOVEMrVU9YUGhKZ3Z6aThHUHVxK3poUzBiTzlpeW9ZUG1UTXJ3dEhtL3gwUXlRVmQzTytOakxsWjFBV0xiNHVzdlFUQTQyUHM5L2YyZC94NzRpM2pUNFRic0x1MWhVZkpKNGxYNjNTajZOVkh6cnVzbS9zMi8rZjBmbnB5Y2UxYXFkeFhvdG0wcjY3SXRQblQzV3BaRi84WStubnJoVVpMSkJCTlRjeXdVaXNFTkIvQlVJYUFUMzFkWGdySHBBc1d5L3p1UktnRXJVTy9TRlp0TUp0bS9lNUNXYkpOV01CeDYvenpGVWpsVThPanFhZHZtZm5adUhaRFJCeWtNd1JKZUkzUWthNElqMk9lNmd1Tm5yM0xrMUZYUFBhaDJMQXJjOWFGcWRJVmd4MUEvbjNubEtTMGVWZTNLZkVJbzROTUF2b1NxRjNGS0h3WDQzbUpxWm9HM0RwOE4yampWWVh1NlN0ZVhacVVnazA3eHhJRnRKQkpoTmNLb0cybDlCclFiMW00KytyczIxWjR3am9SZUhmbU9ZT3dYbE1wVkxsMjlUYlhxK081eXFiVERnbDRDSTVsTXNIbGpqK2VlRDhLaHI0dndmRGxibld4ckQrSjNSV3o3dklYRllIZVdMVDNORDB3N2U3WG1jT3pDSGM1Y21lRDh0VW5PWDUvaTJwM1pvTGxDVmRpZG5XMGMyTGNkTzJGcGVTeC9Gd0xCKysrZm9WQW9SYTdqaFJIUmZURXI5ZFE4UUhkM0I0TkRHeUxYeldYVHBOMFNNOVB6a1pQa3VUM3R6UXdOdExPNXY1MXNVekxvQUNuYjZtdFZoL0U3VTFCWUFLZFdkMGhkWEx1OVhIWjB0UDdHai83b1ozOFFhSHlUL2k3dFlZQjhYR2U3dFFMK2FqdmoyWUF0aEVqKzIzLzdoMzlsYkd6bVJiVm5kejBWSDlmRGZ0UFFBSTg5YzRCRTBtWnljbzZGUWtrSE9pamI1Z0Z2MDNFRmR5WVhxTlM4VVNrcVZDVjBaYUdiU1NmWnQydVFwa3hhZzZUanVreE16aWtGZ0R3dnJDVDBkTFdSU2lXRHlrTVF2eUlqTk9CRHBNQUlOSWQvamFtWkJmNzA3ZE5NemM1SDNQVGVkdGoydTIxekg2OTk2cW53eHBWcnllR0RVYWlMWUwvcC93akRXS0d5OGhPbWhiZjBjdzY5ZjU3cG1Ya0YzS2FLajNIaEs4UHRiTXRpejg1TlFUTkpxSy9sZjBITXBWZGtXbkZ2Vkt6Q2lwKy96M3cyUm1Xd1ZuTVpIWnRtYW5vK01wUlNGdktkSFRrMkRuUjU2ajBHN3E2eWJvSStIRmFuN0JkaCtIVFNabk5QbHFIdVpsTEoxZWJFMnR1TnNUa09uYnpCb1JNM2VPL3NLS1d5NlZwWFY3eXQzdDVPOXUzZFN2Z21odmtJWHA1TXo4eHg4c1RGV0NYdW54RjlsakhYV2dyeUFEMDluV3pjM0Ivc0YwSXdOVEhEL1BRMFd6ZDIrcDdES09RaFRHOVhlNWJCdm5ZMjliYVJiVW9HNzBHdDVqSnhad3AzYmhiaDFEUlhmZEFjWjdqclRWZiswRkRmRjMvb2g3N3JSNEdaT2xuUnNDWHNZWUM4cXVKWEEvaTE3SlNuUWY5TFgvcmp2M2pyMXVTblRNQkw5YTY2NVZYbEx2Y1BiUi9rd0JON3NDeUw2ZG1GY081bjZmNVdnVVU0cGxxMVdzMWxiS2JnajMvWGxacTNFU3F1anZZV3RtM3VJNVZLQlFjMW5DaHd0b3dDUXYvQmg2ZDQ4WWRncWc5MnRFSkhDQkhjbitzSURwKzR6UEhUM3FRWnBvTDNYUFd3ZGJDUDF6NzFwS1p1dzNYRjNZd0NjQkd1QjNlcXVPTGxtRzRMdEFwQ0FIejlWTzlaelN4dzZMMXptbnBQcUJVNjR6bEw0RXRYZFhkWGpqM2JOMkpha003Z1B2VG1ncGhpUE5hRStoRFFuNG0zcXI4bnFycFV3OHYzWm1HeHhJMWJrNVRMVmJ5MmVVRXFtV1RUaGg1YVdwcEFFSHhPVmgxYTUzdGtROVV2ZTh4TGo0QWYzdFVxQm9LV3BpUkQzVmtHT2pKWWNTLzlmYkpTcGNhUnM3ZDUrOFFORHAyOHdZMngyZUNZbWFmUi9ZS3VyalllZlhRWGVuK0hNSC9rNytIa2lZdE16OHpGT1dYOE9FWGtXcUxPaWxrQk1LUHM2K3RtWUdNdkFwaWJtZWZxbFpzSUlXaHVTckY5VXhmSmhCMjhFSEdRVi9kM3RqV3hZMU1YRzNweTNuTjBCT05qVTlTbXA2QU8wSmNlY2lmWXNXUER6Ly9nRDM3bjN3T200bk9qWWZYc3d3NTVxZUtYQXZ1OVV2U3grMzdqTi83a2U2NWZIM3ROZGM5SGw5NDg2dEYyZVl1ZGU3ZXdlLzhPc0MxbTV3cmUxNXlzS0ZEcXV1anhYSWJqMDRWZ0Vnd1J5R3FVYmNpa1UyemUxRU43cnBuZ0luNEJJRjNDWnFOZUJPcXh4eTB0N01VcnQrbnY3YUNsT1JNTGRqV3MranJLK01jbTV2ajZvVk5Nenk1b2JudnBPZGk2cVkvWFB2VkVKQitJU1lzSjdZaXIzb0MvRmthRTZ6cnd3K2Z4enRFTHpNd3NlT0JXbjdzQytJUlpzYk04MS9ZVEI3YVNTaVpqSzIyUlhYNUZKVGdvYXpXU0dzWnpDZkxVMktpcjRKVmpnZGNuMkk4UGFRL3NkOFptR0orY283T2psZjYrRGl6TDZ6RVF3ang4RDEzL1pFK1pvM2dBRERlOUwvMWRBVjJ0S1FhN3MzUzJwRmd2dXpvNnc2R1ROemwwOGdaSHp2bk5GVm9JQTRCMTRHc0J6ejZ6aitibWJNUkZybGFxYW83TFcyOGRrd2RqcTNIQkZlTituMHRCUG5vYUFQMERQYlMydFhEcC9EWFU2YkhUNlNRN0I3dEkreE1nMVlPOGZrelEwcFJtNStZdUJybzkyRStNVFZHZG5JcE1tQk1kVWhmYlhpLzI3ZHZ5czUvLy9IZjhVMkF5SmpzYVZzYys3SkN2cCtKWG8rYlh6RzMvMjcvOXA5OXg4ZUt0enk0SGVQbGxOTE5uL2M2OVc5bTFienRZTURlL3lLei9mV1oxY2hhNW9yVTFoN3NwVngwbVpoYkRBc1EzcVVvRkhud0cranJvNitrSTFXNk14UllzUVdsbEtRV0YvSytvZmovYzlPd0NiN3h6Qm9BdGc3M3MyYjZKVkNwc1B4WHliS09nMG9BQ09JN0x4UFE4QXNzb1dDd3ltU1R0dWVhd3JWcUp4L0xUcFZlU3d2d0NZZVJyR0VZRnU4eHh5OUp6eGF3UXpNd1dlT2ZvZVlLaGMzWjl3S3ZENkxadjZhZS9wMTFKbHhXNFRkUytiNmJWMTdQQ0NDSE1jbDhKR1FWSm5JbzNtM2hNS0FXdWVTV3NDbnJoUnh6MHhrY0h2ZnFOZU11eTZHMUxNOWpWUkRhZHFIdVg5OHFLcFNwSHp0L21teWR2Y3Vqa1RVWW41b041N3IyYjFoYlJ0VG9WclA2K0x2YnYyeHJrSVVaK1NUVmZxenE4OWZheDRNUjZwZlJLMWZ4S0lBOEMyN2JOajhnZ2dGUXl3WTVObldUVFNhTnlYcWVTb1ZSYW1qTXBkZzExMDl2UnpPVDROS1d4OFdBY3ZUcVVUdjJTblFTOTNrYVArL2pqTzM3cUIzN2cyMzhCbUtpVEpRMHo3TUhvclhKM1poSHRUVy8rbWU3MDVmYkZIYS9YdTE3YjkvcnI3ejEzOGVMb24xY0JiN3JuVGRlOU9sNSs2ODVCZHZxQW4xOG9NanRYQ0JXN0Fwa0FSSllCTG1DeFhHVjZyaFJBQkZRb2U0dU85bFkyOW5kcW9JMHpnZXdwTHhXK3I1c2pNdGRmTVNua3I1OCtmeFBiOGo1emVlWDZPTmR2VGJKbngwYTJiZTczUEJwNDRBekFqcXBRd3dnVGlRVDlQUjFCMmpTR3laczBQUjdLemNTQ1hMbUdydW9OOEd1M3E0WVhXdHdXME5uUlFrOW5teituUGQ2TVluNGs2aGZuVk1DMzU1cnA3KzN3Ty9ONUdhbUJIdjlaV0xJM3VYRi9zYVljRmZoeENya2FPYWJ2VTJxRWFudHM2TDZJaEVrbWJHVEtYVC8vaExDQ1NwR04vMTF5eXg4dGdYSXYvZ2VRTEF0U3RrMS9WNGIramd5cHhOSjN1TlpXcnRaNCsvZ052dkx1Wlk2ZXUwM0Y3L2pwT0NKNGJrSjUxM1JLR2p0aVBDbTJaYkY5MjhiZ29CcEVYemZ1dTQ1WFpnVUhWeDNLZGFKRDB5MDg3K0Q1RzFOczM5QkJhemE5Z3JoQ1d5eFZPWEx1TmowZHplemUzRTI1WEtVNk9lbk5hRmlubDMzWVZxL3R0dzhmUHZkMzI5dWJiMy8yc3kvOUZqQzc3TVViOXFHR3ZBbjJPQ2d2QmYybHpsdEpoU0Q0ZS9mZGM3dU9ITG53QTdadFdmVUFYNzg5M21Kd3l3YjJQTElUeTRMRnhSS3pjNFhnNHlZNjJMMENJR1JmQ0p5RlVvWFplUi93S25aOE9kclVsR2JUUURmTnpabDZKUXZxMkIxWkRBVnQzSlkzZzV0ZWl3K0JMSlEwU2g3Y3VqM0YzRUk0NU05RlVLczVuRGh6blV0WHh6aXdaNGdOL1oxSUFNbUxxZldGb0ErQWYvRlFuUk9vYmFuVXpXT3lNbURiWVZxRkZSYXdvQUJjS2J0bHZtbVZBVE84R2s1Ujl4YXdjOXNBN3g2OTZFRWR5eDhhUjlnWlR3RjhJbUd6ZlV1L1g5blJyMlp1MjJvQ0FxVEtkU1VCWmdrc242R0tENmtjVmI1cmxTdFZub1dWalVpa3dVT3h2SXFnQmJhd2NDWGNoUlVNaDdUd3crREQzeCszS1d4b1RpYm9iOC9RblV2ZDF6bmtCWERxOGhoZmUvY3ErV1BYV0N4WFBiQzdidkErMnpaZXIzOUxxVFQ3dGpKNGVyWnhZdy9aYkNac1dmSHp6Vks4YmxiTU5aYTZqdnpacm9xNi9vbG0vNXJsekhGY0x0NllZdXZHRHRwYWxwdGNTRW1VdnpveHM4ajBYSkhOL2Uwa1c5dHhaeWI5NFhYMWh0VEZWZ0F5cjcvKzNqOXJiMis5L2VsUFAvWEhRSFRvUWNNMCs3QkNYc0xXaFBoU1VGOEs3c3NCdis3ZmhRdTNCcjcrOWFNL0FxUk1vTWU1NTAwbFA3Q3Bqd05QN01HMkxCYUw1V0NzZFZqb2V3cENRa2Z0ZUNjelltNnh3c0ppV1p2ZVZRWktKbXo2ZXR2cDZzZ3BoMEpWRjhCUXIwbkVDdk9nTTVzQ1cxTjBJTHkwMXh5SDg1ZEh2ZkMyaGUyR1lZVVFMQlpMSEhyL0hOMWRPUjdidTRYMnRwYWdFaUVMTGxYWm1PVlkzR2RnNVZQVXZ4eEhKTDhDT0tvZ3R3aEFGb0g3c3NBUGdXZFpGaDI1Rm5xNmN2NHNlT2lBdDhOeDhiWmxNVGpRVFhOVE9pZ0lUYjdGWGM4OG9sZHg1Q0phZkFkNXFEdzhiY3k4R3I4Q2RsbWQ4TGdjUG55MTBoU2VKMC8xQW5nZUlTdm9KT25LVlBqSGM5a2tmVzBaMnJMM3R5aWFXNnh5OFhhQjQxY20rZktmdklmcmVQMEE1Tzh1K00wRitlS040bCsyUWxWL045bW1UUDJ3SnEwL1FEMUhqM1AxSnk4RmYxY0lMdCthWnJDdm5lNzI1dnJYcm1PT0s3Z3lPdlBmMlh2dklFdVMrNzd6azFYUHR2ZSt4N3VkOVFaWWJCT0dGQW1RZ2dUeXFCT0RvaFFYbElTVFRpQnZLSjFFQlhXS3U1QjRSbkdLNHluRTI3dEFLRVJJV2trRUpSSUNTWkhZRmJnSEVBU0lBYkFldTdObVpuZThiOS9QbTZySyt5TXJxN0xxMWV0K2I2Wm5wbnV4djRtZXFrcGZXZm55bXorVHY2UTNsNkkzMVVPdVdVUzZyV0w3WkhGOWNCMytuZC81azE4Zkd4djR1VWNlT2ZRUzhNR2hOcHVRZGE4YmNJdlVDUUIzQXZ6dHdGMjB1WS84TFM4WEJyN3lsZS8ra3BTeWJ5dUFWK0htbjJCOGFwUUhIenVHWlZsVWF3MVcxMHUrVjdSd29yRmlYS0FwN3JXRW9GQ3VVNmsxc0N6bG0xci9wV3lMc1pGK2poeWNZV3k0M3krRG9IejgvRVRLamVCOE9PSDVuYTd2azlPTFlBRWlCRnk0c2tpajRXRHI5N0hNZHdqclhGa3Q4TFZ2djhFcmI1eWwxbWo2K1ZWWmxsR21MamZvRzYzYjF1MFNXMy8wb00wSmYrWTdLQkFPMzBXRVRkZ2lUQVQ5ZEhEdnBQK2RyS0E4L1IzMW9TQTlQVmxtcDRiRC90YjVJMzF0dExITnV3VjlGdmx1d2tnVGtlM0V5alFYSGJGNkVaRzJCSDFrU0pnU3g0WFpQdVBiNmJTV2dPRytGTWRtZWprMDJYdlhBTDdoZUp5NVh1S3JyOTdnOTErOHh1dVhOdkNFUlRhVFFWaTYvU0xTZHJQOTJyYWlQWWxOSDYvZlZQWmljUWxOVXZKRWtYMm45YmFKM3lyVlptV1pvVkxDNVpzYjNGd3RkVlo5UXBKeXpXR3g2bkdqYWVGS0FuMThxSmYzZ3ExMTBhdUtyOVVhK3ovLytUOTQrc2FOMWYwZHY5b1BLTzFXVHY1V3VmaXRSUHliNVkyRTEycU56Ry8vOWpkK3NkRm9Ub2JBSG9yazR3QWYxOHNQanc3eDhCUEhzVk8yOHZlOFhreVlMRVV3ZkUyTGVzMTlyeGRyMUJ0T0FKNmFldkpacHNhSHlHYlQ2QUswQnpJdER0U2U2MXArSFNKMk5lOTkyYTdLSjFEaVhsK01yOE1GMUdwTkxsOWR3YktFY2xqbTZTSkNiaTZ5ZUpDU0M1Y1d1WFIxbWFNSFp6bDJhRGJ3anFZL2lDUmtkQUxBa1VKdmcyOTVoVUIxSEk5UFlKVE1mZzJlamN6cU9lVHlkWHNJdm9raHJ2Y2pCL3Q3UW00K3NMRDN2NFZsTVQweHhOejBxTy9pV0VrQVRCMTRpQU5hbGRIYTNzM2VXemRHQ05SQ3l4TFlnb2l4bS9KUWhyOExRNFRxRjROYkI0T0R4MlQ0MVFkWDQwa1llWUxlaVhHbUt2MUFQc1g0UU9hdWVhWHpwT1RHV28wTFN4V3VybFJ4ZktNdUVUUlpNRFRZeTgybEJ1RmhSZjc0MUp3OVNyMmdmcGV5STVGOVVsaTVWS1ZZck5EZnJ6aGcvVnRFdElyc2t5aXBURTJXWlVVczRqdWx6Y3BNenFBYkRkZVhpelFkbDltSmdhN3JWV1haRk1td3ZGemkwS0N0M0dadjZoRXZHbFlxVlQvMGovN1J2L20xZi9Fdi91N2ZBSlp1clJIdmY5cU5JTDhWdUhjTC91M2kyZ0srbE5MKzRoZS85dGZMNWVyaGRrWjFTUUN2dy9zSCszbjB5UWRJcFcwYTlRYXJhNFZnY3RGNjNDaVhwSFhqQWJTeVVhelJkRHkvZkpVMlpkdE1qQTB5MEpjM2tFci9rRU9kdXZac3V5bFRnZ2htZENsbDBLWm9QaEVGVFQvODNNVWJ2aUdWOFBYSUt0d0wza2VpTlF1ZVZGeXRaeW1kMzZuVGx6aXlmMXE5bDk4QmVsS09LdXVqZ3lHdWp5ZVdOSmpJd2lhSGl3V2lmUnNrTlJZS0l1SlVSL1ZIQkV3aHFFWG5PekEveVN1K2ZZVjJnRE15MU1mKytRbnl1WXhSbmxtMmJwU3BRZmVCSGpPdGpMMjBpazFiZ214S2tMRkRTLzZ0U0Vwb3VCNU5SOUp3SlUwSFFtTUx2WERRSDE5RzZndHVUYUQzMjQ4UjNwT3hHZS9Qa00vY0hYQmZMemU1dEZ6aDhuS1ZXdE0vV01XM0RaQ0lDSUFQRGZheHVMeU9zRlQ3OWRIQ2xoQjQvbmdOcFN3eFdPd1NKYS9mV0thL2YwOGtMRncwc3FtQ1BadkwwTnZiUXk2WEladFZmNWxzaW5LcHhvVUxWNU5CZnJQMmJSTFg2V3N0cjFkb3VoNTdKNGNTeHRyV3BXUXlhWnloSVY2L2VwMzd4dk1ndllnbnZLMU9zbHRmTC8zVTV6NzN6ODkvL3ZOLzV4OEMxVTByK3dHbDNRanlXeG5VZFNPNjN3ejAyejcveC8vNGpaOWVYdDc0Y0R2citjMEF2cmV2aDhlZWVwQjBPcVVPY3ZEZFJwcWllUFVjZ3JzSitwNlVyQmRydUs0WEhMNGhoR0I0cUpmUm9mN2c4QnNWNGYvTVpBanNwdDQ3b0lCRGwvNzhIS0trSkd5VFNrdncyelVCVlFkdkZDb3NybXhFeGNFYTJJMzNrTDR4RTRMQUdsc0lHT3J2SlpOSkIxTkRZQWZneDhkM0MrZ0hrUlFjU2FGYnFVRXB1aGdJc0VtWEZlQlUyTFo0YmRHd29JREFhcnkvUHhmNHRPL3B5WEJ3enlSREE3MEorWXhuMFZKaXRGWWpYdmdLWTl1R2JNb2ltK0tXRG1RUklzd1BxbytyVFk5eTNjWDFaQVM3VzQ2Kzg0M3RnSWlyWDUwdWw3WVk3VS9UY3hlMndibWU1TXBLbFF1TEZRclZadUFsVDNQdEdxQ0QvLzB6QzRZR2VzT0Zuajl1aFF3WGJOcGZnN0RBa2xzWjRHMitDTGk1dU1haGcvTllsbEFTa0JnSUJtczJJUmdmRzZhM0wwOWZYdzk5dlhuc2xLM3E5YmwreC9XNGNQNHFpNHVyeERmSnRTdTVJL0R1Y3VHaTVxTTE5azBQcVlWbHA5bjloRDM1TE83VUpLOWZ1c0x4aVo3QStaRUo3SnVkWkhmejV0cmYrZHpuL3ZtNXozLys3L3kvcUZubEF6Sm9OKzZUVDdQMS92aWt2eFNoKzF1TDVIM3hXM3JJZS9iWjczMzhqVGZPL3pYYkRnRmMzOGV2Y1RGK0pwdmh5VTg4Umo2WHhYRmRscFkzRkloWkJxQWI0QTRoK0lOUUs5ZGlWVTI4ZnJyZTNpempvNFBLaVlwSzFwYkNuem5FK05sSVNNdXpiSTAzK0YwZjhGWEl5MitjWTZOWURWZmlNanpBd2p5eHlqeHBMa2dqMVY3Nkp4NDYxRktQakRjZ1BwTzBtVm5pRXVTa2ZQRUZndG1QSXBKTjkzdTRxREV4T2U3UEhpVGxTcDFDcWNMMCtMQVMyMGQ3TGxKL0pEeWhmZkU0SWFBblk1Rkx0Mmh3dDQxcVB0ZzMzWEIvdlA3ZTRYNTU5VTdoeVhTUXRpMUdlbFAwWk84OHVOZWJIcGVXSzF4YVZvZXJlSWF2ZTQvWVdFTkd6cHQzUGVVZDh1dmZlZ1hIOVpRQm5qRkdYYzFKK21QWTg1UlBBQzgrYjBweldNWHVZa2tmdVA4QTQrUERMWDRIa0liWE8vWFk0akJIWHd1Rk11KytlNGxhcldIVUdHbEV5Ky9YU05XbTNXWjR3dDc2U0ZHdGI5dVRUWE5nZGpqWVRxbVNSU2VQbGpuR0tHZHR2VVRwMGlXT1R2VDYzNnN6OGIzUDJUZUhodnIvd2pQUC9Nb2ZKcjNPRHpMdE5zTTd6VkdMTHY1U1FCYTFPRENCV3hqbGRXU0IvK3FyN3g0OGRlcjhmMk1lTE5QZThVMlV5N2RUTm84OTlSRDVYQlpQU2xaV0N3R0hIVEcySStUb2xkOXpYOTh1SllWU1RYSGpsanJJWkhaNmhObkpFVExwbExGQUlPQThnNnYvRitnYWhWNDhpRWk4MldrUUswdkV5Z3orcVVSQ0NCWlhOaWhYYWkySHI0UTJBNjFoV2wrdHBRWGpJd050MjZSRXJaSmlwZXJYU1hCdDkyY1piWTYvV0ZMNVFabEdjdjFnaVZCSUh5bFRBM0ZzWVlBUTlQWG1tSmtjQ1h6VUJ6MW41ak1ndXVXZFlvTlp4K1hTZ3VFZW0vd2RCSGhBY2VKOWFZWjdVOWhXN0QyRHZ2Vi9EMEE2WlRFeGtHRnVKSHZIQWI1VWMzanJTcEZ2djdQQythVUtqdXNEaGpBTUxjTlJxc1ovOEhGRjhBNjJiZEhYMStPUFJ6Q1RoRnRadzE3ZVdsZ2lObjI4dWJqV1BvZUlQRVVXZVFJRmloY3YzdURVcWZjQ2dFK29ZdFA2NDNHM08zNTAva3F0eWJtcmE4WmhQQjIyd2FmaG9UNXkwOU9jdmxZd1hOMkc0dnBrVjdoS3ZPKzZYbnA1ZWYyWm4vM1ovL1hRMWpYOVlORnVFOWQzQ3ZBMkN0Z3poSUFlQjNGN2svd3RZdjZiTjljR3YvNzExMzRCU0NXQnVqYTBNMFgySmxmLzhJZnVaMkNnRjREVnRTS3VKNDJqUmdFUjZ1T0ZyOGpXazVSRXNsR3VCMmU5RHc2b0xWbzZyeVVnWllsZ1A3amlBQWhkaHdxMmxKK1pvdmQ0Uk9ncFhZbWhJL3ZuVlpBNkgvdnlVckJ3c1B5MDZnalNFSzMwVGpwaGdmQ01MVXRTVGFoakl3UEJmQkJJaEZHZTVONDdmNTJ6bHhZUlF2QXpuLzRJd2xkTmlGamFKREwzd1VzaG95NWg0Mm45LzBROExBZzNvVGtVNitySzQvMFl6YXZicTduNjhQdWJjaGF6SFdZWlFzQkExaUoxbHgzRlpGTVdZLzBaTmlvT3RhWkg0QmpHZjIvYkZnemtVL1RkQmM1OXJkVGc4a3FObFZJajRJTE5iNmEzN1BsQmtjV1NQeXdKZTF0Slo0WUdlbjBQazhraWU3MHdUcVZ0Qk9CVTZ5M3Q2dUJuQmhBenZHdk5aWWJvM3o4Q0t1VTZwODljcEZTcWROUlBtNWU4ZGVadTk5R0RBdnJ6MTlZNU1EdHNET0QycFFUdjU5UFkrRERYR3c2WGxtOHlQWmhyMGNOdmNaTGR5UHA2OFVzLy91Ty84dFJYdi9wUFA5RFArL1IrQS9rVTBBUGtqTFRkYm8xckFYdkhjVk5mK3RJM1A5ZHNPaU1hdEVPbk5rUkFQZlJrRjRZZGYvZ0lZK1BEQ0tGT1YyczBIWi9UQ0xsMjh4cE9OS3I4WXFtTzUwa3NTM2tXRys3UE1wUlBrYkk3MDhFNm5xVHBndU5LbWw2cmRiQWhaU2J3UGhZOGltQnlSSVNIdGhoQkFGeTlzWXJqT0Q2bmJoclphYjJvV3J3SWliSzJsMkc4N3h1SVZOcG1vQzg4NXJaUmIzTCs4aEx2WHJqQmluL2ltZkJubjNjdlhPUFl3YmtvZ0VhQW5LaHExQVJMWWVnTnpYeXhmZkxSdU9TK0RhemkvWWxZaEZsYkFEcWFMMXdzaEdsVWhjTG9XRk84Ynd0QmY4N0N2a2Z5TjB2QWNHK0tTdDJsVUhXRGhXbGZ6cVkzYTNmQ3JOMHllVkt5Vkdod2JiWEdwZXRyMUJyTlFOVWpKUXdPOUpMTlpnaEFSWDhBWXlHaXhvVVA3UDc0c3dCWHd1QmdIK0xLb3FwTUdPTkVnT1dMcmtlRyszbmcvZ1BVNjAyKy9iMVROSnZHOXV3MldKWVVQRFU1R2dWeW9mWCtyVmIyK3JkNjdkb1NGeTVjdy9POGRsVzFiOFEycHRvMHJ4OVpyTlM1ZEhPRCtjbkJMV3RKS25CNmRwekxqU2JMeFRXRzhxbVlCN3hXUy90WTNNT3U2MzRlK0t0YlYvNkRRYnNKNURjRGR3dm9Rd0Y4RXJmZWRpdGNtN0lpNGIvMVcxLy9tV0t4Y2l6dXdTNlpvNC9HSFRpeWw5azlVeUNVdTlwcXJiRXB3Q3RSYnNncEZ5c05YRmN5TnRURDJGQVBRMzI1bU5PYnJTbGxDVklXa0ZiNW1xNmsxbFNXMUxwamRSY0hsdFFhK2cyT044THQ2NVdCaEhyRDRmck4xZUJJU2srRHQwWjdTK2xEZ3c0VjRRU0xWSVpNUXNEb2NEOUl5ZlhGZGM1ZHVzbVZHNnRLLytuN010ZVNEb25nalhjdWMvakFETFpJUmp5UjlDQ1QwNFFMQUdFc0RrSXBnNHpuMGVtTnZoRkdKZUdDSUdaMXI5TW10U01JRjVIRmdscndTV3hMMEorMU9oQVYzM25xeWRxa1V4YU5wa2RQMW02N0FOb09jbHpKelkwNk45YnJTdDh1SlRlWDE5bllLT0Y2K2xSQ2orSGhBUTRmbkEyL3FWVGp5eE1nWkhUbmhQck9lbnlyN3pVODJHZHc4TEZ2TGdTSEQ4MnliODgwRWtrMm0rSHhSNDd3d2t2dnRPcm13MXhFVjVucWNYaTRuNXkvc3lLKzJqWVhubm9nTmhwTlRwKzV5TnBhWWN1K1NscmNka3BkWnpOWElBbTBWcWhpMnhZelkvMlI4RTdybWQ4N3pZWDNtdGoxRW5tYlRqemhtZkUvLzBNL2RPSTczLzcyMC8raW0xZDZ2OUp1MHNscjRJVW9LT2VCQ1JUSW13WjU1aG56SnFodjl0d0M5bi8wUnk4OWVlWEswaytZNEEwWXdHeTE0ZWdGMC9OVEhEaXlCd1RVYWcwS3hhb1BIRWtBYi82cDhzdTFKcG0wemYwSEp6aXlaNVNSZ1h6WEFKOUVhVnR4aERaVkxXOEFBQ0FBU1VSQlZFTjVtMnphQ3JsS1lYYUErWjRHT091UElNTHI1V3ZMZnRxWUR0NVBISGszd25zL01uZ3VWMnY4NGRkZTRkc3Z2Y1BWRzZ2KzFqMnpEU0pvUTdWVzU5eUZtOEZvTUFkR081YXkwelNoRkNYc2lTQlByQThpNVFiNS9MWUdaY1owOEVhK2VKK2E3ZFB4S1Vzd3NFTUFYbFBhRnZUbTdoekExNXNlRjVlcmZQOVNnYXVyTlp4QXRhUDE2dHErUTRXdHJoWm8xQjJDM2c5V2JpSTZob3oyQ3VQL25ueVdURG9UTHJEOS91L3B5ZkxoRDkzSHdmMHp3VzlQQUdPalF6ejR3SUdXZG0vVkhkUFRZNUUwd3Z6d3NYSXFsUm92di9JMjYvNE9uTnVpelJxMkRkOHdxWWlsdFRKTGErVmJMbkRQd1hsVzdCNGFYbWlFbCt3Z1I5K2IzRDMvOThMQ2lTZHY2NlhlSjdRYlFWNy9aVkRnUGtZSTduSFFUcktXRjBSQjNqVEVpOVJ4NnRTRnVWZGVlZmV6Sm1mZHlzWFRJcVlYQWtiSGg3bnZ3Y01JUzlCc3VvR0xVNzFmdWhYZ293RGpPQjV6RS8wOGVIQ0MvcDdNSGVsUTI0SytqR0F3WjJQYlJDWkQ5RDJ0b0c3ZWw4dTEwSkZQa0M4RWU4dWNaTkdHaHRHL1lGRlRxZEZvTnFQZ1oxejE3a0RoQjV3NmZTbXd6bzNQbFcyQjNGd1FpT1FrR1BGNmtZSmVvTVRLTWRZcVJoV2lwUXdUOWtVa1BMeEd5dE4xQ09qTFdwSHkzODlVcWptY1c2encxdFVTSzhWR3VIME53bjR5KzU2d3oyN2NqSjFBYW41ZkVYNEJOUTRObzFFL3lkQ1FzWlhPRXN4TWo3THc0UWNZSHV3M3ZsMTRuWjBaNThpaCtVaDlTYVNEYmR0aWNud2tPVTNMNGdNMk5rbzR6UVNQclp1T0JiSEowNWFaVzVMZTdyQzd0bHhrclZEYm91cmtDR0VKOWh5Y1o5WE80M3BzQ2ZEbVNYWW9mUGpTd3NLSjhkdDhoVjFQdXdYa1JleHZFSmhGaWVkTkFOOU1EeTlvQlh6eno5eGVKMVpYaXozUFBmZTlYL0k4THdzaEdLdDdBazR2U1V3L01OakhnNC9maDIxYnVLNWtKV0V2Zk1pWmlnRDh3d05NNE5EOEtPTkR2WGUwVXpYWkZnem1ySWlsZG1RaWpVMUE0ZVFvV0Y0dFJFRTlzdGd4MUJ2RysybE9MRUI0WXRla01Bd3BnSDh0VldxY3Y3d1llWmY0ZENFMmlXdEpaeTRBRXE3QnR5TUVpSlk2akF6Q2lBLzdWVVR5aVZpK09QYjNac1NPNHVEdkZKWHJMbWR2VmppM1dLVllkZHQrTjdNZmphVVVBcmk1dktGMDFpS2UxazhSNzJ5aVkzeW9YLzNlMGltYkI0L3Y1OEg3RDVEeVBmTkZRTmlmVVFSdzZNQXM4N01UYmQ0cSt1RW1Ka2F3RFlPS3hNOXFOTDVjcm0yNWNMaFY2aXovTGRTU3NGaTV2TGhCc2R4cXFOaEpOVmJLWm5MZkhLVnNiOXV0ZEhHWHVBYk5BZjl4WWVIRTNUK3JlQWZSYmdQNU5PckRUWkJzTkpjRTR2RnRjMG5oa1h2UGsvWnYvZGJYL2xhajRVd2xuU1lYdDZBM09mMXNOczNESHpwTzJuZm9zcnBXd1BOY0E3c01nRGY5cjZQaU1pbUxmVFBEcEZOMy85UGswNEwrbkxMU2o0Tk5LRzRud2hWbE0rbFE1QmdzWW1LTEJJeUN3cVRocWswa1hOdUVCWDd3L1RhZE9uMXBVOTBnUmoxSklINUxGTHgvcXlnNDZLdUVlc0w1VzhUQ1JTUmU1OHY0bnV2ZXoxUnRlbHhjcm5GaHFVcTFFUUswL21EQm1rZ3ZzSVRSdithWUJEelhaWEZwUGZnRzRmZU85bUYwSWFaR2g0VTZobmxvc0krUGZPZzRNMU9qUWQ3RWJ4VVVBUGNmMzgrNGZ3eHlhMjBoelV5UFltUkwvSEdZSWVWeTl3YmlJdml2ZStvMFc3ZkZTd2tYYnF4VHFUVnZxWjUwT3MzUTNBeVZkTDVsUzUzSnpiZHg2L3Nqd1AvUlpaUGZWN1JiUUI2VXp2MEEwSS82L25IeGU1SzQzZ1QxcExqNE00RDg3ZC8rNDArdnJaVWVNOFhQU1Z4OHlKVXI4TGR0aXdjZU8wYSt0d2NCckswWGFUYWRZSm9JUUkwb3VHdHhjRDZUWXMvVTRDMTVMZHN1U2xtQy9vd1YyUytzSjdwZ1lqWFFNcGROWTJrLy9TWUhUMVJrSDNEemNhNCtzbEF5MVJaUkZZWUM5OWhDUTBDaFZPWENsU1cvbFdhYjd3SVpZeUVwc2tVNEVVa3BRdUFpaEpMZ2ZTM29TYjkvQWI3dWVGeGRxM054cVVyRjE2V0h2emVJQW53VUFJZjZlOENLTDdCVTdQWEYxY0JBTkdKWDR1YzNqN0VONE51L0RBNzE4YUhIanFyam1QMk1sbzRYb1M4TEl3ajhNaDk5K0FqNzlrNjN0Wm5KWjdPTURBOUU2OVh0RU5HckpoUGs0M202R2VTaTVXYXpSRjFRck1HYkZlRjVrblBYMXFnM25WdW9DTEw1SEgxenMxUkZPbEZjbjdnM1A2UmZYbGc0OGRPM1ZQSDdnSFlEeUFzVTkzNEF4Y2tuY2QvdHJPYzE5NTRrbmpjWENSN3F1RUw1eWl2djduMzMzV3MvWXdKNG92NDg5Z3h3NE1oZXhpYlVhcjFRcWxDdE5ZSjRFd0JidUJJaHlHWnNaaWNIZ3NucVhwTFMxVnYrQkJlK0w0US9aRDNKNWJMcElEREMwWXA0NHRpelRtK1VGVXpsVVZiTHY0YnJzRURrNytkYlhrMjJQTzVrVG11YlJzVFNiTEo0Q0JZbG1OL1hYOHlaNldLdmxjalI2OFZUS2h4WDd5ZHF1cEtiR3cwdUw5Y28xOTNnTnhERDI4aHdDVGxmOWQvTTlDampvNE5SaVltZm9WWnJzR3FNQjJFa0NJWVNoaTFJbURKWWZCclZSa2tvdmZDNTg5ZWk3VUxwMjQ4ZDJjTkhGeDVpWW1LNDViMm5OUmZmV21SQ29PREtsWnM0cnJ0Sm9zM0c5MVlEcDdzVnduWU5ROWYxT0h0MWphWnpheWZERGd6M2s1bWFvaUdzdURWOUo5bC9ZMkhoeE93dFZiekxhYWVEdkEwY0JxWUl3VnFEdUFuZVpuaVNXOXA0V2d1MWs2TUIxUEczZFpkSzFlenp6Ny84MzROTVFSVEFvOXg4OU42eUxDWW1SOWwvZUM4SXFQcVc5Sm9Dd3kwTmFnYUxxZ0Z4YXFUdjduR2dIVkRLVWk1VDR5QmxBak1vOVVSYzM5NXFTVzhBdVhtZkVHYTFDMGRQekxGRkY0S1p5V1JqcGkzSkJKWTRxRytWTFdIeWErWFc5Wk1CNW0zcUVVWUNTeWhSL2Z1SkhFK3lYR3h5ZWFWR3FlNXV1cm9LT1hqL21WaWZDVGl3WjVMQmdWNy9OeFJWblZ5UEcrQ3hhWFhoOXd5K243SDhFdUg0VzEwdDhPM3ZudUtpYndjU3RNejQ3ajA5T1I1OStBZ2ZmdUlZQS8wOVFjMHowMk1xVGJ0QjQ1TW5KYWRQWCtUc3VhdnRXcnh0ZERkR1dIekoxSFJjemwxZHcyMFJyVy9TR2o5S1NzSEUzQ1ROZ1ZHYW5najJ5SGRJSThBekN3c24zbDgvckE1b0orK1R6d0pIVVZhU2VqR2lEU2lFOFJjM3JtdDMxWDhPMENRRS9zQW80emQvODJ0L3BWWnJ6Q3FITjM1RkVVQVBuMFA5UE9UeVdlNS83RDRzUzlCb09xd0YxdVl4blR2bXM1b2lwSVN4d1R5WjlNNnpEVW5ieW4xcXJhbCtTQkVuSFlDUXlrakp0aTJrZENNT2JnTEhONkQyS1F2aldkOEx3djMyK2g2Wm1EWllsZ25DUTJza3BGSVcwK05EMkw2ZVhwM1ZEclkvT2RzUVRzTEdaQ3ppenlJV1pvSnhESmpqRTNYTVBiZmhhOXg4RnRFMHdkd1U4eEV1MWZhMDk4dE01SG1TamFwTHNlYmcrZTRPWXdmWmhmNFhwTEhQV3dCU29FL2JrMElvUnpGNmJGZ1dSdzdPOHNiYkZ5bkZ4TnFGVXBWeXBVWlBQcWNjT3dYZlFoVXUwUDRROUdtQ3hzRXQvazA0TmdWT3crSHRNNWU1ZE9VbW5pZXhVNm1ndExCZTM5R08vMkZIaGdmNHlJY2Y0T3IxSlphWDF1bnB5ZmxqSXZUWVpPN0hGd0lhRFpjM1RyM0h4a2JwdHZyYzc3cGIyaS9mcHJRT1F6dUpoRnJENGZ6Vk5RN01qWVNTazQ3Yks1ZzdPTWVaVXBuZTBucTN2NU1mQmY0ZThHdmRaZHZkdEZOQnZoOEY4QnI1MmptdGFmZHNjdnA2SE5SUW5MdHBTUi9rZis2NUZ4Ni9kbTM1VTdadHgwVHhjZDE3RlBRdHkrS1JKeDhrazAzaGVoNHJLNFVBaEJRZ2lJQWJpQUMvMzZwTTJtWjRJSCtuK3ZHMktadUNwcXU4Z2tXY2hFallLRlpZV2ltRUh1Mk1CVTBFOFBWcXhnUnpZekpWTG0waG5iWkpwekprMG5id2wwM2JaRE0ydVV5YVhDWVYvT1d6S2JMWkZEMlpOT203ZERaNVc3b3RSSDYvd0htVVBLbTJ3eFZyTHA0WExtckN6Ni91bEVkRmhlNmh1K0hRNjJMYys1dTZxankyYlRFeE5raTVVdldsUUFMWHIramF0V1VPSFp3anZxb1F4a0xDd0dUTTFwbjFMaTJ0Y2VxdEMxUk1ON1lpZG8xUjBGWUw1bWJHbVowWlN6aTFMdXJPdFZTdTh2cnI3MUdydGJkQ2orZnBIQmdqaGJUUEUxdDRkRlplU3lkMlJKVmFrNHZYMTlrM1BkUzZhbzQycWFVOTZWeVdtWU43dUhiYW9hL1d0UStCLzMxaDRjVFhUcDU4K3RWdU0rNVcyb2tnUHdZY1FYMWZMZE5KQW5rVHpDMGpuV1U4QTFSUUFHK0s3akhMdVhqeDV0Q0xMNzd6T1ZNZjNrNVVyNTU5OEVady9KR2pEQXoxZ1lUbGxRMWN6d3Yyd29lVGdIb3dTZ0NnWEcwcUg4ODdtQVJLUDF6MnVYblg5VmhkTDdHeVZxVGVjSHhYczhZaUJnUGdSWGlmemFUSSsrRGNrMHY3ZnhuNjhtbDY4eG55MlZTa2p6K2czVXVWdWtlaDV1QnFGOHFHSkNTQ0J4MkFsRGtKeERPMEd5MENXRjRyc0xmWkpLVzVib0U2SmpZcG43L1EwTWZSU244RklJVGswcFZGNm8ybW1nUDBXSmZLWDRicnlWYU9QR2hoWkltaVNtM3p2aXZMNjV4Nit6eXVzOGtwcVczeWRvcnpyZW0yamRXLzVWSUw1VHBYRmd2TWRlTCtOa2JEWTRNVUMxTlVycnJrRzUzNTh2Y3BBL3ptd3NLSngwK2VmUG9Id3IvOVRnUDVDZUNZZis4N1JFM2sydHNCdlFtdERhQ0lHbk5KWW41TjRuZCs1MDkrMFhHOEFkdld3SzQ1OVhaVzllcHZkdTgwYzN1bkVjQjZvYXg4MG11bE1xWVVvSldMTDFVYkRBL2tTTjByUitSZFVOb0d0K3B3YzduSVJyR0M2M2xJTHhTclcwSVpEbWJUS1hYMUFUM25BM28rbTk0Vjcva0JiUTk1eUJiT1haUHdVVkdyTkJLZzBFZDJ5VWF4d3RwNm1iV05Ja2NPenBISnBNTThwaVFvTER3b1VIcVNhemRXMlRzL2tjaG9SdXVOaXVwTktkUGN6RGhMeXh0dDN6WGcvUU5wUWNqWnRnTThrL205ZVBFNlo4OWYzZVI4K2x1bHprcm9LTld0Y1BnZDBtcWhTc3EybUlxNXY5MmlPVWhnZnQ4VXB5c1ZHaXNPR2FleFZUYVQ3Z1ArTCtBWHVtcnNMcVdkQlBKandQMyt2UWI0cllBK1NXVHZBbXNva05mdWJWdUFYZi85dTMvMy9KOWRYeTg5YWxtcUtKT0RCeE9jbzJMMnZvRmVqajl5RkFUVTZrMks1YXF2WHpJV0JYNVYwY29GdFlaRG8ra3lQZHI1d0w3WGxCWWVVcnBNanZTU1RhZVVLRDJqUmVxcHpTUnVIOUFQR09WU0ZrWGNBSXhORVh3QW9INWFBMU5CUUtGUVlXMmp4UHBHMlQrM3dNUDFKTXVyQldhbWpIM21XdXl1QTh6ekFYeTZjWE9WdWRseGhCRWZ5dExaRkxWMDlPVDRFT20wVGIzdVJPSTJ5Mk5XMDVwRzlZUG5TZDU2NXp3M2JxekVDdGdlRG5zYmk5cEdNajYrMGE3RnRUSTl1VFFEdlRuYU5qamhYWVFsMkhkd25qUFZCblpwRmR2cnltci9jd3NMSjU0N2VmTHBQK2dtMDI2a25jSmVqUUNQa0x6VkxjbnRiSHpMbk01WEJxNENWVFlCZGgzdzRvdnY3RDE5K3ZMUHR3SzdJQzZpTjhPMUhqNWxXM2llWkdXMUdOVUJpR2lGZm1ZUTZraldjcTNCeUVDZVhHWW5yYkUycDRIZUxQZnZIK2ZBN0RDekUvMk1EL2N3MEpzbGwva0E0RCtnS0tWc3dVRE9KcCtKSG9uYmZwaUV2NzhiaTJ0c2JKUU5xMm4xbTF0ZEs4WmczSmVxK2JxQXVJVzlFT0M2TG90TDZ1ejJxSVNPU0ZyOTJ3eEtOQllQbG1VeE16VVdTdktFQXVscXJka3l1YlI1TlVRc1FhUFI1T1ZYMzRrQ2ZJZDBiMHd5ayt2Y3RDVWk4Yll0WFY0c1JFLzE2NUJ5dVF4eisyY281YlQ3bEs3b0N3c0xKNmE2cm5TWDBVNUFtV0hnQ2NLMVdweUxOL1hvVnV3ZVAxNENpMENKMEtoT1V4enNBVVNsVWtzLysrd0wvNFBueWJRUzA3ZHk4VUFMMkFzQnh4ODlSbi9rYkhnWFMxaUdIbDZFUCt4Z0FsS3RMSlRyQ0FrVHczZkhaZTEya3RRS1ZwOCtBUGNQcUIzMTVteDZmUzJabE9vMHVZYnIwWEFrRGNmei8wQWY3NnVaNjF3MlE2M2VhT0hhSE1kaFk2T2tqb1R0UW5SODlkb3lFK09oM1V1VUlVeGlEN1hrd1g4VVNtUi80ZEtOSUt6WmRQbkdOMThoblVrejBOL0Q0R0EvdzROOTlBLzBCci8xZG5yNVFxbkNxOTgvUTYwV0ZTL2ZNdFBkUlVaVFlyS3R4bmZiUUs3cmNmSG1PZ2RuaDd1ZVdFWkdCeWtXeHFsY2E5SlQ3K3BBbkhIZ1h3R2Y3cXJDWFViM0d1UjdnQS83N2ZCb0JYaHRKNk81ZDJKWGdUS3F1K3FuamU5RGF3RjNIZlp2L3MxWGY2WldhK3pUaDh4RUVyVVIyWU5nY21hQytmMHpBSlFxTlNyVmVtVGxIMVNTTUZDTGxZYmFnbU1MK251ejdYdGx4MUxNdWxlRzRjSGRCOEQvQWNWSUNFaW5CT21ValRuc1BZa0MrNlpIM2ZHb05UMEcrcktzRjVLM2tDMnZGaGdjN1BNTEpib1B6NnpQdUsvV0c3ejU5a1h1TzdJSFlZbTJobitiV2E0UDlQY3cwTmZEZWlFS0lQVjZnK3VWR3RkdXJJSnZqRGN3ME12UVVEOURnNzBNRHZhVHphU0NVbTh1cnZIR1crZHdYZmZXVUwxTm52WkZiVlhKTnNuelk3cUpUa3VOcDZ2VW1seGZLVEhkMGZHMDBkQzVQWk9jS1pWcHJEVzcxYy8vMllXRkV6OS84dVRUejNTVGFUZlJ2UVI1R3dYd1dVSlFoL0RMNlord0thYVBBLzRxY0ozWWZuY2pYZUx6ZDcvNzF0NUxseFovcGxVY0QxSEFpc2JuZTdJODlNUnhCQUxIVVNmTDZYUWlYcHQvbzI5ckRZZDYwOEcyQkwzNXpEMTFYWHVySkFSNFh2aDZJY2FIUy85dzN2MEErRCtnemNrU2tFdGI1SXd0a1BPak0zem82Q1RycFJycnhScXJoU3FyRzFWV0NoVUtoUXJOaG1FeDcrZUppOFBqdExaUjVQVzN6L1BBMGIwSVMwOGxJVUFzTGExUnFha0Z1Q2NsbmdlZTlNSm5WNUxPcGlObEpsWG5laDVyNjBYVzFzTnRYZmxjbHNIQlBsSXBtOHRYRnVrRy9yWUpncmVIN2hLSHY3UldwaStmNmZya1RkdXkySGR3bm5mZnJKTXFyMkVsKzdGdlIvL00xODh2YnAxMDk5RzlCUGxIVUtMNkpPN2Q1T0xiV2RaZlE0bm80KytReEwwSDVIblNldTY1RjA5SUtWT2hLRDZabTQ4K3c2TWZlWWhNTmdOSVZsWUwvb2xYQnBnWmYyYkZydXRSck5RRHh3OERQYnVSaTFja0NMZEZCVytvVGFVUnlyTFpUNmZKWkxoYW1hLzNwL3ZXRCtqV0taTzJtUmp1YlZGcFZXdE5DdFVtVFdsUnJEbVVxazRiajJlK0lsem9iWEZRTEpSNS9hM3ozSDk4SDVZSStZRlNxY3FwdHkvZ3VoNnVsT0dwWmxJWi9IbWV4TjNhTjdxdXRRVUVxOVc2c2NkK2M2djdyU083STBGbnhuZjNaREd4U2FXWGIyNXdlSDYwczBPNmpITHkrU3l6ZTZlNWRzNWhvTkorUjBRQ2pRQy9EdnhjTjVsMkM5MHJ3N3NEd0g1YURlekVGbGQ5Znc3RndXOEs2RW5Qdi9FYlgvbno1WEwxUGtqbU1OdnA1SS9jZjRnUi95em9qVUtGV3IzWnRoSXpURXJZME1jc0NzWGI3MDVSdlNMcHc3ZVVTa2NmL3NXZi9UOC9yU2ZEUE9HOWZvN251OWR2K1FIdFJNcm4wa3dPOXpBM2t1TyttVDQrZEhDSVR6NCt6MDg4ZFppSEQwMHhQdHpiWG13a29GQ3M4UHFwOHppdUd5ekd6NXk5MHJwUWlNOEJuVFJ1R3hhcW5SYXhrNHp2dXMrOWVUa0NnZU42WExxNXZxV2lJWWxHeG9jWkdCdWxrdTNwdG9sL2FXSGh4Si9yTnROdW9IdkJ5WThBajZPK1U1eDdoNmk0M2hUWjZ6WGJPNmo5NzUzbzN5UFByNzkrYnZ6TW1TdC9MVGs2bVhzSEdCNGI0dkR4QXdpaExHUFhOMHFoTlcrTFVpQmFSckZTeDNVOS8zUXFGWmZkZ1M1c3U2RXRUblpGQ3YvREJSeStuOCs0aXdnRHBGbzhpS1I0bytTN3dmR2JMbXBsUXBoNUV3eE9FYjVMOEpYRjdVNkxIMUFuTk5pYlpmRGdCQThjVkdlNjE1c3UxNWNMWExsWjRPS05EUzdkako1bFhpeFdlTzJOc3p4MC8zNldWd3BzRkxvdzFOcnlnMjZsUFk3RmJ4Y0xmU3ZsYkpHbjB5THZsRlNpWEcxeWM2WEUxR2hmbCtVSjV2Wk5jYVpjb2VrNHBOMnU5UE9mWDFnNGNmL0prMDkzN1Vadko5UGRCbmtMV0NBMHRHc25wazhTMTB2Z0xhQkExT0srWS9yU2w3NzVTNTRuOCsyT2cweWlkTnJtOGFjZXdySXRwSlFzTG0vRUFNalhRQXZ6U2QxVTYwMXFkU2M4ZDk0UHQzZXhZeGoxSVdMR2Q4YVBUd29RbmdIMGdZc3hVMkN2N3d4ZzkvMlNnOStYbnErVkRNQXlCSDdYbGRTYURyVzZTNzNScE5ad3FEVmRhdlVtMVlaRHZlNVFyVHNxdk9IZ3VCNlBQM2lRc1pGK3ROUTFBdHlHcmpFTzBOMDhieHJYN21xa3lhZmFNNklmVUdlVVRkdnNteDVtMy9Rd0gvWERWZ3BWTHQxWTUrTDFkUzVjVytmeVlvRXIxMWE0Y20zcHRxUkc5K1JUdFFHNmJRSGxiZ3U3dzdTNFZxYjNGdlR6bHAxaTc4RTUzbnVyU1g5NURVdDJySitmQi80SmNLTExwdTVvdXRzZ2Z4d1lvaFhROVpCSzR1eDEvRnNvSnplM3dnYUxmL1d2bnZ2aFFxSDhwRHBVWmpNQnUvL2twM25nOGVQMDlPbnRjZ1dhanRPUis5V200MUVvMXlOSFYyb3k5dzd2U3BJeGJKZXRjY1JBVk92b293c2twZjhzMTVxVXF3M0t0U2IxaHVNRHVBL1MvclhlOElHNzZlQTRuaEwxUTREV1NpMlFQRE9sYlp1Ky9sNGFobEh6bmZnQ1dub2hFN2g0YzFFaC9Kc0E0UDI0cE8waEg5RHQwK2hBbnRHQlBJOGVtUWJBY1QwVzF5cThmVzZRczFmWE9IdGxsWldOMERWcWdveVBXMGE5V3dabGxlTDI4WGFyRXJZSjBkdDUvK202SENMTk1mWHozU3hpOHIwOWpFK1BzWEtsU1g4MStTanFOdlFMQ3dzbnZuank1TlBmNlNiVFRxYTdDZkw5S0dPN3VGamU5RTl2aHB2TTFTbGdpYzdud01qdjlPelphd052dkhHKzY5WForT1FvZXc3TUFjcUFacU5ZU1FUdE9Fa0o2OFZhMjNqYjJyMmN2TmF4Z3d4RUxadjkrQnpYbzFwM3FOYWFsR3ROS25VZjBLc05pcFVHMVZvVDE1UEt5TWszZkZKL1h2Q3NEZjF1VlY4L05UR0V0UXY2M0pQcTlMd1A2TTVTeXJhWUdldGpacXlQSC9YRFZqWXFuRHE3eUJ2dkxYTHEvQ0tGVXZ2ZmI0VE04ZWd2Mkc0YjZuWUlKOTFDWGJ6ZmRra1dsSDUrNDViTytKaVlHV045clVEVmRicnhiMitoenA1LzlPVEpwN3VTOWU5VXVwc2cveFNRcHIwZXZwMjQvaXpLeUs2YnRrYkd6VFBQL05Fdk9JNDcxSTJZM0xJRUR6LzVJTUt5OEZ5UHhlVU54YVYyb0d0ZEw5VndYQyt5VFM2VHRwWCtzQy9YeFd2c1BGTEdkRExnMkp1T1M3M3BCcUx4V3NPaFduT28xaFdvTngwM0FHNEY1RjU0NzhtN01wZk5hbmVvTzV3K01EaThkelE2Mk1Nbkh0dkhKeDdiaDVTU2M5ZldlZjNkRzd4MjVpYnZYRnpDYTNTMUpldU9VOHUrL3JicGRyQ0ZmWWRVcmphNHVWcGljcVF2RnJONXE0VmxNYjl2bW5mZmFaQjJHNlJjcDIzYUdCMEgva2ZnVjIrcHdUdU03aGJJN3dmMjBKa2Uzcnd1QW1lNGpWMEFYL3ppMXg1ZFh0NzRDUlBnazhXNjBiRDdIajdDZ085NFkzRmxBOGYxNklRWkxGY2JnUjQrbjBzejFKZGpzQzlMTHBNT25Pb0U1Nkh2UWlxVTY5eFlLUVdBcnJZYitaeTM1c0psQ09LYTd2WUVrckp0cHNhSDJETTd4dnowNkoyVDBYZEx4a0l4TUU3MDIvVUJ5TzhNRWtKd2NIYVlnN1BEL1BRUDMwZTk0ZkRtdVVWZU9YMmRsOSs1em9WcjYwSGF6Y3pza2tPM0FLWk5ZemRyOUsxbTNCMjB1RnFtSjVlaFA5K2RmcjZudjVleHNTSFdGbDBHSyt0Ylp3anBIeXdzbkhqbTVNbW5MM1JWNFE2a3V3SHlGb3FMYnllT2J3ZndaZUNsaFBTMGVXNmhadE94WG5qaG5WL3F0c0ZEd3dNY09uNFFVTmE0NVhJTnNZV3hucFRLR1lZRTVpWUdHT3JQa1U3WkJyQ0hXbXhQU3V4ZGl2SWI1YnJ5M0dlS3ptUG9GQWVybHVjdGEybjkxTktMRGdScDZPTHhuMjNMWm5wQ0Fmdk0xQWdaMnc0QjlSNU1nSEVkZmJ0MVJtQlErRDZacEp1dXBGSjNzVzFCeWhLa2JiRXJuVDlweW1aU1BIWnNoc2VPemZEZi9oU3NGQ3E4OHZaMVhuNzdHdDk3OHdxcm02am10cVJkQmM3YjFWaS9uQzZMMC9yNWxoTXR0eWhuYW42U2pVS0ptcE1uMStqNGROa2M4SDhDUDlONUMzY20zUTJRUHdJTTBoN01vUlhJWGVDN3FKUGtvcTZtMmxNTE12ejZyMy81TTdWYTQ3QmxXUW5jZSt1VUs2VkVDSXZIZitoaGJOdW0wWFJaV3RrdzRxTWN1QzZoTjUraEw1OVJaMVpieW9lOTB0M0xRRlltaldmUGs3dDIwcXMzZkpHWDN1Z2VzWlpQK0FoYkFQNVdHV1JyVU9UWnRpeW1KNGFabnhsbGRtcUVWTXB1TVFnTWt1dlBZZHlMMlAyOVpQaGRiK2NJSEc2SDZvNUh0ZWtoRy80dzhkOHFaU21qMDdRdFNOc1dtZFR1QlAvUmdSNCsrZVJCUHZua1FhU0VzMWRYZWVudGE3ejA5alZlUDNPRFdyTmpzZkN0MFhaWjJHK1c0UjdvMzhOMHlhb0l4L1c0ZENQVXp5ZVZGd0pKR0dQYk5uUHprMXc0NjVCMkd0MmNWdmNYRnhaT2ZPTGt5YWYvcE5NTU81SHVCc2cvVGdqbW5ZcnBUNk5jMXNZRjVGdENoTDQ1ZS9aYTczdnZYZjN2SXBGYmNKd0FoNDhmWUdSQ09iMjVzYlNHNThsdys1dFJRenB0TTlpWFphQTNTOHEyYURSZHhjbjdITHVIeEFvMm5BbmZ1anprNUhjalNTa3BWUnJFdTcwZEVNdklzOXhhaDlqQjk1RW93Nm1wOFNIbVo4YVluUndtbGJKRHJ0bElkenZ3RVg2dEJHNjhROXVNVzZsek42dHlORFdjcFBFaHFUdFFhM3JCczNwWFFkcUdUTW9LL25JcHF5UFYyRTRnSWVEUTNBaUg1a2I0UzU5OGdFYlQ1ZlgzYnZMUzIxZDU4YTFydkhkbEpiTGdqT1JORG01SmNlY3Q3TzhnYlhQVjVWcURwYld5Y256VUJmVVBEekk0WEtEc2RtMXQvODhYRms0OGZ2TGswenZMS0tNTHV0TWdmeEFZWlhPdVBRN3dKZUFOSTAzSHdHNCtmK0VMejM3V2RiM2grSjU0TmJtSXlET29zTjYrSHU1LzlENEFOZ3BsYXJXR1lVMHZFVmowOTJRWTdNL1JrdzExN0k3cjBYUmNmMnVkYm80Q2VvRUdBeTJpRWppdXV5c2Q0cFNyelVCTXIwSGNCR0l6UEFnakFkeU5yeXFFb0NlWFVaN3ZUQXY3NElxLzBJTCt2anp6MDJQTStNQWU0Y3hqdEw1UjV1cU5WZTQvT3Q5V1JHNWVXeUp2RVdpN1hRVG85RUpBUHEzOHVlOW04cVNrNllTcWxIYnp1NDd6UElualNzcDFMK0loMGJZZ203TElwaTJ5S1l0OHhpS1h0bmY4QWlpVHRubml2aG1ldUcrR3YvVVhZR205d2pkZnZjQTNYcnJBNisvZDdIeUJmMWR4ZVlkdG85dUNicTZXR2VqTmt1M3lxTzdaUFpPOFU2aFFkeHBrbXgycldCNEJQZ3Y4eXk2YnVXTkl0TnRidkUzMGwxSEgrVWtVaUhkeS9XUGdrbTRmU2x4dm94WWt0dkhYOXZuWlo3KzM5MHRmK3VhWGJkdEtXNVk2RTlxMjFaOWxXZjZ6d0xadExFdjRjVFkvOG1jWG1Oa3pnK2Q1WExoOFUyR3lKY2hsYkliNjh3ejJaYkV0QzB1RSsrZ1JVSzA1Z01ReWpxczFqNjRWQ0RWNSs4OHBXekF5MExYYnhYdE8xNWVMWEY0czRIb1NHZC8yWm14L2M0M3RiOUZ0Y2VHekVJS1pxUkgyem82VHphUU4zWG9NZ0dXVXE4YUkwMkFhQ1VRbGRsMlAzLzZEazB4T0RMSHcrRkZ5bVhRUUZ4WVF2UmNZU2U3aWM5cUNudlR1NStBQlNuV1hVczFUUzd0ZzBXZmNCMjZOUTBBUHdnRHBiNW4wVUFmRnFMeWgvVWRQMXFZM1k5T2JzK25McFVqdm9qMkhxNFVxMzNydEl0OTQrVHl2bnI0UjJQQWtyWUhERzBsQ0V2OTMwWm94YVRaWHhiUktWK0kzeVhYRXc1TGxjZEtJYjErSGVTczNiM01DTHBubDllWXpISmdaUnBwT0pvdzBjWWRkdWhmWGx0ZTVjdjRhZzVYMWJwemtMQUdIVDU1OHVpdUgrRHVGN2lRbnZ3ZVlKZ1J2MkZwTWY0a1E0T09VeExISDUzMEo4T3l6My91N0lOUHg4OC8xaEJJK0t3NWVTcGpmUDhQMG5oa1FzTFJTUUVySllGK09vUmpYRGhKUENpV1dFTkJvT01GQk5TSG5yc1R6U25UaDUvSHZsRzltaWVONnJRWWtPNXdLNVVhQ2kxZS8yeE4wOUVGQ0l5aWRTakU3UGNMYzFHZ2dabThwY3hQcWxNbTJMWXZCZ1I2dUw2N3g3TmRmNGFOUEhHTmliTER6aXU0UzVWTHE3LzFBVWtJbGFhdFowaVNmeFBYcGNTQUFENFFJRndlZy9BZ1VxdzRiRlNjNDh5Q1RzdW5MMmZUbmJQcHpLZnB5ZGtmT3F1NEY4ZlAyY3dBQUlBQkpSRUZValF6aythbVBIK09uUG42TWpYS2RQMzN0SXQ5NDVRSXZ2WFdWcGhQMjIrM3FybHZUc1gzYjZPNnByajVNVjY0MldDMVdHUjdvYmt2eThPZ1FxMHRyVk53bWZiV092ZGVPQS84ejhNdGRWYlpENkU1eThwOEJqckkxOTI3ZWZ4bmwxYzZrTkYxdzhVOC8vYnRQdmZqaTZTK2tVaWJYYm5MeElyalgxM1E2eFUvKzNFOHdNTlJQczlta1Vpb3oySmNsWmR1R0cxSjFZL2srNnhHSzY2ZzIxRUUxUWdpZmt5ZkN6VWU0ZTBJT3Z5K2ZwcmZMN1NEM2ttb05oemQ4Y1dQU1ZybDRlQkR2YjdITFpGTE1UWTBxeHpUQ0NyRy9EZWNlZnpZNTk3aGhuYmtGVFU5b1FzTEpsODl3N3RKTjlkMkFoNDd2VStMN1dMNTd3Y2xiRnZTbW9aT0R0bllMVlJvZXhacHJIRmprZnp1Zit3czQrQmlISDZxQVpEUU52cnBHUDN1S3d3K3ZNaEQ1ZS83VkF2cnlLV3pwa01KamZuS0FnUjErSUZTcDJ1RGIzNy9FTjE2NXdBdW5ybEJ2dXNiNGJzL0pxMHNTeDlwS01oYVp4TW0zMUpOWW5rd01UK0xrZy9BdE9QbVdla25tNU9QbDJaYmc4SjVSVWltclkwNGVvRmFxOE83cGkvUlZpNlE3UDN1K0NkeC84dVRUNzNhYVlhZlFuZUloMHNCaE9qT3lBOVg3bDJnRmVJejRSSzdkZks3Vkd0YXJyNzczSzBDRUExRFBraVRPSGlRUFBIYU1zYkVCY21tYnN0Y2cwNTlUWUtFTDhEa0RJZFhrWXZrb1U2a3JIYlcycEZmY3VzQUsrRTBaZVVsekxWcHJ1UFRtMjNmZ1RxTWJxMlYvd2cwbmIvTStycWZYMTk2ZUxMTlRJNHlORHJhQ2N3ZlVNWGVma0hCNHNEZEk0Q0Y1N2MwTExDNXRzUENobzJRejZXQ1BldElDSXE0RjZNVDRMdnpxbTZkUDI5Q2J1V1cxLzQ2bFNpTjBOeXhSN3h1eDNZak11ektJQzhNU3JzWkRuQnMxOHpwTmw0MWloVUt4ekVhaHl1cDZrYWJqNG5xU2dkNE04eE9EekU4TnNtOTZpTG1KZ1IwbFJldkxaL2p4anh6aXh6OXlpRnJkNGVRYmwvbmpsODl6OHZYTGtkTXV0NlM3cXNlLzkrUjZrcXRMUmZaT0QzYVZMOWZYdzhqSUFHdkxIb051RTlFWm81c0cvaG1LZWQxVmRLYzQrZnVBLzRyTnVmYjQ5ZmVBR3dsbGFaMzhscHo4UC9nSC8vS3ZYTDY4OUk4MjQ5ek44R3cyemRGamUvalVuL3NvcVV5S1dyVk91VnJ6ZGVqQ0VORnJuYnEvTlU1QW8rblNhTHFCemwxWVNvUWY2T0l0V25UMFlieTZEdlhueUhWcFBISXZ5SEU5dm4vbUJrN000VTBTQjYvMTlQMjllV1ltUnhnYTdJMXc0NTF5N2tBRUJKS0FNK0FDREJHaXljbmZXRnJuK1Q5OTNRQlRsYk1ubitNelAvWTQ2WlN0UUY3ZUhlNWRDS1Y3ZjcrSTUwMHExMTFLZFMvQ29XdnVYSU84TmpxTGN1dUVITGxzeDluNzkzNWF4L1VvbGFzVVMxVTJpbFUyaW1VcTFYckVrMkpVMGhUYWlMaXVSRmd3TXpiQXZ1a2hEdThaNWRqZVVmTFpUbmZxM2oycU4xeSs5K1lWdnZIeWVmNzArNWNvVldOY3A0eHhyTFF3MGtiUzZJcEt0cm1KWkk4dHdzekFGczY3VFFQaWkzb1p2NVB4Y0YxTThvc2tsYmQzYXBDQm5teWtuT1IrQ1N0em1rMU9uenBIdWw2aHA5N0ZTWVR3cVpNbm4zNittd3ozbXU3VWRQTUFuZStKOTRDYkpBTzhUcGMwcGlKTXdKa3pWM0tYTHkvK29wNVdremwzRldiYkZ2djJUYkpuenlSSGpoL0FUdHQ0cmtlcDdGdGNDb0l0Y05MbjNEMnB3RnlMQ2FzMXh4REpTNTliRE8rUkFrK3FDVVZJWlRYdGFaRTlBc2R4dWJwWVpQL01FTjJjaW5jdmFIR3RqT1BKVnM3ZHZQcjN3NE45ekV3TzA5dVRhd0h0elNnUjhEdklrOWh6ZnVhaHdiNkFpd2VsNDBXS1lOdGRwL1hjRHVrMjJoYjBaOVQxL1VaTlYxS3FLM2xwTUpmR090WmN1RVVtYWIwSVNBSVpvdWt1WFZsaWJhTk11VkpUeHAydXhKWGgrUVl0dUdBQWlCbnZPaDRYcnExeDl1b3F6Nzl3RmlUc25SbmkrTDV4N2o4NHpxRzVrUjF4dmtRMlkvUHhSL2Z5OFVmMzBuUThYbnI3S24vODhubSsrZXBGQ3NieHViZEZYWFAvMnl3dTJJYmlyaTRWNkowZjdlcWJwZEpwSnFaR3VYN05JK1BVdTNGNSs3OEJ1d3JrN3dRbm53WCtIdUhwY1oxWTFYOFY1YjQyaVRxeHJMZi85dC8rZi83V3padHJ2eEsxb05lY3U3S3d6MlRTN04wN3dkNjlVMlF5S2ZvSGVybnY0YU1JUzFBc1ZxalhtNkhlUGRDdHgvWHBhaXVaNjNxS2UyK25meGNpc01MWFlZMm1TN1hlcEZwM2NEMFBTMWpNVHc0d056R3czZDlnMjZqZWREbDE5aWFPRytQaUpSRk9YbnFTZ1lFZVpTbmZsaU9UYmZXdm5yOEFhdzJESXdkbXlHYlRBV0lHWEQxUnpqMTROdHIvdTg5OWoxSlZMZDZraEw2ZUhKLzU1QlBLRzZHUk5zNTVBK0U1OFVhOGNZbmtDZklsNU1tbG9POTlLSjRIMWFlclpRZkhBRnE5YVZJYTMzSkxqbDUvZTh6dkh4MEx4VktWdDg1Y290R01uWWRnY3VwUzRybW1oTWxUQnlENVp5WjRyaHBucmhjdUVNeXlYTThqbTdZNXRtK01odzVPOHREaFNXYkdkOWJ2cyttNC9Na3JGL2lEYjUzaHhiZXZSQmMzYlJiVmNVN2VUMnJjdEZsa0paVW5ON0d3NzVpVE41NFM2dWlHa3dmSlNIK2UyZkdCampsNUFPbDVuSG5ySEc2bHlrQzFLOFA1ejV3OCtmUWZkcFBoWHRLZDRPU1BBaG1pVnZVbTF4N244RDNnL0NibFNlTXZNZXpWVjkvcnVYRmo3VysyR3V5cUg3UmwyZXpaTThtK2ZaTmtNaW1FQU0vem1Ocy9DeFkwR2swcTFYcGdWQ2VSaE5hL2l2dlRpdmg2dzFOaWVrc0V1aHp0OUVicDVMVVRIT1dtdE5ab1VxazJxVGFhU0trT3ZyR0V3TEpVUGRlV2lvd1A5WFM5NS9OdWtBVE9YVm5GY2JVQmxNa1Z5Y2lmSnlXcjY2Vk5qZkFTRGZNMk9YM084eVN6MDZNaHdHL1NVSE9BbVdBNlBOUkhzUkx1aVYxNC9LZ1MwOU02b0ZyMDdNYXpqbStIMUVsUlFpaHdmeitLNXpVVjZ5Nk9GKzlKRXJqNTZQS3JkUTczNHlXUjc2bUtVazk5dlRtT0hkN0RtKzljeFBVY2d1MTFHS0FnWlJodXFBU0lsQmVDaFl5TmFhU2tVbS95MHR2WGVPSE5xN2hTTXRxZjU4SERVeng2WklwSERrOHljSThQbVVxbmJIN3N3d2Y1c1E4ZjVQcHlrVC84OWhtKzhxZW51Ym02bWRoNVp5anNPMjFGcHpzSE5DbEwrM3hYYWhkaFdVelBqSFBoL0RVYXFReVp6bzN3L3BlRmhSTmZPWG55Nlh2Zm9SM1FuWmgrRHVJYkVOT1p1UDRjeW5LeEhiVUZkeDMyK2MvLzU3L3F1dDZ3YlVkRjlaWmxNejgvd1o0OUUrUnlhU3hMS0E1Y0NNYW5SdWtkNkVOSzJDaFVGTGNncEhKTWdrQjR2b0VkUW1HOEovR0Uycm9oVWMrV0VIZ0NwSkJZd2xMaVlLQlFxMU91TnFrMUhOK1MyZ0QyWUZKUm9uL1g4emg5Y1lYakI4WjNsREVRd0xXbElvVktRL1duTDZ1UGdEdDZjalFteXNRd25WNUc3NE5GbEF3V1ZHWTVtVXlheHg0OEVHMVVERTBUZjJVR09BOFA5bkx4NmpJQWh3OU1NelUrRkNsaUU5enVtSkxLU0Zrd21OdStvMk05dWZNYzVaVHJIalYveTF4Y2JXUCtVQ1Boc1Y5enV4VjhrQ0VJVTJPanJ5Zkg4YU43ZU9QdGk3aStpRFhFZDJua2paV3JoNWxBbllNUXRDVWN6NGtrWVhHOXd2UGZPOHRYdi9NZVVycnNueDNoa2NOVFBISGZMQThlbWdnV2pmZUNwc2Y2K1JzLzlUaWYvY25IZU9ITksvekJOMC96emRjdVJyYmtkVVozY0JGd2w0cSt2bHowWGQ2Mi9sRGFOYUYvZUlDKzVUV3FudHNOeUQ4Sy9EUnFOOWlPcHpzQjh2dnA3cVM1ZG1KNmsrTHpSUkQyOWErLzJyZXlzdkUzaFZBQXFjRGRZbTV1bkwxN0o4aG0wMWlXcmJaeWVSNldKVWluVTh6dG4wTUMxVXFkWnRNQklSQmVkQ0wxRVA1cVJYSHAxWnFqVHFNVEFrOElzS1FmTDZnMm14UktkVXFWQmxKSWJLSFVCRUlvK2JJZ25GZzhRRWpsN05hVHlsWGo2WXZMM0xkdmZNZm81MHVWQnRlV0NoRkExOXk4YVF3VkJmMTJZTjRPL0JQQ2pQdkhIdGhQem5TVVErdlBWNUpzNmE1cGVMQVBVTVoyVHp4NHNDVnYxMlRVcGV2V0Zldm5mTm9YejIvRHA1UkFyUWxOVHhudDdaUXRkOFdhUzdVWlhaUWxLc1hqQ0E3bzNnc0FPWm9qdUFaWmpVQ0o0dWp2UDdxSDE5Kys0QU85YkIxWFJuc2lpd3NaSDZQUnVuVjk4WEowSGsvQ21Vc3J2SFYraVM5KzlRMnlhWnVIRGs4cEwzZkhaemt3TTN4UG5CcFpRdkNSQitiNXlBUHpySmRxUEhmeVhmN2dXNmM1ZDdYZGhxVmRURzBRdTFKcnNsNnNNZFRmM2JhbG1ibEozaTNWcUtlelpKc2QyenI4NnNMQ2lkL2REZHo4ZG9OOEh6Qkc5TGRxWHVNQVh3VXViRkZtdThXK0JPUXp6M3oxYjNpZUhMUnRCZTR6TTJNR3VGdTRyZ1JjcExRQ1MvbVpQVk5rYzFta0p5a1VLN2dTZjl1YmJ6em5UMENCdzMzL1IxK3VLamUzbnFYaUhCZktsVG9iNVJyMWh1dnIvb1dmUnMwU2x0OWFUK3VOWlZpbThIdkVzd1NGU29NemwxYzR1bWYwbmp2ektGWWFuTG0wa3FBbkQ3bHZ6ZDIzY1BReXhpbkZaMjNDYXd2M1ozRDJzMU1qek0rTWhaT3VtVlcyaXVXVFNBSWp3MzE0VXJMd3hGSFNhVHRCVEJ3dUh1SUxoc1RuVGVvVFFoblg5V3lUb2JZcm9kSU14MHlsQ1JrYnNxbDdwOStYUUtIcVVuZE01QXpqd3U4cGd6QjFsWkc0Q0xqcThhVlRtc2dlY09mK0YvQTU4YjdlUEE4YzI4ZjMzenFQMjlBY3ZTUXFydGZsUnNNaURmUHY0Mk5ZajNGaWJkWHQxVlJ2dXJ6NDFsVmVmT3NxOGorOXlNaEFubzgrdkljZmZtd2ZqeHlkdWljR2ZFTjlPWDd1VXcveWM1OTZrRGZQTGZMNzN6ek44eStjcFJLM3pyOFRkSmRjMjdhakd5c2xCbnF6Q2FlR3RyWkpOek9ienpFODBzLzZza3VtMlVCMHR2eC9BUGhaNEQvY1hvdnZQRzIzNGQyRHdGK2hjeGUyYndHLzMwRzVpY1oyWC83eXQwYWZlZWFQWHJKdHF6OEs3cUVyV3lGQ3d6dkxFbVF5YVo3Nk14OGlrMGxUS2xjcEZDdUJZVnpVY1kzYUZxZkY3WVZ5bmFiallnbEJvK214VWE0RkZxNldKYkI5Y2J6K3M0UFQ2UHh0ZkpaZlJ5QzZ0OVJWRytsWnFyNlIvaHdINTBidW1laCt2VmpqdlN1cnZtdGFmTXRsR1Y2bFlYUm5oZ1VHZVozcjQ5dUZwVk1wUHZueGg4bGwweTBncnlrQVpoMWh5dDlqenkrL2NaYkhIenJZR20vY0p4blRkZktzdzJ3TGhuTnFEL3gyVU4yQm1rdndvdVlpd3hKS1duQzNQYnE2bnFSWTgyaTRHa3lOaFZxQXlacXJOcm5ybUZHZTFQWWRScmdCeWw0a1haZ21hclNwMHBWS1ZWNDlkWTVtMDhXVFhyQ0Z6alhHcHphb0M4YVpheGpwQldHZVlZd1hOVExWRHAyMGtaL2pxckxhU1NIMFEzOXZobzg5c3BkUFBMYVB4NC9Oa0w2SFlwaHEzZUZyTDU3bFAzL3pOTjkvOTRadUl2R2JGalJJK08wRkM2L1dwRUY4UXRHdFljRkNMcW1PeE5hMEtVOUd3c2FIZTVrWWlSMWdZN2JaWURMMFE2UGU0TXhiNThuWHk5MGNSM3NhNVNDbjQyUHQ3Z1haLy9nZi8rUHRMTzhqd0Y3aldXeHhmUTI0MWtHNVdzY3Z6TDlmL2RWLys4dTVYUHJqeDQvdlpYeDhNQkIxYTQ0ZDFJZFVpMHQxeU1uK3czc1ptUmpCa3g3THEwVWlWcWNpV3FHbVJ0T2xVSzZ6VWE1emZhWEUwbHFabXM4OVdJalFndDZmalRVbnJrK3YwODBSZnRxZ0JoOHhERGY0MUpzdXl4c1ZlbkxwdTc2SGZubWp3dGtycTVIRFlhTEdkVVRDd0FCMlBRRWJYSHpBelFVVGZIaU5HdkZGNHg1N2NEK2p3LzN0RzlxR3BXN2h1UDAwMDVQcVZFRXpMaUxlVHdCeDR4TDVQbVlhL1p5eFlhUm5lMFRwVWtLNUNRMWoyaEN4R3dtbzAwd2x0aEIzWER3c0paUWJIc1dhcDg2ODE5OHJuczdrMWdtL2FUeDlaTEkxSmxxZFA3REJNeVpqc3k2enJIUTZSU3BsKzY2b0NkUmgwZ3ZIcEJjc1NIU1lERURFQzhaM0tMSHpqSEhyRVZWUHFlZk85TjMxcHNPN2wxZDQvb1d6ZlBrYmIzSGgyanEySlpnYTdjTyt5NHY0ZE1yaXlKNHhQdk94bzN6eXlZUGtNaWt1THhhbzFhTmJ4M2FHc3ZEMnFGcDNHT3JQYjMyTXNSRnRwMnljWnBOaXpTWG4xRHJ0aHpIZzdHYy8rK252MzNKajd3SnROeWQvQXVXelhySzFDMXNKL0FidDk4ZEgya21Nay8vTjMvei9aci8zdmJkZkhoOGZ6cHZiNUFKTzJqOThKZ3kzeUdRemZPeFRIeUdUemJDeFVhSllxaG9jUEQ3bkh0MzY1bm9lNzE1ZVpiVlFBVW5JZ1FmY3VjRzlDNEZsKzV5NnlkbHJUbDBZejBZYXRSV1BGdGU0MDZOOXpFOE5HaWZoM1JscU5GMHUzOXhnZWFNYUFmUUl1QnRjdTU1QXpXMTB3U2x5Y1k0K0Z0NXkybHlNazU4Y0cyYmhpYU5BT1A5SHdDRytJRE5YOUZvbFFnamtTU3lIR2JjWjBIZnluRS9EVUhaNzlPK09CK1dHQXBVa2FVRXJxWmRUSW54eFJ3enpxazFKcGVFR1FBY3hyajE0RG9FeUhtZGF3SnRjT2NRZDQ1aGdHd2RvZnd3YUhMN25xWWhLcmNGM1hub24ySm5oYW01ZHhoemlHSnk1bENHM3I3ZmRSYmJqQmVQVDgzZVhoT08xNmJwbTk4ZStSdmpRd29uNmovbGNtcWNlbk9kSEh0L0hrdy9NM1RPSFdJN3I4U2V2WHVBM24zdWRVMmNYZ3dhMnZrZU1aRUk2ODNrN09IbENKaUc1RGpOTXRvVDE5MmJaTTJWNHdrdmk1R050YlRZYW5IbnpQTmw2aFh5amt0Q2lSRG9MSER0NTh1bU9OOXJmYmRydTBUVk9aeTVzQWVvb0p6aWRVSnhCbUZoZExmNlRvYUgrdk9jcFg5bTJiZm1Ed2tJZEpTdFFoODlZU0ttT3NkeC9lQS9wZEFiSGNTa1VLejRZNk0wYW9VVzlLd1gxUnBOeXJjSHllb1dsOVVvQXpuZ1NZUk5NUnBhUEdIcVZqd2ZDVXJwOUpJRXJYS1N2Ni9mQXM5U2tIYVFIc0VSZzRDZWtLdVA2U29tVlFvMnBFU1YrMm00UnZ1ZEpycStVdUw1Y1ZDZGlhVzZsRGNCclBYeWNvdy9GcHdaSGI4U1pLSzM3TGY0blVZZlh0RmpUYjBIdEppVFpFaG5MWS96UXQ4TEdlQm9KV0JJR2NzckFianVvMm9TcVAwMEl2eEpUMmhBc1hERFMrQ0VORnhxdUpHMUIyaGFrckZ0ZmRFaVVjNXVHSTZrN3BwamRqdy82elJUWHkxamZoeHk5TGpPUTFzVEM0M1diODdwTWlwQ3RhWExaRE5sTWlrcTEwU29aOG1TMGJobVdFYlJGajlVQUxveng3bmU4bGxCMWZGVHNKbFNwTmZuYWkrZjQyb3RueVdWU2ZPVEJlVDd4MkQ1KzZLSDV1K3A1TDJWYi9PZ1RCL2pSSnc3dzJwa2IvTHRuWCtOUHYzK1JMVit4emVMNU5wTnVLeFhLYW9kVGI3N3ova3huTW95TURyS3lMTWsyYTUyZVVuY1ErSG5nQzdmWTFEdE8yOG5KWjRGL0NtMjU5dmoxQXZDdnV5amZCbnFBNDlldnJ4NTgrdW5mL1lJUTVNeURadHB4ODdadGtjdm4rSkZQZjVSMEpzM0tXb0ZTdVdad3o2R0l2MUpyVUs0Mmd4LzVoUnZyU0ttNGZkc28yK1RRVzY1dHdvUVF2bmhWdWIzVjl3R1hiM0x6VmlqZXR3Ull0c1hFVUE5VG8zMjN2YWUrVm5kWUxWWlpYQ3RUYjdnaHArV0Z3SjdJMFJzaWZKUGIwVnhXSXFlZWNHM2grdjNyWXc4ZVpPL3NlTkJPRGNaSndIMHJvOVlFU3ZQYVRzL2VqbnUzQkl6bWxRSGM3Wklub2RSUTF2T0puTHZZYWhHUzNCTVdrTEtWQ2tHTDlPUHZGQzZ5RkZmYzlDUk5Od1IyQ0FFUzJvZEZ1SFlEOEVQQVRkTEpxMFNLR1RjWGh2NGtZWEx5eHBnekpRRm0rRnRuTG5QdHhrcUxIbDNyNXhYbmJ1amF2WGJPY0NUU2Q1empHdms5MThNTnlvMmRocEwwSlhSZkpDU1FzUUQ5bkVuWlBIbi9IRC84K0Q1KzZPRTk5TjJEQTZ3dVhGL24zei8zZlo0NytTNE54NDM4L2tLU2llSGhva3kyaGljdDNtSWQwbExlYlhEeUVzaGxVaHlhRzBFYjd5UzJJMWFIMDJodytxM3pwT3RWZWp0M2Qvc3VpcHZ2ZHQvaVhhSHQ1T1RINk15RnJVNnoybVg1VTZoRGI3Sy85M3ZmK3FUak9Ea2hMR3hiRmE4bUNDdTRLbzdlOVRsOE9IaHNQM1k2UmFQcFVDaFVFSllJdUdZSlZPb2h1R3ZRWFMxVWNWeTFIMTZLY0dMU0hMb0NScENXUDRFSjMycGVFaWxiZWdUbm5ydW8xUXFlc3NEWFhKdnFGSU9iOTRoNFhQTWNqK3NySlc2c2xNaG4wL1QzWmhub3pUTFFtOWx5bjI3VDhhZzNIZGFMTlZhTFZXbzF4NStFWlREUUkyTFREZ0UrbUxqYmNmUVJqc2lmMEdReUZ6ODVOc1MrMmZFV1FHLzMzSTVNQUUrTTBJL0dzOVRmYWhOQTFjbFRGb3h0ay82OTRTcUE5NlNoUW9pMVg3ZExoN2R0V095RlhjQjFKUFVnVVRSTkNOS3hDVG1XVkxZSjEyRXRrNjRKOEJnQWI5NmJaY1dlOWJoRWh0ZGdHazlxZy84M09OREwxZXNyd2ZnSzJtZmNCK21sVWJjUnB0bDhIWVl4ZHR2MVYxZTBCVnZiYUxwODY3V0xmT3UxaTZSVEZvL2ZOOHVQUEw2UGp6KzZsLzZldTNPUzNyN3BJZjZudi80SlB2ZGZmNGovOFB3cC90UFgzcVJRdVF0VytYZUFhZzJIOVZLTm9mN09uUmVsTW1sR3g0WllXcFRrbWpWc3J5T2J1c1BBVDZMT1g5bHh0TjBnTCtoY1hOL3BCczQ4Y0FnWUFHUzVYSk5uejE3L2pPZEpiTnYvVVVvTHkxTFBuaGNDdjJVcHo3cTVYSWE1L2JOSUNjdXJCVndwc2Z3OVdOVmFnMHExNlo4dXA4QmRTbkE5aitYMWF2QkdDckJGTVBsNFVnUVRzd1ovNFFtd0pOS2ZsYjNnQjYxUVgrK20wVUR2ZVFMTDhuV0xBdVZNSjlESjQxdmpHenBhRlUybDNxUlNiN0s0VmxiQVkxdWtVaFlwWDJwaFd4YXU1MUgzRDlIeC9JWUVFeGQ2MGxQQXJVRmVQN2VBZkJ1QU55M3Z3M0REc0NsaWhFY1lIeWg0MWJVbmwrMUtUQjhIWlJNQS9FOFVlVFl6eW5Zb3ZrVWRBUG1VNHVDM1EvOWVhaWp4ZkVRYzczOW5jejBTaEJON1g5MCtqSUFXMGhac1lWa21tWGdWdVNlU0xRTDA4WHR6cTF3TCtCb1pRbU0zSCt5RE1tUTBQaWd2VnE3L0xhUVh0aTNjY3FuT0tRaEU3djVZREVEYkdMTklXdEpJS1pFaVprT2cwd2Z2RXZiUjNSQkJOeDJQNzd4eG1lKzhmcGxmKy9mZjVoT1A3dVBQZit3b2p4K2J1U3Y3OEVjSGUvakZ2L2hoL3RxZmY1VGYrNU4zK09KWFgrZkdTdW5PVjd3RmRkdjNpMnZxMlBCdXVteDhjb1NWNVhXcW1aNXV6cHovKy93QWdMeld4K3R2c0pVVG5LMDRlUUZNQTdOK2VnZVF6enp6MVUvVmFvMVJaWjFxR1NDaXdMa1YrQzBPUDNBWUsyVlRxemNvbG1vSUlhblVIY3ExcGpxRDJoZXJCNU9vbEt5c1YzQTlEK1ZGeno5c3hnZEJTd29GZlA3YldxaTZQU1NXZnpDTkJZYitYWVdaUUIvczgvWTVkbW1GcXlCVm83SVZDSFQyR3ZqeDNlbUtjUEwzcEV2RGNWdjB4cEVIRVFKN3lNbEV3VDNDMFJNRitIRFBmSnpiajRlRmdCN242SkdDL3Q0Yy9YMTUrdnZ5RFBUM01OamZRenFkYWdXVlRaN045K29JdEdVSW5BRjR3Nlo3NHVNMG1GVWU3RzZYWEE4S0RXaTZJZmZlRWREcjl6Qm11WGFUbmZrdVNZbml6R2dyT0llaE12NGRqTERJN2dtZEw3YncwS0RlMGw0OUZvTTAwZklqMzF0Q28rbFFxdFQ4UmFVaDdwZGVJQkd5VTdiYU14K013YkFzSUJpTE9sN1N5dldiWXkxOEozOE1lNUUzMkpLMmF6SFFhTG84LzhKWi91aUZzOHlNOWZQblBucUVUeThjWVRLK1Rld09VRTh1elYvKzhRZjUyUis3bitkZk9NZS9mZlkxemx4YXZ1UDFiaGMxbWk3cnBSckRYYmdpdHRNcHhzYUhXTHk1aG12Wm5YTHpDd3NMSjU0NmVmTHA3OXh5WSs4UTNVdHgvY29tWmZXaXJQUnpLTVpYWTZMMzl0dVhmOVoxdlFCUW9oeThES3JXd04vVG0yZit3THppNGxjS2xLcDFLalhsUjE1YnNhdkpVODJLRXNXWnJoYXFvZWpQWHdoRWRJc2lPakZvc2IwbmxhamQ4M3ZBOHNDejFjTEFRd045NkpkWmkranhRRnIrWWtLQXNDVENSd0RoenhZSzVLVnFzNmt2N2dMbzJuSHlldEp1QVhzWjVlSTFtSWY2ZFlJd0U5d3R5NksvTDBkZlR3anFmYjE1dGMweEJ0am1CTi9CYStCM1YwU3ZIc1RMbU40OVhuQVhzNjRlVFdNOTIrUGdwdUhDUmoxc1U5TENJZ0I2V3NNeDQ5aEVMVUhZVDVIZytMTytsL0g3RUpSRDRJMkJmZ1RFdzFMam9LM0hXdkRPTWx4a0J1WEVwQUZtdnFiamN1bktJbGV1citBNGJtQUlHdHFER01mTCtnYTJKaGR2YnA5RGh0YjYrbVVDamozRzlZZHhvYXBBK3IvTi92NWVaYmpiTXJnTU1qNU9KcE5tb0w4bmVNZTExUUp1bHdzR1RkZVdpL3pMMzN1WkwveitLM3o0L2xrKzg5R2pmUFNSdlhkOEQ3NXRXL3pFVTRmNGlhY084Y0tiVjNqbUs2L3gzVk5YN21pZHQwUG1iMk5wdGN4UWIyNHI0NVlJalUyTXNMSzBRUzJkNjBZMy8vZUJ2OUJWUSs4Q2JTZkk5OUdkdUg0OW9Rd0JUS0NrQWdJRjhEcGNmUDd6djc5UXFWUVBhbU03NllPSkJudGRoUmJsZTU3aTRvVnRVU2pYT1h0MVZlVVIvcm53K0NKM24wWFNWdmFMNnhYbHZqYmlheDZrRUQ0SWFtNVFpZVlsMm9KZVdWMTdDQ3hQS3RBbmZIc0xEZlF5T1BOR2FIV0FuMDdyNGJWT1h2ZVlNTVQxd2dpRGtQdHJTeWFvSm9FOElYaXJCVXNiWUUrNDF4TnRPcDFpY215SXZ0NGNmYjE1OHRwb0tBSFFpVDhuZ0pGczg3emwreEhMdTBsNEhHVGp6MmtMeG52VkZyWGJwVW9UaW5XQzd4UUg5YmcrUHNLNXg5TEgzeWYrb29sOWxkQ0hNcUhmelhzWlM5ZkM2Um9kcVVYd3hPTmwrRmJ4Ynhxa005UDZpUnpYNDhyMUZTNWZYYWJwT01aeHNvWmtpUGhDTTJ5anljVUhhVENBWG9NNzBXMTZHUGtCVXVrVVk0TzlEQTcwTVRqWXo5QmdINm1VeGZtTE4vaitHMmVUZXJxRm1rMkhQZk9UVEl3UEk2VmtvMURtdGUrL1M3V21MQ1p1aGVQM3BPUzdwNjd3M1RldU1OaVg1Y2VmT3NSUGZ1eVk3N3Y5enRLSDc1L2p3L2ZQY2ViU0N2LzIyZGY0bysrZHhYVjNwTTBaQUEzSFpjMC93RWJUWnYwdEFTdWRZblJza0tWRmozeWoycW1sL1U4dExKdzRkUExrMCsvZFpwTzNsYmJUR2M0Q3lqak9oQnV4eWZXL0VPMXJHNWdCQmdrdDhQV2ZCOGpmK0kzbi9tR3o2Y3lEdnpMM3hlVGh0Q2dqNGRsc2lzYys5amd1Z3ZPWEY2bFVHcjVqbXRDQkRUNDNMM3dsdU9OS3JpMFZBQ01OQlBrczNYb3RRL2N2Z2FNYm9aY09ZVDZUMHc3SzAvRTYwU2FqTGpJQlJ3QTduTmlDdUtRL00wNER1dXF0cUhqZU0wRWNRL3krT2NCTDRLSDc5akk5b2M2UlQydTNiMG5nc3dtQXh3RS9zUjhNYXJldUNVZkQxaUw1UUJVU2U4Nm5ZS3J2OWczc3BJUkNYVG00TWN1UHQ3K2JjTjBQUW03U1hWS0NFTUhZaUViSmxxUkJ1YkV5VzRBOWFJTU04c1NCV2hxRlJQSklNNDFScmxHaEt5VlhiNnp3OXBuTHJLeVY4QUtwblRFR2crMXN4RUE3K2hkM2doT0N2UnJyWHRDbUVQVDcrdkpNakEremI4OFU5eDNady9HamU1bWRHV2RrcUorZW5weHY1eFBhQUt5c0Z0cDlnUWd0THE0eE9qcm9iL2ZMTUQwOVJyRllvVnE5L1hQaGF3MkhOODh0OHVVL2ZvdnZ2SEVaS1dGK2NvRE1kcmxmYkVPamd6MzhtU2NPOEptUEtiOFdweTh0MzdLRTRrNVRyZTR5TXRqVGxXNCtsODJ3dkx5T2tKSzB1OWtaYWdFSklQUFp6Mzc2SzdmV3lqdEQyN21GN3BlQlkyeStkVTdmTjRGZk1mSm1nRW4vR2lKa2VDLys5Yi8rTDBlZmYvN2wzek9kMjloMmRKdWNEbGMrNjEwT1BYaVlqL3pJa3pRZGgxTnZYd3pjeWdiYjB2UVdOaUd3TEJEQzRzWnlrZlZTTFlpejdlajJOMVcrNFo0MnlkRk5jTTY4M3Y0bUluVzFicGN6SGZBWVYveTkrWnE3TnhjbHVvT0NSY1BtcENjN2dURWgweXF1bHpMY0M5d0M3RjR5NE8rZG0rREEvRVFyQjcwSm9DZUYzY3B6SW9nYkhSSi8xaXVBSkNEVllZTTVHTWwzSmQxTEpFL0NXaFg4ZzlwYUZoSm0ySmJoOFhjSUtBYllmcklXSUk4a2JXT3RIdlJ0ek9nTUFpVFczejJJMDZBWnhCdEFxZ0hVS0Rzd2dDTTJ2anpKOWNVMUxsMVpvbFp2aG1KNDZZdmhmVDI4M2c1bml1empZWUZMVzNPYm5KVEIyZkpTU3VYOHhoKy9jOVBqVFA3LzVMMTVtR1hIVlNmNGkvdmV5MzFmS3lzcksydVhTcldvU2x0WktjdVM1VjBHM0N5MndSamFmSUlaWmdaTll4clA5N2t4RFFQMDEyd05ORzZtdXdjRWJkb1lNQ0I3YkxlNE9QQjFBQUFnQUVsRVFWUVhESlpsMmZJaWE5L2xLbFdWYXN2S3pNcjlaYjd0M3BnL1lqc1JOKzU3OXkxWkVuVFVsL1h1alRoeEltN2N1UEU3NTBURWlmRWg5UGQySVpQTmlubitDSnEvbUNLSXJPOUcxZnV4cDc2SDgrZm5QVzhDK3J0U29TMlh3NG1iRDZLenMwTUtHaEcrZCtvOHpweTk1QlZ3dWYyZlg2QlRRcFZkTERyYXNualR6UUtBangzWTVzdlo4bkI1Y1IzLytlOGV3ZWNlZWxHUEliS0tWdVc1ZStYMlE1V2FnRTF4Zm40R1Zqa2MyRGJTaTJHcHpacytIeXZWWW5QKzlFV3NMSzVpWUdOSkh5MWVJMndDMlBud3d4OTl6U3hjYUtVbWZ4Y0FlczVmdGQ4Q2dLL0krMDRJODN3R0NSbzhBUDVIZi9UcER4VUtwWVBxeFN2dDJHaXgwblRPSXl3dHJXRjVlUjF2LytHM29LT3pIUmN1WGNIR1JrRnIyRnFicDlvMkdNcVZFT2ZtMTNRbEZhaFNHcFhYUlFybWVVb1hmaGtad0prMWpCTWc4dlFqM2Jlc1FkaWduYVhOcXo5dS9wVHAwbHBUQUFYU0psNXBQckU5eWtnRytON3VUbHkzZjRkK3VHb0FIM3ZlV29EdW9YY0RCVVpGd2dDdjl6dDY3OVBlR1FQR3VvR0IrcWJ2dktFY0Fnc2J3b3VkRDd6VEFybzNEZVM1NEVRbTNYTDczYmlYZEdnemZZbUFQWGZwN1g2cGFHeDZlemozcnJibkhKY1hWdkQ4Uytjd2QyVUY1VXJvYU43MldvK1lWcS82ZUFTZFJ2UERwOFZybnNJdDdva2JEMm90blg0ajZqa2lxL0hzTURZMmhPWGxkV3hzRlB3RUpJUlJoUG1GWlV5TUR5T1R5WUF4WUdpb0h6M2RYYmh5WlVYdmdra0s5ZlRKU2hqaGUrZXU0SE5mZndsZit0WXBGRXNWVEk3MW9hdGo2NXp0OUhTMjRjNGJkK091bS9kZzlzbzZYcGxkMmJLeUdnbWJ4UXFHK2p2ck9nQ3NyUzJMeFN1ckNIaUViSlRLcVYwT3dNWTk5OXo5WUtQMWJIVm9KY2kvRFdLYm0yOWNjbi96QUI2RW1NZFh2Z2Rqd0s3dTc3Ly9vYkZISG5ueHR6aEhZTHl2eVV4RWd5Z1VpcGlmWDBHaFVNTFJtdy9oMEkzWG9WSUpjZnJzWlkzTFNoTldZRSt2TDEzSm8xQ3NDQUMydEdiaWM5NGtXZkU2bVJFQXB4cTRFelNvbXp0elNVWnZkMkNPRGJwcXNJUU43TFFCcmNFTkJ2UXRVTmY1YlJNbnVFZWpsL2VNTVJ3N3RGdXNqbmZxNmdQcnRJQk9NM2pCM3VGQlFSeElBSEgzMTlIbU13eVk2QUc2VytCL1pLTU1MRzdhZFU4RWVrOWRrdWdUZzJ5RUdPQXo4VTUxZDNMN2xDS2w4VHo1L1ZCZzEzaE4rNDZQWHFVcE90alhqejE5Q3JOelN3TGNJeHZBbGV0a3ZXak9NZE9yK2ZsSVJwaDhwajUwOVR6dHU1eHpST0RZTTcwTkk4UDk1cG01WEVkREJZZ3EyTXNZdzdheEljd3RMS05ZckczU3JaUkRMQzZ0WVdMYmlENXJvNmU3RTZPakE3aXl1Q3FPdlc1eFdNMFg4Y2h6Ri9CWFgzNEdwODR2WW1La0Y2T0RXN2N5ZjZpdkUrK1kyWSticnB2RTZZdExtRnRLdlhCdFMwUEV4VzZyMUlJT0I3TFpMRGJ5Rzlpc2lIM3pLY1BoKys3N3duKzY1NTY3WHhPdWJsc0o4bmREZ0RhUVBMNnE2eFdJdzJrNmtRRHM5UDYzZi91di85Zk56ZUtNQXZRbzRoSlVCZFNHWVlUbDVUelcxamJBdVRDbHYvTTliME5QWHpjdXppNWlmVjI4SEhPSWpOS3hqVFpmcVhDY24xdVZkQXFjWGZDT2EreTZIc3FFcmtFK1lZUjJCMk5aTDY4bHlJbUxhZlNPeHVIL2swQWVPWnFQTlRqSHRSenZmRHhzemVyYXZaUHl2SFkvd01NVGx3anNMazJWZXplNDJueWFRSUUrR3dDVGZVQkhrOHRRT1lEVmdwaURWNFhFSk40cVFHL2QxMGpqUU5VNStWcmR5UXY2cWc5UU92b2V1UDNyQWp6bmhJZnpTMHVtd0gveXpLeWNDbko4TUJCaE02YkowNTBkZW91bjVPM1FXVnE5NGdlSS9mWmdPSDUwSDRJZ1kvcTNyck1jYTdockRJK0hJQWl3Ylh3UUZ5OHRvbEtwdmQycVVDeGpiVDJQYmVORFVHODExNWJGeExZUjVEYzJVMWtGR2drUjV6aDlZUW4vMzRNdjRMRVhMbUt3cnhOVFkvMWJ0dTkrKzBndmZ2RE82N0J2eHhCZVBMdUFsZlhtMXg4MEd3cWxDb1lIdXVySXdaRE5CVmhhV2tjbWl0SnVwK3NDOFB3OTk5ejlkR08xYkcxbzViNExkVXBjdGQ4QXdpemZMbjhyOGk4azE5Yjl3c0lLWDF4Y2UyK2xFaUlNSTRSaEpBNk5xRVNvVkVLc3JXMWlibTRKR3hzRnZSQnM5LzZkR04wK2hqQ01jSGxoMmRaeW9SYm5HV21lQTVoZnlZdDVOOStnb2djS2FNM0NOaHNTajNCMEhwSEQybW9Xa1lGSDU0bm9GaUFURnpzSzAvT241aXpGTVpxZVArZklUT3BDdHVyUnIyNGVwNzVSeERFNjFJK0pNYkdTTnduZ0U4R1pwNkNwRXR3OGFnZERJMEpDTGdQczZHdCtCWDNFaFhsK3JWUzdQY2lQQVZVWGNOMDBBc0FVVENteGxhNmlMYkRsV3FDenl1TTJIVTJ6QWQ0c3RPUk91c3JoalZmOHlaK3Bud1BhbkdqY0ViZnZWVjhFeURjSyszdWl3Z0Z0SzA0RlhRNFdNQnk2ZGhydGJUbFNTZnQ1ZWZ3QkUwTjdleHRPM0hSUVc3VnFoWVdGRlR6My9Ca3JMcHZONE9pUmZSZ2E3UFBtcWVjYnFSVWVlL0VTUHZqN1g4VDdmdmx2OFQrKy9oSXFXN2c2L3MyMzdNWDl2L1dqK1BBSGJzZHdmMmZ0REZzWUttR0U1Zlg2aEtpZTNoNTBkTFNoMEZhWG80eWZycXVRTFF5dG5wUHZSM1Z6dlFMNU1vUzV2cW9HRHlENitaLy9vemN2TDYvL0pFREJGUWhENFo1V3JVNDFDOVlZN243M1c5RS9Nb0RaeTR0WVdjMERNT2ZFYTBPN1Zzc1pFQUd2eks3SWowaWUrMjVzKzlya3J2Vnp0VHFmUEtXNVZ1WjdaOGJVS3kyenFzbDBNSFExSkRWd0tUcjNPb29NamRISUNZMmp0VkE2UFVqcWUzdXdiY3ZsY096UWJtU0NvQ3BBMVFKOTdtYXFRcE1Hc0wyTnlFdyt1aVlDRUh2ZkovdWFYMEZmRG9INXZGaGdsNlNKMTlMb1hYbzN6YjNuc0daMVVzWDczaE1GWnBNZUJ6eW9QaUxwcURCaDlTSEZoM05qOW9iOXAvTnc0TXk1ZWRzOGJ5MmljNFFBblk4STRPQVdlTHRnemtFMWVmRTdPanlBVzI2OEJzTkQvZFkzWlNzQ29wNTBBVm10ME5hV3c5aklBUEw1VFd5a1dEVy90cFlIWThEZ2dBM3FtNXNGTEM5ZkhlOXlTMnViZVBDeE0vak1ReStDYzQ1OVU4TTEzV1EzRW9LQTRkQ2VNZnpJbXc0aGw4M2d1ZFB6S0tld2VteEZLSlZERFBYNWhRMy8yeGFMcVpkWE41RU5LOGlrMjA2MzY3Nzd2dkNKZSs2NXUxNzM3UzBQcmRUa1M0aHI3ZlJQSFJQTElCWW5WTlhnMWYyRkMxZmVMelQ0VUd2dytYd0JpNHZyS0pVcTBOcUYvQnViR01IVXZpbTlXdGQ4L0E2UVJVcFM1MWhZMlVBNURBMWR4QjN0Z1dyazRpK2tlOGxKR3RXWWFkbFJaQTlrNnMvTjQ5V215ZXJndUJadnJ5b09JN29xbVdyNkhwNUptanV4UnNUcUd3R0hEa3dobDgwMEQvRE9kUm9od0ExV0h2Zlg1VUY0OWJRQms3MWlMcjZac0ZrR1p2UGlnQm52TXlNaG5sZW5kNnFyN3kyZ1ZMOE92UVpwQXJBVWJEVXZRcE1ZUndFUXRmK2dRTkxpYVNwb0NhUWd3T3dBUEFWemFwbzNhMFZrdkhhZDdMTzhVY3Naa0d2TDRZYnJEK0RtRzY5RlIwYzdhWDl1WGROeG90N1EyOXVGRXpkZmgxdHZPWVRoNGY2YTlLZGV2b0FMRitldHVPN3VxNi90emkvbDhZZC8vUzE4M3djL2p2LzBOOS9HL1BMV3pLTjNkZVR3c3o5MEV6NzNleitPOTd6NWNNdFAxa3dUaXFVSzF1djB4OTgzMklkY05vdENXMTN2NW1mcUttU0xRaXRidUl6YTVuckk2emFrTU5WLytNTi9NbFlzbHQ4U2hzSlVYeTVYc0w2K2lVSkJ2Q0IxV2hRZEZFN2NlUXNZWTVpYlgwYTVWTEcxRURrQXlSZzlJTXd0cm12dDF6TEJPd01IZFJKREJRQVg2RlhlMEFlZU1RQk9BRmtGM0tIWTloT0djZkN1Q2RvVThGMmhvSnE1bnZ2Ti9KeHpURTJPWUhDZ0p4azRTRHhJdkJzSEo2N2FjRnBWQ0tpVnpxVTVuOXdQZEFEYmU5SDBYT1J5QVpqYmNFQzJIcUFuOGI0MmROTm9vSUJNK1NXQ05NM3I4UGJ4Y1lVRVR2T1JRcWdRSUxKeEVpY0lqSkNnSWRWY08vM0xCWGhWbEhVK2dwNGFnL1c5QVhISE5wR3N5ODRkbzdqenR1c3hNVDZrVjlMRityRDFqbXJQeFZjTGc0TzlPSEhUUVFIMlE5WEIvcFh6OW9uYlBUMzF6Qm0zTnF4dmx2Q3gvL0VFM3ZXTG44Q3YzL2NnVGw5TWU4UklmV0dvcnhQLzVnTnZ3S2QrKzhmd2xoTjd0NlNNYW1GaEpmVjU4UURFZHV2aDBYNlVNem1FUVdwTHg3K2NtYm4zNnAwZG5CQmE2Zkd1aU5xKzY1bjhiWVBqemM2NVpnRHc2S012dlM4TXd3eGpER0VZeGxhZW1zRkpEQTZkbmUzWWYyUWZPSUNMczFmSVFDS1dYbk1BakN1WHNxTElwZlVDQ3FXS2RqVWJSZUtZMTRoRG52OHVUb3NUbFdPSUluRmdmQUNPU1BxaTE2ZkhxWGxoZVRhOGFBUW0zZUtLQVVoUEd3UUFJL2ZVQXg3MVpFYzkzVUhkeTVheVBPSUJpTmwzdWVlU0RNYTZEYlVtUTgyY2FnQVZ2NFA5UFpqY05vVHgwUUhDdzgrL0ZzQ25CbjNQZlN3NHoramJOMC9iWmJSYjdJRnZKbkFPekc4SUxSNkExeTJ0N3l4NGVPS2g2dWpoNDZaWkZSQ3BodFp0QnhyRmJSb3FBTVJZa21zTHZOMStRLzVBYURncHl3Vk0vYjJTL3FYMnNkdWc3cnVtYy9hcWp6cUNkYVFFRDVQVzA5Mkp3OWROWTZDLzE4emhVMEZFOTMzYS82dXZxRThWWlA3QmdWN2NjdE5CTEM2dDR1U3A4N2h5SmU0OFovdkVpSFhmMWRrT0ZyQzZmT1czdDdkaFltSVVtVXlBa3lmUE5WVjFRQnlRODVtSFhzQm5IM29Ccno4MmpaOTR4L1U0ZnMxRTAzemRNRFhlajkvNVA5K0daMDdONFQvOHhUZncySXVYV3NLM1ZzdmxOMHNvRkN2b3FHTXh6c0JRUHk3UExxS1k2MEJYT2xlM1l3RGVCZUJ2VXhleUJhR1ZJRjlHZXQvMWdERFowNGtyQytnZmVPQ0pUS0ZRK2dBZ3BmaklQdzhpdEhseEdNM1JXNDZncmFNZHk4dDVGSW9sNmJxV3lPUU93QU1jczFmV2hhTU5jQ0NRQjh1b0QxM3VRUXIwc2JCY0hrYkRSUnE0ZGtXcmdaM0xPVUVDMm1ZbHZuQ2R5MlJMTUFBc0lKS1JBbkd6SEVBQ1BQRmpUd0FmNExIdGVkUi9nRHVIYTlyTUhuN05RSzRHUC9HYnpXUXdNVDZJSGR1RzBhV091a3dDK0NyeDljWWxDZ0ZJcHZIZTA3b3hZS0pYSERUVFRLaEV3T1c4bUljSGtzSGJCL1FnOFRxdnFaN200NmFwZkRSQjVDSHZEaHp5U0NOeFQ5OEhWeFNHcWQwZmJGckR3d0M2b3FNMG5OSjQzaWtWRUl3QVlOWUFjQ0MyYmE0YXdNY1c0R2thV1BUS0VRNWpETGZlZkJEWlhNWUk0SzZaQXlSZVAyc0NSTlFKL0pSOGNLQVhodzd1eHRlKzhhU1ZFQVFCSnJZTlcva1lZK2p1NnNUYWVnMXRrd3NQZlpPVFl4Z2VHWUJ5ekYwb2xIRGVzUTQwR2pnSHZ2YjRXWHp0OGJNNHNuY2NQL25PNjNISERidjAyTnFxY0hqdkdQNzBsMzhRZi9lVlovRjdmL2xONURlMy9uamJoWlVON0JqdDlTZDYzblVtbDBWZmZ6ZFdseUowRmpmSTExWTEvQXhlWlpCdnBibCtBK2xXMTZzLzF3MlQrdTRqQU9Fdi9kSjlkNFpoTkYycGhJa0FENWlQRytDNC9zUmhBQ0J6OFlLdEdXQ00xeW9PanZYTkV0WTJTckZCeFRJZmFoT2hNNGc0QTQrMVNqNnlWOWJiODl6VUxHNGZ0dUdiQTNmTjZXRVVtVGwyRDIyMU9ma3draXZ1dVorMyt1M3I2Y0oxQjZadys0bURPTEJudXdCNCtYYlVTNkl2YkNzQTN1MFlpUUR1NlVTYVZ2NEdESmpxYXg3Z0N4WGd3cG80YUNaV2h5clA1WXQzNjIrMVpVSSswM2Rsbk1OSGFLVlVTL1VBdFVOdjBVa04yQXZRSGg0V3dNdS9pRnpyTk5oMTF0K3N6aE1IZUhkdFMzd0t6VjVkVCtNQlVZL3QyNGFReldXc3d0MTJ0TnRLWE5SU29IbU45S1J3NnZURldLY2RHeDIwVitUTDlKNmVkT2FtbzBmM1kzUjAwQkwycDZjbk1EVGtYNkhmVEhqNjFHVjg2QS8vSHUvNThGL2pnVWRQdDV3L1k4Q1B2T2tRUHZYYlA0bzNITi9scFdtdzZiMWhOVitvZS9IZjRGQWZPR01vWlZNNzFIakx6TXk5dStxdFd5dERLMEYrRnVtMjBhbmY3VFg0L1M5cEY3NXd6akV4Tlk3eEhkdFFLbFd3dEx5bVRYYm1JNmFtYUJFNXU3RHU3S1dGcFNuUWhUc3g0S2RnN3RFMkZKaXFiVURhdlNhOWQ0UURlcHFXdTlBdVBwY2ZhZEN2dG5BdmRFQ2R1dm1rYVVIQU1MbHRHSys3NFFCdXZuNGZKc1lHaFovdUtxQ2pMcEtBdnlHQWQ2NTkrVnhpTHg5NW53MkE2WUhtbmR5c2w0Qkw2K0tvV0s4UTRxbG5OVUN2QmVhMTJqMFJQQ2tmK2Yyb2JhS0dobndicEg0VTZEanN1cmlnRGZkZWl3ZjI5d2FTbjM3T2luZVlBUEJtZnA1YkFHLzgxbk9QRmNEZStycHp4eGg1RnU3MEUzdnRnUFpsMzFJWU1XRnpzNGlMbCtLZVRpY25SMk54SEVCM1YrM3RXdGxjRnBtTTM5eDhZUDgwdWxMd2FDU2N1YlNNRC8zSEwrR25mdTFUZU9LbDJaYnpIeC9xd1VkLzhXNzg1di94Rmd6MGJzMHpBS0svWEZuWnJDdFBkMjgzMm5JNUZIT3A2OFh3S20rbmF5WEluNGZSMHBOVzJGT2dUd1Q1bVpsN3h3RDhRTnFDT1FkdWVjUE5BR080UExja0JnY1lqVUdib1lrR1hpaFhzTFMyRVZ0Y0YzRXk1MGY4VjlOVjlsUW8wRUJNQmliZkFqbTlPQy9Gd3JmWXZubk85ZUs3S09LSVFwdUg4QjNnbEVrRUFRMzJidDZRbzZ1akhRZjM3Y0R0SjY3RE5Yc24wZDNkVVRjSTBUUjEwUWpvKy9KNmtoTUIzYW9qRjN2ZmR3MDA3K1JtdVNCTTlCUVEwenc3cGZYV2tXUjBuN1VhMkNmVncyMFRmL2s4RHRvdWZ4cFBRWktUNzRyUUtPdUJBWE1lcDZGOFFXamRQaC9SeGJTMnBtNjVWdGJmblB1ZGk3U2VuaTRNRFBTQ3cvRjBKeCthdmkvNjRPbDJSOFhmVmExdzZ2VEYyQng3VjJkSDRwNzROSnA4WjRjcnVScittVXlBYTYvZGpld1diSWRUNGFtVGwzSFBiM3dhdi9BSFg4VExGMXEvUU8vdTJ3N2dNNy83NDNqSHpQNlc4MVpoZWEyZ0YyMVdlNDg2alRFTUR2ZWhrc25Xc3dEdnAyWm03dDNhMDRLcWhGYUMvQVhFd2IyYXVYNnlDcStmZ0ppelR4WGEyM080NXZwcndEbTNUUFYwc1k2VzNEbkFlWVM1eFR6Q3lOQW9EWnF1b3RjT2JWeWdEejJEVUtRT3lsRDNKcDRLQXBZMjdRTjZCL1JEeXNQSlI3WDRNSW9RaFVUekR4MHJnR3NOa05kSER1N0M5bTFEbHRhZUZ0eTlvTzBENlJRQW54cjBVd29CblRsZzkwRHpUbTRXTnNSZjZtZElpS2YwMVlTQW1tRHZBV1NyVFNpTnk1ZStId2Q4dmJ4VnVndmFzUDlzNXhia0NUZzEvMU1od1o0bWNJVnMxN0ltNXRqRmRlZ0NQQkdnelM0WFlIcHF6QkprVFB0eGMvcWNySzk1THJ2MTY5THFxNUFXQ2lWY2RMYkpBY0RrOXJnV3IwSlBkKzBUMHpvNlBmTlBwQjRkSFcwNGNHRFhsbm0wVStIQng4N2d2Yi8wU2Z6YWZWOXR1UXZiZ2Q0Ty9OYlB2UlVmL2RBN01UYlVlbGU4WVJSaE5WK2ZKNzcrd1Y0d2hucTArZTBBM2xGdjNWb1ZXbTJ1cnlDOXViNGF5UDlvUFFVZk8zRVVIVjJkV0Z4ZVI2RllNb01HMUpZYXJqOWlEZ0hBODB0NW9ybXJBWU9ZK3lJN1RablBZOXZtRXNEVGF5SW4yb3B0OXZkY2h6VjR1L21sUUtEbTdFTlZMay93cU1mRml2bnV6dmg4ZTczZ1hpL2dOUVA2YVlTQTNuYWh3VGV6QlpkellIWmRhUEYxMTV2RWV3SGRFNThhN0FrREM4eEJBSnpRVytBUHp4ODNvS3RBRUJTUVk3UXc2YVF3VHY3MFlURU8veGlvVmdGNEl5eEhudS9TTnZIYkFyZHd2TEpqWWhqSyt1QzJoNmxyNUZncTRBK2VmbGhQZVBuMFJhMHRxc0FZdy9idEl3azVoT0t5Zi85VVZiNGRIY21MVEZScC9mMDkyTFdyMmxEYlFQQzBSeFJ4ZlByQkYvQ3VELzBsL3ZDdnY0VzFqZGE2c0wzaitDNTgrbmZlaDNlLzZWRExoWmFsMWZwTTlybjJISHA2dWxISzFyWEk1NzExRmRMQzBFcVE1d0F1SWYyOC9EWjRWdmZQek55N0I4Qk45UlI4L0xaakFJRFp5NHZRYy9HSUR6UnFFRmlXMithb2lkME1JczZBUWdZVmU0RWNYUXdFNzl5K0FXQjdyakRKVEc5cDdtUUFDd25nNi8zeTFNenBBZnlxQW9pTUZ3TmhEVkFoaVluZ25nQityUVI0Q3BCSk5BQXcyQWxNOVl2RmRvMkdrSXNGZHBhTFdsSndVbDFkZ0UxcXR5UXdUd0o3cXc3Y3BxTWdyclBTL09UOStONlhCWHp1TlRkOFRWbm1td0w4dk9Ed01YU2NDQVJTQ0NmOU9MYndMb3JQMGNjWDZka0NBdWNjMjdjTkk1UE5hbGZIbkpUcE5yaHVxOVFvWGgvY0Y0cGxuTHN3WjhWbE13R21kNDRUbDdyKzhuZE1qbUhuenVSall1UG1lbC9nR044MmpPSGhnVlQxYlVhWUFZU2ptZi8ydWNmeC9iL3dGL2p6enorQlVybDFYdTE2T3R2d2IrKzVFL2Y5MHIvQXptMjFIUTJsRFJ1Rk1vcDBlN2J2bzNldWgwYjZFTlczQU85ZE16UDNidDBDZ3lxaDFlNkc2THg4MG55OCtzc2h2c0llQU41VFQ0SGJwOFl4TWIwZHhWSVppMHZyUkp1SXpMVXpNRnhlWEhjR0RXZUJqdytVNlNLN1NQQ25BR3RyNjhvOFQxWUpjMjZEc3NjRUgzSmJnNmNyNVYwd3Q0RGVwL1Y3NkdnNTJXd1dZeU1EWHBDcEJUU2NYQ1FDUDZIemdSS2FpSE1CWDkyT2RVa25ONG05cFhhb1JNRDVGWEdTbkF2UzFaNDdEYURUK0tROHNYUnV4OFhhbDh2dG4zREEzZVh2Z3JzR1doTVpFd2hVbVE0d0d5SEFXTWtpbUFRN2p5MFFSTnpsUzRDZGZEOWV4MDhlZ0xjOFQ4cjZDVk85STR6QXFSdTRkVzNhUGgzTThkaUZQN3g4NWlLaUtFSnZieGQyNzlxT20yKzZGbmZkZVNNTzdOK1pxcHk5ZXlZeFBqN3NUZXZvYUU5ZDM5MTdKdEhlMW9JakZsT0cxWHdSZi9DWDM4UzdQdlFKZk9ackw2QVNSbVJNYlk3M3pkZE40djdmK2xGODRQdU82NVA4R2dxa0hrdXI5ZnF6NzBZdW02M0haTjhMNE8xMUZkS2lzQlVnWDJ2N0hJMzMyWkhxTW12YytQb2J3T1NDTzlYaE9Sa003R3ZodDNoeFpaTkkvdER6ZkZ3Q29MWG9qbWdLZEE1Y0R6YVJLY01XQ2h6Tk9TU2Fmald3NXdyY0l6cy85OGVaT1huSk15Ui96aFFCQmYycDdjUGFZMG9NVkp5QlhnVUxaSktBemhlUGhQaEdBZDY1NWdER3U0V2ptMlpDcVFLOHNnd1VRN3RzdHl4MWtScm9DWDBNN0ZPMk4yMXpPa2lxUy9mUUIzQTFYV1h6TWtET1kyVlRBUUJFK0hYVEtIOEw4QzBRVmVWNk5IL0NNTDY2M3RiS0krdTdqTk1aZ0JkQ2VFOVBGd2I2SFkrTTVCblVzNnQ5ODYweDB5ZEQ3ZUJBRCs1Nnd3MjQ3WFZIY0dEL0ZBWUgrMUtkWjA3NUhieDJHb09lQlhxZGRFNitSbDB6bVF6MjdadHEzczFqcmVBMDV1eVZkZnpLSHorQUgvdkkzK0NoeDgvcXRVVHVZdUY2Z2IrOUxZdC8vZU16K01Tdi93ajJUL21Gb0hyQzhub0JQRzBsT0FER01ERFVpM0ltaDRpbGh0Rlh4V1RmYXBBL2gvcTIwZTJnbVdkbTdqMEE0Rmphd29JZ3dQNURlOEU1eCt5OHZicVRTdlptc1EzSDVTdDVqNWtkQk56TlhMYlEySG1NWG12dUJHQnRZQWZNU1hBMnVOTjczeXI2K0FLN0tPYjYxdDV5bDd6TnptaEJOZzBIeDVTY0Q5U2FuR2V3QjV5NEJIQ3ZDbkFPOEZ1OFBMUzE0dURFY1FEYnVvR1JKajJCYnBTQnN5dkNCMzB0OEs3MURMNzRwRFJmdmtTd2h3dFcwTzlFMTFGZTA1MStXbU9uZ0V2ZnQrSUJBdFJPbWhFT1NGNVNBUTRxYUhERFV3TXhBWHJDbXdxOXJ0dG8yODIwQitCZEUzL0VzVXN0dU9QU3drR0ZFVzc2ZTFKLzlnZE8vcThkS04yMjhXRzB0L3ZXRUhPcmIxVVBESWNQN2JGVzNBY0JRMXRiMHRwa1A5UGUzbTVNYmg5TFUyREx3OGx6aS9qNTMvc0NmdmJmZnhiUG5KcERKZUtvaEpHMlFqWUsvSWYyak9Gdi92MTc4WFB2UHBIZ0J6L2RXd3ZEQ0dzSkMvRDhIRGo2QnNReDIzVm84OTgvTTNQdlZUK1lvTlVnL3dwcW0rdnA3dzRuZjEybStwMjd0Nk4vWkFoTHkyc29Gc3V4ZEFIYXlnR09HQmhtRjlmMWZEdGRyY3U1MFFxc3M2MEowRWVVUGpZZ2ViUnNqNW5jQWx0bmtMUE02MUk3aWZPeWo1Qk45R2Z2bEtzVzVVV2NZMnlvSCszdE9YdkFkdHNPWmlDc0NlNE9EeXZOaVZjWHRjQThiZHhFRHpEY0pNQ3Zsb0J6cTJJdXZpcDRJN2srU2M4WW82K1M1bXRQcTAyZENFdGpka0RVNGtQZUlSeCtGdkR5ZUR5dHQ0K0dncm5SL2duWTY3eFVRT0VhY0svZE40V0RCM2JnNFA0cFhMTi9DdGZ1MzRHTzlyWTZBVjcwOC9IUlFVeHVIN1d0QzdUT01ZQlBDOXVlVUROdkt1bkJ5WkdjSVpQSjRPamhmZWhvRnliM2p2YmFpNzU4M0NaM2pLSGI2eHUvaWJhb295S1B2bkFSUC9Ycm44SnYvL25Yc2JaUjFPQWVScnc2OEpQcEdqZGtNd0YrOW9kdXhuLzdsUi9FMktEZm5KZm02WmJXNmpQWmQzUzJvNzA5aDJJdTlRSzhiZ0R2ckt1UUZvU3RNTmNydnRXMno2ay9GK1RyTW1jY3ZlVUlBR0IyenI5SDB3eENvbk1zclJaUUtGWWNjSGZBTVFiMHhudWRBblFLMXFHVHp6NFFCbkh3MWZrOUdyZ0Q2R0hJYlNHQVUyR0FBTDI3WFU0SkpNbzdubFBHOU5TWUh1alVkaUo1V3hXOGtUSmRYY1RBaitTQkU5OUkzTGFlNXYzUUwyNENGMVpzTDJlTkFEMk41elhvMDdTdkFVNkhWNnhkNDBBS2l3ZTN5dVRjMGZMaG1PVWxvZjN0Y09GUWh3Szg1QkdiSm9BcGlBT1did3BUanZ6SGdWMVRZNWplTVk1ZE84ZXdlK2M0ZHUvY2hsdHVPSUJzTnJDL0JlZVhBdno0NkNEdXZPMG9UdHgwTFRKU20zTUIzbWowUnNCSUd2alRZbjlhV09TZXEwWkNXMXNPUjQ3c1F6YWJSVWRuVzNxVzZwMUNyT3JmdDNjS3dhdHcrcHV1RGdmKzdvSG44TDVmL2x0ODQ4bFhVTkZqV0dSMkI0WGlUd08vRmdhU2dmL1lnUW44elcrK0Z6ZGVXOHZQbWova04wdjJRc0ZZMjhZYnU3Ky9CeEVMVU1tazN2RjkxVTMyclg3VFpZaXRkUFdZNnpNQU1ETno3MEVBaDlNV2xNa0UySDk0SHlwaGlLWGxQTlRBNUFZSzJMT0w2N0p6S00wQTFyR3kyanl1dFhnRjFCNTNzKzRmMVNvYzBLWEFUMWZzV3l2cENhQzd2OTZqWXAwLzlYRlV5QWZpcTJkWFp6dEdodm9jTGM3TXp5b2dhQVRjZlVCZUMvQWFCZmlKM3VZQi9uSmViSk5UaGFTdEIvbXg0NVBvRzJoUGw4WUNjRUt2d1ZoZmM2Mmg4b1EvbGNFQ2JOVWZDTCtJbEtIanFiWnV4VU1Ldy9hOUtaY0lDZVI0V091WnVDaXpxNnNEdHh5L0Jvd3hiZTN5YWZVVTNQdjd1ODI3VVh5NUZONG80SE5URjlQUTFYUm8rakpya0ZCcHVRb2ZYb3ZHVkN0RzJOWFZnY09IOXFDN3kzVCtGS3lzME43UmhsM1RLWUNRcCtkZFA1MVlBUDJ2LytNWDhXdC8vQUNXMWphTkJpL0JQWXc0QVhZN0xRbjRCM3M3OFNjZmVSZCs0aDNYTjFUcjVUcTErVjVwc3E5amxmMDdaMmJ1YmYyRy95cWhsUWZVcUhBZVlrRWRIZWNCLzZsMDdRQ3VBL0EwNnBSd3B2ZnVRTy93QU9ibWw4R3BteXFPMlBKcXpqbWlDc2VWNVExeDRoc0hvb2dCZ2FoS0VIRkU4cUNZaUl2b1VJby9RU1JQbVF1NFBySlVQd1NIUHFpR1JTQ0gwb2hEYkFLWUEyL0F4R0UwcW83aUlCcXVGNzh4QmpCMWFJMDZwSWFiZFRMNmwxd0Q4UU5xWUtYVFJoQS9PM2VNaWlhU2RlS3lqS1NQbERzWFBycXE0Q2N2VXNmWGlHTVFBRC9ReEdZVXpzVVd1ZFdpS1NOMldJeTY1dkFlUGdONDRsVmR5YnZTOVZidERidDdXdWxBN0lBYVFCN2ZTUGpHMm9pOEFPKzc0UEZyQ25LdUpjZUswMmwwZUxZL2JpVTR4T0lkQWNJR2ZjUGZ3a1o1UDlEZmpSdXYzNHR2UGZwU0RPQzNqUS9pd040ZDZPL3RJb3Z2VkZrK0RWNU11M0ZBV3lTOElUWHdwcUJMUjRZVTRvWE5qd045ZlQySkh2SFNDaERESTRQSXRlVlFLcFZScVlnVFBzMnZ1SzZVSzZpRUlhSW83ZE0wRURqd3BXK2R4TGVmUFkrZi83RmI4Y1liOThqeGk4c1ROOVVISVUvc2hKMm1hS0VPLzVMa3YvaisyM0JvN3hqKzd6OStBSnVlcWR5a3NMcGVTRFQ1KzBKN1J4dmEyM01vOFNqdHlYU2RBTDRmd0YrbExxVEpzQlVnZnhiQXJZaURPdUFIL3B2UkFNZ2Z1Vm1ZNmhjOFJ6ZjZ3c0p5SG1FVUNWQmtzdGJEUnNVQUFDQUFTVVJCVkdJRTZBVzZxOEdXYWVBSFpKdzhiWTR6NkJQaUFBblVBWXVCZVJBQkVlTUNDQlJ0Q1BBQTVIUzVDRngyWEhyNlhFREJuZFJCZ1RHajN4enpuRVRuZkpNS1dES1pES1luUjgxQUwrUFZ3S1ZQc0hNenUzRnc0aHlhYW9KQlZZRWdCY0J2N3dYNm13RDRpSXNGZGhzbHdUQUczZzRRSndLOXFwc1RqeHA4QUQrUUo0RzlTdFJBYjBYYndBdFNiaHpvZWV6OTJIUFV0bGxmUmxudndCSUdQTllBQmRBbWo3RVF4WUNkL3VxOHhKVE94ZUV0aHcvdXdoTlBuUUlZTURFK2hHdjJUYUszcDBzQWR1VE11Y3RuaUxoZEZ3dndTZWMwZ2d6SHhtWUpHeHNGNURjTDJOZ29Za1ArWnJJWmpBNzNZM1I0QUYzZDhZNlhGbFJUQ1Fla25yVUlXWm9WM2J4NjFmcjZ1cTIyVTBYcmZxSGFNNHhRcmxSUUtwVXhlMmtlNjZ1dDlXb0hpUG53WC9sL0g4Q1hyeitGRDc1dkJpUDljdDBBNCtaNFVua3N0d1g4Qk9ncDhITnd2UFhFUHV5ZEhNSXYvUDRYOE1ybGxSUzE0Q2hWUW13V3kraVVpeVg5UXBnMUFLTi9vQWR6bDh1b1pITElocWtFaXZmaUtvSThhMnJ4aVQrOEVjQ3ZBRkp3cnYwN096Tno3eDhDZUNadEFabE1nSC8xNnorSHJ0NGVmT2Z4RjhsSHdjekFTUVpKQnVDNTAvTllXaTBnQ0pqNVl3eU1NUVFCRUxBQUFRT0NEQU9UMXhuR3dCUmR3TFNXcm1oWklEcVU1cU02SVdQeUNGa21PeWFsSTUyVk1kMHBHUVEvQVBvWVJ5TklNQTNrcHNPVDU2dWh6WE11OHUyYUdzTk5SL2RDb1J0dEt3Wm9nWVAyWWJkMzFCSUFLTUI3OHpZQjhKTjlRRjhUSjhsVkl1RE1zamhOVHZHMDJvSEVrWi9xdE5Yb0cwaUwwWUFNTlBTSFd5a1dpTXRiVUNEVHRCYUFjNHMyRHNZbWoyMWE1elp3YWg2R3pqS0xSK1k2a29WRWdQYmxybjFWeURpZG40dnBzdFBuTG1PZ3J4dTlQVjBBeEhSYlJHampXKzhnRDV3UnRNVnlCUnY1QXRZMk5yR2VGK0NkM3loZ1k2T0FqYzBpTmplTGNrMUdmQ3lrdzJOblp4dEdoZ2N3T3RLUGthRit0TFhucEJCajV2dXR0cVhDQjNrZmRydVJQTHE5UGVzalZEeHRWeVRrY2Q1QlhPQ0sxOGZVdzhmYjVPSGdXRjVjeFlYemwxR3BHQWN5dEI5YTdlYzBLM2V2UE9OQlQyY2JmdmFIYjhiZDBtZTkwZUFoTkhaR3gwRVgrSlcxMDR5aCtjMHlQdkpmL2hGZmUveU1WYmU0TUNYdWgvdTdNRDdVbzU4N1ZudVNqM09nVkNqaTVFdm4wRjR1b0R1ZE5sOEVNUEx3d3g5ZHIwblpnckFWbXZ4M0lWckQxZDU5NXZvQXdMWkRoM2E5Nzlsbno2UXVZTmYrbmVnYjdNZnMzS0xuUlpGUzVYdXZSQkdXMWdweVFBQVlGeDgvQWxlalowQUVhWnFYNWg4WkxVQlFlbEpqWEd2OVROcThtWXhuQVJQeHNnV1lmRWlxNVN1dFhQK3ArMUFRY3k2MWM2NDZMRWpuRmM4VTArWWRxRkRURWpUczNqbXVoblZRVlZPYmdqM0FUSnZUdmtnRzkycHBxZU5KSEdQQVpHOXpBRjhLZ2RQTDVoeDRXcGpYSEo5U28wYzFlbkxocHVsOFFGWE5YdWZuNXA0VFNjeWR0K1hlOWplTnlXSHpvc1hvYUU1NXc0QU1TVk1KRkV5bzFtNEF5UXlVaG9hYmVCZHNKTCtJMUhkNng1Z0duNGp5MXp3b3dBSExLK3U0ZEhrSmwrWVdNYit3aW1LcHBBVUFieCt2TW9UUXNMbFp4Q3ZuTCtPVjg1Y0JEdlQyZEdGRUF2N1FVSjllOUdmbFQ2RkVwZFB5MDY4YlNNT3VQanFiY21Dd0R6MjkzYmgwY1E2TFY1WlRja2tmMWpkTCtKMy8vblg4NHlNdjR4ZmVONE9KNFI0QjdySTJSa0VTOTY2cG5zbDdGZEhSbnNYdi9xdTM0YzgrK3hqKzYvM2ZSVlNqd1ZmelJRSHlWa2pPMDliUmhvNk9OcFE0QjlLQmZEdUF1d0I4SmcxeHMyRXJRSDROUWl1L0h1bk05Y0dlUGR0L29CNlFQM0x6WVhBQUM0dXI5dWlaRUJaWE51WGd4S1RFenhBZ0R2UXNFTm9Bb2dpTUJVSjdCOWZ6N3dDVDNzVWk4SWdKczdvMHYrdUJPNExvY0lFRWFWVS9KZ2FaUUdudUVqVUNGdGhBcnVibFZlZGw4cG9Ed2piZ2FQSDZQN3NocUVZS0FFTURQUmhVVGtLQW1PbFhEYmJVS2hCUGo4ZFhBM2ZDdG1xK1dnQy9vdy9vYmNKWlZ6RUVUaThKVGQ2dG0ycTYxUFB1R21UVDBjTkpjL1A1MG0wYUhtKy9oRGF6VGZVOFRrL0JXZ012RElDUWwrV2EzVlZlRi9pcEJoclRQR0cwUDRuRkFPZmFPeDRWQ2lqQVcyVW9MWis3ZFRKQ3c4WkdDWmZtQktqUHppMWhjN05rTDE0bEFOL0tzTGErZ2JYMURieDg1aElDeG5EOWtiMlltRWoyUjg4OVY5WHBxb2Zhc0UvZWNScCtxWVFOd1MrVHlXQnlhaHY2Qi90dzhkd3NDc1ZTUXVtcFdIckRZeTljeEUvL3hxZnhVOTkvQS83RkhkY2lDSmh0cWs4QWZnNnVnWjRDL3dmZWVSelhUby9pbC8vclAxWTlsS2FzVFBhSmZnaGt2WFhGR1hyN3V6RmZLS0djeVNHWHptVC9EdndUQm5rQStBYUE0MGpXM2pYd1Z5cGhNRDA5ZGpBdDQydzJnNzNYN1VXNVZNSEs2b2FEN3h5V1Rpc0h2b1hsRFpzcTRvZ0NHK2daQUJiSnVBQUl3TVhaNGN5QWVLQTBkY2tuNGdaTUF6bXRyenViTkNVR2dKaUhWNEpsQkxuZ2ptbWdCNU5DQk5YdVpmMzF0YklVd05YaWsyVWNSZGZmMTRYWDNYQkFENUJTYVRkYXZLSlhHcU9MUW9oL2lLbkFYVjRrQVg4dDBBOGt3UGMwQS9BVm9jRzdBRS9MVFFUNnBIZ0NxRW4wUUx3WjA0SzlCbXVWN3I2SEpOQlhHbmhTUG5sbGErWU9Ud3ZFSGNDSEFXUEt4ODFQZ1ozRzBmcXJlL1ZhWW1YSTh5Rm9tdm90bGl1WW4xL0NwYmtsek00dFkyVXRMN1I4MzNaVUJmQ3REQjUyRWVkNDRxbVQ0QUMyYnh0Ty9DNHNGaW1xVlEvdzFxSVJQK25hb2phVm9PanU3c0srYTNaaC92SWk1dWF1dEx5dEM2VUsvdlBmZlFjUFBIb2FIL3l4V3pFOU1WREZWRThYNnhuZ1YvVmxUTGpFL2JOLys0UDQ4Qjk5R1MrZFhVZ3NkelZmckFueU5QUVA5R0QrOGhKSzJmWjZRUDZxaE15di91cXZiZ1hmRlJqSE5oU0RtUHU3c0xBNkVvWjg4dUdIbjBHWkhoS1FFS2IzVHVIbU45NkN1ZmxsTEMrdnh6Ulc4c29CQ0ZQOXFmTkxPczBLQ25oaGdOeldoYm0vMXJRMEt4OGhzRkNReGI0YU9xREZCMGp5Y2FzQlVRRXdkN1pJeVZGV1hCT05SK2JmTmphSU8xNTNDQjM2TUF1RFdJeFVucllqTVlURlFqM2c3cVluQWI4dm5qRmdxa21BTDFURUhId1N3TlBBeUlXdncvcUVLVll0bmx3MG1oNWJXT2ZHVXlBbVJQWTF0NjRwaUx1TU9lZ0tlVG9mN3dnRlJEQ2dmZFZ5SCt2V3d3SHNDSWJJOENaYU84MERZRzVoQlMrZnZZU25uejJOeDU5NUdXZlB6V0ZoY1IyRllsblB5WWNTME0wK2VpRXNWQTFwQURMZVZJbmg4dVZGOUhSM29pZm1jSVpYTGF2VjROdktaNm9WR0FOWUVHQ3BWYVo3VDZVV2xqZndoVzkrRHoyZGJkaS9jMWoyUzduckFtN2ZJVk03ZEx5VWFUMmQ3WGo3ekg3TUxlVng4dHlpdHdxVk1NSlFuMmNIUTRJUUUyUXpXRnRlUnlrQ09zdXBUclVidU8rK0wzenlubnZ1VHBZMFdoUzJTcE0vQitIOWJpZHFtT3RYVnZKalFjQnc4T0JPZlBlN0w5VmtmT0RvQVlCTFV6MWNZSTZISzh1YmlEZ25zR1dibzZPSWl4WHNrZFRHd1JCd3NXZ25BQU9IMFBhRnBpNDAvVkFCWXdBOVVGbHo3T3BQV3dLNE50RnpxZlhyUE9BQUMvUThxN0FDd0RMTEt3c0FJRmVUa2pRVmZOdm1ydDA3aWVOSGRvTXhZM1d3dEhVVnlWV0NqSGI0V2QyNkFYRFg5MG5BNzhRekJ1enNCN3JUQzlLeFVKQWFmSmdDNEZYWmFUUjZ3RWxMaWljWGJoKzEwdUhQejhtckVaSENTZ1U0N1VjYTN0dkdNU0MyNjZIeStVQ2ZDaEZ1WGtycTQ2KzJyTmw3OXNsZ3F3R2U2eTFhc2UxdkVCcnkwOCtmd2JNdnZHTFNJMkZsTXo3cmpjWnVBM3lURU5aQWRzNkJ4NTg2aVdOSGdHM2JFbnlxNjNlVVhJQ2ErcWhWdjVwVjVMVktRdnpGMWtrU1JSSE92M0twOVJZVEoxVENDUC9QMzMwSHo1K2V4NzN2UFlIMm5JQXY1cGp1SVRWNFMrTlhnNXU4endZQi9zMEg3c0Qya1Y3ODZXY2VpNVZWcm9UWUxGVFEyWkVlSW50NnUzQ2xXRVk1MDRaY0dKKys4SVIzQUhnK2RRRU5ocTEwZS9RTmlHYXQ1Z3dueU9jM1I0S0E0ZENoM2FtWTdqNndDOFZTQld0cnhnUmZyV3N0TEZkZkNLR0FQdEc3Rm5jODFoRnZXOG9ybmZhQzUzR2E0L09BRjhZYzN6ais2U1BQR2ZRaG9lZksrUTMzL0VYZzRMamwrRDRjT3l6YWxHcEVlcCt3R3Z4Vk8zQzErbGxRcWpROTFuanl3RU5UTGQwcUx5R2VNV0Q2S2dOOFBYVWxQK1k2SVQ1TnUvaG9GQ3dxYjRSR3crWm04UmdCWUF0a3liMnRXWnVCM21nOU5zQWJEVnFCSkloR0JOM3ZMWXRSWkNvZUVYcTNMdUNRaHo0cDhPWG1lUkEzMjZ0OHA4NWMwZ0FmY2VodkkrYm1sbk55Q0ZReXdGZUIxY1NVZE9tRWtuTTgrZlJKekY2K29wK3BkcWJrRXJoMVVlTUpVcFJWVFlEZ2hLZ2FLOHBpOXVJOGlwNDVlWnRoaXdJSEhuajBOSDdoOTcrSTgzT3JZdXdNSTFSQzZRaE1qc25hU1k1MG5GTnhIT29vUnpzL2NmY3gvTzgvY291M3FOVjh3UlRxVnNQelhEMjl3bnBUeXFVMlAxNFZrLzFXZ3Z6WFVjTjMvY1pHc2FkY0Rqc1pFNXE4dXpyVkRmMER2UmpaUG9Zcml5dDJzeWQwcEVvWVlYazlZWUdGazhlNFNPUnlNSklhQXZHaFRjRTRCc0tXOTdzb0J1SmUxN1hjRlFJSWJjUlI4WGk2MDZmTlJaTFdFVUp5dVN6dW1qbUMzVlBqQU93dE1seWd2QUI3Ymo1VVBXQ3JlNWlCT1E0K3B2azQ3SVNrZEtxWldYUk9mTUNBWGYxQVZ4TUF2MWtSaSt6cUJYZ2FhZ0s2NTNsOGdoTWhUd1I3TDQzN0xpTG5Ib1pPTDJKVGRPbzl3N3hYdFdIVkFsRENnd29FMUUydEVUSnM0STJnQkFRcGlCQVJRZ0YzUkRwWnhJbVlRb1FFTFI5dzkwOThkNWN1TCtLN1Q1NDAzaUlWc0Z2ZmdDdDhKd0I4bldEVExEYXBPZnJaeTM1emNITEJ0VXR1Vm1pZ05PU25LazFTV0YxZHg1V1VabnJ1dWZMVDFYN0FNNWVXOGNFLytDSys5ZXg1NHhrdkpKNC93d2lWMExqL1ZtbVZNQTc4UDN6WElmejhqOTBhczRhdWJTUXZ6dk9GenU0T0JBRkRPYjJMMjl1dmh2ZTdyUVQ1SnlGVzJtdXQzZjFiWGw0ZkRnS3hCN3lqb3czNzl2bE9ualZoLytGOUNJSkFPOER4QWdmcElzdHJkUndmQ0JBdDNvQ3lEZWFPTDNydS9LVUVlOThBNVhWcHF3UUxxeDdPV2R1RVoyOVBGOTUyeHpHTWp2VDdCM01kcHdaa010QkNEZFlxRDljRFBnMUpvSlVHeEgxNVZRZ1lNRDBBZERZRDhHWGd6Skk0YUtiWlVCWG81WVgzdVQzUFJxSnJncjFyU2RIWGhLY0NXa1ZFZ1Zta2s3bEsyTzVwM2ZsSjg4OElCRVl3NEVRUU1OcTdLeHhFV3JqZ2h0YkFPZ0MxbDEzVVQvY3JMdDNnNmpxYmVpMHVyK09oN3p5SFNpVXk3cVhKZDZoOTZuUHp2RXBJTisrcEJSM0JEYnpxclowbU5mckxjNHVKZE9rQXV4YnNtYzdSREdEWGtneTRVMGk1Vk1hRmM1ZHFNVzJpUHRWRGZyT0VmL2RuRCtJdnZ2aVVQTmpHZ0xqVzJIV2NTZE4rOGtuODNiZGRndys5LzNaelBqMEh5cFVJeFJKWko1WlFYOVV1TEFqUTNkMkJpQVVJZzB5YVIxQmI2YlkwYkNYSVJ3QWVSaFZ6L2ZyNjVyQndSaVArRGgvZVZaWGgzdXYyb2xncVl5M3ZYOWpnRHJoTGF6NjY2cCsvNVlQZU1kOXIzL01FWExtVUVyVjI3NEo5YUp2V1RYcmszRHNuME5IejRFTWpqZnF0QnhFbXhnZnh0anVPb2J1N3c1aEFpV2FuZ05zTTlvQmFreFRUNmlPaklhcTJTZ3RTRmgvZnUvSGtWWFB3blUyc0VOa29TeE45QzhmMUpOQzIyZ0xKYWJYYXlDc2tLUzFZcGRGZlRnN1NVZUJPcERjT2J0SkpIbmZCSGVWRjd3VmJlNm9tdnZyZHNRNFJXbGNqTjY1bzdlZUI3R05VdUREMTVNaHZGUEhndzAraFZDS0hTWkh2a2g3elRMWDdPdVI1M1lhdEZ3TnNqZ3JvNS9RaFd2YmFpV3E1cXoxUGJXMjNwbGlRS2lTVlU5Z3M0dVRKc3dncnJ1T0pxeHM0Qno3NUQ4L2cxKzk3RUN2NUFqSFZjNm14bS9IWG1PcVZsczh0NEwvcjVqMzQ4QWZ1c0k2c1hkOU1OYmV1UTArdlVNenIwT2EzM0dTLzFVY1JQWVFFYzMwVThVeWhVQm93SHVFWWpoL2ZuMml5ejJZem1OcXpBOHNydHBPZ2FwMVZIeDFZNThmTU9TUUFSOFMwNk5IWVkzUHc4SU85cThYSHRQYklPb1FtREoxcEFaY1hGNGMwcUxocjlrN2lqVE9Ia2NsbTRtQUFlOEEyQTY0eHp5b2l5OVFwMjB3QkRnVnVINmhWQS9kcVlBbUlWZlRObU9qelpiR0tuajV6cTBJMTRjUUgxalNOSjZTUmJGWWlCWENqRVRzOEZIZzZmQlJnQTQ2Wm5idzdsVStaMktIU1FVRVVaTzVjOFRaZzdEZXhremw2VjBpd1FOODhFKzJMOGpCb2NPbWQ3b0Z2UEkyTmphSmxobmRQZTZTQ2N0Z0l3TmNLdk9wdFloNGZIWStrUmorZmNGcG15dEdKQXlpWHhYcWtoWVZsek04dm9WSU9TZTQ0SHlwUTFGN29WN3NDSE1EYVdoNm5UcDVGSmNWdXFLME5wdEpQdkhRSi85Y2YvajFPWFZpVXBucDFBaWM5MFM2eWdWOHJUd2I0WjQ3dXhFZnV1Uk50T2FHSnI5ZHBzdS91RlN2eXkra1BySGw3WFFVMEVMYkNyUzBOM1FDK0FyR0szM0pwdTdLUzd6OXpadllnQVAwaGM4N3hzWS85UGI3NzNSZGpqS2IzVGVFblAvZ3Y4ZExKYzdpeXRHWS9oSFBCd0pEZkxPR0psMll0SXVia2lHKy9pL05UN21vRGFYRUFNMjVzaGF0YXg4VXRUSnFoVlNzOFRSb0Q5SjU3SnYrelY4NHo3YmRlaXoyV3UxdFJuMXR2T0lBRGU3YnJlT1p1a1ZQeGRNbTRXbm1xNkFFQVpvVXFKL0hpM3ZXblo0T2ZkVjlQT2dkMjlBUDlUWGl5eTVlRUwvcXRBSGczMFA2U3RKMHVNYTFLdWdsVXkrTnhvVWlDcVBGdFlOTnpkekNuUUE5WGdGTWNUTHppcjh2bC9uVEtUd3NKS2wwSklGSlRqd2hQWTNsUUZnY3BRRWNTK01NSS8vaU5wM0Q1OHBJV09PeUZmbWJLekZvRXFOdUF0cVFUNlFOZzdxRWpiVTBKM2Y3c3ZlVVdwVVhBSWI3MzZ3L3Z4ZWpvWUdLYjB6WmRYZDNBcGRrRkZBcEZiQlpLS0JSS2lPVDhoallSTTRhQmdWNk1EQTlnY0tnUG1VeEd0b2ZQZ3BmaVBWYkx3emtXRjFkaUsrbE4yL2ppZkcxbDkwODMrRERKenk4K3VHU3pHZnowdTI3QUhjZDNPZnZrWVkyOTZ0NzhtdkdQTVlZblg3cUUzN2p2cXlpV3l6aXdjMFNNL2M1M0ZxdUhyUHZwbDg2aFZDeGhjRDMxZW96OUR6LzgwWk5waWVzTlc3VlBYb1V5Z0pzZ2pwVFZiUXNBaTR0clk0VkNxUmN3Vzg0QVlHQ2dCdzgvL0d5TTBZazdic0xrN2gxNCtXeDhxNFk3aUFMQTVjVThWdWlpT3cvSXE3SjlnWkgvT0hmeTBzRmE3bi9pVm4rekIyZ09welBUQkFaRHkyMCsxcldUM3BiTDRrMnZQeXBjZnBLVzViSitSSXlSUE9MZ0gyOE9ScmFQeWVkUzkyNmVac0JkWGt6MEFvTk5IRGF6WGdKZXVVb0FyNElsQUZaSnMrNXJwTk5CbGJvWVZvbENPNmJ2MHI3Z25uamFmMFFVaFRNeUIrOE03RzU5YlA1VUFLQm1lN3RNVHNvRElLZUZGRmh3M1kvZC92M3dJOC9qL01VRnkrODhKMkFUU1RPQ0FYNy9pL2NCZkQwaExYbmQzWTREYzNOTDZPM3RRbGRYaHhWUDJ4OEFOallMZU9MSmw3QzhzbzdOelNMSzVVcmk4eFlLUlZ5NXNvSkxGK2V4dHA1SHhEbmEyOXNReUwyNlZldnBBK1lFa3N1ekM3aDQvbkpOUGsyRkp0bUVFY2QzbjcrSXBiVUNEdTBabHp1RFZaK1R3aUZBTEZ1T3NBTVJQejdjZzBON3gvSHdVNjhnbXduUTNwWk5XVG1HY3FtTXpZMGljbUVGUVMwL0RTSThkczg5ZHovWjZEUFhDbHNOOGdEUUMrQjJlYTNoYUg1K1pUSU1RMHVIWXd6bzcrL0I4OCtmeGZLeWJaWi8wN3ZlQ0dSenVIUjVLYWFCVzRPcHZEazd1NElTZFZRZUczaXBWaHdQelA0UFFQeHpvWGQwd05KamRBem9WS283QUVOM1FvdFg3RmQwMXY2K2JyenRqY2N4TXRoTEdERERrek5kcGdaMEpRQm9ma1pyRjNTS3pPUUZjMmc4KzdSamJaRVMvTWQ2Z0JIWFgwZ2RZVjFxOEZ0cmlFb096V3J1Tkw5NWIrcmVTSld1VnE2QzNWYzRhWGRxNGlmeEhvSFJMZHZOcDhCVjBWRitWQk8zQkFjVng4bmdxZXZrTWV2TCt5ZWVlUmt2bnJvQXppTTlBRWVTUUp2NXVka2YzelFhOEFZNDFNeFFUZWhRMXh5WDU1YlExOXVGems2L2hGc3FsZkg0a3kraDVEc2l0VW9kT0lCQ29ZU2x4VlZjdXJTQTlmVU5jTTdSMXFZQVA5NWYvSXhzNndqbkhPZlB6V0poN2txVlRBa1ZlcFhDNll0TGVQclVMSTdzSFVkN1cwNzNTOXFYQU5NWDlWUVdBZjZSZ1M0Y1BiQU4zM3Jtbk42VG55WUVERmhaWGtmQW83VGU3K2J2dWVmdXp6YjBvR25xczFXTVNmZ2lBSG4waXZqam5HZEtwWEkzQUtqVjllb3ZDQmplK01iakZvUHVuaTRNYngvRDBqSXgwMWNSMUN0aGhEWFhOM0VqSFk3MGREVWdtUzFzWm80OWFUKzl2VHBmMFpzdGNucWVVVzMxNEdZZVh0Tkp2b3AyWXRzZzduN1RqZWp0N2pTbVNoZ3c0SEMyUWFtQjFkMUdKU1ZhRlJkRlJyclZ6MHNBQTl6TXg3cE5SR25jNGRlWFB0d0ZqRFlCOEd1dk1zQURwaitrZldadnU2bjNRc0NTenBXclU5cW94cXppTFUyWXEvZk9yVHFwY3F6Vjk1WW1yUVkyODY3ZFl5TE5OWjFMNTZiTzNDeDZvL1dLOVQvU2Z6VE95UHd2dlh3UlR6MS9SbndqWkhHcG1vdjNyWjZuN2JqVllOSTY5dXA5Um5qeTZaTlljTGFlY1FCaEdPR3BwMCtpc0ZuSFhMQ25ncHh6TEMrdjRkU3BjM2pzMGVmdzRndW54UnkrczFDTzB5c1BueWlLY1BybGMxaThrclNlb040cVZzOVIxZTVRMTR2Z09IVitFYi8ySjEvRnhmbFZQZSt1OTlYclJYY0pxKzdsdlA3dTdVUDR4ZmUvSHIxZDZlY1VPN3Zhd1ZoZFcrbHVxK2ZKNmcxYlBTZXZ3cjhEOFAyUVk4VEdSckh6bFZmbXJsRlN1emFqcUE4N2pQQ1JqL3lwMXVZUFhuOEFQL3d6NzhZeno1L0cybnJCYTU2bjJ0TEN5Z1plUEhzbHJrRjVUUGF1VmNBaHR3aGNpd0ZqREJsNWFJTGFlc0VDaG96TW8rZmlWYmtCTXdmVXFQa2ZtUWN3Y1dCbWJsN1BzVFBnMElHZGVOME5CK1JCRGVwNW1OSENtYWtublp1bi9FRG9ZWkp0ZWxvWDBuQ01YT3ZBclI4M09wWSsyQ2xPbEdzMHJCYUJjNnV2THNDN29acFdiOFc1Wm5vSG9Xek4yd2hiNExDbWRUZ1hOaG1WMzdTMXJjVno1eVZvclp2d01mRW1rVmRKOThVYnZnVDRWYnFrMVVmTGNsdFFPSC94Q3I3eTlhY2ttQnN0M2hvWEZCOExoNXoySVlHa0pQWlB3eXZla2V5KzFjUjh2RldPbllORHJPYzVlbVF2aG9mRWx0Y29FZ0IvNWNxcSt4VFZ5L0hqcytGQUVobGo2TzdwUk1BQ1d6QWxEMDB0TUtWaUNjVmlXZk5KL3M2ckMxK3hOa2dhTnhJK2JEKy9lSVZpL1lNRC9UMGQrTkJQM0liSjBUN0hFNTQ5ZnNiR1U1anhleVZmeEo5KytoRXNxOFhjVnBubVlkVDEyWk1Yc0xsWnhHQitFYXoyWU1VaGpwNnQwNmxDdW5BMU5Ia0ErQVJFbXdVQTJPWm1zVmNBWFVDQWtHbXRQcE1KOElZM0hOV1pkKzdiaVVvbHhOcjZwdDJaRXRwT2JKMnJNUmVWK0ltbkQ1eHpzb3JUYU95VnlLUFZSNjVHTC84NFhYRlB0SG10N1F2NjdXT0RPSEhEQVYydVdiVnNydlhnQ0tuVmthZmtJS2FxU09WVnoyRzBRUDB4T1N1czllQ3N3RVArbVRKTXEzTHJ3cVQzdFFQYm13WDRWMW1EOXdVRmFMNzIwT25rUXIwTDlWNlVscXNjRlpsM3FPaTVQanRkUFR3RldLaCtBUHZkcXhKY002Vkk1NlJ1OUJva3IzMXRXNGc4NVpQK1FsZmhSeHptN0hmMVArZFlXRnpEVng5K0JwVXc3dFNKZmd2MjNuZjd5dmN1bXZtcVc5cTFFcGlwYUFQcUt3Q0FGMTQ4YXdIOFZ0UWg0aHhyYXh0WVdWbkg2c282VmxmV3NMS3lodFhWZGYyM3BuL3pFdUNSS0VqOFV3Z3I2d1g4NXNjZXd1bUxTMXBMVjF1U0s1WW03Nnk2bDlwK0plUVk3TzNBVC8zQWpYSnUzZ1NlMEN1N3VzVlVURXB0bmdHNHRla0hUUWhYQytTZmhYQ09Fd0FJaXNWeWR4QW9qZFlQOUc5NHcxSGs1RGFHN2RQYnNiS2FONkJSQStoWHFuaTVxN3VqRWhHU3grSkZpTGpaYnhseFdHQnViWmNMYTNuS014NmIzUDN6blowZDVQbnQ1M0UxTkRYQUtoTzhBblVLdXRwaENkWCtsQUFBNDJ4RjBWTFR2aDdRbmVid2didWk2V2tUVytVU2pDWTF3NW9DK0Fielg0MlFGdXlWQms2M3VrR0J0SjV6aGhTc2lHWWQyVUNxZUdvKzhsMkQwTGkvV3RCdytvYjJscWVtYmVRTDVuSTFPelNkWTM3bjlwWTlhOHBBYWZRZ0srRmxudlY4QWYvd3RTZFJMRmVNZ0JzU2NPZG0xWDIxOW02b1F6UThEaVRlTmh5aWlPUEpaMDdpbVdkTzRkS3NQZWVkdG94YUlrOGpPWnNKemRlN1Jia0p5ZnBHQ2IvNzhXL2dlK2V1RUdBM0RuR29xYjRTR3VWTnBaWEtFVVlHdXZHZXR4eUpMMXoyQkxXd3N2SWFNTmxmTFpBSGdMK0ExT1pMcFhJM2RZTERXR0ROelFjQlEwOVBKMjY1NVNEYTJySVluaGpCOHFydGc5NEZlblZYcW9TMmw2STBvWWJFblpZSjV4eGhSYzd6VU8yY3p0dEhIQ0czQllDWUJ6d1pUM2wwZE9RU05YaFE3WndNemxxTGd3RnFPdjhLa0lGYThZSXpZTXQ3eEFDR3ppUERnQWRJbkF5ZE9lSHNKc1czNFEzNXNqVFJONWI5cWdkZmU5QTB2U2lOZW52VDZWd0xhQzRQMTNNZDlSYW55aFNBYW9EYVdHem9uTHY0RitrcnJ0OTFmQzdlZmdaemJadmtEYkRUeFV0Y082b0JvUzJXS3ZqeWcwOGd2MUd3NXQvRkdoYXpwVGJlcUUyOGo3UXBEUmZycCtSSjZYVDRpamptRXZiUU4xaVp4ck0zSkRTMTZNdHNjaHl1UmJkUktPUDMvL0tiZU9IMHZBUnY1WmRFYWZUbS9BL2xKbGRaVTh1VkVHSEVjV0RuQ043NnVuMDFLOUloNS9ETG1kVDc1ZjlaZ1B6ZkE1Z3JseXZ0blBPc1dXd0hPWi9OWWtCLzExM0hzVzNIT05vN09yQzhzbDc5SmNyRVZVdUxiNlhKUGcwbmVTMEhxb3J5cDZ5MThzZythQ2F5TlhzSzl2WVVBRWQ3VzV1dE1TbXc1aUJtV2h1Y2FiMFUwTk8xRDFHazZtdE0reHJZaVVhbmVJT2JnVjN6VTVwalFndTFaNEZkL1dMRmFTT2hVQUhPYnBHam02ME1QdUVuVWdJWlNCdEdCaUNwMHhtQWFQRmNDYlhLOG1Jc0tYUkxHaFhDTEJPOFNsUG5NQkR0UGRJQ0l1RWRSZVplcGxPdmN2VFg4bU12TzQwR2V2WGNnSDZPaUhNODhJMm5zYmk4Ym9NN0FmdWs5blN2L0RUY2phanJuZFdLU2NyWWJQZE1EMlF0RUg1cTVHa0pxTDVHdjlkaXFZS1BmdkxiZVByazVTb2FQVFhWRTEvM0V1aG5ycC9Hc1FNVEZsLzNjVFBaTE5yYmNnaURBQkZMQmJNM3o4emMyNFJMc09Sd05VRStCUEJYaFVLcG01cmxxd0g5MU5Rb2JuM0RjV3dXU25wdXlBYlRlRStLcmFwM1F5TWZaTks0NFRKaWRyd1kyTW1KU0NHWmc0OUNTM05YSHV3c2M3Nk1EeU94NzFWcmNIQUdiemlBb0FGYURlb2FLUXlZYzhORGdZVTE4SlBIc3haUEVTMVVhWVZKQU55V0FYWVBBRFhPSFVvTXhYRHJQTmxkcmFEYld5S2QzcU1MT08rRHZEKzRheVM0OVY3cEhMVVJ1SXpRQjRzV01TMGQrdGQ5ejdBRk5wM1h6S2RUelYva29ZS0l5V3ZGa2ZqdlBQNDluTHV3QUgwbWd4UitlWjB2V1F0UTlZWVdBSExhY3VxSVRwSFlRUEV0NDljY296UUNta2l0a3Q3Q3RpbFhRdnlYK3gvQjR5OWVjalQ2eUFaK3N0SStpaUtVS3FIMnN2ak8yNi9GanZIK3F1Vm9iVDZkOTd0T0FEYzAvWENlY0RWQkhnQSt1YkZSYktmYWVoQUVvS1o3Ritodm16bUVsWlU4a3JxS3RmQ0JBNnQxdWlIME1xMGQ3UTN2ZXRzdCtLRjMzb3JiYmptSWZic24wTnZkYWRWTkFYNmxZcCtRRk1tdEhSRXhEN21uMTNWSWtLZXJsTlhBcmpRekJSb0FFUEVJZWk0VXR0bGVEd0FlOEZCcE1TdUJMRk10NERLTHdzU0ZLMjlsQTJEWGdQaHRKSlFqQWZDVlZMNGtYdHVCeTBZMWMrNFEweDg2M1FGdDJmQksrTExtN3RWN2tacTFDL0FHak1rcWR2bU9vYlYyOGc2ZEZTS1dVZ0FBSUFCSlJFRlU4dzBpYWhrQWo4M0Z1K3M4akpBSU81MEtNbHowbnhkT25jZlR6NTJ4NTl4SngwbjgxcG9ZNEZ1Q0RienFiWXNESi85dmZVaFZUcXNyMHlRL0hydElvdkNZRDJWU0dFYjQwODg4aWtlZXV4QmZmQmY2TmZweVJhNjdDaU13eHZDZU54OUJYM2V5TjYvdStoYmZBY0RyMHhMV0U1bzRFcVNoc1BTMXJ6MFZuamh4a0VSeEJFR0FLSXIwTmpUT2dTQUFPR2ZZdFgwWWo1NmNqekhpb0lvekJ3TkR4Q1BrTjh0Mm9rNU5Db0xZeXBKSTVxR1ZOMTJkN1JnZEdRQmpEQ05EZlRoMHpVNHd4ckN4V2NUbCtTVmNubC9HN053eUZoWlg5ZUlpTWNDcExYWU1FZU1JdEpNZTBSc1pBb0FCSGUwNVJKd0xxWXdKc0pYZUdQVnZ4SXpITkxIRnlqdzVwOC9KUlNieFk1NUdwWEhHeEtOQ01MUDRNUmFqRTg1eTVHalBHTEpNQUh4YnFvT1k0aUdVQUY5K2RjKythRHFJSmlTRE5qZHgrcDV6NmFoSXZqdEpKQUNZNjc0V0U2WXNIanJLMW9hNFhTNmxNL1NFTGlrTzlKcE1CU21CQUlqN1Y5Q0NoNkMvTkxlRXIzL3JPWVNSb2JNcldhTWRuU3MvRFhjalVuRk5pa3FQUlg3S3hIbzNBbklKZVdxMVNOME1tNlMrV3NKSm10QXoySS8xcGVYRU9rVVJ4My8vL0pNb2xpbzRjWGdLREp5c0cySmd6Tnd6TUhBZW9pMHJCelhHMGRHZXczdmVjZ1FmKzl4ajB2R2EzWmM3dStvRytSa0EvNkdlWjB3VHJpckl6OHpjbTV1ZUhoKzg5ZGJyOUh5d0NEYlFxN1JzTm9Oc05vdWQ0NzA0TjdzSUI3MVZWamxJY3F4dGxCTG45Tnc4MUpXN3l5dGx0QldtdG85SVltNzVldS9xYk1lZTZXM1lPejBCTUNBTVF5eGNXY1hzM0RJdXpTM2k3UGw1TXpoTDdVYnR3UmY3TkVPQUJlanNhSU1ZNUpXUVFZVVhjODNCSFQvMWtHQU9MUkJ3a2tNRGZjUUkySkJuWUlKZk10QkRsQWZScGhsd1RBOHdkRFRZc3lJT25Ga0JpcS8yMlJkTkJoZk1ZM0dBMGVBbGl0SjVkR29haVNRVEtROVlkSnlrbWN3azNyMEdDQWVYbDZtUDZvL1VRa1MxZHBCN0xVUm94ejdjbW81WVhkM0VseDk4QW1IWWdGa21DWXNiQk1xa2JQSDRsQVhVbGxIU3NOanlqRHgyMGFLS3BCbHZXMVJVWGJrNTBObmRCWENPdGVXVnhMeWNjM3p5eTAralZBNHhjLzFPdlU5ZStmM1U1NUJ3NFcyeEVrYVdIL3ZSd1c1ODN4c080djUvZkNaV2hWeGJEdGxNSUt3RVFSYVpxT2FnOXMvQ1hIL3QyYk9Yczg4L2YxYWI1Slc1WGwwRHhndGVlMmM3SWg3aHV0Mmo2TzFTOHhySmN2MWF2dGhVNTBtWDEwODFOVGtXUzdXbUV1UjFOcFBCdHZGQkhEK3lCM2UvK1NZY083emJ5NTB1U09JUlI2NHRoeWlDbkxPbkM2bk1Janc5ejA2dUk4dk1hdWZWaDRDUWxmaTZEbzdwbmc1bWxtTVNBazZNQXp2N1djTW55bkV1UE5sdHB2SUUrZG9OMXRTSmJsUHVCM2o1bjU0ZWtjQnF6T2YydTRrb0hUSEJLNTVxdmx6OHh2ZXowL1BpemFJNkltaHdhUE85V2U5aCtwV3FQL1VmcnhmY3FiSzU2WmVsVWdWZit1cmpLQlNySDltWkhuelRoMmJCMThja0ZjOEVvcXA1VStGV1M1Nm9SaGt0b0d0UUFHdUdWUkpkVjE4dnVucDdxdWJrQUQ3MTFlZnd5TE1YUENmV1JaWXZsRkk1SktaOE1aKy9mMm9ZdHgvZkZXZk5HRHIxdkh5cVFYSFh6TXk5ZldrSTZ3bFhHK1NQQXNEblAvOGRQUThQUUFJOUxOQVBBb2EyOWh4NHhKSE5NSnc0UEVYWStGL3A2a1lwZ2NUemVWZ1NlSHFwM1pjallBRW1KNFlvQ3RvRFBEZVp1UE43NjQzWEdDdEFRblU2T25KYWUxYkpGcGhyRUljMWFGdUw4bUFHL0ZnOWRCMVRBTDBGV2paSTdSaGc2RzN3UkRrT3NVMHVYOS94emErcElMRGRMRlJUN1JOckt3L0F1MElVaHkyWXFUbHVNOWZ0Q0hNVW1LM1Y4UEtYZ0w4TjNIYVpWRHNIcUpCSWVDbHdWL1FjMHFlOExGc3dCT2NjWC9uNlUxaGFXVXY0ZHF5UE1FWHIrc2xqS1RWNWVnZ2FBZk1xbEluNVU2QmpzMUJPMzEvem9UbEdXeStXMUM2OWQzQUE3UW5uQk5Cdy93UFA0dlRGSmJGZWlxeVpDc25aOHlXNXd0NXlPeDV4dk83SVRsdzdQUnJqcWNxdEJLbE5tMGZTRXFZTlYzdE8vaWdBUFBMSWkxaFlXTUhJU0QrQ1FBd2d5bHhQRGVQWmJCWlJGSUdCWWYvVUVKNCtPWXZMaTJxL1BJZVpZeGJaYXE2c1R4TzRxY0xJVUIvNis3cXRlUm5sdzVTNk11M3Y3VUl1bTlGWkNRdjRqT3FrNWdCamVPdWR4L0MzbjMwWUsyc2JwZ3FFU1ZkbnV6YVQ2MFJ0UWs5aHR1Y0FadzZWeWs5TTg4cDB6em1ES1lyT3ZWTVR2ODFudkpzMWRhTGN4VlhoMGU2Zll1RGtQMHU0QTR5Z0pDTzBlZHduTElFSUFJN1FSZWZvd1lYZ3B2b2FKd3c0cVFBM0pjU3NDN1JjWDVtMDd0VGNyOHAyOHhJS1hmWWpqMzhQcjF5SXI2Znh0bDg5Q1kwZ1J4VjVJaDZmc29CVU1rcDFpbFFsSlJBbDUwMVgvN1JsVjZQTHRlVlFMcVV4dlhIcko1NWFwWlI2NUxjRUJ2M0RRMWlhVzBDNW1EeklWTUlJSC8vQ0UvamZmdVFFK3J2YnlSSGdJakFtTEZOcVhsNmttM0gxYlRNSHNMUzJpY3RYek9GcUhSMUNndytEMUF1VWpnTDRSbDJQVnlPOEtpQWZSUkcrOUtWSDhQNzN2MFVES09lSUFYMDJtMEdoVk5FKzEyZU83c1NudnZvOFlXZVFjS05RUmtYTytlbFlpcllXR1BxQ0JiMDRjbkFYamgzWmcwQjY1QU5nbjg4dUFWLzVOOVp6MjJieTJpeGdJL1BpRkt5NVhDalgxcGJETzk1MEUrNy8vTU1vbDhXOERSVWl1anJhN1ZvcXdOVkFUY3N3SUMwR2JEV241TlNqaFVBLzJNRXcwZHZnUm5nQXMrdkFVdHdsOUdzK3hNQmQzeWVEdDdqMjBGaW1mSm1hSUN5b0s3WHJqSE1ubjd4bURnOEQ4TERycHZKeWM4MGR2dDY4VHZuMFdiNzM4a1U4K2R4cHEwM3N5OW9JeVQxWHlUUjJSR05nVUozNTFnQnlnNkVPaG03ZmJGVnQydHZic0h2dkZPYm5GbkZsZnJIMXoxZ3QxSkFNdVVQREdNUEF5QkNXNXVaUktTZlBqYTl2bFBEeHp6K09lOTUxRTNMWmpGNThwNUFqaWtLRVVTVEhjREdvTWlZRTdvQXhmTi90Qi9Ibm4zc01aWGtRVUh1N21HYU82Z1A1bG9aWHhWd1BBRi8rOHFNb0ZFb3dXK2FNdVQ0SUdMTFpERmdtMEtqRUFFeU05R0x2NUpDWGNiNlJpVnpQT05QZW5zT2JiaitHWTBmMkVwMVlrVHZEam1kQTRmREVjZEVKcEdCSS9rUUhDaGd3TXRpTnQ3N2hHREpCZ0d3bVFDWVRJQ3V2ZTNzNkVFaXRQWkI1NVc1RHlkTThTRXdib3dPOXBiRTVkVTBMTWx5MGc1cm43V3BqMkRuUWVEZWF6d01MR3cxbmYxV0NBVVhiTkc5QWtvSTNhWGVnZVlDUEFUdTM4NWxNeEpRUGU1NmQrNzNpdVh2ektWLzY5UDd2d1Z6UHppL2pvVzg5bTdvdDB5YkVxbEtiU3gyTUcrSFdJbGhMZmpCQ3NzVVFXbHZtc2tJdW04WDBya2tFbVF6R3Q0MmlieUQ5VkhKelQ5SkFidG0rUWNBd01ES01JTWx4aDJSOWFXRU45ei93TE53VDZkU0pkYVZ5YUV6NXl2K0ozRzdYM2RtRzF4M2RxVmxtYzFsa0FuRVlVRXFnLzZjTDhqTXo5dzREMks3dTgva0M3ci8vSVdkdnZGck55SkJyRS9QeGpERnhxbzBFK2x1UFRPbTVmQlU0Z0kzTlVpeXUzakEyMG8vdmUrc3RtTmcycERsWTM1OERwQ2JkSGhBWlY5cStBWEY5QXB4U3p4bVRLemxsSEdQWXZYTU1KMjdZTHdXZEFFeitkblcyaWJ5TUdZMlFTLzVRN0VoWmtPVlRvRmVQa0dBT3JnZHNsTmFYeTNEc0dRd2E5bWEzdUFuTTVtdlR2VlpDVFhBWGlLNml0RUFFNTk0V0F1b0ZlSS9RQmtydlFqSUEyT0FQYjM0UEx5Y3YvUlpjZ1ZHbHI2OXY0TXNQUG81UXUxTjA2K0twcENlMEZOS3FGQmVQVDFseUtwNzFTdy9OUG5jS2VhRmVidDdZaWNseDVOck1Zckx0TzhiUjNkM1ZXTmtKZWRLeWl0SHhoSGdBbVd3R0F5TkQwaXFiWE1Kekw4L2hxNCtlbG5QeDlzRTE1VW9vSFp5UjgwWkM0NkgwNkw1dEdCM3Nsb28rUTN1N05ObXpWQ0IvZUdibTNzYk5vcDV3TlRYNTJJS0N6MzN1bTFoWVdISDgxd3RBeitheVVIdUl6WFl5aHY2ZWRoemROMDY0aUJlVkx5Um84dHkrOFhjSWh1dXVuY1piN2p5T3pzNTJIVThIUnU3aG9OS1ZhZDNXc01XRkVsb0FCZlFTaExuNjVkYjlqVWYyWWMvME9BTEd4QjhZdXJvNk5KZ0hpcDhXRHFDRkJFYnF4bVRGMUw1NlJuNmJBWHFWbHpGZzMzQUd1UWIzd2k4WGdQT3JFaFE1dFR5ODlrSnFjQ2Q5aGk3QU02WndUdklvR2xsR013RHY4RlowRm84WURaejgwQWsrQUlmRGk2WXIrbklseEplKytqZzJDK2xXVHlhK2J4Ni84WUVYZDRtckRPNjFVbXFScHNwWlp3ZHVobWV6ejlqczh4VEozRGFIR0lOMjdOeU85bzQySzc2ZU9sMk53TUdSemVYUVB6d0F1djZMQm9VLzMzcnVBazVkWEVhUUNiUXZlN1g0VGpzdDB3N00xR0k4NFF2eWpodjM2UEcrVGJaSkdLU0MyejRBMHkxNFZCMnVKc2pIekJDbFVnVWYvL2cvNkwySUN1aVZ1VjdNWHlNRzlEY2RuRVNIYytSZnZsQnVxQysxdCtkdzUrdVA0UGpodldxU0dZQi9JSFFUR09NUzFEV2tpLzhsbUFacWtodGtrUWF6citGY004Ynh4bHVQWUhpb1Z3ZzlBVU4zUnh1NGRJNmpGaHRvRFo2Ylh4WExtS29IbHgrZ3pNTlZHWVpIWGVCQ0J2Vzl3eGwwNWhvVE9OZUt3TGxsRy9EZ0FPV3JPU3dZRUpZQWxoYmNZY0Jka1Nwd1RaeWo1NDBJV3g2QVYvZUVqb0szOWV1V1Qrdm1NLzliVi81ckR1Q0JyeitGSzB0cmRrUEdMaDBwd3hOYSt1NnJNSXNMRHZVWXhWdEVtWUpOckZhTnlDcnhpL3J5TzJGOUxVOElCRldRQ1RBMVBZbHNMbUdwVjZMQVV1c2xWYTlMOWVEUDFkYlJqcjdCUHJSM3RLT3JweHU5QTcwWUhCbkF5UGd3UnJhTllIQmtBSDBEdlhqd3FYTllYQzhoazh1S2JYWFNYSysyTjRkeXF4MWRoUjlGNHNTNnczdUZNdHJlMk9LN2xvVlhGZVFCNEtHSG5zYXBVeGN0b0dkTUxMcUxJZzd0bkVDYjhvR090aXh1dm01UzgxRHpKRzd3OTJ2VHBVYUgrL0dPTjkrTTdkdUcvVU1ZdDRjemdNeWxnMnJVRXF0aDV0Nmg2MHcwZUs0eFdqUTh4VzJsYlFOb2F3dnc5anVQb2F1ekRabUFvYXVyWGVZVkE2UUdiU0lZcVBWK2lyLzRWUXZ3bUJZczdES3BSeWNmeUhnR2ZBN3NITWlndjZNeGdNK1hnRE5Ma1RsRVI0R21BNXl1aHIvVm9PK0NPZ1YyTGVEVUFuZDM3cDBDS0FGUkcyREZSVjBBYjRFMjk5T1J3WmYrcitycXA3SGIyU3NnV1B4Ti9MTXZ2b0l6NXk0bnRxOGJFdDhuajkvNGFHTXBIRFZvV3hpcXlDbnVlSkd1RXNuUFdVOW9PSDl0dVNzV052S2Jaa3FHbEozTlpiRmplakp4M3JzbDc2Skc1L0VtV3gxYzNIUjBkYUovZUFBOWZUM283T3BFcmkySElHT1BhK1V3d3VlLytUMFVTaUd5dVN6QzJGNTVMdjNaUjRnNE9hTWtpbkRUb1IzbzdteERSOGVydS9qdVZRZDV6am4rN00rK1NQelZRODlINjdsbFpaYVcxNHdCUi9hT1k2Qkg3Tmx5NStOckJRYmcyZ05UZU5NZHg5RFYyVzZOWXRaQUJ0aWdEV1ZSTUN2V3RTdEVGOUNKVUtBQVdkRUZHdjNsdFptcGw3UDJETDNkbmJqcnRpUElaQUowZHJSYmdPNXE0MG9BTU1JRlJYSWxIT2g1QkUybjBFaVh6UVF5TVU2YnhBYUUwUjZHOGQ3R3VrMmhBcnk4RkNIa0NnUzVaZGFPQTM0QzZGdnA2UVBOWTdCY3paRVRVRmZQNndDN3Brc0o3ajd0bllKM0hPQlZQUXlORCtCVlliVUEzdlJsdXg0Nm1pU3IrdEg4bEpySHJ1enJaNTQvQ3l2RThSZXhTbmhDT3ZCdkpIZ1lKT0Z3UGZoY0YxRnJlS2FRRjVvdk80R0s5dVg4K3FhZEp2dFBlMGNiSnFjbTlGallTR1dxbDE0SFB6cXcrT2hpZlYzZWsvUzFqU0srK0oxVGlEaVFhOHVpVW9sUUpnNXlRbUt5ajRoMm53a0MzSHAwMnN6Si8wOEE4b2VTRXA1OTlneSsvZTBYTk5CbnlUNUU0MmJRQnZwTWhtSG1xSENRczBGUHFLdnhnYmExNVhEN3JZZHg3UEJlczVVdFJtc0FXaHJBamFVQkh0TTdqQUFBL1N2aG1xdGZhSzFmb1dwQUJRQlZIaEVZSnJjTjQ4VHgvZWpxeUFsK0VxZ3RER2N3TG5vWjEybnF3ZlIzeHV4N3RZZGVDUXNxaStaanNSSHB2ZTBCcG9jYTIzVlppWUNYcjRTb2hQYkNNL01OK2dIZkIvb1UrQTM0MS82ejhoaE9NVkMzZ0oxVWdOYVhnanRvZmhnd1R0VGVOU2hYMGRBbFExODZyd2J3aHRxOE85ckhlVUthejB4UGFGUmVRcXJ6bnI4d2o1VTFzb0t5VVNEM1VQbG9rL0xING5rZHRIV2hkSHJhNWdHNXhvQldKYkdwWjB4Qm1sL1BKMkprWjNjbkpyYVAxMWRtQTZFYTkvemFlcFZVZjd1YVQ5cE9uMTFZeDdlZk93OE9BZlRxc0JxcXdVY2hBWG9wQk96Y05vRHB5V0cwNVRLSVdBQ2VTdkxCL2pSRWFjTlZBZm1abVh2SEFYUlZvL25ZeDc2RVVQb0Z6bVRwb2pzRjlHUTF1b3pidTJNSTIwZDY1ZmE1MmlQTDhHQWYzdjdHbTdCOVlwaEUwOUdSekZ1RExHeGpRS0RqOVRTNjBjS1ZFQUtxclVQYjV6VndRNW5SdVdOV0YxVmd6aS9BY2VpYW5lanU2b0JhU0dlc0NxcE5LSEJUSmthajEyV3Bld2E5ejk3azV0bzZvZTlWWmc1MFpJSDlvMWtEL25VRXpvR1hyMFFvVkFqWUlBNzJCdHh0d0RmeDVzK24wYWY2VXlEcjh0T1hWQ0N3eTlEZ1RnQkk4L004azNqMld0bzc3RHdLV0VINFZrMVBNUFVUZ0taMWdTK05VeWloK2UzZldKMWtlT2JGVjVBVUtOK2FuMmhTdWplZTEwaXZ5YUF4MGlxUHdUMVh0WG55MmlUTmhtck1xNlRWcXBPWWw3ZXA2RjF2Znk5R3gwZmlDUlo5RXhXb0VUWlcxN0EwTjQ4b0RHdVhsZUxGUC92eVBPYVhOaEFCWUVFQWJzM0RLdzNlbmFPUGNPTHdUblQzaUJOSlU0TDhyalJFYWNQVjB1UjMxU0s0Y0dFQlgvclNJMkNNSVpNSm9FOVFNNVp0UzFOV2MvUzNINXZHSmxsWlR3Y2tLdzdBNjI4OXJIMEpBMlJRVWJnbzFXa0JvSnlVTGErNTBuelZpbmxPTkhDNkdJNXE1NFFHUnZ2WEp4eTUxekI1NlhhNHVMQmdqemFNRVZNOE9NRjZPVjlQVFBkU2ZpSWF1eFJvT0RUbWk2Y1RaV1F6RE5lTTVSbytOdmJzVW9pMVVtU0FoUUlQcUtZZEIyUkxXNGNOL1BwZDEvRm4zM0lIMUxrRjZoYXdlOEJkQXgvaTlVK3Z2ZHZXQkMvQTA3bzBDZkRVRk85MC85ajNRSWRGbjVtZUExaGQyOEM1aXdzZ2laN0xSUGp6NXFzR2ZLbkgvVnBnbkJLSFU1VlhKeGh0R2M4R1FiSHViTEtqbElvbGxNdVZxbTAzT0RTQWdjSHE1NjZuS2pKMmtVaGhoVkt4aEN1ejh5Z1ZmSjd1YWdNN0RSSG4rTWJUcjBoLzlpRnl1U3c0dU5sT0YzR3B6UnVYdDJFa1RxdTc3Y2E5NkM3bUVkZ25zeVdGZ1ptWmU1dHZOQm11RnNqdlRrUDBpVTk4Qlp1YlJiMW9RMjgvU3dKNkFPUERQYmo1T3JYOVB2bWxaWE5adEt0OW5kd2V0SVRwM1lDNzBaWVZHQnFoUXQ3YXBuc05taUIwVFAvVFFvRkdXbnVQdk0yWG10RjFaUzBMZ0NtTDYzeFFRaEcxUU9qSGszVHFucGp1T1lqR0R2VXNaak1lWXh6WGpHYlIwZUJLK2t0ckVSWTJEUHBaYzlVMUFOOEgraFQ0NnpIVmUwMzJwSHdLNnRXQW5UdlBrUVR1RkRnVkIwdDdqNEd3b1drZTRPSHdkdkxwVEFscHBINXhHcHYzY3krK1ltbjFpYUVHU1gxamQxeVNTR2FmQnNKU3dsd1ZKSzFiSUdrRWtLc0lMbWtaTmtQbGk4M0xhUnE3RDNEcnZZeHVHMFZuZDFlak1ralZPcVdoaXNJSVN3dUx5Sytzb1hvajZxODRNWDFoZVFNdm5KMUhVYTZ3Vis3TVE3MzRqbXluQ3lPOUtPLzRnUWxzNzJ1cndqc1dVbUZtbXZDYTBlUUJZRzF0QTUvODVJTjZoYjFscXRkQWF3TTlPUER1TngvRzZHQzM1dVA3Rm51bHVZUW1VY0dCMFRoWnJ0b2VGNENheVFGN1VSMEZkUkNBSlN2WEphZ3FQcG9mYkxPOU9ySlZZTGRSMzRsc29JbDFmYTI2Y0pQTjVlRU1qSHA3bmNySE5ha2U2aGtZOWd6bjBOdlJXRGRaMm9od2ZqblVBS1NBMGdKN1Zid1A4T0VDdEtscUsvNWlnRTZzQlRxWkFEdXRGMGg5TmNpNjRLN0IyQVBJRkl4bEFWVERid3JnS1ZoVFBoWS96U3dHL3U0dkliVUc4M0s1Z2hkUFhkRDNIdXlsbGFvK3RqbzNkWU5tUFlRODRUWXB2cTQ2cEdEaUpDYVJWRGN2cDZ4RjBzUFZ5SnlXZW4zTmNWZkpuWGN2dzlESW9MZWNoT0pUaFJoZHRRN0dPZktyNjFoZVdKU3UweFc5NTJHZGo2VmNxbUI5elN3eWZQeWxXYXptaTRpaUNCRVhPOEc0Mml0UFQ2aVRjUXhBTHNOdzIyMkhVejRaZ0JhYTdGOVRtandBZlBhejM1U09iWmdGdUdBR2pCWFFLL04xUjFzV1AvMEROMmdUdWkvMGRrdVFsOXF3ZW5BTjhITFB1L0ZXSjlOaGJ6TlRHbm1nTlhRZ3RnaVBHL0NrUUsvckRtNkEydDA3THdxeXpQWkdzeWVMK0ZTZ05PVDVwTlRnQUQ3aHhhRk4vcnBzaVR6S1dqRFJIMkMwcHpGdk4va1N4OHRYMUZ5WUFWSnpEd093VlFDZlBxb1ArT09hT3F5L3FwbzlMWmRtU3dCMnJiWFRjY0VCZDVXdXVNVzFkMWZMcDBDcmFFdzZxRFVoSmNDYi9CNUJnVHY1VEtueE5GSS9RcVZwVHAyNWhLSTZuS1RHeUZ3dE9SMzRleUtyQ0EvSndKbTY5SFJjNndTcVZLWFZpZTI2dTlVYjZnRHpwSkRQRzVDM3YxVnl6WUhPcmc1ME9pZkJWUlZpbXExWVFpZ1ZTbGljVzBDNUZOK1JaZVJYVTNoWUNiR3l2SWJOelFMQ2lwaHlMSmREZlBlRkM5clZMZWNjMlZ6R2NZckQ1UlpEamt5R0FVR0FvYUZlVEUyTnBhM3FQMDlOSGhCbnlUL3k0aXpSNHBPQlhnRVhZOEExMHlONHk0bTlOalBTVVhxVUppOTVjR0laRU5IS3pNMHNZR1d5QU9OK2xvQXppR1l1K1FUVzNuTW00K2kwZzFPR2VReExZRkJBSDBBcytsTmwwWGw1WmZhWDFTSENnTDIxemhJRVZKc1F3WVZ6azErdHdoL3F5bURuWUdNSHc1ZENqcGZtS3dpSlNWd0ZlOHRhTXVCcnNLT2c3MkM0TDNEbm41OG1EdWljUkZvY0hHRFhJSmlndWF1bnNzenVDdHcxaUNvQTlwam5LY0JUOEswRDRMbmlCVkplQXNEVE9wSGFXbGMrTXoySDJCdWYxTDZ4REVtQngyL3FBZTAwL0ZJeFNsSFAybGxUMWpJRktzZjZidFdtVEZkdU0xU21lOWpwWVJoaWM3TmdVM0kzazdnY0dQWm84L1hVS1BFQjZwTUlvakRFOHNJU09UM1BueitLSWl3dnJZSExReUR5ZWFQTnZ6SzdndG1GZFcyTzV3Qnl1UXdpYmxiWmczTmtNNEc0RGdKRUVjZmh3N3ZTVmpNMVlhM3dtdFBrZS90NzhmenBCVnhhV0pQZ1pBTzkxdUloVGN2Y2FQWHZmdE4xbUJqcEJSQi9iWDI5WFFiSUpYaHFiWjA1R2puVW56RjFtenJZaStkVUhRMGZaOHVmcWdDbjFnR1lmT3Bad0FCdUZzQXhUV2N5V3F2bEFYdXVYUmVrTGtrKzJScjArRm9sMWxDK3F0RzYyaG4yampZRzhCRUhYcHlyb0ZUaEdwZ3NNQ05GVlFOOEgraFQ0SStCZngxL0ZnLzNIMEh6V3NCTzZ4QjdUc0FXRWxRV0JiancwTkUyb0FDdnFPaHJhaFRnWWRmRmhpaEQ1TTdEMjlzRk9XYm5sb3gzTzJjd1Q3NktoMFFxYjZaNFFUNnlwUExpOGNtNlpDcllxRVdVZ2tsOThKUXUrSjZ6aWN3MVE5N3lmdWRqSmE2NmU3clFKazlsU3lySEg1MnVVdjgvZWUvVlpFbVNwWWQ5SG5GVmFsRmFkSFdKMXQzVDB5TjJkakhZTlZBOUFBYVlMZmVCN3pTYWtRK0U0Vi93SDR3Wm4vaEFtdEh3QU1JQVd3QTBjTG5nZ2dCM2UzY0dDL2JzOUhTUGFGVXRTbGZxekp0WHh1R0RxM004M0VOa1pkVlVEVDB0OGthNEh6OSszRDNDUHovSFZkMHJJN3lKc0xlOWkvbXN2SW1hRGkrd3QzT0FZdTRueW8xSFU4eG1jOWh2L2FlZjNzUE03Vmx2Z0w2VGE5QXZDdVNkeklVVlNxRW9DR2ZPck9MQ2hVYWRuUmRIa3plYjdWK3JKVFJ1L2V3NmprY1QvT21QUC9mYUx3TjZjS0EzQUdrMTVWNG54My83WDM1UEhwaGlPZ0VyUzR2Z3BuRnU4czhzQ0VJQ3J3VnAzeGt3NmNPc1dUZG1leFdqczM1V0kyZUE2Mm1EZTZiUld6a3NJejVrNEdnNENRWHkyM2tMb2lEa3JIdkhpRHlEWHE3d3h2bmVpUStkK2ZUUkZNT0oyOCtPZ2FzQlFVaXdONUxGQVovRkY4QWZBZi9XZnk0OXkxZUNlaExZd2VqTmd4MXpUNEc3QTlzbTJydnJlSVJwY0pvbkFIZ0IzaFNuNDJrRlBPMzlSNy84eWxkZXl0VzB6UlFKRC9vZFRkZ2tDRlBNVCtCaVFsV3dmS29kaHhqNVNSS2tKNVNUdWFQRG9YKy9BaTZoRldoOWM3MGw5NFl1S1hRNk4wVlJZSGRyMTR6UnU0OFBBTEMvY3hnOWt2Ym8wRnN0OWc3SCtQenV0cHRzNTRDK215SHY1aUNDbTR4WEFJQlNtTThMdlBYV3kwMXlkTDBKVVJQM0xEVDV5d0Q2dFZUR3JaM2R3R2c4d1ZjUDl2RFJadytyZ1Y3ZmFxQTJ3UGJLMVUzOC9kOS96ZkhMTW9VOFUxaGRXZkRqOEF6NkxBOGJYNXdjQnhLVDczeTY1SUdWelhDWHA4TDUwK2ZFQ29GSUI4RGp1UWQ2UGh4Z3g5UTlnRFBoS1pnZHo1ZnlNVmxnK2ZDTmJzeEw3VHN2d0t2bmUraDJUb2J3WCszTXNIT3NYM1F0bWpTYVM3QXZhL2RHSWcrc1RQMFd3Tzk0bFRzQnFhdWswUWNrTHAwNllMZUF5TURkazZUQnZibjJIb0F3QlFCZkFtWS9ESEJ5Z0E5L2VWUE5lZXI3NFhDTTIxOC9ST2hFQTAraFg1SzRpaXBPVThHN09YQkppMHdkajNvSkd6QngvdFhjbmpkVHZRK1c0ZmJwZUhpTVlUZzJIMlZGV0ZwWjBvZVBWYVhWUU5obSthbVBPWi9Oc2J1MWg2THcvZ2Q3aDVpTTQ3dW9UaVpUVEtkNnc0L1pmSTR2NyszaFlEZ1drKzBBYldVdENybjFMZklNczlrYzU4NnRZMk5qcFU3UTZ5Zk9ZdUNlQmNoZmIwTzh2TEdHdWRtODRGLy81U2M0R2s2RUNkeVoxZzNnYXBCU0R1Z0I0SS8ra3pkeDdlS2FPK0JsY2RCSHQ1djdPSURYNEozV3k4Q2FBREhlYmY1cHE0RzVkNEFzTFF1dVEyTHlJM2tvTDRPalZ5N01tODhEVGQvSnlvQWIwTHZwS1JsSGtZL242TWwzTklBZ1hKSDdlSzl0ZHJIY1A5a3I4ZkJ3am52Nyt1WG40LzdLSUZnWjdPT0FId1Y5U09BUGw4SUp1c1FWSkZ6aUZ5UmI3aGdFd001TjUybHdaeURKNDNEdDNkSnkwSFVBejlKZ2xwQktBSzhMandKOHdOZktHL0l3dng5LzhqVUtLbUs0bTdncnV5U1FSckV5QnRGVkhoSHVKMFdGRkdJbCtGVmllMFBhSjNFTlN1b1VlTXBBSXVET1YvY3dIbzNrZXgySnI1VENXb3QxODFTNmFTVmRJemVienJDL3N3OUE3K0kzT282dHFmZmZ4dEdSMXVhbnN6bUlDSjk4dmVXT21TM1lyUG81QS9qNW5LRGNhWFlGWG4vOXBUcXhWc3p4N0Uvc25qdVE3eS81amZHT3h6UDhxei8vbFFkQnB3RnpZR1ZhdUxudjVCbit1ei82TGpwNWpreHBMWjVyLzl3Y2JzZm11UWxmV01wWnA4Q0R1bC9mTGtEWFdSYzhPTnN3L2V1WHpHWFFwbk9YUHVkai80ZXkySTZJSTJUUDVCbTVEZ0x4UEpoRGRXeFh3bTVRYjJnMkZ6TmNYRDNabHJYN293SzN0MllhUUpRSFEwV0FXUlhvemN3MWdKOEUvVWpqbitvQXBHZlRSMWs1enhpbzF3TTcwNlRCK0xpNFBGNUVldyswZkJ2SzAzS1dEQ3ZuMHdCNEgrSVZ0Z2lQK1p6d3kwKythWS9neWZBVWpMZm4zUnhnVDBlTGI5YWRhY0NvSnJ3eS9UYTlDaFlXRFU3NU4zREZ2TUEzWDkwMUp1NEE0Z08rcTZ1cnlQUHlxcDE0MnMwa1N1V25xWnVNSjlqWjJzWHc4TGcyNG5RNngyUXl3MnltemZ5N0I4ZllQVHhtUU8rUG5kVmIzbW8veW5JRCtITmN2TGpoOXJTdmNEZWE1eUR0bmdYSVgyeEQzTFBudVp1Qy91VHJiZnowMS9lalFBLzd5NEUrVThpVnd2Vkw2L2pEdi9NNk1xV3dzcklJdmlSTmdxOEZTcmxXSGtTdU0rQTdCUkpvK1pudGZEa2FuMjNQT3dzMkRSOG1sOVZaOHo1QVVrWkNBTkFROFNCNHNpNUR5WFJQUHFJOW9VNEJDNTBNTjgrMjJxakJ1ZEdVOE1uREtjaDBJa0JhSXFVczJCQjdaZzJUQS9zWTRFZEFQd0QrVWdlZzRSWGo0YVVvZzdvRWRwOG4yM0JKMlQyZktMaVRwNFZMMTh2RjAvWjBFcFNmR3NBTE92OHM3Z240NHF2N09BNDBIUUYyRlBxVlhSSWNvNCtFaWVOZUFBQWdBRWxFUVZSVUNpL3hwZ3FlZGNMVXVoUHdxd3d2NVNvSXJTNlRkb0tjSWhYSjhCajFkRHJITjEvZGRaUFZLQ1N5enhsYWFmTWxVV285YWdPaWRMTkplUXcrNVk2T1JwaXlTWGxmUDlnVnkrZjRnVFYyRnp5cnlkdndxMWZQMVNWem9iRkFGZTVaZ1B6Wk5zUks5UEQwSy84bmYvVXA5by9HVW91MzlNcWU2bWFBSG9ES05SeitnOTkvRFRjdXIyUFJudUptNDBOcTduek52WVZJcFJReWM0aUxMYVFNRUFEcnJBUFc3Rzc5bk5sZGVSa2RyVS9Ub2orM0NuaUxnWnlJWjU5RjNzbXlJQytmN1p3bzNtMXhTZWx3bG85TUFiZk82eU50MjdyWm5QQ3JCeE96WE1UV2x3Wjcvb0VyQzNLYXhBTW11d2sxZkpPVkV2Qno4QmNkZ0laL0lxN1Q4b09PQTV5b0RLQUpTYTNkeVJSMkRNcmc3c0dXMFZ0cTNxRWdCK2tNeEU0SDRLMW5IY0NUOE5UUEh3Zkw1bG9EZkFvejIyQmJtbnNqSDBvRVZuY2U2dmkyb3owWlVVTVdxUXcrQ2MrR2dlUHhCSGUvdmlmZklYUEh5VmZYVjVGbEVmZ3A5K2xPMFRWOHlScDA0bWF6T2NiaktlWnpUYnl6ZjR6RFl6azI3M2JCTThBUFpjMzErcWpheTVkcm9iRVZkcWJjc3dENXh1TUtuVTZPNmJ3SUdnSjlmdThmLy90ZlNxQm1HcjFTeWdGOWJzRXl5NUJuR2Y2YlAvd3VBQUk0aUNJQWFUQ1FWSjQvTjd0N3pkcnZoR2UxZG1jaUQ1OE5NR3MvdWRHTjArN2RNanpEbjB3YVVHeFRIUS8wMWxuTGh0dVVCNUtPYS9CS3dWclJTK0hYTjN0WTdMVi9EWWowVFByeHJCRGZoRUpDRzdFdHVXTGFLZ2Q4V05EbjVuVVB5MkhhcDNIRlJMVEFIRFBGaDhBZWF1MUpjTGQ1WTEwTkVQTkxhTzljNCtleWFEb0s2SnNEdkxTZUJBRHZ1eE95SXdCZ2Ezc2ZEeDd0aWpKTDMwVWNKUi9xSTZRNkVCVkEzRGlaTnBGakFqUkpqNm9DTFVrNS9BbllKU05HbzlXVll6MWI1NGJEWXp5NCt4QlY1YWV5REN0cnRaUFB5c3liQlp4NkR5RldOeUJnTmkvY3gzUG40WjRiZ3k4Sy9WMFhUTHVuVEdFK24yTTIwK1B5eThzRHJLeFVudHYyd296Sk4rNk5kRG81SmxPelM1cjR2Z20zNys3aVAzeDgxMDJ1azJaNi9ad3JCWlVEbWNxUUtUMnovc3FaRmZ6K081Y0NNN2tGZkhKZ3liVnhid0wzQ01zN0NCeW85U01EYW1GS0R5YmdoVFE2YzlMa1h1b0VXRG04dVQ0MVJoOE9RemdaS1I1K2RqbkgyWldUamNOL3NUWEYvbWp1TXVHVzVQbGljY2hJeXM5RjhQVnFUZkFlOEZPZ1h3YittRjdlNXVKREFHbE5uWW5hR05pajRNNnRGRFllNHlOb09aMTlDc0M3MGdTUEJnQlBNYm9nTGFIcDYxQysrVTBkMXBXY0FKSGdMb3FUYlZ2cEpnRDVmR2p4alhOV1NkaU15NmxRQlQzaXVxNEtBQnpzSGVEeHd5MzJQcFVwVnpmV1hCc2I1M21hZVd6cTJuQ3p1OXBwdDcwM3hHUTZNMHZxOUdTN1l1NkJucUQweVhSQ202L0U4UmNHNUJzTDJodjBNR0ZyRTBPZy85T2ZmSWJ0L1dNUDlQQkFueWxBWlFZSU02OXhxMXpoYjcxekdXZFgrZ0tzWFh6WTVYSDg4QmVySWN1VDREaEFlMTVla3hiNzY5djBIWTBGZG1YT21EY3kyUGhjWXc4NkVWWTJHKzdrUk5EQmNQNXMwaDdGd3hkNkdWNCswM2hsbzNEMzkyZDRmS1RyaVZnL1FpTThRMG1iSjFJTzFCVGpFNXF2YTBHZnhhSHdvY1VsSGdQK0xsMEw2aFhBN2lTUEFIc1RjQzlyNzl6QzRRdWdCTjQyVGdqd0ZSMEFMMnZBS3didzRHbnFwOUZvaXM5dTN5dS9EQ3hTVmZPWUJMc21iV3FLZndVUTF3clVOTkZLcjdxZUF2ZXZFQ1lSMUlZZHBXL3FYY3YwbTdyZHJWM3M3ZXpCdllmaURzanpIRXNyeTYwU3JLdUN4c3hPVWs0Ung1ZmVFUUdQZDRlWXp3bmtadHI3RStrSzA2Ym95WGY2T245KzNTdVRaZmZiWjY3dnI2eTR4c2M2L2ppZHpmSFAvOTB2QUhnTjN2MW1iTVk5RkRJRzlGREFEMTdkd0tDYm1YRnBNSXVBVGtDQmdUQUFZYXEzWWFZellVSGRiWEREYWV5ekJXdXI2VHJBRHpia1FUZ2hVQzZ0OHgyUGNJd2VqczZ2LzdkOGJaNDhIKzd5REhqMS9PQkVHOTRjamd0OHN6TjEzd1puNFpmT0djMmVOYzVlQ25LQVp2TlJCcyt5cHUyQjAxK2xEa0REUy9BUVYyZ2ppTWtHSVZjSTdqYUJSdUFPQzdZSjdUMEI4TFlUNERzRVFFenpGanlwQmNDSEhRVUNmdlhaSGN6dGhDcFdFbzBBWGdTeWZNUm93OUFLZ0U4OEpIMVM3WHFNZDdWODlYN3RhZXVFYWh4WUdhMk5ySFc4NnVJU2dNY1BIclB0WTQyLyt3aTFObC9KL3Nrd09NYnh5Y2hJRWxsTjNuNHpXM3REUHdHUC9KSzZvaWhBaWtCVW1NbDMramZQYzZ5dExVVVNBbkJLbXZ6SmJMWHRYT1BlU0hkUmowOFFrZWpkRUhsZysvckJIdjdpdzYvdysrOWVnOVdBTlc0VE1tTTBMcUQ5aW94ZzEzQXQ5WFA4enExTi9PV3Z0OHBhTVo5NEp3QVk0R3F3OVp2Tlovamd3ODh3bTg3RlJEb0Y0UHZ2dllxRlFjOUVZNU1FbFFlNnNsV0FneVdCd3pLM0FoQ2NkWnlOcmZ0d3kwZlRrUXQxMkt0MFdWNC8wMFAvQkJ2ZXpBckNady9IS01oSllpUTI2ZkkxYzBZK3Ira3JnSlEyM1J1aHhQZ3ZkUGxRNUNQajh4R3EyL1pVbnBwOTRMRzBkZXc0MHNqdm5VcXljWWxsSjhGN2NCNDhuUkJ3ZlpTMGVUNUpJem9BN1FHZWlQQ0xUNzRPaWlCMkYzRlZGUlo5Yk42cVZ3TFdFNkZaaEtpNmwzSHk5RTRCeEZKZG5JWnZmVTJ3REsrbUxuOG5CTDI1ek1iWmpXakhvTnZyWW1GcFVXeW0wMGl1cWp5ZVdzZkFza3N6bk0vbCtmQ2o4UVRENHdrRy9ZNVQ0TGk1azBoaFBwOEpDKzc2K2pKMmR3OWo3SC83TlBuT2dqY2ZWMm4wLy9kLy9BS1BkbzdFbURXL3JMYXROOFB4R3ZxRnRUN2VmbW5WbWNNelY5QnlYYnZWNXpuWUs0ZWVDaC8vOGlzY0hSMjczWThtazZtK244M1E3M1VNQjBBRjFnQjU0bHlvYVN2Mnh6VjdmbUFOZkVja0ZlNHNFVEJkSGhMeVgxanRZbU9wZmQrT0FIeithSUtKbVUzS2o2NTF4V2EzeDRYWE1ubFhnTXkydWlHWVdnd1B4OTFkVEtxL3ZKU3hxdzBQdVBTRnRzN2FMMjZPQjVlVzg0TXZCd3JpV3REbG1uaWQ5bDRIOEQ2ZEp3ZDR5OEErZm5Ybk1RNFBqOHV3M3FBeGpaRlVnbkFrY2d4ZkczWXhIRTFqREtZMHgyUmVhdjJyUVRlbXhWZnliU05nblV1a2RabzRlYkIvWUhoR1VKN01jcnFUdkV2Sk9FMmxEK25hNTlxWjYrMFBBZHY3UjM2M3U3bVppR2VXenBIUzQvSjY4cDBlbDE5ZFRVNitlLzdINUgvNHczKzBoaGJXZ3MyVkJibXNJZ0wwU3VtQy9lTi8veXNRa1IrUGR5RHZ4K2dCNWN6NTFyMTZjUmxYTmhkZ2Q3bXo0S2QvN1l4NUV0bzE1LzNWMXcrd3ZYdUFMTXVRWlpxLy9WM285L3l3QVppcEhmRm51WTZkSElEck5BTWdaMzZ3K2VVNzNnaytkdHpmZENMTU9QblNJTVBWalpPdGg3KzNPOFhlOGR5bHhlREhOUlMyRE1IRHpIKzd0NzdiSE1mS0dvQ2dZRXNrTDVRN0FDNUtRd0QzU2NTR0JCS2d6dmlEcEJRQzNGbU1OTGpIVFBObHNKV3o1NDI4dnJnMXIxRHJqdEV3bnA2Mkd1QUpVdmFWcFFHNjNlQXpib0R6VDhWTUh4TWk5Q2xqWmhObWFhSTZkRGtwSXA0b1hyTkliVG92VHlKQ2svN0diRHJEeUp4VXgwMzE5bjl2ME1lQUhVTjdtaDJNS01kVDZ5VHB0ZkNoUXJwN09CTDcyYy81dW5tbFo5anpjZm5GeFFIeVBBckZMNFFtMzZvbnNyeTBnSXZuTjkxeitNSHlNZXY3MndmNDUvL3VGOW92czBEUFp0dG5FdWdkb0FQNHp2VTFyQ3gyMkJpMjdSeFlFRlgrMTJuRXdPN2VJVzUvL1FDNVl1QnU5c2JQTW1CeHNlZk05bmJ5SFFSUHJtdExyZDFwM2dMb3VXNXZaYldBSHA2WXh5MEU1RkRWcHRqSmdadG5CNkxEMDlUdGp3cmMyNTJXak9IZThLSEg0TW1hcFp6RUFNaUU4UWw1WUNaOHU3WVBYc3YzMm5EdzNYblNjZ2VnNWNWNWxaTGduWU1Jc0Z2Q3N0YWVHSE1Qd2QzR1llQmVBbU5JOEJaMEFyd3RqV2RpZVo4VTRNVi9JcXl2TCtNLy80TnZJOHNVSjJvTjhOV1BEVnZZT3JDcUErUWEwamJ0ZjYzRUpVQ0xrU1E2S3RYc3lyVHRlakxOYUVNbHF3bXZCTkhoM21GSUtlN2wySHpkQzFaUnBxZmNReWhiSDJRQ1JWRWdJTUI4WG1CNFBHRzczWmtKZUZRQVNqbHd0N3ZmRlVXQjFkWG91UHp6cjhtalpVK2t2N2lBOCtjMzBPbHdyY0YvZVh6c1d5bUZmL3B2UHNidHU3ditFQms3WWMzU1pGN0xCendRNW5tRzM3bTFpVzRuQTRpWjZWMG53Z09uWHVPdU1KMU04Y3RmZnlVMDkwd3BrNFpDbm1WWUhQUWtFQWUvUG96a3JIMWxUN05qcG5hdXdZTUJQK3NnY05PQUQvZS8vTVM3NjJjSDZKMWdISDQ2SjN6eGFLUTFjSmFHNEdUUlI4RWhJM0ZpQzh3TVdUM2dLZjlOVzFPL1IzSUpwZ0g0UnpDNjBvWHhvaHEvTU1GTGNHNE83Qnpjd2ZKYURlNjEycnVsYy9jUVplbWVpS2ZaSHVDZFZZSTg3NHNYTnZIN3Yvc1dmQmV6cHFBakQ1VWdGZkdzQnVFbTRDZzdaWlV1Smx4S2lPcEVud3hubWhkc0s1NnBjbzc1UHcwUkRnOE9TeHF2cTJjQ0Jvc0RkUHRwSzJOZE5UeTVPd0ZETWhQdkl1L3I0WERpVFBSK0gvc0N5T1NHT1BONWdkbHNqdVhsaFZnSzNSLys4Qit0bmlBendqMXRrRzkxcnVEQW1DMHVYZlFkR0Z0d21lSWdxQUJTbUJVRmZ2Uy8vUVN6T1RzdHpvSW1BM3F2Y1hyQVhCcmsrTTZOZFgvZ2pJVlBjYW9jak9tYjhJdGZmNFhadk5BYWYrYTErQXdHNkRPRi9xRHY1V01hdlRpT1ZqRVR1d05vRXJMcGJYSUREUjYrZWZVeWh4MEErNnVjREFEaHdsb1hhd3ZsdmFMckhCSHcyYU14Wm9YM1VFcSt6TzZNZXF1VSs5anVoL2NCWEpCQkwydTlrR1ptRHNibHZ4RHg2MHoxb1ZadXIvZ2ZhKzhEVUU4QnU4d1NvK1E4bW9DN2plUHl5V2lEVG9EWUlkRFNNZjZ3YWNMTGVWS0F0MkUzWDc2RTc3NTdxeFlFWWtDY3d0Q1FMZ253S2ZwRy9KdHdTRWR2RFlSTkJFb0VQWmtNbFBCL09xNk5yUFA1SE1QRElld0xFcE4wZFgzMUZHU3Y0VUNsbXhPNVhxK0RYcThqTlhuM3dSQ0dvNG5ZR01jZVVrTUt3bFJ2dDdsZFdFaDJjSjdZWlArMFFiN1ZRdXhldndjaTROelpkYmw1dndBMERaS3pva0NtRk80ODNNZi8rcS8veGsyNGMydlZNd24wOC9rY3hid0FLUTgyNTlmNmVPM3lpdHRyM3BuN1RUbzIzUysrdW8vRG8yTmtHVXFhdkRYWEs2V3dPT2haY1puSjNzc3ZmdDNsSi9tQnllYVcxakZOM1ovQVIzcmVRQ1F0VFVkT2kxOFpkSEJwN1dUajhIZDJKemdhejMwMUtJM0cvRWhkTnRlTzNYakF0K1h0bEh6bUI0UnRvUVY5RXVEc0FkckhxZW9FVlA5SmtDMkJlUTJvVXlnRFdYQ05hUDFvQ2U2V0I0dnZhTjA5TEZlUlRzbHFFQUs4NkFENHRKc0N2Q1gvMWx2WGNmTjY0amdLQWZEQ08wVmVFZHFNZDFXRVZIdGU0cE1DNURoaFJYamIvTmZ6RTRGdFVMWE9oVnAxeU9vVVRmWFcvM0QvVUpDRTk0dkxTOTZLbTB5d2JXYWJ2MTlOd3p1ZEhLc3JHdHJzMGJKaFhZNG1NdzNpWmx0YnY0d3VFeHE4MWVwTGMxNjhxOXdTcjRsN3JrQStNNU1QbEFJdVh6cm43c09KZFJvdzlESzdMRlA0MHg5L2p2L25wMThGd01rMGVoT3ZLQWl6NlF6RnZIQWdjK3ZpRXM2djZVa2ZYSE1HNlhRZlBOckJ2ZnRiQXRRNXVPdG5QUWx2ME8vR0FaNXIzbFpUZCtEbng5YUZCcy9IOXAybWJrNlNZNVlDOEhBMzdxLy9kM09GNjJmOXZ2MXQzTjV3am9mN2RuMnJIWE9IVDh4QWlwVkJlOWtTSkRjR3IzamJaQWJkRlFjekcyUlpNUFQwZThJemtJNEI4cE5jSmVpUGd6cThXQTZRcTdUMkp3WDNFSXhkWjRJRHZIMFNuUUJaVHRZUG5DY3JhK0w1NWVFUmdDY1E1ck1DVzlzSGlMa1lMRlFEYlJ6a1l0aEtJVkVZTFlXWFQ5akd0d0h0U29GYU1haDNqZVU5emI1Qmd3ang4dEsrdzZPaE83ekcxYlY4MmJDeTNzQTZuY3JUS1pTclpCY3lKT1I1aHJYVkJZY1Y4eUtlS0ZHQjQvRVVCUkZtYlBKZFFlUk05WHIyZmVHVzRTV0EvbVE3bGpIM1hJRzhQWDZRQ05qY1dNSGl3c0FCbXAySmJrRWJZSnEzQXY3bmYva0JidC9kOVIyQndGeHY5N1pYU21GZTZGNlVOYlY4NitWVnJBdzZjS0JGd05iMkhqNzQyV2Y0N1BNN3NLZmJXUk85N1Z6NFRvVGVNMzloMFBNVC80eUFGblkxc1BQbGJSSFR2ZFhDQTgzZlhwcE92MVNpSStIQ3laV1RnZ2I0VHQ0ZTRjY3p3cGRiWThmVmNWQWFvRzNQd2dFNitXVjhWc2RYcnFIendLUW9rTVd0cDdPZ0pETmt0WDk1RVFQS2sxMXlFbDQ1RGVzSU1sMG5heE5nYndQdXhqTUVkdzdHQ05PRWxjbGpTbXo4dlFyZ0pZQ3o4QVRBZzRDZi92eHo3TzBmSVhSUzhVc2hidlJSZUZhMzA4MEF2b3BMSEFRajlIVThtMFNwa0NTbXhWZUNjUzFTdDBHNEd0b0dXanhWaHNZakV4R09EbzdjdXhValhWcFpLaDFEMnp4blRTbkw0TjNFWlpuQzJ1cUNtWUJxNHRuM2g3eVgvWjFNWjNyWlhFRW9pcm1laVErNHZldmxMUHQ1NnVqWms1bGh1ZHhQeXFER3RSSXd6ek5SM0MrOWRDN1F5cjFtUy9EbTYwd3B6T1lGZnZSUGZveWo0WVJwL1NIUSs0NEJFVG1UU2E2QWI5OVlReWRUZVBCNEJ4Lzg3QlA4NnROdmNIdzhja0R1WnRTbnRQa3N3NkRYZFNDclFTb0ViQklhdmZHV1krbVE2L085YWQ5MkNOZ09kNkVXNzhxS2NHNjFpNlgreWNiaHYzZzh3cXpRYUdLTUdqb05nbGtDWndIUGQxQTRDSXB4QjV0SE10cTk1Y2NRa0N4emlWZ2VaQ1c1a1BVa1Z5blA5bkkwNVBJanpQd3NpekZnRjBBTno2Y1czRjIyeStCZXA3MTdVQ1lYeDlNd2VVNEI0Qjl2N2VQbnYveXlYSDZpVElQbVA5bCtVdlEyUnRZR3ZnUjhOb3FZSm1vSDJ2eW1JdUYybVhtU1NPbXlTL2lmTUpYS3lHRm41dkRnTUNEbjlVV0FVbGhaVHgxRDIxWkNxbnhzdzFZcFlIVjFNYkxValZza1pTczFtV3FOZmViT21aKzdkZk44NHAzR29TS2x5VC8zSU4vU1hPOUJpUWhZWFY3QzVzYXFCemdGYjY0bU5oblBnTy9PL2dqLzR6LzdDZXhTTG5GQ1hhWUVINnR4RXhHbTB6bDZPWEJwUmVIenorOWhQSms2NFBiYU84U1NPWld4WjZXd01PajZ2Zk9abkU2alp5WjJ0L1V1NjdSb09ybDFiV2grZDZBdVRQaDJlMTJuUTJQUXpYQnhMZG9yckhYZjdJeHhQQ25pSFJGbVdkQXBlc3VIZGM2aVFENCs3eVM0WHg1UklLUE9pWVBGWUYxZGxRYnVMc3V5RXV3WkFNY0FIUjdRSlk2bmdUMEVkNEJscndyY2JSeDN6NENZeVVHR0RxVjRFZk44akRmbjJ4TGc1MFdCUC8veFJ5SmZWbGIySk84aWpTY2hFUkR6cFJMSE1uMnFIVSttbmVKZlExZ1pIbmRwVENuenE4U2YyanhXbFdwVHFacEhld0tzeFBoNDVNNXRkKzlPRUhGNWRRVkxxOHR4bm8zcjdNa2NCUmxlWFYxQXQ1TjdENVprekt3UDZHM1lDekVtVHloQWdhbmVtdTRMZEx0UnBleTNEZVR0VVRGZVczL3B5amwwT3JrRE1IZHlIRWlEcWpHbGF4TTY4TW1YMi9pbi85ZEhmazk3UTgzTjZINXMzMC9XbzRKdzQvSTYvdUM5YThiZmEreWFkeWJYeGx0VHZkWGl6WGk4MTlTOVJwK0JIQmdycHRHYllOY1I0V2ZPNnpDS0FxeTdUSURyK0lDUUtjSkxtd00zRE5ERzdSek5zSFU0ODRLbFBod211MVhvUzZueCtFU0NnRXlZc21FTUprbFpnRkVDUFVPTm5oSi9ucmlLaWlRdktva2hOSFhpUENPeTZHekV0ZlpHNEc3akNIQnZvTDJ6ZUM0V1N4K010MjhjMndNOEFQejB3OCt4RzVqcFR3WGdDVEhmd0tNWndGZTE5SEhTZEU4ZzFybW9CVGZHOC9TQTZNbEJ1WW0vendQRi9Wc2xVaDE4ZEZDZTAwSGluckMrdVluK1luUloyY2xrU2RMVngxdGVIcURYNjBDK0hQN2JrRHRGZWpjeldqeWZmRWVFcUtsK1BpOVNiZlp2RzhqbnV2RjM0QVYwdXptdVhEckh3RThER2dIdU9GbXRaUnZ3em9BLysrc3Y4T09QdmhGYU84REEzVmtBMkRDQUFmemYrOVpWdkhadFV4eDhJM2EyZ3grVHordzYvRXlQeDVmRzRtMG53NDFmTTVNOFBGRHpvMmF0Znlaa0RFejNOaS9RblFrd3YvT3JmU3ljNEh6NDBiVEExenRqb2Fseml3R1l2OERzb0RPZ3RYdHkzd0FadVN6UWdkak1mTlk3SUdpbFhWOG1wdEgyU1VsdE5RVGtFamkzcFl0MUFiaW1IZ0YxWFE1TmdKMjhKbTdiaFRCZUN0eHR1bHd6TitEZXhqd2ZCWEJudlVpRXMwYnM4ZlkrUGdyTTlFOFY0RXRjbXdTMk5kT2ZWcnB0MHl5WFFTWExlSkdWYm1JOG5sRFU1aEdTSFlkNHdPSEJVWm1DdllzQVFBcllQSDhXdlY3UDBiWnpxWUtySmd2ZDRtS3ZZbm1iS2ZzaWFCM3N0MXdRWnZPNTMrMk9IMXBqVFBUY1pKOXd2MTBncjhjNzVGdFBwSEQyekNxV2xoYll1RFM1TFYwdElJS05tU3VsOEkvLzVHZjQ1dUdlTU5uYjhYaXZ6VnZ3OXgySUxGUDRlejk4RmVmV0Y3MFdiem9QRHR4TDQvSkF2OThUSm5WaFdqZitkbFk5M3dqSGErSUlaSkViNFNpUGg2NWpvTnlmRGx2c1pUaTMwdDVNWHhEaDl0WVl4TjR6MGFma0Q2NFRab05JaEN0bWFsZGdzL0pMNnI4QkdmSmw1UGJGVVM1WXAyZXVaaHA2c3orSjlDaURQOFJucTNQRXdEa083R0N5TVo0dWlDck04ckU0SG9nOUdJY2RnNkFUWU9Ya2FjREt6T2hMUE9NQVA1OXJNMzNCVUwwUzRDTXU2bDhGOEZUTnRSTFFraDJNa0g5RHdvbzB5LzVwd0cyTlVTZVBkSEorRGJUNDArZzRUS2RUakVmaitvZ0syTHh3RmpsYlZuZDZaWnQyOXQxWVhPeGphWEVRSkZDdTQzVHloSm5kdTk2dWt5ZGl3TzVOOWZQNXZEUVVadHh2eit4NnJZVm5mandiRUFENTBwVnpRdnNtSXE5VjIzRjNCc3J6T2VGLyt1UC9GMGVqaWVjUHE5bkQ4Y2tZVDdzTmJyK2I0NC8rMHpleHZqeHdFK3R5bFlGUHRsTmd5K2VVWGo0SEpyc2NEakM2dTJMNVlxRE84K25HOGcycUt4Nm00SGZHTTNKYm1rd0JWelpQdGx6dW0rMEpKdFBDbVJGRTJjT0FySlBYZjJuSy9kY2c0Wk1PaEZBc25JT2VUWXZBZ05QOHNoNE5BV0xQKzFCYnI5TFlvd0FlQWZJNlFJK05zVnVOWFhRNmVGcVc1MG5CM1JhMUxSOEc4QzUybFhuZXBzRUFOUTd3NVE2RDlmdWJqNzdBN3A0MzA5Y0NmTkJPUldHeXFsRnVBdkFWWUZ3YkVtZFF5YW1xQTFHVGZFQldMcHhLbHNteWxEN3hUa3ljYVJ2Z3JuWWtmcG95dGQ1K2xyMHNYOTdCQkducjd1YjVjOGl5cWtuRVRYTVEwc1hqNVhtRzlmVmxMQzBOeXFUK3czRWUvSnZoUEF0WTA3elY0clVtYjlmSDh5VjBSV1FQZk9OK2V6UjVEVnBtcGJoZFJzYVdWQzB1RFBEeVN4ZlE2WFRNZUwwR0FtZW1OeUROTmZiZGd4SCtsMy8xVTFnVE1kOTR4bW5TekE4VzZKWEM4a0lQZi9oMzNzRFNvQ2QydUxQZ21ydnRiUFc0ZkwvWDhieERvSXhxOU53U3dUc0NERng1MmRqdWc5eFd6dEZjV091aDMybGZuZHRITSt3ZHp4d3ZKemZEV1l2akR0VFpwamZhUnd0dE5VSkY1TUFaNUVVbUo3QTA2WU5zSVRGbnpja1d1S3o1Ty80aE5NSDRjcHdJa0VjQjNZdFROc1hENFh3YzJFOFozR1BhdTB1UENXMmJmdzd3emlyZzBvd0FQTXZ2MXM0K1B2ekZiVkVsc3NTRHU1WUFYdzFPelFHK0ZvUmpmR285YXhFMjhFb0FiZ3U1R2tjNmJYNE5vN1hCODVTcDNycWpnME9OZ29COGR3TitCS0RUemJGeC9teTVqVWk2K3JwTCtROFdldGpZWERHVDRGSlNTVysvbkJmK0pUV1BCUlhTWEE4SVRkNmI3dWVoSWNXNjV4N2tHd3VZWlFwWngwKzhBK0NWUkdNQzNsaGZ4cHV2WGNPNXN4dHNJcDB5UUE4ekFjK1AweXNGZlBiTk52N2xYL3phYVBtQVhZYm10V2I0TU1BQnIxTEErc29BLytBUFhrTy8yM0VkaDNEV3ZaMkUxKzkzeFppNjNvOGVUcnYzUUc3OXZIWU9kcDlCaG1uVFBqUGRCeDBKcFlEbGZvN041ZlptK3NtOHdQMjlTVHhRQmJkOGZUNVR3ZTF4dGdqWHdDZmVXRmVmWkhtU09ZSld6dFMzWm55ZHFMUVJWSUZ6bXlzVUt3N29DRUNkbUg5ellQZEw0UnFBdTgxakROd1IxOTU5cDhEVHlBNEJvM0Y4NGdBUDByUHAvK0xISDN2LzB3RDRhSGpNb3lrZ1ZRTjh2Qk9SSm96SlhDdEp2T2NSNFYwdW9FcnNxY1dwUktjaXhUZmg3OHN2MW1WSnVacFNxU3MwQW9wNWdlUGhNSUJSU3R3RDNWNFA2MmZQaERiQ0UvZGRRcGZsR2RiV2w3QzhZazhvUmFRaTR2Y3h4Y1BLWDh5TkJqODN4ODVTZkFtZHZTS1Q3MzU3UU43T1lIZWFMeEM5ei9NTWx5K2R3VnR2M01EbXhxcld2RWtlR01QSHpsV204T2NmZkltZi92b2VITGd6Y3pjMzA5czlEdmlCTnVmV0YvSDNmdmdLdXAyOFBLdmVhTmhabnFIWFphZmF3UXRkWlRtUUdyMDB2M3N3RFNiZ2lZNkUzb1RuMGtiN1lSc0NjR2Q3NHM1RGRoMFFlUDVBYUlMM1BWWVZmRzUrMVlPbTRKWUlEbVFzQmtCd3d3R09zMFY2dGxHT0M3QjBESVFGT0RlNUtIN3h3TkpmQXRRRnlJYmFpTXV1eTcza3c4cWtCTzRNV0V2Z3p0TnZvTDJYemZNaFRkaHAwSDRmZnZ3RmRzekpZVzBCUGtiTEh5dkJyU3FzUllNZUE3OHFCcFdzSTRHVmdGbnliNHRFRmZRbkFyVVRJbUVEc0k1N3h3TkMzOE85QTRpWEZleGRvM0tWOVJjSFVIbG90bSthdDVET1AvY0hQV3h1cnFMWDYxYVRHb0hDTDhCL0gyVlpDamU3M2k2bmswdm92T2xlQXo4QWgxL0duV3d0TkhOUEcrU245U1RhWlpsZXhxWWJQbS8rbFEybnNxb2NGaFo3K1BZN3QvREdHeTlqTU9nR1lPa3ZDOGovN004K3hyM0hCM0JnenJSM2JxWjNzOW96T3k2dWNPbk1NdjZ6Nzk5QW5tV3dNL2o5OGptRmZxOGI3SFFuTlcydXZaYzFlaExnSGR2Q0Y1WlA1THF3M2tQM0JMdmFiUjlPTVp6NDgrSHREZWZrZTVYa3lra0R1RVVmUnMwcVNuY0hTRHdyRHZsVW5vSFBnc3JJSElBdWYwNmlkZ1dhSi8rQzlHTWRDZGNScUFEMlVHc1ByWGxPc3o0aHVJUFJPamx0dWZBMms0akZpZEY0QVh4L1N2dHQ3WndjNENrV1VBWHdGT1VzZlNLb1hTVkRJcGtHbmxXU0JQNDFIWWNxQnBXODQwVlg4b21KWGwrK0ViNE50UGhVcVRTRjJGaUUwZkVJcyttMGhvZlA2M2c0UWpHZmgwSHBCS29FSkVCbEdWYlhsN0c2dGdTVmhaRW9lSTQ4bXNwU2tNLzhQNUUvaGE0Z3ZTMTBlQXFkdlFjOHdMTXFhWXloS1pmY0ZmK1UzTGdwSVJGQVJXRTBkMkpnYlVERndnUkJneXdBS09EODJYV2NPN09HdTNjZjQ5Nzl4d0E0VUZxVHR6N1E1aC8vSHovRGYvOWYvUUNML1M0eUVBcWxITmpvZ1g1eUNxdUNNbVprZ0pUQ3k1Zlc4YmUvZlExLzlmT3Z0V3dXNkpVZWo1L05acTdDWmpQZGM1dk5Dc3dMWDVrTGd5NWV1bnpPSVR5M1ZIQ0F0ZmtOL2FWVFdCcmtXRnRvWDRYamFlSDJwVGVHRURGdWJvdkNwNlJjNCsvdUZjd2U5RjUrK09JenVXQXZ2REhuMjc2QjZ5T1lENFAzNEswQXBEekkyclM1MlpuOVBKRkw4dUFhYmpwWWNJa0Jqd3NKWlhiQUcrTUhxV0VIZnBJbGliZ3A3WjJuSWVZZDJEcGc5Rys4ZWdWZjMzbFV5bDhxajZXOGxqMmZHY0RId1M5TkdFdS90Z1BSR0V0U0VKMXlKK2cwbkpUZmswUnJXQzVWM2dTdHphK2QzWVRvY0xLSzRmVS9QQXkzVXo3NTE5OGI5TEN5dW9oTStSVmRvcTVLTDE0YTlHUFRpU3haQVlLYSs5TTJpL25jYU96ZTRteTRZRDR2M0RQNXBVNko4ZFRtN3JrQStTelRCYTIxR1EyZ1JCSUEzUzlUbGZVRXJ3eWRUT0hsYXhkdzZjSW12dno2SHZiMmpwZ3Azay9FMnpzYTRaLzhtNS9qdi83NzcybXRuUWhrZ0w2QUFUQWluWDZoNHhQOFdQR3JMMjFpT3AzaGcwL3VpK1YxeDhkamZQTFpIVjFCS2x6anJzeGFlUURRTS9CMUI0VjFYQnlRZTBRWFdYZGc2TU96RExoNHd0UGw3dTVPb0xWcG41RGJvRWIyZFJqZzZ3bVJZdU1IaitoQnE2aGNmdHlIWXpwTUdxZjFqZGRrTFcvRHdRRTUyYWlhVnJrWkFETEpKM1VjOEpxUkNjcFd3TzY4NjhHZHgwdUJPNC9QeXl3RStLcE9RQWp3SU1MRjgvKy92OFFBQUNBQVNVUkJWSnRZWFZuRS9zR3dOcStsUEpjOWY2TUFYMVdybGU5UUxmOW9qcXNaMTJGNGJlY2hrU1kxS2VNSTMxWmFmTDEvdTZFSnZaZjk2c1k2a0NsUnIyRXVpL2tNaytOUkxiLzRvL2RYU21GNWRSR0RRZDhrVkZQZ29yRXBtK290ejFRbndNK04wVUEvbmVtdGJaVUNzb3hRRkJteURJQkJvQ3pMbk5uZXVDY0crYWR0cm04SThocTlpL2xjamw4akFEL3lwaEcvWk00UllXSFF4WnV2WDhlYnIxL0RRci9uZDhSajErMjd1L2pmLytMWGJIeGMvNHFsYVVaVDF5VEcyR3dFZXV2bWVieHo4N3pZL1k3UHZNL2RmQUNJZVFKMk5yN2ZISWVOd1F1ckJWL2lCMGFyMVcyYi93dXJmZVIrM0theGUzd3d4WGc2RitZQnhTNVc2T2FIUkxyT24ybnV2TFBnamZVZWptMG55Zm1ZajhLdW83Y2d4SHZBeXNmVUZLNXpBTGh4Y3pxbEMwdzJ1Q1NDeTFQeDNBbnpQZzhOVGV5MkRNZ1BRc1hNOG1LR3U4MXJ5VFFQVVdaYURvSXp6enQ1Zk5ueU5PQjRXejh2djdPVUFIajlsYXVpVko0bHdLZGNGV1U4TEFFNzhkNUFNMmxxT2c1VktWZkhxdXNCdEhVbmlsUVJyYXBDR3lSSDVkdUNDaHdlSGpML29CN01lM0o4T0pUbGVZS3NkWHRkYkp4ZDl3QWZaVlpxQ2VKNVlNSXA5dXhqbDNubzc2elFkRVJ1Mlp6K2RKVlRiSU9OY1Y1OGtPZG1kVHZlWW92SDdRUm53VVFwWDdodWlKZmdOV0x0dWJHK2d2ZmV2WVZyVjg4anp6T25jVnNOKzROZjNjZS8vWTlmZUJCMVlBc0g1bTdTRzZUWlh5bmcyNjlleEswcm13elF2VmJ2TjhueE0vQnp0cEZPT0ZZdmpwMVZkalk5LzRORFVqdXJmWFVoeC9LZy9lRXpvMm1CcmNNcEhJUXFubC9uSGR3cmRxSmNZSnB5OXlRNllHRGU3cGZOemsrMkZYWnBuck1ZVVBCUndYMFFUK3JLSU83QnZBem9jVkFYd000UTF3R3ZLeHJibVVpRE95OFREdTdFNWJVeGlBTTNQTGpiOUJ4ZmxnNVBnM2NDR0QyQzlHNitmQUVkczErM2V3V2VFY0RIY2JSbEkwL3A5Q1dMeUYweW4vVitKd0ZCaWdoYmxpVmEwcFg1ckpRNTFHS3JhQnY0cDdUNFNsOENqdllQeFhjZXEvc25NdFVyaGVYVkpheHZyc29EWmtTYTRidFZCdWw0dWlUYlJORmVlVnE3TEJ5a2owalBjelBSbk0xN0FpaTI4OTF6RC9LMUFsb3RYaWtGbXNmQVFqbFRNdWxINit0QVdlNEZyOGZ6c3l6RGxVdG44TzQ3dDNCbWM5WHNXR2ZYMVFOLytiT3Y4UjgrdnVOQk5RYjAxazk1c0xXMDMzL3JNcTZjWDQyZkxhLzhHbnA5bjdsN01DMmRyNVYzbG5obFh3ZzVJYzkyQXJxWndybVY5bVo2SXVEKzdsZ1hwTzB3NkJEeGtrb0xDZ2xQQjlDSzNRTUFjUS95dE1vSCswcU1JQVhudzU0NTFQSW5KWTZvRFM4RVYxeDdSOEN6Qk9aZ29ySkxVRnZ0bVNRWmVMcTJZV1l5d2ZJSXRIMHloTW0xOVFHNGw1Ykd1Y1lxcmIwN1h2QnBXM29LYURyZERtNWN1eGh0ZEdWdHgrdXpIZ0FybXY4SWtyVUM0TERocnFPdkNaUnBWOFJtNVY2VzV3U3luTmkxNTFvZG82cFNHeVJYRVQ2YlRERXFtZUw5bXpVWmpUQ2Z6ZG9sWUI4VnNMcStnZ1czRDM0RllKZnhtLzNHVGZWQW9QaUVZYkQ0WVpROFpBYmNzNUlWV0tuc2hRVDVTazFlZzY3UFpFRnpBVElhNFB6TWJnTVRjT1p6WVhMbUdyaWpRci9Yd1NzM0wrUDFWMS9DNHNKQW5GejNiLy82Qy96ODgwY21IYjc3bmQvKzFtNUJDdzdHQnNSLzkrMHJPTCt4SkNzcmd6OTczb0k3eTZQWDNPV3lPTzV2ODhmRDdYVityY2VYVnpSMmp3OG1tTXpzVnJpMkl5RVh3b1ZjL1ZnVCtSNm5MMTRBNXRVM0lGNXEvNHlIcEE5dUJKSW1NSUQvQnFCWUJkY2wwQTR2RHJ4SlFQZEFtZFRXald4TmdiMDBXOTRRbDViRXVRSk5nN3NEZUp0Q2tKNW9tOG5CdTQ4VHRRcDRFLzVycjF5cEFkWDJBQitwYVVseUNnQ2ZSSlU0Y1lWRWFiNXB2R3NMc09VZVFEbS9pVklyUjYzMDUrOWJTcFRJYmExcm84WEg2dkp3LzhEeklGblV3NE5BaTI4cW1BSlcxMWZSSC9SOEpQbkJCTXdvOGh4NUxQSFE3V1RZaXJrTjJwaTFGNkRTTUcrV1pjanp6R3lJVThwYzQ4bnJLZmNiQm5tN3c1MHk1dm9DWEk4bm9TR2FPQzZ1aFVNUFJrSWpOZitzaVg5MVpRbHZ2ZkV5cmw0NWg2WEZnUVBkUC9uTFQvSDVuVjNmdVFpMGR1M0hnSjZGNTFtRzMzdm5LamFXRjhTUWdEWGoyODZDcjB6UFY1anREWUlMNEFlL05OKzFoUTRXZXUzTjlNZVRBcnZEbVRUSHcxaEE0T1VJNzIzbXVWYlBOWFRmenlLNGNYdXJqUE4zVlp3VmIxZzVwWjN0akFmV0lTQUMzMW5QQWE3cFpOaGhCRWR5Z2tzK3NqOEI2R1ZOM1gzajNEcGc1ZlRSbktzMXlVYzBkNjZSUzVON0FPNEJiVFE5Z2dOdkh3ZU9sNlRoWlVOWVcxbkNoWFByNEM0SmN4VDFyUS9qSkJFVWk3YkhhUzhacDFLR3lGM0ROS3I0eC93cmdocXphZTdhYzZpT1FSVlBKMkZlNWpBZUhtTStuUW1RdExTVFVWekxyM1FLV051d0FCK0w1MThHTVZSU0FuQXEvUTk1S1BrSUVKQm5ZQnE2VlJ3QlJjU0djcTFXcnpsTXAxRnJ4WXV0eWN0Q1VNSlV3WHQxVUJ5UWpJWnRDWlhIRER0N1cwRnFsUnpBejUvYndCdXZYOE83YjkzRTlXc1hzYm14Z3Yveko1L2g3dVBEV3FEM0I4djQ1VytkVG9iZis5WlZyQ3oyNVc1NEhOeVZuNFFuajd6MWdHOG4yMlVJMThycjhFNm1zTG5jM2t4ZkVQQndmeUtzQWM3Y2JvY3BiRkZ5b0hlRjd3dVpEeDhwSG1iTFBsTG1BSnRGN3pwTHNLZ0NNR0MzSU81Q0dNQXBzcDBBS29GcjQ3L1FaQzh1Y1ZzQ2RDUkFIWkJzbkI5NE9pRy91TlllYXU0YzNFc1Q1aW83QXF3OHlVb0QxbmFWT3hZeEdudi8ycTJyTEYvbE8vN1lGbHlGejJrQWZBcFFxK1Jya2taY3dBaDlJbTlWaWRiMkFPSVFVNVhYbUw5bmwwaXdMbnUxY3RhN0toWkgrNGVlaHZ6dnl1WkdEWU95NTlyR0tucjlIa1JoeEFvd3lZTy9NRlNxQy82c1YyRjVUNGRyOE5aYmZZS3AzdXpONG9SdDMvTTh3M1E2aTJueHdJc004cnlIWTdYNVlsNjRGNUNiM1VGd3lFT2VnZWNGZ2oyMjFHbjZZQm94MDBhdFg5N0pzTEcrakpkZU9vL1hYbmtKdjdoN2lQM2hwR0ljM3VqVXJDTUFJMysvbStNSGIxL0JRci9qQUZxWVk5ajRpeE5kU1JtOXY1OXdwMWcrTnBlN3dkaFBNN2QxTU1ITWRwNklNRHdlczN6WnNtZTlVZWEwdGt4d014L0pCZWp5OXJBbENsNlp0Rnk0ODJQZ3pkSnh3QjZnSmQ4L1h3Q3ZwVGNGVXNMcjFCWHlDYTRvbUxPT2hKTTM0S3VqaGxhQWtIZFphd2VUeXdFdjV4bUF1eTNTS0xnalJ1dE43MEo3WjUrVjM3aUg4V2J5ZzRBcmw4OWdjYUgvbXdQNHBvNnFZMUhpcVRhZFFNQlVQcU5wVnpDUDVidDFudHNrMkNKR0tyZHgybmlhbGI2UndPSGhrVG0yVlZJUEZoZXdzcjVXeVpVN3JjSHpYVUJKM2xQRXU1WTNsNXZFTTkvWVN3OUIyOG5lY08yL3hqdlRyaGw4eVBQTVRRU2NUSko3M3J6SUlBOVljTGZnVmN6bkVxZ0pEa2c1NEFGQVpvNUdVNFpaREN5ZEk2dkY4bzRCNnhRb0lNOXpmUHpOSWNiVGdwbk5qWHlaWW1uelNYb0dqcFhDWXIrREg3eDlGWXVEcmorOHhsUXUzdzdYVHZRTHo0djNWb0x5dGRqTHNkaHZiNllmanVjNEdPbDVEbFFVdUhOM0M5L2NlWVFIajNaMVEyNlIxOEU5THpaeWhlbkFsbXY5TEtwaTVGNzFabVVkb2lnb2lJUG85eVdBRStTQUswVHVOaWI3NnFWMEVzd1JTNDRDK1Jpb3R3SjJBZFlrK1NiQjNUZW9KWEFQMmlDWEV4Y1UwZDdOcytnOEVKZGYreW1sY092RzVYaEZQUldBRDd5YVlHZUtVWnBZM2pYRTU2cDh4dnlySWFraU5CQXNsb1dVTEpWeVAyc3R2aDZUblN1S3dzMml0OStQWmJLNHNvekZsYVhhQk5ZMjFnekFzNCttUk1mcm45SElEd2JKc21jdUM3VDRUcFl4eTYxdHcvV0pxUnI4Q1htZUNVMStOSm9rcXdVdndHWTRTUUY5SmoyWVRxY3pweDhxbzYyNURWVEFUTWpLckd2WFRSQXkwZ1ZKeUlUSkdiQ0FyMk9Mam9MUStuWFlaRmJndzYvMjhPM3I2K2ptdWtLY0RjQnBzdVFmaEhhcmdmNzdiMTdCMy96NlBrYVRtZGdWTCtPZ3h6b1hDa0N2bTZIZnlkSEo5WXo4VHFhWFdJRDBXZS9kdkgxZnJDZ0lqdzhuVUFDbXN3SjM3MjloTko1Q1pRcDdlNGM0UGg3ajBzVk45SHBkRUdrTGg4TjlJNlF6SDlsQVYxN200K0QrcnVKUUJpMFg3Z3VNZ2c5SmR5Ylk1amsyRWdPd2dJVWpJMFZWSDBtdGF4Slh5aVhURDVuVk43NWhHWVNObXNRc1NzV0owb2ZnTG1WSzA1R0k0em9aeHVQV2pZdjQrUzl2b3lnS3hxaDBXL0k4Q2NEWE1VOEJmRnM1R2dGOFZlZEIwTGQ3QVFXNHBNVklSVzRiMElwVnFzN2l0UEUwSzJrcjhqMDhPTURpOHBMME4zV3dzcmFHWWpiSGFIZ2M0YTZ3dHJtS2ZsOFBhWmJhbDFJOWh2ZVJzQVRvODJlOWtadjJjaE9zRFlHenlHYStlYVE1aVdIWW9pQ014NVU3MXc2ckFwdTRwNjNKNzhZOHhmZ3cwK2FubzVGb21QeHBRQjVzTmJaNjRGUU1NVlZRSVpFVGZXQW40akhyc25DanlSd2ZmYjJQZVdFUXkzVWFUSnBaNWc2bnNabngrVkZZNkhmd25UY3VZbm1oSzhibGxRSm1zeGtLczNYdm9KZGhjN21ISzVzTHVMUSt3T1p5RjZzTEhTejFjL1M3ZWhlL1RxN1E2L2lPU3h1M2RUaEZVUUNUNlJSMzd6L0dkRGJ6OHdJeWhjbGtpaSsvZnFoM0IvU1pMSmVWTGZSb2ViSEpqaGFJaVZzOVBKMDMzM3RHNHJzVHBtWFN3TTNSM1pBSzB6dXg3L0FKTGlscGF2d2U3bnZubDJWUzB0aER1VXlNa2trZUJsQ3RWZzFmVkNhR2ljZmpwTTM0SVhBTDdaMlhNM3djRzhHWEpka3FjZW4xK3oyOUpUT3ZNM2xiOGt5QmhaY2xIcmtSK0tiaVZNcVJwb2w2QlVKV3BSSHpyd2lxZGtFQnhBR3plWnE4VFQyUlFDZk5TRzFHeXhGbTB5bkdvekdMTE1GM2RYTWQzWDQ0TjBsaGJYT05tZWdyRW1ZZm5uaHJTaTlrNU43UitPYzhVKzZ4YS9ka3liS2c3ZmNYNW9YUjVEWGQ4WEh0NVBuSGRRUjE3bW1EZkZSQXZvc2NIK01lajhZZWNBQncxWkkzK0xZUlVncDZ6QmhNTTNabWI5bWpjbW84SU5LMGNUeFlLd3pITS96eXpqNkk4UldhUDZzMGIrajJGb0ordDROM1g3dW9KK014WU0yVVFpOERybTR1NE9MNkFLc0xIWFJPY0xoTW5Uc2F6ekdjekRFYVQvRGc0UTZvSUxQekhyTXNaRnBMdnY5d0czZnViNEVLRW5tMWp0ZUh2eU80b1JLQjJ3UjVlTHo5WmR2Uk9uOERiRXFWUDBrRlAzTWVZRUFya0FnZUJsditWWmpzR2VaRnJ4aW9pemE1QmJESFpzdmJ4cWNTM0YyNUJQU2lpQ2hJRHk0dGNQbkNZclhBd3RLME5LL2Vrc3ZwcW9ER3c5TlRCdmdVbUFhdllmalVIR2lyMDlZL1plSnEvbVdDY3I1SlBsWUtVaGxRSlVXRlg2cmt1Rjg4elVxK2RlVkt3UEJBYm80amZoV3dkbVlEZWJkalBKVXgwZmZrZCtIZVc4SjhQc2QwTXNONE5NRndPTUxod1JDajQwbGNBSkVlSmN2RFB1dDVWb1JPYnZkQzBlMGtYNDd0RlVTWTgxbnM5clZGblJZL2ZmLzlIKzFWRVRSeFQ5dGN2eFh6NU9ZS0Rwamo0eEZzeGNFMC9vb0lsR1hHNGs0QU1vYzJlYTcwUHNDQTJZOGxvcm1iZndGMkdZRHkycjdkUk1lNmcrTVpQcjEzZ0ZjdnJiaWhBd3MrQUVCbXpLVW83QlEwRFpvSyttQ2JmamZITzdmTzR4ZTNIK040UE1YU1FnODNMNjlqYlhsdzBySnM1SWdJdTBkVERJY2pQTjQrMEhuTEZESnJaYzBBRkdhbjVBeklDdURnY0lqajBSaFhMcDdCd0M0NXNaMnB5TWdFQUhrNGpVMGJFS0RrNnRMRkNUNFZaU040TUJHOCtDZ0JzOXdMSHNUa2E5SE9OU0psMm5JVm8xaHpXTFlRU0o3T1Q0QVJDeE5sRVpRTmlaQkFobUNvSkd5c0dKRHplTUwweitNd21zMk5GV3lzcjJCNzl3QlJGOGlSSURsbGdFL1hUaTNBMTZaVFgvL1AxRXhmUlovb1dNVGV1MWFKcDhKYngyc2VZWHc4eEd5K2h0d2RLNnMvY2lKOUZqc1ZCWlpYVjdDM3ZZT0Z4UUdnZ05Gd2hQbDhiZzZBS2R4Qk1GUlFOTytEaFI3NjZEcmVTVGxUblEzem01czk5N3ZkekpubkFmTGdEcmpoWWdEQWZPNjArNk9qdXIzNHNWMUgwTVE5YlpEZkF6QUwwN0htNjFDYkg1dVozOXJzcnR6eGYwN0ROT3ZtTFd4a0NyQmIrUXQ0Vi9KR2w3SFh1ZDJrTytZbndNaVE3eHhOY1B2aEVXNWNXUElnSjBEUEFEMEZSN0dhZ2VOdUo4TmJOODdoY0RqRzJmV2xFNW5kMnpxbEZKWUhHZTdjRzJyWm9KZHdGQWJRQzVBQmQ2TkJHLy9aYkk3Ylh6L0UyVE9yT0xPeDZrdUNmQ2ZLdi84cUdBZG5TR3pXeXhNdkxFS0poMnZzU1pDNWpnTDMwSThrUGpBQ3YvUllmcXZHTXZqd200RitqRFlPekNJa0JQWVNyMVRISUFCMzlpL1dRYUFhV3BjV1NUbEM3VDBHOExZVGNPdkdaV3gvOEN1VTNQTUU4QlVBMHlpZHRLRDE2U2ZBdGdISGtuQ3hiTVRMb20wM29hWkRrSHpEdVY5RkhUZndpL3FUTC9xZEI0L01oR0VDRllXM2ZBV3hqNCtPY1h4MFhGR3hGV1VqQUpzUzVSK21LWit6TEVPM2t5TTN5cWV6SkJzS1BwcVo2VUY0WkZtR3lXUldOYVBldWljMjFRTlAyVnovL3ZzL0lnUzlFYjlsckRUVmEwMysyTFRsdXRVbkE4NStBaGhnQzltYVJMeS9OUXJEZ0lxUDQvYlVNWTdZRm16ZUJBOWZTUXo4SHgrTThjM1dzYUFWUTlqVzlBMWZ1YllEQXdEOVhvNXpHODhHNEsxYlcremh2ZGN1WW0xNTRKZjBLZVhtRW5qVHZhOEh1OFBmdzBkNytQS2JoNWpQNWdENHZBaVRaMlVPbHFHd1d3VG5YMm9rbFFkdmEzTDJaV2tSMjZlanF6a3lUQ0RLa09ETkJ2cTNjdVo4ZUVGMkZCQ3c1dXk1K1YyYTRFbUV1NmhpZUNFeTFsN2lKZHRwTVhRQW5rMDczQURYSnBITE8wOC9SdXNqY2VDT21lYzVmMXV1bHViYTFYUG85VmlmbmRNNmo3SjcxZ0Fmaytja0FKOUtQNVYyTmR5V0NkckRjNUp6MmkvVm9hMUx2REU2MTRXWEtxV1c0WHcydzJ3NjA5cTVBZmtUdWNwb1pkRDJQMlhRanhWY0o5ZTdxaXE3SHdyZ2huSEYvaWhHZXlkem5PekJRYVA1ZEZGTGVGdjN0TWZrZ2FBM3dnRlFQM3R0ZmpJY0IrUEIwSTArTTVPWGVrYndZWmEvTnE4SFdxUzlDUURmUFhQZ0FUbllVZ3A0c0R2Q2c5MlJTNTlud1ZvR010WXhzSEowOGt6TXFuK1dybWVHQ3k2Y1daWkFyeGpRSzc5UmorMmNaQmt3SEk3dzJlMTd4cHhFcnZNREFHUzNyM1haWWcxaWdOY0NlVXdjM3N0MXdNL0F4c01mZVg1azB1VmdHS0kweWZmQUM1VytTaUFlQVdBSHBSRkFGK3c1c0F0L2xsWUUyQ1c0TWtBRkQ2OEdkdy9hK3A4clRVSHI2d2VtekJGSnc4ZXg5Y0tyVWkvL3VYSHRvcWpYR2tnOGRZQlB0dHgxV0ZJWDJBU0FXWDIxY1RHeEtmcEE1VERqRVpmbmRNQXZWWWZ4VDZxaW5odjR0YVU5T2RlVW5NRUhMT2dpOTQ0bWZBWUdnNTVwUTJGT1BiVzduR2J1ckJKa1pqdHpBQ0E5RHAvWTNTNTBwNkxKUDIxelBSRDBSc0x4ZU80L09vNXJ6QURNZHFaa3puL1hHbVZtMXErVHNyMFZvektxTWcrK3dRemdRWTJ2aWJma2lqTWdRR1hBM1oxalpFcmgzRnJmMFhIenM0MVAwTnFzWGlKNHNnSTdUWGZyeWlibTh3S1BkNGQ2SEo3bFU1dnpUVGxrZ0NxOEpXSStML0RsTnc5eFptTVY1OXkycG1RdDhxeHRzWVZBbUV6bkdJMm5HSTBuR0kzMDczQTh4Zkh4QktQUkdLL2N2SXh6WjlZZGdOaDZjUDB4QnVEK25tUXlBbjdKamRzTFVDMjVaczFIay9hU0VvU3hCanZXWERjM3lidlFNcitnd2VjeVNYb2YwUmNuYTg0YjBBa1R2cm0vZWVNeWZ2WHBOMEh1bmgzQVY0TnZuRXR6Yks5L0NVNW1wcS9nMndEZzIzTDJMSnVBZGxQUEtsbFM0VTE2WGxYcE5mMG9XL2pIK0pMOGJmTG01RXBoc2Q5MXloTGd6ZldBUFNkRXQxR1p5b0Q1SEVRSysvdmhpWHBKZHlxYS9HOEk1QUVFNC9HQVBvMm9LQXFvUEhmanV2ckVNYjRCalhFRVg3RDZVUU85c0FSNDBCY3lpQ2VDblhKWDZoZ0k4RmU0dTNNTUFuQytBdWlKL0VsM3o0TlRDbmoxMmhuTTVvVGRnMk1nSXhTRjd5Z3A4aHM2MkdjM0s1U0F4OXQ3T0R3NnhxV0xaL1NhenNrVTQ4bk0vWHBBbjJKZUZDZ0tRa0g2ck9RNXV5OEt3cjBIT3poM2RwMGppUVBtVUhkV0t2Z09XVWRhZEtxSlhReUludFNsR3NsU09IdUlOUXl4Nk1uSlZ5R0luU0s0Zzd5L0FPNFNYVmw3NTNFSXdOSkNIeGN2Yk9MZS9XMTQzMWcrVTBHL0lZQ3ZTaXNRdGkzd1ZiOTJpZnB1NFZMeVZQSkpmUXcxbllZcXN0UFg0bXU3UUUvUmxiNG1meCtBZnV3bFdscnNvV3VzdGJydFZFNEpBbE1neWJhcFJEZzZPc1owT2tkRDk4S0FmTVJjejUrVkE5TFpyRUF4bTdsWmxaelVGcFRGYklJMTEydFBIVVptZDJETDNLZW43TXg4bnE0aDh1RE81Z240bE4yVEFvelpubkIrYmVEOE9OQmIwL2p6NURLbDhNYjFzL2o1Wnc5d01KeG9Ld2lnclNLbTNDell1MzZSQlhvQXg2TUpQdm44TG9xaUVLQmRrQUh5UXFPdTZDakJkeFNzZFdCcjV3RGp5UXk5VHNWclp4dHpCOXlRcG5MbE1kNStic0lhVUZFTzhZYXl0bmxPZXFRZ29UMndPd29YSUhoSHdUMFZKMExmVW52M2RBSEFzdzdGZDk5OUJYKzIrMU1jaitMcmZPTUFIelRvTHlEQXg2U29mZWVxQUQ0UU1GWmt6V0cxT3FReEVMZGhVQmtlclp3blRDOVZtQ0Z4cXRTMGY3ZmI4WlVUcllQd2krTjVJZlM3SGZTNkhiM20zVFNVdXAzekNxbHRTTFh5U2FBNVlXK3ZzUllQdkFnVDc0eHp2WkhZK25qdHI4T0tvc0JzYkRmSjgrdW5iYUVUU1ZOSW5tWGlvM05MM2F3empaSUhjNEwzWUpTMk14QzhGeTZla3A2UDlzZHVqTjdSdWM3RTh3WHcxdVdad3Ewcm0yNzlKZ0F4SWNUV2pYOVp1ZW5KMTVFSzZzL1N1a0prNC9zaDZBT0UrdysySWJySDVMODE3eTI3V081eUl3UGs0dm9KWnZWWGJBQ2V3alJZRWhSNDhuRjFNV2dRc1BXeTg3UlpmaHh2T2YvQXB3SDNJTWJjRWNhVGNsbGlEdHFWWSsrdTdFTTZtUy9MeThvQTZMSEl2LzE3YjZNVDZiREZnTTAycjQxQU44S3NHbmpqWEJxbFZRWEFwWFNhQ3MyRGFnblNsRlhnU1BGZ3p6SVJPY2t6VllyY0x3V2N6Wk9KcFpMT1psVUIxTGlLcUpsUzZQZjVleXNCdlBSeUJNOUtLYXdzOXFDVTBodmdaRERiMXJKdHlzSG1QNWxOY1E0T2pqQ2JOZGJpZ1JkeDRwMEVkZzR1M28wak93QjUwRkRtM2RXdGZaNHJQMVFMQU1TMWNnU21BTzlkZWdGc21ObkcxcWJGWmZZZ3A4TzJEeWNsb0g5TzhkMjU1Y1Vlem0wc01YRFgvaExVYmNFeDBBK0EzOGJ5R3dJcFIrTUx3c1puaFVMQS9RYzdIcXpZZUw0RzhmS2tPN3NwanEyM0VrNkRYeXA0VG9OM0RNUlI0aXYvWEtNVThuRFpDenNWTHRzeVBVaVFCa3NQTG40STd0UUkzSDJZbE5YTDU5T0Q0ZXZ2YldvOGpxY0plYSt1TE9IM2Z1ZE5OaCtGNTVHN0FCNmFZcVVycTFSWUdwckNkanJxNmtCV2tNYUZyb2FoTWtGYjJJcm52VDM0TlFiaVp1amNJRHhhUVUrWVhxb3dFdzE2eVZmN3U3MUFCRjNrbm4rZzdIbDVvV2NPbDFIb2RIS3g4UTF2V3pub2c0Q2RuY1QrRW1uM3dtank5LzF0V1lzSHBNbGVIMUJRcmlSeUxiNTVCdEJoNitoTEg2R080SURIcmRCUzFuVHZUZkJlSUdiejVhWisxMXVRYWV3ZVRmRmdyM1pEZytmS1hiKzA1azQrOGoxTkJ2TG0yUjJ1WVA4Y2NFc3RuM2VDbkJXQTBRQ3llQStIeHpnNEhEcXJDOE1WOFQxWlZQZnd5cEJZQlQ0QmFDZVU5aVI0eDdSem9LeWhOd1YxQkhKWndWSmF1d2YzRU5qQndKMkRySThUQTNmN0xRaHdSMGliMFBKWkhubmE5am5rZmU3c0dyNzM3VmU5MENYM0ZBQStHcTg1d0tmaU5TQVcvdFd5MVFCOElHUU1JMU5RbFJMTHMyeVU4WElBcGNsK1c3UjRBQmdzZEJtdEJQRElXeVJjdDVOamFhRUhsU2wwODl5RGV5WlhMWVdidlIwT3h4Z1BhN2V3RGQyRHRoRmk3bG1BL0pmMnBxekpTMEtsbE43U2tEbXJuUUc2UHZ4V3RkcmxtVFV4SzdIKzNVVFdlRzNpdVliUWdya0RKaFl2VUQ2OUZEcFFqTmtyWUg4NEZScjk4KzY2blJ3dm5WLzF5enRNUnJnWjN1ZVZaOWFDZDlsa1grWlJxbGdmRHdyM0htd3o4emtBdmsrOWRTRVFSc0JXRHVnUS9DTDk2cXV5RThBdUwwcDhTQ0FGNmhiWVJkY2h6SThEOXJSSkh0RzRub2tIN0RJQU85QzI0RzdUc0duYTlNaWxXdExlN1QzNE15c2JXd1pYcjU3SFc2OWZSOWs5SllBdkFXQlR4aUcyMWpUcHJqektvVlU0VWd0UFVvaDJjRmJLZTZNb0ZYNjFKVm1mWUNtY0V2NE4rVFlSZ2hMK3ljNkk5dTkxTzhpekN0ampIeUl2YlBQU3J5MFBuSExVNitibW5IZ2x0SG5iVGxyUUw0b0MrNGNqekJMelZ5cmM3YllSWXU1WmdQeHRlOE5uMW9mTzRzTGgzaUZLUjQxcENnM05vZ0hRcDdZQkhzdzlkK1U4U1BuNGpwai9jb2xJUGd0SmhkYnErWTJhejVaOEx0ejV6U1VudnpUVnM3eHhFNzN6RHhpeHNpcU40WnQvM00rNkI0LzJJSTZOWnZnc3dCUmd3TTBabTJnTXU0V20zaEM4WlZhNHBoMEI4eERRZzNSUzJub2JZQTlOOGc3Y1dkdzI0TTdqNjNBSjdzbXg5NUxsd1BOMzNIa25nQWl2dm5JRk4xNitHSlJvVUdDbE1vOVdoSXhiRzZrQlNJVmhUd2p3alZBOGhVbE5YQXJJVXk4djUwK0o4amdwNENKZEc5V2RoeXAvaXZnMUZLYk8xVVJkV0dDbStnREE0MUw1NTZXRkxnYmRyaHRqNzFwVGZlWTFkbmNvVGViM0lkblpHNEtvd0d6VTZ0VFlvL2ZmLzlHak5oRlM3bG1BL0IwQVU2Q3NJWWRhbjFMQTBLd2h0STBWajZMOWxHL0lDT1pJVnFlYk82QVFtTVF4SWdaV1VkTTlBeXhsclFWaERIMjN0c2pNUHkrQTYzWnlyQzcyUzJaNHFiR2IrMkRZUW1qcHl1OCtvSGpwS0I0VzhGVEFkRHJENDYxOUNaYm1YbFFOQlJjWVFGb3dkR2JuTWppM3VXUTZFUkVFb0lPQnNRZlVzcmFlQm5Zd3ZrSnJCK2RCTG40cmNMYzBqajV1bXJmUFhoYlp6S1ZNLzQ2M0t3Y2Q2VnR2MzhURkN4c3VMNEpaNEo0RTRGUHdYSlhtYVFKOGRVZWlCdUFESVV1OGt2elR3SmdDK0xnQURjcVArMVYwTE9LUlNwWFVNRjZWZnlvRGFVQ091U3pMMEl0TnVMUDNJVi8ybkdVS2E4c0w3cEN2REFxOVhLL2xza09lbVZVbWxSL3VQQjVQTVRUZzdpZVZOM0szMnhCWHVhY084dSsvLzZNQ3dGZDFkQlk4am5iMzlJZmlOSDcyY2l0ZTducHRZdTdPOHpWbm9sdlRQZjlFUlUvQm1ua0RUM2NiZkFKbG8wTWdON0RVZnhZckVVL1huVjFmaUV3cU5NQ3MrSzUyQnNTZEZZYWtkbTV1U2cwWjJlQ0krUjdBdlFkYmt0QkNZZ0MwUWtPdnlWTzAvMWJoT0s0bnRYNmhYZGRwNmg3VTY0QTlxYldUQlJjcThXNE03alpOS3dNclMxN09UYlYzU2NkeFVuWW9sQUsrOTk3cldGOWY4WmxObEh2Yzh6a0FlQmNXWjFRYnA1cEEzTlM5ejIzU3JreXV4cThkNExia1hmS3Z5M3ZiWE5aSHRYVzVNT2l5Rnp3bUQzL0pTRHl2cnd6UU1SdWNaWmtlZysvMmNyODZDZFk4RHlpVnVWMUV0M1lPTllPaXdHelNhSmM3NjI2M0lhNXl6MEtUQjRBdlBLREVsODlaTnp3Y2d1d3lnNXI2SmdJNm1UOC9qbXNsNVFiZm9ZNThKa2xSd3FNZ1doaWNLNFZ1NTFrVjQrbTV6ZFVGYVphSHpIdG95aGYrUWVHR0pua2VicjhYeGNNQWJHM3ZZektaKzJxSWdDV3hKNDllSG1oU3dOejBDdFh6Nko4UERrV29CSFVIckNJWkM2WnhZQmRhZTlBT1BTbTRSMDN6c1A1TTNvVDJIcHJuUTR1QjVaM25HWDczKzI5aWFURisybUlLWkVTblBCR0pRby93S2NJZ0ZWYVhWbHpHdEtzRnVDYllsVXFqUXB1bU9wcUdHWTJSVmRSSUlsSzVUVzBsVStybGlENDJLVkR2RklJSmR5R2dKL2tTK3IwT2xoZjdCdHd6QitaNjRwM2RHaHphUk85bTFDdnNIZ3d4bSt2alAyazZiN3Q4N290V0dheHd6d3FkYnNkZ045VHdsRktZVHVlWWpzZjZwVlg4M1kyL2xCWmZIUjFycysvSnlRQUFJQUJKUkVGVWpMeGZHRkZGTlQ1bEdpci83SkdLblBUV1YydTBDLzBjTDZMcjl6b1k5RHBlMDJhVDdKd0IzazZCdDA1SkFQUGdybjNERG9HSkl1Snc5SHZ3Y0p2QmxDeHJnZS9XbndHaTl1SmRnZGg5elIvblNUTE5NcGpEY2ZlQVhnWjFKem9EZFE3R1RZRGRnN1lGNjRiZ0RndlNLTkhiWnkrZnlVZVFub3huNmRqM1JMRjBTZkR1ZFR2NDNkOTVDNzJlSE1aS3RlRkpNTEZsSmVJbXdDbkNvaHhHS1ZKQlZ3dHVxY2dwUElyNGxzTEswYXZwdVY4RTRDdnBhejByL0pPOEtSb1lxNjAwNjVPVXU0MmFLajN0Myt0MTlkYXlvcUREcjliKzhBOEFPTE8yaUR6TEhLRGJZZVp1Si9NejZqT3B6VTluTSt3ZURCM2ZXZlc1OFRGM3UyMkVsSHRtbW56b2tkbzBob2d3UERweTkvcVhkdzhFSkNETFRjVngrM0dzd29QNmRJOXNSajVCZ3BSN2NSVWZPRERQaG5DaDkyS0NQS0JQeUF1YnRMQldsQ3dRYjlMM1h0RzZMSU4vMmE1eTcrR092bmNBdzBDVUF5TnMyYk4xOEFJcy9YUHNTbXJ6SlZLV0tpTVVnQjQweGx3ZXZ1bU9rRjNJeWtKaUlHYjVNR0J1RE80bGtEYTU0bTFXQXR6cnRYZnI2MlVHZkxtRXZKY1dCdmpCOTk5RW5tY3lmOEZMVUFud3BYaUpwNnJQdllvb21sNmNXVlZzaWhCUTlJSEtZWFdpMWFTZGlGTERsMkkvQVVVOGN0UGlUTHBVdk5RTGNrcUpWMm54S1VVU0FGYVhCMFlaZ2p2Rk04OFVPbm1HVHA2SlpYTDJQbE1aSHUwY2dnclA5Z1F6Njc5b0d5SGxucGttbjhEMHFEdmVIL3JHSzJoOHZLOSsrL05nZ3BlblFIem1uZVZKTW9oZ3gvTDVzK1RuZ0lzMW12M3VpMmVxdDY3ZnplRm0yUXQ3ZTF3amw4OFM2R016R2oyd3g1djVnOE5qSEI3NTVZY2gyRGtBWkVDckFnQjJ6d0tpNVIrQ09IRUFEelQ3aU5RY3RJV21uZ0IxRDhSU1l3OXVQZEJHdFhiNHZBVnh1Znd5amlrUHhzT1dvNnN2VzY2UjlPTGFPMHZmeXBUaWJmSzh2cmFFNzN6N3RYSW5rRHhOMUVYQkovRlVBNUFoVVJXV25CYkFWOG5RRHVQU2pLbU9Kb1dQbGFWYTVWbkZPMXBoMFpRYTVLaTlxOUhpOHl4RHI5c0owb2pjKzVmWHhGTTRzN3JvWnN6bmJIZlFib2VaNm9NZDd3NkdJeHlQSml3TndyVGRwRHZnQmRUa2IvT0htSm1ldStIaFVINWNkaW1jOGVDYjB4QVJ1cm55RldUK0t4TWhySDdQVTNvNlRkMmx3ZUlTU1UyZWNiSkwrRjVFcDE5ODd3S2x2ZVJTNW5pSmhnSDRSNTFId2J2M3R4MHFWZ0ZzT1dad1VjMlZpRmZKMzhYM0duclV5c0FpY1ZCUG1lSmRXNUlBZHFtMVMzQWxRNWcyeXlmQVBhSzl5N2dteFJydG5WZ2Fub1JFT1ZqZ0l3SXVuTi9BMjI5ZWx3VU1uK2RvQlpUcUp2RlV4U0pDRkNWbmVZK0ZwZC9oTUozbThqVkxnOVZEa244NXRKSysxdE1HVlVuVW1FMlpLa1hjUk1CV2hTcGQrODF2OVAyNTlTVjBPcG5YMUdFM3ZkRldVTHZ4RFpnV1QwUjR0TDFmRW5NMit2K2h1YjdLSGU3c3lnK0lXSFVFRFJpVVdVWUgzOURaU1hqa1BVMTQrSUtZNTRqR0x5aGpGZ0hqOTVzNkwvNDBYTDhiR1dxb3lFN3J6NHZnWnVyenVMeFQ5K0RSVGhCT3ZQSU1vTUdCV2d5OGJWS05yakMrNVIwQWVSVE00WUVNUW9ZeXFBZTNMR3N0Z1ozek9DVndUNXJtYlZybW42TjA1Unlrd2ZpN3VDQkdyMmxlZnVrQ1hybHhPZEt3Qmk2S0JZbW5CSk5VWEh1WEtZV1hyMTNDaGZPYkxMMElNMG9td2ZpVktlSnhFdFExQ2JUOTN1cktKaXpnR05scExabUxrYVU1dDI1WmF1UGFPbFVBQnYxZVFNZnVLWkRmL0M0T09saFpHbmh0WGVtelV2UlN1UXk5THR2dERuWjlQUEI0NTlCTXRpUEJ2K1VhK2YzMzMvL1JkajFaTS9lczFuN2RCekFDRUo5eXk1eFN3TzdqWFYxRzVwaFpjbVBpQkdjMEo2OVZkdklNbzhrYzlxaFhwdWc3RmQzeWNCRk5tR3VnVkFyZkVvR21EbDlrVFI0SStpOFUrRm1haUliZitMTU1VVFo0SEUrbWVMeDFnRE9iS3g0Y3kxRWNnRGl3c2Y4ZFlYQmZJVTRqbVpOZTZkWXMzckJGZ0NCQ0dEYlFva2tLSWxCQVRLRU1YQnVQOEJEMElXM0o3TTVrNUxKRnpQT2N0MGdQd0d1dlhzTndOTWFkdTRudHVFOFQ0RWtTMmJ1MXRXVzg5c28xTEN6MjNiSEpPenY3VVViMTcwbVppS0lQcWU1QUpJN3piUEQrUG1NemZiUkRrQ1p2VHRWRWtLcUtyMkhmNyt2TmEzUjlpUmM0MFVYVGM0ak9iNnc0TTd4dUFObTVKZ3JvZGpwbTExQzdZRnRoUEo1aVovK29MQk1SSnNOV3U2TGVia05jNTU2Skp2LysrejhpUUgzVWxQNWdady96MlV5MDhHRmpZaDRCQWpvNVg2OGxQeXZmOXFjYld3cmpCZzFVNE9YY2k2ekZBOEM4S09xSmtxNHh6S2VqR2xDKzkrQXh1TlpzNFZ4b3VZbXIwa1FmdVJyeGlmd0owMEg1MGI5RGhKSzJEZ1F5OER4YThBejRPYTJkUWg0K3hWck5IUkE4SkgzRU5NK3NKUjdEckJ5ZVg1bU9aQnNhZmorRzV0MjNiK0hNNWxyeWZhaUNJZDdPWDc1MEZxKy9kaTBaenVNUzlPWlByNzE2RGUrOSt4b1dGdnNBdERYcHpUZXZZM2xwSVNWTzBwRXZuSGdjS1V3U3grTHBwT040dHBHMnJJcSsxdE1HMWVTOEZCeXR1Q2habXZPVHRDT3BFdlQrK2pBYUVxR2wyMENiUDdPMmlJVit0M3p3ak5KYWZKWXA5SmttcjgzNWhIdVA5aVJqKzMxTlo1ak5XcTJSLzZRTmNaMTdacnU0S0lVUEFYeXZqbzVJNzRnMlBqcEVaMzBkdW84RU1IVmUreWsvZjd1YlphSlJDM1ZSNnlQYmRiTzYzcEVUaUpSWDhoa2JScUxqaHJQdFgxQTNuMVAwOVErL25kSnpLZWUrWWVJQTA5UTlmTFNIbmIyUHNiSzhnTFhWSmF5dExHRnBlVUVJSmMzbTVYc0VmcTFkSWtxU0U1TXJHaHhwNldKQUlQMGlKUnNBUnNpYm1JZW95NVRtemxwY1l2OTRNcHhidGZadTRuTCtwWFM5T1I5SzRidnZ2WWEvK3NsSE9EZ2NpbXlsQUQ0c2oxczNyK0s2MlQ1M05KN2l5eS92QmJndTQ1NC90NEZidDY2aTErMzZOOFcwSVhtVzQ2MjNiK0Z2ZnZwcmpDZVRlSUtCaXdGOFhQUktORTBEZkEzN2t5V1pLbDNtMTlMNmxhS3VUMGtrV3MrNVNYa21YQ2ZQME8zcUZVUWhrRWUrR0FDRVFiK0xjK3ZMWm5td2NwT1E3YlJpUFM2dlo5YmJlSmxTMk5vYjRuZzhpWW81T1JwVkdXZGk3bWV0cUd2Y013UjUxVXJ3L2UxOUxLMnZnWnZyQVFiWXBJR2VZR1kzS2lYQzRKNk5yMEJxeFFEY2FFUm1Zb1VZQitEMzRDd0lwQlFLSXN3TGVtRk45bmFqQnU3S0FCOGdTbWc2OWwwRC9VUVUrRWJlN2hJUFlEU2FZRGdjNGQ2RGJjem5CSlVwckt3c1luVjFDZXVyeTFoYlhVYW5tMHVOM0NjcmV4Y05QcWpHMzF3Tm1DZXk1Q0xHMnFnbkJYWVg4aVRnSHNZWDRCSUhiZzZtc2JGM0tadWpFblI1bnVGNzMzMGRmL1hqanpBYVRTS2xHZ0Y0MGczclcyOWV4NFh6bTg3LzVvM0xHSTNHdUg5L3V4UjNNT2pqMVZkZXdzYm1xa2xmZGxxc1RMMXVGKys4Y3d1N2V3Zk9UNVkxejRNbWVQUm9CNGUya3hMSW1jNU5tb2FIMVlMbms1anBteUZ6SXQxRVNOMkhkSUpPU3lOM0lpMCtJaFFEZjZVVXJwNWY5VWZFR2hLOStraTMvZ3BnNC9FYTltZnpBZysyZ21FZkp0K2svZWx6THliSTUzbjJZVkhZRHkxbzVBUHRtNGl3djcySFN6ZGUwbmpNQVJwc1UxckdwcHNyVE9mZW95QkN6cFp3RWZ4NHZRWjIyWGtBRTRGTVA0RGdwZ1hBYWY0Qi9XeGVJTTllekxYeTAxbTF1VDQ1VWRFQWFnM3NnVlBFc0xqS3plWUZ0cllQOE9qeFB1WkZnWUlJU3dzRHJLMnRZSDE5Q2VmUHJhUFg2NVg0VXExY01pdlNxMWx6Rkc5ZnlvQ2JiQWNqd0M3NXBvQmFlbkR5Y0doQThvMTFPSmlHemFTdnRCSVF5MlVOd0pjdEJsN0NmcStINzMzbmRmejRyei9HMUIzdUZMUUo3S2JYN2VCYjc3NkM5ZFhsVXBwdnZINWRqNFdhc1hXbEZLNWVPWS9yMXk5QlpWa1U0TjNrUmZOdnNOREh4VUZmeUNsa0p2bThzYm1Hano3NkZPTm9KNFdYWnRRN0hxZUpKbjBLWnZvNGZjMTdYK3BBeEpuRmFqREorU2xyOFFyQVlOQ1ZhWW52Z1BQVU5YN3h6Q29HdlM2VUlpaXlXcndIZHpzODIrOTA5T1kzWm12MSs0OTJNWjhYL3VYbm5BdkNaSGpjVnZ4VEJmbG50c2g3WldXeG5TYS90Uk44WVBFR3h2Z2d6LzJpdDdBaGtGcEpFSkhkQ29BZ0VtazdHakN6TUVGMExGNDBkekFjeDhlUFFhV0dPd1JQVnk0VVBOdHdpb0JOd0plenNGZFJTc2NuY0hCNGpDKy92bzhQL3VaVGZQQ3pUNzNzSjdraWYwSXVTbC84VGVEajZtNk1tbng1OGZmSnB4MUx4NWVDVE11V3YvZndJQVR3dWd2TFhJekhzNHAwTWNqbnhLWWJwbWZyM29NbGlYZWhaRG13OHZEOHN6emI4bHRhWHNCNzc3N3FKMFVGNzRTOVdWd2M0UHZmZnpNSzhOclFwdkRPT3pleHRMU0FsWlVsZlBlN2IrRG16U3VWQU04TFJMWXhmTmdpdEVMNHNFNG54eHV2MzBDbnczUWtramVwVmlIdW40NVQxYnBRTFZHaVhCc20wRmFlRWxXN1FtanVHbWp4L1g2M3ZFVzVUVHdzT0FLV0YzbzR1NzdJZHJDelkvRVpjcVV0U2Nxc2llOTJjM2NvemRGb2lwMTl2N05kV1Q3QzVLalZwTHREbk9KR09NQXpCUGwvOFMvK2gwZEs0WUY5cmx1cXNmZFltK0RzeDFlSXhrWGZGSjRDSGZOUkZ3RWFjZk1jLzZqdGt5U1hqU2p4ZUlrdnBFNGJmbDdkZURMRG1CMlJ5MEhLK1FHaXZJQXlDTnU0SE5Hb0NNTUR4dUFBeE1CTmxyd0RSSHNWN1A3dWd4M3M3QjVXZ3ZHVFhLRmNLVUNIalNPTEFBTFVBNUJyQSt6aFpEb0hQQWx3dHgwcER1NGNmSDE4LzdhTCtFRjZIcXpKeFpQMXg5SUlRWlBYSVN0WG0rMk5qVlc4OC9aTlJQZFdJR0JqWXdYZi85NGJXTEJhdG51WGVEdXF4OWEvODk3citPNTNYc2Z5MGdLVFFkSktpMFlhNEYzWkJHWEVlZlQ2UGJ6MitzdTZrOEtGNW5uZ0x2TGQ4SUI0R0NkTFVGRHFrWkkwa2o0cFZTSXVSZjFqWE5MSk5xQk9DOURJdVNObGZjVXhiandQaER3RFhycTQ0U2JhWlZuR05yK3hPOTNCZFFCNjNWelB1Z2Z3ellOdHdVdGtvU0NnSUV6YkxaLzd1WjZvZm5ydUdXL1hwajdrVHpHenZmVWJIaDVqYXJZQ0ZPVlhzSXBpald1M3d5YmYyWWFMOCtVZmFpeHQrTWFvNU0rK2Z0L0E2L3ZodU5Xc3llZkc3UjlaTFY0Q1M4RWJjdzRjUVV2RXdZdEJsU2hBRDJTUWNTTWZ0TFFrOFBveG5FVkhRYWZ6aTE5OXlWTG12d0h6aWl2OXg0Q0pYU0dnVzRCSWdUb0xMbmRxQ0tYeWQzbm5BT3F5YkhtVDRPdnFpTDMwN2wydUJQZjROeUZwYmQ3azk4VHpadXVQT0gvZUNTQW5vVWdQUkxod2ZoT3Z2bkxWKzVtYlN4ZlA0TDEzWDBPMzB5bWx5d0hlM3VkNXh2aENsSkdJYTJWemRPeVp5ZXBmZC83OVEvQmNYRnJBclZ2WDNPbU1TVWNWb1JWaEJEYnBTOG56eXJOTUlUZGJyTm9yQys0enN3MnJQZC9jYnQ3aXB4eFZ5QnpKVXFwREVJMVVsYWxtbm9uNGNWb3VXeWZQMFlrZUdzWUwyOHQ1NWZ5YTN0ekdBanRZZVpzeXR1V1lLWVZlSjRmS2dFYzdoeGlOcGxKK0lSOWhQcDVvVTM1emQ2cW1ldUFaanNrRFFKYXBENG5vdnlEaTQrL3hsNjBvQ2d6Mzk5RWRETHpaaFVoUGtDT1k4WFJ6QTNLVkl4eHAwTXI1dW5pQ0crUW5FNTJJM0V4SzEvamFzWC8yUWRqSmVicTUwZ0ZINHhtS2dvelo4Y1Z4ZTRkajN6ZzdnR0RBWXNHTW9WcllZQUpCSXcvNEsyd2dPQTkyWCs1VW9lVEJhVGlBM251NGc2MmRRNnl2TFRQd2pUUkZiZHFRV2dJR0Z0VWtVWTdKL1BJeURRakNISW55WUEyWGJMOUlQSFB1TWo1a25oeXZFRkNEZWcvVFlXbFV6YkRuK2JYM0wxKzdpTkZvZ3ErK2VRQVFjUFBHRmR5NGZrbklKMEZZNXFQVU9ha0UrUEMzRFBEMkZSVmxGZFNETGZlMTlSVmN1MzRaWDM1eHg2ZkJYWU1YUmJjeEhsemtQR0VxYlROTmpqcVZsSXZ0OGluYldKMUFJYjUzWDJheDlyamlsWTUvc3lVT1Nlb0trcEMyMlllOHNOQmdMTjdVOWRyeUFHZldsblJwS1hLSGNtVlpNUEhPUEhjN1dzc2ZUYWE0KzJoWDhCSlliK2FmVGR1dGp3ZGVkSkR2ZFBJUHA5TzQ1bHVlZktkbjJLK2RQd2M5U1k1UVFNRXNpSEJBWDRDUW0zamRQTU4wWGpnTnhKOHQ3MTlrdTJFT1FVK3EwTWtxRis2T3JUWHhpVHpZdTNqdzhRdFNPQnpQc0xvZ1Q5eDZubDFCaE8yRFk5ZFFwVFV3cjhHSjd5NzBDL3k5bDQ1ZlJPaEwzM0VCYmVhM2ZKZ2NqclRVK0dodC9tLzk0RzFUZi80NnNVdUJiVDE1TkVaTUZvb0VoR3lxZ0YyVCtNS1daWmtHZDg2SHkxQ21KeEczWEE4SkdlckF1SUwzcTY5Y3cyUXl4Wm16YTdoNC9rd0Z6NkNUMGhyZ1dmb0pnRWVZVHNDWGdqeWNQYnVCOFhpQ2UzY2ZpWElLNjhkZ3VXdGhsRm42NjhERU5YOE13RU1zZDZ1QXlrbXA0STdmeW9PbWRGZllUa3dtbHBENzNndHJ6VExsUUFVcm0xSVdvMDhsRi8wd1czeXNDVkwrclNnbzlQc2RFZXArZzVlemsyZDQrZEs2QVhCajZRQzVpbERLYklDakdadnRiRHVBQXI2NHMyV0FQTnFxdWZ2eGIzaG1QZkJzUVo3Ni9lNkhrNGtIZWQrUXN4ZU1sZFBPbzIxY2ZlT1czbEhJcm1FbnMyMnQwZWl0ZG01N1dkTjVBYXRwZTAzZHBHZmlrMUlHZ0pRRGI3dHJrWnRWYjJXRWZkbnRHbnJiRVREeEFSd01weThVeUQvZUhXSXluYlB5OXRvOGI1eHRZMkI3OTBSNmJvUVBsdVpqN1UrSUFqU0kwVHNXS0VCT28rRHhXVVI0QkRkZXJFUHc0T0VPdHJmM3NiNitiQmltRzQxVHd2NUtia2xRandRK0NiREgrRFlCZDMwZmhDYkFQVVhMd1pETGtBWk1ENm95VFMrYlVzRGJiOStzNXhud2sybFVBWHk5aVo3TGxRTDRzSXhzR3Bjdlg4RG9lRnplUVUvNVdkbDIvM080RmdSdWJKZURzZXNVc0xhUjd3c0MwcHFsS3laRW5HMGJ1UmNyTzZYOFJHWEZ3cUJNdXBseW9mcVQwdnV5ZzdTU0lOc0tKZ1VsNUducXFIU1RlSTY3aFlXZTBjYjVpOExlYjhidjVZdWI2SFU3VURCMldWZFBNRFBuZloxWlRiL2Y2ZURlb3owTTdhbHlwUThCVG9zSGdQRkI2NW4xSDlhVHRIUFBkRXorNy83ZEgvd0N3Q3hXWVdFalJFVFl2dnRRZmxCbWFDUDFnWGZ6VEFOR1lmaVJJL1pqelpZL1MxZU1MVnRnZytmQnd6eTQrWFNQeHJQb212UG4xZDE1dU8rdEhiWkJFL2xramJzb0gvdVJJeWcvZi9HUEtxVlZlMW9meUNmVldacUM0djRocjUvLzhrdEh3K25ESytYQ1BNakxkanJLM0dMMDRGUTJycmxLSEJoL2l2QjA4c0h5a1hVVThvV055NlFRY3JFT2xIeS9HUzJxYU12dmkrdlVpZnFSZ01xL1YrOVBqTjYvV3lMOWtDY3IzeEMwZldmVWw1ZVVPNUE1S1M4WElwU1Q1UUgrR3dubHMyTzVXWjdwU1Z4dVhCZHVBaGVVMGpPMjJkaTVuZWlWWjhyTTZHWmo3TVprYjhmYTdaZ3hsTC8zb0JRTFkyUDBSbzVjNlhGOUo1OEw5M0lwTTR2YzBtdVpNblR5SEhtZXVmRnFYMTRKRjJzSVFtcEsrQ2U4V00wQjBGcjIwbEl2d2tlOFdBQ0FzMnRMMkZ4ZDhPZkRCNVByc3N4TXdETVQ3MnlkVHVaejNIdTg1MS9rcUlEbXZTZ0k0OE5XSVAvMSsrLy9hTGROaENidW1ZTDhQL3lIZnpoV0NwOEN0aEdSNGVFczdJTzlBMHlPK1lsMDhRL2RmbXpkamhscnN2eENFSE5mdlh3V0RSNzdMVGZHMHQvNnpRdmc0VjVyczh4dnhNM3NjQWFSMW9nNU1MZ2VPc0ZNREdVQTREVjYvcXlqZVMyL0FGd0JPUUJqOW5yLzJiR0dsYjBIOGczZy9GbTV3NlJsL0I0KzNzV2pyWDM5M09naWNYSE80VlhGUjhqTStWV0F1aWdYQmlBcFlBL0IzYjZzcFk2bytFYWFnN3NEMXdndFNyUUlaQ2wzbHQwM3l1U1JkUDZiNUduS2RsaVdpK01acGl2eTdNdk4rWlB6WVg3MUFDK2VJM1NoakxaMERnK1BOUEM1U1ZzZUdKVUJkVHY1elFJM255Um5hZXpZdkowd3B5L1RZWUFIWlhraE9RblArWUhQSHM4Y2J3L3VCdlFOTHdkMkRQaWRYTFl6a21mSWMzKyt1ZzBUTHZ5Z1c3czRBdzd3M1c2T2xaVkZTYy9yamRIMnU3a3gwL3Q2c3ZVaUppdWFEa0N1Z053Y1RQUGwzUzMvZmNpWFVIc3hMWDUyUE1aODdsY3dOWEFmdENGdTZwNzFZZWlVWmVvbnZrRXducEdHaFloUUZBWDJIdTlvVHp0R1pCcDNRSDYwUkxxbjJ6RkFMMERaUHJPRzBmdkIwNXZhS2x6REVqVEdZQTBCQnowaTdCOVBjVHhwVmFHL0VVY0V2SFhqSE02dUx6SkFKeFFGTVpDMERUTnJqRm5qTHNJdERRT0w4bHAzMW1BWEhyaHNHQzlyY0ZyRUFJY2tYeU1QbjJsZmR6WHJDSWlrU3VtVlFEMlNrcjNoNzlGSmdOM2xtNzNEampkc014WjB2SmljRUh6ZzViQXl1UElOeXBZQm1LQjErV0gxd3I4dGNEcldGZ3BnOVBrRkpGOU9ZK3ZMeWZjc0FONkhST2lFY0U3VE85b2ZBa1RJNEFIYWFlb1cxRUZsUU9lejM1blduL040bWRlbWVYeXZxY3ZaNE02U0VGNlo3RlRrV2FaUFZsTkthdTRxWTlvdDd6UmtEUHg5M214blJqR2VEdkI5N1FZdThuR2xhR1BSbWN2ekRHdXJpM3JqbWhnZi93SUJBRzVlMlVRbmwzbmhzK2VWQVgyOWVzR1h4VGNQdG5FOG52S1BJeUtnZlc4STQ0TWhXcnEvYUJ1aGlYdm1JTi9wZE41M0R3RzR4L3gySG16cE1TQ2cvR0hiUnBJQmZUZlBIS0ZyNkZ3emFPUDRSb3AzT0J4WWdhUldXQmpnTW8yV2xjYzNDRHJzNFY3cm1aVFAxQldGTG9rc1U3aDFkUk0zcjJ6b0FOdndPK0F5Wm0vV3NKTXBiRDYwNGNvZnZCd2w0UEF5c3BxK0FMamdvdkNVUmc0YWxveDdHUGZnMFM0ZVB0cHJEZHpXbFVRSmdMeEtRK2ZsSWQrdk9LaWZGTmo1TysvcUJJRldiR1FYSFE5UmppUjRnT1VWUWRxMkE0ZVExdDM3T3BkMHZweDhIRjhPTnQraWJpTUE3UGphUExGeXRrOVBCZUJGUnlNQzhHYnluREtEdFJtQS9ZTkRBNVlCK0Zud2hOYWd3VXplM2tSdnplYnc1bU5tQWJEQWE5ZHZlNUFPTGdmbTVVdFpzM1BvWnpzT1NtdjZITkJ0cDRKcjc0SS9NMnVEZFFqQ1RvSE5JMy9yRzd2RUIydHJNOHNVMXRZV0dYLzJJWUJZU3ZydTB0a1ZySzhNbk1YRVdpcDRPZkNPajgzenp0NFFXN3RIZ2V3a0hrTXNlMTVBL3BuT3JnZUFsWlhGOTdlMjloQmJScWN2NmI5OTc2RjlBa0ZQaUxEYnpCYkU5cXduQWltRmJwN2hHSE1ReU5PNkQxbTVKWFd1RFZVRXNlV3RxVGNGTXVtWUtYa0VNMkhQVEZRcENKUUJCWFFQSFZBNEhzOHdtc3d4NkQxLzI5d1M2VlBuM01vQUFCZlBMR054b1l1ZmYvWUlzNUUxNDdPR1ZJQWNhNkRKMXhrc1NFR0Nvd2NKcnUwS2FJS3pJcGcwQ3dhTVhOdEhRYnE4UGJycGUrdHZPZ1lmL2VJMi91Q0gzenFkOG1wSVFBbktkR2VDU3N4SjNJVE5FaytMY1lueDRFQVlrekZJdXR6QnJxQXZnU1NqRk8xcUNNWVV4QWtBTzVEREFXdUtQc0x6V1FBOEZKQVJRRlk3TmUyR01oRVA5ZzdNV0x1Y3lhN0h5QWxLNlZZaTR4UG5sWi9vWlZpSzUvK1B2VGNOc3V5NHpzUyt6UGVxM3F1MTkzMEYwR2lnc1JFRUFaS0N1RXFVeEpIRTBVZ2FqY1lUc2owbU5iWVZZY296WTRkbDJaNEpLYXp4L0pFVTRXakx5NHlvc0VOREswU1BaelNVQk80VUtSSUZraUNJalEyZ2lXNDBldCtxcTd1cWEzL3Y1dkdQUE9ma3lYdnZxNnJYM1VBM2JXZkg2N28zYjI0M2IrYjV6amw1OG1TOE1SMmxFVFpRaWlzWkRkc2tocXltdm5WcFYxRTBaalpWVW9oMHNrUVhOUTB6TzJuM2tWTTZFWTMzbUJiNHlBbDV2cTgxMmlzUDJPcUQydUNjdzdwMUkyajRKTmhWOGhudWQ2ZzFnSDNiMXh0ak9nYnkrR1hpZC9LQTdNbVNkTjJpd0N2SHoySGp1aEVoY3FZYUdTK0pRTW9ZNmhQa2x3Qjh0NThNYXcxdnV5VC91Ny83bnh3Rk1LVVJSb3BJY1NuKzZ1VXBGTXVkQkNKZ0FNbG1jWnJNQTAyZlFHblZDWnpBeTVaTE1OOVBucHMyU1JvcjNSUEZRVGM0OEhaMzZkcENDQUdXR01qZjhlRVdIaiswQXh2RzIvcCtVWFdmM2t2dTdZOFluRU93ZlZmdFArbmJUSUtrWUw2N0FYWFl2bzdhQkx2OWpuRzlZbHduNlM1T1R1UFM1TFhzMlkzKzdFMmRWRytsOUhLN000QXk3MWRlcGxCNllaaWdQTjRRVi9tL1JDQnpwcW8wYnN2OVhzNVRhanZxMHV2N3ByUjI3c0MycjlTR09qQmVTVDFmQm5pU3RxNVVKcGs1cm0yRGliczVnSmYxY2J1TkNnb1JFWkFYRmhZUmlxQnJ2TmFKU3NORHdkOUt4WGJ0MXpzeHRFTW12V2ZsK1NUSkoya2NlVms5ZnE1VWJzcFROcWhMVXJjdUplajdBSGF0WDU1WGpOYnNlMlZ0czRhRVh0WGdLd2JxRlIxM0o0eVBENXZUNEV5RzBqZ0NJbUFmM0xzNVN1bTJiWUMrbnpQdmFqVVZSMDljUktkVFlIQ2dVYTJyUndqTHkxaGU2cXo4Zm5sNGJtTGk4RnRpMlBWMlMvSzBmLzkyOHQ0L0E5RFAxRW51U1RxTW5HR25VMkQyMmpUV2JkMGMwL0JQT0U5Q0tvT1FyQ01WbEJHNXlzQ1RNbERhS3gvTFNKSzhrSjk0SGFYK3FJNFRhZDRaMHU1MDIxMEF3VHRnL1VqcmpqeGpYcFlYSEhQZVRnbFl2QnBvTnZEb3dSMDRmdVlLanAxaGQ4SUd6T0k5L3hoaGczbGVBVGJ0ZS9tV2RlQlhBak9rOUFsc1FsWk8vSVVlNWNXSUk2K2R4SWQrZFAyYStxV1hGTDVpbmxXeTFFbnFNYjU4UXozaWJWd09hSG4yY2lvWXdLTFN2YlE5TDhnU1FjcXpWZEtUYlhPNW5SbHc1LzFxQVQ1clR3VjhPVlZHcDB1QVhRZnc1WHJyOHB2MnJ4WGdvK1RPaDFnSnNXQlJXZForUlhxOVBqTWIxZkNBcm85TEt4enI4MVZ5TkF5MmJvK1QyVmhETzVLVExwdFAzdEJWTHUxVGVTOTFuQ1BKcFkrWWVSRkpYakpGL3lHeHhXUjhpUVFpbFFvSkJEaWZoQUV1WDhxaEFKQkgva3dZTnFHL0ZPbFJDQVFxKzhKZVpXNk9qclV4T05pd0g3OG1YeG9NZTdhdnc5aElTeG16OG1mUWVMbm0zOFVyMTNIKzhqVzBXbVVITzZuOGVpbSs3NjF6YjRtcUhyZ042bm9BNUwxN3BpZ2l5R3VrY3ZVdXV3WUlWeTlPWWQyV3pRQ0RhZ1JtQUt3cUNvNmlPb2hWWTgyR3gzSzNnS2lTTEtBN0hsUXlXbjF3SU0vbHhwbWJtQVBMTEhpSGdNajV4dXdFY3F6SGNuSHlieHdiZkR2N2NVMkJpREtMVHdWNk0zbEJCT2VBZTNadnhNYnhZVHovZy9PWVd5Z2dVbjBaaUxQMVl3TzRWc3EzeityeWd0STN6NlY4UTZEMEhVeFpISkdYRnprUEFtSHl5alQrK3BtWDhjRDllN0Zwdy9nTjlOY2EwMVVSdWZTOGZFUFZaNFJxM0EwQXU4bFZuN2RQY084SndIWDFsZWhybmZSZUxyOS85ZnhhMGxCdFdqTC8xYWMxWlJFRHVBRkZtZWNLQ3A3bmo0LzV2SE9ZdVQ2bmtpQWdFaUhCRVMva09WdWsrTnZnZEV6bkZPQjdMRjNiL2ZPUU1pV05xdzVEQmR1NjhweE9RV2xJN0FQSFFoQ3pCVUl2d1RRdkxuUEdPU2NNam1jV0JmcU15L1c4eEltMFpDcmxPS1VIek41NEFzRXpyVmx0WGhGR2h0dnhHRmtpa3pELzRIYmNqbyswc0hmNyt2aU5HRk9jWER0S2Znemt4MzIyM09uaXlQSHpBSUNoVnJOKzR2WUlTelAvSHdmNVZtdHdZbTV1QVJiUVJYTHZ0UzYvNzZHREFHUzlTTVltSzI1NE1CTVJnbk5vRFhnc2RRb2pwVlBtdlE3TXFZcmpHMzB1WlNIK29ydGFNT2ZKaENERWdVSEsyY1pDeGtZRzJPanZ6Z2x5dEMrY09PK3BUeWZMZnM0NWJCaHY0LzJQN3NQTHh5N2k1TVhwMkE4VWozcVZMWGVaSVdRdm9KYTBNSWNMbWI0dEczcmwwcHo4WkI1YlVFL3RUblhud0hicDhsVmN1bndWMjdadXhBUDM3Y1dHOVdNMzFIK1pwTC9Ddks0Q2VoNWI5N3dFdS9IL21qcFdBbmNMN0JuWVNwS2JBUGVVdmo5d3QvWGNxUFNlcmxPNXZjdGNEZUNyMm9ERUxKcDJVMlRnMWNtV0JKYlE3ZUs0YzVMZVliblR3ZkxpRXVTVU1rbnA0RUErT2JzUkNWOUswYlY1eTBBWUlFOFNadEpTSmdEaU8vT25va0VrSUtqKzBoYWErbEtWRTVTMG13MW4rbDdLSjJrdjAyWW5jMXRsaEFqWmxOcXY5RGFqRlVuN29jOENKY25lUnhvY0NuVzVWWG9sUXJzOWlPR0pVN2hxQUFBZ0FFbEVRVlNSbG42TDdJWHMyT0gvQnhvTkhMcHJhL1R1NTlKeWkzZjZKYmhmazJ0eno5TDhrV1BuME9sMFFRQ0dXdVpzZWpNaDZxUjRBRmlhN2R2b2JtTDFKRGNXYmdmSWh4LzkwUWUvKzhVdmZuZVpDSU5BSXRaZ3RYbU1TL0ZURnkraktBbzBHZzA5QTE0SXU2ak1vNkZjNUl3SEJ4b2dkR0laVmgzUEdnQXh5Qk1DUUhBSUlYS1VBVWs5bjZSNnB3T0hlSkNJdjNyUkltd1piNzNkL2JoaUVNNGMraWRKNzFhYUIwSDdqVWtZQmhvZTc3eHZCN1pzR01IM2pwN0hJazg2SzRsSDRFOEFuZGJ4NDAra2V0aTkrQ2FkcnJjemdaQ3loVGxQZERnbkV2dzRtOUNScWFpU2hZdVhwbkR4MGhTMmI5dUlRL2Z0eGZwMW96MDZhdzM5dVdJazlVNUhkWmRWUUt4a1dhUFVYZ2IzQ3JDWENyRDNkZUNicWk2RGE5NWcvVDRWcVR5UFh6bGREMERXOXlxM2dkTDdVdjQrdEZKNU5jK2xmR1Z3UmJNbjgwRUIzYW1FSDZlVTBVazc0UHJNbkZyUGk5OTVVUVpJbkpVT0NVNEJQbE1aUzEzbVBzZm5YSFFYaktJOFdlcGp4SDNkZVNUM1FnbnNSUlZ2aFNhSlR3SlFiRVcwcDRrdjF5QXJRTVdHVUlCcUFBalFaMEpQclJCRlFGVHBRL0xGY2VLOFk1b2NzakUxT0RpQXNiR2g5SUxaNE04K3JGN2Z2MzhyaGxvRHVacGV2NUZMNm5uSGhuZjh2VTZkbjhLbEs5Y0J4R1BNQjV2aVVOMk80MnpBcDh0T3QxOTN0aitZbURoOGVmVmtOeFp1aXlUL203LzU5eGEvOUtYbm5nZm9QVlp5VDJvemhoUWVSQXZ6aTVpL05vMnhUUnNqZ0NCYXRNZjFjTUJiaVI2UkUyczJISW9pcXB1ZEE0SUhYSER4THlMNEJEYThJSEFhNG5JZFc4MVRmcHl0ZDA1VjlYQ0pJUmxwTnpIY3VoMWRtWWRPdDhDYjU2ZlI4QTc3ZDY1bmxSdUVIaUZiajJlZ2gwdHFOY2NKQ1hFUzdObzZqZzNqUS9qT2tUTzRjR1cyWkhpSFhJcUhrZGFGMEVyYWtJQS9BakowdjN6azVxSGJGQU5rKzE2eXZKY2ZZUEprNEttc1FHMjRjSEVLRnk1T1ljZjJUVGgwY0MvV2pZOWt6MWZFZU9wNXMwWkF6Ky9XQXVwWmpqVUFlOHgraThHOXJ1NFNUUzJEc05aRTlYWFVnYnR0ZXhtUWJaNXltZ3JBMjNycy9Vb0F6eFBFSjFSVEZiMDFjWGVzS3ZRcVBCUGdJNzJadlQ2WHJPcDVEam1mcEhjcFZ5UjVBZVV5a0NjSlAxYVN0QUpXVFU5SnJTK2dxbTIwMms5U0NUMExWdVV2ZFpBK3l2dEw4aHROZ3dnOG9uWlg0RWJzeDdpc3lYUWJZTnJDYW54Wit1U0dPLzZDR2kvcjkrWWEzcHY1VGhnZEZZRFBScTM1b3lNU0FMQnYrd1pzWGorczRDMzlMTXNuQ2VEbDI4WDRoY1VPWG4zanZKWTNORGhRcWNkME5rb3hXSjVicVBiOXl1RXRVOVVEdHdma0FZQzhkeE1oQ01qTFQ5VGkrYm84RVRCNTdoSkdOMjdJMUZkeUVoM3hRQklwUERoQ3Era3gxeTNTK2hjbFNUK3dDaTRLbW5FQWlGRUpLWGluNFpnR28zeFFoelNnSExhdWIvZmRBZDJDMEd6VThlRDloeUlRTGt4ZXg4bUwwK2gybzdIYTlPd2lIcmg3S3dhYlBsK1hBNVFaa21GUHlnWHdjKzVEUjhCd2V3QWZmR3cvWGoxeEdTKytmbEZCM1VycnlaR095dVFnQ2tvd0NEd1hERk9nQk1Xa2dUQUV4ZzRBWm53RXl3d1FXL1p6MmhWYzFtczRkLzRLemwrNGdwMDdOdVBRd2IwWUd5MTV5S29KdFU5b3RUU0dMUGNvbW1vZVV1bUNTamZsb3VvSVNRN09XVUczSE56dEs1QkpwRmk2UnVuZDFsc0JaRk1PbWYreTlCVkdZbVdBQnlodHZYV1VKRXlYNW9SSytITFBFbWRTM2NjdHFRdnpDeXpKQzVPYzVIT3JvcGRzNGxkZEpYOGtnSldsUHhYQVN4Si9kdVZzKzB3Z0EvZ2xGWDZBTWJDejByZFNPa1p2ZmViMHJBcnB2N1FXRCtUcjhFSU5YYTRCWmNtZnVGQ2g4U0dZZmdmU2NpdWdXZ0RuZUk0N2g4RldFNDJHSVZMbFFhbVg4WHJEV0J0Mzc5cVkxdHRMbWhYVnRKaHVrbWN2dkhZYTNXN1E4b2JhcGJQcHdXTXlIM1I2dlhCMXR2eFZWZ3YvcndUNU1ERFEvTWJpNHZJL3NsSjhGZkJUL0tXVFo3SHZvZnR5VHBDeVQ4NlNhK1FlQndjYW1GM29vcnoySG1DTjdXVFFwaklDeVNHeUpjWWhic3FIdDNFZ0RBMDBzSDZrUDRPN21ma09MbHhkd09qUVFOUUNERFl3VUh2K2NlL1FMUUttWmhZd2VXMGVWNjh2b0NnRVFDUHdYYjIraU84Y09ZT0g3OW1HZGFPdDFEK2lxOUlJVW82ZXNrZU8rekxXZCtpdUxkaTJjUlRmZlBFa3BtWVdZMzhvU0ZzZ05oSTRTdC9VRUl6MDdhclNPV083U3Y2MXpJQmhGdFJ0N2hvQ0VYRDIzQ1RPblovRXJwMmJjZis5ZTVPRWtDVmNVMVFXdXhMenZpS29tNXN5c05mVnV5YXB2UzUvTGJpYlBEWGdidk92VlRYZlMzcTM5eGs0YTF3NURWVm8rZXFhZ2xVQTNod25haVU4Uy9RRjRlMmVkamdIVDdrY3VyaXdnR1F4bjlaMExiQTdneUlLOEY3bFJtT0Vod3lnVmJLV2ZBS2lwdi95NWptZXcrWWJsVWFPTUJFcEU2K3JTM3FtY1N6QWd3QTBST0JpQmlZd1o2QUtCZTFuQjNKcDUwc2lNMDRCUEZGV0tOT1VnVDNGN1hpQnJmTWNPY0JIT2pBeTNJYjNqay9Ic3g5VS9xVHYzQnBvNEtGN3RpY25SQzdxYTlYWURtUytFYWt6SEFBNGZ1b1NwcWJudFBlY1k2TTcwNnZsYXpzV1FjREN0VG4wR2I3WmI0Wit3bTJUNUI5OTlNQmZQZlBNSzBzQXRjb3Fld0gzK09IaUlKdTZlQVdkeFVVTURyVmpQR1FkbWFWcTVqbzlTL1VEYkFnakVtQ2NzV3dOS29aM1NDNXlKVjRjNWtRUUYydDYwbTE1RWVDWjQ0VEQ5ZzM5Uy9GWHJpK2hDSVRwK1dYTXpIZXczT2xnYVdFUjYwYmJHQmthVUQvUTRoNnlHd0tXbHdzc0xuZXgxT2xpWWJHTG1mbkYrRjRnbldpMjc0Z0lDMHNCMzNubExBN3UzWVI5MjlkbFFKL1c1MlAvS21PakJBdUpVREp4MmpBK2hML3g1RUY4OTlXemVPV055MmtOM3F5N3c5U2ZTZnNDL0JhZ2VZc2NMR0JuK1ZkaEJraVlnYjQvQVlpQU0yY25jZmJjSkhidjNJTDc3dDJMa1pGZTM3SmF3YXFBWHBPb0R0VFRaWC9Bcm1sV0JPclVqaXE0bTFwcm1JRlMwUlVBMWhyWHhBaXNUWHEzZVZhVjNpMTRtM2RLYVhKbVFJM21NM1c0V0pFNzNTYW5NTVJnNlN5YU9iTzhCMkIwZEJUajR5T1l2VDRIZFRPTEJPd2lPUXBZT0lLcTh1RkVTNmlrS2FuNStaV1RNVjFpVEFTbjlmUTZFMGlNeHpTa2E2RVBObHFYSHJWUVkyVXY3YUJrbENkTVNESjJ0YytFcGlLanI5VjFlTzQ5MHg5Q0UyUUpCR2JyblhPRWRuTUFBd09OU0MrY0I3bUFVQ1JKVzRjSTk5TkQ5MnhIZTdCWmt0Z1RrTXUxSE9ZRC9qN1haeGZ4Nm9rTGRoQ2lOVGpBU3loMlhKdUJWWnFYeGRJeWxwZVdLOTltaFhCbVl1THcwWDR5OUJ0dUc4ai84My8rcTdNZi92QS9mcG9JUDFhVzRFTUljQzZ0eHdBTzNXNkJxeGNuc1hYZjdnanVIZ2d1RG5hUjZ1VmJFT0sydXNFQmo4WGxFTmZzcWJSWEhrQndEZzJTZ1lkb09jL2I2U0xRSTY0Zjg4Qk9FbnhVMnpVOXNIbThQNUNmWHlvd3Q5VFZnVWNnTkx6SHdsSUhDMHZ4R0Y1WG5iK3gwOG9Fc0VUTUxBaGF6MUpIM3JpRXFaa0ZQSExQTnZpR3k5YmdtWlFsRVI0OGtVUHM5K1FQT3FacE5qemU4K0J1N053OGhxOC9meEx6QzhzVlFGZlE1d1YyYVdjVitDT2hLWWdxRG5lVXlZTnhuS1BNUU9sK0pjU3Q3OG1zVDArZnZZUXo1eTVqeis2dHVPL0FiZ3dQdDFjRThkcVNlb0Z3elEzVlJOUlZ0MlpnTjNHMlBlWGNOd1B1NW5FdHVGY2xhbE5YQ2VEcnlzOEJlKzBBMzdQTXJFOHBUU29TSzNvQmZwYlFYWktHWlJ1ZGdHMEVDNnYyVGRlNzkyN0hxWlBuc0xTd3FNQWVueVZRVVV0dWw0TU40Q29Bai95UGxwVnU4bWRBb2lPdTlNVDJhV0plVXYrS29aM2l2SUEyZ0lia2Q2eHlGd0hBME5ta2xqZFNPaU5yVXRQei9DZVJ3aTBURU90dGtMaTdUa3lQR09LQkhFWkdXbXdQNFVBK01KMldKVjM5NkFDQUEzczJZdE82WVg3YnFzUmUxdGc0UStPZWUvVWtRcUVqREFBdzFNNjN6dVZqMjQ2N2VMVndyVzlWL2VmNnpkQnZ1SjNXWXRSbytDOFVSZml4c3NvK0RoS3cwUnl2M3lEZzh1bnoyTEozTnhpTGs2U09DTG9oT0hpZnBQeFcwMk5ocVFDRnVKMGxXdUFEVVZvSGZDQUVuMVR2Y05FQlJwTFdJeVh3bEl6eUZPaUpzSEhERUJxK1BPVldEcGRuRmhPWFNxd3FkeDREQXdOWVpBNHdXOGVUemlJbE53eHNpV2piditwWFh5WVVBK2laaTlPNGRuMFJUenl3RXlORGcrcW1GOXlHek5vZVNYMG9taEpycEFQbnNHZmJPdnppaHc3aGE5OTdFeWZPWGRNOXJuVnI5ckRBVDF5dWRWVUxZVkxTTzhrNTh4Sm5EZkxpTnpkcGFpR3l2MEJFT0huNklrNmZ1WXk5dTdmaTRJSGRHQnBxYWR0TXd2cjhLMFRVZ1hwdEh0d2tzSFA3M2lwd3QrM3J4VXhZSWxnR1lsdS9MYVVuODJEYlFha2NxU0s3dDJYS0dKYW1LSGhuZzFqVjdIQkdhallBcndLOUFWWUJPRkc5TnhvZWUvZnR4S2tUWjlEcGRIWHQxM0xxSXRGYjVpQjdMbFVicVYveTJUSUVqeVd0OWpSVkFSNmw5TFl2SzFiOE11OWtqUjN5anFuc3pFcmUzR3VQR2dHTEtQV3Z4b0ZBM3FWN3MzV080SklxbmhtQXdFWlRyZVlBQmdjSFFCUkZOS1hKZ2hGT3RMR0VMUnRHY05lT2pXbjl2WWZFTG4rRitYTE80OFhYVG1QNitnSzBsL2kvdUI2ZmpmQjBXek9CRi90WDFiL2xJSDg3TjNhSGtaR2hMeVNBc21wWVEvek45ZVZUNXhINDZENVZFK3ZVVGdSRGpMTUdtZzB6YUsyNjJBSmxxanZtTS9kY1IrN0dOUUhMMWo2M3pTMTNBNjdPTHB2eVVwdmFRNjFZTnYrSzJsOUFFVUpLUndGRktUMFJJUlRKSUs0d2ErVFRzNHY0eXJNbjhPYTVhNG1qZFhid08yT1k0akxpbzhFUXZLSDJBRDc2SXdmdy9rZjNvdEh3Q1pDREFYT1lQalhTZXZ4bTZYdVZyZTNCUm5aQ0ZHQy9DMmNXUnZDV0JZcnVmOTg4ZFFGZi90cjM4T0wzajJOaFlTbHhIOEpBbFgvbVJwT2FmOUxvOU16UUNhTHNaNXFTTVVXcFJGT1hLVWY3SjkzcUdCYkFwWEsrMGp0QnhyeWRTNHF4T1VPbWJTL1ZWNW5MMGpaYmg1Um95NWMrMHY2VXZqUGdVcXF2RHVDbGZ5MG9nOFMxTE9uWTl0STZKM0pkTE1FaDMrTG1SRnZvMGh4SjRCRG5SclBoc1dmZkRnd01OS0N1WGgyN2dIWHBSTG55NFREbEU5NjhTZXR0T2Z3WHJucTRqQU55TjYzbG4zUG1lRnAySjJ0YzRqcWt0cFpQd2xQM3JzYkZyYnFGZGZaNUtzUEcyL2Fuay9Ea3IwOXA1VmtqcFJQM3VpTWpyZndRR2JoMHJjZmdSci8wai9BNmZQa1FIUVY2bjF6cjJtOXc5c0pWSEQ5OTJVNG1BUEYwdTBIMWZiSzZGRTlGZ1lYKy9OVjNBSHlsbnd3M0Vsei9xczViR3BvZit0QS9QdUc5MnkyRHFkRklQcHJUZFR5ejJIdVBEL3p0ajJKMHcvcmtZMWsrSVArMWc4WjVZT3I2TWpwRllCL05QbjVvOHp3TlFPanBVYzVCejRSMlBrMXlIYmdBaGx0Ti9NajlXL3A2MlRPVDg3ZzB2Wmc0VFdYNzQ1L0p5V2s5ZjlqaWFzWkhHaXFuUUZBaWhwWjVDVFhYZ1FnN05vM2hpUWQyb2pYUVZDWUlNSVJiQ1c2OENGcEh6aVFCMGViaDZ2VUZmUDZaWTdnd05ac3hLOG42M2pJd0lZc3JzdlNCbVpVSXVFV3BuS0lJU2IwZkNGMVptM3VMZ205NDdOdXpEUWZ1M29WMkt6ZXdwSm9ydWUwMXExYWFid3JnSnFaRWQwcVBlMG50SnE5Sm9CQmRMb3V5bW5MSnZUWjlDV3h0NlNWd3QrOUZ0ZWxLNVN0RGsrZkoyclJLbWd6Z1ZTcFAwQjh4T3Q5V0pUZ3YwajRyL0pKTDYweFN6dk5LeVF1TFN6aDMrcnhwQjZrS1graVRCR2NtZnFaeEFIaTVBS1U2ODZDR2RqMUhXZ1d6S21uRnR3U1paSllPU0tReTVaU25LVFBlT2FOcU5JdEI4cFRUaDJUQWkwU2JJdjBLOE41ajNmb1JGZzdpYnAwUVFxUTlCWUVRZEl2MHV4L1lnL0hSVnZ5R3FTc1p5RTJmTzFiak0wMi9QcitJcnp6ekdycEZZWmpHMk5heGtUWTJqUS9ydTZUQlpobk9GTGQwYlJZWGpwN3ArVDFxd3RjbUpnNS91SjhNTnhKdTkrWnU4dDU5a1lnKzNrdGxMNE1qaERqNHI1eTVnSkVONjNYTG0reVpsOGtwSHU3RWlyNDkyTUR5ZkFHQ1EzQUJucnh1QzRuNzRPT0tWb0NERHdUaVU0aGt1NGtQN1BDR3l3VUI4QTViMXZXM0ZsOEV3cVdaUmZXU3gyK29nN0pMaE9WT3QzNWFXOEF2RWNka0JDUFA4MzNzTWtuTGdIL20wZ3d1WFozRGV4K0s2K3V5dmlZcmtkbitlbFpiRXF6SzAvRkFqMnIrRFdOdC9KMlBQSWluWHpxTjd4dzVxOHNHK1RZNzB6WnVzNVhhbEhFZzBaaEEzeU5wVUNCelRJblBXeGxDRVhEaXpmTTRlZm9pOXUvZGhudnUzb1hXb1BpeHp2N1VobFZCdlhSQk5RbjZBWGI5djVMMzFvSjd1ZDRjaEttVXJ4ZFkxN1czRFBxR29TaTNnVko2aVJQQUZnZ3VBeVpqWXdYZ1ZYc2xneDVPMVp4aWRPdEtZQ0hUd01jQ01UelV3bzZkVzNIaC9DWERNQUJXTzZiWW5qM1hscWc5Z0RZVXFWN3pobHgzc3VqdkZaaVVhbDQ3eDZMVEdkTEh4TzlCL0xKS1IxbnZicDNva08zem1uajV6ZzBnODJFZjZialFMYWVHZHlBQlhvZUNFdzBQdDFUUjRwbEtlMmxYM084TTV3aUg3dHFLOVdOdHM4VElGdlA1cXlkbXk5VHp6QXR2TU1CcmoybmZqYlF0VTI5SFlaWDVCdDJRVmYxYnJxb0hiai9JQitmYzU0c2lmRHl1dmZPS3QxbUhkODZyZHpraXdxVlQ1N0Rub2Z1Z3Z1WUJkakhMcWl0QUxjUUpRS3ZwRTZjWWdPREZOek1oTWhZQkFWN1g0QjJQVG1FZTdIWTVoRGlvZkFDMmI2alpkclZDbUp4WlJMY2I0QnhRTU1GSTYzME9pd3RMOFNoWVZ6TmpEWUJuMFV3ZFZYSkhBa1ViWjMxQ1c4OTA4NHNCWDNuMkRkeTNiek1ldTI4SEd0NHhvQ2VFRndjNk1vTklnQitJMXJBaFViK0dkM2pmTy9iaTdwMGI4TGxuanVIeXRia0UwcVpONVJQdEFoT2RuSGdZTmJaNVg4djR2WjFhcUZBRUhEOXhIbStldW9qOWU3ZmpucnQyWVhBd256NnJ0YWVHanFDV1lGU1M5QWZzK1dVT2dpbnFMUUIzODFEYVkrRyt6S0RtN2E1SzVyYmR0SVkwdFFEdlhKcG5qSGcrWXBaeGJ1Tnk2VjZsK3ZSdVZrVnZIVWRKaFdMUE1qbzJncTFoTXlZdlhVbU1nK1VKRlBBTnMyRHZrYVIwaTFJVnF1QnFZMDF2YzdKTVFEQk1nWTZCdEU3T1dNNTVDQ0hFMC9HSWtEeU42dndYUnNBd0Rralc5anlsTTBhQUNBblVZZnRFOXNQSENxS2EzV05vYUpDUDlDYUVJZ0p6OEFFSVRKdkpZZGVXZGRpL1kwUHFFdUZxdUtGV2VzK2RGZ0hQdm5JS003UGlZOTVxdnFJeGRHdXdpV3lNS3gxRytRSkV3TUwwL3cveWRZRzJiOS80bFRObkxuZUpxTG1hTkUva2NPWENaU3d2TEtBMU5HdzRTelVQQTBFODRrRzN3RFdiSHQwaVJPTTVUaHZnZ0JEWGRUU1BJeFJzdkdlMUJCYm9QUnlHaDVvWWJmZlhkWmVtb3hUdnpPRXcxcHAzYm1HSkdSdXFCZnJ5ZWkxSEtyQm5ZTThUT0xBbXUyeG5JS0F2a3YyUk55N2h6TVZwZlBDeC9kZzRQbFFCZXNCSStjNHdRNFQ4a0I0bWZ6dTNqT0h2Lzh3N01QSFNhWHp6cFZNNkYvVHMrT3dYSmZqQ2dINFJrdVc5dUwvTnR0NGg1Yi9aMEc4UlJSRncvTVE1bkR4MUFmdjM3Y0RkKzNkZ1lLQitMS3dLNnVaWnBSMDF3TTdSV2NaNmNLOEJhbzIrTmVCdTcrdkFYY3NzMTFNcjVaTzU1cHhaSGxOYVRSckZTUjJLVGtSbGRsTnJKSFZXVFhuSElLQ2U3RmlRZ0dHK09hMkFoQUI2dE1aMzFYUXMrcTliTjRhaUtEQjlkWnFsUjZmU0tFd2VKNlc2MUg3SGFaeFAzdW1xa253K011emo4cGl4MzhoSzNBcUFMS0ZyT240cENrRERwN1E2NTdoQ21YOXlZaDJCTWtkaWNZY08waDU1enVpWTJZcEhWSFBmRW5UYm5ORFlvZUhCU0lPWi9uZ2ZyZlhqeVlDRUFnNWpJMDA4Y3UvMmVKNDhKWHNMVWc0dTJVMElDeVVNMS9IVGszano3SlZTSjZYZUcyNFBtSDYxS0Y5Q2ZNNVdMQzVpZWJHdnJYTm5KeVlPdjl4UGhoc050LzFFbFU5LytyKzVCdUJiQ2FqUzVJM3Jya0dCS1FSQ3QxdGc4dlI1NVI0dGVNVVN6S0JpSXRVZWFHVEFaZ0VqQkhONldrZ3FZN21YOVBhM28wOHBmbUc1d1BYNVRzOXoyWXRBV0ZoWVV1TzViaEVRUXZvVlJUSzJVME83YkcwNlg3dVc2MWgyaU8raGhudGt3SmJUQmNMVXpDTCs3SzlmdzR2SExzWkc4K1N5QkVqaTVBeG01OUtreVg3T3dUYzgzdmZvUG56OFk0OWgxOWJ4V3V2N1pNd1lQNXdTRWZNOFMwZEpFOUdWM1FNMytidlIwQzBDanIxeEZsLzk2K2Z4ZzJPbnNkenRac3dIbVp2c242bmNTanp4dGF2YUMyUmx4dFJwN0VOQlQ1NUlvVnF1emhGaGowejdwTFJ5SGlCclEwclB0ZGo4K282bVBta0xhdW94NmFSdnNtOXY1ci9PNVF6Z1V4c0FxSE1ZQVhneHNBTmM1c1V1alZWUjRZdlJXY3lmVGlJVHlaeUJ3YVV4cmRwMngzUEFHeU05emhQamdjMmJOMkJzYkNRL2Q5MFp3eThYVmRWeW5Sdm5lV1pJU2tadGFuQ1hHOWU1OHMrbG42U1JjKzA5MkJqUVNYM2VwT016NDJHTTdjUWd6OGxaOE1hT3laZnI4SHBlZk5uNHJkeitaTUFuNytPMWY1b05qNkgyUURxbm52cy8yVi9GOHpYZWRmOXVERFFhcWM1R2ZJZG13NkhSaURaZDJ1OHV0ZVhhOVFVODk4ckpORmpOZUpXNGthRldOczZVaWExZ2ZMeVluN3FPUHNQbis4MXdvK0YyUy9KQUZOYStRQlRlRjRKNEpvckE1YjFIV1pvUEFUaC83Q1MySDdpTDNUOUdGWE1nd0hFZTBYWUZBbndBV2dNK2NZa0JmR3dzcVNTZnRzZkZkZm5BZ3kwNGdndDhEVklqbkIwYmgxZDRuV3E0ZEcxUmx4TUlzbHdRMzhrNVlHbHBXUTNJaE1pSTBYaFpwaWN6MktnMnpqQkt3cXlBMGk0QlFLM2NMVE1UcmZLQloxNDZqVGZQWGNPUFAzRVhSb1lHa1k2bFRTcEtjVkVwNi9mZzdTOHF6Wk5vUWdoYjF3L2pQL2pwZCtDN3I1N0RsNzU5SEF1TFhWaVZ2WUNXMmczWXRYaDVwd3dzTGVEZHhzRFZkenNGWGo5MkZpZE9Yc0RkKzNaZzM3N3RhRFliV1pwU0ZoT3htclNlY2xHNkxKVmxDVldlclpmVUhoL1g1S3RoTHJJYzVmcExvRzN1M2pMcDNUUTdxYjJGK1hTQXJsTURadjBkSmk2T1pka3I3MjI3K0htbUxwZGhuWGdITFVzTVZhelRHbUVBQUVLN05ZaUYrWVdrb2dmeTlYbHB2ejdqeHBqejUyMVNva2l2eWtHZnkzK0dhQVFUS2YxbFF5Qmk2VGZWSWNmb3dxVjk3aW9oZzdVYStvejN4SnN5NURWMFB6eWZMcWRDRktyNzRVWDZKZ0xhN1VFMFhEeWRKR2pmeVhlTGRQcmhBOXN3UHRKSzNlNEpJQS95a1Zib3NpMmw3KzdnME9sMjhjM25qNWxkT1dtTXlVaG9OQnphZzAzRkhFTm9OUTlzRk5HTmdQemJvcW9IN2d5UWgvZitxYUlvL251ZDJNU0RnK3JYNWkrZnU0VE8vQUxjeUZBY0FJR2k2MEpSRFpuWktlQTgyUFJZN2dhMUVoZmpOemxPTnVqUVpNQVB3cW5IYSsraTZtalR1amFHQmh0OXZkL0Zhd3RxQlFwRTJxQUVDZzV6ODBzNjZDcWFPUlBxMXVSejZZaVl1UkZpU0xyTlVPTEUyclVuNEJQaDlNVnBmUHJ6TCtQRGorL0h2WHMyS2RDcm5zN1pPbU5jUEx3blRYNGd1ZHR4Y0hqaTBFNGMzTE1Kbi8zR1VSeDU0MUpzcXdDNmFoNmc4WFZTZlBKVC96WUFmTThxcVBaeHA5UEYwV09uY2VMa2VkeTFmeWYyN2QyR1JxTTBUbnFBT2orcVZMd2lzRmYvVklBOUwxZnVLNlhjTkxoenFrcmVDaU5SQzl4NS9iM1RVYVZkU2ROVU1yQXp3T21GMERzcU1RT092YjJ4MUU2bFpUS1I0Rm1RaVBURWxrOHBFV1FwS3pFSEFrM0pyejBneXdXQ3d4SHdiUnVndXRYeWtwMkR5MXpXMXF6b1ZRU0NtRTdtcmVLZGhpQU1DczlwVW9FcTFrOGdwR25QMzhPc3c4Y3VvZXp3R1dJMXZUQkZaSjk3aWo1TGtCaUE0R082QUJGK1hOeWJydkpEYkpjbkIvSnhPWFhmdG5IczNycU91OTRRVTI5ZTBqSmVCTlgwUFBQaUNjek9MY0VNTE9TVGpGU0tONUhJWmxacHpCY0xTMWhhNkV0VjN3SHc1WDR5M0V5NDNWdm9OSHpnQS8vd3VITzRPMjJaODZqYlZpZHhqMzd3M2RoNTN6MnM2cEY5bEViOW8zL2p4RnBZNm1KNnZzTnFHMVlaV1RXYWMzQWUxVGhKendUbHNYczJZZC9XSGtlVzFvU1orUTZlTzM3RlRPb1lSSDBJQUJjdVRPbld1UlJjOWJJaUVWRkZvcysycU1EY203OFc4RFBRTjBBdm9IdmYvczM0OFhmdHg4QkFVeWUyWGZjSG9Ha0plVDFKclN6R2RiRys3eCs3aEQvN3htdVl2cjVZMldhblN3MGhKUFY4Q0NqMCtxM2FOa2NyM1BVZkJnZWF1SHYvVHV6WnN3Mk5SbFg4NmltdGx5cGZGZGo1WmlWd3QyQ2IxM01UNEs3MW12WmI0bGNCZDlQR0hzQmRsdDV0V1ZuZldQL3pySjVYeWRlQlhkU205WGNuNisrV0tiRGdpbHg2VjRsYXdicDZpaGxYb1FBUzZ6WGlQb0JyVTljd016MXJoZmJZTGxPdlpRaTBXcW5MNUpQM3J3UHlSQi95YVB2TnN2Z1N6Y2o2dWZTdEJQU0p4STJzbmVmcDYrdVNqNkVOSWRqbG1FU0wxRUVXcHl2WUZva0lHQnhzWW1pb0ZiVURJV243SW8wSkdCMGF4SHNmM3F2Ym11MVlqbjBXZ1o0bzZQY24xcmk4Y3Z4OFZOTWJ0VVhxSStrVXd2WXQ0MmcxbTFsY21pdG1iSE8rbWRPVHVIYitTdDJYNlJYK2NtTGk4TS8yaytGbXdoMGh5UU1BRWYwcDRIN1RTdk95YmM1Szh5TGhuenQrRWpzTzNoMC9kSEFJSldNNTY5TWVCTFFHbTZDNTVYaDBMQnZYaWFjOGdMZkpCWWVDeTBtR2R0R1Rubk9FaG5QWXVhay9WZjM1cTBtS1Y0QUhsTHZ2ZEFvc0xYZGl2R0hQbmVIYXFRZW1KVFY5RHJKWm5FanNOUUNmck40dHdDTUQzaVBITCtIVWhXdjRtUjg5aUYxYnh1TDRGZ21FNUJ4cVM0YTRiWEJwZ2pCUkZiZkNEOTZ6RlhmdjJvQS9mL29IK002Uk04bEpqcEhnbzhHZEdPVEYvYkdCZ0lKQ0JkRHV4TERjNmVLMTEwL2hqWlBuSTlqdjNzckxUMEFGdXV1SXMxelZBcjQ4Nmczc01Va0piRTNDdHdMYzQzVTFyUVZ1UzVRcFQxS1RicTBBbjlEUVNzeGlLSnFBVmVaZ2lvdkpEYWphTXJoTXllWE5PRmRyZTUrZVc4Q1dQN3FPckJXa09oTGprQUJMRDZETFJIV3ErcW92b3ozbGNYcHJ5bEdCVG5nUnZvNTl6dHVHbGRkeDZSczVBaEc3R1hlQWFqMHM0Q3ZiQktoaHNZODcwdFdnV1BRZmp1MXdSTnBub3pzSFlLZzlHTFduRkNWenp3Nnh2QU9hQXdONC9OQnVERFM4amhOdk5CWDV5OFgyK3FpMndjVXJNM2poNkJtSWR0RUN2ZTIxWnNNbmdOZWU3QVh3TVdyK2F0K3Erai90TjhQTmhEc0s1SW53bTg0RnlOcDhvK0dRY1lDQmRBQk5ucnVFcGRrNXRFWkg0b2NNaUFjMHlQb1B6MGRSOFRzQWd3TU5MSFVLT0VUZ0prZTYvdVdGVWVDL2hIZ0NrKzZYQjdCdC9UQUdhcVN5RmQ0SjU2Zm1JeERDNmZZOEpUWUV6TTh2cGkwbHEycFYwclpCKzZjTzdHV0N5aktBV3RNYkJzcmFPVmpBRndsYXJxL09MT0pmZmU0bHZQZmgzWGovby9zaSs4UkVUbHo4eXNFVlFsalRJVDdSNkFKSUIvdDRSSi9Rdi9UakQrQ2RCN2ZqTTE4K2dndFhabk5tUkxoNDBRZ2d4ZC94d1RSeGVhbUQxNDZleElrM3orR3V1M1ppOTY2dFpnMjNraHkzRXRpcitYdUJldzFZbTRnMWdYdVpvU2lCdHNuVlczb3Z2V09aZVhBTW1JelJLSysvU3hDQTEvVjNJQUVyNHRpVnRYalpSdWRaUFoxOFdLUThzVXdIcTZMUHJpV0RSakVEQURFRWRLbCswVEFndFVjYW5lS3RaQi9kcm1xeTlKb0pWRzFEUzA4elRXMjJ4aTc5N2xTdDNuQUpxSVdPcU5ZQ01MdVpuQUg4OU9wV05RL05HMmx5Q09Lcm5uY1k4VmE2d1BYRzVkRzRFNHFJVkUwZlR4Q05LUCt1KzNkaHVEM0l4bzR5dHJpdm5ZL2FCcWNXVHhDVC9jV2xaWHp6K2VQc1Jwd0EyUTFnZ1p3dmg0Zk0zbmdxamNQU2ZBRUkzZm0rcmVxWEFQeTdmakxjYkxoajFQVUE4TDczL2ZwcjN2djd5cXI1WEYyZnZPRTkvUDdIc2V2K2U5RndnUE8rb3FxM3FuYnZnTVZPd1BZdjlkTUFBQ0FBU1VSQlZOWFpKVlhGSjR0THllY3lEM2VPTFUzbCtuMkh0bUwzNXBFMXY4L2s5Q0srZS93S0Qwb3JYY1RuRHNDbHkxZXh0TGlrVktvOFYrc21OWkFtcXJXTUZpSXVRQm1qY2ljNEJLUjFlUHRjUVoyeXVMSWpuZTJieHZDM1BuZy9ObzBQR2FZQldkbFNybFhkNWUxSTZRSVJsanNGdnZDdFkvalN0OTlBcHlqTXpvQzBleUFRb1NnSWI4dDYvRnJES2sycGU5eHVEK0x1dTNaaDk2NHRlU3Jxa1djTndCNlRVWDBaVk03OWRvQzdhYlBOYS9pUE9rYWdMcDI4ZjFLOUl3S21rWm9GSE8zKzl3Z3dhZjNkSVcyeHFnUHdDTW9KaklVQlFLbU9sRWZ1azBPWlhCTUhYSm04aW9YWitUUzNGZWo1UDJGVzRLcmxTN21sTWxjTDFQTW1CM3piMTZIdW01VUVCM2xPVEdEMEdvbmVDTU1tYW5xbFF5S2tsV2hDSlIyQThmRWhrejU1dVh2NHdEYnMzTHpPdGxLRm9xZzFpT0NkT0JKRURVUUF2dnl0MTNCKzhocENFVlgrUWs5SUhIUklJUUIyYmxrWGovM1dRZGxiVFE4UVprNWZ4clh6VjFmL01Dbjh1NG1KdzMrcm53dzNHMjc3RmpvYlFxRFB5TnBMdG9aczFiaG1TOTM1WXljQlJPbFExbkJWRWhWZ1VjTXpvTlVVcTNaSlI2b0dUdmZKRUkwQ2FUbE43N0N6VDZ2NnMxUHpERkl3WmNkQlJyd05UcmJPWlZ2a0tQMEs4OU0wUmI2MXJ1eS9Ya0d4ZEcvcklBS1hSUWhGS0czdHF3SzhiTk03YzJrYS8rdi8vU3llZmUxY1JyUjBpNUhQbWF5MEJzb3FVL25MeE5ZN2g4Rm1Bei83dnZ2d1gvMzdQNHA5MjlabnpFWmlEdDRtZ3pzYmFKWGZLa25yd3VMaUV0NDhlVTRHb2Z4SmVmZ2lNV1dKa01rdjFabjZDRlNxMXpCMTFmd3hwUzB2MHU1RTFBeU5BOVdtcjZsWFFadE1YbWtMc3JZb1VFZzl0ZzVOWjZRdEMvQUEwdi94dVFWNFFYRUw4REZ4RWowVlZHc0FYc29UTnNKenZPY2lrZ28raXZIZWpIVjVMaTIwMjg4eVArK3dmdXBSU2hQZGIrZis0MFZvS1c5Tjg5bXZ3ZHZ5ck0vOEpOQjRMdHNsMy9XdTZqOC84MWZQWlZiOTFaZDgySXRBNVpDWFpXaUJ0cWY4bC9zeTk5bWZoSzBEZXpkajk5YjFjTWFXcW9Ib2NqcHV1Wk10Z1J6bm9vVjh3M3U4Zk93Y0xrN05SSDhJS3ZDbGI1VUdKTkFhYUdKQWRzYkllSlRyTWlNRUFJRXdQOVgzcVhPZjZUZkR6WVk3UmwzUDRVK0o2Si9JT2VtaW1oZHdCNklQZTFIYlg3a3dpY1daV2JUSHgvaGt1cVFPZHV5T3RvR29LbXJ3NlhSRGd3M01MblVCcEcxejBYemV4NjFmc3IyTzRnUjF2UGR0OTJaZUZsaGpLQUxoSEt2cWlSSVFNbzJCYzRUNStlUUZEeUt0Y0xBY2ZFWGJVaWJNc0Y2bm9NUmR1WEdSbXBsbEwzdWZ5NjZWc2JFcSs1emhXaXE2K0xPdnZZcnZIN3VJbi92Zy9WZy8yamI2UE5uMkV0c0ZRRzBrWkZ1ZFVVUWlxbUVkS0FUczJqS0cvL0pYZmdSLzlkMFQrTGRmZXczejNVN2t0b25pRVpCdk04YVhRLy9WMStkb3Qxc1ZpYXNxYitlQW5wTG0vWkNYczVMVXpybnJocEtNazZ3OUthYk1XTmp4WndveFFKL3lVN210dGk1YkQ1WHJUM1ZIb2t4R0NrL2Jxc0RFUFhOd296SitZZ0tzaTlrWWIwSGRTTklHM0ZYRnJnK3EvdTVUT1NJK3hyVFdKVzVaVlM5SDNOcjY1RnFYdld3N0FaTTI5WjByMFNPU3VaV21uc2xEdGlTSU1FcmVKR2RDcFl5ZFhBdHZ4UDJzMG5kNll5U25PTkF0Y2Q0RG9MZ3JTcXpweFhOcFFHU09XRmdIUEtrMlZjb05uckJqNHpqdTI3TUoraVc4dkNOYkFmQldPekNJeDV3TkVCSE9YYnFHSThmT3haMVJudFFXcXdqUldqK1lVemNCd3RnSVc5VXJsNGxxMElGTDZNNHRZWG1wVTVPb1oxZ0E4TmwrTXR5S2NFZEo4aE1UaDQ4UTBaRjZDYjc2dDlzdGNPblVXUVFLU2RLalpEVU9qVXY1aGxwTmxXaXQ1RjhZYVpjb2dsSFVHa1IxMXY0K0xPcUpnUE5UODFqdUJyVmNWNjJCV0pFVFlXNStzWHF5bkpIVzVWYzVuVTZrZTgyWC9tcGNrVXYzY2tLZFZZRVhnVUU5TzlrdXFyakVTWTYxdXRlNnVheWpwNjdnOXo0OWdiOSs0V1JpWkdDTWg2UkRqTWd2WEwwUVo5bFRyTjdHdk1lSEg3OGIvL1FmZkFnUDNiTU5CUUZGaUdmT3Z4VVlUMzM4K2krcFByUmJnMGxTdDlJcTBKZkVMcUJwbDJLcVpjU1VWdTBhMDBoNU55bTVWeVJ5WVFRTTA4bHQwcm9FWUd3OXRsMGxnTStPZjRXb2FjMVo0YnJGTTRFdWtOVGlrbE13VVkzbVlvWmNJNldhcGh6Z3hTMnFqbThyMFJzR0lDMFhRcVhlSkFseitVWXFsNy9xREFmMjBLeGNjcmNTc1VyNTJnN2tFcnpOcDVLMzEzTGpZVjBsYWRwSzBTcHR3OVRuVkpvdXR6Rnp2dVB5TXJNNEkrMVhUOXBEZXU2QWpXTkRlUGhBM0lvYUhkMUkyM2tYRkdza21uS0FtZFlMTEM1Mk1QSGlHOXJuS3IwYlRXS0tpMzArckw3cWRSU25RYzFqTXoyL0lZTzdweVltRHZjdCt0OXN1Tk1rZVFENERGSDQ3V2pObVJ2aFdjTzdFS0sxL2VuWGptUFhvWHVqRXdRNDNXOUpFS2sreFhrUUd0Nmh4UVo0NHZmV2daSi9lZ0FVMGdSR0NCZ2FiR0xiK3JWNXVSTWllZXJ5WEZUSk00MVNTWjZKaXlQZUgwKzhGN1VrY2ZRczMxWWs5NVNJWWlTaTVwN3lFK1QwUkNtekpwNnQwV2ZNVHhYb3JXUmZoSUJ1QVh6MkcwZngzS3ZuOEVzZmVSQTd0NHdiWnppUklGWnQ1Y3h6bjdoNTc3bCs1N0JwM1RCKy9aZmZnMjkvL3d6KzVJc3Y0OHIwUXY3K3R5WGNlTzAyWjlzY2ZMRVdhYjFTY3crR3B4K3BQZDNiOHRPNDZkV1dQRS9LYk1lbHJWWVlqZlRjMUpYbE0yU1ZJNk82bmV5dU5BUE1WcHJuWnlJMVMzcVdxTW5WQVh4SkFsY3RRUW5jRTZmS3lxcVkzcGZVK3pBZ0lxNzJuTDZEV2FvU1FWdmluTW1QUERqN1h1V2diWS85WnBwcC8yaFFobzhiUUk3UUVJbmU4WE9YSDA1RFhBZXgxQnpmWFl5aGMyWlU3OEYwbWxzbHkrU0JZcmNFRWdkazZWdUtsQy92N0oxRHE5WEVZL2Z2d2tDem9Sb0U2OEpRbURzWk00bTVpOXZubm43aE9EcWRBbUtBS1pxZXdpTks4ZUJ2eEV6a3lCQWZoa09VOTFkNXJFdGNJTXhlbWFsK2w1WEQyNjZxQis1TWtQOVRJdngyQlBRRTdPSUJUOVQyM2tkcDg5cmtWY3hjdW9KMTJ6WURNTUFDQit0M0hpQ05HeHBzWW5HNU1GN3ZrdE1jM1RhbitSMjJiUmpDS3RnTFFLUVFZS2xUNE9LMUJaVmVkUEtUR09qRTM4aklFSzVlalFNbEZVL1pCTFlQTThNWlMzaEpGWFdxVmhld1Q1TXZEczVRZWliQXJjOHFnRjhDZUxFWkNIbjh5WXZUK04xUFQrRERqKzNIUjMva1hqU2I5cERPK0gvUWlaS2VCT0lsRXVFRVhES1NjZ0RlL2VBdXZPUGU3ZmpMcDQvaXFhZVBZYmxiOWlkd0s4S3RaUjFXTEkyQVZtdXdDcVExR1c4RTJLdHhKVWF3VlBoYkJ1N2xPbnVCTzNxTWF4ZEJSVTU0UzJDWUEzd0NTd1p2QVFHWFRPSjBqYndHNEozVkVnZ3pRSVpoU05XeTlrbkF3YnlBWXhwVGNjaVRwUHZVeHNSd3dNUm51d2RnNmxXa1R4MXI2NWJXMTVHbmJCeUlUM3JGeVZTbmFPSGtJZ0s4MHpLSUFWNlRjTDJFS2tDTE5UMlJad0dHWnpyVGNyR2RnREwyU2Mwdi9laWF3T09IZG1Hb05aQmVSTlFuQkJYMGxFNFN4ZTE2VE1lZVBYSUdWNmJubEpud2lLcjU2RlNIRUR5eTAwV0RjeGdmYmFkQldacEFhUzdJV3dPTDAzUG9kdnFpUmZNQS9xS2ZETGNxM0hFZ1B6RngrT2lUVDM3eUpTSjZSTDNSaFRnWTgxUHE0c2N1Q3VEczBUY3d0blZ6dHFaZUJucUhCTnF0UVFiOXhCSHd1ZzNVb1lYc1duRUU3Tmk0dWhTZmdCVTRQVG1QYmlGZ3pUOWxva1hGU0JnZEc4RzE2VmwwdTkyY1crY0JKZHgvbWJ5WHgySk9KQ21MdDl2cUxPaXJrd2xLOFdYQXQvNzdNOHQ3QS9EMlZMc1FDRi84OW5FODk5cDUvUEpQUElUNzkyK0drS0VFOTh6azhQNDZ6MHNEMFdOZUpCcnlyUXBpcm42d2daLy8wQVA0d0R2MzR6TmYvajYrOWYyK3pteCtTOEthMklJZWlkcnR3UXFJMWlhL1JjQ2VsVzNCdHFhOHZzRWRkZXZ1Sm5VcGI5Wk9xb3NuSmQ2eWRpMzJIYzZsc2pVTklBaVZ3TlhtNFZJdHdDY0pPZDl6cjREUGt6WkoycmxFNzJWZnQyRWVwQjFXNndCWDluZ243eVAxcGE1UTMvbWwrTlQyVkdhS3ovc1NwZHVNcEZES2t4Z3BrZHdOSTZiZ2lmUjllTjFiQVIvUzFnVFE5cEFiWitwUCsrRXBIdVBOYU82ZE1BbThmWTd6ZSsveGpudTNZM3lrYmRycXBESHExYzRCa1VaemROd2E3M0QweENXOGZ1b1NSSGZpUFNFVXZFV1NQMXBrUEpLWHpuWnJBSzJCcGhwMTYveW9Ua2lObTcwMFhYNjRXdmlMaVluRDgvMW11aFhoamdONURuOEM0SkZvWlovVTltcTBZY0RmZStETXNUZHg5eE9QWUxEZDFuM3hTVEtQRUpPZFBRK0hvVllUY3dzZEJYcENCQnoxWmMrcWR1K0FuUnQ3YjVzVFlpb0FUd0JPWHBwRlFSVEhJeE1JT1lyU3Fmb3hEc1AxNjhadzZmSVVSQ3JwVVVOK1c1THNwVjRMQ25aM2dqNVRjQmZRUnU3MkZ2bitlRkJ2Z0M5Q3NvTW9TL2lYcHVid1AvN0pNM2pQZzd2eFN4OTVFTVB0QVNYRXNxL2VNMmNQWGtNTElNQkh5UzFFcHdjYUx4cVdUZXVHOFovK3doUDR5THZ2d2FjLy94Sk9uT3RyNjBwZllVMGdma09KNDVwOFBRMHB3Mi9sVVZaaFA4QnVjdFdXYWNHOW11OEd3RDFMVDNsZXlsSWxwaFJHNndWRUVJSmRlNGNCWUFGanB4N3VFdkFuZ0pmMEZ1QUZjSjFLaGlXQVJ4SWNrMVN1VFlyUE04Qk8vU0RqT2FaSjY4N3BjV3BEMmJNZGJKd3BMN3ZuTkJuN1I0RFpTbC9wVitrNG9WRlNuelh3QXlYMU9saktsNzRYRUNXWW41eG5ZY0E5QkxHeTRENGp5RloxRUlBR2c3NmVOU0phQUpibUhZQkQrN2RnKzZiUmpOblFUWXJtZTJpYldUQnpqbkIrY2diUHZYcUtWZjdnWFZlUktTdEVrSUFjT2VzUUVJMmV4NFpicWF2TFkxTUhiaHJBWVdrWkM5Zjd4dXUzMVFHT0RYY3F5UDh4Z044aFFrTzJ3VVVRVEJLOC9idTB1SXpMYjU3R2pvTUhJc0NUQUVOZ3FkQks5M0VDRDdjYXVEN2ZTWDdxSFErMndOYmdQdVliYmpjeFBqeFEyOGdNNEJrc2w3c0JrOU9MQUJEWDQ0VzRDTEFyUngwSjJ0RElFSnJYQnJDOHRNenZ1SExIaUdxc1RMS3R4SjZZanBKVUQraGF2QVh3K0hQNW1qdm5LYXZsNitJcUtuemVsamp4OG1tODhQb0YvUEpQUEl3ZmVXZzNPOFZKb0MxcVNuZ1hEd0p5dkx4Q0RvVks5SmF2aVZjSGRtL0VQL25FQi9IMFM2ZndyNy82Q3E1ZFgxeGxPTjJDMENlUXJ4UUdXNE1aSUs4TzZpbFZOWDR0NEY0UDdQcXNGdHpyd0RyZFVKNjBSL29TdUNNeHBubGJyTlJ2UVpWVXdnVU13Q0tCaTJjQVM4QlpCWGgxY0dNa2JBdmVNa2ZUUFJUQXl4STlVSFZ4QytUbFdSd1NRTW1BWFJrWjR2ZktOUTVXYTVEK1QzMGdiNmlhalJMTklKTld5b25yNmpGdEpzbWJieVJsSjdVOUVoM1JQbmVHdnFTMSt5aUZBekIwSkM2VnVLaUI1Y0tqM1Uxa1NtU0ZUdWI0dnAzcnNXL0hCb2dkaGdOWXN5Zm11Y1krZytJU2dweDNQek83aUc5Kzd6ajNlVHhueENQUzlCQlNXYUs2OTk1RkF1MkJVZlpWSHdBK1FqaHBMU3FUQ2NEYzVFdzJqdGNRTGdINDgzNHkzTXB3UjRMOHhNVGhzMDgrK2NtbkFIeE1wUFZjZ2svcjg5N0hFK1pPdlhJTTIrKzloM2ZETVloUTNEb253QkZkMzhabkRlL1JHdkJZWEM3WUFRNEJJUzRGd0xtNGRjNmo1OTU0WXFvVW1MVVY0N2FMMXhaUThLQ09BNVdsQkJlMytPbGtpZG1qTkw5aERPZlBUV3JadllCZTZ1UTd4TW1yVDNzRHU0a0xCdVN0bWg1SVlBMUNWWUxuUVU5Mm4zMVVGZFFDdk9TZG1WdkMvL1p2bjhVM1h6aUovL0JuSHNXbTliRS9JOEZoRDRPUldzZGxFd0NGcTI2M1Mxb1pzWmQwZU44aisvRDQvYnZ3RjA4ZnhSZStkUXlkN2hwODJ0OUNzTDZSTURqWTFMVkxHM3FCZXQwenFubFFCZmJlWmRTcTVQVmliZUNleWlTYk5hczNhemVsa3V2QnZRUnd6cWl3OVQrUlltT2UzS2hOSkRIUm5NWDBBdkQ1dXJ5VUg4dXg2KzlsOWJ4SzlNeFZXSkNXMDlnU1FFdlJoZ253WmoxZThwbDBWcHBQR293Y29NM3JaL1hZQjNVa0k5UEFjQ1lyeWVzekxsUlU4bGFONzh5OUFKK2M3c1ovRWpQQVArOVFjN3BjcEgyQkFPZTVuaEExQnlFQVd6YU00SkdETzlDdzdna1JLeEFOanhyZldXNEtoT1ZPRjEvLzdqRjBpOEFxZURHMll6VzlFMmJSSWJCUGUyTEJiblM0cFZwaG9jZmlFajJGa0c0cFlIYXliNnY2LzJOaTRuQmZlKzF1WmJnalFaN0R2d1R3TVVEMmR4UEU1VzFjNnpFTDZ2Q1l1bmdGczVOVEdOMjhVYmE5QXc0b2VJOThjRkNYdGJMbU85SnVZbUc1QU5paUd6NG9tSGc0RklHd2EzTVY1SFd3VS9tYWNHRnFBVVZJa3JxVjVBc1ptNVM0ZDNLRVZxdUZkcnVGdWZra2tWb3BvVXovazVxK1N2MFRaMTFlbXpkY2VhLzdFRlYwMWhsTzdQK1NaWDB3em9hSWdaLy9TajlrNi9XQjhPS3hDL2lOUC9nU2Z2SEREK0NuM25zQWVpQ0krS2NHRUppQTY3Ry9xQVA2cFBLSGowZEMvdUtISDhBSEh0MlAvK3NyUi9Ec0syZjdIV2R2YVNoL3UxWXJXdGJYQ3dJMTRHaWZsQm1EMHNWS3dCNmYxSUI3R1hBNXpvSjdwWndhY0xjbDlBSjMrNnk4Qk9Ca1lvREJqdk1wNkNJSFdsWFZ3NENXY1pnRFFQZGNsd0ZlMUxrSzVnYmdheVY2a3orcDNvMnEyOGxXMEFST0RrQ3oyVVMzMDhuQVBURUVMcXRQMnBYWnJTQzFWM3FuQnQ5dFYyZkJNZzFLS3h3cTN6bE94V1MwbUF6dlhFWkhLcUN1dXdpU21sNUFHM3E2bkFGOVFOWDNRREs2R3gxcDRZa0hkNlBKem0yeWx5WHoxZ0xzMnVoSVk3N3h2V09ZWDF4aXNHWkpuaGtDVWMrTHkzS0l5cDZOZmNkR2huZzhPRDNsenp1SEF0eDRXTUdCc0RROWo4NXkzM2o5aC8xbXVKWGhUZ2I1cHdDY0JiQUxBTks2dlB4bE1ERWY0c3pSTjNEZjVvMzg4ZGtTMWtlZ2QrS25YbzNzSEZyTkJock9vUnZZMTNvUXJpOE9adStCM1p2eS9mRXJBVHdCT0g4MWVybHpzbFlFUVBmd091SCt3ZXVJMEltMWZzTTRadWZtS3dUVlZTNE1vYlFFMHhMNmtOb2o0SkFBM1R5akhKVDFXVTI4ZFl3amEvbmxRMjVFZ2k5TVdtRUFFQWlMUzEzODhWTXY0aHZQdjRsZi9mbkhjZGVPOVF6MEFCWHhHd2xoc2c1MFNMOXdQZEFqQUZzMkRPUFhmdkVKL1BnVGQrUC8vTUpMT0hXaGI4T1ltd3ExbUYyVG9OMXVaWklzMEF2dzMwSmdMMTNrUUczaSt3VDNyS29lNEc3cm8reWhpM1BHQXB1VmZFdVN0SExMS3VsYUNSbUtCU3NDUEtlclczOFg1c0puNVZnVmZrb3JCU2NBajMvSDE0M2kydFExWlZES3FuMUpxd3lBTXJrNU01QmVxbktKK3RnMHJxU1BMWE1DZ0krREpaYmdFNWFxY1JvWHdDNW5ZaTd4SjY4cWU3R1JTdThTcmV1ZGF2NDhxLzBEeTJQWnVueUk1NG04OTVFOWFBOUdLQkxHVEw2TGFDREE5REo5OHRqT2I3OThDbGV1emNVMkV5bHQ5MFFva0p6ZU9OVUl1RWh6RVRBOE5JaUJScFR1WlFjQUNBZ3VtQ04ya1RxUmdObkxmZE9WcjA5TUhQNUJ2NWx1WmJpam5PSFlNREZ4dUFEd1IzSXZRRk4yL3BMV2lBbG5mL0FHT292TDBRMHJHWWtVQnFoZ3Rvb0JHQjFxYW5rQ2J0RzFiTUM2NFVHTURpVStTSXhScktSTEp0L0NVaGRYcnk5bFVxd2VueXJYUENtS3dCSXl2MU56WUFEREk4TlZwemp5SzlJdk9hNEo4V2ZUaVVNY2FVTVJOSC81T05lZzZYdlVHWEpIT3JuTDJ4QVpMd282MFFPM1Q4K0hOeEord2YxYUVPSFkyYXY0amYvcFMvamp6NzJJNVc3QkIxWkVZbWNkakRpWGlHUFpzWWFUNDRVQlZvbkdkQWYzYnNJLy9jU0g4UGQvOXAxWU45SzZwV09TVnZpdG1vZ3ZXcTJCRWlOVnlxclBLREZuK2l4ZUtITnBhcStXSldYWXN0T0YvcE15SVF4QmFwdk5SNlFwVEI1U0pzSUNpc3lUdkYzVitpU3RmR095cWxrd0E4eGw1TVoxOHFzQitESnpnQnpnTlFlbjgveEFnRmNjeXlRTGZTa3phUTBFdE5XNWpYMm16SUZEcXoySVZtc3dPWXVSdER4MkcrTCsxYWZ4bnB6T0pOZXlUcCtYSE1oa1RtOWdmc2xKalRxeU1jOGMyQ21OT01weHlRMXRROXpZbHVvb3U3YU5iVXJ2VVhHSW8yV3pBYUxVYWVad28rSHh4SU43TURiY011VWsxN3d4TFpKVElQbmJpRmI0cjc1eEFTZlBUYVZ2SWQrQktJdVRiMnFkRFRudnNHNjByZC9GTzlMdmsvbzQ1MXJEY2hmejAzMGIzUDJMZmpQYzZuQW5TL0lBOENrQS95MTRMbHF1MGJKWDNrUDl3RjgrZVJyYjc3MExRRlM3RTZLbGZCQW5DR0o5VHdRWDRwNTU1NWNabE1Ecjg5RVZycWpxUmFJSzhzMlpRWkE0Z0JESTRmelVQQXFTUVpZNGV1Rm01ZHpyN1B4cnJzQTV3b1lONDVpZW5rdXF0UldDbFo3a1BwZnd5UkJuV1JPTDZRTWxnbHVXN3UyaEVlb0cxMjZUWTJxZVMvWlVrZXd6ajRLaFZBWXpYdi9tYTYvaUd5K2N3cS85d3VONDlPRDI2SHFTMGxiSDlJS1JoVmZMZk85WUpSaFZjQVJDOEk3VmcvSDUreC9kaTNjZDJvR252dms2dnZTZDQ3Vm4wSy9leXl0K2dCdDYyRzRONXFscXZqVlZMaFRLMDMxTkZXdVcyam1Pa04vWUlpbi96MTVtWTYvTTROU3A3T3NsL1JqTHdoUFBoNVRKU3J1NjltNmtiQ3Z4azg2clhCSVhNRWJwWHVjbFA4Z2sraXhQVXMrbnRYbHVuYkhHbCsxNVpVWUFBRWJIUmpFOWRVM3p1aXdQc210NWI5MitXNUsreStyNzlNUzBRU0pkZVJReXc4UzJSb25KZ2tyd1lyV2YxUGFKYm1RbnpybkUxUEZYakNmWXFUWXY5YVhVay9iRHA3bjlqZ1Bic1dYRHNMWlhBRlpGZHZrd1lxYXY3K2R3NnVKVnZIenNmQVJ2OEk0b0Y1ZGR2WTlMclU3WDVrV0RLZ3drb2QyTTIrWklqQUw1bThvY3N0czJpZGNhNXE5TXI0azJtekFGNE4vMGsrR3RDSTNmK3EzZnV0MXQ2QmsrOFltZm52N1VwejczSklBRE5yNDhNWlF6aDhQaTlWbnN1di9lYkNMbzlDQ3pqbVpVYnlDSGhVNDNJN3JPQWUrOWJ4czJqYmZOeVdvSkRETkRGQjdZcjU2K2hzbVpSUzFmTlV3eUk1eVZxSklCa1Z3N0Y0MEo1K2NYTTRtdS9CTWp0d2pZcGwzbU9zZ3pKQ0RPVG9FSzVpOGtUeFg0eStwNlpRVElnamEwWFdXdmVKbTdYSk1tOExQWitTVjg5ZGszY1g1eUZnL2N0UVh0VmxPL2paWFU3SmNrK1VDSy96d1prWStKZ1liSG9idTI0TjBQN3NiVXpBTE9YMW1qUjhrMXplUCtXQVJKdldQSEZnd1B0V3FmMlJ1cWVYb3JnTDFTOWdyZ1hzMjNPcmpiZHE0RTdoSWlZV2VDaWdUQ0FwWXlrY1doVlE3QXNZenlkclk2YS9VeXdHZjNWcUtYK2t3NW50Tm8yUXpXM3Q2N3VMVGtYYUpGemprMG13MTBpeTdBUnNLWkJGNld5cDNQSkdnNEpPblhlVTJiOGlRM3RhbHRUdC9EL3FROTJsWXIxYUlrQ1N2UUpxWWtQNFFuemtJSG0xNVNhOGVucFpKU1dRQndZTTltM0xON0U1Y1h2NjczRHMybTBjNUpHelBqUllkck13djR4dlBIK0JRNUdYRENDQ1d5a0NpQzBRNXh1dlZqUS9GWVc0bkx2T2NCRUljN1VuNGdUSjY0eUxaZ2F3Ny9ZbUxpOEcxeGdHUERuUzdKQTlFQTc2ZHNSSlF3eGNJZWtLMTBRTURWeTFjeGRlNENOdTdlQWZHY0ZpWERlRHBSQ0lHUGtPVzltdDVocE4zQXRUa0dLdUdJQTdCbnk0Z2FveVVBVGNDcDNDd0Q0dGtyODZBQUZJNlVjSkZ5OEFBQ1ZFSnh3akV5WnluVFlOMzZjVnk5T29PaVJ2S1VzS3FVQkFQVytpeG5Ba1RDMXlNWEtmZUdWejY0UnA3WHJkRlg3MFd0SDNLanZVQlpHZEhPSW42VHJ6eDdITSs4ZkFwLzl5Y2V4dC84d0gxb05DTG5ucTNCODl0NWZ1OGdRQytIVHpoaWd4dCthWjd5V3plTTROZCs4UWtjUFRtSnozejV5QnJXNi9zRDhMWG1IaDVxWWYzNnNSb2dyZ2QxNE8wQmRuM09sZDBzdUd0c21ZR2dQSzNuZVNEN3JYVzlYVDZkZ0E3QVVwZ0FzRWgzTGdQNDdHWE12Rk5BUjVXWmdKWmZXbjkzVGgxWVJTWkE1aTNueVNSeEtjY0N2UHdsakkzeDJud0pTTE8wV3BkbFVGSzUrWDMxKytWQ1QvbDdTQ1l5VnZheWhSV3FsWWp4UnV2bmpDUlAvSzJjaXpUUisxeXdBSkpESEtVOTNLZU8xSkllQWRpOWJSeUg3dG9DbFhxNEx2R2xYK0lDa1pnN3d2eENCOTk4L2hoQ0VkZitQUnROUnkwZmYzY2pxRVhCRGxGTEN3ZHlEZ1BlWTZnOUdMSEF4WGVHck1Qem1IYkdUd2Vjdzl6VU5McWRicVdQVnduL3N0OE1iMFg0WVFENXp3SzRDR0NialJTTGUxSFZOeHBlZ2Y3RTgwZXdZZGNPVHNtVzJoVGk2V2pPT3JweGNDRU9vT0YyRTdNTG5ZZ1gzbUhMK2piYUF3MEdkRlJCa0JFbjhBeTR2dGpCekh5MHV1U3hCYUZGVGdjcTlLK0NQYVhKS1FaNjZ6ZXN4K1ZMVjNwMlNHSXdtU2hiWWx4aUFDeGpJcE5QbGhoVU15RDNZdVV1YW5xUi9ORmJlcmZQaWw0U2ZrbktqMHlCWVFDNHZmT0xIZnpSbjM4UG4zdm1kWHppYno2Rzl6eTBHMVdnbDVkbGIxWThlVlhWejNGS09aa2tlampjdDI4ei9ydVBmd0RmZSswOFB2dU4xM0R1Y3Q5YllXcS93MXFDY3c3MzMzY1hHdDVYR0xLc3pGNmdYa3BheHlqMEMrNlUvNWZseldKdUFOeHRlV1Z3QnhKZ1dCQUdTbTVwRmV3aC8wRlV5dDZBa3U2VlJ3SmFtV01DbkxCcG5GRzN5ejBTS0ZtQXorYXFGQ1YxY0xQa3VkY2g1N0swQXdOTnROc3RkSmFYSytDZVh5Y1VWNkNYdjRhcFNOMlN3MzBWK08wM0k0MGdicU5za3lPVEJFZytBOFRLM29JNEtMbVFKUVpObmRNc09JaGluUUF6TDJQNW16ZU40Tkg3ZHByMzhqcldrcnJldkhpYXd1Z1doS2RmT0k2bDVVSXQ2UUYyWU1aTWZnRmsxdlNSQVFBZ3p0UElZV3kwcldjYUtLTUloK0FRd1o3ckp4QmNpTDd3YjhERDNUTVRFNGVQOUp2cHJRaDNQTWhQVEJ6dVBQbmtKLzkzQUw5UmZtYjkyRnVndjNqNlBHWXVUMko4aXh4UkdMbTlkSENLZFhjYkpjT1I5Z0JtNXBhajVCMEkrN2FNcXNGZThnb0h3SUNpcXNwQk9IdGxEa1VJaHNpNFpFRVAyVWJIRTVXUFJKU0RhWFJ5OHp3Y1h6ZU1LMVBYc0x6Y3pTVVU1TVJWaWFrQmVabVErb0RiUjVxT2ttZXE4cjB4VEFTL1d3N01WcXRCSzBqMkNlQXJ3RjhHK0JwVU96ZDVIYi96UjEvSE8rN2RqbC85dVhkaDM0NzF1cDB1U2ZTSmVLaGJYS1lJUWxEc3ZucVl2Tys2ZndjZVBiZ2R6NzV5Rm4veHpSL2dZczJaMFAwQStGckN2cjA3TURvMmxIOC8xSU42ckwrTXJIWEFYZ1huN0w0RzJQVzVNSGExZVhQbU1TOXU3ZUJlVnMyVHFUUE9od1R1QnJsNHhwSkswQW1zWTM2N2Y5NGVRU3ZnblZ1a1UzcG0wc0JvRDhUSHZGQjN1Lzd1c3JweXNBVktlL25MNEM4QURzTEk2REJtcm5WNlNQQnBDVURibkdrbjZ1dE1uVllmN1BleEFCK2xWOHNFMUVqdm5FQTkzVGtsSjV3dUNqQUM5akkzOVVDYUVPbWUvRThPV0QvYXhtT0hkcUhwUlJlWEdIRFpWNU5MOHFTZFNTQjgrK1UzTVQyN3dCSTJhKzQ4Z09BUzAwZ0V1QWpPWUtjMzBhMHRqN3VHdytqUVlOVGljbU5GY0hEOC9wSC9JN1hNWDVwWndQSmloelVmYTZZTWQ0UVVEL3dRZ0R5SFB3RHdYNkNtdldXZ2wzMldKMTkrRFE5OCtFbDQ0b0hEZ3lwS0FRUWlEK2RKTkwxb2VuWjF1OWlGOThDK3JhT1JVNlJjZ2s4Y2E1TGlDY0RaeVhsZE9nREZRWlVrQWxZVmlzRmR5Q2V0cytPRzUvbkdUZXR4N3V3bEU1MjdzclJqalV5RU1CM1o4d3JZNStyOE1yaG5hL2RFTmFCdmRpZ1FLUVBVYzYyZVNwTCtDZ0J2MyttRjF5L2cxMy8vS2Z6VWV3N2dWLzdHSXhnYmJ2RlhqRVF4T3JCSVFKK01qeEx4S0RNR1FvZzhnSGMvdUJ2dk9yUVQzL3IrR2Z6bDB6L0E1TFczeHJYMCtQZ0k5dXpaMmhQUVk4dFdBUFhzaG1yait3SDJVbkhJWXV2eWxocCtvK0F1MXlyQmlsUnVrRkcyWUNub21VS1NoSm5XeVJYa1JHMm1nSmpBV3dGVEdZcDZnSmUxNlNTMVc0QTNZTTVwOVQwb2x1MU5VNlQxS3MwUERxRGRsNk1RZndBQUlBQkpSRUZVYnFPenZNd01nRjFuTnJRQUFKelhON2YxRWxJNmZiWVM1cFJBWE9LSVFVeFhyT1dSNGJkRXdVaVVhQXJJcVRwZmpaQmRUT1JKMVBkY0xqUGFucmZMalEyMzhmaUR1ekhROE5wa0I2ZmZRb0xNVDJVaVhBVGpGMTQvZy9PVE03RTZuci9pMVM0NEhqT0ZNUHVpMFRPSDhDQksvS1BEcmFneFFOVHNra2o4Qk1DRnhQem9vVG1FK2N2VDJzWTFZdndVYnFNYjIzSzRvdzN2Skh6aUV6ODk4NmxQZmU1K0FBL1hQWmYxWlR0WVpxZG1zT2UrdTlGZ1ArRXBKR1IxbE80SndHRFQ0L3A4Qjg1NS9QUVRlK0NkVHlDRk9uQk1nRHJ4NmtWMHVrV0NHSjBsMGtib2ZTTG9UaWVSSkNXZVlZT0RBNWlkbmNmeWNpZTJBUWw0QlhDdHBKMjBDamt6WXAvSjlqbmk3WHQ1T3VUdkdpZ0Q5SUJrSVIrMzd0azhQZGJrUmRvUE9mQ3ZCdkQ1dHdXT25abkNGNTQ1aG1hemdYdjNiRUxETStlZktHRVZGSkpzcFpLamZhWlNrWGZZdlcwY0gzeHNQemFNRGVITXhSa3NMdmU5OWxiVDhQaW4wZkI0K0tGNzBXeWFyWmhWWks3ZWxtN0tvSnhmM2lTd3B5S3l6TDJZeWhzRmR3bHh5Mk55c3dwVjAxb3AzYXJkcmJTYlM3NmFKcnNYcHByTHBXb2FJQm5YOVFSNHplYzBmUm5nNDNVTzhGS1dBamUzdDlsc3FNcmVjejdkQ3VxUzhaMm9yYjFzVStQQ0t0dEltVHZRclhhVkgvY2szNmUyY0xsY2hqMXJQVXRqdndQa1k2RlVmdjVONU50Qm1ISHZNREkwZ0hjL3VBZURBdzNUWDlWdGQ4N0ZiWFhTNTdMOTdzVFpLL2orc1hPcGZpUEVXQUVtTGZsSXYyZEVGODU1YkJnZlZvWXBYKzZrOUlaQzIwRG96aTdqNnJtcERGdldFSDUvWXVMd0Yvcks4UmFHSHhaSkhnQitEOERmNi9VdzhIRkhZb3pYN1haeDZzZ1BjTTk3SHRNdE5oN1F0VFoxZlF0eGZVbG91Q2pOcnhzWlFMTmhBSjQvdUd3VEE2QWdSZ0N1elM1aGRpRjZ0dklBK0FBNjN2dU5PTUFRaVJ1a0RTQ2tMUjJKSTNlU2dZQk5temJnMU95NTBwdVNyaVZGWmlJTlZMSUVWZHFzaE5nd0tGVEtKeHk0UTdLMk45Sjk3WFhaOEU2ZVdlYWlKTW1IQUFTRXRYTERXWmhiN09DUFB2czlmUDZaMS9IeGp6MkdKdzd0ak50bXhDV2xnQVJjU1UyUE5hbjZtdzJQOXorNkQrOTlhRGUrOGNJcGZPR1oxekU5dDdSNncxWjVsN3Z2MlkxV2U2Q1dxVmtUcUplZXJRYnNtbVl0NEY2WC8xYURleW05WXlKTWpCeGUyVEFraWNzaHpnMkJIUVVjK1U4TGczeEx5RE9wMENWVnN4ZmdMZ0c4b0plTmo5VTVyY3N5RjNCR1BhOEFDcjFQSUltY0dlQnltd01OdEZxRFdGN3U1QXlIU3ZXR3dUQnQwZmFXd3VyQWt5cVBjbERzSUlFemxYSXB2VjhtS0hEKzdIQWFsNzZ2TUVKUjljMWQ3eEFkaXJHaFhXdWdpY2NmMkkzV1lKT1pralF1SE9UVGtmYWxGMDlrSEM1TlhjZnpSODhBRU9kbWp0ZmZZNzNaK2p0cmV5SzlKMzB2eDNuSGhxUFBBZ3JKMFU2VTNITkdWSmcwSW9mWnlXbnVvOFRZclNLZ0xBRTR2TnFYZVR1RDYzUGYzMjBOVHo3NXlhOEMrUEJLYWV3V2xmWlFHeC84bFo5SG85MnVPRVJ3ek1VNnovSE1ZWFlwWU92NEVIN3V2ZnNoYXVpMGZTMEJ1NVZpajV5NmltZGV2UWdacVBsa0xhM1R4VVltb3NYMy9EaE5jUDV6OXZRRlhKOU5hdVF5MFkxeHdqdFhRZDJDZlpraHlFQmYweHVnenRMa2ZaR2M0cXh1ZlM5Yi9sUVRzVnBZQTlmODZNSHQrUGpISHNPZWJlc0FXRHNEczZSQ3VaYkN2cXUyaWErQlBPMXlwOERYdi9jbXZ2anQ0NWlkWDE2MVBTVllCZ0JzM3J3ZWgrNi9pNTlYTXZUT1hRdnFmSGV6d0o2S3lmT1hQZ3hsYmNoUnZWOXd0K1dMZzVSY0NvOWdrYmFDSlJEMVpzNUl2Z2kyVnBKT3dHeXZKUTlndDdaaGhmUzVaenRuMnBQS2lETXRBWGdFTG50VUxCZGxHQUhsU0VCRmdkbVo2eVZHSWpFSU1QWGFleUMxUTNrWmVWNDdZWExnc25IMmU4VHhMazlKSldOSlU2WjNPYjJvYWdKdG1tYkQ0L0VIZG1Oa2FGQTVDVXBkSWJ5WXhqa0FBMDJ2NDIxMmJnbC85WjJqV093VXZGT0hraU11ZGNpRjVCU05LRjRIL2t2SmFab0RzSG5EV0h6TFFDallpWmVVRXdvQ21iaUNBb3JGRHM0ZE9ZV2lFR2RwVXQ2S21zZy9uSmc0L0E5NlBid2Q0WWRKa2dlaU5MOGl5RnZMOThXRlJadzcrZ1oyUDN3b3J0KzQzSGM5QWV6bWx0ZDFBRFRnc1gzamNBS3l5bUFtaUZPSGVBZ0Q0ZXprWEhTK0FPTlhteWUzdXJHdGNQMUk0RTZVdUZveWh6RUEyTHhsSTJabTVoRW8zMUpYbWJ3TzJqWUwrTDJBUFlzemhuanAwQmxPVndQNkZmVSsxYXZyczdoUUI0UGNIMlVpdFFaRzRJV2pGL0FQWC84Y1B2cmVBL2ozZnVwaGpBNFB4bmJ3aStteGtrZ0dlVnE0M1I0alhEdkVxVWFrUElQTkJqN3k3bnZ3dmtmMzRXdlBuY0NYdi9NRzVoWlhCM3NKZzRPRE9IQmdid1hzS2lCY3V1a0wxUFhpeG9CZEdNQXN5aFJTWHg1dUNOd0JKQ2JYSGpUQ2p5TS9iTCtUVXpDTFRIZ3FJRW0xU1ZKVnhNZ2V4ZkpVTzdZaVE1QUFYb0crQXZEZytWbGVMa2dnbk1EZHhqc3VBMWhhN3FvTlFtSVNURmt3ZVEzNGx3RStFd2hzMEErUUN3dGs0dUlRTDUxTWgwZzc0SXdSbmh3ZUozVEM1V3Z5VW41RDVqckE1MzRDdnVIdzJQMjdNRGJNWnpXVStpakdRZU9rcWNJc0xTMFhlT2JGRStnVWdkZmZlWjBkWUt0NWx0ckpPdkdodlA5aUNuam5NRExjUW9PUEVaZThrUlRFclhPeWxpL3Y3c2hoYm5KR3k1SmpjVmVSNWduQTc5Yzl1SjNoaHcza253THdLb0JES3lVaVl2ZXE1SEg4K1NQWS9zQzlhRFNhY1NBRUJuZ0hQaHFScmJESndma0l5bHZYdGRWaGl3WEJPb21QQ0xnOHZjaUdYMEtub25xSURBRmpBWUFuTTBzMVRzQmRaNktSN3BucGFEWXhOajZLcWF2VEdSVEtFTXZYbGVJVEljSEVicXA2Z2IwUWEzc3luVjJHeUErcGtZbWYyeWpVU2U5YXBwSGtWL3hlYTBIMVVuQ0kzZ3VmbW5nZFgzLytKUDd1VHp5RWp6NTVMeHJlSWZEaEdGSjJIZEJIVUxmKzd5Tkl4RE1IQ0NIcTY5QWViT0FuMzNzQTczL25QbnoxMlRmd1Y4K2R3TUxTYW12MkRnZnYzWXRtdzFjQWthdXZ1NFJGNHA3QVhrTFIxWUM5VXRhS3dCNFRVSlkyVDdobWNEY0ZTM1J5YUdNQVNpWUdFdGltRWhMZ2tnTzdIZ1hTNGFNSlZNdjd6K3V1RlV5bFdxbk9NQkZPL2hvUXR0Y0t6aVZBejlUNHpqSERqMHA1bmFWbFBabXVETzRWeTN0cHQzbFgrODdwUWFJZk9hTmtROVg0anVRYUFwanhtNlc5OEM2allRbnNJNzIwZGtDaVpSYzdwM2NjM0lIMVkyMGRGN2JOVm5LdjhHWWU2SFlKRXkrZHdQemlNa1JURXRQeTBvNWp0VDdQMlFDeGhPY2xPRUtjOFh6U25IZkE2RkFiaEFCUTRPbk81WXJyWkFQMjhFQjN1WU81SzdNSzhGNzdJbzNmR3FEL3k0bUp3Ni9XZFA1dERYZXM3L3E2TURGeHVDOU9LWVNBNjlldTQveHJ4MWw5WTRGSnZMRWhBeU1pWU4zSVlBSzVZTkpTOWRjcEFxN09Ma0g4MFJlc011b1dJVjRUTXJldWdkaTNmQ0QxNWE3KzVnUDdlT2M4VXQ2R3plc0F1TXlYZk5uSGZlYUxYbjNjQnkwNzFrTklmdjlOV1pUdTdYTnJGUzl4WFNJdHF4dTRIdjVwZjlreVZnSDRHdzFrL3MwdUxPRVBQL3NjL3ZQZmV3clB2WGJPU0VySlFFaDlianVvdjI2NHN2OTdjYlJpdlpuRjYrSFdBSDc2UncvaXQvL2pIOE5QdnVjZXRBWWFQZHUyYytjV3JGcy9tbFNoL0NOREZLWHRFcG5Vb0lhQms1OHdhYVM1TkY2THNFK3llbEpoUklrQkJGSjdzdDdNeXBSMGlYbURiWS9VYUNvUzVrOFlncHd4U1dCQ0pFUStIVXBFY01tUmlVanljc2lUMU9QTUZqZDlFNWR6STRKZUpXWW00aWRweGdUOFlHQTJqRUVaMUMzWU83dTBZRDNPOFQyc2h6angyUjZCUXpSMTFxKzgrR3dYNDdQOGJ4UkdHdUlMM3R2blB2TjZwMzdyYTM1U3B5MWIvT1kzck9jOG1RZWw5dWxjc3NaeTV1ZE11WS9jdXgyYjFnL0RlWStHeTl1c2RUdisyYkpkSEJ2ZmZ2bE5URitmMTdtWERCWHpaUmRBdEtYbUd4RUxUNmIveGthRzRqZVFiODRTdm01dFZ1WXZjU0VMazlkQnJEMlZQSjR0TDYwaFl5bjhibDNrN1E0L2JKSThBUHdyQVA4TXdOYTFKQTRoNFBWdlBZOXQ5OXdGRERaMWNBSjhTaEdJdlNIRnlVUU9HQjJLS3Fab1ZSNnBYUVRDSkFVTG9adWVXNHJueDhzZ1pMSEF3Y0VWQk4zSHF4d3JnNHVJU1NJQkFJaGNZbFc2OTc2QkRSdkhjZW5TMVZ3S0srSG5xa1o0bXNZbElreEpSYS9YRU1aSENIeGloSklHbzdwR2I2VjNLUzhMdGZQaTFvV3psMmZ3TzMvMGRienp2aDM0ajM3Mm5kaTFkZHhVeXBJaG9OSzdiTy9SbzI3WkRXSlUzWW1ueEpUZncyRzRQWUNQdmY5K2ZPaGRkK0ZMM3ptT2I3NXdDcDFPb1cwWUhobkN2cjA3cXUrK2lwU2V4Vk9laWlvWG1memN1MXd6RGpTSzhnVGxzc2trTEpmWHIrUnU2L2VHS01xNmR2S0lKdEpHbENKVjhuQkFzcEJPamxJSXlaZDhLck1zelZkZDRGYlRNT0ZIS1ozRU9iTkc3MUk5dmx5dXZsTmFTc2hWK0RGZFozbFpnU2N0MytWTENNS2N5dXM1NFZWY3NpK0FhYlBVb1IyV0JUTUhqZVNwekpwVmVmUDdDaXRHSnErTFFpL1RCMDdqa0hZWDhmdUdBTnkvZnl1MmJqUW5kekx0cXpTUDVGNms2VmpPYzYvRVUrWGl1ZkNCODBmR3pCdFZlMlJhS0JuaElXcDZDZ1g3K0NiTmhzZnc4R0QwNnFuZmx2aGRIWndUSUFjZm5RdFFwOERzMUN5ODl3Ym95WHpYV21uK3V4TVRoNytPT3pEODBJSDh4TVRoeFNlZi9PUWZBUGp0dGVhWnZUNkhjNi84QUx2ZThVQWN2aVRlbFNnNnlRRjdTd3JBMk5BQXE5cmppRlJnRDFhVm5SeEdUTTBzeGZQalFYQ2VoMnFSYjZIeFJpb1NZbFBvZlZKQnhnaVoyTW5WTFFDczM3QU9seWV2b2VnRW5Td3l2cFFjNit4Rk5ra3BrKzVFS2t0TWdPejNqL2YxNEM2TURnSFo5cnF5OWJ4ZDNxZ0VJUnE5UHRRdFlnS2VQM29lTDc1K0FSOTY3Qzc4blk4OGlNM3JSMHdEY3FCbkU5MEU3ajcyUmR4eHdVQnZYT1dLNm45c3VJV2YvK0FoL05pNzdzWmZQWGNDVDc5MENzdWRBZ2NQN28zT2pzcUFWeE5XQlhWelUzbEtQY3ErR1dEbnhKVGZab25Mek10cTRHNFRPdTkwTE9yOGtQUElHZHdqMENteWFiNTRTZXBlVm1CT1FGYURROHFycWFTc2hOUk9reHN3VDBVRFRyenE1ZHZqNmdBZUJxQ1RSaUFILzFBVUNFVmhKTkVjM0YyVzEwcXJPY05nLytZTWJGMHc1VENqUUNRQUYvdEVOVFlTRitLU2xXcUNuUG5tN0NCR2hSenhPc2RNd0lHOW03Qno2MWcycnJSZlNrRVlETzEwQXI3OS9kTzRPRG1qWjczclh3WngzVlZFbEkyZFdEOHZ3VG8reE1wRjlmM29TTXVNZ1BneTJwK1Ura0FZTytjSTgwYUs5OTZoS0pJTDRPaVBKVEdOQnVUdlNDa2UrQ0VFZVE3L000RC9Hc0RRV2pPOC90eEwySHJmUFJob0QwSkdWVFFTSVI0Z1VWSVlZMjlJY1RMd1djTkd5cldxeXhDQUt6TlJrdmZPd1JWQ01BZ0ZpRFdEUG5LZmloTzVXMXNGdm9RamVoOURtc0NiTm0vQStiT1hzOWlLK3BYdmhmTzJZTjdUdWg3Mkw1Z2hxQWYzK043VnRYZmJQNnVGbmlsS0QyNEc4ME5CK09xemIrRHIzM3NUUC83RTNmamJQL1lBTm80UEpXTTdKQ003bUwrUlNBQ1pZeFVmcFkzeWxqekFZZDFvQ3ovM2dmdnhrKys1QjYrZnY0NVRWN3VZWGV6MGZyWHFSUzJvcDhzODRzYUFQU2JxQ2U0OXBYYVRyNHpaVk5QK1Vqc2tTZHpuSFJzdkt2S29tZ2RFeFdVWjJ1dzBPdjR1T2wrUS9NZ2JwTTRaQXdYZ0pOR1gxZTF3cVJ3RmNXaDJmdFlMNEUzMXdweVVBZDZDTnh3Nnk4dG9xTG8zUFJmblhYWEFudktidm5IcHVYd1k1OHFycnRWdkFBYWthS1NXQUMvK01ZYkUzcVJUR3BMQW5zbURibE1WcHpkN2Q2ekgzdTNyOCs5aTZrNWpWMERXcGZZNTRNWFh6dUhVaGFzWWFEbzB1SDFSbkVMUzdqQ0JqSzVxS1Q5eFRpUitNeFNhelFhR2gxb2c5bEVQZmcraHMxRjY1Ny9nN1lUTEJlYXVYcysrUjJLeXlOeG4wdnliQVA0MTd0RHdRd255RXhPSEo1OTg4cE9mQXZDZnJUWFB3dHdDenI3eU92WSsraUFBNHBPTlNEM1NSWW1OTUQ0eWFLVFlPQ0FLUWk2OVFrQU51REs3R0xkY3VEZ0lIUEdoTkhEc3ZqWVk5NTFNQU9UY1JrRFh3S3hSVEFMN2ZHS1ByeHZENWN0WHNXaXR2RXNFTzFmVDV3VGFBcnVrc2NDY1FOK0FOblBPbGUxemE1WGVieUxjaXZLNlJjQVh2blVNWC8zdUcvaUo5OXlEWC9qUUExZzMyb0lBUGJra2pZRHRNL1FvV3prRUJhaFk2b3QvYnRsM1B6YmF4dnZlc1FHQkNNZlBYOGRMSjY3eWlZUWw4RjNoQmZzQjlmam5Kb0NkTTFCK1cyMUptZW5vQTl6emwzQXFTSHZMUkVsYTd5QmJ6UWl5cFpYek02b0tLMENJRWlVQVpjNFVPQk12b0hVb2VFdTBORjZsU1pOWEdmQ3FnNXZZVERPUFM2RE9yMUVCZXdvQlJhY0xYWHRHSGJqYitnWGs4cksxL1psa2J6Z0QvU3FXV3pEZnhDV3ZtU0xFa1BSRDNIN0VjNTgxbFFMc0pNWnNDZXdSV0RBaVlQdW1jZHk5ZTVPcS9WWFFrTFFHU0pQNVpXeXJnOE9ySnk3aTlkT1RTVnAyUVBBdVd0R2JQZkRpd013eFkrTFlRNTE0dlZQZko3d01OejdhVmtQQWlNdWlBWkJlaXZPNDRISUp3RHhiMU52MnA3OXBYMzNKMHY1M0p5WU9welc3T3l6OFVJSThoLzhCd0s4Q2FLODF3NG5uWDhhdVF3ZlFhTFdpTlR3WTRIMDBlSFBPWVh4NHdLaWlFU2NDRzY2cHhNb2pQZ1RneXZWRkZBeW9VYXNZUjZrSFZDY3ZWdnlBR0hZbEt1Z0xBWGVqOG9ORUNXVk9rM3p6bGswNGRmSnNqQ2Fid1FDMXhvZ2hWVTdzTStuZDNNTks1SHlmdHM0bHhrYjIwbHFWL1owZU90MkFwNTUrSFYvK3podjQ2SHNQNE9jK2VEL0dobHZ4dTdGYVVOZnBrYXhwTThrZlpVdjk1R0NuM1JxRWMwQUREdmZ1R01PQkhXTTRlMlVlTDcwNWhWT1g1M29BZW43VkU5VDFXZlhwelFKN1hzYnE0RjdGNzNwd1QycjVKUFlxUkR1bkI4d3cxOHVNcnRrZXB6NU5UYVUrOTB2dmVMNVp5UkNVbUFWZDk1YTZYUUpwQmVNU2N5RG1Wd2xRWWJRQU9jRGI5WGZOcitXbk9kdFo3cGpqVWlWOUQzQlhPbUIyRUpTa2ZHbURYbWMwSUU4bzMxS2xWV0dzbkFCNTdHZHFpR0NRZ3prQlViWE8xdlR5SEN6eGI5NHdpb043Ti9QM2NQemNmQ05LN1VvOWtsVDFiNXlkeEt0dlhOUXRyM0dYa29lVHRYRGh2cDJBdWRoanhHVTA2eTVjMnViZzBCNXNvRDA0RUEydUFYT09DR3NJQk94Rk1BTkFuUzdtcjgzcDk1RitMcS9OcCs5QmNNNmQzcmh4N0E5eEI0Y2ZXcENmbURoOC9za25QL20vQVBoSGE4MnpPTCtJMDBkZXc3NTNQcUpxcStqOGdMazZSeGdmSGxUUGRveVA4TjZoMDRtRFJTVjZCb09wNjZ5dUIxQjRKaXdGVHg0WlZJRUJ3ZjAvNUwxcGtDVEpkU2IyZVVUZW1WVlpkOS9IekhUM0hEZ0dONGhESk1nVkJSS2tLRnRLSmpQSjlvZGt5NlhKYUtLUlM4a2swMG9tR245b1NSbDNUUWRJTHFFbGJVMUxpWWU0aXdXSml3QklBc1FBZzJzd21Ic3dNejA5M1QxOVZuZlhsVmRrUm9TN2ZyZy85K2NSa1ZsWjFWZDFqNWRGUllhSFgrSGg4Yjczbmo5L3JxM2xBVWY4N055OGxlVGR4MjFwSm1NS21xMEdhdlU2K3IyK0lhcDhmdDJ4N1lxVndVSGN4UkZZSy9jeFo5VHkzTEZGenJrTTNQSTZzTTkzcjRkUm5PSXZuM2dGWC83TzYvakVSMDdpUC96b3cyalV5aDdRbzBDS3A5OWFGa0VPNkswVVl5VlVoVU9MRFJ4Y2FHQ3RPOFJ6YjZ6ajlPVk5wTFRhb0FpQWVSZ0Q2a0FXMkRQZ2U0dUEzY1h0RHR4dEhndlNHbW5zcm91MFNSTWxKS2tYYmk2Y2krQk9BMFlTbGZOTFQwazFTTHAzUmRYclBPN0tnaXRMUVV0ZmJaVVdlUE56NTVNQW51ZWh1cEk0dGxiaUFKaVY5aGdtZ3BWRmRkaDJLK1RpWFc4WGZJRTBIRTNKZGs2ZWdOOHNKYk1hU3BMdWZlN0E5cTgwckVJZ2dIYXJqa2VPTC92dHlQSWJqaVJCVHl1WUwwZ3B2SGwxRTgrOWRzVnNHYXZUU1pPWDdHTUNxWXhVcjJrUGw2cUZZTDdxRmZRVUtRUkVvRERUcXJ2M1k5UUpDc3F0aVZmNldmVzh2b1FRQXYxckhTdXd1REhHKzhyVlMzMVhxWVMvK2JuUC9kUDgvTndlQ3Zjc3lKdndXd0IrRVVCenU0UVV6djdnUlJ4NjlCUkt0WnI5cU8wQUJ6QmJMenR2YUd5dE82RG5lYmtQK2Y0d1JXK2dkNHBUR3NIMVdsNzZNQ3lkSWdEUTVRZ0I2NElSSU02WWlJMnljNytXNkhBS0t4U1c5eTNpOWRkNk5xK25nalBYV2NEbnoxZ0U3QlNoUVA0QXhvQzc0dUJPd2RTYm96RjdGL3lqVVlKUGYvVmwvTlczVHVOblBuSUtQL09SVTZoVlM5c0NQVkV2VDExUGtvUUZJbVVsSlFoZ3ZsWEZqNzE5SDk1M2NoRXZudHZBUzI5dVlCaG50SHRUZzdwT1hJRHoyd0s3WDFZeHVDcy9rVmRHVm1NekVkeWh5U29IYXdKOVd1OU9jZVJmM2toR21RSGp2aE1IR3M3REhHRDYzTTd0TzhTM0FHOGlBcGJHQXF4dG52TmRiNWRWY3JDR0EzZ09za1VNQVAwR0JGU2FnbStVazNXRTQ5VDJXZVpnWER3eVAzd0d4bjlCTUV3bmRSdU5TMWlnSjRuZEFyNzk3blV1NjBtUzNwM2RjS2FLUngvY2g1QzF3NDBvWWI4ZEFuWHU5UThRdUxyV3hkTXZYM0R2bDE2Ym9UTkJJQkFvdlFLS21FRnJuMkdJdGdEc21uMUZnQytBWnJWcTNaTFRtQ0tKWFcvTVEyVkowQjRIS29yUjIrelpkNnAzc21UdndOT20yRFJuZitFWFB2R3ZpenQvNzRSN1lvT2FjZUVmL3NOUDlQN3dENzg0QytDajArWkpreFRsY2dsekIvZTdTUFAyeXFVQUgzeDR4YW1zMlpJNVFNL3YwcnA1cFJSV053WjQ2YzAxS0NKbkJKSVdiSVVsb3RhaTNYd3Rkam9BRG16cGszQ010R01vK0ZFcWxWQXFoOWphNm5scjhYTmdiTjA5d3BWajErekRLOXZiakNZRDdwU1c3LzIrbzFENENZakp0KzlRaUJPSmw5NjRoci8rN2hrb0JUeDRhRjQ3c1JIQ2EyRyt0WjU1R0lJd1FEa00rVzJYMXZ3dWh3RU9MalR3dHFOemFGUksyT2dOODJDUFlsQjMvL21QV3dQc0xpNVRqN2tZUDk5ZURPN1VEcnVtR3JBQVoxWHB3aG0rY1NLcTUwazFNZll0MlkwRUJaRmJoaWFFMDR4bDQzSUE3TlZGN2ZMemNYVzZRTmJkcm51ZVNRQXZqTFFMcFpERWlkdFVKaUNmRFd6OXV1MGIwNTdBM2VlYno5ZzE3aGFJaEh2R01VZGdtUmF1Z25abnY0ODQ0eURzZStMUEJBRzBtelU4OXVBKzlwMWsrcFgzSHp2RG5EZTIrdmpPQytlTm9BUDdmZGd2U2dBbGJiaGg5eDN4N0NkSUx5RVk0Mm5vbHdnRTJxMkdHK3ZFUENvN1dnRmpjMEJEVjBHaGUyVURvOEhJYVVkdHNSNmJhKzhEUUtOUisrOS84emQvNFduM3Blek5jSzlMOGdEdzJ3QitDY0RNdEJuZWVPWkZISGprSkNxdHB1TndvWjNnY0tNeXBjQ2N1U2dyZ1pNbnZPdGJFZElVRUlHMEJuZGF0V1VHSjVOWUJQUENCaWpMd2R0eExXQUh2WlZHVE9Cd29zd0gyWjVySXdoS09IZnVrZ1Z6THpDQzd6a3pJV1lCYmdCYnNCZitzMmNsOTEyRGNlSHc1OCswWFFIakUreTBUZU8reE01Z2hELys4blA0M0RkZndYLzBvNC9nSnovd0VFcWxZS0t4bmIvaERSRWRKM0ZZVVlNUkwwRDc5SDdzMkJ3ZVBUS0hOMVk3ZU83TUdsWTNvMXdydHdWMTRKWUJlKzcyZHVCZWxJKzFSZEFOZ3hDK3hieE80YW5tRGZOcnhEbEw4ck43cHd2dmhUdkxlVnNuazVwdFBpK1RlUjlLV0QvNjFDWWZsQndUUU5mRTdCVUNQREsvQThjYUVoaURNUjZBNzlnbHErcjNKWG4vMnJXRUVZL0NvTnpIWllZa25mbFdzbGJhSmJwQWFhQlY4NG90cVd1M2FuajQyTExUUUNqelQ5QWU4V2J4cVFLY2sxblg4NTFlcEFGZU91MW1BQUJzelR1VVdhb21wZHRSRGdLQXRCb0hZYlNzTkpkUDNkQ3NWMDFUQkZTcTNGaWo5ZlVTSUYycE1FeVlIQ1FZYkEzODl5d0E3bXZCalN2THhKeityZC82UjM5aUhrdEFQOGFlTkw2N3B6emVGWVVubi96a0RRRC8rMDd5eEtNRVo3NzNBOGJKNlREWHFGaFFJMm1XcE5zMDFWNm55TnRibWlyYzZBeDEycFI3clFQekxtZTh3MUdhMUhqRVV3cHBLdlZCMGpaTG55akpQTnRwNi83RWVKaVRsQytWYUxRYU9QNmczaEtYUFBDbFVpRkpwZlpHWjM2bm5wYzdDYWtrcEV5TlJ6em0wUzZWcHAzbWtOSlR6YXVDNDVhRW9vSzlReFVmaGd6dDVNOXhPVVVIc05VZDRvKys4Q3grNVo5L0FWLzV6dXRJVXVsSldaNkV5S1N3TEFnUmFjaEtRZzVBOU84SDk4M2c1MzdrS0g3MkEwZHdiS1VKT3ovS204cjcyOXpNZXFHRDEwMnNiMWhadHF0TlhnSmxWelpuQ0pWWEpxaEV5c3RlRFhoYmJIcVNFRjA5dG1lVTFYRzVlQVB1Z0pPaUNMUXRHVFd4am1ISWREYUl3UktaZ3QyTElDOW5wSkszZVd6WnJEa3NEY0M5SUJhQXVnVjlKNjM3aklMd3hrMFlNRzl1MXJOYzRIbXBDN2xFenlYNUlOQjFaRDNlZVFlOFBKNG1JT1BsTHU4aEwvRExNZm5tWm10NDlJRmxoS0Y3bmlBUVJtTURxemtRUWxqdmZJSzFLUnJHK003emI5cDE1NDc1Y1gxSi9KNkJaSkEzdlVEQXJrVEs5aitnMjFndUJhalh5bllvK1FaeTdqMkJNM0pLb0hkMXc0NERUNFBCR0xLc2RxTGRidjdtMjkvK0FLM0w4VWJvWGd2M2d5UVBhRmUzdnd4Z2J0b01GMTg1ZzBPUG5zTE12bVhBY0pRenpMSSs2NStlaUZnb0JHS3A5NDIvdmpWQWtrbzlDQlhNWUpYV2k1ZTIvdFJjcHpRRVJsdHZDMGQ3bEo3djVSS0pEc29PVUFCV3V2Y2dWeWxVcTJVOGNPSUl6cHk1Z0dHa3QwWjFSRGtqY2FtTUdrcHBydFpKOW42YVhDZ1l4anRJZXV2RExlTXk4bUc5RStGZmZmWUgrTXV2djRLLy83Rkg4YVB2UG1ZTnBvQ01GRStTcEpFQ1lDUWdRV3ByNFl4NFdIS2QyeENqL2ZOMTdKODdoUFhlQ0MrY1c4ZnBTMXVJVTJrVEZUMnEvNTRZYUdZUzI4dmRTdTNFRFh0bDJUdXNEQmRJMGxKd1h1TnNINWh4YkMzc29lQTVxdUZNRS9XdDJScFl6Nm15dGVuVVlFYVFtWHRKWHpxMzVRUGVld01EQkRGSnpUK2VXYlBwQTdQOGo5VkZZQWc0OE9mVEM5Njh2SzJYeW5CTUNBYzF2amErK0ZzekxCSnBsT3h2TWpoMjR4S2diVnFkNFowaUgvQ0dhWnVicmVHaEk0dHVLMWpoWGppeFhleHRnbUNhRkZuRFVZenZ2SEFlb3pqUnoyKytuOEI0bWRScjN3RUVNQzY1OWJoUm9LcDBMY0trUzZIZ3Zpdk5PTTQwYTNic3VQWHdiZ3dwd3pDU2tiTlNRTnlMRUEyRzdEMDc2ZDh5QjhKcERvUVFDRVB4eXUvOHpxOThtbDRKZTNSdHZyUEh3ajB2eVFQQWswOStjZ003M1AxSFNvWFh2dldVV1dLaEIyeTVGREtBVjdEdVd0azVEUFg3MUpKOHBLWGdWSHArNFBWdnltZWs2TlQ0ZnFkMHFaUFNVd1dUaC96TVMxYU9LVk14UC9TbWZIMG9oS1VTSG5yd0tHcjF1djVBbEpIQ21ZLzh4TFRSK3JjM2Z1aXBQWG83UlZMN2UvS2RDOWxiRTBDMktPazJXZlprdUxIWnh4Lzh4ZmZ4My80Zlg4SVR6NXl6UklVSXRRVUhaWVZGSm1VNDRPQVNJTURTTVdrUEFwaHJWdkNSUjFmd24zM3NRWHprMFJVc3psUW5TdXNUSlhZUU0rZWthWnZFTW5URlVqdkFKWDQvSDVUVGk1RGtydnhhUWRLUUV1VFVSREVVRUpheEVLWmVSeW96alREUmlneW1sQjhQNmp1VFZiQjdGaHhOQTBVbUR4RndxcGZlQ1MvTWdpci92eDNBR3pTbStqeUpObkRqeHB1WEQ0UW5pUXNCdThkQ0lJems3NldCazdLWnRKNmJreWZ0QUVuTzVqZHBFcmhkZ1BVL2I2N0pyL3o4YkIybmppMmpGQWJXcmtBL3U5TU1GR20zaEdsaktpV2VldWtDb21GaW44bjFvVjhXSUZBdTZTTVF3akpNWG44RHhoZTlzbjFmcTFaUUtaY1lFMFJNbmJKeHhGU1J3QVNsMEYzZHRQVzZjV0ZhVmRDZkFMQzAxUDZ0L2Z2bmxTczFCL1o3S3R3dmtqeWdWZmEvQW1CeDJndzNMbC9EOWRmUFl2bkVnMUJDNmEyTXpDWnBBQUFnQUVsRVFWUUl5Zjg2bkZScmpkY0FLQWxVU2lGR1NZeCtsR29BRjNyQUJjSTR3Z2tDei91U201c1BBS1ZkcGRJZ2M2TkNHQ2tDanBvU0tPU1FVYkZjT3A4S0JJNC9lQmpuejE3Q3hrYkhFbWVkM1VsVmxyaWpXR0xQajlKc0lqSDU5dmlDdHMyeWd5SnVheWhxMzlYMUhuNy8wMC9oei8vbUpmejBoMDdnWSs5NUFOVktxR2NnQlZrak8xQ3dCUmtwQXdLZzVVckNpQmxHM2dmTXU5QmdwdDlwSlF6d3lKRTVQSHg0RHRlM0lyejg1Z2JPWE5sQ25NaENhZDFHWlY2cXlseGtkUUtUcEhZdmYxYWI0Q1Z6VEFLZ2lid0daREthTXZQckpGNHhTZHYybVhLTWdSVmhYU2M2WTIzaHk0MVdoR0lrbHI0SmE5Rk56QllEYWJEY25NbXk0Q05vdnQ1WDAyY3Q3eTExRDFpY3FZQ3N2WjBhbXhnQ0p0bGJGWFNHWVdDL3dkckhuMWxrK3pBVDdCdGpEcnE0Um9uR0xVbkNsc2FaU29RQzVtYnJlT0RRdkY4WGE0UWV0NHk3OHRnc0lFMGx2di95QlhUN1E3TnpITXpTT04xQzJqa09acG96RElCcVNVQXBxYjhPb2QyRkIxSWdOVHZGdWNVVWVpd0VRWUJXb3dweWxtT1h5Sm4zUkF5b29ENHhXb2poUmc5Sm5ESUpudlVQM0tmTCs3aFVDbC84MUtkKzdiUDAyZ3VPUFJmdUc1Qi84c2xQZGo3ODRWLytYN0JEaWY3MHQ1L0cvTkhES0ZVcUNNM2NObmZ4bWxYYjB4eDFLUkJJMHRRUVJUT2dEZVVUVWkvOFFCQVl5MTM2aUxVbVJ4SXhBK000b1Fkb0NwSDVtSlc5RUlWanlNbFFBZ0pIamg5RWNHRVZxMWR2Nk51MEhEQkgzb3REVVJxeHd4UmprNDFKdXBPMjNPMXdZN09QLytldm5zT252L1l5ZnZ5OUQrRGpQM0lDYzYwYUFqaUdUV003VVZJVVVBdVFodG1xQUsyelVVKzlxdE1zemRidzBjZjI0WU9ubG5INjhoWmV1YkJwdk9uZGJtQzNkOGZrVmJrNE94cVZaanlwR3lEZy9KWFRrQTVJeWhjV3hKUVFkaWN4ajI0UzRGR241SjdZcWJlZEpiYi94UkNBRXpOQjF2ckVCR1Jnek9aeE1leUNmOWNHNEwyMThFeGFKY2tZd3RmK3VIbDZYYWpQQ09TQjNjMHhHNFlDUUxWYVFxMVNRclZTUWhBSUpJbTIxNGxUaVNSTmtTUXA0a1M2OXlTY056c29JQlNHdGdtaG1UQUNlNlhRbm1uZytNRTVaSHVHNEJNZ2hpRkRtVXpaVWlrOCsrcGxiSFVqdmYrQU5PcHY0cjJZQVowUVFCZ0tWRUlCUUVLbWpsNXFaelhTTUUzS3F1OXA2ZXBNbzJxY1Z6bGFhTitkY3UvZGFveVVBSklVM1J0ZC94dGtoblo4RlFpUFAzaHc2YmNhalNwL1VwSDVMWURNQjNlWHczMEQ4aWI4RHZTNitVZW16ZERyOW5IeCtaZHc5TDJQMjRHU1hWNm1vSEp6OWVWU1lEaGpQUWcwUFJSMkRDa0FRa3B0Ym1tSXVPT0FEZmZLaUpEMURFYU1BaldRUlhQcFBrdFkzY2Vuc0xKL0NVRVE0dUxGSzFsc0dYTXhPV1JIYkQ3ckRoQjkydUYvdDNuaWJkclpIOFQ0L0RkZXhWOTk2elErOUk3RCtLa1BuY1NwNDlyM2duYVJyQW1ITXN5YjkwSTlzWjFKOFhCU2lKVllMWitnRFlzZU9US0hVNGZidUxFVjRaVTNOL0g2bFMyTWtoeHFid3ZzT3RrNGNKOGt0WnVjK1NwaE5WTzByNmR0dXdOM0JRM3VWQVpKL1FwNjdsRG9TSHZ0ZW8yUWdmV2pKYkdjdHJvNVdONDZQazNDMDNuZ3pzRGVTdStnYjVPQk1NZ213RTNCZUpvRUJ2QlFlV0MzR2dFV3ordXpXZ1c0Y2dRRVpsdFZyTXkzTU51c0dtQVBQUWw3WEVoU2lZMU9oSTNPQUJ1ZEFUcjlvZlZlcDR5TTRnUUI0K2ltV2NmUkEzT3NML2tMTjNITWNqK2JURUhoaGROWHNiYlZ0eXNrckFSdk5yWUpBa0JKQjZEVmtza3BCWVJ4WjV1cTdCcDV4MXdJNkdXcDFXb1pTa3BJUmV2aHFlK0YzVm5PdkY3TldFQ2hmNlBqVGIzUmd3akQ5R2lwM293ZGs2WlVDcC80MUtmKzhaZlpFMmNCSHRpRFZ2YjNGY2cvK2VRbjR3OS8rSmQvRGNBWGRwTHZqV2Rld3I2VEQycDFmVVpxOTlYMTdqcVZDa3Z0R2k1YzcxbUNWd1QyQUt3QmxwTTN0S1c5NVlSaEpIZzRtc1ZIRDQ5d1lBNUxDTEpCQ0dCcFpSNmxTZ25uejE2MHl3Qzl6M1I3NUI0YnBvZjA3UkI5UXFWN2loZk9CdGU0TkUzeGpXZk80UnZQbk1QUC9NUzc4TEYzSDhXeGxSbGtsL2dJeGR4cGVrVVowWVlEUGhNN2FKMHdONkFNQUN6TzFQQ2h4MnA0MzZsbHZIRkZTL2VybXdPLzZCMEJ1NzNyM1ZTWmxEbHdWNWtVUWpCUlNsbUdWSUU4dlRuSlRhZnhnZGRoTlJlSWVLY1J1S3NNeVBoT2N5eW9tdy9LczQrQTB4eXdVbDFSUEo0a084NUFjQktmbGE1RlJpSTNSMVk5VDBhY3hBL1pwWFVNM0FNQnpNM1VzYkxReFBKOEU5WHk3c2gxS1F5d05OZkEwbHdEZ0FiOXpXNkUxYlV1cnR6b1d0ZXZDcnBMMjYwNmp1eHJ1M2VSZVFlY3o3S1VoVHVCZ3NKTHIxL0Z0ZldPUjg5RUJvVHAreENoUXRuMEQ5RXFEY1Z1WjBqdFJWUnJ1bWhUbWtEcHZlTHRWamJNNFExSi8vYWR1bFNRVVl6QlZ0OHhVQ0t2SUNxNGw3Ny8vUS8vT250OGtUbVErYjFud24wRjhnRHc1Sk9mL09LSFAvekxYd1R3MDlQbVNlSUVaNzczRElJZmY1dHhncU9KblNmUkcrSkVIcURpUktKZUxhSGRLR09qTjJLY255WUl5cUM4L1U2SWZqbU93RnpUSlgwdXdrazhJRHJtcFB1c1pYNFI0Rk9aN2ZZTUhqcHhGRytjdVlBazhabkxITWJmQk9pUEszUDdvbmFDNUxmNzI3bDVydUtsYzJ1NHZKVmdaYTZPRDV4YXhxTkgybFk2MCt1QmpSV3pJRGU0Y0MvWjh4Q0dESEZsRkNnajVaZExBaWNQdFhIaVlCdHJuUWcvdkxDSk01ZTNNRXFja2UvdWdkMmx6cW5rcytET3BDVW13bXR3Ris3N29la3I5enpJdkZvQ09uZEQ4dzFNRzBicTRjQW1kMW1KeWVET1UwU21vZ0ppVHBJNnRjdnBBL0xlNnR3Y3ZZQS9IVmVrY29jSDhKN1RHNlk1ME12RGhFMS9aRjhieC9iUG9WSU9jYXRES1F5dzJHNWdzZDNBZzRjWGNlSHFCaTVjM1VTU1NyUmJOUnhlYWR1MDQzMVlHREJteEkwbXJGNTYvU3BXMTd1NnYwaHFCNEJBQWRMWUtaZ2hYUXJkbElFa3B0aUF1cFhhVFZyTjF3bGo2eUhRYUZRUWhub3pLU0hjbW5yclZrd0lSeU90bWwraGQ3MER4azNhOFVFMDNLbnM2YjBDclZidC8vM1ZYLzM3cjJJOHNHZmo5b3lZY3QrQnZBbS9CdUFuc1lQbnUzejZISkplRDZwZGMxSzdOTDZhRFp2TDUrdmpWTWN2dHV2b1JnbVNsQndzT0M5M0Z1eEJndzBNb0pXVmZEalljK21lQUoreTdRYndHODBHVHB3OGpqT3ZuOGRvTk43RjhyYWd6OXErMDNBVDh2d09Tcm45WWJzV0pIRU1RR0YxbzQvUGZ2Y2N2dlo4R2U4N3VZeDNQYkNBY2ltdzcwVXB4U1I4T0FtZkpGZ3JWakJKMW5HUWpCQnhDUXBZbUtuaFE0OVU4YjZUU3poenBZTlhMMnpnMmlhYnU3Yy9kZzdzTHF0aUtkd1BKOUVaUXN5WUVsSUJBN0RPbkJ6bXV2bHpSZi9KVUl5NElFVk1zRTduSkhMWFBXNnVYNW5wQURlcUJQc1BDTit2dlJJV2tDbU9TM0hXMGhwK1czbUxyWnFmdTgwRkFUbVk4UjFYejdNNWZPSG04SmZhVFp3OHVvaEdyWXc3RWFybEVBOGRYc1R4QS9PNHNkVkhBT0gyVitEUGlPeDdOejNHNTFTa3dvdG5ydUxhZWxlUGN3Ym1tdThpK3dzRDdvRUFJTzFPbHA1UlhTQWdwSUl5Nm5WaFVKN200eXRsZ1hxMTdQdXpCN3c2dVZrSGFSRkduUUZHMGNnRGNBSjQ4MkNXQ2FjZUNBS3g4Zk0vLzVIL2JUZ2NCZ0JrdlY0ZkIreGdjWGVmWUpsd1h5eWh5NFlubi96a0R3SDg3azd5S0tXd2RmV2FkUUJqTjZsUnhHWDZUbklTclc5SElBU1c1K3Iyalk1MUZtTCtZQmdHYzlMM0dQTmdvdXg4RVArNGxMczBkMmlKazdPZXAyeUtsVnVwbFhIeTRlT29ONmJlc00rV3hZL2l5SnNQUmNYdTlOZ0xkY1J4NHQ2ZEFqcjlHRjk5OWhKKzcvTXY0NnZQWGNiV0lHWnpyTEFFenhJWU9sbEp3a2tVc1BueXhsZWU1QUdnSEFZNGRiQ05uL25BVWZ6Y2p4ekR3NGZuVUMwRnNLc3FXS2ZRdU9HOTVNWWZqVHMyenFndjdEaW1jVTFNaUlGREtzU1NQdUVLTkQrRUt3YWttZUJKQ3htU1RPRGdUbjFrKzVMNm1mL09wVk9XbzNYejlvS1hic0NiUUNHdmpxYzErL3EzUC9ldUdSUUg4TFNFenRjR0NMVHFGYnpyMUFFOGZtci9IUU40SHNJd3dNcDhDNHR6VFRUclpjL0JqUjJqckwzKzBqMzluQysvc1lvYlpoYzN1MVNRTFFNa0k4VktXYUJhRWRCZWNabnJYZmErUEJUTlhBZUJRcXRSWSsvVUREUCt2ajNHeklSRW9udTlBeUR6YldYTzJkOHJLN1AvNXdjK2NHSnJPQnlLS0lxQ2ZyK2YyLytvNE5nejRYNlY1QUhnTndEOEEreGdTWjJTS1hycm02alB0Zk9XOVNCaXA5WDRjYUpBeXkxYXRSSm1hbVYwSWkwcEM1TVdRRWF5aDkwd29raVZidzJlZGlEZHUwdmw2bUJpam1GVUVZWWhIanB4Rk9mT1hrUm5xemQxSjNyOVV4QlhLUEhiaXU5YzJBdHNjNXlrRE1OY2k2SlJndSsrc29xblhyMkdSNDdNNFFNUEwyTzVYVFB2V0RncGxWbmdrWFJDaG5oMlRsSG9QSUZnR3hteGRKU1I4cyszcXZqZ3c4dDQvNmxsWEZycjRleVZEczZ0ZHBrNlgyV2I2MkxIcU9RVi9BdEtGZEF6QUlBUVZtcW5NUWcyOW1uY0JxRHZTNWhOUVV5ODBQRHUxT1ljK2ZuZ1VpRHBHVjQ2K2o0TU8yV3pDZGl0bTRscFVocDhMUGd6cGtDblkrVm5yUDRGKzJkL2Uwd0FNV1o4L2gxV1BSOEV3TkY5Y3poeFpJRkprM2N2Q0FHMEdsVlV5aVZ0b01mZGVwdkJTVEgwWHBVQitMWE52dE9LS00wY1dmQlZ3a3J2NU9IVG1hTVlGYnlnVWM3N1Q0S1duZ2JHNDJpOVdrRXBETXlXMzJRRVN2MVBocXh1eXBUb1orL2FsalgwczA1MHpKTndpWjZyN012bDRQUXYvdUpQL2xrY3gwSktHU2lsVkwvZlYvMStQNnpWYW1pMVd1VDFEcG16SmU5M085eVhrandBZk90YnY3T2hsUHIxbmVRSnd4RGQ5VTJNQmtPcm1yZlN1M0V4Uy9Ha25pZUJaV1cranBKeDBjUWx2eUxKM3BmdTRVbFVSRnpIU2ZlK0V4UmVIbHdkS0pid1JSRGcrQU9IMFpwcDVEUHVNcWd4eDAySnhQZEt5RHhYUElwdHZ4WTlkcW9VWGp5L2puLzE1VmZ4WjE4L2c3TlhPNzcwd3RYR1ZwWG9wSjJjMU1IU1dURGg5NWtVRmdqZzBHSVRIMzVzUC83VEgzMFFIM3ZuQVJ4YmFTRU1nbTJsZGhvbWR0Ulo1dGNmNTQ3N0ZJYXdVejVXQU9EbWVSVXpORFFOSU9sTFB4K25sVzdnMExOU0gxQU9QeSs3a1pIZVNUSzNmY2taWWxZclNlKzJUcXJYL09ZU2ZkWWEzMG1vN0Q2Y2RFc0FmK0x3SWs0ZVhkd1RBTTlEcFJ4aVliYU9XcVdVaytpNTB4NEErT0haYTlqb0RKalV6aVI0dytCVXl3TFZrdDhQenVlQTZ6dlh6L1MraEdVV0JMVERza2ExQXFmUjR1T2ZNWUNzTzRVQWt0NFFVVzlvcjdQZmw0c1ROZzRBVHB3NDhML1c2MlhaNy9lRFhxOFhiRzF0aWRGb0ZFUlJGUFI2UGRIcGRNWko5WHNtM0hlU3ZLQkpORUJjdlBpOWYzbjQ4QWQrQ2NCajArUU53d0JwS3JHNWVoMXpCL2ZET0hvMEJuaXdvS3VrTWk1SDNhQUtoTUNCaFFiZXZOWUZpZWZjK0pkYklSZlAyd05aNlI2QW03dlhHYWVYOElIY0hEN2RQWEwwSUY3OTRSdElrOFFYMFd6bW14K2prN0I4clBSZm1QaG1XN0xEc0lPMlpaTW1YSkpuQ1lvVXptZXZkbkQyYWdkTHN6VzgrNkVsUEhwa0RwVlNBS3Y3NUFJclhRcmhDb1dmems3alorOVpEWUN3QXljUUFrZVhXemk4MUVTU0tweGYxVzI1dE5aSHFseWQ3dVF1c2srU3RhNjNjNktBMmFUSlFhOWd6NllnckVyWXRaMGVtczNQQTFhR0pLTHVISmJ3cFhZdXIyNlg3eURIOWd3QmcyMFBaNno4NzhRU0VoNHJtTnRhemhCUVdnSjRYbzd4dXNZQlBneUFSNDZ2NE9EeTFQdHEzZkVnaE1CTXM0cnlLRVJ2TURLeGJzQkpwZkRLMlZWc2Rzem1MdWFXQU96OGVpblU2OS8xOUNmc1dubGwwcmk1ZHdhK1N2bnorVXpiMVdwV29lVjl5ZWlhMFFDd01VNnhRaWlvUktKemJjdVduOTNNaTQ5Qi9oMDFHcFd2L2Z6UHYvZTdnOEVnQ0lKQW1TTlFTaUZOVTVtbWFTQjFDTnJ0TnZkakR6anU5SzZIZTNxcjJXemdBQTlBYkcxZHhNR0RqNzhXQktWL01FMyt2L2YzM2dPbHRMVzlFQUpocmVyVTlpQXBSNTg3Z3hpWGJ2UjUzU2lGQVlRQStzTkV4N0gvTlBnejdmV3YyVCtQWGlPVFY0aGNXU2JhejVRclY0Y2dDRkNybHJHeDBjbW55eFU2OGU1dEQzZWoxdDErbVVJQVM4c0w0OHN0S0xnL1RQRDY1UzE4Ly9RMWJQUkdhTmJLbUdsVXFFUVE3K2JVeFZuVXN2OFlrT2JUYWRCMVptTWs3d1lDbUd0VmNYemZEQjQrUEllWldnV3BWT2hHc1dWT2NxcjhUQVRCYXlETURtU0dtSkxIT0ExOExsNkFscEp4NmMzTjd6cm5Nb0tWcFdrbWdTV3ZnMXUraThDZkl4ODNqKzVKNE15eTNjMnhPNWV6SkhWN0VydnczYmR5YTNrdXZjczBkWFBPcHA1U0tQQ09FL3V4ZjdFMWRxenNwVkFLdFd2Y0pFM3RPNU1LZVBYY2RXeDJJMGZiT0swU1FCam8xUjlrZkdsWGxIQnUwYXFLNEFzY2lneWUzYjFtbzRKU0dGcEJpd0ozWHVadmxLVHI2ZC9vWU5nZjJiVFprTnZUUTVjVmYvakRKLytiL2Z0bk55aGVtcmtMS2FVMFFLOU1QTkkwVmZWNm5hdWNmUFhUWFF6M0RjaG5BWjZPaXhlZlBudjQ4UHNlRTBJOE9pbC9HQWI0c1I5NzNQcDdqM3A5VkZzTklBalpYTHdEKzYzK0NGZldCam1hVzYrVUVJMms5VExsd04xSGE1NXRQTmpySDlzQmZpN09SZnNaMmE5cXJZb2tUakFZOEMxTzgyRXZBdjllRGMxbUhmTUw3VUl3NThGSzlpeWRsQXFyR3dNOCs4WWFYcjI0YWVmVFMySGdqUWNDY2xKejYyc243YnByQitaV2MwU2hhR3dZVUZ1WTBZQi84bUFialZvSmNhSXMwMXE4dmF6TjdwYVRhUVMyY1FBOFlLV1dDbklJWmVJUk9DYkFnblBBeStkcVZRTG5ESEN6NnlKR0lGY09sUkU0cHpjNUppQUg1bzRKNEU1eGdvem51eUFRVUduaU9iNEpBdUR4VXdld05OZWNQRWoyV0NpRitrWFEzaGl2bmIrT3JaNmhIWVRaYkwxZE9SUjYrakk3MXBYRFFNVzNZYzZBczhvQWZyVlNRcVhNRFJJZEE2clRhNDJWdDF4VUtTUlJqTTYxTFhPcDdEa0w2dG43YzNPTlAvNzR4OS8yRlhPdE5LNDdZRS9UVkhLQWwxSWlqbVBWYURRNHVPK0p6V3J1QzNYOU9JQ25ZMnZyMHErMTI0ZC9BaE4ycVN1VlF2UEM5Q1l0YVNxeGNYa1ZjNGNQTWk3UmNIUktPNVJRZHFBNllnWUErK2ZyT0xlYUlFbHB5UWRnTFhoSmhjb0FlNXdxMzZUY1ZwM1BraU92MHRkM0NmUVZRNHY5QjFmUTYvWXhISTR3TGhUaGxWTzNzN3RqbUlxM1VsaGFXZlQ2M1ZQVEYzUmtMc3E4K0dzYkEzemxCeGZ3MWVjdTRlSERiVHord0NJT0xEUkFoa2xReEJpU3N4a0Y0elZVdjJkeUZ3clkrNDR2RTJad21KRkVESUZSZlpLUDgxb2x4TU9INW5EeVlCdjlLTUc1MVE3T3JYWndvelAwMmtyUElLaWdRSUFHdmRtV3hoclVrUlJIRzZoWkZTbWdKWDMyVWVqeHFyK3ZJRHVjN1BjQXhzM1NNMlVZMnB5SVNjbUVhNDlsUEZpYy9lMjN5UmJobFVYM2hDZkZ1N1FPNEkvdG44Tml1NEY3TWRTclpVaXA4UHpwYStnTmhtWVpLTzBrQjhoQTc3S3BOL0hTTmt5a01oYzBMSVJnUyttVUhhdkNzcVQyOVlDTTVrcWxFSTFhRlZMUnJveGdxWlZoekNTZ2pETWNrQlN2MEwxRzF2VEluYm1LbnQ4cmxjS0xQL2R6ai8raGxESVFRaWlsbEJSNjJ6OHBoQWpTTkpWQkVBUlNTcFVraVNpVlNrRWN4ektPNHlDT1l6a2FqWUpqeDQ3dENZQUg3Z05KZmp1QUJ5Q3VYZnRoLzhDQng2OEhRZWxueDVXamxNSkhQL29PWTJDbnBmblJjSVN3VkVKWXJZR2NlUkRJUjZNVVY5YjZUTUlTRm53RElWQXRoK2owUm5hZHZQM3YwUnVmK09SbzJjMUkrTHFBUXJoMUExMmcwV2hnWTMxelhMZE1IU2JDK24zTkFHZ0tVYXRWY2VEZ3lqYXBpaUxHTEJGVEpOMUhlUDdzR2w2NXVBbWxGT1pubkhUdm1EMEdTRm5WVXVFZ3lhNStGdm5CcVZ4MHVSUmdjYmFPRXdkbmNXeGxCdFZTZ0dpVUlvcFRKc2tMbzJabjF5Uk5NL0J6MTVycVcvVTd5K05VODc1RVRtZXVXcytmTTFJK1JFYmloNjFERURoVFB2Skd4OU1GUEwyT0QxbDVubFF2L0RnaEFKbTRuZGRtbTFXODdhRjl1ZS82WGdxVmNvajFUaCs5UHZPNVljWkFJTFI2WHI4K0pueHdvU0NyRnJmUldnQldMQjN4Y0sxNkZUVGh6M2RGdFBtTWxwV1hyUlFRYmZRUkdXMERsOUp0YXpKeGRIN2trZjMvODRrVHkrZU5FU3FwNUQwVlBmK2RKSW1TVW1JMEdxbnIxNitMWHErbnRyYTJzTHk4dkNlQS9wNEcrV2tBbm81TGw1NSsvdkRoOTMxRUNIRzhxQ3lsZ1BlODV5UkNzelNEcFBxbzIwTnR0c1hVOW5ycFVwSktYTGpleTlGUUlxRGxraFpYK3NNa0oxRVVnN1BJWEh2UDZWOFgvTWpIWmJGVjVPTUFsTXoyakwxdUg3Y3JURVhTOGh6S3JXL0lqb0thZUprTit3K3VvRmJraHlDajlSaGJqQnAzVDhjT2hnbk9YT25nNmRQWHNkWVpvVjRwWWJacDV1NFpLTnZnalJtbnRxZjBna25CUlF3bno4TWw3a281eEhLN2poT0gyaml5M0VLclhvYUV3akJPN1JTQ0Q5cFVqZkN2UlhadTNjM1AwejJSUzZNVFpOWDJkbjdmL2phTVJFQjUvZTFkczR5QlRRZTJMU3dNMCtJeEJweVJjTmRoQWJpVEtsL0tGSUhROWpydmV2akFybDNUN3FXd05OZkVsUnNkdmNMSWpLTkFhQ003QUd3cytvRHNBNzl5YVFGUGlDSlZ2VkpBczFaQnFSUXlRQmNNMkhVNS9Nc2liNlhwVUt2cC9USmRLQUo0cFlDWm1kb1hmK3FuSHZzM0JPd0FRS3A2ZnMwQVhpcWxzTFcxaFNpS0VFV1JpdU1ZNit2cjZva25ubER2ZnZlN3Q2RWN0ei9jc3lOdUp3QlB4OWJXcFY5cHR3OS9HMENoVjVpdHJUN0s1WkpWMSt1WG1PTDYrWXRZZXVDWUhhZFNLWlREQUk3ekZLVDVCT215bFFMbVoyb1lqQkwwSW1mRkxnQXIzZk5sdzRCeXFueFRKSjBLMWZrNkN5aEhWcVZ2YjFNNVk5VDZnRll6ZHpvOTlIb0RzQ3kzTEd3M3lrVmhvcnYrYmVUQ3VCYVZTaVhNemJjOXNXVVNtRSs4eis0VXplMG5xY0pMNTlmeDByazFMTXhVOGM0SEZ2SG9rVG5VS2lXbUV4ZE9GMm5HYUFCREZJMStrcXlNdGRxVCs5UW5qb0c3NFlVRmNDcFhLWVYybzRLWmVoa25EN1dSU29Wcm0zMWNYUnZnNm1ZZncxRnFwZ0ZNd1lGdWlWWHJtMU5ndmdNRjhsVG5lb0hHZm1BYlI5TlZ6RTg5REJNU09FNkUxcno3ZVYzSnBPb05zblVJWWV1QUlEVStMQU5CbklCUFdCVExBOGVnZ0JnSWJZeDQ4c2dpbXJVSzdvY1FCZ0ZPSEZuQ2k2ZXZHRHNLcGNlS05KUFExais5VWNYVHl4U2txcWRoYUthVnpFQjNtaFVBMEZOR2xVb0pCbHZkV0lXdXg5SlM1ZTVwOVltMGFucGVidEgzWktlOWhFQ3BKTlovOUVjZitwUlNTaWc5RHhzWVlBK1VVdEpjS3lGRUlLV1VRb2RnTUJnb0lVU1FKSWtVUWdTajBVZ3FwWUpMbHk0SllmVDl0K2ROVEJmdXlYWHl1d0Y0QU9LbGx6NXpOa21HdnptdTNFNm5ieVY0ZDFZWWRIcll2TEtxSlh3anpaTWhDbU5UTFJQZ05FY0srK1lhQld1UllUaFF4YTRwSC9NZ3hzcWlVY0k5MlZIZzlicHlpOHBtWmJGeWxGSTRkT1FBd3NBdFJzb2V0ek1VMWJjWGozRmhZV25PZ0ZiZUk1enQrNEozeVJPNWQ4SGVKVS9GMzd1UlhtNTBodmpxYzVmd3FTKzhqQzk4N3p3dVhOZE9qdWpyc0FBRkptRUt4OFJ4ZFRYQXpvekQ1SG1KT0h0MUdFQXJCd0VPekRmeDdoTkwrUGg3anVMSEh6K010eDFkd0ZLN0JtSG1hQVU5RzlXanpIUEJNUkxXRDU1eWErajkvdUpzaUltakNHSWVsT04xNkhtVXU4eVZ3UlFjckE3V2lSVEgrODc4ODlUK01BU1ZYWmZDRUhPdE9nNnR6T0orQ3ZzWFo5Q2VxUmtEdThEckErcUFMSU5reHhLTHR5TXVNeTdEUUtCUmM2dE0zRHZpVEpVYkQvd2Q5Vzkwa1NhcEs5ZU9iMHc4SHpzMi8zdkx5NjJlbEZJb3BZSTBUWVdVMHA2VEpCRlNTbUhPUVJ6SG90dnRCbW1hQnNQaEVFbVNCUDErWDR4R28yQjlmVjFVS2hWamwzbDM1MmZ1T1VsK3R3QlB4d3N2L1BudlBmNzRmLzRmQ3hHOE0xdTJCbmszSjgvVjltdVhyaUpzMUZGcE5xR2tWdG1Yd3hDamhNOUxXcktoNlJTMDJ1N0FRaDBYcm5XdGtSNnBQdW1mNVVoTlBrdUFzc1o2SmdtZHNoSStLeEkyaDJBRWNZeVVEd0RsY2duN0Rpemowb1VyVktEWE4wVWdkMWRIN2g0SlFnZ3NMTTRYU2drdStEY25wVlZqRXFreEZ3cEFvaVJlZm5NZEw3KzVqdmxtRlc4L3ZvQkhqODZqVWRYTGpYSWI0d2dhWVE0UlNkS25zU25zUFJLQitON3YraXhOWG1FWUhCcW5BZ296OVRKbUcyVThkSEFHU1FMYzZBeHdmV3VJdGEwSWcxR2l5MlA3dml1bDNaWGFnU2xjOHdJTHRBNWkzV2czRFNidVJUbU5nRkRDLzE1WVRvcnp1QUU0UWdGV0o2ZlJ6aDZnYVB3elpzaVVFWllDSER2UXpxVzhIOExEeDFid3pBL2ZOSUtQQVdLUzRnSFRTY3J1Rys5cGhFdzZhWlB4OFFVTjhPYWwyVDNuQWJjV251NEJZUHBVRExzUmhzYnBqVzZDRy9ORlp3ck5adVU3SC9uSWc5OGdnR2VTdXdRZ2pIUWZLS1drVXNwSytIRWNLNldVU0pKRUtLVkVGRVVpVFZOaEFEK28xV29paWlLcWJ5S1Z1RjNobmdMNW13VjRBR0l3MkpDZHpwVmZtWjA5K0JWa25yL1RHWGpXOVhTV1V2OWVmZjA4OWo5eUVnaERRQ21VU3dMRDJCQXE0ZWd5Z1N1UmdWcWxoSVdaR3E1M0lxSkQ5aDRIZkFmS1JLUjBlVmFkN3k0bUFyN3BLdy93cVYzZXJsSVowQzlYMlJLVll0Mldkemx1eEw2VndIOXVmbGJQR1JiMHhuYWY5RGhBOSs1bExsUkJCRSs3MWgzaTZ5OWN4dGRmdUl5anl5MmNPdHpHaVFOdFZNcUJ3YXdNZURPaUo2QUpzclRqRno2TzVwZ0ZvcmQ2NnNxT1pVM0RMYWlXUTJEL2ZBUDc1aHFBQUhxREdEZTJJdHpZaXJEVmoyMGxmTzdmTWhrQmlQU2IrNllIbEErK1VQNTNxQUhCcWVZZDhESm13VlhtN29Pcjh2bWtnQUVqdTRzS1l6bVlORTlzQklGVnMxcTU1NWJMVFJ0bW1sVXNMOHhnOWNhVzdjcEFDS1IyZTJSSEJnbjQ5Wmh4Z28xVG96dEp2RmFwSUFnRlpHb3BvYU5ka3FXRmNGT2ZVRWppRlAzMXJpbEhXT2FBczNoNm5Qcm5NQXo2NzMvL2tkK1RVZ29Bd3B3RHN5N2VBam8vRTlDSFlTZ0dnNEZRU2dXajBVaEpLWVBCWUNDSHc2SFkydG9TeldaVFJGRmsyM1EzZ1A2ZUFmbGJBZkIwdlBqaXAxOTQvL3YvMGUrWFN0WC9tdGZSN1E2WUZGOXdqb2U0OXNaNUxEMTRIQXBPWlUrR0lKYkk2RWdRcXlrQXpNL1cwQjhtZXMyeElGS0MzVXYzTm0xZXd0ZmxiaWZsbTVZek9pblRiY2JmdVBFNUpmamI1TnZjdjFlQ0FyQ3dOSjlqc0lyUzZSL0Y2WEt4MjRCNllSN2tHYjF6cXgyY1hlM2diNEtMT0xZOGcxT0gyM2h3L3l4S29RK29IbmlENXMwSi9RemtLZ1VyR0ZzbGdQYWhUNkRvQkN3QndjR1VFWEFGb0ZVcm8xVXI0OWkrRnBKRVlhTTN4RnBuaUkzZUNLTTRoZk5mTGxoMkxhSGJabm1EaURRTkJMR2dWaGhKTUpPVVZnRXdxZCtDdS9BaGdkck5sUitDMVo5VjRiT3BmUWdBQjVmdURZYzN1dzNIRHkzaXl2VXRFdG90SDJucGpHREQzczdKT3d0OHc3NkJORVRsVWdubHNsN09iRjgvSDllQ2FDME5DMFhUOE9qZjZCamY5RXpnRXRselhxSS9jS0QxUi92M3o2d2JLWjdtNDRWU2lnTytCQkNrYVVwbkJTQklra1NHWVNpU0pFR3BWRUthcHFoVUttSjlmVjJFWVJpRWVqMmhhLzVkQVBwN0F1UnZKY0RUY2ZyMFYzNzc0WWMvOGROQ0JBOVJQYjFlbEZQVlo4K2RHK3NvdFZxWVdWNUFKUXk4d1pRRmV3Qk8waElLK3hmcU9MZmFSWnB5VjdXTzY2Vk0wd08rVFZTbzBxZWZZNlY4bHgyQTlzNjFxekFsK0JkVXVXMjQwd3pCVHRyV2FqVlFxMVh6K1NaOHc5c0RlbkhrTktDZWI0YytwYW5FbVN1YmVQM0tKa3BoZ09Nckd2Q1A3eFpIN2owQUFDQUFTVVJCVkp0eDF1dlp6QmxpU092d0xRVm5ya1k5NElkQUFLTytwVWFRYWxSUWFyZUd2MXdTV0dyWHNkeHVRRUZpbENoMCtpTjBCakU2L1JFR281U1ZBWS93QytHa2ZQK2g5V2RPemJYUEFXT3Q3MFIxaHVia2N3QnMrUjBmZjZTS2Qxd0FyZmZuNE03emxjTUFLM1AzNXByNGFVT3RVa0t6VVVPdkg0RzBPY0p1RlV6alJQLzJ0dHZtZEF5NjcwSVJvRjR0Z3h1QzZxWHhQQ1cvY3VNejJ1Z2pNZE5BdGgxWmpSTm5PS2o5dGRKTEgvclFzUzlucEhqdnpNQmVwR2txbEZJaVRWT1FDdDlZMkFlajBVaEtLWU1vaW1TOVhoZmRiaGNMQ3d0aWRYWDFqa3Z2UE94NWtMOGRBQTlBcksrZkhXNXVYdmlsdWJtam53TlFCb0JlYjZBQm1LbnJPY0JUM1BVejUxQnUxRkVLQTVDMXB5K1JGNE45R0FUWVA5L0FoZXRkZWpvMzhBRlBGZW1lZjN2QWg0M3pBZC9HRUJkTGFRdEFIOURyc2owNlgvaEdkaEMyWTFpbnNFZTVxMS9IdUdDZWEzR01GRi9ZWmpYdWNqcEExOVZ1b3duSUlId1I0TWVKeEd1WE52SGFwUTJVd3dBUDdKL0ZxVU50SEYyWnNlcG00a3k1Z3gxcmgrOXBBTXg5R3VjQ0VCSmdVK0d3WU10aWxDQUZ2NzRUMEM4bFVDMEhxTXpXc0RTckY4Q2tTcUUzU05DTFl2U2lHUDBvaGxUYTFvVmFDNmQvOENSd0I4WXVyU0xwWFpseHp6a1UwSkJrcFFsUytEc0doWjZYak1qY1BWZXZFTUNCeFpadDUvMGNWaFphT04yTmZLbVpxZVE1bmVLTWt6MmJOUFY2UlkrdEZJYmhjcHlBU3l1ZzJQdFFrSWdIUTBTZGdhZUdkOStLaXlQd3B6ckRVUFRmOTc3RHYyUFNadFh4V2FDM2Fucmo3UzVJa2tRcHBZVFpvVTZNUmlPUkpBbUd3NkVZRG9laTMrOExobDgyM0dscGZrK0QvTzBDZURwZWZ2a3ZuMy92ZS8vTGYxYXBOUDhIQU9qMWhoNm81K2ZtSGVoZmV1VU1nb05IUEVsOUhOaWJwOUVHSlZVOVA3KzJGUUZDK2VURGprdm5vWXlYQjB3SitLWU1jOGNpZlpHVXIrdlFhVk9aZWxTeWFCVGVVcEoxTStOOENnYmh0dFVOb0ZLdG9qblRMQVRTNHFoaWxKL1VpbTFCM2J0UVJaZjVOckFoT1Vva1hybXdnVmN1YktCU0N2SFFnVm1jUE5URzRhV21CaXBEUnUxdUlRYVFwWEtMbWF5RXhnazhoMXMzT1cvYlFyWW1sQXEyZUYycXcwV0JraENZYTFiUWJqcDdrV2lVb2pkTU1JZ1M5SWV4MlN6S2xlazZWK2c1ZmNYZDY4SnlLQXJLYkRiRHVHQnJtT2lBMjZZUTlnSE5kMlVZQnNZWUNGYlVZcnVPdDBKWVdXamg5UG5yU0ZQdHIxNFRXUGZ1TloyaWVYWGhHQURBU3RmMVdnVmhFRmcxZlJiZzdaSzV6T0NYaVVSL3JjZWtkUUo0TzdyR2hpTkg1djV3ZWJseEEyeWVQV3RZUjRDZnBxbUFVZE16b0NlRE8wK2FWMG9GVVJUSlVxbEUrcUljc2JxVFFMOW5RZjUyQXp3ZHp6NzdKLy9pdmUvOUx6NFdCS1VQOWZ2UmhEbDVQeTdwZE5GOTlYV28rZjI2dldQQVhqOExBRGdqa01XWkdpSmFQdy9BTjRqenBmdHg2bnhkb3Z2bkFiNko1MFIwT3lrZmdOczdlZ0s2anh1VnR4VDhwd2wzeDFEVmhzV2xPUTh3ZFJpUDh0dTFkdEwzUHA2UktKYldjMjNLdFpQcWRHbUdjWUlYejYvaHhYTnJxRmRLT0hGd0ZpY090YkYvdnVFMDlBQ3NnUjZNZ1o0U0dYN0xuNDkzVXJ5bDloQlo1cGJBa2VsVWZlQUZBMTZnWGkyaFVTMEJabFZha2lyMGh6RUdveFNEWVlMWTdBWm9KVXBydkdlcU1BWUVwTUszVkpqdXNWNWs3SXl0MzMycWZoeFgxNWRLQVpvMTdtdjkvZzMxYWhtdFJoVmJ2UWlKQkVKdVNROFlsTTRTSkdYSFZiWHN6OE56RmIwR2VIK2UzUllKb0wvVzlUYXJLUXBGOC9DdFZ1V2JqeisrLzl1VDFQTkdrOHV2clpxZXJPbHBXVjBjeHlKTlV4SEhzUmlOUm1JNEhJb29pb1RRN25BTEczaW5nSDdQZ3Z3T3c2NUJQa2tpZGZueXMvLzQwS0gzZkNsSjBuWVV4U2lWQXFPMnp5K2w0OUo5dkhrRGw2LzFjZURrZzA2U3NRU1ZqWENTWEJqWUhsaG80TUsxSHFJNFpXQzljOENuY3JPQUQvaFNQdVhnVXI3L1UwQ21FN3d3YmlQV1R4cXBkNXdCdU0waERFUE16czA2aUowU3lDbnNGdEFuM2M5SzYrUGF3NEhkL3MrVTB4L0ZlTzdzRFR6M3hnMDBhbVVOK0FmYjJEZFg5MmkxTXpvei81bEVEd0pIeXdFd3B6dE00ckxYMEFVNmkra3NrOHBZQWdHMzVFcm9lZjEycVlKMnl3RzVkcnViSUU0bGtsZ2k1dlltWGp0ZDRGSTQveUc4cHpSc0N6RVFXY3N1NkdlYmJkd2ZqbSttRFNzTExYVDZFWlFFRWlVUUN0ZFAyaGlPbURlQTNxRlMyak5vdFZMV2FaQlgwZXNsZHNJRGNzb2JiZlNSREdNdjNqOFhXOWlYU3VMNkJ6NXc2SSt5RG0rNDFYekJtZWJqclRSdnBIY3J6Y2R4VE12cVpCQUV3V2cwa3ExV3krTUxzK0ZPQVAyZUJQbGRTUEUzRmM2Zi85YWx1YmxqLzZUWlhQcmRYbStBVnFzeFJsM3ZxL0lialNvdWZlMEhtRm1ZUTNOeDN2R2VSUHdNQlNXQ1lsWHYwQVpBaDVhYU9ML2FRWndvK3hSRWRPbGoyQTd3ZWJtNjcxZ2FEdm8yWHJEeWZVbWZQRXROSGFaRTltbEc4RjVuQlBnenpDMjB6Y2M1SWYwVTMyMHV4VzVCM1p3bWczcW16RnhaZmdSZDlhSVl6NTY1Z1dkZnY0Rld2WVRqKzJad1pHVUdCeGVheGdXc2NXYmoxU3JZbVEwMmtGRGpMTmtWaklXK3Q2bU95U1pnTlFYa1pzaCtRVUtEcjJNNG1NTWJBVFJxSVJxMWttdUowSzZvazFRaFRsSWtVaUZKSkZJcFllVjhXbElJcmNibkhaSnpGTVNrZmd0YzlFc3B0SnZWZ3JkeC80YTVtYnA5WjVJQnZiSmNvZkxmbGRLcms2cVZNclJESkNBN2dqMDZacGxEQlNXQmVERENzQnZsNXVFbkdka0JnQkNRcDA0dC9sKzFXaWtpYVowczZyTlNlOUZaU2luU05JVTVXK2M0Wm0yOGlPUFlIcVBSU01DWXJrenF1OXNOOUhzTzVPK1VtajU3UFBmY24zNysvZS8vaFIvZjJPaitKNDFHYmZKU09pdmRLOHpQdGZEcTE3NkJkL3pzeDFHcVZnQ1FGYWtWYy94ZDJ3eGhvL21qUTBzdHZIbXRxLzFBd3hDUkRGQUxVd2pqWlNjQVBtQWxxd3pqUUZlR2R0cXk2SjZVY2p1QmZmcXczWkRORkhyYmRWWTNFUVFFYXJVSzZvMDZHczA2V2pQTnFVQ2N3bVF3ZHhIYkF6cTdHZ1BxUUY1YXQ3K21CSFkvenNWMkJqR2VlMk1OejcyeGhqQVFPTFRZd05GOXN6aTYzTUpzbzZ3Qk1qUGZxc3R4N2tnQk1JTHRtSUVNVzVBM2xISml0VXRqbWtacGFON2RyTnBubWdZZHlxVVE1UkxRckpaY1BxR25xWkpVSWpWbitzN3o0NTc2SXJ0RVVMZVBZb1FBWnQ5aUlGK3JsbkpBYXdjQm15TW5EVWdZQ0ZTclpVQXBINVRwNVRxUmhJMUJQVWhsbW1LdzNzMDJZV3pnRXY3Q1F1UHp4NDYxejlEU3VPd2N2REpPY0JSemhzT043YVNVa3NDZG41TWtzUWNIK3J2dDdRN1lZeUIvdHdDZWp0T24vL28zM3YzdVJ6NjZmLy9DZm1kZG53ZDRibmsvTjlmQ2xTdHJlUDBiMzhhcEgvLzM5RnBlQURRZ3VmcVJvcDJ6SEwxUDg2SEZKczVmNnhxTzFsSGIvTHA3SnpXTWxmQUJURkxyMjZJeW9LK0pYVEhET1E1TWJtcjA3aFRWYi9lbnd0b1RoZ0ZxalpvRzlVWU50WG9OUVREWkEzVGg0MHdENWdVUnV3ZjFUQjJGNWU0TTJJdktWOUR6NE9kV3UzanplZy9mQ3JSeDNOSGxHUnhlYW1MZlFnT2hwNmJYbWl2ZEpqS3VLd0IrWWs0dEUyemFJL0t2UC9EeXVDVjUzUHNaejJPTkNNMDN4Wm1LVWlCUUNrT1E0UndWcTZSQ3FoeERyL3VDcVo0WmVKQzRLUVFRQ25IZitLbWZObFFyQmtxRVhndGZDdlJXczBXak5nd0NrMTc1VS9YZzNJR0o1d3dDQkNTMG9SMDNzc3NiMi9rTW9tMWp0WFRtWGU5YStTSko3alRuRGwzUE5OSThtQUdlRElKQVNDa1JoaUhNT25rUnh6RXFsWXFJb2dpTlJrT1VTaVY2bEluaGRrcnpld3JrdHdtM0hlVFgxOC8ydDdZdS80OVNIditYVXFvZ3E2N25hbnRpQU5wdDdjMXE3YzFMdVB6OFN6and6c2RBSHpzQUM5cEV2cktnRFNpVXl3RU9MVFp3NFhyUEV0U3NkWDZSaEsvak00QnY3bkVwbnpwdk85RFhoR3g2V2Y2MmdQKzRjQnRGL1VxMWpIcWpqcm9COW1xMWtxdHlPaEQzYjB5VFp4eWdUeXErQ05UdHIwbkFQbzVSbUJMWTg1b0Fvc2tLRzcwUnR2cHJlT244R2lxbEVBY1dHemk4MU1UQnhaYVRuUGsvQW5GRDJFbitaMWdQK281WU1wOXdPOHlta1E5eXFtSkxJQ0JtSUN4NHZNRUZ1eXpPMVl3Z0ZDalo5UHFPTmFabkRjblM1a2ExZE5PTFArNjFFQWlCU2puRUtJNFJoa0FxZWQvcVlDM3B6VnA0aHVkTVZpOFlaSGJnNnZYd2FieHpmeDVCZ09peHg1YitieUVnczJwNkF2R2RDdDBrd1dlbGVTN0pHNlpncW9KdkY5RHZHWkNmUW9xZnFwaWJQVDc5NlU4KzhmR1BmK3hyMTY3MWZtS3l1bDREZmFWU1JxMVdRUlNOY1A2WkY5QmNXc0Rzd2YwNXRia3YzY09uVmtvN2xkaS8wTUNWR3oyUU90LzFUVEhnbTZ4akFOK2t6QUxHR05VK01GNlMzd253ajBzOVhjNDdIL1lkV3RFN3lBR080RXg4QUZYd2EyeVNDVkhUQVhxK1BUc0FkZk56ZDhDdUU0MERkNXRmYUdnTzZLWUE0alRGaFd0ZFhMemVReUJXTWRlczR1QlNFd2NYbWxocTE2d0RIdm93ckhVOUFDZUZNYWxNT1RuZHllUEtMTXVpUEdBZzdaYThDYTlNem1pNHdOZTd3elFyYTRUbmYxYWNXUkNHc2RCeGdSQm92RVdzNnJPaFdTdERwakdVZElCdVZ5ZVkxOW1vVi9SclZZNDVvakZXRFBBdUl1NlBNT3FQZHRRbWt2SVBINTc5ODhYRituV1M0SVVRM2htQW9lMmVWYjEzTGpyU05NMnA2ODBCK28zdFNkNXRGR0gyQ01qZlFqWDkxRldPTzBhakVWWld3ai90ZEVySHV0M2hRNU9YMHVuZnM3TU5STkVJU2ltOC9zUzM4YlpQL1Bzb3QxcklxczE5eWRrM0lnSzB1OC9sdVFhdXJ2YzlBclU3d05jWDN0dzdVS2phcDd0U3l2eHdHOXVydTVmamR6cWlieGRUMEp4cFlHNXUxcUxiVk8wYWsyaDgzdW5CSE5nRzBBc0t5S1dZVk04dEFQWjhDYm9NQlZqRE9hMlNkNEM2MFIraDgrWUlyMTdZUUxrVVlOOThBd2ZuRzlpMzBFQ2pVckpqbmV4WXVJR3FMcGNqTHZtNFkydlhXWEREblR1eDhaZkxJWGRXSm4wZTNNSGpCTEVQeWs4aDRCZ0lLTHViNDFzdE5Hb2xkSHBBMGVnVFVLaFV5d2lFMmRpSUV5b0Z1RFgxZkY3ZlNFUktRU1VwQnB2OVhiV3IzYTQrZWZMay9GTzBUSTZrZUs2cVI4RThQTGU2NTZDZVBmT0RHK0V4a044dXNHRjc2Nlg1dlQ0YWJ4WDQ3NGdaT0hQbTlZdVBQMzd3ejRKQWJLUXBMWjlUZGo3ZUFiMCtabWFjNjhwaE5NVHJYMzhTTWg0WmJ0VkpWMHE1clVSMURJemF5dDFyTnl0WW5LMjV2RFJQVDZVb1pNcnd0NHlGVnpaTGEzNjRQOFlVbURUazhTNkhNMFhIMkRBdXc3WVpkMTNpYm80Z0RMRHZ3RDYvUDhjY1BFMytOdXRONm1QbHYxT2V6ejVUdGx4NmY3elVncmJsNnJWMUZ0VER5blhqS0QrR1hIMU9oY3JIRDFoK2xXdS8zMTV2L05ueTNMaEtFb1ZMMTd0NCt2VnIrS3VuenVOdm43Mkk1OC9ld01VYlBlUENWbitnWm8vT25OcmJkMHpENGltdDhHOEZEbjJSZFQ2bkpYWi9Tb0Rxb1B1NWE4b0RkczYwTU9PdS9DMFRna0JrK3NLTjFtcWx6SmdmeGY3N3Y0cG9oRW9WK3V2OTNMUUk0QmpBN0psQ3RScWVmOGM3bGovRDUrR3pjL0xtb04vZS9Ed2RqQ253ck95M0M4cXBTNmMrYnJXeDNsMlg1TGVSNHFjcTRsWWZYLzd5bDFjLytNRVBkaDUrZU9tUG5uMzIwbitWcHFvOHlSTmVxK1Y3dHRxOHZvNHpUM3diRDM3c285cGdTN0doTzhHNURReWhYSmlwSWtuMXhoMG1pL3NzSE0xQ2R1bWNLY0ZXeGkyU09lSFhVYVpFMXN0Y1hWOEV4OTRMR1lmWDI3NjFuUUw5N1NHWUt3ZFdFSmJDSXBLU1Q2eTJUVEUyRlBQa0tuODFwdEFzT2VRZ09xN1l2S3lkYlFjck5WKzB2WkV0UldVR2tjWnZZeVFIdUhGR1dpcHJiQWZ6RFNoL2t4c0FXLzBST29NUnpsM2RnaEFDOVdvSkM2MGFGbWFybUd0V01kT29HSENtY2FCRlAvUGx3RG1xVWZZdUF1R3RhTEgrNmswQzMrcWV1YWtGdk4vbUVkaVphblV0OFpnS1UzYnBMZURLdGlqb0ZVTDVBVlVwbHhDR2dXZnprd040eTFINjBaQUsvWFhhSDM3NllKaTM3bU9QTGY1UkdJcVVBM3pXMkM0N04wOHEra2toQ0FLUnBpbVlGSTl4cW50TVI4UjJTaGluRG50QmtyOVpVTDdsNVgvMnM1L3Q5bnE5d2ZKeTQ4MERCMmIrSFpmYXlTa09sK3JETUVBdFkwMTc0OEpsdlBuZDd6TXB5Z1FtY1ZtWlRDRUhCc3R6TmJScUpTZWx3UkZsVC9yTGxKR1Q4cTJFNW90NVhGS3p4emJyNU5XWVk2cEVoWW1uQ2RzVnVQTmpaclpsbDhIbEQrU1BDWTlRbUo3ZVRVWTk0TjVINWwxbDN3bjdvd2FNMHdpQTFjVmw3Zng0eU5jUC9tem1YMVppNTJXNTFoVzBtNDB4cjY5WTNkbm5oTTNuNG9lakZGZldlM2o1L0RxKzg4TXIrTnF6Ri9DRDE2N2h6T1ZOckhXR1NGT3pPNWtRZ05BdWNFbU5icVYvMEFZbDdDRU1HRnYzdHZBSkNBZjFMSGhuaXNtZlNZbzBUL0ZXVmRjbmllOXdDS0JsaTZFZmFYK3FYRFJQb0pUQ1lKZUdka3BCUGZCQSswOWFyZkpXZ1FRL0ZSZVdrZkM5STQ1anlJSjUrYXo2M2hqZVRSTThETHFWMHZ4ZGxlUjM4Q0Mza3drb0xQL0NoUXZYamh3NWN1RGt5Zm52cksvM0RxK3RSUjlXU3RvTmJMSno5YTFXSFZIa0c0VmNlZlVNeW8wR0RyempNWkRLa3ViK0dNMHJsTzRoZ0FNTFRWeTQzdFhiMHlvbXd6QkM1Y3BSVEFMSnorUHJGUDVINWJrT0JYTnJ1OE13S1ZmdUJleWtpdHNnRUpWS0phenNYNTZZWmhzbW5sSk5qcDFRaGlyNHhTL0haclgzeDlSZHdIRnhXbHJjeHVMU2lxVDJvbktVVXN6dnZJNFQ1aCsvVmdyMmZWcEdBN0RxVmEwTlVOWkxJeTFEVDZYQ1duZUlqZDRRNTFjRmdrQ2dWUzlqcmxuQmJMMkMyVllGOVhJSU11S3pjQ3RnMndVNm1mYlQ4anR5OFN6WWR3T29uTW9Yb25EN20weFBVQWswNS96V0MwbVNldU9tVkFwUkxnVTV1c0pHVkg1Z3NldmgxZ0F4ODJoWEZLenhYdWE4c2xMLzBvRUR6VFBqSlBLTUd0NUsrT1BPU1pKQWFlOTI0TTV3dGdOeDVSSDFIWWRiTXBEdUdzanYwTmh1MitKdThzaUZsMTkrK2ZxaFE0ZjJwV21xM3Y3MnhYLzdyVzlkUGpnWXBNZUwxUFZLNmFWMDE2OXY1c3A1ODVrWFVHNDBzUGpRY2QxUUx0VlBBSHpERWVEZ1FoTnZYdTlpU081dlRlSXM0SnVzL2dka2JtY1oxM0dnYnczdmJpRzRUanRLQzZ1OERiUnk1Y0FLUkJBd3lYUzZVSUNmTzhpelF6Qm42Y1lCT2pBQjFET0ZLejhKeHBVNkxiRHppaFdCTzQzSmpPNWVBVlpGVCtET2JqTndGMnpjdS92YVZhNVR5Z01LL1VHTWFKamdxdWdqREFRcVlZRFpaZ1d6alFwYWpUSWExUkpDRVNEemVlU2tkTEtTZC9jelB1cUZZWVFWN0I3MDNLcWVNd1M4bkhpSHF1WDdKU1Iyamxwck44dWxNRGVQN24xM0tuZkRhbnlpN2dDandZaUI5L1R0YUxYS0w1NDhPZmNOTnU4T0FIeE8zcHVYWjBBUDQ1dWV6a0pPSWZsc0o4MWpQR2M0TVJqTC81dW1nbmQ5VG41Q3VPM1MrcVRqUzEvNjBvMlBmZXhqVXZzcGxzbkREOC8rd2JQUFh2L3ZwSlN6UlV2cStGSzZiSGpqMjAraFZLK2pmV0FmWWJkdVVBYndkWndQK0VFQTZ5d25UcVJ2b2M4QVg1TktWcmE3RFphb0VQU3BSRHVlTXNPS1cvRGZybkFuWkovMmZCdjFadDJIdUYxV1hDU2JqRXMwVlJVN0JuU2RxUWpVdlV0VmtMYXczQjBBTy8raE5MQXJDOG9POUMyVGFjRmRNQmZQc05iNENtNE9uVytackhKZWNCVGNqbml1L2ppVldPdEUyT2dPRVFZYXVPdlZFdW9WdlpGTnJSS2lYaTJoV2c3WjFxKytSenpCUlgzUTV5anNNK1NIUDNkMXkvUG83WHpmaWlGSjlKeDhFRGlBejByWTd0MGlFKzl1andZakRMdkRYYldoWEE2dlBmcm8vR2M0d0JlQXVTRDdvKzFBTkROUDd5MmRLL2h0QVgrS3BrNUZVVytGdGYxZEFma3BwZmh0aTluaHNhUHl2di85N3c4M056Zjd0VnF0bWlTSnF0ZkYrcUZEdFQ4NGM2YjdxMUxLb0dncFhidmRMQVI1SlNWZS8vbzNjZW8vK0FrMDU5c1FodEx4alRnc0o1dFpQNitnclZZUExUWHg1bW9IcWZSRmJXOE52am1Oay9KZEtoLzBxWHAvSDJiZURNNTVVTDVNQVhzOENDR3d1THhRaUxnVG9IVnlvYnZoRmV4NzJEbWdlL1dNQTNWN3NSMm9aOG9jMXkvandOM1VvRWVqazlvbGxGMG1SWHZHYTA5bFFDaWdmWmtId2tubkZ0ejFOYVRldnRYaHUySWZDaGZ6RlZOSnVkOTYrWlhBY0pRZ2psTjArZ1Q4QW9FUXFKWkQxS3NoYXBVU2F1VVFsVXFJYWpsMDBya3BTaWt6ZjIra2VGTXJhRG1lMXltWlpvemVncEo4b2czUEVBaUJjam0wZGlsQXdkQWFOL1NWUWpLS0VXME5kdFdHSUJDakV5ZmEvMThZaW5nYVhPUVMvVGdQZDl6aVh0dGpUVGZIem96eGdPMnA1RzJWY2ZhaWhjamRrdDV6NGZYWFg3K1dwcWxNa2lSTjB6UmRXaXE5MG00SGY4YU43c2dEWHBwS05KdmozWittY1lMWC92YnJpSG9EY0lNNExRbFpvUVFaYXlrYnltR0FRMHN0Nnc2VWNuQmpNUXJtRGpPRzhvMzNsRXZrNVczT05LZnNWbmpQa0QxY0pYc25LS1hRNzdPK1ozODVLelhlWjVNT2pIbFVMdUZtRHd1TjFLNzhRWVg0Zld6dVVkbXNicVhBMmp6ZWNJNGJBbVlOOEx5bTgzSGoxUUgvR1RKOVlWdE40OXJySDJxYnE4ajFvZjhkMFB1aWQwRHNBOVh2R0JqRjVyL1pnMlNrUmo3ZzR5UkZkekRDMnRZQVY5WjZlSE4xQzJjdWJlRDgxUzFjWGV0aW96dEFiekF5MjlVcVQ5cm5uZVRIK1JKOW1zcTMzTHo4Wm1jQUVRaFV5aVhrRnRMUk84dlFCay9LVndySktFRzBPV0Q1eHAxVjBWa2RPdFQ4ZDdPejVSdFVRM1k1WE5iNExtdE5QNjFSSGplK1M5TVVvOUVJYVpxSzRYQ0lORTFGRkVWSTAxVDArLzJwbHRsaEcyeTZXU084T3c3eWQ5aXozVTJWODluUGZ2WnFITWN5U1JJWng3Rktra1FlUFZyKzYxb05mKzJzN0tYbjZyYlZxbzJ0TEJsRWVPMXZ2bzVSTkhKRWMxckFWd3JWY29pakt6TW9oMEVHYVBLQVB4WG9ad2p4N0Z4N3l1NmZIQ1l4QUNwYjZSME1HMnNiMjRMMXRrM2pRRHZtK2ZJd080WkpZT0NUN3pOV1Q3WnRZMEJkRmRiRnkyZjFNdnk3R1dEUGp5MVhybXUvOHE1aGt6bmdkNzNGMFY1bHJ2bnpPU0NuZHNFK0srd1laN1c3K3hSdnZ6bTlJMTB2aXJIUkhlTDZ4Z0JYMXJxNHNMcUZ5emM2dUxiUngwWW5RcWMvUWorSzlSYTJpWVJNSlNzYnBKSUQ4TmFibCs5MEI2aVczU1kxUklCY1g4TmMrNGhON3lCSlVrU2JmYlpId003cTM3ZXYvcFg5Kyt1bnN5Qk84K28wejI3cUpDWkFGVjNUZkR3enNBTVozL0h6Tk8weU85SGRDc3piZGRpTGtqeHc1MVQ1RThNM3Yvbk4zcFVyVjdiaU9GWnhIRXR6cUtOSDhjZGhxSDZRblplbk5mUEJoSFd5dzYwdHZQYTNUeUNKa3h6Um5RVDRSSWhMb2NDUnBSWXFaYk1zaGROQjVRQi9LdEMzZGVtS3lwVUthblYvemYvdENKNGNQUTRvSnpFR3V6eWlYb1JSTkNxOE4yMDcrRi91dWRUNEl3T0o3TmtaNkJZOUp2dmh0OEhoWGhHbzIzb3k1ZHVXTUZEZktiQzc1elh0TWZhYUJIbCtmd0hLTEorVzFDb2xiVDdZT25VOGpROWVLWTFkeVVDWjZ2YzdpWFdHZlZMK1lMRFBMRzF5eGVwMDc0bUtTRktKMFNoQlA0clJIWXl3MVJ0aXN4dGhyVFBBamEwK2Jtd09jR096aDgxZWhFNXZpTzVnaE1Fd1JuZUg3bGZ2OWRBMzA1U3VQOWxZSE5mWDVqcE5Vd3cyaXAzZHVNRGVYK1k4TjFmNTN1SER6YWVORks1TWZHRmgzUGtOWXdUSWZXMXVMZjJrd09mbHM5N3ZtTFEvNmFFbzNGWW00RzZCL08wRzhWdlJCZ0ZBZlBPYjM3eWFKRWxxRHBtbXFVelRKRGwwS1A1ZEllUWJ2Z2M4L1Q0YmpmSFNQQUFNMXRadyttdmZRSm9tTm83bzBEakE1OVExREFXT0xEVlJxNFNXa1BLQ1BLSy9ROUNmbVpzcGdLKzdIOVF0K3R0WTN5aU1IMXZ2Qk9DZUhzZ3ovYjVqUVBkYk9BMm9jOXl6TFdQQVhsUnZGdGp0V01xK0J5b0g3RDYxbTlxYXkrL1hDeGFYSDR3dUZlWGdrcnRMeC92RWxlK3VYVm5aNThpVkJhWHRCVmlmY3NDeWJiWDk3NE5Oa3FhSUU0azRTUkdORXF5dVRiOFY2cjBlMGxTaVAzQ0djZzdnMmF2bGZjbjZUNllTMGVZQVNqckdxZ2pJaTg0QTBHaVVYM3Z3d1ptdm1YaWxtSEdkQVc4dmpqU3V4QVJrejF5Nm55VEYwenI1TkUwVkFDUko0cDFIbzVFQ2dNRmdjRXV3Nm1aVTluY1U1Sm1xZnFya0U0NmJ6VDkxR1ovNXpHZldlNzFlSE1leEdvMUcwaHhLeXRGZ2NYSHcyMHFsTjdLcSsxcXRzdTNXcEwzVmEzamppVzlEbWlVYnlpZDlZd0dmNGdLaDk2SnYxbWxQWmw5NjRvVk5DL3BLQWZWbUErVnlPUTlBVTNiWVhnL2RyUzZTT04wQmNBUFpudkQrdkw2ZkFzakIwNmdkQXZydVFMMEkyQjBJandkMkI2dThuT3h6NkhoSjQ4NlQyZ0dTMnUyMkNGbUN6VUZjS1pCNHovdlVUOGZmaDJzYlR3UHZHblorM05jQStHWFJiOXY3SEhEbzNiSjJzVWZ4R0JCNnIrdWRBZEp0bkV2ZEw2SGJqd0M0c2NRQm5mY1hkYUo5TDFKaXNOblgweDQ1QUM5NForQjlEbFFxd1pVVEoyYS9hTzRMd1BtbHorUlZtVE14QVdPTjd1U1U3eTdySklmN3RBY2M2RThJdDEyTnZ4ZlU5YmNMeUc4MnZ3Q0FLSXJVODg4L2Y0TWtlYU95VCtNNGxrSU0xcHZOem0rbHFSeHdUM2hLS2RUcjIrOG52WG54TXM1KzY3dU9lREppVDhFSEJSMURmd0lLQitlYm1HMVVNZ1I4WjZDZkJmNlo5bXdodWhjQzFwUWR2VmVDVWdxamVKU0Y2akdnWGN3SThZY2YxeWQrMnZGZ3ZpTkF2d2xROXhpUERMQzdzVEFkc0NQekhCeGJxYlV1amRmN2ZKQ3lhdzdhV2JXOGF3TmtCcEFwbmhmUDluMEh3T1o0ZVptdURSWlRHTGpuZ01YMWlFdlAyc2JmRitVUlFtQzBDMDl0OTJMWTJPeXhmbUQwaTgydmUrQ3RBS1Vrb3EwQjBqZ3RBUExzT1Y5bnFTUTJUNXlZL1lzd1JHelNLcDZIU2V6Wk9Yb2Vyeko1dmZNMlVqeTJrK0w3L1Q2WVc5dWJ4cWZkU3ZOM0RPUW5HTnhObGYwMjVKMTZXdUR6bi8vOFdoUkZra3Z5dytGUWprWWpHWVpiWjh2bHpYOG1wVXE1MnI1VUNoR0cyM2Z2K3JrTHVQQzlwMzBpeXdqR1pNQUhJQlQyemRjeDM2b1dFRnZLT0JuMHM4RGZtRzBpNEcwZmgyVGIzQzc0TnU5NktGZktxTlZxRXhzODZYbjRPOGlDZURHUTU4RWNtVEttQnZSc24yZEEzV3M3eTVOdFR4YllYWm5UQWp0dkJHdTFZWEJKYWxldUFUcS9OTFdZU1h6bCtUSm5FcC9YVWZ4aDRCZ1lVNVo5Q09hemhNWjREdEJaWGNnd0M4bytTeDVvM0gwZUJ5OE9sQVpBczE3Qkk4ZVhKOXJtM0M4aFNWSmMzK2phbnJXdlJESUcwQnZMeWdCOGhHU2tweXNWUzBPQmRXdm1yQ0FFaHNlUHR6NWJMb3MrWjZ3STJMa0RteUlwbnE1SkhhK01rWjFpeG5hc1RGVjBOcjhMMTgyeisycUNSdUMyU3U4ODdBVkpQaHYyRWlNQUFMaDQ4V0w4d2dzdnJKSHhIUVA3TklvaUpjVFZaNVRhK1AyczJyNVNtVzVmNld1bjM4RGxaNTUxaElZUjJDemdFNm1TMEhTTlBwN2wyUnFXNTJvTUlQTEUzSldaQjMxT1hnVUVXak90N1JzK0FTaTNTekloeTIwTnJkbVpIRkJuajZKSXY3K0tRVHo3SE1YbEUxR3kwRGdkb0FOZUc2RDhlbm5lSWxBdkFuWStWc1lCTzhZQnUzSlBRQURuUGIrU0hoZzdZRldzQWxqR3dERUFSSVNscXd4Z2ZlWWFZY0hCQTIvWEp1b0xMMjFtM3QxTHcvdUt0NVdYclZ3YjNIdHo1UjljbXNIRFI1ZFJLWVZJMC90ZlhiKzZ0dVdrWm9wVW1YZENmVy82YzlqUkFGOE02ajdZbTFoN1R3aklRNGNhWDJnMlMyc1VWM1FtZ0ZWVHpNZVBBWEJ1akZjRTRBQmdwWGs2eDNHc3BKUWlpcUlpeS9wcHdpMEgvcnNOOHJjU2xIZWJiNnE4bi92YzU5YjcvWDQ2SEE3VjBjMEppUUFBSUFCSlJFRlVjRGlVY1J5cktJclVhRFNTdytGUUpzbVpMNmRwNTk5a2w5U1Y3T1lNazhPVmwxL0Q5UmRmOG9pK1QweFJTTkVwU2dKb042dllQOS9RRDZUZ3l2S0lxMSttR2UwNUlHdTJaM2Mvdk5RVXh5NnkzT3dCSWRDY2FZMEI2bUxRSHRQY0NVd0NBMDFXUWhHWTd3VFFpMERkdmMvdFFkMkRKZ2JxTEhraHNQTnhsd2Yydk5TdWVLWDBSRjZEWFcvWXVYTEtLMDA2NTQzTTFtT3ZxVHhibi80dHZmR0xxZkp4S1pEM3BUUnBIWU5BN2VEOVI4K2s0OHFsQUk4ZVg4SGhsVGJiSEVlWW5kbnV6eUNsd3RYcm05NTc4clFpYkd4U2Z3NTdFVVpSN0wyYkxFQUR2Q3p2bmxwZXJuMTFmcjV5a1piRjZYYm8zOHhvenJheFNKTG5ranUzc2grWGh6TUJXYlY5bXFZaWpyVi9mVHFUdXI3WDYyVkp4MDNqMW01VTluZlM0OTFlQVBUZDVoUHI2K3ZwYzg4OXQzbnExS21aMFdpa2pDRWVxZTBSUlpFY0RuL3dyOHZsZHphQ29QNEpXbEszazNEaHVaZWdwTVR5Mjk4RzJ1QURBS0IwSTRxOTJDblhha0J2elJrRXVIeWpaNGtvWlZHQ2pUbWxKWFpiUXFaM3dqQkFvOWxBcjlzcjZKNWJ3RjRXSWVlMFlaZVZOMW9OYnhvaUx6RnNGOFpuVUdNdnRray9waEc1V08vVnFjSjdoY3pJbUp2Sys1RXJzYUJNNVhBeVc0T1VFSUg1VkdqY0tnR2xKUFNlY0xEcnB4WE02K1B2a0ZZK0NTcGZwM1Y1bFIyazJtTWVvSlMrUzFpcnZkS2FyV2VGL2xZRU5aaldiZ3VkVDBrRkVaaDZCV3k3K09ZNENzcmtNODh1WEp2czVqdW12b1ZXQTZlT0xkbmQxcmcvK3poSnJjZTkreTNjMk9qb1RXbmdlRGhpK0R6bWxBQytHMkUwY0V2dHNxQk84ZjdaL1Y1Y3JENjViMS90RlE3bVJSSzhBWHdMNkZrWHR0a3p6MWUwTnA3dTgzTldnaDhPaDFiNnAyTUtvenNnVDgxdWhqSVdoanNpeWUrUSs3amJnRDQyL04zZi9kMVdyOWRMb2lpU1VSU3BLSXJrWURCUWc4R0F6dW5WcTMvM3U2TlI5NjlKbXAvV1NwUEN4UmQraU10UFA0dU10ckxnNDNFQ0UzMWtKRjAwcXlFT0xUY1JCb0xsNVdsZ1BraGYwczlLKzgzWjJZSVcycFprL203RDZCd1gxTzZPRmtueEJaSjI5aWo4YzNScnZFUmVBS2E2N3pQU2ljMVlVRHQvUjVTSDl6UjdSMWxKSGRUNmNkSzZMWitYNnplMlNHTDNoSE5LekNLdDFHdWtjUVczNWwwcHhkVGtaclU4ZXo0cWhFdDh2RUVFdElxbHN4SWl4WGxTdVFNWEN5RFVsN3d1bTg5L1I3WXU5cTZzVk1xa2VBSGd3VVB6ZU51REs2aVV5RFd1YmdJbkpQZWpOSzhVY09YYUJ1dWZ6SHNHNjFzbEVYVWl4RkVNL29yb3pENkYzRzg2ejg5WHZyZHZYL1Y1NlRhYkFVbnY1cmZGN0NKSm5xbnNGYmVlTi9sdG1rd2VCUUI4QnpxVGR5eXBvM1h4UnVON0t6RHBwc1BkVnRjRHR3YWM3MGhkZzhGQVBmUE1NNTNoY0NpaktFb04yRXNEOW5Jd0dNaCt2NWVlT2ZPRmZ4NUZuU2ZJci8xT3c5VlhUK1BON3o2bEJ5YnlJT0xCRUtmMExGbXRIT0x3VWd0aFFCSVVKM0NPMkU4Q2ZxTSt5QitGWVFJNE1uSzg4OTY0TmFGVUthTlNxMDBFNnJHZ1BhYmhQbkNxd3NNQ1RsR1IyYjZmQnRDVjM1d3NrMllCTFZPUEF6NDJFcnk2M1J2Y0h0anBodDg0YTBoSGRUQ0NyMHRtcm1rNWs4UEFBWllKWUNETGdWN1JOK1hBVnRsdmpEKy9TMU5VQmlTc2l0ODB3dDJYckd4ZUJuMGZTcUZXS2VQZER4L0U0WlYyQnRuZGI2TmZSU3BaUGZkSnVMeTZobWdZcy83MXZ3UFhkOXFLUGg3Ry9oaGxhYk9NdHcvV0N1MTIrZGtEQjJvL01GVmJVTTRBdUJXcVdIbGV1dXlaZHB4VGJMNmVTZXd3WjVVOU0wa2RVa294R21udEJFbjl6TG8rKzlMdkN1anZCV2M0ZHlyUExlblVwNTkrdXIrNnVqbzBRQzhIZzBHcXdiMHYrLzIrNnZmN3N0dmRTcDk5OWsvLzZYRFkvZTRPMnVxRnRUZk80ZHlUMzRWTVUvZkJvQUNjS2M0RGZFMlFLdVVBUjFaYUtKZkRzVUJDb2Fqc1VUUm1KNmh4SURpUmpybEUyLy90c09ncFFtdDJ2Q0hoMk1jWkE5dzVhWndUdVZ3WlBwQ1BBL05wQUIyODl4aWdUd3ZxT1Z4bWIyUzN3TzZBR0Y2N2ZFTTYxbGE0dEZCK2ZKWUpzT1BiR3VlNU1ldUF4TFhSZ2pRWVNHY0F4UUoxcGgrejl3RUg3bjVhWVA5Q0N4OTQyMkhNTkd1d2sxNkNFUTFoWXMzMnVRTDNselRmN1VlNHRMcHUra05DS1FPMHpKWkNLUVdaU2d5MklpU2oxUFlkdjYvWWVLRDQ3UDFXcS9UU3dZTzFwOWc3RXJsM2xzK3JPT2h6aldxQjZ0NmJ5MWR1dnQ2NndSMWptS2NBcDY0ZmpVYVFVb3JoVU5QTTRYQ29DT3duaEYxaDJrN241ZThreU44TllML2xlWlJTZU9xcHA3cTlYay8yKzMwNUdBeVVPY3QrdjUvMmVqM1o2L1hrY05pTG4zLyt6MzhqamdmUDdxQWRYdGk4Y0JGdmZQMWJTSlBFRWh3Zk5US0FvSXpWUGJTTFVha1V5b0hBMGFVbWF1V1NENWhad0NrQS91RTRrSi9ZUWRzY04xSElidjhnZ0Vhck9SMVlUd1BjL01pK2ttMkFmQ3lZVHdIb053UHE4T3B3RVhsZ3p6YXVLSTZOUHppak54M2w1cGxzdTd5MTY0cEorT3pkZWdETG5wN3k4UElVU3lNWkdGTVpKcDE5SmdZb1VybjBESFU4WnNUbHAvTDBPUWdFM3ZiZ0N0NStZajlLWWFEM254Y08xSVczZHkxN2swSlhsZTVDcTdmWFFpb2x6cHhmdGY1QWJGOEM3ajFBMnlNTk5nZEk0NlFRdk4wMXkrZS9FclJhNFd1SER0VytEUnFGSmhocFdtVWtkc1hTY1JDM1p5N3hGOXl6QitCWnowTVpWYjI1VnRuNWVKcDdaNnA2RElmRHFWempzbkJMVmZRODNIYVEzNkdYTytET0FQdE5TZmhiVzF2cTlPblRnOEZnSUlmRG9lejMrNUpBdjlmclNlY1VvUnUvK09LLy9mVWtpWDY0ZzJmeFF2ZnFWYnordFc4Z01Tb2hIMXg4Z3VzbjBJY0VJQUtCdzh0TnpEVXJEQXg4WVBGcHVmNTRSdEV3Qnp3M0hYSW9PY1Z4azZIZWJFSUV3WTRBdXdpNGN3QStCc1E1a0U4RDVycGJwZ2YwbllPNkFVOE82b3Ezb2FoeEJZMzNjdkEyVWcxRVBIbWNPV2VXMUZrbVNzSktnRFpQQnJpVlF0NFJqblMvSGVnRGlyVlRaWUJJc1dkVDNuMEZWeFQvUGx6K1ZyMkNENy96R0E0dnR3MllDeU90NjNvdHRrT3I2TTFkSjlXRGxtWGQwcS9wam9mekY2OWpPQnl4TWNyR3F4a1RhY0k5MmNFQXEza25KcTJiY3NublYwcWhYZy9PSGpwVWYxSm5zY0VDTXdVV2IxWHVyQjVGYVFCblhLZVVVdG4xOFN6dFdDTTdQamRQbHZRazdXZUJ2dFBwa09ybVRnbXFZOE5lbUpPbmNDZVpnWnV1NDhLRkMvSDYrbnBDd043cjlXUzMyNVhaUElQQnh1Q2xsLzdpZjBxUzRaa2QxT3VGd1kwMW5QN2JKekFjUkRsMGNQU2VTYVZGb0E5Z3VWM0hnY1VtZ2tCNG9PSUJ2MG1lcEttZFkrTEYzQVlNM2o1c2k4NlRqK2JNZUNsK0dzRGVFWURud0pVL0J2dkwxRjBJNkJnSDZOT0R1Z2ZzMlU3Tm9mMTB3RzdiYTJ0U1JqcFhGamdCMkhTT0xqdWdWaVl0TEdOQVVwWWo5dFFCQ3J3OGVoYjdsSG5BeWJTQjUvZlM4cjdpREFIOFp6eCtZQTRmZWRkeHRCb1ZiL3JkQWJpdzZucFMwV3R0dmI3bmx0UnBhL3RPYnhjYXNqMFFibXgwY1gxdHl5MVhsUDdTUlNrVmtpVFJ1OG1sM3R5NHo3REJNVjN1MnRHeGFqVzRjUGh3L1FsQVM5OXNybDJ4c2hRSDhjeHZBbXVmUTRBRGZCNUg4K3pHb2g0WmliNFE4Tk0wVlZuLzlSbWp1Nkl1dkJPWWxRdDdBZVR2R2xEZmJCMlhMbDJLQ2VDaktGTGo4dlI2MTdxdnZQTDVmNUttb3pkMzBBWXZqRFkzY2Vadi93NkRUbWNpeWpwTXlJS1h2dGVzbFhGMFpRWTFQazhQUit3b1R4eEYrY0xIaEx2S0FHd1R0TUZkZFhJanB3SHRiUUNjd2pSQVBnN01jNENlZVhlRmJiV1h4YURPSVRyM0VPTWVuRUF4OHh6NVBQRHpFS0FycGFWekJmaUdkTzYrTHNuTTV5cFhIMnlSaXNjd2dHQUFMcFUzRmNDWkNVbDlwK0JBbi9jTnBaZThuNm50T3E1ZUxlRkQ3enlPZDU0OG9KZkJaZWJaQVEzZVFXWU9IbkRTTzU4OTdVY2pQUGZxSmZ6LzdMMVprQjNIZWUvNXo2bzZhNjlvb0lIR3ZuRUQ5OFdrSk5zU3FjVytrbVZMNDVCMEZYTFljYjJGN1JmYjF4RXpvN0I5SjhZUmxsN21hVjVtUEk2NU1YRm53bU03SkZseExkblNXTHEySlZHbVNJZ2lSWUlFaUpVQ3NRUGRqVjdPVmx2bVBPUlNYMlZWblZQbmRLUFJJSm5rd2FuS3JiS3FUdGN2LzE5K21mWEtxVXRZV2szZW0zNG5oSVdsVmJ6NTFqVUM5ZVMzcGE5bkZFYm9yZlJTcjR2TmdyMi9pcS9Wbkt0Nzl0Uy9DNGhrSWp6NUtkUDdMUG9IQ25wR0UyelBldDFwSVBWcjRHc1RQb0JFdFZNemZSUkZnanJma1JmVERIcjhiUmpzYnlma053cnV3NFNoeWtSUmhKczNiOFlLOEgzRHlzcmw1Wk1udi9INU9BNStNbVNiVEFoYmJaejk1KytpTmI5UUNKUGNRQi9HUXI2dWRzL3NPS2JIYXliSkJvamZDMmpobkUrNVVKS3R0NnhESUJlL1dWc2JSTjUvdVNwbEFNZ3hDT2JsZ1c2QTFBL3FLWGdYeGVlQTNUNlhmbURYcFZJZTVJazZoNElzQlN5Z0g3NHFqeTVQOHNueUdzUUUrcm9Ea09PRXA3ZTU2V2dJbUJmY2ttTkRiOU9PZ0lhN3F2UGdyaGw4K0ttN01UczlCa0NyOUVUQmcxbHozNWtWenlqZ0dhN2NXTUhMYjF4Q3V5Zm5VeDgvY3dYTHJUc0Q5TmZtbDNIdS9EWHp3aDE2dmVSOTVBaDdJWG9yWGFQZ09VL05WYzkwcnNndFUrUDdRTFhLcnUzZVhmOHVZNGdOZlNYTGFUMEcxRnFwQXdud2M3YWg4ak1MK09yWWlWTFhrVVMxbXlsekd1eDVpcDZzV1E4aEJDdnBkS2ZETGVmYTdZRDhxUEM5MWZsSHV0QkR6SU5ueThzWGw0OGYvNjkvSEVXOTAwTzJ6d1FlQkhqek84OWkrZUlsNitFdFF3WThGanowYzQ0Qm1KMnFZOWRNRXc1REpsL1E4d2NRY1AxeFBVeUhvQlN3R1VOOXZGa2EwR1hBM1JmZ3NMbVo3QlRDUE9mRWk0Qk9RWm05OVRhODlRSHNpbTFBNTREZGJoUTlsOVJSazJQcE14TGtMWEtrOVFBUzB5NG5MNUlYQW1sZ1E3Y2pnWEk2anN5L0oyUHFYS1JOeCtrOHlBS2RRQ2M1RnRDc1YvSDA0NGZ3K0gyN2xITmQ0bFNYZHJLVCtabUNlbUl1bEJYcGgwa1VjN3gyNWpKT3ZYVmRlYURMZGthYzQ5V1RsM0QrOGlMcEhHMitjT25xSXQ2NmRNTzhOTWc0M1BIazNnYmRFTDJXYjExYmRRL1VxVkZIdmFUVHBaM2dCR28xZG1YUG52cDNIQWNSdlI1RWJlY0dhOXBjQnZRNml1UVhRczJYcDNINldEa09lRUlRWmE4Yzd3QmtGRDJDSUJEcWsxcEJyMlFZS3Y4d0h2WWJEZmtOZysrUVpXNTFmbE9tMWJxKyt0cHJYLzFQWWRoOWZjaDZUQkNjNDYzbmptTHh6RmxrSHQ3Mjh5S0hQaFF5WTQwSzltK2ZRSzNpa2g0NlJ4U0VoUUFielBWU0NMN2xvVEhXaE1PYzNFT1hhV0VSdkcyQTUwTTgyN0hLaGZrUVFNOUEzYjd2L2FCT0FHMTNkbkliT0JEczJYSjBYRjdYa1R6TWRUNnVsclhYVGxJSjNtVlpkUlI5WEM0eVU3TkFIS3c0dUtrQnVrNE5JWG8vQkdsZkNqUXcrZTdhdXhVZmZkODkyRDR6RHNhWU5NTXpsaHFIVDhiZkU3Z25xbDJaN05WZi9QSnFGeThjTzQvcmk2dm1HZ2hBS1dBSis3ZXVMT0tWVTVmUTg4UDhIL0Z0Q2tJSW5MOTBBNWV2TFpMT1dmcDN6b1dBMy9MaHQzMERiSE9lcWU4OFJRK3pYYTg3RjNmdnJuK1BNY1JjVVhVUTNQUGdiWS9CYStEVEpYQkpmbU4rMTFsdHVPdnhlZXA0QjZROTdHMkh1eUFJaE9WME4weFlGMGM3TzJ6MEZMck5sSDhqanBHYnY5dGQ3Qnc3OXFVL0M0TDJ5M25wWmNPbGw0L2g2aXZIakxxUkllZmhid2NMVXA3SHNIZDJYTDdKRGtEZ0I4bURzNmk0L2FFOEtNWDBvVEU3cU1KTWFJeVBaVGhYQk9sQ2FPZkNXMlJiVTlETUxNaUxZRDRBNklYM05lOWdXVGhub0o1cGRONk56RHUyZlV4a3dRNXRydFhIVTVEbTZYdzBUaENUdkxrbVJDMGFnRU5PRDlYM0JCeHBMM245TUFkUGdNNlRPMGFCcisvQmVMT0duM3ZxYmp4NS94NVVQYTNla1l5L0c5aHI4SU00MmluZ2F3YzdkZFhPWFZ6QTBkZlBvOXNMTXNDVHNPVEcrckN5MnNWTEp5N2cyc0xLNEIvMUJvU1ZWZ2V2bjc2SWEvUEw2VEY0d2NtYkJqbDZxMTIxVEcxYXVXZitkdlM5VnI4ZFR1NVhzK244Wk9mTzJuT0E0QXJ3cEdOWTVMeG5Qc0tPeTFQMmRxZUF6b3VuWSs4cXpuUUlLUEFMUUk4b2lvUUd2UDV1dFZyMHovZTJnMzRqMTY3ZmJPRzJkanA4ZjlWLzlkVy8vZUpERC8zNy82RldtM2pQa0hXYmNPUFVXY1RkTG5iOTFHT0E2NWtqSnk1QUZBaWtXZnJCQmVuNHBNMzNqYXFMYytkWFIyMU9NWDVKUXFrTE9UQlRmOUI3bFFvcXRXcmZ6c29hcWgrUVJRemE3Rit1ekVVVU9YR3BuUFo5ejhrcmN1SjBRcit5dWVXRWVkdXJJNUx4YU5PbkVOeDRtMHZReWpRWlJ3RWgyNjZ0a1VMSW40SlEvOHJucjZxREE4SXhoNGRlcjU3bUFXQ1d4aGVRNzc1eGxYR0hDWWI3RHM3aWlTTjdVUEdjWk0zNWxEa2VTRnRHaVhPZG9qeE45c01JUDM3akVoWlgybkNVcW5kVTJ6bVVxaElBZCtRMkYvSmN3eWpHeVo5Y3c1VWJLOWc3dHdWYmxTL0FSZ1kvQ1BIVzVRVXNMYmZVUGJNNlcxeDE0R0sxVEcwUWdVS2Jqc05uMWJ6cTJCREFqNDI1WjdkdnI3d2t1V3ZVdHVsQkNpRnNPVjlHM21jYzZreGhNb1dPekxVWEltZWNQczlzcnhXOEJqMTlqN3psV1cvL2NTUS84bkpoMlB4OXcwWkJmck9wK0Z0aUZoazJoR0UzZk9XVnYvNWZIbjc0czM5WXIwOS9ZTlI2Rmk5Y1J0anpzZmU5VDhLcFZhRmYxR0dDNGJwNmFZZnhBcGFQVHBPVkFlT05Dblp2YlNMb2ROQzlSU2JFVXIvZWdreGxiMXh6Zkh5Tm9DNlJ1Lzl1dVhyV0FlZ3lwUVRVVGRSNmdWMGQyVVJ6Z0RuUXc1RUMzSGlkNitlM0FNQTRBeHhoZ0M2Z1h4ckRFdU1BVjNCVzB6MWxFZjJTR1BuTEZVeUNoemtFNkVqbjBkRFhyN09SblZwZ2VxeU9weDgvaExtdEU0blpYUjVPQnUxa1o0ejB6TVFsNmgzSjN4WURyaSsyOFBJYkZ4RkdzVHdPay9WeFIwalFDd0h1TUFsNkx0T1pqSWJqeU11N3VOTEJ3bklYWTQwcTl1M2Nncm10RTdmOHZmUnh6SEhsK2sxY3ZiR1VXdGhJT3pDbXA4bXBkOEdITWZJQUQ4RDhIbXlWYll4RUFNYkgzWlBidG5tdmFuQWpBYnNOWkcwbEVIbjVETTNUa2ZyNEdVOTYwaTRON3d6VTdVVnhGT0RwV3ZZYTlvS2E2NE1nRUNzcksvM2VJWDlid2p0WnlROFRibGtuSW83RCtNYy8vcHYvOWVHSC8zM1FiRzc5eUpESE1XSDF4Z0xlL002ejJQZmVKMUdac2w0c0k5SVBKTDBhbDhPa2FaS3JOZkwxTTV6eEdBZDNUdVBxWWd1TEs1dkxBN2dNU0puRFVCOXJsRmZ4QmRuVzFwVXVLK0dMZWdvRGdKNmJaVWlvWjVMS0szMlIxMDZ1d000WUJIMHJIVmN3YzVSQVlWcWhDK2gvQlhsTG5hWXBoNEFMUUFnR1J0NCtwMkVOb1VCUFZUeVNQTEoxREZ5L2RRNE1nZ0VQSDU3RFV3L3NSY1dUWmdCcW5rKyswbW8reVpjYW9EZEhmZTMwRlp5NWNFT1o5UFhZdkFTa3c1a0J1cVBocnFwZ0FqSWZsOE1CUXEycHY5cnhjZnpzVlp5OU1JODlPNmF3YmNzNHhwdTFkVk1uY2N5eHROTEc0bklieTZzZG84QUJFQ0NuSVIySEVYb3RIM0VrbmVWc3RRNkF4UEVDTlM4d1B1NGMzN3JWTzU0bnd3ZU14UmVaNnZPZ2I1Y3o5ZWNkUTdZOUJYbll3TmNtZXVwOHAxUThBRGtlWDJMcTNJYUhkeXJrNWRObGsrUVhJaGF2dnZxMy84ZUREMzZtTno2Ky9SZUhPRTRxZEZmYk9QMHZ6MkxQNHc5amN0OGVtRWVTb3g5aVFqMWNIUFhnRWtyMUorQ0lJN2x1TXhnd3QzVWNZL1VLTHQ5WUlVdHlwaDl5bXpIVUcwMmxLRzlGN2FQSTl5TDREcTZnR09qOTZpMnFzNFRhenkydkgvNDVaVWgrK1R0S3pPb01Fcmk2VXlrZ3dKUWFsM0JuNm0ydnVsME1IRUtxWHlITi9pb2F3blFNMUhIVVBnUWdIQUVCQjhhZm1VS2Z5V054QWN4TU5QQ1JwKzVLcWZjVTBNMllPbDNBeHByN3JnR3R5Ti91K25qaDJFOXdjNldyWnFuSTRFQ0RHeGt6dllhN284NkxFU1d2cC82clpxTVhSRGg3WVFIbkxpNmk0am1ZbW1oZ3kyUUQweE1OVERScnBWOWh5emxIRUVaWWJmZHdjN21ObFZZM0JYQjVmMVhuVFZqbWVTRVFkZ01FblNCbGJxZmdUc004V2RuUFdIRFV6WnFjZEYvZHNzVTlQUXpjRldRTDA5UHRTWHZOMHp4V1dtb2VQSTFYMXlzRmQycXVCNUk1OG5wYksvbDJ1NzI1WkR3MkR2S2JDcXFiTVFnaHhMRmpYL292UjQ3ODBzM3A2ZjIvaWhIUGg4Y3gzdnJoeTloMmN4RnpEejBJNXJvQWhGUVg1bUVteUxpakFGTnFDd0FpeTBRL01WYkRvZW9NTGw1ZlJ0ZVhZM0N5d1hsSFo3bWJHeDBhNDAwTXJjTkg3aEQwS1ZnUzVESkh2K3Rha0RDdy9sR2hybHBVcFBLTE9nSUNhcHljS25ZRmRrY28rN1ZTNXJwandLV0s1NDdTOEF6U0l1QUlxZTRCTUNFZ09JTnc5SFZpSm85OFR6MERHSWZnRE15QjZpZ3djREE0SEhCY2hzZnUzWVdmZm1nL1BNOUJhaHlkcUdvRGQ1MEFEWFNTUnFCNjd1SThYajU1RVhIRTVmSElPRHNZaytEV1pub21RUzY0R2hKUThOY3c1enhSOUZ4SUt3QWo2VUlJK0tIQWpjVVc1bSsyNERsQXhXV29Wang0bmdQUGRjMTN0U0lmNjJFWUlnZ2k5TUlJY1d3cGRibVI3QnU0V3dxZUMvUmFQVVJCWlBJbElCU3BiUTE0L2J1eHh1SGpMVnZjSDQyUE94ZktlczRURTN1cUFNK3BnTVNwVXpMd3A3RHYxMVBJbU8wMTFLbmpuUTM2TUF3TjRLTW9TcTBTdWxuQ1psYnltNjFqc0NINVQ1ejQrdGNPSFhybXh2YnREL3crWTZ3eVJIa1RHQU1XejEyQXY5ekMzdmM4am1xelFZQk94K09WeHpBWXVGckFKQXlEVEgyVmlvdUR1N1pnZnFtREcwc2Q4N0RJUDRYc0ptbFozOTIxQk0velVHODJVQjlyd3ZXOEVhRmRzdEFnY1BZdE9nam1CWW1sT2d3bG9HNmkxZ25zbVdpdUlDNU56MkJJd0s1Z0pZc1ExUTRCVjV2aEZjd2hvTXp3VXUxcUNaOG9kSmxnelBKa25CK1FZL3hnd0picE1YejBmZmRnNTdaSkFuTXl0azdXbVUvRzNITlVQaW5iNlFWNC90V2Y0T3I4aXBsbXg1R1k0bVVIUTBweWh6RUlwam8xWEpud3djQTB5UFd4aE82d2FFZFlwa3o1OHJ3Wmsza2NCM0RWRUVVWVNZYzkycjZLNThMMW5NeXRNMyt6TnRoVm5Na2pBQzdrOEYwY3hmQlhleG56ZkI3c0tlQ0ZVZlZHMFFlenM1WG5HdzAycnlHYzg5SHRNdHhPbXA1UjZvVm1la1g1akdWQTcrZVo1SFVmUVI4L2J6eGV3MTFCbjVNeGVRRFNWTCs4dkZ5azRvZDlHbzBzT2ZMQ1JrSitGTFc5S1VFOFpINE1VVVlBd0xsejMzbSsxMXRaM0x2M1BmK2o0N2lUZ3dwbEE0UHJNdlNXbG5IdVg3K1BQVTgraXNrZDI4bURDNkJ6ZkYwSGlHVG5WTDU0b1FEUTI2YkhNRGxXdytYNVZYUjZvempsNWFuSWN1ZVRGMXpQUWEzUlJMM1pRS1ZLK2tNajIrblgvcmNsN0tmcktNY3JDL1RjTE1OQkhhQ1hxNHpLenp0dXNpT1V3Z2JUZnl3S3hBTFNTOXR4SUdlM003aHFESm9SSmdsVkIzT1lNclhEak1sclQzb0JCaTdVZUQyRlBtZkt5UTJBNCtBOUQrekZUejl5d0N4cW95bnVHQzk2K2E4OTVtNjg3Q25jMWM3cDg5Zng0dkczRUVVY2pzTVNVendTczN6eXJYc213aWg5YmFZSGs1NEZEb1RzckNpenZYUnlZM3F3WGxwQ1ZMdGNSdzV0bUxVRW9Ec0dBcTdqb0ZMeHdBRHdPSDNQVEVkSXBPK2RobVd5cmZJS2diQVhJdWo0WmpXNk5HaHRaN3A4d0FzQnVDNXJiOXZtUGxlcG9LV0JXc0JtM2lkTkszVTczUWEvQU1DSnFxY2d6N3k1am5ZSUJvM0hhOWd6eHN6VU9XcW1WNmI2NGoreThtRmRBUTlzdkpJZkZucTZ6S1lEOFFqSEdDci81Y3N2bmVyMWx2L1RYWGQ5K0k5ZHQ3cHppTEtRaWwwOTJPSVlsMTU0Q2IxNzc4YU9ldzhEU015VDV1TXkrS0ZBekFWRTMvZGVTL1BnZ1oxYmNITzFpMnVMTFRQMmRtdERjZ3pIZFZCck5GQnZObEN0VlhQenJQL1IreW5yL2lYTEpRK3FySi82SHdicU1yNi9XczhySy9wM0pxempDVDN1TGlCVlBGZm1kT2FBQ3c1SE1EQkh3VXFyZHVneGI2MHF5V0hWMkhVeUprOFVQOVFpdWx6QWNSd3dBZXpmdVFVLy85NTdzRzE2TEcxcUJ3eXNrekYzRGZaRXVadDB0Y0VBdExvQm5uM3BESzdjV0lianlJNEFWMHBkbXVMbEdYQURkTjFnSmpzRFFzQlJsbzFZU05NOUU0bUhQYld1ZVk1SWpxMkhFNVRLMS9kT3Q5MEJVSzE0Y0YxbUZIbjZ0dEQ3SWpMeEd0VHlkeUUvdlphUHlFOVBqd05nd1QxNXN4d2RnNmVBOXp3c3pNNjZSeDBIUFF2TWVZRjJPbWhuSUFWdEMvcDA3cDB4MTlNeGRndnVLY2M3MlhTdXkyVGdyczMwYXBzTElYaWVWMzBZaGtJSWdaeXBjN2NkOE1EdE05ZS9MVUE4NURHR2J0UGk0dGxycjcyMi9EOGRPZkpMLzMyMU9uWmY2WVlKbUFlUkhrZGNPbk1Xd2RJU2RqMytNR29OQ1VkdHduZFVrNkpna0RwUGZvTmJKdW9ZYjFad2RiNkYxWTQvekdtTkZHcU5PaHBqVFZSck5YTW9ZWjU0SlN0WjF6K2hrcFdWQmpuSlU1aTFYMmRqQktpYjNRSUJNZ1RZMDJVRUJIY0FoOHZ4WmNnaEljRzVVdWd3SUdka0RGOUFRQWhIanNIcjhYWm85YXJINUdYZ1NpUTdKZ2ZEUkxPS2YvZmVlM0RmZ1IzSkVyUjBWYnFVYWs4V3NLRy9uNHlsQzhEeGMxZnh3ckh6aU9KWUFweUwxTGk2QXptbXJoM3BBSGxlMnVrT1hCNUNLL25FbTE3Nkt4Z0hQTWcwUGJUQnRNb0hvSjFtZGR1RUVLaDRIaXFlcTJiSUpPbnkydHIzV1pBditwdElGSGtjeGZCYlBuZ2NwOHp4T3QwMnoyZGhud0MrVnNPbHJWdmRsd0VSY2E1Ry9CVno4d2pQWmVWVXJZTjgyK1o2QTJaOXVrU3RVOWpib0JmeWJzQ3Nxa2VoYjRNK2ptTlRKelhaRXhWdnBzNVpwbnJkcnJKaDJQemFhbEVxc0NIeWpoVEkrK1NMUHM2QTlQVW9jMGNmdy9QcTFRY2YvTlR2TlJwYmZycnNkYS9WS3ZBODE1Z2VOZlNkYWhXN0huc0lFN016NWtFSEJyUjdJVmFXVy9DN3c3OEdjNlhkdzlXRkZxSUJWb0JSZytNNjJMWnorenJWdTA2LzkzNEFMRnU0YjVIUmdBNWdSS2lyK0tITFpzOUZRTUJ4NUZReStaRmdrbkh5anJtT3REUTVEQ1l2UzIzTHZMb081a0I5eXc0RDAya09ROFZ6OExPUEhNUUhIanVJU3NVbFpuZlZJRFBHbmxiMEpCbm10YkJxSHd4WWJmZndyMGRQNDlLTkpkTW1CdjIzaEp3NFpvNnRuZTUwMnhscE0zUittU1dUeG5RamhOVlJJVzJ0VlN2cXpYajJuVWpmbjlUelhhVGpoQkRRUXltQk1zOW5YdE1ya0lJczNjK2E3YVdpSHh0alo2YW5uUk5DaUJocHVITWh4OW9welBtZ0QrZGNMM2VyeTZmMlZSNmRMNlp4c1NSMUxJU0k5YjZ1ajNQT295aUtkTms0am5rWWhqbzlEb0lnaXVPWVIxRVU5M3E5T0F6RE9BeEQzdWwwSXQvM1k5LzMrY3JLU3RSdXQrTUxGeTVFUVJERVNJQmQ1c09IekcvS0RBUDV6ZUI0TjZycUhxYk1SaDVqM2N0RVVTOTg1WlcvL3QvdXYvK1hiMHhPN3Zwa3FZcUZNbC9xaDRSKzRrVVJycno0TW5vSDkyUEhmWGVCcVFkV3hXRUlsUWZ0VUdjQTZZRS8xcWppK21JYk53dGZvVGtzWEpNR05KcU5iSEdUUENLMEJ4WmJTMmNnKzJBZCtqaWxMQUJsb1Y1VXp3QzFibmJMZ1QxVkxaZmo1SW42RmdDWDgrY2x2NlR0V3B2MlpSNW15c2x4ZWpVUEhnQUVHWWRuaG9HNFo5OHNQdjZ6UnpBejJjd29keERZMHZGMU91Wk80UTVWTHdDOGV1b3ludnZ4T1VTeDhweG5TcjA3TUVNSjJtTWVUSHZIcTMwUWIza3dPTXJzSUtUM25EVDF4M0x4SDZhVk5aUG5tblJBNktwLzh1bzRESEJkRDdXSzlFWVE1UFlKZmNxcDMwUnlUOHh2eEFZOFYrWjU4cmR2dzF5ZUQ5M21HZGdEQXB3TE1UWGxIQnNmWitjMXhHVjFLY0NuQkx6T044RGpYcCtNcmk4MXJoN0hjY1lDb09xTFlYbm0weng2V3l2NEtJcE1CMFJNOHhFakFBQWdBRWxFUVZUSFVZZTdQTTk2eHBqb2RyczhDSUpocHM0TnJkeEhMQU5nYzBCZWg3VkE4cmFEZUozTDZITG0vSVFRNHZYWHYvcWxnd2VmUHI5anh3Ty93NWhUNzFjWjU4S29DNENvR0FYOGxiY3VJbGhheHE3SEhrQjFiQXllNHlDT3lmU1BvcDlUd2RrNERzUGN0bkZzbWF6ajZrSnJSTWM4R3BJRzFKdU5iSVBXd3VDUnc2aHQ2Sk94Rk15VDlMNUFOMUY5bEhwdWNsNm5KQWZzbWRPM3kxR29DR2dpQ2dWUnM3eXM5cVJuU0huSjZ4KzhYQmhIZGdLNFdqbkdVV3ZseWpWeEJHWW14L0JMSDNnQTkrM2ZucGptbFZVcURYcGlFcU4vQ3lyQmh2dEtxNGR2UFhjQ0Y2OHZHU3NDaHpDT2RIcGhHNGN4QTBuNU55V0h2VGlYZ0hZYzJZRnhIR0dXcm1YUW52VnFueWZlOVFDTU56MmROaWZiQzNpZWkxckZrK1A3WEYwN05lWnZ3RjE0U3hONDArODRsTjd6dGxtZXdqMkJ1QTMxdE5tZU1kR2JtWEZlcXRleG9FM3ZTQU8rWDZDZTlKVHNLZFd2MVRzQWV4b2RkYVRUWS9pY1cvUGZ5Zmk2NEp3TEplS0ZkWXlNTjMyZXFWNXQ4d0ZlOVhZWUZ0UlV3WThjYmpua2hSQ0N6QzI5VlpCY0w2aHVsaks2SENQYkFJQTMzL3p1QzZ1clZ5NGRQUGowZi9TOFdxRkRYaHh6QTNTOUxLWjVMYVo2RUFhdEZpNys0RWZZY2YvZEdOdTVVejFrNldGTG5JMTFacldxaC8wN3A3SGE5bkZ0c1kwd2lrdWVibjZvVkt0d1hRY3B1bzF1K1UrSE5YY1VTbFpRR3VSSm5xd3hyZ2pvL2VvdEFYV3pXMDdwOXdPN25WK3ZSaWRUbENjOWsrUHRRamdRVEs1ZEs1UUhuZjd0eVplM01PWE1CZ1U4Q2I5SzFjVkhucm9iVHo5eENKN25HUE42Mm5rdUhaYzRzRm53TngwREdmL1NpUXY0M28vT1NQWHV5RVZwb0pha0Zhb1JlakVicUs0TEZ6RFdBdWwwcHpvdVpONDdZOHEvVURBNFRDVG53MlFleGhnQnU0eURrRzF6WFdXYWQ5VlI2U0l6RE5rZmluMVB6UFVYNnZiSTc3QWJJT2dHdVdDWDlXZmhuamJkdzR5L3U2NVkzTHJWZWNsMTBhVkFCNEUyMlRhT2RGYTZnYlBkTWFEajhMSmRLY0RURGtYZTFEa0lJZFUrOFphbm5RcHVqOFBUYld2cW5JamptQ3V6dmdqRFVQaStMenFkVHI4LzdGRkF2V2F3MDNDN3ZPdUJqUUgrclR6T3FNZkt1M2xEWVd0Ky90U2xWdXZhLzN6a3lDZCt0MTZmZWlMM0lOckVaOFlLMDBwZWJ3c2hjTzM0S1V6ZlhFSmplaHM2dmFDZ2lTV2FUSXBOTkdzWWI5U3dzTnpCd2xKSExoQXk5SmtDaldZZG1WdXpiajkvWU0yVkRWTFdBd3JtajZ5TkFuU1ZWcWErUXFobjY4ak1MTWdEZTZhNjVOeUVZR0FPbDVCbkdwYUFmT1VzVTA1amVqb2FVeXZGcVpmSXFFVnp1UEtjZitUZW5mamswdzlnZXFKQlRQTnB6M2o2bmF4cWw1am45VGVGKzgzVkRyN3h2ZGR4OGRwTk0rWnZQT2UxSlVITmZSUEdvNTZsVFBPT2t1RWMwcG5PVEpmVEs5a3BvSE9oMnFPc0NKTDVJaDJuTEFqVnFvdUs1MEV2RGF4bkhoVGQxank0MDNzcUlPVGlOcXM5eEdHY1VmWVU1TWwrT2k0eDI4djcwbWl3bjB4UE82OUR6VVNEQWllUU9NT3BScGh4Y3RXNkRNd3BwRUU2QURUQUdzZTJITzVTM3ZJYTdxU01hWmRXOFVUVnB4enZsTWU4c1NDbzhYdGhUNTFiV1ZuaFFtVHV5ckJnSDZWTTZYRExIZThBYkJibnV6dTFISXJxWVl3NTk5MzNpNzgwUGIzL1V5U3ZDZVBqRFRRYXRWeTRweDZFNmp1RUF6RzNHNnc2MGhvOEpLU2JFa1ljMXhkYldHa1A1OVRISEladE83WWwvZ1JEZGhCS2g3NS9BbXY1K3hnUzVKbWtRUUtoS0VzZW1Jc3laenNHcGNBK0VEQkpKMU03MWJuYXNxUUF5WmgycENPT29RcllMbk9NczkydWJaUDR6TTg5akh2MnpacmZhL0w3SmR0Z0tlYzFZMEJVTUhmTTcwZ05Id0E0K3RwUDhKMmpweEJ4RGdkSnU0d2pvS3BJYnp0TVF6L2RYa2FQWWVLempuaTZDY2J4anB5SDdyQlVLeDVxVlMvcGpJQ2NpMms1a3I4SGN1a1o3TjliQW13ZXh1aTFldURFUVZaRFhHOG5jVm5nNjdGM0ZSOVBUT0RZK0RpN3BLR3VWVFZsTmsyajI3WnF6NHRIZ1lPZDJrNmxxZTFZZFNKaTVXQm5uUGJvZHF5Q2pnekRNRks3a1ZMcXNlLzdjUlJGY1JSRlBBekR1TnZ0eGtFUXhMN3Z4NjFXSys1MnUzRzczWTR2WGJvVStyNC9zZ1BkS0dWSXg2bFUyQ3hqOGh1cGlFYzUxbm9lYjloeU9YL0tLa0lJZnVMRTE3KytkKzk3enUvYTlmanZPWTZiZWo5bEVJUVlHNnNYd3QwMjQxZUZ3SVVYWDhMRXdmMW9iTjhPcHFYS3NJR2xtMXJ4R0hiUFRtRExaQjNYRjl2azdYYjlMME56dktrZWJ2MkFkanRDdWlIRmYzSURHbHdLNWlTOWJHZGhrRkxQU2M2YTRlMU01Y0dlcWxXOVRjNHNlS09jMFFSbmNOVlN0MEtOdGJ2UTQvZFNFWTlWUGZ6aXo5NlBaMzdxTG5pT3RKTm4xcHdIREpDaDQ1bjZaVEgxeGpjTDdvd0JDOHNkL05kL2VVV3FkMGdvY3pWeFhXL3J4VzcwVDVBck5lOEk3WWduNThQVGRlaGxxNUt4ZDduaW5ZQ0lHWmdqVlQ1RDhvcFphWnFYMHdvcm5vTjZyUUxYY1NSY1JiSWdrRGJuUzN0K2NzMVRmMEdwVzBTMk9FZlE5aEg2MUxrdUFiamNGN2xwT1hDSDQ2Q3paUXQrVksxaVdjTmNIb2FubER4UjZkU0VueHIvVmczTkJUL05reWZxVlJ0TjUwSUhYVTZyZWwxQXIxWkg2a3g1K1ZNVlQ4MzF2dTl6TWhiUEZmaDV0OXZsT1hQamk4SnRVL2diQW5raGhoNlhYeThRandyaHRaUmR5ekhMbGsvVmRlSENDNit1cmw3OXM3dnUrc2p2VnlxTmZUb2hDS1FqbmVNa2NNODY0eVhLeUhVZE5CbzFMSi85Q1ZyWDVqRjU5eUhsOURaa2t3ck9ybG1yNE1ET2FiUzZBVzRzdGRIemk5ZDVibzQzMFJ4cnBKeVBibVVZcm05Y01uT09vaXBWWUpoT3c4Q09RZ21vbS9Rc3BFY0JlenFMVUdQenltR05NNERKdDhJSnRiU3JFRWpObHdjRDN2dlFmbno2d3c5amFxeEc0RXlVc0RadkV5c1BOYzlyeUFOSWRRdzRGL2oreStmd0wwZFBJbzdrdkgxSGU4RkR2YWNlZ0g3OXJaekdweWt1VGZPNkU2R1hzZ1ZEWXFaWHFwek9vNGNBR0pOdm81TU9oNm85Q3ZRVnowR3Q2c0Z6cFcyZmM3VldIdFBYVXAyM0hvaVhpSUplUjBCZTZKejdBQ0R5SXpuM1BlZjFwLzNBbnV6VHNYaWdVaEUzdG16Qnk0NkRnRHFwSTFHWWduTXVHR00yNEZNcVgzVUlCam5rMGZwVG5RQ3EzRFhVY3pvQlppRWJmVHdrSFFvTjhaVFpQZ3hEcnVHdU0rbzYxRmc4ZmExc3YyVnNieHZVN2JBaDVub0EvVXoyZDRyNWZLMWwxNk44M3pvcmxXYnQvdnMvOFIrYXpXMW1QdjJXTFJOS3pTTVg3c20yVE90MmZWeTZOQThBNE14QlkrOGVUTzNhSVozZnNuYzFKNjU4V08wR3VIR3pEVDlJdzc0NTNzVFlSSE5OZGQvUzBBOTh3MVRRdDlnb1FGZHB1VVZMUWowVHZiWnlBa2ptdFR2cTljWUtyQXhNenZYVzVtMkg0ZDU5cy9qc3p6Mkt3M3UzS3BnU2MzWnFERjcvbGtrOGtBSy9yZnJQWHJpQnIzM25WZHhZYkNsTFZwSkhINThwOWMrY3RHbmVTZjI5S09zQm1Ka0RyNkZ1OHNINkcwTTZIV0NvZUM3cU5RK2U2eVp0MTBEWGdXWC95bExKakdVQUx3Q0ltQ05vOXhBRnlkZzdnQlRVMC9zMjdOTndCd1FhRFp5ZG1zSWJJajBWTHVYRVJ1UG9OMVg1UXFRODVPMjU4eW1Ra3pMR1BHL0JQcmJUN2Jud1pEdGxvaWVtZTg2dGVmRmhHTVpSRlBGdXR4c0ZRY0MxcVg1MWRUWHVkRHB4cTlXS0wxKytITkh6SCtFelVsa3hKTFEzQStRM0U0aHZad2RnM1RvQmh3NDk4Nzd0MisvL05jYWNSck5adzdadFUvb2U1QUkrU1pQZmI3NTV4VmdCQUlEVkc1aTYrekRxRTZuUmdQekFDbmNLdzJySHgvek5Odnd3Um5Pc1lRRitiUjJKNGNONi9EM1lhbmVFWTVVRmVrR1dmS2puWlI2ZzFzMXUrWElpL1E4QVBUWlBnY2tVOU9YK2dkMWI4SmtQUDRKSDd0NWxRRTJobW9FN2t2RnZBT2swQlViOXlGbHVkZkgzMzNrRngwNWV0c2JjeWRpNVEwMy9TYWZEQVFHOTZ1ZWFSWEFNN0dISzkydTNibGZGODFDdlZWS3pBd0RhSVZGblNBSFBvSTBjSnRqV0xmMHNqN29CL0hhUUMzYzdmeHIyNlgxaW51OU5Ub3BYYWpWeEEwU3hnNEJkYjVQdkRNeEovdFJDT0RvK3gxeHZBOThlaDQ4VHNaMG9lM3ViSjJQeEJ1d1U4SEVjeDBFUXhIRWN4MUVVYWNqelhxOFhoV0ZvQUs4Z0g3WGI3ZmpHalJ2UjZ1cHFXVWl2VzBkZ1dNQURHemdtTDRReDJaZDVhaGVkeUoxWWRqM3JLRlgvdVhQZmVYNWg0ZXpadSs3NjhHODdEcnNiZ0ZMaXhYQlBUUG9NVzdaTTROcTFtMG1qZWwwc0hYc05qYms1VE96ZkE4ZDFTNTVCbjlNaFYyT2lXY1ZFczRaUUFOMllXZFB1TnFZVE9qZ1VRWFBJY29YSmd5b2NBdWdtWDE2ZG8wSzlmOWs4c05NeStwV3k4aFd5TUhFN2QwemlNeDk1QkU4OXVNK29ZK3FreGxMd1l6bW1lQnZ1R280TU1lZjQxeCsrZ1c4Lzl3YWlLSlpMNnFxQmMzM05wTk82V3RyWm1MLzFJallDWExXSksxTTVBOHdyWlNHU3RlY2RydndKSEd1cFdxYVhqUlp3SEJlTldzVXNSYXZmbENmVW5EdHBrdGZuSWhLb00yYm00OHRXcUN0ci9hMkppS1BYa3A3enFaUVU3TzI0ZkxEci9VcEZYSjJleHF1T0l3SWhMMW9lMUZPS25paHdRZEtURFYyWUoyOStvMENIcGVxdFRvTFFaWVhJTEYycmY0RFVLMTREUFdXVzF4OEZkVE0vWGhkVEs5OXhQV1V1am1PdUZyMFJ2dStMVnF0VjhBZVMreWtUMWxLMmI5Z3dKUTlna0pxLzA4M282MldLWHplVHZ1TzQ3ajMzL01MSDc3MzNrVStNanpjY0crNTZlVTd6OEZRUFRNNDVUcDY4a1B2eUdjZHpNWG4zWGFodm1VSzVma3U1VUcvVzVYUTVJYkRhQ2JEVTZzRVBTODZ4TDl1TWRmK3BsNml3YktmSHpsT1F0UmpvUllYS1FuMzQ4b1BBYnNjNVpFbmFuVnNuOGVtZmV4Z2ZlUHh3eWdNL0JYZUdWS2RVQTA5RFgvK1dIVlVPcE56clo2L2dLOTkrR2ZNM1Y0azZKK3FiS25lOTdTU2REUGtIeEJLenZJYTVreDR5MEk1OUp0MnlrakZBbWVXcnFGUWNVMWExT0hYT3lUbklpeWROOFNvdktaTkVDSzN2RUhZQytCMi9sQk5vMWxSdmR3UUVBQkdQalluWHg4YkVCU1FxMGw2MGhrNkhNOStXb2s4NTVCV28rOWphcDJDbkNqK21hZjJVZko2NVhpOXhxODMxV3NWSFVjU3BpcWRMMkZJemZiZmJqVHVkVG56anhvMncxV3FOcXM1SFZ2WHFlZ3dkTm90M1BWRDhCQ3p6Q08vMzlGeHIrZldxbzJ4ZDY0WWl6bVAreGh0Zi93ZkhXVHI5eEJNLy8xdUFOMFBYMkxiaHJyZGQxOFBXclZPNGNXTXBXMmNVWStuRVNWUW5KekJ4K0NBcWpjYWEyMWx2MXRCbzFxQ2x5OFJZRlJOalZYUjZJWlphdlFHcjU3RWhyOWc2a240UVBNc1U3bE5rSktDWGJWY3VuSXZxRU9tdElyQVhsVlA1QlFlMlREWHg2Wjk3R0QvLzNudmtXTFNCZFlGNU94ZnVKTjZDKy94U0MxLzZwNWR3N05RbDQyUnFWbnhUK2JuZ0V1Wk1yV2FuNUxpZWk4NjVzaVp3L1g1NFdZT2NQeThoTEZlMEV3YTJqdm9kMHBmUTFLb1ZhWlpYcjdxVnlsMjlnRVkxWGNndjVWTW45SjhBR0lobnZVcG4raHdZMUVvOUFyRWZ3Vy8zTXErWFRkMkZ2a28rMmRkSzN2UEU4dFNVZU5uelJFdXBkNlBLa2NEYUFNdFc4alNRc2x5cmJyWE5HV09GZ0ZkMVVhQlRCenVkTjZYa1Nadm92SGd1aEJERVJLOTdCZWIxc2ZvN0NBS3Q2amxWOGIxZWoydXYraUFJZU1FclpWT1hzOCtuVEZoTDJVellVTWdMa2ZLeUJ6WUh3TXZVczE0QUg2YXVvanBGbjdUY1l4MC8vdXpKQng3WS9iK1BqOS83aTBEejBTSzRVNlUvTjdjRmk0c3JpQXRlT2hPc3JHTGg1VmZSMkxFZDQvdjJ3SzJNUHJlK1V2R1FsU0FNelZvRnpWb0ZmaGhoYWRWSHEwdVVpam56RVgvN0E0dXR0VE1nY2pmemN4WmtHQW5vQlpHRlVGZnhCUjJEZExFY3NCZDFLS3pqVFl6VjhLa1BQNHlQLyt6OXFGVThwWHFScUdBazY3N1Q4V3oxZndKM2cvWTAzSU13eHYvMy9kZnh6WDk3SFhFczU3eHpKQXZYTUVjQVF2c0NNRUFJMDBTOUJyMStveHlFbWdLbllNN1ZXK0ZTcjVRbGMrdVltbExIR0lNcmdLcUN1K3RLMVcvVzQxZHZuV05xUHB6a3VweHdwMDdLcUhkaGdLK1gvTlZ2bzFPWFBZelJhM1VSQmNPdktKa29lUDJkM0xCNm5aK2RtQkNuQUJGekRzRmtZMU1ncDhBSEVxVU9NajBPeUZmeVNDdHpvY0VObllGTWIxUGJLVldQWkVHYmpKS25IUUVMNkZ4M0NHQU5CVkFGcit1aVM5bDJ1MTFPM3htL3ZMeXNGNys1VlNCZjY0TW5FMjYza2g5MFF1c0IzODJ1d29ldGsvVkpLd3huejU1YWZPS0ppWDhVWXVZY3NQVmpBR3NVT2VBNWpweE9OemMzWXp6dGkwTDMyblg0TjI1Z2JQOWVqTTN0QU5qd2MrdkRJSVRuMmVQOHlhblZLaTUyekRTeE5hNWp1ZFhEY3R2Zm9QZlk1d1hSZHplL3hFREtENmhzRktBUHFLOEl6bnFyc0ZOUUh1d0EwS3g3K09UVEQrR1R6enlJWnIxcVlLM3BiWHV0MjhyZEliOUw4MDNnRGdBdkhYOExmL1BORjdHdzNEWUwyZ2dtQWFyWG5RZFhjOXVobERwalppNDhCTWk3NFpWSm44czJjTTVWRzFnSy92TGxNc3lzWk9jNTBsTytYcTJZRjBQSk9oV2loYW9DZW5VN0RYRnlibXBzWHBEek4ydjg2MDVYSk9lOEI5MGdkVjM2aFR3bGJ6cHhhcDh4MFoyWWlGK3UxN0ZJSWE3QkNHVFV2STduSko1YitUUG1lL3BSOWFlMlFWYkdveDBCb3VJcHVFM0h3VHFtYldrd2NXRVljcTdHNHEzbGFyV3E1NXh6WTZiWDAreUlpdWZJLzhQSVhQWUJuekxCdnQ0amhRMkhQRkh6ZDVvWmZaaTZibVdkSTRVVEowNnNQdm5ra3pPZTF6b3BSSEFsam5kOEZLZ2VOdU9hT2ZQbjUrWm1jUDM2RXNLd2VENDdJQjltcTIrK2hlN0Z5NWk2K3pDcVc2YVRaV3l0d0hJdWllOUhhRFR5ODlOcVhNWXdNOUhBbG9rNlZqbytWdG8rZ3JMajlybVZqMTQwcWFKa0pRUEJTOUlLc3hRa0ZBS1paQ2dGOWFKNmhnTTdJRkQxWEh6OC9mZmpVeDkrQkpObUNpY0FrUEYzMnp5UDlENEFZcVpQT2dVNlhKMWZ3Zi96dGVmeDJwbkxaaXlkTTduUWp1TklzN2hjc0VZN3Y5RTE2SVV4dit2cCtUUWZGOW9rcjlxcFAxeFpIWlMrcmxZOE5Pb1ZaWjFRV0JiY21PUjFKOEFvZDJnenZ6RFdDS25vNVQveVNqSXdJV0hQR0RQcjFRY2RINEh5bXRlWFlaaG5mLzYwT1NacU5YNWhZaUkrNFRnSTlEdGRsQ2s5RCtwbTMxTDJ1V0FINlNqWTBOWnBqREVOK3hoSVQ2M1RIMksyajBrYlVndmZhUFpUWWEvZlVLZXQ5WFliZGFkQkNNSEpPTHhadWxhcitGYXJ4UmNXRnNxbytQVlM4K3ZHaGR1cDVOZERoUTl6SVRhRENsOUw2R2UyNzVjUEFORHRkdm1GQ3hmYWh3OGZubUlzYmxjcVY3N0srWllqY1R6MUljYWNKcEJudW5ld2I5OTJuRDE3dVZRRG96REN3dkdUcUkrUFlmcmV3MkQxQnVMTUhONmNadk1ZUVJpaGtsSHorYWZId0REVnJHT3FXWWNmUmxocCsxanRCRU05OFBxMlo3Z0tCa1VVcC9mTnVnYWdEMmhYbXVjRlVNOGsyZTNPZ2gxQ3p1TDQrZmZlaDgvK3UwY3hNemxtamFIbndEMW5EQjRnMENlL1NSMzhJTUpYLzl1UDhjM3Z2d2F1WDhUa1FMN1VSaXRVdGVpT0huUFhZK3RjV2FxWWtNUGFEbE53WjR5TXdjT016VE0xYnE5YUQwY0lNTWRSNCsxNmpqc2pVOUQwUzJnVTJBVWRha2grYjBhbnEydVpVdlFzZVUyVUVBSlJMNFJ2TFVlcnd5QWxYL1EzSWVUVXVNNzRlUFJLdlM3bUpmTVNzT3RBemZYcXB0dnFuSFlFVW1QcnBCNWpwcWRwV3JuckFKMm9yTzZrUDVCUi96bW1lcjJrYldaNm51NEVVTld1VFBSY085MHBoVzg2Q1dvOFhtaG5POS8zT1ZtK2RsQW8wd2tvWFk4WTVjRkd3b1o2MTZjT3pOaDZMZ3h6U3hlWjJZRFBoaHhyMjdadDFWLzkxVjg5NkxxdWs4eDA4SnBodVBWcHp1djM1NzJ0RG1BNGNlSThscFphZzI1cEpreHNuY2Jrb1FPSXEzWHdBWTZoalhvVmpVWVZnL3RONmFCL3ZWd0l0TG9CVnRwK1puR2QwcFVNbjlnLy84Q2lmVEtzV2ZrUEEzVVZQNVJhVDVkeEhJWm5ucmdMbi92WTQ5Z3hNNUVHZHhIY3pkenlITGdUTDNZYS91M0haL0ZYWDNzQmk4dnR4UHRkbTlpWkhuT1g5VkJ2ZXJPd2phbzdIY2ZNT3ZtWnRoa3ZmQ2pWWGtXdDZxVVd5Z0ZBT2lUa0hOWGZqLzVKNjNQVmlKZWJpVStDRHJxT3lBOFJ0SHFJaUxXS1RoY2NOaEJUdmFqVitMbUpDZjRHWTlKalhkVmJXc1dEQUI5RUhXT0FxVDRuemFoMEpDbysxdWs1KzdtTDRnanB3R2Y4Nnd6NXlWeDR6am1Qb2lqV0M5Nm9GZXpNK3ZSaEdNYktKQi81dnM5N3ZWN2M2WFRpZHJzZHo4L1BSeU91VVYvMEtWM1huUXo1MnczQmpZTDRSbllXQm40KzhZbFB6TjEzMzMxYmRDZkxjUnlITWNhaWFHeC9HRTUrQ0hBbnpZT0l5WWUzNzBkNDZhVlRoVTU0ZzhMazdCYU1IendBVWFraXBsN0E2a0ZWcTNsb05HdGdOSElOSVFoanJIUjhySGJXWSt3K3AveFFWUTdJWEFybUpIMEEwTTNld0hyN1FEMWJTV0c1ZXRYRFI5NXpEejd4eklPWTJ6cVpuZU91Zm5uYW01MHAwbW5ncFh4QmNzYmJkWGpyNmlMKzgxZitEYStmdVN6enFjVjFwSm1ld053QklDelFPeExrcVpmTHFPbDg2UVZ1WktQMG9qMWdESjdMMEtoVjBhaFhqU05kb3N4VlowQWs1NkwrZE5MblFOT2cvaEN0VG8wT2pBRnhFTUZmNlNJS1kxTkhXckd6VlA1K3dYNjh1eTVmSGgrUGZseXRpbVVBbkRFR0NuUVFzQlNwZUpJbkJXMGFuNU5tajcybkZEcUpLd1Y0Q25rQ2Q1TkhSd2hscXRmVDUrenBjcjd2eHhUd1FSREV2VjR2N3ZWNlhLdjQ1ZVhsZUhGeE1iYXZrZlZaenc0QTdTeXRHZEMzRGZLQUFmMjdBTi9Bei9UMGRPWDNmdS8zN25aZDEyVXFBSEFZWTB3SXB4b0VVKytKNC9valNaSjhXRjI1c29qVHB5K1d1YTI1Z1RGZ2N2dFdUQjNjRDE2dElZbzRoQkJvTm11bzFtN0JxSkVBaEJEbzlFS3NkZ04wZXVGSTV2ekN5a2ZLV3FaY1A1aG5FOHFwZEpVMkt0UXpTUUl6VTAzODR2c2Z3RWQvK2o1TXFESDNQTGpUZWVaNWNOZnF1d2p1VitkWDhOZi9lQlRmZS9GMEFrdEdWTHVLTTNQY1dmcU5ka0I2WHp2UkpaMEFmVnltbHFpVlF3NzFxb2Q2clpwNkc1dzh0bjZ4akhUQWcrNDhJSW5YNTVMRTZYMlk4emZYUXA4b0EzZ1F3MS90SXZTanRGK0N6a0wyUjFEeWNiMGVueHdmajg1QUFVUURuc0k4UjhXblZEN1M4REZxbkpaUmNDMEVQbFh3VmgzYTVKNm42QWNDWHRlWnQ2SWQvZFp2bDlNcjJ5bkF4eHI2dlY3UHFQakZ4Y1Y0WVdFaDR1UmxPbXY0RE4wUldBL0kzMjd2ZW1CSVhhVENvSi80ZWp6Tnkvd1ozYjRlMG9oaGFXa3BQSEhpeE9Lamp6NDZDNWlPRnJTZ3IxWmJQNGlpOEt6dlR6d2poTE5WUDZUMjdObUdtemRYTVQrL1BOSnhoUUNXcnkxZzVmb2lwdWEyWWV0ZEIrQ1paWEw3WE1ZMVhHSEdnTEZHQldPTkNyZ0NmcXZqbytPSGZSWU5LUm42QVhPWUN2b1dXd1BRYzdQWVVDK3FwN2hEY0dEWERQNjdEejZFcHgrL1N5N0xtZ1AzckprK0RYYzYzbDRFOS9tbE52NzJIMytJYi8zZ09EaVhMN1JoZXJ6YjBYUGY1UnZzbUNEZThXQ0E5YzUzUGU3TnBjdTluQmJIUWJ6cEJSem1vRjZSVTkrb09WNVBmNU1kQm5rTmhOQno1eGtZdUh3VEhmUlVONWxCbjVQUTI1QWUrYnE4N0FESWM0K0RDTUZxRnlGZFNwcDBIS0N1blg3ZVN6am4zTGFDNExwOGZtSWlldG56ZUp0TGZ6NE5lRE1PVGdGUHdHTEd0RUdnVDdaem9VL3prSEh5RFBndFphLzdCaWFka3lsME9nMUl6WjJQU1JzR0FsNzNGb3laUUkyL0IwRVFCMEhBMWJpNzZQVjZ2TlBwOEhhN3pWZFhWMVh6VW44SW8zNEdoWFVIUElEYnErUUJBNW1OVnNkM25BSmZ6OC9FeElUM2gzLzRoL2ZWYXJXS3JlYlZMV0VBYzMxLy9ORXdyRDhHTUk4eGhqam1lUEhGazJpMXVtVnViZC9BR01QMHpsbk1ITnBIWUorYmM4M0hNa0g5MUxrUWFIY0R0TG9CdXIyd0NLVnJQMUNwNnJJWnN2d2RCZWg1N1NpcUoxK3Q2OEFZOE5pOWUvRExIM29Jajl5ek8rV3ZrWml0Q2VUWEFQZVYxUzcrNXBzL3hOZS9jd3hoTE0zVmNzemNXckV1cGVMVGNZQWRsKzU4MEhIOFJyMkNScjJLZXNVekw2Z3hiWWFsM3ZYNU1YcXU2ancxakJYTU04cWQ1bGZiUEl6Z3IvUVErc2xpVHhUcS9aWDg0TDhMeG9UZmFFVEhtODNvdkxxaFJyV1RHMXlrSG1sSElCVVBhOXFjQlc4RGZxM0tkUjRDOVppbVc0cWRxbndOK0pTQzEyWjVYWmVDZW9yeEFJWWFoODh6MDYrc3JNUUxDd3VEelBUcm90ajczSWMxaDgwSStYY0N4RzlWKzFBMjc4Yys5ckh0NzMvLyszY3J4cHZ4ZVhWTEdCVDBPWGZIdXQyeEorTzRjaGdBOC8wUUw3eHdBcjdmYnhXNjhvRXhob25aYWN3YzJJZmF6SFJ5Rm1YREduKytNUmRvOXdKMHVpRzZmbGc0OVMvM1FLV1AzUWZrcVoxQkZaWUV1dGtkQnVyWmlJcnI0cG1mT294UGZ2QWg3SnZia29HN1BZWnV3ejNseUluK2NHOTFmSHpwbjE3RVY3NzlNbncvekVCY3c1cUNIaXc5TG0vU2pOT2VTRG5qQWN5WTRodjFLbW8xRDY3VitVZzZMVXA5RjhHZFhBdXR1UFU1bWM0QkZPQVoxTGk5ekJEN0lmelZCTzdtdUN5NVhqcFE2TnR4ZlFLdjFlS3pZMlBCRzR5SlVJUGRNczhEWkV5ZW11a3RSWjlyd2tjYVJDbWxqb0xsYmFtQ0orbkdiRS9CTGl5emZCbkE2enlEVFBUYVRLODdBRUVReEsxV0s2S0FWMVBtMXN0TVAzUW5ZTDBBRDJ3Q3lBTkRnMzR6QW53enRRbGw4am1Pdy83b2ovN28zcm01dVltMGdrOHBlZ1A5S0twdTczWWJUM0h1enE2c3RQSENDeWRHZHNRckNzMnBjY3djMklPeEhiUGFQcnF1WWRCUFhVRE8yZS80Y2d4LzhCejg0Z29MUkhIZk1wazhoVm56Z042dmdCaXFZekE1VnNmSGZ2WitmUHo5OTJONm9wRUNXdTRjZHdKM0RXYWdITng3UVlpdi9OTkwrSCsvOFVPMHV6MjF0ajF4bURNZEJnSjY3V2lIUk9FRFNOYkdKeXFlUWFCYXJhQlJrNmI0YXRVejhFMGM4UWlZbVlTMnFWUG5nYzZyem9WcHJXNk54UXMxVmsrdEJ3QWdCS0pPZ041cUQzRVVBYW5PUW5KUlVwMkZIT2pUZkhuQjgrTExZMlBCTWMvakxTaXc2MjhOY3cxdHJkUjFIaERBVUxEYjhOYWRCcUxVYmZCbm5PNm9xcmVoVHFDZkdvTzN0MGNCdkZDT2QwWGo4TXBNSDl2ZTlEZHYzb3c3blE1ZEh2ZFd3UDZkQTNuQWdINHp3WEl6dFdYWUQ4cmsyN3QzYi8zM2YvLzNINmhVS2k0STNQVzJWdmJxOWpER0dPdjFhb2Q2dmVwajgvT3RzUi8rOEkxMUJ6MEExQm8xek96Zmc0bmQyOEVHTEpjNy9NKzNmSUVvNXVqNklUbzlxZkpqMjFOL2dCSXUzWmEreFVZQWVtRnlzZG9YQUhadm44SW5uM2tJSDNycWJyTzRDd1BTMDlrSXJETmo4RGx3cDlDaUlZeGkvUDIvdklMLysycy93T0pTMjVRM3IzaFZDanJ0U0pjQW1IclVhMDk1cmVKZDEwR2pXa0c5VmtXOVZvSGpxcnBOZTBtYlRhZEN0a3V2Z0pjTVB4QkZud0t5c0N3VlJMbVRhd0RPRWJSNjZMWGsrdkwwV2lXV0FOcW05TVVxbytTbHBZSXZOeHIrSzdWYWZGMDMwRkx1QnZnZzZsekY2VC9pbE5va0hZRkNCViswYlhjQWN0UzhyZVFwL0trRFhsL0FnNWpsS2VBVjNQczYyaFVCZm5WMWxhK3NyQXhycGwrM2pzQjZBaDdZZkpCL0Y5NGJEUHBQZk9JVGN4Lys4SWYzNjA2V0k1OWNxZkY1dloxQW4xWGE3ZHI5VjY5Mmp6ei8vQWt2WE11cWMzMkNWL0V3dlhjbnB2YnNoRnV2WlRQa3dLTjBLQkszTklNVi9DQkNONGpnK3hGNlFRNzArOVV4RE1oVFVTV09VUWJvSmtwa1VoKzZleGMrK2N5RGVPcUJmU21ZS1hHYVVlS0pPVHVCRTBEZ1hqREhIUURpbU9PYjMzOE4vOWRYbjhPMWhaVlVXM1hkS2RDenhDcytxL0RsTVR6UFFhTldSYTNxb2w2dG9GcnhnSlFYdkRUZG13Y2UzMG9BQUNBQVNVUkJWUEwwWEN6RlRjRlA0WjZjdjFMcDVud1Q1VTduekl0SWVzcjdiWjhzaUpPQTNWYnN5YlVhVHNrekp2eGFMWGk5MGZEUE1jYTRTcU5RQjlrMjZSVCtLZzhuM3pTT0tuc2c1MVd6OXJhR3RvNG5pdDZvZFpXUGpzMFh3bDVCUHFicFJRcGVLL2M4d0hQT3hhQngrRmFyeFJjWEY2Tll6dlZkNzgrR211bDEyRFNRQjdCVzBMOVQ0RjNtZzdKNUdXUHNULzdrVCs3ZnZYdjNGQlRjTGNCbnh1bDEyVGgyeGk1ZkRoNzQ3bmRQSGw2dk1mcTg0RGdNRTdNem1Ob3poL3JNTk1xc2o3L21sZXo2MUt4REdISDAvQkE5UDBJdmlCQkcvVG83L1VCZWtKNlh1VEJiZWFnRHdJNlpjVHp6NU4zNDBKUDNZT2ZzSk5UTmhURXpBeG00bTNRazBJTEsxMitPT3dBSUFmeno4eWZ3bi8vdSs3aHc5V2E2UmFTZFJwbXJ1clJhcG9xK1ZxbWdYbk5ScjFWUXIxWlFjUjBJYlFWUWpVdk03UnFpeVhtbDVzdFRtSU1wTDM0Q1hoV2ZkQnBVbW1wK3lud3ZCS0p1Q0wvVlJkaUxnSlFGQUxBQlRvR1B6RFhWRnllOVQ4RE5LNVhnZEtQUk8rNjZTSTI3NjI4TDVxYWNxaWNYTWtxNTZ5bDIxRlJQUWE3VmZVYkpVN044UDFPOXBlaU5XZ2Z5bmU2b2toOEc4RUlJVWRiUnJ0VnE4YVdscFRnTXd3MDN6NU5yL1BhR1BJQTgwTDhMNzFzQWQvclp2WHQzL2ZPZi8vekQ5WHE5cW01QlpseGViVE9BS25vNGpERmN2OTRhKzRkL2VQV3VJS2pjMisvZXJrZW9OV3FZMmpPSGlaMnpjT3IxdFZjNEZHajdoNWh6OUlJSVBWK081d2RCak5oTXZ5bGI5d2d3VDBVWGRXOEVtclVLZnViUlEvamdVL2ZnZ1VOenhDd09GTUc5YUoxNVlQQWNkeDIrLzlJWi9KOWZlUlpuM3JxUmJqK0JPNDJrWSsyZTU2Qlc4YVN6WEsyQ1dxMlNXdUJHQTlaaGtLQkhBc3UwYzE0QzFpTGdRNlNkQlNXQVJkcVVMb2hKWDErTE1JTGY2c21sWjdrQWtBd253THBtTnZEVFVLZkhocm1lMXI1dzNlaDhvOUY3M2ZQaVZRcHd2VTJCejNLYzdvZ3F0d0dmVXZnVThFaURXeDh6dFFZOGlIclhaY2k0ZXdyeUd0ZzZyZ2oyeEZ4ZkN2Qmt1ZHFZTVZib1NSK3JWOGhTTS8zUzBsSzhodmZFYjByQUE3Z2pJUC91cC84SDYxSDJ5U2VmblBxZDMvbWRoMTNYcFFCWHo4YTBvaWYzeU9RSnc1RC8zZC85Yy92eVplZG5hclhKZTRydTczb0Z4MkVZM3phTnFkMDdVZDlhVHQydkZlTHBhc3JWRlhPT0lJemhoeEhDTUpid2o2SmtZWjYrMWZRRGVyNUNUNVZUUUhyMDNqMzQ0Sk4zNDcwUDdWZUx1MmdGQytUQlBiMkFEVkp3VDh6YUxKV1dhWUVBbm52NURQN0wzLzhBeCttN0QvcUF2Vkp4VWZFOFZDc09xbFVQOVVvRnJoNTcxOVBiNkRGWjJycFFyTm9UaDBEWjlnUzI5SHpNOVZCNWt2cDFoNEtVRjBEWThlR3ZkSldYZk5iOGI4ZkJ1bzdReHlIWE1BLzZLbDU0WG5paFh1Kys1cnJSc29JMUFBalo1MDZOdWV0anBLQk4wbE5BRjBMQTJrL2xnV1ZtMWdGWjhOUFY3VFRzVGJvR3RXWENUeWwzQ25RS2VKMm1vRzdHNHNuNHUxbkpUZ2pCYlUvNklBaGl6amt2R29kZldWbmhxNnVyRzcycTNTMEhQSUROQjNrQTc0SitTRUN2VjdsZi91VmYzdm5KVDM3eVhxcmlMYWhUMkZ2ejZ1WDM4ODgvZitFclgvbXVNenY3MEMvVWFoT0hDbS95T29acXZZYXBYZHN4c1hNV2JxTXhRZzNyL1RkQTFIUnUxUUpoeEJHRTBzUWZ4VEhDaUNPS1lzUXh6eW5iRCtncXhVcmN2MnNHSDN6eUxqejl4TjJZbVd5U01mUjh1T2NCZEJTNCswR0Viejc3R3Y3Mm16L0VoYXVMcFBuU2RPMjVqdng0RGp6SGdlZTVxRlk4ZUM2cFRBQm12cmtDTkFTU2Vld1VwbGI3elR4NWVrNnF2WTQ2THlkMVBqSU5hbmxhT0hvaEczbzlFcE0rRHlJRXExcTE4OFNxNFZnTEF3MkFQZlN4TXdvL3FVUEhPMDU0c1ZicnZGcXBSRGN0c09lcWQvV2RHWk1YeXBQZUJqb2pwbnNOZkxXdHA5amxtZSs1RU1La0NXdDhQay9kMjJaN1hjYUN2QTE5VG9Ld0FVK2Q3SW9BcitCZTZHZ1hCSUY0dTB5WHl3dWJFdklBM2dYOUNKQmVqL0ovOEFkL2NOZFRUejIxendKNGFoNDlpVTk5Nnc3QXRXdlhWdi95TC8veStQeTh0MmZuemtjK1hxMk83Uys0emVzYUdHTm9UbzFqWW00YnhtYTN3S210Z3prZlFDNWVSZC9VL21VTGsrVk9HRXZnNis5SWZjZWNJK1ljUE02dmMzcWlqdmMvZmhjKzlOVGRPTGg3cTFuQ2xTcldGTnlKZzV3TjkySG11QVBBNG5JYlgvMzJTL2phZDE1RnUrc3JnQ3VndXk0ODE0SHJzdHp6VGU4S3N5T2htNENlRWRVdWdaNEZ1ZWtVTUdxUlNJK05NOGcwT1k2dnp6TVA3akt2aURqQ3RnUTdYWEkyVldkSjJLdGJNQkQ0QU9DNjBlVnF0ZldLNTRYekJPb1pzTXRqbXB0Q0FXOUFRcUZ2QTk2Q3QyMnVCNnl4ZDlveElKRFhJYlhpSFFGNWJPMFh2WndtRi9MS2d4N2FWSjhIZUQwR1h3YndZUmp5RFhDMHUrMHFIc0RtaFR5QWQwRmZFc3pyV0FjY3gzRys4SVV2UEhMbzBLRlpkUXNjNno0NDZrSERjdEwxTm9RUWVPNjU1ODcveFYvOHhia3RXKzQvTWpmMzBDOVVLczA5K1hkNi9ZUGpNRFNuSmpDK1k2c0VmalhITzMvSUlQcnNsU3Nvc2xIOUNoUm1FaEwyWE1CMUhEeDQ5MDY4OTZHRGVQRHdUcml1aGt3QzZLeHFseEFEUy9MWUVBUkx3dzdtT3gzZXVyS0liM3p2R0g3dzQ3T0lvc1F4TzNXbW1mT3dlMGdpblVhS2FFQ0QwU2x3Q2RqMXZIb0RlZ1gyakdvbjV3L2RFVkFkQUVDUHhiTmtuRCtLNGJkOGhLMHVBbVdPMTBNRyt0cm12YlV4cmN6enpQUTZqODRIa2cvcU9PSFZXcTN6WTgvenI2bS9KNUhVeHpTWWRid0JQbFh4cGphVlgrM2FjK0xOdHEzcXFZcTMxVDM5em92VEFjUVpqK1RQQmJ2YXRzZmZ6YmVPajZKSVVQTThWZTVsQUI5RjBkdmUwYzRPbXhyeUFHelEzMG9uUE56Q3VtOVhtOHFVeitScE5wdnVuLy81bnorMmI5KytiVnJKczBSMm1HbDI2dll3K2cya0ZmL0t5a3Izci83cXIxNy81amUvT2I5bnoxTVBidDkrNUVPMTJzUmQyTURnT0F4ald5WXh2bjByeG1hbndTclYzSHhEL1NYMEExZXB1c3FhQXJLSlUrTjEzSGRnRGtjTzdjQ1JnM05vMUNzRTZFZ0FEaHMyeU9Ucm41WkF5dzZ2bnJxSWIzejNHSTZkdW1UYXVGNWdUMjBKRFVJRlZ0TDVrT1BsZ3BqZjgxUjdBbndUYjg0UjZlbCtvVkxzWmpVNkFWaHdUM3dEMHZ2bStwV0V2VXhMNVJPT0UxeW9WTnF2ZVo1L1hkWXR4OXFWVWhla3ZoVDA5YVVpKzZsdENtbDF2TXhVT3ZWTkY4ZXhGNzVKZFFiUVp5d2VhUk45cGhQUUQreGF1ZWQ5MHpYb2JkUDhJTUJyUnpzSytPWGw1VGdJZ3JjMTRBSGNjWkMvVStCNk80ODliUG5jL1BWNjNmM0NGNzd3Nk9IRGgzZW8yNUNDT3QxV0liTndEdGwzTGw2OHVQamxMMy81OUxlKzlhMzUyZG43OXUvYytlZ0h4OGEyUG9weUhuUHJGaHlIWVh6TEZNYTJ6NkF4TXdXblppdjgvTCtINGY5S3lrSjhRQVlCdUk2REE3dG5jT1RRSE80L05JZGQyNmVJbVhsNHVGTXpmbDRkYVdXWmhEQ0s4ZHpMWi9HTjc3NktpOWR1V2kxZlg3RGJsV25WcnR0UG9ROVFwenQ5UG1sMWp4VHNWUjZCeEJTLzJrUFFEWWl5WnRhMnZaOXNBK1ZnbjZTQlhIOFJ1YTUvdWxKcHZlNDR3UW9GdTZ3M0JmcFVHbkxBcm81aGdLejM5VFl4MFJ1Z1U3RFRQR3BUYjFNSHVveTVubTVyazcyMUQycUsxelJYMjhicERuSzhuVnZmc1JCQzJJNTJRZ2dlQkFFbndDOE5lTi8zUjFudzVvNERQSURORDNrQXR3UDAyT0RqcmZXWXc1YnRsOStrVmF0VjU0dGYvT0pqOTk1Nzd5NTFHeHg2UDFoMkRyMHB5d29jOHk1ZXZIanp5MS8rOHFsdmZPTWJOeVluZDgzczNmdWVaeVltZHI2WE1XZnQ5dlFoQTJNTTlmRTZtbHVuMFp5WlJuVnlESERjUGlWRTM5M1M1Zm9teTUzcGlRYU9ISnJEZlFmbmNPK0I3YWhYSzMxVmR3SnZLNDFSYzd5TUxBTitHbGJiUGZ5M0h4ekh0NTg3anVYVmJoK3c1MTJmY21BSDh1Rk9selJrdXAwTU9hYjdaRHFnK3JXUmMwL2lIQUdFYlI5aDI0ZmY3aUVPSXd2aytYRFg1bnpHYkROOWtsZkhwYWZocGZNbCs3enJPSjNqbGNycWNjYmlnREVtQmdBK1phSW43VE1nMTkrTXBjMzFCT3dHTWpiMEtkaFZOTFVFMkdxWGVzWUQxdFM1b20rdDJuWG9wOTUxT2dVNi9WYnEzU2o1T0k1Rm5oZjlPeDN3QU80TXlBTUpXRGJvZ3p2Z09NT1dMWk0vazhmelBPZUxYL3ppSXc4KytLQjJ4a3VOMFZPQXM3U2FCMG5QVEw5YldGaFlmZTY1NTk3NjBwZStkR0YrZnRYWnYvK25mMlo2ZXY4SFhMY3loZHNVUE05RlkzcFNRWCtpeER6OElmNTIrc0VROGgzbWgzWnZ3NUZETzNEZndUbnMzRGFaZ1RTZ2dLV2dicHZVTTNBbmVaQUQ5enp3MDNEbHhqSysrYjFqZVBaSHArR0hjbkdYdm1yZDdQWURlem85Rit4SlFpWi83bmc3MG1aNjJna0FBMFFRSVdqNUNGWjdDTG8raEJBcHN6c0ZNM1djeXpmVFo5T0tZSjhGT3dOajBSSmpyVmM5Yi9rMFk0aTFRcWZncHVaNUFud0Q4VDVLWHVmUmFmYTB1aFRrTGJERDJxY3cxOG0ybDcwTjhZeWkxOTlVd1NQdFZDZUE3UGc3bEpLMzRFN044a2E5YzdLU1hSUkZvdDhZL0RzTjhNQWRCSGxndzBDUFRWei9NR1hMNWkzS1orSVpZK3lQLy9pUDcvL0FCejVBcDlmcDcwSXp2VTR2QUQ0WVl3N25YSnc2ZGVycXQ3NzFyVGUvL3ZWL25OKzU4NmNlMzdidDdtY3FsZVp1M09aUUgydWdPVE9GeHZRRWFoTk5zRnJPV1A0ZzZCVUUxM0d3WStzNER1emVpdnNPenVIdWZkdFJxM29BNk52ZEN1RGVCL3pabGVjc3VCZWttZFlMZ2RkT1g4SS9mZjkxdlB6R2VhU1dQc2s3UjVFVE53RHNNcTA4Mk8yT0EyTnBNNzJ0MmhIRkNEcyt3bllBdjlWRkZNWVppS2Zobml4ZVE4RnZ3enU5RHpDVzFKVzZ2cm13RHk4RHk2ODR6c3A1MTNXRStsTVJHdXE2YlVTMTYvSVpoVS9oYlUybFMwRmZIMStiNDFuYWt6Nmo4clZKM2U0QVVKTzlWdTU1Wm56TFBHODZBblFNWG45cnFGc3Eza3lSMCtaNThzMXp4dUc1TnMvcmhXNDQ1OXozL2JqYjdZcDNBUy9ESFFWNUFMY1M5TGhGOWQ1SllPK1hoazk5NmxNN2YvTTNmL1BKV3ExVzA4RFdBRmVmekxLNHRJNjhOSnFuMiswR3AwK2Z2bnIwNk5Fcnp6MTNvbHFwN0hseWZIejdZN2ZEbEc4SHhoaHFqUm9hVStPb1RZMmpQamtHdDE0ZjhMWTgrYmRWclhqWXRXMEt1N1pQWWZmMmFlemVNWTJkMjZhTUo3d0JnNFk0S0RnMGxQdWtPZmFZdXR6UkFPOEhmaDB1WFYvQ3N5K2V3dmRmT28zRnBYYnVlYVIzN2VlR0RmWnNtWHl3MDd6RllMZXJOWEFWQXNJUEVYWjhCQjBmWVNkQVJFendhY1dPUHZFSnNLbTVQVEhUSjZyYWhqMVFwT3hGRDJpL0FTeWRjSnplb2xidHluRlZhS2dEVXFrVG1KdDBaaWw2bGxYeUdhOTYrcTIzU2J5OXJLMitxaHIwcWFWcmFaenVMQ0JaN01hQTNPb0k1STdINjMxaWtqZkF0OVc3QXJxdzRKNXlzTk1LWHB2bjdaWHNvaWppclZhTHY1TUJEK0RPZ3p5QTlRWTkxckd1OWFwN21ISmw4L2JMVnpydHlKRWo0My8yWjMvMnZ1M2J0OCtBUUpvb2Ruc3VQWmcxRGMvZXpnTy9FRUpjdW5ScDhkaXg0L09uVDkvY2VmMTYvTURxYW5UYjFUME4xVm9GdGZHbVZQcVRZNmlPTlRBKzBjU3UyU25zMmo2TlhiTlQyTDFqR3JOYnhsTmcxdEJnVkpFekpOc0FTZStmcHE5a0FuQU5tZjdnQitSWSt3OStmQmJmZS9FVXpsMjRRYzRzRCtwMnZEQmY2d2IyVEZvMm5rY2NZVmRPYmZOYkFjS3VieGFsU2NOYnEvWTBvSXZOOUJyU1Jhb2VKRTNmaHl6c0plajhTOER5NjhETnM0eUpXTVBjQnJyNjZWUFlDeHBIWUoyQ095T3FQUWY0R1JNOVZldTY3UnJZV3JtVHEyeFV1UWE2eXArQ09kMkhCSHRHemR2Znl1U2VpdE5RUjRGNkYwSUk4dTczaklsZWpjR0xQTUMzMjIyajRKZVhsMlA3SERmcWN6c0JEK0RPaER5QTlRSTkxcUdPelFyMlFYbjZwZWVsbWJobXMrbCs4WXRmZlB5Sko1NjQyNzRQRnZRejhYbzdCK3dnNmJZVEh3UEF1dDJvZHVIQzR2U2xTOHM3cmw5ZnJ0eTRzWVJyMTVadzgrWXFOdXAzekJnd050YkExTlFZcHFiR01EazVoajE3dHVIQWdUa2NPRENIclZzbjRiZ09tT09ZN3hRazVCbXBFNlBiRmppUVRjc29jcnB0eXZhSGV4UnovUGpFVy9qZWk2Znc4b20zMUt1Q3kwQmQ3UXM3MWxiZmVuTVF2QWVvZGk3QWd3aGhOMERZOHhGMEFtbUNEMEsxUG56Nm5DbThLYVFId3oxdHZyZFZmUjdzNmI1dUF4QzNnZFlKenVkZkE3ckxHdVNPNHpBOW5rNlV2RG0yNHppWnNYamI4VTZsbVpPMk9nQUcrQlRXR3VpTXBVejMxUFN1TDdvOURxOVZmR2I4blRFbWJITjlBY3gxS0RUUkswVVBHcWNCbjZmZTliWjJzS01lOUp4ejN1djE0amlPaFY3SkxneEQzbXExK01yS1N0enI5V3pIUVZqN2IxdkFBN2h6SVE4WU1td0d1STlhM3pEbHl1UWRsS2RmZWxGYVhqd0FzTTk4NWpPN2Z1TTNmdVBKcWFtcFNRcHU5Y21BbXVWUHc0UDZkcXg5VnZRdEJGemZGOU8rTDJiaUdHTnh6SEhqeGhLdVgxL0NqUnZMOFAwUWNSekwxZUtpR0dFWW0vMHdqQkZGRWRtT0VZWVJLaFVQazVOTlRFdzBNVGs1aHFrcHVhMUJua0M5cWN6c3lRT2VtblR0aDc5V2tZN2pnTGtNRG5Pa2VkMHlGNXZ5c3FDQk8xT3dMb0o3NmxqSVR3T0FzeGR1NE5rWFQrRzVsOCtpMWVraUZRWkFQWjFTMUNFb0FqdmR5T2tRQ0FFUnhZaTB5YjByVGU1aEwwRFU5NjErU2RCZ1R1RHVxT3R1ajY4WG0rOHArTzE3Mm1kNkhCZWllNTd6eFdOeHZIRFdjUklUUElGNUN2YjIrTHRLWnptZTlSbWxUc2JyaFJXbjIyYXZVNi9CenVrK0NOdzFoS3g4OUFVem1RVnlZTDJZaG5ZQ2JMaHI1WjdUQ1VpWjdmVjR2SjVLcDFhNE03QVgxdmc3NTF6MGVyMlVCMzBjeDV3dVZidTh2Qno3dmo5b0hqd0dwTi9SZ0Fkd1owTWVNRlI0Rit5M0h1eDU4WmlZbVBEKzlFLy85S0VQZk9BRER6bU80K1pBT1RYdExpZk5nTjFLc3pzRExDOHY1Nmo1dnBnS1EweHhqbm9LbUFVS1RMVm40SXBsV1hnbjZmbkxsNmJMSnVuNWRUT1dobjBtYmlTNEo2cDljYm1OWjM5MEdzKytlQktYcnkvQmhINVFWMStGYXQzYTdROTJWVkhNRVFjUklqOUVGRVNJL1VCdSt4R2lJSlRyOWEvRGMwamZFM2tkazIwZ0MzYzZ2dDVmMWRQeUFHTk1jTjY3Rk1mTEo2UG8raHVBMzlhUTFsRE8rZGhtZUZaR3dkdmo4QnJ1MWd0cEN1RU9wRDN1YmVDcmJUcG5Yb2prWlRXWmRldXBTWjUwRURMQXQ0QnVMNHlUQWJ3UWNweGRwNFZoYU1Cdk85anA4WGZ0WUtmaDNtNjN1VGJSRHdINFd3Yjd6UUo0QUhjKzVJRTBRSEkrNkpOMkt3RTlhcmt5ZVFmbDZaZGVsRFpNdkIySHA1NTZhdXJ6bi8vOCsvYnQyN2ZiQmozZDdnZDJ2WjFUSGpUT1N0ZkpMSTVSQ3dJK0dVV1lqR1BVOHVBK2FORVNPalpydzUzbVQ2ZW55eGJCM1Y0dHJhanVWTHBadTEyVjAvbFZPbGg2anJzZlJEaDY3QnllZmZFVVhqOXpXY0pUQUZtZ2s3Z2hvQTRBSXVaS2dVZUlZdzRlUnVBUlJ4eEY0RkdNT0lyQmd3aVJBdnQ2UWJ4TTBOQWVCUGVzeXMrL0R4cU9uSGN2eC9IeUcwRnc5UTBodWlzbHdHNlB3eHZZMDNudlJMRWJnTnZBejRON1Rsd0s1a0Jpb2dkUjdqcE9pR1NjWHZrMFVIVlBWYmtnMjBiSmEyQXo0bUZ2QTExdlUvVU9RS3YwRlBEMTJMeXQzb01nRU5vMHJ4aWZHbitQNDVoM3U5MjQzVzdIWVJqeTFkVlYzdWwweEJwWHNzTWF5bTRxd0FOdkU4Z0R1YUNIdGY4dTJOY1g3SGx4K08zZi91MzluLzcwcHgvZnZuMzdyQTFyK3g0VnBkdncxdDkyWjBCbnlDc2J4NmlGb1pnSVF6RWhCS3RtNEpsNWtPdjA0ZUNlenFmVDgrc2VDdTQ1ZGRQMlVTdkQ4bkliUjQrK2dhTkhUK0FITDd5QlhpOEFqQ3FWd3dQUVF3UmdhajlaNDE0SUFjRUZ3SVhaRm9KRHpYNVcrd0lpNXVBeEI1Y3ZDc0ZtZlhSbzBOUHIyRytLWEo2cVo0eUI4OTdsS0ZvNjBldGRPaDdIcldWdGNuZGRsem1PQTlkMSswR2VBWW41dnNDVFB0TVI2QWQ0RFdMSGNSaUZjdkxua3IvS1hSSGNOWXcwcUFGa0ZzZkpVL0xxazFId05EK0Z1d0s2V2NIT1V2TkNLM2RidmR2ZTgxRVVDVzJlMStQdjFNRXVDQUsrdExSa2U5QURhd0Qyc09VM0crQUJ2SDBncjBNTzdFZjk0QmFYS1pOM1VKNSs2VVZwYTQzUHl3ZDcrN2QrNjdmMmYvYXpuMzFpYm01dUI4M2JEL3dEd0oyWHg1NkR6M0wyV1J5TGFoaUs4U2pDR09lb3BoLzJhWGphRC9yMWh2dm9Rd1FKcURnWE9INzhQRjU0NFFTZWYvNEVUcDU4SytXTTltNUlybS9lT0wyK3ZqbXFYbkRldmVUN045L29kQzY4SGtYTFM2N3JNdGQxalFxM3dHN0cwOHQ4NUxIeVllKzZMa0JNOUdTZlFVR1dtdTl6NEo5S28zRlFZK3kwUTZEVk9tUEdKQStkUjZjUmhaOXl0TXRUK01neHlWc0tYbysxcDlJbzBFWGlYSWN5NmowSUFqSEF3VzQ5RmZyQXNwc1I4TURiRVBMQW1rQ1BXMXltVE41QmVmcWxGNld0Ujd3ZE55Z1BBTEJmLy9WZjMvZTV6MzN1aWQyN2QrOWlPWTUzc01DczhzRE9SektaTjkzWmVSejlCRThxTmNWMFhpSGdSUkVhVVNRYWNTenFBSFAwdzUvQzFvWTdWWHQ1Y08rMzFPbmdJWUxpMTVQcXo4TENNbzRlZlFQUFAzOENQL3poU2F5dWR2QnVHQnpvT0gzU1VVcXVyeEJ4S3dpV1Qvdit3dWxXNjYwem5IZDdudWRsQUszaXlnTGRPTm5sS1hxV21PcXBjczhBWG4ybjBuUit4akxtZVNBQnVVbXo0NHFVdk1oT21VdE5zZE5lOVJUc0d1NDZ2dzEzRGU2OE5KR01zeHRWSDBVUnAwR3JkOXQ3WHF0M3RZeXRXRnBhaW4zZjMwaVRmS2JzWmdVODhEYUZQREFVNkZFeTM3dGdIeTBQQUxCbm5ubG01dGQrN2RjZWVPeXh4KzVyTkJwajZ1SGtDT25vUTZmYnBlNmREbnJiem1OOXc0NHJpTmY3VGh5akdzZWlIc2VpemprcUZONzk1a1FQV3UzTUJya2RsOWVSb0hYSGNZeGp4OTdFMGFOU3JaODlleG52aHRHQzdvU3BleEZIVWZ0OHI3ZHd1dFc2ZUtyVnVuVFZkUjN1ZVI2amdMYjNGZWo3UVY2YjhxRUFMZ0FKN0J6MVRnRnZPZ0VxdjZEZnVnT2c2d0xTem5XMnVtYzVxbDU3eU9zT2dSMlhwOXhCZ0tiQnJEc0RWcnlCdHE0M0QrZ0s1RkRqN3pHRnU1Q21mQkRsYnB6cnFIb1B3MURRNlhFRjV2bFJBRDVzL2xUWnpReDQ0RzBNZWFBdjZGRVF2eDVnWDY5OC9kS0wwdFlqM280YkpVL1JQcHJOcHZ1N3YvdTdoei82MFk4K2VPREFnUU9PNDdnZzRFVVczSGtRejUxSFQrQ2RLbFBRYWNpb2ZTSGdjSTU2SElzYTU2Z0tJWWNEQnNONzdYQjNISWFyVjIvaTZORVRlT0dGTi9Dakg1MUN0K3ZqM2JEMkVNZitZcmQ3ODFTcmRmbms0dUtwTTV6N1BjZHhtT3U2d3ZNOFI0TlhxM1hYZGVsK0x0QTl6ek5qOGdya0d0WVpFNzVXNU5yRUR5VHcxL0VLdUl5Q1c0TStaeHRBZHZ3OUQvRDJ0cTNrU1h4cU9WdmRDU0I1dU80RTJOQXZBanZuM0ZielJybkhjWnpzV0tiNW9ySDNNQXlwOXp3dllaNi9wY0RmN0hEWDRXME5lU0QxZ0FmZUJYdFphSzhGNUdYMkFZQTkrT0NENDcveUs3OXkrUEhISHo5MDRNQ0IvZFZxdFE1a29aenpEU3NPU0Y2Y2swbGoyU0dBMU8vQzBVOVZLMTBJdUp5anlybndoRUJGQ0xnMjNQUE0rTWwrOGZqK3dzSXl6cDY5akRObkx1SDBhZm01Y21VQjc0YTFCc0dEb0hPNTExdDZjM1gxNms4V0Y4K2RhN1d1TFNOUnc2eGFyUnJsWGFsVURPUXJsVXBHbVZjcWxUejF6bHpYTldQME50aHQ5VTd6QWxuWUEwaXBlNTJIQWw5dE0yWk5qYk5NOTdtT2VNUVViL0lvUlE3R1V0UG5OQXhTK3lUZHdKMkNuYVlSYnFmZ3JzZlppWG9YV3JYN3ZzODVtU2V2VGZPMmVpZmU4OXp5bmdmV0dlQ0Q4dDhwZ0FmZUFaRFhnWUpqd0Fmcm1HOVFubEhUMXlPK1ROeDY3aGVsQVpEdnIvL2M1ejYzKzBNZit0RGhJMGVPSE42MmJkdDJscjlxSHZTMjNRRkFBdnlCblFJTC9MbGxyRTRFQStCd0RnK0F4emxjQUs1T3BuQ25abjRoQkM1ZG1zZVpNNWNOMU0rY3VZVGxaWHQ5K0hmREtFR0l1T2Y3cStjN25jVTNWMVl1dnprL2YrcDhHSGFvQ1VUWTM0d3hWQ29WNXJvdUZOZ1pVZllhNG5ROFByVlBUUGdweUZObER3WHVvamkxYlVDdUxRRzZJOEFzWlU5QlhtU2kxOTlGYVJUY0ZQNGEybmFlSEROOWF1eGQ1MVdLbmV2NkNOZ1RTVS9ncnNmWjlhSTJHdTRhNnRvOGI0KzlsMVR2R0pDK1p1RGZTWUFIM2tHUUIvcUNIZ1h4NzRKOS9XQSsxUGJldlh2ckgvemdCMmNmZlBEQjJZTUhEODd1M0xsemRuWjJkdnY0K1BnVVZlSFdkcDZhTjl0OXdHK2dud04yM1NuSTdRQUlBVmNJT0FCemZUOWdiNzU1bFowNWM5azVkKzR5enB5NWpEZmZ2QUxmRC9GdVdIdmdQT3FFWWVlcTc3Y3VkN3Mzcnl3dlh6aS91SGp1c2hDY1BvZ0JaTUNlRnlkYzEyV2U1MEdyZFExeUcrbzU4Ym1RVndCT2pjMFQ5UzZvV2QrT1Y5c0FFbld2dHpXb2JkalRlaWpRN1gwTlpOSVJOWkJXNmFKZm5Pb0FHSGlyVGdFNDV5a1ZUOEN1eXhqQnJwVzhuaEtuNFI1RmtWQm0rWXhwUGdnQ29jZmVjOVI3R1ZBUFNoOHEzNTBHZHgzZVVaQUgwbERBdTJCZkw3Q1hCZml3ME0vRTdkMjd0L2IwMDAvUFB2end3OXNQSHo2OGZkZXVYVHRtWjJkbkp5WW1wcEUvcFM0UDJuM0Jib01jQUhxOVhyZlQ2YlRiN1haN2RYVzF2Ynk4M0Y1YVdtb3ZMQ3kwcjE2OTJqcDY5T2oxYjMvNzIvTnhIR055Y3ZmV3ljbmRPNXZOcmJ2cTljbGQxZXI0THMrcnpRTEdldkJ1NkJPazJPdGU4LzNXbFY1ditVcW5NMzk1ZWZuaUZXcDIxMWx6dG9lR2ZhVlMwYVo2QTNkN241cnA3WGhybTluZ0p1UHlWTW5yZUFOd0lCL3F1bU9nd1UzTjlrQWE2RnFaMjJrMnZJdlVPNFU5VmZTY2MrRTRqcGtDcDlNMTJHbUhnSURkcUh3U2hBVjJyazN6ZXRVNmFwcFhMNXd4VS96NmZOYWEzamZmblFwNDRCMEllUjM2cVBxTkFQc29hY1BFanhxM2x2MnlhYU51MjkrcHVKMDdkOWJlOTc3M2JaMlptYWsxR28xS285SHc2dlY2cFY2dmUvVjZ2VktyMWJ4cXRWcXAxV3BlclZhclZDcVZTclZhOVNveWVIRWNpNVdWbGZiTm16ZmJOMjdjYUYrNWNxWDkxbHR2dGMrZE85YzZlZkprVnkyUnFZK1oxNmErY1o1WDg2YW45ODlOVE16dHF0VW1aNnZWNW96bk5iWjZYbTNHZGF0VFZwbDNRQkE4anNPbEtPb3RobUYzTVFqYWk3M2UwdldWbFN1WGw1Y3ZYT2M4b2c5MmpMQTlWQnhqVEhpZWw0SzlyZkFKekpucnVvS28rbFNhQW5HcU04Q0lXWjRxZmlBQmU1N0pucHJtYWJ4dXR5NXJLWHlUajVyYUNmQmhBZDZNejNQT3VZYTVCcm51RUJBVmI4cFFxdE00Rys1UkZHblAraFRjd3pBVTNXNDNwbkF2WVpwSFFmd3RBZjZkREhqZ0hReDVJQU42a08xM3diNTIwSStTRHlYU3krYS9GZDlsMDRiYWR0MnFPekV4TjlOc2J0dGFyMC9OMUdyald5dVZzWmxLcGI3VmRhdlRqdU9OTWVaVWNBY0ZJWGpBZWRTS0luOHBpcnFMUWRCWjhQM1Z4VjV2YWFIZG5sOXN0YTR0S1pEYkQ2QWllUGRMRzFuRjIya1U5bnBsT3oxK1QyQ2VncnhXOTVDQVRwbnlMUk0rQTJDbkFRVHNWT1ZyWUZOMXIvTlNxTk0wVzlIYitiaGF0VTZuVTdPNk51Y1RtR3ZncCtKVUhqb09ML0pVT3dCb0wzb0tkL21DcUlqYmNQZDlINzd2ODNhN0hVZFJWQmJLL2RMV2xINm53MTJIZHpUa2RWaWpxdStYUGtyYU1QR2p4ZzJiWnozU1J0M3VGemRLbmxHK3k2YVZTUjhtemV4WEtvMXFvN0ZsckZxZEdLdFd4OFlybGNaWXBkSVk4N3phbU92V3hseTNPdWE2bFRIR25DcGpqc2NZYzlXM0I4aHZ4aHdQWUI1anpFVTJDQ0ZFclQrdlF3QUFERUpKUkVGVURQQklDQkVKSVdJaGVBU0lTQWl1UGlJU0lnN2lPR3pIY2RDT0lyOGRSWDQ3REx2dEtPcTBmYi9WOHYzVmRxKzMzSW1pSG5WRXlIdklESW9iRnZCMGUxVFlwMVN3TXVNYnBXNHJlaFZucS8xYzZOc1ExMlA1ZHB4dGp0ZmJSV2I2dkRGNXNtM212dHRwMUR5dng5WUJaRHp0NmJpNzZpREFncnRXN3FZVGtLZmFOZGlWY3gybjQrNUJFSWdjdU92N01ReTArNldWVmZEcU1yeDl3UGovdDNkMjI0bnJNQlJXcG9HKy84c09uUUxOWERSS0hkZVc5ZWNrZ1BaYVoxbmFFc3pNdWZBWE9RRUM4ck9FVXoxVjE5UWt2dGJUOUlDaUp1M1QxQ25QYytYV0pIVnBUZW8xNjhNd0RHOXY1N2MvZjA1dkFBRDMrK2Z0ZnYvay9hN3JXcTNObzFhbkFON0t0YkVHOXRNd0REQ09JNXpQNXlHWjNGUG80MVMvd0I1bXVLZWZoY2NlK0puazhZZHBWbUJ2VGZKcEQwRDl1K3J6NC9zYzR1amhKSi9XMG1rOXpkTW42UEUrK2p6cEwvZmFFZllVM1BIcmFCSHU4MGZrTkdDditXcmdQeFBjVVFINVRNUlVEeFgveUdDWGdyd0g2Q1d4aDJkWnRUM1dtSlBYUEU1TjAxY1NkN1Bnd3Iza2NRRmZxM1dCUFFBQVBvbVBSL2twNk9FYjdKRDhOMlNBeHhpeXFYNGlKdmtWNE5PbjdsT1ExNDd2OHlsOStIa29iNW5Rc3dmd0lBVjZCbmg4OEc1NTBBNGZyc004djlkK3Y5Ky9obUdZU25ELytQajQrdnYzNy8xMnUrRy95UXIybXM4Ry9qTUNIaUFnWDFRQ2VvQUFPN2ZtRVh0NG1sWGI0eG1YY29uSHFmVVV0WkY0VFBUUzZiNGI3SEZpUDUvUGY4WnhSTGl2bnJ3SGdCVDRDN3lUMmdyUXlTUy9YREFBQUU3dUtjRFRiOGhiNEkxL04ycWl4M3ZuK0Q1WnZnSjZQc0duT2Q1bkg0Wmg5YVQ4TUF5QWNDOGR5ZU5INGE3WGErMXArWkxYSGZqUENuZFVRSjVRWWFxSExIOVdzRzhCZWsyOXRoNEY3bHFZUy9PV0wrM1JxclY1YkRIUlMySlgyQVBBTkk3amNENmZsNGZ6QUdENU1adHhIQmVRVnliNDFSRjllZ0ZBVFBLL0hyWWJ4N0hvejVQNU5NZS9KdndrWG1ySmNmdFVXZkVuWXdFLzU0Nys5WHFkcnRmck1yMGozQytYeS8zajQrTnJ2dCtPLy85YVVDNTVyc0IvZHJpakF2SU1LWTd3SlQ2M2wvTmFhVS9yOWJWZTcxanFhWHFvMWN2anhwcTg1bkZxbGw2VVpLT3d3TDNrZVFBK2piVVhBTlYxbUwvVjduUTZEZWZ6R2NaeEhBQit2bkJuamlHOUVBQllIOW5qZTBBQ2JueVA5SUc3Y1J3aGczbHhjc2YrMUUrQm5oL240L0g2L1g3SEtYK1oxdFA4ZXIxQ1V2djYvUHljRU93ejNBSHZ0YzlQM0Z2aFh2Sk0vcXNBSGlBZ3p4YmpDRi9pVzNvMVBWVHVVV3ZGbWpybDFWWUwxTG53dHNEZEMreGVzUGNVdFpGd29kOEN2aFQrR3ZDYllJL3IyOXZiY0RxZDRQMzlIUi9JU3lmMzlBSmdCVytBOWZTZXdqNk5zd2Z4QmdMcVg2VWFnanlGT0lJYzRBZjQxK3NWTXNBdlFML2R2ci9MQUtmMitTTnhNUCtDbkFmSXVSN2JmeVc0b3dMeVFtVlRQU1R4STRHOUY4eDdBRjBDZVk5VjRuRjhLdWJrTlkveXBUMGFjVFlPeTBRdnlYdE05QzZ3Qi9qKzZ0cHhIR0VjeCtIOS9SMi83bmJDYWI4MHRhZmd6ci93cHZheE9menowZ2ZzSUxzZ1FJaVhBSS9ReHFONUJQcnNyd0EvRE1OMHVWeW15K1d5L01CTThtK3VnVGZQTndQK0s4SWRGWkJYaW5tL3Z1UTlNdGkxRUg4RXlHdThXcjJWYThGT0FWc0tjMG0vZEpPUXdMM2thd0ZQMVRqd0xubFc2UC95MHMvWXowZjdjRHFkQnV6QmUva0E2L3Z0dFlrZC9STFlFZXJvSmY3eVBuUFBCQUJ3dTkyV2lSMWZnNVA2L1g2Zi92Mzd0enc5UDRPVEMvUlczZzM0cnd4NGdJQzhXWlg3OWVEbzljeTVOVzJzcWRmV0k4RzlCZnc4NXVUY0hzcm4xbnVJMmtnazBHOEJQdmUwc1JYMnJWN1JoY0Q4QXpqTFUvckpUOXd1RXo4QTREZnlMWDl1TnNtdnZMeU9rM3JxNDVTTzhUUk4rQ3R3Z0EvVEpmZlZTMEJOWXkzTXRUM2thMThkN3FpQXZJTm0wQU5zQjNZTHZEWFFsb0JiQS9RdElTK3R0VHh1ck1tMXZyWlBJczdHSVlGN3JVYmx0VGpOdDRLOVphM1c4T051eWJmcTRYZmdMeCtwU3gvRVF3L2c1Nzc2TkUwd0pacS91T1pybWliNCt2NDF1Rld0OHZmeUFId3IxL1lFM0FrRjVCMWxoTDJtaDhvOWFwSllVNmM4VFErMWV0U3NzU2F2ZVp3YVI5VHJyWnVEQlBJY2p3TjFUbncwMkV0ckxVOVM5NEk2VmRzRStBSDNzZ0x5SFNTQXZhWkhrbk5yM3JHSDExbzF3UGFBdXdibVhtQnZBZDBLZkE5Ukd3b1graTNnV3dDZnhscXdVN1V0SUYrcWVZR2RFL2NHZko2VFBRRjNXZ0g1ampMQTNwSjcxRnF4cGk3MWVxN2NtcVNleDVKYUthOTVsQy90OFJCbkErSEN2ZVJKY285NEQ5aDcxbnBjQkdqN3BMMmk5d3U0OHhTUTMwQVYyUGZNdVRXUFdGT3ZyVWVCdXhUb0d1aVhjb25IcVZsNmE1SnNHQks0bDN3dDRLa2FCZXBTWFFKMFRnOFg0SndlQ2JoYmRXLzRXeTRHeUF1QWdMdE1BZm1OeGZqb0haVnJlelY5NE5STGVab2V6U3F0Y1dJSzJCTFFjM3NvbjF2ZlF0U0dJb0crRi9EM2dMM25hb0Y4eVpQMjlvWS9Pdys0NnhTUTMwbU5MOVdoY28rYU50YlVLVS9UdzFtMVBkcDZIbnZrTlkveXBUMGU0bXdnRnJpWFBDL0ExK0lqd2Q0YjhpWFBHbmNGZnNEZHBvRDh6aUsrTHBmS3VUWHBheVR2NCtIVjFoNVE1OEpiQ25SUDBFczhUczJqSHlYZEtLaCtDL1ExZ0UvelI0TzlSNjAzNUd1eEd2QUJkajhGNUE4aXhYMzdXcXlCZml2dTVYRlhEY3ozZ25zdjBGTSt0OTVicmMzRUF2ZVN4NEU2Si9hQWZTL29lOVo2ZzEvYnQrUUJkMzhGNUE4bzRpZy9qWHZBWEFKcUtjZ3RrTmVzMHBxMkxxMlZjb25IcVVsNkxPSnVIaEs0bDN4THJvMzNobjJQQzRBZVlPZkV6VnJBdlo4QzhnZFc1U2kvRmg4QjZKS3AvSWh3NXdCOWE5QlRmcXZtOVJyTkprRzlSZ0w5UFFDZnhsYllTM3U5TGdTc2tHL1Z0VkJmNGdEN05ncklQNGlZMDcxMzdPRnBlalNydE5ieU5MR2tKdlVvbjF2dnJkWm1Jb0Y3eWRjQ25xcFJNRzdWTGREM1dMMGhYL0k4NDVqYWQxQkEvc0hFdUhjdmlUVjFxVmRiZTBKOWE3aExRTi9xNS9pdG1xWlBJKzdtSVozcXJSTzlGUEMxK09pdzk2aHBJYy9wWGZJQSszNEt5RCt3aE1mNXJiaVhWMXQ3UU4wQzk5NVR1M2FxcC94V3JhWFdheTJiZzJhcTl3QytGK0RUK0tpdzd6WGx1MDMzQWZmOUZaQi9BaFdtZThqVzNsTTlwN2JGNnVWcFlrMHU4U2hmMnROTEdyQlR0ZGIwbm5zOUFKL0dXdGg3UTcvSEJVQ0EvVWtWa0g4eUVjRDNBbnFQS2QwVDZsdkQvZWdUZkMvb1N6WU9LOXhMbmlTM3dMOEg3SzNRM3h2eXY3d0ErM0VWa0g5aUdZQXY5VFE5bGxWYWEzbWNPdWUxM0Z6aVVUNjN2b2UwVTcwMzRQTjhxeW0rNUdtaDczMGg0T0lGMkI5REFma1hrZkJJWCtwcGVqU3JSMDFTcDJKSlRkS2o4YVU5UGNUWlNJNDAwUjhaOWg2clIrMVhQY0QrZUFySXY2QXk0T1BxQ1hsTmIybTE5clQ2ckhHcjF1cW5QTXB2MVN5OUhFazNEU25jYTM0UHdOZHEzckRmR3ZwdXRRRDdZeXNnLytJU0FKOVQwNzVHK242dDE3UTh6OWdqMS9yYyt0YXlUUFU5Sm5xdjZaNWJQd0xzVGJVQSsvTW9JQjlhcWZDeHZOcmE2MGgrSzdoN1QrMGFzSHZEWHRybktRdllhelVQNEhzQlBvMDlZZThOZlhWUGdQMDVGWkFQVlZXWjhuRjlGYmg3Z2w3aVVYNnI1dEZmazNURGFQVmJKbnBMN2gxN1QrK1NYaTdjVjcwQjlkZFFRRDdFRnVQaFBjOVYyOVB5ckxHa1Zzb2xIcWZHcVcrdG94M1g1N2tGL2x2RDNuVU5zTCtlQXZJaHRRUkgrNXpWMnR2eXBMMWVOUStQVTlQMGVZbTdpVWlQNjJ2K1hvQlA0NGVBZlVBOUZKQVB1YWh4dEUrdDFwNldKNm5uc2FYVzZxYzhhNDJTNVFKQXMxbjBQSzR2ZVVjOXNpOTU3dEFQcUlkeUJlUkRYWlJBSDZEUGRLL3hyTEZITHZFNE5VblBWdkkrcmkvNVZ1QkxwL3REd2o2Z0htb3BJQi9hVElKcFgxcHJlWjZ4UjE3ektMOVZzL1JhSk5sQWVoM1hsN3huT3JKZjRvQjZTS3FBZkdnM0ZhQ2Z4dDV3NzNsVXo4a2xIcWZHcVh1OXpySkplQjdYbDN6UGZNOGorMTllQUQza29ZQjg2RkJpZ2wvamFXSkpyWlJiUFU1TjByT0Z1QnVLRmU0bGIyL0FwN0hJQzZDSGVpa2dIenE4R3ZmM1c1NDFsdFJLdWNTamZHNWQyNnZWSXg3WDU3a0YvdUo2QUQyMHBRTHlvWWRWWStxdnhWeUFXMEJ2OVRnMVRwMmoybnQ0YlF5OWordEwzaDczNTlONDhRTG9vYjBWa0E4OWxTcFRQemVXMURSNXphUDhWazNUMTFPY0RlVW9FNzBiNEFQbW9hTXFJQjk2R1RFdkFDUTFUaTd4S0o5YnQvWkxKTjA4dk9CZThxWEExd0ErWUI1Nk9BWGtReUVnTHdBODhwcEgrYTBhcDc2M0xGTzk1M0Y5N2xYN0ErS2haMU5BUGhSaUtMc0lBTmgyZ24rVTQzcnJrL1ZVVFR2Unh5UWVlbWtGNUVNaFJ6RXVCclErdCs3MW1wWThqK3BiZGRiOStBQjRLUFJiQWZsUWFFY1ZMZ3BXWmM1YmVQMWRPc2owRUY1QU94U3lLeUFmQ2oyUkdoY05YUlZRRG9XT3AvKzBudllBa2djQzNnQUFBQUJKUlU1RXJrSmdnbEJMQVFJVUFBb0FBQUFJQUNCZWJFWW40V3IzZ3dFQUFCOERBQUFpQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJ1YjNKdFlYUnBkbVV0ZEhsd1pYTXRkMlZpUVhCd2JHbGpZWFJwYjI0dWVXMXNVRXNCQWhRQUNnQUFBQUFBSUY1c1JnQUFBQUFBQUFBQUFBQUFBQWNBQUFBQUFBQUFBQUFRQUFBQXd3RUFBR2x0WVdkbGN5OVFTd0VDRkFBS0FBQUFBQUFnWG14R0JLVjdjZHR2QWdEYmJ3SUFFZ0FBQUFBQUFBQUFBQUFBQUFEb0FRQUFhVzFoWjJWekwyNWxkSGR2Y21zdWNHNW5VRXNGQmdBQUFBQURBQU1BeFFBQUFQTnhBZ0FBQUE9PSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDdfTm9ybWF0aXZlVHlwZUNJLXdlYkFwcGxpY2F0aW9uL2NvbW1hbmQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vY29tbWFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE1YjM4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDdfTm9ybWF0aXZlVHlwZUNJLXdlYkFwcGxpY2F0aW9uL2NvbW1hbmQKQEAgLTAsMCArMSwxNSBAQAoraGVhZGVycz1gcGFzdGUgLXMgLWQiICIgaGVhZGVyc2AKKworY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMS9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiAke2hlYWRlcnN9IC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgICIKKworZWNobyAkY29tbWFuZCA+IHRvRXhlYworY2htb2QgK3ggdG9FeGVjCisuL3RvRXhlYworCisKKyMkY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDdfTm9ybWF0aXZlVHlwZUNJLXdlYkFwcGxpY2F0aW9uL2NvbW1hbmRUcmlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk2YWIzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDdfTm9ybWF0aXZlVHlwZUNJLXdlYkFwcGxpY2F0aW9uL2NvbW1hbmRUcmlhbApAQCAtMCwwICsxLDEyIEBACitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiIgorY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCitjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA3X05vcm1hdGl2ZVR5cGVDSS13ZWJBcHBsaWNhdGlvbi9jb250ZW50TUQ1LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA3X05vcm1hdGl2ZVR5cGVDSS13ZWJBcHBsaWNhdGlvbi9jb250ZW50TUQ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQ0ZTlhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDdfTm9ybWF0aXZlVHlwZUNJLXdlYkFwcGxpY2F0aW9uL2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK01EQmtObUkyT1dJeFl6aGtNRGczT0RnelpHRmpZVGszTldFell6QXlNRFk9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDdfTm9ybWF0aXZlVHlwZUNJLXdlYkFwcGxpY2F0aW9uL2hlYWRlcnMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vaGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFkYjBjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDdfTm9ybWF0aXZlVHlwZUNJLXdlYkFwcGxpY2F0aW9uL2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vcmVzdWx0cyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA3X05vcm1hdGl2ZVR5cGVDSS13ZWJBcHBsaWNhdGlvbi9yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2U1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDQ6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA3X05vcm1hdGl2ZVR5cGVDSS13ZWJBcHBsaWNhdGlvbi90b0V4ZWMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vdG9FeGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTI2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wN19Ob3JtYXRpdmVUeXBlQ0ktd2ViQXBwbGljYXRpb24vdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLVhQT1NUICJodHRwOi8vMTcyLjIwLjQzLjEyMTo4MDgwL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcbiIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2JvZHkudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDhfTm9ybWF0aXZlVHlwZUNJLURCTVMvYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxYmUxOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2JvZHkudHh0CkBAIC0wLDAgKzEgQEAKK3sicGF5bG9hZE5hbWUiOiJub3JtYXRpdmUtdHlwZXMtREJNUy56aXAiLCJpc0VuY29kZWQiOnRydWUsImlzQ29tcHJlc3NlZCI6dHJ1ZSwiYXJ0aWZhY3RMaXN0IjpbeyJhcnRpZmFjdE5hbWUiOiJyZWxhdGlvbmFsX2RiLnBuZyIsImFydGlmYWN0VHlwZSI6IklDT04iLCJhcnRpZmFjdERlc2NyaXB0aW9uIjoiIiwiYXJ0aWZhY3RQYXRoIjoiaW1hZ2VzL3JlbGF0aW9uYWxfZGIucG5nIn1dLCJwYXlsb2FkRGF0YSI6IlVFc0RCQW9BQUFBSUFFRmViRWI1QWt6bzRnRUFBSFlFQUFBWUFBQUFibTl5YldGMGFYWmxMWFI1Y0dWekxVUkNUVk11ZVcxc2xWTk5iOXN3REwzN1Z4QTlMMjZLM1h3WTBLVUZlbGpYRGM1dEdBVEdZaElCdHVTSlRJTDgrMUdxblRoTk4yejJ4YUQ0UHZSSVMrQUdqYVcxODA1YzhHejJGRmsvS3BCOHhLN3JXekpIN0ZwelorYjZIdXo4WTFFSWFSMkZqTWVPaHVhWkQ3RkRjWHVheWJFbm5qMThmcTdQbmJpVGJZZ1ZMRi9xeFQwc0YrZVRrK1pkT2RjM0tjenFyL2ZmNnFlWFpWRlk0aWE2WG5MSEluaEI1eGxrUzNEU2c2d0g1M3VVaGZvT1ViZ3FBR1p3ODc2L0dJSlU3MmplL0EzRVlTMEhqTFFJcXVESi81R2g4TUdTeWFEa0lyT1ZxY1psQ2liVkFIREZFckVSalREdUtKY3NSVld6WmgxRFYxM0E2cmZTUS84a24wKzVCTERVZUY2RFRscVE4QkNwajhRS1k4Q1VtR3V3MWFLT1FLSFlmb0Q2K3hkNFFNRVZNc0V6ZXR4UXArMVFIMWxuQmVQTm9SbjFJVVJnaW52WFVKbUZCVGRjRFJaY2t3emR1azVwK1Bhc1kreXE3UDBtZC9VeDlCVEYwUWxsVngyYk5CalRJL01oUkR1ZVFKNXlCUnFZRytEcGlmUnI1eUxaQ3RiWU1wM3FGN0drYlVta01KTENXcTJuYW83bjRnNkRoN1ErYjZXZEY5cFEvSC90UkhZbEJ3Zlh0dEE2RGRmcm5MTWxxL0VEZXB1cGlZVXpaNE05cmx6cnBrRnRBMS81ZTEyV2FYYzUvREFUMDllWnAyZVByYk5tc3JMdzQySmpoN1g0T1VESTJ6NW9IUC9nWUlRK0RwQ2krQTFRU3dNRUNnQUFBQUFBUVY1c1JnQUFBQUFBQUFBQUFBQUFBQWNBQUFCcGJXRm5aWE12VUVzREJBb0FBQUFBQUVGZWJFYUlRUXdxamNvQUFJM0tBQUFZQUFBQWFXMWhaMlZ6TDNKbGJHRjBhVzl1WVd4ZlpHSXVjRzVuaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWRBQUFBSUFDQVlBQUFBeWl6MnlBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQWlaQUFBSW1RQkczcFBjQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUFBVmRFVllkRlJwZEd4bEFHUmhkR0ZpWVhObElITjViV0p2YkU2aEpMb0FBQUFOZEVWWWRFRjFkR2h2Y2dCeVp6RXdNalRJOGZtbUFBQUFMWFJGV0hSRVpYTmpjbWx3ZEdsdmJnQmtZWFJoWW1GelpTQnplVzFpYjJ3Z2FXNGdiV1YwWVd4c2FXTWdjM1I1YkdYSndXdU5BQUFBSVhSRldIUkRjbVZoZEdsdmJpQlVhVzFsQURJd01UQXRNVEV0TURoVU1qSTZNRGc2TkRPQ0RLWDhBQUFBUkhSRldIUlRiM1Z5WTJVQWFIUjBjRG92TDI5d1pXNWpiR2x3WVhKMExtOXlaeTlrWlhSaGFXd3ZPVFEzTWpNdlpHRjBZV0poYzJVdGMzbHRZbTlzTFdKNUxYSm5NVEF5Tk1SMksyVUFBQUJKZEVWWWRFTnZjSGx5YVdkb2RBQlFkV0pzYVdNZ1JHOXRZV2x1SUdoMGRIQTZMeTlqY21WaGRHbDJaV052YlcxdmJuTXViM0puTDJ4cFkyVnVjMlZ6TDNCMVlteHBZMlJ2YldGcGJpOVp3LzdLQUFBZ0FFbEVRVlI0bk95OWVaQWJWMzduK2MxTTNFQVZVQ2VMWlBGU2taUW9raEtsRWs5SkxhbEZ1U1ZaVk52ZHR0UkQyK3R3ekd6TTdrWnNiT3p1alAzSFRzVE94aDRSdTdNN0V4dHI3Mkc3UXoyMjFVMjVPN3JiYXFsYlVsTVhKVklrSlo3aUtSNmlTRlFWaTFmZFZTaGN1WDhrTXBFSkpGQkFGcENaQUw2ZkNFUVZIbDVtdnNwRXZVLyszcFdDTE1zZ2hCaUp4K01pZ0RiZHE3MkMzNE1BUEFVdmI0VnBwZElCSUYzd1NxbS95N0pzU0pkbHBJSENOTVA3dEN4akRwQ25BRXdCbUFRd0pjdVlBdVRKWE5xVUxHTlNsMmZxdnZ2dXk5Ym16QkxTUEFnVUtHbFc0dkc0QUtBRFFLL0pxd2RBRktXRkdIYWd5QlZUK0grcnZDMU1xeVNQTWMzOFBRRElNOGdKVjVGdFhyaXlqQWtBdHdINUZvQmJBRzdKTW5LL3kyUHIxNjluSlVPYUVncVVOQlR4ZUR3TWN5R2F2YnFSaitLYWdscUlVeWRGQzNueWFSWG1TUU80QTBXbU9yRXE3MkdRTFc1dDJQREFEQWhwRUNoUTRocmk4YmdQd0FvQUt3R3NNbmt0QlJCeXJJQU9VaXpGNHYvYnlzUlplN2thRDJzdTEvSjVsTFRjKzFrQUk0RDhEWUJ2WkJuZkFPcEx2aTdMdUxGcDA4WWtDSEVCRkNpeGpYZzgzb2JTY2x3Rm9BK0E2RmdCWGNoQzRyVFNMRnM2VC9udDZpek9Tdk5rQWR3RTVFSzVxdSt2UC9UUTVpa1FZZ01VS0trcDhYZzhCbUFEZ0FkelA5Y2lMOGdPQjR2V1VEZ2x6dXFhYmt0dlZ3ZHhsdHl1TUk4c3kyUFF4SXJMZ0h4ZWxuRU93UGt0V3g0ZUw5d2pJVmFoUUlrbDR2SDRFdVFscWY3Y0FLV1psVmpBU3JOczVYbU1hWFhzODlRZjFVSWVKYzJLWEl2UG4ybWVFUURuYzY5ekFNN0xzbnp1MFVjZkdRVWhWVUtCa3BMa1JyR3VoRkdTNms5R2t6V2lYdUswZWJDUXZpUVc4aWhwMVVlZ0ZZdXpjRWVGYVdPeUxHdFNCWEJPbG5FZWtLOC85dGdnSzBsaUNnVktBQUR4ZUR3QTRHRUFnd0FlQS9BUWdBZmc4dWtjalF6Rm1VK3pTNXdXenVjTWdBdXlqTk9BL0FXQVl3Qk9iZDM2V0tLd2hLVDFvRUJia0hnODdvY2l5TWVRRitaR05ObVVEN2ZpcGhHMFptbjFFcWVWL2t3SHhXbWFsbnVmQm5BV3dCY0Fqc2t5dmdEazA5dTNiNXN2TEQxcGJpalFKaWMzTmVRaDVFVTVDR0FUbEZWdmlJMVFuS1hTckluVHlUNWprN1NVTE9NTWdHTzZTUFgwamgzYk9lV21pYUZBbTRoY24rV0RBQjVIWHBhYlFWazZpcHVtbnBpbFdSR25sVUUrVFNyT2N0Y2hCZUJMYUZFcURnTHl1VjI3ZHJMU2JSSW8wQVpHSjh5bmM2K25vQ3hSUjF3QXhWbDZ1NFdiWlJ0UG5CV2V6OXNBUGdid0VTQi9CT0RjNDQvdllpWGNvRkNnRFVZOEhuOFF3RE9nTUYyTG15cjFTdkpZYVpZMVM3TWkxeHFOb0hWVXJvdThXYmtOeUI4RCtFaVc4ZUdUVHo1K3J1Z1BJYTZGQW5VNU9XRStqYnd3ZTUwc0R5a054V24yM2p6TjdlSjBNTXEvSmN0cWhJcVB2dld0SnloVUYwT0J1b3g0UEw0YXdBdFFva3dLc3dGd2t6aXROTXRXbjBkSm96Z3J2dzZMaU9CdlFXbnkvUkNRZi9QVVU5KzZCdUlhS0ZDSHlUMTNjaHVBUFFCZWhqSkNsalFBclNET2hhWG9mbkhXSzRJM1M3T2g2ZnNNZ0RjQitWZXlqS1BQUFBNVW45UHFJQlNvQStRZXlmVWNGR20rQkVhWkRVV0Q5SzJaNUNtOUhjVlorWFdvVndTL2NKNml0RnVBL0pZczQxY0FmdnZ0YnovTlI4SFpEQVZxRS9GNHZCK0tMRitHMGp3YmNMWkVwRm9hWFp3MXFMQXJ6Rk0vY2RZcmdxOGtqNHZFYVpZbkFjZ2Z5akxlQlBEV3M4OCtFeS9jQTZrOUZHaWR5RTB4ZVJUNXB0bEhuQzBSc1lxYis5Yks1MUhTS003YW5zL3E4eWhwOWJvT0pjN25DUUJ2QXZnVmdPTzdkMytiRlgwZG9FQnJURHdlZndEQWZ3TGdqNkFzeEU0YWxOWVRwNzF5YmVDcEp5WjVTbTlYcit0UXhjM0tkUUN2QS9pNzU1NTc5Z0pJemFCQWEwQThIdThDOEFNbzR0em1jSEhJSW1Fem9sa2U4KzBvenRMYldia09Oa1Q1UndIOEhZQjl2L003dSs4V1pTSlZRWUZhSkxmRzdJc0EvalQzMCtkc2ljaGlvVGpOOHBodlY0dG1XZk04K1hKVm1zZkpLTC82UEVxYVhlSXNjODZUQUg0TjREL0tNbjc5L1BQUGNjMWVDMUNnVlJLUHg3ZEJpVFIvQUtETDRlS1FHbUJObk0wZkRTMmNaOUhSVUpWNTh1VXllMTg2VC9udDZuVWRHaWpLdnd0Z0g0Qy9lLzc1M3psYXRDRXBDUVZhQWZGNGZBV0FQNFlpemdjY0xnNnBBV3hHektjNTBJeFk1bjIrbktYU0tFNWRTdTJqL0FzQS9rNlc4UTh2dnZpZEcwVTdJd1lvMERMRTQvSEhBZnpYQUg0UGdPUndjVWdOWUROaVBvM2lyUHc2MUN1Q3IrUTZPTlE4bmdId1N3RC80Y1VYbno5WXRITUNnQUl0SWg2UGV3RDhBUlJ4Y2tCUWswQng1dFBzRW1lOUl2alNlY3B2UjNGV20wZExPd3JnUDhneWZ2YlNTeStraXc3WXdsQ2dPZUx4ZUF6QWZ3cmd2d1N3d3VIaWtCclJqSDFybGVTcFZ4TmhNNGl6WGpjaUMrZXhkajdOMGh6cWdyZ0I0UCtTWmZ6Tm5qMHZqaGNWb0FWcGVZSEc0L0VCQVA4VmdEOERFSEc0T0tSR1VKeWwwaHB2NmtucFBPVzNvemdyejFQbCtad0c4QnFBLzNQUG50KzlVbFNnRnFKbEJScVB4NThFOE45QVdTVklkTGc0cEVhNHFjSTJTN01pem5vMUVWS2NsZVpSMHV5SzRNM1NYQ0xPd3JRc0lMOEo0TisvL1BKTG54UVZzQVZvT1lIRzQvR25BUHl2QUxZN1hSWlNPOXhVWVp1bHVVbWN0YXV3blpOck0wYjVkc3ExRHQvOUl3RCs0cnZmM2ZOeFVXR2FtSllSYUR3ZTN3QkZuSHVjTGd1cEhZeUdLczNqL21qSUxLM1JiMWJzdkE0dStWNy9DcEQvNHZkKzcrWHpSWDlBRTlMMEFvM0g0MzBBL2djQS94eWNpdEkwVUp4bTc4M1QzQzdPWm96eW0wR2NpNGpnTXdCK0NNai8vZS8vL25kdkZ2MUJUVVRUQ2pRZWowY0EvR3NBL3kyQXNNUEZJVFhDVGVKY1JBVlRSUjRselUwVnRubWVmTmtyelZNdmNkWXJncmZ6T2pUSjkzb0d3UDhCNE45OTczdmZuVVlUMG5RQ3pjM2ovQmNBL2kyQUpjNldodFNLSnExZ0RIbmNIdW1ZNTFIMlgrcDk2VHpsdDZNNHE4MWpUTE1yZ3E4d3o2Z3M0OThDK052dmYvLzNtbW9lYVZNSk5CNlB2d3lsbjVQTDdUVUpyVkRCVUp3MXI3QmRKYzVtN0RPdVBnOEF5QmRrR1gveEIzL3crMitpU1dnS2djYmo4UTRBL3crQVY1MHVDNmtOalY3QnVEM1NNVXRyaFQ3amhmT1liK2NtY1ZvNW4yWnBOb3F6OFAwYnNvei8vQS8vOEh0amFIQWFYcUR4ZVB4M29FenFYZVowV2NqaWFmUUtodUowWllWZFFSN3o3ZXc2NStaNThtVTNlMTg2VC9udG5KU3I3djB3Z0QvN3d6LzgzbnRvWUJwV29QRjRQQWpnM3dINEx3QUlEaGVITEJJM1Z6QnVyOVFycWNUWmpKaFBzM0lkR3UxbXBibzgrVFNiYnhwbEFQODNnSC85eWl2Zm55dk0wUWcwcEVEajhmaFdBSDhQNEg2bnkwSVdoNXNyR0lxemRCNjNSenBtYWJVNG54Um5QcTJHMyt1TEFQN2sxVmYvNFBQQzNHNm5vUVNhRzJINzN3SDROd0E4RGhlSExBSTJJNXJsTWQrdUZoVzJlWjU4dVNyTjQvWkt2Wkk4alhhellwYldoRGVOYVZtVy95Y0EvL01QZnZDSERUTlN0MkVFR28vSDF3RjRIY0JXcDh0Q3JNRm14SHlhRmJreUdqTExvNlRWNjJhRjRxdzBqNUpXZy9QNU9TRC8wUTkrOE1xbHdpM2RTRU1JTkI2UDd3THdGb0FPcDh0Q3FvZk5pUG0wV2xUWUZHYytyVjdpZERMS04wdXpjaDBhK0hzOUJ1Q2xmL2JQWGpsVXVCZTM0WHFCeHVQeGx3RDhJNENnMDJVaDFVRng1dFBzRXFmYkl4Mnp0RnFjejRYem1HOUhjWmJlcmhibmN4SGY2emtBcit6ZCsrcGJoWHQwRTY0V2FEd2UvMU1BZnd2MmR6WVViaHBCYTViV0pCVk13ZnQ4dWFyTFkweHJSbkU2T2ZXazhqekdOSDZ2QVFCcEFQOWk3OTVYLzJQaDN0MkNhd1VhajhmL0hNcXFRcVJCb0RoTHBiRnZ6VHlONG5SS25GYk9wNDNpTE9Rdjl1NTk5WDhybDhFcFhDZlFlRHd1QVBqZm9UenNtalFBYnFxd3pkSWFyWUtoT1BOcGRsYllyVEFGcU1IRXFlZmZBL2hYZS9lKzZpcGh1VXFndVdrcXJ3SDRZNmZMUWhiR1RSVzJXWnFiS2hpM1J6cWw4K1RUckp6UDZ2TW9hZTRYWi9YWHF0RnVWaGJPWTc2ZHRXdFZFZjhBNE0vMjduM1ZOZE5jM05hMytFTlFucTdIVFpWNkpYbWNyR0RjSGcyWnBUWDZ6WXFkMTZGVnY5YzJpMVBsandGa0FmenBZblpTUzF3VGdjYmo4WDhKNFA5MXVoeWtOQlJucFhuY0wwNHI1OU1zamVJc25XYmxlMjNsZkZhZlIwbXIxM1dvNUh3dWt2OXM3OTVYLzc5YTd0QXFyaEJvUEI1L0RNQ25BUHhPbDRVVTR5WnhPbG5CT0ZsaG0rZkpsNzNTUFBVU3Avc2pIWGVQWktZNHEySWV3Qk43OTc3NlJUMTJYZzJPQ3pRZWozY0NPQTVnbGFNRklVV3dnakY3YjU3bXBEaXRuTS9xOHVUVDNGUmh1MTJjVnM1bitUeWx0NnZYZGFqVjk3b09mQVBnMGIxN1g3MVg3d09WdzFHQjVrYmN2ZzNnQmNjS1FZcG9oUXJHeVFyYkxJM2lMTDJkbGV2UWpIM0cxZWRSMHBwTW5IcCtBK0IzblJ5WjYvUWdvbjhEeXRNMXRFSUY0M1p4V2ptZnBmT1UzODVORlRiRmFaYW45SFpXcm9PZDMydWJlQUdLUS81SEp3NE9PQmlCeHVQeFp3RHNCeUE2VWdDaTBlZ1ZqSk1WTnNXWlQ2dlhkV2pHUHVQeWVVcHY1eVp4T3QzOWx5TUxZUGZldmE5KzZNVEJuWXhBL3hkUW5vN1M2QlZNODRyVHZUY3IxZWRSMHF4Y3ExWnRIaStmUjBsejhydnZFbkdxaUZCY3N0T0pnenNTZ2NiajhTY0FmR0w3Z1FrQWQxY3dibytHckZZd0ZLZlplL08wWm96eXpkSW96cHJ5NU42OXIzNXE5MEdkaWtELzNLSGp0alJ1cm1Bb3p0SjVuS3l3cTgranBGR2NqZkhkdDNyT1hjaWZRNWtLYVN1MlI2RHhlSHdEZ0xNQUJGc1AzTUkweHFUdzVxcGczQnpsbTZYVjZ6bzAyczJLV1ZvejNqUTJrVGhWWkFBYjkrNTk5YnlkQjNVaUF2MVhvRHpyRHBzUjgybHVFcWM3b3FGOG1wWHJZT1Y4dG9vNG5meGVXem1mVFNCT0ZRR0tXLzY1clFlMTgyVEY0L0dsQUs0QjhObDIwQmFEellqNU5Ec3JHSXJUTEkvNWRyVTRuK1o1OHVXcUxvOHhqZUpzV0pJQVZ1L2QrK3FJWFFlME93TDlsNkE4NndMRm1VK3pxNEp4c3NLdUxrOCtyUmJuYytFODV0dFJuS1czcThYNWJHRnhxdmlnT09iZjJuVkF1d1g2ak0zSGEzcll0MVlxamVMVXA5a2xUaWY3akN2UFkwemo5N3FwZUFZMkN0UzJKdHg0UE80Rk1BRWdhTXNCbXh5S3MxUmFjL2F0VlpMSHl2azBTNk00YS91OXRuSStLVTdMekFHSTd0Mzdhc3FPZzlrWmdUNE15blBSdUtuQ05rdHJ0QXFHNHN5bjJWbGh0OElVSUlyVEVZSlFYR1BMazFyc0ZPaDZHNC9WZExpcHdqWkxjMU1GNC9aSXA1STg5VHJubGVSeHVsSjM4eFNnZXQyc0xKekhmRHRyMTZIcFdZOG1GR2lQamNkcUdweXYxTXR2NTZZS3h1M1JrRmxhbzkrczJIa2RXdlY3VFhGV2pXMnVzVk9nM1RZZXErR2hPTTNlbTZlNVhaeFd6cWRaR3NWWk9zM0s5OXJLK2F3K2o1SldyK3RReWZsc1FXeHpqWjBDamRwNHJJYkZUZUowc29LaE9QTnBicXF3YTNVZFd2Vjd2WEFlOCswb3pxcXd6VFYyQ25UQ3htTTFISzFRd2JnOTBqSFBvK3kvMVB2U2VjcHZSM0ZXbThlWVZvdnpXVDVQNmUzcWRSMXE5YjBtOXJuR1RvSGVzZkZZRFVNclZEQVVwenNyN0ZwZGgyYnNNNjQrajVKR2NUcUxJQWdRQk9HdVhjZXpUYUF6TXpNRDRYRFlyc081bmthdllOd2U2WmlsdFVLZjhjSjV6TGR6a3ppdG5FK3pOQ2ZGYWVmM21oaHBiMi9iYXRleGJCUG8vUHo4akNwUVFSQmE5a3ZRNkJVTXhlbk9DbnZoUE9iYjFlSjhtdWZKbDZ2U1BQVzZXVEZMcTllMXN2Tm1oUmdSQk9VWkpUNmYxNVpGRkFBYkJUbzdPeHZ2Nk9qUTVObHFFblZ6QmVQMlN0MXFCZFBvVVg3MWVaUTBLOWVoMFc1V3FzdVRUMnUwbThaV3FpTnJnU0FJQ0lXQ3QrdzZubTBDbFdVNWswd200ZmY3dFRUMWpxR1p2eVJ1cm1Bb3p0SjUzQjdwbUtYVjRueFNuUG0wZW4ydnJVYjV4SWlaUC94K1B3UkJ5TnBWQmxzWGs1K2ZuemNJVktVWm8xRTJJNXJsTWQrdVZoVk02NG16ZHVlOGt1dmdaSlJmT2svNTdkejAzYmQ2czBLS1VlVlpTQ0JnNzhPK2JCWG96TXdNMnRyYVRQLzRacEFvbXhIemFYWldNSXlHelBLWWIwZHhtcVZaLzE1Yk9aOFU1K0lRUlFHQXVTL2EyOXRzTFl1dEFzMWtNcGlkblVXcDBiaU5LbEdLTTU5bVp3VkRjWnJsTWQrdUZ1ZlRQRSsrWE5YbE1hWlp1UTdOK3IwbXBSRkZzZVJua1VnWWtpVFplazd0Zmg0b3BxZW5Td29VYUN5SnNoa3huMlpYQmVQMlNNY3NyUmJuYytFODV0dFJuS1czcThYNXBEanRvNXc4QVNBV2E3ZXBKSGxzRjJncWxVSWlrVUF3V1BySlptNlhhS3VLMDhrS2h1SXNsY2Q2aGUwbWNiYnE5NXBVaGlpS1pRZWRoc01oZUwxZXU0dGx2MEFCWUdwcXFxeEFBWGRLMUVvRjQyU0ZYVDVQNmUzY1ZNRzRYWnhXenFkWkdzVloyKysxbGZOSmNib1RVUlFoaW9MSnRjampSUFFKT0NUUVpESlpja1N1aXB1bXVEU2pPSjJzWU56ZVJGaEpIb3F6ZEo1Vy9WNVRuTFZIa3FTY0MwcWZ4MERBajBBZzRNaTVka1NnZ0JLRmxoTW9vSzFyaUd6V3RtazlCdHhVWVp1bE5Wb0Y0M1p4V2ptZjFlZFIwdXlzc0J0ZG5FN2VyTlR1V3BGcUVBUWhKMC8xR3BXV2FGZFhwNTFGTStDWVFPZm41ekUxTllXMnRvV0hIWXVpQ0ZtV2JmdFNOcGM0NjF2QnVMMVNOMHV6NjJhbGtqeE9SME51SHNsTWNiWW1naURBNDFIVlZQNThkbloySUJoMEp2b0VIQlFvQUV4T1RzTG44eTBZaVFMMk5PbTZLUnFxSkkrVEZZemJ4ZW5NellxUzVteUZUWEdxYWZXNkRwV2NUMklOU1pJZ1NSTE16bnMrR2xVSWgwUG82SEQyTWRPT0NoUUF4c2JHME5QVGt6dHA1YW1YUkNsT3MvZm1hUlNuV1I0bHplM2lkUEo3YmVWOFZwOUhTYU00R3hPUHh3TkpFazJ1VFRGZXJ3ZTl2VDMxTDlRQ09DN1FiRGFMc2JFeGRIVjFsVnllU1kvYUwxcUxKbDFXTUdidnpkTmFWWnhPVnRnVVo2VjVsRFFyMTZGVzMydGlIVUVRNFBWNlN3d1dLazRUQkFGTGx2VG1aT3ZzZFhCY29JQXlOM1JxYWdydDdaVVBSVmI3UmEwTU1HcUZDc2JKQ3Rzc3JkRkdNcnRkbkszYVoyeVdSbkUyTGg2UEJ4NlBwK3g1TFd5NjdlbnBRaURnZDhXMWNJVkFBV0IyZGhZK253K0JRQUNBOGtWZEtDSlZSMnBsczltS1RtWXJWREFVcHpzcmJJclRMRS9wN2F4Y0J6dS8xMlJ4aUtLb2l6b3JKeElKSXhwdGQ4MzFjSTFBQVdCOGZCeXhXRXlUYUtVc0ZJMDJlZ1hqWklWZEszRmFPWitsODVUZmp1S3NQSStWODJtV1JuR1NTdkg1dkpBa1JUM3ErUzFlT0tlNDZUWVNpYUMzdDl1bVVsYUdxd1FLQUJNVEU1QmxlY0dWaWdveGkwWWJ2WUtoT0d0MVB0MHAxMmFNOHMzUzZuVWQ3THhaSVl0SGtpVDRmRDZ0cjdPYTB4eUxSZEhkM2VtNmErTTZnUUxLSWd2WmJCYVJTS1RxYmMyaVVUZFZNSXlHRnNwalRITlRoVzJXNWlaeDF1dG1wYm84K2JSR3UybDBXK1hjTElpaXFFV2QxWnhqdGUrenE2c1RIUjB4VjE0ZlZ3b1VVSjRkbXMxbXF4cFlwRzhPVUtOUm8wZ0JweW9ZaXJOMEhyZEhPbVpwdFRpZkZHYyt6VzAzSzJUeENJSUFuOCtuV3hTaGVFQlF1YVpiUVJEUTI5dU50cmJxQXltN2NLMUFBU0NSU0FCQXlZZHdxNVNxWVBJaWxaSEpwQXZ5QUl1dFlOd2U2VlJTMGJNWjBTeFA2ZTBhL1diRkxLMFpieG9wVHVkUXhPbUYxK3ZMcFZUWFhBc0FvZ2dzV2JJRTRYREkxZGZKMVFJRmxDWC9zdGtzb3RHb1FhS2xLaGhqSGdDUUlRaktjT2xzTm90TUpsT3dqWktuWEpxYktteXpORHNyR0VaRFpubk10Nk00emRLc2Y2K3RuRStLMDE2VWxlVjhVQ05KNVZTWFh3eStFRW1Tc0hUcEVrZVg2S3NVMXdzVVVPYUpUa3hNSUJLSmFDc1dsWk9wV2NVQXFJL0ZFWkhKWkpESlpMSFlpc0lzelVseDFyT0NvVGpOOHBodlY0dnphWjRuWDY3cThoalRyRnlIWnYxZWs5cmc5WG9SQ1BnaENDTE16bjFoMDIwcHFmcjlmdlQxOVRqeWJFOHJOSVJBQVNDZFRtTmlZZ0toVU1nd1Y3UVFzNHFwTUNwVlJhcEVwT3FvWFlyVFRSVjJkWG55YWJVNG53dm5NZCtPNGl5OVhTM09KOFhwTHRRK1RyL2ZCMEZZM0twQWdpQ2dzek9HenM0T0FJMXp6UnBHb0NxenM3TklwVklJaDhNUVJSR0FzUkpRT3FYejcxWE0wa1JSMG9rMGcyeldUS1FvbTlhTUZRekZXU3FQOVFyYlRlSnMxZTgxcVEyaUtNTHY5K2VtcENocHNseDVsS2w5bXN2djgvbXdaRWtQQWdGL2JsK05jOTBhVHFDQUVvMU9UazRpR0F6QjV6T0crZ3RWVE9xdnlvVlhwU3ZDNDFGR2crV2JkL09mNjdkcjFBckc3WkZPSlhtc25FK3pOSXF6dHQ5cksrZVQ0bXc4SkVsQ0lCQXcxTGxtMzhOcWlFYmIwTlBUYlRJYXR6Rm9TSUdxSkJKelNLZFRDQVNDRUlUQ2ZsRWdMMGpCcEdJb2psUVZrWXFRcEN6UzZUU3lXYm5oS3hpS001OW1aNFhkQ2xPQUtNN1dRT25mRE9UNkpXWFQ3MmtwU2tXbGtpU2hyNjhYb1pDeVlFNmpYcnVHRmlpZ1JLT3pzek1JQkFLNVJZbUJoU3B4SmMxWVVSZ2pVdVhwQUxJTVpETHBYUE91bHJ0Z3YvazB1eW9ZdDBjNnBmUGswNnhVMk5YblVkTGNWcW03ZVFwUXZjNzV3bm5NdDdOMkhjaGlFUVFCZnI4ZmdVQ2c2UG1jeFZJczJocmxCQnVKaE5IWDE2c3RldFBJTkx4QUFlVWZLSkZJd09QeGFFdEZxUldGL2hFNTVhTlN3WkJIZVd3YUlFa2VTSklIMld3R21Vd0c2YlIrR295OUZZemJveUd6TkVaRHBkTmFJY3BmT0kvNWRoU25NL2g4M2x3enJVOUxxOVZwOXZsODZPN3VSQ1FTenUyMzhhOWZVd2hVSloxV29rV3YxMnRZL2FLeVNzZnM4M3dlWmVTdUJJOUgxcUxTVEVZMjVLbFBOT1IrY1ZxcHNNM1NLTTdTYVZiRWFlVjhWcDlIU2F2WGRhamtmSkxGSVVraUFvRWdBZ0UvSkVuU3ptLzU4MnlNTW90WEdNcS85M2drZEhWMUlocHRyMkMvalVWVENWUWxuVTRqblU3RDYvVkJra1F0WFphQmZEZXBzVWxDbjBkSmt3dmVLOXVvVWFtNk1JTnlySXp1UzBGeExsYWM3bzkwM0QyU21lSWtsUkFJQkJBTTVxUE40dk5iWHBJTElRZ0NPam82ME5YVm9UWFhOdHMxYkVxQnFxVFRLV1N6b2paZEJibW0ydUlLcGpoTmx2VkxCNXB0SjBBUVJIaTlQbmk5U2w5cE9xMDA4K3BsMm1qaXRGSmhWNWNubithbUN0dnQ0clJ5UHN2bktiMWR2YTVEcmI3WHhEcnFNNWNEZ1FCRTBYektuM1VVNFFxQ3N2eHFiMitQSWFKdFJwcGFvSUR5ejVmSnBDSExpa2h6cVFWNThtbUZVYXBabnZ6N2ZKcmFWd29vTWsybDBybGxBMlcwc2pqZEh1bFVKc1hxejJmbGVZeHBGR2Y1TkZJOWZyOGZ3YUFpVGVOS1FYTFZVZVZDVVdrNEhFSnZiMDl1T2IvbXY0Wk5MMUFWV1phUnpTb0RnSlM3SXUyVEVsK2l3aWJlaGQ3bjAvSXlsWkZPWjdRbVplWEwxUGg5YTVYa29UaEw1N0Z5UHMzU25CU25uVGVFcERyVUViU3FOUFdqWGV0MWFuMCtQM3A3dXhHSmhOR01UYldsYUJtQjZzbG1zNFpWaklvckZLSEVleVhOK0Q2WGF2akM1Q3NLajBmS0RXaVNrVXFsRFRKdE5IRzZQZEtwcEtKdnhqN2o4bmxLYjJjbGo1MDNLNlJ5QkVISTlXa0dFUXdHdERueGxaM1h3cWpTdUtoQnVTZzFIQTZqczdQRDlVOU5xUmN0S1ZBZy84VlN2MmpLTW43RythQ3lYUDU5ZmwvbGhKcy9sdGZyZ2RlcnpGVlZwc1NrY3lPSDA0NUZRMlpwN3EzVWxUUXJjbTIwbTVYcTh1VFRyRndIdDBYNXBESThIbzhXWmFycmc2dlVla0NROFRtZElxTFJOblIyZHJSTVUyMHBXbGFnZWdSQmdNZWpySW1yUkliR3o4MitHMnFhdmpuWCtNalNRcGthSTFjbE1wVWd5MzdJc3F6Sk5KbE1HcjZNRkdjK3JSWVZOc1daVDNOYmxFL0tVeGhscWxQMUtwdDJzbmdrU1VJc0ZrVjNkMWZUanFxdEZncFVoeWlLRUFRQm1VeFc2eTlkVEhOdU9ia3FXWVJjUG1YbEk2L1hpMkF3aUV3bWcxUXFoVlFxaFhRNlhiVGYvUHQ4dVNyTjQyU0ZYWDBlSmMwdWNUcDVzMUk2VC9udG1pSEtKNlh4K2J3SUJrTUlCb1BhWXVzcWhlZXkrdlZrSzJ1NjlYcTk2T3pzMEo2VVluYnNWb1VDTlVHU3hOd1FiN2tvS2pXWG9yNkNNWTg0bGMvMVlzMXZsOXV6N3ZpU3RuQXpJQ09aVENHZFRta2plOTAweXRZc3pVM1JFTVZaYVI0bHpjNG9ueFFqU1JLQ3dRQ0N3UkJDb2FEMi9HUDFuRlo3SGhlelNIc2dFRUJuWndmYTI5dXE3Rk50SFNqUU1naUNBRW1Ta00xbXRVZWRsYXQ4eTBlY2hUTFZiNlBzSjcrTlB1ck5QM05QL1FkU1phcUt0WGkvRkdjemlMTVpvM3hpUkcxMVV2c3lqUXUyMS83OExkVDM2ZkY0RVltRUVJMjJGL1dya21JbzBBcFFSQ3JrQkphUFNJc3JuWVVqVG1PVXF1WXAzcTZVZ0pYbVhoKzhYaC9DWWFVTTZYUUt5V1JLYS9iTmw4MFpjZGFyaWJDU2l0N0pVYlptYVJRbjBSTUkrSFBDVkY3R2hRYUt6MlB4RW5tMWVPeVhzZWxXa2dRRUFrRzB0N2NqSEE0WDFEMmtIQlJvbFNpTHpBdFFPOUJWbVM0Y2NSWlh4b1ZmMU9KS1NObFg4ZUFrNDRZZWp6ZDM1eXJvSXRTOFZKWG5tMUtjclRvZ3ExNFJQTVZaSGxFVUVRZ0VFQXJsaGFtdWlLYmM1S28zMklWU0xQODBrMXJoOS92UjFoWkdKQkxXTlJXVGFxQkFGNEhTTHlCQUVHU3RpVmRKVjNQb0t6UjkzMmgrSDBaSkZ1WXBmRUtNOGZpbDlxTU1TUEloRkZJK3kyYXpXblNxaURXSmJPNzViRzRXWjcxRzBKcm55WmVydWp6R05JcXpOVkZscVo5V2twL2lBWmlmNjlwZ0ZwV1dHaEFrU1JMQzRSRGEydHJnOFhnWWJTNFNDclJHcU90S0trMjhhb1FwbE9qalZOTUszeGNLR0NpTU9Fc0p0ekNQc2hpK2tDdWJDTC9mRDcvZnIrMDdrOGtpbFVwcVVlcjh2Q3BWNnhXMldWb3ppck5lRVh6NVBFcGF2U0o0aXJOeVJGSFUraTNWbno2Zkg4YnpJeGQ4SjZxTEtrczlpTm9LZ2lBZ0dBd2dFZ25EN3c5UW1qV0VBcTB4Z3FBWG1Ucm9TTkNOWWdQVWY0UjhYck9JVTBrM1BpbEdSblZScWY1NXFNWjlTNUlJU1FvZ0VBaHErVE9aREpMSnZGVFQ2U1JTcWZTQ2xicFptcDBWTnNWcGxzZDh1L3JKdFRsUkJ2RDVkVTJ4cWl3QnZTVHovNytsejB2MWl4ZFlSNUlrK0h3K0JJTitCQUpCU3JOT1VLQjFSUG1IVWY2cGxPaE9pVWlWQloyTEk4N0N5RkZOS3hibHdsRnA4WjJ3Y2QvR05HVTdaUWg5RUtGUVVFc3o2MU5WUi84YUY1MXdaelJVQzdtYXk5WXNUL250cXJzUnNYNnpzbkFlOCsxYVZaeGVyeGVCZ0Y5cnBWR0U2WWZQNThzMWhRTDU4MnAyZnExUmJkOW51UUZGeWtCSEVUNmZENkZRTUxmSWdrQngxaGtLMUNiVWYwUkZPcG1jTEpGYjBjTzRXQU9nUm8rQTlhaTBlTHY4Zmd2bGF4U3BQazNwVS9WcGZhcDYyU3Q5cWtyRXFvOWMxV1pzSSs0U1orVlNiRDF4Vm5JK0d3MlB4NE5Bd0ovcm0vVG4raWtWV2ViWHhUYVRaT0hmWFg1SnZNVTJ2VmEzdlF5UFI5S2txZndkbEthZFVLQU9va1IzeW9wSHFrd0I5Ym1sYWg1QWtXTHBxTFF3Y2pXVG9qNjlNSUxWNzlmODRlTEZlUVJCV1NYRjUxT20wK2pMb2k1TG1CKzBsQi9BWkxidWJ6T0kwMHF6YlBWNWxEU0sweHhKRWhFSUJEVTU2Z2YwcUtOTWpVMnVSbUhtV2V5NnNmVkRsaFZwcXBHeUtLb0RHWjB1V1d0Q2dicUV2RXd6T1VGSkVFWEJJQ2JBWEpUNlNyUndzZnRTMjZseWxXV2hvSUpRcCtVWSszTE5vMWFZcHVtWEpWVFM4aG5OUmdRcmdsVitxcU9EZFh0ZXNLSTNGeDdGV1dxN1JoYW5PaUFtRU1nUDRsRkh2eXBUdVJUeTNRdWxKRm5UVXFId2UyTXM4MktqMG56enJOS3NyTzZET0EwRjZrS1VKUVRUeUdRVTZRbUNBRkVVSVVsS0UwMWh4S2xzQTR5eEUxOEFBQ0FBU1VSQlZKaFgva3E2VWE2Q2FXVnNUQytNVW8zUnJMNnNnbEErVGY5ZUdlN3ZONnh5b2wrQlNYazZUZjVKTmNwTGZaOHlQQkt1Y0g2cmVxemljMUNkT0t1VG9qdkZXYXNJM2c3VXRhQVZRWGkxR3pBbHpmamU3L2NYbGJPdzZiWEVVYkM0cUxLK1RiY3E2ajVFVVlMWDY0SFBwOHp2cGpUZENRWHFjdFNSdk5sc0JxbFVmaUVIUmFpU05qSGJ2UG0yOEIrdTFLSVA2amI2NDVvTHQ3eUVGeEp3WVFSY1dHYWxyOHJqOGVTbTNCakxyNjlFQkVGNUJKMit1VGovdS9vK3BmczliWmlybXo4dXhWa3FiVEdvOGxPakpwL1BWeURKdkN3TG55cVNMM1B4a25hbEZ4OG9QZmZSamFobFU4cXIzR0FxQzZKNEtNc0dnZ0p0TUJTWlpyVW50Z0RLcUY2UFI5SUpOUzhIZlhSWFhJa0xCZElzamh5Vi9jTkNXaVh2UzB2VzdIM2hQa1JSTUczV0tseFRXSDJ2UkxKNXFlWmZhYTBaT1MvaVRJbDVzZmFMYytGbTJmcUtVeFJGaUtLb0U2SWZmci9QSUVkVmpLb29peGNmTjY2K2svK3NmZ3NNTEV4aFZGbXRnS3R2dXBYbERMSlpXV3VXOWZ2MUxUR1VacU5CZ1RZNDZxamVaREtkRTR3QVVaUnk4endsYmZERVFwR2o4VDJLMHRSOWwwc3piN3JONzh0c1pIRngzNnorYnlzdFdiTUllU0VoZXp6S0E4MlZybGxWcnNYUzFaZEJmYlNkL21jbWs5RnVZdkt2TERLWnRQYTUrdFFjZGUza2JEYmZtZ0FvRHlkUTMrZno1RmUwVWg5Z29HKytWMFdtdkNSSWtnQkJ5S2VwZVFUQm1MOHdqN3BQczVmeE15RTM1VW92K3NMbzBIenhBQ3RTck9YaUFhWDJzZGltMjJwUnJxUFNyeStLWXU3bVF0MHZhWFFvMENaRG5iZXBlNHdvMUtmS2lLSUlqOGNEU1pLZ0xyQlFYVk50WHE3bG0ycUJTaVZwOGhjWTlyZFFKR3QrRGtwdlk5YUViU1prRlVsU0hueXUvazFxNWFmZlIvNm1RUy9qZkI3ampVZnhQdlRiRjZicHR6VjdwSlJaLzEveGRJeENBUnJ6NnB1eUMrV1lUeXRGZFZGWUxlYytPa0VwQWNzeWNqZFdHU2gvajVpN2lWWEhMakRDYkVZbzBDWW4zNGVhTFdpZUVyUUlWZTJIcXFSWjFpeXRlc0hKT2hrQSthWm1vZWg5UG4vKy9XS2kwSHdaUzI5alJkSzF3YXlzeFlPMEtwRkl1VWh1c1UyVmJ1dGJyTmVEcE11aERtWlQ5Nk5FK1lJV3haUFdnQUp0UWZSU1RTYVRtSnViZ3l3cmZZcnFJQjc5NEE2ZzJxWmFBQ2d0U2JOdGNudENvVURNeTE4dW9peVhYbjcvNWxHbzhtUWQ0L0ZLQ2RkOC8yWVNyT2J6U25BeU1sdHMwMnM5bW01ck42QkkxdnJKTXhrbHVsUmxLUWlBdXFvWWFVMG9VS0toQ25WK1BnbDlVNnc2UUVrdlY3VlphbUVCTGh3UkFndjNmeGEvTDVST2NVU3BGMXZ4Z0tsQ0NWY1NoUnJGV2txeWJtQ3hmWDMxR0VDeitQN00rcUY4OTlYUjJobkQwcHNLZ3Jab0Fmc3ZpUW9GU3NvaXkxbWtVa3Jsb3U4VEV3VGt4T3FGeHlQcDV1b3BhM0FxK1FxWEhheE9rcmxjS0YxaFZkT1VXOG4rYXNsQ1FsNG9HcllXbFpadnVuVlgwMnM1NnRQM0tSaWVRS1NLTXB2TlFoREVFbjNXaEpTR0FpV1drR1U1Ti8xRDZRZlNEeW9xYkFaVzVacGZUcTM4YUZ4MVArWlJZNkZ3RnlwbjZTaDBvZWg0b2FiaWhZNXZSOU50ZlNrdjRHcWp6TVVPS0tvVWRZcVhPalVwbmM1b3phL3E5ZFVQNUhMM05TQnVoZ0lsTlVlZFo2bjJyZW9GcTBTdEhtMUtpVjZ3WHE4bko3bDhKYnF3Tkt1TFFpc2ZRRlE2UWl5Zlo2SG1YT3NSY0NVRGlxb2ZFRlRidVkvMVJybHhVNWFBVk9meHFvSlVJa3AxVUk5U1ZuMFRMRDFKYWcwRlNteEZYU2xJd1RodlVKMWM3dkY0TmNHcXE5Y29ndlhsK3FITWhicVlBVVdsSXRWcVJ1eGFpVktMeStyMnFMUThpKzM3bE9Vc0VvbjUzQnJKU25OckpwUFdsbmcwRjZReHFpVEVMaWhRNGhxVU9heDV3WnJOYlJSRkFaTGswZVpuS3RHc1ZMTFp1SGhBVWVrQlJKWDNVMVl5NE1oSkZ0djNXYnNCUmJJc2E5R2k4dE80N0tLNitFUTZuWUg2bUQvbG1Qa1RhbHpzd2xVbm1yUTRGQ2hwS0pRVmdKSUF6QVdyLzEyV1pXMmVxL0xUQTBsU0Z1aFdvbHhKbXd1ckxqQ2hGM1A1L3MxeXNxMThnRkJsL2JqVzVvSWFzZDcwS3N2UUxlaWZqd2JWbi9xbEVaV2xFalBJWnBVYklXVTFwWHlaOWVVdi9KMkNKSTBHQlVxYUd2Mnllb0FhU1pYK1haOG1pbEl1NHBWTVgvcnBQV3FhT3BGZVhSSlBtVE9JM0NoUHdiQkVYdm5mMWZlQ3RyeWZmdjZ1c3V4ZkZyS2MvNzN3dlg0Qmpmem5jcTdQTVAra0crVjNkVW5DTk5KcGRkbENaWWxDV1ZZZk1XZTJFcFA1aWt1RnF6TVIwb3hRb0lTVVFCR0lNbWlsY0RCVW9XeExmNjZQamhmNjNQejNhaUkzNCsrbFB5OFc0RUtmRTBJSzRUSWFoQkJDaUFVb1VFSUlJY1FDRkNnaGhCQmlBUXFVRUVJSXNRQUZTZ2doaEZpQUFpV0VFRUlzUUlFU1FnZ2hGcUJBQ1NHRUVBdFFvSVFRUW9nRktGQkNDQ0hFQWhRb0lZUVFZZ0VLbEJCQ0NMRUFCVW9JSVlSWWdBSWxoQkJDTEVDQkVrSUlJUmFnUUFraGhCQUxVS0NFRUVLSUJTaFFRZ2doeEFJVUtDR0VFR0lCQ3BRUVFnaXhBQVZLQ0NHRVdJQUNKWVFRUWl4QWdSSkNDQ0VXb0VBSklZUVFDMUNnaEJCQ2lBVW9VRUlJSWNRQ0ZDZ2hoQkJpQVFxVUVFSUlzUUFGU2dnaGhGaUFBaVdFRUVJc1FJRVNRZ2doRnFCQUNTR0VFQXRRb0lRUVFvZ0ZLRkJDQ0NIRUFoUW9JWVFRWWdFS2xCQkNDTEVBQlVvSUlZUllnQUlsaEJCQ0xFQ0JFa0lJSVJhZ1FBa2hoQkFMVUtDRUVFS0lCU2hRUWdnaHhBSVVLQ0dFRUdJQkNwUVFRZ2l4QUFWS0NDR0VXSUFDSllRUVFpeEFnUkpDQ0NFV29FQUpJWVFRQzlnbTBMdDM3MGJzT2hZaGhCQlNiMndUNlA3OSsvZWNPblhLcnNNUlFnaHBNYTVmdjQ2REJ3OCtaTmZ4YkJOb0lCQ1kvUERERC9IT08rOGduVTdiZFZoQ0NDRXR3TkdqUi9ITFgvNFNQcDh2WmRjeFBYWWRLQktKM0FPQUN4Y3U0TTZkTy9qdWQ3K0xhRFJxMStFSklZUTBJZlB6OC9qTmIzNkRxMWV2UWhBRWRIUjBqTnQxYk5zaTBMNit2bUVBRUFRQnQyL2Z4dC8vL2QvajZ0V3JkaDJlRUVKSWszSG56aDM4d3ovOEE2NWN1UUpBOFV0Zlg5ODl1NDV2bTBBM2JOaHdQUkFJQUZEK3lQbjVlZnppRjcvQW9VT0g3Q29DSVlTUUp1SDgrZlA0OFk5L2pQSHhmTURaMjl1TFNDUXliMWNaYkJPb0tJcHlmMzgvQUVXZ0tvY09IY0pQZi9wVFRFMU4yVlVVUWdnaERVbzZuY2IrL2Z2eDl0dHZJNVV5ZG5ldVhyM2ExckxZT2c5VS9lTUVRWUFvNWc5OTdkbzEvUENIUHdSSDZSSkNDQ25GalJzMzhOcHJyK0hFaVJOYW1qNGdXN1ZxbGEzbHNWV2dHelpzUUNTaVRBY1ZCTUh3aHllVFNiejc3cnQ0NDQwM01ERXhZV2V4Q0NHRXVKaGtNb25mL3ZhMytNbFBmb0t4c1RFdFhlK1FKVXVXWU9uU3BiYVd5MWFCU3BLRXdjSEIvTUhGNHNPcjBlang0OGZ0TEJvaGhCQVhVc29KZW5rQ3dNNmRPKzBzRmdBSGx2TGJ0R2tUd3VFd0FPVUVTSkpVbENlWlRPSzk5OTdENjYrL2JyamJJSVFRMGhyTXo4L2oxNy8rTmZidDIyZmFLcWx2eFZ5MmJKbnQvWitBQXdMMWVEeDQ3TEhIOGdVUVJkTklGRkJXbGZqYnYvMWJIRDE2Rk5sczFxNGlFa0lJY1pETGx5L2pyLy82cjB1T2k1RWt5UkNCN3RxMXk2NmlHYkJ0SVFVOW16WnR3dWVmZjQ2NXVUa0EwS0pRTTBtbVVpbnMzNzhmSjArZXhIUFBQWWVCZ1FGYnkwb0lJY1FlN3Q2OWkvMzc5K1BTcFVzbDh4UzJXdmIzOTJQbHlwV1FaYm5leFN2Q0VZRjZQQjVzM2JvVkJ3NGMwTklrU1lJc3l5VlB3cDA3ZC9DVG4vd0VBd01EZU82NTU5RGIyMnRYY1FraGhOU1J1Yms1ZlB6eHh6aDI3RmpaMWtaSmtpQ0tvc0VWVGtXZmdFTUNCWURObXpmajdObXp1SGRQV1RSQ0VBUjR2VjZrVXFteWR4SlhybHpCMWF0WE1UZzRpR2VlZVFhaFVNaXVJaE5DQ0traDJXd1dSNDhleFlFREI1QklKTXJtTmV2dVc3Tm1EZnI3K3gySlBnRUhCZXJ4ZUxCbnp4Njg4Y1liMm9rVEJBRStudy9KWkxMc0NaRmxHVjk4OFFYT25EbURiMzNyVzlpK2ZUczhIc2YrRkVJSUlWVnk0Y0lGL1BhM3Y5V0NxSEpJa2dTUHgyT0lUbU94R0o1Ly92bDZGbkZCSEgyZ2RqUWF4WXN2dmxnMEhObnY5NWNjV0tRbmtVamd2ZmZldzEvOTFWL2gvUG56OVNvbUlZU1FHakV5TW9JZi9laEhlT09OTnlxU3A4ZmpLUXFRZkQ0ZlhuNzVaYWpMd3pxRjQySGJpaFVyOE9TVFQrS1RUejdSMGdSQmdOL3ZSektaUkNhVFdYQWY5Kzdkdzc1OSs3QnMyVEk4L2ZUVGVPQ0JCNHFrVEFnaHhEbEdSMGZ4OGNjZjQrelpzeFUzdWZwOFBxM1BFOGpQL1h6eHhSZlIxZFhsV05PdGl1TUNCWUJISDMwVXQyL2Z4c1dMRndFb1RiUjZpVmI2L05EaDRXSDgrTWMvUmw5Zkg1NSsrbWxzM0xpUklpV0VFQWNaR1JuQlJ4OTloUFBuejFjc1BMVTdUMjJKMUcrM2E5Y3VyRm16eG5GNUFpNFJLQURzM3IwYlkyTmp1SFhybGlIZDcvZERFSVNpUllQTGNmUG1UZXpidHc5TGxpekJNODg4ZzAyYk5sR2toQkJpSS9GNEhCOSsrQ0V1WExoUTFYYUNJQ0FRQ0VBUWhDSkozbi8vL2RpMmJac3I1QW00U0tEcW9LSjkrL1poZG5iVzhKblA1NE1rU1ppZm42L3F4STJPam1MZnZuM282ZW5CTTg4OGc0Y2ZmcmlpdmxWQ0NDSFd1SDc5T2o3NDRBTjg5ZFZYVlc4clNaTFdyNm12NndWQlFFOVBENTU3N3JtYWxiTVd1RWFnQUJDSlJQRHFxNi9pbi83cG56QTJOcVkxNVFLS1lDVkpRaUtScUtoZlZNL3QyN2Z4ai8vNGovamdndy93OU5OUDQ1RkhIdUdvWFVJSXFTRmZmLzAxM24vL2ZlM2gxdFhpOS92aDlYb0JvQ2hRV3Jac0dmYnMyZU82ZXR0ZHBRSFEzdDZPVjE1NUJiLzYxYTh3UER4cytFd1VSWVREWVNTVHlRWG5ESmx4NTg0ZC9PeG5QOE03Nzd5REhUdDJZTWVPSFdodmI2OVYwUWtocEtYSVpESTRkZW9VRGg0OGlIZzhibWtma2lRaEdBd1dMWkNnTnVHdVhic1d6ei8vdkdFd2tWdHduVUFCSUJBSTRIdmYreDdlZSs4OVhMcDB5ZEIvS2NzeS9INC9QQjRQWm1kbkxhMlJPejA5amYzNzkrUEREei9FNXMyYjhjUVRUeml5RURFaGhEUWlFeE1UK095enozRGt5QkZNVDA5YjNvL2Y3emR0c2xVWkhCekVFMDg4VWZKenAzR2xRQUhscnVURkYxL0VKNTk4WW5oNHF2N3p0clkySkJJSnpNL1BXenBHSnBQQnlaTW5jZkxrU2ZUMzkrT0pKNTVnOHk0aGhKVGc2NisveHFlZmZvb3Z2L3h5VVEvNFVGc1RDeGRIVUJFRUFVODk5UlFlZXVnaFY0cFR4ZldtK05hM3ZvVm9OR3BZTjFmdEd4VUVBYUZRQ0Y2dkYzTnpjMVgzamVxSngrUFl0MjhmM25yckxXemZ2aDI3ZHUxQ05CcXR4WjlBQ0NFTlN6cWR4b2tUSi9EcHA1OWlhR2hvMGZ2eisvMkdKVmdMUjl2NmZENTg1enZmY2MxVWxYSzRYcUFBOFBEREQ2Tzl2UjN2dlBPTzZaeFFyOWNMcjllTCtmbDV6TTNOTGVxa1QwOVA0LzMzMzhlSEgzNklUWnMyNGJISEhzUDk5OS9QMGJ1RWtKYmk5dTNiT0hyMEtJNGNPVkkwTThJS1hxOFg0WEM0N0lORFFxRVE5dXpaMHpBUEMya0lnUUxBZmZmZGg3MTc5K0s5OTk3RDZPaG8wZWVDSUNBWURDSVFDR0IyZHRiU0lDTTkyV3dXcDArZnh1blRweEdKUlBEb280OWljSEFRUzVjdVhkUitDU0hFcmN6T3p1TFVxWk00ZHV3WXJsKy9YcE45U3BLRVNDUUNuOCtuaWROc2p1ZUtGU3V3ZS9kdVJDSVIxMGVlS2cwalVBRG82T2pBSzYrOGdtUEhqdUhvMGFQSVpESkZDeVNJb29pMnRqWUVnMEhNek13Z21Vd3UrcmpUMDlNNGNPQUFEaHc0Z0tWTGwySndjQkNQUFBJSUlwSElvdmROQ0NGT2tzbGtjUEhpUlJ3N2Rnem56NTlmVkZlWUhyV2ZNeGdNQWlnZUJLUksxT3YxWXRldVhkaThlYk5wUGpmVFVBSUZsSk8rZGV0V0RBd000TjEzMzhYZHUzZE44M2s4SHNSaU1TU1RTVXhOVGRYc1N6RXlNb0szM25vTHYvNzFyN0YrL1hvTURnNWl3NFlOSEhoRUNHa280dkU0amg4L2hwTW5UOWFraVZaRkhadWlEekJLU1hINTh1WFl2WHMzMnRyYUdrcWNLZzFiNjNkMWRXSHYzcjA0Y3VTSTRTR3Mrc1VYQUtYRDJ1LzNZM1oyRmpNek00c2FPYVlubTgzaXdvVUx1SERoQW9MQklCNTY2Q0U4L1BBV3JGNjlpc3NHRWtKY3lmajRHRTZlUEluang0L2o5dTNiTmQ5L01CaEVXMXNiSkVrQ2dLSytUalhxOUhnODJMRmpCeDUrK0dFdFh5UFNzQUlGbEl1eFk4Y09EQXdNNEwzMzNzUFkyRmpKZkpGSUJPRndHSE56YzVpZW5xNVpSQW9vVDFNL2N1UUlqaHc1Z2tna2dnY2ZmQkFiTjI3Q2ZmZXRnU2hLTlRzT0lZUlV5NTA3dDNIMjdGbWNQWHZXOG1JSEM2R0tVMTFKcUZ5Z3NtelpNdXpldlJ2dDdlME5LMDZWaGhhb1NtOXZML2J1M1l2RGh3L2o1TW1UeUdhelJZc3ZxTk5ld3VFd3d1RXdFb2tFcHFhbXFscWt2aEttcDZkeDlPaFJIRDE2RklGQUFCczJiTURHalJ1eGJ0MDZTRkpUbkc1Q2lNc1pIaDdHdVhQbmNQYnMyYUlIZE5RS3RUNXRiMjgzZldwS0lWNnZGMXUzYnNXV0xWdE1CeEUxSWsxVG8wdVNoTWNmZnh5Yk5tM0N3WU1IY2ZYcVZjUG4rcVpkZGNSdUtCVFNSR3AxTVlaeUpCSUpuRGh4QWlkT25JRFA1OFA2OWV1eGNlTkdyRisvSGo2ZnYrYkhJNFMwSnJJczQvcjE2emgzN2h6T25UdFhzald1Rm9paWlQYjJka1FpRVlNNHpacHExZndEQXdQWXVYTm5RNDJ3cllTbUVhaEtMQmJEU3krOWhKczNiK0xRb1VORjYra1dvb28wbVV4aWNuS3lwcDNwZXBMSkpNNmNPWU16Wjg3QTQvRmc3ZHExMkxCaEE5YXVYWWUydHJhNkhKTVEwcnlrMDJsODg4MDFuRHQzSHVmUG4xdlVrbnFWNFBGNEVJMUd0ZnFxMUZ4T1BTdFhyc1RPblR2UjNkMWRVZjVHbytrRXF0TFgxNGZ2Zi8vNytPYWJiM0RvMEtHU28zVlZmRDRmZW5wNmtFNm5NVEV4Z1ptWm1icGQ3SFE2clExQUFvQWxTNVpnN2RxMVdMdDJIVmF1WEFtUGgvMm1oSkJpN3R5NWc4dVhMK0h5NVN1NGR1M3JtbmRCbWVIeitSQ0x4YlJSdGVYbWNxb3NXYklFTzNmdXhMSmx5NXBPbW5xYVZxQXFxMWV2eHVyVnEzSHg0a1VjUG54NHdiczByOWVMbnA0ZWRIZDNZM3A2dW03TnUzcEdSMGN4T2pxS2d3Y1B3dXYxWXZYcTFWaTdkaDNXcmgxQVoyZFhYWTlOQ0hFdmlVUUNWNjkralN0WEx1UHk1Y3VZbUppdzViaWlLQ0lTaVNBYWpjTHZWN3FiekNMSVFvbDJkblppKy9idFdMTm1qYlpOTTlQMEFsVjU0SUVIY1AvOTkrUFVxVk00ZnZ3NDV1Ym1BQlJQZTFGUjIvbWowYWcybDNSeWNySm0wMkJLa1VxbGNPblNKVnk2ZEFrQUVJdDFZTzNhQVF3TURHRE5tdnZnOC9ucWVueENpSFBJc295aG9TRmN1WElGVjY1Y3dkRFFVTjNySEQzQllGQnJwbFhyeFVxT0g0bEU4TmhqajJIRGhnMEFtbCtjS2kwalVFQ1I0aU9QUElMTm16Zmp4SWtUT0hQbVRFVjludW9qZDNwNmVqQTlQWTJKaVltNjlaVVdNajQraGkrKytBSmZmUEVGUkZGRWYzOC9WcTVjaFpVclYyTEZpaFhhc0hGQ1NPT1J5V1F3TWpLQ29hRTQ0dkU0cmw2OXV1aGxTS3RGN2R1TXhXS0c1ZllLbjh1cG9uOGZEb2Z4MEVNUFlmUG16UldOeEcwMldrcWdLbDZ2Rjl1M2I4ZldyVnR4OGVKRm5ENTlHbmZ1M05FK0x4V1ZDb0tBdHJZMnRMZTNJNTFPWTN4OEhCTVRFNllMM05lRGJEYUw2OWV2YTJ0VUNvS0F2cjQrckZ5NUVpdFhya1IvL3dyRFV3NElJZTVpWW1JQ3c4TkRpTWZqR0JvYXdzMmJOMnM2SjcxUzFMcXNvNk9qcUcrekVucDdlN0Y1ODJhc1c3ZE9FMm9yaVZPbEpRV3FJb3BpYnRHRGpSZ2VIc2J4NDhkeDQ4WU5aTFBaSW9rV3Z2ZDZ2ZWp0N1VWdmJ5OW1abVl3T1RsWjB5VURLMEdXWll5TWpHQmtaQVJIamh3QkFIUjNkMlBGQ2lVNlhibHlKVWY0RXVJUXFWUUtOMi9leFBEd0VJYUdsRmU5UjhvdVJDZ1VRalFhUlVkSGgvWlVGS0QwT3JWNlJGSEV5cFVyc1dYTEZ2VDE5YldzTlBXMHRFRDFMRisrSE11WEw4ZjA5RFNPSHorT3I3NzZxcUtGNk5WVmp0UStnNW1aR1V4TVRHQnljdEsyeUZUUG5UdDNjT2ZPSFp3NGNSd0FFSTFHc1dMRkNpeGYzbysrdmo3MDl2YnkwV3lFMUlHeHNURU1EUTFoZUhnWXc4TkR1SFhybHEzOWw2V0lSQ0tJeFdLSVJxUHdlcjBHOFpVVG9DcFJ2OStQZGV2V1ljdVdMUWlId3d0dTEwcFFvQVcwdGJYaHFhZWV3cTVkdTNEbXpCbWNQWHNXVTFOVEFJcWpVTE9tWGxXbWdQSm9vSW1KQ1l5UGo5c3kzTnlNaVlrSlRFeE00TXlaTXdDVXU4aWVuaDcwOVMxRlgxOGZsaXhaZ3A2ZUhpNDVTRWdWSkpQSlhPdlBzQ1pOZFdDaTAraWJaNlBScVBhZ2kyb2p4cmEyTmp6NDRJTjQ4TUVIdGJFV0ZLY1JDclFFSG84SFc3WnN3Wll0VzNEMTZsV2NPWE1HbzZPalZYMkJ3dUV3SXBFSSt2djdNVHM3aS9IeGNZeVBqOWQ5V2t3NXN0bXNObTNtMUNrbFRaSWtkSGYzb0srdlQ1TnFkM2MzSTFWQ2N0eTlleGNqSThNWUhoN0d5TWd3N3R5NTR5cVppS0tvTmMzR1lqRkQ4Mnk1S0xpd3FWYTl3ZDYwYVJOV3IxNWQ3MkkzUEJSb0JheFpzd1pyMXF6QjdPd2NMbDY4Z0t0WHIySjhmQnhBWlZFcEFHME4zdjcrZmlRU0NZeU5qV2tMTmpoTkpwUEI2T2hOakk3ZU5FaTF0N2NYUFQwOTZPenNRa2RIaDNaSEMvQnBNNlE1bVorZngvajRHTWJHeG5EMzdqMk1qdDdFeU1pSW96ZTlwVkJIejNaMmRocWtXVzVaUGJQM2dOTFZzMnJWS3R4Ly93TUloemtRc1ZJbzBDb0lCb05hVkhydjNqMWN2SGdSMzN6elRkWER6dFhsQS92Nys1SEpaREE1T2FrMXRicmxIMVVkWGo4eU1tSklseVFKc1Znc0o5Uk9UYXl4V0FjQ2dZQkRwU1drY3JMWkxDWW1sTmFnc2JFeDNldWViZFBUckNBSUF0cmIyeEdMeFJDTHhRejlrVmFpNFVBZ2dQNytmcXhmdng2ZG5aM3FVV3BZNHVhSEFyVklSMGNIZHV6WWdlM2JkMkJvS0k0clY2NWdlSGdZNlhTNjRxZ1VVSVRVMmRtSnJxNHVDSUtRdXdNZTE0VHF4RUNrY21ReUdkeTllOWQwYWNSZ01LakpWQy9XYUxRZGdzRG1ZR0l2TXpNekdCOGZ5MFdVNDFwa09URXg0YXJtMTNLRXcyR3RXVFlhalJaRm1hV1cxQ3Uxeko3WDY4V1NKVXN3TURDQXBVdVhnWTh1WGh3VWFBMVFSL0NtMHhsY3UvWTFybDY5aW52MzdsbStLK3pyNjhQU3BVc2hDQUttcHFhMHZ0UEp5VWxYLytQUHpjMWhibTZ1YUFGL2RWVW5SYXd4eEdJZDJsMTBNTWptSW1LZFZDcUo4ZkdKM1AvSVdDNnFWSDUzYXVEZVl2RDVmT2pzN0VSbnA5SzZveTVzQUZUWGw2bEhGRVYwZG5aaTFhcFZXTFZxTlNTSk43TzFnZ0t0SVpJa1lXQkFXWFl2a1pqSDVjdVhNREl5Z3ZIeDhZcWlVck0wZFRuQlZhdFc1WnFlSmpTWlRrMU51V0tZL0VKa3MxbnRKdURhTmVObnlrTFZlYUdxci9iMnFQWlVlOUxhWkxOWlRFMU5hYzJ1U2d1TklzclpXZWZIRUN3R2RhSDJXQ3lHenM3T29rVU5yTjR3cTRPS2xpNWRpb0dCdGZENTFCWExHSExXRWdxMFR2ajlmbXpjdUJFUFByZ1I2WFFLTjI3Y3dQRHdNTzdkdTZjMXk1WnIyalZEa2lSMGRYV2h1N3NiZ2lBZ204MXFTd3U2clErMVVwTEpKRzdkR3NXdFc2TkZuL2w4UGdTRElRU0RRZTBWQ2dVUkNDaS9xeitEd2FBMlZKODBCcGxNQm5OemMwZ2s1akEzbDhqOU5Idk5JcEZJdUxybHBWTDAwMHZ5TFRCQmd5aXJpVElMMzN1OVhzUmlNU3hidGd6TGxpMkR4K1BOTmRGU212V0N0WTROZUR3ZXJGbXpCcXRYcndFZzQvYnQyN2h4STQ2N2QrOFVEVUNxcHY5VXZjdU14V0lRQkFHQ0lHQnViazZMVXNmSHh6RTFOZFd3bFU4eW1VUXltY1RFeFBpQ2VTWEprNU5wd0NEWFFDQ2cvUXdFbEhTL253dnkxNE5rTXFrVFlzSWdSL1YzVll5cDFNS0xsRFE2YW5Pc0dsMnFmWmlxSkd1eGtrOHdHRVJYVnhlV0wxK09ycTR1QUFMN05XMkVBblVBNVhGcFBRQmt6TXpNSWg2L2dWdTNibUY2ZXRyMEg2b2FxUWFEUVlURFlTeGJ0Z3lDSUdpamZOV1JodVBqNHhXdHNOUm9aREpwVEU5UFlYcDZhc0c4Z2lBaUdBeG9VbFYrVnlUcjl3Y1FEQ28vSlVtQ0tJcmFUK1VsVmRWcTBFaklzb3hNSm9Oc1ZrWTJtMEUybTBFbWswVTJtMEVpTVorVFlsNk94cDhKUjlaMGRRdnFDTm11TG1YS1YyZG5KOExoY05HQW4wcjJVeTdLRkVVUm9WQUlQVDA5V0w2OEg4RmdBSlNtYzFDZ0RoTUtoYkIrL2YxWXYzNDkwdWtNUmthR2NmUG1UVXhOVFZrZWdhc1hyTWZqUVdkbko3cTd1d0ZBRytrN09UbXB2U1ltSmtyS3V4bVI1U3htWjJjdFQxa1FCS0ZBcmhJa1NUVDlxWXEzVU1MSzU4VjU5UHNXQkJHQ0FKM1Fzcm1YS3JiOCsydzJxOGxPVFZka2FNeXZwR1VNZVRPWkRES1pUTXRjLzhXaU5wV3FJMk5qc1JqYTJ0b2dpbUpObW1MTmp0Zlcxb2JlM2lWWXNtUkpiaEFRamVrR0tGQVhJVWtTK3Z0WG9MKy9IN0lNek03TzRPYk5teGdiRzhmTXpMVGhEcithcUxUd2M3VlpzNit2RDBEK0gxZy9IOVhwSlFqZGpDekxycHRlUk9wREpCSXg5Rm1xOHk4TG84cGFMcXd1U1JLQ3dTQmlzUTRzV2RLTFlEREV2a3lYUW9HNm1GQW9oRFZyN29QeWNIY1pjM01Kakk2T1lueDhETE96czR0cU1pc1VyaWlLV3RNVEFLMVBWYitlcnpvL2RYcDZ1aUZHL3hKU0tmcFZmZkp6bUdQYTR1c0FESDJYQzFGTmxLazJ5MGFqTWZUMjlpSVE4RU9WSlp0bTNRMEYya0FFQWdHc1dxVThUQnRRbGgyN2Rlc1dKaWJHTVRzN2kydzJhemtxTGZWZVhZSncrZkxsbWxRQlpaTDY5UFMwTnAxRy9kbEtUY0drc1ZEbkkwZWpVY1BQOXZaMkJJTkJBQ2dhNEZQTmtuZ0xOY1dxSStjRlFVQWdFRUEwR2tWM2R3Lzhmci8yT1drc0tOQUd4dS8zbzcrL0gvMzkvUUJrek04bmNmZnVYWXlQanlHUlNOUXRTdFEvd2swZHJLVCs4OHV5ckQzU1RSV3IrbmczcDUrRlNKb2ZkYXFJdm85U2ZZWERZVTFpZ0ZHU3F2Z1drbUMxcVB2eStYeUlScVBvNnVyT3pjbFVJMHhLczVHaFFKc0luOCtIcFV1WGFuMmJBSEx5bXNEczdDeVN5V1JOb3RKeTIrdnY4dFY4NmxOZDFBbnhrNU9UV2dTci9sUmZiQm9tNVpBa0NaRklSTHVCMC8rdUxNRFJicEJndGFOZ0M2a2txdFEzOGNxeURJOUhtVkxWMXRhdWxVZk5TNW9MQ3JUSlVadW9nUHpkc0RyNmRtNXVWaHNNWThjL3R5UkpXaitydmxMUlI3QnpjM09hVk5VbVlmWDNxYWtwek16TVVMSk5paWlLYUd0clEzdDdPOXJhMnJTWEtzaTJ0amFFUXFHU0EzaXFmVkIwcWZlVjVGZEhMMHVTaEVBZ3FKVmIvVnlmbHpRdkZHZ0xvbFpHUUw2aVVRV1ZTTXdoazhsb1V5dk1XTXdJNEhMNUJVRkFLQlJDT0J6R2tpVkxER0xWbDBVZnZacXRYak03TzZ2OWJMU1ZtWm9OdjkrUFVDaFU5RktmU0JRS2hReHlWR1ZWS01ScUJ2RFVtbXcyaTNRNkRVRVE0UGY3RVE1SHRQOGZDcksxb1VBSkFDQVNhZE90d3drQU1tWm5aekV6TTRQNStmbGNwQ3BEa2lSSDFxaFZwYXYyY2FuejdnQmpGRnNZMldheldTUVNDVTJxcWxqMXI3bTVPY3pQejJzckg4M1B6Mk4rZnA1VGVISklrZ1MvM3crLzN3K2Z6d2UvMzQ5QUlLRGQ3SVREWVZOSmhrSWgwNmVIQU9hRGRXb3BSeXRSWmlxVlFpcVZnaXdyZjdQUDU5UCtEdU5pQlpRbVVhQkFTVW5VU0FISVN4VUFrc2tVWm1lbmtVak1JNTFPUVJXcno1ZGZJcTlXVVdrNUt0bEczMmRXaVhEMWFRQ1FTcVUwc2VwZnFuQUxmeWFUU2QwQ0JzWlhmcVdmNHMvVUpzSENQTEtjdjJrcFhwREIvTDF4TVFiQmtFY1ZvVjZHcFg1NnZWNzRmRDV0Z1lCU3phYUY3K3V4bUVBbCtTc2RCYXZlRUdhek1pUkpPU2ZCWUJpeG1FL0xDVzdtYVFBQUlBQkpSRUZVbDl1QzAwaElXU2hRVWpWZXJ4ZlJhQXpSYUY2c3NxeFVvck96TTBna0VvYUkxZXYxd3V2MUxyRFh4Vk5yYWF0TmRvRkFvR1NmYmJWU0xwZS8wbjFWSXExUy9ZSlc4NnRscUxYMHl1VmZET2wwV210RmtHVVpvaWpsUkJsQ01CaldGaVpnVkVrV0F3Vkthb1lnQ0xubXZERFVhRlVWYkNhVHdmeDhBcWxVQ3VsMEpsZXBDVnJrNnZmN0t4S2NIWkd0VTlTaTdQV1duSjJVSzBzaWtkQUVtY2tvTndHaUtNTGpVYUptcjljSHI5ZHZFS1FxVFVKcUJRVktiRUVVSlFTRFlRU0RNdkoxb3F3VHJJeGtNcEdyRURPNWJVUjR2UjR0Q3F4SDMrdGlwVld2QVZWV3kxTnZhckdZd0VMNTg0ODZTK1NheExPNUd5NVZrRjZJb2dpZlQxbjAzN2hxajN2T0ZXbCtLRkRpQ3BUbTBrQXVFbFhTOGsySndNek1ITkxwTkRLWk5MTFpqQ1plUVZENi9Ud2VwYWxZMzcrblVtdkpPU2sxOWRoMk5xWFdJaXBOcFZMYVlDMjFEMUpaeEQ0THBiVkN5TFZJZU9IeGVITE4xUkw4L3FDdUdSdWdJSW1ib0VCSlF5QUlRcTR2MVZNa1dQWDNWQ3FEVkdvV1UxTXprR1VaNlhRcU54QUhFQVM5YkQzdytieTVaajZQSmw2djExdVRLTGZlVWFrWmRqWEZxb053MU9aVC9jQXF0WGxlSGZ5a2xFTzV1U2tjbktXbWV6eWdJRW5EUW9HU3BrUVFCSGc4K1lGTCttZzJuYzdrK21FVEtPeXJ6V1pseUhJbTk3dVFFeThBaUJCRlFSdk42dkZJa0NRUFBCNlBKbUd2MTJzWUdWczRlcmJVYXpIb0gwZVdqK3FLWC9wOHFWUWFxVlFTeVdRSzZYUUtxVlM2SUs4TVdjN21CaEFwNTBEcFExVE9RZUhnRy9WM1JaSWlKRW5rU0ZiU0VsQ2doT2hRbXc2VjN3RzlZTE5aT2RjL204SDhmTkl3dFVjL0dsbEJOb21VRi9vOHY3OThKQ1liZmhjRVVSZmRGVWR1eHQ5TGYxNXFjRTMrYy8wcm41Y1Frb2NDSmNSRkdBV3JpdEtRdytZU0VVSktZYjVXR3lHRUVFTEtRb0VTUWdnaEZxQkFDU0dFRUF0UW9JUVFRb2dGS0ZCQ0NDSEVBaFFvSVlRUVlnRUtsQkJDQ0xFQUJVb0lJWVJZZ0FJbGhCQkNMRUNCRWtJSUlSYWdRQWtoaEJBTFVLQ0VFRUtJQlNoUVFnZ2h4QUlVS0NHRUVHSUJDcFFRUWdpeEFBVktDQ0dFV0lBQ0pZUVFRaXhBZ1JKQ0NDRVdvRUFKSVlRUUMxQ2doQkJDaUFVb1VFSUlJY1FDRkNnaGhCQmlBUXFVRUVJSXNRQUZTZ2doaEZpQUFpV0VFRUlzUUlFU1FnZ2hGcUJBQ1NHRUVBdFFvSVFRUW9nRktGQkNDQ0hFQWhRb0lZUVFZZ0VLbEJCQ0NMRUFCVW9JSVlSWWdBSWxoQkJDTEVDQkVrSUlJUmFnUUFraGhCQUxVS0NFRUVLSUJTaFFRZ2doeEFJVUtDR0VFR0lCQ3BRUVFnaXhBQVZLQ0NHRVdNQTJnWjQ5ZTNhVlhjY2loQkRTbXN6UHozdnNPcFp0QWoxejVzeXVkOTk5RitsMDJxNURFa0lJYVNHT0h6K093NGNQUDJ6WDhXd1RhQ2dVR2p0Ly9qejI3ZHVIOGZGeHV3NUxDQ0dreVVrbWszanJyYmZ3eVNlZm9LMnRiZEt1NDlvbTBFZ2tjZzhBN3R5NWc5ZGZmeDFYcjE2MTY5Q0VFRUthbEx0MzcrTDExMS9INWN1WEFRQWRIUjBUZGgzYk5vR3VXclhxR3dBUUJBSHo4L1A0eFM5K2dVT0hEa0dXWmJ1S1FBZ2hwSW00Y09FQ1huLzlkWXlOalFFQUpFbkNzbVhMN3RsMWZOc0VldDk5OTQxR0loSGxvS0p5Mk04Kyt3dy8vL25Qa1VnazdDb0dJWVNRQmllYnplS0REejdBMjIrL2pWUXFwYVV2WDc0Y2ZyL2Z0b0UydGs1aldibHlKUUFsQ2xYNSt1dXY4YU1mL1FoZmYvMjFuVVVoaEJEU2dJeU5qZUVuUC9rSmpoOC9YdlRaNnRXcmJTMkxyUUlkR0JqSUgxak1IM3BxYWdvLy9lbFA4WnZmL0FiejgvTjJGb2tRUWtnRElNc3lqaDQ5aXRkZWV3M0R3OE5hdWo0Z3MxdWd0czJYQVJTQmRuWjJZbXhzRElJZ1FCQUVReC9vbDE5K2lXdlhydUU3My9rTzFxNWRhMmZSQ0NHRXVKUTdkKzdnN2JmZnhzaklpQ0ZkTDgrQmdRRjBkSFRZT3E3RzlwV0l0bS9mcnYwdVNaTGhCQUJLTlBxem4vME1iNzMxRnVibTV1d3VIaUdFRUplUXpXWng2TkFodlBiYWEyWGxDUUE3ZCs2MHMyZ0FIQkRvK3ZYcjBkblpxYjJYSk1rMDM1a3paL0EzZi9NMytPcXJyK3dxR2lHRUVKY3dPanFLSC8zb1J6aHc0QUF5bVl6aE0wRVFJSXFpSnRIMTY5ZWp1N3ZiOWpJNnNoYXVQZ29WQktHa1JHZG1adkN6bi8wTXYvemxMekUxTldWWDhRZ2hoRGhFT3AzR3h4OS9qTmRlZXcyam82T21lZlJqYUFSQndLNWR1K3dxbmdGYiswQlYxcTFiaHlOSGptaHpkMFJSaEN6THlHYXpwdm5QblR1SFM1Y3VZZWZPbmRpNWN5ZDhQcCtkeFNXRUVHSURaOCtleGZ2dnY0L0p5ZEtMQ1hrOEhrTS81d01QUElET3prNUgxaFJ3UktDQ0lHRDc5dTE0NTUxMzhnWHhlSkJPcDB0S05KVks0Y0NCQXpoNThpUysvZTF2NDZHSEhyS3J1SVFRUXVySTBOQVEzbnZ2UGNUajhiTDU5T05tWkZtR0lBallzV09ISFVVMHhSR0JBc0Q5OTkrUEN4Y3U0SnR2dnNrWFpnR0pBc0RrNUNSKytjdGY0dlBQUDhmenp6K1AvdjUrTzRwTENDR2t4a3hPVG1MLy92MDRjK2JNZ25rbFNUSTAzUUxBbzQ4K2F2dklXejJPUGcvMGhSZGVRRWRIaC9aZUVBVDRmTDZTZmFKNmhvYUc4TU1mL2hBLy8vblBNVEZoMjlLSGhCQkNGa2t5bWNTSEgzNkl2L3pMdjZ4SW5sNnZGeDZQTWQ1YnVYSWxubnp5eVhvVnNTSWNpMEFCd09melljK2VQWGpqalRlUVRDWUJLR0c1eitkREtwV3E2TkZuWDM3NUpTNWN1SURISDM4Y3UzYnRRaUFRcUhleENTR0VXRUNXWlp3OGVSTHZ2LzkreFFORGZUNWYwWlNWYURTSzMvM2QzeTFLdHh0SEJRb0FIUjBkZU9HRkYvRG1tMjlxYWJJc3crdjFRaEFFd3pxSHBVaWxVdmpvbzQ5dytQQmhiYUJSTUJpc1o3RUpJWVJVU0RhYnhlblRwL0h4eHgvanpwMDdGVzJqdGtqcUY5d1JCQUVlandjdnYvd3lBb0dBNHc4amNWeWdnTEw4MHE1ZHUzRG8wQ0ZEdWlwUk5UcGRpRVFpZ1E4Ly9CQ0hEaDNDOXUzYjhjUVRUeUFjRHRlanlJUVFRaFlnazhuZ3hJa1RPSERnQU83ZHEvd2hLWUlnR0ZvVDlhSjg0WVVYME4zZDdiZzhBWmNJRkFDMmJ0MktPM2Z1RkMyY29FcTBtalZ5NStmbmNlREFBUncrZkJqYnRtM0RrMDgraWJhMnRsb1htUkJDaUFucGRCckhqaDNEZ1FNSE1ENCtYdFcyb2locThpeVU1TTZkT3pFd01PQUtlUUl1RWlnQVBQZmNjNWllbmk1YXNzbmo4VUNTSkNRU2liSWpkQXRKSnBQNDlOTlBjZVRJRVd6ZHVoVlBQZlVVMnR2YmExMXNRZ2doVUxyVGpodzVnazgrK2FUc1hNNVNlTDFlYlo2L1hwS0NJR0R0MnJXR1JYamNnS3NFNnZGNDhMM3ZmUS92dlBNT3JsNjlxczN6QVpTN2tsQW9oR1F5V1hHVHJrb3FsY0toUTRkdzlPaFJEQTRPNG9rbm5rQnZiMjg5L2dSQ0NHazU1dWZuY2Zqd1lYenl5U2VZbnA2dWVuczE2cFFrQ2JJc0YwV1lHemR1eExQUFBsdXI0dFlNVndrVVVDVDYwa3N2NGFPUFBzTHAwNmNObjZudDRsNnZGN096czFXSDhlbDBHa2VPSE1IUm8wZXhidDA2N05xMUN4czJiSEI4SkJjaGhEUWl0Mjdkd3FGRGgzRHMyTEdxQXhzVnI5ZXJEZm9zakRwbFdjYk9uVHV4YmRzMlU3RTZqZXNFQ2lnbjdwbG5ua0UwR3NXbm4zNXFFSndzeS9CNFBHaHJhOFBjM0Z4Rm8zUUxrV1VaWDMzMUZiNzY2aXQwZFhWaDE2NWQyTFp0RzBmdUVrTElBc2l5akxObnorTGd3WU80ZE9tUzVmMElnb0JRS0tUTjd5eVVveVJKK001M3ZvUDE2OWN2cXJ6MXhKVUNWUmtjSEVSYld4dmVlKzg5dzhsVm0zYkQ0VENTeVNUbTV1WXMzNW5jdlhzWHYvclZyL0R1dSs5cXpidDlmWDIxK2hNSUlhUXBtSnVidytIRGgzSG8wS0dxUnRTYTRmVjZFUXFGSUlxaTZiaVdRQ0NBbDE1NkNjdVdMWE5kMUtuSDFRSUZsQ1gvd3VFdzNuNzdiZE1tQXIvZkQ2L1hpN201T2N0TkNJQXk0T2l6eno3RFo1OTloclZyMStLSko1N0FndzgrV0xSMEZDR0V0QklqSXlNNGVQQWdqaDgvdnFnNkZzaEhuWDYvM3pDM1V5L0phRFNLNzM3M3U0akZZcTZXSjlBQUFnV0EvdjUrdlBMS0szanp6VGROUjNhSm9vaElKSUowT28zWjJkbUtWakFxeCtYTGwzSDU4bVhFWWpFODl0aGpHQndjZE9SWmM0UVE0Z1RKWkJKZmZ2a2xQdi84YzF5NWNxVW0rd3dHZ3dnR2c0YkY0QXZwNit2RG5qMTdHbVpGdVlZUUtBQjBkbmJpai83b2ozRGd3QUdjTzNmT05JL1g2MFVzRmtNaWtjRHM3R3hWVTE3TUdCOGZ4Lzc5KzdGLy8zNnNYcjBhZzRPUDRlR0hIMnFZaTBzSUlaVWl5ekl1WDc2TTQ4ZVA0Y3N2djF4MHRLbmk5L3NSaVVTMHgxYWFpVk1VUld6WnNnVTdkKzRzaWtqZFRNTUlGRkRXUk55OWV6ZldyMStQOTk5L0g5UFQwNllqYUlQQklBS0JBR1puWnhmVlA2cm4yclZydUhidEd0NTg4NSt3Y2VOR0RBNE9ZdDI2ZFFBNGdwY1EwcmlNam83aStQSGpPSEhpUkUwZnpPSDFlaEdKUk9EeitVekZxWXF5bzZNRHp6MzNuRGExc0ZIa0NUU1lRRlZXclZxRlAvbVRQOEZISDMyRWl4Y3ZtdVlSQkFHUlNBU2hVQWpUMDlOSUpCSTFPWFlxbGNMSmt5ZHg4dVJKUktOUlBQTElJeGdjSEVSUFQwOU45azhJSWZWbVptWUdwMDZkd3ZIanh4ZDhCbWUxU0pLRXRyYTJCZGVxRlFSQml6clY2TFRSYUVpQkFrbzBxZzV4L3VDRER6QTdPd3NBaHNVWEFPVml4bUl4cEZJcFRFMU4xYXhaQWdBbUppYncwVWNmNGFPUFBzS0tGU3V3WmNzV2JOeTRFZEZvdEdiSElJU1FXcEJNSm5IaHdrV2NPblVTRnk5ZVJDYVRxZW4rQlVGQVcxdGIwZnJqWm5NN1k3RVlubjMyV1czR1F5UEtFMmhnZ2Fxc1diTUdmL3pIZjR5UFAvNVlXMGUzVUtMcUk5SzZ1cnFRU3FVd016T0R1Ym01bXBianhvMGJ1SEhqQnQ1NjZ5MzA5L2RqNDhaTjJManhRWFIyZHRYME9JUVFVaW1KUkFMbnoxL0EyYk5uOE5WWFh5MTZnS1Vaa2lRaEVva2dIQTVyOVc2cDhTZjZxRk5kZGFpUmFYaUJBc3Fjb2VlZmZ4N3IxcTNEZ1FNSHlpNGw1ZlA1NFBmN2tjbGtNRFUxWldsRm8zTElzcXpKOUoxM2ZvTyt2ajVzM0xnUkd6ZHVSRy92a3BvZGh4QkN6SmlabWNHNWMrZHc5dXhaWEwxNnRlYVJwb3JYNjlVaVRyVU9MVmVYeG1JeGZQdmIzOGJTcFVzWHpOc29OSVZBVlFZR0JyQm16UnFjT25VS3g0NGRNenpCeGF4cHQ2T2pBOUZvRk5QVDA1aWVubDcwcUYwemJ0NjhpWnMzYitMOTk5OUhWMWVYSnRObHk1YlgvRmlFa05aa2NuSlNrK1kzMzN4VGw3cE14ZS8zSXhxTkloZ01GaTF3bzZJZlNSc01CdkhZWTQ5aDA2Wk5EVFhDdGhLYVNxQ0FJc2JCd1VGczJyUUp4NDRkdytuVHA4czJXNmg5cEtwSUp5Y242M2JIZHZmdVhSdzRjQUFIRGh4QU5CckRoZzBQWU4yNmRWaTllZzI4M3FhN0ZJU1FPakk2T29wTGw3N0MrZlBuRVkvSDZ5Nm1jRGlNYURScVdBU2gzREc5WGk4ZWZ2aGhQUExJSS9CNnZhNWN5M2F4TkcydDdmZjc4ZmpqaitQUlJ4L0ZaNTk5aGdzWExpdzRJcXk5dlIzdDdlMlltWm5CNU9Sa1RRY2NGVEl4TVk3RGh3L2o4T0hEOEhnOFdMVnFGZGF1WFl1MWE5ZWh0NWNqZWdraFJtWm5aM0hseWhWY3VhSXM5REkxTlZYM1k2b0RnMkt4V01VU0ZFVVJHelpzd0xadDJ4WWNpZHZvTksxQVZVS2hFSjU5OWxrTURnN2kwS0ZEdUhidFd0bjg2aGVtdmIwZHlXUVNVMU5UbUpxYXFtdVRTRHFkenYxalhNRzc3NzZMOXZaMkRBeXN4ZHExQTdqdnZ2c1FDSENSZTBKYWpXdzJpNkdoT0M1ZlZxUTVQRHhzbTR3Q2dRQ2kwU2phMnRxME5MTmo2NXRrUlZIRWZmZmRoeDA3ZG1qYk5iTThnUllRcUVwSFJ3ZGVldWtsakk2TzR1REJneGdlSGdaUTNEZXF4K2Z6b2J1N0c5M2QzWmlabWNIRXhFVE5SKythTVRrNWlSTW5qdVBFaWVNUUJCSExseS9Ed01BQUJnYldZdmx5OXAwUzBxeU1qNC9qeXBYTHVITGxDcjcrK212RE9JNTZJMGtTb3RFb290R290dmdCVUhwRXJaNysvbjdzMnJVTDNkM2RUZGxVVzRxV0VhaktraVZMOFAzdmZ4ODNidHpBaVJNbmNPUEdEZE5wTC9yMytxZzBsVXBoY25JU0V4TVRkUmtTWG9nc1p4R1B4eEdQeC9IeHh4L0Q3L2RqeFlxVldMbFNlUzFkdWhTU0pOVzlISVNRMnBMTlpuSDc5bTBNRGNXMS8vSEZQdVdrV3RRRloyS3hHQ0tSQ0FBVUNiQnc0SS8rL2ZMbHl6RTRPSWpseTVlM2pEVDF0SnhBVlZRQmpZK1A0L2p4NDdoOCtYSkZRdlI2dmVqdTdrWlBUdzltWm1Zd1BqNk82ZWxwMjc0ODgvUHp1SHo1RWk1ZlZwN0Q1L0Y0c0d6Wk1xeGN1UklyVnF6QTh1WDk4UGw4dHBTRkVGSTUwOVBUR0JvYXd0QlFIRU5EUXhnWkdiSDBQT05hNFBmNzBkSFJnVmdzQm8vSG8wbXoxQk5TOUhnOEhnd01ER0RMbGkySXhXSUFtcitwdGhRdEsxQ1ZqbzRPN042OUcwOCsrU1JPbno2TnMyZlBZbVptWnNHb0ZBQWlrUWphMnRxME9hV1RrNVBhdG5hUlRxZHgvZnAxWEw5K0hZRHl4Vit5WkFsV3JGaUJGU3RXb0w5L1JkSEtJSVNRK3BMSlpIRHo1azBNRHcvbHBEbGsraVFwTy9GNnZZaEdvNGpGWWdpRlFsVTN0VVlpRVd6WXNBR2JOMjh1dWI1dHE5SHlBbFVKQkFMWXRtMGJ0bTNiaGdzWEx1RFVxVk80ZS9kdVJkdXFjMG83T3p1UnpXWXhOVFdGaVlrSlRFMU4yZjRGazJWWm0zdjYrZWVmQTFDZVpMTjgrWEwwOVMzRjBxVjk2T25wMVo0Q1R3aFpQQk1UNHhnZUhzSHc4QkNHaDRjeE9qcGF0K2x3MWVEMyt4R0x4WXFrcVFZRUM4MU1rR1VaUFQzL1AzdnYvaVRIZGQxNWZzKzVtVm52ZmdCb0VJMEdLWktnSGhhbE1DbHJMSThZRXp1ZTNaajEvREMvVEFSKzJoODJZaU0yOWwvWW56WVk2MTJQSGV2eDJJNnhkK3kxd3hNZXo4NU1VR05MMXN1VVRFb2lMWEpOUGZnYWdpSklnZ0lKZEFOb29MdTZxK3VSbWZlZXN6L2N6T3FxNmpmUURZTEUvVVFVS3F1eUtpdXJBTlNuenJubm5qdUh6My8rODhYaUdaNTdYWndsNFZ0MEFpTENML3pDTCtBem4va01scGFXOE1vcnIrRDk5OThmKzBkWHNsMVVXc3AwZG5aMlRLYnI2K3RIV3NtN0d5c3JLMWhaV2NIcnI3OE93RmZMblRoeEFxZE96ZVBVcVZNNGRlb1VUcHlZZ3pGaDhmQkFZQyt5TE1PMWExZXh1TGhZWEs0TWUzSGZEZFJxdGVGM1VLMVdHMzd2SEVSNnpJejc3Nzhmdi9pTHY0aVRKMC91dW9ibnZVd1E2QzdNejg5amZuNGU2K3ZyZVAzMTEvSGVlKzhkNkQvS2FHU3FxbGhmWDBlNzNjYmEydHFIK3V0VVJIRDkrblZjdjM0ZHI3MzI2dkJjNStibWNPclVLZHgzM3p4T25ib1B4NDhmMzdGQ09SQzRWN2g1OHlhV2xwYXd0T1NGZWVQR2pidE9KSTFHQThlT0hjUHM3T3h3N3VWK3puRXlDbTAwR25qb29ZZncrYzkvSHZWNi9TaFArV05CRU9nK2FMVmErUEtYdjR4LytBKy9qQ3RYTHVQQ2hRdTRmUGt5OGp6ZlYxUUsrRjkwTXpNem1KMmRCWUN4eVBST1RJM1ppM0xNNXVyVnF3QmVBZUNMQlU2Y21NT3hZN09ZblQwMi9ERXdQVDJES0FxVnY0R1BENnFLVHFlRGxaVVZySzZ1WW5WMUZTc3JLN2gyN2VvZG5VcXlYNWdaVTFOVG1KbVp3YkZqeDRhRmc3dXR1N25UN1NSSmNQcjBhWHp5azUvRS9QeHBoTi9NK3ljSTlJQXNMQ3hnWVdFQnpqbTg5OTU3ZU9lZGQ3Qzh2SHlnOUN3UkRRZnpBWXhOalZsYlcvdlFLdk1tc2RiaTZ0VWxYTDI2dEdYZjFOUlVrU1k2aHRuWkdjek0rTzFXcS9raG5Ha2dzRDhHZ3dGV1YxZlJicTlnZGJVOWxHVzd2WHBYakZudVJyUFpIRmJPdGxxdG9RaHZwWmluekRnOS9QREQrTVFuUGhHbXd0MGlRYUMzQ0RQajdObXplUGpoczhpeUZHKy8vVForL3ZPZm85MXU3enNxTFVtU0JITnpjOE1WMlh1OUh0YlcxdEJ1dHovVXNkUGRXRjlmeC9yNk9pNWR1alIyZnhSRncwaDdabWEyRUtzWGJKaGVFN2dUT09ld3Z0N0c2bW9iN1haN0tNalYxVlVNQm9NUCsvVDJUYVZTR2FabHkra21BTFpJYzd0aW9KM3VtNTJkeFFNUFBJQ3paODhpanBNUWJkNG1RYUNIUUpJa2VQVFJSL0haeno2S1RtY2Q3N3p6RGo3NDRJT3g4ZEw5U3BXSTBHZzAwR3cyY2ViTW1lSFlxZjhTYU8rNlZOdmRnTFVXTjI3Y3dJMGJON2JzcTlmclJVWGdiQ0haR1V4UHoyQnFhZ3BFb1lBcGNEQTJOanBvdDlzakYvOS81TU9vZmo4TW9pZ2FEcFBNenM1dW1XcXkydy9wM1NUYWFEU3dzTENBczJmUG90Rm9CbWtlSWtHZ2gweXIxY0xqanorT3h4NTdIRGR1TE9QU3BVdTRmdjM2dnNTM25WU1plVmhSUjBSajZkNzE5ZlVqNzlON21QUjZQZlI2dldFYnhaTFI4WnpwYVY5eVB6VTFqWHE5amxxdGhrcWw4aUdkY2VERHhGcUxmcitQZnI4M0hONG9aYm0yMXI0am5jQ09raVJKaGtNNXM3T3ptSnFhR3U2N25UbVdSSVI2dlk0VEowN2d3UWNmeE96c3NTRE5JeUlJOUFnNWNlSUVqaDgvQVVEUjYvVnc2ZElsWEx0MkRXdHJheENSYllXNVY2UTZtZTR0aXg5R3YyQ09jaFdabzBCRWhsK00yOEhNcU5WcUU1YzZxdFhxOEhhMVdsNVg3L0RaQnc1Q2xtWG85L3NZREFhRkhQc1lEUHJEN1ZLWS9YNy9ycWtGT0F6S2xubGxPbll5d3J5VktIT3lrWHVyMWNMSmt5Znh3QU1Qb0ZhckFhQWd6aU1tQ1BRT1VhL1g4Wm5QK1BtbHpqbGN1YktJcGFWRnJLNnUzdFlYeFdoMWJ5bmF3V0F3bHRyNnFLYTBTa1FFM1c0WDNXNTN6OGNTRVNxVnlwaFVhN1VxcWxVdlYzK2Z2NjVVcW1IdTZ5R1FwZ1AwKzRPaEZBZUQvdGkyMytmbGVMY1g2aHdXVVJRTlU3R1RZNWk3emN2Y3EySjI4aldtcDZkeDZ0UThUcDh1ZTJJSGFkNUpna0EvQkl3eFJhdTlNMUQxalE2dVhMbU1temRYTUJoc25kSnkwS0trV3EyR2VyMk9oWVVGRUJHY2MxaGJXeHVPbzk0dFUyZU9BbFhGWURBb2lrVlc5M3g4a2lSRHNmcnI2akJ0YkV3RVl4ak1ER1lEWXd5WWVYanQ3eU13bTJLYkFkejkzMTRpQWhFSEVZRno0OXVxYm5pZnZ4WTRaNUdtS2ZyOUFkSjBNQ2JGd1dEd2tmNXhkaGlVaTAyVTQ1ZkhqaDBiVzg3clZpdGx0Nk5hcldKbVpnWUxDd3NqcWRrZ3pRK0xJTkM3QVArZmJoYXFQbnE4ZlBrRDNMeTVnbTUzNDFCK3NSdGpoc3V5RVJHSUNOYmFzYkhVRDd0YjBvZEZsbVhJc3V6UStwUVMwWWhrVFNIZ25hKzlpRGNmejB3anNpWUFOQ2E4U2VtVit6Wmw1eWJ1Y3hPU3ZEY2l3S01pU1pKaGF6dy9aajlkRk1IUm9hUmlKMkZtMU92MW9oM25HVlNyMWFFMEF4OCtRYUIzR2RWcUZZODg4Z2pPbmdVQVg0RjcvZm95MnUxVjlIcTlzZlRQUWFMU3lmMitTY0s0VkFHTWphZVdZNm9mcGRML0R4dFZoWE11aU9vanptaFVXYVpnWjJabVVLdlZ0bzBxRDlxOFlMZlhyZFZxbUo2ZXhva1RKekE5UFkzTkNETkk4MjRqQ1BRdXA5V2FRcXMxQlVDaENuUzdYVnkvZnIwUVcvOVFJOGF5d2NQMDlQUlFxa1NFTkUySExRakxNZFZPcDNOWGRtZ0pCQTVLbzlIQTFOUVVwcWVuaCtPVzA5UFRNTWJzTzZxOFZaZ1pTWktnMVpyQ3laTW4wV2cwZ2l3L1FnU0Jmc1JvTkJwNDhNRUhoN2Q3dlI2V2w1ZXh2cjZHZnI4LzlpdjNvRkhwVHJjcmxRcE9uVHFGK2ZuNXNXZzF6L09oVE1zcE5XV0RoWTlUQldYZ28wOFoxWlVwMS9LNjFXb05SUW1NRi9nY05LcmM3K29tbFVvRnJkWVVqaDgvUHJiVVlPZzcvZEVqQ1BRalRxMVd3d01QUElBeVFrM1RGTXZMMTlIcGRKQmwyWkdPYVNaSk1seGN2UHpQeit5cld2djkvbENtbzIwS081MU9TRzhHam9SeTZhNXlibVVwek9ucGFjUnh2S01rYjBlS3UxRStMMGtxYURZYk9IRmlEcFZLSlVTWUh5T0NRRDltVkNvVkxDeWNHZDVXVld4c2JHQnRiUTNkYmhkWmx1NGFtZTQzS3QySmNuKzlYa2VqMGNEOC9QeFFxdVh6ZXIwZU5qWTJobE5UdXQwdU5qWTJocGRlcjNmUFYzWUd4bUhtNFFMMnJWWnJ1TjFzTm9mYm82dVFqSTVOSHVYQ3o2UEZReUtDS0lwUnE5V0cwZTNvLzVVUVlYNzhDQUs5QnlpL1pFYS9WTHJkRGF5dnI2UFg2eUhQTFloMEtMcWpwSnhRWHBiNWo0NjFqbjdCaklxMTAra001VnFtakx2ZGJwRHN4NFN5Q1VBcG5jbExzOWxFdlY3ZjBqeDlKMG51TjVXNjArMjlIbDhXaWpFektwWHE4RHpMZjc5QmxQY09RYUQzS0kxR0U0M0dxRlNCYnRjTGFqQVl3RGtMSXRwMmxZYmJyUURlNi9GbEJXUTVQYUM4Yi9RaUltUGRiRVl2dlY1dmVEMTZDYW5qTzBNVVJXZzBHc01zUkwxZUg3dVUzYU5HN3dPd3JSQnZ0WURuc0ZLeHpybWlaU0NoV3EyZzBXaWkyV3dONTEwR1dkN2JCSUVHaGpRYURUUWFEZmp2R2Y5bGsyVVp1dDB1K3YwK3JNMGhvbUFtUkZIMG9YNTVsQ205WnJPNWJSUzczWDE1bm84SnRkL3ZEOTlibXFiSTgzdzRMN1M4bmFicDhIYVdaUi83cU5kSFZSVlVLaFVrU2JMamRkbHdvb3dPUnk5eEhBUFlmcXh4SjBsK21KK3Jxc0phQzJzdFZCWEdSS2hVRXRUcmpaSFdrS0ZaUVdBclFhQ0JYWW5qZU5qa3ZaU3FLaURpME90MTBlOFBpb1hGQmNZWUpFa3kvTFYvbUZIcFlSeWpGTUN4WThmMkpkelJzZHZ5TWlyWmNydVVhM2twbXhtVTQyTGJYVFliSG94dlQ5NzJYK2dHVVJUQkdEUFNCWW4zdFQxNVgva1psQ0tjbE9OdUZhbTdwVTF2VjRhSGtYYmQ2eGhsbDZxeUNUMXpWRVNWZFJnVGJSTlZCbU1HZGljSU5IQkwrQWl3aFVhamhiSUMyS1BvOWZwSTA4MDJiMFNNT0k0UXgvR3dIK2pkd0sxSVBvN2o0WThFWUh2SkhsVEtPejErcDMzN1NYWHVKK3JiNmZFbGh6VnQ0NmdldngxZWtqNTc0RndaVVJwVUt1WENBNDNpMkVDSUtnTzN5OTN6YlJiNDJGQTJjQWN3VEFlWDM0TjU3aU0yYTNNNEovQ3Q3d2hSRkJlUlVEdzh6bmFDTyt6STlqQWk0YVBpVnM3bG95QzUyOEZhaThGZ2dEUk5pMGhkUVFRWUV5RkpZc1J4WmJpSXdMZ2dneXdEaDA4UWFPQ080cVBRVXBLNlJiQnBtaUhMOG1LOFZVQUVNQnNrU1R4TVBkNkphdUg5Y3RUQzN1bnhINmJFZHVOMkJGeW1XRGZIcEczeGI0Q0cvd2FpS0FhUlFhMVd4MlNMdTlIdFFPQk9FQVFhdUtzd3hxQmFOUUNxVzZZT1dDdXd0bGRVUnJyaFdDRVJDdEV5b2loQ0ZFWERRaGMvY1owT1ZYSUhmZjZIeloyT01rZW5tL2hWWFBvWURQdzRzYlU1ckhWRjZsaWhTc1BHK25FY29SUmdGQ1dJb21SNFBIOTlnRGNkQ053QmdrQURIemw4TkdLMkNMYkVpM2FBYnRjdjJTYmloZXNmNCtWbURBK0xjc29pblNpS0VNY0o0amhHcGVJTGJNcUswdHZoVHFTUmIxZVNPeUVpeUxLc0dGY3NpNmRzSVVJTGEvMDBEK2RzVWZpRTRnZU4vM3lKZUtJNGh4RkZQUGIrN3FZZkc0SEFRUWdDRFh6czhkR05UL3VPVHRGeERuRE9BckJRVFRHYVVoNTliRmxOVzBaTXpHVlJEdy9YQy9VU0xvVkJFMVd3azdmTjJQUEs2M0o3dE9LV2lJcDFPc2VyZXNzVlgwYVhMSFBPUVhXNzVjNEVJbHBVOWNvd2VuZk9EcGRCODhmVzRyMXZwa1pIQlRoKy8rUjk1WHNvN2cxU0ROd0RCSUVHQW50UWpzR05qdFdXTWl1Yk0weU81VTQrZHZLKzdmZHZ2NzFUdERhZTJ0eHVlK2Y5MjBuUmI5UEUva0Fnc0JOM3JCcERWY04veVVBZ0VBZ2NLWGV5b082T0NKUkNQaWNRQ0FRQ2Q0Zzc1WndqRjJpUVp5QVFDQVR1TkhmQ1BVY3EwQ0RQUUNBUUNIeFlITFdEanFTSUtJZ3pFQWdFQW5jRHBZLzBDQVpIRHowQzNVbWVkMHVubEVBZ0VBaDhyTm5XUVVjUjJCMnFRSGM1d1JDUkJnS0JRT0JPY1Vja2VtZ0MzZUhFcUxoQWcwUURnVUFnY01TTTVEcUgvaG5sTUNWNktBTGRSWjZlYytmQ29HZ2dFQWdFamh3Q2dIUG5hUEt1c2NjY2trUnZXNkQ3a2VjNWhESFFRQ0FRQ0J3OXFrcm5nRHNpMGRzUzZIN2x1Ynk4VEtGYXhLZEdBQUFnQUVsRVFWUVRVU0FRQ0FUdUJNdkx5M2RFb3JjczBJUElzOVBwQkhrR0FvRkE0STdRNlhUb1RrajBsZ1M2bHp6UFRjaHpNQmlFQ0RRUUNBUUNSNDZxMG1Bd29GR0puanNpaVI1V0ZlNVk1QW1NeXpOTlU1SWcwRUFnRUFnY01hcEthWnFPU1JUQW5wSG9yWEJnZ1c1ajZsMGp6elJOeVo0NVF3aEZSSUZBSUJDNEE5Z3paN1pJZEs5STlGYWkwQU1KZERkNTdoUjUyak5uYUQ1TlF3bzNFQWdFQWtlT3F0Sjg0WjZEUnFJSGxlaStCYnJyZ1hlSlBPZlRsTElzSTVFZzBFQWdFQWdjTGFxZ0xNdDJsT2cyaFVWakhFU2kreExvcmtWRE8xVGJqc3B6TUJpd0lnZzBFQWdFQWtlTFFqRVlESGhVb3VXK0hTUjZ5MFZGdDFwRVZCeDhVNTdsanNGZ1FPa0RENHpKMDg3TWtJb0VnUVlDZ1VEZ2FGRWxPek5Eb3hKTkgzaUFCb1BCMEVGRGlXSm5pZTZIUFFXNmU5SFE1cDJqcWRzei9UNWxXVVo1bnBPZG1hSG1ZTUFTZXVFR0FvRkE0SWhSVldvV2dWdWU1NVJsR1ozcDk4ZFN1ZVZqUngyR1d4Z1B2ZlZwTExzVURYVTZIYzd6bk5KV2k1dURBV2UxR24vN205Lzh5MnZYbHYvblczNjlRQ0FRQ0FSMllYVjE3WC85N25lLysyK3lXbzJiZ3dHbnJSYm5lVTZkVG9mM1dWUjBJSFlWNk03UjUrNUZRMlB5ekdwY3l6TCszdmQrMUt2V0tvL2M2b2tHQW9GQUlMQWJTU1grOURlLytZUDFXcFp4bG8xTGROZWlvaDFTdVh0Rm9RZUpRUDJCbm53UzU4Nk5GdzJOeXJQYjdYTGFhdkdNdFpSbE5jNXJHUThHa2NuajFOUnF0WDkwZ05jTEJBS0JRR0RmVkN1VmY1VEhxUmtNSXBQWHZFUm5yS1cwMWVKdXQ4dWpFZ1ZHaW9yT0FYanl5Zkl3dDErRnU2TjUzM2hqN0g0L01QdEpsRVZEemgyakdXc3BUVlBPYXhuWDhweGRKZWRmK1BTbmEzRVVmM0cvSnhZSUJBS0J3RUV3eGp6eUwvNzVQei9sS2puWDhwenpXc1pwbXZLTXRlVGNzZUgwRnVDVEdDMHFBckRGYlNXN1JhSGJDblRIMU8yTzh6Mzd3NHJidE5sbkw4OGExL0tjc3lneVVSYVpmL0RZWS9jVElUbkloeEVJQkFLQndFRjQrQk9mK0dTVVJTYUxJdU1sV3VNMFRUbHQ5cm1zekxWbitudk5EOTFYS3ZkQVJVU1Q4ejBueHozdHpBeE5XMHQ1cmNiVkxPTThTVGl4Q2Rzb003T3pzM01IL3lnQ2dVQWdFTmcvOVhyOXBJMHlrOWlFOHlUeExxclZlTnBhS2l0emQwemxIdkMxdGdoMHQraHo5TTdSMUcyMzIyWG5qbEZaTk5Sd2p2SktoU3ZXY2g1bHhoaGpHdFY2RUdnZ0VBZ0VqcFJLWERscGpERjVsSm1LdFp4WEt0eHdqc3FpSXVlT1VUa2V1bTBxOXdCUjZMNGowTjFTdDg0NWFqYjc3SnlqdkpaeG51ZWNwNm5KbzhoRXVUSE9XaFBGNXRndGZCYUJRQ0FRQ095YktEWW5uTFVteW8zSm84amthV3J5WWp4MDFGVzdwbkwzeVY0QzNYR2V6R1RxMWhhcDIzTGNNN0VKTzJ2WnhZNE5zOG55UEQzQWVRVUNnVUFnY0dEeVBPOGJadU5peDg1YVRtekNvK09oZHB0VTdwYUQ3TkxtYjVReGdlNDBVTHBkOURsWmRadGxmdHpUMVdxVVdNc3VzV3lNTVliOTFmckd4c1l0Zmg2QlFDQVFDT3lMYnIrL051b2VsMWhPckdWWHExRTEyNXphTWxxVnU5OG9kTktSdTBXZzIwYWY2WWl4ZmZTWlU1cW1MRTFISWtKNW1ocVhKT3hUdDhZNHk4WmFOdTJWdGM1dGZDYUJRQ0FRQ094SnQ5TmR0NWFOczJ5Y05YNFlNVWs0VDFNaklpUk5SMm1hc3AzSktjOXpBamJYRHgwNzBENmkwSDJOZ1k1R253REc1bncyQndOMnpTYU5WdDF1cG01elE1UkhUSGwwL3MyZlhiKzFqeU1RQ0FRQ2dmM3gvZ2VYcnpMbEVWRWVHYzdIVXJsbFZhNXJOcWtzS05xY0crcUxZOGZhL08zQlVLRGJwbStMZVorampFYWZhVms0bEdXYzU3N3FkalIxNjR3eGp0azRadlA2VzI5MDB6UjcvOVkvbGtBZ0VBZ0Vka1pFdW4venZiKzlYSHJIVGFSeUs5WnlubGM0ejN4QlVkcnM4MmdVT25xc25kWU5IWFhsVGhFb2xRZlliZXh6MmxweXpTWTFuQ09wT2JJMjRkakdMTTZ4czlhd3RjWTRObXdwWWlMVFhsOTc0N0ErcUVBZ0VBZ0VSdG5ZMkhqVFdVdHNLZkx1c2NaWmE4UTVqbTNNMWlZc05VY041OGcxbTk1aCt4c0xQV2dqaFNlMzNETTU5cmxkOU9saXkxRVVjUlJGYkpnTnN6UE16cENqNklQTGwxKy92WThuRUFnRUFvSHR1WDdqeGh2a0tDcTlZNWhONlNNWGUwZE5ScUdUWTZGYmovcmtqcS9Id0U3cDI4MitnR1gwQ1FDamxiZk83Ung5V3N0R3hMQXdHMGRrSENGNjZxbS8vUHZjMnJYYi9Jd0NnVUFnRUJoRFZmT3ZmK05ienpoQzVJaU1zSGVRTHlqYUlRcDFUUnF0eUFWOG9leFljNFZ6VzN2a2xzN2NMZ0lkVzdWN2MvRlIzM1dvakQ2dHRWUlczcnB0bzAvcm8wOUhoaHhGQkJldHJxL0x4WXNYdjNPNEgxc2dFQWdFN25VV2w1YWVmL1BDMngyQ2k4aFJ4STZLS05SdWlVS2R0VnhXNVBwNW9mbHdYaWp3U1FDYjdmMUdYbUwvbllpMkZnOXRkaDF5MXZwcjV5aFBFcTVLbFZTRU5xTlA2Nk5QeDhhUmk1akpNTE1oSXZPZi8rcXZuaEdSN0ZBK3NVQWdFQWdFQVAzV2Q3N3pOMFRlTmN4a0hMbElYQm1GYm82RnFnaFZwVXA1a25EcHNkSnBaWGVpMFFQdjFwbG8xeUtpa3JINU1YTnpLSXVIYW5uT0trSXVzUnk3bUNNWHNVakVrVEhzYzlCa3lKRVJFaU1PRVpGRVZ6NVlIUHo4MHZzdjNQTEhGQWdFQW9IQUNGZXZYMy90eHo5KytUcVJST0lRQ1lraFI4WUhiODVFeG5nM3VZaGpGN05MTEtzSTFmS2N5MklpekcyMmE5OHlKL1JnUlVUbkp1WitqcVJ2YzE4OEpNNlJjeldxaXZnMGJ1eFlJc2ZHT0JZUkZqSHN5QmsxeXVRb0lxSkNvbVMrL3UxdmYwOVY5YkErdkVBZ0VBamN1M3p2QjgvOTdhaGp5RkdrUnRtUjg5bFFFZStteUxHTEhZc0lWVVhJdVZyaE1rYzJIMC9qanM4SjNUNE9uUlNvbjc0eThkalJrTlpaU3dBd1hqemtiYTRhazRoaE1ZYUZuVEZxbUltTU1Ca2lNY1JraEJDOThjYjU5cFhGeGY5Nm1COWdJQkFJQk80OVZsWldMMzN2K3o5NFh3Z1JGYTRSSnNORXhxaDNrUmpESW9aVlkxSVJpcTBkS3lZQ050MEdqRHNQR0hQaXZsdjVBZGdNWmN2cTIrTUFuR3VTYzQ1VWhMUXFwSlVLUlM3aUtCS09qTEFSWVNQTVFzNklrR0ZXVmlWRFJJWkVqQktaYjN6NzZlZEVWRzd2b3dzRUFvSEF2Y3gzbjMzMldTM2NRa1JHMVR0SGhJeVFNMFU1TGtkR3ZLTmN4RnFwZUhlSkZQVTh6Y0p0NDlXNGU3MDJiNTNDOHVTV0J6MVlYRTlXMzQ1ZU5GRnl6ckdxK2lpVWhVV1ptWlZWdkR4VjFFc1VpSDc2MDFldVBmL0RIejV6bTU5ZElCQUlCTzVSWG43MTFSZWZlZllIN3hGODZyWjBqQmFCbXloN0Y0bGgxY0pSaVc3eDEyZzFMckRwdkhHZUhMdEZSTFFsQWowM01mOFQrQ1RTWXZ3VEFJWlZTNjVHbzlXMzRoeVhLVncxd2tZTkcvRy9Bb2lFVlpXSllKVElrS3BSVXZNZi90Ti9mdm5kaSs5ZE9MeVBNeEFJQkFMM0FrdFhyMTcrNHovOXM3OVQwc0lwWkloZ3ZHdUVSY2dZVVRicW5WU21jSWUrS3FweG5hc05aNVVBUlp2YWJSYmJQcmZOZk5CdFU3aGo4ejgvdVhuL2FJNVlhajRLVGFSQ3FnbXB4cVFxcEpHU0VmR0ZSQ3pNNHRPM1NtUWlZK29rYXBTSWkxQ2IvODIvL2JmZmI3ZmI3VVA3VkFPQlFDRHdzYWJYNy9mKzhJLysrTHZXQ2hHUmQ0cW9VVlhXTW8wcldrU2ZmbGhSSS9XTzBwaFVFMHFrNHFQUG10dFM0d05nNkw3ZG1zdVBDblRiQjloK2Z4aDVIaSt1cFRBMTZvQ3FVQndMeGJGU09mNnBhZ2hHU1pWWldWaEZtVlNaakVrZVdKZy94OHcxL3l0QlRhZmJkWC8wSjMvMnZUelA3ZTE5cElGQUlCRDR1S09xK3UvL3czLzh3ZEwxNndPaVFwcXFVV3VxK1lBU002bXlpbnIzS0xOM2thRnlIRFNPbGVKWVNGVUlkWC9Nc2hLM2RCeXc2YjV0MkxPWi9CaCtVTFdZSXpNOWpSWUFGVDhBSzRrUUFJZ0lxU3FwUmxTT2Z4b0RBZ3l4WVZKU3p0T3NKeXI1MmZzWC9wZG12WDVTbFpoVXpZVjMzK2w4NWF0ZisvRXRmcDZCUUNBUXVFZjQyMmUvLy9wTFAvbkpNcWthVmVJa2poc1AzMy9tZjRBcXN5b3JLYk5oQWd3WkF5ckhRVlVqOGpVNmhiTVM3ekFWb1JZQVRFOFhyekNIc3BCb0x5WUUrdVN1RDdiV2tyanhBaUlBOE9MMEY2Z1NBRElLMGlLVnE2b01NQ2tUTDk5Y2VaNlpaeGZ1bS9zZlR4eWJmbFNKU2FIODNXZWV2ZnpTajMveTNrRSt5RUFnRUFqY083ejl6cnRYLzlOWHZuSkJvYXpFMUdyVkZ4NWNtUCtmVk5WMU9odUx5dVJkbytyZEk4SkdRUUFJSTU1Uzd5bU1GUkk1WDBpMCt4azhPWGFMZDlrMzBZRm9mRjhSK1hwNUZpSUZZbWlrWkFxUmF2RUxBQXBpVVlhQ0JybmQ2QTNTVjRnb1BqRTc4OS9kZitya2Z4T1JpUUNsLytmUC90MmJMNy82MnVJK1BzZEFJQkFJM0VPOGMvSGl6ZC85Z3o5OFJWV0lsZWpVOFdPUExaeWMreGZNM0x4K2MvWDd5anptR21OQUNrTlE3eVNObElBWVFKRkJMU1JhbjN5aEVkZHRtY3J5NVBoRDk1WENCUUJiVk9HT3NpbE93QS9NYW5FN2dwcHkyMERaYnl1OFdHK3NycjZnZ0FPQVJxMzJxUWZ2UC8xcjFVcHR5am1IMy8vRC8vdk43ei8zL09YOW5sY2dFQWdFUHQ2ODh0cnJ5Ny8xci83MXEvMStYNklvcm56aXpQeXZ6a3kxL2dFQTd2VUhiL1RUd1UwZnRCV3VZU1hBQUVEaG9zaHZxNUpxdk9tdEVZZVZiT2U2bmRoVG9IYWJ5YVRPMVRiVHR5TW0zenpCNHZiSXRrS0ppMUM2UDBnN3ZYNy9mUG1jT0lwbVBuSDZ2bDg5TVR2N0lBajA3LzdpTHk1OTdldmZlRC8wK2dzRUFvRjdtK2YvN29mWGZ1OFAvdUNDZFJiTmV2M1lRd3VuLzl0cXBYSWFBRlRWWFZ0WmViSHdETEZpVTZLYlE0cmpYc0o0NWxTS2xuNlRyN3VkK3lZWkUraVR0L011QWZnUWVkdVhvVWxWTHkzZmZONDU2WlMzaVNnNk1UdjkyWWNXVHY5U3RWS3QvZFhYdjNIOXovL2lQM3pnbkFzZURRUUNnWHVRdi83bXQ1Yis5TS8vL1FkTXhwdytPZmZwTTZkTy9vb3hYQ3YzZDNxOVZ3ZHAxaGw3RWdNQWIrdWluUjIxUDU2Y3VMM3ZGTzRoTUhiaXViV0RwUnZMVDZ1cUc3Mi9raVRUbnpoOTZyRzVZN1B6MzN2dStmWWYvTkVmWDg2eUxMVDhDd1FDZ1hzRUVjR2YvNy8vY2VtL2ZQVnJ5MVBONXN6RDk1Lyt3bFNqc1RENm1EVExGcGVXYjd5MHpkTnZTNUlINFZBRlNwWjJpQllGRUd6WnQ3RXh1SDZ6dmZiaWx1TVE4ZkdaNllXSHpweis1QnZuejl2LzYzZC9iN0hiNndXSkJnS0J3TWVjUE0vMUQvLzRUNVorOE56ekcvZWZ1dThUcDArZWVNUVlrNHcreGpyWGVmL3ExZStwdzFZdkNCVGIzQTNzNXFoYlk4OFVibFNwYlB1Q3pLd0FRTXhLTkg1U2s3Y0JMMDhoS0FBbElpVWxCUVRMcSswTEc3M2V1OXU5UmhMSDFVK2NubitvdmJMUytEOSs0N2V1dnYvQjViQVFkeUFRQ0h4TXVYSGpwdjNOMy82ZHEyKy9mY0U4ZE9iMDJVYTlOajM1R0ZHMVY2NWRmOTVhU1FFQktaVU8wc0l4QUxDcms0aElxWEJZNmJKSnRuUGZreE8zOXgyQlJuRThQSmd4L2FFOE4wOG85MklrVXNDQ0hDbUlsRWlVaEpUZ0x5QlNRU2xTS0FHNmRIWDVwU3pQVjNkNjdkbXAxbXdsNXJuZit1M2Y3bnpqMjMreklSS0MwVUFnRVBnNDhkemYvYkQzdi8zdnYzNHo3WGRuN3p0KzdDUXpiK2NudlhiajVrdURmcnBLaFVNQWVLZlFwbWRJdkh0QXBPUUtKeFYrSXNvM3ZWVTRySFFhTU82NnZkaDFIbWhsaCtnVEFIcmxDWXlZSFBBaHNxTkNubkFLQi9VelFmMkZJQW9SQmFrS1NFQlFDN2dyMTY2L0tDSTdScGh4Rk1YemN5ZU92L0REdjR0Ly9WLys1dnExNjlmZFRvOE5CQUtCd0VlRHRiVjErZTNmKy8yMXIvMzFYK3Y4M1BHVHRVcWx1dE5qVjlmVzMxcnJiQ3dLa1lKUU9FUVZJdDR0STY2QmczY1FlU2VOcG05SE02ZTluVjRNMnpqd3lmSDkreDhEWFFhaUtGSTJScGw1ZUJtZUVKRVNXVVVSU2p2eXZ3aVVXUWlrUWlvUVVWRVNJaElpaVArZG9FSlFHZVQ1eHVWcjExOTB1MGdVQU9yVmFvWEZUZjJyMy9uWDlsdFBQNTJwaGlMZFFDQVErQ2p5OXovNmNmYnJ2L0ViZzI1N2RXcDJxdFhZdXJ6bUpodTkzcFZyTjI5ZVVJSVExTHREQzVjUWlTaDV4NUFLd2J2SHk5TkhxU2djTlpyT0hYVVpHNk5SRkNtVzkzLytCMmpsVnh4MWJXMzhBSmszT1JkR0o3Skt6b2ZQSWlTQVV5RVJVaEtsUXA1S29xSkNwS0tnb1VqNy9jSHFCMHZYL2ovcjNHQ3ZFMi9XYTVXL2YvSEYrUC84emQvTWxtL2NDQllOQkFLQmp3amRibGQvNTNkL0wvdm0xNzhlVFRYcWRlYnRwNTJVdER1ZFM1ZXZMcjlHb0tFNEZlUWRJcVZJQzhjb2laQjQ5d2dKa1JST3NtT3U0bXhpN0hQb3R0ME0rdVRZclZHQjdpaWhKRW5VR0tNM0FSaGp0R3VNRXJQU2dKV0lOYzlaODV3MEoxSkxwTXdpNUVpSVdJaDUrT2FJVkVoVWxGU0kyYW1TRU5RcHFTTWlwMURYVDlQT3BjWEZIK1c1N2U3MmdRSitOWENYWmNudi8vN3Y0Nm12L0JjWG90RkFJQkM0dS9uYlo1NXgvL0kzZjBzN2ErMGtpc3llV2RBYnErMTNyeTdmZUZ1aG9paGM0UU5MN3hCbXA0VmJpSFFZcEJHemQ1QWpZUmF4NUIyVjU2UjU3dDFGQTFaaTFxNHhZNDVMa21RM21XeU9sMjYzZDI1dVRnRy9vSFowdWFhWTh4MFpUQlFwMGhRQTRGTzVwQmtQbE9DTGdjZ2xBaFd4UmpSaUZtVVJFUkltRVJXSWYrTWtwT0pFVlpqSUtiR0RRQlFxcE9SQTZuTHJlajlmWFBycEEvUDNQVlpKa3RaZUg3Qmhwdi82K212bXpmUG41Wi85czErakwzM3BTM2RzSGxBZ0VBZ0U5dWF0Q3hmMEsxLzVpcWFEZ2RtSE42R3FldTNHelF2dHpzWWlpQnlwT2xKeUNnaVVSSmtjUVoySUNnTk9pWVVVVG4yelhMOGtOWXNRV0N5cHNtTUJzWUF5QmFBWlFSTlVWUTBwckY5TjAwVFJwaHd2MXhRVm9OVnFhZW5FU1F6R0o1M1MrZk9QMHFPUEFyMWVqMFFFYWJwSWpVYURBQ0NMSXE2S2tNUXh4WU1CRGRoeEFmbUtLV2NJWWtnTUYwdWFHU1l4VUdaaU1rSWFzY0lva1dGbW82cUdBQU1HRTRpVllBQm1BRVlWV085MFYycTF5bFFjUlRzT0tvOS80RUlYTGx5Z0g3N3dndGJyZFp3K2ZYcVlVaWNpN0xZOWVqc1F1SnNZL1RlNTNiYS8ybTU3NS8yYmg2Rjk3aDkvN0hiN3R6L1B2ZmJ2ZEo3N2U1ODd2L2RiZjUvYm5mdEIzdlBkOFQ3SG43Zi85N0gzMzlkQnVYanhJdjdrVC85VWZ2eWpIN0hiYzdVVGo0aTR4ZXZMUDF2ZjZOMEFVUTdBQXB5QmtCTW9BMnRHaWx4VmMyYk9GY2hJa1F0cnpzU1pLdVZFWWtVNVZ4TExqaTJSZFVUaTJCaEx6QTVFa2lPWEpNOUZrMFFTVmNtaVNHdXFZb3hCci9lQk5wdE5yVlFxYURRYWVPb3BBRGcvZHA2UnF1cjR3TzFUQ3B3YmU1TkxsWW9lenpLSzJyR2lPZ0J2R0VVME1nQkxwRkJWTmtaVVJGU2RrQmhSRmxGbHgxUkdvdXlVeFpHUVU2Z2xacWNpanVCRGNsVjFUSENxYWtFd29wcDlzSFQ5L09tVEp6N2RhdFNQNy9jdkxFdFQrdXV2ZlEzZmVmcHAvYlZmK3pYNnBWLzZKUmhqOXZ2MFFDQVFDTndtNzd6ekRyNzYxYS9wNnVvSzRTQUxsemlYWDc1Ni9hMUJtcTJCWUVIcW9HcUo0RVRWZ2VDS1NOUDVvVUMxcEhESzZsalpaemRaUlFyM2tMQ0EzWEJJVVl0ZUJGQlZCUlFpM21rSlVEcHVxVkxScmVuWnA4YWlVRlhkNWpFVFZDb1Z0UUFsU2FKNXZxSlJWTk1zV3dOenNqa095cVFaK2M2OUFBc2lGYWlJRVJhdytEZkM0bFJoRld6QjRsVElBV3FWMlVMRlFzbXlzbFdvQWRpUXFsR1FVUlY3NWVyMXQ0L05UbS9NemM3Y1QwVDcvb3NZREFiMDFhOStGWC96OU5QNDcvL3BQOFVYdi9oRlJOR2ViemtRQ0FRQ3Q4aGJiNzJGcjMvakcxaTVlUk00WUZ1OWZwcHVMRjVmdnBobnRnZUNBOGlScWxXd1ZkWFNFZjdDYktGcVZlSEE2aFJzQWJYTTZrVFpVU0ZQeCtKVHQ1WUVqbFJCbWlncGlTcFZVY3dtV1VNVTFkV1lGVTJTaGdLN1QrTXNtYlNKQXFDbkFQemowUWVOaklPMm8waHJSU0ZSMGpmS3BxOTVGQWtEUXFvQ1FPQlVvSkdJRVdlVW5iSTZGWFpLNG44NWdDMURySUlzQTFhVnJaSmFzRm9vakpJYUtBeWdCcjROUGErMDE2NTJlLzN1NlpOekQxV1N1SVlETU9qMzhiV3ZmUTFQZitjNytDZS8rcXY0bFYvNUZWUXFsWU1jSWhBSUJBSTdvS3A0N2JYWDhQVFRUMk5sWmVWV25xODMyMnRYYjZ5MnJ3TElmT1FKTDBqQUtxa2xoVlZXcXdwTHlwWUpWZ0hMVUN2S3RpeEloYkpqVmtmQ3pyRTRQL1pwQlV3Q1FKUklja0JpYTFYN05lMVdWYXZHYUR1S3RMUkNPZjVaOHRUSXFZNmU5L2JoMkZOUFllN2N1V0VoRWZBMmxpcG45SGlXcVl0ak5VWEZrakY5emFKSURETXprVUJWQ0JDb09sVnhVT05FeENuRVFka1NPSUtxWmZLL0hsVFVBbW9WWkgwL0Jjb1ZhZ2prNVFsaVZUQ2dUR0FhWkZuMzUxY1dMNXc4UG50NmRtcHFidHR6MzRWQnY0OXZmZXRiZVBiWlovSEVFMC9nUzEvNkVtWm1aZzU2bUVBZ0VBZ0FzTmJpNVpkZnhqUFBQSVBWMVIyYnllMUttdVhwMHZMeUI0TTAyMURBRXNncWZGYVNnQnpRNGo2MUJNcXBjRVlSZlZvd1d5NjJDVDZscXlLT2hKMWg0MkNjSXpJT1JLS0FnRWhFVmJNb2tnUjlOYWFxeGhpTjRsampPRmFmdm4wYlFHV3pnT2lwcDdZOTk1M3ltWW9pOUs1V3F3b0F0Z3pGbDVleDFteHFiV05EdTBtaXlVZ2FOK2ZVQ3hRUWFDU0lSRURxV0l4VEZnY2xxNndHU2xiVi8zSlFVQTZHZ1pJQmlCbHExT2ZMdlR3SnpQQnJ2REZBcWtyWGJxeGMyZWoxdS9Oeko4NUV4aHc0SnpzWURQRE1NOC9nMldlZnhlYys5ems4OGNRVGVPU1JSdzU2bUVBZ0VMZ25XVjFkeFlzdnZvZ1hYM3dSZzhHZTAvWjNQczdhK3NyMWxkV3JxcG9Cc0F6a0NyVU01QUxrcXJCRXlBSGtmaC9sQUhJd2NpaHlIMzJTQlh4MFNrcVdXQjJKY1dMRU9SS0JMU0pRUUJTUVdDckQ5RzJYV1NzYkc3cFdyMnRsZVJtbytuclZTcVdpcGZzS3R1K1h1OU1iMjVMR3JkVTBTVlBOODF4TkZLa3hSdU1rRWU0U1IzRXFLYk13bVRJQ0ZZSTRGWFZRNDlTb1ZWRURWY05raktwWU1ISlZHQVdNLzJCUVZ1WG1BQmdnQmtwNWdnRXFGMG9sQU5qbzl0ZmVTNjhNNXVkT0xEVHI5VDJudW15SHF1TDExMS9INjYrL2p2dnV1dzlQUFBFRXZ2akZMNGIwYmlBUUNFeWdxdmpaejM2R0YxNTRBVysrK1NadVo5NTlibTIrdEh4anFkY2ZkQXBKV25nUGxKbklvVVJSU2hQSVZkVlNJVk9CZnc0SU9RU1d5VmhSc1lCYUdMWHMySUdjSTBOT3dWSkdvRG5uVWhFUjdWYzBickFZNTRaT1M1SkVvMXB0N0kxdEgzdDY5b3plV3EyV0RnWUR3dHR2WStsTWtjWnR4MnFxUnAweEdzZDlTYU9JRExQd2dDU2pnVENSQXhLR2lrT2tEcXFPMVRnVUl2V0R3V1RVZnlnR1B1STBJR0pWOWRHbmx5ZURRTkNSR212L0p4RUFhd1dYcjE1L2Y2YlZPalozYk9ha3VZMVMyMnZYcnVFdi8vSXY4YzF2ZmhPLy9NdS9qQzkvK2N1WW16dHdsamdRQ0FRK1Z2UjZQZnpvUnovQ0QzLzR3MXNhMzV4a2ZXTmovZXFObFdzaWtnMGpUSUtGWWloS2dESVFjbFl2VWZKeXpVR1VRWFhrY2NoWllVWFZRdFd5Z1lVelRsU2NHamhZNDBEc2dNeUpxaVJhRmFxcXBDSlNRU3BxYWo1OTI0NDFyaGJwMjdmZkJpbytmYnZYZTRrQVA0QTdNcFhGcDIrZmVsVG56cjJCNWVWbG1rempHck9pYTFGTm0yVWF0MjgwaWxOSkl4WkRrU09Bb1ZZSUdJdENvY29LTW15UVE4R3FNS0F5NG9SaENBUEVLa1JsWTMzMXJoeTlBQUJCL1J3b1ZhRGQ2YXlzZDN1ZHVkbnB1Wm1wMXN4dS9SVDNJazFUUFAvODgzaisrZWZ4cVU5OUNrODg4UVErODVuUFlQdUZBUUtCUU9EanlRY2ZmSUFYWG5nQkw3LzhNbXpSYU9CMkdLVHA0UHJObGVYZUlPc0M2b2J5Vk5qQ0EyTVhCWElpelFpVVFTZ2pRa2FRelRUdVNJcVhEWEpSWDNRRWc0bm9Vd1ErTytweXphV1NpV2hlOGNWREd4dTZWcWxvM2F3b0VBTVlUOS82OGM5SHRZaERoMExWSXZ6ZUpRSjlFc0M1c1h1aXk1YzFLVG95bUNoU1k2M0dTU0t4NjlPQW1hTW9Hb2xDS3c0QUV3cHhxakpnMktnWUpSZy9YUVU1QTZ3aURDS0dnSlhBZ0xDQ3VHeHhvS1IrcFRld2Z3K2J2d3ZLMkZSRm5GNjdlZlBheXZwNisrU3hZM090UnIxNXkzL1RCUmN1WE1DRkN4ZlFhclh3K09PUDQvSEh2NENGaGRPM2U5aEFJQkM0SytsMnUzajExVmZ3NHgvL0dKY3ZYejZVWStiVzJ1V1YxWnZyM2U0NlZCM2d4eXpMdEMwQUMwV0dNdktFNUNEeTRnUXlCZkpTbkNUSVFjaFVKR2NpUDA0S3RRUllvMm9kR1F0MUZrb1dpS3dvT1FCT05CMUdud05ydFJxbm9rbHRtTDZONDlpbmJ5OWZWbXdad250eXgvZTJhd3IzS1FEbkpsb1liVFpWYU90YXM3a1poUTRpaVNTbE1ncGxFdktScUxLcXV1SkQ0bUxjc3hqajFJbHJNUGxXK1g0bFVWSmlsYUpORUJYMVNZVkVDM0VXZnlnQkNyRG11ZFVyMTY0djFxdlY1c2tUeDQ1WGsrUzJCelE3blE2ZWUrNDVQUGZjY3poMTZoUys4SVV2NExISEhzUDA5SmExWGdPQlFPQWpoYlVXNTgrZngwOS8rbE84OWRZRmlCek9TcEVpSWpmWDF0b3I3ZlUxOVdsWGgyS3VwcSsySFJuREhKV25GMmNPbFV4QU9TbGxJR1JFbEhuUlVnNW9QbnF0MEJ3S2E3U1kvbUxFRVpFRGtWUEFrVWFqMGFkMHEzWVlmVmJhYlVXMWlxVktSUnRGOUZsVzMrNDIvZ21NQ0hUN05PNVRpblBqWFltaXl6Vk41a2FLaVVhaTBEU0t5QXhZbUFlU014ZGpvV0FDckdyRUJMVWFnVlUyeHpsQjhISWtrQURFVWdwVGZNOEVCVWpKRDFnVHdTZHR0WGg2NlUvL0tDOVlVbFZvYnpEb1hMcTgySnRxTmFmbmpzMGVpdzZwRmRIVnExZnhyVzk5QzkvKzlyZHg5dXhaUFA3NEYvRDV6MzhPU1pJY3h1RURnVURneUZGVlhMeDRFYSs4OGpKZWUrMDFwRVdQODBNNU5vQzE5VTVuZWJXOUlzN2xDamhWT0I5eGlnTTRCM1F6K2h5S3M1Q2pJaU5RQ2lBam9oUXFHVUFaUkRJaG44b3R4a2d6TFZPK3FoWVI1WEJxVlkwanNsWjg0T1pFVldJUklhbEtXaTNHUGtlaXoySHgwTVRjVHdEQVU4UHVRMXZTdDhBK2lvZ21vOUEwZlp1R2MwSW5vOUMrMFN4T0pZNFNGeEZSbmhFUnRKakhxUll4U0VWOXVsWkJCc1NBRUVEc0xWbU1kNVlpRjkrQkhsQ3d2MUpsTFlweFIwVXE2bStUZ2hDeCtwMEswcldOalhabm83dHhmSFptZG5hcU5iWERLdWNIUmxYeHpqdnZGTzJxL2dxZis5em44TmhqaitPUlI4Nkc4ZEpBSUhCWGN1M2FOYnp5eXN0NCtlV1hzVGF4Tk9WaDBPMzMrOWR2cnF5bVdUNG9Pd2tCNmhpd1NpaFNxMUxJaysyWU9Ba1ppUmVqUURNQUdZbGtJRXF4R1gxbUlNMTh3WkhrQmo2TkM2SmN2VVN0NW1wRmpRUElLY2pGaVRxbjZuS2JTZHdmSC91c3ROc2FWNnZEdVovVjZ2UytvMDlnZDRGdUc0VldLaFhGNVJxU3VWUUJDR28xR0dzcDdpY1NKMzJTS0NLVFpaUXhDNXNpQ2xWbFMwUVFaUUpzNUN0dGkra3BSUVRxbE1CQ0FCR0prSG9KRWFrV1hpMzhLQXhsQlFHcVE1R1NZQmlKUXBXRzI2S0FpS291cjZ6ZVhHbXZyYzFPVDAzUFRMVmFoeFdSQWtDZTUzajVaZitQc3RsczRyT2YvU3dlZmZSUlBQend3MkFPUFhnRGdjQ0h4NDBiTjNEKy9CdDQ3YlhYc0xpNGVDU3ZzZEhyOTFmYWEydTl3YUFQbndwMFJacldBWERxeHp1TFMxa0U1SnZuVUJGSmVua1cwU2FRa2FvWEoxRXBVci9ma2EvR2hhL0dOVVVFYW9tc2lEaEVaQ05WQnlJbnFwTG5Jb21JU0pKSWpGUzBYeE9UT0szVWFsSzFWc3JvYzB2cnZtMml6MG5HQkxxMXNYeHhIR3dmaGM0RHlGZFdkS1BWa3ByYm9FRlNrMlF3b0N5S0tJb2lsdzJJREtmRVJHUlVxYlJ0OUp3QUFDQUFTVVJCVk1oNUV4QlJZVC9Xc3JxV1FDUUVZZi82TElKQ29pQlZLTE9xUXYwTlZWTHlJU2pEenoyVlRXa1NJQW9TUUNJR2lROVZTWndUdWJIYVhybTV1clkyTTlWcUhadWVtb3JqdzIyT3U3R3hnWmRlZWdrdnZmUVNxdFVxUHYzcHorRFJSeitMVDMzcVU0aWkrREJmS2hBSUJMYWdxcmh5NVFyZWZQTk5uRDkvSHRldlh6K3ExOUgxalc3dlpudHRMY3Z5REFTQndvRkdvazZmc3JXRW9tdVErbkZQNG1KYWlpQW5SYTZrbVJhcFdSb1RKcVhrVTdlcEZ5a3lrQzg0MG5KNmk4SVNSYmxSNnhzcXFEb0ZySWc0SnhXWFZOVmwxa3FTWlRLb1ZpVjJHN3BSYlVobFpVV1RSdU5BMGFkT1RIN2RuenllZWxSeDdvMkpLUFF5TURkSGNSeXJhOGRhYVZZRS9UNzZTVUxKSUtKTVVvcVR5REhGeEJsUlR2REZRZERpdXJoTkJJVVVkVVFLT0NFVWE4WFJwa1NIMGdSRG9WQWhhTkcwUVFIMllpMUVDVUFBTFNmT1J2NSs4U3VZQXlKUVdWMWZiNit1cjNlbW1vM0dzWm5wcWVvUkRHSU9CZ084K3VvcmVQWFZWeERITVI1NTVKTjQ5TkhQNHRPZi9qU3ExUU8xOHcwRUFvRWRFUkc4OTk1N09ILytUZnpzWjI4ZVNYcTJ4SW5JV3FmVFhXbXZkNnh6T1h5RTZhY3RBbzRnUmZvVUZ1UmI3cFdWdDZCaTdGTXBwNkxhMXMvejlKRW1CQm1nMlVUazZTTlJKeG1ZaWpTdVpFU1VsUklWaFFVaTMrSVBzTEhDU2FLTzFia3NzeExuRmVsWFNhcjl2bFFxRmNtTGVaK0FuMTJ5TmZvY1RsM1psYjBFV3JUMGV4SlA0ZHkyRmJuekFQSjhSZHRSUzV2VzZtUXFONDhpeHhHUklTS2IrMjVDTkRLdlV5MEFBd0ljQVlaQUlEaUJGQkpsVVFXckQxaEoxZXVUbExqWWhwL2pncktGSUZRRUVQSy9oa1FCOGZWSkdqSEsyeEFBaGdCWjMraDIxamU2M1VhOVZqOCtNejFWcjFhUHBBMVJudWQ0ODgzemVQUE44ekRHNE1FSEh5cGsraG0wV3JmVVNDa1FDTnpENUhtT2Q5NTVHMisrK1NiZWV1c3Q5UHY5STMwOWE2MWJXZTlzdE5jN0hmR2x1cVUwcFV6VmNpRlJnR3pSTmNpQ2ZLT0RZZFd0VDk4T093d1JJWU5RSVU0ZlhSSnBDa0VtaFVqaGlvZ1VsQVBPVjk3YXpibWdXbFQyQXJCUnJNNnFPbkhxWW11M3BHN2JVYVNWWXRXVm5TdHZueXpmOXE3TkZMWUlkS2MwN21RVUNuaHpMNTA1ZytOWnB1aDBaS1BWUWhOOURKS0Vrc0dBOGlTQkdURFpLSFBLVENZaVlpTEtjLzk4QXBYbjUzc0xxUU9SOGRZV1ZXV0ZnQlVDTUJSZ0xzWTZWUXVsaWlvWFF2UVNsVTFCeW1RMEN0LzFLRUt4Mzg5RjlmZDNlLzJOYm0vUXExYVM2dkdaNmFsbXZWYTluWVlNdStHY3c3dnZ2b04zMzMwSHdGOWpmbjRlanp6eUNNNmVmUVFQUFBBQXpENVdhdzhFQXZjZU4yN2NLTDQ3M3NXNzcxNkV0Zm1SdjJhYVpmbksybnBuZmFQYlZkMzhyZ1hnRkNxK1VNZ0wxSytpUW00czZ0UmlKWldpQlIrSzlueStVWUprcW9WRXlZOTlRaVFYcFNMeWxKd0VxUkxsUkpRQnJuemMySEVVeU9NWVZsU2NFM1VpNGlLYlNGNWxGeGVwMnlyNnNsR3RTcVhUa1dIVCtPM21mZTRRZlU2bWI0Rml6c2VXTzdlS3c5OCtkNDdPQVZoZVhxWk9wME9Ed1lEU05LVzV1VG5Pc293R2d4YW56VDQzMDVUeldvMlR3Y0JrVVdTaUtETFpZQkJGVVdTWUtJSnFiSWtpeWhFelVhUkdFdkp0SUdLb0pvQ0pBVTJnU0pRMWdYSUNhRExjejBnQVNxQ0lBZmo3Z2RnZlEvMXhRQkdBV0lHSUNCRVVFZndxTHhHOFNFY3VaSHdPZWRoV2tJMHgwVXlyMlp4dU5SdEpITit4UlVTVEpNR0REejZJczJjZndTT1BuTVd4WStVNjRyNjBHTUJZRDhyTjdiMzJiMjV2ZjU4L3h0YnR2ZmFQdi9ibTlsNzd4eCs3M2Y0Nyt6NTNQdmZiZlovYm5mdEIzc2ZvZjhmdHR2M1ZkdHM3Nzk4OERPMXovL2hqdDl1Ly9YbnV0WCtuODl6Zis5ejV2ZC82Kzl6dTNBL3luZy96ZlE0R2ZWeThlQkVYTDE3RU8rKzhjNlNwMlZGRVZEZTYzZjdxeGthMzN4OE1NQXhLdkRoOTRLR2I0aHhleVBwSUNNWHFLR1hVV1U1YjhjTEQ1aVh6ODBEVnAyK0hjaXpTdEVWVnJpOHNjbm01WDRHY0hHZWlhalZHSHFsYUVPV2lhcTIxTHFsVy9iVzFMcXRXWGR6dnkwYWxJcFdObWxTckhVbVNSSmVYbDZXeVhmUzVRL0hRdmdVSzdDN1JmN3k4VEFCUVNyUTdOOGZ6YVVyZGJwZWRPMGJOWnA5N3Zkamt0WXlUUVdUeU9EVnhGQm1UR1pOekdqRlJSRVNSSllxb0ZKOXFQSlFvRUh0cFlpaFNRQk13RjRMRnBreUJHT0FFMEJpOCtYd0NJaEhFUklnQWlnZ1NLU2dDSVNLRlVXaFVoTHZEcGRNQU10RE5OVWpMUzYxU3FjNU10UnF0UnFQR2ZEUlI2VTdNek16ZzdObXpPSHYyTEI1NjZHRlVLcFVnMENEUXNlMGcwSStQUUVVRWx5OS9nSGZmdlloMzMzMFhTMHVMMk9rNytpam9wMm5XN216ME9wMXVUOVNuYVljWGhaUUZRaWdqVDRLRHFpT1FWWUtEd2hjTWxRMFRGSmE1YkJKZlNGUEtCdkhpWmJrWlVSYmpvRkwyd2kwcmNuTmZuYnZaNGcrMEdYbEdxbFpWcmFqYVdDcldKYzdsMXJvNHI3aXNhbDNjVDZSZXo5M0dSazJNV2RGR295RkxsWW8ybHBlbGxDY0FmTjh2VzdadmVRSzdqSUh1bU1xRjd3KzRYRWdVMkV6bHpnUFM3YTV3TzJwcE0ra0xraHFxeUlDb2dqeE5nUVNJMHBpc3ljSEZpek1WelhDWkZlcnJ0Q2lDS3FTWXFxSWdNcXFBa3Fnb1ZJa2hDaFlpRWxVVjhpa0ZCL1cvZ3NUL0dvcUovRjh5UVoyQWhCUUNrQk5JUkVSdUdKVVNDcEZLOFE5a1BDTHRwMm12djV3T3J0MjR5Vk90Wm1PNjFhelhLcFU3MGptaDNXN2pKei81Q1g3eWs1K0FpSERtekJrOC9QRERPSFBtZml3c0xJUUdEb0hBUnhoVnhmTHlNaTVkK2prdVhyeUluLy84NThpeTdJNmVnM05PMWphNi9iWE9SamYxTDY3WUx1SWtkWDZVekhmNGdaS0RueTVpUmRXUnNvV3FFeUxMMEZ3QlM2UlcxY3R1bUw3MUVhZHZ6VGNzQkpKTWZVVnVwcjdtTkZPNHpmMUVtVnJraUpCVEVXbkdRQzRqOG94YzdGeWxrR2VsNHFyR09rMFNTVnhmMmxGVkt5UHluRXpkemszVTk0eXlrenlCWFNKUVlQY29kTHRVcmoxemhvNTNPcHpuT2FXdEZqY0hBODVxTlU3NmZaTlhLaHlucWNtanlIQktrVFc1bVl4RTJWS0VJZ1U3akVZakg1MENTQUFmZ2Nvd1NrV0NZY29XQ1lIOU5tc01VRVNDV0tBeEVVVUFJa0JpQWhrdFVyb0U4cEZvbWNZbG5ZaElpMFc5ZlRjbEJvR2hQaXF0Vk9KNHB0bHFURFViZGZNaERscWVPREdITTJjV2NQcjBhU3dzbk5teWdreUlRUGY3UG5jKzk5dDlueUVDM1czL3ZSV0JkcnRkTEM1ZXdaVXIvcks0dUhqSGhWblM3ZlhUdGM1R3I5UHY5VlRVUzNPcytMSWM3NlNKaUxPTVF1R0toYTRkQ01VNHB4YWRobUJWMVRJb1Z5NVN1RUpGQkZrMlR5Z2kwYUp3aUlmUnFKVFJhQTQ3RW5VV2o1ZEk3V1RrR2JuWVNVVnRiSzNMS3hVWHA2bGt0WnBMK3VQam5qZGJMU21yYm04bmRWdHkwTEU5QmNhYks0d3QrWEs1aHRZWlNLZlRZZGR1NjhiTWpEVDd2cWlvbXFaSW80amlMS004amx4a1l0aDhNeEsxUkZCQS9ZVFF6YVlJNUZRZHFMaXRBdlovMFlTeW9HajBsNUk2R2thaUdndVYxV0VhZytBSTVGUXBLdlk3Z1VaK1B5S2dsT2RvUkVvT3ZscTNYT0M3M0tZc3RlNWF1cEpkdjdtNjFtelVhNjFHdmRhczE2ck1mRWRUdkRkdUxPUEdqV1c4OHNvckFQd1k2dno4UEJZV0ZyQ3dzSUQ1K2ROb05CcDM4cFFDZ1FCOGo5bHIxNjVoY2RHTDhzcVZLM2RzREhNbjBpekxPOTNlb04zWjZObmNXbEE1U3dFQy81dE55RStKS0FzeGZScDNOT0xjSFB1MDRyOXpMWlI4ZjF2eUZiRW9Wa2tScU9WeW1UTFNZdTRtall5QmVvRXF4SGNVa3JMWHJXK1FvRlJVNmc2cmJYMDZlRXllY2V3c094ZG5WdElra1VxYXlpQkpwRnJJTXlxNkRiVmFMVmtyR2lhTXBtNEI3S3Rwd25ic0t0RGQwcmhQUGZxb25udkRMM2UyZVNMdjQvTGxCekJYZENrYXROdTgxbXhxczkrWFFhMkdhcFloVFJMRVdZWWNRT1JpaktaemJlU24zTUwzOVFNUnFVWFpLTDY0MWxLYVdxUmtOd2V3QlZyTVEwTHg2d2pPajRIQ2lmcWlJa0FkRVp3SUhCRWNBRk04cDZqUUhZbEMvUmlwUTFsYzVIUDhCZ3BXS3ZyNWtsS24yM1dkYnJkSFROeXMxcXJOWnIzV3JOVXJ4dHo1bm41Wmx1SFNwVXU0ZE9uUzhMN3A2V2tzTFBnbzlmVHBCWnc4ZVJLSDJJZ3BFQWdBV0YxZExXUzVoTVhGSzdoMjdScEU1TU0rTGZRSGFiN1I2dzA2M1c0L3N6WWZmb2N5eENkQ3RCamZoQlRmY1p1cFc0SkFkU3pxQkdDTDcweEx2cyt0WmZiam5UcXN0aTNuZS9yYkdJa2llVXlnRTFLbHpTSWpDK1FSZklzK0xSYlpsa2p0Wk9ScDJibllXcGNuaWF0WTZ3WkpJbkcvTDJXcnZtcTFLa21TNk9YTE5hMVUzaCtUNTl6Y25ENzE2S09LcDdhZjg3bGI5QW5za2NJZFBtaWZxVndBR0MwcThwVzVBMjQybTV3V2xiblZMT00waWt6RldoNU41eHBqREJORmVZNml5TWhHcmtqdG9pZ0t3bWhxRjRoOUtwZGo2RWdGN3NoekFJMUY0Vk80VXFSMUNWR1J0bzJJRUFrUWtTS0NGMmxFZmpLcVVWTGppNDNLU2wxbFZUTGtGLzAyUkg0RkdTcWI0dnZQcEN3OElvSnlvMWF2Tkp2MVdyTmVyMFozMGR3VVl3enV1KzgrbkQ1OUd2UHpwM0g2OUdsTVRVMGpwSEJEQ2pla2NQZVh3czJ5Rkl1TGkxaGFXc0xTMGlJV0Z4ZVBmQjdtZmxGVjlOTTA2M1I3ZzQyTmJqOTN0cWlhSGN2WStXbUFSVENpU2tKRVRsV0ZTTXZITy9KTkVod3BPZDBNVUN5Szlud01MMDBBbGtERnRscXdGeDlUV1RCVUNOUlBieWtLZ1h3LzI4MnBMWnVTMWFMb1NJSGNxRnJWeUJjSnhYNU9xWFBPamFadDB5aVNVWGxXS2hYWjJOaVFVcDZqUlVPQXo1emVUdXEyNUZZRkN1d2cwZEh4MEUySmprOXZtWlNveVl5eGtSOFRkWllORVVWTWVVUkVrU3VtdlpBcktuWUprU3VsNnFOTHY2MGpZaVdNU0hSVHZsSk9hUkYvTENHSkNJaUl5SXlLdEVqaFJnbzFwR1NVWUlpS0ZLNGZCeDFPZDBFWm5Tb1lYcXJrdHd1cEtoaEUxS2hWS3MxR285YXExeXRSZFBlRmY0MUdBL1B6ODVpZlAxMWM3a01jSjBHZ1FhRDN2RUJGQkRkdTNNRFNraGZtNHVJaVZsWldjRGVocXRydEQ3Sk90enZvZG5zREsrcWdxaUF2eTJHRUNWVW9GZHZEREo3ZkpqaFZDSlhYQ3Fla2p2ellweTJMTkRmRjZWdm1zYktQTW9zb2xEZmxONnk4VlNCbkhiazlzb0IySVdDZnNpM1R0TVpQU3pIRGFETzJxbXBOSkU1VWJXUmo1eElmZVU3S2MzSzZTbGswZEpCeHovSXozZXR6MzVkQWdWMmlVR0JQaVpiVFd5WWxPbHBZVkVyVU1CdWJVOFJzRFJjRlJteDk1RWhFa1lYR0JCY1JvcGpJRFFVcUV4RXF5YVkwaC9mNzZOUkhuVUFNUWtSQ2tSY3BHU0pFSWw2b0JEV3E4Rk5kL09MZjQ5TmRpaXBkVXJCU3VhWnBJZFdSWWlOUUlkRVJtZGFyU2RKc05HcU5XclZTU1pJN05zZjBJQkFSVHB3NGdmbjVlZHgzM3luTXpzNWlkbllXalVZakNQU0E3ek1JZExmOWQ1ZEFuWE5ZVzF2RHpaczNpK2h5Q2RldVhZVzFGbmNiVGtSNnZYN1c2ZlVHM1Y1LzRFUmxUSnErSU1oSG5VVnhFRWFhekpDcUtFM082eHh0ak9ESFBJbGdGZVJVMVRHWGFWcDFyR3lWL1hpbitpSWczdzFJZFppMkhjcVVOeVBLMGZzQjVLckdLbXl1TUhhWXNsVU0wN1dpYWtVaUY4VnFuWWdibFdkWk1EUXBUek5SY2J1SFBJRmJpRDZCQXhRUmJUTWVxaWovTlJaRlJWdEtnUzlmUmptOUpjczZoSTBXTnBwQXM5L0hvRlpETlUyUjV4WGtTRUZWVnNsRWlVaUwzbjJxNUJ2R0s2QUFLWkVUQXBSQVFpUUNTeUlFSVNKSHZocFhxRmcrUjd3c2gyT2dCRmlCeFBDQ2pBaXdvb2hCNm04TFJRcTFYdFJxVkNrQ3FWVmZhT1NGV3M0YkplVXl2U3NFSnRLeHFGU2x1QS9FcW1CQ2tkNWxFRlM1TjBoZHI1K21JS0xZc0tuWGE1VkdyVmF0MTZySjNaTHFMY3ZybDVlWEFidzJ2RCtPWTh6T0hzT3hZN09ZblQyR21abFp6TTdPWUdabUZuRWNtdVVIN241VUZaMU9CNnVyYmJUYnExaGQ5WmVWbFp2WTJOakFmb09LTzQycWFqOU5iYTgzU0x2OWZqcEkwMHhCT2laTjNwU21hdEV2SENvcTVOdWJEcU5OZFdYWE5wK21WVC8yU2VSSTFTbDh5cmFVcHk5SDhlT2RwT1RBUmZzOEgzRU9xMjZWWVptNFdPZHpNNkxrSW5XTFlteFVDMUd5d2xJaytlZ3laNnJHbGEzNWRCanBraFVWSnlKT3F1cnl6QXJ5aW91eFZaNCs4bXpzR0hrQ09CUjVBZ2VJUUlkUDJERVNmUkxuaWxaLyswbm5UbHRMV1ZialdpM2p3U0F5cnBKemxFWEdKWllqWTR6TmZVclhHR1B5SEpGaFo4cVVMbGtVNlYxRUJGY0tNUVlRaVN2R1BIM0RoRmhvR0lINmF5SWZaVUtpc1lpMFRPM1NzT0dDVWZFeUpWQVJqYXBSa0tITmprVmJwcno0U0pTRzBhaFAvZnI3RlNNeUhZMU1BZkw3aWFwSkVqZnJ0VXE5VnF2VXE1VjRweUt1dTVGR296bU1WR2RtWm9ycldVeE50YkNac0FnUjZFSGZSNGhBYnkwQzdmZjdhTGRMU2JiUmJyZXh1cnFLZHJzTjM4cjE3aWZOY3RzYjlMTnViNUQyK3YzTStYbnZpdEVsSEVjaVRVVXBUUklpRlIyTE9yVm9iem94TmFWSTR5cmdDTDVneUl0VG5TbzVZcCsrOVN1cXNCMU4xVzVHbkd4OWRLcGo2VnRXV0tXaW1FalZzaWxrQ3hURlFjYWFZcDlHc1A5L2UrZXk1RVp5Wk8zakhwbEFGVWtOMnpTbTNkaHZ2ZEZLejZQMzZmZlI4MmcxbTluTHBHbU9tcXdDa09IK0w5dzlMbmtCVUJkZUcyN0dSbWJjVUNTejhmRWM5d2lFWlpzbDVYSEVsSFBPcGRJMjU1eU9nMHk3S2FmREtIZDNVMzU0Mk1sdTl5QWZoa0d2c1cwQjRHOS8rNHR1blhYN0ZIZ0Nyd05RNE1rUWZlVHBwNS9vM2VNakg0LzNmTG8vOHYzcHhLZmRqc2ZqTVoyR0lZM1R5SE5MTnpHbmFiSzlvMXlMakFiS0RsTy9CekFTaVlPUkJtUWRDVFMwTUNVaTY1Y2xTRWtwK1JZWE83V0lkQUE4RjZwdTd6YXFsSlJZU1JPVUdOMHJUSUZHd1JHQlZtR3FJQ0lpTlJ1WW9DQnJRWHB6ZjdkN2UzZS9mL3ZtYnZldDJyMlhncG54L3YxUER0V2Y4UDU5cU5hZi9GdHBiZ0E5OS91NEFYVDc5ekZOUi96NjZ3Y0g1YThGbUwvKyt1dFgyMS81a3BoeWxrOFBEOGVQbng2UEh4OGVEbFBPWnErYXlsUzRBNmYxZmcyYWlsSVlGUFl0WlpDV1YxTEtTaXFoTmdrdzFVbWF5YmY1a2RycFFncE1ESnFVTkMvQXlSejUwRGpNM2FBSm5aQmNaUUlHWGdlcnFobzBrODFKcXBQb01LbnFOQXhtMDg0dDI5TndrcWkwSFk5SGVSaEhHUjJlc1ZXbExSaDZEanlCTHdCUTRIVWcyaDIyY0R5eXZIdEh1OGZIZE5ydE9FOFRqOE9ROGpSeFNpa05VMG9UbjB5QlprNnRHdVZNZnAwTFRNVmhDczkxQ2tsY1c4NHo4cDhCMHBraVZhSUV3YUNlR3dWaFVEVWxTZ1N6ZDJPN0MxRUNLVU5McnRSeW93QnJYM2pFVkxhL0VLdEIweFNyZ3ZxaW8xQ2xjYStrSUJwVFNtL2YzTy9mN085MmQzZjdjYi83Y21mMGZxNFloaEh2My84SC92akgveXpLOWYzN24vRCsvZnR1cTgwTm9OaTgvdEVCcXFyNDhPRURQbno0RlI4K2ZNRC8vdS8vNHAvLytpZis3OE1ISEE0SGZNK1JjNWFIdytIMDZlRncrdmp3Y0RnY2p5Y0RvaXFVcWpVTDJCYSt2aWhJQVQrTnpiYlJDeWxaWHBNZzZnVkJwRkZ0R3dWRGxFR2FvV1JiVk1qeW5YWnFFTnk2cFF6UGRaTHlCTVpFWGpRMFY1eldabGF1Y3YxV2xGSmNGSWNxZE5CTVZoeVVOTGVxTXlYSnFqb05NdVpweURubm5OTXd5R21hY2hvR0dZOUhPZDdkWmY3dE45M3RkdDBoQ1Y4YW5zQXpBUXBjZ2lqd1Z6OW80UnFJL2pSTjFHNXpPWjMyblBjbkhoeWl3eW1sMk9xU0owNnRHbVhtbEdrYUNCaFlPSFcyYm9FcGhxcEFaU0NwOXdSVUJTcFNWS3hWNVZKeVM3ZURLQWhEQU5OVWFWaTd4QXFkV2J4Mml0RWNwcVpNVFlFMktwWGc3UnBiWXdoazN3Q24zYjFDS1RIei9kMStkNy9mNys3djl1UGRmaittTDN5UXcrZU1ZUml4MysveDV1MGIvT0hkSC9EdTNWdmMzZDNqL3Q1KzJmVWQ3dTd1d2MyVzJ4dEF2MzJBQXNEaGNNRER3d01lSHgvODlSRVBEdy80K1BFai92M3YvOFBIangveCtQajRYU3JKclRnY2o5UEQ0WEI2ZURpY0hnNlB4K05wbWd5WXBPWHJHbUZnYk8vSmM1cndTdHFpTGlQWDJVS3orWm94Tk9CVStHRXk5blhLV1lsY2JRWlFIWmdPVDRKbVZaNlU0c3V4SFlUTWJiSFFGSXJUQ29XNDNpc3FOQnU3VmxpeVFYU1lSQ1MzcWpNTmttT0x5alFhUEtmSkxOdHhyUG5PL1g0dnZ3NkRYZy9QN1p3bjhEeDRBaThBS0hCWmllS3ZmMS9kSjNvNC9ELzZyLzk2b0gvN3NYOVJvUnQ1MGJtbG0zYzdUc2VVOGpoeHFORTJONXFaRTA4ME1PZVU3WGpBVk9EcE1NMFpBek1sOGdQbEJWSVZhUU5TTllnbUFJTmFsVzZDUTlUc1hVMWkrMG1UaHAzckVDVlFVdHRQeWhRV2I4MkhkakNGUnI2MHo1a2liRjA0TkJlNTB1NjZBRFcrcUh5L0c4Zjd1N3ZSb1RwOHlXK1MrWnFSVXNKdXY4ZmQzUjNldkhtRFA3eDdWMkI3ZDNlUHU3czczTi9mWWIrL3gyNW54VTQzZ0xiWEx3ZW9pQlFnR2d3ZjhmajRpTWZIVC9qM3YzL0RwMCtmOFBEd2dNUHhZRld0TC9qcytSNUNSUFRoY0RnOVBCNU8vbm9VRVNGQWRRSE04bXNsdDBuaWYxaXp2WnlSMHlReFc3WW96UUpOZ29vVkJObnBRZ2JXQ2s4dkVNcXF5QXlkbE1nS2hhQVpWbVdieWZkNXFtb201aDZjcmpnWjdOVzRPb2xvVGdrRm1nMUVjMUtkUkZLV1FhY2trdHRjWjZqT2RCb2s3M0pPeDZPc1diYVI3MHpwWHpxT28vN2hEMytROXBBRVlMN1A4L1dWWjhTTEFBbzhYWWtDRmFMVGZ6MTAyMXltbjA1ZFh2UnR6blJ3RmJwemF6Y0tqRUtOcHBSNW1taEl6SWs1SjhsczIxRllVckYwSFp4RXVRUHBYSkVxbWJva0tmblRSQWJWQktKQmdVUkVBNm1rVUtWRmZWcXVOQkZSZ0pXMWZtV2FLOU1lcHVwRlJqT1lVbVAxVXF0VUFWT20xQUowRGxRRmhlVkxRS2pVOGY3dWJuZS8zNC83L2U2SFVxblBDU0xDT0k3WTdmYlk3L2U0YzBYNzl1MWJ2SHY3dGdCM0dBWXdNMUpLWUU3K1BhM3hSL2ZqQWxSRUlaSWhJc2haTUUwblU0bVBCM3o4K0JzK2Z2eUloMCtmOFBENGdNUGhnT1BoZ05QcDlFMmN1dk0xNDNnNjVZZkh3K25oZURnOVBCeU9oK054Z2owYXJTVzdDVXhGNURJOXR4bktFcXJGbWkwRlJBYk5VSnpvbEtiNmJnVFV3eEFzUDVwVjFRNUZJQ3NZMGxadEVtZTFMNzdPVUoySTdWN1ZGU2diSk0zS1hTck9DczQwS1hSaTBSeVdMUXRiL2pSSkZrazVoL0xNU1lycWpFS2hZWkRqOFNqSjkzZCtURW43Zk9lby9UYVZkWGdDbjA5NVJyd1lvTUJMSVBvMFMzYzM3VGp2Sms3SFk4cmp5SGxLS2ZFcGlRd2MrMFp6ZHBBeUo1b3dDSE5peWlrS2paZzRFZVZCeEJVbGZCK29VQ0lnOHFmSklHcEswL0trWXZBa0pCVWFRQVpSYXZPamFpY1lnWkNnNnFjV3JjSFVGQ3E2ZmFOMUwya0QxckJ1aXlLbFdvaEVVTERhNTk5Rm9OcmJtRW9kaDJHNDIrM0cvWDQzN0hmMmF6Y08zOXpoRHQ5cUVKSC9ZakJUZ1N0ekFqT0RFeU9WNjRRVUVFNEppUk5TU2tpRFhRL0RZUGZKeDNPemp0dlNxZ1l5RWRzYm4zT2UvWnFRczlpclpPUkpHZ0JtWk1tUUxCQ0pYN21zSnlMMlNTMHVobjV3VmZnYUlhcDZQQjd6NFhnNlBSNFArZkI0T2oyZWpxZE9YVUp3RlRDTExVdGFDNEJheFdsV2JnOUtneWVhQ3R0UW1GaUhwcDlsNnljS2taWThaNk0yTTdIblFNMm1kWGk2TW1VMmtLcGJ1ZXo3UU10WGxtbFdUWk9vNUNnUUVrMlpSYklPbUZnTW5DblpRUWdpUTJhZUpNdVkwNUJ6T3AwazczWTVIUWM1RGtkNWptVUxmRmw0QXE4RVVPQXlSTnZERm9ENlhhSnJFTjJ5ZFBQOVBaME9oeFFnSFU0cDVURnpPbkdTSVhOS0tVMFRwOFJUTXBCYWZwUXorWFVlT0ZNeVJab0hZazZTRVljMEpJRlkzaE13ZUtva1U2WklidTg2UkNsMXFsUXBFYzN5b1IxTWlYMXZhWUVwR1NqZDdpVUdLYXNTa3dOellmVzZsVHRYcFBhcTVOcGlxVkRKSWJwb3F5b1ZBSmlJOTd2ZGVMZmZEUVdzNHpoODZjUHhiM0dMYnlsTzA1UVB4MU0rSEkvVDRYaVlIaDlQcCtOMG11QWZ5RVZkRWkzdFdFTFgxaXRNVmZ2ZmRVVnh0dGJ0ekpwMUtBcVVYR25XZkdjUHphaTZyZEJzODU1YTJqcTFhUXFVMmRxc29HaFNZb01vNFBsUWc2a3BTa3dxa2hWcFl0RnNSVUZwRWhHL3RqeG5TcEt6REhsd3RjbFRranhLVHFjazA1Z0xPTWY5UHFlSEJ6MW4yVzdsT3dFLzJ4WTR1ODhUZUIxNEFxOElVT0Q1RUFXQTF0SnR0N3EwYWpUblRQZW5QWjkyUjQ1akFQTTA4VGlPUEoxT2FSZ0dqaUtqcU5iTnpJa3pKK0djQXFUaWlyU0FWRGdwUjk1VEVvbEJVc3pPVGRYZWxVRk51YmFxMUxleWFDSmdzUE55M2VKMWlISnNjekZseW1iekt2ZUZSOG9nWXJMMjJhbEc3VWxIb1VvM0xGNDdnNThEcUNBUWFWT1VaQlcvcENqS0ZaaEJsV0ZWREFCb040ekQzZDF1Mk85Mm82blZNUTNEa0c1VXZjV1BGS1lxQTVUSDZmRjRQQjBlajFOV2lYTmpWUUNzd05JaFdxcGtGVkgwMHdHMEZQNFVKZHBhdE1XVzdaVm5weklKS2tva1VEV1FOZ1ZCWk4rTm5FRlVvQ20rWFFVQlQyWExkd0tUeG9FSnFybFZtOFNXKzZ3MkxadnFWTTNLT3BGeUJqQ1JhRmF1NE5Ta0UydktBVTZXbENWSmpqeG5TclZJYUpvbUdjWXhuMDRuU2NNZ2NSemZlTnpKdzNpUWxKSzJxbk81UmNVc1d3RDRtdkFFWGhtZ3dDWkVnZkpoL1ZmNjYxL3Q2aHBMTi8veGozUjRxR3BVM21XS1l3RHpxZHE2cCtNeGplUElrZ2RPYVVxU0U1OERhYkYyaFEyVUpNbmdhSlczeGVJbFNpcnE5aTZsVnBVU2FZcWovK3p3ZWQvbUl0cUFOV0NxeVFCWkRxcG56NW15cWlZbFlsSS9aNWRRcmR5aVRwVnJEblZwN1FaUU1TdENNcUNDeWppL0QwQmlDVlgwN2IzOUczL0Z1MkVZZHJ0eDJJMWoybzNqTUk1RDJvMWorbFpPVXJyRkxlYWhxbnFhSmptZXBudzhuZkxwZEpvTzAyazZIazdaOWx2YXNITTJyQUtZdzdMTUtXM2tsYkpRYXU3UnE4OGxNUDFhb1VKRW5jb0VFTitZa3BVZ3BGb1BmN2VjWnV6dHpIRExOdkthQVVwaXlocm4yMnA3TkY4VUZMbmE5TzBxTmw1enRXalpDNGtNeGxaRUpEbXMyblBnNUpRbDV5RnptdVIwT3NuWTJyWGpLSEVjSC8rV3RLak8rM3RKLzlwV25jRGNzZ1dBODE5TDlwcndCRDREUUlGcklJb1hxZEg4N2gyZGpyVlNOMDlUQWVrNGpaekhpZk9VMGpCa2prS2pBS21reEp3dFIyb2dOUlZwVmJ2WkZLcFFZcEpVQ281SWs0cHZaYkg4cUFIU2JWNnhZcU9rYzBYYXdyUlJwbWJqTnVwVGtaVGcxYmgyb3BHUHFjVkhxa3lrckdDNkNxaE45UzRwU0J0VmFublVCcmdLV3VSUzFURnVlZGpXQXNhV1dnVUFCdkZ1YjFCMXVLWnhITkp1R05QWCtIcTNXL3krUWdGTXB5a2ZwMU1PVVBxdjZYU2Nza01QMkZhVnNZeFpyS1NtQVh1SVJ1NnlxRXRUZ00yOUZmMkVsYnRTVGJzT1RJS29LZ21JU2pHUVY5SjJKd2lSUXBSbTIxSkEwaW5ORHByVWdOVHNXbFlITE5RVnBzRVdpc2tnU1RrS2cwUTVNMnNXa2N5YWNsVFZzckNEVTdMWUI2MEVPS05BYUpxU0pLK3VQUTBuS2VEMGZaMFA0eWpqYmlmcHQ5LzBjNmxPNFBYaENYd21nSmJGbjJIcEFtZlVhRk9wbTNPbWF1c2FTUGZUeE5NVklCMlNjRnRzVkVEcStWRW1TU3lVaENTRnZVc2tEbFpLcGVpSVlMQVVQNUdJSklublVOV0tpSnF2UDRNclhNK0ZrckxsVE1GS1NEN2VEcUdQODNaRG5TcFpVZEZNbFJhN2wwRHRkWjgzSmJaL0NJT1d0bS9Oblc1QmRRYklvbGFidjhjRldHZUt0ZnlkSjJMZUc4MGo4d0FBSUFCSlJFRlU3Y2RoTjR4cEdGSWFoNEdISWFVaERUd01pVy9xOVJhWFFsVjF5bGxPVTVacG1zU3VwM3lhcGdMSnB0WlpBWHZ3aTZKY0JhVmZyNmhLQVhBSmx2NHgydG14WnV1U3VnMWI4cGxRYUxWaTIrdGViYXBDaUtySzlHOVF5VERDMnZuZkdtb1UyZXpoT0hyUHRxWEVYRlV2R0FJbUpnZXNhbFlPcUNKSFVaQ29abGViT1d4YVZzN0Nta1U1dTEzYmc5T0JPV1dXUytBY2hxTWNHbkNHWFp0UzByYkM5cExxQkw2T1pUdVB6d3BRNEJvMTJwOWNCSnhYbzFHcG02ZUpGcmJ1YWM5eW4yay9UVHpGaVVZemtJYTFLekp3RkJ1bEpDeVpFek9sVERteGNCS1dzSHFaMmVCSnlJTXFNOFdCODI3NVNnR3VXN1pVVmF2dEY3VzhwK2MrVXdFbnZPakljcDhKUkhhaUVXbFl2YXltUmsyVnV2SmNBbFVaU2w2UjIxbStkc0tSZ3J4b3FiTjNVUTlwYUtCYUZlZk0vdDFTcTBBSFZrS2pXR3NmQXkxY2dWNjUya0NpWVV4cFRDa053OGpqa05Jd0REd09pWWMwcEJ0a2YreFFWVXc1eXpUbFBPVXBJSm50OVpSUE9lZnBsS1ZSa1VEa0h3RjBrT3hWbzNXRDFKalhnZExlZXFFcVNYc2JkdEVtUmFITzFLVUIyMDhLVW9nNmRBc2tGUXFLUE9ZQ21LSnFhbE5kZlpxYTlaT0QzS0oxUldtdnFDQjFhR2FIcGtSZTAyeGFVNXlzbXNXQW1hc2w2eFc1SktKSWs2bE56aXdpRXNCa3lVbFRGdEhNU1hJT1lIcEZiVmkxQzNBT2d3eEhBeWMvSkkzcTJ0YXVUYXNWdHR1cUU3aDhzcEEvVTU4VmNKOGRvTUR6TFYxZ3FVWUJ3UGFOWmdwYmQzb1dTRE9iWFNzOHBGUVZxU1N1ZVZKSkxNeWhTc1BhYlZScGZNbDJzV3JYWVVvRm9zWG1iYmU1VU1CVEVvalo1MFhGYlZJRmN5aFo5ZXJjczBBMVVCYTFhc0J5SlJvcTFRQ3I1ZWhBTzkzSXRzODB5dFNCMmRqRU1MVzZEbGEyVDQzZThuVzRVdCtIcnIvWXhZQ2FoQTdBZHVNb0VZWVVrQjA0Y2FLVU9LV1VyRUlzSlI0U3h6V2RlZlp1OFFWQ1JEU0xhTTRpV2JMa0xKcHp0cS9WeUZtbUxEcmxVejVOT1U4NVN3TStvRkdRMWt6VzN0dXFaUnhjOVdrUHllaFhjZ200QmtvaXoySGFHL2plUzZnMnloTkV2cDNFNXNCQnF0WW5VS2picm1IVGFxY3FVYXB3VjRIcHRxd1FVUlk3bnM4QTZEbFBKYzVRRVJBYlJEVU9RU2hLMWV4WlVZbjg1VFkwdmQ4VXFZVGFMRmF0cTAxaGthbzJVMmJPVWhWbkZtWVdFY21jMHBQQk9ReURobDJiVXRLM2I5OEtBTHlHNmdRK1B6eUJMd1JRNEVxSS92SUwvdnIzcDZuUnNIVkxmalMvb3ppRUlmYVAzb25RSEtTU00xdlY3bVRWdXpselprNkRDR2ZtbEVSWW1GTVM1azZWQ3JPVWV3T3FxZExHNGhWSnhLWWdXNWlDZkZ4QVU0bkp4ek16cTgxamxhcEtsWWk1NUV5Vlc3Q2luSzhMQm9ybHk3YU4xQzFkVmY5eWIvTGNxYXRVMVRoenR6a2kwS0hhS05WaS96WkhDbFpsV2tFTDJDY1V6Y0VLb0JZdXFiTjlCbGYyMXprd0YyUFUyM2tOc3YyejVIT1lpQkl6RDJuZ2xBeXFLYVUwTUZOS3lkbzRFVEVSRXhFekV4TVJNZC9JNjZHcUVGVlZFUlY3VVFlajVKeTF3akNMZzFJbmg2VHRZRVFMTzZENXdPdmg2QWN4OUFxeUhWOWZDV3RqMVArMTFoVDBSSityUjNLbFdkbzdDemFzVmpVWXVnM2JLY3NLUzM5UHU0NmNwZjBiMGIrNEdnS2lPQTFJQUhIN1YvMzdPTkdlVzF0QjZibE1LZC9aYVdxVG1CeU9uRVZFdkhvMjI0RUtsTU9laFlxMDBDUWxVYkZxMjg2aUpaRUdsSmsxVldDNjJzd3N3aUk1bXcyWEozOU5LY2swVFpLR0lVL1RKSnlTek1INXlLeXhuek1PUTBpcHpYT3UyYlVYVk9kZi9xTDQ1WmZ1OGR4NFpyOEkyTDRZUU1zYnZvSWFCZjZNTFpCR2ZuUU9Vcm5QMUJjYlRaekgwVUNhQjVZaHM4akE4enhwU3NLdEt0V2tUUDVxc0tURXJCenF0TCt2Y0F4bHFreGNjcVlhZVZCMXhhbE56dFRVS2NmK1VNdWRzbHJ1MHlwNkc2RDZWaG16ZkVrWm5USWxWbEtpNVpkOHMzL2FNSUVwb0dvY0xJVklkVzlwMlZPNkN0WTF4VnFzWUdiN04zelRibi9uRGpyZmFyUE1xL2FBYlorVEpUaGpUR01YVzdPOTMxbmd6dWY3czhwRXpNUUdWaWJZTlhHQWxwbUpHdkQ2NFFkRVJmdVdrMzRvL3NCQ2piZnRNYTcyV3BmOVhQNS9xV3NydjdGUCtHaEV2WW5CMmd5MlYxVVJnNkdJR0FpMXZxcUlkRzJTVld5SGgvMkJ4RUZEdFBqUVdnRFJmMGQxWWtDeG43OEdWUzFqVmdIcE9jMitQNVJqVVpNaXdOeDY3UlZsdFY4N1VQcldrNklXL1o1QUVuKzhCa3R4VzlZaDJuNmxtRlhFS3FCRmFjS1ZabGl5UXFZd0E1alZsbzF2VktGTXBDSmFEME1vVmJldGZXc0ZRbEp5bXFJU1NqTWdHOUFVSVNucXNydlhUSmxFazcyMmFqTnMyamEveVR3SlQwbW1GT0E4eVdrWXV1S2dVSnd0T00vbk9lOFYrRzk4RDZxempTOE9VT0JLaU03TzBnWFdiVjBBT0F0U3I5aHRRUnJGUm5vbkZQdEljODQ4NW9Gemx5YzFlMWNhVmFwUnhXdkowU1NVa3loenEwVFY3K2N3TFRhdXFsbXp0dldGbGFKUXFJNUJON1p1ZFdFRG94VWh6WUNxUllXMlFGVm1jcXUyMkw0Z2xFcGZWNXNGcWtRd3NGT3hmd3RrNjk3U1RxMXVnclU1NEtHRDZFeTVGa1ZyVDhjQ3NMQ2ZZdFhXM1FRdG9WbG45bXd0bGFwZFY0VnJYWFYrR1RLSDd2cjYyNkZueGwyYjNUMTNZdDRTYnRzL3llcDBhNWV1clFFaFlIL05jYnVoTFB0cnp6M0d6M2RHWFJaRkdpcHhCWkNBL1Z1Q3VqVk1TUzdoV1N0czEwQzVwaXByenRKQVcvT1dyaXdiV05wOHQyQUpXdXhZZ29pcUVxZ0RwcW9LclFOVGlEU0x3YkNGWmRuZldmT2FtcW43U2pLS29xRXlaZzJhMXR3b1R4S0p2WnZNSXBKU3Bwd2wxQ1l6UzdWcExiK1pwaVNuTkVsS1NXSWZKejJ5Um5GUUIwNnZyRDBIVGdDNGJOZDJ1YzdOWi9kTHd4UDRTZ0FGemtJVVdGR2p3QXRCMmloU2tUZDAyaDA1VHhQZnlSM2wzV1QyYmg1WmRrSmg3MHJPUE1qQUUwOUpKUEhnYWpSelRra1NxL203U1ZnNGFUSnJWMDF0em1GYTcxczE2Ulc4VE15aUxFU0pWYmxYcDJCbFlnMmJ0ejJJWVFGVWIydXRYdldpSWlnek1hbTJLdFZCMmtLVjFHR0xacytvZ1ZRQlppZ3BPQ0FYZWRVR3JBYlNVb1Y3RnE0b2xtNVZya0FEV0FDUmJ3VTJJUXNVRU1iWURkajI0K3RBNnJ0MS9teGV1a2UzWnNRYUVIV3g5aXd1VWZUQ2ViTUJ0M05UdGlHN3FTeDlvblpOQWNOK3pRVkVPMVc2Q2RBZWptVnM2VmRYa2diWEpqZHBhMXlFWk4rR0FHV1RyeVNJaW0xODludU5iMEF4V0JKRVhWbTJzSVJmazI5SEVSVTFTSkpvb3pURGtvMjg1d3lZRlg0aVFzeVpiQ0ZwVmFaWTRVVVdKaUZSaVVyYVZyVzJrR3loeWNwWkhKcVpzckN3U05KTW1TVnpsdVNxYzhvc3pGa0dHZkxFcGpMRHB1VWo2eWtaT05OeGtFZCsxT1NISURCLzBtc1ZKM0FlbkFCd3JlcTBwK1ByZ095ckFiVDhBRmVwVVd5Q3RPWkhEYVEvKy9XNUhHa1VHNGtJblhZN1ZoSGFUUlBMM1IyMWVWSlZwYXBLUFdlYXE4VXJrcmkxZUpNd2kxVWRKV1hoRnFaRmliS3lWZWRhQVpJMkZiY3hubHRWcXNwdFlWR3o3WVVYUUZWaWJrQktzTG1xNnVzUUUvd3NYWWVxYjUyaEZhaUdhaVZWWmJZY3B1ZFNHN1hhS1ZRdTk5QmlCVjhCVjdOYlZ3Q0xiYVVhRnExMi9UNWpOaWF1WjgvVkNuU3RlVU90cnQvMzRPU045dFZvdXkrQmRURzMrUi8zd3YvRExUQmxvMzE3c2M2ZWJaZFlnV0V6dmxXdHRBWkdIeHU1enpwbXFTeUJKU0I5emdWSWVsRlIwMGJhMjY5bGp0K2JhaFNycUJPM2hBczRXMWphZFNoS1Y1S0F1cnIwdloxaU9VME51RkpUUE5RQWswanF0cFJhTUdUcm1Nb1UwZ0xCcU15bFl2R3lVS3M0aGFTRkpsbHlNN1A5UjFxTE5xQ1pVczF0Y2twRmJSS1J0dmxOZm56VTR6QUlNZXQ0UEFvemF4UUhuY3R4N3ZkNy9SOVVjQUliZVU1Z0RzNjE1OUlhdnpMQXZqcEFnU2VvMFpVdEw4RFRRZHBXN2NZKzBueC9UNUpybnJUWXV5dXFOSEtsSWdOTHlqeklOa3hEbVlveXA0Q29LQ3NMaTNCaXRzS2ZDbGd2SW1KbHQzZlpjcWYxWHJVbzFWV2dlZ0dTNVVFNVRqaXFWYnRndG4yakRsS0Nzam15cmxTVi9lQUZVRk9rUkZhU1U5V3EydUc5SFZndGwxbSsyOVFyY3h2Vld2S3FhOHJWbjRZV3NBQmFCVnVVWmVsYkI2Mmp0UUZwR2RNOVZ3SFB5TVBXN2xYNHJqeVQ4Zk0xNGROMDFyNHFTR3RoMVROQ0czdTF4a0p3QnBBdUs5RVZ4UmtUNi91VS9DUG1NQ3dqT29pU3VpMjdCVVpyYVE0MmFFRFk5QlZBeHM4K1Y1SU5KSXVhTEFyU3dLaGxUQWZLbWFvVVd5T0tmQUExRzdZcVM5c2gwb0NUU0NCUkpPUm4yQkpFeGZPZmpkSmNBNllZS0RPRmFqV3AyTjBUVXhiUkJwQWtkaS9aQUdud3pFTENNNlc1Q2sxbVljOXBsdHptaHRxa1I5YVMzMHhKNDd6YWxKSXVxMnFmQms1Z2Mydkt5alBaUG1WZkgxN2ZCRUFqWGdMUzF0WUZLa2lCZFdzM1FOb2V5TkRhdTB0Vk9ySHU5NVJ6WnNrREQwTm1GYUVXcGtQS0xKZGd5bUxBTE5ZdnM3QnlaL1dLc0hwVmJsR1pEbHFsQUhBRktwUTVMRjlWcTNPQnEwNHZUaXB3aFJJUks5djJGVDk3ZHc1VjluMmh6VFdEREtxdVZya28xRGxZL2I3a1Y5Mk9MWEFGOWNyMUltRHQ3MzRHMlhXWXh0cnhtVnM5NGczZ2RzL1ZFcnhBaGVjcVRCZlA2eHlhQU1DODN2NDVJM0tCYSswcncxdGZ0b0ZtZTc4S3dtYnVFb2plNlRZdTFYRXpNSGJRdE1FRmpqNXNHNUJObS8vbGFndEpHeHQ1U2dmakhKUUVFVFhMRnVTd2RPVUpJUTBiRnVMZm1OTEMwcyttTlZoYUJXOFBTUjlQSkNwaDU1b2xpNm9rSFpobTAxSVoyOXE1SXNvc3JUWExRcEpKcWhWTFpMQThBMDNMYS9iUUpHYWRwaVRzdVUwNkhQUTBEQ3RxczlxMDdRRUlXK0NjVzdXQWdSTllzV3UvTTNCR2ZGTUFqWGhLZmhRQXRncU5nSE1ndFgya2NTQkQ1RW5sbllIMGREcHh6dmNVMWJ1Ukt4VVJPbWZ4aWtOMVRabHFFazdDTENLc1JrNVdGaWEzZkZXWkRZN01xdExidnFGRzFWVW1PL3dhaGRwYnZqWkdWWmw3a0ZvZXRGV3NSbTlxb09wVnVHd3EwM09xWnN1MmFoWFVnaFdoV0xuWXRUYWZJNDlaWUJ1UUxFcTFyOFRkQWl6UVFoWUFGcUR0aW9tcU5kemxSRHZnK3BxendxRk9GclpBN1hLWXhVSmVmejZibU52RXEvRUtSVVNkdmJvZUt5cXpXYkROb2RidEhpc2diRlJwQTBTN25XOU5vZm0ya3g2TXNVWUJJWEFSa0dVdFU1SnVyV29MU1pHcUxrRlFFbWdveWc2VTl0ZGVWU1ZCUzg2U1NLRWlwbDVKQTVZaUJzb09sbmF0QVU3eE5zdGx1cDBibG15bk1HME1FVW5ZczBRcXZSM0xRaUlHV2Jka3RTaFBFY29rekFaTmNsaXVLVTFtMW5NV0xUTnJtOXZraDZRcFBlZzRqdkxSMVdia04rTUFoTmpIK1ZSdy9pMGVybTg4ejNrdXZrbUFBaGNoQ3JRZlZMLzhBdnk5cjlnRmx0WXUvdnhuVEEvOTloY0FlSW9xdlJPaHRvSjNKM3VLZmFVNzNWSEFWR1RnWVZqQ1ZKTHdvQU9wQ0VzQXRWT25BVkc3TG9WSTBnQnhCYWpVdFlWYVpZT245N0dDcm9RcWhmM0xhdm5OcWxEdFdsV3RvS2lCYVNqV2dDTXIyNEdGNVo2b3dyV0JLUUt3WHJGTFNqeUhhYkdEQTRTMXZlWXhBNVNseUttRHBUb29hYU1BcWJkaWUvaWl2Rys1b2N2NXp2Vm5XSmZRZlpWWXMzUDlIWmZ0ODd4b2MwLytJYmFBWUR0M3BSQklmV3hSaTlaWTdGeURvbDkzYTFRNDlrZm5OZTBHUElldmx0T0JXbWdHSklVcVZFbElpL1ZLMEtJb0cyZ2FxR2VxMHErRm9PUTJMQm5WTHNKU0NGb2dTU1NrNG5EVUFrY05DM1lHekxLR2d6SUtnTUtpSlZlY25jck1MTVFzRTAzS0s5Q2NKdGF3WjlPVTVFaEhqWDJiUno1b1cwbjd5S3hQVVpzQTBHMUh1YjlYL0xkdFJ3SFdyZHEvQWNDVit6bnJFL3h0Z3VxYkJXakU5Yll1Vmd1TmdQUDdTQUZnYnUrdXFkS1NLM1ZWT3JkNFZZVGFmR2tMVTlXUnd1WlZGWW9DSkFPb3NFcGlIWlRXMUtrb2N4TGx1ZDJyb3B5U2trUFcya3hKT2p4N3RlcTJMeGwvVzZncWF3RFJyOFArUlFFcnNhbElaYWlTMmNsK1lsR0ExVGFhdUdMMVFpV0haMUd0QmFaTDVhcXdzdVE1WUhzRkMzVHRGSkMxSjZXRnBtcHNxeXh6c0FRdXdENm5VN2oxNlpvcDFRby9kcmh1UG90endMYnRuelBXbE9leTBNZCtraktGVkZ5RjBoeVVObkpoOFJMRUlldjNDeUEyaFVGQW95UmpEYTFxdGVRaHBTclFUa0d1QXRKZ09sZVNEc2xXVFliMUt2RDFURkZxZ0JKa05xN25LOTJDZFFqNm1MQmhTVVFyTE9PNmdTV0prSkJHbFd3UFNjdFpFaFU0Q3BGSXpxUlU0Rmh0MmN5V3kxeFZtUk1wc1cwNTRhWVFpTWhnbVhNU29wUE9vUmw1VFdMV3VVVWJhclBOYlM3VlptL1RBbkZ5MFBZK1R1QjVCVUxBdHd2T2lHOGVvQkZQVXFSbmlvMkF5L1l1QU9RLy9wR21VNjlLODd0M0pMbFc4TGFGUjNjaXRBWlRWYVY1em5RYzFYS3BrbmdjbE9TQ09nVkFhMEMxNDltVlZhcmxxMWJKeXdtSlZHVUdVbGVGTFZTaHJFWkVWbGFHT2hBdGowcE5UcFZhdFFwN2R1cTlLaFhGQ3BEeE1HQmFZRXpzZVZFdDFiOXUwUzRBcTRSR3dXSVZzc0FNdEVCUnN5VjNTYXBXQmxWVmJabUhNcTRCYTc4RlpxV1lxSUhqTXJkWkZXdHBLWENleDJzcDBYWGxHWkNMa0pXeFhZRVJ0WUFyamIwdHUxQ2ZQU3hETGRyWkNRRS9HeGVxVWJxK2F1R3V3bEZJUVdWN1NRZkl0bzNzZEI4dGtBd0ZDVmV1cmpvYlJhbXRpb1ROcS9kRUdqbExrSi9sWTNsTGJaU2xGU0wxc0ZSYXFFdVdqS3pzd0N5V0xOczFrSFVObUFEMG5NcGtaamxOcE16WjkyV1N6bk9hUktScjBIeU1heThJS3BXMEtXbnMzU3hxY3h3MS9XdXBOb0h6Tmkzd3ZCd244TzJETStLN0FXakVVMEVhaHpFQTUvT2tyYjBMWEZLbG1lVGRPNm9XcjFDZkx6V1lxdlEyYjhCMEhFMmxxbzQwaUxBTVFpTENPZ3pVVzcxS0pYZXFTbm9HcU9wcWxOdHIyeklUdGk5VmxXcWdMQ0IxbTlhdURaU0dJNlZXaWJacUZRcnF3WW9BbWVjOUsyaFg0RXBnVk9XcW9BVmdWNEE2YnpOWXNYbUhEV2dCMkkrbmFyRDFoaGFxZ1BsLzdQMjl3dTNIMkswQjJKYWFXNzArb0x1UDIyWnNROVpyaW9waStJV2Rud0JtT2MrelcxWE9GQW1GZGR0VjJaYnhIVnpqL2FwS25JM3hmb01pS1ZVYnVRRWpYUG1laDJPMHpRRnBYbndvU1Npb3NYc2RrdWpCNkxDVVVMY0ZsUFpVOWdxektFK1FWaHZXWU5yYXUrUmdMUmFzUWRMVzQ3Qm1SU2k3TXZYckxXQVNpMlFpalZ6bVJOUlpzelJOeXN6Q0UrdkVYSlRtNmNUS1RVNnoyTFBNMmtIVGxTWXpGNHVXSFpwWHFjMFZteGJZMnNmNVk0SXo0cnNEYU1UVFFJcXpCeklBUzN2M1ovVGJZSUQxWEdscjhjNWhXbXhldVNPOUU0b0NKTjBMNVd5S05LemV1VHBWSFNseXA2b0R6WUdxYXBhdndkSXQzK1lhU1VsY21hWUVLaW8xZ2RhZ21wcHJaU1ZXWnJWL3ZETksvdFNzV0E3d0ZiQmFiaFdXa0tMV0NpNVE1QjZ1c0dmUHhvQ0pXekNxZGtCVlY2TmduOU1DRlZyeWx4MW9BYUJDRmF2QXRZNlNENDBjS1RzMGUvaEd0UGxUTHp6eThjMjNuWGJQM2pZc1A3TUMzYkJ0WlFuSDByZklkY0lnQ0FCQ1RZNHp4cGN4SzBDTWZnbm96c0ZvN3hmdEtIQ0UybzZUT1REclhCSExxVVp1RW9CMmtCU3BjMXN3MnIrdHRPWXFQZDhKY25DR3dvU3BWaVd4UHJObUE1QzV1ZTVnbWFHaExyTmZNNHNna3dwNy9uUjJuZTE2QVV5aVNTT1hTWFRTdWNvTWE1YVkxYXBuV2FNUWlCNVptWmYyYkEvTmF0R2V5MjNXYlNoTG14YTQ2Z0NFNXZsYWorOE5uQkhmTFVBalhnT2t3SVlxM2N5VlpnTCtoS2ZDdEMxQUVySGFncm5WTzQ1eFhYT242dUFNdTNjT1ZLajZmU0xQb1ZKU080SVFTVW1VT1Nrb0NwT1NLZ2tyUTgzbVhZTXFvS1MyZWJVb3p0NENWa3BnVXJPQktSUnJnQmJLYnJrV21NN2hXaUE2czRVTmtBNVFGQVZyc09RV3NtQzNYVnZRT3RnNjJBS21hcjM0cUNrWUtuWXhnQTY4Nk1mQTE3QzF1UGJ4RElJOUxCZlBacDgzUFY5MmU3MENyU00yQ29tV2VjMjRsYmFTVmpxYmwyYVFiRUZvN3pvSEpWQUxmQ2hPSDZwUWhDQlVZd1VqQUZRNGlzOGxCMmJNRjVFSzJKbXFSSUhpSEpKeGJ6WndBV01vU2xqdU1VTTA0QmdXYkNoU3lhTEVya0kzWUFuS2FybExHMFBDa2duS1pPQmt0cUlmOHV1SnNuSm1BWm45MmdLenRXV0pTTnRjSmhGcHF6SmJhemFnMlJZQ1BRV2F3RC9RVnRJQ3k5d21jTUdtQlg0MzRJejQ3Z0VhOFdTUU5wVzd3TFlxQlphNVVtQUcwei85Q1l0ODZRV1lpZ2pkeVIzSm5YUldyKzZ0endDNm8ycjNLclZBRFlVNmhpb3RFRldxUlVuQ3FvazZsYXBLbWt4SlZxZ21TaXFzb1ZTaHhLS01WRlFwZVg2Vk5zQmFGQ3RjamJMR3RhdFcxUHNLVnhEWXQ2aWNBU3ptUUVYWXI5eU5RVkdPemZ2RjMzc0RYR3JYYWFFTEZDREhNeFB3dFNXcTZweEQxaTdyZFR1dmpRTHB0U2c4M1ZLbVZQT1ZHeEZ3bTgvclhkMFZvRXBWbzFXNVZnamEyZ0c4SG9ieFErc01pT1c5Q0tZOHhYKzJCb3hvbEdQNXphOEFjeFdRRUlXUVdiWU5KTXY3dGZldU9ndkFYVkZ1Z0RMc1dDVUs5VWdPWEJISzBFd3NSRmtEbGtTaWxMMVN0MUdYUkZremN5bjZxYkEwU0o2SU5CUm1DMHdpS3JZc1JRRVFzOUtCdGJkbVdSLzUwUUQ2RkdpT28rSWY2OUFFMW5PYndJYmFYRmJVbG1kbUs3NTNjRWI4TUFCdDQwdW9VcUFXSGdIQVhKbTJPVk1BV0FXcUZ5R0ZPcFZtcjZtSzBCeW9POTJSeklEYVdyNVI0V3Q5UzVYYVFqVnlxY2xWYTZ0VXpmNzFJaVhQcWJacXRlUlBEYXhWc1NxSUcwQjJxclhlRTJzVUVLbmJzaDFnRFhTS1RjakMzcWUwb1VJVUM2aWlBTEY4VTBvTHlBSmRoeXNYb0RaQUxPTk4yVFpybGk5dWlXZW1VNWlkR2kxMFhLL09uVVh6TTlxa3RUTnU1MUhnVm0vOEhaczhaN2RPYzBadGdiUE9ENDF2VmFiQUlGa0tsQUp3ZFEwVjg0Z1hVUFMrYm15QVVBSm1tM0NFd3BWaUMwaEk3YmNkSzdHT2IxOEpOZW1BTlRDNkNxMktVa3NlczFHVmtiTUVzakt6SUpPdUtFdEY1QzRiV0s2cFN5TFNxSlJ0TGRrV21IeGlQYTRBTTFSbU9nN0NiUGxNWXRhMkNHZ09UQUNZNXpSYnBRa0FmVUhRVFcwK05YNUlnRVk4R2FRYlJVZkFNMkhxeWpSZ0NnRFhxMU1EYW12M2JpbFVWYVUyaHlyaU5yQXJVVk9wWnYxV2lBNDBoMnFvMHhUWExLd3d3TlZDSmFWdHNKYjhJNGw0N2pWVTZ6cGNpUnRZdGdBdENyYmtXdEZZdUFiZWRpMEdnQjZxS0xEMVBHbmJoeGE2bnFNRmV2VTV2dzhBeHpNeGcxd0R6aDUrcFFxM0EyY0g0R2RIWTk3cXZIRmVoVHM3YUw1Q2RkWWVBSnoxOWZlZVkyemFDbEFOZnI3RkphRFk5Ym15YmNBV0lDd1dLMEVqTnhrS3NnVm9hViswTFNDcE9jTUFDRk9LSU5vRXBlVWlyY0NIU0pRQUpUSEZtRzJzSzlNZWxrUlRWWnBoeFJJcE5YWXNNMnVid3d4TGRrMWh0clpzQVBOYWxRa0FCWm96cFFtOEZKcUxvcUR1V1ZxTEh4R2NFVDgwUU50NGlTb0ZuZzVUb05xOFFDMUFBb0M1MVl2M2dPU1hBVFVnMmhZbExWV3FLZE54VUFkc2hlcENxYXJCTVhLcW1LblZBdFppQXh0WWt5cHBncjgzTTlSVlpLcHdEZVVLOUlBdGhVek5kcEZySUd0RHE1b3R1Y29LVzdTcUZxZ1Z0VUJVNmpJNjhQcjhZc1V5cnlqUyt0ek1GU1BIV0M3L1dYMys1dk9lR21lVXFTbEpoNm5NUHVUbVlQVEdxampGaW9FQ2RLVzlqQk12THJJNVVzWlV0V2hLTlVBSEJOQ0thdlMxcjRGanJGMExlQ29nQVM4cUt0YXdLTExET1BLU1JHcldLMmtCWld1L0FqcFhsWkd6QkdYTkRzTldXYmF3SkNJOStUMFJMZFRsdk9nbmdQcHNZS2FrK0FETXJWa0FXQ3NFQWxwNzlucG9BamUxZVM1K053Q05lS2txQlM3blM3ZGdDaXpWYWNBVTZOVnAzRDhGcUNKQ2U5MVRGQ1VaUkh1VnFqclNxRW82ZzJvbzFkYitWVFd3ZG1yVnQ5TzRXaTFnTGZlcUpHb3FGdDdXd1ZWQlJibkN4cy9WcTZsZnBUUURMQUJnQmFpQUZmTXdHbFVLb01JV0tNQ045aGhUb0F1MDRMV1hPcVl0SE9yNkNtUnRmcmtNeFR1UEM4RFVEZEJHMElVUExxd0FOUlJoMDJMUXM4NEt2am9oNE52M05TQzB0eEx0eHZoYUFVUUFtQVBROW5UNk5oWmZzd1ZtTFZScUZLU1A3d0RwS3RKVUxXa29TYUlaSkxOQkwxTlc5bTByTnM3YTRLQTB5UG4ya1VaVlRtYnZkamJzcVlGbndKSk8zazRubmF2TEFzd2o2NEVPRll4UEFDWUF6RlhtVmo0VE1KVUpYSVltc014ckFqZTFlVzM4N2dEYXh1ZXdlSUU1VElHMVBhYUF3UlJZVjZmVzN0dTkvK0Z0YzZBQ1FBQTFpcEl1cVZUcG9GcVZxalQzcWtLMThyZUNkbWhBRzJBMTJEcEkxK0NxU3FGY2s3b2xleGF3U3NDQUpXUnRMQkNGUksyU0JaYXdOYWdDYmNFUVN2VnN3TGowMjBVM0p2YUVKalNLY1EybTNENHpzY1ZsL2d3dGxPcUxZbGxQMUFPMEZnU1ZrWFdQNXdLYXBreHpYYjFDc0IzVEFYVTVwdmE3elR1RG9sMHZsQ01DZWdzNFlrSUYzem9ncmIwcVNjOXJMaUZKcEJQNTNBYVUxdDZETVNwaUkyZloyckN0c2lRaWpkemxXWFhwUlQ4QlRBQ1lBek9scFA4SHkxMXVBUk5ZcWt5Z2gyYnMxUVJ3RnByQXphSjlTZnl1QVJweEJVaUJKeWhUWUduekFrOVFwMTZJQlBSMkwxQ0xrZXk2VjZoNFoxWndMVW95cU9LTmZWS2RnNnJxamtZUjBsMFBWVldsWVpBS1Fld1FZTlVHcEJXaTE4TlZWU21wdzlDaDJWckRVQ1VNQnEwQXA2clNBQ0JzWXB1VGlyWEtDc0pnMTAzRmExTmsxQllYOWNmM3RlQk5DRFhZYkZuWktCQ2FiV1VoTytodk9hNDJ2Y3kyM1lyVkxTeWhDbEgrVzhZVTZEWGp1blZjaVJKZ1VPMUFDTXhnQ0RnUXJhMHRMdktxM01tdDNtSVZad2VZMmF0VG1aY0w3R0NOMmxtdEFVNEEyV0dJcDBCeUJzcHF2N0lDUjVRMUp2YitCcFpIMGhQUGxPVUdMUEVKWUsrUWJZdCs4QnR3VG1FQ0J0QTVNTmNLZ0lCdGxRbGNhODgrSFpyQTd4dWNFVGVBenVKendoVFl0bnAvUmxXc2ZlNTBIYWpSdDVaREJZQldwUUwyeWRaQ1ZlK2tqQ3RRVlNuMmI4elpWS3VxaEozUGJ4VHIzQW9HSElBYnlqWDZWd0FMQUdSYmJPcTRVTEYydndYYUFhWkVIYllPMVFCdVViYTJpSUcxQVcrczNmNWR0N2xLVmFXVTVzOUNXc2xuTGtGNTFkZWFiZG04VjFUaXJuOEx5MXlWa2dKRlp4cUljcDlQWFJZUE5WVzNVODE1VmhnMlN0SEhFTFZRdFA0dE1Ob2FWVDBDUVBaaW5mSXpyQUFTQUxhVlpNQjhicjMyaWhKSDREUUg1VXhWeHA4SkgrMDdHRnBZQWtCWXNTMHNBYUJWbHdDd2xjTUVsZ296Z0FuMHVjdzQyQUM0enBvRmJ0RDhYSEVENkpsNEhreHhWUUVTOEhSMUNsd0dLZ0RFbWIzUkZpclY3cmVoT2xlcUFMQ21Wb0U5ZHFvZFdBRWdGR3RyQmRmMkNsZHJjK1dxU2hnRG9qMTRXOGltVUp0YTdkczVhQWMwRUcxaFdCUm9RZ3FBTmRDTjlRSzhjVi9nQzZBZFcrWmpzRXZNMjJ1azJScGR2TENBcU1RY3JGTTBvN0ZqbDJPcllwMzY5Z0FjNWhBRVdoQjJZd3Ywb0VBMlVMWkZSeE9xc2dPd0JrWkVPNUhidEJXTzF0ZXJTSnhpemFuTW4wTXlmc1pxdlZKdDcwQkpDaHl3cGlwajdEbGxDVlJZQXNCQ1hmb1pzd0J3TFRDQnA2bE00TW1GUU1BTm1pK0tHMEN2akpmQUZMRHZMQVY2bUFKUEJ5cHdQb2VhcDRuK0U4QTVsUW9BRmFydkxLL2FRRlZFNkEwQWtUc0Q0VXl0M2dHUUJxeUFnOHV0NEQyQVRiZ3VsR3UxaFhWUTJxR0JJSUExeUpiM1d3RnRnRzhPVzhCdDR1YnZ5Y1lPTTRnQ2MvamFsS293MDF4Rk52UFdxbXI3dHBhaXIyWGx0Z0NkYXV0YVFWRUR4emw0YzVNSERZVTZoMkM3cnNGd2F0K25BTEdRTnJrZEFBQUlmVWxFUVZRZloxQnNRYndHUmdCWWcyT3NSVVI2OUxsenU3VlhrdXVRUEFCb3JWZkFRRWNIVnVhRFBxS0NFZ2hWYWNyeVU0enRZSmtVK0szQUV2RGM1WWE2L0NlQWRFVU9FM2dlTUlGWlBoTzRRZk16eHcyZ3o0aG53M1IyK2hId2ZLRCtqTjd5QmJaVjZpV29SdHZjL28yY0tyQU8xbGF4eHBpd2duRlhJUmw5YzdqVzlvQ290WVdDQlZxWUdtUUJZSzVrN1hXb2F6cE1oNVV4c0l0dVhQUVBwVy9vb0tmYmdPekdERE9KdVFiVGMrMExoYm9WMDNyejFwYVdlZnNNZWtDYkYxMEJaYjAycFRxaDc2Y3BjcVlWaUczL05CczNCeU5RbGFPMTlYQUVERjZuVXd0bTcyL3QxUmtrU3p1ejR0SFdEZXMxMXF5S2NnT1VzNXdsVUczWTBuOEZMTStweTNPV0xIQWRNSUd6cHdKMWY4ZGJjWVBtMCtNRzBCZkdsVEFGcmxDbndMYmRDendkcU1BTXFyNTFCbGlIcXIzMlJVcUFxVlhnR3JBS0FXOHdWNjB4YmlkQ3dEMTAzeWphQnFURkdoWWg3QnZ3ZFRBZDdYbzB0ZHFDMWw2OXY0SHRydXVmd2JSdEd5clloaldBWWx5eGNSRmRWNmpQR1NNL2c0VTdaK3VtQ2oydHo3ZnhwOFhjcVIwejlRclRybnNndG1yUjdnTm9wMjRjTTl1NEFzZFR0WE1iQ09MZ1l4dXJOZnFLWWp5d0FnODR0Z0NjcVVuZ0U1ajVhbEFDMVhLZEYva0FLN0JzdHBRQUZaYkE4NEFKWExCbGdXZXJUT0FHelpmR0RhQ3ZITTlXcDhCRm9BS1hGQ3J3WktoZVVLcjJ1bFNyUUEvV3NJTGJTdURvbThNMWxHdWRPd05zbzJDQk5aQldKYnZlMzhNVU1GWGJ2bDgvemhTdVhUZjlEdFFXd01BU2luWS9ZdG0yRWh1Z2ZZMVlnSEhlMThWcDBUWlhuTWU0bnRwMjl1dGpud2YxQ1BpRVdyVCtIcG9kR0FHMHluRzF2MUdRbTRCc2xPUWNrdEZmSVZtdFYyQUZsSTJxYk51dlZaYkFlVmhHZTR4OWtzSUV0b0FKM0ZUbUY0OGJRRDlqdkVpZHJsVDJBdGNERmFncUZYOEdwb2ZuUVJVNEI5Wk13SHM4RmE1QUQ5QnJBTnZPMmNtK3FzeTdEU2cyc0FXQWZheTFuOEZ3Wlc1ckowY0VnQ1BhOSt6bmJyWHQ1dDBvdjRjWFJBWGFQSTdObUEwVjJrVEFKS0lGWUIxL1hNeWxabDZyRkErbGJSMks1VDBmNisraExkaVovMXpYQUJKb2xlUjFrQVErbExZdFVBTFBnT1g5dlJvcmUzVUpYQTlNNEd6RkxIQlRtVjg5YmdEOWd2RWFRQVd1VjZqQTA2RUtMSE9xd0hWZ3JlTmN0UUlJTzdqdDYrRUtyQUVXMklJc3NBYmFkcjIyTFdBTFZPRDI3NzBOVkdBUFZhVjk4K2NYRUY2YnU3N0dNajZyQWozWHowdllkbk1PUFVnUHBmOVF4OCtCNlZIbVBmWlFEeWkyYzl2M21JTXgrdGZnQ0N3QjJhNDNoeVJndHF1MS9iYm91d2FVd0hxUnozTmdDVnlyTUcvQS9GN2lCdEN2RkUrQUtmQUV5eGQ0TGxTQjF2NEYxaXQvZ1hXdzRrOG8rVlhnUEZ6dHVyZUYyLzcvYUs0WGtMWExoWkp0eDY3QzFqdm1jRnRUdUJGaEtaZitVSXQzNi9QbmNTMG9Md0YzSzlhQXVEcnVERmc3NWZrWTQ5dDF6VExkZXQrNWNnMGcxcjRlaXZNNWMrVUlyTU14VHVpcC9iN1d6RzZkOTY5Q2Nod1Yvd0MyUUFtc1Y4UUMyellzOERSWUFxOWp5WmFCdHcveXJ4STNnSDRqOFNwQXZWS2xBaytEYXF0V2dSNnN3UFBoQ2x3QUxJQXR5QUpWeVVaY2dtM0VGa1RmTE5aNU03dXZnODVCN3h4VXQzNkdsOFkxTUozRGJuWCtwOXBXeDMvcTd0ZEF1UFl6WElKaXhNY0dZbXR3dFBadFFBTEFTeUVKekVEWnFFcmc2YkFFbnF3dWdSc3d2N3U0QWZRYmpkY0JLbGEzemdEclVBV2VBbFpncmxoL1h2UnZ3eFhZQml5d0RkazZMNjdmMWI0enNBV1d3QVhtc0h2WHozbm5ZMWJtQVUrSDZKdTFnVmZPUHdlL2VYeGFhYnNLbnZNNUFaN2ZhbHNMd3ExMVd5RFdPYzJhSDlxK2RUQUMyM0FFdGdFSm5JZGthNzBDdmFLTS9uYjhOYUFFTnRUbDlwYVNpQnN3di9PNEFmUTdpU2NDRmJnQ3FzQmwreGRZUWhWWWdoVTRyMXAveG5tNEFsdUFCYzVCRmdEK3MyazdCMXU3ZjlmLzNPKzNBVG1mQy9UMjhscGNWcC92Vmx2UHJia1djMmpVK0cyOTJlTWNTRnViOUpyM21zUFF4djYyQ1UrZ1FoRXdNQUxuNGJpMlJndEk0QXBJWGxDVHdCS1V3R1ZWQ1RUSzhoVmhDZHlBK2IzRURhRGZjYndxVkRmczM0aHJGU3R3Q2E3QUdtQ0JwVFVNTENFTExFRUxOR29XS0M5ejRBSzlzbzJZUTdkZmN6MFdJSTU0Mzk5dXdmbExCYy9oOTJGOTNCeDhmZDg2UUljWitOYVVJdUJBQklLSFdGT053QktNd0JLT1FHKzFBa3RBQWkrREpMQUVKWEMxRFF2Y1lQbTdpUnRBZjZCNEJsQ0JzMUFGWGhPc3dEcGNnUlhBK3NzY3NqOHZ4dGE0RnJiQVROMUduQUZ2TjdjQjdoekc4OWlDODVlS09lVG04Yy9tZWcxKzNWb0xFTmFiTGNoZUMwVmdxUnlCRm83QUpVQUM2NUFFUGhzb2dTZkNFcmdCODBlS0cwQi84SGdtVklFWGdoWFloaXV3RFZqZ1dzZ0M1MEFMbklkdHhCcDAyOWdDOER5V2F2VlA2d09mT09TcStNZmxJZk5CMnhad0gyc0FiR01MaGhGclVBUzJ3Umh6MXRiYWdpT3dEVWhnSFpMQTV3Y2xjSVBsang0M2dQNU80L09CRldqaENqd1BzTUI1eUFMYm9BVzJ3UG5uN21VTnVoRS9uMTNuZkZ5Qzh0ZUtTN0JiaTREWi81d1pNOXpmMjdvYlFHelhXWXR6WUFUT3d4RzRBcERBdFpBRWJxQzh4UlBpQnRCYmxIZ0JWTXNTbDRmOFlwOWpHMFZNODdnRVdlQXlhQ1BPQWJlTjg5RDg4K2J0T1NCL1MxR0FCNnl3YmdtL2lITVFiT01TRUNNdWdSSFlobU5FWDhRRGZFNUlsc20zRDgxYmVOd0Flb3VMOFFwZ0JhNkNhOFF2SFdTQjF3RnRHOWRDdDQxckFmeTl4N1VBYk9NYUdMWnhOUmlCcDhJeDRzVWZiRGRRM3VKUzNBQjZpeGZGSzhFVmVCSmdJMzVaZ0JhNEROdUlwMEozSzU0RDQyOGhuZ3E5cmJnRXc0aS96UnVlQjhhSVYvblpiNUM4eFV2aUJ0QmJmTFo0UmJoMnl6NS82aS8yOHRlL3I2NXhMWGpQeFd0QitYUEZ0YkE3RndzUWxvNi8rTnEvdkdUNVYvOUF1a0h5RnA4cmJnQzl4VmVMendUWTdpMWVmOGxmbHBkL1h3ZnlXcndHcE0vRkp0elc0aThPdkYvYXhsOVdCcjQ0UHV1SHpBMlF0L2hhY1FQb0xiN3ArQUtRM1h6cnIvUyszMnA4bFErS0d4eHY4UzNIRGFDMytDSGlLNEwyRnMrSUd4aHY4U1BFL3dmRHNZWTcwdUE2SXdBQUFBQkpSVTVFcmtKZ2dsQkxBUUlVQUFvQUFBQUlBRUZlYkViNUFrem80Z0VBQUhZRUFBQVlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQnViM0p0WVhScGRtVXRkSGx3WlhNdFJFSk5VeTU1Yld4UVN3RUNGQUFLQUFBQUFBQkJYbXhHQUFBQUFBQUFBQUFBQUFBQUJ3QUFBQUFBQUFBQUFCQUFBQUFZQWdBQWFXMWhaMlZ6TDFCTEFRSVVBQW9BQUFBQUFFRmViRWFJUVF3cWpjb0FBSTNLQUFBWUFBQUFBQUFBQUFBQUFBQUFBRDBDQUFCcGJXRm5aWE12Y21Wc1lYUnBiMjVoYkY5a1lpNXdibWRRU3dVR0FBQUFBQU1BQXdEQkFBQUFBTTBBQUFBQSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDhfTm9ybWF0aXZlVHlwZUNJLURCTVMvY29tbWFuZCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhNWIzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2NvbW1hbmQKQEAgLTAsMCArMSwxNSBAQAoraGVhZGVycz1gcGFzdGUgLXMgLWQiICIgaGVhZGVyc2AKKworY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMS9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiAke2hlYWRlcnN9IC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgICIKKworZWNobyAkY29tbWFuZCA+IHRvRXhlYworY2htb2QgK3ggdG9FeGVjCisuL3RvRXhlYworCisKKyMkY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOF9Ob3JtYXRpdmVUeXBlQ0ktREJNUy9jb21tYW5kVHJpYWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOF9Ob3JtYXRpdmVUeXBlQ0ktREJNUy9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2NvbW1hbmRUcmlhbApAQCAtMCwwICsxLDEyIEBACitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiIgorY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCitjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2NvbnRlbnRNRDUudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDhfTm9ybWF0aXZlVHlwZUNJLURCTVMvY29udGVudE1ENS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNTk5OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK1ltTTFZbVl6WkRVeFltWTRPVGcxWkdVd09XUTJZMlk0WVRjM05XVXpPRGc9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDhfTm9ybWF0aXZlVHlwZUNJLURCTVMvaGVhZGVycyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2hlYWRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZGIwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOF9Ob3JtYXRpdmVUeXBlQ0ktREJNUy9yZXN1bHRzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDhfTm9ybWF0aXZlVHlwZUNJLURCTVMvcmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNlNWZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDhfTm9ybWF0aXZlVHlwZUNJLURCTVMvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDQ6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL3RvRXhlYyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA4X05vcm1hdGl2ZVR5cGVDSS1EQk1TL3RvRXhlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUyNmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDhfTm9ybWF0aXZlVHlwZUNJLURCTVMvdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLVhQT1NUICJodHRwOi8vMTcyLjIwLjQzLjEyMTo4MDgwL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcbiIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA5X05vcm1hdGl2ZVR5cGVDSS1kYXRhYmFzZS9ib2R5LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA5X05vcm1hdGl2ZVR5cGVDSS1kYXRhYmFzZS9ib2R5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWRiYjUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2JvZHkudHh0CkBAIC0wLDAgKzEgQEAKK3sicGF5bG9hZE5hbWUiOiJub3JtYXRpdmUtdHlwZXMtZGF0YWJhc2UuemlwIiwiaXNFbmNvZGVkIjp0cnVlLCJpc0NvbXByZXNzZWQiOnRydWUsImFydGlmYWN0TGlzdCI6W3siYXJ0aWZhY3ROYW1lIjoicmVsYXRpb25hbF9kYi5wbmciLCJhcnRpZmFjdFR5cGUiOiJJQ09OIiwiYXJ0aWZhY3REZXNjcmlwdGlvbiI6IiIsImFydGlmYWN0UGF0aCI6ImltYWdlcy9yZWxhdGlvbmFsX2RiLnBuZyJ9XSwicGF5bG9hZERhdGEiOiJVRXNEQkFvQUFBQUlBRmRlYkVhS1hwQTZRd0lBQUpzRkFBQWNBQUFBYm05eWJXRjBhWFpsTFhSNWNHVnpMV1JoZEdGaVlYTmxMbmx0YksxVXkyN2JNQkM4NnlzV3VVdHgwSnNPQlJLblFDNnRpOXAzWWtXdUxRSVN5WkswRGQveUdlM3Y1VXU2cEI2Mkc2T0hJdGJGNHU3T3pBN0hqalpJRklxMjJ1aW9yUW5pUUQ3d2x4cGlMZ1hkdTQ3RUNmdE9QSWdGUDBlMStGUVVrZmdjSXdtRFBZM05wYkcreDZnUFZNYVRvMUFxak5oZ29ITTM3bU5yZlEyYjFYcjVDSnZsdVRMelBsUUxmaEpMdWY3MitIMzlzdG9VaGFJZ3ZYWXhkeXl0aWFoTmdOZ1N6SnlRT2VHOFMxV3dkdXRqcUF1QUV1NXVhL1RXeHZvRzU5Mi9ocDZmdnE1dkR4WEdLaEs1SzlIbThTcWRoZXA1ZENPZEErdjBqS2ZFMXR1K3Z1cjd3WXJHbG91bFArY2pnQ2RHeUt2QzF2cnNRSkF0OVFob0ZFaDJoa3dFRE1GS3piWXFPT3JZQWtKU1hJMFFHeDRhTG1DU0JJa1pQRGxQZ2VjREQzUjJweVYyTU4waFUyRUVpUVlhZ2g0TjdoZzhjYlkySko3bXhFTWpLbk5seElFdzRpN1VJN1dXYVpkNzNmTjR1UGZFVjgvYllTZFVVem16eTEzT1cwYythcHFuVkNQMmdmejBDbm4vR2tMMGVweEpIMDgvOTlxVHFtR0xIWWR1T3IreU1lMGVITEU1SFNSTVFDbnRuaTNqRjVVdG5SZEcxWE9TbUFTSE5NMWFITnQ3dEY1OWxKNEo3OTIxcGR1OUVzbldITFRpc2phNStQYjZhL1RtN2ZYM1pOenBVaXJuLzIrWm1qT3lJLzhmT2hrTXJJRmpxK1Vvem5DTXV4TnZmYmFOeFJ5MEpONmc2NkJqLzRpMTJseS9FSmIvTmo3SXZ5bXFDUlBzTml1YjVBeVVJMVNmc2oyeGxqbTUxeis5bE53TC9pR2RvZFZPREFxSDNzdENxRjV5L2xjbXowbDAyT2hPWDZWM2xDTElLR2ZaL1FubnNubitkL2d5TmhWL0FGQkxBd1FLQUFBQUFBQlhYbXhHQUFBQUFBQUFBQUFBQUFBQUJ3QUFBR2x0WVdkbGN5OVFTd01FQ2dBQUFBQUFWMTVzUm9oQkRDcU55Z0FBamNvQUFCZ0FBQUJwYldGblpYTXZjbVZzWVhScGIyNWhiRjlrWWk1d2JtZUpVRTVIRFFvYUNnQUFBQTFKU0VSU0FBQUIwQUFBQWdBSUJnQUFBREtMUGJJQUFBQUVjMEpKVkFnSUNBaDhDR1NJQUFBQUNYQklXWE1BQUNKa0FBQWlaQUViZWs5d0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCM2QzY3VhVzVyYzJOaGNHVXViM0pubSs0OEdnQUFBQlYwUlZoMFZHbDBiR1VBWkdGMFlXSmhjMlVnYzNsdFltOXNUcUVrdWdBQUFBMTBSVmgwUVhWMGFHOXlBSEpuTVRBeU5NangrYVlBQUFBdGRFVllkRVJsYzJOeWFYQjBhVzl1QUdSaGRHRmlZWE5sSUhONWJXSnZiQ0JwYmlCdFpYUmhiR3hwWXlCemRIbHNaY25CYTQwQUFBQWhkRVZZZEVOeVpXRjBhVzl1SUZScGJXVUFNakF4TUMweE1TMHdPRlF5TWpvd09EbzBNNElNcGZ3QUFBQkVkRVZZZEZOdmRYSmpaUUJvZEhSd09pOHZiM0JsYm1Oc2FYQmhjblF1YjNKbkwyUmxkR0ZwYkM4NU5EY3lNeTlrWVhSaFltRnpaUzF6ZVcxaWIyd3RZbmt0Y21jeE1ESTB4SFlyWlFBQUFFbDBSVmgwUTI5d2VYSnBaMmgwQUZCMVlteHBZeUJFYjIxaGFXNGdhSFIwY0RvdkwyTnlaV0YwYVhabFkyOXRiVzl1Y3k1dmNtY3ZiR2xqWlc1elpYTXZjSFZpYkdsalpHOXRZV2x1TDFuRC9zb0FBQ0FBU1VSQlZIaWM3TDE1a0J0WGZ1ZjV6VXpjUUJWUUo0dGs4VktSbENpU0VxVVNUMGt0cVVXNUpWbFUyOTIyMUVQYjYzRE1iTXp1Um14czdPNk0vY2RPeE03R0hoRzdzenNURzJ2dllidERQYmJWVGJrN3V0dHFxVnRTVXhjbFVpUWxudUlwSHFKSVZCV0xWOTFWS0Z5NWZ5UXlrUWtrVUVBV2tKa0F2cDhJUkJVZVhtYSt5a1M5VC83ZWxZSXN5eUNFR0luSDR5S0FOdDJydllMZmd3QThCUzl2aFdtbDBnRWdYZkJLcWIvTHNteElsMldrZ2NJMHcvdTBMR01Pa0tjQVRBR1lCREFseTVnQzVNbGMycFFzWTFLWForcSsrKzdMMXViTUV0SThDQlFvYVZiaThiZ0FvQU5BcjhtckIwQVVwWVVZZHFESUZWUDRmNnU4TFV5ckpJOHh6Znc5QU1nenlBbFhrVzFldUxLTUNRQzNBZmtXZ0ZzQWJza3ljci9MWSt2WHIyY2xRNW9TQ3BRMEZQRjRQQXh6SVpxOXVwR1A0cHFDV29oVEowVUxlZkpwRmVaSkE3Z0RSYVk2c1NydllaQXRibTNZOE1BTUNHa1FLRkRpR3VMeHVBL0FDZ0FyQWF3eWVTMEZFSEtzZ0E1U0xNWGkvOXZLeEZsN3VSb1BheTdYOG5tVXROejdXUUFqZ1B3TmdHOWtHZDhBNmt1K0xzdTRzV25UeGlRSWNRRVVLTEdOZUR6ZWh0SnlYQVdnRDREb1dBRmR5RUxpdE5Jc1d6cFArZTNxTE01SzgyUUIzQVRrUXJtcTc2OC85TkRtS1JCaUF4UW9xU254ZUR3R1lBT0FCM00vMXlJdnlBNEhpOVpRT0NYTzZwcHVTMjlYQjNHVzNLNHdqeXpMWTlERWlzdUFmRjZXY1E3QStTMWJIaDR2M0NNaFZxRkFpU1hpOGZnUzVDV3AvdHdBcFptVldNQktzMnpsZVl4cGRlenoxQi9WUWg0bHpZcGNpOCtmYVo0UkFPZHpyM01BenN1eWZPN1JSeDhaQlNGVlFvR1NrdVJHc2E2RVVaTHFUMGFUTmFKZTRyUjVzSkMrSkJieUtHblZSNkFWaTdOd1I0VnBZN0lzYTFJRmNFNldjUjZRcnovMjJDQXJTV0lLQlVvQUFQRjRQQURnWVFDREFCNEQ4QkNBQitEeTZSeU5ETVdaVDdOTG5CYk81d3lBQzdLTTA0RDhCWUJqQUU1dDNmcFlvckNFcFBXZ1FGdVFlRHp1aHlMSXg1QVg1a1kwMlpRUHQrS21FYlJtYWZVU3A1WCtUQWZGYVpxV2U1OEdjQmJBRndDT3lUSytBT1RUMjdkdm15OHNQV2x1S05BbUp6YzE1Q0hrUlRrSVlCT1VWVytJalZDY3BkS3NpZFBKUG1PVHRKUXM0d3lBWTdwSTlmU09IZHM1NWFhSm9VQ2JpRnlmNVlNQUhrZGVscHRCV1RxS202YWVtS1ZaRWFlVlFUNU5LczV5MXlFRjRFdG9VU29PQXZLNVhidDJzdEp0RWlqUUJrWW56S2R6cjZlZ0xGRkhYQURGV1hxN2hadGxHMCtjRlo3UDJ3QStCdkFSSUg4RTROempqKzlpSmR5Z1VLQU5SandlZnhEQU02QXdYWXViS3ZWSzhsaHBsalZMc3lMWEdvMmdkVlN1aTd4WnVRM0lId1A0U0pieDRaTlBQbjZ1NkE4aHJvVUNkVGs1WVQ2TnZEQjduU3dQS1EzRmFmYmVQTTN0NG5Rd3lyOGx5MnFFaW8rKzlhMG5LRlFYUTRHNmpIZzh2aHJBQzFDaVRBcXpBWENUT0swMHkxYWZSMG1qT0N1L0RvdUk0RzlCYWZMOUVKQi84OVJUMzdvRzRob29VSWZKUFhkeUc0QTlBRjZHTWtLV05BQ3RJTTZGcGVoK2NkWXJnamRMczZIcCt3eUFOd0g1VjdLTW84ODg4eFNmMCtvZ0ZLZ0Q1QjdKOVJ3VWFiNEVScGtOUllQMHJabmtLYjBkeFZuNWRhaFhCTDl3bnFLMFc0RDhsaXpqVndCKysrMXZQODFId2RrTUJXb1Q4WGk4SDRvc1g0YlNQQnR3dGtTa1docGRuRFdvc0N2TVV6OXgxaXVDcnlTUGk4UnBsaWNCeUIvS010NEU4TmF6eno0VEw5d0RxVDBVYUozSVRURjVGUG1tMlVlY0xSR3hpcHY3MXNyblVkSW96dHFleityektHbjF1ZzRsenVjSkFHOEMrQldBNDd0M2Y1c1ZmUjJnUUd0TVBCNS9BTUIvQXVDUG9DekVUaHFVMWhPbnZYSnQ0S2tuSm5sS2IxZXY2MURGemNwMUFLOEQrTHZubm52MkFrak5vRUJyUUR3ZTd3THdBeWppM09ad2NjZ2lZVE9pV1I3ejdTak8wdHRadVE0MlJQbEhBZndkZ0gyLzh6dTc3eFpsSWxWQmdWb2t0OGJzaXdEK05QZlQ1MnlKeUdLaE9NM3ltRzlYaTJaWjh6ejVjbFdheDhrb3YvbzhTcHBkNGl4enpwTUFmZzNnUDhveWZ2Mzg4ODl4elY0TFVLQlZFby9IdDBHSk5IOEFvTXZoNHBBYVlFMmN6UjhOTFp4bjBkRlFsWG55NVRKN1h6cFArZTNxZFIwYUtNcS9DMkFmZ0w5Ny92bmZPVnEwSVNrSkJWb0I4WGg4QllBL2hpTE9CeHd1RHFrQmJFYk1wem5RakZqbWZiNmNwZElvVGwxSzdhUDhDd0QrVHBieER5KysrSjBiUlRzakJpalFNc1RqOGNjQi9OY0FmZytBNUhCeFNBMWdNMkkramVLcy9EclVLNEt2NURvNDFEeWVBZkJMQVAvaHhSZWZQMWkwY3dLQUFpMGlIbzk3QVB3QkZIRnlRRkNUUUhIbTArd1NaNzBpK05KNXltOUhjVmFiUjBzN0N1QS95REorOXRKTEw2U0xEdGpDVUtBNTR2RjRETUIvQ3VDL0JMREM0ZUtRR3RHTWZXdVY1S2xYRTJFemlMTmVOeUlMNTdGMlBzM1NIT3FDdUFIZy81SmwvTTJlUFMrT0Z4V2dCV2w1Z2NiajhRRUEveFdBUHdNUWNiZzRwRVpRbktYU0dtL3FTZWs4NWJlak9DdlBVK1g1bkFid0dvRC9jOCtlMzcxU1ZLQVdvbVVGR28vSG53VHczMEJaSlVoMHVEaWtScmlwd2paTHN5TE9lalVSVXB5VjVsSFM3SXJnemRKY0lzN0N0Q3dndnduZzM3Lzg4a3VmRkJXd0JXZzVnY2JqOGFjQS9LOEF0anRkRmxJNzNGUmhtNlc1U1p5MXE3Q2RrMnN6UnZsMnlyVU8zLzBqQVA3aXU5L2Q4M0ZSWVpxWWxoRm9QQjdmQUVXY2U1d3VDNmtkaklZcXplUCthTWdzcmRGdlZ1eThEaTc1WHY4S2tQL2k5Mzd2NWZORmYwQVQwdlFDamNmamZRRCtCd0QvSEp5SzBqUlFuR2J2emRQY0xzNW1qUEtiUVp5TGlPQXpBSDRJeVAvOTcvLytkMjhXL1VGTlJOTUtOQjZQUndEOGF3RC9MWUN3dzhVaE5jSk40bHhFQlZORkhpWE5UUlcyZVo1ODJTdk5VeTl4MWl1Q3QvTTZOTW4zZWdiQS93SGczMzN2ZTkrZFJoUFNkQUxOemVQOEZ3RCtMWUFsenBhRzFJb21yV0FNZWR3ZTZaam5VZlpmNm4zcFBPVzNvemlyeldOTXN5dUNyekRQcUN6ajN3TDQyKzkvLy9lYWFoNXBVd2swSG8rL0RLV2ZrOHZ0TlFtdFVNRlFuRFd2c0YwbHptYnNNNjQrRHdESUYyUVpmL0VIZi9EN2I2SkphQXFCeHVQeERnRC9ENEJYblM0THFRMk5Yc0c0UGRJeFMydUZQdU9GODVodjV5WnhXam1mWm1rMmlyUHcvUnV5alAvOEQvL3dlMk5vY0JwZW9QRjQvSGVnVE9wZDVuUlp5T0pwOUFxRzRuUmxoVjFCSHZQdDdEcm41bm55WlRkN1h6cFArZTJjbEt2dS9UQ0FQL3ZEUC96ZWUyaGdHbGFnOFhnOENPRGZBZmd2QUFnT0Y0Y3NFamRYTUc2djFDdXB4Tm1NbUUremNoMGE3V2FsdWp6NU5KdHZHbVVBL3plQWYvM0tLOStmSzh6UkNEU2tRT1B4K0ZZQWZ3L2dmcWZMUWhhSG15c1lpck4wSHJkSE9tWnB0VGlmRkdjK3JZYmY2NHNBL3VUVlYvL2c4OExjYnFlaEJKb2JZZnZmQWZnM0FEd09GNGNzQWpZam11VXgzNjRXRmJaNW5ueTVLczNqOWtxOWtqeU5kck5pbHRhRU40MXBXWmIvSndELzh3OSs4SWNOTTFLM1lRUWFqOGZYQVhnZHdGYW55MEtzd1diRWZKb1Z1VElhTXN1anBOWHJab1hpckRTUGtsYUQ4L2s1SVAvUkQzN3d5cVhDTGQxSVF3ZzBIby92QXZBV2dBNm55MEtxaDgySStiUmFWTmdVWno2dFh1SjBNc28zUzdOeUhScjRlejBHNEtWLzlzOWVPVlM0RjdmaGVvSEc0L0dYQVB3amdLRFRaU0hWUVhIbTArd1NwOXNqSGJPMFdwelBoZk9ZYjBkeGx0NnVGdWR6RWQvck9RQ3Y3TjM3Nmx1RmUzUVRyaFpvUEI3L1V3Qi9DL1ozTmhSdUdrRnJsdFlrRlV6QiszeTVxc3RqVEd0R2NUbzU5YVR5UE1ZMGZxOEJBR2tBLzJMdjNsZi9ZK0hlM1lKckJScVB4LzhjeXFwQ3BFR2dPRXVsc1cvTlBJM2lkRXFjVnM2bmplSXM1Qy8yN24zMWZ5dVh3U2xjSjlCNFBDNEErTitoUE95YU5BQnVxckROMGhxdGdxRTQ4MmwyVnRpdE1BV293Y1NwNTk4RCtGZDc5NzdxS21HNVNxQzVhU3F2QWZoanA4dENGc1pORmJaWm1wc3FHTGRIT3FYejVOT3NuTS9xOHlocDdoZG45ZGVxMFc1V0ZzNWp2cDIxYTFVUi93RGd6L2J1ZmRVMTAxemMxcmY0UTFDZXJzZE5sWG9sZVp5c1lOd2VEWm1sTmZyTmlwM1hvVlcvMXphTFUrV1BBV1FCL09saWRsSkxYQk9CeHVQeGZ3bmcvM1c2SEtRMEZHZWxlZHd2VGl2bjB5eU40aXlkWnVWN2JlVjhWcDlIU2F2WGRhamtmQzZTLzJ6djNsZi92MXJ1MENxdUVHZzhIbjhNd0tjQS9FNlhoUlRqSm5FNldjRTRXV0diNThtWHZkSTg5UktuK3lNZGQ0OWtwamlyWWg3QUUzdjN2dnBGUFhaZURZNExOQjZQZHdJNERtQ1Zvd1VoUmJDQ01YdHZudWFrT0syY3orcnk1TlBjVkdHN1haeFd6bWY1UEtXM3E5ZDFxTlgzdWc1OEErRFJ2WHRmdlZmdkE1WERVWUhtUnR5K0RlQUZ4d3BCaW1pRkNzYkpDdHNzamVJc3ZaMlY2OUNNZmNiVjUxSFNta3ljZW40RDRIZWRISm5yOUNDaWZ3UEswelcwUWdYamRuRmFPWitsODVUZnprMFZOc1ZwbHFmMGRsYXVnNTNmYTV0NEFZcEQva2NuRGc0NEdJSEc0L0ZuQU93SElEcFNBS0xSNkJXTWt4VTJ4WmxQcTlkMWFNWSs0L0o1U20vbkpuRTYzZjJYSXd0Zzk5NjlyMzdveE1HZGpFRC9GMUNlanRMb0ZVenppdE85Tnl2VjUxSFNyRnlyVm0wZUw1OUhTWFB5dSs4U2NhcUlVRnl5MDRtRE94S0J4dVB4SndCOFl2dUJDUUIzVnpCdWo0YXNWakFVcDlsNzg3Um1qUExOMGlqT212TGszcjJ2Zm1yM1FaMktRUC9jb2VPMk5HNnVZQ2pPMG5tY3JMQ3J6Nk9rVVp5TjhkMjNlczVkeUo5RG1RcHBLN1pIb1BGNGZBT0Fzd0FFV3cvY3dqVEdwUERtcW1EY0hPV2JwZFhyT2pUYXpZcFpXalBlTkRhUk9GVmtBQnYzN24zMXZKMEhkU0lDL1ZlZ1BPc09teEh6YVc0U3B6dWlvWHlhbGV0ZzVYeTJpamlkL0Y1Yk9aOU5JRTRWQVlwYi9ybXRCN1h6Wk1YajhhVUFyZ0h3MlhiUUZvUE5pUGswT3lzWWl0TXNqL2wydFRpZjVubnk1YW91anpHTjRteFlrZ0JXNzkzNzZvaGRCN1E3QXYyWG9EenJBc1daVDdPcmduR3l3cTR1VHo2dEZ1ZHo0VHptMjFHY3BiZXJ4ZmxzWVhHcStLQTQ1dC9hZFVDN0JmcU16Y2RyZXRpM1ZpcU40dFNuMlNWT0ovdU1LODlqVE9QM3VxbDRCallLMUxZbTNIZzg3Z1V3QVNCb3l3R2JISXF6VkZwejlxMVZrc2ZLK1RSTG96aHIrNzIyY2o0cFRzdk1BWWp1M2Z0cXlvNkQyUm1CUGd6S2M5RzRxY0kyUzJ1MENvYml6S2ZaV1dHM3doUWdpdE1SZ2xCY1k4dVRXdXdVNkhvYmo5VjB1S25DTmt0elV3WGo5a2lua2p6MU91ZVY1SEc2VW5mekZLQjYzYXdzbk1kOE8ydlhvZWxaanlZVWFJK054Mm9hbksvVXkyL25wZ3JHN2RHUVdWcWozNnpZZVIxYTlYdE5jVmFOYmE2eFU2RGROaDZyNGFFNHpkNmJwN2xkbkZiT3Axa2F4Vms2emNyMzJzcjVyRDZQa2xhdjYxREorV3hCYkhPTm5RS04ybmlzaHNWTjRuU3lncUU0ODJsdXFyQnJkUjFhOVh1OWNCN3o3U2pPcXJETk5YWUtkTUxHWXpVY3JWREJ1RDNTTWMrajdML1UrOUo1eW05SGNWYWJ4NWhXaS9OWlBrL3A3ZXAxSFdyMXZTYjJ1Y1pPZ2Q2eDhWZ05ReXRVTUJTbk95dnNXbDJIWnV3enJqNlBra1p4T29zZ0NCQUU0YTVkeDdOTm9ETXpNd1BoY05pdXc3bWVScTlnM0I3cG1LVzFRcC94d25uTXQzT1RPSzJjVDdNMEo4VnA1L2VhR0dsdmI5dHExN0ZzRStqOC9QeU1LbEJCRUZyMlM5RG9GUXpGNmM0S2UrRTg1dHZWNG55YTU4bVhxOUk4OWJwWk1VdXIxN1d5ODJhRkdCRUU1UmtsUHAvWGxrVVVBQnNGT2pzN0crL282TkRrMldvU2RYTUY0L1pLM1dvRjAraFJmdlY1bERRcjE2SFJibGFxeTVOUGE3U2J4bGFxSTJ1QklBZ0loWUszN0RxZWJRS1ZaVG1UVENiaDkvdTFOUFdPb1ptL0pHNnVZQ2pPMG5uY0h1bVlwZFhpZkZLYytiUjZmYSt0UnZuRWlKay8vSDQvQkVISTJsVUdXeGVUbjUrZk53aFVwUm1qVVRZam11VXgzNjVXRlV6cmliTjI1N3lTNitCa2xGODZUL250M1BUZHQzcXpRb3BSNVZsSUlHRHZ3NzVzRmVqTXpBemEydHBNLy9obWtDaWJFZk5wZGxZd2pJYk04cGh2UjNHYXBWbi9YbHM1bnhUbjRoQkZBWUM1TDlyYjIyd3RpNjBDeldReW1KMmRSYW5SdUkwcVVZb3puMlpuQlVOeG11VXgzNjRXNTlNOFQ3NWMxZVV4cGxtNURzMzZ2U2FsRVVXeDVHZVJTQmlTSk5sNlR1MStIaWltcDZkTENoUm9MSW15R1RHZlpsY0Y0L1pJeHl5dEZ1ZHo0VHptMjFHY3BiZXJ4Zm1rT08yam5Ed0JJQlpydDZra2VXd1hhQ3FWUWlLUlFEQlkrc2xtYnBkb3E0clR5UXFHNGl5VngzcUY3U1p4dHVyM21sU0dLSXBsQjUyR3d5RjR2VjY3aTJXL1FBRmdhbXFxckVBQmQwclVTZ1hqWklWZFBrL3A3ZHhVd2JoZG5GYk9wMWtheFZuYjc3V1Y4MGx4dWhOUkZDR0tnc20xeU9ORTlBazRKTkJrTWxseVJLNkttNmE0TktNNG5heGczTjVFV0VrZWlyTjBubGI5WGxPY3RVZVNwSndMU3AvSFFNQ1BRQ0RneUxsMlJLQ0FFb1dXRXlpZ3JXdUliTmEyYVQwRzNGUmhtNlUxV2dYamRuRmFPWi9WNTFIUzdLeXdHMTJjVHQ2czFPNWFrV29RQkNFblQvVWFsWlpvVjFlbm5VVXo0SmhBNStmbk1UVTFoYmEyaFljZGk2SUlXWlp0KzFJMmx6anJXOEc0dlZJM1M3UHJacVdTUEU1SFEyNGV5VXh4dGlhQ0lNRGpVZFZVL254MmRuWWdHSFFtK2dRY0ZDZ0FURTVPd3VmekxSaUpBdlkwNmJvcEdxb2tqNU1Wak52RjZjek5pcExtYklWTmNhcHA5Ym9PbFp4UFlnMUpraUJKRXN6T2V6NGFWUWlIUStqb2NQWXgwNDRLRkFER3hzYlEwOU9UTzJubHFaZEVLVTZ6OStacEZLZFpIaVhON2VKMDhudHQ1WHhXbjBkSm96Z2JFNC9IQTBrU1RhNU5NVjZ2QjcyOVBmVXYxQUk0THRCc05vdXhzVEYwZFhXVlhKNUpqOW92V29zbVhWWXdadS9OMDFwVm5FNVcyQlJucFhtVU5DdlhvVmJmYTJJZFFSRGc5WHBMREJZcVRoTUVBVXVXOU9aazYreDFjRnlnZ0RJM2RHcHFDdTN0bFE5RlZ2dEZyUXd3YW9VS3hza0syeXl0MFVZeXUxMmNyZHBuYkpaR2NUWXVIbzhISG8rbjdIa3RiTHJ0NmVsQ0lPQjN4YlZ3aFVBQllIWjJGajZmRDRGQUFJRHlSVjBvSWxWSGFtV3oyWXBPWml0VU1CU25PeXRzaXRNc1QrbnRyRndITzcvWFpIR0lvcWlMT2lzbkVna2pHbTEzemZWd2pVQUJZSHg4SExGWVRKTm9wU3dValRaNkJlTmtoVjByY1ZvNW42WHpsTitPNHF3OGo1WHphWlpHY1pKSzhmbThrQ1JGUGVyNUxWNDRwN2pwTmhLSm9MZTMyNlpTVm9hckJBb0FFeE1Ua0dWNXdaV0tDakdMUmh1OWdxRTRhM1UrM1NuWFpvenl6ZExxZFIzc3ZGa2hpMGVTSlBoOFBxMnZzNXJUSEl0RjBkM2Q2YnByNHpxQkFzb2lDOWxzRnBGSXBPcHR6YUpSTjFVd2pJWVd5bU5NYzFPRmJaYm1KbkhXNjJhbHVqejV0RWE3YVhSYjVkd3NpS0tvUlozVm5HTzE3N09ycXhNZEhURlhYaDlYQ2hSUW5oMmF6V2FyR2xpa2J3NVFvMUdqU0FHbktoaUtzM1FldDBjNlptbTFPSjhVWno3TmJUY3JaUEVJZ2dDZno2ZGJGS0Y0UUZDNXBsdEJFTkRiMjQyMnR1b0RLYnR3clVBQklKRklBRURKaDNDcmxLcGc4aUtWa2Nta0MvSUFpNjFnM0I3cFZGTFJzeG5STEUvcDdScjlac1VzclJsdkdpbE81MURFNllYWDY4dWxWTmRjQ3dDaUNDeFpzZ1RoY01qVjE4blZBZ1dVSmYreTJTeWkwYWhCb3FVcUdHTWVBSkFoQ01wdzZXdzJpMHdtVTdDTmtxZGNtcHNxYkxNME95c1lSa05tZWN5M296ak4wcXgvcjYyY1Q0clRYcFNWNVh4UUkwbmxWSmRmREw0UVNaS3dkT2tTUjVmb3F4VFhDeFJRNW9sT1RFd2dFb2xvS3hhVms2bFp4UUNvajhVUmtjbGtrTWxrc2RpS3dpek5TWEhXczRLaE9NM3ltRzlYaS9OcG5pZGZydXJ5R05Pc1hJZG0vVjZUMnVEMWVoRUkrQ0VJSXN6T2ZXSFRiU21wK3YxKzlQWDFPUEpzVHlzMGhFQUJJSjFPWTJKaUFxRlF5REJYdEJDemlxa3dLbFZGcWtTazZxaGRpdE5ORlhaMWVmSnB0VGlmQytjeDM0N2lMTDFkTGM0bnhla3UxRDVPdjk4SFFWamNxa0NDSUtDek00Yk96ZzRBalhQTkdrYWdLck96czBpbFVnaUh3eEJGRVlDeEVsQTZwZlB2VmN6U1JGSFNpVFNEYk5aTXBDaWIxb3dWRE1WWktvLzFDdHRONG16Vjd6V3BEYUlvd3UvMzU2YWtLR215WEhtVXFYMmF5Ky96K2JCa1NROENBWDl1WDQxejNScE9vSUFTalU1T1RpSVlETUhuTTRiNkMxVk02cS9LaFZlbEs4TGpVVWFENVp0Mzg1L3J0MnZVQ3NidGtVNGxlYXljVDdNMGlyTzIzMnNyNTVQaWJEd2tTVUlnRUREVXVXYmZ3MnFJUnR2UTA5TnRNaHEzTVdoSWdhb2tFbk5JcDFNSUJJSVFoTUorVVNBdlNNR2tZaWlPVkJXUmlwQ2tMTkxwTkxKWnVlRXJHSW96bjJabmhkMEtVNEFvenRaQTZkOE01UG9sWmRQdmFTbEtSYVdTSktHdnJ4ZWhrTEpnVHFOZXU0WVdLS0JFbzdPek13Z0VBcmxGaVlHRktuRWx6VmhSR0NOUzVla0FzZ3hrTXVsYzg2Nld1MkMvK1RTN0toaTNSenFsOCtUVHJGVFkxZWRSMHR4V3FidDVDbEM5enZuQ2VjeTNzM1lkeUdJUkJBRit2eCtCUUtEbytaekZVaXphR3VVRUc0bUUwZGZYcXkxNjA4ZzB2RUFCNVI4b2tVakE0L0ZvUzBXcEZZWCtFVG5sbzFMQmtFZDViQm9nU1I1SWtnZlpiQWFaVEFicHRINGFqTDBWak51akliTTBSa09sMDFvaHlsODRqL2wyRktjeitIemVYRE90VDB1cjFXbjIrWHpvN3U1RUpCTE83YmZ4cjE5VENGUWxuVmFpUmEvWGExajlvckpLeCt6emZCNWw1SzRFajBmV290Sk1SamJrcVU4MDVINXhXcW13emRJb3p0SnBWc1JwNVh4V24wZEpxOWQxcU9SOGtzVWhTU0lDZ1NBQ0FUOGtTZExPYi9uemJJd3lpMWNZeXIvM2VDUjBkWFVpR20ydllMK05SVk1KVkNXZFRpT2RUc1ByOVVHU1JDMWRsb0Y4TjZteFNVS2ZSMG1UQzk0cjI2aFJxYm93ZzNLc2pPNUxRWEV1VnB6dWozVGNQWktaNGlTVkVBZ0VFQXptbzgzaTgxdGVrZ3NoQ0FJNk9qclExZFdoTmRjMjJ6VnNTb0dxcE5NcFpMT2lObDBGdWFiYTRncW1PRTJXOVVzSG1tMG5RQkJFZUwwK2VMMUtYMms2clRUejZtWGFhT0swVW1GWGx5ZWY1cVlLMiszaXRISSt5K2NwdlYyOXJrT3R2dGZFT3Vvemx3T0JBRVRSZk1xZmRSVGhDb0t5L0dwdmI0OGhvbTFHbWxxZ2dQTFBsOG1rSWN1S1NIT3BCWG55YVlWUnFsbWUvUHQ4bXRwWENpZ3lUYVhTdVdVRFpiU3lPTjBlNlZRbXhlclBaK1Y1akdrVVovazBVajErdngvQm9DSk40MHBCY3RWUjVVSlJhVGdjUW05dlQyNDV2K2EvaGswdlVCVlpscEhOS2dPQWxMc2k3Wk1TWDZMQ0p0NkYzdWZUOGpLVmtVNW50Q1psNWN2VStIMXJsZVNoT0V2bnNYSSt6ZEtjRktlZE40U2tPdFFSdEtvMDlhTmQ2M1ZxZlQ0L2VudTdFWW1FMFl4TnRhVm9HWUhxeVdhemhsV01paXNVb2NSN0pjMzRQcGRxK01Ma0t3cVBSOG9OYUpLUlNxVU5NbTAwY2JvOTBxbWtvbS9HUHVQeWVVcHZaeVdQblRjcnBISUVRY2oxYVFZUkRBYTBPZkdWbmRmQ3FOSzRxRUc1S0RVY0RxT3pzOFAxVDAycEZ5MHBVQ0QveFZLL2FNb3lmc2I1b0xKYy9uMStYK1dFbXorVzErdUIxNnZNVlZXbXhLUnpJNGZUamtWRFptbnVyZFNWTkN0eWJiU2JsZXJ5NU5Pc1hBZTNSZm1rTWp3ZWp4WmxxdXVEcTlSNlFKRHhPWjBpb3RFMmRIWjJ0RXhUYlNsYVZxQjZCRUdBeDZPc2lhdEVoc2JQemI0YmFwcStPZGY0eU5KQ21Sb2pWeVV5bFNETGZzaXlyTWswbVV3YXZvd1VaejZ0RmhVMnhabFBjMXVVVDhwVEdHV3FVL1VxbTNheWVDUkpRaXdXUlhkM1Y5T09xcTBXQ2xTSEtJb1FCQUdaVEZickwxMU1jMjQ1dVNwWmhGdytaZVVqcjllTFlEQ0lUQ2FEVkNxRlZDcUZkRHBkdE4vOCszeTVLczNqWklWZGZSNGx6UzV4T25telVqcFArZTJhSWNvbnBmSDV2QWdHUXdnR2c5cGk2eXFGNTdMNjlXUXJhN3IxZXIzbzdPelFucFJpZHV4V2hRSTFRWkxFM0JCdnVTZ3FOWmVpdm9JeGp6aVZ6L1ZpelcrWDI3UHUrSksyY0RNZ0k1bE1JWjFPYVNONzNUVEsxaXpOVGRFUXhWbHBIaVhOemlpZkZDTkpFb0xCQUlMQkVFS2hvUGI4WS9XY1Zuc2VGN05JZXlBUVFHZG5COXJiMjZyc1UyMGRLTkF5Q0lJQVNaS1F6V2ExUjUyVnEzekxSNXlGTXRWdm8rd252NDArNnMwL2MwLzlCMUpscW9xMWVMOFVaek9Jc3htamZHSkViWFZTK3pLTkM3Ylgvdnd0MVBmcDhYZ1JpWVFRamJZWDlhdVNZaWpRQ2xCRUt1UUVsbzlJaXl1ZGhTTk9ZNVNxNWluZXJwU0FsZVplSDd4ZUg4SmhwUXpwZEFySlpFcHI5czJYelJseDFxdUpzSktLM3NsUnRtWnBGQ2ZSRXdqNGM4SlVYc2FGQm9yUFkvRVNlYlY0N0pleDZWYVNCQVFDUWJTM3R5TWNEaGZVUGFRY0ZHaVZLSXZNQzFBNzBGV1pMaHh4RmxmR2hWL1U0a3BJMlZmeDRDVGpoaDZQTjNmbkt1Z2kxTHhVbGVlYlVweXRPaUNyWGhFOHhWa2VVUlFSQ0FRUUN1V0ZxYTZJcHR6a3FqZlloVklzL3pTVFd1SDMrOUhXRmtZa0V0WTFGWk5xb0VBWGdkSXZJRUFRWksySlYwbFhjK2dyTkgzZmFINGZSa2tXNWlsOFFvengrS1gyb3d4SThpRVVVajdMWnJOYWRLcUlOWWxzN3Zsc2JoWm52VWJRbXVmSmw2dTZQTVkwaXJNMVVXV3BuMWFTbitJQm1KL3IybUFXbFpZYUVDUkpFc0xoRU5yYTJ1RHhlQmh0TGhJS3RFYW82MG9xVGJ4cWhDbVU2T05VMHdyZkZ3b1lLSXc0U3dtM01JK3lHTDZRSzVzSXY5OFB2OSt2N1R1VHlTS1ZTbXBSNnZ5OEtsWHJGYlpaV2pPS3MxNFJmUGs4U2xxOUluaUtzM0pFVWRUNkxkV2ZQcDhmeHZNakYzd25xb3NxU3oySTJncUNJQ0FZRENBU0NjUHZEMUNhTllRQ3JUR0NvQmVaT3VoSTBJMWlBOVIvaEh4ZXM0aFRTVGMrS1VaR2RWR3Avbm1veG4xTGtnaEpDaUFRQ0dyNU01a01rc204Vk5QcEpGS3A5SUtWdWxtYW5SVTJ4V21XeDN5NytzbTFPVkVHOFBsMVRiR3FMQUc5SlBQL3Y2WFBTL1dMRjFoSGtpVDRmRDRFZzM0RUFrRktzMDVRb0hWRStZZFIvcW1VNkU2SlNKVUZuWXNqenNMSVVVMHJGdVhDVVdueG5iQngzOFkwWlR0bENIMFFvVkJRU3pQclUxVkgveG9YblhCbk5GUUx1WnJMMWl4UCtlMnF1eEd4ZnJPeWNCN3o3VnBWbkY2dkY0R0FYMnVsVVlUcGg4L255eldGQXZuemFuWityVkZ0MzJlNUFVWEtRRWNSUHA4UG9WQXd0OGlDUUhIV0dRclVKdFIvUkVVNm1ad3NrVnZSdzdoWUE2QkdqNEQxcUxSNHUveCtDK1ZyRktrK1RlbFQ5V2w5cW5yWkszMnFTc1NxajF6Vlptd2o3aEpuNVZKc1BYRldjajRiRFkvSGcwREFuK3ViOU9mNktSVlo1dGZGTnBOazRkOWRma204eFRhOVZyZTlESTlIMHFTcC9CMlVwcDFRb0E2aVJIZktpa2VxVEFIMXVhVnFIa0NSWXVtb3REQnlOWk9pUHIwd2d0WHYxL3poNHNWNUJFRlpKY1huVTZiVDZNdWlMa3VZSDdTVUg4Qmt0dTV2TTRqVFNyTnM5WG1VTklyVEhFa1NFUWdFTlRucUIvU29vMHlOVGE1R1llWlo3THF4OVVPV0ZXbXFrYklvcWdNWm5TNVphMEtCdW9TOFRETTVRVWtRUmNFZ0pzQmNsUHBLdEhDeCsxTGJxWEtWWmFHZ2dsQ241Umo3Y3MyalZwaW02WmNsVk5MeUdjMUdCQ3VDVlg2cW80TjFlMTZ3b2pjWEhzVlphcnRHRnFjNklDWVF5QS9pVVVlL0tsTzVGUExkQzZVa1dkTlNvZkI3WXl6ellxUFNmUE9zMHF5czdvTTREUVhxUXBRbEJOUElaQlRwQ1lJQVVSUWhTVW9UVFdIRXFXd0RqTEVUWHdBQUlBQkpSRUZVbUZmK1NycFJyb0pwWld4TUw0eFNqZEdzdnF5Q1VENU4vMTRaN3U4M3JIS2lYNEZKZVRwTi9razF5a3Q5bnpJOEVxNXdmcXQ2ck9KelVKMDRxNU9pTzhWWnF3amVEdFMxb0JWQmVMVWJNQ1hOK043djl4ZVZzN0RwdGNSUnNMaW9zcjVOdHlycVBrUlJndGZyZ2MrbnpPK21OTjBKQmVweTFKRzgyV3dHcVZSK0lRZEZxSkkyTWR1OCtiYndINjdVb2cvcU52cmptZ3UzdklRWEVuQmhCRnhZWnFXdnl1UHg1S2JjR011dnIwUUVRWGtFbmI2NU9QKzcrajZsK3oxdG1LdWJQeTdGV1NwdE1hanlVNk1tbjg5WElNbThMQXVmS3BJdmMvR1NkcVVYSHlnOTk5R05xR1ZUeXF2Y1lDb0xvbmdveXdhQ0FtMHdGSmxtdFNlMkFNcW9YbzlIMGdrMUx3ZDlkRmRjaVFzRjBpeU9ISlg5dzBKYUplOUxTOWJzZmVFK1JGRXdiZFlxWEZOWWZhOUVzbm1wNWw5cHJSazVMK0pNaVhteDlvdHo0V2JaK29wVEZFV0lvcWdUb2g5K3Y4OGdSMVdNcWlpTEZ4ODNycjZULzZ4K0N3d3NUR0ZVV2EyQXEyKzZsZVVNc2xsWmE1YjErL1V0TVpSbW8wR0JOampxcU41a01wMFRqQUJSbEhMelBDVnQ4TVJDa2FQeFBZclMxSDJYU3pOdnVzM3Z5MnhrY1hIZnJQNXZLeTFac3doNUlTRjdQTW9EelpXdVdWV3V4ZExWbDBGOXRKMytaeWFUMFc1aThxOHNNcG0wOXJuNjFCeDE3ZVJzTnQrYUFDZ1BKMURmNS9Qa1Y3UlNIMkNnYjc1WFJhYThKRWlTQUVISXA2bDVCTUdZdnpDUHVrK3psL0V6SVRmbFNpLzZ3dWpRZlBFQUsxS3M1ZUlCcGZheDJLYmJhbEd1bzlLdkw0cGk3dVpDM1M5cGRDalFKa09kdDZsN2pDalVwOHFJb2dpUHh3TkprcUF1c0ZCZFUyMWVydVdiYW9GS0pXbnlGeGoydDFBa2EzNE9TbTlqMW9SdEptUVZTVkllZks3K1RXcmxwOTlIL3FaQkwrTjhIdU9OUi9FKzlOc1hwdW0zTlh1a2xGbi9YL0YwakVJQkd2UHFtN0lMNVpoUEswVjFVVmd0NXo0NlFTa0J5ekp5TjFZWktIK1BtTHVKVmNjdU1NSnNSaWpRSmlmZmg1b3RhSjRTdEFoVjdZZXFwRm5XTEsxNndjazZHUUQ1cG1haDZIMCtmLzc5WXFMUWZCbExiMk5GMHJYQnJLekZnN1Fxa1VpNVNHNnhUWlZ1NjF1czE0T2t5NkVPWmxQM28wVDVnaGJGazlhQUFtMUI5RkpOSnBPWW01dURMQ3Q5aXVvZ0h2M2dEcURhcGxvQUtDMUpzMjF5ZTBLaFFNekxYeTZpTEpkZWZ2L21VYWp5WkIzajhVb0oxM3ovWmhLczV2TktjREl5VzJ6VGF6MmFibXMzb0VqVytza3pHU1c2VkdVcENJQzZxaGhwVFNoUW9xRUtkWDQrQ1gxVHJEcEFTUzlYdFZscVlRRXVIQkVDQy9kL0ZyOHZsRTV4UktrWFcvR0FxVUlKVnhLRkdzVmFTckp1WUxGOWZmVVlRTFA0L3N6Nm9YejMxZEhhR2NQU213cUN0bWdCK3krSkNnVkt5aUxMV2FSU1N1V2k3eE1UQk9URTZvWEhJK25tNmlscmNDcjVDcGNkckU2U3VWd29YV0ZWMDVSYnlmNXF5VUpDWGlnYXRoYVZsbSs2ZFZmVGF6bnEwL2NwR0o1QXBJb3ltODFDRU1RU2ZkYUVsSVlDSlphUVpUazMvVVBwQjlJUEtpcHNCbGJsbWw5T3JmeG9YSFUvNWxGam9YQVhLbWZwS0hTaDZIaWhwdUtGam05SDAyMTlLUy9nYXFQTXhRNG9xaFIxaXBjNk5TbWR6bWpOcityMTFRL2tjdmMxSUc2R0FpVTFSNTFucWZhdDZnV3JSSzBlYlVxSlhyQmVyeWNudVh3bHVyQTBxNHRDS3g5QVZEcENMSjlub2VaYzZ4RndKUU9LcWg4UVZOdTVqL1ZHdVhGVGxvQlU1L0dxZ2xRaVNuVlFqMUpXZlJNc1BVbHFEUVZLYkVWZEtVakJPRzlRblZ6dThYZzF3YXFyMXlpQzllWDZvY3lGdXBnQlJhVWkxV3BHN0ZxSlVvdkw2dmFvdER5TDdmdVU1U3dTaWZuY0dzbEtjMnNtazlhV2VEUVhwREdxSk1RdUtGRGlHcFE1ckhuQm1zMXRGRVVCa3VUUjVtY3EwYXhVc3RtNGVFQlI2UUZFbGZkVFZqTGd5RWtXMi9kWnV3RkZzaXhyMGFMeTA3anNvcnI0UkRxZGdmcVlQK1dZK1JOcVhPekNWU2VhdERnVUtHa29sQldBa2dETUJhdi9YWlpsYlo2cjh0TURTVklXNkZhaVhFbWJDNnN1TUtFWGMvbit6WEt5clh5QVVHWDl1TmJtZ2hxeDN2UXF5OUF0NkorUEJ0V2YrcVVSbGFVU004aG1sUnNoWlRXbGZKbjE1Uy84bllJa2pRWUZTcG9hL2JKNmdCcEpsZjVkbnlhS1VpN2lsVXhmK3VrOWFwbzZrVjVkRWsrWk00amNLRS9Cc0VSZStkL1Y5NEsydko5Ky9xNnk3RjhXc3B6L3ZmQzlmZ0dOL09keXJzOHcvNlFiNVhkMVNjSTAwbWwxMlVKbGlVSlpWaDh4WjdZU2svbUtTNFdyTXhIU2pGQ2doSlJBRVlneWFLVndNRlNoYkV0L3JvK09GL3JjL1BkcUlqZmo3NlUvTHhiZ1FwOFRRZ3JoTWhxRUVFS0lCU2hRUWdnaHhBSVVLQ0dFRUdJQkNwUVFRZ2l4QUFWS0NDR0VXSUFDSllRUVFpeEFnUkpDQ0NFV29FQUpJWVFRQzFDZ2hCQkNpQVVvVUVJSUljUUNGQ2doaEJCaUFRcVVFRUlJc1FBRlNnZ2hoRmlBQWlXRUVFSXNRSUVTUWdnaEZxQkFDU0dFRUF0UW9JUVFRb2dGS0ZCQ0NDSEVBaFFvSVlRUVlnRUtsQkJDQ0xFQUJVb0lJWVJZZ0FJbGhCQkNMRUNCRWtJSUlSYWdRQWtoaEJBTFVLQ0VFRUtJQlNoUVFnZ2h4QUlVS0NHRUVHSUJDcFFRUWdpeEFBVktDQ0dFV0lBQ0pZUVFRaXhBZ1JKQ0NDRVdvRUFKSVlRUUMxQ2doQkJDaUFVb1VFSUlJY1FDRkNnaGhCQmlBUXFVRUVJSXNRQUZTZ2doaEZpQUFpV0VFRUlzUUlFU1FnZ2hGcUJBQ1NHRUVBdFFvSVFRUW9nRktGQkNDQ0hFQWhRb0lZUVFZZ0VLbEJCQ0NMRUFCVW9JSVlSWWdBSWxoQkJDTEVDQkVrSUlJUmFnUUFraGhCQUwyQ2JRdTNmdlJ1dzZGaUdFRUZKdmJCUG8vdjM3OTV3NmRjcXV3eEZDQ0dreHJsKy9qb01IRHo1azEvRnNFMmdnRUpqODhNTVA4YzQ3N3lDZFR0dDFXRUlJSVMzQTBhTkg4Y3RmL2hJK255OWwxekU5ZGgwb0VvbmNBNEFMRnk3Z3pwMDcrTzUzdjR0b05Hclg0UWtoaERRaDgvUHorTTF2Zm9PclY2OUNFQVIwZEhTTTIzVnMyeUxRdnI2K1lRQVFCQUczYjkvRzMvLzkzK1BxMWF0MkhaNFFRa2lUY2VmT0hmekRQL3dEcmx5NUFrRHhTMTlmM3oyN2ptK2JRRGRzMkhBOUVBZ0FVUDdJK2ZsNS9PSVh2OENoUTRmc0tnSWhoSkFtNGZ6NTgvanhqMytNOGZGOHdObmIyNHRJSkRKdlZ4bHNFNmdvaW5KL2Z6OEFSYUFxaHc0ZHdrOS8rbE5NVFUzWlZSUkNDQ0VOU2pxZHh2NzkrL0gyMjI4amxUSjJkNjVldmRyV3N0ZzZEMVQ5NHdSQmdDam1EMzN0MmpYODhJYy9CRWZwRWtJSUtjV05HemZ3Mm11djRjU0pFMXFhUGlCYnRXcVZyZVd4VmFBYk5teEFKS0pNQnhVRXdmQ0hKNU5KdlB2dXUzampqVGN3TVRGaFo3RUlJWVM0bUdReWlkLys5cmY0eVU5K2dyR3hNUzFkNzVBbFM1Wmc2ZEtsdHBiTFZvRktrb1RCd2NIOHdjWGl3NnZSNlBIangrMHNHaUdFRUJkU3lnbDZlUUxBenAwNzdTd1dBQWVXOHR1MGFSUEM0VEFBNVFSSWtsU1VKNWxNNHIzMzNzUHJyNzl1dU5zZ2hCRFNHc3pQeitQWHYvNDE5dTNiWjlvcXFXL0ZYTFpzbWUzOW40QURBdlY0UEhqc3NjZnlCUkJGMDBnVVVGYVYrTnUvL1ZzY1BYb1UyV3pXcmlJU1FnaHhrTXVYTCtPdi8vcXZTNDZMa1NUSkVJSHUyclhMcnFJWnNHMGhCVDJiTm0zQzU1OS9qcm01T1FEUW9sQXpTYVpTS2V6ZnZ4OG5UNTdFYzg4OWg0R0JBVnZMU2dnaHhCN3UzcjJML2Z2MzQ5S2xTeVh6RkxaYTl2ZjNZK1hLbFpCbHVkN0ZLOElSZ1hvOEhtemR1aFVIRGh6UTBpUkpnaXpMSlUvQ25UdDM4Sk9mL0FRREF3TjQ3cm5uME52YmExZHhDU0dFMUpHNXVUbDgvUEhIT0hic1dObldSa21TSUlxaXdSVk9SWitBUXdJRmdNMmJOK1BzMmJPNGQwOVpORUlRQkhpOVhxUlNxYkozRWxldVhNSFZxMWN4T0RpSVo1NTVCcUZReUs0aUUwSUlxU0haYkJaSGp4N0ZnUU1Ia0Vna3l1WTE2KzViczJZTit2djdIWWsrQVFjRjZ2RjRzR2ZQSHJ6eHhodmFpUk1FQVQ2ZkQ4bGtzdXdKa1dVWlgzenhCYzZjT1lOdmZldGIyTDU5T3p3ZXgvNFVRZ2doVlhMaHdnWDg5cmUvMVlLb2NraVNCSS9IWTRoT1k3RVlubi8rK1hvV2NVRWNmYUIyTkJyRml5KytXRFFjMmUvM2x4eFlwQ2VSU09DOTk5N0RYLzNWWCtIOCtmUDFLaVloaEpBYU1USXlnaC85NkVkNDQ0MDNLcEtueCtNcENwQjhQaDllZnZsbHFNdkRPb1hqWWR1S0ZTdnc1Sk5QNHBOUFB0SFNCRUdBMys5SE1wbEVKcE5aY0IvMzd0M0R2bjM3c0d6Wk1qejk5Tk40NElFSGlxUk1DQ0hFT1VaSFIvSHh4eC9qN05tekZUZTUrbncrcmM4VHlNLzlmUEhGRjlIVjFlVlkwNjJLNHdJRmdFY2ZmUlMzYjkvR3hZc1hBU2hOdEhxSlZ2cjgwT0hoWWZ6NHh6OUdYMThmbm43NmFXemN1SkVpSllRUUJ4a1pHY0ZISDMyRTgrZlBWeXc4dFR0UGJZblViN2RyMXk2c1diUEdjWGtDTGhFb0FPemV2UnRqWTJPNGRldVdJZDN2OTBNUWhLSkZnOHR4OCtaTjdOdTNEMHVXTE1Fenp6eURUWnMyVWFTRUVHSWo4WGdjSDM3NElTNWN1RkRWZG9JZ0lCQUlRQkNFSWtuZWYvLzkyTFp0bXl2a0NiaElvT3Fnb24zNzltRjJkdGJ3bWMvbmd5UkptSitmcityRWpZNk9ZdCsrZmVqcDZjRXp6enlEaHg5K3VLSytWVUlJSWRhNGZ2MDZQdmpnQTN6MTFWZFZieXRKa3RhdnFhL3JCVUZBVDA4UG5udnV1WnFWc3hhNFJxQUFFSWxFOE9xcnIrS2YvdW1mTURZMnBqWGxBb3BnSlVsQ0lwR29xRjlVeiszYnQvR1AvL2lQK09DREQvRDAwMC9qa1VjZTRhaGRRZ2lwSVY5Ly9UWGVmLzk5N2VIVzFlTDMrK0gxZWdHZ0tGQmF0bXdaOXV6WjQ3cDYyMTJsQWREZTNvNVhYbmtGdi9yVnJ6QThQR3o0VEJSRmhNTmhKSlBKQmVjTW1YSG56aDM4N0djL3d6dnZ2SU1kTzNaZ3g0NGRhRzl2cjFYUkNTR2twY2hrTWpoMTZoUU9IanlJZUR4dWFSK1NKQ0VZREJZdGtLQTI0YTVkdXhiUFAvKzhZVENSVzNDZFFBRWdFQWpnZTkvN0h0NTc3ejFjdW5USjBIOHB5ekw4Zmo4OEhnOW1aMmN0clpFN1BUMk4vZnYzNDhNUFA4VG16WnZ4eEJOUE9MSVFNU0dFTkNJVEV4UDQ3TFBQY09USUVVeFBUMXZlajkvdk4yMnlWUmtjSE1RVFR6eFI4bk9uY2FWQUFlV3U1TVVYWDhRbm4zeGllSGlxL3ZPMnRqWWtFZ25Nejg5Yk9rWW1rOEhKa3lkeDh1Uko5UGYzNDRrbm5tRHpMaUdFbE9EcnI3L0dwNTkraWkrLy9ISlJEL2hRV3hNTEYwZFFFUVFCVHozMUZCNTY2Q0ZYaWxQRjlhYjQxcmUraFdnMGFsZzNWKzBiRlFRQm9WQUlYcThYYzNOelZmZU42b25INDlpM2J4L2VldXN0Yk4rK0hidDI3VUkwR3EzRm4wQUlJUTFMT3AzR2lSTW44T21ubjJKb2FHalIrL1A3L1lZbFdBdEgyL3A4UG56bk85OXh6VlNWY3JoZW9BRHc4TU1QbzcyOUhlKzg4NDdwbkZDdjF3dXYxNHY1K1huTXpjMHQ2cVJQVDAvai9mZmZ4NGNmZm9oTm16YmhzY2Nldy8zMzM4L1J1NFNRbHVMMjdkczRldlFvamh3NVVqUXp3Z3BlcnhmaGNManNnME5Db1JEMjdOblRNQThMYVFpQkFzQjk5OTJIdlh2MzRyMzMzc1BvNkdqUjU0SWdJQmdNSWhBSVlIWjIxdElnSXozWmJCYW5UNS9HNmRPbkVZbEU4T2lqajJKd2NCQkxseTVkMUg0SkljU3R6TTdPNHRTcGt6aDI3Qml1WDc5ZWszMUtrb1JJSkFLZno2ZUowMnlPNTRvVks3Qjc5MjVFSWhIWFI1NHFEU05RQU9qbzZNQXJyN3lDWThlTzRlalJvOGhrTWtVTEpJaWlpTGEyTmdTRFFjek16Q0NaVEM3NnVOUFQwemh3NEFBT0hEaUFwVXVYWW5Cd0VJODg4Z2dpa2NpaTkwMElJVTZTeVdSdzhlSkZIRHQyRE9mUG4xOVVWNWdldFo4ekdBd0NLQjRFcEVyVTYvVmkxNjVkMkx4NXMyaytOOU5RQWdXVWs3NTE2MVlNREF6ZzNYZmZ4ZDI3ZDAzemVUd2V4R0l4SkpOSlRFMU4xZXhMTVRJeWdyZmVlZ3UvL3ZXdnNYNzllZ3dPRG1MRGhnMGNlRVFJYVNqaThUaU9IeitHa3lkUDFxU0pWa1VkbTZJUE1FcEpjZm55NWRpOWV6ZmEydG9hU3B3cURWdnJkM1YxWWUvZXZUaHk1SWpoSWF6NnhSY0FwY1BhNy9kamRuWVdNek16aXhvNXBpZWJ6ZUxDaFF1NGNPRUNnc0VnSG5yb0lUejg4QmFzWHIyS3l3WVNRbHpKK1BnWVRwNDhpZVBIaitQMjdkczEzMzh3R0VSYld4c2tTUUtBb3I1T05lcjBlRHpZc1dNSEhuNzRZUzFmSTlLd0FnV1VpN0ZqeHc0TURBemd2ZmZldzlqWVdNbDhrVWdFNFhBWWMzTnptSjZlcmxsRUNpaFBVejl5NUFpT0hEbUNTQ1NDQng5OEVCczNic0o5OTYyQktFbzFPdzRoaEZUTG5UdTNjZmJzV1p3OWU5YnlZZ2NMb1lwVFhVbW9YS0N5Yk5reTdONjlHKzN0N1EwclRwV0dGcWhLYjI4djl1N2RpOE9IRCtQa3laUElack5GaXkrbzAxN0M0VERDNFRBU2lRU21wcWFxV3FTK0VxYW5wM0gwNkZFY1BYb1VnVUFBR3pac3dNYU5HN0Z1M1RwSVVsT2Nia0tJeXhrZUhzYTVjK2R3OXV6Wm9nZDAxQXExUG0xdmJ6ZDlha29oWHE4WFc3ZHV4Wll0VzB3SEVUVWlUVk9qUzVLRXh4OS9ISnMyYmNMQmd3ZHg5ZXBWdytmNnBsMTF4RzRvRk5KRWFuVXhobklrRWdtY09IRUNKMDZjZ00vbncvcjE2N0Z4NDBhc1g3OGVQcCsvNXNjamhMUW1zaXpqK3ZYck9IZnVITTZkTzFleU5hNFdpS0tJOXZaMlJDSVJnempObW1yVi9BTURBOWk1YzJkRGpiQ3RoS1lScUVvc0ZzTkxMNzJFbXpkdjR0Q2hRMFhyNlJhaWlqU1pUR0p5Y3JLbW5lbDZrc2trenB3NWd6Tm56c0RqOFdEdDJyWFlzR0VEMXE1ZGg3YTJ0cm9ja3hEU3ZLVFRhWHp6elRXY08zY2U1OCtmVzlTU2VwWGc4WGdRalVhMStxclVYRTQ5SzFldXhNNmRPOUhkM1YxUi9rYWo2UVNxMHRmWGgrOS8vL3Y0NXB0dmNPalFvWktqZFZWOFBoOTZlbnFRVHFjeE1UR0JtWm1adWwzc2REcXREVUFDZ0NWTGxtRHQyclZZdTNZZFZxNWNDWStIL2FhRWtHTHUzTG1EeTVjdjRmTGxLN2gyN2V1YWQwR1o0ZlA1RUl2RnRGRzE1ZVp5cWl4WnNnUTdkKzdFc21YTG1rNmFlcHBXb0NxclY2L0c2dFdyY2ZIaVJSdytmSGpCdXpTdjE0dWVuaDUwZDNkamVucTZiczI3ZWtaSFJ6RTZPb3FEQncvQzYvVmk5ZXJWV0x0MkhkYXVIVUJuWjFkZGowMEljUytKUkFKWHIzNk5LMWN1NC9MbHk1aVltTERsdUtJb0loS0pJQnFOd3U5WHVwdk1Jc2hDaVhaMmRtTDc5dTFZczJhTnRrMHowL1FDVlhuZ2dRZHcvLzMzNDlTcFV6aCsvRGptNXVZQUZFOTdVVkhiK2FQUnFEYVhkSEp5c21iVFlFcVJTcVZ3NmRJbFhMcDBDUUFRaTNWZzdkb0JEQXdNWU0yYSsrRHorZXA2ZkVLSWM4aXlqS0doSVZ5NWNnVlhybHpCME5CUTNlc2NQY0ZnVUd1bVZldkZTbzRmaVVUdzJHT1BZY09HRFFDYVg1d3FMU05RUUpIaUk0ODhnczJiTitQRWlSTTRjK1pNUlgyZTZpTjNlbnA2TUQwOWpZbUppYnIxbFJZeVBqNkdMNzc0QWw5ODhRVkVVVVIvZno5V3JseUZsU3RYWXNXS0ZkcXdjVUpJNDVISlpEQXlNb0tob1RqaThUaXVYcjI2NkdWSXEwWHQyNHpGWW9ibDlncWZ5Nm1pZng4T2gvSFFRdzloOCtiTkZZM0ViVFphU3FBcVhxOFgyN2R2eDlhdFczSHg0a1djUG4wYWQrN2MwVDR2RlpVS2dvQzJ0amEwdDdjam5VNWpmSHdjRXhNVHBndmMxNE5zTm92cjE2OXJhMVFLZ29DK3ZqNnNYTGtTSzFldVJILy9Dc05URGdnaDdtSmlZZ0xEdzBPSXgrTVlHaHJDelpzM2F6b252VkxVdXF5am82T29iN01TZW50N3NYbnpacXhidDA0VGFpdUpVNlVsQmFvaWltSnUwWU9OR0I0ZXh2SGp4M0hqeGcxa3M5a2lpUmErOTNxOTZPM3RSVzl2TDJabVpqQTVPVm5USlFNclFaWmxqSXlNWUdSa0JFZU9IQUVBZEhkM1k4VUtKVHBkdVhJbFIvZ1M0aENwVkFvM2I5N0U4UEFRaG9hVVY3MUh5aTVFS0JSQ05CcEZSMGVIOWxRVW9QUTZ0WHBFVWNUS2xTdXhaY3NXOVBYMXRhdzA5YlMwUVBVc1g3NGN5NWN2eC9UME5JNGZQNDZ2dnZxcW9vWG8xVldPMUQ2RG1aa1pURXhNWUhKeTByYklWTStkTzNkdzU4NGRuRGh4SEFBUWpVYXhZc1VLTEYvZWo3NitQdlQyOXZMUmJJVFVnYkd4TVF3TkRXRjRlQmpEdzBPNGRldVdyZjJYcFloRUlvakZZb2hHby9CNnZRYnhsUk9nS2xHLzM0OTE2OVpoeTVZdENJZkRDMjdYU2xDZ0JiUzF0ZUdwcDU3Q3JsMjdjT2JNR1p3OWV4WlRVMU1BaXFOUXM2WmVWYWFBOG1pZ2lZa0pqSStQMnpMYzNJeUppUWxNVEV6Z3pKa3pBSlM3eUo2ZUh2VDFMVVZmWHgrV0xGbUNucDRlTGpsSVNCVWtrOGxjNjgrd0prMTFZS0xUNkp0bm85R285cUNMYWlQR3RyWTJQUGpnZzNqd3dRZTFzUllVcHhFS3RBUWVqd2RidG16QmxpMWJjUFhxVlp3NWN3YWpvNk5WZllIQzRUQWlrUWo2Ky9zeE96dUw4ZkZ4akkrUDEzMWFURG15MmF3MmJlYlVLU1ZOa2lSMGQvZWdyNjlQazJwM2R6Y2pWVUp5M0wxN0Z5TWp3eGdlSHNiSXlERHUzTG5qS3BtSW9xZzF6Y1ppTVVQemJMa291TENwVnIzQjNyUnBFMWF2WGwzdllqYzhGR2dGckZtekJtdldyTUhzN0J3dVhyeUFxMWV2WW54OEhFQmxVU2tBYlEzZS92NStKQklKakkyTmFRczJPRTBtazhIbzZFMk1qdDQwU0xXM3R4YzlQVDNvN094Q1IwZUhka2NMOEdrenBEbVpuNS9IK1BnWXhzYkdjUGZ1UFl5TzNzVEl5SWlqTjcybFVFZlBkbloyR3FSWmJsazlzL2VBMHRXemF0VXEzSC8vQXdpSE9SQ3hVaWpRS2dnR2cxcFVldS9lUFZ5OGVCSGZmUE5OMWNQTzFlVUQrL3Y3a2Nsa01EazVxVFcxdXVVZlZSMWVQekl5WWtpWEpBbXhXQ3duMUU1TnJMRllCd0tCZ0VPbEphUnlzdGtzSmlhVTFxQ3hzVEhkNjU1dDA5T3NJQWdDMnR2YkVZdkZFSXZGRFAyUlZxTGhRQ0NBL3Y1K3JGKy9IcDJkbmVwUmFsamk1b2NDdFVoSFJ3ZDI3TmlCN2R0M1lHZ29qaXRYcm1CNGVCanBkTHJpcUJSUWhOVFoyWW11cmk0SWdwQzdBeDdYaE9yRVFLUnlaRElaM0wxNzEzUnB4R0F3cU1sVUw5Wm90QjJDd09aZ1lpOHpNek1ZSHgvTFJaVGpXbVE1TVRIaHF1Ylhjb1REWWExWk5ocU5Ga1dacFpiVUs3WE1udGZyeFpJbFN6QXdNSUNsUzVlQmp5NWVIQlJvRFZCSDhLYlRHVnk3OWpXdVhyMktlL2Z1V2I0cjdPdnJ3OUtsU3lFSUFxYW1wclMrMDhuSlNWZi80OC9OeldGdWJxNW9BWDkxVlNkRnJESEVZaDNhWFhRd3lPWWlZcDFVS29ueDhZbmMvOGhZTHFwVWZuZHE0TjVpOFBsODZPenNSR2VuMHJxakxtd0FWTmVYcVVjVVJYUjJkbUxWcWxWWXRXbzFKSWszczdXQ0FxMGhraVJoWUVCWmRpK1JtTWZseTVjd01qS0M4Zkh4aXFKU3N6UjFPY0ZWcTFibG1wNG1OSmxPVFUyNVlwajhRbVN6V2UwbTRObzE0MmZLUXRWNW9hcXY5dmFvOWxSNzB0cGtzMWxNVFUxcHphNUtDNDBpeXRsWjU4Y1FMQVoxb2ZaWUxJYk96czZpUlEyczNqQ3JnNHFXTGwyS2dZRzE4UG5VRmNzWWN0WVNDclJPK1AxK2JOeTRFUTgrdUJIcGRBbzNidHpBOFBBdzd0MjdwelhMbG12YU5VT1NKSFIxZGFHN3V4dUNJQ0NieldwTEM3cXREN1ZTa3Nra2J0MGF4YTFibzBXZitYdytCSU1oQklOQjdSVUtCUkVJS0wrclA0UEJvRFpVbnpRR21Vd0djM056U0NUbU1EZVh5UDAwZTgwaWtVaTR1dVdsVXZUVFMvSXRNRUdES0t1Sk1ndmZlNzFleEdJeExGdTJETXVXTFlQSDQ4MDEwVkthOVlLMWpnMTRQQjZzV2JNR3ExZXZBU0RqOXUzYnVIRWpqcnQzN3hRTlFLcW0vMVM5eTR6RlloQUVBWUlnWUc1dVRvdFN4OGZITVRVMTFiQ1ZUektaUkRLWnhNVEUrSUo1SmNtVGsybkFJTmRBSUtEOURBU1VkTCtmQy9MWGcyUXlxUk5pd2lCSDlYZFZqS25Vd291VU5EcHFjNndhWGFwOW1Lb2thN0dTVHpBWVJGZFhGNVl2WDQ2dXJpNEFBdnMxYllRQ2RRRGxjV2s5QUdUTXpNd2lIcitCVzdkdVlYcDYydlFmcWhxcEJvTkJoTU5oTEZ1MkRJSWdhS044MVpHRzQrUGpGYTJ3MUdoa01tbE1UMDloZW5wcXdieUNJQ0lZREdoU1ZYNVhKT3YzQnhBTUtqOGxTWUlvaXRwUDVTVlYxV3JRU01peWpFd21nMnhXUmphYlFUYWJRU2FUUlRhYlFTSXhuNU5pWG83R253bEgxblIxQytvSTJhNHVaY3BYWjJjbnd1RncwWUNmU3ZaVExzb1VSUkdoVUFnOVBUMVl2cndmd1dBQWxLWnpVS0FPRXdxRnNINzkvVmkvZmozUzZReEdSb1p4OCtaTlRFMU5XUjZCcXhlc3grTkJaMmNudXJ1N0FVQWI2VHM1T2FtOUppWW1Tc3E3R1pIbExHWm5aeTFQV1JBRW9VQ3VFaVJKTlAycGlyZFF3c3JueFhuMCt4WUVFWUlBbmRDeXVaY3F0dno3YkRhcnlVNU5WMlJveksra1pReDVNNWtNTXBsTXkxei94YUkybGFvalkyT3hHTnJhMmlDS1lrMmFZczJPMTliV2h0N2VKVml5WkVsdUVCQ042UVlvVUJjaFNSTDYrMWVndjc4ZnNnek16czdnNXMyYkdCc2J4OHpNdE9FT3Y1cW90UEJ6dFZtenI2OFBRUDRmV0Q4ZjFla2xDTjJNTE11dW0xNUU2a01rRWpIMFdhcnpMd3VqeWxvdXJDNUpFb0xCSUdLeERpeFowb3RnTU1TK1RKZENnYnFZVUNpRU5XdnVnL0p3ZHhsemN3bU1qbzVpZkh3TXM3T3ppMm95S3hTdUtJcGEweE1BclU5VnY1NnZPajkxZW5xNklVYi9FbElwK2xWOThuT1lZOXJpNndBTWZaY0xVVTJVcVRiTFJxTXg5UGIySWhEd1E1VWxtMmJkRFFYYVFBUUNBYXhhcFR4TUcxQ1dIYnQxNnhZbUpzWXhPenVMYkRack9Tb3Q5VjVkZ25ENTh1V2FWQUZsa3ZyMDlMUTJuVWI5MlVwTndhU3hVT2NqUjZOUnc4LzI5bllFZzBFQUtCcmdVODJTZUFzMXhhb2o1d1ZCUUNBUVFEUWFSWGQzRC94K3YvWTVhU3dvMEFiRzcvZWp2NzhmL2YzOUFHVE16eWR4OSs1ZGpJK1BJWkZJMUMxSzFEL0NUUjJzcFA3enk3S3NQZEpORmF2NmVEZW5uNFZJbWg5MXFvaStqMUo5aGNOaFRXS0FVWktxK0JhU1lMV28rL0w1ZkloR28ranE2czdOeVZRalRFcXprYUZBbXdpZno0ZWxTNWRxZlpzQWN2S2F3T3pzTEpMSlpFMmkwbkxiNisveTFYenFVMTNVQ2ZHVGs1TmFCS3YrVkY5c0dpYmxrQ1FKa1VoRXU0SFQvNjRzd05GdWtHQzFvMkFMcVNTcTFEZnh5cklNajBlWlV0WFcxcTZWUjgxTG1nc0t0TWxSbTZpQS9OMndPdnAyYm01V0d3eGp4eiszSkVsYVA2dStVdEZIc0hOemM1cFUxU1poOWZlcHFTbk16TXhRc2syS0tJcG9hMnREZTNzNzJ0cmF0SmNxeUxhMk5vUkNvWklEZUtwOVVIU3A5NVhrVjBjdlM1S0VRQ0NvbFZ2OVhKK1hOQzhVYUF1aVZrWkF2cUpSQlpWSXpDR1R5V2hUSzh4WXpBamdjdmtGUVVBb0ZFSTRITWFTSlVzTVl0V1hSUis5bXExZU16czdxLzFzdEpXWm1nMi8zNDlRS0ZUMFVwOUlGQXFGREhKVVpWVW94R29HOE5TYWJEYUxkRG9OUVJEZzkvc1JEa2UwL3g4S3NyV2hRQWtBSUJKcDA2M0RDUUF5Wm1kbk1UTXpnL241K1Z5a0trT1NKRWZXcUZXbHEvWnhxZlB1QUdNVVd4alpack5aSkJJSlRhcXFXUFd2dWJrNXpNL1BheXNmemMvUFkzNStubE40Y2tpU0JML2ZENy9mRDUvUEI3L2ZqMEFnb04zc2hNTmhVMG1HUWlIVHA0Y0E1b04xYWlsSEsxRm1LcFZDS3BXQ0xDdC9zOC9uMC80TzQySUZsQ1pSb0VCSlNkUklBY2hMRlFDU3lSUm1aNmVSU013am5VNUJGYXZQbDE4aXIxWlJhVGtxMlViZloxYUpjUFZwQUpCS3BUU3g2bCtxY0F0L0pwTkozUUlHeGxkK3BaL2l6OVFtd2NJOHNweS9hU2xla01IOHZYRXhCc0dRUnhXaFhvYWxmbnE5WHZoOFBtMkJnRkxOcG9YdjY3R1lRQ1g1S3gwRnE5NFFack15SkVrNUo4RmdHTEdZVDhzSmJ1WnBBQUFnQUVsRVFWU1gyNExUU0VoWktGQlNOVjZ2RjlGb0RORm9YcXl5ckZTaXM3TXpTQ1FTaG9qVjYvWEM2L1V1c05mRlUydHBxMDEyZ1VDZ1pKOXR0Vkl1bDcvU2ZWVWlyVkw5Z2xienEyV290ZlRLNVY4TTZYUmFhMFdRWlJtaUtPVkVHVUl3R05ZV0ptQlVTUllEQlVwcWhpQUl1ZWE4TU5Sb1ZSVnNKcFBCL0h3Q3FWUUs2WFFtVjZrSld1VHE5L3NyRXB3ZGthMVQxS0xzOVphY25aUXJTeUtSMEFTWnlTZzNBYUlvd3VOUm9tYXYxd2V2MTI4UXBDcE5RbW9GQlVwc1FSUWxCSU5oQklNeThuV2lyQk9zakdReWthc1FNN2x0UkhpOUhpMEtyRWZmNjJLbFZhOEJWVmJMVTI5cXNaakFRdm56anpwTDVKckVzN2tiTGxXUVhvaWlDSjlQV2ZUZnVHcVBlODRWYVg0b1VPSUtsT2JTUUM0U1ZkTHlUWW5Bek13YzB1azBNcGswc3RtTUpsNUJVUHI5UEI2bHFWamZ2NmRTYThrNUtUWDEySFkycGRZaUtrMmxVdHBnTGJVUFVsbkVQZ3VsdFVMSXRVaDQ0ZkY0Y3MzVkV2eitvSzRaRzZBZ2ladWdRRWxESUFoQ3JpL1ZVeVJZOWZkVUtvTlVhaFpUVXpPUVpSbnBkQ28zRUFjUUJMMXNQZkQ1dkxsbVBvOG1YcS9YVzVNb3Q5NVJxUmwyTmNXcWczRFU1bFA5d0NxMWVWNGQvS1NVUTdtNUtSeWNwYVo3UEtBZ1NjTkNnWkttUkJBRWVEejVnVXY2YURhZHp1VDZZUk1vN0t2TlptWEljaWIzdTVBVEx3Q0lFRVZCRzgzcThVaVFKQTg4SG84bVlhL1hheGdaV3poNnR0UnJNZWdmUjVhUDZvcGYrbnlwVkJxcFZCTEpaQXJwZEFxcFZMb2dyd3haenVZR0VDbm5RT2xEVk01QjRlQWI5WGRGa2lJa1NlUklWdElTVUtDRTZGQ2JEcFhmQWIxZ3MxazUxeitid2Z4ODBqQzFSejhhV1VFMmlaUVgrankvdjN3a0podCtGd1JSRjkwVlIyN0czMHQvWG1wd1RmNXovU3VmbHhDU2h3SWx4RVVZQmF1SzBwREQ1aElSUWtwaHZsWWJJWVFRUXNwQ2dSSkNDQ0VXb0VBSklZUVFDMUNnaEJCQ2lBVW9VRUlJSWNRQ0ZDZ2hoQkJpQVFxVUVFSUlzUUFGU2dnaGhGaUFBaVdFRUVJc1FJRVNRZ2doRnFCQUNTR0VFQXRRb0lRUVFvZ0ZLRkJDQ0NIRUFoUW9JWVFRWWdFS2xCQkNDTEVBQlVvSUlZUllnQUlsaEJCQ0xFQ0JFa0lJSVJhZ1FBa2hoQkFMVUtDRUVFS0lCU2hRUWdnaHhBSVVLQ0dFRUdJQkNwUVFRZ2l4QUFWS0NDR0VXSUFDSllRUVFpeEFnUkpDQ0NFV29FQUpJWVFRQzFDZ2hCQkNpQVVvVUVJSUljUUNGQ2doaEJCaUFRcVVFRUlJc1FBRlNnZ2hoRmlBQWlXRUVFSXNRSUVTUWdnaEZxQkFDU0dFRUF0UW9JUVFRb2dGS0ZCQ0NDSEVBaFFvSVlRUVlnRUtsQkJDQ0xFQUJVb0lJWVJZd0RhQm5qMTdkcFZkeHlLRUVOS2F6TS9QZSt3NmxtMENQWFBteks1MzMzMFg2WFRhcmtNU1FnaHBJWTRmUDQ3RGh3OC9iTmZ4YkJOb0tCUWFPMy8rUFBidDI0Zng4WEc3RGtzSUlhVEpTU2FUZU91dHQvREpKNStncmExdDBxN2oyaWJRU0NSeUR3RHUzTG1EMTE5L0hWZXZYclhyMElRUVFwcVV1M2Z2NHZYWFg4Zmx5NWNCQUIwZEhSTjJIZHMyZ2E1YXRlb2JBQkFFQWZQejgvakZMMzZCUTRjT1FaWmx1NHBBQ0NHa2liaHc0UUplZi8xMWpJMk5BUUFrU2NLeVpjdnUyWFY4MndSNjMzMzNqVVlpRWVXZ29uTFl6ejc3REQvLytjK1JTQ1RzS2dZaGhKQUdKNXZONG9NUFBzRGJiNytOVkNxbHBTOWZ2aHgrdjkrMmdUYTJUbU5adVhJbEFDVUtWZm42NjYveG94LzlDRjkvL2JXZFJTR0VFTktBakkyTjRTYy8rUW1PSHo5ZTlObnExYXR0TFl1dEFoMFlHTWdmV013ZmVtcHFDai85NlUveG05LzhCdlB6ODNZV2lSQkNTQU1neXpLT0hqMksxMTU3RGNQRHcxcTZQaUN6VzZDMnpaY0JGSUYyZG5aaWJHd01naUJBRUFSREgraVhYMzZKYTlldTRUdmYrUTdXcmwxclo5RUlJWVM0bER0Mzd1RHR0OS9HeU1pSUlWMHZ6NEdCQVhSMGROZzZyc2IybFlpMmI5K3UvUzVKa3VFRUFFbzArck9mL1F4dnZmVVc1dWJtN0M0ZUlZUVFsNUROWm5IbzBDRzg5dHByWmVVSkFEdDM3clN6YUFBY0VPajY5ZXZSMmRtcHZaY2t5VFRmbVRObjhEZC84emY0NnF1djdDb2FJWVFRbHpBNk9vb2YvZWhIT0hEZ0FES1pqT0V6UVJBZ2lxSW0wZlhyMTZPN3U5djJNanF5RnE0K0NoVUVvYVJFWjJabThMT2YvUXkvL09Vdk1UVTFaVmZ4Q0NHRU9FUTZuY2JISDMrTTExNTdEYU9qbzZaNTlHTm9CRUhBcmwyNzdDcWVBVnY3UUZYV3JWdUhJMGVPYUhOM1JGR0VMTXZJWnJPbStjK2RPNGRMbHk1aDU4NmQyTGx6SjN3K241M0ZKWVFRWWdObno1N0YrKysvajhuSjBvc0plVHdlUXovbkF3ODhnTTdPVGtmV0ZIQkVvSUlnWVB2MjdYam5uWGZ5QmZGNGtFNm5TMG8wbFVyaHdJRURPSG55Skw3OTdXL2pvWWNlc3F1NGhCQkM2c2pRMEJEZWUrODl4T1B4c3ZuMDQyWmtXWVlnQ05peFk0Y2RSVFRGRVlFQ3dQMzMzNDhMRnk3Z20yKyt5UmRtQVlrQ3dPVGtKSDc1eTEvaTg4OC94L1BQUDQvKy9uNDdpa3NJSWFUR1RFNU9Zdi8rL1RoejVzeUNlU1ZKTWpUZEFzQ2pqejVxKzhoYlBZNCtEL1NGRjE1QVIwZUg5bDRRQlBoOHZwSjlvbnFHaG9id3d4LytFRC8vK2M4eE1XSGIwb2VFRUVJV1NUS1p4SWNmZm9pLy9NdS9yRWllWHE4WEhvOHgzbHU1Y2lXZWZQTEplaFd4SWh5TFFBSEE1L05oejU0OWVPT05ONUJNSmdFb1liblA1ME1xbGFybzBXZGZmdmtsTGx5NGdNY2ZmeHk3ZHUxQ0lCQ29kN0VKSVlSWVFKWmxuRHg1RXUrLy8zN0ZBME45UGwvUmxKVm9OSXJmL2QzZkxVcTNHMGNGQ2dBZEhSMTQ0WVVYOE9hYmIycHBzaXpENi9WQ0VBVERPb2VsU0tWUytPaWpqM0Q0OEdGdG9GRXdHS3huc1FraGhGUklOcHZGNmRPbjhmSEhIK1BPblRzVmJhTzJTT29YM0JFRUFSNlBCeSsvL0RJQ2dZRGpEeU54WEtDQXN2elNybDI3Y09qUUlVTzZLbEUxT2wySVJDS0JEei84RUljT0hjTDI3ZHZ4eEJOUElCd08xNlBJaEJCQ0ZpQ1R5ZURFaVJNNGNPQUE3dDJyL0NFcGdpQVlXaFAxb256aGhSZlEzZDN0dUR3Qmx3Z1VBTFp1M1lvN2QrNFVMWnlnU3JTYU5YTG41K2R4NE1BQkhENThHTnUyYmNPVFR6Nkp0cmEyV2hlWkVFS0lDZWwwR3NlT0hjT0JBd2N3UGo1ZTFiYWlLR3J5TEpUa3pwMDdNVEF3NEFwNUFpNFNLQUE4OTl4em1KNmVMbHF5eWVQeFFKSWtKQktKc2lOMEMwa21rL2owMDA5eDVNZ1JiTjI2RlU4OTlSVGEyOXRyWFd4Q0NDRlF1dE9PSERtQ1R6NzVwT3hjemxKNHZWNXRucjlla29JZ1lPM2F0WVpGZU55QXF3VHE4WGp3dmU5OUQrKzg4dzZ1WHIycXpmTUJsTHVTVUNpRVpESlpjWk91U2lxVndxRkRoM0QwNkZFTURnN2lpU2VlUUc5dmJ6MytCRUlJYVRubTUrZHgrUEJoZlBMSko1aWVucTU2ZXpYcWxDUUpzaXdYUlpnYk4yN0VzODgrVzZ2aTFneFhDUlJRSlByU1N5L2hvNDgrd3VuVHB3MmZxZTNpWHE4WHM3T3pWWWZ4NlhRYVI0NGN3ZEdqUjdGdTNUcnMyclVMR3pac2NId2tGeUdFTkNLM2J0M0NvVU9IY096WXNhb0RHeFd2MTZzTitpeU1PbVZaeHM2ZE83RnQyelpUc1RxTjZ3UUtLQ2Z1bVdlZVFUUWF4YWVmZm1vUW5Dekw4SGc4YUd0cnc5emNYRVdqZEF1UlpSbGZmZlVWdnZycUszUjFkV0hYcmwzWXRtMGJSKzRTUXNnQ3lMS01zMmZQNHVEQmc3aDA2WkxsL1FpQ2dGQW9wTTN2TEpTakpFbjR6bmUrZy9YcjF5K3F2UFhFbFFKVkdSd2NSRnRiRzk1Nzd6M0R5VldiZHNQaE1KTEpKT2JtNWl6Zm1keTlleGUvK3RXdjhPNjc3MnJOdTMxOWZiWDZFd2docENtWW01dkQ0Y09IY2VqUW9hcEcxSnJoOVhvUkNvVWdpcUxwdUpaQUlJQ1hYbm9KeTVZdGMxM1VxY2ZWQWdXVUpmL0M0VERlZnZ0dDB5WUN2OThQcjllTHViazV5MDBJZ0RMZzZMUFBQc05ubjMyR3RXdlg0b2tubnNDRER6NVl0SFFVSVlTMEVpTWpJemg0OENDT0h6KytxRG9XeUVlZGZyL2ZNTGRUTDhsb05JcnZmdmU3aU1WaXJwWW4wQUFDQllEKy9uNjg4c29yZVBQTk4wMUhkb21paUVna2duUTZqZG5aMllwV01Dckg1Y3VYY2ZueVpjUmlNVHoyMkdNWUhCeDA1Rmx6aEJEaUJNbGtFbDkrK1NVKy8veHpYTGx5cFNiN0RBYURDQWFEaHNYZ0MrbnI2OE9lUFhzYVprVzVoaEFvQUhSMmR1S1AvdWlQY09EQUFadzdkODQwajlmclJTd1dReUtSd096c2JGVlRYc3dZSHgvSC92MzdzWC8vZnF4ZXZScURnNC9oNFljZmFwaUxTd2dobFNMTE1pNWZ2b3pqeDQvaHl5Ky9YSFMwcWVMMyt4R0pSTFRIVnBxSlV4UkZiTm15QlR0MzdpeUtTTjFNd3dnVVVOWkUzTDE3Tjlhdlg0LzMzMzhmMDlQVHBpTm9nOEVnQW9FQVptZG5GOVUvcXVmYXRXdTRkdTBhM256em43Qng0MFlNRGc1aTNicDFBRGlDbHhEU3VJeU9qdUw0OGVNNGNlSkVUUi9NNGZWNkVZbEU0UFA1VE1XcGlyS2pvd1BQUGZlY05yV3dVZVFKTkpoQVZWYXRXb1UvK1pNL3dVY2ZmWVNMRnkrYTVoRUVBWkZJQktGUUNOUFQwMGdrRWpVNWRpcVZ3c21USjNIeTVFbEVvMUU4OHNnakdCd2NSRTlQVDAzMlR3Z2g5V1ptWmdhblRwM0M4ZVBIRjN3R1o3Vklrb1MydHJZRjE2b1ZCRUdMT3RYb3RORm9TSUVDU2pTcURuSCs0SU1QTURzN0N3Q0d4UmNBNVdMR1lqR2tVaWxNVFUzVnJGa0NBQ1ltSnZEUlJ4L2hvNDgrd29vVks3Qmx5eFpzM0xnUjBXaTBac2NnaEpCYWtFd21jZUhDUlp3NmRSSVhMMTVFSnBPcDZmNEZRVUJiVzF2Uit1Tm1jenRqc1JpZWZmWlpiY1pESThvVGFHQ0JxcXhac3daLy9NZC9qSTgvL2xoYlI3ZFFvdW9qMHJxNnVwQktwVEF6TTRPNXVibWFsdVBHalJ1NGNlTUczbnJyTGZUMzkyUGp4azNZdVBGQmRIWjIxZlE0aEJCU0tZbEVBdWZQWDhEWnMyZncxVmRmTFhxQXBSbVNKQ0VTaVNBY0RtdjFicW54Si9xb1UxMTFxSkZwZUlFQ3lweWg1NTkvSHV2V3JjT0JBd2ZLTGlYbDgvbmc5L3VSeVdRd05UVmxhVVdqY3NpeXJNbjBuWGQrZzc2K1BtemN1QkViTjI1RWIrK1NtaDJIRUVMTW1KbVp3Ymx6NTNEMjdGbGN2WHExNXBHbWl0ZnIxU0pPdFE0dFY1ZkdZakY4Kzl2Znh0S2xTeGZNMnlnMGhVQlZCZ1lHc0diTkdwdzZkUXJIamgwelBNSEZyR20zbzZNRDBXZ1UwOVBUbUo2ZVh2U29YVE51M3J5Sm16ZHY0djMzMzBkWFY1Y20wMlhMbHRmOFdJU1ExbVJ5Y2xLVDVqZmZmRk9YdWt6RjcvY2pHbzBpR0F3V0xYQ2pvaDlKR3d3RzhkaGpqMkhUcGswTk5jSzJFcHBLb0lBaXhzSEJRV3phdEFuSGpoM0Q2ZE9ueXpaYnFIMmtxa2duSnlmcmRzZDI5KzVkSERod0FBY09IRUEwR3NPR0RROWczYnAxV0wxNkRiemVwcnNVaEpBNk1qbzZpa3VYdnNMNTgrY1JqOGZyTHFad09JeG9OR3BZQktIY01iMWVMeDUrK0dFODhzZ2o4SHE5cmx6TGRyRTBiYTN0OS92eCtPT1A0OUZISDhWbm4zMkdDeGN1TERnaXJMMjlIZTN0N1ppWm1jSGs1R1JOQnh3Vk1qRXhqc09IRCtQdzRjUHdlRHhZdFdvVjFxNWRpN1ZyMTZHM2x5TjZDU0ZHWm1kbmNlWEtGVnk1b2l6ME1qVTFWZmRqcWdPRFlyRll4UklVUlJFYk5tekF0bTNiRmh5SjIrZzByVUJWUXFFUW5uMzJXUXdPRHVMUW9VTzRkdTFhMmZ6cUY2YTl2UjNKWkJKVFUxT1ltcHFxYTVOSU9wM08vV05jd2J2dnZvdjI5bllNREt6RjJyVUR1TysrK3hBSWNKRjdRbHFOYkRhTG9hRTRMbDlXcERrOFBHeWJqQUtCQUtMUktOcmEyclEwczJQcm0yUkZVY1I5OTkySEhUdDJhTnMxc3p5QkZoQ29Ta2RIQjE1NjZTV01qbzdpNE1HREdCNGVCbERjTjZySDUvT2h1N3NiM2QzZG1KbVp3Y1RFUk0xSDc1b3hPVG1KRXllTzQ4U0o0eEFFRWN1WEw4UEF3QUFHQnRaaStYTDJuUkxTckl5UGorUEtsY3U0Y3VVS3Z2NzZhOE00am5valNSS2kwU2lpMGFpMitBRlFla1N0bnY3K2Z1emF0UXZkM2QxTjJWUmJpcFlScU1xU0pVdncvZTkvSHpkdTNNQ0pFeWR3NDhZTjAya3YrdmY2cURTVlNtRnljaElURXhOMUdSSmVpQ3huRVkvSEVZL0g4ZkhISDhQdjkyUEZpcFZZdVZKNUxWMjZGSklrMWIwY2hKRGFrczFtY2Z2MmJRd054YlgvOGNVKzVhUmExQVZuWXJFWUlwRUlBQlFKc0hEZ2ovNzk4dVhMTVRnNGlPWExsN2VNTlBXMG5FQlZWQUdOajQvaitQSGp1SHo1Y2tWQzlIcTk2Tzd1Ums5UEQyWm1aakErUG83cDZXbmJ2anp6OC9PNGZQa1NMbDlXbnNQbjhYaXdiTmt5ckZ5NUVpdFdyTUR5NWYzdytYeTJsSVVRVWpuVDA5TVlHaHJDMEZBY1EwTkRHQmtac2ZRODQxcmc5L3ZSMGRHQldDd0dqOGVqU2JQVUUxTDBlRHdlREF3TVlNdVdMWWpGWWdDYXY2bTJGQzByVUpXT2pnN3MzcjBiVHo3NUpFNmZQbzJ6Wjg5aVptWm13YWdVQUNLUkNOcmEyclE1cFpPVGs5cTJkcEZPcDNIOStuVmN2MzRkZ1BMRlg3SmtDVmFzV0lFVksxYWd2MzlGMGNvZ2hKRDZrc2xrY1BQbVRRd1BEK1drT1dUNkpDazc4WHE5aUVhamlNVmlDSVZDVlRlMVJpSVJiTml3QVpzM2J5NjV2bTJyMGZJQ1ZRa0VBdGkyYlJ1MmJkdUdDeGN1NE5TcFU3aDc5MjVGMjZwelNqczdPNUhOWmpFMU5ZV0ppUWxNVFUzWi9nV1RaVm1iZS9yNTU1OERVSjVrczN6NWN2VDFMY1hTcFgzbzZlblZuZ0pQQ0ZrOEV4UGpHQjRld2ZEd0VJYUhoekU2T2xxMzZYRFY0UGY3RVl2RmlxU3BCZ1FMelV5UVpSazlQZjgvZSsvK0pNZDEzWGwrejdtWldlOStBR2dRalFZcGtxQWVGcVV3S1dzc2p4Z1RPNTdkbVBYOE1MOU1CSDdhSHpaaUl6YjJYOWlmTmhqclhZOGQ2L0hZanJGMzdMWERFeDdQemt4UVkwdld5NVJNU2lJdGNrMDkrQnFDSWtpQ0FnbDBBMmlndTdxcjY1R1o5NTZ6UDl6TTZxcnFOOUFOZ3NUOVJCUXFxN0lxSzZzQTFLZk91ZWVlTzRmUGYvN3p4ZUlabm50ZG5DWGhXM1FDSXNJdi9NSXY0RE9mK1F5V2xwYnd5aXV2NFAzMzN4LzdSMWV5WFZSYXluUjJkblpNcHV2cjYwZGF5YnNiS3lzcldGbFp3ZXV2dnc3QVY4dWRPSEVDcDA3TjQ5U3BVemgxNmhST25KaURNV0h4OEVCZ0w3SXN3N1ZyVjdHNHVGaGNyZ3g3Y2Q4TjFHcTE0WGRRclZZYmZ1OGNSSHJNalB2dnZ4Ky8rSXUvaUpNblQrNjZodWU5VEJEb0xzelB6Mk4rZmg3cjYrdDQvZlhYOGQ1Nzd4M29QOHBvWktxcVdGOWZSN3ZkeHRyYTJvZjY2MVJFY1AzNmRWeS9maDJ2dmZicThGem41dVp3NnRRcDNIZmZQRTZkdWcvSGp4L2ZzVUk1RUxoWHVIbnpKcGFXbHJDMDVJVjU0OGFOdTA0a2pVWUR4NDRkdyt6czdIRHU1WDdPY1RJS2JUUWFlT2loaC9ENXozOGU5WHI5S0UvNVkwRVE2RDVvdFZyNDhwZS9qSC80RDcrTUsxY3U0OEtGQzdoOCtUTHlQTjlYVkFyNFgzUXpNek9ZblowRmdMSEk5RTVNamRtTGNzem02dFdyQUY0QjRJc0ZUcHlZdzdGanM1aWRQVGI4TVRBOVBZTW9DcFcvZ1k4UHFvcE9wNE9WbFJXc3JxNWlkWFVWS3lzcnVIYnQ2aDJkU3JKZm1CbFRVMU9ZbVpuQnNXUEhob1dEdTYyN3VkUHRKRWx3K3ZScGZQS1RuOFQ4L0dtRTM4ejdKd2owZ0N3c0xHQmhZUUhPT2J6MzNudDQ1NTEzc0x5OGZLRDBMQkVOQi9NQmpFMk5XVnRiKzlBcTh5YXgxdUxxMVNWY3ZicTBaZC9VMUZTUkpqcUcyZGtaek16NDdWYXIrU0djYVNDd1B3YURBVlpYVjlGdXIyQjF0VDJVWmJ1OWVsZU1XZTVHczlrY1ZzNjJXcTJoQ0crbG1LZk1PRDM4OE1QNHhDYytFYWJDM1NKQm9MY0lNK1BzMmJONCtPR3p5TElVYjcvOU5uNys4NStqM1c3dk95b3RTWklFYzNOend4WFplNzBlMXRiVzBHNjNQOVN4MDkxWVgxL0grdm82TGwyNk5IWi9GRVhEU0h0bVpyWVFxeGRzbUY0VHVCTTQ1N0MrM3NicWFodnRkbnNveU5YVlZRd0dndy83OVBaTnBWSVpwbVhMNlNZQXRraHp1MktnbmU2Ym5aM0ZBdzg4Z0xObnp5S09reEJ0M2laQm9JZEFraVI0OU5GSDhkblBQb3BPWngzdnZQTU9QdmpnZzdIeDB2MUtsWWpRYURUUWJEWng1c3laNGRpcC94Sm83N3BVMjkyQXRSWTNidHpBalJzM3R1eXIxK3RGUmVCc0lka1pURS9QWUdwcUNrU2hnQ2x3TURZMk9taTMyeU1YLzMva3c2aCtQd3lpS0JvT2s4ek96bTZaYXJMYkQrbmRKTnBvTkxDd3NJQ3paOCtpMFdnR2FSNGlRYUNIVEt2Vnd1T1BQNDdISG5zY04yNHM0OUtsUzdoKy9mcSt4TGVkVkpsNVdGRkhSR1BwM3ZYMTlTUHYwM3VZOUhvOTlIcTlZUnZGa3RIeG5PbHBYM0kvTlRXTmVyMk9XcTJHU3FYeUlaMXg0TVBFV290K3Y0OSt2emNjM2lobHViYld2aU9kd0k2U0pFbUdRem16czdPWW1wb2E3cnVkT1paRWhIcTlqaE1uVHVEQkJ4L0U3T3l4SU0waklnajBDRGx4NGdTT0h6OEJRTkhyOVhEcDBpVmN1M1lOYTJ0ckVKRnRoYmxYcERxWjdpMkxIMGEvWUk1eUZabWpRRVNHWDR6YndjeW8xV29UbHpxcTFlcndkclZhWGxmdjhOa0hEa0tXWmVqMyt4Z01Cb1VjK3hnTStzUHRVcGo5ZnYrdXFRVTRETXFXZVdVNmRqTEN2SlVvYzdLUmU2dlZ3c21USi9IQUF3K2dWcXNCb0NET0l5WUk5QTVScjlmeG1jLzQrYVhPT1Z5NXNvaWxwVVdzcnE3ZTFoZkZhSFZ2S2RyQllEQ1cydnFvcHJSS1JBVGRiaGZkYm5mUHh4SVJLcFhLbUZScnRTcXFWUzlYZjUrL3JsU3FZZTdySVpDbUEvVDdnNkVVQjRQKzJMYmY1K1Y0dHhmcUhCWlJGQTFUc1pOam1Mdk55OXlyWW5ieU5hYW5wM0hxMUR4T255NTdZZ2RwM2ttQ1FEOEVqREZGcTcwelVQV05EcTVjdVl5Yk4xY3dHR3lkMG5MUW9xUmFyWVo2dlk2RmhRVVFFWnh6V0Z0Ykc0NmozaTFUWjQ0Q1ZjVmdNQ2lLUlZiM2ZIeVNKRU94K3V2cU1HMXNUQVJqR013TVpnTmpESmg1ZU8zdkl6Q2JZcHNCM1AzZlhpSUNFUWNSZ1hQajI2cHVlSisvRmpobmthWXArdjBCMG5Rd0pzWEJZUENSL25GMkdKU0xUWlRqbDhlT0hSdGJ6dXRXSzJXM28xcXRZbVptQmdzTEN5T3AyU0RORDRzZzBMc0EvNTl1RnFvK2VyeDgrUVBjdkxtQ2JuZmpVSDZ4RzJPR3k3SVJFWWdJMXRxeHNkUVB1MXZTaDBXV1pjaXk3TkQ2bEJMUmlHUk5JZUNkcjcySU54L1BUQ095SmdBMEpyeEo2Wlg3Tm1Ybkp1NXpFNUs4TnlMQW95SkprbUZyUEQ5bVAxMFV3ZEdocEdJbllXYlU2L1dpSGVjWlZLdlZvVFFESHo1Qm9IY1oxV29Wanp6eUNNNmVCUUJmZ1h2OStqTGE3VlgwZXIyeDlNOUJvdExKL2I1SndyaFVBWXlOcDVaanFoK2wwdjhQRzFXRmN5Nkk2aVBPYUZSWnBtQm5abVpRcTlXMmpTb1AycnhndDlldDFXcVlucDdHaVJNbk1EMDlqYzBJTTBqemJpTUk5QzZuMVpwQ3F6VUZRS0VLZEx0ZFhMOSt2UkJiLzFBanhyTEJ3L1QwOUZDcVJJUTBUWWN0Q01zeDFVNm5jMWQyYUFrRURrcWowY0RVMUJTbXA2ZUg0NWJUMDlNd3h1dzdxcnhWbUJsSmtxRFZtc0xKa3lmUmFEU0NMRDlDQklGK3hHZzBHbmp3d1FlSHQzdTlIcGFYbDdHK3ZvWit2ei8ySy9lZ1VlbE90eXVWQ2s2ZE9vWDUrZm14YURYUDg2Rk15eWsxWllPRmoxTUZaZUNqVHhuVmxTblg4cnJWYWcxRkNZd1grQncwcXR6djZpYVZTZ1d0MWhTT0h6OCt0dFJnNkR2OTBTTUk5Q05PclZiREF3ODhnREpDVGRNVXk4dlgwZWwwa0dYWmtZNXBKa2t5WEZ5OC9NL1A3S3RhKy8zK1VLYWpiUW83blU1SWJ3YU9oSExwcm5KdVpTbk02ZWxweEhHOG95UnZSNHE3VVQ0dlNTcG9OaHM0Y1dJT2xVb2xSSmdmSTRKQVAyWlVLaFVzTEp3WjNsWlZiR3hzWUcxdERkMXVGMW1XN2hxWjdqY3EzWWx5ZjcxZVI2UFJ3UHo4L0ZDcTVmTjZ2UjQyTmphR1UxTzYzUzQyTmphR2wxNnZkODlYZGdiR1llYmhBdmF0Vm11NDNXdzJoOXVqcTVDTWprMGU1Y0xQbzhWRElvSW9pbEdyMVliUjdlai9sUkJoZnZ3SUFyMEhLTDlrUnI5VXV0ME5ySyt2bzlmckljOHRpSFFvdXFPa25GQmVsdm1QanJXT2ZzR01pclhUNlF6bFdxYU11OTF1a096SGhMSUpRQ21keVV1ejJVUzlYdC9TUEgwblNlNDNsYnJUN2IwZVh4YUtNVE1xbGVyd1BNdC92MEdVOXc1Qm9QY29qVVlUamNhb1ZJRnUxd3RxTUJqQU9Rc2kybmFWaHR1dEFON3I4V1VGWkRrOW9MeHY5Q0lpWTkxc1JpKzlYbTk0UFhvSnFlTTdReFJGYURRYXd5eEV2VjRmdTVUZG8wYnZBN0N0RUcrMWdPZXdVckhPdWFKbElLRmFyYURSYUtMWmJBM25YUVpaM3RzRWdRYUdOQm9OTkJvTitPOFovMldUWlJtNjNTNzYvVDZzelNHaVlDWkVVZlNoZm5tVUtiMW1zN2x0Rkx2ZGZYbWVqd20xMys4UDMxdWFwc2p6ZkRndnRMeWRwdW53ZHBabEgvdW8xMGRWRlZRcUZTUkpzdU4xMlhDaWpBNUhMM0VjQTloK3JIRW5TWDZZbjZ1cXdsb0xheTFVRmNaRXFGUVMxT3VOa2RhUW9WbEJZQ3RCb0lGZGllTjQyT1M5bEtvcUlPTFE2M1hSN3crS2hjVUZ4aGdrU1RMOHRYK1lVZWxoSEtNVXdMRmp4L1lsM05HeDIvSXlLdGx5dTVScmVTbWJHWlRqWXR0ZE5oc2VqRzlQM3ZaZjZBWlJGTUVZTTlJRmlmZTFQWGxmK1JtVUlweVU0MjRWcWJ1bFRXOVhob2VSZHQzckdHV1hxcklKUFhOVVJKVjFHQk50RTFVR1l3WjJKd2cwY0V2NENMQ0ZScU9Gc2dMWW8rajEra2pUelRadlJJdzRqaERIOGJBZjZOM0FyVWcranVQaGp3UmdlOGtlVk1vN1BYNm5mZnRKZGU0bjZ0dnA4U1dITlczanFCNi9IVjZTUG52Z1hCbFJHbFFxNWNJRGplTFlRSWdxQTdmTDNmTnRGdmpZVURad0J6Qk1CNWZmZzNudUl6WnJjemduOEszdkNGRVVGNUZRUER6T2RvSTc3TWoyTUNMaG8rSld6dVdqSUxuYndWcUx3V0NBTkUyTFNGMUJCQmdUSVVsaXhIRmx1SWpBdUNDRExBT0hUeEJvNEk3aW85QlNrcnBGc0dtYUljdnlZcnhWUUFRd0d5UkpQRXc5M29scTRmMXkxTUxlNmZFZnBzUjI0M1lFWEtaWU44ZWtiZkZ2Z0liL0JxSW9CcEZCclZiSFpJdTcwZTFBNEU0UUJCcTRxekRHb0ZvMUFLcGJwZzVZSzdDMlYxUkd1dUZZSVJFSzBUS2lLRUlVUmNOQ0Z6OXhuUTVWY2dkOS9vZk5uWTR5UjZlYitGVmMraGdNL0RpeHRUbXNkVVhxV0tGS3c4YjZjUnloRkdBVUpZaWlaSGc4ZjMyQU54MEkzQUdDUUFNZk9YdzBZcllJdHNTTGRvQnUxeS9aSnVLRjZ4L2o1V1lNRDR0eXlpS2RLSW9ReHduaU9FYWw0Z3RzeW9yUzIrRk9wSkZ2VjVJN0lTTElzcXdZVnl5THAyd2hRZ3RyL1RRUDUyeFIrSVRpQjQzL2ZJbDRvamlIRVVVODl2N3VwaDhiZ2NCQkNBSU5mT3p4MFkxUCs0NU8wWEVPY000Q3NGQk5NWnBTSG4xc1dVMWJSa3pNWlZFUEQ5Y0w5Ukl1aFVFVFZiQ1R0ODNZODhycmNudTA0cGFJaW5VNng2dDZ5eFZmUnBjc2M4NUJkYnZsemdRaVdsVDF5akI2ZDg0T2wwSHp4OWJpdlcrbVJrY0ZPSDcvNUgzbGV5anVEVklNM0FNRWdRWUNlMUNPd1kyTzFaWXlLNXN6VEk3bFRqNTI4cjd0OTIrL3ZWTzBOcDdhM0c1NzUvM2JTZEZ2MDhUK1FDQ3dFM2VzR2tOVnczL0pRQ0FRQ0J3cGQ3S2c3bzRJbEVJK0p4QUlCQUozaUR2bG5DTVhhSkJuSUJBSUJPNDBkOEk5UnlyUUlNOUFJQkFJZkZnY3RZT09wSWdvaURNUUNBUUNkd09sai9RSUJrY1BQUUxkU1o1M1M2ZVVRQ0FRQ0h5czJkWkJSeEhZSGFwQWR6bkJFSkVHQW9GQTRFNXhSeVI2YUFMZDRjU291RUNEUkFPQlFDQnd4SXprT29mK0dlVXdKWG9vQXQxRm5wNXo1OEtnYUNBUUNBU09IQUtBYytkbzhxNnh4eHlTUkc5Ym9QdVI1em1FTWRCQUlCQUlIRDJxU3VlQU95TFIyeExvZnVXNXZMeE1vVnJFcDBZQUFDQUFTVVJCVkJOUklCQUlCTzRFeTh2TGQwU2l0eXpRZzhpejAra0VlUVlDZ1VEZ2p0RHBkT2hPU1BTV0JMcVhQTTlOeUhNd0dJUUlOQkFJQkFKSGpxclNZRENnVVltZU95S0pIbFlWN2xqa0NZekxNMDFUa2lEUVFDQVFDQnd4cWtwcG1vNUpGTUNla2VpdGNHQ0JibVBxWFNQUE5FM0puamxEQ0VWRWdVQWdFTGdEMkRObnRraDByMGowVnFMUUF3bDBOM251RkhuYU0yZG9QazFEQ2pjUUNBUUNSNDZxMG56aG5vTkdvZ2VWNkw0RnV1dUJkNGs4NTlPVXNpd2prU0RRUUNBUUNCd3RxcUFzeTNhVTZEYUZSV01jUktMN0V1aXVSVU03Vk51T3luTXdHTEFpQ0RRUUNBUUNSNHRDTVJnTWVGU2k1YjRkSkhyTFJVVzNXa1JVSEh4VG51V093V0JBNlFNUGpNblR6c3lRaWdTQkJnS0JRT0JvVVNVN00wT2pFazBmZUlBR2c4SFFRVU9KWW1lSjdvYzlCYnA3MGREbW5hT3AyelA5UG1WWlJubWVrNTJab2VaZ3dCSjY0UVlDZ1VEZ2lGRlZhaGFCVzU3bmxHVVpuZW4zeDFLNTVXTkhIWVpiR0ErOTlXa3N1eFFOZFRvZHp2T2MwbGFMbTRNQlo3VWFmL3ViMy96TGE5ZVcvK2RiZnIxQUlCQUlCSFpoZFhYdGYvM3VkNy83YjdKYWpadURBYWV0RnVkNVRwMU9oL2RaVkhRZ2RoWG96dEhuN2tWRFkvTE1hbHpMTXY3ZTkzN1VxOVlxajl6cWlRWUNnVUFnc0J0SkpmNzBONy81Zy9WYWxuR1dqVXQwMTZLaUhWSzVlMFdoQjRsQS9ZR2VmQkxuem8wWERZM0tzOXZ0Y3RwcThZeTFsR1Uxem1zWkR3YVJ5ZVBVMUdxMWYzU0Exd3NFQW9GQVlOOVVLNVYvbE1lcEdRd2lrOWU4Ukdlc3BiVFY0bTYzeTZNU0JVYUtpczRCZVBMSjhqQzNYNFc3bzNuZmVHUHNmajh3KzBtVVJVUE9IYU1aYXlsTlU4NXJHZGZ5bkYwbDUxLzQ5S2RyY1JSL2NiOG5GZ2dFQW9IQVFUREdQUEl2L3ZrL1ArVXFPZGZ5blBOYXhtbWE4b3kxNU55eDRmUVc0Sk1ZTFNvQ3NNVnRKYnRGb2RzS2RNZlU3WTd6UGZ2RGl0dTAyV2N2enhyWDhweXpLREpSRnBsLzhOaGo5eE1oT2NpSEVRZ0VBb0hBUVhqNEU1LzRaSlJGSm9zaTR5VmE0elJOT1czMnVhek10V2Y2ZTgwUDNWY3E5MEJGUkpQelBTZkhQZTNNREUxYlMzbXR4dFVzNHp4Sk9MRUoyeWd6czdPemN3Zi9LQUtCUUNBUTJELzFldjJralRLVDJJVHpKUEV1cXRWNDJsb3FLM04zVE9VZThMVzJDSFMzNkhQMHp0SFViYmZiWmVlT1VWazAxSENPOGtxRks5WnlIbVhHR0dNYTFYb1FhQ0FRQ0FTT2xFcGNPV21NTVhtVW1ZcTFuRmNxM0hDT3lxSWk1NDVST1I2NmJTcjNBRkhvdmlQUTNWSzN6amxxTnZ2c25LTzhsbkdlNTV5bnFjbWp5RVM1TWM1YUU4WG0yQzE4Rm9GQUlCQUk3SnNvTmllY3RTYktqY21qeU9ScGF2SmlQSFRVVmJ1bWN2ZkpYZ0xkY1o3TVpPcldGcW5iY3R3enNRazdhOW5GamcyenlmSThQY0I1QlFLQlFDQndZUEk4N3h0bTQyTEh6bHBPYk1LajQ2RjJtMVR1bG9QczB1WnZsREdCN2pSUXVsMzBPVmwxbTJWKzNOUFZhcFJZeXk2eGJJd3hodjNWK3NiR3hpMStIb0ZBSUJBSTdJdHV2NzgyNmg2WFdFNnNaVmVyVVRYYm5Ob3lXcFc3M3loMDBwRzdSYURiUnAvcGlMRjk5SmxUbXFZc1RVY2lRbm1hR3BjazdGTzN4ampMeGxvMjdaVzF6bTE4Sm9GQUlCQUk3RW0zMDEyM2xvMnpiSncxZmhneFNUaFBVeU1pSkUxSGFacXluY2twejNNQ050Y1BIVHZRUHFMUWZZMkJqa2FmQU1ibWZEWUhBM2JOSm8xVzNXNm1ibk5EbEVkTWVYVCt6WjlkdjdXUEl4QUlCQUtCL2ZIK0I1ZXZNdVVSVVI0WnpzZFN1V1ZWcm1zMnFTd28ycHdiNm90ang5cjg3Y0ZRb051bWI0dDVuNk9NUnA5cFdUaVVaWnpudnVwMk5IWHJqREdPMlRobTgvcGJiM1RUTkh2LzFqK1dRQ0FRQ0FSMlJrUzZmL085djcxY2VzZE5wSElyMW5LZVZ6alBmRUZSMnV6emFCUTZlcXlkMWcwZGRlVk9FU2lWQjlodDdIUGFXbkxOSmpXY0k2azVzamJoMk1Zc3pyR3oxckMxeGpnMmJDbGlJdE5lWDN2anNENm9RQ0FRQ0FSRzJkalllTk5aUzJ3cDh1Nnh4bGxyeERtT2JjeldKaXcxUnczbnlEV2IzbUg3R3dzOWFDT0ZKN2ZjTXpuMnVWMzA2V0xMVVJSeEZFVnNtQTJ6TTh6T2tLUG9nOHVYWDcrOWp5Y1FDQVFDZ2UyNWZ1UEdHK1FvS3Ixam1FM3BJeGQ3UjAxR29aTmpvVnVQK3VTT3I4ZkFUdW5iemI2QVpmUUpBS09WdDg3dEhIMWF5MGJFc0RBYlIyUWNJWHJxcWIvOCs5emF0ZHY4akFLQlFDQVFHRU5WODY5LzQxdlBPRUxraUl5d2Q1QXZLTm9oQ25WTkdxM0lCWHloN0ZoemhYTmJlK1NXenR3dUFoMWJ0WHR6OFZIZmRhaU1QcTIxVkZiZXVtMmpUK3VqVDBlR0hFVUVGNjJ1cjh2Rml4ZS9jN2dmV3lBUUNBVHVkUmFYbHA1Lzg4TGJIWUtMeUZIRWpvb28xRzZKUXAyMVhGYmsrbm1oK1hCZUtQQkpBSnZ0L1VaZVl2K2RpTFlXRDIxMkhYTFcrbXZuS0U4U3JrcVZWSVEybzAvcm8wL0h4cEdMbU1rd3N5RWk4NS8vNnErZUVaSHNVRDZ4UUNBUUNBUUEvZFozdnZNM1JONDF6R1FjdVVoY0dZVnVqb1dxQ0ZXbFNubVNjT214MG1sbGQ2TFJBKy9XbVdqWElxS1NzZmt4YzNNb2k0ZHFlYzRxUWk2eEhMdVlJeGV4U01TUk1leHowR1RJa1JFU0l3NFJrVVJYUGxnYy9QelMreS9jOHNjVUNBUUNnY0FJVjY5ZmYrM0hQMzc1T3BGRTRoQUppU0ZIeGdkdnprVEdlRGU1aUdNWHMwc3Nxd2pWOHB6TFlpTE1iYlpyM3pJbjlHQkZST2NtNW42T3BHOXpYendrenBGek5hcUsrRFJ1N0ZnaXg4WTRGaEVXTWV6SUdUWEs1Q2dpb2tLaVpMNys3VzkvVDFYMXNENjhRQ0FRQ055N2ZPOEh6LzN0cUdQSVVhUkcyWkh6MlZBUjc2YklzWXNkaXdoVlJjaTVXdUV5UnpZZlQrT096d25kUGc2ZEZLaWZ2akx4Mk5HUTFsbExBREJlUE9SdHJocVRpR0V4aG9XZE1XcVlpWXd3R1NJeHhHU0VFTDN4eHZuMmxjWEYvM3FZSDJBZ0VBZ0U3ajFXVmxZdmZlLzdQM2hmQ0JFVnJoRW13MFRHcUhlUkdNTWlobFZqVWhHS3JSMHJKZ0kyM1FhTU93OFljK0srVy9rQjJBeGx5K3JiNHdDY2E1SnpqbFNFdENxa2xRcEZMdUlvRW82TXNCRmhJOHhDem9pUVlWWldKVU5FaGtTTUVwbHZmUHZwNTBSVWJ1K2pDd1FDZ2NDOXpIZWZmZlpaTGR4Q1JFYlZPMGVFakpBelJUa3VSMGE4bzF6RVdxbDRkNGtVOVR6TndtM2oxYmg3dlRadm5jTHk1SllIUFZoY1QxYmZqbDQwVVhMT3NhcjZLSlNGUlptWmxWVzhQRlhVU3hTSWZ2clRWNjQ5LzhNZlBuT2JuMTBnRUFnRTdsRmVmdlhWRjU5NTlnZnZFWHpxdG5TTUZvR2JLSHNYaVdIVndsR0pidkhYYURVdXNPbThjWjRjdTBWRXRDVUNQVGN4L3hQNEpOSmkvQk1BaGxWTHJrYWoxYmZpSEpjcFhEWENSZzBiOGI4Q2lJUlZsWWxnbE1pUXFsRlM4eC8rMDM5KytkMkw3MTA0dkk4ekVBZ0VBdmNDUzFldlh2N2pQLzJ6djFQU3dpbGtpR0M4YTRSRnlCaFJOdXFkVktad2g3NHFxbkdkcXcxbmxRQkZtOXB0RnRzK3Q4MTgwRzFUdUdQelB6KzVlZjlvamxocVBncE5wRUtxQ2FuR3BDcWtrWklSOFlWRUxNemkwN2RLWkNKajZpUnFsSWlMVUp2L3piLzl0OTl2dDl2dFEvdFVBNEZBSVBDeHB0ZnY5Lzd3ai83NHU5WUtFWkYzaXFoUlZkWXlqU3RhUko5K1dGRWo5WTdTbUZRVFNxVGlvOCthMjFMakEyRG92dDJheTQ4S2ROc0gySDUvR0hrZUw2NmxNRFhxZ0twUUhBdkZzVkk1L3FscUNFWkpsVmxaV0VXWlZKbU1TUjVZbUQvSHpEWC9LMEZOcDl0MWYvUW5mL2E5UE0vdDdYMmtnVUFnRVBpNG82cjY3Ly9EZi96QjB2WHJBNkpDbXFwUmE2cjVnQkl6cWJLS2V2Y29zM2VSb1hJY05JNlY0bGhJVlFoMWY4eXlFcmQwSExEcHZtM1lzNW44R0g1UXRaZ2pNejJORmdBVlB3QXJpUkFBaUFpcEtxbEdWSTUvR2dNQ0RMRmhVbExPMDZ3bkt2bloreGYrbDJhOWZsS1ZtRlROaFhmZjZYemxxMS83OFMxK25vRkFJQkM0Ui9qYlo3Ly8ra3MvK2NreXFScFY0aVNPR3cvZmYrWi9nQ3F6S2lzcHMyRUNEQmtES3NkQlZTUHlOVHFGc3hMdk1CV2hGZ0JNVHhldk1JZXlrR2d2SmdUNjVLNFB0dGFTdVBFQ0lnRHc0dlFYcUJJQU1nclNJcFdycWd3d0tSTXYzMXg1bnBsbkYrNmIreDlQSEp0K1ZJbEpvZnpkWjU2OS9OS1BmL0xlUVQ3SVFDQVFDTnc3dlAzT3UxZi8wMWUrY2tHaHJNVFVhdFVYSGx5WS81OVUxWFU2RzR2SzVGMmo2dDBqd2taQkFBZ2pubEx2S1l3VkVqbGZTTFQ3R1R3NWRvdDMyVGZSZ1doOFh4SDVlbmtXSWdWaWFLUmtDcEZxOFFzQUNtSlJob0lHdWQzb0RkSlhpQ2crTVR2ejM5MS82dVIvRTVHSkFLWC81OC8rM1pzdnYvcmE0ajQreDBBZ0VBamNRN3h6OGVMTjMvMkRQM3hGVllpVjZOVHhZNDh0bkp6N0Y4emN2SDV6OWZ2S1BPWWFZMEFLUTFEdkpJMlVnQmhBa1VFdEpGcWZmS0VSMTIyWnl2TGsrRVAzbGNJRkFGdFU0WTZ5S1U3QUQ4eHFjVHVDbW5MYlFObHZLN3hZYjZ5dXZxQ0FBNEJHcmZhcEIrOC8vV3ZWU20zS09ZZmYvOFAvKzgzdlAvZjg1ZjJlVnlBUUNBUSszcnp5MnV2THYvV3YvdldyL1g1Zm9paXVmT0xNL0svT1RMWCtBUUR1OVFkdjlOUEJUUiswRmE1aEpjQUFRT0dpeUcrcmttcTg2YTBSaDVWczU3cWQyRk9nZHB2SnBNN1ZOdE8zSXliZlBNSGk5c2kyUW9tTFVMby9TRHU5ZnY5OCtadzRpbVkrY2ZxK1h6MHhPL3NnQ1BUdi91SXZMbjN0Njk5NFAvVDZDd1FDZ1h1YjUvL3VoOWQrN3cvKzRJSjFGczE2L2RoREM2Zi8yMnFsY2hvQVZOVmRXMWw1c2ZBTXNXSlRvcHREaXVOZXduam1WSXFXZnBPdnU1MzdKaGtUNkpPMzh5NEIrQkI1MjVlaFNWVXZMZDk4M2pucGxMZUpLRG94Ty8zWmh4Wk8vMUsxVXEzOTFkZS9jZjNQLytJL2ZPQ2NDeDROQkFLQmU1Qy8vdWEzbHY3MHovLzlCMHpHbkQ0NTkra3pwMDcraWpGY0svZDNlcjFYQjJuV0dYc1NBd0J2NjZLZEhiVS9ucHk0dmU4VTdpRXdkdUs1dFlPbEc4dFBxNm9idmIrU0pOT2ZPSDNxc2JsanMvUGZlKzc1OWgvODBSOWZ6cklzdFB3TEJBS0Jld1FSd1ovL3YvOXg2Yjk4OVd2TFU4M216TVAzbi83Q1ZLT3hNUHFZTk1zV2w1WnZ2TFROMDI5TGtnZmhVQVZLbG5hSUZnVVFiTm0zc1RHNGZyTzk5dUtXNHhEeDhabnBoWWZPblA3a0crZlAyLy9yZDM5dnNkdnJCWWtHQW9IQXg1dzh6L1VQLy9oUGxuN3czUE1iOTUrNjd4T25UNTU0eEJpVGpEN0dPdGQ1LytyVjc2bkRWaThJRk52Y0Rlem1xRnRqenhSdVZLbHMrNExNckFCQXpFbzBmbEtUdHdFdlR5RW9BQ1VpSlNVRkJNdXI3UXNidmQ2NzI3MUdFc2ZWVDV5ZWY2aTlzdEw0UDM3anQ2NisvOEhsc0JCM0lCQUlmRXk1Y2VPbS9jM2YvcDJyYjc5OXdUeDA1dlRaUnIwMlBma1lVYlZYcmwxLzNscEpBUUVwbFE3U3dqRUFzS3VUaUVpcGNGanBza20yYzkrVEU3ZjNIWUZHY1R3OG1ESDlvVHczVHlqM1lpUlN3SUljS1lpVVNKU0VsT0F2SUZKQktWSW9BYnAwZGZtbExNOVhkM3J0MmFuV2JDWG11ZC82N2QvdWZPUGJmN01oRW9MUlFDQVErRGp4M04vOXNQZS8vZSsvZmpQdGQyZnZPMzdzSkROdjV5ZTlkdVBtUzROK3VrcUZRd0I0cDlDbVowaThlMENrNUFvbkZYNGl5amU5VlRpc2RCb3c3cnE5MkhVZWFHV0g2Qk1BZXVVSmpKZ2M4Q0d5bzBLZWNBb0g5VE5CL1lVZ0NoRUZxUXBJUUZBTHVDdlhycjhvSWp0R21IRVV4Zk56SjQ2LzhNTy9pMy85WC83bStyWHIxOTFPancwRUFvSEFSNE8xdFhYNTdkLzcvYld2L2ZWZjYvemM4Wk8xU3FXNjAyTlgxOWJmV3V0c0xBcVJnbEE0UkJVaTNpMGpyb0dEZHhCNUo0Mm1iMGN6cDcyZFhnemJPUERKOGYzN0h3TmRCcUlvVWpaR21YbDRHWjRRa1JKWlJSRktPL0svQ0pSWkNLUkNLaEJSVVJJaUVpS0kvNTJnUWxBWjVQbkc1V3ZYWDNTN1NCUUE2dFZxaGNWTi9hdmYrZGYyVzA4L25hbUdJdDFBSUJENEtQTDNQL3B4OXV1LzhSdURibnQxYW5hcTFkaTZ2T1ltRzczZWxXczNiMTVRZ2hEVXUwTUxseENKS0huSGtBckJ1OGZMMDBlcEtCdzFtczRkZFJrYm8xRVVLWmIzZi80SGFPVlhISFZ0YmZ3QW1UYzVGMFluc2tyT2g4OGlKSUJUSVJGU0VxVkNua3Fpb2tLa29xQ2hTUHY5d2VvSFM5ZitQK3ZjWUs4VGI5WnJsYjkvOGNYNC8vek4zOHlXYjl3SUZnMEVBb0dQQ04xdVYzL25kMzh2KytiWHZ4NU5OZXAxNXUybm5aUzBPNTFMbDY4dXYwYWdvVGdWNUIwaXBVZ0x4eWlKa0hqM0NBbVJGRTZ5WTY3aWJHTHNjK2kyM1F6NjVOaXRVWUh1S0tFa1NkUVlvemNCR0dPMGE0d1NzOUtBbFlnMXoxbnpuRFFuVWt1a3pDTGtTSWhZaUhuNDVvaFVTRlNVVklqWnFaSVExQ21wSXlLblVOZFAwODZseGNVZjVibnQ3dmFCQW40MWNKZGx5ZS8vL3UvanFhLzhGeGVpMFVBZ0VMaTcrZHRubm5ILzhqZC9TenRyN1NTS3pKNVowQnVyN1hldkx0OTRXNkdpS0Z6aEEwdnZFR2FuaFZ1SWRCaWtFYk4za0NOaEZySGtIWlhucEhudTNVVURWbUxXcmpGamprdVNaRGVaYkk2WGJyZDNibTVPQWIrZ2RuUzVwcGp6SFJsTUZDblNGQURnVTdta0dRK1U0SXVCeUNVQ0ZiRkdOR0lXWlJFUkVpWVJGWWgvNHlTazRrUlZtTWdwc1lOQUZDcWs1RURxY3V0NlAxOWMrdWtEOC9jOVZrbVMxbDRmc0dHbS8vcjZhK2JOOCtmbG4vMnpYNk12ZmVsTGQyd2VVQ0FRQ0FUMjVxMExGL1FyWC9tS3BvT0IyWWMzb2FwNjdjYk5DKzNPeGlLSUhLazZVbklLQ0pSRW1SeEJuWWdLQTA2SmhSUk9mYk5jdnlRMWl4QllMS215WXdHeGdESUZvQmxCRTFSVkRTbXNYMDNUUk5HbUhDL1hGQldnMVdwcDZjUkpETVlubmRMNTg0L1NvNDhDdlY2UFJBUnB1a2lOUm9NQUlJc2lyb3FReERIRmd3RU4ySEVCK1lvcFp3aGlTQXdYUzVvWkpqRlFabUl5UWhxeHdpaVJZV2FqcW9ZQUF3WVRpSlZnQUdZQVJoVlk3M1JYYXJYS1ZCeEZPdzRxajMvZ1FoY3VYS0FmdnZDQzF1dDFuRDU5ZXBoU0p5THN0ajE2T3hDNG14ajlON25kdHIvYWJudm4vWnVIb1gzdUgzL3NkdnUzUDgrOTl1OTBudnQ3bnp1LzkxdC9uOXVkKzBIZTg5M3hQc2VmdC8vM3NmZmYxMEc1ZVBFaS91UlAvMVIrL0tNZnNkdHp0Uk9QaUxqRjY4cy9XOS9vM1FCUkRzQUNuSUdRRXlnRGEwYUtYRlZ6WnM0VnlFaVJDMnZPeEprcTVVUmlSVGxYRXN1T0xaRjFST0xZR0V2TURrU1NJNWNrejBXVFJCSlZ5YUpJYTZwaWpFR3Y5NEUybTAydFZDcG9OQnA0NmlrQU9EOTJucEdxNnZqQTdWTUtuQnQ3azB1VmloN1BNb3Jhc2FJNkFHOFlSVFF5QUV1a1VGVTJSbFJFVkoyUUdGRVdVV1hIVkVhaTdKVEZrWkJUcUNWbXB5S080RU55VlhWTWNLcHFRVENpbW4yd2RQMzg2Wk1uUHQxcTFJL3Y5eThzUzFQNjY2OTlEZDk1K21uOXRWLzdOZnFsWC9vbEdHUDIrL1JBSUJBSTNDYnZ2UE1PdnZyVnIrbnE2Z3JoSUF1WE9KZGZ2bnI5clVHYXJZRmdRZXFnYW9uZ1JOV0I0SXBJMC9taFFMV2tjTXJxV05sbk4xbEZDdmVRc0lEZGNFaFJpMTRFVUZVRkZDTGVhUWxRT202cFV0R3Q2ZG1ueHFKUVZkM21NUk5VS2hXMUFDVkpvbm0rb2xGVTB5eGJBM095T1E3S3BCbjV6cjBBQ3lJVnFJZ1JGckQ0TjhMaVZHRVZiTUhpVk1nQmFwWFpRc1ZDeWJLeVZhZ0IySkNxVVpCUkZYdmw2dlczajgxT2I4ek56dHhQUlB2K2l4Z01CdlRWcjM0VmYvUDAwL2p2LytrL3hSZS8rRVZFMFo1dk9SQUlCQUszeUZ0dnZZV3ZmK01iV0xsNUV6aGdXNzErbW00c1hsKyttR2UyQjRJRHlKR3FWYkJWMWRJUi9zSnNvV3BWNGNEcUZHd0J0Y3pxUk5sUklVL0g0bE8zbGdTT1ZFR2FLQ21KS2xWUnpDWlpReFRWMVpnVlRaS0dBcnRQNHl5WnRJa0NvS2NBL09QUkI0Mk1nN2FqU0d0RklWSFNOOHFtcjNrVUNRTkNxZ0pBNEZTZ2tZZ1JaNVNkc2pvVmRrcmlmem1BTFVPc2dpd0RWcFd0a2xxd1dpaU1raG9vREtBR3ZnMDlyN1RYcm5aNy9lN3BrM01QVlpLNGhnTXc2UGZ4dGE5OURVOS81enY0SjcvNnEvaVZYL2tWVkNxVmd4d2lFQWdFQWp1Z3FuanR0ZGZ3OU5OUFkyVmw1VmFlcnpmYmExZHZyTGF2QXNoODVBa3ZTTUFxcVNXRlZWYXJDa3ZLbGdsV0FjdFFLOHEyTEVpRnNtTldSOExPc1RnLzlta0ZUQUpBbEVoeVFHSnJWZnMxN1ZaVnE4Wm9PNHEwdEVJNS9sbnkxTWlwanA3Mzl1SFlVMDloN3R5NVlTRVI4RGFXS21mMGVKYXBpMk0xUmNXU01YM05va2dNTXpPUlFGVUlFS2c2VlhGUTQwVEVLY1JCMlJJNGdxcGw4cjhlVk5RQ2FoVmtmVDhGeWhWcUNPVGxDV0pWTUtCTVlCcGtXZmZuVnhZdm5EdytlM3AyYW1wdTIzUGZoVUcvajI5OTYxdDQ5dGxuOGNRVFQrQkxYL29TWm1abURucVlRQ0FRQ0FDdzF1TGxsMS9HTTg4OGc5WFZIWnZKN1VxYTVlblM4dklIZ3pUYlVNQVN5Q3A4VnBLQUhORGlQclVFeXFsd1JoRjlXakJiTHJZSlBxV3JJbzZFbldIallKd2pNZzVFb29DQVNFUlZzeWlTQkgwMXBxckdHSTNpV09NNFZwKytmUnRBWmJPQTZLbW50ajMzbmZLWmlpTDBybGFyQ2dDMkRNV1hsN0hXYkdwdFkwTzdTYUxKU0JvMzU5UUxGQkJvSkloRVFPcFlqRk1XQnlXcnJBWktWdFgvY2xCUURvYUJrZ0dJR1dyVTU4dTlQQW5NOEd1OE1VQ3FTdGR1ckZ6WjZQVzc4M01uemtUR0hEZ25PeGdNOE13enorRFpaNS9GNXo3M09Uenh4Qk40NUpGSERucVlRQ0FRdUNkWlhWM0ZpeSsraUJkZmZCR0R3WjdUOW5jK3p0cjZ5dldWMWF1cW1nR3dET1FLdFF6a0F1U3FzRVRJQWVSK0grVUFjakJ5S0hJZmZaSUZmSFJLU3BaWUhZbHhZc1E1RW9FdElsQkFGSkJZS3NQMGJaZFpLeHNidWxhdmEyVjVHYWo2ZXRWS3BhS2wrd3EyNzVlNzB4dmJrc2F0MVRSSlU4M3pYRTBVcVRGRzR5UVI3aEpIY1NvcHN6Q1pNZ0lWZ2pnVmRWRGoxS2hWVVFOVncyU01xbGd3Y2xVWUJZei9ZRkJXNWVZQUdDQUdTbm1DQVNvWFNpVUEyT2oyMTk1THJ3em01MDRzTk92MVBhZTZiSWVxNHZYWFg4ZnJyNytPKys2N0QwODg4UVMrK01Vdmh2UnVJQkFJVEtDcStOblBmb1lYWG5nQmI3NzVKbTVuM24xdWJiNjBmR09wMXg5MENrbGFlQStVbWNpaFJGRktFOGhWMVZJaFU0Ri9EZ2c1QkpiSldGR3hnRm9ZdGV6WWdad2pRMDdCVWthZ09lZFNFUkh0VnpSdXNCam5oazVMa2tTaldtM3NqVzBmZTNyMmpONWFyWllPQmdQQzIyOWo2VXlSeG0zSGFxcEduVEVheDMxSm80Z01zL0NBSktPQk1KRURFb2FLUTZRT3FvN1ZPQlFpOVlQQlpOUi9LQVkrNGpRZ1lsWDEwYWVYSjROQTBKRWFhLzhuRVFCckJaZXZYbjkvcHRVNk5uZHM1cVM1alZMYmE5ZXU0Uy8vOGkveHpXOStFNy84eTcrTUwzLzV5NWliTzNDV09CQUlCRDVXOUhvOS9PaEhQOElQZi9qRFd4cmZuR1I5WTJQOTZvMlZheUtTRFNOTWdvVmlLRXFBTWhCeVZpOVI4bkxOUVpSQmRlUnh5RmxoUmRWQzFiS0JoVE5PVkp3YU9GampRT3lBekltcUpGb1ZxcXFrSWxKQkttcHFQbjNiampXdUZ1bmJ0OThHS2o1OXU5ZDdpUUEvZ0RzeWxjV25iNTk2Vk9mT3ZZSGw1V1dhVE9NYXM2SnJVVTJiWlJxM2J6U0tVMGtqRmtPUkk0Q2hWZ2dZaTBLaHlnb3liSkJEd2Fvd29ETGloR0VJQThRcVJHVmpmZld1SEwwQUFFSDlIQ2hWb04zcHJLeDNlNTI1MmVtNW1hbld6Rzc5RlBjaVRWTTgvL3p6ZVA3NTUvR3BUMzBLVHp6eEJEN3ptYzlnKzRVQkFvRkE0T1BKQng5OGdCZGVlQUV2di93eWJORm80SFlZcE9uZytzMlY1ZDRnNndMcWh2SlUyTUlEWXhjRmNpTE5DSlJCS0NOQ1JwRE5OTzVJaXBjTmNsRmZkQVNEaWVoVEJENDc2bkxOcFpLSmFGN3h4VU1iRzdwV3FXamRyQ2dRQXhoUDMvcnh6MGUxaUVPSFF0VWkvTjRsQW4wU3dMbXhlNkxMbHpVcE9qS1lLRkpqcmNaSklySHIwNENab3lnYWlVSXJEZ0FUQ25HcU1tRFlxQmdsR0Q5ZEJUa0RyQ0lNSW9hQWxjQ0FzSUs0YkhHZ3BINmxON0IvRDV1L0M4cllWRVdjWHJ0NTg5cksrbnI3NUxGamM2MUd2WG5MZjlNRkZ5NWN3SVVMRjlCcXRmRDQ0NC9qOGNlL2dJV0YwN2Q3MkVBZ0VMZ3I2WGE3ZVBYVlYvRGpILzhZbHk5ZlBwUmo1dGJhNVpYVm0rdmQ3anBVSGVESExNdTBMUUFMUllZeThvVGtJUExpQkRJRjhsS2NKTWhCeUZRa1p5SS9UZ3ExQkZpamFoMFpDM1VXU2hhSXJDZzVBRTQwSFVhZkEydTFHcWVpU1cyWXZvM2oyS2R2TDE5V2JCbkNlM0xIOTdackN2Y3BBT2NtV2hodE5sVm82MXF6dVJtRkRpS0pKS1V5Q21VUzhwR29zcXE2NGtQaVl0eXpHT1BVaVdzdytWYjVmaVZSVW1LVm9rMFFGZlZKaFVRTGNSWi9LQUVLc09hNTFTdlhyaS9XcTlYbXlSUEhqbGVUNUxZSE5EdWREcDU3N2prODk5eHpPSFhxRkw3d2hTL2dzY2Nldy9UMGxyVmVBNEZBNENPRnRSYm56NS9IVDMvNlU3ejExZ1dJSE01S2tTSWlOOWZXMml2dDlUWDFhVmVIWXE2bXI3WWRHY01jbGFjWFp3NlZURUE1S1dVZ1pFU1VlZEZTRG1nK2VxM1FIQXBydEpqK1lzUVJrUU9SVThDUlJxUFJwM1NyZGhoOVZ0cHRSYldLcFVwRkcwWDBXVmJmN2piK0NZd0lkUHMwN2xPS2MrTmRpYUxMTlUzbVJvcUpScUxRTklySURGaVlCNUl6RjJPaFlBS3Nhc1FFdFJxQlZUYkhPVUh3Y2lTUUFNUlNDbE44endRRlNNa1BXQlBCSjIyMWVIcnBULzhvTDFoU1ZXaHZNT2hjdXJ6WW0ybzFwK2VPelI2TERxa1YwZFdyVi9HdGIzMEwzLzcydDNIMjdGazgvdmdYOFBuUGZ3NUpraHpHNFFPQlFPRElVVlZjdkhnUnI3enlNbDU3N1RXa1JZL3pRemsyZ0xYMVRtZDV0YjBpenVVS09GVTRIM0dLQXpnSGREUDZISXF6a0tNaUkxQUtJQ09pRkNvWlFCbEVNaUdmeWkzR1NETXRVNzZxRmhIbGNHcFZqU095Vm56ZzVrUlZZaEVocVVwYUxjWStSNkxQWWZIUXhOeFBBTUJUdys1RFc5SzN3RDZLaUNhajBEUjltNFp6UWllajBMN1JMRTRsamhJWEVWR2VFUkcwbU1lcEZqRklSWDI2VmtFR3hJQVFRT3d0V1l4M2xpSVgzNEVlVUxDL1VtVXRpbkZIUlNycWI1T0NFTEg2blFyU3RZMk5kbWVqdTNGOGRtWjJkcW8xdGNNcTV3ZEdWZkhPTys4VTdhcitDcC83M09mdzJHT1A0NUZIem9ieDBrQWdjRmR5N2RvMXZQTEt5M2o1NVpleE5yRTA1V0hRN2ZmNzEyK3VyS1paUGlnN0NRSHFHTEJLS0ZLclVzaVQ3Wmc0Q1JtSkY2TkFNd0FaaVdRZ1NyRVpmV1lnelh6QmtlUUdQbzBMb2x5OVJLM21ha1dOQThncHlNV0pPcWZxY3B0SjNCOGYrNnkwMnhwWHE4TzVuOVhxOUw2alQyQjNnVzRiaFZZcUZjWGxHcEs1VkFFSWFqVVlheW51SnhJbmZaSW9JcE5sbERFTG15SUtWV1ZMUkJCbEFtemtLMjJMNlNsRkJPcVV3RUlBRVltUWVna1JxUlplTGZ3b0RHVUZBYXBEa1pKZ0dJbENsWWJib29DSXFpNnZyTjVjYWErdHpVNVBUYzlNdFZxSEZaRUNRSjduZVBsbC80K3kyV3ppczUvOUxCNTk5RkU4L1BERFlBNDllQU9Cd0lmSGpSczNjUDc4RzNqdHRkZXd1TGg0SksreDBldjNWOXByYTczQm9BK2ZDblJGbXRZQmNPckhPNHRMV1FUa20rZFFFVWw2ZVJiUkpwQ1JxaGNuVVNsU3Y5K1JyOGFGcjhZMVJRUnFpYXlJT0VSa0kxVUhJaWVxa3VjaWlZaElra2lNVkxSZkU1TTRyZFJxVXJWV3l1aHpTK3UrYmFMUFNjWUV1cld4ZkhFY2JCK0Z6Z1BJVjFaMG85V1NtdHVnUVZLVFpEQ2dMSW9vaWlLWERZZ01wOFJFWkZTcHRHMzBuQUFBSUFCSlJFRlV5SGtURUZGaFA5YXl1cFpBSkFSaC8vb3Nna0tpSUZVb3M2cEMvUTFWVXZJaEtNUFBQWlZOYVJJZ0NoSkFJZ2FKRDFWSm5CTzVzZHBldWJtNnRqWXoxV29kbTU2YWl1UERiWTY3c2JHQmwxNTZDUys5OUJLcTFTbysvZW5QNE5GSFA0dFBmZXBUaUtMNE1GOHFFQWdFdHFDcXVITGxDdDU4ODAyY1AzOGUxNjlmUDZyWDBmV05idTltZTIwdHkvSU1CSUhDZ1VhaVRwK3l0WVNpYTVENmNVL2lZbHFLSUNkRnJxU1pGcWxaR2hNbXBlUlR0NmtYS1RLUUx6alNjbnFMd2hKRnVWSHJHeXFvT2dXc2lEZ25GWmRVMVdYV1NwSmxNcWhXSlhZYnVsRnRTR1ZsUlpORzQwRFJwMDVNZnQyZlBKNTZWSEh1allrbzlESXdOMGR4SEt0cngxcHBWZ1Q5UHZwSlFza2dva3hTaXBQSU1jWEVHVkZPOE1WQjBPSzZ1RTBFaFJSMVJBbzRJUlJyeGRHbVJJZlNCRU9oVUNGbzBiUkJBZlppTFVRSlFBQXRKODVHL243eEs1Z0RJbEJaWFY5dnI2NnZkNmFhamNheG1lbXA2aEVNWWc0R0E3ejY2aXQ0OWRWWEVNY3hIbm5razNqMDBjL2kwNS8rTktyVkE3WHpEUVFDZ1IwUkViejMzbnM0Zi81Ti9PeG5ieDVKZXJiRWljaGFwOU5kYWE5M3JITTVmSVRwcHkwQ2ppQkYraFFXNUZ2dWxaVzNvR0xzVXltbm90cld6L1Awa1NZRUdhRFpST1RwSTFFbkdaaUtOSzVrUkpTVkVoV0ZCU0xmNGcrd3NjSkpvbzdWdVN5ekV1Y1Y2VmRKcXYyK1ZDb1Z5WXQ1bjRDZlhiSTEraHhPWGRtVnZRUmF0UFI3RWsvaDNMWVZ1Zk1BOG54RjIxRkxtOWJxWkNvM2p5TEhFWkVoSXB2N2JrSTBNcTlUTFFBREFod0Joa0FnT0lFVUVtVlJCYXNQV0VuVjY1T1V1TmlHbitPQ3NvVWdWQVFROHIrR1JBSHg5VWthTWNyYkVBQ0dBRm5mNkhiV043cmRScjFXUHo0elBWV3ZWbytrRFZHZTUzanp6Zk40ODgzek1NYmd3UWNmS21UNkdiUmF0OVJJS1JBSTNNUGtlWTUzM25rYmI3NzVKdDU2NnkzMCsvMGpmVDFyclZ0WjcyeTAxenNkOGFXNnBUU2xUTlZ5SVZHQWJORTF5SUo4bzROaDFhMVAzdzQ3REJFaGcxQWhUaDlkRW1rS1FTYUZTT0dLaUJTVUE4NVgzdHJOdWFCYVZQWUNzRkdzenFvNmNlcGlhN2VrYnR0UnBKVmkxWldkSzIrZkxOLzJyczBVdGdoMHB6VHVaQlFLZUhNdm5UbUQ0MW1tNkhSa285VkNFMzBNa29TU3dZRHlKSUVaTU5rb2M4cE1KaUppSXNwei8zd0NsZWZuZXd1cEE1SHgxaFpWWllXQUZRSXdGR0F1eGpwVkM2V0tLaGRDOUJLVlRVSEtaRFFLMy9Vb1FySGZ6MFgxOTNkNy9ZMXViOUNyVnBMcThabnBxV2E5VnIyZGhneTc0WnpEdSsrK2czZmZmUWZBWDJOK2ZoNlBQUElJenA1OUJBODg4QURNUGxackR3UUM5eDQzYnR3b3ZqdmV4YnZ2WG9TMStaRy9acHBsK2NyYWVtZDlvOXRWM2Z5dUJlQVVLcjVReUF2VXI2SkNiaXpxMUdJbGxhSUZINHIyZkw1UmdtU3FoVVRKajMxQ0pCZWxJdktVbkFTcEV1VkVsQUd1Zk56WWNSVEk0eGhXVkp3VGRTTGlJcHRJWG1VWEY2bmJLdnF5VWExS3BkT1JZZFA0N2VaOTdoQjlUcVp2Z1dMT3g1WTd0NHJEM3o1M2pzNEJXRjVlcGs2blE0UEJnTkkwcGJtNU9jNnlqQWFERnFmTlBqZlRsUE5halpQQndHUlJaS0lvTXRsZ0VFVlJaSmdvZ21wc2lTTEtFVE5ScEVZUzhtMGdZcWdtZ0lrQlRhQklsRFdCY2dKb010elBTQUJLb0lnQitQdUIyQjlEL1hGQUVZQllnWWdJRVJRUi9Db3ZFYnhJUnk1a2ZBNTUyRmFRalRIUlRLdlpuRzQxRzBrYzM3RkZSSk1rd1lNUFBvaXpaeC9CSTQrY3hiRmo1VHJpdnJRWXdGZ1B5czN0dmZadmJtOS9uei9HMXUyOTlvKy85dWIyWHZ2SEg3dmQvanY3UG5jKzk5dDluOXVkKzBIZXgraC94KzIyL2RWMjJ6dnYzendNN1hQLytHTzMyNy85ZWU2MWY2ZnozTi83M1BtOTMvcjczTzdjRC9LZUQvTjlEZ1o5WEx4NEVSY3ZYc1E3Nzd4enBLblpVVVJVTjdyZC91ckdScmZmSHd3d0RFcThPSDNnb1p2aUhGN0kra2dJeGVvb1pkUlpUbHZ4d3NQbUpmUHpRTlduYjRkeUxOSzBSVld1THl4eWVibGZnWndjWjZKcU5VWWVxVm9RNWFKcXJiVXVxVmI5dGJVdXExWmQzTy9MUnFVaWxZMmFWS3NkU1pKRWw1ZVhwYkpkOUxsRDhkQytCUXJzTHRGL3ZMeE1BRkJLdERzM3gvTnBTdDF1bDUwN1JzMW1uM3U5Mk9TMWpKTkJaUEk0TlhFVUdaTVprM01hTVZGRVJKRWxpcWdVbjJvOGxDZ1FlMmxpS0ZKQUV6QVhnc1dtVElFWTRBVFFHTHo1ZkFJaUVjUkVpQUNLQ0JJcEtBSWhJb1ZSYUZTRXU4T2wwd0F5ME0wMVNNdExyVktwemt5MUdxMUdvOFo4TkZIcFRzek16T0RzMmJNNGUvWXNIbnJvWVZRcWxTRFFJTkN4N1NEUWo0OUFSUVNYTDMrQWQ5KzlpSGZmZlJkTFM0dlk2VHY2S09pbmFkYnViUFE2blc1UDFLZHBoeGVGbEFWQ0tDTlBnb09xSTVCVmdvUENGd3lWRFJNVWxybHNFbDlJVThvRzhlSmx1UmxSRnVPZ1V2YkNMU3R5YzErZHU5bmlEN1FaZVVhcVZsV3RxTnBZS3RZbHp1WFd1aml2dUt4cVhkeFBwRjdQM2NaR1RZeFowVWFqSVV1VmlqYVdsNldVSndCODN5OWJ0bTk1QXJ1TWdlNll5b1h2RDdoY1NCVFlUT1hPQTlMdHJuQTdhbWt6NlF1U0dxcklnS2lDUEUyQkJJalNtS3pKd2NXTE14WE5jSmtWNnV1MEtJSXFwSmlxb2lBeXFvQ1NxQ2hVaVNFS0ZpSVNWUlh5S1FVSDliK0N4UDhhaW9uOFh6SkJuWUNFRkFLUUUwaEVSRzRZbFJJS2tVcnhEMlE4SXUybmFhKy9uQTZ1M2JqSlU2MW1ZN3JWck5jcWxUdlNPYUhkYnVNblAva0pmdktUbjRDSWNPYk1HVHo4OE1NNGMrWitMQ3dzaEFZT2djQkhHRlhGOHZJeUxsMzZPUzVldklpZi8vem55TExzanA2RGMwN1dOcnI5dGM1R04vVXZydGd1NGlSMWZwVE1kL2lCa29PZkxtSkYxWkd5aGFvVElzdlFYQUZMcEZiVnkyNll2dlVScDIvTk55d0Vra3g5Ulc2bXZ1WTBVN2pOL1VTWld1U0lrRk1SYWNaQUxpUHlqRnpzWEtXUVo2WGlxc1k2VFJKSlhGL2FVVlVySS9LY1ROM09UZFQzakxLVFBJRmRJbEJnOXloMHUxU3VQWE9Ham5jNm5PYzVwYTBXTndjRHptbzFUdnA5azFjcUhLZXB5YVBJY0VxUk5ibVpqRVRaVW9RaUJUdU1SaU1mblFKSUFCK0J5akJLUllKaHloWUpnZjAyYXd4UVJJSllvREVSUlFBaVFHSUNHUzFTdWdUeWtXaVp4aVdkaUVpTFJiMTlOeVVHZ2FFK0txMVU0bmltMldwTU5SdDE4eUVPV3A0NE1ZY3paeFp3K3ZScExDeWMyYktDVEloQTkvcytkejczMjMyZklRTGRiZis5RllGMnUxMHNMbDdCbFN2K3NyaTRlTWVGV2RMdDlkTzF6a2F2MCsvMVZOUkxjNno0c2h6dnBJbUlzNHhDNFlxRnJoMEl4VGluRnAyR1lGWFZNaWhYTGxLNFFrVUVXVFpQS0NMUm9uQ0loOUdvbE5Gb0Rqc1NkUmFQbDBqdFpPUVp1ZGhKUlcxc3Jjc3JGUmVucVdTMW1rdjY0K09lTjFzdEthdHVieWQxVzNMUXNUMEZ4cHNyakMzNWNybUcxaGxJcDlOaDEyN3J4c3lNTlB1K3FLaWFwa2lqaU9Jc296eU9YR1JpMkh3ekVyVkVVRUQ5aE5ETnBnamtWQjJvdUswQzluL1JoTEtnYVBTWGtqb2FScUlhQzVYVllScUQ0QWprVkNrcTlqdUJSbjQvSXFDVTUyaEVTZzYrV3JkYzRMdmNwaXkxN2xxNmtsMi91YnJXYk5ScnJVYTkxcXpYcXN4OFIxTzhOMjRzNDhhTlpienl5aXNBL0JqcS9QdzhGaFlXc0xDd2dQbjUwMmcwR25meWxBS0JBSHlQMld2WHJtRngwWXZ5eXBVcmQyd01jeWZTTE1zNzNkNmczZG5vMmR4YVVEbExBUUwvbTAzSVQ0a29DekY5R25jMDR0d2MrN1RpdjNNdGxIeC9XL0lWc1NoV1NSR281WEtaTXRKaTdpYU5qSUY2Z1NyRWR4U1NzdGV0YjVDZ1ZGVHFEcXR0ZlRwNFRKNXg3Q3c3RjJkVzBpU1JTcHJLSUVta1dzZ3pLcm9OdFZvdFdTc2FKb3ltYmdIc3EybkNkdXdxME4zU3VFODkrcWllZThNdmQ3WjVJdS9qOHVVSE1GZDBLUnEwMjd6V2JHcXozNWRCcllacWxpRk5Fc1JaaGh4QTVHS01wbk50NUtmY3d2ZjFBeEdwUmRrb3ZyaldVcHBhcEdRM0I3QUZXc3hEUXZIckNNNlBnY0tKK3FJaVFCMFJuQWdjRVJ3QVV6eW5xTkFkaVVMOUdLbERXVnprYy93R0NsWXErdm1TVXFmYmRaMXV0MGRNM0t6V3FzMW12ZGFzMVN2RzNQbWVmbG1XNGRLbFM3aDA2ZEx3dnVucGFTd3MrQ2oxOU9rRm5EeDVFb2ZZaUNrUUNBQllYVjB0WkxtRXhjVXJ1SGJ0R2tUa3d6NHQ5QWRwdnRIckRUcmRiait6Tmg5K2h6TEVKMEswR04rRUZOOXhtNmxiZ2tCMUxPb0VZSXZ2VEV1K3o2MWw5dU9kT3F5MkxlZDcrdHNZaVNKNVRLQVRVcVhOSWlNTDVCRjhpejR0RnRtV1NPMWs1R25adWRoYWx5ZUpxMWpyQmtraWNiOHZaYXUrYXJVcVNaTG81Y3MxclZUZUg1UG4zTnljUHZYb280cW50cC96dVZ2MENleVJ3aDArYUorcFhBQVlMU3J5bGJrRGJqYWJuQmFWdWRVczR6U0tUTVZhSGszbkdtTU1FMFY1anFMSXlFYXVTTzJpS0FyQ2FHb1hpSDBxbDJQb1NBWHV5SE1BalVYaFU3aFNwSFVKVVpHMmpZZ1FDUkNSSW9JWGFVUitNcXBSVXVPTGpjcEtYV1ZWTXVRWC9UWkVmZ1VaS3B2aSs4K2tMRHdpZ25LalZxODBtL1ZhczE2dlJuZlIzQlJqRE82Nzd6NmNQbjBhOC9PbmNmcjBhVXhOVFNPa2NFTUtONlJ3OTVmQ3piSVVpNHVMV0ZwYXd0TFNJaFlYRjQ5OEh1WitVVlgwMHpUcmRIdURqWTF1UDNlMnFKb2R5OWo1YVlCRk1LSktRa1JPVllWSXk4Yzc4azBTSENrNTNReFFMSXIyZkF3dlRRQ1dRTVcyV3JBWEgxTlpNRlFJMUU5dktRcUJmRC9iemFrdG01TFZvdWhJZ2R5b1d0WElGd25GZms2cGM4Nk5wbTNUS0pKUmVWWXFGZG5ZMkpCU25xTkZRNERQbk41TzZyYmtWZ1VLN0NEUjBmSFFUWW1PVDIrWmxLakpqTEdSSHhOMWxnMFJSVXg1UkVTUks2YTlrQ3NxZGdtUks2WHFvMHUvclNOaUpZeElkRk8rVWs1cEVYOHNJWWtJaUlqSWpJcTBTT0ZHQ2pXa1pKUmdpSW9Vcmg4SEhVNTNRUm1kS2hoZXF1UzNDNmtxR0VUVXFGVXF6VWFqMXFyWEsxRjA5NFYvalVZRDgvUHptSjgvWFZ6dVF4d25RYUJCb1BlOFFFVUVOMjdjd05LU0YrYmk0aUpXVmxad042R3EydTBQc2s2M08raDJld01yNnFDcUlDL0xZWVFKVlNnVjI4TU1udDhtT0ZVSWxkY0twNlNPL05pbkxZczBOOFhwVytheHNvOHlpeWlVTitVM3JMeFZJR2NkdVQyeWdIWWhZSit5TGRPMHhrOUxNY05vTTdhcWFrMGtUbFJ0WkdQbkVoOTVUc3B6Y3JwS1dUUjBrSEhQOGpQZDYzUGZsMENCWGFKUVlFK0psdE5iSmlVNldsaFVTdFF3RzV0VHhHd05Gd1ZHYkgza1NFU1JoY1lFRnhHaW1NZ05CU29URVNySnBqU0g5L3ZvMUVlZFFBeENSRUtSRnlrWklrUWlYcWdFTmFyd1UxMzg0dC9qMDEyS0tsMVNzRks1cG1raDFaRmlJMUFoMFJHWjFxdEowbXcwYW8xYXRWSkpranMyeC9RZ0VCRk9uRGlCK2ZsNTNIZmZLY3pPem1KMmRoYU5SaU1JOUlEdk13aDB0LzEzbDBDZGMxaGJXOFBObXplTDZISUoxNjVkaGJVV2R4dE9SSHE5ZnRicDlRYmRYbi9nUkdWTW1yNGd5RWVkUlhFUVJwck1rS29vVGM3ckhHMk00TWM4aVdBVjVGVFZNWmRwV25Xc2JKWDllS2Y2SWlEZkRVaDFtTFlkeXBRM0k4clIrd0hrcXNZcWJLNHdkcGl5VlF6VHRhSnFSU0lYeFdxZGlCdVZaMWt3TkNsUE0xRnh1NGM4Z1Z1SVBvRURGQkZ0TXg2cUtQODFGa1ZGVzBxQkwxOUdPYjBseXpxRWpSWTJta0N6MzhlZ1ZrTTFUWkhuRmVSSVFWVld5VVNKU0l2ZWZhcmtHOFlyb0FBcGtSTUNsRUJDSkFKTElnUWhJa2UrR2xlb1dENUh2Q3lIWTZBRVdJSEU4SUtNQ0xDaWlFSHFid3RGQ3JWZTFHcFVLUUtwVlY5bzVJVmF6aHNsNVRLOUt3UW0wckdvVktXNEQ4U3FZRUtSM21VUVZMazNTRjJ2bjZZZ290aXdxZGRybFVhdFZxM1hxc25ka3VvdHkrdVhsNWNCdkRhOFA0NWp6TTRldzdGanM1aWRQWWFabVZuTXpzNWdabVlXY1J5YTVRZnVmbFFWblU0SHE2dHR0TnVyV0YzMWw1V1ZtOWpZMk1CK2c0bzdqYXBxUDAxdHJ6ZEl1LzErT2tqVFRFRTZKazNlbEtacTBTOGNLaXJrMjVzT28wMTFaZGMybjZaVlAvWko1RWpWS1h6S3RwU25MMGZ4NDUyazVNQkYrendmY1E2cmJwVmhtYmhZNTNNem91UWlkWXRpYkZRTFViTENVaVQ1NkRKbnFzYVZyZmwwR09tU0ZSVW5JazZxNnZMTUN2S0tpN0ZWbmo3eWJPd1llUUk0RkhrQ0I0aEFoMC9ZTVJKOUV1ZUtWbi83U2VkT1cwdFpWdU5hTGVQQklES3Vrbk9VUmNZbGxpTmpqTTE5U3RjWVkvSWNrV0ZueXBRdVdSVHBYVVFFVndveEJoQ0pLOFk4ZmNPRVdHZ1lnZnBySWg5bFFxS3hpTFJNN2RLdzRZSlI4VElsVUJHTnFsR1FvYzJPUlZ1bXZQaElsSWJScUUvOSt2c1ZJeklkalV3Qjh2dUpxa2tTTit1MVNyMVdxOVNybFhpbklxNjdrVWFqT1l4VVoyWm1pdXRaVEUyMXNKbXdDQkhvUWQ5SGlFQnZMUUx0OS90b3QwdEp0dEZ1dDdHNnVvcDJ1dzNmeXZYdUo4MXkyeHYwczI1dmtQYjYvY3o1ZWUrSzBTVWNSeUpOUlNsTkVpSVZIWXM2dFdodk9qRTFwVWpqS3VBSXZtRElpMU9kS2psaW43NzFLNnF3SFUzVmJrYWNiSDEwcW1QcFcxWllwYUtZU05XeUtXUUxGTVZCeHBwaW4wYXcvMzk3NTdMa1JuSms3ZU1lbVVBVlNRM2JOS2JkMkcrOTBVclBvL2ZwOTlIemFEV2IyY3VrYVk2YXJBS1E0ZjR2M0QwdWVRRlFGMTRiYnNaR1p0eFFKTFB4OFJ6M0NJUmxteVhsY2NTVWM4NmwwamJubkk2RFRMc3BwOE1vZDNkVGZuall5VzczSUIrR1FhK3hiUUhnYjMvN2kyNmRkZnNVZUFLdkExRGd5UkI5NU9tbm4ramQ0eU1mai9kOHVqL3kvZW5FcDkyT3grTXhuWVloamRQSWMwczNNYWRwc3IyalhJdU1Cc29PVTc4SE1CS0pnNUVHWkIwSk5MUXdKU0xybHlWSVNTbjVGaGM3dFloMEFEd1hxbTd2TnFxVWxGaEpFNVFZM1N0TWdVYkJFWUZXWWFvZ0lpSTFHNWlnSUd0QmVuTi90M3Q3ZDc5LysrWnU5NjNhdlplQ21mSCsvVThPMVovdy9uMm8xcC84VzJsdUFEMzMrN2dCZFB2M01VMUgvUHJyQndmbHJ3V1l2Lzc2NjFmYlgvbVNtSEtXVHc4UHg0K2ZIbzhmSHg0T1U4NW1yNXJLVkxnRHAvVitEWnFLVWhnVTlpMWxrSlpYVXNwS0txRTJDVERWU1pySnQvbVIydWxDQ2t3TW1wUTBMOERKSFBuUU9NemRvQW1ka0Z4bEFnWmVCNnVxR2pTVHpVbXFrK2d3cWVvMERHYlR6aTNiMDNDU3FMUWRqMGQ1R0VjWkhaNnhWYVV0R0hvT1BJRXZBRkRnZFNEYUhiWndQTEs4ZTBlN3g4ZDAydTA0VHhPUHc1RHlOSEZLS1ExVFNoT2ZUSUZtVHEwYTVVeCtuUXRNeFdFS3ozVUtTVnhiempQeW53SFNtU0pWb2dUQm9KNGJCV0ZRTlNWS0JMTjNZN3NMVVFJcFEwdXUxSEtqQUd0ZmVNUlV0cjhRcTBIVEZLdUMrcUtqVUtWeHI2UWdHbE5LYjkvYzc5L3M3M1ozZC90eHYvdHlaL1IrcmhpR0VlL2Yvd2YrK01mL0xNcjEvZnVmOFA3OSsyNnJ6UTJnMkx6KzBRR3Fxdmp3NFFNK2ZQZ1ZIejU4d1AvKzcvL2luLy82Si83dnd3Y2NEZ2Q4ejVGemxvZkQ0ZlRwNFhENitQQndPQnlQSndPaUtwU3FOUXZZRnI2K0tFZ0JQNDNOdHRFTEtWbGVreURxQlVHa1VXMGJCVU9VUVpxaFpGdFV5UEtkZG1vUTNMcWxETTkxa3ZJRXhrUmVORFJYbk5abVZxNXkvVmFVVWx3VWh5cDAwRXhXSEpRMHQ2b3pKY21xT2cweTVtbklPZWVjMHpESWFacHlHZ1laajBjNTN0MWwvdTAzM2UxMjNTRUpYeHFld0RNQkNseUNLUEJYUDJqaEdvaitORTNVYm5NNW5mYWM5eWNlSEtMREthWFk2cEluVHEwYVplYVVhUm9JR0ZnNGRiWnVnU21HcWtCbElLbjNCRlFGS2xKVXJGWGxVbkpMdDRNb0NFTUEwMVJwV0x2RUNwMVp2SGFLMFJ5bXBreE5nVFlxbGVEdEdsdGpDR1RmQUtmZHZVSXBNZlA5M1g1M3Y5L3Y3dS8yNDkxK1A2WXZmSkRENTR4aEdMSGY3L0htN1J2ODRkMGY4TzdkVzl6ZDNlUCszbjdaOVIzdTd1N0J6WmJiRzBDL2ZZQUN3T0Z3d01QREF4NGZIL3oxRVE4UEQvajQ4U1ArL2UvL3c4ZVBIL0g0K1BoZEtzbXRPQnlQMDhQaGNIcDRPSndlRG8vSDQybWFESmlrNWVzYVlXQnM3OGx6bXZCSzJxSXVJOWZaUXJQNW1qRTA0RlQ0WVRMMmRjcFppVnh0QmxBZG1BNVBnbVpWbnBUaXk3RWRoTXh0c2RBVWl0TUtoYmplS3lvMEc3dFdXTEpCZEpoRUpMZXFNdzJTWTR2S05CbzhwOGtzMjNHcytjNzlmaSsvRG9OZUQ4L3RuQ2Z3UEhnQ0x3QW9jRm1KNHE5L1g5MG5lamo4UC9xdi8zcWdmL3V4ZjFHaEczblJ1YVdiZHp0T3g1VHlPSEdvMFRZM21wa1RUelF3NTVUdGVNQlU0T2t3elJrRE15WHlBK1VGVWhWcEExSTFpQ1lBZzFxVmJvSkQxT3hkVFdMN1NaT0duZXNRSlZCUzIwL0tGQlp2ellkMk1JVkd2clRQbVNKc1hUZzBGN25TN3JvQU5iNm9mTDhieC91N3U5R2hPbnpKYjVMNW1wRlN3bTYveDkzZEhkNjhlWU0vdkh0WFlIdDNkNCs3dXp2YzM5OWh2Ny9IYm1mRlRqZUF0dGN2QjZpSUZDQWFEQi94K1BpSXg4ZFArUGUvZjhPblQ1L3c4UENBdy9GZ1ZhMHYrT3o1SGtKRTlPRndPRDA4SGs3K2VoUVJJVUIxQWN6eWF5VzNTZUovV0xPOW5KSFRKREZidGlqTkFrMkNpaFVFMmVsQ0J0WUtUeThReXFySURKMlV5QXFGb0JsV1padko5M21xYWlibUhweXVPQm5zMWJnNmlXaE9DUVdhRFVSelVwMUVVcFpCcHlTUzIxeG5xTTUwR2lUdmNrN0hvNnhadHBIdlRPbGZPbzZqL3VFUGY1RDJrQVJndnMvejlaVm54SXNBQ2p4ZGlRSVZvdE4vUFhUYlhLYWZUbDFlOUczT2RIQVZ1bk5yTndxTVFvMm1sSG1hYUVqTWlUa255V3piVVZoU3NYUWRuRVM1QStsY2tTcVp1aVFwK2RORUJ0VUVva0dCUkVRRHFhUlFwVVY5V3E0MEVWR0FsYlYrWlpvcjB4Nm02a1ZHTTVoU1kvVlNxMVFCVTZiVUFuUU9WQVdGNVV0QXFOVHgvdTV1ZDcvZmovdjk3b2RTcWM4SklzSTRqdGp0OXRqdjk3aHpSZnYyN1Z1OGUvdTJBSGNZQmpBelVrcGdUdjQ5cmZGSDkrTUNWRVFoa2lFaXlGa3dUU2RUaVk4SGZQejRHejUrL0lpSFQ1L3c4UGlBdytHQTQrR0EwK24wVFp5Njh6WGplRHJsaDhmRDZlRjRPRDA4SEk2SDQzR0NQUnF0SmJzSlRFWGtNajIzR2NvU3FzV2FMUVZFQnMxUW5PaVVwdnB1Qk5UREVDdy9tbFhWRGtVZ0t4alNWbTBTWjdVdnZzNVFuWWp0WHRVVktCc2t6Y3BkS3M0S3pqUXBkR0xSSEpZdEMxditORWtXU1RtSDhzeEppdXFNUXFGaGtPUHhLTW4zZDM1TVNmdDg1Nmo5TnBWMWVBS2ZUM2xHdkJpZ3dFc2cralJMZHpmdE9POG1Uc2RqeXVQSWVVb3A4U21KREJ6N1JuTjJrRElubWpBSWMyTEtLUXFObURnUjVVSEVGU1Y4SDZoUUlpRHlwOGtnYWtyVDhxUmk4Q1FrRlJwQUJsRnE4Nk5xSnhpQmtLRHFweGF0d2RRVUtycDlvM1V2YVFQV3NHNkxJcVZhaUVSUXNOcm4zMFdnMnR1WVNoMkhZYmpiN2NiOWZqZnNkL1pyTnc3ZjNPRU8zMm9Ra2Y5aU1GT0JLM01DTTRNVEk1WHJoQlFRVGdtSkUxSktTSU5kRDhOZzk4bkhjN09PMjlLcUJqSVIyeHVmYzU3OW1wQ3oyS3RrNUVrYUFHWmt5WkFzRUlsZnVhd25JdlpKTFM2R2ZuQlYrQm9ocW5vOEh2UGhlRG85SGcvNThIZzZQWjZPcDA1ZFFuQVZNSXN0UzFvTGdGckZhVlp1RDBxREo1b0syMUNZV0llbW4yWHJKd3FSbGp4bm96WXpzZWRBemFaMWVMb3laVGFRcWx1NTdQdEF5MWVXYVZaTms2amtLQkFTVFpsRnNnNllXQXljS2RsQkNDSkRacDRreTVqVGtITTZuU1R2ZGprZEJ6a09SM21PWlF0OFdYZ0Nyd1JRNERKRTI4TVdnUHBkb21zUTNiSjA4LzA5blE2SEZDQWRUaW5sTVhNNmNaSWhjMG9wVFJPbnhGTXlrRnArbERQNWRSNDRVekpGbWdkaVRwSVJoelFrZ1ZqZUV6QjRxaVJUcGtodTd6cEVLWFdxVkNrUnpmS2hIVXlKZlc5cGdTa1pLTjN1SlFZcHF4S1RBM05oOWJxVk8xZWs5cXJrMm1LcFVNa2h1bWlyS2hVQW1JajN1OTE0dDk4TkJhempPSHpwdy9GdmNZdHZLVTdUbEEvSFV6NGNqOVBoZUpnZUgwK240M1NhNEIvSVJWMFNMZTFZUXRmV0sweFYrOTkxUlhHMjF1M01tblVvQ3BSY2FkWjhady9OcUxxdDBHenpubHJhT3JWcENwVFoycXlnYUZKaWd5amcrVkNEcVNsS1RDcVNGV2xpMFd4RlFXa1NFYisyUEdkS2tyTU1lWEMxeVZPU1BFcE9weVRUbUFzNHgvMCtwNGNIUFdmWmJ1VTdBVC9iRmppN3p4TjRIWGdDcndoUTRQa1FCWURXMG0yM3VyUnFOT2RNOTZjOW4zWkhqbU1BOHpUeE9JNDhuVTVwR0FhT0lxT28xczNNaVRNbjRad0NwT0tLdElCVU9DbEgzbE1TaVVGU3pNNU4xZDZWUVUyNXRxclV0N0pvSW1DdzgzTGQ0bldJY214ek1XWEtadk1xOTRWSHlpQmlzdmJacVVidFNVZWhTamNzWGp1RG53T29JQkJwVTVSa0ZiK2tLTW9WbUVHVllWVU1BR2czak1QZDNXN1k3M2FqcWRVeERjT1FibFM5eFk4VXBpb0RsTWZwOFhnOEhSNlBVMWFKYzJOVkFLekEwaUZhcW1RVlVmVFRBYlFVL2hRbDJscTB4WmJ0bFdlbk1na3FTaVJRTlpBMkJVRmszNDJjUVZTZ0tiNWRCUUZQWmN0M0FwUEdnUW1xdVZXYnhKYjdyRFl0bStwVXpjbzZrWElHTUpGb1ZxN2cxS1FUYThvQlRwYVVKVW1PUEdkS3RVaG9taVlaeGpHZlRpZEp3eUJ4SE45NDNNbkRlSkNVa3JhcWM3bEZ4U3hiQVBpYThBUmVHYURBSmtTQjhtSDlWL3JyWCszcUdrczMvL0dQZEhpb2FsVGVaWXBqQVBPcDJycW40ekdONDhpU0IwNXBTcElUbndOcHNYYUZEWlFreWVCb2xiZkY0aVZLS3VyMkxxVldsUkpwaXFQLzdQQjUzK1lpMm9BMVlLckpBRmtPcW1mUG1iS3FKaVZpVWo5bmwxQ3QzS0pPbFdzT2RXbnRCbEF4SzBJeW9JTEtPTDhQUUdJSlZmVHR2ZjBiZjhXN1lSaDJ1M0hZaldQYWplTXdqa1BhaldQNlZrNVN1c1V0NXFHcWVwb21PWjZtZkR5ZDh1bDBtZzdUYVRvZVR0bjJXOXF3Y3phc0FwakRzc3dwYmVTVnNsQnE3dEdyenlVdy9WcWhRa1NkeWdRUTM1aVNsU0NrV2c5L3Q1eG03TzNNY01zMjhwb0JTbUxLR3VmYmFuczBYeFFVdWRyMDdTbzJYbk8xYU5rTGlRekdWa1FrT2F6YWMrRGtsQ1huSVhPYTVIUTZ5ZGphdGVNb2NSd2YvNWEwcU03N2Uwbi8ybGFkd055eUJZRHpYMHYybXZBRVBnTkFnV3NnaWhlcDBmenVIWjJPdFZJM1QxTUI2VGlObk1lSjg1VFNNR1NPUXFNQXFhVEVuQzFIYWlBMUZXbFZ1OWtVcWxCaWtsUUtqa2lUaW05bHNmeW9BZEp0WHJGaW82UnpSZHJDdEZHbVp1TTI2bE9SbE9EVnVIYWlrWStweFVlcVRLU3NZTG9LcUUzMUxpbElHMVZxZWRRR3VBcGE1RkxWTVc1NTJOWUN4cFphQlFBRzhXNXZVSFc0cG5FYzBtNFkwOWY0ZXJkYi9MNUNBVXluS1IrblV3NVErcS9wZEp5eVF3L1lWcFd4akZtc3BLWUJlNGhHN3JLb1MxT0F6YjBWL1lTVnUxSk51dzVNZ3FncUNZaEtNWkJYMG5ZbkNKRkNsR2JiVWtEU0tjME9tdFNBMU94YVZnY3MxQldtd1JhS3lTQkpPUXFEUkRremF4YVJ6SnB5Vk5XeXNJTlRzdGdIclFRNG8wQm9tcElrcjY0OURTY3A0UFI5blEvaktPTnVKK20zMy9SenFVN2c5ZUVKZkNhQWxzV2ZZZWtDWjlSb1U2bWJjNlpxNnhwSTk5UEUweFVnSFpKd1cyeFVRT3I1VVNaSkxKU0VKSVc5U3lRT1ZrcWw2SWhnc0JRL2tZZ2tpZWRRMVlxSW1xOC9neXRjejRXU3N1Vk13VXBJUHQ0T29ZL3pka09kS2xsUjBVeVZGcnVYUU8xMW56Y2x0bjhJZzVhMmI4MmRia0YxQnNpaVZwdS94d1ZZWjRxMS9KMG5ZdDRielNQekFBQWdBRWxFUVZUdHgyRTNqR2tZVWhxSGdZY2hwU0VOUEF5SmIrcjFGcGRDVlhYS1dVNVRsbW1heEs2bmZKcW1Bc21tMWxrQmUvQ0xvbHdGcFYrdnFFb0JjQW1XL2pIYTJiRm02NUs2RFZ2eW1WQm90V0xiNjE1dHFrS0lxc3IwYjFESk1NTGErZDhhYWhUWjdPRTRlcysycGNSY1ZTOFlBaVltQjZ4cVZnNm9Ja2RSa0tobVY1czViRnBXenNLYVJUbTdYZHVEMDRFNVpaWkw0QnlHb3h3YWNJWmRtMUxTdHNMMmt1b0V2bzVsTzQvUENsRGdHalhhbjF3RW5GZWpVYW1icDRrV3R1NXB6M0tmYVQ5TlBNV0pSak9RaHJVck1uQVVHNlVrTEprVE02Vk1PYkZ3RXBhd2Vwblo0RW5JZ3lvenhZSHpidmxLQWE1YnRsUlZxKzBYdGJ5bjV6NVRBU2U4Nk1oeW53bEVkcUlSYVZpOXJLWkdUWlc2OGx3Q1ZSbEtYcEhiV2I1MndwR0N2R2lwczNkUkQybG9vRm9WNTh6KzNWS3JRQWRXUXFOWWF4OERMVnlCWHJuYVFLSmhUR2xNS1EzRHlPT1EwakFNUEE2Smh6U2tHMlIvN0ZCVlREbkxOT1U4NVNrZ21lMzFsRTg1NSttVXBWR1JRT1FmQVhTUTdGV2pkWVBVbU5lQjB0NTZvU3BKZXh0MjBTWkZvYzdVcFFIYlR3cFNpRHAwQ3lRVkNvbzg1Z0tZb21wcVUxMTltcHIxazRQY29uVkZhYStvSUhWb1pvZW1SRjdUYkZwVG5LeWF4WUNacXlYckZia2tva2lUcVUzT0xDSVN3R1RKU1ZNVzBjeEpjZzVnZWtWdFdMVUxjQTZEREVjREp6OGtqZXJhMXE1TnF4VzIyNm9UdUh5eWtEOVRueFZ3bngyZ3dQTXRYV0NwUmdIQTlvMW1DbHQzZWhaSU01dGRLenlrVkJXcEpLNTVVa2tzektGS3c5cHRWR2w4eVhheGF0ZGhTZ1dpeGVadHQ3bFF3Rk1TaU5ublJjVnRVZ1Z6S0ZuMTZ0eXpRRFZRRnJWcXdISWxHaXJWQUt2bDZFQTczY2kyenpUSzFJSFoyTVF3dGJvT1ZyWlBqZDd5ZGJoUzM0ZXV2OWpGZ0pxRURzQjI0eWdSaGhTUUhUaHhvcFE0cFpTc1Fpd2xIaExITloxNTltN3hCVUpFTkl0b3ppSlpzdVFzbW5PMnI5WElXYVlzT3VWVFBrMDVUemxMQXo2Z1VaRFdUTmJlMjZwbEhGejFhUS9KNkZkeUNiZ0dTaUxQWWRvYitONUxxRGJLRTBTK25jVG13RUdxMWlkUXFOdXVZZE5xcHlwUnFuQlhnZW0yckJCUkZqdWV6d0RvT1U4bHpsQVJFQnRFTlE1QktFclY3RmxSaWZ6bE5qUzkzeFNwaE5vc1ZxMnJUV0dScWpaVFpzNVNGV2NXWmhZUnlaelNrOEU1RElPR1hadFMwcmR2M3dvQXZJYnFCRDQvUElFdkJGRGdTb2orOGd2Kyt2ZW5xZEd3ZFV0K05MK2pPSVFoOW8vZWlkQWNwSkl6VzlYdVpOVzdPWE5tVG9NSVorYVVSRmlZVXhMbVRwVUtzNVI3QTZxcDBzYmlGVW5FcGlCYm1JSjhYRUJUaWNuSE16T3J6V09WcWtxVmlMbmtUSlZic0tLY3J3c0dpdVhMdG8zVUxWMVYvM0p2OHR5cHExVFZPSE8zT1NMUW9kb28xV0wvTmtjS1ZtVmFRUXZZSnhUTndRcWdGaTZwczMwR1YvYlhPVEFYWTlUYmVRMnkvYlBrYzVpSUVqTVBhZUNVREtvcHBUUXdVMHJKMmpnUk1SRVRFVE1URXhFeDM4anJvYW9RVlZVUkZYdFJCNlBrbkxYQ01JdURVaWVIcE8xZ1JBczdvUG5BNitIb0J6SDBDcklkWDE4SmEyUFUvN1hXRlBSRW42dEhjcVZaMmpzTE5xeFdOUmk2RGRzcHl3cExmMCs3anB5bC9SdlJ2N2dhQXFJNERVZ0FjZnRYL2ZzNDBaNWJXMEhwdVV3cDM5bHBhcE9ZSEk2Y1JVUzhlamJiZ1FxVXc1NkZpclRRSkNWUnNXcmJ6cUlsa1FhVW1UVlZZTHJhekN6Q0lqbWJEWmNuZjAwcHlUUk5rb1loVDlNa25KTE13Zm5JckxHZk13NURTS25OYzY3WnRSZFU1MS8rb3ZqbGwrN3gzSGhtdndqWXZoaEF5eHUrZ2hvRi9vd3RrRVorZEE1U3VjL1VGeHRObk1mUlFKb0hsaUd6eU1EelBHbEt3cTBxMWFSTS9tcXdwTVNzSE9xMHY2OXdER1dxVEZ4eXBocDVVSFhGcVUzTzFOUXB4LzVReTUyeVd1N1RLbm9ib1BwV0diTjhTUm1kTWlWV1VxTGxsM3l6Zjlvd2dTbWdhaHdzaFVoMWIyblpVN29LMWpYRldxeGdadnMzZk5OdWYrY09PdDlxczh5cjlvQnRuNU1sT0dOTVl4ZGJzNzNmV2VETzUvdXp5a1RNeEFaV0p0ZzFjWUNXbVlrYThQcmhCMFJGKzVhVGZpait3RUtOdCsweHJ2WmFsLzFjL24rcGF5dS9zVS80YUVTOWljSGFETFpYVlJHRG9ZZ1lDTFcrcW9oMGJaSlZiSWVIL1lIRVFVTzArTkJhQU5GL1IzVmlRTEdmdndaVkxXTldBZWs1emI0L2xHTlJreUxBM0hydEZXVzFYenRRK3RhVG9oYjlua0FTZjd3R1MzRmIxaUhhZnFXWVZjUXFvRVZwd3BWbVdMSkNwakFEbU5XV2pXOVVvVXlrSWxvUFF5aFZ0NjE5YXdWQ1VuS2FvaEpLTXlBYjBCUWhLZXF5dTlkTW1VU1R2YlpxTTJ6YU5yL0pQQWxQU2FZVTREekphUmk2NHFCUW5DMDR6K2M1N3hYNGIzd1Bxck9OTHc1UTRFcUl6czdTQmRadFhRQTRDMUt2MkcxQkdzVkdlaWNVKzBoenpqem1nWE9YSnpWN1Z4cFZxbEhGYThuUkpKU1RLSE9yUk5YdjV6QXROcTZxV2JPMjlZV1ZvbENvamtFM3RtNTFZUU9qRlNITmdLcEZoYlpBVldaeXE3Yll2aUNVU2w5WG13V3FSREN3VTdGL0MyVHIzdEpPclc2Q3RUbmdvWVBvVExrV1JXdFB4d0t3c0o5aTFkYmRCQzJoV1dmMmJDMlZxbDFYaFd0ZGRYNFpNb2Z1K3ZyYm9XZkdYWnZkUFhkaTNoSnUyei9KNm5Scmw2NnRBU0ZnZjgxeHU2RXMrMnZQUGNiUGQwWmRGa1VhS25FRmtJRDlXNEs2TlV4Skx1RlpLMnpYUUxtbUttdk8wa0JiODVhdUxCdFkybnkzWUFsYTdGaUNpS29TcUFPbXFncXRBMU9JTkl2QnNJVmwyZDlaODVxYXFmdEtNb3Fpb1RKbURaclczQ2hQRW9tOW04d2lrbEttbkNYVUpqTkx0V2t0djVtbUpLYzBTVXBKWWg4blBiSkdjVkFIVHErc1BRZE9BTGhzMTNhNXpzMW45MHZERS9oS0FBWE9RaFJZVWFQQUMwSGFLRktSTjNUYUhUbFBFOS9KSGVYZFpQWnVIbGwyUW1IdlNzNDh5TUFUVDBrazhlQnFOSE5PU1JLcitidEpXRGhwTW10WFRXM09ZVnJ2V3pYcEZieE16S0lzUklsVnVWZW5ZR1ZpRFp1M1BZaGhBVlJ2YTYxZTlhSWlLRE14cWJZcTFVSGFRcFhVWVl0bXo2aUJWQUZtS0NrNElCZDUxUWFzQnRKU2hYc1dyaWlXYmxXdVFBTllBSkZ2QlRZaEN4UVF4dGdOMlBiajYwRHF1M1grYkY2NlI3ZG14Qm9RZGJIMkxDNVI5TUo1c3dHM2MxTzJJYnVwTEgyaWRrMEJ3MzdOQlVRN1Zib0owQjZPWld6cFYxZVNCdGNtTjJsclhJUmszNFlBWlpPdkpJaUtiWHoyZTQxdlFERllFa1JkV2Jhd2hGK1RiMGNSRlRWSWttaWpOTU9TamJ6bkRKZ1ZmaUpDekpsc0lXbFZwbGpoUlJZbUlWR0pTdHBXdGJhUWJLSEp5bGtjbXBteXNMQkkwa3laSlhPVzVLcHp5aXpNV1FZWjhzU21Nc09tNVNQcktSazQwM0dRUjM3VTVJY2dNSC9TYXhVbmNCNmNBSEN0NnJTbjQrdUE3S3NCdFB3QVY2bFJiSUswNWtjTnBELzc5YmtjYVJRYmlRaWRkanRXRWRwTkU4dmRIYlY1VWxXbHFrbzlaNXFyeFN1U3VMVjRrekNMVlIwbFplRVdwa1dKc3JKVjUxb0JrallWdHpHZVcxV3F5bTFoVWJQdGhSZEFWV0p1UUVxd3VhcnE2eEFUL0N4ZGg2cHZuYUVWcUlacUpWVmx0aHltNTFJYnRkb3BWQzczMEdJRlh3RlhzMXRYQUl0dHBSb1dyWGI5UG1NMkpxNW56OVVLZEsxNVE2MnUzL2ZnNUkzMjFXaTdMNEYxTWJmNUgvZkMvOE10TUdXamZYdXh6cDV0bDFpQllUTytWYTIwQmtZZkc3blBPbWFwTElFbElIM09CVWg2VVZIVFJ0cmJyMldPMzV0cUZLdW9FN2VFQ3poYldOcDFLRXBYa29DNnV2UzluV0k1VFEyNFVsTTgxQUNUU09xMmxGb3daT3VZeWhUU0FzR296S1ZpOGJKUXF6aUZwSVVtV1hJenMvMUhXb3Myb0psU3pXMXlTa1Z0RXBHMitVMStmTlRqTUFneDYzZzhDak5yRkFlZHkzSHU5M3Y5SDFSd0FodDVUbUFPenJYbjBocS9Nc0MrT2tDQko2alJsUzB2d05OQjJsYnR4ajdTZkg5UGttdWV0Tmk3SzZvMGNxVWlBMHZLUE1nMlRFT1ppaktuZ0tnb0t3dUxjR0syd3A4S1dDOGlZbVczZDlseXAvVmV0U2pWVmFCNkFaTGxRVGxPT0twVnUyQzJmYU1PVW9LeU9iS3VWSlg5NEFWUVU2UkVWcEpUMWFyYTRiMGRXQzJYV2I3YjFDdHpHOVZhOHFwcnl0V2ZoaGF3QUZvRlc1Umw2VnNIcmFPMUFXa1owejFYQWMvSXc5YnVWZml1UEpQeDh6WGgwM1RXdmlwSWEySFZNMEliZTdYR1FuQUdrQzRyMFJYRkdSUHIrNVQ4SStZd0xDTTZpSks2TGJzRlJtdHBEalpvUU5qMEZVREd6ejVYa2cwa2k1b3NDdExBcUdWTUI4cVpxaFJiSTRwOEFEVWJ0aXBMMnlIU2dKTklJRkVrNUdmWUVrVEY4NStOMGx3RHBoZ29NNFZxTmFuWTNSTlRGdEVHa0NSMkw5a0FhZkRNUXNJenBia0tUV1poejJtVzNPYUcycVJIMXBMZlRFbmp2TnFVa2k2cmFwOEdUbUJ6YThyS005aytaVjhmWHQ4RVFDTmVBdExXMWdVcVNJRjFhemRBMmg3STBOcTdTMVU2c2U3M2xITm15UU1QUTJZVm9SYW1ROG9zbDJES1lzQXMxaSt6c0hKbjlZcXdlbFZ1VVprT1dxVUFjQVVxbERrc1gxV3JjNEdyVGk5T0tuQ0ZFaEVyMi9ZVlAzdDNEbFgyZmFITk5ZTU1xcTVXdVNqVU9Wajl2dVJYM1k0dGNBWDF5dlVpWU8zdmZnYlpkWmpHMnZHWld6M2lEZUIyejlVU3ZFQ0Y1eXBNRjgvckhKb0F3THplL2pramNvRnI3U3ZEVzErMmdXWjd2d3JDWnU0U2lON3BOaTdWY1RNd2R0QzB3UVdPUG13YmtFMmIvK1ZxQzBrYkczbEtCK01jbEFRUk5jc1c1TEIwNVFraERSc1c0dCtZMHNMU3o2WTFXRm9GYnc5SkgwOGtLbUhubWlXTHFpUWRtR2JUVWhuYjJya2l5aXl0TmN0Q2trbXFGVXRrc0R3RFRjdHI5dEFrWnAybUpPeTVUVG9jOURRTUsycXoyclR0QVFoYjRKeGJ0WUNCRTFpeGE3OHpjRVo4VXdDTmVFcCtGQUMyQ28yQWN5QzFmYVJ4SUVQa1NlV2RnZlIwT25ITzl4VFZ1NUVyRlJFNlovR0tRM1ZObVdvU1RzSXNJcXhHVGxZV0pyZDhWWmtOanN5cTB0dStvVWJWVlNZNy9CcUYybHUrTmtaVm1YdVFXaDYwVmF4R2IycWc2bFc0YkNyVGM2cG15N1pxRmRTQ0ZhRll1ZGkxTnA4amoxbGdHNUFzU3JXdnhOMENMTkJDRmdBV29PMktpYW8xM09WRU8rRDZtclBDb1U0V3RrRHRjcGpGUWw1L1BwdVkyOFNyOFFwRlJKMjl1aDRyS3JOWnNNMmgxdTBlS3lCc1ZHa0RSTHVkYjAyaCtiYVRIb3l4UmdFaGNCR1FaUzFUa202dGFndEprYW91UVZBU2FDaktEcFQyMTE1VkpVRkx6cEpJb1NLbVhra0RsaUlHeWc2V2RxMEJUdkUyeTJXNm5SdVdiS2N3YlF3UlNkaXpSQ3E5SGN0Q0lnWlp0MlMxS0U4UnlpVE1CazF5V0s0cFRXYldjeFl0TTJ1YjIrU0hwQ2s5NkRpTzh0SFZadVEzNHdDRTJNZjVWSEQrTFI2dWJ6elBlUzYrU1lBQ0Z5RUt0QjlVdi93Qy9MMnYyQVdXMWk3Ky9HZE1ELzMyRndCNGlpcTlFNkcyZ25jbmU0cDlwVHZkVWNCVVpPQmhXTUpVa3ZDZ0E2a0lTd0MxVTZjQlVic3VoVWpTQUhFRnFOUzFoVnBsZzZmM3NZS3VoQ3FGL2N0cStjMnFVTzFhVmEyZ3FJRnBLTmFBSXl2YmdZWGxucWpDdFlFcEFyQmVzVXRLUElkcHNZTURoTFc5NWpFRGxLWElxWU9sT2locG93Q3B0Mko3K0tLOGI3bWh5L25POVdkWWw5QjlsVml6Yy8wZGwrM3p2R2h6VC80aHRvQmdPM2VsRUVoOWJGR0wxbGpzWElPaVgzZHJWRGoyUitjMTdRWThoNitXMDRGYWFBWWtoU3BVU1VpTDlVclFvaWdiYUJxb1o2clNyNFdnNURZc0dkVXV3bElJV2lCSkpLVGljTlFDUncwTGRnYk1zb2FETWdxQXdxSWxWNXlkeXN3c3hDd1RUY29yMEp3bTFyQm4wNVRrU0VlTmZadEhQbWhiU2Z2SXJFOVJtd0RRYlVlNXYxZjh0MjFIQWRhdDJyOEJ3Slg3T2VzVC9HMkM2cHNGYU1UMXRpNVdDNDJBOC90SUFXQnU3NjZwMHBJcmRWVTZ0M2hWaE5wOGFRdFQxWkhDNWxVVmlnSWtBNml3U21JZGxOYlVxU2h6RXVXNTNhdWluSktTUTliYVRFazZQSHUxNnJZdkdYOWJxQ3ByQU5HdncvNUZBU3V4cVVobHFKTFp5WDVpVVlEVk5wcTRZdlZDSllkblVhMEZwa3ZscXJDeTVEbGdld1VMZE8wVWtMVW5wWVdtYW15ckxIT3dCQzdBUHFkVHVQWHBtaW5WQ2o5MnVHNCtpM1BBdHUyZk05YVU1N0xReDM2U01vVlVYSVhTSEpRMmNtSHhFc1FoNi9jTElEYUZRVUNqSkdNTnJXcTE1Q0dsS3RCT1FhNEMwbUE2VjVJT3lWWk5odlVxOFBWTVVXcUFFbVEycnVjcjNZSjFDUHFZc0dGSlJDc3M0N3FCSlltUWtFYVZiQTlKeTFrU0ZUZ0trVWpPcEZUZ1dHM1p6SmJMWEZXWkV5bXhiVG5ocGhDSXlHQ1pjeEtpazg2aEdYbE5ZdGE1UlJ0cXM4MXRMdFZtYjlNQ2NYTFE5ajVPNEhrRlFzQzNDODZJYng2Z0VVOVNwR2VLallETDlpNEE1RC8ra2FaVHIwcnp1M2NrdVZid3RvVkhkeUswQmxOVnBYbk9kQnpWY3FtU2VCeVU1SUk2QlVCclFMWGoyWlZWcXVXclZzbkxDWWxVWlFaU1Y0VXRWS0dzUmtSV1ZvWTZFQzJQU2sxT2xWcTFDbnQyNnIwcUZjVUtrUEV3WUZwZ1RPeDVVUzNWdjI3UkxnQ3JoRWJCWWhXeXdBeTBRRkd6SlhkSnFsWUdWVlZ0bVljeXJnRnJ2d1ZtcFppb2dlTXl0MWtWYTJrcGNKN0hheW5SZGVVWmtJdVFsYkZkZ1JHMWdDdU52UzI3VUo4OUxFTXQydGtKQVQ4YkY2cFJ1cjVxNGE3Q1VVaEJaWHRKQjhpMmpleDBIeTJRREFVSlY2NnVPaHRGcWEyS2hNMnI5MFFhT1V1UW4rVmplVXR0bEtVVkl2V3dWRnFvUzVhTXJPekFMSllzMnpXUWRRMllBUFNjeW1SbU9VMmt6Tm4zWlpMT2M1cEVwR3ZRZkl4ckx3Z3FsYlFwYWV6ZExHcHpIRFg5YTZrMmdmTTJMZkM4SENmdzdZTXo0cnNCYU1SVFFScUhNUURuODZTdHZRdGNVcVdaNU4wN3FoYXZVSjh2TlppcTlEWnZ3SFFjVGFXcWpqU0lzQXhDSXNJNkROUmJ2VW9sZDZwS2VnYW82bXFVMjJ2Yk1oTzJMMVdWYXFBc0lIV2IxcTRObElZanBWYUp0bW9WQ3VyQmlnQ1o1ejByYUZmZ1NtQlU1YXFnQldCWGdEcHZNMWl4ZVljTmFBSFlqNmRxc1BXR0ZxcUErWC9zL2IzQzdjZllyUUhZbHBwYnZUNmd1NC9iWm14RDFtdUtpbUw0aFoyZkFHWTV6N05iVmM0VUNZVjEyMVhabHZFZFhPUDlxa3FjamZGK2d5SXBWUnU1QVNOYytaNkhZN1ROQVdsZWZDaEpLS2l4ZXgyUzZNSG9zSlJRdHdXVTlsVDJDck1vVDVCV0c5WmcydHE3NUdBdEZxeEIwdGJqc0daRktMc3k5ZXN0WUJLTFpDS05YT1pFMUZtek5FM0t6TUlUNjhSY2xPYnB4TXBOVHJQWXM4emFRZE9WSmpNWGk1WWRtbGVwelJXYkZ0amF4L2xqZ2pQaXV3Tm94Tk5BaXJNSE1nQkxlL2RuOU50Z2dQVmNhV3Z4em1GYWJGNjVJNzBUaWdJazNRdmxiSW8wck42NU9sVWRLWEtucWdQTmdhcHFscS9CMGkzZjVocEpTVnlacGdRcUtqV0IxcUNhbW10bEpWWm10WCs4TTByKzFLeFlEdkFWc0ZwdUZaYVFvdFlLTGxEa0hxNndaOC9HZ0lsYk1LcDJRRlZYbzJDZjB3SVZXdktYSFdnQm9FSVZxOEMxanBJUGpSd3BPelI3K0VhMCtWTXZQUEx4emJlZGRzL2VOaXcvc3dMZHNHMWxDY2ZTdDhoMXdpQUlBRUpOampQR2x6RXJRSXgrQ2VqT3dXanZGKzBvY0lUYWpwTTVNT3RjRWN1cFJtNFNnSGFRRktseld6RGF2NjIwNWlvOTN3bHljSWJDaEtsV0piRStzMllEa0xtNTdtQ1pvYUV1czE4eml5Q1RDbnYrZEhhZDdYb0JUS0pKSTVkSmROSzV5Z3hybHBqVnFtZFpveENJSGxtWmwvWnNEODFxMFo3TGJkWnRLRXViRnJqcUFJVG0rVnFQN3cyY0VkOHRRQ05lQTZUQWhpcmR6SlZtQXY2RXA4SzBMVUFTc2RxQ3VkVTdqbkZkYzZmcTRBeTdkdzVVcVBwOUlzK2hVbEk3Z2hCSlNaUTVLU2dLazVJcUNTdER6ZVpkZ3lxZ3BMWjV0U2pPM2dKV1NtQlNzNEVwRkd1QUZzcHV1UmFZenVGYUlEcXpoUTJRRGxBVUJXdXc1QmF5WUxkZFc5QTYyRHJZQXFacXZmaW9LUmdxZGpHQURyem94OERYc0xXNDl2RU1najBzRjg5bW56YzlYM1o3dlFLdEl6WUtpWlo1emJpVnRwSldPcHVYWnBCc1FXanZPZ2NsVUF0OEtFNGZxbENFSUZSakJTTUFWRGlLenlVSFpzd1hrUXJZbWFwRWdlSWNrbkZ2Tm5BQll5aEtXTzR4UXpUZ0dCWnNLRkxKb3NTdVFqZGdDY3BxdVVzYlE4S1NDY3BrNEdTMm9oL3k2NG15Y21ZQm1mM2FBck8xWllsSTIxd21FV21yTWx0ck5xRFpGZ0k5QlpyQVA5QlcwZ0xMM0Nad3dhWUZmamZnalBqdUFScnhaSkEybGJ2QXRpb0ZscmxTWUFiVFAvMEppM3pwQlppS0NOM0pIY21kZEZhdjdxM1BBTHFqYXZjcXRVQU5oVHFHS2kwUVZhcEZTY0txaVRxVnFrcWFURWxXcUNaS0txeWhWS0hFb294VVZDbDVmcFUyd0ZvVUsxeU5zc2ExcTFiVSt3cFhFTmkzcUp3QkxPWkFSZGl2M0kxQlVZN04rOFhmZXdOY2F0ZHBvUXNVSU1jekUvQzFKYXJxbkVQV0x1dDFPNitOQXVtMUtEemRVcVpVODVVYkVYQ2J6K3RkM1JXZ1NsV2pWYmxXQ05yYUFid2VodkZENnd5STViMElwanpGZjdZR2pHaVVZL25OcndCekZaQVFoWkJadGcwa3kvdTE5NjQ2QzhCZFVXNkFNdXhZSlFyMVNBNWNFY3JRVEN4RVdRT1dSS0tVdlZLM1VaZEVXVE56S2ZxcHNEUklub2cwRkdZTFRDSXF0aXhGQVJDejBvRzF0MlpaSC9uUkFQb1VhSTZqNGgvcjBBVFdjNXZBaHRwY1Z0U1daMllydm5kd1J2d3dBRzNqUzZoU29CWWVBY0JjbWJZNVV3QllCYW9YSVlVNmxXYXZxWXJRSEtnNzNaSE1nTnBhdmxIaGEzMUxsZHBDTlhLcHlWVnJxMVROL3ZVaUpjK3B0bXExNUU4TnJGV3hLb2diUUhhcXRkNFRheFFRcWR1eUhXQU5kSXBOeU1MZXA3U2hRaFFMcUtJQXNYeFRTZ3ZJQWwySEt4ZWdOa0FzNDAzWk5tdVdMMjZKWjZaVG1KMGFMWFJjcjg2ZFJmTXoycVMxTTI3blVlQldiL3dkbXp4bnQwNXpSbTJCczg0UGpXOVZwc0FnV1FxVUFuQjFEUlh6aUJkUTlMNXViSUJRQW1hYmNJVENsV0lMU0VqdHR4MHJzWTV2WHdrMTZZQTFNTG9LcllwU1N4NnpVWldSc3dTeU1yTWdrNjRvUzBYa0xodFlycWxMSXRLb2xHMHQyUmFZZkdJOXJnQXpWR1k2RHNKcytVeGkxcllJYUE1TUFKam5ORnVsQ1FCOVFkQk5iVDQxZmtpQVJqd1pwQnRGUjhBelllcktOR0FLQU5lclV3TnFhL2R1S1ZSVnBUYUhLdUkyc0N0UlU2bG0vVmFJRGpTSGFxalRGTmNzckREQTFVSWxwVzJ3bHZ3amlYanVOVlRyT2x5SkcxaTJBQzBLdHVSYTBWaTRCdDUyTFFhQUhxb29zUFU4YWR1SEZycWVvd1Y2OVRtL0R3REhNekdEWEFQT0huNmxDcmNEWndmZ1owZGozdXE4Y1Y2Rk96dG92a0oxMWg0QW5QWDE5NTVqYk5vS1VBMSt2c1Vsb05qMXViSnR3QllnTEJZclFTTTNHUXF5QldocFg3UXRJS2s1d3dBSVU0b2cyZ1NsNVNLdHdJZElsQUFsTWNXWWJhd3IweDZXUkZOVm1tSEZFaWsxZGl3emE1dkRERXQyVFdHMnRtd0E4MXFWQ1FBRm1qT2xDYndVbW91aW9PNVpXb3NmRVp3UlB6UkEyM2lKS2dXZURsT2cycnhBTFVBQ2dMblZpL2VBNUpjQk5TRGFGaVV0VmFvcDAzRlFCMnlGNmtLcHFzRXhjcXFZcWRVQzFtSURHMWlUS21tQ3Z6Y3oxRlZrcW5BTjVRcjBnQzJGVE0xMmtXc2dhME9ybWkyNXlncGJ0S29XcUJXMVFGVHFNanJ3K3Z4aXhUS3ZLTkw2M013Vkk4ZFlMdjlaZmY3bTg1NGFaNVNwS1VtSHFjdys1T1pnOU1hcU9NV0tnUUowcGIyTUV5OHVzamxTeGxTMWFFbzFRQWNFMElwcTlMV3ZnV09zWFF0NEtpQUJMeW9xMXJBb3NzTTQ4cEpFYXRZcmFRRmxhNzhDT2xlVmtiTUVaYzBPdzFaWnRyQWtJajM1UFJFdDFPVzg2Q2VBK214Z3BxVDRBTXl0V1FCWUt3UUNXbnYyZW1nQ043VjVMbjQzQUkxNHFTb0ZMdWRMdDJBS0xOVnB3QlRvMVduY1B3V29Ja0o3M1ZNVUpSbEVlNVdxT3RLb1NqcURhaWpWMXY1Vk5iQjJhdFczMDdoYUxXQXQ5Nm9rYWlvVzN0YkJWVUZGdWNMR3o5V3JxVitsTkFNc0FHQUZxSUFWOHpBYVZRcWd3aFlvd0kzMkdGT2dDN1RndFpjNnBpMGM2dm9LWkcxK3VRekZPNDhMd05RTjBFYlFoUTh1ckFBMUZHSFRZdEN6emdxK09pSGcyL2MxSUxTM0V1M0crRm9CUkFDWUE5RDJkUG8yRmwrekJXWXRWR29VcEkvdkFPa3EwbFF0YVNoSm9oa2tzMEV2VTFiMmJTczJ6dHJnb0RUSStmYVJSbFZPWnU5Mk51eXBnV2ZBa2s3ZVRpZWRxOHNDekNQcmdRNFZqRThBSmdETVZlWldQaE13bFFsY2hpYXd6R3NDTjdWNWJmenVBTnJHNTdCNGdUbE1nYlU5cG9EQkZGaFhwOWJlMjczLzRXMXpvQUpBQURXS2tpNnBWT21nV3BXcU5QZXFRclh5dDRKMmFFQWJZRFhZT2tqWDRLcEtvVnlUdWlWN0ZyQkt3SUFsWkcwc0VJVkVyWklGbHJBMXFBSnR3UkJLOVd6QXVQVGJSVGNtOW9RbU5JcHhEYWJjUGpPeHhXWCtEQzJVNm90aVdVL1VBN1FXQkpXUmRZL25BcHFtVEhOZHZVS3dIZE1CZFRtbTlydk5PNE9pWFMrVUl3SjZDemhpUWdYZk9pQ3R2U3BKejJzdUlVbWtFL25jQnBUVzNvTXhLbUlqWjluYXNLMnlKQ0tOM09WWmRlbEZQd0ZNQUpnRE02V2svd2ZMWFc0QkUxaXFUS0NIWnV6VkJIQVdtc0ROb24xSi9LNEJHbkVGU0lFbktGTmdhZk1DVDFDblhvZ0U5SFl2VUl1UjdMcFhxSGhuVm5BdFNqS280bzE5VXAyRHF1cU9SaEhTWFE5VlZhVmhrQXBCN0JCZzFRYWtGYUxYdzFWVkthbkQwS0haV3NOUUpRd0dyUUNucXRJQUlHeGltNU9LdGNvS3dtRFhUY1ZyVTJUVUZoZjF4L2UxNEUwSU5kaHNXZGtvRUpwdFpTRTc2Rzg1cmphOXpMYmRpdFV0TEtFS1VmNWJ4aFRvTmVPNmRWeUpFbUJRN1VBSXpHQUlPQkN0clMwdThxcmN5YTNlWWhWbkI1alpxMU9abHd2c1lJM2FXYTBCVGdEWllZaW5RSElHeW1xL3NnSkhsRFVtOXY0R2xrZlNFOCtVNVFZczhRbGdyNUJ0aTM3d0czQk9ZUUlHMERrdzF3cUFnRzJWQ1Z4cnp6NGRtc0R2RzV3Uk40RE80blBDRk5pMmVuOUdWYXg5N25RZHFORzNsa01GZ0ZhbEF2Ykoxa0pWNzZTTUsxQlZLZlp2ek5sVXE2cUVuYzl2Rk92Y0NnWWNnQnZLTmZwWEFBc0FaRnRzNnJoUXNYYS9CZG9CcGtRZHRnN1ZBRzVSdHJhSWdiVUJiNnpkL2wyM3VVcFZwWlRtejBKYXlXY3VRWG5WMTVwdDJieFhWT0t1Znd2TFhKV1NBa1ZuR29oeW4wOWRGZzgxVmJkVHpYbFdHRFpLMGNjUXRWQzAvaTB3MmhwVlBRSkE5bUtkOGpPc0FCSUF0cFZrd0h4dXZmYUtFa2ZnTkFmbFRGWEdud2tmN1RzWVdsZ0NRRml4TFN3Qm9GV1hBTENWd3dTV0NqT0FDZlM1ekRqWUFMak9tZ1Z1MFB4Y2NRUG9tWGdlVEhGVkFSTHdkSFVLWEFZcUFNU1p2ZEVXS3RYdXQ2RTZWNm9Bc0taV2dUMTJxaDFZQVNBVWEyc0YxL1lLVjJ0ejVhcEtHQU9pUFhoYnlLWlFtMXJ0Mnpsb0J6UVFiV0ZZRkdoQ0NvQTEwSTMxQXJ4eFgrQUxvQjFiNW1Pd1M4emJhNlRaR2wyOHNJQ294QnlzVXpTanNXT1hZNnRpbmZyMkFCem1FQVJhRUhaakMvU2dRRFpRdGtWSEU2cXlBN0FHUmtRN2tkdTBGWTdXMTZ0SW5HTE5xY3lmUXpKK3htcTlVbTN2UUVrS0hMQ21LbVBzT1dVSlZGZ0N3RUpkK2htekFIQXRNSUducVV6Z3lZVkF3QTJhTDRvYlFLK01sOEFVc084c0JYcVlBazhIS25BK2g1cW5pZjRUd0RtVkNnQVZxdThzcjlwQVZVVG9EUUNST3dQaFRLM2VBWkFHcklDRHk2M2dQWUJOdUM2VWE3V0ZkVkRhb1lFZ2dEWElsdmRiQVcyQWJ3NWJ3RzNpNXUvSnhnNHppQUp6K05xVXFqRFRYRVUyODlhcWF2dTJscUt2WmVXMkFKMXE2MXBCVVFQSE9YaHprd2NOaFRxSFlMdXV3WEJxMzZjQXNaQTJ1UjBBQUFoOVNVUkJWQjluVUd4QnZBWkdBRmlEWTZ4RlJIcjB1WE83dFZlUzY1QThBR2l0VjhCQVJ3ZFc1b00rb29JU0NGVnB5dkpUak8xZ21SVDRyY0FTOE56bGhycjhKNEIwUlE0VGVCNHdnVmsrRTdoQjh6UEhEYURQaUdmRGRIYjZFZkI4b1A2TTN2SUZ0bFhxSmFoRzI5eitqWndxc0E3V1ZySEdtTENDY1ZjaEdYMXp1TmIyZ0tpMWhZSUZXcGdhWkFGZ3JtVHRkYWhyT2t5SGxUR3dpMjVjOUErbGIraWdwOXVBN01ZTU00bTVCdE56N1F1RnVoWFRldlBXbHBaNSt3eDZRSnNYWFFGbHZUYWxPcUh2cHlseXBoV0liZjgwR3pjSEkxQ1ZvN1gxY0FRTVhxZFRDMmJ2YiszVkdTUkxPN1BpMGRZTjZ6WFdySXB5QTVTem5DVlFiZGpTZndVc3o2bkxjNVlzY0Iwd2diT25BblYveDF0eGcrYlQ0d2JRRjhhVk1BV3VVS2ZBdHQwTFBCMm93QXlxdm5VR1dJZXF2ZlpGU29DcFZlQWFzQW9CYnpCWHJURnVKMExBUFhUZktOb0dwTVVhRmlIc0cvQjFNQjN0ZWpTMTJvTFdYcjIvZ2UydTY1L0J0RzBiS3RpR05ZQmlYTEZ4RVYxWHFNOFpJeitEaFR0bjY2WUtQYTNQdC9HbnhkeXBIVFAxQ3RPdWV5QzJhdEh1QTJpbmJod3oyN2dDeDFPMWN4c0k0dUJqRzZzMStvcGlQTEFDRHppMkFKeXBTZUFUbVBscVVBTFZjcDBYK1FBcnNHeTJsQUFWbHNEemdBbGNzR1dCWjZ0TTRBYk5sOFlOb0s4Y3oxYW53RVdnQXBjVUt2QmtxRjVRcXZhNlZLdEFEOWF3Z3R0SzRPaWJ3eldVYTUwN0EyeWpZSUUxa0ZZbHU5N2Z3eFF3VmR1K1h6L09GSzVkTi8wTzFCYkF3QktLZGo5aTJiWVNHNkI5alZpQWNkN1h4V25STmxlY3g3aWUybmIyNjJPZkIvVUkrSVJhdFA0ZW1oMFlBYlRLY2JXL1VaQ2JnR3lVNUJ5UzBWOGhXYTFYWUFXVWphcHMyNjlWbHNCNVdFWjdqSDJTd2dTMmdBbmNWT1lYanh0QVAyTzhTSjJ1VlBZQzF3TVZxQ29WZndhbWgrZEJGVGdIMWt6QWV6d1Zya0FQMEdzQTI4N1p5YjZxekxzTktEYXdCWUI5ckxXZndYQmxibXNuUndTQUk5cjM3T2R1dGUzbTNTaS9oeGRFQmRvOGpzMllEUlhhUk1Ba29nVmdIWDljektWbVhxc1VENlZ0SFlybFBSL3I3NkV0MkpuL1hOY0FFbWlWNUhXUUJENlV0aTFRQXMrQTVmMjlHaXQ3ZFFsY0QwemdiTVVzY0ZPWlh6MXVBUDJDOFJwQUJhNVhxTURUb1Fvc2M2ckFkV0N0NDF5MUFnZzd1TzNyNFFxc0FSYllnaXl3QnRwMnZiWXRZQXRVNFBidnZRMVVZQTlWcFgzejV4Y1FYcHU3dnNZeVBxc0NQZGZQUzloMmN3NDlTQStsLzFESHo0SHBVZVk5OWxBUEtMWnoyL2VZZ3pINjErQUlMQUhacmplSEpHQzJxN1g5dHVpN0JwVEFlcEhQYzJBSlhLc3diOEQ4WHVJRzBLOFVUNEFwOEFUTEYzZ3VWSUhXL2dYV0szK0JkYkRpVHlqNVZlQThYTzI2dDRYYi92OW9yaGVRdGN1RmttM0hyc0xXTytad1cxTzRFV0VwbC81UWkzZnI4K2R4TFNndkFYY3Ixb0M0T3U0TVdEdmwrUmpqMjNYTk10MTYzN2x5RFNEV3ZoNks4emx6NVFpc3d6Rk82S245dnRiTWJwMzNyMEp5SEJYL0FMWkFDYXhYeEFMYk5pendORmdDcjJQSmxvRzNEL0t2RWplQWZpUHhLa0M5VXFVQ1Q0TnFxMWFCSHF6QTgrRUtYQUFzZ0MzSUFsWEpSbHlDYmNRV1JOOHMxbmt6dTYrRHprSHZIRlMzZm9hWHhqVXduY051ZGY2bjJsYkhmK3J1MTBDNDlqTmNnbUxFeHdaaWEzQzA5bTFBQXNCTElRbk1RTm1vU3VEcHNBU2VyQzZCR3pDL3U3Z0I5QnVOMXdFcVZyZk9BT3RRQlo0Q1ZtQ3VXSDllOUcvREZkZ0dMTEFOMlRvdnJ0L1Z2ak93QlpiQUJlYXdlOWZQZWVkalZ1WUJUNGZvbTdXQlY4NC9CNzk1ZkZwcHV3cWU4emtCbnQ5cVd3dkNyWFZiSU5ZNXpab2YycjUxTUFMYmNBUzJBUW1jaDJScnZRSzlvb3orZHZ3MW9BUTIxT1gybHBLSUd6Qy84N2dCOUR1Skp3SVZ1QUtxd0dYN0YxaENGVmlDRlRpdlduL0dlYmdDVzRBRnprRVdBUDZ6YVRzSFc3dC8xLy9jNzdjQk9aOEw5UGJ5V2x4V24rOVdXOCt0dVJaemFOVDRiYjNaNHh4SVc1djBtdmVhdzlERy9yWUpUNkJDRVRBd0F1Zmh1TFpHQzBqZ0NraGVVSlBBRXBUQVpWVUpOTXJ5RldFSjNJRDV2Y1FOb045eHZDcFVOK3pmaUdzVkszQUpyc0FhWUlHbE5Rd3NJUXNzUVFzMGFoWW9MM1BnQXIyeWpaaER0MTl6UFJZZ2puamYzMjdCK1VzRnorSDNZWDNjSEh4OTN6cEFoeG40MXBRaTRFQUVnb2RZVTQzQUVvekFFbzVBYjdVQ1MwQUNMNE1rc0FRbGNMVU5DOXhnK2J1SkcwQi9vSGdHVUlHelVBVmVFNnpBT2x5QkZjRDZ5eHl5UHkvRzFyZ1d0c0JNM1VhY0FXODN0d0h1SE1iejJJTHpsNG81NU9ieHorWjZEWDdkV2dzUTFwc3R5RjRMUldDcEhJRVdqc0FsUUFMcmtBUStHeWlCSjhJU3VBSHpSNG9iUUgvd2VDWlVnUmVDRmRpR0s3QU5XT0JheUFMblFBdWNoMjNFR25UYjJBTHdQSlpxOVUvckE1ODQ1S3I0eCtVaDgwSGJGbkFmYXdCc1l3dUdFV3RRQkxiQkdIUFcxdHFDSTdBTlNHQWRrc0RuQnlWd2crV1BIamVBL2s3ajg0RVZhT0VLUEErd3dIbklBdHVnQmJiQStlZnVaUTI2RVQrZlhlZDhYSUx5MTRwTHNGdUxnTm4vbkJrejNOL2J1aHRBYk5kWmkzTmdCTTdERWJnQ2tNQzFrQVJ1b0x6RkUrSUcwRnVVZUFGVXl4S1hoL3hpbjJNYlJVenp1QVJaNERKb0k4NEJ0NDN6MFB6ejV1MDVJSDlMVVlBSHJMQnVDYitJY3hCczR4SVFJeTZCRWRpR1kwUmZ4QU44VGtpV3liY1B6VnQ0M0FCNmk0dnhDbUFGcm9KcnhDOGRaSUhYQVcwYjEwSzNqV3NCL0wzSHRRQnM0eG9ZdG5FMUdJR253akhpeFI5c04xRGU0bExjQUhxTEY4VXJ3UlY0RW1BamZsbUFGcmdNMjRpblFuY3JuZ1BqYnlHZUNyMnR1QVREaUwvTkc1NEh4b2hYK2RsdmtMekZTK0lHMEZ0OHRuaEZ1SGJMUG4vcUwvYnkxNyt2cm5FdGVNL0ZhMEg1YzhXMXNEc1hDeENXanIvNDJyKzhaUGxYLzBDNlFmSVdueXR1QUwzRlY0dlBCTmp1TFY1L3lWK1dsMzlmQi9KYXZBYWt6OFVtM05iaUx3NjhYOXJHWDFZR3ZqZys2NGZNRFpDMytGcHhBK2d0dnVuNEFwRGRmT3V2OUw3ZmFueVZENG9iSEcveExjY05vTGY0SWVJcmd2WVd6NGdiR0cveEk4VC9COE94aGp2UzREb2pBQUFBQUVsRlRrU3VRbUNDVUVzQkFoUUFDZ0FBQUFnQVYxNXNSb3Bla0RwREFnQUFtd1VBQUJ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUc1dmNtMWhkR2wyWlMxMGVYQmxjeTFrWVhSaFltRnpaUzU1Yld4UVN3RUNGQUFLQUFBQUFBQlhYbXhHQUFBQUFBQUFBQUFBQUFBQUJ3QUFBQUFBQUFBQUFCQUFBQUI5QWdBQWFXMWhaMlZ6TDFCTEFRSVVBQW9BQUFBQUFGZGViRWFJUVF3cWpjb0FBSTNLQUFBWUFBQUFBQUFBQUFBQUFBQUFBS0lDQUFCcGJXRm5aWE12Y21Wc1lYUnBiMjVoYkY5a1lpNXdibWRRU3dVR0FBQUFBQU1BQXdERkFBQUFaYzBBQUFBQSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2NvbW1hbmQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOV9Ob3JtYXRpdmVUeXBlQ0ktZGF0YWJhc2UvY29tbWFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE1YjM4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2NvbW1hbmQKQEAgLTAsMCArMSwxNSBAQAoraGVhZGVycz1gcGFzdGUgLXMgLWQiICIgaGVhZGVyc2AKKworY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMS9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiAke2hlYWRlcnN9IC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgICIKKworZWNobyAkY29tbWFuZCA+IHRvRXhlYworY2htb2QgK3ggdG9FeGVjCisuL3RvRXhlYworCisKKyMkY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOV9Ob3JtYXRpdmVUeXBlQ0ktZGF0YWJhc2UvY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2NvbW1hbmRUcmlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk2YWIzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2NvbW1hbmRUcmlhbApAQCAtMCwwICsxLDEyIEBACitjb21tYW5kPSJjdXJsICAtWFBPU1QgXCJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXNcIiAtZCBcIkBib2R5LnR4dFwiIgorY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCitjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA5X05vcm1hdGl2ZVR5cGVDSS1kYXRhYmFzZS9jb250ZW50TUQ1LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA5X05vcm1hdGl2ZVR5cGVDSS1kYXRhYmFzZS9jb250ZW50TUQ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQxYmVjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK09HTmlZMlkyT0RJeFpESTRNak5oWVdNNU56TTFPV0ZpTWpGaU5tWTJaamc9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2hlYWRlcnMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOV9Ob3JtYXRpdmVUeXBlQ0ktZGF0YWJhc2UvaGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFkYjBjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMDlfTm9ybWF0aXZlVHlwZUNJLWRhdGFiYXNlL2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOV9Ob3JtYXRpdmVUeXBlQ0ktZGF0YWJhc2UvcmVzdWx0cyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA5X05vcm1hdGl2ZVR5cGVDSS1kYXRhYmFzZS9yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2U1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOV9Ob3JtYXRpdmVUeXBlQ0ktZGF0YWJhc2UvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDQ6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzA5X05vcm1hdGl2ZVR5cGVDSS1kYXRhYmFzZS90b0V4ZWMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOV9Ob3JtYXRpdmVUeXBlQ0ktZGF0YWJhc2UvdG9FeGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTI2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8wOV9Ob3JtYXRpdmVUeXBlQ0ktZGF0YWJhc2UvdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLVhQT1NUICJodHRwOi8vMTcyLjIwLjQzLjEyMTo4MDgwL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcbiIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL2JvZHkudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTBfTm9ybWF0aXZlVHlwZUNJLW5ldHdvcmsvYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhZTY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL2JvZHkudHh0CkBAIC0wLDAgKzEgQEAKK3sicGF5bG9hZE5hbWUiOiJub3JtYXRpdmUtdHlwZXMtbmV0d29yay56aXAiLCJpc0VuY29kZWQiOnRydWUsImlzQ29tcHJlc3NlZCI6dHJ1ZSwiYXJ0aWZhY3RMaXN0IjpbeyJhcnRpZmFjdE5hbWUiOiJuZXR3b3JrLnBuZyIsImFydGlmYWN0VHlwZSI6IklDT04iLCJhcnRpZmFjdERlc2NyaXB0aW9uIjoiIiwiYXJ0aWZhY3RQYXRoIjoiaW1hZ2VzL25ldHdvcmsucG5nIn1dLCJwYXlsb2FkRGF0YSI6IlVFc0RCQW9BQUFBSUFHeGViRWFWamlPdWtnRUFBTThEQUFBYkFBQUFibTl5YldGMGFYWmxMWFI1Y0dWekxXNWxkSGR2Y21zdWVXMXNwVkxCYXR3d0VMMzdLNGFjWTJkRFFnOCtCTUplZWtwS2QyK2hDRldhZFliYWtqcWE5YkovWDFrVzlxWXNGRklMakhoNjgrYnBhY1JIbzVYRkF6a1M4aTZxRVRtbVRRdVNqeUlOb1VkMTFrT3Y3dFVtclpQZFBGU1ZZTUsxb0hKNndFS3VuZWRCQzQxWXl6bGdyQjNLeWZPdmxheVA4dTY1aGYzcmJ2c00rKzE2c3JTOWJ6WnBUVTNxM2N2enQ5M1gxMzFWV1l5R0tVaG1iTDBUVFM2Q3ZDTXNMU0czaFBVcVRaV3NlNWJZVmdBMTNGeTN5TjVMZTZYblRWVTViMUZsMXFTUXk1c0ppODNMZks4Smh0U1JrNXhWQi9aRCs0SDJQV2tYeW9YOXB3d0I3SlA3T1ljaUIxTVZNQWJHaUU0aWFKalR2NFhlZDJSMER5VlFpTWdqR1d5eVZHQWZrSVZtbjlOSFljbXpJSkRqYVlHY1lJZThvSXkvajhSb1d6am9QdUtDcHhqMXNaY1dIaGZJcE9rUVRzRkxYRlduWkVmZGsxWHBmMHdPNEEwZWIrRUwvQ2dVUTViL05wRmt5SFgvOE5DbHFUanBzNkx3cWZLUzFEeWUveU5BOWhQbFJnZjlrM3E2ZkpTVW4wTWpWeDVsbnBuTG1tWmJ5Q1BKT2JORmQrdnptbW1PN21qUUhjYTdZclFKeWRNZlVFc0RCQW9BQUFBQUFHeGViRVlBQUFBQUFBQUFBQUFBQUFBSEFBQUFhVzFoWjJWekwxQkxBd1FLQUFBQUFBQnNYbXhHQktWN2NkdHZBZ0RiYndJQUVnQUFBR2x0WVdkbGN5OXVaWFIzYjNKckxuQnVaNGxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUg1QUFBQ0FBZ0dBQUFBZ2NNVnFBQUFBQVJ6UWtsVUNBZ0lDSHdJWklnQUFBQUpjRWhaY3dBQW9jd0FBS0hNQWRKbXY2UUFBQUFaZEVWWWRGTnZablIzWVhKbEFIZDNkeTVwYm10elkyRndaUzV2Y21lYjdqd2FBQUFBRTNSRldIUkJkWFJvYjNJQWQyRnljM3BoZDJsaGJtdGhETDVMbHdBQUFTTjBSVmgwUkdWelkzSnBjSFJwYjI0QUlrbHVkR1Z5Ym1WMElpQnBZMjl1SUdaeWIyMGdQR0VnYUhKbFpqMGlhSFIwY0RvdkwzUmhibWR2TG1aeVpXVmtaWE5yZEc5d0xtOXlaeTlVWVc1bmIxOUVaWE5yZEc5d1gxQnliMnBsWTNRaVBpQlVZVzVuYnlCUWNtOXFaV04wSUR3dllUNGdYRzQ4WW5JK1BHSnlQbHh1VTJsdVkyVWdkbVZ5YzJsdmJpQXdMamd1T1RBZ1ZHRnVaMjhnVUhKdmFtVmpkQ0JwWTI5dWN5QmhjbVVnVUhWaWJHbGpJRVJ2YldGcGJqb2dQR0VnYUhKbFpqMGlhSFIwY0RvdkwzUmhibWR2TG1aeVpXVmtaWE5yZEc5d0xtOXlaeTlHY21WeGRXVnVkR3g1WDBGemEyVmtYMUYxWlhOMGFXOXVjeU5VWlhKdGMxOXZabDlWYzJVdU0wWWlQaUJVWVc1bmJ5QlFjbTlxWldOMElFWkJVU0E4TDJFK0ZLMWlLQUFBQUNGMFJWaDBRM0psWVhScGIyNGdWR2x0WlFBeU1ERXdMVEF6TFRJNVZEQTVPakF4T2pJNE5GTkJQUUFBQUZaMFJWaDBVMjkxY21ObEFHaDBkSEE2THk5dmNHVnVZMnhwY0dGeWRDNXZjbWN2WkdWMFlXbHNMek0xTXpnNUwzUmhibWR2TFdGd2NHeHBZMkYwYVc5dWN5MXBiblJsY201bGRDMWllUzEzWVhKemVtRjNhV0Z1YTJHalhMRnFBQUFBU1hSRldIUkRiM0I1Y21sbmFIUUFVSFZpYkdsaklFUnZiV0ZwYmlCb2RIUndPaTh2WTNKbFlYUnBkbVZqYjIxdGIyNXpMbTl5Wnk5c2FXTmxibk5sY3k5d2RXSnNhV05rYjIxaGFXNHZXY1AreWdBQUlBQkpSRUZVZUp6c3ZYZVlKa2xlMy9uSmZGMjlWZldXZDkxZFhlMzllTDgxdTdQRHpnNHdMQ0N6SEh0Q25FNUNLK0FrK2c2Sk85QkpKNEdFcEpNT2dYUXFIUndMQXEwV0hnUVNJSU1XTjh2dXNqUHZUTzlNejdUMzNsVjNlZmZXYXpORGYyUkdaa1Jrdm1WNnFydDZldDdmODFTbGk0eU1qTXczUHZIOWhVbExDRUhER3Rhd0I5K0dodysyQWQxQWo3RlUxN05BV3ZuTEdOdnEvZ3pnQWhYL3I2eXNWK3JzTHdDVC90OUUzREtmSHluY3MweG9XTU1hdGlxekdwQnZXTVBXMzRhSEQzWUEyL3kvN2NyNklOQ0xCL0RVdWlWd2RWYkNnLzQ0Y0IyNERGenlsNWVCeS9uOHlNTDZKYTloRGZ2b1dBUHlEV3ZZZmJMaDRZTmJnQVBBVm5TUWJ3TTYxaTlsNjJJVGhOQlhLd0RIOC9tUjIrdVpzSVkxN0dHeUJ1UWIxckExdHVIaGd6bmdVZUF4NWU5Um9HMDkwL1Voc25IZ09IQk0rVHVWejQ4VTF6VlZEV3ZZaDlBYWtHOVl3ejZBRFE4ZkhBS2VRd2Y2VnNCYXgyUTlqT1lBRjlEQmZ5aWZIN216cnFscVdNTWVjR3RBdm1FTlc2RU5EeDlNNEVIOFJmL3Y0M2h0NWcxYlA3c0F2S244bmM3blJ4cUZXc01hNWxzRDhnMXJXQjN6M2U0dkVFTDlCYUIxWFJQVnNPVnNDbmlMRVBydk5OejhEZnNvV3dQeURXdVliOFBEQjdQQXk4QzNBeS9odGFNbjFqTk5EZnZBVmdVT0ExOEgvZ0I0TTU4ZnFhNXZraHJXc1B0bkRjZzM3Q050dzhNSGR3R3YrWDh2QTAzcm1xQ0czV3ViQjE0SGZoLzQvWHgrNU1ZNnA2ZGhEYnVuMW9COHd6NVNOang4c0JrUDVoTHNPOVkxUVExYmJ6dUJEM3pnalliS2I5akRaZzNJTit5aHQrSGhnNXVCeitKQi9TVWFhcjFoOFRZUGZBVVArTCtiejQrTXIzTjZHdGF3RDJ3TnlEZnNvYlRoNFlNYmdlOEJQZ2Q4aklkOFNKdHQyNlJTQ1pMSkJNbFVrbVFxU1NMcExaUEpKTWxrZ29UYzU2OG5rd2tFNEZScjFHcU90cXpXYWppMUtrN1ZvVnAxY0dvMWF2N3hXcTJHNno3MDVZWUQvQW53bTNqQW4xcm45RFNzWVhkbERjZzM3S0d4NGVHRC9YaUsvWE40dzl2czlVM1JCN04wT2tsYlp4dWQzWjIwdExYUTNKcWx1YldaYkhPV2JITVQyWllzbVd3VFRjMU5wRE5wVXVrVXlYU0t1SiswK2pzWHlyOXdQVmpFbk8rRkUwSlFxMVNwbGl0VVNtVktpMlZLcFJMRnhSS2xRcEdpOHJjd084L00rQlNMaXlWcU5XZE44MlVkcklyWGp2OWJ3SC9LNTBkbTFqazlEV3ZZaXEwQitZWjlxRzE0K0dBUEh0aS9GL2drSDZMZThLbFVncGJXTE4xOVBYVDJkZExWMDBWSGR6dnRYZTIwZGVUSXRqYVRUS25UMVFzTndIR0FEbzdWK1YzTC9TTGNvY1VsdExEYW1jbzVNcHpRempFckVzSVZWRW9saWd1TExNek1NenM5eDl6MEhMTlRNOHhPVERNek9VdXBXTUp4M05pMFBxQldBZjRRRC9qL09aOGZtVi9uOURTc1lVdGFBL0lOKzlEWjhQQkJHL2cyNFBQQWR3UEo5VTNSMHBaS0plbnFhV2ZqbGswTURQYlR0N0dYcnQ1T1duSXRwSnVhd0RJZ2Jmd21WWmdIZUswRGV6T29JQ1l1aGN3UlZhOGZqcm1XaU5sdlZENk1pa05kajRIclVpNldLTTRYbUo2Y1ptSjBrdkZiZHhpL2VZZjUyWVVQQS95THdHOEF2NVRQajd5OTNvbHBXTVBpckFINWhuMW96SjlDOWdmOHY4M3JuSnlJV1paRmE2NlpUVnMyc0dGb0EvMGIrK2dkNkthanA1Tk0xdXZyVjFjZGEzdmxpb2pacDYrc1JObWJ2M0V0MW5xd3IrdkNGekg3d3JoaVZmMFM4Y2FIaGRMaUluTVRNMHlPVFRGNWU1enhXMk5Nakk1VFhDenhnTm9KNEplQkx6WGE3eHYySUZrRDhnMTdvRzE0K0dBS1Q2MS9IdmhXSHFCMjluUTZ5YVl0RzlpMlp5dEQyemN6TU5oUGEwY095ektTS09yQWZCbmdtd3JlWktxNnNscll4M2tPVnU3Q3Z3dlFCNGRGVEp4R0pVU3JlSVRYY2gySHd1dzhZemZHdUgzdEpqY3YzV0R5enNTRHB2aEx3Ty9ncWZ1dnJYTmFHdGF3QnVRYjltRGE4UERCM1hoZy81K0J2blZPRGdDNXRtYTI3dHJDdHQxYjJiUnRJLzBiK2tobk03Rmg0enF2cWF2Uk5uUTliQXc3Nng3VDlpOEhlOE9GWDlkcnNLeXFyKy9lWDg1OUw1UVQ0aW9FYW5KTTBBZHgrVHNxeFNJVHQ4YTRmVzJVMFNzM3VYTjlsRktwd2dOaTUvSFUvUmNiSDlKcDJIcFpBL0lOZTJCc2VQaWdCWHduOExmd0pxeFpWMnR2YjJYUDQ3dlp2bWNyZzFzMzB0blRoWjFNUUJ3a0l4dHh4MkxjNWpFL3Yxamd4eWx6TTc0NkFaZUR2WWdKcU1JL0R1WnhMdmJWZ0Y2OUx4UGtzZkV1QVhxMTB1RFVhc3lNVDNMbnhoMXVYcmpLalF2WEhnVG9WNEgvQXZ5TGZIN2t6ZlZPVE1NK1d0YUFmTVBXM1lhSER6WUJmd2tQN252V0t4MkpSSUl0T3djNThNUmV0dS9iUnYvR1B1eEVmR2Y5Nks4bUNyMDZSNk1BcmhQcDhyM2JJMGVVWS9WaFg2MDVWQ3BWeXBVcTVYS1ZwcVkwN1cwdDlac0hWUFd2TFlRQjRwV0JQcnkzZXdONjlYaXRXbVg4NWgxdVhMakcxVE9YbUJxYlhPOHgvbThEUDRzMzl2NURQN2F3WVErK05TRGZzSFV6Zi9qYjMvRC9ldGNqRGUwZHJleC9jaSs3SDluRmxwMmJhY21aSDVtTGcxdThSWFI2QkhwcXVDWGlYVkxkTHcxNzEzRXBWNnFVeWxVcWxScmxjaVdBZWJuaTdaTnQyS3BhejJSUzlQVjIwTmZUUWNvZnRoZHg2eHNOLy9WQXI5L0NLa0Z2aEZFdnV4clFxK2tWU2p5Rm1UbEdyOTdnK3RrclhMOXdsVkt4ekRyWkplQmZBcitTejQ4VTFpc1JEWHY0clFINWh0MTM4OXZiL3laZWUzdjJmbDdidGkwR3QyN2s4ZWNlWmVkK1Q2MWJkb0pLcFVxaFdLWlVxbENwVk5teXVWK2JJaTlXdVM4RGZxSC9pdzBiWUdnRjZ0NFZMdVZ5elFkMmhaSUVkN2xLeVFlNTR6Z3g4RjhxZ1FiQUxlaHNiNlczdDVPdWpsYkEwdDM2QnNsTjBLdFJDVzFiaFh2VTYyRjJ5SXNMRThhaVZDeFdBSG90TDVUem5HcU55ZHRqM0xod2pjc256akUxUHMwNjJEVHdDOEJJUGo5eWV6MFMwTENIMnhxUWI5aDlzK0hoZ3g4SC9uZmd1N2lQdmVRdHkySnd5d0NQUHY4WTIzWnZJZFBhd21LeFFyRllvbGlxVUN4VkVHN1lRMXNBZTNac1lxQy9LeHBaSFhVZUJWL01VYUdIalhkTmUxQmFXQ2d5UGJQQWZLRklwZXdCdkZLckdXR05hOGZHdDFRSS9ZRFpHejZkVHRMYjNVRmZienVaVEZvUEx1THV0Nzc3M2dTOWVyMHc3TnFDUGs3TmErR1VZNjdyTW50bm5NdW5MM0hwK0ZsbUptZTV6MVlCZmgzNHVYeCs1TVQ5dm5qREhsNXJRTDVoOTl5R2h3KytDUHcwOEMzMzY1cVdaYkZoc0krbmg1OWcvK083bVNuWHVEVTZHUnMyN2plUVNpZDU3c2s5SkJMeGRaSGxHR3UyWVVlQ0c5QXJsYXRNenl3d1BUdlA5RXlCbXVQVVRadU1wRnB6cVRxT3Q2eTUxQnlIYXMzQmNRV3VFQWhYNE1wMTRhdlhZRnZ1ODd3YkZtQmJGbGlXdDIyQmJYbjdMTXVtdXp2SDVrMjlEUFIxa0Vva3NDMUlXQmEyN2VXMWR1ZHhvRmRVdjNZYkt3UjliSVZsQmE3N3BkUzhlVjVRZVhCZHBtK1BjL25VUlM2ZE9NdmM5SDJkMUU0QXZ3djhaQVAyRFZzTGEwQytZZmZNaG9jUFBnZjhRN3paNmU2NVdSWU1iT3pscVk4OXdZR245dEszb1E4c3VIaGxsQnVqRTNyZ09QZ2F2NFhCalQzczJMWkJPVjcvMnZXZ3IybGpaYi9qdU16TUxUQTFzOEQwekFKRnBXMjQ1cmlVS2pYdnJ4d3VKZFJyTlplYTQrS3gxUU8wc1B3djhGakxmNGtuY2h1QnN2WCtTZUI1dTEzdHZsT3BKRU9EZld3ZDZpZVhhd25vYk5zV3R1WDlKV3hJMkJiSmhFMHlZWkcwTFZJSnJ3SVJnQnpsbWtaendKcUJYcXRBMUFOOWVMOXh6USt1NHpBMU9zYVZVeGU0ZlBJYzg3UDNyZm5jeFpzNjk2ZnkrWkd6OSt1aURYdjRyQUg1aHEyNURROGZmQklQN3Q5NVA2N1hsRTN6ek1lZjVOa1huMlRqbG8xWWRvaTU4eGRIdVhWbm92N0pTNmh3eTdKNDVvbmROR2ZUZGMrcDkrc1JNUUhtRjRwTXo4d3pOYnZBNU9RY2M0c1ZpajdFeXdyUXBZcVg1ckhSZzdsbFNheGpoUEgzQllmQ0MydWhZOUp1M29Od3cvMmhSeUwwQm5oMUFVRm5SNDR0US8wTWJ1d2xtYkRyZ2hJL2ZNSzJTQ1FzVXJaTlFzSS9hWk5PMnRpV25tZkxnVjZ2VkswZTlIcUZRVlg5NFQwTEpSMEFiczFsN1BwTnpyOS9pc3VuTG5yOUgrNjlPY0N2QWY4d254KzVkRDh1MkxDSHl4cVFiOWlhMmZEd3dVZUFmd0Q4T2U3eHAxMHR5MkxyenMwTXYvSWMrNS9ZUTFNMitvbjRjNWR1Y2V0MnZJcytZc0xjOUhaMGRlUjRiUCsyNkxINlh2VEFLcFVhazlOejNMd3p3L1ZiazB6UEZTa1VLeFJLRmFvMVZ6dEpQUzhBdVNWOHNGdjZRUm5HUElrdzAxVVBnbVUrQ1NQdDVvZ3lyWUlpb2U3dmlMakRoZmVaMjAwYnV0a3kxRTlIUnk3MERKam5MT0dhOTRCdmtVNG1BdkNuRXI2WEF1TjhFL1FpU0ZGOE9PVzZjVjZCNE54bFFCODZIUVNsaFFLWFQxM2cvT0VUOTZ2RFhnMzRWZUNuOC9tUjYvZmpnZzE3T0t3QitZWjlZQnNlUHJnSCtDbThMOEhkMHc1MXJhMVpudi9rTXp3OS9EZ0Rnd094WVFTQzg1ZEd1WGw3Q1FVZmYySmd5V1NDbnU0MmVyczc2T3BvWWFrNml3U0M0d2h1VDh4eDdkWWtsNjZQYyt2T0RLVnl0YTdhVjAxVjZDclVMY3ZDOG1FZkJEVE9RNWp0NHZvdFdaYUtTdU1nb1RxUFBkK3ZBYmdCV0JWbFQ3Q0s4R0dlYThreXRMbVBUWnY2U0NlVHF3SzllZHdDa2dtTGROSW1rMHpRbEU2UVN2cmd2d3ZRMXp1bTNaa0Irbm9lZ2VDK2hjdkVqZHRjT0hLYXk2Zk9VNjNVdU1kV0FiNEEvSk44Zm1UMFhsK3NZUjkrYTBDK1lYZHR3OE1IdS9DVSt3OXpENzhFWjFrV3V3OXNaL2hibm1QUFl6dEpaN3lwWkIzSFpiRlVwbFNzVUN5VktSWXJMSmJLRkl0bEtsVzlzRjNKVzU1TUpPanBhcU8zcDUzT2pwelhFUzA0TnhxRDR3b21ad3BjdlRuSnhXdmpYTG8rVHExYVc5RzE1SDFaZmh1NlpWbmF2aUFTSzNUT3h3aDZYY0ZMTXFyWHdOSlVmYXdadmVyajJyNkZhN1pwaTFoWHVPdkwvcjI3QnRtMWN6TkNDTCtDWUhiSU04ZkhyNndpWUZtUVNkbzBwUk5rVWdtYVVyYVhkd3J0NDlSNGtHYU1hK2kxQkNYc0V1bFNLeFRLZW1XeHhMVXpGem4zM2drbXpENGdhMjhGNEo4Qy96eWZIM2xndjlyVHNQVzNCdVFidG1vYkhqNllCUDQ2bm5ydnZGZlhTYVlTdlBESnAvbjRLeS9RdjhtYnZuNXllcDRib3hNVUNtVXFsWEM2VWdFUmxSc2VyUCtPSjJ4ZnNmZTAwOTJSQzlyekkyY0lxRG1DdWNVSzEyNU5jdkhhR0pldWpiRllMRVhDeFp5cW1lek5ib0xkOHU5QjQzZlFvODVvai9kOTllRzJ0bEFzM0ZNZjlrTGJwYnJ2UXdiNm9QV0RlcFVCWmRpaFVDQXE0SldYbnlMYmxQYkN1V0g0MENQQVhZTmVPeTRnbmJSb1NubEtQNU5Pa0pSOU1nelFMOTNPcitTT3B1YWo2VExUNUljSXozVUZFemR1Y2ZyUVVhNmZ2M0t2WjlpN0N2eEVQai95bS9meUlnMzc4Rm9EOGcxYmxRMFBIM3dOK0RsZzc3MjZSa3RybGs5Kys0czgvOG1uYWV0b1F3akIrTVFNMTI1T3NGQW9Mbm51U3QvbVhFdVd3UTA5OVBXMlk5dGhwekUxRmlHZ1ZIVzRmbnVhODFmR3VISjluSW5wdVNYcURLTHVacURRQ2VFdVlTL0JMbnZMKzd1VXRua1pseHFIZnFsNjdlNXhibndUOXRyOStQQXlzaUtFbU05MTF6OHhycjI3cDd1RDU1L1o1ME5RQk9wZWhnbUc5TWs0Q0kvZkxlalY4MUpKaStaMGttd21RVGFWQUV0UjZHb2NrWTU0NXZXVTZ4SlRVWWlreWVoc2lHQitmSnF6aDQ5ejRlZ1phdFY3NnNwL0UvalJmSDdrM1h0NWtZWjkrS3dCK1lhdHlJYUhEKzdGZy90cjkrb2FmUnU2ZWVVekwvSEVjNCtRempZaFhKZlJzV211MzV5Z1dGcjk5S01SQlcxWjlQVjBNTGl4bTF4cmMrdzUxWnBMcWVwU3JMcFVxaTV2dm5PYTArZnE5M05hK3RjakFyamI2S3JkMzlEZ2JvTGRRbEg0U25nQml0clh1OXJKYlptdWVqMEpWTkNiUlVEc2pIUXFKQVBRaXhDd2ZpQWg0T2tuZHpQUTUwMGs1QUZlNEVvWSttQ1U0QS9HN1B1SldoWG9ZeUN0dXRrUlhuNDBwZTBBK3FtRUhkdk1VTmR0cjF4M3lSNzdSbVZBelZzQmxCY0tYRHg2bXJQdkhHZHhtWXJxQnpBQmZCSDRPNDMyK29aSmEwQytZVXZhOFBEQlRqeTMvRi9uSHJTN1d4YnMyTDJWVDMzbUUreDVkQ2QyTW9ucnVOeThQY21OV3hPVXE5VXc4RjIrcXBsMGlrMGJ1dGs0MEUwcXFYOXdSb0FIOVlwRHFlcml1TEtnRnJ4eDZCUm5MOXhjMWJVQ3VFcTRXNFl5dHl3c29ZT2RlbUJYMWIvY0p0d1dSQ2VpVWJlRHlzQVMrU1pRb0Jqc0RPV3lQRzZDU3daekZkKzJ3SnNsNzVXWG5zYXlJWmh3eHcvc0FyajR3QmVCNjk0VmhLNzhEd2g2VTFtckhnU0FWTUttT1pPa09aTWdtMDVveHpRMXIwSmVPUmJudGpjckY2YWFWNVYvclZyaCtxbUxuUDdtRWFidlhhLzhCZUQveHBzOXI5RmUveEczQnVRL0hHYlZXY3IxNk1ncDNZUnh6TnlPbVAvWjF4OEcvaEVRTTcvckJ6UExzbmpreVQyOCt0MHZNN1JqRUN5TFdzM2h4dWdrTjI1T1VIVTgxMmJkUHUzTGdDdVpTTkRlM3NMRy9tNTZ1bkp5SHBiQVBMQjdjSGVWM0pDRi9wKytkWUx6bDIrdCt0b20zQ1dvTFVXMWE0cWRFT3hhZUxrZTdnNWQ5eWp0K1VMQ1BraUJsa0NqVDlveXQyTXEwUkNBUWJPeXFaNFZrQXRnKzlZQjl1MGVDb0V0UE9lL2dLRHpudGQrRHdJM2JLLzNqN3VJWU4vZGdkN3NKVisvczEzQ2hwYW1GQzFOU1pwU3RuSXNCdlFHeEZmdXR0ZlRJL2U3anNQWTVXc2NmK013NDdmR1lwL0xHdGdWNE1meStaSGZ1VmNYYU5pRGJ3M0lQMWltQXR1SzJWYVg1dnB5Wmo1b29Td0ZuaE5XQU1KM3pmOFM4UEZWeEw4aXN5elkrOGhPWHZ2c0t3enRHRUp5NitxTk1hNWVIOE5SNXBCZnNRbklaak8wdDdYUW5tdW12YTJGbHVaTUpGaTU2ckpZOGY3Y091KzlLd1JmZmVNWWw2NnU0bHNoQWdQa1Z0aVpUdG1IQW5kNURGOTlCdzlhZ2owRzZpckh3K0Yyd1M1ZnVldktYdDFjRXZZcW9OVGRpcXIzOGljTW9VSGVEL2J5aTQvUjNKSUJvUXk3ODhOSUJTL0R5M1o5NlEwSXR5SG9sUjhIYVpUOUJzejE1b080c0dIYTlYSDZIdkJiczBreXlRUmFCVVBMby9qemRkQ2JUU0NxUjBNUDc3b3V0eTllNWNRYjd6QzUwamtkVm0vL0NmZ2IrZnhJblZwcnd4NW1hMEIrZmMycTgwZk11cm8wMTFkcUltWTlXUDd1Nzc2Uit0Zi8rai85V0xWYSt6K0ZFSmx3ZnZPMWVVZDI3ZHZHZDN6MkZiYnQyYVoxRkxzelBzTXByZDE3K2V0WmxzM21qVDEwdExmUWxtc21sWXB2U1pCZ0x5NEJkbW11Ni9MNjE0OXc5Y2JZQ2xMZ3B3T3diQVB1WUFCZnJ3VEltOWM3M3NsSmEvVHpoWDhSVmUycmNVUW11b3U4Rml1N0V4Vm9xcG9OMEsvTWdxZm1vNFNkY0tHcm81VVhudHNmdkRNU2R1bzc1TG5zL1RaNlY5WXNwWG9QM3pmcDJuZDhXUit2eGsyVmJCelRsTGdPK3FVNjRpVnNtOWFtSksxTlNUSlM0V3Y1dE1Td3VsV29lVzNlZk5kaDlNSmxqbi9qM1h2bHhwOEZmaHo0cFh4K3BGSG9mNFNzQWZuN2J4YmVoREZMZ2IwZTNPTmd6eEw3b0w2Q1Y5ZkY5My8vUDNsMmRIVHEvM05kZHorb0JiTlM4THJpcm9DL2ZkZG1YdnZzcDlsMVlFZWt0M2V4Vk9IZEkrZXBPVXNwZVAyYXlXU1N4L2R2b2IzTi9QYTdaelZYc0ZoMktKVEROdmFWMkpFVGwvam0rK2VYVElNYW0yVloyQloxbGJzNkJqNmk4TDBJZ25qQ3NJUktYUkRzRjBiN3ZKbVBnZnRlUzYzNlV1ajVJSXdWOWFockhpUlU0LzZHTmhST3ZoT1A3ZC9HeGcwOXdWbFNvUWRUNFFZd0QrTUwyKzJWem5pK0c4REZWL3pDVlZ6NDhhQmZDcnBCS0VORnh6VUZtT2VuRWpadHpTbHkyUlMyUC9ldUNmRzRZWFZheFNKTWdkYWZ3VXl2UUNCcUxqZlBYK1RrRysvZXF5L2gvU253MS9MNWtYUDNJdktHUFhqV2dQejlzWHBnWDRtQ1gwN0ZyMFRSMXdPOStBLy80ZXN0WC96aUgvMWY1WExsaDRRUXRxWStoRkVJK2RDWHNOY0svaGdiMnJhUnozelBxK3grYkZmWUFRM1VCbVJHNzB4eFoyS1dRcUZJdWQ1c1ljb2RabElwbm5oa0c2MHQrbWZvaGZDR3V5MlVYY3JWbGJ2OE5lZTBnRk5uci9IMmUyZXAxZXJIRWFwM2o4SzJQeTdiTmtFZnAvQ0RiUzhtdlpPZDJadGVlUUhVbnZXRzZ4NmlrSmYzczlUYm9iTGN6QWU1Q0FHb1FsNEZOeUFFaVVTQ1Q3MzBKTFp0aGNlVTl5Y0V1RWZyc05jOWtjNTRBbGxCTUhyaEIrQlhLeDkrNmtSNFAwdXA2M2pWcjRDNnp2bVdCYzJaSkczTktiTHBzUFBtYXR6MjBYQkV3c2t3cnVOdy9mUUZUcjE1bUxtWnVYcVA4RzZ0aFBkdGlaL0o1MGZ1K1JSOURWdGZhMEQrM3RsS3diNWFWLzNkdXV5RnVmN1gvdHJQZnZybXpZbWZjVjEzcyttVzEyWTBVd3RMellYdmY4clVVUGpkdlozODJlOTdqVWVlMnVkOXFqVm1ySGJFTEtoV0hRcUZFb1ZGNzIraFVHS2hXS0pXOHo0RTBwTE44TVNCSFRRMXBZTFRxbzVnc2VLd1dGN2VIYi9TVjMxMmJwRS9lZk1vWXhPS2t2TFAxZFY3Q0hBN2dLMzNUMVA0cU1EM2J0YjI0NHE0NGxVM3ZOcFpUODBxSlQvMURuZlJyTlpudkROdVJ0a1NkVHdlb1dJUHBYU2s4Z2NNYmVwaDM1NnQzam4raVVHSE96K1FCSGl3allqdmpPZXZ1MjU0dmxEQ3U4SjhWK3NyNktXUGlSV2RyMVVVaENDWnNHbkxwc2cxSjBuWWRpUXVNN3lTMHBobWthWFBkWndhVjQrZDVmZ2I3MUF1cm40WTZUSjJCUGg4UGo5eWVLMGpidGlEWXczSXI3MnBZRjhyeU1lQmZUV0FseVlBZnVkM3Z0SHg2Ny8rbFg5Y0tsVSthejUvVTZHSEJaQzZYM2ZoeSsxVUtzR3IzLzB5bi9qV2o1RnAwanUrUlJKckxYOEw4bWlwWEtXd1dDS1h5d2J6b1Jjcm5qdSt2SVRpdmx1VDkvYitpVXNjUG5vQlY0aUlNcGVlQ2R0dzFhc1ZBRUNwQ0NnSzM2ZTJiVW1YdkZJQnNQVEtnRjRKRU42MnNPckRQUWJ5K0tkRzBhNXVoZlRSMWFjS0t3T0tTanY5QzgvdXB5MlhWV0F0enlGd3VZZDVHNnBYNzA4Qk8vcTdGbmJLQzl2dFhkZC85eFEzdTY2ZzlXc0hkMmVDdDQ2S2pqMC9Gc2pRM0pTZ0xadW1wU2xaMTIydi84WmlPdUVaOGNhZFcxa3NjdWJ0OXpqLzNpbmN1K21jV3Q4YzRGOEFmeitmSDdsbkEvZ2J0bjdXZ1B6YW1RVDZCNFg4U3RTOHVSNjNMVTE3d0QvKzQ3LzQ0cmx6Ti85ZjEzVUhUT1h1TFUyVkZCYTRjY0FYd3Vzdzl2UUxqL0h0Zi80VjJydmJUWDRvcVl0UFlrVG8xM2tsaFlCQzJXR2hzcnEyOXJxbXdTdyt2b21wT2I3NmpXUE16QmRpMWJzS2JoWDhFdUt5MHgwb3lsN1p0djE4VWNHdTlzQkgyUWQ2TmxxRVNyMmVzOFJzdTQvKzNFVmtUVlgxU3dQVEkxR3V0Wm1QUGJjL2NMRkxpQWsvTGhsYkFHdy9FV3F2ZXVHNmZ2Z1Fia0U0UmUyN3ZvY2c2SUV2NXpVdzByUWtxSlZqRWRBckZZZTY3ZnNtelBIRzMzZTBwc2cxcGJ5SFVTZCs4eHBMcFRWdS8vekVGTWUrOWphamwyK1lEL0tEMm1uZysvTDVrU05ySFhIRDF0Y2FrUC9nWnNKOUpaQlg5MU1uREN0WW11djFURnk3TnBiNnlaLzh0ejh4TTdQd2VYbE9iTHRrQlBEMTRRNndaZnNtUHZPOTM4clE5czErUW5SY2lwamsxUVZTWE1JQng0V0Zza09oN0NERTNia3c0bXpaTjkrL1ZzMTFlT2Y5ODV3OGV6V0FlVGdrTHNaOVR3aHYyNmUzREFOQ0FiMWFhVkFWdTdHdXRjZUg4Y2h3M2pLOEh5MS80ekk3QnZScU1lQUc1Q0dpTm9VU1htN3YzejNFNEtiZVFJMnJ4NFBwYjBFN0oreE5yMVFLWks5N0VRN1ZDOVc3M240dmg5aHBvSTlVUXVKQkhTQTJOb3g2bjB1Y1h3Zml0Z1h0TFduYW05TWtiS0xobFRobHZHcWVodnZxcGMrNzl6dVhybkhzYTI4eE43V203ZlVWNE84Q1A5dm9nZi93V0FQeWQyLzE0TDRjNUZmU3MvNXUxWHlzZmVFTHY3ZnpxMTg5OGkrcjFkbytpQy9VcEptS1hnZDhlTHl0cllYWFB2c0tqejU5QUR0aEI2blJGSXVTU1BNdFcwbkNxNDVndnVSUXJMZ3hKOVR4Q2hqYjlkOXVzZVNtR3FISFk0dlJPNU44NDYxVEZCWkxIclR0c00zZDlpVjduSHZlVlBnV0ZyWXRFSVpxTjFWK01ET2UwcWt1Y09PcmFUUHZXMjJ6cjN2LytpMUxnSGpyeHZzUmhGSEE0OE1tWWR1OE5QeVkxL2NDQ1dzZGZHcHZlU0JROTBIbnUwRFo2KytaQkp5clZBaGM0Y1Z2dHVlNzBoTVFnYm54VHNjby9aV0VpU2g5TGJ4NlRYK0hCVzNaTkIwdEtXOHFYZVdjdW5rYzR6R0p1NjdjNTlTcVhEbDZtbFA1OTZpVXc0ODFyWUY5QmZoTGpYSDFENGMxSUw5Nk00RytGTnhYQ3ZubFFML1Vja243c1IvN2hlKy9lWFBpeDRVUVRiRXV3MkNmd0FTOERLY0NQNUZJOE5LM3ZzQ0xyenhQVXpac2Q0OVQ3SXBtOGhLc0ZMeDF6WUpTVmJCUWNpalg0bU85bHhha1ZYN2xUVURRVGc1VXFqWGVmdThzbDY2TWFncGRjOUY3RVdpOTdySEFFaFplUDYzb0xIanlSbTNMVVBsQnl2UUtnWkRuU1NWdmhiUlFPOXN0MStmUkJMbjJIc2c5cm5yTVczUDlBeHY2dXptd2Qwc0FzZUM0Q2x0RmthcndEaFc3QkwvdUFSQkt4enRYeHVOUGY2dStrNjRJM2ZqaDllckRYTlpudEdOQ3I1amNyZHMrN3RvdFRVazZXakkwcGUwWWFLdjVYMS9OUnlvQXl1KzJ0TERJNmZ5N1hENStqalVzejZmd2h0bzFac3Y3a0ZzRDhxc3ptM2l3cjBUVkx3ZjVPTkFUczA3TWVtVDc2MTgvMnYybEwvM3hQeTRVU2krcCsrTTYybm5MdU1KTVYrOUQyemJ5WFovN052bzI5RXA1NjRWWEVuQjdmSWIrM2c3bEFtR0lzS0FOVHlnV3Ewek5MREF6TzQrRHpZYU5BMVFkSlkxMUlQVkI0Vi8zclJjaEdEMEFLMWV5OFBBcDROcU5jZDU2N3d5VmNrM3JkS2Yzckpmbmg4Y0N1UHZYVVYzMWZvMGloUHN5Ym56OE1HRitpQ0NNbXVhVlpJYmV4VUdwNEtFOFFnMldIb1NlZVdJMzdXMHRYaHordWZLWThNOEpaNzRMQWE0cGVQbkJtd0Q4U21YQVYrM1NKYS9PY3gvRTU3K25hbnQ5QU41bElGbmZMYTVBUEhKc2ViZDlYQ2U4YkNaSmR5NU5KcFV3UENkeGFRbjN4YXI1NFBRd2pzbnJOM24vOVRlWm0xclQ4ZlcvalBkMXU4SmFSdHF3KzJjTnlLL01WTlcrbElwZnptVy8yckh5SzFIeGtXTDhuLy96My9yazhlT1gvcUhqdUYyZ1FEV3dtTUxNY0NXR1Nna3ltU1N2ZnZmTFBQbjhvOWhKZll5d0NwekZZb1hEUnkvdzFHTTdhTlpVdnYvUEVwUktOYVpuRjVpYVdXQjZab0ZpdWNMMFhKRkx0NlpwYlczbHo3NzJmUHhOTGJIM2cxdDQ3eHJUTllCSzZJZHBLWlhLNUErZjRkYm9wRFpVemc3QUhIWGZnK3EyTjhMNUNiQVUyTXQweURxVjJnWWY5cWpYOHlYWTlKL1BTbjdoeXFmaEZWVnF2aWU2WW0zT1puamgyWDBhNEFLd0tZbzliRnNQd2FncWN3bTFFTnJ5MnI1S0R5b0xQc3pOU2tETU1XMUszRmlJNiszemNRcDdSWlVFTGJ3YXIzcXV1aTFvemlUcHptVklKOVg1OHVQU3NySTBxT3UxYXBYemg0NXc5cDFqYTlrTC96eGVwN3pHWjJ3L2hOYUEvUEptc3p6ZzF4THk5UlQ4c29DZm1WbEkvdlJQZitsdmpvL1Avc1dsYmlpdVhkRS9vcmxCQWZZYzJNNnJmK1piNk9qdUNHZ2hJSFFQKytkYldGeTRNc3JvblNsNnV0dlp0MlBRTzZha2NIcTJ3SkVURjRNQ2ZYcWh5S1ViMDB6UGV5TjNNdWswZi9YN1hvMmtkem1YODFxYjN1bE4rUHVDZ3pwb2dRdVhiL0h1c1lzNGpxT29laC9vMm9RNENyQnRLN2hPY055N1lBQndDeS8vTkxlK0JubWxFcUxsVVVoNWRmZUtZQzlVNkNoajVDQndvVXZic1cwalE0TzlFZFVwdDBObDdzY210LzBMYVRQY1NiajdGUUxaeVU3ZzRycG82bC9DWEtyK2NLNTdBL1N1bnlvUjNudWNHbFlCR3FmSVpSYXMxRzBmVndIUTB1R0hiOG1tNkc1TmswcmF5bTlMcVRTMjFrTlJBQUFnQUVsRVFWU28reUlWRlZYTnErbjBBczZOVFhEa0syOHlPVG9lLzZCWGIxWGdiK2Z6SXorM1ZoRTI3UDVZQS9MMXpWVHZKdFRqd0w1V2tGOEs3ckdRUDNUb2RQY1h2L2hILzArcFZINmkzaU0xZS9WRzk0VXUrcGJXTE4vMloxNW16Nk83c0d6dmEraEx2U2xWeCtIZDk4N2orQjJnbm5wc0I4MytXSG5ocC9USThVdk16QldZV3loemFYU2E2ZG1pOWpFU0lRUi8rWE9mb3FXNXFlNTFJcnhmYlEzQXlCeTVGYlovbTlQSG9ua3NRa1VkSnNnQ0ZoWkt2SFg0REJPVGMvWGQ5OGh0WGRsYmFqZ3NKVDJoNHBlVkM4dFNyK3ZKZExWTjM4d2x0YTFldmQ5b3ZvU3I1clMycHJvVnJuZk5GMTk0aEtUdjJRa3FoLzVHT0NHT2hCUEJ1NlcydlFzSU8rcEI1RXQwa1I3M0VaZ3I3NDg4MXdEOXl0ejI2akc5OHF2ZVYxaFpDTTlmTWw2akFoQ3RDRUJyTmtsM2E0WlUwdFlndjlyckJFL05EK002RGxlUG5PSmsvakMxNnBwTmJQZWJ3Rjl0dU84L1BOYUFmTHd0Qi9mVnVPelhFdkt4Z1ArMVgzdjlzVzk4NC9nL2RSeW54N3dSOC9HR3p6dW1JUFBYSDM5Nkh5OTkyekF0dVdZbHBHcFdzTk9EdjZCVXFYTDQ2SVdnRU8vdGJtZlB6azJlNmhjd1BiUEFXKytmNTlMTkdTWm5GN1VDV2w3YkZZS1hoeDlsMTlZTnBGS0pGUUY4dFNJLzdtMVhPN2haUHRWVmRheTJod2ZRRmZqcklnZ2pCSncrZjRNVFo2NGkvRGgwMkJ0cTN0STcyc2x0ZVMyemJWNU5iNUJXOUJkRUM3RGtYUnNobENBQmxHSlVMSGpQcWJlN25VZjJiUTJlb1l4RGhwWHZnVlRiNGZGUTdlc2Q4UXhvcTZBWFF2TUt5RzJ6Tjc0MzlXM1loaThnMkZlLzdYM3QzUFlhekNHU043R3dWdFp6MlJUZHVRekpoS1UvRDFFdi9YWFV2UEhjaWpPekhQdVR0N2g5OWVheTc4RUs3UVR3NS9MNWtRdHJGV0hEN3AwMUlCODFFK1p4ZjhzcCtyV0EvSXJVL00vOHpHOSs5c0tGbXo4cUJQR2ZZVU12b00zOWFpSFYycHJsTzc3bjAyejFQd0dydXRvRE9hNGtRSTNWZFYzZU9udzJLT0FRbnByUE5tVndoZUMvZk9VSUp5K01Cb3BMVmU5Qkc2dGYwTHV1b0NtVEl0ZWFwYTIxbWRhV0p0cGFzK1JhbThubHN1UmFzMlNiMHZWdWQxV21aYTQ2OU14VTdpSU1HRkh6UVZ4ZXdObTVBdmwzVHJPd1dBcGdYVytpSEZBNjVmbHBzTlJ0MUdQS3RaUmFpRllKaWJ0QjFlcjgzSVZ5SUt3SGhrQUxzT0VENTdFRDIraHN6eW5LMW5EVnk3QWloRkZVeWV2SFhDVU9BVUdQK3lqTXcrMWdxbHMvdkt1bzl3RDA4bHNMeXIwdEIvR280bzVXZU9xQk8rNWNyUUlRVTltUSt5MExPbHZTZE9ReXdhTmJyWm9QOWl2WGRGM0J6Vk5uT2ZhMVEydWw2bWVCL3ltZkgvbXZheEZadys2ZE5TQWZXcHhhWDB0RmZ6ZVFyd2QzYTNKeUx2MXpQL2NmZm54cWF2N2JWM0p6cGp2UFc0YmJ1L1p1NWRQZi9VbGFXbHUwQXQrYys5eUVPOHIyb2NQbmNGd25LSUQ2dXR2Wk5OalArYXNUL1A1WDM5ZGdia0llRVJiU2FzRmV6NUtKQkxuV2JQalgwa3l1dFltdG0vdG95cXlzQW1CWlNwdTEwYjV0RVlMZGlqc3UwMmJKWEFyVnZBVWNQbjZSUzFkSHRiSHhtaHZmZ0xzY2JxZDFzbFBBcithL0ZVaDhMZWtCNURXdXgzQWZDTlZmc0JrSGVXL2hHdTlPSnAzaSthZjNlcFZBRWNLbnZxTDNkb1p0OCtxMk9VZTlCTE1PZXZXZDBkOGoveXQxQXUxWUhPaUQ5OHhQVHl3bzZ5cCtGZGIxS2d3R3ROWDF1T3ZHcUhrSjVZUnQwOU9XSVpkTkxaTTI1Ync2djNFMUxZV3BhUTcvd2RlWkdWdVRiOWNMNEtlQmY1RFBqNno5L05JTld4TnJRTjZ6bFFCK09lZ3ZCL3VsSUMvM0UzTU1jLzN0dDA4UC9OWnZmZTBmbGN1VlhaRWI4VXY4dU9kcUZrb0FJcEhpRTY4OHd4UFBIaUNaU05SVmZoWkVsTDJ3d21NQTd4MjdSS2xjUVFBejh5V3Vqczd5NnN0UDh2VzNUakkrTmFkOHZVNHAwS1hTVUlEdkdrcC9OZmI0L20xODhtTUhsZzBuN3llQXBqQUFyM1FzRE56aUN2UUZHT1BZbGJ5dzRQQ3hpMXkrZHNkdlp3L0JiSDV2WG9PN1doa2d2SUFLZXUxNGNFRWpuWEUxc1NXczNvZDlOTGdwbFlLdG0vdllQTmdYVmFZU2xnckFCYnJiWFFKT2YvNUtwUS9DS1c0RGlDdUFYZ0wwcmhKZWZzZ21xQUFRVmlMakliNDZ0LzI5VVBOaFBPSHhiQ3BCcnNrbWFVTTJtd0ZaNlY2cG1sZWZnMzk5cDFialRQNHdGOTg3c2ZTTHNYTDdNdkQ5K2Z6STlGcEYyTEMxc3dia3ZXSXl3UWNEL04xMHdxdTNqNWd3Y2gvLy90OS85ZG0zM2pyMTkxelh6V2szVWFmOTJueSs2blpYVHdmYm4zcUVwbXpheTRSa2drd3FTU2FUSXBOSjA1NXJwaVdiaVNwM0NYY0JVZ3Rid1BHelZ4bWZuT2ZLNkF4VGMwV0VnUGEyWnFabkZwU0NYVUpkQWZrSzNQZkxtNWVPWk1MbUwzL3VGVnFhOVEva3FQZXR3enhHd1JOV0FMemRVbDBMRGZCZXhVQ1puRWJHSVFTSGoxL2l5clU3WUtIM3RQY2pEZHJlVGJpYncrblVOQ3JLUDRTODUyc1I1cjFvdWFMa1Ewek94WGJJakRubStoM3VubnR5TitsTUtnSXpHVFJzZzllaHBYNWVObmdmMUhBcXROSGZBYmtrZUU4dzNoTVFCdWk5eXFLdTlOVXc2djNwRUdaNVdHdm42dkVFKy95Y05NRWRCMmk1M3hXQ3hVS0p1YmtGNXVZS3pNOFhxRlpyZExjM003U2hrNjdPSEcxdExUUmxtNVpVOHpLK01DMUd1Z1NNWGJuTyszLzBwMVNLcFppM1l0VjJFZmp6K2Z6SXNiV0lyR0ZyWng5MXlDOEY4VGp3MTFQOHk2bjRPT0F2cGV5SjIvNVgvK3AzUG5meDRxM1BXL1dJdmdLVHovdVJwL2Z6MkxNSHVIWnJBdlVWMEFwOG9Mc3p4NmFCYnE4am5HWldDRGJoS2FWdnZIT2VJMmV1SzY1UnRiMDFCRGhLQVIyMnIrcHprWWNGdUxVSzBIdjI1Q1BiZU9tRmVEV3Z3aHhDUlIzc0V5SnlYRDBQUWFTOVhsa0VsWUQzajN0S1h2MG9UZlI3ODk0WjNzSVlUcWVBWFUwakdMMy96UVFRcGk5SXY1RjFSclV2OXZtTGNFZTRzR0JqZnpmYnRneEVRT2dxRU5NQjdnVlF4NjFIaHRZcDArQkdRTzlHejFuSlpEaEJPRmRDM3dlOTYzM1RYbm9YNmlyaU9tcDdPVmpMUEZ5eWdxREU0N2d1OC9NRjV1WUtBZFFkeHcyT3EyYmJGaHQ2Y3ZSMXRwQk9wOGpsV3NqbFdraG4wbld2Yjk2VFdwRVJBc3FGQWtmKytBM0dyNjdKQjIrS2VOUGgvc2UxaUt4aGEyTWZaY2l2Qk9yM3NoUGVVcERYUUYrcDFCSS8rN08vOVNOall6T2ZBVjIxcnhUMzhqR25NMmxlK2E2WDJMWmprTXZYN2pBN3Z4Z0VFRVpZK1c3WXRzMUFYd2Y5dlIzWXRpMDU2SVVCcW83TFhFbnd6ZmZQY2U3eWFLQW9aSUVicWkrbGM1VXJZa0J2RHBOUzFaaW8rODF6MDVKSm03L3lQNzdpVGNoam5HTDJwSStvZG1NZExBMzhPdUJEZ0dydWZlQzlFNWU0ZlBXT3I5N3JmN0Ntbm1xWDQrdFJWRDVFbjMwQWNVc0NYM2s0S0pVQXc3UnNVZVM3QklGYUxLUlNDUWI2dWhqbzZ5UVZ6TllXb3hBRDVTNlBoOEJXMWI3UVZMcDM0WERXT3plb05BYXozQ250NnQ0MkNOejRpWEtVSVhqeTYzYnF0TGR5N252SHY0NEpjVk5aMTRPMXpNUGx6dFgzQzJwVmg5bTVBbk96ODh6T0ZWaFlXS3hiZ1kwRHZRQ2FtMUpzR2VpZ09aTUNCT2xNbXRaY003bGNLNmxVTXFMbWw0SThmaDVkUEhxS3M5LzRKbXZBQXdIOFJENC84ak1mTktLR3JZMTlWQ0cvRXJndkIvMDRWYjlTUmI4U3lGc0E0K016elQvLzgvL2w3OHpORlo1UlZSem9CYjYzSGE3SFBkWU5td2Q0NVRzL1FXdHJsbXJWNGRUNTY1cXFBS053VTB3SVNLZVM3Tit6bVlRZGZuQmpvU3dvVmIwUytzVFphLzd3TVJYYXNrQVBsWm81Tmw0TnA3dnYvZk5jY0JUb3I4U2VlbXdIbjNoK2Z5Ui9kSUFiKzlDUEMvUmU3YUdhRnlHVVVVNFNNcXpnL2VPWHVISmpETnV2SFppS0h0QjYybnRMTHpJVDd2cGtPQVRYRHBaQk9rS3ZnM3lDMmpzU2szWENPS0JDSzlmYXpJYUJMcm83MnJCc1U0bUd6dzdDZDBqZEgxY0pjTTB3UHBEVlNrRGdsaWNlOUFKOGlMdmh4RGxDNEFUSEZOREhLWDFYYjhQWDd6dmViZjlCMUh6TnFYSDE2aDJtWitZb0ZJbzZTS01jVnc3RlF4N0FFdERmM2NxR25sWnNLK3djbThta2FXNXRwaW1kSXQyVUpwbEk2TjRERE1BcjZaNGVuK0w5TC84SnhkazErYkxkL3cvOFNENC80cXhGWkEyN2Uvc29RbjRwa04rdG1sOXBKN3lsMWlOL1o4OWU3LzYxWDN2OXAwcWx5dmFva3FzUGVOWGs0MzNpK1VkNVp2Z3hiTzhMS1l5TnozQjdmRG9TRHNMQ1FOdnZsemRQUExvTjI3SW8xMkNoVkZORklCY3YzK2J3OFF2eDQ1ZUZ3QldXMXY3ZTJkSEMwSVllTGwyL3c5Uk1JYWdNQkJPYkxBZjZKYndZcVdTQ0gvZ0xudzZHMnVtd3RtTDJvWFRFRTBvb0JmNWFCVXVOU1NqN1BEdHk0akpYcnQvUndCNkEyUWQzM0VkdExFVFlTVSt0Wk1TMHo4dHgrOEcxbFo2UlhpVkZSUHRxeElGZWVmaVdiZEhUMWNhRy9pNWFtcHNVWldyQVRWR3RtbHFOVWIrcTY5N3MrS2IydU5jNzBnbmx2RkQxdXlKMHRRdER0YnV1RzZiSlArYTU2Nk9nZDF3OXJuamxIYTZqcEVQTk03TUNvSjByQkpOVGM1dzdmNDF5dWFLQlZzLy82RE1KSDVjT2VxRWZKSk5Lc0hOekozMmRyVGl1b09xNDFCeVhXczF6K1NjU0NkSnByNDlOSnBNbWxVNlJTcWVrenlkU09hbVV5eHg5L1UzR0xsNnBuNmlWMjVlQnorWHpJd3RyRVZuRDdzNCthcEMzQ0VHK0VzQ3ZCUHBMS1hvVDlpdUdmRDUvY3R1WHYzem9KNnZWV3JlcTRMVk9XTUV0MWJkVU9zVzN2UFlpUTlzM2FmdlBuTDlCdFZaVEZJbTNYMWhDNlZDbkYxaTJiZlBvL20wc2xCMnFOYTBxZ0JEdzd0RUxYTDUyUjI5L3g0cnBMUzg0c0h1SXh4L2RodTAxVERNMVUrRFNsVkV1WExuTnpGekJtUFJFK0pXRDFTbjZaeC9meWNlZjI2Y29Zd1BPaGtMWGxMeHkwRHN1bEdQNnlacDNRQWdjMStVYmI1OWlkcjZnOWFZUFhQVllZSHZYaUJzakwvL2tjemRud2JNc2VWM2RzNE1mQjBLL3QyVnpTa0E2bldTZ3I1UGVuZzdESlIvQ3pBUzlEajBmNm40NEUrWVN2TjdURjNxUGV3bDEvd1N0dlYxUitzR3dPdG5XamduNnNIbEhDSUVUVkJ5TVNtTHdMaHFWaG1YVnVncHp0VUlUclNEVWFnN25MMXpuOWgxbHFGcFFJVGFlaU01eEFITE5hYnJhc25TME5kR1p5OUxkbHFYVC8rdVN5MXlXcnZZc3Jkbm9rRkVCT0k1THRlWlFxVHBVYXQ1NnRlcFFyYm5VWEJmSEJjY1ZMRlljWmdvVkp1Y3JUTTJWbUYyc2NQRzlrNXg3NjUwVk41RXRZZThEMzluNGJPMzYyVWNKOGlyZ1RZRFhXMThyUlIrM3JBdjUvL2JmM243eXpUZFAvb1FRSXF2Q1BMNWR0ajdrTzNzNmVPVXpINmV0WFhiRTk4TE9GeGE1Y24zTTJ5VkxaWjhHOG0zUUZieFhjTTBYcXp4eVlJZWhQQ3lxanNNNzc1L2p4dTBwM1ZXcktDaFp3TGMwcHhsK1poKzlQUjFLL0lBVkFtTjhhcDRMVjBhNWNQazJjL09MR3VpMXVjcmRwVDlGbTBvbCtmejN2VXEyS1JXR2kzUzBrL0QwTnVwV0F1VFNyQmpJclBQamNCeHZVcUNKcWRrQTdLcXJYaXA0WFpXcmNGZUI3ODlTb0tVNXBzS0hWTzZxLzBFTlUrYzNMaURYMXN4QWJ3ZGRIYmtnRXRYRjdpMmpvRmNyZnhKd3diYUVPL3E3QU1xc2Rzb3gvV3QwNnFRNGZnVUFFWGJBQytBZTdYem5DbGtaQ0NzTyt0RE04TDBKS2cwaWRQT3ZWTTBUM0s5ZWtaSDdKeVpuT0h2dUt1VnlOVGJQWmY2Mlp0UHMzTnpON3FGdWRtM3VadnVtVG5vN211bklaYjM1N0QrZ3lYUnBsV3pEUSthNitpZ0ZnRXJOWldxK3hPaWRHZDUvNHoydVhMckZ6WnNUakkvUGNwZTh1QTU4SnA4Zk9mNkJiNnBocTdhUEV1UVR4S3Y0cFFDL1d1REhBWDVWa1AvMVgvL0txeWRQWHZraElCRjByQ0lFZ1dlNld6Yk9kdTNmemdzdlBVVWlsZlRQQ0FOZXZUbkd2UDlSbUtEdEZoRENDdmNvQlZ5MTVuTDk5aXgyTXNuSG45K3ZYYjlZcXBCLzl3elRzd3ZnOTRUWGxKdWkxTFlOOWZQTTR6dkQrYzVsSkZwaDZ1UFc4Z3JNVzdjbitkcWJKNWllSzBSQUx3dXZwV3pUaG02ZWVYd0hPNGI2L2M1c3VpZkVNdGFGcXB6QmgyeW9pTU1LZ1pLanZzcDNIY0ZiaDg4d05qbW45NlMzaU4xR0xvbURPOEZ4dFlWR2MrR3JDait1ZjRiQWVFRzh2TEl0bTU3dU5nYjZPbWhXaG1JRklaWUJ2UVk0Q1dONXZnRndEOXJlTWZWenNmZ3FQVlR1SWNSTjBFdDQ2NkRYVmJ2YXo4UHMwS2wxdkpNVkFBWDB6aXJVdkZySmtma2lqMWVxTmM2ZHY4NmRPMU5CWHN0ODZlOXE5V0hleGE3TjNld2E2bVpqanpZS2RrMU4vdjVpTzdBS09ZSkZyU0RKMzVZNkVzRUxXeWtVcVpUTGxNdFZidDJhNU9iTkNTNWN1TW14WTVlWW5WM3hGUFp6d1ArUXo0LzgwVDI3NlliRjJrY0Y4aXJnVlhqZmpabzNqMWwxd3EwYThyLzBTLy90YzFldTNQNWVWZm5GRmVUMVhQV1daV0VuYko1LzZTbDI3ZHZtaDlEbGFLM21jUGJpemJEUVVreDlGV1FCWFNoV3VYcDdobXJOcGJlN25lZWUzT1VyUnBpZUsvRFd1MmNwbGF0QkFXNE9oeFBDNjdEM3pCTTdHZHpZclhzQkJBZ3NmK1kwQ0FwR0VSd09YSjl2SFQ3TDBkTlhjVjFYVXlaTGdkNjJQZFZzV3hhNVhKWkg5d3h4WU85bVdwcWJRdGU4b3VnbFJDTXVlQ1czNWNCQnd5dU82M3FBSDUrWTFZRnVoOUEydnpNZktuc3Y5Z0Q0dGc3eTBLVXZBbFVmNldWdlBHZExQZWhuVHlhVG9yKzNnNzZlZHBJSk8rcTFRWWVjK2p3MEFBYlBUb1ZjdUs0Q1VtMXpsL0VINnQ0SGQzVGNmUFE5VW9kYUxnWDZDT0FObUpsdWZjMkY3K3BwMUJSOEhkVXU5NCtOVDNQbTNGVmN4MlhyUUFlN2hueVliKzVtNStZdTJscjBlUnZ1cFVWbWxuVERTcE5hVVk1Q1gxZjdRa0F5NlhYY1c1eGJvTGl3R1B6K3ZLWExoUXUzT0hMa0FrZVBYbUp1YmxuZzE0QWZ6T2RIZnZYZTUwTERwSDBVSUc4Q2ZUV3d2MXYzL1VvVXZiYitpNy80WC8vU2pSc1QzNlcxeFVaQUgrK3k5N2FoSmRmQ1M2KytRSGRmbDM1TVdSK2ZuR05zY3NiYlVBdDMvMTlRakFzWW15NHdObDBJZWpSdkd1amk4UU5lNVdIMHpneUhqMStrVm5PMFF0bFVWdjE5SFR6N3hDNnltYlNpRGhXS3lvSXpXQThublBIMmhUMkhyOSthNUN0dkhHVjJmakVFZlFBSi9UMjJMTEJ0RzF1cVlkdHJDMDhtRW16ZjBzK2plN2V3YVVOWEJPYXFzdmVaR3VhaHBlYWxoSzRQK0hmUE1qWTVnNjA4TzIzNG5OYlJ6bFR1eHBKd0dVSTk1dm1MTUUyUmlYRDhsVVRDcHJPOWxlNnVOanJhV2pBdGdGbmN0bGJaTWlwZ0NwQk40S3V1ZVZYNWFuQTMxczJKYnNJdzhhQVAyOVNOdVJja3hKWDFVS0ZHWGRSdVpEdGEwWkdWbkRnMTc3b095Y29pdXplMThlU2VEV3pmMUVrcWFjNHBjZjlNemltaHppMmhldFBDQ3JMaTBSQkNPUmJtUlNLWkJFTHZYS1ZZWW41cUJzZHh2Ykg4UWdUUWR4eVh5NWRIT1hic01pZFBYbVp1YnJGZUVnWHd2K2J6SS8vNlBtWEpSOTRlZHNqSGdYeWxzSzhIK0tXZ0g2ZnE0MVI4c0hSZFlmL2lMLzdYSHhnZG5mcFdFK3dtQUR3ejFieDN2TGUvaTArOCtnSk56ZGt3bEFYVlNvMWlxVXl4WEtWVXFsQXNWWFJGcHF6SVFxM211TndZbTJPaFdBa0xhZ0ZiaC9yWXQzT1FTOWZHT0hudW1sZjRCUzVZdmQzUFR0bzh0bmNMTytURUtlcjFnbXZwKzdXS2hreVRwZXdEeXRVYTMzajdGQ2ZPWHRNTExWZG84U2NrWUcxTFUvUVN1clp0MGRuZXlpTjdodGk5WXlPWmRESUV2aUtITFQ5bE92aERvRHF1eTl1SHp6STJNZU5WSkN4VnVadHQ4ZDZEaTNQZnErY0Vibm5EZXhONkdTeTBFUUNXbmliTHR1aHNhd25BYmlkc0xkUFYvQTFYVmRWS0FESTE3Mk1CanduN0VJcG1oenVFWHlFemhzeXBvRGVWdnVtK2w3Q1dGWUtJUWdWUU90bDV4enozczZPb2Y4OExKS2U4OWM1MUREV3YzcXVhSDUyNUREc0dXdGs1a0dPb3Q1bE1aS0tvOVRFVjd1cFNDRzh3cU40V0g2L2tKZmdUeVFTV1pTbGh2R1d0VW1WMmZKSnFwZXJsb2VNaWhJdmpDRTNsWDcxNmg1TW5yM0Q2OURYbTUyT0IvN2Z6K1pGL2RyL3o2S05vRHpQa0xlTGI0ZGNLOW5lcjZJTmxyZVlrdnZDRjMvdmhzYkdabCtxRDNTenNUUVZ2TWJoMUl4OTcrV213TElyRkNxVnloVktwNHJ2UmxlOUdCRzd4S0hEbDFLaUZVcFViWTNPQlFnK25LSVhkMnpmUzJkRksvdDJ6bnFwUkNnQ3ZNUFRXTzlwYWVPYnhuYlMyWkkzckNDMGRzdHVjRHZ3UVJOcXI2WWVYQmU3bDYyTzgvc1pSNWhkS1FlRWxsWXR0S1dEM3A1SzFiUnZMOGpvNnFERHV5R1g1ekN0UDA1Ykxhdm1yS25lWmJhcktEd0YvanJIeDZkQXRyMEhjaXFqMkFPNGU4ZjNqTVlvZUt3YnM0VE8zckRDTjhwN2IyMXJvN3N6UjJkSHFqWThXWWVYRS9Ka0xaYWRXcVVKbzRlT0FMeUxiNFRrNnZIVklxck1nYWwrY0MvYUZTcjBlNkwxS1pIUTJQQlAwNW9pT3dPTVQwM25UcXdBSVRmWExkQW9CNmFURlVHOExPd1p5N0Job3BiTjFiYjZBdUphbWd0M3g3OTFjZXRDT3d0MVU4bmJDeHJZVEVlK0dQTStwMVppOE0wVzU1bUJWS3dqSDFRQXZoS2ZzNWZiMTYyTWNQMzZaa3lldjREamFkMngrT3A4ZitmdnJsV2NmRlh1WUlaOWdkWkJmeTg1NHBxS1B3TDVjcmlhLzhJWGYreHRUVS9NdjZBVjhQTlRqWFBXV1piRnIzemFlZU80Unl0VWFOMGNuTmFnSGoxYXZGK2lFSnl5a3gyY1dtWmdwR08ybkFpRzhLc0NCUFVOTVRjOXpZM1FxVUZKZTRSc1cxQmJ3clM4L1NWTTZ0YVNDRDhCaTZRcmVJZ1JFRU40eUtnTCtlckZjNWF2NTQ1dzVmOU5YWVI0WjdJVGhwcmRVNE1zS0FQUjJ0Zk1kcnp4RjFwKzdYMVB5RmdRTkJaWjZMRXovVysrZTRjNVlDSGdKY0UrTjZ6M3JOZGdybFF5UTZRemQ3bkZ1KzNEc1BKb0x2NjIxbWU2dUhGMmR1ZEJOTEl5RUtoVW5kVVh1alhoVnRHY1VyOW8xbFcvQTNYRmRSdTlNTVRZeHk5NWRtMG1ua2hyMHcvY21QQ2Q4andpZ28xVUFwUG9QWUIyMnJRTzZFalZCcGxZQU5NQjVhUVZmK2N2SmMxeEJiM3NUMi9wYjJESFF5bUIzTXduYi9CRTlHQ2J6U0FXNkc4enlwOHoyNTkrWDdPOFIxeVl2aFArK0pleWdVaGFYbjQ0cldDd1VtWjhyVUNwVlNOUXFDTWRSMnVxRnNlNHQ1K1lLZlBPYlowelkvMXcrUC9KajY1aUZENzA5ckpCWHdiMFUxTmVxTTk1S29XOEJkckZZVHYveUwzLzVmNXVlWG5neS9HaEpxRGlCdXJCWDF4OS85Z0I3SHRuQllySE1yVHRUS3g3VEdncHFyd0N0T1M2M0p1WXBGS3NSOTJSUUNBdkJvM3UzY1B6c05XcU9HN2hlSmV4bHdUeTBzWmNuSDlsbTFDT3NvQ0FQLzZ0QUNSVzZzRUxDeTMzVm1rTWltUWlob3NVaE9IOTVsTmUvY1l4Q29hemtvd0YyQmU2MmJiRnBvSnR2Zi9sSjB1bUUwUzRmQWxTQS9ybFpSS0NxQWI2V1A4NzA3RUlFOEhvUGVoL3doaXZmSEY2SFBKZW9zb2Z3R0JhME5HZnA2Y3JSMDlWR09wM1VjMFN0MkpudzFvTHBCOE5LVmJnL2dMbnlMQUs0SysrSEduWmlhcDdyTjhjcGx6MTNibE1teGI3ZFF5U1N0dWFtMTlXeTBvUGVBTDBNcDdiQnkzY3Y3ak95ZXJPUk55dWVPbis5QnowUWVPUEVoUS9EVERMQllHOHoyL3FhMmRyWFNtdFRrZ2ZkZ250eTBjSHU1NGNFdnlzZzRYdDJaQkZoMnhoNUhWYnFvMzBnOUh3dGxjclVxZzZ1Y0ptZlc2UzRXTUt1VnNCMWNCeFphUWpiN2MzbC9Qd2k3NzEzbmxPbnJrclkveUx3ditUekl3OGxqTmJiSGtiSVcwQ1NwU0YvUHp2amFZQ2ZuMTlzK3BWZitZTy9OVCsvZUVCWDczNWhidXZiV3B0c0VNYnJRVCs0WlFPRnhSSzN4NmFKZlk2Qm1nc1E1VytIWVJkTFZXNU56dnN6WlBtRmZLQzZ3a0ovODZZZW10SnB6bHk0WWJoYmxmWldWL0RKanowU3VMNUZJTk4xS0d0Z1Z5eFU4S0VMOVp0SHozUGl6SFYyREEzdzZQNGh1anZhdkxUNWtjcjRDcVVLZi96MUkxeThkc2NidTI1aEtQZHd1V1ByQUs5Ky9ERVNDVnRUNlhHSzNUS1BpM0QvbllrWjNuem5UQVR3Y3Q3NUFQWkx1UEpEbDMzVW13TUVjV2ViTXZSMnQ5SFQyVVpUVXlwSWkvRFRZajUrUytaMWtMbkU1TGUrSndSOStBelVjR3FsSzJqbjk0L1BGMHBjdnpIT2ZLRVlnc09IY0d0TGx0MDdOd1Z0dklFN0hneVh1K0lwTU1CaWdsN3JUS1pVQ2p4b2UyK0lvOEJkQ0UrdEk3eEpjbHhYWUZ1d3BhK0Z2UnZiMk5MWEhJeHUrRENZcXFwbGZ3TGgxbmZYQTlqK0ZMY3k3eEsycGYzTzQ4RnV0TW5YYXBTS0ZjSnZCQWdXRm9vc3pCZEkxS3FJV2kwQ2RsWGR5L1o3Q2Z0RGgwNXo2ZElvd0plQXY5S1lCbmZ0N1dHRWZEM0FyMVRkMzQyYVg4bXdPbXQ2ZXI3bDMvMjdQL3F4aFlYaWJoWHUwUUsrdnNzK2xVcng0aXZQMHQzWHljSkNpVHNUTTlFU0huUXlRU1NNQUNabkZ2MVB3cXB1V0F6Rkp0aTJaWUR0US8yODhjNXBDb3Zsb0VERktGeTd1M0s4OE5TZTRBTGgwRGc5Q2VyKzhIb29iZlhlREhoZnpSOW5hbm9oTE1DRVlIQ2dtOGNPYkdPek1oeFBLQVE3ZmVFbVgzdnJCS1Z5TmRaTi8ramVJVjU2Zmw4SVVnWGFNZ2xxdTd5Y0FWQTlMayt3QlB6cG9aTk16YzRyNFBZNzBDazk2eTMxbUMvVlRWZCtBSHM3Vk80SjIyYkRRQ2U5WFcyME5EY3BUODd6SmdoQ2I0eThGU1BMMVZQQ3ZGTDJhV0hsZTZBOEdQbGVlSWU5N1dzM3hwbWVYU0RYa3FXMU5jdmMvQ0tUMC9NR3dFT1h1Q3NFbloyNW9CT21DZnB3L0x3Q2IyOUhNSElpVk9vWVVBODdlOHE0MUEvVEJCV0I0TGhMWDNzVHV6YmsyRG5RUXZvQjZUUzNHb3ZyWE9kSzJLdjd6UTU0UURLWjFNQnQyOTY3RnFmZ3pVbUphbzVMc1ZqU1I3YjQ0UXFGRXZPekM5aVZNamhPeEZVZjU3Nlh3L0J1M3B6azBLSFR6TTh2L2pid0YvTDVrWmhaaEJwMnQvYXdRZDVtYlNHL1ptcCthbXErNVl0Zi9NTy92YmhZM3FvcU83a09hT3R4c004MlozbnhsZWRvYTI5bGJuNlI4YWxaclpRMnVhNmFFQ0VBSE5mbDl1UUNpNldxeHY1d3lCTkJ5YjVqMjBZMmIraG1hbmFCdzhjdWFuQVAyMHU5UXVDWkozYlIxOTBXdEtGNzE3TkM0S1BFaitwWkNGVzlFSUtUNTI3dzd0R0xWSjJhVXBqb1E0QzYybk04OGNnMmRtN2RnSzIwbDFyQS9HS0oxNzl4bEdzM0pnTGxiTnNXenorMW0yY2YzeGxta2VWQk1sejNWcVF5VmxXOEpkTlA2SzYzZ1BHcFdmTHZubFVVdWdKNG9vQVAzZlo2ZTd2ZTI5N2J2MlZ6TDRNYnVxTVBVN25YRU93aXpHK0Y0SEhRajREZXFBU0V6MFhDV2c5My90SXQ1aGVLQVdRRE56bW1DZ3lWdFJDQy9yNU9CamYyaENwK0JhQlg0ZTIxeVlmaFhaVDRqVEQ2Y0Rsb2FVcXd2YitGblFNNTJwb2ZmRmQ4UFpPL2dWS2x4dFJza2FtNVJhYm1Ta3pOTFZKekJNbUVUZEsyU0Nac0VrbWJwRzJUU05na0UxNmxNWk5KMGRxU0RieGFDYis1TUptdzZ5ajQwS3UydUZoQ242ZENyMFNVaWhXbXArWklWRW9hNkUxM3ZRcDVUOVc3M2dlelRsM2x6SmxyLzdsV2M3NG5ueCtwclhkZVB5ejJNRUUremsyL0hOalhVdEhMZlJFVlB6Ky9tUDNWWC8yRC82TlFLTzNVM0xaKys3dnV6bzJxZU11Q1hIdU9Gei8xSEUzWkRIUHpCU2FtNWdMWUJIY2ZYUTBLYkF1dmtDNldxOXlaS2xDVDM2d0dyUkNYUDJyTGdyMDdCK25yYVVjQUo4OWU0L2I0VERqL3VGRVF0RFEzOGRJTCt4VmcrTzN3aWpyMzBxT2tTQmIyZnJEQ1lwazMzejBUVEkrcmplblZWRWxZMkdXYjBndy9zNWU5T3pkRmlIYmk3SFhlL09acEhNZmw1ZUVEUExKM3lJQTJSb2U3Y0VNSHY1NnZscEhYYjd4em11bVpCYVhTaHE3VWlRTGVIRjRubC9LcmRhM05UVHkrZjJ0NHJhRG1RUWh2dzJVdk0xSUdVM1BiTkEzc3lvYXM0Ryt3bDZnQUFDQUFTVVJCVkVrMUw3VHczak0vZWZZYWxXb3RiQjlYSzMwaUhKR2hUUy9yUTN6M3prMjB0amI3NzVIYUJxODBBYUhHRlhvUTVQdWc3dGUvTnFjcjBJUU5RejB0Yk90dnByKzlpUStEVGMyWG1TbFVtQzlXbVMvV1dDaFd1SFpyaWt0WDd6QTFWd3orQ3NXS2RwNm9zeEo1L2dKeWJhMXMyekdJWlZsazAwbTZjeG42T3JOczY4dlJtVXVUeTZiSnBoTkJmanF1b0ZnczRkUWNvK05pK1B0MC9HZGRLbFdZbXB6RkxoZXhITWR3MTV0dDlCN2cxWXJBN0d5Qlk4Y3UvZmJ0MjFQZm04K1B1R2J5RzdaNmU1Z2d2MUxBcjZXaVgxYk5GNHVWOUsvOHlwZi8xdng4Y1IvZ2o5dU9oN3RVcERyb0xUcTcyM25oNWFmSlpOSk16eXg0bmIzVU85ZGN5Zkh0aWdLWW1pc3lNMStNS2J6RGd0NFZBdHV5MkxkN00xMGRyUUJVcXc1dnZIUEdkNEhxTGp4UHdRbjI3eDVpYUdPUDRmNk5VZTBZZ1BHWHBYS04zM3Y5WFFxQk96QXMxTldQMHNRVkxOczI5L0dkcno0ZHhHMVpFbFlXODRWRnBtY0xiTjNVRzdSam13RFhvTzBmak1EZEVqSDd2SkFUVTNPOGRmaHMwS2t2MnY0ZXF2WDQ2VzUxNE51VzE2elEydHBrcE1UTHNaRG5WcURnNDB5cFkybVpIMUgydW5RUFhmWnFlQkY2Z1k2ZnVxSjBuTlBiekdWN2VBQmN2MUtZVENRWUd1eWxyYTAxZ0xZSmVtMVlIZUc1RWJBcjcyRGN2cjZPREZ0NldoanN6ajZ3dmVJZDErWEtyUm5PWFp2a3l1MVpuRlF6WTNObGloVW44S0FndkhEdnZudUthbFVYdG1vVGxiZU5zVkVmOGdKbzc4aXhkZHNtZ2dZZi8yWHBiV3VpdlNWTkttSFRtazJSeTZad0swV2FVd202MjV0cGJrb3BIZnJDMzZVVGVHMWNLcFVhRStNekpFcUxpRnF0anF2ZUhHNFhIcS9WWEs1ZHUvTWZqeDI3OUwyTnpuZ2YzRDY4Zml2ZHBDQmJybDE4SlgvMXhzcXZ1bjIrVXFtbXZ2akZQL3lSK2ZuaVB0VTFIN2NPS090aGdkL1QxOFd6bjNpU1ZDckoxUFE4Yy9PTFdnY2hTeXZEb2dXYWhUZlVhR0s2UUtGWTllS1hZTWN2NEFWQk8za3ltV0QvN3MyMDUrUVlkNHZiNHpQSUtWVnRpNkRBUlFoc0xGS0pGSU1EM1dCNU54NVVIQ3dWbDJGQlFyREh3dmF2M2RTVTR0V1hIdU9OYjU1aFltb09sL0JqTWJZUERRbENHWTF0eVVxSnJiblE4UitBQU5wYlcyaHZiUWtWdXhVdWc0WHhoYmtnaVZvWUsraHBMMEVyQS9SMnRkSGJsV05xUnU5cHJ6NWZ0WE9kalJ6YUoxMzJvZEszTElzTmZaM2tjbGxQcFVlOENWN1RocncvTzc0VlhzdUxJSVF2K1dVN3Zqd3RxQlNabFFhaEhQUmRRZFZxTGJnLzd6MndTT0MxZzl0K3hnc0J0b3pKaHE2T0hKczI5bURiZG5BZG96Ym12enVXTjU4OWdQQ0dGZm9QWGttWG53UHlYdng0T3JJcE52ZGsyZHpUVEZQS2pzMlA5YkpTdWNhRkcxT2N1emJCdVd1VG5MczJ5Y1diMDFSckRtMjVGaDU1WkFlSlJERzRSOVZETXpFeEV3RjhuRVhmQW05UHZiZGpkbWFlYTFkdU1iUjFVMUJaRkFMR1pvcFVhaTQ5YlUxTUw1UTVjK0VtQy9PTHdZKzZyN09GTFJzNzJMS2hnK1pNeXZDMGViL0hSREpCVjNjNzQyTXVWblVCWXR2aTZ5OUJNRGpZK3ozOS9aMy9IdmlMZU5QaE51d3U3V0ZSOGtuaVZmcmRLUG8xVWZPdTZ5Yit6Yi81L1IrZW5KeDdWcXAzRmVpMmJTdnJzaTArZFBkYWxrWC94ajZlZXVGUmtza0VFMU56TEJTS3dRMEg4RlFob0JQZlYxZUNzZWtDeGJML081RXFBU3RRNzlJVm0wd20yYjk3a0pac2sxWXdISHIvUE1WU09WVHc2T3BwMitaK2RtNGRrTkVIS1F6QkVsNGpkQ1JyZ2lQWTU3cUM0MmV2Y3VUVVZjODlxSFlzQ3R6MW9XcDBoV0RIVUQrZmVlVXBMUjVWN2NwOFFpamcwd0MraEtvWGNVb2ZCZmplWW1wbWdiY09udzNhT05WaGU3cEsxNWRtcFNDVFR2SEVnVzBrRW1FMXdxZ2JhWDBHdEJ2V2JqNzZ1emJWbmpDT2hGNGQrWTVnN0JlVXlsVXVYYjFOdGVyNDduS3B0TU9DWGdJam1VeXdlV09QNTU0UHdxR3ZpL0I4T1Z1ZGJHc1A0bmRGYlB1OGhjVmdkNVl0UGMwUFREdDd0ZVp3N01JZHpseVo0UHkxU2M1Zm4rTGFuZG1ndVVKVjJKMmRiUnpZdHgwN1lXbDVMSDhYQXNINzc1K2hVQ2hGcnVPRkVkRjlNU3YxMUR4QWQzY0hnME1iSXRmTlpkT2szUkl6MC9PUmsrUzVQZTNOREEyMHM3bS9uV3hUTXVnQUtkdnFhMVdIOFR0VFVGZ0FwMVozU0YxY3U3MWNkblMwL3NhUC91aG5meEJvZkpQK0x1MWhnSHhjWjd1MUF2NXFPK1BaZ0MyRVNQN2JmL3VIZjJWc2JPWkZ0V2QzUFJVZjE4TiswOUFBanoxemdFVFNabkp5am9WQ1NRYzZLTnZtQVcvVGNRVjNKaGVvMUx4UktTcFVKWFJsb1p0Sko5bTNhNUNtVEZxRHBPTzZURXpPS1FXQVBDK3NKUFIwdFpGS0pZUEtReEMvSWlNMDRFT2t3QWcwaDMrTnFaa0YvdlR0MDB6TnprZmM5TjUyMlBhN2JYTWZyMzNxcWZER2xXdko0WU5ScUl0Z3Yrbi9DTU5Zb2JMeUU2YUZ0L1J6RHIxL251bVplUVhjcG9xUGNlRXJ3KzFzeTJMUHprMUJNMG1vcitWL1FjeWxWMlJhY1c5VXJNS0tuNy9QZkRaR1piQldjeGtkbTJacWVqNHlsRklXOHAwZE9UWU9kSG5xUFFidXJySnVnajRjVnFmc0YySDRkTkptYzArV29lNW1Vc25WNXNUYTI0MnhPUTZkdk1HaEV6ZDQ3K3dvcGJMcFdsZFh2SzNlM2s3MjdkMUsrQ2FHK1FoZW5relB6SEh5eE1WWUplNmZFWDJXTWRkYUN2SUFQVDJkYk56Y0grd1hRakExTWNQODlEUmJOM2I2bnNNbzVDRk1iMWQ3bHNHK2RqYjF0cEZ0U2didlFhM21NbkZuQ25kdUZ1SFVORmQ5MEJ4bnVPdE5WLzdRVU44WGYraUh2dXRIZ1prNldkR3dKZXhoZ0x5cTRsY0QrTFhzbEtkQi8wdGYrdU8vZU92VzVLZE13RXYxcnJybFZlVXU5dzl0SCtUQUUzdXdMSXZwMllWdzdtZnAvbGFCUlRpbVdyVmF6V1ZzcHVDUGY5ZVZtcmNSS3E2TzloYTJiZTRqbFVvRkJ6V2NLSEMyakFKQy84R0hwM2p4aDJDcUQzYTBRa2NJRWR5ZjZ3Z09uN2pNOGRQZXBCbW1ndmRjOWJCMXNJL1hQdldrcG03RGRjWGRqQUp3RWE0SGQ2cTQ0dVdZYmd1MENrSUFmUDFVNzFuTkxIRG92WE9hZWsrb0ZUcmpPVXZnUzFkMWQxZU9QZHMzWWxxUXp1QSs5T2FDbUdJODFvVDZFTkNmaWJlcXZ5ZXF1bFREeS9kbVliSEVqVnVUbE10VnZMWjVRU3FaWk5PR0hscGFta0FRZkU1V0hWcm5lMlJEMVM5N3pFdVBnQi9lMVNvR2dwYW1KRVBkV1FZNk1saHhMLzE5c2xLbHhwR3p0M243eEEwT25iekJqYkhaNEppWnA5SDlncTZ1Tmg1OWRCZDZmNGN3ZitUdjRlU0ppMHpQek1VNVpmdzRSZVJhb3M2S1dRRXdvK3pyNjJaZ1l5OENtSnVaNStxVm13Z2hhRzVLc1gxVEY4bUVIYndRY1pCWDkzZTJOYkZqVXhjYmVuTGVjM1FFNDJOVDFLYW5vQTdRbHg1eUo5aXhZOFBQLytBUGZ1ZmZBNmJpYzZOaDllekREbm1wNHBjQys3MVM5TEg3ZnVNMy91UjdybDhmZTAxMXowZVgzanpxMFhaNWk1MTd0N0I3L3c2d0xXYm5DdDdYbkt3b1VPcTY2UEZjaHVQVGhXQVNEQkhJYXBSdHlLUlRiTjdVUTN1dW1lQWlmZ0VnWGNKbW8xNEU2ckhITFMzc3hTdTM2ZS90b0tVNUV3dDJOYXo2T3NyNHh5Ym0rUHFoVTB6UExtaHVlK2s1MkxxcGo5Yys5VVFrSDRoSml3bnRpS3ZlZ0w4V1JvVHJPdkRENS9ITzBRdk16Q3g0NEZhZnV3TDRoRm14c3p6WDloTUh0cEpLSm1NcmJaRmRma1VsT0Nock5aSWF4bk1KOHRUWXFLdmdsV09CMXlmWWp3OXBEK3gzeG1ZWW41eWpzNk9WL3I0T0xNdnJNUkRDUEh3UFhmOWtUNW1qZUFBTU43MHYvVjBCWGEwcEJydXpkTGFrV0MrN09qckRvWk0zT1hUeUJrZk8rYzBWV2dnRGdIWGdhd0hQUHJPUDV1WnN4RVd1VnFwcWpzdGJieDJUQjJPcmNjRVY0MzZmUzBFK2Vob0EvUU05dExhMWNPbjhOZFRwc2RQcEpEc0h1MGo3RXlEVmc3eCtUTkRTbEdibjVpNEd1ajNZVDR4TlVaMmNpa3lZRXgxU0Y5dGVML2J0Mi9Lem4vLzhkL3hUWURJbU94cFd4ejdza0srbjRsZWo1dGZNYmYvYnYvMm4zM0h4NHEzUExnZDQrV1UwczJmOXpyMWIyYlZ2TzFnd043L0lyUDk5Wm5WeUZybWl0VFdIdXlsWEhTWm1Gc01DeERlcFNnVWVmQWI2T3VqcjZRalZib3pGRml4QmFXVXBCWVg4cjZoK1A5ejA3QUp2dkhNR2dDMkR2ZXpadm9sVUttdy9GZkpzbzZEU2dBSTRqc3ZFOUR3Q3l5aFlMREtaSk8yNTVyQ3RXb25IOHRPbFY1TEMvQUpoNUdzWVJnVzd6SEhMMG5QRnJCRE16Qlo0NStoNWdxRnpkbjNBcThQb3RtL3BwNytuWFVtWEZiaE4xTDV2cHRYWHM4SUlJY3h5WHdrWkJVbWNpamViZUV3b0JhNTVKYXdLZXVGSEhQVEdSd2U5K28xNHk3TG9iVXN6Mk5WRU5wMm9lNWYzeW9xbEtrZk8zK2FiSjI5eTZPUk5SaWZtZzNudXZadldGdEcxT2hXcy9yNHU5dS9iR3VRaFJuNUpOVityT3J6MTlySGd4SHFsOUVyVi9Fb2dEd0xidHMyUHlDQ0FWRExCamsyZFpOTkpvM0plcDVLaFZGcWFNeWwyRFhYVDI5SE01UGcwcGJIeFlCeTlPcFJPL1pLZEJMM2VSby83K09NN2Z1b0hmdURiZndHWXFKTWxEVFBzd2VpdGNuZG1FZTFOYi82Wjd2VGw5c1VkcjllN1h0djMrdXZ2UFhmeDR1aWZWd0Z2dXVkTjE3MDZYbjdyemtGMitvQ2ZYeWd5TzFjSUZic0NtUUJFbGdFdVlMRmNaWHF1RkVBRVZDaDdpNDcyVmpiMmQycWdqVE9CN0NrdkZiNnZteU15MTE4eEtlU3ZuejUvRTl2eVBuTjU1Zm80MTI5TnNtZkhSclp0N3ZjOEduamdETUNPcWxERENCT0pCUDA5SFVIYU5JYkptelE5SHNyTnhJSmN1WWF1Nmczd2E3ZXJoaGRhM0JiUTJkRkNUMmViUDZjOTNveGlmaVRxRitkVXdMZm5tdW52N2ZBNzgza1pxWUVlLzFsWXNqZTVjWCt4cGh3VitIRUt1Um81cHU5VGFvUnFlMnpvdm9pRVNTWnNaTXBkUC8rRXNJSktrWTMvWFhMTEh5MkJjaS8rQjVBc0MxSzJUWDlYaHY2T0RLbkUwbmU0MWxhdTFuajcrQTIrOHU1bGpwNjdUY1h2K09rNEluaHVRbm5YZEVvYU8ySThLYlpsc1gzYnh1Q2dHa1JmTis2N2psZG1CUWRYSGNwMW9rUFRMVHp2NFBrYlUyemYwRUZyTnIyQ3VFSmJMRlU1Y3U0MlBSM043TjdjVGJsY3BUbzU2YzFvV0tlWGZkaFdyKzIzRHg4KzkzZmIyNXR2Zi9hekwvMFdNTHZzeFJ2Mm9ZYThDZlk0S0M4Ri9hWE9XMG1GSVBoNzk5MXp1NDRjdWZBRHRtMVo5UUJmdnozZVluRExCdlk4c2hQTGdzWEZFck56aGVEakpqcll2UUlnWkY4SW5JVlNoZGw1SC9BcWRudzUydFNVWnROQU44M05tWG9sQytyWUhWa01CVzNjbGplRG0xNkxENEVzbERSS0h0eTZQY1hjUWpqa3owVlFxem1jT0hPZFMxZkhPTEJuaUEzOW5VZ0F5WXVwOVlXZ0Q0Qi84VkNkRTZodHFkVE5ZN0l5WU50aFdvVVZGckNnQUZ3cHUyVythWlVCTTd3YVRsSDNGckJ6MndEdkhyM29RUjNMSHhwSDJCbFBBWHdpWWJOOVM3OWYyZEd2Wm03YmFnSUNwTXAxSlFGbUNTeWZvWW9QcVJ4VnZtdVZLMVdlaFpXTlNLVEJRN0c4aXFBRnRyQndKZHlGRlF5SHRQREQ0TVBmSDdjcGJHaE9KdWh2ejlDZFM5M1hPZVFGY09yeUdGOTc5eXI1WTlkWUxGYzlzTHR1OEQ3Yk5sNnZmMHVwTlB1Mk1uaDZ0bkZqRDlsc0pteFo4ZlBOVXJ4dVZzdzFscnFPL05tdWlycitpV2IvbXVYTWNWd3UzcGhpNjhZTzJscVdtMXhJU1pTL09qR3p5UFJja2MzOTdTUmIyM0ZuSnYzaGRmV0cxTVZXQURLdnYvN2VQMnR2YjczOTZVOC85Y2RBZE9oQnd6VDdzRUpld3RhRStGSlFYd3J1eXdHLzd0K0ZDN2NHdnY3MW96OENwRXlneDdublRTVS9zS21QQTAvc3diWXNGb3ZsWUt4MVdPaDdDa0pDUisxNEp6TmlickhDd21KWm05NVZCa29tYlBwNjIrbnF5Q21IUWxVWHdGQ3ZTY1FLODZBem13SmJVM1FndkxUWEhJZnpsMGU5OExhRjdZWmhoUkFzRmtzY2V2OGMzVjA1SHR1N2hmYTJscUFTSVFzdVZkbVk1VmpjWjJEbFU5Uy9IRWNrdndJNHFpQzNDRUFXZ2Z1eXdBK0JaMWtXSGJrV2VycHkvaXg0NklDM3czSHh0bVV4T05CTmMxTTZLQWhOdnNWZHp6eWlWM0hrSWxwOEIzbW9QRHh0ekx3YXZ3SjJXWjN3dUJ3K2ZMWFNGSjRuVC9VQ2VCNGhLK2drNmNwVStNZHoyU1I5YlJuYXN2ZTNLSnBickhMeGRvSGpWeWI1OHArOGgrdDQvUURrN3k3NHpRWDU0bzNpWDdaQ1ZYODMyYVpNL2JBbXJUOUFQVWVQYy9Vbkx3Vi9Wd2d1MzVwbXNLK2Q3dmJtK3RldVk0NHJ1REk2ODkvWmUrOGdTNUw3dnZPVFZjKzI5NzdIdTUzMUJsaHNFNFlVQ1pDQ0JQS29FNE9pRkJlVWhKTk9JRzhvblVRRmRZcTdrSGhHY1lyaktjVGJ1MEFvUkVoYVNRUWxFZ0pKa2RnVnVBY1FCSWdCc0I2N3MyWm1kN3h2MzgrYnFzcjdJeXVyc3VyVjYzNXZwbWVtZTdHL2laNnFTbDlaK2ZLYlA1Ty9wRGVYb2pmVlE2NVpSTHF0WXZ0a2NYMXdIZjZkMy9tVFh4OGJHL2k1Ung0NTlCTHd3YUUybTVCMXJ4dHdpOVFKQUhjQy9PM0FYYlM1ai93dEx4Y0d2dktWNy82U2xMSnZLNEJYNGVhZllIeHFsQWNmTzRabFdWUnJEVmJYUzc1WHRIQ2lzV0pjb0NudXRZU2dVSzVUcVRXd0xPV2JXditsYkl1eGtYNk9ISnhoYkxqZkw0T2dmUHo4Uk1xTjRIdzQ0Zm1kcnUrVDA0dGdBU0lFWExpeVNLUGhZT3Yzc2N4M0NPdGNXUzN3dFcrL3dTdHZuS1hXYVByNVZWbVdVYVl1TitnYnJkdlc3UkpiZi9TZ3pRbC81anNvRUE3ZlJZUk4yQ0pNQlAxMGNPK2svNTJzb0R6OUhmV2hJRDA5V1dhbmhzUCsxdmtqZlcyMHNjMjdCWDBXK1c3Q1NCT1I3Y1RLTkJjZHNYb1JrYllFZldSSW1CTEhoZGsrNDl2cHRKYUE0YjRVeDJaNk9UVFplOWNBdnVGNG5MbGU0cXV2M3VEM1g3ekc2NWMyOElSRk5wTkJXTHI5SXRKMnMvM2F0cUk5aVUwZnI5OVU5bUp4Q1UxUzhrU1JmYWYxdG9uZkt0Vm1aWm1oVXNMbG14dmNYQzExVm4xQ2tuTE5ZYkhxY2FOcDRVb0NmWHlvbC9lQ3JYWFJxNHF2MVJyN1AvLzVQM2o2eG8zVi9SMi8yZzhvN1ZaTy9sYTUrSzFFL0p2bGpZVFhhbzNNYi8vMk4zNngwV2hPaHNBZWl1VGpBQi9YeXcrUER2SHdFOGV4VTdieTk3eGVUSmdzUlRCOFRZdDZ6WDJ2RjJ2VUcwNEFucHA2OGxtbXhvZkladFBvQXJRSE1pME8xSjdyV240ZEluWTE3MzNacnNvblVPSmVYNHl2d3dYVWFrMHVYMTNCc29SeVdPYnBJa0p1THJKNGtKSUxseGE1ZEhXWm93ZG5PWFpvTnZDT3BqK0lKR1IwQXNDUlFtK0RiM21GUUhVY2owOWdsTXgrRFo2TnpPbzU1UEoxZXdpK2lTR3U5eU1IKzN0Q2JqNndzUGUvaFdVeFBUSEUzUFNvNytKWVNRQk1IWGlJQTFxVjBkcmV6ZDViTjBZSTFFTExFdGlDaUxHYjhsQ0d2d3REaE9vWGcxc0hnNFBIWlBqVkIxZmpTUmg1Z3Q2SmNhWXEvVUEreGZoQTVxNTVwZk9rNU1aYWpRdExGYTZ1VkhGOG95NFJORmt3Tk5qTHphVUc0V0ZGL3ZqVW5EMUt2YUIrbDdJamtYMVNXTGxVcFZpczBOK3ZPR0Q5VzBTMGl1eVRLS2xNVFpabFJTemlPNlhOeWt6T29Cc04xNWVMTkIyWDJZbUJydXRWWmRrVXliQzhYT0xRb0szY1ptL3FFUzhhVmlwVlAvU1AvdEcvK2JWLzhTLys3dDhBbG02dEVlOS8ybzBndnhXNGR3dis3ZUxhQXI2VTB2N2lGNy8yMTh2bDZ1RjJSblZKQUsvRCt3ZjdlZlRKQjBpbGJScjFCcXRyaFdCeTBYcmNLSmVrZGVNQnRMSlJyTkYwUEw5OGxUWmwyMHlNRFRMUWx6ZVFTditRUTUyNjlteTdLVk9DQ0daMEtXWFFwbWcrRVFWTlAvemN4UnUrSVpYdzljZ3EzQXZlUjZJMUM1NVVYSzFuS1ozZnFkT1hPTEovV3IyWDN3RjZVbzRxNjZPRElhNlBKNVkwbU1qQ0pvZUxCYUo5R3lRMUZnb2k0bFJIOVVjRVRDR29SZWM3TUQvSks3NTloWGFBTXpMVXgvNzVDZks1akZHZVdiWnVsS2xCOTRFZU02Mk12YlNLVFZ1Q2JFcVFzVU5ML3ExSVNtaTRIazFIMG5BbFRRZENZd3U5Y05BZlgwYnFDMjVOb1BmYmp4SGVrN0VaNzgrUXo5d2RjRjh2TjdtMFhPSHljcFZhMHo5WXhiY05rSWdJZ0E4TjlyRzR2STZ3VlB2MTBjS1dFSGorZUEybExERlk3Qklscjk5WXByOS9UeVFzWERTeXFZSTltOHZRMjl0RExwY2htMVYvbVd5S2NxbkdoUXRYazBGK3MvWnRFdGZwYXkydlYyaTZIbnNuaHhMRzJ0YWxaREpwbktFaFhyOTZuZnZHOHlDOWlDZThyVTZ5VzE4di9kVG5QdmZQejMvKzgzL25Id0xWVFN2N0FhWGRDUEpiR2RSMUk3cmZEUFRiUHYvSC8vaU5uMTVlM3Zod08rdjV6UUMrdDYrSHg1NTZrSFE2cFE1eThOMUdtcUo0OVJ5Q3V3bjZucFNzRjJ1NHJoY2N2aUdFWUhpb2w5R2gvdUR3R3hYaC84eGtDT3ltM2p1Z2dFT1gvdndjb3FRa2JKTktTL0RiTlFGVkIyOFVLaXl1YkVURndScllqZmVRdmpFVGdzQWFXd2dZNnU4bGswa0hVME5nQitESHgzY0w2QWVSRkJ4Sm9WdXBRU202R0Fpd1NaY1Y0RlRZdG5odDBiQ2dnTUJxdkw4L0YvaTA3K25KY0hEUEpFTUR2UW41akdmUlVtSzBWaU5lK0FwajI0WnN5aUtiNHBZT1pCRWl6QStxajZ0TmozTGR4ZlZrQkx0YmpyN3pqZTJBaUt0Zm5TNlh0aGp0VDlOekY3YkJ1WjdreWtxVkM0c1ZDdFZtNENWUGMrMGFvSVAvL1RNTGhnWjZ3NFdlUDI2RkRCZHMybCtEc01DU1d4bmdiYjRJdUxtNHhxR0Q4MWlXVUJLUUdBZ0dhelloR0I4YnByY3ZUMTlmRDMyOWVleVVyZXIxdVg3SDliaHcvaXFMaTZ2RU44bTFLN2tqOE81eTRhTG1velgyVFErcGhXV24yZjJFUGZrczd0UWtyMSs2d3ZHSm5zRDVrUW5zbTUxa2QvUG0ydC81M09mKytiblBmLzd2L0wrb1dlVURNbWczN3BOUHMvWCsrS1MvRktIN1c0dmtmZkZiZXNoNzl0bnZmZnlOTjg3L05kc09BVnpmeDY5eE1YNG1tK0hKVHp4R1BwZkZjVjJXbGpjVWlGa0dvQnZnRGlINGcxQXIxMkpWVGJ4K3V0N2VMT09qZzhxSmlrcldsc0tmT2NUNDJVaEl5N05zalRmNFhSL3dWY2pMYjV4am8xZ05WK0l5UE1EQ1BMSEtQR2t1U0NQVlh2b25IanJVVW8rTU55QStrN1NaV2VJUzVLUjg4UVdDMlk4aWtrMzNlN2lvTVRFNTdzOGVKT1ZLblVLcHd2VDRzQkxiUjNzdVVuOGtQS0Y5OFRnaG9DZGprVXUzYUhDM2pXbysyRGZkY0grOC90N2hmbm4xVHVISmRKQzJMVVo2VS9Sazd6eTQxNXNlbDVZclhGcFdoNnQ0aHE5N2o5aFlRMGJPbTNjOTVSM3k2OTk2QmNmMWxBR2VNVVpkelVuNlk5anpsRThBTHo1dlNuTll4ZTVpU1IrNC93RGo0OE10ZmdlUWh0Yzc5ZGppTUVkZkM0VXk3NzU3aVZxdFlkUVlhVVRMNzlkSTFhYmRabmpDM3ZwSVVhMXYyNU5OYzJCMk9OaE9xWkpGSjQrV09jWW9aMjI5Uk9uU0pZNU85UHJmcXpQeHZjL1pONGVHK3YvQ004Lzh5aDhtdmM0UE11MDJ3enZOVVlzdS9sSkFGclU0TUlGYkdPVjFaSUgvNnF2dkhqeDE2dngvWXg0czA5N3hUWlRMdDFNMmp6MzFFUGxjRms5S1ZsWUxBWWNkTWJZajVPaVYzM05mM3k0bGhWSk5jZU9XT3Noa2RucUUyY2tSTXVtVXNVQWc0RHlEcS84WDZCcUZYanlJU0x6WmFSQXJTOFRLRFA2cFJFSUlGbGMyS0ZkcUxZZXZoRFlEcldGYVg2MmxCZU1qQTIzYnBFU3RrbUtsNnRkSmNHMzNaeGx0anI5WVV2bEJtVVp5L1dDSlVFZ2ZLVk1EY1d4aGdCRDA5ZWFZbVJ3SmZOUUhQV2ZtTXlDNjVaMWlnMW5INWRLQzRSNmIvQjBFZUVCeDRuMXBobnRUMkZic1BZTys5WDhQUURwbE1UR1FZVzRrZThjQnZsUnplT3RLa1crL3M4TDVwUXFPNndPR01Bd3R3MUdxeG4vd2NVWHdEclp0MGRmWDQ0OUhNSk9FVzFuRFh0NWFXQ0kyZmJ5NXVOWStoNGc4UlJaNUFnV0tGeS9lNE5TcDl3S0FUNmhpMC9yamNiYzdmblQrU3EzSnVhdHJ4bUU4SGJiQnArR2hQbkxUMDV5K1ZqQmMzWWJpK21SWHVFcTg3N3BlZW5sNS9abWYvZG4vOWREV05mMWcwVzRUMTNjSzhEWUsyRE9FZ0I0SGNYdVQvQzFpL3BzMzF3YS8vdlhYZmdGSUpZRzZOclF6UmZZbVYvL3doKzVuWUtBWGdOVzFJcTRuamFOR0FSSHE0NFd2eU5hVGxFU3lVYTRIWjcwUERxZ3RXanF2SlNCbGlXQS91T0lBQ0YySENyYVVuNW1pOTNoRTZDbGRpYUVqKytkVmtEb2YrL0pTc0hDdy9MVHFDTklRcmZST09tR0I4SXd0UzFKTnFHTWpBOEY4RUVpRVVaN2szanQvbmJPWEZoRkM4RE9mL2dqQ1YwMklXTm9rTXZmQlN5R2pMbUhqYWYzL1JEd3NDRGVoT1JUcjZzcmovUmpOcTl1cnVmcncrNXR5RnJNZFpobEN3RURXSW5XWEhjVmtVeFpqL1JrMktnNjFwa2ZnR01aL2I5c1dET1JUOU4wRnpuMnQxT0R5U28yVlVpUGdnczF2cHJmcytVR1J4WkkvTEFsN1cwbG5oZ1o2ZlErVHlTSjd2VEJPcFcwRTRGVHJMZTNxNEdjR0VETzhhODFsaHVqZlB3SXE1VHFuejF5a1ZLcDAxRStibDd4MTVtNzMwWU1DK3ZQWDFqa3dPMndNNFBhbEJPL24wOWo0TU5jYkRwZVdiekk5bUd2UncyOXhrdDNJK25yeFN6Lys0Ny95MUZlLytrOC8wTS83OUg0RCtSVFFBK1NNdE4xdWpXc0JlOGR4VTEvNjBqYy8xMnc2SXhxMFE2YzJSRUE5OUdRWGhoMS8rQWhqNDhNSW9VNVhhelFkbjlNSXVYYnpHazQwcXZ4aXFZN25TU3hMZVJZYjdzOHlsRStSc2p2VHdUcWVwT21DNDBxYVhxdDFzQ0ZsSnZBK0ZqeUtZSEpFaEllMkdFRUFYTDJ4aXVNNFBxZHVHdGxwdmFoYXZBaUpzcmFYWWJ6dkc0aFUybWFnTHp6bXRsRnZjdjd5RXU5ZXVNR0tmK0taOEdlZmR5OWM0OWpCdVNpQVJvQ2NxR3JVQkV0aDZBM05mTEY5OHRHNDVMNE5yT0w5aVZpRVdWc0FPcG92WEN5RWFWU0Z3dWhZVTd4dkMwRi96c0srUi9JM1M4QndiNHBLM2FWUWRZT0ZhVi9PcGpkcmQ4S3MzVEo1VXJKVWFIQnR0Y2FsNjJ2VUdzMUExU01sREE3MGtzMW1DRUJGZndCaklhTEdoUS9zL3ZpekFGZkM0R0FmNHNxaXFrd1k0MFNBNVl1dVI0YjdlZUQrQTlUclRiNzl2Vk0wbThiMjdEWllsaFE4TlRrYUJYS2g5ZjZ0VnZiNnQzcnQyaElYTGx6RDg3eDJWYlZ2eERhbTJqU3ZIMW1zMUxsMGM0UDV5Y0V0YTBrcWNIcDJuTXVOSnN2Rk5ZYnlxWmdIdkZaTCsxamN3NjdyZmg3NHExdFgvb05CdXdua053TjNDK2hEQVh3U3Q5NTJLMXlic2lMaHYvVmJYLytaWXJGeUxPN0JMcG1qajhZZE9MS1gyVDFUSUpTNzJtcXRzU25BSzFGdXlDa1hLdzFjVnpJMjFNUFlVQTlEZmJtWTA1dXRLV1VKVWhhUVZ2bWFycVRXVkpiVXVtTjFGd2VXMUJyNkRZNDN3dTNybFlHRWVzUGgrczNWNEVoS1Q0TzNSbnRMNlVPRERoWGhCSXRVaGt4Q3dPaHdQMGpKOWNWMXpsMjZ5WlVicTByLzZmc3kxNUlPaWVDTmR5NXorTUFNdGtoR1BKSDBJSlBUaEFzQVlTd09RaW1Eak9mUjZZMitFVVlsNFlJZ1puV3YweWExSXdnWGtjV0NXdkJKYkV2UW43VTZFQlhmZWVySjJxUlRGbzJtUjAvV2Jyc0EyZzV5WE1uTmpUbzMxdXRLM3k0bE41ZlgyZGdvNFhyNlZFS1A0ZUVCRGgrY0RiK3BWT1BMRXlCa2RPZUUrczU2Zkt2dk5UellaM0R3c1c4dUJJY1B6Ykp2enpRU1NUYWI0ZkZIanZEQ1MrKzA2dWJEWEVSWG1lcHhlTGlmbkwreklyN2FOaGVlZWlBMkdrMU9uN25JMmxwaHk3NUtXdHgyU2wxbk0xY2dDYlJXcUdMYkZqTmovWkh3VHV1WjN6dk5oZmVhMlBVU2VadE9QT0daOFQvL1F6OTA0anZmL3ZiVC82S2JWM3EvMG03U3lXdmdoU2dvNTRFSkZNaWJCbm5tR2ZNbXFHLzIzQUwyZi9SSEx6MTU1Y3JTVDVqZ0RSakFiTFhoNkFYVDgxTWNPTElIQk5ScURRckZxZzhjU1FCdi9xbnl5N1VtbWJUTi9RY25PTEpubEpHQmZOY0FuMFJwVzNHRU5sVXRid0FBSUFCSlJFRlVRM21iYk5vS3VVcGhkb0Q1bmdZNDY0OGd3dXZsYTh0KzJwZ08zazhjZVRmQ2V6OHllQzVYYS96aDExN2gyeSs5dzlVYnEvN1dQYk1OSW1oRHRWYm4zSVdid1dnd0IwWTdsckxUTktFVUpleUpJRStzRHlMbEJ2bjh0Z1pseG5Ud1JyNTRuNXJ0MC9FcFN6Q3dRd0JlVTlvVzlPYnVITURYbXg0WGw2dDgvMUtCcTZzMW5FQzFvL1hxMnI1RGhhMnVGbWpVSFlMZUQxWnVJanFHalBZSzQvK2VmSlpNT2hNdXNQMys3K25KOHVFUDNjZkIvVFBCYjA4QVk2TkRQUGpBZ1paMmI5VWQwOU5qa1RUQy9QQ3hjaXFWR2krLzhqYnIvZzZjMjZMTkdyWU4zekNwaUtXMU1rdHI1VnN1Y00vQmVWYnNIaHBlYUlTWDdDQkgzNXZjUGYvM3dzS0pKMi9ycGQ0bnRCdEJYdjlsVU9BK1JnanVjZEJPc3BZWFJFSGVOTVNMMUhIcTFJVzVWMTU1OTdNbVo5M0t4ZE1pcGhjQ1JzZUh1ZS9Cd3doTDBHeTZnWXRUdlYrNkZlQ2pBT000SG5NVC9UeDRjSUwrbnN3ZDZWRGJncjZNWURCblk5dEVKa1AwUGEyZ2J0Nlh5N1hRa1UrUUx3Ujd5NXhrMFlhRzBiOWdVVk9wMFdnMm8rQm5YUFh1UU9FSG5EcDlLYkRPamMrVmJZSGNYQkNJNUNRWThYcVJnbDZneE1veDFpcEdGYUtsREJQMlJTUTh2RWJLMDNVSTZNdGFrZkxmejFTcU9aeGJyUERXMVJJcnhVYTRmUTNDZmpMN25yRFBidHlNblVCcWZsOFJmZ0UxRGcyalVUL0owSkN4bGM0U3pFeVBzdkRoQnhnZTdEZStYWGlkblJubnlLSDVTSDFKcElOdDIySnlmQ1E1VGN2aUF6WTJTampOQkkrdG00NEZzY25UbHBsYmt0N3VzTHUyWEdTdFVOdWk2dVFJWVFuMkhKeG4xYzdqZW13SjhPWkpkaWg4K05MQ3dvbngyM3lGWFUrN0JlUkY3RzhRbUVXSjUwMEEzMHdQTDJnRmZQUFAzRjRuVmxlTFBjODk5NzFmOGp3dkN5RVlxM3NDVGk5SlREOHcyTWVEajkrSGJWdTRybVFsWVM5OHlKbUtBUHpEQTB6ZzBQd280ME85ZDdSVE5ka1dET2FzaUtWMlpDS05UVURoNUNoWVhpMUVRVDJ5MkRIVUc4YjdhVTRzUUhoaTE2UXdEQ21BZnkxVmFweS92Qmg1bC9oMElUYUphMGxuTGdBU3JzRzNJd1NJbGpxTURNS0lEL3RWUlBLSldMNDQ5dmRteEk3aTRPOFVsZXN1WjI5V09MZFlwVmgxMjM0M3N4K05wUlFDdUxtOG9YVFdJcDdXVHhIdmJLSmpmS2hmL2Q3U0tac0hqKy9ud2ZzUGtQSTk4MFZBMko5UkJIRG93Q3p6c3hOdDNpcjY0U1ltUnJBTmc0ckV6Mm8wdmx5dWJibHd1RlhxTFA4dDFKS3dXTG04dUVHeDNHcW8yRWsxVnNwbWN0OGNwV3h2MjYxMGNaZTRCczBCLzNGaDRjVGRQNnQ0QjlGdUEvazA2c05Oa0d3MGx3VGk4VzF6U2VHUmU4K1Q5bS85MXRmK1ZxUGhUQ1dkSmhlM29EYzUvV3cyemNNZk9rN2FkK2l5dWxiQTgxd0R1d3lBTi8ydm8rSXlLWXQ5TThPa1UzZi8wK1RUZ3Y2Y3N0S1BnMDBvYmlmQ0ZXVXo2VkRrR0N4aVlvc0VqSUxDcE9HcVRTUmMyNFFGZnZEOU5wMDZmV2xUM1NCR1BVa2dma3NVdkgrcktEam9xNFI2d3ZsYnhNSkZKRjdueS9pZTY5N1BWRzE2WEZ5dWNXR3BTclVSQXJUK1lNR2FTQyt3aE5HLzVwZ0VQTmRsY1drOStBYmg5NDcyWVhRaHBrYUhoVHFHZVdpd2o0OTg2RGd6VTZOQjNzUnZGUlFBOXgvZno3aC9ESEpyYlNITlRJOWlaRXY4Y1pnaDVYTDNCdUlpK0s5NzZqUmJ0OFZMQ1JkdXJGT3BOVytwbm5RNnpkRGNESlYwdm1WTG5jbk50M0hyK3lQQS85RmxrOTlYdEZ0QUhwVE8vUURRai9yK2NmRjdrcmplQlBXa3VQZ3pnUHp0My83alQ2K3RsUjR6eGM5SlhIeklsU3Z3dDIyTEJ4NDdScjYzQndHc3JSZHBOcDFnbWdoQWpTaTRhM0Z3UHBOaXo5VGdMWGt0Mnk1S1dZTCtqQlhaTDZ3bnVtQmlOZEF5bDAxamFULzlKZ2RQVkdRZmNQTnhyajZ5VURMVkZsRVZoZ0wzMkVKRFFLRlU1Y0tWSmIrVlpwdnZBaGxqSVNteVJUZ1JTU2xDNENLRWt1QjlMZWhKdjM4QnZ1NTRYRjJyYzNHcFNzWFhwWWUvTjRnQ2ZCUUFoL3A3d0lvdnNGVHM5Y1hWd0VBMFlsZmk1emVQc1EzZzI3OE1Edlh4b2NlT3F1T1kvWXlXamhlaEx3c2pDUHd5SDMzNENQdjJUcmUxbWNsbnM0d01EMFRyMWUwUTBhc21FK1RqZWJvWjVLTGxack5FWFZDc3dac1Y0WG1TYzlmV3FEZWRXNmdJc3ZrY2ZYT3pWRVU2VVZ5ZnVEYy9wRjllV0RqeDA3ZFU4ZnVBZGdQSUN4VDNmZ0RGeVNkeDMrMnM1elgzbmlTZU54Y0pIdXE0UXZuS0srL3VmZmZkYXo5akFuaWkvanoyREhEZ3lGN0dKdFJxdlZDcVVLMDFnbmdUQUZ1NEVpSElabXhtSndlQ3llcGVrdExWVy80RUY3NHZoRDlrUGNubHN1a2dNTUxSaW5qaTJMTk9iNVFWVE9WUlZzdS9odXV3UU9UdjUxdGVUYlk4N21ST2E1dEd4Tkpzc25nSUZpV1kzOWRmekpucFlxK1Z5TkhyeFZNcUhGZnZKMnE2a3BzYkRTNHYxeWpYM2VBM0VNUGJ5SEFKT1YvMTM4ejBLT09qZzFHSmlaK2hWbXV3YW93SFlTUUloaEtHTFVpWU1saDhHdFZHU1NpOThMbnoxNkx0UXVuYmp4M1p3MGNYSG1KaVlyamx2YWMxRjk5YVpFS2c0TXFWbXppdXUwbWl6Y2IzVmdPbnV4WENkZzFEMS9VNGUzV05wbk5ySjhNT0RQZVRtWnFpSWF5NE5YMG4yWDlqWWVIRTdDMVZ2TXRwcDRPOERSd0dwZ2pCV29PNENkNW1lSkpiMm5oYUM3V1Rvd0hVOGJkMWwwclY3UFBQdi96ZmcweEJGTUNqM0h6MDNySXNKaVpIMlg5NEx3aW8rcGIwbWdMRExRMXFCb3VxQVhGcXBPL3VjYUFkVU1wU0xsUGpJR1VDTXlqMVJGemYzbXBKYndDNWVaOFFaclVMUjAvTXNVVVhncG5KWkdPbUxja0VsamlvYjVVdFlmSnI1ZGIxa3dIbWJlb1JSZ0pMS0ZIOSs0a2NUN0pjYkhKNXBVYXA3bTY2dWdvNWVQK1pXSjhKT0xCbmtzR0JYdjgzRkZXZFhJOGI0TEZwZGVIM0RMNmZzZndTNGZoYlhTM3c3ZStlNHFKdkJ4SzB6UGp1UFQwNUhuMzRDQjkrNGhnRC9UMUJ6VFBUWXlwTnUwSGpreWNscDA5ZjVPeTVxKzFhdkcxME4wWllmTW5VZEZ6T1hWM0RiUkd0YjlJYVAwcEt3Y1RjSk0yQlVacWVDUGJJZDBnandETUxDeWZlWHorc0RtZ243NVBQQWtkUlZwSjZNYUlOS0lUeEZ6ZXVhM2ZWZnc3UUpBVCt3Q2pqTjMvemEzK2xWbXZNS29jM2ZrVVJRQStmUS8wODVQSlo3bi9zUGl4TDBHZzZyQVhXNWpHZE8rYXptaUtraExIQlBKbjB6ck1OU2R2S2ZXcXRxWDVJRVNjZGdKREtTTW0yTGFSMEl3NXVBc2Mzb1BZcEMrTlozd3ZDL2ZiNkhwbVlObGlXQ2NKRGF5U2tVaGJUNDBQWXZwNWVuZFVPdGo4NTJ4Qk93c1prTE9MUEloWm1nbkVNbU9NVGRjdzl0K0ZyM0h3VzBUVEIzQlR6RVM3VjlyVDN5MHprZVpLTnFrdXg1dUQ1N2c1akI5bUYvaGVrc2M5YkFGS2dUOXVUUWloSE1YcHNXQlpIRHM3eXh0c1hLY1hFMm9WU2xYS2xSazgrcHh3N0JkOUNGUzdRL2hEMGFZTEd3UzMrVFRnMkJVN0Q0ZTB6bDdsMDVTYWVKN0ZUcWFDMHNGN2YwWTcvWVVlR0IvakloeC9nNnZVbGxwZlc2ZW5KK1dNaTlOaGs3c2NYQWhvTmx6ZE92Y2ZHUnVtMit0enZ1bHZhTDkrbXRBNURPNG1FV3NQaC9OVTFEc3lOaEpLVGp0c3JtRHM0eDVsU21kN1NlcmUva3g4Ri9oN3dhOTFsMjkyMFUwRytId1h3R3ZuYU9hMXA5Mnh5K25vYzFGQ2N1MmxKSCtSLzdya1hIcjkyYmZsVHRtM0hSUEZ4M1hzVTlDM0w0cEVuSHlTVFRlRjZIaXNyaFFDRUZDQ0lnQnVJQUwvZnFremFabmdnZjZmNjhiWXBtNEttcTd5Q1JaeUVTTmdvVmxoYUtZUWU3WXdGVFFUdzlXckdCSE5qTWxVdWJTR2R0a21uTW1UU2R2Q1hUZHRrTXphNVRKcGNKaFg4NWJNcHN0a1VQWmswNmJ0ME5ubGJ1aTFFZnIvQWVaUThxYmJERldzdW5oY3Vhc0xQcis2VVIwV0Y3cUc3NGREcll0ejdtN3FxUExadE1URTJTTGxTOWFWQUF0ZXY2TnExWlE0ZG5DTytxaERHUXNMQVpNeldtZlV1TGExeDZxMExWRXczdGlKMmpWSFFWZ3ZtWnNhWm5SbExPTFV1NnM2MVZLN3krdXZ2VWF1MXQwS1A1K2tjR0NPRnRNOFRXM2gwVmw1TEozWkVsVnFUaTlmWDJUYzkxTHBxamphcHBUM3BYSmFaZzN1NGR0cWhyOWExRDRIL2ZXSGh4TmRPbm56NjFXNHo3bGJhaVNBL0JoeEJmVjh0MDBrQ2VSUE1MU09kWlR3RFZGQUFiNHJ1TWN1NWVQSG0wSXN2dnZNNVV4L2VUbFN2bm4zd1JuRDhrYU1NRFBXQmhPV1ZEVnpQQy9iQ2g1T0FlakJLQUtCY2JTb2Z6enVZQkVvL1hQYTVlZGYxV0YwdnNiSldwTjV3ZkZlenhpSUdBK0JGZUovTnBNajc0TnlUUy90L0dmcnlhWHJ6R2ZMWlZLU1BQNkRkUzVXNlI2SG00R29YeW9Za0pJSUhIWUNVT1FuRU03UWJMUUpZWGl1d3Q5a2twYmx1Z1RvbU5pbWZ2OURReDlGS2Z3VWdoT1RTbFVYcWphYWFBL1JZbDhwZmh1dkpWbzQ4YUdGa2lhSktiZk8rSzh2cm5IcjdQSzZ6eVNtcGJmSjJpdk90NmJhTjFiL2xVZ3ZsT2xjV0M4eDE0djQyUnNOamd4UUxVMVN1dXVRYm5mbnk5eWtEL09iQ3dvbkhUNTU4K2dmQ3YvMU9BL2tKNEpoLzd6dEVUZVRhMndHOUNhME5vSWdhYzBsaWZrM2lkMzduVDM3UmNid0IyOWJBcmpuMWRsYjE2bTkyN3pSemU2Y1J3SHFockh6U2E2VXlwaFNnbFlzdlZSc01EK1JJM1N0SDVGMVEyZ2EzNm5CenVjaEdzWUxyZVVndkZLdGJRaGtPWnRNcGRmVUJQZWNEZWo2YjNoWHYrUUZ0RDNuSUZzNWRrL0JSVWFzMEVxRFFSM2JKUnJIQzJucVp0WTBpUnc3T2tjbWt3enltSkNnc1BDaFFlcEpyTjFiWk96K1J5R2hHNjQySzZrMHAwOXpNT0V2TEcyM2ZOZUQ5QTJsQnlObTJBenlUK2IxNDhUcG56MS9kNUh6Nlc2WE9TdWdvMWExdytCM1NhcUZLeXJhWWlybS8zYUk1U0dCKzN4U25LeFVhS3c0WnA3RlZOcFB1QS80djRCZTZhdXd1cFowRThtUEEvZjY5QnZpdGdENUpaTzhDYXlpUTErNXRXNEJkLy8yN2YvZjhuMTFmTHoxcVdhb29rNE1IRTV5all2YStnVjZPUDNJVUJOVHFUWXJscXE5Zk1oWUZmbFhSeWdXMWhrT2o2VEk5MnZuQXZ0ZVVGaDVTdWt5TzlKSk5wNVFvUGFORjZxbk5KRzRmMEE4WTVWSVdSZHdBakUwUmZBQ2dmbG9EVTBGQW9WQmhiYVBFK2tiWlA3ZkF3L1VreTZzRlpxYU1mZVphN0s0RHpQTUJmTHB4YzVXNTJYR0VFUi9LMHRrVXRYVDA1UGdRNmJSTnZlNUU0amJMWTFiVG1rYjFnK2RKM25yblBEZHVyTVFLMkI0T2V4dUwya1l5UHI3UnJzVzFNajI1TkFPOU9kbzJPT0ZkaENYWWQzQ2VNOVVHZG1rVjIrdkthdjl6Q3dzbm5qdDU4dWsvNkNiVGJxU2R3bDZOQUkrUXZOVXR5ZTFzZk11Y3psY0dyZ0pWTmdGMkhmRGlpKy9zUFgzNjhzKzNBcnNnTHFJM3c3VWVQbVZiZUo1a1piVVkxUUdJYUlWK1poRHFTTlp5cmNISVFKNWNaaWV0c1RhbmdkNHM5KzhmNThEc01MTVQvWXdQOXpEUW15V1grUURnUDZBb3BXekJRTTRtbjRrZWlkdCttSVMvdnh1TGEyeHNsQTJyYWZXYlcxMHJ4bURjbDZyNXVvQzRoYjBRNExvdWkwdnE3UGFvaEk1SVd2M2JERW8wRmcrV1pURXpOUlpLOG9RQzZXcXQyVEs1dEhrMVJDeEJvOUhrNVZmZmlRSjhoM1J2VERLVDY5eTBKU0x4dGkxZFhpeEVUL1hya0hLNURIUDdaeWpsdFB1VXJ1Z0xDd3NucHJxdWRKZlJUa0NaWWVBSndyVmFuSXMzOWVoVzdCNC9YZ0tMUUluUXFFNVRIT3dCUktWU1N6Lzc3QXYvZytmSnRCTFR0M0x4UUF2WUN3SEhIejFHZitSc2VCZExXSVllWG9RLzdHQUNVcTBzbE9zSUNSUERkOGRsN1hhUzFBcFduejRBOXcrb0hmWG1iSHA5TFptVTZqUzVodXZSY0NRTngvUC9RQi92cTVuclhEWkRyZDVvNGRvY3gyRmpvNlNPaE8xQ2RIejEyaklUNDZIZFM1UWhUR0lQdGVUQmZ4UktaSC9oMG8wZ3JObDArY1kzWHlHZFNUUFEzOFBnWUQvRGczMzBEL1FHdi9WMmV2bENxY0tyM3o5RHJSWVZMOTh5MDkxRlJsTmlzcTNHZDl0QXJ1dHg4ZVk2QjJlSHU1NVlSa1lIS1JiR3FWeHIwbFB2NmtDY2NlQmZBWi91cXNKZFJ2Y2E1SHVBRC92dDhHZ0ZlRzBubzdsM1lsZUJNcXE3NnFlTjcwTnJBWGNkOW0vK3pWZC9wbFpyN05PSHpFUVN0UkhaZzJCeVpvTDUvVE1BbENvMUt0VjZaT1VmVkpJd1VJdVZodHFDWXd2NmU3UHRlMlhIVXN5NlY0Ymh3ZDBId1A4QnhVZ0lTS2NFNlpTTk9ldzlpUUw3cGtmZDhhZzFQUWI2c3F3WGtyZVFMYThXR0J6czh3c2x1Zy9Qck0rNHI5WWJ2UG4yUmU0N3NnZGhpYmFHZjV0WnJnLzA5ekRRMThONklRb2c5WHFENjVVYTEyNnNnbStNTnpEUXk5QlFQME9EdlF3TzlwUE5wSUpTYnk2dThjWmI1M0JkOTlaUXZVMmU5a1Z0VmNrMnlmTmp1b2xPUzQybnE5U2FYRjhwTWQzUjhiVFIwTGs5azV3cGxXbXNOYnZWei8vWmhZVVRQMy95NU5QUGRKTnBOOUc5QkhrYkJmQlpRbENIOE12cG43QXBwbzhEL2lwd25kaCtkeU5kNHZOM3Yvdlcza3VYRm4rbVZSd1BVY0NLeHVkN3NqejB4SEVFQXNkUko4dnBkQ0plbTMramIyc05oM3JUd2JZRXZmbk1QWFZkZTZza0JIaGUrSG9oeG9kTC8zRGUvUUQ0UDZETnlSS1FTMXZrakMyUTg2TXpmT2pvSk91bEd1dkZHcXVGS3FzYlZWWUtGUXFGQ3MyR1lUSHY1NG1MdytPMHRsSGs5YmZQODhEUnZRaExUeVVoUUN3dHJWR3BxUVc0SnlXZUI1NzB3bWRYa3M2bUkyVW1WZWQ2SG12clJkYld3MjFkK1Z5V3djRStVaW1ieTFjVzZRYit0Z21DdDRmdUVvZS90RmFtTDUvcCt1Uk4yN0xZZDNDZWQ5K3NreXF2WVNYN3NXOUgvOHpYenk5dW5YVDMwYjBFK1VkUW92b2s3dDNrNHR0WjFsOURpZWpqNzVERXZRZmtlZEo2N3JrWFQwZ3BVNkVvUHBtYmp6N0RveDk1aUV3MkEwaFdWZ3YraVZjR21CbC9ac1d1NjFHczFBUEhEd005dTVHTFZ5UUl0MFVGYjZoTnBSSEtzdGxQcDhsa3VGcVpyL2VuKzlZUDZOWXBrN2FaR081dFVXbFZhMDBLMVNaTmFWR3NPWlNxVGh1UFo3NGlYT2h0Y1ZBc2xIbjlyZlBjZjN3ZmxnajVnVktweXFtM0wrQzZIcTZVNGFsbVVobjhlWjdFM2RvM3VxNjFCUVNyMWJxeHgzNXpxL3V0STdzalFXZkdkL2RrTWJGSnBaZHZibkI0ZnJTelE3cU1jdkw1TExON3A3bDJ6bUdnMG41SFJBS05BTDhPL0Z3M21YWUwzU3ZEdXdQQWZsb043TVFXVjMxL0RzWEJid3JvU2MrLzhSdGYrZlBsY3ZVK1NPWXcyK25rajl4L2lCSC9MT2lOUW9WYXZkbTJFak5NU3RqUXh5d0t4ZHZ2VGxHOUl1bkR0NVJLUngvK3haLzlQeit0SjhNODRiMStqdWU3MTIvNUFlMUV5dWZTVEE3M01EZVM0NzZaUGo1MGNJaFBQajdQVHp4MW1JY1BUVEUrM050ZWJDU2dVS3p3K3Fuek9LNGJMTWJQbkwzU3VsQ0l6d0dkTkc0YkZxcWRGckdUak8rNno3MTVPUUtCNDNwY3VybStwYUloaVViR2h4a1lHNldTN2VtMmlYOXBZZUhFbitzMjAyNmdlOEhKandDUG83NVRuSHVIcUxqZUZObnJOZHM3cVAzdm5lamZJOCt2djM1dS9NeVpLMzh0T1RxWmV3Y1lIaHZpOFBFRENLRXNZOWMzU3FFMWI0dFNJRnBHc1ZMSGRUMy9kQ29WbDkyQkxteTdvUzFPZGtVSy84TUZITDZmejdpTENBT2tXanlJcEhpajVMdkI4WnN1YW1WQ21Ia1RERTRSdmt2d2xjWHRUb3NmVUNjMDJKdGw4T0FFRHh4VVo3clhteTdYbHd0Y3VWbmc0bzBOTHQyTW5tVmVMRlo0N1kyelBIVC9mcFpYQ213VXVqRFUydktEYnFVOWpzVnZGd3Q5SytWc2thZlRJdStVVktKY2JYSnpwY1RVYUYrWDVRbm05azF4cGx5aDZUaWszYTcwODU5ZldEaHgvOG1UVDNmdFJtOG4wOTBHZVF0WUlEUzBheWVtVHhMWFMrQXRvRURVNHI1ait0S1h2dmxMbmlmejdZNkRUS0owMnVieHB4N0NzaTJrbEN3dWI4UUF5TmRBQy9OSjNWVHJUV3AxSnp4MzNnKzNkN0ZqR1BVaFlzWjN4bzlQQ2hDZUFmU0JpekZUWUsvdkRHRDMvWktEMzVlZXI1VU13RElFZnRlVjFKb090YnBMdmRHazFuQ29OVjFxOVNiVmhrTzk3bEN0T3lxODRlQzRIbzgvZUpDeGtYNjAxRFVDM0lhdU1RN1EzVHh2R3RmdWFxVEpwOW96b2g5UVo1Uk4yK3liSG1iZjlEQWY5Y05XQ2xVdTNWam40dlYxTGx4YjUvSmlnU3ZYVnJoeWJlbTJwRWIzNUZPMUFicHRBZVZ1Qzd2RHRMaFdwdmNXOVBPV25XTHZ3VG5lZTZ0SmYza05TM2FzbjU4SC9nbHdvc3VtN21pNjJ5Qi9IQmlpRmREMWtFcmk3SFg4V3lnbk43ZkNCb3QvOWErZSsrRkNvZnlrT2xSbU13RzcvK1NuZWVEeDQvVDA2ZTF5QlpxTzA1SDcxYWJqVVNqWEkwZFhhakwzRHU5S2tqRnNsNjF4eEVCVTYraWpDeVNsL3l6WG1wU3JEY3ExSnZXRzR3TzREOUwrdGQ3d2didnA0RGllRXZWRGdOWktMWkE4TTZWdG03NytYaHFHVWZPZCtBSmFlaUVUdUhoelVTSDhtd0RnL2JpazdTRWYwTzNUNkVDZTBZRThqeDZaQnNCeFBSYlhLcng5YnBDelY5YzRlMldWbFkzUU5XcUNqSTliUnIxYkJtV1Y0dmJ4ZHFzU3RnblIyM24vNmJvY0lzMHg5ZlBkTEdMeXZUMk1UNCt4Y3FWSmZ6WDVLT28yOUFzTEN5ZStlUExrMDkvcEp0Tk9wcnNKOHYwb1k3dTRXTjcwVDIrR204elZLV0NKenVmQXlPLzA3TmxyQTIrOGNiN3IxZG40NUNoN0Rzd0J5b0JtbzFoSkJPMDRTUW5yeFZyYmVOdmF2Wnk4MXJHRERFUXRtLzM0SE5lalduZW8xcHFVYTAwcWRSL1FxdzJLbFFiVldoUFhrOHJJeVRkOFVuOWU4S3dOL1c1Vlh6ODFNWVMxQy9yY2srcjB2QS9vemxMS3RwZ1o2Mk5tckk4ZjljTldOaXFjT3J2SUcrOHRjdXI4SW9WUys5OXZoTXp4NkMvWWJodnFkZ2duM1VKZHZOOTJTUmFVZm43amxzNzRtSmdaWTMydFFOVjF1dkZ2YjZIT25uLzA1TW1udTVMMTcxUzZteUQvRkpDbXZSNituYmorTE1ySXJwdTJSc2JOTTgvODBTODRqanZValpqY3NnUVBQL2tnd3JMd1hJL0Y1UTNGcFhhZ2ExMHYxWEJjTDdKTkxwTzJsZjZ3TDlmRmErdzhVc1owTXVEWW00NUx2ZWtHb3ZGYXc2RmFjNmpXRmFnM0hUY0FiZ1hrWG5qdnlic3lsODFxZDZnN25ENHdPTHgzTkRyWXd5Y2UyOGNuSHR1SGxKSnoxOVo1L2QwYnZIYm1KdTljWE1KcmRMVWw2NDVUeTc3K3R1bDJzSVY5aDFTdU5yaTVXbUp5cEM4V3MzbXJoV1V4djIrYWQ5OXBrSFlicEZ5bmJkb1lIUWYrUitCWGI2bkJPNHp1RnNqdkIvYlFtUjdldkM0Q1o3aU5YUUJmL09MWEhsMWUzdmdKRStDVHhiclJzUHNlUHNLQTczaGpjV1VEeC9Yb2hCa3NWeHVCSGo2ZlN6UFVsMk93TDBzdWt3NmM2Z1Rub2U5Q0twVHIzRmdwQllDdXRodjVuTGZtd21VSTRwcnU5Z1NTc20ybXhvZllNenZHL1BUb25aUFJkMHZHUWpFd1R2VGI5UUhJN3d3U1FuQndkcGlEczhQODlBL2ZSNzNoOE9hNVJWNDVmWjJYMzduT2hXdnJRZHJOek95U1E3Y0FwazFqTjJ2MHJXYmNIYlM0V3FZbmw2RS8zNTErdnFlL2w3R3hJZFlXWFFZcjYxdG5DT2tmTEN5Y2VPYmt5YWN2ZEZYaERxUzdBZklXaW90dko0NXZCL0JsNEtXRTlMUjVicUZtMDdGZWVPR2RYK3Eyd1VQREF4dzZmaEJRMXJqbGNnMnhoYkdlbE1vWmhnVG1KZ1lZNnMrUlR0a0dzSWRhYkU5SzdGMks4aHZsdXZMY1o0ck9ZK2dVQjZ1VzV5MXJhZjNVMG9zT0JHbm80dkdmYmN0bWVrSUIrOHpVQ0JuYkRnSDFIa3lBY1IxOXUzVkdZRkQ0UHBta202NmtVbmV4YlVIS0VxUnRzU3VkUDJuS1psSThkbXlHeDQ3TjhOLytGS3dVS3J6eTluVmVmdnNhMzN2ekNxdWJxT2EycEYwRnp0dlZXTCtjTG92VCt2bVdFeTIzS0dkcWZwS05Rb21ha3lmWDZQaDAyUnp3ZndJLzAza0xkeWJkRFpBL0FnelNIc3loRmNoZDRMdW9rK1NpcnFiYVV3c3kvUHF2Zi9renRWcmpzR1ZaQ2R4NzY1UXJwVVFJaThkLzZHRnMyNmJSZEZsYTJURGlveHk0THFFM242RXZuMUZuVmx2S2g3M1MzY3RBVmlhTlo4K1R1M2JTcXpkOGtaZmU2QjZ4bGsvNENGc0EvbFlaWkd0UTVObTJMS1luaHBtZkdXVjJhb1JVeW00eENBeVM2ODloM0l2WS9iMWsrRjF2NXdnY2JvZnFqa2UxNlNFYi9qRHgzeXBsS2FQVHRDMUkyeGFaMU80RS85R0JIajc1NUVFKytlUkJwSVN6VjFkNTZlMXJ2UFQyTlY0L2M0TmFzMk94OEszUmRsblliNWJoSHVqZnczVEpxZ2pIOWJoMEk5VFBKNVVYQWtrWVk5czJjL09UWERqcmtIWWEzWnhXOXhjWEZrNTg0dVRKcC8razB3dzdrZTRHeUQ5T0NPYWRpdWxQbzF6V3hnWGtXMEtFdmpsNzlscnZlKzlkL2U4aWtWdHduQUNIang5Z1pFSTV2Ym14dElibnlYRDdtMUZET20wejJKZGxvRGRMeXJab05GM0Z5ZnNjdTRmRUNqYWNDZCs2UE9Ua2R5TkpLU2xWR3NTN3ZSMFF5OGl6M0ZxSDJNSDNrU2pEcWFueEllWm54cGlkSENhVnNrT3UyVWgzTy9BUmZxMEVicnhEMjR4YnFYTTNxM0kwTlp5azhTR3BPMUJyZXNHemVsZEIyb1pNeWdyK2NpbXJJOVhZVGlBaDRORGNDSWZtUnZoTG4zeUFSdFBsOWZkdTh0TGJWM254cld1OGQyVWxzdUNNNUUwT2JrbHg1eTNzN3lCdGM5WGxXb09sdGJKeWZOUUY5UThQTWpoY29PeDJiVzMvenhjV1RqeCs4dVRUTzhzb293dTYweUIvRUJobGM2NDlEdkFsNEEwalRjZkFiajUvNFF2UGZ0WjF2ZUg0bm5nMXVZaklNNml3M3I0ZTduLzBQZ0EyQ21WcXRZWmhUUzhSV1BUM1pCanN6OUdURFhYc2p1dlJkRngvYTUxdWpnSjZnUVlETGFJU09LNjdLeDNpbEt2TlFFeXZRZHdFWWpNOENDTUIzSTJ2S29TZ0o1ZFJudTlNQy92Z2lyL1FndjYrUFBQVFk4ejR3QjdoekdPMHZsSG02bzFWN2o4NjMxWkVibDViSW04UmFMdGRCT2owUWtBK3JmeTU3MmJ5cEtUcGhLcVVkdk83anZNOGllTkt5blV2NGlIUnRpQ2Jzc2ltTGJJcGkzekdJcGUyZC93Q0tKTzJlZUsrR1o2NGI0YS85UmRnYWIzQ04xKzl3RGRldXNEcjc5M3NmSUYvVjNGNWgyMmoyNEp1cnBZWjZNMlM3ZktvN3RrOWs3eFRxRkIzR21TYkhhdFlIZ0UrQy96TExwdTVZMGkwMjF1OFRmU1hVY2Y1U1JTSWQzTDlZK0NTYmg5S1hHK2pGaVMyOGRmMitkbG52N2YzUzEvNjVwZHQyMHBibGpvVDJyYlZuMlZaL3JQQXRtMHNTL2h4TmoveVp4ZVkyVE9ENTNsY3VIeFRZYklseUdWc2h2cnpEUFpsc1MwTFM0VDc2QkZRclRtQXhES09xeldQcmhVSU5Ybjd6eWxiTURMUXRkdkZlMDdYbDR0Y1hpemdlaElaMy9abWJIOXpqZTF2MFcxeDRiTVFncG1wRWZiT2pwUE5wQTNkZWd5QVpaU3J4b2pUWUJvSlJDVjJYWS9mL29PVFRFNE1zZkQ0VVhLWmRCQVhGaEM5RnhoSjd1Snoyb0tlOU83bjRBRktkWmRTelZOTHUyRFJaOXdIYm8xRFFBL0NBT2x2bWZSUUI4V292S0g5UjAvV3BqZGowNXV6NmN1bFNPK2lQWWVyaFNyZmV1MGkzM2o1UEsrZXZoSFk4Q1N0Z2NNYlNVSVMvM2ZSbWpGcE5sZkZ0RXBYNGpmSmRjVERrdVZ4MG9odlg0ZDVLemR2Y3dJdW1lWDE1ak1jbUJsR21rNG1qRFJ4aDEyNkY5ZVcxN2x5L2hxRGxmVnVuT1FzQVlkUG5ueTZLNGY0TzRYdUpDZS9CNWdtQkcvWVdreC9pUkRnNDVURXNjZm5mUW53N0xQZis3c2cwL0h6ei9XRUVqNHJEbDVLbU44L3cvU2VHUkN3dEZKQVNzbGdYNDZoR05jT0VrOEtKWllRMEdnNHdVRTFJZWV1eFBOS2RPSG44ZStVYjJhSjQzcXRCaVE3bkFybFJvS0xWNy9iRTNUMFFVSWpLSjFLTVRzOXd0elVhQ0JtYnlsekUrcVV5Yll0aThHQkhxNHZydkhzMTEvaG8wOGNZMkpzc1BPSzdoTGxVdXJ2L1VCU1FpVnBxMW5TSkovRTllbHhJQUFQaEFnWEI2RDhDQlNyRGhzVkp6anpJSk95NmN2WjlPZHMrbk1wK25KMlI4NnE3Z1h4OC9aekFBQWdBRWxFUVZTTkRPVDVxWThmNDZjK2ZveU5jcDAvZmUwaTMzamxBaSs5ZFpXbUUvYmI3ZXF1VzlPeGZkdm83cW11UGt4WHJqWllMVllaSHVodVMvTHc2QkNyUzJ0VTNDWjl0WTY5MTQ0RC96UHd5MTFWdGtQb1RuTHlud0dPc2pYM2J0NS9HZVhWenFRMFhYRHhUei85dTArOStPTHBMNlJTSnRkdWN2RWl1TmZYZERyRlQvN2NUekF3MUUrejJhUlNLalBZbHlWbDI0WWJVblZqK1Q3ckVZcnJxRGJVUVRWQ0NKK1RKOExOUjdoN1FnNi9MNSttdDh2dElQZVNhZzJITjN4eFk5Sld1WGg0RU85dnNjdGtVc3hOalNySE5NSUtzYjhONXg1L05qbjN1R0dkdVFWTlQyaEN3c21YejNEdTBrMzEzWUNIanU5VDR2dFl2bnZCeVZzVzlLYWhrNE8yZGd0VkdoN0ZtbXNjV09SL081LzdDemo0R0ljZnFvQmtOQTIrdWtZL2U0ckRENjh5RVBsNy90VUMrdklwYk9tUXdtTitjb0NCSFg0Z1ZLbmE0TnZmdjhRM1hybkFDNmV1VUcrNnh2aHV6OG1yU3hMSDJrb3lGcG5FeWJmVWsxaWVUQXhQNHVTRDhDMDQrWlo2U2ViazQrWFpsdUR3bmxGU0thdGpUaDZnVnFydzd1bUw5RldMcERzL2U3NEozSC95NU5QdmRwcGhwOUNkNGlIU3dHRTZNN0lEMWZ1WGFBVjRqUGhFcnQxOHJ0VWExcXV2dnZjclFJUURVTStTSk00ZUpBODhkb3l4c1FGeWFadXkxeURUbjFOZ29RdndPUU1oMWVSaStTaFRxU3NkdGJha1Y5eTZ3QXI0VFJsNVNYTXRXbXU0OU9iYmQrQk9veHVyWlgvQ0RTZHY4ejZ1cDlmWDNwNHNzMU1qakkwT3RvSnpCOVF4ZDUrUWNIaXdOMGpnSVhudHpRc3NMbTJ3OEtHalpEUHBZSTk2MGdJaXJnWG94UGd1L09xYnAwL2IwSnU1WmJYL2pxVktJM1EzTEZIdkc3SGRpTXk3TW9nTHd4S3V4a09jR3pYek9rMlhqV0tGUXJITVJxSEs2bnFScHVQaWVwS0IzZ3p6RTRQTVR3MnliM3FJdVltQkhTVkY2OHRuK1BHUEhPTEhQM0tJV3QzaDVCdVgrZU9YejNQeTljdVIweTYzcEx1cXg3LzM1SHFTcTB0RjlrNFBkcFV2MTlmRHlNZ0FhOHNlZzI0VDBSbWptd2IrR1lwNTNWVjBwemo1KzREL2lzMjU5dmoxOTRBYkNXVnBuZnlXblB3LytBZi84cTljdnJ6MGp6YmozTTN3YkRiTjBXTjcrTlNmK3lpcFRJcGF0VTY1V3ZOMTZNSVEwV3VkdXI4MVRrQ2o2ZEpvdW9IT1hWaEtoQi9vNGkxYWRQUmh2TG9POWVmSWRXazhjaS9JY1QyK2YrWUdUc3poVFJJSHIvWDAvYjE1WmlaSEdCcnNqWERqblhMdVFBUUVrb0F6NEFJTUVhTEp5ZDlZV3VmNVAzM2RBRk9Wc3llZjR6TS85ampwbEsxQVh0NGQ3bDBJcFh0L3Y0am5UU3JYWFVwMUw4S2hhKzVjZzd3Mk9vdHk2NFFjdVd6SDJmdjNmbHJIOVNpVnF4UkxWVGFLVlRhS1pTclZlc1NUWWxUU0ZOcUl1SzVFV0RBek5zQys2U0VPN3hubDJONVI4dGxPZCtyZVBhbzNYTDczNWhXKzhmSjUvdlQ3bHloVlkxeW5qSEdzdEREU1J0TG9pa3EydVlsa2p5M0N6TUFXenJ0TkErS0xlaG0vay9Gd1hVenlpeVNWdDNkcWtJR2ViS1NjNUg0SkszT2FUVTZmT2tlNlhxR24zc1ZKaFBDcGt5ZWZmcjZiRFBlYTd0UjA4d0NkNzRuM2dKc2tBN3hPbHpTbUlrekFtVE5YY3BjdkwvNmlubGFUT1hjVlp0c1crL1pOc21mUEpFZU9IOEJPMjNpdVI2bnNXMXdLZ2kxdzB1ZmNQYW5BWElzSnF6WEhFTWxMbjFzTTc1RUNUNm9KUlVobE5lMXBrVDBDeDNHNXVsaGsvOHdRM1p5S2R5OW9jYTJNNDhsV3p0MjgrdmZEZzMzTVRBN1QyNU5yQWUzTktCSHdPOGlUMkhOKzVxSEJ2b0NMQjZYalJZcGcyMTJuOWR3TzZUYmFGdlJuMVBYOVJrMVhVcW9yZVdrd2w4WTYxbHk0UlNacHZRaElBaG1pNlM1ZFdXSnRvMHk1VWxQR25hN0VsZUg1QmkyNFlBQ0lHZTg2SGhldXJYSDI2aXJQdjNBV0pPeWRHZUw0dm5IdVB6ak9vYm1SSFhHK1JEWmo4L0ZIOS9MeFIvZlNkRHhlZXZzcWYvenllYjc1NmtVS3h2RzV0MFZkYy8vYkxDN1lodUt1TGhYb25SL3Q2cHVsMG1rbXBrYTVmczBqNDlTN2NYbjd2d0c3Q3VUdkJDZWZCZjRlNGVseG5WalZmeFhsdmphSk9yR3N0Ly8yMy81Ly90Yk5tMnUvRXJXZzE1eTdzckRQWk5MczNUdkIzcjFUWkRJcCtnZDZ1ZS9ob3doTFVDeFdxTmVib2Q0OTBLM0g5ZWxxSzVucmVvcDdiNmQvRnlLd3d0ZGhqYVpMdGQ2a1duZHdQUTlMV014UERqQTNNYkRkMzJEYnFONTBPWFgySm80YjQrSWxFVTVlZXBLQmdSNWxLZCtXSTVOdDlhK2V2d0JyRFlNakIyYkladE1CWWdaY1BWSE9QWGcyMnYrN3ozMlBVbFV0M3FTRXZwNGNuL25rRThvYm9aRTJ6bmtENFRueFJyeHhpZVFKOGlYa3lhV2c3MzBvbmdmVnA2dGxCOGNBV3IxcFVocmZja3VPWG45N3pPOGZIUXZGVXBXM3pseWkwWXlkaDJCeTZsTGl1YWFFeVZNSElQbG5Kbml1R21ldUZ5NFF6TEpjenlPYnRqbTJiNHlIRGs3eTBPRkpac1ozMXUrejZiajh5U3NYK0lOdm5lSEZ0NjlFRnpkdEZ0VnhUdDVQYXR5MFdXUWxsU2Mzc2JEdm1KTTNuaExxNklhVEI4bElmNTdaOFlHT09Ya0E2WG1jZWVzY2JxWEtRTFVydy9uUG5EejU5QjkyaytGZTBwM2c1SThDR2FKVzlTYlhIdWZ3UGVEOEp1Vko0eTh4N05WWDMrdTVjV1B0YjdZYTdLb2Z0R1haN05renliNTlrMlF5S1lRQXovT1kyejhMRmpRYVRTclZlbUJVSjVHRTFyK0srOU9LK0hyRFUySjZTd1M2SE8zMFJ1bmt0Uk1jNWFhMDFtaFNxVGFwTnBwSXFRNitzWVRBc2xROTE1YUtqQS8xZEwzbjgyNlFCTTVkV2NWeHRRR1V5UlhKeUo4bkphdnJwVTJOOEJJTjh6WTVmYzd6SkxQVG95SEFiOUpRYzRDWllEbzgxRWV4RXU2SlhYajhxQkxUMHpxZ1d2VHN4ck9PYjRmVVNWRkNLSEIvUDRybk5SWHJMbzRYNzBrU3VQbm84cXQxRHZmakpaSHZxWXBTVDMyOU9ZNGQzc09iNzF6RTlSeUM3WFVZb0NCbEdHNm9CSWlVRjRLRmpJMXBwS1JTYi9MUzI5ZDQ0YzJydUZJeTJwL253Y05UUEhwa2lrY09Uekp3ancrWlNxZHNmdXpEQi9teER4L2srbktSUC96MkdiN3lwNmU1dWJxWjJIbG5LT3c3YlVXbk93YzBLVXY3ZkZkcUYyRlpUTStNYytIOE5ScXBESm5PamZEK2w0V0ZFMTg1ZWZMcGU5K2hIZENkbUg0TzRoc1EwNW00L2h6S2NyRWR0UVYzSGZiNXovL252K3E2M3JCdFIwWDFsbVV6UHovQm5qMFQ1SEpwTEVzb0Rsd0l4cWRHNlIzb1EwcllLRlFVdHlDa2NreUNRSGkrZ1IxQ1lid244WVRhdWlGUno1WVFlQUtra0ZqQ1V1SmdvRkNyVTY0MnFUVWMzNUxhQVBaZ1VsR2lmOWZ6T0gxeGhlTUh4bmVVTVJEQXRhVWloVXBEOWFjdnE0K0FPM3B5TkNiS3hEQ2RYa2J2ZzBXVURCWlVaam1aVEpySEhqd1FiVlFNVFJOL1pRWTREdy8yY3ZIcU1nQ0hEMHd6TlQ0VUtXSVQzTzZZa3NwSVdUQ1kyNzZqWXoyNTh4emxsT3NlTlgvTFhGeHRZLzVRSStHeFgzTzdGWHlRSVFoVFk2T3ZKOGZ4bzN0NDQrMkx1TDZJTmNSM2FlU05sYXVIbVVDZGd4QzBKUnpQaVNSaGNiM0M4OTg3eTFlLzh4NVN1dXlmSGVHUncxTThjZDhzRHg2YUNCYU45NEtteC9yNUd6LzFPSi85eWNkNDRjMHIvTUUzVC9QTjF5NUd0dVIxUm5kd0VYQ1hpcjYrWFBSZDNyYitVTm8xb1g5NGdMN2xOYXFlMnczSVB3cjhOR28zMkk2bk93SHkrK251cExsMllucVQ0dk5GRVBiMXI3L2F0N0t5OFRlRlVBQ3B3TjFpYm02Y3ZYc255R2JUV0phdHRuSjVIcFlsU0tkVHpPMmZRd0xWU3AxbTB3RWhFRjUwSXZVUS9tcEZjZW5WbXFOT294TUNUd2l3cEI4dnFEYWJGRXAxU3BVR1VraHNvZFFFUWlqNXNpQ2NXRHhBU09YczFwUEtWZVBwaTh2Y3QyOTh4K2puUzVVRzE1WUtFVURYM0x4cERCVUYvWFpnM2c3OEU4S00rOGNlMkUvT2RKUkQ2ODlYa216cHJtbDRzQTlReG5aUFBIaXdKVy9YWk5TbDY5WVY2K2Q4MmhmUGI4T25sRUN0Q1UxUEdlM3RsQzEzeFpwTHRSbGRsQ1VxeGVNSUR1amVDd0E1bWlPNEJsbU5RSW5pNk84L3VvZlgzNzdnQTcxc0hWZEdleUtMQ3hrZm85RzZkWDN4Y25RZVQ4S1pTeXU4ZFg2SkwzNzFEYkpwbTRjT1R5a3ZkOGRuT1RBemZFK2NHbGxDOEpFSDV2bklBL09zbDJvOGQvSmQvdUJicHpsM3RkMkdwVjFNYlJDN1VtdXlYcXd4MU4vZHRxV1p1VW5lTGRXb3A3TmtteDNiT3Z6cXdzS0ozOTBOM1B4Mmczd2ZNRWIwdDJwZTR3QmZCUzVzVVdhN3hiNEU1RFBQZlBWdmVKNGN0RzBGN2pNell3YTRXN2l1QkZ5a3RBSkwrWms5VTJSeldhUW5LUlFydUJKLzI1dHZQT2RQUUlIRGZmOUhYNjRxTjdlZXBlSWNGOHFWT2h2bEd2V0c2K3YraFo5R3pSS1czMXBQNjQxbFdLYndlOFN6QklWS2d6T1hWemk2Wi9TZU8vTW9WaHFjdWJTU29DY1B1Vy9OM2JkdzlETEdLY1ZuYmNKckMvZG5jUGF6VXlQTXo0eUZrNjZaVmJhSzVaTklBaVBEZlhoU3N2REVVZEpwTzBGTUhDNGU0Z3VHeE9kTjZoTkNHZGYxYkpPaHRpdWgwZ3pIVEtVSkdSdXlxWHVuMzVkQW9lcFNkMHprRE9QQzd5bURNSFdWa2JnSXVPcnhwVk9heUI1dzUvNFg4RG54dnQ0OER4emJ4L2ZmT28vYjBCeTlKQ3F1MStWR3d5SU44Ky9qWTFpUGNXSnQxZTNWVkcrNnZQaldWVjU4NnlyeVA3M0l5RUNlano2OGh4OStiQitQSEoyNkp3WjhRMzA1ZnU1VEQvSnpuM3FRTjg4dDh2dmZQTTN6TDV5bEVyZk92eE4wbDF6YnRxTWJLeVVHZXJNSnA0YTJ0a2szTTV2UE1UelN6L3F5UzZiWlFIUzIvSDhBK0ZuZ1A5eGVpKzg4YmJmaDNZUEFYNkZ6RjdadkFiL2ZRYm1KeG5aZi92SzNScDk1NW85ZXNtMnJQd3J1b1N0YklVTERPOHNTWkRKcG52b3pIeUtUU1ZNcVZ5a1VLNEZoWE5SeGpkb1dwOFh0aFhLZHB1TmlDVUdqNmJGUnJnVVdycFlsc0gxeHZQNnpnOVBvL0cxOGxsOUhJTHEzMUZVYjZWbXF2cEgrSEFmblJ1Nlo2SDY5V09POUs2dSthMXA4eTJVWlhxVmhkR2VHQlFaNW5ldmoyNFdsVXlrKytmR0h5V1hUTFNDdktRQm1IV0hLMzJQUEw3OXhsc2NmT3RnYWI5d25HZE4xOHF6RGJBdUdjMm9QL0haUTNZR2FTL0NpNWlMREVrcGFjTGM5dXJxZXBGanphTGdhVEkyRldvREptcXMydWV1WVVaN1U5aDFHdUFIS1hpUmRtQ1pxdEtuU2xVcFZYajExam1iVHhaTmVzSVhPTmNhbk5xZ0x4cGxyR09rRllaNWhqQmMxTXRVT25iU1JuK09xc3RwSklmUkRmMitHanoyeWwwODh0by9IajgyUXZvZGltR3JkNFdzdm51VS9mL00wMzMvM2htNGk4WnNXTkVqNDdRVUxyOWFrUVh4QzBhMWh3VUl1cVk3RTFyUXBUMGJDeG9kN21SaUpIV0JqdHRsZ012UkRvOTdnekZ2bnlkZkwzUnhIZXhybElLZmpZKzN1QmRuLytCLy80KzBzN3lQQVh1TlpiSEY5RGJqV1FibGF4eS9NdjEvOTFYLzd5N2xjK3VQSGorOWxmSHd3RUhWcmpoM1VoMVNMUzNYSXlmN0RleG1aR01HVEhzdXJSU0pXcHlKYW9hWkcwNlZRcnJOUnJuTjlwY1RTV3BtYXp6MVlpTkNDM3ArTk5TZXVUNi9UelJGKzJxQUdIekVNTi9qVW15N0xHeFY2Y3VtN3ZvZCtlYVBDMlN1cmtjTmhvc1oxUk1MQUFIWTlBUnRjZk1ETkJSTjhlSTBhOFVYakhudHdQNlBEL2UwYjJvYWxidUc0L1RUVGsrcFVRVE11SXQ1UEFISGpFdmsrWmhyOW5MRmhwR2Q3Uk9sU1Fya0pEV1BhRUxFYkNhalRUQ1cyRUhkY1BDd2xsQnNleFpxbnpyelgzeXVlenVUV0NiOXBQSDFrc2pVbVdwMC9zTUV6Sm1PekxyT3NkRHBGS21YN3JxZ0oxR0hTQzhla0Z5eElkSmdNUU1RTHhuY29zZk9NY2VzUlZVK3A1ODcwM2ZXbXc3dVhWM2oraGJOOCtSdHZjZUhhT3JZbG1CcnR3NzdMaS9oMHl1TEluakUrODdHamZQTEpnK1F5S1M0dkZxalZvMXZIZG9heThQYW9XbmNZNnM5dmZZeXhFVzJuYkp4bWsyTE5KZWZVT3UySE1lRHNaei83NmUvZmNtUHZBbTAzSjM4QzViTmVzclVMV3duOEJ1MzN4MGZhU1l5VC84M2YvUDltdi9lOXQxOGVIeC9PbTl2a0FrN2FQM3dtRExmSVpETjg3Rk1mSVpQTnNMRlJvbGlxR2h3OFB1Y2UzZnJtZWg3dlhsNWx0VkFCU2NpQkI5eTV3YjBMZ1dYN25MckoyV3RPWFJqUFJocTFGWThXMTdqVG8zM01UdzBhSitIZEdXbzBYUzdmM0dCNW94b0I5QWk0RzF5N25rRE5iWFRCS1hKeGpqNFczbkxhWEl5VG54d2JadUdKbzBBNC8wZkFJYjRnTTFmMFdpVkNDT1JKTEljWnR4blFkL0tjVDhOUWRudjA3NDRINVlZQ2xTUnBRU3VwbDFNaWZIRkhEUE9xVFVtbDRRWkFCekd1UFhnT2dUSWVaMXJBbTF3NXhCM2ptR0FiQjJoL0RCb2N2dWVwaUVxdHdYZGVlaWZZbWVGcWJsM0dIT0lZbkxtVUliZXZ0OTFGdHVNRjQ5UHpkNWVFNDdYcHVtYjN4NzVHK05EQ2lmcVArVnlhcHg2YzUwY2UzOGVURDh6ZE00ZFlqdXZ4SjY5ZTREZWZlNTFUWnhlREJyYStSNHhrUWpyemVUczRlVUltSWJrT00weTJoUFgzWnRrelpYakNTK0xrWTIxdE5ocWNlZk04MlhxRmZLT1MwS0pFT2dzY08zbnk2WTQzMnQ5dDJ1N1JOVTVuTG13QjZpZ25PSjFRbkVHWVdGMHQvcE9ob2Y2ODV5bGYyYlp0K1lQQ1FoMGxLMUNIejFoSXFZNngzSDk0RCtsMEJzZHhLUlFyUGhqb3pScWhSYjByQmZWR2szS3R3Zko2aGFYMVNnRE9lQkpoRTB4R2xvOFllcFdQQjhKU3VuMGtnU3RjcEsvcjk4Q3oxS1FkcEFld1JHRGdKNlFxNC9wS2laVkNqYWtSSlg3YWJoRys1MG11cjVTNHZseFVKMkpwYnFVTndHczlmSnlqRDhXbkJrZHZ4SmtvcmZzdC9pZFJoOWUwV05OdlFlMG1KTmtTR2N0ai9OQzN3c1o0R2dsWUVnWnl5c0J1TzZqYWhLby9UUWkvRWxQYUVDeGNNTkw0SVEwWEdxNGtiVUhhRnFTc1cxOTBTSlJ6bTRZanFUdW1tTjJQRC9yTkZOZkxXTitISEwwdU01RFd4TUxqZFp2enVreUtrSzFwY3RrTTJVeUtTclhSS2hueVpMUnVHWllSdEVXUDFRQXVqUEh1ZDd5V1VIVjhWT3dtVktrMStkcUw1L2phaTJmSlpWSjg1TUY1UHZIWVBuN29vZm03Nm5rdlpWdjg2Qk1IK05FbkR2RGFtUnY4dTJkZjQwKy9mNUV0WDdITjR2azJrMjRyRmNwcWgxTnZ2dlArVEdjeWpJd09zcklzeVRacm5aNVNkeEQ0ZWVBTHQ5alVPMDdieWNsbmdYOEtiYm4yK1BVQzhLKzdLTjhHZW9EajE2K3ZIbno2NmQvOWdoRGt6SU5tMm5IenRtMlJ5K2Y0a1U5L2xIUW16Y3BhZ1ZLNVpuRFBvWWkvVW10UXJqYURIL21GRyt0SXFiaDkyeWpiNU5CYnJtM0NoQkMrZUZXNXZkWDNBWmR2Y3ZOV0tONjNCRmkyeGNSUUQxT2pmYmU5cDc1V2QxZ3RWbGxjSzFOdnVDR241WVhBbnNqUkd5SjhrOXZSWEZZaXA1NXdiZUg2L2V0akR4NWs3K3g0MEU0TnhrbkFmU3VqMWdSSzg5cE96OTZPZTdjRWpPYVZBZHp0a2llaDFGRFc4NG1jdTlocUVaTGNFeGFRc3BVS1FZdjA0KzhVTHJJVVY5ejBKRTAzQkhZSUFSTGFoMFc0ZGdQd1E4Qk4wc21yUklvWk54ZUcvaVJoY3ZMR21ETWxBV2I0VzJjdWMrM0dTb3NlWGV2bkZlZHU2TnE5ZHM1d0pOSjNuT01hK1QzWHd3M0tqWjJHa3ZRbGRGOGtKSkN4QVAyY1NkazhlZjhjUC96NFBuN280VDMwM1lNRHJDNWNYK2ZmUC9kOW5qdjVMZzNIamZ6K1FwS0o0ZUdpVExhR0p5M2VZaDNTVXQ1dGNQSVN5R1ZTSEpvYlFSdnZKTFlqVm9mVGFIRDZyZk9rNjFWNk8zZDMreTZLbSs5MjMrSmRvZTNrNU1mb3pJV3RUclBhWmZsVHFFTnZzci8zZTkvNnBPTTRPU0VzYkZzVnJ5WUlLN2dxanQ3MU9YdzRlR3cvZGpwRm8rbFFLRlFRbGdpNFpnbFU2aUc0YTlCZExWUnhYTFVmWG9wd1l0SWN1Z0pHa0pZL2dRbmZhbDRTS1Z0NkJPZWV1NmpWQ3A2eXdOZGNtK29VZzV2M2lIaGM4eHlQNnlzbGJxeVV5R2ZUOVBkbUdlak5NdENiMlhLZmJ0UHhxRGNkMW9zMVZvdFZhalhIbjRSbE1OQWpZdE1PQVQ2WXVOdHg5QkdPeUovUVpESVhQemsyeEw3WjhSWkFiL2Zjamt3QVQ0elFqOGF6MU45cUUwRFZ5Vk1XakcyVC9yM2hLb0QzcEtGQ2lMVmZ0MHVIdDIxWTdJVmR3SFVrOVNCUk5FMEkwckVKT1paVXRnblhZUzJUcmdud0dBQnYzcHRseFo3MXVFU0cxMkFhVDJxRC96YzQwTXZWNnl2QitBcmFaOXdINmFWUnR4R20yWHdkaGpGMjIvVlhWN1FGVzl0b3VuenJ0WXQ4NjdXTHBGTVdqOTgzeTQ4OHZvK1BQN3FYL3A2N2M1TGV2dWtoL3FlLy9nays5MTkvaVAvdy9DbiswOWZlcEZDNUMxYjVkNEJxRFlmMVVvMmgvczZkRjZVeWFVYkhobGhhbE9TYU5XeXZJNXU2dzhCUG9zNWYyWEcwM1NBdjZGeGMzK2tHemp4d0NCZ0FaTGxjazJmUFh2K001MGxzMi85UlNndkxVcytlRndLL1pTblB1cmxjaHJuOXMwZ0p5NnNGWENteC9EMVkxVnFEU3JYcG55Nm53RjFLY0QyUDVmVnE4RVlLc0VVdytYaFNCQk96Qm4vaENiQWswcCtWdmVBSHJWQmY3NmJSUU85NUFzdnlkWXNDNVV3bjBNbmpXK01iT2xvVlRhWGVwRkp2c3JoV1ZzQmpXNlJTRmlsZmFtRmJGcTduVWZjUDBmSDhoZ1FURjNyU1U4Q3RRVjQvdDRCOEc0QTNMZS9EY01Pd0tXS0VSeGdmS0hqVnRTZVg3VXBNSHdkbEV3RDhUeFI1TmpQS2RpaStSUjBBK1pUaTRMZEQvMTVxS1BGOFJCenZmMmR6UFJLRUUzdGYzVDZNZ0JiU0ZteGhXU2FaZUJXNUo1SXRBdlR4ZTNPclhBdjRHaGxDWXpjZjdJTXlaRFErS0M5V3J2OHRwQmUyTGR4eXFjNHBDRVR1L2xnTVFOc1lzMGhhMGtncGtTSm1RNkRUQis4Uzl0SGRFRUUzSFkvdnZIR1o3N3grbVYvNzk5L21FNC91NDg5LzdDaVBINXU1Sy92d1J3ZDcrTVcvK0dIKzJwOS9sTi83azNmNDRsZGY1OFpLNmM1WHZBVjEyL2VMYStyWThHNjZiSHh5aEpYbGRhcVpubTdPblAvNy9BQ0F2TmJINjIrd2xST2NyVGg1QVV3RHMzNTZCNURQUFBQVlQ5VnFqVkZsbldvWklLTEF1Ulg0TFE0L2NCZ3JaVk9yTnlpV2FnZ2hxZFFkeXJXbU9vUGFGNnNIazZpVXJLeFhjRDBQNVVYUFAyekdCMEZMQ2dWOC90dGFxTG85SkpaL01JMEZodjVkaFpsQUgreno5amwyYVlXcklGV2pzaFVJZFBZYStQSGQ2WXB3OHZla1M4TnhXL1RHa1FjUkFudkl5VVRCUGNMUkV3WDRjTTk4bk51UGg0V0FIdWZva1lMKzNoejlmWG42Ky9JTTlQY3cyTjlET3AxcUJaVk5uczMzNmdpMFpRaWNBWGpEcG52aTR6U1lWUjdzYnBkY0R3b05hTG9oOTk0UjBPdjNNR2E1ZHBPZCtTNUppZUxNYUNzNGg2RXkvaDJNc01qdUNaMHZ0dkRRb043U1hqMFdnelRSOGlQZlcwS2o2VkNxMVB4RnBTSHVsMTRnRWJKVHR0b3pINHpCc0N3Z0dJczZYdExLOVp0akxYd25md3g3a1RmWWtyWnJNZEJvdWp6L3dsbis2SVd6ekl6MTgrYytlb1JQTHh4aE1yNU43QTVRVHk3TlgvN3hCL25aSDd1ZjUxODR4Nzk5OWpYT1hGcSs0L1Z1RnpXYUx1dWxHc05kdUNLMjB5bkd4b2RZdkxtR2E5bWRjdk1MQ3dzbm5qcDU4dW52M0hKajd4RGRTM0g5eWlabDlhS3M5SE1veGxkam92ZjIyNWQvMW5XOUFGQ2lITHdNcXRiQTM5T2JaLzdBdk9MaVZ3cVVxblVxTmVWSFhsdXhxOGxUellvU3habXVGcXFoNk05ZkNFUjBpeUk2TVdpeHZTZVZxTjN6ZThEeXdMUFZ3c0JEQTMzb2wxbUw2UEZBV3Y1aVFvQ3dKTUpIQU9IUEZncmtwV3F6cVMvdUF1amFjZko2MG00QmV4bmw0aldZaC9wMWdqQVQzQzNMb3I4dlIxOVBDT3A5dlhtMXpURUcyT1lFMzhGcjRIZFhSSzhleE11WTNqMWVjQmV6cmg1Tll6M2I0K0NtNGNKR1BXeFQwc0lpQUhwYXd6SGoyRVF0UWRoUGtlRDRzNzZYOGZzUWxFUGdqWUYrQk1URFV1T2dyY2RhOE00eVhHUUc1Y1NrQVdhK3B1Tnk2Y29pVjY2djREaHVZQWdhMm9NWXg4djZCclltRjI5dW4wT0cxdnI2WlFLT1BjYjFoM0docWtENnY4MysvbDVsdU5zeXVBd3lQazRtazJhZ3Z5ZDR4N1hWQW02WEN3Wk4xNWFML012ZmU1a3YvUDRyZlBqK1dUN3owYU44OUpHOWQzd1B2bTFiL01SVGgvaUpwdzd4d3B0WGVPWXJyL0hkVTFmdWFKMjNRK1p2WTJtMXpGQnZiaXZqbGdpTlRZeXdzclJCTFozclJqZi85NEcvMEZWRDd3SnRKOGozMFoyNGZqMmhEQUZNb0tRQ0FnWHdPbHg4L3ZPL3YxQ3BWQTlxWXp2cGc0a0dlMTJGRnVWN251TGloVzFSS05jNWUzVlY1UkgrdWZENEluZWZSZEpXOW92ckZlVytOdUpySHFRUVBnaHFibENKNWlYYWdsNVpYWHNJTEU4cTBDZDhld3NOOURJNDgwWm9kWUNmVHV2aHRVNWU5NWd3eFBYQ0NJT1ErMnRMSnFnbWdUd2hlS3NGU3h0Z1Q3alhFMjA2bldKeWJJaSszaHg5dlhueTJtZ29BZENKUHllQWtXenp2T1g3RWN1N1NYZ2NaT1BQYVF2R2U5VVd0ZHVsU2hPS2RZTHZGQWYxdUQ0K3dybkgwc2ZmSi82aWlYMlYwSWN5b2QvTmV4bEwxOExwR2gycFJmREU0Mlg0VnZGdkdxUXowL3FKSE5manl2VVZMbDlkcHVrNHhuR3lobVNJK0VJemJLUEp4UWRwTUlCZWd6dlJiWG9ZK1FGUzZSUmpnNzBNRHZReE9OalAwR0FmcVpURitZczMrUDRiWjVONnVvV2FUWWM5ODVOTWpBOGpwV1NqVU9hMTc3OUx0YVlzSm02RjQvZWs1THVucnZEZE42NHcySmZseDU4NnhFOSs3Smp2dS8zTzBvZnZuK1BEOTg5eDV0SUsvL2JaMS9pajc1M0ZkWGVrelJrQURjZGx6VC9BUnRObS9TMEJLNTFpZEd5UXBVV1BmS1BhcWFYOVR5MHNuRGgwOHVUVDc5MW1rN2VWdHRNWnpnTEtPTTZFRzdISjliOFE3V3NibUFFR0NTM3c5WjhIeU4vNGplZitZYlBweklPL012ZkY1T0cwS0NQaDJXeUt4ejcyT0M2Qzg1Y1hxVlFhdm1PYTBJRU5QamN2ZkNXNDQwcXVMUlVBSXcwRStTemRlaTFEOXkrQm94dWhsdzVoUHBQVERzclQ4VHJSSnFNdU1nRkhBRHVjMklLNHBEOHpUZ082NnEyb2VONHpRUnhEL0w0NXdFdmdvZnYyTWoyaHpwRlBhN2R2U2VDekNZREhBVCt4SHd4cXQ2NEpSOFBXSXZsQUZSSjd6cWRncXUvMkRleWtoRUpkT2JneHk0KzN2NXR3M1E5Q2J0SmRVb0lRd2RpSVJzbVdwRUc1c1RKYmdEMW9nd3p5eElGYUdvVkU4a2d6alZHdVVhRXJKVmR2clBEMm1jdXNySlh3QXFtZE1RYUQ3V3pFUUR2NkYzZUNFNEs5R3V0ZTBLWVE5UHY2OGt5TUQ3TnZ6eFQzSGRuRDhhTjdtWjBaWjJTb241NmVuRy9uRTlvQXJLd1cybjJCQ0MwdXJqRTZPdWh2OThzd1BUMUdzVmloV3IzOWMrRnJEWWMzenkzeTVUOStpKys4Y1JrcFlYNXlnTXgydVY5c1E2T0RQZnlaSnc3d21ZOHB2eGFuTHkzZnNvVGlUbE90N2pJeTJOT1ZiajZYemJDOHZJNlFrclM3MlJscUFRa2c4OW5QZnZvcnQ5YktPMFBidVlYdWw0RmpiTDUxVHQ4M2dWOHg4bWFBU2Y4YUltUjRMLzcxdi80dlI1OS8vdVhmTTUzYjJIWjBtNXdPVno3clhRNDllSmlQL01pVE5CMkhVMjlmRE56S0J0dlM5QlkySWJBc0VNTGl4bktSOVZJdGlMUHQ2UFkzVmI3aG5qYkowVTF3enJ6ZS9pWWlkYlZ1bHpNZDhCaFgvTDM1bXJzM0Z5VzZnNEpGdytha0p6dUJNU0hUS3E2WE10d0wzQUxzWGpMZzc1MmI0TUQ4UkNzSHZRbWdKNFhkeW5NaWlCc2RFbi9XSzRBa0lOVmhnemtZeVhjbDNVc2tUOEphRmZ5RDJsb1dFbWJZbHVIeGR3Z29CdGgrc2hZZ2p5UnRZNjBlOUczTTZBd0NKTmJmUFlqVG9CbkVHMENxQWRRb096Q0FJemErUE1uMXhUVXVYVm1pVm0rR1luanBpK0Y5UGJ6ZURtZUs3T05oZ1V0YmM1dWNsTUhaOGxKSzVmekdINzl6MCtOTS92L2t2WG1ZWmNkVkovaUwrOTdMZlY4ckt5c3JhNWRLdGFoS1cxa3B5NUxsWFFiY0xMYkJHTnA4Z2hsbUJrMWpHcy8zdVRFTkEvVFhiQTAwYnFhN0J3UnQyaGd3SUh0c3Q3ZzQ4SFVBQUNBQVNVUkJWQmNNbG1YWjhpSnIzK1VxVlpWcXk4ck15djFsdnUzZW1EOWlPeEUzN252M0xWa1NkTlNYOWU2Tk9IRWlidHk0OFR2blJNU0o4U0gwOTNZaGs4MktlZjRJbXIrWUlvaXM3MGJWKzdHbnZvZno1K2M5YndMNnUxS2hMWmZEaVpzUG9yT3pRd29hRWI1MzZqek9uTDNrRlhDNS9aOWZvRk5DbFYwc090cXllTlBOQW9DUEhkam15OW55Y0hseEhmLzU3eDdCNXg1NlVZOGhzb3BXNWJsNzVmWkRsWnFBVFhGK2ZnWldPUnpZTnRLTFlhbk5tejRmSzlWaWMvNzBSYXdzcm1KZ1kwa2ZMVjRqYkFMWStmRERIMzNOTEZ4b3BTWi9Gd0I2emwrMTN3S0FyOGo3VGdqemZBWUpHandBL2tkLzlPa1BGUXFsZytyRksrM1lhTEhTZE00akxDMnRZWGw1SFcvLzRiZWdvN01kRnk1ZHdjWkdRV3ZZV3B1bjJqWVl5cFVRNStiWGRDVVZxRklhbGRkRkN1WjVTaGQrR1JuQW1UV01FeUR5OUNQZHQ2eEIyS0NkcGMyclAyNytsT25TV2xNQUJkSW1YbWsrc1QzS1NBYjQzdTVPWExkL2gzNjRhZ0FmZTk1YWdPNmhkd01GUmtYQ0FLLzNPM3J2MDk0WkE4YTZnWUg2cHUrOG9Sd0NDeHZDaTUwUHZOTUN1amNONUxuZ1JDYmRjdnZkdUpkMGFETjlpWUE5ZCtudGZxbG9iSHA3T1BldXR1Y2NseGRXOFB4TDV6QjNaUVhsU3VobzN2WmFqNWhXci9wNEJKMUc4OE9ueFd1ZXdpM3VpUnNQYWkyZGZpUHFPU0tyOGV3d05qYUU1ZVYxYkd3VS9BUWtoRkdFK1lWbFRJd1BJNVBKZ0RGZ2FLZ2ZQZDFkdUhKbFJlK0NTUXIxOU1sS0dPRjc1NjdnYzE5L0NWLzYxaWtVU3hWTWp2V2hxMlBybk8zMGRMYmh6aHQzNDY2YjkyRDJ5anBlbVYzWnNySWFDWnZGQ29iNk8rczZBS3l0TFl2Rks2c0llSVJzbE1xcFhRN0F4ajMzM1AxZ28vVnNkV2dseUw4TllwdWJiMXh5Zi9NQUhvU1l4MWUrQjJQQXJ1N3Z2Lytoc1VjZWVmRzNPRWRndksvSlRFU0RLQlNLbUo5ZlFhRlF3dEdiRCtIUWpkZWhVZ2x4K3V4bGpjdEtFMVpnVDY4dlhjbWpVS3dJQUxhMFp1SnozaVJaOFRxWkVRQ25HcmdUTktpYk8zTkpSbTkzWUk0TnVtcXdoQTNzdEFHdHdRMEc5QzFRMS9sdEV5ZTRSNk9YOTR3eEhEdTBXNnlPZCtycUErdTBnRTR6ZU1IZTRVRkJIRWdBY2ZmWDBlWXpESmpvQWJwYjRIOWtvd3dzYnRwMVR3UjZUMTJTNkJPRGJJUVk0RFB4VG5WM2N2dVVJcVh4UFBuOVVHRFhlRTM3am85ZXBTazYyTmVQUFgwS3MzTkxBdHdqRzhDVjYyUzlhTTR4MDZ2NStVaEdtSHltUG5UMVBPMjduSE5FNE5nenZRMGp3LzNtbWJsY1IwTUZpQ3JZeXhqRHRyRWh6QzBzbzFpc2JkS3RsRU1zTHExaFl0dUlQbXVqcDdzVG82TUR1TEs0S282OWJuRll6UmZ4eUhNWDhGZGZmZ2Fuemk5aVlxUVhvNE5idHpKL3FLOFQ3NWpaajV1dW04VHBpMHVZVzBxOWNHMUxROFRGYnF2VWdnNEhzdGtzTnZJYjJLeUlmZk1wdytINzd2dkNmN3JubnJ0ZkU2NXVXd255ZDBPQU5wQTh2cXJyRllqRGFUcVJBT3owL3JkLys2Ly8xODNONG93QzlDamlFbFFGMUlaaGhPWGxQTmJXTnNDNU1LVy84ejF2UTA5Zk55N09MbUo5WGJ3Y2M0aU0wckdOTmwrcGNKeWZXNVYwQ3B4ZDhJNXI3TG9leW9TdVFUNWhoSFlIWTFrdnJ5WElpWXRwOUk3RzRmK1RRQjQ1bW84MU9NZTFITzk4UEd6TjZ0cTlrL0s4ZGovQXd4T1hDT3d1VFpWN043amFmSnBBZ1Q0YkFKTjlRRWVUeTFBNWdOV0NtSU5YaGNRazNpcEFiOTNYU09OQTFUbjVXdDNKQy9xcUQxQTYraDY0L2VzQ1BPZUVoL05MUzZiQWYvTE1ySndLY253d0VHRXpwc25UblIxNmk2Zms3ZEJaV3IzaUI0ajk5bUE0Zm5RZmdpQmorcmV1c3h4cnVHc01qNGNnQ0xCdGZCQVhMeTJpVXFtOTNhcFFMR050UFk5dDQwTlFielhYbHNYRXRoSGtOelpUV1FVYUNSSG5PSDFoQ2YvZmd5L2dzUmN1WXJDdkUxTmovVnUyNzM3N1NDOSs4TTdyc0cvSEVGNDh1NENWOWViWEh6UWJDcVVLaGdlNjZzakJrTTBGV0ZwYVJ5YUswbTZuNndMdy9EMzMzUDEwWTdWc2JXamx2Z3QxU2x5MTN3RENMTjh1Znl2eUx5VFgxdjNDd2dwZlhGeDdiNlVTSWd3amhHRWtEbzJvUktoVVFxeXRiV0p1YmdrYkd3VzlFR3ozL3AwWTNUNkdNSXh3ZVdIWjFuS2hGdWNaYVo0RG1GL0ppM2szMzZDaUJ3cG96Y0kyR3hLUGNIUWVrY1BhYWhhUmdVZm5pZWdXSUJNWE93clQ4NmZtTE1VeG1wNC81OGhNNmtLMjZ0R3ZiaDZudmxIRU1UclVqNGt4c1pJM0NlQVR3Wm1ub0trUzNEeHFCME1qUWtJdUErem9hMzRGZmNTRmVYNnRWTHM5eUk4QlZSZHczVFFDd0JSTUtiR1ZycUl0c09WYW9MUEs0ellkVGJNQjNpeTA1RTY2eXVHTlYvekpuNm1mQTlxY2FOd1J0KzlWWHdUSU53cjdlNkxDQVcwclRnVmREaFl3SExwMkd1MXRPVkpKKzNsNS9BRVRRM3Q3RzA3Y2RGQmJ0V3FGaFlVVlBQZjhHU3N1bTgzZzZKRjlHQnJzOCthcDV4dXBGUjU3OFJJKytQdGZ4UHQrK1cveFA3NytFaXBidURyK3piZnN4ZjIvOWFQNDhBZHV4M0IvWiswTVd4Z3FZWVRsOWZxRXFKN2VIblIwdEtIUVZwZWpqSit1cTVBdERLMmVrKzlIZFhPOUF2a3loTG0rcWdZUElQcjVuLytqTnk4dnIvOGtRTUVWQ0VQaG5sYXRUalVMMWhqdWZ2ZGIwVDh5Z05uTGkxaFp6UU13NThSclE3dFd5eGtRQWEvTXJzaVBTSjc3Ym16NzJ1U3U5WE8xT3A4OHBibFc1bnRueHRRckxiT3F5WFF3ZERVa05YQXBPdmM2aWd5TjBjZ0pqYU8xVURvOVNPcDdlN0J0eStWdzdOQnVaSUtnS2tEVkFuM3VacXBDa3dhd3ZZM0lURDY2SmdJUWU5OG4rNXBmUVY4T2dmbThXR0NYcEluWDB1aGRlamZOdmVld1puVlN4ZnZlRXdWbWt4NEhQS2crSXVtb01HSDFJY1dIYzJQMmh2Mm44M0RnekxsNTJ6eHZMYUp6aEFDZGp3amc0Qlo0dTJET1FUVjU4VHM2UElCYmJyd0d3MFA5MWpkbEt3S2lublFCV2EzUTFwYkQyTWdBOHZsTmJLUllOYisybGdkandPQ0FEZXFibXdVc0wxOGQ3M0pMYTV0NDhMRXorTXhETDRKempuMVR3elhkWkRjU2dvRGgwSjR4L01pYkRpR1h6ZUM1MC9Nb3A3QjZiRVVvbFVNTTlmbUZEZi9iRm91cGwxYzNrUTByeUtUYlRyZnJ2dnUrOElsNzdybTdYdmZ0TFErdDFPUkxpR3Z0OUU4ZEU4c2dGaWRVMWVEVi9ZVUxWOTR2TlBoUWEvRDVmQUdMaStzb2xTclEyb1g4RzVzWXdkUytLYjFhMTN6OERwQkZTbExuV0ZqWlFEa01EVjNFSGUyQmF1VGlMNlI3eVVrYTFaaHAyVkZrRDJUcXo4M2oxYWJKNnVDNEZtK3ZLZzRqdWlxWmF2b2Vua21hTzdGR3hPb2JBWWNPVENHWHpUUVA4TTUxR2lIQURWWWU5OWZsUVhqMXRBR1R2V0l1dnBtd1dRWm04K0tBR2U4ekl5R2VWNmQzcXF2dkxhQlV2dzY5Qm1rQ3NCUnNOUzlDa3hoSEFSQzEvNkJBMHVKcEttZ0pwQ0RBN0FBOEJYTnFtamRyUldTOGRwM3NzN3hSeXhtUWE4dmhodXNQNE9ZYnIwVkhSenRwZjI1ZDAzR2kzdERiMjRVVE4xK0hXMjg1aE9IaC9wcjBwMTYrZ0FzWDU2MjQ3dTZyciszT0wrWHhoMy85TFh6ZkJ6K08vL1EzMzhiODh0Yk1vM2QxNVBDelAzUVRQdmQ3UDQ3M3ZQbHd5MC9XVEJPS3BRclc2L1RIM3pmWWgxdzJpMEpiWGUvbVorb3FaSXRDSzF1NGpOcm1lc2pyTnFRdzFYLzR3Mzh5Vml5VzN4S0d3bFJmTGxld3ZyNkpRa0c4SUhWYUZCMFVUdHg1Q3hoam1KdGZScmxVc2JVUU9RREpHRDBnekMydWErM1hNc0U3QXdkMUVrTUZBQmZvVmQ3UUI1NHhBRTRBV1FYY29kajJFNFp4OEs0SjJoVHdYYUdnbXJtZSs4MzhuSE5NVFk1Z2NLQW5HVGhJUEVpOEd3Y25ydHB3V2xVSXFKWE9wVG1mM0E5MEFOdDcwZlJjNUhJQm1OdHdRTFllb0NmeHZqWjAwMmlnZ0V6NUpZSTB6ZXZ3OXZGeGhRUk84NUZDcUJBZ3NuRVNKd2lNa0tBaDFWdzcvY3NGZUZXVWRUNkNuaHFEOWIwQmNjYzJrYXpMemgyanVQTzI2ekV4UHFSWDBzWDZzUFdPYXMvRlZ3dURnNzA0Y2ROQkFmWkQxY0grbGZQMmlkczlQZlhNR2JjMnJHK1c4TEgvOFFUZTlZdWZ3Sy9mOXlCT1gweDd4RWg5WWFpdkUvL21BMi9BcDM3N3gvQ1dFM3UzcEl4cVlXRWw5WG54QU1SMjYrSFJmcFF6T1lSQmFrdkh2NXladWZmcW5SMmNFRnJwOGE2STJyN3JtZnh0ZytQTnpybG1BUERvb3krOUx3ekRER01NWVJqR1ZwNmF3VWtNRHAyZDdkaC9aQjg0Z0l1elY4aEFJcFplY3dDTUs1ZXlvc2lsOVFJS3BZcDJOUnRGNHBqWGlFT2UveTVPaXhPVlk0Z2ljV0I4QUk1SStxTFhwOGVwZVdGNU5yeG9CQ2JkNG9vQlNFOGJCQUFqOTlRREh2VmtSejNkUWQzTGxySTg0Z0dJMlhlNTU1SU14cm9OdFNaRHpaeHFBQlcvZy8wOW1OdzJoUEhSQWNMRHo3OFd3S2NHZmM5OUxEalA2TnMzVDl0bHRGdnNnVzhtY0E3TWJ3Z3RIb0RYTGEzdkxIaDQ0cUhxNk9IanBsa1ZFS21HMW0wSEdzVnRHaW9BeEZpU2F3dTgzWDVEL2tCb09DbkxCVXo5dlpMK3BmYXgyNkR1dTZaejlxcVBPb0oxcEFRUGs5YlQzWW5EMTAxam9ML1h6T0ZUUVVUM2Zkci9xNitvVHhWay9zR0JYdHh5MDBFc0xxM2k1S256dUhJbDdqeG4rOFNJZGQvVjJRNFdzTHA4NWJlM3QyRmlZaFNaVElDVEo4ODFWWFZBSEpEem1ZZGV3R2NmZWdHdlB6YU5uM2pIOVRoK3pVVFRmTjB3TmQ2UDMvay8zNFpuVHMzaFAvekZOL0RZaTVkYXdyZFd5K1UzU3lnVUsraW9ZekhPd0ZBL0xzOHVvcGpyUUZjNlY3ZGpBTjRGNEc5VEY3SUZvWlVnWDBaNjMvV0FNTm5UaVNzTDZCOTQ0SWxNb1ZENkFDQ2wrTWcvRHlLMGVYRVl6ZEZianFDdG94M0x5M2tVaWlYcHVwYkk1QTdBQXh5elY5YUZvdzF3SUpBSHk2Z1BYZTVCQ3ZTeHNGd2VSc05GR3JoMlJhdUJuY3M1UVFMYVppVytjSjNMWkVzd0FDd2drcEVDY2JNY1FBSTg4V05QQUIvZ3NlMTUxSCtBTzRkcjJzd2VmczFBcmdZLzhadk5aREF4UG9nZDI0YlJwWTY2VEFMNEt2SDF4aVVLQVVpbThkN1R1akZnb2xjY05OTk1xRVRBNWJ5WWh3ZVN3ZHNIOUNEeE9xK3BudWJqcHFsOE5FSGtJZThPSFBKSUkzRlAzd2RYRklhcDNSOXNXc1BEQUxxaW96U2MwbmplS1JVUWpBQmcxZ0J3SUxadHJockF4eGJnYVJwWTlNb1JEbU1NdDk1OEVObGN4Z2pncnBrREpGNC9hd0pFMUFuOGxIeHdvQmVIRHU3RzE3N3hwSlVRQkFFbXRnMWIrUmhqNk83cXhOcDZEVzJUQ3c5OWs1TmpHQjRaZ0hMTVhTaVVjTjZ4RGpRYU9BZSs5dmhaZk8zeHN6aXlkeHcvK2M3cmNjY051L1RZMnFwd2VPOFkvdlNYZnhCLzk1Vm44WHQvK1Uza043ZitlTnVGbFEzc0dPMzFKM3JlZFNhWFJWOS9OMWFYSW5RV044alhWalg4REY1bGtHK2x1WDRENlZiWHF6L1hEWlA2N2lNQTRTLzkwbjEzaG1FMFhhbUVpUUFQbUk4YjRMait4R0VBSUhQeGdxMFpZSXpYS2c2TzljMFMxalpLc1VIRk1oOXFFNkV6aURnRGo3VktQckpYMXR2ejNOUXNiaCsyNFpzRGQ4M3BZUlNaT1hZUGJiVTUrVENTSys2NW43ZjY3ZXZwd25VSHBuRDdpWU00c0dlN0FIajVkdFJMb2k5c0t3RGU3UmlKQU83cFJKcFcvZ1lNbU9wckh1QUxGZURDbWpob0psYUhLcy9saTNmcmI3VmxRajdUZDJXY3cwZG9wVlJMOVFDMVEyL1JTUTNZQzlBZUhoYkF5NytJWE9zMDJIWFczNnpPRXdkNGQyMUxmQXJOWGwxUDR3RlJqKzNiaHBETlphekMzWGEwMjBwYzFGS2dlWTMwcEhEcTlNVllweDBiSGJSWDVNdjBucDUwNXFhalIvZGpkSFRRRXZhbnB5Y3dOT1Jmb2Q5TWVQclVaWHpvRC84ZTcvbndYK09CUjArM25EOWp3SSs4NlJBKzlkcy9pamNjMytXbGFiRHB2V0UxWDZoNzhkL2dVQjg0WXlobFV6dlVlTXZNekwyNzZxMWJLME1yUVg0VzZiYlJxZC90TmZqOUwya1h2bkRPTVRFMWp2RWQyMUFxVmJDMHZLWk5kdVlqcHFab0VUbTdzTzdzcFlXbEtkQ0ZPekhncDJEdTBUWVVtS3B0UU5xOUpyMTNoQU42bXBhNzBDNCtseDlwMEsrMmNDOTBRSjI2K2FScFFjQXd1VzBZcjd2aEFHNitmaDhteGdhRm4rNHFvS011a29DL0lZQjNybjM1WEdJdkgzbWZEWURwZ2VhZDNLeVhnRXZyNHFoWXJ4RGlxV2MxUUs4RjVyWGFQUkU4S1IvNS9haHRvb2FHZkJ1a2ZoVG9PT3k2dUtBTjkxNkxCL2IzQnBLZmZzNktkNWdBOEdaK25sc0FiL3pXYzQ4VndONzZ1blBIR0hrVzd2UVRlKzJBOW1YZlVoZ3hZWE96aUl1WDRwNU9KeWRIWTNFY1FIZFg3ZTFhMlZ3V21ZemYzSHhnL3pTNlV2Qm9KSnk1dEl3UC9jY3Y0YWQrN1ZONDRxWFpsdk1mSCtyQlIzL3hidnptLy9FV0RQUnV6VE1Bb3I5Y1dkbXNLMDkzYnpmYWNqa1VjNm5yeGZBcWI2ZHJKY2lmaDlIU2sxYllVNkJQQlBtWm1YdkhBUHhBMm9JNUIyNTV3ODBBWTdnOHR5UUdCeGlOUVp1aGlRWmVLRmV3dExZUlcxd1hjVExuUi94WDAxWDJWQ2pRUUV3R0p0OENPYjA0TDhYQ3Q5aStlYzcxNHJzbzRvaENtNGZ3SGVDVVNRUUJEZlp1M3BDanE2TWRCL2Z0d08wbnJzTTFleWZSM2QxUk53alJOSFhSQ09qNzhucVNFd0hkcWlNWGU5OTNEVFR2NUdhNUlFejBGQkRUUER1bDlkYVJaSFNmdFJyWUo5WERiUk4vK1R3TzJpNS9HazlCa3BQdml0QW82NEVCY3g2bm9YeEJhTjArSDlIRnRMYW1icmxXMXQrYys1Mkx0SjZlTGd3TTlJTEQ4WFFuSDVxK0wvcmc2WFpIeGQ5VnJYRHE5TVhZSEh0WFowZmludmcwbW54bmh5dTVHdjZaVElCcnI5Mk43QlpzaDFQaHFaT1hjYzl2ZkJxLzhBZGZ4TXNYV3I5QTcrN2JEdUF6di92amVNZk0vcGJ6Vm1GNXJhQVhiVlo3anpxTk1Rd085NkdTeWRhekFPK25abWJ1M2RyVGdxcUVWb0w4QmNUQnZacTVmcklLcjUrQW1MTlBGZHJiYzdqbSttdkFPYmRNOVhTeGpwYmNPY0I1aExuRlBNTEkwQ2dObXE2aTF3NXRYS0FQUFlOUXBBN0tVUGNtbmdvQ2xqYnRBM29IOUVQS3c4bEh0Zmd3aWhDRlJQTVBIU3VBYXcyUTEwY083c0wyYlVPVzFwNFczTDJnN1FQcEZBQ2ZHdlJUQ2dHZE9XRDNRUE5PYmhZMnhGL3FaMGlJcC9UVmhJQ2FZTzhCWkt0TktJM0xsNzRmQjN5OXZGVzZDOXF3LzJ6bkZ1UUpPRFgvVXlIQm5pWndoV3pYc2libTJNVjE2QUk4RWFETkxoZGdlbXJNRW1STSszRnorcHlzcjNrdXUvWHIwdXFya0JZS0pWeDB0c2tCd09UMnVCYXZRazkzN1JQVE9qbzk4MCtrSGgwZGJUaHdZTmVXZWJSVDRjSEh6dUM5di9SSi9OcDlYMjI1Qzl1QjNnNzgxcys5RlIvOTBEc3hOdFI2Vjd4aEZHRTFYNThudnY3QlhqQ0dlclQ1N1FEZVVXL2RXaFZhYmE2dklMMjV2aHJJLzJnOUJSODdjUlFkWFoxWVhGNUhvVmd5Z3diVWxocXVQMklPQWNEelMzbWl1YXNCZzVqN0lqdE5tYzlqMitZU3dOTnJJaWZhaW0zMjkxeUhOWGk3K2FWQW9PYnNRMVV1VC9Db3g4V0srZTdPK0h4N3ZlQmVMK0ExQS9wcGhJRGVkcUhCTjdNRmwzTmdkbDFvOFhYWG04UjdBZDBUbnhyc0NRTUx6RUVBbk5CYjRBL1BIemVncTBBUUZKQmp0RERwcERCTy92UmhNUTcvR0toV0FYZ2pMRWVlNzlJMjhkc0N0M0M4c21OaUdNcjY0TGFIcVd2a1dDcmdENTUrV0U5NCtmUkZyUzJxd0JqRDl1MGpDVG1FNHJKLy8xUlZ2aDBkeVl0TVZHbjkvVDNZdGF2YVVOdEE4TFJIRkhGOCtzRVg4SzRQL1NYKzhLKy9oYldOMXJxd3ZlUDRMbno2ZDk2SGQ3L3BVTXVGbHFYVitrejJ1ZlljZW5xNlVjcld0Y2pudlhVVjBzTFFTcERuQUM0aC9iejhObmhXOTgvTTNMc0h3RTMxRkh6OHRtTUFnTm5MaTlCejhZZ1BOR29RV0piYjVxaUozUXdpem9CQ0JoVjdnUnhkREFUdjNMNEJZSHV1TU1sTWIybnVaQUFMQ2VEci9mTFV6T2tCL0tvQ2lJd1hBMkVOVUNHSmllQ2VBSDZ0QkhnS2tFazBBRERZQ1V6MWk4VjJqWWFRaXdWMmxvdGFVbkJTWFYyQVRXcTNKREJQQW51ckR0eW1veUN1czlMODVQMzQzcGNGZk80MU4zeE5XZWFiQXZ5ODRQQXhkSndJQkZJSUovMDR0dkF1aXMvUnh4ZnAyUUlDNXh6YnR3MGprODFxVjhlY2xPazJ1RzZyMUNoZUg5d1hpbVdjdXpCbnhXVXpBYVozamhPWHV2N3lkMHlPWWVmTzVHTmk0K1o2WCtBWTN6YU00ZUdCVlBWdFJwZ0JoS09aLy9hNXgvSDl2L0FYK1BQUFA0RlN1WFZlN1hvNjIvQnY3N2tUOS8zU3Y4RE9iYlVkRGFVTkc0VXlpblI3dHUramQ2NkhSdm9RMWJjQTcxMHpNL2R1M1FLREtxSFY3b2Jvdkh6U2ZMejZ5eUcrd2g0QTNsTlBnZHVueGpFeHZSM0ZVaG1MUyt0RW00ak10VE13WEY1Y2R3WU5aNEdQRDVUcElydEk4S2NBYTJ2cnlqeFBWZ2x6Ym9PeXh3UWZjbHVEcHl2bFhUQzNnTjZuOVh2b2FEblpiQlpqSXdOZWtLa0ZOSnhjSkFJL29mT0JFcHFJY3dGZjNZNTFTU2MzaWIybGRxaEV3UGtWY1pLY0M5TFZuanNOb05QNHBEeXhkRzdIeGRxWHkrMmZjTURkNWUrQ3V3WmFFeGtUQ0ZTWkRqQWJJY0JZeVNLWUJEdVBMUkJFM09WTGdKMThQMTdIVHg2QXR6eFB5dm9KVTcwampNQ3BHN2gxYmRvK0hjengySVUvdkh6bUlxSW9RbTl2RjNidjJvNmJiN29XZDkxNUl3N3MzNW1xbkwxN0pqRStQdXhONitob1QxM2YzWHNtMGQ3V2dpTVdVNGJWZkJGLzhKZmZ4THMrOUFsODVtc3ZvQkpHWkV4dGp2Zk4xMDNpL3QvNlVYemcrNDdyay93YUNxUWVTNnYxK3JQdlJpNmJyY2RrM3d2ZzdYVVYwcUt3RlNCZmEvc2NqZmZaa2VveWE5ejQraHZBNUlJNzFlRTVHUXpzYStHM2VIRmxrMGorMFBOOFhBS2d0ZWlPYUFwMERsd1BOcEVwd3hZS0hNMDVKSnArTmJEbkN0d2pPei8zeDVrNWVja3pKSC9PRkFFRi9hbnR3OXBqU2d4VW5JRmVCUXRra29ET0Y0K0UrRVlCM3JubUFNYTdoYU9iWmtLcEFyeXlEQlJEdTJ5M0xIV1JHdWdKZlF6c1U3WTNiWE02U0twTDk5QUhjRFZkWmZNeVFNNWpaVk1CQUVUNGRkTW9md3Z3TFJCVjVYbzBmOEl3dnJyZTFzb2o2N3VNMHhtQUYwSjRUMDhYQnZvZGo0emtHZFN6cTMzenJUSFRKMFB0NEVBUDduckREYmp0ZFVkd1lQOFVCZ2Y3VXAxblR2a2R2SFlhZzU0RmVwMTBUcjVHWFRPWkRQYnRtMnJleldPdDREVG03SlYxL01vZlA0QWYrOGpmNEtISHorcTFSTzVpNFhxQnY3MHRpMy85NHpQNHhLLy9DUFpQK1lXZ2VzTHllZ0U4YlNVNEFNWXdNTlNMY2lhSGlLV0cwVmZGWk45cWtEK0grcmJSN2FDWloyYnVQUURnV05yQ2dpREEva043d1RuSDdMeTl1cE5LOW1heERjZmxLM21QbVIwRTNNMWN0dERZZVl4ZWErNEVZRzFnQjh4SmNEYTQwM3ZmS3ZyNEFyc281dnJXM25LWHZNM09hRUUyRFFmSGxKd1AxSnFjWjdBSG5MZ0VjSzhLY0E3d1c3dzh0TFhpNE1SeEFOdTZnWkVtUFlGdWxJR3pLOElIZlMzd3J2VU12dmlrTkYrK1JMQ0hDMWJRNzBUWFVWN1RuWDVhWTZlQVM5KzM0Z0VDMUU2YUVRNUlYbElCRGlwb2NNTlRBekVCZXNLYkNyMnUyMmpiemJRSDRGMFRmOFN4U3kyNDQ5TENRWVVSYnZwN1VuLzJCMDcrcngwbzNiYnhZYlMzKzlZUWM2dHZWUThNaHcvdHNWYmNCd0ZEVzF2UzJtUS8wOTdlYmt4dUgwdFRZTXZEeVhPTCtQbmYrd0orOXQ5L0ZzK2Nta01sNHFpRWtiWkNOZ3I4aC9hTTRXLysvWHZ4Yys4K2tlQUhQOTFiQzhNSWF3a0w4UHdjT1BvR3hESGJkV2p6M3o4emMrOVZQNWlnMVNEL0NtcWI2K252RGlkL1hhYjZuYnUzbzM5a0NFdkxheWdXeTdGMEFkcktBWTRZR0dZWDEvVjhPMTJ0eTduUkNxeXpyUW5RUjVRK05pQjV0R3lQbWR3Q1cyZVFzOHpyVWp1Sjg3S1BrRTMwWisrVXF4YmxSWnhqYktnZjdlMDVlOEIyMnc1bUlLd0o3ZzRQSzgySlZ4ZTF3RHh0M0VRUE1Od2t3SytXZ0hPcllpNitLbmdqdVQ1Snp4aWpyNUxtYTArclRaMElTMk4yUU5UaVE5NGhISDRXOFBKNFBLMjNqNGFDdWRIK0NkanJ2RlJBNFJwd3I5MDNoWU1IZHVEZy9pbGNzMzhLMSs3ZmdZNzJ0am9CWHZUejhkRkJURzRmdGEwTHRNNHhnRThMMjU1UU0yOHE2Y0hKa1p3aGs4bmc2T0Y5NkdnWEp2ZU85dHFMdm56Y0puZU1vZHZyRzcrSnRxaWpJbysrY0JFLzlldWZ3bS8vK2RleHRsSFU0QjVHdkRyd2sra2FOMlF6QVg3MmgyN0dmL3VWSDhUWW9OK2NsK2JwbHRicU05bDNkTGFqdlQySFlpNzFBcnh1QU8rc3E1QVdoSzB3MXl1KzFiYlBxVDhYNU9zeVp4eTk1UWdBWUhiT3YwZlRERUtpY3l5dEZsQW9WaHh3ZDhBeEJ2VEdlNTBDZEFyV29aUFBQaEFHY2ZEVitUMGF1QVBvWWNodElZQlRZWUFBdmJ0ZFRna2t5anVlVThiMDFKZ2U2TlIySW5sYkZieVJNbDFkeE1DUDVJRVQzMGpjdHA3bS9kQXZiZ0lYVm13dlo0MEFQWTNuTmVqVHRLOEJUb2RYckYzalFBcUxCN2ZLNU56Ujh1R1k1U1doL2UxdzRWQ0hBcnprRVpzbWdDbUlBNVp2Q2xPTy9NZUJYVk5qbU40eGpsMDd4N0I3NXpoMjc5eUdXMjQ0Z0d3MnNMOEY1NWNDL1Bqb0lPNjg3U2hPM0hRdE1sS2Jjd0hlYVBSR3dFZ2ErTk5pZjFwWTVKNnJSa0piV3c1SGp1eEROcHRGUjJkYmVwYnFuVUtzNnQrM2R3ckJxM0Q2bTY0T0IvN3VnZWZ3dmwvK1czemp5VmRRMFdOWVpIWUhoZUpQQTc4V0JwS0IvOWlCQ2Z6TmI3NFhOMTVieTgrYVArUTNTL1pDd1ZqYnhodTd2NzhIRVF0UXlhVGU4WDNWVGZhdGZ0TmxpSzEwOVpqck13QXdNM1B2UVFDSDB4YVV5UVRZZjNnZkttR0lwZVU4MU1Ea0JncllzNHZyc25Nb3pRRFdzYkxhUEs2MWVBWFVIbmV6N2gvVktoelFwY0JQVit4Yksra0pvTHUvM3FOaW5ULzFjVlRJQitLcloxZG5PMGFHK2h3dHpzelBLaUJvQk54OVFGNEw4Qm9GK0luZTVnSCtjbDVzazFPRnBLMEgrYkhqaytnYmFFK1h4Z0p3UXEvQldGOXpyYUh5aEQrVndRSnMxUjhJdjRpVW9lT3B0bTdGUXdyRDlyMHBsd2dKNUhoWTY1bTRLTE9ycXdPM0hMOEdqREZ0N2ZKcDlSVGMrL3U3emJ0UmZMa1UzaWpnYzFNWDA5RFZkR2o2TW11UVVHbTVDaDllaThaVUswYlkxZFdCdzRmMm9MdkxkUDRVckt6UTN0R0dYZE1wZ0pDbjUxMC9uVmdBL2EvLzR4ZnhhMy84QUpiV05vMEdMOEU5akRnQmRqc3RDZmdIZXp2eEp4OTVGMzdpSGRjM1ZPdmxPclg1WG1teXIyT1YvVHRuWnU1dC9ZYi9LcUdWQjlTb2NCNWlRUjBkNXdIL3FYVHRBSzREOERUcWxIQ205KzVBNy9BQTV1YVh3YW1iS283WThtck9PYUlLeDVYbERYSGlHd2VpaUFHQnFFb1FjVVR5b0ppSWkraFFpajlCSkUrWkM3ZytzbFEvQkljK3FJWkZJSWZTaUVOc0FwZ0RiOERFWVRTcWp1SWdHcTRYdnpFR01IVm9qVHFraHB0MU12cVhYQVB4QTJwZ3BkTkdFRDg3ZDR5S0pwSjE0cktNcEkrVU94Yyt1cXJnSnk5U3g5ZUlZeEFBUDlERVpoVE94UmE1MWFJcEkzWllqTHJtOEI0K0EzamlWVjNKdTlMMVZ1ME51M3RhNlVEc2dCcEFIdDlJK01iYWlMd0E3N3ZnOFdzS2NxNGx4NHJUYVhSNHRqOXVKVGpFNGgwQndnWjl3OS9DUm5rLzBOK05HNi9maTI4OStsSU00TGVORCtMQTNoM283KzBpaSs5VVdUNE5Ya3k3Y1VCYkpMd2hOZkNtb0V0SGhoVGloYzJQQTMxOVBZa2U4ZElLRU1Namc4aTE1VkFxbFZHcGlCTSt6YSs0cnBRcnFJUWhvaWp0MHpRUU9QQ2xiNTNFdDU4OWo1Ly9zVnZ4eGh2M3lQR0x5eE0zMVFjaFQreUVuYVpvb1E3L2t1Uy8rUDdiY0dqdkdQN3ZQMzRBbTU2cDNLU3d1bDVJTlBuN1FudEhHOXJiY3lqeEtPM0pkSjBBdmgvQVg2VXVwTW13RlNCL0ZzQ3RpSU02NEFmK205RUF5Qis1V1pqcUZ6eEhOL3JDd25JZVlSUUpVR1N5MXNOR3hRQUFJQUJKUkVGVVlnVG9CYnFyd1pacDRBZGtuRHh0ampQb0UrSUFDZFFCaTRGNUVBRVI0d0lJRkcwSThBRGtkTGtJWEhaY2V2cGNRTUdkMUVHQk1hUGZIUE9jUk9kOGt3cFlNcGtNcGlkSHpVQXY0OVhBcFUrd2N6TzdjWERpSEpwcWdrRlZnU0FGd0cvdkJmcWJBUGlJaXdWMkd5WEJNQWJlRGhBbkFyMnFteE9QR253QVA1QW5nYjFLMUVCdlJkdkFDMUp1SE9oNTdQM1ljOVMyV1Y5R1dlL0FFZ1k4MWdBRjBDYVBzUkRGZ0ozKzZyekVsTTdGNFMySEQrN0NFMCtkQWhnd01UNkVhL1pOb3JlblN3QjI1TXk1eTJlSXVGMFhDL0JKNXpTQ0RNZkdaZ2tiR3dYa053dlkyQ2hpUS81bXNobU1EdmRqZEhnQVhkM3hqcGNXVkZNSkI2U2V0UWhabWhYZHZIclYrdnE2cmJaVFJldCtvZG96akZDdVZGQXFsVEY3YVI3cnE2MzFhZ2VJK2ZCZitYOGZ3SmV2UDRVUHZtOEdJLzF5M1FEajVuaFNlU3kzQmZ3RTZDbndjM0M4OWNRKzdKMGN3aS84L2hmd3l1V1ZGTFhnS0ZWQ2JCYkw2SlNMSmYxQ21EVUFvMytnQjNPWHk2aGtjc2lHcVFTSzkrSXFnanhyYXZHSlA3d1J3SzhBVW5DdS9UczdNM1B2SHdKNEptMEJtVXlBZi9YclA0ZXUzaDU4NS9FWHlVZkJ6TUJKQmtrRzRMblQ4MWhhTFNBSW1QbGpESXd4QkFFUXNBQUJBNElNQTVQWEdjYkFGRjNBdEphdWFGa2dPcFRtb3pvaFkvSUlXU1k3SnFVam5aVXgzU2taQkQ4QStoaEhJMGd3RGVTbXc1UG5xNkhOY3k3eTdab2F3MDFIOTBLaEcyMHJCbWlCZy9aaHQzZlVFZ0Fvd0h2ek5nSHdrMzFBWHhNbnlWVWk0TXl5T0UxTzhiVGFnY1NSbitxMDFlZ2JTSXZSZ0F3MDlJZGJLUmFJeTF0UUlOTzBGb0J6aXpZT3hpYVBiVnJuTm5CcUhvYk9Nb3RINWpxU2hVU0E5dVd1ZlZYSU9KMmZpK215MCtjdVk2Q3ZHNzA5WFFERWRGdEVhT05iN3lBUG5CRzB4WElGRy9rQzFqWTJzWjRYNEozZktHQmpvNENOelNJMk40dHlUVVo4TEtURFkyZG5HMGFHQnpBNjBvK1JvWDYwdGVla0VHUG0rNjIycGNJSGVSOTJ1NUU4dXIwOTZ5TlVQRzFYSk9SeDNrRmM0SXJYeDlURHg5dms0ZUJZWGx6RmhmT1hVYWtZQnpLMEgxcnQ1elFyZDY4ODQwRlBaeHQrOW9kdnh0M1NaNzNSNENFMGRrYkhRUmY0bGJYVGpLSDV6VEkrOGwvK0VWOTcvSXhWdDdnd0plNkgrN3N3UHRTam56dFdlNUtQYzZCVUtPTGtTK2ZRWGk2Z081MDJYd1F3OHZEREgxMnZTZG1Dc0JXYS9IY2hXc1BWM24zbStnREF0a09IZHIzdjJXZlBwQzVnMS82ZDZCdnN4K3pjb3VkRmtWTGxlNjlFRVpiV0NuSkFBQmdYSHo4Q1Y2Tm5RQVJwbXBmbUh4a3RRRkI2VW1OY2EvMU0ycnlaakdjQkUvR3lCWmg4U0tybEs2MWMvNm43VUJCekxyVnpyam9zU09jVnp4VFQ1aDJvVU5NU05PemVPYTZHZFZCVlU1dUNQY0JNbTlPK1NBYjNhbW1wNDBrY1k4QmtiM01BWHdxQjA4dm1ISGhhbU5jY24xS2pSelY2Y3VHbTZYeEFWYzFlNStmbW5oTkp6SjIzNWQ3Mk40M0pZZk9peGVob1RubkRnQXhKVXdrVVRLaldiZ0RKREpTR2hwdDRGMndrdjRqVWQzckhtQWFmaVBMWFBDakFBY3NyNjdoMGVRbVg1aFl4djdDS1lxbWtCUUJ2SDY4eWhOQ3d1Vm5FSytjdjQ1WHpsd0VPOVBaMFlVUUMvdEJRbjE3MForVlBvVVNsMC9MVHJ4dEl3NjQrT3B0eVlMQVBQYjNkdUhSeERvdFhsbE55U1IvV04wdjRuZi8rZGZ6akl5L2pGOTQzZzRuaEhnSHVzalpHUVJMM3JxbWV5WHNWMGRHZXhlLytxN2Zoeno3N0dQN3IvZDlGVktQQlYvTkZBZkpXU003VDF0R0dqbzQybERnSDBvRjhPNEM3QUh3bURYR3pZU3RBZmcxQ0s3OGU2Y3oxd1o0OTIzK2dIcEEvY3ZOaGNBQUxpNnYyNkprUUZsYzI1ZURFcE1UUEVDQU85Q3dRMmdDaUNJd0ZRbnNIMS9QdkFKUGV4U0x3aUFtenVqUy82NEU3Z3Vod2dRUnBWVDhtQnBsQWFlNFNOUUlXMkVDdTV1VlY1Mlh5bWdQQ051Qm84Zm8vdXlHb1Jnb0FRd005R0ZST1FvQ1k2VmNOdHRRcUVFK1B4MWNEZDhLMmFyNWFBTCtqRCtodHdsbFhNUVJPTHdsTjNxMmJhcnJVOCs0YVpOUFJ3MGx6OC9uU2JSb2ViNytFTnJOTjlUeE9UOEZhQXk4TWdKQ1g1WnJkVlY0WCtLa0dHdE04WWJRL2ljVUE1OW83SGhVS0tNQmJaU2d0bjd0MU1rTER4a1lKbCtZRXFNL09MV0Z6czJRdlhpVUEzOHF3dHI2QnRmVU52SHptRWdMR2NQMlJ2WmlZU1BaSHp6MVgxZW1xaDlxd1Q5NXhHbjZwaEEzQkw1UEpZSEpxRy9vSCszRHgzQ3dLeFZKQzZhbFllc05qTDF6RVQvL0dwL0ZUMzM4RC9zVWQxeUlJbUcycVR3QitEcTZCbmdML0I5NTVITmRPaitLWC8rcy9WajJVcHF4TTlvbCtDR1M5ZGNVWmV2dTdNVjhvb1p6SklaZk9aUDhPL0JNR2VRRDRCb0RqU05iZU5mQlhLbUV3UFQxMk1DM2piRGFEdmRmdFJibFV3Y3JxaG9QdkhKWk9Ld2UraGVVTm15cmlpQUliNkJrQUZzbTRBQWpBeGRuaHpJQjRvRFIxeVNmaUJrd0RPYTJ2TzVzMEpRYUFtSWRYZ21VRXVlQ09hYUFIazBJRTFlNWwvZlcxc2hUQTFlS1RaUnhGMTkvWGhkZmRjRUFQa0ZKcE4xcThvbGNhbzR0Q2lIK0lxY0JkWGlRQmZ5M1FEeVRBOXpRRDhCV2h3YnNBVDh0TkJQcWtlQUtvU2ZSQXZCblRncjBHYTVYdXZvY2swRmNhZUZJK2VXVnI1ZzVQQzhRZHdJY0JZOHJIelUrQm5jYlIrcXQ3OVZwaVpjanpJV2lhK2kyV0s1aWZYOEtsdVNYTXppMWpaUzB2dEh6ZmRsUUY4SzBNSG5ZUjUzamlxWlBnQUxadkcwNzhMaXdXS2FwVkQvRFdvaEUvNmRxaU5wV2c2Tzd1d3I1cmRtSCs4aUxtNXE2MHZLMExwUXIrODk5OUJ3ODhlaG9mL0xGYk1UMHhVTVZVVHhmckdlQlg5V1ZNdU1UOXMzLzdnL2p3SDMwWkw1MWRTQ3gzTlYrc0NmSTA5QS8wWVA3eUVrclo5bnBBL3FxRXpLLys2cTl1QmQ4VkdNYzJGSU9ZKzd1d3NEb1Nobnp5NFllZlFaa2VFcEFRcHZkTzRlWTMzb0s1K1dVc0w2L0hORmJ5eWdFSVUvMnA4MHM2elFvS2VHR0EzTmFGdWIvV3REUXJIeUd3VUpERnZobzZvTVVIU1BKeHF3RlJBVEIzdGtqSlVWWmNFNDFINXQ4Mk5vZzdYbmNJSGZvd0M0TllqRlNldGlNeGhNVkNQZUR1cGljQnZ5K2VNV0NxU1lBdlZNUWNmQkxBMDhESWhhL0Qrb1FwVmkyZVhEU2FIbHRZNThaVElDWkU5alczcmltSXU0dzU2QXA1T2gvdkNBVkVNS0I5MVhJZjY5YkRBZXdJaHNqd0psbzd6UU5nYm1FRkw1KzloS2VmUFkzSG4za1paOC9OWVdGeEhZVmlXYy9KaHhMUXpUNTZJU3hVRFdrQU10NVVpZUh5NVVYMGRIZWlKK1p3aGxjdHE5WGcyOHBucWhVWUExZ1FZS2xWcG50UHBSYVdOL0NGYjM0UFBaMXQyTDl6V1BaTHVlc0NidDhoVXp0MHZKUnBQWjN0ZVB2TWZzd3Q1WEh5M0tLM0NwVXd3bENmWndkRGdoQVRaRE5ZVzE1SEtRSTZ5NmxPdFJ1NDc3NHZmUEtlZSs1T2xqUmFGTFpLa3o4SDRmMXVKMnFZNjFkVzhtTkJ3SER3NEU1ODk3c3YxV1I4NE9nQmdFdFRQVnhnam9jcnk1dUlPQ2V3Wlp1am80aUxGZXlSMU1iQkVIQ3hhQ2NBQTRmUTlvV21MalQ5VUFGakFEMVFXWFBzNms5YkFyZzIwWE9wOWVzODRBQUw5RHlyc0FMQU1zc3JDd0FnVjVPU05CVjgyK2F1M1R1SjQwZDJnekZqZGJDMGRSWEpWWUtNZHZoWjNib0JjTmYzU2NEdnhETUc3T3dIdXRNTDByRlFrQnA4bUFMZ1ZkbHBOSHJBU1V1S0p4ZHVIN1hTNGMvUHlhc1JrY0pLQlRqdFJ4cmUyOFl4SUxicm9mTDVRSjhLRVc1ZVN1cmpyN2FzMlh2MnlXQ3JBWjdyTFZxeDdXOFFHdkxUejUvQnN5KzhZdElqWVdVelB1dU54bTREZkpNUTFrQjJ6b0hIbnpxSlkwZUFiZHNTZktycmQ1UmNnSnI2cUZXL21sWGt0VXBDL01YV1NSSkZFYzYvY3FuMUZoTW5WTUlJLzgvZmZRZlBuNTdIdmU4OWdmYWNnQy9tbU80aE5YaEw0MWVEbTd6UEJnSCt6UWZ1d1BhUlh2enBaeDZMbFZXdWhOZ3NWTkRaa1I0aWUzcTdjS1ZZUmpuVGhsd1luNzd3aEhjQWVENTFBUTJHclhSNzlBMklacTNtRENmSTV6ZEhnb0RoMEtIZHFaanVQckFMeFZJRmEydkdCRit0YXkwc1YxOElvWUErMGJzV2R6eldFVzlieWl1ZDlvTG5jWnJqODRBWHhoemZPUDdwSTg4WjlDR2g1OHI1RGZmOFJlRGd1T1g0UGh3N0xOcVVha1I2bjdBYS9GVTdjTFg2V1ZDcU5EM1dlUExBUTFNdDNTb3ZJWjR4WVBvcUEzdzlkU1UvNWpvaFBrMjcrR2dVTENwdmhFYkQ1bWJ4R0FGZ0MyVEp2YTFabTRIZWFEMDJ3QnNOV29Fa2lFWUUzZTh0aTFGa0toNFJlcmN1NEpDSFBpbnc1ZVo1RURmYnEzeW56bHpTQUI5eDZHOGo1dWFXYzNJSVZETEFWNEhWeEpSMDZZU1Njeno1OUVuTVhyNmluNmwycHVRU3VIVlI0d2xTbEZWTmdPQ0VxQm9yeW1MMjRqeUtuamw1bTJHTEFnY2VlUFEwZnVIM3Y0anpjNnRpN0F3alZFTHBDRXlPeWRwSmpuU2NVM0VjNmloSE96OXg5ekg4N3o5eWk3ZW8xWHpCRk9wV3cvTmNQYjNDZWxQS3BUWS9YaFdUL1ZhQy9OZFJ3M2Y5eGtheHAxd09PeGtUbXJ5N090VU4vUU85R05rK2hpdUxLM2F6SjNTa1NoaGhlVDFoZ1lXVHg3aEk1SEl3a2hvQzhhRk53VGdHd3BiM3V5Z0c0bDdYdGR3VkFnaHR4Rkh4ZUxyVHA4MUZrdFlSUW5LNUxPNmFPWUxkVStNQTdDMHlYS0M4QUh0dVBsUTlZS3Q3bUlFNURqNm0rVGpzaEtSMHFwbFpkRTU4d0lCZC9VQlhFd0MvV1JHTDdPb0ZlQnBxQXJybmVYeUNFeUZQQkhzdmpmc3VJdWNlaGs0dllsTjA2ajNEdkZlMVlkVUNVTUtEQ2dUVVRhMFJNbXpnamFBRUJDbUlFQkZDQVhkRU9sbkVpWmhDaEFRdEgzRDNUM3gzbHk0djRydFBualRlSWhXd1c5K0FLM3duQUh5ZFlOTXNOcWs1K3RuTGZuTndjc0cxUzI1V2FLQTA1S2NxVFZKWVhWM0hsWlJtZXU2NTh0UFZmc0F6bDVieHdULzRJcjcxN0huakdTOGtuai9EQ0pYUXVQOVdhWlV3RHZ3L2ZOY2gvUHlQM1JxemhxNXRKQy9PODRYTzdnNEVBVU01dll2YjI2K0c5N3V0QlBrbklWYmFhNjNkL1Z0ZVhoOE9BckVIdktPakRmdjIrVTZlTldILzRYMElna0E3d1BFQ0Ira2l5MnQxSEI4SUVDM2VnTElONW80dmV1NzhwUVI3M3dEbGRXbXJCQXVySHM1WjI0Um5iMDhYM25iSE1ZeU85UHNIY3gybkJtUXkwRUlOMWlvUDF3TStEVW1nbFFiRWZYbFZDQmd3UFFCME5nUHdaZURNa2pob3B0bFFGZWpsaGZlNVBjOUdvbXVDdld0SjBkZUVwd0phUlVTQldhU1R1VXJZN21uZCtVbnp6d2dFUmpEZ1JCQXcycnNySEVSYXVPQ0cxc0E2QUxXWFhkUlA5eXN1M2VEcU9wdDZMUzZ2NDZIdlBJZEtKVEx1cGNsM3FIM3FjL084U2tnMzc2a0ZIY0VOdk9xdG5TWTErc3R6aTRsMDZRQzdGdXlaenRFTVlOZVNETGhUU0xsVXhvVnpsMm94YmFJKzFVTitzNFIvOTJjUDRpKysrSlE4Mk1hQXVOYllkWnhKMDM3eVNmemR0MTJERDczL2RuTStQUWZLbFFqRkVsa25sbEJmMVM0c0NORGQzWUdJQlFpRFRKcEhVRnZwdGpSc0pjaEhBQjVHRlhQOSt2cm1zSEJHSS80T0g5NVZsZUhlNi9haVdDcGpMZTlmMk9BT3VFdHJQcnJxbjcvbGc5NHgzMnZmOHdSY3VaUVN0WGJ2Z24xb205Wk5ldVRjT3lmUTBmUGdReU9OK3EwSEVTYkdCL0cyTzQ2aHU3dkRtRUNKWnFlQTJ3ejJnRnFURk5QcUk2TWhxclpLQzFJV0g5Kzc4ZVJWYy9DZFRhd1EyU2hMRTMwTHgvVWswTGJhQXNscHRkcklLeVFwTFZpbDBWOU9EdEpSNEU2a053NXUwa2tlZDhFZDVVWHZCVnQ3cWlhKyt0MnhEaEZhVnlNM3JtanQ1NEhzWTFTNE1QWGt5RzhVOGVERFQ2RlVJb2RKa2UrU0h2Tk10ZnM2NUhuZGhxMFhBMnlPQ3VqbjlDRmE5dHFKYXJtclBVOXRiYmVtV0pBcUpKVlQyQ3ppNU1tekNDdXU0NG1yR3pnSFB2a1B6K0RYNzNzUUsva0NNZFZ6cWJHYjhkZVk2cFdXenkzZ3Yrdm1QZmp3Qis2d2pxeGQzMHcxdDY1RFQ2OVF6T3ZRNXJmY1pML1ZSeEU5aEFSemZSVHhUS0ZRR2pBZTRSaU9IOStmYUxMUFpqT1kyck1EeXl1Mms2QnFuVlVmSFZqbng4dzVKQUJIeExUbzBkaGpjL0R3ZzcycnhjZTA5c2c2aENZTW5Xa0JseGNYaHpTb3VHdjJUdUtOTTRlUnlXYmlZQUI3d0RZRHJqSFBLaUxMMUNuYlRBRU9CVzRmcUZVRDkycGdDWWhWOU0yWTZQTmxzWXFlUG5PclFqWGh4QWZXTkkwbnBKRnNWaUlGY0tNUk96d1VlRHA4RkdBRGpwbWR2RHVWVDVuWW9kSkJRUlJrN2x6eE5tRHNON0dUT1hwWFNMQkEzendUN1l2eU1HaHc2WjN1Z1c4OGpZMk5vbVdHZDA5N3BJSnkyQWpBMXdxODZtMWlIaDhkajZSR1A1OXdXbWJLMFlrREtKZkZlcVNGaFdYTXp5K2hVZzVKN2pnZktsRFVYdWhYdXdJY3dOcGFIcWRPbmtVbHhXNm9yUTJtMGsrOGRBbi8xeC8rUFU1ZFdKU21lblVDSnozUkxyS0JYeXRQQnZobmp1N0VSKzY1RTIwNW9ZbXYxMm15Nys0VksvTEw2UStzZVh0ZEJUUVF0c0t0TFEzZEFMNENzWXJmY21tN3NwTHZQM05tOWlBQS9TRnp6dkd4ai8wOXZ2dmRGMk9NcHZkTjRTYy8rQy94MHNsenVMSzBaaitFYzhIQWtOOHM0WW1YWmkwaTV1U0liNytMODFQdWFnTnBjUUF6Ym15RnExckh4UzFNbXFGVkt6eE5HZ1Awbm5zbS83Tlh6alB0dDE2TFBaYTdXMUdmVzI4NGdBTjd0dXQ0NW02UlUvRjB5YmhhZWFyb0FRQm1oU29uOGVMZTlhZG5nNTkxWDA4NkIzYjBBLzFOZUxMTGw0UXYrcTBBZURmUS9wSzBuUzR4clVxNkNWVEw0M0doU0lLbzhXMWcwM04zTUtkQUQxZUFVeHhNdk9LdnkrWCtkTXBQQ3drcVhRa2dVbE9QQ0U5amVWQVdCeWxBUnhMNHd3ai8rSTJuY1BueWtoWTQ3SVYrWnNyTVdnU28yNEMycEJQcEEyRHVvU050VFFuZC91eTk1UmFsUmNBaHZ2ZnJEKy9GNk9oZ1lwdlRObDFkM2NDbDJRVVVDa1ZzRmtvb0ZFcUk1UHlHTmhFemhvR0JYb3dNRDJCd3FBK1pURWEyaDgrQ2wrSTlWc3ZET1JZWFYySXI2VTNiK09KOGJXWDNUemY0TU1uUEx6NjRaTE1aL1BTN2JzQWR4M2M1KytSaGpiM3EzdnlhOFk4eGhpZGZ1b1RmdU8rcktKYkxPTEJ6Ukl6OXpuY1dxNGVzKyttWHpxRlVMR0Z3UGZWNmpQMFBQL3pSazJtSjZ3MWJ0VTllaFRLQW15Q09sTlZ0Q3dDTGkydGpoVUtwRnpCYnpnQmdZS0FIRHovOGJJelJpVHR1d3VUdUhYajViSHlyaGp1SUFzRGx4VHhXNktJN0Q4aXJzbjJCa2Y4NGQvTFN3VnJ1ZitKV2Y3TUhhQTZuTTlNRUJrUExiVDdXdFpQZWxzdmlUYTgvS2x4K2twYmxzbjVFakpFODR1QWZidzVHdG8vSjUxTDNicDVtd0YxZVRQUUNnMDBjTnJOZUFsNjVTZ0N2Z2lVQVZrbXo3bXVrMDBHVnVoaFdpVUk3cHUvU3Z1Q2VlTnAvUkJTRk16SUg3d3pzYm4xcy9sUUFvR1o3dTB4T3lnTWdwNFVVV0hEZGo5MysvZkFqeitQOHhRWEw3enduWUJOSk00SUJmditMOXdGOFBTRXRlZDNkamdOemMwdm83ZTFDVjFlSEZVL2JId0EyTmd0NDRzbVhzTHl5anMzTklzcmxTdUx6RmdwRlhMbXlna3NYNTdHMm5rZkVPZHJiMnhESXZicFY2K2tENWdTU3k3TUx1SGorY2swK1RZVW0yWVFSeDNlZnY0aWx0UUlPN1JtWE80TlZuNVBDSVVBc1c0NndBeEUvUHR5RFEzdkg4ZkJUcnlDYkNkRGVsazFaT1laeXFZek5qU0p5WVFWQkxUOE5JangyenoxM1A5bm9NOWNLV3czeUFOQUw0SFo1cmVGb2ZuNWxNZ3hEUzRkakRPanY3OEh6ejUvRjhySnRsbi9UdTk0SVpITzRkSGtwcG9GYmc2bThPVHU3Z2hKMVZCNGJlS2xXSEEvTS9nOUEvSE9oZDNUQTBtTjBET2hVcWpzQVEzZENpMWZzVjNUVy9yNXV2TzJOeHpFeTJFc1lNTU9UTTEybUJuUWxBR2grUm1zWGRJck01QVZ6YUR6N3RHTnRrUkw4eDNxQUVkZGZTQjFoWFdyd1cydUlTZzdOYXU0MHYzbHY2dDVJbGE1V3JvTGRWemhwZDJyaUovRWVnZEV0MjgybndGWFJVWDVVRTdjRUJ4WEh5ZUNwNitReDY4djdKNTU1R1MrZXVnRE9JejBBUjVKQW0vbTUyUi9mTkJyd0JqalV6RkJONkZEWEhKZm5sdERYMjRYT1RyK0VXeXFWOGZpVEw2SGtPeUsxU2gwNGdFS2hoS1hGVlZ5NnRJRDE5UTF3enRIV3BnQS8zbC84akd6ckNPY2M1OC9OWW1IdVNwVk1DUlY2bGNMcGkwdDQrdFFzanV3ZFIzdGJUdmRMMnBjQTB4ZjFWQllCL3BHQkxodzlzQTNmZXVhYzNwT2ZKZ1FNV0ZsZVI4Q2p0Tjd2NXUrNTUrN1BOdlNnYWVxelZZeEorQ0lBZWZTSytPT2NaMHFsY2pjQXFOWDE2aThJR043NHh1TVdnKzZlTGd4dkg4UFNNakhUVnhIVUsyR0VOZGMzY1NNZGp2UjBOU0NaTFd4bWpqMXBQNzI5T2wvUm15MXllcDVSYmZYZ1poNWUwMG0raW5aaTJ5RHVmdE9ONk8zdU5LWktHRERnY0xaQnFZSFYzVVlsSlZvVkYwVkd1dFhQU3dBRDNNekh1azFFYWR6aDE1YyszQVdNTmdId2E2OHl3QU9tUDZSOVptKzdxZmRDd0pMT2xhdFQycWpHck9JdFRaaXI5ODZ0T3FseXJOWDNsaWF0QmpienJ0MWpJczAxblV2bnBzN2NMSHFqOVlyMVA5Si9OTTdJL0MrOWZCRlBQWDlHZkNOa2NhbWFpL2V0bnFmdHVOVmcwanIyNm4xR2VQTHBrMWh3dHA1eEFHRVk0YW1uVDZLd1djZGNzS2VDbkhNc0w2L2gxS2x6ZU96UjUvRGlDNmZGSEw2elVJN1RLdytmS0lwdyt1VnpXTHlTdEo2ZzNpcFd6MUhWN2xEWGkrQTRkWDRSdi9Zblg4WEYrVlU5NzY3MzFldEZkd21yN3VXOC91N3RRL2pGOTc4ZXZWM3A1eFE3dTlyQldGMWI2VzZyNThucURWczlKNi9DdndQdy9aQmp4TVpHc2ZPVlYrYXVVVks3TnFPb0R6dU04SkdQL0tuVzVnOWVmd0EvL0RQdnhqUFBuOGJhZXNGcm5xZmEwc0xLQmw0OGV5V3VRWGxNOXE1VndDRzNDRnlMQVdNTUdYbG9ndHA2d1FLR2pNeWo1K0pWdVFFekI5U28rUitaQnpCeFlHWnVYcyt4TStEUWdaMTQzUTBINUVFTjZubVkwY0tacVNlZG02ZjhRT2hoa20xNldoZlNjSXhjNjhDdEh6YzZsajdZS1U2VWF6U3NGb0Z6cTY4dXdMdWhtbFp2eGJsbWVnZWhiTTNiQ0Z2Z3NLWjFPQmMyR1pYZnRMV3R4WFBuSldpdG0vQXg4U2FSVjBuM3hSdStCUGhWdXFUVlI4dHlXMUE0Zi9FS3Z2TDFweVNZR3kzZUdoY1VId3VIblBZaGdhUWs5ay9ESzk2UjdMN1Z4SHk4Vlk2ZGcwT3M1emw2WkMrR2g4U1cxeWdTQUgvbHlxcjdGTlhMOGVPejRVQVNHV1BvN3VsRXdBSmJNQ1VQVFMwd3BXSUp4V0paODBuK3pxc0xYN0UyU0JvM0VqNXNQNzk0aFdMOWd3UDlQUjM0MEUvY2hzblJQc2NUbmoxK3hzWlRtUEY3SlYvRW4zNzZFU3lyeGR4V21lWmgxUFhaa3hld3VWbkVZSDRSclBaZ3hTR09ucTNUcVVLNmNEVTBlUUQ0QkVTYkJRRFk1bWF4VndCZFFJQ1FhYTAra3dud2hqY2MxWmwzN3R1SlNpWEUydnFtM1prUzJrNXNuYXN4RjVYNGlhY1BuSE95aXRObzdKWElvOVZIcmtZdi96aGRjVSswZWEzdEMvcnRZNE00Y2NNQlhhNVp0V3l1OWVBSXFkV1JwK1FncHFwSTVWWFBZYlJBL1RFNUs2ejE0S3pBUS82Wk1reXJjdXZDcFBlMUE5dWJCZmhYV1lQM0JRVm92dmJRNmVSQ3ZRdjFYcFNXcXh3Vm1YZW82TGsrTzEwOVBBVllxSDRBKzkyckVsd3pwVWpucEc3MEdpU3ZmVzFiaUR6bGsvNUNWK0ZISE9ic2QvVS81MWhZWE1OWEgzNEdsVER1MUlsK0MvYmVkL3ZLOXk2YSthcGIyclVTbUtsb0Erb3JBSUFYWGp4ckFmeFcxQ0hpSEd0ckcxaFpXY2ZxeWpwV1Y5YXdzcktHMWRWMS9iZW1mL01TNEpFb1NQeFRDQ3ZyQmZ6bXh4N0M2WXRMV2t0WFc1SXJsaWJ2ckxxWDJuNGw1QmpzN2NCUC9jQ05jbTdlQko3UUs3dTZ4VlJNU20yZUFiaTE2UWROQ0ZjTDVKK0ZjSTRUQUFpS3hYSjNFQ2lOMWcvMGIzakRVZVRrTm9idDA5dXhzcG8zb0ZFRDZGZXFlTG1ydTZNU0VaTEg0a1dJdU5sdkdYRllZRzV0bHd0cmVjb3pIcHZjL2ZPZG5SM2srZTNuY1RVME5jQXFFN3dDZFFxNjJtRUoxZjZVQUFEamJFWFJVdE8rSHRDZDV2Q0J1NkxwYVJOYjVSS01KalhEbWdMNEJ2TmZqWkFXN0pVR1RyZTZRWUcwbm5PR0ZLeUlaaDNaUUtwNGFqN3lYWVBRdUw5YTBIRDZodmFXcDZadDVBdm1jalU3TkoxamZ1ZjJsajFyeWtCcDlDQXI0V1dlOVh3Qi8vQzFKMUVzVjR5QUd4Snc1MmJWZmJYMmJxaERORHdPSk40MkhLS0k0OGxuVHVLWlowN2gwcXc5NTUyMmpGb2lUeU01bXduTjE3dEZ1UW5KK2tZSnYvdnhiK0I3NTY0UVlEY09jYWlwdmhJYTVVMmxsY29SUmdhNjhaNjNISWt2WFBZRXRiQ3k4aG93MlY4dGtBZUF2NERVNWt1bGNqZDFnc05ZWU0zTkJ3RkRUMDhuYnJubElOcmFzaGllR01IeXF1MkQzZ1Y2ZFZlcWhMYVhvalNoaHNTZGxnbm5IR0ZGenZOUTdaek8yMGNjSWJjRmdKZ0hQQmxQZVhSMDVCSTFlRkR0bkF6T1dvdURBV282L3dxUWdWcnhnak5neTN2RUFJYk9JOE9BQjBpY0RKMDU0ZXdteGJmaERmbXlOTkUzbHYycUIxOTcwRFM5S0kxNmU5UHBYQXRvTGcvWGN4MzFGcWZLRklCcWdOcFliT2ljdS9nWDZTdXUzM1Y4THQ1K0JuTnRtK1FOc05QRlMxdzdxZ0doTFpZcStQS0RUeUMvVWJEbTM4VWFGck9sTnQ2b1RieVB0Q2tORit1bjVFbnBkUGlLT09ZUzl0QTNXSm5Hc3pja05MWG95Mnh5SEs1RnQxRW80L2YvOHB0NDRmUzhCRy9sbDBScDlPYjhEK1VtVjFsVHk1VVFZY1J4WU9jSTN2cTZmVFVyMGlIbjhNdVoxUHZsLzFtQS9OOERtQ3VYSysyYzg2eFpiQWM1bjgxaVFIL1hYY2V4YmNjNDJqczZzTHl5WHYwbHlzUlZTNHR2cGNrK0RTZDVMUWVxaXZLbnJMWHl5RDVvSnJJMWV3cjI5aFFBUjN0Ym02MHhLYkRtSUdaYUc1eHB2UlRRMDdVUFVhVHFhMHo3R3RpSlJxZDRnNXVCWGZOVG1tTkNDN1ZuZ1YzOVlzVnBJNkZRQWM1dWthT2JyUXcrNFNkU0FobElHMFlHSUtuVEdZQm84VndKdGNyeVlpd3BkRXNhRmNJc0U3eEtVK2N3RU8wOTBnSWk0UjFGNWw2bVU2OXk5TmZ5WXk4N2pRWjY5ZHlBZm82SWN6endqYWV4dUx4dWd6c0IrNlQyZEsvOE5OeU5xT3VkMVlwSnl0aHM5MHdQWkMwUWZtcmthUW1vdmthLzEyS3BnbzkrOHR0NCt1VGxLaG85TmRVVFgvY1M2R2V1bjhheEF4TVdYL2R4TTlrczJ0dHlDSU1BRVVzRnN6ZlB6TnpiaEV1dzVIQTFRVDRFOEZlRlFxbWJtdVdyQWYzVTFDaHVmY054YkJaS2VtN0lCdE40VDRxdHFuZERJeDlrMHJqaE1tSjJ2QmpZeVlsSUlabURqMEpMYzFjZTdDeHp2b3dQSTdIdlZXdHdjQVp2T0lDZ0FWb042aG9wREpoencwT0JoVFh3azhlekZrOFJMVlJwaFVrQTNKWUJkZzhBTmM0ZFNnekZjT3M4MlYydG9OdGJJcDNlb3dzNDc0TzhQN2hySkxqMVh1a2N0Ukc0ak5BSGl4WXhMUjM2MTMzUHNBVTJuZGZNcDFQTlgrU2hnb2pKYThXUitPODgvajJjdTdBQWZTYURGSDU1blM5WkMxRDFoaFlBY3RweTZvaE9rZGhBOFMzajF4eWpOQUthU0syUzNzSzJLVmRDL0pmN0g4SGpMMTV5TlBySUJuNnkwajZLSXBRcW9mYXkrTTdicjhXTzhmNnE1V2h0UHAzM3UwNEFOelQ5Y0o1d05VRWVBRDY1c1ZGc3A5cDZFQVNncG5zWDZHK2JPWVNWbFR5U3VvcTE4SUVEcTNXNklmUXlyUjN0RGU5NjJ5MzRvWGZlaXR0dU9ZaDl1eWZRMjkxcDFVMEJmcVZpbjVBVXlhMGRFVEVQdWFmWGRVaVFwNnVVMWNDdU5ETUZHZ0FROFFoNkxoUzIyVjRQQUI3d1VHa3hLNEVzVXkzZ01vdkN4SVVyYjJVRFlOZUErRzBrbENNQjhKVlV2aVJlMjRITFJqVno3aERUSHpyZEFXM1o4RXI0c3VidTFYdVJtclVMOEFhTXlTcDIrWTZodFhieURwMFZJcFpTQUFBZ0FFbEVRVlR6RFNKcUdRQ1B6Y1c3Nnp5TWtBZzduUW95WFBTZkYwNmR4OVBQbmJIbjNFbkhTZnpXbWhqZ1c0SU52T3B0aXdNbi8yOTlTRlZPcXl2VEpEOGV1MGlpOEpnUFpWSVlSdmpUenp5S1I1NjdFRjk4Ri9vMStuSkZycnNLSXpERzhKNDNIMEZmZDdJM3IrNzZGdDhCd092VEV0WVRtamdTcEtHdzlMV3ZQUldlT0hHUVJIRUVRWUFvaXZRMk5NNkJJQUE0WjlpMWZSaVBucHlQTWVLZ2lqTUhBMFBFSStRM3kzYWlUazBLZ3RqS2tram1vWlUzWFozdEdCMFpBR01NSTBOOU9IVE5UakRHc0xGWnhPWDVKVnllWDhiczNESVdGbGYxNGlJeHdLa3RkZ3dSNHdpMGt4N1JHeGtDZ0FFZDdUbEVuQXVwakFtd2xkNFk5Vy9Fak1jMHNjWEtQRG1uejhsRkp2Rmpua2FsY2NiRW8wSXdzL2d4RnFNVHpuTGthTThZc2t3QWZGdXFnNWppSVpRQVgzNTF6NzVvT29nbUpJTTJOM0g2bm5QcHFFaStPMGtrQUpqcnZoWVRwaXdlT3NyV2hyaGRMcVV6OUlRdUtRNzBta3dGS1lFQWlQdFgwSUtIb0w4MHQ0U3ZmK3M1aEpHaHN5dFpveDJkS3o4TmR5TlNjVTJLU285RmZzckVlamNDY2dsNWFyVkkzUXlicEw1YXdrbWEwRFBZai9XbDVjUTZSUkhIZi8vOGt5aVdLamh4ZUFvTW5Ld2JZbURNM0RNd2NCNmlMU3NITmNiUjBaN0RlOTV5QkIvNzNHUFM4WnJkbHp1NzZnYjVHUUQvb1o1blRCT3VLc2pQek55Ym01NGVIN3oxMXV2MGZMQUlOdENydEd3MmcydzJpNTNqdlRnM3V3Z0h2VlZXT1VoeXJHMlVFdWYwM0R6VWxidkxLMlcwRmFhMmowaGlidmw2Nytwc3g1N3BiZGc3UFFFd0lBeERMRnhaeGV6Y01pN05MZUxzK1hrek9FdnRSdTNCRi9zMFE0QUY2T3hvZ3hqa2xaQkJoUmR6emNFZFAvV1FZQTR0RUhDU1F3Tjl4QWpZa0dkZ2dsOHkwRU9VQjlHbUdYQk1EekIwTk5peklnNmNXUUdLci9iWkYwMEdGOHhqY1lEUjRDV0swbmwwYWhxSkpCTXBEMWgwbktTWnpDVGV2UVlJQjVlWHFZL3FqOVJDUkxWMmtIc3RSR2pIUHR5YWpsaGQzY1NYSDN3Q1lkaUFXU1lKaXhzRXlxUnM4ZmlVQmRTV1VkS3cyUEtNUEhiUm9vcWtHVzliVkZSZHVUblEyZDBGY0k2MTVaWEV2Snh6ZlBMTFQ2TlVEakZ6L1U2OVQxNzUvZFRua0hEaGJiRVNScFlmKzlIQmJuemZHdzdpL245OEpsYUZYRnNPMlV3Z3JBUkJGcG1vNXFEMno4SmNmKzNaczVlenp6OS9WcHZrbGJsZVhRUEdDMTU3WnpzaUh1RzYzYVBvN1ZMekdzbHkvVnErMkZUblNaZlhUelUxT1JaTHRhWVM1SFUyazhHMjhVRWNQN0lIZDcvNUpodzd2TnZMblM1STRoRkhyaTJIS0lLY3M2Y0xxY3dpUEQzUFRxNGp5OHhxNTlXSGdKQ1YrTG9PanVtZURtYVdZeElDVG93RE8vdFp3eWZLY1M0ODJXMm04Z1Q1MmczVzFJbHVVKzRIZVBtZm5oNlJ3R3JNNS9hN2lTZ2RNY0Vybm1xK1hQekc5N1BUOCtMTm9qb2lhSEJvODcxWjcySDZsYW8vOVIrdkY5eXBzcm5wbDZWU0JWLzY2dU1vRktzZjJaa2VmTk9IWnNIWHh5UVZ6d1NpcW5sVDRWWkxucWhHR1MyZ2ExQUFhNFpWRWwxWFh5KzZlbnVxNXVRQVB2WFY1L0RJc3hjOEo5WkZsaStVVWpra3Bud3huNzkvYWhpM0g5OFZaODBZT3ZXOGZLcEJjZGZNekwxOWFRanJDVmNiNUk4Q3dPYy8veDA5RHc5QUFqMHMwQThDaHJiMkhIakVrYzB3bkRnOFJkajRYK25xUmltQnhQTjVXQko0ZXFuZGx5TmdBU1luaGlnSzJnTThONW00ODN2cmpkY1lLMEJDZFRvNmNscDdWc2tXbUdzUWh6Vm9XNHZ5WUFiOFdEMTBIVk1BdlFWYU5ranRHR0RvYmZCRU9RNnhUUzVmMy9ITnI2a2dzTjBzVkZQdEUyc3JEOEM3UWhTSExaaXBPVzR6MSswSWN4U1lyZFh3OHBlQXZ3M2NkcGxVT3dlb2tFaDRLWEJYOUJ6U3A3d3NXekFFNXh4ZitmcFRXRnBaUy9oMnJJOHdSZXY2eVdNcE5YbDZDQm9COHlxVWlmbFRvR096VUU3ZlgvT2hPVVpiTDViVUxyMTNjQUR0Q2VjRTBIRC9BOC9pOU1VbHNWNktySmtLeWRuekpibkMzbkk3SG5HODdzaE9YRHM5R3VPcHlxMEVxVTJiUjlJU3BnMVhlMDcrS0FBODhzaUxXRmhZd2NoSVA0SkFEQ0RLWEU4TjQ5bHNGbEVVZ1lGaC85UVFuajQ1aTh1TGFyODhoNWxqRnRscXJxeFBFN2lwd3NoUUgvcjd1cTE1R2VYRGxMb3k3ZS90UWk2YjBWa0pDL2lNNnFUbUFHTjQ2NTNIOExlZmZSZ3JheHVtQ29SSlYyZTdOcFByUkcxQ1QyRzI1d0JuRHBYS1Qwenp5blRQT1lNcGlzNjlVeE8veldlOG16VjFvdHpGVmVIUjdwOWk0T1EvUzdnRGpLQWtJN1I1M0Njc2dRZ0FqdEJGNStqQmhlQ20raG9uRERpcEFEY2x4S3dMdEZ4Zm1iVHUxTnl2eW5iekVncGQ5aU9QZncrdlhJaXZwL0cyWHowSmpTQkhGWGtpSHAreWdGUXlTbldLVkNVbEVDWG5UVmYvdEdWWG84dTE1VkF1cFRHOWNlc25ubHFsbEhya3R3UUcvY05EV0pwYlFMbVlQTWhVd2dnZi84SVQrTjkrNUFUNnU5dkpFZUFpTUNZc1UycGVYcVNiY2ZWdE13ZXd0TGFKeTFmTTRXb2RIVUtERDRQVUM1U09BdmhHWFk5WEk3d3FJQjlGRWI3MHBVZncvdmUvUlFNbzU0Z0JmVGFiUWFGVTBUN1haNDd1eEtlKytqeGhaNUJ3bzFCR1JjNzU2VmlLdGhZWStvSUZ2VGh5Y0JlT0hkbURRSHJrQTJDZnp5NEJYL2szMW5QYlp2TGFMR0FqOCtJVXJMbGNLTmZXbHNNNzNuUVQ3di84d3lpWHhid05GU0s2T3RydFdpckExVUJOeXpBZ0xRWnNOYWZrMUtPRlFEL1l3VERSMitCR2VBQ3o2OEJTM0NYMGF6N0V3RjNmSjRPM3VQYlFXS1o4bVpvZ0xLZ3J0ZXVNY3llZnZHWU9Ed1B3c091bThuSnp6UjIrM3J4TytmUlp2dmZ5UlR6NTNHbXJUZXpMMmdqSlBWZkpOSFpFWTJCUW5mbldBSEtEb1E2R2J0OXNWVzNhMjl1d2UrOFU1dWNXY1dWK3NmWFBXQzNVa0F5NVE4TVl3OERJRUpibTVsRXBKOCtOcjIrVThQSFBQNDU3M25VVGN0bU1Ybnlua0NPS1FvUlJKTWR3TWFneUpnVHVnREY4MyswSDhlZWZld3hsZVJCUWU3dVlabzdxQS9tV2hsZkZYQThBWC83eW95Z1VTakJiNW95NVBnZ1lzdGtNV0NiUXFNUUFUSXowWXUva2tKZHh2cEdKWE04NDA5NmV3NXR1UDRaalIvWVNuVmlSTzhPT1owRGg4TVJ4MFFta1lFaitSQWNLR0RBeTJJMjN2dUVZTWtHQWJDWkFKaE1nSzY5N2V6b1FTSzA5a0hubGJrUEowenhJVEJ1akE3MmxzVGwxVFFzeVhMU0RtdWZ0YW1QWU9kQjRONXJQQXdzYkRXZC9WWUlCUmRzMGIwQ1NnamRwZDZCNWdJOEJPN2Z6bVV6RWxBOTducDM3dmVLNWUvTXBYL3IwL3UvQlhNL09MK09oYnoyYnVpM1RKc1NxVXB0TEhZd2I0ZFlpV0V0K01FS3l4UkJhVytheVFpNmJ4ZlN1U1FTWkRNYTNqYUp2SVAxVWNuTlAwa0J1MmI1QndEQXdNb3dneVhHSFpIMXBZUTMzUC9BczNCUHAxSWwxcFhKb1RQbksvNG5jYnRmZDJZYlhIZDJwV1daeldXUUNjUmhRU3FEL3B3dnlNelAzRGdQWXJ1N3orUUx1di84aFoyKzhXczNJa0dzVDgvR01NWEdxalFUNlc0OU02Ymw4RlRpQWpjMVNMSzdlTURiU2orOTc2eTJZMkRha09WamZud09rSnQwZUVCbFgycjRCY1gwQ25GTFBHWk1yT1dVY1k5aTljd3duYnRndkJaMEFUUDUyZGJhSnZJd1pqWkJML2xEc1NGbVE1Vk9nVjQrUVlBNnVCMnlVMXBmTGNPd1pEQnIyWnJlNENjem1hOU85VmtKTmNCZUlycUswUUFUbjNoWUM2Z1Y0ajlBR1N1OUNNZ0RZNEE5dmZnOHZKeS85Rmx5QlVhV3ZyMi9neXc4K2psQzdVM1RyNHFta0o3UVUwcW9VRjQ5UFdYSXFudlZMRDgwK2R3cDVvVjV1M3RpSnlYSGsyc3hpc3UwN3h0SGQzZFZZMlFsNTByS0swZkdFZUFDWmJBWURJMFBTS3B0Y3duTXZ6K0dyajU2V2MvSDJ3VFhsU2lnZG5KSHpSa0xqb2ZUb3ZtMFlIZXlXaWo1RGU3czAyYk5VSUg5NFp1YmV4czJpbm5BMU5mbllnb0xQZmU2YldGaFljZnpYQzBEUDVySlFlNGpOZGpLRy9wNTJITjAzVHJpSUY1VXZKR2p5M0w3eGR3aUc2NjZkeGx2dVBJN096bllkVHdkRzd1R2cwcFZwM2Rhd3hZVVNXZ0FGOUJLRXVmcmwxdjJOUi9aaHovUTRBc2JFSHhpNnVqbzBtQWVLbnhZT29JVUVSdXJHWk1YVXZucEdmcHNCZXBXWE1XRGZjQWE1QnZmQ0x4ZUE4NnNTRkRtMVBMejJRbXB3SjMyR0xzQXpwbkJPOGlnYVdVWXpBTy93Vm5RV2p4Z05uUHpRQ1Q0QWg4T0xwaXY2Y2lYRWw3NzZPRFlMNlZaUEpyNXZIci94Z1JkM2lhc003clZTYXBHbXlsbG5CMjZHWjdQUDJPenpGTW5jTm9jWWczYnMzSTcyampZcnZwNDZYWTNBd1pITjVkQS9QQUM2L29zR2hUL2ZldTRDVGwxY1JwQUp0Qzk3dGZoT095M1REc3pVWWp6aEMvS09HL2ZvOGI1TnRra1lwSUxiUGdEVExYaFVIYTRteU1mTUVLVlNCUi8vK0Qvb3ZZZ0s2Slc1WHN4Zkl3YjBOeDJjUklkejVGKytVRzZvTDdXMzUzRG42NC9nK09HOWFwSVpnSDhnZEJNWTR4TFVOYVNML3lXWUJtcVNHMlNSQnJPdjRWd3p4dkhHVzQ5Z2VLaFhDRDBCUTNkSEc3aDBqcU1XRzJnTm5wdGZGY3VZcWdlWEg2RE13MVVaaGtkZDRFSUc5YjNER1hUbUdoTTQxNHJBdVdVYjhPQUE1YXM1TEJnUWxnQ1dGdHhod0YyUktuQk5uS1BualFoYkhvQlg5NFNPZ3JmMTY1WlA2K1l6LzF0WC9tc080SUd2UDRVclMydDJROFl1SFNuREUxcjY3cXN3aXdzTzlSakZXMFNaZ2syc1ZvM0lLdkdMK3ZJN1lYMHRUd2dFVlpBSk1EVTlpV3d1WWFsWG9zQlM2eVZWcjB2MTRNL1YxdEdPdnNFK3RIZTBvNnVuRzcwRHZSZ2NHY0RJK0RCR3RvMWdjR1FBZlFPOWVQQ3BjMWhjTHlHVHk0cHRkZEpjcjdZM2gzS3JIVjJGSDBYaXhMckRlNFV5MnQ3WTRydVdoVmNWNUFIZ29ZZWV4cWxURnkyZ1owd3N1b3NpRHUyY1FKdnlnWTYyTEc2K2JsTHpVUE1rYnZEM2E5T2xSb2Y3OFk0MzM0enQyNGI5UXhpM2h6T0F6S1dEYXRRU3EySG0zcUhyVERSNHJqRmFORHpGYmFWdEEyaHJDL0QyTzQraHE3TU5tWUNocTZ0ZDVoVURwQVp0SWhpbzlYNkt2L2hWQy9DWUZpenNNcWxISngvSWVBWjhEdXdjeUtDL296R0F6NWVBTTB1Uk9VUkhnYVlEbks2R3Y5V2c3NEk2QlhZdDROUUNkM2Z1blFJb0FWRWJZTVZGWFFCdmdUYjMwNUhCbC82djZ1cW5zZHZaS3lCWS9FMzhzeSsrZ2pQbkxpZTJyeHNTM3llUDMvaG9ZeWtjTldoYkdLcklLZTU0a2E0U3ljOVpUMmc0ZjIyNUt4WTI4cHRtU29hVW5jMWxzV042TW5IZXV5WHZva2JuOFNaYkhWemNkSFIxb245NEFEMTlQZWpzNmtTdUxZY2dZNDlyNVREQzU3LzVQUlJLSWJLNUxNTFlYbmt1L2RsSGlEZzVveVNLY05PaEhlanViRU5IeDZ1NytPNVZCM25PT2Y3c3o3NUkvTlZEejBmcnVXVmxscGJYakFGSDlvNWpvRWZzMlhMbjQyc0ZCdURhQTFONDB4M0gwTlhaYm8xaTFrQUcyS0FOWlZFd0s5YTFLMFFYMElsUW9BQlowUVVhL2VXMW1hbVhzL1lNdmQyZHVPdTJJOGhrQW5SMnRGdUE3bXJqU2dBd3dnVkZjaVVjNkhrRVRhZlFTSmZOQkRJeFRwdkVCb1RSSG9ieDNzYTZUYUVDdkx3VUllUUtCTGxsMW80RGZnTG9XK25wQTgxanNGek5rUk5RVjgvckFMdW1Td251UHUyZGduY2M0RlU5REkwUDRGVmh0UURlOUdXN0hqcWFKS3Y2MGZ5VW1zZXU3T3Rubmo4TEs4VHhGN0ZLZUVJNjhHOGtlQmdrNFhBOStGd1hVV3Q0cHBBWG1pODdnWXIyNWZ6NnBwMG0rMDk3UnhzbXB5YjBXTmhJWmFxWFhnYy9PckQ0NkdKOVhkNlQ5TFdOSXI3NG5WT0lPSkJyeTZKU2lWQW1EbkpDWXJLUGlIYWZDUUxjZW5UYXpNbi9Ud0R5aDVJU25uMzJETDc5N1JjMDBHZkpQa1RqWnRBRytreUdZZWFvY0pDelFVK29xL0dCdHJYbGNQdXRoM0hzOEY2emxTMUdhd0JhR3NDTnBRRWUwenVNQUFEOUsrR2FxMTlvclYraGFrQUZBRlVlRVJnbXR3M2p4UEg5Nk9ySUNYNFNxQzBNWnpBdWVoblhhZXJCOUhmRzdIdTFoMTRKQ3lxTDVtT3hFZW05N1FHbWh4cmJkVm1KZ0pldmhLaUU5c0l6OHczNkFkOEgraFQ0RGZqWC9yUHlHRTR4VUxlQW5WU0ExcGVDTzJoK0dEQk8xTjQxS0ZmUjBDVkRYenF2QnZDRzJydzcyc2Q1UXByUFRFOW9WRjVDcXZPZXZ6Q1BsVFd5Z3JKUklQZFErV2lUOHNmaWVSMjBkYUYwZXRybUFibkdnRllsc2FsblRFR2FYODhuWW1SbmR5Y210by9YVjJZRG9ScjMvTnA2bFZSL3U1cFAyazZmWFZqSHQ1ODdEdzRCOU9xd0dxckJSeUVCZWlrRTdOdzJnT25KWWJUbE1vaFlBSjVLOHNIK05FUnB3MVVCK1ptWmU4Y0JkRldqK2RqSHZvUlErZ1hPWk9taU93WDBaRFc2ak51N1l3amJSM3JsOXJuYUk4dndZQi9lL3NhYnNIMWltRVRUMFpITVc0TXNiR05Bb09QMU5MclJ3cFVRQXFxdFE5dm5OWEJEbWRHNVkxWVhWV0RPTDhCeDZKcWQ2TzdxZ0ZwSVo2d0txazBvY0ZNbVJxUFhaYWw3QnIzUDN1VG0yanFoNzFWbURuUmtnZjJqV1FQK2RRVE9nWmV2UkNoVUNOZ2dEdllHM0czQU4vSG16NmZScC9wVElPdnkwNWRVSUxETDBPQk9BRWp6OHp5VGVQWmEyanZzUEFwWVFmaFdUVTh3OVJPQXBuV0JMNDFUS0tINTdkOVluV1I0NXNWWGtCUW8zNXFmYUZLNk41N1hTSy9Kb0RIU0tvL0JQVmUxZWZMYUpNMkdhc3lycE5XcWs1aVh0Nm5vWFc5L0wwYkhSK0lKRm4wVEZhZ1JObGJYc0RRM2p5Z01hNWVWNHNVLysvSTg1cGMyRUFGZ1FRQnV6Y01yRGQ2ZG80OXc0dkJPZFBlSUUwbFRndnl1TkVScHc5WFM1SGZWSXJod1lRRmYrdElqWUl3aGt3bWdUMUF6bG0xTFUxWno5TGNmbThZbVdWbFBCeVFyRHNEcmJ6MnNmUWtEWkZCUnVDalZhUUdnbkpRdHI3blNmTldLZVU0MGNMb1lqbXJuaEFaRys5Y25ITG5YTUhucGRyaTRzR0NQTm93UlV6dzR3WG81WDA5TTkxSitJaHE3RkdnNE5PYUxweE5sWkRNTTE0emxHajQyOXV4U2lMVlNaSUNGQWcrb3BoMEhaRXRiaHczOCtsM1g4V2ZmY2dmVXVRWHFGckI3d0YwREgrTDFUNis5MjlZRUw4RFR1alFKOE5RVTczVC8yUGRBaDBXZm1aNERXRjNid0xtTEN5Q0puc3RFK1BQbXF3WjhxY2Y5V21DY0VvZFRsVmNuR0cwWnp3WkJzZTVzc3FPVWlpV1V5NVdxYlRjNE5JQ0J3ZXJucnFjcU1uYVJTR0dGVXJHRUs3UHpLQlY4bnU1cUF6c05FZWY0eHRPdlNILzJJWEs1TERpNDJVNFhjYW5ORzVlM1lTUk9xN3Z0eHIzb0x1WVIyQ2V6SllXQm1abDdtMjgwR2E0V3lPOU9RL1NKVDN3Rm01dEZ2V2hEYno5TEFub0E0OE05dVBrNnRmMCsrYVZsYzFtMHEzMmQzQjYwaE9uZGdMdlJsaFVZR3FGQzN0cW1ldzJhSUhSTS85TkNnVVphZTQrOHpaZWEwWFZsTFF1QUtZdnJmRkJDRWJWQTZNZVRkT3FlbU80NWlNWU85U3htTXg1akhOZU1adEhSNEVyNlMyc1JGallNK2xsejFUVUEzd2Y2RlBqck1kVjdUZmFrZkFycTFZQ2RPOCtSQk80VU9CVUhTM3VQZ2JDaGFSN2c0ZkIyOHVsTUNXbWtmbkVhbS9kekw3NWlhZldKb1FaSmZXTjNYSkpJWnA4R3dsTENYQlVrclZzZ2FRU1Fxd2d1YVJrMlErV0x6Y3RwR3JzUGNPdTlqRzRiUldkM1Y2TXlTTlU2cGFHS3dnaExDNHZJcjZ5aGVpUHFyemd4ZldGNUF5K2NuVWRScnJCWDdzeER2ZmlPYktjTEk3MG83L2lCQ1d6dmE2dkNPeFpTWVdhYThKclI1QUZnYlcwRG4vemtnM3FGdldXcTEwQnJBejA0OE80M0g4Ym9ZTGZtNC9zV2U2VzVoQ1pSd1lIUk9GbXUyaDRYZ0pySkFYdFJIUVYxRUlBbEs5Y2xxQ28rbWg5c3M3MDZzbFZndDFIZmlXeWdpWFY5cmJwd2s4M2w0UXlNZW51ZHlzYzFxUjdxR1JqMkRPZlEyOUZZTjFuYWlIQitPZFFBcElEU0FudFZ2QS93NFFLMHFXb3IvbUtBVHF3Rk9wa0FPNjBYU0gwMXlMcmdyc0hZQThnVWpHVUJWTU52Q3VBcFdGTStGai9OTEFiKzdpOGh0UWJ6Y3JtQ0YwOWQwUGNlN0tXVnFqNjJPamQxZzJZOWhEemhOaW0rcmpxa1lPSWtKcEZVTnkrbnJFWFN3OVhJbkpaNmZjMXhWOG1kZHkvRDBNaWd0NXlFNGxPRkdGMjFEc1k1OHF2cldGNVlsSzdURmIzbllaMlBwVnlxWUgzTkxESjgvS1Zack9hTGlLSUlFUmM3d2JqYUswOVBxSk54REVBdXczRGJiWWRUUGhtQUZwcnNYMU9hUEFCODlyUGZsSTV0bUFXNFlBYU1GZEFyODNWSFd4WS8vUU0zYUJPNkwvUjJTNUNYMnJCNmNBM3djcys3OFZZbjAyRnZNMU1hZWFBMWRDQzJDSThiOEtSQXIrc09ib0RhM1RzdkNyTE05a2F6SjR2NFZLQTA1UG1rMU9BQVB1SEZvVTMrdW15SlBNcGFNTkVmWUxTbk1XODMrUkxIeTFmVVhKZ0JVbk1QQTdCVkFKOCtxZy80NDVvNnJMK3FtajB0bDJaTEFIYXR0ZE54d1FGM2xhNjR4YlYzVjh1blFLdG9URHFvTlNFbHdKdjhIa0dCTy9sTXFmRTBVajlDcFdsT25ibUVvanFjcE1iSVhDMDVIZmg3SXFzSUQ4bkFtYnIwZEZ6ckJLcFVwZFdKN2JxNzFSdnFBUE9ra004YmtMZS9WWExOZ2M2dURuUTZKOEZWRldLYXJWaENLQlZLV0p4YlFMa1UzNUZsNUZkVGVGZ0pzYks4aHMzTkFzS0ttSElzbDBOODk0VUwydFV0NXh6WlhNWnhpc1BsRmtPT1RJWUJRWUNob1Y1TVRZMmxyZW8vVDAwZUVHZkpQL0xpTE5IaWs0RmVBUmRqd0RYVEkzakxpYjAyTTlKUmVwUW1MM2x3WWhrUTBjck16U3hnWmJJQTQzNldnRE9JWmk3NUJOYmVjeWJqNkxTRFU0WjVERXRnVUVBZlFDejZVMlhSZVhsbDlwZlZJY0tBdmJYT0VnUlVteERCaFhPVFg2M0NIK3JLWU9kZ1l3ZkRsMEtPbCtZckNJbEpYQVY3eTFveTRHdXdvNkR2WUxndmNPZWZueVlPNkp4RVdod2NZTmNnbUtDNXE2ZXl6TzRLM0RXSUtnRDJtT2Nwd0ZQd3JRUGd1ZUlGVWw0Q3dOTTZrZHBhVno0elBZZllHNS9VdnJFTVNZSEhiK29CN1RUOFVqRktVYy9hV1ZQV01nVXF4L3B1MWFaTVYyNHpWS1o3Mk9saEdHSnpzMkJUY2plVHVCd1k5bWp6OWRRbzhRSHFrd2lpTU1UeXdoSTVQYytmUDRvaUxDK3RnY3RESVBKNW84Mi9NcnVDMllWMWJZN25BSEs1RENKdVZ0bURjMlF6Z2JnT0FrUVJ4K0hEdTlKV016VmhyZkNhMCtSNyszdngvT2tGWEZwWWsrQmtBNzNXNGlGTnk5eG85ZTkrMDNXWUdPa0ZFSDl0ZmIxZEJzZ2xlR3B0blRrYU9kU2ZNWFdiT3RpTDUxUWREUjlueTUrcUFLZldBWmg4NmxuQUFHNFd3REZOWnpKYXErVUJlNjVkRjZRdVNUN1pHdlQ0V2lYV1VMNnEwYnJhR2ZhT05nYndFUWRlbkt1Z1ZPRWFtQ3d3STBWVkEzd2Y2RlBnajRGL0hYOFdEL2NmUWZOYXdFN3JFSHRPd0JZU1ZCWUZ1UERRMFRhZ0FLK282R3RxRk9CaDE4V0dLRVBrenNQYjJ3VTVadWVXakhjN1p6QlB2b3FIUkNwdnBuaEJQcktrOHVMeHlicGtLdGlvUlpTQ1NYM3dsQzc0bnJPSnpEVkQzdkorNTJNbHJycDd1dEFtVDJWTEtzY2ZuYTVTL3o5NTc5VmtTWktsaDMwZWNWVnFVVnAwZFluVzNkUFRJM1oyTWRnMVVEMEFCcGd0OTRIdk5KcVJENFRoWC9BZmpCbWYrRUNhMGZBQXdnQmJBRFJ3dWVDQ0FIZDdkd1lMOXV6MGRJOW9WUzFLVityTW0xZkc0WU9yY3p6Y1EyUmwxVlFOUFMzeVJyZ2ZQMzdjUGNJL1A4ZFYzU3Nqdkltd3Q3MkwrYXk4aVpvT0w3QzNjNEJpN2lmS2pVZFR6R1p6MkcvOXA1L2V3OHp0V1crQXZwTnIwQzhLNUozTWhSVktvU2dJWjg2czRzS0ZScDJkRjBlVE41dnRYNnNsTkc3OTdEcU9SeFA4Nlk4Lzk5b3ZBM3B3b0RjQWFUWGxYaWZIZi90ZmZrOGVtR0k2QVN0TGkrQ21jVzd5enl3SVFnS3ZCV25mR1REcHc2eFpOMlo3RmFPemZsWWpaNERyYVlON3B0RmJPU3dqUG1UZ2FEZ0pCZkxiZVF1aUlPU3NlOGVJUElOZXJ2REcrZDZKRDUzNTlORVV3NG5iejQ2QnF3RkJTTEEza3NVQm44VVh3QjhCLzlaL0xqM0xWNEo2RXRqQjZNMkRIWE5QZ2JzRDJ5YmF1K3Q0aEdsd21pY0FlQUhlRktmamFRVTg3ZjFIdi96S1YxN0sxYlRORkFrUCtoMU4yQ1FJVTh4UDRHSkNWYkI4cWgySEdQbEpFcVFubEpPNW84T2hmNzhDTHFFVmFIMXp2U1gzaGk0cGREbzNSVkZnZDJ2WGpORzdqdzhBc0w5ekdEMlM5dWpRV3kzMkRzZjQvTzYybTJ6bmdMNmJJZS9tSUlLYmpGY0FnRktZend1ODlkYkxUWEowdlFsUkUvY3NOUG5MQVBxMVZNYXRuZDNBYUR6QlZ3LzI4TkZuRDZ1Qlh0OXFvRGJBOXNyVlRmejkzMy9OOGNzeWhUeFRXRjFaOE9Qd0RQb3NEeHRmbkJ3SEVwUHZmTHJrZ1pYTmNKZW53dm5UNThRS2dVZ0h3T081QjNvK0hHREgxRDJBTStFcG1CM1BsL0l4V1dENThJMXV6RXZ0T3kvQXErZDc2SFpPaHZCZjdjeXdjNnhmZEMyYU5KcExzQzlyOTBZaUQ2eE0vUmJBNzNpVk93R3BxNlRSQnlRdW5UcGd0NERJd04yVHBNRzl1ZlllZ0RBRkFGOENaajhNY0hLQUQzOTVVODE1NnZ2aGNJemJYejlFNkVRRFQ2RmZrcmlLS2s1VHdiczVjRW1MVEIyUGVna2JNSEgrMWR5ZU4xTzlENWJoOXVsNGVJeGhPRFlmWlVWWVdsblNoNDlWcGRWQTJHYjVxWTg1bjgyeHU3V0hvdkQrQjN1SG1Jemp1NmhPSmxOTXAzckRqOWw4amkvdjdlRmdPQmFUN1FCdFpTMEt1ZlV0OGd5ejJSem56cTFqWTJPbFR0RHJKODVpNEo0RnlGOXZRN3k4c1lhNTJiemdYLy9sSnpnYVRvUUozSm5XRGVCcWtGSU82QUhnai82VE4zSHQ0cG83NEdWeDBFZTNtL3M0Z05mZ25kYkx3Sm9BTWQ1dC9tbXJnYmwzZ0N3dEM2NURZdklqZVNndmc2TlhMc3liendOTjM4bktnQnZRdStrcEdVZVJqK2ZveVhjMGdDQmNrZnQ0cjIxMnNkdy8yU3Z4OEhDT2UvdjY1ZWZqL3NvZ1dCbnM0NEFmQlgxSTRBK1h3Z202eEJVa1hPSVhKRnZ1R0FUQXprM25hWEJuSU1uamNPM2QwbkxRZFFEUDBtQ1drRW9Bcnd1UEFuekExOG9iOGpDL0gzL3lOUW9xWXJpYnVDdTdKSkJHc1RJRzBWVWVFZTRuUllVVVlpWDRWV0o3UTlvbmNRMUs2aFI0eWtBaTRNNVg5ekFlamVSN0hZbXZsTUphaTNYelZMcHBKVjBqTjV2T3NMK3pEMER2NGpjNmpxMnA5OS9HMFpIVzVxZXpPWWdJbjN5OTVZNlpMZGlzK2prRCtQbWNvTnhwZGdWZWYvMmxPckZXelBIc1QreWVPNUR2TC9tTjhZN0hNL3lyUC8rVkIwR25BWE5nWlZxNHVlL2tHZjY3UC9vdU9ubU9UR2t0bm12LzNCeHV4K2E1Q1Y5WXlsbW53SU82WDk4dVFOZFpGenc0MnpEOTY1Zk1aZENtYzVjKzUyUC9oN0xZam9nalpNL2tHYmtPQXZFOG1FTjFiRmZDYmxCdmFEWVhNMXhjUGRtV3RmdWpBcmUzWmhwQWxBZERSWUJaRmVqTnpEV0Fud1Q5U09PZjZnQ2taOU5IV1RuUEdLalhBenZUcE1INHVMZzhYa1I3RDdSOEc4clRjcFlNSytmVEFIZ2Y0aFcyQ0kvNW5QRExUNzVwaitESjhCU010K2ZkSEdCUFI0dHYxcDFwd0tnbXZETDlOcjBLRmhZTlR2azNjTVc4d0RkZjNUVW03Z0RpQTc2cnE2dkk4L0txblhqYXpTUks1YWVwbTR3bjJObmF4ZkR3dURiaWREckhaRExEYktiTi9Mc0h4OWc5UEdaQTc0K2QxVnZlYWovS2NnUDRjMXk4dU9IMnRLOXdONXJuSU8yZUJjaGZiRVBjcytlNW00TCs1T3R0L1BUWDk2TkFEL3ZMZ1Q1VHlKWEM5VXZyK01PLzh6b3lwYkN5c2dpK0pFMkNyd1ZLdVZZZVJLNHo0RHNGRW1qNW1lMThPUnFmYmM4N0N6WU5IeWFYMVZuelBrQlNSa0lBMEJEeElIaXlMa1BKZEU4K29qMmhUZ0VMblF3M3o3YmFxTUc1MFpUd3ljTXB5SFFpUUZvaXBTellFSHRtRFpNRCt4amdSMEEvQVA1U0I2RGhGZVBocFNpRHVnUjJueWZiY0VuWlBaOG91Sk9uaFV2WHk4WFQ5blFTbEo4YXdBczYveXp1Q2ZqaXEvczREalFkQVhZVStwVmRFaHlqajRTSjQxNEFBQ0FBU1VSQlZGUUtML0dtQ3A1MXd0UzZFL0NyREMvbEtnaXRMcE4yZ3B3aUZjbndHUFYwT3NjM1g5MTFrOVVvSkxMUEdWcHA4eVZSYWoxcUE2SjBzMGw1REQ3bGpvNUdtTEpKZVY4LzJCWEw1L2lCTlhZWFBLdkoyL0NyVjgvVkpYT2hzVUFWN2xtQS9OazJ4RXIwOFBRci95ZC85U24yajhaU2k3ZjB5cDdxWm9BZWdNbzFIUDZEMzM4Tk55NnZZOUdlNG1ialEycnVmTTI5aFVpbEZESnppSXN0cEF3UUFPdXNBOWJzYnYyYzJWMTVHUjJ0VDlPaVA3Y0tlSXVCbklobm4wWGV5YklnTDUvdG5DamViWEZKNlhDV2owd0J0ODdySTIzYnV0bWM4S3NIRTdOY3hOYVhCbnYrZ1NzTGNwckVBeWE3Q1RWOGs1VVM4SFB3RngyQWhuOGlydFB5ZzQ0RG5LZ01vQWxKcmQzSkZIWU15dUR1d1piUlcycmVvU0FINlF6RVRnZmdyV2Nkd0pQdzFNOGZCOHZtV2dOOENqUGJZRnVhZXlNZlNnUldkeDdxK0xhalBSbFJReGFwREQ0Sno0YUI0L0VFZDcrK0o5OGhjOGZKVjlkWGtXVVIrQ24zNlU3Uk5YekpHblRpWnJNNXh1TXA1bk5OdkxOL2pNTmpPVGJ2ZHNFendBOWx6Zlg2cU5yTGwydWhzUlYycHR5ekFQbkc0d3FkVG83cHZBZ2FBbjErN3gvLysxOUtvR1lhdlZMS0FYMXV3VExMa0djWi9wcy8vQzRBQWppSUlnQnBNSkJVbmo4M3Uzdk4ydStFWjdWMlp5SVBudzB3YXorNTBZM1Q3dDB5UE1PZlRCcFFiRk1kRC9UV1djdUcyNVFIa281cjhFckJXdEZMNGRjM2UxanN0WDhOaVBSTSt2R3NFTitFUWtJYnNTMjVZdG9xQjN4WTBPZm1kUS9MWWRxbmNjVkV0TUFjTThXSHdCNXE3VWx3dDNsalhRMFE4MHRvNzF6ajU3Sm9PZ3JvbXdPOHRKNEVBTys3RTdJakFHQnJleDhQSHUyS01rdmZSUndsSCtvanBEb1FGVURjT0prMmtXTUNORW1QcWdJdFNUbjhDZGdsSTBhajFaVmpQVnZuaHNOalBMajdFRlhscDdJTUsydTFrOC9LekpzRm5Ib1BJVlkzSUdBMkw5ekhjK2Zobmh1REx3cjlYUmRNdTZkTVlUNmZZemJUNC9MTHl3T3NyRlNlMi9iQ2pNazM3bzEwT2prbVU3TkxtdmkrQ2Jmdjd1SS9mSHpYVGE2VFpucjluQ3NGbFFPWnlwQXBQYlAreXBrVi9QNDdsd0l6dVFWOGNtREp0WEZ2QXZjSXl6c0lIS2oxSXdOcVlVb1BKdUNGTkRwejB1UmU2Z1JZT2J5NVBqVkdIdzVET0JrcEhuNTJPY2ZabFpPTnczK3hOY1grYU80eTRaYmsrV0p4eUVqS3owWHc5V3BOOEI3d1U2QmZCdjZZWHQ3bTRrTUFhVTJkaWRvWTJLUGd6cTBVTmg3akkyZzVuWDBLd0x2U0JJOEdBRTh4dWlBdG9lbnJVTDc1VFIzV2xad0FrZUF1aXBOdFcra21BUGw4YVBHTmMxWkoySXpMcVZBRlBlSzZyZ29BSE93ZDRQSERMZlkrbFNsWE45WmNHeHZuZVpwNWJPcmFjTE83Mm1tM3ZUZkVaRG96UytyMFpMdGk3b0dlb1BUSmRFS2JyOFR4Rndia0d3dmFHL1F3WVdzVFE2RC8wNTk4aHUzOVl3LzA4RUNmS1VCbEJnZ3pyM0dyWE9GdnZYTVpaMWY2QXF4ZGZOamxjZnp3RjZzaHk1UGdPRUI3WGw2VEZ2dnIyL1FkalFWMlpjNllOekxZK0Z4akR6b1JWalliN3VSRTBNRncvbXpTSHNYREYzb1pYajdUZUdXamNQZjNaM2g4cE91SldEOUNJenhEU1pzblVnN1VGT01UbXE5clFaL0ZvZkNoeFNVZUEvNHVYUXZxRmNEdUpJOEFleE53TDJ2djNNTGhDNkFFM2paT0NQQVZIUUF2YThBckJ2RGdhZXFuMFdpS3oyN2ZLNzhNTEZKVjg1Z0V1eVp0YW9wL0JSRFhDdFEwMFVxdnVwNEM5NjhRSmhIVWhoMmxiK3BkeS9TYnV0MnRYZXp0N01HOWgrSU95UE1jU3l2THJSS3NxNExHekU1U1RoSEhsOTRSQVk5M2g1alBDZVJtMnZzVDZRclRwdWpKZC9vNmYzN2RLNU5sOTl0bnJ1K3ZyTGpHeHpyK09KM044Yy8vM1M4QWVBM2UvV1pzeGowVU1nYjBVTUFQWHQzQW9KdVpjV2t3aTRCT1FJR0JNQUJocXJkaHBqTmhRZDF0Y01OcDdMTUZhNnZwT3NBUE51UkJPQ0ZRTHEzekhZOXdqQjZPenEvL3QzeHRuandmN3ZJTWVQWDg0RVFiM2h5T0MzeXpNM1hmQm1maGw4NFp6WjQxemw0S2NvQm04MUVHejdLbTdZSFRYNlVPUU1OTDhCQlhhQ09JeVFZaFZ3anVOb0ZHNEE0THRnbnRQUUh3dGhQZ093UkFUUE1XUEtrRndJY2RCUUorOWRrZHpPMkVLbFlTalFCZUJMSjh4R2pEMEFxQVR6d2tmVkx0ZW94M3RYejFmdTFwNjRScUhGZ1pyWTJzZGJ6cTRoS0F4dzhlcysxampiLzdDTFUyWDhuK3lUQTR4dkhKeUVnU1dVM2Vmak5iZTBNL0FZLzhrcnFpS0VDS1FGU1l5WGY2Tjg5enJLMHRSUklDY0VxYS9NbHN0ZTFjNDk1SWQxR1BUeENSNk4wUWVXRDcrc0VlL3VMRHIvRDc3MTZEMVlBMWJoTXlZelF1b1AyS2pHRFhjQzMxYy96T3JVMzg1YSszeWxveG4zZ25BQmpnYXJEMW04MW4rT0REenpDYnpzVkVPZ1hnKysrOWlvVkJ6MFJqa3dTVkI3cXlWWUNESllIRE1yY0NFSngxbkkydCszRExSOU9SQzNYWXEzUlpYai9UUS84RUc5N01Dc0puRDhjb3lFbGlKRGJwOGpWelJqNnY2U3VBbERiZEc2SEUrQzkwK1ZEa0krUHpFYXJiOWxTZW1uM2dzYlIxN0RqU3lPK2RTckp4aVdVbndYdHdIanlkRUhCOWxMUjVQa2tqT2dEdEFaNkk4SXRQdmc2S0lIWVhjVlVWRm4xczNxcFhBdFlUb1ZtRXFMcVhjZkwwVGdIRVVsMmNobTk5VGJBTXI2WXVmeWNFdmJuTXh0bU5hTWVnMit0aVlXbFJiS2JUU0s2cVBKNWF4OEN5U3pPY3orWDU4S1B4Qk1QakNRYjlqbFBndUxtVFNHRStud2tMN3ZyNk1uWjNEMlBzZi9zMCtjNkNOeDlYYWZULzkzLzhBbzkyanNTWU5iK3N0cTAzdy9FYStvVzFQdDUrYWRXWnd6TlgwSEpkdTlYbk9kZ3JoNTRLSC8veUt4d2RIYnZkanlhVHFiNmZ6ZER2ZFF3SFFBWFdBSG5pWEtocEsvYkhOWHQrWUExOFJ5UVY3aXdSTUYwZUV2SmZXTzFpWTZsOTM0NEFmUDVvZ29tWlRjcVByblhGWnJmSGhkY3llVmVBekxhNklaaGFEQS9IM1YxTXFyKzhsTEdyRFErNDlJVzJ6dG92Ym80SGw1YnpneThIQ3VKYTBPV2FlSjMyWGdmd1BwMG5CM2pMd0Q1K2RlY3hEZytQeTdEZW9ER05rVlNDY0NSeURGOGJkakVjVFdNTXBqVEhaRjVxL2F0Qk42YkZWL0p0STJDZFM2UjFtamg1c0g5Z2VFWlFuc3h5dXBPOFM4azRUYVVQNmRybjJwbnI3UThCMi90SGZyZTd1Wm1JWjViT2tkTGo4bnJ5blI2WFgxMU5UcjU3L3Nma2YvakRmN1NHRnRhQ3paVUZ1YXdpQXZSSzZZTDk0My8vS3hDUkg0OTNJTy9INkFIbHpQbld2WHB4R1ZjMkYyQjN1YlBncDMvdGpIa1MyalhuL2RYWEQ3QzllNEFzeTVCbG1yLzlYZWozL0xBQm1La2Q4V2U1anAwY2dPczBBeUJuZnJENTVUdmVDVDUyM045MElzdzQrZElndzlXTms2Mkh2N2M3eGQ3eDNLWEY0TWMxRkxZTXdjUE1mN3UzdnRzY3g4b2FnS0JnU3lRdmxEc0FMa3BEQVBkSnhJWUVFcURPK0lPa0ZBTGNXWXcwdU1kTTgyV3dsYlBuamJ5K3VEV3ZVT3VPMFRDZW5yWWE0QWxTOXBXbEFicmQ0RE51Z1BOUHhVd2ZFeUwwS1dObUUyWnBvanAwT1NraW5paGVzMGh0T2k5UElrS1Qvc1pzT3NQSW5GVEhUZlgyZjIvUXg0QWRRM3VhSFl3b3gxUHJKT20xOEtGQ3VuczRFdnZaei9tNmVhVm4yUE54K2NYRkFmSThDc1V2aENiZnFpZXl2TFNBaStjMzNYUDR3Zkl4Ni92YkIvam4vKzRYMmkrelFNOW0yMmNTNkIyZ0Evak85VFdzTEhiWUdMYnRIRmdRVmY3WGFjVEE3dDRoYm4vOUFMbGk0RzcyeHM4eVlIR3g1OHoyZHZJZEJFK3VhMHV0M1duZUF1aTVibTlsdFlBZW5wakhMUVRrVU5XbTJNbUJtMmNIb3NQVDFPMlBDdHpiblphTTRkN3dvY2ZneVpxbG5NUUF5SVR4Q1hsZ0pueTd0ZzlleS9mYWNQRGRlZEp5QjZEbHhYbVZrdUNkZ3dpd1c4S3kxcDRZY3cvQjNjWmg0RjRDWTBqd0ZuUUN2QzJOWjJKNW54VGd4WDhpcks4djR6Ly9nMjhqeXhRbmFnM3cxWThOVzlnNnNLb0Q1QnJTTnUxL3JjUWxRSXVSSkRvcTFlekt0TzE2TXMxb1F5V3JDYThFMGVIZVlVZ3A3dVhZZk4wTFZsR21wOXhES0ZzZlpBSkZVU0Fnd0h4ZVlIZzhZYnZkbVFsNFZBQktPWEMzdTk4VlJZSFYxZWk0L1BPdnlhTmxUNlMvdUlEejV6ZlE2WEN0d1g5NWZPeGJLWVYvK204K3h1Mjd1LzRRR1R0aHpkSmtYc3NIUEJEbWVZYmZ1YldKYmljRGlKbnBYU2ZDQTZkZTQ2NHduVXp4eTE5L0pUVDNUQ21UaGtLZVpWZ2M5Q1FRQjc4K2pPU3NmV1ZQczJPbWRxN0Jnd0UvNnlCdzA0QVA5Ny84eEx2clp3Zm9uV0FjZmpvbmZQRm9wRFZ3bG9iZ1pORkh3U0VqY1dJTHpBeFpQZUFwLzAxYlU3OUhjZ21tQWZoSE1MclNoZkdpR3I4d3dVdHdiZzdzSE56Qjhsb043clhhdTZWejl4Qmw2WjZJcDlrZTRKMVZnanp2aXhjMjhmdS8reFo4RjdPbW9DTVBsU0FWOGF3RzRTYmdLRHRsbFM0bVhFcUk2a1NmREdlYUYyd3JucWx5anZrL0RSRU9EdzVMR3Erclp3SUdpd04wKzJrclkxMDFQTGs3QVVNeUUrOGk3K3ZoY09KTTlINGYrd0xJNUlZNDgzbUIyV3lPNWVXRldBcmRILzd3SDYyZUlEUENQVzJRYjNXdTRNQ1lMUzVkOUIwWVczQ1o0aUNvQUZLWUZRVis5TC85QkxNNU95M09naVlEZXE5eGVzQmNHdVQ0em8xMWYrQ01oVTl4cWh5TTZadndpMTkvaGRtODBCcC81clg0REFib000WCtvTy9sWXhxOU9JNVdNUk83QTJnU3N1bHRjZ01OSHI1NTlUS0hIUUQ3cTV3TUFPSENXaGRyQytXOW91c2NFZkRab3pGbWhmZFFTcjdNN294NnE1VDcyTzZIOXdGY2tFRXZhNzJRWm1ZT3h1Vy9FUEhyVFBXaFZtNnYrQjlyN3dOUVR3Rzd6QktqNUR5YWdMdU40L0xKYUlOT2dOZ2gwTkl4L3JCcHdzdDVVb0MzWVRkZnZvVHZ2bnVyRmdSaVFKekMwSkF1Q2ZBcCtrYjhtM0JJUjI4TmhFMEVTZ1E5bVF5VThIODZybzJzOC9rY3c4TWg3QXNTazNSMWZmVVVaSy9oUUtXYkU3bGVyNE5lcnlNMWVmZkJFSWFqaWRnWXh4NVNRd3JDVkcrM3VWMVlTSFp3bnRoay83UkJ2dFZDN0Y2L0J5TGczTmwxdVhtL0FEUU5rck9pUUtZVTdqemN4Ly82ci8vR1RiaHphOVV6Q2ZUeitSekZ2QUFwRHpibjEvcDQ3ZktLMjJ2ZW1mdE5PamJkTDc2Nmo4T2pZMlFaU3BxOE5kY3JwYkE0NkZseG1jbmV5eTkrM2VVbitZSEo1cGJXTVUzZG44QkhldDVBSkMxTlIwNkxYeGwwY0dudFpPUHdkM1luT0JyUGZUVW9qY2I4U0YwMjE0N2RlTUMzNWUyVWZPWUhoRzJoQlgwUzRPd0Iyc2VwNmdSVS8wbVFMWUY1RGFoVEtBTlpjSTFvL1dnSjdwWUhpKzlvM1Qwc1Y1Rk95V29RQXJ6b0FQaTBtd0s4SmYvV1c5ZHg4M3JpT0FvQjhNSTdSVjRSMm94M1ZZUlVlMTdpa3dMa09HRkZlTnY4MS9NVGdXMVF0YzZGV25YSTZoUk45ZGIvY1A5UWtJVDNpOHRMM29xYlRMQnRacHUvWDAzRE81MGNxeXNhMnV6UnNtRmRqaVl6RGVKbVcxdS9qQzRUR3J6VjZrdHpYcnlyM0JLdmlYdXVRRDR6a3crVUFpNWZPdWZ1dzRsMUdqRDBNcnNzVS9qVEgzK08vK2VuWHdYQXlUUjZFNjhvQ0xQcERNVzhjQ0J6NitJU3pxL3BTUjljY3dicGRCODgyc0c5KzFzQzFEbTQ2MmM5Q1cvUTc4WUJubXZlVmxOMzRPZkgxb1VHejhmMm5hWnVUcEpqbGdMd2NEZnVyLzkzYzRYclovMisvVzNjM25DT2gvdDJmYXNkYzRkUHpFQ0tsVUY3MlJJa053YXZlTnRrQnQwVkJ6TWJaRmt3OVBSN3dqT1FqZ0h5azF3bDZJK0RPcnhZRHBDcnRQWW5CZmNRakYxbmdnTzhmUktkQUZsTzFnK2NKeXRyNHZubDRSR0FKeERtc3dKYjJ3ZUl1UmdzVkFOdEhPUmkyRW9oVVJndGhaZFAyTWEzQWUxS2dWb3hxSGVONVQzTnZrR0RDUEh5MHI3RG82RTd2TWJWdFh6WnNMTGV3RHFkeXRNcGxLdGtGeklrNUhtR3RkVUZoeFh6SXA0b1VZSGo4UlFGRVdaczhsMUI1RXoxZXZaOTRaYmhKWUQrWkR1V01mZGNnYnc5ZnBBSTJOeFl3ZUxDd0FHYW5ZbHVRUnRnbXJjQy91ZC8rUUZ1MzkzMUhZSEFYRy8zdGxkS1lWN29YcFExdFh6cjVWV3NERHB3b0VYQTF2WWVQdmpaWi9qczh6dXdwOXRaRTczdFhQaE9oTjR6ZjJIUTh4UC9qSUFXZGpXdzgrVnRFZE85MWNJRHpkOWVtazYvVktJajRjTEpsWk9DQnZoTzNoN2h4elBDbDF0ang5VnhVQnFnYmMvQ0FUcjVaWHhXeDFldW9mUEFwQ2lReGEybnM2QWtNMlMxZjNrUkE4cVRYWElTWGprTjZ3Z3lYU2RyRTJCdkErN0dNd1IzRHNZSTA0U1Z5V05LYlB5OUN1QWxnTFB3Qk1DRGdKLysvSFBzN1I4aGRGTHhTeUZ1OUZGNFZyZlR6UUMraWtzY0JDUDBkVHliUkttUUpLYkZWNEp4TFZLM1FiZ2EyZ1phUEZXR3hpTVRFWTRPanR5N0ZTTmRXbGtxSFVQYlBHZE5LY3ZnM2NSbG1jTGE2b0taZ0dyaTJmZUh2SmY5blV4bmV0bGNRU2lLdVo2SkQ3aTk2K1VzKzNucTZObVRtV0c1M0UvS29NYTFFakRQTTFIY0w3MTBMdERLdldaTDhPYnJUQ25NNWdWKzlFOStqS1BoaEduOUlkRDdqZ0VST1pOSnJvQnYzMWhESjFONDhIZ0hIL3pzRS96cTAyOXdmRHh5UU81bTFLZTArU3pEb05kMUlLdEJLZ1JzRWhxOThaWmo2WkRyODcxcDMzWUkyQTUzb1JidnlvcHdicldMcGY3Snh1Ry9lRHpDck5Cb1lvd2FPZzJDV1FKbkFjOTNVRGdJaW5FSG0wY3kycjNseHhDUUxIT0pXQjVrSmJtUTlTUlhLYy8yY2pUazhpUE0vQ3lMTVdBWFFBM1BweGJjWGJiTDRGNm52WHRRSmhmSDB6QjVUZ0hnSDIvdDQrZS8vTEpjZnFKTWcrWS8yWDVTOURaRzFnYStCSHcyaXBnbWFnZmEvS1lpNFhhWmVaSkk2YkpMK0o4d2xjcklZV2ZtOE9Bd0lPZjFSWUJTV0ZsUEhVUGJWa0txZkd6RFZpbGdkWFV4c3RTTld5UmxLeldaYW8xOTVzNlpuN3QxODN6aW5jYWhJcVhKUC9jZzM5SmM3MEdKQ0ZoZFhzTG14cW9IT0FWdnJpWTJHYytBNzg3K0NQL2pQL3NKN0ZJdWNVSmRwZ1FmcTNFVEVhYlRPWG81Y0dsRjRmUFA3MkU4bVRyZzl0bzd4Skk1bGJGbnBiQXc2UHE5ODVtY1RxTm5KbmEzOVM3cnRHZzZ1WFZ0YUg1M29DNU0rSFo3WGFkRFk5RE5jSEV0Mml1c2RkL3NqSEU4S2VJZEVXWlowQ2w2eTRkMXpxSkFQajd2SkxoZkhsRWdvODZKZzhWZ1hWMlZCdTR1eTdJUzdCa0F4d0FkSHRBbGpxZUJQUVIzZ0dXdkN0eHRISGZQZ0pqSlFZWU9wWGdSODN5TU4rZmJFdURuUllFLy8vRkhJbDlXVnZZazd5S05KeUVSRVBPbEVzY3lmYW9kVDZhZDRsOURXQmtlZDJsTUtmT3J4Si9hUEZhVmFsT3Bta2Q3QXF6RStIamt6bTEzNzA0UWNYbDFCVXVyeTNHZWpldnN5UndGR1Y1ZFhVQzNrM3NQbG1UTXJBL29iZGdMTVNaUEtFQ0JxZDZhN2d0MHUxR2w3TGNONU8xUk1WNWJmK25LT1hRNnVRTXdkM0ljU0lPcU1hVnJFenJ3eVpmYitLZi8xMGQrVDN0RHpjM29mbXpmVDlhamduRGo4anIrNEwxcnh0OXI3SnAzSnRmR1cxTzkxZUxOZUx6WDFMMUduNEVjR0N1bTBadGcxeEhoWjg3ck1Jb0NyTHRNZ092NGdKQXB3a3ViQXpjTTBNYnRITTJ3ZFRqemdxVStIQ2E3VmVoTHFmSDRSSUtBVEppeVlRd21TVm1BVVFJOVE0MmVFbitldUlxS0pDOHFpU0UwZGVJOEk3TG9iTVMxOWtiZ2J1TUljRytndmJONExoWkxINHkzYnh6YkF6d0EvUFREejdFYm1PbFBCZUFKTWQvQW94bkFWN1gwY2RKMFR5RFd1YWdGTjhiejlJRG95VUc1aWIvUEE4WDlXeVZTSFh4MFVKN1RRZUtlc0w2NWlmNWlkRm5aeVdSSjB0WEhXMTRlb05mclFMNGMvdHVRTzBWNk56TmFQSjk4UjRTb3FYNCtMMUp0OW04YnlPZTY4WGZnQlhTN09hNWNPc2ZBVHdNYUFlNDRXYTFsRy9ET2dELzc2eS93NDQrK0VWbzd3TURkV1FEWU1JQUIvTi83MWxXOGRtMVRISHdqZHJhREg1UFA3RHI4VEkvSGw4YmliU2ZEalY4emt6dzhVUE9qWnExL0ptUU1UUGMyTDlDZENUQy84NnQ5TEp6Z2ZQalJ0TURYTzJPaHFYT0xBWmkvd095Z002QzFlM0xmQUJtNUxOQ0IyTXg4MWpzZ2FLVmRYeWFtMGZaSlNXMDFCT1FTT0xlbGkzVUJ1S1llQVhWZERrMkFuYndtYnR1Rk1GNEszRzI2WERNMzRON0dQQjhGY0dlOVNJU3pSdXp4OWo0K0NzejBUeFhnUzF5YkJMWTEwNTlXdW0zVExKZEJKY3Q0a1pWdVlqeWVVTlRtRVpJZGgzakE0Y0ZSbVlLOWl3QkFDdGc4ZnhhOVhzL1J0bk9wZ3FzbUM5M2lZcTlpZVpzcCt5Sm9IZXkzWEJCbTg3bmY3WTRmV21OTTlOeGtuM0MvWFNDdnh6dmtXMCtrY1BiTUtwYVdGdGk0TkxrdFhTMGdnbzJaSzZYd2ovL2taL2ptNFo0dzJkdnhlSy9OVy9EM0hZZ3NVL2g3UDN3VjU5WVh2Ulp2T2c4TzNFdmo4a0MvM3hNbWRXRmFOLzUyVmozZkNNZHI0Z2hra1J2aEtJK0hybU9nM0o4T1creGxPTGZTM2t4ZkVPSDIxaGpFM2pQUnArUVByaE5tZzBpRUsyWnFWMkN6OGt2cXZ3RVo4bVhrOXNWUkxsaW5aNjVtR25xelA0bjBLSU0veEdlcmM4VEFPUTdzWUxJeG5pNklLc3p5c1RnZWlEMFloeDJEb0JOZzVlUnB3TXJNNkVzODR3QS9uMnN6ZmNGUXZSTGdJeTdxWHdYd1ZNMjFFdENTSFl5UWYwUENpalRML21uQWJZMVJKNDkwY240TnRQalQ2RGhNcDFPTVIrUDZpQXJZdkhBV09WdFdkM3BsbTNiMjNWaGM3R05wY1JBa1VLN2pkUEtFbWQyNzNxNlRKMkxBN2szMTgvbThOQlJtM0cvUDdIcXRoV2QrUEJzUUFQblNsWE5DK3lZaXIxWGJjWGNHeXZNNTRYLzY0LzhYUjZPSjV3K3IyY1B4eVJoUHV3MXV2NXZqai83VE43RytQSEFUNjNLVmdVKzJVMkRMNTVSZVBnY211eHdPTUxxN1l2bGlvTTd6NmNieURhb3JIcWJnZDhZemNsdWFUQUZYTmsrMlhPNmI3UWttMDhLWkVVVFp3NENzazlkL2FjcjkxeURoa3c2RVVDeWNnNTVOaThDQTAveXlIZzBCWXMvN1VGdXYwdGlqQUI0QjhqcEFqNDJ4VzQxZGREcDRXcGJuU2NIZEZyVXRId2J3TG5hVmVkNm13UUExRHZEbERvUDErNXVQdnNEdW5qZlQxd0o4MEU1RlliS3FVVzRDOEJWZ1hCc1NaMURKcWFvRFVaTjhRRll1bkVxV3liS1VQdkZPVEp4cEcrQ3VkaVIrbWpLMTNuNld2U3hmM3NFRWFldnU1dmx6eUxLcVNjUk5jeERTeGVQbGVZYjE5V1VzTFEzS3BQN0RjUjc4bStFOEMxalR2TlhpdFNadjE4ZnpKWFJGWkE5ODQzNTdOSGtOV21hbHVGMUd4cFpVTFM0TThQSkxGOURwZE14NHZRWUNaNlkzSU0wMTl0MkRFZjZYZi9WVFdCTXgzM2pHYWRMTUR4Ym9sY0x5UWc5LytIZmV3TktnSjNhNHMrQ2F1KzFzOWJoOHY5Znh2RU9nakdyMDNCTEJPd0lNWEhuWjJPNkQzRmJPMFZ4WTY2SGZhVitkMjBjejdCM1BIQzhuTjhOWmkrTU8xTm1tTjlwSEMyMDFRa1hrd0Jua1JTWW5zRFRwZzJ3aE1XZk55UmE0clBrNy9pRTB3Zmh5bkFpUVJ3SGRpMU0yeGNQaGZCellUeG5jWTlxN1M0OEpiWnQvRHZET0t1RFNqQUE4eSsvV3pqNCsvTVZ0VVNXeXhJTzdsZ0JmRFU3TkFiNFdoR044YWoxckVUYndTZ0J1QzdrYVJ6cHRmZzJqdGNIemxLbmV1cU9EUTQyQ2dIeDNBMzRFb05QTnNYSCtiTG1OU0xyNnVrdjVEeFo2Mk5oY01aUGdVbEpKYjcrY0YvNGxOWThGRmRKY0R3aE4zcHZ1NTZFaHhicm5IdVFiQzVobENsbkhUN3dENEpWRVl3TGVXRi9HbTY5ZHc3bXpHMndpblRKQUR6TUJ6NC9US3dWODlzMDIvdVZmL05wbytZQmRodWExWnZnd3dBR3ZVc0Q2eWdELzRBOWVRNy9iY1IySGNOYTluWVRYNzNmRm1McmVqeDVPdS9kQWJ2MjhkZzUybjBHR2FkTStNOTBISFFtbGdPVitqczNsOW1iNnliekEvYjFKUEZBRnQzeDlQbFBCN1hHMkNOZkFKOTVZVjU5a2VaSTVnbGJPMUxkbWZKMm90QkZVZ1hPYkt4UXJEdWdJUUoyWWYzTmc5MHZoR29DN3pXTU0zQkhYM24ybndOUElEZ0dqY1h6aUFBL1NzK24vNHNjZmUvL1RBUGhvZU15aktTQlZBM3k4RTVFbWpNbGNLMG04NXhIaFhTNmdTdXlweGFsRXB5TEZOK0h2eXkvV1pVbTVtbEtwS3pRQ2lubUI0K0V3Z0ZGSzNBUGRYZy9yWjgrRU5zSVQ5MTFDbCtVWjF0YVhzTHhpVHloRnBDTGk5ekhGdzhwZnpJMEdQemZIemxKOENaMjlJcFB2Zm50QTNzNWdkNW92RUwzUDh3eVhMNTNCVzIvY3dPYkdxdGE4U1I0WXc4Zk9WYWJ3NXg5OGlaLysraDRjdUROek56ZlQyejBPK0lFMjU5WVg4ZmQrK0FxNm5idzhxOTVvMkZtZW9kZGxwOXJCQzExbE9aQWF2VFMvZXpBTkp1Q0pqb1RlaE9mU1J2dGhHd0p3WjN2aXprTjJIUkI0L2tCb2d2YzlWaFY4Ym43Vmc2YmdsZ2dPWkN3R1FIRERBWTZ6UlhxMlVZNExzSFFNaEFVNE43a29mdkhBMGw4QzFBWElodHFJeTY3THZlVER5cVFFN2d4WVMrRE8wMitndlpmTjh5Rk4yR25RZmg5Ky9BVjJ6TWxoYlFFK1Jzc2ZLOEd0S3F4Rmd4NER2eW9HbGF3amdaV0FXZkp2aTBRVjlDY0N0Uk1pWVFPd2pudkhBMExmdzcwRGlKY1Y3RjJqY3BYMUZ3ZFFlV2kyYjVxM2tNNC85d2M5Ykc2dW90ZnJWcE1hZ2NJdndIOGZaVmtLTjd2ZUxxZVRTK2k4NlY0RFB3Q0hYOGFkYkMwMGMwOGI1S2YxSk5wbG1WN0dwaHMrYi82VkRhZXlxaHdXRm52NDlqdTM4TVliTDJNdzZBWmc2UzhMeVAvc3p6N0d2Y2NIY0dET3RIZHVwbmV6MmpNN0xxNXc2Y3d5L3JQdjMwQ2VaYkF6K1AzeU9ZVityeHZzZENjMWJhNjlselY2RXVBZDI4SVhsay9rdXJEZVEvY0V1OXB0SDA0eG5Qano0ZTBONStSN2xlVEtTUU80UlI5R3pTcEtkd2RJUENzTytWU2VnYytDeXNnY2dDNS9UcUoyQlpvbi80TDBZeDBKMXhHb0FQWlFhdyt0ZVU2elBpRzRnOUU2T1cyNThEYVRpTVdKMFhnQmZIOUsrMjN0bkJ6Z0tSWlFCZkFVNVN4OUlxaGRKVU1pbVFhZVZaSUUvalVkaHlvR2xiempSVmZ5aVlsZVg3NFJ2ZzIwK0ZTcE5JWFlXSVRSOFFpejZiU0doOC9yZURoQ01aK0hRZWtFcWdRa1FHVVpWdGVYc2JxMkJKV0ZrU2g0amp5YXlsS1F6L3cva1QrRnJpQzlMWFI0Q3AyOUJ6ekFzeXBwaktFcGw5d1YvNVRjdUNraEVVQkZZVFIzWW1CdFFNWENCRUdETEFBbzRQelpkWnc3czRhN2R4L2ozdjNIQURoUVdwTzNQdERtSC84ZlA4Ti8vMS85QUl2OUxqSVFDcVVjMk9pQmZuSUtxNEl5Wm1TQWxNTExsOWJ4dDc5OURYLzE4NisxYkJib2xSNlBuODFtcnNKbU05MXptODBLekF0Zm1RdURMbDY2Zk00aFBMZFVjSUMxK1EzOXBWTllHdVJZVzJoZmhlTnA0ZmFsTjRZUU1XNXVpOEtucEZ6ajcrNFZ6QjcwWG43NDRqTzVZQys4TWVmYnZvSHJJNWdQZy9mZ3JRQ2tQTWphdExuWm1mMDhrVXZ5NEJwdU9saHdpUUdQQ3dsbGRzQWI0d2VwWVFkK2tpV0p1Q250bmFjaDVoM1lPbUQwYjd4NkJWL2ZlVlRLWHlxUHBieVdQWjhad01mQkwwMFlTNysyQTlFWVMxSVFuWEluNkRTY2xOK1RSR3RZTGxYZUJLM05yNTNkaE9od3Nvcmg5VDg4RExkVFB2blgzeHYwc0xLNmlFejVGVjJpcmtvdlhocjBZOU9KTEZrQmdwcjcwemFMK2R4bzdON2liTGhnUGkvY00vbWxUb254MU9idXVRRDVMTk1GcmJVWkRhQkVFZ0RkTDFPVjlRU3ZESjFNNGVWckYzRHB3aWErL1BvZTl2YU9tQ25lVDhUYk94cmhuL3libitPLy92dnZhYTJkQ0dTQXZvQUJNQ0tkZnFIakUveFk4YXN2YldJNm5lR0RUKzZMNVhYSHgyTjg4dGtkWFVFcVhPT3V6RnA1QU5BejhIVUhoWFZjSEpCN1JCZFpkMkRvdzdNTXVIakMwK1h1N2s2Z3RXbWZrTnVnUnZaMUdPRHJDWkZpNHdlUDZFR3JxRngrM0lkak9rd2FwL1dOMTJRdGI4UEJBVG5acUpwV3VSa0FNc2tuZFJ6d21wRUp5bGJBN3J6cndaM0hTNEU3ajgvTExBVDRxazVBQ1BBZ3dzWHovNysveEFBQUlBQkpSRUZVbTFoZFdjVCt3YkEycjZVOGx6MS9vd0JmVmF1VjcxQXQvMmlPcXhuWFlYaHQ1eUdSSmpVcDR3amZWbHA4dlgrN29RbTlsLzNxeGpxUUtWR3ZZUzZMK1F5VDQxRXR2L2lqOTFkS1lYbDFFWU5CM3lSVVUrQ2lzU21iNmkzUFZDZkF6NDNSUUQrZDZhMXRsUUt5akZBVUdiSU1nRUdnTE11YzJkNjRKd2I1cDIydWJ3anlHcjJMK1Z5T1h5TUFQL0ttRWI5a3poRmhZZERGbTY5Zng1dXZYOE5DditkM3hHUFg3YnU3K04vLzR0ZHNmRnovaXFWcFJsUFhKTWJZYkFSNjYrWjV2SFB6dk5qOWpzKzh6OTE4QUloNUFuWTJ2dDhjaDQzQkM2c0ZYK0lIUnF2VmJadi9DNnQ5NUg3Y3ByRjdmRERGZURvWDVnSEZMbGJvNW9kRXVzNmZhZTY4cytDTjlSNk9iU2ZKK1ppUHdxNmp0eURFZThES3g5UVVybk1BdUhGek9xVUxURGE0SklMTFUvSGNDZk0rRHcxTjdMWU15QTlDeGN6eVlvYTd6V3ZKTkE5Ulpsb09nalBQTzNsODJmSTA0SGhiUHkrL3M1UUFlUDJWcTZKVW5pWEFwMXdWWlR3c0FUdngza0F6YVdvNkRsVXBWOGVxNndHMGRTZUtWQkd0cWtJYkpFZmwyNElLSEI0ZU12K2dIc3g3Y253NGxPVjVncXgxZTExc25GMzNBQjlsVm1vSjRubGd3aW4yN0dPWGVlanZyTkIwUkc3Wm5QNTBsVk5zZzQxeFhueVE1MloxTzk1aWk4ZnRCR2ZCUkNsZnVHNklsK0ExWXUyNXNiNkM5OTY5aFd0WHp5UFBNNmR4V3czN2cxL2R4Ny85ajE5NEVIVmdDd2ZtYnRJYnBObGZLZURicjE3RXJTdWJETkM5VnU4M3lmRXo4SE8ya1U0NFZpK09uVlYyTmozL2cwTlNPNnQ5ZFNISDhxRDk0VE9qYVlHdHd5a2NoQ3FlWCtjZDNDdDJvbHhnbW5MM0pEcGdZTjd1bDgzT1Q3WVZkbW1lc3hoUThGSEJmUkJQNnNvZzdzRzhET2h4VUJmQXpoRFhBYThyR3R1WlNJTTdMeE1PN3NUbHRUR0lBemM4dU52MEhGK1dEaytEZHdJWVBZTDBicjU4QVIyelg3ZDdCWjRSd01keHRHVWpUK24wSll2SVhUS2Y5WDRuQVVHS0NGdVdKVnJTbGZtc2xEblVZcXRvRy9pbnRQaEtYd0tPOWcvRmR4NnIreWN5MVN1RjVkVWxyRyt1eWdObVJKcmh1MVVHNlhpNkpOdEUwVjU1V3Jzc0hLU1BTTTl6TTlHY3pYc0NLTGJ6M1hNUDhyVUNXaTFlS1FXYXg4QkNPVk15NlVmcjYwQlo3Z1d2eC9PekxNT1ZTMmZ3N2p1M2NHWnoxZXhZWjlmVkEzLzVzNi94SHo2KzQwRTFCdlRXVDNtd3RiVGZmK3N5cnB4ZmpaOHRyL3dhZW4yZnVYc3dMWjJ2bFhlV2VHVmZDRGtoejNZQ3VwbkN1WlgyWm5vaTRQN3VXQmVrN1REb0VQR1NTZ3NLQ1U4SDBJcmRBd0J4RC9LMHlnZjdTb3dnQmVmRG5qblU4aWNsanFnTkx3UlhYSHRId0xNRTVtQ2lza3RRVysyWkpCbDR1clpoWmpMQjhnaTBmVEtFeWJYMUFiaVhsc2E1eGlxdHZUdGU4R2xiZWdwb090ME9ibHk3R0cxMFpXM0g2N01lQUN1YS93aVN0UUxnc09HdW82OEpsR2xYeEdibFhwYm5CTEtjMkxYbldoMmpxbEliSkZjUlBwdE1NU3FaNHYyYk5SbU5NSi9OMmlWZ0h4V3d1cjZDQmJjUGZnVmdsL0diL2NaTjlVQ2crSVJoc1BoaGxEeGtCdHl6a2hWWXFleUZCUGxLVFY2RHJzOWtRWE1CTWhyZy9NeHVBeE53NW5OaGN1WWF1S05DdjlmQkt6Y3Y0L1ZYWDhMaXdrQ2NYUGR2Ly9vTC9QenpSeVlkdnZ1ZDMvN1dia0VMRHNZR3hILzM3U3M0djdFa0t5dURQM3ZlZ2p2TG85ZmM1Ykk0N20veng4UHRkWDZ0eDVkWE5IYVBEeWFZek94V3VMWWpJUmZDaFZ6OVdCUDVIcWN2WGdEbTFUY2dYbXIvaklla0QyNEVraVl3Z1A4R29GZ0YxeVhRRGk4T3ZFbEE5MENaMU5hTmJFMkJ2VFJiM2hDWGxzUzVBazJEdXdONG0wS1FubWlieWNHN2p4TzFDbmdUL211dlhLa0IxZllBSDZscFNYSUtBSjlFbFRoeGhVUnB2bW04YXd1dzVSNUFPYitKVWl0SHJmVG43MXRLbE1odHJXdWp4Y2ZxOG5EL3dQTWdXZFREZzBDTGJ5cVlBbGJYVjlFZjlId2srY0VFekNqeUhIa3M4ZER0Wk5pS3VRM2FtTFVYb05Jd2I1Wmx5UFBNYkloVHlsemp5ZXNwOXhzR2VidkRuVExtK2dKY2p5ZWhJWm80THE2RlF3OUdRaU0xLzZ5SmYzVmxDVys5OFRLdVhqbUhwY1dCQTkwLytjdFA4Zm1kWGQrNUNMUjI3Y2VBbm9YbldZYmZlK2NxTnBZWHhKQ0FOZVBiem9LdlRNOVhtTzBOZ2d2Z0I3ODAzN1dGRGhaNjdjMzB4NU1DdThPWk5NZkRXRURnNVFqdmJlYTVWczgxZE4vUElyaHhlNnVNODNkVm5CVnZXRG1sbmUyTUI5WWhJQUxmV2M4QnJ1bGsyR0VFUjNLQ1N6NnlQd0hvWlUzZGZlUGNPbURsOU5HY3F6WEpSelIzcnBGTGszc0E3Z0Z0TkQyQ0EyOGZCNDZYcE9GbFExaGJXY0tGYyt2Z0xnbHpGUFd0RCtNa0VSU0x0c2RwTHhtblVvYklYY00wcXZqSC9DdUNHck5wN3RwenFJNUJGVThuWVY3bU1CNGVZejZkQ1pDMHRKTlJYTXV2ZEFwWTI3QUFINHZuWHdZeFZGSUNjQ3I5RDNrbytRZ1FrR2RnR3JwVkhBRkZ4SVp5clZhdk9VeW5VV3ZGaTYzSnkwSlF3bFRCZTNWUUhKQ01obTBKbGNjTU8zdGJRV3FWSE1EUG45dkFHNjlmdzd0djNjVDFheGV4dWJHQy8vTW5uK0h1NDhOYW9QY0h5L2psYjUxT2h0LzcxbFdzTFBibGJuZ2MzSldmaENlUHZQV0FieWZiWlFqWHl1dndUcWF3dWR6ZVRGOFE4SEIvSXF3Qnp0eHVoeWxzVVhLZ2Q0WHZDNWtQSHlrZVpzcytVdVlBbTBYdk9rdXdxQUl3WUxjZzdrSVl3Q215blFBcWdXdmp2OUJrTHk1eFd3SjBKRUFka0d5Y0gzZzZJYis0MWg1cTdoemNTeFBtS2pzQ3JEekpTZ1BXZHBVN0ZqRWFlLy9hcmFzc1grVTcvdGdXWElYUGFRQjhDbENyNUd1U1JsekFDSDBpYjFXSjF2WUE0aEJUbGRlWXYyZVhTTEF1ZTdWeTFyc3FGa2Y3aDU2Ry9PL0s1a1lOZzdMbjJzWXFldjBlUkdIRUNqREpnNzh3VktvTC9xeFhZWGxQaDJ2dzFsdDlncW5lN00zaWhHM2Y4enpEZERxTGFmSEFpd3p5dklkanRmbGlYcmdYa0p2ZFFYRElRNTZCNXdXQ1BiYlVhZnBnR2pIVFJxMWYzc213c2I2TWwxNDZqOWRlZVFtL3VIdUkvZUdrWWh6ZTZOU3NJd0FqZjcrYjR3ZHZYOEZDditNQVdwaGoyUGlMRTExSkdiMi9uM0NuV0Q0Mmw3dkIyRTh6dDNVd3djeDJub2d3UEI2emZObXlaNzFSNXJTMlRIQXpIOGtGNlBMMnNDVUtYcG0wWExqelkrRE4wbkhBSHFBbDN6OWZBSytsTndWU3d1dlVGZklKcmlpWXM0NkVremZncTZPR1ZvQ1FkMWxyQjVQTEFTL25HWUM3TGRJb3VDTkc2MDN2UW50bm41WGZ1SWZ4WnZLRGdDdVh6MkJ4b2YrYkEvaW1qcXBqVWVLcE5wMUF3RlErbzJsWE1JL2x1M1dlMnlUWUlrWXF0M0hhZUpxVnZwSEE0ZUdST2JaVlVnOFdGN0N5dmxiSmxUdXR3Zk5kUUVuZVU4UzdsamVYbThRejM5aExEMEhieWQ1dzdiL0dPOU91R1h6STg4eE5CSnhNa252ZXZNZ2dEMWh3dCtCVnpPY1NxQWtPU0RuZ0FVQm1qa1pUaGxrTUxKMGpxOFh5amdIckZDZ2d6M044L00waHh0T0NtYzJOZkpsaWFmTkplZ2FPbGNKaXY0TWZ2SDBWaTRPdVA3ekdWQzdmRHRkTzlBdlBpL2RXZ3ZLMTJNdXgyRzl2cGgrTzV6Z1k2WGtPVkJTNGMzY0wzOXg1aEFlUGRuVkRicEhYd1Qwdk5uS0Y2Y0NXYS8wc3FtTGtYdlZtWlIyaUtDaUlnK2ozSllBVDVJQXJSTzQySnZ2cXBYUVN6QkZMamdMNUdLaTNBbllCMWlUNUpzSGRONmdsY0EvYUlKY1RGeFRSM3MyejZEd1FsMS83S2FWdzY4YmxlRVU5RllBUHZKcGdaNHBSbWxqZU5jVG5xbnpHL0tzaHFTSTBFQ3lXaFpRc2xYSS9heTIrSHBPZEs0ckN6YUszMzQ5bHNyaXlqTVdWcGRvRTFqYldETUN6ajZaRXgrdWYwY2dQQnNteVp5NEx0UGhPbGpITHJXM0Q5WW1wR3Z3SmVaNEpUWDQwbWlTckJTL0FaamhKQVgwbVBaaE9wek9uSHlxanJia05WTUJNeU1xc2E5ZE5FRExTQlVuSWhNa1pzSUN2WTR1T2d0RDZkZGhrVnVERHIvYnc3ZXZyNk9hNlFwd053R215NUIrRWRxdUIvdnR2WHNIZi9QbytScE9aMkJVdjQ2REhPaGNLUUsrYm9kL0owY24xalB4T3BwZFlnUFJaNzkyOGZWK3NLQWlQRHlkUUFLYXpBbmZ2YjJFMG5rSmxDbnQ3aHpnK0h1UFN4VTMwZWwwUWFRdUh3MzBqcERNZjJVQlhYdWJqNFA2dTRsQUdMUmZ1QzR5Q0QwbDNKdGptT1RZU0E3Q0FoU01qUlZVZlNhMXJFbGZLSmRNUG1kVTN2bUVaaEkyYXhDeEt4WW5TaCtBdVpVclRrWWpqT2huRzQ5YU5pL2o1TDIraktBckdxSFJiOGp3SndOY3hUd0Y4V3prYUFYeFY1MEhRdDNzQkJiaWt4VWhGYmh2UWlsV3F6dUswOFRRcmFTdnlQVHc0d09MeWt2UTNkYkN5dG9aaU5zZG9lQnpocnJDMnVZcCtYdzlwbHRxWFVqMkc5NUd3Qk9qelo3MlJtL1p5RTZ3TmdiUElacjU1cERtSllkaWlJSXpIbFR2WERxc0NtN2lucmNudnhqekYrRERUNXFlamtXaVkvR2xBSG13MXRucmdWQXd4VlZBaGtSTjlZQ2ZpTWV1eWNLUEpIQjk5dlk5NVlSRExkUnBNbWxubURxZXhtZkg1VVZqb2QvQ2ROeTVpZWFFcnh1V1ZBbWF6R1FxemRlK2dsMkZ6dVljcm13dTR0RDdBNW5JWHF3c2RMUFZ6OUx0NkY3OU9ydERyK0k1TEc3ZDFPRVZSQUpQcEZIZnZQOFowTnZQekFqS0Z5V1NLTDc5K3FIY0g5SmtzbDVVdDlHaDVzY21PRm9pSld6MDhuVGZmZTBiaXV4T21aZExBemRIZGtBclRPN0h2OEFrdUtXbHEvQjd1ZStlWFpWTFMyRU81VEl5U1NSNEdVSzFXRFY5VUpvYUp4K09remZnaGNBdnRuWmN6ZkJ3YndaY2wyU3B4NmZYN1BiMGxNNjh6ZVZ2eVRJR0ZseVVldVJINHB1SlV5cEdtaVhvRlFsYWxFZk92Q0twMlFRSEVBYk41bXJ4TlBaRkFKODFJYlViTEVXYlRLY2FqTVlzc3dYZDFjeDNkZmpnM1NXRnRjNDJaNkNzU1poK2VlR3RLTDJUazN0SDQ1enhUN3JGcjkyVEpzcUR0OXhmbWhkSGtOZDN4Y2UzaytjZDFCSFh1YVlOOFZFQytpeHdmNHg2UHhoNXdBSERWa2pmNHRoRlNDbnJNR0V3emRtWnYyYU55YWp3ZzByUnhQRmdyRE1jei9QTE9Qb2p4RlpvL3F6UnY2UFlXZ242M2czZGZ1NmduNHpGZ3paUkNMd091Ymk3ZzR2b0Fxd3NkZEU1d3VFeWRPeHJQTVp6TU1ScFA4T0RoRHFnZ3MvTWVzeXhrV2t1Ky8zQWJkKzV2Z1FvU2ViV08xNGUvSTdpaEVvSGJCSGw0dlAxbDI5RTZmd05zU3BVL1NRVS9jeDVnUUN1UUNCNEdXLzVWbU93WjVrV3ZHS2lMTnJrRnNNZG15OXZHcHhMY1hia0U5S0tJS0VnUExpMXcrY0ppdGNEQzByUTByOTZTeSttcWdNYkQwMU1HK0JTWUJxOWgrTlFjYUt2VDFqOWw0bXIrWllKeXZraytWZ3BTR1ZBbFJZVmZxdVM0WHp6TlNyNTE1VXJBOEVCdWppTitGYkIyWmdONXQyTThsVEhSOStSMzRkNWJ3bncreDNReXczZzB3WEE0d3VIQkVLUGpTVndBa1I0bHk4TSs2M2xXaEU1dTkwTFI3U1JmanUwVlJKanpXZXoydFVXZEZqOTkvLzBmN1ZVUk5IRlAyMXkvRmZQazVnb09tT1BqRVd6RndUVCtpZ2lVWmNiaVRnQXloelo1cnZRK3dJRFpqeVdpdVp0L0FYWVpnUExhdnQxRXg3cUQ0eGsrdlhlQVZ5K3R1S0VEQ3o0QVFHYk1wU2pzRkRRTm1ncjZZSnQrTjhjN3Q4N2pGN2NmNDNnOHhkSkNEemN2cjJOdGVYRFNzbXpraUFpN1IxTU1oeU04M2o3UWVjc1VNbXRselFBVVpxZmtETWdLNE9Cd2lPUFJHRmN1bnNIQUxqbXhuYW5JeUFRQWVUaU5UUnNRb09UcTBzVUpQaFZsSTNnd0ViejRLQUd6M0FzZXhPUnIwYzQxSW1YYWNoV2pXSE5ZdGhCSW5zNVBnQkVMRTJVUmxBMkprRUNHWUtna2JLd1lrUE40d3ZUUDR6Q2F6WTBWYkt5dllIdjNBRkVYeUpFZ09XV0FUOWRPTGNEWHBsTmYvOC9VVEY5Rm4raFl4TjY3Vm9tbndsdkhheDVoZkR6RWJMNkczQjBycXo5eUluMFdPeFVGbGxkWHNMZTlnNFhGQWFDQTBYQ0UrWHh1RG9BcDNFRXdWRkEwNzRPRkh2cm9PdDVKT1ZPZERmT2JtejMzdTkzTW1lY0I4dUFPdU9GaUFNQjg3clQ3bzZPNnZmaXhYVWZReEQxdGtOOERNQXZUc2ViclVKc2ZtNW5mMnV5dTNQRi9Uc00wNitZdGJHUUtzRnY1QzNoWDhrYVhzZGU1M2FRNzVpZkF5SkR2SEUxdysrRVJibHhZOGlBblFNOEFQUVZIc1pxQjQyNG53MXMzenVGd09NYlo5YVVUbWQzYk9xVVVsZ2NaN3R3YmF0bWdsM0FVQnRBTGtBRjNvMEViLzlsc2p0dGZQOFRaTTZzNHM3SHFTNEo4SjhxLy95b1lCMmRJYk5iTEV5OHNRb21IYSt4SmtMbU9BdmZRanlRK01BSy85RmgrcThZeStQQ2JnWDZNTmc3TUlpUUU5aEt2Vk1jZ0FIZjJMOVpCb0JwYWx4WkpPVUx0UFFid3RoTnc2OFpsYkgvd0s1VGM4d1R3RlFEVEtKMjBvUFhwSjhDMkFjZVNjTEZzeE11aWJUZWhwa09RZk1PNVgwVWROL0NMK3BNditwMEhqOHlFWVFJVmhiZDhCYkdQajQ1eGZIUmNVYkVWWlNNQW14TGxINllwbjdNc1E3ZVRJemZLcDdNa0d3byttcG5wUVhoa1dZYkpaRlkxbzk2Nkp6YlZBMC9aWFAvKyt6OGlCTDBSdjJXc05OVnJUZjdZdE9XNjFTY0R6bjRDR0dBTDJacEV2TDgxQ3NPQWlvL2o5dFF4anRnV2JONEVEMTlKRFB3Zkg0enh6ZGF4b0JWRDJOYjBEVis1dGdNREFQMWVqbk1iendiZ3JWdGI3T0c5MXk1aWJYbmdsL1FwNWVZU2VOTzlyd2U3dzkvRFIzdjQ4cHVIbU0vbUFQaThDSk5uWlE2V29iQmJCT2RmYWlTVkIyOXJjdlpsYVJIYnA2T3JPVEpNSU1xUTRNMEcrcmR5NW54NFFYWVVFTERtN0xuNVhacmdTWVM3cUdKNElUTFdYdUlsMjJreGRBQ2VUVHZjQU5jbWtjczdUejlHNnlOeDRJNlo1emwvVzY2VzV0clZjK2oxV0orZDB6cVBzbnZXQUIrVDV5UUFuMG8vbFhZMTNKWUoyc056a25QYUw5V2hyVXU4TVRyWGhaY3FwWmJoZkRiRGJEclQycmtCK1JPNXltaGwwUFkvWmRDUEZWd24xN3VxS3JzZkN1Q0djY1grS0VaN0ozT2M3TUZCby9sMFVVdDRXL2UweCtTQm9EZkNBVkEvZTIxK01od0g0OEhRalQ0ems1ZDZSdkJobHI4MnJ3ZGFwTDBKQU44OWMrQUJPZGhTQ25pd084S0QzWkZMbjJmQldnWXkxakd3Y25UeVRNeXFmNWF1WjRZTExweFpsa0N2R05BcnYxR1A3WnhrR1RBY2p2RFo3WHZHbkVTdTh3TUFaTGV2ZGRsaURXS0Exd0o1VEJ6ZXkzWEF6OERHd3g5NWZtVFM1V0FZb2pUSjk4QUxsYjVLSUI0QllBZWxFVUFYN0Rtd0MzK1dWZ1RZSmJneVFBVVByd1ozRDlyNm55dE5RZXZyQjZiTUVVbkR4N0gxd3F0U0wvKzVjZTJpcU5jYVNEeDFnRSsyM0hWWVVoZllCSUJaZmJWeE1iRXAra0RsTU9NUmwrZDB3QzlWaC9GUHFxS2VHL2kxcFQwNTE1U2N3UWNzNkNMM2ppWjhCZ2FEbm1sRFlVNDl0YnVjWnU2c0VtUm1PM01BSUQwT245amRMblNub3NrL2JYTTlFUFJHd3ZGNDdqODZqbXZNQU14MnBtVE9mOWNhWldiV3I1T3l2UldqTXFveUQ3N0JET0JCamErSnQrU0tNeUJBWmNEZG5XTmtTdUhjV3QvUmNmT3pqVS9RMnF4ZUluaXlBanROZCt2S0p1YnpBbzkzaDNvY251VlRtL05OT1dTQUtyd2xZajR2OE9VM0QzRm1ZeFhuM0xhbVpDM3lyRzJ4aFVDWVRPY1lqYWNZalNjWWpmVHZjRHpGOGZFRW85RVlyOXk4akhObjFoMkEySHB3L1RFRzRQNmVaRElDZnNtTjJ3dFFMYmxtelVlVDlwSVNoTEVHTzlaY056Zkp1OUF5djZEQjV6SkplaC9SRnlkcnpodlFDUk8rdWI5NTR6Sis5ZWszUWU2ZUhjQlhnMitjUzNOc3IzOEpUbWFtcitEYkFPRGJjdllzbTRCMlU4OHFXVkxoVFhwZVZlazEvU2hiK01mNGt2eHQ4dWJrU21HeDMzWEtFdUROOVlBOUowUzNVWm5LZ1BrY1JBcjcrK0dKZWtsM0twcjhid2prQVFUajhZQStqYWdvQ3FnOGQrTzYrc1F4dmdHTmNRUmZzUHBSQTcyd0JIalFGektJSjRLZGNsZnFHQWp3VjdpN2N3d0NjTDRDNkluOFNYZlBnMU1LZVBYYUdjem1oTjJEWXlBakZJWHZLQ255R3pyWVp6Y3JsSURIMjNzNFBEckdwWXRuOUpyT3lSVGp5Y3o5ZWtDZllsNFVLQXBDUWZxczVEbTdMd3JDdlFjN09IZDJuU09KQStaUWQxWXErQTVaUjFwMHFvbGRESWllMUtVYXlWSTRlNGcxRExIb3ljbFhJWWlkSXJpRHZMOEE3aEpkV1h2bmNRakEwa0lmRnk5czR0NzliWGpmV0Q1VFFiOGhnSzlLS3hDMkxmQlZ2M2FKK203aFV2SlU4a2w5RERXZGhpcXkwOWZpYTd0QVQ5R1Z2aVovSDRCKzdDVmFXdXloYTZ5MXV1MVVUZ2tDVXlESnRxbEVPRG82eG5RNlIwUDN3b0I4eEZ6UG41VUQwdG1zUURHYnVWbVZuTlFXbE1Wc2dqWFhhMDhkUm1aM1lNdmNwNmZzekh5ZXJpSHk0TTdtQ2ZpVTNaTUNqTm1lY0g1dDRQdzQwRnZUK1BQa01xWHd4dld6K1BsbkQzQXduR2dyQ0tDdElxYmNMTmk3ZnBFRmVnREhvd2srK2Z3dWlxSVFvRjJRQWZKQ282N29LTUYzRkt4MVlHdm5BT1BKREwxT3hXdG5HM01IM0pDbWN1VXgzbjV1d2hwUVVRN3hocksyZVU1NnBDQ2hQYkE3Q2hjZ2VFZkJQUlVuUXQ5U2UvZDBBY0N6RHNWMzMzMEZmN2I3VXh5UDR1dDg0d0FmTk9ndklNREhwS2g5NTZvQVBoQXdWbVROWWJVNnBERVF0MkZRR1I2dG5DZE1MMVdZSVhHcTFMUi90OXZ4bFJPdGcvQ0w0M2toOUxzZDlMb2R2ZWJkTkpTNm5mTUtxVzFJdGZKSm9EbGhiNit4RmcrOENCUHZqSE85a2RqNmVPMnZ3NHFpd0d4c044bno2NmR0b1JOSlUwaWVaZUtqYzB2ZHJET05rZ2R6Z3ZkZ2xMWXpFTHdYTHA2U25vLzJ4MjZNM3RHNXpzVHpCZkRXNVpuQ3JTdWJidjBtQURFaHhOYU5mMW01NmNuWGtRcnF6OUs2UW1Uait5SG9BNFQ3RDdZaHVzZmt2elh2TGJ0WTduSWpBK1RpK2dsbTlWZHNBSjdDTkZnU0ZIanljWFV4YUJDdzliTHp0RmwrSEc4NS84Q25BZmNneHR3UnhwTnlXV0lPMnBWajc2N3NRenFaTDh2THlnRG9zY2kvL1h0dm94UHBzTVdBelRhdmpVQTN3cXdhZU9OY0dxVlZCY0NsZEpvS3pZTnFDZEtVVmVCSThXRFBNaEU1eVROVml0d3ZCWnpOazRtbGtzNW1WUUhVdUlxb21WTG85L2w3S3dHODlISUV6MG9wckN6Mm9KVFNHK0JrTU52V3NtM0t3ZVkvbVUxeERnNk9NSnMxMXVLQkYzSGluUVIyRGk3ZWpTTTdBSG5RVU9iZDFhMTluaXMvVkFzQXhMVnlCS1lBNzExNkFXeVkyY2JXcHNWbDlpQ253N1lQSnlXZ2YwN3gzYm5seFI3T2JTd3hjTmYrRXRSdHdUSFFENERmeHZJYkFpbEg0d3ZDeG1lRlFzRDlCenNlck5oNHZnYng4cVE3dXltT3JiY1NUb05mS25oT2czY014RkhpSy85Y294VHljTmtMT3hVdTJ6STlTSkFHU3c4dWZnanUxQWpjZlppVTFjdm4wNFBoNis5dGFqeU9wd2w1cjY0czRmZCs1MDAySDRYbmtic0FIcHBpcFN1clZGZ2Ftc0oyT3VycVFGYVF4b1d1aHFFeVFWdllpdWU5UGZnMUJ1Sm02TndnUEZwQlQ1aGVxakFURFhySlYvdTd2VUFFWGVTZWY2RHNlWG1oWnc2WFVlaDBjckh4RFc5Yk9laURnSjJkeFA0U2FmZkNhUEwzL1cxWml3ZWt5VjRmVUZDdUpISXR2bmtHMEdIcjZFc2ZvWTdnZ01ldDBGTFdkTzlOOEY0Z1p2UGxwbjdYVzVCcDdCNU44V0N2ZGtPRDU4cGR2N1RtVGo3eVBVMEc4dWJaSGE1Zy94eHdTeTJmZDRLY0ZZRFJBTEo0RDRmSE9EZ2NPcXNMd3hYeFBWbFU5L0RLa0ZnRlBnRm9KNVQySkhqSHRIT2dyS0UzQlhVRWNsbkJVbHE3Qi9jUTJNSEFuWU9zanhNRGQvc3RDSEJIU0p2UThsa2VlZHIyT2VSOTd1d2F2dmZ0VjczUUpmY1VBRDRhcnpuQXArSTFJQmIrMWJMVkFId2daQXdqVTFDVkVzdXpiSlR4Y2dDbHlYNWJ0SGdBR0N4MEdhMEU4TWhiSkZ5M2syTnBvUWVWS1hUejNJTjdKbGN0aFp1OUhRN0hHQTlydDdBTjNZTzJFV0x1V1lEOGwvYW1yTWxMUXFXVTN0S1FPYXVkQWJvKy9GYTEydVdaTlRFcnNmN2RSTlo0YmVLNWh0Q0N1UU1tRmk5UVByMFVPbENNMlN0Z2Z6Z1ZHdjN6N3JxZEhDK2RYL1hMTzB4R3VCbmU1NVZuMW9KMzJXUmY1bEdxV0I4UEN2Y2ViRFB6T1FDK1Q3MTFJUkJHd0ZZTzZCRDhJdjNxcTdJVHdDNHZTbnhJSUFYcUZ0aEYxeUhNandQMnRFa2UwYmllaVFmc01nQTcwTGJnYnRPd2FkcjB5S1ZhMHQ3dFBmZ3pLeHRiQmxldm5zZGJyMTlIMlQwbGdDOEJZRlBHSWJiV05PbXVQTXFoVlRoU0MwOVNpSFp3VnNwN295Z1ZmclVsV1o5Z0tad1MvZzM1TmhHQ0V2N0p6b2oyNzNVN3lMTUsyT01mSWk5czg5S3ZMUStjY3RUcjV1YWNlQ1cwZWR0T1d0QXZpZ0w3aHlQTUV2TlhLdHp0dGhGaTdsbUEvRzE3dzJmV2g4N2l3dUhlSVVwSGpXa0tEYzJpQWRDbnRnRWV6RDEzNVR4SStmaU9tUDl5aVVnK0MwbUYxdXI1alpyUGxud3UzUG5OSlNlL05OV3p2SEVUdmZNUEdMR3lLbzNobTMvY3o3b0hqL1lnam8xbStDekFGR0RBelJtYmFBeTdoYWJlRUx4bFZyaW1IUUh6RU5DRGRGTGFlaHRnRDAzeUR0eFozRGJnenVQcmNBbnV5Ykgza3VYQTgzZmNlU2VBQ0srK2NnVTNYcjRZbEdoUVlLVXlqMWFFakZzYnFRRkloV0ZQQ1BDTlVEeUZTVTFjQ3NoVEx5L25UNG55T0NuZ0lsMGIxWjJIS24rSytEVVVwczdWUkYxWVlLYjZBTURqVXZubnBZVXVCdDJ1RzJQdldsTjk1alYyZHloTjV2Y2gyZGtiZ3FqQWJOVHExTmlqOTkvLzBhTTJFVkx1V1lEOEhRQlRvS3doaDFxZlVzRFFyQ0cwalJXUG92MlViOGdJNWtoV3A1czdvQkNZeERFaUJsWlIwejBETEdXdEJXRU1mYmUyeU13L0w0RHJkbktzTHZaTFpuaXBzWnY3WU5oQ2FPbks3ejZnZU9rb0hoYndWTUIwT3NQanJYMEpsdVplVkEwRkZ4aEFXakIwWnVjeU9MZTVaRG9SRVFTZ2c0R3hCOVN5dHA0R2RqQytRbXNINTBFdWZpdHd0elNPUG02YXQ4OWVGdG5NcFV6L2pyY3JCeDNwVzIvZnhNVUxHeTR2Z2xuZ25nVGdVL0JjbGVacEFueDFSNklHNEFNaFM3eVMvTlBBbUFMNHVBQU55by83VlhRczRwRktsZFF3WHBWL0tnTnBRSTY1TE12UWkwMjRzL2NoWC9hY1pRcHJ5d3Z1a0s4TUNyMWNyK1d5UTU2WlZTYVZIKzQ4SGs4eE5PRHVKNVUzY3JmYkVGZTVwdzd5NzcvL293TEFWM1YwRmp5T2R2ZjBoK0kwZnZaeUsxN3VlbTFpN3M3ek5XZWlXOU05LzBSRlQ4R2FlUU5QZHh0OEFtV2pReUEzc05SL0Zpc1JUOWVkWFYrSVRDbzB3S3o0cm5ZR3hKMFZocVIyYm01S0RSblo0SWo1SHNDOUIxdVMwRUppQUxSQ1E2L0pVN1QvVnVFNHJpZTFmcUZkMTJucUh0VHJnRDJwdFpNRkZ5cnhiZ3p1TmswckF5dExYczVOdFhkSngzRlNkaWlVQXI3MzN1dFlYMS94bVUyVWU5enpPUUI0RnhablZCdW5ta0RjMUwzUGJkS3VUSzdHcngzZ3R1UmQ4cS9MZTl0YzFrZTFkYmt3NkxJWFBDWVBmOGxJUEsrdkROQXhHNXhsbVI2RDcvWnl2em9KMWp3UEtKVzVYVVMzZGc0MWc2TEFiTkpvbHp2cmJyY2hybkxQUXBNSGdDODhvTVNYejFrM1BCeUM3REtEbXZvbUFqcVpQeitPYXlYbEJ0K2hqbndtU1ZIQ295QmFHSndyaFc3bldSWGo2Ym5OMVFWcGxvZk1lMmpLRi81QjRZWW1lUjV1dnhmRnd3QnNiZTlqTXBuN2FvaUFKYkVuajE0ZWFGTEEzUFFLMWZQb253OE9SYWdFZFFlc0loa0xwbkZnRjFwNzBBNDlLYmhIVGZPdy9remVoUFllbXVkRGk0SGxuZWNaZnZmN2IySnBNWDdhWWdwa1JLYzhFWWxDai9BcHdpQVZWcGRXWE1hMHF3VzRKdGlWU3FOQ202WTZtb1laalpGVjFFZ2lVcmxOYlNWVDZ1V0lQallwVU84VWdnbDNJYUFuK1JMNnZRNldGL3NHM0RNSDVucmluZDBhSE5wRTcyYlVLK3dlRERHYjYrTS9hVHB2dTN6dWkxWVpySERQQ3AxdXgyQTMxUENVVXBoTzU1aU94L3FsVmZ6ZGpiK1VGbDhkSFd1ejc4bkpBQUFnQUVsRVFWU012RjhZVVVVMVBtVWFLdi9za1lxYzlOWlhhN1FML1J3dm91djNPaGowT2w3VFpwUHNuQUhlVG9HM1Rra0E4K0N1ZmNNT2dZa2k0bkQwZS9Cd204R1VMR3VCNzlhZkFhTDI0bDJCMkgzTkgrZEpNczB5bU1OeDk0QmVCblVuT2dOMURzWk5nTjJEdGdYcmh1QU9DOUlvMGR0bkw1L0pSNUNlakdmcDJQZEVzWFJKOE81MU8vamQzM2tMdlo0Y3hrcTE0VWt3c1dVbDRpYkFLY0tpSEVZcFVrRlhDMjZweUNrOGl2aVd3c3JScSttNVh3VGdLK2xyUFN2OGs3d3BHaGlyclRUcms1UzdqWm9xUGUzZjYzWDExcktpb01PdjF2N3dEd0E0czdhSVBNc2NvTnRoNW00bjh6UHFNNm5OVDJjejdCNE1IZDlaOWJueE1YZTdiWVNVZTJhYWZPaVIyalNHaURBOE9uTDMrcGQzRHdRa0lNdE54WEg3Y2F6Q2cvcDBqMnhHUGtHQ2xIdHhGUjg0TU0rR2NLSDNZb0k4b0UvSUM1dTBzRmFVTEJCdjB2ZGUwYm9zZzMvWnJuTHY0WTYrZHdERFFKUURJMnpaczNYd0FpejljK3hLYXZNbFVwWXFJeFNBSGpUR1hCNis2WTZRWGNqS1FtSWdadmt3WUc0TTdpV1FOcm5pYlZZQzNPdTFkK3ZyWlFaOHVZUzhseFlHK01IMzMwU2Vaekovd1V0UUNmQ2xlSW1ucXMrOWlpaWFYcHhaVld5S0VGRDBnY3BoZGFMVnBKMklVc09YWWo4QlJUeHkwK0pNdWxTODFBdHlTb2xYYWZFcFJSSUFWcGNIUmhtQ084VXp6eFE2ZVlaT25vbGxjdlkrVXhrZTdSeUNDcy8yQkRQcnYyZ2JJZVdlbVNhZndQU29POTRmK3NZcmFIeThyMzc3ODJDQ2w2ZEFmT2FkNVVreWlHREg4dm16NU9lQWl6V2EvZTZMWjZxM3J0L040V2JaQzN0N1hDT1h6eExvWXpNYVBiREhtL21EdzJNY0h2bmxoeUhZT1FCa1FLc0NBSGJQQXFMbEg0STRjUUFQTlB1STFCeTBoYWFlQUhVUHhGSmpEMjQ5MEVhMWR2aThCWEc1L0RLT0tRL0d3NWFqcXk5YnJwSDA0dG83UzkvS2xPSnQ4cnkrdG9UdmZQdTFjaWVRUEUzVVJjRW44VlFEa0NGUkZaYWNGc0JYeWRBTzQ5S01xWTRtaFkrVnBWcmxXY1U3V21IUmxCcmtxTDJyMGVMekxFT3Yyd25TaU56N2w5ZkVVeml6dXVobXpPZHNkOUJ1aDVucWd4M3ZEb1lqSEk4bUxBM0N0TjJrTytBRjFPUnY4NGVZbVo2NzRlRlFmbHgyS1p6eDRKdlRFQkc2dWZJVlpQNHJFeUdzZnM5VGVqcE4zYVhCNGhKSlRaNXhza3Y0WGtTblgzenZBcVc5NUZMbWVJbUdBZmhIblVmQnUvZTNIU3BXQVd3NVpuQlJ6WldJVjhuZnhmY2FldFRLd0NKeFVFK1o0bDFia2dCMnFiVkxjQ1ZEbURiTEo4QTlvcjNMdUNiRkd1MmRXQnFlaEVRNVdPQWpBaTZjMzhEYmIxNlhCUXlmNTJnRmxPb204VlRGSWtJVUpXZDVqNFdsMytFd25lYnlOVXVEMVVPU2Z6bTBrcjdXMHdaVlNkU1lUWmtxUmR4RXdGYUZLbDM3elcvMC9ibjFKWFE2bWRmVVlUZTkwVlpRdS9FTm1CWlBSSGkwdlY4U2N6YjYvNkc1dnNvZDd1ektENGhZZFFRTkdKUlpSZ2ZmME5sSmVPUTlUWGo0Z3BqbmlNWXZLR01XQWVQM216b3YvalJjdnhzWmFxaklUdXZQaStCbTZ2TzR2RlAzNE5GT0VFNjg4Z3lnd1lGYURMeHRVbzJ1TUw3bEhRQjVGTXpoZ1F4Q2hqS29CN2NzYXkyQm5mTTRKWEJQbXVadFd1YWZvM1RsSEtUQitMdTRJRWF2YVY1KzZRSmV1WEU1MHJBR0xvb0ZpYWNFazFSY2U1Y3BoWmV2WGNLRjg1c3N2UWd6U2liQitKVXA0bkVTMURVSnRQM2U2c29tTE9BWTJXa3RtWXVScFRtM2JsbHE0OW82VlFBRy9WNUF4KzRwa04vOExnNDZXRmthZUcxZDZiTlM5Rks1REwwdTIrME9kbjA4OEhqbjBFeTJJOEcvNVJyNS9mZmYvOUYyUFZrejk2eldmdDBITUFJUW4zTExuRkxBN3VOZFhVYm1tRmx5WStJRVp6UW5yMVYyOGd5anlSejJxRmVtNkRzVjNmSndFVTJZYTZCVUN0OFNnYVlPWDJSTkhnajZMeFQ0V1pxSWh0LzRzd3hSTm5nY1Q2WjR2SFdBTTVzckhoekxVUnlBT0xDeC94MWhjRjhoVGlPWmsxN3AxaXplc0VXQUlFSVlOdENpU1FvaVVFQk1vUXhjRzQvd0VQUWhiY25zem1Ua3NrWE04NXkzU0EvQWE2OWV3M0EweHAyN2llMjRUeFBnU1JMWnU3VzFaYnoyeWpVc0xQYmRzY2s3Ty90UlJ2WHZTWm1Jb2crcDdrQWtqdk5zOFA0K1l6Tjl0RU9RSm05TzFVU1Fxb3F2WWQvdjY4MXJkSDJKRnpqUlJkTnppTTV2ckRnenZHNEEyYmttQ3VoMk9tYlhVTHRnVzJFOG5tSm4vNmdzRXhFbXcxYTdvdDV1UTF6bm5va20vLzc3UHlKQWZkU1UvbUJuRC9QWlRMVHdZV05pSGdFQ09qbGZyeVUvSzkvMnB4dGJDdU1HRFZUZzVkeUxyTVVEd0x3bzZvbVNyakhNcDZNYVVMNzM0REc0MW16aFhHaTVpYXZTUkIrNUd2R0ovQW5UUWZuUnYwT0VrcllPQkRMd1BGcndEUGc1cloxQ0hqN0ZXczBkRUR3a2ZjUTB6NndsSHNPc0hKNWZtWTVrR3hwK1A0Ym0zYmR2NGN6bVd2SjlxSUloM3M1ZnZuUVdyNzkyTFJuTzR4TDA1ayt2dlhvTjc3MzdHaFlXK3dDME5lbk5ONjlqZVdraEpVN1NrUytjZUJ3cFRCTEg0dW1rNDNpMmtiYXNpcjdXMHdiVjVMd1VISzI0S0ZtYTg1TzBJNmtTOVA3Nk1Cb1NvYVhiUUpzL3M3YUloWDYzZlBDTTBscDhsaW4wbVNhdnpmbUVlNC8ySkdQN2ZVMW5tTTFhclpIL3BBMXhuWHRtdTdnb2hROEJmSytPamtqdmlEWStPa1JuZlIyNmp3UXdkVjc3S1Q5L3U1dGxvbEVMZFZIckk5dDFzN3Jla1JPSWxGZnlHUnRHb3VPR3MrMWZVRGVmVS9UMUQ3K2Qwbk1wNTc1aDRnRFQxRDE4dEllZHZZK3hzcnlBdGRVbHJLMHNZV2w1UVFnbHplYmxld1IrclYwaVNwSVRreXNhSEducFlrQWcvU0lsR3dCR3lKdVloNmpMbE9iT1dseGkvM2d5bkZ1MTltN2ljdjZsZEwwNUgwcmh1Kys5aHIvNnlVYzRPQnlLYktVQVBpeVBXemV2NHJyWlBuYzBudUxMTCs4RnVDN2puaiszZ1Z1M3JxTFg3Zm8zeGJRaGVaYmpyYmR2NFc5KyttdU1KNU40Z29HTEFYeGM5RW8wVFFOOERmdVRKWmtxWGViWDB2cVZvcTVQU1NSYXo3bEplU1pjSjgvUTdlb1ZSQ0dRUjc0WUFJUkJ2NHR6Njh0bWViQnlrNUR0dEdJOUxxOW4xdHQ0bVZMWTJodmllRHlKaWprNUdsVVpaMkx1WjYyb2E5d3pCSG5WU3ZEOTdYMHNyYStCbStzQkJ0aWtnWjVnWmpjcUpjTGdubzJ2UUdyRkFOeG9SR1ppaFJnSDRQZmdMQWlrRkFvaXpBdDZZVTMyZHFNRzdzb0FIeUJLYURyMlhRUDlSQlQ0UnQ3dUVnOWdOSnBnT0J6aDNvTnR6T2NFbFNtc3JDeGlkWFVKNjZ2TFdGdGRScWViUzQzY0p5dDdGdzArcU1iZlhBMllKN0xrSXNiYXFDY0ZkaGZ5Sk9BZXhoZmdFZ2R1RHFheHNYY3BtNk1TZEhtZTRYdmZmUjEvOWVPUE1CcE5JcVVhQVhqU0RldGJiMTdIaGZPYnp2L21qY3NZamNhNGYzKzdGSGN3Nk9QVlYxN0N4dWFxU1Y5MldxeE12VzRYNzd4ekM3dDdCODVQbGpYUGd5WjQ5R2dIaDdhVEVzaVp6azJhaG9mVmd1ZVRtT21iSVhNaTNVUkkzWWQwZ2s1TEkzY2lMVDRpRkFOL3BSU3VubC8xUjhRYUVyMzZTTGYrQ21EajhScjJaL01DRDdhQ1lSOG0zNlQ5NlhNdkpzam5lZlpoVWRnUExXamtBKzJiaUxDL3ZZZExOMTdTZU13QkdteFRXc2FtbXl0TTU5NmpJRUxPbG5BUi9IaTlCbmJaZVFBVGdVdy9nT0NtQmNCcC9nSDliRjRnejE3TXRmTFRXYlc1UGpsUjBRQnFEZXlCVThTd3VNck41Z1cydGcvdzZQRSs1a1dCZ2doTEN3T3NyYTFnZlgwSjU4K3RvOWZybGZoU3JWd3lLOUtyV1hNVWIxL0tnSnRzQnlQQUx2bW1nRnA2Y1BKd2FFRHlqWFU0bUliTnBLKzBFaERMWlEzQWx5MEdYc0orcjRmdmZlZDEvUGl2UDhiVUhlNFV0QW5zcHRmdDRGdnZ2b0wxMWVWU21tKzhmbDJQaFpxeGRhVVVybDQ1ait2WEwwRmxXUlRnM2VSRjgyK3cwTWZGUVYvSUtXUW0rYnl4dVlhUFB2b1U0MmduaFpkbTFEc2VwNGttZlFwbStqaDl6WHRmNmtERW1jVnFNTW41S1d2eENzQmcwSlZwaWUrQTg5UTFmdkhNS2dhOUxwUWlLTEphdkFkM096emI3M1QwNWpkbWEvWDdqM1l4bnhmKzVlZWNDOEprZU54Vy9GTUYrV2UyeUh0bFpiR2RKcisxRTN4ZzhRYkcrQ0RQL2FLM3NDR1FXa2tRa2QwS2dDQVNhVHNhTUxNd1FYUXNYalIzTUJ6SHg0OUJwWVk3QkU5WExoUTgyM0NLZ0UzQWw3T3dWMUZLeHlkd2NIaU1MNysrancvKzVsTjg4TE5QdmV3bnVTSi9RaTVLWC94TjRPUHFib3lhZkhueDk4bW5IVXZIbDRKTXk1YS85L0FnQlBDNkM4dGNqTWV6aW5ReHlPZkVwaHVtWit2ZWd5V0pkNkZrT2JEeThQeXpQTnZ5VzFwZXdIdnZ2dW9uUlFYdmhMMVpYQnpnKzk5L013cncydENtOE00N043RzB0SUNWbFNWODk3dHY0T2JOSzVVQXp3dEV0akY4MkNLMFF2aXdUaWZIRzYvZlFLZkRkQ1NTTjZsV0llNmZqbFBWdWxBdFVhSmNHeWJRVnA0U1ZidENhTzRhYVBIOWZyZThSYmxOUEN3NEFwWVhlamk3dnNoMnNMTmo4Umx5cFMxSnlxeUo3M1p6ZHlqTjBXaUtuWDIvczExWlBzTGtxTldrdTBPYzRrWTR3RE1FK1gveEwvNkhSMHJoZ1gydVc2cXg5MWliNE96SFY0akdSZDhVbmdJZDgxRVhBUnB4OHh6L3FPMlRKSmVOS1BGNGlTK2tUaHQrWHQxNE1zT1lIWkhMUWNyNUFhSzhnRElJMjdnYzBhZ0l3d1BHNEFERXdFMld2QU5FZXhYcy91NkRIZXpzSGxhQzhaTmNvVndwUUllTkk0c0FBdFFEa0dzRDdPRmtPZ2M4Q1hDM0hTa083aHg4Zlh6L3RvdjRRWG9lck1uRmsvWEgwZ2hCazljaEsxZWI3WTJOVmJ6ejlrMUU5MVlnWUdOakJkLy8zaHRZc0ZxMmU1ZDRPNnJIMXIvejN1djQ3bmRleC9MU0FwTkIwa3FMUmhyZ1hka0VaY1I1OVBvOXZQYjZ5N3FUd29YbWVlQXU4dDN3Z0hnWUowdFFVT3FSa2pTU1BpbFZJaTVGL1dOYzBzazJvRTRMME1pNUkyVjl4VEZ1UEErRVBBTmV1cmpoSnRwbFdjWTJ2N0U3M2NGMUFIcmRYTSs2Qi9ETmcyM0JTMlNoSUtBZ1ROc3RuL3U1bnFoK2V1NFpiOWVtUHVSUE1iTzk5UnNlSG1OcXRnSVU1VmV3aW1LTmE3ZkRKdC9aaG92ejVSOXFMRzM0eHFqa3o3NSszOERyKytHNDFheko1OGJ0SDFrdFhnSkx3UnR6RGh4QlM4VEJpMEdWS0VBUFpKQnhJeCswdENUdytqR2NSVWRCcC9PTFgzM0pVdWEvQWZPS0svM0hnSWxkSWFCYmdFaUJPZ3N1ZDJvSXBmSjNlZWNBNnJKc2VaUGc2K3FJdmZUdVhhNEU5L2czSVdsdDN1VDN4UE5tNjQ4NGY5NEpJQ2VoU0E5RXVIQitFNisrY3RYN21adExGOC9ndlhkZlE3ZlRLYVhMQWQ3ZTUzbkcrRUtVa1loclpYTjA3Sm5KNmw5My92MUQ4RnhjV3NDdFc5ZmM2WXhKUnhXaEZXRUVOdWxMeWZQS3Mwd2hOMXVzMmlzTDdqT3pEYXM5Mzl4dTN1S25IRlhJSE1sU3FrTVFqVlNWcVdhZWlmaHhXaTViSjgvUmlSNGF4Z3ZieTNubC9KcmUzTVlDTzFoNW16SzI1WmdwaFY0bmg4cUFSenVIR0kybVVuNGhIMkUrbm1oVGZuTjNxcVo2NEJtT3lRTkFscWtQaWVpL0lPTGo3L0dYclNnS0RQZjMwUjBNdk5tRlNFK1FJNWp4ZEhNRGNwVWpIR25ReXZtNmVJSWI1Q2NUbllqY1RFclgrTnF4Zi9aQjJNbDV1cm5TQVVmakdZcUNqTm54eFhGN2gyUGZPRHVBWU1CaXdZeWhXdGhnQWtFakQvZ3JiQ0E0RDNaZjdsU2g1TUZwT0lEZWU3aURyWjFEcks4dE0vQ05ORVZ0MnBCYUFnWVcxU1JSanNuODhqSU5DTUljaWZKZ0RaZHN2MGc4Yys0eVBtU2VISzhRVUlONkQ5TmhhVlROc09mNXRmY3ZYN3VJMFdpQ3I3NTVBQkJ3ODhZVjNMaCtTY2duUVZqbW85UTVxUVQ0OExjTThQWVZGV1VWMUlNdDk3WDFGVnk3ZmhsZmZuSEhwOEZkZ3hkRnR6RWVYT1E4WVNwdE0wMk9PcFdVaSszeUtkdFluVUFodm5kZlpySDJ1T0tWam4rekpRNUo2Z3FTa0xiWmg3eXcwR0FzM3RUMTJ2SUFaOWFXZEdrcGNvZHlaVmt3OGM0OGR6dGF5eDlOcHJqN2FGZndFbGh2NXA5TjI2MlBCMTUwa085MDhnK24wN2ptVzU1OHAyZllyNTAvQnoxSmpsQkF3U3lJY0VCZmdKQ2JlTjA4dzNSZU9BM0VueTN2WDJTN1lRNUJUNnJReVNvWDdvNnROZkdKUE5pN2VQRHhDMUk0SE0rd3VpQlAzSHFlWFVHRTdZTmoxMUNsTlRDdndZbnZMdlFML0wyWGpsOUU2RXZmY1FGdDVyZDhtQnlPdE5UNGFHMytiLzNnYlZOLy9qcXhTNEZ0UFhrMFJrd1dpZ1NFYktxQVhaUDR3cFpsbVFaM3pvZkxVS1luRWJkY0R3a1o2c0M0Z3ZlcnIxekRaRExGbWJOcnVIaitUQVhQb0pQU0d1QlorZ21BUjVoT3dKZUNQSnc5dTRIeGVJSjdkeCtKY2dycngyQzVhMkdVV2ZycndNUTFmd3pBUXl4M3E0REtTYW5nanQvS2c2WjBWOWhPVENhV2tQdmVDMnZOTXVWQUJTdWJVaGFqVHlVWC9UQmJmS3dKVXY2dEtDajAreDBSNm42RGw3T1RaM2o1MHJvQmNHUHBBTG1LVU1wc2dLTVptKzFzTzRBQ3ZyaXpaWUE4MnFxNSsvRnZlR1k5OEd4Qm52cjk3b2VUaVFkNTM1Q3pGNHlWMDg2amJWeDk0NWJlVWNpdVlTZXpiYTNSNksxMmJudFowM2tCcTJsN1RkMmtaK0tUVWdhQWxBTnZ1MnVSbTFWdlpZUjkyZTBhZXRzUk1QRUJIQXluTHhUSVA5NGRZaktkcy9MMjJqeHZuRzFqWUh2M1JIcHVoQStXNW1QdFQ0Z0NOSWpST3hZb1FFNmo0UEZaUkhnRU4xNnNRL0RnNFE2MnQvZXh2cjVzR0tZYmpWUEMva3B1U1ZDUEJENEpzTWY0TmdGM2ZSK0VKc0E5UmN2QmtNdVFCa3dQcWpKTkw1dFN3TnR2MzZ6bkdmQ1RhVlFCZkwySm5zdVZBdml3akd3YWx5OWZ3T2g0WE41QlQvbFoyWGIvYzdnV0JHNXNsNE94NnhTd3RwSHZDd0xTbXFVckprU2NiUnU1RnlzN3BmeEVaY1hDb0V5Nm1YS2grcFBTKzdLRHRKSWcyd29tQlNYa2FlcW9kSk40anJ1RmhaN1J4dm1Md3Q1dnh1L2xpNXZvZFR0UU1IWlpWMDh3TStkOW5WbE52OS9wNE42alBRenRxWEtsRHdGT2l3ZUE4VUhybWZVZjFwTzBjODkwVFA3di90MGYvQUxBTEZaaFlTTkVSTmkrKzFCK1VHWm9JL1dCZC9OTUEwWmgrSkVqOW1QTmxqOUxWNHd0VzJDRDU4SERQTGo1ZEkvR3MraWE4K2ZWM1htNDc2MGR0a0VUK1dTTnV5Z2YrNUVqS0Q5LzhZOHFwVlY3V2gvSUo5Vlptb0xpL2lHdm4vL3lTMGZENmNNcjVjSTh5TXQyT3NyY1l2VGdWRGF1dVVvY0dIK0s4SFR5d2ZLUmRSVHloWTNMcEJCeXNRNlVmTDhaTGFwb3krK0w2OVNKK3BHQXlyOVg3MCtNM3I5Ykl2MlFKeXZmRUxSOVo5U1hsNVE3a0RrcEx4Y2lsSlBsQWY0YkNlV3pZN2xabnVsSlhHNWNGMjRDRjVUU003YloyTG1kNkpWbnlzem9abVBzeG1Sdng5cnRtREdVdi9lZ0ZBdGpZL1JHamx6cGNYMG5ud3YzY2lremk5elNhNWt5ZFBJY2VaNjU4V3BmWGdrWGF3aENha3I0Sjd4WXpRSFFXdmJTVWkvQ1I3eFlBSUN6YTB2WVhGM3c1OE1Iayt1eXpFekFNeFB2YkoxTzVuUGNlN3puWCtTb2dPYTlLQWpqdzFZZy8vWDc3LzlvdDAyRUp1NlpndncvL0lkL09GWUtud0syRVpIaDRTenNnNzBEVEk3NWlYVHhEOTErYk4yT0dXdXkvRUlRYzErOWZCWU5IdnN0TjhiUzMvck5DK0RoWG11enpHL0V6ZXh3QnBIV2lEa3d1QjQ2d1V3TVpRRGdOWHIrcktONUxiOEFYQUU1QUdQMmV2L1pzWWFWdlFmeURlRDhXYm5EcEdYOEhqN2V4YU90ZmYzYzZDSnhjYzdoVmNWSHlNejVWWUM2S0JjR0lDbGdEOEhkdnF5bGpxajRScHFEdXdQWENDMUt0QWhrS1hlVzNUZks1SkYwL3B2a2FjcDJXSmFMNHhtbUsvTHN5ODM1ay9OaGZ2VUFMNTRqZEtHTXRuUU9ENDgwOExsSld4NFlsUUYxTy9uTkFqZWZKR2RwN05pOG5UQ25MOU5oZ0FkbGVTRTVDYy81Z2M4ZXp4eHZEKzRHOUEwdkIzWU0rSjFjdGpPU1o4aHpmNzY2RFJNdS9LQmJ1emdERHZEZGJvNlZsVVZKeit1TjBmYTd1VEhUKzNxeTlTSW1LNW9PUUs2QTNCeE04K1hkTGY5OXlKZFFlekV0Zm5ZOHhuenVWekExY0IrMElXN3FudlZoNkpSbDZpZStRVENla1lhRmlGQVVCZlllNzJoUE8wWmtHbmRBZnJSRXVxZmJNVUF2UU5rK3M0YlIrOEhUbTlvcVhNTVNOTVpnRFFFSFBTTHNIMDl4UEdsVm9iOFJSd1M4ZGVNY3pxNHZNa0FuRkFVeGtMUU5NMnVNV2VNdXdpME5BNHZ5V25mV1lCY2V1R3dZTDJ0d1dzUUFoeVJmSXcrZmFWOTNOZXNJaUtSSzZaVkFQWktTdmVIdjBVbUEzZVdidmNPT04yd3pGblM4bUp3UWZPRGxzREs0OGczS2xnR1lvSFg1WWZYQ3Z5MXdPdFlXQ21EMCtRVWtYMDVqNjh2Sjl5d0Ezb2RFNklSd1R0TTcyaDhDUk1qZ0FkcHA2aGJVUVdWQTU3UGZtZGFmODNpWjE2WjVmSytweTluZ3pwSVFYcG5zVk9SWnBrOVdVMHBxN2lwajJpM3ZOR1FNL0gzZWJHZEdNWjRPOEgzdEJpN3ljYVZvWTlHWnkvTU1hNnVMZXVPYUdCLy9BZ0VBYmw3WlJDZVhlZUd6NTVVQmZiMTZ3WmZGTncrMmNUeWU4bzhqSXFCOWJ3ampneUZhdXI5b0c2R0plK1lnMytsMDNuY1BBYmpIL0hZZWJPa3hJS0Q4WWR0R2tnRjlOODhjb1d2b1hETm80L2hHaW5jNEhGaUJwRlpZR09BeWpaYVZ4emNJT3V6aFh1dVpsTS9VRllVdWlTeFR1SFYxRXpldmJPZ0EyL0E3NERKbWI5YXdreWxzUHJUaHloKzhIQ1hnOERLeW1yNEF1T0NpOEpSR0RocVdqSHNZOStEUkxoNCsybXNOM05hVlJBbUF2RXBENStVaDM2ODRxSjhVMlBrNzcrb0VnVlpzWkJjZEQxR09KSGlBNVJWQjJyWURoNURXM2ZzNmwzUytuSHdjWHc0MjM2SnVJd0RzK05vOHNYSzJUMDhGNEVWSEl3THdadktjTW9PMUdZRDlnME1EbGdINFdmQ0UxcURCVE43ZVJHL041dkRtWTJZQnNNQnIxMjk3a0E0dUIrYmxTMW16Yytobk93NUthL29jMEcybmdtdnZnajh6YTROMUNNSk9nYzBqZitzYnU4UUhhMnN6eXhUVzFoWVpmL1loZ0ZoSyt1N1MyUldzcnd5Y3hjUmFLbmc1OEk2UHpmUE8zaEJidTBlQjdDUWVReXg3WGtEK21jNnVCNENWbGNYM3Q3YjJFRnRHcHkvcHYzM3ZvWDBDUVUrSXNOdk1Gc1QyckNjQ0tZVnVudUVZY3hESTA3b1BXYmtsZGE0TlZRU3g1YTJwTndVeTZaZ3BlUVF6WWM5TVZDa0lsQUVGZEE4ZFVEZ2V6ekNhekRIb1BYL2IzQkxwVStmY3lnQUFGODhzWTNHaGk1OS85Z2l6a1RYanM0WlVnQnhyb01uWEdTeElRWUtqQndtdTdRcG9nck1pbURRTEJveGMyMGRCdXJ3OXV1bDc2Mjg2QmgvOTRqYis0SWZmT3AzeWFraEFDY3AwWjRKS3pFbmNoTTBTVDR0eGlmSGdRQmlUTVVpNjNNR3VvQytCSktNVTdXb0l4aFRFQ1FBN2tNTUJhNG8rd3ZOWkFEd1VrQkZBVmpzMTdZWXlFUS8yRHN4WXU1ekpyc2ZJQ1VycFZpTGpFK2VWbitobFdJcm4vNCs5TncyeTdMak94TDdNOTZyZXE3WDNmUVhRYUtDeEVRUUJrb0s0U3BURWtjVFJTQnFOeGhPeVBTWTF0aFZoeWpOamgyWFpuZ2twclBIOGtSVGhhTXZMaktpd1EwTXJSSTluTkpRRTdoUXBFZ1dTSUlpTkRhQ0pialI2MzZxcnU2cHJmKy9tOFk4ODUrVEplKytycXRmZFFEZHRaOGZydWpkdmJqZHY1dm5PT1hueVpMd3hIYVVSTmxDS0t4a04yeVNHckthK2RXbFhVVFJtTmxWU2lIU3lSQmMxRFRNN2FmZVJVem9SamZlWUZ2aklDWG0rcnpYYUt3L1k2b1BhNEp6RHVuVWphUGdrMkZYeUdlNTNxRFdBZmR2WEcyTTZCdkw0WmVKMzhvRHN5WkowM2FMQUs4ZlBZZU82RVNGeXBob1pMNGxBeWhqcUUrU1hBSHkzbnd4ckRXKzdKUCs3di91ZkhBVXdwUkZHaWtoeEtmN3E1U2tVeTUwRUltQUF5V1p4bXN3RFRaOUFhZFVKbk1ETGxrc3czMCtlbXpaSkdpdmRFOFZCTnpqd2RuZnAya0lJQVpZWXlOL3g0UlllUDdRREc4YmIrbjVSZFovZVMrN3RqeGljUTdCOVYrMC82ZHRNZ3FSZ3Zyc0JkZGkranRvRXUvMk9jYjFpWENmcExrNU80OUxrdGV6WmpmN3NUWjFVYjZYMGNyc3pnREx2VjE2bVVIcGhtS0E4M2hCWCtiOUVJSE9tcWpSdXkvMWV6bE5xTytyUzYvdW10SGJ1d0xhdjFJWTZNRjVKUFY4R2VKSzJybFFtbVRtdWJZT0p1em1BbC9WeHU0MEtDaEVSa0JjV0ZoR0tvR3U4MW9sS3cwUEIzMHJGZHUzWE96RzBReWE5WitYNUpNa25hUng1V1QxK3JsUnV5bE0ycUV0U3R5NGw2UHNBZHExZm5sZU0xdXg3WlcyemhvUmUxZUFyQnVvVkhYY25qSThQbTlQZ1RJYlNPQUlpWUIvY3V6bEs2Ylp0Z0w2Zk0rOXFOUlZIVDF4RXAxTmdjS0JScmF0SENNdkxXRjdxclB4K2VYaHVZdUx3VzJMWTlYWkw4clIvLzNieTNqOEQwTS9VU2U1Sk9veWNZYWRUWVBiYU5OWnQzUnpUOEU4NFQwSXFnNUNzSXhXVUVibkt3Sk15VU5vckg4dElrcnlRbjNnZHBmNm9qaE5wM2huUzduVGJYUURCTzJEOVNPdU9QR05lbGhjY2M5NU9DVmk4R21nMjhPakJIVGgrNWdxT25XRjN3Z2JNNGozL0dHR0RlVjRCTnUxNytaWjE0RmNDTTZUMENXeENWazc4aFI3bHhZZ2pyNTNFaDM1MC9acjZwWmNVdm1LZVZiTFVTZW94dm54RFBlSnRYQTVvZWZaeUtoakFvdEs5dEQwdnlCSkJ5ck5WMHBOdGM3bWRHWERuL1dvQlBtdFBCWHc1VlVhblM0QmRCL0RsZXV2eW0vYXZGZUNqNU02SFdBbXhZRkZaMW41RmVyMCtNeHZWOElDdWowc3JIT3Z6VlhJMERMWnVqNVBaV0VNN2twTXVtMC9lMEZVdTdWTjVMM1djSThtbGo1aDVFVWxlTWtYL0liSEZaSHlKQkNLVkNna0VPSitFQVM1ZnlxRUFrRWYrVEJnMm9iOFU2VkVJQkNyN3dsNWxibzZPdFRFNDJMQWZ2eVpmR2d4N3RxL0QyRWhMR2JQeVo5QjR1ZWJmeFN2WGNmN3lOYlJhWlFjN3FmeDZLYjd2clhOdmlhb2V1QTNxZWdEa3ZYdW1LQ0xJYTZSeTlTNjdCZ2hYTDA1aDNaYk5BSU5xQkdZQXJDb0tqcUk2aUZWanpZYkhjcmVBcUpJc29Ec2VWREphZlhBZ3orWEdtWnVZQThzc2VJZUF5UG5HN0FSeXJNZHljZkp2SEJ0OE8vdHhUWUdJTW90UEJYb3plVUVFNTRCN2RtL0V4dkZoUFArRDg1aGJLQ0JTZlJtSXMvVmpBN2hXeXJmUDZ2S0MwamZQcFh4RG9QUWRURmtja1pjWE9ROENZZkxLTlA3Nm1aZnh3UDE3c1duRCtBMzAxeHJUVlJHNTlMeDhROVZuaEdyY0RRQzd5VldmdDA5dzd3bkFkZldWNkd1ZDlGNHV2My8xL0ZyU1VHMWFNdi9WcHpWbEVRTzRBVVdaNXdvS251ZVBqL204YzVpNVBxZVNJQ0FTSWNFUkwrUTVXNlQ0MitCMFRPY1U0SHNzWGR2OTg1QXlKWTJyRGtNRjI3cnluRTVCYVVqc0E4ZENFTE1GUWkvQk5DOHVjOFk1Snd5T1p4WUYrb3pMOWJ6RWliUmtLdVU0cFFmTTNuZ0N3VE90V1cxZUVVYUcyL0VZV1NLVE1QL2dkdHlPajdTd2QvdjYrSTBZVTV4Y08wcCtET1RIZmJiYzZlTEk4Zk1BZ0tGV3MzN2k5Z2hMTS84ZkIvbFdhM0JpYm00QkZ0QkZjdSsxTHIvdm9ZTUFaTDFJeGlZcmJuZ3dFeEdDYzJnTmVDeDFDaU9sVSthOURzeXBpdU1iZlM1bElmNml1MW93NThtRUlNU0JRY3JaeGtMR1JnYlk2Ty9PQ1hLMEw1dzQ3NmxQSjh0K3pqbHNHRy9qL1kvdXc4dkhMdUxreGVuWUR4U1BlcFV0ZDVraFpDK2dsclF3aHd1WnZpMGJldVhTblB4a0hsdFFUKzFPZGVmQWR1bnlWVnk2ZkJYYnRtN0VBL2Z0eFliMVl6ZlVmNW1rdjhLOHJnSjZIbHYzdkFTNzhmK2FPbFlDZHd2c0dkaEtrcHNBOTVTK1AzQzM5ZHlvOUo2dVU3bTl5MXdONEt2YWdNUXNtblpUWk9EVnlaWUVsdER0NHJoemt0NWh1ZFBCOHVJUzVKUXlTZW5nUUQ0NXV4RUpYMHJSdFhuTFFCZ2dUeEptMGxJbUFPSTc4NmVpUVNRZ3FQN1NGcHI2VXBVVGxMU2JEV2Y2WHNvbmFTL1RaaWR6VzJXRUNObVUycS8wTnFNVlNmdWh6d0lseWQ1SEdod0tkYmxWZWlWQ3V6Mkk0WWxUdUdvQUFDQUFTVVJCVkpHV2ZvdnNoZXpZNGY4SEdnMGN1bXRyOU83bjBuS0xkL29sdUYrVGEzUFAwdnlSWStmUTZYUkJBSVphNW14Nk15SHFwSGdBV0pydDIraHVZdlVrTnhadUI4aUhILzNSQjcvN3hTOStkNWtJZzBBaTFtQzFlWXhMOFZNWEw2TW9DalFhRFQwRFhnaTdxTXlqb1Z6a2pBY0hHaUIwWWhsV0hjOGFBREhJRXdKQWNBZ2hjcFFCU1QyZnBIcW5BNGQ0a0lpL2V0RWliQmx2dmQzOXVHSVF6aHo2SjBudlZwb0hRZnVOU1JnR0doN3Z2RzhIdG13WXdmZU9uc2NpVHpvcmlVZmdUd0NkMXZIalQ2UjYyTDM0SnAydXR6T0JrTEtGT1U5ME9DY1MvRGliMEpHcHFKS0ZpNWVtY1BIU0ZMWnYyNGhEOSszRituV2pQVHByRGYyNVlpVDFUa2QxbDFWQXJHUlpvOVJlQnZjS3NKY0tzUGQxNEp1cUxvTnIzbUQ5UGhXcFBJOWZPVjBQUU5iM0tyZUIwdnRTL2o2MFVuazF6NlY4WlhCRnN5ZnpRUUhkcVlRZnA1VFJTVHZnK3N5Y1dzK0wzM2xSQmtpY2xRNEpUZ0UrVXhsTFhlWSt4K2RjZEJlTW9qeFo2bVBFZmQxNUpQZENDZXhGRlcrRkpvbFBBbEJzUmJTbmlTL1hJQ3RBeFlaUWdHb0FDTkJuUWsrdEVFVkFWT2xEOHNWeDRyeGptaHl5TVRVNE9JQ3hzYUgwZ3RuZ3p6NnNYdCsvZnl1R1dnTzVtbDYva1V2cWVjZUdkL3k5VHAyZndxVXIxd0hFWTh3SG0rSlEzWTdqYk1DbnkwNjNYM2UyUDVpWU9IeDU5V1EzRm02TEpQK2J2L24zRnIvMHBlZWVCK2c5Vm5KUGFqT0dGQjVFQy9PTG1MODJqYkZOR3lPQUlGcTB4L1Z3d0Z1SkhwRVRhelljaWlLcW01MERnZ2RjY1BFdkl2Z0VOcndnY0JyaWNoMWJ6Vk4rbksxM1RsWDFjSWtoR1drM01keTZIVjJaaDA2M3dKdm5wOUh3RHZ0M3JtZVZHNFFlSVZ1UFo2Q0hTMm8xeHdrSmNSTHMyanFPRGVORCtNNlJNN2h3WmJaa2VJZGNpb2VSMW9YUVN0cVFnRDhDTW5TL2ZPVG1vZHNVQTJUN1hySzhseDlnOG1UZ3FheEFiYmh3Y1FvWExrNWh4L1pOT0hSd0w5YU5qMlRQVjhSNDZubXpSa0RQNzlZQzZsbU9OUUI3ekg2THdiMnU3aEpOTFlPdzFrVDFkZFNCdTIxN0daQnRubkthQ3NEYmV1ejlTZ0RQRThRblZGTVZ2VFZ4ZDZ3cTlDbzhFK0FqdlptOVBwZXM2bmtPT1ora2R5bFhKSGtCNVRLUUp3ay9WcEswQWxaTlQwbXRMNkNxYmJUYVQxSUpQUXRXNVM5MWtEN0srMHZ5RzAyRENEeWlkbGZnUnV6SHVLekpkQnRnMnNKcWZGbjY1SVk3L29JYUwrdjM1aHJlbS9sT0dCMFZnTTlHcmZtakl4SUFzRy83Qm14ZVA2emdMZjBzeXljSjRPWGJ4ZmlGeFE1ZWZlTzhsamMwT0ZDcHgzUTJTakZZbmx1bzl2M0s0UzFUMVFPM0IrUUJnTHgzRXlFSXlNdFAxT0w1dWp3Uk1IbnVFa1kzYnNqVVYzSVNIZkZBRWlrOE9FS3I2VEhYTGRMNkZ5VkpQN0FLTGdxYWNRQ0lVUWtwZUtmaG1BYWpmRkNITktBY3RxNXY5OTBCM1lMUWJOVHg0UDJISWhBdVRGN0h5WXZUNkhhanNkcjA3Q0lldUhzckJwcytYNWNEbEJtU1lVL0tCZkJ6N2tOSHdIQjdBQjk4YkQ5ZVBYRVpMNzUrVVVIZFN1dkprWTdLNUNBS1NqQUlQQmNNVTZBRXhhU0JNQVRHRGdCbWZBVExEQkJiOW5QYUZWeldhemgzL2dyT1g3aUNuVHMyNDlEQnZSZ2JMWG5JcWdtMVQyaTFOSVlzOXlpYWFoNVM2WUpLTitXaTZnaEpEczVaUWJjYzNPMHJrRW1rV0xwRzZkM1dXd0ZrVXc2Wi83TDBGVVppWllBSEtHMjlkWlFrVEpmbWhFcjRjczhTWjFMZHh5MnBDL01MTE1rTGs1emtjNnVpbDJ6aVYxMGxmeVNBbGFVL0ZjQkxFbjkyNVd6N1RDQUQrQ1VWZm9BeHNMUFN0MUk2Um05OTV2U3NDdW0vdEJZUDVPdndRZzFkcmdGbHlaKzRVS0h4SVpoK0I5SnlLNkJhQU9kNGpqdUh3VllUallZaFV1VkJxWmZ4ZXNOWUczZnYycGpXMjB1YUZkVzBtRzZTWnkrOGRocmRidER5aHRxbHMrbkJZeklmZEhxOWNIVzIvRlZXQy8rdkJQa3dNTkQ4eHVMaThqK3lVbndWOEZQOHBaTm5zZStoKzNKT2tMSlB6cEpyNUI0SEJ4cVlYZWlpdlBZZVlJM3RaTkNtTWdMSkliSWx4aUZ1eW9lM2NTQU1EVFN3ZnFRL2c3dVorUTR1WEYzQTZOQkExQUlNTmpCUWUvNXg3OUF0QXFabUZqQjViUjVYcnkrZ0tBUkFJL0JkdmI2STd4dzVnNGZ2MllaMW82M1VQNktyMGdoU2pwNnlSNDc3TXRaMzZLNHQyTFp4Rk45ODhTU21aaFpqZnloSVd5QTJFamhLMzlRUWpQVHRxdEk1WTd0Sy9yWE1nR0VXMUczdUdnSVJjUGJjSk02ZG44U3VuWnR4LzcxN2s0U1FKVnhUVkJhN0V2TytJcWlibXpLdzE5VzdKcW05TG44dHVKczhOZUJ1ODY5Vk5kOUxlcmYzR1RoclhEa05WV2o1NnBxQ1ZRRGVIQ2RxSlR4TDlBWGg3WjUyT0FkUHVSeTZ1TENBWkRHZjFuUXRzRHVESWdyd1h1VkdZNFNIREtCVnNwWjhBcUttLy9MbU9aN0Q1aHVWUm80d0VTa1RyNnRMZXFaeExNQ0RBRFJFNEdJR0pqQm5vQW9GN1djSGNtbm5TeUl6VGdFOFVWWW8wNVNCUGNYdGVJR3Q4eHc1d0VjNk1ETGNodmVPVDhlekgxVCtwTy9jR21qZ29YdTJKeWRFTHVwcjFkZ09aTDRScVRNY0FEaCs2aEttcHVlMDk1eGpvenZUcStWck94WkJ3TUsxT2ZRWnZ0bHZobjdDYlpQa0gzMzB3Rjg5ODh3clN3QzF5aXA3QWZmNDRlSWdtN3A0QlozRlJRd090V004WkIyWnBXcm1PajFMOVFOc0NDTVNZSnl4YkEwcWhuZElMbklsWGh6bVJCQVhhM3JTYlhrUjRKbmpoTVAyRGYxTDhWZXVMNkVJaE9uNVpjek1kN0RjNldCcFlSSHJSdHNZR1JwUVA5RGlIckliQXBhWEN5d3VkN0hVNldKaHNZdVorY1g0WGlDZGFMYnZpQWdMU3dIZmVlVXNEdTdkaEgzYjEyVkFuOWJuWS84cVk2TUVDNGxRTW5IYU1ENkV2L0hrUVh6MzFiTjQ1WTNMYVEzZXJMdkQxSjlKK3dMOEZxQjVpeHdzWUdmNVYyRUdTSmlCdmo4QmlJQXpaeWR4OXR3a2R1L2NndnZ1M1l1UmtWN2ZzbHJCcW9CZWs2Z08xTk5sZjhDdWFWWUU2dFNPS3JpYldtdVlnVkxSRlFEV0d0ZkVDS3hOZXJkNVZwWGVMWGliZDBwcGNtWkFqZVl6ZGJoWWtUdmRKcWN3eEdEcExKbzVzN3dIWUhSMEZPUGpJNWk5UGdkMU00c0U3Q0k1Q2xnNGdxcnk0VVJMcUtRcHFmbjVsWk14WFdKTUJLZjE5RG9UU0l6SE5LUnJvUTgyV3BjZXRWQmpaUy90b0dTVUoweElNbmExejRTbUlxT3YxWFY0N2ozVEgwSVRaQWtFWnV1ZGM0UjJjd0FEQTQxSUw1d0h1WUJRSkVsYmh3ajMwMFAzYkVkN3NGbVMyQk9ReTdVYzVnUCtQdGRuRi9IcWlRdDJFS0kxT01CTEtIWmNtNEZWbXBmRjBqS1dsNVlyMzJhRmNHWmk0dkRSZmpMMEcyNGJ5UC96Zi82cnN4Lys4RDkrbWdnL1ZwYmdRd2h3THEzSEFBN2Rib0dyRnlleGRkL3VDTzRlQ0M0T2RwSHE1VnNRNHJhNndRR1B4ZVVRMSt5cHRGY2VRSEFPRFpLQmgyZzV6OXZwSXRBanJoL3p3RTRTZkZUYk5UMndlYncva0o5ZktqQzMxTldCUnlBMHZNZkNVZ2NMUy9FWVhsZWR2N0hUeWdTd1JNd3NDRnJQVWtmZXVJU3BtUVU4Y3M4MitJYkwxdUNabENVUkhqeVJRK3ozNUE4NnBtazJQTjd6NEc3czNEeUdyejkvRXZNTHl4VkFWOURuQlhacFp4WDRJNkVwaUNvT2Q1VEpnM0djbzh4QTZYNGx4SzN2eWF4UFQ1KzloRFBuTG1QUDdxMjQ3OEJ1REErM1Z3VHgycEo2Z1hETkRkVkUxRlczWm1BM2NiWTk1ZHczQSs3bWNTMjRWeVZxVTFjSjRPdkt6d0Y3N1FEZnM4eXNUeWxOS2hJcmVnRitsdEJka29abEc1MkFiUVFMcS9aTjE3djNic2Vwaytld3RMQ293QjZmSlZCUlMyNlhndzNnS2dDUC9JK1dsVzd5WjBDaUk2NzB4UFpwWWw1Uy80cWhuZUs4Z0RhQWh1UjNySElYQWNEUTJhU1dOMUk2STJ0UzAvUDhKNUhDTFJNUTYyMlF1THRPVEk4WTRvRWNSa1phYkEvaFFENHduWllsWGYzb0FJQURlelppMDdwaGZ0dXF4RjdXMkRoRDQ1NTc5U1JDb1NNTUFERFV6cmZPNVdQYmpydDR0WEN0YjFYOTUvck4wRys0bmRaaTFHajRMeFJGK0xHeXlqNE9FckRSSEsvZklPRHk2ZlBZc25jM0dJdVRwSTRJdWlFNGVKK2svRmJUWTJHcEFJVzRuU1ZhNEFOUldnZDhJQVNmVk85dzBRRkdrdFlqSmZDVWpQSVU2SW13Y2NNUUdyNDg1VllPbDJjV0U1ZEtyQ3AzSGdNREExaGtEakJieDVQT0lpVTNER3lKYU51LzZsZGZKaFFENkptTDA3aDJmUkZQUExBVEkwT0Q2cVlYM0liTTJoNUpmU2lhRW11a0ErZXdaOXM2L09LSER1RnIzM3NUSjg1ZDB6MnVkV3Yyc01CUFhLNTFWUXRoVXRJN3lUbnpFbWNOOHVJM04ybHFJYksvUUVRNGVmb2lUcCs1akwyN3QrTGdnZDBZR21wcDIwekMrdndyUk5TQmVtMGUzQ1N3Yy92ZUtuQzM3ZXZGVEZnaVdBWmlXNzh0cFNmellOdEJxUnlwSXJ1M1pjb1lscVlvZUdlRFdOWHNjRVpxTmdDdkFyMEJWZ0U0VWIwM0doNTc5KzNFcVJObjBPbDBkZTNYY3VvaTBWdm1JSHN1VlJ1cFgvTFpNZ1NQSmEzMk5GVUJIcVgwdGk4clZ2d3k3MlNOSGZLT3Flek1TdDdjYTQ4YUFZc285YS9HZ1VEZXBYdXpkWTdna2lxZUdZREFSbE90NWdBR0J3ZEFGRVUwcGNtQ0VVNjBzWVF0RzBadzE0Nk5hZjI5aDhRdWY0WDVjczdqeGRkT1kvcjZBclNYK0wrNEhwK044SFJiTTRFWCsxZlZ2K1VnZnpzM2RvZVJrYUV2SklDeWFsaEQvTTMxNVZQbkVmam9QbFVUNjlST0JFT01zd2FhRFROb3JicllBbVdxTytZejkxeEg3c1kxQWN2V1ByZk5MWGNEcnM0dW0vSlNtOXBEclZnMi80cmFYMEFSUWtwSEFVVXBQUkVoRk1rZ3JqQnI1Tk96aS9qS3N5Znc1cmxyaWFOMWR2QTdZNWppTXVLandSQzhvZllBUHZvakIvRCtSL2VpMGZBSmtJTUJjNWcrTmRKNi9HYnBlNVd0N2NGR2RrSVVZTDhMWnhaRzhKWUZpdTUvM3p4MUFWLysydmZ3NHZlUFkyRmhLWEVmd2tDVmYrWkdrNXAvMHVqMHpOQUpvdXhubXBJeFJhbEVVNWNwUi9zbjNlb1lGc0NsY3I3U08wSEd2SjFMaXJFNVE2WnRMOVZYbWN2U05sdUhsR2pMbHo3Uy9wUytNK0JTcXE4TzRLVi9MU2lEeExVczZkajIwam9uY2wwc3dTSGY0dVpFVytqU0hFbmdFT2RHcytHeFo5OE9EQXcwb0s1ZUhidUFkZWxFdWZMaE1PVVQzcnhKNjIwNS9CZXVlcmlNQTNJM3JlV2ZjK1o0V25ZbmExemlPcVMybGsvQ1UvZXV4c1d0dW9WMTlua3F3OGJiOXFlVDhPU3ZUMm5sV1NPbEUvZTZJeU90L0JBWnVIU3R4K0JHdi9TUDhEcDgrUkFkQlhxZlhPdmFiM0Qyd2xVY1AzM1pUaVlBOFhTN1FmVjlzcm9VVDBXQmhmNzgxWGNBZktXZkREY1NYUCtxemxzYW1oLzYwRDgrNGIzYkxZT3AwVWcrbXROMVBMUFllNDhQL08yUFluVEQrdVJqV1Q0Zy83V0R4bmxnNnZveU9rVmdIODArZm1qelBBMUE2T2xSemtIUGhIWStUWElkdUFDR1cwMzh5UDFiK25yWk01UHp1RFM5bURoTlpmdmpuOG5KYVQxLzJPSnF4a2NhS3FkQVVDS0dsbmtKTmRlQkNEczJqZUdKQjNhaU5kQlVKZ2d3aEZzSmJyd0lXa2ZPSkFIUjV1SHE5UVY4L3BsanVEQTFtekVyeWZyZU1qQWhpeXV5OUlHWmxRaTRSYW1jb2doSnZSOElYVm1iZTR1Q2IzanMyN01OQis3ZWhYWXJON0NrbWl1NTdUV3JWcHB2Q3VBbXBrUjNTbzk3U2UwbXIwbWdFRjB1aTdLYWNzbTlObjBKYkczcEpYQzM3MFcxNlVybEswT1Q1OG5hdEVxYURPQlZLay9RSHpFNjMxWWxPQy9TUGl2OGtrdnJURkxPODBySkM0dExPSGY2dkdrSHFRcGY2Sk1FWnlaK3BuRUFlTGtBcFRyem9JWjJQVWRhQmJNcWFjVzNCSmxrbGc1SXBETGxsS2NwTTk0NW8ybzBpMEh5bE5PSFpNQ0xSSnNpL1FydzNtUGQraEVXRHVKdW5SQkNwRDBGZ1JCMGkvUzdIOWlEOGRGVy9JYXBLeG5JVFo4N1Z1TXpUYjgrdjRpdlBQTWF1a1ZobU1iWTFyR1JOamFORCt1N3BNRm1HYzRVdDNSdEZoZU9udW41UFdyQzF5WW1Ebis0bnd3M0VtNzM1bTd5M24yUmlEN2VTMlV2Z3lPRU9QaXZuTG1Ba1EzcmRjdWI3Sm1YeVNrZTdzU0t2ajNZd1BKOEFZSkRjQUdldkc0TGlmdmc0NHBXZ0lNUEJPSlRpR1M3aVEvczhJYkxCUUh3RGx2VzliY1dYd1RDcFpsRjlaTEhiNmlEc2t1RTVVNjNmbHBid0M4UngyUUVJOC96ZmV3eVNjdUFmK2JTREM1ZG5jTjdINHJyNjdLK0ppdVIyZjU2VmxzU3JNclQ4VUNQYXY0TlkyMzhuWTg4aUtkZk9vM3ZIRG1yeXdiNU5qdlRObTZ6bGRxVWNTRFJtRURmSTJsUUlITk1pYzliR1VJUmNPTE44emg1K2lMMjc5MkdlKzdlaGRhZytMSE8vdFNHVlVHOWRFRTFDZm9CZHYyL2t2ZldnbnU1M2h5RXFaU3ZGMWpYdGJjTStvYWhLTGVCVW5xSkU4QVdDQzRESm1OakJlQlZleVdESGs3Vm5HSjA2MHBnSWRQQXh3SXhQTlRDanAxYmNlSDhKY013QUZZN3B0aWVQZGVXcUQyQU5oU3BYdk9HWEhleTZPOFZtSlJxWGp2SG90TVowc2ZFNzBIOHNrcEhXZTl1bmVpUTdmT2FlUG5PRFNEellSL3B1TkF0cDRaM0lBRmVoNElURFErM1ZOSGltVXA3YVZmYzd3em5DSWZ1Mm9yMVkyMnp4TWdXOC9tckoyYkwxUFBNQzI4d3dHdVBhZCtOdEMxVGIwZGhsZmtHM1pCVi9WdXVxZ2R1UDhnSDU5em5peUo4UEs2OTg0cTNXWWQzenF0M09TTENwVlBuc09laCs2Qys1Z0YyTWN1cUswQXR4QWxBcStrVHB4aUE0TVUzTXlFeUZnRUJYdGZnSFk5T1lSN3Nkam1FT0toOEFMWnZxTmwydFVLWW5GbEV0eHZnSEZBd3dVanJmUTZMQzB2eEtGaFhNMk1OZ0dmUlRCMVZja2NDUlJ0bmZVSmJ6M1R6aXdGZmVmWU4zTGR2TXg2N2J3Y2EzakdnSjRRWEJ6b3lnMGlBSDRqV3NDRlJ2NFozZU44Nzl1THVuUnZ3dVdlTzRmSzF1UVRTcGszbEUrMENFNTJjZUJnMXRubGZ5L2k5blZxb1VBUWNQM0VlYjU2NmlQMTd0K09ldTNaaGNEQ2ZQcXUxcDRhT29KWmdWSkwwQit6NVpRNkNLZW90QUhmelVOcGo0YjdNb09idHJrcm10dDIwaGpTMUFPOWNtbWVNZUQ1aWxuRnU0M0xwWHFYNjlHNVdSVzhkUjBtRllzOHlPamFDcldFekppOWRTWXlENVFrVThBMnpZTytScEhTTFVoV3E0R3BqVFc5enNreEFNRXlCam9HMFRzNVl6bmtJSWNUVDhZaVFQSTNxL0JkR3dEQU9TTmIyUEtVelJvQUlDZFJoKzBUMnc4Y0tvcHJkWTJob2tJLzBKb1FpQW5Qd0FRaE1tOGxoMTVaMTJMOWpRK29TNFdxNG9WWjZ6NTBXQWMrK2Nnb3pzK0pqM21xK29qRjBhN0NKYkl3ckhVYjVBa1RBd3ZUL0QvSjFnYlp2My9pVk0yY3VkNG1vdVpvMFQrUnc1Y0psTEM4c29EVTBiRGhMTlE4RFFUemlRYmZBTlpzZTNTSkU0emxPRytDQUVOZDFOSThqRkd5OFo3VUVGdWc5SElhSG1oaHQ5OWQxbDZhakZPL000VERXbW5kdVlZa1pHNm9GK3ZKNkxVY3FzR2RnenhNNHNDYTdiR2Nnb0MrUy9aRTNMdUhNeFdsODhMSDkyRGcrVkFGNndFajV6akJEaFB5UUhpWi9PN2VNNGUvL3pEc3c4ZEpwZlBPbFV6b1g5T3o0N0JjbCtNS0FmaEdTNWIyNHY4MjIzaUhsdjluUWJ4RkZFWEQ4eERtY1BIVUIrL2Z0d04zN2QyQmdvSDRzckFycTVsbWxIVFhBenRGWnhucHdyd0ZxamI0MTRHN3Y2OEJkeXl6WFV5dmxrN25tbkZrZVUxcE5Hc1ZKSFlwT1JHVjJVMnNrZFZaTmVjY2dvSjdzV0pDQVliNDVyWUNFQUhxMHhuZlZkQ3o2cjFzM2hxSW9NSDExbXFWSHA5SW9UQjRucGJyVWZzZHBuRS9lNmFxU2ZENHk3T1B5bUxIZnlFcmNDb0Fzb1dzNmZpa0tRTU9udERybnVFS1pmM0ppSFlFeVIySnhodzdTSG5uTzZKalppa2RVYzk4U2ROdWMwTmloNGNGSWc1bitlQit0OWVQSmdJUUNEbU1qVFR4eTcvWjRuandsZXd0U0RpN1pUUWdMSlF6WDhkT1RlUFBzbFZJbnBkNGJiZytZZnJVb1gwSjh6bFlzTG1KNXNhK3RjMmNuSmc2LzNFK0dHdzIzL1VTVlQzLzZ2N2tHNEZzSnFOTGtqZXV1UVlFcEJFSzNXMkR5OUhubEhpMTR4UkxNb0dJaTFSNW9aTUJtQVNNRWMzcGFTQ3BqdVpmMDlyZWpUeWwrWWJuQTlmbE96M1BaaTBCWVdGaFM0N2x1RVJCQytoVkZNclpUUTd0c2JUcGZ1NWJyV0hhSTc2R0dlMlRBbHRNRnd0VE1JdjdzcjEvRGk4Y3V4a2J6NUxJRVNPTGtER2JuMHFUSmZzN0JOenplOStnK2ZQeGpqMkhYMXZGYTYvdGt6QmcvbkJJUjh6eExSMGtUMFpYZEF6ZjV1OUhRTFFLT3ZYRVdYLzNyNS9HRFk2ZXgzTzFtekFlWm0reWZxZHhLUFBHMXE5b0xaR1hHMUduc1EwRlBua2loV3E3T0VXR1BUUHVrdEhJZUlHdERTcysxMlB6NmpxWSthUXRxNmpIcHBHK3liMi9tdjg3bERPQlRHd0NvY3hnQmVER3dBMXpteFM2TlZWSGhpOUZaeko5T0loUEpuSUhCcFRHdDJuYkhjOEFiSXozT0UrT0J6WnMzWUd4c0pEOTMzUm5ETHhkVjFYS2RHK2Q1WmtoS1JtMXFjSmNiMTdueXo2V2ZwSkZ6N1QzWUdOQkpmZDZrNHpQallZenR4Q0RQeVZud3hvN0psK3Z3ZWw1ODJmaXQzUDVrd0NmdjQ3Vi9tZzJQb2ZaQU9xZWUrei9aWDhYek5kNTEvMjRNTkJxcHprWjhoMmJEb2RHSU5sM2E3eTYxNWRyMUJUejN5c2swV00xNGxiaVJvVlkyenBTSnJXQjh2SmlmdW80K3crZjd6WENqNFhaTDhrQVUxcjVBRk40WGduZ21pc0RsdlVkWm1nOEJPSC9zSkxZZnVJdmRQMFlWY3lEQWNSN1JkZ1VDZkFCYUF6NXhpUUY4YkN5cEpKKzJ4OFYxK2NDRExUaUNDM3dOVWlPY0hSdUhWM2lkYXJoMGJWR1hFd2l5WEJEZnlUbGdhV2xaRGNpRXlJalJlRm1tSnpQWXFEYk9NRXJDcklEU0xnRkFyZHd0TXhPdDhvRm5YanFOTjg5ZHc0OC9jUmRHaGdhUmpxVk5La3B4VVNucjkrRHRMeXJOazJoQ0NGdlhEK00vK09sMzRMdXZuc09Ydm4wY0M0dGRXSlc5Z0piYURkaTFlSG1uREN3dDROM0d3TlYzT3dWZVAzWVdKMDVld04zN2RtRGZ2dTFvTmh0Wm1sSVdFN0dhdEo1eVVib3NsV1VKVlo2dGw5UWVIOWZrcTJFdXNoemwra3VnYmU3ZU11bmRORHVwdllYNWRJQ3VVd05tL1IwbUxvNWwyU3Z2YmJ2NGVhWXVsMkdkZUFjdFN3eFZyTk1hWVFBQVFyczFpSVg1aGFTaUIvTDFlV20vUHVQR21QUG5iVktpU0svS1FaL0xmNFpvQkJNcC9XVkRJR0xwTjlVaHgrakNwWDN1S2lHRHRScjZqUGZFbXpMa05YUS9QSjh1cDBJVXF2dmhSZm9tQXRydFFUUmNQSjBrYU4vSmQ0dDArdUVEMnpBKzBrcmQ3Z2tnRC9LUlZ1aXlMYVh2N3VEUTZYYnh6ZWVQbVYwNWFZekpTR2cwSE5xRFRjVWNRMmcxRDJ3VTBZMkEvTnVpcWdmdURKQ0g5LzZwb2lqK2U1M1l4SU9ENnRmbUw1KzdoTTc4QXR6SVVCd0FnYUxyUWxFTm1ka3A0RHpZOUZqdUJyVVNGK00zT1U0MjZOQmt3QS9DcWNkcjc2THFhTk82Tm9ZR0czMjkzOFZyQzJvRkNrVGFvQVFLRG5QelN6cm9LcG81RStyVzVIUHBpSmk1RVdKSXVzMVE0c1RhdFNmZ0UrSDB4V2w4K3ZNdjQ4T1A3OGU5ZXpZcDBLdWV6dGs2WTF3OHZDZE5maUM1MjNGd2VPTFFUaHpjc3dtZi9jWlJISG5qVW15ckFMcHFIcUR4ZFZKODhsUC9OZ0I4enlxbzluR24wOFhSWTZkeDR1UjUzTFYvSi9idDNZWkdvelJPZW9BNlA2cFV2Q0t3Vi85VWdEMHZWKzRycGR3MHVIT3FTdDRLSTFFTDNIbjl2ZE5ScFYxSjAxUXlzRFBBNllYUU95b3hBNDY5dmJIVVRxVmxNcEhnV1pDSTlNU1dUeWtSWkNrck1RY0NUY212UFNETEJZTERFZkJ0RzZDNjFmS1NuWVBMWE5iV3JPaFZCSUtZVHVhdDRwMkdJQXdLejJsU2dTcldUeUNrYWMvZnc2ekR4eTZoN1BBWllqVzlNRVZrbjN1S1BrdVFHSURnWTdvQUVYNWMzSnV1OGtOc2x5Y0g4bkU1ZGQrMmNlemV1bzY3M2hCVGIxN1NNbDRFMWZRODgrSUp6TTR0d1F3czVKT01WSW8za2NobVZtbk1Gd3RMV0Zyb1MxWGZBZkRsZmpMY1RMamRXK2cwZk9BRC8vQzRjN2c3YlpuenFOdFdKM0dQZnZEZDJIbmZQYXpxa1gyVVJ2MmpmK1BFV2xqcVlucSt3Mm9iVmhsWk5acHpjQjdWT0VuUEJPV3hlelpoMzlZZVI1YldoSm41RHA0N2ZzVk02aGhFZlFnQUZ5NU02ZGE1RkZ6MXNpSVJVVVdpejdhb3dOeWJ2eGJ3TTlBM1FDK2dlOS8remZqeGQrM0h3RUJUSjdaZDl3ZWdhUWw1UFVtdExNWjFzYjd2SDd1RVAvdkdhNWkrdmxqWlpxZExEU0VrOVh3SUtQVDZyZG8yUnl2YzlSOEdCNXE0ZS85TzdObXpEWTFHVmZ6cUthMlhLbDhWMlBsbUpYQzNZSnZYY3hQZ3J2V2E5bHZpVndGMzA4WWV3RjJXM20xWldkOVkvL09zbmxmSjE0RmQxS2IxZHlmcjc1WXBzT0NLWEhwWGlWckJ1bnFLR1ZlaEFCTHJOZUkrZ0d0VDF6QXpQV3VGOXRndVU2OWxDTFJhcWN2a2svZXZBL0pFSC9Kbys4MnkrQkxOeVBxNTlLMEU5SW5FamF5ZDUrbnI2NUtQb1EwaDJPV1lSSXZVUVJhbks5Z1dpUWdZSEd4aWFLZ1Z0UU1oYWZzaWpRa1lIUnJFZXgvZXE5dWE3VmlPZlJhQm5pam85eWZXdUx4eS9IeFUweHUxUmVvajZSVEM5aTNqYURXYldWeWFLMlpzYzc2WjA1TzRkdjVLM1pmcEZmNXlZdUx3ei9hVDRXYkNIU0hKQXdBUi9TbmdmdE5LODdKdHprcnpJdUdmTzM0U093N2VIVDkwY0FnbFl6bnIweDRFdEFhYm9MbmxlSFFzRzllSnB6eUF0OGtGaDRMTFNZWjIwWk9lYzRTR2M5aTVxVDlWL2ZtclNZcFhnQWVVdSs5MENpd3RkMks4WWMrZDRkcXBCNllsTlgwT3NsbWNTT3cxQUorczNpM0FJd1BlSThjdjRkU0ZhL2laSHoySVhWdkc0dmdXQ1lUa0hHcExocmh0Y0dtQ01GRVZ0OElQM3JNVmQrL2FnRDkvK2dmNHpwRXp5VW1Pa2VDandaMFk1TVg5c1lHQWdrSUYwTzdFc056cDRyWFhUK0dOaytjajJPL2V5c3RQUUFXNjY0aXpYTlVDdmp6cURld3hTUWxzVGNLM0F0empkVFd0Qlc1TGxDbFBVcE51clFDZjBOQkt6R0lvbW9CVjVtQ0tpOGtOcU5veXVFeko1YzA0VjJ0N241NWJ3SlkvdW82c0ZhUTZFdU9RQUVzUG9NdEVkYXI2cWkralBlVnhlbXZLVVlGT2VCRytqbjNPMjRhVjEzSHBHemtDRWJzWmQ0QnFQU3pnSzlzRXFHR3hqenZTMWFCWTlCK083WEJFMm1lak93ZGdxRDBZdGFjVUpYUFBEckc4QTVvREEzajgwRzRNTkx5T0UyODBGZm5MeGZiNnFMYkJ4U3N6ZU9Ib0dZaDIwUUs5N2JWbXd5ZUExNTdzQmZBeGF2NXEzNnI2UCswM3c4MkVPd3JraWZDYnpnWEkybnlqNFpCeGdJRjBBRTJldTRTbDJUbTBSa2ZpaHd5SUJ6VEkrZy9QUjFIeE93Q0RBdzBzZFFvNFJPQW1SN3IrNVlWUjRMK0VlQUtUN3BjSHNHMzlNQVpxcExJVjNnbm5wK1lqRU1McDlqd2xOZ1RNenkrbUxTV3JhbFhTdGtIN3B3N3NaWUxLTW9CYTB4c0d5dG81V01BWENWcXVyODRzNGw5OTdpVzg5K0hkZVArait5TDd4RVJPWFB6S3dSVkNXTk1oUHRIb0FrZ0grM2hFbjlDLzlPTVA0SjBIdCtNelh6NkNDMWRtYzJaRXVIalJDQ0RGMy9IQk5IRjVxWVBYanA3RWlUZlA0YTY3ZG1MM3JxMW1EYmVTSExjUzJLdjVlNEY3RFZpYmlEV0JlNW1oS0lHMnlkVmJlaSs5WTVsNWNBeVlqTkVvcjc5TEVJRFg5WGNnQVN2aTJKVzFlTmxHNTFrOW5YeFlwRHl4VEFlcm9zK3VKWU5HTVFNQU1RUjBxWDdSTUNDMVJ4cWQ0cTFrSDkydWFyTDBtZ2xVYlVOTFR6Tk5iYmJHTHYzdVZLM2VjQW1vaFk2bzFnSXd1NW1jQWZ6MDZsWTFEODBiYVhJSTRxdWVkeGp4VnJyQTljYmwwYmdUaW9oVVRSOVBFSTBvLzY3N2QyRzRQY2pHampLMnVLK2RqOW9HcHhaUEVKUDl4YVZsZlBQNTQreEduQURaRFdDQm5DK0hoOHplZUNxTnc5SjhBUWpkK2I2dDZwY0EvTHQrTXR4c3VHUFU5UUR3dnZmOSttdmUrL3ZLcXZsY1haKzg0VDM4L3NleDYvNTcwWENBODc2aXFyZXFkdStBeFU3QTlpLzEwd0FBSUFCSlJFRlUxZGtsVmNVbmkwdko1eklQZDQ0dFRlWDZmWWUyWXZmbWtUVy96K1QwSXI1Ny9Bb1BTaXRkeE9jT3dLWExWN0cwdUtSVXFqeFg2eVkxa0NhcXRZd1dJaTVBR2FOeUp6Z0VwSFY0KzF4Qm5iSzRzaU9kN1p2RzhMYytlRDgyalE4WnBnRloyVkt1VmQzbDdVanBBaEdXT3dXKzhLMWorTkszMzBDbktNek9nTFI3SUJDaEtBaHZ5M3I4V3NNcVRhbDczRzRQNHU2N2RtSDNyaTE1S3VxUlp3M0FIcE5SZlJsVXp2MTJnTHRwczgxcitJODZScUF1bmJ4L1VyMGpBcWFSbWdVYzdmNzNDREJwL2QwaGJiR3FBL0FJeWdtTWhRRkFxWTZVUis2VFE1bGNFd2RjbWJ5S2hkbjVOTGNWNlBrL1lWYmdxdVZMdWFVeVZ3dlU4eVlIZk52WG9lNmJsUVFIZVU1TVlQUWFpZDRJd3lacWVxVkRJcVNWYUVJbEhZRHg4U0dUUG5tNWUvakFOdXpjdk02MlVvV2lxRFdJNEowNEVrUU5SQUMrL0szWGNIN3lHa0lSVmY1Q1QwZ2NkRWdoQUhadVdSZVAvZFpCMlZ0TkR4Qm1UbC9HdGZOWFYvOHdLZnk3aVluRGY2dWZERGNiYnZzV09odENvTS9JMmt1MmhtelZ1R1pMM2Zsakp3RkU2VkRXY0ZVU0ZXQlJ3ek9nMVJTcmRrbEhxZ1pPOThrUWpRSnBPVTN2c0xOUHEvcXpVL01NVWpCbHgwRkd2QTFPdHM1bFcrUW8vUXJ6MHpSRnZyV3U3TDllUWJGMGIrc2dBcGRGQ0VVb2JlMnJBcnhzMHp0emFSci82Ly85TEo1OTdWeEd0SFNMa2MrWnJMUUd5aXBUK2N2RTFqdUh3V1lEUC91KysvQmYvZnMvaW4zYjFtZk1SbUlPM2lhRE94dG9sZDhxU2V2QzR1SVMzang1VGdhaC9FbDUrQ0l4WlltUXlTL1ZtZm9JVktyWE1IWFYvREdsTFMvUzdrVFVESTBEMWFhdnFWZEJtMHhlYVF1eXRpaFFTRDIyRGsxbnBDMEw4QURTLy9HNUJYaEJjUXZ3TVhFU1BSVlVhd0JleWhNMnduTzg1eUtTQ2o2SzhkNk1kWGt1TGJUYnp6SS83N0IrNmxGS0U5MXY1LzdqUldncGIwM3oyYS9CMi9Lc3ovd2swSGd1MnlYZjlhN3FQei96Vjg5bFZ2M1ZsM3pZaTBEbGtKZGxhSUcycC95WCt6TDMyWitFclFON04yUDMxdlZ3eHBhcWdlaHlPbTY1a3kyQkhPZWloWHpEZTd4ODdCd3VUczFFZndncThLVnZsUVlrMEJwb1lrQjJ4c2g0bE9zeUl3UUFnVEEvMWZlcGM1L3BOOFBOaGp0R1hjL2hUNG5vbjhnNTZhS2FGM0FIb2c5N1VkdGZ1VENKeFpsWnRNZkgrR1M2cEE1MjdJNjJnYWdxYXZEcGRFT0REY3d1ZFFHa2JYUFJmTjdIclYreXZZN2lCSFc4OTIzM1psNFdXR01vQXVFY3ErcUpFaEF5allGemhQbjU1QVVQSXExd3NCeDhSZHRTSnN5d1hxZWd4RjI1Y1pHYW1XVXZlNS9McnBXeHNTcjduT0ZhS3JyNHM2KzlpdThmdTRpZisrRDlXRC9hTnZvODJmWVMyd1ZBYlNSa1c1MVJSQ0txWVIwb0JPemFNb2IvOGxkK0JILzEzUlA0dDE5N0RmUGRUdVMyaWVJUmtHOHp4cGRELzlYWDUyaTNXeFdKcXlwdjU0Q2VrdWI5a0plemt0VE91ZXVHa295VHJEMHBwc3hZMlBGbkNqRkFuL0pUdWEyMkxsc1BsZXRQZFVlaVRFWUtUOXVxd01ROWMzQ2pNbjVpQXF5TDJSaHZRZDFJMGdiY1ZjV3VENnIrN2xNNUlqN0d0TllsYmxsVkwwZmMydnJrV3BlOWJEc0JremIxblN2Ukk1SzVsYWFleVVPMkpJZ3dTdDRrWjBLbGpKMWNDMi9FL2F6U2QzcGpKS2M0MEMxeDNnT2d1Q3RLck9uRmMybEFaSTVZV0FjOHFUWlZ5ZzJlc0dQak9PN2Jzd242SmJ5OEkxc0I4Rlk3TUlqSG5BMFFFYzVkdW9Zang4N0ZuVkdlMUJhckNORmFQNWhUTndIQzJBaGIxU3VYaVdyUWdVdm96aTFoZWFsVGs2aG5XQUR3Mlg0eTNJcHdSMG55RXhPSGp4RFJrWG9KdnZxMzJ5MXc2ZFJaQkFwSjBxTmtOUTZOUy9tR1drMlZhSzNrWHhocGx5aUNVZFFhUkhYVy9qNHM2b21BODFQeldPNEd0VnhYcllGWWtSTmhibjZ4ZXJLY2tkYmxWem1kVHFSN3paZithbHlSUy9keVFwMVZnUmVCUVQwNzJTNnF1TVJKanJXNjE3cTVyS09ucnVEM1BqMkJ2MzdoWkdKa1lJeUhwRU9NeUM5Y3ZSQm4yVk9zM3NhOHg0Y2Z2eHYvOUI5OENBL2RzdzBGQVVXSVo4Ni9GUmhQZmZ6Nkw2ayt0RnVEU1ZLMzBpclFsOFF1b0dtWFlxcGx4SlJXN1JyVFNIazNLYmxYSkhKaEJBelR5VzNTdWdSZ2JEMjJYU1dBejQ1L2hhaHB6Vm5odXNVemdTNlExT0tTVXpCUmplWmlobHdqcFpxbUhPREZMYXFPYnl2Ukd3WWdMUmRDcGQ0a0NYUDVSaXFYditvTUIvYlFyRnh5dHhLeFN2bmFEdVFTdk0ybmtyZlhjdU5oWFNWcDJrclJLbTNEMU9kVW1pNjNNWE8rNC9JeXN6Z2o3VmRQMmtONjdvQ05ZME40K0VEY2lob2QzVWpiZVJjVWF5U2Fjb0NaMWdzc0xuWXc4ZUliMnVjcXZSdE5Zb3FMZlQ2c3Z1cDFGS2RCeldNelBiOGhnN3VuSmlZTzl5MzYzMnk0MHlSNUFQZ01VZmp0YU0yWkcrRlp3N3NRb3JYOTZkZU9ZOWVoZTZNVEJEamRiMGtRcVQ3RmVSQWEzcUhGQm5qaTk5YUJrbjk2QUJUU0JFWUlHQnBzWXR2NnRYbTVFeUo1NnZKY1ZNa3pqVkpKbm9tTEk5NGZUN3dYdFNSeDlDemZWaVQzbEloaUpLTG1udklUNVBSRUtiTW1ucTNSWjh4UEZlaXRaRitFZ0c0QmZQWWJSL0hjcStmd1N4OTVFRHUzakJ0bk9KRWdWbTNsekhPZnVIbnZ1WDduc0duZE1INzlsOStEYjMvL0RQN2tpeS9qeXZSQy92NjNKZHg0N1RabjJ4eDhzUlpwdlZKekQ0YW5INms5M2R2eTA3anAxWlk4VDhwc3g2V3RWaGlOOU56VWxlVXpaSlVqbzdxZDdLNDBBOHhXbXVkbklqVkxlcGFveWRVQmZFa0NWeTFCQ2R3VHA4cktxcGplbDlUN01DQWlydmFjdm9OWnFoSkJXK0tjeVk4OE9QdGU1YUJ0ai8xbW1tbi9hRkNHanh0QWp0QVFpZDd4YzVjZlRrTmNCN0hVSE45ZGpLRnpabFR2d1hTYVd5WEw1SUZpdHdRU0IyVHBXNHFVTCsvc25VT3IxY1JqOSsvQ1FMT2hHZ1Ryd2xDWU94a3ppYm1MMitlZWZ1RTRPcDBDWW9BcG1wN0NJMHJ4NEcvRVRPVElFQitHUTVUM1YzbXNTMXdnekY2WnFYNlhsY1BicnFvSDdreVEvMU1pL0hZRTlBVHM0Z0ZQMVBiZVIybnoydVJWekZ5NmduWGJOZ013d0FJSDYzY2VJSTBiR214aWNia3dYdStTMHh6ZE5xZjVIYlp0R01JcTJBdEFwQkJncVZQZzRyVUZsVjUwOHBNWTZNVGZ5TWdRcmw2TkF5VVZUOWtFdGc4end4bExlRWtWZGFwV0Y3QlBreThPemxCNkpzQ3R6eXFBWHdKNHNSa0llZnpKaTlQNDNVOVA0TU9QN2NkSGYrUmVOSnYya003NGY5Q0prcDRFNGlVUzRRUmNNcEp5QU43OTRDNjg0OTd0K011bmorS3BwNDlodVZ2MkozQXJ3cTFsSFZZc2pZQldhN0FLcERVWmJ3VFlxM0VsUnJCVStGc0c3dVU2ZTRFN2VveHJGMEZGVG5oTFlKZ0RmQUpMQm04QkFaZE00blNOdkFiZ25kVVNDRE5BaG1GSTFiTDJTY0RCdklCakdsTnh5Sk9rKzlUR3hIREF4R2U3QjJEcVZhUlBIV3ZybHRiWGthZHNISWhQZXNYSlZLZG80ZVFpQXJ6VE1vZ0JYcE53dllRcVFJczFQWkZuQVlabk90TnlzWjJBTXZaSnpTLzk2SnJBNDRkMllhZzFrRjVFMUNjRUZmU1VUaExGN1hwTXg1NDljZ1pYcHVlVW1mQ0lxdm5vVkljUVBMTFRSWU56R0I5dHAwRlpta0JwTHNoYkE0dlRjK2gyK3FKRjh3RCtvcDhNdHlyY2NTQS9NWEg0NkpOUGZ2SWxJbnBFdmRHRk9CanpVK3JpeHk0SzRPelJOekMyZFhPMnBsNEdlb2NFMnExQkJ2M0VFZkM2RGRTaGhleGFjUVRzMkxpNkZKK0FGVGc5T1k5dUlXRE5QMldpUmNWSUdCMGJ3YlhwV1hTNzNaeGI1d0VsM0grWnZKZkhZazRrS1l1MzIrb3M2S3VUQ1VyeFpjQzMvdnN6eTNzRDhQWlV1eEFJWC96MmNUejMybm44OGs4OGhQdjNiNGFRb1FUM3pPVHcvanJQU3dQUlkxNGtHdkt0Q21LdWZyQ0JuLy9RQS9qQU8vZmpNMS8rUHI3MS9iN09iSDVMd3ByWWdoNkoydTNCQ29qV0pyOUZ3SjZWYmNHMnByeSt3UjExNis0bWRTbHYxazZxaXljbDNySjJMZllkenFXeU5RMGdDSlhBMWViaFVpM0FKd2s1MzNPdmdNK1ROa25hdVVUdlpWKzNZUjZrSFZickFGZjJlQ2Z2SS9XbHJsRGYrYVg0MVBaVVpvclAreEtsMjR5a1VNcVRHQ21SM0EwanB1Q0o5SDE0M1ZzQkg5TFdCTkQya0J0bjZrLzc0U2tlNDgxbzdwMHdDYng5anZONzcvR09lN2RqZktSdDJ1cWtNZXJWemdHUlJuTjAzQnJ2Y1BURUpieCs2aEpFZCtJOUlSUzhSWkkvV21ROGtwZk9kbXNBcllHbUduWHIvS2hPU0kyYnZUUmRmcmhhK0l1SmljUHovV2E2RmVHT0Eza09md0xna1dobG45VDJhclJod045NzRNeXhOM0gzRTQ5Z3NOM1dmZkZKTW84UWs1MDlENGVoVmhOekN4MEZla0lFSFBWbHo2cDI3NENkRzN0dm14TmlLZ0JQQUU1ZW1rVkJGTWNqRXdnNWl0S3ArakVPdy9YcnhuRHA4aFJFS3VsUlEzNWJrdXlsWGdzS2RuZUNQbE53RjlCRzd2WVcrZjU0VUcrQUwwS3lneWhMK0plbTV2QS8vc2t6ZU0rRHUvRkxIM2tRdyswQkpjU3lyOTR6Wnc5ZVF3c2d3RWZKTFVTbkJ4b3ZHcFpONjRieG4vN0NFL2pJdSsvQnB6Ly9FazZjNjJ2clNsOWhUU0IrUTRuam1udzlEU25EYitWUlZtRS93RzV5MVpacHdiMmE3d2JBUFV0UGVWN0tVaVdtRkVickJVUVFnbDE3aHdGZ0FXT25IdTRTOENlQWwvUVc0QVZ3blVxR0pZQkhFaHlUVks1TmlzOHp3RTc5SU9NNXBrbnJ6dWx4YWtQWnN4MXNuQ2t2dStjMEdmdEhnTmxLWCtsWDZUaWhVVktmTmZBREpmVTZXTXFYdmhjUUpaaWZuR2Rod0QwRXNiTGdQaVBJVm5VUWdBYUR2cDQxSWxvQWx1WWRnRVA3dDJEN3B0R00yZEJOaXVaN2FKdFpNSE9PY0g1eUJzKzllb3BWL3VCZFY1RXBLMFNRZ0J3NTZ4QVFqWjdIaGx1cHE4dGpVd2R1R3NCaGFSa0wxL3ZHNjdmVkFZNE5keXJJL3pHQTN5RkNRN2JCUlJCTUVyejl1N1M0ak10dm5zYU9nd2Npd0pNQVEyQ3AwRXIzY1FJUHR4cTRQdDlKZnVvZEQ3YkExdUErNWh0dU56RStQRkRieUF6Z0dTeVh1d0dUMDRzQUVOZmpoYmdJc0N0SEhRbmEwTWdRbXRjR3NMeTB6Tys0Y3NlSWFxeE1zcTNFbnBpT2tsUVA2RnE4QmZENGMvbWFPK2NwcStYcjRpb3FmTjZXT1BIeWFiencrZ1g4OGs4OGpCOTVhRGM3eFVtZ0xXcEtlQmNQQW5LOHZFSU9oVXIwbHErSlZ3ZDJiOFEvK2NRSDhmUkxwL0N2di9vS3JsMWZYR1U0M1lMUUo1Q3ZGQVpiZ3hrZ3J3N3FLVlUxZmkzZ1hnL3MrcXdXM092QU90MVFuclJIK2hLNEl6R21lVnVzMUc5QmxWVENCUXpBSW9HTFp3Qkx3RmtGZUhWd1l5UnNDOTR5UjlNOUZNRExFajFRZFhFTDVPVlpIQkpBeVlCZEdSbmk5OG8xRGxacmtQNVBmU0J2cUpxTkVzMGdrMWJLaWV2cU1XMG15WnR2SkdVbnRUMFNIZEUrZDRhK3BMWDdLSVVETUhRa0xwVzRxSUhsd3FQZFRXUktaSVZPNXZpK25ldXhiOGNHaUIyR0ExaXpKK2E1eGo2RDRoS0NuSGMvTTd1SWIzN3ZPUGQ1UEdmRUk5TDBFRkpab3JyMzNrVUM3WUZSOWxVZkFENUNPR2t0S3BNSndOemtURGFPMXhBdUFmanpmakxjeW5CSGd2ekV4T0d6VHo3NXlhY0FmRXlrOVZ5Q1Qrdnozc2NUNWs2OWNnemI3NzJIZDhNeGlGRGNPaWZBRVYzZnhtY043OUVhOEZoY0x0Z0JEZ0VoTGdYQXViaDF6cVBuM25oaXFoU1l0UlhqdG92WEZsRHdvSTREbGFVRUY3ZjQ2V1NKMmFNMHYyRU01ODlOYXRtOWdGN3E1RHZFeWF0UGV3TzdpUXNHNUsyYUhraGdEVUpWZ3VkQlQzYWZmVlFWMUFLODVKMlpXOEwvOW0rZnhUZGZPSW4vOEdjZXhhYjFzVDhqd1dFUGc1RmF4MlVUQUlXcmJyZExXaG14bDNSNDN5UDc4UGo5dS9BWFR4L0ZGNzUxREozdUduemEzMEt3dnBFd09OalV0VXNiZW9GNjNUT3FlVkFGOXQ1bDFLcms5V0p0NEo3S0pKczFxemRyTjZXUzY4RzlCSERPcUxEMVA1RmlZNTdjcUUwa01kR2N4ZlFDOFBtNnZKUWZ5N0hyNzJYMXZFcjB6RlZZa0piVDJCSkFTOUdHQ2ZCbVBWN3ltWFJXbWs4YWpCeWd6ZXRuOWRnSGRTUWowOEJ3Sml2SjZ6TXVWRlR5Vm8zdnpMMEFuNXp1eG44U004QS83MUJ6dWx5a2ZZRUE1N21lRURVSElRQmJOb3pna1lNNzBMRHVDUkVyRUEyUEd0OVpiZ3FFNVU0WFgvL3VNWFNMd0NwNE1iWmpOYjBUWnRFaHNFOTdZc0Z1ZExpbFdtR2h4K0lTUFlXUWJpbGdkckp2cS9yL1kyTGljRjk3N1c1bHVDTkJuc08vQlBBeFFQWjNFOFRsYlZ6ck1RdnE4Smk2ZUFXemsxTVkzYnhSdHIwRERpaDRqM3h3VUplMXN1WTcwbTVpWWJrQTJLSWJQaWlZZURnVWdiQnJjeFhrZGJCVCtacHdZV29CUlVpU3VwWGtDeG1ibExoM2NvUldxNFYydTRXNStTU1JXaW1oVFArVG1yNUsvUk5uWFY2Yk4xeDVyL3NRVlhUV0dVN3MvNUpsZlRET2hvaUJuLzlLUDJUcjlZSHc0ckVMK0kwLytCSis4Y01QNEtmZWV3QjZJSWo0cHdZUW1JRHJzYitvQS9xazhvZVBSMEwrNG9jZndBY2UzWS8vNnl0SDhPd3JaL3NkWjI5cEtIKzdWaXRhMXRjTEFqWGdhSitVR1lQU3hVckFIcC9VZ0hzWmNEbk9nbnVsbkJwd3R5WDBBbmY3ckx3RTRHUmlnTUdPOHlub0lnZGFWZFhEZ0paeG1BTkE5MXlYQVY3VXVRcm1CdUJySlhxVFA2bmVqYXJieVZiUUJFNE9RTFBaUkxmVHljQTlNUVF1cTAvYWxkbXRJTFZYZXFjRzMyMVhaOEV5RFVvckhDcmZPVTdGWkxTWURPOWNSa2Nxb0s2N0NKS2FYa0FiZXJxY0FYMUExZmRBTXJvYkhXbmhpUWQzbzhuT2JiS1hKZlBXQXV6YTZFaGp2dkc5WTVoZlhHS3daa21lR1FKUno0dkxjb2pLbm8xOXgwYUdlRHc0UGVYUE80Y0MzSGhZd1lHd05EMlB6bkxmZVAySC9XYTRsZUZPQnZtbkFKd0ZzQXNBMHJxOC9HVXdNUi9pek5FM2NOL21qZnp4MlJMV1I2QjM0cWRlamV3Y1dzMEdHczZoRzlqWGVoQ3VMdzVtNzRIZG0vTDk4U3NCUEFFNGZ6VjZ1WE95VmdSQTkvQTY0ZjdCNjRqUWliVit3emhtNStZckJOVlZMZ3lodEFUVEV2cVEyaVBna0FEZFBLTWNsUFZaVGJ4MWpDTnIrZVZEYmtTQ0wweGFZUUFRQ0l0TFhmenhVeS9pRzgrL2lWLzkrY2R4MTQ3MURQUUFGZkViQ1dHeURuUkl2M0E5MENNQVd6WU00OWQrOFFuOCtCTjM0Ly84d2tzNGRhRnZ3NWliQ3JXWVhaT2czVzVsa2l6UUMvRGZRbUF2WGVSQWJlTDdCUGVzcWg3Z2J1dWo3S0dMYzhZQ201VjhTNUswY3NzcTZWb0pHWW9GS3dJOHA2dGJmeGZtd21mbFdCVitTaXNGSndDUGY4ZlhqZUxhMURWbFVNcXFmVW1yRElBeXVUa3prRjZxY29uNjJEU3VwSTh0Y3dLQWo0TWxsdUFUbHFweEdoZkFMbWRpTHZFbnJ5cDdzWkZLN3hLdDY1MXEvanlyL1FQTFk5bTZmSWpuaWJ6M2tUMW9EMFlvRXNaTXZvdG9JTUQwTW4zeTJNNXZ2M3dLVjY3TnhUWVRLVzMzUkNpUW5ONDQxUWk0U0hNUk1EdzBpSUZHbE81bEJ3QUlDQzZZSTNhUk9wR0EyY3Q5MDVXdlQwd2Mva0cvbVc1bHVLT2M0ZGd3TVhHNEFQQkhjaTlBVTNiK2t0YUlDV2QvOEFZNmk4dlJEU3NaaVJRR3FHQzJpZ0VZSFdwcWVRSnUwYlZzd0xyaFFZd09KVDVJakZHc3BFc20zOEpTRjFldkwyVlNyQjZmS3RjOEtZckFFaksvVTNOZ0FNTWp3MVduT1BJcjBpODVyZ254WjlPSlF4eHBReEUwZi9rNDE2RHBlOVFaY2tjNnVjdmJFQmt2Q2pyUkE3ZFB6NGMzRW43Qi9Wb1E0ZGpacS9pTi8rbEwrT1BQdllqbGJzRUhWa1JpWngyTU9KZUlZOW14aHBQamhRRldpY1owQi9kdXdqLzl4SWZ3OTMvMm5WZzMwcnFsWTVKVytLMmFpQzlhcllFU0kxWEtxczhvTVdmNkxGNG9jMmxxcjVZbFpkaXkwNFgra3pJaERFRnFtODFIcENsTUhsSW13Z0tLekpPOFhkWDZKSzE4WTdLcVdUQUR6R1hreG5YeXF3SDRNbk9BSE9BMUI2ZnovRUNBVnh6TEpBdDlLVE5wRFFTMDFibU5mYWJNZ1VPclBZaFdhekE1aTVHMFBIWWI0djdWcC9HZW5NNGsxN0pPbjVjY3lHUk9iMkIreVVtTk9ySXh6eHpZS1kwNHluSEpEVzFEM05pVzZpaTd0bzF0U3U5UmNZaWpaYk1Cb3RScDVuQ2o0ZkhFZzNzd050d3k1U1RYdkRFdGtsTWcrZHVJVnZpdnZuRUJKODlOcFc4aDM0RW9pNU52YXAwTk9lK3diclN0MzhVNzB1K1QrampuV3NOeUYvUFRmUnZjL1l0K005enFjQ2RMOGdEd0tRRC9MWGd1V3E3UnNsZmVRLzNBWHo1NUd0dnZ2UXRBVkxzVG9xVjhFQ2NJWW4xUEJCZmlubm5ubHhtVXdPdnowUld1cU9wRm9ncnl6WmxCa0RpQUVNamgvTlE4Q3BKQmxqaDY0V2JsM092cy9HdXV3RG5DaGczam1KNmVTNnExRllLVm51UStsL0RKRUdkWkU0dnBBeVdDVzVidTdhRVI2Z2JYYnBOamFwNUw5bFNSN0RPUGdxRlVCak5lLytacnIrSWJMNXpDci8zQzQzajA0UGJvZXBMU1ZzZjBncEdGVjh0ODcxZ2xHRlZ3QkVMd2p0V0Q4Zm43SDkyTGR4M2FnYWUrK1RxKzlKM2p0V2ZRcjk3TEszNkFHM3JZYmczbXFXcStOVlV1Rk1yVGZVMFZhNWJhT1k2UTM5Z2lLZi9QWG1aanI4emcxS25zNnlYOUdNdkNFOCtIbE1sS3U3cjJicVJzSy9HVHpxdGNFaGN3UnVsZTV5VS95Q1Q2TEU5U3o2ZTFlVzZkc2NhWDdYbGxSZ0FBUnNkR01UMTFUZk82TEEreWEzbHYzYjVia3I3TDZ2djB4TFJCSWwxNUZETER4TFpHaWNtQ1N2Qml0Wi9VOW9sdVpDZk91Y1RVOFZlTUo5aXBOaS8xcGRTVDlzT251ZjJPQTl1eFpjT3d0bGNBVmtWMitUQmlwcS92NTNEcTRsVzhmT3g4Qkcvd2ppZ1hsMTI5ajB1dFR0Zm1SWU1xRENTaDNZemI1a2lNQXZtYnloeXkyemFKMXhybXIweXZpVGFiTUFYZzMvU1Q0YTBJamQvNnJkKzYzVzNvR1Q3eGlaK2UvdFNuUHZja2dBTTJ2and4bERPSHcrTDFXZXk2Lzk1c0l1ajBJTE9PWmxSdklJZUZUamNqdXM0Qjc3MXZHemFOdDgzSmFna01NME1VSHRpdm5yNkd5WmxGTFY4MVRESWpuSldva2dHUlhEc1hqUW5uNXhjemlhNzhFeU8zQ05pbVhlWTZ5RE1rSU01T2dRcm1MeVJQRmZqTDZucGxCTWlDTnJSZFphOTRtYnRja3lid3M5bjVKWHoxMlRkeGZuSVdEOXkxQmUxV1U3K05sZFRzbHlUNVFJci9QQm1SajRtQmhzZWh1N2JnM1EvdXh0VE1BczVmV2FOSHlUWE40LzVZQkVtOVk4Y1dEQSsxYXAvWkc2cDVlaXVBdlZMMkN1QmV6YmM2dU50MnJnVHVFaUpoWjRLS0JNSUNsaktSeGFGVkRzQ3hqUEoydGpwcjlUTEFaL2RXb3BmNlREbWUwMmpaRE5iZTNydTR0T1Jkb2tYT09UU2JEWFNMTHNCR3dwa0VYcGJLbmM4a2FEZ2s2ZGQ1VFp2eUpEZTFxVzFPMzhQK3BEM2FWaXZWb2lRSks5QW1waVEvaENmT1FnZWJYbEpyeDZlbGtsSlpBSEJnejJiY3Mzc1RseGUvcnZjT3phYlJ6a2tiTStORmgyc3pDL2pHODhmNEZEa1pjTUlJSmJLUUtJTFJEbkc2OVdORDhWaGJpY3U4NXdFUWh6dFNmaUJNbnJqSXRtQnJEdjlpWXVMd2JYR0FZOE9kTHNrRDBRRHZwMnhFbERERndoNlFyWFJBd05YTFZ6RjE3Z0kyN3Q0Qjhad1dKY040T2xFSWdZK1E1YjJhM21HazNjQzFPUVlxNFlnRHNHZkxpQnFqSlFCTndLbmNMQVBpMlN2em9BQVVqcFJ3a1hMd0FBSlVRbkhDTVRKbktkTmczZnB4WEwwNmc2Skc4cFN3cXBRRUE5YjZMR2NDUk1MWEl4Y3A5NFpYUHJoR250ZXQwVmZ2UmEwZmNxTzlRRmtaMGM0aWZwT3ZQSHNjejd4OENuLzNKeDdHMy96QWZXZzBJdWVlcmNIejIzbCs3eUJBTDRkUE9HS0RHMzVwbnZKYk40emcxMzd4Q1J3OU9ZblBmUG5JR3Ricit3UHd0ZVllSG1waC9mcXhHaUN1QjNYZzdRRjJmYzZWM1N5NGEyeVpnYUE4cmVkNUlQdXRkYjFkUHAyQURzQlNtQUN3U0hjdUEvanNaY3k4VTBCSGxabUFsbDlhZjNkT0hWaEZKa0RtTGVmSkpIRXB4d0s4L0NXTWpmSGFmQWxJczdSYWwyVlFVcm41ZmZYNzVVSlArWHRJSmpKVzlyS0ZGYXFWaVBGRzYrZU1KRS84clp5TE5OSDdYTEFBa2tNY3BUM2NwNDdVa2g0QjJMMXRISWZ1MmdLVmVyZ3U4YVZmNGdLUm1EdkMvRUlIMzN6K0dFSVIxLzQ5RzAxSExSOS9keU9vUmNFT1VVc0xCM0lPQTk1anFEMFlzY0RGZDRhc3cvT1lkc1pQQjV6RDNOUTB1cDF1cFk5WENmK3kzd3h2UmZoaEFQblBBcmdJWUp1TkZJdDdVZFUzR2w2Qi9zVHpSN0JoMXc1T3laYmFGT0xwYU00NnVuRndJUTZnNFhZVHN3dWRpQmZlWWN2Nk50b0REUVowVkVHUUVTZndETGkrMk1ITWZMUzY1TEVGb1VWT0J5cjByNEk5cGNrcEJucnJONnpINVV0WGVuWklZakNaS0Z0aVhHSUFMR01pazArV0dGUXpJUGRpNVM1cWVwSDgwVnQ2dDgrS1hoSitTY3FQVElGaEFMaTk4NHNkL05HZmZ3K2ZlK1oxZk9KdlBvYjNQTFFiVmFDWGwyVnZWang1VmRYUGNVbzVtU1I2T055M2J6UCt1NDkvQU45NzdUdysrNDNYY081eTMxdGhhci9EV29KekR2ZmZkeGNhM2xjWXNxek1YcUJlU2xySEtQUUw3cFQvbCtYTlltNEEzRzE1WlhBSEVtQllFQVpLYm1rVjdDSC9RVlRLM29DUzdwVkhBbHFaWXdLY3NHbWNVYmZMUFJJb1dZRFA1cW9VSlhWd3MrUzUxeUhuc3JRREEwMjAyeTEwbHBjcjRKNWZKeFJYb0plL2hxbEkzWkxEZlJYNDdUY2pqU0J1bzJ5VEk1TUVTRDREeE1yZWdqZ291WkFsQmsyZDB5dzRpR0tkQURNdlkvbWJONDNnMGZ0Mm12ZnlPdGFTdXQ2OGVKckM2QmFFcDE4NGpxWGxRaTNwQVhaZ3hreCtBV1RXOUpFQkFDRE8wOGhoYkxTdFp4b29vd2lINEJEQm51c25FRnlJdnZCdndNUGRNeE1UaDQvMG0rbXRDSGM4eUU5TUhPNDgrZVFuLzNjQXYxRitadjNZVzZDL2VQbzhaaTVQWW55TEhGRVl1YjEwY0lwMWR4c2x3NUgyQUdibWxxUGtIUWo3dG95cXdWN3lDZ2ZBZ0tLcXlrRTRlMlVPUlFpR3lMaGtRUS9aUnNjVGxZOUVsSU5wZEhMelBCeGZONHdyVTlld3ZOek5KUlRreEZXSnFRRjVtWkQ2Z050SG1vNlNaNnJ5dlRGTUJMOWJEc3hXcTBFclNQWUo0Q3ZBWHdiNEdsUTdOM2tkdi9OSFg4Yzc3dDJPWC8yNWQySGZqdlc2blM1SjlJbDRxRnRjcGdoQ1VPeStlcGk4NzdwL0J4NDl1QjNQdm5JV2YvSE5IK0JpelpuUS9RRDRXc0srdlRzd09qYVVmei9VZzNxc3Y0eXNkY0JlQmVmc3ZnYlk5Ymt3ZHJWNWMrWXhMMjd0NEY1V3paT3BNODZIQk80R3VYakdra3JRQ2F4amZydC8zaDVCSytDZFc2UlRlbWJTd0dnUHhNZThVSGU3L3U2eXVuS3dCVXA3K2N2Z0x3QU93c2pvTUdhdWRYcEk4R2tKUU51Y2FTZnE2MHlkVmgvczk3RUFINlZYeXdUVVNPK2NRRDNkT1NVbm5DNEtNQUwyTWpmMVFKb1E2Wjc4VHc1WVA5ckdZNGQyb2VsRkY1Y1ljTmxYazB2eXBKMUpJSHo3NVRjeFBidkFFalpyN2p5QTRCTFRTQVM0Q001Z3B6ZlJyUzJQdTRiRDZOQmcxT0p5WTBWd2NQeitrZjhqdGN4Zm1sbkE4bUtITlI5cnBneDNoQlFQL0JDQVBJYy9BUEJmb0thOVphQ1hmWlluWDM0TkQzejRTWGppZ2NPREtrb0JCQ0lQNTBrMHZXaDZkblc3MklYM3dMNnRvNUZUcEZ5Q1R4eHJrdUlKd05uSmVWMDZBTVZCbFNRQ1ZoV0t3VjNJSjYyejQ0Ym4rY1pONjNIdTdDVVRuYnV5dEdPTlRJUXdIZG56Q3RqbjZ2d3l1R2RyOTBRMW9HOTJLQkFwQTlSenJaNUtrdjRLQUcvZjZZWFhMK0RYZi84cC9OUjdEdUJYL3NZakdCdHU4VmVNUkRFNnNFaEFuNHlQRXZFb013WkNpRHlBZHorNEcrODZ0QlBmK3Y0Wi9PWFRQOERrdGJmR3RmVDQrQWoyN05uYUU5Qmp5MVlBOWV5R2F1UDdBZlpTY2NoaTYvS1dHbjZqNEM3WEtzR0tWRzZRVWJaZ0tlaVpRcEtFbWRiSkZlUkViYWFBbU1CYkFWTVppbnFBbDdYcEpMVmJnRGRnem1uMVBTaVc3VTFUcFBVcXpROE9vTjJYb3hCL0FBQWdBRWxFUVZSdW83Tzh6QXlBWFdjMnRBQUFuTmMzdC9VU1VqcDl0aExtbEVCYzRvaEJURmVzNVpIaHQwVEJTSlJvQ3NpcE9sK05rRjFNNUVuVTkxd3VNOXFldDh1TkRiZngrSU83TWREdzJtUUhwOTlDZ3N4UFpTSmNCT01YWGorRDg1TXpzVHFlditMVkxqZ2VNNFV3KzZMUk00ZndJRXI4bzhPdHFERkExT3lTU1B3RXdJWEUvT2loT1lUNXk5UGF4alZpL0JSdW94dmJjcmlqRGU4a2ZPSVRQejN6cVU5OTduNEFEOWM5bC9WbE8xaG1wMmF3NTc2NzBXQS80U2trWkhXVTdnbkFZTlBqK253SHpubjg5Qk43NEoxUElJVTZjRXlBT3ZIcVJYUzZSWUlZblNYU1J1aDlJdWhPSjVFa0paNWhnNE1EbUoyZHgvSnlKN1lCQ1hnRmNLMmtuYlFLT1ROaW44bjJPZUx0ZTNrNjVPOGFLQVAwZ0dRaEg3ZnUyVHc5MXVSRjJnODU4SzhHOFBtM0JZNmRtY0lYbmptR1pyT0JlL2RzUXNNejU1OG9ZUlVVa215bGtxTjlwbEtSZDlpOWJSd2ZmR3cvTm93TjRjekZHU3d1OTczMlZ0UHcrS2ZSOEhqNG9YdlJiSnF0bUZWa3J0Nldic3FnbkYvZUpMQ25JckxNdlpqS0d3VjNDWEhMWTNLekNsWFRXaW5kcXQydHRKdEx2cG9tdXhlbW1zdWxhaG9nR2RmMUJIak41elI5R2VEamRRN3dVcFlDTjdlMzJXeW95dDV6UHQwSzZwTHhuYWl0dld4VDQ4SXEyMGlaTzlDdGRwVWY5eVRmcDdad3VWeUdQV3M5UzJPL0ErUmpvVlIrL2szazIwR1ljZTh3TWpTQWR6KzRCNE1ERGROZjFXMTN6c1Z0ZGRMbnN2M3V4TmtyK1A2eGM2bCtJOFJZQVNZdCtVaS9aMFFYem5sc0dCOVdoaWxmN3FUMGhrTGJRT2pPTHVQcXVha01XOVlRZm45aTR2QVgrc3J4Rm9ZZkZra2VBSDRQd04vcjlURHdjVWRpak5mdGRuSHF5QTl3ejNzZTB5MDJIdEMxTm5WOUMzRjlTV2k0S00ydkd4bEFzMkVBbmorNGJCTURvQ0JHQUs3TkxtRjJJWHEyOGdENEFEcmUrNDA0d0JDSkc2UU5JS1F0SFlramQ1S0JnRTJiTnVEVTdMblNtNUt1SlVWbUlnMVVzZ1JWMnF5RTJEQW9WTW9uSExoRHNyWTMwbjN0ZGRud1RwNVo1cUlreVljQUJJUzFjc05abUZ2czRJOCsrejE4L3BuWDhmR1BQWVluRHUyTTIyYkVKYVdBQkZ4SlRZODFxZnFiRFkvM1A3b1A3MzFvTjc3eHdpbDg0Wm5YTVQyM3RIckRWbm1YdSsvWmpWWjdvSmFwV1JPb2w1NnRCdXlhWmkzZ1hwZi9Wb043S2IxaklreU1IRjdaTUNTSnl5SE9EWUVkQlJ6NVR3dURmRXZJTTZuUUpWV3pGK0F1QWJ5Z2w0MlAxVG10eXpJWGNFWTlyd0FLdlU4Z2lad1o0SEtiQXcyMFdvTllYdTdrRElkSzlZYkJNRzNSOXBiQzZzQ1RLbzl5VU93Z2dUT1ZjaW05WHlZb2NQN3NjQnFYdnE4d1FsSDF6VjN2RUIyS3NhRmRhNkNKeHgvWWpkWmdrNW1TTkM0YzVOT1I5cVVYVDJRY0xrMWR4L05IendBUTUyYU8xOTlqdmRuNk8ydDdJcjBuZlMvSGVjZUdvODhDQ3NuUlRwVGNjMFpVbURRaWg5bkphZTZqeE5pdElxQXNBVGk4MnBkNU80UHJjOS9mYlExUFB2bkpyd0w0OEVwcDdCYVY5bEFiSC95Vm4wZWozYTQ0UkhETXhUclA4Y3hoZGlsZzYvZ1FmdTY5K3lGcTZMUjlMUUc3bFdLUG5McUtaMTY5Q0JtbytXUXRyZFBGUmlhaXhmZjhPRTF3L25QMjlBVmNuMDFxNURMUmpYSENPMWRCM1lKOW1TSElRRi9URzZETzB1UjlrWnppckc1OUwxditWQk94V2xnRDEvem93ZTM0K01jZXc1NXQ2d0JZT3dPenBFSzVsc0srcTdhSnI0RTg3WEtud05lLzl5YSsrTzNqbUoxZlhyVTlKVmdHQUd6ZXZCNkg3citMbjFjeTlNNWRDK3A4ZDdQQW5vcko4NWMrREdWdHlGRzlYM0MzNVl1RGxGd0tqMkNSdG9JbEVQVm16a2krQ0xaV2trN0FiSzhsRDJDM3RtR0Y5TGxuTzJmYWs4cUlNeTBCZUFRdWUxUXNGMlVZQWVWSVFFV0IyWm5ySlVZaU1RZ3c5ZHA3SUxWRGVSbDVYanRoY3VDeWNmWjd4UEV1VDBrbFkwbFRwbmM1dmFocUFtMmFac1BqOFFkMlkyUm9VRGtKU2wwaHZKakdPUUFEVGEvamJYWnVDWC8xbmFOWTdCUzhVNGVTSXk1MXlJWGtGSTBvWGdmK1M4bHBtZ093ZWNOWWZNdEFLTmlKbDVRVENnS1p1SUlDaXNVT3poMDVoYUlRWjJsUzNvcWF5RCtjbURqOEQzbzl2QjNoaDBtU0I2STB2eUxJVzh2M3hZVkZuRHY2Qm5ZL2ZDaXUzN2pjZHowQjdPYVcxM1VBTk9DeGZlTndBckxLWUNhSVU0ZDRDQVBoN09SY2RMNEE0MWViSjdlNnNhMXcvVWpnVHBTNFdqS0hNUURZdkdValptYm1FU2pmVWxlWnZBN2FOZ3Y0dllBOWl6T0dlT25RR1U1WEEvb1Y5VDdWcSt1enVGQUhnOXdmWlNLMUJrYmdoYU1YOEE5Zi94dysrdDREK1BkKzZtR01EZy9HZHZDTDZiR1NTQVo1V3JqZEhpTmNPOFNwUnFROGc4MEdQdkx1ZS9DK1IvZmhhOCtkd0plLzh3Ym1GbGNIZXdtRGc0TTRjR0J2QmV3cUlGeTY2UXZVOWVMR2dGMFl3Q3pLRkZKZkhtNEkzQUVrSnRjZU5NS1BJejlzdjVOVE1JdE1lQ29nU2JWSlVsWEV5QjdGOGxRN3RpSkRrQUJlZ2I0QzhPRDVXVjR1U0NDY3dOM0dPeTREV0ZydXFnMUNZaEpNV1RCNURmaVhBVDRUQ0d6UUQ1QUxDMlRpNGhBdm5VeUhTRHZnakJHZUhCNG5kTUxsYS9KU2ZrUG1Pc0RuZmdLKzRmRFkvYnN3TnN4bk5aVDZLTVpCNDZTcHdpd3RMUmQ0NXNVVDZCU0IxOTk1blIxZ3EzbVcyc2s2OGFHOC8ySUtlT2N3TXR4Q2c0OFJsN3lSRk1TdGM3S1dMKy91eUdGdWNrYkxrbU54VjVIbUNjRHYxejI0bmVHSERlU2ZBdkFxZ0VNckpTSmk5NnJrY2Z6NUk5ait3TDFvTkpweElBUUdlQWMrR3BHdHNNbkIrUWpLVzllMTFXR0xCY0U2aVk4SXVEeTl5SVpmUXFlaWVvZ01BV01CZ0NjelN6Vk93RjFub3BIdW1lbG9OakUyUG9xcHE5TVpGTW9ReTllVjRoTWh3Y1J1cW5xQnZSQnJlektkWFliSUQ2bVJpWi9iS05SSjcxcW1rZVJYL0Y1clFmVlNjSWplQzUrYWVCMWZmLzRrL3U1UFBJU1BQbmt2R3Q0aDhPRVlVbllkMEVkUXQvN3ZJMGpFTXdjSUllcnIwQjVzNENmZmV3RHZmK2MrZlBYWk4vQlh6NTNBd3RKcWEvWU9CKy9kaTJiRFZ3Q1JxNis3aEVYaW5zQmVRdEhWZ0wxUzFvckFIaE5RbGpaUHVHWndOd1ZMZEhKb1l3QktKZ1lTMktZU0V1Q1NBN3NlQmRMaG93bFV5L3ZQNjY0VlRLVmFxYzR3RVU3K0doQzIxd3JPSlVEUDFQak9NY09QU25tZHBXVTltYTRNN2hYTGUybTNlVmY3enVsQm9oODVvMlJEMWZpTzVCb0NtUEdicGIzd0xxTmhDZXdqdmJSMlFLSmxGenVuZHh6Y2dmVmpiUjBYdHMxV2NxL3daaDdvZGdrVEw1M0EvT0l5UkZNUzAvTFNqbU8xUHMvWkFMR0U1eVU0UXB6eGZOS2NkOERvVUJ1RUFGRGc2YzdsaXV0a0EvYndRSGU1ZzdrcnN3cndYdnNpamQ4YW9QL0xpWW5EcjlaMC9tME5kNnp2K3Jvd01YRzRMMDRwaElEcjE2N2ovR3ZIV1gxamdVbThzU0VESXlKZzNjaGdBcmxnMGxMMTF5a0NyczR1UWZ6UkY2d3k2aFloWGhNeXQ2NkIyTGQ4SVBYbHJ2N21BL3Q0NXp4UzNvYk42d0M0ekpkODJjZDk1b3RlZmR3SExUdldRMGgrLzAxWmxPN3RjMnNWTDNGZElpMnJHN2dlL21sLzJUSldBZmdiRFdUK3pTNHM0UTgvK3h6Kzg5OTdDcys5ZHM1SVNzbEFTSDF1TzZpL2JyaXkvM3R4dEdLOW1jWHI0ZFlBZnZwSEQrSzMvK01mdzArKzV4NjBCaG85MjdaejV4YXNXeithVktIOEkwTVVwZTBTbWRTZ2hvR1RuekJwcExrMFhvdXdUN0o2VW1GRWlRRUVVbnV5M3N6S2xIU0plWU50ajlSb0toTG1UeGlDbkRGSllFSWtSRDRkU2tSd3laR0pTUEp5eUpQVTQ4d1dOMzBUbDNNamdsNGxaaWJpSjJuR0JQeGdZRGFNUVJuVUxkZzd1N1JnUGM3eFBheUhPUEhaSG9GRE5IWFdyN3o0YkJmanMveHZGRVlhNGd2ZTIrYys4M3FuZnV0cmZsS25MVnY4NWplczV6eVpCNlgyNlZ5eXhuTG01MHk1ajl5N0hadldEOE41ajRiTDI2eDFPLzdac2wwY0c5OSsrVTFNWDUvWHVaY01GZk5sRjBDMHBlWWJFUXRQcHYvR1JvYmlONUJ2emhLK2JtMVc1aTl4SVF1VDEwR3NQWlU4bmkwdnJTRmpLZnh1WGVUdERqOXNrandBL0NzQS93ekExclVrRGlIZzlXODlqMjMzM0FVTU5uVndBbnhLRVlpOUljWEpSQTRZSFlvcXBtaFZIcWxkQk1Ja0JRdWhtNTViaXVmSHl5QmtzY0RCd1JVRTNjZXJIQ3VEaTRoSklnRUFpRnhpVmJyM3ZvRU5HOGR4NmRMVlhBb3I0ZWVxUm5pYXhpVWlURWxGcjljUXhrY0lmR0tFa2dhanVrWnZwWGNwTHd1MTgrTFdoYk9YWi9BN2YvUjF2UE8rSGZpUGZ2YWQyTFYxM0ZUS2tpR2cwcnRzNzlHamJ0a05ZbFRkaWFmRWxOL0RZYmc5Z0krOS8zNTg2RjEzNFV2Zk9ZNXZ2bkFLblU2aGJSZ2VHY0srdlR1cTc3NktsSjdGVTU2S0toZVovTnk3WERNT05JcnlCT1d5eVNRc2w5ZXY1RzdyOTRZb3lycDI4b2dtMGthVUlsWHljRUN5a0U2T1VnakpsM3dxc3l6TlYxM2dWdE13NFVjcG5jUTVzMGJ2VWoyK1hLNitVMXBLeUZYNE1WMW5lVm1CSnkzZjVVc0l3cHpLNnpuaFZWeXlMNEJwczlTaEhaWUZNd2VONUtuTW1sVjU4L3NLSzBZbXI0dENMOU1IVHVPUWRoZngrNFlBM0w5L0s3WnVOQ2QzTXUyck5JL2tYcVRwV001enI4UlQ1ZUs1OElIelI4Yk1HMVY3WkZvb0dlRWhhbm9LQmZ2NEpzMkd4L0R3WVBUcXFkK1crRjBkbkJNZ0J4K2RDMUNud096VUxMejNCdWpKZk5kYWFmNjdFeE9IdjQ0N01QelFnZnpFeE9IRko1Lzg1QjhBK08yMTVwbTlQb2R6ci93QXU5N3hRQnkrSk42VktEckpBWHRMQ3NEWTBBQ3IydU9JVkdBUFZwV2RIRVpNelN6RjgrTkJjSjZIYXBGdm9mRkdLaEppVStoOVVrSEdDSm5ZeWRVdEFLemZzQTZYSjYraDZBU2RMREsrbEJ6cjdFVTJTU21UN2tRcVMweUE3UGVQOS9YZ0xvd09BZG4ydXJMMXZGM2VxQVFoR3IwKzFDMWlBcDQvZWg0dnZuNEJIM3JzTHZ5ZGp6eUl6ZXRIVEFOeW9HY1QzUVR1UHZaRjNISEJRRzljNVlycWYyeTRoWi8vNENIODJMdnV4bDg5ZHdKUHYzUUt5NTBDQncvdWpjNk95b0JYRTFZRmRYTlRlVW85eXI0WllPZkVsTjltaWN2TXkycmdiaE02NzNRczZ2eVE4OGdaM0NQUUtiSnB2bmhKNmw1V1lFNUFWb05EeXF1cHBLeUUxRTZUR3pCUFJRTk92T3JsMitQcUFCNEdvSk5HSUFmL1VCUUlSV0VrMFJ6Y1haYlhTcXM1dzJELzVneHNYVERsTUtOQUpBQVgrMFExTmhJWDRwS1Zhb0tjK2Vic0lFYUZIUEU2eDB6QWdiMmJzSFByV0RhdXRGOUtRUmdNN1hRQ3Z2MzkwN2c0T2FObnZldGZCbkhkVlVTVWpaMVlQeS9CT2o3RXlrWDEvZWhJeTR5QStETGFuNVQ2UUJnNzV3anpSb3IzM3FFb2tndmc2SThsTVkwRzVPOUlLUjc0SVFSNUR2OHpnUDhhd05CYU03eiszRXZZZXQ4OUdHZ1BRa1pWTkJJaEhpQlJVaGhqYjBoeE12Qlp3MGJLdGFyTEVJQXJNMUdTOTg3QkZVSXdDQVdJTllNK2NwK0tFN2xiV3dXK2hDTjZIME9hd0pzMmI4RDVzNWV6MklyNmxlK0Y4N1pnM3RPNkh2WXZtQ0dvQi9mNDN0VzFkOXMvcTRXZUtVb1BiZ2J6UTBINDZyTnY0T3ZmZXhNLy9zVGQrTnMvOWdBMmpnOGxZenNrSXp1WXY1RklBSmxqRlIrbGpmS1dQTUJoM1dnTFAvZUIrL0dUNzdrSHI1Ky9qbE5YdTVoZDdQUit0ZXBGTGFpbnl6eml4b0E5SnVvSjdqMmxkcE92ak5sVTAvNVNPeVJKM09jZEd5OHE4cWlhQjBURlpSbmE3RFE2L2k0Nlg1RDh5QnVremhrREJlQWswWmZWN1hDcEhBVnhhSForMWd2Z1RmWENuSlFCM29JM0hEckx5MmlvdWpjOUYrZGRkY0NlOHB1K2NlbTVmQmpueXF1dTFXOEFCcVJvcEpZQUwvNHhoc1RlcEZNYWtzQ2V5WU51VXhXbk4zdDNyTWZlN2V2ejcyTHFUbU5YUU5hbDlqbmd4ZGZPNGRTRnF4aG9PalM0ZlZHY1F0THVNSUdNcm1vcFAzRk9KSDR6RkpyTkJvYUhXaUQyVVE5K0Q2R3pVWHJuditEdGhNc0Y1cTVlejc1SFlyTEkzR2ZTL0pzQS9qWHUwUEJEQ2ZJVEU0Y25uM3p5azU4QzhKK3ROYy9DM0FMT3Z2STY5ajc2SUFEaWs0MUlQZEpGaVkwd1BqSm9wTmc0SUFwQ0xyMUNRQTI0TXJzWXQxeTRPQWdjOGFFMGNPeStOaGozblV3QTVOeEdRTmZBckZGTUF2dDhZbyt2RzhQbHkxZXhhSzI4U3dRN1Y5UG5CTm9DdTZTeHdKeEEzNEEyYzg2VjdYTnJsZDV2SXR5SzhycEZ3QmUrZFF4Zi9lNGIrSW4zM0lOZitOQURXRGZhZ2dBOXVTU05nTzB6OUNoYk9RUUZxRmpxaTM5dTJYYy9OdHJHKzk2eEFZRUl4ODlmeDBzbnJ2S0poQ1h3WGVFRit3SDErT2NtZ0owelVINWJiVW1aNmVnRDNQT1hjQ3BJZTh0RVNWcnZJRnZOQ0xLbGxmTXpxZ29yUUlnU0pRQmx6aFE0RXkrZ2RTaDRTN1EwWHFWSmsxY1o4S3FEbTloTU00OUxvTTZ2VVFGN0NnRkZwd3RkZTBZZHVOdjZCZVR5c3JYOW1XUnZPQVA5S3BaYk1OL0VKYStaSXNTUTlFUGNmc1J6bnpXVkF1d2t4bXdKN0JGWU1DSmcrNlp4M0wxN2s2cjlWZENRdEFaSWsvbGxiS3VEdzZzbkx1TDEwNU5KV25aQThDNWEwWnM5OE9MQXpERmo0dGhEblhpOVU5OG52QXczUHRwV1E4Q0l5NklCa0Y2Szg3amdjZ25BUEZ2VTIvYW52MmxmZmNuUy9uY25KZzZuTmJzN0xQeFFnanlIL3dIQXJ3Sm9yelhEaWVkZnhxNURCOUJvdGFJMVBCamdmVFI0Yzg1aGZIakFxS0lSSndJYnJxbkV5aU0rQk9ESzlVVVVES2hScXhoSHFRZFVKeTlXL0lBWWRpVXE2QXNCZDZQeWcwUUpaVTZUZlBPV1RUaDE4bXlNSnB2QkFMWEdpQ0ZWVHV3ejZkM2N3MHJrZkorMnppWEdSdmJTV3BYOW5SNDYzWUNubm40ZFgvN09HL2pvZXcvZzV6NTRQOGFHVy9HN3NWcFExK21SckdrenlSOWxTLzNrWUtmZEdvUnpRQU1POSs0WXc0RWRZemg3WlI0dnZUbUZVNWZuZWdCNmZ0VVQxUFZaOWVuTkFudGV4dXJnWHNYdmVuQlBhdmtrOWlwRU82Y0h6RERYeTR5dTJSNm5QazFOcFQ3M1MrOTR2bG5KRUpTWUJWMzNscnBkQW1rRjR4SnpJT1pYQ1ZCaHRBQTV3TnYxZDgydjVhYzUyMW51bU9OU0pYMFBjRmM2WUhZUWxLUjhhWU5lWnpRZ1R5amZVcVZWWWF5Y0FIbnNaMnFJWUpDRE9RRlJ0YzdXOVBJY0xQRnYzakNLZzNzMzgvZHcvTng4STBydFNqMlNWUFZ2bkozRXEyOWMxQzJ2Y1plU2g1TzFjT0crbllDNTJHUEVaVFRyTGx6YTV1RFFIbXlnUFRnUURhNEJjNDRJYXdnRTdFVXdBMENkTHVhdnplbjNrWDR1cjgybjcwRnd6cDNldUhIc0QzRUhoeDlha0orWU9Ieit5U2MvK2I4QStFZHJ6Yk00djRqVFIxN0R2bmMrb21xcjZQeUF1VHBIR0I4ZVZNOTJqSS93M3FIVGlZTkZKWG9HZzZucnJLNEhVSGdtTEFWUEhobFVnUUhCL1Qva3ZXbVFKTWwxSnZaNVJONlpWVmwzMzhmTWRQY2NPQVkzaUVNa3lCVUZFcVFvVzBvbU04bjJoMlRMcGNsb29wRkx5U1RUU2lZYWYyaEpHWGROQjBndW9TVnRUVXVKaDdpTEJZbUxBRWdDeEFDRGF6Q1llekF6UFQzZFBYMVdkOWVWVjJSR2hMdCt1RC8zNXhHUldWblZWM1dQbDBWRmhvZGY0ZUh4dnZlZVAzK3VyZVVCUi96czNMeVY1TjNIYldrbVl3cWFyUVpxOVRyNnZiNGhxbngrM2JIdGlwWEJRZHpGRVZncjl6Rm4xUExjc1VYT3VRemM4anF3ejNldmgxR2M0aStmZUFWZi9zN3IrTVJIVHVJLy9PakRhTlRLSHRDalFJcW4zMW9XUVE3b3JSUmpKVlNGUTRzTkhGeG9ZSzA3eEhOdnJPUDA1VTJrdE5xZ0NJQjVHQVBxUUJiWU0rQjdpNERkeGUwTzNHMGVDOUlhYWV5dWk3UkpFeVVrcVJkdUxweUw0RTREUmhLVjgwdFBTVFZJdW5kRjFlczg3c3FDSzB0QlMxOXRsUlo0ODNQbmt3Q2U1Nkc2a2ppMlZ1SUFtSlgyR0NhQ2xVVjEySFlyNU9KZGJ4ZDhnVFFjVGNsMlRwNkEzeXdsc3hwS2t1NTk3c0QycnpTc1FpQ0FkcXVPUjQ0disrM0k4aHVPSkVGUEs1Z3ZTQ204ZVhVVHo3MTJ4V3dacTlOSms1ZnNZd0twakZTdmFRK1hxb1ZndnVvVjlCUXBCRVNnTU5PcXUvZGoxQWtLeXEySlYvcFo5YnkraEJBQy9Xc2RLN0M0TWNiN3l0VkxmVmVwaEwvNXVjLzkwL3o4M0I0Szl5ekltL0JiQUg0UlFITzdoQlRPL3VCRkhIcjBGRXExbXYybzdRQUhNRnN2TzI5b2JLMDdvT2Q1dVEvNS9qQkZiNkIzaWxNYXdmVmFYdm93TEowaUFORGxDQUhyZ2hFZ3pwaUlqYkp6djVib2NBb3JGSmIzTGVMMTEzbzJyNmVDTTlkWndPZlBXQVRzRktGQS9nREdnTHZpNEU3QjFKdWpNWHNYL0tOUmdrOS85V1g4MWJkTzQyYytjZ28vODVGVHFGVkwyd0k5VVM5UFhVK1NoQVVpWlNVbENHQytWY1dQdlgwZjNuZHlFUytlMjhCTGIyNWdHR2UwZTFPRHVrNWNnUFBiQXJ0ZlZqRzRLeitSVjBaV1l6TVIzS0hKS2dkckFuMWE3MDV4NUYvZVNFYVpBZU8rRXdjYXpzTWNZUHJjenUwN3hMY0FieUlDbHNZQ3JHMmU4MTF2bDFWeXNJWURlQTZ5UlF3QS9RWUVWSnFDYjVTVGRZVGoxUFpaNW1CY1BESS9mQWJHZjBFd1RDZDFHNDFMV0tBbmlkMEN2djN1ZFM3clNaTGVuZDF3cG9wSEg5eUhrTFhEalNoaHZ4MENkZTcxRHhDNHV0YkYweTlmY08rWFhwdWhNMEVnRUNpOUFvcVlRV3VmWVlpMkFPeWFmVVdBTDRCbXRXcmRrdE9ZSW9sZGI4eERaVW5RSGdjcWl0SGI3TmwzcW5leVpPL0EwNmJZTkdkLzRSYys4YStMTzMvdmhIdGlnNXB4NFIvK3cwLzAvdkFQdnpnTDRLUFQ1a21URk9WeUNYTUg5N3RJOC9iS3BRQWZmSGpGcWF6WmtqbEF6Ky9TdW5tbEZGWTNCbmpwelRVb0ltY0VraFpzaFNXaTFxTGRmQzEyT2dBT2JPbVRjSXkwWXlqNFVTcVZVQ3FIMk5ycWVXdnhjMkJzM1QzQ2xXUFg3TU1yMjl1TUpnUHVsSmJ2L2I2alVQZ0ppTW0zNzFDSUU0bVgzcmlHdi83dUdTZ0ZQSGhvWGp1eEVjSnJZYjYxbm5rWWdqQkFPUXo1YlpmVy9DNkhBUTR1TlBDMm8zTm9WRXJZNkEzellJOWlVSGYvK1k5YkErd3VMbE9QdVJnLzMxNE03dFFPdTZZYXNBQm5WZW5DR2I1eElxcm5TVFV4OWkzWmpRUUZrVnVHSm9UVGpHWGpjZ0RzMVVYdDh2TnhkYnBBMXQydWU1NUpBQytNdEF1bGtNU0oyMVFtSUo4TmJQMjY3UnZUbnNEZDU1dlAyRFh1Rm9pRWU4WXhSMkNaRnE2Q2RtZS9qempqSU94NzRzOEVBYlNiTlR6MjRENzJuV1Q2bGZjZk84T2NON2I2K000TDU0MmdBL3Q5MkM5S0FDVnR1R0gzSGZIc0owZ3ZJUmpqYWVpWENBVGFyWVliNjhROEtqdGFBV056UUVOWFFhRjdaUU9qd2NocFIyMnhIcHRyN3dOQW8xSDc3My96TjMvaGFmZWw3TTF3cjB2eUFQRGJBSDRKd015MEdkNTQ1a1VjZU9Ra0txMm00M0NobmVCd296S2x3Snk1S0N1Qmt5ZTg2MXNSMGhRUWdiUUdkMXExWlFZbmsxZ0U4OElHS012QjIzRXRZQWU5bFVaTTRIQ2l6QWZabm1zakNFbzRkKzZTQlhNdk1JTHZPVE1oWmdGdUFGdXdGLzZ6WnlYM1hZTng0ZkRuejdSZEFlTVQ3TFJONDc3RXptQ0VQLzd5Yy9qY04xL0JmL1NqaitBblAvQVFTcVZnb3JHZHYrRU5FUjBuY1ZoUmd4RXZRUHYwZnV6WUhCNDlNb2MzVmp0NDdzd2FWamVqWEN1M0JYWGdsZ0Y3N3ZaMjRGNlVqN1ZGMEEyREVMN0Z2RTdocWVZTjgydkVPVXZ5czN1bkMrK0ZPOHQ1V3llVG1tMCtMNU41SDBwWVAvclVKaCtVSEJOQTE4VHNGUUk4TXI4RHh4b1NHSU14SG9EdjJDV3I2dmNsZWYvYXRZUVJqOEtnM01kbGhpU2QrVmF5VnRvbHVrQnBvRlh6aWkycGE3ZHFlUGpZc3ROQUtQTlAwQjd4WnZHcEFweVRXZGZ6blY2a0FWNDY3V1lBQUd6Tk81UlpxaWFsMjFFT0FvQzBHZ2RodEt3MGwwL2QwS3hYVFZNRVZLcmNXS1AxOVJJZ1hha3dUSmdjSkJoc0RmejNMQUR1YThHTks4dkVuUDZ0My9wSGYySWVTMEEveHA0MHZydW5QTjRWaFNlZi9PUU5BUC83VHZMRW93Um52dmNEeHNucE1OZW9XRkFqYVphazJ6VFZYcWZJMjF1YUt0em9ESFhhbEh1dEEvTXVaN3pEVVpyVWVNUlRDbWtxOVVIU05rdWZLTWs4MjJuci9zUjRtSk9VTDVWb3RCbzQvcURlRXBjODhLVlNJVW1sOWtabmZxZWVsenNKcVNTa1RJMUhQT2JSTHBXbW5lYVEwbFBOcTRMamxvU2lncjFERlIrR0RPM2t6M0U1UlFldzFSM2lqNzd3TEg3bG4zOEJYL25PNjBoUzZVbFpub1RJcExBc0NCRnB5RXBDRGtEMDd3ZjN6ZURuZnVRb2Z2WURSM0JzcFFrN1A4cWJ5dnZiM014Nm9ZUFhUYXh2V0ZtMnEwMWVBbVZYTm1jSWxWY21xRVRLeTE0TmVGdHNlcElRWFQyMlo1VFZjYmw0QSs2QWs2SUl0QzBaTmJHT1ljaDBOb2pCRXBtQzNZc2dMMmVra3JkNWJObXNPU3dOd0wwZ0ZvQzZCWDBucmZ1TWd2REdUUmd3YjI3V3MxemdlYWtMdVVUUEpma2cwSFZrUGQ1NUI3dzhuaVlnNCtVdTd5RXY4TXN4K2VabWEzajBnV1dFb1h1ZUlCQkdZd09yT1JCQ1dPOThnclVwR3NiNHp2TnYyblhuanZseGZVbjhub0Zra0RlOVFNQ3VSTXIyUDZEYldDNEZxTmZLZGlqNUJuTHVQWUV6Y2txZ2QzWERqZ05QZzhFWXNxeDJvdDF1L3ViYjMvNEFyY3Z4UnVoZUMvZURKQTlvVjdlL0RHQnUyZ3dYWHptRFE0K2V3c3krWmNCd2xEUE1zajdybjU2SVdDZ0VZcW4zamIrK05VQ1NTajBJRmN4Z2xkYUxsN2IrMUZ5bk5BUkdXMjhMUjN1VW51L2xFb2tPeWc1UUFGYTY5eUJYS1ZTclpUeHc0Z2pPbkxtQVlhUzNSblZFT1NOeHFZd2FTbW11MWtuMmZwcGNLQmpHTzBoNjY4TXQ0ekx5WWIwVDRWOTk5Z2Y0eTYrL2dyLy9zVWZ4bys4K1pnMm1nSXdVVDVLa2tRSmdKQ0JCYW12aGpIaFljcDNiRUtQOTgzWHNuenVFOWQ0SUw1eGJ4K2xMVzRoVGFSTVZQYXIvbmhob1poTGJ5OTFLN2NRTmUyWFpPNndNRjBqU1VuQmU0MndmbUhGc0xleWg0RG1xNFV3VDlhM1pHbGpQcWJLMTZkUmdScENaZTBsZk9yZmxBOTU3QXdNRU1Vbk5QNTVacytrRHMveVAxVVZnQ0RqdzU5TUwzcnk4clpmS2NFd0lCelcrTnI3NFd6TXNFbW1VN0c4eU9IYmpFcUJ0V3AzaG5TSWY4SVpwbTV1dDRhRWppMjRyV09GZU9MRmQ3RzJDWUpvVVdjTlJqTys4Y0I2ak9OSFBiNzZmd0hpWjFHdmZBUVF3THJuMXVGR2dxblF0d3FSTG9lQytLODA0empScmR1eTQ5ZkJ1RENuRE1KS1JzMUpBM0lzUURZYnNQVHZwM3pJSHdta09oQkFJUS9ISzcvek9yM3lhWGdsN2RHMitzOGZDUFMvSkE4Q1RUMzV5QXp2Yy9VZEtoZGUrOVpSWllxRUhiTGtVTW9CWHNPNWEyVGtNOWZ2VWtueWtwZUJVZW43ZzlXL0taNlRvMVBoK3AzU3BrOUpUQlpPSC9NeExWbzRwVXpFLzlLWjhmU2lFcFJJZWV2QW9hdlc2L2tDVWtjS1pqL3pFdE5INnR6ZCs2S2s5ZWp0RlV2dDc4cDBMMlZzVFFMWW82VFpaOW1TNHNkbkhIL3pGOS9IZi9oOWZ3aFBQbkxORWhRaTFCUWRsaFVVbVpUamc0Qklnd05JeGFROENtR3RXOEpGSFYvQ2ZmZXhCZk9UUkZTek9WQ2RLNnhNbGRoQXo1NlJwbThReWRNVlNPOEFsZmo4ZmxOT0xrT1N1L0ZwQjBwQVM1TlJFTVJRUWxyRVFwbDVIS2pPTk1OR0tES2FVSHcvcU81TlZzSHNXSEUwRFJTWVBFWENxbDk0Skw4eUNLdisvSGNBYk5LYjZQSWsyY09QR201Y1BoQ2VKQ3dHN3gwSWdqT1R2cFlHVHNwbTBucHVUSiswQVNjN21OMmtTdUYyQTlUOXZyc212L1B4c0hhZU9MYU1VQnRhdVFEKzcwd3dVYWJlRWFXTXFKWjU2NlFLaVlXS2Z5ZldoWHhZZ1VDN3BJeERDTWt4ZWZ3UEdGNzJ5ZlYrclZsQXBseGdUUkV5ZHNuSEVWSkhBQktYUVhkMjA5YnB4WVZwVjBKOEFzTFRVL3EzOSsrZVZLelVIOW5zcTNDK1NQS0JWOXI4Q1lISGFERGN1WDhQMTE4OWkrY1NEVUVMcHJZek1KbWtBQUNBQVNVUkJWQWpKL3pxY1ZHdU4xd0FvQ1ZSS0lVWkpqSDZVYWdBWGVzQUZ3ampDQ1FMUCs1S2JtdzhBcFYybDBpQnpvMElZS1FLT21oSW81SkJSc1Z3Nm53b0Vqajk0R09mUFhzTEdSc2NTWjUzZFNWV1d1S05ZWXMrUDBtd2lNZm4yK0lLMnpiS0RJbTVyS0dyZjFmVWVmdi9UVCtIUC8rWWwvUFNIVHVCajcza0ExVXFvWnlBRldTTTdVTEFGR1NrREFxRGxTc0tJR1ViZUI4eTcwR0NtMzJrbERQRElrVGs4ZkhnTzE3Y2l2UHptQnM1YzJVS2N5RUpwM1VabFhxcktYR1IxQXBPa2RpOS9WcHZnSlhOTUFxQ0p2QVprTXBveTgrc2tYakZKMi9hWmNveUJGV0ZkSnpwamJlSExqVmFFWWlTV3ZnbHIwVTNNRmdOcHNOeWN5YkxnSTJpKzNsZlRaeTN2TFhVUFdKeXBnS3k5blJxYkdBSW0yVnNWZElaaFlML0Iyc2VmV1dUN01CUHNHMk1PdXJoR2ljWXRTY0tXeHBsS2hBTG1adXQ0NE5DOFh4ZHJoQjYzakx2eTJDd2dUU1crLy9JRmRQdERzM01jek5JNDNVTGFPUTVtbWpNTWdHcEpRQ21wdnc2aDNZVUhVaUExTzhXNXhSUjZMQVJCZ0ZhakNuS1dZNWZJbWZkRURLaWdQakZhaU9GR0QwbWNNZ21lOVEvY3A4djd1RlFLWC96VXAzN3RzL1RhQzQ0OUYrNGJrSC95eVU5MlB2emhYLzVmc0VPSi92UzNuOGI4MGNNb1ZTb0l6ZHcyZC9HYVZkdlRISFVwRUVqUzFCQkZNNkFONVJOU0wveEFFQmpMWGZxSXRTWkhFakVENHppaEIyZ0trZm1ZbGIwUWhXUEl5VkFDQWtlT0gwUndZUldyVjIvbzI3UWNNRWZlaTBOUkdySERGR09UalVtNms3YmM3WEJqczQvLzU2K2V3NmUvOWpKKy9MMFA0T00vY2dKenJSb0NPSVpOWXp0UlVoUlFDNUNHMmFvQXJiTlJUNzJxMHl6TjF2RFJ4L2JoZzZlV2NmcnlGbDY1c0dtODZkMXVZTGQzeCtSVnVUZzdHcFZtUEtrYklPRDhsZE9RRGtqS0Z4YkVsQkIySnpHUGJoTGdVYWZrbnRpcHQ1MGx0di9GRUlBVE0wSFcrc1FFWkdETTVuRXg3SUovMXdiZ3ZiWHdURm9seVJqQzEvNjRlWHBkcU04STVJSGR6VEViaGdKQXRWcENyVkpDdFZKQ0VBZ2tpYmJYaVZPSkpFMlJKQ25pUkxyM0pKdzNPeWdnRklhMkNhR1pNQUo3cGRDZWFlRDR3VGxrZTRiZ0V5Q0dJVU9aVE5sU0tUejc2bVZzZFNPOS80QTA2bS9pdlpnQm5SQkFHQXBVUWdGQVFxYU9YbXBuTmRJd1RjcXE3Mm5wNmt5amFweFhPVnBvMzUxeTc5MXFqSlFBa2hUZEcxMy9HMlNHZG53VkNJOC9lSERwdHhxTktuOVNrZmt0Z013SGQ1ZkRmUVB5SnZ3TzlMcjVSNmJOME92MmNmSDVsM0QwdlkvYmdaSmRYcWFnY25QMTVWSmdPR005Q0RROUZIWU1LUUJDU20xdWFZaTQ0NEFOOThxSWtQVU1Sb3dDTlpCRmMraytTMWpkeDZld3NuOEpRUkRpNHNVcldXd1pjekU1WkVkc1B1c09FSDNhNFgrM2VlSnQydGtmeFBqOE4xN0ZYMzNyTkQ3MGpzUDRxUStkeEtuajJ2ZUNkcEdzQ1ljeXpKdjNRajJ4blVueGNGS0lsVmd0bjZBTml4NDVNb2RUaDl1NHNSWGhsVGMzOGZxVkxZeVNIR3B2Qyt3NjJUaHdueVMxbTV6NUttRTFVN1N2cDIyN0EzY0ZEZTVVQmtuOUNucnVVT2hJZSsxNmpaQ0I5YU1sc1p5MnVqbFkzam8rVGNMVGVlRE93TjVLNzZCdms0RXd5Q2JBVGNGNG1nUUc4RkI1WUxjYUFSYlA2N05hQmJoeUJBUm1XMVdzekxjdzI2d2FZQTg5Q1h0Y1NGS0pqVTZFamM0QUc1MEJPdjJoOVY2bmpJemlCQUhqNktaWng5RURjNnd2K1FzM2NjeHlQNXRNUWVHRjAxZXh0dFczS3lTc0JHODJ0Z2tDUUVrSG9OV1N5U2tGaEhGbm02cnNHbm5IWEFqb1phblZhaGxLU2toRjYrR3A3NFhkV2M2OFhzMVlRS0YvbytOTnZkR0RDTVAwYUtuZWpCMlRwbFFLbi9qVXAvN3hsOWtUWndFZTJJTlc5dmNWeUQvNTVDZmpEMy80bDM4TndCZDJrdStOWjE3Q3ZwTVBhblY5Um1yMzFmWHVPcFVLUyswYUxsenZXWUpYQlBZQXJBR1dremUwcGIzbGhHRWtlRGlheFVjUGozQmdEa3NJc2tFSVlHbGxIcVZLQ2VmUFhyVExBTDNQZEh2a0hodW1oL1R0RUgxQ3BYdUtGODRHMTdnMFRmR05aODdoRzgrY3c4Lzh4THZ3c1hjZnhiR1ZHV1NYK0FqRjNHbDZSUm5SaGdNK0V6dG9uVEEzb0F3QUxNN1U4S0hIYW5qZnFXVzhjVVZMOTZ1YkE3L29IUUc3dmV2ZFZKbVVPWEJYbVJSQ01GRktXWVpVZ1R5OU9jbE5wL0dCMTJFMUY0aDRweEc0cXd6SStFNXpMS2liRDhxemo0RFRITEJTWFZFOG5pUTd6a0J3RXArVnJrVkdJamRIVmoxUFJwekVEOW1sZFF6Y0F3SE16ZFN4c3RERThud1QxZkx1eUhVcERMQTAxOERTWEFPQUJ2M05ib1RWdFM2dTNPaGExNjhLdWt2YnJUcU83R3U3ZDVGNUI1elBzcFNGTzRHQ3drdXZYOFcxOVk1SHowUUdoT243RUtGQzJmUVAwU29OeFc1blNPMUZWR3U2YUZPYVFPbTk0dTFXTnN6aERVbi85cDI2VkpCUmpNRlczekZRSXE4Z0tyaVh2di85RC84NmUzeVJPWkQ1dldmQ2ZRWHlBUERrazUvODRvYy8vTXRmQlBEVDArWko0Z1JudnZjTWdoOS9tM0dDbzRtZEo5RWI0a1Flb09KRW9sNHRvZDBvWTZNM1lweWZKZ2pLb0x6OVRvaCtPWTdBWE5NbGZTN0NTVHdnT3Vhays2eGxmaEhnVTVudDlnd2VPbkVVYjV5NWdDVHhtY3NjeHQ4RTZJOHJjL3VpZG9Ma3QvdmJ1WG11NHFWemE3aThsV0Jscm80UG5GckdvMGZhVmpyVDY0R05GYk1nTjdod0w5bnpFSVlNY1dVVUtDUGxsMHNDSncrMWNlSmdHMnVkQ0QrOHNJa3psN2N3U3B5UjcrNkIzYVhPcWVTejRNNmtKU2JDYTNBWDd2dWg2U3YzUE1pOFdnSTZkMFB6RFV3YlJ1cmh3Q1ozV1luSjRNNVRSS2FpQW1KT2tqcTF5K2tEOHQ3cTNCeTlnRDhkVjZSeWh3ZndudE1icGpuUXk4T0VUWDlrWHh2SDlzK2hVZzV4cTBNcERMRFlibUN4M2NDRGh4ZHg0ZW9HTGx6ZFJKSkt0RnMxSEY1cDI3VGpmVmdZTUdiRWpTYXNYbnI5S2xiWHU3cS9TR29IZ0VBQjB0Z3BtQ0ZkQ3QyVWdTU20ySUM2bGRwTldzM1hDV1BySWRCb1ZCQ0dlak1wSWR5YWV1dFdUQWhISTYyYVg2RjN2UVBHVGRyeFFUVGNxZXpwdlFLdFZ1My8vZFZmL2Z1dllqeXdaK1AyakpoeTM0RzhDYjhHNENleGcrZTdmUG9ja2w0UHFsMXpVcnMwdnBvTm04dm42K05VeHkrMjYraEdDWktVSEN3NEwzY1c3RUdERFF5Z2xaVjhPTmh6Nlo0QW43THRCdkFielFaT25EeU9NNitmeDJnMDNzWHl0cURQMnI3VGNCUHkvQTVLdWYxaHV4WWtjUXhBWVhXamo4OSs5eHkrOW53Wjd6dTVqSGM5c0lCeUtiRHZSU25GSkh3NENaOGtXQ3RXTUVuV2NaQ01FSEVKQ2xpWXFlRkRqMVR4dnBOTE9IT2xnMWN2Yk9EYUpwdTd0ejkyRHV3dXEySXAzQThuMFJsQ3pKZ1NVZ0VEc002Y0hPYTYrWE5GLzhsUWpMZ2dSVXl3VHVja2N0YzlicTVmbWVrQU42b0UrdzhJMzYrOUVoYVFLWTVMY2RiU0duNWJlWXV0bXArN3pRVUJPWmp4SFZmUHN6bDg0ZWJ3bDlwTm5EeTZpRWF0akRzUnF1VVFEeDFleFBFRDg3aXgxVWNBNGZaWDRNK0k3SHMzUGNiblZLVENpMmV1NHRwNlY0OXpCdWFhN3lMN0N3UHVnUUFnN1U2V25sRmRJQ0NrZ2pMcWRXRlFudWJqSzJXQmVyWHMrN01IdkRxNVdRZHBFVWFkQVViUnlBTndBbmp6WUpZSnB4NElBckh4OHovL2tmOXRPQndHQUdTOVhoOEg3R0J4ZDU5Z21YQmZMS0hMaGllZi9PUVBBZnp1VHZJb3BiQjE5WnAxQUdNM3FWSEVaZnBPY2hLdGIwY2dCSmJuNnZhTmpuVVdZdjVnR0FaejB2Y1k4MkNpN0h3US83aVV1elIzYUltVHM1Nm5iSXFWVzZtVmNmTGg0NmczcHQ2d3o1YkZqK0xJbXc5RnhlNzAyQXQxeEhIaTNwMENPdjBZWDMzMkVuN3Y4eS9qcTg5ZHh0WWdabk9zc0FUUEVoZzZXVW5DU1JTdytmTEdWNTdrQWFBY0JqaDFzSTJmK2NCUi9OeVBITVBEaCtkUUxRV3dxeXBZcDlDNDRiM2t4aCtOT3piT3FDL3NPS1p4VFV5SWdVTXF4SkkrNFFvMFA0UXJCcVNaNEVrTEdaSk00T0JPZldUN2t2cVovODZsVTVhamRmUDJncGR1d0p0QUlhK09welg3K3JjLzk2NFpGQWZ3dElUTzF3WUl0T29Wdk92VUFUeCthdjhkQTNnZXdqREF5bndMaTNOTk5PdGx6OEdOSGFPc3ZmN1NQZjJjTDcreGlodG1GemU3VkpBdEF5UWp4VXBab0ZvUjBGNXhtZXRkOXI0OEZNMWNCNEZDcTFGajc5UU1NLzYrUGNiTWhFU2llNzBESVBOdFpjN1ozeXNycy8vbkJ6NXdZbXM0SElvb2lvSit2NS9iLzZqZzJEUGhmcFhrQWVBM0FQd0Q3R0JKblpJcGV1dWJxTSsxODViMUlHS24xZmh4b2tETExWcTFFbVpxWlhRaUxTa0xreFpBUnJLSDNUQ2lTSlZ2RFo1MklOMjdTK1hxWUdLT1lWUVJoaUVlT25FVTU4NWVSR2VyTjNVbmV2MVRFRmNvOGR1SzcxellDMnh6bktRTXcxeUxvbEdDNzc2eWlxZGV2WVpIanN6aEF3OHZZN2xkTSs5WU9DbVZXZUNSZEVLR2VIWk9VZWc4Z1dBYkdiRjBsSkh5ejdlcStPRER5M2ovcVdWY1d1dmg3SlVPenExMm1UcGZaWnZyWXNlbzVCWDhDMG9WMERNQWdCQldhcWN4Q0RiMmFkd0dvTzlMbUUxQlRMelE4TzdVNWh6NStlQlNJT2taWGpyNlBndzdaYk1KMksyYmlXbFNHbndzK0RPbVFLZGo1V2VzL2dYN1ozOTdUQUF4Wm56K0hWWTlId1RBMFgxek9IRmtnVW1UZHk4SUFiUWFWVlRLSlcyZ3g5MTZtOEZKTWZSZWxRSDR0YzIrMDRvb3pSeFo4RlhDU3UvazRkT1pveGdWdktCUnp2dFBncGFlQnNiamFMMWFRU2tNekpiZlpBUksvVStHckc3S2xPaG43OXFXTmZTelRuVE1rM0NKbnF2c3krWGc5Qy8rNGsvK1dSekhRa29aS0tWVXY5OVgvWDQvck5WcWFMVmE1UFVPbWJNbDczYzczSmVTUEFCODYxdS9zNkdVK3ZXZDVBbkRFTjMxVFl3R1E2dWF0OUs3Y1RGTDhhU2VKNEZsWmI2T2tuSFJ4Q1cvSXNuZWwrN2hTVlJFWE1kSjk3NFRGRjRlWEIwb2x2QkZFT0Q0QTRmUm1tbmtNKzR5cURISFRZbkU5MHJJUEZjOGltMi9GajEycWhSZVBMK09mL1hsVi9Gblh6K0RzMWM3dnZUQzFjWldsZWlrblp6VXdkSlpNT0gzbVJRV0NPRFFZaE1mZm13Ly90TWZmUkFmZStjQkhGdHBJUXlDYmFWMkdpWjIxRm5tMXgvbmp2c1VockJUUGxZQTRPWjVGVE0wTkEwZzZVcy9INmVWYnVEUXMxSWZVQTQvTDd1UmtkNUpNcmQ5eVJsaVZpdEo3N1pPcXRmODVoSjkxaHJmU2Fqc1BweDBTd0IvNHZBaVRoNWQzQk1BejBPbEhHSmh0bzVhcFpTVDZMblRIZ0Q0NGRscjJPZ01tTlRPSkhqRDRGVExBdFdTM3cvTzU0RHJPOWZQOUw2RVpSWUV0TU95UnJVQ3A5SGk0NTh4Z0t3N2hRQ1MzaEJSYjJpdnM5K1hpeE0yRGdCT25Eand2OWJyWmRudjk0TmVyeGRzYlcySjBXZ1VSRkVVOUhvOTBlbDB4a24xZXliY2Q1SzhvRWswUUZ5OCtMMS9lZmp3QjM0SndHUFQ1QTNEQUdrcXNibDZIWE1IOThNNGVqUUdlTENncTZReUxrZmRvQXFFd0lHRkJ0NjgxZ1dKNTl6NGwxc2hGOC9iQTFucEhvQ2J1OWNacDVmd2dkd2NQdDA5Y3ZRZ1h2M2hHMGlUeEJmUmJPYWJINk9Uc0h5czlGK1krR1pic3NPd2c3WmxreVpja21jSmloVE9aNjkyY1BacUIwdXpOYno3b1NVOGVtUU9sVklBcS92a0FpdGRDdUVLaFovT1R1Tm43MWtOZ0xBREp4QUNSNWRiT0x6VVJKSXFuRi9WYmJtMDFrZXFYSjN1NUM2eVQ1SzFycmR6b29EWnBNbEJyMkRQcGlDc1N0aTFuUjZhemM4RFZvWWtvdTRjbHZDbGRpNnZicGZ2SU1mMkRBR0RiUTluclB6dnhCSVNIaXVZMjFyT0VGQmFBbmhlanZHNnhnRStESUJIanEvZzRQTFUrMnJkOFNDRXdFeXppdklvUkc4d01yRnV3RW1sOE1yWlZXeDJ6T1l1NXBZQTdQeDZLZFRyMy9YMEoreGFlV1hTdUxsM0JyNUsrZlA1VE52VmFsYWg1WDNKNkpyUkFMQXhUckZDS0toRW9uTnR5NWFmM2N5TGowSCtIVFVhbGEvOS9NKy85N3VEd1NBSWdrQ1pJMUJLSVUxVG1hWnBJSFVJMnUwMjkyTVBPTzcwcm9kN2VxdlpiT0FBRDBCc2JWM0V3WU9QdnhZRXBYOHdUZjYvOS9mZUE2VzB0YjBRQW1HdDZ0VDJJQ2xIbnp1REdKZHU5SG5kS0lVQmhBRDZ3MFRIc2Y4MCtEUHQ5YS9aUDQ5ZUk1TlhpRnhaSnRyUGxDdFhoeUFJVUt1V3NiSFJ5YWZMRlRyeDdtMFBkNlBXM1g2WlFnQkx5d3ZqeXkwb3VEOU04UHJsTFh6LzlEVnM5RVpvMXNxWWFWU29SQkR2NXRURldkU3kveGlRNXROcDBIVm1ZeVR2QmdLWWExVnhmTjhNSGo0OGg1bGFCYWxVNkVheFpVNXlxdnhNQk1GcklNd09aSWFZa3NjNERYd3VYb0NXa25IcHpjM3ZPdWN5Z3BXbGFTYUJKYStEVzc2THdKOGpIemVQN2tuZ3pMTGR6YkU3bDdNa2RYc1N1L0RkdDNKcmVTNjl5elIxYzg2bW5sSW84STRUKzdGL3NUVjJyT3lsVUFxMWE5d2tUZTA3a3dwNDlkeDFiSFlqUjlzNHJSSkFHT2pWSDJSOGFWZVVjRzdScW9yZ0N4eUtESjdkdldhamdsSVlXa0dMQW5kZTVtK1VwT3ZwMytoZzJCL1p0Tm1RMjlORGx4Vi8rTU1uLzV2OSsyYzNLRjZhdVFzcHBUUkFyMHc4MGpSVjlYcWRxNXg4OWROZERQY055R2NCbm82TEY1OCtlL2p3K3g0VFFqdzZLWDhZQnZpeEgzdmMrbnVQZW4xVVd3MGdDTmxjdkFQN3JmNElWOVlHT1pwYnI1UVFqYVQxTXVYQTNVZHJubTA4Mk9zZjJ3RitMczVGK3huWnIycXRpaVJPTUJqd0xVN3pZUzhDLzE0TnpXWWQ4d3Z0UWpEbndVcjJMSjJVQ3FzYkF6ejd4aHBldmJocDU5TkxZZUNOQndKeVVuUHJheWZ0dW1zSDVsWnpSS0ZvYkJoUVc1alJnSC95WUJ1TldnbHhvaXpUV3J5OXJNM3VscE5wQkxaeEFEeGdwWllLY2dobDRoRTRKc0NDYzhETDUycFZBdWNNY0xQcklrWWdWdzZWRVRpbk56a21JQWZtamduZ1RuR0NqT2U3SUJCUWFlSTV2Z2tDNFBGVEI3QTAxNXc4U1BaWUtJWDZSZERlR0srZHY0NnRucUVkaE5sc3ZWMDVGSHI2TWp2V2xjTkF4YmRoem9DenlnQit0VkpDcGN3TkVoMERxdE5yalpXM1hGUXBKRkdNenJVdGM2bnNPUXZxMmZ0emM0MC8vdmpIMy9ZVmM2MDByanRnVDlOVWNvQ1hVaUtPWTlWb05EaTQ3NG5OYXU0TGRmMDRnS2RqYSt2U3I3WGJoMzhDRTNhcEs1VkM4OEwwSmkxcEtyRnhlUlZ6aHc4eUx0RndkRW83bEZCMm9EcGlCZ0Q3NStzNHQ1b2dTV25KQjJBdGVFbUZ5Z0I3bkNyZnBOeFduYytTSTYvUzEzY0o5QlZEaS8wSFY5RHI5akVjampBdUZPR1ZVN2V6dTJPWWlyZFNXRnBaOVByZFU5TVhkR1F1eXJ6NGF4c0RmT1VIRi9EVjV5N2g0Y050UFA3QUlnNHNORUNHU1ZERUdKS3pHUVhqTlZTL1ozSVhDdGo3amk4VFpuQ1lrVVFNZ1ZGOWtvL3pXaVhFdzRmbWNQSmdHLzBvd2JuVkRzNnRkbkNqTS9UYVNzOGdxS0JBZ0FhOTJaYkdHdFNSRkVjYnFGa1ZLYUFsZmZaUjZQR3F2NjhnTzV6czl3REd6ZEl6WlJqYW5JaEp5WVJyajJVOFdKejk3YmZKRnVHVlJmZUVKOFc3dEE3Z2orMmZ3Mks3Z1hzeDFLdGxTS253L09scjZBMkdaaGtvN1NRSHlFRHZzcWszOGRJMlRLUXlGelFzaEdCTDZaUWRxOEt5cFBiMWdJem1TcVVRalZvVlV0R3VqR0NwbFdITUpLQ01NeHlRRksvUXZVYlc5TWlkdVlxZTN5dVZ3b3MvOTNPUC82R1VNaEJDS0tXVUZIcmJQeW1FQ05JMGxVRVFCRkpLbFNTSktKVktRUnpITW83aklJNWpPUnFOZ21QSGp1MEpnQWZ1QTBsK080QUhJSzVkKzJIL3dJSEhyd2RCNldmSGxhT1V3a2MvK2c1allLZWwrZEZ3aExCVVFsaXRnWng1RU1oSG94UlgxdnBNd2hJV2ZBTWhVQzJINlBSR2RwMjgvZS9SRzUvNDVHalp6VWo0dW9CQ3VIVURYYURSYUdCamZYTmN0MHdkSnNMNmZjMEFhQXBScTFWeDRPREtOcW1LSXNZc0VWTWszVWQ0L3V3YVhybTRDYVVVNW1lY2RPK1lQUVpJV2RWUzRTREpybjRXK2NHcFhIUzVGR0J4dG80VEIyZHhiR1VHMVZLQWFKUWlpbE1teVF1alptZlhKRTB6OEhQWG11cGI5VHZMNDFUenZrUk9aNjVhejU4elVqNUVSdUtIclVNUU9GTSs4a2JIMHdVOHZZNFBXWG1lVkMvOE9DRUFtYmlkMTJhYlZienRvWDI1Ny9wZUNwVnlpUFZPSDcwKzg3bGh4a0FndEhwZXZ6NG1mSENoSUtzV3Q5RmFBRllzSGZGd3JYb1ZOT0hQZDBXMCtZeVdsWmV0RkJCdDlCRVpiUU9YMG0xck1uRjBmdVNSL2YvemlSUEw1NDBSS3Fua1BSVTkvNTBraVpKU1lqUWFxZXZYcjR0ZXI2ZTJ0cmF3dkx5OEo0RCtuZ2I1YVFDZWprdVhubjcrOE9IM2ZVUUljYnlvTEtXQTk3em5KRUt6TklPaytxamJRMjIyeGRUMmV1bFNra3BjdU43TDBWQWlvT1dTRmxmNnd5UW5VUlNEczhoY2U4L3BYeGY4eU1kbHNWWGs0d0NVelBhTXZXNGZ0eXRNUmRMeUhNcXRiOGlPZ3BwNG1RMzdENjZnVnVTSElLUDFHRnVNR25kUHh3NkdDYzVjNmVEcDA5ZXgxaG1oWGlsaHRtbm03aGtvMitDTkdhZTJwL1NDU2NGRkRDZlB3eVh1U2puRWNydU9FNGZhT0xMY1FxdGVob1RDTUU3dEZJSVAybFNOOEs5RmRtN2R6Yy9UUFpGTG94TmsxZloyZnQvK05veEVRSG45N1YyempJRk5CN1l0TEF6VDRqRUduSkZ3MTJFQnVKTXFYOG9VZ2REMk91OTYrTUN1WGRQdXBiQTAxOFNWR3gyOXdzaU1vMEJvSXpzQWJDejZnT3dEdjNKcEFVK0lJbFc5VWtDelZrR3BGREpBRnd6WWRUbjh5eUp2cGVsUXErbjlNbDBvQW5pbGdKbVoyaGQvNnFjZSt6Y0U3QUJBcW5wK3pRQmVLcVd3dGJXRktJb1FSWkdLNHhqcjYrdnFpU2VlVU85Kzk3dTNvUnkzUDl5ekkyNG5BRS9IMXRhbFgybTNEMzhiUUtGWG1LMnRQc3Jsa2xYWDY1ZVk0dnI1aTFoNjRKZ2RwMUlwbE1NQWp2TVVwUGtFNmJLVkF1Wm5haGlNRXZRaVo4VXVBQ3ZkODJYRGdIS3FmRk1rblFyVitUb0xLRWRXcFc5dlV6bGoxUHFBVmpOM09qMzBlZ093TExjc2JEZktSV0dpdS81dDVNSzRGcFZLSmN6TnR6MnhaUktZVDd6UDdoVE43U2Vwd2t2bjEvSFN1VFVzekZUeHpnY1c4ZWlST2RRcUphWVRGMDRYYWNab0FFTVVqWDZTckl5MTJwUDcxQ2VPZ2J2aGhRVndLbGNwaFhhamdwbDZHU2NQdFpGS2hXdWJmVnhkRytEcVpoL0RVV3FtQVV6QmdXNkpWZXViVTJDK0F3WHlWT2Q2Z2NaK1lCdEgwMVhNVHowTUV4STRUb1RXdlB0NVhjbWs2ZzJ5ZFFoaDY0QWdOVDRzQTBHY2dFOVlGTXNEeDZDQUdBaHRqSGp5eUNLYXRRcnVoeEFHQVU0Y1djS0xwNjhZT3dxbHg0bzBrOURXUDcxUnhkUExGS1NxcDJGb3BwWE1RSGVhRlFEUVUwYVZTZ2tHVzkxWWhhN0gwbExsN21uMWliUnFlbDV1MGZka3A3MkVRS2trMW4vMFJ4LzZsRkpLS0QwUEd4aGdENVJTMGx3cklVUWdwWlJDaDJBd0dDZ2hSSkFraVJSQ0JLUFJTQ3FsZ2t1WExnbGg5UDIzNTAxTUYrN0pkZks3QVhnQTRxV1hQbk0yU1lhL09hN2NUcWR2SlhoM1ZoaDBldGk4c3FvbGZDUE5reUVLWTFNdEUrQTBSd3I3NWhvRmE1RmhPRkRGcmlrZjh5REd5cUpSd2ozWlVlRDF1bktMeW1abHNYS1VVamgwNUFEQ3dDMUd5aDYzTXhUVnR4ZVBjV0ZoYWM2QVZ0NGpuTzM3Z25mSkU3bDN3ZDRsVDhYZnU1RmViblNHK09wemwvQ3BMN3lNTDN6dlBDNWMxMDZPNk91d0FBVW1ZUXJIeEhGMU5jRE9qTVBrZVlrNGUzVVlRQ3NIQVE3TU4vSHVFMHY0K0h1TzRzY2ZQNHkzSFYzQVVyc0dZZVpvQlQwYjFhUE1jOEV4RXRZUG5uSnI2UDMrNG15SWlhTUlZaDZVNDNYb2VaUzd6SlhCRkJ5c0R0YUpGTWY3enZ6ejFQNHdCSlZkbDhJUWM2MDZEcTNNNG40Syt4ZG4wSjZwR1FPN3dPc0Q2b0FzZzJUSEVvdTNJeTR6THNOQW9GRnpxMHpjTytKTWxSc1AvQjMxYjNTUkpxa3IxNDV2VER3Zk96Yi9lOHZMclo2VVVpaWxnalJOaFpUU25wTWtFVkpLWWM1QkhNZWkyKzBHYVpvR3crRVFTWklFL1g1ZmpFYWpZSDE5WFZRcUZXT1hlWGZuWis0NVNYNjNBRS9IQ3kvOCtlODkvdmgvL2g4TEVid3pXN1lHZVRjbno5WDJhNWV1SW16VVVXazJvYVJXMlpmREVLT0V6MHRhc3FIcEZMVGE3c0JDSFJldWRhMlJIcWsrNlovbFNFMCtTNEN5eG5vbUNaMnlFajRyRWphSFlBUnhqSlFQQU9WeUNmc09MT1BTaFN0VW9OYzNSU0IzVjBmdUhnbENDQ3dzemhkS0NTNzROeWVsVldNU3FURVhDa0NpSkY1K2N4MHZ2N21PK1dZVmJ6KytnRWVQenFOUjFjdU5jaHZqQ0JwaERoRkowcWV4S2V3OUVvSDQzdS82TEUxZVlSZ2NHcWNDQ2pQMU1tWWJaVHgwY0FaSkF0em9ESEI5YTRpMXJRaURVYUxMWS91K0s2WGRsZHFCS1Z6ekFndTBEbUxkYURjTkp1NUZPWTJBVU1ML1hsaE9pdk80QVRoQ0FWWW5wOUhPSHFCby9ETm15SlFSbGdJY085RE9wYndmd3NQSFZ2RE1EOTgwZ284QllwTGlBZE5KeXU0YjcybUVURHBway9IeEJRM3c1cVhaUGVjQnR4YWU3Z0ZnK2xRTXV4R0d4dW1OYm9JYjgwVm5DczFtNVRzZitjaUQzeUNBWjVLN0JDQ01kQjhvcGFSU3lrcjRjUndycFpSSWtrUW9wVVFVUlNKTlUyRUFQNmpWYWlLS0lxcHZJcFc0WGVHZUF2bWJCWGdBWWpEWWtKM09sVitablQzNEZXU2V2OU1aZU5iMWRKWlMvMTU5L1R6MlAzSVNDRU5BS1pSTEFzUFlFQ3JoNkRLQks1R0JXcVdFaFprYXJuY2lva1AySGdkOEI4cEVwSFI1VnAzdkxpWUN2dWtyRC9DcFhkNnVVaG5RTDFmWkVwVmkzWlozT1c3RXZwWEFmMjUrVnM4WkZ2VEdkcC8wT0VEMzdtVXVWRUVFVDd2V0hlTHJMMXpHMTErNGpLUExMWnc2M01hSkEyMVV5b0hCckF4NE02SW5vQW15dE9NWFBvN21tQVdpdDNycXlvNWxUY010cUpaRFlQOThBL3ZtR29BQWVvTVlON1lpM05pS3NOV1BiU1Y4N3Q4eUdRR0k5SnY3cGdlVUQ3NVEvbmVvQWNHcDVoM3dNbWJCVmVidWc2dnkrYVNBQVNPN2l3cGpPWmcwVDJ3RWdWV3pXcm5ubHN0TkcyYWFWU3d2ekdEMXhwYnR5a0FJcEhaN1pFY0dDZmoxbUhHQ2pWT2pPMG04VnFrZ0NBVmthaW1obzEyU3BZVndVNTlRU09JVS9mV3VLVWRZNW9DemVIcWMrdWN3RFBydmYvK1IzNU5TQ2dEQ25BT3pMdDRDT2o4VDBJZGhLQWFEZ1ZCS0JhUFJTRWtwZzhGZ0lJZkRvZGphMmhMTlpsTkVVV1RiZERlQS9wNEIrVnNCOEhTOCtPS25YM2ovKy8vUjc1ZEsxZithMTlIdERwZ1VYM0NPaDdqMnhua3NQWGdjQ2s1bFQ0WWdsc2pvU0JDcktRRE16OWJRSHlaNnpiRWdVb0xkUy9jMmJWN0MxK1Z1SitXYmxqTTZLZE50eHQrNDhUa2wrTnZrMjl5L1Y0SUNzTEEwbjJPd2l0THBIOFhwY3JIYmdIcGhIdVFadlhPckhaeGQ3ZUJ2Z29zNHRqeURVNGZiZUhEL0xFcWhENmdlZUlQbXpRbjlET1FxQlNzWVd5V0E5cUZQb09nRUxBSEJ3WlFSY0FXZ1ZTdWpWU3ZqMkw0V2trUmhvemZFV21lSWpkNElvemlGODE4dVdIWXRvZHRtZVlPSU5BMEVzYUJXR0Vrd2s1UldBVENwMzRLNzhDR0IyczJWSDRMVm4xWGhzNmw5Q0FBSGwrNE5oemU3RGNjUExlTEs5UzBTMmkwZmFlbU1ZTVBlenNrN0MzekR2b0UwUk9WU0NlV3lYczVzWHo4ZjE0Sm9MUTBMUmRQdzZOL29HTi8wVE9BUzJYTmVvajl3b1BWSCsvZlByQnNwbnViamhWS0tBNzRFRUtScFNtY0ZJRWlTUklaaEtKSWtRYWxVUXBxbXFGUXFZbjE5WFlSaEdJUjZQYUZyL2wwQStuc0M1Rzhsd05OeCt2UlhmdnZoaHoveDAwSUVEMUU5dlY2VVU5Vm56NTBiNnlpMVdwaFpYa0FsREx6QmxBVjdBRTdTRWdyN0YrbzR0OXBGbW5KWHRZN3JwVXpUQTc1TlZLalNwNTlqcFh5WEhZRDJ6cldyTUNYNEYxUzViYmpURE1GTzJ0WnFOVkNyVmZQNUpuekQyd042Y2VRMG9KNXZoejZscWNTWks1dDQvY29tU21HQTR5c2E4SS92RmtmdVBRQUFJQUJKUkVGVW0zSFc2OW5NR1dKSTYvQXRCV2V1UmozZ2gwQUFvNzZsUnBCcVZGQnF0NGEvWEJKWWF0ZXgzRzVBUVdLVUtIVDZJM1FHTVRyOUVRYWpsSlVCai9BTDRhUjgvNkgxWjA3TnRjOEJZNjN2UkhXRzV1UnpBR3o1SFI5L3BJcDNYQUN0OStmZ3p2T1Z3d0FyYy9mbW12aHBRNjFTUXJOUlE2OGZnYlE1d200VlRPTkUvL2EyMitaMERMcnZRaEdnWGkyREc0THFwZkU4SmI5eTR6UGE2Q014MDBDMkhWbU5FMmM0cVAyMTBrc2YrdEN4TDJla2VPL013RjZrYVNxVVVpSk5VNUFLMzFqWUI2UFJTRW9wZ3lpS1pMMWVGOTF1RndzTEMySjFkZldPUys4ODdIbVF2eDBBRDBDc3I1OGRibTVlK0tXNXVhT2ZBMUFHZ0Y1dm9BR1lxZXM1d0ZQYzlUUG5VRzdVVVFvRGtMV25MNUVYZzMwWUJOZy8zOENGNjExNk9qZndBVThWNlo1L2U4Q0hqZk1CMzhZUUYwdHBDMEFmME91eVBUcGYrRVoyRUxaaldLZXdSN21yWDhlNFlKNXJjWXdVWDlobU5lNXlPa0RYMVc2akNjZ2dmQkhneDRuRWE1YzI4ZHFsRFpUREFBL3NuOFdwUTIwY1habXg2bWJpVExtREhXdUg3MmtBekgwYTV3SVFFbUJUNGJCZ3kyS1VJQVcvdmhQUUx5VlFMUWVvek5hd05Lc1h3S1JLb1RkSTBJdGk5S0lZL1NpR1ZOcldoVm9McDMvd0pIQUh4aTZ0SXVsZG1YSFBPUlRRa0dTbENWTDRPd2FGbnBlTXlOdzlWNjhRd0lIRmxtM24vUnhXRmxvNDNZMThxWm1wNURtZDRveVRQWnMwOVhwRmo2MFVodUZ5bklCTEs2RFkrMUNRaUFkRFJKMkJwNFozMzRxTEkvQ25Pc05ROU4vM3ZzTy9ZOUptMWZGWm9MZHFldVB0TGtpU1JDbWxoTm1oVG94R0k1RWtDWWJEb1JnT2g2TGY3d3VHWHpiY2FXbCtUNFA4N1FKNE9sNSsrUytmZis5Ny84dC9WcWswL3djQTZQV0dIcWpuNStZZDZGOTY1UXlDZzBjOFNYMGMySnVuMFFZbFZUMC92N1lWQVVMNTVNT09TK2VoakpjSFRBbjRwZ3h6eHlKOWtaU3Y2OUJwVTVsNlZMSm9GTjVTa25VejQzd0tCdUcyMVEyZ1VxMmlPZE1zQk5MaXFHS1VuOVNLYlVIZHUxQkZsL2syc0NFNVNpUmV1YkNCVnk1c29GSUs4ZENCV1p3ODFNYmhwYVlHS2tORzdXNGhCcENsY291WnJJVEdDVHlIV3pjNWI5dEN0aWFVQ3JaNFhhckRSWUdTRUpoclZ0QnVPbnVSYUpTaU4wd3dpQkwwaDdIWkxNcVY2VHBYNkRsOXhkM3J3bklvQ3Nwc05zTzRZR3VZNklEYnBoRDJBYzEzWlJnR3hoZ0lWdFJpdTQ2M1FsaFphT0gwK2V0SVUrMnZYaE5ZOSs0MW5hSjVkZUVZQU1CSzEvVmFCV0VRV0RWOUZ1RHRrcm5NNEplSlJIK3R4NlIxQW5nN3VzYUdJMGZtL25CNXVYRURiSjQ5YTFoSGdKK21xWUJSMHpPZ0o0TTdUNXBYU2dWUkZNbFNxVVQ2b2h5eHVwTkF2MmRCL25ZRFBCM1BQdnNuLytLOTcvMHZQaFlFcFEvMSs5R0VPWGsvTHVsMDBYMzFkYWo1L2JxOVk4QmVQd3NBT0NPUXhaa2FJbG8vRDhBM2lQT2wrM0hxZkYyaSsrY0J2b25uUkhRN0tSK0EyenQ2QXJxUEc1VzNGUHluQ1hmSFVOV0d4YVU1RHpCMUdJL3kyN1YyMHZjK25wRW9sdFp6YmNxMWsrcDBhWVp4Z2hmUHIrSEZjMnVvVjBvNGNYQVdKdzYxc1grKzRUVDBBS3lCSG95Qm5oSVpmc3VmajNkU3ZLWDJFRm5tbHNDUjZWUjk0QVVEWHFCZUxhRlJMUUZtVlZxU0t2U0hNUWFqRklOaGd0anNCbWdsU211OFo2b3dCZ1Nrd3JkVW1PNnhYbVRzakszZmZhcCtIRmZYbDBvQm1qWHVhLzMrRGZWcUdhMUdGVnU5Q0lrRVFtNUpEeGlVemhJa1pjZFZ0ZXpQdzNNVnZRWjRmNTdkRmdtZ3Y5YjFOcXNwQ2tYejhLMVc1WnVQUDc3LzI1UFU4MGFUeTYrdG1wNnM2V2xaWFJ6SElrMVRFY2V4R0kxR1lqZ2NpaWlLaE5EdWNBc2JlS2VBZnMrQy9BN0Rya0UrU1NKMStmS3ovL2pRb2ZkOEtVblNkaFRGS0pVQ283YlBMNlhqMG4yOGVRT1hyL1Z4NE9TRFRwS3hCSldOY0pKY0dOZ2VXR2pnd3JVZW9qaGxZTDF6d0tkeXM0QVArRkkrNWVCU3Z2OVRRS1lUdkRCdUk5WlBHcWwzbkFHNHpTRU1ROHpPelRxSW5STElLZXdXMENmZHowcnI0OXJEZ2QzK3o1VFRIOFY0N3V3TlBQZkdEVFJxWlEzNEI5dllOMWYzYUxVek9qUC9tVVFQQWtmTEFUQ25PMHppc3RmUUJUcUw2U3lUeWxnQ0FiZmtTdWg1L1hhcGduYkxBYmwydTVzZ1RpV1NXQ0xtOWlaZU8xM2dVamovSWJ5bk5Hd0xNUkJaeXk3b1o1dHQzQitPYjZZTkt3c3RkUG9SbEFRU0pSQUsxMC9hR0k2WU40RGVvVkxhTTJpMVV0WnBrRmZSNnlWMndnTnl5aHR0OUpFTVl5L2VQeGRiMkpkSzR2b0hQbkRvajdJT2I3alZmTUdaNXVPdE5HK2tkeXZOeDNGTXkrcGtFQVRCYURTU3JWYkw0d3V6NFU0QS9aNEUrVjFJOFRjVnpwLy8xcVc1dVdQL3BObGMrdDFlYjRCV3F6RkdYZStyOGh1TktpNTk3UWVZV1poRGMzSGU4WjVFL0F3RkpZSmlWZS9RQmtDSGxwbzR2OXBCbkNqN0ZFUjA2V1BZRHZCNXVicnZXQm9PK2paZXNQSjlTWjg4UzAwZHBrVDJhVWJ3WG1jRStEUE1MYlROeHpraC9SVGZiUzdGYmtIZG5DYURlcWJNWEZsK0JGMzFvaGpQbnJtQloxKy9nVmE5aE9QN1puQmtaUVlIRjVyR0JheHhadVBWS3RpWkRUYVFVT01zMlJXTWhiNjNxWTdKSm1BMUJlUm15SDVCUW9Pdll6aVl3eHNCTkdvaEdyV1NhNG5RcnFpVFZDRk9VaVJTSVVra1VpbGg1WHhhVWdpdHh1Y2Rrbk1VeEtSK0MxejBTeW0wbTlXQ3QzSC9ocm1adW4xbmtnRzlzbHloOHQrVjBxdVRxcFV5dEVNa0lEdUNQVHBtbVVNRkpZRjRNTUt3RytYbTRTY1oyUUdBRUpDblRpMytYN1ZhS1NKcG5TenFzMUo3MFZsS0tkSTBoVGxiNXpobWJieUk0OWdlbzlGSXdKaXVUT3E3MnczMGV3N2s3NVNhUG5zODk5eWZmdjc5Ny8rRkg5L1k2UDRualVadDhsSTZLOTByek0rMThPclh2b0YzL096SFVhcFdBSkFWcVJWei9GM2JER0dqK2FORFN5MjhlYTJyL1VEREVKRU1VQXRUQ09ObEp3QStZQ1dyRE9OQVY0WjIyckxvbnBSeU80RjkrckRka00wVWV0dDFWamNSQkFScXRRcnFqVG9helRwYU04MnBRSnpDWkRCM0Vkc0RPcnNhQStwQVhscTN2NllFZGovT3hYWUdNWjU3WXczUHZiR0dNQkE0dE5qQTBYMnpPTHJjd215anJBRXlNOStxeTNIdVNBRXdndTJZZ1F4YmtEZVVjbUsxUzJPYVJtbG8zdDJzMm1lYUJoM0twUkRsRXRDc2xsdytvYWVwa2xRaU5XZjZ6dlBqbnZvaXUwUlF0NDlpaEFCbTMySWdYNnVXY2tCckJ3R2JJeWNOU0JnSVZLdGxRQ2tmbE9ubE9wR0VqVUU5U0dXYVlyRGV6VFpoYk9BUy9zSkM0L1BIanJYUDBOSzQ3Qnk4TWs1d0ZIT0d3NDN0cEpTU3dKMmZreVN4QndmNnUrM3REdGhqSUgrM0FKNk8wNmYvK2pmZS9lNUhQcnAvLzhKK1oxMmZCM2h1ZVQ4MzE4S1ZLMnQ0L1J2Znhxa2YvL2YwV2w0QU5DQzUrcEdpbmJNY3ZVL3pvY1VtemwvckdvN1dVZHY4dW5zbk5ZeVY4QUZNVXV2Ym9qS2dyNGxkTWNNNURreHVhdlR1Rk5Wdjk2ZkMyaE9HQVdxTm1nYjFSZzIxZWcxQk1Oa0RkT0hqVEFQbUJSRzdCL1ZNSFlYbDdnellpOHBYMFBQZzUxYTdlUE42RDk4S3RISGMwZVVaSEY1cVl0OUNBNkducHRlYUs5MG1NcTRyQUg1aVRpMFRiTm9qOHE4LzhQSzRKWG5jK3huUFk0MEl6VGZGbVlwU0lGQUtRNURoSEJXcnBFS3FIRU92KzRLcG5obDRrTGdwQkJBS2NkLzRxWjgyVkNzR1NvUmVDMThLOUZhelJhTTJEQUtUWHZsVDllRGNnWW5uREFJRUpMU2hIVGV5eXh2YitReWliV08xZE9aZDcxcjVJa251Tk9jT1hjODAwanlZQVo0TWdrQklLUkdHSWN3NmVSSEhNU3FWaW9paUNJMUdRNVJLSlhxVWllRjJTdk43Q3VTM0NiY2Q1TmZYei9hM3RpNy9qMUllLzVkU3FpQ3JydWRxZTJJQTJtM3R6V3J0elV1NC9QeExPUERPeDBBZk93QUwya1Mrc3FBTktKVExBUTR0Tm5EaGVzOFMxS3gxZnBHRXIrTXpnRy91Y1NtZk9tODcwTmVFYkhwWi9yYUEvN2h3RzBYOVNyV01lcU9PdWdIMmFyV1NxM0k2RVBkdlRKTm5IS0JQS3I0STFPMnZTY0EramxHWUV0anptZ0NpeVFvYnZSRzIrbXQ0NmZ3YUtxVVFCeFliT0x6VXhNSEZscE9jK1Q4Q2NVUFlTZjVuV0EvNmpsZ3luM0E3ekthUkQzS3FZa3NnSUdZZ0xIaTh3UVc3TE03VmpDQVVLTm4wK280MXBtY055ZExtUnJWMDA0cy83clVRQ0lGS09jUW9qaEdHUUNwNTMrcGdMZW5OV25pRzUweFdMeGhrZHVEcTlmQnB2SE4vSGtHQTZMSEhsdjV2SVNDemFub0M4WjBLM1NUQlo2VjVMc2ticG1DcWdtOFgwTzhaa0o5Q2lwK3FtSnM5UHYzcFR6N3g4WTkvN0d2WHJ2VitZcks2WGdOOXBWSkdyVlpCRkkxdy9wa1gwRnhhd096Qi9UbTF1Uy9kdzZkV1NqdVYyTC9Rd0pVYlBaQTYzL1ZOTWVDYnJHTUEzNlRNQXNZWTFUNHdYcExmQ2ZDUFN6MWR6anNmOWgxYTBUdklBWTdnVEh3QVZmQnJiSklKVWRNQmVyNDlPd0IxODNOM3dLNFRqUU4zbTE5b2FBN29wZ0RpTk1XRmExMWN2TjVESUZZeDE2emk0RklUQnhlYVdHclhyQU1lK2pDc2RUMEFKNFV4cVV3NU9kM0o0OG9zeTZJOFlDRHRscndKcjB6T2FMakExN3ZETkN0cmhPZC9WcHhaRUlheDBIR0JFR2k4UmF6cXM2RlpLME9tTVpSMGdHNVhKNWpYMmFoWDlHdFZqam1pTVZZTThDNGk3bzh3Nm85MjFDYVM4ZzhmbnYzenhjWDZkWkxnaFJEZUdZQ2g3WjVWdlhjdU90STB6YW5yelFINmplMUozbTBVWWZZSXlOOUNOZjNVVlk0N1JxTVJWbGJDUCsxMFNzZTYzZUZEazVmUzZkK3pzdzFFMFFoS0tieit4TGZ4dGsvOCt5aTNXc2lxelgzSjJUY2lBclM3eitXNUJxNnU5ejBDdFR2QTF4ZmUzRHRRcU5xbnUxTEsvSEFiMjZ1N2wrTjNPcUp2RjFQUW5HbGdibTdXb3R0VTdScVRhSHplNmNFYzJBYlFDd3JJcFpoVXp5MEE5bndKdWd3RldNTTVyWkozZ0xyUkg2SHo1Z2l2WHRoQXVSUmczM3dEQitjYjJMZlFRS05Tc21PZDdGaTRnYW91bHlNdStiaGphOWRaY01PZE83SHhsOHNoZDFZbWZSN2N3ZU1Fc1EvS1R5SGdHQWdvdTV2ald5MDBhaVYwZWtEUjZCTlFxRlRMQ0lUWjJJZ1RLZ1c0TmZWOFh0OUlSRXBCSlNrR20vMWR0YXZkcmo1NTh1VDhVN1JNanFSNHJxcEh3VHc4dDdybm9KNDk4NE1iNFRHUTN5NndZWHZycGZtOVBocHZGZmp2aUJrNGMrYjFpNDgvZnZEUGdrQnNwQ2t0bjFOMlB0NEJ2VDVtWnB6cnltRTB4T3RmZnhJeUhobHUxVWxYU3JtdFJIVU1qTnJLM1dzM0sxaWNyYm04TkU5UHBTaGt5dkMzaklWWE5rdHJmcmcveGhTWU5PVHhMb2N6UmNmWU1DN0R0aGwzWGVKdWppQU1zTy9BUHI4L3h4dzhUZjQyNjAzcVkrVy9VNTdQUGxPMlhIcC92TlNDdHVYcXRYVVcxTVBLZGVNb1A0WmNmVTZGeXNjUFdINlZhNy9mWG0vODJmTGN1RW9TaFV2WHUzajY5V3Y0cTZmTzQyK2Z2WWpuejk3QXhSczk0OEpXZjZCbWo4NmMydHQzVE1QaUthM3did1VPZlpGMVBxY2xkbjlLZ09xZys3bHJ5Z04yenJRdzQ2NzhMUk9DUUdUNndvM1dhcVhNbUIvRi92dS9pbWlFU2hYNjYvM2N0QWpnR01Ec21VSzFHcDUveHp1V1A4UG40Yk56OHVhZzM5NzhQQjJNS2ZDczdMY0x5cWxMcHo1dXRiSGVYWmZrdDVIaXB5cmlWaDlmL3ZLWFZ6LzR3UTkySG41NDZZK2VmZmJTZjVXbXFqekpFMTZyNVh1MjJyeStqak5QZkJzUGZ1eWoybUJMc2FFN3dia05ES0ZjbUtraVNmWEdIU2FMK3l3Y3pVSjI2Wndwd1ZiR0xaSTU0ZGRScGtUV3kxeGRYd1RIM2dzWmg5ZmJ2cldkQXYzdElaZ3JCMVlRbHNJaWtwSlByTFpOTVRZVTgrUXFmeldtMEN3NTVDQTZydGk4ckoxdEJ5czFYN1M5a1MxRlpRYVJ4bTlqSkFlNGNVWmFLbXRzQi9NTktIK1RHd0JiL1JFNmd4SE9YZDJDRUFMMWFna0xyUm9XWnF1WWExWXgwNmdZY0taeG9FVS84K1hBT2FwUjlpNEM0YTFvc2Y3cVRRTGY2cDY1cVFXODMrWVIySmxxZFMzeG1BcFRkdWt0NE1xMktPZ1ZRdmtCVlNtWEVJYUJaL09UQTNqTFVmclJrQXI5ZGRvZmZ2cGdtTGZ1WTQ4dC9sRVlpcFFEZk5iWUxqczNUeXI2U1NFSUFwR21LWmdVajNHcWUweEh4SFpLR0tjT2UwR1N2MWxRdnVYbGYvYXpuKzMyZXIzQjhuTGp6UU1IWnY0ZGw5ckpLUTZYNnNNd1FDMWpUWHZqd21XOCtkM3ZNeW5LQkNaeFdabE1JUWNHeTNNMXRHb2xKNlhCRVdWUCtzdVVrWlB5cllUbWkzbGNVclBITnV2azFaaGpxa1NGaWFjSjJ4VzQ4Mk5tdG1XWHdlVVA1SThKajFDWW50NU5SajNnM2tmbVhXWGZDZnVqQm96VENJRFZ4V1h0L0hqSTF3LytiT1pmVm1MblpibldGYlNialRHdnIxamQyZWVFemVmaWg2TVVWOVo3ZVBuOE9yN3p3eXY0MnJNWDhJUFhydUhNNVUyc2RZWklVN003bVJDQTBDNXdTWTF1cFgvUUJpWHNJUXdZVy9lMjhBa0lCL1VzZUdlS3laOUppalJQOFZaVjF5ZUo3M0FJb0dXTG9SOXBmNnBjTkUrZ2xNSmdsNFoyU2tFOThFRDdUMXF0OGxhQkJEOFZGNWFSOEwwamptUElnbm41clByZUdONU5FendNdXBYUy9GMlY1SGZ3SUxlVENTZ3MvOEtGQzllT0hEbHk0T1RKK2Urc3IvY09yNjFGSDFaSzJnMXNzblAxclZZZFVlUWJoVng1OVF6S2pRWU92T014a01xUzV2NFl6U3VVN2lHQUF3dE5YTGplMWR2VEtpYkRNRUxseWxGTUFzblA0K3NVL2tmbHVRNEZjMnU3d3pBcFYrNEY3S1NLMnlBUWxVb2xyT3hmbnBobUd5YWVVazJPblZDR0t2akZMOGRtdGZmSDFGM0FjWEZhV3R6RzR0S0twUGFpY3BSU3pPKzhqaFBtSDc5V0N2WjlXa1lEc09wVnJRMVExa3NqTFVOUHBjSmFkNGlOM2hEblZ3V0NRS0JWTDJPdVdjRnN2WUxaVmdYMWNnZ3k0ck53SzJEYkJUcVo5dFB5TzNMeExOaDNBNmljeWhlaWNQdWJURTlRQ1RUbi9OWUxTWko2NDZaVUNsRXVCVG02d2taVWZtQ3g2K0hXQURIemFGY1VyUEZlNXJ5eVV2L1NnUVBOTStNazhvd2Eza3I0NDg1SmtrQnA3M2Jnem5DMkEzSGxFZlVkaDFzeWtPNGF5Ty9RMkc3YjRtN3l5SVdYWDM3NStxRkRoL2FsYWFyZS92YkZmL3V0YjEwK09CaWt4NHZVOVVycHBYVFhyMi9teW5uem1SZFFialN3K05CeDNWQXUxVThBZk1NUjRPQkNFMjllNzJKSTdtOU40aXpnbTZ6K0IyUnVaeG5YY2FCdkRlOXVJYmhPTzBvTHE3d050SExsd0FwRUVEREpkTHBRZ0o4N3lMTkRNR2ZweGdFNk1BSFVNNFVyUHduR2xUb3RzUE9LRllFN2pjbU03bDRCVmtWUDRNNXVNM0FYYk55Nys5cFZybFBLQXdyOVFZeG9tT0NxNkNNTUJDcGhnTmxtQmJPTkNscU5NaHJWRWtJUklQTjU1S1Iwc3BKMzl6TSs2b1ZoaEJYc0h2VGNxcDR6Qkx5Y2VJZXE1ZnNsSkhhT1dtczN5NlV3TjQvdWZYY3FkOE5xZktMdUFLUEJpSUgzOU8xb3Rjb3Zuanc1OXcwMjd3NEFmRTdlbTVkblFBL2ptNTdPUWs0aCtXd256V004WnpneEdNdi9tNmFDZDMxT2ZrSzQ3ZEw2cE9OTFgvclNqWTk5N0dOUyt5bVd5Y01Qei83QnM4OWUvKytrbExORlMrcjRVcnBzZU9QYlQ2RlVyNk45WUI5aHQyNVFCdkIxbkEvNFFRRHJMQ2RPcEcraHp3QmZrMHBXdHJzTmxxZ1E5S2xFTzU0eXc0cGI4Tit1Y0Nka24vWjhHL1ZtM1llNFhWWmNKSnVNU3pSVkZUc0dkSjJwQ05TOVMxV1F0ckRjSFFBNy82RTBzQ3NMeWc3MExaTnB3VjB3RjgrdzF2Z0tiZzZkYjVtc2NsNXdGTnlPZUs3K09KVlk2MFRZNkE0UkJocTQ2OVVTNmhXOWtVMnRFcUplTGFGYUR0bldyNzVIUE1GRmZkRG5LT3d6NUljL2QzWEw4K2p0Zk4rS0lVbjBuSHdRT0lEUFN0anUzU0lUNzI2UEJpTU11OE5kdGFGY0RxODkrdWo4WnpqQUY0QzVJUHVqN1VBME0wL3ZMWjByK0cwQmY0cW1Ua1ZSYjRXMS9WMEIrU21sK0cyTDJlR3hvL0srLy8zdkR6YzNOL3UxV3EyYUpJbXExOFg2b1VPMVB6aHpwdnVyVXNxZ2FDbGR1OTBzQkhrbEpWNy8ramR4NmovNENUVG4yeENHMHZHTk9Dd25tMWsvcjZDdFZnOHROZkhtYWdlcDlFVnRidzIrT1kyVDhsMHFIL1NwZW44Zlp0NE16bmxRdmt3QmV6d0lJYkM0dkZDSXVCT2dkWEtodStFVjdIdllPYUI3OVl3RGRYdXhIYWhueWh6WEwrUEEzZFNnUjZPVDJpV1VYU1pGZThaclQyVkFLS0I5bVFmQ1NlY1czUFUxcE42KzFlRzdZaDhLRi9NVlUwbTUzM3I1bGNCd2xDQ09VM1Q2QlB3Q2dSQ29sa1BVcXlGcWxSSnE1UkNWU29ocU9YVFN1U2xLS1ROL2I2UjRVeXRvT1o3WEtabG1qTjZDa255aURjOFFDSUZ5T2JSMktVREIwQm8zOUpWQ01vb1JiUTEyMVlZZ0VLTVRKOXIvWHhpS2VCcGM1Qkw5T0E5MzNPSmUyMk5OTjhmT2pQR0E3YW5rYlpWeDlxS0Z5TjJTM25QaDlkZGZ2NWFtcVV5U0pFM1RORjFhS3IzU2JnZC94bzN1eUFOZW1rbzBtK1BkbjZaeGd0Zis5dXVJZWdOd2d6Z3RDVm1oQkJscktSdktZWUJEU3kzckRwUnljR014Q3VZT000YnlqZmVVUytUbGJjNDBwK3hXZU0rUVBWd2xleWNvcGREdnM3NW5memtyTmQ1bmt3Nk1lVlF1NFdZUEM0M1VydnhCaGZoOWJPNVIyYXh1cGNEYVBONXdqaHNDWmczd3ZLYnpjZVBWQWY4Wk1uMWhXMDNqMnVzZmFwdXJ5UFdoL3gzUSs2SjNRT3dEMWU4WUdNWG12OW1EWktSR1B1RGpKRVYzTU1MYTFnQlgxbnA0YzNVTFp5NXQ0UHpWTFZ4ZDYyS2pPMEJ2TURMYjFTcFAydWVkNU1mNUVuMmF5cmZjdlB4bVp3QVJDRlRLSmVRVzB0RTd5OUFHVDhwWENza29RYlE1WVBuR25WWFJXUjA2MVB4M3M3UGxHMVJEZGpsYzF2Z3VhMDAvclZFZU43NUwweFNqMFFocG1vcmhjSWcwVFVVVVJValRWUFQ3L2FtVzJXRWJiTHBaSTd3N0R2SjMyTFBkVFpYejJjOSs5bW9jeHpKSkVobkhzVXFTUkI0OVd2N3JXZzEvN2F6c3BlZnF0dFdxamEwc0dVUjQ3VysramxFMGNrUnpXc0JYQ3RWeWlLTXJNeWlIUVFabzhvQS9GZWhuQ1BIc1hIdks3cDhjSmpFQUtsdnBIUXdiYXh2Ymd2VzJUZU5BTytiNThqQTdoa2xnNEpQdk0xWlB0bTFqUUYwVjFzWExaL1V5L0xzWllNK1BMVmV1YTcveXJtR1RPZUIzdmNYUlhtV3UrZk01SUtkMndUNHI3QmhudGJ2N0ZHKy9PYjBqWFMrS3NkRWQ0dnJHQUZmV3VyaXd1b1hMTnpxNHR0SEhSaWRDcHo5Q1A0cjFGcmFKaEV3bEt4dWtrZ1B3MXB1WDczUUhxSmJkSmpWRWdGeGZ3MXo3aUUzdklFbFNSSnQ5dGtmQXp1cmZ0Ni8rbGYzNzY2ZXpJRTd6NmpUUGJ1b2tKa0FWWGROOFBET3dBeG5mOGZNMDdUSTcwZDBLek50MTJJdVNQSERuVlBrVHd6ZS8rYzNlbFN0WHR1STRWbkVjUzNPb28wZnh4MkdvZnBDZGw2YzE4OEdFZGJMRHJTMjg5cmRQSUltVEhOR2RCUGhFaUV1aHdKR2xGaXBsc3l5RjAwSGxBSDhxMExkMTZZcktsUXBxZFgvTi8rMEluaHc5RGlnbk1RYTdQS0plaEZFMEtydzNiVHY0WCs2NTFQZ2pBNG5zMlJub0ZqMG0rK0czd2VGZUVhamJlakxsMjVZd1VOOHBzTHZuTmUweDlwb0VlWDUvQWNvc241YlVLaVZ0UHRnNmRUeU5EMTRwalYzSlFKbnE5enVKZFlaOVV2NWdzTThzYlhMRjZuVHZpWXBJVW9uUktFRS9pdEVkakxEVkcyS3pHMkd0TThDTnJUNXViQTV3WTdPSHpWNkVUbStJN21DRXdUQkdkNGZ1VisvMTBEZlRsSzQvMlZnYzE5Zm1PazFURERhS25kMjR3TjVmNWp3M1YvbmU0Y1BOcDQwVXJreDhZV0hjK1ExakJNaDliVzR0L2FUQTUrV3ozdStZdEQvcG9TamNWaWJnYm9IODdRYnhXOUVHQVVCODg1dmZ2Sm9rU1dvT21hYXBUTk1rT1hRby9sMGg1QnUrQnp6OVBodU44ZEk4QUF6VzFuRDZhOTlBbWlZMmp1alFPTURuMURVTUJZNHNOVkdyaEphUThvSThvcjlEMEorWm15bUFyN3NmMUMzNjIxamZLSXdmVys4RTRKNGV5RFA5dm1OQTkxczREYWh6M0xNdFk4QmVWRzhXMk8xWXlyNEhLZ2ZzUHJXYjJwckw3OWNMRnBjZmpDNFY1ZUNTdTB2SCs4U1Y3NjVkV2RubnlKVUZwZTBGV0o5eXdMSnR0ZjN2ZzAyU3BvZ1RpVGhKRVkwU3JLNU52eFhxdlI3U1ZLSS9jSVp5RHVEWnErVjl5ZnBQcGhMUjVnQktPc2FxQ01pTHpnRFFhSlJmZS9EQm1hK1plS1dZY1owQmJ5K09OSzdFQkdUUFhMcWZKTVhUT3ZrMFRSVUFKRW5pblVlamtRS0F3V0J3UzdEcVpsVDJkeFRrbWFwK3F1UVRqcHZOUDNVWm4vbk1aOVo3dlY0Y3g3RWFqVWJTSEVySzBXQnhjZkRiU3FVM3NxcjdXcTJ5N2Rha3ZkVnJlT09KYjBPYUpSdktKMzFqQVovaUFxSDNvbS9XYVU5bVgzcmloVTBMK2tvQjlXWUQ1WEk1RDBCVGR0aGVEOTJ0THBJNDNRRndBOW1lOFA2OHZwOEN5TUhUcUIwQyt1NUF2UWpZSFFpUEIzWUhxN3ljN0hQb2VFbmp6cFBhQVpMYTdiWUlXWUxOUVZ3cGtIalArOVJQeDkrSGF4dFBBKzhhZG43YzF3RDRaZEZ2Mi9zY2NPamRzbmF4Ui9FWUVIcXY2NTBCMG0yY1M5MHZvZHVQQUxpeHhBR2Q5eGQxb24wdlVtS3cyZGZUSGprQUwzaG40SDBPVkNyQmxSTW5acjlvN2d2QSthWFA1RldaTXpFQlk0M3U1SlR2THVza2gvdTBCeHpvVHdpM1hZMi9GOVQxdHd2SWJ6YS9BSUFvaXRUenp6OS9neVI1bzdKUDR6aVdRZ3pXbTgzT2I2V3BISEJQZUVvcDFPdmI3eWU5ZWZFeXpuN3J1NDU0TW1KUHdRY0ZIVU4vQWdvSDU1dVliVlF5Qkh4bm9KOEYvcG4yYkNHNkZ3TFdsQjI5VjRKU0NxTjRsSVhxTWFCZHpBanhoeC9YSjM3YThXQytJMEMvQ1ZEM0dJOE1zTHV4TUIyd0kvTWNIRnVwdFM2TjEvdDhrTEpyRHRwWnRieHJBMlFHa0NtZUY4LzJmUWZBNW5oNW1hNE5GbE1ZdU9lQXhmV0lTOC9heHQ4WDVSRkNZTFFMVDIzM1l0alk3TEYrWVBTTHphOTc0SzBBcFNTaXJRSFNPQzBBOHV3NVgyZXBKRFpQbkpqOWl6QkViTklxbm9kSjdOazVlaDZ2TW5tOTh6WlNQTGFUNHZ2OVBwaGIyNXZHcDkxSzgzY001Q2NZM0UyVi9UYmtuWHBhNFBPZi8veGFGRVdTUy9MRDRWQ09SaU1aaGx0bnkrWE5meWFsU3JuYXZsUUtFWWJiZCsvNnVRdTQ4TDJuZlNMTENNWmt3QWNnRlBiTjF6SGZxaFlRVzhvNEdmU3p3TitZYlNMZ2JSK0haTnZjTHZnMjczb29WOHFvMVdvVEd6enBlZmc3eUlKNE1aRG53UnlaTXFZRzlHeWZaMERkYXp2TGsyMVBGdGhkbWRNQ08yOEVhN1ZoY0VscVY2NEJPcjgwdFpoSmZPWDVNbWNTbjlkUi9HSGdHQmhUbG4wSTVyT0V4bmdPMEZsZHlEQUx5ajVMSG1qY2ZSNEhMdzZVQmtDelhzRWp4NWNuMnViY0x5RkpVbHpmNk5xZXRhOUVNZ2JRRzh2S0FIeUVaS1NuS3hWTFE0RjFhK2FzSUFTR3g0KzNQbHN1aXo1bnJBall1UU9iSWltZXJra2RyNHlSbldMR2RxeE1WWFEydnd2WHpiUDdhb0pHNExaSzd6enNCVWsrRy9ZU0l3QUF1SGp4WXZ6Q0N5K3NrZkVkQS9zMGlpSWx4TlZubE5yNC9hemF2bEtaYmwvcGE2ZmZ3T1Zubm5XRWhoSFlMT0FUcVpMUWRJMCtudVhaR3BibmFnd2c4c1RjbFprSGZVNWVCUVJhTTYzdEd6NEJLTGRMTWlITGJRMnQyWmtjVUdlUG9raS92NHBCUFBzY3hlVVRVYkxRT0IyZ0ExNGJvUHg2ZWQ0aVVDOENkajVXeGdFN3hnRzdjazlBQU9jOXY1SWVHRHRnVmF3Q1dNYkFNUUJFaEtXckRHQjk1aHBod2NFRGI5Y202Z3N2YldiZTNVdkQrNHEzbFpldFhCdmNlM1BsSDF5YXdjTkhsMUVwaFVqVCsxOWR2N3EyNWFSbWlsU1pkMEo5Yi9wejJORUFYd3pxUHRpYldIdFBDTWhEaHhwZmFEWkxheFJYZENhQVZWUE14NDhCY0c2TVZ3VGdBR0NsZVRySGNheWtsQ0tLb2lMTCttbkNMUWYrdXczeXR4S1VkNXR2cXJ5Zis5em4xdnY5ZmpvY0R0WFJ6UW1KQUFBZ0FFbEVRVlJ3T0pSeEhLc29pdFJvTkpMRDRWQW15Wmt2cDJubjMyU1gxSlhzNWd5VHc1V1hYOFAxRjEveWlMNVBURkZJMFNsS0FtZzNxOWcvMzlBUHBPREs4b2lyWDZZWjdUa2dhN1puZHorODFCVEhMckxjN0FFaDBKeHBqUUhxWXRBZTA5d0pUQUlEVFZaQ0VaanZCTkNMUU4yOXorMUIzWU1tQnVvc2VTR3c4M0dYQi9hODFLNTRwZlJFWG9OZGI5aTVjc29yVFRybmpjeldZNitwUEZ1Zi9pMjk4WXVwOG5FcGtQZWxOR2tkZzBEdDRQMUh6NlRqeXFVQWp4NWZ3ZUdWTnRzY1I1aWQyZTdQSUtYQzFldWIzbnZ5dENKc2JGSi9EbnNSUmxIc3Zac3NRQU84TE8rZVdsNnVmWFYrdm5LUmxzWHBkdWpmekdqT3RyRklrdWVTTzdleUg1ZUhNd0ZadFgyYXBpS090WDk5T3BPNnZ0ZnJaVW5IVGVQV2JsVDJkOUxqM1Y0QTlOM21FK3ZyNitsenp6MjNlZXJVcVpuUmFLU01JUjZwN1JGRmtSd09mL0N2eStWM05vS2cvZ2xhVXJlVGNPRzVsNkNreFBMYjN3YmE0QU1Bb0hRamlyM1lLZGRxUUcvTkdRUzRmS05uaVNobFVZS05PYVVsZGx0Q3BuZkNNRUNqMlVDdjJ5dm9ubHZBWGhZaDU3UmhsNVUzV2cxdkdpSXZNV3dYeG1kUVl5KzJTVCttRWJsWTc5V3B3bnVGek1pWW04cjdrU3V4b0V6bGNESmJnNVFRZ2ZsVWFOd3FBYVVrOUo1d3NPdW5GY3pyNCsrUVZqNEpLbCtuZFhtVkhhVGFZeDZnbEw1TFdLdTkwcHF0WjRYK1ZnUTFtTlp1QzUxUFNRVVJtSG9GYkx2NDVqZ0t5dVF6enk1Y20rem1PNmEraFZZRHA0NHQyZDNXdUQvN09FbXR4NzM3TGR6WTZPaE5hZUI0T0dMNFBPYVVBTDRiWVRSd1MrMnlvRTd4L3RuOVhseXNQcmx2WCswVkR1WkZFcndCZkF2b1dSZTIyVFBQVjdRMm51N3pjMWFDSHc2SFZ2cW5Zd3FqT3lCUHpXNkdNaGFHT3lMSjc1RDd1TnVBUGpiODNkLzkzVmF2MTB1aUtKSlJGS2tvaXVSZ01GQ0R3WURPNmRXcmYvZTdvMUgzcjBtYW45WktrOExGRjM2SXkwOC9pNHkyc3VEamNRSVRmV1FrWFRTcklRNHROeEVHZ3VYbGFXQStTRi9TejByN3pkblpnaGJhbG1UK2JzUG9IQmZVN280V1NmRUZrbmIyS1B4emRHdThSRjRBcHJydk05S0p6VmhRTzM5SGxJZjNOSHRIV1VrZDFQcHgwcm90bjVmck43WklZdmVFYzByTUlxM1VhNlJ4QmJmbVhTbkYxT1JtdFR4N1BpcUVTM3k4UVFTMGlxV3pFaUxGZVZLNUF4Y0xJTlNYdkM2YnozOUh0aTcycnF4VXlxUjRBZURCUS9ONDI0TXJxSlRJTmE1dUFpY2s5Nk0wcnhSdzVkb0c2NS9NZXdicld5VVJkU0xFVVF6K2l1ak1Qb1hjYnpyUHoxZSt0MjlmOVhucE5wc0JTZS9tdDhYc0lrbWVxZXdWdDU0MytXMmFUQjRGQUh3SE9wTjNMS21qZGZGRzQzc3JNT21tdzkxVzF3TzNCcHp2U0YyRHdVQTk4OHd6bmVGd0tLTW9TZzNZU3dQMmNqQVl5SDYvbDU0NTg0Vi9Ia1dkSjhpdi9VN0QxVmRQNDgzdlBxVUhKdklnNHNFUXAvUXNXYTBjNHZCU0MyRkFFaFFuY0k3WVR3SitvejdJSDRWaEFqZ3ljcnp6M3JnMW9WUXBvMUtyVFFUcXNhQTlwdUUrY0tyQ3d3Sk9VWkhadnA4RzBKWGZuQ3lUWmdFdFU0OERQallTdkxyZEc5d2UyT21HM3poclNFZDFNSUt2UzJhdWFUbVR3OEFCbGdsZ0lNdUJYdEUzNWNCVzJXK01QNzlMVTFRR0pLeUszelRDM1plc2JGNEdmUjlLb1ZZcDQ5MFBIOFRobFhZRzJkMXZvMTlGS2xrOTkwbTR2THFHYUJpei92Vy9BOWQzMm9vK0hzYitHR1ZwczR5M0Q5WUs3WGI1MlFNSGFqOHdWVnRRemdDNEZhcFllVjY2N0psMm5GTnN2cDVKN0RCbmxUMHpTUjFTU2pFYWFlMEVTZjNNdWo3NzB1OEs2TzhGWnpoM0tzOHQ2ZFNubjM2NnY3cTZPalJBTHdlRFFhckJ2Uy83L2I3cTkvdXkyOTFLbjMzMlQvL3BjTmo5N2c3YTZvVzFOODdoM0pQZmhVeFQ5OEdnQUp3cHpnTjhUWkFxNVFCSFZsb29sOE94UUVLaHFPeFJOR1lucUhFZ09KR091VVRiLysydzZDbENhM2E4SWVIWXh4a0QzRGxwbkJPNVhCaytrSThEODJrQUhiejNHS0JQQytvNVhHWnZaTGZBN29BWVhydDhRenJXVnJpMFVINThsZ213NDlzYTU3a3g2NERFdGRHQ05CaElad0RGQW5XbUg3UDNBUWZ1ZmxwZy8wSUxIM2piWWN3MGE3Q1RYb0lSRFdGaXpmYTVBdmVYTk4vdFI3aTB1bTc2UTBJcEE3VE1sa0lwQlpsS0RMWWlKS1BVOWgyL3I5aDRvUGpzL1ZhcjlOTEJnN1duMkRzU3VYZVd6NnM0NkhPTmFvSHEzcHZMVjI2KzNyckJIV09ZcHdDbnJoK05ScEJTaXVGUTA4emhjS2dJN0NlRVhXSGFUdWZsN3lUSTN3MWd2K1Y1bEZKNDZxbW51cjFlVC9iN2ZUa1lESlE1eTM2L24vWjZQZG5yOWVSdzJJdWZmLzdQZnlPT0I4L3VvQjFlMkx4d0VXOTgvVnRJazhRU0hCODFNb0Nnak5VOXRJdFJxUlRLZ2NEUnBTWnE1WklQbUZuQUtRRCs0VGlRbjloQjJ4dzNVY2h1L3lDQVJxczVIVmhQQTl6OHlMNlNiWUI4TEpoUEFlZzNBK3J3Nm5BUmVXRFBOcTRvam8wL09LTTNIZVhtbVd5N3ZMWHJpa240N04xNkFNdWVudkx3OGhSTEl4a1lVeGttblgwbUJpaFN1ZlFNZFR4bXhPV244dlE1Q0FUZTl1QUszbjVpUDBwaG9QZWZGdzdVaGJkM0xYdVRRbGVWN2tLcnQ5ZENLaVhPbkYrMS9rQnNYd0x1UFVEYkl3MDJCMGpqcEJDODNUWEw1NzhTdEZyaGE0Y08xYjROR29VbUdHbGFaU1IyeGRKeEVMZG5MdkVYM0xNSDRGblBReGxWdmJsVzJmbDRtbnRucW5vTWg4T3BYT095Y0V0VjlEemNkcERmb1pjNzRNNEErMDFKK0Z0YlcrcjA2ZE9Ed1dBZ2g4T2g3UGY3a2tDLzErdEo1eFNoRzcvNDRyLzk5U1NKZnJpRFovRkM5K3BWdlA2MWJ5QXhLaUVmWEh5QzZ5ZlFod1FnQW9IRHkwM01OU3NNREh4ZzhXbTUvbmhHMFRBSFBEY2RjaWc1eFhHVG9kNXNRZ1RCamdDN0NMaHpBRDRHeERtUVR3UG11bHVtQi9TZGc3b0JUdzdxaXJlaHFIRUZqZmR5OERaU0RVUThlWnc1WjViVVdTWkt3a3FBTms4R3VKVkMzaEdPZEw4ZDZBT0t0Vk5sZ0VpeFoxUGVmUVZYRlA4K1hQNVd2WUlQdi9NWURpKzNEWmdMSTYzcmVpMjJRNnZvelYwbjFZT1daZDNTcittT2gvTVhyMk00SExFeHlzYXJHUk5wd2ozWndRQ3JlU2Ntclp0eXllZFhTcUZlRDg0ZU9sUi9VbWV4d1FJekJSWnZWZTZzSGtWcEFHZGNwNVJTMmZYeExPMVlJenMrTjArVzlDVHRaNEcrMCttUTZ1Wk9DYXBqdzE2WWs2ZHdKNW1CbTY3andvVUw4ZnI2ZWtMQTN1djFaTGZibGRrOGc4SEc0S1dYL3VKL1NwTGhtUjNVNjRYQmpUV2MvdHNuTUJ4RU9YUnc5SjVKcFVXZ0QyQzVYY2VCeFNhQ1FIaWc0Z0cvU1o2a3FaMWo0c1hjQmd6ZVBteUx6cE9QNXN4NEtYNGF3TjRSZ09mQWxUOEcrOHZVWFFqb0dBZm8wNE82Qit6WlRzMmgvWFRBYnR0cmExSkdPbGNXT0FIWWRJNHVPNkJXSmkwc1kwQlNsaVAyMUFFS3ZEeDZGdnVVZWNESnRJSG45OUx5dnVJTUFmeG5QSDVnRGg5NTEzRzBHaFZ2K3QwQnVMRHFlbExSYTIyOXZ1ZVcxR2xyKzA1dkZ4cXlQUkJ1YkhSeGZXM0xMVmVVL3RKRktSV1NKTkc3eWFYZTNMalBzTUV4WGU3YTBiRnFOYmh3K0hEOUNVQkwzMnl1WGJHeUZBZnh6RzhDYTU5RGdBTjhIa2Z6N01haUhobUp2aER3MHpSVldmLzFHYU83b2k2OEU1aVZDM3NCNU84YVVOOXNIWmN1WFlvSjRLTW9VdVB5OUhyWHVxKzg4dmwva3Fhak4zZlFCaStNTmpkeDVtLy9Eb05PWnlMS09reklncGUrMTZ5VmNYUmxCalUrVHc5SDdDaFBIRVg1d3NlRXU4b0FiQk8wd1YxMWNpT25BZTF0QUp6Q05FQStEc3h6Z0o1NWQ0VnR0WmZGb000aE92Y1E0eDZjUURIekhQazg4UE1Rb0N1bHBYTUYrSVowN3I0dXljem5LbGNmYkpHS3h6Q0FZQUF1bFRjVndKa0pTWDJuNEVDZjl3MmxsN3lmcWUwNnJsNHQ0VVB2UEk1M25qeWdsOEZsNXRrQkRkNUJaZzRlY05JN256M3RSeU04OStvbC9QL3N2Vm1RSGNkNTcvblBxanBycjJpZ2djYStjUVAzeGFRazJ4S3B4YjZTWlV2amtIUVZjdGh4dllYdEY5dlhFVE9qc0gwbnhoR1dYdVpwWG1ZOGpya3hjV2ZDWXpza1dYRXQyZEpZdXJZbFVhWklpQ0pGZ2dTSWxRS3hBOTJOWHM1V1crWTg1RkpmWlZXZFUrZDBvOUVnbWVUQnFjcXRzcXBPMXkvL1gzNlo5Y3FwUzFoYVRkNmJmaWVFaGFWVnZQbldOUUwxNUxlbHIyY1VSdWl0OUZLdmk4MkN2YitLcjlXY3EzdjIxTDhMaUdRaVBQa3AwL3NzK2djS2VrWVRiTTk2M1drZzlXdmdheE0rZ0VTMVV6TjlGRVdDT3QrUkY5TU1ldnh0R094dkorUTNDdTdEaEtIS1JGR0VtemR2eGdyd2ZjUEt5dVhsa3llLzhmazREbjR5Wkp0TUNGdHRuUDNuNzZJMXYxQUlrOXhBSDhaQ3ZxNTJ6K3c0cHNkckpza0dpTjhMYU9HY1Q3bFFrcTIzckVNZ0Y3OVpXeHRFM24rNUttVUF5REVJNXVXQmJvRFVEK29wZUJmRjU0RGRQcGQrWU5lbFVoN2tpVHFIZ2l3RkxLQWZ2aXFQTGsveXlmSWF4QVQ2dWdPUTQ0U250N25wYUFpWUY5eVNZME52MDQ2QWhydXE4K0N1R1h6NHFic3hPejBHUUt2MFJNR0RXWFBmbVJYUEtPQVpydHhZd2N0dlhFSzdKK2RUSHo5ekJjdXRPd1AwMSthWGNlNzhOZlBDSFhxOTVIM2tDSHNoZWl0ZG8rQTVUODFWejNTdXlDMVQ0L3RBdGNxdTdkNWQveTVqaUExOUpjdHBQUWJVV3FrRENmQnp0cUh5TXd2NDZ0aUpVdGVSUkxXYktYTWE3SG1LbnF4WkR5RUVLK2wwcDhNdDU5cnRnUHlvOEwzVitVZTYwRVBNZzJmTHl4ZVhqeC8vcjM4Y1JiM1RRN2JQQkI0RWVQTTd6Mkw1NGlYcjRTMURCandXUFBSempnR1luYXBqMTB3VERrTW1YOUR6QnhCdy9YRTlUSWVnRkxBWlEzMjhXUnJRWmNEZEYrQ3d1Wm5zRk1JODU4U0xnRTVCbWIzMU5yejFBZXlLYlVEbmdOMXVGRDJYMUZHVFkra3pFdVF0Y3FUMUFCTFRMaWN2a2hjQ2FXQkR0eU9CY2pxT3pMOG5ZK3BjcEUzSDZUeklBcDFBSnprVzBLeFg4ZlRqaC9ENGZidVVjMTNpVkpkMnNwUDVtWUo2WWk2VUZlbUhTUlJ6dkhibU1rNjlkVjE1b010MlJwemoxWk9YY1A3eUl1a2NiYjV3NmVvaTNycDB3N3cweURqYzhlVGVCdDBRdlpadlhWdDFEOVNwVVVlOXBOT2xuZUFFYWpWMlpjK2UrbmNjQnhHOUhrUnQ1d1pyMmx3RzlEcUs1QmRDelplbmNmcFlPUTU0UWhCbHJ4enZBR1FVUFlJZ0VPcVRXa0d2WkJncS96QWU5aHNOK1EyRDc1QmxiblYrVTZiVnVyNzYybXRmL1U5aDJIMTl5SHBNRUp6anJlZU9ZdkhNV1dRZTN2YnpJb2MrRkRKampRcjJiNTlBcmVLU0hqcEhGSVNGQUJ2TTlWSUl2dVdoTWRhRXc1emNRNWRwWVJHOGJZRG5Renpic2NxRitSQkF6MERkdnUvOW9FNEFiWGQyY2hzNEVPelpjblJjWHRlUlBNeDFQcTZXdGRkT1VnbmVaVmwxRkgxY0xqSlRzMEFjckRpNHFRRzZUZzBoZWo4RWFWOEtOREQ1N3RxN0ZSOTkzejNZUGpNT3hwZzB3ek9XR29kUHh0OFR1Q2VxWFpuczFWLzg4bW9YTHh3N2ordUxxK1lhQ0VBcFlBbjd0NjRzNHBWVGw5RHp3L3dmOFcwS1FnaWN2M1FEbDY4dGtzNVorbmZPaFlEZjh1RzNmUU5zYzU2cDd6eEZEN05kcnpzWGQrK3VmNDh4eEZ4UmRSRGM4K0J0ajhGcjROTWxjRWwrWTM3WFdXMjQ2L0Y1Nm5nSHBEM3NiWWU3SUFpRTVYUTNURmdYUnpzN2JQUVV1czJVZnlPT2tadS8yMTNzSER2MnBUOExndmJMZWVsbHc2V1hqK0hxSzhlTXVwRWg1K0Z2Qnd0U25zZXdkM1pjdnNrT1FPQUh5WU96cUxqOW9Ud294ZlNoTVR1b3dreG9qSTlsT0ZjRTZVSm81OEpiWkZ0VDBNd3N5SXRnUGdEb2hmYzE3MkJaT0dlZ25tbDAzbzNNTzdaOVRHVEJEbTJ1MWNkVGtPYnBmRFJPRUpPOHVTWkVMUnFBUTA0UDFmY0VIR2t2ZWYwd0IwK0F6cE03Um9Hdjc4RjRzNGFmZStwdVBIbi9IbFE5cmQ2UmpMOGIyR3Z3Z3pqYUtlQnJCenQxMWM1ZFhNRFIxOCtqMndzeXdKT3c1TWI2c0xMYXhVc25MdURhd3NyZ0gvVUdoSlZXQjYrZnZvaHI4OHZwTVhqQnlac0dPWHFyWGJWTWJWcTVaLzUyOUwxV3Z4MU83bGV6NmZ4azU4N2FjNERnQ3ZDa1kxamt2R2Mrd283TFUvWjJwNERPaTZkajd5ck9kQWdvOEF0QWp5aUtoQWE4L202MVd2VFA5N2FEZmlQWHJ0OXM0YloyT254LzFYLzExYi85NGtNUC9mdi9vVmFiZU0rUWRadHc0OVJaeE4wdWR2M1VZNERybVNNbkxrQVVDS1JaK3NFRjZmaWt6ZmVOcW90ejUxZEhiVTR4ZmtsQ3FRczVNRk4vMEh1VkNpcTFhdC9PeWhxcUg1QkZETnJzWDY3TVJSUTVjYW1jOW4zUHlTdHk0blJDdjdLNTVZUjUyNnNqa3ZGbzA2Y1EzSGliUzlES05CbEhBU0hicnEyUlFzaWZnbEQveXVldnFvTUR3akdIaDE2dm51WUJZSmJHRjVEdnZuR1ZjWWNKaHZzT3p1S0pJM3RROFp4a3pmbVVPUjVJVzBhSmM1MmlQRTMyd3dnL2Z1TVNGbGZhY0pTcWQxVGJPWlNxRWdCMzVEWVg4bHpES01iSm4xekRsUnNyMkR1M0JWdVZMOEJHQmo4SThkYmxCU3d0dDlROXN6cGJYSFhnWXJWTWJSQ0JRcHVPdzJmVnZPcllFTUNQamJsbnQyK3Z2Q1M1YTlTMjZVRUtJV3c1WDBiZVp4enFUR0V5aFk3TXRSY2laNXcrejJ5dkZid0dQWDJQdk9WWmIvOXhKRC95Y21IWS9IM0RSa0YrczZuNFcySVdHVGFFWVRkODVaVy8vbDhlZnZpemYxaXZUMzlnMUhvV0wxeEcyUE94OTcxUHdxbFZvVi9VWVlMaHVucHBoL0VDbG85T2s1VUI0NDBLZG05dEl1aDAwTDFGSnNSU3Y5NkNUR1Z2WEhOOGZJMmdMcEc3LzI2NWV0WUI2REtsQk5STjFIcUJYUjNaUkhPQU9kRERrUUxjZUozcjU3Y0F3RGdESEdHQUxxQmZHc01TNHdCWGNGYlRQV1VSL1pJWStjc1ZUSUtIT1FUb1NPZlIwTmV2czVHZFdtQjZySTZuSHorRXVhMFRpZGxkSGs0RzdXUm5qUFRNeENYcUhjbmZGZ091TDdidzhoc1hFVWF4UEE2VDlYRkhTTkFMQWU0d0NYb3UwNW1NaHVQSXk3dTQwc0hDY2hkampTcjI3ZHlDdWEwVHQveTk5SEhNY2VYNlRWeTlzWlJhMkVnN01LYW55YWwzd1ljeDhnQVB3UHdlYkpWdGpFUUF4c2Zkazl1MmVhOXFjQ01CdXcxa2JTVVFlZmtNemRPUit2Z1pUM3JTTGczdkROVHRSWEVVNE9sYTlocjJncHJyZ3lBUUt5c3IvZDRoZjF2Q08xbkpEeE51V1NjaWpzUDR4ei8rbS8vMTRZZi9mZEJzYnYzSWtNY3hZZlhHQXQ3OHpyUFk5OTRuVVpteVhpd2owZzhrdlJxWHc2UnBrcXMxOHZVem5QRVlCM2RPNCtwaUM0c3JtOHNEdUF4SW1jTlFIMnVVVi9FRjJkYldsUzRyNFl0NkNnT0FucHRsU0tobmtzb3JmWkhYVHE3QXpoZ0VmU3NkVnpCemxFQmhXcUVMNkg4RmVVdWRwaW1IZ0F0QUNBWkczajZuWVEyaFFFOVZQSkk4c25VTVhMOTFEZ3lDQVE4Zm5zTlREK3hGeFpObUFHcWVUNzdTYWo3Smx4cWdOMGQ5N2ZRVm5MbHdRNW4wOWRpOEJLVERtUUc2bytHdXFtQUNNaCtYd3dGQ3JhbS8ydkZ4L094Vm5MMHdqejA3cHJCdHl6akdtN1YxVXlkeHpMRzAwc2JpY2h2THF4Mmp3QUVRSUtjaEhZY1JlaTBmY1NTZDVXeTFEb0RFOFFJMUx6QSs3aHpmdXRVN25pZkRCNHpGRjVucTg2QnZselAxNXgxRHRqMEZlZGpBMXlaNjZueW5WRHdBT1I1Zll1cmNob2QzS3VUbDAyV1Q1QmNpRnErKytyZi94NE1QZnFZM1ByNzlGNGM0VGlwMFY5czQvUy9QWXMvakQyTnkzeDZZUjVLakgySkNQVndjOWVBU1N2VW40SWdqdVc0ekdEQzNkUnhqOVFvdTMxZ2hTM0ttSDNLYk1kUWJUYVVvYjBYdG84ajNJdmdPcnFBWTZQM3FMYXF6aE5yUExhOGYvamxsU0g3NU8wck02Z3dTdUxwVEtTREFsQnFYY0dmcWJhKzZYUXdjUXFwZkljMytLaHJDZEF6VWNkUStCQ0FjQVFFSHhwK1pRcC9KWTNFQnpFdzA4SkduN2txcDl4VFF6Wmc2WGNER212dXVBYTNJMys3NmVPSFlUM0J6cGF0bXFjamdRSU1iR1RPOWhydWp6b3NSSmErbi9xdG1veGRFT0h0aEFlY3VMcUxpT1ppYWFHRExaQVBURXcxTU5HdWxYMkhMT1VjUVJsaHQ5M0J6dVkyVlZqY0ZjSGwvVmVkTldPWjVJUkIyQXdTZElHVnVwK0JPd3p4WjJjOVljTlRObXB4MFg5Mnl4VDA5RE53VlpBdlQwKzFKZTgzVFBGWmFhaDQ4alZmWEt3VjNhcTRIa2pueWVsc3IrWGE3dmJsa1BEWU84cHNLcXBzeENDSEVzV05mK2k5SGp2elN6ZW5wL2IrS0VjK0h4ekhlK3VITDJIWnpFWE1QUFFqbXVnQ0VWQmZtWVNiSXVLTUFVMm9MQUNMTFJEOHhWc09oNmd3dVhsOUcxNWRqY0xMQmVVZG51WnNiSFJyalRReXR3MGZ1RVBRcFdCTGtNa2UvNjFxUU1MRCtVYUd1V2xTazhvczZBZ0pxbkp3cWRnVjJSeWo3dFZMbXVtUEFwWXJuanRMd0ROSWk0QWlwN2dFd0lTQTRnM0QwZFdJbWozeFBQUU1ZaCtBTXpJSHFLREJ3TURnY2NGeUd4KzdkaFo5K2FEODh6MEZxSEoyb2FnTjNuUUFOZEpKR29IcnU0anhlUG5rUmNjVGw4Y2c0T3hpVDROWm1laVpCTHJnYUVsRHcxekRuUEZIMFhFZ3JBQ1BwUWdqNG9jQ054UmJtYjdiZ09VREZaYWhXUEhpZUE4OTF6WGUxSWgvcllSZ2lDQ0wwd2doeGJDbDF1WkhzRzdoYkNwNEw5Rm85UkVGazhpVWdGS2x0RFhqOXU3SEc0ZU10Vzl3ZmpZODdGOHA2emhNVGU2b0F6Nm1BeEtsVE12Q25zTy9YVThpWTdUWFVxZU9kRGZvd0RBM2dveWhLclJLNldjSm1WdkticldPd0lmbFBuUGo2MXc0ZGV1Ykc5dTBQL0Q1anJESkVlUk1ZQXhiUFhZQy8zTUxlOXp5T2FyTkJnRTdINDVYSE1CaTRXc0FrRElOTWZaV0tpNE83dG1CK3FZTWJTeDN6c01nL2hld21hVm5mM2JVRXovTlFielpRSDJ2Qzlid1JvVjJ5MENCdzlpMDZDT1lGaWFVNkRDV2dicUxXQ2V5WmFLNGdMazNQWUVqQXJtQWxpeERWRGdGWG0rRVZ6Q0dnelBCUzdXb0pueWgwbVdETThtU2NINUJqL0dEQWx1a3hmUFI5OTJEbnRra0NjeksyVHRhWlQ4YmNjMVErS2R2cEJYaisxWi9nNnZ5S21XYkhrWmppWlFkRFNuS0hNUWltT2pWY21mREJ3RFRJOWJHRTdyQm9SMWltVFBueXZCbVRlUndIY05VUVJSaEpoejNhdm9ybnd2V2N6SzB6ZjdNMjJGV2N5U01BTHVUd1hSekY4RmQ3R2ZOOEh1d3A0SVZSOVViUkI3T3psZWNiRFRhdklaenowZTB5M0U2YW5sSHFoV1o2UmZtTVpVRHY1NW5rZFI5Qkh6OXZQRjdEWFVHZmt6RjVBTkpVdjd5OFhLVGloMzBhalN3NThzSkdRbjRVdGIwcFFUeGtmZ3hSUmdEQXVYUGZlYjdYVzFuY3UvYzkvNlBqdUpPRENtVURnK3N5OUphV2NlNWZ2NDg5VHo2S3lSM2J5WU1Mb0hOOFhRZUlaT2RVdm5paEFORGJwc2N3T1ZiRDVmbFZkSHFqT09YbHFjaHk1NU1YWE05QnJkRkV2ZGxBcFVyNlF5UGI2ZGYrdHlYc3Arc294eXNMOU53c3cwRWRvSmVyak1yUE8yNnlJNVRDQnROL0xBckVBdEpMMjNFZ1o3Y3p1R29NbWhFbUNWVUhjNWd5dGNPTXlXdFBlZ0VHTHRSNFBZVStaOHJKRFlEajREMFA3TVZQUDNMQUxHcWpLZTRZTDNyNXJ6M21icnpzS2R6Vnp1bnoxL0hpOGJjUVJSeU93eEpUUEJLemZQS3RleWJDS0gxdHBnZVRuZ1VPaE95c0tMTzlkSEpqZXJCZVdrSlV1MXhIRG0yWXRRU2dPd1lDcnVPZ1V2SEFBUEE0ZmM5TVIwaWs3NTJHWmJLdDhncUJzQmNpNlBobU5ibzBhRzFudW56QUN3RzRMbXR2MitZK1Y2bWdwWUZhd0diZUowMHJkVHZkQnI4QXdJbXFweURQdkxtT2RnZ0dqY2RyMkRQR3pOUTVhcVpYcHZyaVA3THlZVjBCRDJ5OGtoOFdlcnJNcGdQeENNY1lLdi9seXkrZDZ2V1cvOU5kZDMzNGoxMjN1bk9Jc3BDS1hUM1k0aGlYWG5nSnZYdnZ4bzU3RHdOSXpKUG00ekw0b1VETUJVVGY5MTVMOCtDQm5WdHdjN1dMYTRzdE0vWjJhME55RE1kMVVHczBVRzgyVUsxVmMvT3MvOUg3S2V2K0pjc2xENnFzbi9vZkJ1b3l2cjlhenlzcituY21yT01KUGU0dUlGVThWK1owNW9BTERrY3dNRWZCU3F0MjZERnZyU3JKWWRYWWRUSW1UeFEvMUNLNlhNQnhIREFCN04rNUJULy8zbnV3Ylhvc2JXb0hES3lUTVhjTjlrUzVtM1Mxd1FDMHVnR2VmZWtNcnR4WWh1UElqZ0JYU2wyYTR1VVpjQU4wM1dBbU93TkN3RkdXalZoSTB6MFRpWWM5dGE1NWpraU9yWWNUbE1yWDkwNjMzUUZRclhod1hXWVVlZnEyMFBzaU12RWExUEozSVQrOWxvL0lUMCtQQTJEQlBYbXpIQjJEcDREM1BDek16cnBISFFjOUM4eDVnWFk2YUdjZ0JXMEwrblR1blRIWDB6RjJDKzRweHp2WmRLN0xaT0N1emZScW13c2hlSjVYZlJpR1FnaUJuS2x6dHgzd3dPMHoxNzh0UUR6a01ZWnUwK0xpMld1dnZiYjhQeDA1OGt2L2ZiVTZkbC9waGdtWUI1RWVSMXc2Y3hiQjBoSjJQZjR3YWcwSlIyM0NkMVNUb21DUU9rOStnMXNtNmhodlZuQjF2b1hWamovTWFZMFVhbzA2R21OTlZHczFjeWhobm5nbEsxblhQNkdTbFpVR09jbFRtTFZmWjJNRXFKdmRBZ0V5Qk5qVFpRUUVkd0NIeS9GbHlDRWh3YmxTNkRBZ1oyUU1YMEJBQ0VlT3dldnhkbWoxcXNma1plQktKRHNtQjhORXM0cC85OTU3Y04rQkhja1N0SFJWdXBScVR4YXdvYitmaktVTHdQRnpWL0hDc2ZPSTRsZ0NuSXZVdUxvRE9hYXVIZWtBZVY3YTZRNWNIa0lyK2NTYlh2b3JHQWM4eURROXRNRzB5Z2VnbldaMTI0UVFxSGdlS3A2clpzZ2s2ZkxhMnZkWmtDLzZtMGdVZVJ6RjhGcytlQnluelBFNjNUYlBaMkdmQUw1V3c2V3RXOTJYQVJGeHJrYjhGWFB6Q005bDVWU3RnM3piNW5vRFpuMjZSSzFUMk51Z0YvSnV3S3lxUjZGdmd6Nk9ZMU1uTmRrVEZXK216bG1tZXQydXNtSFkvTnBxVVNxd0lmS09GTWo3NUlzK3pvRDA5U2h6UngvRDgrclZCeC84MU84MUdsdCt1dXgxcjlVcThEelhtQjQxOUoxcUZic2Vld2dUc3pQbVFRY0d0SHNoVnBaYjhMdkR2d1p6cGQzRDFZVVdvZ0ZXZ0ZHRDR6cll0blA3T3RXN1RyLzNmZ0FzVzdodmtkR0FEbUJFcUt2NG9jdG16MFZBd0hIa1ZETDVrV0NTY2ZLT3VZNjBORGtNSmk5TGJjdTh1ZzdtUUgzTERnUFRhUTVEeFhQd3M0OGN4QWNlTzRoS3hTVm1kOVVnTThhZVZ2UWtHZWExc0dvZkRGaHQ5L0N2UjAvajBvMGwweVlHL2JlRW5EaG1qcTJkN25UYkdXa3pkSDZaSlpQR2RDT0UxVkVoYmExVksrck5lUGFkU04rZjFQTmRwT09FRU5CREtZRXl6MmRlMHl1UWdpemR6NXJ0cGFJZkcyTm5wcWVkRTBLSUdHbTRjeUhIMmluTSthQVA1MXd2ZDZ2THAvWlZIcDB2cG5HeEpIVXNoSWoxdnE2UGM4NmpLSXAwMlRpT2VSaUdPajBPZ2lDSzQ1aEhVUlQzZXIwNERNTTRERVBlNlhRaTMvZGozL2Y1eXNwSzFHNjM0d3NYTGtSQkVNUklnRjNtdzRmTWI4b01BL25ONEhnM3F1b2Vwc3hHSG1QZHkwUlJMM3psbGIvKzMrNi8vNWR2VEU3dSttU3Bpb1V5WCtxSGhIN2lSUkd1dlBneWVnZjNZOGQ5ZDRHcEIxYkZZUWlWQisxUVp3RHBnVC9XcU9MNlloczNDMStoT1N4Y2t3WTBtbzFzY1pNOElyUUhGbHRMWnlEN1lCMzZPS1VzQUdXaFhsVFBBTFZ1ZHN1QlBWVXRsK1BraWZvV0FKZno1eVcvcE8xYW0vWmxIbWJLeVhGNk5ROGVBQVFaaDJlR2diaG4zeXcrL3JOSE1EUFp6Q2gzRU5qUzhYVTY1azdoRGxVdkFMeDY2aktlKy9FNVJMSHluR2RLdlRzd1F3bmFZeDVNZThlcmZSQnZlVEE0eXV3Z3BQZWNOUFhIY3ZFZnBwVTFrK2VhZEVEb3FuL3k2amdNY0YwUHRZcjBSaERrOWdsOXlxbmZSSEpQekcvRUJqeFg1bm55dDIvRFhKNFAzZVlaMkFNQ25Bc3hOZVVjR3g5bjV6WEVaWFVwd0tjRXZNNDN3T05lbjR5dUx6V3VIc2R4eGdLZzZvdGhlZWJUUEhwYksvZ29pa3dIUkV6ekVTTUFBQ0FBU1VSQlZNZFJoN3M4ejNyR21PaDJ1endJZ21HbXpnMnQzRWNzQTJCelFGNkh0VUR5dG9ONG5jdm9jdWI4aEJEaTlkZS8rcVdEQjU4K3YyUEhBNy9EbUZQdlZ4bm53cWdMZ0tnWUJmeVZ0eTRpV0ZyR3JzY2VRSFZzREo3aklJN0o5SStpbjFQQjJUZ093OXkyY1d5WnJPUHFRbXRFeHp3YWtnYlVtNDFzZzliQzRKSERxRzNvazdFVXpKUDB2a0EzVVgyVWVtNXlYcWNrQit5WjA3ZkxVYWdJYUNJS0JWR3p2S3oycEdkSWVjbnJIN3hjR0VkMkFyaGFPY1pSYStYS05YRUVaaWJIOEVzZmVBRDM3ZCtlbU9hVlZTb05lbUlTbzM4TEtzR0crMHFyaDI4OWR3SVhyeThaS3dLSE1JNTBlbUViaHpFRFNmazNKWWU5T0plQWRoelpnWEVjWVphdVpkQ2U5V3FmSjk3MUFJdzNQWjAySjlzTGVKNkxXc1dUNC90Y1hUczE1bS9BWFhoTEUzalQ3emlVM3ZPMldaN0NQWUc0RGZXMDJaNHgwWnVaY1Y2cTE3R2dUZTlJQTc1Zm9KNzBsT3dwMWEvVk93QjdHaDExcE5OaitKeGI4OS9KK0xyZ25Bc2w0b1Yxakl3M2ZaNnBYbTN6QVY3MWRoZ1cxRlRCanh4dU9lU0ZFSUxNTGIxVmtGd3ZxRzZXTXJvY0k5c0FnRGZmL080THE2dFhMaDA4K1BSLzlMeGFvVU5lSEhNRGRMMHNwbmt0cG5vUUJxMFdMdjdnUjloeC85MFkyN2xUUFdUcFlVdWNqWFZtdGFxSC9UdW5zZHIyY1cyeGpUQ0tTNTV1ZnFoVXEzQmRCeW02alc3NVQ0YzFkeFJLVmxBYTVFbWVyREd1Q09qOTZpMEJkYk5iVHVuM0E3dWRYNjlHSjFPVUp6MlQ0KzFDT0JCTXJsMHJsQWVkL3UzSmw3Y3c1Y3dHQlR3SnYwclZ4VWVldWh0UFAzRUludWNZODNyYWVTNGRseml3V2ZBM0hRTVovOUtKQy9qZWo4NUk5ZTdJUldtZ2xxUVZxaEY2TVJ1b3Jnc1hNTllDNlhTbk9pNWszanRqeXI5UU1EaE1KT2ZEWkI3R0dBRzdqSU9RYlhOZFpacDMxVkhwSWpNTTJSK0tmVS9NOVJmcTlzanZzQnNnNkFhNVlKZjFaK0dlTnQzRGpMKzdybGpjdXRWNXlYWFJwVUFIZ1RiWk5vNTBWcnFCczkweG9PUHdzbDBwd05NT1JkN1VPUWdoMVQ3eGxxZWRDbTZQdzlOdGErcWNpT09ZSzdPK0NNTlErTDR2T3AxT3Z6L3NVVUM5WnJEVGNMdTg2NEdOQWY2dFBNNm94OHE3ZVVOaGEzNysxS1ZXNjlyL2ZPVElKMzYzWHA5Nkl2Y2cyc1JueGdyVFNsNXZDeUZ3N2ZncFROOWNRbU42R3pxOW9LQ0pKWnBNaWswMGF4aHYxTEN3M01IQ1VrY3VFREwwbVFLTlpoMlpXN051UDM5Z3paVU5VdFlEQ3VhUHJJMENkSlZXcHI1Q3FHZnJ5TXdzeUFON3BycmszSVJnWUE2WGtHY2Fsb0I4NVN4VFRtTjZPaHBUSzhXcGw4aW9SWE80OHB4LzVONmQrT1RURDJCNm9rRk04Mm5QZVBxZHJHcVhtT2YxTjRYN3pkVU92dkc5MTNIeDJrMHo1bTg4NTdVbFFjMTlFOGFqbnFWTTg0NlM0UnpTbWM1TWw5TXIyU21nYzZIYW82d0lrdmtpSGFjc0NOV3FpNHJuUVM4TnJHY2VGTjNXUExqVGV5b2c1T0kycXozRVlaeFI5aFRreVg0NkxqSGJ5L3ZTYUxDZlRFODdyMFBOUklNQ0o1QTR3NmxHbUhGeTFib016Q21rUVRvQU5NQWF4N1ljN2xMZThocnVwSXhwbDFieFJOV25ITytVeDd5eElLanhlMkZQblZ0WldlRkNaTzdLc0dBZnBVenBjTXNkN3dCc0Z1ZTdPN1VjaXVwaGpEbjMzZmVMdnpROXZmOVRKSzhKNCtNTk5CcTFYTGluSG9UcU80UURNYmNickRyU0dqd2twSnNTUmh6WEYxdFlhUS9uMU1jY2htMDd0aVgrQkVOMkVFcUh2bjhDYS9uN0dCTGttYVJCQXFFb1N4NllpekpuT3dhbHdENFFNRWtuVXp2VnVkcXlwQURKbUhha0k0NmhDdGd1YzR5ejNhNXRrL2pNenoyTWUvYk5tdDlyOHZzbDIyQXA1elZqUUZRd2Q4enZTQTBmQURqNjJrL3duYU9uRUhFT0IwbTdqQ09ncWtodk8weERQOTFlUm85aDRyT09lTG9KeHZHT25JZnVzRlFySG1wVkwrbU1nSnlMYVRtU3Z3ZHk2Um5zMzFzQ2JCN0c2TFY2NE1SQlZrTmNieWR4V2VEcnNYY1ZIMDlNNE5qNE9MdWtvYTVWTldVMlRhUGJ0bXJQaTBlQmc1M2FUcVdwN1ZoMUltTGxZR2VjOXVoMnJJS09ETU13VXJ1UlV1cXg3L3R4RkVWeEZFVThETU80MiszR1FSREV2dS9IclZZcjduYTdjYnZkamk5ZHVoVDZ2ait5QTkwb1pVakhxVlRZTEdQeUc2bUlSem5XZWg1djJISTVmOG9xUWdoKzRzVFh2NzUzNzN2Tzc5cjErTzg1anB0NlAyVVFoQmdicXhmQzNUYmpWNFhBaFJkZndzVEIvV2hzM3c2bXBjcXdnYVdiV3ZFWWRzOU9ZTXRrSGRjWDIrVHRkdjB2UTNPOHFSNXUvWUIyTzBLNkljVi9jZ01hWEFybUpMMXNaMkdRVXM5Snpwcmg3VXpsd1o2cVZiMU56aXg0bzV6UkJHZHcxVkszUW8yMXU5RGo5MUlSajFVOS9PTFAzbzluZnVvdWVJNjBrMmZXbkFjTWtLSGptZnBsTWZYR053dnVqQUVMeXgzODEzOTVSYXAzU0Noek5YRmRiK3ZGYnZSUGtDczE3d2p0aUNmbnc5TjE2R1dya3JGM3VlS2RnSWdabUNOVlBrUHlpbGxwbXBmVENpdWVnM3F0QXRkeEpGeEZzaUNRTnVkTGUzNXl6Vk4vUWFsYlJMWTRSOUQyRWZyVXVTNEJ1TndYdVdrNWNJZmpvTE5sQzM1VXJXSlp3MXdlaHFlVVBGSHAxSVNmR3Y5V0RjMEZQODJUSitwVkcwM25RZ2RkVHF0NlhVQ3ZWa2ZxVEhuNVV4VlB6ZlcrNzNNeUZzOFYrSG0zMitVNWMrT0x3bTFUK0JzQ2VTR0dIcGRmTHhDUEN1RzFsRjNMTWN1V1Q5VjE0Y0lMcjY2dVh2Mnp1Kzc2eU85WEtvMTlPaUVJcENPZDR5Und6enJqSmNySWRSMDBHalVzbi8wSld0Zm1NWG4zSWVYME5tU1RDczZ1V2F2Z3dNNXB0TG9CYml5MTBmT0wxM2x1ampmUkhHdWtuSTl1WlJpdWIxd3ljNDZpS2xWZ21FN0R3STVDQ2FpYjlDeWtSd0Y3T290UVkvUEtZWTB6Z01tM3dnbTF0S3NRU00yWEJ3UGUrOUIrZlByREQyTnFyRWJnVEpTd05tOFRLdzgxejJ2SUEwaDFERGdYK1A3TDUvQXZSMDhpanVTOGZVZDd3VU85cHg2QWZ2MnRuTWFuS1M1Tjg3b1RvWmV5QlVOaXBsZXFuTTZqaHdBWWsyK2prdzZIcWowSzlCWFBRYTNxd1hPbGJaOXp0VlllMDlkU25iY2VpSmVJZ2w1SFFGN29uUHNBSVBJak9mYzk1L1duL2NDZTdOT3hlS0JTRVRlMmJNSExqb09BT3FralVaaUNjeTRZWXpiZ1V5cGZkUWdHT2VUUitsT2RBS3JjTmRSek9nRm1JUnQ5UENRZENnM3hsTmsrREVPdTRhNHo2anJVV0R4OXJXeS9aV3h2RzlUdHNDSG1lZ0Q5VFBaM2l2bDhyV1hYbzN6Zk9pdVZadTMrK3oveEg1ck5iV1krL1pZdEUwck5JeGZ1eWJaTTYzWjlYTG8wRHdEZ3pFRmo3eDVNN2RvaG5kK3lkelVucm54WTdRYTRjYk1OUDBqRHZqbmV4TmhFYzAxMTM5TFFEM3pEVk5DMzJDaEFWMm01UlV0Q1BSTzl0bklDU09hMU8rcjF4Z3FzREV6TzlkYm1iWWZoM24yeitPelBQWXJEZTdjcW1CSnpkbW9NWHYrV1NUeVFBcit0K3M5ZXVJR3ZmZWRWM0Zoc0tVdFdra2NmbnluMXo1eTBhZDVKL2IwbzZ3R1ltUU92b1c3eXdmb2JRem9kWUtoNEx1bzFENTdySm0zWFFOZUJaZi9LVXNtTVpRQXZBSWlZSTJqM0VBWEoyRHVBRk5UVCt6YnMwM0FIQkJvTm5KMmF3aHNpUFJVdTVjUkc0K2czVmZsQ3BEems3Ym56S1pDVE1zWThiOEUrdHRQdHVmQmtPMldpSjZaN3pxMTU4V0VZeGxFVThXNjNHd1ZCd0xXcGZuVjFOZTUwT25HcjFZb3ZYNzRjMGZNZjRUTlNXVEVrdERjRDVEY1RpRzluQjJEZE9nR0hEajN6dnUzYjcvODF4cHhHczFuRHRtMVQraDdrQWo1Sms5OXZ2bm5GV0FFQWdOVWJtTHI3TU9vVHFkR0EvTUFLZHdyRGFzZkgvTTAyL0RCR2M2eGhBWDV0SFluaHczcjhQZGhxZDRSamxRVjZRWlo4cU9kbEhxRFd6Vzc1Y2lMOUR3QTlOaytCeVJUMDVmNkIzVnZ3bVE4L2drZnUzbVZBVGFHYWdUdVM4VzhBNlRRRlJ2M0lXVzUxOGZmZmVRWEhUbDYyeHR6SjJMbERUZjlKcDhNQkFiM3E1NXBGY0F6c1ljcjNhN2R1VjhYelVLOVZVck1EQU5vaFVXZElBYytnalJ3bTJOWXQvU3lQdWdIOGRwQUxkenQvR3ZicGZXS2U3MDFPaWxkcU5YRURSTEdEZ0YxdmsrOE16RW4rMUVJNE9qN0hYRzhEM3g2SGp4T3huU2g3ZTVzblkvRUc3QlR3Y1J6SFFSREVjUnpIVVJScHlQTmVyeGVGWVdnQXJ5QWZ0ZHZ0K01hTkc5SHE2bXBaU0s5YlIyQll3QU1iT0NZdmhESFpsM2xxRjUzSW5WaDJQZXNvVmYrNWM5OTVmbUhoN05tNzd2cndienNPdXh1QVV1TEZjRTlNK2d4YnRremcycldiU2FONlhTd2RldzJOdVRsTTdOOER4M1ZMbmtHZjB5RlhZNkpaeFVTemhsQUEzWmhaMCs0MnBoTTZPQlJCYzhoeWhjbURLaHdDNkNaZlhwMmpRcjEvMlR5dzB6TDZsYkx5RmJJd2NUdDNUT0l6SDNrRVR6MjR6NmhqNnFUR1V2QmpPYVo0Rys0YWpnd3g1L2pYSDc2QmJ6LzNCcUlvbGt2cXFvRnpmYzJrMDdwYTJ0bVl2L1VpTmdKY3RZa3JVemtEekN0bElaSzE1eDJ1L0FrY2E2bGFwcGVORm5BY0Y0MWF4U3hGcTkrVUo5U2NPMm1TMStjaUVxZ3padWJqeTFhb0sydjlyWW1JbzllU252T3BsQlRzN2JoOHNPdjlTa1Zjblo3R3E0NGpBaUV2V2g3VVU0cWVLSEJCMHBNTlhaZ25iMzZqUUllbDZxMU9ndEJsaGNnc1hhdC9nTlFyWGdNOVpaYlhId1YxTXo5ZUYxTXIzM0U5WlM2T1k2NFd2UkcrNzR0V3ExWHdCNUw3S1JQV1VyWnYyREFsRDJDUW1yL1R6ZWpyWllwZk41Tys0N2p1UGZmOHdzZnZ2ZmVSVDR5UE54d2I3bnA1VHZQd1ZBOU16amxPbnJ5USsvSVp4M014ZWZkZHFHK1pRcmwrUzdsUWI5YmxkRGtoc05vSnNOVHF3UTlMenJFdjI0eDEvNm1YcUxCc3A4Zk9VNUMxR09oRmhjcENmZmp5ZzhCdXh6bGtTZHFkV3lmeDZaOTdHQjk0L0hES0F6OEZkNFpVcDFRRFQwTmYvNVlkVlE2azNPdG5yK0FyMzM0Wjh6ZFhpVG9uNnBzcWQ3M3RKSjBNK1FmRUVyTzhocm1USGpMUWpuMG0zYktTTVVDWjVhdW9WQnhUVnJVNGRjN0pPY2lMSjAzeEtpOHBrMFFJcmU4UWRnTDRIYitVRTJqV1ZHOTNCQVFBRVkrTmlkZkh4c1FGSkNyU1hyU0dUb2N6MzVhaVR6bmtGYWo3Mk5xbllLY0tQNlpwL1pSOG5ybGVMM0dyemZWYXhVZFJ4S21LcDB2WVVqTjl0OXVOTzUxT2ZPUEdqYkRWYW8ycXprZFc5ZXA2REIwMmkzYzlVUHdFTFBNSTcvZjBYR3Y1OWFxamJGM3JoaUxPWS83R0cxLy9COGRaT3YzRUV6Ly9XNEEzUTlmWXR1R3V0MTNYdzlhdFU3aHhZeWxiWnhSajZjUkpWQ2NuTUhINElDcU54cHJiV1cvVzBHaldvS1hMeEZnVkUyTlZkSG9obGxxOUFhdm5zU0d2MkRxU2ZoQTh5eFR1VTJRa29KZHRWeTZjaStvUTZhMGlzQmVWVS9rRkI3Wk1OZkhwbjNzWVAvL2VlK1JZdElGMWdYazdGKzRrM29MNy9GSUxYL3FubDNEczFDWGpaR3BXZkZQNXVlQVM1a3l0WnFma3VKNkx6cm15Sm5EOWZuaFpnNXcvTHlFc1Y3UVRCcmFPK2gzU2w5RFVxaFZwbGxldnVwWEtYYjJBUmpWZHlDL2xVeWYwbndBWWlHZTlTbWY2SEJqVVNqMENzUi9CYi9jeXI1ZE4zWVcrU2o3WjEwcmU4OFR5MUpSNDJmTkVTNmwzbzhxUndOb0F5MWJ5TkpDeVhLdHV0YzBaWTRXQVYzVlJvRk1ITzUwM3BlUkptK2k4ZUM2RUVNUkVyM3NGNXZXeCtqc0lBcTNxT1ZYeHZWNlBhNi82SUFoNHdTdGxVNWV6ejZkTVdFdlpUTmhReUF1UjhySUhOZ2ZBeTlTelhnQWZwcTZpT2tXZnROeGpIVC8rN01rSEh0ajl2NCtQMy91TFFQUFJJcmhUcFQ4M3R3V0xpeXVJQzE0NkU2eXNZdUhsVjlIWXNSM2orL2JBcll3K3Q3NVM4WkNWSUF6TldnWE5XZ1YrR0dGcDFVZXJTNVNLT2ZNUmYvc0RpNjIxTXlCeU4vTnpGbVFZQ2VnRmtZVlFWL0VGSFlOMHNSeXdGM1Vvck9OTmpOWHdxUTgvakkvLzdQMm9WVHlsZXBHb1lDVHJ2dFB4YlBWL0FuZUQ5alRjZ3pERy8vZjkxL0hOZjNzZGNTem52SE1rQzljd1J3QkMrd0l3UUFqVFJMMEd2WDZqSElTYUFxZGd6dFZiNFZLdmxDVno2NWlhVXNjWWd5dUFxb0s3NjByVmI5YmpWMitkWTJvK25PUzZuSENuVHNxb2QyR0FyNWY4MVcralU1YzlqTkZyZFJFRnc2OG9tU2g0L1ozY3NIcWRuNTJZRUtjQUVYTU93V1JqVXlDbndBY1NwUTR5UFE3SVYvSklLM09od1EyZGdVeHZVOXNwVlk5a1FadU1rcWNkQVF2b1hIY0lZQTBGVUFXdjY2SkwyWGE3WFU3ZkdiKzh2S3dYdjdsVklGL3JneWNUYnJlU0gzUkM2d0hmemE3Q2g2MlQ5VWtyREdmUG5scDg0b21KZnhSaTVoeXc5V01BYXhRNTREbU9uRTQzTnpkalBPMkxRdmZhZGZnM2JtQnMvMTZNemUwQTJQQno2OE1naE9mWjQvekpxZFVxTG5iTU5MRTFybU81MWNOeTI5K2c5OWpuQmRGM043L0VRTW9QcUd3VW9BK29yd2pPZXF1d1UxQWU3QURRckh2NDVOTVA0WlBQUElobXZXcGdyZWx0ZTYzYnl0MGh2MHZ6VGVBT0FDOGRmd3QvODgwWHNiRGNOZ3ZhQ0NZQnF0ZWRCMWR6MjZHVU9tTm1MandFeUx2aGxVbWZ5elp3emxVYldBcis4dVV5ekt4azV6blNVNzVlclpnWFE4azZGYUtGcWdKNmRUc05jWEp1YW14ZWtQTTNhL3pyVGxjazU3d0gzU0IxWGZxRlBDVnZPbkZxbnpIUm5aaUlYNjdYc1VnaHJzRUlaTlM4anVja25sdjVNK1o3K2xIMXA3WkJWc2FqSFFHaTRpbTRUY2ZCT3FadGFUQnhZUmh5cnNiaXJlVnF0YXJubkhOanB0ZlQ3SWlLNThqL3c4aGM5Z0dmTXNHKzNpT0ZEWWM4VWZOM21obDltTHB1WlowamhSTW5UcXcrK2VTVE01N1hPaWxFY0NXT2Qzd1VxQjQyNDVvNTgrZm41bVp3L2ZvU3dyQjRQanNnSDJhcmI3NkY3c1hMbUxyN01LcGJwcE5sYkszQWNpNko3MGRvTlBMejAycGN4akF6MGNDV2lUcFdPajVXMmo2Q3N1UDJ1WldQWGpTcG9tUWxBOEZMMGdxekZDUVVBcGxrS0FYMW9ucUdBenNnVVBWY2ZQejk5K05USDM0RWsyWUtKd0NROFhmYlBJLzBQZ0JpcGs4NkJUcGNuVi9CLy9PMTUvSGFtY3RtTEowenVkQ080MGl6dUZ5d1JqdS8wVFhvaFRHLzYrbjVOQjhYMmlTdjJxay9YRmtkbEw2dVZqdzA2aFZsblZCWUZ0eVk1SFVud0NoM2FETy9NTllJcWVqbFAvSktNakFoWWM4WU0rdlZCeDBmZ2ZLYTE1ZGhtR2QvL3JRNUptbzFmbUZpSWo3aE9BajBPMTJVS1QwUDZtYmZVdmE1WUFmcEtOalExbW1NTVEzN0dFaFByZE1mWXJhUFNSdFNDOTlvOWxOaHI5OVFwNjMxZGh0MXAwRUl3Y2s0dkZtNlZxdjRWcXZGRnhZV3lxajQ5Vkx6NjhhRjI2bmsxME9GRDNNaE5vTUtYMHZvWjdidmx3OEEwTzEyK1lVTEY5cUhEeCtlWWl4dVZ5cFh2c3I1bGlOeFBQVWh4cHdta0dlNmQ3QnYzM2FjUFh1NVZBT2pNTUxDOFpPb2o0OWgrdDdEWVBVRzRzd2MzcHhtOHhoQkdLR1NVZlA1cDhmQU1OV3NZNnBaaHg5R1dHbjdXTzBFUXozdytyWm51QW9HUlJTbjk4MjZCcUFQYUZlYTV3VlF6eVRaN2M2Q0hVTE80dmo1OTk2SHovNjdSekV6T1dhTm9lZkFQV2NNSGlEUUo3OUpIZndnd2xmLzI0L3h6ZSsvQnE1ZnhPUkF2dFJHSzFTMTZJNGVjOWRqNjF4WnFwaVF3OW9PVTNCbmpJekJ3NHpOTXpWdXIxb1BSd2d3eDFIajdYcU9PeU5UMFBSTGFCVFlCUjFxU0g1dlJxZXJhNWxTOUN4NVRaUVFBbEV2aEc4dFI2dkRJQ1ZmOURjaDVOUzR6dmg0OUVxOUx1WWw4eEt3NjBETjllcW0yK3FjZGdSU1krdWtIbU9tcDJsYXVlc0FuYWlzN3FRL2tGSC9PYVo2dmFSdFpucWU3Z1JRMWE1TTlGdzczU21GYnpvSmFqeGVhR2M3My9jNVdiNTJVQ2pUQ1NoZGp4amx3VWJDaG5yWHB3N00ySG91REhOTEY1blpnTStHSEd2YnRtM1ZYLzNWWHozb3VxNlR6SFR3bW1HNDlXbk82L2ZudmEwT1lEaHg0anlXbGxxRGJta21UR3lkeHVTaEE0aXJkZkFCanFHTmVoV05SaFdEKzAzcG9IKzlYQWkwdWdGVzJuNW1jWjNTbFF5ZjJELy93S0o5TXF4WitROERkUlUvbEZwUGwzRWNobWVldUF1Zis5amoyREV6a1FaM0Vkek4zUEljdUJNdmRocis3Y2RuOFZkZmV3R0x5KzNFKzEyYjJKa2VjNWYxVUc5NnM3Q05xanNkeDh3NitabTJHUzk4S05WZVJhM3FwUmJLQVVBNkpPUWMxZCtQL2tucmM5V0lsNXVKVDRJT3VvN0lEeEcwZW9pSXRZcE9GeHcyRUZPOXFOWDR1WWtKL2daajBtTmQxVnRheFlNQUgwUWRZNENwUGlmTnFIUWtLajdXNlRuN3VZdmlDT25BWi96ckRQbkpYSGpPT1kraUtOWUwzcWdWN016NjlHRVl4c29rSC9tK3ozdTlYdHpwZE9KMnV4M1B6ODlISTY1UlgvUXBYZGVkRFBuYkRjR05ndmhHZGhZR2ZqN3hpVS9NM1hmZmZWdDBKOHR4SEljeHhxSm9iSDhZVG40SWNDZk5nNGpKaDdmdlIzanBwVk9GVG5pRHd1VHNGb3dmUEFCUnFTS21Yc0RxUVZXcmVXZzBhMkEwY2cwaENHT3NkSHlzZHRaajdENm4vRkJWRHNoY0N1WWtmUURRemQ3QWV2dEFQVnRKWWJsNjFjTkgzbk1QUHZITWc1amJPcG1kNDY1K2VkcWJuU25TYWVDbGZFRnl4dHQxZU92cUl2N3pWLzROcjUrNUxQT3B4WFdrbVo3QTNBRWdMTkE3RXVTcGw4dW82WHpwQlc1a28vU2lQV0FNbnN2UXFGWFJxRmVOSTEyaXpGVm5RQ1Rub3Y1MDB1ZEEwNkQrRUsxT2pRNk1BWEVRd1YvcElncGpVMGRhc2JOVS9uN0Jmcnk3TGw4ZUg0OStYSzJLWlFDY01RWUtkQkN3RktsNGtpY0ZiUnFmazJhUHZhY1VPb2tyQlhnS2VRSjNrMGRIQ0dXcTE5UG43T2x5dnUvSEZQQkJFTVM5WGkvdTlYcGNxL2psNWVWNGNYRXh0cStSOVZuUERnRHRMSzBaMExjTjhvQUIvYnNBMzhEUDlQUjA1ZmQrNy9mdWRsM1haU29BY0JoalRBaW5HZ1JUNzRuaitpTkprbnhZWGJteWlOT25MNWE1cmJtQk1XQnkrMVpNSGR3UFhxMGhpamlFRUdnMmE2aldic0dva1FDRUVPajBRcXgyQTNSNjRVam0vTUxLUjhwYXBsdy9tR2NUeXFsMGxUWXExRE5KQWpOVFRmemkreC9BUjMvNlBreW9NZmM4dU5ONTVubHcxK3E3Q081WDUxZncxLzk0Rk45NzhYUUNTMFpVdTRvemM5eForbzEyUUhwZk85RWxuUUI5WEthV3FKVkREdldxaDNxdG1ub2JuRHkyZnJHTWRNQ0Q3andnaWRmbmtzVHBmWmp6TjlkQ255Z0RlQkREWCswaTlLTzBYNExPUXZaSFVQSnh2UjZmSEIrUHprQUJSQU9ld2p4SHhhZFVQdEx3TVdxY2xsRndMUVErVmZCV0hkcmtucWZvQndKZTE1bTNvaDM5MW0rWDB5dmJLY0RIR3ZxOVhzK28rTVhGeFhoaFlTSGk1R1U2YS9nTTNSRllEOGpmYnU5NllFaGRwTUtnbi9oNlBNM0wvQm5kdmg3U2lHRnBhU2s4Y2VMRTRxT1BQam9MbUk0V3RLQ3ZWbHMvaUtMd3JPOVBQQ09FczFVL3BQYnMyWWFiTjFjeFA3ODgwbkdGQUphdkxXRGwraUttNXJaaDYxMEg0SmxsY3Z0Y3hqVmNZY2FBc1VZRlk0MEt1QUorcStPajQ0ZDlGZzBwR2ZvQmM1Z0sraFpiQTlCenM5aFFMNnFudUVOd1lOY00vcnNQUG9Tbkg3OUxMc3VhQS9lc21UNE5kenJlWGdUMythVTIvdllmZjRodi9lQTRPSmN2dEdGNnZOdlJjOS9sRyt5WUlON3hZSUQxem5jOTdzMmx5NzJjRnNkQnZPa0ZIT2FnWHBGVDM2ZzVYazkva3gwR2VRMkUwSFBuR1JpNGZCTWQ5RlEzbVVHZms5RGJrQjc1dXJ6c0FNaHpqNE1Jd1dvWElWMUttblFjb0s2ZGZ0NUxPT2ZjdG9MZ3VueCtZaUo2MmZONG0wdC9QZzE0TXc1T0FVL0FZc2EwUWFCUHRuT2hUL09RY2ZJTStDMWxyL3NHSnAyVEtYUTZEVWpOblk5Skd3WUNYdmNXakpsQWpiOEhRUkFIUWNEVnVMdm85WHE4MCtud2Rydk5WMWRYVmZOU2Z3aWpmZ2FGZFFjOGdOdXI1QUVEbVkxV3gzZWNBbC9QejhURWhQZUhmL2lIOTlWcXRZcXQ1dFV0WVFCemZYLzgwVENzUHdZd2p6R0dPT1o0OGNXVGFMVzZaVzV0MzhBWXcvVE9XY3djMmtkZ241dHp6Y2N5UWYzVXVSQm9kd08wdWdHNnZiQUlwV3MvVUtucXNobXkvQjBGNkhudEtLb25YNjNyd0JqdzJMMTc4TXNmZWdpUDNMTTc1YStSbUswSjVOY0E5NVhWTHY3bW16L0UxNzl6REdFc3pkVnl6Tnhhc1M2bDR0TnhnQjJYN256UWNmeEd2WUpHdllwNnhUTXZxREZ0aHFYZTlma3hlcTdxUERXTUZjd3p5cDNtVjlzOGpPQ3Y5QkQ2eVdKUEZPcjlsZnpndnd2R2hOOW9STWViemVpOHVxRkd0Wk1iWEtRZWFVY2dGUTlyMnB3RmJ3TityY3AxSGdMMW1LWmJpcDJxZkEzNGxJTFhabmxkbDRKNml2RUFoaHFIenpQVHI2eXN4QXNMQzRQTTlPdWkyUHZjaHpXSHpRajVkd0xFYjFYN1VEYnZ4ejcyc2UzdmYvLzdkeXZHbS9GNWRVc1lGUFE1ZDhlNjNiRW40N2h5R0FEei9SQXZ2SEFDdnQ5dkZicnlnVEdHaWRscHpCelloOXJNZEhJV1pjTWFmNzR4RjJqM0FuUzZJYnArV0RqMUwvZEFwWS9kQitTcG5VRVZsZ1M2MlIwRzZ0bUlpdXZpbVo4NmpFOSs4Q0hzbTl1U2diczlobTdEUGVYSWlmNXdiM1Y4Zk9tZlhzUlh2djB5ZkQvTVFGekRtb0llTEQwdWI5S00wNTVJT2VNQnpKamlHL1VxYWpVUHJ0WDVTRG90U24wWHdaMWNDNjI0OVRtWnpnRVU0Qm5VdUwzTUVQc2gvTlVFN3VhNExMbGVPbERvMjNGOUFxL1Y0ck5qWThFYmpJbFFnOTB5endOa1RKNmE2UzFGbjJ2Q1J4cEVLYVdPZ3VWdHFZSW42Y1pzVDhFdUxMTjhHY0RyUElOTTlOcE1yenNBUVJERXJWWXJvb0JYVStiV3kwdy9kQ2RndlFBUGJBTElBME9EZmpNQ2ZETzFDV1h5T1k3RC91aVAvdWpldWJtNWliU0NUeWw2QS8wb3FtN3ZkaHRQY2U3T3JxeTA4Y0lMSjBaMnhDc0t6YWx4ekJ6WWc3RWRzOW8rdXE1aDBFOWRRTTdaNy9oeURIL3dIUHppQ2d0RWNkOHltVHlGV2ZPQTNxK0FHS3BqTURsV3g4ZCs5bjU4L1AzM1kzcWlrUUphN2h4M0FuY05acUFjM0h0QmlLLzgwMHY0ZjcveFE3UzdQYlcyUFhHWU14MEdBbnJ0YUlkRTRRTkkxc1luS3A1Qm9GcXRvRkdUcHZocTFUUHdUUnp4Q0ppWmhMYXBVK2VCenF2T2hXbXRibzNGQ3pWV1Q2MEhBQ0FFb2s2QTNtb1BjUlFCcWM1Q2NsRlNuWVVjNk5OOGVjSHo0c3RqWThFeHorTXRLTERyYncxekRXMnQxSFVlRU1CUXNOdncxcDBHb3RSdDhHZWM3cWlxdDZGT29KOGFnN2UzUndHOFVJNTNSZVB3eWt3ZjI5NzBOMi9lakR1ZERsMGU5MWJBL3AwRGVjQ0FmalBCY2pPMVpkZ1B5dVRidTNkdi9mZC8vL2NmcUZRcUxnamM5YlpXOXVyMk1NWVk2L1ZxaDNxOTZtUHo4NjJ4SC83d2pYVUhQUURVR2pYTTdOK0RpZDNid1FZc2x6djh6N2Q4Z1NqbTZQb2hPajJwOG1QYlUzK0FFaTdkbHI3RlJnQjZZWEt4MmhjQWRtK2Z3aWVmZVFnZmV1cHVzN2dMQTlMVDJRaXNNMlB3T1hDbjBLSWhqR0w4L2IrOGd2Lzdhei9BNGxMYmxEZXZlRlVLT3UxSWx3Q1lldFJyVDNtdDRsM1hRYU5hUWIxV1JiMVdnZU9xdWsxN1NadE5wMEsyUzYrQWx3dy9FRVdmQXJLd0xCVkV1Wk5yQU00UnRIcm90ZVQ2OHZSYUpaWUEycWIweFNxajVLV2xnaTgzR3Y0cnRWcDhYVGZRVXU0RytDRHFYTVhwUCtLVTJpUWRnVUlGWDdSdGR3QnkxTHl0NUNuOHFRTmVYOENEbU9VcDRCWGMrenJhRlFGK2RYV1ZyNnlzREd1bVg3ZU93SG9DSHRoOGtIOFgzaHNNK2s5ODRoTnpILzd3aC9mclRwWWpuMXlwOFhtOW5VQ2ZWZHJ0MnYxWHIzYVBQUC84Q1M5Y3k2cHpmWUpYOFRDOWR5ZW05dXlFVzY5bE0rVEFvM1FvRXJjMGd4WDhJRUkzaU9EN0VYcEJEdlQ3MVRFTXlGTlJKWTVSQnVnbVNtUlNIN3A3Rno3NXpJTjQ2b0Y5S1pncGNacFI0b2s1TzRFVFFPQmVNTWNkQU9LWTQ1dmZmdzMvMTFlZnc3V0ZsVlJiZGQwcDBMUEVLejZyOE9VeFBNOUJvMVpGcmVxaVhxMmdXdkdBbEJlOE5OMmJCeDdmU2dBQUlBQkpSRUZVOHZSY0xNVk53VS9obnB5L1V1bm1mQlBsVHVmTWkwaDZ5dnR0bnl5SWs0RGRWdXpKdFJwT3lUTW0vRm90ZUwzUjhNOHh4cmhLbzFBSDJUYnBGUDRxRHlmZk5JNHFleURuVmJQMnRvYTJqaWVLM3FoMWxZK096UmZDWGtFK3B1bEZDbDRyOXp6QWM4N0ZvSEg0VnF2RkZ4Y1hvMWpPOVYzdno0YWE2WFhZTkpBSHNGYlF2MVBnWGVhRHNua1pZK3hQL3VSUDd0KzllL2NVRk53dHdHZkc2WFhaT0hiR0xsOE9Idmp1ZDA4ZVhxOHgrcnpnT0F3VHN6T1kyak9IK3N3MHlxeVB2K2FWN1ByVXJFTVljZlQ4RUQwL1FpK0lFRWI5T2p2OVFGNlFucGU1TUZ0NXFBUEFqcGx4UFBQazNmalFrL2RnNSt3azFNMkZNVE1ER2JpYmRDVFFnc3JYYjQ0N0FBZ0IvUFB6Si9DZi8rNzd1SEQxWnJwRnBKMUdtYXU2dEZxbWlyNVdxYUJlYzFHdlZWQ3ZWbEJ4SFFodEJWQ05TOHp0R3FMSmVhWG15MU9ZZ3lrdmZnSmVGWjkwR2xTYWFuN0tmQzhFb200SXY5VkYySXVBbEFVQXNBRk9nWS9NTmRVWEo3MVB3TTBybGVCMG85RTc3cnBJamJ2cmJ3dm1wcHlxSnhjeVNybnJLWGJVVkU5QnJ0VjlSc2xUczN3L1U3Mmw2STFhQi9LZDdxaVNId2J3UWdoUjF0R3UxV3J4cGFXbE9BekREVGZQazJ2ODlvWThnRHpRdnd2dld3QjMrdG05ZTNmOTg1Ly8vTVAxZXIycWJrRm1YRjV0TTRBcWVqaU1NVnkvM2hyN2gzOTQ5YTRncU56Yjc5NnVSNmcxYXBqYU00ZUpuYk53NnZXMVZ6Z1VhUHVIbUhQMGdnZzlYNDduQjBHTTJFeS9LVnYzQ0RCUFJSZDFid1NhdFFwKzV0RkQrT0JUOStDQlEzUEVMQTRVd2Ixb25YbGc4QngzSGI3LzBobjhuMTk1Rm1mZXVwRnVQNEU3amFSajdaN25vRmJ4cExOY3JZSmFyWkphNEVZRDFtR1FvRWNDeTdSelhnTFdJdUJEcEowRkpZQkYycFF1aUVsZlg0c3dndC9xeWFWbnVRQ1FEQ2ZBdW1ZMjhOTlFwOGVHdVo3V3ZuRGQ2SHlqMFh2ZDgrSlZDbkM5VFlIUGNwenVpQ3EzQVo5UytCVHdTSU5iSHpPMUJqeUlldGRseUxoN0N2SWEyRHF1Q1BiRVhGOEs4R1M1MnBneFZ1aEpINnRYeUZJei9kTFNVcnlHOThSdlNzQUR1Q01nLys2bi93ZnJVZmJKSjUrYytwM2YrWjJIWGRlbEFGZlB4clNpSi9mSTVBbkRrUC9kMy8xeisvSmw1MmRxdGNsN2l1N3ZlZ1hIWVJqZk5vMnAzVHRSMzFwTzNhOFY0dWxxeXRVVmM0NGdqT0dIRWNJd2x2Q1BvbVJobnI3VjlBTjZ2a0pQbFZOQWV2VGVQZmpnazNmanZRL3RWNHU3YUFVTDVNRTl2WUFOVW5CUHpOb3NsWlpwZ1FDZWUva00vc3ZmL3dESDZic1Arb0M5VW5GUjhUeFVLdzZxVlEvMVNnV3VIbnZYMDl2b01WbmF1bENzMmhPSFFObjJCTGIwZk16MVVIbVMrbldIZ3BRWFFOang0YTkwbFpkODF2eHZ4OEc2anRESElkY3dEL29xWG5oZWVLRmU3NzdtdXRHeWdqVUFDTm5uVG8yNTYyT2tvRTNTVTBBWFFzRGFUK1dCWldiV0FWbncwOVh0Tk94TnVnYTFaY0pQS1hjS2RBcDRuYWFnYnNiaXlmaTdXY2xPQ01GdFQvb2dDR0xPT1M4YWgxOVpXZUdycTZzYnZhcmRMUWM4Z00wSGVRRHZnbjVJUUs5WHVWLys1Vi9lK2NsUGZ2SmVxdUl0cUZQWVcvUHE1ZmZ6eno5LzRTdGYrYTR6Ty92UUw5UnFFNGNLYi9JNmhtcTlocWxkMnpHeGN4WnVvekZDRGV2OU4wRFVkRzdWQW1IRUVZVFN4Qi9GTWNLSUk0cGl4REhQS2RzUDZDckZTdHkvYXdZZmZQSXVQUDNFM1ppWmJKSXg5SHk0NXdGMEZMajdRWVJ2UHZzYS92YWJQOFNGcTR1aytkSjA3Ym1PL0hnT1BNZUI1N21vVmp4NExxbE1BR2ErdVFJMEJKSjU3QlNtVnZ2TlBIbDZUcXE5ampvdkozVStNZzFxZVZvNGVpRWJlajBTa3o0UElnU3JXclh6eEtyaFdBc0REWUE5OUxFekNqK3BROGM3VG5peFZ1dThXcWxFTnkydzU2cDM5WjBaa3hmS2s5NEdPaU9tZXcxOHRhMm4yT1daNzdrUXdxUUphM3crVDkzYlpudGR4b0s4RFgxT2dyQUJUNTNzaWdDdjRGN29hQmNFZ1hpN1RKZkxDNXNTOGdEZUJmMElrRjZQOG4vd0IzOXcxMU5QUGJYUEFuaHFIajJKVDMzckRzQzFhOWRXLy9Jdi8vTDQvTHkzWitmT1J6NWVyWTd0TDdqTjZ4b1lZMmhPaldOaWJodkdacmZBcWEyRE9SOUFMbDVGMzlUK1pRdVQ1VTRZUytEcjcwaDl4NXdqNWh3OHpxOXplcUtPOXo5K0Z6NzAxTjA0dUh1cldjS1ZLdFlVM0ltRG5BMzNZZWE0QThEaWNodGYvZlpMK05wM1hrVzc2eXVBSzZDN0xqelhnZXV5M1BOTjd3cXpJNkdiZ0o0UjFTNkJuZ1c1NlJRd2FwRklqNDB6eURRNWpxL1BNdy91TXErSU9NSzJCRHRkY2paVlowbllxMXN3RVBnQTRMclI1V3ExOVlybmhmTUU2aG13eTJPYW0wSUJiMEJDb1c4RDNvSzNiYTRIckxGMzJqRWdrTmNodGVJZEFYbHM3UmU5bkNZWDhzcURIdHBVbndkNFBRWmZCdkJoR1BJTmNMUzc3U29ld09hRlBJQjNRVjhTek90WUJ4ekhjYjd3aFM4OGN1alFvVmwxQ3h6clBqanFRY055MHZVMmhCQjQ3cm5uenYvRlgvekZ1UzFiN2o4eU4vZlFMMVFxelQzNWQzcjlnK013TktjbU1MNWpxd1IrTmNjN2Y4Z2crdXlWS3lpeVVmMEtGR1lTRXZaY3dIVWNQSGozVHJ6M29ZTjQ4UEJPdUs2R1RBTG9yR3FYRUFOTDh0Z1FCRXZERHVZN0hkNjZzb2h2Zk84WWZ2RGpzNGlpeERFN2RhYVo4N0I3U0NLZFJvcG9RSVBSS1hBSjJQVzhlZ042QmZhTWFpZm5EOTBSVUIwQVFJL0ZzMlNjUDRyaHQzeUVyUzRDWlk3WFF3YjYydWE5dFRHdHpQUE05RHFQemdlU0QrbzQ0ZFZhcmZOanovT3ZxYjhua2RUSE5KaDF2QUUrVmZHbU5wVmY3ZHB6NHMyMnJlcXBpcmZWUGYzT2k5TUJ4Qm1QNU04RnU5cTJ4OS9OdDQ2UG9raFE4enhWN21VQUgwWFIyOTdSemc2Ykd2SUFiTkRmU2ljODNNSzZiMWVieXBUUDVHazJtKzZmLy9tZlA3WnYzNzV0V3NtelJIYVlhWGJxOWpENkRhUVYvOHJLU3Zldi91cXZYdi9tTjc4NXYyZlBVdzl1MzM3a1E3WGF4RjNZd09BNERHTmJKakcrZlN2R1pxZkJLdFhjZkVQOUpmUURWNm02eXBvQ3NvbFQ0M1hjZDJBT1J3N3R3SkdEYzJqVUt3VG9TQUFPR3piSTVPdWZsa0RMRHErZXVvaHZmUGNZanAyNlpOcTRYbUJQYlFrTlFnVlcwdm1RNCtXQ21OL3pWSHNDZkJOdnpoSHA2WDZoVXV4bU5Ub0JXSEJQZkFQUysrYjZsWVM5VEV2bEU0NFRYS2hVMnE5NW5uOWQxaTNIMnBWU0Y2UytGUFQxcFNMN3FXMEthWFc4ekZRNjlVMFh4N0VYdmtsMUJ0Qm5MQjVwRTMybUU5QVA3RnE1NTMzVE5laHQwL3dnd0d0SE93cjQ1ZVhsT0FpQ3R6WGdBZHh4a0w5VDRIbzdqejFzK2R6ODlYcmQvY0lYdnZEbzRjT0hkNmpia0lJNjNWWWhzM0FPMlhjdVhyeTQrT1V2Zi9uMHQ3NzFyZm5aMmZ2Mjc5ejU2QWZIeHJZK2luSWVjK3NXSElkaGZNc1V4cmJQb0RFekJhZG1LL3o4djRmaC8wcktRbnhBQmdHNGpvTUR1MmR3NU5BYzdqODBoMTNicDRpWmVYaTRVek4rWGgxcFpabUVNSXJ4M010bjhZM3Z2b3FMMTI1YUxWOWZzTnVWYWRXdTIwK2hEMUNuTzMwK2FYV1BGT3hWSG9IRUZML2FROUFOaUxKbTFyYTluMndENVdDZnBJRmNmeEc1cm4rNlVtbTk3ampCQ2dXN3JEY0YrbFFhY3NDdWptR0FyUGYxTmpIUkc2QlRzTk04YWxOdlV3ZTZqTG1lYm11VHZiVVBhb3JYTkZmYnh1a09jcnlkVzkreEVFTFlqblpDQ0I0RUFTZkFMdzE0My9kSFdmRG1qZ004Z00wUGVRQzNBL1RZNE9PdDlaakRsdTJYMzZSVnExWG5pMS84NG1QMzNudnZMblViSEhvL1dIWU92U25MQ2h6ekxsNjhlUFBMWC83eXFXOTg0eHMzSmlkM3plemQrNTVuSmlaMnZwY3haKzMyOUNFRFl3ejE4VHFhVzZmUm5KbEdkWElNY053K0pVVGYzZExsK2liTG5lbUpCbzRjbXNOOUIrZHc3NEh0cUZjcmZWVjNBbThyalZGenZJd3NBMzRhVnRzOS9MY2ZITWUzbnp1TzVkVnVIN0RuWFo5eVlBZnk0VTZYTkdTNm5RdzVwdnRrT3FENnRaRnpUK0ljQVlSdEgySGJoOS91SVE0akMrVDVjTmZtZk1ac00zMlNWOGVscCtHbDh5WDd2T3M0bmVPVnl1cHh4dUtBTVNZR0FENWxvaWZ0TXlEWDM0eWx6ZlVFN0FZeU52UXAyRlUwdFFUWWFwZDZ4Z1BXMUxtaWI2M2FkZWluM25VNkJUcjlWdXJkS1BrNGprV2VGLzA3SGZBQTdneklBd2xZTnVpRE8rQTR3NVl0a3orVHgvTTg1NHRmL09JakR6NzRvSGJHUzQzUlU0Q3p0Sm9IU2M5TXYxdFlXRmg5N3JubjN2clNsNzUwWVg1KzFkbS8vNmQvWm5wNi93ZGN0ektGMnhROHowVmplbEpCZjZMRVBQd2gvbmI2d1JEeUhlYUhkbS9Ea1VNN2NOL0JPZXpjTnBtQk5LQ0FwYUJ1bTlRemNDZDVrQVAzUFBEVGNPWEdNcjc1dldONDlrZW40WWR5Y1plK2F0M3M5Z043T2owWDdFbENKbi91ZUR2U1pucmFDUUFEUkJBaGFQa0lWbnNJdWo2RUVDbXpPd1V6ZFp6TE45Tm4wNHBnbndVN0EyUFJFbU90VnoxditUUmppTFZDcCtDbTVua0NmQVB4UGtwZTU5RnA5clM2Rk9RdHNNUGFwekRYeWJhWHZRM3hqS0xYMzFUQkkrMVVKNERzK0R1VWtyZmdUczN5UnIxenNwSmRGRVdpM3hqOE93M3d3QjBFZVdERFFJOU5YUDh3WmN2bUxjcG40aGxqN0kvLytJL3YvOEFIUGtDbjErbnZRak85VGk4QVBoaGpEdWRjbkRwMTZ1cTN2dld0TjcvKzlYK2MzN256cHg3ZnR1M3VaeXFWNW03YzVsQWZhNkE1TTRYRzlBUnFFMDJ3V3M1WS9pRG9GUVRYY2JCajZ6Z083TjZLK3c3TzRlNTkyMUdyZWdEbzI5MEs0TjRIL05tVjV5eTRGNlNaMWd1QjEwNWZ3ajk5LzNXOC9NWjVwSlkreVR0SGtSTTNBT3d5clR6WTdZNERZMmt6dmEzYUVjVUlPejdDZGdDLzFVVVV4aG1JcCtHZUxGNUR3Vy9ETzcwUE1KYlVsYnErdWJBUEx3UExyempPeW5uWGRZVDZVeEVhNnJwdFJMWHI4aG1GVCtGdFRhVkxRVjhmWDV2aldkcVRQcVB5dFVuZDdnQlFrNzFXN25sbWZNczhiem9DZEF4ZWYydW9XeXJlVEpIVDVubnl6WFBHNGJrMnordUZiampuM1BmOXVOdnRpbmNCTDhNZEJYa0F0eEwwdUVYMTNrbGc3NWVHVDMzcVV6dC84emQvODhsYXJWYlR3TllBVjUvTXNyaTBqcncwbXFmYjdRYW5UNSsrZXZUbzBTdlBQWGVpV3Fuc2VYSjhmUHRqdDhPVWJ3ZkdHR3FOR2hwVDQ2aE5qYU0rT1FhM1hoL3d0ano1dDFXdGVOaTFiUXE3dGs5aDkvWnA3TjR4alozYnBvd252QUdEaGpnb09EU1UrNlE1OXBpNjNORUE3d2QrSFM1ZFg4S3pMNTdDOTE4NmpjV2xkdTU1cEhmdDU0WU45bXlaZkxEVHZNVmd0NnMxY0JVQ3dnOFJkbndFSFI5aEowQkVUUEJweFk0KzhRbXdxYms5TWRNbnF0cUdQVkNrN0VVUGFMOEJMSjF3bk42aVZ1M0tjVlZvcUFOU3FST1ltM1JtS1hxV1ZmSVpyM3I2cmJkSnZMMnNyYjZxR3ZTcHBXdHBuTzRzSUZuc3hvRGM2Z2pranNmcmZXS1NOOEMzMWJzQ3VyRGdubkt3MHdwZW0rZnRsZXlpS09LdFZvdS9rd0VQNE02RFBJRDFCajNXc2E3MXFudVljbVh6OXN0WE91M0lrU1BqZi9abmYvYSs3ZHUzejRCQW1paDJleTQ5bURVTno5N09BNzhRUWx5NmRHbngyTEhqODZkUDM5eDUvWHI4d09wcWROdlZQUTNWV2dXMThhWlUrcE5qcUk0MU1EN1J4SzdaS2V6YVBvMWRzMVBZdldNYXMxdkdVMkRXMEdCVWtUTWsyd0JKNzUrbXIyUUNjQTJaL3VBSDVGajdEMzU4RnQ5NzhSVE9YYmhCeml3UDZuYThNRi9yQnZaTVdqYWVSeHhoVjA1dDgxc0J3cTV2RnFWSncxdXI5alNnaTgzMEd0SkZxaDRrVGQrSExPd2w2UHhMd1BMcndNMnpqSWxZdzl3R3V2cnBVOWdMR2tkZ25ZSTdJNm85Qi9nWkV6MVY2N3J0R3RoYXVaT3JiRlM1QnJyS240STUzWWNFZTBiTjI5L0s1SjZLMDFCSGdYb1hRZ2p5N3ZlTWlWNk53WXM4d0xmYmJhUGdsNWVYWS9zY04rcHpPd0VQNE02RVBJRDFBajNXb1k3TkN2WkJlZnFsNTZXWnVHYXo2WDd4aTE5OC9Ja25ucmpidmc4VzlEUHhlanNIN0NEcHRoTWZBOEM2M2FoMjRjTGk5S1ZMeXp1dVgxK3UzTGl4aEd2WGxuRHo1aW8yNm5mTUdEQTIxc0RVMUJpbXBzWXdPVG1HUFh1MjRjQ0JPUnc0TUlldFd5Zmh1QTZZNDVqdkZDVGtHYWtUbzlzV09KQk55eWh5dW0zSzlvZDdGSFA4K01SYitONkxwL0R5aWJmVXE0TExRRjN0Q3p2V1Z0OTZjeEM4QjZoMkxzQ0RDR0UzUU5qekVYUUNhWUlQUXJVK2ZQcWNLYndwcEFmRFBXMit0MVY5SHV6cHZtNERFTGVCMWduTzUxOER1c3NhNUk3ak1EMmVUcFM4T2Jiak9KbXhlTnZ4VHFXWms3WTZBQWI0Rk5ZYTZJeWxUUGZVOUs0dnVqME9yMVY4WnZ5ZE1TWnNjMzBCekhVb05ORXJSUThhcHdHZnA5NzF0bmF3b3g3MG5IUGU2L1hpT0k2Rlhza3VERVBlYXJYNHlzcEszT3YxYk1kQldQdHZXOEFEdUhNaER4Z3liQWE0ajFyZk1PWEs1QjJVcDE5NlVWcGVQQUN3ejN6bU03dCs0emQrNDhtcHFhbEpDbTcxeVlDYTVVL0RnL3AyckgxVzlDMEVYTjhYMDc0dlp1SVlZM0hNY2VQR0VxNWZYOEtORzh2dy9SQnhITXZWNHFJWVlSaWIvVENNRVVVUjJZNFJoaEVxRlErVGswMU1URFF4T1RtR3FTbTVyVUdlUUwycHpPekpBNTZhZE8ySHYxYVJqdU9BdVF3T2M2UjUzVElYbS9LeW9JRTdVN0F1Z252cVdNaFBBNEN6RjI3ZzJSZFA0Ym1YejZMVjZTSVZCa0E5blZMVUlTZ0NPOTNJNlJBSUFSSEZpTFRKdlN0TjdtRXZRTlQzclg1SjBHQk80TzZvNjI2UHJ4ZWI3eW40N1h2YVozb2NGNko3bnZQRlkzRzhjTlp4RWhNOGdYa0s5dmI0dTBwbk9aNzFHYVZPeHV1RkZhZmJacTlUcjhITzZUNEkzRFdFckh6MEJUT1pCWEpndlppR2RnSnN1R3ZsbnRNSlNKbnQ5WGk4bmtxblZyZ3pzQmZXK0R2blhQUjZ2WlFIZlJ6SG5DNVZ1N3k4SFB1K1AyZ2VQQWFrMzlHQUIzQm5ReDR3VkhnWDdMY2U3SG54bUppWThQNzBULy8wb1E5ODRBTVBPWTdqNWtBNU5lMHVKODJBM1Vxek93TXNMeS9ucVBtK21BcERUSEdPZWdxWUJRcE10V2ZnaW1WWmVDZnArY3VYcHNzbTZmbDFNNWFHZlNadUpMZ25xbjF4dVkxbmYzUWF6NzU0RXBldkw4R0VmbEJYWDRWcTNkcnREM1pWVWN3UkJ4RWlQMFFVUklqOVFHNzdFYUlnbE92MXI4TnpTTjhUZVIyVGJTQUxkenErM2wvVjAvSUFZMHh3M3JzVXg4c25vK2o2RzREZjFwRFdVTTc1MkdaNFZrYkIyK1B3R3U3V0Mya0s0UTZrUGU1dDRLdHRPbWRlaU9SbE5abDE2NmxKbm5RUU1zQzNnRzR2akpNQnZCQnluRjJuaFdGb3dHODcyT254ZCsxZ3ArSGVicmU1TnRFUEFmaGJCdnZOQW5nQWR6N2tnVFJBY2o3b2szWXJBVDFxdVRKNUIrWHBsMTZVTmt5OEhZZW5ubnBxNnZPZi8vejc5dTNidDlzR1BkM3VCM2E5blZNZU5NNUsxOGtzamxFTEFqNFpSWmlNWTlUeTRENW8wUkk2Tm12RG5lWlBwNmZMRnNIZFhpMnRxTzVVdWxtN1haWFQrVlU2V0hxT3V4OUVPSHJzSEo1OThSUmVQM05ad2xNQVdhQ1R1Q0dnRGdBaTVrcUJSNGhqRGg1RzRCRkhIRVhnVVl3NGlzR0RDSkVDKzNwQnZFelEwQjRFOTZ6S3o3OFBHbzZjZHkvSDhmSWJRWEQxRFNHNkt5WEFiby9ERzlqVGVlOUVzUnVBMjhEUGczdE9YQXJtUUdLaUIxSHVPazZJWkp4ZStUUlFkVTlWdVNEYlJzbHJZRFBpWVc4RFhXOVQ5UTVBcS9RVThQWFl2SzNlZ3lBUTJqU3ZHSjhhZjQvam1IZTczYmpkYnNkaEdQTFYxVlhlNlhURUdsZXl3eHJLYmlyQUEyOFR5QU81b0llMS95N1kxeGZzZVhINDdkLys3ZjJmL3ZTbkg5KytmZnVzRFd2N0hoV2wyL0RXMzNablFHZklLeHZIcUlXaG1BaERNU0VFcTJiZ21YbVE2L1RoNEo3T3A5UHo2eDRLN2psMTAvWlJLOFB5Y2h0SGo3NkJvMGRQNEFjdnZJRmVMd0NNS3BYREE5QkRCR0JxUDFualhnZ0J3UVhBaGRrV2drUE5mbGI3QWlMbTRERUhseThLd1daOWRHalEwK3ZZYjRwY25xcG5qSUh6M3VVb1dqclI2MTA2SHNldFpXMXlkMTJYT1k0RDEzWDdRWjRCaWZtK3dKTSsweEhvQjNnTllzZHhHSVZ5OHVlU3Y4cGRFZHcxakRTb0FXUVd4OGxUOHVxVFVmQTBQNFc3QXJwWndjNVM4MElyZDF1OTI5N3pVUlFKYlo3WDQrL1V3UzRJQXI2MHRHUjcwQU5yQVBhdzVUY2I0QUc4ZlNDdlF3N3NSLzNnRnBjcGszZFFubjdwUldscmpjL0xCM3Y3dDM3cnQvWi85ck9mZldKdWJtNEh6ZHNQL0FQQW5aZkhub1BQY3ZaWkhJdHFHSXJ4S01JWTU2aW1IL1pwZU5vUCt2V0crK2hEQkFtb09CYzRmdnc4WG5qaEJKNS8vZ1JPbm53cjVZejJia2l1Yjk0NHZiNitPYXBlY042OTVQczMzK2gwTHJ3ZVJjdExydXN5MTNXTkNyZkFic2JUeTN6a3NmSmg3N291UUV6MFpKOUJRWmFhNzNQZ24wcWpjVkJqN0xSRG9OVTZZOFlrRDUxSHB4R0ZuM0sweTFQNHlESEpXd3BlajdXbjBpalFSZUpjaHpMcVBRZ0NNY0RCYmowVitzQ3lteEh3d05zUThzQ2FRSTliWEtaTTNrRjUrcVVYcGExSHZCMDNLQThBc0YvLzlWL2Y5N25QZmU2SjNidDM3Mkk1am5ld3dLenl3TTVITXBrMzNkbDVIUDBFVHlvMXhYUmVJZUJGRVJwUkpCcHhMT29BYy9URG44TFdoanRWZTNsdzc3ZlU2ZUFoZ3VMWGsrclB3c0l5amg1OUE4OC9md0kvL09GSnJLNTI4RzRZSE9nNGZkSlJTcTZ2RUhFckNKWlArLzdDNlZicnJUT2NkM3VlNTJVQXJlTEtBdDA0MmVVcGVwYVk2cWx5endCZWZhZlNkSDdHTXVaNUlBRzVTYlBqaXBTOHlFNlpTMDJ4MDE3MUZPd2E3anEvRFhjTjdydzBrWXl6RzFVZlJSR25RYXQzMjN0ZXEzZTFqSzFZV2xxS2ZkL2ZTSk44cHV4bUJUendOb1U4TUJUb1VUTGZ1MkFmTFE4QXNHZWVlV2JtMTM3dDF4NTQ3TEhIN21zMEdtUHE0ZVFJNmVoRHA5dWw3cDBPZXR2T1kzM0RqaXVJMS90T0hLTWF4NklleDZMT09Tb1UzdjNtUkE5YTdjd0d1UjJYMTVHZ2RjZHhqR1BIM3NUUm8xS3RuejE3R2UrRzBZTHVoS2w3RVVkUiszeXZ0M0M2MWJwNHF0VzZkTlYxSGU1NUhxT0F0dmNWNlB0QlhwdnlvUUF1QUFuc0hQVk9BVzg2QVNxL29OKzZBNkRyQXRMT2RiYTZaem1xWG52STZ3NkJIWmVuM0VHQXBzR3NPd05XdklHMnJqY1A2QXJrVU9Qdk1ZVzdrS1o4RU9WdW5PdW9lZy9EVU5EcGNRWG0rVkVBUG16K1ZObk5ESGpnYlF4NW9DL29VUkMvSG1CZnIzejkwb3ZTMWlQZWpoc2xUOUUrbXMybSs3dS8rN3VIUC9yUmp6NTQ0TUNCQTQ3anVDRGdSUmJjZVJEUG5VZFA0SjBxVTlCcHlLaDlJZUJ3am5vY2l4cm5xQW9oaHdNR3czdnRjSGNjaHF0WGIrTG8wUk40NFlVMzhLTWZuVUszNitQZHNQWVF4LzVpdDN2elZLdDErZVRpNHFrem5Qczl4M0dZNjdyQzh6eEhnMWVyZGRkMTZYNHUwRDNQTTJQeUN1UWExaGtUdmxiazJzUVBKUERYOFFxNGpJSmJnejVuRzBCMi9EMFA4UGEycmVSSmZHbzVXOTBKSUhtNDdnVFkwQzhDTytmY1Z2Tkd1Y2R4bk94WXB2bWlzZmN3REtuM1BDOWhucitsd04vc2NOZmhiUTE1SVBXQUI5NEZlMWxvcndYa1pmWUJnRDM0NElQanYvSXJ2M0w0OGNjZlAzVGd3SUg5MVdxMURtU2huUE1OS3c1SVhweVRTV1BaSVlEVTc4TFJUMVVyWFFpNG5LUEt1ZkNFUUVVSXVEYmM4OHo0eVg3eCtQN0N3akxPbnIyTU0yY3U0ZlJwK2JseVpRSHZoclVHd1lPZ2M3blhXM3B6ZGZYcVR4WVh6NTFydGE0dEkxSERyRnF0R3VWZHFWUU01Q3VWU2thWlZ5cVZQUFhPWE5jMVkvUTIyRzMxVHZNQ1dkZ0RTS2w3blljQ1gyMHpaazJOczB6M3VZNTR4QlJ2OGloRkRzWlMwK2MwREZMN0pOM0FuWUtkcGhGdXArQ3V4OW1KZWhkYXRmdSt6em1aSjY5Tjg3WjZKOTd6M1BLZUI5WVo0SVB5M3ltQUI5NEJrTmVCZ21QQUIrdVliMUNlVWRQWEk3NU0zSHJ1RjZVQmtPK3YvOXpuUHJmN1F4LzYwT0VqUjQ0YzNyWnQyM2FXdjJvZTlMYmRBVUFDL0lHZEFndjh1V1dzVGdRRDRIQU9ENERIT1Z3QXJrNm1jS2RtZmlFRUxsMmF4NWt6bHczVXo1eTVoT1ZsZTMzNGQ4TW9RWWk0NS91cjV6dWR4VGRYVmk2L09UOS82bndZZHFnSlJOamZqREZVS2hYbXVpNFUyQmxSOWhyaWREdyt0VTlNK0NuSVUyVVBCZTZpT0xWdFFLNHRBYm9qd0N4bFQwRmVaS0xYMzBWcEZOd1UvaHJhZHA0Y00zMXE3RjNuVllxZDYvb0kyQk5KVCtDdXg5bjFvallhN2hycTJqeHZqNzJYVk84WWtMNW00TjlKZ0FmZVFaQUgrb0llQmZIdmduMzlZRDdVOXQ2OWUrc2YvT0FIWng5ODhNSFpnd2NQenU3Y3VYTjJkbloyKy9qNCtCUlY0ZFoybnBvMzIzM0FiNkNmQTNiZEtjanRBQWdCVndnNEFITjlQMkJ2dm5tVm5UbHoyVGwzN2pMT25MbU1OOSs4QXQ4UDhXNVllK0E4Nm9SaDU2cnZ0eTUzdXpldkxDOWZPTCs0ZU82eUVKdytpQUZrd0o0WEoxelhaWjduUWF0MURYSWI2am54dVpCWEFFNk56UlAxTHFoWjM0NVgyd0FTZGErM05haHQyTk42S05EdGZRMWswaEUxa0ZicG9sK2M2Z0FZZUt0T0FUam5LUlZQd0s3TEdNR3VsYnllRXFmaEhrV1JVR2I1akdrK0NBS2h4OTV6MUhzWlVBOUtIeXJmblFaM0hkNVJrQWZTVU1DN1lGOHZzSmNGK0xEUXo4VHQzYnUzOXZUVFQ4OCsvUEREMnc4ZlByeDkxNjVkTzJabloyY25KaWFta1QrbExnL2FmY0Z1Z3h3QWVyMWV0OVBwdE52dGRudDFkYlc5dkx6Y1hscGFhaThzTExTdlhyM2FPbnIwNlBWdmYvdmI4M0VjWTNKeTk5Ykp5ZDA3bTgydHUrcjF5VjNWNnZndXo2dk5Bc1o2OEc3b0U2VFk2MTd6L2RhVlhtLzVTcWN6ZjNsNStlSVZhbmJYV1hPMmg0WjlwVkxScG5vRGQzdWZtdW50ZUd1YjJlQW00L0pVeWV0NEEzQWdIK3E2WTZEQlRjMzJRQnJvV3BuYmFUYThpOVE3aFQxVjlKeHo0VGlPbVFLbjB6WFlhWWVBZ04yb2ZCS0VCWGF1VGZONjFUcHFtbGN2bkRGVC9QcDgxcHJlTjkrZENuamdIUWg1SGZxbytvMEEreWhwdzhTUEdyZVcvYkpwbzI3YjM2bTRuVHQzMXQ3M3Z2ZHRuWm1acVRVYWpVcWowZkRxOVhxbFhxOTc5WHE5VXF2VnZHcTFXcW5WYWw2dFZxdFVLcFZLdFZyMUtqSjRjUnlMbFpXVjlzMmJOOXMzYnR4b1g3bHlwZjNXVzIrMXo1MDcxenA1OG1SWExaR3BqNW5YcHI1eG5sZnpwcWYzejAxTXpPMnExU1pucTlYbWpPYzF0bnBlYmNaMXExTldtWGRBRUR5T3c2VW82aTJHWVhjeENOcUx2ZDdTOVpXVks1ZVhseTljNXp5aUQzYU1zRDFVSEdOTWVKNlhncjJ0OEFuTW1ldTZncWo2VkpvQ2Nhb3p3SWhabmlwK0lBRjduc21lbXVacHZHNjNMbXNwZkpPUG10b0o4R0VCM296UGM4NjVocmtHdWU0UUVCVnZ5bENxMHpnYjdsRVVhYy82Rk56RE1CVGRiamVtY0M5aG1rZEIvQzBCL3AwTWVPQWRESGtnQTNxUTdYZkJ2bmJRajVJUEpkTEw1cjhWMzJYVGh0cDIzYW83TVRFMzAyeHUyMXF2VDgzVWF1TmJLNVd4bVVxbHZ0VjFxOU9PNDQweDVsUndCd1VoZU1CNTFJb2lmeW1LdW90QjBGbncvZFhGWG05cG9kMmVYMnkxcmkwcGtOc1BvQ0o0OTBzYldjWGJhUlQyZW1VN1BYNVBZSjZDdkZiM2tJQk9tZkl0RXo0RFlLY0JCT3hVNVd0Z1UzV3Y4MUtvMHpSYjBkdjV1RnExVHFkVHM3bzI1eE9ZYStDbjRsUWVPZzR2OGxRN0FHZ3ZlZ3AzK1lLb2lOdHc5MzBmdnUvemRyc2RSMUZVRnNyOTB0YVVmcWZEWFlkM05PUjFXS09xNzVjK1N0b3c4YVBHRFp0blBkSkczZTRYTjBxZVViN0xwcFZKSHliTjdGY3FqV3Fqc1dXc1dwMFlxMWJIeGl1VnhsaWwwaGp6dk5xWTY5YkdYTGM2NXJxVk1jYWNLbU9PeHhoejFiY0h5Ry9HSEE5Z0htUE1SVFlJSVVTdFA2OURBQUFNUWtsRVFWUU04RWdJRVFraFlpRjRCSWhJQ0s0K0loSWlEdUk0Yk1keDBJNGl2eDFGZmpzTXUrMG82clI5djlYeS9kVjJyN2ZjaWFJZWRVVEllOGdNaWhzVzhIUjdWTmluVkxBeTR4dWxiaXQ2Rldlci9Wem8yeERYWS9sMm5HMk8xOXRGWnZxOE1YbXliZWErMjJuVVBLL0gxZ0ZrUE8zcHVMdnFJTUNDdTFidXBoT1FwOW8xMkpWekhhZmo3a0VRaUJ5NDYvc3hETFQ3cFpWVjhPb3l2SDNBK1ArM2QzYmJpZXN3RkZhbWdiNy95dzZkQXMxY05Fb2QxNWIxNXlTQTlscG5XZG9Tek15NThCYzVBUUx5czRSVFBWWFgxQ1MrMXRQMGdLSW03ZFBVS2M5ejVkWWtkV2xONmpYcnd6QU1iMi9udHo5L1RtOEFBUGY3NSsxKy8rVDlydXRhcmMyalZxY0Ezc3Exc1FiMjB6QU1NSTRqbk0vbklabmNVK2pqVkwvQUhtYTRwNStGeHg3NG1lVHhoMmxXWUc5Tjhta1BRUDI3NnZQait4emk2T0VrbjliU2FUM04weWZvOFQ3NlBPa3Y5OW9SOWhUYzhldG9FZTd6UitRMFlLLzVhdUEvRTl4UkFmbE14RlFQRmYvSVlKZUN2QWZvSmJHSFoxbTFQZGFZazljOFRrM1RWeEozcytEQ3ZlUnhBVityZFlFOUFBQStpWTlIK1NubzRSdnNrUHczWklESEdMS3BmaUltK1JYZzA2ZnVVNURYanUvektYMzRlU2h2bWRDekIvQWdCWG9HZUh6d2JublFEaCt1d3p5LzEzNi8zNytHWVpoS2NQLzQrUGo2Ky9mdi9YYTc0Yi9KQ3ZhYXp3YitNd0llSUNCZlZBSjZnQUE3dCtZUmUzaWFWZHZqR1pkeWljZXA5UlMxa1hoTTlOTHB2aHZzY1dJL244OS94bkZFdUsrZXZBZUFGUGdMdkpQYUN0REpKTDljTUFBQVR1NHB3Tk52eUZ2Z2pYODNhcUxIZStmNFBsbStBbm8rd2FjNTNtY2ZobUgxcFB3d0RJQndMeDNKNDBmaHJ0ZHI3V241a3RjZCtNOEtkMVJBbmxCaHFvY3NmMWF3YndGNlRiMjJIZ1h1V3BoTDg1WXY3ZEdxdFhsc01kRkxZbGZZQThBMGp1TndQcCtYaC9NQVlQa3htM0VjRjVCWEp2alZFWDE2QVVCTThyOGV0aHZIc2VqUGsvazB4NzhtL0NSZWFzbHgrMVJaOFNkakFUL25qdjcxZXAydTErc3l2U1BjTDVmTC9lUGo0MnUrMzQ3Ly8xcFFMbm11d0g5MnVLTUM4Z3dwanZBbFByZVg4MXBwVCt2MXRWN3ZXT3BwZXFqVnkrUEdtcnptY1dxV1hwUmtvN0RBdmVSNUFENk50UmNBMVhXWXY5WHVkRG9ONS9NWnhuRWNBSDYrY0dlT0liMFFBRmdmMmVON1FBSnVmSS8wZ2J0eEhDR0RlWEZ5eC83VVQ0R2VIK2ZqOGZyOWZzY3BmNW5XMC94NnZVSlMrL3I4L0p3UTdEUGNBZSsxejAvY1crRmU4a3orcXdBZUlDRFBGdU1JWCtKYmVqVTlWTzVSYThXYU91WFZWZ3ZVdWZDMndOMEw3RjZ3OXhTMWtYQ2gzd0srRlA0YThKdGdqK3ZiMjl0d09wM2cvZjBkSDhoTEovZjBBbUFGYjREMTlKN0NQbzJ6Qi9FR0F1cGZwUnFDUElVNGdoemdCL2pYNnhVeXdDOUF2OTIrdjhzQXAvYjVJM0V3LzRLY0I4aTVIdHQvSmJpakF2SkNaVk05SlBFamdiMFh6SHNBWFFKNWoxWGljWHdxNXVRMWovS2xQUnB4Tmc3TFJDL0plMHowTHJBSCtQN3EybkVjWVJ6SDRmMzlIYi91ZHNKcHZ6UzFwK0RPdi9DbTlyRTUvUFBTQit3Z3V5QkFpSmNBajlER28za0UrdXl2QUQ4TXczUzVYS2JMNWJMOHdFenliNjZCTjg4M0EvNHJ3aDBWa0ZlS2ViKys1RDB5MkxVUWZ3VElhN3hhdlpWcndVNEJXd3B6U2I5MGs1REF2ZVJyQVUvVk9QQXVlVmJvLy9MU3o5alBSL3R3T3AwRzdNRjcrUURyKysyMWlSMzlFdGdSNnVnbC92SStjODhFQUhDNzNaYUpIVitEay9yOWZwLysvZnUzUEQwL2c1TUw5RmJlRGZpdkRIaUFnTHhabGZ2MTRPajF6TGsxYmF5cDE5WWp3YjBGL0R6bTVOd2V5dWZXZTRqYVNDVFFid0UrOTdTeEZmYXRYdEdGd1B3RE9NdFQrc2xQM0M0VFB3RGdOL0l0ZjI0MnlhKzh2STZUZXVyamxJN3hORTM0SzNDQUQ5TWw5OVZMUUUxakxjeTFQZVJyWHgzdXFJQzhnMmJRQTJ3SGRndThOZENXZ0ZzRDlDMGhMNjIxUEc2c3liVyt0azhpenNZaGdYdXRSdVcxT00yM2dyMWxyZGJ3NDI3SnQrcmhkK0F2SDZsTEg4UkREK0RudnZvMFRUQWxtcis0NW11YUp2ajYvalc0VmEzeTkvSUFmQ3ZYOWdUY0NRWGtIV1dFdmFhSHlqMXFrbGhUcHp4TkQ3VjYxS3l4SnE5NW5CcEgxT3V0bTRNRThoeVBBM1ZPZkRUWVMyc3RUMUwzZ2pwVjJ3VDRBZmV5QXZJZEpJQzlwa2VTYzJ2ZXNZZlhXalhBOW9DN0J1WmVZRzhCM1FwOEQxRWJDaGY2TGVCYkFKL0dXckJUdFMwZ1g2cDVnWjBUOXdaOG5wTTlBWGRhQWZtT01zRGVrbnZVV3JHbUx2VjZydHlhcEo3SGtsb3ByM21VTCszeEVHY0Q0Y0s5NUVseWozZ1AySHZXZWx3RWFQdWt2YUwzQzdqekZKRGZRQlhZOTh5NU5ZOVlVNit0UjRHN0ZPZ2E2SmR5aWNlcFdYcHJrbXdZRXJpWGZDM2dxUm9GNmxKZEFuUk9EeGZnbkI0SnVGdDFiL2hiTGdiSUM0Q0F1MHdCK1kzRitPZ2RsV3Q3TlgzZzFFdDVtaDdOS3ExeFlncllFdEJ6ZXlpZlc5OUMxSVlpZ2I0WDhQZUF2ZWRxZ1h6SmsvYjJoajg3RDdqckZKRGZTWTB2MWFGeWo1bzIxdFFwVDlQRFdiVTkybm9lZStRMWovS2xQUjdpYkNBV3VKYzhMOERYNGlQQjNodnlKYzhhZHdWK3dOMm1nUHpPSXI0dWw4cTVOZWxySk8vajRkWFdIbERud2xzS2RFL1FTenhPemFNZkpkMG9xSDRMOURXQVQvTkhnNzFIclRma2E3RWE4QUYyUHdYa0R5TEZmZnRhcklGK0srN2xjVmNOelBlQ2V5L1FVejYzM2x1dHpjUUM5NUxIZ1RvbjlvQjlMK2g3MW5xRFg5dTM1QUYzZndYa0R5amlLRCtOZThCY0Ftb3B5QzJRMTZ6U21yWXVyWlZ5aWNlcFNYb3M0bTRlRXJpWGZFdXVqZmVHZlk4TGdCNWc1OFROV3NDOW53THlCMWJsS0w4V0h3SG9rcW44aUhEbkFIMXIwRk4rcStiMUdzMG1RYjFHQXYwOUFKL0dWdGhMZTcwdUJLeVFiOVcxVUYvaUFQczJDc2cvaUpqVHZYZnM0V2w2Tkt1MDF2STBzYVFtOVNpZlcrK3QxbVlpZ1h2SjF3S2VxbEV3YnRVdDBQZFl2U0ZmOGp6am1OcDNVRUQrd2NTNGR5K0pOWFdwVjF0N1FuMXJ1RXRBMytybitLMmFwazhqN3VZaG5lcXRFNzBVOExYNDZMRDNxR2toeitsZDhnRDdmZ3JJUDdDRXgvbXR1SmRYVzN0QTNRTDMzbE83ZHFxbi9GYXRwZFpyTFp1RFpxcjNBTDRYNE5QNHFMRHZOZVc3VGZjQjkvMFZrSDhDRmFaN3lOYmVVejJudHNYcTVXbGlUUzd4S0YvYTAwc2FzRk8xMXZTZWV6MEFuOFphMkh0RHY4Y0ZRSUQ5U1JXUWZ6SVJ3UGNDZW84cDNSUHFXOFA5NkJOOEwraExOZzRyM0V1ZUpMZkF2d2ZzcmREZkcvSy92QUQ3Y1JXUWYySVpnQy8xTkQyV1ZWcHJlWnc2NTdYY1hPSlJQcmUraDdSVHZUZmc4M3lyS2I3a2FhSHZmU0hnNGdYWUgwTUIrUmVSOEVoZjZtbDZOS3RIVFZLbllrbE4wcVB4cFQwOXhObElqalRSSHhuMkhxdEg3VmM5d1A1NENzaS9vRExnNCtvSmVVMXZhYlgydFBxc2Nhdlc2cWM4eW0vVkxMMGNTVGNOS2R4cmZnL0ExMnJlc044YSttNjFBUHRqS3lELzRoSUFuMVBUdmtiNmZxM1h0RHpQMkNQWCt0ejYxckpNOVQwbWVxL3BubHMvQXV4TnRRRDc4eWdnSDFxcDhMRzgydHJyU0g0cnVIdFA3UnF3ZThOZTJ1Y3BDOWhyTlEvZ2V3RStqVDFoN3cxOWRVK0EvVGtWa0E5VlZabnljWDBWdUh1Q1h1SlJmcXZtMFYrVGRNTm85VnNtZWt2dUhYdFA3NUplTHR4WHZRSDExMUJBUHNRVzQrRTl6MVhiMC9Lc3NhUld5aVVlcDhhcGI2MmpIZGZudVFYK1c4UGVkUTJ3djU0QzhpRzFCRWY3bk5YYTIvS2t2VjQxRDQ5VDAvUjVpYnVKU0kvcmEvNWVnRS9qaDRCOVFEMFVrQSs1cUhHMFQ2M1ducFlucWVleHBkYnFwenhyalpMbEFrQ3pXZlE4cmk5NVJ6MnlMM251MEErb2gzSUY1RU5kbEVBZm9NOTByL0dzc1VjdThUZzFTYzlXOGo2dUwvbFc0RXVuKzBQQ1BxQWVhaWtnSDlwTWdtbGZXbXQ1bnJGSFh2TW92MVd6OUZvazJVQjZIZGVYdkdjNnNsL2lnSHBJcW9COGFEY1ZvSi9HM25EdmVWVFB5U1VlcDhhcGU3M09za2w0SHRlWGZNOTh6eVA3WDE0QVBlU2hnSHpvVUdLQ1grTnBZa210bEZzOVRrM1NzNFc0RzRvVjdpVnZiOENuc2NnTG9JZDZLU0FmT3J3YTkvZGJualdXMUVxNXhLTjhibDNicTlVakh0Zm51UVgrNG5vQVBiU2xBdktoaDFWajZxL0ZYSUJiUUcvMU9EVk9uYVBhZTNodERMMlA2MHZlSHZmbjAzanhBdWlodlJXUUR6MlZLbE0vTjViVU5Ibk5vL3hXVGRQWFU1d041U2dUdlJ2Z0ErYWhveW9nSDNvWk1TOEFKRFZPTHZFb24xdTM5a3NrM1R5ODRGN3lwY0RYQUQ1Z0hubzRCZVJESVNBdkFEenlta2Y1clJxbnZyY3NVNzNuY1gzdVZmc0Q0cUZuVTBBK0ZHSW91d2dBMkhhQ2Y1VGpldXVUOVZSTk85SEhKQjU2YVFYa1F5RkhNUzRHdEQ2Mzd2V2FsanlQNmx0MTF2MzRBSGdvOUZzQitWQm9SeFV1Q2xabHpsdDQvVjA2eVBRUVhrQTdGTElySUI4S1BaRWFGdzFkRlZBT2hZNm4vN1NlOWdDU0J3TGVBQUFBQUVsRlRrU3VRbUNDVUVzQkFoUUFDZ0FBQUFnQWJGNXNScFdPSTY2U0FRQUF6d01BQUJzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUc1dmNtMWhkR2wyWlMxMGVYQmxjeTF1WlhSM2IzSnJMbmx0YkZCTEFRSVVBQW9BQUFBQUFHeGViRVlBQUFBQUFBQUFBQUFBQUFBSEFBQUFBQUFBQUFBQUVBQUFBTXNCQUFCcGJXRm5aWE12VUVzQkFoUUFDZ0FBQUFBQWJGNXNSZ1NsZTNIYmJ3SUEyMjhDQUJJQUFBQUFBQUFBQUFBQUFBQUE4QUVBQUdsdFlXZGxjeTl1WlhSM2IzSnJMbkJ1WjFCTEJRWUFBQUFBQXdBREFMNEFBQUQ3Y1FJQUFBQT0ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL2NvbW1hbmQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTViMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay9jb21tYW5kCkBAIC0wLDAgKzEsMTUgQEAKK2hlYWRlcnM9YHBhc3RlIC1zIC1kIiAiIGhlYWRlcnNgCisKK2NvbW1hbmQ9ImN1cmwgIC1YUE9TVCBcImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzEvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlc1wiIC1kIFwiQGJvZHkudHh0XCIgJHtoZWFkZXJzfSAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiICAiCisKK2VjaG8gJGNvbW1hbmQgPiB0b0V4ZWMKK2NobW9kICt4IHRvRXhlYworLi90b0V4ZWMKKworCisjJGNvbW1hbmQKKworI2N1cmwgIC1YUE9TVCAiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiICAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuIgorCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTBfTm9ybWF0aXZlVHlwZUNJLW5ldHdvcmsvY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTBfTm9ybWF0aXZlVHlwZUNJLW5ldHdvcmsvY29tbWFuZFRyaWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTZhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay9jb21tYW5kVHJpYWwKQEAgLTAsMCArMSwxMiBAQAorY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiIKK2NvbW1hbmQ9IiRjb21tYW5kIGBwYXN0ZSAtcyAtZFwiIFwiIGhlYWRlcnNgIgorY29tbWFuZD0iJGNvbW1hbmQgLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiIgCisKK2VjaG8gJGNvbW1hbmQgPiAxLmxvZworCiskY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay9jb250ZW50TUQ1LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL2NvbnRlbnRNRDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZGZjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay9jb250ZW50TUQ1LnR4dApAQCAtMCwwICsxIEBACitZbVUyWWpCbE56VmxZV1pqWWpRM056ZzNNalF4WVdSa05tVTFNakk0T1RNPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL2hlYWRlcnMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay9oZWFkZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMWRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay9oZWFkZXJzCkBAIC0wLDAgKzEsOCBAQAorLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgCistLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAKKy0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX1dTVFlQRTogSFRUUF9DU1BfV1NUWVBFIgorLS1oZWFkZXIgIlVTRVJfSUQ6IFVTRVJfSUQiCistLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTBfTm9ybWF0aXZlVHlwZUNJLW5ldHdvcmsvcmVzdWx0cyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL3Jlc3VsdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL3Jlc3VsdHMKQEAgLTAsMCArMSBAQAorLio6MjA0Oi4qOi4qCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay90b0V4ZWMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMF9Ob3JtYXRpdmVUeXBlQ0ktbmV0d29yay90b0V4ZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlMjZmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEwX05vcm1hdGl2ZVR5cGVDSS1uZXR3b3JrL3RvRXhlYwpAQCAtMCwwICsxIEBACitjdXJsIC1YUE9TVCAiaHR0cDovLzE3Mi4yMC40My4xMjE6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkhUVFBfQ1NQX1dTVFlQRTogSFRUUF9DU1BfV1NUWVBFIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXG4iCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvYm9keS50eHQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkZjMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS9ib2R5LnR4dApAQCAtMCwwICsxIEBACit7InBheWxvYWROYW1lIjoiYXBhY2hlLXR5cGUuemlwIiwiaXNFbmNvZGVkIjp0cnVlLCJpc0NvbXByZXNzZWQiOnRydWUsImFydGlmYWN0TGlzdCI6W3siYXJ0aWZhY3ROYW1lIjoiYXBhY2hlLnBuZyIsImFydGlmYWN0VHlwZSI6IklDT04iLCJhcnRpZmFjdERlc2NyaXB0aW9uIjoiIiwiYXJ0aWZhY3RQYXRoIjoiaW1hZ2VzL2FwYWNoZS5wbmcifSx7ImFydGlmYWN0TmFtZSI6Imluc3RhbGxfYXBhY2hlLnNoIiwiYXJ0aWZhY3RUeXBlIjoiU0hFTExfU0NSSVBUIiwiYXJ0aWZhY3REZXNjcmlwdGlvbiI6IiIsImFydGlmYWN0UGF0aCI6InNjcmlwdHMvaW5zdGFsbF9hcGFjaGUuc2gifSx7ImFydGlmYWN0TmFtZSI6InN0YXJ0X2FwYWNoZS5zaCIsImFydGlmYWN0VHlwZSI6IlNIRUxMX1NDUklQVCIsImFydGlmYWN0RGVzY3JpcHRpb24iOiIiLCJhcnRpZmFjdFBhdGgiOiJzY3JpcHRzL3N0YXJ0X2FwYWNoZS5zaCJ9XSwicGF5bG9hZERhdGEiOiJVRXNEQkFvQUFBQUlBQWVMYjBiRFF6S0xWZ0lBQUs4RkFBQVBBQUFBWVhCaFkyaGxMWFI1Y0dVdWVXMXNoVlRQcjlvd0RMNzNyN0E0andMYkRsTVBreERiMHc3VEF6MlFkcGllb3RBYUdxbE51c1NBMExUL2ZVNGErZ094dDNLZ3RmMTl0ajg3SWVOeUtRbzhLSzFJR2UzRUdhM2psd3dvdUp5cW13ckZWZGFWV0lnNS95N0YvRU5Tb011dGFpaEU3dGJiMVJMYVNHaXNPU2ordnlncVlkbkl2TVEwSVdTZkpCUmExcGlCRE9ZcFhSdnNYVjNpOStrOG5VKzN6OHZOOXR0NjF3ZklFNVhHWnZBa0hhMk0xcGhUa25CU1k4bGxDY0FVSnFIbXFUYTJscVRPYlFZM3RjWlF0dkNzcVMrK281NjhCYnJnZm91V2kzcU1UTFFwVUlSUW4xdFdDblhxYlM1dG0vWldnQUl0VXhiaVlFMGRKWTFSUDI3OE1XNmc1K2RnQXRpVkdMVnRLZUdaa2JEam5HQ3hzZWhRa3dPcG81NlFHeFpEc3pIaXFaUUVPZnYzQ0xYVThvZ0ZSeGRnVDJ5NmdvemtLNGFkYU1DZUJuek9ySHRWOFZxMExmcW5OSTV1Nzh6UHNWbHNmUmdkRmVBWmtWUTZkdWdmM28wRzdaRFFQMmRtS01SQVQvaDVyOVN5YVNxVlN5OFB2QVlveVdOSG9uS3Yya3pWM0tHYnRXS2tqVDRtajNQZUZ1MnVqMmp1ckh3bzVLa2l2NDhmT3lObmNtUzVLeHExTUFYOGRaTFZNTmF2NVgwS2h1RnhvTWRvNmhzR3dNRllIaHZlQnU3NkRSbVY5R24rLzRxT0Z2blVXR0dzaU1VdG9yOHcrYW5tTlJIaFlBeEFiWlZNcDZKNGQya25zN08wczh2bE1nbGUzNDQ5eUx5WGRrdThYOUlXUFdrZXFoZ21VWnEzYlZRcndHYjlzc3ZnTnh5UlJCellsZGRnKy9YNzA3dWc1Q3Y4R1FHK3JGZmlaYjMrTjJqVTR4Z2Q3aW52azYzdzdRemNUTEdRc3FwRVhDQlhkaGkyOHpDN3dQQTVDRXU2NWIvZTN3aHZIWXViQkkvdWlCR3VQMGgvQVZCTEF3UUtBQUFBQUFBSGkyOUdBQUFBQUFBQUFBQUFBQUFBQndBQUFHbHRZV2RsY3k5UVN3TUVDZ0FBQUFBQUI0dHZSbDU4OGgwV0tRQUFGaWtBQUJFQUFBQnBiV0ZuWlhNdllYQmhZMmhsTG5CdVo0bFFUa2NOQ2hvS0FBQUFEVWxJUkZJQUFBQ05BQUFBalFnR0FBQUFpbDc1cFFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTG1BQUFDNWdCckpvNWd3QUFBQWQwU1UxRkI5NExGQTBUQlZVV0FHZ0FBQ0FBU1VSQlZIamE3ZHg1ZktSSGVTZnczMVAxdm0vZmQ3ZWtidDFuYTI3UGFHNWZZenkrc1kzQjJNWkFiQXdCc21ITnNsbEN6ajJ6eTVKZFF2SmhOOW5zUlJaakFnRU14c2JHTnZobVpuek5hWTlISTJsR3QxcXRidlhkL1o1Vis0YzByQTBKWVZuSU91VDkvcVhQcTFhcnF0N25yYnRld09WeXVWd3VsOHZsY3JsY0xwZkw1WEs1WEM2WHkrVnl1Vnd1bDh2bGNybGNMcGZMNVhLNVhDNlh5K1Z5dVZ3dWw4dmxjcmxjTHBmTDVYSzVYQzZYeStWeXVWd3VsOHZsY3JsY0xwZkw1WEs1WEM2WHkrVnl1Vnd1bDh2bGNybGNQNTFMcjd6eWQ3TFpiT2puL2IzTUxkcGZYaHMyYkcxZGRlUE4vd1FBaG9ZMmJ2bzVmQ1VCOExsQjgwdG1jSEN3ZS85bGI3dTZyNi9QdTFMTWV6cDdCNjhFZ0lNM3Z2MlRkOXgxendkL3hxL1ZBUHdXZ0hNQWRpbHVNYi8xdlEySnppelkxZWRodjVJQlQreUM3NTNUc0YvOWN5eDlkUmlCc1drMFhsZ0I2Z0F3TlRVMXQvZkFsZjhyMDl2OWI0YjZCK29Tc2djQVlxbjJEWjVnS0FMZ2YveGYvT3NZZ0g4SjRCb0FTUUNmQVBDc0d6UnZRZStPcDY3ZFFwNnRjN3E1SkJwaTlVTkkvTmttQkxwbnlhcC9DNlhpYldqdnJURklSNm9mKzFYZXZmbWtiTTUvUnhiKzhWODRjOThDZ0dBd1VoN3E2Ym5ZTVl3VFFpS3krL0lyTCszcUg5cngydkZYbG43S0pQUUIrSGNBOXEzL1BBbmdud0c0YjN4OFhIR0Q1cTFCKzZBV3YzbVQ3ZStiWU1hbEh6Q1RWMTdVMFB5V0pEeUorc0laY2p4OVRFV0VQTUZiS1JENGdpd3Mza3dkbVd1UTduMUUxcGYyOHZhdXZWTDdvOGVkdWNlZm5ad00vdUdmL0ZsWC84Z203WVZudnJleDJ4OXdMdHE1OTU5TDRrcklwMXAvU3pyMkFmaDlBRHNBdEFNd0FEeXJhZHBkcDA2ZE9nRGdkUUNmZElQbTc5amRtenAySFlqRWY3TkRLSnRGUTlqNXNqRjNJbDhkK24walBheUN3UkdFRnhxTi9EZGt2WDR0UmR2MlVxeHpqam5OYjZqTnloVk9QR0tDMDdDYVNUMHREWDJqaUlSeWlyV3c2bmpUN1JUb0gxTkgzalUwTkhUZjczLzZQdzZlT3pzdVBjRklZR1ptMmhyZXV2UGc1T3VuOUFDYzBiK2hjL3N1QVBjQzJBSWd1bjU5V3RPMHJ4NC9mcnpPT2Y4V2dGNEFmNUROWmg5MmcrWVh6L092MnJ2LzJSWjRyL0swRUZrNlp5cEdzQlc5UE5iV3hTc09VRlUzdjlQdzRTOVJQSnRpd2RnZUZrbU5VcXh0WEhGYXp6dTZ1VmtHdFFDOC9rRVB3NU5NeXMwTkwza0ZVeGM3YkxVajUwRXkyamw2dGtJeUtId1VjNUpqd05uN0xGdWlXc21UTFFUYWVvZlVZbUZGNXVkbnRidHZ2MlgxMzc2NWMvc3hBSGNDMkFqQXQzNjlwYXJxSy9mZmYvL010bTNiYmdFd0RHQU93S2V6MmV4bkFjQU5tbCtBcTVMSnpGWE0vNkYrUjl0aDZFNWlwV2hGUjIwKzBnZXZKaENFMVFLK1VsaVozaUMxOUdiNFBJQ0NkMVA3eU10K1dYNG9RUFg5Slc4dzRURGZreDErZE9VWVRPSUl0aGowbEtURmxnckFnNDZDeE5PaHFod3FKZW1semhvTkxRWmdlaUs5c0FEZE1wVkdvd0hUY1JDMUphWk9IYTMrd1cvL1JvUnovdXg2VGZLN0FLNERNQXFBWDBpM3FxclRkOTExVi9tVG4veGtMNEJMQURnQVhnYndvV3cyZS9MQzU5eWcrZm5nNzlqWWNmV1dXRENienpjeVk0dWUyKzl1Um5xRUpBZ1FCSUNuVUorZkpUMjZnOEpCbXdnSHFiM3ZXQWoyODYybXM5WHljcHNZQmcwZU5VSWVQSjhrTVZ6MHNNRUM4RWlraGgyMUFBd282QzR5SE9vME1iam9neWtWdENKRWhXWUEwSUE4QmFCMHBBY3dDWmd0UXpRYkRkaEM0dXl4dythbmYrODNJd3NMQ3l2MzNudnZWUUR1QUREMHBzUnpYdCt4WTBmemovLzRqMFBKWkxKdi9mSVNnQWNCZkR5YnpacHYvTHdiTlA4UG5kZGJRc21ySTR5TnlSaTc0ek5iaGtkakxRYW9EczVwOWZwL25sdWR2TFVXSC9RUko0Y1lkbENpNjNBWTVwbUdJOXVGaHl6aTZHNHc1V1RDai9IVkJwTFNBeE1jeVZXT003MHFtNnVvVUlRSHRZU0dZbDJGUVFwMGNDaWtJVWMrV0tSQ0x4RW15SWFsZTJVTFFYTDhpQUZBcVpDVHVjV2NWRFNOTGgvYnpPKzU1eDVNVEV6RUM0VkM2bzBaOEhxOTFZMGJONHJmK0kzZjBIYnUzTm0yZnRrRzhBcUFlN1BaN0l0L1hjYmRvUG5wS2ZmczczdmZqdmJneHBXQ0hxKzkycmo4RHhwdFE5d0VqQXJ3L1puRnVhV29ZMzNJbHh3WXJGTHcxK3V4b2Z0U3FHK3BzVURjMGNnaWhteWRhWTkwRWc0c0tyREFZSUtqdmNUeFpBZkQxVGtPQXh3NmNmVE5jVHpmYmFObndROVJWdkdhMTBERTlFT0hBbG9DVHNkS2lKUUhZQmhSckVRbW9SWFRzSGtaN1Q2L0NnRDF5cW96UGZFNkZHbmp1VWUveFczYnhodWJvVkFvVk42eFl3ZCsrN2QvMjkvZjM2KzlJWTh6QUw0TTRQZXoyYXp6azZhRlhUL0JoOXZhM25FSkQ5OWlPYzQrR2VEcTFzM3g5RFovd0ZOZE5aMUhKdkp6STNOcVIxYjR2VFlSeXB5Y2I0ZGI1VjhyS2drSEJKc1l2dHpudzg0RkZaTFdBbVZaQTZaOE5rYXJRVmpFWVlLandRZ1Q0VldNbFNNd3dHR1Fnck5SSFU0MUFjQ0g1WjVsZE15MlE0ZUNGaFNVK291UTU3c0JBRTVtQ1h3eGpYTGtES1JtTlo0OS8vVlRmcjkvck5sc3FqK2FsMlF5V2Q2L2Z6OTk2bE9mQ2lXVHlUZXVCalFCdkFqZ1Y3UFo3T1RmVmladTBQdzQzL3N2N2I1NU5CN3NYWnBwN095YUZucytYSTUyKzZIQUFlRjFNaW9uRW5yei9aRmtHbFVIeDF0R2M1S3IycjZtWHpIQlVPWEFjeWxidkdkUk1Kc1lXa1Q0Mm1BUUYwMTdZWUxESkk0VGZRNEdaM3d3d1dCQWdVa2NNL0VHaG9zY0RublF3bHBUOUdxaUJQL3FJUFRlVmZoblltaEJoUTBHMWx1QW1FbXUzZTNvbkt6cHEzTEJmbzNObHljZ0lkNlVHVlZWbXowOVBlWmxsMTNHN3IzMzNyRGY3My9qcjhzQVRnTDRmRGFiL2ZwUFcwRC80SVBtWURTNi9XQTRlbFV2bENHL3dhS3p3aHhXMnJYUWprM3g3b3Q4ZnMwb1dYaHV1cnd3Y2I3V3VyMmVIQ0ppS0NvUVIwS21jMmNCcWdQQ1JKRGpPRmZFUmozRUxERE0rd0VMVld4dmVHQ0NZVExDTVM0MWREUWpNS0ZnT1dDam9qaUlWNk0vREJvREhNdlJHZlNYTXRCSmdRNEZLMTBWT1BOZGNMd04ySjRhUEpVT0FJQVJ6em5OV291WDJDek8xNDdMdXJuNnB2dklHQk9kbloySUpwSldTemUxN3NFUjZ1bnVRaW9XUlZkWEozVFRxaTh1NXNvVHI3LzI0S01QZit0ai83ZGw5ZzhpYU1iYUlvUGJFK0dkYVlXbEFvNUNSODM2L29IdE1UV2JDTWJsZ3RHRmVkUFRkMWEyWDl6d2VSeXNqWGpPd0tnZENyUVdyK21LOS9jM21XWlhiWHdseU95ZWlxcDBtaHJtdlF4bFZoT1hWem16aWVGa2pHUEs4cUxMQ01Fa2p0ZmFETHd0WjhLQ0FvTVVQTnZQRUo1TnJUVS9VTEEwVWtGd0lnVUR5Zyt2MVJJNWRCVGphRUdGRGhWbUtnZDFaUzFROU81SmlKYUtnbjBPMDZYVG90VEkvOWhpYzBjazQzVDZCdTNyZi9XQTVmRUhnb2RlT1lGTXBndVRaOGVSU0hlaXMzOEk5VkxCcXF3V3B5WmVmKzEvbm56eEIvL2haeW5QWDRxZ3VXRkwrOEJWbTlzL211QktlcUhZWEQyN1dHKy9PQldwMmkxSFRCV2JXME1PNy9sQVBKVkpHWnlvN2dBTmdabWFiaDRUemFWY0w1Ty9jbkYzYjdOa2lVTVRwUVY5eWd4ZDNZckZiQ0k0eFBCOHAyYkhkVjI1ZE5tRUE4TERuWnJRU2g1S09UNTZKZUhnc2tJTkFXZ3d3Zkc5TkVkZ0pRNEpEUzB3eklXWHNMY1NoZ0VGQlI5d3pNc1JxS2JYQWlSZGhyMFNoYkQvVDNNaHlFSXRPSWRJYlFBQVVQY3N5WlpkcGFaYWNQTDJKRjhzbjhPUDFDam9qdmM1S2FXTEJuaVdOTmFpemRVay9IZTM0WnAvOUM3OHlmKzREK1ZhRTVGWVFsWlhDMmF4c0xUYzFUTmdEbTNZMk8veitlajA4VmVlT0huOHhVOGUvdDczVHYyRENKck9VQ2l4M2E5ZHBJQnR2MzVuK3orOWF6U1RSa01BTlFkTHhaYjUzWm5WNVlPK2NHZTNwVEJSZC9CaXFWbzYxelNLZmhPSm14Q05pZlVheFNMQ04rUDJjbStuRnJ4TVo0RlcxY2JYT0p4dGVZMzd5QU1MRE1jN0ZMdXRVYVd4c3VBMk1UeVFVV1Q3U3BJa0ZCenRxT0NXUmNBQ1I0c1VQTlRwb0MzWEF3TWNTL0VLTGlvQ05qVG9wT0JzbjQ3cXpBQWNNQWpZd0VBTzdGelhtL0pWQ0oyQ1l3bVV4UktXNmxPeVl1YmZkSTg4SGc4Nkk3MU95cE5tL2JSUmRsZERiQ1UraFYyRkZCalZrRWNlbVhnWVkxLzduZm5wK2ZuVzBmTkxRL1ZLQ1ptZWZxcFZpbmExc0Nxc1p1VllUMWVYWlRPbHh4c0lzZTgvOU9DN0gzM29nU08vZEVIemthdjdiaDlMUmc2RUdvaE56dFhEMWFMWmY2Ky9iYWg5QmNwcXdSRFBzOWJ5WE5DcDdzNUVNanVaTjBSMWdVUGwya3FoWmJBYnJYRGlRcEFVU1RwUEpLbVJiTmplUFlaUHM0bkJJWWFYMDE1d3U0bHJGblVJRUw2UllpSlJqVEFmdkRDSjQraXdncXNuODlMbktLU0Q0U3NkVXZZV2VpZ2ZzQkJ6Q3VodEJtR1Fndm1RZ3hNaUFKL2VBUU1LR3BGeGpKVFRhSkdDVmErT1pVYndOdE5yWS9pUlBNeXpDZFNWSlZTVmVlVDBLWmxybkNkSHZubGRNUkFJSUJQcXN0clVMdFl0UjlGZEQvRkd4eEkyTHZrUmtqcW1lcXJZUDAzd1N3UFBoVmJGelJVZisvNTFQUTlkKytsUERUM3c2T1BSOW9IUjlJbER6NGpkbDEzSmJOdkFtVk1uUlZzeXVmVEVkeC81YURBYzdnMkhJN2YvOTg5LzdnRHdJNzNvdjI5QmMrUCt6cmRkUEJpL29sMVQyMC9NVkVaM3BNTjlZeDUvY3FpbCtaQ3pJSllzUERlM09uZWkxbXpkamRRSUp3VTY0empwbythSnNHVjhkTkdPcVNBc2FDUytHNE44YjU3ekMwMk9RNFRKa0lMRFFkdSthZG1qMkdDd3dQQnltdHZiVjRwOFFHZGtFY05YMnprNlMybFk0TkNKWWJ5M2hwdlAyVERCTWVjRmpsQkFocTEyeW5XdjRPTFp0UkdQVGdwTzl4cFluUjBCQUZpcFJhUlhJai9zcHpTN3owTXNSRkZURmtYZVBzZnkralJxWnZISDhoK0x4TkFUSHBReEpZRVJlMWdtR2dtMkZEc3J4d3BSQ2trRDg0a1N4bFk0L05MRXNSN0x2bkxhVXJ6U3hwTnRGbTVjRXZpT1dIbjRzdFBmaWMzTXpPNmVyeGxxcTFLMEZJaUtQNW1PQlFKQlBuWHFGV0haSXZmQ0Q1NzlUMDFMbkppZm5WdDkvZVRSSTM5ZmdvWnZId3J0Ymk0NXJXdGJxYXZTNU4vY1ZObVlESElGS2NudjNCL3JIZEEwRlhXQitVSkxmbSs2c05oZlY5bUJpamN0cWdJNkNOL3E4VmxoSGVxMkVrT0RGRlJKd1ZNOVpCMWNLcXVEVFVLZEU3N2FBZWVXSE9NTUNpeGlzTUJSSStEeEhzS2xjd29JQ2t4d3ZOaGw0dTZaR2t3dzZNVHc1VFlONmRWT21NU3hIRFV4MGlnaWJ2aGdnT05JcDROR2JnZ05yNFdvZHg3dHBRUU1LQ2o1TE13UTRHdWxZVUZIem5zTWZoN0JxcjNvRk14Wm5xL05BcEEvVmhBZHlReTZmQU5PaHZlU2FWcm9hMjVocmM0Y3Nya2tPSUNsNE11NHB1aURYNW9ZRDFURjNwckN2TkxHOHozY3ZQWjhVMU9sZzhmYW1ieHh5YUxEVkovdmZmVmJ0ekhHbm5yNnlFc2E0d3BkdG11N2Z1YnNXZUg0d2p3L1AzdjJ3TjVkSmhFbEFOeVd6V1pmK3Fsbk9mOS9STW5OQ0YyNkY4SExhaVM4enR2Q3QzenE5dXlteGZsbTYvQ1I0Z0lPZXpxMldlM0Jla05EcmFuaEM5UDFraDJlci8yYlhtOVBWMVBTQjFyUnprTFRrbjhSWmVZVkpta3hrK0hnb2xCZmpYcWNCOUxTdVdSWjAxcWtZdk9jcGo2ZUNUb2o5UlhhWG1ic2htWEdIK3hoMkpLVENOdmEyb3dzY2V5YVkzaTRXOGZ1ZVI4Y2NIVGsvTGcvcWVPcVZSVW1PSHBzaVhPa2dNZ1BzeExHa1l5QlBmTWFkQ2dJcjlvWTV5WDQ5VTRVdSt0ZzVRQnFVbUpaVk9RU1AwZTI5eFVVOUhsWkxDeGRlRGo1ajNSa1pVOWlnSHA4ZzBqSXRLanBWUnFxYmVjQVVPbVlCNW9Ba1VDTUJDUWNOSTI2MCttWTNDc3RMRHU2RERsQVVBaDRiRTBHSEJOY0NtZzJkelRoS0twZkRXL1lzT0h3bVRObnZoelFsQTlZcE9nQXZLTWpJL2FSbDErV1hvK3ZtekYybXhCaUJ4RjlWa3A1Z0lqRVd5NW9EdnBpUFhlMmduOThFTEczQjBsVGRjYVJmeGJPRjQ2ZW05dHpJTmoySzkzSm9iTzhWcjcvNWRucC9zYVd2aXA1b0ZFMDFtb014RDZ5c21qLzd2S2tNdEFVaUlIb3pxS2pQZENoMkYybVJsMDF4anVxak5zRzU5L3NjdXpkaTBHbEFRMkpuTVpmVGdYa2dyTG83Q2xxZk9jOHcwczlESkVWQjBuRC84UEFHVjBJNExsTUhTTzVGQXpKc2NRSWkxUUd3WXRraGVOUXNnQlcyZ0FEQ3BwNkVqbXlZRUtEYmlvd3ZCT284N0lvTDA2emhscEJ2allQdmRHZ3Y2azJqL25qb2pjMHpGUjRaQi9mZ0ZnekEyWXhDRGpNRGt3Q1Arek9rQURBWUR0V2pCelZoQW5iMFNuaFdGQ0ZBdzhjaXRrU2loUlFIQldhY0VDUUlFbmdrTEN5YVJ2SFhvV2lLSC9VMzlOOXg5T0hEcGZrUlp2L2xJZytzV3Y3OXNCM0huMTBTdTdZY2k5ajdEc0EvdkQwNmRNSEFEejVWbXFlZlB1ajhXdHUwSDEvZEpzZTc0OHdMd3ltb0VVS0dxU2lTU3BPTTZPaTlOYm9UcThXcmpWcytUbkhhMW5MRjJsVjhxQUNMNXBRb1hZczRXUHpMOGl0QmlkN3ZXL3lYSkxCRVY2N3U2b3BkZEt3eWptZXl4Z1lXVWlpUVQ1VTRVRXhJUkNqV1h0M1hsTk1jSnhQQTQyV2lYUWxBcFBXNWtuS0hnY0ZieFBSYXZ2YUdsQmlFcGVzQktCRHdhbTBnYVhsRGRDcGhnYlBRNmNKZ0RITU4rZGtRYytSTGYvbURYSGhZQVFaZjY5TWFXa0ppeU9yNzJRS3FTZ21aNUVvOVB5ZmVYeFJRMDFabGUyaWx3Q2dtbDZ5dzB0cHhXaWZOZDliVG1oMTBZQ3VQeWV1YTNER3BNRDMwcHE0ZHRGZ0JPQ0JIcTl4NjJ6TGd6REhYNlhKdVNqaTQzTWZ2cXQ0M1lkK05Ra0E0K1BqMzV5WW10cnc5dXV2SHgwZkg3K09pTzRYUW54dmRIVDB0cDlwRWU3L3RUK0N0V013RmdEY3NMbHQvL1pZYUpQYUVOckVja09Jak9laVczZWxSOU9xdHFWTDljUTBYV0l1MTJpZUx0cmwrYnlscEtaWnJNMzJxRFhTRUVRNHNwaEx5VDhONStTdnp6YnBOMkZxLzdIbkpKWlhMNGRZcjlXdFhCcWY3OWxMSDhrZHgxQnJyZk82c2NUeFN0QldUaVg4SWxIU21DNDFEQzlFY0NKVFF5Z1hnQUV2NnF0ZXJBU0RTaTR6YVk0dCtUVnRtYU1TY2ZCeXFvYU9ZbVp0Z3Mza3FDVWNHTlVnREhEVW5SU2VDK2RRWWFZelh5dnlCYzhMV0NrdnduTE1uL2pRaGZ4aGRJWDZaSnZTSmNuazZMRDZXTlJzbzVwWklvc01LTFMySkNUTUpzTFF3U0hBcFVEUnN5SWpab1RpcU1JUEM0dXlMRFlLRzNOT0dVa1dCYVNGem9iSk5LR0JBTmcrVFhMb1FKREJDRXVTMi8yb1JCak9wOXFNbmc5K3lEL1FQNlE4OWRSVHloVlhYR0VUMGFOREF3TlJBTWhtczQrZVBYdjJzMFIwOWMrOGN2dXovRkVtQS8rLytPUysrMFl6NGN0SUY4cHFUaDgvY2JLRWRJbDY3d29rT3JCa2did1d6cjlhTjQrZktzeTgwTW1LUFZ2YkkxRmJZZEc2NnQ5UzUzNUlCNmU2Slo1d2ROa3hINllHZVdCWUhzbzNZdkpQTzE1MzdscHU4bCtmYitCem5jL2lUT2x5WERpaVpTOTI0TSs3TitIWFppY1JzbFZZWU9odWNKeXhEWFl5cWNwNDBVczEwaERQUlRDWHJLSmVKcW5aUWFLNmdxcVIxWjdJbkRNSGxpTWFxbUVvU2hUSElqUGcxUVRxbnBvd2FoVlc5NXlCSWVwaWRUWEhLczNDai9WRGZtUmRCNmxRV3NhMGhNd292VEpzcDVpRWc5MnRNQ2x3YURHNmltRFpCNDRLbUw4SXRIb1JnQTVWdEdDWk5kRWxTNHhCZ2tzQk85eWkzWGtkbW5UZ2tUYk1WcFcyMmhVWUFOckpRVUZyWWxnbzRKQkFnS0hwTVVsdTgwT1BFWHpNNWhnSzRKbG9OMjc3NEcrdEFPZ2xvbk5YWEhHRkRRQ0dZVHlvYWRxQkMrbGVXRmo0VEVkSGgvaFpnK2FuYlo2ODc3NmwvelBYWHR0OWVTYnREeFh5elhKMW9SVzd1amZaM2UzeEttZzRRRjFnWlZtM256aTJQSTFUVGQ5N0Y0S2ROaGhNWXRBWng1T2VWcTdhNDQvZlUzTTBxZ3VnSVNCc1FJZkVmKzBQb2JBeUNBdFJWT0ZCS1dUak91TUZjVlZOTWgyRXozY0dNRis0K00yYldYb21jTmU1TXB6MXRSc1RIRXZNeEtra1pLellRMVg0VUlFWHJXQVpKY3c1dkJWa1hHVmtrNDRGODFVQmJxTnB0RmkxdFFwRE5INXNvZS9ITnM5b0d0TGhEREphR2ttZWtFMnpLZHZsRnZJYlljcUhacENwRDYrdEMyVVdjZXRzQVFvRVRuVkpoQmFUWUpBNEZ5ODdXNG8rN29XTmxtaGdnaHR5bzB3U2d3Q0h4SGlQamh2UFZhRktCd1hGd2lJWllxK2hzZS8yQmEzYi9CdlVwOVVWWExzMEFSbm5lQ211b0RNSVpOSWVQT1l3K0VLdzZ6MmJsYjRyM2dkL0lEaERSQ2twNWE5bHM5a3ZYa2oveE1URTN1SGg0U00vajc3R1R3eWEwWUhZNXV6RzBKOWNjN0JyNDU1ZHlZNzhpbTZlTzFmTis3MnFlZG1lamt4dXFkazgra1N1Y0VYVDN6ZXNlRFEwQkZCMzBLalk4dUZjZlprdGlOQVY5VURnUXQrbHBDaDRydDBSTnk0VWFkRGtKRUM0TUhkeVg3Y1BMeFozUUYvZjE4eFRSYnluZUZMMDZRcHJNc0lYVXd5RjByNGZKbG1TaldENkRDNmZaOGh6RTNuVmxnM3VVSVZabUxJcmNFaHpXckxHcThZcVZoczUvS1IreHc4TGd3aVJVQVJoSGtGSWk0dXdHb05pR1JoVjBrZ1lQcXJFREd6TUo0bEpnYWxNRGJHbERxeEd5b2hYdlBDQ2cwTWkzN2tnN3pwZkppWWxIdW5TblA3bEdHZFM0clZPRTlmTk5xREN3WG5lUUV2RWtTQU5EQklNQWljU0ZYbm5Rb3VZbEhpOFU4TjE4em9ZSlA1eVc4SytZM1JVK1U1ekNiZndBaEJYOE1XbXdQdTMrWkRUT0U2bDM0NkJyWmRNS0lveXZKNk5Kempubng0YUducnFGN2F4Nkc5cWZuN3I0L3YreTNWWFptN3RiQS80Wm1icnhrdkhWcVlNS1R6MzNKM3RBb0RuRHhXY2hTa0t2L005SS9HcEdkUDh3bU9sMWcybjY3NDJuU0ZZZCtpT3V0S3g2QWg4T3lQTjloSXBTZFBEbWtMRFNFNWpEMlppMkZLZXg1NDZ3U0dDQllZYmxpVHltWk00VTdnVUFNRlpTZUFMcVU3Mi90d0tWcmxFVzdXRlUveEJ3TmVKaGxPeURWbm45ZHdxUGV5VVVHM1cvN29INE1lYUZjNDV3c0dRRS9mRXVKLzc0Tk1TTWlERGprOEpLc0xPeTgxMm0welZOSFlxcEl0d2RRdlREQjJXZWd6N2FrRkk2ZUJFcFl3T29ZSkJZa25xR0JKNW5QRTJ4WWFTaHpGSW1MQ2hGbWFSTXRlUzBtcDVrSFEwTUFoRXBTMHlWb1Z4S1hBK0xEQ29PeURaQklQRXJOZkNKWXNsK0oyMUpOY0ZvRWtIVlNZUTYxZVpPV3pBbWl4S3VTVkFqNWtSeEZPOWVEYm9WSkRjSGhrWkdnT0E0SG9XbnhvWkdibUdpT1F2Y2xUem93WE5QblRYOE8zOS9aR1A5bllGT3RkMmdWbElCcnl4Nnk3cGpEZWJ0dnpPRDVybTZIYXViTnNhNGdEdzhFTUZCQzBQTHQzaXh3K09OZVhNdDVidGQzNjNxZ2JBY1dIRitHaUhIODk0Vld0Z09hbld5WU1xZVRBZDFER29UNkxMSWN3cGpsUFdpQy9Ed2t1Q29RV0ltbDJraGxFbHZWV0ZDZnR2Yno4OVBnUzlRUmxtQVJsVWc4ekgvREJzUXNxZkVSNzRVSmNsMXMrNEhLNEVpZm1ZUE9YbElsd2E0VDZZTUNKNTdGd3RJUVFGT1o4T1hmZWlBeW9XdzFXTWxBRWZHS1o4VGZRMkZmakJVQ2NUWjcwdHNiY1paTi92YU9LYW5BY0U0R1Nid08zVE9YQVFqZ2VBbWdpaEV4NEFFb2VpRmVkOVN6WW5BSSsycTloVzhhOE5rU0h4dlF6aHJ2TVZJTUR3Zkx1R3pZNkZTRWpEb3lrL3JycDdFUGNmeitIaVFTRW4rQkIxamIwSG9YQ3NURVErS2FVSHdCSVJCWVFRVHdRQ2dZOTNkM2N2L01LM01GNzRZZTlGcWRzR2UwTy9kOVZZWjNLZ0t4VGVPQklOWEFpcjFZb3QvK3J4dXJ4NGhOT3QrMEtlMDlPR2MvOExlZm1lbTVOMC9aNDRDaVVkWDNxMGlGc3ZqdEwrVC9XcFQxMVpsV2UrdVNBdWVVWHlDYTlBdzJyQ3RpejF6LzBMMHBSZVVSWXRWbW5VcWRSY2hTbU12NjVXWUl3eGhQeFJtWWgxa2djS0lvclhDV2dCSG9RZkRiTUZhSjFRcE5kV3lhY3dTNE50MitoUzh4aXJSVm5SMUhFbTdoZHh2WitoU2t5a2wyVmZ0WW1OWlM4dGhVMmNWeGxkVVl4eUQ2YmdrU1pPS0t2b0ZWNHdHSGpWVjVQWDF6MmtTSUdpNnRnWm9Tb0VpWWtZUkxwdU1nYUoxOW9kM0pRRFcxSEsySmpYWlp2d0Uwa0p3ZGZPaFJBazVsSkI3RmtDQ0RwZURRZ2NYRzV5aFZRZ3dGQVBjdmhYVFJBa2xqV0pycVNFM0JSRnd3c3NHdzR1N2dzanJ3RGpUVUtqR2FuRzkxNGVMblowem0xb3ovUUFnSlN5Z0xYTjRSWVIvWHRkMSsvYnVuVnI2ZTlzMzJzMm13eGR0N1A5U3owZC9xMnBoRGQ2L1o2dWFHNmxKZTc3Nm1KMXBDY1czSjMxc0JnWXZYdW5IMTk1dXVUY2NibUhiMmpYdUdLcStNVHZuWEwyYlUzeVF0VVV4YkloZiswUHovTnEwOEg1aFNyTjVjcGNOd3hJNDBLVnhwRHd4U2lrQnJuR05CRldvMmh2SHlFUDgwTWpMMXAySGxzUmRUU204VG0yQ3JPK0VUNHJUaFNzWWFzNWovNmFsOHNHd1liQVkzSERrZVZ0L0VMUU8vNHF0dkl6MkZ2MVVGbXVZakxseDZWVkwvUEtPUlRhNm9oWEtqUmFVYkFZcXFFS1U5NlU5NUtLQmFoUzRFaWJaViszeUpRQW1wZ05PT0t5bFJycnNsb29hQUtwSXBTSThNT0dBMm9KRnBGckl6Z3BMRVJzZ2FOdEtxNWNZRVJvWVRJQWpBVUkyQk9BcFFEMVpSdCtaeTJBRnRzMUhOd1dod3d3Mkg2QytvT3k5RG9xU1FDSE4zcHc5KzFST0g2RyswOVU4YUdyMnZCaWdhd1pOcVpldi9kR2FKcEc2NEZ5NFFFL1NVVEhpZWhGSXZydThQRHdmWC9YTS9yS3dSMkpqNy9uN1gzWGpQU0dQWlloeFBkZldNa3Zyb2pRd1l1aTRWZk9Wc1YvbTdJZFJvd3RGWFU2UDEvbS8vVnJKNTFjb2M1MFhTZWZUK01ueHZNeUh2VWhIdkh5bG1YSlBadFRjdi9XRkR0MHVBTC80akJVb2NLeHBXd3B5K0syUmllSERVeEhUVGJWaUVsL0xRWUpRaXZRa0wxa3ljMFZMeTk2SFZueDlVck5qakk3VXBjYjVSUjJWNGdrTEVnQVQ2Y0YrTXBPTGlFZ1FIQzBGamJoSkc2cU1oZ3djU29seER0V0ZhWmhIck5oVTNhVVczSjd3OFB5UGt1V2VVdmNYaURPWlJOY0NreUhPYUs2Vk5KU0FVRmlKdVN3RHhRZEVHeDh1NDNqaGhVUENBYWV5SERjdUdCREJmQk11NExiNTFyd2dxRnNtUEN1RDdwT0QvbHg1NVZCU0pYd2VFN2d4c01GYUNBc2V5UjZ4enlRRjRXQkFNTVRadzFjdjhpSXc4RlhOM2h3eTJjNzBBeHIrT2FoQURKdnV3UVAyZUY2ZHU5KzN5NnZGd0JtQWZRQU9FOUUzVkxLUnhsakh4c1pHVG4zLzNPeFVOazJsbnpQb3E3anp6NC9WWW1HQWdIVGRsTEwrVHA5K2RFNmhvYWlUTFNBYlVOdGNxQkRFWTJtd3U1NS8xYmVrL0hpMUJsREpEMGEyN01sUUVKSyt1SjNDL2F0TjhTVnlXbUh2dnVmNjg1Tlp3ZTVCR0hWYThxV1B5OXZLUHE1UkFsVFlTbjBlb0MyT2lDQkVscUtnMVl3UjlmUEM3Smg0bENNMGNibE5qTFVBaFIxR3U5WXNrZ0NrQ0NjaUVoUkwvVFFvRndsU1lEQmJBUTk0ODRIQ2lhWElIdzFaWW4zRmp4TVJRR3pQaW1Fa096eU9xZWkycEt6SWVIY01XY3FEQkpNU3VSOURLOEZDVGNzU2hCTVBOdWg0TjB6TldpUzhHeEN3UlU1QVQ5TUxIc0ozSEFRY2h6a1BJRGFzaENTd05OdEhPOWNOcUNBNFZDN2drcytHb2JzQ1NEZmRORDQxMHNJQ0FrSmdlZDNlM0huSnpvaEF3eXZ6dGdJL3ZzRk5MaVUzOXlkb016SFF6alZTTXBLZmxQamtpdXZDYTZQNENwU3lpRFdqcExZVXNyN0dHT1BFZEhwNGVIaFkyK0ZIUWpLMFZjSzhkMGo3Y3BBZXpLNGJWK0VwVE1CZXZsWVhiNzN0Z1I5OGI1bDU2NUxrNXdyakpiTEZrVUhnczVsMXlUNDQ5OXZvcmZkd3phUEJLQ2JBbi81MklwNDd3ZmFsSzkvcVN6RTUzVGFXL1p6aVNyT3hVd002aVc2TkU4a3FZV2pFWTV5VTJWamdrR2lqQllUbUlxVzdJL09Ucnk4emdBQUNKZEpSRUZVbW9vRTRZRTBzOGVXTW9wQUNSUFJndmhIYzNXMlZzRURDejZHU1JsbVd4MEhFaVZZQUpaaUMvaW5jM1V1QVh5cHpYRSt2TXk0Sm0za3ZWS2VWNGhkczZxaXhtMjhtQ0Rubm1sZFdSK3NZOEhIOEd5SEYrK2FNUUJJbkFzckNIb014RWQ4T0JGU3BISzJUbW5Cb2NQQ1UyMWUvTXEwaVFZVE9CUlQ4UDVGR3hVbVVGQVZSRFNHbkk5US9NZHg3THUxRFpXcWc0ZC9ONGNQSE5mUklvbS8ydTNCTFY4Y3dPdUxsbGljUzdDSmJ6Y3dlTTJWT0xsL1crUGd2bDBYUmp6bnVvSEI5U1pvSGtBWEVTMUxLZThEOEpuUjBkSENXMjNiQ24zdXM3L3pYNFo2ajM5a1lDQ0VsNCsyWkhhWVVLK3JZdXIxRnIvenFoaVlBcnc2WllqcFlrdmVlRk9DUC9CZ3hkblFyYkRSUVIvTkxsZzRmS29pZCs2TTRjblBMTXZMSDdJWkE0TUZpV2VTaHJnaFYyZmRZcTBwL21hY1JLanVaeDNrZ3dTd3FrcU14M1Y4Y0xZSkNlQ3hEczFodFFCUDJTcWU2V2phbjVpcEtNcDZ3QlFWNEd1SkFEWlYxcG96Q3dKSDIydjQxRXdWRXNBWDJxVHo3Z0o0VUJDV1Zjam53NkRyeXdwTVNIeTlpenNmWGpJNUFnd0ljSnhLZVhHNlp1SG1LUk1FWUNvQU9iN0xUKy9JZW5Ha0pSejc0UlcrcjhoaEVQQ1ZMaFYzelZsWTFpQy8zNnZTK3owY0xRN2NGMUR4WWN2Qm9nTDUxRDQvM2ZxcE5BNjk2RmlIdjdLaVh2S3lnSmxKdG93cmQzbUR1MGJJRVk2VFNuWFhRcUhRaFlQMWVRQnQ2MEV5UTBSZDZ3T0JwNG5vSlNubFdWM1h2NzF0MjdiOFczV3ZFNTA1YytZSEowODhQMVpjZVZFYXJXVXVqVHAvKzRFb3N4ekMrTFJBb2VySXNURk9IZTArZlB1Um1yanhRSUJGWXlvZWU2WWlJbEZCcTBzS2VUKzlpTjNURWhMQVZJakoxOXBzNTFjQ3FrSkNZbGtBajlSTjUrQ2N5clgxcFlBajdWd3l4YUNicWc0Z2dGZDh6Q2sxRlQ3Y1V2QllCdFk3L0xxYWtod2tnQ0lrdnFrRGwrZDhrQ0RVRmVDNWJndjNTaHNRRXYvZE1KejNMWUQ3T0dFNnh1VnhFblJkbm1CQzRFdkRxdk9SUGkrbkFJUGxZM2l3eFpBK1ZNSGVaUnNFNEhDS080MmJnbnpYeFJFOCtvTzZ2ZXZMZVdXb3BlRFZpQ0pQK2dTdVhiSHAyWUd3ck1hYTRvWWVQejlGbWp4alNQdHRmbE9kaTNlYnVhRlJOVDNTUnJycHJXV3plenlLb21qcnpjb0MxdDZ5QUNubEFoRjFycGQzWlgwalRVUksrVG9SWlFETUV0SDl3OFBELytFWFBiL3ljd3VhOGZIeGVRQXhJbW9KSVhpeGtQZE1UWnlzVnNwSDJpL2EyaEtjRVp1Wms1QzJLVys4TGthSFgyNWdmcUhwYk5vWVpDZi9ZcFhlOVQ5WDRBZERoVXM4bGcxYVBUdTVzamZqbzZXNmd5Tnpsa2crdjByN2lnb3RLZ0tuTzN3aW55SzZNYzBwcm5EQWtUalNFbzV6dE02M1Z6aSszY1B0M1hzOXlrQkFBNFRFNjAzZzZMRUszajdGQUJCZWp6SXhNVXJzL1gxZUZGb1dIcDh6N05zMFZWR0NITThRSE9kWWpSL0lBM1VHZkcyYng3bjcxZ1NuSU1NelM2WTlmN2loM1BGTUhRb0lyMFlZVG0zM1dzbjNSZFZhVVlIOFgzTnl3d3hrWmFTVExXL3NOcGR0SFgzOUE1cG54MGIwYjlzOG5sdVl5MXFtaVVBa05sdFluT21KdDJWa1BKbWFab3oxQTdDSmFFVkttUVlnaWVoMUtlWEc5ZktkQjlBbHBiU0o2TENVTWc5Z21YUCsxUER3OE5mbjV1WjgzZDNkcmI5dis3UHB6Smt6TnhQUkY2U1VJY2JZdkpReXNmNjBsRzNiN2krczVMQmFPS28zbXlYcnRkTm5RcnZIRWszVDd1QkxYMzdaYy9OOEFTdWFSK1NIQjhXcG1LZStlU3dXWlNBWUZFVXU3NVRiNFE4eTAxSk9uRDJCdUhOTzNITlJuSEVBY0lDVzRlQ2gweTE3Ky9jclNvY0JQRERpczI5NFgweEpCaFdNNTNSNThpelIwRU5MMkZFaW5Bd1N6bVI5OXFZRFBtVmp4b2VIWDZzamFEUG5zaTZOdjlRQ3hsK3YyOWMrVVZYYUhJYVpzSXBITDFhZG5lL0o4THdld1pGSEp2WDlDMkd2eisrSDFSWkR0U2ZWV01tSVZsZnZTRExUbVVWNWVVVVh3bGx0NytuT2hFS2gwdnFFNXcvZjBZSzFOMEhaNndIUXQzNzlGTmJlNVdLdTF5cjk2Nzh2U0NrRFdIczMzWk5FTkE2QUZFVjViWEJ3Y09LWDVVZ1FBY0RaczJmZks0UzRrNGpTQUJKU3lnd1JLUUJXcEpRbHhsaEdTaGtnb3JNQStxU1VIaW5seXVycXFob0toZXFhcHFsWWUzTVNzSGJFYytWQzlRekFrVkl1THkyY3p6UnlMOEhIbTJnWjFHenh6cFluMzB5b3BSS0tzV1RUbDJaTVlZNTMrdnhTaGZKMk1CdUpjeWdLVGkyY2s4bnV1dFdWWkpvbEF6Z3hwYU10N0swbE8zdENscFpDL1Jzdk56cVBUdnFaRUZUZjJDZXNkMXhhVFcwWWlhWlM3ZUNjbjVOU0Ryd2h2K2VsbEg0aXVwRFdJaEZaVXNvT0lwcVZVbllBMElpb0JxQWtwZXhaRHdBUGdFNEErZlhPNmxZaU9pcWxmSnFJU2tTMDNHcTEvbXJidG0wTi9BUHdwbVVFS1NXTmo0K1BFZEVlSXJwTENMR1ZpRWhLdWNnWWc1U3liNzB3NjBTVVhIKzYrdDh3czN5V2lHSlN5dFQ2enZZRklvcElLY1ByMzc5SVJEVXA1UUFSWFRoclhKUlNha1FVd3RvQjlDU0F3UHJ3c3lhRXFLMjMvU0NpdWhCaWxZaDYzbEQ5WjliM1RlVFhPNVNKOWMrK01XQUtVc295RVEwQVlGTEtKbU1zdjU3T1JTbGxhSDJ2N0NRUkhaRlNxa0tJS1FDdmpJNk9Qakl4TWJFVFFCakFuQkJpTTREcGJEYjd5dCtYUHNndmV1M3BUYzZmUHg5MUhHZXI0emlYclBmNHR4TVJBWGhWU3JrYndCaUFCb0JEUkRRbHBZeXN4WmljWHUvMDFRSDRwSlE3QVZ4MjRlYS9JVWhuaVNnRndDdWxuQURRdng1TUZvQVpLV1dTaUtKRXBBc2hsampuS1NGRVVFcFpKYUk2Z0F3UnJRb2hDb3l4ZmltbENxQkpSQXRDaURSajdQUjZ6UUVwWlhYOXBwOGxvakNBRTVabHZhUnBXcmVVVXBGU25oa2RIVDBQMXk5dXU2ZVVrazlPVG00VlFzeGxzOW0vZFM1aFltSmlueERpenZWcXZnTGdCUUJKSXVxU1VyNHVwZlN1TDhMNUFiUVQwY3A2OEhRUzBSWUFRU0hFNm5vTkFTbmxKR05zaWpHMjIzR2N5d0I0aU9oRkFOK1FVcDYzYmZ2WXBrMmI2dTR0ZHJsY0xwZkw1WEs1WEM2WHkrVnl1Vnd1bDh2bGNybGNMcGZMNVhLNVhDNlh5K1Z5dVZ3dWw4dmxjcmxjTHBmTDVYSzVYQzZYeStWeXVWd3VsOHZsY3JsY0xwZkw1WEs1WEM2WHkrVnl1Vnd1bDh2bGNybGNMcGZMNVhLNVhHOTUveHVMNS9lL2N4RlJ1UUFBQUFCSlJVNUVya0pnZ2xCTEF3UUtBQUFBQUFBSGkyOUdBQUFBQUFBQUFBQUFBQUFBQ0FBQUFITmpjbWx3ZEhNdlVFc0RCQW9BQUFBSUFBZUxiMFlEdC9mYXZ3SUFBSUFHQUFBWkFBQUFjMk55YVhCMGN5OXBibk4wWVd4c1gyRndZV05vWlM1emFKMVVZVS9iTUJEOW5sOXhtQXFCUk9vV2dUVFJ0UktpVEpyRzFxbUE5Z0VoNUNhWHhxcHJaN2JUYkFMKysyd25MUTJEU1V5cTFNaStlL2ZlM2ZQdDd0QVpsM1RHVEI1Rm1PUUt5STNoY2c2c3NQRWNiUmMrUzJPWkVQVVpTM0k4QWlYZEQwRmxZSE9FVEFtaEtuOS9DbU9jY1NZUDRXWldTbHNld2xjdUxZa3VKK2RmaG9UYVpVR0ZTaFlPMmlHVGFIeng2ZXptOHZyKysyUjZQZnpRaTZJcTV3TEI2aElIa0tvSWdHZXdYS1JjQStrOGVKQW5BbnNqbXVLS3lsS0lnUzh2WFJoQXpmd3M4QVBMRmhpWStXSWszTTgwc3NYQWZXWThXa2YvWU54NjFqNFNaZXJsTktwVXFVRmp3Z3MwM1c3WEl4aUJXRUN2ZXhLbExtYk4xSlNwZ3F3MHFJR3VtS2FDejJoYUxPWkJKVHdUaGFQUlhoOGFUZTNpbWRLZ0hBTU5SbVcyWWhwaHlTU2JvelpnSFRpWDNPUnZrQWpsOVJMaTdKWHk5VzB6UlNpTGxGbUV4MGZZcjFINkp3TjRJd0ovY1F1ZGgvN1RRUnVEMTBhQStEZkVQemRlMkU2SVBCbWRQVStyNFVqUkp0UXBzZDJVcnZPTVZVWGs1bnNMT3hDbjBCbFB6dStuazhrMTNHM0dpaXNtZ0FTRTJnVng4UnhISWpmS3JRalgxVXBDUElXcXFtSW5oWjJ1UDdaelFzVmIyQ2NkYnpvQ3c2RWp1KzFEY2dCM1d3eWFCNEdRWXNaS1lhRlEyb2FoTlY0N2hYWjZoTUxnSm5PS2hXQ0puM1BJYTRWQ3hXME9nY2Q2dmw2SHdSUmlEakU2WGJTVlFFTXNuWk82bjAwanFVYzIzVVRKckQwTDE1N21RWi9uVE00UmZBaWZlMzgzcWNSM0l4UzFhS3kzRVdraEcrN09ZN1ppWExDWlFOcjBnTHhvVHdQdm45RllKZVVTcFowcVpiY0srWVZSYndUNENQM2pidS80VmJtN3JmUmdhVGZEOXVsbWxyc3YrL0FHVzkrSDk4bnM5WHB4a3h6YStnNjlaMy9wSFEzZkxaam1kaW4rVi9WTDhzRUdvYkJmOFJBblFJS0tLOVFyMU4vWU1teEpKbkxsV2pNYXRjR2IvN29MYXpkZFdlYXN2SjZzVzRUT3hSSXJxSVArOGQ1ZFdnTnhVVy9iVG85RWZ3QlFTd01FQ2dBQUFBZ0FCNHR2UmxLQndXOXpBQUFBc1FBQUFCY0FBQUJ6WTNKcGNIUnpMM04wWVhKMFgyRndZV05vWlM1emFIMkx3UTdDSUJBRjcvc1Z6OW9ESEJEalhmK0Ywa1UyYVpDd1dDOSt2Q1p0UEhxYVRESnpQUGhKaXArQ1ppTGx0a3JrNnhCcWlKa3ZBNUVrR0lQUlZJWGpoRGZ1alN2Y3VuSFhjUisvL29wd2k4VU5aMWhMUFhNaFFKL3pBNTU3OUZLa24yYi9HeHByRDYwVEw4cC93eTFMUWg5UVN3RUNGQUFLQUFBQUNBQUhpMjlHdzBNeWkxWUNBQUN2QlFBQUR3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQVlYQmhZMmhsTFhSNWNHVXVlVzFzVUVzQkFoUUFDZ0FBQUFBQUI0dHZSZ0FBQUFBQUFBQUFBQUFBQUFjQUFBQUFBQUFBQUFBUUFBQUFnd0lBQUdsdFlXZGxjeTlRU3dFQ0ZBQUtBQUFBQUFBSGkyOUdYbnp5SFJZcEFBQVdLUUFBRVFBQUFBQUFBQUFBQUFBQUFBQ29BZ0FBYVcxaFoyVnpMMkZ3WVdOb1pTNXdibWRRU3dFQ0ZBQUtBQUFBQUFBSGkyOUdBQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUJBQUFBRHRLd0FBYzJOeWFYQjBjeTlRU3dFQ0ZBQUtBQUFBQ0FBSGkyOUdBN2YzMnI4Q0FBQ0FCZ0FBR1FBQUFBQUFBQUFBQUFBQUFBQVRMQUFBYzJOeWFYQjBjeTlwYm5OMFlXeHNYMkZ3WVdOb1pTNXphRkJMQVFJVUFBb0FBQUFJQUFlTGIwWlNnY0Z2Y3dBQUFMRUFBQUFYQUFBQUFBQUFBQUFBQUFBQUFBa3ZBQUJ6WTNKcGNIUnpMM04wWVhKMFgyRndZV05vWlM1emFGQkxCUVlBQUFBQUJnQUdBSE1CQUFDeEx3QUFBQUE9In0KZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS9jb21tYW5kIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTFfQWxpZW5BcGFjaGVUeXBlL2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhNWIzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS9jb21tYW5kCkBAIC0wLDAgKzEsMTUgQEAKK2hlYWRlcnM9YHBhc3RlIC1zIC1kIiAiIGhlYWRlcnNgCisKK2NvbW1hbmQ9ImN1cmwgIC1YUE9TVCBcImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzEvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlc1wiIC1kIFwiQGJvZHkudHh0XCIgJHtoZWFkZXJzfSAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiICAiCisKK2VjaG8gJGNvbW1hbmQgPiB0b0V4ZWMKK2NobW9kICt4IHRvRXhlYworLi90b0V4ZWMKKworCisjJGNvbW1hbmQKKworI2N1cmwgIC1YUE9TVCAiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiICAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuIgorCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTFfQWxpZW5BcGFjaGVUeXBlL2NvbW1hbmRUcmlhbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS9jb21tYW5kVHJpYWwKQEAgLTAsMCArMSwxMiBAQAorY29tbWFuZD0iY3VybCAgLVhQT1NUIFwiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzXCIgLWQgXCJAYm9keS50eHRcIiIKK2NvbW1hbmQ9IiRjb21tYW5kIGBwYXN0ZSAtcyAtZFwiIFwiIGhlYWRlcnNgIgorY29tbWFuZD0iJGNvbW1hbmQgLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiIgCisKK2VjaG8gJGNvbW1hbmQgPiAxLmxvZworCiskY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvY29udGVudE1ENS50eHQgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvY29udGVudE1ENS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxZjY2NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS9jb250ZW50TUQ1LnR4dApAQCAtMCwwICsxIEBACitZVGcyTWpnNE1XSmhObUk1TnpCaU56ZG1OR0ZtTVRZNE9UbGhOREZrTVdJPQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTFfQWxpZW5BcGFjaGVUeXBlL2hlYWRlcnMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvaGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFkYjBjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTFfQWxpZW5BcGFjaGVUeXBlL2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvcmVzdWx0cyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS9yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2U1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDQ6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzExX0FsaWVuQXBhY2hlVHlwZS90b0V4ZWMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvdG9FeGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGU1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMV9BbGllbkFwYWNoZVR5cGUvdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLVhQT1NUICJodHRwOi8vMTcyLjIwLjQzLjEyMjo4MDgwL3NkYzEvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiIC0taGVhZGVyICJVU0VSX0lEOiBVU0VSX0lEIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXG4iCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMl9EYXRhYmFzZVR5cGUtR2V0QXJ0aWZhY3RzL2JvZHkudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9ib2R5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9ib2R5LnR4dApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9jb21tYW5kIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9jb21tYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzhhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMl9EYXRhYmFzZVR5cGUtR2V0QXJ0aWZhY3RzL2NvbW1hbmQKQEAgLTAsMCArMSwxMyBAQAorY29tbWFuZD0iY3VybCBcImh0dHA6Ly8ke0NBVEFMT0dfQkVfSE9TVH06JHtDQVRBTE9HX0JFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy90b3NjYS5ub2Rlcy5EYXRhYmFzZS8xLjAuMC53ZDAzLVNOQVBTSE9UL2FydGlmYWN0c1wiIC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgIgorCitlY2hvICRjb21tYW5kID4gdG9FeGVjCitjaG1vZCAreCB0b0V4ZWMKKy4vdG9FeGVjCisKKworIyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEyX0RhdGFiYXNlVHlwZS1HZXRBcnRpZmFjdHMvY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjOGJlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEyX0RhdGFiYXNlVHlwZS1HZXRBcnRpZmFjdHMvY29tbWFuZFRyaWFsCkBAIC0wLDAgKzEsMTIgQEAKK2NvbW1hbmQ9ImN1cmwgXCJodHRwOi8vJHtDQVRBTE9HX0JFX0hPU1R9OiR7Q0FUQUxPR19CRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0c1wiIC1kIFwiQGJvZHkudHh0XCIiCisjY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCisjY29tbWFuZD0iJGNvbW1hbmQgLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiIgCisKK2VjaG8gJGNvbW1hbmQgPiAxLmxvZworCiskY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMl9EYXRhYmFzZVR5cGUtR2V0QXJ0aWZhY3RzL2NvbnRlbnRNRDUudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9jb250ZW50TUQ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjNhZjViCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9jb250ZW50TUQ1LnR4dApAQCAtMCwwICsxIEBACitZVGcyTWpnNE1XSmhObUk1TnpCaU56ZG1OR0ZtTVRZNE9UbGhOREZrTVdJPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEyX0RhdGFiYXNlVHlwZS1HZXRBcnRpZmFjdHMvaGVhZGVycyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEyX0RhdGFiYXNlVHlwZS1HZXRBcnRpZmFjdHMvaGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFkYjBjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9oZWFkZXJzCkBAIC0wLDAgKzEsOCBAQAorLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgCistLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAKKy0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX1dTVFlQRTogSFRUUF9DU1BfV1NUWVBFIgorLS1oZWFkZXIgIlVTRVJfSUQ6IFVTRVJfSUQiCistLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9yZXN1bHRzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTJfRGF0YWJhc2VUeXBlLUdldEFydGlmYWN0cy9yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2U1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMl9EYXRhYmFzZVR5cGUtR2V0QXJ0aWZhY3RzL3Jlc3VsdHMKQEAgLTAsMCArMSBAQAorLio6MjA0Oi4qOi4qCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMl9EYXRhYmFzZVR5cGUtR2V0QXJ0aWZhY3RzL3RvRXhlYyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEyX0RhdGFiYXNlVHlwZS1HZXRBcnRpZmFjdHMvdG9FeGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWMyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xMl9EYXRhYmFzZVR5cGUtR2V0QXJ0aWZhY3RzL3RvRXhlYwpAQCAtMCwwICsxIEBACitjdXJsICJodHRwOi8vMTcyLjIwLjQzLjEyNDo4MDgwL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy90b3NjYS5ub2Rlcy5EYXRhYmFzZS8xLjAuMC53ZDAzLVNOQVBTSE9UL2FydGlmYWN0cyIgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxuIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9ib2R5LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvYm9keS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvYm9keS50eHQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvY29tbWFuZCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvY29tbWFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDc4M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9jb21tYW5kCkBAIC0wLDAgKzEsMTMgQEAKK2NvbW1hbmQ9ImN1cmwgXCJodHRwOi8vJHtDQVRBTE9HX0JFX0hPU1R9OiR7Q0FUQUxPR19CRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0cy9pbnN0YWxsX2FwYWNoZS5zaC9tZXRhZGF0YVwiIC1zTCAtdyBcIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuXCIgIgorCitlY2hvICRjb21tYW5kID4gdG9FeGVjCitjaG1vZCAreCB0b0V4ZWMKKy4vdG9FeGVjCisKKworIyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjOGJlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvY29tbWFuZFRyaWFsCkBAIC0wLDAgKzEsMTIgQEAKK2NvbW1hbmQ9ImN1cmwgXCJodHRwOi8vJHtDQVRBTE9HX0JFX0hPU1R9OiR7Q0FUQUxPR19CRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0c1wiIC1kIFwiQGJvZHkudHh0XCIiCisjY29tbWFuZD0iJGNvbW1hbmQgYHBhc3RlIC1zIC1kXCIgXCIgaGVhZGVyc2AiCisjY29tbWFuZD0iJGNvbW1hbmQgLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiIgCisKK2VjaG8gJGNvbW1hbmQgPiAxLmxvZworCiskY29tbWFuZAorCisjY3VybCAgLVhQT1NUICJodHRwOi8vJHtDQVRBTE9HX0ZFX0hPU1R9OiR7Q0FUQUxPR19GRV9QT1JUfS9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMiIC1kICJAYm9keS50eHQiIC0taGVhZGVyICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9DU1BfTEFTVE5BTUU6IEhUVFBfQ1NQX0xBU1ROQU1FIiAtLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgLS1oZWFkZXIgIkNvbnRlbnQtTUQ1OiBgY2F0IGNvbnRlbnRNRDUudHh0YCIgIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG4iCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xM19BcGFjaGVUeXBlLUdldE1ldGFkYXRhL2NvbnRlbnRNRDUudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9jb250ZW50TUQ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjNhZjViCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9jb250ZW50TUQ1LnR4dApAQCAtMCwwICsxIEBACitZVGcyTWpnNE1XSmhObUk1TnpCaU56ZG1OR0ZtTVRZNE9UbGhOREZrTVdJPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvaGVhZGVycyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvaGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFkYjBjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9oZWFkZXJzCkBAIC0wLDAgKzEsOCBAQAorLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgCistLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0ZJUlNUTkFNRTogSFRUUF9DU1BfRklSU1ROQU1FIiAKKy0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX1dTVFlQRTogSFRUUF9DU1BfV1NUWVBFIgorLS1oZWFkZXIgIlVTRVJfSUQ6IFVTRVJfSUQiCistLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9yZXN1bHRzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTNfQXBhY2hlVHlwZS1HZXRNZXRhZGF0YS9yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzZlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xM19BcGFjaGVUeXBlLUdldE1ldGFkYXRhL3Jlc3VsdHMKQEAgLTAsMCArMSBAQAorLio6MjAwOi4qOi4qCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xM19BcGFjaGVUeXBlLUdldE1ldGFkYXRhL3RvRXhlYyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzEzX0FwYWNoZVR5cGUtR2V0TWV0YWRhdGEvdG9FeGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzU2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xM19BcGFjaGVUeXBlLUdldE1ldGFkYXRhL3RvRXhlYwpAQCAtMCwwICsxIEBACitjdXJsICJodHRwOi8vMTcyLjIwLjQzLjEyNDo4MDgwL3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy9hbGllbi5ub2Rlcy5BcGFjaGUvMi4wLjAtU05BUFNIT1QvYXJ0aWZhY3RzL2luc3RhbGxfYXBhY2hlLnNoL21ldGFkYXRhIiAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXG4iCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNF9BcGFjaGVUeXBlLUdldEFydGlmYWN0cy9ib2R5LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL2JvZHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNF9BcGFjaGVUeXBlLUdldEFydGlmYWN0cy9ib2R5LnR4dApkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvY29tbWFuZCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4Y2E1YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL2NvbW1hbmQKQEAgLTAsMCArMSwxMyBAQAorY29tbWFuZD0iY3VybCBcImh0dHA6Ly8ke0NBVEFMT0dfQkVfSE9TVH06JHtDQVRBTE9HX0JFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy9hbGllbi5ub2Rlcy5BcGFjaGUvMi4wLjAtU05BUFNIT1QvYXJ0aWZhY3RzXCIgLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiAiCisKK2VjaG8gJGNvbW1hbmQgPiB0b0V4ZWMKK2NobW9kICt4IHRvRXhlYworLi90b0V4ZWMKKworCisjJGNvbW1hbmQKKworI2N1cmwgIC1YUE9TVCAiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiICAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuIgorCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvY29tbWFuZFRyaWFsIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvY29tbWFuZFRyaWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzhiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNF9BcGFjaGVUeXBlLUdldEFydGlmYWN0cy9jb21tYW5kVHJpYWwKQEAgLTAsMCArMSwxMiBAQAorY29tbWFuZD0iY3VybCBcImh0dHA6Ly8ke0NBVEFMT0dfQkVfSE9TVH06JHtDQVRBTE9HX0JFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy9hbGllbi5ub2Rlcy5BcGFjaGUvMi4wLjAtU05BUFNIT1QvYXJ0aWZhY3RzXCIgLWQgXCJAYm9keS50eHRcIiIKKyNjb21tYW5kPSIkY29tbWFuZCBgcGFzdGUgLXMgLWRcIiBcIiBoZWFkZXJzYCIKKyNjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL2NvbnRlbnRNRDUudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvY29udGVudE1ENS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzYWY1YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK1lUZzJNamc0TVdKaE5tSTVOekJpTnpkbU5HRm1NVFk0T1RsaE5ERmtNV0k9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvaGVhZGVycyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL2hlYWRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZGIwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNF9BcGFjaGVUeXBlLUdldEFydGlmYWN0cy9yZXN1bHRzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvcmVzdWx0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTM2ZWUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDA6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL3Jlc3VsdHMuanNvbiBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE0X0FwYWNoZVR5cGUtR2V0QXJ0aWZhY3RzL3Jlc3VsdHMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBjY2EyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvcmVzdWx0cy5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgImFydGlmYWN0cyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJzdGFydF9hcGFjaGUuc2giLAorICAgICAgInVybCI6ICJodHRwOi8vLiovdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0cy9zdGFydF9hcGFjaGUuc2giCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJpbnN0YWxsX2FwYWNoZS5zaCIsCisgICAgICAidXJsIjogImh0dHA6Ly8uKi92MS9jYXRhbG9nL3Jlc291cmNlcy9hbGllbi5ub2Rlcy5BcGFjaGUvMi4wLjAtU05BUFNIT1QvYXJ0aWZhY3RzL2luc3RhbGxfYXBhY2hlLnNoIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvdG9FeGVjIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTRfQXBhY2hlVHlwZS1HZXRBcnRpZmFjdHMvdG9FeGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZGY4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNF9BcGFjaGVUeXBlLUdldEFydGlmYWN0cy90b0V4ZWMKQEAgLTAsMCArMSBAQAorY3VybCAiaHR0cDovLzE3Mi4yMC40My4xMjQ6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0cyIgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxuIgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTVfQXBhY2hlVHlwZS1Eb3dubG9hZEFydGlmYWN0L2JvZHkudHh0IGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTVfQXBhY2hlVHlwZS1Eb3dubG9hZEFydGlmYWN0L2JvZHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNV9BcGFjaGVUeXBlLURvd25sb2FkQXJ0aWZhY3QvYm9keS50eHQKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC9jb21tYW5kIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTVfQXBhY2hlVHlwZS1Eb3dubG9hZEFydGlmYWN0L2NvbW1hbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4YmNiMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC9jb21tYW5kCkBAIC0wLDAgKzEsMTMgQEAKK2NvbW1hbmQ9ImN1cmwgLW8gXCIvdG1wL3N0YXJ0X2FwYWNoZS5zaFwiIFwiaHR0cDovLyR7Q0FUQUxPR19CRV9IT1NUfToke0NBVEFMT0dfQkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzL2FsaWVuLm5vZGVzLkFwYWNoZS8yLjAuMC1TTkFQU0hPVC9hcnRpZmFjdHMvc3RhcnRfYXBhY2hlLnNoXCIgLXNMIC13IFwiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcXG5cIiAiCisKK2VjaG8gJGNvbW1hbmQgPiB0b0V4ZWMKK2NobW9kICt4IHRvRXhlYworLi90b0V4ZWMKKworCisjJGNvbW1hbmQKKworI2N1cmwgIC1YUE9TVCAiaHR0cDovLyR7Q0FUQUxPR19GRV9IT1NUfToke0NBVEFMT0dfRkVfUE9SVH0vc2RjMi9yZXN0L3YxL2NhdGFsb2cvcmVzb3VyY2VzIiAtZCAiQGJvZHkudHh0IiAtLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtLWhlYWRlciAiSFRUUF9JVl9VU0VSOiBIVFRQX0lWX1VTRVIiIC0taGVhZGVyICJIVFRQX0NTUF9GSVJTVE5BTUU6IEhUVFBfQ1NQX0ZJUlNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgLS1oZWFkZXIgIkhUVFBfSVZfUkVNT1RFX0FERFJFU1M6IEhUVFBfSVZfUkVNT1RFX0FERFJFU1MiIC0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiICAtc0wgLXcgIjole2h0dHBfY29kZX06JXtzaXplX3JlcXVlc3R9IEJZVEVTOiV7dGltZV90b3RhbH0gXFxuIgorCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTVfQXBhY2hlVHlwZS1Eb3dubG9hZEFydGlmYWN0L2NvbW1hbmRUcmlhbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC9jb21tYW5kVHJpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjOGJlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC9jb21tYW5kVHJpYWwKQEAgLTAsMCArMSwxMiBAQAorY29tbWFuZD0iY3VybCBcImh0dHA6Ly8ke0NBVEFMT0dfQkVfSE9TVH06JHtDQVRBTE9HX0JFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcy9hbGllbi5ub2Rlcy5BcGFjaGUvMi4wLjAtU05BUFNIT1QvYXJ0aWZhY3RzXCIgLWQgXCJAYm9keS50eHRcIiIKKyNjb21tYW5kPSIkY29tbWFuZCBgcGFzdGUgLXMgLWRcIiBcIiBoZWFkZXJzYCIKKyNjb21tYW5kPSIkY29tbWFuZCAtc0wgLXcgXCI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcblwiIiAKKworZWNobyAkY29tbWFuZCA+IDEubG9nCisKKyRjb21tYW5kCisKKyNjdXJsICAtWFBPU1QgImh0dHA6Ly8ke0NBVEFMT0dfRkVfSE9TVH06JHtDQVRBTE9HX0ZFX1BPUlR9L3NkYzIvcmVzdC92MS9jYXRhbG9nL3Jlc291cmNlcyIgLWQgIkBib2R5LnR4dCIgLS1oZWFkZXIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgLS1oZWFkZXIgIkhUVFBfSVZfVVNFUjogSFRUUF9JVl9VU0VSIiAtLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIC0taGVhZGVyICJIVFRQX0NTUF9MQVNUTkFNRTogSFRUUF9DU1BfTEFTVE5BTUUiIC0taGVhZGVyICJIVFRQX0lWX1JFTU9URV9BRERSRVNTOiBIVFRQX0lWX1JFTU9URV9BRERSRVNTIiAtLWhlYWRlciAiQ29udGVudC1NRDU6IGBjYXQgY29udGVudE1ENS50eHRgIiAgLXNMIC13ICI6JXtodHRwX2NvZGV9OiV7c2l6ZV9yZXF1ZXN0fSBCWVRFUzole3RpbWVfdG90YWx9IFxcbiIKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC9jb250ZW50TUQ1LnR4dCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC9jb250ZW50TUQ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjNhZjViCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTVfQXBhY2hlVHlwZS1Eb3dubG9hZEFydGlmYWN0L2NvbnRlbnRNRDUudHh0CkBAIC0wLDAgKzEgQEAKK1lUZzJNamc0TVdKaE5tSTVOekJpTnpkbU5HRm1NVFk0T1RsaE5ERmtNV0k9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTVfQXBhY2hlVHlwZS1Eb3dubG9hZEFydGlmYWN0L2hlYWRlcnMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNV9BcGFjaGVUeXBlLURvd25sb2FkQXJ0aWZhY3QvaGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFkYjBjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMvMTVfQXBhY2hlVHlwZS1Eb3dubG9hZEFydGlmYWN0L2hlYWRlcnMKQEAgLTAsMCArMSw4IEBACistLWhlYWRlciAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAKKy0taGVhZGVyICJIVFRQX0lWX1VTRVI6IEhUVFBfSVZfVVNFUiIgCistLWhlYWRlciAiSFRUUF9DU1BfRklSU1ROQU1FOiBIVFRQX0NTUF9GSVJTVE5BTUUiIAorLS1oZWFkZXIgIkhUVFBfQ1NQX0xBU1ROQU1FOiBIVFRQX0NTUF9MQVNUTkFNRSIgCistLWhlYWRlciAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUzogSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIgCistLWhlYWRlciAiSFRUUF9DU1BfV1NUWVBFOiBIVFRQX0NTUF9XU1RZUEUiCistLWhlYWRlciAiVVNFUl9JRDogVVNFUl9JRCIKKy0taGVhZGVyICJDb250ZW50LU1ENTogYGNhdCBjb250ZW50TUQ1LnR4dGAiCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNV9BcGFjaGVUeXBlLURvd25sb2FkQXJ0aWZhY3QvcmVzdWx0cyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC9yZXN1bHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzZlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNV9BcGFjaGVUeXBlLURvd25sb2FkQXJ0aWZhY3QvcmVzdWx0cwpAQCAtMCwwICsxIEBACisuKjoyMDA6Lio6LioKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzLzE1X0FwYWNoZVR5cGUtRG93bmxvYWRBcnRpZmFjdC90b0V4ZWMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNV9BcGFjaGVUeXBlLURvd25sb2FkQXJ0aWZhY3QvdG9FeGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjQ3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy8xNV9BcGFjaGVUeXBlLURvd25sb2FkQXJ0aWZhY3QvdG9FeGVjCkBAIC0wLDAgKzEgQEAKK2N1cmwgLW8gIi90bXAvc3RhcnRfYXBhY2hlLnNoIiAiaHR0cDovLzE3Mi4yMC40My4xMjQ6ODA4MC9zZGMyL3Jlc3QvdjEvY2F0YWxvZy9yZXNvdXJjZXMvYWxpZW4ubm9kZXMuQXBhY2hlLzIuMC4wLVNOQVBTSE9UL2FydGlmYWN0cy9zdGFydF9hcGFjaGUuc2giIC1zTCAtdyAiOiV7aHR0cF9jb2RlfTole3NpemVfcmVxdWVzdH0gQllURVM6JXt0aW1lX3RvdGFsfSBcbiIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL2Vudi9lbnYuc2ggYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9lbnYvZW52LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2JjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9lbnYvZW52LnNoCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorCitleHBvcnQgQ0FUQUxPR19GRV9IT1NUPTAwLjAwMC4wMC4wMAorZXhwb3J0IENBVEFMT0dfRkVfUE9SVD0wMDAwCisKK2V4cG9ydCBDQVRBTE9HX0JFX0hPU1Q9MDAuMDAwLjAwLjAwCitleHBvcnQgQ0FUQUxPR19CRV9QT1JUPTAwMDAKKworIyBFeGFtcGxlCisjZXhwb3J0IENBVEFMT0dfRkVfSE9TVD0xMC4xMTIuMTAuMjIKKyNleHBvcnQgQ0FUQUxPR19GRV9QT1JUPTgwODAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9ydW5UZXN0cy5zaCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzL3J1blRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzBkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9DSS90ZXN0cy9ydW5UZXN0cy5zaApAQCAtMCwwICsxLDkwIEBACisjIS9iaW4vc2gKKworREVCVUc9MAorCitmdW5jdGlvbiBjZEFuZEV4aXQoKSB7CisJY2QgLSA+PiAvZGV2L251bGwKKwlleGl0ICQxCit9CisKK2Z1bmN0aW9uIHVzYWdlKCkgeworCWVjaG8gIiQwIDxlbnZyb25tZW50IGZpbGU+IgorCWV4aXQgMworfQorCisKK2lmIFsgJCMgLW5lIDEgXQordGhlbgorCXVzYWdlCitmaQorCitlbnZGaWxlPSQxCisKK2VjaG8gJGVudkZpbGUKKworc291cmNlICRlbnZGaWxlCisKKyNzb3VyY2UgLi9lbnZDYXRhbG9nQkUuc2gKKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiKioqKioqKioqIENBVEFMT0dfRkVfSE9TVCAgICAkQ0FUQUxPR19GRV9IT1NUICAgICAgICAgICAgIgorZWNobyAiKioqKioqKioqIENBVEFMT0dfRkVfUE9SVCAgICAkQ0FUQUxPR19GRV9QT1JUICAgICAgICAgICAgIiAKK2VjaG8gIioqKioqKioqKiBDQVRBTE9HX0JFX0hPU1QgICAgJENBVEFMT0dfQkVfSE9TVCAgICAgICAgICAgICIKK2VjaG8gIioqKioqKioqKiBDQVRBTE9HX0JFX1BPUlQgICAgJENBVEFMT0dfQkVfUE9SVCAgICAgICAgICAgICIgCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2lmIFtbICR7REVCVUd9IC1lcSAxIF1dCit0aGVuCisJcmVhZCBzdGFtCitmaSAKKworZm9yIGZvbGRlciBpbiAqCitkbworCitpZiBbWyAtZCAkZm9sZGVyICYmICRmb2xkZXIgIT0gImVudiIgXV0KK3RoZW4KKworZWNobyAicHJvY2Vzc2luZyBmb2xkZXIiICRmb2xkZXIKK2NkICRmb2xkZXIKKworY29tbWFuZFJlc3VsdD1gLi9jb21tYW5kYAorCitpZiBbICQ/IC1uZSAwIF0KK3RoZW4KKwkgZWNobyAiY29tbWFuZCAkZm9sZGVyIGZhaWxlZCIKKwkgY2RBbmRFeGl0IDIKK2ZpCisKK2VjaG8gImNvbW1hbmQgcmVzdWx0IGlzICRjb21tYW5kUmVzdWx0IgorcmVzdWx0cz1gY2F0IHJlc3VsdHNgCisKK2VjaG8gIkdvaW5nIHRvIG1hdGNoICRjb21tYW5kUmVzdWx0IHdpdGggcGF0dGVybiAkcmVzdWx0cyIKKworbWF0Y2hOdW1iZXI9YGVjaG8gJGNvbW1hbmRSZXN1bHQgfCBncmVwIC1jICIkcmVzdWx0cyIgYAorZWNobyAkbWF0Y2hOdW1iZXIKK2lmIFsgJG1hdGNoTnVtYmVyIC1lcSAxIF0KK3RoZW4KKwllY2hvICJjb21tYW5kICRmb2xkZXIgc3VjY2VlZC4iCitlbHNlCisJZWNobyAiY29tbWFuZCAkZm9sZGVyIGZhaWxlZC4gR29pbmcgdG8gZXhpdCIKKwljZEFuZEV4aXQgMQkKKwkKK2ZpCisKK2VjaG8gIkZpbmlzaCBwcm9jZXNzaW5nIGZvbGRlciAkZm9sZGVyIgorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKK2NkIC0gPj4gL2Rldi9udWxsCisKKyNpZiBmb2xkZXIKK2ZpCisKKyNsb29wIG9uIGZvbGRlcgorZG9uZQorCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICIqICAgICAgIFNVQ0NFU1MgJHtlbnZGaWxlfSAgICAgICAgICAgICoiCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1mZS9jb25maWd1cmF0aW9uLnlhbWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1mZS9jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiZmVlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jYXRhbG9nLWZlL2NvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDY5IEBACisjIE5lZWRlZCBmb3IgbG9nZ2luZyBwdXJwb3Nlcy4gVG8gYmUgcG9wdWxhdGVkIGJ5IERldk9wcyAtIGN1cnJlbnRseSBkdW1teQorZmVGcWRuOiBhc2RjRmUuYXR0LmNvbQorCisjIGNhdGFsb2cgYmFja2VuZCBob3N0bmFtZQorYmVIb3N0OiBsb2NhbGhvc3QKKworIyBjYXRhbG9nIGJhY2tlbmQgaHR0cCBwb3J0CitiZUh0dHBQb3J0OiA4MTgxCisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgY29udGV4dAorYmVDb250ZXh0OiAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL3Jlc291cmNlcworCisjIGNhdGFsb2cgYmFja2VuZCBwcm90b2NvbAorYmVQcm90b2NvbDogaHR0cAorCisjIGNhdGFsb2cgYmFja2VuZCBzc2wgcG9ydAorYmVTc2xQb3J0OiA4NDQzCisKKyMgdGhyZWFkcG9vbCBzaXplIGZvciBoYW5kbGluZyByZXF1ZXN0cwordGhyZWFkcG9vbFNpemU6IDUwIAorCisjIHJlcXVlc3QgcHJvY2Vzc2luZyB0aW1lb3V0IChzZWNvbmRzKQorcmVxdWVzdFRpbWVvdXQ6IDEwCisKKyMgYTRjIGhvc3RuYW1lCithNGNIb3N0OiBsb2NhbGhvc3QKKworIyBhNGMgaHR0cCBwb3J0CithNGNIdHRwUG9ydDogODA4OAorCisKK2lkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOiAKKyAgIC0KKyAgICAgICAgLSAmSFRUUF9JVl9VU0VSIEhUVFBfSVZfVVNFUgorICAgICAgICAtICZpdi11c2VyIGl2LXVzZXIKKyAgIC0KKyAgICAgICAgLSAmVVNFUl9JRCBVU0VSX0lECisgICAgICAgIC0gJmNzcC11c2VySWQgY3NwLXVzZXJJZAorICAgLSAgIAorICAgICAgICAtICZIVFRQX0NTUF9XU1RZUEUgSFRUUF9DU1BfV1NUWVBFIAorICAgICAgICAtICZjc3Atd3N0eXBlIGNzcC13c3R5cGUKKworb3B0aW9uYWxIZWFkZXJGaWVsZHM6IAorICAgLQorICAgICAgICAtICZIVFRQX0NTUF9GSVJTVE5BTUUgSFRUUF9DU1BfRklSU1ROQU1FCisgICAgICAgIC0gJmNzcC1maXJzdG5hbWUgY3NwLWZpcnN0bmFtZQorICAgLQorICAgICAgICAtICZIVFRQX0NTUF9MQVNUTkFNRSBIVFRQX0NTUF9MQVNUTkFNRQorICAgICAgICAtICZjc3AtbGFzdG5hbWUgY3NwLWxhc3RuYW1lCisgICAtCisgICAgICAgIC0gJkhUVFBfSVZfUkVNT1RFX0FERFJFU1MgSFRUUF9JVl9SRU1PVEVfQUREUkVTUworICAgICAgICAtICZpdi1yZW1vdGUtYWRkcmVzcyBpdi1yZW1vdGUtYWRkcmVzcworCisKK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKworIyBDb25uZWN0aW9uIHBhcmFtZXRlcnMKK2Nvbm5lY3Rpb246CisgICAgdXJsOiBqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYvZGIKKyAgICBwb29sU2l6ZTogMTcKKworIyBQcm90b2NvbHMKK3Byb3RvY29sczoKKyAgIC0gaHR0cAorICAgLSBodHRwcworCisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1mZS9yZXN0LWNvbmZpZ3VyYXRpb24taW5mby55YW1sIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctZmUvcmVzdC1jb25maWd1cmF0aW9uLWluZm8ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU1OWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctZmUvcmVzdC1jb25maWd1cmF0aW9uLWluZm8ueWFtbApAQCAtMCwwICsxLDEyIEBACisjIHJlc3QgcmVhZCB0aW1lb3V0IC0gbWVhbnMgbm8gdGltZW91dAorcmVhZFRpbWVvdXRJblNlYzogMAorCisjIHdoZXRoZXIgdG8gaWdub3JlIGNlcnRpZmljYXRlCitpZ25vcmVDZXJ0aWZpY2F0ZTogZmFsc2UKKworIyB0aGUgY29ubmVjdGlvbiBwb29sIHNpemUKK2Nvbm5lY3Rpb25Qb29sU2l6ZTogMTAgCisKKyMgY3JlYXRlIGNvbm5lY3Rpb24gdGltZW91dAorY29ubmVjdFRpbWVvdXRJblNlYzogMTIKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZ3VyYXRpb24xLnlhbWwgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY29uZmlndXJhdGlvbjEueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFiMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZ3VyYXRpb24xLnlhbWwKQEAgLTAsMCArMSwxNyBAQAordmVyc2lvbjogMS4wCityZWxlYXNlZDogMjAxMi0xMS0zMAorCisjIENvbm5lY3Rpb24gcGFyYW1ldGVycworY29ubmVjdGlvbjoKKyAgICB1cmw6IGpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNi9kYgorICAgIHBvb2xTaXplOiA1CisKKyMgUHJvdG9jb2xzCitwcm90b2NvbHM6CisgICAtIGh0dHAKKyAgIC0gaHR0cHMKKworIyBVc2VycwordXNlcnM6CisgICAgdG9tOiBwYXNzd2QKKyAgICBib2I6IHBhc3N3ZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9zYW1wbGUueWFtbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9zYW1wbGUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFiMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL3NhbXBsZS55YW1sCkBAIC0wLDAgKzEsMTcgQEAKK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKworIyBDb25uZWN0aW9uIHBhcmFtZXRlcnMKK2Nvbm5lY3Rpb246CisgICAgdXJsOiBqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYvZGIKKyAgICBwb29sU2l6ZTogNQorCisjIFByb3RvY29scworcHJvdG9jb2xzOgorICAgLSBodHRwCisgICAtIGh0dHBzCisKKyMgVXNlcnMKK3VzZXJzOgorICAgIHRvbTogcGFzc3dkCisgICAgYm9iOiBwYXNzd2QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvc2FtcGxlTm9Qcm90b2NvbC55YW1sIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL3NhbXBsZU5vUHJvdG9jb2wueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk3MjMyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL3NhbXBsZU5vUHJvdG9jb2wueWFtbApAQCAtMCwwICsxLDE3IEBACit2ZXJzaW9uOiAxLjAKK3JlbGVhc2VkOiAyMDEyLTExLTMwCisKKyMgQ29ubmVjdGlvbiBwYXJhbWV0ZXJzCitjb25uZWN0aW9uOgorICAgIHVybDogamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2L2RiCisgICAgcG9vbFNpemU6IDUKKworIyBQcm90b2NvbHMKKyNwcm90b2NvbHM6CisjICAgLSBodHRwCisjICAgLSBodHRwcworCisjIFVzZXJzCit1c2VyczoKKyAgICB0b206IHBhc3N3ZAorICAgIGJvYjogcGFzc3dkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nYmFjay10ZXN0LnhtbCBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjMTc3OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWwKQEAgLTAsMCArMSwyIEBACis8IS0tIG9ubHkgb25lIGxpbmUsIHNodXQgdXAgbG9nYmFjayAhIC0tPgorPGNvbmZpZ3VyYXRpb24gLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLWZlL3NyYy90ZXN0L3NwZWMvY29kZVNwZWMuanMgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3NwZWMvY29kZVNwZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiNWRhMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3Qvc3BlYy9jb2RlU3BlYy5qcwpAQCAtMCwwICsxLDE5NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitkZXNjcmliZSgiR2VuZXJhbCIsIGZ1bmN0aW9uKCkgeworCQorCQorCQorCWRlc2NyaWJlKCJGaWxlIEhhbmRsZXIiLCBmdW5jdGlvbigpIHsKKwkJCisJCXZhciBqc0hhbmRsZXIgPSBuZXcgSnNIYW5kbGVyKCk7CisJCXZhciBmaWxlSGFuZGxlciA9IGpzSGFuZGxlci5nZXRGaWxlSGFuZGxlcigpOworCQlmaWxlSGFuZGxlci5maWxlQ29udGVudHMuZmlsZVRvVXBsb2FkID0gbXlzcWxUeXBlWW1sOworCQlmaWxlSGFuZGxlci5maWxlQ29udGVudHMuYXJ0aWZhY3RUb1VwbG9hZCA9IGluc3RhbGxNeVNxbFNIOworCQkKKwkJCisJCWRlc2NyaWJlKCJjaGVja0ZpbGUgTWV0aG9kIiwgZnVuY3Rpb24oKSB7CisJCisJCQlpdCgiY2hlY2tGaWxlIFZhbGlkIiwgZnVuY3Rpb24oKSB7CisJCQkJc3B5T24od2luZG93LCAnYWxlcnQnKTsKKwkJCQkKKwkJCQlhZmZpeCgnI2R1bW15RWxlbWVudCcpLnZhbCgnc3RhbS56aXAnKTsKKwkJCQl2YXIgaXNWYWxpZCA9IGZpbGVIYW5kbGVyLmNoZWNrRmlsZShmaWxlSGFuZGxlci5maWxlc0V4dGVuc2lvbnMuY2hlZiwgJ2R1bW15RWxlbWVudCcpOworCQkJCWV4cGVjdChpc1ZhbGlkKS50b0JlVHJ1dGh5KCk7CisJCQkJCisJCQkJCisJCQkJJCgnI2R1bW15RWxlbWVudCcpLnZhbCgnc3RhbS5zaCcpOworCQkJCXZhciBpc1ZhbGlkID0gZmlsZUhhbmRsZXIuY2hlY2tGaWxlKGZpbGVIYW5kbGVyLmZpbGVzRXh0ZW5zaW9ucy5zaGVsbCwgJ2R1bW15RWxlbWVudCcpOworCQkJCWV4cGVjdChpc1ZhbGlkKS50b0JlVHJ1dGh5KCk7CisJCQkJCisJCQkJJCgnI2R1bW15RWxlbWVudCcpLnZhbCgnc3RhbS5wcCcpOworCQkJCXZhciBpc1ZhbGlkID0gZmlsZUhhbmRsZXIuY2hlY2tGaWxlKGZpbGVIYW5kbGVyLmZpbGVzRXh0ZW5zaW9ucy5wdXBwZXQsICdkdW1teUVsZW1lbnQnKTsKKwkJCQlleHBlY3QoaXNWYWxpZCkudG9CZVRydXRoeSgpOworCQkJCQorCQkJCSQoJyNkdW1teUVsZW1lbnQnKS52YWwoJ3N0YW0ueWFuZycpOworCQkJCXZhciBpc1ZhbGlkID0gZmlsZUhhbmRsZXIuY2hlY2tGaWxlKGZpbGVIYW5kbGVyLmZpbGVzRXh0ZW5zaW9ucy55YW5nLCAnZHVtbXlFbGVtZW50Jyk7CisJCQkJZXhwZWN0KGlzVmFsaWQpLnRvQmVUcnV0aHkoKTsKKwkJCQkKKwkJCQkKKwkJCisJCQl9KTsKKwkJCQorCQkJaXQoImNoZWNrRmlsZSBpblZhbGlkIiwgZnVuY3Rpb24oKSB7CisJCQkJc3B5T24od2luZG93LCAnYWxlcnQnKTsKKwkJCQkKKwkJCQlhZmZpeCgnI2R1bW15RWxlbWVudCcpLnZhbCgnc3RhbS56aXAnKTsKKwkJCQl2YXIgaXNWYWxpZCA9IGZpbGVIYW5kbGVyLmNoZWNrRmlsZShmaWxlSGFuZGxlci5maWxlc0V4dGVuc2lvbnMuc2hlbGwsICdkdW1teUVsZW1lbnQnKTsKKwkJCQlleHBlY3QoaXNWYWxpZCkudG9CZUZhbHN5KCk7CisJCQkJCisJCQkJJCgnI2R1bW15RWxlbWVudCcpLnZhbCgnc3RhbS5zaCcpOworCQkJCXZhciBpc1ZhbGlkID0gZmlsZUhhbmRsZXIuY2hlY2tGaWxlKGZpbGVIYW5kbGVyLmZpbGVzRXh0ZW5zaW9ucy5jaGVmLCAnZHVtbXlFbGVtZW50Jyk7CisJCQkJZXhwZWN0KGlzVmFsaWQpLnRvQmVGYWxzeSgpOworCQkJCQorCQkJCXZhciBpc1ZhbGlkID0gZmlsZUhhbmRsZXIuY2hlY2tGaWxlKGZpbGVIYW5kbGVyLmZpbGVzRXh0ZW5zaW9ucy5wdXBwZXQsICdkdW1teUVsZW1lbnQnKTsKKwkJCQlleHBlY3QoaXNWYWxpZCkudG9CZUZhbHN5KCk7CisJCQkJCisJCQkJdmFyIGlzVmFsaWQgPSBmaWxlSGFuZGxlci5jaGVja0ZpbGUoZmlsZUhhbmRsZXIuZmlsZXNFeHRlbnNpb25zLnlhbmcsICdkdW1teUVsZW1lbnQnKTsKKwkJCQlleHBlY3QoaXNWYWxpZCkudG9CZUZhbHN5KCk7CisJCQkJCQkJCQkJCQkKKwkJCX0pOworCQkJCisJCX0pOworCQkKKwkJCisJCQorCQlkZXNjcmliZSgiZ2V0WmlwTmFtZSBNZXRob2QiLCBmdW5jdGlvbigpIHsKKwkJCWl0KCJnZXRaaXBOYW1lIiwgZnVuY3Rpb24oKSB7CisJCQkJc3B5T24oZmlsZUhhbmRsZXIsICdnZXRGaWxlTmFtZScpLmFuZC5yZXR1cm5WYWx1ZSgnbXlzcWwtdHlwZS55bWwnKTsKKwkJCQlleHBlY3QoZmlsZUhhbmRsZXIuZ2V0WmlwTmFtZSgpID09ICdteXNxbC10eXBlLnppcCcpLnRvQmVUcnV0aHkoKTsKKwkJCX0pOworCQl9KTsKKwkJLyoKKwkJZGVzY3JpYmUoImdlbmVyYXRlQXJ0aWZhY3RzTGlzdCBNZXRob2QiLCBmdW5jdGlvbigpIHsKKwkJCWJlZm9yZUVhY2goZnVuY3Rpb24oKSB7CisJCQkJanNIYW5kbGVyLmdldERvbUhhbmRsZXIoKS5leGlzaXRuZ0FyaWZhY3RzQ291bnRlciA9IDI7CisJCQl9KTsKKwkJCQorCQkJaXQoImdlbmVyYXRlQXJ0aWZhY3RzTGlzdCIsIGZ1bmN0aW9uKCkgeworCQkJCXNweU9uKGZpbGVIYW5kbGVyLCAnZ2V0RmlsZU5hbWUnKS5hbmQucmV0dXJuVmFsdWUoJ215c3FsLXR5cGUueW1sJyk7CisJCQkJdmFyIGFydGlmYWN0TGlzdCA9IGZpbGVIYW5kbGVyLmdlbmVyYXRlQXJ0aWZhY3RzTGlzdCgpOworLy8JCQkJZXhwZWN0KGZpbGVIYW5kbGVyLmdlbmVyYXRlQXJ0aWZhY3RzTGlzdCgpID09ICdteXNxbC10eXBlLnppcCcpLnRvQmVUcnV0aHkoKTsKKwkJCX0pOworCQl9KTsqLworCQkKKwkJZGVzY3JpYmUoImdldEFydGlmYWN0c0xpc3RGcm9tWW1sIE1ldGhvZCIsIGZ1bmN0aW9uKCkgeworCQkJaXQoImdldEFydGlmYWN0c0xpc3RGcm9tWW1sIiwgZnVuY3Rpb24oKSB7CisJCQkJdmFyIGV4cGVjdGVkQXJ0aWZhY3RzID0gZmlsZUhhbmRsZXIuZ2V0QXJ0aWZhY3RzTGlzdEZyb21ZbWwoKTsKKwkJCQlleHBlY3QoZXhwZWN0ZWRBcnRpZmFjdHMubGVuZ3RoID09IDMpLnRvQmVUcnV0aHkoKTsKKwkJCQlleHBlY3QoJC5pbkFycmF5KCdzY3JpcHRzL2luc3RhbGxfbXlzcWwuc2gnLCBleHBlY3RlZEFydGlmYWN0cykgIT0gLTEpLnRvQmVUcnV0aHkoKTsKKwkJCQlleHBlY3QoJC5pbkFycmF5KCdzY3JpcHRzL3N0YXJ0X215c3FsLnNoJywgZXhwZWN0ZWRBcnRpZmFjdHMpICE9IC0xKS50b0JlVHJ1dGh5KCk7CisJCQkJZXhwZWN0KCQuaW5BcnJheSgnaW1hZ2VzL215c3FsLnBuZycsIGV4cGVjdGVkQXJ0aWZhY3RzKSAhPSAtMSkudG9CZVRydXRoeSgpOworCQkJfSk7CisJCX0pOworCQkKKwkJZGVzY3JpYmUoInVwbG9hZEZpbGVKc29uIE1ldGhvZCIsIGZ1bmN0aW9uKCkgeworCQkJdmFyIHNlbnRKc29uLCBzZW5kRW5jb2RlZE1kNTsKKwkJCQorCQkJYmVmb3JlRWFjaChmdW5jdGlvbigpIHsKKwkJCQlzZW50SnNvbiA9ICcnOworCQkJCXNlbmRFbmNvZGVkTWQ1ID0gJyc7CisJCQkJc3B5T24oZmlsZUhhbmRsZXIsICdzZW5kQWpheFRvU2VydmVyJykuYW5kLmNhbGxGYWtlKGZ1bmN0aW9uKHN0cmlmaWVkSnNvbiwgZW5jb2RlZE1kNSkgeworCQkJCQlzZW50SnNvbiA9IEpTT04ucGFyc2Uoc3RyaWZpZWRKc29uKTsKKwkJCQkJc2VuZEVuY29kZWRNZDUgPSBlbmNvZGVkTWQ1OworCisJCQkJfSk7CisJCQkJc3B5T24oZmlsZUhhbmRsZXIsICdnZXRaaXBOYW1lJykuYW5kLmNhbGxGYWtlKGZ1bmN0aW9uKCkgeyByZXR1cm4gJ2Zha2VaaXBOYW1lLnppcCcgfSk7CisJCQkJc3B5T24oZmlsZUhhbmRsZXIsICdnZW5lcmF0ZUFydGlmYWN0c0xpc3QnKS5hbmQuY2FsbEZha2UoZnVuY3Rpb24oKSB7IHJldHVybiAnZmFrZUFydGlmYWN0c0xpc3QnIH0pOworCQkJCXNweU9uKGZpbGVIYW5kbGVyLCAnZ2VuZXJhdGVaaXAnKS5hbmQuY2FsbEZha2UoZnVuY3Rpb24oKSB7IHJldHVybiAnZmFrZUVuY29kZWRaaXBEYXRhJyB9KTsKKwkJCX0pOworCQkJCisJCQlpdCgic2VuZEFqYXhUb1NlcnZlciBtZXRob2QgaXMgY2FsbGVkIiwgZnVuY3Rpb24oKSB7CisJCQkJZmlsZUhhbmRsZXIudXBsb2FkRmlsZUpzb24oKTsKKwkJCQlleHBlY3QoZmlsZUhhbmRsZXIuc2VuZEFqYXhUb1NlcnZlcikudG9IYXZlQmVlbkNhbGxlZCgpOworCQkJfSk7CisJCQkKKwkJCWl0KCJqc29uIGNvbnRhaW5zIHJlbGV2YW50IGZpZWxkcyIsIGZ1bmN0aW9uKCkgeworCQkJCWZpbGVIYW5kbGVyLnVwbG9hZEZpbGVKc29uKCk7CisJCQkJCisJCQkJZXhwZWN0KHNlbnRKc29uLnBheWxvYWROYW1lID09ICdmYWtlWmlwTmFtZS56aXAnKS50b0JlVHJ1dGh5KCk7CisJCQkJZXhwZWN0KHNlbnRKc29uLmlzRW5jb2RlZCkudG9CZVRydXRoeSgpOworCQkJCWV4cGVjdChzZW50SnNvbi5pc0NvbXByZXNzZWQpLnRvQmVUcnV0aHkoKTsKKwkJCQlleHBlY3Qoc2VudEpzb24uYXJ0aWZhY3RMaXN0ID09ICdmYWtlQXJ0aWZhY3RzTGlzdCcpLnRvQmVUcnV0aHkoKTsKKwkJCQlleHBlY3Qoc2VudEpzb24ucGF5bG9hZERhdGEgPT0gJ2Zha2VFbmNvZGVkWmlwRGF0YScpLnRvQmVUcnV0aHkoKTsKKwkJCQkKKwkJCQkKKwkJCQkKKwkJCX0pOworCQkJCisJCQlpdCgibWQ1IGlzIHZhbGlkYXRlZCIsIGZ1bmN0aW9uKCkgeworCQkJCWZpbGVIYW5kbGVyLnVwbG9hZEZpbGVKc29uKCk7CisJCQkJCisJCQkJdmFyIHN0cmlmaWVkSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNlbnRKc29uKTsKKwkJCQl2YXIgbWQ1ID0gQ3J5cHRvSlMuTUQ1KHN0cmlmaWVkSnNvbik7CisJCQkJdmFyIGVuY29kZWRNZDUgPSBidG9hKG1kNSk7CisJCQkJZXhwZWN0KGVuY29kZWRNZDUgPT0gc2VuZEVuY29kZWRNZDUpLnRvQmVUcnV0aHkoKTsKKwkJCQkKKwkJCX0pOworCQl9KTsKKwkJCisJCWRlc2NyaWJlKCJnZW5lcmF0ZVppcCBNZXRob2QiLCBmdW5jdGlvbigpIHsKKwkJCQorCQkJaXQoImdlbmVyYXRlWmlwIiwgZnVuY3Rpb24oKSB7CisJCQkJCisJCQkJCisJCQkJc3B5T24oZmlsZUhhbmRsZXIsICdnZXRGaWxlTmFtZScpLmFuZC5jYWxsRmFrZShmdW5jdGlvbihjb250cm9OYW1lKSB7CisJCQkJCXZhciBmaWxlTmFtZTsKKwkJCQkJaWYoIGNvbnRyb05hbWUgPT0gJ2ZpbGVUb1VwbG9hZCcpeworCQkJCQkJZmlsZU5hbWUgPSAnbXlzcWwtdHlwZS55bWwnOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGNvbnRyb05hbWUgPT0gICdpbWFnZVRvVXBsb2FkJyl7CisJCQkJCQlmaWxlTmFtZSA9ICdyb290LnBuZyc7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggY29udHJvTmFtZSA9PSAgJ2FydGlmYWN0VG9VcGxvYWQnKXsKKwkJCQkJCWZpbGVOYW1lID0gJ2luc3RhbGxfbXlzcWwuc2gnOworCQkJCQl9CisJCQkJCWVsc2V7CisJCQkJCQlmaWxlTmFtZSA9IGNvbnRyb05hbWUrJy5zaCc7CisJCQkJCX0KKwkJCQkgICAgcmV0dXJuIGZpbGVOYW1lOworCQkJICAgIH0pOworCQkJCQorCQkJCXZhciBlbmNvZGVkWmlwID0gZmlsZUhhbmRsZXIuZ2VuZXJhdGVaaXAoKTsKKwkJCQl2YXIgZGVjb2RlZFppcCA9IGF0b2IoZW5jb2RlZFppcCk7CisJCQkJdmFyIG15WmlwID0gbmV3IEpTWmlwKGRlY29kZWRaaXApOworCQkJCQorCQkJCXZhciBjb21wb25lbnRDb250ZW50SW5aaXAgPSBteVppcC5maWxlKCdteXNxbC10eXBlLnltbCcpLmFzVGV4dCgpOworCQkJCWV4cGVjdChjb21wb25lbnRDb250ZW50SW5aaXAgPT0gbXlzcWxUeXBlWW1sKS50b0JlVHJ1dGh5KCk7CisJCQkJCisJCQkJdmFyIGFydGlmYWN0Q29udGVudEluWmlwID0gbXlaaXAuZm9sZGVyKCdzY3JpcHRzJykuZmlsZSgnaW5zdGFsbF9teXNxbC5zaCcpLmFzVGV4dCgpOworCQkJCWV4cGVjdChhcnRpZmFjdENvbnRlbnRJblppcCA9PSBpbnN0YWxsTXlTcWxTSCkudG9CZVRydXRoeSgpOworCQkJCQorCQkJCQorCQkJCQorCQkJfSk7CisJCX0pOworCX0pOworCQorCQorfSk7CisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS9zcmMvdGVzdC90ZXN0U2NyaXB0cy9maWxlc0NvbnRlbnRzLmpzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC90ZXN0U2NyaXB0cy9maWxlc0NvbnRlbnRzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTdhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLWZlL3NyYy90ZXN0L3Rlc3RTY3JpcHRzL2ZpbGVzQ29udGVudHMuanMKQEAgLTAsMCArMSwyMDcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordmFyIG5vcm1hdGl2ZVR5cGVzUm9vdFltbCA9ICJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzIisKKworInRlbXBsYXRlX25hbWU6IHRvc2NhLW5vcm1hdGl2ZS10eXBlcy1yb290IisKKyJ0ZW1wbGF0ZV9hdXRob3I6IFRPU0NBIFRDIisKKyJ0ZW1wbGF0ZV92ZXJzaW9uOiAxLjAuMC53ZDAzLVNOQVBTSE9UIisKKyJkZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIG5vcm1hdGl2ZSB0eXBlcyBkZWZpbml0aW9uLiIrCisibm9kZV90eXBlczoiKworIiAgdG9zY2Eubm9kZXMuUm9vdDoiKworIiAgICBhYnN0cmFjdDogdHJ1ZSIrCisiICAgIGRlc2NyaXB0aW9uOiA+IisKKyIgICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IChyb290KSBUT1NDQSBOb2RlIFR5cGUgdGhhdCBhbGwgb3RoZXIgVE9TQ0Egbm9kZXMgc2hvdWxkIGV4dGVuZHMuIisKKyIgICAgICBUaGlzIGFsbG93cyBhbGwgVE9TQ0Egbm9kZXMgdG8gaGF2ZSBhIGNvbnNpc3RlbnQgc2V0IG9mIGZlYXR1cmVzIGZvciBtb2RlbGluZyBhbmQgbWFuYWdlbWVudCIrCisiICAgICAgKGUuZywgY29uc2lzdGVudCBkZWZpbml0aW9ucyBmb3IgcmVxdWlyZW1lbnRzLCBjYXBhYmlsaXRpZXMsIGFuZCBsaWZlY3ljbGUgaW50ZXJmYWNlcykuIisKKyIgICAgdGFnczoiKworIiAgICAgIGljb246IC9pbWFnZXMvcm9vdC5wbmciKworIiAgICBhdHRyaWJ1dGVzOiIrCisiICAgICAgdG9zY2FfaWQ6IisKKyIgICAgICAgIHR5cGU6IHN0cmluZyIrCisiICAgICAgdG9zY2FfbmFtZToiKworIiAgICAgICAgdHlwZTogc3RyaW5nIisKKyIgICAgcmVxdWlyZW1lbnRzOiIrCisiICAgICAgZGVwZW5kZW5jeToiKworIiAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlJvb3QiKworIiAgICAgICAgbG93ZXJfYm91bmQ6IDAiKworIiAgICAgICAgdXBwZXJfYm91bmQ6IHVuYm91bmRlZCIrCisiICAgIGNhcGFiaWxpdGllczoiKworIiAgICAgIHJvb3Q6IisKKyIgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Sb290IisKKyIgICAgaW50ZXJmYWNlczoiKworIiAgICAgIHRvc2NhLmludGVyZmFjZXMubm9kZS5saWZlY3ljbGUuU3RhbmRhcmQ6IisKKyIgICAgICAgIGRlc2NyaXB0aW9uOiA+IisKKyIgICAgICAgICAgVGhpcyBsaWZlY3ljbGUgaW50ZXJmYWNlIGRlZmluZXMgdGhlIGVzc2VudGlhbCwgbm9ybWF0aXZlIG9wZXJhdGlvbnMgdGhhdCBUT1NDQSBub2RlcyBtYXkgc3VwcG9ydC4iKworIiAgICAgICAgY3JlYXRlOiIrCisiICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgY3JlYXRlIG9wZXJhdGlvbi4iKworIiAgICAgICAgY29uZmlndXJlOiIrCisiICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgY29uZmlndXJlIG9wZXJhdGlvbiAocHJlLXN0YXJ0KS4iKworIiAgICAgICAgc3RhcnQ6IisKKyIgICAgICAgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBzdGFydCBvcGVyYXRpb24uIisKKyIgICAgICAgIHBvc3Rfc3RhcnQ6IisKKyIgICAgICAgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBwb3N0LWNvbmZpZ3VyZSBvcGVyYXRpb24gKHBvc3Qtc3RhcnQpIisKKyIgICAgICAgIHN0b3A6IisKKyIgICAgICAgICAgZGVzY3JpcHRpb246IFN0YW5kYXJkIGxpZmVjeWNsZSBzdG9wIG9wZXJhdGlvbi4iKworIiAgICAgICAgZGVsZXRlOiIrCisiICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdGFuZGFyZCBsaWZlY3ljbGUgZGVsZXRlIG9wZXJhdGlvbi4iKworImNhcGFiaWxpdHlfdHlwZXM6IisKKyIgIHRvc2NhLmNhcGFiaWxpdGllcy5Sb290OiIrCisiICAgIGRlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBkZWZhdWx0IChyb290KSBUT1NDQSBDYXBhYmlsaXR5IFR5cGUgZGVmaW5pdGlvbiB0aGF0IGFsbCBvdGhlciBUT1NDQSBDYXBhYmlsaXR5IFR5cGVzIGRlcml2ZSBmcm9tLiIrCisicmVsYXRpb25zaGlwX3R5cGVzOiIrCisiICB0b3NjYS5yZWxhdGlvbnNoaXBzLlJvb3Q6IisKKyIgICAgYWJzdHJhY3Q6IHRydWUiKworIiAgICBkZXNjcmlwdGlvbjogVGhpcyBpcyB0aGUgZGVmYXVsdCAocm9vdCkgVE9TQ0EgUmVsYXRpb25zaGlwIFR5cGUgZGVmaW5pdGlvbiB0aGF0IGFsbCBvdGhlciBUT1NDQSBSZWxhdGlvbnNoaXAgVHlwZXMgZGVyaXZlIGZyb20uIisKKyIgICAgdmFsaWRfdGFyZ2V0czogWyB0b3NjYS5jYXBhYmlsaXRpZXMuUm9vdCBdIisKKyIgICAgYXR0cmlidXRlczoiKworIiAgICAgIHRvc2NhX2lkOiIrCisiICAgICAgICB0eXBlOiBzdHJpbmciKworIiAgICAgIHRvc2NhX25hbWU6IisKKyIgICAgICAgIHR5cGU6IHN0cmluZyIrCisiICAgIGludGVyZmFjZXM6IisKKyIgICAgICB0b3NjYS5pbnRlcmZhY2VzLnJlbGF0aW9uc2hpcC5Db25maWd1cmU6IisKKyIgICAgICAgIGRlc2NyaXB0aW9uOiA+IisKKyIgICAgICAgICAgVGhlIGxpZmVjeWNsZSBpbnRlcmZhY2VzIGRlZmluZSB0aGUgZXNzZW50aWFsLCBub3JtYXRpdmUgb3BlcmF0aW9ucyB0aGF0IGVhY2ggVE9TQ0EgUmVsYXRpb25zaGlwIFR5cGVzIG1heSBzdXBwb3J0LiIrCisiICAgICAgICBwcmVfY29uZmlndXJlX3NvdXJjZToiKworIiAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIHByZS1jb25maWd1cmUgdGhlIHNvdXJjZSBlbmRwb2ludC4iKworIiAgICAgICAgcHJlX2NvbmZpZ3VyZV90YXJnZXQ6IisKKyIgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBwcmUtY29uZmlndXJlIHRoZSB0YXJnZXQgZW5kcG9pbnQuIisKKyIgICAgICAgIHBvc3RfY29uZmlndXJlX3NvdXJjZToiKworIiAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIHBvc3QtY29uZmlndXJlIHRoZSBzb3VyY2UgZW5kcG9pbnQuIisKKyIgICAgICAgIHBvc3RfY29uZmlndXJlX3RhcmdldDoiKworIiAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIHBvc3QtY29uZmlndXJlIHRoZSB0YXJnZXQgZW5kcG9pbnQuIisKKyIgICAgICAgIGFkZF90YXJnZXQ6IisKKyIgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgdGhlIHNvdXJjZSBub2RlIG9mIGEgdGFyZ2V0IG5vZGUgYmVpbmcgYWRkZWQgdmlhIGEgcmVsYXRpb25zaGlwLiIrCisiICAgICAgICBhZGRfc291cmNlOiIrCisiICAgICAgICAgIGRlc2NyaXB0aW9uOiBPcGVyYXRpb24gdG8gbm90aWZ5IHRoZSB0YXJnZXQgbm9kZSBvZiBhIHNvdXJjZSBub2RlIHdoaWNoIGlzIG5vdyAgYXZhaWxhYmxlIHZpYSBhIHJlbGF0aW9uc2hpcC4iKworIiAgICAgICAgcmVtb3ZlX3RhcmdldDoiKworIiAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIG5vdGlmeSB0aGUgc291cmNlIG5vZGUgb2YgYSB0YXJnZXQgbm9kZSBiZWluZyByZW1vdmVkIGZyb20gYSByZWxhdGlvbnNoaXAuIisKKyIgICAgICAgIHJlbW92ZV9zb3VyY2U6IisKKyIgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgdGhlIHRhcmdldCBub2RlIG9mIGEgc291cmNlIG5vZGUgYmVpbmcgcmVtb3ZlZCBmcm9tIGEgcmVsYXRpb25zaGlwLiIrCisiICAgICAgICB0YXJnZXRfY2hhbmdlZDoiKworIiAgICAgICAgICBkZXNjcmlwdGlvbjogT3BlcmF0aW9uIHRvIG5vdGlmeSBzb3VyY2Ugc29tZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldC4iKworIiAgICAgICAgc291cmNlX2NoYW5nZWQ6IisKKyIgICAgICAgICAgZGVzY3JpcHRpb246IE9wZXJhdGlvbiB0byBub3RpZnkgdGFyZ2V0IHNvbWUgcHJvcGVydHkgb3IgYXR0cmlidXRlIG9mIHRoZSBzb3VyY2UuIisKKyJhcnRpZmFjdF90eXBlczoiKworIiAgdG9zY2EuYXJ0aWZhY3RzLlJvb3Q6IisKKyIgICAgZGVzY3JpcHRpb246IFRoZSBUT1NDQSBBcnRpZmFjdCBUeXBlIGFsbCBvdGhlciBUT1NDQSBBcnRpZmFjdCBUeXBlcyBkZXJpdmUgZnJvbS4iOworCisKK3ZhciBteXNxbFR5cGVZbWwgPSAKKyJ0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMF93ZDAzIisKKyJkZXNjcmlwdGlvbjogTXlTUUwgUkRCTVMgaW5zdGFsbGF0aW9uIG9uIGEgc3BlY2lmaWMgbW91bnRlZCB2b2x1bWUgcGF0aC4iKworInRlbXBsYXRlX25hbWU6IG15c3FsLXR5cGUiKworInRlbXBsYXRlX3ZlcnNpb246IDIuMC4wLVNOQVBTSE9UIisKKyJ0ZW1wbGF0ZV9hdXRob3I6IEZhc3RDb25uZWN0IisKKworImltcG9ydHM6IisKKycgIC0gInRvc2NhLW5vcm1hdGl2ZS10eXBlczoxLjAuMC53ZDAzLVNOQVBTSE9UIicrCisKKyJub2RlX3R5cGVzOiIrCisiICBhbGllbi5ub2Rlcy5NeXNxbDoiKworIiAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLkRhdGFiYXNlIisKKyIgICAgZGVzY3JpcHRpb246ID4iKworIiAgICAgIEEgbm9kZSB0byBpbnN0YWxsIE15U1FMIHY1LjUgZGF0YWJhc2Ugd2l0aCBkYXRhIisKKyIgICAgICBvbiBhIHNwZWNpZmljIGF0dGFjaGVkIHZvbHVtZS4iKworIiAgICBjYXBhYmlsaXRpZXM6IisKKyIgICAgICBob3N0OiIrCisiICAgICAgICB0eXBlOiBhbGllbi5jYXBhYmlsaXRpZXMuTXlzcWxEYXRhYmFzZSIrCisiICAgICAgICBwcm9wZXJ0aWVzOiIrCisiICAgICAgICAgIHZhbGlkX25vZGVfdHlwZXM6IFsgdG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24gXSIrCisiICAgIHJlcXVpcmVtZW50czoiKworIiAgICAgIC0gaG9zdDogdG9zY2Eubm9kZXMuQ29tcHV0ZSIrCisiICAgICAgICB0eXBlOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIisKKyIgICAgdGFnczoiKworIiAgICAgIGljb246IC9pbWFnZXMvbXlzcWwucG5nIisKKyIgICAgcHJvcGVydGllczoiKworIiAgICAgIGRiX3BvcnQ6IisKKyIgICAgICAgIHR5cGU6IGludGVnZXIiKworIiAgICAgICAgZGVmYXVsdDogMzMwNiIrCisiICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHBvcnQgb24gd2hpY2ggdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugc2VydmljZSB3aWxsIGxpc3RlbiB0byBkYXRhLiIrCisiICAgICAgZGJfbmFtZToiKworIiAgICAgICAgdHlwZTogc3RyaW5nIisKKyIgICAgICAgIHJlcXVpcmVkOiB0cnVlIisKKyIgICAgICAgIGRlZmF1bHQ6IHdvcmRwcmVzcyIrCisiICAgICAgICBkZXNjcmlwdGlvbjogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UuIisKKyIgICAgICBkYl91c2VyOiIrCisiICAgICAgICB0eXBlOiBzdHJpbmciKworIiAgICAgICAgZGVmYXVsdDogcGFzcyIrCisiICAgICAgICBkZXNjcmlwdGlvbjogVGhlIHNwZWNpYWwgdXNlciBhY2NvdW50IHVzZWQgZm9yIGRhdGFiYXNlIGFkbWluaXN0cmF0aW9uLiIrCisiICAgICAgZGJfcGFzc3dvcmQ6IisKKyIgICAgICAgIHR5cGU6IHN0cmluZyIrCisiICAgICAgICBkZWZhdWx0OiBwYXNzIisKKyIgICAgICAgIGRlc2NyaXB0aW9uOiBUaGUgcGFzc3dvcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIOKAmGRiX3VzZXLigJkgcHJvcGVydHkuIisKKyIgICAgICBiaW5kX2FkZHJlc3M6IisKKyIgICAgICAgIHR5cGU6IGJvb2xlYW4iKworIiAgICAgICAgZGVmYXVsdDogdHJ1ZSIrCisiICAgICAgICByZXF1aXJlZDogZmFsc2UiKworIiAgICAgICAgZGVzY3JpcHRpb246IElmIHRydWUsdGhlIHNlcnZlciBhY2NlcHRzIFRDUC9JUCBjb25uZWN0aW9ucyBvbiBhbGwgc2VydmVyIGhvc3QgSVB2NCBpbnRlcmZhY2VzLiIrCisiICAgICAgc3RvcmFnZV9wYXRoOiIrCisiICAgICAgICB0eXBlOiBzdHJpbmciKworIiAgICAgICAgZGVmYXVsdDogL21vdW50ZWRTdG9yYWdlIisKKyIgICAgICAgIGNvbnN0cmFpbnRzOiIrCisnICAgICAgICAgIC0gdmFsaWRfdmFsdWVzOiBbICIvbW91bnRlZFN0b3JhZ2UiLCAiL3Zhci9teXNxbCIgXScrCisiICAgIGludGVyZmFjZXM6IisKKyIgICAgICBTdGFuZGFyZDoiKworIiAgICAgICAgY3JlYXRlOiBzY3JpcHRzL2luc3RhbGxfbXlzcWwuc2giKworIiAgICAgICAgc3RhcnQ6IisKKyIgICAgICAgICAgaW5wdXRzOiIrCisiICAgICAgICAgICAgVk9MVU1FX0hPTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgc3RvcmFnZV9wYXRoXSB9IisKKyIgICAgICAgICAgICBQT1JUOiB7IGdldF9wcm9wZXJ0eTogW1NFTEYsIGRiX3BvcnRdIH0iKworIiAgICAgICAgICAgIERCX05BTUU6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgZGJfbmFtZV0gfSIrCisiICAgICAgICAgICAgREJfVVNFUjogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl91c2VyXSB9IisKKyIgICAgICAgICAgICBEQl9QQVNTV09SRDogeyBnZXRfcHJvcGVydHk6IFtTRUxGLCBkYl9wYXNzd29yZF0gfSIrCisiICAgICAgICAgICAgQklORF9BRFJFU1M6IHsgZ2V0X3Byb3BlcnR5OiBbU0VMRiwgYmluZF9hZGRyZXNzXSB9IisKKyIgICAgICAgICAgaW1wbGVtZW50YXRpb246IHNjcmlwdHMvc3RhcnRfbXlzcWwuc2giKworIgkJCQkJCQkJCQkJCSIrCisiY2FwYWJpbGl0eV90eXBlczoiKworIiAgYWxpZW4uY2FwYWJpbGl0aWVzLk15c3FsRGF0YWJhc2U6IisKKyIgICAgICBkZXJpdmVkX2Zyb206IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiOworCisKK3ZhciBpbnN0YWxsTXlTcWxTSCA9IAorJyMhL2Jpbi9iYXNoJysKKworJ2VjaG8gIkRlYmlhbiBiYXNlZCBNWVNRTCBpbnN0YWxsIDUuLi4iJysKKydMT0NLPSIvdG1wL2xvY2thcHRnZXQiJysKKworJ3doaWxlIHRydWU7IGRvJysKKycgIGlmIG1rZGlyICIke0xPQ0t9IiAmPi9kZXYvbnVsbDsgdGhlbicrCisnICAgIGVjaG8gIk15U1FMIHRha2UgdGhlIGxvY2siJysKKycgICAgYnJlYWs7JysKKycgIGZpJysKKycgIGVjaG8gIldhaXRpbmcgdGhlIGVuZCBvZiBvbmUgb2Ygb3VyIHJlY2lwZXMuLi4iJysKKycgIHNsZWVwIDAuNScrCisnZG9uZScrCisKKyd3aGlsZSBzdWRvIGZ1c2VyIC92YXIvbGliL2Rwa2cvbG9jayA+L2Rldi9udWxsIDI+JjEgOyBkbycrCisnICBlY2hvICJXYWl0aW5nIGZvciBvdGhlciBzb2Z0d2FyZSBtYW5hZ2VycyB0byBmaW5pc2guLi4iJysKKycgIHNsZWVwIDAuNScrCisnZG9uZScrCisnc3VkbyBybSAtZiAvdmFyL2xpYi9kcGtnL2xvY2snKworCisnc3VkbyBhcHQtZ2V0IHVwZGF0ZSB8fCAoc2xlZXAgMTU7IHN1ZG8gYXB0LWdldCB1cGRhdGUgfHwgZXhpdCAkezF9KScrCisnc3VkbyBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCAteSBpbnN0YWxsIG15c3FsLXNlcnZlci01LjUgcHdnZW4gfHwgZXhpdCAkezF9JysKKydybSAtcmYgIiR7TE9DS30iJysKKworJ3N1ZG8gL2V0Yy9pbml0LmQvbXlzcWwgc3RvcCcrCisnc3VkbyBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyonKworJ3N1ZG8gcm0gLXJmIC92YXIvbGliL215c3FsLyonKworJ2VjaG8gIk15U1FMIEluc3RhbGxhdGlvbiBjb21wbGV0ZS4iJzsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctZmUvc3JjL3Rlc3QvdGVzdFNjcmlwdHMvamFzbWluZS1maXh0dXJlLmpzIGIvY2F0YWxvZy1mZS9zcmMvdGVzdC90ZXN0U2NyaXB0cy9qYXNtaW5lLWZpeHR1cmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmZjhjNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvc3JjL3Rlc3QvdGVzdFNjcmlwdHMvamFzbWluZS1maXh0dXJlLmpzCkBAIC0wLDAgKzEsNDUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIGphc21pbmUtZml4dHVyZSAtIDEuMi4yCisgKiBNYWtlcyBpbmplY3RpbmcgSFRNTCBzbmlwcGV0cyBpbnRvIHRoZSBET00gZWFzeSAmIGNsZWFuIQorICogaHR0cHM6Ly9naXRodWIuY29tL3NlYXJscy9qYXNtaW5lLWZpeHR1cmUKKyAqLworKGZ1bmN0aW9uKCkgeworICB2YXIgY3JlYXRlSFRNTEJsb2NrLAorICAgIF9fc2xpY2UgPSBbXS5zbGljZTsKKworICAoZnVuY3Rpb24oJCkgeworICAgIHZhciBld3dTaWRlRWZmZWN0cywgamFzbWluZUZpeHR1cmUsIG9yaWdpbmFsQWZmaXgsIG9yaWdpbmFsSmFzbWluZURvdEZpeHR1cmUsIG9yaWdpbmFsSmFzbWluZUZpeHR1cmUsIHJvb3QsIF8sIF9yZWY7CisgICAgcm9vdCA9IHRoaXM7CisgICAgb3JpZ2luYWxKYXNtaW5lRml4dHVyZSA9IHJvb3QuamFzbWluZUZpeHR1cmU7CisgICAgb3JpZ2luYWxKYXNtaW5lRG90Rml4dHVyZSA9IChfcmVmID0gcm9vdC5qYXNtaW5lKSAhPSBudWxsID8gX3JlZi5maXh0dXJlIDogdm9pZCAwOworICAgIG9yaWdpbmFsQWZmaXggPSByb290LmFmZml4OworICAgIF8gPSBmdW5jdGlvbihsaXN0KSB7CisgICAgICByZXR1cm4geworICAgICAgICBpbmplY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBtZW1vKSB7CisgICAgICAgICAgdmFyIGl0ZW0sIF9pLCBfbGVuLCBfcmVzdWx0czsKKyAgICAgICAgICBfcmVzdWx0cyA9IFtdOworICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gbGlzdC5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgeworICAgICAgICAgICAgaXRlbSA9IGxpc3RbX2ldOworICAgICAgICAgICAgX3Jlc3VsdHMucHVzaChtZW1vID0gaXRlcmF0b3IobWVtbywgaXRlbSkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gX3Jlc3VsdHM7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfTsKKyAgICByb290Lmphc21pbmVGaXh0dXJlID0gZnVuY3Rpb24oJCkgeworICAgICAgdmFyICR3aGF0c1RoZVJvb3RPZiwgYWZmaXgsIGNyZWF0ZSwgamFzbWluZUZpeHR1cmUsIG5vQ29uZmxpY3Q7CisgICAgICBhZmZpeCA9IGZ1bmN0aW9uKHNlbGVjdG9yT3B0aW9ucykgeworICAgICAgICByZXR1cm4gY3JlYXRlLmNhbGwodGhpcywgc2VsZWN0b3JPcHRpb25zLCB0cnVlKTsKKyAgICAgIH07CisgICAgICBjcmVhdGUgPSBmdW5jdGlvbihzZWxlY3Rvck9wdGlvbnMsIGF0dGFjaCkgeworICAgICAgICB2YXIgJHRvcDsKKyAgICAgICAgJHRvcCA9IG51bGw7CisgICAgICAgIF8oc2VsZWN0b3JPcHRpb25zLnNwbGl0KC9bIF0oPz1bXlxdXSo/KD86XFt8JCkpLykpLmluamVjdChmdW5jdGlvbigkcGFyZW50LCBlbGVtZW50U2VsZWN0b3IpIHsKKyAgICAgICAgICB2YXIgJGVsOworICAgICAgICAgIGlmIChlbGVtZW50U2VsZWN0b3IgPT09ICI+IikgeworICAgICAgICAgICAgcmV0dXJuICRwYXJlbnQ7CisgICAgICAgICAgfQorICAgICAgICAgICRlbCA9IGNyZWF0ZUhUTUxCbG9jaygkLCBlbGVtZW50U2VsZWN0b3IpOworICAgICAgICAgIGlmIChhdHRhY2ggfHwgJHRvcCkgeworICAgICAgICAgICAgJGVsLmFwcGVuZFRvKCRwYXJlbnQpOworICAgICAgICAgIH0KKyAgICAgICAgICAkdG9wIHx8ICgkdG9wID0gJGVsKTsKKyAgICAgICAgICByZXR1cm4gJGVsOworICAgICAgICB9LCAkd2hhdHNUaGVSb290T2YodGhpcykpOworICAgICAgICByZXR1cm4gJHRvcDsKKyAgICAgIH07CisgICAgICBub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBjdXJyZW50SmFzbWluZUZpeHR1cmUsIF9yZWYxOworICAgICAgICBjdXJyZW50SmFzbWluZUZpeHR1cmUgPSBqYXNtaW5lLmZpeHR1cmU7CisgICAgICAgIHJvb3QuamFzbWluZUZpeHR1cmUgPSBvcmlnaW5hbEphc21pbmVGaXh0dXJlOworICAgICAgICBpZiAoKF9yZWYxID0gcm9vdC5qYXNtaW5lKSAhPSBudWxsKSB7CisgICAgICAgICAgX3JlZjEuZml4dHVyZSA9IG9yaWdpbmFsSmFzbWluZURvdEZpeHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgcm9vdC5hZmZpeCA9IG9yaWdpbmFsQWZmaXg7CisgICAgICAgIHJldHVybiBjdXJyZW50SmFzbWluZUZpeHR1cmU7CisgICAgICB9OworICAgICAgJHdoYXRzVGhlUm9vdE9mID0gZnVuY3Rpb24odGhhdCkgeworICAgICAgICBpZiAodGhhdC5qcXVlcnkgIT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiB0aGF0OworICAgICAgICB9IGVsc2UgaWYgKCQoJyNqYXNtaW5lX2NvbnRlbnQnKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgcmV0dXJuICQoJyNqYXNtaW5lX2NvbnRlbnQnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gJCgnPGRpdiBpZD0iamFzbWluZV9jb250ZW50Ij48L2Rpdj4nKS5hcHBlbmRUbygnYm9keScpOworICAgICAgICB9CisgICAgICB9OworICAgICAgamFzbWluZUZpeHR1cmUgPSB7CisgICAgICAgIGFmZml4OiBhZmZpeCwKKyAgICAgICAgY3JlYXRlOiBjcmVhdGUsCisgICAgICAgIG5vQ29uZmxpY3Q6IG5vQ29uZmxpY3QKKyAgICAgIH07CisgICAgICBld3dTaWRlRWZmZWN0cyhqYXNtaW5lRml4dHVyZSk7CisgICAgICByZXR1cm4gamFzbWluZUZpeHR1cmU7CisgICAgfTsKKyAgICBld3dTaWRlRWZmZWN0cyA9IGZ1bmN0aW9uKGphc21pbmVGaXh0dXJlKSB7CisgICAgICB2YXIgX3JlZjE7CisgICAgICBpZiAoKF9yZWYxID0gcm9vdC5qYXNtaW5lKSAhPSBudWxsKSB7CisgICAgICAgIF9yZWYxLmZpeHR1cmUgPSBqYXNtaW5lRml4dHVyZTsKKyAgICAgIH0KKyAgICAgICQuZm4uYWZmaXggPSByb290LmFmZml4ID0gamFzbWluZUZpeHR1cmUuYWZmaXg7CisgICAgICByZXR1cm4gYWZ0ZXJFYWNoKGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gJCgnI2phc21pbmVfY29udGVudCcpLnJlbW92ZSgpOworICAgICAgfSk7CisgICAgfTsKKyAgICBpZiAoJCkgeworICAgICAgcmV0dXJuIGphc21pbmVGaXh0dXJlID0gcm9vdC5qYXNtaW5lRml4dHVyZSgkKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJvb3QuYWZmaXggPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIG5vd0pRdWVyeUV4aXN0czsKKyAgICAgICAgbm93SlF1ZXJ5RXhpc3RzID0gd2luZG93LmpRdWVyeSB8fCB3aW5kb3cuJDsKKyAgICAgICAgaWYgKG5vd0pRdWVyeUV4aXN0cyAhPSBudWxsKSB7CisgICAgICAgICAgamFzbWluZUZpeHR1cmUgPSByb290Lmphc21pbmVGaXh0dXJlKG5vd0pRdWVyeUV4aXN0cyk7CisgICAgICAgICAgcmV0dXJuIGFmZml4LmNhbGwuYXBwbHkoYWZmaXgsIFt0aGlzXS5jb25jYXQoX19zbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImphc21pbmUtZml4dHVyZSByZXF1aXJlcyBqUXVlcnkgdG8gYmUgZGVmaW5lZCBhdCB3aW5kb3cualF1ZXJ5IG9yIHdpbmRvdy4kIik7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfQorICB9KSh3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy4kKTsKKworICBjcmVhdGVIVE1MQmxvY2sgPSAoZnVuY3Rpb24oKSB7CisgICAgdmFyIGJpbmREYXRhLCBiaW5kRXZlbnRzLCBwYXJzZUF0dHJpYnV0ZXMsIHBhcnNlQ2xhc3NlcywgcGFyc2VDb250ZW50cywgcGFyc2VFbmNsb3N1cmUsIHBhcnNlUmVmZXJlbmNlcywgcGFyc2VWYXJpYWJsZVNjb3BlLCByZWdBdHRyLCByZWdBdHRyRGZuLCByZWdBdHRycywgcmVnQ0JyYWNlLCByZWdDbGFzcywgcmVnQ2xhc3NlcywgcmVnRGF0YSwgcmVnRGF0YXMsIHJlZ0V2ZW50LCByZWdFdmVudHMsIHJlZ0V4Y2xhbWF0aW9uLCByZWdJZCwgcmVnUmVmZXJlbmNlLCByZWdUYWcsIHJlZ1RhZ05vdENvbnRlbnQsIHJlZ1plblRhZ0RmbjsKKyAgICBjcmVhdGVIVE1MQmxvY2sgPSBmdW5jdGlvbigkLCBaZW5PYmplY3QsIGRhdGEsIGZ1bmN0aW9ucywgaW5kZXhlcykgeworICAgICAgdmFyIFplbkNvZGUsIGFyciwgYmxvY2ssIGJsb2NrQXR0cnMsIGJsb2NrQ2xhc3NlcywgYmxvY2tIVE1MLCBibG9ja0lkLCBibG9ja1RhZywgYmxvY2tzLCBlbCwgZWwyLCBlbHMsIGZvclNjb3BlLCBpbmRleE5hbWUsIGlubmVyLCBsZW4sIG9iaiwgb3JpZ1plbkNvZGUsIHBhcmVuLCByZXN1bHQsIHJldCwgemMsIHpvOworICAgICAgaWYgKCQuaXNQbGFpbk9iamVjdChaZW5PYmplY3QpKSB7CisgICAgICAgIFplbkNvZGUgPSBaZW5PYmplY3QubWFpbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFplbkNvZGUgPSBaZW5PYmplY3Q7CisgICAgICAgIFplbk9iamVjdCA9IHsKKyAgICAgICAgICBtYWluOiBaZW5Db2RlCisgICAgICAgIH07CisgICAgICB9CisgICAgICBvcmlnWmVuQ29kZSA9IFplbkNvZGU7CisgICAgICBpZiAoaW5kZXhlcyA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGluZGV4ZXMgPSB7fTsKKyAgICAgIH0KKyAgICAgIGlmIChaZW5Db2RlLmNoYXJBdCgwKSA9PT0gIiEiIHx8ICQuaXNBcnJheShkYXRhKSkgeworICAgICAgICBpZiAoJC5pc0FycmF5KGRhdGEpKSB7CisgICAgICAgICAgZm9yU2NvcGUgPSBaZW5Db2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG9iaiA9IHBhcnNlRW5jbG9zdXJlKFplbkNvZGUsICIhIik7CisgICAgICAgICAgb2JqID0gb2JqLnN1YnN0cmluZyhvYmouaW5kZXhPZigiOiIpICsgMSwgb2JqLmxlbmd0aCAtIDEpOworICAgICAgICAgIGZvclNjb3BlID0gcGFyc2VWYXJpYWJsZVNjb3BlKFplbkNvZGUpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChmb3JTY29wZS5jaGFyQXQoMCkgPT09ICJAIikgeworICAgICAgICAgIGZvclNjb3BlID0gcGFyc2VWYXJpYWJsZVNjb3BlKCIhZm9yOiEiICsgcGFyc2VSZWZlcmVuY2VzKGZvclNjb3BlLCBaZW5PYmplY3QpKTsKKyAgICAgICAgfQorICAgICAgICB6byA9IFplbk9iamVjdDsKKyAgICAgICAgem8ubWFpbiA9IGZvclNjb3BlOworICAgICAgICBlbCA9ICQoKTsKKyAgICAgICAgaWYgKFplbkNvZGUuc3Vic3RyaW5nKDAsIDUpID09PSAiIWZvcjoiIHx8ICQuaXNBcnJheShkYXRhKSkgeworICAgICAgICAgIGlmICghJC5pc0FycmF5KGRhdGEpICYmIG9iai5pbmRleE9mKCI6IikgPiAwKSB7CisgICAgICAgICAgICBpbmRleE5hbWUgPSBvYmouc3Vic3RyaW5nKDAsIG9iai5pbmRleE9mKCI6IikpOworICAgICAgICAgICAgb2JqID0gb2JqLnN1YnN0cihvYmouaW5kZXhPZigiOiIpICsgMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGFyciA9ICgkLmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogZGF0YVtvYmpdKTsKKyAgICAgICAgICB6YyA9IHpvLm1haW47CisgICAgICAgICAgaWYgKCQuaXNBcnJheShhcnIpIHx8ICQuaXNQbGFpbk9iamVjdChhcnIpKSB7CisgICAgICAgICAgICAkLm1hcChhcnIsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgICAgICAgICB2YXIgbmV4dDsKKyAgICAgICAgICAgICAgem8ubWFpbiA9IHpjOworICAgICAgICAgICAgICBpZiAoaW5kZXhOYW1lICE9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgICAgICBpbmRleGVzW2luZGV4TmFtZV0gPSBpbmRleDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoISQuaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbmV4dCA9IGNyZWF0ZUhUTUxCbG9jaygkLCB6bywgdmFsdWUsIGZ1bmN0aW9ucywgaW5kZXhlcyk7CisgICAgICAgICAgICAgIGlmIChlbC5sZW5ndGggIT09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJC5lYWNoKG5leHQsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnB1c2godmFsdWUpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCEkLmlzQXJyYXkoZGF0YSkpIHsKKyAgICAgICAgICAgIFplbkNvZGUgPSBaZW5Db2RlLnN1YnN0cihvYmoubGVuZ3RoICsgNiArIGZvclNjb3BlLmxlbmd0aCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFplbkNvZGUgPSAiIjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoWmVuQ29kZS5zdWJzdHJpbmcoMCwgNCkgPT09ICIhaWY6IikgeworICAgICAgICAgIHJlc3VsdCA9IHBhcnNlQ29udGVudHMoIiEiICsgb2JqICsgIiEiLCBkYXRhLCBpbmRleGVzKTsKKyAgICAgICAgICBpZiAocmVzdWx0ICE9PSAidW5kZWZpbmVkIiB8fCByZXN1bHQgIT09ICJmYWxzZSIgfHwgcmVzdWx0ICE9PSAiIikgeworICAgICAgICAgICAgZWwgPSBjcmVhdGVIVE1MQmxvY2soJCwgem8sIGRhdGEsIGZ1bmN0aW9ucywgaW5kZXhlcyk7CisgICAgICAgICAgfQorICAgICAgICAgIFplbkNvZGUgPSBaZW5Db2RlLnN1YnN0cihvYmoubGVuZ3RoICsgNSArIGZvclNjb3BlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgWmVuT2JqZWN0Lm1haW4gPSBaZW5Db2RlOworICAgICAgfSBlbHNlIGlmIChaZW5Db2RlLmNoYXJBdCgwKSA9PT0gIigiKSB7CisgICAgICAgIHBhcmVuID0gcGFyc2VFbmNsb3N1cmUoWmVuQ29kZSwgIigiLCAiKSIpOworICAgICAgICBpbm5lciA9IHBhcmVuLnN1YnN0cmluZygxLCBwYXJlbi5sZW5ndGggLSAxKTsKKyAgICAgICAgWmVuQ29kZSA9IFplbkNvZGUuc3Vic3RyKHBhcmVuLmxlbmd0aCk7CisgICAgICAgIHpvID0gWmVuT2JqZWN0OworICAgICAgICB6by5tYWluID0gaW5uZXI7CisgICAgICAgIGVsID0gY3JlYXRlSFRNTEJsb2NrKCQsIHpvLCBkYXRhLCBmdW5jdGlvbnMsIGluZGV4ZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmxvY2tzID0gWmVuQ29kZS5tYXRjaChyZWdaZW5UYWdEZm4pOworICAgICAgICBibG9jayA9IGJsb2Nrc1swXTsKKyAgICAgICAgaWYgKGJsb2NrLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmxvY2suaW5kZXhPZigiQCIpID49IDApIHsKKyAgICAgICAgICBaZW5Db2RlID0gcGFyc2VSZWZlcmVuY2VzKFplbkNvZGUsIFplbk9iamVjdCk7CisgICAgICAgICAgem8gPSBaZW5PYmplY3Q7CisgICAgICAgICAgem8ubWFpbiA9IFplbkNvZGU7CisgICAgICAgICAgcmV0dXJuIGNyZWF0ZUhUTUxCbG9jaygkLCB6bywgZGF0YSwgZnVuY3Rpb25zLCBpbmRleGVzKTsKKyAgICAgICAgfQorICAgICAgICBibG9jayA9IHBhcnNlQ29udGVudHMoYmxvY2ssIGRhdGEsIGluZGV4ZXMpOworICAgICAgICBibG9ja0NsYXNzZXMgPSBwYXJzZUNsYXNzZXMoJCwgYmxvY2spOworICAgICAgICBpZiAocmVnSWQudGVzdChibG9jaykpIHsKKyAgICAgICAgICBibG9ja0lkID0gcmVnSWQuZXhlYyhibG9jaylbMV07CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tBdHRycyA9IHBhcnNlQXR0cmlidXRlcyhibG9jaywgZGF0YSk7CisgICAgICAgIGJsb2NrVGFnID0gKGJsb2NrLmNoYXJBdCgwKSA9PT0gInsiID8gInNwYW4iIDogImRpdiIpOworICAgICAgICBpZiAoWmVuQ29kZS5jaGFyQXQoMCkgIT09ICIjIiAmJiBaZW5Db2RlLmNoYXJBdCgwKSAhPT0gIi4iICYmIFplbkNvZGUuY2hhckF0KDApICE9PSAieyIpIHsKKyAgICAgICAgICBibG9ja1RhZyA9IHJlZ1RhZy5leGVjKGJsb2NrKVsxXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmxvY2suc2VhcmNoKHJlZ0NCcmFjZSkgIT09IC0xKSB7CisgICAgICAgICAgYmxvY2tIVE1MID0gYmxvY2subWF0Y2gocmVnQ0JyYWNlKVsxXTsKKyAgICAgICAgfQorICAgICAgICBibG9ja0F0dHJzID0gJC5leHRlbmQoYmxvY2tBdHRycywgeworICAgICAgICAgIGlkOiBibG9ja0lkLAorICAgICAgICAgICJjbGFzcyI6IGJsb2NrQ2xhc3NlcywKKyAgICAgICAgICBodG1sOiBibG9ja0hUTUwKKyAgICAgICAgfSk7CisgICAgICAgIGVsID0gJCgiPCIgKyBibG9ja1RhZyArICI+IiwgYmxvY2tBdHRycyk7CisgICAgICAgIGVsLmF0dHIoYmxvY2tBdHRycyk7CisgICAgICAgIGVsID0gYmluZEV2ZW50cyhibG9jaywgZWwsIGZ1bmN0aW9ucyk7CisgICAgICAgIGVsID0gYmluZERhdGEoYmxvY2ssIGVsLCBkYXRhKTsKKyAgICAgICAgWmVuQ29kZSA9IFplbkNvZGUuc3Vic3RyKGJsb2Nrc1swXS5sZW5ndGgpOworICAgICAgICBaZW5PYmplY3QubWFpbiA9IFplbkNvZGU7CisgICAgICB9CisgICAgICBpZiAoWmVuQ29kZS5sZW5ndGggPiAwKSB7CisgICAgICAgIGlmIChaZW5Db2RlLmNoYXJBdCgwKSA9PT0gIj4iKSB7CisgICAgICAgICAgaWYgKFplbkNvZGUuY2hhckF0KDEpID09PSAiKCIpIHsKKyAgICAgICAgICAgIHpjID0gcGFyc2VFbmNsb3N1cmUoWmVuQ29kZS5zdWJzdHIoMSksICIoIiwgIikiKTsKKyAgICAgICAgICAgIFplbkNvZGUgPSBaZW5Db2RlLnN1YnN0cih6Yy5sZW5ndGggKyAxKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKFplbkNvZGUuY2hhckF0KDEpID09PSAiISIpIHsKKyAgICAgICAgICAgIG9iaiA9IHBhcnNlRW5jbG9zdXJlKFplbkNvZGUuc3Vic3RyKDEpLCAiISIpOworICAgICAgICAgICAgZm9yU2NvcGUgPSBwYXJzZVZhcmlhYmxlU2NvcGUoWmVuQ29kZS5zdWJzdHIoMSkpOworICAgICAgICAgICAgemMgPSBvYmogKyBmb3JTY29wZTsKKyAgICAgICAgICAgIFplbkNvZGUgPSBaZW5Db2RlLnN1YnN0cih6Yy5sZW5ndGggKyAxKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVuID0gTWF0aC5tYXgoWmVuQ29kZS5pbmRleE9mKCIrIiksIFplbkNvZGUubGVuZ3RoKTsKKyAgICAgICAgICAgIHpjID0gWmVuQ29kZS5zdWJzdHJpbmcoMSwgbGVuKTsKKyAgICAgICAgICAgIFplbkNvZGUgPSBaZW5Db2RlLnN1YnN0cihsZW4pOworICAgICAgICAgIH0KKyAgICAgICAgICB6byA9IFplbk9iamVjdDsKKyAgICAgICAgICB6by5tYWluID0gemM7CisgICAgICAgICAgZWxzID0gJChjcmVhdGVIVE1MQmxvY2soJCwgem8sIGRhdGEsIGZ1bmN0aW9ucywgaW5kZXhlcykpOworICAgICAgICAgIGVscy5hcHBlbmRUbyhlbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFplbkNvZGUuY2hhckF0KDApID09PSAiKyIpIHsKKyAgICAgICAgICB6byA9IFplbk9iamVjdDsKKyAgICAgICAgICB6by5tYWluID0gWmVuQ29kZS5zdWJzdHIoMSk7CisgICAgICAgICAgZWwyID0gY3JlYXRlSFRNTEJsb2NrKCQsIHpvLCBkYXRhLCBmdW5jdGlvbnMsIGluZGV4ZXMpOworICAgICAgICAgICQuZWFjaChlbDIsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIGVsLnB1c2godmFsdWUpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXQgPSBlbDsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfTsKKyAgICBiaW5kRGF0YSA9IGZ1bmN0aW9uKFplbkNvZGUsIGVsLCBkYXRhKSB7CisgICAgICB2YXIgZGF0YXMsIGksIHNwbGl0OworICAgICAgaWYgKFplbkNvZGUuc2VhcmNoKHJlZ0RhdGFzKSA9PT0gMCkgeworICAgICAgICByZXR1cm4gZWw7CisgICAgICB9CisgICAgICBkYXRhcyA9IFplbkNvZGUubWF0Y2gocmVnRGF0YXMpOworICAgICAgaWYgKGRhdGFzID09PSBudWxsKSB7CisgICAgICAgIHJldHVybiBlbDsKKyAgICAgIH0KKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBkYXRhcy5sZW5ndGgpIHsKKyAgICAgICAgc3BsaXQgPSByZWdEYXRhLmV4ZWMoZGF0YXNbaV0pOworICAgICAgICBpZiAoc3BsaXRbM10gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICQoZWwpLmRhdGEoc3BsaXRbMV0sIGRhdGFbc3BsaXRbMV1dKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAkKGVsKS5kYXRhKHNwbGl0WzFdLCBkYXRhW3NwbGl0WzNdXSk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgfQorICAgICAgcmV0dXJuIGVsOworICAgIH07CisgICAgYmluZEV2ZW50cyA9IGZ1bmN0aW9uKFplbkNvZGUsIGVsLCBmdW5jdGlvbnMpIHsKKyAgICAgIHZhciBiaW5kaW5ncywgZm4sIGksIHNwbGl0OworICAgICAgaWYgKFplbkNvZGUuc2VhcmNoKHJlZ0V2ZW50cykgPT09IDApIHsKKyAgICAgICAgcmV0dXJuIGVsOworICAgICAgfQorICAgICAgYmluZGluZ3MgPSBaZW5Db2RlLm1hdGNoKHJlZ0V2ZW50cyk7CisgICAgICBpZiAoYmluZGluZ3MgPT09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGVsOworICAgICAgfQorICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IGJpbmRpbmdzLmxlbmd0aCkgeworICAgICAgICBzcGxpdCA9IHJlZ0V2ZW50LmV4ZWMoYmluZGluZ3NbaV0pOworICAgICAgICBpZiAoc3BsaXRbMl0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgIGZuID0gZnVuY3Rpb25zW3NwbGl0WzFdXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmbiA9IGZ1bmN0aW9uc1tzcGxpdFsyXV07CisgICAgICAgIH0KKyAgICAgICAgJChlbCkuYmluZChzcGxpdFsxXSwgZm4pOworICAgICAgICBpKys7CisgICAgICB9CisgICAgICByZXR1cm4gZWw7CisgICAgfTsKKyAgICBwYXJzZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbihaZW5CbG9jaywgZGF0YSkgeworICAgICAgdmFyIGF0dHJTdHJzLCBhdHRycywgaSwgcGFydHM7CisgICAgICBpZiAoWmVuQmxvY2suc2VhcmNoKHJlZ0F0dHJEZm4pID09PSAtMSkgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorICAgICAgYXR0clN0cnMgPSBaZW5CbG9jay5tYXRjaChyZWdBdHRyRGZuKTsKKyAgICAgIGF0dHJzID0ge307CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgYXR0clN0cnMubGVuZ3RoKSB7CisgICAgICAgIHBhcnRzID0gcmVnQXR0ci5leGVjKGF0dHJTdHJzW2ldKTsKKyAgICAgICAgYXR0cnNbcGFydHNbMV1dID0gIiI7CisgICAgICAgIGlmIChwYXJ0c1szXSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgYXR0cnNbcGFydHNbMV1dID0gcGFyc2VDb250ZW50cyhwYXJ0c1szXSwgZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgfQorICAgICAgcmV0dXJuIGF0dHJzOworICAgIH07CisgICAgcGFyc2VDbGFzc2VzID0gZnVuY3Rpb24oJCwgWmVuQmxvY2spIHsKKyAgICAgIHZhciBjbGFzc2VzLCBjbHNTdHJpbmcsIGk7CisgICAgICBaZW5CbG9jayA9IFplbkJsb2NrLm1hdGNoKHJlZ1RhZ05vdENvbnRlbnQpWzBdOworICAgICAgaWYgKFplbkJsb2NrLnNlYXJjaChyZWdDbGFzc2VzKSA9PT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKyAgICAgIGNsYXNzZXMgPSBaZW5CbG9jay5tYXRjaChyZWdDbGFzc2VzKTsKKyAgICAgIGNsc1N0cmluZyA9ICIiOworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IGNsYXNzZXMubGVuZ3RoKSB7CisgICAgICAgIGNsc1N0cmluZyArPSAiICIgKyByZWdDbGFzcy5leGVjKGNsYXNzZXNbaV0pWzFdOworICAgICAgICBpKys7CisgICAgICB9CisgICAgICByZXR1cm4gJC50cmltKGNsc1N0cmluZyk7CisgICAgfTsKKyAgICBwYXJzZUNvbnRlbnRzID0gZnVuY3Rpb24oWmVuQmxvY2ssIGRhdGEsIGluZGV4ZXMpIHsKKyAgICAgIHZhciBodG1sOworICAgICAgaWYgKGluZGV4ZXMgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBpbmRleGVzID0ge307CisgICAgICB9CisgICAgICBodG1sID0gWmVuQmxvY2s7CisgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHJldHVybiBodG1sOworICAgICAgfQorICAgICAgd2hpbGUgKHJlZ0V4Y2xhbWF0aW9uLnRlc3QoaHRtbCkpIHsKKyAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeGNsYW1hdGlvbiwgZnVuY3Rpb24oc3RyLCBzdHIyKSB7CisgICAgICAgICAgdmFyIGJlZ0NoYXIsIGZuLCB2YWw7CisgICAgICAgICAgYmVnQ2hhciA9ICIiOworICAgICAgICAgIGlmIChzdHIuaW5kZXhPZigiIWZvcjoiKSA+IDAgfHwgc3RyLmluZGV4T2YoIiFpZjoiKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdHIuY2hhckF0KDApICE9PSAiISIpIHsKKyAgICAgICAgICAgIGJlZ0NoYXIgPSBzdHIuY2hhckF0KDApOworICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygyLCBzdHIubGVuZ3RoIC0gMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZuID0gbmV3IEZ1bmN0aW9uKCJkYXRhIiwgImluZGV4ZXMiLCAidmFyIHI9dW5kZWZpbmVkOyIgKyAid2l0aChkYXRhKXt0cnl7cj0iICsgc3RyICsgIjt9Y2F0Y2goZSl7fX0iICsgIndpdGgoaW5kZXhlcyl7dHJ5e2lmKHI9PT11bmRlZmluZWQpcj0iICsgc3RyICsgIjt9Y2F0Y2goZSl7fX0iICsgInJldHVybiByOyIpOworICAgICAgICAgIHZhbCA9IHVuZXNjYXBlKGZuKGRhdGEsIGluZGV4ZXMpKTsKKyAgICAgICAgICByZXR1cm4gYmVnQ2hhciArIHZhbDsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXC4vZywgZnVuY3Rpb24oc3RyKSB7CisgICAgICAgIHJldHVybiBzdHIuY2hhckF0KDEpOworICAgICAgfSk7CisgICAgICByZXR1cm4gdW5lc2NhcGUoaHRtbCk7CisgICAgfTsKKyAgICBwYXJzZUVuY2xvc3VyZSA9IGZ1bmN0aW9uKFplbkNvZGUsIG9wZW4sIGNsb3NlLCBjb3VudCkgeworICAgICAgdmFyIGluZGV4LCByZXQ7CisgICAgICBpZiAoY2xvc2UgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBjbG9zZSA9IG9wZW47CisgICAgICB9CisgICAgICBpbmRleCA9IDE7CisgICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgeworICAgICAgICBjb3VudCA9IChaZW5Db2RlLmNoYXJBdCgwKSA9PT0gb3BlbiA/IDEgOiAwKTsKKyAgICAgIH0KKyAgICAgIGlmIChjb3VudCA9PT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB3aGlsZSAoY291bnQgPiAwICYmIGluZGV4IDwgWmVuQ29kZS5sZW5ndGgpIHsKKyAgICAgICAgaWYgKFplbkNvZGUuY2hhckF0KGluZGV4KSA9PT0gY2xvc2UgJiYgWmVuQ29kZS5jaGFyQXQoaW5kZXggLSAxKSAhPT0gIlxcIikgeworICAgICAgICAgIGNvdW50LS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFplbkNvZGUuY2hhckF0KGluZGV4KSA9PT0gb3BlbiAmJiBaZW5Db2RlLmNoYXJBdChpbmRleCAtIDEpICE9PSAiXFwiKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbmRleCsrOworICAgICAgfQorICAgICAgcmV0ID0gWmVuQ29kZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9OworICAgIHBhcnNlUmVmZXJlbmNlcyA9IGZ1bmN0aW9uKFplbkNvZGUsIFplbk9iamVjdCkgeworICAgICAgWmVuQ29kZSA9IFplbkNvZGUucmVwbGFjZShyZWdSZWZlcmVuY2UsIGZ1bmN0aW9uKHN0cikgeworICAgICAgICB2YXIgZm47CisgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMSk7CisgICAgICAgIGZuID0gbmV3IEZ1bmN0aW9uKCJvYmpzIiwgInZhciByPVwiXCI7IiArICJ3aXRoKG9ianMpe3RyeXsiICsgInI9IiArIHN0ciArICI7IiArICJ9Y2F0Y2goZSl7fX0iICsgInJldHVybiByOyIpOworICAgICAgICByZXR1cm4gZm4oWmVuT2JqZWN0LCBwYXJzZVJlZmVyZW5jZXMpOworICAgICAgfSk7CisgICAgICByZXR1cm4gWmVuQ29kZTsKKyAgICB9OworICAgIHBhcnNlVmFyaWFibGVTY29wZSA9IGZ1bmN0aW9uKFplbkNvZGUpIHsKKyAgICAgIHZhciBmb3JDb2RlLCByZXN0LCB0YWc7CisgICAgICBpZiAoWmVuQ29kZS5zdWJzdHJpbmcoMCwgNSkgIT09ICIhZm9yOiIgJiYgWmVuQ29kZS5zdWJzdHJpbmcoMCwgNCkgIT09ICIhaWY6IikgeworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgfQorICAgICAgZm9yQ29kZSA9IHBhcnNlRW5jbG9zdXJlKFplbkNvZGUsICIhIik7CisgICAgICBaZW5Db2RlID0gWmVuQ29kZS5zdWJzdHIoZm9yQ29kZS5sZW5ndGgpOworICAgICAgaWYgKFplbkNvZGUuY2hhckF0KDApID09PSAiKCIpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlRW5jbG9zdXJlKFplbkNvZGUsICIoIiwgIikiKTsKKyAgICAgIH0KKyAgICAgIHRhZyA9IFplbkNvZGUubWF0Y2gocmVnWmVuVGFnRGZuKVswXTsKKyAgICAgIFplbkNvZGUgPSBaZW5Db2RlLnN1YnN0cih0YWcubGVuZ3RoKTsKKyAgICAgIGlmIChaZW5Db2RlLmxlbmd0aCA9PT0gMCB8fCBaZW5Db2RlLmNoYXJBdCgwKSA9PT0gIisiKSB7CisgICAgICAgIHJldHVybiB0YWc7CisgICAgICB9IGVsc2UgaWYgKFplbkNvZGUuY2hhckF0KDApID09PSAiPiIpIHsKKyAgICAgICAgcmVzdCA9ICIiOworICAgICAgICByZXN0ID0gcGFyc2VFbmNsb3N1cmUoWmVuQ29kZS5zdWJzdHIoMSksICIoIiwgIikiLCAxKTsKKyAgICAgICAgcmV0dXJuIHRhZyArICI+IiArIHJlc3Q7CisgICAgICB9CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH07CisgICAgcmVnWmVuVGFnRGZuID0gLyhbI1wuXEBdP1tcdy1dK3xcWyhbXHctIT89OiInXSsoPSIoW14iXXxcXCIpKyIpPyB7MCx9KStcXXxcfltcdyRdKz1bXHckXSt8JltcdyRdKyg9W1x3JF0rKT98WyNcLlxAXT8hKFteIV18XFwhKSshKXswLH0oXHsoW15cfV18XFxcfSkrXH0pPy9pOworICAgIHJlZ1RhZyA9IC8oXHcrKS9pOworICAgIHJlZ0lkID0gLyg/Ol58XGIpIyhbXHctIV0rKS9pOworICAgIHJlZ1RhZ05vdENvbnRlbnQgPSAvKCgoWyNcLl0/W1x3LV0rKT8oXFsoW1x3IV0rKD0iKFteIl18XFwiKSsiKT8gezAsfSkrXF0pPykrKS9pOworICAgIC8qCisgICAgIFNlZSBsb29rYWhlYWQgc3ludGF4ICg/ISkgYXQgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUmVnRXhwCisgICAgKi8KKworICAgIHJlZ0NsYXNzZXMgPSAvKFwuW1x3LV0rKSg/IVsiXHddKS9nOworICAgIHJlZ0NsYXNzID0gL1wuKFtcdy1dKykvaTsKKyAgICByZWdSZWZlcmVuY2UgPSAvKEBbXHckX11bXHckX1xkXSspL2k7CisgICAgcmVnQXR0ckRmbiA9IC8oXFsoW1x3LSFdKyg9Ij8oW14iXXxcXCIpKyI/KT8gezAsfSkrXF0pL2lnOworICAgIHJlZ0F0dHJzID0gLyhbXHctIV0rKD0iKFteIl18XFwiKSsiKT8pL2c7CisgICAgcmVnQXR0ciA9IC8oW1x3LSFdKykoPSI/KCgoW1x3XSsoXFsuKj9cXSkrKXxbXiJcXV18XFwiKSspIj8pPy9pOworICAgIHJlZ0NCcmFjZSA9IC9ceygoW15cfV18XFxcfSkrKVx9L2k7CisgICAgcmVnRXhjbGFtYXRpb24gPSAvKD86KFteXFxdfF4pKSEoW14hXXxcXCEpKyEvZzsKKyAgICByZWdFdmVudHMgPSAvXH5bXHckXSsoPVtcdyRdKyk/L2c7CisgICAgcmVnRXZlbnQgPSAvXH4oW1x3JF0rKT0oW1x3JF0rKS9pOworICAgIHJlZ0RhdGFzID0gLyZbXHckXSsoPVtcdyRdKyk/L2c7CisgICAgcmVnRGF0YSA9IC8mKFtcdyRdKykoPShbXHckXSspKT8vaTsKKyAgICByZXR1cm4gY3JlYXRlSFRNTEJsb2NrOworICB9KSgpOworCit9KS5jYWxsKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1mZS90YXJiYWxsLnhtbCBiL2NhdGFsb2ctZmUvdGFyYmFsbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiOTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctZmUvdGFyYmFsbC54bWwKQEAgLTAsMCArMSwzMiBAQAorPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgorICA8aWQ+YmluPC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD50YXI8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8ZmlsZXM+CisgICAgPGZpbGU+CisgICAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS53YXI8L3NvdXJjZT4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8ZGVzdE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS53YXI8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZT4KKyAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9yZXNvdXJjZXMvamV0dHktaXBhY2Nlc3MueG1sPC9zb3VyY2U+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Li88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRlc3ROYW1lPmpldHR5LWlwYWNjZXNzLnhtbDwvZGVzdE5hbWU+CisgICAgPC9maWxlPgorICA8L2ZpbGVzPgorICAKKyAgPGZpbGVTZXRzPiAgCisgIAk8ZmlsZVNldD4KKwkJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnPC9kaXJlY3Rvcnk+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Y29uZmlnPC9vdXRwdXREaXJlY3Rvcnk+CisJPC9maWxlU2V0PgorCTxmaWxlU2V0PgorCQk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzPC9kaXJlY3Rvcnk+CisgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c2NyaXB0czwvb3V0cHV0RGlyZWN0b3J5PgorCTwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKyAgCis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC8uZ2l0aWdub3JlIGIvY2F0YWxvZy1tb2RlbC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisvdGFyZ2V0CisvYmluLwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9wb20ueG1sIGIvY2F0YWxvZy1tb2RlbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTE2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3BvbS54bWwKQEAgLTAsMCArMSwyNjcgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwk8YXJ0aWZhY3RJZD5jYXRhbG9nLW1vZGVsPC9hcnRpZmFjdElkPgorCisJCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNkYy1tYWluPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKwkKKwkKKworCTxkZXBlbmRlbmNpZXM+CisKKwkJPCEtLSBDb21tb24gb2YgU0QmQyAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbi1hcHAtYXBpPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtjb21tb24tYXBwLWFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbi1iZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y29tbW9uLWJlLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZ2JhY2stY2xhc3NpYzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSAgY2F0YWxvZyBkYW8gLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGMuYmU8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jYXRhbG9nLWRhbzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y2F0YWxvZy1kYW8udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8IS0tICAtLT4KKwkJPGRlcGVuZGVuY3k+ICAgIAorCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtndWF2YS52ZXJzaW9ufTwvdmVyc2lvbj48IS0tJE5PLU1WTi1NQU4tVkVSJC0tPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJIDxkZXBlbmRlbmN5PgorICAgIAkJPGdyb3VwSWQ+b3JnLmZ1bmN0aW9uYWxqYXZhPC9ncm91cElkPgorICAgCQkJPGFydGlmYWN0SWQ+ZnVuY3Rpb25hbGphdmE8L2FydGlmYWN0SWQ+CisgICAgCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgkKKwkJIDwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSBzcHJpbmcgLS0+CisJCSA8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCSA8ZGVwZW5kZW5jeT4KKyAgICAgICAgCTxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+CisgICAgICAgIAk8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgCTx2ZXJzaW9uPjEuMS4wLkZpbmFsPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisgICAgICAgIAk8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPgorICAgICAgIAkJPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgCTx2ZXJzaW9uPjUuMy40LkZpbmFsPC92ZXJzaW9uPgorICAgIAk8L2RlcGVuZGVuY3k+IAorCisgCQk8IS0tIEdzb24gLS0+CisgCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3NvbjwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKyAJCisgCQk8IS0tIFRJVEFOIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS50aGlua2F1cmVsaXVzLnRpdGFuPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGl0YW4tY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7dGl0YW4udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmpzb248L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPmpzb248L2FydGlmYWN0SWQ+CisJCQkJPC9leGNsdXNpb24+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKwkJCQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJPC9leGNsdXNpb25zPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20udGhpbmthdXJlbGl1cy50aXRhbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRpdGFuLWNhc3NhbmRyYTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7dGl0YW4udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPGV4Y2x1c2lvbnM+CisJCQkJPGV4Y2x1c2lvbj4KKwkJCQkJPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKwkJCQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorCQkJCTwvZXhjbHVzaW9uPgorCQkJPC9leGNsdXNpb25zPgorCQk8L2RlcGVuZGVuY3k+CisJCTwhLS0gVElUQU4gRU5ELS0+CisgCQkKKyAJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCSA8IS0tICBodHRwIGNsaWVudCAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTwhLS0gQ0FTU0FORFJBIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtZHJpdmVyLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2Nhc3NhbmRyYS5kcml2ZXIudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmRhdGFzdGF4LmNhc3NhbmRyYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNhc3NhbmRyYS1kcml2ZXItbWFwcGluZzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Y2Fzc2FuZHJhLmRyaXZlci52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBDQVNTQU5EUkEgRU5EIC0tPgorCQkKKwkJPCEtLSB0ZXN0IC0tPgorIAkJCisgCQk8IS0tZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3ktLT4KKyAKKyAJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmp1bml0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c3ByaW5nLXRlc3Q8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKyAgCQkJPGdyb3VwSWQ+b3JnLmFzcGVjdGo8L2dyb3VwSWQ+IAorICAJCQk8YXJ0aWZhY3RJZD5hc3BlY3RqcnQ8L2FydGlmYWN0SWQ+IAorICAJCQk8dmVyc2lvbj4xLjcuNDwvdmVyc2lvbj4KKyAgCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPiAKKyAgCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKyAgCQkJPGdyb3VwSWQ+b3JnLmFzcGVjdGo8L2dyb3VwSWQ+IAorICAJCQk8YXJ0aWZhY3RJZD5hc3BlY3Rqd2VhdmVyPC9hcnRpZmFjdElkPiAKKyAgCQkJPHZlcnNpb24+MS43LjQ8L3ZlcnNpb24+CisgIAkJCTxzY29wZT50ZXN0PC9zY29wZT4KKyAgCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zcHJpbmctdHg8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCQk8dmVyc2lvbj40LjAuNy5SRUxFQVNFPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtamNpLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwk8L2RlcGVuZGVuY2llcz4KKwk8YnVpbGQ+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjc8L3ZlcnNpb24+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxza2lwPnRydWU8L3NraXA+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9wbHVnaW4+CisJCTwvcGx1Z2lucz4KKwk8L2J1aWxkPgorCTxwcm9maWxlcz4KKwkJPHByb2ZpbGU+CisJCQk8aWQ+Rm9ydGlmeTwvaWQ+CisJCQk8YWN0aXZhdGlvbj4KKwkJCQk8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisJCQk8L2FjdGl2YXRpb24+CisKKwkJCTxidWlsZD4KKwkJCQk8cGx1Z2lucz4KKwkJCQkJPHBsdWdpbj4KKwkJCQkJCTxncm91cElkPmNvbS5mb3J0aWZ5LnBzLm1hdmVuLnBsdWdpbjwvZ3JvdXBJZD4KKwkJCQkJCTxhcnRpZmFjdElkPnNjYS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQk8dmVyc2lvbj40LjMwPC92ZXJzaW9uPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPHNvdXJjZT4xLjg8L3NvdXJjZT4KKwkJCQkJCQk8YnVpbGRJZD4ke3Byb2plY3QucGFyZW50LmFydGlmYWN0SWR9PC9idWlsZElkPgorCQkJCQkJCTx0b3BsZXZlbEFydGlmYWN0SWQ+JHtwcm9qZWN0LnBhcmVudC5hcnRpZmFjdElkfTwvdG9wbGV2ZWxBcnRpZmFjdElkPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQk8L3BsdWdpbj4KKwkJCQk8L3BsdWdpbnM+CisJCQk8L2J1aWxkPgorCQk8L3Byb2ZpbGU+CisJPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ2ODEwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0FkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgY2xhc3MgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIwNjY4NzYyODI3MjI5MDc3MDlMOworCisJU3RyaW5nIHVuaXF1ZUlkOworCVN0cmluZyBrZXk7CisJU3RyaW5nIHZhbHVlOworCisJcHVibGljIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcigpOworCQl0aGlzLmtleSA9IGtleTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8oU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCQl0aGlzLmtleSA9IGtleTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4ga2V5OworCX0KKworCXB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KSB7CisJCXRoaXMua2V5ID0ga2V5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBrZXk9IiArIGtleSArICIsIHZhbHVlPSIgKyB2YWx1ZSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDA3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGV4dGVuZHMgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MjY2Njg0NDU1NDkyNDg4MDAxTDsKKworCXByaXZhdGUgU3RyaW5nIHBhcmVudFVuaXF1ZUlkOworCisJcHJpdmF0ZSBMaXN0PEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbz4gcGFyYW1ldGVyczsKKworCXB1YmxpYyBBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uKEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24gcCwgU3RyaW5nIHBhcmVudFVuaXF1ZUlkLAorCQkJTGlzdDxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8+IHBhcmFtZXRlcnMpIHsKKwkJc3VwZXIocCk7CisJCXRoaXMucGFyZW50VW5pcXVlSWQgPSBwYXJlbnRVbmlxdWVJZDsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKwl9CisKKwlwdWJsaWMgQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbihBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIHBkKSB7CisJCXRoaXMuc2V0VW5pcXVlSWQocGQuZ2V0VW5pcXVlSWQoKSk7CisJCXRoaXMuc2V0Q3JlYXRpb25UaW1lKHBkLmdldENyZWF0aW9uVGltZSgpKTsKKwkJdGhpcy5zZXRNb2RpZmljYXRpb25UaW1lKHBkLmdldE1vZGlmaWNhdGlvblRpbWUoKSk7CisJCXRoaXMucGFyZW50VW5pcXVlSWQgPSBwZC5wYXJlbnRVbmlxdWVJZDsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gcGQucGFyYW1ldGVyczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBhcmVudFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gcGFyZW50VW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGFyZW50VW5pcXVlSWQoU3RyaW5nIHBhcmVudFVuaXF1ZUlkKSB7CisJCXRoaXMucGFyZW50VW5pcXVlSWQgPSBwYXJlbnRVbmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgTGlzdDxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8+IGdldFBhcmFtZXRlcnMoKSB7CisJCXJldHVybiBwYXJhbWV0ZXJzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoTGlzdDxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8+IHBhcmFtZXRlcnMpIHsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gW3BhcmFtZXRlcnM9IiArIHBhcmFtZXRlcnMgKyAiLCBwYXJlbnRVbmlxdWVJZD0iICsgcGFyZW50VW5pcXVlSWQgKyAiICIKKwkJCQkrIHN1cGVyLnRvU3RyaW5nKCkgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQXJ0aWZhY3REZWZpbml0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQXJ0aWZhY3REZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMmU2NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BcnRpZmFjdERlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQXJ0aWZhY3REYXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEFydGlmYWN0RGVmaW5pdGlvbiBleHRlbmRzIEFydGlmYWN0RGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgzMjM5MjM2NjU0NDkwNzE2MzFMOworCisJLyoqCisJICogQmFzZTY0IGVuY29kZWQgQXJ0aWZhY3QgZmlsZSBkYXRhCisJICovCisJcHJpdmF0ZSBieXRlW10gcGF5bG9hZERhdGE7CisKKwlwcml2YXRlIExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzOworCisJcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVkRnJvbUlkOworCisJcHVibGljIGJ5dGVbXSBnZXRQYXlsb2FkRGF0YSgpIHsKKwkJcmV0dXJuIHBheWxvYWREYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBheWxvYWQoYnl0ZVtdIHBheWxvYWREYXRhKSB7CisJCXRoaXMucGF5bG9hZERhdGEgPSBwYXlsb2FkRGF0YTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXlsb2FkRGF0YShTdHJpbmcgcGF5bG9hZERhdGEpIHsKKwkJaWYgKHBheWxvYWREYXRhICE9IG51bGwpIHsKKwkJCXRoaXMucGF5bG9hZERhdGEgPSBwYXlsb2FkRGF0YS5nZXRCeXRlcygpOworCQl9CisJfQorCisJcHVibGljIEFydGlmYWN0RGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQXJ0aWZhY3REZWZpbml0aW9uKEFydGlmYWN0RGF0YURlZmluaXRpb24gYSkgeworCQlzdXBlcihhKTsKKworCX0KKworCXB1YmxpYyBBcnRpZmFjdERlZmluaXRpb24oQXJ0aWZhY3REYXRhRGVmaW5pdGlvbiBhLCBTdHJpbmcgcGF5bG9hZERhdGEpIHsKKwkJc3VwZXIoYSk7CisJCXNldFBheWxvYWREYXRhKHBheWxvYWREYXRhKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gZ2V0SGVhdFBhcmFtZXRlcnMoKSB7CisJCXJldHVybiBoZWF0UGFyYW1ldGVyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIZWF0UGFyYW1ldGVycyhMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMuaGVhdFBhcmFtZXRlcnMgPSBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdGVkRnJvbUlkKCkgeworCQlyZXR1cm4gZ2VuZXJhdGVkRnJvbUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZEZyb21JZChTdHJpbmcgZ2VuZXJhdGVkRnJvbUlkKSB7CisJCXRoaXMuZ2VuZXJhdGVkRnJvbUlkID0gZ2VuZXJhdGVkRnJvbUlkOworCX0KKworCXB1YmxpYyBib29sZWFuIGNoZWNrRXNJZEV4aXN0KCkgeworCQlpZiAoKGdldEVzSWQoKSAhPSBudWxsKSAmJiAoIWdldEVzSWQoKS50cmltKCkuaXNFbXB0eSgpKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGdlbmVyYXRlZEZyb21JZCA9PSBudWxsKSA/IDAgOiBnZW5lcmF0ZWRGcm9tSWQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChoZWF0UGFyYW1ldGVycyA9PSBudWxsKSA/IDAgOiBoZWF0UGFyYW1ldGVycy5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHBheWxvYWREYXRhID09IG51bGwpID8gMCA6IHBheWxvYWREYXRhLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIG90aGVyID0gKEFydGlmYWN0RGVmaW5pdGlvbikgb2JqOworCQlpZiAoZ2VuZXJhdGVkRnJvbUlkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5nZW5lcmF0ZWRGcm9tSWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWdlbmVyYXRlZEZyb21JZC5lcXVhbHMob3RoZXIuZ2VuZXJhdGVkRnJvbUlkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGhlYXRQYXJhbWV0ZXJzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5oZWF0UGFyYW1ldGVycyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmIChoZWF0UGFyYW1ldGVycy5zaXplKCkgIT0gb3RoZXIuaGVhdFBhcmFtZXRlcnMuc2l6ZSgpKQorCQkJcmV0dXJuIGZhbHNlOworCQllbHNlIHsKKwkJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtIDogaGVhdFBhcmFtZXRlcnMpIHsKKwkJCQlpZiAoIW90aGVyLmhlYXRQYXJhbWV0ZXJzLmNvbnRhaW5zKGhlYXRQYXJhbSkpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAocGF5bG9hZERhdGEgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnBheWxvYWREYXRhICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFwYXlsb2FkRGF0YS5lcXVhbHMob3RoZXIucGF5bG9hZERhdGEpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQXJ0aWZhY3RUeXBlLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQXJ0aWZhY3RUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2MWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BcnRpZmFjdFR5cGUuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdFR5cGUgeworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5hbWUgPT0gbnVsbCkgPyAwIDogbmFtZS5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQXJ0aWZhY3RUeXBlIG90aGVyID0gKEFydGlmYWN0VHlwZSkgb2JqOworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuZ2V0Q2xhc3MoKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0FydGlmYWN0VWlEb3dubG9hZERhdGEuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BcnRpZmFjdFVpRG93bmxvYWREYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3MmRkYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BcnRpZmFjdFVpRG93bmxvYWREYXRhLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RVaURvd25sb2FkRGF0YSB7CisKKwkvLyBQT0pPIGZvciBVSSBhcnRpZmFjdCBkb3dubG9hZCwgaG9sZGluZyBhcnRpZmFjdCBmaWxlbmFtZSBhbmQgYmFzZTY0CisJLy8gY29udGVudAorCVN0cmluZyBhcnRpZmFjdE5hbWU7CisJU3RyaW5nIGJhc2U2NENvbnRlbnRzOworCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3ROYW1lKFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmFzZTY0Q29udGVudHMoU3RyaW5nIGJhc2U2NENvbnRlbnRzKSB7CisJCXRoaXMuYmFzZTY0Q29udGVudHMgPSBiYXNlNjRDb250ZW50czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEJhc2U2NENvbnRlbnRzKCkgeworCQlyZXR1cm4gYmFzZTY0Q29udGVudHM7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0F0dHJpYnV0ZURlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwYTg3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9BdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQXR0cmlidXRlRGF0YURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGVEZWZpbml0aW9uIGV4dGVuZHMgQXR0cmlidXRlRGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBJQ29tcGxleERlZmF1bHRWYWx1ZSwgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MzA2MTExODc5NzE0MDk3ODExTDsKKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHBhcmVudFVuaXF1ZUlkID09IG51bGwpID8gMCA6IHBhcmVudFVuaXF1ZUlkLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRoZSByZXNvdXJjZSBpZCB3aGljaCB0aGlzIHByb3BlcnR5IGJlbG9uZ3MgdG8KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBwYXJlbnRVbmlxdWVJZDsKKworCXB1YmxpYyBBdHRyaWJ1dGVEZWZpbml0aW9uKEF0dHJpYnV0ZURlZmluaXRpb24gaHBkZCkgeworCQlzdXBlcihocGRkKTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlRGVmaW5pdGlvbihBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbiBwKSB7CisJCXN1cGVyKHApOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VW5pcXVlSWQoKSB7CisJCXJldHVybiBwYXJlbnRVbmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRVbmlxdWVJZChTdHJpbmcgcGFyZW50VW5pcXVlSWQpIHsKKwkJdGhpcy5wYXJlbnRVbmlxdWVJZCA9IHBhcmVudFVuaXF1ZUlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIiBbIHBhcmVudFVuaXF1ZUlkPSIgKyBwYXJlbnRVbmlxdWVJZCArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ2FwUmVxRGVmLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ2FwUmVxRGVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5Y2Y0OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9DYXBSZXFEZWYuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgQ2FwUmVxRGVmIHsKKwlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzOworCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzOworCisJcHVibGljIENhcFJlcURlZigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ2FwUmVxRGVmKE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzLAorCQkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllcykgeworCQlzdXBlcigpOworCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKKwkJdGhpcy5yZXF1aXJlbWVudHMgPSByZXF1aXJlbWVudHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBnZXRDYXBhYmlsaXRpZXMoKSB7CisJCXJldHVybiBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gZ2V0UmVxdWlyZW1lbnRzKCkgeworCQlyZXR1cm4gcmVxdWlyZW1lbnRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdGllcyhNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzKSB7CisJCXRoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50cyhNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50cykgeworCQl0aGlzLnJlcXVpcmVtZW50cyA9IHJlcXVpcmVtZW50czsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ2FwYWJpbGl0eURlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9DYXBhYmlsaXR5RGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYmEzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ2FwYWJpbGl0eURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBTcGVjaWZpZXMgdGhlIGNhcGFiaWxpdGllcyB0aGF0IHRoZSBOb2RlIFR5cGUgZXhwb3Nlcy4KKyAqLworcHVibGljIGNsYXNzIENhcGFiaWxpdHlEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zODcxODI1NDE1MzM4MjY4MDMwTDsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJLyoqIElkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNhcGFiaWxpdHkuICovCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkU291cmNlVHlwZXM7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBjYXBhYmlsaXR5U291cmNlczsKKwkvKioKKwkgKiBUaGUgcHJvcGVydGllcyBmaWVsZCBjb250YWlucyBhbGwgcHJvcGVydGllcyBkZWZpbmVkIGZvcgorCSAqIENhcGFiaWxpdHlEZWZpbml0aW9uCisJICovCisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnRpZXM7CisKKwkvLyBzcGVjaWZpZXMgdGhlIHJlc291cmNlIGluc3RhbmNlIGhvbGRpbmcgdGhpcyByZXF1aXJlbWVudAorCXByaXZhdGUgU3RyaW5nIG93bmVySWQ7CisJcHJpdmF0ZSBTdHJpbmcgb3duZXJOYW1lOworCXByaXZhdGUgU3RyaW5nIG1pbk9jY3VycmVuY2VzOworCXByaXZhdGUgU3RyaW5nIG1heE9jY3VycmVuY2VzOworCisJcHVibGljIENhcGFiaWxpdHlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBDYXBhYmlsaXR5RGVmaW5pdGlvbihDYXBhYmlsaXR5RGVmaW5pdGlvbiBvdGhlcikgeworCQl0aGlzLnVuaXF1ZUlkID0gb3RoZXIudW5pcXVlSWQ7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBvdGhlci5kZXNjcmlwdGlvbjsKKwkJdGhpcy5uYW1lID0gb3RoZXIubmFtZTsKKwkJdGhpcy50eXBlID0gb3RoZXIudHlwZTsKKwkJaWYgKG90aGVyLnZhbGlkU291cmNlVHlwZXMgIT0gbnVsbCkgeworCQkJdGhpcy52YWxpZFNvdXJjZVR5cGVzID0gbmV3IEFycmF5TGlzdDw+KG90aGVyLnZhbGlkU291cmNlVHlwZXMpOworCQl9CisJCWlmIChvdGhlci5jYXBhYmlsaXR5U291cmNlcyAhPSBudWxsKSB7CisJCQl0aGlzLmNhcGFiaWxpdHlTb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KG90aGVyLmNhcGFiaWxpdHlTb3VyY2VzKTsKKwkJfQorCQlpZiAob3RoZXIucHJvcGVydGllcyAhPSBudWxsKSB7CisJCQl0aGlzLnByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4ob3RoZXIucHJvcGVydGllcyk7CisJCX0KKwkJdGhpcy5vd25lcklkID0gb3RoZXIub3duZXJJZDsKKwkJdGhpcy5vd25lck5hbWUgPSBvdGhlci5vd25lck5hbWU7CisJCXRoaXMubWluT2NjdXJyZW5jZXMgPSBvdGhlci5taW5PY2N1cnJlbmNlczsKKwkJdGhpcy5tYXhPY2N1cnJlbmNlcyA9IG90aGVyLm1heE9jY3VycmVuY2VzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsaWRTb3VyY2VUeXBlcygpIHsKKwkJcmV0dXJuIHZhbGlkU291cmNlVHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsaWRTb3VyY2VUeXBlcyhMaXN0PFN0cmluZz4gdmFsaWRTb3VyY2VUeXBlcykgeworCQl0aGlzLnZhbGlkU291cmNlVHlwZXMgPSB2YWxpZFNvdXJjZVR5cGVzOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q2FwYWJpbGl0eVNvdXJjZXMoKSB7CisJCXJldHVybiBjYXBhYmlsaXR5U291cmNlczsKKwl9CisKKwlwdWJsaWMgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllcykgeworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHlTb3VyY2VzKExpc3Q8U3RyaW5nPiBjYXBhYmlsaXR5U291cmNlcykgeworCQl0aGlzLmNhcGFiaWxpdHlTb3VyY2VzID0gY2FwYWJpbGl0eVNvdXJjZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRPd25lcklkKCkgeworCQlyZXR1cm4gb3duZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPd25lcklkKFN0cmluZyBvd25lcklkKSB7CisJCXRoaXMub3duZXJJZCA9IG93bmVySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRPd25lck5hbWUoKSB7CisJCXJldHVybiBvd25lck5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3duZXJOYW1lKFN0cmluZyBvd25lck5hbWUpIHsKKwkJdGhpcy5vd25lck5hbWUgPSBvd25lck5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNaW5PY2N1cnJlbmNlcygpIHsKKwkJcmV0dXJuIG1pbk9jY3VycmVuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1pbk9jY3VycmVuY2VzKFN0cmluZyBtaW5PY2N1cnJlbmNlcykgeworCQl0aGlzLm1pbk9jY3VycmVuY2VzID0gbWluT2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXhPY2N1cnJlbmNlcygpIHsKKwkJcmV0dXJuIG1heE9jY3VycmVuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1heE9jY3VycmVuY2VzKFN0cmluZyBtYXhPY2N1cnJlbmNlcykgeworCQl0aGlzLm1heE9jY3VycmVuY2VzID0gbWF4T2NjdXJyZW5jZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY2FwYWJpbGl0eVNvdXJjZXMgPT0gbnVsbCkgPyAwIDogY2FwYWJpbGl0eVNvdXJjZXMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChkZXNjcmlwdGlvbiA9PSBudWxsKSA/IDAgOiBkZXNjcmlwdGlvbi5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1heE9jY3VycmVuY2VzID09IG51bGwpID8gMCA6IG1heE9jY3VycmVuY2VzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobWluT2NjdXJyZW5jZXMgPT0gbnVsbCkgPyAwIDogbWluT2NjdXJyZW5jZXMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChvd25lcklkID09IG51bGwpID8gMCA6IG93bmVySWQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChvd25lck5hbWUgPT0gbnVsbCkgPyAwIDogb3duZXJOYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgocHJvcGVydGllcyA9PSBudWxsKSA/IDAgOiBwcm9wZXJ0aWVzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodHlwZSA9PSBudWxsKSA/IDAgOiB0eXBlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodW5pcXVlSWQgPT0gbnVsbCkgPyAwIDogdW5pcXVlSWQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh2YWxpZFNvdXJjZVR5cGVzID09IG51bGwpID8gMCA6IHZhbGlkU291cmNlVHlwZXMuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCUNhcGFiaWxpdHlEZWZpbml0aW9uIG90aGVyID0gKENhcGFiaWxpdHlEZWZpbml0aW9uKSBvYmo7CisJCWlmIChjYXBhYmlsaXR5U291cmNlcyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY2FwYWJpbGl0eVNvdXJjZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNhcGFiaWxpdHlTb3VyY2VzLmVxdWFscyhvdGhlci5jYXBhYmlsaXR5U291cmNlcykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuZGVzY3JpcHRpb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWRlc2NyaXB0aW9uLmVxdWFscyhvdGhlci5kZXNjcmlwdGlvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChtYXhPY2N1cnJlbmNlcyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubWF4T2NjdXJyZW5jZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW1heE9jY3VycmVuY2VzLmVxdWFscyhvdGhlci5tYXhPY2N1cnJlbmNlcykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChtaW5PY2N1cnJlbmNlcyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubWluT2NjdXJyZW5jZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW1pbk9jY3VycmVuY2VzLmVxdWFscyhvdGhlci5taW5PY2N1cnJlbmNlcykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5uYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKG93bmVySWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm93bmVySWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW93bmVySWQuZXF1YWxzKG90aGVyLm93bmVySWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAob3duZXJOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5vd25lck5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW93bmVyTmFtZS5lcXVhbHMob3RoZXIub3duZXJOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnByb3BlcnRpZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXByb3BlcnRpZXMuZXF1YWxzKG90aGVyLnByb3BlcnRpZXMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudHlwZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghdHlwZS5lcXVhbHMob3RoZXIudHlwZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh1bmlxdWVJZCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudW5pcXVlSWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXVuaXF1ZUlkLmVxdWFscyhvdGhlci51bmlxdWVJZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh2YWxpZFNvdXJjZVR5cGVzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci52YWxpZFNvdXJjZVR5cGVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF2YWxpZFNvdXJjZVR5cGVzLmVxdWFscyhvdGhlci52YWxpZFNvdXJjZVR5cGVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJDYXBhYmlsaXR5RGVmaW5pdGlvbiBbdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsgIiwgbmFtZT0iICsgbmFtZQorCQkJCSsgIiwgdHlwZT0iICsgdHlwZSArICIsIHZhbGlkU291cmNlVHlwZXM9IiArIHZhbGlkU291cmNlVHlwZXMgKyAiLCBjYXBhYmlsaXR5U291cmNlcz0iCisJCQkJKyBjYXBhYmlsaXR5U291cmNlcyArICIsIHByb3BlcnRpZXM9IiArIHByb3BlcnRpZXMgKyAiLCBvd25lcklkPSIgKyBvd25lcklkICsgIiwgb3duZXJOYW1lPSIgKyBvd25lck5hbWUKKwkJCQkrICIsIG1pbk9jY3VycmVuY2VzPSIgKyBtaW5PY2N1cnJlbmNlcyArICIsIG1heE9jY3VycmVuY2VzPSIgKyBtYXhPY2N1cnJlbmNlcyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9DYXBhYmlsaXR5VHlwZURlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9DYXBhYmlsaXR5VHlwZURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkxZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbjsKKworLyoqCisgKiBTcGVjaWZpZXMgdGhlIGNhcGFiaWxpdGllcyB0aGF0IHRoZSBOb2RlIFR5cGUgZXhwb3Nlcy4KKyAqLworcHVibGljIGNsYXNzIENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBleHRlbmRzIENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24geworCisJcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEZyb207CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllczsKKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVyaXZlZEZyb20oKSB7CisJCXJldHVybiBkZXJpdmVkRnJvbTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXJpdmVkRnJvbShTdHJpbmcgZGVyaXZlZEZyb20pIHsKKwkJdGhpcy5kZXJpdmVkRnJvbSA9IGRlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uKENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24gcCkgeworCQlzdXBlcihwKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgWyBkZXJpdmVkRnJvbT0iICsgZGVyaXZlZEZyb20gKyAiLCBwcm9wZXJ0aWVzPSIgKyBwcm9wZXJ0aWVzICsgIiBdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9DYXBhYmlsdHlJbnN0YW5jZS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NhcGFiaWx0eUluc3RhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1ZWRmOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9DYXBhYmlsdHlJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBDYXBhYmlsdHlJbnN0YW5jZSB7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzOworCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNhcGFiaWx0eUluc3RhbmNlIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBwcm9wZXJ0aWVzPSIgKyBwcm9wZXJ0aWVzICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NhdGVnb3J5LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2NhYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NhdGVnb3J5LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitwdWJsaWMgY2xhc3MgQ2F0ZWdvcnkgeworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsvLyB3aWxsIGJlIGNoYW5nZWQgdG8gY2F0ZWdvcnlEaXNwbGF5TmFtZQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlDYXRlZ29yeSBvdGhlciA9IChDYXRlZ29yeSkgb2JqOworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQ2F0ZWdvcnkgW25hbWU9IiArIG5hbWUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhNzBkZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db21wb25lbnQuamF2YQpAQCAtMCwwICsxLDU5OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvbklnbm9yZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjM3Mzc1NjQ1OTk2Nzk0OTEyMEw7CisKKwlwcml2YXRlIENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiBjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb247CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0czsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0czsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gdG9zY2FBcnRpZmFjdHM7CisKKwlwcml2YXRlIExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yaWVzOworCisJLy8gVXNlcgorCXByaXZhdGUgU3RyaW5nIGNyZWF0b3JVc2VySWQ7CisJcHJpdmF0ZSBTdHJpbmcgY3JlYXRvckZ1bGxOYW1lOworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVyVXNlcklkOworCXByaXZhdGUgU3RyaW5nIGxhc3RVcGRhdGVyRnVsbE5hbWU7CisKKwlwcm90ZWN0ZWQgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZTsKKworCXByaXZhdGUgTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzOworCisJcHJpdmF0ZSBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+PiBjb21wb25lbnRJbnN0YW5jZXNJbnB1dHM7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4+IGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXM7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+PiBjb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50czsKKworCXByaXZhdGUgTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0czsKKworCXByaXZhdGUgTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwczsKKworCXB1YmxpYyBDb21wb25lbnQoQ29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbikgeworCQl0aGlzLmNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiA9IGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbjsKKwl9CisKKwlASnNvbklnbm9yZQorCXB1YmxpYyBDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24gZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGdldEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHMoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMpIHsKKwkJdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZ2V0VG9zY2FBcnRpZmFjdHMoKSB7CisJCXJldHVybiB0b3NjYUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYUFydGlmYWN0cyhNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IHRvc2NhQXJ0aWZhY3RzKSB7CisJCXRoaXMudG9zY2FBcnRpZmFjdHMgPSB0b3NjYUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQljb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0TmFtZShuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCWNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VmVyc2lvbih2ZXJzaW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIaWdoZXN0VmVyc2lvbihCb29sZWFuIGlzSGlnaGVzdFZlcnNpb24pIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRIaWdoZXN0VmVyc2lvbihpc0hpZ2hlc3RWZXJzaW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoTG9uZyBjcmVhdGlvbkRhdGUpIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRDcmVhdGlvbkRhdGUoY3JlYXRpb25EYXRlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlRGF0ZShMb25nIGxhc3RVcGRhdGVEYXRlKSB7CisJCWNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0TGFzdFVwZGF0ZURhdGUobGFzdFVwZGF0ZURhdGUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQljb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0gc3RhdGUpIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShzdGF0ZS5uYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhZ3MoTGlzdDxTdHJpbmc+IHRhZ3MpIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRUYWdzKHRhZ3MpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEljb24oU3RyaW5nIGljb24pIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRJY29uKGljb24pOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnRhY3RJZChTdHJpbmcgY29udGFjdElkKSB7CisJCWNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0Q29udGFjdElkKGNvbnRhY3RJZCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yVXNlcklkKCkgeworCQlyZXR1cm4gY3JlYXRvclVzZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdG9yVXNlcklkKFN0cmluZyBjcmVhdG9yVXNlcklkKSB7CisJCXRoaXMuY3JlYXRvclVzZXJJZCA9IGNyZWF0b3JVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDcmVhdG9yRnVsbE5hbWUoKSB7CisJCXJldHVybiBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRvckZ1bGxOYW1lKFN0cmluZyBjcmVhdG9yRnVsbE5hbWUpIHsKKwkJdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSBjcmVhdG9yRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlclVzZXJJZCgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVyVXNlcklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVyVXNlcklkKFN0cmluZyBsYXN0VXBkYXRlclVzZXJJZCkgeworCQl0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gbGFzdFVwZGF0ZXJVc2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0VXBkYXRlckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gbGFzdFVwZGF0ZXJGdWxsTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlckZ1bGxOYW1lKFN0cmluZyBsYXN0VXBkYXRlckZ1bGxOYW1lKSB7CisJCXRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGxhc3RVcGRhdGVyRnVsbE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCk7CisJfQorCisJcHVibGljIEJvb2xlYW4gaXNIaWdoZXN0VmVyc2lvbigpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuaXNIaWdoZXN0VmVyc2lvbigpOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uRGF0ZSgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCk7CisJfQorCisJcHVibGljIExvbmcgZ2V0TGFzdFVwZGF0ZURhdGUoKSB7CisJCXJldHVybiBjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldExhc3RVcGRhdGVEYXRlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0RGVzY3JpcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgTGlmZWN5Y2xlU3RhdGVFbnVtIGdldExpZmVjeWNsZVN0YXRlKCkgeworCQlpZiAoY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRTdGF0ZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiBMaWZlY3ljbGVTdGF0ZUVudW0udmFsdWVPZihjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFRhZ3MoKSB7CisJCXJldHVybiBjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFRhZ3MoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEljb24oKSB7CisJCXJldHVybiBjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldEljb24oKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRhY3RJZCgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0Q29udGFjdElkKCk7CisJfQorCisJcHVibGljIExpc3Q8SW5wdXREZWZpbml0aW9uPiBnZXRJbnB1dHMoKSB7CisJCXJldHVybiBpbnB1dHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5wdXRzKExpc3Q8SW5wdXREZWZpbml0aW9uPiBpbnB1dHMpIHsKKwkJdGhpcy5pbnB1dHMgPSBpbnB1dHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlU3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtIHN0YXRlKSB7CisJCWlmIChzdGF0ZSAhPSBudWxsKSB7CisJCQl0aGlzLmNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3RhdGUoc3RhdGUubmFtZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VVVJRCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVVSUQoU3RyaW5nIHVVSUQpIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVVUlEKHVVSUQpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN5c3RlbU5hbWUoU3RyaW5nIHN5c3RlbU5hbWUpIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTeXN0ZW1OYW1lKHN5c3RlbU5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtTmFtZSgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3lzdGVtTmFtZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFsbFZlcnNpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsVmVyc2lvbnMpIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRBbGxWZXJzaW9ucyhhbGxWZXJzaW9ucyk7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QWxsVmVyc2lvbnMoKSB7CisJCXJldHVybiBjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldEFsbFZlcnNpb25zKCk7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZ2V0RGVwbG95bWVudEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGRlcGxveW1lbnRBcnRpZmFjdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVwbG95bWVudEFydGlmYWN0cyhNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGRlcGxveW1lbnRBcnRpZmFjdHMpIHsKKwkJdGhpcy5kZXBsb3ltZW50QXJ0aWZhY3RzID0gZGVwbG95bWVudEFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGdldENhdGVnb3JpZXMoKSB7CisJCXJldHVybiBjYXRlZ29yaWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3JpZXMoTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMpIHsKKwkJdGhpcy5jYXRlZ29yaWVzID0gY2F0ZWdvcmllczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vcm1hbGl6ZWROYW1lKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROb3JtYWxpemVkTmFtZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vcm1hbGl6ZWROYW1lKFN0cmluZyBub3JtYWxpemVkTmFtZSkgeworCQljb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldE5vcm1hbGl6ZWROYW1lKG5vcm1hbGl6ZWROYW1lKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50VHlwZUVudW0gZ2V0Q29tcG9uZW50VHlwZSgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudFR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZShDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisJCXRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBnZXRDYXBhYmlsaXRpZXMoKSB7CisJCXJldHVybiBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0aWVzKE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXMpIHsKKwkJdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gZ2V0UmVxdWlyZW1lbnRzKCkgeworCQlyZXR1cm4gcmVxdWlyZW1lbnRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50cyhNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50cykgeworCQl0aGlzLnJlcXVpcmVtZW50cyA9IHJlcXVpcmVtZW50czsKKwl9CisKKwlwdWJsaWMgTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkgeworCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudEluc3RhbmNlcyhMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNvdXJjZUluc3RhbmNlcykgeworCQl0aGlzLmNvbXBvbmVudEluc3RhbmNlcyA9IHJlc291cmNlSW5zdGFuY2VzOworCX0KKworCXB1YmxpYyBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKCkgeworCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyhMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gcmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnMpIHsKKwkJdGhpcy5jb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMgPSByZXNvdXJjZUluc3RhbmNlc1JlbGF0aW9uczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gZ2V0Q29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcygpIHsKKwkJcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcygKKwkJCU1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4+IHJlc291cmNlSW5zdGFuY2VzUHJvcGVydGllcykgeworCQl0aGlzLmNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPSByZXNvdXJjZUluc3RhbmNlc1Byb3BlcnRpZXM7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0SXNEZWxldGVkKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5pc0RlbGV0ZWQoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJc0RlbGV0ZWQoQm9vbGVhbiBpc0RlbGV0ZWQpIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRJc0RlbGV0ZWQoaXNEZWxldGVkKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDb2RlKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRQcm9qZWN0Q29kZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb2plY3RDb2RlKFN0cmluZyBwcm9qZWN0Q29kZSkgeworCQljb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFByb2plY3RDb2RlKHByb2plY3RDb2RlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENzYXJVVUlEKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRDc2FyVVVJRCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENzYXJVVUlEKFN0cmluZyBjc2FyVVVJRCkgeworCQljb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldENzYXJVVUlEKGNzYXJVVUlEKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENzYXJWZXJzaW9uKCkgeworCQlyZXR1cm4gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRDc2FyVmVyc2lvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENzYXJWZXJzaW9uKFN0cmluZyBjc2FyVmVyc2lvbikgeworCQljb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldENzYXJWZXJzaW9uKGNzYXJWZXJzaW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEltcG9ydGVkVG9zY2FDaGVja3N1bSgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKFN0cmluZyBpbXBvcnRlZFRvc2NhQ2hlY2tzdW0pIHsKKwkJY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRJbXBvcnRlZFRvc2NhQ2hlY2tzdW0oaW1wb3J0ZWRUb3NjYUNoZWNrc3VtKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEludmFyaWFudFVVSUQoKSB7CisJCXJldHVybiBjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldEludmFyaWFudFVVSUQoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnZhcmlhbnRVVUlEKFN0cmluZyBpbnZhcmlhbnRVVUlEKSB7CisJCWNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxHcm91cERlZmluaXRpb24+IGdldEdyb3VwcygpIHsKKwkJcmV0dXJuIGdyb3VwczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cHMoTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcykgeworCQl0aGlzLmdyb3VwcyA9IGdyb3VwczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdHMgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY2F0ZWdvcmllcyA9PSBudWxsKSA/IDAgOiBjYXRlZ29yaWVzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uID09IG51bGwpID8gMCA6IGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGNyZWF0b3JVc2VySWQgPT0gbnVsbCkgPyAwIDogY3JlYXRvclVzZXJJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGNyZWF0b3JGdWxsTmFtZSA9PSBudWxsKSA/IDAgOiBjcmVhdG9yRnVsbE5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChkZXBsb3ltZW50QXJ0aWZhY3RzID09IG51bGwpID8gMCA6IGRlcGxveW1lbnRBcnRpZmFjdHMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChsYXN0VXBkYXRlclVzZXJJZCA9PSBudWxsKSA/IDAgOiBsYXN0VXBkYXRlclVzZXJJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGxhc3RVcGRhdGVyRnVsbE5hbWUgPT0gbnVsbCkgPyAwIDogbGFzdFVwZGF0ZXJGdWxsTmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGNhcGFiaWxpdGllcyA9PSBudWxsKSA/IDAgOiBjYXBhYmlsaXRpZXMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChyZXF1aXJlbWVudHMgPT0gbnVsbCkgPyAwIDogcmVxdWlyZW1lbnRzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29tcG9uZW50SW5zdGFuY2VzID09IG51bGwpID8gMCA6IGNvbXBvbmVudEluc3RhbmNlcy5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKwkJCQkrICgoY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcyA9PSBudWxsKSA/IDAgOiBjb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorCQkJCSsgKChjb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzID09IG51bGwpID8gMCA6IGNvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChjb21wb25lbnRJbnN0YW5jZXNJbnB1dHMgPT0gbnVsbCkgPyAwIDogY29tcG9uZW50SW5zdGFuY2VzSW5wdXRzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zID09IG51bGwpID8gMCA6IGNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucy5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGdyb3VwcyA9PSBudWxsKSA/IDAgOiBncm91cHMuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCUNvbXBvbmVudCBvdGhlciA9IChDb21wb25lbnQpIG9iajsKKwkJaWYgKGFydGlmYWN0cyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuYXJ0aWZhY3RzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhcnRpZmFjdHMuZXF1YWxzKG90aGVyLmFydGlmYWN0cykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jYXRlZ29yaWVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjYXRlZ29yaWVzLmVxdWFscyhvdGhlci5jYXRlZ29yaWVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24uZXF1YWxzKG90aGVyLmNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjcmVhdG9yVXNlcklkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jcmVhdG9yVXNlcklkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjcmVhdG9yVXNlcklkLmVxdWFscyhvdGhlci5jcmVhdG9yVXNlcklkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNyZWF0b3JGdWxsTmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY3JlYXRvckZ1bGxOYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjcmVhdG9yRnVsbE5hbWUuZXF1YWxzKG90aGVyLmNyZWF0b3JGdWxsTmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChkZXBsb3ltZW50QXJ0aWZhY3RzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5kZXBsb3ltZW50QXJ0aWZhY3RzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFkZXBsb3ltZW50QXJ0aWZhY3RzLmVxdWFscyhvdGhlci5kZXBsb3ltZW50QXJ0aWZhY3RzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGxhc3RVcGRhdGVyVXNlcklkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5sYXN0VXBkYXRlclVzZXJJZCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbGFzdFVwZGF0ZXJVc2VySWQuZXF1YWxzKG90aGVyLmxhc3RVcGRhdGVyVXNlcklkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGxhc3RVcGRhdGVyRnVsbE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmxhc3RVcGRhdGVyRnVsbE5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWxhc3RVcGRhdGVyRnVsbE5hbWUuZXF1YWxzKG90aGVyLmxhc3RVcGRhdGVyRnVsbE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb21wb25lbnRJbnN0YW5jZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNvbXBvbmVudEluc3RhbmNlcy5lcXVhbHMob3RoZXIuY29tcG9uZW50SW5zdGFuY2VzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMuZXF1YWxzKG90aGVyLmNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmICghT2JqZWN0cy5lcXVhbHMoY29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlcywgb3RoZXIuY29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlcykpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIU9iamVjdHMuZXF1YWxzKGNvbXBvbmVudEluc3RhbmNlc0lucHV0cywgb3RoZXIuY29tcG9uZW50SW5zdGFuY2VzSW5wdXRzKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zLmVxdWFscyhvdGhlci5jb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAocmVxdWlyZW1lbnRzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5yZXF1aXJlbWVudHMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXJlcXVpcmVtZW50cy5lcXVhbHMob3RoZXIucmVxdWlyZW1lbnRzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNhcGFiaWxpdGllcyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY2FwYWJpbGl0aWVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjYXBhYmlsaXRpZXMuZXF1YWxzKG90aGVyLmNhcGFiaWxpdGllcykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChncm91cHMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmdyb3VwcyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghZ3JvdXBzLmVxdWFscyhvdGhlci5ncm91cHMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBzdWJDYXRlZ29yeSkgeworCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCB8fCBzdWJDYXRlZ29yeSAhPSBudWxsKSB7CisJCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7CisJCQkJY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJfQorCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHNlbGVjdGVkQ2F0ZWdvcnkgPSBudWxsOworCQkJZm9yIChDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWYgOiBjYXRlZ29yaWVzKSB7CisJCQkJaWYgKGNhdGVnb3J5RGVmLmdldE5hbWUoKS5lcXVhbHMoY2F0ZWdvcnkpKSB7CisJCQkJCXNlbGVjdGVkQ2F0ZWdvcnkgPSBjYXRlZ29yeURlZjsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2VsZWN0ZWRDYXRlZ29yeSA9PSBudWxsKSB7CisJCQkJc2VsZWN0ZWRDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCQlzZWxlY3RlZENhdGVnb3J5LnNldE5hbWUoY2F0ZWdvcnkpOworCQkJCWNhdGVnb3JpZXMuYWRkKHNlbGVjdGVkQ2F0ZWdvcnkpOworCQkJfQorCQkJTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IHN1YmNhdGVnb3JpZXMgPSBzZWxlY3RlZENhdGVnb3J5LmdldFN1YmNhdGVnb3JpZXMoKTsKKwkJCWlmIChzdWJjYXRlZ29yaWVzID09IG51bGwpIHsKKwkJCQlzdWJjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJc2VsZWN0ZWRDYXRlZ29yeS5zZXRTdWJjYXRlZ29yaWVzKHN1YmNhdGVnb3JpZXMpOworCQkJfQorCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHNlbGVjdGVkU3ViY2F0ZWdvcnkgPSBudWxsOworCQkJZm9yIChTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0ZWdvcnkgOiBzdWJjYXRlZ29yaWVzKSB7CisJCQkJaWYgKHN1YmNhdGVnb3J5LmdldE5hbWUoKS5lcXVhbHMoc3ViQ2F0ZWdvcnkpKSB7CisJCQkJCXNlbGVjdGVkU3ViY2F0ZWdvcnkgPSBzdWJjYXRlZ29yeTsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2VsZWN0ZWRTdWJjYXRlZ29yeSA9PSBudWxsKSB7CisJCQkJc2VsZWN0ZWRTdWJjYXRlZ29yeSA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCQlzZWxlY3RlZFN1YmNhdGVnb3J5LnNldE5hbWUoc3ViQ2F0ZWdvcnkpOworCQkJCXN1YmNhdGVnb3JpZXMuYWRkKHNlbGVjdGVkU3ViY2F0ZWdvcnkpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnkoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5KSB7CisJCWFkZENhdGVnb3J5KGNhdGVnb3J5LCBudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnksIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeSkgeworCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7CisJCQljYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCX0KKwkJYm9vbGVhbiBmb3VuZENhdCA9IGZhbHNlOworCQlmb3IgKENhdGVnb3J5RGVmaW5pdGlvbiBjYXQgOiBjYXRlZ29yaWVzKSB7CisJCQlpZiAoY2F0LmdldE5hbWUoKS5lcXVhbHMoY2F0ZWdvcnkuZ2V0TmFtZSgpKSkgeworCQkJCWZvdW5kQ2F0ID0gdHJ1ZTsKKwkJCQlpZiAoc3ViQ2F0ZWdvcnkgIT0gbnVsbCkgeworCQkJCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gc3ViY2F0ZWdvcmllcyA9IGNhdC5nZXRTdWJjYXRlZ29yaWVzKCk7CisJCQkJCWlmIChzdWJjYXRlZ29yaWVzID09IG51bGwpIHsKKwkJCQkJCXN1YmNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQkJCWNhdC5zZXRTdWJjYXRlZ29yaWVzKHN1YmNhdGVnb3JpZXMpOworCQkJCQl9CisJCQkJCWZvciAoU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YmNhdCA6IHN1YmNhdGVnb3JpZXMpIHsKKwkJCQkJCWJvb2xlYW4gZm91bmRTdWIgPSBmYWxzZTsKKwkJCQkJCWlmIChzdWJjYXQuZ2V0TmFtZSgpLmVxdWFscyhzdWJDYXRlZ29yeS5nZXROYW1lKCkpKSB7CisJCQkJCQkJZm91bmRTdWIgPSB0cnVlOworCQkJCQkJfQorCQkJCQkJaWYgKGZvdW5kU3ViID09IGZhbHNlKSB7CisJCQkJCQkJc3ViY2F0ZWdvcmllcy5hZGQoc3ViQ2F0ZWdvcnkpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChmb3VuZENhdCA9PSBmYWxzZSkgeworCQkJaWYgKHN1YkNhdGVnb3J5ICE9IG51bGwpIHsKKwkJCQljYXRlZ29yeS5hZGRTdWJDYXRlZ29yeShzdWJDYXRlZ29yeSk7CisJCQl9CisJCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CisJCX0KKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4+IGdldENvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMoKSB7CisJCXJldHVybiBjb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMoCisJCQlNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPj4gY29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlcykgeworCQl0aGlzLmNvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMgPSBjb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+PiBnZXRDb21wb25lbnRJbnN0YW5jZXNJbnB1dHMoKSB7CisJCXJldHVybiBjb21wb25lbnRJbnN0YW5jZXNJbnB1dHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50SW5zdGFuY2VzSW5wdXRzKE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4+IGNvbXBvbmVudEluc3RhbmNlc0lucHV0cykgeworCQl0aGlzLmNvbXBvbmVudEluc3RhbmNlc0lucHV0cyA9IGNvbXBvbmVudEluc3RhbmNlc0lucHV0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY0NvbXBvbmV0VHlwZUFydGlmYWN0cyhNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IHNwZWNpZmljQ29tcG9uZW50VHlwZUFydGlmYWN0cykgeworCQkvLyBJbXBsZW1lbnQgd2hlcmUgbmVlZGVkCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudEluc3RJbnB1dHNNYXAuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db21wb25lbnRJbnN0SW5wdXRzTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5YWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db21wb25lbnRJbnN0SW5wdXRzTWFwLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RJbnB1dHNNYXAgeworCisJTWFwPFN0cmluZywgTGlzdDxJbnB1dERlZmluaXRpb24+PiBjb21wb25lbnRJbnN0YW5jZUlucHV0c01hcDsKKworCXB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PElucHV0RGVmaW5pdGlvbj4+IGdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzTWFwKCkgeworCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2VJbnB1dHNNYXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50SW5zdGFuY2VJbnB1dHNNYXAoTWFwPFN0cmluZywgTGlzdDxJbnB1dERlZmluaXRpb24+PiBjb21wb25lbnRJbnN0YW5jZUlucHV0c01hcCkgeworCQl0aGlzLmNvbXBvbmVudEluc3RhbmNlSW5wdXRzTWFwID0gY29tcG9uZW50SW5zdGFuY2VJbnB1dHNNYXA7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudEluc3RhbmNlLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50SW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWFmODliCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudEluc3RhbmNlLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQ29tcG9uZW50SW5zdGFuY2VEYXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlIGV4dGVuZHMgQ29tcG9uZW50SW5zdGFuY2VEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NzIxNDY1NjkzODg0NjIxMjIzTDsKKworCXByaXZhdGUgU3RyaW5nIGljb247CisKKwlwcml2YXRlIFN0cmluZyBjb21wb25lbnROYW1lOworCXByaXZhdGUgU3RyaW5nIGNvbXBvbmVudFZlcnNpb247CisJcHJpdmF0ZSBTdHJpbmcgdG9zY2FDb21wb25lbnROYW1lOworCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllczsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzOworCXByaXZhdGUgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzOworCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uIHIpIHsKKwkJc3VwZXIocik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJY29uKCkgeworCQlyZXR1cm4gaWNvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJY29uKFN0cmluZyBpY29uKSB7CisJCXRoaXMuaWNvbiA9IGljb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgeworCQlyZXR1cm4gY29tcG9uZW50TmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnROYW1lKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKwkJdGhpcy5jb21wb25lbnROYW1lID0gcmVzb3VyY2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VmVyc2lvbigpIHsKKwkJcmV0dXJuIGNvbXBvbmVudFZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb3NjYUNvbXBvbmVudE5hbWUoKSB7CisJCXJldHVybiB0b3NjYUNvbXBvbmVudE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FDb21wb25lbnROYW1lKFN0cmluZyB0b3NjYUNvbXBvbmVudE5hbWUpIHsKKwkJdGhpcy50b3NjYUNvbXBvbmVudE5hbWUgPSB0b3NjYUNvbXBvbmVudE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VmVyc2lvbihTdHJpbmcgcmVzb3VyY2VWZXJzaW9uKSB7CisJCXRoaXMuY29tcG9uZW50VmVyc2lvbiA9IHJlc291cmNlVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGdldENhcGFiaWxpdGllcygpIHsKKwkJcmV0dXJuIGNhcGFiaWxpdGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXRpZXMoTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllcykgeworCQl0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBnZXRSZXF1aXJlbWVudHMoKSB7CisJCXJldHVybiByZXF1aXJlbWVudHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRzKE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzKSB7CisJCXRoaXMucmVxdWlyZW1lbnRzID0gcmVxdWlyZW1lbnRzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGdldERlcGxveW1lbnRBcnRpZmFjdHMoKSB7CisJCXJldHVybiBkZXBsb3ltZW50QXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRBcnRpZmFjdHMoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzKSB7CisJCXRoaXMuZGVwbG95bWVudEFydGlmYWN0cyA9IGRlcGxveW1lbnRBcnRpZmFjdHM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMjMzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGV4dGVuZHMgQXR0cmlidXRlRGVmaW5pdGlvbgorCQlpbXBsZW1lbnRzIElDb21wb25lbnRJbnN0YW5jZUNvbm5lY3RlZEVsZW1lbnQsIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDk2ODI4NDExMjY5MjM1Nzk1TDsKKworCXByaXZhdGUgQm9vbGVhbiBoaWRkZW47CisKKwkvKioKKwkgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gZ3JhcGgKKwkgKi8KKwlwcml2YXRlIFN0cmluZyB2YWx1ZVVuaXF1ZVVpZDsKKworCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUoQXR0cmlidXRlRGVmaW5pdGlvbiBwZCwgQm9vbGVhbiBoaWRkZW4sIFN0cmluZyB2YWx1ZVVuaXF1ZVVpZCkgeworCQlzdXBlcihwZCk7CisKKwkJdGhpcy5oaWRkZW4gPSBoaWRkZW47CisJCXRoaXMudmFsdWVVbmlxdWVVaWQgPSB2YWx1ZVVuaXF1ZVVpZDsKKwkJc2V0UGFyZW50VW5pcXVlSWQocGQuZ2V0UGFyZW50VW5pcXVlSWQoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZVVuaXF1ZVVpZCgpIHsKKwkJcmV0dXJuIHZhbHVlVW5pcXVlVWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlVW5pcXVlVWlkKFN0cmluZyB2YWx1ZVVuaXF1ZVVpZCkgeworCQl0aGlzLnZhbHVlVW5pcXVlVWlkID0gdmFsdWVVbmlxdWVVaWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBbICIgKyBzdXBlci50b1N0cmluZygpICsgIiAsIHZhbHVlPSIgKyBoaWRkZW4gKyAiLCB2YWx1ZVVuaXF1ZVVpZCA9ICIKKwkJCQkrIHZhbHVlVW5pcXVlVWlkICsgIiBdIjsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBpc0hpZGRlbigpIHsKKwkJcmV0dXJuIGhpZGRlbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIaWRkZW4oQm9vbGVhbiBoaWRkZW4pIHsKKwkJdGhpcy5oaWRkZW4gPSBoaWRkZW47CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50SW5zdGFuY2VJbnB1dC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudEluc3RhbmNlSW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM0ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudEluc3RhbmNlSW5wdXQuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlSdWxlOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBleHRlbmRzIElucHV0RGVmaW5pdGlvbiBpbXBsZW1lbnRzIElDb21wb25lbnRJbnN0YW5jZUNvbm5lY3RlZEVsZW1lbnQgeworCisJLyoqCisJICogVmFsdWUgb2YgcHJvcGVydHkKKwkgKi8KKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCS8qKgorCSAqIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHByb3BlcnR5IHZhbHVlIG9uIGdyYXBoCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWVVbmlxdWVVaWQ7CisKKwlwcml2YXRlIFN0cmluZyBpbnB1dElkOworCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGF0aCA9IG51bGw7CisKKwlwcml2YXRlIExpc3Q8UHJvcGVydHlSdWxlPiBydWxlcyA9IG51bGw7CisJcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VOYW1lOworCXByaXZhdGUgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQ7CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VJbnB1dCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VJbnB1dChQcm9wZXJ0eURhdGFEZWZpbml0aW9uIGN1clByb3BlcnR5RGVmLCBTdHJpbmcgaW5wdXRJZCwgU3RyaW5nIHZhbHVlLAorCQkJU3RyaW5nIHZhbHVlVW5pcXVlVWlkKSB7CisJCXN1cGVyKGN1clByb3BlcnR5RGVmKTsKKwkJdGhpcy5pbnB1dElkID0gaW5wdXRJZDsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLnZhbHVlVW5pcXVlVWlkID0gdmFsdWVVbmlxdWVVaWQ7CisJfQorCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlSW5wdXQoSW5wdXREZWZpbml0aW9uIHBkLCBTdHJpbmcgdmFsdWUsIFN0cmluZyB2YWx1ZVVuaXF1ZVVpZCkgeworCQlzdXBlcihwZCk7CisKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLnZhbHVlVW5pcXVlVWlkID0gdmFsdWVVbmlxdWVVaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRJbnN0YW5jZU5hbWUoKSB7CisJCXJldHVybiBjb21wb25lbnRJbnN0YW5jZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50SW5zdGFuY2VOYW1lKFN0cmluZyBjb21wb25lbnRJbnN0YW5jZU5hbWUpIHsKKwkJdGhpcy5jb21wb25lbnRJbnN0YW5jZU5hbWUgPSBjb21wb25lbnRJbnN0YW5jZU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRJbnN0YW5jZUlkKCkgeworCQlyZXR1cm4gY29tcG9uZW50SW5zdGFuY2VJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRJbnN0YW5jZUlkKFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkKSB7CisJCXRoaXMuY29tcG9uZW50SW5zdGFuY2VJZCA9IGNvbXBvbmVudEluc3RhbmNlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbnB1dElkKCkgeworCQlyZXR1cm4gaW5wdXRJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnB1dElkKFN0cmluZyBpbnB1dElkKSB7CisJCXRoaXMuaW5wdXRJZCA9IGlucHV0SWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZVVuaXF1ZVVpZCgpIHsKKwkJcmV0dXJuIHZhbHVlVW5pcXVlVWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlVW5pcXVlVWlkKFN0cmluZyB2YWx1ZVVuaXF1ZVVpZCkgeworCQl0aGlzLnZhbHVlVW5pcXVlVWlkID0gdmFsdWVVbmlxdWVVaWQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKGJvb2xlYW4gZGVmaW5pdGlvbikgeworCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGF0aChMaXN0PFN0cmluZz4gcGF0aCkgeworCQl0aGlzLnBhdGggPSBwYXRoOworCX0KKworCXB1YmxpYyBMaXN0PFByb3BlcnR5UnVsZT4gZ2V0UnVsZXMoKSB7CisJCXJldHVybiBydWxlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSdWxlcyhMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMpIHsKKwkJdGhpcy5ydWxlcyA9IHJ1bGVzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBbICIgKyBzdXBlci50b1N0cmluZygpICsgIiAsIHZhbHVlPSIgKyB2YWx1ZSArICIsIHZhbHVlVW5pcXVlVWlkID0gIgorCQkJCSsgdmFsdWVVbmlxdWVVaWQgKyAiICwgcnVsZXM9IiArIHJ1bGVzICsgIiAsIHBhdGg9IiArIHBhdGggKyAiIF0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNDE3MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb3BlcnR5UnVsZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgZXh0ZW5kcyBQcm9wZXJ0eURlZmluaXRpb24KKwkJaW1wbGVtZW50cyBJQ29tcG9uZW50SW5zdGFuY2VDb25uZWN0ZWRFbGVtZW50LCBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY1NTk1NzM1MzY4NjkyNDI2OTFMOworCisJLyoqCisJICogVmFsdWUgb2YgcHJvcGVydHkKKwkgKi8KKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCS8qKgorCSAqIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHByb3BlcnR5IHZhbHVlIG9uIGdyYXBoCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWVVbmlxdWVVaWQ7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXRoID0gbnVsbDsKKworCXByaXZhdGUgTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzID0gbnVsbDsKKworCXByaXZhdGUgTGlzdDxHZXRJbnB1dFZhbHVlSW5mbz4gZ2V0SW5wdXRWYWx1ZXM7CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eShQcm9wZXJ0eURlZmluaXRpb24gcGQsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHZhbHVlVW5pcXVlVWlkKSB7CisJCXN1cGVyKHBkKTsKKworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVVbmlxdWVVaWQgPSB2YWx1ZVVuaXF1ZVVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlVW5pcXVlVWlkKCkgeworCQlyZXR1cm4gdmFsdWVVbmlxdWVVaWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWVVbmlxdWVVaWQoU3RyaW5nIHZhbHVlVW5pcXVlVWlkKSB7CisJCXRoaXMudmFsdWVVbmlxdWVVaWQgPSB2YWx1ZVVuaXF1ZVVpZDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oKSB7CisJCXJldHVybiBkZWZpbml0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oYm9vbGVhbiBkZWZpbml0aW9uKSB7CisJCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXRoKCkgeworCQlyZXR1cm4gcGF0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXRoKExpc3Q8U3RyaW5nPiBwYXRoKSB7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJfQorCisJcHVibGljIExpc3Q8UHJvcGVydHlSdWxlPiBnZXRSdWxlcygpIHsKKwkJcmV0dXJuIHJ1bGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJ1bGVzKExpc3Q8UHJvcGVydHlSdWxlPiBydWxlcykgeworCQl0aGlzLnJ1bGVzID0gcnVsZXM7CisJfQorCisJcHVibGljIExpc3Q8R2V0SW5wdXRWYWx1ZUluZm8+IGdldEdldElucHV0VmFsdWVzKCkgeworCQlyZXR1cm4gZ2V0SW5wdXRWYWx1ZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0R2V0SW5wdXRWYWx1ZXMoTGlzdDxHZXRJbnB1dFZhbHVlSW5mbz4gZ2V0SW5wdXRWYWx1ZXMpIHsKKwkJdGhpcy5nZXRJbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBbICIgKyBzdXBlci50b1N0cmluZygpICsgIiAsIHZhbHVlPSIgKyB2YWx1ZSArICIsIHZhbHVlVW5pcXVlVWlkID0gIgorCQkJCSsgdmFsdWVVbmlxdWVVaWQgKyAiICwgcnVsZXM9IiArIHJ1bGVzICsgIiAsIHBhdGg9IiArIHBhdGggKyAiIF0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzk0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5Db21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM1NzA3NjM3OTAyNjcyNTU1OTBMOworCisJcHJvdGVjdGVkIENvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gY29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKKworCXB1YmxpYyBDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSB7CisKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKENvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gY29tcG9uZW50KSB7CisJCXRoaXMuY29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IGNvbXBvbmVudDsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBnZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5jb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKwkJCQkrICgoY29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9PSBudWxsKSA/IDAgOiBjb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24gb3RoZXIgPSAoQ29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKSBvYmo7CisJCWlmIChjb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uLmVxdWFscyhvdGhlci5jb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db21wb25lbnRQYXJhbWV0ZXJzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjdkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuamF2YQpAQCAtMCwwICsxLDMxNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgeworCisJYm9vbGVhbiBpZ25vcmVVc2VycyA9IGZhbHNlOworCWJvb2xlYW4gaWdub3JlR3JvdXBzID0gZmFsc2U7CisJYm9vbGVhbiBpZ25vcmVDb21wb25lbnRJbnN0YW5jZXMgPSBmYWxzZTsKKwlib29sZWFuIGlnbm9yZUNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPSBmYWxzZTsKKwlib29sZWFuIGlnbm9yZVByb3BlcnRpZXMgPSBmYWxzZTsKKwlib29sZWFuIGlnbm9yZUNhcGFiaWxpdGllcyA9IGZhbHNlOworCWJvb2xlYW4gaWdub3JlUmVxdWlyZW1lbnRzID0gZmFsc2U7CisJYm9vbGVhbiBpZ25vcmVDYXRlZ29yaWVzID0gZmFsc2U7CisJYm9vbGVhbiBpZ25vcmVBbGxWZXJzaW9ucyA9IGZhbHNlOworCWJvb2xlYW4gaWdub3JlQWRkaXRpb25hbEluZm9ybWF0aW9uID0gZmFsc2U7CisJYm9vbGVhbiBpZ25vcmVBcnRpZmFjdHMgPSBmYWxzZTsKKwlib29sZWFuIGlnbm9yZUludGVyZmFjZXMgPSBmYWxzZTsKKwlib29sZWFuIGlnbm9yZURlcml2ZWRGcm9tID0gZmFsc2U7CisJYm9vbGVhbiBpZ25vcmVBdHRyaWJ1dGVzRnJvbSA9IGZhbHNlOworCWJvb2xlYW4gaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlc0Zyb20gPSBmYWxzZTsKKwlib29sZWFuIGlnbm9yZUlucHV0cyA9IGZhbHNlOworCWJvb2xlYW4gaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzSW5wdXRzID0gZmFsc2U7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBXaGVuIGFkZGluZyBuZXcgbWVtYmVyLCBwbGVhc2UgdXBkYXRlIHRoZSBmaWx0ZXIgbWV0aG9kLgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJcHVibGljIENvbXBvbmVudCBmaWx0ZXIoQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCisJCWlmIChpZ25vcmVVc2VycykgeworCQkJY29tcG9uZW50LnNldENyZWF0b3JVc2VySWQobnVsbCk7CisJCQljb21wb25lbnQuc2V0Q3JlYXRvckZ1bGxOYW1lKG51bGwpOworCQkJY29tcG9uZW50LnNldExhc3RVcGRhdGVyVXNlcklkKG51bGwpOworCQkJY29tcG9uZW50LnNldExhc3RVcGRhdGVyRnVsbE5hbWUobnVsbCk7CisJCX0KKworCQlpZiAoaWdub3JlR3JvdXBzKSB7CisJCQljb21wb25lbnQuc2V0R3JvdXBzKG51bGwpOworCQl9CisKKwkJaWYgKGlnbm9yZUNvbXBvbmVudEluc3RhbmNlcykgeworCQkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlcyhudWxsKTsKKwkJCWNvbXBvbmVudC5zZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMobnVsbCk7CisJCX0KKworCQlpZiAoaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcykgeworCQkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMobnVsbCk7CisJCX0KKworCQlpZiAoaWdub3JlUHJvcGVydGllcykgeworCQkJc3dpdGNoIChjb21wb25lbnRUeXBlKSB7CisJCQljYXNlIFJFU09VUkNFOgorCQkJCSgoUmVzb3VyY2UpIGNvbXBvbmVudCkuc2V0UHJvcGVydGllcyhudWxsKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoaWdub3JlQ2FwYWJpbGl0aWVzKSB7CisJCQljb21wb25lbnQuc2V0Q2FwYWJpbGl0aWVzKG51bGwpOworCQl9CisKKwkJaWYgKGlnbm9yZVJlcXVpcmVtZW50cykgeworCQkJY29tcG9uZW50LnNldFJlcXVpcmVtZW50cyhudWxsKTsKKwkJfQorCisJCWlmIChpZ25vcmVDYXRlZ29yaWVzKSB7CisJCQljb21wb25lbnQuc2V0Q2F0ZWdvcmllcyhudWxsKTsKKwkJfQorCisJCWlmIChpZ25vcmVBbGxWZXJzaW9ucykgeworCQkJY29tcG9uZW50LnNldEFsbFZlcnNpb25zKG51bGwpOworCQl9CisKKwkJaWYgKGlnbm9yZUFkZGl0aW9uYWxJbmZvcm1hdGlvbikgeworCQkJc3dpdGNoIChjb21wb25lbnRUeXBlKSB7CisJCQljYXNlIFJFU09VUkNFOgorCQkJCSgoUmVzb3VyY2UpIGNvbXBvbmVudCkuc2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKG51bGwpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpZ25vcmVBcnRpZmFjdHMpIHsKKwkJCWNvbXBvbmVudC5zZXRBcnRpZmFjdHMobnVsbCk7CisJCQljb21wb25lbnQuc2V0U3BlY2lmaWNDb21wb25ldFR5cGVBcnRpZmFjdHMobnVsbCk7CisJCQljb21wb25lbnQuc2V0RGVwbG95bWVudEFydGlmYWN0cyhudWxsKTsKKwkJCWNvbXBvbmVudC5zZXRUb3NjYUFydGlmYWN0cyhudWxsKTsKKwkJfQorCisJCWlmIChpZ25vcmVJbnRlcmZhY2VzKSB7CisJCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKwkJCWNhc2UgUkVTT1VSQ0U6CisJCQkJKChSZXNvdXJjZSkgY29tcG9uZW50KS5zZXRJbnRlcmZhY2VzKG51bGwpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpZ25vcmVEZXJpdmVkRnJvbSkgeworCQkJc3dpdGNoIChjb21wb25lbnRUeXBlKSB7CisJCQljYXNlIFJFU09VUkNFOgorCQkJCSgoUmVzb3VyY2UpIGNvbXBvbmVudCkuc2V0RGVyaXZlZEZyb20obnVsbCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGlnbm9yZUF0dHJpYnV0ZXNGcm9tKSB7CisJCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKwkJCWNhc2UgUkVTT1VSQ0U6CisJCQkJKChSZXNvdXJjZSkgY29tcG9uZW50KS5zZXRBdHRyaWJ1dGVzKG51bGwpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpZ25vcmVDb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzRnJvbSkgeworCQkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMobnVsbCk7CisJCX0KKworCQlpZiAoaWdub3JlSW5wdXRzKSB7CisJCQljb21wb25lbnQuc2V0SW5wdXRzKG51bGwpOworCQl9CisKKwkJaWYgKGlnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0cykgeworCQkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc0lucHV0cyhudWxsKTsKKwkJfQorCisJCXJldHVybiBjb21wb25lbnQ7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNhYmxlQWxsKCkgeworCQlpZ25vcmVVc2VycyA9IHRydWU7CisJCWlnbm9yZUdyb3VwcyA9IHRydWU7CisJCWlnbm9yZUNvbXBvbmVudEluc3RhbmNlcyA9IHRydWU7CisJCWlnbm9yZUNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPSB0cnVlOworCQlpZ25vcmVQcm9wZXJ0aWVzID0gdHJ1ZTsKKwkJaWdub3JlQ2FwYWJpbGl0aWVzID0gdHJ1ZTsKKwkJaWdub3JlUmVxdWlyZW1lbnRzID0gdHJ1ZTsKKwkJaWdub3JlQ2F0ZWdvcmllcyA9IHRydWU7CisJCWlnbm9yZUFsbFZlcnNpb25zID0gdHJ1ZTsKKwkJaWdub3JlQWRkaXRpb25hbEluZm9ybWF0aW9uID0gdHJ1ZTsKKwkJaWdub3JlQXJ0aWZhY3RzID0gdHJ1ZTsKKwkJaWdub3JlSW50ZXJmYWNlcyA9IHRydWU7CisJCWlnbm9yZURlcml2ZWRGcm9tID0gdHJ1ZTsKKwkJaWdub3JlQXR0cmlidXRlc0Zyb20gPSB0cnVlOworCQlpZ25vcmVJbnB1dHMgPSB0cnVlOworCQlpZ25vcmVDb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzRnJvbSA9IHRydWU7CisJCWlnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0cyA9IHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZ25vcmVHcm91cHMoKSB7CisJCXJldHVybiBpZ25vcmVHcm91cHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SWdub3JlR3JvdXBzKGJvb2xlYW4gaWdub3JlR3JvdXBzKSB7CisJCXRoaXMuaWdub3JlR3JvdXBzID0gaWdub3JlR3JvdXBzOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSWdub3JlQ29tcG9uZW50SW5zdGFuY2VzKCkgeworCQlyZXR1cm4gaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUNvbXBvbmVudEluc3RhbmNlcyhib29sZWFuIGlnbm9yZUNvbXBvbmVudEluc3RhbmNlcykgeworCQl0aGlzLmlnbm9yZUNvbXBvbmVudEluc3RhbmNlcyA9IGlnbm9yZUNvbXBvbmVudEluc3RhbmNlczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZVByb3BlcnRpZXMoKSB7CisJCXJldHVybiBpZ25vcmVQcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZVByb3BlcnRpZXMoYm9vbGVhbiBpZ25vcmVQcm9wZXJ0aWVzKSB7CisJCXRoaXMuaWdub3JlUHJvcGVydGllcyA9IGlnbm9yZVByb3BlcnRpZXM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZ25vcmVDYXBhYmlsaXRpZXMoKSB7CisJCXJldHVybiBpZ25vcmVDYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SWdub3JlQ2FwYWJpbGl0aWVzKGJvb2xlYW4gaWdub3JlQ2FwYWJpbGl0aWVzKSB7CisJCXRoaXMuaWdub3JlQ2FwYWJpbGl0aWVzID0gaWdub3JlQ2FwYWJpbGl0aWVzOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSWdub3JlUmVxdWlyZW1lbnRzKCkgeworCQlyZXR1cm4gaWdub3JlUmVxdWlyZW1lbnRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZVJlcXVpcmVtZW50cyhib29sZWFuIGlnbm9yZVJlcXVpcmVtZW50cykgeworCQl0aGlzLmlnbm9yZVJlcXVpcmVtZW50cyA9IGlnbm9yZVJlcXVpcmVtZW50czsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZUNhdGVnb3JpZXMoKSB7CisJCXJldHVybiBpZ25vcmVDYXRlZ29yaWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUNhdGVnb3JpZXMoYm9vbGVhbiBpZ25vcmVDYXRlZ29yaWVzKSB7CisJCXRoaXMuaWdub3JlQ2F0ZWdvcmllcyA9IGlnbm9yZUNhdGVnb3JpZXM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZ25vcmVBbGxWZXJzaW9ucygpIHsKKwkJcmV0dXJuIGlnbm9yZUFsbFZlcnNpb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUFsbFZlcnNpb25zKGJvb2xlYW4gaWdub3JlQWxsVmVyc2lvbnMpIHsKKwkJdGhpcy5pZ25vcmVBbGxWZXJzaW9ucyA9IGlnbm9yZUFsbFZlcnNpb25zOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSWdub3JlQWRkaXRpb25hbEluZm9ybWF0aW9uKCkgeworCQlyZXR1cm4gaWdub3JlQWRkaXRpb25hbEluZm9ybWF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUFkZGl0aW9uYWxJbmZvcm1hdGlvbihib29sZWFuIGlnbm9yZUFkZGl0aW9uYWxJbmZvcm1hdGlvbikgeworCQl0aGlzLmlnbm9yZUFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IGlnbm9yZUFkZGl0aW9uYWxJbmZvcm1hdGlvbjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZUFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGlnbm9yZUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJZ25vcmVBcnRpZmFjdHMoYm9vbGVhbiBpZ25vcmVBcnRpZmFjdHMpIHsKKwkJdGhpcy5pZ25vcmVBcnRpZmFjdHMgPSBpZ25vcmVBcnRpZmFjdHM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZ25vcmVDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJZ25vcmVDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKGJvb2xlYW4gaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcykgeworCQl0aGlzLmlnbm9yZUNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPSBpZ25vcmVDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSWdub3JlQ29tcG9uZW50SW5zdGFuY2VzSW5wdXRzKCkgeworCQlyZXR1cm4gaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzSW5wdXRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0cyhib29sZWFuIGlnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0cykgeworCQl0aGlzLmlnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0cyA9IGlnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0czsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZUludGVyZmFjZXMoKSB7CisJCXJldHVybiBpZ25vcmVJbnRlcmZhY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUludGVyZmFjZXMoYm9vbGVhbiBpZ25vcmVJbnRlcmZhY2VzKSB7CisJCXRoaXMuaWdub3JlSW50ZXJmYWNlcyA9IGlnbm9yZUludGVyZmFjZXM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZ25vcmVBdHRyaWJ1dGVzRnJvbSgpIHsKKwkJcmV0dXJuIGlnbm9yZUF0dHJpYnV0ZXNGcm9tOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUF0dHJpYnV0ZXNGcm9tKGJvb2xlYW4gaWdub3JlQXR0cmlidXRlc0Zyb20pIHsKKwkJdGhpcy5pZ25vcmVBdHRyaWJ1dGVzRnJvbSA9IGlnbm9yZURlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSWdub3JlQ29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlc0Zyb20oKSB7CisJCXJldHVybiBpZ25vcmVDb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzRnJvbTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJZ25vcmVDb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzRnJvbShib29sZWFuIGlnbm9yZUNvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXNGcm9tKSB7CisJCXRoaXMuaWdub3JlQ29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlc0Zyb20gPSBpZ25vcmVDb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzRnJvbTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZURlcml2ZWRGcm9tKCkgeworCQlyZXR1cm4gaWdub3JlRGVyaXZlZEZyb207CisJfQorCisJcHVibGljIHZvaWQgc2V0SWdub3JlRGVyaXZlZEZyb20oYm9vbGVhbiBpZ25vcmVEZXJpdmVkRnJvbSkgeworCQl0aGlzLmlnbm9yZURlcml2ZWRGcm9tID0gaWdub3JlRGVyaXZlZEZyb207CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZ25vcmVVc2VycygpIHsKKwkJcmV0dXJuIGlnbm9yZVVzZXJzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZVVzZXJzKGJvb2xlYW4gaWdub3JlVXNlcnMpIHsKKwkJdGhpcy5pZ25vcmVVc2VycyA9IGlnbm9yZVVzZXJzOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSWdub3JlSW5wdXRzKCkgeworCQlyZXR1cm4gaWdub3JlSW5wdXRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZUlucHV0cyhib29sZWFuIGlnbm9yZUlucHV0cykgeworCQl0aGlzLmlnbm9yZUlucHV0cyA9IGlnbm9yZUlucHV0czsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db25zdW1lckRlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Db25zdW1lckRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY0NTVjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0NvbnN1bWVyRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Db25zdW1lckRhdGFEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgQ29uc3VtZXJEZWZpbml0aW9uIGV4dGVuZHMgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiB7CisKKwlwdWJsaWMgQ29uc3VtZXJEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBDb25zdW1lckRlZmluaXRpb24oQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiBhKSB7CisJCXN1cGVyKGEpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0RhdGFUeXBlRGVmaW5pdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0RhdGFUeXBlRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Mjg4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvRGF0YVR5cGVEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuRGF0YVR5cGVEYXRhRGVmaW5pdGlvbjsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CisKK3B1YmxpYyBjbGFzcyBEYXRhVHlwZURlZmluaXRpb24gZXh0ZW5kcyBEYXRhVHlwZURhdGFEZWZpbml0aW9uIHsKKworCS8vIEBKc29uSWdub3JlCisJLy8gQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25JZ25vcmUKKwlwcml2YXRlIERhdGFUeXBlRGVmaW5pdGlvbiBkZXJpdmVkRnJvbTsKKworCXByaXZhdGUgTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzOworCisJcHJpdmF0ZSBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllczsKKworCXB1YmxpYyBEYXRhVHlwZURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIERhdGFUeXBlRGVmaW5pdGlvbihEYXRhVHlwZURhdGFEZWZpbml0aW9uIHApIHsKKwkJc3VwZXIocCk7CisJfQorCisJcHVibGljIERhdGFUeXBlRGVmaW5pdGlvbihEYXRhVHlwZURlZmluaXRpb24gcGQpIHsKKwkJdGhpcy5zZXROYW1lKHBkLmdldE5hbWUoKSk7CisJCXRoaXMuc2V0RGVyaXZlZEZyb20ocGQuZ2V0RGVyaXZlZEZyb20oKSk7CisJCXRoaXMuc2V0RGVyaXZlZEZyb21OYW1lKHBkLmdldERlcml2ZWRGcm9tTmFtZSgpKTsKKwkJdGhpcy5zZXRVbmlxdWVJZChwZC5nZXRVbmlxdWVJZCgpKTsKKwkJdGhpcy5zZXRDb25zdHJhaW50cyhwZC5nZXRDb25zdHJhaW50cygpKTsKKwkJdGhpcy5zZXREZXNjcmlwdGlvbihwZC5nZXREZXNjcmlwdGlvbigpKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGdldENvbnN0cmFpbnRzKCkgeworCQlyZXR1cm4gY29uc3RyYWludHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29uc3RyYWludHMoTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzKSB7CisJCXRoaXMuY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKKwl9CisKKwlwdWJsaWMgRGF0YVR5cGVEZWZpbml0aW9uIGdldERlcml2ZWRGcm9tKCkgeworCQlyZXR1cm4gZGVyaXZlZEZyb207CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVyaXZlZEZyb20oRGF0YVR5cGVEZWZpbml0aW9uIGRlcml2ZWRGcm9tKSB7CisJCXRoaXMuZGVyaXZlZEZyb20gPSBkZXJpdmVkRnJvbTsKKwl9CisKKwlwdWJsaWMgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgRGF0YVR5cGVEZWZpbml0aW9uIFtkZXJpdmVkRnJvbT0iICsgZGVyaXZlZEZyb20gKyAiLCBjb25zdHJhaW50cz0iICsgY29uc3RyYWludHMKKwkJCQkrICIsIHByb3BlcnRpZXM9IiArIHByb3BlcnRpZXMgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0Rpc3RyaWJ1dGlvblN0YXR1c0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWI1YmZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0Rpc3RyaWJ1dGlvblN0YXR1c0VudW0uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK3B1YmxpYyBlbnVtIERpc3RyaWJ1dGlvblN0YXR1c0VudW0geworCURJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQoIkRpc3RyaWJ1dGlvbiBub3QgYXBwcm92ZWQiKSwgCisJRElTVFJJQlVUSU9OX0FQUFJPVkVEKCJEaXN0cmlidXRpb24gYXBwcm92ZWQiKSwgCisJRElTVFJJQlVURUQoIkRpc3RyaWJ1dGVkIiksIAorCURJU1RSSUJVVElPTl9SRUpFQ1RFRCgiRGlzdHJpYnV0aW9uIHJlamVjdGVkIik7CisKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCXByaXZhdGUgRGlzdHJpYnV0aW9uU3RhdHVzRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIERpc3RyaWJ1dGlvblN0YXR1c0VudW0gZmluZFN0YXRlKFN0cmluZyBzdGF0ZSkgeworCisJCWZvciAoRGlzdHJpYnV0aW9uU3RhdHVzRW51bSBkaXN0cmlidXRpb25TdGF0dXMgOiBEaXN0cmlidXRpb25TdGF0dXNFbnVtLnZhbHVlcygpKSB7CisJCQlpZiAoZGlzdHJpYnV0aW9uU3RhdHVzLm5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHN0YXRlKQorCQkJCQl8fCBkaXN0cmlidXRpb25TdGF0dXMuZ2V0VmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKHN0YXRlKSkgeworCQkJCXJldHVybiBkaXN0cmlidXRpb25TdGF0dXM7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvRGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW0uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9EaXN0cmlidXRpb25UcmFuc2l0aW9uRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjY5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvRGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW0uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK3B1YmxpYyBlbnVtIERpc3RyaWJ1dGlvblRyYW5zaXRpb25FbnVtIHsKKwlBUFBST1ZFKCJhcHByb3ZlIiksIFJFSkVDVCgicmVqZWN0Iik7CisKKwlTdHJpbmcgZGlzcGxheU5hbWU7CisKKwlwcml2YXRlIERpc3RyaWJ1dGlvblRyYW5zaXRpb25FbnVtKFN0cmluZyBkaXNwbGF5TmFtZSkgeworCQl0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKwkJcmV0dXJuIGRpc3BsYXlOYW1lOworCX0KKworCXB1YmxpYyBzdGF0aWMgRGlzdHJpYnV0aW9uVHJhbnNpdGlvbkVudW0gZ2V0RnJvbURpc3BsYXlOYW1lKFN0cmluZyBuYW1lKSB7CisKKwkJZm9yIChEaXN0cmlidXRpb25UcmFuc2l0aW9uRW51bSB2YWwgOiBEaXN0cmlidXRpb25UcmFuc2l0aW9uRW51bS52YWx1ZXMoKSkgeworCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSh2YWwuZ2V0RGlzcGxheU5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gdmFsOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbHVlc0FzU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZm9yIChEaXN0cmlidXRpb25UcmFuc2l0aW9uRW51bSBvcCA6IERpc3RyaWJ1dGlvblRyYW5zaXRpb25FbnVtLnZhbHVlcygpKSB7CisJCQlzYi5hcHBlbmQob3AuZ2V0RGlzcGxheU5hbWUoKSkuYXBwZW5kKCIgIik7CisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvRnVuY3Rpb25hbE1lbnVJbmZvLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvRnVuY3Rpb25hbE1lbnVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhM2I4NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9GdW5jdGlvbmFsTWVudUluZm8uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK3B1YmxpYyBjbGFzcyBGdW5jdGlvbmFsTWVudUluZm8geworCisJcHJpdmF0ZSBTdHJpbmcgZnVuY3Rpb25hbE1lbnU7CisKKwlwdWJsaWMgRnVuY3Rpb25hbE1lbnVJbmZvKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25hbE1lbnUoKSB7CisJCXJldHVybiBmdW5jdGlvbmFsTWVudTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbmFsTWVudShTdHJpbmcgZnVuY3Rpb25hbE1lbnUpIHsKKwkJdGhpcy5mdW5jdGlvbmFsTWVudSA9IGZ1bmN0aW9uYWxNZW51OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRnVuY3Rpb25hbE1lbnVJbmZvIFtmdW5jdGlvbmFsTWVudT0iICsgZnVuY3Rpb25hbE1lbnUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvR2V0SW5wdXRWYWx1ZUluZm8uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9HZXRJbnB1dFZhbHVlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTNlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvR2V0SW5wdXRWYWx1ZUluZm8uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK3B1YmxpYyBjbGFzcyBHZXRJbnB1dFZhbHVlSW5mbyB7CisJU3RyaW5nIHByb3BOYW1lOworCVN0cmluZyBpbnB1dE5hbWU7CisJSW50ZWdlciBpbmRleFZhbHVlOworCUdldElucHV0VmFsdWVJbmZvIGdldElucHV0SW5kZXg7CisKKwlib29sZWFuIGlzTGlzdCA9IGZhbHNlOworCisJcHVibGljIFN0cmluZyBnZXRQcm9wTmFtZSgpIHsKKwkJcmV0dXJuIHByb3BOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BOYW1lKFN0cmluZyBwcm9wTmFtZSkgeworCQl0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbnB1dE5hbWUoKSB7CisJCXJldHVybiBpbnB1dE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5wdXROYW1lKFN0cmluZyBpbnB1dE5hbWUpIHsKKwkJdGhpcy5pbnB1dE5hbWUgPSBpbnB1dE5hbWU7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0SW5kZXhWYWx1ZSgpIHsKKwkJcmV0dXJuIGluZGV4VmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5kZXhWYWx1ZShJbnRlZ2VyIGluZGV4VmFsdWUpIHsKKwkJdGhpcy5pbmRleFZhbHVlID0gaW5kZXhWYWx1ZTsKKwl9CisKKwlwdWJsaWMgR2V0SW5wdXRWYWx1ZUluZm8gZ2V0R2V0SW5wdXRJbmRleCgpIHsKKwkJcmV0dXJuIGdldElucHV0SW5kZXg7CisJfQorCisJcHVibGljIHZvaWQgc2V0R2V0SW5wdXRJbmRleChHZXRJbnB1dFZhbHVlSW5mbyBnZXRJbnB1dEluZGV4KSB7CisJCXRoaXMuZ2V0SW5wdXRJbmRleCA9IGdldElucHV0SW5kZXg7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNMaXN0KCkgeworCQlyZXR1cm4gaXNMaXN0OworCX0KKworCXB1YmxpYyB2b2lkIHNldExpc3QoYm9vbGVhbiBpc0xpc3QpIHsKKwkJdGhpcy5pc0xpc3QgPSBpc0xpc3Q7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvR3JvdXBEZWZpbml0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvR3JvdXBEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyMGU4OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Hcm91cERlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Hcm91cERhdGFEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgR3JvdXBEZWZpbml0aW9uIGV4dGVuZHMgR3JvdXBEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODUyNjEzNjM0NjUxMTEyMjQ3TDsKKworCS8vIG1hcCBvZiBjb21wb25lbnRJbnN0YW5jZXMgPG5hbWU6IHVuaXF1ZUlkPgorCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZW1iZXJzOworCisJLy8gcHJvcGVydGllcyAocHJvcGVydGllcyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgZ3JvdXAgdHlwZSwgdGhlCisJLy8gcHJvcGVydGllcyBoZXJlIGFyZSBhY3R1YWxseSB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0aWVzKQorCXByaXZhdGUgTGlzdDxHcm91cFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLy8gYXJ0aWZhY3RzIC0gbGlzdCBvZiBhcnRpZmFjdCB1aWQuIEFsbCBhcnRpZmFjdHMgaW4gdGhlIGdyb3VwIG11c3QgYWxyZWFkeQorCS8vIGJlIHVwbG9hZGVkIHRvIHRoZSBWRgorCXByaXZhdGUgTGlzdDxTdHJpbmc+IGFydGlmYWN0czsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGFydGlmYWN0c1V1aWQ7CisKKwkvLyBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0eXBlIG9mIHRoaXMgZ3JvdXAKKwlwcml2YXRlIFN0cmluZyB0eXBlVWlkOworCisJcHVibGljIEdyb3VwRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgR3JvdXBEZWZpbml0aW9uKEdyb3VwRGF0YURlZmluaXRpb24gb3RoZXIpIHsKKwkJc3VwZXIob3RoZXIpOworCX0KKworCXB1YmxpYyBHcm91cERlZmluaXRpb24oR3JvdXBEZWZpbml0aW9uIG90aGVyKSB7CisJCXRoaXMuc2V0TmFtZShvdGhlci5nZXROYW1lKCkpOworCQl0aGlzLnNldFVuaXF1ZUlkKG90aGVyLmdldFVuaXF1ZUlkKCkpOworCQl0aGlzLnNldFR5cGUob3RoZXIuZ2V0VHlwZSgpKTsKKwkJdGhpcy5zZXRWZXJzaW9uKG90aGVyLmdldFZlcnNpb24oKSk7CisJCXRoaXMuc2V0SW52YXJpYW50VVVJRChvdGhlci5nZXRJbnZhcmlhbnRVVUlEKCkpOworCQl0aGlzLnNldEdyb3VwVVVJRChvdGhlci5nZXRHcm91cFVVSUQoKSk7CisJCXRoaXMuc2V0RGVzY3JpcHRpb24ob3RoZXIuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWlmIChvdGhlci5tZW1iZXJzICE9IG51bGwpIHsKKwkJCXRoaXMubWVtYmVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPihvdGhlci5nZXRNZW1iZXJzKCkpOworCQl9CisJCWlmIChvdGhlci5wcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCXRoaXMucHJvcGVydGllcyA9IG90aGVyLnByb3BlcnRpZXMuc3RyZWFtKCkubWFwKHAgLT4gbmV3IEdyb3VwUHJvcGVydHkocCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCX0KKwkJaWYgKG90aGVyLmFydGlmYWN0cyAhPSBudWxsKSB7CisJCQl0aGlzLmFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihvdGhlci5nZXRBcnRpZmFjdHMoKSk7CisJCX0KKworCQlpZiAob3RoZXIuYXJ0aWZhY3RzVXVpZCAhPSBudWxsKSB7CisJCQl0aGlzLmFydGlmYWN0c1V1aWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ob3RoZXIuZ2V0QXJ0aWZhY3RzVXVpZCgpKTsKKwkJfQorCQl0aGlzLnNldFR5cGVVaWQob3RoZXIudHlwZVVpZCk7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TWVtYmVycygpIHsKKwkJcmV0dXJuIG1lbWJlcnM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWVtYmVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMpIHsKKwkJdGhpcy5tZW1iZXJzID0gbWVtYmVyczsKKwl9CisKKwlwdWJsaWMgTGlzdDxHcm91cFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKExpc3Q8R3JvdXBQcm9wZXJ0eT4gcHJvcGVydGllcykgeworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhMaXN0PFN0cmluZz4gYXJ0aWZhY3RzKSB7CisJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVVpZCgpIHsKKwkJcmV0dXJuIHR5cGVVaWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZVVpZChTdHJpbmcgdHlwZVVpZCkgeworCQl0aGlzLnR5cGVVaWQgPSB0eXBlVWlkOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXJ0aWZhY3RzVXVpZCgpIHsKKwkJcmV0dXJuIGFydGlmYWN0c1V1aWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RzVXVpZChMaXN0PFN0cmluZz4gYXJ0aWZhY3RzVXVpZCkgeworCQl0aGlzLmFydGlmYWN0c1V1aWQgPSBhcnRpZmFjdHNVdWlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiR3JvdXBEZWZpbml0aW9uIFsiICsgc3VwZXIudG9TdHJpbmcoKSArICJtZW1iZXJzPSIgKyBtZW1iZXJzICsgIiwgcHJvcGVydGllcz0iICsgcHJvcGVydGllcworCQkJCSsgIiwgYXJ0aWZhY3RzPSIgKyBhcnRpZmFjdHMgKyAiLCBhcnRpZmFjdHNVVUlEPSIgKyBhcnRpZmFjdHNVdWlkICsgIiwgdHlwZVVpZD0iICsgdHlwZVVpZCArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Hcm91cFByb3BlcnR5LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvR3JvdXBQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMGFmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvR3JvdXBQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworcHVibGljIGNsYXNzIEdyb3VwUHJvcGVydHkgZXh0ZW5kcyBQcm9wZXJ0eURlZmluaXRpb24geworCisJLyoqCisJICogY3VycmVudCB2YWx1ZQorCSAqLworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJLyoqCisJICogVGhlIHVuaXF1ZSBpcyBvZiBHcm91cCBwcm9wZXJ0eSBvbiBncmFwaC4gSWYgaXQgaXMgbnVsbCwgdGhlbiB0aGUKKwkgKiBwcm9wZXJ0eSdzIHZhbHVlIHdhcyBub3QgdXBkYXRlZC4gVGhlIHZhbHVlIGlzIHRha2VuIGZyb20gdGhlIGdyb3VwIHR5cGUKKwkgKiBwcm9wZXJ0eS4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyB2YWx1ZVVuaXF1ZVVpZDsKKworCXB1YmxpYyBHcm91cFByb3BlcnR5KCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBHcm91cFByb3BlcnR5KFByb3BlcnR5RGVmaW5pdGlvbiBwZCwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgdmFsdWVVbmlxdWVVaWQpIHsKKwkJc3VwZXIocGQpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVVbmlxdWVVaWQgPSB2YWx1ZVVuaXF1ZVVpZDsKKwl9CisKKwlwdWJsaWMgR3JvdXBQcm9wZXJ0eShHcm91cFByb3BlcnR5IG90aGVyKSB7CisJCXN1cGVyKG90aGVyKTsKKwkJaWYgKG90aGVyICE9IG51bGwpIHsKKwkJCXRoaXMudmFsdWUgPSBvdGhlci5nZXRWYWx1ZSgpOworCQkJdGhpcy52YWx1ZVVuaXF1ZVVpZCA9IG90aGVyLmdldFZhbHVlVW5pcXVlVWlkKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlVW5pcXVlVWlkKCkgeworCQlyZXR1cm4gdmFsdWVVbmlxdWVVaWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWVVbmlxdWVVaWQoU3RyaW5nIHZhbHVlVW5pcXVlVWlkKSB7CisJCXRoaXMudmFsdWVVbmlxdWVVaWQgPSB2YWx1ZVVuaXF1ZVVpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkdyb3VwUHJvcGVydHkgWyAiICsgc3VwZXIudG9TdHJpbmcoKSArICIgLCB2YWx1ZT0iICsgdmFsdWUgKyAiLCB2YWx1ZVVuaXF1ZVVpZCA9ICIgKyB2YWx1ZVVuaXF1ZVVpZAorCQkJCSsgIiBdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvR3JvdXBUeXBlRGVmaW5pdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0dyb3VwVHlwZURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdmZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0dyb3VwVHlwZURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Hcm91cFR5cGVEYXRhRGVmaW5pdGlvbjsKKworLyoqCisgKiBTcGVjaWZpZXMgdGhlIGdyb3VwIHR5cGUgdGhhdCB0aGUgTm9kZSBUeXBlIGV4cG9zZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBHcm91cFR5cGVEZWZpbml0aW9uIGV4dGVuZHMgR3JvdXBUeXBlRGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE1OTc3NzMzMTc5MjQxNjI3MDNMOworCisJcHJpdmF0ZSBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllczsKKworCXB1YmxpYyBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcykgeworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBHcm91cFR5cGVEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBHcm91cFR5cGVEZWZpbml0aW9uKEdyb3VwVHlwZURhdGFEZWZpbml0aW9uIHApIHsKKwkJc3VwZXIocCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIFsgcHJvcGVydGllcz0iICsgcHJvcGVydGllcyArICIgXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSGVhdFBhcmFtZXRlckRlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDMzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSGVhdFBhcmFtZXRlckRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5IZWF0UGFyYW1ldGVyRGF0YURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBleHRlbmRzIEhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNDAwMzYwNzIxNDY5OTYyMTA1TDsKKworCXB1YmxpYyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbihIZWF0UGFyYW1ldGVyRGF0YURlZmluaXRpb24gaHBkZCkgeworCQlzdXBlcihocGRkKTsKKwl9CisKKwlwdWJsaWMgSGVhdFBhcmFtZXRlckRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSUNvbXBsZXhEZWZhdWx0VmFsdWUuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JQ29tcGxleERlZmF1bHRWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjFlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSUNvbXBsZXhEZWZhdWx0VmFsdWUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKKworcHVibGljIGludGVyZmFjZSBJQ29tcGxleERlZmF1bHRWYWx1ZSB7CisJU3RyaW5nIGdldFR5cGUoKTsKKworCVN0cmluZyBnZXROYW1lKCk7CisKKwlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7CisKKwl2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUpOworCisJU2NoZW1hRGVmaW5pdGlvbiBnZXRTY2hlbWEoKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JQ29tcG9uZW50SW5zdGFuY2VDb25uZWN0ZWRFbGVtZW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSUNvbXBvbmVudEluc3RhbmNlQ29ubmVjdGVkRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGUzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSUNvbXBvbmVudEluc3RhbmNlQ29ubmVjdGVkRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25uZWN0ZWRFbGVtZW50IHsKKwlTdHJpbmcgZ2V0VW5pcXVlSWQoKTsKKworCVN0cmluZyBnZXRWYWx1ZVVuaXF1ZVVpZCgpOworCisJdm9pZCBzZXRWYWx1ZVVuaXF1ZVVpZChTdHJpbmcgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0lPcGVyYXRpb25QYXJhbWV0ZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JT3BlcmF0aW9uUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxOTM1MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JT3BlcmF0aW9uUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCisvKioKKyAqIEFuIG9wZXJhdGlvbiBwYXJhbWV0ZXIgY2FuIGJlIGVpdGhlciBhIFByb3BlcnR5VmFsdWUgKHZhbHVlIG9yIGV4cHJlc3Npb24pIG9yCisgKiBhIFByb3BlcnR5RGVmaW5pdGlvbi4KKyAqLworcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uUGFyYW1ldGVyIHsKKwkvKioKKwkgKiBBbGxvdyB0byBrbm93IGlmIHRoZSBvcGVyYXRpb24gcGFyYW1ldGVyIGlzIGEgcHJvcGVydHkgZGVmaW5pdGlvbiBvciBhCisJICogcHJvcGVydHkgdmFsdWUuIE9ubHkgcGFyYW1ldGVyIGV4cG9zZWQgYXMgcHJvcGVydHkgZGVmaW5pdGlvbnMgY2FuIGJlCisJICogdXNlZCBmb3IgImN1c3RvbSIgb3BlcmF0aW9ucy4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHBhcmFtZXRlciBpcyBhIHByb3BlcnR5IGRlZmluaXRpb24gYW5kCisJICogICAgICAgICBmYWxzZSBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgcHJvcGVydHkgdmFsdWUuCisJICovCisJYm9vbGVhbiBpc0RlZmluaXRpb24oKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JbXBsZW1lbnRhdGlvbkFydGlmYWN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSW1wbGVtZW50YXRpb25BcnRpZmFjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTk0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvSW1wbGVtZW50YXRpb25BcnRpZmFjdC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworLyoqCisgKiBTcGVjaWZpZXMgYW4gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3QgZm9yIGludGVyZmFjZXMgb3Igb3BlcmF0aW9ucyBvZiBhCisgKiB7QGxpbmsgTm9kZVR5cGUgbm9kZSB0eXBlfSBvciB7QGxpbmsgUmVsYXRpb25zaGlwVHlwZSByZWxhdGlvbiB0eXBlfS4KKyAqIAorICogQGF1dGhvciBlc29mZXIKKyAqLworcHVibGljIGNsYXNzIEltcGxlbWVudGF0aW9uQXJ0aWZhY3QgeworCS8qKgorCSAqIDxwPgorCSAqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGlzIGFydGlmYWN0LgorCSAqIDwvcD4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdFR5cGU7CisKKwkvKioKKwkgKiA8cD4KKwkgKiBJZGVudGlmaWVzIGFuIEFydGlmYWN0IFRlbXBsYXRlIHRvIGJlIHVzZWQgYXMgaW1wbGVtZW50YXRpb24gYXJ0aWZhY3QuCisJICogVGhpcyBBcnRpZmFjdCBUZW1wbGF0ZSBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBEZWZpbml0aW9ucyBkb2N1bWVudCBvcgorCSAqIGluIGEgc2VwYXJhdGUsIGltcG9ydGVkIGRvY3VtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiA8cD4KKwkgKiBUaGUgdHlwZSBvZiBBcnRpZmFjdCBUZW1wbGF0ZSByZWZlcmVuY2VkIGJ5IHRoZSBhcnRpZmFjdFJlZiBhdHRyaWJ1dGUKKwkgKiBNVVNUIGJlIHRoZSBzYW1lIHR5cGUgb3IgYSBzdWItdHlwZSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlCisJICogYXJ0aWZhY3RUeXBlIGF0dHJpYnV0ZS4KKwkgKiA8L3A+CisJICogCisJICogPHA+CisJICogTm90ZTogaWYgbm8gQXJ0aWZhY3QgVGVtcGxhdGUgaXMgcmVmZXJlbmNlZCwgdGhlIGFydGlmYWN0IHR5cGUgc3BlY2lmaWMKKwkgKiBjb250ZW50IG9mIHRoZSBJbXBsZW1lbnRhdGlvbkFydGlmYWN0IGVsZW1lbnQgYWxvbmUgaXMgYXNzdW1lZCB0bworCSAqIHJlcHJlc2VudCB0aGUgYWN0dWFsIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgYSBzaW1wbGUgc2NyaXB0IGNvdWxkIGJlCisJICogZGVmaW5lZCBpbiBwbGFjZSB3aXRoaW4gdGhlIEltcGxlbWVudGF0aW9uQXJ0aWZhY3QgZWxlbWVudC4KKwkgKiA8L3A+CisJICovCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RSZWY7CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSBpbiB3aGljaCB0aGUgYXJ0aWZhY3QgbGllcy4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBhcmNoaXZlTmFtZTsKKwkvKioKKwkgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXJjaGl2ZSBpbiB3aGljaCB0aGUgYXJ0aWZhY3QgbGllcy4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBhcmNoaXZlVmVyc2lvbjsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JbnB1dERlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JbnB1dERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkwZDcyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0lucHV0RGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb3BlcnR5RGF0YURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBJbnB1dERlZmluaXRpb24gZXh0ZW5kcyBQcm9wZXJ0eURlZmluaXRpb24geworCVN0cmluZyBsYWJlbDsKKwlCb29sZWFuIGhpZGRlbjsKKwlCb29sZWFuIGltbXV0YWJsZTsKKwlMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+IGlucHV0c1ZhbHVlOworCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllczsKKworCXB1YmxpYyBJbnB1dERlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCXB1YmxpYyBJbnB1dERlZmluaXRpb24oUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwKSB7CisJCXN1cGVyKHApOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgSW5wdXREZWZpbml0aW9uKFByb3BlcnR5RGVmaW5pdGlvbiBwZCkgeworCQlzdXBlcihwZCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCXB1YmxpYyBCb29sZWFuIGlzSGlkZGVuKCkgeworCQlyZXR1cm4gaGlkZGVuOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhpZGRlbihCb29sZWFuIGhpZGRlbikgeworCQl0aGlzLmhpZGRlbiA9IGhpZGRlbjsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBpc0ltbXV0YWJsZSgpIHsKKwkJcmV0dXJuIGltbXV0YWJsZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbW11dGFibGUoQm9vbGVhbiBpbW11dGFibGUpIHsKKwkJdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgeworCQl0aGlzLmxhYmVsID0gbGFiZWw7CisJfQorCisJcHVibGljIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gZ2V0SW5wdXRzVmFsdWUoKSB7CisJCXJldHVybiBpbnB1dHNWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnB1dHNWYWx1ZShMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+IGlucHV0c1ZhbHVlKSB7CisJCXRoaXMuaW5wdXRzVmFsdWUgPSBpbnB1dHNWYWx1ZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllcykgeworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0ludGVyZmFjZURlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JbnRlcmZhY2VEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhZDMxMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9JbnRlcmZhY2VEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5JbnRlcmZhY2VEYXRhRGVmaW5pdGlvbjsKKworLyoqCisgKiBEZWZpbml0aW9uIG9mIHRoZSBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiAoaW5zdGFuY2VzIG9mKSBhIE5vZGUKKyAqIFR5cGUuCisgKiAKKyAqIEBhdXRob3IgZXNvZmVyCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmZhY2VEZWZpbml0aW9uIGV4dGVuZHMgSW50ZXJmYWNlRGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBJT3BlcmF0aW9uUGFyYW1ldGVyLCBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODIyMDg4Nzk3Mjg2NjM1NDc0Nkw7CisKKwkvKioKKwkgKiBEZWZpbmVzIGFuIG9wZXJhdGlvbiBhdmFpbGFibGUgdG8gbWFuYWdlIHBhcnRpY3VsYXIgYXNwZWN0cyBvZiB0aGUgTm9kZQorCSAqIFR5cGUuCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9wZXJhdGlvbj4oKTsKKworCXByaXZhdGUgYm9vbGVhbiBkZWZpbml0aW9uOworCisJcHVibGljIEludGVyZmFjZURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCXB1YmxpYyBJbnRlcmZhY2VEZWZpbml0aW9uKFN0cmluZyB0eXBlLCBTdHJpbmcgZGVzY3JpcHRpb24sIE1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9ucykgeworCQlzdXBlcih0eXBlLCBkZXNjcmlwdGlvbik7CisJCXRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7CisKKwl9CisKKwlwdWJsaWMgSW50ZXJmYWNlRGVmaW5pdGlvbihJbnRlcmZhY2VEYXRhRGVmaW5pdGlvbiBwKSB7CisJCXN1cGVyKHApOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oYm9vbGVhbiBkZWZpbml0aW9uKSB7CisJCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gZ2V0T3BlcmF0aW9ucygpIHsKKwkJcmV0dXJuIG9wZXJhdGlvbnM7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3BlcmF0aW9ucyhNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKKwkJdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkludGVyZmFjZURlZmluaXRpb24gW29wZXJhdGlvbnM9IiArIG9wZXJhdGlvbnMgKyAiLCBkZWZpbml0aW9uPSIgKyBkZWZpbml0aW9uICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0xpZmVDeWNsZVRyYW5zaXRpb25FbnVtLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDEzNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL0xpZmVDeWNsZVRyYW5zaXRpb25FbnVtLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitwdWJsaWMgZW51bSBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bSB7CisKKwlDSEVDS09VVCgiY2hlY2tvdXQiKSwgCisJQ0hFQ0tJTigiY2hlY2tpbiIpLCAKKwlDRVJUSUZJQ0FUSU9OX1JFUVVFU1QoImNlcnRpZmljYXRpb25SZXF1ZXN0IiksIAorCVVORE9fQ0hFQ0tPVVQoInVuZG9DaGVja291dCIpLCAKKwlDQU5DRUxfQ0VSVElGSUNBVElPTigiY2FuY2VsQ2VydGlmaWNhdGlvbiIpLCAKKwlTVEFSVF9DRVJUSUZJQ0FUSU9OKCJzdGFydENlcnRpZmljYXRpb24iKSwgCisJRkFJTF9DRVJUSUZJQ0FUSU9OKCJmYWlsQ2VydGlmaWNhdGlvbiIpLCAKKwlDRVJUSUZZKCJjZXJ0aWZ5IiksIAorCURJU1RSSUJVVEUoImRpc3RyaWJ1dGUiKTsKKworCVN0cmluZyBkaXNwbGF5TmFtZTsKKworCXByaXZhdGUgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0oU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisJCXRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworCQlyZXR1cm4gZGlzcGxheU5hbWU7CisJfQorCisJcHVibGljIHN0YXRpYyBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bSBnZXRGcm9tRGlzcGxheU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DSEVDS09VVC5nZXREaXNwbGF5TmFtZSgpKSkgeworCQkJcmV0dXJuIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNIRUNLT1VUOworCQl9CisJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0hFQ0tJTi5nZXREaXNwbGF5TmFtZSgpKSkgeworCQkJcmV0dXJuIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNIRUNLSU47CisJCX0KKwkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DRVJUSUZJQ0FUSU9OX1JFUVVFU1QuZ2V0RGlzcGxheU5hbWUoKSkpIHsKKwkJCXJldHVybiBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DRVJUSUZJQ0FUSU9OX1JFUVVFU1Q7CisJCX0KKwkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5VTkRPX0NIRUNLT1VULmdldERpc3BsYXlOYW1lKCkpKSB7CisJCQlyZXR1cm4gTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uVU5ET19DSEVDS09VVDsKKwkJfQorCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNBTkNFTF9DRVJUSUZJQ0FUSU9OLmdldERpc3BsYXlOYW1lKCkpKSB7CisJCQlyZXR1cm4gTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uQ0FOQ0VMX0NFUlRJRklDQVRJT047CisJCX0KKwkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5TVEFSVF9DRVJUSUZJQ0FUSU9OLmdldERpc3BsYXlOYW1lKCkpKSB7CisJCQlyZXR1cm4gTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uU1RBUlRfQ0VSVElGSUNBVElPTjsKKwkJfQorCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkZBSUxfQ0VSVElGSUNBVElPTi5nZXREaXNwbGF5TmFtZSgpKSkgeworCQkJcmV0dXJuIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkZBSUxfQ0VSVElGSUNBVElPTjsKKwkJfQorCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkNFUlRJRlkuZ2V0RGlzcGxheU5hbWUoKSkpIHsKKwkJCXJldHVybiBMaWZlQ3ljbGVUcmFuc2l0aW9uRW51bS5DRVJUSUZZOworCQl9CisJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0uRElTVFJJQlVURS5nZXREaXNwbGF5TmFtZSgpKSkgeworCQkJcmV0dXJuIExpZmVDeWNsZVRyYW5zaXRpb25FbnVtLkRJU1RSSUJVVEU7CisJCX0gZWxzZQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiB2YWx1ZSBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0gdmFsdWVzIik7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsdWVzQXNTdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlmb3IgKExpZmVDeWNsZVRyYW5zaXRpb25FbnVtIG9wIDogTGlmZUN5Y2xlVHJhbnNpdGlvbkVudW0udmFsdWVzKCkpIHsKKwkJCXNiLmFwcGVuZChvcC5nZXREaXNwbGF5TmFtZSgpKS5hcHBlbmQoIiAiKTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvTGlmZWN5Y2xlU3RhdGVFbnVtLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvTGlmZWN5Y2xlU3RhdGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5ZWY4MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9MaWZlY3ljbGVTdGF0ZUVudW0uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK3B1YmxpYyBlbnVtIExpZmVjeWNsZVN0YXRlRW51bSB7CisKKwlSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiwKKworCUNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MsCisKKwlDRVJUSUZJRUQsCisKKwlOT1RfQ0VSVElGSUVEX0NIRUNLSU4sCisKKwlOT1RfQ0VSVElGSUVEX0NIRUNLT1VUOworCisJcHVibGljIHN0YXRpYyBMaWZlY3ljbGVTdGF0ZUVudW0gZmluZFN0YXRlKFN0cmluZyBzdGF0ZSkgeworCisJCWZvciAoTGlmZWN5Y2xlU3RhdGVFbnVtIGxpZmVjeWNsZVN0YXRlRW51bSA6IExpZmVjeWNsZVN0YXRlRW51bS52YWx1ZXMoKSkgeworCQkJaWYgKGxpZmVjeWNsZVN0YXRlRW51bS5uYW1lKCkuZXF1YWxzKHN0YXRlKSkgeworCQkJCXJldHVybiBsaWZlY3ljbGVTdGF0ZUVudW07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL09wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL09wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTNjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQXJ0aWZhY3REYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuSW5wdXRzVmFsdWVEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuT3BlcmF0aW9uRGF0YURlZmluaXRpb247CisKKy8qKgorICogRGVmaW5lcyBhbiBvcGVyYXRpb24gYXZhaWxhYmxlIHRvIG1hbmFnZSBwYXJ0aWN1bGFyIGFzcGVjdHMgb2YgdGhlIE5vZGUgVHlwZS4KKyAqIAorICogQGF1dGhvciBlc29mZXIKKyAqLworcHVibGljIGNsYXNzIE9wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgSU9wZXJhdGlvblBhcmFtZXRlciB7CisKKwkvKiogSW1wbGVtZW50YXRpb24gYXJ0aWZhY3QgZm9yIHRoZSBpbnRlcmZhY2UuICovCisJcHJpdmF0ZSBBcnRpZmFjdERlZmluaXRpb24gaW1wbGVtZW50YXRpb247CisKKwkvKioKKwkgKiBUaGlzIE9QVElPTkFMIHByb3BlcnR5IGNvbnRhaW5zIGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBpbnB1dCBwYXJhbWV0ZXIKKwkgKiBkZWZpbml0aW9ucy4KKwkgKi8KKwkvLyBASnNvbkRlc2VyaWFsaXplKGNvbnRlbnRVc2luZyA9IE9wZXJhdGlvblBhcmFtZXRlckRlc2VyaWFsaXplci5jbGFzcykKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVEZWZpbml0aW9uPiBpbnB1dHM7CisKKwlwcml2YXRlIGJvb2xlYW4gZGVmaW5pdGlvbjsKKworCS8qKgorCSAqIDxwPgorCSAqIEphY2tzb24gRGVTZXJpYWxpemF0aW9uIHdvcmthcm91bmQgY29uc3RydWN0b3IgdG8gY3JlYXRlIGFuIG9wZXJhdGlvbgorCSAqIHdpdGggbm8gYXJndW1lbnRzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZW1wdHlTdHJpbmcKKwkgKiAgICAgICAgICAgIFRoZSBlbXB0eSBzdHJpbmcgcHJvdmlkZWQgYnkgamFja3Nvbi4KKwkgKi8KKwlwdWJsaWMgT3BlcmF0aW9uKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgT3BlcmF0aW9uKE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uIHApIHsKKwkJc3VwZXIocCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCXB1YmxpYyBPcGVyYXRpb24oQXJ0aWZhY3REYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRhdGlvbiwgU3RyaW5nIGRlc2NyaXB0aW9uLAorCQkJTWFwPFN0cmluZywgSW5wdXRzVmFsdWVEYXRhRGVmaW5pdGlvbj4gaW5wdXRzKSB7CisJCXN1cGVyKGRlc2NyaXB0aW9uKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGlvbigpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihib29sZWFuIGRlZmluaXRpb24pIHsKKwkJdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKKwl9CisKKwlwdWJsaWMgQXJ0aWZhY3REZWZpbml0aW9uIGdldEltcGxlbWVudGF0aW9uKCkgeworCQlyZXR1cm4gaW1wbGVtZW50YXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb24oQXJ0aWZhY3REZWZpbml0aW9uIGltcGxlbWVudGF0aW9uKSB7CisJCXRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgUHJvcGVydHlWYWx1ZURlZmluaXRpb24+IGdldElucHV0cygpIHsKKwkJcmV0dXJuIGlucHV0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnB1dHMoTWFwPFN0cmluZywgUHJvcGVydHlWYWx1ZURlZmluaXRpb24+IGlucHV0cykgeworCQl0aGlzLmlucHV0cyA9IGlucHV0czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIk9wZXJhdGlvbiBbaW1wbGVtZW50YXRpb249IiArIGltcGxlbWVudGF0aW9uICsgIiwgaW5wdXRzPSIgKyBpbnB1dHMgKyAiLCBkZWZpbml0aW9uPSIgKyBkZWZpbml0aW9uCisJCQkJKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUGFyc2VkVG9zY2FZYW1sSW5mby5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1BhcnNlZFRvc2NhWWFtbEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjA3MDgxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1BhcnNlZFRvc2NhWWFtbEluZm8uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgUGFyc2VkVG9zY2FZYW1sSW5mbyB7CisJTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBpbnB1dHM7CisKKwlNYXA8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+IGluc3RhbmNlczsKKworCU1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzOworCisJcHVibGljIE1hcDxTdHJpbmcsIFVwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mbz4gZ2V0SW5zdGFuY2VzKCkgeworCQlyZXR1cm4gaW5zdGFuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEluc3RhbmNlcyhNYXA8U3RyaW5nLCBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8+IGluc3RhbmNlcykgeworCQl0aGlzLmluc3RhbmNlcyA9IGluc3RhbmNlczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgR3JvdXBEZWZpbml0aW9uPiBnZXRHcm91cHMoKSB7CisJCXJldHVybiBncm91cHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JvdXBzKE1hcDxTdHJpbmcsIEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzKSB7CisJCXRoaXMuZ3JvdXBzID0gZ3JvdXBzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+IGdldElucHV0cygpIHsKKwkJcmV0dXJuIGlucHV0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnB1dHMoTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBpbnB1dHMpIHsKKwkJdGhpcy5pbnB1dHMgPSBpbnB1dHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJQYXJzZWRUb3NjYVlhbWxJbmZvIFtpbnB1dHM9IiArIGlucHV0cyArICIsIGluc3RhbmNlcz0iICsgaW5zdGFuY2VzICsgIiwgZ3JvdXBzPSIgKyBncm91cHMgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUG9pbnQuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qb2ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDlmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUG9pbnQuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK3B1YmxpYyBjbGFzcyBQb2ludCB7CisKKwlTdHJpbmcgeDsKKwlTdHJpbmcgeTsKKworCXB1YmxpYyBQb2ludCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgUG9pbnQoU3RyaW5nIHgsIFN0cmluZyB5KSB7CisJCXN1cGVyKCk7CisJCXRoaXMueCA9IHg7CisJCXRoaXMueSA9IHk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRYKCkgeworCQlyZXR1cm4geDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRYKFN0cmluZyB4KSB7CisJCXRoaXMueCA9IHg7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRZKCkgeworCQlyZXR1cm4geTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRZKFN0cmluZyB5KSB7CisJCXRoaXMueSA9IHk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJQb2ludCBbeD0iICsgeCArICIsIHk9IiArIHkgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUG9saWN5VHlwZURlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qb2xpY3lUeXBlRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliM2U3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUG9saWN5VHlwZURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qb2xpY3lUeXBlRGF0YURlZmluaXRpb247CisKKy8qKgorICogU3BlY2lmaWVzIHRoZSBwb2xpY3kgdHlwZSB0aGF0IHRoZSBOb2RlIFR5cGUgZXhwb3Nlcy4KKyAqLworcHVibGljIGNsYXNzIFBvbGljeVR5cGVEZWZpbml0aW9uIGV4dGVuZHMgUG9saWN5VHlwZURhdGFEZWZpbml0aW9uIHsKKworCXByaXZhdGUgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXM7CisKKwlwdWJsaWMgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgUG9saWN5VHlwZURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFBvbGljeVR5cGVEZWZpbml0aW9uKFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbiBwKSB7CisJCXN1cGVyKHApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIiBbIHByb3BlcnRpZXM9IiArIHByb3BlcnRpZXMgKyAiIF0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1Byb2R1Y3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9kdWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyMjM4NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9kdWN0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvZHVjdE1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgUHJvZHVjdCBleHRlbmRzIENvbXBvbmVudCB7CisKKwlwdWJsaWMgUHJvZHVjdCgpIHsKKwkJc3VwZXIobmV3IFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oKSk7CisJCWNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUOworCX0KKworCXB1YmxpYyBQcm9kdWN0KFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24gcHJvZHVjdE1ldGFkYXRhRGVmaW5pdGlvbikgeworCQlzdXBlcihwcm9kdWN0TWV0YWRhdGFEZWZpbml0aW9uKTsKKwkJY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1Q7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKKwkJcmV0dXJuIGdldFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oKS5nZXRGdWxsTmFtZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZ1bGxOYW1lKFN0cmluZyBmdWxsTmFtZSkgeworCQlnZXRQcm9kdWN0TWV0YWRhdGFEZWZpbml0aW9uKCkuc2V0RnVsbE5hbWUoZnVsbE5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SW52YXJpYW50VVVJRCgpIHsKKwkJcmV0dXJuIGdldFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oKS5nZXRJbnZhcmlhbnRVVUlEKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCkgeworCQlnZXRQcm9kdWN0TWV0YWRhdGFEZWZpbml0aW9uKCkuc2V0SW52YXJpYW50VVVJRChpbnZhcmlhbnRVVUlEKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRhY3RzKCkgeworCQlyZXR1cm4gZ2V0UHJvZHVjdE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldENvbnRhY3RzKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udGFjdHMoTGlzdDxTdHJpbmc+IGNvbnRhY3RzKSB7CisJCWdldFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oKS5zZXRDb250YWN0cyhjb250YWN0cyk7CisJfQorCisJcHVibGljIHZvaWQgYWRkQ29udGFjdChTdHJpbmcgY29udGFjdCkgeworCQlnZXRQcm9kdWN0TWV0YWRhdGFEZWZpbml0aW9uKCkuYWRkQ29udGFjdChjb250YWN0KTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRJc0FjdGl2ZSgpIHsKKwkJcmV0dXJuIGdldFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oKS5nZXRJc0FjdGl2ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldElzQWN0aXZlKEJvb2xlYW4gaXNBY3RpdmUpIHsKKwkJZ2V0UHJvZHVjdE1ldGFkYXRhRGVmaW5pdGlvbigpLnNldElzQWN0aXZlKGlzQWN0aXZlKTsKKwl9CisKKwlwcml2YXRlIFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uIGdldFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oKSB7CisJCXJldHVybiAoUHJvZHVjdE1ldGFkYXRhRGF0YURlZmluaXRpb24pIGdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9kdWN0TWV0YWRhdGFEZWZpbml0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUHJvZHVjdE1ldGFkYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDU0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUHJvZHVjdE1ldGFkYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9kdWN0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24gZXh0ZW5kcyBDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24geworCisJcHVibGljIFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IG5ldyBQcm9kdWN0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpOworCX0KKworCXB1YmxpYyBQcm9kdWN0TWV0YWRhdGFEZWZpbml0aW9uKFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uIGNvbXBvbmVudCkgeworCQlzdXBlcihjb21wb25lbnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9wZXJ0eUNvbnN0cmFpbnQuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9wZXJ0eUNvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUxNTUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1Byb3BlcnR5Q29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKworcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUNvbnN0cmFpbnQgeworCisJdm9pZCBpbml0aWFsaXplKFRvc2NhVHlwZSBwcm9wZXJ0eVR5cGUpIHRocm93cyBDb25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uOworCisJdm9pZCB2YWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKKwl2b2lkIHZhbGlkYXRlKFRvc2NhVHlwZSB0b3NjYVR5cGUsIFN0cmluZyBwcm9wZXJ0eVRleHRWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUHJvcGVydHlEZWZpbml0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUHJvcGVydHlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3NGU4NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9wZXJ0eURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKKworLy9pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKKy8vaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKy8vCisvLworLy9pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZVByb3BlcnRpZXM7CisvL2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uUHJvcGVydHk7CisvL2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuYW5ub3RhdGlvbi5Kc29uRGVzZXJpYWxpemU7CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eURlZmluaXRpb24gZXh0ZW5kcyBQcm9wZXJ0eURhdGFEZWZpbml0aW9uCisJCWltcGxlbWVudHMgSU9wZXJhdGlvblBhcmFtZXRlciwgSUNvbXBsZXhEZWZhdWx0VmFsdWUsIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxODg0MDM2NTY2MDAzMTcyNjlMOworCisJcHJpdmF0ZSBMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHM7CisJLy8gcHJpdmF0ZSBTY2hlbWEgc2NoZW1hOworCXByaXZhdGUgU3RyaW5nIHN0YXR1czsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiBUaGUgcmVzb3VyY2UgaWQgd2hpY2ggdGhpcyBwcm9wZXJ0eSBiZWxvbmdzIHRvCisJICovCisJcHJpdmF0ZSBTdHJpbmcgcGFyZW50VW5pcXVlSWQ7CisKKwlwdWJsaWMgUHJvcGVydHlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwKSB7CisJCXN1cGVyKHApOworCX0KKworCXB1YmxpYyBQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlEZWZpbml0aW9uIHBkKSB7CisJCXRoaXMuc2V0VW5pcXVlSWQocGQuZ2V0VW5pcXVlSWQoKSk7CisJCXRoaXMuc2V0Q29uc3RyYWludHMocGQuZ2V0Q29uc3RyYWludHMoKSk7CisJCS8vIHRoaXMuc2V0U2NoZW1hKHBkLnNjaGVtYSk7CisJCXRoaXMuc2V0RGVmYXVsdFZhbHVlKHBkLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJdGhpcy5zZXREZXNjcmlwdGlvbihwZC5nZXREZXNjcmlwdGlvbigpKTsKKwkJdGhpcy5zZXROYW1lKHBkLmdldE5hbWUoKSk7CisJCXRoaXMuc2V0U2NoZW1hKHBkLmdldFNjaGVtYSgpKTsKKwkJdGhpcy5zZXRQYXJlbnRVbmlxdWVJZChwZC5nZXRQYXJlbnRVbmlxdWVJZCgpKTsKKwkJdGhpcy5zZXRSZXF1aXJlZChwZC5pc1JlcXVpcmVkKCkpOworCQl0aGlzLnNldFR5cGUocGQuZ2V0VHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGdldENvbnN0cmFpbnRzKCkgeworCQlyZXR1cm4gY29uc3RyYWludHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29uc3RyYWludHMoTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzKSB7CisJCXRoaXMuY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgW25hbWU9IiArIG5hbWUgKyAiLCBwYXJlbnRVbmlxdWVJZD0iICsgcGFyZW50VW5pcXVlSWQgKyAiLCBjb25zdHJhaW50cz0iCisJCQkJKyBjb25zdHJhaW50cyArICJdXSI7CisJfQorCisJLy8gcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYSBlbnRyeVNjaGVtYSkgeworCS8vIHRoaXMuc2NoZW1hID0gZW50cnlTY2hlbWE7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKKwkvLyByZXR1cm4gc2NoZW1hOworCS8vIH0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VW5pcXVlSWQoKSB7CisJCXJldHVybiBwYXJlbnRVbmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnRVbmlxdWVJZChTdHJpbmcgcGFyZW50VW5pcXVlSWQpIHsKKwkJdGhpcy5wYXJlbnRVbmlxdWVJZCA9IHBhcmVudFVuaXF1ZUlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oYm9vbGVhbiBkZWZpbml0aW9uKSB7CisJCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSBzdXBlci5oYXNoQ29kZSgpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29uc3RyYWludHMgPT0gbnVsbCkgPyAwIDogY29uc3RyYWludHMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChwYXJlbnRVbmlxdWVJZCA9PSBudWxsKSA/IDAgOiBwYXJlbnRVbmlxdWVJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHN0YXR1cyA9PSBudWxsKSA/IDAgOiBzdGF0dXMuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICghc3VwZXIuZXF1YWxzKG9iaikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlQcm9wZXJ0eURlZmluaXRpb24gb3RoZXIgPSAoUHJvcGVydHlEZWZpbml0aW9uKSBvYmo7CisJCWlmIChjb25zdHJhaW50cyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY29uc3RyYWludHMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNvbnN0cmFpbnRzLmVxdWFscyhvdGhlci5jb25zdHJhaW50cykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5uYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHBhcmVudFVuaXF1ZUlkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5wYXJlbnRVbmlxdWVJZCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghcGFyZW50VW5pcXVlSWQuZXF1YWxzKG90aGVyLnBhcmVudFVuaXF1ZUlkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHN0YXR1cyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuc3RhdHVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFzdGF0dXMuZXF1YWxzKG90aGVyLnN0YXR1cykpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1Byb3BlcnR5U2NvcGUuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9wZXJ0eVNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2YzQzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9wZXJ0eVNjb3BlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlTY29wZSB7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKG9iaiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlQcm9wZXJ0eVNjb3BlIG90aGVyID0gKFByb3BlcnR5U2NvcGUpIG9iajsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmdldENsYXNzKCkgIT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9wZXJ0eVZhbHVlRGVmaW5pdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1Byb3BlcnR5VmFsdWVEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzMjI0MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Qcm9wZXJ0eVZhbHVlRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5JbnB1dHNWYWx1ZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eURhdGFEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlWYWx1ZURlZmluaXRpb24gZXh0ZW5kcyBJbnB1dHNWYWx1ZURhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgSU9wZXJhdGlvblBhcmFtZXRlciB7CisKKwlwdWJsaWMgUHJvcGVydHlWYWx1ZURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCXB1YmxpYyBQcm9wZXJ0eVZhbHVlRGVmaW5pdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCXN1cGVyKG5hbWUsIHZhbHVlKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGlvbigpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVsYXRpb25zaGlwSW1wbC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1JlbGF0aW9uc2hpcEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI4ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1JlbGF0aW9uc2hpcEltcGwuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcEltcGwgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgyNzIzNDE0OTAyNTYyNTEzMzdMOworCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUmVsYXRpb25zaGlwSW1wbCBbdHlwZT0iICsgdHlwZSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGVhZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1JlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpci5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworcHVibGljIGNsYXNzIFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTc2MzEyNjU3MDYxODYwMjEzNUw7CisKKwlwcml2YXRlIFN0cmluZyByZXF1aXJlbWVudDsKKwlwcml2YXRlIFN0cmluZyBjYXBhYmlsaXR5T3duZXJJZDsKKwlwcml2YXRlIFN0cmluZyByZXF1aXJlbWVudE93bmVySWQ7CisKKwlwcml2YXRlIFJlbGF0aW9uc2hpcEltcGwgcmVsYXRpb25zaGlwOworCisJcHJpdmF0ZSBTdHJpbmcgY2FwYWJpbGl0eTsKKworCXByaXZhdGUgU3RyaW5nIGNhcGFiaWxpdHlVaWQ7CisJcHJpdmF0ZSBTdHJpbmcgcmVxdWlyZW1lbnRVaWQ7CisKKwlwdWJsaWMgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIoU3RyaW5nIHJlcXVpcmVtZW50LCBSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcCkgeworCQlzdXBlcigpOworCQl0aGlzLnJlcXVpcmVtZW50ID0gcmVxdWlyZW1lbnQ7CisJCXRoaXMucmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworCX0KKworCXB1YmxpYyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIoU3RyaW5nIHJlcXVpcmVtZW50LCBSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcCwgU3RyaW5nIGNhcGFiaWxpdHkpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5yZXF1aXJlbWVudCA9IHJlcXVpcmVtZW50OworCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKwkJdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVtZW50KCkgeworCQlyZXR1cm4gcmVxdWlyZW1lbnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnQoU3RyaW5nIHJlcXVpcmVtZW50KSB7CisJCXRoaXMucmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWxpdHlPd25lcklkKCkgeworCQlyZXR1cm4gY2FwYWJpbGl0eU93bmVySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0eU93bmVySWQoU3RyaW5nIGNhcGFiaWxpdHlPd25lcklkKSB7CisJCXRoaXMuY2FwYWJpbGl0eU93bmVySWQgPSBjYXBhYmlsaXR5T3duZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVtZW50T3duZXJJZCgpIHsKKwkJcmV0dXJuIHJlcXVpcmVtZW50T3duZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlbWVudE93bmVySWQoU3RyaW5nIHJlcXVpcmVtZW50T3duZXJJZCkgeworCQl0aGlzLnJlcXVpcmVtZW50T3duZXJJZCA9IHJlcXVpcmVtZW50T3duZXJJZDsKKwl9CisKKwlwdWJsaWMgUmVsYXRpb25zaGlwSW1wbCBnZXRSZWxhdGlvbnNoaXAoKSB7CisJCXJldHVybiByZWxhdGlvbnNoaXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcCkgeworCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWxpdHkoKSB7CisJCXJldHVybiBjYXBhYmlsaXR5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHkoU3RyaW5nIGNhcGFiaWxpdHkpIHsKKwkJdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWxpdHlVaWQoKSB7CisJCXJldHVybiBjYXBhYmlsaXR5VWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHlVaWQoU3RyaW5nIGNhcGFiaWxpdHlVaWQpIHsKKwkJdGhpcy5jYXBhYmlsaXR5VWlkID0gY2FwYWJpbGl0eVVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVtZW50VWlkKCkgeworCQlyZXR1cm4gcmVxdWlyZW1lbnRVaWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRVaWQoU3RyaW5nIHJlcXVpcmVtZW50VWlkKSB7CisJCXRoaXMucmVxdWlyZW1lbnRVaWQgPSByZXF1aXJlbWVudFVpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciBbcmVxdWlyZW1lbnQ9IiArIHJlcXVpcmVtZW50ICsgIiwgcmVsYXRpb25zaGlwPSIgKyByZWxhdGlvbnNoaXAKKwkJCQkrICIsIGNhcGFiaWxpdHk9IiArIGNhcGFiaWxpdHkgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1ZjI3MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworcHVibGljIGNsYXNzIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBleHRlbmRzIFRhcmdldENhcGFiaWxpdHlSZWxEZWYgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYzOTYyNjUwNDk0OTQ4MjQ3NDFMOworCisJcHJpdmF0ZSBTdHJpbmcgZnJvbU5vZGU7CisKKwlwdWJsaWMgU3RyaW5nIGdldEZyb21Ob2RlKCkgeworCQlyZXR1cm4gZnJvbU5vZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RnJvbU5vZGUoU3RyaW5nIGZyb21Ob2RlKSB7CisJCXRoaXMuZnJvbU5vZGUgPSBmcm9tTm9kZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBbZnJvbU5vZGU9IiArIGZyb21Ob2RlICsgIiwgdG9TdHJpbmcoKT0iICsgc3VwZXIudG9TdHJpbmcoKSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudERlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU3NDEyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1JlcXVpcmVtZW50RGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBTcGVjaWZpZXMgdGhlIHJlcXVpcmVtZW50cyB0aGF0IHRoZSBOb2RlIFR5cGUgZXhwb3Nlcy4KKyAqLworcHVibGljIGNsYXNzIFJlcXVpcmVtZW50RGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODg0MDU0OTQ4OTQwOTI3NDUzMkw7CisKKwkvKioKKwkgKiBVbmlxdWUgaWQgb2YgdGhlIHJlcXVpcmVtZW50CisJICovCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJLyoqCisJICogc3BlY2lmeSB0aGUgY2FwYWJpbGl0eSB0eXBlCisJICovCisJcHJpdmF0ZSBTdHJpbmcgY2FwYWJpbGl0eTsKKworCS8qKgorCSAqIHNwZWNpZnkgdGhlIG5vZGUgdHlwZShPcHRpb25hbCBieSB0b3NjYSkKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBub2RlOworCisJLyoqCisJICogc3BlY2lmeSB0aGUgcmVsYXRpb25zaGlwIHR5cGUoT3B0aW9uYWwgYnkgdG9zY2EpCisJICovCisJcHJpdmF0ZSBTdHJpbmcgcmVsYXRpb25zaGlwOworCisJLy8gc3BlY2lmaWVzIHRoZSByZXNvdXJjZSBpbnN0YW5jZSBob2xkaW5nIHRoaXMgcmVxdWlyZW1lbnQKKwlwcml2YXRlIFN0cmluZyBvd25lcklkOworCXByaXZhdGUgU3RyaW5nIG93bmVyTmFtZTsKKworCXByaXZhdGUgU3RyaW5nIG1pbk9jY3VycmVuY2VzOworCXByaXZhdGUgU3RyaW5nIG1heE9jY3VycmVuY2VzOworCisJcHVibGljIFJlcXVpcmVtZW50RGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgUmVxdWlyZW1lbnREZWZpbml0aW9uKFJlcXVpcmVtZW50RGVmaW5pdGlvbiBvdGhlcikgeworCQl0aGlzLnVuaXF1ZUlkID0gb3RoZXIudW5pcXVlSWQ7CisJCXRoaXMubmFtZSA9IG90aGVyLm5hbWU7CisJCXRoaXMuY2FwYWJpbGl0eSA9IG90aGVyLmNhcGFiaWxpdHk7CisJCXRoaXMubm9kZSA9IG90aGVyLm5vZGU7CisJCXRoaXMucmVsYXRpb25zaGlwID0gb3RoZXIucmVsYXRpb25zaGlwOworCQl0aGlzLm93bmVySWQgPSBvdGhlci5vd25lcklkOworCQl0aGlzLm93bmVyTmFtZSA9IG90aGVyLm93bmVyTmFtZTsKKwkJdGhpcy5taW5PY2N1cnJlbmNlcyA9IG90aGVyLm1pbk9jY3VycmVuY2VzOworCQl0aGlzLm1heE9jY3VycmVuY2VzID0gb3RoZXIubWF4T2NjdXJyZW5jZXM7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENhcGFiaWxpdHkoKSB7CisJCXJldHVybiBjYXBhYmlsaXR5OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHkoU3RyaW5nIGNhcGFiaWxpdHkpIHsKKwkJdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vZGUoKSB7CisJCXJldHVybiBub2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGUoU3RyaW5nIG5vZGUpIHsKKwkJdGhpcy5ub2RlID0gbm9kZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aW9uc2hpcCgpIHsKKwkJcmV0dXJuIHJlbGF0aW9uc2hpcDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXAoU3RyaW5nIHJlbGF0aW9uc2hpcCkgeworCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKwl9CisKKwkvLyBwdWJsaWMgUmVxdWlyZW1lbnRJbXBsRGVmIGdldFJlcXVpcmVtZW50SW1wbCgpIHsKKwkvLyByZXR1cm4gcmVxdWlyZW1lbnRJbXBsOworCS8vIH0KKwkvLworCS8vIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50SW1wbChSZXF1aXJlbWVudEltcGxEZWYgcmVxdWlyZW1lbnRJbXBsKSB7CisJLy8gdGhpcy5yZXF1aXJlbWVudEltcGwgPSByZXF1aXJlbWVudEltcGw7CisJLy8gfQorCisJcHVibGljIFN0cmluZyBnZXRPd25lcklkKCkgeworCQlyZXR1cm4gb3duZXJJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPd25lcklkKFN0cmluZyBvd25lcklkKSB7CisJCXRoaXMub3duZXJJZCA9IG93bmVySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRPd25lck5hbWUoKSB7CisJCXJldHVybiBvd25lck5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3duZXJOYW1lKFN0cmluZyBvd25lck5hbWUpIHsKKwkJdGhpcy5vd25lck5hbWUgPSBvd25lck5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNaW5PY2N1cnJlbmNlcygpIHsKKwkJcmV0dXJuIG1pbk9jY3VycmVuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1pbk9jY3VycmVuY2VzKFN0cmluZyBtaW5PY2N1cnJlbmNlcykgeworCQl0aGlzLm1pbk9jY3VycmVuY2VzID0gbWluT2NjdXJyZW5jZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXhPY2N1cnJlbmNlcygpIHsKKwkJcmV0dXJuIG1heE9jY3VycmVuY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1heE9jY3VycmVuY2VzKFN0cmluZyBtYXhPY2N1cnJlbmNlcykgeworCQl0aGlzLm1heE9jY3VycmVuY2VzID0gbWF4T2NjdXJyZW5jZXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY2FwYWJpbGl0eSA9PSBudWxsKSA/IDAgOiBjYXBhYmlsaXR5Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobm9kZSA9PSBudWxsKSA/IDAgOiBub2RlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgob3duZXJJZCA9PSBudWxsKSA/IDAgOiBvd25lcklkLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgob3duZXJOYW1lID09IG51bGwpID8gMCA6IG93bmVyTmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHJlbGF0aW9uc2hpcCA9PSBudWxsKSA/IDAgOiByZWxhdGlvbnNoaXAuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1bmlxdWVJZCA9PSBudWxsKSA/IDAgOiB1bmlxdWVJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1pbk9jY3VycmVuY2VzID09IG51bGwpID8gMCA6IG1pbk9jY3VycmVuY2VzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobWF4T2NjdXJyZW5jZXMgPT0gbnVsbCkgPyAwIDogbWF4T2NjdXJyZW5jZXMuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiBvdGhlciA9IChSZXF1aXJlbWVudERlZmluaXRpb24pIG9iajsKKwkJaWYgKGNhcGFiaWxpdHkgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmNhcGFiaWxpdHkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNhcGFiaWxpdHkuZXF1YWxzKG90aGVyLmNhcGFiaWxpdHkpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChub2RlID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5ub2RlICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFub2RlLmVxdWFscyhvdGhlci5ub2RlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKG93bmVySWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm93bmVySWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW93bmVySWQuZXF1YWxzKG90aGVyLm93bmVySWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAob3duZXJOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5vd25lck5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW93bmVyTmFtZS5lcXVhbHMob3RoZXIub3duZXJOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHJlbGF0aW9uc2hpcCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucmVsYXRpb25zaGlwICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFyZWxhdGlvbnNoaXAuZXF1YWxzKG90aGVyLnJlbGF0aW9uc2hpcCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh1bmlxdWVJZCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudW5pcXVlSWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXVuaXF1ZUlkLmVxdWFscyhvdGhlci51bmlxdWVJZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChtaW5PY2N1cnJlbmNlcyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubWluT2NjdXJyZW5jZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW1pbk9jY3VycmVuY2VzLmVxdWFscyhvdGhlci5taW5PY2N1cnJlbmNlcykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChtYXhPY2N1cnJlbmNlcyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubWF4T2NjdXJyZW5jZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW1heE9jY3VycmVuY2VzLmVxdWFscyhvdGhlci5tYXhPY2N1cnJlbmNlcykpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUmVxdWlyZW1lbnREZWZpbml0aW9uIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBuYW1lPSIgKyBuYW1lICsgIiwgY2FwYWJpbGl0eT0iICsgY2FwYWJpbGl0eQorCQkJCSsgIiwgbm9kZT0iICsgbm9kZSArICIsIHJlbGF0aW9uc2hpcD0iICsgcmVsYXRpb25zaGlwICsgIiwgb3duZXJJZD0iICsgb3duZXJJZCArICIsIG93bmVyTmFtZT0iCisJCQkJKyBvd25lck5hbWUgKyAiLCBtaW5PY2N1cnJlbmNlcz0iICsgbWluT2NjdXJyZW5jZXMgKyAiLCBtYXhPY2N1cnJlbmNlcz0iICsgbWF4T2NjdXJyZW5jZXMgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVxdWlyZW1lbnRJbXBsRGVmLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVxdWlyZW1lbnRJbXBsRGVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2YmQwMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudEltcGxEZWYuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgUmVxdWlyZW1lbnRJbXBsRGVmIHsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJLyoqCisJICogbm9kZSB0eXBlKG1hbmRhdG9yeSkuIFVuaXF1ZSBpZCBvZiB0aGUgbm9kZSB3ZSBjaG9vc2UuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgbm9kZUlkOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDYXBhYmlsdHlJbnN0YW5jZT4gcmVxdWlyZW1lbnRQcm9wZXJ0aWVzOworCisJcHJpdmF0ZSBQb2ludCBwb2ludDsKKworCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUlkKCkgeworCQlyZXR1cm4gbm9kZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGVJZChTdHJpbmcgbm9kZUlkKSB7CisJCXRoaXMubm9kZUlkID0gbm9kZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBDYXBhYmlsdHlJbnN0YW5jZT4gZ2V0UmVxdWlyZW1lbnRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcmVxdWlyZW1lbnRQcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50UHJvcGVydGllcyhNYXA8U3RyaW5nLCBDYXBhYmlsdHlJbnN0YW5jZT4gcmVxdWlyZW1lbnRQcm9wZXJ0aWVzKSB7CisJCXRoaXMucmVxdWlyZW1lbnRQcm9wZXJ0aWVzID0gcmVxdWlyZW1lbnRQcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBQb2ludCBnZXRQb2ludCgpIHsKKwkJcmV0dXJuIHBvaW50OworCX0KKworCXB1YmxpYyB2b2lkIHNldFBvaW50KFBvaW50IHBvaW50KSB7CisJCXRoaXMucG9pbnQgPSBwb2ludDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlcXVpcmVtZW50SW1wbERlZiBbdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgbm9kZUlkPSIgKyBub2RlSWQgKyAiLCByZXF1aXJlbWVudFByb3BlcnRpZXM9IgorCQkJCSsgcmVxdWlyZW1lbnRQcm9wZXJ0aWVzICsgIiwgcG9pbnQ9IiArIHBvaW50ICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1JlcXVpcmVtZW50SW5zdGFuY2UuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudEluc3RhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmNDQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXF1aXJlbWVudEluc3RhbmNlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCisvKioKKyAqIFNwZWNpZmllcyB0aGUgcmVxdWlyZW1lbnRzIHRoYXQgdGhlIE5vZGUgVHlwZSBleHBvc2VzLgorICovCitwdWJsaWMgY2xhc3MgUmVxdWlyZW1lbnRJbnN0YW5jZSB7CisKKwkvKioKKwkgKiBzcGVjaWZ5IHRoZSByZXNvdXJjZSBpbnN0YW5jZSBuYW1lIGFzIGFwcGVhcnMgaW4gdGhlIHNlcnZpY2UKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBub2RlOworCisJLyoqCisJICogc3BlY2lmeSB0aGUgcmVsYXRpb25zaGlwIGltcGwKKwkgKi8KKwlwcml2YXRlIFJlbGF0aW9uc2hpcEltcGwgcmVsYXRpb25zaGlwOworCisJcHVibGljIFN0cmluZyBnZXROb2RlKCkgeworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb2RlKFN0cmluZyBub2RlKSB7CisJCXRoaXMubm9kZSA9IG5vZGU7CisJfQorCisJcHVibGljIFJlbGF0aW9uc2hpcEltcGwgZ2V0UmVsYXRpb25zaGlwKCkgeworCQlyZXR1cm4gcmVsYXRpb25zaGlwOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcCkgeworCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlcXVpcmVtZW50SW5zdGFuY2UgW25vZGU9IiArIG5vZGUgKyAiLCByZWxhdGlvbnNoaXA9IiArIHJlbGF0aW9uc2hpcCArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXNvdXJjZS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5MGZiNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFJlc291cmNlIGV4dGVuZHMgQ29tcG9uZW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjgxMTU0MDU2NzY2MTM2ODQ4Mkw7CisKKwlwdWJsaWMgUmVzb3VyY2UoKSB7CisJCXN1cGVyKG5ldyBSZXNvdXJjZU1ldGFkYXRhRGVmaW5pdGlvbigpKTsKKwkJY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFOworCX0KKworCXB1YmxpYyBSZXNvdXJjZShDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24gY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKSB7CisJCXN1cGVyKGNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbik7CisJCWNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRTsKKwl9CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGRlcml2ZWRMaXN0OworCisJcHJpdmF0ZSBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllczsKKworCXByaXZhdGUgTGlzdDxBdHRyaWJ1dGVEZWZpbml0aW9uPiBhdHRyaWJ1dGVzOworCisJLy8gTGF0ZXIKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+IGludGVyZmFjZXM7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBkZWZhdWx0Q2FwYWJpbGl0aWVzOworCisJcHJpdmF0ZSBMaXN0PEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24+IGFkZGl0aW9uYWxJbmZvcm1hdGlvbjsKKworCS8qKgorCSAqIFBsZWFzZSBub3RlIHRoYXQgbW9yZSB0aGFuIG9uZSAiZGVyaXZlZEZyb20iIHJlc291cmNlIGlzIG5vdCBjdXJyZW50bHkKKwkgKiBzdXBwb3J0ZWQgYnkgdGhlIGFwcC4gVGhlIGZpcnN0IGxpc3QgZWxlbWVudCBpcyBhbHdheXMgYWRkcmVzc2VkLgorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERlcml2ZWRGcm9tKCkgeworCQlyZXR1cm4gZGVyaXZlZEZyb207CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVyaXZlZEZyb20oTGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tKSB7CisJCXRoaXMuZGVyaXZlZEZyb20gPSBkZXJpdmVkRnJvbTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVyaXZlZExpc3QgaXMgYSBjaGFpbiBvZiBkZXJpdmVkRnJvbS4gZS5nLiBpZiByZXNvdXJjZSBDIGlzIGRlcml2ZWQKKwkgKiBmcm9tIHJlc291cmNlIEIgdGhhdCBpcyBkZXJpdmVkIGZyb20gcmVzb3VyY2UgQSAtIHRoZW4gQSwgQiBpcyB0aGUKKwkgKiAiRGVyaXZlZExpc3QiIG9mIHJlc291cmNlIEMKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXREZXJpdmVkTGlzdCgpIHsKKwkJcmV0dXJuIGRlcml2ZWRMaXN0OworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcml2ZWRMaXN0KExpc3Q8U3RyaW5nPiBkZXJpdmVkTGlzdCkgeworCQl0aGlzLmRlcml2ZWRMaXN0ID0gZGVyaXZlZExpc3Q7CisJfQorCisJcHVibGljIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIExpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gZ2V0QXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIGF0dHJpYnV0ZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhMaXN0PEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHJpYnV0ZXMpIHsKKwkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gZ2V0SW50ZXJmYWNlcygpIHsKKwkJcmV0dXJuIGludGVyZmFjZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlcyhNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiBpbnRlcmZhY2VzKSB7CisJCXRoaXMuaW50ZXJmYWNlcyA9IGludGVyZmFjZXM7CisJfQorCisJcHVibGljIEJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKKwkJcmV0dXJuICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBnZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpCisJCQkJLmlzQWJzdHJhY3QoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBYnN0cmFjdChCb29sZWFuIGlzQWJzdHJhY3QpIHsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkKKwkJCQkuc2V0QWJzdHJhY3QoaXNBYnN0cmFjdCk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXREZWZhdWx0Q2FwYWJpbGl0aWVzKCkgeworCQlyZXR1cm4gZGVmYXVsdENhcGFiaWxpdGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q2FwYWJpbGl0aWVzKExpc3Q8U3RyaW5nPiBkZWZhdWx0Q2FwYWJpbGl0aWVzKSB7CisJCXRoaXMuZGVmYXVsdENhcGFiaWxpdGllcyA9IGRlZmF1bHRDYXBhYmlsaXRpZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb3N0KCkgeworCQlyZXR1cm4gKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkKKwkJCQkuZ2V0Q29zdCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvc3QoU3RyaW5nIGNvc3QpIHsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuc2V0Q29zdChjb3N0KTsKKwkJOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZVR5cGUoKSB7CisJCXJldHVybiAoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKQorCQkJCS5nZXRMaWNlbnNlVHlwZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpY2Vuc2VUeXBlKFN0cmluZyBsaWNlbnNlVHlwZSkgeworCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKQorCQkJCS5zZXRMaWNlbnNlVHlwZShsaWNlbnNlVHlwZSk7CisJfQorCisJcHVibGljIExpc3Q8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbj4gZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCkgeworCQlyZXR1cm4gYWRkaXRpb25hbEluZm9ybWF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxJbmZvcm1hdGlvbihMaXN0PEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24+IGFkZGl0aW9uYWxJbmZvcm1hdGlvbikgeworCQl0aGlzLmFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgc3VwZXIuaGFzaENvZGUoKTsKKworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoYXR0cmlidXRlcyA9PSBudWxsKSA/IDAgOiBhdHRyaWJ1dGVzLmhhc2hDb2RlKCkpOworCQkvLyByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY2FwYWJpbGl0aWVzID09IG51bGwpID8gMCA6CisJCS8vIGNhcGFiaWxpdGllcy5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGRlZmF1bHRDYXBhYmlsaXRpZXMgPT0gbnVsbCkgPyAwIDogZGVmYXVsdENhcGFiaWxpdGllcy5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGRlcml2ZWRGcm9tID09IG51bGwpID8gMCA6IGRlcml2ZWRGcm9tLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaW50ZXJmYWNlcyA9PSBudWxsKSA/IDAgOiBpbnRlcmZhY2VzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgocHJvcGVydGllcyA9PSBudWxsKSA/IDAgOiBwcm9wZXJ0aWVzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZGVyaXZlZExpc3QgPT0gbnVsbCkgPyAwIDogZGVyaXZlZExpc3QuaGFzaENvZGUoKSk7CisJCS8vIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChyZXF1aXJlbWVudHMgPT0gbnVsbCkgPyAwIDoKKwkJLy8gcmVxdWlyZW1lbnRzLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCVJlc291cmNlIG90aGVyID0gKFJlc291cmNlKSBvYmo7CisJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5hdHRyaWJ1dGVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhdHRyaWJ1dGVzLmVxdWFscyhvdGhlci5hdHRyaWJ1dGVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGRlZmF1bHRDYXBhYmlsaXRpZXMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlZmF1bHRDYXBhYmlsaXRpZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWRlZmF1bHRDYXBhYmlsaXRpZXMuZXF1YWxzKG90aGVyLmRlZmF1bHRDYXBhYmlsaXRpZXMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZGVyaXZlZEZyb20gPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlcml2ZWRGcm9tICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFkZXJpdmVkRnJvbS5lcXVhbHMob3RoZXIuZGVyaXZlZEZyb20pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZGVyaXZlZExpc3QgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlcml2ZWRMaXN0ICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFkZXJpdmVkTGlzdC5lcXVhbHMob3RoZXIuZGVyaXZlZExpc3QpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuaW50ZXJmYWNlcyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaW50ZXJmYWNlcy5lcXVhbHMob3RoZXIuaW50ZXJmYWNlcykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5wcm9wZXJ0aWVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFwcm9wZXJ0aWVzLmVxdWFscyhvdGhlci5wcm9wZXJ0aWVzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNvdXJjZSBbZGVyaXZlZEZyb209IiArIGRlcml2ZWRGcm9tICsgIiwgcHJvcGVydGllcz0iICsgcHJvcGVydGllcyArICIsIGF0dHJpYnV0ZXM9IiArIGF0dHJpYnV0ZXMKKwkJCQkrICIsIGludGVyZmFjZXM9IiArIGludGVyZmFjZXMKKwkJCQkvLyArICIsIGNhcGFiaWxpdGllcz0iICsgY2FwYWJpbGl0aWVzICsgIiwgcmVxdWlyZW1lbnRzPSIgKworCQkJCS8vIHJlcXVpcmVtZW50cworCQkJCSsgIiwgZGVmYXVsdENhcGFiaWxpdGllcz0iICsgZGVmYXVsdENhcGFiaWxpdGllcyArICIsIGFkZGl0aW9uYWxJbmZvcm1hdGlvbj0iICsgYWRkaXRpb25hbEluZm9ybWF0aW9uCisJCQkJKyAiTWV0YWRhdGEgWyIgKyBnZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkudG9TdHJpbmcoKSArICJdIjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRvc2NhUmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkKKwkJCQkuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb3NjYVJlc291cmNlTmFtZShTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWUpIHsKKwkJKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkKKwkJCQkuc2V0VG9zY2FSZXNvdXJjZU5hbWUodG9zY2FSZXNvdXJjZU5hbWUpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZVR5cGVFbnVtIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBnZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpCisJCQkJLmdldFJlc291cmNlVHlwZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSkgeworCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKQorCQkJCS5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZyB2ZW5kb3JOYW1lKSB7CisJCSgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBnZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpCisJCQkJLnNldFZlbmRvck5hbWUodmVuZG9yTmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVuZG9yUmVsZWFzZShTdHJpbmcgdmVuZG9yUmVsZWFzZSkgeworCQkoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKQorCQkJCS5zZXRWZW5kb3JSZWxlYXNlKHZlbmRvclJlbGVhc2UpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKKwkJcmV0dXJuICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBnZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpCisJCQkJLmdldFZlbmRvck5hbWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlbmRvclJlbGVhc2UoKSB7CisJCXJldHVybiAoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKQorCQkJCS5nZXRWZW5kb3JSZWxlYXNlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1Jlc291cmNlSW5zdGFuY2VIZWF0UGFyYW1ldGVyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVzb3VyY2VJbnN0YW5jZUhlYXRQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWRmZGZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1Jlc291cmNlSW5zdGFuY2VIZWF0UGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VJbnN0YW5jZUhlYXRQYXJhbWV0ZXIgZXh0ZW5kcyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiB7CisKKwlwcml2YXRlIFN0cmluZyB2YWx1ZVVuaXF1ZUlkOworCisJcHVibGljIFJlc291cmNlSW5zdGFuY2VIZWF0UGFyYW1ldGVyKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZUluc3RhbmNlSGVhdFBhcmFtZXRlcihIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiwgU3RyaW5nIHZhbHVlSWQpIHsKKwkJc3VwZXIoaGVhdFBhcmFtZXRlckRlZmluaXRpb24pOworCQl2YWx1ZVVuaXF1ZUlkID0gdmFsdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlVW5pcXVlSWQoKSB7CisJCXJldHVybiB2YWx1ZVVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlVW5pcXVlSWQoU3RyaW5nIHZhbHVlVW5pcXVlSWQpIHsKKwkJdGhpcy52YWx1ZVVuaXF1ZUlkID0gdmFsdWVVbmlxdWVJZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlc291cmNlSW5zdGFuY2VIZWF0UGFyYW1ldGVyIFsgIiArIHN1cGVyLnRvU3RyaW5nKCkgKyAiICwgdmFsdWVVbmlxdWVJZCA9ICIgKyB2YWx1ZVVuaXF1ZUlkICsgIiBdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVzb3VyY2VNZXRhZGF0YURlZmluaXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9SZXNvdXJjZU1ldGFkYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDgxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvUmVzb3VyY2VNZXRhZGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU1ldGFkYXRhRGVmaW5pdGlvbiBleHRlbmRzIENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiB7CisKKwlwdWJsaWMgUmVzb3VyY2VNZXRhZGF0YURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24oKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VNZXRhZGF0YURlZmluaXRpb24oUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uIG90aGVyKSB7CisJCXN1cGVyKG90aGVyKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1NjaGVtYS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1NjaGVtYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTQ4MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvU2NoZW1hLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBTY2hlbWEgYWxsb3dzIHRvIGNyZWF0ZSBuZXcgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCBhbG9uZyBUT1NDQSBkZWZpbml0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIFNjaGVtYSB7CisJcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEZyb207CisJcHJpdmF0ZSBMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXM7CisJcHJpdmF0ZSBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHk7CisKKwlwdWJsaWMgUHJvcGVydHlEZWZpbml0aW9uIGdldFByb3BlcnR5KCkgeworCQlyZXR1cm4gcHJvcGVydHk7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5KSB7CisJCXRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvU2VydmljZS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDczMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLlNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFNlcnZpY2UgZXh0ZW5kcyBDb21wb25lbnQgeworCXB1YmxpYyBTZXJ2aWNlKCkgeworCQlzdXBlcihuZXcgU2VydmljZU1ldGFkYXRhRGVmaW5pdGlvbigpKTsKKwkJY29tcG9uZW50VHlwZSA9IENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0U7CisJfQorCisJcHVibGljIFNlcnZpY2UoQ29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIHNlcnZpY2VNZXRhZGF0YURlZmluaXRpb24pIHsKKwkJc3VwZXIoc2VydmljZU1ldGFkYXRhRGVmaW5pdGlvbik7CisJCWNvbXBvbmVudFR5cGUgPSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBzZXJ2aWNlQXBpQXJ0aWZhY3RzOworCisJcHJpdmF0ZSBMaXN0PEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24+IGFkZGl0aW9uYWxJbmZvcm1hdGlvbjsKKworCXB1YmxpYyBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGdldFNlcnZpY2VBcGlBcnRpZmFjdHMoKSB7CisJCXJldHVybiBzZXJ2aWNlQXBpQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VBcGlBcnRpZmFjdHMoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBzZXJ2aWNlQXBpQXJ0aWZhY3RzKSB7CisJCXRoaXMuc2VydmljZUFwaUFydGlmYWN0cyA9IHNlcnZpY2VBcGlBcnRpZmFjdHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcm9qZWN0Q29kZSgpIHsKKwkJcmV0dXJuIGdldFNlcnZpY2VNZXRhZGF0YURlZmluaXRpb24oKS5nZXRQcm9qZWN0Q29kZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb2plY3RDb2RlKFN0cmluZyBwcm9qZWN0TmFtZSkgeworCQlnZXRTZXJ2aWNlTWV0YWRhdGFEZWZpbml0aW9uKCkuc2V0UHJvamVjdENvZGUocHJvamVjdE5hbWUpOworCX0KKworCXB1YmxpYyBEaXN0cmlidXRpb25TdGF0dXNFbnVtIGdldERpc3RyaWJ1dGlvblN0YXR1cygpIHsKKwkJU3RyaW5nIGRpc3RyaWJ1dGlvblN0YXR1cyA9IGdldFNlcnZpY2VNZXRhZGF0YURlZmluaXRpb24oKS5nZXREaXN0cmlidXRpb25TdGF0dXMoKTsKKwkJaWYgKGRpc3RyaWJ1dGlvblN0YXR1cyAhPSBudWxsKSB7CisJCQlyZXR1cm4gRGlzdHJpYnV0aW9uU3RhdHVzRW51bS52YWx1ZU9mKGRpc3RyaWJ1dGlvblN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGlvblN0YXR1cyhEaXN0cmlidXRpb25TdGF0dXNFbnVtIGRpc3RyaWJ1dGlvblN0YXR1cykgeworCQlpZiAoZGlzdHJpYnV0aW9uU3RhdHVzICE9IG51bGwpCisJCQlnZXRTZXJ2aWNlTWV0YWRhdGFEZWZpbml0aW9uKCkuc2V0RGlzdHJpYnV0aW9uU3RhdHVzKGRpc3RyaWJ1dGlvblN0YXR1cy5uYW1lKCkpOworCX0KKworCXByaXZhdGUgU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24gZ2V0U2VydmljZU1ldGFkYXRhRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIChTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpOworCX0KKworCXB1YmxpYyBMaXN0PEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24+IGdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpIHsKKwkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvcm1hdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oTGlzdDxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uPiBhZGRpdGlvbmFsSW5mb3JtYXRpb24pIHsKKwkJdGhpcy5hZGRpdGlvbmFsSW5mb3JtYXRpb24gPSBhZGRpdGlvbmFsSW5mb3JtYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJTZXJ2aWNlIFtjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb249IiArIGdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpCisJCS8vICsgIiwgcmVzb3VyY2VJbnN0YW5jZXM9IiArIHJlc291cmNlSW5zdGFuY2VzICsgIiwKKwkJLy8gcmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnM9IiArIHJlc291cmNlSW5zdGFuY2VzUmVsYXRpb25zICsgIiwKKwkJLy8gcmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnM9IgorCQkvLyArIHJlc291cmNlSW5zdGFuY2VzUmVsYXRpb25zCisJCQkJKyAiIF0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmljQ29tcG9uZXRUeXBlQXJ0aWZhY3RzKE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gc3BlY2lmaWNDb21wb25lbnRUeXBlQXJ0aWZhY3RzKSB7CisJCXNldFNlcnZpY2VBcGlBcnRpZmFjdHMoc3BlY2lmaWNDb21wb25lbnRUeXBlQXJ0aWZhY3RzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvU2VydmljZU1ldGFkYXRhRGVmaW5pdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1NlcnZpY2VNZXRhZGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWIyZTQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1NlcnZpY2VNZXRhZGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5TZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIFNlcnZpY2VNZXRhZGF0YURlZmluaXRpb24gZXh0ZW5kcyBDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24geworCisJcHVibGljIFNlcnZpY2VNZXRhZGF0YURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpOworCX0KKworCXB1YmxpYyBTZXJ2aWNlTWV0YWRhdGFEZWZpbml0aW9uKFNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uIGNvbXBvbmVudCkgeworCQlzdXBlcihjb21wb25lbnQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1RhZy5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1RhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZWRmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVGFnLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitwdWJsaWMgY2xhc3MgVGFnIHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVRhZyBvdGhlciA9IChUYWcpIG9iajsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmdldENsYXNzKCkgIT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1RhcmdldENhcGFiaWxpdHlSZWxEZWYuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9UYXJnZXRDYXBhYmlsaXR5UmVsRGVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5MmNhNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9UYXJnZXRDYXBhYmlsaXR5UmVsRGVmLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBUYXJnZXRDYXBhYmlsaXR5UmVsRGVmIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NTcxNDg5MzY4MjAwNzM2NDEzTDsKKworCXByaXZhdGUgU3RyaW5nIHRvTm9kZTsKKworCS8vIHByaXZhdGUgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW1wbD4+IHJlbGF0aW9uc2hpcHM7CisKKwlwcml2YXRlIExpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPiByZWxhdGlvbnNoaXBzOworCisJcHVibGljIFRhcmdldENhcGFiaWxpdHlSZWxEZWYoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFRhcmdldENhcGFiaWxpdHlSZWxEZWYoU3RyaW5nIHRvTm9kZSwgTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy50b05vZGUgPSB0b05vZGU7CisJCXRoaXMucmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uc2hpcHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUb05vZGUoKSB7CisJCXJldHVybiB0b05vZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9Ob2RlKFN0cmluZyB0b05vZGUpIHsKKwkJdGhpcy50b05vZGUgPSB0b05vZGU7CisJfQorCisJLy8gcHVibGljIFN0cmluZyBnZXRDYXBhYmlsaXR5T3duZXJJZCgpIHsKKwkvLyByZXR1cm4gY2FwYWJpbGl0eU93bmVySWQ7CisJLy8gfQorCS8vCisJLy8gcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0eU93bmVySWQoU3RyaW5nIGNhcGFiaWxpdHlPd25lcklkKSB7CisJLy8gdGhpcy5jYXBhYmlsaXR5T3duZXJJZCA9IGNhcGFiaWxpdHlPd25lcklkOworCS8vIH0KKworCXB1YmxpYyBMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gZ2V0UmVsYXRpb25zaGlwcygpIHsKKwkJcmV0dXJuIHJlbGF0aW9uc2hpcHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwcyhMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25zaGlwcykgeworCQl0aGlzLnJlbGF0aW9uc2hpcHMgPSByZWxhdGlvbnNoaXBzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVGFyZ2V0Q2FwYWJpbGl0eVJlbERlZiBbIHRvTm9kZT0iICsgdG9Ob2RlCisJCS8vICsgIiwgY2FwYWJpbGl0eU93bmVySWQ9IiArIGNhcGFiaWxpdHlPd25lcklkCisJCQkJKyAiLCByZWxhdGlvbnNoaXBzPSIgKyByZWxhdGlvbnNoaXBzICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1VwbG9hZENhcEluZm8uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRDYXBJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2MzMwNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRDYXBJbmZvLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBVcGxvYWRDYXBJbmZvIGV4dGVuZHMgVXBsb2FkSW5mbyB7CisJLyoqCisJICogc3BlY2lmeSB0aGUgbm9kZSB0eXBlKE9wdGlvbmFsIGJ5IHRvc2NhKQorCSAqLworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkU291cmNlVHlwZXM7CisKKwlwcml2YXRlIExpc3Q8VXBsb2FkUHJvcEluZm8+IHByb3BlcnRpZXM7CisKKwlwcml2YXRlIFN0cmluZyBub2RlOworCisJcHVibGljIFN0cmluZyBnZXROb2RlKCkgeworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb2RlKFN0cmluZyBub2RlKSB7CisJCXRoaXMubm9kZSA9IG5vZGU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWxpZFNvdXJjZVR5cGVzKCkgeworCQlyZXR1cm4gdmFsaWRTb3VyY2VUeXBlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZFNvdXJjZVR5cGVzKExpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzKSB7CisJCXRoaXMudmFsaWRTb3VyY2VUeXBlcyA9IHZhbGlkU291cmNlVHlwZXM7CisJfQorCisJcHVibGljIExpc3Q8VXBsb2FkUHJvcEluZm8+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTGlzdDxVcGxvYWRQcm9wSW5mbz4gcHJvcGVydGllcykgeworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjllODE2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1VwbG9hZENvbXBvbmVudEluc3RhbmNlSW5mby5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBVcGxvYWRDb21wb25lbnRJbnN0YW5jZUluZm8geworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkQ2FwSW5mbz4+IGNhcGFiaWxpdGllczsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUmVxSW5mbz4+IHJlcXVpcmVtZW50czsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUHJvcEluZm8+PiBwcm9wZXJ0aWVzOworCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUHJvcEluZm8+PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUHJvcEluZm8+PiBwcm9wZXJ0aWVzKSB7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkQ2FwSW5mbz4+IGdldENhcGFiaWxpdGllcygpIHsKKwkJcmV0dXJuIGNhcGFiaWxpdGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXRpZXMoTWFwPFN0cmluZywgTGlzdDxVcGxvYWRDYXBJbmZvPj4gY2FwYWJpbGl0aWVzKSB7CisJCXRoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFVwbG9hZFJlcUluZm8+PiBnZXRSZXF1aXJlbWVudHMoKSB7CisJCXJldHVybiByZXF1aXJlbWVudHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRzKE1hcDxTdHJpbmcsIExpc3Q8VXBsb2FkUmVxSW5mbz4+IHJlcXVpcmVtZW50cykgeworCQl0aGlzLnJlcXVpcmVtZW50cyA9IHJlcXVpcmVtZW50czsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRJbmZvLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVXBsb2FkSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NzA3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVXBsb2FkSW5mby5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFVwbG9hZEluZm8geworCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRQcm9wSW5mby5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1VwbG9hZFByb3BJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhNThjOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRQcm9wSW5mby5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBVcGxvYWRQcm9wSW5mbyBleHRlbmRzIFVwbG9hZEluZm8geworCisJcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXByaXZhdGUgYm9vbGVhbiBwYXNzd29yZDsKKworCXByaXZhdGUgTGlzdDxHZXRJbnB1dFZhbHVlSW5mbz4gZ2V0X2lucHV0OworCisJcHVibGljIExpc3Q8R2V0SW5wdXRWYWx1ZUluZm8+IGdldEdldF9pbnB1dCgpIHsKKwkJcmV0dXJuIGdldF9pbnB1dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHZXRfaW5wdXQoTGlzdDxHZXRJbnB1dFZhbHVlSW5mbz4gZ2V0X2lucHV0KSB7CisJCXRoaXMuZ2V0X2lucHV0ID0gZ2V0X2lucHV0OworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmQoKSB7CisJCXJldHVybiBwYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChib29sZWFuIHBhc3N3b3JkKSB7CisJCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRSZXFJbmZvLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVXBsb2FkUmVxSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjgzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVXBsb2FkUmVxSW5mby5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBVcGxvYWRSZXFJbmZvIGV4dGVuZHMgVXBsb2FkSW5mbyB7CisJLyoqCisJICogc3BlY2lmeSB0aGUgbm9kZSB0eXBlKE9wdGlvbmFsIGJ5IHRvc2NhKQorCSAqLworCisJcHJpdmF0ZSBTdHJpbmcgY2FwYWJpbGl0eU5hbWU7CisKKwlwcml2YXRlIFN0cmluZyBub2RlOworCisJcHVibGljIFN0cmluZyBnZXRDYXBhYmlsaXR5TmFtZSgpIHsKKwkJcmV0dXJuIGNhcGFiaWxpdHlOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHlOYW1lKFN0cmluZyBjYXBhYmlsaXR5TmFtZSkgeworCQl0aGlzLmNhcGFiaWxpdHlOYW1lID0gY2FwYWJpbGl0eU5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROb2RlKCkgeworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb2RlKFN0cmluZyBub2RlKSB7CisJCXRoaXMubm9kZSA9IG5vZGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVXBsb2FkUmVzb3VyY2VJbmZvLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVXBsb2FkUmVzb3VyY2VJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1YjE1YwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9VcGxvYWRSZXNvdXJjZUluZm8uamF2YQpAQCAtMCwwICsxLDMwNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5VcGxvYWRBcnRpZmFjdEluZm87CisKK3B1YmxpYyBjbGFzcyBVcGxvYWRSZXNvdXJjZUluZm8geworCisJcHVibGljIFVwbG9hZFJlc291cmNlSW5mbyhTdHJpbmcgcGF5bG9hZCwgU3RyaW5nIHBheWxvYWROYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBjYXRlZ29yeSwKKwkJCUxpc3Q8U3RyaW5nPiB0YWdzLCBMaXN0PFVwbG9hZEFydGlmYWN0SW5mbz4gYXJ0aWZhY3RzTGlzdCkgeworCQlzdXBlcigpOworCQl0aGlzLnBheWxvYWREYXRhID0gcGF5bG9hZDsKKwkJdGhpcy5wYXlsb2FkTmFtZSA9IHBheWxvYWROYW1lOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCS8vIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkJdGhpcy50YWdzID0gdGFnczsKKwkJdGhpcy5hcnRpZmFjdExpc3QgPSBhcnRpZmFjdHNMaXN0OworCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgeworCQkJU3RyaW5nW10gYXJyID0gY2F0ZWdvcnkuc3BsaXQoIi8iKTsKKwkJCWlmIChhcnIubGVuZ3RoID49IDIpIHsKKwkJCQljYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdERlZiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCQljYXREZWYuc2V0TmFtZShhcnJbMF0pOworCQkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXQgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCQkJc3ViQ2F0LnNldE5hbWUoYXJyWzFdKTsKKwkJCQljYXREZWYuYWRkU3ViQ2F0ZWdvcnkoc3ViQ2F0KTsKKwkJCQljYXRlZ29yaWVzLmFkZChjYXREZWYpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIFVwbG9hZFJlc291cmNlSW5mbygpIHsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBwYXlsb2FkRGF0YTsKKwlwcml2YXRlIFN0cmluZyBwYXlsb2FkTmFtZTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKwkvLyBwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiB0YWdzOworCXByaXZhdGUgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXM7CisKKwlwcml2YXRlIExpc3Q8VXBsb2FkQXJ0aWZhY3RJbmZvPiBhcnRpZmFjdExpc3Q7CisJcHJpdmF0ZSBTdHJpbmcgY29udGFjdElkLCBuYW1lLCByZXNvdXJjZUljb25QYXRoLCBpY29uLCB2ZW5kb3JOYW1lLCB2ZW5kb3JSZWxlYXNlOworCisJcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VUeXBlID0gIlZGQyI7CisKKwlwdWJsaWMgU3RyaW5nIGdldFBheWxvYWREYXRhKCkgeworCQlyZXR1cm4gcGF5bG9hZERhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGF5bG9hZERhdGEoU3RyaW5nIHBheWxvYWQpIHsKKwkJdGhpcy5wYXlsb2FkRGF0YSA9IHBheWxvYWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYXlsb2FkTmFtZSgpIHsKKwkJcmV0dXJuIHBheWxvYWROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBheWxvYWROYW1lKFN0cmluZyBwYXlsb2FkTmFtZSkgeworCQl0aGlzLnBheWxvYWROYW1lID0gcGF5bG9hZE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJLy8gcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKKwkvLyByZXR1cm4gY2F0ZWdvcnk7CisJLy8gfQorCS8vIHB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCS8vIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkvLyB9CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUYWdzKCkgeworCQlyZXR1cm4gdGFnczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYWdzKExpc3Q8U3RyaW5nPiB0YWdzKSB7CisJCXRoaXMudGFncyA9IHRhZ3M7CisJfQorCisJcHVibGljIExpc3Q8VXBsb2FkQXJ0aWZhY3RJbmZvPiBnZXRBcnRpZmFjdExpc3QoKSB7CisJCXJldHVybiBhcnRpZmFjdExpc3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RMaXN0KExpc3Q8VXBsb2FkQXJ0aWZhY3RJbmZvPiBhcnRpZmFjdHNMaXN0KSB7CisJCXRoaXMuYXJ0aWZhY3RMaXN0ID0gYXJ0aWZhY3RzTGlzdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdExpc3QgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RMaXN0Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29udGFjdElkID09IG51bGwpID8gMCA6IGNvbnRhY3RJZC5oYXNoQ29kZSgpKTsKKwkJLy8gcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGNhdGVnb3J5ID09IG51bGwpID8gMCA6CisJCS8vIGNhdGVnb3J5Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZGVzY3JpcHRpb24gPT0gbnVsbCkgPyAwIDogZGVzY3JpcHRpb24uaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpY29uID09IG51bGwpID8gMCA6IGljb24uaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChwYXlsb2FkRGF0YSA9PSBudWxsKSA/IDAgOiBwYXlsb2FkRGF0YS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHBheWxvYWROYW1lID09IG51bGwpID8gMCA6IHBheWxvYWROYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgocmVzb3VyY2VJY29uUGF0aCA9PSBudWxsKSA/IDAgOiByZXNvdXJjZUljb25QYXRoLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodGFncyA9PSBudWxsKSA/IDAgOiB0YWdzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodmVuZG9yTmFtZSA9PSBudWxsKSA/IDAgOiB2ZW5kb3JOYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodmVuZG9yUmVsZWFzZSA9PSBudWxsKSA/IDAgOiB2ZW5kb3JSZWxlYXNlLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlVcGxvYWRSZXNvdXJjZUluZm8gb3RoZXIgPSAoVXBsb2FkUmVzb3VyY2VJbmZvKSBvYmo7CisJCWlmIChhcnRpZmFjdExpc3QgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmFydGlmYWN0TGlzdCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghYXJ0aWZhY3RMaXN0LmVxdWFscyhvdGhlci5hcnRpZmFjdExpc3QpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoY29udGFjdElkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb250YWN0SWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNvbnRhY3RJZC5lcXVhbHMob3RoZXIuY29udGFjdElkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJLy8gaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKKwkJLy8gaWYgKG90aGVyLmNhdGVnb3J5ICE9IG51bGwpCisJCS8vIHJldHVybiBmYWxzZTsKKwkJLy8gfSBlbHNlIGlmICghY2F0ZWdvcnkuZXF1YWxzKG90aGVyLmNhdGVnb3J5KSkKKwkJLy8gcmV0dXJuIGZhbHNlOworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlc2NyaXB0aW9uICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFkZXNjcmlwdGlvbi5lcXVhbHMob3RoZXIuZGVzY3JpcHRpb24pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaWNvbiA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuaWNvbiAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaWNvbi5lcXVhbHMob3RoZXIuaWNvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwYXlsb2FkRGF0YSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucGF5bG9hZERhdGEgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXBheWxvYWREYXRhLmVxdWFscyhvdGhlci5wYXlsb2FkRGF0YSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwYXlsb2FkTmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucGF5bG9hZE5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXBheWxvYWROYW1lLmVxdWFscyhvdGhlci5wYXlsb2FkTmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChyZXNvdXJjZUljb25QYXRoID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5yZXNvdXJjZUljb25QYXRoICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFyZXNvdXJjZUljb25QYXRoLmVxdWFscyhvdGhlci5yZXNvdXJjZUljb25QYXRoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodGFncyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudGFncyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghdGFncy5lcXVhbHMob3RoZXIudGFncykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh2ZW5kb3JOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci52ZW5kb3JOYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF2ZW5kb3JOYW1lLmVxdWFscyhvdGhlci52ZW5kb3JOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHZlbmRvclJlbGVhc2UgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnZlbmRvclJlbGVhc2UgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXZlbmRvclJlbGVhc2UuZXF1YWxzKG90aGVyLnZlbmRvclJlbGVhc2UpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRhY3RJZCgpIHsKKwkJcmV0dXJuIGNvbnRhY3RJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb250YWN0SWQoU3RyaW5nIHVzZXJJZCkgeworCQl0aGlzLmNvbnRhY3RJZCA9IHVzZXJJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHJlc291cmNlTmFtZSkgeworCQl0aGlzLm5hbWUgPSByZXNvdXJjZU5hbWU7CisJfQorCisJLy8gSWNvbiB3aGVuIHVzaW5nIFVJIGltcG9ydCBvdGhlcndpc2UgcmVzb3VyY2VJY29uUGF0aAorCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VJY29uUGF0aCgpIHsKKwkJcmV0dXJuIChyZXNvdXJjZUljb25QYXRoICE9IG51bGwpID8gcmVzb3VyY2VJY29uUGF0aCA6IGljb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJY29uUGF0aChTdHJpbmcgcmVzb3VyY2VJY29uUGF0aCkgeworCQl0aGlzLnJlc291cmNlSWNvblBhdGggPSByZXNvdXJjZUljb25QYXRoOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKKwkJcmV0dXJuIHZlbmRvck5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVuZG9yTmFtZShTdHJpbmcgdmVuZG9yTmFtZSkgeworCQl0aGlzLnZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yUmVsZWFzZSgpIHsKKwkJcmV0dXJuIHZlbmRvclJlbGVhc2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVuZG9yUmVsZWFzZShTdHJpbmcgdmVuZG9yUmVsZWFzZSkgeworCQl0aGlzLnZlbmRvclJlbGVhc2UgPSB2ZW5kb3JSZWxlYXNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEljb24oU3RyaW5nIGljb24pIHsKKwkJdGhpcy5pY29uID0gaWNvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIHJlc291cmNlVHlwZSkgeworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGdldENhdGVnb3JpZXMoKSB7CisJCXJldHVybiBjYXRlZ29yaWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGVnb3JpZXMoTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMpIHsKKwkJdGhpcy5jYXRlZ29yaWVzID0gY2F0ZWdvcmllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRTdWJDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBzdWJDYXRlZ29yeSkgeworCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCB8fCBzdWJDYXRlZ29yeSAhPSBudWxsKSB7CisJCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7CisJCQkJY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJfQorCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHNlbGVjdGVkQ2F0ZWdvcnkgPSBudWxsOworCQkJZm9yIChDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWYgOiBjYXRlZ29yaWVzKSB7CisJCQkJaWYgKGNhdGVnb3J5RGVmLmdldE5hbWUoKS5lcXVhbHMoY2F0ZWdvcnkpKSB7CisJCQkJCXNlbGVjdGVkQ2F0ZWdvcnkgPSBjYXRlZ29yeURlZjsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2VsZWN0ZWRDYXRlZ29yeSA9PSBudWxsKSB7CisJCQkJc2VsZWN0ZWRDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCQlzZWxlY3RlZENhdGVnb3J5LnNldE5hbWUoY2F0ZWdvcnkpOworCQkJCWNhdGVnb3JpZXMuYWRkKHNlbGVjdGVkQ2F0ZWdvcnkpOworCQkJfQorCQkJTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IHN1YmNhdGVnb3JpZXMgPSBzZWxlY3RlZENhdGVnb3J5LmdldFN1YmNhdGVnb3JpZXMoKTsKKwkJCWlmIChzdWJjYXRlZ29yaWVzID09IG51bGwpIHsKKwkJCQlzdWJjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJc2VsZWN0ZWRDYXRlZ29yeS5zZXRTdWJjYXRlZ29yaWVzKHN1YmNhdGVnb3JpZXMpOworCQkJfQorCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHNlbGVjdGVkU3ViY2F0ZWdvcnkgPSBudWxsOworCQkJZm9yIChTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0ZWdvcnkgOiBzdWJjYXRlZ29yaWVzKSB7CisJCQkJaWYgKHN1YmNhdGVnb3J5LmdldE5hbWUoKS5lcXVhbHMoc3ViQ2F0ZWdvcnkpKSB7CisJCQkJCXNlbGVjdGVkU3ViY2F0ZWdvcnkgPSBzdWJjYXRlZ29yeTsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2VsZWN0ZWRTdWJjYXRlZ29yeSA9PSBudWxsKSB7CisJCQkJc2VsZWN0ZWRTdWJjYXRlZ29yeSA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJCQlzZWxlY3RlZFN1YmNhdGVnb3J5LnNldE5hbWUoc3ViQ2F0ZWdvcnkpOworCQkJCXN1YmNhdGVnb3JpZXMuYWRkKHNlbGVjdGVkU3ViY2F0ZWdvcnkpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvVXNlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjljMzViCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL1VzZXIuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgb3JnLmpvZGEudGltZS5EYXRlVGltZTsKK2ltcG9ydCBvcmcuam9kYS50aW1lLkRhdGVUaW1lWm9uZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuVXNlclN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CisKK3B1YmxpYyBjbGFzcyBVc2VyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9ERUxFVEVfSEVBREVSX0ZMQUcgPSAiRk9SQ0VfREVMRVRFIjsKKworCXByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKKworCXByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgdXNlcklkOworCisJcHJpdmF0ZSBTdHJpbmcgZW1haWw7CisKKwlwcml2YXRlIFN0cmluZyByb2xlOworCisJcHJpdmF0ZSBMb25nIGxhc3RMb2dpblRpbWU7CisKKwlwcml2YXRlIFVzZXJTdGF0dXNFbnVtIHN0YXR1cyA9IFVzZXJTdGF0dXNFbnVtLkFDVElWRTsKKworCXB1YmxpYyBVc2VyKCkgeworCX0KKworCXB1YmxpYyBVc2VyKFVzZXJEYXRhIHVzZXJEYXRlKSB7CisJCXRoaXModXNlckRhdGUuZ2V0Rmlyc3ROYW1lKCksIHVzZXJEYXRlLmdldExhc3ROYW1lKCksIHVzZXJEYXRlLmdldFVzZXJJZCgpLCB1c2VyRGF0ZS5nZXRFbWFpbCgpLAorCQkJCXVzZXJEYXRlLmdldFJvbGUoKSwgdXNlckRhdGUuZ2V0TGFzdExvZ2luVGltZSgpKTsKKwl9CisKKwlwdWJsaWMgVXNlcihTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyB1c2VySWQsIFN0cmluZyBlbWFpbEFkZHJlc3MsIFN0cmluZyByb2xlLAorCQkJTG9uZyBsYXN0TG9naW5UaW1lKSB7CisJCXRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOworCQl0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisJCXRoaXMudXNlcklkID0gdXNlcklkOworCQl0aGlzLmVtYWlsID0gZW1haWxBZGRyZXNzOworCQl0aGlzLnJvbGUgPSByb2xlOworCQl0aGlzLmxhc3RMb2dpblRpbWUgPSBsYXN0TG9naW5UaW1lOworCisJfQorCisJcHVibGljIHZvaWQgY29weURhdGEoVXNlciBvdGhlcikgeworCQl0aGlzLmZpcnN0TmFtZSA9IG90aGVyLmdldEZpcnN0TmFtZSgpOworCQl0aGlzLmxhc3ROYW1lID0gb3RoZXIuZ2V0TGFzdE5hbWUoKTsKKwkJdGhpcy51c2VySWQgPSBvdGhlci5nZXRVc2VySWQoKTsKKwkJdGhpcy5lbWFpbCA9IG90aGVyLmdldEVtYWlsKCk7CisJCXRoaXMucm9sZSA9IG90aGVyLmdldFJvbGUoKTsKKwkJdGhpcy5sYXN0TG9naW5UaW1lID0gb3RoZXIuZ2V0TGFzdExvZ2luVGltZSgpOworCisJfQorCisJcHVibGljIFVzZXIoVXNlciBhVXNlcikgeworCQl0aGlzKGFVc2VyLmdldEZpcnN0TmFtZSgpLCBhVXNlci5nZXRMYXN0TmFtZSgpLCBhVXNlci5nZXRVc2VySWQoKSwgYVVzZXIuZ2V0RW1haWwoKSwgYVVzZXIuZ2V0Um9sZSgpLAorCQkJCWFVc2VyLmdldExhc3RMb2dpblRpbWUoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKSB7CisJCXJldHVybiBmaXJzdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHsKKwkJdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpIHsKKwkJcmV0dXJuIGxhc3ROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgeworCQl0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVc2VySWQoKSB7CisJCXJldHVybiB1c2VySWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyB1c2VySWQpIHsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKwkJcmV0dXJuIGVtYWlsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkgeworCQl0aGlzLmVtYWlsID0gZW1haWw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSb2xlKCkgeworCQlyZXR1cm4gcm9sZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKSB7CisJCXRoaXMucm9sZSA9IHJvbGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Rmlyc3ROYW1lKCkgKyAiICIgKyB0aGlzLmdldExhc3ROYW1lKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdExvZ2luVGltZSgpIHsKKwkJRGF0ZVRpbWUgbm93ID0gbmV3IERhdGVUaW1lKERhdGVUaW1lWm9uZS5VVEMpOworCQl0aGlzLmxhc3RMb2dpblRpbWUgPSBub3cuZ2V0TWlsbGlzKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdExvZ2luVGltZShMb25nIHRpbWUpIHsKKwkJdGhpcy5sYXN0TG9naW5UaW1lID0gdGltZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRMYXN0TG9naW5UaW1lKCkgeworCQlyZXR1cm4gdGhpcy5sYXN0TG9naW5UaW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHVzZXJJZCA9PSBudWxsKSA/IDAgOiB1c2VySWQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChlbWFpbCA9PSBudWxsKSA/IDAgOiBlbWFpbC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGZpcnN0TmFtZSA9PSBudWxsKSA/IDAgOiBmaXJzdE5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChsYXN0TmFtZSA9PSBudWxsKSA/IDAgOiBsYXN0TmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHJvbGUgPT0gbnVsbCkgPyAwIDogcm9sZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGxhc3RMb2dpblRpbWUgPT0gbnVsbCkgPyAwIDogbGFzdExvZ2luVGltZS5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJVXNlciBvdGhlciA9IChVc2VyKSBvYmo7CisJCWlmICh1c2VySWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVzZXJJZCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghdXNlcklkLmVxdWFscyhvdGhlci51c2VySWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZW1haWwgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmVtYWlsICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFlbWFpbC5lcXVhbHMob3RoZXIuZW1haWwpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZmlyc3ROYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5maXJzdE5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWZpcnN0TmFtZS5lcXVhbHMob3RoZXIuZmlyc3ROYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGxhc3ROYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5sYXN0TmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbGFzdE5hbWUuZXF1YWxzKG90aGVyLmxhc3ROYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHJvbGUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnJvbGUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXJvbGUuZXF1YWxzKG90aGVyLnJvbGUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobGFzdExvZ2luVGltZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubGFzdExvZ2luVGltZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbGFzdExvZ2luVGltZS5lcXVhbHMob3RoZXIubGFzdExvZ2luVGltZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBVc2VyU3RhdHVzRW51bSBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtIHN0YXR1cykgeworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlVzZXIgW2ZpcnN0TmFtZT0iICsgZmlyc3ROYW1lICsgIiwgbGFzdE5hbWU9IiArIGxhc3ROYW1lICsgIiwgdXNlcklkPSIgKyB1c2VySWQgKyAiLCBlbWFpbD0iICsgZW1haWwKKwkJCQkrICIsIHJvbGU9IiArIHJvbGUgKyAiLCBsYXN0IGxvZ2luIHRpbWU9IiArIGxhc3RMb2dpblRpbWUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvQXBwbGljYXRpb25DYWNoZS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL0FwcGxpY2F0aW9uQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhhMWIwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL0FwcGxpY2F0aW9uQ2FjaGUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25DYWNoZTxUPiB7CisKKwlwdWJsaWMgYWJzdHJhY3QgRWl0aGVyPE1hcDxTdHJpbmcsIFQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsKCk7CisKKwlwdWJsaWMgYWJzdHJhY3QgRWl0aGVyPFQsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXQoU3RyaW5nIHVuaXF1ZUlkKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL0FwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL0FwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjY0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlLmphdmEKQEAgLTAsMCArMSwzMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuY29uY3VycmVudC5CYXNpY1RocmVhZEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyLkVycm9yU2V2ZXJpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uQXBwbGljYXRpb25MMUNhY2hlQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLkFwcGxpY2F0aW9uTDFDYWNoZUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRGF0YVR5cGVEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJhcHBsaWNhdGlvbi1kYXRhdHlwZS1jYWNoZSIpCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIGltcGxlbWVudHMgQXBwbGljYXRpb25DYWNoZTxEYXRhVHlwZURlZmluaXRpb24+LCBSdW5uYWJsZSB7CisKKwlwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgcndsID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKwlwcml2YXRlIGZpbmFsIExvY2sgciA9IHJ3bC5yZWFkTG9jaygpOworCXByaXZhdGUgZmluYWwgTG9jayB3ID0gcndsLndyaXRlTG9jaygpOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGEgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWRQb2xsaW5nU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKDEsCisJCQluZXcgQmFzaWNUaHJlYWRGYWN0b3J5LkJ1aWxkZXIoKS5uYW1pbmdQYXR0ZXJuKCJBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGVUaHJlYWQtJWQiKS5idWlsZCgpKTsKKwlTY2hlZHVsZWRGdXR1cmU8Pz4gc2NoZWR1bGVkRnV0dXJlID0gbnVsbDsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgaW50IGZpcnN0UnVuRGVsYXlJblNlYyA9IDMwOworCXByaXZhdGUgaW50IHBvbGxpbmdJbnRlcnZhbEluU2VjID0gNjA7CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCisJCUFwcGxpY2F0aW9uTDFDYWNoZUNvbmZpZyBhcHBsaWNhdGlvbkwxQ2FjaGVDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpCisJCQkJLmdldENvbmZpZ3VyYXRpb24oKS5nZXRBcHBsaWNhdGlvbkwxQ2FjaGUoKTsKKwkJaWYgKGFwcGxpY2F0aW9uTDFDYWNoZUNvbmZpZyAhPSBudWxsKSB7CisJCQlpZiAoYXBwbGljYXRpb25MMUNhY2hlQ29uZmlnLmdldERhdGF0eXBlcygpICE9IG51bGwpIHsKKwkJCQlBcHBsaWNhdGlvbkwxQ2FjaGVJbmZvIGRhdGF0eXBlc0luZm8gPSBhcHBsaWNhdGlvbkwxQ2FjaGVDb25maWcuZ2V0RGF0YXR5cGVzKCk7CisJCQkJaWYgKGRhdGF0eXBlc0luZm8uZ2V0RW5hYmxlZCgpKSB7CisJCQkJCUludGVnZXIgaW50ZXJ2YWxJblNlYyA9IGRhdGF0eXBlc0luZm8uZ2V0UG9sbEludGVydmFsSW5TZWMoKTsKKwkJCQkJaWYgKGludGVydmFsSW5TZWMgIT0gbnVsbCkgeworCQkJCQkJcG9sbGluZ0ludGVydmFsSW5TZWMgPSBpbnRlcnZhbEluU2VjOworCQkJCQl9CisJCQkJCUludGVnZXIgZmlyc3RSdW5EZWxheSA9IGRhdGF0eXBlc0luZm8uZ2V0Rmlyc3RSdW5EZWxheSgpOworCQkJCQlpZiAoZmlyc3RSdW5EZWxheSAhPSBudWxsKSB7CisJCQkJCQlmaXJzdFJ1bkRlbGF5SW5TZWMgPSBmaXJzdFJ1bkRlbGF5OworCQkJCQl9CisJCQkJCWxvZy50cmFjZSgiQXBwbGljYXRpb25EYXRhVHlwZXNDYWNoZSBwb2xsaW5nIGludGVydmFsIGlzICIgKyBwb2xsaW5nSW50ZXJ2YWxJblNlYyArICIgc2Vjb25kcy4iKTsKKwkJCQkJaWYgKHNjaGVkdWxlZFBvbGxpbmdTZXJ2aWNlICE9IG51bGwpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiU3RhcnQgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIHBvbGxpbmcgdGFzay4gcG9sbGluZyBpbnRlcnZhbCB7fSBzZWNvbmRzIiwKKwkJCQkJCQkJcG9sbGluZ0ludGVydmFsSW5TZWMpOworCQkJCQkJc2NoZWR1bGVkRnV0dXJlID0gc2NoZWR1bGVkUG9sbGluZ1NlcnZpY2Uuc2NoZWR1bGVBdEZpeGVkUmF0ZSh0aGlzLCBmaXJzdFJ1bkRlbGF5SW5TZWMsCisJCQkJCQkJCXBvbGxpbmdJbnRlcnZhbEluU2VjLCBUaW1lVW5pdC5TRUNPTkRTKTsKKwkJCQkJfQorCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIkFwcGxpY2F0aW9uRGF0YVR5cGVzQ2FjaGUiLCAiQ2FjaGUgaXMgZGlzYWJsZWQiLAorCQkJCQkJRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiQXBwbGljYXRpb25EYXRhVHlwZXNDYWNoZSIsICJDYWNoZSBpcyBkaXNhYmxlZCIsCisJCQkJCUVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCX0KKworCX0KKworCUBQcmVEZXN0cm95CisJdm9pZCBkZXN0cm95KCkgeworCisJCWlmIChzY2hlZHVsZWRGdXR1cmUgIT0gbnVsbCkgeworCQkJYm9vbGVhbiByZXN1bHQgPSBzY2hlZHVsZWRGdXR1cmUuY2FuY2VsKHRydWUpOworCQkJbG9nLmRlYnVnKCJTdG9wIHBvbGxpbmcgdGFzay4gcmVzdWx0ID0ge30iLCByZXN1bHQpOworCisJCQlzY2hlZHVsZWRGdXR1cmUgPSBudWxsOworCQl9CisJCXNodXRkb3duRXhlY3V0b3IoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2h1dGRvd25FeGVjdXRvcigpIHsKKwkJaWYgKHNjaGVkdWxlZFBvbGxpbmdTZXJ2aWNlID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJc2NoZWR1bGVkUG9sbGluZ1NlcnZpY2Uuc2h1dGRvd24oKTsgLy8gRGlzYWJsZSBuZXcgdGFza3MgZnJvbSBiZWluZworCQkJCQkJCQkJCQkvLyBzdWJtaXR0ZWQKKwkJdHJ5IHsKKwkJCS8vIFdhaXQgYSB3aGlsZSBmb3IgZXhpc3RpbmcgdGFza3MgdG8gdGVybWluYXRlCisJCQlpZiAoIXNjaGVkdWxlZFBvbGxpbmdTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24oNjAsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisJCQkJc2NoZWR1bGVkUG9sbGluZ1NlcnZpY2Uuc2h1dGRvd25Ob3coKTsgLy8gQ2FuY2VsIGN1cnJlbnRseQorCQkJCQkJCQkJCQkJCQkvLyBleGVjdXRpbmcgdGFza3MKKwkJCQkvLyBXYWl0IGEgd2hpbGUgZm9yIHRhc2tzIHRvIHJlc3BvbmQgdG8gYmVpbmcgY2FuY2VsbGVkCisJCQkJaWYgKCFzY2hlZHVsZWRQb2xsaW5nU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKDYwLCBUaW1lVW5pdC5TRUNPTkRTKSkKKwkJCQkJbG9nLmRlYnVnKCJQb29sIGRpZCBub3QgdGVybWluYXRlIik7CisJCQl9CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisJCQkvLyAoUmUtKUNhbmNlbCBpZiBjdXJyZW50IHRocmVhZCBhbHNvIGludGVycnVwdGVkCisJCQlzY2hlZHVsZWRQb2xsaW5nU2VydmljZS5zaHV0ZG93bk5vdygpOworCQkJLy8gUHJlc2VydmUgaW50ZXJydXB0IHN0YXR1cworCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxEYXRhVHlwZXNGcm9tR3JhcGgoKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBwcm9wZXJ0eU9wZXJhdGlvbgorCQkJCS5nZXRBbGxEYXRhVHlwZXMoKTsKKworCQlyZXR1cm4gYWxsRGF0YVR5cGVzOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsKCkgeworCisJCXRyeSB7CisKKwkJCXIubG9jaygpOworCQkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmlzRW1wdHkoKSkgeworCQkJCXJldHVybiBnZXRBbGxEYXRhVHlwZXNGcm9tR3JhcGgoKTsKKwkJCX0KKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGRhdGEpOworCisJCX0gZmluYWxseSB7CisJCQlyLnVubG9jaygpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXQoU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJdHJ5IHsKKwkJCXIubG9jaygpOworCisJCQlpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEuaXNFbXB0eSgpKSB7CisJCQkJRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRhdGFUeXBlQnlVaWQgPSBwcm9wZXJ0eU9wZXJhdGlvbgorCQkJCQkJLmdldERhdGFUeXBlQnlVaWQodW5pcXVlSWQpOworCQkJCXJldHVybiBkYXRhVHlwZUJ5VWlkOworCQkJfSBlbHNlIHsKKwkJCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YS52YWx1ZXMoKS5zdHJlYW0oKQorCQkJCQkJLmZpbHRlcihwIC0+IHAuZ2V0VW5pcXVlSWQoKS5lcXVhbHModW5pcXVlSWQpKS5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CisJCQkJaWYgKGRhdGFUeXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQkJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkYXRhVHlwZUJ5VWlkID0gcHJvcGVydHlPcGVyYXRpb24KKwkJCQkJCQkuZ2V0RGF0YVR5cGVCeVVpZCh1bmlxdWVJZCk7CisJCQkJCXJldHVybiBkYXRhVHlwZUJ5VWlkOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdChkYXRhVHlwZURlZmluaXRpb24pOworCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXIudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWxvZy50cmFjZSgicnVuKCkgbWV0aG9kLiBwb2xsaW5nIGRiIHRvIGZldGNoIGRhdGEgdHlwZXMiKTsKKworCQl0cnkgeworCisJCQlMb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb2cudHJhY2UoIlN0YXJ0IGZldGNoaW5nIGFsbCBkYXRhIHR5cGVzIGZyb20gZGIiKTsKKwkJCUVpdGhlcjxMaXN0PERhdGFUeXBlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZU5vZGVzID0gcHJvcGVydHlPcGVyYXRpb24uZ2V0QWxsRGF0YVR5cGVOb2RlcygpOworCQkJTG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCWxvZy50cmFjZSgiRmluaXNoIGZldGNoaW5nIGFsbCBkYXRhIHR5cGVzIGZyb20gZGIuIFRvb2sgIiArIChlbmQgLSBzdGFydCkgKyAiIE1pbGxpc2Vjb25kcyIpOworCQkJaWYgKGFsbERhdGFUeXBlTm9kZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsRGF0YVR5cGVOb2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlsb2cuZGVidWcoIkFwcGxpY2F0aW9uRGF0YVR5cGVzQ2FjaGUgLSBGYWlsZWQgdG8gZmV0Y2ggYWxsIGRhdGEgdHlwZXMgbm9kZXMiKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsQ29ubmVjdGlvbkVycm9yKCJGZXRjaERhdGFUeXBlcyIsCisJCQkJCQkJIkZhaWxlZCB0byBmZXRjaCBkYXRhIHR5cGVzIGZyb20gZ3JhcGgoY2FjaGUpIiwgRXJyb3JTZXZlcml0eS5JTkZPKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCisJCQkJTGlzdDxEYXRhVHlwZURhdGE+IGxpc3QgPSBhbGxEYXRhVHlwZU5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChsaXN0ICE9IG51bGwpIHsKKworCQkJCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPExvbmcsIExvbmc+PiBkYXRhVHlwZU5hbWVUb01vZGlmaWNhdGlvblRpbWUgPSBsaXN0LnN0cmVhbSgpCisJCQkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwKKwkJCQkJCQkJCXAgLT4gbmV3IEltbXV0YWJsZVBhaXI8TG9uZywgTG9uZz4ocC5nZXREYXRhVHlwZURhdGFEZWZpbml0aW9uKCkuZ2V0Q3JlYXRpb25UaW1lKCksCisJCQkJCQkJCQkJCXAuZ2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpLmdldE1vZGlmaWNhdGlvblRpbWUoKSkpKTsKKworCQkJCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPExvbmcsIExvbmc+PiBjdXJyZW50RGF0YVR5cGVUb01vZGlmaWNhdGlvblRpbWUgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQkJCXRyeSB7CisJCQkJCQlyLmxvY2soKTsKKwkJCQkJCWlmIChkYXRhICE9IG51bGwpIHsKKwkJCQkJCQljdXJyZW50RGF0YVR5cGVUb01vZGlmaWNhdGlvblRpbWUgPSBkYXRhLnZhbHVlcygpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcCgKKwkJCQkJCQkJCXAgLT4gcC5nZXROYW1lKCksCisJCQkJCQkJCQlwIC0+IG5ldyBJbW11dGFibGVQYWlyPExvbmcsIExvbmc+KHAuZ2V0Q3JlYXRpb25UaW1lKCksIHAuZ2V0TW9kaWZpY2F0aW9uVGltZSgpKSkpOworCisJCQkJCQl9CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlyLnVubG9jaygpOworCQkJCQl9CisKKwkJCQkJYm9vbGVhbiBpc0NoYW5nZWQgPSBjb21wYXJlRGF0YVR5cGVzKGRhdGFUeXBlTmFtZVRvTW9kaWZpY2F0aW9uVGltZSwKKwkJCQkJCQljdXJyZW50RGF0YVR5cGVUb01vZGlmaWNhdGlvblRpbWUpOworCQkJCQlpZiAoaXNDaGFuZ2VkKSB7CisJCQkJCQlyZXBsYWNlQWxsRGF0YSgpOworCQkJCQl9CisKKwkJCQl9CisJCQl9CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygidW5leHBlY3RlZCBlcnJvciBvY2N1cmVkIiwgZSk7CisKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbFVuZXhwZWN0ZWRFcnJvcigiQXBwbGljYXRpb25EYXRhVHlwZXNDYWNoZSIsCisJCQkJCSJGYWlsZWQgdG8gcnVuIHJlZnJlc2ggZGF0YSB0eXBlcyBqb2IiLCBFcnJvclNldmVyaXR5LklORk8pOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlwcm9wZXJ0eU9wZXJhdGlvbi5nZXRUaXRhbkdlbmVyaWNEYW8oKS5jb21taXQoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJbG9nLnRyYWNlKCJGYWlsZWQgdG8gY29tbWl0IEFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZSIsIGUpOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29tcGFyZURhdGFUeXBlcyhNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPExvbmcsIExvbmc+PiBkYXRhVHlwZU5hbWVUb01vZGlmaWNhdGlvblRpbWUsCisJCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPExvbmcsIExvbmc+PiBjdXJyZW50RGF0YVR5cGVUb01vZGlmaWNhdGlvblRpbWUpIHsKKwkJaWYgKGRhdGFUeXBlTmFtZVRvTW9kaWZpY2F0aW9uVGltZS5zaXplKCkgIT0gY3VycmVudERhdGFUeXBlVG9Nb2RpZmljYXRpb25UaW1lLnNpemUoKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSB7CisKKwkJCVNldDxTdHJpbmc+IGN1cnJlbnRrZXlTZXQgPSBjdXJyZW50RGF0YVR5cGVUb01vZGlmaWNhdGlvblRpbWUua2V5U2V0KCk7CisJCQlTZXQ8U3RyaW5nPiBrZXlTZXQgPSBkYXRhVHlwZU5hbWVUb01vZGlmaWNhdGlvblRpbWUua2V5U2V0KCk7CisKKwkJCWlmIChjdXJyZW50a2V5U2V0LmNvbnRhaW5zQWxsKGtleVNldCkpIHsKKworCQkJCWZvciAoRW50cnk8U3RyaW5nLCBJbW11dGFibGVQYWlyPExvbmcsIExvbmc+PiBlbnRyeSA6IGRhdGFUeXBlTmFtZVRvTW9kaWZpY2F0aW9uVGltZS5lbnRyeVNldCgpKSB7CisJCQkJCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQkJSW1tdXRhYmxlUGFpcjxMb25nLCBMb25nPiBjcmVhdGlvbkFuZE1vZGlmaWNhdGlvblRpbWVzID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJbG9uZyBjcmVhdGlvblRpbWUgPSBjcmVhdGlvbkFuZE1vZGlmaWNhdGlvblRpbWVzLmdldExlZnQoKSA9PSBudWxsID8gMAorCQkJCQkJCTogY3JlYXRpb25BbmRNb2RpZmljYXRpb25UaW1lcy5nZXRMZWZ0KCkubG9uZ1ZhbHVlKCk7CisJCQkJCWxvbmcgbW9kaWZpY2F0aW9uVGltZSA9IGNyZWF0aW9uQW5kTW9kaWZpY2F0aW9uVGltZXMuZ2V0UmlnaHQoKSA9PSBudWxsID8gMAorCQkJCQkJCTogY3JlYXRpb25BbmRNb2RpZmljYXRpb25UaW1lcy5nZXRSaWdodCgpLmxvbmdWYWx1ZSgpOworCisJCQkJCUltbXV0YWJsZVBhaXI8TG9uZywgTG9uZz4gY3VycmVudEVudHJ5ID0gY3VycmVudERhdGFUeXBlVG9Nb2RpZmljYXRpb25UaW1lLmdldChkYXRhVHlwZU5hbWUpOworCQkJCQlsb25nIGN1cnJlbnRDcmVhdGlvblRpbWUgPSBjdXJyZW50RW50cnkuZ2V0TGVmdCgpID09IG51bGwgPyAwIDogY3VycmVudEVudHJ5LmdldExlZnQoKS5sb25nVmFsdWUoKTsKKwkJCQkJbG9uZyBjdXJyZW50TW9kaWZpY2F0aW9uVGltZSA9IGN1cnJlbnRFbnRyeS5nZXRSaWdodCgpID09IG51bGwgPyAwCisJCQkJCQkJOiBjdXJyZW50RW50cnkuZ2V0UmlnaHQoKS5sb25nVmFsdWUoKTsKKworCQkJCQlpZiAoY3JlYXRpb25UaW1lID4gY3VycmVudENyZWF0aW9uVGltZSB8fCBtb2RpZmljYXRpb25UaW1lID4gY3VycmVudE1vZGlmaWNhdGlvblRpbWUpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRGF0YXR5cGUge30gd2FzIHVwZGF0ZWQuIENyZWF0aW9uIFRpbWUgIHt9IHZzIHt9LiBNb2RpZmljYXRpb24gVGltZSB7fSB2cyB7fSIsCisJCQkJCQkJCWRhdGFUeXBlTmFtZSwgY3VycmVudENyZWF0aW9uVGltZSwgY3JlYXRpb25UaW1lLCBjdXJyZW50TW9kaWZpY2F0aW9uVGltZSwKKwkJCQkJCQkJbW9kaWZpY2F0aW9uVGltZSk7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVwbGFjZUFsbERhdGEoKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBwcm9wZXJ0eU9wZXJhdGlvbgorCQkJCS5nZXRBbGxEYXRhVHlwZXMoKTsKKworCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGFsbCBkYXRhIHR5cGVzIGZyb20gZGIuIFN0YXR1cyBpcyB7fSIsIHN0YXR1cyk7CisJCX0gZWxzZSB7CisKKwkJCXRyeSB7CisJCQkJdy5sb2NrKCk7CisKKwkJCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IG5ld0RhdGFUeXBlcyA9IGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlkYXRhID0gbmV3RGF0YVR5cGVzOworCisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJSZXBsYWNlRGF0YVR5cGVzQ2FjaGUiLAorCQkJCQkJIlN1Y2NlZWQgdG8gcmVwbGFjZSB0aGUgZGF0YSB0eXBlcyBjYWNoZSIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisKKwkJCX0gZmluYWxseSB7CisJCQkJdy51bmxvY2soKTsKKwkJCX0KKworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS9Db21wb25lbnRDYWNoZS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL0NvbXBvbmVudENhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMmFkYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS9Db21wb25lbnRDYWNoZS5qYXZhCkBAIC0wLDAgKzEsOTk3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVRyaXBsZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbi5BcHBsaWNhdGlvbkwxQ2FjaGVDYXRhbG9nSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbi5BcHBsaWNhdGlvbkwyQ2FjaGVDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5DYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5Db21wb25lbnRDYXNzYW5kcmFEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvZHVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLio7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50Q2FjaGVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlNlcmlhbGl6YXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5aaXBVdGlsOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQoImNvbXBvbmVudC1jYWNoZSIpCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50Q2FjaGUgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudENhY2hlLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCUNvbXBvbmVudENhc3NhbmRyYURhbyBjb21wb25lbnRDYXNzYW5kcmFEYW87CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCVJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlTZXJ2aWNlT3BlcmF0aW9uIHNlcnZpY2VPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCVByb2R1Y3RPcGVyYXRpb24gcHJvZHVjdE9wZXJhdGlvbjsKKworCXByaXZhdGUgTWFwPENvbXBvbmVudFR5cGVFbnVtLCBNYXA8U3RyaW5nLCBDb21wb25lbnQ+PiBjYXRhbG9nSW5NZW1vcnlDYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgcndDYXRhbG9nTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisJcHJpdmF0ZSBmaW5hbCBMb2NrIHJDYXRhbG9nTG9jayA9IHJ3Q2F0YWxvZ0xvY2sucmVhZExvY2soKTsKKwlwcml2YXRlIGZpbmFsIExvY2sgd0NhdGFsb2dMb2NrID0gcndDYXRhbG9nTG9jay53cml0ZUxvY2soKTsKKworCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisJaW50IGNhdGFsb2dJbk1lbW9yeVNpemVQZXJSZXNvdXJjZSA9IDMwMDsKKwlpbnQgY2F0YWxvZ0luTWVtb3J5U2l6ZVBlclNlcnZpY2UgPSAyMDA7CisJaW50IGNhdGFsb2dJbk1lbW9yeVNpemVQZXJQcm9kdWN0ID0gMTAwOworCWJvb2xlYW4gY2F0YWxvZ0luTWVtb3J5RW5hYmxlZCA9IHRydWU7CisJTWFwPENvbXBvbmVudFR5cGVFbnVtLCBJbnRlZ2VyPiBsaW1pdE1lbW9yeUNhdGFsb2dTaXplUGVyVHlwZSA9IG5ldyBIYXNoTWFwPD4oKTsKKworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKworCQlDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKTsKKwkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgeworCQkJQXBwbGljYXRpb25MMkNhY2hlQ29uZmlnIGFwcGxpY2F0aW9uTDJDYWNoZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXBwbGljYXRpb25MMkNhY2hlKCk7CisJCQlpZiAoYXBwbGljYXRpb25MMkNhY2hlICE9IG51bGwpIHsKKwkJCQlib29sZWFuIGlzRW5hYmxlZCA9IGFwcGxpY2F0aW9uTDJDYWNoZS5pc0VuYWJsZWQoKTsKKwkJCQl0aGlzLmVuYWJsZWQgPSBpc0VuYWJsZWQ7CisKKwkJCQlBcHBsaWNhdGlvbkwxQ2FjaGVDYXRhbG9nSW5mbyBjYXRhbG9nID0gYXBwbGljYXRpb25MMkNhY2hlLmdldENhdGFsb2dMMUNhY2hlKCk7CisJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgeworCQkJCQljYXRhbG9nSW5NZW1vcnlFbmFibGVkID0gY2F0YWxvZy5nZXRFbmFibGVkKCk7CisJCQkJCWNhdGFsb2dJbk1lbW9yeVNpemVQZXJSZXNvdXJjZSA9IGNhdGFsb2cuZ2V0UmVzb3VyY2VzU2l6ZUluQ2FjaGUoKTsKKwkJCQkJY2F0YWxvZ0luTWVtb3J5U2l6ZVBlclNlcnZpY2UgPSBjYXRhbG9nLmdldFNlcnZpY2VzU2l6ZUluQ2FjaGUoKTsKKwkJCQkJY2F0YWxvZ0luTWVtb3J5U2l6ZVBlclByb2R1Y3QgPSBjYXRhbG9nLmdldFByb2R1Y3RzU2l6ZUluQ2FjaGUoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlDb21wb25lbnRUeXBlRW51bVtdIHR5cGVzRm9yQ2FjaGUgPSB7IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFLAorCQkJCUNvbXBvbmVudFR5cGVFbnVtLlBST0RVQ1QgfTsKKwkJZm9yIChDb21wb25lbnRUeXBlRW51bSB0eXBlRW51bSA6IHR5cGVzRm9yQ2FjaGUpIHsKKwkJCU1hcDxTdHJpbmcsIENvbXBvbmVudD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCQkJY2F0YWxvZ0luTWVtb3J5Q2FjaGUucHV0KHR5cGVFbnVtLCBtYXApOworCQl9CisKKwkJbGltaXRNZW1vcnlDYXRhbG9nU2l6ZVBlclR5cGUucHV0KENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFLCBjYXRhbG9nSW5NZW1vcnlTaXplUGVyUmVzb3VyY2UpOworCQlsaW1pdE1lbW9yeUNhdGFsb2dTaXplUGVyVHlwZS5wdXQoQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSwgY2F0YWxvZ0luTWVtb3J5U2l6ZVBlclNlcnZpY2UpOworCQlsaW1pdE1lbW9yeUNhdGFsb2dTaXplUGVyVHlwZS5wdXQoQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCwgY2F0YWxvZ0luTWVtb3J5U2l6ZVBlclByb2R1Y3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVuYWJsZWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKwkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudCwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudFVpZCwgTG9uZyBsYXN0TW9kaWZpY2F0aW9uVGltZSwKKwkJCUZ1bmN0aW9uPENvbXBvbmVudCwgQ29tcG9uZW50PiBmaWx0ZXJGaWVsZHNGdW5jKSB7CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBDb21wb25lbnRDYWNoZURhdGE+LCBBY3Rpb25TdGF0dXM+IGNvbXBvbmVudEZyb21DYWNoZSA9IGdldENvbXBvbmVudEZyb21DYWNoZSgKKwkJCQljb21wb25lbnRVaWQsIGxhc3RNb2RpZmljYXRpb25UaW1lLCBmaWx0ZXJGaWVsZHNGdW5jKTsKKworCQlpZiAoY29tcG9uZW50RnJvbUNhY2hlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRGcm9tQ2FjaGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnRGcm9tQ2FjaGUubGVmdCgpLnZhbHVlKCkubGVmdCk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50Q2FjaGVEYXRhPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxDb21wb25lbnRJZFRpbWVBbmRUeXBlKCkgeworCQlpZiAoZmFsc2UgPT0gaXNFbmFibGVkKCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VEKTsKKwkJfQorCisJCUVpdGhlcjxMaXN0PENvbXBvbmVudENhY2hlRGF0YT4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50UmVzID0gY29tcG9uZW50Q2Fzc2FuZHJhRGFvCisJCQkJLmdldEFsbENvbXBvbmVudElkVGltZUFuZFR5cGUoKTsKKworCQlyZXR1cm4gY29tcG9uZW50UmVzOworCisJfQorCisJLyoqCisJICogZ2V0IGNvbXBvbmVudHMgZm9yIGNhdGFsb2cKKwkgKgorCSAqIEBwYXJhbSBjb21wb25lbnRzCisJICogQHBhcmFtIGNvbXBvbmVudFR5cGVFbnVtCisJICogQHJldHVybgorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVUcmlwbGU8TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRzRm9yQ2F0YWxvZygKKwkJCVNldDxTdHJpbmc+IGNvbXBvbmVudHMsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtKSB7CisKKwkJaWYgKGZhbHNlID09IGlzRW5hYmxlZCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIkluIGdldENvbXBvbmVudHNGb3JDYXRhbG9nIGZvciB0eXBlIHt9LiBDYWNoZSBpcyBkaXNhYmxlZC4iLAorCQkJCQljb21wb25lbnRUeXBlRW51bS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRCk7CisJCX0KKwkJbG9nZ2VyLmRlYnVnKCJJbiBnZXRDb21wb25lbnRzRm9yQ2F0YWxvZyBmb3IgdHlwZSB7fSIsIGNvbXBvbmVudFR5cGVFbnVtLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKworCQlGdW5jdGlvbjxMaXN0PENvbXBvbmVudD4sIExpc3Q8Q29tcG9uZW50Pj4gZmlsdGVyRmllbGRzRnVuYyA9IHggLT4gZmlsdGVyRm9yQ2F0YWxvZyh4KTsKKworCQlTZXQ8U3RyaW5nPiBsZWZ0Q29tcG9uZW50c0ZvclNlYXJjaCA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJbGVmdENvbXBvbmVudHNGb3JTZWFyY2guYWRkQWxsKGNvbXBvbmVudHMpOworCisJCS8vIGdldCBjb21wb25lbnRzIGZyb20gaW5tZW1vcnkgY2FjaGUKKwkJTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHNGcm9tTWVtb3J5ID0gbnVsbDsKKwkJaWYgKHRydWUgPT0gY2F0YWxvZ0luTWVtb3J5RW5hYmxlZCkgeworCQkJY29tcG9uZW50c0Zyb21NZW1vcnkgPSBnZXREYXRhRnJvbUluTWVtb3J5Q2FjaGUoY29tcG9uZW50cywgY29tcG9uZW50VHlwZUVudW0pOworCQkJbG9nZ2VyLmRlYnVnKCJUaGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdHlwZSB7fSBmZXRjaGVkIGZyb20gbWVtb3J5IGlzIHt9IiwKKwkJCQkJY29tcG9uZW50VHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCksCisJCQkJCWNvbXBvbmVudHNGcm9tTWVtb3J5ID09IG51bGwgPyAwIDogY29tcG9uZW50c0Zyb21NZW1vcnkuc2l6ZSgpKTsKKwkJCWlmIChjb21wb25lbnRzRnJvbU1lbW9yeSAhPSBudWxsKSB7CisJCQkJY29tcG9uZW50c0Zyb21NZW1vcnkuZm9yRWFjaChwIC0+IGxlZnRDb21wb25lbnRzRm9yU2VhcmNoLnJlbW92ZShwLmdldFVuaXF1ZUlkKCkpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQ2F0YWxvZyBJbk1lbW9yeSBjYWNoZSBpcyBkaXNhYmxlZCIpOworCQl9CisKKwkJbG9nZ2VyLmRlYnVnKCJOdW1iZXIgb2YgY29tcG9uZW50cyBmcm9tIHR5cGUge30gbmVlZGVkIHRvIGZldGNoIGlzIHt9IiwgY29tcG9uZW50VHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCksCisJCQkJbGVmdENvbXBvbmVudHNGb3JTZWFyY2guc2l6ZSgpKTsKKworCQkvLyBnZXQgY29tcG9uZW50cyBmcm9tIGNhc3NhbmRyYSBjYWNoZSBhbmQgZmlsdGVyIGVhY2ggY29tcG9uZW50CisJCUVpdGhlcjxJbW11dGFibGVUcmlwbGU8TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBnZXRDb21wb25lbnRzKAorCQkJCWxlZnRDb21wb25lbnRzRm9yU2VhcmNoLCBmaWx0ZXJGaWVsZHNGdW5jKTsKKworCQlpZiAocmVzdWx0LmlzTGVmdCgpKSB7CisJCQkvLyBhZGQgaW5tZW1vcnkgY29tcG9uZW50cyB0byB0aGUgdmFsaWQgY29tcG9uZW50cyhub3QgZGlydHkpCisJCQlMaXN0PENvbXBvbmVudD4gZm91bmRDb21wb25lbnRzID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKTsKKwkJCWlmIChjb21wb25lbnRzRnJvbU1lbW9yeSAhPSBudWxsKSB7CisJCQkJZm91bmRDb21wb25lbnRzLmFkZEFsbChjb21wb25lbnRzRnJvbU1lbW9yeSk7CisJCQl9CisJCQlpZiAodHJ1ZSA9PSBjYXRhbG9nSW5NZW1vcnlFbmFibGVkKSB7CisJCQkJdXBkYXRlQ2F0YWxvZ0luTWVtb3J5Q2FjaGVXaXRoQ2VydGlmaWVkKGZvdW5kQ29tcG9uZW50cywgY29tcG9uZW50VHlwZUVudW0pOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZm91bmRDb21wb25lbnRzCisJICogQHBhcmFtIGNvbXBvbmVudFR5cGVFbnVtCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhdGFsb2dJbk1lbW9yeUNhY2hlV2l0aENlcnRpZmllZChMaXN0PENvbXBvbmVudD4gZm91bmRDb21wb25lbnRzLAorCQkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0pIHsKKworCQl0cnkgeworCQkJd0NhdGFsb2dMb2NrLmxvY2soKTsKKworCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJTWFwPFN0cmluZywgQ29tcG9uZW50PiBtYXAgPSBjYXRhbG9nSW5NZW1vcnlDYWNoZS5nZXQoY29tcG9uZW50VHlwZUVudW0pOworCQkJaW50IG1hcFNpemVCZWZvcmUgPSBtYXAuc2l6ZSgpOworCQkJbWFwLmNsZWFyKCk7CisJCQlNYXA8U3RyaW5nLCBDb21wb25lbnQ+IGNvbGxlY3QgPSBmb3VuZENvbXBvbmVudHMuc3RyZWFtKCkKKwkJCQkJLmZpbHRlcihwIC0+IHAuZ2V0TGlmZWN5Y2xlU3RhdGUoKSA9PSBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKQorCQkJCQkubGltaXQobGltaXRNZW1vcnlDYXRhbG9nU2l6ZVBlclR5cGUuZ2V0KGNvbXBvbmVudFR5cGVFbnVtKSkKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0VW5pcXVlSWQoKSwgcCAtPiBwKSk7CisJCQltYXAucHV0QWxsKGNvbGxlY3QpOworCQkJbG9nZ2VyLmRlYnVnKAorCQkJCQkiU2l6ZSBvZiBpbiBtZW1vcnkgY2FjaGUgZm9yIGNhdGFsb2cge30oY2VydGlmaWVkIG9ubHkpOiBCZWZvcmUge30sIEFmdGVyIHt9LiBSZXBsYWNlbWVudCBUaW1lIGlzIHt9IG1zLiIsCisJCQkJCWNvbXBvbmVudFR5cGVFbnVtLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCBtYXBTaXplQmVmb3JlLCBtYXAuc2l6ZSgpLAorCQkJCQlTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKKwkJfSBmaW5hbGx5IHsKKwkJCXdDYXRhbG9nTG9jay51bmxvY2soKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudD4gZ2V0RGF0YUZyb21Jbk1lbW9yeUNhY2hlKFNldDxTdHJpbmc+IGNvbXBvbmVudHMsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtKSB7CisJCUxpc3Q8Q29tcG9uZW50PiBmb3VuZENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQl0cnkgeworCisJCQlyQ2F0YWxvZ0xvY2subG9jaygpOworCisJCQlNYXA8U3RyaW5nLCBDb21wb25lbnQ+IG1hcCA9IGNhdGFsb2dJbk1lbW9yeUNhY2hlLmdldChjb21wb25lbnRUeXBlRW51bSk7CisJCQlmb3IgKFN0cmluZyBjb21wVWlkIDogY29tcG9uZW50cykgeworCQkJCUNvbXBvbmVudCBjb21wb25lbnQgPSBtYXAuZ2V0KGNvbXBVaWQpOworCQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgeworCQkJCQlmb3VuZENvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7CisJCQkJfQorCQkJfQorCisJCX0gZmluYWxseSB7CisJCQlyQ2F0YWxvZ0xvY2sudW5sb2NrKCk7CisJCX0KKworCQlyZXR1cm4gZm91bmRDb21wb25lbnRzOworCX0KKworCS8qKgorCSAqCisJICogZ2V0IGZ1bGwgY29tcG9uZW50cyBmcm9tIGNhc3NhbmRyYS4gT24gZWFjaCBjb21wb25lbnQgYXBwbHkgZmlsdGVyCisJICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gcmVtb3ZlIHVudXNlZCBtZW1iZXJzCisJICoKKwkgKiBAcGFyYW0gY29tcG9uZW50cworCSAqIEBwYXJhbSBmaWx0ZXJGaWVsZHNGdW5jCisJICogQHJldHVybiA8Zm91bmQgY29tcG9uZW50cywgZm91bmQgZGlydHkgY29tcG9uZW50cywgbm90IGZvdW5kIGNvbXBvbmVudHMKKwkgKiAgICAgICAgIGxpc3Q+IG9yIEVycm9yCisJICovCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVUcmlwbGU8TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRzKAorCQkJU2V0PFN0cmluZz4gY29tcG9uZW50cywgRnVuY3Rpb248TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4+IGZpbHRlckZpZWxkc0Z1bmMpIHsKKworCQlpZiAoZmFsc2UgPT0gaXNFbmFibGVkKCkpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQ29tcG9uZW50IENhY2hlIGlzIGRpc2FibGVkIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5OT1RfQUxMT1dFRCk7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlVHJpcGxlPExpc3Q8Q29tcG9uZW50PiwgTGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50c0Z1bGwgPSBnZXRDb21wb25lbnRzRnVsbCgKKwkJCQljb21wb25lbnRzKTsKKworCQlpZiAoY29tcG9uZW50c0Z1bGwuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNGdWxsLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlJbW11dGFibGVUcmlwbGU8TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiBpbW11dGFibGVUcmlwbGUgPSBjb21wb25lbnRzRnVsbC5sZWZ0KCkudmFsdWUoKTsKKwkJTGlzdDxDb21wb25lbnQ+IGZvdW5kUmVzb3VyY2VzID0gaW1tdXRhYmxlVHJpcGxlLmxlZnQ7CisJCUxpc3Q8Q29tcG9uZW50PiBmb3VuZERpcnR5UmVzb3VyY2VzID0gaW1tdXRhYmxlVHJpcGxlLm1pZGRsZTsKKwkJU2V0PFN0cmluZz4gbm90Rm91bmRSZXNvdXJjZXMgPSBpbW11dGFibGVUcmlwbGUucmlnaHQ7CisKKwkJTGlzdDxDb21wb25lbnQ+IGZpbHRlcmRGb3VuZFJlc291cmNlcyA9IGZpbHRlckZpZWxkc0Z1bmMuYXBwbHkoZm91bmRSZXNvdXJjZXMpOworCQlMaXN0PENvbXBvbmVudD4gZmlsdGVyZEZvdW5kRGlydHlSZXNvdXJjZXMgPSBmaWx0ZXJGaWVsZHNGdW5jLmFwcGx5KGZvdW5kRGlydHlSZXNvdXJjZXMpOworCisJCUltbXV0YWJsZVRyaXBsZTxMaXN0PENvbXBvbmVudD4sIExpc3Q8Q29tcG9uZW50PiwgU2V0PFN0cmluZz4+IHJlc3VsdCA9IG5ldyBJbW11dGFibGVUcmlwbGU8TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PigKKwkJCQlmaWx0ZXJkRm91bmRSZXNvdXJjZXMsIGZpbHRlcmRGb3VuZERpcnR5UmVzb3VyY2VzLCBub3RGb3VuZFJlc291cmNlcyk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVRyaXBsZTxMaXN0PENvbXBvbmVudD4sIExpc3Q8Q29tcG9uZW50PiwgU2V0PFN0cmluZz4+LCBBY3Rpb25TdGF0dXM+IGdldENvbXBvbmVudHNGb3JMZWZ0UGFuZWwoCisJCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIGludGVybmFsQ29tcG9uZW50VHlwZSwgU2V0PFN0cmluZz4gZmlsdGVyZWRSZXNvdXJjZXMpIHsKKworCQlsb2dnZXIuZGVidWcoIkluIGdldENvbXBvbmVudHNGb3JMZWZ0UGFuZWwgY29tcG9uZW50VHlwZUVudW0gPSB7fSwgaW50ZXJuYWxDb21wb25lbnRUeXBlID0ge30iLAorCQkJCWNvbXBvbmVudFR5cGVFbnVtLCBpbnRlcm5hbENvbXBvbmVudFR5cGUpOworCisJCUZ1bmN0aW9uPExpc3Q8Q29tcG9uZW50PiwgTGlzdDxDb21wb25lbnQ+PiBmaWx0ZXJGaWVsZHNGdW5jID0geCAtPiBmaWx0ZXJGb3JMZWZ0UGFuZWwoeCk7CisKKwkJcmV0dXJuIGdldENvbXBvbmVudHMoZmlsdGVyZWRSZXNvdXJjZXMsIGZpbHRlckZpZWxkc0Z1bmMpOworCisJfQorCisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudD4gZmlsdGVyRm9yTGVmdFBhbmVsKExpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzKSB7CisKKwkJTGlzdDxDb21wb25lbnQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAoY29tcG9uZW50cyAhPSBudWxsKSB7CisJCQljb21wb25lbnRzLmZvckVhY2gocCAtPiByZXN1bHQuYWRkKGZpbHRlckZpZWxkc0ZvckxlZnRQYW5lbChwKSkpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q29tcG9uZW50PiBmaWx0ZXJGb3JDYXRhbG9nKExpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzKSB7CisKKwkJTGlzdDxDb21wb25lbnQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAoY29tcG9uZW50cyAhPSBudWxsKSB7CisJCQljb21wb25lbnRzLmZvckVhY2gocCAtPiByZXN1bHQuYWRkKGZpbHRlckZpZWxkc0ZvckNhdGFsb2cocCkpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnQgZmlsdGVyRmllbGRzRm9yTGVmdFBhbmVsKENvbXBvbmVudCBjb21wb25lbnQpIHsKKworCQlDb21wb25lbnQgcmVzdWx0ID0gbnVsbDsKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOworCQlzd2l0Y2ggKGNvbXBvbmVudFR5cGVFbnVtKSB7CisJCWNhc2UgUkVTT1VSQ0U6CisJCQlyZXN1bHQgPSBuZXcgUmVzb3VyY2UoKTsKKwkJCWNvcHlGaWVsZHNGb3JMZWZ0UGFuZWwoY29tcG9uZW50LCByZXN1bHQpOworCQkJYnJlYWs7CisJCWNhc2UgU0VSVklDRToKKwkJCXJlc3VsdCA9IG5ldyBTZXJ2aWNlKCk7CisJCQljb3B5RmllbGRzRm9yTGVmdFBhbmVsKGNvbXBvbmVudCwgcmVzdWx0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgQ29tcG9uZW50IGZpbHRlckZpZWxkc0ZvckNhdGFsb2coQ29tcG9uZW50IGNvbXBvbmVudCkgeworCisJCUNvbXBvbmVudCByZXN1bHQgPSBudWxsOworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisJCXN3aXRjaCAoY29tcG9uZW50VHlwZUVudW0pIHsKKwkJY2FzZSBSRVNPVVJDRToKKwkJCXJlc3VsdCA9IG5ldyBSZXNvdXJjZSgpOworCQkJY29weUZpZWxkc0ZvckNhdGFsb2coY29tcG9uZW50LCByZXN1bHQpOworCQkJYnJlYWs7CisJCWNhc2UgU0VSVklDRToKKwkJCXJlc3VsdCA9IG5ldyBTZXJ2aWNlKCk7CisJCQljb3B5RmllbGRzRm9yQ2F0YWxvZyhjb21wb25lbnQsIHJlc3VsdCk7CisJCQlicmVhazsKKwkJY2FzZSBQUk9EVUNUOgorCQkJcmVzdWx0ID0gbmV3IFByb2R1Y3QoKTsKKwkJCWNvcHlGaWVsZHNGb3JDYXRhbG9nKGNvbXBvbmVudCwgcmVzdWx0KTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDb3B5IHJlbGV2YW50IGZpZWxkcyB0byB0aGUgZmlsdGVyZWQgY29tcG9uZW50IGZvciBsZWZ0IHBhbmVsCisJICoKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQHBhcmFtIGZpbHRlcmVkQ29tcG9uZW50CisJICovCisJcHJpdmF0ZSB2b2lkIGNvcHlGaWVsZHNGb3JMZWZ0UGFuZWwoQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50IGZpbHRlcmVkQ29tcG9uZW50KSB7CisKKwkJQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0gPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOworCQlmaWx0ZXJlZENvbXBvbmVudC5zZXRDYXRlZ29yaWVzKGNvbXBvbmVudC5nZXRDYXRlZ29yaWVzKCkpOworCQlmaWx0ZXJlZENvbXBvbmVudC5zZXRDb21wb25lbnRUeXBlKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpOworCQlpZiAoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UuZXF1YWxzKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpCisJCQkJJiYgUmVzb3VyY2VUeXBlRW51bS5WTC5lcXVhbHMoKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGNvbXBvbmVudAorCQkJCQkJLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuZ2V0UmVzb3VyY2VUeXBlKCkpKSB7CisJCQlmaWx0ZXJlZENvbXBvbmVudC5zZXRDYXBhYmlsaXRpZXMoY29tcG9uZW50LmdldENhcGFiaWxpdGllcygpKTsKKwkJCWZpbHRlcmVkQ29tcG9uZW50LnNldFJlcXVpcmVtZW50cyhjb21wb25lbnQuZ2V0UmVxdWlyZW1lbnRzKCkpOworCQl9CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldFZlcnNpb24oY29tcG9uZW50LmdldFZlcnNpb24oKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldERlc2NyaXB0aW9uKGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpKTsKKwkJZmlsdGVyZWRDb21wb25lbnQuc2V0VW5pcXVlSWQoY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlmaWx0ZXJlZENvbXBvbmVudC5zZXRJY29uKGNvbXBvbmVudC5nZXRJY29uKCkpOworCQlmaWx0ZXJlZENvbXBvbmVudC5zZXRUYWdzKGNvbXBvbmVudC5nZXRUYWdzKCkpOworCQkvLyBmaWx0ZXJlZENvbXBvbmVudC5zZXRBbGxWZXJzaW9ucyhjb21wb25lbnQuZ2V0QWxsVmVyc2lvbnMoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldExpZmVjeWNsZVN0YXRlKGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKwkJLy8gZmlsdGVyZWRDb21wb25lbnQuc2V0SGlnaGVzdFZlcnNpb24oY29tcG9uZW50LmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldEludmFyaWFudFVVSUQoY29tcG9uZW50LmdldEludmFyaWFudFVVSUQoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldFVVSUQoY29tcG9uZW50LmdldFVVSUQoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldFN5c3RlbU5hbWUoY29tcG9uZW50LmdldFN5c3RlbU5hbWUoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldE5hbWUoY29tcG9uZW50LmdldE5hbWUoKSk7CisKKwkJaWYgKGNvbXBvbmVudFR5cGVFbnVtID09IENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSB7CisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY29tcG9uZW50OworCQkJUmVzb3VyY2UgZmlsdGVyZWRSZXNvdXJjZSA9IChSZXNvdXJjZSkgZmlsdGVyZWRDb21wb25lbnQ7CisJCQlmaWx0ZXJlZFJlc291cmNlLnNldFRvc2NhUmVzb3VyY2VOYW1lKHJlc291cmNlLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQkJLy8gZmlsdGVyZWRSZXNvdXJjZS5zZXRBYnN0cmFjdChyZXNvdXJjZS5pc0Fic3RyYWN0KCkpOworCQkJLy8gZmlsdGVyZWRSZXNvdXJjZS5zZXRWZW5kb3JOYW1lKHJlc291cmNlLmdldFZlbmRvck5hbWUoKSk7CisJCQkvLyBmaWx0ZXJlZFJlc291cmNlLnNldFZlbmRvclJlbGVhc2UocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJCWZpbHRlcmVkUmVzb3VyY2Uuc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJfSBlbHNlIGlmIChjb21wb25lbnRUeXBlRW51bSA9PSBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSB7CisJCQkvLyBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSljb21wb25lbnQ7CisJCQkvLyBTZXJ2aWNlIGZpbHRlcmVkU2VydmljZSA9IChTZXJ2aWNlKWZpbHRlcmVkQ29tcG9uZW50OworCQkJLy8gZmlsdGVyZWRTZXJ2aWNlLnNldERpc3RyaWJ1dGlvblN0YXR1cyhzZXJ2aWNlLmdldERpc3RyaWJ1dGlvblN0YXR1cygpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb3B5RmllbGRzRm9yQ2F0YWxvZyhDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnQgZmlsdGVyZWRDb21wb25lbnQpIHsKKworCQlDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldENhdGVnb3JpZXMoY29tcG9uZW50LmdldENhdGVnb3JpZXMoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldENvbXBvbmVudFR5cGUoY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldFZlcnNpb24oY29tcG9uZW50LmdldFZlcnNpb24oKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldERlc2NyaXB0aW9uKGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpKTsKKwkJZmlsdGVyZWRDb21wb25lbnQuc2V0VW5pcXVlSWQoY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlmaWx0ZXJlZENvbXBvbmVudC5zZXRJY29uKGNvbXBvbmVudC5nZXRJY29uKCkpOworCQlmaWx0ZXJlZENvbXBvbmVudC5zZXRUYWdzKGNvbXBvbmVudC5nZXRUYWdzKCkpOworCQkvLyBmaWx0ZXJlZENvbXBvbmVudC5zZXRBbGxWZXJzaW9ucyhjb21wb25lbnQuZ2V0QWxsVmVyc2lvbnMoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldExpZmVjeWNsZVN0YXRlKGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKwkJLy8gZmlsdGVyZWRDb21wb25lbnQuc2V0SGlnaGVzdFZlcnNpb24oY29tcG9uZW50LmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCS8vIGZpbHRlcmVkQ29tcG9uZW50LnNldEludmFyaWFudFVVSUQoY29tcG9uZW50LmdldEludmFyaWFudFVVSUQoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldFN5c3RlbU5hbWUoY29tcG9uZW50LmdldFN5c3RlbU5hbWUoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldE5hbWUoY29tcG9uZW50LmdldE5hbWUoKSk7CisJCWZpbHRlcmVkQ29tcG9uZW50LnNldExhc3RVcGRhdGVEYXRlKGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlRGF0ZSgpKTsKKworCQlpZiAoY29tcG9uZW50VHlwZUVudW0gPT0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpIHsKKwkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBjb21wb25lbnQ7CisJCQlSZXNvdXJjZSBmaWx0ZXJlZFJlc291cmNlID0gKFJlc291cmNlKSBmaWx0ZXJlZENvbXBvbmVudDsKKwkJCWZpbHRlcmVkUmVzb3VyY2Uuc2V0VG9zY2FSZXNvdXJjZU5hbWUocmVzb3VyY2UuZ2V0VG9zY2FSZXNvdXJjZU5hbWUoKSk7CisJCQkvLyBmaWx0ZXJlZFJlc291cmNlLnNldEFic3RyYWN0KHJlc291cmNlLmlzQWJzdHJhY3QoKSk7CisJCQkvLyBmaWx0ZXJlZFJlc291cmNlLnNldFZlbmRvck5hbWUocmVzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpKTsKKwkJCS8vIGZpbHRlcmVkUmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZShyZXNvdXJjZS5nZXRWZW5kb3JSZWxlYXNlKCkpOworCQkJZmlsdGVyZWRSZXNvdXJjZS5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOworCQl9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGVFbnVtID09IENvbXBvbmVudFR5cGVFbnVtLlNFUlZJQ0UpIHsKKwkJCVNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBjb21wb25lbnQ7CisJCQlTZXJ2aWNlIGZpbHRlcmVkU2VydmljZSA9IChTZXJ2aWNlKSBmaWx0ZXJlZENvbXBvbmVudDsKKwkJCWZpbHRlcmVkU2VydmljZS5zZXREaXN0cmlidXRpb25TdGF0dXMoc2VydmljZS5nZXREaXN0cmlidXRpb25TdGF0dXMoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBnZXQgY29tcG9uZW50cyBmcm9tIGNhY2hlIG9mIGEgZ2l2ZW4gbGlzdCBvdSB1bmlxdWUgaWRzLgorCSAqCisJICogZm9yIGVhY2ggY29tcG9uZW50IGRhdGEgZnJvbSBjYXNzYW5kcmEsIHVuemlwIHRoZSBkYXRhIGlmIG5lZWRlZCBhbmQKKwkgKiBkZXNlcmlhbGl6ZSB0aGUgdW56aXBwZWQgZGF0YSB0byBqYXZhIG9iamVjdChDb21wb25lbnQpLgorCSAqCisJICogQHBhcmFtIGZpbHRlcmVkUmVzb3VyY2VzCisJICogQHJldHVybiBJbW11dGFibGVUcmlwcGxlIG9yIEFjdGlvblN0YXR1cy4gfCB8LS0gY29tcG9uZW50cyB8LS0gZGlydHkKKwkgKiAgICAgICAgIGNvbXBvbmVudHMgLSBjb21wb25lbnRzIHdpdGggZGlydHkgZmxhZyA9IHRydWUuIHwtLSBzZXQgb2Ygbm9uCisJICogICAgICAgICBjYWNoZWQgY29tcG9uZW50cworCSAqCisJICovCisJcHJpdmF0ZSBFaXRoZXI8SW1tdXRhYmxlVHJpcGxlPExpc3Q8Q29tcG9uZW50PiwgTGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4sIEFjdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50c0Z1bGwoCisJCQlTZXQ8U3RyaW5nPiBmaWx0ZXJlZFJlc291cmNlcykgeworCisJCWlmIChmYWxzZSA9PSBpc0VuYWJsZWQoKSkgeworCQkJbG9nZ2VyLmRlYnVnKCJDb21wb25lbnQgQ2FjaGUgaXMgZGlzYWJsZWQiKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VEKTsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50PiBmb3VuZFJlc291cmNlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKwkJTGlzdDxDb21wb25lbnQ+IGZvdW5kRGlydHlSZXNvdXJjZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisJCVNldDxTdHJpbmc+IG5vdEZvdW5kUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8PigpOworCQlJbW11dGFibGVUcmlwbGU8TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiByZXN1bHQgPSBuZXcgSW1tdXRhYmxlVHJpcGxlPExpc3Q8Q29tcG9uZW50PiwgTGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4oCisJCQkJZm91bmRSZXNvdXJjZXMsIGZvdW5kRGlydHlSZXNvdXJjZXMsIG5vdEZvdW5kUmVzb3VyY2VzKTsKKworCQlsb25nIGNhc3NhbmRyYUZldGNoU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJTGlzdDxTdHJpbmc+IHVpZHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXVpZHNMaXN0LmFkZEFsbChmaWx0ZXJlZFJlc291cmNlcyk7CisJCUVpdGhlcjxMaXN0PENvbXBvbmVudENhY2hlRGF0YT4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50c0Zyb21DYWNoZSA9IGNvbXBvbmVudENhc3NhbmRyYURhbworCQkJCS5nZXRDb21wb25lbnRzKHVpZHNMaXN0KTsKKworCQlsb25nIGNhc3NhbmRyYUZldGNoRW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWxvZ2dlci5kZWJ1ZygiRmV0Y2ggdGltZSBmcm9tIGNhc3NhbmRhcmEgb2YgYWxsIGNvbXBvbmVudHMgdG9vayB7fSBtcyIsCisJCQkJKGNhc3NhbmRyYUZldGNoRW5kIC0gY2Fzc2FuZHJhRmV0Y2hTdGFydCkpOworCQlpZiAoY29tcG9uZW50c0Zyb21DYWNoZS5pc1JpZ2h0KCkpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiRmV0Y2hGcm9tQ2FjaGUiLAorCQkJCQkiRmFpbGVkIHRvIGZldGNoIGNvbXBvbmVudHMgZnJvbSBjYWNoZSIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzRnJvbUNhY2hlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlMaXN0PENvbXBvbmVudENhY2hlRGF0YT4gbGlzdCA9IGNvbXBvbmVudHNGcm9tQ2FjaGUubGVmdCgpLnZhbHVlKCk7CisJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGNvbXBvbmVudHMgZmV0Y2hlZCBmcm9tIGNhc3NhbmRyYSBpcyB7fSIsIChsaXN0ID09IG51bGwgPyAwIDogbGlzdC5zaXplKCkpKTsKKwkJaWYgKGxpc3QgIT0gbnVsbCAmJiBmYWxzZSA9PSBsaXN0LmlzRW1wdHkoKSkgeworCisJCQlMaXN0PENvbXBvbmVudENhY2hlRGF0YT4gZmlsdGVyZWREYXRhID0gbGlzdC5zdHJlYW0oKS5maWx0ZXIocCAtPiBmaWx0ZXJlZFJlc291cmNlcy5jb250YWlucyhwLmdldElkKCkpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGNvbXBvbmVudHMgZmlsdGVyZCBpcyB7fSIsIGZpbHRlcmVkRGF0YSA9PSBudWxsID8gMCA6IGZpbHRlcmVkRGF0YS5zaXplKCkpOworCisJCQlpZiAoZmlsdGVyZWREYXRhICE9IG51bGwpIHsKKwkJCQlsb25nIGRlc1N0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCQlmb3IgKENvbXBvbmVudENhY2hlRGF0YSBjb21wb25lbnRDYWNoZURhdGEgOiBmaWx0ZXJlZERhdGEpIHsKKworCQkJCQlsb2dnZXIuZGVidWcoIlByb2Nlc3MgdWlkIHt9IGZyb20gY2FjaGUiLCBjb21wb25lbnRDYWNoZURhdGEuZ2V0SWQoKSk7CisKKwkJCQkJU3RyaW5nIGNvbXBVaWQgPSBjb21wb25lbnRDYWNoZURhdGEuZ2V0SWQoKTsKKworCQkJCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgQm9vbGVhbj4gZGVzZXJpYWxpemVFeHQgPSBjb252ZXJ0Q29tcG9uZW50Q2FjaGVUb0NvbXBvbmVudCgKKwkJCQkJCQljb21wb25lbnRDYWNoZURhdGEpOworCisJCQkJCWlmIChkZXNlcmlhbGl6ZUV4dC5pc0xlZnQoKSkgeworCQkJCQkJQ29tcG9uZW50IGNvbXBvbmVudCA9IGRlc2VyaWFsaXplRXh0LmxlZnQoKS52YWx1ZSgpOworCQkJCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudENhY2hlRGF0YS5nZXRJc0RpcnR5KCkpIHsKKwkJCQkJCQlmb3VuZFJlc291cmNlcy5hZGQoY29tcG9uZW50KTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZm91bmREaXJ0eVJlc291cmNlcy5hZGQoY29tcG9uZW50KTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5vdEZvdW5kUmVzb3VyY2VzLmFkZChjb21wVWlkKTsKKwkJCQkJfQorCisJCQkJfQorCQkJCWxvbmcgZGVzRW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJbG9nZ2VyLmRlYnVnKCJEZXNlcmlhbGl6YXRpb24gYW5kIHVuemlwIG9mIHt9IGNvbXBvbmVudHMgdG9vayB7fSBtcyIsIGZpbHRlcmVkRGF0YS5zaXplKCksCisJCQkJCQkoZGVzRW5kIC0gZGVzU3RhcnQpKTsKKwkJCX0KKwkJfQorCQlMaXN0PFN0cmluZz4gZm91bmRSZXNvdXJjZXNVaWQgPSBmb3VuZFJlc291cmNlcy5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFVuaXF1ZUlkKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCUxpc3Q8U3RyaW5nPiBmb3VuZERpcnR5UmVzb3VyY2VzVWlkID0gZm91bmREaXJ0eVJlc291cmNlcy5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFVuaXF1ZUlkKCkpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIHByb2Nlc3NlZCBjb21wb25lbnRzIGZyb20gY2FjaGUgaXMge30iLAorCQkJCShmb3VuZFJlc291cmNlc1VpZC5zaXplKCkgKyBmb3VuZERpcnR5UmVzb3VyY2VzVWlkLnNpemUoKSkpOworCQlTZXQ8U3RyaW5nPiBub3RDYWNoZWRSZXNvdXJjZXMgPSBmaWx0ZXJlZFJlc291cmNlcy5zdHJlYW0oKQorCQkJCS5maWx0ZXIocCAtPiBmYWxzZSA9PSBmb3VuZFJlc291cmNlc1VpZC5jb250YWlucyhwKSAmJiBmYWxzZSA9PSBmb3VuZERpcnR5UmVzb3VyY2VzVWlkLmNvbnRhaW5zKHApKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisJCW5vdEZvdW5kUmVzb3VyY2VzLmFkZEFsbChub3RDYWNoZWRSZXNvdXJjZXMpOworCisJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJbG9nZ2VyLmRlYnVnKCJOdW1iZXIgb2YgY29tcG9uZW50cyBmZXRjaGVkIGlzIHt9IiwgZm91bmRSZXNvdXJjZXMuc2l6ZSgpKTsKKwkJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGNvbXBvbmVudHMgZmV0Y2hlZCBkaXJ0eSBpcyB7fSIsIGZvdW5kRGlydHlSZXNvdXJjZXMuc2l6ZSgpKTsKKwkJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGNvbXBvbmVudHMgbm9uIGNhY2hlZCBpcyB7fSIsIG5vdENhY2hlZFJlc291cmNlcy5zaXplKCkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgQm9vbGVhbj4gY29udmVydENvbXBvbmVudENhY2hlVG9Db21wb25lbnQoCisJCQlDb21wb25lbnRDYWNoZURhdGEgY29tcG9uZW50Q2FjaGVEYXRhKSB7CisKKwkJU3RyaW5nIGNvbXBVaWQgPSBjb21wb25lbnRDYWNoZURhdGEuZ2V0SWQoKTsKKworCQlieXRlW10gZGF0YUFzQXJyYXkgPSBjb21wb25lbnRDYWNoZURhdGEuZ2V0RGF0YUFzQXJyYXkoKTsKKworCQlpZiAodHJ1ZSA9PSBjb21wb25lbnRDYWNoZURhdGEuZ2V0SXNaaXBwZWQoKSkgeworCQkJbG9uZyBzdGFydFVuemlwID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQlkYXRhQXNBcnJheSA9IFppcFV0aWwudW56aXAoZGF0YUFzQXJyYXkpOworCQkJbG9uZyBlbmRVbnppcCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJbG9nZ2VyLnRyYWNlKCJVbnppcCBjb21wb25lbnQge30gdG9vayB7fSBtaWNyb3NlY29uZCIsIGNvbXBVaWQsIChlbmRVbnppcCAtIHN0YXJ0VW56aXApIC8gMTAwMCk7CisJCX0KKworCQlsb25nIHN0YXJ0RGVzID0gU3lzdGVtLm5hbm9UaW1lKCk7CisKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIEJvb2xlYW4+IGRlc2VyaWFsaXplRXh0ID0gZGVzZXJpYWxpemVDb21wb25lbnQoY29tcG9uZW50Q2FjaGVEYXRhLCBkYXRhQXNBcnJheSk7CisKKwkJbG9uZyBlbmREZXMgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJbG9nZ2VyLnRyYWNlKCJEZXNlcmlhbGl6ZSBjb21wb25lbnQge30gdG9vayB7fSBtaWNyb3NlY29uZCIsIGNvbXBVaWQsIChlbmREZXMgLSBzdGFydERlcykgLyAxMDAwKTsKKwkJcmV0dXJuIGRlc2VyaWFsaXplRXh0OworCX0KKworCXByaXZhdGUgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIEJvb2xlYW4+IGRlc2VyaWFsaXplQ29tcG9uZW50KENvbXBvbmVudENhY2hlRGF0YSBjb21wb25lbnRDYWNoZURhdGEsCisJCQlieXRlW10gZGF0YUFzQXJyYXkpIHsKKwkJU3RyaW5nIHR5cGUgPSBjb21wb25lbnRDYWNoZURhdGEuZ2V0VHlwZSgpOworCQlOb2RlVHlwZUVudW0gdHlwZUVudW0gPSBOb2RlVHlwZUVudW0uZ2V0QnlOYW1lSWdub3JlQ2FzZSh0eXBlKTsKKworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgQm9vbGVhbj4gZGVzZXJpYWxpemVFeHQgPSBFaXRoZXIucmlnaHQoZmFsc2UpOworCQlzd2l0Y2ggKHR5cGVFbnVtKSB7CisJCWNhc2UgUmVzb3VyY2U6CisJCQlkZXNlcmlhbGl6ZUV4dCA9IFNlcmlhbGl6YXRpb25VdGlscy5kZXNlcmlhbGl6ZUV4dChkYXRhQXNBcnJheSwgUmVzb3VyY2UuY2xhc3MsIGNvbXBvbmVudENhY2hlRGF0YS5nZXRJZCgpKTsKKwkJCWJyZWFrOworCQljYXNlIFNlcnZpY2U6CisJCQlkZXNlcmlhbGl6ZUV4dCA9IFNlcmlhbGl6YXRpb25VdGlscy5kZXNlcmlhbGl6ZUV4dChkYXRhQXNBcnJheSwgU2VydmljZS5jbGFzcywgY29tcG9uZW50Q2FjaGVEYXRhLmdldElkKCkpOworCQkJYnJlYWs7CisJCWNhc2UgUHJvZHVjdDoKKwkJCWRlc2VyaWFsaXplRXh0ID0gU2VyaWFsaXphdGlvblV0aWxzLmRlc2VyaWFsaXplRXh0KGRhdGFBc0FycmF5LCBQcm9kdWN0LmNsYXNzLCBjb21wb25lbnRDYWNoZURhdGEuZ2V0SWQoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBkZXNlcmlhbGl6ZUV4dDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudCwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudFVpZCkgeworCisJCXJldHVybiBnZXRDb21wb25lbnQoY29tcG9uZW50VWlkLCBudWxsLCBGdW5jdGlvbi5pZGVudGl0eSgpKTsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50LCBBY3Rpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgY29tcG9uZW50VWlkLCBMb25nIGxhc3RNb2RpZmljYXRpb25UaW1lKSB7CisKKwkJcmV0dXJuIGdldENvbXBvbmVudChjb21wb25lbnRVaWQsIGxhc3RNb2RpZmljYXRpb25UaW1lLCBGdW5jdGlvbi5pZGVudGl0eSgpKTsKKworCX0KKworCXB1YmxpYyBib29sZWFuIHNldENvbXBvbmVudChTdHJpbmcgY29tcG9uZW50VWlkLCBMb25nIGxhc3RNb2RpZmljYXRpb25UaW1lLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworCQlpZiAoZmFsc2UgPT0gaXNFbmFibGVkKCkpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQ29tcG9uZW50IENhY2hlIGlzIGRpc2FibGVkIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKG5vZGVUeXBlRW51bSk7CisKKwkJaWYgKGNvbXBvbmVudE9wZXJhdGlvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBjb21wb25lbnRPcGVyYXRpb24uZ2V0Q29tcG9uZW50KGNvbXBvbmVudFVpZCwgZmFsc2UpOworCQlpZiAoZWl0aGVyLmlzTGVmdCgpKSB7CisJCQlDb21wb25lbnQgY29tcG9uZW50ID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJcmVzdWx0ID0gc2F2ZUNvbXBvbmVudChjb21wb25lbnRVaWQsIGxhc3RNb2RpZmljYXRpb25UaW1lLCBub2RlVHlwZUVudW0sIGNvbXBvbmVudCk7CisJCX0gZWxzZSB7CisJCQlsb2dnZXIuZGVidWcoIkZhaWxlZCB0byBnZXQgY29tcG9uZW50IHt9IG9mIHR5cGUge30gZnJvbSBncmFwaC4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50VWlkLAorCQkJCQlub2RlVHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCksIGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCXByaXZhdGUgYm9vbGVhbiBzYXZlQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnRVaWQsIExvbmcgbGFzdE1vZGlmaWNhdGlvblRpbWUsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sCisJCQlDb21wb25lbnQgY29tcG9uZW50KSB7CisKKwkJbG9nZ2VyLnRyYWNlKCJHb2luZyB0byBzYXZlIGNvbXBvbmVudCB7fSBvZiB0eXBlIHt9IGluIGNhY2hlIiwgY29tcG9uZW50VWlkLCBub2RlVHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisKKwkJRWl0aGVyPGJ5dGVbXSwgQm9vbGVhbj4gc2VyaWFsaXplRXh0ID0gU2VyaWFsaXphdGlvblV0aWxzLnNlcmlhbGl6ZUV4dChjb21wb25lbnQpOworCQlpZiAoc2VyaWFsaXplRXh0LmlzTGVmdCgpKSB7CisJCQlieXRlW10gc2VyaWFsaXplZERhdGEgPSBzZXJpYWxpemVFeHQubGVmdCgpLnZhbHVlKCk7CisJCQlieXRlW10gemlwQnl0ZXM7CisJCQl0cnkgeworCQkJCXppcEJ5dGVzID0gWmlwVXRpbC56aXBCeXRlcyhzZXJpYWxpemVkRGF0YSk7CisJCQkJQ29tcG9uZW50Q2FjaGVEYXRhIGNvbXBvbmVudENhY2hlRGF0YSA9IG5ldyBDb21wb25lbnRDYWNoZURhdGEoKTsKKwkJCQljb21wb25lbnRDYWNoZURhdGEuc2V0RGF0YUFzQXJyYXkoemlwQnl0ZXMpOworCQkJCWNvbXBvbmVudENhY2hlRGF0YS5zZXRJc1ppcHBlZCh0cnVlKTsKKwkJCQljb21wb25lbnRDYWNoZURhdGEuc2V0SWQoY29tcG9uZW50VWlkKTsKKwkJCQljb21wb25lbnRDYWNoZURhdGEuc2V0TW9kaWZpY2F0aW9uVGltZShuZXcgRGF0ZShsYXN0TW9kaWZpY2F0aW9uVGltZSkpOworCQkJCWNvbXBvbmVudENhY2hlRGF0YS5zZXRUeXBlKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCisJCQkJQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNvbXBvbmVudENhc3NhbmRyYURhby5zYXZlQ29tcG9uZW50KGNvbXBvbmVudENhY2hlRGF0YSk7CisKKwkJCQlpZiAoc3RhdHVzID09IENhc3NhbmRyYU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSB0cnVlOworCQkJCX0KKworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIHByZXBhcmUgY29tcG9uZW50IHt9IG9mIHR5cGUge30gZm9yIGNhY2hlIiwgY29tcG9uZW50VWlkLAorCQkJCQkJbm9kZVR5cGVFbnVtLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJCQlpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCQkJbG9nZ2VyLnRyYWNlKCJGYWlsZWQgdG8gcHJlcGFyZSBjb21wb25lbnQgIiArIGNvbXBvbmVudFVpZCArICIgb2YgdHlwZSAiCisJCQkJCQkJKyBub2RlVHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCkgKyAiIGZvciBjYWNoZSIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5kZWJ1ZygiRmFpbGVkIHRvIHNlcmlhbGl6ZSBjb21wb25lbnQge30gb2YgdHlwZSB7fSBmb3IgY2FjaGUiLCBjb21wb25lbnRVaWQsCisJCQkJCW5vZGVUeXBlRW51bS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzZXRDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisKKwkJaWYgKGZhbHNlID09IGlzRW5hYmxlZCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIkNvbXBvbmVudCBDYWNoZSBpcyBkaXNhYmxlZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJU3RyaW5nIGNvbXBvbmVudFVpZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQlMb25nIGxhc3RVcGRhdGVEYXRlID0gY29tcG9uZW50LmdldExhc3RVcGRhdGVEYXRlKCk7CisKKwkJcmVzdWx0ID0gc2F2ZUNvbXBvbmVudChjb21wb25lbnRVaWQsIGxhc3RVcGRhdGVEYXRlLCBub2RlVHlwZUVudW0sIGNvbXBvbmVudCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCXByaXZhdGUgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbXBvbmVudE9wZXJhdGlvbihOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBudWxsOworCQlzd2l0Y2ggKG5vZGVUeXBlRW51bSkgeworCQljYXNlIFJlc291cmNlOgorCQkJY29tcG9uZW50T3BlcmF0aW9uID0gcmVzb3VyY2VPcGVyYXRpb247CisJCQlicmVhazsKKwkJY2FzZSBTZXJ2aWNlOgorCQkJY29tcG9uZW50T3BlcmF0aW9uID0gc2VydmljZU9wZXJhdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIFByb2R1Y3Q6CisJCQljb21wb25lbnRPcGVyYXRpb24gPSBwcm9kdWN0T3BlcmF0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gY29tcG9uZW50T3BlcmF0aW9uOworCX0KKworCS8qKgorCSAqIGdldCBjb21wb25lbnRzIGZyb20gY2FjaGUgb2YgYSBnaXZlbiBsaXN0IG91IHVuaXF1ZSBpZHMuCisJICogCisJICogZm9yIGVhY2ggY29tcG9uZW50IGRhdGEgZnJvbSBjYXNzYW5kcmEsIHVuemlwIHRoZSBkYXRhIGlmIG5lZWRlZCBhbmQKKwkgKiBkZXNlcmlhbGl6ZSB0aGUgdW56aXBwZWQgZGF0YSB0byBqYXZhIG9iamVjdChDb21wb25lbnQpLgorCSAqIAorCSAqIEBwYXJhbSBmaWx0ZXJlZFJlc291cmNlcworCSAqIEByZXR1cm4gSW1tdXRhYmxlVHJpcHBsZSBvciBBY3Rpb25TdGF0dXMuIHwgfC0tIGNvbXBvbmVudHMgfC0tIHNldCBvZiBub24KKwkgKiAgICAgICAgIGNhY2hlZCBjb21wb25lbnRzCisJICogCisJICovCisJcHJpdmF0ZSBFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRzRnVsbCgKKwkJCU1hcDxTdHJpbmcsIExvbmc+IGZpbHRlcmVkUmVzb3VyY2VzKSB7CisKKwkJaWYgKGZhbHNlID09IGlzRW5hYmxlZCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIkNvbXBvbmVudCBDYWNoZSBpcyBkaXNhYmxlZCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQpOworCQl9CisKKwkJTGlzdDxDb21wb25lbnQ+IGZvdW5kUmVzb3VyY2VzID0gbmV3IExpbmtlZExpc3Q8PigpOworCQlTZXQ8U3RyaW5nPiBub3RGb3VuZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiByZXN1bHQgPSBuZXcgSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PigKKwkJCQlmb3VuZFJlc291cmNlcywgbm90Rm91bmRSZXNvdXJjZXMpOworCisJCWxvbmcgY2Fzc2FuZHJhRmV0Y2hTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50Q2FjaGVEYXRhPiwgU2V0PFN0cmluZz4+LCBBY3Rpb25TdGF0dXM+IGNvbXBvbmVudHNGcm9tQ2FjaGUgPSBjb21wb25lbnRDYXNzYW5kcmFEYW8KKwkJCQkuZ2V0Q29tcG9uZW50cyhmaWx0ZXJlZFJlc291cmNlcyk7CisKKwkJbG9uZyBjYXNzYW5kcmFGZXRjaEVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlsb2dnZXIuZGVidWcoIkZldGNoIHRpbWUgZnJvbSBjYXNzYW5kYXJhIG9mIGFsbCBjb21wb25lbnRzIHRvb2sge30gbXMiLAorCQkJCShjYXNzYW5kcmFGZXRjaEVuZCAtIGNhc3NhbmRyYUZldGNoU3RhcnQpKTsKKwkJaWYgKGNvbXBvbmVudHNGcm9tQ2FjaGUuaXNSaWdodCgpKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIkZldGNoRnJvbUNhY2hlIiwKKwkJCQkJIkZhaWxlZCB0byBmZXRjaCBjb21wb25lbnRzIGZyb20gY2FjaGUiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50c0Zyb21DYWNoZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudENhY2hlRGF0YT4sIFNldDxTdHJpbmc+PiBpbW11dGFibGVQYWlyID0gY29tcG9uZW50c0Zyb21DYWNoZS5sZWZ0KCkudmFsdWUoKTsKKwkJTGlzdDxDb21wb25lbnRDYWNoZURhdGE+IGxpc3QgPSBpbW11dGFibGVQYWlyLmdldExlZnQoKTsKKwkJbG9nZ2VyLmRlYnVnKCJOdW1iZXIgb2YgY29tcG9uZW50cyBmZXRjaGVkIGZyb20gY2Fzc2FuZHJhIGlzIHt9IiwgKGxpc3QgPT0gbnVsbCA/IDAgOiBsaXN0LnNpemUoKSkpOworCQlpZiAobGlzdCAhPSBudWxsICYmIGZhbHNlID09IGxpc3QuaXNFbXB0eSgpKSB7CisKKwkJCS8vIExpc3Q8Q29tcG9uZW50Q2FjaGVEYXRhPiBmaWx0ZXJlZERhdGEgPSBsaXN0LnN0cmVhbSgpLmZpbHRlcihwIC0+CisJCQkvLyBmaWx0ZXJlZFJlc291cmNlcy5jb250YWlucyhwLmdldElkKCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJbG9nZ2VyLmRlYnVnKCJOdW1iZXIgb2YgY29tcG9uZW50cyBmaWx0ZXJkIGlzIHt9IiwgbGlzdCA9PSBudWxsID8gMCA6IGxpc3Quc2l6ZSgpKTsKKworCQkJaWYgKGxpc3QgIT0gbnVsbCkgeworCQkJCWxvbmcgZGVzU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkJCWZvciAoQ29tcG9uZW50Q2FjaGVEYXRhIGNvbXBvbmVudENhY2hlRGF0YSA6IGxpc3QpIHsKKworCQkJCQlsb2dnZXIuZGVidWcoIlByb2Nlc3MgdWlkIHt9IGZyb20gY2FjaGUiLCBjb21wb25lbnRDYWNoZURhdGEuZ2V0SWQoKSk7CisKKwkJCQkJU3RyaW5nIGNvbXBVaWQgPSBjb21wb25lbnRDYWNoZURhdGEuZ2V0SWQoKTsKKworCQkJCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgQm9vbGVhbj4gZGVzZXJpYWxpemVFeHQgPSBjb252ZXJ0Q29tcG9uZW50Q2FjaGVUb0NvbXBvbmVudCgKKwkJCQkJCQljb21wb25lbnRDYWNoZURhdGEpOworCisJCQkJCWlmIChkZXNlcmlhbGl6ZUV4dC5pc0xlZnQoKSkgeworCQkJCQkJQ29tcG9uZW50IGNvbXBvbmVudCA9IGRlc2VyaWFsaXplRXh0LmxlZnQoKS52YWx1ZSgpOworCQkJCQkJZm91bmRSZXNvdXJjZXMuYWRkKGNvbXBvbmVudCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlub3RGb3VuZFJlc291cmNlcy5hZGQoY29tcFVpZCk7CisJCQkJCX0KKworCQkJCX0KKwkJCQlsb25nIGRlc0VuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCWxvZ2dlci5kZWJ1ZygiRGVzZXJpYWxpemF0aW9uIGFuZCB1bnppcCBvZiB7fSBjb21wb25lbnRzIHRvb2sge30gbXMiLCBsaXN0LnNpemUoKSwgKGRlc0VuZCAtIGRlc1N0YXJ0KSk7CisJCQl9CisJCX0KKwkJbG9nZ2VyLmRlYnVnKCJOdW1iZXIgb2YgcHJvY2Vzc2VkIGNvbXBvbmVudHMgZnJvbSBjYWNoZSBpcyB7fSIsIGZvdW5kUmVzb3VyY2VzLnNpemUoKSk7CisKKwkJU2V0PFN0cmluZz4gbm90Rm91bmRJbkNhY2hlID0gaW1tdXRhYmxlUGFpci5nZXRSaWdodCgpOworCQlub3RGb3VuZFJlc291cmNlcy5hZGRBbGwobm90Rm91bmRJbkNhY2hlKTsKKworCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGNvbXBvbmVudHMgZmV0Y2hlZCBpcyB7fSIsIGZvdW5kUmVzb3VyY2VzLnNpemUoKSk7CisJCQlsb2dnZXIuZGVidWcoIk51bWJlciBvZiBjb21wb25lbnRzIG5vbiBjYWNoZWQgaXMge30iLCBub3RGb3VuZFJlc291cmNlcy5zaXplKCkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJfQorCisJLyoqCisJICogZ2V0IGNvbXBvbmVudHMgZm9yIGNhdGFsb2cKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50cworCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlRW51bQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4sIEFjdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50c0ZvckNhdGFsb2coCisJCQlNYXA8U3RyaW5nLCBMb25nPiBjb21wb25lbnRzLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgeworCisJCWlmIChmYWxzZSA9PSBpc0VuYWJsZWQoKSkgeworCQkJbG9nZ2VyLmRlYnVnKCJJbiBnZXRDb21wb25lbnRzRm9yQ2F0YWxvZyBmb3IgdHlwZSB7fS4gQ2FjaGUgaXMgZGlzYWJsZWQuIiwKKwkJCQkJY29tcG9uZW50VHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQpOworCQl9CisJCWxvZ2dlci5kZWJ1ZygiSW4gZ2V0Q29tcG9uZW50c0ZvckNhdGFsb2cgZm9yIHR5cGUge30iLCBjb21wb25lbnRUeXBlRW51bS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisKKwkJRnVuY3Rpb248TGlzdDxDb21wb25lbnQ+LCBMaXN0PENvbXBvbmVudD4+IGZpbHRlckZpZWxkc0Z1bmMgPSB4IC0+IGZpbHRlckZvckNhdGFsb2coeCk7CisKKwkJTWFwPFN0cmluZywgTG9uZz4gbGVmdENvbXBvbmVudHNGb3JTZWFyY2ggPSBuZXcgSGFzaE1hcDw+KCk7CisJCWxlZnRDb21wb25lbnRzRm9yU2VhcmNoLnB1dEFsbChjb21wb25lbnRzKTsKKworCQkvLyBnZXQgY29tcG9uZW50cyBmcm9tIGlubWVtb3J5IGNhY2hlCisJCUxpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzRnJvbU1lbW9yeSA9IG51bGw7CisJCWlmICh0cnVlID09IGNhdGFsb2dJbk1lbW9yeUVuYWJsZWQpIHsKKwkJCWNvbXBvbmVudHNGcm9tTWVtb3J5ID0gZ2V0RGF0YUZyb21Jbk1lbW9yeUNhY2hlKGNvbXBvbmVudHMua2V5U2V0KCksIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJCWxvZ2dlci5kZWJ1ZygiVGhlIG51bWJlciBvZiBjb21wb25lbnRzIG9mIHR5cGUge30gZmV0Y2hlZCBmcm9tIG1lbW9yeSBpcyB7fSIsCisJCQkJCWNvbXBvbmVudFR5cGVFbnVtLm5hbWUoKS50b0xvd2VyQ2FzZSgpLAorCQkJCQljb21wb25lbnRzRnJvbU1lbW9yeSA9PSBudWxsID8gMCA6IGNvbXBvbmVudHNGcm9tTWVtb3J5LnNpemUoKSk7CisJCQlpZiAoY29tcG9uZW50c0Zyb21NZW1vcnkgIT0gbnVsbCkgeworCQkJCUxpc3Q8U3RyaW5nPiBpZ25vcmVkQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCWZvciAoQ29tcG9uZW50IGNvbXBvbmVudEZyb21NZW0gOiBjb21wb25lbnRzRnJvbU1lbW9yeSkgeworCQkJCQlpZiAoY29tcG9uZW50RnJvbU1lbS5nZXRMYXN0VXBkYXRlRGF0ZSgpLmxvbmdWYWx1ZSgpICE9IGNvbXBvbmVudHMKKwkJCQkJCQkuZ2V0KGNvbXBvbmVudEZyb21NZW0uZ2V0VW5pcXVlSWQoKSkubG9uZ1ZhbHVlKCkpIHsKKwkJCQkJCS8vIElnbm9yZSB0aGUgY29tcG9uZW50IGZyb20gbWVtb3J5CisJCQkJCQlpZ25vcmVkQ29tcG9uZW50cy5hZGQoY29tcG9uZW50RnJvbU1lbS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWxvZ2dlci5kZWJ1ZygiTnVtYmVyIG9mIGNvbXBvbmVudHMgZnJvbSB0eXBlIHt9IGlnbm9yZWQgZnJvbSBtZW1vcnkgY2FjaGUgaXMge30iLAorCQkJCQkJY29tcG9uZW50VHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCksIGlnbm9yZWRDb21wb25lbnRzLnNpemUoKSk7CisJCQkJLy8gcmVtb3ZlIGZyb20gbWVtb3J5IHJlc3VsdCB0aGUgY29tcG9uZW50cyB3aGljaCBhcmUgbm90IHZhbGlkCisJCQkJY29tcG9uZW50c0Zyb21NZW1vcnkgPSBjb21wb25lbnRzRnJvbU1lbW9yeS5zdHJlYW0oKQorCQkJCQkJLmZpbHRlcihwIC0+IGZhbHNlID09IGlnbm9yZWRDb21wb25lbnRzLmNvbnRhaW5zKHAuZ2V0VW5pcXVlSWQoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkJLy8gUmVtb3ZlIGZyb20gbGVmdENvbXBvbmVudHNGb3JTZWFyY2ggdGhlIHZhbGlkIGNvbXBvbmVudHMgZnJvbQorCQkJCS8vIG1lbW9yeQorCQkJCWNvbXBvbmVudHNGcm9tTWVtb3J5LmZvckVhY2gocCAtPiBsZWZ0Q29tcG9uZW50c0ZvclNlYXJjaC5yZW1vdmUocC5nZXRVbmlxdWVJZCgpKSk7CisKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ2dlci5kZWJ1ZygiQ2F0YWxvZyBJbk1lbW9yeSBjYWNoZSBpcyBkaXNhYmxlZCIpOworCQl9CisKKwkJbG9nZ2VyLmRlYnVnKCJOdW1iZXIgb2YgY29tcG9uZW50cyBmcm9tIHR5cGUge30gbmVlZGVkIHRvIGZldGNoIGlzIHt9IiwgY29tcG9uZW50VHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCksCisJCQkJbGVmdENvbXBvbmVudHNGb3JTZWFyY2guc2l6ZSgpKTsKKworCQkvLyBnZXQgY29tcG9uZW50cyBmcm9tIGNhc3NhbmRyYSBjYWNoZSBhbmQgZmlsdGVyIGVhY2ggY29tcG9uZW50CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50PiwgU2V0PFN0cmluZz4+LCBBY3Rpb25TdGF0dXM+IHJlc3VsdCA9IGdldENvbXBvbmVudHMoCisJCQkJbGVmdENvbXBvbmVudHNGb3JTZWFyY2gsIGZpbHRlckZpZWxkc0Z1bmMpOworCisJCWlmIChyZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCS8vIGFkZCBpbm1lbW9yeSBjb21wb25lbnRzIHRvIHRoZSB2YWxpZCBjb21wb25lbnRzKG5vdCBkaXJ0eSkKKwkJCUxpc3Q8Q29tcG9uZW50PiBmb3VuZENvbXBvbmVudHMgPSByZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpOworCQkJaWYgKGNvbXBvbmVudHNGcm9tTWVtb3J5ICE9IG51bGwpIHsKKwkJCQlmb3VuZENvbXBvbmVudHMuYWRkQWxsKGNvbXBvbmVudHNGcm9tTWVtb3J5KTsKKwkJCX0KKwkJCWlmICh0cnVlID09IGNhdGFsb2dJbk1lbW9yeUVuYWJsZWQpIHsKKwkJCQl1cGRhdGVDYXRhbG9nSW5NZW1vcnlDYWNoZVdpdGhDZXJ0aWZpZWQoZm91bmRDb21wb25lbnRzLCBjb21wb25lbnRUeXBlRW51bSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBjb21wb25lbnRzCisJICogICAgICAgICAgICAtIE1hcCBvZiA8Y29tcG9uZW50VW5pcXVlSWQsIGxhc3QgdXBkYXRlIGRhdGU+CisJICogQHBhcmFtIGZpbHRlckZpZWxkc0Z1bmMKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50PiwgU2V0PFN0cmluZz4+LCBBY3Rpb25TdGF0dXM+IGdldENvbXBvbmVudHMoTWFwPFN0cmluZywgTG9uZz4gY29tcG9uZW50cywKKwkJCUZ1bmN0aW9uPExpc3Q8Q29tcG9uZW50PiwgTGlzdDxDb21wb25lbnQ+PiBmaWx0ZXJGaWVsZHNGdW5jKSB7CisKKwkJaWYgKGZhbHNlID09IGlzRW5hYmxlZCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIkNvbXBvbmVudCBDYWNoZSBpcyBkaXNhYmxlZCIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQpOworCQl9CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50c0Z1bGwgPSBnZXRDb21wb25lbnRzRnVsbCgKKwkJCQljb21wb25lbnRzKTsKKworCQlpZiAoY29tcG9uZW50c0Z1bGwuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNGdWxsLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50PiwgU2V0PFN0cmluZz4+IGltbXV0YWJsZVBhaXIgPSBjb21wb25lbnRzRnVsbC5sZWZ0KCkudmFsdWUoKTsKKwkJTGlzdDxDb21wb25lbnQ+IGZvdW5kUmVzb3VyY2VzID0gaW1tdXRhYmxlUGFpci5sZWZ0OworCQlTZXQ8U3RyaW5nPiBub3RGb3VuZFJlc291cmNlcyA9IGltbXV0YWJsZVBhaXIucmlnaHQ7CisKKwkJTGlzdDxDb21wb25lbnQ+IGZpbHRlcmRGb3VuZFJlc291cmNlcyA9IGZpbHRlckZpZWxkc0Z1bmMuYXBwbHkoZm91bmRSZXNvdXJjZXMpOworCisJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4gcmVzdWx0ID0gbmV3IEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4oCisJCQkJZmlsdGVyZEZvdW5kUmVzb3VyY2VzLCBub3RGb3VuZFJlc291cmNlcyk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisKKwl9CisKKwkvKioKKwkgKiBnZXQgdGhlIGNvbXBvbmVudCBhbmQgaXRzIG1vZGlmaWNhdGlvbiB0aW1lIGZyb20gY2FjaGUKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50VWlkCisJICogQHBhcmFtIGZpbHRlckZpZWxkc0Z1bmMKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPENvbXBvbmVudCwgTG9uZz4sIEFjdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50QW5kVGltZShTdHJpbmcgY29tcG9uZW50VWlkLAorCQkJRnVuY3Rpb248Q29tcG9uZW50LCBDb21wb25lbnQ+IGZpbHRlckZpZWxkc0Z1bmMpIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxDb21wb25lbnQsIENvbXBvbmVudENhY2hlRGF0YT4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50RnJvbUNhY2hlID0gZ2V0Q29tcG9uZW50RnJvbUNhY2hlKAorCQkJCWNvbXBvbmVudFVpZCwgbnVsbCwgZmlsdGVyRmllbGRzRnVuYyk7CisKKwkJaWYgKGNvbXBvbmVudEZyb21DYWNoZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50RnJvbUNhY2hlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlJbW11dGFibGVQYWlyPENvbXBvbmVudCwgQ29tcG9uZW50Q2FjaGVEYXRhPiBpbW11dGFibGVQYWlyID0gY29tcG9uZW50RnJvbUNhY2hlLmxlZnQoKS52YWx1ZSgpOworCisJCUltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBMb25nPiByZXN1bHQgPSBuZXcgSW1tdXRhYmxlUGFpcjxDb21wb25lbnQsIExvbmc+KGltbXV0YWJsZVBhaXIubGVmdCwKKwkJCQlpbW11dGFibGVQYWlyLnJpZ2h0LmdldE1vZGlmaWNhdGlvblRpbWUoKS5nZXRUaW1lKCkpOworCisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBDb21wb25lbnRDYWNoZURhdGE+LCBBY3Rpb25TdGF0dXM+IGdldENvbXBvbmVudEZyb21DYWNoZSgKKwkJCVN0cmluZyBjb21wb25lbnRVaWQsIExvbmcgbGFzdE1vZGlmaWNhdGlvblRpbWUsIEZ1bmN0aW9uPENvbXBvbmVudCwgQ29tcG9uZW50PiBmaWx0ZXJGaWVsZHNGdW5jKSB7CisJCWlmIChmYWxzZSA9PSBpc0VuYWJsZWQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuTk9UX0FMTE9XRUQpOworCQl9CisKKwkJRWl0aGVyPENvbXBvbmVudENhY2hlRGF0YSwgQWN0aW9uU3RhdHVzPiBjb21wb25lbnRSZXMgPSBjb21wb25lbnRDYXNzYW5kcmFEYW8uZ2V0Q29tcG9uZW50KGNvbXBvbmVudFVpZCk7CisKKwkJaWYgKGNvbXBvbmVudFJlcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50UmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlDb21wb25lbnRDYWNoZURhdGEgY29tcG9uZW50Q2FjaGVEYXRhID0gY29tcG9uZW50UmVzLmxlZnQoKS52YWx1ZSgpOworCisJCWlmIChsYXN0TW9kaWZpY2F0aW9uVGltZSAhPSBudWxsKSB7CisJCQlsb25nIGNhY2hlQ29tcE1vZGlmaWNhdGlvblRpbWUgPSBjb21wb25lbnRDYWNoZURhdGEuZ2V0TW9kaWZpY2F0aW9uVGltZSgpLmdldFRpbWUoKTsKKwkJCWlmIChsYXN0TW9kaWZpY2F0aW9uVGltZSAhPSBjYWNoZUNvbXBNb2RpZmljYXRpb25UaW1lKSB7CisJCQkJbG9nZ2VyLmRlYnVnKAorCQkJCQkJIkNvbXBvbmVudCB7fSBmb3VuZCBpbiBjYWNoZSBidXQgaXRzIG1vZGlmaWNhdGlvbiB0aW1lIHt9IGRvZXMgbm90IG1hdGNoIHRvIHRoZSB0aW1lc3RhbXAgaW4gY2FjaGUge30uIiwKKwkJCQkJCWNvbXBvbmVudFVpZCwgbGFzdE1vZGlmaWNhdGlvblRpbWUsIGNhY2hlQ29tcE1vZGlmaWNhdGlvblRpbWUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLklOVkFMSURfQ09OVEVOVCk7CisJCQl9CisJCX0KKworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgQm9vbGVhbj4gY29udmVydFJlcyA9IGNvbnZlcnRDb21wb25lbnRDYWNoZVRvQ29tcG9uZW50KGNvbXBvbmVudENhY2hlRGF0YSk7CisJCWlmIChjb252ZXJ0UmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuQ09OVkVSVF9DT01QT05FTlRfRVJST1IpOworCQl9CisKKwkJQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbnZlcnRSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJQ29tcG9uZW50IGZpbHRlcmVkQ29tcG9uZW50ID0gY29tcG9uZW50OworCQlpZiAoZmlsdGVyRmllbGRzRnVuYyAhPSBudWxsKSB7CisJCQlmaWx0ZXJlZENvbXBvbmVudCA9IGZpbHRlckZpZWxkc0Z1bmMuYXBwbHkoY29tcG9uZW50KTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8Q29tcG9uZW50LCBDb21wb25lbnRDYWNoZURhdGE+IHJlc3VsdCA9IG5ldyBJbW11dGFibGVQYWlyPENvbXBvbmVudCwgQ29tcG9uZW50Q2FjaGVEYXRhPigKKwkJCQlmaWx0ZXJlZENvbXBvbmVudCwgY29tcG9uZW50Q2FjaGVEYXRhKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwlwdWJsaWMgQWN0aW9uU3RhdHVzIGRlbGV0ZUNvbXBvbmVudEZyb21DYWNoZShTdHJpbmcgaWQpIHsKKwkJaWYgKGZhbHNlID09IGlzRW5hYmxlZCgpKSB7CisJCQlyZXR1cm4gQWN0aW9uU3RhdHVzLk5PVF9BTExPV0VEOworCQl9CisJCUNhc3NhbmRyYU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSB0aGlzLmNvbXBvbmVudENhc3NhbmRyYURhby5kZWxldGVDb21wb25lbnQoaWQpOworCQlpZiAoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzLk9LLmVxdWFscyhzdGF0dXMpKSB7CisJCQlyZXR1cm4gQWN0aW9uU3RhdHVzLk9LOworCQl9IGVsc2UgeworCQkJbG9nZ2VyLmRlYnVnKCJkZWxldGUgY29tcG9uZW50IGZhaWxlZCB3aXRoIGVycm9yIHt9Iiwgc3RhdHVzKTsKKwkJCXJldHVybiBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL0Rhb0luZm8uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS9EYW9JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2M2IzNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS9EYW9JbmZvLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVByb2R1Y3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklTZXJ2aWNlT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgRGFvSW5mbyB7CisJcHJpdmF0ZSBJUmVzb3VyY2VPcGVyYXRpb24gaVJlc291cmNlT3BlcmF0aW9uOworCXByaXZhdGUgSVNlcnZpY2VPcGVyYXRpb24gaVNlcnZpY2VPcGVyYXRpb247CisJcHJpdmF0ZSBJUHJvZHVjdE9wZXJhdGlvbiBpUHJvZHVjdE9wZXJhdGlvbjsKKwlwcml2YXRlIENvbXBvbmVudENhY2hlIENvbXBvbmVudENhY2hlOworCisJcHVibGljIERhb0luZm8oSVJlc291cmNlT3BlcmF0aW9uIGlSZXNvdXJjZU9wZXJhdGlvbiwgSVNlcnZpY2VPcGVyYXRpb24gaVNlcnZpY2VPcGVyYXRpb24sCisJCQlJUHJvZHVjdE9wZXJhdGlvbiBpUHJvZHVjdE9wZXJhdGlvbiwgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQ29tcG9uZW50Q2FjaGUgY29tcG9uZW50Q2FjaGUpIHsKKwkJdGhpcy5pUmVzb3VyY2VPcGVyYXRpb24gPSBpUmVzb3VyY2VPcGVyYXRpb247CisJCXRoaXMuaVNlcnZpY2VPcGVyYXRpb24gPSBpU2VydmljZU9wZXJhdGlvbjsKKwkJdGhpcy5pUHJvZHVjdE9wZXJhdGlvbiA9IGlQcm9kdWN0T3BlcmF0aW9uOworCQlDb21wb25lbnRDYWNoZSA9IGNvbXBvbmVudENhY2hlOworCX0KKworCXB1YmxpYyBJUmVzb3VyY2VPcGVyYXRpb24gZ2V0UmVzb3VyY2VPcGVyYXRpb24oKSB7CisJCXJldHVybiBpUmVzb3VyY2VPcGVyYXRpb247CisJfQorCisJcHVibGljIElTZXJ2aWNlT3BlcmF0aW9uIGdldFNlcnZpY2VPcGVyYXRpb24oKSB7CisJCXJldHVybiBpU2VydmljZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgSVByb2R1Y3RPcGVyYXRpb24gZ2V0UHJvZHVjdE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIGlQcm9kdWN0T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5Db21wb25lbnRDYWNoZSBnZXRDb21wb25lbnRDYWNoZSgpIHsKKwkJcmV0dXJuIENvbXBvbmVudENhY2hlOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS9qb2JzL0NoZWNrQW5kVXBkYXRlSm9iLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9DaGVja0FuZFVwZGF0ZUpvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjQ5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9DaGVja0FuZFVwZGF0ZUpvYi5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuam9iczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLkRhb0luZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworLyoqCisgKiBDcmVhdGVkIGJ5IG1sYW5kbyBvbiA5LzcvMjAxNi4KKyAqLworcHVibGljIGNsYXNzIENoZWNrQW5kVXBkYXRlSm9iIGV4dGVuZHMgSm9iIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2hlY2tBbmRVcGRhdGVKb2IuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBDaGVja0FuZFVwZGF0ZUpvYihEYW9JbmZvIGRhb0luZm8sIFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSwgbG9uZyB0aW1lc3RhbXApIHsKKwkJc3VwZXIoZGFvSW5mbywgY29tcG9uZW50SWQsIG5vZGVUeXBlRW51bSwgdGltZXN0YW1wKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGRvV29yaygpIHsKKwkJbG9nLnRyYWNlKCJzdGFydGluZyB3b3JrIG9uIGpvYi4iKTsKKwkJbG9nLnRyYWNlKCJ1cGRhdGUgY2FjaGUgZm9yIGNvbXBvbmVudElkOnt9IG9mIG5vZGVUeXBlRW51bTp7fSB3aXRoIHRpbWVzdGFtcDp7fS4iLCBjb21wb25lbnRJZCwgbm9kZVR5cGVFbnVtLAorCQkJCXRpbWVzdGFtcCk7CisKKwkJdHJ5IHsKKworCQkJLy8gZ2V0IGZyb20gY2FjaGUKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPENvbXBvbmVudCwgTG9uZz4sIEFjdGlvblN0YXR1cz4gY2FjaGVSZXN1bHQgPSBkYW9JbmZvLmdldENvbXBvbmVudENhY2hlKCkKKwkJCQkJLmdldENvbXBvbmVudEFuZFRpbWUoY29tcG9uZW50SWQsIEZ1bmN0aW9uLmlkZW50aXR5KCkpOworCQkJLy8gaWYgZXJyb3Igd2hpbGUgZ2V0dGluZyBmcm9tIGNhY2hlIGFib3J0IGFuZCB1cGRhdGUKKwkJCWlmIChjYWNoZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkvLyBnZW5yYWwgZXJyb3IKKwkJCQlpZiAoIUFjdGlvblN0YXR1cy5SRVNPVVJDRV9OT1RfRk9VTkQuZXF1YWxzKGNhY2hlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkKKwkJCQkJCSYmICFBY3Rpb25TdGF0dXMuSU5WQUxJRF9DT05URU5ULmVxdWFscyhjYWNoZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBjb21wb25lbnQ6e30gZnJvbSBjYWNoZSBlcnJvcjp7fSIsIGNvbXBvbmVudElkLAorCQkJCQkJCWNhY2hlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJLy8gY29tcG9uZW50IG5vdCBpbiBjYWNoZSBwdXQgdGhlcmUKKwkJCQllbHNlIHsKKwkJCQkJcmV0dXJuIHVwZGF0ZUNhY2hlKGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0sIHRpbWVzdGFtcCk7CisJCQkJfQorCQkJfQorCQkJSW1tdXRhYmxlUGFpcjxDb21wb25lbnQsIExvbmc+IHJlY29yZWQgPSBjYWNoZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCS8vIHRoZSBjYWNoZSBoYXMgYWxscmVhZHkgYmVlbiB1cGRhdGVkIGV4aXQKKwkJCWlmICh0aGlzLnRpbWVzdGFtcCA8IHJlY29yZWQuZ2V0UmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1Zygiam9iIHRpbWVzdGVtcDp7fSBpcyBzbWFsbGVyIHRoZW4gdGhlIGNhY2hlIHRpbWVzdGFtcDp7fSBubyB1cGRhdGUgaXMgbmVlZGVkLiIsCisJCQkJCQl0aGlzLnRpbWVzdGFtcCwgcmVjb3JlZC5nZXRSaWdodCgpKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdXBkYXRlQ2FjaGUoY29tcG9uZW50SWQsIG5vZGVUeXBlRW51bSwgdGltZXN0YW1wKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJhbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIGR1cmluZyBDaGVja0FuZFVwZGF0ZUpvYiIsIGUpOworCQl9IGZpbmFsbHkgeworCQkJZGFvSW5mby5nZXRSZXNvdXJjZU9wZXJhdGlvbigpLmdldFRpdGFuR2VuZXJpY0RhbygpLmNvbW1pdCgpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29tcG9uZW50SWQKKwkgKiBAcGFyYW0gbm9kZVR5cGVFbnVtCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVDYWNoZShTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIExvbmcgdGltZXN0YW1wKSB7CisJCS8vIGdldCBjb21wb25lbnQgZnJvbSBjYWNoZQorCQlFaXRoZXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBtZXRhRGF0YVJlcyA9IGdldENvbXBvbmVudE1ldGFEYXRhKGNvbXBvbmVudElkLAorCQkJCW5vZGVUeXBlRW51bSk7CisJCWlmIChtZXRhRGF0YVJlcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlDb21wb25lbnRNZXRhZGF0YURhdGEgbWV0YURhdGEgPSBtZXRhRGF0YVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJLy8gdGhlIGpvYiB0aW1lIGlzIG9sZGVyIHRoZW4gdGhlIG9uZSBvbiBncmFwaCBub3RoaW5nIHRvIGRvIHRoZXJlIGlzIGEKKwkJLy8gam9iIHRoYXQgd2lsbCBoYW5kbGUgdGhpcy4KKwkJTG9uZyBncmFwaFRpbWVzdGFtcCA9IG1ldGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRMYXN0VXBkYXRlRGF0ZSgpOworCQlpZiAodGltZXN0YW1wIDwgZ3JhcGhUaW1lc3RhbXApIHsKKwkJCWxvZy5kZWJ1ZygKKwkJCQkJInRoZSBqb2IgdGltZXN0YW1wOnt9IGlzIHNtYWxsZXIgdGhlbiB0aGUgZ3JhcGggdGltZXN0YW1wOnt9LiBleGl0aW5nIGJlY2F1c2UgYW5vdGhlciBqb2Igd2lsbCB1cGRhdGUgdGhlIGNhY2hlLiIsCisJCQkJCXRpbWVzdGFtcCwgZ3JhcGhUaW1lc3RhbXApOworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJLy8gdXBkYXRlIGNhY2hlCisJCQkvLyBnZXQgY29tcG9uZW50IGZyb20gZ3JhdGgKKwkJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudFJlcyA9IGdldE9wZXJhdGlvbkJ5VHlwZShub2RlVHlwZUVudW0pCisJCQkJCS5nZXRDb21wb25lbnQoY29tcG9uZW50SWQsIHRydWUpOworCQkJaWYgKGNvbXBvbmVudFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgZnVsbCBjb21wb25lbnQ6e30gZnJvbSBncmFwaCBzdGF0dXM6e30iLCBjb21wb25lbnRJZCwKKwkJCQkJCWNvbXBvbmVudFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCUNvbXBvbmVudCBjb21wb25lbnQgPSBjb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkvLyBzdG9yZSBpbiBjYWNoZQorCQkJaWYgKCF0aGlzLmRhb0luZm8uZ2V0Q29tcG9uZW50Q2FjaGUoKS5zZXRDb21wb25lbnQoY29tcG9uZW50LCBub2RlVHlwZUVudW0pKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gc3RvcmUgY29tcG9uZW50SWQ6e30gbm9kZVR5cGVFbnVtOiIsIGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0pOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlsb2cuZGVidWcoImNhY2hlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIGZvciBjb21wb25lbnRJZDp7fSBub2RlVHlwZUVudW06e30gdGltZXN0ZW1wOnt9LiIsIGNvbXBvbmVudElkLAorCQkJCW5vZGVUeXBlRW51bSwgdGltZXN0YW1wKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9EZWxldGVKb2IuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS9qb2JzL0RlbGV0ZUpvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWE1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9EZWxldGVKb2IuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuam9iczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuRGFvSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogQ3JlYXRlZCBieSBtbGFuZG8gb24gOS8yMC8yMDE2LgorICovCitwdWJsaWMgY2xhc3MgRGVsZXRlSm9iIGV4dGVuZHMgSm9iIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGVsZXRlSm9iLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgRGVsZXRlSm9iKERhb0luZm8gZGFvSW5mbywgU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtLCBsb25nIHRpbWVzdGFtcCkgeworCQlzdXBlcihkYW9JbmZvLCBjb21wb25lbnRJZCwgbm9kZVR5cGVFbnVtLCB0aW1lc3RhbXApOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBkb1dvcmsoKSB7CisJCXRyeSB7CisJCQlsb2cudHJhY2UoInN0YXJ0aW5nIHdvcmsgb24gam9iLiIpOworCQkJbG9nLnRyYWNlKCJkZWxldGUgY29tcG9uZW50IGluIGNhY2hlLCBjb21wb25lbnRJZDp7fSBvZiBub2RlVHlwZUVudW06e30gd2l0aCB0aW1lc3RhbXA6e30uIiwgY29tcG9uZW50SWQsCisJCQkJCW5vZGVUeXBlRW51bSwgdGltZXN0YW1wKTsKKwkJCUFjdGlvblN0YXR1cyBzdGF0dXMgPSB0aGlzLmRhb0luZm8uZ2V0Q29tcG9uZW50Q2FjaGUoKS5kZWxldGVDb21wb25lbnRGcm9tQ2FjaGUoY29tcG9uZW50SWQpOworCQkJaWYgKCFBY3Rpb25TdGF0dXMuT0suZXF1YWxzKHN0YXR1cykpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBkZWxldGUgY29tcG9uZW50SWQ6e30gbm9kZVR5cGVFbnVtOiIsIGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0pOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWxvZy50cmFjZSgiY2FjaGUgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgIGNvbXBvbmVudElkOnt9IG5vZGVUeXBlRW51bTp7fSB0aW1lc3RhbXA6e30uIiwgY29tcG9uZW50SWQsCisJCQkJCW5vZGVUeXBlRW51bSwgdGltZXN0YW1wKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJhbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIGR1cnJpbmcgZGVsZXRlam9iIiwgZSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL2pvYnMvSm9iLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9Kb2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVkYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL2pvYnMvSm9iLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5qb2JzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuRGFvSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKb2I8RT4geworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihKb2IuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcm90ZWN0ZWQgRGFvSW5mbyBkYW9JbmZvOworCXByb3RlY3RlZCBTdHJpbmcgY29tcG9uZW50SWQ7CisJcHJvdGVjdGVkIGxvbmcgdGltZXN0YW1wOworCXByb3RlY3RlZCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtOworCisJcHJvdGVjdGVkIEpvYihEYW9JbmZvIGRhb0luZm8sIFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSwgbG9uZyB0aW1lc3RhbXApIHsKKwkJdGhpcy5kYW9JbmZvID0gZGFvSW5mbzsKKwkJdGhpcy5jb21wb25lbnRJZCA9IGNvbXBvbmVudElkOworCQl0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwkJdGhpcy5ub2RlVHlwZUVudW0gPSBub2RlVHlwZUVudW07CisJfQorCisJcHJvdGVjdGVkIEpvYihEYW9JbmZvIGRhb0luZm8sIENvbXBvbmVudCBjb21wb25lbnQsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0pIHsKKwkJdGhpcy5kYW9JbmZvID0gZGFvSW5mbzsKKwkJdGhpcy5jb21wb25lbnRJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQl0aGlzLnRpbWVzdGFtcCA9IGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlRGF0ZSgpOworCQl0aGlzLm5vZGVUeXBlRW51bSA9IG5vZGVUeXBlRW51bTsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgRSBkb1dvcmsoKTsKKworCXByb3RlY3RlZCBJQ29tcG9uZW50T3BlcmF0aW9uIGdldE9wZXJhdGlvbkJ5VHlwZShOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCUlDb21wb25lbnRPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKKwkJc3dpdGNoIChub2RlVHlwZUVudW0pIHsKKwkJY2FzZSBQcm9kdWN0OgorCQkJb3BlcmF0aW9uID0gZGFvSW5mby5nZXRQcm9kdWN0T3BlcmF0aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSBTZXJ2aWNlOgorCQkJb3BlcmF0aW9uID0gZGFvSW5mby5nZXRTZXJ2aWNlT3BlcmF0aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSBSZXNvdXJjZToKKwkJCW9wZXJhdGlvbiA9IGRhb0luZm8uZ2V0UmVzb3VyY2VPcGVyYXRpb24oKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbG9nLmVycm9yKCJ1bmV4cGVjdGVkIE5vZGVUeXBlIHJlY2VpdmVkIG5vIG1hdGNoaW5nIG9wZXJhdGlvbiBmb3VuZC4iKTsKKwkJfQorCQlyZXR1cm4gb3BlcmF0aW9uOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRNZXRhRGF0YShTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG1ldGFEYXRhUmVzID0gZ2V0T3BlcmF0aW9uQnlUeXBlKG5vZGVUeXBlRW51bSkKKwkJCQkuZ2V0Q29tcG9uZW50QnlMYWJlbEFuZElkKGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0sIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChtZXRhRGF0YVJlcy5pc1JpZ2h0KCkpIHsKKwkJCS8vIGluIGNhc2Ugd2UgY2FudCBmaW5kIHRoZSBjb21wb25lbnQgb24gZ3JhcGggZXhpdAorCQkJaWYgKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELmVxdWFscyhtZXRhRGF0YVJlcy5yaWdodCgpLnZhbHVlKCkpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gbG9jYXRlIGNvbXBvbmVudDp7fSBvbiBncmFwaCBzdGF0dXM6e30iLCBjb21wb25lbnRJZCwgbWV0YURhdGFSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGNvbXBvbmVudDp7fSBmcm9tIGdyYXBoIHN0YXR1czp7fSIsIGNvbXBvbmVudElkLCBtZXRhRGF0YVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCXJldHVybiBtZXRhRGF0YVJlczsKKwl9CisKKwlwcm90ZWN0ZWQgTm9kZVR5cGVFbnVtIGdldE5vZGVUeXBlRnJvbUNvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZUVudW0gdHlwZSkgeworCQlOb2RlVHlwZUVudW0gcmVzdWx0ID0gbnVsbDsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgUFJPRFVDVDoKKwkJCXJlc3VsdCA9IE5vZGVUeXBlRW51bS5Qcm9kdWN0OworCQkJYnJlYWs7CisJCWNhc2UgUkVTT1VSQ0U6CisJCQlyZXN1bHQgPSBOb2RlVHlwZUVudW0uUmVzb3VyY2U7CisJCQlicmVhazsKKwkJY2FzZSBTRVJWSUNFOgorCQkJcmVzdWx0ID0gTm9kZVR5cGVFbnVtLlNlcnZpY2U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKworCQl9CisJCXJldHVybiByZXN1bHQ7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9PdmVycmlkZUpvYi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL2pvYnMvT3ZlcnJpZGVKb2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWRhNjhlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL2pvYnMvT3ZlcnJpZGVKb2IuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuam9iczsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuRGFvSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogQ3JlYXRlZCBieSBtbGFuZG8gb24gOS8yMC8yMDE2LgorICovCitwdWJsaWMgY2xhc3MgT3ZlcnJpZGVKb2IgZXh0ZW5kcyBKb2IgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPdmVycmlkZUpvYi5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIE92ZXJyaWRlSm9iKERhb0luZm8gZGFvSW5mbywgU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtLCBsb25nIHRpbWVzdGFtcCkgeworCQlzdXBlcihkYW9JbmZvLCBjb21wb25lbnRJZCwgbm9kZVR5cGVFbnVtLCB0aW1lc3RhbXApOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBkb1dvcmsoKSB7CisJCXRyeSB7CisJCQlsb2cudHJhY2UoInN0YXJ0aW5nIHdvcmsgb24gam9iLiIpOworCQkJbG9nLnRyYWNlKCJvdmVycmlkZSBjb21wb25lbnQgaW4gY2FjaGUsIGNvbXBvbmVudElkOnt9IG9mIG5vZGVUeXBlRW51bTp7fSB3aXRoIHRpbWVzdGFtcDp7fS4iLCBjb21wb25lbnRJZCwKKwkJCQkJbm9kZVR5cGVFbnVtLCB0aW1lc3RhbXApOworCQkJLy8gZ2V0IGNvbXBvbmVudCBmcm9tIGdyYXRoCisJCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRSZXMgPSBnZXRPcGVyYXRpb25CeVR5cGUobm9kZVR5cGVFbnVtKQorCQkJCQkuZ2V0Q29tcG9uZW50KGNvbXBvbmVudElkLCBmYWxzZSk7CisJCQlpZiAoY29tcG9uZW50UmVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBmdWxsIGNvbXBvbmVudDp7fSBmcm9tIGdyYXBoIHN0YXR1czp7fSIsIGNvbXBvbmVudElkLAorCQkJCQkJY29tcG9uZW50UmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbXBvbmVudFJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCS8vIHN0b3JlIGluIGNhY2hlCisJCQlpZiAoIXRoaXMuZGFvSW5mby5nZXRDb21wb25lbnRDYWNoZSgpLnNldENvbXBvbmVudChjb21wb25lbnQsIG5vZGVUeXBlRW51bSkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBzdG9yZSBjb21wb25lbnRJZDp7fSBub2RlVHlwZUVudW06IiwgY29tcG9uZW50SWQsIG5vZGVUeXBlRW51bSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJbG9nLmRlYnVnKCJjYWNoZSBzdWNjZXNzZnVsbHkgb3ZlcnJpZGVkICBjb21wb25lbnRJZDp7fSBub2RlVHlwZUVudW06e30gdGltZXN0ZW1wOnt9LiIsIGNvbXBvbmVudElkLAorCQkJCQlub2RlVHlwZUVudW0sIHRpbWVzdGFtcCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiYW4gZXhjZXB0aW9uIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgT3ZlcnJpZGVKb2IiLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMuZGFvSW5mby5nZXRSZXNvdXJjZU9wZXJhdGlvbigpLmdldFRpdGFuR2VuZXJpY0RhbygpLmNvbW1pdCgpOworCQl9CisJCXJldHVybiBmYWxzZTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS9qb2JzL1N0b3JlSm9iLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9TdG9yZUpvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGE1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvam9icy9TdG9yZUpvYi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5qb2JzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuRGFvSW5mbzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIENyZWF0ZWQgYnkgbWxhbmRvIG9uIDkvMTEvMjAxNi4KKyAqLworcHVibGljIGNsYXNzIFN0b3JlSm9iIGV4dGVuZHMgSm9iIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RvcmVKb2IuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIENvbXBvbmVudCBjb21wb25lbnQ7CisKKwlwdWJsaWMgU3RvcmVKb2IoRGFvSW5mbyBkYW9JbmZvLCBDb21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCXN1cGVyKGRhb0luZm8sIGNvbXBvbmVudCwgbm9kZVR5cGVFbnVtKTsKKwkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBkb1dvcmsoKSB7CisJCXRyeSB7CisJCQlsb2cudHJhY2UoInN0YXJ0aW5nIHdvcmsgb24gam9iLiIpOworCQkJbG9nLnRyYWNlKCJzdG9yZSBjb21wb25lbnQgaW4gY2FjaGUsIGNvbXBvbmVudElkOnt9IG9mIG5vZGVUeXBlRW51bTp7fSB3aXRoIHRpbWVzdGFtcDp7fS4iLCBjb21wb25lbnRJZCwKKwkJCQkJbm9kZVR5cGVFbnVtLCB0aW1lc3RhbXApOworCQkJaWYgKCF0aGlzLmRhb0luZm8uZ2V0Q29tcG9uZW50Q2FjaGUoKS5zZXRDb21wb25lbnQoY29tcG9uZW50LCBub2RlVHlwZUVudW0pKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gc3RvcmUgY29tcG9uZW50SWQ6e30gbm9kZVR5cGVFbnVtOiIsIGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0pOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiY2FjaGUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgZm9yIGNvbXBvbmVudElkOnt9IG5vZGVUeXBlRW51bTp7fSB0aW1lc3RlbXA6e30uIiwgY29tcG9uZW50SWQsCisJCQkJCW5vZGVUeXBlRW51bSwgdGltZXN0YW1wKTsKKwkJCXJldHVybiB0cnVlOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoImFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIFN0b3JlSm9iIiwgZSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhY2hlL3dvcmtlcnMvQ2FjaGVXb3JrZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS93b3JrZXJzL0NhY2hlV29ya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2ZmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS93b3JrZXJzL0NhY2hlV29ya2VyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLndvcmtlcnM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS53b3JrZXJzLklXb3JrZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUud29ya2Vycy5Xb3JrZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQ3JlYXRlZCBieSBtbGFuZG8gb24gOS82LzIwMTYuIHRoZSBjbGFzcyByZXByZXNlbnRzIGEgd29ya2VyIHRoZSBwdWxsIGpvYgorICogZnJvbSBhIHF1ZXVlIGFuZCBldmFjdWF0ZXMgdGhlbS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZVdvcmtlciBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBJV29ya2VyIHsKKwlwcml2YXRlIFN0cmluZyB3b3JrZXJOYW1lOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihXb3JrZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIExpbmtlZEJsb2NraW5nUXVldWU8Sm9iPiBqb2JRdWV1ZTsKKwlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc2h1dGRvd24gPSBmYWxzZTsKKworCS8qKgorCSAqIGNvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIHdvcmtlck5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiB3b3JrZXIKKwkgKiBAcGFyYW0gam9iUXVldWUKKwkgKiAgICAgICAgICAgIHRoZSBxdWV1ZSB0aGUgd29ya2VyIHdpbGwgYmxvY2sgb24uCisJICovCisJcHVibGljIENhY2hlV29ya2VyKFN0cmluZyB3b3JrZXJOYW1lLCBMaW5rZWRCbG9ja2luZ1F1ZXVlPEpvYj4gam9iUXVldWUpIHsKKwkJdGhpcy53b3JrZXJOYW1lID0gd29ya2VyTmFtZTsKKwkJdGhpcy5qb2JRdWV1ZSA9IGpvYlF1ZXVlOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2Qgd2lsbCB0cnkgdG8gZ2V0IGEgam9iIGlmIG9uZSBpcyBhdmlsYWJsZSBpdCB3aWxsIGJlIHJldHJpdmVkCisJICogYW5kIGhhbmRsZWQuIGlmIG5vIGpvYnMgYXJlIGF2YWlsYWJsZSB0aGUgd29ya2VyIHdpbGwgYmxvY2sgZm9yIDUwMAorCSAqIG1pbGxpc2Vjb25kcyBhbmQgdGhlbiBpdCB3aWwgY2hlY2sgaWYgaXQgbmVlZHMgdG8gc2h1dGRvd24uIGlmIG5vdCBpdAorCSAqIHdpbGwgYmxvY2sgYWdhaW4gYW5kIHNvIG9uIHVudGlsIHN1dGRvd24gb3IgYSBuZXcgam9iIGlzIGF2YWlsYWJsZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJd2hpbGUgKHRydWUpIHsKKwkJCWxvZy50cmFjZSgiQ2FjaGVXb3JrZXI6e30gZG9pbmcgd29yayIsIHdvcmtlck5hbWUpOworCQkJdHJ5IHsKKwkJCQlKb2Igam9iID0gam9iUXVldWUucG9sbCg1MDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisJCQkJaWYgKGpvYiAhPSBudWxsKSB7CisJCQkJCWpvYi5kb1dvcmsoKTsKKwkJCQkJbG9nLnRyYWNlKCJ3b3JrZXI6e30gZG9uZSB3aXRoIHdvcmsiLCB3b3JrZXJOYW1lKTsKKwkJCQl9CisJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCWxvZy5kZWJ1Zygid29ya2VyIHt9IGZhaWxlZCBkdXJpbmcgam9iIGV4ZWN1dGlvbi4iLCB3b3JrZXJOYW1lKTsKKwkJCQlsb2cuZGVidWcoImV4Y2VwdGlvbiIsIGUpOworCQkJfQorCQkJaWYgKHNodXRkb3duKSB7CisJCQkJbG9nLmRlYnVnKCJ3b3JrZXI6e30gbm90aGluZyB0byBkbyBzdG9waW5nIiwgd29ya2VyTmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2Qgc2V0cyB0aGUgc2h1dGRvd24gZmxhZywgd2hlbiBzZXQgdGhlIHdvcmtlciB3aWxsIHN0b3AgaXQncworCSAqIGV4ZWN1dGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlIHdpdGggb3V0IGNvbXBsZXRpbmcgaXRzIHdvcmsKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzaHV0RG93bigpIHsKKwkJdGhpcy5zaHV0ZG93biA9IHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvd29ya2Vycy9JV29ya2VyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvd29ya2Vycy9JV29ya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkZjlmNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS93b3JrZXJzL0lXb3JrZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUud29ya2VyczsKKworLyoqCisgKiBDcmVhdGVkIGJ5IG1sYW5kbyBvbiA5LzYvMjAxNi4KKyAqLworcHVibGljIGludGVyZmFjZSBJV29ya2VyIHsKKwl2b2lkIHNodXREb3duKCk7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvd29ya2Vycy9TeW5jV29ya2VyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2FjaGUvd29ya2Vycy9TeW5jV29ya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0ZGQzNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYWNoZS93b3JrZXJzL1N5bmNXb3JrZXIuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLndvcmtlcnM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FjaGVNYW5nZXJPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRDYWNoZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogdGhlIGNsYXNzIGNyZWF0ZXMgYSB3b3JrZXIgdGhhdCBpcyB1c2VkIHRvIHVwZGF0ZSBjYWNoZSBkYXRlLCBpbiBjYXNlIG9mCisgKiBmYWlsdXJlcyBhbmQgaW5jb25zaXN0ZW5jaWVzCisgKi8KK3B1YmxpYyBjbGFzcyBTeW5jV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUsIElXb3JrZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFN5bmNXb3JrZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIGZpbmFsIENhY2hlTWFuZ2VyT3BlcmF0aW9uIGNhY2hlTWFuZ2VyT3BlcmF0aW9uOworCXByaXZhdGUgZmluYWwgU3RyaW5nIHdvcmtlck5hbWU7CisJcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHNodXRkb3duID0gZmFsc2U7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb21wb25lbnRDYWNoZURhdGE+IGNhY2hlSWRBbmRUaW1lTWFwOworCXByaXZhdGUgbG9uZyB1cGRhdGVEZWxheUluTWlsbGlzZWNvbmRzID0gNjAgKiA2MCAqIDEwMDA7CisKKwkvKioKKwkgKiBjcmVhdGVzIHRoZSBzeW5jIHdvcmtlcgorCSAqIAorCSAqIEBwYXJhbSB3b3JrZXJOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd29ya2VyCisJICogQHBhcmFtIGNhY2hlTWFuZ2VyT3BlcmF0aW9uCisJICogICAgICAgICAgICByZXNwb25zaWJsZSBmb3IgYWxsIHBlcnNpc3RlbmNlJ3Mgb3BlcmF0aW9ucyB0byBncmFwaCBhbmQgdGhlCisJICogICAgICAgICAgICBjYWNoZQorCSAqLworCXB1YmxpYyBTeW5jV29ya2VyKFN0cmluZyB3b3JrZXJOYW1lLCBDYWNoZU1hbmdlck9wZXJhdGlvbiBjYWNoZU1hbmdlck9wZXJhdGlvbikgeworCQl0aGlzLndvcmtlck5hbWUgPSB3b3JrZXJOYW1lOworCQl0aGlzLmNhY2hlTWFuZ2VyT3BlcmF0aW9uID0gY2FjaGVNYW5nZXJPcGVyYXRpb247CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjb2xsZWN0cyBhbGwgdGhlIHJlc291cmNlcy9zZXJ2aWNlcy9wcm9kdWN0cyBmcm9tIGdyYXBoIGFuZAorCSAqIGNoZWNrcyBpZiB0aGUgY29tcG9uZW50IHJlcHJlc2VudGluZyB0aGVtIGluIHRoZSBjYWNoZSBpcyB2YWxpZCBsb2dpYzogaWYKKwkgKiB0aGUgcmVjb3JkIGlzIHByZXNlbnQgaW4gdGhlIGdyYXBoIGJ1dCBub3QgaW4gY2FjaGUgLT4gY3JlYXRlIGEgam9iIHRoYXQKKwkgKiB3aWxsIHVwZGF0ZSB0aGUgcmVjb3JkIG9pbiBjYWNoZSBpZiB0aGUgdGltZXN0YW1wIG9mIHRoZSByZWNvcmQgaW4gY2FjaGUKKwkgKiBpcyBvbGRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb24gdGhlIGdyYXBoIC0+IGNyZWF0ZSBhIGpvYiB0aGF0IHdpbGwgdXBkYXRlCisJICogdGhlIHJlY29yZCBvaW4gY2FjaGUgb3RoZXJ3aXNlIG5vIHVwZGF0ZSBpcyByZXF1aXJlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJdHJ5IHsKKwkJCWNvbGxlY3RBbGxDYWNoZVJlY29yZHMoKTsKKwkJCXN5bmNDYWNoZUJ5Q29tcG9uZW50VHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQkJc3luY0NhY2hlQnlDb21wb25lbnRUeXBlKE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkJCXN5bmNDYWNoZUJ5Q29tcG9uZW50VHlwZShOb2RlVHlwZUVudW0uUHJvZHVjdCk7CisJCQljbGVhckNhY2hlUmVjb3JkcygpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoInN5bmMgd29ya2VyOnt9IGVuY291bmVyZWQgYW4gZXhjZXB0aW9uIiwgd29ya2VyTmFtZSk7CisJCQlsb2cuZGVidWcoImV4Y2VwdGlvbiIsIGUpOworCQl9IGZpbmFsbHkgeworCQkJdGhpcy5jYWNoZU1hbmdlck9wZXJhdGlvbi5nZXRUaXRhbkdlbmVyaWNEYW8oKS5jb21taXQoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY2hlY2tzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgY2FjaGUgZXhjZXB0IHRoZSBvbmVzIHRoYXQKKwkgKiB3ZXJlIHVwZGF0ZSBkdXJpbmcgdGhlIHN5bmMsIGlmIHRoZXkgZXhpc3Qgb24gdGhlIGdyYXBoIGlmIG5vdCBhIGpvYiB0bworCSAqIHJlbW92ZSB0aGVtIGlzIGNyZWF0ZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgY2xlYXJDYWNoZVJlY29yZHMoKSB7CisJCWNhY2hlSWRBbmRUaW1lTWFwLmZvckVhY2goKGssIHYpIC0+IHsKKwkJCXRyeSB7CisJCQkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEZyb21HcmFwaFJlcyA9IGdldENvbXBvbmVudE1ldGFEYXRhKGssCisJCQkJCQlOb2RlVHlwZUVudW0uZ2V0QnlOYW1lKHYuZ2V0VHlwZSgpKSk7CisJCQkJaWYgKGNvbXBvbmVudEZyb21HcmFwaFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBjb21wb25lbnRGcm9tR3JhcGhSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlpZiAoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELmVxdWFscyhlcnJvcikpIHsKKwkJCQkJCWxvbmcgZGVsYXkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHYuZ2V0TW9kaWZpY2F0aW9uVGltZSgpLmdldFRpbWUoKTsKKwkJCQkJCWlmIChkZWxheSA+IHVwZGF0ZURlbGF5SW5NaWxsaXNlY29uZHMpIHsKKwkJCQkJCQl0aGlzLmNhY2hlTWFuZ2VyT3BlcmF0aW9uLmRlbGV0ZUNvbXBvbmVudEluQ2FjaGUoaywgdi5nZXRNb2RpZmljYXRpb25UaW1lKCkuZ2V0VGltZSgpLAorCQkJCQkJCQkJTm9kZVR5cGVFbnVtLmdldEJ5TmFtZSh2LmdldFR5cGUoKSkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlsb2cudHJhY2UoCisJCQkJCQkJCQkibm8gZGVsZXRlIGRvbmUgYmVjYXVzZSBhbiBob3VyIGRpZCBub3QgcGFzcyBzaW5jZSB0aGUgZGVsZXRlIHdhcyBkb25lICB0aW1lU2luY2VVcGRhdGUge30gPCB1cGRhdGVEZWxheUluTWlsbGlzZWNvbmRzIHt9ICIsCisJCQkJCQkJCQlkZWxheSwgdXBkYXRlRGVsYXlJbk1pbGxpc2Vjb25kcyk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgbWV0YWRhdGEgZm9yIGlkOnt9IGZyb20gZ3JhcGggZXJyb3I6e30iLCBrLCBlcnJvcik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlsb2cudHJhY2UoImlkIHt9IGlzIGluIGdyYXBoIG5vdGhpbmcgdG8gZG8iKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWxvZy5kZWJ1ZygiZHVyaW5nIGNsZWFuIGNhY2hlIHJlY29yZHMgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24iLCBlKTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjb2xsZWN0cyBhbGwgdGhlIHJlY29yZHMgZnJvbSBjYWNoZSBleGNlcHQgdGhlIGNvbXBvbmVudAorCSAqIGl0c2VsZgorCSAqLworCXB1YmxpYyB2b2lkIGNvbGxlY3RBbGxDYWNoZVJlY29yZHMoKSB7CisJCUVpdGhlcjxMaXN0PENvbXBvbmVudENhY2hlRGF0YT4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsUmVzID0gdGhpcy5jYWNoZU1hbmdlck9wZXJhdGlvbi5nZXRDb21wb25lbnRDYWNoZSgpCisJCQkJLmdldEFsbENvbXBvbmVudElkVGltZUFuZFR5cGUoKTsKKwkJaWYgKGdldEFsbFJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGdldCBhbGwgcmVjb3JkcyBmcm9tIGNhY2hlIGVycm9yOnt9IiwgZ2V0QWxsUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQljYWNoZUlkQW5kVGltZU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJfSBlbHNlIHsKKwkJCWNhY2hlSWRBbmRUaW1lTWFwID0gZ2V0QWxsUmVzLmxlZnQoKS52YWx1ZSgpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChlIC0+IGUuZ2V0SWQoKSwgZSAtPiBlKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSByZWNvcmRzIG90IHRoZSBnaXZlbiB0eXBlIGFyZSBzeW5jIGJldHdlZW4gdGhlCisJICogY2FjaGUgYW5kIHRoZSBncmFwaAorCSAqIAorCSAqIEBwYXJhbSBub2RlVHlwZUVudW0KKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGNvbXBvbmVudHMgd2Ugd2FudCB0byBzeW5jCisJICovCisJcHJpdmF0ZSB2b2lkIHN5bmNDYWNoZUJ5Q29tcG9uZW50VHlwZShOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCWlmICghdGhpcy5zaHV0ZG93bikgeworCQkJbG9nLnRyYWNlKCJzeW5jQ2FjaGUgcmVjb3JkcyBvZiB0eXBlOnt9IC4iLCBub2RlVHlwZUVudW0pOworCQkJRWl0aGVyPExpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbFJlc3VsdCA9IGdldEFsbENvbXBvbmVudHNNZXRhRGF0YSgKKwkJCQkJbm9kZVR5cGVFbnVtKTsKKwkJCUxpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiBjb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlpZiAoZ2V0QWxsUmVzdWx0LmlzUmlnaHQoKSAmJiAhVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELmVxdWFscyhnZXRBbGxSZXN1bHQucmlnaHQoKS52YWx1ZSgpKSkgeworCQkJCWxvZy5kZWJ1ZygiZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGdldCBhbGwgY29tcG9uZW50cyBvZiB0eXBlOnt9IFRpdGFuT3BlcmF0aW9uU3RhdHVzOnt9LiIsIG5vZGVUeXBlRW51bSwKKwkJCQkJCWdldEFsbFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChnZXRBbGxSZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQljb21wb25lbnRMaXN0ID0gZ2V0QWxsUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCWxvZy50cmFjZSgiZ2V0IGFsbCBjb21wb25lbnRzIG9mIHR5cGU6e30gcmV0dXJuZWQ6e30gY29tcG9uZW50cy4iLCBub2RlVHlwZUVudW0sIGNvbXBvbmVudExpc3Quc2l6ZSgpKTsKKwkJCX0KKwkJCWNvbXBvbmVudExpc3QuZm9yRWFjaCh0aGlzOjpjaGVja0FuZFVwZGF0ZUNhY2hlQ29tcG9uZW50KTsKKwkJCWxvZy50cmFjZSgic3luY0NhY2hlIHJlY29yZHMgb2YgdHlwZTp7fSB3YXMgc3VjY2Vzc2Z1bC4iLCBub2RlVHlwZUVudW0pOworCQl9CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjb21wYXJlcyB0aGUgZ2l2ZW4gY29tcG9uZW50IHRvIHRoZSByZWNvcmQgaW4gdGhlIGNhY2hlIGlmIHRoZQorCSAqIHJlY29yZCBpcyBub3QgaW4gdGhlIGNhY2hlIGEgam9iIHRvIHVwZGF0ZSB0aGUgY2FjaGUgZm9yIHRoaXMgcmVjb3JkIHdpbGwKKwkgKiBiZSBjcmVhdGVkLiBpZiB0aGUgcmVjb3JkIGlzIHByZXNlbnQgaW4gdGhlIGdyYXBoIGJ1dCBub3QgaW4gY2FjaGUgLT4KKwkgKiBjcmVhdGUgYSBqb2IgdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcmVjb3JkIG9pbiBjYWNoZSBpZiB0aGUgdGltZXN0YW1wIG9mCisJICogdGhlIHJlY29yZCBpbiBjYWNoZSBpcyBvbGRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb24gdGhlIGdyYXBoIC0+IGNyZWF0ZSBhCisJICogam9iIHRoYXQgd2lsbCB1cGRhdGUgdGhlIHJlY29yZCBvaW4gY2FjaGUgaWYgdGhlIHJldHJpZWQgY29tcG9uZW50IGZyb20KKwkgKiBjYWNoZSBmYWlscyB0byBiZSBkZXNlcmlhbGl6ZWQgLT4gY3JlYXRlIGpvYiB0byBvdmVycmlkZSBpdCBvdGhlcndpc2Ugbm8KKwkgKiB1cGRhdGUgaXMgcmVxdWlyZWQKKwkgKiAKKwkgKiBAcGFyYW0gbWV0YWRhdGFEYXRhCisJICogICAgICAgICAgICB0aGUgZGF0ZSBvZiB0aGUgbm9kZSB3ZSB3YW50IHRvIGNvbXBhcmUgdG8gdGhlIHZhbHVlIGluIHRoZQorCSAqICAgICAgICAgICAgY2FjaGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgY2hlY2tBbmRVcGRhdGVDYWNoZUNvbXBvbmVudChDb21wb25lbnRNZXRhZGF0YURhdGEgbWV0YWRhdGFEYXRhKSB7CisJCWxvbmcgdGltZVNpbmNlVXBkYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKwkJCQktIG1ldGFkYXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TGFzdFVwZGF0ZURhdGUoKTsKKwkJaWYgKHRpbWVTaW5jZVVwZGF0ZSA+PSB1cGRhdGVEZWxheUluTWlsbGlzZWNvbmRzKSB7CisJCQlTdHJpbmcgdWlkID0gbWV0YWRhdGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpOworCQkJbG9nLnRyYWNlKCJjaGVja2luZyBjYWNoZSBpZiByZWNvcmQgZm9yIHVpZDp7fSBuZWVkcyB0byBiZSB1cGRhdGVkLiIsIHVpZCk7CisJCQlFaXRoZXI8Q29tcG9uZW50LCBBY3Rpb25TdGF0dXM+IGNhY2hlUmVzdWx0ID0gdGhpcy5jYWNoZU1hbmdlck9wZXJhdGlvbi5nZXRDb21wb25lbnRDYWNoZSgpCisJCQkJCS5nZXRDb21wb25lbnQodWlkKTsKKwkJCWlmIChjYWNoZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gY2FjaGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChBY3Rpb25TdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5ELmVxdWFscyhhY3Rpb25TdGF0dXMpKSB7CisJCQkJCWxvZy50cmFjZSgicmVjb3JkIGZvciB1aWQ6e30gbm90IGZvdW5kIGluIGNhY2hlLiBjcmVhdGluZyBhbiB1cGRhdGUgam9iLiIsIHVpZCk7CisJCQkJCXRoaXMuY2FjaGVNYW5nZXJPcGVyYXRpb24udXBkYXRlQ29tcG9uZW50SW5DYWNoZSh1aWQsCisJCQkJCQkJbWV0YWRhdGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRMYXN0VXBkYXRlRGF0ZSgpLAorCQkJCQkJCU5vZGVUeXBlRW51bS5nZXRCeU5hbWUobWV0YWRhdGFEYXRhLmdldExhYmVsKCkpKTsKKwkJCQl9IGVsc2UgaWYgKEFjdGlvblN0YXR1cy5DT05WRVJUX0NPTVBPTkVOVF9FUlJPUi5lcXVhbHMoYWN0aW9uU3RhdHVzKSkgeworCQkJCQlsb2cudHJhY2UoInVpZDp7fSBmb3VuZCBpbiBjYWNoZSBidXQgd2UgZmFpbGVkIGRlc2VyaWFsaXppbmcgaXQuIGNyZWF0aW5nIGFuIG92ZXJyaWRlIGpvYiAgLiIsIHVpZCk7CisJCQkJCXRoaXMuY2FjaGVNYW5nZXJPcGVyYXRpb24ub3ZlcmlkZUNvbXBvbmVudEluQ2FjaGUodWlkLAorCQkJCQkJCW1ldGFkYXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TGFzdFVwZGF0ZURhdGUoKSwKKwkJCQkJCQlOb2RlVHlwZUVudW0uZ2V0QnlOYW1lKG1ldGFkYXRhRGF0YS5nZXRMYWJlbCgpKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJkdXJpbmcgbG9va3VwIGZvciB1aWQ6e30gYW4gZXJyb3IgYWNjb3JkcyBzdGF0dXM6e30gLiIsIHVpZCwgYWN0aW9uU3RhdHVzKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxvZy50cmFjZSgidWlkOnt9IGZvdW5kIGluIGNhY2hlLiIsIHVpZCk7CisJCQkJdGhpcy5jYWNoZUlkQW5kVGltZU1hcC5yZW1vdmUodWlkKTsKKwkJCQlDb21wb25lbnQgY2FjaGVDb21wb25lbnQgPSBjYWNoZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlMb25nIGNhY2hlVGltZXN0YW1wID0gY2FjaGVDb21wb25lbnQuZ2V0TGFzdFVwZGF0ZURhdGUoKTsKKwkJCQlMb25nIGdyYXBoVGltZXN0YW1wID0gbWV0YWRhdGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRMYXN0VXBkYXRlRGF0ZSgpOworCQkJCWlmIChjYWNoZVRpbWVzdGFtcCA8IGdyYXBoVGltZXN0YW1wKSB7CisJCQkJCWxvZy50cmFjZSgidWlkOnt9IGZvdW5kIGluIGNhY2hlLiBjYWNoZSBUaW1lc3RhbXAge30gPCBncmFwaCB0aW1lc3RhbXAgLCBjcmVhdGluZyBhbiB1cGRhdGUgam9iICAuIiwKKwkJCQkJCQl1aWQsIGNhY2hlVGltZXN0YW1wLCBncmFwaFRpbWVzdGFtcCk7CisJCQkJCXRoaXMuY2FjaGVNYW5nZXJPcGVyYXRpb24udXBkYXRlQ29tcG9uZW50SW5DYWNoZSh1aWQsIGdyYXBoVGltZXN0YW1wLAorCQkJCQkJCU5vZGVUeXBlRW51bS5nZXRCeU5hbWUobWV0YWRhdGFEYXRhLmdldExhYmVsKCkpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cudHJhY2UoInVpZDp7fSBmb3VuZCBpbiBjYWNoZS4gY2FjaGUgVGltZXN0YW1wIHt9ID0+IGdyYXBoIHRpbWVzdGFtcCAsIG5vIHVwZGF0ZSBpcyBuZWVkZWQgLiIsCisJCQkJCQkJdWlkLCBjYWNoZVRpbWVzdGFtcCwgZ3JhcGhUaW1lc3RhbXApOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZy50cmFjZSgKKwkJCQkJIm5vIHVwZGF0ZSBkb25lIGJlY2F1c2UgYW4gaG91ciBkaWQgbm90IHBhc3Mgc2luY2UgdGhlIHVwZGF0ZSB3YXMgZG9uZSAgdGltZVNpbmNlVXBkYXRlIHt9IDwgdXBkYXRlRGVsYXlJbk1pbGxpc2Vjb25kcyB7fSAiLAorCQkJCQl0aW1lU2luY2VVcGRhdGUsIHVwZGF0ZURlbGF5SW5NaWxsaXNlY29uZHMpOworCQl9CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBzZXRzIHRoZSBzaHV0ZG93biBmbGFnLCB3aGVuIHNldCB0aGUgd29ya2VyIHdpbGwgc3RvcCBpdCdzCisJICogZXhlY3V0aW9uIGFzIHNvb24gYXMgcG9zc2libGUgd2l0aCBvdXQgY29tcGxldGluZyBpdHMgd29yaworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNodXREb3duKCkgeworCQlsb2cuZGVidWcoInN5bmNXb3JrZXIge30gc2h1dGluZyBkb3duLiIsIHdvcmtlck5hbWUpOworCQl0aGlzLnNodXRkb3duID0gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIHJldHJpdmVzIGFsbCBub2RlcyBtYXRjaGluZyB0aGUgZ2l2ZW4gbm9kZSB0eXBlIGZyb20gdGhlIGdyYXBoCisJICogCisJICogQHBhcmFtIG5vZGVUeXBlRW51bQorCSAqICAgICAgICAgICAgbm9kZSB0eXBlIHdlIHdhbnQgdG8gbG9va3VwIG9uIHRoZSBncmFwaAorCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJldHJpZXZlZCBub2RlcyBtYXRjaGluZyB0aGUgZ2l2ZW4gdHlwZSBvciBub3QgZm91bmQgaW4KKwkgKiAgICAgICAgIGNhc2Ugbm8gbm9kZXMgd2VyZSBmb3VuZCBvciBlcnJvciBpbiBjYXNlIG9mIGZhaWx1cmUKKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxMaXN0PENvbXBvbmVudE1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDb21wb25lbnRzTWV0YURhdGEoCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCXJldHVybiB0aGlzLmNhY2hlTWFuZ2VyT3BlcmF0aW9uLmdldFRpdGFuR2VuZXJpY0RhbygpLmdldEJ5Q3JpdGVyaWEobm9kZVR5cGVFbnVtLCBudWxsLAorCQkJCUNvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCByZXRyaWV2ZXMgdGhlIG1ldGFkYXRhIGZyb20gZ3JhcGggZm9yIHRoZSBnaXZlbiBpZAorCSAqIAorCSAqIEBwYXJhbSB1aWQKKwkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUgaWQgb2YgdGhlIGNvbXBvbmVudCB3ZSB3YW50IHRvIHJldHJpZXZlCisJICogQHBhcmFtIG5vZGVUeXBlRW51bQorCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHJlY29yZWQgd2Ugd2FudCB0byByZXRyaWV2ZQorCSAqIEByZXR1cm4gdGhlIG1ldGEgZGF0IG9mIHRoZSBjb21wb25lbnQgb3IgdGhlIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyB0aGUKKwkgKiAgICAgICAgIGdldAorCSAqLworCXByaXZhdGUgRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudE1ldGFEYXRhKFN0cmluZyB1aWQsCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCXJldHVybiB0aGlzLmNhY2hlTWFuZ2VyT3BlcmF0aW9uLmdldFRpdGFuR2VuZXJpY0RhbygpLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGVFbnVtKSwKKwkJCQl1aWQsIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhdGVnb3J5L0NhdGVnb3J5RGVmaW5pdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhdGVnb3J5L0NhdGVnb3J5RGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODYzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2F0ZWdvcnkvQ2F0ZWdvcnlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jYXRlZ29yeS5DYXRlZ29yeURhdGFEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgQ2F0ZWdvcnlEZWZpbml0aW9uIGV4dGVuZHMgQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTUyNzMzNzk2ODYwOTkyNDc2TDsKKworCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJjYXRlZ29yaWVzOworCisJcHVibGljIENhdGVnb3J5RGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ2F0ZWdvcnlEZWZpbml0aW9uKENhdGVnb3J5RGF0YURlZmluaXRpb24gYykgeworCQlzdXBlcihjKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IGdldFN1YmNhdGVnb3JpZXMoKSB7CisJCXJldHVybiBzdWJjYXRlZ29yaWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN1YmNhdGVnb3JpZXMoTGlzdDxTdWJDYXRlZ29yeURlZmluaXRpb24+IHN1YmNhdGVnb3JpZXMpIHsKKwkJdGhpcy5zdWJjYXRlZ29yaWVzID0gc3ViY2F0ZWdvcmllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRTdWJDYXRlZ29yeShTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0ZWdvcnkpIHsKKwkJaWYgKHN1YmNhdGVnb3JpZXMgPT0gbnVsbCkgeworCQkJc3ViY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPigpOworCQl9CisJCXN1YmNhdGVnb3JpZXMuYWRkKHN1YmNhdGVnb3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgQ2F0ZWdvcnlEZWZpbml0aW9uIFtzdWJjYXRlZ29yaWVzPSIgKyBzdWJjYXRlZ29yaWVzICsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhdGVnb3J5L0dyb3VwaW5nRGVmaW5pdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2NhdGVnb3J5L0dyb3VwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWUwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2F0ZWdvcnkvR3JvdXBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNhdGVnb3J5Lkdyb3VwaW5nRGF0YURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBHcm91cGluZ0RlZmluaXRpb24gZXh0ZW5kcyBHcm91cGluZ0RhdGFEZWZpbml0aW9uIHsKKworCXB1YmxpYyBHcm91cGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEdyb3VwaW5nRGVmaW5pdGlvbihHcm91cGluZ0RhdGFEZWZpbml0aW9uIGcpIHsKKwkJc3VwZXIoZyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2F0ZWdvcnkvU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvY2F0ZWdvcnkvU3ViQ2F0ZWdvcnlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NTlhMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9jYXRlZ29yeS9TdWJDYXRlZ29yeURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGF0YURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBTdWJDYXRlZ29yeURlZmluaXRpb24gZXh0ZW5kcyBTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uIHsKKworCXByaXZhdGUgTGlzdDxHcm91cGluZ0RlZmluaXRpb24+IGdyb3VwaW5nczsKKworCXB1YmxpYyBTdWJDYXRlZ29yeURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN1YkNhdGVnb3J5RGVmaW5pdGlvbihTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uIHN1YkNhdGVnb3J5KSB7CisJCXN1cGVyKHN1YkNhdGVnb3J5KTsKKwl9CisKKwlwdWJsaWMgTGlzdDxHcm91cGluZ0RlZmluaXRpb24+IGdldEdyb3VwaW5ncygpIHsKKwkJcmV0dXJuIGdyb3VwaW5nczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcm91cGluZ3MoTGlzdDxHcm91cGluZ0RlZmluaXRpb24+IGdyb3VwaW5nRGVmaW5pdGlvbnMpIHsKKwkJdGhpcy5ncm91cGluZ3MgPSBncm91cGluZ0RlZmluaXRpb25zOworCX0KKworCXB1YmxpYyB2b2lkIGFkZEdyb3VwaW5nKEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24pIHsKKwkJaWYgKGdyb3VwaW5ncyA9PSBudWxsKSB7CisJCQlncm91cGluZ3MgPSBuZXcgQXJyYXlMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4oKTsKKwkJfQorCQlncm91cGluZ3MuYWRkKGdyb3VwaW5nRGVmaW5pdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBbZ3JvdXBpbmdzPSIgKyBncm91cGluZ3MgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvaGVhdC9IZWF0UGFyYW1ldGVyVHlwZS5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2hlYXQvSGVhdFBhcmFtZXRlclR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGUwYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL2hlYXQvSGVhdFBhcmFtZXRlclR5cGUuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuaGVhdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuRGVmYXVsdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLkhlYXRCb29sZWFuQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuSGVhdENvbW1hRGVsaW1pdGVkTGlzdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLkhlYXRKc29uQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuSGVhdE51bWJlckNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLkhlYXRTdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVycy5Qcm9wZXJ0eVZhbHVlQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuU3RyaW5nQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuSGVhdEJvb2xlYW5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5IZWF0Q29tbWFEZWxpbWl0ZWRMaXN0VmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuSGVhdE51bWJlclZhbGlkYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzLkhlYXRTdHJpbmdWYWxpZGF0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5Qcm9wZXJ0eVR5cGVWYWxpZGF0b3I7CisKK3B1YmxpYyBlbnVtIEhlYXRQYXJhbWV0ZXJUeXBlIHsKKworCVNUUklORygic3RyaW5nIiwgSGVhdFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBIZWF0U3RyaW5nQ29udmVydGVyLmdldEluc3RhbmNlKCkpLAorCisJQk9PTEVBTigiYm9vbGVhbiIsIEhlYXRCb29sZWFuVmFsaWRhdG9yLmdldEluc3RhbmNlKCksIEhlYXRCb29sZWFuQ29udmVydGVyLmdldEluc3RhbmNlKCkpLAorCisJTlVNQkVSKCJudW1iZXIiLCBIZWF0TnVtYmVyVmFsaWRhdG9yLmdldEluc3RhbmNlKCksIEhlYXROdW1iZXJDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSksCisKKwlKU09OKCJqc29uIiwgSGVhdFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBIZWF0SnNvbkNvbnZlcnRlci5nZXRJbnN0YW5jZSgpKSwKKworCUNPTU1BX0RFTElNSVRFRF9MSVNUKCJjb21tYV9kZWxpbWl0ZWRfbGlzdCIsIEhlYXRDb21tYURlbGltaXRlZExpc3RWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKSwgSGVhdENvbW1hRGVsaW1pdGVkTGlzdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpKTsKKworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisJcHJpdmF0ZSBQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgdmFsaWRhdG9yOworCXByaXZhdGUgUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBjb252ZXJ0ZXI7CisKKwlIZWF0UGFyYW1ldGVyVHlwZShTdHJpbmcgdHlwZSwgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHZhbGlkYXRvciwgUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7CisJCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgeworCQlyZXR1cm4gdmFsaWRhdG9yOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisJCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOworCX0KKworCXB1YmxpYyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIGNvbnZlcnRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7CisJfQorCisJcHVibGljIHN0YXRpYyBIZWF0UGFyYW1ldGVyVHlwZSBpc1ZhbGlkVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJZm9yIChIZWF0UGFyYW1ldGVyVHlwZSB0eXBlIDogSGVhdFBhcmFtZXRlclR5cGUudmFsdWVzKCkpIHsKKwkJCWlmICh0eXBlLmdldFR5cGUoKS5lcXVhbHModHlwZU5hbWUpKSB7CisJCQkJcmV0dXJuIHR5cGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNjdjMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGE7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVHJhbnNhY3Rpb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24geworCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKKworCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcigKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBvcmlnS2V5LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOworCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGtleSk7CisKKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk5vZGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJU3RyaW5nIHJlc291cmNlVW5pcXVlSWQpOworCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uTm9kZSgKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIHBhcmFtZXRlcnMpOworCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRSZXNvdXJjZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvblJlY3Vyc2l2ZWx5KFN0cmluZyB1bmlxdWVJZCwKKwkJCUxpc3Q8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbj4gcHJvcGVydGllcyk7CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZFNlcnZpY2VBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25SZWN1cnNpdmVseShTdHJpbmcgdW5pcXVlSWQsCisJCQlMaXN0PEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24+IHByb3BlcnRpZXMpOworCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIoCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcigKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIoCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE51bWJlck9mQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8SW50ZWdlciwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldE51bWJlck9mUGFyYW1ldGVycyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkKTsKKworCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGlkKTsKKworCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIoCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXJzKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpZ25vcmVWZXJpZmljYXRpb24pOworCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXJzKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpZ25vcmVWZXJpZmljYXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcnMoCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk5vZGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJU3RyaW5nIGNvbXBvbmVudElkLCBUaXRhblZlcnRleCBtYXRhZGF0VmVydGV4KTsKKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLAorCQkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBwYXJhbWV0ZXJzLCBUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQXJ0aWZhY3RPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQXJ0aWZhY3RPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNkMDVlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lBcnRpZmFjdE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5BcnRpZmFjdERhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkFydGlmYWN0RGF0YTsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5UcmFuc2FjdGlvbjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUFydGlmYWN0T3BlcmF0aW9uIHsKKworCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRBcmlmYWN0VG9Db21wb25lbnQoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgU3RyaW5nIGlkLCBOb2RlVHlwZUVudW0gdHlwZSwgYm9vbGVhbiBmYWlsSWZFeGlzdCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBcmlmYWN0T25SZXNvdXJjZShBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgaWQsIFN0cmluZyBhcnRpZmFjdElkLCBOb2RlVHlwZUVudW0gdHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBcmlmYWN0RGVmaW5pdGlvbihBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlbW92ZUFyaWZhY3RGcm9tUmVzb3VyY2UoU3RyaW5nIGlkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgTm9kZVR5cGVFbnVtIHJlc291cmNlLCBib29sZWFuIGRlbGV0ZU1hbmRhdG9yeUFydGlmYWN0LCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBcnRpZmFjdHMoU3RyaW5nIHBhcmVudElkLCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKTsKKworCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBcnRpZmFjdEJ5SWQoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBcnRpZmFjdHMoU3RyaW5nIHBhcmVudElkLCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBTdHJpbmcgZ3JvdXBUeXBlKTsKKworCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEhlYXRFbnZBcnRpZmFjdChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RIZWF0RW52LCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RIZWF0LCBTdHJpbmcgcGFyZW50SWQsIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIHZvaWQgdXBkYXRlVVVJRChBcnRpZmFjdERhdGFEZWZpbml0aW9uIGFydGlmYWN0RGF0YSwgU3RyaW5nIG9sZENoZWNrc3VtLCBTdHJpbmcgb2xkVmVzcmlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFBhcmVudHNPZkFydGlmYWN0KFN0cmluZyBhcnRpZmFjdElkLCBOb2RlVHlwZUVudW0gdHlwZSk7CisKKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0SGVhdEFydGlmYWN0QnlIZWF0RW52SWQoU3RyaW5nIGhlYXRFbnZJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVUb3NjYUFydGlmYWN0TmFtZU9uR3JhcGgoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbywgU3RyaW5nIGFydGlmYWN0SWQsIE5vZGVUeXBlRW51bSB0eXBlLCBTdHJpbmcgaWQpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYWRkQXJpZmFjdFRvQ29tcG9uZW50KEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIFN0cmluZyBwYXJlbnRJZCwgTm9kZVR5cGVFbnVtIHR5cGUsIGJvb2xlYW4gZmFpbElmRXhpc3QsIFRpdGFuVmVydGV4IHBhcmVudFZlcnRleCk7CisKKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0QXJ0aWZhY3REYXRhQnlBcnRpZmFjdFVVSUQoU3RyaW5nIGFydGlmYWN0VVVJRCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYWRkQXJpZmFjdFRvQ29tcG9uZW50KFRpdGFuVmVydGV4IGFydGlmYWN0SW5mbywgVGl0YW5WZXJ0ZXggcGFyZW50VmVydGV4LCBTdHJpbmcgbGFiZWwpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUF0dHJpYnV0ZU9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lBdHRyaWJ1dGVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJiOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lBdHRyaWJ1dGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXR0cmlidXRlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXR0cmlidXRlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BdHRyaWJ1dGVWYWx1ZURhdGE7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUF0dHJpYnV0ZU9wZXJhdGlvbiB7CisJRWl0aGVyPEF0dHJpYnV0ZURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlSWQpOworCisJVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkQXR0cmlidXRlc1RvR3JhcGgoVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgsIE1hcDxTdHJpbmcsIEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHJpYnV0ZXMsIFN0cmluZyByZXNvdXJjZUlkLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcyk7CisKKwlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxBdHRyaWJ1dGVzT2ZSZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0YW5jZSk7CisKKwlUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsUmVzb3VyY2VBdHRyaWJ1dGVzUmVjdXJzaXZlbHkoU3RyaW5nIHJlc291cmNlSWQsIExpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlcyk7CisKKwlFaXRoZXI8TWFwPFN0cmluZywgQXR0cmlidXRlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbEF0dHJpYnV0ZUFzc29jaWF0ZWRUb05vZGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdW5pcXVlSWQpOworCisJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZE5vZGVOb25JbmhlcmV0ZWRBdHRyaWJ1ZXMoU3RyaW5nIHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIExpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlcyk7CisKKwlFaXRoZXI8QXR0cmlidXRlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQXR0cmlidXRlKEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlRGVmaW5pdGlvbiwgU3RyaW5nIHJlc291cmNlSWQpOworCisJRWl0aGVyPEF0dHJpYnV0ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRBdHRyaWJ1dGVUb0dyYXBoKEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlLCBTdHJpbmcgcmVzb3VyY2VJZCwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpOworCisJQXR0cmlidXRlRGVmaW5pdGlvbiBjb252ZXJ0QXR0cmlidXRlRGF0YVRvQXR0cmlidXRlRGVmaW5pdGlvbihBdHRyaWJ1dGVEYXRhIGF0dHJpYnV0ZURhdGEsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgcmVzb3VyY2VJZCk7CisKKwlFaXRoZXI8QXR0cmlidXRlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVJZCwgQXR0cmlidXRlRGVmaW5pdGlvbiBuZXdBdHREZWYsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKTsKKworCS8qKgorCSAqIEJ1aWxkcyBDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBmcm9tIEF0dHJpYnV0ZVZhbHVlRGF0YQorCSAqIAorCSAqIEBwYXJhbSBhdHRyaWJ1dGVWYWx1ZURhdGEKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBidWlsZFJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUoQXR0cmlidXRlVmFsdWVEYXRhIGF0dHJpYnV0ZVZhbHVlRGF0YSwgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgcmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZSk7CisKKwlUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRBdHRyaWJ1dGVUb0dyYXBoQnlWZXJ0ZXgoVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgsIEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlLCBTdHJpbmcgcmVzb3VyY2VJZCwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNhY2hlTWFuZ2VyT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNhY2hlTWFuZ2VyT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1ODZkYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQ2FjaGVNYW5nZXJPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5qb2JzLkNoZWNrQW5kVXBkYXRlSm9iOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLmpvYnMuU3RvcmVKb2I7CisKKy8qKgorICogQ3JlYXRlZCBieSBtbGFuZG8gb24gOS81LzIwMTYuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNhY2hlTWFuZ2VyT3BlcmF0aW9uIHsKKworCS8qKgorCSAqIAorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqIEBwYXJhbSB0aW1lc3RhbXAKKwkgKiBAcGFyYW0gbm9kZVR5cGVFbnVtCisJICovCisJdm9pZCB1cGRhdGVDb21wb25lbnRJbkNhY2hlKFN0cmluZyBjb21wb25lbnRJZCwgbG9uZyB0aW1lc3RhbXAsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0pOworCisJdm9pZCBzdG9yZUNvbXBvbmVudEluQ2FjaGUob3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IGNvbXBvbmVudCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MGI2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlJbnN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRJbnN0YW5jZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlWYWx1ZURhdGE7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKKy8qKgorICogcHVibGljIGludGVyZmFjZSBJQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uIHByb3ZpZGVzIG1ldGhvZHMgZm9yIENSVUQKKyAqIG9wZXJhdGlvbnMgZm9yIENhcGFiaWxpdHlJbnN0YW5jZSBvbiBjb21wb25lbnQgaW5zdGFuY2UgbGV2ZWwKKyAqIAorICogQGF1dGhvciBuczAxOXQKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbiB7CisJLyoqCisJICogY3JlYXRlIGNhcGFiaWxpdHkgaW5zdGFuY2Ugb2YgY2FwYWJpbGl0eSB3aXRoIHByb3BlcnR5IHZhbHVlcyBmb3IKKwkgKiByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUlkCisJICogQHBhcmFtIHByb3BlcnR5VmFsdWVzCisJICogQHBhcmFtIHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGFuY2UKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eU5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxNYXA8Q2FwYWJpbGl0eUluc3REYXRhLCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VPZkNhcGFiaWxpdHlXaXRoUHJvcGVydHlWYWx1ZXNGb3JSZXNvdXJjZUluc3RhbmNlKAorCQkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLAorCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0eVZhbHVlcywgYm9vbGVhbiB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0RXhpc3RhbmNlKTsKKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlVmVydGV4CisJICogQHBhcmFtIGNhcGFiaWxpdHlJZAorCSAqIEBwYXJhbSBjYXBhYmlsaXR5TmFtZQorCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcworCSAqIEBwYXJhbSB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0RXhpc3RlbmNlCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VPZkNhcGFiaWxpdHlXaXRoUHJvcGVydHlWYWx1ZXNGb3JSZXNvdXJjZUluc3RhbmNlKAorCQkJVGl0YW5WZXJ0ZXggcmVzb3VyY2VJbnN0YW5jZVZlcnRleCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLAorCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0eVZhbHVlcywgYm9vbGVhbiB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0RXhpc3RlbmNlKTsKKworCS8qKgorCSAqIHZhbGlkYXRlIGNhcGFiaWxpdHkgaW5zdGFuY2UgdW5pcXVlbmVzcworCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2UoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwKKwkJCVN0cmluZyBjYXBhYmlsaXR5SWQpOworCisJLyoqCisJICogZGVsZXRlIGNhcGFiaWxpdHkgaW5zdGFuY2UgZnJvbSByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUluc3RhbmNlSWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDYXBhYmlsaXR5SW5zdGFuY2VGcm9tUmVzb3VyY2VJbnN0YW5jZSgKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SW5zdGFuY2VJZCk7CisKKwkvKioKKwkgKiBnZXQgYWxsIGNhcGFiaWxpdHkgaW5zdGFuY2VzIGZvciByZXNvdXJjZSBpbnN0YW5jZSByZXR1cm5zIGFsbCBDYXBhYmlsaXR5CisJICogSW5zdGFuY2VzIHJlbGF0ZWQgdG8gUmVzb3VyY2UgSW5zdGFuY2UgYXMgTGlzdDxDYXBhYmlsaXR5SW5zdERhdGE+IG9yCisJICogVGl0YW5PcGVyYXRpb25TdGF0dXMgaWYgZXJyb3Igb2NjdXJzIG9yIGlmIFJlc291cmNlIEluc3RhbmNlIGhhdmUgbm8gYW55CisJICogcmVsYXRlZCBDYXBhYmlsaXR5IEluc3RhbmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEByZXR1cm4gRWl0aGVyPExpc3Q8Q2FwYWJpbGl0eUluc3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+CisJICovCisJcHVibGljIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNPZlJlc291cmNlSW5zdGFuY2UoCisJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCS8qKgorCSAqIGdldCBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkgZm9yIHJlc291cmNlIGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEBwYXJhbSBjYXBhYmlsaXR5SWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5SW5zdGFuY2VPZkNhcGFiaWxpdHlPZlJlc291cmNlSW5zdGFuY2UoCisJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkKTsKKworCS8qKgorCSAqIHVwZGF0ZSBjYXBhYmlsaXR5IHByb3BlcnR5IHZhbHVlcworCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVDYXBhYmlsaXR5UHJvcGVydHlWYWx1ZXMoCisJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkLCBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnR5VmFsdWVzKTsKKworCS8qKgorCSAqIGNsb25lIGFuZCBhc3NvY2lhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZSB3aXRoIHByb3BlcnR5IHZhbHVlcworCSAqIAorCSAqIEBwYXJhbSBjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2UKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eQorCSAqIEBwYXJhbSBjYXBhYmlsaXR5SW5zdFBhaXIKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgTGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2xvbmVBc3NvY2lhdGVDYXBhYmlsaXR5SW5zdGFuY2VXaXRoUHJvcGVydHlWYWx1ZXMoCisJCQlDb21wb25lbnRJbnN0YW5jZURhdGEgY3JlYXRlZENvbXBvbmVudEluc3RhbmNlLCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5LAorCQkJSW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4gY2FwYWJpbGl0eUluc3RQYWlyKTsKKworCUVpdGhlcjxCb29sZWFuLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVDYXBhYmlsaXR5SW5zdEV4aXN0ZW5jZShUaXRhblZlcnRleCBpbnN0YW5jZVZlcnRleCwKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQpOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lDYXBhYmlsaXR5T3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNhcGFiaWxpdHlPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY5MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lDYXBhYmlsaXR5T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9wZXJ0eURhdGE7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNhcGFiaWxpdHlPcGVyYXRpb24geworCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQ2FwYWJpbGl0eShTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLAorCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24pOworCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQ2FwYWJpbGl0eShTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLAorCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvKioKKwkgKiBAcGFyYW0gdW5pcXVlSWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eShTdHJpbmcgdW5pcXVlSWQpOworCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eShTdHJpbmcgdW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5KFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgU3RyaW5nIHJlc291cmNlSWQpOworCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eShTdHJpbmcgY2FwYWJpbGl0eU5hbWUsIFN0cmluZyByZXNvdXJjZUlkLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbENhcGFiaWxpdGllc1BhaXJzKAorCQkJU3RyaW5nIHJlc291cmNlSWQpOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbENhcGFiaWxpdGllcyhTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eUJ5Q2FwYWJpbGl0eURhdGEoCisJCQlDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YSk7CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgZ2V0Q2FwYWJpbGl0eVNvdXJjZXNMaXN0KFN0cmluZyByZXNvdXJjZUlkLCBMaXN0PFN0cmluZz4gZGVyaXZlZEZyb21MaXN0KTsKKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydGllc09mQ2FwYWJpbGl0eShTdHJpbmcgdW5pcXVlSWQsCisJCQlTdHJpbmcgY2FwYWJpbGl0eVR5cGUsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBuZXdQcm9wZXJ0aWVzKTsKKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydGllc09mQ2FwYWJpbGl0eShTdHJpbmcgdW5pcXVlSWQsCisJCQlTdHJpbmcgY2FwYWJpbGl0eVR5cGUsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBuZXdQcm9wZXJ0aWVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRDYXBhYmlsaXR5KFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLAorCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBiNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiB7CisKKwkvKioKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5VHlwZSgKKwkJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24pOworCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZENhcGFiaWxpdHlUeXBlKAorCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCS8qKgorCSAqIEBwYXJhbSB1bmlxdWVJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVR5cGUoU3RyaW5nIHVuaXF1ZUlkKTsKKworCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5VHlwZShTdHJpbmcgdW5pcXVlSWQsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MWUwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VJbnB1dDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXR0cmlidXRlVmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudEluc3RhbmNlRGF0YTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiB7CisKKwkvKioKKwkgKiBhZGQgcmVzb3VyY2UgaW5zdGFuY2UgdG8gc2VydmljZQorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXJDb21wb25lbnRJZAorCSAqICAgICAgICAgICAgLSBjb21wb25lbnQgaWQKKwkgKiBAcGFyYW0gaW5zdGFuY2VOdW1iZXIKKwkgKiAgICAgICAgICAgIC0gaW5zdGFuY2UgbnVtYmVyIG9mIHRoZSBjb21wb25lbnQgaW5zdGFuY2UKKwkgKiBAcGFyYW0gY29tcG9uZW50SW5zdGFuY2UKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIFN0cmluZyBpbnN0YW5jZU51bWJlciwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsCisJCQlOb2RlVHlwZUVudW0gaW5zdE5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJLyoqCisJICogYWRkIHJlc291cmNlIGluc3RhbmNlIHRvIHNlcnZpY2Ugd2l0aCBpbnRlcm5hbCB0cmFuc2FjdGlvbgorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXJDb21wb25lbnRJZAorCSAqIEBwYXJhbSBpbnN0YW5jZU51bWJlcgorCSAqIEBwYXJhbSBjb21wb25lbnRJbnN0YW5jZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIFN0cmluZyBpbnN0YW5jZU51bWJlciwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsCisJCQlOb2RlVHlwZUVudW0gaW5zdE5vZGVUeXBlKTsKKworCS8qKgorCSAqIGRlbGV0ZSByZXNvdXJjZSBpbnN0YW5jZSBmcm9tIGNvbXBvbmVudAorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXJDb21wb25lbnRJZAorCSAqICAgICAgICAgICAgLSBjb250YWluZXJDb21wb25lbnQgaWQKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0VWlkCisJICogICAgICAgICAgICAtIHJlc291cmNlIGluc3RhbmNlIHVpZAorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwKKwkJCVN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgU3RyaW5nIHJlc291cmNlSW5zdFVpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwKKwkJCVN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgU3RyaW5nIHJlc291cmNlSW5zdFVpZCk7CisKKwkvKioKKwkgKiBhc3NvY2lhdGUgMiByZXNvdXJjZSBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gcmVxdWlyZW1lbnQKKwkgKiAKKwkgKiBAcGFyYW0gc2VydmljZUlkCisJICogQHBhcmFtIGZyb21SZXNJbnN0YW5jZVVpZAorCSAqIEBwYXJhbSB0b1Jlc0luc3RhbmNlVWlkCisJICogQHBhcmFtIHJlcXVpcmVtZW50CisJICogQHBhcmFtIHJlbGF0aW9uc2hpcAorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHJldHVybgorCSAqLworCS8vIHB1YmxpYyBFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPgorCS8vIGFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKAorCS8vIFN0cmluZyBzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGZyb21SZXNJbnN0YW5jZVVpZCwKKwkvLyBTdHJpbmcgdG9SZXNJbnN0YW5jZVVpZCwgU3RyaW5nIHJlcXVpcmVtZW50LCBTdHJpbmcgcmVsYXRpb25zaGlwLAorCS8vIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvLyBwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4KKwkvLyBhc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcygKKwkvLyBTdHJpbmcgc2VydmljZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBmcm9tUmVzSW5zdGFuY2VVaWQsCisJLy8gU3RyaW5nIHRvUmVzSW5zdGFuY2VVaWQsIFN0cmluZyByZXF1aXJlbWVudCwgU3RyaW5nIHJlbGF0aW9uc2hpcCk7CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMoU3RyaW5nIHNlcnZpY2VJZCwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlbGF0aW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKFN0cmluZyBzZXJ2aWNlSWQsCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZWxhdGlvbik7CisKKwkvKioKKwkgKiAKKwkgKiBkaXNzb2NpYXRlIHRoZSByZWxhdGlvbiBiZXR3ZWVuIDIgcmVzb3VyY2UgaW5zdGFuY2VzIGZvciBhIGdpdmVuCisJICogcmVxdWlyZW1lbnQKKwkgKiAKKwkgKiBAcGFyYW0gc2VydmljZUlkCisJICogQHBhcmFtIGZyb21SZXNJbnN0YW5jZVVpZAorCSAqIEBwYXJhbSB0b1Jlc0luc3RhbmNlVWlkCisJICogQHBhcmFtIHJlcXVpcmVtZW50CisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRpc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhTdHJpbmcgc2VydmljZUlkLAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKFN0cmluZyBzZXJ2aWNlSWQsCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudERlZik7CisKKwkvKioKKwkgKiB1cGRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYSBnaXZlbiByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSBzZXJ2aWNlSWQKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZU5hbWUKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZQorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlc291cmNlSW5zdGFuY2UoU3RyaW5nIHNlcnZpY2VJZCwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lLCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlc291cmNlSW5zdGFuY2UoU3RyaW5nIHNlcnZpY2VJZCwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lLCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlKTsKKworCS8qKgorCSAqIGdldCBhbGwgcmVzb3VyY2UgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gc2VydmljZSBhbmQgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuCisJICogdGhlIHJlc291cmNlIGluc3RhbmNlcworCSAqIAorCSAqIEBwYXJhbSBzZXJ2aWNlSWQKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbENvbXBvbmVudEluc3RhbmNlcygKKwkJCVN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDb21wb25lbnRJbnN0YW5jZXNOYW1lcyhTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ29tcG9uZW50SW5zdGFuY2VzTmFtZXMoU3RyaW5nIGNvbXBvbmVudElkLAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlKTsKKworCS8qKgorCSAqIGdldCByZXNvdXJjZSBpbnN0YW5jZSBmcm9tIGlkCisJICogCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcmV0dXJuIHJlc291cmNlIGluc3RhbmNlIG9mIGdpdmVuIGlkCisJICovCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VJbnN0YW5jZUJ5SWQoU3RyaW5nIHJlc291cmNlSWQpOworCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsQ29tcG9uZW50SW5zdGFuY2VzKFN0cmluZyBzZXJ2aWNlSWQsCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxDb21wb25lbnRJbnN0YW5jZXMoU3RyaW5nIHNlcnZpY2VJZCwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGluY3JlYXNlQW5kR2V0UmVzb3VyY2VJbnN0YW5jZVNwZWNpZmljQ291bnRlcigKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkgY291bnRlclR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbXBvbmVudEluc3RMb2dpY2FsTmFtZShTdHJpbmcgaW5zdGFuY2VOdW1iZXIsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZU5hbWUpOworCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0NvbXBvbmVudEluc3RhbmNlTmFtZUV4aXN0KFN0cmluZyBwYXJlbnRDb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBwYXJlbnROb2RlVHlwZSwgU3RyaW5nIGNvbXBJbnN0SWQsIFN0cmluZyBjb21wb25lbnRJbnN0TmFtZSk7CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlUGFyZW50KFN0cmluZyBwYXJlbnRJZCwgU3RyaW5nIHVuaXFJZCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRGdWxsQ29tcG9uZW50SW5zdGFuY2UoCisJCQlDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUpOworCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0F2YWlsYWJsZVJlcXVpcmVtZW50KENvbXBvbmVudEluc3RhbmNlIGZyb21SZXNJbnN0YW5jZSwKKwkJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvblBhaXIpOworCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0F2YWlsYWJsZUNhcGFiaWx0eShDb21wb25lbnRJbnN0YW5jZSB0b1Jlc0luc3RhbmNlLAorCQkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uUGFpcik7CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VmFsdWVUb1Jlc291cmNlSW5zdGFuY2UoCisJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgSW50ZWdlciBpbmRleCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VmFsdWVUb1Jlc291cmNlSW5zdGFuY2UoCisJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgYm9vbGVhbiBpc3ZhbGlkYXRlLAorCQkJSW50ZWdlciBpbmRleCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCS8qKgorCSAqIEFkZHMgQXR0cmlidXRlIHRvIHJlc291cmNlIGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUKKwkgKiAgICAgICAgICAgICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZCAqIEBwYXJhbSBpbmRleCAqIEBwYXJhbQorCSAqICAgICAgICAgICAgaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKiovCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQXR0cmlidXRlVmFsdWVUb1Jlc291cmNlSW5zdGFuY2UoCisJCQlDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSByZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBJbnRlZ2VyIGluZGV4LAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydHlWYWx1ZUluUmVzb3VyY2VJbnN0YW5jZSgKKwkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJLyoqCisJICogVXBkYXRlcyBBdHRyaWJ1dGUgb24gcmVzb3VyY2UgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcGFyYW0gYXR0cmlidXRlCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUF0dHJpYnV0ZVZhbHVlSW5SZXNvdXJjZUluc3RhbmNlKAorCQkJQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxBdHRyaWJ1dGVWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVPclVwZGF0ZUF0dHJpYnV0ZU9mUmVzb3VyY2VJbnN0YW5jZSgKKwkJCUNvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGF0dHJpYnV0ZUluc3RhbmNlUHJvcGVydHksIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQpOworCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUlucHV0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRJbnB1dFZhbHVlVG9SZXNvdXJjZUluc3RhbmNlKAorCQkJQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBpbnB1dCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgSW50ZWdlciBpbm5lckVsZW1lbnQsIGJvb2xlYW4gYik7CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlSW5wdXQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUlucHV0VmFsdWVJblJlc291cmNlSW5zdGFuY2UoCisJCQlDb21wb25lbnRJbnN0YW5jZUlucHV0IGlucHV0LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBib29sZWFuIGIpOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmZXRjaENJRW52QXJ0aWZhY3RzKAorCQkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNvbXBvbmVudE9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lDb21wb25lbnRPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2VmZjEzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lDb21wb25lbnRPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuRmlsdGVyS2V5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50T3BlcmF0aW9uIHsKKwlwdWJsaWMgPFQgZXh0ZW5kcyBDb21wb25lbnQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnQoU3RyaW5nIGlkLCBDbGFzczxUPiBjbGF6eik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50QXJ0aWZhY3RzRm9yRGVsZXRlKFN0cmluZyBwYXJlbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBwYXJlbnRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rvbik7CisKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMaWdodENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnQoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIDxUPiBFaXRoZXI8TGlzdDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0RmlsdGVyZWRDb21wb25lbnRzKE1hcDxGaWx0ZXJLZXlFbnVtLCBTdHJpbmc+IGZpbHRlcnMsCisJCQlib29sZWFuIGluVHJhbnNjYXRpb24pOworCisJcHVibGljIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50QnlMYWJlbEFuZElkKFN0cmluZyB1bmlxdWVJZCwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgQ2xhc3M8VD4gY2xhenopOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNvbnN1bWVyT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUNvbnN1bWVyT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwNTUyYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JQ29uc3VtZXJPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29uc3VtZXJEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNvbnN1bWVyT3BlcmF0aW9uIHsKKworCS8qKgorCSAqIHRoZSBtZXRob2QgdXBkYXRlcyB0aGUgbm9kZSBpbiB0aGUgZ3JhcGggd2l0aCB0aGUgZ2l2ZW4gQ29uc3VtZXJEYXRhCisJICogCisJICogQHBhcmFtIGNvbnN1bWVyRGF0YQorCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB3ZSB3YW50IHRvIHN0b3JlCisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiAgICAgICAgICAgIGluVHJhbnNhY3Rpb24gaXMgdGhlIG9wZXJhdGlvbiBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24sIGluIGNhc2UKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBpcyBmYWxzZSB0aGUgYWN0aW9uIHdpbGwgYmUgY29tbWl0dGVkIGluIHRoZSBlbmQgb2YKKwkgKiAgICAgICAgICAgIHRoZSBtZXRob2QKKwkgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBncmFwaAorCSAqLworCUVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNyZWRlbnRpYWxzKENvbnN1bWVyRGF0YSBjb25zdW1lckRhdGEsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIHVwZGF0ZXMgdGhlIG5vZGUgaW4gdGhlIGdyYXBoIHdpdGggdGhlIGdpdmVuIENvbnN1bWVyRGF0YQorCSAqIAorCSAqIEBwYXJhbSBjb25zdW1lckRhdGEKKwkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2Ugd2FudCB0byBzdG9yZQorCSAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGdyYXBoCisJICovCisJRWl0aGVyPENvbnN1bWVyRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQ3JlZGVudGlhbHMoQ29uc3VtZXJEYXRhIGNvbnN1bWVyRGF0YSk7CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIGRlbGV0ZXMgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gdW5pcXVlIGlkCisJICogCisJICogQHBhcmFtIGNvbnN1bWVyTmFtZQorCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZCBieSB3aXRjaCB3ZSB3aWxsIGxvb2sgdXAgdGhlIGNyZWRlbnRpYWwgd2Ugd2FudAorCSAqICAgICAgICAgICAgdG8gZGVsZXRlCisJICogQHBhcmFtIGluVHJhbnNhY3Rpb24KKwkgKiAgICAgICAgICAgIGluVHJhbnNhY3Rpb24gaXMgdGhlIG9wZXJhdGlvbiBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24sIGluIGNhc2UKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBpcyBmYWxzZSB0aGUgYWN0aW9uIHdpbGwgYmUgY29tbWl0dGVkIGluIHRoZSBlbmQgb2YKKwkgKiAgICAgICAgICAgIHRoZSBtZXRob2QKKwkgKiBAcmV0dXJuIHRoZSBkZWxldGVkIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBncmFwaAorCSAqLworCUVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNyZWRlbnRpYWxzKFN0cmluZyBjb25zdW1lck5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIGRlbGV0ZXMgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gdW5pcXVlIGlkCisJICogCisJICogQHBhcmFtIGNvbnN1bWVyTmFtZQorCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBpZCBieSB3aXRjaCB3ZSB3aWxsIGxvb2sgdXAgdGhlIGNyZWRlbnRpYWwgd2Ugd2FudAorCSAqICAgICAgICAgICAgdG8gZGVsZXRlCisJICogQHJldHVybiB0aGUgZGVsZXRlZCBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgZ3JhcGgKKwkgKi8KKwlFaXRoZXI8Q29uc3VtZXJEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDcmVkZW50aWFscyhTdHJpbmcgY29uc3VtZXJOYW1lKTsKKworCS8qKgorCSAqIHRoZSBtZXRob2QgY3JlYXRlcyBhIG5ldyBub2QgaW4gdGhlIGdyYXBlIHJlcHJlc2VudGluZyB0aGUgc3VwcGxpZWQKKwkgKiBjcmVkZW50aWFsIG9iamVjdAorCSAqIAorCSAqIEBwYXJhbSBjb25zdW1lckRhdGEKKwkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2Ugd2FudCB0byBzdG9yZQorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogICAgICAgICAgICBpcyB0aGUgb3BlcmF0aW9uIHBhcnQgb2YgYSB0cmFuc2FjdGlvbiwgaW4gY2FzZSB0aGUgdmFsdWUgaXMKKwkgKiAgICAgICAgICAgIGZhbHNlIHRoZSBhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQgaW4gdGhlIGVuZCBvZiB0aGUgbWV0aG9kCisJICogQHJldHVybiB0aGUgbmV3bHkgc3RvcmVkIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBncmFwaAorCSAqLworCUVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNyZWRlbnRpYWxzKENvbnN1bWVyRGF0YSBjb25zdW1lckRhdGEsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbm9kIGluIHRoZSBncmFwZSByZXByZXNlbnRpbmcgdGhlIHN1cHBsaWVkCisJICogY3JlZGVudGlhbCBvYmplY3QKKwkgKiAKKwkgKiBAcGFyYW0gY29uc3VtZXJEYXRhCisJICogICAgICAgICAgICB0aGUgb2JqZWN0IHdlIHdhbnQgdG8gc3RvcmUKKwkgKiBAcmV0dXJuIHRoZSBuZXdseSBzdG9yZWQgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGdyYXBoCisJICovCisJRWl0aGVyPENvbnN1bWVyRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ3JlZGVudGlhbHMoQ29uc3VtZXJEYXRhIGNvbnN1bWVyRGF0YSk7CisKKwkvKioKKwkgKiB0aGUgbWV0aG9kIHJldHJpZXZlcyB0aGUgY3JlZGVudGlhbCBmb3IgdGhlIGdpdmVuIGNvbnN1bWVyIG5hbWUKKwkgKiAKKwkgKiBAcGFyYW0gY29uc3VtZXJOYW1lCisJICogICAgICAgICAgICB0aGUgdW5pcXVlIGlkIGJ5IHdpdGNoIHdlIHdpbGwgbG9vayB1cCB0aGUgY3JlZGVudGlhbAorCSAqIEByZXR1cm4gQ29uc3VtZXJEYXRhIG9yIHRoZSBlcnJvciByZWNlaXZlZCBkdXJpbmcgdGhlIG9wZXJhdGlvbgorCSAqLworCUVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENyZWRlbnRpYWxzKFN0cmluZyBjb25zdW1lck5hbWUpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSURhdGFUeXBlT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSURhdGFUeXBlT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmMTg4MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JRGF0YVR5cGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJRGF0YVR5cGVPcGVyYXRpb24geworCisJLyoqCisJICogQHBhcmFtIGRhdGFUeXBlRGVmaW5pdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkRGF0YVR5cGUoRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkRGF0YVR5cGUoRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0RGF0YVR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpOworCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldERhdGFUeXBlQnlOYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUVsZW1lbnRPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JRWxlbWVudE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMWMxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUVsZW1lbnRPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdFR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlTY29wZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5UYWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5Lkdyb3VwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2F0ZWdvcnlEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRPcGVyYXRpb24geworCisJRWl0aGVyPExpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxSZXNvdXJjZUNhdGVnb3JpZXMoKTsKKworCUVpdGhlcjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsU2VydmljZUNhdGVnb3JpZXMoKTsKKworCUVpdGhlcjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsUHJvZHVjdENhdGVnb3JpZXMoKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxUYWc+LCBBY3Rpb25TdGF0dXM+IGdldEFsbFRhZ3MoKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxQcm9wZXJ0eVNjb3BlPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxQcm9wZXJ0eVNjb3BlcygpOworCisJcHVibGljIEVpdGhlcjxMaXN0PEFydGlmYWN0VHlwZT4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsQXJ0aWZhY3RUeXBlcygpOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBPYmplY3Q+LCBBY3Rpb25TdGF0dXM+IGdldEFsbERlcGxveW1lbnRBcnRpZmFjdFR5cGVzKCk7CisKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIEFjdGlvblN0YXR1cz4gZ2V0RGVmYXVsdEhlYXRUaW1lb3V0KCk7CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxDYXRlZ29yeURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENhdGVnb3J5RGF0YShTdHJpbmcgbmFtZSwKKwkJCU5vZGVUeXBlRW51bSB0eXBlLCBDbGFzczxUPiBjbGF6eik7CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeS5DYXRlZ29yeURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE5ld0NhdGVnb3J5RGF0YSgKKwkJCVN0cmluZyBuYW1lLCBOb2RlVHlwZUVudW0gdHlwZSwgQ2xhc3M8VD4gY2xhenopOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBBY3Rpb25TdGF0dXM+IGdldFJlc291cmNlVHlwZXNNYXAoKTsKKworCUVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlQ2F0ZWdvcnkoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5LCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpOworCisJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVDYXRlZ29yeShDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnksIE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGRlbGV0ZUNhdGVnb3J5KE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNhdGVnb3J5SWQpOworCisJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBkZWxldGVTdWJDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBzdWJDYXRlZ29yeUlkKTsKKworCUVpdGhlcjxCb29sZWFuLCBBY3Rpb25TdGF0dXM+IGlzQ2F0ZWdvcnlVbmlxdWVGb3JUeXBlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIG5vcm1hbGl6ZWROYW1lKTsKKworCUVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlU3ViQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5SWQsIFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeSwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKKwlFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNyZWF0ZVN1YkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeUlkLCBTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnksCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGdldEFsbENhdGVnb3JpZXMoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBnZXRDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjYXRlZ29yeUlkKTsKKworCUVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gZ2V0U3ViQ2F0ZWdvcnlVbmlxdWVGb3JUeXBlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCVN0cmluZyBub3JtYWxpemVkTmFtZSk7CisKKwlFaXRoZXI8Qm9vbGVhbiwgQWN0aW9uU3RhdHVzPiBpc1N1YkNhdGVnb3J5VW5pcXVlRm9yQ2F0ZWdvcnkoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgc3ViQ2F0ZWdvcnlOb3JtTmFtZSwKKwkJCVN0cmluZyBwYXJlbnRDYXRlZ29yeUlkKTsKKworCUVpdGhlcjxHcm91cGluZ0RlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlR3JvdXBpbmcoU3RyaW5nIHN1YkNhdGVnb3J5SWQsIEdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZywKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKKwlFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGRlbGV0ZUdyb3VwaW5nKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGdyb3VwaW5nSWQpOworCisJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBnZXRTdWJDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBzdWJDYXRlZ29yeUlkKTsKKworCUVpdGhlcjxCb29sZWFuLCBBY3Rpb25TdGF0dXM+IGlzR3JvdXBpbmdVbmlxdWVGb3JTdWJDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBncm91cGluZ05vcm1OYW1lLAorCQkJU3RyaW5nIHBhcmVudFN1YkNhdGVnb3J5SWQpOworCisJRWl0aGVyPEdyb3VwaW5nRGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBnZXRHcm91cGluZ1VuaXF1ZUZvclR5cGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJU3RyaW5nIGdyb3VwaW5nTm9ybWFsaXplZE5hbWUpOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lHcmFwaExvY2tPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JR3JhcGhMb2NrT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2NWNlMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JR3JhcGhMb2NrT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKKworcHVibGljIGludGVyZmFjZSBJR3JhcGhMb2NrT3BlcmF0aW9uIHsKKworCXB1YmxpYyBhYnN0cmFjdCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpOworCisJcHVibGljIGFic3RyYWN0IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdW5sb2NrQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKTsKKworCXB1YmxpYyBhYnN0cmFjdCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGxvY2tDb21wb25lbnRCeU5hbWUoU3RyaW5nIG5hbWUsIE5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKKwlwdWJsaWMgYWJzdHJhY3QgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB1bmxvY2tDb21wb25lbnRCeU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JR3JvdXBPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JR3JvdXBPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjUyZWMwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lHcm91cE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdyb3VwRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BcnRpZmFjdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuR3JvdXBEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUdyb3VwT3BlcmF0aW9uIHsKKworCS8vIGFkZCBmdWxsIGdyb3VwIHRvIGNvbXBvbmVudAorCXB1YmxpYyBFaXRoZXI8R3JvdXBEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkR3JvdXBUb0dyYXBoKE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24pOworCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEdyb3VwKE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24pOworCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEdyb3VwKE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkR3JvdXBzKE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sCisJCQlTdHJpbmcgY29tcG9uZW50SWQsIExpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvLyBnZXQgZ3JvdXAKKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwRnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCk7CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXAoU3RyaW5nIHVuaXF1ZUlkKTsKKworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRHcm91cChTdHJpbmcgdW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwkvLyBnZXQgYWxsIGdyb3VwcyB1bmRlciBjb21wb25lbnQKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbEdyb3Vwc0Zyb21HcmFwaChTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0pOworCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbEdyb3VwcyhTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcFR5cGVFbnVtLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbEdyb3VwcyhTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcFR5cGVFbnVtKTsKKworCS8vIGRlbGV0ZSBhbGwgZ3JvdXBzIHVuZGVyIGNvbXBvbmVudAorCXB1YmxpYyBFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsR3JvdXBzRnJvbUdyYXBoKFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBjb21wVHlwZUVudW0pOworCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbEdyb3VwcyhTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcFR5cGVFbnVtLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbEdyb3VwcyhTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcFR5cGVFbnVtKTsKKworCS8vIEFzc29jaWF0aW9uCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFzc29jaWF0ZWRHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlKAorCQkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QXNzb2NpYXRlZEdyb3Vwc1RvQ29tcG9uZW50SW5zdGFuY2UoCisJCQlTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCk7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8U3RyaW5nPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFzc29jaWF0ZWRHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlRnJvbUdyYXBoKAorCQkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZShMaXN0PFN0cmluZz4gZ3JvdXBzLCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwKKwkJCVN0cmluZyBjb21wSW5zdE5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlKExpc3Q8U3RyaW5nPiBncm91cHMsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLAorCQkJU3RyaW5nIGNvbXBJbnN0TmFtZSk7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JhcGhSZWxhdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlT25HcmFwaCgKKwkJCUxpc3Q8U3RyaW5nPiBncm91cHMsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBTdHJpbmcgY29tcEluc3ROYW1lKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxHcmFwaFJlbGF0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRpc3NvY2lhdGVBbGxHcm91cHNGcm9tQXJ0aWZhY3RPbkdyYXBoKFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIGFydGlmYWN0SWQpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGlzc29jaWF0ZUFsbEdyb3Vwc0Zyb21BcnRpZmFjdChTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwKKwkJCVN0cmluZyBhcnRpZmFjdElkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGlzc29jaWF0ZUFsbEdyb3Vwc0Zyb21BcnRpZmFjdChTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwKKwkJCVN0cmluZyBhcnRpZmFjdElkKTsKKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBkaXNzb2NpYXRlQW5kQXNzb2NpYXRlR3JvdXBzRnJvbUFydGlmYWN0T25HcmFwaChTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyBvbGRBcnRpZmFjdElkLCBBcnRpZmFjdERhdGEgbmV3QXJ0aWZhY3QpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGlzc29jaWF0ZUFuZEFzc29jaWF0ZUdyb3Vwc0Zyb21BcnRpZmFjdChTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyBvbGRBcnRpZmFjdElkLCBBcnRpZmFjdERhdGEgbmV3QXJ0aWZhY3QsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkaXNzb2NpYXRlQW5kQXNzb2NpYXRlR3JvdXBzRnJvbUFydGlmYWN0KFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIG9sZEFydGlmYWN0SWQsIEFydGlmYWN0RGF0YSBuZXdBcnRpZmFjdCk7CisKKwlwdWJsaWMgYm9vbGVhbiBpc0dyb3VwRXhpc3QoU3RyaW5nIGdyb3VwTmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JR3JvdXBUeXBlT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUdyb3VwVHlwZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNjEyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUdyb3VwVHlwZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkdyb3VwVHlwZURhdGE7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJR3JvdXBUeXBlT3BlcmF0aW9uIHsKKworCS8qKgorCSAqIEBwYXJhbSBncm91cFR5cGVEZWZpbml0aW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkR3JvdXBUeXBlKEdyb3VwVHlwZURlZmluaXRpb24gZ3JvdXBUeXBlRGVmaW5pdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEdyb3VwVHlwZShHcm91cFR5cGVEZWZpbml0aW9uIGdyb3VwVHlwZURlZmluaXRpb24sCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJLyoqCisJICogQHBhcmFtIHVuaXF1ZUlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXBUeXBlKFN0cmluZyB1bmlxdWVJZCk7CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwVHlwZShTdHJpbmcgdW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdEdyb3VwVHlwZUJ5VHlwZShTdHJpbmcgbmFtZSk7CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdEdyb3VwVHlwZUJ5VHlwZShTdHJpbmcgbmFtZSwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwVHlwZUJ5VHlwZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsCisJCQlTdHJpbmcgdmVyc2lvbik7CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwVHlwZUJ5VHlwZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdEdyb3VwVHlwZUJ5TmFtZUZyb21HcmFwaChTdHJpbmcgbmFtZSk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JSGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JSGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTAzYjRmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lIZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5IZWF0UGFyYW1ldGVyVmFsdWVEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uIHsKKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnRpZXNUb0dyYXBoKExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHByb3BlcnRpZXMsIFN0cmluZyByZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZ2V0SGVhdFBhcmFtZXRlcnNPZk5vZGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdW5pcXVlSWQsIExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHByb3BlcnRpZXMpOworCisJcHVibGljIEVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsSGVhdFBhcmFtZXRlcnNBc3NvY2lhdGVkVG9Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkKTsKKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUFsbEhlYXRWYWx1ZXNBc3NvY2lhdGVkVG9Ob2RlKE5vZGVUeXBlRW51bSBwYXJlbnROb2RlVHlwZSwgU3RyaW5nIHBhcmVudFVuaXF1ZUlkKTsKKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtKTsKKworCXB1YmxpYyBFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlSGVhdFBhcmFtZXRlclZhbHVlKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbSwgU3RyaW5nIGFydGlmYWN0SWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBhcnRpZmFjdExhYmVsKTsKKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZUhlYXRQYXJhbWV0ZXJzKExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHByb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lJbnB1dHNPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JSW5wdXRzT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZjJhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JSW5wdXRzT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RJbnB1dHNNYXA7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VJbnB1dDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW5wdXREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkF0dHJpYnV0ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuSW5wdXRzRGF0YTsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJSW5wdXRzT3BlcmF0aW9uIHsKKworCUVpdGhlcjxTdHJpbmcsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUlucHV0KFN0cmluZyBpbnB1dElkKTsKKworCUVpdGhlcjxMaXN0PElucHV0RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRJbnB1dHNUb0dyYXBoKFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBpbnB1dHMsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKTsKKworCUVpdGhlcjxMaXN0PElucHV0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZElucHV0c1RvQ29tcG9uZW50KFN0cmluZyByZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnRJbnN0SW5wdXRzTWFwIGNvbXBvbmVudEluc0lucHV0cywgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpOworCisJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZE5vZGVOb25JbmhlcmV0ZWRJbnB1dHMoU3RyaW5nIHVuaXF1ZUlkLCBMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzKTsKKworCUVpdGhlcjxMaXN0PElucHV0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldElucHV0c09mQ29tcG9uZW50KFN0cmluZyBjb21wSWQsIFN0cmluZyBmcm9tTmFtZSwKKwkJCWludCBhbW91bnQpOworCisJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxJbnB1dHNPZlJlc291cmNlSW5zdGFuY2UoCisJCQlDb21wb25lbnRJbnN0YW5jZSBjb21wSW5zdGFuY2UpOworCisJRWl0aGVyPE1hcDxTdHJpbmcsIElucHV0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbElucHV0c0Fzc29jaWF0ZWRUb05vZGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJU3RyaW5nIHVuaXF1ZUlkKTsKKworCS8vIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmROb2RlTm9uSW5oZXJldGVkQXR0cmlidWVzKFN0cmluZyB1bmlxdWVJZCwKKwkvLyBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIExpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlcyk7CisKKwlFaXRoZXI8SW5wdXRzRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkSW5wdXQoU3RyaW5nIGlucHV0TmFtZSwgSW5wdXREZWZpbml0aW9uIGlucHV0RGVmaW5pdGlvbiwKKwkJCVN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKTsKKworCUVpdGhlcjxJbnB1dHNEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkSW5wdXRUb0dyYXBoKFN0cmluZyBwcm9wZXJ0eU5hbWUsIElucHV0RGVmaW5pdGlvbiBpbnB1dERlZmluaXRpb24sCisJCQlTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSk7CisKKwlFaXRoZXI8QXR0cmlidXRlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlSW5wdXQoU3RyaW5nIGlucHV0SWQsIElucHV0RGVmaW5pdGlvbiBuZXdJbkRlZiwKKwkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKTsKKworCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRBbGxSZXNvdXJjZUlucHV0cyhTdHJpbmcgdW5pcXVlSWQsIExpc3Q8SW5wdXREZWZpbml0aW9uPiBpbnB1dHMpOworCisJRWl0aGVyPElucHV0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0SW5wdXRCeUlkKFN0cmluZyB1bmlxdWVJZCwgYm9vbGVhbiBza2lwUHJvcGVydGllcywKKwkJCWJvb2xlYW4gc2tpcGlucHV0c1ZhbHVlKTsKKworCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZElucHV0c1RvR3JhcGgoVGl0YW5WZXJ0ZXggbWV0YWRhdGEsIFN0cmluZyBjb21wb25lbnRJZCwgTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBpbnB1dHMsCisJCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcyk7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiY2I2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5JbnRlcmZhY2VEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JbnRlcmZhY2VEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIHsKKworCXB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlSW50ZXJmYWNlT25SZXNvdXJjZShJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZiwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgYm9vbGVhbiBmYWlsSWZFeGlzdCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUludGVyZmFjZU9uUmVzb3VyY2UoSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmYsIFN0cmluZyByZXNvdXJjZUlkLAorCQkJU3RyaW5nIGludGVyZmFjZU5hbWUsIGJvb2xlYW4gZmFpbElmRXhpc3QsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgpOworCisJcHVibGljIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRJbnRlcmZhY2VUb1Jlc291cmNlKEludGVyZmFjZURlZmluaXRpb24gaW50ZXJmLAorCQkJU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKKworCXB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkSW50ZXJmYWNlVG9SZXNvdXJjZShJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZiwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCS8vIHB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4KKwkvLyBnZXRJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZUlkKTsKKwkvLworCS8vIHB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4KKwkvLyBnZXRJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxPcGVyYXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUludGVyZmFjZU9wZXJhdGlvbihTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGludGVyZmFjZU5hbWUsCisJCQlTdHJpbmcgb3BlcmF0aW9uTmFtZSwgT3BlcmF0aW9uIGludGVyZik7CisKKwlwdWJsaWMgRWl0aGVyPE9wZXJhdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlSW50ZXJmYWNlT3BlcmF0aW9uKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwKKwkJCVN0cmluZyBvcGVyYXRpb25OYW1lLCBPcGVyYXRpb24gaW50ZXJmLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxPcGVyYXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUludGVyZmFjZU9wZXJhdGlvbihTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGludGVyZmFjZU5hbWUsCisJCQlTdHJpbmcgb3BlcmF0aW9uTmFtZSk7CisKKwlwdWJsaWMgRWl0aGVyPE9wZXJhdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlSW50ZXJmYWNlT3BlcmF0aW9uKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwKKwkJCVN0cmluZyBvcGVyYXRpb25OYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsSW50ZXJmYWNlc09mUmVzb3VyY2UoCisJCQlTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiByZWN1cnNpdmVseSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbEludGVyZmFjZXNPZlJlc291cmNlKAorCQkJU3RyaW5nIHJlc291cmNlSWQsIGJvb2xlYW4gcmVjdXJzaXZlbHkpOworCisJcHVibGljIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVJbnRlcmZhY2VPZlJlc291cmNlT25HcmFwaChTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCUludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVJbnRlcmZhY2VUeXBlKEludGVyZmFjZURlZmluaXRpb24gaW50ZXJmKTsKKworCXB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlSW50ZXJmYWNlVHlwZShJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZiwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlSWQpOworCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlSW50ZXJmYWNlVG9Ob2RlKEdyYXBoTm9kZSBub2RlLCBJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24sCisJCQlUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCk7CisKKwlwdWJsaWMgRWl0aGVyPE9wZXJhdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U3BlY2lmaWNPcGVyYXRpb24oU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VUeXBlLAorCQkJU3RyaW5nIG9wZXJhdGlvbk5hbWUpOworCisJcHVibGljIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkaXNzb2NpYXRlSW50ZXJmYWNlRnJvbU5vZGUoR3JhcGhOb2RlIG5vZGUsCisJCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24pOworCisJcHVibGljIFN0cmluZyBnZXRTaG9ydEludGVyZmFjZU5hbWUoSW50ZXJmYWNlRGF0YURlZmluaXRpb24gaW50ZXJmYWNlRGVmaW5pdGlvbik7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSUxpZmVjeWNsZU9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lMaWZlY3ljbGVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjgyZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lMaWZlY3ljbGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXNvdXJjZU9wZXJhdGlvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElMaWZlY3ljbGVPcGVyYXRpb24geworCisJcHVibGljIFJlc291cmNlT3BlcmF0aW9uIGdldFJlc291cmNlT3BlcmF0aW9uKCk7CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudE93bmVyKFN0cmluZyByZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja2luQ29tcG9uZW50KE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCUNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCUNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja291dENvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIG1vZGlmaWVyLCBVc2VyIGN1cnJlbnRPd25lciwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2VydGlmeUNvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIG1vZGlmaWVyLCBVc2VyIGN1cnJlbnRPd25lciwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2FuY2VsT3JGYWlsQ2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBMaWZlY3ljbGVTdGF0ZUVudW0gbmV4dFN0YXRlLCBib29sZWFuIGIpOworCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVPbGRDb21wb25lbnRWZXJzaW9ucyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIHV1aWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVuZG9DaGVja291dChOb2RlVHlwZUVudW0gbm9kZVR5cGUsIENvbXBvbmVudCByZXNvdXJjZSwKKwkJCVVzZXIgbW9kaWZpZXIsIFVzZXIgY3VycmVudE93bmVyLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIENvbXBvbmVudE9wZXJhdGlvbiBnZXRDb21wb25lbnRPcGVyYXRpb24oTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGUpOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVBvbGljeVR5cGVPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JUG9saWN5VHlwZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjg5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVBvbGljeVR5cGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qb2xpY3lUeXBlRGVmaW5pdGlvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElQb2xpY3lUeXBlT3BlcmF0aW9uIHsKKworCUVpdGhlcjxQb2xpY3lUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0UG9saWN5VHlwZUJ5VHlwZShTdHJpbmcgcG9saWN5VHlwZU5hbWUpOworCisJRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRQb2xpY3lUeXBlKFBvbGljeVR5cGVEZWZpbml0aW9uIHBvbGljeVR5cGUpOworCisJRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRQb2xpY3lUeXBlKFN0cmluZyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCUVpdGhlcjxQb2xpY3lUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUG9saWN5VHlwZShQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xpY3lUeXBlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lQcm9kdWN0T3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVByb2R1Y3RPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZlYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lQcm9kdWN0T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9kdWN0OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVByb2R1Y3RPcGVyYXRpb24gZXh0ZW5kcyBJQ29tcG9uZW50T3BlcmF0aW9uIHsKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UHJvZHVjdD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFByb2R1Y3RDYXRhbG9nRGF0YShib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCk7CisKKwlwdWJsaWMgRWl0aGVyPFByb2R1Y3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVByb2R1Y3QoUHJvZHVjdCBwcm9kdWN0LCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVQcm9kdWN0KFN0cmluZyBwcm9kdWN0SWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UHJvZHVjdD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEZvbGxvd2VkKFN0cmluZyB1c2VySWQsCisJCQlTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMsIFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCk7CisKKwlwdWJsaWMgdm9pZCBjb21taXQoKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lQcm9wZXJ0eU9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lQcm9wZXJ0eU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDk1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVByb3BlcnR5T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JQ29tcGxleERlZmF1bHRWYWx1ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlPcGVyYXRpb24geworCisJLyoqCisJICogYWRkIHByb3BlcnR5IHRvIHJlc291cmNlCisJICogCisJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCSAqIEBwYXJhbSBwcm9wZXJ0eURlZmluaXRpb24KKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcGFyYW0gaWQKKwkgKiBAcmV0dXJuCisJICogCisJICogCQlwdWJsaWMgRWl0aGVyPFByb3BlcnR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4KKwkgKiAgICAgICAgIGFkZFByb3BlcnR5VG9SZXNvdXJjZSggU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlEZWZpbml0aW9uCisJICogICAgICAgICBwcm9wZXJ0eURlZmluaXRpb24sIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGlkKTsKKwkgKi8KKworCS8qKgorCSAqIGdldCBwcm9wZXJ0eSBiZWxvbmdzIHRvIHJlc291cmNlCisJICogCisJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCSAqICAgICAgICAgICAgLSBwcm9wZXJ0eSBuYW1lCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiAgICAgICAgICAgIC0gcmVzb3VyY2UgdW5pcXVlIGlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8UHJvcGVydHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRQcm9wZXJ0eU9mUmVzb3VyY2UoU3RyaW5nIHByb3BlcnR5TmFtZSwKKwkJCVN0cmluZyByZXNvdXJjZUlkKTsKKworCS8qKgorCSAqIERlbGV0ZSBhbGwgcHJvcGVydGllcyBvZiByZXNvdXJjZQorCSAqIAorCSAqIEBwYXJhbSBub2RlVHlwZQorCSAqIEBwYXJhbSB1bmlxdWVJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFByb3BlcnRpZXNBc3NvY2lhdGVkVG9Ob2RlKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdW5pcXVlSWQpOworCisJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eURlZmF1bHRWYWx1ZVZhbGlkKElDb21wbGV4RGVmYXVsdFZhbHVlIHByb3BlcnR5RGVmaW5pdGlvbiwKKwkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKTsKKworCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlUeXBlVmFsaWQoSUNvbXBsZXhEZWZhdWx0VmFsdWUgcHJvcGVydHlEZWZpbml0aW9uKTsKKworCXB1YmxpYyBJbW11dGFibGVQYWlyPFN0cmluZywgQm9vbGVhbj4gaXNQcm9wZXJ0eUlubmVyVHlwZVZhbGlkKElDb21wbGV4RGVmYXVsdFZhbHVlIHByb3BlcnR5RGVmaW5pdGlvbiwKKwkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKTsKKworCS8qKgorCSAqIEBwYXJhbSBkYXRhVHlwZURlZmluaXRpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZERhdGFUeXBlKERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24pOworCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZERhdGFUeXBlKERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24sCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldERhdGFUeXBlQnlOYW1lKFN0cmluZyBuYW1lKTsKKworCXB1YmxpYyBFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhVHlwZUJ5TmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhVHlwZUJ5TmFtZVdpdGhvdXREZXJpdmVkKFN0cmluZyBuYW1lLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhVHlwZUJ5TmFtZVdpdGhvdXREZXJpdmVkKFN0cmluZyBuYW1lKTsKKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkoSUNvbXBsZXhEZWZhdWx0VmFsdWUgcHJvcGVydHlEZWZpbml0aW9uLAorCQkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpOworCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZURhdGFUeXBlKERhdGFUeXBlRGVmaW5pdGlvbiBuZXdEYXRhVHlwZURlZmluaXRpb24sCisJCQlEYXRhVHlwZURlZmluaXRpb24gb2xkRGF0YVR5cGVEZWZpbml0aW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZURhdGFUeXBlKERhdGFUeXBlRGVmaW5pdGlvbiBuZXdEYXRhVHlwZURlZmluaXRpb24sCisJCQlEYXRhVHlwZURlZmluaXRpb24gb2xkRGF0YVR5cGVEZWZpbml0aW9uKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lSZXF1aXJlbWVudE9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lSZXF1aXJlbWVudE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTliZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVJlcXVpcmVtZW50T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRJbXBsRGVmOworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgaW50ZXJmYWNlIElSZXF1aXJlbWVudE9wZXJhdGlvbiB7CisKKwkvKioKKwkgKiBhZGQgYSByZXF1aXJlbWVudCB0byByZXNvdXJjZQorCSAqIAorCSAqIEBwYXJhbSByZXFOYW1lCisJICogQHBhcmFtIHJlcURlZmluaXRpb24KKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcGFyYW0gdW5pcXVlSWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZShTdHJpbmcgcmVxTmFtZSwKKwkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uLCBTdHJpbmcgcmVzb3VyY2VJZCk7CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlKFN0cmluZyByZXFOYW1lLAorCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcURlZmluaXRpb24sIFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50SW1wbFRvUmVzb3VyY2UoU3RyaW5nIHJlcU5hbWUsCisJCQlSZXF1aXJlbWVudEltcGxEZWYgcmVxRGVmaW5pdGlvbiwgU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBwYXJlbnRSZXFVbmlxdWVJZCk7CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnRJbXBsVG9SZXNvdXJjZShTdHJpbmcgcmVxTmFtZSwKKwkJCVJlcXVpcmVtZW50SW1wbERlZiByZXFEZWZpbml0aW9uLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHBhcmVudFJlcVVuaXF1ZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJLyoqCisJICogZ2V0IHJlcXVpcmVtZW50IG9mIHJlc291cmNlCisJICogCisJICogQHBhcmFtIHJlcU5hbWUKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVxdWlyZW1lbnRPZlJlc291cmNlKFN0cmluZyByZXFOYW1lLAorCQkJU3RyaW5nIHJlc291cmNlSWQpOworCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlcXVpcmVtZW50T2ZSZXNvdXJjZShTdHJpbmcgcmVxTmFtZSwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxSZXNvdXJjZVJlcXVpcmVtZW50cygKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbFJlcXVpcmVtZW50c09mUmVzb3VyY2VPbmx5KAorCQkJU3RyaW5nIHJlc291cmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhTdHJpbmcgcmVzb3VyY2VJZCk7CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFJlcXVpcmVtZW50cyhTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlcXVpcmVtZW50KFN0cmluZyB1bmlxdWVJZCk7CisKKwlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZShUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCwgU3RyaW5nIHJlcU5hbWUsCisJCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxRGVmaW5pdGlvbiwgU3RyaW5nIHJlc291cmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVJlc291cmNlT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVJlc291cmNlT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5MzgwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JUmVzb3VyY2VPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VPcGVyYXRpb24gZXh0ZW5kcyBJQ29tcG9uZW50T3BlcmF0aW9uIHsKKworCXB1YmxpYyBUaXRhbkdlbmVyaWNEYW8gZ2V0VGl0YW5HZW5lcmljRGFvKCk7CisKKwkvLyBwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpOworCS8vCisJLy8gcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdW5sb2NrUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpOworCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpOworCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VJZCk7CisKKwkvLyBwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZV90eChTdHJpbmcKKwkvLyByZXNvdXJjZUlkLGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCS8qKgorCSAqIHRoZSBtZXRob2QgcmV0cmlldmVzIGFsbCB0aGUgY2VydGlmaWVkIHJlc291cmNlcywgdGhlIHJldHVybmVkIHZhbHVlcyBhcmUKKwkgKiBvbmx5IGFic3RyYWN0IG9yIG9ubHkgbm9uZSBhYnN0cmFjdCBhY2NvcmRpbmcgdG8gdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMuCisJICogCisJICogQHBhcmFtIGdldEFic3RyYWN0CisJICogICAgICAgICAgICB0aGUgdmFsdWUgZGVmaW5lcyB3aGljaCByZXNvdXJjZXMgdG8gcmV0dXJuIG9ubHkgYWJzdHJhY3Qgb3IKKwkgKiAgICAgICAgICAgIG9ubHkgbm9uZSBhYnN0cmFjdAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDZXJ0aWZpZWRSZXNvdXJjZXMoYm9vbGVhbiBnZXRBYnN0cmFjdCk7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDZXJ0aWZpZWRSZXNvdXJjZXMoYm9vbGVhbiBnZXRBYnN0cmFjdCwKKwkJCUJvb2xlYW4gaXNIaWdoZXN0KTsKKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVSZXNvdXJjZU5hbWVFeGlzdHMoU3RyaW5nIHJlc291cmNlTmFtZSwKKwkJCVJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlKTsKKworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkKTsKKworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpOworCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE51bWJlck9mUmVzb3VyY2VzQnlOYW1lKFN0cmluZyByZXNvdXJjZU5hbWUpOworCisJLy8gcHVibGljIEVpdGhlcjxMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+CisJLy8gZ2V0UmVzb3VyY2VBcnRpZmFjdHNGb3JEZWxldGUoUmVzb3VyY2UgcmVzb3VyY2UpOworCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Rm9sbG93ZWQoU3RyaW5nIHVzZXJJZCwKKwkJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxpZmVjeWNsZVN0YXRlcywgU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGFzdFN0YXRlU3RhdGVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxTZXQ8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXRhbG9nRGF0YShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdEJ5TmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gb3ZlcnJpZGVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgcmVzb3VyY2VTYXZlZCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRUZXN0ZXJGb2xsb3dlZChTdHJpbmcgdXNlcklkLAorCQkJU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VMaXN0QnlVdWlkKFN0cmluZyB1dWlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0UmVzb3VyY2VCeVV1aWQoU3RyaW5nIHV1aWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZUxpc3RCeVN5c3RlbU5hbWUoU3RyaW5nIHN5c3RlbU5hbWUsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VDYXRhbG9nRGF0YShib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VDYXRhbG9nRGF0YVZGTGF0ZXN0Q2VydGlmaWVkQW5kTm9uQ2VydGlmaWVkKAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbik7CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZUJ5U3lzdGVtTmFtZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJLy8gcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4KKwkvLyBnZXRBbGxOb3RDaGVja291dFJlc291cmNlcyhib29sZWFuIGdldEFic3RyYWN0KTsKKworCS8vIHB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+CisJLy8gZ2V0QWxsTm90Q2hlY2tvdXRSZXNvdXJjZXMoYm9vbGVhbiBnZXRBYnN0cmFjdCwgQm9vbGVhbiBpc0hpZ2hlc3QpOworCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbFJlc291cmNlc01hcmtlZEZvckRlbGV0aW9uKCk7CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGlzUmVzb3VyY2VJblVzZShTdHJpbmcgcmVzb3VyY2VUb0RlbGV0ZSk7CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXRlc3RCeVRvc2NhUmVzb3VyY2VOYW1lKFN0cmluZyB0b3NjYVJlc291cmNlTmFtZSwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVFeGlzdHMoU3RyaW5nIHRlbXBsYXRlTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVNlcnZpY2VPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JU2VydmljZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZWI3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9hcGkvSVNlcnZpY2VPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDg4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EaXN0cmlidXRpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGludGVyZmFjZSBJU2VydmljZU9wZXJhdGlvbiBleHRlbmRzIElDb21wb25lbnRPcGVyYXRpb24geworCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSk7CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlKFN0cmluZyB1bmlxdWVJZCk7CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFNlcnZpY2UoU3RyaW5nIHVuaXF1ZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCS8vIHB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZV90eChTdHJpbmcKKwkvLyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlU2VydmljZShTdHJpbmcgdW5pcXVlSWQpOworCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVTZXJ2aWNlKFN0cmluZyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVTZXJ2aWNlTmFtZUV4aXN0cyhTdHJpbmcgc2VydmljZU5hbWUpOworCisJcHVibGljIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRGb2xsb3dlZChTdHJpbmcgdXNlcklkLAorCQkJU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzLCBTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsYXN0U3RhdGVTdGF0ZXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxTZXQ8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENhdGFsb2dEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2gsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRUZXN0ZXJGb2xsb3dlZChTdHJpbmcgdXNlcklkLAorCQkJU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxTZXQ8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENlcnRpZmllZFNlcnZpY2VzV2l0aERpc3RTdGF0dXMoCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoLCBTZXQ8RGlzdHJpYnV0aW9uU3RhdHVzRW51bT4gZGlzdFN0YXR1cywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlRGVzdHJpYnV0aW9uU3RhdHVzKFNlcnZpY2Ugc2VydmljZSwgVXNlciB1c2VyLAorCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bSBkaXN0cmlidXRpb25TdGF0dXMpOworCisJcHVibGljIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlQ2F0YWxvZ0RhdGEoYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZUNhdGFsb2dEYXRhTGF0ZXN0Q2VydGlmaWVkQW5kTm90Q2VydGlmaWVkKAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24pOworCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlQnlTeXN0ZW1OYW1lQW5kVmVyc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlTGlzdEJ5VXVpZChTdHJpbmcgdXVpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0U2VydmljZUJ5VXVpZChTdHJpbmcgdXVpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZUxpc3RCeVN5c3RlbU5hbWUoU3RyaW5nIHN5c3RlbU5hbWUsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL0lVc2VyQWRtaW5PcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JVXNlckFkbWluT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NzY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9JVXNlckFkbWluT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkZ1bmN0aW9uYWxNZW51SW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVVzZXJBZG1pbk9wZXJhdGlvbiB7CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZ2V0VXNlckRhdGEoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pOworCisJcHVibGljIEVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGdldEluYWN0aXZlVXNlckRhdGEoU3RyaW5nIGlkKTsKKworCXB1YmxpYyBFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2F2ZVVzZXJEYXRhKFVzZXIgdXNlcik7CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVVzZXJEYXRhKFVzZXIgdXNlcik7CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlQWN0aXZhdGVVc2VyKFVzZXIgdXNlcik7CisKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZGVsZXRlVXNlckRhdGEoU3RyaW5nIGlkKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxVc2VyPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxVc2Vyc1dpdGhSb2xlKFN0cmluZyByb2xlLCBTdHJpbmcgc3RhdHVzKTsKKworCXB1YmxpYyBFaXRoZXI8TGlzdDxFZGdlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0VXNlclBhbmRpbmdUYXNrc0xpc3QoVXNlciB1c2VyLAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKKworCXB1YmxpYyBFaXRoZXI8SW1tdXRhYmxlUGFpcjxVc2VyLCBGdW5jdGlvbmFsTWVudUluZm8+LCBBY3Rpb25TdGF0dXM+IGdldFVzZXJEYXRhV2l0aEZ1bmN0aW9uYWxNZW51KFN0cmluZyB1c2VySWQpOworCisJcHVibGljIEVpdGhlcjxGdW5jdGlvbmFsTWVudUluZm8sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVPclVwZGF0ZUZ1bmN0aW9uYWxNZW51KFN0cmluZyB1c2VySWQsCisJCQlTdHJpbmcgbmV3RnVuY3Rpb25hbE1lbnUpOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvYXBpL1N0b3JhZ2VPcGVyYXRpb25TdGF0dXMuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9TdG9yYWdlT3BlcmF0aW9uU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzNDZhMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2FwaS9TdG9yYWdlT3BlcmF0aW9uU3RhdHVzLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpOworCitwdWJsaWMgZW51bSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHsKKworCU9LLCBDT05ORUNUSU9OX0ZBSUxVUkUsIEJBRF9SRVFVRVNULCBFTlRJVFlfQUxSRUFEWV9FWElTVFMsIEdSQVBIX0lTX0xPQ0ssIEdFTkVSQUxfRVJST1IsIFVTRVJfTk9UX0ZPVU5ELCBQRVJNSVNTSU9OX0VSUk9SLCBIVFRQX1BST1RPQ09MX0VSUk9SLCBTVE9SQUdFX05PVF9BVkFJTEFCTEUsIFJFQURfT05MWV9TVE9SQUdFLCBTVE9SQUdFX0xFR0FDWV9JTkRFWF9FUlJPUiwgU0NIRU1BX0VSUk9SLCBUUkFOU0FDVElPTl9FUlJPUiwgRVhFVUNUSU9OX0ZBSUxFRCwgTk9UX0ZPVU5ELCBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCwgQ0FURUdPUllfTk9UX0ZPVU5ELCBQQVJFTlRfUkVTT1VSQ0VfTk9UX0ZPVU5ELCBNVUxUSVBMRV9QQVJFTlRfUkVTT1VSQ0VfRk9VTkQsIElOQ09OU0lTVEVOQ1ksIEdSQVBIX0lTX05PVF9BVkFJTEFCTEUsIFNDSEVNQV9WSU9MQVRJT04sIEZBSUxFRF9UT19MT0NLX0VMRU1FTlQsIElOVkFMSURfSUQsIE1BVENIX05PVF9GT1VORCwgQVJUSUZBQ1RfTk9UX0ZPVU5ELCBESVNUUl9FTlZJUk9OTUVOVF9OT1RfQVZBSUxBQkxFLCBESVNUUl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQsIERJU1RSX0VOVklST05NRU5UX1NFTlRfSVNfSU5WQUxJRCwgRElTVFJfQVJUSUZBQ1RfTk9UX0ZPVU5ELCBPVkVSTE9BRCwgSU5WQUxJRF9UWVBFLCBJTlZBTElEX1ZBTFVFLCBJTlZBTElEX0lOTkVSX1RZUEUsIENTQVJfTk9UX0ZPVU5ELCBHUk9VUF9JTlZBTElEX0NPTlRFTlQsIENBTk5PVF9VUERBVEVfRVhJU1RJTkdfRU5USVRZLCBQUk9QRVJUWV9OQU1FX0FMUkVBRFlfRVhJU1RTLCBJTlZBTElEX1BST1BFUlRZLDsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9BYnN0cmFjdE9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9BYnN0cmFjdE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YmJhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0Fic3RyYWN0T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw0MTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuU2NoZW1hRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklDb21wbGV4RGVmYXVsdFZhbHVlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5BcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb24uUHJvcGVydHlDb25zdHJhaW50RGVzZXJpYWxpc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuUHJvcGVydHlWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzLkRhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuUHJvcGVydHlUeXBlVmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlJbnN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9wZXJ0eVZhbHVlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3BlcmF0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByb3RlY3RlZCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1ZBTFVFID0gbnVsbDsKKworCXByb3RlY3RlZCBHc29uIGdzb24gPSBuZXcgR3NvbigpOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcm90ZWN0ZWQgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIGFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZTsKKworCXByb3RlY3RlZCBEYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlciBkYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlciA9IERhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyLmdldEluc3RhbmNlKCk7CisKKwlwcm90ZWN0ZWQgPFNvbWVEYXRhIGV4dGVuZHMgR3JhcGhOb2RlLCBTb21lRGVmZW5pdGlvbj4gRWl0aGVyPFNvbWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkRGVmaW5pdGlvblRvTm9kZVR5cGUoU29tZURlZmVuaXRpb24gc29tZURlZmluaXRpb24sIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIG5vZGVVbmlxdWVJZCwgZmluYWwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VUeXBlLAorCQkJU3VwcGxpZXI8U29tZURhdGE+IGRhdGFCdWlsZGVyLCBTdXBwbGllcjxTdHJpbmc+IGRlZk5hbWVHZW5lcmF0b3IpIHsKKwkJU3RyaW5nIGRlZk5hbWUgPSBkZWZOYW1lR2VuZXJhdG9yLmdldCgpOworCQlsb2cuZGVidWcoIkdvdCB7fSB7fSIsIGRlZk5hbWUsIHNvbWVEZWZpbml0aW9uKTsKKworCQlTb21lRGF0YSBzb21lRGF0YSA9IGRhdGFCdWlsZGVyLmdldCgpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyB7fSB0byBncmFwaC4gZGF0YSA9IHt9IiwgZGVmTmFtZSwgc29tZURhdGEpOworCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlFaXRoZXI8U29tZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJTb21lRGF0YSA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHNvbWVEYXRhLCAoQ2xhc3M8U29tZURhdGE+KSBzb21lRGF0YS5nZXRDbGFzcygpKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyB7fSB0byBncmFwaC4gc3RhdHVzIGlzID0ge30iLCBkZWZOYW1lLCBlaXRoZXJTb21lRGF0YSk7CisKKwkJaWYgKGVpdGhlclNvbWVEYXRhLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gZWl0aGVyU29tZURhdGEucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHt9ICB0byBncmFwaC4gc3RhdHVzIGlzIHt9IiwgZGVmTmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCQlVbmlxdWVJZERhdGEgdW5pcXVlSWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShub2RlVHlwZSwgbm9kZVVuaXF1ZUlkKTsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgYXNzb2NpYXRpbmcge30gdG8ge30uIiwgdW5pcXVlSWREYXRhLCBkZWZOYW1lKTsKKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlbGF0aW9ucyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbih1bmlxdWVJZERhdGEsIGVpdGhlclNvbWVEYXRhLmxlZnQoKS52YWx1ZSgpLCBlZGdlVHlwZSwgbnVsbCk7CisJCWlmIChlaXRoZXJSZWxhdGlvbnMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBlaXRoZXJSZWxhdGlvbnMucmlnaHQoKS52YWx1ZSgpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJBZGREZWZpbml0aW9uVG9Ob2RlVHlwZSIsICJGYWlsZWQgdG8gYXNzb2NpYXRlIiArIG5vZGVUeXBlLmdldE5hbWUoKSArICIgIiArIG5vZGVVbmlxdWVJZCArICJ0byAiICsgZGVmTmFtZSArICJpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXMsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChlaXRoZXJTb21lRGF0YS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJvdGVjdGVkIDxTb21lRGF0YSBleHRlbmRzIEdyYXBoTm9kZSwgU29tZURlZmVuaXRpb24+IFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZERlZmluaXRpb25Ub05vZGVUeXBlKFRpdGFuVmVydGV4IHZlcnRleCwgU29tZURlZmVuaXRpb24gc29tZURlZmluaXRpb24sIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIG5vZGVVbmlxdWVJZCwgZmluYWwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VUeXBlLAorCQkJU3VwcGxpZXI8U29tZURhdGE+IGRhdGFCdWlsZGVyLCBTdXBwbGllcjxTdHJpbmc+IGRlZk5hbWVHZW5lcmF0b3IpIHsKKwkJU3RyaW5nIGRlZk5hbWUgPSBkZWZOYW1lR2VuZXJhdG9yLmdldCgpOworCQlsb2cuZGVidWcoIkdvdCB7fSB7fSIsIGRlZk5hbWUsIHNvbWVEZWZpbml0aW9uKTsKKworCQlTb21lRGF0YSBzb21lRGF0YSA9IGRhdGFCdWlsZGVyLmdldCgpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyB7fSB0byBncmFwaC4gZGF0YSA9IHt9IiwgZGVmTmFtZSwgc29tZURhdGEpOworCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJTb21lRGF0YSA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHNvbWVEYXRhKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyB7fSB0byBncmFwaC4gc3RhdHVzIGlzID0ge30iLCBkZWZOYW1lLCBlaXRoZXJTb21lRGF0YSk7CisKKwkJaWYgKGVpdGhlclNvbWVEYXRhLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gZWl0aGVyU29tZURhdGEucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHt9ICB0byBncmFwaC4gc3RhdHVzIGlzIHt9IiwgZGVmTmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBvcGVyYXRpb25TdGF0dXM7CisJCX0KKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyByZWxhdGlvbnMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZSh2ZXJ0ZXgsIGVpdGhlclNvbWVEYXRhLmxlZnQoKS52YWx1ZSgpLCBlZGdlVHlwZSwgbnVsbCk7CisJCWlmICghcmVsYXRpb25zLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IHJlbGF0aW9uczsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiQWRkRGVmaW5pdGlvblRvTm9kZVR5cGUiLCAiRmFpbGVkIHRvIGFzc29jaWF0ZSIgKyBub2RlVHlwZS5nZXROYW1lKCkgKyAiICIgKyBub2RlVW5pcXVlSWQgKyAidG8gIiArIGRlZk5hbWUgKyAiaW4gZ3JhcGguIHN0YXR1cyBpcyAiICsgb3BlcmF0aW9uU3RhdHVzLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCXJldHVybiBvcGVyYXRpb25TdGF0dXM7CisJCX0KKwkJcmV0dXJuIHJlbGF0aW9uczsKKwl9CisKKwlpbnRlcmZhY2UgTm9kZUVsZW1lbnRGZXRjaGVyPEVsZW1lbnREZWZpbml0aW9uPiB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRBbGxOb2RlRWxlbWVudHMoU3RyaW5nIG5vZGVJZCwgTGlzdDxFbGVtZW50RGVmaW5pdGlvbj4gbGlzdFRvZmlsbCk7CisJfQorCisJcHVibGljIDxFbGVtZW50RGVmaW5pdGlvbj4gVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZEFsbFJlc291cmNlRWxlbWVudHNEZWZpbml0aW9uUmVjdXJzaXZlbHkoU3RyaW5nIHJlc291cmNlSWQsIExpc3Q8RWxlbWVudERlZmluaXRpb24+IGVsZW1lbnRzLCBOb2RlRWxlbWVudEZldGNoZXI8RWxlbWVudERlZmluaXRpb24+IHNpbmdsZU5vZGVGZXRjaGVyKSB7CisKKwkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorCQkJbG9nLnRyYWNlKCJHb2luZyB0byBmZXRjaCBlbGVtZW50cyB1bmRlciByZXNvdXJjZSB7fSIsIHJlc291cmNlSWQpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyByZXNvdXJjZUF0dHJpYnV0ZXNTdGF0dXMgPSBzaW5nbGVOb2RlRmV0Y2hlci5maW5kQWxsTm9kZUVsZW1lbnRzKHJlc291cmNlSWQsIGVsZW1lbnRzKTsKKworCQlpZiAocmVzb3VyY2VBdHRyaWJ1dGVzU3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VBdHRyaWJ1dGVzU3RhdHVzOworCQl9CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsCisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCWlmIChwYXJlbnROb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHBhcmVudE5vZGVzU3RhdHVzID0gcGFyZW50Tm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHBhcmVudE5vZGVzU3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiZmluZEFsbFJlc291cmNlRWxlbWVudHNEZWZpbml0aW9uUmVjdXJzaXZlbHkiLCAiRmFpbGVkIHRvIGZpbmQgcGFyZW50IGVsZW1lbnRzIG9mIHJlc291cmNlICIgKyByZXNvdXJjZUlkICsgIi4gc3RhdHVzIGlzICIgKyBwYXJlbnROb2Rlc1N0YXR1cywgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIHBhcmVudE5vZGVzU3RhdHVzOworCQkJfQorCQl9CisKKwkJaWYgKHBhcmVudE5vZGVzLmlzTGVmdCgpKSB7CisJCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhcm5ldE5vZGVQYWlyID0gcGFyZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgcGFyZW50VW5pcXVlSWQgPSBwYXJuZXROb2RlUGFpci5nZXRLZXkoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFBhcmVudEludFN0YXR1cyA9IGZpbmRBbGxSZXNvdXJjZUVsZW1lbnRzRGVmaW5pdGlvblJlY3Vyc2l2ZWx5KHBhcmVudFVuaXF1ZUlkLCBlbGVtZW50cywgc2luZ2xlTm9kZUZldGNoZXIpOworCisJCQlpZiAoYWRkUGFyZW50SW50U3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJmaW5kQWxsUmVzb3VyY2VFbGVtZW50c0RlZmluaXRpb25SZWN1cnNpdmVseSIsICJGYWlsZWQgdG8gZmluZCBhbGwgcmVzb3VyY2UgZWxlbWVudHMgb2YgcmVzb3VyY2UgIiArIHBhcmVudFVuaXF1ZUlkLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKworCQkJCXJldHVybiBhZGRQYXJlbnRJbnRTdGF0dXM7CisJCQl9CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByb3RlY3RlZCA8VCwgVFN0YXR1cz4gdm9pZCBoYW5kbGVUcmFuc2FjdGlvbkNvbW1pdFJvbGxiYWNrKGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgRWl0aGVyPFQsIFRTdGF0dXM+IHJlc3VsdCkgeworCQlpZiAoIWluVHJhbnNhY3Rpb24pIHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyA8RWxlbWVudFR5cGVEZWZpbml0aW9uPiBFaXRoZXI8RWxlbWVudFR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRFbGVtZW50VHlwZShGdW5jdGlvbjxTdHJpbmcsIEVpdGhlcjxFbGVtZW50VHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4gZWxlbWVudEdldHRlciwgU3RyaW5nIHVuaXF1ZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJRWl0aGVyPEVsZW1lbnRUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGN0UmVzdWx0ID0gZWxlbWVudEdldHRlci5hcHBseSh1bmlxdWVJZCk7CisKKwkJCWlmIChjdFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjdFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gZWxlbWVudCB1bmlxdWVJZDoiICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGN0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGN0UmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWhhbmRsZVRyYW5zYWN0aW9uQ29tbWl0Um9sbGJhY2soaW5UcmFuc2FjdGlvbiwgcmVzdWx0KTsKKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcHJvcGVydHlEZWZpbml0aW9uCisJICogQHJldHVybgorCSAqLworCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShJQ29tcGxleERlZmF1bHRWYWx1ZSBwcm9wZXJ0eURlZmluaXRpb24sIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisKKwkJbG9nLnRyYWNlKCJHb2luZyB0byB2YWxpZGF0ZSBwcm9wZXJ0eSB0eXBlIGFuZCB2YWx1ZS4ge30iLCBwcm9wZXJ0eURlZmluaXRpb24pOworCisJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VHlwZSgpOworCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7CisKKwkJVG9zY2FQcm9wZXJ0eVR5cGUgdHlwZSA9IGdldFR5cGUocHJvcGVydHlUeXBlKTsKKworCQlpZiAodHlwZSA9PSBudWxsKSB7CisKKwkJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBkYXRhVHlwZXMuZ2V0KHByb3BlcnR5VHlwZSk7CisJCQlpZiAoZGF0YVR5cGVEZWZpbml0aW9uID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlRoZSB0eXBlIHt9ICBvZiBwcm9wZXJ0eSBjYW5ub3QgYmUgZm91bmQuIiwgcHJvcGVydHlUeXBlKTsKKwkJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX1RZUEU7CisJCQl9CisKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVBbmRVcGRhdGVDb21wbGV4VmFsdWUocHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eVR5cGUsIHZhbHVlLCBkYXRhVHlwZURlZmluaXRpb24sIGRhdGFUeXBlcyk7CisKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJfQorCQlTdHJpbmcgaW5uZXJUeXBlID0gbnVsbDsKKworCQlFaXRoZXI8U3RyaW5nLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hlY2tJbm5lclR5cGUgPSBnZXRJbm5lclR5cGUodHlwZSwgKCkgLT4gcHJvcGVydHlEZWZpbml0aW9uLmdldFNjaGVtYSgpKTsKKwkJaWYgKGNoZWNrSW5uZXJUeXBlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9UWVBFOworCQl9CisJCWlubmVyVHlwZSA9IGNoZWNrSW5uZXJUeXBlLmxlZnQoKS52YWx1ZSgpOworCisJCWxvZy50cmFjZSgiQWZ0ZXIgdmFsaWRhdGluZyBwcm9wZXJ0eSB0eXBlIHt9IiwgcHJvcGVydHlUeXBlKTsKKworCQlib29sZWFuIGlzVmFsaWRQcm9wZXJ0eSA9IGlzVmFsaWRWYWx1ZSh0eXBlLCB2YWx1ZSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQlpZiAoZmFsc2UgPT0gaXNWYWxpZFByb3BlcnR5KSB7CisJCQlsb2cuaW5mbygiVGhlIHZhbHVlIHt9IG9mIHByb3BlcnR5IGZyb20gdHlwZSB7fSBpcyBpbnZhbGlkIiwgdmFsdWUsIHR5cGUpOworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9WQUxVRTsKKwkJfQorCisJCVByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgY29udmVydGVyID0gdHlwZS5nZXRDb252ZXJ0ZXIoKTsKKworCQlpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkgeworCQkJbG9nLmRlYnVnKCJEZWZhdWx0IHZhbHVlIHdhcyBub3Qgc2VudCBmb3IgcHJvcGVydHkge30uIFNldCBkZWZhdWx0IHZhbHVlIHRvIHt9IiwgcHJvcGVydHlEZWZpbml0aW9uLmdldE5hbWUoKSwgRU1QVFlfVkFMVUUpOworCQkJcHJvcGVydHlEZWZpbml0aW9uLnNldERlZmF1bHRWYWx1ZShFTVBUWV9WQUxVRSk7CisJCX0gZWxzZSBpZiAoZmFsc2UgPT0gaXNFbXB0eVZhbHVlKHZhbHVlKSkgeworCQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLmNvbnZlcnQodmFsdWUsIGlubmVyVHlwZSwgZGF0YVR5cGVzKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoY29udmVydGVkVmFsdWUpOworCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByb3RlY3RlZCBUb3NjYVByb3BlcnR5VHlwZSBnZXRUeXBlKFN0cmluZyBwcm9wZXJ0eVR5cGUpIHsKKworCQlUb3NjYVByb3BlcnR5VHlwZSB0eXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUocHJvcGVydHlUeXBlKTsKKworCQlyZXR1cm4gdHlwZTsKKworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRWYWx1ZShUb3NjYVByb3BlcnR5VHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCWlmIChpc0VtcHR5VmFsdWUodmFsdWUpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCVByb3BlcnR5VHlwZVZhbGlkYXRvciB2YWxpZGF0b3IgPSB0eXBlLmdldFZhbGlkYXRvcigpOworCisJCWJvb2xlYW4gaXNWYWxpZCA9IHZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisJCWlmICh0cnVlID09IGlzVmFsaWQpIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNOdWxsUGFyYW0oU3RyaW5nIHZhbHVlKSB7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBbmRVcGRhdGVDb21wbGV4VmFsdWUoSUNvbXBsZXhEZWZhdWx0VmFsdWUgcHJvcGVydHlEZWZpbml0aW9uLCBTdHJpbmcgcHJvcGVydHlUeXBlLAorCisJCQlTdHJpbmcgdmFsdWUsIERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24sIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGVSZXN1bHQgPSBkYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlci52YWxpZGF0ZUFuZFVwZGF0ZSh2YWx1ZSwgZGF0YVR5cGVEZWZpbml0aW9uLCBkYXRhVHlwZXMpOworCisJCWlmICh2YWxpZGF0ZVJlc3VsdC5yaWdodC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgeworCQkJbG9nLmRlYnVnKCJUaGUgdmFsdWUge30gb2YgcHJvcGVydHkgZnJvbSB0eXBlIHt9IGlzIGludmFsaWQiLCB2YWx1ZSwgcHJvcGVydHlUeXBlKTsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfVkFMVUU7CisJCX0KKworCQlKc29uRWxlbWVudCBqc29uRWxlbWVudCA9IHZhbGlkYXRlUmVzdWx0LmxlZnQ7CisKKwkJbG9nLnRyYWNlKCJHb2luZyB0byB1cGRhdGUgdmFsdWUgaW4gcHJvcGVydHkgZGVmaW5pdGlvbiB7fSB7fSIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCksIChqc29uRWxlbWVudCAhPSBudWxsID8ganNvbkVsZW1lbnQudG9TdHJpbmcoKSA6IG51bGwpKTsKKworCQl1cGRhdGVWYWx1ZShwcm9wZXJ0eURlZmluaXRpb24sIGpzb25FbGVtZW50KTsKKworCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWYWx1ZShJQ29tcGxleERlZmF1bHRWYWx1ZSBwcm9wZXJ0eURlZmluaXRpb24sIEpzb25FbGVtZW50IGpzb25FbGVtZW50KSB7CisKKwkJcHJvcGVydHlEZWZpbml0aW9uLnNldERlZmF1bHRWYWx1ZShnZXRWYWx1ZUZyb21Kc29uRWxlbWVudChqc29uRWxlbWVudCkpOworCisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUZyb21Kc29uRWxlbWVudChKc29uRWxlbWVudCBqc29uRWxlbWVudCkgeworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCisJCWlmIChqc29uRWxlbWVudCA9PSBudWxsIHx8IGpzb25FbGVtZW50LmlzSnNvbk51bGwoKSkgeworCQkJdmFsdWUgPSBFTVBUWV9WQUxVRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChqc29uRWxlbWVudC50b1N0cmluZygpLmlzRW1wdHkoKSkgeworCQkJCXZhbHVlID0gIiI7CisJCQl9IGVsc2UgeworCQkJCXZhbHVlID0ganNvbkVsZW1lbnQudG9TdHJpbmcoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPFN0cmluZywgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldElubmVyVHlwZShUb3NjYVByb3BlcnR5VHlwZSB0eXBlLCBTdXBwbGllcjxTY2hlbWFEZWZpbml0aW9uPiBzY2hlbWVHZW4pIHsKKwkJU3RyaW5nIGlubmVyVHlwZSA9IG51bGw7CisJCWlmICh0eXBlID09IFRvc2NhUHJvcGVydHlUeXBlLkxJU1QgfHwgdHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5NQVApIHsKKworCQkJU2NoZW1hRGVmaW5pdGlvbiBkZWYgPSBzY2hlbWVHZW4uZ2V0KCk7Ly8gcHJvcERhdGFEZWYuZ2V0U2NoZW1hKCk7CisJCQlpZiAoZGVmID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlNjaGVtYSBkb2Vzbid0IGV4aXN0cyBmb3IgcHJvcGVydHkgb2YgdHlwZSB7fSIsIHR5cGUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVCk7CisJCQl9CisJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEZWYgPSBkZWYuZ2V0UHJvcGVydHkoKTsKKwkJCWlmIChwcm9wRGVmID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIlByb3BlcnR5IGluIFNjaGVtYSBEZWZpbml0aW9uIGluc2lkZSBwcm9wZXJ0eSBvZiB0eXBlIHt9IGRvZXNuJ3QgZXhpc3RzIiwgdHlwZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCX0KKwkJCWlubmVyVHlwZSA9IHByb3BEZWYuZ2V0VHlwZSgpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChpbm5lclR5cGUpOworCX0KKworCS8qKgorCSAqIENvbnZlcnQgQ29uc3RhcmludCBvYmplY3QgdG8ganNvbiBpbiBvcmRlciB0byBhZGQgaXQgdG8gdGhlIEdyYXBoCisJICogCisJICogQHBhcmFtIGNvbnN0cmFpbnRzCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gY29udmVydENvbnN0cmFpbnRzVG9TdHJpbmcoTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzKSB7CisKKwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG51bGw7CisKKwkJaWYgKGNvbnN0cmFpbnRzICE9IG51bGwgJiYgZmFsc2UgPT0gY29uc3RyYWludHMuaXNFbXB0eSgpKSB7CisJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCWZvciAoUHJvcGVydHlDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludCA6IGNvbnN0cmFpbnRzKSB7CisJCQkJU3RyaW5nIGNvbnN0cmFpbnQgPSBnc29uLnRvSnNvbihwcm9wZXJ0eUNvbnN0cmFpbnQpOworCQkJCXJlc3VsdC5hZGQoY29uc3RyYWludCk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIExpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb252ZXJ0Q29uc3RyYWludHMoTGlzdDxTdHJpbmc+IGNvbnN0cmFpbnRzKSB7CisKKwkJaWYgKGNvbnN0cmFpbnRzID09IG51bGwgfHwgY29uc3RyYWludHMuc2l6ZSgpID09IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4oKTsKKwkJVHlwZSBjb25zdHJhaW50VHlwZSA9IG5ldyBUeXBlVG9rZW48UHJvcGVydHlDb25zdHJhaW50PigpIHsKKwkJfS5nZXRUeXBlKCk7CisKKwkJR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkucmVnaXN0ZXJUeXBlQWRhcHRlcihjb25zdHJhaW50VHlwZSwgbmV3IFByb3BlcnR5Q29uc3RyYWludERlc2VyaWFsaXNlcigpKS5jcmVhdGUoKTsKKworCQlmb3IgKFN0cmluZyBjb25zdHJhaW50SnNvbiA6IGNvbnN0cmFpbnRzKSB7CisJCQlQcm9wZXJ0eUNvbnN0cmFpbnQgcHJvcGVydHlDb25zdHJhaW50ID0gZ3Nvbi5mcm9tSnNvbihjb25zdHJhaW50SnNvbiwgY29uc3RyYWludFR5cGUpOworCQkJbGlzdC5hZGQocHJvcGVydHlDb25zdHJhaW50KTsKKwkJfQorCisJCXJldHVybiBsaXN0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9BZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjN2YzNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw5NjAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5UcmFuc2FjdGlvbjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5HcmFwaEVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLkFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlNlcnZpY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVW5pcXVlSWREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5BdXRvUG9wdWxhdGluZ0xpc3QuRWxlbWVudEZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgiYWRkaXRpb25hbC1pbmZvcm1hdGlvbi1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIEFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVkFMVUUgPSBudWxsOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsKKworCXB1YmxpYyBBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIoCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCA9IHZlcmlmeU5vZGVUeXBlVnNDb21wb25lbnQobm9kZVR5cGUsIGNvbXBvbmVudElkKTsKKwkJaWYgKHZlcmlmeU5vZGVUeXBlVnNDb21wb25lbnQgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCk7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjb21wb25lbnRJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5BRERJVElPTkFMX0lORk9STUFUSU9OLCBOb2RlVHlwZUVudW0uQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJzLAorCQkJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKworCQlpZiAoZ2V0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBnZXRSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSBwYXJhbWV0ZXJEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRMZWZ0KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IHBhcmFtZXRlckRhdGEuZ2V0UGFyYW1ldGVycygpOworCQlpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7CisJCQlwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCQlwYXJhbWV0ZXJEYXRhLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisJCX0KKwkJTWFwPFN0cmluZywgU3RyaW5nPiBpZFRvS2V5ID0gcGFyYW1ldGVyRGF0YS5nZXRJZFRvS2V5KCk7CisJCWlmIChpZFRvS2V5ID09IG51bGwpIHsKKwkJCWlkVG9LZXkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCXBhcmFtZXRlckRhdGEuc2V0SWRUb0tleShpZFRvS2V5KTsKKwkJfQorCisJCUludGVnZXIgbGFzdENyZWF0ZWRDb3VudGVyID0gcGFyYW1ldGVyRGF0YS5nZXRBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uKCkuZ2V0TGFzdENyZWF0ZWRDb3VudGVyKCk7CisJCWxhc3RDcmVhdGVkQ291bnRlcisrOworCisJCWlmIChwYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KGtleSkpIHsKKwkJCWxvZy5kZWJ1ZygiVGhlIGtleSB7fSBhbHJlYWR5IGV4aXN0cyB1bmRlciBjb21wb25lbnQge30iLCBrZXksIGNvbXBvbmVudElkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCk7CisJCX0KKworCQlpZFRvS2V5LnB1dChTdHJpbmcudmFsdWVPZihsYXN0Q3JlYXRlZENvdW50ZXIpLCBrZXkpOworCQlwYXJhbWV0ZXJzLnB1dChrZXksIHZhbHVlKTsKKwkJcGFyYW1ldGVyRGF0YS5nZXRBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uKCkuc2V0TGFzdENyZWF0ZWRDb3VudGVyKGxhc3RDcmVhdGVkQ291bnRlcik7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShwYXJhbWV0ZXJEYXRhLAorCQkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YS5jbGFzcyk7CisKKwkJaWYgKHVwZGF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSB1cGRhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUZhaWxlZFVwZGF0ZU5vZGVFcnJvciwKKwkJCQkJIlVwZGF0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlciIsCisJCQkJCSJhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9mICIgKyBub2RlVHlwZS5nZXROYW1lKCkgKyAiICIgKyBjb21wb25lbnRJZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IoIlVwZGF0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlciIsCisJCQkJCSJhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9mICIgKyBub2RlVHlwZS5nZXROYW1lKCkgKyAiICIgKyBjb21wb25lbnRJZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGluZm9ybWF0aW9uRGVmaW5pdGlvbiA9IGNyZWF0ZUluZm9ybWF0aW9uRGVmaW5pdGlvbkZyb21Ob2RlKGNvbXBvbmVudElkLAorCQkJCXBhcmFtZXRlcnMsIGlkVG9LZXksIHVwZGF0ZU5vZGUubGVmdCgpLnZhbHVlKCkpOworCisJCXJldHVybiBFaXRoZXIubGVmdChpbmZvcm1hdGlvbkRlZmluaXRpb24pOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyBpZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCA9IHZlcmlmeU5vZGVUeXBlVnNDb21wb25lbnQobm9kZVR5cGUsIGNvbXBvbmVudElkKTsKKwkJaWYgKHZlcmlmeU5vZGVUeXBlVnNDb21wb25lbnQgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCk7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjb21wb25lbnRJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5BRERJVElPTkFMX0lORk9STUFUSU9OLCBOb2RlVHlwZUVudW0uQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJzLAorCQkJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKworCQlpZiAoZ2V0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBnZXRSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSBwYXJhbWV0ZXJEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRMZWZ0KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IHBhcmFtZXRlckRhdGEuZ2V0UGFyYW1ldGVycygpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGlkVG9LZXkgPSBwYXJhbWV0ZXJEYXRhLmdldElkVG9LZXkoKTsKKwkJaWYgKGlkVG9LZXkgPT0gbnVsbCB8fCBmYWxzZSA9PSBpZFRvS2V5LmNvbnRhaW5zS2V5KGlkKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJfQorCisJCVN0cmluZyBvcmlnS2V5ID0gaWRUb0tleS5nZXQoaWQpOworCisJCWlmIChmYWxzZSA9PSBvcmlnS2V5LmVxdWFscyhrZXkpKSB7CisJCQlpZiAocGFyYW1ldGVycy5jb250YWluc0tleShrZXkpKSB7CisJCQkJbG9nLmRlYnVnKCJUaGUga2V5IHt9IGFscmVhZHkgZXhpc3RzIiwga2V5KTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLkFMUkVBRFlfRVhJU1QpOworCQkJfQorCQkJU3RyaW5nIHJlbW92ZWQgPSBwYXJhbWV0ZXJzLnJlbW92ZShvcmlnS2V5KTsKKwkJCWxvZy50cmFjZSgiVGhlIGtleS12YWx1ZSAiICsgb3JpZ0tleSArICI9IiArIHJlbW92ZWQgKyAiIHdhcyByZW1vdmVkIGZyb20gYWRkaXRpb25hbEluZm9ybWF0aW9uIik7CisJCX0KKwkJcGFyYW1ldGVycy5wdXQoa2V5LCB2YWx1ZSk7CisJCWlkVG9LZXkucHV0KGlkLCBrZXkpOworCisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocGFyYW1ldGVyRGF0YSwKKwkJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEuY2xhc3MpOworCisJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IsCisJCQkJCSJVcGRhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIiLCAiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiByZXNvdXJjZSAiICsgY29tcG9uZW50SWQsCisJCQkJCVN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkVXBkYXRlTm9kZUVycm9yKCJVcGRhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIiLAorCQkJCQkiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiByZXNvdXJjZSAiICsgY29tcG9uZW50SWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBpbmZvcm1hdGlvbkRlZmluaXRpb24gPSBjcmVhdGVJbmZvcm1hdGlvbkRlZmluaXRpb25Gcm9tTm9kZShjb21wb25lbnRJZCwKKwkJCQlwYXJhbWV0ZXJzLCBpZFRvS2V5LCB1cGRhdGVOb2RlLmxlZnQoKS52YWx1ZSgpKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW5mb3JtYXRpb25EZWZpbml0aW9uKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcigKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgaWQpIHsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB2ZXJpZnlOb2RlVHlwZVZzQ29tcG9uZW50ID0gdmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudChub2RlVHlwZSwgY29tcG9uZW50SWQpOworCQlpZiAodmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2ZXJpZnlOb2RlVHlwZVZzQ29tcG9uZW50KTsKKwkJfQorCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlc3VsdCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGNvbXBvbmVudElkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkFERElUSU9OQUxfSU5GT1JNQVRJT04sIE5vZGVUeXBlRW51bS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlcnMsCisJCQkJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEuY2xhc3MpOworCisJCWlmIChnZXRSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJSW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA9IGdldFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIHBhcmFtZXRlckRhdGEgPSBpbW11dGFibGVQYWlyLmdldExlZnQoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gcGFyYW1ldGVyRGF0YS5nZXRQYXJhbWV0ZXJzKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaWRUb0tleSA9IHBhcmFtZXRlckRhdGEuZ2V0SWRUb0tleSgpOworCisJCWlmIChpZFRvS2V5ID09IG51bGwgfHwgZmFsc2UgPT0gaWRUb0tleS5jb250YWluc0tleShpZCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCk7CisJCX0KKworCQlTdHJpbmcga2V5ID0gaWRUb0tleS5nZXQoaWQpOworCQlTdHJpbmcgcmVtb3ZlZEtleSA9IGlkVG9LZXkucmVtb3ZlKGlkKTsKKwkJU3RyaW5nIHJlbW92ZWRWYWx1ZSA9IHBhcmFtZXRlcnMucmVtb3ZlKGtleSk7CisJCWxvZy50cmFjZSgiVGhlIGtleS12YWx1ZSAiICsgcmVtb3ZlZEtleSArICI9IiArIHJlbW92ZWRWYWx1ZSArICIgd2FzIHJlbW92ZWQgZnJvbSBhZGRpdGlvbmFsSW5mb3JtYXRpb24iKTsKKworCQlFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKHBhcmFtZXRlckRhdGEsCisJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKworCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkVXBkYXRlTm9kZUVycm9yLAorCQkJCQkiRGVsZXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyIiwKKwkJCQkJImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgIiArIG5vZGVUeXBlLmdldE5hbWUoKSArICIgIiArIGNvbXBvbmVudElkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZFVwZGF0ZU5vZGVFcnJvcigiRGVsZXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyIiwKKwkJCQkJImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgIiArIG5vZGVUeXBlLmdldE5hbWUoKSArICIgIiArIGNvbXBvbmVudElkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gaW5mb3JtYXRpb25EZWZpbml0aW9uID0gY3JlYXRlSW5mb3JtYXRpb25EZWZpbml0aW9uRnJvbU5vZGUoY29tcG9uZW50SWQsCisJCQkJcGFyYW1ldGVycywgaWRUb0tleSwgdXBkYXRlTm9kZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGluZm9ybWF0aW9uRGVmaW5pdGlvbik7CisKKwl9CisKKwlwcml2YXRlIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gY3JlYXRlSW5mb3JtYXRpb25EZWZpbml0aW9uRnJvbU5vZGUoU3RyaW5nIHJlc291cmNlSWQsCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gaWRUb0tleSwKKwkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEpIHsKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBkYXRhRGVmaW5pdGlvbiA9IGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YQorCQkJCS5nZXRBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uKCk7CisKKwkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBpbmZvcm1hdGlvbkRlZmluaXRpb24gPSBuZXcgQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbihkYXRhRGVmaW5pdGlvbiwKKwkJCQlyZXNvdXJjZUlkLCBjb252ZXJ0UGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBpZFRvS2V5KSk7CisJCXJldHVybiBpbmZvcm1hdGlvbkRlZmluaXRpb247CisJfQorCisJcHJpdmF0ZSBMaXN0PEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbz4gY29udmVydFBhcmFtZXRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBpZFRvS2V5KSB7CisKKwkJTGlzdDxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbz4oKTsKKworCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBpZFRvS2V5RW50cnkgOiBpZFRvS2V5LmVudHJ5U2V0KCkpIHsKKworCQkJCVN0cmluZyBpZCA9IGlkVG9LZXlFbnRyeS5nZXRLZXkoKTsKKwkJCQlTdHJpbmcga2V5ID0gaWRUb0tleUVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQlTdHJpbmcgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldChrZXkpOworCisJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIHBhcmFtZXRlckluZm8gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvKGlkLCBrZXksIHZhbHVlKTsKKwkJCQlsaXN0LmFkZChwYXJhbWV0ZXJJbmZvKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCVN0cmluZyBjb21wb25lbnRJZCkgeworCisJCVVuaXF1ZUlkRGF0YSBmcm9tID0gbmV3IFVuaXF1ZUlkRGF0YShub2RlVHlwZSwgY29tcG9uZW50SWQpOworCisJCVN0cmluZyB1bmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZEFkZGl0aW9uYWxJbmZvcm1hdGlvblVuaXF1ZUlkKGNvbXBvbmVudElkKTsKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24oKTsKKwkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEoCisJCQkJYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCksIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKKworCQlFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5jcmVhdGVOb2RlKGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSwgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKwkJaWYgKGNyZWF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjcmVhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUZhaWxlZENyZWF0ZU5vZGVFcnJvciwKKwkJCQkJIkFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk5vZGUiLAorCQkJCQkiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byAiICsgbm9kZVR5cGUuZ2V0TmFtZSgpICsgIiAiICsgY29tcG9uZW50SWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkQ3JlYXRlTm9kZUVycm9yKCJBZGRBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlIiwgdW5pcXVlSWQsCisJCQkJCVN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIHRvID0gY3JlYXRlTm9kZS5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGZyb20sIHRvLAorCQkJCUdyYXBoRWRnZUxhYmVscy5BRERJVElPTkFMX0lORk9STUFUSU9OLCBudWxsKTsKKwkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRvKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uTm9kZShOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlTdHJpbmcgY29tcG9uZW50SWQsIFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4KSB7CisKKwkJU3RyaW5nIHVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQWRkaXRpb25hbEluZm9ybWF0aW9uVW5pcXVlSWQoY29tcG9uZW50SWQpOworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24gPSBuZXcgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbigpOworCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKworCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEgYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhID0gbmV3IEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSgKKwkJCQlhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEpOworCQlpZiAoY3JlYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkQ3JlYXRlTm9kZUVycm9yLAorCQkJCQkiQWRkQWRkaXRpb25hbEluZm9ybWF0aW9uTm9kZSIsCisJCQkJCSJhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvICIgKyBub2RlVHlwZS5nZXROYW1lKCkgKyAiICIgKyBjb21wb25lbnRJZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRDcmVhdGVOb2RlRXJyb3IoIkFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk5vZGUiLCB1bmlxdWVJZCwKKwkJCQkJU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlUaXRhblZlcnRleCBhZGRpdGlvbmFsSW5mb1ZlcnRleCA9IGNyZWF0ZU5vZGUubGVmdCgpLnZhbHVlKCk7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShtZXRhZGF0YVZlcnRleCwgYWRkaXRpb25hbEluZm9WZXJ0ZXgsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkFERElUSU9OQUxfSU5GT1JNQVRJT04sIG51bGwpOworCisJCWlmICghY3JlYXRlUmVsYXRpb24uZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjcmVhdGVSZWxhdGlvbik7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGFkZGl0aW9uYWxJbmZvVmVydGV4KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gcGFyYW1ldGVycykgeworCisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSB0aGlzLmFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk5vZGUobm9kZVR5cGUsCisJCQkJY29tcG9uZW50SWQpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIHBhcmFtZXRlckRhdGEgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJcG9wdWxhdGVQYXJhbWV0ZXJOb2RlV2l0aFBhcmFtZXRlcnMocGFyYW1ldGVyRGF0YSwgcGFyYW1ldGVycyk7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShwYXJhbWV0ZXJEYXRhLAorCQkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YS5jbGFzcyk7CisKKwkJaWYgKHVwZGF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gaW5mb3JtYXRpb25EZWZpbml0aW9uID0gY29udmVydEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRhdGFUb0RlZmluaXRpb24oCisJCQkJdXBkYXRlTm9kZS5sZWZ0KCkudmFsdWUoKSwgY29tcG9uZW50SWQpOworCisJCXJldHVybiBFaXRoZXIubGVmdChpbmZvcm1hdGlvbkRlZmluaXRpb24pOworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLAorCQkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBwYXJhbWV0ZXJzLCBUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCkgeworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHRoaXMuYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uTm9kZShub2RlVHlwZSwgY29tcG9uZW50SWQsCisJCQkJbWV0YWRhdGFWZXJ0ZXgpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gc3RhdHVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlUaXRhblZlcnRleCBhZGRpdGlvbmFsSW5mb1ZlcnRleCA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld1Byb3AgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyhhZGRpdGlvbmFsSW5mb1ZlcnRleCk7CisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSBwYXJhbWV0ZXJEYXRhID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KAorCQkJCU5vZGVUeXBlRW51bS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlcnMuZ2V0TmFtZSgpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBuZXdQcm9wLAorCQkJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YS5jbGFzcyk7CisKKwkJcG9wdWxhdGVQYXJhbWV0ZXJOb2RlV2l0aFBhcmFtZXRlcnMocGFyYW1ldGVyRGF0YSwgcGFyYW1ldGVycyk7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVWZXJ0ZXgocGFyYW1ldGVyRGF0YSwgYWRkaXRpb25hbEluZm9WZXJ0ZXgpOworCisJCXJldHVybiB1cGRhdGVOb2RlOworCX0KKworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVBhcmFtZXRlck5vZGVXaXRoUGFyYW1ldGVycyhBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEgcGFyYW1ldGVyRGF0YSwKKwkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gYWlEZWZpbml0aW9uKSB7CisKKwkJaWYgKGFpRGVmaW5pdGlvbiAhPSBudWxsKSB7CisKKwkJCUludGVnZXIgbGFzdENyZWF0ZWRDb3VudGVyID0gYWlEZWZpbml0aW9uLmdldExhc3RDcmVhdGVkQ291bnRlcigpOworCQkJcGFyYW1ldGVyRGF0YS5nZXRBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uKCkuc2V0TGFzdENyZWF0ZWRDb3VudGVyKGxhc3RDcmVhdGVkQ291bnRlcik7CisJCQlsb2cudHJhY2UoIlNldCBsYXN0IGNyZWF0ZWQgY291bnRlciBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvICIgKyBsYXN0Q3JlYXRlZENvdW50ZXIpOworCisJCQlMaXN0PEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbz4gcGFyYW1ldGVycyA9IGFpRGVmaW5pdGlvbi5nZXRQYXJhbWV0ZXJzKCk7CisJCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGlkVG9LZXkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJCQlmb3IgKEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gOiBwYXJhbWV0ZXJzKSB7CisJCQkJCVN0cmluZyB1bmlxdWVJZCA9IGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mby5nZXRVbmlxdWVJZCgpOworCQkJCQlTdHJpbmcga2V5ID0gYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLmdldEtleSgpOworCQkJCQlTdHJpbmcgdmFsdWUgPSBhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8uZ2V0VmFsdWUoKTsKKworCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYgZmFsc2UgPT0ga2V5LmlzRW1wdHkoKSkgeworCQkJCQkJaWRUb0tleS5wdXQodW5pcXVlSWQsIGtleSk7CisJCQkJCQlwYXJhbWV0ZXJzTWFwLnB1dChrZXksIHZhbHVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlwYXJhbWV0ZXJEYXRhLnNldElkVG9LZXkoaWRUb0tleSk7CisJCQkJcGFyYW1ldGVyRGF0YS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnNNYXApOworCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZFJlc291cmNlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUmVjdXJzaXZlbHkoU3RyaW5nIHVuaXF1ZUlkLAorCQkJTGlzdDxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisKKwkJbG9nLnRyYWNlKCJHb2luZyB0byBmZXRjaCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHVuZGVyIHJlc291cmNlICIgKyB1bmlxdWVJZCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHJlc291cmNlQ2FwYWJpbGl0aWVzU3RhdHVzID0gZmluZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk9mTm9kZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsCisJCQkJdW5pcXVlSWQsIHByb3BlcnRpZXMpOworCisJCWlmICghcmVzb3VyY2VDYXBhYmlsaXRpZXNTdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIHJlc291cmNlQ2FwYWJpbGl0aWVzU3RhdHVzOworCQl9CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCB1bmlxdWVJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00sIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCWlmIChwYXJlbnROb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHBhcmVudE5vZGVzU3RhdHVzID0gcGFyZW50Tm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKGZhbHNlID09IHBhcmVudE5vZGVzU3RhdHVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBwYXJlbnQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiByZXNvdXJjZSAiICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIgorCQkJCQkJKyBwYXJlbnROb2Rlc1N0YXR1cyk7CisJCQkJcmV0dXJuIHBhcmVudE5vZGVzU3RhdHVzOworCQkJfQorCQl9CisKKwkJaWYgKHBhcmVudE5vZGVzLmlzTGVmdCgpKSB7CisJCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhcm5ldE5vZGVQYWlyID0gcGFyZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgcGFyZW50VW5pcXVlSWQgPSBwYXJuZXROb2RlUGFpci5nZXRLZXkoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFBhcmVudEludFN0YXR1cyA9IGZpbmRSZXNvdXJjZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvblJlY3Vyc2l2ZWx5KHBhcmVudFVuaXF1ZUlkLAorCQkJCQlwcm9wZXJ0aWVzKTsKKworCQkJaWYgKGFkZFBhcmVudEludFN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgYWxsIHJlc291cmNlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgcmVzb3VyY2UgIiArIHBhcmVudFVuaXF1ZUlkKTsKKwkJCQlyZXR1cm4gYWRkUGFyZW50SW50U3RhdHVzOworCQkJfQorCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kU2VydmljZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvblJlY3Vyc2l2ZWx5KFN0cmluZyB1bmlxdWVJZCwKKwkJCUxpc3Q8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbj4gcHJvcGVydGllcykgeworCisJCWxvZy50cmFjZSgiR29pbmcgdG8gZmV0Y2ggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB1bmRlciBzZXJ2aWNlICIgKyB1bmlxdWVJZCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHJlc291cmNlQ2FwYWJpbGl0aWVzU3RhdHVzID0gZmluZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk9mTm9kZShOb2RlVHlwZUVudW0uU2VydmljZSwKKwkJCQl1bmlxdWVJZCwgcHJvcGVydGllcyk7CisKKwkJaWYgKCFyZXNvdXJjZUNhcGFiaWxpdGllc1N0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VDYXBhYmlsaXRpZXNTdGF0dXM7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTZXJ2aWNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlNlcnZpY2UpLCB1bmlxdWVJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00sIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlpZiAocGFyZW50Tm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBwYXJlbnROb2Rlc1N0YXR1cyA9IHBhcmVudE5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChmYWxzZSA9PSBwYXJlbnROb2Rlc1N0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgcGFyZW50IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgcmVzb3VyY2UgIiArIHVuaXF1ZUlkICsgIi4gc3RhdHVzIGlzICIKKwkJCQkJCSsgcGFyZW50Tm9kZXNTdGF0dXMpOworCQkJCXJldHVybiBwYXJlbnROb2Rlc1N0YXR1czsKKwkJCX0KKwkJfQorCisJCWlmIChwYXJlbnROb2Rlcy5pc0xlZnQoKSkgeworCQkJSW1tdXRhYmxlUGFpcjxTZXJ2aWNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhcm5ldE5vZGVQYWlyID0gcGFyZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgcGFyZW50VW5pcXVlSWQgPSBwYXJuZXROb2RlUGFpci5nZXRLZXkoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFBhcmVudEludFN0YXR1cyA9IGZpbmRTZXJ2aWNlQWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUmVjdXJzaXZlbHkocGFyZW50VW5pcXVlSWQsCisJCQkJCXByb3BlcnRpZXMpOworCisJCQlpZiAoYWRkUGFyZW50SW50U3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBhbGwgcmVzb3VyY2UgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiByZXNvdXJjZSAiICsgcGFyZW50VW5pcXVlSWQpOworCQkJCXJldHVybiBhZGRQYXJlbnRJbnRTdGF0dXM7CisJCQl9CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWRkaXRpb25hbEluZm9ybWF0aW9uT2ZOb2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkLAorCQkJTGlzdDxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGROb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5BRERJVElPTkFMX0lORk9STUFUSU9OLAorCQkJCQkJTm9kZVR5cGVFbnVtLkFkZGl0aW9uYWxJbmZvUGFyYW1ldGVycywgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKworCQlpZiAoY2hpbGROb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2hpbGROb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJSW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA9IGNoaWxkTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIHByb3BlcnR5RGF0YSA9IGltbXV0YWJsZVBhaXIuZ2V0S2V5KCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gcHJvcGVydHlEYXRhLmdldFBhcmFtZXRlcnMoKTsKKwkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCAmJiBmYWxzZSA9PSBwYXJhbWV0ZXJzLmlzRW1wdHkoKSkgeworCQkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBhZGRpdGlvbmFsSW5mb0RlZiA9IHRoaXMKKwkJCQkJLmNvbnZlcnRBZGRpdGlvbmFsSW5mb3JtYXRpb25EYXRhVG9EZWZpbml0aW9uKHByb3BlcnR5RGF0YSwgdW5pcXVlSWQpOworCQkJcHJvcGVydGllcy5hZGQoYWRkaXRpb25hbEluZm9EZWYpOworCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJpdmF0ZSBBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGNvbnZlcnRBZGRpdGlvbmFsSW5mb3JtYXRpb25EYXRhVG9EZWZpbml0aW9uKAorCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIGFkZGl0aW9uYWxJbmZvRGF0YSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gYWRkaXRpb25hbEluZm9EYXRhLmdldFBhcmFtZXRlcnMoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBpZFRvS2V5ID0gYWRkaXRpb25hbEluZm9EYXRhLmdldElkVG9LZXkoKTsKKworCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGRlZmluaXRpb24gPSBuZXcgQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbigKKwkJCQlhZGRpdGlvbmFsSW5mb0RhdGEuZ2V0QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbigpLCB1bmlxdWVJZCwKKwkJCQljb252ZXJ0UGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBpZFRvS2V5KSk7CisJCXJldHVybiBkZWZpbml0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IHRoaXMKKwkJCQkJLmFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcihub2RlVHlwZSwgcmVzb3VyY2VJZCwga2V5LCB2YWx1ZSk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwcm9wZXJ0eSB7fSB0byBjb21wb25lbnQge30uIFN0YXR1cyBpcyB7fSIsIGtleSwgcmVzb3VyY2VJZCwgc3RhdHVzKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IsCisJCQkJCQkiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiAiICsgbm9kZVR5cGUuZ2V0TmFtZSgpICsgIiAiICsgcmVzb3VyY2VJZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkVXBkYXRlTm9kZUVycm9yKCJDcmVhdGVBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIiLAorCQkJCQkJImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgIiArIG5vZGVUeXBlLmdldE5hbWUoKSArICIgIiArIHJlc291cmNlSWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJfSBlbHNlIHsKKwkJCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQljb21taXRPclJvbGxiYWNrKGluVHJhbnNhY3Rpb24sIHJlc3VsdCk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGlkLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGhpcworCQkJCQkudXBkYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKG5vZGVUeXBlLCByZXNvdXJjZUlkLCBpZCwga2V5LCB2YWx1ZSk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmluZm8oIkZhaWxlZCB0byB1cGRhdGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwcm9wZXJ0eSAiICsga2V5ICsgIiB0byBjb21wb25lbnQgIiArIHJlc291cmNlSWQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0gZWxzZSB7CisJCQkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBhZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQljb21taXRPclJvbGxiYWNrKGluVHJhbnNhY3Rpb24sIHJlc3VsdCk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IHRoaXMKKwkJCQkJLmRlbGV0ZUFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcihub2RlVHlwZSwgcmVzb3VyY2VJZCwgaWQpOworCisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlkICIgKyBpZCArICIgdG8gY29tcG9uZW50ICIgKyByZXNvdXJjZUlkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhlaXRoZXIucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9IGVsc2UgeworCQkJCUFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gYWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiA9IGVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChhZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJY29tbWl0T3JSb2xsYmFjayhpblRyYW5zYWN0aW9uLCByZXN1bHQpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE51bWJlck9mQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPEludGVnZXIsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSB0aGlzLmdldE51bWJlck9mUGFyYW1ldGVycyhub2RlVHlwZSwgcmVzb3VyY2VJZCk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwcm9wZXJ0aWVzIGluIGNvbXBvbmVudCAiICsgcmVzb3VyY2VJZCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlJbnRlZ2VyIGNvdW50ZXIgPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoY291bnRlcik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCByZXNvdXJjZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkFERElUSU9OQUxfSU5GT1JNQVRJT04sIE5vZGVUeXBlRW51bS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlcnMsCisJCQkJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEuY2xhc3MpOworCisJCWlmIChnZXRSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJSW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA9IGdldFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIHBhcmFtZXRlckRhdGEgPSBpbW11dGFibGVQYWlyLmdldExlZnQoKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gcGFyYW1ldGVyRGF0YS5nZXRQYXJhbWV0ZXJzKCk7CisKKwkJSW50ZWdlciBjb3VudGVyID0gMDsKKwkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJY291bnRlciA9IHBhcmFtZXRlcnMuc2l6ZSgpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvdW50ZXIpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIoCisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGlkKSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCA9IHZlcmlmeU5vZGVUeXBlVnNDb21wb25lbnQobm9kZVR5cGUsIGNvbXBvbmVudElkKTsKKwkJaWYgKHZlcmlmeU5vZGVUeXBlVnNDb21wb25lbnQgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCk7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjb21wb25lbnRJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5BRERJVElPTkFMX0lORk9STUFUSU9OLCBOb2RlVHlwZUVudW0uQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJzLAorCQkJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKworCQlpZiAoZ2V0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBnZXRSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSBwYXJhbWV0ZXJEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRMZWZ0KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IHBhcmFtZXRlckRhdGEuZ2V0UGFyYW1ldGVycygpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGlkVG9LZXkgPSBwYXJhbWV0ZXJEYXRhLmdldElkVG9LZXkoKTsKKworCQlpZiAoaWRUb0tleSA9PSBudWxsIHx8IGZhbHNlID09IGlkVG9LZXkuY29udGFpbnNLZXkoaWQpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQl9CisKKwkJU3RyaW5nIGtleSA9IGlkVG9LZXkuZ2V0KGlkKTsKKwkJU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVycy5nZXQoa2V5KTsKKworCQlsb2cudHJhY2UoIlRoZSBrZXktdmFsdWUgIiArIGtleSArICI9IiArIHZhbHVlICsgIiB3YXMgcmV0cmlldmVkIGZvciBpZCAiICsgaWQpOworCisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocGFyYW1ldGVyRGF0YSwKKwkJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEuY2xhc3MpOworCisJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yLAorCQkJCQkJIkdldEFkZGl0aW9ubmFsSW5mb3JtYXRpb25QYXJhbWV0ZXIiLAorCQkJCQkJImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgIiArIG5vZGVUeXBlLmdldE5hbWUoKSArICIgIiArIGNvbXBvbmVudElkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcigiR2V0QWRkaXRpb25uYWxJbmZvcm1hdGlvblBhcmFtZXRlciIsCisJCQkJCQkiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiAiICsgbm9kZVR5cGUuZ2V0TmFtZSgpICsgIiAiICsgY29tcG9uZW50SWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvIGFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbyA9IG5ldyBBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8oaWQsIGtleSwgdmFsdWUpOworCisJCXJldHVybiBFaXRoZXIubGVmdChhZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8pOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycygKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBib29sZWFuIGlnbm9yZVZlcmlmaWNhdGlvbikgeworCisJCWlmIChmYWxzZSA9PSBpZ25vcmVWZXJpZmljYXRpb24pIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHZlcmlmeU5vZGVUeXBlVnNDb21wb25lbnQgPSB2ZXJpZnlOb2RlVHlwZVZzQ29tcG9uZW50KG5vZGVUeXBlLCBjb21wb25lbnRJZCk7CisJCQlpZiAodmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudCk7CisJCQl9CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjb21wb25lbnRJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5BRERJVElPTkFMX0lORk9STUFUSU9OLCBOb2RlVHlwZUVudW0uQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJzLAorCQkJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKworCQlpZiAoZ2V0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkUmV0cmlldmVOb2RlRXJyb3IsCisJCQkJCQkiR2V0QWRkaXRpb25uYWxJbmZvcm1hdGlvblBhcmFtZXRlcnMiLAorCQkJCQkJImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgIiArIG5vZGVUeXBlLmdldE5hbWUoKSArICIgIiArIGNvbXBvbmVudElkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcigiR2V0QWRkaXRpb25uYWxJbmZvcm1hdGlvblBhcmFtZXRlcnMiLAorCQkJCQkJImFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2YgIiArIG5vZGVUeXBlLmdldE5hbWUoKSArICIgIiArIGNvbXBvbmVudElkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBnZXRSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YSBwYXJhbWV0ZXJEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRMZWZ0KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IHBhcmFtZXRlckRhdGEuZ2V0UGFyYW1ldGVycygpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGlkVG9LZXkgPSBwYXJhbWV0ZXJEYXRhLmdldElkVG9LZXkoKTsKKworCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGluZm9ybWF0aW9uRGVmaW5pdGlvbiA9IGNyZWF0ZUluZm9ybWF0aW9uRGVmaW5pdGlvbkZyb21Ob2RlKGNvbXBvbmVudElkLAorCQkJCXBhcmFtZXRlcnMsIGlkVG9LZXksIHBhcmFtZXRlckRhdGEpOworCisJCXJldHVybiBFaXRoZXIubGVmdChpbmZvcm1hdGlvbkRlZmluaXRpb24pOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXJzKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpZ25vcmVWZXJpZmljYXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGhpcworCQkJCQkuZ2V0QWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycyhub2RlVHlwZSwgcmVzb3VyY2VJZCwgaWdub3JlVmVyaWZpY2F0aW9uKTsKKworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJfSBlbHNlIHsKKwkJCQlBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWNvbW1pdE9yUm9sbGJhY2soaW5UcmFuc2FjdGlvbiwgcmVzdWx0KTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbW1pdE9yUm9sbGJhY2soYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBFaXRoZXI8PyBleHRlbmRzIE9iamVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0KSB7CisKKwkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb21taXRPclJvbGxiYWNrVHgoVGl0YW5UcmFuc2FjdGlvbiB0eCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLAorCQkJRWl0aGVyPD8gZXh0ZW5kcyBPYmplY3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCkgeworCisJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQl0eC5yb2xsYmFjaygpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCXR4LmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcigKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVySW5mbywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJJbmZvLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGhpcworCQkJCQkuZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVyKG5vZGVUeXBlLCByZXNvdXJjZUlkLCBpZCk7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwcm9wZXJ0eSB3aXRoIGlkICIgKyBpZCArICIgb2YgY29tcG9uZW50ICIKKwkJCQkJCSsgcmVzb3VyY2VJZCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckluZm8gYWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiA9IGVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChhZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJY29tbWl0T3JSb2xsYmFjayhpblRyYW5zYWN0aW9uLCByZXN1bHQpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXJzKAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIHJlc291cmNlSWQsCisJCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkFERElUSU9OQUxfSU5GT1JNQVRJT04sIE5vZGVUeXBlRW51bS5BZGRpdGlvbmFsSW5mb1BhcmFtZXRlcnMsCisJCQkJCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKworCQkJaWYgKGdldFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkRGVsZXRlTm9kZUVycm9yLAorCQkJCQkJCSJEZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlIiwKKwkJCQkJCQkiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiAiICsgbm9kZVR5cGUuZ2V0TmFtZSgpICsgIiAiICsgcmVzb3VyY2VJZCwKKwkJCQkJCQlTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkRGVsZXRlTm9kZUVycm9yKCJEZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlIiwKKwkJCQkJCQkiYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiAiICsgbm9kZVR5cGUuZ2V0TmFtZSgpICsgIiAiICsgcmVzb3VyY2VJZCwKKwkJCQkJCQlTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfQorCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUltbXV0YWJsZVBhaXI8QWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhLCBHcmFwaEVkZ2U+IHZhbHVlID0gZ2V0UmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhIHBhcmFtZXRlckRhdGEgPSB2YWx1ZS5nZXRMZWZ0KCk7CisKKwkJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVOb2RlUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5kZWxldGVOb2RlKHBhcmFtZXRlckRhdGEsIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YS5jbGFzcyk7CisJCQlpZiAoZGVsZXRlTm9kZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUZhaWxlZERlbGV0ZU5vZGVFcnJvciwKKwkJCQkJCSJEZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlIiwgKFN0cmluZykgcGFyYW1ldGVyRGF0YS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkRGVsZXRlTm9kZUVycm9yKCJEZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlIiwKKwkJCQkJCShTdHJpbmcpIHBhcmFtZXRlckRhdGEuZ2V0VW5pcXVlSWQoKSwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBpbmZvcm1hdGlvbkRlZmluaXRpb24gPSBjb252ZXJ0QWRkaXRpb25hbEluZm9ybWF0aW9uRGF0YVRvRGVmaW5pdGlvbigKKwkJCQkJZGVsZXRlTm9kZVJlcy5sZWZ0KCkudmFsdWUoKSwgcmVzb3VyY2VJZCk7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGluZm9ybWF0aW9uRGVmaW5pdGlvbik7CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWNvbW1pdE9yUm9sbGJhY2soaW5UcmFuc2FjdGlvbiwgcmVzdWx0KTsKKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgdmVyaWZ5Tm9kZVR5cGVWc0NvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjb21wb25lbnRJZCkgeworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhCeVByb3BlcnR5ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldFZlcnRleEJ5UHJvcGVydHkoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjb21wb25lbnRJZCk7CisJCWlmICh2ZXJ0ZXhCeVByb3BlcnR5LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdmVydGV4QnlQcm9wZXJ0eS5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9IGVsc2UgeworCQkJVmVydGV4IHYgPSB2ZXJ0ZXhCeVByb3BlcnR5LmxlZnQoKS52YWx1ZSgpOworCQkJU3RyaW5nIGxhYmVsID0gKFN0cmluZykgdi5wcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCkpLnZhbHVlKCk7CisJCQlpZiAobGFiZWwgIT0gbnVsbCkgeworCQkJCWlmIChmYWxzZSA9PSBsYWJlbC5lcXVhbHMobm9kZVR5cGUuZ2V0TmFtZSgpKSkgeworCQkJCQlsb2cuZGVidWcoIlRoZSBub2RlIHR5cGUge30gaXMgbm90IGFwcHJvcHJpYXRlIHRvIGNvbXBvbmVudCB7fSIsIG5vZGVUeXBlLCBjb21wb25lbnRJZCk7CisJCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJUaGUgbm9kZSB0eXBlIHt9ICB3aXRoIGlkIHt9IGRvZXMgbm90IGhhdmUgYSBsYWJlbCBwcm9wZXJ0eS4iLCBub2RlVHlwZSwgY29tcG9uZW50SWQpOworCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJfQorCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQWxsT3BlcmF0aW9uc1V0aWwuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQWxsT3BlcmF0aW9uc1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA1MTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9BbGxPcGVyYXRpb25zVXRpbC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitAQ29tcG9uZW50KCJhbGwtb3BlcmF0aW9ucyIpCitwdWJsaWMgY2xhc3MgQWxsT3BlcmF0aW9uc1V0aWwgeworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFJlcXVpcmVtZW50T3BlcmF0aW9uIHJlcXVpcmVtZW50T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIENhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKworCXB1YmxpYyBQcm9wZXJ0eU9wZXJhdGlvbiBnZXRQcm9wZXJ0eU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHByb3BlcnR5T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBSZXF1aXJlbWVudE9wZXJhdGlvbiBnZXRSZXF1aXJlbWVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHJlcXVpcmVtZW50T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBDYXBhYmlsaXR5T3BlcmF0aW9uIGdldENhcGFiaWxpdHlPcGVyYXRpb24oKSB7CisJCXJldHVybiBjYXBhYmlsaXR5T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBSZXNvdXJjZU9wZXJhdGlvbiBnZXRSZXNvdXJjZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHJlc291cmNlT3BlcmF0aW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9BcnRpZmFjdE9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9BcnRpZmFjdE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjRiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0FydGlmYWN0T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMjAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguR3JhcGhFbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVsZW1lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQXJ0aWZhY3REYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BcnRpZmFjdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuSGVhdFBhcmFtZXRlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuSGVhdFBhcmFtZXRlclZhbHVlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTURDOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMuRGlyZWN0aW9uOworLy9pbXBvcnQgY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLkVkZ2U7CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMuVmVydGV4OworLy9pbXBvcnQgY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLnV0aWwuRWxlbWVudEhlbHBlcjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImFydGlmYWN0LW9wZXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJQXJ0aWZhY3RPcGVyYXRpb24geworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSGVhdFBhcmFtZXRlcnNPcGVyYXRpb24gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgR3JvdXBPcGVyYXRpb24gZ3JvdXBPcGVyYXRpb247CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXJ0aWZhY3RPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBBcnRpZmFjdE9wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgVGl0YW5HZW5lcmljRGFvIGdldFRpdGFuR2VuZXJpY0RhbygpIHsKKwkJcmV0dXJuIHRpdGFuR2VuZXJpY0RhbzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaXRhbkdlbmVyaWNEYW8oVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbykgeworCQl0aGlzLnRpdGFuR2VuZXJpY0RhbyA9IHRpdGFuR2VuZXJpY0RhbzsKKwl9CisKKwlwdWJsaWMgSGVhdFBhcmFtZXRlcnNPcGVyYXRpb24gZ2V0SGVhdFBhcmFtZXRlcnNPcGVyYXRpb24oKSB7CisJCXJldHVybiBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIZWF0UGFyYW1ldGVyc09wZXJhdGlvbihIZWF0UGFyYW1ldGVyc09wZXJhdGlvbiBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbikgeworCQl0aGlzLmhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEFyaWZhY3RUb0NvbXBvbmVudChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgcGFyZW50SWQsIE5vZGVUeXBlRW51bSB0eXBlLCBib29sZWFuIGZhaWxJZkV4aXN0LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8QXJ0aWZhY3REYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBhZGRBcnRpZmFjdFRvR3JhcGgoYXJ0aWZhY3RJbmZvLCBwYXJlbnRJZCwgdHlwZSwgZmFpbElmRXhpc3QpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfQorCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIGFydGlmYWN0IHt9IHRvIHt9IHt9IiwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpLCB0eXBlLCBwYXJlbnRJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCQlBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZSZXN1bHQgPSBjb252ZXJ0QXJ0aWZhY3REYXRhVG9BcnRpZmFjdERlZmluaXRpb24oYXJ0aWZhY3REYXRhKTsKKworCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgQXJ0aWZhY3REZWZpbnRpb24gaXMge30iLCBhcnRpZmFjdERlZlJlc3VsdCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoYXJ0aWZhY3REZWZSZXN1bHQpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRBcmlmYWN0VG9Db21wb25lbnQoVGl0YW5WZXJ0ZXggYXJ0aWZhY3RJbmZvLCBUaXRhblZlcnRleCBwYXJlbnRWZXJ0ZXgsIFN0cmluZyBsYWJlbCkgeworCisJCS8vIHNhdmUgbG9naWNhbCBhcnRpZmFjdCByZWYgbmFtZSBvbiBlZGdlIGFzIHByb3BlcnR5CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGxhYmVsKTsKKwkJU3RyaW5nIGdyb3VwSW5mbyA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShhcnRpZmFjdEluZm8sIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfR1JPVVBfVFlQRS5nZXRQcm9wZXJ0eSgpKTsKKwkJaWYgKGdyb3VwSW5mbyAhPSBudWxsKQorCQkJcHJvcGVydGllcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuR1JPVVBfVFlQRS5nZXRQcm9wZXJ0eSgpLCBncm91cEluZm8pOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyByZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKHBhcmVudFZlcnRleCwgYXJ0aWZhY3RJbmZvLCBHcmFwaEVkZ2VMYWJlbHMuQVJUSUZBQ1RfUkVGLCBwcm9wZXJ0aWVzKTsKKwkJaWYgKCFyZWxhdGlvbi5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcmVsYXRpb24gaW4gZ3JhcGggZnJvbSBpZCB7fSB0byBuZXcgYXJ0aWZhY3Qge30iLCBwYXJlbnRWZXJ0ZXgsIGxhYmVsKTsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlbGF0aW9uKTsKKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZEFyaWZhY3RUb0NvbXBvbmVudChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgcGFyZW50SWQsIE5vZGVUeXBlRW51bSB0eXBlLCBib29sZWFuIGZhaWxJZkV4aXN0LCBUaXRhblZlcnRleCBwYXJlbnRWZXJ0ZXgpIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZEFydGlmYWN0VG9HcmFwaChhcnRpZmFjdEluZm8sIHBhcmVudElkLCB0eXBlLCBmYWlsSWZFeGlzdCwgcGFyZW50VmVydGV4KTsKKworCQlpZiAoc3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIGFydGlmYWN0IHt9IHt9IHRvIHt9IiwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpLCB0eXBlLCBwYXJlbnRJZCk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYWRkQXJ0aWZhY3RUb0dyYXBoKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIFN0cmluZyBpZCwgTm9kZVR5cGVFbnVtIHR5cGUsIGJvb2xlYW4gZmFpbElmZXhpc3QsIFRpdGFuVmVydGV4IHBhcmVudFZlcnRleCkgeworCisJCWlmIChhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSA9PSBudWxsIHx8IGFydGlmYWN0SW5mby5nZXRVbmlxdWVJZCgpLmlzRW1wdHkoKSkgeworCQkJU3RyaW5nIHVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChpZCwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCQlhcnRpZmFjdEluZm8uc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCQl9CisKKwkJaWYgKHZhbGlkYXRlUGFyZW50VHlwZSh0eXBlKSA9PSBmYWxzZSkgeworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCisJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBuZXcgQXJ0aWZhY3REYXRhKGFydGlmYWN0SW5mbyk7CisKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXhpc3RBcnRpZmFjdCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZEtleSgpLCBhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCWlmIChleGlzdEFydGlmYWN0LmlzUmlnaHQoKSkgeworCQkJaWYgKGV4aXN0QXJ0aWZhY3QucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJLy8gY3JlYXRlIG5ldyBub2RlCisJCQkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIGFydGlmYWN0IHRvIGdyYXBoIHt9IiwgYXJ0aWZhY3REYXRhKTsKKwkJCQlpZiAoYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRBcnRpZmFjdFVVSUQoKSA9PSBudWxsIHx8IGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3RVVUlEKCkuaXNFbXB0eSgpKQorCQkJCQl1cGRhdGVVVUlEKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCksIG51bGwsIGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3RWZXJzaW9uKCkpOworCQkJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShhcnRpZmFjdERhdGEpOworCisJCQkJaWYgKGNyZWF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhZGQgYXJ0aWZhY3Qge30gdG8gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3ROYW1lKCksIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUZhaWxlZENyZWF0ZU5vZGVFcnJvciwgIkZhaWxlZCB0byBhZGQgYXJ0aWZhY3QgIiArIGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3ROYW1lKCkgKyAiIHRvIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cywKKwkJCQkJCQlhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0TmFtZSgpLCBTdHJpbmcudmFsdWVPZihvcGVyYXRpb25TdGF0dXMpKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkQ3JlYXRlTm9kZUVycm9yKCJBZGQgYXJ0aWZhY3QiLCBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0TmFtZSgpLCBTdHJpbmcudmFsdWVPZihvcGVyYXRpb25TdGF0dXMpKTsKKwkJCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMob3BlcmF0aW9uU3RhdHVzKTsKKwkJCQl9CisKKwkJCQkvLyBhZGQgaGVhdCBwYXJhbWV0ZXJzCisJCQkJaWYgKGFydGlmYWN0SW5mby5nZXRIZWF0UGFyYW1ldGVycygpICE9IG51bGwgJiYgIWFydGlmYWN0SW5mby5nZXRIZWF0UGFyYW1ldGVycygpLmlzRW1wdHkoKSAmJiAhYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKSkpIHsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0aWVzU3RhdHVzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uYWRkUHJvcGVydGllc1RvR3JhcGgoYXJ0aWZhY3RJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCksIGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpLnRvU3RyaW5nKCksIE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZik7CisJCQkJCWlmIChhZGRQcm9wZXJ0aWVzU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBoZWF0IHBhcmFtZXRlcnMgb24gZ3JhcGggZm9yIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJCQkJCXJldHVybiBhZGRQcm9wZXJ0aWVzU3RhdHVzOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNoZWNrIGV4aXN0YW5jZSBvZiBhcnRpZmFjdCBpbiBncmFwaCBmb3IgaWQge30iLCBhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZXhpc3RBcnRpZmFjdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9IGVsc2UgaWYgKGZhaWxJZmV4aXN0KSB7CisJCQlsb2cuZGVidWcoIkFydGlmYWN0IHt9IGFscmVhZHkgZXhpc3QiLCBhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKTsKKwkJfQorCisJCS8vIHNhdmUgbG9naWNhbCBhcnRpZmFjdCByZWYgbmFtZSBvbiBlZGdlIGFzIHByb3BlcnR5CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkpOworCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCkgIT0gbnVsbCkKKwkJCXByb3BlcnRpZXMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LkdST1VQX1RZUEUuZ2V0UHJvcGVydHkoKSwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0R3JvdXBUeXBlKCkuZ2V0VHlwZSgpKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShwYXJlbnRWZXJ0ZXgsIGFydGlmYWN0RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkFSVElGQUNUX1JFRiwgcHJvcGVydGllcyk7CisJCWlmICghcmVsYXRpb24uZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHJlbGF0aW9uIGluIGdyYXBoIGZvciBpZCB7fSB0byBuZXcgYXJ0aWZhY3QiLCBpZCk7CisJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZWxhdGlvbik7CisJCX0KKworCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEFydGlmYWN0VG9HcmFwaChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgaWQsIE5vZGVUeXBlRW51bSB0eXBlLCBib29sZWFuIGZhaWxJZmV4aXN0KSB7CisKKwkJaWYgKGFydGlmYWN0SW5mby5nZXRVbmlxdWVJZCgpID09IG51bGwgfHwgYXJ0aWZhY3RJbmZvLmdldFVuaXF1ZUlkKCkuaXNFbXB0eSgpKSB7CisJCQlTdHJpbmcgdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKGlkLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJCWFydGlmYWN0SW5mby5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCX0KKworCQlpZiAodmFsaWRhdGVQYXJlbnRUeXBlKHR5cGUpID09IGZhbHNlKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQlBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gbmV3IEFydGlmYWN0RGF0YShhcnRpZmFjdEluZm8pOworCisJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBleGlzdEFydGlmYWN0ID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkS2V5KCksIGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlpZiAoZXhpc3RBcnRpZmFjdC5pc1JpZ2h0KCkpIHsKKwkJCWlmIChleGlzdEFydGlmYWN0LnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCS8vIGNyZWF0ZSBuZXcgbm9kZQorCQkJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBhcnRpZmFjdCB0byBncmFwaCB7fSIsIGFydGlmYWN0RGF0YSk7CisJCQkJaWYgKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3RVVUlEKCkgPT0gbnVsbCB8fCBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0VVVJRCgpLmlzRW1wdHkoKSkKKwkJCQkJdXBkYXRlVVVJRChhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLCBudWxsLCBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0VmVyc2lvbigpKTsKKwkJCQlFaXRoZXI8QXJ0aWZhY3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKGFydGlmYWN0RGF0YSwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBhcnRpZmFjdCB0byBncmFwaCB7fSIsIGFydGlmYWN0RGF0YSk7CisKKwkJCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFkZCBhcnRpZmFjdCB7fSB0byBncmFwaC4gc3RhdHVzIGlzIHt9IiwgYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRBcnRpZmFjdE5hbWUoKSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkQ3JlYXRlTm9kZUVycm9yLCAiRmFpbGVkIHRvIGFkZCBhcnRpZmFjdCAiICsgYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRBcnRpZmFjdE5hbWUoKSArICIgdG8gZ3JhcGguIHN0YXR1cyBpcyAiICsgb3BlcmF0aW9uU3RhdHVzLAorCQkJCQkJCWFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3ROYW1lKCksIFN0cmluZy52YWx1ZU9mKG9wZXJhdGlvblN0YXR1cykpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRDcmVhdGVOb2RlRXJyb3IoIkFkZCBhcnRpZmFjdCIsIGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3ROYW1lKCksIFN0cmluZy52YWx1ZU9mKG9wZXJhdGlvblN0YXR1cykpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMob3BlcmF0aW9uU3RhdHVzKSk7CisJCQkJfQorCQkJCWFydGlmYWN0RGF0YSA9IGNyZWF0ZU5vZGVSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJCQkvLyBhZGQgaGVhdCBwYXJhbWV0ZXJzCisJCQkJaWYgKGFydGlmYWN0SW5mby5nZXRIZWF0UGFyYW1ldGVycygpICE9IG51bGwgJiYgIWFydGlmYWN0SW5mby5nZXRIZWF0UGFyYW1ldGVycygpLmlzRW1wdHkoKSAmJiAhYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKSkpIHsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0aWVzU3RhdHVzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uYWRkUHJvcGVydGllc1RvR3JhcGgoYXJ0aWZhY3RJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCksIGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpLnRvU3RyaW5nKCksIE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZik7CisJCQkJCWlmIChhZGRQcm9wZXJ0aWVzU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBoZWF0IHBhcmFtZXRlcnMgb24gZ3JhcGggZm9yIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TmFtZSgpKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYWRkUHJvcGVydGllc1N0YXR1cyk7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY2hlY2sgZXhpc3RhbmNlIG9mIGFydGlmYWN0IGluIGdyYXBoIGZvciBpZCB7fSIsIGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZXhpc3RBcnRpZmFjdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChmYWlsSWZleGlzdCkgeworCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCB7fSBhbHJlYWR5IGV4aXN0IiwgYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLkFMUkVBRFlfRVhJU1QpKTsKKwkJfSBlbHNlIHsKKwkJCWFydGlmYWN0RGF0YSA9IGV4aXN0QXJ0aWZhY3QubGVmdCgpLnZhbHVlKCk7CisJCX0KKworCQlVbmlxdWVJZERhdGEgcGFyZW50ID0gbmV3IFVuaXF1ZUlkRGF0YSh0eXBlLCBpZCk7CisKKwkJLy8gc2F2ZSBsb2dpY2FsIGFydGlmYWN0IHJlZiBuYW1lIG9uIGVkZ2UgYXMgcHJvcGVydHkKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BlcnRpZXMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKSAhPSBudWxsKQorCQkJcHJvcGVydGllcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuR1JPVVBfVFlQRS5nZXRQcm9wZXJ0eSgpLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKS5nZXRUeXBlKCkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHBhcmVudCwgYXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2VMYWJlbHMuQVJUSUZBQ1RfUkVGLCBwcm9wZXJ0aWVzKTsKKwkJaWYgKHJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHJlbGF0aW9uIGluIGdyYXBoIGZvciBpZCB7fSB0byBuZXcgYXJ0aWZhY3QiLCBpZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMocmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoYXJ0aWZhY3REYXRhKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQYXJlbnRUeXBlKE5vZGVUeXBlRW51bSB0eXBlKSB7CisJCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBSZXNvdXJjZToKKwkJY2FzZSBJbnRlcmZhY2VPcGVyYXRpb246CisJCWNhc2UgU2VydmljZToKKwkJY2FzZSBSZXNvdXJjZUluc3RhbmNlOgorCQkJaXNWYWxpZCA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvZy5kZWJ1ZygiTm90IHN1cHBvcnRlZCBub2RlIHR5cGUgZm9yIGFydGlmYWN0IHJlbGF0aW9uIDoge30iLCB0eXBlKTsKKwkJfQorCQlyZXR1cm4gaXNWYWxpZDsKKwl9CisKKwlwcm90ZWN0ZWQgQXJ0aWZhY3REZWZpbml0aW9uIGNvbnZlcnRBcnRpZmFjdERhdGFUb0FydGlmYWN0RGVmaW5pdGlvbihBcnRpZmFjdERhdGEgYXJ0aWZhY3REZWZSZXN1bHQpIHsKKwkJbG9nLmRlYnVnKCJUaGUgb2JqZWN0IHJldHVybmVkIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSBpcyB7fSIsIGFydGlmYWN0RGVmUmVzdWx0KTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gcHJvcGVydHlEZWZSZXN1bHQgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKGFydGlmYWN0RGVmUmVzdWx0LmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKSk7CisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGhlYXRQYXJhbWV0ZXJzT2ZOb2RlID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uZ2V0SGVhdFBhcmFtZXRlcnNPZk5vZGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBhcnRpZmFjdERlZlJlc3VsdC5nZXRVbmlxdWVJZCgpLnRvU3RyaW5nKCksIHBhcmFtZXRlcnMpOworCQlpZiAoKGhlYXRQYXJhbWV0ZXJzT2ZOb2RlLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpKSB7CisJCQlwcm9wZXJ0eURlZlJlc3VsdC5zZXRIZWF0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydHlEZWZSZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUFyaWZhY3RPblJlc291cmNlKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIFN0cmluZyBpZCwgU3RyaW5nIGFydGlmYWN0SWQsIE5vZGVUeXBlRW51bSB0eXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPEFydGlmYWN0RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gdXBkYXRlQXJ0aWZhY3RPbkdyYXBoKGFydGlmYWN0SW5mbywgYXJ0aWZhY3RJZCwgdHlwZSwgaWQpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfQorCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgYXJ0aWZhY3Qge30gb2Yge30ge30uIFN0YXR1cyBpcyB7fSIsIGFydGlmYWN0SWQsIHR5cGUuZ2V0TmFtZSgpLCBpZCwgc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IsICJGYWlsZWQgdG8gdXBkYXRlIGFydGlmYWN0ICIgKyBhcnRpZmFjdElkICsgIiBvZiAiICsgdHlwZS5nZXROYW1lKCkgKyAiICIgKyBpZCArICIuIHN0YXR1cyBpcyIgKyBzdGF0dXMucmlnaHQoKS52YWx1ZSgpLCBhcnRpZmFjdElkLAorCQkJCQlTdHJpbmcudmFsdWVPZihzdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IoIlVwZGF0ZSBBcnRpZmFjdCIsIGFydGlmYWN0SWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZlJlc3VsdCA9IGNvbnZlcnRBcnRpZmFjdERhdGFUb0FydGlmYWN0RGVmaW5pdGlvbihhcnRpZmFjdERhdGEpOworCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgQXJ0aWZhY3REZWZpbnRpb24gaXMge30iLCBhcnRpZmFjdERlZlJlc3VsdCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoYXJ0aWZhY3REZWZSZXN1bHQpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUFyaWZhY3REZWZpbml0aW9uKEFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8QXJ0aWZhY3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gdXBkYXRlQXJpZmFjdERhdGFEZWZpbml0aW9uKGFydGlmYWN0SW5mbyk7CisKKwkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgYXJ0aWZhY3Qge30iLCBhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IsICJGYWlsZWQgdG8gdXBkYXRlIGFydGlmYWN0ICIgKyBhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSArICIuIHN0YXR1cyBpcyIgKyBzdGF0dXMucmlnaHQoKS52YWx1ZSgpLCBhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSwKKwkJCQkJU3RyaW5nLnZhbHVlT2Yoc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkVXBkYXRlTm9kZUVycm9yKCJVcGRhdGUgQXJ0aWZhY3QiLCBhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQkJQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmUmVzdWx0ID0gY29udmVydEFydGlmYWN0RGF0YVRvQXJ0aWZhY3REZWZpbml0aW9uKGFydGlmYWN0RGF0YSk7CisJCQlsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBBcnRpZmFjdERlZmludGlvbiBpcyB7fSIsIGFydGlmYWN0RGVmUmVzdWx0KTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdERlZlJlc3VsdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBcmlmYWN0RGF0YURlZmluaXRpb24oQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbykgeworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCWlmIChncmFwaC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBuZXcgQXJ0aWZhY3REYXRhKGFydGlmYWN0SW5mbyk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKGFydGlmYWN0RGF0YSwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKworCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChzdGF0dXMubGVmdCgpLnZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKFN0cmluZyBpZCwgU3RyaW5nIGFydGlmYWN0SWQsIE5vZGVUeXBlRW51bSB0eXBlLCBib29sZWFuIGRlbGV0ZU1hbmRhdG9yeUFydGlmYWN0LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHJlbW92ZUFydGlmYWN0T25HcmFwaChpZCwgYXJ0aWZhY3RJZCwgdHlwZSwgaWQsIGRlbGV0ZU1hbmRhdG9yeUFydGlmYWN0KTsKKworCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBhcnRpZmFjdCB7fSBvZiByZXNvdXJjZSB7fSIsIGFydGlmYWN0SWQsIGlkKTsKKworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkRGVsZXRlTm9kZUVycm9yLCAiRmFpbGVkIHRvIGRlbGV0ZSBhcnRpZmFjdCAiICsgYXJ0aWZhY3RJZCArICIgb2YgcmVzb3VyY2UgIiArIGlkLCBhcnRpZmFjdElkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWREZWxldGVOb2RlRXJyb3IoIkRlbGV0ZSBBcnRpZmFjdCIsIGFydGlmYWN0SWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZlJlc3VsdCA9IGNvbnZlcnRBcnRpZmFjdERhdGFUb0FydGlmYWN0RGVmaW5pdGlvbihhcnRpZmFjdERhdGEpOworCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgQXJ0aWZhY3REZWZpbnRpb24gaXMge30iLCBhcnRpZmFjdERlZlJlc3VsdCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoYXJ0aWZhY3REZWZSZXN1bHQpOworCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVRvc2NhQXJ0aWZhY3ROYW1lT25HcmFwaChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgYXJ0aWZhY3RJZCwgTm9kZVR5cGVFbnVtIHR5cGUsIFN0cmluZyBpZCkgeworCQlyZXR1cm4gdXBkYXRlQXJ0aWZhY3RPbkdyYXBoKGFydGlmYWN0SW5mbywgYXJ0aWZhY3RJZCwgdHlwZSwgaWQpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJudWxsIikKKwlwcml2YXRlIEVpdGhlcjxBcnRpZmFjdERhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUFydGlmYWN0T25HcmFwaChBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvLCBTdHJpbmcgYXJ0aWZhY3RJZCwgTm9kZVR5cGVFbnVtIHR5cGUsIFN0cmluZyBpZCkgeworCisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGdyYXBoLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisKKwkJVGl0YW5HcmFwaCB0R3JhcGggPSBncmFwaC5sZWZ0KCkudmFsdWUoKTsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzQXJ0aWZhY3QgPSB0R3JhcGgucXVlcnkoKS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmKSwgYXJ0aWZhY3RJZCkudmVydGljZXMoKTsKKwkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXNBcnRpZmFjdC5pdGVyYXRvcigpOworCQlpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJbG9nLmRlYnVnKCJObyBhcnRpZmFjdCBub2RlIGZvciBpZCA9IHt9IiwgYXJ0aWZhY3RJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlUaXRhblZlcnRleCBhcnRpZmFjdFYgPSBpdGVyYXRvci5uZXh0KCk7CisKKwkJSXRlcmF0b3I8RWRnZT4gaXRlckVkZ2UgPSBhcnRpZmFjdFYuZWRnZXMoRGlyZWN0aW9uLklOLCBHcmFwaEVkZ2VMYWJlbHMuQVJUSUZBQ1RfUkVGLmdldFByb3BlcnR5KCkpOworCisJCWludCBlZGdlQ291bnQgPSAwOworCQlFZGdlIGVkZ2VGcm9tVG8gPSBudWxsOworCQl3aGlsZSAoaXRlckVkZ2UuaGFzTmV4dCgpKSB7CisJCQlFZGdlIGVkZ2UgPSBpdGVyRWRnZS5uZXh0KCk7CisJCQlWZXJ0ZXggdmVydGV4RnJvbSA9IGVkZ2Uub3V0VmVydGV4KCk7CisJCQlTdHJpbmcgdmVydGV4SWQgPSB2ZXJ0ZXhGcm9tLnZhbHVlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKHR5cGUpKTsKKwkJCWlmIChpZC5lcXVhbHModmVydGV4SWQpKSB7CisJCQkJZWRnZUZyb21UbyA9IGVkZ2U7CisJCQl9CisJCQkrK2VkZ2VDb3VudDsKKwkJfQorCisJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBuZXcgQXJ0aWZhY3REYXRhKGFydGlmYWN0SW5mbyk7CisJCWlmIChlZGdlRnJvbVRvID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiTm8gcmVsYXRpb24gYmV0d2VlbiBhcnRpZmFjdCAgPSB7fSBhbmQgbm9kZSB3aXRoIGlkID0ge30iLCBhcnRpZmFjdElkLCBpZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNldFJlbGV2YW50SGVhdFBhcmFtSWRSZXMgPSBudWxsOworCQlpZiAoZWRnZUNvdW50ID4gMSkgeworCQkJLy8gbmVlZCB0byByZW1vdmUgcmVsYXRpb24sIGNyZWF0ZSBuZXcgbm9kZQorCQkJbG9nLmRlYnVnKCJhcnRpZmFjdFJlZiBoYXZlIG1vcmUgY29ubmVjdGlvbi4gTmVlZCB0byBjbG9uZSBub2RlIik7CisJCQlsb2cuZGVidWcoInJlbW92ZSBlZGdlIHt9IiwgZWRnZUZyb21Ubyk7CisJCQllZGdlRnJvbVRvLnJlbW92ZSgpOworCQkJLy8gdXBkYXRlIHJlc291cmNlIGlkIGluIG5ldyBhcnRpZmFjdCBub2RlCisJCQlTdHJpbmcgdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKGlkLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJCWFydGlmYWN0SW5mby5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCQkvLyB1cGRhdGUgVVVJRCBhbmQgYXJ0aWZhY3QgdmVyc2lvbgorCQkJU3RyaW5nIG9sZENoZWNrc3VtID0gYXJ0aWZhY3RWLnZhbHVlT3JOdWxsKHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpLmdldFByb3BlcnR5S2V5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfQ0hFQ0tTVU0uZ2V0UHJvcGVydHkoKSkpOworCQkJU3RyaW5nIG9sZFZlcnNpb24gPSBhcnRpZmFjdFYudmFsdWVPck51bGwodGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkuZ2V0UHJvcGVydHlLZXkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9WRVJTSU9OLmdldFByb3BlcnR5KCkpKTsKKwkJCXVwZGF0ZVVVSUQoYXJ0aWZhY3RJbmZvLCBvbGRDaGVja3N1bSwgb2xkVmVyc2lvbik7CisJCQlsb2cuZGVidWcoInRyeSB0byBjcmVhdGUgbmV3IGFydGlmYWN0IHJlZiBub2RlIGZvciBpZCB7fSIsIHVuaXF1ZUlkKTsKKwkJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZGVkQXJ0aWZhY3RSZXMgPSBhZGRBcnRpZmFjdFRvR3JhcGgoYXJ0aWZhY3RJbmZvLCBpZCwgdHlwZSwgdHJ1ZSk7CisKKwkJCWlmIChhZGRlZEFydGlmYWN0UmVzLmlzTGVmdCgpKSB7CisJCQkJLy8gcmVtb3ZlIGFsbCByZWxhdGlvbnMgYmV0d2VlbiBncm91cHMgdG8gdGhlIG9sZCBhcnRpZmFjdAorCQkJCS8vIGFkZCByZWxhdGlvbiBiZXR3ZWVuIHRoZSBzYW1lIGdyb3VwcyB0byB0aGUgbmV3IGFydGlmYWN0CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZWFzc29jaWF0ZUdyb3Vwc0Zyb21BcnRpZmFjdCA9IGdyb3VwT3BlcmF0aW9uLmRpc3NvY2lhdGVBbmRBc3NvY2lhdGVHcm91cHNGcm9tQXJ0aWZhY3QoaWQsIHR5cGUsIGFydGlmYWN0SWQsIGFkZGVkQXJ0aWZhY3RSZXMubGVmdCgpLnZhbHVlKCksIHRydWUpOworCQkJCWlmIChyZWFzc29jaWF0ZUdyb3Vwc0Zyb21BcnRpZmFjdCAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiVXBkYXRlQXJ0aWZhY3QiLCAiRmFpbGVkIHRvIHJlYXNzb2NpYXRlIGdyb3VwcyB0byB0aGUgbmV3IGFydGlmYWN0IiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVhc3NvY2lhdGVHcm91cHNGcm9tQXJ0aWZhY3QpOworCQkJCX0KKwkJCQkvLyBJZiBhcnRpZmFjdCBpcyBoZWF0IGVudgorCQkJCWlmIChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RUeXBlKCkuZXF1YWxzKEFydGlmYWN0VHlwZUVudW0uSEVBVF9FTlYuZ2V0VHlwZSgpKSkgeworCQkJCQlBcnRpZmFjdERhdGEgYWRkZWRBcnRpZmFjdCA9IGFkZGVkQXJ0aWZhY3RSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCVN0cmluZyBuZXdBcnRpZmFjdFVuaXF1ZUlkID0gKFN0cmluZykgYWRkZWRBcnRpZmFjdC5nZXRVbmlxdWVJZCgpOworCQkJCQlFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzdWx0ID0gbnVsbDsKKworCQkJCQlzZXRSZWxldmFudEhlYXRQYXJhbUlkUmVzID0gc2V0UmVsZXZhbnRIZWF0UGFyYW1JZChhcnRpZmFjdFYsIGFydGlmYWN0SW5mbyk7CisJCQkJCWlmIChzZXRSZWxldmFudEhlYXRQYXJhbUlkUmVzLmlzUmlnaHQoKSkgeworCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gc2V0IHJlbGV2YW50IGlkIHRvIGhlYXQgcGFyYW1ldGVycyBmb3IgaGVhdCBlbnYgYXJ0aWZhY3QgIiArIGFydGlmYWN0SW5mby5nZXRVbmlxdWVJZCgpICsgIi4gU3RhdHVzIGlzICIgKyBzZXRSZWxldmFudEhlYXRQYXJhbUlkUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHNldFJlbGV2YW50SGVhdFBhcmFtSWRSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCQlmb3IgKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRFbnZQYXJhbSA6IGFydGlmYWN0SW5mby5nZXRIZWF0UGFyYW1ldGVycygpKSB7CisJCQkJCQl1cGRhdGVSZXN1bHQgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi51cGRhdGVIZWF0UGFyYW1ldGVyVmFsdWUoaGVhdEVudlBhcmFtLCBuZXdBcnRpZmFjdFVuaXF1ZUlkLCBpZCwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCQkJCQlpZiAodXBkYXRlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBoZWF0IHBhcmFtZXRlciAiICsgaGVhdEVudlBhcmFtLmdldE5hbWUoKSArICIuIFN0YXR1cyBpcyAiICsgdXBkYXRlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh1cGRhdGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCUl0ZXJhdG9yPEVkZ2U+IGl0ZXJFZGdlR2VuZXJhdGVkRnJvbSA9IGFydGlmYWN0Vi5lZGdlcyhEaXJlY3Rpb24uT1VULCBHcmFwaEVkZ2VMYWJlbHMuR0VORVJBVEVEX0ZST00uZ2V0UHJvcGVydHkoKSk7CisKKwkJCQkJaWYgKCFpdGVyRWRnZUdlbmVyYXRlZEZyb20uaGFzTmV4dCgpKSB7CisJCQkJCQlsb2cuZXJyb3IoIk5vIGhlYXQgYXJ0aWZhY3Qgbm9kZSBmb3IgaWQgPSAiICsgYXJ0aWZhY3RJZCk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQkJfQorCQkJCQlFZGdlIGVkZ2VUb0hlYXQgPSBpdGVyRWRnZUdlbmVyYXRlZEZyb20ubmV4dCgpOworCQkJCQlWZXJ0ZXggdmVydGV4SW4gPSBlZGdlVG9IZWF0LmluVmVydGV4KCk7CisJCQkJCVN0cmluZyBnZW5lcmF0ZWRGcm9tQXJ0aWZhY3RJZCA9IHZlcnRleEluLnZhbHVlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZikpOworCQkJCQlVbmlxdWVJZERhdGEgZ2VuZXJhdGVkRnJvbUFydGlmYWN0Tm9kZSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBnZW5lcmF0ZWRGcm9tQXJ0aWZhY3RJZCk7CisJCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb25Ub0dlbmVyYXRlZEZyb21BcnRpZmFjdFJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihhZGRlZEFydGlmYWN0LCBnZW5lcmF0ZWRGcm9tQXJ0aWZhY3ROb2RlLCBHcmFwaEVkZ2VMYWJlbHMuR0VORVJBVEVEX0ZST00sIG51bGwpOworCQkJCQlpZiAoY3JlYXRlUmVsYXRpb25Ub0dlbmVyYXRlZEZyb21BcnRpZmFjdFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSByZWxhdGlvbiBmcm9tIGhlYXRfZW52ICIgKyBhZGRlZEFydGlmYWN0LmdldFVuaXF1ZUlkKCkgKyAiIHRvIGhlYXQgIiArIGdlbmVyYXRlZEZyb21BcnRpZmFjdE5vZGUpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNyZWF0ZVJlbGF0aW9uVG9HZW5lcmF0ZWRGcm9tQXJ0aWZhY3RSZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gYWRkZWRBcnRpZmFjdFJlczsKKworCQl9IGVsc2UgeworCQkJaWYgKGVkZ2VDb3VudCA9PSAxKSB7CisJCQkJU3RyaW5nIG9sZENoZWNrc3VtID0gYXJ0aWZhY3RWLnZhbHVlT3JOdWxsKHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpLmdldFByb3BlcnR5S2V5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfQ0hFQ0tTVU0uZ2V0UHJvcGVydHkoKSkpOworCQkJCVN0cmluZyBvbGRWZXJzaW9uID0gYXJ0aWZhY3RWLnZhbHVlT3JOdWxsKHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpLmdldFByb3BlcnR5S2V5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpKSk7CisJCQkJdXBkYXRlVVVJRChhcnRpZmFjdEluZm8sIG9sZENoZWNrc3VtLCBvbGRWZXJzaW9uKTsKKwkJCQkvLyB1cGRhdGUgZXhpc3QKKwkJCQlFaXRoZXI8QXJ0aWZhY3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlZEFydGlmYWN0ID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUoYXJ0aWZhY3REYXRhLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQkJCWlmICh1cGRhdGVkQXJ0aWZhY3QuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSBhcnRpZmFjdCBub2RlIGZvciBpZCB7fSIsIGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHVwZGF0ZWRBcnRpZmFjdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQl9CisKKwkJCQlpZiAoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WLmdldFR5cGUoKSkpIHsKKwkJCQkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlc3VsdCA9IG51bGw7CisJCQkJCVN0cmluZyBhcnRpZmFjdFVuaXF1ZUlkID0gYXJ0aWZhY3RJbmZvLmdldFVuaXF1ZUlkKCk7CisJCQkJCXNldFJlbGV2YW50SGVhdFBhcmFtSWRSZXMgPSBzZXRSZWxldmFudEhlYXRQYXJhbUlkKGFydGlmYWN0ViwgYXJ0aWZhY3RJbmZvKTsKKwkJCQkJaWYgKHNldFJlbGV2YW50SGVhdFBhcmFtSWRSZXMuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBzZXQgcmVsZXZhbnQgaWQgdG8gaGVhdCBwYXJhbWV0ZXJzIGZvciBoZWF0IGVudiBhcnRpZmFjdCB7fS4gU3RhdHVzIGlzIHt9IiwgYXJ0aWZhY3RJbmZvLmdldFVuaXF1ZUlkKCksIHNldFJlbGV2YW50SGVhdFBhcmFtSWRSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc2V0UmVsZXZhbnRIZWF0UGFyYW1JZFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdEVudlBhcmFtIDogYXJ0aWZhY3RJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCkpIHsKKwkJCQkJCXVwZGF0ZVJlc3VsdCA9IGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLnVwZGF0ZUhlYXRQYXJhbWV0ZXJWYWx1ZShoZWF0RW52UGFyYW0sIGFydGlmYWN0VW5pcXVlSWQsIGlkLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJCQkJCWlmICh1cGRhdGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gdXBkYXRlIGhlYXQgcGFyYW1ldGVyICIgKyBoZWF0RW52UGFyYW0uZ2V0TmFtZSgpICsgIi4gU3RhdHVzIGlzICIgKyB1cGRhdGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVwZGF0ZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3RDaGVja3N1bSgpID09IG51bGwpIHsKKwkJCQkJCS8vIHVwZGF0ZSBoZWF0IHBhcmFtZXRlcnMgb25seSBpZiBpdCBpcyBub3QgaGVhdCBlbnYKKwkJCQkJCWlmIChhcnRpZmFjdEluZm8uZ2V0R2VuZXJhdGVkRnJvbUlkKCkgPT0gbnVsbCkgeworCQkJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24udXBkYXRlSGVhdFBhcmFtZXRlcnMoYXJ0aWZhY3RJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCkpOworCQkJCQkJCWlmIChvcGVyYXRpb25TdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJRWl0aGVyPExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVQYXJhbWV0ZXJzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uZGVsZXRlQWxsSGVhdFBhcmFtZXRlcnNBc3NvY2lhdGVkVG9Ob2RlKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwgYXJ0aWZhY3RJbmZvLmdldFVuaXF1ZUlkKCkpOworCQkJCQkJaWYgKGRlbGV0ZVBhcmFtZXRlcnMuaXNSaWdodCgpKSB7CisJCQkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIGhlYXQgcGFyYW1ldGVycyBmb3IgYXJ0aWZhY3QgaWQge30iLCBhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCQkJfQorCisJCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZFBhcmFtZXRlcnMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5hZGRQcm9wZXJ0aWVzVG9HcmFwaChhcnRpZmFjdEluZm8uZ2V0SGVhdFBhcmFtZXRlcnMoKSwgYXJ0aWZhY3RJZCwgTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmKTsKKwkJCQkJCWlmICghYWRkUGFyYW1ldGVycy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgaGVhdCBwYXJhbWV0ZXJzIGZvciBhcnRpZmFjdCBpZCB7fSIsIGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQodXBkYXRlZEFydGlmYWN0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJObyByZWxldmVudCBlZGdlcyBmb3IgYXJ0aWZhY3QgPSB7fSIsIGFydGlmYWN0SWQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNldFJlbGV2YW50SGVhdFBhcmFtSWQoVGl0YW5WZXJ0ZXggYXJ0aWZhY3RWLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvKSB7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWF0UGFyYW1ldGVyc0hNID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJSXRlcmF0b3I8RWRnZT4gaXRlckhlYXQgPSBhcnRpZmFjdFYuZWRnZXMoRGlyZWN0aW9uLk9VVCwgR3JhcGhFZGdlTGFiZWxzLkdFTkVSQVRFRF9GUk9NLmdldFByb3BlcnR5KCkpOworCQlpZiAoIWl0ZXJIZWF0Lmhhc05leHQoKSkgeworCQkJbG9nLmRlYnVnKCJObyBlZGdlcyB3aXRoIGxhYmVsIEdFTkVSQVRFRF9GUk9NIGZvciB0aGUgbm9kZSB7fSIsIGFydGlmYWN0SW5mby5nZXRVbmlxdWVJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisJCUVkZ2UgaGVhdCA9IGl0ZXJIZWF0Lm5leHQoKTsKKwkJVmVydGV4IGhlYXRWZXJ0ZXggPSBoZWF0LmluVmVydGV4KCk7CisJCVN0cmluZyBoZWF0VW5pcXVlSWQgPSAoU3RyaW5nKSBoZWF0VmVydGV4LnZhbHVlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZikpOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0SGVhdFBhcmFtZXRlcnNSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCBoZWF0VW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5IRUFUX1BBUkFNRVRFUiwKKwkJCQlOb2RlVHlwZUVudW0uSGVhdFBhcmFtZXRlciwgSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCQlpZiAoZ2V0SGVhdFBhcmFtZXRlcnNSZXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIk5vIGhlYXQgcGFyYW1ldGVycyBmb3IgaGVhdCBhcnRpZmFjdCB7fSIsIGhlYXRVbmlxdWVJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlMaXN0PEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4+IGhlYXRQYXJhbWV0ZXJzID0gZ2V0SGVhdFBhcmFtZXRlcnNSZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChoZWF0UGFyYW1ldGVycyA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk5vIGhlYXQgcGFyYW1ldGVycyBmb3IgaGVhdCBhcnRpZmFjdCB7fSIsIGhlYXRVbmlxdWVJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlmb3IgKEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4gaGVhdFBhcmFtRWRnZSA6IGhlYXRQYXJhbWV0ZXJzKSB7CisJCQlIZWF0UGFyYW1ldGVyRGF0YSBoZWF0UGFyYW0gPSBoZWF0UGFyYW1FZGdlLmdldExlZnQoKTsKKwkJCWhlYXRQYXJhbWV0ZXJzSE0ucHV0KGhlYXRQYXJhbS5nZXROYW1lKCksIChTdHJpbmcpIGhlYXRQYXJhbS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlTdHJpbmcgY3VyTmFtZSA9IG51bGw7CisJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdEVudlBhcmFtIDogYXJ0aWZhY3RJbmZvLmdldEhlYXRQYXJhbWV0ZXJzKCkpIHsKKwkJCWN1ck5hbWUgPSBoZWF0RW52UGFyYW0uZ2V0TmFtZSgpOworCQkJaWYgKGhlYXRQYXJhbWV0ZXJzSE0uY29udGFpbnNLZXkoY3VyTmFtZSkpIHsKKwkJCQloZWF0RW52UGFyYW0uc2V0VW5pcXVlSWQoaGVhdFBhcmFtZXRlcnNITS5nZXQoY3VyTmFtZSkpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFBhcmVudHNPZkFydGlmYWN0KFN0cmluZyBhcnRpZmFjdElkLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCWlmIChncmFwaC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlUaXRhbkdyYXBoIHRHcmFwaCA9IGdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzQXJ0aWZhY3QgPSB0R3JhcGgucXVlcnkoKS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmKSwgYXJ0aWZhY3RJZCkudmVydGljZXMoKTsKKwkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXNBcnRpZmFjdC5pdGVyYXRvcigpOworCQlpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJbG9nLmRlYnVnKCJObyBhcnRpZmFjdCBub2RlIGZvciBpZCA9IHt9IiwgYXJ0aWZhY3RJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlWZXJ0ZXggYXJ0aWZhY3RWID0gaXRlcmF0b3IubmV4dCgpOworCQlJdGVyYXRvcjxFZGdlPiBpdGVyRWRnZSA9IGFydGlmYWN0Vi5lZGdlcyhEaXJlY3Rpb24uSU4sIEdyYXBoRWRnZUxhYmVscy5BUlRJRkFDVF9SRUYuZ2V0UHJvcGVydHkoKSk7CisJCWludCBlZGdlQ291bnQgPSAwOworCQl3aGlsZSAoaXRlckVkZ2UuaGFzTmV4dCgpKSB7CisJCQlFZGdlIGVkZ2UgPSBpdGVyRWRnZS5uZXh0KCk7CisJCQkrK2VkZ2VDb3VudDsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZWRnZUNvdW50KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlbW92ZUFydGlmYWN0T25HcmFwaChTdHJpbmcgaWQsIFN0cmluZyBhcnRpZmFjdElkLCBOb2RlVHlwZUVudW0gdHlwZSwgU3RyaW5nIGlkMiwgYm9vbGVhbiBkZWxldGVNYW5kYXRvcnlBcnRpZmFjdCkgeworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCWlmIChncmFwaC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdERhdGEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYpLCBhcnRpZmFjdElkLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlpZiAoYXJ0aWZhY3REYXRhLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgIGFydGlmYWN0IGZvciBpZCA9IHt9IiwgYXJ0aWZhY3RJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFydGlmYWN0RGF0YS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUFydGlmYWN0RGF0YURlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gYXJ0aWZhY3REYXRhLmxlZnQoKS52YWx1ZSgpLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKTsKKwkJYm9vbGVhbiBpc01hbmRhdG9yeSA9IGZhbHNlOworCQlpZiAoKGFydGlmYWN0RGVmaW5pdGlvbi5nZXRNYW5kYXRvcnkoKSB8fCBhcnRpZmFjdERlZmluaXRpb24uZ2V0U2VydmljZUFwaSgpKSAmJiAhZGVsZXRlTWFuZGF0b3J5QXJ0aWZhY3QpIHsKKwkJCS8vIHJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdERhdGEubGVmdCgpLnZhbHVlKCkpOworCQkJaXNNYW5kYXRvcnkgPSB0cnVlOworCQl9CisKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlc0FydGlmYWN0ID0gdEdyYXBoLnF1ZXJ5KCkuaGFzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiksIGFydGlmYWN0SWQpLnZlcnRpY2VzKCk7CisJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzQXJ0aWZhY3QuaXRlcmF0b3IoKTsKKwkJaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiTm8gYXJ0aWZhY3Qgbm9kZSBmb3IgaWQgPSB7fSIsIGFydGlmYWN0SWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisJCVZlcnRleCBhcnRpZmFjdFYgPSBpdGVyYXRvci5uZXh0KCk7CisJCUl0ZXJhdG9yPEVkZ2U+IGl0ZXJFZGdlID0gYXJ0aWZhY3RWLmVkZ2VzKERpcmVjdGlvbi5JTiwgR3JhcGhFZGdlTGFiZWxzLkFSVElGQUNUX1JFRi5nZXRQcm9wZXJ0eSgpKTsKKwkJaW50IGVkZ2VDb3VudCA9IDA7CisJCUVkZ2UgZWRnZUZyb21UbyA9IG51bGw7CisJCXdoaWxlIChpdGVyRWRnZS5oYXNOZXh0KCkpIHsKKwkJCUVkZ2UgZWRnZSA9IGl0ZXJFZGdlLm5leHQoKTsKKwkJCVZlcnRleCB2ZXJ0ZXhGcm9tID0gZWRnZS5vdXRWZXJ0ZXgoKTsKKwkJCVN0cmluZyB2ZXJ0ZXhJZCA9IHZlcnRleEZyb20udmFsdWUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUodHlwZSkpOworCQkJaWYgKGlkLmVxdWFscyh2ZXJ0ZXhJZCkpIHsKKwkJCQllZGdlRnJvbVRvID0gZWRnZTsKKwkJCX0KKwkJCSsrZWRnZUNvdW50OworCQl9CisJCWlmIChlZGdlRnJvbVRvID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiTm8gcmVsYXRpb24gYmV0d2VlbiBhcnRpZmFjdCA9IHt9IGFuZCBub2RlIHdpdGggaWQgPSB7fSIsIGFydGlmYWN0SWQsIGlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQkvLyBuZWVkIHRvIHJlbW92ZSByZWxhdGlvbiBmcm9tIHJlc291cmNlL2ludGVyZmFjZQorCisJCWxvZy5kZWJ1ZygicmVtb3ZlIGVkZ2Uge30iLCBlZGdlRnJvbVRvKTsKKwkJaWYgKCFpc01hbmRhdG9yeSB8fCAoaXNNYW5kYXRvcnkgJiYgZWRnZUNvdW50ID4gMSkpIHsKKwkJCWVkZ2VGcm9tVG8ucmVtb3ZlKCk7CisJCX0KKworCQkvLyBkZWxldGUgZWRnZXMgZnJvbSBhbGwgZ3JvdXBzIHVuZGVyIHRoZSBjb21wb25lbnQgaWQgd2hpY2ggcmVsYXRlZCB0bworCQkvLyB0aGlzIGFydGlmYWN0LgorCQkvLyBBbHNvIGluIGNhc2UgaXQgaXMgYSBtYW5kYXRvcnkgYXJ0aWZhY3QuCisJCUVpdGhlcjxMaXN0PEdyYXBoUmVsYXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZUFsbEdyb3VwcyA9IGdyb3VwT3BlcmF0aW9uLmRpc3NvY2lhdGVBbGxHcm91cHNGcm9tQXJ0aWZhY3RPbkdyYXBoKGlkLCB0eXBlLCBhcnRpZmFjdElkKTsKKwkJaWYgKGRpc3NvY2lhdGVBbGxHcm91cHMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkaXNzb2NpYXRlQWxsR3JvdXBzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EICYmIHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCWlmIChlZGdlQ291bnQgPT0gMSkgeworCQkJLy8gcmVtb3ZlIGFydGlmYWN0UmVmIG5vZGUKKwkJCWxvZy5kZWJ1ZygiUmVtb3ZlIGFydGlmYWN0UmVmIG5vZGUgZnJvbSBncmFwaCIpOworCQkJRWl0aGVyPExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVTdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5kZWxldGVBbGxIZWF0UGFyYW1ldGVyc0Fzc29jaWF0ZWRUb05vZGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBhcnRpZmFjdElkKTsKKwkJCWlmIChkZWxldGVTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZGVsZXRlIGhlYXQgcGFyYW1ldGVycyBvZiBhcnRpZmFjdCAiICsgYXJ0aWZhY3RJZCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkZWxldGVWYWx1ZXNTdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5kZWxldGVBbGxIZWF0VmFsdWVzQXNzb2NpYXRlZFRvTm9kZShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIGFydGlmYWN0SWQpOworCQkJaWYgKCFkZWxldGVWYWx1ZXNTdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZGVsZXRlIGhlYXQgdmFsdWVzIG9mIGFydGlmYWN0ICIgKyBhcnRpZmFjdElkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQkJaWYgKCFpc01hbmRhdG9yeSkgeworCQkJCWFydGlmYWN0Vi5yZW1vdmUoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiYXJ0aWZhY3RSZWYgaGF2ZSBtb3JlIGNvbm5lY3Rpb24uIEFydGlmYWN0UmVmIG5vZGUgd2lsbCBub3QgYmUgcmVtb3ZlZCAiKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdERhdGEubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIHBhcmVudElkCisJICogQHBhcmFtIHBhcmVudFR5cGUKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFydGlmYWN0cyhTdHJpbmcgcGFyZW50SWQsIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gd29yayB3aXRoIGdyYXBoIHt9IiwgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisJCQlUaXRhbkdyYXBoIHRHcmFwaCA9IGdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0R3JhcGgucXVlcnkoKS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUocGFyZW50VHlwZSksIHBhcmVudElkKS52ZXJ0aWNlcygpOworCQkJaWYgKHZlcnRpY2VzID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIk5vIG5vZGVzIGZvciB0eXBlIHt9ICBmb3IgaWQgPSB7fSIsIHBhcmVudFR5cGUsIHBhcmVudElkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCisJCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlJdGVyYXRvcjxFZGdlPiBpdGVyYXRvckVkZ2UgPSB2ZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLk9VVCwgR3JhcGhFZGdlTGFiZWxzLkFSVElGQUNUX1JFRi5nZXRQcm9wZXJ0eSgpKTsKKworCQkJCWlmIChpdGVyYXRvckVkZ2UgIT0gbnVsbCkgeworCisJCQkJCXdoaWxlIChpdGVyYXRvckVkZ2UuaGFzTmV4dCgpKSB7CisJCQkJCQlFZGdlIGVkZ2UgPSBpdGVyYXRvckVkZ2UubmV4dCgpOworCisJCQkJCQlWZXJ0ZXggYXJ0aWZhY3RWID0gZWRnZS5pblZlcnRleCgpOworCisJCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSB0aGlzLnRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKGFydGlmYWN0Vik7CisJCQkJCQlBcnRpZmFjdERhdGEgYXJ0aWZhY3QgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgcHJvcGVydGllcywgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJCQkJCWlmIChhcnRpZmFjdCAhPSBudWxsKSB7CisKKwkJCQkJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbihhcnRpZmFjdC5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkpOworCQkJCQkJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQkJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgaGVhdFBhcmFtZXRlcnNTdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5nZXRIZWF0UGFyYW1ldGVyc09mTm9kZShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBoZWF0UGFyYW1zKTsKKwkJCQkJCQlpZiAoIWhlYXRQYXJhbWV0ZXJzU3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgaGVhdCBwYXJhbWV0ZXJzIGZvciBub2RlIHt9ICB7fSIsIHBhcmVudFR5cGUuZ2V0TmFtZSgpLCBwYXJlbnRJZCk7CisJCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoaGVhdFBhcmFtZXRlcnNTdGF0dXMpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoIWhlYXRQYXJhbXMuaXNFbXB0eSgpKSB7CisJCQkJCQkJCWFydGlmYWN0RGVmaW5pdGlvbi5zZXRIZWF0UGFyYW1ldGVycyhoZWF0UGFyYW1zKTsKKwkJCQkJCQl9CisJCQkJCQkJYXJ0aWZhY3RNYXAucHV0KGFydGlmYWN0RGVmaW5pdGlvbi5nZXRBcnRpZmFjdExhYmVsKCksIGFydGlmYWN0RGVmaW5pdGlvbik7CisJCQkJCQkJbG9nLmRlYnVnKCJBcnRpZmFjdCB3YXMgYWRkZWQgdG8gbGlzdCB7fSIsIGFydGlmYWN0LmdldFVuaXF1ZUlkKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3RNYXApOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJdGhpcy50aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBUaXRhblZlcnRleD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFydGlmYWN0c1ZlcnRlY2llcyhTdHJpbmcgcGFyZW50SWQsIE5vZGVUeXBlRW51bSBwYXJlbnRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFRpdGFuVmVydGV4PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJCWlmIChncmFwaC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB3b3JrIHdpdGggZ3JhcGgge30iLCBncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0KKwkJCVRpdGFuR3JhcGggdEdyYXBoID0gZ3JhcGgubGVmdCgpLnZhbHVlKCk7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IHRHcmFwaC5xdWVyeSgpLmhhcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShwYXJlbnRUeXBlKSwgcGFyZW50SWQpLnZlcnRpY2VzKCk7CisJCQlpZiAodmVydGljZXMgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiTm8gbm9kZXMgZm9yIHR5cGUge30gIGZvciBpZCA9IHt9IiwgcGFyZW50VHlwZSwgcGFyZW50SWQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisKKwkJCU1hcDxTdHJpbmcsIFRpdGFuVmVydGV4PiBhcnRpZmFjdE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGl0YW5WZXJ0ZXg+KCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlJdGVyYXRvcjxFZGdlPiBpdGVyYXRvckVkZ2UgPSB2ZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLk9VVCwgR3JhcGhFZGdlTGFiZWxzLkFSVElGQUNUX1JFRi5nZXRQcm9wZXJ0eSgpKTsKKworCQkJCWlmIChpdGVyYXRvckVkZ2UgIT0gbnVsbCkgeworCisJCQkJCXdoaWxlIChpdGVyYXRvckVkZ2UuaGFzTmV4dCgpKSB7CisJCQkJCQlFZGdlIGVkZ2UgPSBpdGVyYXRvckVkZ2UubmV4dCgpOworCisJCQkJCQlUaXRhblZlcnRleCBhcnRpZmFjdFYgPSAoVGl0YW5WZXJ0ZXgpIGVkZ2UuaW5WZXJ0ZXgoKTsKKwkJCQkJCVN0cmluZyBsYWJlbCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShhcnRpZmFjdFYsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfTEFCRUwuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQlhcnRpZmFjdE1hcC5wdXQobGFiZWwsIGFydGlmYWN0Vik7CisJCQkJCQlsb2cuZGVidWcoIkFydGlmYWN0IHdhcyBhZGRlZCB0byBsaXN0IHt9IiwgbGFiZWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3RNYXApOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJdGhpcy50aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFydGlmYWN0QnlJZChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0ID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmKSwgaWQsIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCQlpZiAoYXJ0aWZhY3QuaXNSaWdodCgpKSB7CisJCQkJaWYgKGFydGlmYWN0LnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5BUlRJRkFDVF9OT1RfRk9VTkQpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFydGlmYWN0LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCX0KKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IGFydGlmYWN0LmxlZnQoKS52YWx1ZSgpOworCisJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWYgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkpOworCQkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+KCk7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGhlYXRQYXJhbWV0ZXJzU3RhdHVzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uZ2V0SGVhdFBhcmFtZXRlcnNPZk5vZGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBhcnRpZmFjdERlZi5nZXRVbmlxdWVJZCgpLCBoZWF0UGFyYW1zKTsKKwkJCWlmICghaGVhdFBhcmFtZXRlcnNTdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGhlYXQgcGFyYW1ldGVycyBmb3IgYXJ0aWZhY3Qge30iLCBpZCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChoZWF0UGFyYW1ldGVyc1N0YXR1cyk7CisJCQl9CisJCQlpZiAoIWhlYXRQYXJhbXMuaXNFbXB0eSgpKSB7CisJCQkJYXJ0aWZhY3REZWYuc2V0SGVhdFBhcmFtZXRlcnMoaGVhdFBhcmFtcyk7CisJCQl9CisKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdlbmVyYXRlZEZyb21BcnRpZmFjdCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWRLZXkoKSwgKFN0cmluZykgYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5HRU5FUkFURURfRlJPTSwKKwkJCQkJTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQkJaWYgKGdlbmVyYXRlZEZyb21BcnRpZmFjdC5pc0xlZnQoKSkgeworCQkJCUltbXV0YWJsZVBhaXI8QXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2U+IHBhaXIgPSBnZW5lcmF0ZWRGcm9tQXJ0aWZhY3QubGVmdCgpLnZhbHVlKCk7CisJCQkJU3RyaW5nIGdlbmVyYXRlZEZyb21JZCA9IChTdHJpbmcpIHBhaXIubGVmdC5nZXRVbmlxdWVJZCgpOworCQkJCWxvZy5kZWJ1ZygiYXJ0aWZhY3Qge30gaXMgZ2VuZXJhdGVkIGZyb20ge30uIiwgYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkKCksIGdlbmVyYXRlZEZyb21JZCk7CisJCQkJYXJ0aWZhY3REZWYuc2V0R2VuZXJhdGVkRnJvbUlkKGdlbmVyYXRlZEZyb21JZCk7CisJCQkJRWl0aGVyPExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBoZWF0UGFyYW1zRm9yRW52ID0gZ2V0SGVhdFBhcmFtc0ZvckVudihhcnRpZmFjdERlZik7CisJCQkJaWYgKGhlYXRQYXJhbXNGb3JFbnYuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBoZWF0IHBhcmFtZXRlcnMgdmFsdWVzIGZvciBoZWF0IGFydGlmYWN0IHt9IiwgYXJ0aWZhY3REZWYuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoaGVhdFBhcmFtc0ZvckVudi5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWFydGlmYWN0RGVmLnNldEhlYXRQYXJhbWV0ZXJzKGhlYXRQYXJhbXNGb3JFbnYubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3REZWYpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJdGhpcy50aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEhlYXRQYXJhbXNGb3JFbnYoQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRFbnZBcnRpZmFjdCkgeworCisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGhlYXRQYXJhbWV0ZXJzU3RhdHVzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uZ2V0SGVhdFBhcmFtZXRlcnNPZk5vZGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBoZWF0RW52QXJ0aWZhY3QuZ2V0R2VuZXJhdGVkRnJvbUlkKCksIGhlYXRQYXJhbXMpOworCQlpZiAoIWhlYXRQYXJhbWV0ZXJzU3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZ2V0IGhlYXQgcGFyYW1ldGVycyBmb3Igbm9kZSB7fSIsIGhlYXRFbnZBcnRpZmFjdC5nZXRHZW5lcmF0ZWRGcm9tSWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGhlYXRQYXJhbWV0ZXJzU3RhdHVzKTsKKwkJfQorCQlpZiAoIWhlYXRQYXJhbXMuaXNFbXB0eSgpKSB7CisKKwkJCU1hcDxTdHJpbmcsIEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGE+IGhlYXRWYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGE+KCk7CisJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaGVhdEVudlZhbHVlc1dpdGhFZGdlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiksIGhlYXRFbnZBcnRpZmFjdC5nZXRVbmlxdWVJZCgpLAorCQkJCQlHcmFwaEVkZ2VMYWJlbHMuUEFSQU1FVEVSX1ZBTFVFLCBOb2RlVHlwZUVudW0uSGVhdFBhcmFtZXRlclZhbHVlLCBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLmNsYXNzKTsKKworCQkJaWYgKGhlYXRFbnZWYWx1ZXNXaXRoRWRnZXMuaXNSaWdodCgpICYmICFoZWF0RW52VmFsdWVzV2l0aEVkZ2VzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGhlYXRFbnZWYWx1ZXNXaXRoRWRnZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmICghc3RhdHVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGhlYXRFbnZWYWx1ZXNXaXRoRWRnZXMuaXNMZWZ0KCkpIHsKKwkJCQlmb3IgKEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgR3JhcGhFZGdlPiBwYWlyIDogaGVhdEVudlZhbHVlc1dpdGhFZGdlcy5sZWZ0KCkudmFsdWUoKSkgeworCQkJCQlIZWF0UGFyYW1ldGVyVmFsdWVEYXRhIHBhcmFtZXRlclZhbHVlID0gcGFpci5sZWZ0OworCQkJCQlPYmplY3QgaGVhdFBhcmFtZXRlck5hbWUgPSBwYWlyLnJpZ2h0LmdldFByb3BlcnRpZXMoKS5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJaGVhdFZhbHVlc01hcC5wdXQoKFN0cmluZykgaGVhdFBhcmFtZXRlck5hbWUsIHBhcmFtZXRlclZhbHVlKTsKKwkJCQl9CisJCQl9CisKKwkJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcGFyYW1ldGVyIDogaGVhdFBhcmFtcykgeworCQkJCWlmIChwYXJhbWV0ZXIuZ2V0Q3VycmVudFZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQlpZiAoIm51bWJlciIuZXF1YWxzKHBhcmFtZXRlci5nZXRUeXBlKCkpKSB7CisJCQkJCQlwYXJhbWV0ZXIuc2V0RGVmYXVsdFZhbHVlKG5ldyBCaWdEZWNpbWFsKHBhcmFtZXRlci5nZXRDdXJyZW50VmFsdWUoKSkudG9QbGFpblN0cmluZygpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBhcmFtZXRlci5zZXREZWZhdWx0VmFsdWUocGFyYW1ldGVyLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlIZWF0UGFyYW1ldGVyVmFsdWVEYXRhIGhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEgPSBoZWF0VmFsdWVzTWFwLmdldChwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKKwkJCQlpZiAoaGVhdFBhcmFtZXRlclZhbHVlRGF0YSAhPSBudWxsICYmIGhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEuZ2V0VmFsdWUoKSAhPSBudWxsKSB7CisJCQkJCWlmICgibnVtYmVyIi5lcXVhbHMocGFyYW1ldGVyLmdldFR5cGUoKSkpIHsKKwkJCQkJCXBhcmFtZXRlci5zZXRDdXJyZW50VmFsdWUobmV3IEJpZ0RlY2ltYWwoaGVhdFBhcmFtZXRlclZhbHVlRGF0YS5nZXRWYWx1ZSgpKS50b1BsYWluU3RyaW5nKCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcGFyYW1ldGVyLnNldEN1cnJlbnRWYWx1ZShoZWF0UGFyYW1ldGVyVmFsdWVEYXRhLmdldFZhbHVlKCkpOworCQkJCQl9CisJCQkJCXBhcmFtZXRlci5zZXRVbmlxdWVJZCgoU3RyaW5nKSBoZWF0UGFyYW1ldGVyVmFsdWVEYXRhLmdldFVuaXF1ZUlkKCkpOworCisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGhlYXRQYXJhbXMpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBcnRpZmFjdHMoU3RyaW5nIHBhcmVudElkLCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBTdHJpbmcgZ3JvdXBUeXBlKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gd29yayB3aXRoIGdyYXBoIHt9IiwgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisJCQlUaXRhbkdyYXBoIHRHcmFwaCA9IGdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0R3JhcGgucXVlcnkoKS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUocGFyZW50VHlwZSksIHBhcmVudElkKS52ZXJ0aWNlcygpOworCQkJaWYgKHZlcnRpY2VzID09IG51bGwgfHwgdmVydGljZXMuaXRlcmF0b3IoKSA9PSBudWxsIHx8IGZhbHNlID09IHZlcnRpY2VzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7CisJCQkJbG9nLmRlYnVnKCJObyBub2RlcyBmb3IgdHlwZSB7fSAgZm9yIGlkID0ge30iLCBwYXJlbnRUeXBlLCBwYXJlbnRJZCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcGVydGllcyA9IG51bGw7CisJCQlpZiAoZ3JvdXBUeXBlICE9IG51bGwpIHsKKwkJCQllZGdlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQllZGdlUHJvcGVydGllcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuR1JPVVBfVFlQRS5nZXRQcm9wZXJ0eSgpLCBncm91cFR5cGUpOworCQkJfQorCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5CeUVkZ2VDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbkJ5RWRnZUNyaXRlcmlhKHZlcnRleCwgcGFyZW50SWQsIEdyYXBoRWRnZUxhYmVscy5BUlRJRkFDVF9SRUYsIE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwgQXJ0aWZhY3REYXRhLmNsYXNzLAorCQkJCQllZGdlUHJvcGVydGllcyk7CisKKwkJCWlmIChjaGlsZHJlbkJ5RWRnZUNyaXRlcmlhLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNoaWxkcmVuQnlFZGdlQ3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERhdGEsIEdyYXBoRWRnZT4+IGxpc3QgPSBjaGlsZHJlbkJ5RWRnZUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpOworCisJCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0c01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQkJZm9yIChJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPiBwYWlyIDogbGlzdCkgeworCQkJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBwYWlyLmdldExlZnQoKTsKKwkJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbihhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpKTsKKworCQkJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgaGVhdFBhcmFtZXRlcnNTdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5nZXRIZWF0UGFyYW1ldGVyc09mTm9kZShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBoZWF0UGFyYW1zKTsKKwkJCQlpZiAoIWhlYXRQYXJhbWV0ZXJzU3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgaGVhdCBwYXJhbWV0ZXJzIGZvciBub2RlIHt9IHt9IiwgcGFyZW50VHlwZS5nZXROYW1lKCksIHBhcmVudElkKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChoZWF0UGFyYW1ldGVyc1N0YXR1cyk7CisJCQkJfQorCQkJCWlmICghaGVhdFBhcmFtcy5pc0VtcHR5KCkpIHsKKwkJCQkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEhlYXRQYXJhbWV0ZXJzKGhlYXRQYXJhbXMpOworCQkJCX0KKworCQkJCUVpdGhlcjxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYpLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkdFTkVSQVRFRF9GUk9NLAorCQkJCQkJTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCisJCQkJaWYgKGdldFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJaWYgKCFzdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCUltbXV0YWJsZVBhaXI8QXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBnZXRSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJCWFydGlmYWN0RGVmaW5pdGlvbi5zZXRHZW5lcmF0ZWRGcm9tSWQoKFN0cmluZykgaW1tdXRhYmxlUGFpci5sZWZ0LmdldFVuaXF1ZUlkKCkpOworCQkJCX0KKworCQkJCWFydGlmYWN0c01hcC5wdXQoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0TGFiZWwoKSwgYXJ0aWZhY3REZWZpbml0aW9uKTsKKwkJCQlsb2cuZGVidWcoIkFydGlmYWN0IHt9IHdhcyBhZGRlZCB0byBsaXN0ICIsIGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3RzTWFwKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJdGhpcy50aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRIZWF0RW52QXJ0aWZhY3QoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SGVhdEVudiwgQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SGVhdCwgU3RyaW5nIHBhcmVudElkLCBOb2RlVHlwZUVudW0gcGFyZW50VHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGhlYXRBcnRpZmFjdE9uR3JhcGggPSBhZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3RIZWF0RW52LCBwYXJlbnRJZCwgcGFyZW50VHlwZSwgdHJ1ZSwgdHJ1ZSk7CisKKwkJCWlmIChoZWF0QXJ0aWZhY3RPbkdyYXBoLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSBoZWF0IGVudiBhcnRpZmFjdCBvbiBncmFwaCIpOworCQkJCXJlc3VsdCA9IGhlYXRBcnRpZmFjdE9uR3JhcGg7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGhlYXRBcnRpZmFjdE9uR3JhcGgubGVmdCgpLnZhbHVlKCk7CisKKwkJCS8vIGFkZCByZWxhdGlvbiBmcm9tIGhlYXRFbnYgdG8gaGVhdAorCQkJVW5pcXVlSWREYXRhIGhlYXREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIGFydGlmYWN0SGVhdC5nZXRVbmlxdWVJZCgpKTsKKwkJCVVuaXF1ZUlkRGF0YSBoZWF0RW52RGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBhcnRpZmFjdERlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGhlYXRFbnZEYXRhLCBoZWF0RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkdFTkVSQVRFRF9GUk9NLCBudWxsKTsKKworCQkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBhZGQgcmVsYXRpb24gZnJvbSBoZWF0X2VudiBhcnRpZmFjdCB0byBoZWF0IGFydGlmYWN0LiBlcnJvcjoge30iLCBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlhcnRpZmFjdERlZmluaXRpb24uc2V0R2VuZXJhdGVkRnJvbUlkKGFydGlmYWN0SGVhdC5nZXRVbmlxdWVJZCgpKTsKKwkJCWxvZy50cmFjZSgiaGVhdCBlbnYgYXJ0aWZhY3QgYWRkZWQgc3VjY2Vzc2Z1bHkgdG8gcmVzb3VyY2UgaW5zdGFuY2UiKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGFydGlmYWN0RGVmaW5pdGlvbik7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluVHJhbnNhY3Rpb24gPT0gZmFsc2UpIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQl0aGlzLnRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMudGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlVVVJRChBcnRpZmFjdERhdGFEZWZpbml0aW9uIGFydGlmYWN0RGF0YSwgU3RyaW5nIG9sZENoZWNrc3VtLCBTdHJpbmcgb2xkVmVzcmlvbikgeworCQlpZiAob2xkVmVzcmlvbiA9PSBudWxsIHx8IG9sZFZlc3Jpb24uaXNFbXB0eSgpKQorCQkJb2xkVmVzcmlvbiA9ICIwIjsKKworCQlTdHJpbmcgY3VycmVudENoZWNrc3VtID0gYXJ0aWZhY3REYXRhLmdldEFydGlmYWN0Q2hlY2tzdW0oKTsKKwkJaWYgKG9sZENoZWNrc3VtID09IG51bGwgfHwgb2xkQ2hlY2tzdW0uaXNFbXB0eSgpKSB7CisJCQlpZiAoY3VycmVudENoZWNrc3VtICE9IG51bGwpIHsKKwkJCQlnZW5lcmF0ZVVVSUQoYXJ0aWZhY3REYXRhLCBvbGRWZXNyaW9uKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoY3VycmVudENoZWNrc3VtICE9IG51bGwgJiYgIWN1cnJlbnRDaGVja3N1bS5pc0VtcHR5KCkpICYmICFvbGRDaGVja3N1bS5lcXVhbHMoY3VycmVudENoZWNrc3VtKSkgeworCQkJZ2VuZXJhdGVVVUlEKGFydGlmYWN0RGF0YSwgb2xkVmVzcmlvbik7CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVVVSUQoQXJ0aWZhY3REYXRhRGVmaW5pdGlvbiBhcnRpZmFjdERhdGEsIFN0cmluZyBvbGRWZXNyaW9uKSB7CisKKwkJVVVJRCB1dWlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisJCWFydGlmYWN0RGF0YS5zZXRBcnRpZmFjdFVVSUQodXVpZC50b1N0cmluZygpKTsKKwkJTURDLnB1dCgic2VydmljZUluc3RhbmNlSUQiLCB1dWlkLnRvU3RyaW5nKCkpOworCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJYXJ0aWZhY3REYXRhLnNldFBheWxvYWRVcGRhdGVEYXRlKHRpbWUpOworCQlpbnQgbmV3VmVyc2lvbiA9IG5ldyBJbnRlZ2VyKG9sZFZlc3Jpb24pLmludFZhbHVlKCk7CisJCW5ld1ZlcnNpb24rKzsKKwkJYXJ0aWZhY3REYXRhLnNldEFydGlmYWN0VmVyc2lvbihTdHJpbmcudmFsdWVPZihuZXdWZXJzaW9uKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEhlYXRBcnRpZmFjdEJ5SGVhdEVudklkKFN0cmluZyBoZWF0RW52SWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gd29yayB3aXRoIGdyYXBoIHt9IiwgZ3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisJCQlUaXRhbkdyYXBoIHRHcmFwaCA9IGdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0R3JhcGgucXVlcnkoKS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmKSwgaGVhdEVudklkKS52ZXJ0aWNlcygpOworCQkJaWYgKHZlcnRpY2VzID09IG51bGwgfHwgdmVydGljZXMuaXRlcmF0b3IoKSA9PSBudWxsIHx8IGZhbHNlID09IHZlcnRpY2VzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7CisJCQkJbG9nLmRlYnVnKCJObyBub2RlcyBmb3IgdHlwZSB7fSBmb3IgaWQgPSB7fSIsIE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwgaGVhdEVudklkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcGVydGllcyA9IG51bGw7CisJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbkJ5RWRnZUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuQnlFZGdlQ3JpdGVyaWEodmVydGV4LCBoZWF0RW52SWQsIEdyYXBoRWRnZUxhYmVscy5HRU5FUkFURURfRlJPTSwgTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBBcnRpZmFjdERhdGEuY2xhc3MsCisJCQkJCWVkZ2VQcm9wZXJ0aWVzKTsKKworCQkJaWYgKGNoaWxkcmVuQnlFZGdlQ3JpdGVyaWEuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2hpbGRyZW5CeUVkZ2VDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJTGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IGNoaWxkcmVuQnlFZGdlQ3JpdGVyaWEubGVmdCgpLnZhbHVlKCk7CisKKwkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkgPT0gdHJ1ZSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfQorCisJCQlpZiAobGlzdC5zaXplKCkgPiAxKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJfQorCisJCQlJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPiBpbW11dGFibGVQYWlyID0gbGlzdC5nZXQoMCk7CisKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKGltbXV0YWJsZVBhaXIubGVmdC5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkpOworCisJCQlsb2cuZGVidWcoIlRoZSBhcnRpZmFjdCB7fSB3YXMgZ2VuZXJhdGVkIGZyb20gYXJ0aWZhY3Qge30iLCBoZWF0RW52SWQsIGFydGlmYWN0RGVmaW5pdGlvbik7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGFydGlmYWN0RGVmaW5pdGlvbik7CisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoaW5UcmFuc2FjdGlvbiA9PSBmYWxzZSkgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCXRoaXMudGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy50aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEFydGlmYWN0RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0QXJ0aWZhY3REYXRhQnlBcnRpZmFjdFVVSUQoU3RyaW5nIGFydGlmYWN0VVVJRCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWY7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8PigpOworCQkJcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfVVVJRC5nZXRQcm9wZXJ0eSgpLCBhcnRpZmFjdFVVSUQpOworCQkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFydGlmYWN0RWl0aGVyID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEobm9kZVR5cGUsIHByb3BlcnRpZXNUb01hdGNoLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQkJaWYgKGdldEFydGlmYWN0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggYXJ0aWZhY3QgZGF0YSBmb3IgYXJ0aWZhY3Qgd2l0aCB1dWlkIHt9LCBlcnJvcjoge30iLCBub2RlVHlwZSwgZ2V0QXJ0aWZhY3RFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhnZXRBcnRpZmFjdEVpdGhlci5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0gZWxzZSB7CisJCQkJTGlzdDxBcnRpZmFjdERhdGE+IGFydGlmYWN0cyA9IGdldEFydGlmYWN0RWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQkJCUFydGlmYWN0RGF0YSBsYXRlc3RBcnRpZmFjdCA9IGFydGlmYWN0cy5zaXplKCkgPT0gMSA/IGFydGlmYWN0cy5nZXQoMCkKKwkJCQkJCTogYXJ0aWZhY3RzLnN0cmVhbSgpLm1heCgoYTEsIGEyKSAtPiBEb3VibGUuY29tcGFyZShEb3VibGUucGFyc2VEb3VibGUoYTEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0VmVyc2lvbigpKSwgRG91YmxlLnBhcnNlRG91YmxlKGEyLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRBcnRpZmFjdFZlcnNpb24oKSkpKS5nZXQoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChsYXRlc3RBcnRpZmFjdCk7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKCFpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJdGhpcy50aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQXR0cmlidXRlT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0F0dHJpYnV0ZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODFhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0F0dHJpYnV0ZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5BdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkF0dHJpYnV0ZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBdHRyaWJ1dGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXR0cmlidXRlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5BdHRyaWJ1dGVWYWx1ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKioKKyAqIENsYXNzIEZvciBEYXRhIE1vZGVsIExvZ2ljIFJlbGV2YW50IEZvciBBdHRyaWJ1dGVzCisgKiAKKyAqIEBhdXRob3IgbXNoaXRyaXQKKyAqCisgKi8KK0BDb21wb25lbnQoImF0dHJpYnV0ZS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIEF0dHJpYnV0ZU9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIGltcGxlbWVudHMgSUF0dHJpYnV0ZU9wZXJhdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF0dHJpYnV0ZU9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCS8qKgorCSAqIAorCSAqIEFkZCBhdHRyaWJ1dGUgdG8gZ3JhcGguCisJICogCisJICogMS4gQWRkIGF0dHJpYnV0ZSBub2RlCisJICogCisJICogMi4gQWRkIGVkZ2UgYmV0d2VlbiB0aGUgZm9ybWVyIG5vZGUgdG8gaXRzIHBhcmVudChpZiBleGlzdHMpCisJICogCisJICogMy4gQWRkIHByb3BlcnR5IG5vZGUgYW5kIGFzc29jaWF0ZSBpdCB0byB0aGUgbm9kZSBjcmVhdGVkIGF0ICMxLiAocGVyIHByb3BlcnR5ICYgaWYgZXhpc3RzKQorCSAqIAorCSAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPEF0dHJpYnV0ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRBdHRyaWJ1dGVUb05vZGVUeXBlKEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlRGVmaW5pdGlvbiwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgbm9kZVVuaXF1ZUlkKSB7CisJCVN0cmluZyBhdHRVbmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZEF0dHJpYnV0ZVVpZChub2RlVW5pcXVlSWQsIGF0dHJpYnV0ZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJU3VwcGxpZXI8QXR0cmlidXRlRGF0YT4gZGF0YUJ1aWxkZXIgPSAoKSAtPiBidWlsZEF0dHJpYnV0ZURhdGEoYXR0cmlidXRlRGVmaW5pdGlvbiwgYXR0VW5pcXVlSWQpOworCQlTdXBwbGllcjxTdHJpbmc+IGRlZk5hbWVHZW5lcmF0b3IgPSAoKSAtPiAiQXR0cmlidXRlIDogIiArIGF0dHJpYnV0ZURlZmluaXRpb24uZ2V0TmFtZSgpOworCisJCXJldHVybiBhZGREZWZpbml0aW9uVG9Ob2RlVHlwZShhdHRyaWJ1dGVEZWZpbml0aW9uLCBub2RlVHlwZSwgbm9kZVVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMuQVRUUklCVVRFLCBkYXRhQnVpbGRlciwgZGVmTmFtZUdlbmVyYXRvcik7CisKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZEF0dHJpYnV0ZVRvTm9kZVR5cGUoVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgsIEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlRGVmaW5pdGlvbiwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgbm9kZVVuaXF1ZUlkKSB7CisJCVN0cmluZyBhdHRVbmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZEF0dHJpYnV0ZVVpZChub2RlVW5pcXVlSWQsIGF0dHJpYnV0ZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJU3VwcGxpZXI8QXR0cmlidXRlRGF0YT4gZGF0YUJ1aWxkZXIgPSAoKSAtPiBidWlsZEF0dHJpYnV0ZURhdGEoYXR0cmlidXRlRGVmaW5pdGlvbiwgYXR0VW5pcXVlSWQpOworCQlTdXBwbGllcjxTdHJpbmc+IGRlZk5hbWVHZW5lcmF0b3IgPSAoKSAtPiAiQXR0cmlidXRlIDogIiArIGF0dHJpYnV0ZURlZmluaXRpb24uZ2V0TmFtZSgpOworCisJCXJldHVybiBhZGREZWZpbml0aW9uVG9Ob2RlVHlwZShtZXRhZGF0YVZlcnRleCwgYXR0cmlidXRlRGVmaW5pdGlvbiwgbm9kZVR5cGUsIG5vZGVVbmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLkFUVFJJQlVURSwgZGF0YUJ1aWxkZXIsIGRlZk5hbWVHZW5lcmF0b3IpOworCisJfQorCisJcHJpdmF0ZSBBdHRyaWJ1dGVEYXRhIGJ1aWxkQXR0cmlidXRlRGF0YShBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHJpYnV0ZURlZmluaXRpb24sIFN0cmluZyBhdHRVbmlxdWVJZCkgeworCQlhdHRyaWJ1dGVEZWZpbml0aW9uLnNldFVuaXF1ZUlkKGF0dFVuaXF1ZUlkKTsKKwkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVEYXRhKGF0dHJpYnV0ZURlZmluaXRpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QXR0cmlidXRlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVJZCkgeworCQlFaXRoZXI8QXR0cmlidXRlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IGRlbGV0ZUF0dHJpYnV0ZUZyb21HcmFwaChhdHRyaWJ1dGVJZCk7CisJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIEF0dHJpYnV0ZURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxBdHRyaWJ1dGVBc3NvY2lhdGVkVG9Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisJCVdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlcjsKKwkJTGlzdDxBdHRyaWJ1dGVEZWZpbml0aW9uPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRBbGxSZXNvdXJjZUF0dHJpYnVlcyA9IGZpbmROb2RlTm9uSW5oZXJldGVkQXR0cmlidWVzKHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGF0dHJpYnV0ZXMpOworCQllcnJvcldyYXBwZXIgPSAoZmluZEFsbFJlc291cmNlQXR0cmlidWVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSA/IG5ldyBXcmFwcGVyPD4oZmluZEFsbFJlc291cmNlQXR0cmlidWVzKSA6IG5ldyBXcmFwcGVyPD4oKTsKKworCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJZm9yIChBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dERlZiA6IGF0dHJpYnV0ZXMpIHsKKwkJCQlsb2cuZGVidWcoIkJlZm9yZSBkZWxldGluZyBhdHRyaWJ1dGUgZnJvbSBncmFwaCB7fSIsIGF0dERlZi5nZXRVbmlxdWVJZCgpKTsKKwkJCQlFaXRoZXI8QXR0cmlidXRlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQXR0cmlidXRlKSwgYXR0RGVmLmdldFVuaXF1ZUlkKCksIEF0dHJpYnV0ZURhdGEuY2xhc3MpOworCQkJCWlmIChkZWxldGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGRlbGV0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCU1hcDxTdHJpbmcsIEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHJpYnV0ZXNNYXAgPSBhdHRyaWJ1dGVzLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChlIC0+IGUuZ2V0TmFtZSgpLCBlIC0+IGUpKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChhdHRyaWJ1dGVzTWFwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXR0cmlidXRlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUF0dHJpYnV0ZUZyb21HcmFwaChTdHJpbmcgYXR0cmlidXRlSWQpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZGVsZXRpbmcgYXR0cmlidXRlIGZyb20gZ3JhcGgge30iLCBhdHRyaWJ1dGVJZCk7CisJCXJldHVybiB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQXR0cmlidXRlKSwgYXR0cmlidXRlSWQsIEF0dHJpYnV0ZURhdGEuY2xhc3MpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRBdHRyaWJ1dGVzVG9HcmFwaChUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCwgTWFwPFN0cmluZywgQXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlcywgU3RyaW5nIHJlc291cmNlSWQsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuU3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCWZvciAoQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzLnZhbHVlcygpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlaXRoZXJBZGRBdHRyaWJ1dGUgPSBhZGRBdHRyaWJ1dGVUb0dyYXBoQnlWZXJ0ZXgobWV0YWRhdGFWZXJ0ZXgsIGF0dHJpYnV0ZSwgcmVzb3VyY2VJZCwgZGF0YVR5cGVzKTsKKwkJCWlmICghZWl0aGVyQWRkQXR0cmlidXRlLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQl0aXRhblN0YXR1cyA9IGVpdGhlckFkZEF0dHJpYnV0ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGl0YW5TdGF0dXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbEF0dHJpYnV0ZXNPZlJlc291cmNlSW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2UgY29tcEluc3RhbmNlKSB7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0OworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8QXR0cmlidXRlVmFsdWVEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGF0dHJpYnV0ZUltcGxOb2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgY29tcEluc3RhbmNlLmdldFVuaXF1ZUlkKCksCisJCQkJR3JhcGhFZGdlTGFiZWxzLkFUVFJJQlVURV9WQUxVRSwgTm9kZVR5cGVFbnVtLkF0dHJpYnV0ZVZhbHVlLCBBdHRyaWJ1dGVWYWx1ZURhdGEuY2xhc3MpOworCisJCS8vIEJ1aWxkIEZyb20gUmVzb3VyY2UKKwkJaWYgKGF0dHJpYnV0ZUltcGxOb2Rlcy5pc1JpZ2h0KCkgJiYgYXR0cmlidXRlSW1wbE5vZGVzLnJpZ2h0KCkudmFsdWUoKSA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCXJlc3VsdCA9IGdldEF0dHJpYnV0ZXNGcm9tUmVzb3VyY2UoY29tcEluc3RhbmNlKTsKKwkJfQorCQkvLyBCdWlsZCBGcm9tIEluc3RhbmNlCisJCWVsc2UgaWYgKGF0dHJpYnV0ZUltcGxOb2Rlcy5pc0xlZnQoKSkgeworCQkJTGlzdDxJbW11dGFibGVQYWlyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gYXR0cmlidXRlc0Zyb21SSSA9IGF0dHJpYnV0ZUltcGxOb2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCXJlc3VsdCA9IG1lcmdlQXR0cmlidXRlc1Jlc3VsdHMoZ2V0QXR0cmlidXRlc0Zyb21SZXNvdXJjZShjb21wSW5zdGFuY2UpLCBjb252ZXJ0VG9Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZShhdHRyaWJ1dGVzRnJvbVJJKSk7CisJCX0KKwkJLy8gRXJyb3IKKwkJZWxzZSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhdHRyaWJ1dGVJbXBsTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbWVyZ2VBdHRyaWJ1dGVzUmVzdWx0cyhFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJBdHRyaWJ1dGVzVGhhdERvZXNOb3RFeGlzdE9uUkksCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJBdHRyaWJ1dGVzVGhhdEV4aXN0T25SSSkgeworCisJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKwkJaWYgKGVpdGhlckF0dHJpYnV0ZXNUaGF0RXhpc3RPblJJLmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVpdGhlckF0dHJpYnV0ZXNUaGF0RXhpc3RPblJJLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0gZWxzZSBpZiAoZWl0aGVyQXR0cmlidXRlc1RoYXREb2VzTm90RXhpc3RPblJJLmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVpdGhlckF0dHJpYnV0ZXNUaGF0RG9lc05vdEV4aXN0T25SSS5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJZmluYWwgTGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4gYXR0cmlidXRlc1RoYXRFeGlzdE9uUkkgPSBlaXRoZXJBdHRyaWJ1dGVzVGhhdEV4aXN0T25SSS5sZWZ0KCkudmFsdWUoKTsKKwkJCWZpbmFsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNUaGF0RG9lc05vdEV4aXN0T25SSSA9IGVpdGhlckF0dHJpYnV0ZXNUaGF0RG9lc05vdEV4aXN0T25SSS5sZWZ0KCkudmFsdWUoKTsKKwkJCVNldDxTdHJpbmc+IGF0dHJpYnV0ZXNJZFRoYXRFeGlzdE9uUkkgPSBhdHRyaWJ1dGVzVGhhdEV4aXN0T25SSS5zdHJlYW0oKS5tYXAoZSAtPiBlLmdldFVuaXF1ZUlkKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKwkJCS8vIEF0dHJpYnV0ZXMgRnJvbSBUaGUgUmVzb3VyY2UgV2l0aG91dCBhdHRyaWJ1dGVzIHRoYXQgYWxzbyBleGlzdAorCQkJLy8gb24gdGhlIGluc3RhbmNlCisJCQlTdHJlYW08Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+IGZpbHRlckF0dHJpYnV0ZXNUaGF0RG9lc05vdEV4aXN0T25SSSA9IGF0dHJpYnV0ZXNUaGF0RG9lc05vdEV4aXN0T25SSS5zdHJlYW0oKS5maWx0ZXIoZSAtPiAhYXR0cmlidXRlc0lkVGhhdEV4aXN0T25SSS5jb250YWlucyhlLmdldFVuaXF1ZUlkKCkpKTsKKwkJCS8vIEFkZCBGaWVsZHMgRnJvbSBSZXNvdXJjZSBBdHRyaWJ1dGVzCisJCQlmaWxsQXR0cmlidXRlSW5mb0Zyb21SZXNvdXJjZShhdHRyaWJ1dGVzVGhhdEV4aXN0T25SSSwgYXR0cmlidXRlc1RoYXREb2VzTm90RXhpc3RPblJJKTsKKwkJCS8vIEFkZGluZyB0aGUgQXR0cmlidXRlcyBvbiB0aGUgaW5zdGFuY2UgZm9yIHRoZSBmdWxsIGxpc3QKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+IG1lcmdlZExpc3QgPSBTdHJlYW0uY29uY2F0KGZpbHRlckF0dHJpYnV0ZXNUaGF0RG9lc05vdEV4aXN0T25SSSwgYXR0cmlidXRlc1RoYXRFeGlzdE9uUkkuc3RyZWFtKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChtZXJnZWRMaXN0KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgdm9pZCBmaWxsQXR0cmlidXRlSW5mb0Zyb21SZXNvdXJjZShMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiBhdHRyaWJ1dGVzVGhhdEV4aXN0T25SSSwgTGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4gYXR0cmlidXRlc1RoYXREb2VzTm90RXhpc3RPblJJKSB7CisJCWF0dHJpYnV0ZXNUaGF0RXhpc3RPblJJLnN0cmVhbSgpCisJCQkJLmZvckVhY2goZSAtPiBhZGRBdHRyaWJ1dGVJbmZvKGUsCisJCQkJCQkvLyBGaW5kcyB0aGUgc2FtZSBhdHRyaWJ1dGUgaW4gdGhlIHJlc291cmNlCisJCQkJCQlhdHRyaWJ1dGVzVGhhdERvZXNOb3RFeGlzdE9uUkkuc3RyZWFtKCkuZmlsdGVyKGUyIC0+IGUyLmdldFVuaXF1ZUlkKCkuZXF1YWxzKGUuZ2V0VW5pcXVlSWQoKSkpLmZpbmRBbnkoKS5nZXQoKSkpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZUluZm8oQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgYXR0cmlidXRlRnJvbVJJLCBDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBhdHRyaWJ1dGVGcm9tUmVzb3VyY2UpIHsKKwkJYXR0cmlidXRlRnJvbVJJLnNldE5hbWUoYXR0cmlidXRlRnJvbVJlc291cmNlLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZUZyb21SSS5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVGcm9tUmVzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWF0dHJpYnV0ZUZyb21SSS5zZXREZWZhdWx0VmFsdWUoYXR0cmlidXRlRnJvbVJlc291cmNlLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXR0cmlidXRlRnJvbVJJLnNldFN0YXR1cyhhdHRyaWJ1dGVGcm9tUmVzb3VyY2UuZ2V0U3RhdHVzKCkpOworCQlhdHRyaWJ1dGVGcm9tUkkuc2V0U2NoZW1hKGF0dHJpYnV0ZUZyb21SZXNvdXJjZS5nZXRTY2hlbWEoKSk7CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGF0dHJpYnV0ZUZyb21SSS5nZXRWYWx1ZSgpKSkgeworCQkJYXR0cmlidXRlRnJvbVJJLnNldFZhbHVlKGF0dHJpYnV0ZUZyb21SZXNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEF0dHJpYnV0ZXNGcm9tUmVzb3VyY2UoQ29tcG9uZW50SW5zdGFuY2UgY29tcEluc3RhbmNlKSB7CisJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKwkJTGlzdDxBdHRyaWJ1dGVEZWZpbml0aW9uPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCS8vIEF0dHJpYnV0ZXMgZG9lcyBub3QgZXhpc3Qgb24gUmkgLSBmZXRjaCB0aGVtIGZyb20gcmVzb3VyY2UKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZEFsbFJlc291cmNlQXR0cmlidWVzID0gZmluZEFsbFJlc291cmNlQXR0cmlidXRlc1JlY3Vyc2l2ZWx5KGNvbXBJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKSwgYXR0cmlidXRlcyk7CisJCWlmIChmaW5kQWxsUmVzb3VyY2VBdHRyaWJ1ZXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChmaW5kQWxsUmVzb3VyY2VBdHRyaWJ1ZXMpOworCQl9IGVsc2UgeworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4gYnVpbGRBdHRJbnN0YW5jZUZyb21SZXNvdXJjZSA9IGF0dHJpYnV0ZXMuc3RyZWFtKCkubWFwKGF0dERlZiAtPiBuZXcgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUoYXR0RGVmLCBmYWxzZSwgbnVsbCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJCS8vIFNldCBWYWx1ZSB0byBiZSBkZWZhdWx0IHZhbHVlIGluIGNhc2UgaXQgaXMgZW1wdHkKKwkJCUNvbnN1bWVyPENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiB2YWx1ZVNldHRlciA9IGRhdGEgLT4geworCQkJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5KGRhdGEuZ2V0VmFsdWUoKSkpIHsKKwkJCQkJZGF0YS5zZXRWYWx1ZShkYXRhLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCQl9CisJCQl9OworCQkJYnVpbGRBdHRJbnN0YW5jZUZyb21SZXNvdXJjZS5zdHJlYW0oKS5mb3JFYWNoKHZhbHVlU2V0dGVyKTsKKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYnVpbGRBdHRJbnN0YW5jZUZyb21SZXNvdXJjZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbnZlcnRUb0NvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlKExpc3Q8SW1tdXRhYmxlUGFpcjxBdHRyaWJ1dGVWYWx1ZURhdGEsIEdyYXBoRWRnZT4+IGxpc3QpIHsKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4gY29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChJbW11dGFibGVQYWlyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgR3JhcGhFZGdlPiBhdHRyaWJ1dGVWYWx1ZSA6IGxpc3QpIHsKKwkJCUF0dHJpYnV0ZVZhbHVlRGF0YSBhdHRyaWJ1dGVWYWx1ZURhdGEgPSBhdHRyaWJ1dGVWYWx1ZS5nZXRMZWZ0KCk7CisJCQlTdHJpbmcgYXR0cmlidXRlVmFsdWVVaWQgPSBhdHRyaWJ1dGVWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKTsKKworCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8QXR0cmlidXRlRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGF0dHJpYnV0ZURlZlJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQXR0cmlidXRlVmFsdWUpLCBhdHRyaWJ1dGVWYWx1ZVVpZCwgR3JhcGhFZGdlTGFiZWxzLkFUVFJJQlVURV9JTVBMLAorCQkJCQlOb2RlVHlwZUVudW0uQXR0cmlidXRlLCBBdHRyaWJ1dGVEYXRhLmNsYXNzKTsKKworCQkJaWYgKGF0dHJpYnV0ZURlZlJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhdHRyaWJ1dGVEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlJbW11dGFibGVQYWlyPEF0dHJpYnV0ZURhdGEsIEdyYXBoRWRnZT4gYXR0cmlidXRlRGVmUGFpciA9IGF0dHJpYnV0ZURlZlJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlTdHJpbmcgYXR0cmlidXRlVW5pcXVlSWQgPSBhdHRyaWJ1dGVEZWZQYWlyLmxlZnQuZ2V0VW5pcXVlSWQoKTsKKworCQkJCUNvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUoKTsKKwkJCQkvLyBzZXQgYXR0cmlidXRlIG9yaWdpbmFsIHVuaXF1ZSBpZAorCQkJCXJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUuc2V0VW5pcXVlSWQoYXR0cmlidXRlVW5pcXVlSWQpOworCQkJCS8vIHNldCBoaWRkZW4KKwkJCQlyZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlLnNldEhpZGRlbihhdHRyaWJ1dGVWYWx1ZURhdGEuaXNIaWRkZW4oKSk7CisJCQkJLy8gc2V0IHZhbHVlCisJCQkJcmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZS5zZXRWYWx1ZShhdHRyaWJ1dGVWYWx1ZURhdGEuZ2V0VmFsdWUoKSk7CisJCQkJLy8gc2V0IHByb3BlcnR5IHZhbHVlIHVuaXF1ZSBpZAorCQkJCXJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUuc2V0VmFsdWVVbmlxdWVVaWQoYXR0cmlidXRlVmFsdWVVaWQpOworCisJCQkJcmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZS5zZXRUeXBlKGF0dHJpYnV0ZVZhbHVlRGF0YS5nZXRUeXBlKCkpOworCisJCQkJY29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUuYWRkKHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUpOworCQkJfQorCisJCX0KKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBmZXRjaCBhbGwgYXR0cmlidXRlcyB1bmRlciBhIGdpdmVuIHJlc291cmNlKGluY2x1ZGVzIGl0cyBwYXJlbnRzJyByZXNvdXJjZXMpCisJICogCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcGFyYW0gYXR0cmlidXRlcworCSAqIEByZXR1cm4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZEFsbFJlc291cmNlQXR0cmlidXRlc1JlY3Vyc2l2ZWx5KFN0cmluZyByZXNvdXJjZUlkLCBMaXN0PEF0dHJpYnV0ZURlZmluaXRpb24+IGF0dHJpYnV0ZXMpIHsKKwkJZmluYWwgTm9kZUVsZW1lbnRGZXRjaGVyPEF0dHJpYnV0ZURlZmluaXRpb24+IHNpbmdsZU5vZGVGZXRjaGVyID0gKHJlc291cmNlSWRQYXJhbSwgYXR0cmlidXRlc1BhcmFtKSAtPiBmaW5kTm9kZU5vbkluaGVyZXRlZEF0dHJpYnVlcyhyZXNvdXJjZUlkUGFyYW0sIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgYXR0cmlidXRlc1BhcmFtKTsKKwkJcmV0dXJuIGZpbmRBbGxSZXNvdXJjZUVsZW1lbnRzRGVmaW5pdGlvblJlY3Vyc2l2ZWx5KHJlc291cmNlSWQsIGF0dHJpYnV0ZXMsIHNpbmdsZU5vZGVGZXRjaGVyKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kTm9kZU5vbkluaGVyZXRlZEF0dHJpYnVlcyhTdHJpbmcgdW5pcXVlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgTGlzdDxBdHRyaWJ1dGVEZWZpbml0aW9uPiBhdHRyaWJ1dGVzKSB7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8QXR0cmlidXRlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLkFUVFJJQlVURSwgTm9kZVR5cGVFbnVtLkF0dHJpYnV0ZSwKKwkJCQlBdHRyaWJ1dGVEYXRhLmNsYXNzKTsKKworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8QXR0cmlidXRlRGF0YSwgR3JhcGhFZGdlPj4gdmFsdWVzID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxBdHRyaWJ1dGVEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgOiB2YWx1ZXMpIHsKKwkJCQlBdHRyaWJ1dGVEYXRhIGF0dERhdGEgPSBpbW11dGFibGVQYWlyLmdldExlZnQoKTsKKwkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dERhdGEuZ2V0QXR0cmlidXRlRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7CisKKwkJCQlsb2cuZGVidWcoIkF0dHJpYnV0ZSB7fSBpcyBhc3NvY2lhdGVkIHRvIG5vZGUge30iLCBhdHRyaWJ1dGVOYW1lLCB1bmlxdWVJZCk7CisJCQkJQXR0cmlidXRlRGF0YSBhdHRyaWJ1dGVEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCQlBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHJpYnV0ZURlZmluaXRpb24gPSB0aGlzLmNvbnZlcnRBdHRyaWJ1dGVEYXRhVG9BdHRyaWJ1dGVEZWZpbml0aW9uKGF0dHJpYnV0ZURhdGEsIGF0dHJpYnV0ZU5hbWUsIHVuaXF1ZUlkKTsKKworCQkJCWF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZURlZmluaXRpb24pOworCisJCQkJbG9nLnRyYWNlKCJmaW5kQXR0cmlidXRlc09mTm9kZSAtIHByb3BlcnR5IHt9IGFzc29jaWF0ZWQgdG8gbm9kZSB7fSIsIGF0dHJpYnV0ZURlZmluaXRpb24sIHVuaXF1ZUlkKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGVEZWZpbml0aW9uIGNvbnZlcnRBdHRyaWJ1dGVEYXRhVG9BdHRyaWJ1dGVEZWZpbml0aW9uKEF0dHJpYnV0ZURhdGEgYXR0cmlidXRlRGF0YSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyByZXNvdXJjZUlkKSB7CisJCWxvZy5kZWJ1ZygiVGhlIG9iamVjdCByZXR1cm5lZCBhZnRlciBjcmVhdGUgYXR0cmlidXRlIGlzIHt9IiwgYXR0cmlidXRlRGF0YSk7CisJCUF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlRGVmUmVzdWx0ID0gbmV3IEF0dHJpYnV0ZURlZmluaXRpb24oYXR0cmlidXRlRGF0YS5nZXRBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbigpKTsKKwkJYXR0cmlidXRlRGVmUmVzdWx0LnNldE5hbWUoYXR0cmlidXRlTmFtZSk7CisJCWF0dHJpYnV0ZURlZlJlc3VsdC5zZXRQYXJlbnRVbmlxdWVJZChyZXNvdXJjZUlkKTsKKwkJcmV0dXJuIGF0dHJpYnV0ZURlZlJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEF0dHJpYnV0ZURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHJpYnV0ZURlZmluaXRpb24sIFN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJRWl0aGVyPEF0dHJpYnV0ZURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlc3VsdDsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBhcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUuZ2V0QWxsKCk7CisJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDYW5ub3QgZmluZCBhbnkgZGF0YSB0eXBlLiBTdGF0dXMgaXMge30uIiwgc3RhdHVzKTsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQl9IGVsc2UgeworCQkJRWl0aGVyPEF0dHJpYnV0ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBhZGRBdHRyaWJ1dGVUb0dyYXBoKGF0dHJpYnV0ZURlZmluaXRpb24sIHJlc291cmNlSWQsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0b3JhZ2VTdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIubGVmdChlaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxBdHRyaWJ1dGVEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZUlkLCBBdHRyaWJ1dGVEZWZpbml0aW9uIG5ld0F0dERlZiwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHZhbGlkYXRlQW5kVXBkYXRlQXR0cmlidXRlID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShuZXdBdHREZWYsIGRhdGFUeXBlcyk7CisJCWlmICh2YWxpZGF0ZUFuZFVwZGF0ZUF0dHJpYnV0ZSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQW5kVXBkYXRlQXR0cmlidXRlKTsKKwkJfQorCisJCUVpdGhlcjxBdHRyaWJ1dGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdXBkYXRlQXR0cmlidXRlRnJvbUdyYXBoKGF0dHJpYnV0ZUlkLCBuZXdBdHREZWYpOworCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlU3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhlaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXR0cmlidXRlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUF0dHJpYnV0ZUZyb21HcmFwaChTdHJpbmcgYXR0cmlidXRlSWQsIEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cmlidXRlRGVmZW5pdGlvbikgeworCQlsb2cuZGVidWcoIkJlZm9yZSB1cGRhdGluZyBhdHRyaWJ1dGUgb24gZ3JhcGgge30iLCBhdHRyaWJ1dGVJZCk7CisKKwkJLy8gZ2V0IHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBkYXRhCisJCUVpdGhlcjxBdHRyaWJ1dGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQXR0cmlidXRlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkF0dHJpYnV0ZSksIGF0dHJpYnV0ZUlkLCBBdHRyaWJ1dGVEYXRhLmNsYXNzKTsKKwkJaWYgKGVpdGhlckF0dHJpYnV0ZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBnZXQgQXR0cmlidXRlIHdpdGggaWQge30uIFJlYXNvbiAtIHt9IiwgYXR0cmlidXRlSWQsIGVpdGhlckF0dHJpYnV0ZS5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZWl0aGVyQXR0cmlidXRlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJQXR0cmlidXRlRGF0YSBvcmdBdHRyaWJ1dGVEYXRhID0gZWl0aGVyQXR0cmlidXRlLmxlZnQoKS52YWx1ZSgpOworCQlBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbiBvcmdBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbiA9IG9yZ0F0dHJpYnV0ZURhdGEuZ2V0QXR0cmlidXRlRGF0YURlZmluaXRpb24oKTsKKworCQkvLyBjcmVhdGUgbmV3IHByb3BlcnR5IGRhdGEgdG8gdXBkYXRlCisJCUF0dHJpYnV0ZURhdGEgbmV3QXR0cmlidXRlRGF0YSA9IG5ldyBBdHRyaWJ1dGVEYXRhKCk7CisJCW5ld0F0dHJpYnV0ZURhdGEuc2V0QXR0cmlidXRlRGF0YURlZmluaXRpb24oYXR0cmlidXRlRGVmZW5pdGlvbik7CisJCUF0dHJpYnV0ZURhdGFEZWZpbml0aW9uIG5ld0F0dHJpYnV0ZURhdGFEZWZpbml0aW9uID0gbmV3QXR0cmlidXRlRGF0YS5nZXRBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbigpOworCisJCS8vIHVwZGF0ZSB0aGUgb3JpZ2luYWwgcHJvcGVydHkgZGF0YSB3aXRoIG5ldyB2YWx1ZXMKKwkJaWYgKCFPYmplY3RzLmVxdWFscyhvcmdBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSwgbmV3QXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpKSB7CisJCQlvcmdBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUobmV3QXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOworCQl9CisKKwkJaWYgKCFPYmplY3RzLmVxdWFscyhvcmdBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpLCBuZXdBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKSkgeworCQkJb3JnQXR0cmlidXRlRGF0YURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24obmV3QXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisJCX0KKworCQlpZiAoIU9iamVjdHMuZXF1YWxzKG9yZ0F0dHJpYnV0ZURhdGFEZWZpbml0aW9uLmdldFR5cGUoKSwgbmV3QXR0cmlidXRlRGF0YURlZmluaXRpb24uZ2V0VHlwZSgpKSkgeworCQkJb3JnQXR0cmlidXRlRGF0YURlZmluaXRpb24uc2V0VHlwZShuZXdBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQl9CisKKwkJb3JnQXR0cmlidXRlRGF0YURlZmluaXRpb24uc2V0U2NoZW1hKG5ld0F0dHJpYnV0ZURhdGFEZWZpbml0aW9uLmdldFNjaGVtYSgpKTsKKworCQlyZXR1cm4gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUob3JnQXR0cmlidXRlRGF0YSwgQXR0cmlidXRlRGF0YS5jbGFzcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGJ1aWxkUmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZShBdHRyaWJ1dGVWYWx1ZURhdGEgYXR0cmlidXRlVmFsdWVEYXRhLCBDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSByZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlKSB7CisKKwkJQm9vbGVhbiBoaWRkZW4gPSBhdHRyaWJ1dGVWYWx1ZURhdGEuaXNIaWRkZW4oKTsKKwkJU3RyaW5nIHVpZCA9IGF0dHJpYnV0ZVZhbHVlRGF0YS5nZXRVbmlxdWVJZCgpOworCQlDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBpbnN0YW5jZUF0dHJpYnV0ZSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZShyZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlLCBoaWRkZW4sIHVpZCk7CisKKwkJcmV0dXJuIGluc3RhbmNlQXR0cmlidXRlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QXR0cmlidXRlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEF0dHJpYnV0ZVRvR3JhcGgoQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGUsIFN0cmluZyByZXNvdXJjZUlkLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlFaXRoZXI8QXR0cmlidXRlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlc3VsdDsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZUFuZFVwZGF0ZUF0dHJpYnV0ZSA9IHByb3BlcnR5T3BlcmF0aW9uLnZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkoYXR0cmlidXRlLCBkYXRhVHlwZXMpOworCQlpZiAodmFsaWRhdGVBbmRVcGRhdGVBdHRyaWJ1dGUgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmVycm9yKCJBdHRyaWJ1dGUgIiArIGF0dHJpYnV0ZSArICIgaXMgaW52YWxpZC4gU3RhdHVzIGlzICIgKyB2YWxpZGF0ZUFuZFVwZGF0ZUF0dHJpYnV0ZSk7CisJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVCk7CisJCX0gZWxzZSB7CisJCQllaXRoZXJSZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb05vZGVUeXBlKGF0dHJpYnV0ZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZUlkKTsKKworCQl9CisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZEF0dHJpYnV0ZVRvR3JhcGhCeVZlcnRleChUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCwgQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGUsIFN0cmluZyByZXNvdXJjZUlkLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHZhbGlkYXRlQW5kVXBkYXRlQXR0cmlidXRlID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShhdHRyaWJ1dGUsIGRhdGFUeXBlcyk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHJlc3VsdDsKKwkJaWYgKHZhbGlkYXRlQW5kVXBkYXRlQXR0cmlidXRlICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWxvZy5lcnJvcigiQXR0cmlidXRlIHt9IGlzIGludmFsaWQuIFN0YXR1cyBpcyB7fSIsIGF0dHJpYnV0ZSwgdmFsaWRhdGVBbmRVcGRhdGVBdHRyaWJ1dGUpOworCQkJcmVzdWx0ID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVDsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvTm9kZVR5cGUobWV0YWRhdGFWZXJ0ZXgsIGF0dHJpYnV0ZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZUlkKTsKKworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9DYWNoZU1hbmdlck9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9DYWNoZU1hbmdlck9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTI1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NhY2hlTWFuZ2VyT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLio7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuam9icy4qOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLndvcmtlcnMuQ2FjaGVXb3JrZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUud29ya2Vycy5JV29ya2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLndvcmtlcnMuU3luY1dvcmtlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ2FjaGVNYW5nZXJPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVByb2R1Y3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklTZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLndvcmtlcnMuTWFuYWdlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworCisvKioKKyAqIENyZWF0ZWQgYnkgbWxhbmRvIG9uIDkvNS8yMDE2LiB0aGUgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGFsbAorICogY2FjaGUgdXBkYXRlIG9wZXJhdGlvbnMgYXN5bmNocm9ub3VzbHkgaW5jbHVkaW5nIHN5bmMgYmV0d2VlbiB0aGUgZ3JhcGggYW5kCisgKiBjYWNoZSBhbmQgb24gZGVtYW5kIHVwZGF0ZSByZXF1ZXN0cworICovCitAQ29tcG9uZW50KCJjYWNoZU1hbmdlci1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIENhY2hlTWFuZ2VyT3BlcmF0aW9uIGltcGxlbWVudHMgSUNhY2hlTWFuZ2VyT3BlcmF0aW9uIHsKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBJUmVzb3VyY2VPcGVyYXRpb24gaVJlc291cmNlT3BlcmF0aW9uOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElTZXJ2aWNlT3BlcmF0aW9uIGlTZXJ2aWNlT3BlcmF0aW9uOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElQcm9kdWN0T3BlcmF0aW9uIGlQcm9kdWN0T3BlcmF0aW9uOworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisJQEF1dG93aXJlZAorCXByaXZhdGUgQ29tcG9uZW50Q2FjaGUgY29tcG9uZW50Q2FjaGU7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgTGlua2VkQmxvY2tpbmdRdWV1ZTxKb2I+IGpvYlF1ZXVlID0gbnVsbDsKKwlwcml2YXRlIGludCB3YWl0T25TaHV0RG93bkluTWludXRlczsKKwlwcml2YXRlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzeW5jRXhlY3V0b3I7CisJcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2Ugd29ya2VyRXhlY3V0b3I7CisJcHJpdmF0ZSBMaW5rZWRMaXN0PElXb3JrZXI+IHdvcmtlckxpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisJcHJpdmF0ZSBEYW9JbmZvIGRhb0luZm87CisKKwkvKioKKwkgKiBjb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBDYWNoZU1hbmdlck9wZXJhdGlvbigpIHsKKwkJLy8gZGFvSW5mbyA9IG5ldyBEYW9JbmZvKGlSZXNvdXJjZU9wZXJhdGlvbiwgaVNlcnZpY2VPcGVyYXRpb24sCisJCS8vIGlQcm9kdWN0T3BlcmF0aW9uLCBjb21wb25lbnRDYWNoZSk7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjaGVja3MgaW4gdGhlIGNhY2hlIGlzIGVuYWJsZWQsIGlmIGl0IGlzLCBpdCBpbml0aWFsaXplcyBhbGwKKwkgKiB0aGUgd29ya2VycyBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgorCSAqLworCUBQb3N0Q29uc3RydWN0CisJcHVibGljIHZvaWQgaW5pdCgpIHsKKworCQlkYW9JbmZvID0gbmV3IERhb0luZm8oaVJlc291cmNlT3BlcmF0aW9uLCBpU2VydmljZU9wZXJhdGlvbiwgaVByb2R1Y3RPcGVyYXRpb24sIGNvbXBvbmVudENhY2hlKTsKKworCQlDb25maWd1cmF0aW9uLkFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyBhcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpCisJCQkJLmdldENvbmZpZ3VyYXRpb24oKS5nZXRBcHBsaWNhdGlvbkwyQ2FjaGUoKTsKKwkJaWYgKGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyAhPSBudWxsICYmIGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZy5pc0VuYWJsZWQoKSkgeworCQkJSW50ZWdlciBudW1iZXJPZldvcmtlcnMgPSBhcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcuZ2V0UXVldWUoKS5nZXROdW1iZXJPZkNhY2hlV29ya2VycygpOworCQkJdGhpcy53YWl0T25TaHV0RG93bkluTWludXRlcyA9IGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZy5nZXRRdWV1ZSgpLmdldFdhaXRPblNodXREb3duSW5NaW51dGVzKCk7CisJCQlqb2JRdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKwkJCWxvZy5pbmZvKCJMMiBDYWNoZSBpcyBlbmFibGVkIGluaXNoaWxzaW5nIHF1ZXVlIik7CisJCQlsb2cuZGVidWcoImluaXRpYWxpemluZyBTeW5jV29ya2VyLCBjcmVhdGluZyB7fSB3b3JrZXJzIik7CisJCQlUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKS5zZXROYW1lRm9ybWF0KCJTeW5jLUNhY2hlLVdvcmtlci0lZCIpLmJ1aWxkKCk7CisJCQl0aGlzLnN5bmNFeGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcih0aHJlYWRGYWN0b3J5KTsKKwkJCWxvZy5kZWJ1ZygiaW5pdGlhbGl6aW5nIHdvcmtlcnMsIGNyZWF0aW5nIHt9IGNhY2hlV29ya2VycyIsIG51bWJlck9mV29ya2Vycyk7CisJCQl0aHJlYWRGYWN0b3J5ID0gbmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkuc2V0TmFtZUZvcm1hdCgiQ2FjaGUtV29ya2VyLSVkIikuYnVpbGQoKTsKKwkJCVN0cmluZyB3b3JrZXJOYW1lID0gIlN5bmMtV29ya2VyIjsKKwkJCUludGVnZXIgc3luY1dvcmtlckV4YWN1dGlvbkludHJ2YWwgPSBhcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcuZ2V0UXVldWUoKS5nZXRTeW5jSW50ZXJ2YWxJblNlY29uZGVzKCk7CisJCQlsb2cuZGVidWcoInN0YXJ0aW5nIFN5bmMgd29ya2VyOnt9IHdpdGggZXhlY3V0aW9ucyBpbnRlcnZhbDp7fSAiLCB3b3JrZXJOYW1lLCBzeW5jV29ya2VyRXhhY3V0aW9uSW50cnZhbCk7CisJCQlTeW5jV29ya2VyIHN5bmNXb3JrZXIgPSBuZXcgU3luY1dvcmtlcih3b3JrZXJOYW1lLCB0aGlzKTsKKwkJCXRoaXMuc3luY0V4ZWN1dG9yLnNjaGVkdWxlQXRGaXhlZFJhdGUoc3luY1dvcmtlciwgNSAqIDYwLCBzeW5jV29ya2VyRXhhY3V0aW9uSW50cnZhbCwgVGltZVVuaXQuU0VDT05EUyk7CisJCQl0aGlzLndvcmtlckV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1iZXJPZldvcmtlcnMsIHRocmVhZEZhY3RvcnkpOworCQkJQ2FjaGVXb3JrZXIgY2FjaGVXb3JrZXI7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mV29ya2VyczsgaSsrKSB7CisJCQkJd29ya2VyTmFtZSA9ICJDYWNoZS1Xb3JrZXItIiArIGk7CisJCQkJbG9nLmRlYnVnKCJzdGFydGluZyBDYWNoZSB3b3JrZXI6e30iLCB3b3JrZXJOYW1lKTsKKwkJCQljYWNoZVdvcmtlciA9IG5ldyBDYWNoZVdvcmtlcih3b3JrZXJOYW1lLCBqb2JRdWV1ZSk7CisJCQkJdGhpcy53b3JrZXJFeGVjdXRvci5zdWJtaXQoY2FjaGVXb3JrZXIpOworCQkJCXRoaXMud29ya2VyTGlzdC5hZGQoY2FjaGVXb3JrZXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJbG9nLmluZm8oIkwyIENhY2hlIGlzIGRpc2FibGVkIik7CisJCX0KKwkJbG9nLmluZm8oIkwyIENhY2hlIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCB0aGUgd29ya2VycyBhcmUgcnVubmluZyIpOworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY3JlYXRlcyBhIGpvYiB0byBjaGVjayBpdCB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGluIHRoZSBjYWNoCisJICogYW5kIGlmIHNvIGlzIGl0IHZhbGlkIGlmIHRoZSB2YWx1ZSBpbiB0aGUgY2FjaGUgaXMgbm90IHZhbGlkIGl0IHdpbGwgYmUKKwkgKiB1cGRhdGVkLgorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqICAgICAgICAgICAgdGhlIHVpZCBvZiB0aGUgY29tcG9uZW50IHdlIHdhbnQgdG8gdXBkYXRlCisJICogQHBhcmFtIHRpbWVzdGFtcAorCSAqICAgICAgICAgICAgdGhlIHRpbWUgb2YgdGhlIGNvbXBvbmVudCB1cGRhdGUKKwkgKiBAcGFyYW0gbm9kZVR5cGVFbnVtCisJICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29tcG9uZW50IHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbXBvbmVudEluQ2FjaGUoU3RyaW5nIGNvbXBvbmVudElkLCBsb25nIHRpbWVzdGFtcCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCQlDb25maWd1cmF0aW9uLkFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyBhcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpCisJCQkJLmdldENvbmZpZ3VyYXRpb24oKS5nZXRBcHBsaWNhdGlvbkwyQ2FjaGUoKTsKKwkJaWYgKGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyAhPSBudWxsICYmIGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZy5pc0VuYWJsZWQoKSkgeworCQkJdGhpcy5qb2JRdWV1ZS5hZGQobmV3IENoZWNrQW5kVXBkYXRlSm9iKGRhb0luZm8sIGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0sIHRpbWVzdGFtcCkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgb3ZlcmlkZUNvbXBvbmVudEluQ2FjaGUoU3RyaW5nIGNvbXBvbmVudElkLCBsb25nIHRpbWVzdGFtcCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCQlDb25maWd1cmF0aW9uLkFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyBhcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpCisJCQkJLmdldENvbmZpZ3VyYXRpb24oKS5nZXRBcHBsaWNhdGlvbkwyQ2FjaGUoKTsKKwkJaWYgKGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyAhPSBudWxsICYmIGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZy5pc0VuYWJsZWQoKSkgeworCQkJdGhpcy5qb2JRdWV1ZS5hZGQobmV3IE92ZXJyaWRlSm9iKGRhb0luZm8sIGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0sIHRpbWVzdGFtcCkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgZGVsZXRlQ29tcG9uZW50SW5DYWNoZShTdHJpbmcgY29tcG9uZW50SWQsIGxvbmcgdGltZXN0YW1wLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCUNvbmZpZ3VyYXRpb24uQXBwbGljYXRpb25MMkNhY2hlQ29uZmlnIGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkKKwkJCQkuZ2V0Q29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9uTDJDYWNoZSgpOworCQlpZiAoYXBwbGljYXRpb25MMkNhY2hlQ29uZmlnICE9IG51bGwgJiYgYXBwbGljYXRpb25MMkNhY2hlQ29uZmlnLmlzRW5hYmxlZCgpKSB7CisJCQl0aGlzLmpvYlF1ZXVlLmFkZChuZXcgRGVsZXRlSm9iKGRhb0luZm8sIGNvbXBvbmVudElkLCBub2RlVHlwZUVudW0sIHRpbWVzdGFtcCkpOworCQl9CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBzdG9yZXMgdGhlIGdpdmVuIGNvbXBvbmVudCBpbiB0aGUgY2FjaGUKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogICAgICAgICAgICBjb21wb25ldCB0byBzdG9yZSBpbiBjYWNoZQorCSAqIEBwYXJhbSBub2RlVHlwZUVudW0KKwkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQgd2Ugd2FudCB0byBzdG9yZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3JlQ29tcG9uZW50SW5DYWNoZShvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisJCUNvbmZpZ3VyYXRpb24uQXBwbGljYXRpb25MMkNhY2hlQ29uZmlnIGFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkKKwkJCQkuZ2V0Q29uZmlndXJhdGlvbigpLmdldEFwcGxpY2F0aW9uTDJDYWNoZSgpOworCQlpZiAoYXBwbGljYXRpb25MMkNhY2hlQ29uZmlnICE9IG51bGwgJiYgYXBwbGljYXRpb25MMkNhY2hlQ29uZmlnLmlzRW5hYmxlZCgpKSB7CisJCQl0aGlzLmpvYlF1ZXVlLmFkZChuZXcgU3RvcmVKb2IoZGFvSW5mbywgY29tcG9uZW50LCBub2RlVHlwZUVudW0pKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2Qgc2h1dGRvd24ncyBhbGwgdGhlIHdvcmtlcidzLiB0aGUgbWV0aG9kIGhhcyBhIHByZSBzZXQgb2YgaG93CisJICogbG9uZyBpdCB3aWxsIHdhaXQgZm9yIHRoZSB3b3JrZXJzIHRvIHNodXRkb3duLiB0aGUgcHJlIGRlZmluZWQgdmFsdWUgaXMKKwkgKiB0YWtlbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgorCSAqLworCUBQcmVEZXN0cm95CisJcHVibGljIHZvaWQgc2h1dERvd24oKSB7CisJCXdvcmtlckV4ZWN1dG9yLnNodXRkb3duKCk7CisJCXN5bmNFeGVjdXRvci5zaHV0ZG93bigpOworCQl0aGlzLndvcmtlckxpc3QuZm9yRWFjaChlIC0+IGUuc2h1dERvd24oKSk7CisJCXRyeSB7CisJCQlpZiAoIXdvcmtlckV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24odGhpcy53YWl0T25TaHV0RG93bkluTWludXRlcywgVGltZVVuaXQuTUlOVVRFUykpIHsKKwkJCQlsb2cuZXJyb3IoInRpbWVyIGVsYXBzZWQgd2hpbGUgd2FpdGluZyBmb3IgQ2FjaGUgd29ya2VycyB0byBmaW5pc2gsIGZvcmNpbmcgYSBzaHV0ZG93bi4gIik7CisJCQl9CisJCQlsb2cuZGVidWcoImFsbCBDYWNoZSB3b3JrZXJzIGZpbmlzaGVkIik7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHdoaWxlIHdhaXRpbmcgZm9yIENhY2hlIHdvcmtlciIsIGUpOworCQl9CisJCXRyeSB7CisJCQlpZiAoIXdvcmtlckV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMSwgVGltZVVuaXQuTUlOVVRFUykpIHsKKwkJCQlsb2cuZXJyb3IoInRpbWVyIGVsYXBzZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIFN5bmMgd29ya2VyJ3MgdG8gZmluaXNoLCBmb3JjaW5nIGEgc2h1dGRvd24uICIpOworCQkJfQorCQkJbG9nLmRlYnVnKCJzeW5jIHdvcmtlciBmaW5pc2hlZCIpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB3aGlsZSB3YWl0aW5nIGZvciBzeW5jIHdvcmtlciIsIGUpOworCQl9CisJfQorCisJcHVibGljIFRpdGFuR2VuZXJpY0RhbyBnZXRUaXRhbkdlbmVyaWNEYW8oKSB7CisJCXJldHVybiB0aXRhbkdlbmVyaWNEYW87CisJfQorCisJcHVibGljIENvbXBvbmVudENhY2hlIGdldENvbXBvbmVudENhY2hlKCkgeworCQlyZXR1cm4gY29tcG9uZW50Q2FjaGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9DYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0ZjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMjE1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5SW5zdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50SW5zdGFuY2VEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9wZXJ0eVZhbHVlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCisvKioKKyAqIHB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24gcHJvdmlkZXMgbWV0aG9kcyBmb3IgQ1JVRCBvcGVyYXRpb25zIGZvciBDYXBhYmlsaXR5SW5zdGFuY2Ugb24gY29tcG9uZW50IGluc3RhbmNlIGxldmVsCisgKiAKKyAqIEBhdXRob3IgbnMwMTl0CisgKgorICovCitAQ29tcG9uZW50KCJjYXBhYmlsaXR5LWluc3RhbmNlLW9wZXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXBhYmlsaXR5T3BlcmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIENhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKworCS8qKgorCSAqIFN0cmluZyBjb25zdGFudHMgZm9yIGxvZ2dlcgorCSAqLworCXByaXZhdGUgU3RyaW5nIHN0YXR1c0lzID0gIi4gc3RhdHVzIGlzICI7CisJcHJpdmF0ZSBTdHJpbmcgZG90ID0gIi4iOworCXByaXZhdGUgU3RyaW5nIG9uR3JhcGggPSAiIG9uIGdyYXBoICI7CisJcHJpdmF0ZSBTdHJpbmcgb2ZSSSA9ICIgb2YgcmVzb3VyY2UgaW5zdGFuY2UgIjsKKwlwcml2YXRlIFN0cmluZyB0b0NhcGFiaWxpdHkgPSAiIHRvIGNhcGFiaWxpdHkgIjsKKwlwcml2YXRlIFN0cmluZyB0b0NJID0gIiB0byBjYXBhYmlsaXR5IGluc3RhbmNlICI7CisJcHJpdmF0ZSBTdHJpbmcgdG9Qcm9wZXJ0eSA9ICIgdG8gcHJvcGVydHkgIjsKKwlwcml2YXRlIFN0cmluZyBmb3JSSSA9ICIgZm9yIHJlc291cmNlIGluc3RhbmNlICI7CisJcHJpdmF0ZSBTdHJpbmcgZmFpbGVkQ3JlYXRlQ0kgPSAiRmFpbGVkIHRvIGNyZWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkgIjsKKwlwcml2YXRlIFN0cmluZyBmYWlsZWRBZGRQcm9wZXJ0aWVzID0gIkZhaWxlZCB0byBhZGQgcHJvcGVydGllcyB0byBjYXBhYmlsaXR5IGluc3RhbmNlICI7CisJcHJpdmF0ZSBTdHJpbmcgb2ZDSSA9ICIgb2YgY29tcG9uZW50IGluc3RhbmNlICI7CisJcHJpdmF0ZSBTdHJpbmcgZmFpbGVkRGVsZXRlUHJvcGVydHlWYWx1ZXMgPSAiRmFpbGVkIHRvIGRlbGV0ZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSAiOworCXByaXZhdGUgU3RyaW5nIHRvVmFsdWUgPSAiIHRvIHByb3BlcnR5IHZhbHVlICI7CisJcHJpdmF0ZSBTdHJpbmcgZnJvbVJJID0gIiBmcm9tIHJlc291cmNlIGluc3RhbmNlICI7CisKKwkvKioKKwkgKiBjcmVhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiBjYXBhYmlsaXR5IHdpdGggcHJvcGVydHkgdmFsdWVzIGZvciByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUlkCisJICogQHBhcmFtIHByb3BlcnR5VmFsdWVzCisJICogQHBhcmFtIHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2UKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eU5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8Q2FwYWJpbGl0eUluc3REYXRhLCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VPZkNhcGFiaWxpdHlXaXRoUHJvcGVydHlWYWx1ZXNGb3JSZXNvdXJjZUluc3RhbmNlKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlWYWx1ZXMsIGJvb2xlYW4gdmFsaWRhdGVDYXBhYmlsaXR5SW5zdEV4aXN0ZW5jZSkgeworCQlXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVdyYXBwZXI8Q2FwYWJpbGl0eURhdGE+IG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlXcmFwcGVyPENhcGFiaWxpdHlEZWZpbml0aW9uPiBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJRWl0aGVyPENhcGFiaWxpdHlJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhcGFiaWxpdHlSZXMgPSBudWxsOworCQlDYXBhYmlsaXR5SW5zdERhdGEgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZSA9IG51bGw7CisKKwkJV3JhcHBlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+PiBkZWZhdWx0UHJvcGVydGllc1dyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVJlcyA9IG51bGw7CisJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlEZWZpbml0aW9uUmVzID0gbnVsbDsKKwkJRWl0aGVyPExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlWYWx1ZXNSZXMgPSBudWxsOworCQlXcmFwcGVyPFN0cmluZz4gY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZUlkV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJaWYgKHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2UpIHsKKwkJCXZhbGlkYXRlQ2FwYWJpbGl0eUluc3RhbmNlRXhpc3RlbmNlKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkLCBlcnJvcldyYXBwZXIpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlnZXRDYXBhYmlsaXR5UmVzID0gZ2V0Q2FwYWJpbGl0aWVzT2ZSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkLCBjYXBhYmlsaXR5TmFtZSwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMgPSBnZXRDYXBhYmlpdHlEZWZpbml0aW9uKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkLCBlcnJvcldyYXBwZXIsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFXcmFwcGVyLCBnZXRDYXBhYmlsaXR5UmVzKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJY3JlYXRlQ2FwYWJpbGl0eVJlcyA9IGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZU9uR3JhcGgocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5SWQsIGVycm9yV3JhcHBlciwgb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YVdyYXBwZXIsIG92ZXJyaWRlQ2FwYWJpbGl0eURlZmluaXRpb25XcmFwcGVyLCBnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlcyk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkgJiYgb3ZlcnJpZGVDYXBhYmlsaXR5RGVmaW5pdGlvbldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkuZ2V0UHJvcGVydGllcygpICE9IG51bGwpIHsKKwkJCWNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UgPSB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0YW5jZVByb3BlcnRpZXMocmVzb3VyY2VJbnN0YW5jZUlkLCBwcm9wZXJ0eVZhbHVlcywgZXJyb3JXcmFwcGVyLCBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlciwgY3JlYXRlQ2FwYWJpbGl0eVJlcywgZGVmYXVsdFByb3BlcnRpZXNXcmFwcGVyLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJYWRkUHJvcGVydHlWYWx1ZXNSZXMgPSBhZGRQcm9wZXJ0eVZhbHVlVG9DYXBhYmlsaXR5SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZUlkLCBwcm9wZXJ0eVZhbHVlcywgZXJyb3JXcmFwcGVyLCBjcmVhdGVDYXBhYmlsaXR5UmVzLCBkZWZhdWx0UHJvcGVydGllc1dyYXBwZXIsIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIpOworCQl9CisJCUVpdGhlcjxNYXA8Q2FwYWJpbGl0eUluc3REYXRhLCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQ7CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlNYXA8Q2FwYWJpbGl0eUluc3REYXRhLCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4gcmVzdWx0TWFwID0gbmV3IEhhc2hNYXA8PigpOworCQkJcmVzdWx0TWFwLnB1dChjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlLCBhZGRQcm9wZXJ0eVZhbHVlc1Jlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChyZXN1bHRNYXApOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlT2ZDYXBhYmlsaXR5V2l0aFByb3BlcnR5VmFsdWVzRm9yUmVzb3VyY2VJbnN0YW5jZShUaXRhblZlcnRleCByZXNvdXJjZUluc3RhbmNlVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkLCBTdHJpbmcgY2FwYWJpbGl0eU5hbWUsCisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnR5VmFsdWVzLCBib29sZWFuIHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2UpIHsKKwkJV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlXcmFwcGVyPFRpdGFuVmVydGV4PiBvdmVycmlkZUNhcGFiaWxpdHlEYXRhV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJV3JhcHBlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gb3ZlcnJpZGVDYXBhYmlsaXR5RGVmaW5pdGlvbldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhcGFiaWxpdHlSZXMgPSBudWxsOworCQlUaXRhblZlcnRleCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlID0gbnVsbDsKKworCQlXcmFwcGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4+IGRlZmF1bHRQcm9wZXJ0aWVzV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8VGl0YW5WZXJ0ZXgsIEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVJlcyA9IG51bGw7CisJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlEZWZpbml0aW9uUmVzID0gbnVsbDsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkUHJvcGVydHlWYWx1ZXNSZXMgPSBudWxsOworCQlXcmFwcGVyPFN0cmluZz4gY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZUlkV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJaWYgKHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2UpIHsKKwkJCXZhbGlkYXRlQ2FwYWJpbGl0eUluc3RhbmNlRXhpc3RlbmNlKHJlc291cmNlSW5zdGFuY2VWZXJ0ZXgsIHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkLCBlcnJvcldyYXBwZXIpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlnZXRDYXBhYmlsaXR5UmVzID0gZ2V0Q2FwYWJpbGl0aWVzT2ZSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VWZXJ0ZXgsIHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkLCBjYXBhYmlsaXR5TmFtZSwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMgPSBnZXRDYXBhYmlpdHlEZWZpbml0aW9uQnlWZXJ0ZXgocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5SWQsIGVycm9yV3JhcHBlciwgb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YVdyYXBwZXIsIGdldENhcGFiaWxpdHlSZXMpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQljcmVhdGVDYXBhYmlsaXR5UmVzID0gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlT25HcmFwaEJ5VmVydGV4KHJlc291cmNlSW5zdGFuY2VWZXJ0ZXgsIHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkLCBlcnJvcldyYXBwZXIsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFXcmFwcGVyLCBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlciwgZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpICYmIG92ZXJyaWRlQ2FwYWJpbGl0eURlZmluaXRpb25XcmFwcGVyLmdldElubmVyRWxlbWVudCgpLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7CisJCQljcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlID0gdmFsaWRhdGVDYXBhYmlsaXR5SW5zdGFuY2VQcm9wZXJ0aWVzQnlWZXJ0ZXgocmVzb3VyY2VJbnN0YW5jZUlkLCBwcm9wZXJ0eVZhbHVlcywgZXJyb3JXcmFwcGVyLCBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlciwgY3JlYXRlQ2FwYWJpbGl0eVJlcy5sZWZ0KCkudmFsdWUoKSwgZGVmYXVsdFByb3BlcnRpZXNXcmFwcGVyLAorCQkJCQljcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJYWRkUHJvcGVydHlWYWx1ZXNSZXMgPSBhZGRQcm9wZXJ0eVZhbHVlVG9DYXBhYmlsaXR5SW5zdGFuY2VCeVZlcnRleChyZXNvdXJjZUluc3RhbmNlSWQsIHByb3BlcnR5VmFsdWVzLCBlcnJvcldyYXBwZXIsIGNyZWF0ZUNhcGFiaWxpdHlSZXMsIGRlZmF1bHRQcm9wZXJ0aWVzV3JhcHBlciwgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZUlkV3JhcHBlcik7CisJCX0KKworCQlyZXR1cm4gYWRkUHJvcGVydHlWYWx1ZXNSZXM7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVZhbHVlVG9DYXBhYmlsaXR5SW5zdGFuY2UoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0eVZhbHVlcywgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyLAorCQkJRWl0aGVyPENhcGFiaWxpdHlJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhcGFiaWxpdHlSZXMsIFdyYXBwZXI8TWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPj4gZGVmYXVsdFByb3BlcnRpZXNXcmFwcGVyLCBXcmFwcGVyPFN0cmluZz4gY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZUlkV3JhcHBlcikgeworCQlFaXRoZXI8TGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVZhbHVlc1JlczsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIHByb3BlcnR5IHZhbHVlcyB0byBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IGRvdCIsIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlhZGRQcm9wZXJ0eVZhbHVlc1JlcyA9IGFkZFByb3BlcnR5VmFsdWVzVG9DYXBhYmlsaXR5SW5zdGFuY2UoY3JlYXRlQ2FwYWJpbGl0eVJlcy5sZWZ0KCkudmFsdWUoKSwgcHJvcGVydHlWYWx1ZXMsIGRlZmF1bHRQcm9wZXJ0aWVzV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCWlmIChhZGRQcm9wZXJ0eVZhbHVlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoYWRkUHJvcGVydHlWYWx1ZXNSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkQWRkUHJvcGVydGllcyB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9IGRvdCIsIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZXMgdG8gY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSBzdGF0dXMgaXMge30uIiwgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZUlkV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJcmV0dXJuIGFkZFByb3BlcnR5VmFsdWVzUmVzOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkUHJvcGVydHlWYWx1ZVRvQ2FwYWJpbGl0eUluc3RhbmNlQnlWZXJ0ZXgoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0eVZhbHVlcywgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyLAorCQkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwYWJpbGl0eVJlcywgV3JhcHBlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+PiBkZWZhdWx0UHJvcGVydGllc1dyYXBwZXIsIFdyYXBwZXI8U3RyaW5nPiBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyKSB7CisJCWxvZy50cmFjZSgiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZXMgdG8gY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSIsIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0eVZhbHVlc1JlcyA9IGFkZFByb3BlcnR5VmFsdWVzVG9DYXBhYmlsaXR5SW5zdGFuY2UoY3JlYXRlQ2FwYWJpbGl0eVJlcy5sZWZ0KCkudmFsdWUoKSwgcHJvcGVydHlWYWx1ZXMsIGRlZmF1bHRQcm9wZXJ0aWVzV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCWlmICghYWRkUHJvcGVydHlWYWx1ZXNSZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChhZGRQcm9wZXJ0eVZhbHVlc1Jlcyk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhZGQgcHJvcGVydGllcyB0byBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHt9IHt9IHt9IHt9IiwgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZUlkV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgb2ZSSSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBzdGF0dXNJcywgZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlsb2cudHJhY2UoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZXMgdG8gY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSIsIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHN0YXR1c0lzLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlyZXR1cm4gYWRkUHJvcGVydHlWYWx1ZXNSZXM7CisJfQorCisJcHJpdmF0ZSBDYXBhYmlsaXR5SW5zdERhdGEgdmFsaWRhdGVDYXBhYmlsaXR5SW5zdGFuY2VQcm9wZXJ0aWVzKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlWYWx1ZXMsIFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciwKKwkJCVdyYXBwZXI8Q2FwYWJpbGl0eURlZmluaXRpb24+IG92ZXJyaWRlQ2FwYWJpbGl0eURlZmluaXRpb25XcmFwcGVyLCBFaXRoZXI8Q2FwYWJpbGl0eUluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwYWJpbGl0eVJlcywgV3JhcHBlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+PiBkZWZhdWx0UHJvcGVydGllc1dyYXBwZXIsCisJCQlXcmFwcGVyPFN0cmluZz4gY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZUlkV3JhcHBlcikgeworCQlDYXBhYmlsaXR5SW5zdERhdGEgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZTsKKwkJY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZSA9IGNyZWF0ZUNhcGFiaWxpdHlSZXMubGVmdCgpLnZhbHVlKCk7CisJCWNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZGVmYXVsdFByb3BlcnRpZXMgPSBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKS5nZXRQcm9wZXJ0aWVzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKFByb3BlcnR5RGVmaW5pdGlvbjo6Z2V0TmFtZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOworCQlkZWZhdWx0UHJvcGVydGllc1dyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGRlZmF1bHRQcm9wZXJ0aWVzKTsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgdmFsaWRhdGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fS4iLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0YW5jZVByb3BlcnRpZXMoZGVmYXVsdFByb3BlcnRpZXMsIHByb3BlcnR5VmFsdWVzKTsKKwkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoImZhaWxlZEFkZFByb3BlcnRpZXMge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciB2YWxpZGF0aW5nIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHN0YXR1cyBpcyB7fS4iLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlyZXR1cm4gY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZTsKKwl9CisKKwlwcml2YXRlIFRpdGFuVmVydGV4IHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RhbmNlUHJvcGVydGllc0J5VmVydGV4KFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlWYWx1ZXMsIFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciwKKwkJCVdyYXBwZXI8Q2FwYWJpbGl0eURlZmluaXRpb24+IG92ZXJyaWRlQ2FwYWJpbGl0eURlZmluaXRpb25XcmFwcGVyLCBUaXRhblZlcnRleCBjcmVhdGVDYXBhYmlsaXR5UmVzLCBXcmFwcGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4+IGRlZmF1bHRQcm9wZXJ0aWVzV3JhcHBlciwgV3JhcHBlcjxTdHJpbmc+IGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIpIHsKKwkJU3RyaW5nIGlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGNyZWF0ZUNhcGFiaWxpdHlSZXMsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQljcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyLnNldElubmVyRWxlbWVudChpZCk7CisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZGVmYXVsdFByb3BlcnRpZXMgPSBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKS5nZXRQcm9wZXJ0aWVzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKFByb3BlcnR5RGVmaW5pdGlvbjo6Z2V0TmFtZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOworCQlkZWZhdWx0UHJvcGVydGllc1dyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGRlZmF1bHRQcm9wZXJ0aWVzKTsKKwkJbG9nLnRyYWNlKCJCZWZvcmUgdmFsaWRhdGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSIsIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RhbmNlUHJvcGVydGllcyhkZWZhdWx0UHJvcGVydGllcywgcHJvcGVydHlWYWx1ZXMpOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFkZCBwcm9wZXJ0aWVzIHRvIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30ge30ge30ge30ge30iLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlSWRXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCBvZlJJLCByZXNvdXJjZUluc3RhbmNlSWQsIHN0YXR1c0lzLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJCWxvZy50cmFjZSgiQWZ0ZXIgdmFsaWRhdGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSIsIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VJZFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCksIHN0YXR1c0lzLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlyZXR1cm4gY3JlYXRlQ2FwYWJpbGl0eVJlczsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VPbkdyYXBoKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQsIFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciwgV3JhcHBlcjxDYXBhYmlsaXR5RGF0YT4gb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YVdyYXBwZXIsCisJCQlXcmFwcGVyPENhcGFiaWxpdHlEZWZpbml0aW9uPiBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlciwgRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMpIHsKKwkJRWl0aGVyPENhcGFiaWxpdHlJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhcGFiaWxpdHlSZXM7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIGNyZWF0aW5nIGNhcGFiaWxpdHkgaW5zdGFuY2Ugb2YgY2FwYWJpbGl0eSB7fSBvbiBncmFwaC4iLCBjYXBhYmlsaXR5SWQpOworCQlvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMubGVmdCgpLnZhbHVlKCkpOworCQlDYXBhYmlsaXR5SW5zdERhdGEgY2FwYWJpbGl0eUluc3RhbmNlID0gYnVpbGRDYXBhYmlsaXR5SW5zdGFuY2VEYXRhKHJlc291cmNlSW5zdGFuY2VJZCwgb3ZlcnJpZGVDYXBhYmlsaXR5RGVmaW5pdGlvbldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQljcmVhdGVDYXBhYmlsaXR5UmVzID0gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlT25HcmFwaChyZXNvdXJjZUluc3RhbmNlSWQsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCBjYXBhYmlsaXR5SW5zdGFuY2UpOworCQlpZiAoY3JlYXRlQ2FwYWJpbGl0eVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY3JlYXRlQ2FwYWJpbGl0eVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKCJmYWlsZWRDcmVhdGVDSSB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbmcgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiBjYXBhYmlsaXR5IHt9IG9uIGdyYXBoLiBTdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5SWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5UmVzOworCX0KKworCXByaXZhdGUgRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlT25HcmFwaEJ5VmVydGV4KFRpdGFuVmVydGV4IHJpVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkLCBXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIsCisJCQlXcmFwcGVyPFRpdGFuVmVydGV4PiBvdmVycmlkZUNhcGFiaWxpdHlEYXRhV3JhcHBlciwgV3JhcHBlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gb3ZlcnJpZGVDYXBhYmlsaXR5RGVmaW5pdGlvbldyYXBwZXIsIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlEZWZpbml0aW9uUmVzKSB7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhcGFiaWxpdHlSZXM7CisJCWxvZy50cmFjZSgiQmVmb3JlIGNyZWF0aW5nIGNhcGFiaWxpdHkgaW5zdGFuY2Ugb2YgY2FwYWJpbGl0eSB7fSB7fSIsIGNhcGFiaWxpdHlJZCwgb25HcmFwaCk7CisJCW92ZXJyaWRlQ2FwYWJpbGl0eURlZmluaXRpb25XcmFwcGVyLnNldElubmVyRWxlbWVudChnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlcy5sZWZ0KCkudmFsdWUoKSk7CisJCUNhcGFiaWxpdHlJbnN0RGF0YSBjYXBhYmlsaXR5SW5zdGFuY2UgPSBidWlsZENhcGFiaWxpdHlJbnN0YW5jZURhdGEocmVzb3VyY2VJbnN0YW5jZUlkLCBvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCWNyZWF0ZUNhcGFiaWxpdHlSZXMgPSBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VPbkdyYXBoKHJpVmVydGV4LCByZXNvdXJjZUluc3RhbmNlSWQsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCBjYXBhYmlsaXR5SW5zdGFuY2UpOworCQlpZiAoY3JlYXRlQ2FwYWJpbGl0eVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY3JlYXRlQ2FwYWJpbGl0eVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGNhcGFiaWxpdHkgaW5zdGFuY2Ugb2YgY2FwYWJpbGl0eSB7fSB7fSB7fSB7fSB7fSAiLCBjYXBhYmlsaXR5SWQsIG9mUkksIHJlc291cmNlSW5zdGFuY2VJZCwgc3RhdHVzSXMsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGluZyBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30ge30ge30ge30ge30iLCBjYXBhYmlsaXR5SWQsIG9uR3JhcGgsIHN0YXR1c0lzLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlyZXR1cm4gY3JlYXRlQ2FwYWJpbGl0eVJlczsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWl0eURlZmluaXRpb24oU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlJZCwgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyLCBXcmFwcGVyPENhcGFiaWxpdHlEYXRhPiBvdmVycmlkZUNhcGFiaWxpdHlEYXRhV3JhcHBlciwKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVJlcykgeworCQlFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlczsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZ2V0dGluZyBjYXBhYmlsaXR5IGRlZmluaXRpb24ge30gZm9yUkkge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlDYXBhYmlsaXR5RGF0YSBvdmVycmlkZUNhcGFiaWxpdHlEYXRhID0gZ2V0Q2FwYWJpbGl0eVJlcy5sZWZ0KCkudmFsdWUoKS5nZXRMZWZ0KCk7CisJCW92ZXJyaWRlQ2FwYWJpbGl0eURhdGFXcmFwcGVyLnNldElubmVyRWxlbWVudChvdmVycmlkZUNhcGFiaWxpdHlEYXRhKTsKKwkJZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMgPSBjYXBhYmlsaXR5T3BlcmF0aW9uLmdldENhcGFiaWxpdHlCeUNhcGFiaWxpdHlEYXRhKG92ZXJyaWRlQ2FwYWJpbGl0eURhdGEpOworCQlpZiAoZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMuaXNSaWdodCgpKSB7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGdldENhcGFiaWxpdHlEZWZpbml0aW9uUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBjYXBhYmlsaXR5IHt9IG9mUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBnZXR0aW5nIGNhcGFiaWxpdHkgZGVmaW5pdGlvbiBmb3Ige30gZm9yUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCXJldHVybiBnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlczsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWl0eURlZmluaXRpb25CeVZlcnRleChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkLCBXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIsIFdyYXBwZXI8VGl0YW5WZXJ0ZXg+IG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFXcmFwcGVyLAorCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8VGl0YW5WZXJ0ZXgsIEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVJlcykgeworCQlFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlczsKKwkJbG9nLnRyYWNlKCJCZWZvcmUgZ2V0dGluZyBjYXBhYmlsaXR5IGRlZmluaXRpb24ge30ge30ge30iLCBjYXBhYmlsaXR5SWQsIGZvclJJLCByZXNvdXJjZUluc3RhbmNlSWQpOworCisJCVRpdGFuVmVydGV4IG92ZXJyaWRlQ2FwYWJpbGl0eURhdGEgPSBnZXRDYXBhYmlsaXR5UmVzLmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKTsKKworCQlvdmVycmlkZUNhcGFiaWxpdHlEYXRhV3JhcHBlci5zZXRJbm5lckVsZW1lbnQob3ZlcnJpZGVDYXBhYmlsaXR5RGF0YSk7CisJCWdldENhcGFiaWxpdHlEZWZpbml0aW9uUmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5nZXRDYXBhYmlsaXR5QnlDYXBhYmlsaXR5RGF0YShvdmVycmlkZUNhcGFiaWxpdHlEYXRhKTsKKwkJaWYgKGdldENhcGFiaWxpdHlEZWZpbml0aW9uUmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgY2FwYWJpbGl0eSB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9IiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBnZXR0aW5nIGNhcGFiaWxpdHkgZGVmaW5pdGlvbiBmb3Ige30gZm9yUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCXJldHVybiBnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlczsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0aWVzT2ZSZXNvdXJjZUluc3RhbmNlKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyKSB7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVJlczsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZ2V0dGluZyBjYXBhYmlsaXR5IHt9IGZvclJJIHt9LiIsIGNhcGFiaWxpdHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5TmFtZSk7CisJCWdldENhcGFiaWxpdHlSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRCeUVkZ2VDcml0ZXJpYShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfQ0FQQUJJTElUWSwgTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHksIENhcGFiaWxpdHlEYXRhLmNsYXNzLCBwcm9wcyk7CisJCWlmIChnZXRDYXBhYmlsaXR5UmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChnZXRDYXBhYmlsaXR5UmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgY2FwYWJpbGl0eSB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgZ2V0dGluZyBjYXBhYmlsaXR5IGZvciB7fSBmb3JSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJcmV0dXJuIGdldENhcGFiaWxpdHlSZXM7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8SW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXRpZXNPZlJlc291cmNlSW5zdGFuY2UoVGl0YW5WZXJ0ZXggaW5zdGFuY2VWZXJ0ZXgsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwKKwkJCVdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlcikgeworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5UmVzOworCQlsb2cudHJhY2UoIkJlZm9yZSBnZXR0aW5nIGNhcGFiaWxpdHkge30ge30ge30iLCBjYXBhYmlsaXR5SWQsIGZvclJJLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGNhcGFiaWxpdHlOYW1lKTsKKwkJZ2V0Q2FwYWJpbGl0eVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZEJ5RWRnZUNyaXRlcmlhKGluc3RhbmNlVmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZLCBwcm9wcyk7CisJCWlmIChnZXRDYXBhYmlsaXR5UmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChnZXRDYXBhYmlsaXR5UmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgY2FwYWJpbGl0eSB7fSB7fSB7fSB7fSB7fSIsIGNhcGFiaWxpdHlJZCwgb2ZSSSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBzdGF0dXNJcywgZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCQlsb2cudHJhY2UoIkFmdGVyIGdldHRpbmcgY2FwYWJpbGl0eSBmb3Ige30ge30ge30ge30ge30iLCBjYXBhYmlsaXR5SWQsIGZvclJJLCByZXNvdXJjZUluc3RhbmNlSWQsIHN0YXR1c0lzLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQlyZXR1cm4gZ2V0Q2FwYWJpbGl0eVJlczsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVDYXBhYmlsaXR5SW5zdGFuY2VFeGlzdGVuY2UoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlJZCwgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIHZhbGlkYXRpb24gb2YgZXhpc3RlbmNlIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2Ugb2YgY2FwYWJpbGl0eSB7fSBmb3JSSSB7fS4iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCWJvb2xlYW4gY2FwYWJpbGl0eUluc3RPZkNhcGFiaWxpdHlBbHJlYWR5RXhpc3RzOworCQlFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2VSZXMgPSB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0RXhpc3RlbmNlKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkKTsKKwkJaWYgKHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2VSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2VSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHZhbGlkYXRlIHVuaXF1ZW5lc3Mgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiBjYXBhYmlsaXR5IHt9IG9mUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0gZWxzZSB7CisJCQljYXBhYmlsaXR5SW5zdE9mQ2FwYWJpbGl0eUFscmVhZHlFeGlzdHMgPSB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0RXhpc3RlbmNlUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKGNhcGFiaWxpdHlJbnN0T2ZDYXBhYmlsaXR5QWxyZWFkeUV4aXN0cykgeworCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCk7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWRDcmVhdGVDSSB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQkJfQorCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgdmFsaWRhdGlvbiBvZiBleGlzdGVuY2Ugb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiBjYXBhYmlsaXR5IHt9IGZvclJJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0YW5jZUV4aXN0ZW5jZShUaXRhblZlcnRleCByZXNvdXJjZUluc3RhbmNlVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkLCBXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIpIHsKKwkJbG9nLnRyYWNlKCJCZWZvcmUgdmFsaWRhdGlvbiBvZiBleGlzdGVuY2Ugb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiBjYXBhYmlsaXR5IHt9IHt9IHt9IiwgY2FwYWJpbGl0eUlkLCBmb3JSSSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJYm9vbGVhbiBjYXBhYmlsaXR5SW5zdE9mQ2FwYWJpbGl0eUFscmVhZHlFeGlzdHM7CisJCUVpdGhlcjxCb29sZWFuLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVDYXBhYmlsaXR5SW5zdEV4aXN0ZW5jZVJlcyA9IHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2UocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5SWQpOworCQlpZiAodmFsaWRhdGVDYXBhYmlsaXR5SW5zdEV4aXN0ZW5jZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQodmFsaWRhdGVDYXBhYmlsaXR5SW5zdEV4aXN0ZW5jZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdmFsaWRhdGUgdW5pcXVlbmVzcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfSBlbHNlIHsKKwkJCWNhcGFiaWxpdHlJbnN0T2ZDYXBhYmlsaXR5QWxyZWFkeUV4aXN0cyA9IHZhbGlkYXRlQ2FwYWJpbGl0eUluc3RFeGlzdGVuY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoY2FwYWJpbGl0eUluc3RPZkNhcGFiaWxpdHlBbHJlYWR5RXhpc3RzKSB7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZENyZWF0ZUNJIHt9IG9mUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCQl9CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciB2YWxpZGF0aW9uIG9mIGV4aXN0ZW5jZSBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30gZm9yUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVZhbHVlc1RvQ2FwYWJpbGl0eUluc3RhbmNlKENhcGFiaWxpdHlJbnN0RGF0YSBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlLCBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnR5VmFsdWVzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGRlZmF1bHRQcm9wZXJ0aWVzKSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gbnVsbDsKKwkJTGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4gY3JlYXRlZFByb3BlcnR5VmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eSA6IHByb3BlcnR5VmFsdWVzKSB7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgcHJvcGVydHkgdmFsdWUge30gdG9DSSB7fS4iLCBwcm9wZXJ0eS5nZXROYW1lKCksIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQlQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eURhdGEgPSBidWlsZFByb3BlcnR5VmFsdWVEYXRhKHByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0VHlwZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlWYWx1ZVJlcyA9IGFkZFByb3BlcnR5VmFsdWVUb0NhcGFiaWxpdHlJbnN0YW5jZShjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlLCBwcm9wZXJ0eURhdGEsIGRlZmF1bHRQcm9wZXJ0aWVzLmdldChwcm9wZXJ0eS5nZXROYW1lKCkpKTsKKwkJCWlmIChhZGRQcm9wZXJ0eVZhbHVlUmVzLmlzUmlnaHQoKSkgeworCQkJCWVycm9yID0gYWRkUHJvcGVydHlWYWx1ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHRvIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gb2ZSSS4gU3RhdHVzSXMge30uIiwgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWNyZWF0ZWRQcm9wZXJ0eVZhbHVlcy5hZGQoYWRkUHJvcGVydHlWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZSB7fSB0b0NJIHt9IHN0YXR1c0lzIHt9IiwgcHJvcGVydHkuZ2V0TmFtZSgpLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNyZWF0ZWRQcm9wZXJ0eVZhbHVlcyk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0eVZhbHVlc1RvQ2FwYWJpbGl0eUluc3RhbmNlKFRpdGFuVmVydGV4IGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2V2ZXJ0ZXgsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlWYWx1ZXMsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZGVmYXVsdFByb3BlcnRpZXMpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZXZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eSA6IHByb3BlcnR5VmFsdWVzKSB7CisJCQlsb2cudHJhY2UoIkJlZm9yZSBhZGRpbmcgcHJvcGVydHkgdmFsdWUge30ge30ge30iLCBwcm9wZXJ0eS5nZXROYW1lKCksIHRvQ0ksIGlkKTsKKwkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5RGF0YSA9IGJ1aWxkUHJvcGVydHlWYWx1ZURhdGEocHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXRUeXBlKCksIHByb3BlcnR5LmdldFZhbHVlKCksIGlkKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnR5VmFsdWVSZXMgPSBhZGRQcm9wZXJ0eVZhbHVlVG9DYXBhYmlsaXR5SW5zdGFuY2UoY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZXZlcnRleCwgcHJvcGVydHlEYXRhLCBkZWZhdWx0UHJvcGVydGllcy5nZXQocHJvcGVydHkuZ2V0TmFtZSgpKSwgaWQpOworCQkJaWYgKCFhZGRQcm9wZXJ0eVZhbHVlUmVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQllcnJvciA9IGFkZFByb3BlcnR5VmFsdWVSZXM7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHRvIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30ge30ge30ge30iLCBpZCwgb2ZSSSwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgYWRkaW5nIHByb3BlcnR5IHZhbHVlIHt9IHt9IHt9IHt9IHt9IiwgcHJvcGVydHkuZ2V0TmFtZSgpLCB0b0NJLCBpZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVEYXRhIGJ1aWxkUHJvcGVydHlWYWx1ZURhdGEoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VHlwZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUsIFN0cmluZyBjYXBhYmlsaXR5SW5zdGFuY2VJZCkgeworCQlQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eURhdGEgPSBuZXcgUHJvcGVydHlWYWx1ZURhdGEoKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlWYWx1ZVVuaXF1ZUlkKGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBwcm9wZXJ0eU5hbWUpOworCQlMb25nIGNyZWF0aW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlwcm9wZXJ0eURhdGEuc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCQlwcm9wZXJ0eURhdGEuc2V0VmFsdWUocHJvcGVydHlWYWx1ZSk7CisJCXByb3BlcnR5RGF0YS5zZXRUeXBlKHByb3BlcnR5VHlwZSk7CisJCXByb3BlcnR5RGF0YS5zZXRDcmVhdGlvblRpbWUoY3JlYXRpb25UaW1lKTsKKwkJcHJvcGVydHlEYXRhLnNldE1vZGlmaWNhdGlvblRpbWUoY3JlYXRpb25UaW1lKTsKKwkJcmV0dXJuIHByb3BlcnR5RGF0YTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VmFsdWVUb0NhcGFiaWxpdHlJbnN0YW5jZShDYXBhYmlsaXR5SW5zdERhdGEgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZSwgUHJvcGVydHlWYWx1ZURhdGEgcHJvcGVydHlWYWx1ZSwgUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbikgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBudWxsOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uUmVzOworCQlQcm9wZXJ0eVZhbHVlRGF0YSBjcmVhdGVkVmFsdWUgPSBudWxsOworCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyBwcm9wZXJ0eSB2YWx1ZSBub2RlIHt9IG9uR3JhcGguIiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpKTsKKwkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlVmFsdWVSZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9wZXJ0eVZhbHVlLCBQcm9wZXJ0eVZhbHVlRGF0YS5jbGFzcyk7CisJCWlmIChjcmVhdGVWYWx1ZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yID0gY3JlYXRlVmFsdWVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHByb3BlcnR5IHZhbHVlIGZvciBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IG9mUkkgc3RhdHVzSXMge30uIiwgY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGluZyBwcm9wZXJ0eSB2YWx1ZSBub2RlIHt9IG9uR3JhcGggc3RhdHVzSXMge30uIiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyByZWxhdGlvbiBmcm9tIHByb3BlcnR5IHZhbHVlIG5vZGUge30gdG9DSSB7fS4iLCBwcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCksIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQljcmVhdGVkVmFsdWUgPSBjcmVhdGVWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCXByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVFlfTkFNRS5uYW1lKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVFlfSUQubmFtZSgpLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQljcmVhdGVSZWxhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlLCBjcmVhdGVkVmFsdWUsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9WQUxVRSwgcHJvcHMpOworCQkJaWYgKGNyZWF0ZVJlbGF0aW9uUmVzLmlzUmlnaHQoKSkgeworCQkJCWVycm9yID0gY3JlYXRlUmVsYXRpb25SZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSByZWxhdGlvbiBmcm9tIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gdG9WYWx1ZSB7fSBzdGF0dXNJcyB7fS4iLCBjcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIGNyZWF0ZWRWYWx1ZS5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCQl9CisJCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW5nIHJlbGF0aW9uIGZyb20gcHJvcGVydHkgdmFsdWUgbm9kZSB7fSB0b0NJIHt9ICBzdGF0dXNJcyB7fS4iLCBwcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCksIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgZXJyb3IpOworCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyByZWxhdGlvbiBmcm9tIHByb3BlcnR5IHZhbHVlIG5vZGUge30gdG9Qcm9wZXJ0eSB7fS4iLCBwcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJCWNyZWF0ZVJlbGF0aW9uUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHByb3BlcnR5VmFsdWUsIG5ldyBQcm9wZXJ0eURhdGEocHJvcGVydHlEZWZpbml0aW9uLCBudWxsKSwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX0lNUEwsIHByb3BzKTsKKwkJCWlmIChjcmVhdGVSZWxhdGlvblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvciA9IGNyZWF0ZVJlbGF0aW9uUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSB7fSB0b1Byb3BlcnR5IHt9IHN0YXR1c0lzIHt9LiIsIGNyZWF0ZWRWYWx1ZS5nZXRVbmlxdWVJZCgpLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgZXJyb3IpOworCQkJfQorCQkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGluZyByZWxhdGlvbiBmcm9tIHByb3BlcnR5IHZhbHVlIG5vZGUge30gdG9Qcm9wZXJ0eSBzdGF0dXNJcyB7fS4iLCBwcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCX0KKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkVmFsdWUpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkUHJvcGVydHlWYWx1ZVRvQ2FwYWJpbGl0eUluc3RhbmNlKFRpdGFuVmVydGV4IGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2VWZXJ0ZXgsIFByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWUsIFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24sIFN0cmluZyBpZCkgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBudWxsOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvblJlczsKKwkJbG9nLnRyYWNlKCJCZWZvcmUgY3JlYXRpbmcgcHJvcGVydHkgdmFsdWUgbm9kZSB7fSAgb24gZ3JhcGguIiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpKTsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlVmFsdWVSZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9wZXJ0eVZhbHVlKTsKKwkJaWYgKGNyZWF0ZVZhbHVlUmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3IgPSBjcmVhdGVWYWx1ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSB7fSIsIGlkLCBvZlJJLCBzdGF0dXNJcywgZXJyb3IpOworCQkJfQorCQl9CisJCWxvZy50cmFjZSgiQWZ0ZXIgY3JlYXRpbmcgcHJvcGVydHkgdmFsdWUgbm9kZSB7fSAgb24gZ3JhcGggc3RhdHVzIGlzIHt9IiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCVRpdGFuVmVydGV4IGNyZWF0ZWRQcm9wVmVydGV4ID0gbnVsbDsKKwkJU3RyaW5nIGNyZWF0ZWRJZCA9IG51bGw7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cudHJhY2UoIkJlZm9yZSBjcmVhdGluZyByZWxhdGlvbiBmcm9tIHByb3BlcnR5IHZhbHVlIG5vZGUge30ge30ge30gIiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCB0b0NJLCBpZCk7CisJCQlwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRZX05BTUUubmFtZSgpLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRZX0lELm5hbWUoKSwgcHJvcGVydHlEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJY3JlYXRlZFByb3BWZXJ0ZXggPSBjcmVhdGVWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWNyZWF0ZVJlbGF0aW9uUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZUVkZ2UoY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZVZlcnRleCwgY3JlYXRlZFByb3BWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9WQUxVRSwgcHJvcHMpOworCQkJaWYgKCFjcmVhdGVSZWxhdGlvblJlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJZXJyb3IgPSBjcmVhdGVSZWxhdGlvblJlczsKKwkJCQljcmVhdGVkSWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoY3JlYXRlZFByb3BWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcmVsYXRpb24gZnJvbSBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHt9IHt9IHt9IHt9IiwgaWQsIHRvVmFsdWUsIGNyZWF0ZWRJZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCQl9CisJCQl9CisJCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpeworCQkJCWxvZy50cmFjZSgiQWZ0ZXIgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSBub2RlIHt9IHt9IHt9IHt9IHt9IiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCB0b0NJLCBpZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJbG9nLnRyYWNlKCJCZWZvcmUgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSBub2RlIHt9IHt9IHt9IiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCB0b1Byb3BlcnR5LCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCQljcmVhdGVSZWxhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKGNyZWF0ZWRQcm9wVmVydGV4LCBuZXcgUHJvcGVydHlEYXRhKHByb3BlcnR5RGVmaW5pdGlvbiwgbnVsbCksIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCBwcm9wcyk7CisJCQlpZiAoIWNyZWF0ZVJlbGF0aW9uUmVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQllcnJvciA9IGNyZWF0ZVJlbGF0aW9uUmVzOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSByZWxhdGlvbiBmcm9tIHByb3BlcnR5IHZhbHVlIHt9IHt9IHt9IHt9IHt9IiwgY3JlYXRlZElkLCB0b1Byb3BlcnR5LCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSBub2RlIHt9IHt9IHt9IHt9IHt9IiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCB0b1Byb3BlcnR5LCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgc3RhdHVzSXMsIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxCb29sZWFuLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVDYXBhYmlsaXR5SW5zdGFuY2VQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZGVmYXVsdFByb3BlcnRpZXMsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlWYWx1ZXMpIHsKKwkJRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BlcnR5IDogcHJvcGVydHlWYWx1ZXMpIHsKKwkJCXJlc3VsdCA9IHZhbGlkYXRlVXBkYXRlQ2FwYWJpbGl0eUluc3RhbmNlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgZGVmYXVsdFByb3BlcnRpZXMpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZVVwZGF0ZUNhcGFiaWxpdHlJbnN0YW5jZVByb3BlcnR5VmFsdWUoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eSwgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBkZWZhdWx0UHJvcGVydGllcykgeworCQlQcm9wZXJ0eURlZmluaXRpb24gZGVmYXVsdFByb3BlcnR5OworCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOworCQlFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCWlmIChkZWZhdWx0UHJvcGVydGllcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7CisJCQlkZWZhdWx0UHJvcGVydHkgPSBkZWZhdWx0UHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKKwkJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eS5nZXRUeXBlKCkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5nZXRUeXBlKCkuaXNFbXB0eSgpID8gZGVmYXVsdFByb3BlcnR5LmdldFR5cGUoKSA6IHByb3BlcnR5LmdldFR5cGUoKTsKKworCQkJU3RyaW5nIGlubmVyVHlwZSA9IG51bGw7CisJCQlpZiAocHJvcGVydHkuZ2V0U2NoZW1hKCkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpICE9IG51bGwpCisJCQkJaW5uZXJUeXBlID0gcHJvcGVydHkuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCk7CisJCQlpZiAoaW5uZXJUeXBlID09IG51bGwgJiYgZGVmYXVsdFByb3BlcnR5LmdldFNjaGVtYSgpICE9IG51bGwgJiYgZGVmYXVsdFByb3BlcnR5LmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkgIT0gbnVsbCkKKwkJCQlpbm5lclR5cGUgPSBkZWZhdWx0UHJvcGVydHkuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCk7CisKKwkJCWlmIChkZWZhdWx0UHJvcGVydHkuZ2V0VHlwZSgpLmVxdWFscyhwcm9wZXJ0eVR5cGUpKSB7CisJCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOworCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsRGF0YVR5cGVzID0gYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlLmdldEFsbCgpOworCQkJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbERhdGFUeXBlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBzdGF0dXNJcyB7fS4iLCBzdGF0dXMpOworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQkJCUVpdGhlcjxPYmplY3QsIEJvb2xlYW4+IHVwZGF0ZWRQcm9wZXJ0eVZhbHVlUmVzID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5VHlwZSwgcHJvcGVydHlWYWx1ZSwgaW5uZXJUeXBlLCBhbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCQlpZiAodXBkYXRlZFByb3BlcnR5VmFsdWVSZXMuaXNMZWZ0KCkpIHsKKwkJCQkJCWlmICh1cGRhdGVkUHJvcGVydHlWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKQorCQkJCQkJCXByb3BlcnR5LnNldERlZmF1bHRWYWx1ZSh1cGRhdGVkUHJvcGVydHlWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKS50b1N0cmluZygpKTsKKwkJCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFkpOworCQkJCQl9CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiVGhlIHByb3BlcnR5IHdpdGggbmFtZSB7fSBoYXMgaW52YWxpZCB0eXBlIHt9IG9yIGludmFsaWQgdmFsdWUge30uIiwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVR5cGUsIHByb3BlcnR5VmFsdWUpOworCisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5QUk9QRVJUWV9OQU1FX0FMUkVBRFlfRVhJU1RTKTsKKwkJCQlsb2cuZGVidWcoIlRoZSBwcm9wZXJ0eSB3aXRoIG5hbWUge30gYW5kIGRpZmZlcmVudCB0eXBlIGFscmVhZHkgZXhpc3RzLiIsIHByb3BlcnR5TmFtZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgcHJvcGVydHkgd2l0aCBuYW1lIHt9LiIsIHByb3BlcnR5TmFtZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiB2YWxpZGF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlIHVuaXF1ZW5lc3MKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHBhcmFtIGNhcGFiaWxpdHlJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0RXhpc3RlbmNlKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQpIHsKKwkJRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvcjsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ0FQQUJJTElUWV9JRC5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5SWQpOworCQlFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlJbnN0YW5jZUVkZ2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0T3V0Z29pbmdFZGdlQnlDcml0ZXJpYShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhFZGdlTGFiZWxzLkNBUEFCSUxJVFlfSU5TVCwgcHJvcHMpOworCQlpZiAoZ2V0Q2FwYWJpbGl0eUluc3RhbmNlRWRnZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yID0gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlRWRnZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoZXJyb3IuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBvdXRnb2luZyBlZGdlIGZvciByZXNvdXJjZSBpbnN0YW5jZSB7fSBzdGF0dXNJcyB7fS4iLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoZXJyb3IpOworCQkJfQorCQl9CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0RXhpc3RlbmNlKFRpdGFuVmVydGV4IGluc3RhbmNlVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkKSB7CisJCUVpdGhlcjxCb29sZWFuLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3I7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNBUEFCSUxJVFlfSUQuZ2V0UHJvcGVydHkoKSwgY2FwYWJpbGl0eUlkKTsKKwkJRWl0aGVyPEVkZ2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5SW5zdGFuY2VFZGdlUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE91dGdvaW5nRWRnZUJ5Q3JpdGVyaWEoaW5zdGFuY2VWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsIHByb3BzKTsKKwkJaWYgKGdldENhcGFiaWxpdHlJbnN0YW5jZUVkZ2VSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvciA9IGdldENhcGFiaWxpdHlJbnN0YW5jZUVkZ2VSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKGVycm9yLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgb3V0Z29pbmcgZWRnZSBmb3IgcmVzb3VyY2UgaW5zdGFuY2Uge30ge30ge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIHN0YXR1c0lzLCBlcnJvcik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJCX0KKwkJfQorCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Q2FwYWJpbGl0eUluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlT25HcmFwaChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBDYXBhYmlsaXR5RGF0YSBvdmVycmlkZUNhcGFiaWxpdHlEYXRhLCBDYXBhYmlsaXR5SW5zdERhdGEgY2FwYWJpbGl0eUluc3RhbmNlKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIGNyZWF0aW9uIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2Ugb2YgY2FwYWJpbGl0eSB7fSBmb3JSSSB7fS4iLCBvdmVycmlkZUNhcGFiaWxpdHlEYXRhLmdldFVuaXF1ZUlkKCksIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvblJlczsKKwkJQ2FwYWJpbGl0eUluc3REYXRhIGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UgPSBudWxsOworCQlTdHJpbmcgY2FwYWJpbGl0eUluc3RhbmNlSWQgPSBudWxsOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCUVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShjYXBhYmlsaXR5SW5zdGFuY2UsIENhcGFiaWxpdHlJbnN0RGF0YS5jbGFzcyk7CisJCWlmIChjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvciA9IGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoImZhaWxlZENyZWF0ZUNJIHt9IGZvclJJIHt9IHN0YXR1c0lzIHt9LiIsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGlvbiBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30gZm9yUkkge30gc3RhdHVzSXMge30uIiwgb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCWNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UgPSBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCQljYXBhYmlsaXR5SW5zdGFuY2VJZCA9IGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCksIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQlVbmlxdWVJZERhdGEgcmVzb3VyY2VJbnN0YW5jZUlkRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBhc3NvY2lhdGluZyByZXNvdXJjZSBpbnN0YW5jZSB7fSB0byBjYXBhYmlsaXR5IGluc3RhbmNlLiIsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQljcmVhdGVSZWxhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihyZXNvdXJjZUluc3RhbmNlSWREYXRhLCBjYXBhYmlsaXR5SW5zdGFuY2UsIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsIHByb3BzKTsKKwkJCWlmIChjcmVhdGVSZWxhdGlvblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvciA9IGNyZWF0ZVJlbGF0aW9uUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvdGlhdGUgcmVzb3VyY2UgaW5zdGFuY2Uge30gdG9DSSB7fSBzdGF0dXNJcyB7fS4iLCByZXNvdXJjZUluc3RhbmNlSWQsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBlcnJvcik7CisJCQl9CisJCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHJlc291cmNlIGluc3RhbmNlIHt9IHRvIENJIHt9IHN0YXR1c0lzIHt9LiIsIHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJCZWZvcmUgYXNzb2NpYXRpbmcgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB0b0NhcGFiaWxpdHkge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ0FQQUJJTElUWV9JRC5nZXRQcm9wZXJ0eSgpLCBvdmVycmlkZUNhcGFiaWxpdHlEYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJY3JlYXRlUmVsYXRpb25SZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZSwgb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOU1RBTkNFX09GLCBwcm9wcyk7CisJCQlpZiAoY3JlYXRlUmVsYXRpb25SZXMuaXNSaWdodCgpKSB7CisJCQkJZXJyb3IgPSBjcmVhdGVSZWxhdGlvblJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gdG9DYXBhYmlsaXR5IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBvdmVycmlkZUNhcGFiaWxpdHlEYXRhLmdldFVuaXF1ZUlkKCksIGVycm9yKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB0b0NhcGFiaWxpdHkgc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSwgZXJyb3IpOworCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlUmVzOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlT25HcmFwaChUaXRhblZlcnRleCByaVZlcnRleCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgVGl0YW5WZXJ0ZXggb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YVZlcnRleCwgQ2FwYWJpbGl0eUluc3REYXRhIGNhcGFiaWxpdHlJbnN0YW5jZSkgeworCQlTdHJpbmcgb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YUlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQlsb2cudHJhY2UoIkJlZm9yZSBjcmVhdGlvbiBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30ge30ge30iLCBvdmVycmlkZUNhcGFiaWxpdHlEYXRhVmVydGV4LCBmb3JSSSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvblJlczsKKwkJVGl0YW5WZXJ0ZXggY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZSA9IG51bGw7CisJCVN0cmluZyBjYXBhYmlsaXR5SW5zdGFuY2VJZCA9IG51bGw7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gbnVsbDsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoY2FwYWJpbGl0eUluc3RhbmNlKTsKKwkJaWYgKGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yID0gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30ge30ge30ge30ge30iLCBvdmVycmlkZUNhcGFiaWxpdHlEYXRhSWQsIGZvclJJLCByZXNvdXJjZUluc3RhbmNlSWQsIHN0YXR1c0lzLCBlcnJvcik7CisJCX0KKwkJbG9nLnRyYWNlKCJBZnRlciBjcmVhdGlvbiBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30ge30ge30ge30ge30iLCBvdmVycmlkZUNhcGFiaWxpdHlEYXRhSWQsIGZvclJJLCByZXNvdXJjZUluc3RhbmNlSWQsIHN0YXR1c0lzLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQljcmVhdGVkQ2FwYWJpbGl0eUluc3RhbmNlID0gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJY2FwYWJpbGl0eUluc3RhbmNlSWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoY3JlYXRlZENhcGFiaWxpdHlJbnN0YW5jZSwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ0FQQUJJTElUWV9JRC5nZXRQcm9wZXJ0eSgpLCBvdmVycmlkZUNhcGFiaWxpdHlEYXRhSWQpOworCQkJbG9nLmRlYnVnKCJCZWZvcmUgYXNzb2NpYXRpbmcgcmVzb3VyY2UgaW5zdGFuY2Uge30gdG8gY2FwYWJpbGl0eSBpbnN0YW5jZS4iLCByZXNvdXJjZUluc3RhbmNlSWQpOworCisJCQljcmVhdGVSZWxhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKHJpVmVydGV4LCBjYXBhYmlsaXR5SW5zdGFuY2UsIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsIHByb3BzKTsKKwkJCWlmICghY3JlYXRlUmVsYXRpb25SZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWVycm9yID0gY3JlYXRlUmVsYXRpb25SZXM7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb3RpYXRlIHJlc291cmNlIGluc3RhbmNlIHt9IHt9IHt9IHt9IHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCB0b0NJLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJCWxvZy50cmFjZSgiQWZ0ZXIgYXNzb2NpYXRpbmcgcmVzb3VyY2UgaW5zdGFuY2Uge30ge30ge30ge30ge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIHRvQ0ksIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBzdGF0dXNJcywgZXJyb3IpOworCQkJfQorCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cudHJhY2UoIkJlZm9yZSBhc3NvY2lhdGluZyBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHt9IHt9IiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIHRvQ2FwYWJpbGl0eSwgb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YUlkKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCksIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFJZCk7CisJCQljcmVhdGVSZWxhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKGNyZWF0ZWRDYXBhYmlsaXR5SW5zdGFuY2UsIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscy5JTlNUQU5DRV9PRiwgcHJvcHMpOworCQkJaWYgKCFjcmVhdGVSZWxhdGlvblJlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJZXJyb3IgPSBjcmVhdGVSZWxhdGlvblJlczsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvY2lhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSB7fSB7fSIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCB0b0NhcGFiaWxpdHksIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFJZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSB7fSB7fSIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCB0b0NhcGFiaWxpdHksIG92ZXJyaWRlQ2FwYWJpbGl0eURhdGFJZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZVJlczsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwl9CisKKwlwcml2YXRlIENhcGFiaWxpdHlJbnN0RGF0YSBidWlsZENhcGFiaWxpdHlJbnN0YW5jZURhdGEoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eSkgeworCQlDYXBhYmlsaXR5SW5zdERhdGEgY2FwYWJpbGl0eUluc3RhbmNlID0gbmV3IENhcGFiaWxpdHlJbnN0RGF0YSgpOworCQlMb25nIGNyZWF0aW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRDYXBhYmlsaXR5SW5zdGFuY2VVaWQocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5LmdldE5hbWUoKSk7CisKKwkJY2FwYWJpbGl0eUluc3RhbmNlLnNldENyZWF0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQljYXBhYmlsaXR5SW5zdGFuY2Uuc2V0TW9kaWZpY2F0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQljYXBhYmlsaXR5SW5zdGFuY2Uuc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCisJCXJldHVybiBjYXBhYmlsaXR5SW5zdGFuY2U7CisJfQorCisJLyoqCisJICogZGVsZXRlIGNhcGFiaWxpdHkgaW5zdGFuY2UgZnJvbSByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUluc3RhbmNlSWQKKwkgKiBAcmV0dXJuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDYXBhYmlsaXR5SW5zdGFuY2VGcm9tUmVzb3VyY2VJbnN0YW5jZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUluc3RhbmNlSWQpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZGVsZXRpbmcgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSBmcm9tUkkge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJRWl0aGVyPENhcGFiaWxpdHlJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNhcGFiaWxpdHlJbnN0UmVzID0gbnVsbDsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnlWYWx1ZXNSZXMgPSBkZWxldGVBbGxQcm9wZXJ0eVZhbHVlc09mQ2FwYWJpbGl0eUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUluc3RhbmNlSWQpOworCQlpZiAoZGVsZXRlUHJvcGVyeVZhbHVlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yID0gZGVsZXRlUHJvcGVyeVZhbHVlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoImZhaWxlZERlbGV0ZVByb3BlcnR5VmFsdWVzIHt9IGZvciBSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0KKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCWRlbGV0ZUNhcGFiaWxpdHlJbnN0UmVzID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlJbnN0KSwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIENhcGFiaWxpdHlJbnN0RGF0YS5jbGFzcyk7CisJCQlpZiAoZGVsZXRlQ2FwYWJpbGl0eUluc3RSZXMuaXNSaWdodCgpKSB7CisJCQkJZXJyb3IgPSBkZWxldGVDYXBhYmlsaXR5SW5zdFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gZm9yUkkge30gc3RhdHVzSXMge30iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCQl9CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IGZyb21SSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZGVsZXRlQ2FwYWJpbGl0eUluc3RSZXMubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxQcm9wZXJ0eVZhbHVlc09mQ2FwYWJpbGl0eUluc3RhbmNlKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SW5zdGFuY2VJZCkgeworCQlsb2cuZGVidWcoIkJlZm9yZSBkZWxldGluZyBhbGwgcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gZnJvbVJJIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gZGVsZXRlUHJvcGVydGllc1BhaXJzOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFByb3BlcnR5VmFsdWVzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlJbnN0KSwgY2FwYWJpbGl0eUluc3RhbmNlSWQsCisJCQkJR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFLCBOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSwgUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCQlpZiAoZ2V0UHJvcGVydHlWYWx1ZXNSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvciA9IGdldFByb3BlcnR5VmFsdWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IGZvclJJIHt9IHN0YXR1cyB7fS4iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0KKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCWRlbGV0ZVByb3BlcnRpZXNQYWlycyA9IGdldFByb3BlcnR5VmFsdWVzUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJZm9yIChJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5UGFpciA6IGRlbGV0ZVByb3BlcnRpZXNQYWlycykgeworCQkJCUVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnR5UmVzID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUocHJvcGVydHlQYWlyLmdldExlZnQoKSwgUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCQkJCWlmIChkZWxldGVQcm9wZXJ0eVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJZXJyb3IgPSBkZWxldGVQcm9wZXJ0eVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkRGVsZXRlUHJvcGVydHlWYWx1ZXMge30gZm9yUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBhbGwgcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gZnJvbVJJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwl9CisKKwkvKioKKwkgKiBnZXQgYWxsIGNhcGFiaWxpdHkgaW5zdGFuY2VzIGZvciByZXNvdXJjZSBpbnN0YW5jZSByZXR1cm5zIGFsbCBDYXBhYmlsaXR5IEluc3RhbmNlcyByZWxhdGVkIHRvIFJlc291cmNlIEluc3RhbmNlIGFzIExpc3Q8Q2FwYWJpbGl0eUluc3REYXRhPiBvciBUaXRhbk9wZXJhdGlvblN0YXR1cyBpZiBlcnJvciBvY2N1cnMgb3IgaWYgUmVzb3VyY2UgSW5zdGFuY2UgaGF2ZSBubyBhbnkgcmVsYXRlZCBDYXBhYmlsaXR5CisJICogSW5zdGFuY2UKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHJldHVybiBFaXRoZXI8TGlzdDxDYXBhYmlsaXR5SW5zdERhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ2FwYWJpbGl0eUluc3RhbmNlc09mUmVzb3VyY2VJbnN0YW5jZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIGRlbGV0aW5nIGFsbCBjYXBhYmlsaXR5IGluc3RhbmNlcyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4iLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlJbnN0YW5jZXNSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWV9JTlNULCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eUluc3QsIENhcGFiaWxpdHlJbnN0RGF0YS5jbGFzcyk7CisJCWlmIChnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3IgPSBnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdHkgSW5zdGFuY2VzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9IHN0YXR1c0lzIHt9LiIsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgYWxsIGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9IHN0YXR1c0lzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1JlczsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwl9CisKKwkvKioKKwkgKiBnZXQgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiBjYXBhYmlsaXR5IGZvciByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUlkCisJICogQHJldHVybgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eUluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlT2ZDYXBhYmlsaXR5T2ZSZXNvdXJjZUluc3RhbmNlKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCksIGNhcGFiaWxpdHlJZCk7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlJbnN0YW5jZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZEJ5RWRnZUNyaXRlcmlhKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgcmVzb3VyY2VJbnN0YW5jZUlkLAorCQkJCUdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsIE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5SW5zdCwgQ2FwYWJpbGl0eUluc3REYXRhLmNsYXNzLCBwcm9wcyk7CisJCWlmIChnZXRDYXBhYmlsaXR5SW5zdGFuY2VSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvciA9IGdldENhcGFiaWxpdHlJbnN0YW5jZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBjYXBhYmlsaXR5IEluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZ2V0Q2FwYWJpbGl0eUluc3RhbmNlUmVzLmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJLyoqCisJICogdXBkYXRlIGNhcGFiaWxpdHkgcHJvcGVydHkgdmFsdWVzCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcworCSAqIEBwYXJhbSBjYXBhYmlsaXR5SWQKKwkgKiBAcmV0dXJuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFByb3BlcnR5VmFsdWVEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNhcGFiaWxpdHlQcm9wZXJ0eVZhbHVlcyhTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgY2FwYWJpbGl0eUlkLCBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnR5VmFsdWVzKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIHVwZGF0aW5nIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IHt9IG9mUkkge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCUNhcGFiaWxpdHlJbnN0RGF0YSBjYXBhYmlsaXR5SW5zdGFuY2UgPSBudWxsOworCQlTdHJpbmcgY2FwYWJpbGl0eUluc3RhbmNlSWQgPSBudWxsOworCQlFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnlWYWx1ZXNSZXM7CisKKwkJQ2FwYWJpbGl0eURhdGEgb3ZlcnJpZGVDYXBhYmlsaXR5RGF0YTsKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gb3ZlcnJpZGVDYXBhYmlsaXR5RGVmaW5pdGlvbjsKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBkZWZhdWx0UHJvcGVydGllcyA9IG51bGw7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eURhdGFSZXMgPSBudWxsOworCQlFaXRoZXI8TGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVZhbHVlc1JlcyA9IG51bGw7CisJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlEZWZpbml0aW9uUmVzID0gbnVsbDsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBnZXR0aW5nIGFsbCBjYXBhYmlsaXR5IGluc3RhbmNlcyBvZiBSSSB7fS4iLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCksIGNhcGFiaWxpdHlJZCk7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlJbnN0YW5jZXNSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRCeUVkZ2VDcml0ZXJpYShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWV9JTlNULCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eUluc3QsIENhcGFiaWxpdHlJbnN0RGF0YS5jbGFzcywgcHJvcHMpOworCQlpZiAoZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yID0gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBjYXBhYmlsaXR5IEluc3RhbmNlcyBvZiBjYXBhYmlsaXR5IHt9IG9mUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIGdldHRpbmcgYWxsIGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mUkkge30gc3RhdHVzSXMge30uIiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBkZWxldGluZyBhbGwgY2FwYWJpbGl0eSBpbnN0YW5jZXMgb2ZSSSB7fS4iLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJY2FwYWJpbGl0eUluc3RhbmNlID0gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5sZWZ0KCkudmFsdWUoKS5nZXRMZWZ0KCk7CisJCQljYXBhYmlsaXR5SW5zdGFuY2VJZCA9IGNhcGFiaWxpdHlJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCQkJZGVsZXRlUHJvcGVyeVZhbHVlc1JlcyA9IGRlbGV0ZUFsbFByb3BlcnR5VmFsdWVzT2ZDYXBhYmlsaXR5SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCk7CisJCQlpZiAoZGVsZXRlUHJvcGVyeVZhbHVlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvciA9IGRlbGV0ZVByb3BlcnlWYWx1ZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkRGVsZXRlUHJvcGVydHlWYWx1ZXMge30gZm9yUkkge30gc3RhdHVzSXMge30iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBzdGF0dXNJcywgZXJyb3IpOworCQkJfQorCQkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBhbGwgY2FwYWJpbGl0eSBpbnN0YW5jZXMgb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJCZWZvcmUgZ2V0dGluZyBjYXBhYmlsaXR5IHt9IG9mUkkge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJZ2V0Q2FwYWJpbGl0eURhdGFSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLCByZXNvdXJjZUluc3RhbmNlSWQsIEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX0NBUEFCSUxJVFksIE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5LCBDYXBhYmlsaXR5RGF0YS5jbGFzcyk7CisJCQlpZiAoZ2V0Q2FwYWJpbGl0eURhdGFSZXMuaXNSaWdodCgpKSB7CisJCQkJZXJyb3IgPSBnZXRDYXBhYmlsaXR5RGF0YVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGNhcGFiaWxpdHkge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQkJfQorCQkJbG9nLmRlYnVnKCJBZnRlciBnZXR0aW5nIGNhcGFiaWxpdHkge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBnZXR0aW5nIGNhcGFiaWxpdHkgZGVmaW5pdGlvbiBmb3IgY2FwYWJpbGl0eSB7fSBvZlJJIHt9LiIsIGNhcGFiaWxpdHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCW92ZXJyaWRlQ2FwYWJpbGl0eURhdGEgPSBnZXRDYXBhYmlsaXR5RGF0YVJlcy5sZWZ0KCkudmFsdWUoKS5nZXRMZWZ0KCk7CisJCQlnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlcyA9IGNhcGFiaWxpdHlPcGVyYXRpb24uZ2V0Q2FwYWJpbGl0eUJ5Q2FwYWJpbGl0eURhdGEob3ZlcnJpZGVDYXBhYmlsaXR5RGF0YSk7CisJCQlpZiAoZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMuaXNSaWdodCgpKSB7CisJCQkJZXJyb3IgPSBnZXRDYXBhYmlsaXR5RGVmaW5pdGlvblJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgY2FwYWJpbGl0eSB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9IiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZ2V0dGluZyBjYXBhYmlsaXR5IGRlZmluaXRpb24gZm9yIGNhcGFiaWxpdHkge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkJlZm9yZSB2YWxpZGF0aW5nIGNhcGFiaWxpdHkgcHJvcGVydGllcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IG9mUkkge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQlvdmVycmlkZUNhcGFiaWxpdHlEZWZpbml0aW9uID0gZ2V0Q2FwYWJpbGl0eURlZmluaXRpb25SZXMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAob3ZlcnJpZGVDYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCkgeworCQkJCWRlZmF1bHRQcm9wZXJ0aWVzID0gb3ZlcnJpZGVDYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRQcm9wZXJ0aWVzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKFByb3BlcnR5RGVmaW5pdGlvbjo6Z2V0TmFtZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOworCQkJfQorCQkJRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSB2YWxpZGF0ZUNhcGFiaWxpdHlJbnN0YW5jZVByb3BlcnRpZXMoZGVmYXVsdFByb3BlcnRpZXMsIHByb3BlcnR5VmFsdWVzKTsKKwkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJZXJyb3IgPSByZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkQWRkUHJvcGVydGllcyB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgdmFsaWRhdGluZyBjYXBhYmlsaXR5IHByb3BlcnRpZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSBvZiBSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0KKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZXMgdG9DSSB7fSBvZlJJIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJYWRkUHJvcGVydHlWYWx1ZXNSZXMgPSBhZGRQcm9wZXJ0eVZhbHVlc1RvQ2FwYWJpbGl0eUluc3RhbmNlKGNhcGFiaWxpdHlJbnN0YW5jZSwgcHJvcGVydHlWYWx1ZXMsIGRlZmF1bHRQcm9wZXJ0aWVzKTsKKwkJCWlmIChhZGRQcm9wZXJ0eVZhbHVlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvciA9IGFkZFByb3BlcnR5VmFsdWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZEFkZFByb3BlcnRpZXMge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCQl9CisJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgcHJvcGVydHkgdmFsdWVzIHRvQ0kge30gb2ZSSSB7fS4iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIHVwZGF0aW5nIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IHt9IG9mUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBhZGRQcm9wZXJ0eVZhbHVlc1JlczsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwl9CisKKwkvKioKKwkgKiBjbG9uZSBhbmQgYXNzb2NpYXRlIGNhcGFiaWxpdHkgaW5zdGFuY2Ugd2l0aCBwcm9wZXJ0eSB2YWx1ZXMKKwkgKiAKKwkgKiBAcGFyYW0gY3JlYXRlZENvbXBvbmVudEluc3RhbmNlCisJICogQHBhcmFtIGNhcGFiaWxpdHkKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUluc3RQYWlyCisJICogQHJldHVybgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNsb25lQXNzb2NpYXRlQ2FwYWJpbGl0eUluc3RhbmNlV2l0aFByb3BlcnR5VmFsdWVzKENvbXBvbmVudEluc3RhbmNlRGF0YSBjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2UsIENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHksCisJCQlJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiBjYXBhYmlsaXR5SW5zdFBhaXIpIHsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCVN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkID0gY3JlYXRlZENvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCk7CisJCVN0cmluZyBjYXBhYmlsaXR5SW5zdGFuY2VJZCA9IGNhcGFiaWxpdHlJbnN0UGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBjbG9uaW5nIGNhcGFiaWxpdHkgaW5zdGFuY2Ugd2l0aCBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSBvZlJJIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBjb21wb25lbnRJbnN0YW5jZUlkKTsKKwkJTGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+PiBwcm9wZXJ0eVZhbHVlUGFpcnM7CisJCUxpc3Q8UHJvcGVydHlWYWx1ZURhdGE+IG5ld1Byb3BlcnR5VmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUNhcGFiaWxpdHlJbnN0RGF0YSBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZSA9IG51bGw7CisJCUVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGVSZXMgPSBudWxsOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGdldHRpbmcgYWxsIHByb3BlcnR5IHZhbHVlcyBvZkNJIHt9IG9mUkkge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIGNvbXBvbmVudEluc3RhbmNlSWQpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFByb3BlcnR5VmFsdWVzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlJbnN0KSwgY2FwYWJpbGl0eUluc3RQYWlyLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpLAorCQkJCUdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9WQUxVRSwgTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJaWYgKGdldFByb3BlcnR5VmFsdWVzUmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3IgPSBnZXRQcm9wZXJ0eVZhbHVlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSBvZkNJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJbnN0UGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50SW5zdGFuY2VJZCAsZXJyb3IpOworCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgZ2V0dGluZyBhbGwgcHJvcGVydHkgdmFsdWVzIG9mQ0kge30gb2ZSSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgY29tcG9uZW50SW5zdGFuY2VJZCwgZXJyb3IpOworCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJQ2FwYWJpbGl0eUluc3REYXRhIGNsb25lQ2FwYWJpbGl0eUluc3QgPSBidWlsZENhcGFiaWxpdHlJbnN0YW5jZURhdGEoY29tcG9uZW50SW5zdGFuY2VJZCwgY2FwYWJpbGl0eSk7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyBjYXBhYmlsaXR5IGluc3RhbmNlIG5vZGUge30gb25HcmFwaC4iLCBjbG9uZUNhcGFiaWxpdHlJbnN0LmdldFVuaXF1ZUlkKCkpOworCQkJY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2VOb2RlUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoY2xvbmVDYXBhYmlsaXR5SW5zdCwgQ2FwYWJpbGl0eUluc3REYXRhLmNsYXNzKTsKKwkJCWlmIChjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGVSZXMuaXNSaWdodCgpKSB7CisJCQkJZXJyb3IgPSBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30gb2ZDSSB7fSBzdGF0dXNJcyB7fS4iLCBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCksIGNvbXBvbmVudEluc3RhbmNlSWQsIGVycm9yKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbmcgY2FwYWJpbGl0eSBpbnN0YW5jZSBub2RlIHt9IG9uR3JhcGguIHN0YXR1c0lzIHt9IiwgY2xvbmVDYXBhYmlsaXR5SW5zdC5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCX0KKworCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHRvQ2FwYWJpbGl0eSB7fSBvbkdyYXBoLiIsIGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlTm9kZVJlcy5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpLCBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCkpOworCQkJY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UgPSBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGVSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YSA9IGJ1aWxkQ2FwYWJpbGl0eURhdGEoY2FwYWJpbGl0eSk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ0FQQUJJTElUWV9JRC5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb25SZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UsIGNhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuSU5TVEFOQ0VfT0YsIHByb3BzKTsKKwkJCWlmIChjcmVhdGVSZWxhdGlvblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvciA9IGNyZWF0ZVJlbGF0aW9uUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvY2lhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB0b0NhcGFiaWxpdHkge30gc3RhdHVzSXMge30uIiwgY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgY2FwYWJpbGl0eS5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCQl9CisJCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW5nIHJlbGF0aW9uIGZyb20gY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB0b0NhcGFiaWxpdHkge30gb25HcmFwaC4gc3RhdHVzSXMge30uIiwgY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2VOb2RlUmVzLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCksIGNhcGFiaWxpdHkuZ2V0VW5pcXVlSWQoKSwgZXJyb3IpOworCQl9CisKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIGNsb25pbmcgcHJvcGVydHkgdmFsdWVzIG9mQ0kge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQpOworCQkJcHJvcGVydHlWYWx1ZVBhaXJzID0gZ2V0UHJvcGVydHlWYWx1ZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4gcHJvcGVydHlWYWx1ZVBhaXIgOiBwcm9wZXJ0eVZhbHVlUGFpcnMpIHsKKwkJCQlFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjbG9uZVByb3BlcnR5VmFsdWVSZXMgPSBjbG9uZUFzc29jaWF0ZVByb3BlcnR5VmFsdWUoY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UsIHByb3BlcnR5VmFsdWVQYWlyKTsKKwkJCQlpZiAoY2xvbmVQcm9wZXJ0eVZhbHVlUmVzLmlzUmlnaHQoKSkgeworCQkJCQllcnJvciA9IGNsb25lUHJvcGVydHlWYWx1ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY2xvbmUgcHJvcGVydHkgdmFsdWUge30gb2ZDYXBhYmlsaXR5IHt9IG9mQ0kge30uIHN0YXR1c0lzIHt9LiIsIHByb3BlcnR5VmFsdWVQYWlyLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpLCBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCksIGNvbXBvbmVudEluc3RhbmNlSWQsIGVycm9yKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQluZXdQcm9wZXJ0eVZhbHVlcy5hZGQoY2xvbmVQcm9wZXJ0eVZhbHVlUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCQlsb2cuZGVidWcoIkFmdGVyIGNsb25pbmcgcHJvcGVydHkgdmFsdWVzIG9mIENJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBjbG9uaW5nIGNhcGFiaWxpdHkgaW5zdGFuY2Ugd2l0aCBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSBvZlJJIHt9IHN0YXR1c0lzIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBjb21wb25lbnRJbnN0YW5jZUlkLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4oY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UsIG5ld1Byb3BlcnR5VmFsdWVzKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJcHVibGljIEVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNsb25lQXNzb2NpYXRlQ2FwYWJpbGl0eUluc3RhbmNlV2l0aFByb3BlcnR5VmFsdWVzKFRpdGFuVmVydGV4IGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5LCBJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiBjYXBhYmlsaXR5SW5zdFBhaXIpIHsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCVN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJU3RyaW5nIGNhcGFiaWxpdHlJbnN0YW5jZUlkID0gY2FwYWJpbGl0eUluc3RQYWlyLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpOworCisJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJbG9nLnRyYWNlKCJCZWZvcmUgY2xvbmluZyBjYXBhYmlsaXR5IGluc3RhbmNlIHdpdGggcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30ge30ge30iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgb2ZSSSwgY29tcG9uZW50SW5zdGFuY2VJZCk7CisJCX0KKwkJTGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPj4gcHJvcGVydHlWYWx1ZVBhaXJzOworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGVSZXMgPSBudWxsOworCisJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJbG9nLnRyYWNlKCJCZWZvcmUgZ2V0dGluZyBhbGwgcHJvcGVydHkgdmFsdWVzIHt9IHt9IHt9IHt9Iiwgb2ZDSSwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIG9mUkksIGNvbXBvbmVudEluc3RhbmNlSWQpOworCQl9CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8VGl0YW5WZXJ0ZXgsIEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFByb3BlcnR5VmFsdWVzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuVmVydGVjaWVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5SW5zdCksIGNhcGFiaWxpdHlJbnN0UGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfVkFMVUUpOworCQlpZiAoZ2V0UHJvcGVydHlWYWx1ZXNSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvciA9IGdldFByb3BlcnR5VmFsdWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHt9IHt9IHt9IHt9IiwgY2FwYWJpbGl0eUluc3RQYWlyLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpLCBvZkNJLCBjb21wb25lbnRJbnN0YW5jZUlkLCBzdGF0dXNJcywgZXJyb3IpOworCQkJfQorCQl9CisJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJbG9nLnRyYWNlKCJBZnRlciBnZXR0aW5nIGFsbCBwcm9wZXJ0eSB2YWx1ZXMge30ge30ge30ge30ge30ge30iLCBvZkNJLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgb2ZSSSwgY29tcG9uZW50SW5zdGFuY2VJZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJQ2FwYWJpbGl0eUluc3REYXRhIGNsb25lQ2FwYWJpbGl0eUluc3QgPSBidWlsZENhcGFiaWxpdHlJbnN0YW5jZURhdGEoY29tcG9uZW50SW5zdGFuY2VJZCwgY2FwYWJpbGl0eSk7CisJCQlsb2cudHJhY2UoIkJlZm9yZSBjcmVhdGluZyBjYXBhYmlsaXR5IGluc3RhbmNlIG5vZGUge30ge30gIiwgY2xvbmVDYXBhYmlsaXR5SW5zdC5nZXRVbmlxdWVJZCgpLCBvbkdyYXBoKTsKKwkJCWNsb25lQ2FwYWJpbGl0eUluc3RhbmNlTm9kZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKGNsb25lQ2FwYWJpbGl0eUluc3QpOworCQkJaWYgKGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlTm9kZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvciA9IGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlTm9kZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIGNhcGFiaWxpdHkge30ge30ge30ge30ge30iLCBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCksIG9mQ0ksIGNvbXBvbmVudEluc3RhbmNlSWQsIHN0YXR1c0lzLCBlcnJvcik7CisJCQkJfQorCQkJfQorCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJbG9nLnRyYWNlKCJBZnRlciBjcmVhdGluZyBjYXBhYmlsaXR5IGluc3RhbmNlIG5vZGUge30ge30ge30ge30iLCBjbG9uZUNhcGFiaWxpdHlJbnN0LmdldFVuaXF1ZUlkKCksIG9uR3JhcGgsIHN0YXR1c0lzLCBlcnJvcik7CisJCQl9CisJCX0KKwkJQ2FwYWJpbGl0eURhdGEgY2FwYWJpbGl0eURhdGE7CisJCVRpdGFuVmVydGV4IGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlID0gbnVsbDsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJCWxvZy50cmFjZSgiQmVmb3JlIGNyZWF0aW5nIHJlbGF0aW9uIGZyb20gY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSB7fSIsIGNhcGFiaWxpdHkuZ2V0VW5pcXVlSWQoKSwgdG9DYXBhYmlsaXR5LCBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCksIG9uR3JhcGgpOworCQkJfQorCQkJY2FwYWJpbGl0eURhdGEgPSBidWlsZENhcGFiaWxpdHlEYXRhKGNhcGFiaWxpdHkpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNBUEFCSUxJVFlfSUQuZ2V0UHJvcGVydHkoKSwgY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQljbG9uZUNhcGFiaWxpdHlJbnN0YW5jZSA9IGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlTm9kZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVJlbGF0aW9uUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZUVkZ2UoY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UsIGNhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuSU5TVEFOQ0VfT0YsIHByb3BzKTsKKwkJCWlmICghY3JlYXRlUmVsYXRpb25SZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWVycm9yID0gY3JlYXRlUmVsYXRpb25SZXM7CisJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHt9IHt9IHt9IHt9IiwgY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSwgdG9DYXBhYmlsaXR5LCBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCksIHN0YXR1c0lzLCBjcmVhdGVSZWxhdGlvblJlcyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJbG9nLnRyYWNlKCJBZnRlciBjcmVhdGluZyByZWxhdGlvbiBmcm9tIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30ge30ge30ge30ge30ge30iLCBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpLCB0b0NhcGFiaWxpdHksIGNhcGFiaWxpdHkuZ2V0VW5pcXVlSWQoKSwgb25HcmFwaCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJfQorCisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlsb2cudHJhY2UoIkJlZm9yZSBjbG9uaW5nIHByb3BlcnR5IHZhbHVlcyB7fSB7fSAiLCBvZkNJLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCk7CisJCQlwcm9wZXJ0eVZhbHVlUGFpcnMgPSBnZXRQcm9wZXJ0eVZhbHVlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4gcHJvcGVydHlWYWx1ZVBhaXIgOiBwcm9wZXJ0eVZhbHVlUGFpcnMpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjbG9uZVByb3BlcnR5VmFsdWVSZXMgPSBjbG9uZUFzc29jaWF0ZVByb3BlcnR5VmFsdWUoY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UsIHByb3BlcnR5VmFsdWVQYWlyKTsKKwkJCQlpZiAoIWNsb25lUHJvcGVydHlWYWx1ZVJlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWVycm9yID0gY2xvbmVQcm9wZXJ0eVZhbHVlUmVzOworCQkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNsb25lIHByb3BlcnR5IHZhbHVlICBvZiBjYXBhYmlsaXR5IHt9IHt9IHt9IHt9IHt9IiwgY2FwYWJpbGl0eS5nZXRVbmlxdWVJZCgpLCBvZkNJLCBjb21wb25lbnRJbnN0YW5jZUlkLCBzdGF0dXNJcywgZXJyb3IpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgY2xvbmluZyBwcm9wZXJ0eSB2YWx1ZXMge30ge30ge30ge30iLCBvZkNJLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIGNsb25pbmcgY2FwYWJpbGl0eSBpbnN0YW5jZSB3aXRoIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IG9mUkkge30gc3RhdHVzSXMge30uIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIGNvbXBvbmVudEluc3RhbmNlSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJcHJpdmF0ZSBDYXBhYmlsaXR5RGF0YSBidWlsZENhcGFiaWxpdHlEYXRhKENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHkpIHsKKwkJQ2FwYWJpbGl0eURhdGEgY2FwYWJpbGl0eURhdGEgPSBuZXcgQ2FwYWJpbGl0eURhdGEoKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0VW5pcXVlSWQoY2FwYWJpbGl0eS5nZXRVbmlxdWVJZCgpKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0RGVzY3JpcHRpb24oY2FwYWJpbGl0eS5nZXREZXNjcmlwdGlvbigpKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0VHlwZShjYXBhYmlsaXR5LmdldFR5cGUoKSk7CisJCWNhcGFiaWxpdHlEYXRhLnNldE1heE9jY3VycmVuY2VzKGNhcGFiaWxpdHkuZ2V0TWF4T2NjdXJyZW5jZXMoKSk7CisJCWNhcGFiaWxpdHlEYXRhLnNldE1pbk9jY3VycmVuY2VzKGNhcGFiaWxpdHkuZ2V0TWluT2NjdXJyZW5jZXMoKSk7CisJCUxpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzID0gY2FwYWJpbGl0eS5nZXRWYWxpZFNvdXJjZVR5cGVzKCk7CisJCWlmICh2YWxpZFNvdXJjZVR5cGVzICE9IG51bGwpIHsKKwkJCWNhcGFiaWxpdHlEYXRhLnNldFZhbGlkU291cmNlVHlwZXModmFsaWRTb3VyY2VUeXBlcyk7CisJCX0KKwkJcmV0dXJuIGNhcGFiaWxpdHlEYXRhOworCX0KKworCXByaXZhdGUgRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2xvbmVBc3NvY2lhdGVQcm9wZXJ0eVZhbHVlKENhcGFiaWxpdHlJbnN0RGF0YSBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZSwgSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPiBwcm9wZXJ0eVZhbHVlUGFpcikgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCVN0cmluZyBwcm9wZXJ0eVZhbHVlSUQgPSBwcm9wZXJ0eVZhbHVlUGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKTsKKwkJU3RyaW5nIGNhcGFiaWxpdHlJbnN0YW5jZUlkID0gY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKTsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgY2xvbmluZyBwcm9wZXJ0eSB2YWx1ZXMge30gb2ZDSSB7fS4iLCBwcm9wZXJ0eVZhbHVlSUQsIGNhcGFiaWxpdHlJbnN0YW5jZUlkKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gcHJvcGVydHlWYWx1ZVBhaXIuZ2V0UmlnaHQoKS5nZXRQcm9wZXJ0aWVzKCk7CisJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBuZXcgUHJvcGVydHlEYXRhKCk7CisJCVN0cmluZyBwcm9wZXJ0eUlkID0gKFN0cmluZykgcHJvcHMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVFlfSUQubmFtZSgpKTsKKwkJcHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChwcm9wZXJ0eUlkKTsKKworCQlQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlID0gYnVpbGRQcm9wZXJ0eVZhbHVlRGF0YSgoU3RyaW5nKSBwcm9wcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUWV9OQU1FLm5hbWUoKSksIHByb3BlcnR5VmFsdWVQYWlyLmdldExlZnQoKS5nZXRUeXBlKCksIHByb3BlcnR5VmFsdWVQYWlyLmdldExlZnQoKS5nZXRWYWx1ZSgpLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCk7CisJCVByb3BlcnR5VmFsdWVEYXRhIGNyZWF0ZWRWYWx1ZSA9IG51bGw7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb25SZXM7CisKKwkJbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgcHJvcGVydHkgdmFsdWVzIG5vZGUge30gb25HcmFwaC4iLCBwcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCkpOworCQlFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVWYWx1ZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHByb3BlcnR5VmFsdWUsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJaWYgKGNyZWF0ZVZhbHVlUmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3IgPSBjcmVhdGVWYWx1ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcHJvcGVydHkgdmFsdWUgZm9yIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gb2ZSSS4gc3RhdHVzSXMge30uIiwgY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgZXJyb3IpOworCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbmcgcHJvcGVydHkgdmFsdWVzIG5vZGUge30gb25HcmFwaC4gc3RhdHVzSXMge30uIiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQljcmVhdGVkVmFsdWUgPSBjcmVhdGVWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIGNyZWF0aW5nIHJlbGF0aW9uIGZyb20gY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB0b1ZhbHVlIHt9LiIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCBjcmVhdGVkVmFsdWUuZ2V0VW5pcXVlSWQoKSk7CisJCQljcmVhdGVSZWxhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZSwgY3JlYXRlZFZhbHVlLCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfVkFMVUUsIHByb3BzKTsKKwkJCWlmIChjcmVhdGVSZWxhdGlvblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQllcnJvciA9IGNyZWF0ZVJlbGF0aW9uUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcmVsYXRpb24gZnJvbSBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHRvVmFsdWUge30gc3RhdHVzSXMge30uIiwgY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgY3JlYXRlZFZhbHVlLmdldFVuaXF1ZUlkKCksIGVycm9yKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHRvVmFsdWUge30gc3RhdHVzSXMge30iLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgY3JlYXRlZFZhbHVlLmdldFVuaXF1ZUlkKCksIGVycm9yKTsKKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSB7fSB0b1Byb3BlcnR5IHt9LiIsIGNyZWF0ZWRWYWx1ZSwgcHJvcGVydHlEYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJY3JlYXRlUmVsYXRpb25SZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY3JlYXRlZFZhbHVlLCBwcm9wZXJ0eURhdGEsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCBwcm9wcyk7CisJCQlpZiAoY3JlYXRlUmVsYXRpb25SZXMuaXNSaWdodCgpKSB7CisJCQkJZXJyb3IgPSBjcmVhdGVSZWxhdGlvblJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIHJlbGF0aW9uIGZyb20gcHJvcGVydHkgdmFsdWUge30gdG9Qcm9wZXJ0eSB7fSBzdGF0dXNJcyB7fS4iLCBjcmVhdGVkVmFsdWUuZ2V0VW5pcXVlSWQoKSwgcHJvcGVydHlJZCwgZXJyb3IpOworCQkJfQorCQkJbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSB7fSB0b1Byb3BlcnR5IHt9IHN0YXR1c0lzIHt9LiIsIGNyZWF0ZWRWYWx1ZSwgcHJvcGVydHlEYXRhLmdldFVuaXF1ZUlkKCksIGVycm9yKTsKKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIGNsb25pbmcgcHJvcGVydHkgdmFsdWVzIHt9IG9mQ0kge30gc3RhdHVzSXMge30uIiwgcHJvcGVydHlWYWx1ZUlELCBjYXBhYmlsaXR5SW5zdGFuY2VJZCwgZXJyb3IpOworCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNyZWF0ZWRWYWx1ZSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBjbG9uZUFzc29jaWF0ZVByb3BlcnR5VmFsdWUoVGl0YW5WZXJ0ZXggY2FwYWJpbGl0eUluc3RhbmNlVmVydGV4LCBJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPiBwcm9wZXJ0eVZhbHVlUGFpcikgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCVRpdGFuVmVydGV4IHByb3BlcnR5VmVydGV4ID0gcHJvcGVydHlWYWx1ZVBhaXIuZ2V0TGVmdCgpOworCQlTdHJpbmcgcHJvcGVydHlWYWx1ZUlEID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KHByb3BlcnR5VmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJU3RyaW5nIGNhcGFiaWxpdHlJbnN0YW5jZUlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGNhcGFiaWxpdHlJbnN0YW5jZVZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJbG9nLnRyYWNlKCJCZWZvcmUgY2xvbmluZyBwcm9wZXJ0eSB2YWx1ZXMge30ge30ge30iLCBwcm9wZXJ0eVZhbHVlSUQsIG9mQ0ksIGNhcGFiaWxpdHlJbnN0YW5jZUlkKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyhwcm9wZXJ0eVZhbHVlUGFpci5nZXRSaWdodCgpKTsKKwkJUHJvcGVydHlEYXRhIHByb3BlcnR5RGF0YSA9IG5ldyBQcm9wZXJ0eURhdGEoKTsKKwkJU3RyaW5nIHByb3BlcnR5SWQgPSAoU3RyaW5nKSBwcm9wcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUWV9JRC5uYW1lKCkpOworCQlwcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHByb3BlcnR5SWQpOworCisJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkocHJvcGVydHlWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVFlQRS5nZXRQcm9wZXJ0eSgpKTsKKwkJU3RyaW5nIHByb3BlcnR5VmFsdWVTdHIgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkocHJvcGVydHlWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkFMVUUuZ2V0UHJvcGVydHkoKSk7CisKKwkJUHJvcGVydHlWYWx1ZURhdGEgcHJvcGVydHlWYWx1ZSA9IGJ1aWxkUHJvcGVydHlWYWx1ZURhdGEoKFN0cmluZykgcHJvcHMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVFlfTkFNRS5uYW1lKCkpLCBwcm9wZXJ0eVR5cGUsIHByb3BlcnR5VmFsdWVTdHIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkKTsKKwkJVGl0YW5WZXJ0ZXggY3JlYXRlZFZhbHVlID0gbnVsbDsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVsYXRpb25SZXM7CisKKwkJbG9nLnRyYWNlKCJCZWZvcmUgY3JlYXRpbmcgcHJvcGVydHkgdmFsdWVzIG5vZGUge30ge30gIiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCBvbkdyYXBoKTsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlVmFsdWVSZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9wZXJ0eVZhbHVlKTsKKwkJU3RyaW5nIGNhcGFiaWx0eUluc3RJZCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShjYXBhYmlsaXR5SW5zdGFuY2VWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQlpZiAoY3JlYXRlVmFsdWVSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvciA9IGNyZWF0ZVZhbHVlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSB7fSIsIGNhcGFiaWx0eUluc3RJZCwgb2ZSSSwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJfQorCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCWxvZy50cmFjZSgiQWZ0ZXIgY3JlYXRpbmcgcHJvcGVydHkgdmFsdWVzIG5vZGUge30ge30ge30ge30gIiwgcHJvcGVydHlWYWx1ZS5nZXRVbmlxdWVJZCgpLCBvbkdyYXBoLCBzdGF0dXNJcywgZXJyb3IpOworCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQljcmVhdGVkVmFsdWUgPSBjcmVhdGVWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWxvZy50cmFjZSgiQmVmb3JlIGNyZWF0aW5nIHJlbGF0aW9uIGZyb20gY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB7fSB7fSIsIGNhcGFiaWxpdHlJbnN0YW5jZUlkLCB0b1ZhbHVlLCBwcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCkpOworCQkJY3JlYXRlUmVsYXRpb25SZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShjYXBhYmlsaXR5SW5zdGFuY2VWZXJ0ZXgsIGNyZWF0ZWRWYWx1ZSwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFLCBwcm9wcyk7CisJCQlpZiAoIWNyZWF0ZVJlbGF0aW9uUmVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQllcnJvciA9IGNyZWF0ZVJlbGF0aW9uUmVzOworCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcmVsYXRpb24gZnJvbSBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHt9IHt9IHt9IHt9IiwgY2FwYWJpbHR5SW5zdElkLCB0b1ZhbHVlLCBwcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCksIHN0YXR1c0lzLCBlcnJvcik7CisJCQkJfQorCQkJfQorCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJbG9nLnRyYWNlKCJBZnRlciBjcmVhdGluZyByZWxhdGlvbiBmcm9tIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30ge30ge30ge30ge30gIiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIHRvVmFsdWUsIHByb3BlcnR5VmFsdWUuZ2V0VW5pcXVlSWQoKSwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJbG9nLnRyYWNlKCJCZWZvcmUgY3JlYXRpbmcgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSB7fSB7fSB7fSAiLCBjcmVhdGVkVmFsdWUsIHRvUHJvcGVydHksIHByb3BlcnR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCWNyZWF0ZVJlbGF0aW9uUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZUVkZ2UoY3JlYXRlZFZhbHVlLCBwcm9wZXJ0eURhdGEsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCBwcm9wcyk7CisJCQlpZiAoIWNyZWF0ZVJlbGF0aW9uUmVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQllcnJvciA9IGNyZWF0ZVJlbGF0aW9uUmVzOworCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgcmVsYXRpb24gZnJvbSBwcm9wZXJ0eSB2YWx1ZSB7fSB7fSB7fSB7fSB7fSIsIHByb3BlcnR5VmFsdWUuZ2V0VW5pcXVlSWQoKSwgdG9Qcm9wZXJ0eSwgcHJvcGVydHlJZCwgc3RhdHVzSXMsIGVycm9yKTsKKwkJCQl9CisJCQl9CisJCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCQlsb2cudHJhY2UoIkJlZm9yZSBjcmVhdGluZyByZWxhdGlvbiBmcm9tIHByb3BlcnR5IHZhbHVlIGMiLCBjcmVhdGVkVmFsdWUsIHRvUHJvcGVydHksIHByb3BlcnR5RGF0YS5nZXRVbmlxdWVJZCgpLCBzdGF0dXNJcywgZXJyb3IpOworCQkJfQorCQl9CisJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJbG9nLnRyYWNlKCJBZnRlciBjbG9uaW5nIHByb3BlcnR5IHZhbHVlcyB7fSB7fSB7fSB7fSB7fSIsIHByb3BlcnR5VmFsdWVJRCwgb2ZDSSwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIHN0YXR1c0lzLCBlcnJvcik7CisJCX0KKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfQorCQlyZXR1cm4gZXJyb3I7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9DYXBhYmlsaXR5T3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NhcGFiaWxpdHlPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAwNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9DYXBhYmlsaXR5T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTk2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5HcmFwaEVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5SZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNhcGFiaWxpdHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5VHlwZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVuaXF1ZUlkRGF0YTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLmFubm90YXRpb24uSnNvbkFwcGVuZC5Qcm9wOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgiY2FwYWJpbGl0eS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIENhcGFiaWxpdHlPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiBpbXBsZW1lbnRzIElDYXBhYmlsaXR5T3BlcmF0aW9uIHsKKworCXB1YmxpYyBDYXBhYmlsaXR5T3BlcmF0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXBhYmlsaXR5T3BlcmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHRpdGFuR2VuZXJpY0RhbworCSAqLworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZENhcGFiaWxpdHkoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8Q2FwYWJpbGl0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBTdGF0dXMgPSBhZGRDYXBhYmlsaXR5VG9SZXNvdXJjZShyZXNvdXJjZUlkLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eURlZmluaXRpb24pOworCisJCQlpZiAoYWRkQ2FwU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFkZCBjYXBhYmlsaXR5IHt9IFsge30gXSB0byBncmFwaCIsIGNhcGFiaWxpdHlOYW1lLCBjYXBhYmlsaXR5RGVmaW5pdGlvbik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkQ3JlYXRlTm9kZUVycm9yKCJBZGQgQ2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlOYW1lLCBTdHJpbmcudmFsdWVPZihhZGRDYXBTdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYWRkQ2FwU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCUNhcGFiaWxpdHlEYXRhIGNhcGFiaWxpdHlEYXRhID0gYWRkQ2FwU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCQkJU3RyaW5nIGNhcGFiaWxpdHlVaWQgPSBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpOworCQkJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2FwYWJpbGl0eVJlcyA9IGdldENhcGFiaWxpdHkoY2FwYWJpbGl0eVVpZCwgdHJ1ZSk7CisJCQkJbG9nLmRlYnVnKCJBZnRlciBmZXRjaGluZyBjYXBhYmlsaXR5IHt9IHdpdGggdWlkIHt9LiBTdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eVVpZCwgY2FwYWJpbGl0eVJlcyk7CisKKwkJCQlpZiAoY2FwYWJpbGl0eVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXBhYmlsaXR5UmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggY2FwYWJpbGl0eSB7XSB3aXRoIHVpZCB7fS4gU3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHlVaWQsIHN0YXR1cyk7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIHZhbHVlID0gY2FwYWJpbGl0eVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBpcyB7fSIsIHZhbHVlKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh2YWx1ZSk7CisKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUV4ZWN1dGVSb2xsYmFja0Vycm9yKCJSb2xsYmFjayBvbiBncmFwaCIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRDYXBhYmlsaXR5KFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQl0cnkgeworCisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRDYXBTdGF0dXMgPSBhZGRDYXBhYmlsaXR5VG9SZXNvdXJjZShtZXRhZGF0YVZlcnRleCwgcmVzb3VyY2VJZCwgY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHlEZWZpbml0aW9uKTsKKworCQkJaWYgKCFhZGRDYXBTdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFkZCBjYXBhYmlsaXR5IHt9IFsge30gXSIsIGNhcGFiaWxpdHlOYW1lLCBjYXBhYmlsaXR5RGVmaW5pdGlvbik7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkQ3JlYXRlTm9kZUVycm9yKCJBZGQgQ2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlOYW1lLCBTdHJpbmcudmFsdWVPZihhZGRDYXBTdGF0dXMpKTsKKwkJCQlyZXN1bHQgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFkZENhcFN0YXR1cyk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCAhcmVzdWx0LmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgQ2FwYWJpbGl0eURlZmluaXRpb24gY29udmVydENEYXRhVG9DRGVmaW5pdGlvbihDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YSkgeworCisJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEZWZpbml0aW9uID0gbmV3IENhcGFiaWxpdHlEZWZpbml0aW9uKCk7CisJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldFR5cGUoY2FwYWJpbGl0eURhdGEuZ2V0VHlwZSgpKTsKKworCQkvLyBUT0RPIGVzb2ZlciBkbyBzb21ldGhpbmcKKworCQlyZXR1cm4gY2FwYWJpbGl0eURlZmluaXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eShTdHJpbmcgdW5pcXVlSWQpIHsKKworCQlyZXR1cm4gZ2V0Q2FwYWJpbGl0eSh1bmlxdWVJZCwgZmFsc2UpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDYXBhYmlsaXRpZXNPZlJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIHJlY3Vyc2l2ZWx5LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQlTZXQ8U3RyaW5nPiBjYXNlSW5zZW5zaXRpdmVDYXBhYmlsaXR5TmFtZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKwkJdHJ5IHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdldEFsbENhcGFiaWxpdGllc1JlY3VzaXZlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzb3VyY2VJZCwgcmVjdXJzaXZlbHksIGNhcGFiaWxpdGllcywgY2FzZUluc2Vuc2l0aXZlQ2FwYWJpbGl0eU5hbWVzLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmICghc3RhdHVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoY2FwYWJpbGl0aWVzKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRXhlY3V0ZVJvbGxiYWNrRXJyb3IoIlJvbGxiYWNrIG9uIGdyYXBoIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBnZXRBbGxDYXBhYmlsaXRpZXNSZWN1c2l2ZShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIHJlY3Vyc2l2ZWx5LCBNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzLCBTZXQ8U3RyaW5nPiBjYXNlSW5zZW5zaXRpdmVDYXBhYmlsaXR5TmFtZXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRTdGF0dXM7CisKKwkJaWYgKHJlY3Vyc2l2ZWx5KSB7CisJCQlmaW5kU3RhdHVzID0gZmluZEFsbENhcGFiaWxpdGllc1JlY3Vyc2l2ZWx5KHJlc291cmNlSWQsIGNhcGFiaWxpdGllcywgY2FzZUluc2Vuc2l0aXZlQ2FwYWJpbGl0eU5hbWVzKTsKKworCQl9IGVsc2UgeworCQkJZmluZFN0YXR1cyA9IGdldENhcGFiaWxpdGlzT2ZSZXNvdXJjZU9ubHkocmVzb3VyY2VJZCwgY2FwYWJpbGl0aWVzLCBjYXNlSW5zZW5zaXRpdmVDYXBhYmlsaXR5TmFtZXMpOworCQl9CisJCWlmICghZmluZFN0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlyZXR1cm4gZmluZFN0YXR1czsKKwkJfQorCisJCUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmlsbFJlc291cmNlRGVyaXZlZExpc3RGcm9tR3JhcGggPSBmaWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaChyZXNvdXJjZUlkLCBkZXJpdmVkRnJvbUxpc3QpOworCQlpZiAoIWZpbGxSZXNvdXJjZURlcml2ZWRMaXN0RnJvbUdyYXBoLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbCB0byBmaW5kIGFsbCB2YWxpZCBzb3VyY2VzIG9mIGNhcGFiaWxpdHkuIHN0YXR1cyA9IHt9IiwgZmlsbFJlc291cmNlRGVyaXZlZExpc3RGcm9tR3JhcGgubmFtZSgpKTsKKwkJCXJldHVybiBmaWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaDsKKwkJfQorCQljYXBhYmlsaXRpZXMuZm9yRWFjaCgobmFtZSwgY2FwYWJpbGl0eSkgLT4gY2FwYWJpbGl0eS5zZXRDYXBhYmlsaXR5U291cmNlcyhkZXJpdmVkRnJvbUxpc3QpKTsKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByb3RlY3RlZCBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsQ2FwYWJpbGl0aWVzUmVjdXJzaXZlbHkoU3RyaW5nIHJlc291cmNlSWQsIE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMsIFNldDxTdHJpbmc+IGNhc2VJbnNlbnNpdGl2ZUNhcGFiaWxpdHlOYW1lcykgeworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHJlc291cmNlQ2FwYWJpbGl0aWVzU3RhdHVzID0gZ2V0Q2FwYWJpbGl0aXNPZlJlc291cmNlT25seShyZXNvdXJjZUlkLCBjYXBhYmlsaXRpZXMsIGNhc2VJbnNlbnNpdGl2ZUNhcGFiaWxpdHlOYW1lcyk7CisKKwkJaWYgKCFyZXNvdXJjZUNhcGFiaWxpdGllc1N0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VDYXBhYmlsaXRpZXNTdGF0dXM7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmVudE5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHJlc291cmNlSWQsIEdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00sIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKHBhcmVudE5vZGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcGFyZW50Tm9kZXNTdGF0dXMgPSBwYXJlbnROb2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoIXBhcmVudE5vZGVzU3RhdHVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmluZCBwYXJlbnQgY2FwYWJpbGl0aWVzIG9mIHJlc291cmNlIHt9LiBzdGF0dXMgaXMge30iLCByZXNvdXJjZUlkLCBwYXJlbnROb2Rlc1N0YXR1cyk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkRmluZFBhcmVudEVycm9yKCJGZXRjaCBwYXJlbnQgY2FwYWJpbGl0aWVzIiwgcmVzb3VyY2VJZCwgU3RyaW5nLnZhbHVlT2YocGFyZW50Tm9kZXNTdGF0dXMpKTsKKwkJCQlyZXR1cm4gcGFyZW50Tm9kZXNTdGF0dXM7CisJCQl9CisJCX0KKwkJaWYgKHBhcmVudE5vZGVzLmlzTGVmdCgpKSB7CisJCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhcm5ldE5vZGVQYWlyID0gcGFyZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgcGFyZW50VW5pcXVlSWQgPSBwYXJuZXROb2RlUGFpci5nZXRLZXkoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFBhcmVudEludFN0YXR1cyA9IGZpbmRBbGxDYXBhYmlsaXRpZXNSZWN1cnNpdmVseShwYXJlbnRVbmlxdWVJZCwgY2FwYWJpbGl0aWVzLCBjYXNlSW5zZW5zaXRpdmVDYXBhYmlsaXR5TmFtZXMpOworCisJCQlpZiAoYWRkUGFyZW50SW50U3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggYWxsIGNhcGFiaWxpdGllcyBvZiByZXNvdXJjZSB7fSIsIHBhcmVudFVuaXF1ZUlkKTsKKwkJCQlyZXR1cm4gYWRkUGFyZW50SW50U3RhdHVzOworCQkJfQorCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGdldENhcGFiaWxpdGlzT2ZSZXNvdXJjZU9ubHkoU3RyaW5nIHJlc291cmNlSWQsIE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMsIFNldDxTdHJpbmc+IGNhc2VJbnNlbnNpdGl2ZUNhcGFiaWxpdHlOYW1lcykgeworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbENhcGFiaWxpdGllc1JlcyA9IGdldEFsbENhcGFiaWxpdGllc1BhaXJzKHJlc291cmNlSWQpOworCQlpZiAoYWxsQ2FwYWJpbGl0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsQ2FwYWJpbGl0aWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZmV0Y2hpbmcgYWxsIGNhcGFiaWxpdGllcyBvZiByZXNvdXJjZSB7fS4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+IGNhcGFiaWxpdHlQYWlycyA9IGFsbENhcGFiaWxpdGllc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlpZiAoY2FwYWJpbGl0eVBhaXJzICE9IG51bGwpIHsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPiBjYXBhYmlsaXR5UGFpciA6IGNhcGFiaWxpdHlQYWlycykgeworCQkJCUNhcGFiaWxpdHlEYXRhIGNhcGFiaWxpdHlEYXRhID0gY2FwYWJpbGl0eVBhaXIuZ2V0S2V5KCk7CisJCQkJR3JhcGhFZGdlIGdyYXBoRWRnZSA9IGNhcGFiaWxpdHlQYWlyLmdldFZhbHVlKCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcHMgPSBncmFwaEVkZ2UuZ2V0UHJvcGVydGllcygpOworCQkJCWlmIChlZGdlUHJvcHMgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgY2FwYWJpbGl0eU5hbWUgPSAoU3RyaW5nKSBlZGdlUHJvcHMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJaWYgKGNhcGFiaWxpdHlOYW1lID09IG51bGwpIHsKKwkJCQkJCWxvZy5lcnJvcigiQ2FwYWJpbGl0eSBuYW1lIHdhcyBub3QgZm91bmQgZm9yIGNhcGFiaWxpdHkge30iLCBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQ7CisJCQkJCX0KKwkJCQkJRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2FwYWJpbGl0eURlZlJlcyA9IGdldENhcGFiaWxpdHlCeUNhcGFiaWxpdHlEYXRhKGNhcGFiaWxpdHlEYXRhKTsKKwkJCQkJaWYgKGNhcGFiaWxpdHlEZWZSZXMuaXNSaWdodCgpKSB7CisJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXBhYmlsaXR5RGVmUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJCX0KKwkJCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gPSBjYXBhYmlsaXR5RGVmUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRPd25lcklkKHJlc291cmNlSWQpOworCQkJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgY2FwYWJpbGl0eSB7fSB3aXRoIGRlZmluaXRpb24ge30gdG8gcmVzdWx0LiIsIGNhcGFiaWxpdHlOYW1lLCBjYXBhYmlsaXR5RGVmaW5pdGlvbik7CisJCQkJCS8vIFVTNjMxNDYyCisJCQkJCWlmIChjYXNlSW5zZW5zaXRpdmVDYXBhYmlsaXR5TmFtZXMuY29udGFpbnMoY2FwYWJpbGl0eU5hbWUudG9Mb3dlckNhc2UoKSkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiVGhlIGNhcGFiaWxpdHkge30gd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBkZXJpdmVkIHJlc291cmNlIChjYXNlIGluc2Vuc2l0aXZlKS4gSWdub3JlIHt9IGZyb20gcmVzb3VyY2Uge30iLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eU5hbWUsIHJlc291cmNlSWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2FwYWJpbGl0aWVzLnB1dChjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eURlZmluaXRpb24pOworCQkJCQkJY2FzZUluc2Vuc2l0aXZlQ2FwYWJpbGl0eU5hbWVzLmFkZChjYXBhYmlsaXR5TmFtZS50b0xvd2VyQ2FzZSgpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiQ2FwYWJpbGl0eSBuYW1lIHdhcyBub3QgZm91bmQgZm9yIGNhcGFiaWxpdHkge30iLCBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkUmV0cmlldmVOb2RlRXJyb3IoIkZldGNoIENhcGFiaWxpdHkiLCBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpLCBTdHJpbmcudmFsdWVPZihUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQpKTsKKwkJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfRUxFTUVOVDsKKwkJCQl9CisKKwkJCX0KKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eShTdHJpbmcgdW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJRWl0aGVyPENhcGFiaWxpdHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2FwYWJpbHR5UmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHkpLCB1bmlxdWVJZCwgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCQkJaWYgKGNhcGFiaWx0eVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXBhYmlsdHlSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdHkge30gZnJvbSBncmFwaC4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHN0YXR1cyk7CisKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcigiRmV0Y2ggQ2FwYWJpbGl0eSIsIHVuaXF1ZUlkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJQ2FwYWJpbGl0eURhdGEgY2FwYWJpbGl0eURhdGEgPSBjYXBhYmlsdHlSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiA9IG5ldyBDYXBhYmlsaXR5RGVmaW5pdGlvbigpOworCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24oY2FwYWJpbGl0eURhdGEuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRVbmlxdWVJZChjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldFZhbGlkU291cmNlVHlwZXMoY2FwYWJpbGl0eURhdGEuZ2V0VmFsaWRTb3VyY2VUeXBlcygpKTsKKwkJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldE1pbk9jY3VycmVuY2VzKGNhcGFiaWxpdHlEYXRhLmdldE1pbk9jY3VycmVuY2VzKCkpOworCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0TWF4T2NjdXJyZW5jZXMoY2FwYWJpbGl0eURhdGEuZ2V0TWF4T2NjdXJyZW5jZXMoKSk7CisKKwkJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXBhYmlsaXR5VHlwZVJlcyA9IGdldENhcGFiaWxpdHlUeXBlT2ZDYXBhYmlsaXR5KHVuaXF1ZUlkKTsKKwkJCWlmIChjYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXBhYmlsaXR5VHlwZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgY2FwYWJpbGl0eSB0eXBlIG9mIGNhcGFiaWxpdHkge30uIFN0YXR1cyBpcyB7fSIsIHVuaXF1ZUlkLCBzdGF0dXMpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yKCJGZXRjaCBDYXBhYmlsaXR5IiwgdW5pcXVlSWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJQ2FwYWJpbGl0eVR5cGVEYXRhIGNhcGFiaWxpdHlUeXBlRGF0YSA9IGNhcGFiaWxpdHlUeXBlUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VHlwZShjYXBhYmlsaXR5VHlwZURhdGEuZ2V0Q2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbigpLmdldFR5cGUoKSk7CisKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQYXJlbnROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5KSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZLAorCQkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChwYXJlbnROb2RlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhwYXJlbnROb2RlLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhaXIgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQkJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldE93bmVySWQocGFpci5sZWZ0LmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlMaXN0PFN0cmluZz4gZGVyaXZlZEZyb21MaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJLy8gZGVyaXZlZEZyb21MaXN0LmFkZChwYWlyLmxlZnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmlsbFJlc291cmNlRGVyaXZlZExpc3RGcm9tR3JhcGggPSBmaWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaChwYWlyLmxlZnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIGRlcml2ZWRGcm9tTGlzdCk7CisJCQkJaWYgKGZpbGxSZXNvdXJjZURlcml2ZWRMaXN0RnJvbUdyYXBoLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0Q2FwYWJpbGl0eVNvdXJjZXMoZGVyaXZlZEZyb21MaXN0KTsKKwkJCQl9CisJCQl9CisKKwkJCUVpdGhlcjxMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRQcm9wZXJ0aWVzUmVzID0gZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eSh1bmlxdWVJZCwgY2FwYWJpbGl0eVR5cGVEYXRhLmdldENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24oKS5nZXRUeXBlKCkpOworCQkJaWYgKGdldFByb3BlcnRpZXNSZXMuaXNSaWdodCgpICYmICFnZXRQcm9wZXJ0aWVzUmVzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdldFByb3BlcnRpZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgY2FwYWJpbGl0eSB7fS4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHN0YXR1cyk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkUmV0cmlldmVOb2RlRXJyb3IoIkZldGNoIFByb3BlcnRpZXMgb2YgQ2FwYWJpbGl0eSIsIHVuaXF1ZUlkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlpZiAoZ2V0UHJvcGVydGllc1Jlcy5pc0xlZnQoKSkgeworCQkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5IDogZ2V0UHJvcGVydGllc1Jlcy5sZWZ0KCkudmFsdWUoKSkgeworCQkJCQlwcm9wZXJ0aWVzLmFkZChuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eShwcm9wZXJ0eSwgbnVsbCwgbnVsbCkpOworCQkJCX0KKwkJCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoY2FwYWJpbGl0eURlZmluaXRpb24pOworCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRXhlY3V0ZVJvbGxiYWNrRXJyb3IoIlJvbGxiYWNrIG9uIGdyYXBoIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgZmlsbFJlc291cmNlRGVyaXZlZExpc3RGcm9tR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBMaXN0PFN0cmluZz4gZGVyaXZlZEZyb21MaXN0KSB7CisKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VOb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgdW5pcXVlSWQsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlpZiAocmVzb3VyY2VOb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcGFyZW50Tm9kZXNTdGF0dXMgPSByZXNvdXJjZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKCFwYXJlbnROb2Rlc1N0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgcmVzb3VyY2Uge30gLiBzdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgcGFyZW50Tm9kZXNTdGF0dXMpOworCQkJCXJldHVybiBwYXJlbnROb2Rlc1N0YXR1czsKKwkJCX0KKwkJfQorCisJCWRlcml2ZWRGcm9tTGlzdC5hZGQoKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIHJlc291cmNlTm9kZS5sZWZ0KCkudmFsdWUoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkgJiYgKGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCXJldHVybiBjaGlsZHJlbk5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfSBlbHNlIGlmIChjaGlsZHJlbk5vZGVzLmlzTGVmdCgpKSB7CisKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPj4gcGFpckxpc3QgPSBjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQkJZm9yIChJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhaXIgOiBwYWlyTGlzdCkgeworCQkJCXJldHVybiBmaWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaChwYWlyLmxlZnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIGRlcml2ZWRGcm9tTGlzdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5QnlDYXBhYmlsaXR5RGF0YShDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YSkgeworCisJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKworCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiA9IG5ldyBDYXBhYmlsaXR5RGVmaW5pdGlvbigpOworCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbihjYXBhYmlsaXR5RGF0YS5nZXREZXNjcmlwdGlvbigpKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VW5pcXVlSWQoY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldFZhbGlkU291cmNlVHlwZXMoY2FwYWJpbGl0eURhdGEuZ2V0VmFsaWRTb3VyY2VUeXBlcygpKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0TWluT2NjdXJyZW5jZXMoY2FwYWJpbGl0eURhdGEuZ2V0TWluT2NjdXJyZW5jZXMoKSk7CisJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldE1heE9jY3VycmVuY2VzKGNhcGFiaWxpdHlEYXRhLmdldE1heE9jY3VycmVuY2VzKCkpOworCisJCVN0cmluZyBjYXBhYmlsaXR5VWlkID0gY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKTsKKwkJRWl0aGVyPENhcGFiaWxpdHlUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlUmVzID0gZ2V0Q2FwYWJpbGl0eVR5cGVPZkNhcGFiaWxpdHkoY2FwYWJpbGl0eVVpZCk7CisJCWlmIChjYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNhcGFiaWxpdHlUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdHkgdHlwZSBvZiBjYXBhYmlsaXR5IHt9IC4gc3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eVVpZCwgc3RhdHVzKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yKCJGZXRjaCBDYXBhYmlsaXR5IiwgY2FwYWJpbGl0eVVpZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUNhcGFiaWxpdHlUeXBlRGF0YSBjYXBhYmlsaXR5VHlwZURhdGEgPSBjYXBhYmlsaXR5VHlwZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VHlwZShjYXBhYmlsaXR5VHlwZURhdGEuZ2V0Q2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbigpLmdldFR5cGUoKSk7CisKKwkJRWl0aGVyPExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlQcm9wZXJ0aWVzUmVzID0gZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eShjYXBhYmlsaXR5VWlkLCBjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQlpZiAoY2FwYWJpbGl0eVByb3BlcnRpZXNSZXMuaXNSaWdodCgpICYmICFjYXBhYmlsaXR5UHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNhcGFiaWxpdHlQcm9wZXJ0aWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgY2FwYWJpbGl0eSB7fSAuIHN0YXR1cyBpcyB7fSIsIGNhcGFiaWxpdHlVaWQsIHN0YXR1cyk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcigiRmV0Y2ggQ2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlVaWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJaWYgKGNhcGFiaWxpdHlQcm9wZXJ0aWVzUmVzLmlzTGVmdCgpKSB7CisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5IDogY2FwYWJpbGl0eVByb3BlcnRpZXNSZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQlwcm9wZXJ0aWVzLmFkZChuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eShwcm9wZXJ0eSwgbnVsbCwgbnVsbCkpOworCQkJfQorCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKwkJfQorCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjYXBhYmlsaXR5RGVmaW5pdGlvbik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlCeUNhcGFiaWxpdHlEYXRhKFRpdGFuVmVydGV4IGNhcGFiaWxpdHlEYXRhVmVydGV4KSB7CisKKwkJRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0OworCisJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEZWZpbml0aW9uID0gbmV3IENhcGFiaWxpdHlEZWZpbml0aW9uKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyhjYXBhYmlsaXR5RGF0YVZlcnRleCk7CisJCUNhcGFiaWxpdHlEYXRhIGNhcGFiaWxpdHlEYXRhID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KChTdHJpbmcpIHByb3BzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCkpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBwcm9wcywgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbihjYXBhYmlsaXR5RGF0YS5nZXREZXNjcmlwdGlvbigpKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VW5pcXVlSWQoY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldFZhbGlkU291cmNlVHlwZXMoY2FwYWJpbGl0eURhdGEuZ2V0VmFsaWRTb3VyY2VUeXBlcygpKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0TWluT2NjdXJyZW5jZXMoY2FwYWJpbGl0eURhdGEuZ2V0TWluT2NjdXJyZW5jZXMoKSk7CisJCWNhcGFiaWxpdHlEZWZpbml0aW9uLnNldE1heE9jY3VycmVuY2VzKGNhcGFiaWxpdHlEYXRhLmdldE1heE9jY3VycmVuY2VzKCkpOworCisJCVN0cmluZyBjYXBhYmlsaXR5VWlkID0gY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKTsKKwkJRWl0aGVyPENhcGFiaWxpdHlUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlUmVzID0gZ2V0Q2FwYWJpbGl0eVR5cGVPZkNhcGFiaWxpdHkoY2FwYWJpbGl0eVVpZCk7CisJCWlmIChjYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNhcGFiaWxpdHlUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdHkgdHlwZSBvZiBjYXBhYmlsaXR5IHt9IC4gc3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eVVpZCwgc3RhdHVzKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yKCJGZXRjaCBDYXBhYmlsaXR5IiwgY2FwYWJpbGl0eVVpZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUNhcGFiaWxpdHlUeXBlRGF0YSBjYXBhYmlsaXR5VHlwZURhdGEgPSBjYXBhYmlsaXR5VHlwZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VHlwZShjYXBhYmlsaXR5VHlwZURhdGEuZ2V0Q2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbigpLmdldFR5cGUoKSk7CisKKwkJRWl0aGVyPExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlQcm9wZXJ0aWVzUmVzID0gZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eShjYXBhYmlsaXR5VWlkLCBjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQlpZiAoY2FwYWJpbGl0eVByb3BlcnRpZXNSZXMuaXNSaWdodCgpICYmICFjYXBhYmlsaXR5UHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNhcGFiaWxpdHlQcm9wZXJ0aWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgY2FwYWJpbGl0eSB7fSAuIHN0YXR1cyBpcyB7fSIsIGNhcGFiaWxpdHlVaWQsIHN0YXR1cyk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcigiRmV0Y2ggQ2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlVaWQsIFN0cmluZy52YWx1ZU9mKHN0YXR1cykpOworCisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJaWYgKGNhcGFiaWxpdHlQcm9wZXJ0aWVzUmVzLmlzTGVmdCgpKSB7CisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5IDogY2FwYWJpbGl0eVByb3BlcnRpZXNSZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQlwcm9wZXJ0aWVzLmFkZChuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eShwcm9wZXJ0eSwgbnVsbCwgbnVsbCkpOworCQkJfQorCQkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKwkJfQorCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjYXBhYmlsaXR5RGVmaW5pdGlvbik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5KFN0cmluZyBjYXBhYmlsaXR5VWlkLCBTdHJpbmcgY2FwYWJpbGl0eVR5cGUpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZ2V0dGluZyBwcm9wZXJ0aWVzIG9mIGNhcGFiaWxpdHkge30gZnJvbSBncmFwaCAiLCBjYXBhYmlsaXR5VWlkKTsKKworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllczsKKwkJRWl0aGVyPExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMgPSBudWxsOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5UmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHkpLCBjYXBhYmlsaXR5VWlkLCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFksCisJCQkJTm9kZVR5cGVFbnVtLlByb3BlcnR5LCBQcm9wZXJ0eURhdGEuY2xhc3MpOworCQlpZiAoZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eVJlcy5pc1JpZ2h0KCkgJiYgIWdldFByb3BlcnRpZXNPZkNhcGFiaWxpdHlSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5UmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGNhcGFiaWxpdHkgd2l0aCBpZCB7fS4gc3RhdHVzPXt9IiwgY2FwYWJpbGl0eVVpZCwgc3RhdHVzKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlVWlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2FwYWJpbGl0eVR5cGVVaWQoY2FwYWJpbGl0eVR5cGUpOworCQkJZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMgPSBnZXRBbGxDYXBhYmlsaXR5VHlwZVByb3BlcnRpZXNGcm9tQWxsRGVyaXZlZEZyb20oY2FwYWJpbGl0eVR5cGVVaWQpOworCQkJaWYgKGdldFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLmlzUmlnaHQoKSAmJiAhZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgZm9yIGNhcGFiaWxpdHkgdHlwZSB7fSBmcm9tIGdyYXBoLiBTdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5VHlwZSwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfQorCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGdldFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLmlzUmlnaHQoKQorCQkJCQk/IChnZXRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5UmVzLmlzUmlnaHQoKSA/IEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpCisJCQkJCQkJOiBFaXRoZXIubGVmdChnZXRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5UmVzLmxlZnQoKS52YWx1ZSgpLnN0cmVhbSgpLm1hcChwIC0+IHByb3BlcnR5T3BlcmF0aW9uLmNvbnZlcnRQcm9wZXJ0eURhdGFUb1Byb3BlcnR5RGVmaW5pdGlvbihwLmdldEtleSgpLCBudWxsLCBjYXBhYmlsaXR5VWlkKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSkpCisJCQkJCTogKGdldFByb3BlcnRpZXNPZkNhcGFiaWxpdHlSZXMuaXNSaWdodCgpID8gRWl0aGVyLmxlZnQoZ2V0UHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMubGVmdCgpLnZhbHVlKCkudmFsdWVzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSkgOiBudWxsKTsKKwkJfQorCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGUgPSBnZXRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCXByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5UmVzLmxlZnQoKS52YWx1ZSgpLnN0cmVhbSgpCisJCQkJCS5tYXAocCAtPiBwcm9wZXJ0eU9wZXJhdGlvbi5jb252ZXJ0UHJvcGVydHlEYXRhVG9Qcm9wZXJ0eURlZmluaXRpb24ocC5nZXRLZXkoKSwgKFN0cmluZykgcC5nZXRSaWdodCgpLmdldFByb3BlcnRpZXMoKS5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpLCBjYXBhYmlsaXR5VWlkKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCXByb3BlcnRpZXMuc3RyZWFtKCkuZm9yRWFjaChwIC0+IHByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlLnJlbW92ZShwLmdldE5hbWUoKSkpOworCQkJcHJvcGVydGllcy5hZGRBbGwocHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGUudmFsdWVzKCkpOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocHJvcGVydGllcyk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPENhcGFiaWxpdHlUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlUeXBlT2ZDYXBhYmlsaXR5KFN0cmluZyB1bmlxdWVJZCkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlUeXBlRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5KSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5UWVBFX09GLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUsCisJCQkJQ2FwYWJpbGl0eVR5cGVEYXRhLmNsYXNzKTsKKworCQlpZiAoY2FwYWJpbGl0eVR5cGVSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXBhYmlsaXR5VHlwZVJlcy5yaWdodCgpLnZhbHVlKCk7Ly8KKwkJCWxvZy5kZWJ1ZygiQ2Fubm90IGZpbmQgY2FwYWJpbGl0eSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBjYXBhYmlsaXR5IHt9LiBTdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgc3RhdHVzKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZEZpbmRBc3NvY2lhdGlvbkVycm9yKCJGZXRjaCBDYXBhYmlsaXR5IHR5cGUiLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUuZ2V0TmFtZSgpLCB1bmlxdWVJZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNhcGFiaWxpdHlUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlDYXBhYmlsaXR5VHlwZURhdGEgY2FwYWJpbGl0eVR5cGVEYXRhID0gY2FwYWJpbGl0eVR5cGVSZXMubGVmdCgpLnZhbHVlKCkuZ2V0S2V5KCk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhcGFiaWxpdHlUeXBlRGF0YSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5KFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgU3RyaW5nIHJlc291cmNlSWQpIHsKKwkJcmV0dXJuIGdldENhcGFiaWxpdHkoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2FwYWJpbGl0eVVpZChyZXNvdXJjZUlkLCBjYXBhYmlsaXR5TmFtZSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHkoU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRDYXBhYmlsaXR5KFVuaXF1ZUlkQnVpbGRlci5idWlsZENhcGFiaWxpdHlVaWQocmVzb3VyY2VJZCwgY2FwYWJpbGl0eU5hbWUpLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDYXBhYmlsaXRpZXNQYWlycyhTdHJpbmcgcmVzb3VyY2VJZCkgeworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2FwYWJpbGl0aWVzTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLCBHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWSwKKwkJCQlOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSwgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCisJCWxvZy5kZWJ1ZygiQWZ0ZXIgbG9va2luZyBmb3IgYWxsIGNhcGFiaWxpdGllcyB1bmRlciByZXNvdXJjZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgY2FwYWJpbGl0aWVzTm9kZXMpOworCQlpZiAoY2FwYWJpbGl0aWVzTm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXBhYmlsaXRpZXNOb2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+IGNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc05vZGVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoY2FwYWJpbGl0aWVzID09IG51bGwgfHwgdHJ1ZSA9PSBjYXBhYmlsaXRpZXMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2FwYWJpbGl0aWVzTm9kZXMubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgRWl0aGVyPENhcGFiaWxpdHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkQ2FwYWJpbGl0eVRvUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24pIHsKKworCQlsb2cuZGVidWcoIkdvaW5nIHRvIGFkZCBjYXBhYmlsaXR5IHt9IFsge30gXSB0byByZXNvdXJjZSB1aWQge30iLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eURlZmluaXRpb24sIHJlc291cmNlSWQpOworCisJCUVpdGhlcjxDYXBhYmlsaXR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhcFJlcyA9IGNyZWF0ZUNhcGFiaWxpdHkocmVzb3VyY2VJZCwgY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHlEZWZpbml0aW9uKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW5nIGNhcGFiaWxpdHkgbm9kZSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9IiwgY3JlYXRlQ2FwUmVzKTsKKwkJaWYgKGNyZWF0ZUNhcFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZUNhcFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgY2FwYWJpbGl0eSBkYXRhIG5vZGUgaW4gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKwkJQ2FwYWJpbGl0eURhdGEgY2FwYWJpbGl0eURhdGEgPSBjcmVhdGVDYXBSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlID0gY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0VHlwZSgpOworCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gYXNzb2NpYXRlIGNhcGFiaWxpdHkge30gdG8gaXRzIGNhcGFiaWxpdHlUeXBlIHt9IiwgY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHlUeXBlKTsKKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUNhcGFiaWxpdHlUeXBlUmVzID0gYXNzb2NpYXRlQ2FwYWJpbGl0eVRvQ2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eURhdGEsIGNhcGFiaWxpdHlUeXBlKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyBjYXBhYmlsaXR5IHt9IHRvIGl0cyBjYXBhYmlsaXR5VHlwZSB7fS4gc3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHlUeXBlLCBhc3NvY2lhdGVDYXBhYmlsaXR5VHlwZVJlcyk7CisJCWlmIChhc3NvY2lhdGVDYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFzc29jaWF0ZUNhcGFiaWxpdHlUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSBjYXBhYmlsaXR5IHt9IHRvIGl0cyBjYXBhYmlsaXR5VHlwZSB7fSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9ICIsIGNhcGFiaWxpdHlOYW1lLCBjYXBhYmlsaXR5VHlwZSwgc3RhdHVzKTsKKworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gY2lQcm9wZXJ0aWVzID0gY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCQlpZiAoY2lQcm9wZXJ0aWVzICE9IG51bGwgJiYgIWNpUHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKwkJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gY2lQcm9wZXJ0aWVzLnN0cmVhbSgpLm1hcChwcm9wIC0+IG5ldyBQcm9wZXJ0eURlZmluaXRpb24ocHJvcCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnRpZXNSZXMgPSBhZGRQcm9wZXJ0aWVzVG9DYXBhYmlsaXR5KGNhcGFiaWxpdHlEYXRhLCBjYXBhYmlsaXR5VHlwZSwgcHJvcGVydGllcyk7CisJCQlpZiAoYWRkUHJvcGVydGllc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBhZGRQcm9wZXJ0aWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCQl9CisJCX0KKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZVJlc291cmNlUmVzID0gYXNzb2NpYXRlUmVzb3VyY2VUb0NhcGFiaWxpdHkocmVzb3VyY2VJZCwgY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHlEYXRhKTsKKwkJaWYgKGFzc29jaWF0ZVJlc291cmNlUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYXNzb2NpYXRlUmVzb3VyY2VSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHJlc291cmNlICIgKyByZXNvdXJjZUlkICsgIiB0byBjYXBhYmlsaXR5ICIgKyBjYXBhYmlsaXR5RGF0YSArICIuIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjYXBhYmlsaXR5RGF0YSk7CisKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZENhcGFiaWxpdHlUb1Jlc291cmNlKFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbikgeworCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gYWRkIGNhcGFiaWxpdHkge30gWyB7fSBdIHRvIHJlc291cmNlIHVpZCB7fSIsIGNhcGFiaWxpdHlOYW1lLCBjYXBhYmlsaXR5RGVmaW5pdGlvbiwgcmVzb3VyY2VJZCk7CisKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwUmVzID0gY3JlYXRlQ2FwYWJpbGl0eVZlcnRleChyZXNvdXJjZUlkLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eURlZmluaXRpb24pOworCisJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbmcgY2FwYWJpbGl0eSBub2RlIGluIGdyYXBoLiBzdGF0dXMgaXMge30iLCBjcmVhdGVDYXBSZXMpOworCQlpZiAoY3JlYXRlQ2FwUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlQ2FwUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjYXBhYmlsaXR5IGRhdGEgbm9kZSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9Iiwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJVGl0YW5WZXJ0ZXggY2FwYWJpbGl0eVZlcnRleCA9IGNyZWF0ZUNhcFJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlTdHJpbmcgY2FwYWJpbGl0eVR5cGUgPSBjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRUeXBlKCk7CisKKwkJbG9nLmRlYnVnKCJHb2luZyB0byBhc3NvY2lhdGUgY2FwYWJpbGl0eSB7fSB0byBpdHMgY2FwYWJpbGl0eVR5cGUge30iLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eVR5cGUpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUNhcGFiaWxpdHlUeXBlUmVzID0gYXNzb2NpYXRlQ2FwYWJpbGl0eVRvQ2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eVZlcnRleCwgY2FwYWJpbGl0eVR5cGUpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIGNhcGFiaWxpdHkge30gdG8gaXRzIGNhcGFiaWxpdHlUeXBlIHt9LiBzdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eVR5cGUsIGFzc29jaWF0ZUNhcGFiaWxpdHlUeXBlUmVzKTsKKwkJaWYgKCFhc3NvY2lhdGVDYXBhYmlsaXR5VHlwZVJlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgY2FwYWJpbGl0eSB7fSB0byBpdHMgY2FwYWJpbGl0eVR5cGUge30gaW4gZ3JhcGguIHN0YXR1cyBpcyB7fSAiLCBjYXBhYmlsaXR5TmFtZSwgY2FwYWJpbGl0eVR5cGUsIGFzc29jaWF0ZUNhcGFiaWxpdHlUeXBlUmVzKTsKKwkJCXJldHVybiBhc3NvY2lhdGVDYXBhYmlsaXR5VHlwZVJlczsKKwkJfQorCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGNpUHJvcGVydGllcyA9IGNhcGFiaWxpdHlEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKTsKKwkJaWYgKGNpUHJvcGVydGllcyAhPSBudWxsICYmICFjaVByb3BlcnRpZXMuaXNFbXB0eSgpKSB7CisJCQlTdHJpbmcgY2FwYWJpbHR5SWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoY2FwYWJpbGl0eVZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IGNpUHJvcGVydGllcy5zdHJlYW0oKS5tYXAocHJvcCAtPiBuZXcgUHJvcGVydHlEZWZpbml0aW9uKHByb3ApKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkUHJvcGVydGllc1JlcyA9IGFkZFByb3BlcnRpZXNUb0NhcGFiaWxpdHkoY2FwYWJpbGl0eVZlcnRleCwgY2FwYWJpbGl0eVR5cGUsIHByb3BlcnRpZXMsIGNhcGFiaWx0eUlkKTsKKwkJCWlmICghYWRkUHJvcGVydGllc1Jlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmV0dXJuIGFkZFByb3BlcnRpZXNSZXM7CisJCQl9CisJCX0KKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVSZXNvdXJjZVJlcyA9IGFzc29jaWF0ZVJlc291cmNlVG9DYXBhYmlsaXR5KHJlc291cmNlSWQsIGNhcGFiaWxpdHlOYW1lLCBjYXBhYmlsaXR5VmVydGV4LCBtZXRhZGF0YVZlcnRleCk7CisJCWlmICghYXNzb2NpYXRlUmVzb3VyY2VSZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHJlc291cmNle30gdG8gY2FwYWJpbGl0eSB7fS4gc3RhdHVzIGlzIHt9ICIsIHJlc291cmNlSWQsIGNhcGFiaWxpdHlOYW1lLCBhc3NvY2lhdGVSZXNvdXJjZVJlcyk7CisJCX0KKworCQlyZXR1cm4gYXNzb2NpYXRlUmVzb3VyY2VSZXM7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlQ2FwYWJpbGl0eVRvQ2FwYWJpbGl0eVR5cGUoQ2FwYWJpbGl0eURhdGEgY2FwYWJpbGl0eURhdGEsIFN0cmluZyBjYXBhYmlsaXR5VHlwZSkgeworCQlVbmlxdWVJZERhdGEgY2FwYWJpbGl0eVR5cGVJZERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5VHlwZSwgVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2FwYWJpbGl0eVR5cGVVaWQoY2FwYWJpbGl0eVR5cGUpKTsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgYXNzb2NpYXRpbmcge30gdG8gY2FwYWJpbGl0eSB0eXBlIHt9LiIsIGNhcGFiaWxpdHlEYXRhLCBjYXBhYmlsaXR5VHlwZSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNhcGFiaWxpdHlEYXRhLCBjYXBhYmlsaXR5VHlwZUlkRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlRZUEVfT0YsIG51bGwpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHt9IHRvIGNhcGFiaWxpdHkgdHlwZSB7fS4gc3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eURhdGEsIGNhcGFiaWxpdHlUeXBlLCBjcmVhdGVSZWxSZXN1bHQpOworCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSBjYXBhYmlsaXR5IHt9IHRvIGNhcGFiaWxpdHkgdHlwZSB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IixjYXBhYmlsaXR5RGF0YSwgY2FwYWJpbGl0eVR5cGVJZERhdGEsIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNyZWF0ZVJlbFJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUNhcGFiaWxpdHlUb0NhcGFiaWxpdHlUeXBlKFRpdGFuVmVydGV4IGNhcGFiaWxpdHlWZXJ0ZXgsIFN0cmluZyBjYXBhYmlsaXR5VHlwZSkgeworCisJCVVuaXF1ZUlkRGF0YSBjYXBhYmlsaXR5VHlwZUlkRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRDYXBhYmlsaXR5VHlwZVVpZChjYXBhYmlsaXR5VHlwZSkpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFzc29jaWF0aW5nIHt9IHRvIGNhcGFiaWxpdHkgdHlwZSB7fS4iLCBjYXBhYmlsaXR5VmVydGV4LCBjYXBhYmlsaXR5VHlwZSk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKGNhcGFiaWxpdHlWZXJ0ZXgsIGNhcGFiaWxpdHlUeXBlSWREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuVFlQRV9PRiwgbnVsbCk7CisJCWxvZy50cmFjZSgiQWZ0ZXIgYXNzb2NpYXRpbmcge30gdG8gY2FwYWJpbGl0eSB0eXBlIHt9LiBzdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5VmVydGV4LCBjYXBhYmlsaXR5VHlwZSwgY3JlYXRlUmVsUmVzdWx0KTsKKwkJaWYgKCFjcmVhdGVSZWxSZXN1bHQuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNhcGFiaWxpdHkge30gdG8gY2FwYWJpbGl0eSB0eXBlIHt9IGluIGdyYXBoLiBzdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5VmVydGV4LCBjYXBhYmlsaXR5VHlwZUlkRGF0YSwgY3JlYXRlUmVsUmVzdWx0KTsKKwkJfQorCQlyZXR1cm4gY3JlYXRlUmVsUmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVSZXNvdXJjZVRvQ2FwYWJpbGl0eShTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YSkgeworCisJCVVuaXF1ZUlkRGF0YSByZXNvdXJjZUlkRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZUlkKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhc3NvY2lhdGluZyByZXNvdXJjZSB7fSB0byBjYXBhYmlsaXR5IHt9LiIsIHJlc291cmNlSWQsIGNhcGFiaWxpdHlEYXRhKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5TmFtZSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHJlc291cmNlSWREYXRhLCBjYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkNBUEFCSUxJVFksIHByb3BzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyByZXNvdXJjZSB7fSB0byBjYXBhYmlsaXR5IHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUlkLCBjYXBhYmlsaXR5RGF0YSwgY3JlYXRlUmVsUmVzdWx0KTsKKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2Uge30gdG8gY2FwYWJpbGl0eSB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgY2FwYWJpbGl0eURhdGEsIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlUmVsUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlUmVzb3VyY2VUb0NhcGFiaWxpdHkoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgVGl0YW5WZXJ0ZXggY2FwYWJpbGl0eVZlcnRleCwgVGl0YW5WZXJ0ZXggcmVzb3VyY2VWZXJ0ZXgpIHsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhc3NvY2lhdGluZyByZXNvdXJjZSB7fSB0byBjYXBhYmlsaXR5IHt9LiIsIHJlc291cmNlSWQsIGNhcGFiaWxpdHlOYW1lKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5TmFtZSk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKHJlc291cmNlVmVydGV4LCBjYXBhYmlsaXR5VmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWSwgcHJvcHMpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHJlc291cmNlIHt9IHRvIGNhcGFiaWxpdHkge30uIHN0YXR1cyBpcyB7fSIsIHJlc291cmNlSWQsIGNhcGFiaWxpdHlOYW1lLCBjcmVhdGVSZWxSZXN1bHQpOworCQlpZiAoIWNyZWF0ZVJlbFJlc3VsdC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2Uge30gdG8gY2FwYWJpbGl0eSB7fSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgY2FwYWJpbGl0eU5hbWUsIGNyZWF0ZVJlbFJlc3VsdCk7CisJCX0KKworCQlyZXR1cm4gY3JlYXRlUmVsUmVzdWx0OworCisJfQorCisJLyoqCisJICogCisJICogY3JlYXRlIGNhcGFiaWxpdHkgbm9kZSBpbiB0aGUgZ3JhcGgKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBjYXBhYmlsaXR5TmFtZQorCSAqIEBwYXJhbSBjYXBhYmlsaXR5RGVmaW5pdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxDYXBhYmlsaXR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhcGFiaWxpdHkoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24pIHsKKworCQlDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YSA9IG5ldyBDYXBhYmlsaXR5RGF0YSgpOworCQlTdHJpbmcgdWlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2FwYWJpbGl0eVVpZChyZXNvdXJjZUlkLCBjYXBhYmlsaXR5TmFtZSk7CisJCWNhcGFiaWxpdHlEYXRhLnNldFVuaXF1ZUlkKHVpZCk7CisJCUxvbmcgY3JlYXRpb25UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWNhcGFiaWxpdHlEYXRhLnNldENyZWF0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQljYXBhYmlsaXR5RGF0YS5zZXRNb2RpZmljYXRpb25UaW1lKGNyZWF0aW9uVGltZSk7CisJCWNhcGFiaWxpdHlEYXRhLnNldFZhbGlkU291cmNlVHlwZXMoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0VmFsaWRTb3VyY2VUeXBlcygpKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0TWluT2NjdXJyZW5jZXMoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0TWluT2NjdXJyZW5jZXMoKSk7CisJCWNhcGFiaWxpdHlEYXRhLnNldE1heE9jY3VycmVuY2VzKGNhcGFiaWxpdHlEZWZpbml0aW9uLmdldE1heE9jY3VycmVuY2VzKCkpOworCQljYXBhYmlsaXR5RGF0YS5zZXREZXNjcmlwdGlvbihjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoY2FwYWJpbGl0eURhdGEsIENhcGFiaWxpdHlEYXRhLmNsYXNzKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW5nIGNhcGFiaWxpdHkgbm9kZSBpbiB0aGUgZ3JhcGguIHN0YXR1cyBpcyB7fSIsIGNyZWF0ZU5vZGUpOworCisJCXJldHVybiBjcmVhdGVOb2RlOworCX0KKworCXByaXZhdGUgRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FwYWJpbGl0eVZlcnRleChTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbikgeworCisJCUNhcGFiaWxpdHlEYXRhIGNhcGFiaWxpdHlEYXRhID0gbmV3IENhcGFiaWxpdHlEYXRhKCk7CisJCVN0cmluZyB1aWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRDYXBhYmlsaXR5VWlkKHJlc291cmNlSWQsIGNhcGFiaWxpdHlOYW1lKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0VW5pcXVlSWQodWlkKTsKKwkJTG9uZyBjcmVhdGlvblRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0Q3JlYXRpb25UaW1lKGNyZWF0aW9uVGltZSk7CisJCWNhcGFiaWxpdHlEYXRhLnNldE1vZGlmaWNhdGlvblRpbWUoY3JlYXRpb25UaW1lKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0VmFsaWRTb3VyY2VUeXBlcyhjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRWYWxpZFNvdXJjZVR5cGVzKCkpOworCQljYXBhYmlsaXR5RGF0YS5zZXRNaW5PY2N1cnJlbmNlcyhjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRNaW5PY2N1cnJlbmNlcygpKTsKKwkJY2FwYWJpbGl0eURhdGEuc2V0TWF4T2NjdXJyZW5jZXMoY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0TWF4T2NjdXJyZW5jZXMoKSk7CisJCWNhcGFiaWxpdHlEYXRhLnNldERlc2NyaXB0aW9uKGNhcGFiaWxpdHlEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShjYXBhYmlsaXR5RGF0YSk7CisKKwkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGluZyBjYXBhYmlsaXR5IG5vZGUgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMge30iLCBjcmVhdGVOb2RlKTsKKworCQlyZXR1cm4gY3JlYXRlTm9kZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5KFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgY2FwYWJpbGl0eU5hbWUsIENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEZWZpbml0aW9uKSB7CisKKwkJcmV0dXJuIGFkZENhcGFiaWxpdHkocmVzb3VyY2VJZCwgY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHlEZWZpbml0aW9uLCBmYWxzZSk7CisKKwl9CisKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkZWxldGVDYXBhYmlsaXR5RnJvbUdyYXBoKFN0cmluZyBjYXBhYmlsaXR5VWlkKSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVzdWx0U3RhdHVzID0gbnVsbDsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVQcm9wZXJ0aWVzU3RhdHVzID0gZGVsZXRlUHJvcGVydGllc09mQ2FwYWJpbGl0eShjYXBhYmlsaXR5VWlkKTsKKworCQlpZiAoZGVsZXRlUHJvcGVydGllc1N0YXR1cy5pc1JpZ2h0KCkgJiYgIWRlbGV0ZVByb3BlcnRpZXNTdGF0dXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQlyZXN1bHRTdGF0dXMgPSBkZWxldGVQcm9wZXJ0aWVzU3RhdHVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlpZiAocmVzdWx0U3RhdHVzID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIGRlbGV0aW5nIGNhcGFiaWxpdHkgZnJvbSBncmFwaCB7fSIsIGNhcGFiaWxpdHlVaWQpOworCQkJRWl0aGVyPENhcGFiaWxpdHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTm9kZVN0YXR1cyA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5KSwgY2FwYWJpbGl0eVVpZCwgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCQkJaWYgKGRlbGV0ZU5vZGVTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0U3RhdHVzID0gZGVsZXRlTm9kZVN0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQl9CisJCX0KKwkJaWYgKHJlc3VsdFN0YXR1cyAhPSBudWxsKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBkZWxldGUgY2FwYWJpbGl0eSB3aXRoIGlkIHt9LiBzdGF0dXM9e30iLCBjYXBhYmlsaXR5VWlkLCByZXN1bHRTdGF0dXMpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkRGVsZXRlTm9kZUVycm9yKCJEZWxldGUgY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlVaWQsIFN0cmluZy52YWx1ZU9mKHJlc3VsdFN0YXR1cykpOworCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMocmVzdWx0U3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsQ2FwYWJpbGl0aWVzKFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCisJCQlFaXRoZXI8TWFwPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsUmVzID0gZGVsZXRlQWxsQ2FwYWJpbGl0aWVzT2ZSZXNvdXJjZShyZXNvdXJjZUlkKTsKKwkJCWlmIChkZWxldGVBbGxSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlQWxsUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgY2FwYWJpbGl0aWVzIG9mIHJlc291cmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUlkLCBzdGF0dXMpOworCQkJCX0KKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gdmFsdWUgPSBkZWxldGVBbGxSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh2YWx1ZSk7CisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRXhlY3V0ZVJvbGxiYWNrRXJyb3IoIlJvbGxiYWNrIG9uIGdyYXBoIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsQ2FwYWJpbGl0aWVzKFN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJcmV0dXJuIGRlbGV0ZUFsbENhcGFiaWxpdGllcyhyZXNvdXJjZUlkLCBmYWxzZSk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxDYXBhYmlsaXRpZXNPZlJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkKSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHJlc3VsdFN0YXR1cyA9IG51bGw7CisJCU1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCVNldDxTdHJpbmc+IGNhc2VJbnNlbnNpdGl2ZUNhcGFiaWxpdHlOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY2FwYWJpbGl0aXNSZXMgPSBnZXRDYXBhYmlsaXRpc09mUmVzb3VyY2VPbmx5KHJlc291cmNlSWQsIGNhcGFiaWxpdGllcywgY2FzZUluc2Vuc2l0aXZlQ2FwYWJpbGl0eU5hbWVzKTsKKwkJaWYgKGNhcGFiaWxpdGlzUmVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNhcGFiaWxpdGlzUmVzKTsKKwkJfQorCisJCWlmIChjYXBhYmlsaXRpZXMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKworCQlmb3IgKEVudHJ5PFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+IGVudHJ5IDogY2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCVN0cmluZyBjYXBhYmlsaXR5VWlkID0gY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKworCQkJbG9nLmRlYnVnKCJCZWZvcmUgZGVsZXRpbmcgcHJvcGVydGllcyBvZiBjYXBhYmlsaXR5IHt9IGZyb20gZ3JhcGgiLCBjYXBhYmlsaXR5VWlkKTsKKworCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUHJvcGVydGllc1N0YXR1cyA9IGRlbGV0ZVByb3BlcnRpZXNPZkNhcGFiaWxpdHkoY2FwYWJpbGl0eVVpZCk7CisJCQlpZiAoZGVsZXRlUHJvcGVydGllc1N0YXR1cy5pc1JpZ2h0KCkgJiYgIWRlbGV0ZVByb3BlcnRpZXNTdGF0dXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJcmVzdWx0U3RhdHVzID0gZGVsZXRlUHJvcGVydGllc1N0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQl9CisJCQlpZiAocmVzdWx0U3RhdHVzID09IG51bGwpIHsKKwkJCQlFaXRoZXI8Q2FwYWJpbGl0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVOb2RlUmVzID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHkpLCBjYXBhYmlsaXR5VWlkLCBDYXBhYmlsaXR5RGF0YS5jbGFzcyk7CisJCQkJaWYgKGRlbGV0ZU5vZGVSZXMuaXNSaWdodCgpKSB7CisJCQkJCXJlc3VsdFN0YXR1cyA9IGRlbGV0ZU5vZGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmIChyZXN1bHRTdGF0dXMgIT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBjYXBhYmlsaXR5IHt9IG9mIHJlc291cmNlIHt9IiwgY2FwYWJpbGl0eVVpZCwgcmVzb3VyY2VJZCk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkRGVsZXRlTm9kZUVycm9yKCJEZWxldGUgY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlVaWQsIFN0cmluZy52YWx1ZU9mKHJlc3VsdFN0YXR1cykpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzdWx0U3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjYXBhYmlsaXRpZXMpOworCisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjb252ZXJ0Q2FwYWJpbGl0eU1hcChNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0eU1hcCwgU3RyaW5nIG93bmVySWQsIFN0cmluZyBvd25lck5hbWUpIHsKKworCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gdHlwZVRvUmVxdWlyZW1lbnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWNhcGFiaWxpdHlNYXAuZm9yRWFjaCgoY2FwYWJpbGl0eU5hbWUsIGNhcGFiaWxpdHkpIC0+IHsKKwkJCWNhcGFiaWxpdHkuc2V0TmFtZShjYXBhYmlsaXR5TmFtZSk7CisJCQlpZiAodHlwZVRvUmVxdWlyZW1lbnRNYXAuY29udGFpbnNLZXkoY2FwYWJpbGl0eS5nZXRUeXBlKCkpKSB7CisJCQkJdHlwZVRvUmVxdWlyZW1lbnRNYXAuZ2V0KGNhcGFiaWxpdHkuZ2V0VHlwZSgpKS5hZGQoY2FwYWJpbGl0eSk7CisJCQl9IGVsc2UgeworCQkJCUxpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQlsaXN0LmFkZChjYXBhYmlsaXR5KTsKKwkJCQl0eXBlVG9SZXF1aXJlbWVudE1hcC5wdXQoY2FwYWJpbGl0eS5nZXRUeXBlKCksIGxpc3QpOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIHR5cGVUb1JlcXVpcmVtZW50TWFwOworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBnZXRDYXBhYmlsaXR5U291cmNlc0xpc3QoU3RyaW5nIHJlc291cmNlSWQsIExpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbUxpc3QpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcGVydGllc1RvTWF0Y2gucHV0KFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHJlc291cmNlSWQpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNwb25zZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcGVydGllc1RvTWF0Y2gsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJaWYgKGdldFJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGdldFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyB0b3NjYVJlc291cmNlTmFtZSA9ICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBnZXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKS5nZXQoMCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5nZXRUb3NjYVJlc291cmNlTmFtZSgpOworCQkJZGVyaXZlZEZyb21MaXN0LmFkZCh0b3NjYVJlc291cmNlTmFtZSk7CisJCX0KKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCXdoaWxlIChjaGlsZHJlbk5vZGVzLmlzTGVmdCgpKSB7CisKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPj4gcGFpckxpc3QgPSBjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEgbGVmdCA9IHBhaXJMaXN0LmdldCgwKS5sZWZ0OworCQkJZGVyaXZlZEZyb21MaXN0LmFkZCgoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgbGVmdC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQkJU3RyaW5nIGlkID0gbGVmdC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCWNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCBpZCwgR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0aWVzVG9DYXBhYmlsaXR5KENhcGFiaWxpdHlEYXRhIGNhcGFiaWxpdHlEYXRhLCBTdHJpbmcgY2FwYWJpbGl0eVR5cGUsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisJCVN0cmluZyBjYXBhYmlsaXR5VHlwZVVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZENhcGFiaWxpdHlUeXBlVWlkKGNhcGFiaWxpdHlUeXBlKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcyA9IGdldEFsbENhcGFiaWxpdHlUeXBlUHJvcGVydGllc0Zyb21BbGxEZXJpdmVkRnJvbShjYXBhYmlsaXR5VHlwZVVpZCk7CisJCWlmIChhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkgJiYgIWFsbFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcyBmb3IgY2FwYWJpbGl0eSB0eXBlICIgKyBjYXBhYmlsaXR5VHlwZSArICIgZnJvbSBncmFwaC4gc3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZSA9IG51bGw7CisKKwkJaWYgKGFsbFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLmlzTGVmdCgpICYmIGFsbFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLmxlZnQoKSAhPSBudWxsICYmICFhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcy5sZWZ0KCkudmFsdWUoKS5pc0VtcHR5KCkpIHsKKworCQkJcHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGUgPSBhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCUVpdGhlcjxMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUFuZFJlZHVjZVByb3BlcnRpZXNSZXMgPSB2YWxpZGF0ZVByb3BlcnR5VW5pcXVlbmVzcyhwcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZSwgcHJvcGVydGllcyk7CisJCQlpZiAodmFsaWRhdGVBbmRSZWR1Y2VQcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IHZhbGlkYXRlQW5kUmVkdWNlUHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHByb3BlcnRpZXMgdG8gY2FwYWJpbGl0eSB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCQl9CisJCX0KKworCQlFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnRpZXNUb0NhcGFiaWxpdHlSZXMgPSBwcm9wZXJ0eU9wZXJhdGlvbi5hZGRQcm9wZXJ0aWVzVG9FbGVtZW50VHlwZShjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSwgcHJvcGVydGllcyk7CisJCWlmIChhZGRQcm9wZXJ0aWVzVG9DYXBhYmlsaXR5UmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gYWRkUHJvcGVydGllc1RvQ2FwYWJpbGl0eVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcHJvcGVydGllcyB0byBjYXBhYmlsaXR5IHt9IGluIGdyYXBoLiBTdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChhZGRQcm9wZXJ0aWVzVG9DYXBhYmlsaXR5UmVzLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnRpZXNUb0NhcGFiaWxpdHkoVGl0YW5WZXJ0ZXggY2FwYWJpbGl0eVZlcnRleCwgU3RyaW5nIGNhcGFiaWxpdHlUeXBlLCBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcywgU3RyaW5nIHVuaXF1ZUlkKSB7CisJCVN0cmluZyBjYXBhYmlsaXR5VHlwZVVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZENhcGFiaWxpdHlUeXBlVWlkKGNhcGFiaWxpdHlUeXBlKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcyA9IGdldEFsbENhcGFiaWxpdHlUeXBlUHJvcGVydGllc0Zyb21BbGxEZXJpdmVkRnJvbShjYXBhYmlsaXR5VHlwZVVpZCk7CisJCWlmIChhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkgJiYgIWFsbFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcyBmb3IgY2FwYWJpbGl0eSB0eXBlIHt9IGZyb20gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIGNhcGFiaWxpdHlUeXBlLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIG9wZXJhdGlvblN0YXR1czsKKwkJfQorCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlID0gbnVsbDsKKworCQlpZiAoYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMuaXNMZWZ0KCkgJiYgYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMubGVmdCgpICE9IG51bGwgJiYgIWFsbFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSkgeworCisJCQlwcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZSA9IGFsbFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJRWl0aGVyPExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlQW5kUmVkdWNlUHJvcGVydGllc1JlcyA9IHZhbGlkYXRlUHJvcGVydHlVbmlxdWVuZXNzKHByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlLCBwcm9wZXJ0aWVzKTsKKwkJCWlmICh2YWxpZGF0ZUFuZFJlZHVjZVByb3BlcnRpZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gdmFsaWRhdGVBbmRSZWR1Y2VQcm9wZXJ0aWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcHJvcGVydGllcyB0byBjYXBhYmlsaXR5IHt9IGluIGdyYXBoLiBzdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5VmVydGV4LCBvcGVyYXRpb25TdGF0dXMpOworCQkJCXJldHVybiBvcGVyYXRpb25TdGF0dXM7CisJCQl9CisJCX0KKworCQlTdHJpbmcgY2FwYWJpbHR5SWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoY2FwYWJpbGl0eVZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnRpZXNUb0NhcGFiaWxpdHlSZXMgPSBwcm9wZXJ0eU9wZXJhdGlvbi5hZGRQcm9wZXJ0aWVzVG9FbGVtZW50VHlwZShjYXBhYmlsaXR5VmVydGV4LCBjYXBhYmlsdHlJZCwgTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHksIHByb3BlcnRpZXMpOworCQlpZiAoIWFkZFByb3BlcnRpZXNUb0NhcGFiaWxpdHlSZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHByb3BlcnRpZXMgdG8gY2FwYWJpbGl0eSB7fSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9IiwgY2FwYWJpbHR5SWQsIGFkZFByb3BlcnRpZXNUb0NhcGFiaWxpdHlSZXMpOworCQl9CisJCXJldHVybiBhZGRQcm9wZXJ0aWVzVG9DYXBhYmlsaXR5UmVzOworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxQcm9wZXJ0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVQcm9wZXJ0eVVuaXF1ZW5lc3MoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZSwgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKwkJRWl0aGVyPExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KHByb3BlcnRpZXMpOworCisJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5IDogcHJvcGVydGllcykgeworCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKKwkJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eS5nZXRUeXBlKCk7CisJCQlQcm9wZXJ0eURlZmluaXRpb24gZGVmYXVsdFByb3BlcnR5ID0gbnVsbDsKKworCQkJaWYgKHByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKKwkJCQlkZWZhdWx0UHJvcGVydHkgPSBwcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZS5nZXQocHJvcGVydHlOYW1lKTsKKwkJCQlpZiAocHJvcGVydHlUeXBlICE9IG51bGwgJiYgZGVmYXVsdFByb3BlcnR5LmdldFR5cGUoKSAhPSBudWxsICYmICFkZWZhdWx0UHJvcGVydHkuZ2V0VHlwZSgpLmVxdWFscyhwcm9wZXJ0eVR5cGUpKSB7CisJCQkJCWxvZy5lcnJvcigiIFByb3BlcnR5IHdpdGggbmFtZSB7fSBhbmQgZGlmZmVyZW50IHR5cGUgYWxyZWFkeSBleGlzdHMuIiwgcHJvcGVydHlOYW1lKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLlBST1BFUlRZX05BTUVfQUxSRUFEWV9FWElTVFMpOworCQkJCX0gZWxzZSB7CisJCQkJCXByb3BlcnR5LnNldFR5cGUoZGVmYXVsdFByb3BlcnR5LmdldFR5cGUoKSk7CisJCQkJCVN0cmluZyBpbm5lclR5cGUgPSBkZWZhdWx0UHJvcGVydHkuZ2V0U2NoZW1hKCkgPT0gbnVsbCA/IG51bGwgOiBkZWZhdWx0UHJvcGVydHkuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKSA9PSBudWxsID8gbnVsbCA6IGRlZmF1bHRQcm9wZXJ0eS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKTsKKworCQkJCQlpZiAocHJvcGVydHkuZ2V0U2NoZW1hKCkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpICE9IG51bGwpIHsKKwkJCQkJCXByb3BlcnR5LmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZShpbm5lclR5cGUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVVcGRhdGVDYXBhYmlsaXR5UHJvcGVydHkoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5KSB7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsRGF0YVR5cGVzID0gYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlLmdldEFsbCgpOworCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiVXBkYXRlUHJvcGVydHlWYWx1ZU9uQ29tcG9uZW50SW5zdGFuY2UiLCAiRmFpbGVkIHRvIHVwZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBvbiBpbnN0YW5jZS4gU3RhdHVzIGlzICIgKyBzdGF0dXMsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnR5T3BlcmF0aW9uLnZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkocHJvcGVydHksIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVDYXBhYmlsaXR5UHJvcGVydGllcyhMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcykgeworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5IDogcHJvcGVydGllcykgeworCQkJcmVzdWx0ID0gdmFsaWRhdGVVcGRhdGVDYXBhYmlsaXR5UHJvcGVydHkocHJvcGVydHkpOworCQkJaWYgKCFyZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UHJvcGVydHlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnRpZXNPZkNhcGFiaWxpdHkoU3RyaW5nIGNhcGFiaWxpdHlVaWQpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZGVsZXRpbmcgcHJvcGVydGllcyBvZiBjYXBhYmlsaXR5IHt9IGZyb20gZ3JhcGggIiwgY2FwYWJpbGl0eVVpZCk7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUHJvcGVydGllc1N0YXR1cyA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5KSwgY2FwYWJpbGl0eVVpZCwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZLAorCQkJCU5vZGVUeXBlRW51bS5Qcm9wZXJ0eSwgUHJvcGVydHlEYXRhLmNsYXNzKTsKKwkJaWYgKGRlbGV0ZVByb3BlcnRpZXNTdGF0dXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVQcm9wZXJ0aWVzU3RhdHVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIHByb3BlcnRpZXMgb2YgY2FwYWJpbGl0eSB3aXRoIGlkIHt9LiBzdGF0dXM9e30iLCBjYXBhYmlsaXR5VWlkLCBzdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIlRoZSBDYXBhYmlsaXR5IHdpdGggaWQge30gaGF2ZSBubyBQcm9wZXJ0aWVzLiBzdGF0dXM9e30iLCBjYXBhYmlsaXR5VWlkLCBzdGF0dXMpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChkZWxldGVQcm9wZXJ0aWVzU3RhdHVzLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVByb3BlcnRpZXNPZkNhcGFiaWxpdHkoU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcgY2FwYWJpbGl0eVR5cGUsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBuZXdQcm9wZXJ0aWVzKSB7CisJCXJldHVybiB1cGRhdGVQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5KHVuaXF1ZUlkLCBjYXBhYmlsaXR5VHlwZSwgbmV3UHJvcGVydGllcywgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydGllc09mQ2FwYWJpbGl0eShTdHJpbmcgdW5pcXVlSWQsIFN0cmluZyBjYXBhYmlsaXR5VHlwZSwgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IG5ld1Byb3BlcnRpZXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJRWl0aGVyPENhcGFiaWxpdHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2FwYWJpbHR5UmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHkpLCB1bmlxdWVJZCwgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCQkJaWYgKGNhcGFiaWx0eVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhjYXBhYmlsdHlSZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisJCQlDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YSA9IGNhcGFiaWx0eVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcHJvcGVydGllc1ZhbGlkYXRpb25SZXMgPSB2YWxpZGF0ZUNhcGFiaWxpdHlQcm9wZXJ0aWVzKG5ld1Byb3BlcnRpZXMpOworCQkJCWlmICghcHJvcGVydGllc1ZhbGlkYXRpb25SZXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChwcm9wZXJ0aWVzVmFsaWRhdGlvblJlcyk7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUHJvcGVydGllc1JlcyA9IGRlbGV0ZVByb3BlcnRpZXNPZkNhcGFiaWxpdHkodW5pcXVlSWQpOworCQkJCWlmIChkZWxldGVQcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKSAmJiAhZGVsZXRlUHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZGVsZXRlUHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQl9CisJCQl9CisJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCQlFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnRpZXNSZXMgPSBhZGRQcm9wZXJ0aWVzVG9DYXBhYmlsaXR5KGNhcGFiaWxpdHlEYXRhLCBjYXBhYmlsaXR5VHlwZSwgbmV3UHJvcGVydGllcyk7CisJCQkJaWYgKGFkZFByb3BlcnRpZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFkZFByb3BlcnRpZXNSZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYWRkUHJvcGVydGllc1Jlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgcHJvcGVydGllcyBvZiBjYXBhYmlsaXR5IHt9LiBTdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgcmVzdWx0KTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoIWluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVJlbGF0ZWRUb1Jlc291cmNlSW5zdGFuY2UoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIGNhcGFiaWxpdHlVaWQpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5ID0gbnVsbDsKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXRpZXNSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSwgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCQlpZiAoZ2V0Q2FwYWJpbGl0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3IgPSBnZXRDYXBhYmlsaXRpZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgY2FwYWJpbGl0aWVzIGZvciByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0gZWxzZSB7CisJCQlMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+IGNhcGFiaWxpdHlQYWlyc0xpc3QgPSBnZXRDYXBhYmlsaXRpZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlMaXN0PENhcGFiaWxpdHlEYXRhPiBjYXBhYmlsaXR5UGFpciA9IGNhcGFiaWxpdHlQYWlyc0xpc3Quc3RyZWFtKCkuZmlsdGVyKHBhaXIgLT4gcGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoY2FwYWJpbGl0eVVpZCkpLm1hcChwYWlyIC0+IHBhaXIuZ2V0TGVmdCgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJaWYgKGNhcGFiaWxpdHlQYWlyLmlzRW1wdHkoKSkgeworCQkJCWVycm9yID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdHkge30gZm9yIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5VWlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJCX0gZWxzZSB7CisJCQkJY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHlQYWlyLmdldCgwKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhcGFiaWxpdHkpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbENhcGFiaWxpdHlUeXBlUHJvcGVydGllc0Zyb21BbGxEZXJpdmVkRnJvbShTdHJpbmcgZmlyc3RQYXJlbnRUeXBlKSB7CisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gYWxsUHJvcGVyaWVzID0gbmV3IEhhc2hNYXA8PigpOworCQlyZXR1cm4gZ2V0Q2FwYWJpbGl0eVR5cGVQcm9wZXJ0aWVzRnJvbURlcml2ZWRGcm9tUmVjdXJzaXZlbHkoZmlyc3RQYXJlbnRUeXBlLCBhbGxQcm9wZXJpZXMpOworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5VHlwZVByb3BlcnRpZXNGcm9tRGVyaXZlZEZyb21SZWN1cnNpdmVseShTdHJpbmcgbmV4dFBhcmVudFR5cGUsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gYWxsUHJvcGVyaWVzKSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlUeXBlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlKSwgbmV4dFBhcmVudFR5cGUsIEdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00sCisJCQkJTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCBDYXBhYmlsaXR5VHlwZURhdGEuY2xhc3MpOworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCWlmIChjaGlsZHJlbk5vZGVzLnJpZ2h0KCkudmFsdWUoKSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQllcnJvciA9IGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggZGVyaXZlZCBmcm9tIG5vZGUgZm9yIGNhcGFiaWxpdHkgdHlwZSB7fSwgZXJyb3I6IHt9IiwgbmV4dFBhcmVudFR5cGUsIGVycm9yKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJEZXJpdmVkIGZyb20gbm9kZSBpcyBub3QgZm91bmQgZm9yIHR5cGUge30gLSB0aGlzIGlzIE9LIGZvciByb290IGNhcGFiaWxpdHkuIik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGFsbFByb3Blcmllcyk7CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMgPSBwcm9wZXJ0eU9wZXJhdGlvbi5maW5kUHJvcGVydGllc09mTm9kZShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUsIG5leHRQYXJlbnRUeXBlKTsKKwkJCWlmIChhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkgJiYgIWFsbFByb3BlcnRpZXNPZkNhcGFiaWxpdHlUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCWVycm9yID0gYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgZm9yIGNhcGFiaWxpdHkgdHlwZSB7fSBmcm9tIGdyYXBoLiBTdGF0dXMgaXMge30iLCBuZXh0UGFyZW50VHlwZSwgZXJyb3IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQkJfSBlbHNlIGlmIChhbGxQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5VHlwZVJlcy5pc0xlZnQoKSkgeworCQkJCWlmIChhbGxQcm9wZXJpZXMuaXNFbXB0eSgpKSB7CisJCQkJCWFsbFByb3Blcmllcy5wdXRBbGwoYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCWFsbFByb3Blcmllcy5wdXRBbGwoYWxsUHJvcGVydGllc09mQ2FwYWJpbGl0eVR5cGVSZXMubGVmdCgpLnZhbHVlKCkuZW50cnlTZXQoKS5zdHJlYW0oKS5maWx0ZXIoZSAtPiAhYWxsUHJvcGVyaWVzLmNvbnRhaW5zS2V5KGUuZ2V0S2V5KCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoRW50cnk6OmdldEtleSwgRW50cnk6OmdldFZhbHVlKSkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBnZXRDYXBhYmlsaXR5VHlwZVByb3BlcnRpZXNGcm9tRGVyaXZlZEZyb21SZWN1cnNpdmVseShjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpLmdldCgwKS5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgYWxsUHJvcGVyaWVzKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUzOTljCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9DYXBhYmlsaXR5VHlwZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eVR5cGVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJjYXBhYmlsaXR5LXR5cGUtb3BlcmF0aW9uIikKK3B1YmxpYyBjbGFzcyBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIGltcGxlbWVudHMgSUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uIHsKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisKKwlwdWJsaWMgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENhcGFiaWxpdHlUeXBlT3BlcmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHRpdGFuR2VuZXJpY0RhbworCSAqLworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5VHlwZSgKKwkJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0aW9uUmVzID0gdmFsaWRhdGVVcGRhdGVQcm9wZXJ0aWVzKAorCQkJCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24pOworCQkJaWYgKHZhbGlkYXRpb25SZXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJPbmUgb3IgYWxsIHByb3BlcnRpZXMgb2YgY2FwYWJpbGl0eSB0eXBlIHt9IG5vdCB2YWxpZC4gc3RhdHVzIGlzIHt9IiwKKwkJCQkJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwgdmFsaWRhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIKKwkJCQkJCS5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHZhbGlkYXRpb25SZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJTdGF0dXMgPSBhZGRDYXBhYmlsaXR5VHlwZVRvR3JhcGgoCisJCQkJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbik7CisKKwkJCWlmIChlaXRoZXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGNhcGFiaWxpdHkge30gdG8gR3JhcGguIHN0YXR1cyBpcyB7fSIsIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwKKwkJCQkJCWVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIKKwkJCQkJCS5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfSBlbHNlIHsKKwkJCQlDYXBhYmlsaXR5VHlwZURhdGEgY2FwYWJpbGl0eVR5cGVEYXRhID0gZWl0aGVyU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmUmVzdWx0ID0gY29udmVydENURGF0YVRvQ1REZWZpbml0aW9uKGNhcGFiaWxpdHlUeXBlRGF0YSk7CisJCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGlzIHt9IiwgY2FwYWJpbGl0eVR5cGVEZWZSZXN1bHQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNhcGFiaWxpdHlUeXBlRGVmUmVzdWx0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisKKwkJZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVVcGRhdGVQcm9wZXJ0aWVzKAorCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbikgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCWlmIChjYXBhYmlsaXR5VHlwZURlZmluaXRpb24uZ2V0UHJvcGVydGllcygpICE9IG51bGwgJiYgIWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpCisJCQkJJiYgY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLmdldERlcml2ZWRGcm9tKCkgIT0gbnVsbCkgeworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxQcm9wZXJ0aWVzUmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbgorCQkJCQkuZ2V0QWxsQ2FwYWJpbGl0eVR5cGVQcm9wZXJ0aWVzRnJvbUFsbERlcml2ZWRGcm9tKGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5nZXREZXJpdmVkRnJvbSgpKTsKKwkJCWlmIChhbGxQcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKQorCQkJCQkmJiAhYWxsUHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQllcnJvciA9IGFsbFByb3BlcnRpZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggZGVyaXZlZCBmcm9tIHByb3BlcnR5IG5vZGVzIGZvciBjYXBhYmlsaXR5IHR5cGUge30sIGVycm9yOiB7fSIsCisJCQkJCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uZ2V0VHlwZSgpLCBlcnJvcik7CisJCQl9CisJCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiAhYWxsUHJvcGVydGllc1Jlcy5sZWZ0KCkudmFsdWUoKS5pc0VtcHR5KCkpIHsKKwkJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGRlcml2ZWRGcm9tUHJvcGVydGllcyA9IGFsbFByb3BlcnRpZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLnN0cmVhbSgpCisJCQkJCQkuZmlsdGVyKGUgLT4gZGVyaXZlZEZyb21Qcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGUuZ2V0S2V5KCkpICYmIGUuZ2V0VmFsdWUoKS5nZXRUeXBlKCkgPT0gbnVsbCkKKwkJCQkJCS5mb3JFYWNoKGUgLT4gZS5nZXRWYWx1ZSgpLnNldFR5cGUoZGVyaXZlZEZyb21Qcm9wZXJ0aWVzLmdldChlLmdldEtleSgpKS5nZXRUeXBlKCkpKTsKKworCQkJCUVpdGhlcjxMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZVByb3BlcnRpZXNSZXMgPSBjYXBhYmlsaXR5T3BlcmF0aW9uCisJCQkJCQkudmFsaWRhdGVQcm9wZXJ0eVVuaXF1ZW5lc3MoYWxsUHJvcGVydGllc1Jlcy5sZWZ0KCkudmFsdWUoKSwgY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uCisJCQkJCQkJCS5nZXRQcm9wZXJ0aWVzKCkudmFsdWVzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisJCQkJaWYgKHZhbGlkYXRlUHJvcGVydGllc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJZXJyb3IgPSB2YWxpZGF0ZVByb3BlcnRpZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbik7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJLyoqCisJICogCisJICogY29udmVydCBiZXR3ZWVuIGdyYXBoIE5vZGUgb2JqZWN0IHRvIEphdmEgb2JqZWN0CisJICogCisJICogQHBhcmFtIGNhcGFiaWxpdHlUeXBlRGF0YQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNvbnZlcnRDVERhdGFUb0NURGVmaW5pdGlvbihDYXBhYmlsaXR5VHlwZURhdGEgY2FwYWJpbGl0eVR5cGVEYXRhKSB7CisJCWxvZy5kZWJ1ZygiVGhlIG9iamVjdCByZXR1cm5lZCBhZnRlciBjcmVhdGUgY2FwYWJpbGl0eSBpcyB7fSIsIGNhcGFiaWxpdHlUeXBlRGF0YSk7CisKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmUmVzdWx0ID0gbmV3IENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigKKwkJCQljYXBhYmlsaXR5VHlwZURhdGEuZ2V0Q2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbigpKTsKKworCQlyZXR1cm4gY2FwYWJpbGl0eVR5cGVEZWZSZXN1bHQ7CisJfQorCisJLyoqCisJICogCisJICogQWRkIGNhcGFiaWxpdHkgdHlwZSB0byBncmFwaC4KKwkgKiAKKwkgKiAxLiBBZGQgY2FwYWJpbGl0eSB0eXBlIG5vZGUKKwkgKiAKKwkgKiAyLiBBZGQgZWRnZSBiZXR3ZWVuIHRoZSBmb3JtZXIgbm9kZSB0byBpdHMgcGFyZW50KGlmIGV4aXN0cykKKwkgKiAKKwkgKiAzLiBBZGQgcHJvcGVydHkgbm9kZSBhbmQgYXNzb2NpYXRlIGl0IHRvIHRoZSBub2RlIGNyZWF0ZWQgYXQgIzEuIChwZXIKKwkgKiBwcm9wZXJ0eSAmIGlmIGV4aXN0cykKKwkgKiAKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPENhcGFiaWxpdHlUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZENhcGFiaWxpdHlUeXBlVG9HcmFwaCgKKwkJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24pIHsKKworCQlsb2cuZGVidWcoIkdvdCBjYXBhYmlsaXR5IHR5cGUge30iLCBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24pOworCisJCVN0cmluZyBjdFVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2FwYWJpbGl0eVR5cGVVaWQoY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJCS8vIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXRVbmlxdWVJZChjdFVuaXF1ZUlkKTsKKworCQlDYXBhYmlsaXR5VHlwZURhdGEgY2FwYWJpbGl0eVR5cGVEYXRhID0gYnVpbGRDYXBhYmlsaXR5VHlwZURhdGEoY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBjdFVuaXF1ZUlkKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgY2FwYWJpbGl0eSB0eXBlIHRvIGdyYXBoLiBjYXBhYmlsaXR5VHlwZURhdGEgPSB7fSIsIGNhcGFiaWxpdHlUeXBlRGF0YSk7CisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDVFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKGNhcGFiaWxpdHlUeXBlRGF0YSwKKwkJCQlDYXBhYmlsaXR5VHlwZURhdGEuY2xhc3MpOworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBjYXBhYmlsaXR5IHR5cGUgdG8gZ3JhcGguIHN0YXR1cyBpcyA9IHt9IiwgY3JlYXRlQ1RSZXN1bHQpOworCisJCWlmIChjcmVhdGVDVFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZUNUUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNhcGFiaWxpdHkgdHlwZSAiICsgY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLmdldFR5cGUoKSArICIgdG8gZ3JhcGguIHN0YXR1cyBpcyAiCisJCQkJCSsgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCUNhcGFiaWxpdHlUeXBlRGF0YSByZXN1bHRDVEQgPSBjcmVhdGVDVFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzTWFwID0gY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKTsKKwkJQ29sbGVjdGlvbjxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzTWFwICE9IG51bGwgPyBwcm9wZXJ0aWVzTWFwLnZhbHVlcygpIDogbnVsbDsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0aWVzVG9DYXBhYmxpdHlUeXBlID0gcHJvcGVydHlPcGVyYXRpb24KKwkJCQkuYWRkUHJvcGVydGllc1RvRWxlbWVudFR5cGUocmVzdWx0Q1RELmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5VHlwZSwgcHJvcGVydGllc01hcCk7CisJCWlmIChhZGRQcm9wZXJ0aWVzVG9DYXBhYmxpdHlUeXBlLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKAorCQkJCQkiRmFpbGVkIGFkZCBwcm9wZXJ0aWVzICIgKyBwcm9wZXJ0aWVzTWFwICsgIiB0byBjYXBhYmlsaXR5ICIgKyBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24uZ2V0VHlwZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoYWRkUHJvcGVydGllc1RvQ2FwYWJsaXR5VHlwZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJU3RyaW5nIGRlcml2ZWRGcm9tID0gY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLmdldERlcml2ZWRGcm9tKCk7CisJCWlmIChkZXJpdmVkRnJvbSAhPSBudWxsKSB7CisJCQlsb2cuZGVidWcoCisJCQkJCSJCZWZvcmUgY3JlYXRpbmcgcmVsYXRpb24gYmV0d2VlbiBjYXBhYmlsaXR5IHR5cGUgIiArIGN0VW5pcXVlSWQgKyAiIHRvIGl0cyBwYXJlbnQgIiArIGRlcml2ZWRGcm9tKTsKKwkJCVVuaXF1ZUlkRGF0YSBmcm9tID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUsIGN0VW5pcXVlSWQpOworCQkJVW5pcXVlSWREYXRhIHRvID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUsIGRlcml2ZWRGcm9tKTsKKwkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oZnJvbSwgdG8sCisJCQkJCUdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00sIG51bGwpOworCQkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGUgcmVsYXRpb24gYmV0d2VlbiBjYXBhYmlsaXR5IHR5cGUge30gdG8gaXRzIHBhcmVudCB7fS4gU3RhdHVzIGlzIHt9IiwgY3RVbmlxdWVJZCwgZGVyaXZlZEZyb20sIGNyZWF0ZVJlbGF0aW9uKTsKKwkJCWlmIChjcmVhdGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlQ1RSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZURhdGEgYnVpbGRDYXBhYmlsaXR5VHlwZURhdGEoQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwKKwkJCVN0cmluZyBjdFVuaXF1ZUlkKSB7CisKKwkJQ2FwYWJpbGl0eVR5cGVEYXRhIGNhcGFiaWxpdHlUeXBlRGF0YSA9IG5ldyBDYXBhYmlsaXR5VHlwZURhdGEoY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uKTsKKworCQljYXBhYmlsaXR5VHlwZURhdGEuZ2V0Q2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKGN0VW5pcXVlSWQpOworCQlMb25nIGNyZWF0aW9uRGF0ZSA9IGNhcGFiaWxpdHlUeXBlRGF0YS5nZXRDYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uKCkuZ2V0Q3JlYXRpb25UaW1lKCk7CisJCWlmIChjcmVhdGlvbkRhdGUgPT0gbnVsbCkgeworCQkJY3JlYXRpb25EYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCX0KKwkJY2FwYWJpbGl0eVR5cGVEYXRhLmdldENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24oKS5zZXRDcmVhdGlvblRpbWUoY3JlYXRpb25EYXRlKTsKKwkJY2FwYWJpbGl0eVR5cGVEYXRhLmdldENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24oKS5zZXRNb2RpZmljYXRpb25UaW1lKGNyZWF0aW9uRGF0ZSk7CisJCXJldHVybiBjYXBhYmlsaXR5VHlwZURhdGE7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlUeXBlKFN0cmluZyB1bmlxdWVJZCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisKKwkJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjdFJlc3VsdCA9IHRoaXMuZ2V0Q2FwYWJpbGl0eVR5cGVCeVVpZCh1bmlxdWVJZCk7CisKKwkJCWlmIChjdFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjdFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gY2FwYWJpbGl0eSB0eXBlIHt9LiAgU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHN0YXR1cyk7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGN0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGN0UmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBCdWlsZCBDYXBhYmlsaXR5IHR5cGUgb2JqZWN0IGZyb20gZ3JhcGggYnkgdW5pcXVlIGlkCisJICogCisJICogQHBhcmFtIHVuaXF1ZUlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eVR5cGVCeVVpZChTdHJpbmcgdW5pcXVlSWQpIHsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2FwYWJpbGl0eVR5cGVzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoCisJCQkJVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlKSwgdW5pcXVlSWQsIENhcGFiaWxpdHlUeXBlRGF0YS5jbGFzcyk7CisKKwkJaWYgKGNhcGFiaWxpdHlUeXBlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNhcGFiaWxpdHlUeXBlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkNhcGFiaWxpdHkgdHlwZSB7fSBjYW5ub3QgYmUgZm91bmQgaW4gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIHVuaXF1ZUlkLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJQ2FwYWJpbGl0eVR5cGVEYXRhIGN0RGF0YSA9IGNhcGFiaWxpdHlUeXBlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiA9IG5ldyBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24oCisJCQkJY3REYXRhLmdldENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24oKSk7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcHJvcGVydGllc1N0YXR1cyA9IGZpbGxQcm9wZXJ0aWVzKHVuaXF1ZUlkLCBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24pOworCQlpZiAocHJvcGVydGllc1N0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggcHJvcGVydGllcyBvZiBjYXBhYmlsaXR5IHR5cGUgIiArIHVuaXF1ZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocHJvcGVydGllc1N0YXR1cyk7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5VHlwZURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5VHlwZSksIHVuaXF1ZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCBDYXBhYmlsaXR5VHlwZURhdGEuY2xhc3MpOworCQlsb2cuZGVidWcoIkFmdGVyIHJldHJpZXZpbmcgREVSSVZFRF9GUk9NIG5vZGUgb2Yge30uIFN0YXR1cyBpcyB7fSIsIHVuaXF1ZUlkLCBwYXJlbnROb2RlKTsKKwkJaWYgKHBhcmVudE5vZGUuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IHBhcmVudE5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHRpdGFuT3BlcmF0aW9uU3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgdGhlIHBhcmVudCBjYXBhYmlsaXR5IG9mIGNhcGFiaWxpdHkgdHlwZSB7fS4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBkZXJpdmVkIGZyb20gbm9kZSB3YXMgZm91bmQKKwkJCUltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eVR5cGVEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQkJQ2FwYWJpbGl0eVR5cGVEYXRhIHBhcmVudENUID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXREZXJpdmVkRnJvbShwYXJlbnRDVC5nZXRDYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uKCkuZ2V0VHlwZSgpKTsKKwkJfQorCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjYXBhYmlsaXR5VHlwZURlZmluaXRpb24pOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaWxsUHJvcGVydGllcyhTdHJpbmcgdW5pcXVlSWQsIENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24pIHsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRQcm9wZXJ0aWVzT2ZOb2RlID0gcHJvcGVydHlPcGVyYXRpb24KKwkJCQkuZmluZFByb3BlcnRpZXNPZk5vZGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCB1bmlxdWVJZCk7CisJCWlmIChmaW5kUHJvcGVydGllc09mTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gZmluZFByb3BlcnRpZXNPZk5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJBZnRlciBsb29raW5nIGZvciBwcm9wZXJ0aWVzIG9mIHZlcnRleCB7fS4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCWlmIChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQuZXF1YWxzKHRpdGFuT3BlcmF0aW9uU3RhdHVzKSkgeworCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHRpdGFuT3BlcmF0aW9uU3RhdHVzOworCQkJfQorCQl9IGVsc2UgeworCQkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gZmluZFByb3BlcnRpZXNPZk5vZGUubGVmdCgpLnZhbHVlKCk7CisJCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaXNDYXBhYmlsaXR5VHlwZURlcml2ZWRGcm9tKFN0cmluZyBjaGlsZENhbmRpZGF0ZVR5cGUsCisJCQlTdHJpbmcgcGFyZW50Q2FuZGlkYXRlVHlwZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUpLCBjaGlsZENhbmRpZGF0ZVR5cGUpOworCQlFaXRoZXI8TGlzdDxDYXBhYmlsaXR5VHlwZURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzcG9uc2UgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUsIHByb3BlcnRpZXNUb01hdGNoLCBDYXBhYmlsaXR5VHlwZURhdGEuY2xhc3MpOworCQlpZiAoZ2V0UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IGdldFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggY2FwYWJpbGl0eSB0eXBlIHt9LCBlcnJvcjoge30iLCBjaGlsZENhbmRpZGF0ZVR5cGUsIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh0aXRhbk9wZXJhdGlvblN0YXR1cykpOworCQl9CisJCVN0cmluZyBjaGlsZFVuaXF1ZUlkID0gZ2V0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCkuZ2V0KDApLmdldFVuaXF1ZUlkKCk7CisJCVNldDxTdHJpbmc+IHRyYXZlbGxlZFR5cGVzID0gbmV3IEhhc2hTZXQ8PigpOworCQlkbyB7CisJCQl0cmF2ZWxsZWRUeXBlcy5hZGQoY2hpbGRVbmlxdWVJZCk7CisJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlUeXBlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5VHlwZSksIGNoaWxkVW5pcXVlSWQsCisJCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCBDYXBhYmlsaXR5VHlwZURhdGEuY2xhc3MpOworCQkJaWYgKGNoaWxkcmVuTm9kZXMuaXNSaWdodCgpKSB7CisJCQkJaWYgKGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IGdldFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBkZXJpdmVkIGZyb20gbm9kZSBmb3IgY2FwYWJpbGl0eSB0eXBlIHt9LCBlcnJvcjoge30iLCBjaGlsZENhbmRpZGF0ZVR5cGUsCisJCQkJCQkJdGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModGl0YW5PcGVyYXRpb25TdGF0dXMpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkRlcml2ZWQgZnJvbSBub2RlIGlzIG5vdCBmb3VuZCBmb3IgdHlwZSB7fSAtIHRoaXMgaXMgT0sgZm9yIHJvb3QgY2FwYWJpbGl0eS4iKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCQlTdHJpbmcgZGVyaXZlZEZyb21VbmlxdWVJZCA9IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCkuZ2V0KDApLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpOworCQkJaWYgKGRlcml2ZWRGcm9tVW5pcXVlSWQuZXF1YWxzKHBhcmVudENhbmRpZGF0ZVR5cGUpKSB7CisJCQkJbG9nLmRlYnVnKCJWZXJpZmllZCB0aGF0IGNhcGFiaWxpdHkgdHlwZSB7fSBkZXJpdmVzIGZyb20gY2FwYWJpbGl0eSB0eXBlIHt9IiwgY2hpbGRDYW5kaWRhdGVUeXBlLAorCQkJCQkJcGFyZW50Q2FuZGlkYXRlVHlwZSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQkJfQorCQkJY2hpbGRVbmlxdWVJZCA9IGRlcml2ZWRGcm9tVW5pcXVlSWQ7CisJCX0gd2hpbGUgKCF0cmF2ZWxsZWRUeXBlcy5jb250YWlucyhjaGlsZFVuaXF1ZUlkKSk7CisJCS8vIHRoaXMgc3RvcCBjb25kaXRpb24gc2hvdWxkIG5ldmVyIGJlIHVzZWQsIGlmIHdlIHVzZSBpdCwgd2UgaGF2ZSBhbgorCQkvLyBpbGxlZ2FsIGN5Y2xlIGluIGdyYXBoIC0gImRlcml2ZWQgZnJvbSIgaGllcmFyY2h5IGNhbm5vdCBiZSBjeWNsZWQuCisJCS8vIEl0J3MgaGVyZSBqdXN0IHRvIGF2b2lkIGluZmluaXRlIGxvb3AgaW4gY2FzZSB3ZSBoYXZlIHN1Y2ggY3ljbGUuCisJCWxvZy5lcnJvcigiRGV0ZWN0ZWQgYSBjeWNsZSBvZiBcImRlcml2ZWQgZnJvbVwiIGVkZ2VzIHN0YXJ0aW5nIGF0IGNhcGFiaWxpdHkgdHlwZSBub2RlIHt9IiwgY2hpbGRVbmlxdWVJZCk7CisJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwl9CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHByb3BlcnR5T3BlcmF0aW9uCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHlPcGVyYXRpb24oUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb24pIHsKKwkJdGhpcy5wcm9wZXJ0eU9wZXJhdGlvbiA9IHByb3BlcnR5T3BlcmF0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5VHlwZSgKKwkJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24pIHsKKworCQlyZXR1cm4gYWRkQ2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENhcGFiaWxpdHlUeXBlKFN0cmluZyB1bmlxdWVJZCkgeworCQlyZXR1cm4gZ2V0Q2FwYWJpbGl0eVR5cGUodW5pcXVlSWQsIGZhbHNlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg1ODg4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Db21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTg1MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkRpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXhQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5HcmFwaEVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Db21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eVJ1bGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkNvbXBvbmVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk9yaWdpblR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VJbnB1dDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5HZXRJbnB1dFZhbHVlSW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JQ29tcG9uZW50SW5zdGFuY2VDb25uZWN0ZWRFbGVtZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklucHV0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlbGF0aW9uc2hpcEltcGw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBdHRyaWJ1dGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkF0dHJpYnV0ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXR0cmlidXRlVmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlJbnN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRJbnN0YW5jZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLklucHV0VmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLklucHV0c0RhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5VmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlbGF0aW9uc2hpcEluc3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlbGF0aW9uc2hpcFR5cGVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlcXVpcmVtZW50RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvck5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuRWRnZTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4UXVlcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQoImNvbXBvbmVudC1pbnN0YW5jZS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24geworCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBTZXJ2aWNlT3BlcmF0aW9uIHNlcnZpY2VPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJQ2FwYWJpbGl0eU9wZXJhdGlvbiBjYXBhYmlsaXR5T3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQ2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uIGNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIENhcGFiaWxpdHlUeXBlT3BlcmF0aW9uIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUmVxdWlyZW1lbnRPcGVyYXRpb24gcmVxdWlyZW1lbnRPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJpdmF0ZSBBcnRpZmFjdE9wZXJhdGlvbiBhcnRpZmFjdE9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvOworCisJQEF1dG93aXJlZAorCVByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCUlucHV0c09wZXJhdGlvbiBpbnB1dE9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIElBdHRyaWJ1dGVPcGVyYXRpb24gYXR0cmlidXRlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIGRhdGFUeXBlQ2FjaGU7CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHRpdGFuR2VuZXJpY0RhbworCSAqLworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFN0cmluZyBwYXJlbnRDb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgaW5zdGFuY2VOdW1iZXIsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHBhcmVudENvbXBvbmVudElkLCBub2RlVHlwZSwgaW5zdGFuY2VOdW1iZXIsIHRydWUsIGNvbXBvbmVudEluc3RhbmNlLCBjb21wSW5zdE5vZGVUeXBlLCBmYWxzZSwgaW5UcmFuc2FjdGlvbik7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIFN0cmluZyBpbnN0YW5jZU51bWJlciwgYm9vbGVhbiBpc0NyZWF0ZUxvY2dpY2FsTmFtZSwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsCisJCQlOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSwgYm9vbGVhbiBhbGxvd0RlbGV0ZWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUmVzID0gYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudChjb250YWluZXJDb21wb25lbnRJZCwgY29udGFpbmVyTm9kZVR5cGUsIGluc3RhbmNlTnVtYmVyLCBpc0NyZWF0ZUxvY2dpY2FsTmFtZSwgY29tcG9uZW50SW5zdGFuY2UsIGNvbXBJbnN0Tm9kZVR5cGUsIGFsbG93RGVsZXRlZCk7CisJCQlpZiAoYWRkUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHJlc291cmNlIGluc3RhbmNlIHt9IHRvIHNlcnZpY2Uge30uIFN0YXR1cyBpcyB7fSIsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXJDb21wb25lbnRJZCwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlDb21wb25lbnRJbnN0YW5jZSB2YWx1ZSA9IGFkZFJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHZhbHVlKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQljb21taXRPclJvbGxiYWNrKHJlc3VsdCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxUaXRhblZlcnRleCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIFN0cmluZyBpbnN0YW5jZU51bWJlciwgYm9vbGVhbiBpc0NyZWF0ZUxvY2dpY2FsTmFtZSwgQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsCisJCQlOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSwgYm9vbGVhbiBhbGxvd0RlbGV0ZWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgpIHsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFJlcyA9IGFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lck5vZGVUeXBlLCBpbnN0YW5jZU51bWJlciwgaXNDcmVhdGVMb2NnaWNhbE5hbWUsIGNvbXBvbmVudEluc3RhbmNlLCBjb21wSW5zdE5vZGVUeXBlLCBhbGxvd0RlbGV0ZWQsIG1ldGFkYXRhVmVydGV4KTsKKwkJCWlmIChhZGRSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcmVzb3VyY2UgaW5zdGFuY2Uge30gdG8gc2VydmljZSB7fS4gc3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lckNvbXBvbmVudElkLCBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVRpdGFuVmVydGV4IHZhbHVlID0gYWRkUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodmFsdWUpOworCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWNvbW1pdE9yUm9sbGJhY2socmVzdWx0KTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBTdHJpbmcgaW5zdGFuY2VOdW1iZXIsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBOb2RlVHlwZUVudW0gaW5zdE5vZGVUeXBlKSB7CisKKwkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lckNvbXBvbmVudElkLCBjb250YWluZXJOb2RlVHlwZSwgaW5zdGFuY2VOdW1iZXIsIGNvbXBvbmVudEluc3RhbmNlLCBpbnN0Tm9kZVR5cGUsIGZhbHNlKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBTdHJpbmcgcmVzb3VyY2VJbnN0VWlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVzID0gcmVtb3ZlQ29tcG9uZW50SW5zdGFuY2VGcm9tQ29tcG9uZW50KGNvbnRhaW5lck5vZGVUeXBlLCBjb250YWluZXJDb21wb25lbnRJZCwgcmVzb3VyY2VJbnN0VWlkKTsKKworCQkJaWYgKGRlbGV0ZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSByZXNvdXJjZSBpbnN0YW5jZSB7fSBmcm9tIGNvbXBvbmVudCB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0VWlkLCBjb250YWluZXJDb21wb25lbnRJZCwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlDb21wb25lbnRJbnN0YW5jZSB2YWx1ZSA9IGRlbGV0ZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHZhbHVlKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQljb21taXRPclJvbGxiYWNrKHJlc3VsdCk7CisJCQl9CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBTdHJpbmcgcmVzb3VyY2VJbnN0VWlkKSB7CisKKwkJcmV0dXJuIGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbnRhaW5lck5vZGVUeXBlLCBjb250YWluZXJDb21wb25lbnRJZCwgcmVzb3VyY2VJbnN0VWlkLCBmYWxzZSk7CisJfQorCisJcHJpdmF0ZSA8VD4gdm9pZCBjb21taXRPclJvbGxiYWNrKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQpIHsKKwkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVQYXJlbnQoU3RyaW5nIHBhcmVudElkLCBTdHJpbmcgdW5pcUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXMgPSB2YWxpZGF0ZVBhcmVudG9uR3JhcGgocGFyZW50SWQsIHVuaXFJZCwgaW5UcmFuc2FjdGlvbik7CisKKwkJaWYgKHVwZGF0ZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHVwZGF0ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHJlc291cmNlIGluc3RhbmNlIG5hbWUge30uIFN0YXR1cyBpcyB7fSIsIHVuaXFJZCwgc3RhdHVzKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUJvb2xlYW4gdmFsdWUgPSB1cGRhdGVSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodmFsdWUpOworCisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZVBhcmVudG9uR3JhcGgoU3RyaW5nIHBhcmVudElkLCBTdHJpbmcgdW5pcUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCWlmIChncmFwaFJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGdyYXBoLiBzdGF0dXMgaXMge30iLCBncmFwaFJlcyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGdyYXBoUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXMubGVmdCgpLnZhbHVlKCk7CisJCXRyeSB7CisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkuaGFzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgdW5pcUlkKS52ZXJ0aWNlcygpOworCQkJaWYgKHZlcnRpY2VzID09IG51bGwgfHwgZmFsc2UgPT0gdmVydGljZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJfQorCisJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSB2ZXJ0aWNlcy5pdGVyYXRvcigpLm5leHQoKTsKKworCQkJVGl0YW5WZXJ0ZXhRdWVyeSBxdWVyeSA9IHZlcnRleC5xdWVyeSgpOworCQkJcXVlcnkgPSBxdWVyeS5sYWJlbHMoR3JhcGhFZGdlTGFiZWxzLlJFU09VUkNFX0lOU1QuZ2V0UHJvcGVydHkoKSkuZGlyZWN0aW9uKERpcmVjdGlvbi5JTik7CisJCQlJdGVyYWJsZTxWZXJ0ZXg+IHZlcnRzID0gcXVlcnkudmVydGljZXMoKTsKKwkJCWlmICh2ZXJ0cyA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJObyBlZGdlcyBpbiBncmFwaCBmb3IgY3JpdGVyaWEiKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJfQorCQkJSXRlcmF0b3I8VmVydGV4PiB2SXRlciA9IHZlcnRzLml0ZXJhdG9yKCk7CisJCQlpZiAodkl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJVmVydGV4IHZlcnQgPSB2SXRlci5uZXh0KCk7CisJCQkJLy8gdmVydC5nZXRQcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlTdHJpbmcgcmVzSW5zdE5hbWUgPSB2ZXJ0LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQkJCWlmIChyZXNJbnN0TmFtZS5lcXVhbHMocGFyZW50SWQpKQorCQkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoQm9vbGVhbi5UUlVFKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdChCb29sZWFuLkZBTFNFKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HcmFwaC50eCgpLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQoU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIFN0cmluZyBpbnN0YW5jZU51bWJlciwgYm9vbGVhbiBpc0NyZWF0ZUxvZ2ljYU5hbWUsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLAorCQkJTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUsIGJvb2xlYW4gYWxsb3dEZWxldGVkKSB7CisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gY3JlYXRlIGNvbXBvbmVudCBpbnN0YW5jZSB7fSBpbiBjb21wb25lbnQge30iLCBjb21wb25lbnRJbnN0YW5jZSwgY29udGFpbmVyQ29tcG9uZW50SWQpOworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG1ldGFkYXRhVmVydGV4ID0gdGl0YW5HZW5lcmljRGFvLmdldFZlcnRleEJ5UHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgY29udGFpbmVyQ29tcG9uZW50SWQpOworCQlpZiAobWV0YWRhdGFWZXJ0ZXguaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBtZXRhZGF0YVZlcnRleC5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudCA9IGFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQoY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbnRhaW5lck5vZGVUeXBlLCBpbnN0YW5jZU51bWJlciwgaXNDcmVhdGVMb2dpY2FOYW1lLCBjb21wb25lbnRJbnN0YW5jZSwgY29tcEluc3ROb2RlVHlwZSwKKwkJCQlhbGxvd0RlbGV0ZWQsIG1ldGFkYXRhVmVydGV4LmxlZnQoKS52YWx1ZSgpKTsKKworCQlpZiAoYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCVRpdGFuVmVydGV4IGNpVmVydGV4ID0gYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXMoY2lWZXJ0ZXgpOworCQlDb21wb25lbnRJbnN0YW5jZURhdGEgY3JlYXRlZENvbXBvbmVudEluc3RhbmNlID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgcHJvcGVydGllcywgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKworCQlDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVkUmVzb3VyY2VJbnN0YW5jZSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZShjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkpOworCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkUmVzb3VyY2VJbnN0YW5jZSk7CisKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gY29udGFpbmVyQ29tcG9uZW50SWQKKwkgKiBAcGFyYW0gY29udGFpbmVyTm9kZVR5cGUKKwkgKiBAcGFyYW0gaW5zdGFuY2VOdW1iZXIKKwkgKiBAcGFyYW0gaXNDcmVhdGVMb2dpY2FOYW1lCisJICogQHBhcmFtIGNvbXBvbmVudEluc3RhbmNlCisJICogQHBhcmFtIGNvbXBJbnN0Tm9kZVR5cGUKKwkgKiBAcGFyYW0gYWxsb3dEZWxldGVkCisJICogQHBhcmFtIG1ldGFkYXRhVmVydGV4CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KFN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBTdHJpbmcgaW5zdGFuY2VOdW1iZXIsIGJvb2xlYW4gaXNDcmVhdGVMb2dpY2FOYW1lLCBDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwKKwkJCU5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlLCBib29sZWFuIGFsbG93RGVsZXRlZCwgVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzOworCQlsb2cuZGVidWcoIkdvaW5nIHRvIGNyZWF0ZSBjb21wb25lbnQgaW5zdGFuY2Uge30gaW4gY29tcG9uZW50IHt9IiwgY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lckNvbXBvbmVudElkKTsKKwkJU3RyaW5nIGluc3RPcmlnaW5Db21wb25lbnRJZCA9IGNvbXBvbmVudEluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpOworCQlTdHJpbmcgbG9naWNhbE5hbWUgPSBjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCk7CisJCWlmIChpc0NyZWF0ZUxvZ2ljYU5hbWUpCisJCQlsb2dpY2FsTmFtZSA9IGNyZWF0ZUNvbXBvbmVudEluc3RMb2dpY2FsTmFtZShpbnN0YW5jZU51bWJlciwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpKTsKKworCQlDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhID0gYnVpbGRDb21wb25lbnRJbnN0YW5jZURhdGEoY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lckNvbXBvbmVudElkLCBsb2dpY2FsTmFtZSk7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG9yaWdpblZlcnRleEVpdGhlciA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIGluc3RPcmlnaW5Db21wb25lbnRJZCk7CisJCWlmIChvcmlnaW5WZXJ0ZXhFaXRoZXIuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCB2ZXJ0ZXggb2Ygb3JpZ2luIHJlc291cmNlIGZvciBpZCB7fSBlcnJvciB7fSIsIGluc3RPcmlnaW5Db21wb25lbnRJZCwgb3JpZ2luVmVydGV4RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9yaWdpblZlcnRleEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCVRpdGFuVmVydGV4IG9yaWdpblZlcnRleCA9IG9yaWdpblZlcnRleEVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKworCQlCb29sZWFuIGlzRGVsZXRlZCA9IChCb29sZWFuKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkobWV0YWRhdGFWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfREVMRVRFRC5nZXRQcm9wZXJ0eSgpKTsKKworCQlpZiAoIWFsbG93RGVsZXRlZCAmJiAoaXNEZWxldGVkICE9IG51bGwpICYmIChpc0RlbGV0ZWQgPT0gdHJ1ZSkpIHsKKwkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IHt9IGlzIGFscmVhZHkgZGVsZXRlZC4gQ2Fubm90IGFkZCBjb21wb25lbnQgaW5zdGFuY2UiLCBpbnN0T3JpZ2luQ29tcG9uZW50SWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJfQorCQlTdHJpbmcgb3JpZ2luVHlwZSA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShvcmlnaW5WZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSk7CisJCVN0cmluZyByZXNvdXJjZVR5cGUgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkob3JpZ2luVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSk7CisJCWRldGVjdE9yaWdpblR5cGUob3JpZ2luVHlwZSwgY29tcG9uZW50SW5zdGFuY2VEYXRhLCByZXNvdXJjZVR5cGUpOworCisJCWxvZy50cmFjZSgiQmVmb3JlIGFkZGluZyBjb21wb25lbnQgaW5zdGFuY2UgdG8gZ3JhcGguIGNvbXBvbmVudEluc3RhbmNlRGF0YSA9IHt9IiwgY29tcG9uZW50SW5zdGFuY2VEYXRhKTsKKworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDSVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKGNvbXBvbmVudEluc3RhbmNlRGF0YSk7CisKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgY29tcG9uZW50IGluc3RhbmNlIHRvIGdyYXBoLiBzdGF0dXMgaXMgPSB7fSIsIGNyZWF0ZUNJUmVzdWx0KTsKKworCQlpZiAoY3JlYXRlQ0lSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlzdGF0dXMgPSBjcmVhdGVDSVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiQWRkIENvbXBvbmVudCBJbnN0YW5jZSIpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGNvbXBvbmVudCBpbnN0YW5jZSBub2RlIGluIGdyYXBoLiBzdGF0dXMgaXMge30iLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCVRpdGFuVmVydGV4IGNyZWF0ZWRDb21wb25lbnRJbnN0YW5jZVZlcnRleCA9IGNyZWF0ZUNJUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVDb250YWluZXJSZXMgPSBhc3NvY2lhdGVDb250YWluZXJDb21wVG9Db21wb25lbnRJbnN0YW5jZShtZXRhZGF0YVZlcnRleCwgY3JlYXRlZENvbXBvbmVudEluc3RhbmNlVmVydGV4LCBsb2dpY2FsTmFtZSk7CisKKwkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlVW5pcXVlSWQgPSBjb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKTsKKwkJaWYgKCFhc3NvY2lhdGVDb250YWluZXJSZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkFkZCBDb21wb25lbnQgSW5zdGFuY2UiKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSBjb250YWluZXIgY29tcG9uZW50IHt9IHRvIGNvbXBvbmVudCBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY29udGFpbmVyQ29tcG9uZW50SWQsIGNvbXBvbmVudEluc3RhbmNlVW5pcXVlSWQsIGFzc29jaWF0ZUNvbnRhaW5lclJlcyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFzc29jaWF0ZUNvbnRhaW5lclJlcyk7CisJCX0KKwkJU3RyaW5nIG9yaWdpbklkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGNyZWF0ZWRDb21wb25lbnRJbnN0YW5jZVZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UWVBFLmdldFByb3BlcnR5KCkpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZVRvSW5zdE9yaWdpbkNvbXBvbmVudCA9IGFzc29jaWF0ZVRvSW5zdE9yaWdpbkNvbXBvbmVudChjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIG9yaWdpblZlcnRleCwgb3JpZ2luSWQpOworCQlpZiAoIWFzc29jaWF0ZVRvSW5zdE9yaWdpbkNvbXBvbmVudC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiQWRkIENvbXBvbmVudCBJbnN0YW5jZSIpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB0byBpdHMgb3JpZ2luIGNvbXBvbmVudCB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2VVbmlxdWVJZCwgY29tcG9uZW50SW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldENvbXBvbmVudFVpZCgpLCBhc3NvY2lhdGVUb0luc3RPcmlnaW5Db21wb25lbnQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChhc3NvY2lhdGVUb0luc3RPcmlnaW5Db21wb25lbnQpOworCQl9CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQ29tcEluc3RUb1JlcXVpcmVtZW50cyA9IGFzc29jaWF0ZUNvbXBJbnN0VG9SZXF1aXJlbWVudHMoY3JlYXRlZENvbXBvbmVudEluc3RhbmNlVmVydGV4LCBjb250YWluZXJOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSwgb3JpZ2luSWQpOworCQlpZiAoIWFzc29jaWF0ZUNvbXBJbnN0VG9SZXF1aXJlbWVudHMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoIkFkZCBDb21wb25lbnQgSW5zdGFuY2UiKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSBjb21wb25lbnQgaW5zdGFuY2Uge30gdG8gaXRzIG9yaWdpbiByZXF1aXJlbWVudHMuIFN0YXR1cyBpcyB7fSIsIGNvbXBvbmVudEluc3RhbmNlVW5pcXVlSWQsIGFzc29jaWF0ZUNvbXBJbnN0VG9SZXF1aXJlbWVudHMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChhc3NvY2lhdGVDb21wSW5zdFRvUmVxdWlyZW1lbnRzKTsKKwkJfQorCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVDb21wSW5zdFRvQ2FwYWJpbGl0aWVzID0gYXNzb2NpYXRlQ29tcEluc3RUb0NhcGFiaWxpdGllcyhjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIGNvbnRhaW5lck5vZGVUeXBlLCBjb21wSW5zdE5vZGVUeXBlLCBvcmlnaW5JZCk7CisJCWlmICghYXNzb2NpYXRlQ29tcEluc3RUb0NhcGFiaWxpdGllcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiQWRkIENvbXBvbmVudCBJbnN0YW5jZSIpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB0byBpdHMgb3JpZ2luIGNhcGFiaWxpdGllcy4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2VVbmlxdWVJZCwgYXNzb2NpYXRlQ29tcEluc3RUb0NhcGFiaWxpdGllcyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFzc29jaWF0ZUNvbXBJbnN0VG9DYXBhYmlsaXRpZXMpOworCQl9CisJCS8vIENhcGFiaWxpdHkgaW5zdGFuY2Ugd2l0aCBwcm9wZXJ0eSB2YWx1ZXMgaW1wbGVtZW50YXRpb24KKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZXNSZXMgPSBudWxsOworCQlFaXRoZXI8TGlzdDxHcmFwaFJlbGF0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5SW5zdGFuY2VzUmVzOworCQlzdGF0dXMgPSBudWxsOworCQlpZiAoIWlzQ3JlYXRlTG9naWNhTmFtZSkgeworCQkJLy8gaW4gY2FzZSBvZiBjbG9uaW5nIG9mIGNvbXBvbmVudCBpbnN0YW5jZQorCQkJbG9nLmRlYnVnKCJCZWZvcmUgY2xvbmluZyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlcyBvZiBjb21wb25lbnQgaW5zdGFuY2Uge30uIiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQljbG9uZUNhcGFiaWxpdHlJbnN0YW5jZXNSZXMgPSBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZXNPZlJlc291cmNlSW5zdGFuY2UoY3JlYXRlZENvbXBvbmVudEluc3RhbmNlVmVydGV4LCBjb21wb25lbnRJbnN0YW5jZSk7CisJCQlpZiAoY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmlzUmlnaHQoKSAmJiAhY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCXN0YXR1cyA9IGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY2xvbmUgY2FwYWJpbGl0eSBpbnN0YW5jZXMgb2YgY29tcG9uZW50IGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBzdGF0dXMpOworCQkJfQorCQkJbG9nLnRyYWNlKCJBZnRlciBjbG9uaW5nIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mIGNvbXBvbmVudCBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgc3RhdHVzKTsKKwkJfSBlbHNlIGlmIChjb250YWluZXJOb2RlVHlwZS5lcXVhbHMoTm9kZVR5cGVFbnVtLlJlc291cmNlKSAmJiBjb21wb25lbnRJbnN0YW5jZS5nZXRDYXBhYmlsaXRpZXMoKSAhPSBudWxsICYmICFjb21wb25lbnRJbnN0YW5jZS5nZXRDYXBhYmlsaXRpZXMoKS5pc0VtcHR5KCkpIHsKKwkJCS8vIGluIGNhc2Ugb2YgY3JlYXRpb24gZnJvbSBzY2FyCisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0aWVzUmVzID0gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlc1dpdGhQcm9wZXJ0eVZhbHVlcyhjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIGNvbXBvbmVudEluc3RhbmNlVW5pcXVlSWQsIGNvbXBvbmVudEluc3RhbmNlLmdldENhcGFiaWxpdGllcygpLCB0cnVlKTsKKwkJCWlmICghYWRkUHJvcGVydGllc1Jlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJc3RhdHVzID0gYWRkUHJvcGVydGllc1JlczsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZXMgd2l0aCBwcm9wZXJ0eSB2YWx1ZXMgZm9yIGNvbXBvbmVudCBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgc3RhdHVzKTsKKwkJCX0KKwkJfQorCQlpZiAoc3RhdHVzID09IG51bGwgJiYgY29udGFpbmVyTm9kZVR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5TZXJ2aWNlKSkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXMoY3JlYXRlZENvbXBvbmVudEluc3RhbmNlVmVydGV4KTsKKwkJCUNvbXBvbmVudEluc3RhbmNlRGF0YSBjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2UgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UuZ2V0TmFtZSgpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCBwcm9wZXJ0aWVzLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCQkJaWYgKGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlc1JlcyA9PSBudWxsIHx8IGNsb25lQ2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQkvLyBpbiBjYXNlIG9mIGNyZWF0aW5nIG9mIHNlcnZpY2UKKwkJCQlsb2cudHJhY2UoIkJlZm9yZSBhc3NvY2lhdGluZyBjb21wb25lbnQgaW5zdGFuY2Uge30gdG8gY2FwYWJpbGl0eSBpbnN0YW5jZXMgLiIsIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJCWFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5SW5zdGFuY2VzUmVzID0gYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VUb0NhcGFiaWxpdHlJbnN0YW5jZXNPZlJlc291cmNlSW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2UpOworCQkJCWlmIChhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZVRvQ2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkgJiYgIWFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5SW5zdGFuY2VzUmVzLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCQlzdGF0dXMgPSBhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZVRvQ2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlcyB0byBjb21wb25lbnQgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHN0YXR1cyk7CisJCQkJfQorCQkJCWxvZy50cmFjZSgiQWZ0ZXIgYXNzb2NpYXRpbmcgY29tcG9uZW50IGluc3RhbmNlIHt9IHRvIGNhcGFiaWxpdHkgaW5zdGFuY2VzIC4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgc3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gaW4gY2FzZSBvZiBjbG9uaW5nIG9mIHNlcnZpY2UKKwkJCQlsb2cudHJhY2UoIkJlZm9yZSBhc3NvY2lhdGluZyBjcmVhdGVkIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB0byBjbG9uZWQgY2FwYWJpbGl0eSBpbnN0YW5jZXMuIiwgY29tcG9uZW50SW5zdGFuY2VVbmlxdWVJZCk7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRpb25TdGF0dXMgPSBhc3NvY2lhdGVDcmVhdGVkQ29tcG9uZW50SW5zdGFuY2VUb0Nsb25lZENhcGFiaWxpdHlJbnN0YW5jZXMoY3JlYXRlZENvbXBvbmVudEluc3RhbmNlVmVydGV4LCBjb21wb25lbnRJbnN0YW5jZVVuaXF1ZUlkLCBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZXNSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCWlmICghYXNzb2NpYXRpb25TdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSAmJiAhYXNzb2NpYXRpb25TdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQkJc3RhdHVzID0gYXNzb2NpYXRpb25TdGF0dXM7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlcyB0byBjb21wb25lbnQgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHN0YXR1cyk7CisJCQkJfQorCQkJCWxvZy50cmFjZSgiQWZ0ZXIgYXNzb2NpYXRpbmcgY3JlYXRlZCBjb21wb25lbnQgaW5zdGFuY2Uge30gdG8gY2xvbmVkIGNhcGFiaWxpdHkgaW5zdGFuY2VzLiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJbnN0YW5jZVVuaXF1ZUlkLCBzdGF0dXMpOworCQkJfQorCQl9CisJCWlmIChzdGF0dXMgPT0gbnVsbCkgeworCQkJLy8gQ29tcG9uZW50SW5zdGFuY2UgY3JlYXRlZFJlc291cmNlSW5zdGFuY2UgPSBuZXcKKwkJCS8vIENvbXBvbmVudEluc3RhbmNlKGNyZWF0ZWRDb21wb25lbnRJbnN0YW5jZS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKSk7CisJCQkvLworCQkJLy8gU3RyaW5nIGljb24gPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkob3JpZ2luVmVydGV4LAorCQkJLy8gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JQ09OLmdldFByb3BlcnR5KCkpOworCQkJLy8gY3JlYXRlZFJlc291cmNlSW5zdGFuY2Uuc2V0SWNvbihpY29uKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8Q2FwYWJpbGl0eUluc3REYXRhLCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VzV2l0aFByb3BlcnR5VmFsdWVzKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXMsCisJCQlib29sZWFuIGlzTmV3bHlDcmVhdGVkUmVzb3VyY2VJbnN0YW5jZSkgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvcjsKKwkJTWFwPENhcGFiaWxpdHlJbnN0RGF0YSwgTGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhaWxpdHlFbnRyeSA6IGNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisJCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5ID0gY2FwYWlsaXR5RW50cnkuZ2V0VmFsdWUoKS5nZXQoMCk7CisJCQlpZiAoY2FwYWJpbGl0eS5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCAmJiAhY2FwYWJpbGl0eS5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7CisJCQkJRWl0aGVyPE1hcDxDYXBhYmlsaXR5SW5zdERhdGEsIExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnRpZXNSZXMgPSBhZGRDYXBhYmlsaXR5UHJvcGVydHlWYWx1ZXNUb1Jlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5LCBpc05ld2x5Q3JlYXRlZFJlc291cmNlSW5zdGFuY2UpOworCQkJCWlmIChhZGRQcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCQllcnJvciA9IGFkZFByb3BlcnRpZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhZGQgcHJvcGVydHkgdmFsdWVzIHRvIGNhcGFiaWxpdGllcyBvZiBjb21wb25lbnQgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXN1bHQucHV0QWxsKGFkZFByb3BlcnRpZXNSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZXNXaXRoUHJvcGVydHlWYWx1ZXMoVGl0YW5WZXJ0ZXggcmVzb3VyY2VJbnN0YW5jZVZlcnRleCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllcywgYm9vbGVhbiBpc05ld2x5Q3JlYXRlZFJlc291cmNlSW5zdGFuY2UpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhaWxpdHlFbnRyeSA6IGNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisJCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5ID0gY2FwYWlsaXR5RW50cnkuZ2V0VmFsdWUoKS5nZXQoMCk7CisJCQlpZiAoY2FwYWJpbGl0eS5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCAmJiAhY2FwYWJpbGl0eS5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkUHJvcGVydGllc1JlcyA9IGFkZENhcGFiaWxpdHlQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlVmVydGV4LCByZXNvdXJjZUluc3RhbmNlSWQsIGNhcGFiaWxpdHksIGlzTmV3bHlDcmVhdGVkUmVzb3VyY2VJbnN0YW5jZSk7CisJCQkJaWYgKCFhZGRQcm9wZXJ0aWVzUmVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJcmVzdWx0ID0gYWRkUHJvcGVydGllc1JlczsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHZhbHVlcyB0byBjYXBhYmlsaXRpZXMgb2YgY29tcG9uZW50IGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIHJlc3VsdCk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxHcmFwaFJlbGF0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUNyZWF0ZWRDb21wb25lbnRJbnN0YW5jZVRvQ2xvbmVkQ2FwYWJpbGl0eUluc3RhbmNlcyhTdHJpbmcgbmV3Q29tcG9uZW50UmVzb3VyY2VJZCwgTGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPj4gY2FwYWJpbGl0eUluc3RhbmNlcykgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCUxpc3Q8R3JhcGhSZWxhdGlvbj4gcmVsYXRpb25zVG9DYXBhYmlsaXR5SW5zdGFuY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVVuaXF1ZUlkRGF0YSBjb21wb25lbnRJbnN0YW5jZUlkRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsIG5ld0NvbXBvbmVudFJlc291cmNlSWQpOworCQlmb3IgKEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+IGNhcEluc3RQYWlyIDogY2FwYWJpbGl0eUluc3RhbmNlcykgeworCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZVRvQ2FwYWJpbGl0eWluc3RhbmNlUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNvbXBvbmVudEluc3RhbmNlSWREYXRhLCBjYXBJbnN0UGFpci5nZXRMZWZ0KCksIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsCisJCQkJCWNhcEluc3RQYWlyLmdldFJpZ2h0KCkuZ2V0UHJvcGVydGllcygpKTsKKwkJCWlmIChhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZVRvQ2FwYWJpbGl0eWluc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJCWVycm9yID0gYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VUb0NhcGFiaWxpdHlpbnN0YW5jZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fS4iLCBjYXBJbnN0UGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgbmV3Q29tcG9uZW50UmVzb3VyY2VJZCwgZXJyb3IpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlyZWxhdGlvbnNUb0NhcGFiaWxpdHlJbnN0YW5jZXMuYWRkKGFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5aW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVsYXRpb25zVG9DYXBhYmlsaXR5SW5zdGFuY2VzKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yKTsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUNyZWF0ZWRDb21wb25lbnRJbnN0YW5jZVRvQ2xvbmVkQ2FwYWJpbGl0eUluc3RhbmNlcyhUaXRhblZlcnRleCByaVZlcnRleCwgU3RyaW5nIG5ld0NvbXBvbmVudFJlc291cmNlSWQsIExpc3Q8SW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgR3JhcGhFZGdlPj4gY2FwYWJpbGl0eUluc3RhbmNlcykgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCWZvciAoSW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgR3JhcGhFZGdlPiBjYXBJbnN0UGFpciA6IGNhcGFiaWxpdHlJbnN0YW5jZXMpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5aW5zdGFuY2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShyaVZlcnRleCwgY2FwSW5zdFBhaXIuZ2V0TGVmdCgpLCBHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWV9JTlNULCBjYXBJbnN0UGFpci5nZXRSaWdodCgpLmdldFByb3BlcnRpZXMoKSk7CisJCQlpZiAoIWFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5aW5zdGFuY2VSZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWVycm9yID0gYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VUb0NhcGFiaWxpdHlpbnN0YW5jZVJlczsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvY2lhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB0byByZXNvdXJjZSBpbnN0YW5jZSB7fSBzdGF0dXMgaXMge30gLiIsIGNhcEluc3RQYWlyLmdldExlZnQoKSwgbmV3Q29tcG9uZW50UmVzb3VyY2VJZCwgZXJyb3IpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCX0KKwkJcmV0dXJuIGVycm9yOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8R3JhcGhSZWxhdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZVRvQ2FwYWJpbGl0eUluc3RhbmNlc09mUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSkgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCVN0cmluZyByZXNvdXJjZUlkID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCk7CisJCVN0cmluZyBjb21wb25lbnRSZXNvdXJjZUlkID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKTsKKwkJVW5pcXVlSWREYXRhIGNvbXBvbmVudEluc3RhbmNlSWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSwgY29tcG9uZW50UmVzb3VyY2VJZCk7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+IHJlc291cmNlSW5zdGFuY2VzUGFpcjsKKwkJTGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPj4gYWxsQ2FwYWJpbGl0eUluc3RhbmNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxHcmFwaFJlbGF0aW9uPiByZWxhdGlvbnNUb0NhcGFiaWxpdHlJbnN0YW5jZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsUmVzb3VyY2VJbnN0YW5jZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHJlc291cmNlSWQsCisJCQkJR3JhcGhFZGdlTGFiZWxzLlJFU09VUkNFX0lOU1QsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCQlpZiAoZ2V0QWxsUmVzb3VyY2VJbnN0YW5jZVJlcy5pc1JpZ2h0KCkgJiYgIWdldEFsbFJlc291cmNlSW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQllcnJvciA9IGdldEFsbFJlc291cmNlSW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgcmVzb3VyY2UgaW5zdGFuY2VzIGZyb20gcmVzb3VyY2Uge30uIFN0YXR1cyBpcyB7fS4iLCByZXNvdXJjZUlkLCBlcnJvcik7CisJCX0KKwkJaWYgKGdldEFsbFJlc291cmNlSW5zdGFuY2VSZXMuaXNMZWZ0KCkpIHsKKwkJCXJlc291cmNlSW5zdGFuY2VzUGFpciA9IGdldEFsbFJlc291cmNlSW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlDb21wb25lbnRJbnN0YW5jZURhdGEgcmk7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+IHJpUGFpciA6IHJlc291cmNlSW5zdGFuY2VzUGFpcikgeworCQkJCXJpID0gcmlQYWlyLmdldExlZnQoKTsKKwkJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLCByaS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkNBUEFCSUxJVFlfSU5TVCwgTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlJbnN0LCBDYXBhYmlsaXR5SW5zdERhdGEuY2xhc3MpOworCQkJCWlmIChnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmlzUmlnaHQoKSAmJiAhZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQkJZXJyb3IgPSBnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgY2FwYWJpbGl0eSBpbnN0YW5jZXMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJpLmdldFVuaXF1ZUlkKCksIGVycm9yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmlzTGVmdCgpKSB7CisJCQkJCWFsbENhcGFiaWxpdHlJbnN0YW5jZXNMaXN0LmFkZEFsbChnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGVycm9yID09IG51bGwgJiYgIWFsbENhcGFiaWxpdHlJbnN0YW5jZXNMaXN0LmlzRW1wdHkoKSkgeworCQkJZm9yIChJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiBjYXBJbnN0UGFpciA6IGFsbENhcGFiaWxpdHlJbnN0YW5jZXNMaXN0KSB7CisJCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZVRvQ2FwYWJpbGl0eWluc3RhbmNlUmVzID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNvbXBvbmVudEluc3RhbmNlSWREYXRhLCBjYXBJbnN0UGFpci5nZXRMZWZ0KCksIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsCisJCQkJCQljYXBJbnN0UGFpci5nZXRSaWdodCgpLmdldFByb3BlcnRpZXMoKSk7CisJCQkJaWYgKGFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5aW5zdGFuY2VSZXMuaXNSaWdodCgpKSB7CisJCQkJCWVycm9yID0gYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VUb0NhcGFiaWxpdHlpbnN0YW5jZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjYXBJbnN0UGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50UmVzb3VyY2VJZCwgZXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWxhdGlvbnNUb0NhcGFiaWxpdHlJbnN0YW5jZXMuYWRkKGFzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlVG9DYXBhYmlsaXR5aW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlbGF0aW9uc1RvQ2FwYWJpbGl0eUluc3RhbmNlcyk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRldGVjdE9yaWdpblR5cGUoU3RyaW5nIGxhYmVsLCBDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBTdHJpbmcgcmVzb3VyY2VUeXBlU3RyKSB7CisJCXN3aXRjaCAoTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShsYWJlbCkpIHsKKwkJY2FzZSBTZXJ2aWNlOgorCQkJY29tcG9uZW50SW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLnNldE9yaWdpblR5cGUoT3JpZ2luVHlwZUVudW0uU0VSVklDRSk7CisJCQlicmVhazsKKwkJY2FzZSBQcm9kdWN0OgorCQkJY29tcG9uZW50SW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLnNldE9yaWdpblR5cGUoT3JpZ2luVHlwZUVudW0uUFJPRFVDVCk7CisJCQlicmVhazsKKwkJY2FzZSBSZXNvdXJjZToKKwkJCVJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlID0gUmVzb3VyY2VUeXBlRW51bS52YWx1ZU9mKHJlc291cmNlVHlwZVN0cik7CisJCQlzd2l0Y2ggKHJlc291cmNlVHlwZSkgeworCQkJY2FzZSBWRjoKKwkJCQljb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuc2V0T3JpZ2luVHlwZShPcmlnaW5UeXBlRW51bS5WRik7CisJCQkJYnJlYWs7CisJCQljYXNlIFZGQzoKKwkJCQljb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuc2V0T3JpZ2luVHlwZShPcmlnaW5UeXBlRW51bS5WRkMpOworCQkJCWJyZWFrOworCQkJY2FzZSBDUDoKKwkJCQljb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuc2V0T3JpZ2luVHlwZShPcmlnaW5UeXBlRW51bS5DUCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZMOgorCQkJCWNvbXBvbmVudEluc3RhbmNlRGF0YS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKS5zZXRPcmlnaW5UeXBlKE9yaWdpblR5cGVFbnVtLlZMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlVG9JbnN0T3JpZ2luQ29tcG9uZW50KENvbXBvbmVudEluc3RhbmNlRGF0YSBjb21wb25lbnRJbnN0YW5jZURhdGEsIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlKSB7CisKKwkJVW5pcXVlSWREYXRhIHJlc291cmNlSWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShjb21wSW5zdE5vZGVUeXBlLCBjb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuZ2V0Q29tcG9uZW50VWlkKCkpOworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY29tcG9uZW50SW5zdGFuY2VEYXRhLCByZXNvdXJjZUlkRGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOU1RBTkNFX09GLCBudWxsKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHJlc291cmNlIGluc3RhbmNlIHt9IHRvIHJlc291cmNlIHt9LiBTdGF0dXMgaXMge30iLCAKKwkJCQljb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSwgCisJCQkJY29tcG9uZW50SW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIAorCQkJCWNyZWF0ZVJlbGF0aW9uKTsKKworCQlyZXR1cm4gY3JlYXRlUmVsYXRpb247CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVUb0luc3RPcmlnaW5Db21wb25lbnQoVGl0YW5WZXJ0ZXggY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIFRpdGFuVmVydGV4IG9yaWdpblZlcnRleCwgU3RyaW5nIG9yaWdpbklkKSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShjb21wb25lbnRJbnN0YW5jZVZlcnRleCwgb3JpZ2luVmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMuSU5TVEFOQ0VfT0YsIG51bGwpOworCisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcgcmVzb3VyY2UgaW5zdGFuY2Uge30gdG8gcmVzb3VyY2Uge30uIHN0YXR1cyBpcyB7fSIsIGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBvcmlnaW5JZCwgY3JlYXRlUmVsYXRpb24pOworCisJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PEdyYXBoUmVsYXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlQ29tcEluc3RUb1JlcXVpcmVtZW50cyhDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlKSB7CisJCWxvZy50cmFjZSgiU3RhcnRpbmcgdG8gY29weSBvcmlnaW4gY29tcG9uZW50IHJlcXVpcmVtZW50cyB0byBpdHMgY29tcG9uZW50IGluc3RhbmNlIik7CisJCVN0cmluZyBjb21wSW5zdE9yaWdpbklkID0gY29tcG9uZW50SW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldENvbXBvbmVudFVpZCgpOworCQlMaXN0PEdyYXBoUmVsYXRpb24+IGdyYXBoUmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJLy8gY2FzZSBvZiBWRkMgLyBDUCAvIFZMCisJCWlmIChjb21wSW5zdE5vZGVUeXBlLmVxdWFscyhOb2RlVHlwZUVudW0uUmVzb3VyY2UpKSB7CisJCQljcmVhdGVSZXF1aXJlbWVudFJlbGF0aW9uc0Zyb21BdG9taWNSZXNvdXJjZShjb21wb25lbnRJbnN0YW5jZURhdGEsIGNvbXBJbnN0T3JpZ2luSWQsIGdyYXBoUmVsYXRpb25zKTsKKworCQl9CisJCS8vIGNhc2Ugb2YgVkYgLyBTZXJ2aWNlIC8gUHJvZHVjdAorCQljcmVhdGVDYWxjdWxhdGVkUmVxdWlyZW1lbnRSZWxhdGlvbnNGcm9tQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlRGF0YSwgY29udGFpbmVyTm9kZVR5cGUsIGNvbXBJbnN0Tm9kZVR5cGUsIGdyYXBoUmVsYXRpb25zLCBjb21wSW5zdE9yaWdpbklkKTsKKworCQlsb2cudHJhY2UoIkZpbmlzaGVkIHRvIGNvcHkgb3JpZ2luIGNvbXBvbmVudCByZXF1aXJlbWVudHMgdG8gaXRzIGNvbXBvbmVudCBpbnN0YW5jZSwgY3JlYXRlZCB7fSBuZXcgY2FsY3VsYXRlZCByZXF1aXJlbWVudCByZWxhdGlvbnMiLCBncmFwaFJlbGF0aW9ucy5zaXplKCkpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoZ3JhcGhSZWxhdGlvbnMpOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQ29tcEluc3RUb1JlcXVpcmVtZW50cyhUaXRhblZlcnRleCBjb21wb25lbnRJbnN0YW5jZVZlcnRleCwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSwgU3RyaW5nIG9yaWdpbklkKSB7CisJCWxvZy50cmFjZSgiU3RhcnRpbmcgdG8gY29weSBvcmlnaW4gY29tcG9uZW50IHJlcXVpcmVtZW50cyB0byBpdHMgY29tcG9uZW50IGluc3RhbmNlIik7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQkvLyBjYXNlIG9mIFZGQyAvIENQIC8gVkwKKwkJaWYgKGNvbXBJbnN0Tm9kZVR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSkpIHsKKwkJCXN0YXR1cyA9IGNyZWF0ZVJlcXVpcmVtZW50UmVsYXRpb25zRnJvbUF0b21pY1Jlc291cmNlKGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBvcmlnaW5JZCk7CisJCQlpZiAoIXN0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgY3JlYXRlIHJlbGF0aW9uIHRvIHJlcXVpcmVtZW50IG9mIG9yaWdpbiB7fSBlcnJvciB7fSIsIG9yaWdpbklkLCBzdGF0dXMpOworCQkJCXJldHVybiBzdGF0dXM7CisJCQl9CisJCX0KKwkJLy8gY2FzZSBvZiBWRiAvIFNlcnZpY2UgLyBQcm9kdWN0CisJCXN0YXR1cyA9IGNyZWF0ZUNhbGN1bGF0ZWRSZXF1aXJlbWVudFJlbGF0aW9uc0Zyb21Db21wb25lbnQoY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIGNvbnRhaW5lck5vZGVUeXBlLCBjb21wSW5zdE5vZGVUeXBlLCBvcmlnaW5JZCk7CisKKwkJbG9nLnRyYWNlKCJGaW5pc2hlZCB0byBjb3B5IG9yaWdpbiBjb21wb25lbnQgcmVxdWlyZW1lbnRzIHRvIGl0cyBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBzdGF0dXMge30iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVSZXF1aXJlbWVudFJlbGF0aW9uc0Zyb21BdG9taWNSZXNvdXJjZShDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCwgTGlzdDxHcmFwaFJlbGF0aW9uPiBncmFwaFJlbGF0aW9ucykgeworCQlNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPigpOworCQlTZXQ8U3RyaW5nPiBjYXNlSW5zZW5zaXRpdmVSZXFOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXF1aXJlbWVudE9wZXJhdGlvbi5maW5kQWxsUmVxdWlyZW1lbnRzUmVjdXJzaXZlbHkoY29tcEluc3RPcmlnaW5JZCwgcmVxdWlyZW1lbnRzLCBjYXNlSW5zZW5zaXRpdmVSZXFOYW1lcyk7CisJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmV0Y2ggcmVxdWlyZW1lbnRzIG9mIGNvbXBvbmVudCB7fSwgZXJyb3I6IHt9IiwgY29tcEluc3RPcmlnaW5JZCwgc3RhdHVzKTsKKwkJfQorCisJCWxvZy50cmFjZSgiRm91bmQge30gcmVxdWlyZW1lbnRzIGZvciBjb21wb25lbnQge30sICIsIHJlcXVpcmVtZW50cy5zaXplKCksIGNvbXBJbnN0T3JpZ2luSWQpOworCQlmb3IgKEVudHJ5PFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXFQYWlyIDogcmVxdWlyZW1lbnRzLmVudHJ5U2V0KCkpIHsKKwkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZiA9IHJlcVBhaXIuZ2V0VmFsdWUoKTsKKwkJCVJlcXVpcmVtZW50RGF0YSByZXF1aXJlbWVudERhdGEgPSBuZXcgUmVxdWlyZW1lbnREYXRhKCk7CisJCQlyZXF1aXJlbWVudERhdGEuc2V0VW5pcXVlSWQocmVxdWlyZW1lbnREZWYuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCWxvZy50cmFjZSgiQ3JlYXRpbmcgY2FsY3VsYXRlZCByZXF1aXJlbWVudCByZWxhdGlvbiBmcm9tIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB0byByZXF1aXJlbWVudCB7fSIsIGNvbXBvbmVudEluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCByZXF1aXJlbWVudERlZi5nZXRVbmlxdWVJZCgpKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIHJlcVBhaXIuZ2V0S2V5KCkpOworCisJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuT1dORVJfSUQuZ2V0UHJvcGVydHkoKSwgY29tcG9uZW50SW5zdGFuY2VEYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJaWYgKHJlcXVpcmVtZW50RGVmLmdldE1pbk9jY3VycmVuY2VzKCkgPT0gbnVsbCkgeworCQkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpLCBSZXF1aXJlbWVudERhdGEuTUlOX09DQ1VSUkVOQ0VTKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIHJlcXVpcmVtZW50RGVmLmdldE1pbk9jY3VycmVuY2VzKCkpOworCQkJfQorCQkJaWYgKHJlcXVpcmVtZW50RGVmLmdldE1heE9jY3VycmVuY2VzKCkgPT0gbnVsbCkgeworCQkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIFJlcXVpcmVtZW50RGF0YS5NQVhfREVGQVVMVF9PQ0NVUlJFTkNFUyk7CisJCQl9IGVsc2UgeworCQkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIHJlcXVpcmVtZW50RGVmLmdldE1heE9jY3VycmVuY2VzKCkpOworCQkJfQorCisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNvbXBvbmVudEluc3RhbmNlRGF0YSwgcmVxdWlyZW1lbnREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVCwgcHJvcHMpOworCQkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYWxjdWxhdGVkIHJlcXVpcmVtZW50IGZyb20gY29tcG9uZW50IGluc3RhbmNlIHt9IHRvIHJlcXVpcmVtZW50IHt9LCBlcnJvcjoge30iLCBjb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSwgcmVxdWlyZW1lbnREZWYuZ2V0VW5pcXVlSWQoKSwgdGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJfQorCQkJZ3JhcGhSZWxhdGlvbnMuYWRkKGNyZWF0ZVJlbGF0aW9uLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVxdWlyZW1lbnRSZWxhdGlvbnNGcm9tQXRvbWljUmVzb3VyY2UoVGl0YW5WZXJ0ZXggY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIFN0cmluZyBjb21wSW5zdE9yaWdpbklkKSB7CisJCU1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxdWlyZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+KCk7CisJCVNldDxTdHJpbmc+IGNhc2VJbnNlbnNpdGl2ZVJlcU5hbWVzID0gbmV3IEhhc2hTZXQ8PigpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHJlcXVpcmVtZW50T3BlcmF0aW9uLmZpbmRBbGxSZXF1aXJlbWVudHNSZWN1cnNpdmVseShjb21wSW5zdE9yaWdpbklkLCByZXF1aXJlbWVudHMsIGNhc2VJbnNlbnNpdGl2ZVJlcU5hbWVzKTsKKwkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSyAmJiBzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZldGNoIHJlcXVpcmVtZW50cyBvZiBjb21wb25lbnQge30sIGVycm9yOiB7fSIsIGNvbXBJbnN0T3JpZ2luSWQsIHN0YXR1cyk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJU3RyaW5nIGNvbXBvSW5zdElkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJbG9nLnRyYWNlKCJGb3VuZCB7fSByZXF1aXJlbWVudHMgZm9yIGNvbXBvbmVudCB7fSwgIiwgcmVxdWlyZW1lbnRzLnNpemUoKSwgY29tcEluc3RPcmlnaW5JZCk7CisJCWZvciAoRW50cnk8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcVBhaXIgOiByZXF1aXJlbWVudHMuZW50cnlTZXQoKSkgeworCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmID0gcmVxUGFpci5nZXRWYWx1ZSgpOworCQkJUmVxdWlyZW1lbnREYXRhIHJlcXVpcmVtZW50RGF0YSA9IG5ldyBSZXF1aXJlbWVudERhdGEoKTsKKwkJCXJlcXVpcmVtZW50RGF0YS5zZXRVbmlxdWVJZChyZXF1aXJlbWVudERlZi5nZXRVbmlxdWVJZCgpKTsKKworCQkJbG9nLnRyYWNlKCJDcmVhdGluZyBjYWxjdWxhdGVkIHJlcXVpcmVtZW50IHJlbGF0aW9uIGZyb20gY29tcG9uZW50IGluc3RhbmNlIHt9IHRvIHJlcXVpcmVtZW50IHt9IiwgY29tcG9JbnN0SWQsIHJlcXVpcmVtZW50RGVmLmdldFVuaXF1ZUlkKCkpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcmVxUGFpci5nZXRLZXkoKSk7CisKKwkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5PV05FUl9JRC5nZXRQcm9wZXJ0eSgpLCBjb21wb0luc3RJZCk7CisJCQlpZiAocmVxdWlyZW1lbnREZWYuZ2V0TWluT2NjdXJyZW5jZXMoKSA9PSBudWxsKSB7CisJCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIFJlcXVpcmVtZW50RGF0YS5NSU5fT0NDVVJSRU5DRVMpOworCQkJfSBlbHNlIHsKKwkJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRURfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSwgcmVxdWlyZW1lbnREZWYuZ2V0TWluT2NjdXJyZW5jZXMoKSk7CisJCQl9CisJCQlpZiAocmVxdWlyZW1lbnREZWYuZ2V0TWF4T2NjdXJyZW5jZXMoKSA9PSBudWxsKSB7CisJCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LkxFRlRfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSwgUmVxdWlyZW1lbnREYXRhLk1BWF9ERUZBVUxUX09DQ1VSUkVOQ0VTKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LkxFRlRfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSwgcmVxdWlyZW1lbnREZWYuZ2V0TWF4T2NjdXJyZW5jZXMoKSk7CisJCQl9CisKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZUVkZ2UoY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIHJlcXVpcmVtZW50RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfUkVRVUlSRU1FTlQsIHByb3BzKTsKKwkJCWlmICghY3JlYXRlUmVsYXRpb24uZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYWxjdWxhdGVkIHJlcXVpcmVtZW50IGZyb20gY29tcG9uZW50IGluc3RhbmNlIHt9IHRvIHJlcXVpcmVtZW50IHt9LCBlcnJvcjoge30iLCBjb21wb0luc3RJZCwgcmVxdWlyZW1lbnREZWYuZ2V0VW5pcXVlSWQoKSwgY3JlYXRlUmVsYXRpb24pOworCQkJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxHcmFwaFJlbGF0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUNvbXBJbnN0VG9DYXBhYmlsaXRpZXMoQ29tcG9uZW50SW5zdGFuY2VEYXRhIGNvbXBvbmVudEluc3RhbmNlRGF0YSwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSkgeworCisJCWxvZy50cmFjZSgiU3RhcnRpbmcgdG8gY29weSBvcmlnaW4gY29tcG9uZW50IGNhcGFiaWxpdGllcyB0byBpdHMgY29tcG9uZW50IGluc3RhbmNlIik7CisJCUxpc3Q8R3JhcGhSZWxhdGlvbj4gZ3JhcGhSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlTdHJpbmcgY29tcEluc3RPcmlnaW5JZCA9IGNvbXBvbmVudEluc3RhbmNlRGF0YS5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKS5nZXRDb21wb25lbnRVaWQoKTsKKworCQkvLyBjYXNlIG9mIFZGQyAvIENQIC8gVkwKKwkJaWYgKGNvbXBJbnN0Tm9kZVR5cGUuZXF1YWxzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSkpIHsKKwkJCWNyZWF0ZUNhY3VsYXRlZFJlbGF0aW9uc0Zyb21BdG9taWNSZXNvdXJjZShjb21wb25lbnRJbnN0YW5jZURhdGEsIGdyYXBoUmVsYXRpb25zLCBjb21wSW5zdE9yaWdpbklkKTsKKwkJfQorCisJCS8vIGNhc2Ugb2YgVkYgLyBTZXJ2aWNlIC8gUHJvZHVjdAorCQljcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0eVJlbGF0aW9uc0Zyb21Db21wb25lbnQoY29tcG9uZW50SW5zdGFuY2VEYXRhLCBjb250YWluZXJOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSwgZ3JhcGhSZWxhdGlvbnMsIGNvbXBJbnN0T3JpZ2luSWQpOworCisJCWxvZy50cmFjZSgiRmluaXNoZWQgdG8gY29weSBvcmlnaW4gY29tcG9uZW50IGNhcGFiaWxpdGllcyB0byBpdHMgY29tcG9uZW50IGluc3RhbmNlLCBjcmVhdGVkIHt9IG5ldyBjYWxjdWxhdGVkIGNhcGFiaWxpdHkgcmVsYXRpb25zIiwgZ3JhcGhSZWxhdGlvbnMuc2l6ZSgpKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGdyYXBoUmVsYXRpb25zKTsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUNvbXBJbnN0VG9DYXBhYmlsaXRpZXMoVGl0YW5WZXJ0ZXggY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwgTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUsIFN0cmluZyBvcmlnaW5JZCkgeworCisJCWxvZy50cmFjZSgiU3RhcnRpbmcgdG8gY29weSBvcmlnaW4gY29tcG9uZW50IGNhcGFiaWxpdGllcyB0byBpdHMgY29tcG9uZW50IGluc3RhbmNlIik7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJCS8vIGNhc2Ugb2YgVkZDIC8gQ1AgLyBWTAorCQlpZiAoY29tcEluc3ROb2RlVHlwZS5lcXVhbHMoTm9kZVR5cGVFbnVtLlJlc291cmNlKSkgeworCQkJc3RhdHVzID0gY3JlYXRlQ2FjdWxhdGVkUmVsYXRpb25zRnJvbUF0b21pY1Jlc291cmNlKGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBvcmlnaW5JZCk7CisJCQlpZiAoIXN0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJfQorCisJCS8vIGNhc2Ugb2YgVkYgLyBTZXJ2aWNlIC8gUHJvZHVjdAorCQlzdGF0dXMgPSBjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0eVJlbGF0aW9uc0Zyb21Db21wb25lbnQoY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIGNvbnRhaW5lck5vZGVUeXBlLCBjb21wSW5zdE5vZGVUeXBlLCBvcmlnaW5JZCk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ2FsY3VsYXRlZFJlcXVpcmVtZW50UmVsYXRpb25zRnJvbUNvbXBvbmVudChDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlLCBMaXN0PEdyYXBoUmVsYXRpb24+IGdyYXBoUmVsYXRpb25zLCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQgPSBnZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudChjb21wSW5zdE9yaWdpbklkLCBjb250YWluZXJOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudC5pc0xlZnQoKSAmJiAhY29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQubGVmdCgpLnZhbHVlKCkubGVmdC5pc0VtcHR5KCkpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IGNvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlIDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5Ob2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKGNvbnRhaW5lck5vZGVUeXBlKSwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX1JFUVVJUkVNRU5ULCBOb2RlVHlwZUVudW0uUmVxdWlyZW1lbnQsIFJlcXVpcmVtZW50RGF0YS5jbGFzcyk7CisKKwkJCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc0xlZnQoKSAmJiAhY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKS5pc0VtcHR5KCkpIHsKKwkJCQkJTGlzdDxJbW11dGFibGVQYWlyPFJlcXVpcmVtZW50RGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZT4gY2FsY3VsYXRlZFJlcSA6IGxpc3QpIHsKKworCQkJCQkJR3JhcGhFZGdlIGVkZ2UgPSBjYWxjdWxhdGVkUmVxLnJpZ2h0OworCQkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZWRnZS5nZXRQcm9wZXJ0aWVzKCk7CisJCQkJCQlTdHJpbmcgc291cmNlID0gbnVsbDsKKwkJCQkJCVN0cmluZyBvY2N1cnJlbmNlcyA9IFJlcXVpcmVtZW50RGF0YS5NQVhfREVGQVVMVF9PQ0NVUlJFTkNFUzsKKwkJCQkJCVN0cmluZyBtaW5PY2N1cnJlbmNlcyA9IFJlcXVpcmVtZW50RGF0YS5NSU5fT0NDVVJSRU5DRVM7CisKKwkJCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5TT1VSQ0UuZ2V0UHJvcGVydHkoKSkpIHsKKwkJCQkJCQlzb3VyY2UgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5TT1VSQ0UuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQl9CisJCQkJCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJCW9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJCW1pbk9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRURfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQl9CisKKwkJCQkJCVN0cmluZyBjYXBhYmlsaXR5TmFtZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gY3JlYXRlQ2FsY3VsYXRlZFJlcXVpcmVtZW50RWRnZShjb21wb25lbnRJbnN0YW5jZURhdGEsIHNvdXJjZSwgY2FwYWJpbGl0eU5hbWUsIGNhbGN1bGF0ZWRSZXEubGVmdCwgY29tcG9uZW50SW5zdGFuY2UsIG9jY3VycmVuY2VzLCBtaW5PY2N1cnJlbmNlcyk7CisJCQkJCQlpZiAoY3JlYXRlUmVsYXRpb24uaXNMZWZ0KCkpIHsKKwkJCQkJCQlncmFwaFJlbGF0aW9ucy5hZGQoY3JlYXRlUmVsYXRpb24ubGVmdCgpLnZhbHVlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVDYWxjdWxhdGVkUmVxdWlyZW1lbnRSZWxhdGlvbnNGcm9tQ29tcG9uZW50KFRpdGFuVmVydGV4IGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlLCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQgPSBnZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudChjb21wSW5zdE9yaWdpbklkLCBjb250YWluZXJOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudC5pc0xlZnQoKSAmJiAhY29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQubGVmdCgpLnZhbHVlKCkubGVmdC5pc0VtcHR5KCkpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IGNvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlIDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisKKwkJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuVmVydGVjaWVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKGNvbnRhaW5lck5vZGVUeXBlKSwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX1JFUVVJUkVNRU5UKTsKKworCQkJCWlmIChjaGlsZHJlbk5vZGVzLmlzTGVmdCgpICYmICFjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSkgeworCQkJCQlMaXN0PEltbXV0YWJsZVBhaXI8VGl0YW5WZXJ0ZXgsIEVkZ2U+PiBsaXN0ID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJZm9yIChJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPiBjYWxjdWxhdGVkUmVxIDogbGlzdCkgeworCisJCQkJCQlFZGdlIGVkZ2UgPSBjYWxjdWxhdGVkUmVxLnJpZ2h0OworCQkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXMoZWRnZSk7CisJCQkJCQlTdHJpbmcgc291cmNlID0gbnVsbDsKKwkJCQkJCVN0cmluZyBvY2N1cnJlbmNlcyA9IFJlcXVpcmVtZW50RGF0YS5NQVhfREVGQVVMVF9PQ0NVUlJFTkNFUzsKKwkJCQkJCVN0cmluZyBtaW5PY2N1cnJlbmNlcyA9IFJlcXVpcmVtZW50RGF0YS5NSU5fT0NDVVJSRU5DRVM7CisKKwkJCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5TT1VSQ0UuZ2V0UHJvcGVydHkoKSkpIHsKKwkJCQkJCQlzb3VyY2UgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5TT1VSQ0UuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQl9CisJCQkJCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJCW9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJCW1pbk9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRURfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQl9CisKKwkJCQkJCVN0cmluZyBjYXBhYmlsaXR5TmFtZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvbiA9IGNyZWF0ZUNhbGN1bGF0ZWRSZXF1aXJlbWVudEVkZ2UoY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIHNvdXJjZSwgY2FwYWJpbGl0eU5hbWUsIGNhbGN1bGF0ZWRSZXEubGVmdCwgY29tcG9uZW50SW5zdGFuY2UsIG9jY3VycmVuY2VzLCBtaW5PY2N1cnJlbmNlcyk7CisJCQkJCQlpZiAoIWNyZWF0ZVJlbGF0aW9uLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgY2FsY3VsYXRlZCByZXF1aXJlbWVudCBlZGdlLCBzdGF0dXMgIiwgY3JlYXRlUmVsYXRpb24pOworCQkJCQkJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhbGN1bGF0ZWRDYXBhYmlsaXR5UmVsYXRpb25zRnJvbUNvbXBvbmVudChDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlLCBMaXN0PEdyYXBoUmVsYXRpb24+IGdyYXBoUmVsYXRpb25zLCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQgPSBnZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudChjb21wSW5zdE9yaWdpbklkLCBjb250YWluZXJOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudC5pc0xlZnQoKSAmJiAhY29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQubGVmdCgpLnZhbHVlKCkubGVmdC5pc0VtcHR5KCkpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IGNvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50LmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlIDogY29tcG9uZW50SW5zdGFuY2VzKSB7CisJCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoY29tcEluc3ROb2RlVHlwZSksIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCksCisJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSwgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCisJCQkJaWYgKGNoaWxkcmVuTm9kZXMuaXNMZWZ0KCkgJiYgIWNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCkuaXNFbXB0eSgpKSB7CisJCQkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPiBjYWxjdWxhdGVkQ2FwIDogbGlzdCkgeworCisJCQkJCQlHcmFwaEVkZ2UgZWRnZSA9IGNhbGN1bGF0ZWRDYXAucmlnaHQ7CisJCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBlZGdlLmdldFByb3BlcnRpZXMoKTsKKwkJCQkJCVN0cmluZyBzb3VyY2UgPSBudWxsOworCQkJCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlNPVVJDRS5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJCXNvdXJjZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlNPVVJDRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCX0KKwkJCQkJCVN0cmluZyBtaW5PY2N1cnJlbmNlcyA9IENhcGFiaWxpdHlEYXRhLk1JTl9PQ0NVUlJFTkNFUzsKKwkJCQkJCVN0cmluZyBvY2N1cnJlbmNlcyA9IENhcGFiaWxpdHlEYXRhLk1BWF9PQ0NVUlJFTkNFUzsKKwkJCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJCW1pbk9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRURfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQl9CisJCQkJCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKSkgeworCQkJCQkJCW9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCX0KKworCQkJCQkJU3RyaW5nIGNhcGFiaWxpdHlOYW1lID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSBjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0eUVkZ2UoY29tcG9uZW50SW5zdGFuY2VEYXRhLCBzb3VyY2UsIGNhcGFiaWxpdHlOYW1lLCBjYWxjdWxhdGVkQ2FwLmxlZnQsIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIG1pbk9jY3VycmVuY2VzLCBvY2N1cnJlbmNlcyk7CisJCQkJCQlpZiAoY3JlYXRlUmVsYXRpb24uaXNMZWZ0KCkpIHsKKwkJCQkJCQlncmFwaFJlbGF0aW9ucy5hZGQoY3JlYXRlUmVsYXRpb24ubGVmdCgpLnZhbHVlKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0eVJlbGF0aW9uc0Zyb21Db21wb25lbnQoVGl0YW5WZXJ0ZXggY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwgTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUsIFN0cmluZyBjb21wSW5zdE9yaWdpbklkKSB7CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudCA9IGdldENvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50KGNvbXBJbnN0T3JpZ2luSWQsIGNvbnRhaW5lck5vZGVUeXBlLCBjb21wSW5zdE5vZGVUeXBlKTsKKwkJaWYgKGNvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50LmlzTGVmdCgpICYmICFjb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKS5sZWZ0LmlzRW1wdHkoKSkgeworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQubGVmdCgpLnZhbHVlKCkubGVmdDsKKwkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuVmVydGVjaWVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKGNvbXBJbnN0Tm9kZVR5cGUpLCBjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfQ0FQQUJJTElUWSk7CisKKwkJCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc0xlZnQoKSAmJiAhY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKS5pc0VtcHR5KCkpIHsKKwkJCQkJTGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPj4gbGlzdCA9IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4gY2FsY3VsYXRlZENhcCA6IGxpc3QpIHsKKworCQkJCQkJRWRnZSBlZGdlID0gY2FsY3VsYXRlZENhcC5yaWdodDsKKwkJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKGVkZ2UpOworCQkJCQkJU3RyaW5nIHNvdXJjZSA9IG51bGw7CisJCQkJCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuU09VUkNFLmdldFByb3BlcnR5KCkpKSB7CisJCQkJCQkJc291cmNlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuU09VUkNFLmdldFByb3BlcnR5KCkpOworCQkJCQkJfQorCQkJCQkJU3RyaW5nIG1pbk9jY3VycmVuY2VzID0gQ2FwYWJpbGl0eURhdGEuTUlOX09DQ1VSUkVOQ0VTOworCQkJCQkJU3RyaW5nIG9jY3VycmVuY2VzID0gQ2FwYWJpbGl0eURhdGEuTUFYX09DQ1VSUkVOQ0VTOworCQkJCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpKSB7CisJCQkJCQkJbWluT2NjdXJyZW5jZXMgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpKSB7CisJCQkJCQkJb2NjdXJyZW5jZXMgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpOworCQkJCQkJfQorCisJCQkJCQlTdHJpbmcgY2FwYWJpbGl0eU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVsYXRpb24gPSBjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0eUVkZ2UoY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIHNvdXJjZSwgY2FwYWJpbGl0eU5hbWUsIGNhbGN1bGF0ZWRDYXAubGVmdCwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgbWluT2NjdXJyZW5jZXMsIG9jY3VycmVuY2VzKTsKKwkJCQkJCWlmICghY3JlYXRlUmVsYXRpb24uZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQkJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhY3VsYXRlZFJlbGF0aW9uc0Zyb21BdG9taWNSZXNvdXJjZShDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBMaXN0PEdyYXBoUmVsYXRpb24+IGdyYXBoUmVsYXRpb25zLCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCkgeworCisJCU1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPigpOworCQlTZXQ8U3RyaW5nPiBjYXNlSW5zZW5zaXRpdmVDYXBOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZ2V0QWxsQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5nZXRBbGxDYXBhYmlsaXRpZXNSZWN1c2l2ZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGNvbXBJbnN0T3JpZ2luSWQsIHRydWUsIGNhcGFiaWxpdGllcywgY2FzZUluc2Vuc2l0aXZlQ2FwTmFtZXMsIHRydWUpOworCisJCWlmICghZ2V0QWxsQ2FwYWJpbGl0aWVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWlmIChnZXRBbGxDYXBhYmlsaXRpZXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBjYXBhYmlsaXRpZXMgb2YgY29tcG9uZW50IHt9LCBlcnJvcjoge30iLCBjb21wSW5zdE9yaWdpbklkLCBnZXRBbGxDYXBhYmlsaXRpZXMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlsb2cudHJhY2UoIkZvdW5kIHt9IGNhcGFiaWxpdGllcyBmb3IgY29tcG9uZW50IHt9LCAiLCBjYXBhYmlsaXRpZXMuc2l6ZSgpLCBjb21wSW5zdE9yaWdpbklkKTsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBQYWlyIDogY2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEYXRhID0gY2FwUGFpci5nZXRWYWx1ZSgpOworCQkJbG9nLnRyYWNlKCJDcmVhdGluZyBjYWxjdWxhdGVkIGNhcGFiaWxpdHkgcmVsYXRpb24gZnJvbSBjb21wb25lbnQgaW5zdGFuY2Uge30gdG8gY2FwYWJpbGl0eSB7fSIsIGNvbXBvbmVudEluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCUNhcGFiaWxpdHlEYXRhIGNhcGFiaWxpdHlEYXRhTm9kZSA9IG5ldyBDYXBhYmlsaXR5RGF0YSgpOworCQkJY2FwYWJpbGl0eURhdGFOb2RlLnNldFVuaXF1ZUlkKGNhcGFiaWxpdHlEYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJU3RyaW5nIG1pbk9jY3VycmVuY2VzID0gQ2FwYWJpbGl0eURhdGEuTUlOX09DQ1VSUkVOQ0VTOworCQkJU3RyaW5nIG9jY3VycmVuY2VzID0gQ2FwYWJpbGl0eURhdGEuTUFYX09DQ1VSUkVOQ0VTOworCQkJaWYgKGNhcGFiaWxpdHlEYXRhLmdldE1pbk9jY3VycmVuY2VzKCkgIT0gbnVsbCkgeworCQkJCW1pbk9jY3VycmVuY2VzID0gY2FwYWJpbGl0eURhdGEuZ2V0TWluT2NjdXJyZW5jZXMoKTsKKwkJCX0KKwkJCWlmIChjYXBhYmlsaXR5RGF0YS5nZXRNaW5PY2N1cnJlbmNlcygpICE9IG51bGwpIHsKKwkJCQlvY2N1cnJlbmNlcyA9IGNhcGFiaWxpdHlEYXRhLmdldE1heE9jY3VycmVuY2VzKCk7CisJCQl9CisKKwkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSBjcmVhdGVDYWxjdWxhdGVkQ2FwYWJpbGl0eUVkZ2UoY29tcG9uZW50SW5zdGFuY2VEYXRhLCBjb21wSW5zdE9yaWdpbklkLCBjYXBQYWlyLmdldEtleSgpLCBjYXBhYmlsaXR5RGF0YU5vZGUsIGNvbXBvbmVudEluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBtaW5PY2N1cnJlbmNlcywgb2NjdXJyZW5jZXMpOworCQkJZ3JhcGhSZWxhdGlvbnMuYWRkKGNyZWF0ZVJlbGF0aW9uLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlQ2FjdWxhdGVkUmVsYXRpb25zRnJvbUF0b21pY1Jlc291cmNlKFRpdGFuVmVydGV4IGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCkgeworCisJCU1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPigpOworCQlTZXQ8U3RyaW5nPiBjYXNlSW5zZW5zaXRpdmVDYXBOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZ2V0QWxsQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5nZXRBbGxDYXBhYmlsaXRpZXNSZWN1c2l2ZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGNvbXBJbnN0T3JpZ2luSWQsIHRydWUsIGNhcGFiaWxpdGllcywgY2FzZUluc2Vuc2l0aXZlQ2FwTmFtZXMsIHRydWUpOworCisJCWlmICghZ2V0QWxsQ2FwYWJpbGl0aWVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWlmIChnZXRBbGxDYXBhYmlsaXRpZXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBjYXBhYmlsaXRpZXMgb2YgY29tcG9uZW50IHt9LCBlcnJvcjoge30iLCBjb21wSW5zdE9yaWdpbklkLCBnZXRBbGxDYXBhYmlsaXRpZXMpOworCQkJfQorCQl9CisJCWxvZy50cmFjZSgiRm91bmQge30gY2FwYWJpbGl0aWVzIGZvciBjb21wb25lbnQge30sICIsIGNhcGFiaWxpdGllcy5zaXplKCksIGNvbXBJbnN0T3JpZ2luSWQpOworCQlTdHJpbmcgY29tcG9JbnN0SWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCisJCWZvciAoRW50cnk8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwUGFpciA6IGNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisJCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGF0YSA9IGNhcFBhaXIuZ2V0VmFsdWUoKTsKKwkJCWxvZy50cmFjZSgiQ3JlYXRpbmcgY2FsY3VsYXRlZCBjYXBhYmlsaXR5IHJlbGF0aW9uIGZyb20gY29tcG9uZW50IGluc3RhbmNlIHt9IHRvIGNhcGFiaWxpdHkge30iLCBjb21wb0luc3RJZCwgY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQlDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YU5vZGUgPSBuZXcgQ2FwYWJpbGl0eURhdGEoKTsKKwkJCWNhcGFiaWxpdHlEYXRhTm9kZS5zZXRVbmlxdWVJZChjYXBhYmlsaXR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCVN0cmluZyBtaW5PY2N1cnJlbmNlcyA9IENhcGFiaWxpdHlEYXRhLk1JTl9PQ0NVUlJFTkNFUzsKKwkJCVN0cmluZyBvY2N1cnJlbmNlcyA9IENhcGFiaWxpdHlEYXRhLk1BWF9PQ0NVUlJFTkNFUzsKKwkJCWlmIChjYXBhYmlsaXR5RGF0YS5nZXRNaW5PY2N1cnJlbmNlcygpICE9IG51bGwpIHsKKwkJCQltaW5PY2N1cnJlbmNlcyA9IGNhcGFiaWxpdHlEYXRhLmdldE1pbk9jY3VycmVuY2VzKCk7CisJCQl9CisJCQlpZiAoY2FwYWJpbGl0eURhdGEuZ2V0TWluT2NjdXJyZW5jZXMoKSAhPSBudWxsKSB7CisJCQkJb2NjdXJyZW5jZXMgPSBjYXBhYmlsaXR5RGF0YS5nZXRNYXhPY2N1cnJlbmNlcygpOworCQkJfQorCisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvbiA9IGNyZWF0ZUNhbGN1bGF0ZWRDYXBhYmlsaXR5RWRnZShjb21wb25lbnRJbnN0YW5jZVZlcnRleCwgY29tcEluc3RPcmlnaW5JZCwgY2FwUGFpci5nZXRLZXkoKSwgY2FwYWJpbGl0eURhdGFOb2RlLCBjb21wb0luc3RJZCwgbWluT2NjdXJyZW5jZXMsIG9jY3VycmVuY2VzKTsKKwkJCWlmICghY3JlYXRlUmVsYXRpb24uZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNhbGN1bGF0ZWRDYXBhYmlsaXR5RWRnZShDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBDYXBhYmlsaXR5RGF0YSBjYXBhYmlsaXR5RGF0YU5vZGUsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLAorCQkJU3RyaW5nIG1pbk9jY3VycmVuY2VzLCBTdHJpbmcgb2NjdXJyZW5jZXMpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IHByZXBhcmVFZGdlQ2FwYWJpbHR5UHJvcGVyaXRlcyhjb21wSW5zdE9yaWdpbklkLCBjYXBhYmlsaXR5TmFtZSwgY29tcG9uZW50SW5zdGFuY2VJZCwgbWluT2NjdXJyZW5jZXMsIG9jY3VycmVuY2VzKTsKKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNvbXBvbmVudEluc3RhbmNlRGF0YSwgY2FwYWJpbGl0eURhdGFOb2RlLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZLCBwcm9wcyk7CisJCWlmIChjcmVhdGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGNhbGN1bGF0ZWQgY2FwYWJpbGl0eSBmcm9tIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB0byBjYXBhYmlsaXR5IHt9LCBlcnJvcjoge30iLCBjb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSwgY2FwYWJpbGl0eURhdGFOb2RlLmdldFVuaXF1ZUlkKCksIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQl9CisJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUNhbGN1bGF0ZWRDYXBhYmlsaXR5RWRnZShUaXRhblZlcnRleCBjb21wb25lbnRJbnN0YW5jZVZlcnRleCwgU3RyaW5nIGNvbXBJbnN0T3JpZ2luSWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgQ2FwYWJpbGl0eURhdGEgY2FwYWJpbGl0eURhdGFOb2RlLCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwgU3RyaW5nIG1pbk9jY3VycmVuY2VzLAorCQkJU3RyaW5nIG9jY3VycmVuY2VzKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBwcmVwYXJlRWRnZUNhcGFiaWx0eVByb3Blcml0ZXMoY29tcEluc3RPcmlnaW5JZCwgY2FwYWJpbGl0eU5hbWUsIGNvbXBvbmVudEluc3RhbmNlSWQsIG1pbk9jY3VycmVuY2VzLCBvY2N1cnJlbmNlcyk7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShjb21wb25lbnRJbnN0YW5jZVZlcnRleCwgY2FwYWJpbGl0eURhdGFOb2RlLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZLCBwcm9wcyk7CisJCWlmICghY3JlYXRlUmVsYXRpb24uZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGNhbGN1bGF0ZWQgY2FwYWJpbGl0eSBmcm9tIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB0byBjYXBhYmlsaXR5IHt9LCBlcnJvcjoge30iLCBjb21wb25lbnRJbnN0YW5jZUlkLCBjYXBhYmlsaXR5RGF0YU5vZGUuZ2V0VW5pcXVlSWQoKSwgY3JlYXRlUmVsYXRpb24pOworCQl9CisJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUNhbGN1bGF0ZWRDYXBhYmlsaXR5RWRnZShUaXRhblZlcnRleCBjb21wb25lbnRJbnN0YW5jZVZlcnRleCwgU3RyaW5nIGNvbXBJbnN0T3JpZ2luSWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSwgVGl0YW5WZXJ0ZXggY2FwYWJpbGl0eURhdGFWZXJ0ZXgsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBTdHJpbmcgbWluT2NjdXJyZW5jZXMsCisJCQlTdHJpbmcgb2NjdXJyZW5jZXMpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IHByZXBhcmVFZGdlQ2FwYWJpbHR5UHJvcGVyaXRlcyhjb21wSW5zdE9yaWdpbklkLCBjYXBhYmlsaXR5TmFtZSwgY29tcG9uZW50SW5zdGFuY2VJZCwgbWluT2NjdXJyZW5jZXMsIG9jY3VycmVuY2VzKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBjYXBhYmlsaXR5RGF0YVZlcnRleCwgR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfQ0FQQUJJTElUWSwgcHJvcHMpOworCQlpZiAoIWNyZWF0ZVJlbGF0aW9uLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYWxjdWxhdGVkIGNhcGFiaWxpdHkgZnJvbSBjb21wb25lbnQgaW5zdGFuY2Uge30gdG8gY2FwYWJpbGl0eSB7fSwgZXJyb3I6IHt9IiwgY29tcG9uZW50SW5zdGFuY2VJZCwgY2FwYWJpbGl0eU5hbWUsIGNyZWF0ZVJlbGF0aW9uKTsKKwkJfQorCQlyZXR1cm4gY3JlYXRlUmVsYXRpb247CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByZXBhcmVFZGdlQ2FwYWJpbHR5UHJvcGVyaXRlcyhTdHJpbmcgY29tcEluc3RPcmlnaW5JZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwgU3RyaW5nIG1pbk9jY3VycmVuY2VzLCBTdHJpbmcgb2NjdXJyZW5jZXMpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlpZiAoY2FwYWJpbGl0eU5hbWUgIT0gbnVsbCkKKwkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGNhcGFiaWxpdHlOYW1lKTsKKwkJaWYgKGNvbXBJbnN0T3JpZ2luSWQgIT0gbnVsbCkKKwkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5TT1VSQ0UuZ2V0UHJvcGVydHkoKSwgY29tcEluc3RPcmlnaW5JZCk7CisJCWlmIChjb21wb25lbnRJbnN0YW5jZUlkICE9IG51bGwpIHsKKwkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5PV05FUl9JRC5nZXRQcm9wZXJ0eSgpLCBjb21wb25lbnRJbnN0YW5jZUlkKTsKKwkJfQorCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRURfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSwgbWluT2NjdXJyZW5jZXMpOworCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpLCBvY2N1cnJlbmNlcyk7CisJCXJldHVybiBwcm9wczsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ2FsY3VsYXRlZFJlcXVpcmVtZW50RWRnZShDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBTdHJpbmcgY29tcEluc3RPcmlnaW5JZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBSZXF1aXJlbWVudERhdGEgcmVxdWlyZW1lbnREYXRhLCBDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwKKwkJCVN0cmluZyBvY2N1cnJlbmNlcywgU3RyaW5nIG1pbk9jY3VycmVuY2VzKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJaWYgKGNhcGFiaWxpdHlOYW1lICE9IG51bGwpCisJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5TmFtZSk7CisJCWlmIChjb21wSW5zdE9yaWdpbklkICE9IG51bGwpCisJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuU09VUkNFLmdldFByb3BlcnR5KCksIGNvbXBJbnN0T3JpZ2luSWQpOworCQlpZiAoY29tcG9uZW50SW5zdGFuY2UgIT0gbnVsbCkgeworCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk9XTkVSX0lELmdldFByb3BlcnR5KCksIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQl9CisJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIG9jY3VycmVuY2VzKTsKKwkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIG1pbk9jY3VycmVuY2VzKTsKKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNvbXBvbmVudEluc3RhbmNlRGF0YSwgcmVxdWlyZW1lbnREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVCwgcHJvcHMpOworCQlpZiAoY3JlYXRlUmVsYXRpb24uaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBjYWxjdWxhdGVkIHJlcXVpcmVtZW50IGZyb20gY29tcG9uZW50IGluc3RhbmNlIHt9IHRvIHJlcXVpcmVtZW50IHt9LCBlcnJvcjoge30iLCBjb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSwgcmVxdWlyZW1lbnREYXRhLmdldFVuaXF1ZUlkKCksIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQodGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQl9CisJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZUNhbGN1bGF0ZWRSZXF1aXJlbWVudEVkZ2UoVGl0YW5WZXJ0ZXggY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIFN0cmluZyBjb21wSW5zdE9yaWdpbklkLCBTdHJpbmcgY2FwYWJpbGl0eU5hbWUsIFRpdGFuVmVydGV4IHJlcXVpcmVtZW50VmVydGV4LCBDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgU3RyaW5nIG9jY3VycmVuY2VzLAorCQkJU3RyaW5nIG1pbk9jY3VycmVuY2VzKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJaWYgKGNhcGFiaWxpdHlOYW1lICE9IG51bGwpCisJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5TmFtZSk7CisJCWlmIChjb21wSW5zdE9yaWdpbklkICE9IG51bGwpCisJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuU09VUkNFLmdldFByb3BlcnR5KCksIGNvbXBJbnN0T3JpZ2luSWQpOworCQlpZiAoY29tcG9uZW50SW5zdGFuY2UgIT0gbnVsbCkgeworCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk9XTkVSX0lELmdldFByb3BlcnR5KCksIGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQl9CisJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIG9jY3VycmVuY2VzKTsKKwkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCksIG1pbk9jY3VycmVuY2VzKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCByZXF1aXJlbWVudFZlcnRleCwgR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfUkVRVUlSRU1FTlQsIHByb3BzKTsKKwkJaWYgKCFjcmVhdGVSZWxhdGlvbi5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgY2FsY3VsYXRlZCByZXF1aXJlbWVudCBmcm9tIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB0byByZXF1aXJlbWVudCB7fSwgZXJyb3I6IHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgY2FwYWJpbGl0eU5hbWUsIGNyZWF0ZVJlbGF0aW9uKTsKKwkJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwkJfQorCQlyZXR1cm4gY3JlYXRlUmVsYXRpb247CisJfQorCisJLyoqCisJICogTWFrZSBhIHJlbGF0aW9uIGJldHdlZW4gc2VydmljZSB0byByZXNvdXJjZSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29udGFpbmVyQ29tcElkRGF0YQorCSAqIEBwYXJhbSBjb21wb25lbnRJbnN0YW5jZURhdGEKKwkgKiBAcGFyYW0gbG9naWNhbE5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUNvbnRhaW5lckNvbXBUb0NvbXBvbmVudEluc3RhbmNlKFVuaXF1ZUlkRGF0YSBjb250YWluZXJDb21wSWREYXRhLCBDb21wb25lbnRJbnN0YW5jZURhdGEgY29tcG9uZW50SW5zdGFuY2VEYXRhLCBTdHJpbmcgbG9naWNhbE5hbWUpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJcHJvcGVydGllcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGxvZ2ljYWxOYW1lKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihjb250YWluZXJDb21wSWREYXRhLCBjb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZUxhYmVscy5SRVNPVVJDRV9JTlNULCBwcm9wZXJ0aWVzKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIGNvbnRhaW5lciBjb21wb25lbnQge30gdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30gd2l0aCBsb2dpY2FsIG5hbWUge30uIFN0YXR1cyBpcyB7fSIsIGNvbnRhaW5lckNvbXBJZERhdGEuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50SW5zdGFuY2VEYXRhLmdldFVuaXF1ZUlkKCksIGxvZ2ljYWxOYW1lLCBjcmVhdGVSZWxhdGlvbik7CisKKwkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQ29udGFpbmVyQ29tcFRvQ29tcG9uZW50SW5zdGFuY2UoVGl0YW5WZXJ0ZXggY29udGFpbmVyQ29tcFZlcnRleCwgVGl0YW5WZXJ0ZXggY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIFN0cmluZyBsb2dpY2FsTmFtZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgbG9naWNhbE5hbWUpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKGNvbnRhaW5lckNvbXBWZXJ0ZXgsIGNvbXBvbmVudEluc3RhbmNlVmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMuUkVTT1VSQ0VfSU5TVCwgcHJvcGVydGllcyk7CisKKwkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ29tcG9uZW50SW5zdExvZ2ljYWxOYW1lKFN0cmluZyBpbnN0YW5jZU51bWJlciwgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlTmFtZSkgeworCisJCVN0cmluZyBsb2dpY2FsTmFtZSA9IGJ1aWxkQ29tcG9uZW50SW5zdGFuY2VMb2dpY2FsTmFtZShpbnN0YW5jZU51bWJlciwgY29tcG9uZW50SW5zdGFuY2VOYW1lKTsKKworCQlyZXR1cm4gbG9naWNhbE5hbWU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb21wb25lbnRJbnN0YW5jZUxvZ2ljYWxOYW1lKFN0cmluZyBpbnN0YW5jZU51bWJlciwgU3RyaW5nIGxhc3RUb2tlbikgeworCQlyZXR1cm4gbGFzdFRva2VuICsgIiAiICsgKGluc3RhbmNlTnVtYmVyID09IG51bGwgPyAwIDogaW5zdGFuY2VOdW1iZXIpOworCX0KKworCXByaXZhdGUgQ29tcG9uZW50SW5zdGFuY2VEYXRhIGJ1aWxkQ29tcG9uZW50SW5zdGFuY2VEYXRhKENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIGxvZ2ljYWxOYW1lKSB7CisKKwkJU3RyaW5nIGNpT3JpZ2luQ29tcG9uZW50VWlkID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRDb21wb25lbnRVaWQoKTsKKworCQlDb21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uIGRhdGFEZWZpbml0aW9uID0gbmV3IENvbXBvbmVudEluc3RhbmNlRGF0YURlZmluaXRpb24ocmVzb3VyY2VJbnN0YW5jZSk7CisKKwkJTG9uZyBjcmVhdGlvbkRhdGUgPSByZXNvdXJjZUluc3RhbmNlLmdldENyZWF0aW9uVGltZSgpOworCQlpZiAoY3JlYXRpb25EYXRlID09IG51bGwpIHsKKwkJCWNyZWF0aW9uRGF0ZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CisJCWRhdGFEZWZpbml0aW9uLnNldENyZWF0aW9uVGltZShjcmVhdGlvbkRhdGUpOworCQlkYXRhRGVmaW5pdGlvbi5zZXRNb2RpZmljYXRpb25UaW1lKGNyZWF0aW9uRGF0ZSk7CisJCS8vIGRhdGFEZWZpbml0aW9uLnNldFJlc291cmNlVWlkKHJlc291cmNlVWlkKTsKKwkJLy8gU3RyaW5nIHJlcGxhY21lbnRsb2dpY2FsTmFtZSA9IGxvZ2ljYWxOYW1lLnJlcGxhY2VBbGwoIiAiLAorCQkvLyAiXyIpLnRvTG93ZXJDYXNlKCk7CisJCWRhdGFEZWZpbml0aW9uLnNldE5hbWUobG9naWNhbE5hbWUpOworCQlpZiAoZGF0YURlZmluaXRpb24uZ2V0Tm9ybWFsaXplZE5hbWUoKSA9PSBudWxsKQorCQkJZGF0YURlZmluaXRpb24uc2V0Tm9ybWFsaXplZE5hbWUoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudEluc3RhbmNlTmFtZShsb2dpY2FsTmFtZSkpOworCQlkYXRhRGVmaW5pdGlvbi5zZXRVbmlxdWVJZChVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXNvdXJjZUluc3RhbmNlVW5pdXFlSWQoY29tcG9uZW50SWQsIGNpT3JpZ2luQ29tcG9uZW50VWlkLCBkYXRhRGVmaW5pdGlvbi5nZXROb3JtYWxpemVkTmFtZSgpKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VEYXRhIHJlc291cmNlSW5zdGFuY2VEYXRhID0gbmV3IENvbXBvbmVudEluc3RhbmNlRGF0YShkYXRhRGVmaW5pdGlvbik7CisKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2VEYXRhOworCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZW1vdmVDb21wb25lbnRJbnN0YW5jZUZyb21Db21wb25lbnQoTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBTdHJpbmcgY29udGFpbmVyQ29tcG9uZW50SWQsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZVVpZCkgeworCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZGVsZXRlIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB1bmRlciBjb21wb25lbnQge30iLCBjb21wb25lbnRJbnN0YW5jZVVpZCwgY29udGFpbmVyQ29tcG9uZW50SWQpOworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlID0gZmluZFJlc291cmNlSW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2VVaWQpOworCisJCWlmIChub2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gbm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucHJvY2Vzc0Vjb21wRXJyb3IoRWNvbXBFcnJvck5hbWUuQmVEYW9TeXN0ZW1FcnJvciwgIlJlbW92ZSBDb21wb25lbnQgSW5zdGFuY2UiKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJSZW1vdmUgQ29tcG9uZW50IEluc3RhbmNlIik7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgY29tcG9uZW50IGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJbnN0YW5jZVVpZCwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGlzQ29tcG9uZW50SW5zdE9mQ29tcG9uZW50ID0gdmVyaWZ5UmVzb3VyY2VJbnN0YW5jZVVuZGVyQ29tcG9uZW50KGNvbnRhaW5lck5vZGVUeXBlLCBjb250YWluZXJDb21wb25lbnRJZCwgY29tcG9uZW50SW5zdGFuY2VVaWQpOworCQlpZiAoaXNDb21wb25lbnRJbnN0T2ZDb21wb25lbnQgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoaXNDb21wb25lbnRJbnN0T2ZDb21wb25lbnQpOworCQl9CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlT3V0Z29pbmdSZWxhdGlvbnNoaXBzKGNvbnRhaW5lck5vZGVUeXBlLCBjb250YWluZXJDb21wb25lbnRJZCwgY29tcG9uZW50SW5zdGFuY2VVaWQpOworCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKwkJc3RhdHVzID0gZGVsZXRlSW5jb21pbmdSZWxhdGlvbnNoaXBzKGNvbnRhaW5lck5vZGVUeXBlLCBjb250YWluZXJDb21wb25lbnRJZCwgY29tcG9uZW50SW5zdGFuY2VVaWQpOworCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQkvLyBkZWxldGUgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzCisJCXN0YXR1cyA9IGRlbGV0ZUFzc29jaWF0ZWRQcm9wZXJ0aWVzKGNvbXBvbmVudEluc3RhbmNlVWlkKTsKKwkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCS8vIGRlbGV0ZSBhc3NvY2lhdGVkIHByb3BlcnRpZXMKKwkJc3RhdHVzID0gZGVsZXRlQXNzb2NpYXRlZEF0dHJpYnV0ZXMoY29tcG9uZW50SW5zdGFuY2VVaWQpOworCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQkvLyBkZWxldGUgYXNzb2NpYXRlZCBhcnRpZmFjdHMKKwkJc3RhdHVzID0gZGVsZXRlQXNzb2NpYXRlZEFydGlmYWN0cyhjb21wb25lbnRJbnN0YW5jZVVpZCk7CisJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCS8vIGRlbGV0ZSBhc3NvY2lhdGVkIGNhcGFiaWxpdHkgaW5zdGFuY2VzCisJCWlmIChjb250YWluZXJOb2RlVHlwZS5lcXVhbHMoTm9kZVR5cGVFbnVtLlJlc291cmNlKSkgeworCQkJc3RhdHVzID0gZGVsZXRlQXNzb2NpYXRlZENhcGFiaWxpdHlJbnN0YW5jZXMoY29tcG9uZW50SW5zdGFuY2VVaWQpOworCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfQorCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUkkgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIGNvbXBvbmVudEluc3RhbmNlVWlkLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCisJCWlmIChkZWxldGVSSS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZVJpU3RhdHVzID0gZGVsZXRlUkkucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJbnN0YW5jZVVpZCwgZGVsZXRlUmlTdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChkZWxldGVSaVN0YXR1cyk7CisJCX0KKworCQlDb21wb25lbnRJbnN0YW5jZURhdGEgZGVsZXRlZFJlc291cmNlSW5zdCA9IGRlbGV0ZVJJLmxlZnQoKS52YWx1ZSgpOworCisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2UoZGVsZXRlZFJlc291cmNlSW5zdC5nZXRDb21wb25lbnRJbnN0RGF0YURlZmluaXRpb24oKSk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlSW5zdGFuY2UpOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgZGVsZXRlQXNzb2NpYXRlZENhcGFiaWxpdHlJbnN0YW5jZXMoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCkgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBkZWxldGluZyBhbGwgY2FwYWJpbGl0eSBpbnN0YW5jZXMgb2YgY29tcG9uZW50IGlzdGFuY2Uge30uIiwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1JlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgcmVzb3VyY2VJbnN0YW5jZUlkLAorCQkJCUdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsIE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5SW5zdCwgQ2FwYWJpbGl0eUluc3REYXRhLmNsYXNzKTsKKworCQlpZiAoZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkgJiYgIWdldENhcGFiaWxpdHlJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQlzdGF0dXMgPSBnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdHkgSW5zdGFuY2VzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIHN0YXR1cyk7CisJCX0KKwkJaWYgKGdldENhcGFiaWxpdHlJbnN0YW5jZXNSZXMuaXNMZWZ0KCkpIHsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4gY2FwYWJpbGl0eUluc3RhbmNlUGFpciA6IGdldENhcGFiaWxpdHlJbnN0YW5jZXNSZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQlFaXRoZXI8Q2FwYWJpbGl0eUluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQ2FiYWJpbGl0eUluc3RhbmNlUmVzID0gY2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uLmRlbGV0ZUNhcGFiaWxpdHlJbnN0YW5jZUZyb21SZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUluc3RhbmNlUGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSk7CisJCQkJaWYgKGRlbGV0ZUNhYmFiaWxpdHlJbnN0YW5jZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJc3RhdHVzID0gZGVsZXRlQ2FiYWJpbGl0eUluc3RhbmNlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBhbGwgY2FwYWJpbGl0eSBpbnN0YW5jZXMgb2YgY29tcG9uZW50IGlzdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUFzc29jaWF0ZWRBcnRpZmFjdHMoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVaWQpIHsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdFJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgR3JhcGhFZGdlTGFiZWxzLkFSVElGQUNUX1JFRiwKKwkJCQlOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIEFydGlmYWN0RGF0YS5jbGFzcyk7CisKKwkJaWYgKGFydGlmYWN0UmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYXJ0aWZhY3RSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIGFydGlmYWN0cyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgc3RhdHVzKTsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQl9IGVsc2UgeworCisJCQlMaXN0PEltbXV0YWJsZVBhaXI8QXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2U+PiBhcnRpZmFjdFBhaXJzID0gYXJ0aWZhY3RSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8QXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2U+IHBhaXIgOiBhcnRpZmFjdFBhaXJzKSB7CisJCQkJU3RyaW5nIHVuaXF1ZUlkID0gKFN0cmluZykgcGFpci5sZWZ0LmdldFVuaXF1ZUlkKCk7CisJCQkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlbW92ZUFyaWZhY3RGcm9tR3JhcGggPSBhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcnRpZmFjdE9uR3JhcGgocmVzb3VyY2VJbnN0YW5jZVVpZCwgdW5pcXVlSWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCByZXNvdXJjZUluc3RhbmNlVWlkLCB0cnVlKTsKKwkJCQlpZiAocmVtb3ZlQXJpZmFjdEZyb21HcmFwaC5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmVtb3ZlQXJpZmFjdEZyb21HcmFwaC5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSBhcnRpZmFjdCBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgc3RhdHVzKTsKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisKKwkJCX0KKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgZGVsZXRlQXNzb2NpYXRlZFByb3BlcnRpZXMoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVaWQpIHsKKwkJZmluYWwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VDb25lY3RpbmdUb1JJID0gR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFOworCQlmaW5hbCBOb2RlVHlwZUVudW0gZWxlbWVudFR5cGVUb0RlbGV0ZSA9IE5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlOworCQlyZXR1cm4gZGVsZXRlQXNzb2NpYXRlZFJJRWxlbWVudHMoZWxlbWVudFR5cGVUb0RlbGV0ZSwgZWRnZUNvbmVjdGluZ1RvUkksIHJlc291cmNlSW5zdGFuY2VVaWQsICgpIC0+IFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgZGVsZXRlQXNzb2NpYXRlZEF0dHJpYnV0ZXMoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVaWQpIHsKKwkJZmluYWwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VDb25lY3RpbmdUb1JJID0gR3JhcGhFZGdlTGFiZWxzLkFUVFJJQlVURV9WQUxVRTsKKwkJZmluYWwgTm9kZVR5cGVFbnVtIGVsZW1lbnRUeXBlVG9EZWxldGUgPSBOb2RlVHlwZUVudW0uQXR0cmlidXRlVmFsdWU7CisJCXJldHVybiBkZWxldGVBc3NvY2lhdGVkUklFbGVtZW50cyhlbGVtZW50VHlwZVRvRGVsZXRlLCBlZGdlQ29uZWN0aW5nVG9SSSwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgKCkgLT4gQXR0cmlidXRlVmFsdWVEYXRhLmNsYXNzKTsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBUaXRhbk9wZXJhdGlvblN0YXR1cyBkZWxldGVBc3NvY2lhdGVkUklFbGVtZW50cyhOb2RlVHlwZUVudW0gZWxlbWVudFR5cGVUb0RlbGV0ZSwgR3JhcGhFZGdlTGFiZWxzIGVkZ2VDb25lY3RpbmdUb1JJLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCwgU3VwcGxpZXI8Q2xhc3M8VD4+IGNsYXNzR2VuKSB7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxULCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVsZW1lbnRzTm9kZXNSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VVaWQsIGVkZ2VDb25lY3RpbmdUb1JJLCBlbGVtZW50VHlwZVRvRGVsZXRlLAorCQkJCWNsYXNzR2VuLmdldCgpKTsKKworCQlpZiAoZWxlbWVudHNOb2Rlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGVsZW1lbnRzTm9kZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoImRlbGV0ZUFzc29jaWF0ZWRSSUVsZW1lbnRzIiwgIkZhaWxlZCB0byBmaW5kIHRoZSBlbGVtZW50cyBvZiByZXNvdXJjZSBpbnN0YW5jZSAiICsgcmVzb3VyY2VJbnN0YW5jZVVpZCArICIuIHN0YXR1cyBpcyAiICsgc3RhdHVzLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQl9IGVsc2UgeworCisJCQlMaXN0PEltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPj4gcmVsYXRpb25zaGlwTm9kZXMgPSBlbGVtZW50c05vZGVzUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJlbGF0aW9uc2hpcE5vZGVzICE9IG51bGwpIHsKKwkJCQlmb3IgKEltbXV0YWJsZVBhaXI8VCwgR3JhcGhFZGdlPiBpbW11dGFibGVQYWlyIDogcmVsYXRpb25zaGlwTm9kZXMpIHsKKwkJCQkJVCBlbGVtZW50VmFsdWVEYXRhRGF0YSA9IGltbXV0YWJsZVBhaXIuZ2V0S2V5KCk7CisJCQkJCUVpdGhlcjxULCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKGVsZW1lbnRWYWx1ZURhdGFEYXRhLCBjbGFzc0dlbi5nZXQoKSk7CisJCQkJCWlmIChkZWxldGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoImRlbGV0ZUFzc29jaWF0ZWRSSUVsZW1lbnRzIiwgIkZhaWxlZCB0byBkZWxldGUgZWxlbWVudCB2YWx1ZSBub2RlICIgKyBlbGVtZW50VmFsdWVEYXRhRGF0YSArICIuIHN0YXR1cyBpcyAiICsgc3RhdHVzLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwkvKioKKwkgKiBkZWxldGUgYWxsIHJlbGF0aW9uc2hpcCBpbnN0YW5jZSBub2RlcyB3aGljaCBoYXMgYW4gb3V0Z29pbmcgZWRnZSB0byBhIGdpdmVuIHJlc291cmNlIGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VVaWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBkZWxldGVJbmNvbWluZ1JlbGF0aW9uc2hpcHMoTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVaWQpIHsKKworCQlFaXRoZXI8TGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVsYXRpb25zRm9yVGFyZ2V0ID0gZ2V0UmVsYXRpb25zRm9yVGFyZ2V0KHJlc291cmNlSW5zdGFuY2VVaWQpOworCQlpZiAocmVsYXRpb25zRm9yVGFyZ2V0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmVsYXRpb25zRm9yVGFyZ2V0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCB0aGUgcmVsYXRpb25zaGlwcyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgc3RhdHVzKTsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQl9IGVsc2UgeworCQkJTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IHJlbExpc3QgPSByZWxhdGlvbnNGb3JUYXJnZXQubGVmdCgpLnZhbHVlKCk7CisJCQlmb3IgKFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZWxhdGlvbiA6IHJlbExpc3QpIHsKKwkJCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkaXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMgPSBkaXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGUsIHJlbGF0aW9uLCB0cnVlKTsKKwkJCQlpZiAoZGlzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBkaWFzc29jaWF0ZSBjb21wb25lbnQgaW5zdGFuY2Uge30gYW5kIGNvbXBvbmVudCBpbnN0YW5jZSB7fSB1bmRlciBjb21wb25lbnQge30uIGVycm9yIGlzIHt9IiwgcmVsYXRpb24uZ2V0RnJvbU5vZGUoKSwgcmVsYXRpb24uZ2V0VG9Ob2RlKCksIGNvbXBvbmVudElkKTsKKwkJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwkvKioKKwkgKiBkZWxldGUgYWxsIHJlbGF0aW9uc2hpcCBpbnN0YW5jZSBub2RlcyB3aGljaCBoYXMgYW4gaW5jb21pbmcgZWRnZSBmcm9tIGEgZ2l2ZW4gcmVzb3VyY2UgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZVVpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZU91dGdvaW5nUmVsYXRpb25zaGlwcyhOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCkgeworCisJCUVpdGhlcjxMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZWxhdGlvbnNGb3JTb3VyY2UgPSBnZXRSZWxhdGlvbnNGb3JTb3VyY2UocmVzb3VyY2VJbnN0YW5jZVVpZCk7CisJCWlmIChyZWxhdGlvbnNGb3JTb3VyY2UuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZWxhdGlvbnNGb3JTb3VyY2UucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHRoZSByZWxhdGlvbnNoaXBzIG9mIHJlc291cmNlIGluc3RhbmNlICIgKyByZXNvdXJjZUluc3RhbmNlVWlkICsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCXJldHVybiBzdGF0dXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gcmVsTGlzdCA9IHJlbGF0aW9uc0ZvclNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlbGF0aW9uIDogcmVsTGlzdCkgeworCQkJCUVpdGhlcjxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRpc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyA9IGRpc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZSwgcmVsYXRpb24sIHRydWUpOworCQkJCWlmIChkaXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGRpYXNzb2NpYXRlIGNvbXBvbmVudCBpbnN0YW5jZSB7fSBhbmQgY29tcG9uZW50IGluc3RhbmNlIHt9IHVuZGVyIGNvbXBvbmVudCB7fS4gZXJyb3IgaXMge30iLCByZWxhdGlvbi5nZXRGcm9tTm9kZSgpLCByZWxhdGlvbi5nZXRUb05vZGUoKSwgY29tcG9uZW50SWQpOworCQkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCS8qKgorCSAqIGRlbGV0ZSByZWxhdGlvbnNoaXAgaW5zdGFuY2Ugbm9kZXMKKwkgKiAKKwkgKiBAcGFyYW0gcmVsYXRpb25zaGlwTm9kZXMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBkZWxldGVSZWxhdGlvbnNoaXBOb2RlcyhMaXN0PEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIEdyYXBoRWRnZT4+IHJlbGF0aW9uc2hpcE5vZGVzKSB7CisKKwkJaWYgKHJlbGF0aW9uc2hpcE5vZGVzICE9IG51bGwpIHsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgR3JhcGhFZGdlPiBpbW11dGFibGVQYWlyIDogcmVsYXRpb25zaGlwTm9kZXMpIHsKKwkJCQlSZWxhdGlvbnNoaXBJbnN0RGF0YSByZWxhdGlvbnNoaXBUeXBlSW1wbERhdGEgPSBpbW11dGFibGVQYWlyLmdldEtleSgpOworCQkJCUVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShyZWxhdGlvbnNoaXBUeXBlSW1wbERhdGEsIFJlbGF0aW9uc2hpcEluc3REYXRhLmNsYXNzKTsKKwkJCQlpZiAoZGVsZXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSByZWxhdGlvbnNoaXAgbm9kZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVsYXRpb25zaGlwVHlwZUltcGxEYXRhLCBzdGF0dXMpOworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVsYXRpb25zaGlwSW5zdERhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZShTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmKSB7CisKKwkJaWYgKHJlcXVpcmVtZW50RGVmLmdldFJlbGF0aW9uc2hpcHMoKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk5vIHJlbGF0aW9uIHBhaXIgaW4gcmVxdWVzdCBbIHt9IF0iLCByZXF1aXJlbWVudERlZik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQl9CisKKwkJU3RyaW5nIGZyb21SZXNJbnN0YW5jZVVpZCA9IHJlcXVpcmVtZW50RGVmLmdldEZyb21Ob2RlKCk7CisJCVN0cmluZyB0b1Jlc0luc3RhbmNlVWlkID0gcmVxdWlyZW1lbnREZWYuZ2V0VG9Ob2RlKCk7CisKKwkJLy8gREUxOTE3MDcKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgaXNSZXNvdXJjZUluc3RPZlNlcnZpY2UgPSB2ZXJpZnlSZXNvdXJjZUluc3RhbmNlVW5kZXJDb21wb25lbnQobm9kZVR5cGUsIGNvbXBvbmVudElkLCBmcm9tUmVzSW5zdGFuY2VVaWQpOworCQlpZiAoaXNSZXNvdXJjZUluc3RPZlNlcnZpY2UgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoaXNSZXNvdXJjZUluc3RPZlNlcnZpY2UpOworCQl9CisJCWlzUmVzb3VyY2VJbnN0T2ZTZXJ2aWNlID0gdmVyaWZ5UmVzb3VyY2VJbnN0YW5jZVVuZGVyQ29tcG9uZW50KG5vZGVUeXBlLCBjb21wb25lbnRJZCwgdG9SZXNJbnN0YW5jZVVpZCk7CisJCWlmIChpc1Jlc291cmNlSW5zdE9mU2VydmljZSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChpc1Jlc291cmNlSW5zdE9mU2VydmljZSk7CisJCX0KKworCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25QYWlyTGlzdCA9IHJlcXVpcmVtZW50RGVmLmdldFJlbGF0aW9uc2hpcHMoKTsKKworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByaUZyb20gPSB0aXRhbkdlbmVyaWNEYW8uZ2V0VmVydGV4QnlQcm9wZXJ0eShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIGZyb21SZXNJbnN0YW5jZVVpZCk7CisJCWlmIChyaUZyb20uaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCBjb21wb25lbnQgaW5zdGFuY2Uge30uIEVycm9yOiB7fSIsIGZyb21SZXNJbnN0YW5jZVVpZCwgcmlGcm9tLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJpRnJvbS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gcmlGcm9tLmxlZnQoKS52YWx1ZSgpLmVkZ2VzKERpcmVjdGlvbi5PVVQsIEdyYXBoRWRnZUxhYmVscy5SRUxBVElPTlNISVBfSU5TVC5nZXRQcm9wZXJ0eSgpKTsKKwkJaWYgKGVkZ2VJdGVyID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiTm8gZWRnZXMgd2l0aCBsYWJlbCB7fSBmb3Igb3duZXIgUkkge30iLCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVF9GVUxMRklMTEVELmdldFByb3BlcnR5KCksIGZyb21SZXNJbnN0YW5jZVVpZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKwkJTGlzdDxSZWxhdGlvbnNoaXBJbnN0RGF0YT4gZGVsZXRlZFJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PFN0cmluZz4gdmVydGV4VG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJd2hpbGUgKGVkZ2VJdGVyLmhhc05leHQoKSkgeworCQkJVGl0YW5FZGdlIGVkZ2UgPSAoVGl0YW5FZGdlKSBlZGdlSXRlci5uZXh0KCk7CisJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVkZ2UucHJvcGVydHkoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKS52YWx1ZSgpOworCQkJZm9yIChSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25QYWlyIDogcmVsYXRpb25QYWlyTGlzdCkgeworCQkJCWlmIChyZWxhdGlvblBhaXIuZ2V0UmVxdWlyZW1lbnQoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQkJVGl0YW5WZXJ0ZXggaW5WZXJ0ZXggPSBlZGdlLmluVmVydGV4KCk7CisJCQkJCVN0cmluZyByZXF1aXJlbWVudElkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGluVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVNRU5UX0lELmdldFByb3BlcnR5KCkpOworCQkJCQlTdHJpbmcgY2FwYWJpbHR5SWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoaW5WZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ0FQQUJJTElUWV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJU3RyaW5nIHJlcXVpcmVtZW50T3duZXJJZCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShpblZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFTUVOVF9PV05FUl9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJU3RyaW5nIGNhcGFiaWx0eU93bmVySWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoaW5WZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ0FQQUJJTElUWV9PV05FUl9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJU3RyaW5nIHJlbGF0aW9uVmVydGV4SWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoaW5WZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCisJCQkJCS8vIHZlcmlmeSB2cyByZXF1aXJlbWVudCBpZCBhbmQgb3duZXIgaWRzLiAoIGZvcgorCQkJCQkvLyByZXF1aXJlbWVudHMgd2l0aCBzYW1lIG5hbWUpCisJCQkJCWlmIChyZXF1aXJlbWVudElkLmVxdWFscyhyZWxhdGlvblBhaXIuZ2V0UmVxdWlyZW1lbnRVaWQoKSkgJiYgY2FwYWJpbHR5SWQuZXF1YWxzKHJlbGF0aW9uUGFpci5nZXRDYXBhYmlsaXR5VWlkKCkpICYmIHJlcXVpcmVtZW50T3duZXJJZC5lcXVhbHMocmVsYXRpb25QYWlyLmdldFJlcXVpcmVtZW50T3duZXJJZCgpKQorCQkJCQkJCSYmIGNhcGFiaWx0eU93bmVySWQuZXF1YWxzKHJlbGF0aW9uUGFpci5nZXRDYXBhYmlsaXR5T3duZXJJZCgpKSkgeworCQkJCQkJdmVydGV4VG9EZWxldGUuYWRkKHJlbGF0aW9uVmVydGV4SWQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWxvZy5kZWJ1ZygicmVsYXRpb24gbm9kZSB3aXRoIGlkczoge30gYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWQiLCB2ZXJ0ZXhUb0RlbGV0ZSk7CisJCWZvciAoU3RyaW5nIHJlbGF0aW9uVmVydGV4SWQgOiB2ZXJ0ZXhUb0RlbGV0ZSkgeworCQkJLy8gcmVtb3ZlIHJlbGF0aW9uIHZlcnRleAorCQkJRWl0aGVyPFJlbGF0aW9uc2hpcEluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVsYXRpb25Ob2RlID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlbGF0aW9uc2hpcEluc3QpLCByZWxhdGlvblZlcnRleElkLCBSZWxhdGlvbnNoaXBJbnN0RGF0YS5jbGFzcyk7CisJCQlpZiAocmVsYXRpb25Ob2RlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSByZWxhdGlvbiBub2RlIHdpdGggaWQge30uIEVycm9yOiB7fSIsIHJlbGF0aW9uVmVydGV4SWQsIHJlbGF0aW9uTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVsYXRpb25Ob2RlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCQlSZWxhdGlvbnNoaXBJbnN0RGF0YSBkZWxldGVkUmVsYXRpb24gPSByZWxhdGlvbk5vZGUubGVmdCgpLnZhbHVlKCk7CisJCQlkZWxldGVkUmVsYXRpb25zLmFkZChkZWxldGVkUmVsYXRpb24pOworCQl9CisJCWlmIChkZWxldGVkUmVsYXRpb25zLnNpemUoKSA+IDApIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChkZWxldGVkUmVsYXRpb25zKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRpc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50RGVmLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlTdHJpbmcgZnJvbVJlc0luc3RhbmNlVWlkID0gcmVxdWlyZW1lbnREZWYuZ2V0RnJvbU5vZGUoKTsKKwkJU3RyaW5nIHRvUmVzSW5zdGFuY2VVaWQgPSByZXF1aXJlbWVudERlZi5nZXRUb05vZGUoKTsKKwkJU3RyaW5nIHJlcXVpcmVtZW50ID0gcmVxdWlyZW1lbnREZWYuZ2V0UmVsYXRpb25zaGlwcygpLmdldCgwKS5nZXRSZXF1aXJlbWVudCgpOworCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCisJCQlFaXRoZXI8TGlzdDxSZWxhdGlvbnNoaXBJbnN0RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkaXNzb2NpYXRlUmVzID0gZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZShjb21wb25lbnRJZCwgbm9kZVR5cGUsIHJlcXVpcmVtZW50RGVmKTsKKwkJCWlmIChkaXNzb2NpYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRpc3NvY2lhdGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRpc3NvY2lhdGUgcmVzb3VyY2UgaW5zdGFuY2UgIiArIGZyb21SZXNJbnN0YW5jZVVpZCArICIgZnJvbSByZXNvdXJjZSBpbnN0YW5jZSAiICsgdG9SZXNJbnN0YW5jZVVpZCArICIgaW4gc2VydmljZSAiICsgY29tcG9uZW50SWQgKyAiLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRGFvU3lzdGVtRXJyb3IoImRpc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXMiKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB1cGRhdGVDYWxjdWxhdGVkQ2FwUmVxUmVzdWx0ID0gdXBkYXRlQ2FsY3VsYXRlZENhcFJlcShyZXF1aXJlbWVudERlZiwgZmFsc2UpOworCQkJaWYgKCF1cGRhdGVDYWxjdWxhdGVkQ2FwUmVxUmVzdWx0LmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZURhb1N5c3RlbUVycm9yLCAiZGlzc29jaWF0ZUNvbXBvbmVudEluc3RhbmNlcyIpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZURhb1N5c3RlbUVycm9yKCJkaXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VzIik7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGlzc29jaWF0ZSBjb21wb25lbnQgaW5zdGFuY2VzIHt9LiBTdGF0dXMgaXMge30iLCByZXF1aXJlbWVudERlZiwgdXBkYXRlQ2FsY3VsYXRlZENhcFJlcVJlc3VsdCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHVwZGF0ZUNhbGN1bGF0ZWRDYXBSZXFSZXN1bHQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCS8vIFJlbGF0aW9uc2hpcEluc3REYXRhIHJlbGF0aW9uc2hpcEluc3REYXRhID0KKwkJCS8vIGRpc3NvY2lhdGVSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlMaXN0PFJlbGF0aW9uc2hpcEluc3REYXRhPiByZWxhdGlvbnNoaXBJbnN0RGF0YSA9IGRpc3NvY2lhdGVSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgY2FwYWJpbGl0eVJlbERlZiA9IGJ1aWxkQ2FwYWJpbGl0eVJlc3VsdChmcm9tUmVzSW5zdGFuY2VVaWQsIHRvUmVzSW5zdGFuY2VVaWQsIHJlcXVpcmVtZW50LCByZWxhdGlvbnNoaXBJbnN0RGF0YSk7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNhcGFiaWxpdHlSZWxEZWYpOworCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWNvbW1pdE9yUm9sbGJhY2socmVzdWx0KTsKKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZUNhbGN1bGF0ZWRDYXBSZXEoUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGNhcGFiaWxpdHlSZWxEZWYsIGJvb2xlYW4gYXNzb2NpYXRlKSB7CisJCUdyYXBoRWRnZUxhYmVscyByZXF1aXJtZW50TmV3TGFiZWwgPSBhc3NvY2lhdGUgPyBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVF9GVUxMRklMTEVEIDogR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfUkVRVUlSRU1FTlQ7CisKKwkJR3JhcGhFZGdlTGFiZWxzIHJlcXVpcm1lbnRDdXJyZW50TGFiZWwgPSBhc3NvY2lhdGUgPyBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVCA6IEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX1JFUVVJUkVNRU5UX0ZVTExGSUxMRUQ7CisKKwkJR3JhcGhFZGdlTGFiZWxzIGNhcGFiaWxpdHlOZXdMYWJlbCA9IGFzc29jaWF0ZSA/IEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX0NBUEFCSUxJVFlfRlVMTEZJTExFRCA6IEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX0NBUEFCSUxJVFk7CisKKwkJR3JhcGhFZGdlTGFiZWxzIGNhcGFiaWxpdHlDdXJyZW50TGFiZWwgPSBhc3NvY2lhdGUgPyBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZIDogR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfQ0FQQUJJTElUWV9GVUxMRklMTEVEOworCisJCUxpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPiByZWxhdGlvbnNoaXBzID0gY2FwYWJpbGl0eVJlbERlZi5nZXRSZWxhdGlvbnNoaXBzKCk7CisJCWZvciAoUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHBhaXIgOiByZWxhdGlvbnNoaXBzKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHVwZGF0ZVJlcXVpcmVtZW50RWRnZXMocmVxdWlybWVudE5ld0xhYmVsLCByZXF1aXJtZW50Q3VycmVudExhYmVsLCBwYWlyLCBjYXBhYmlsaXR5UmVsRGVmLmdldEZyb21Ob2RlKCkpOworCQkJaWYgKCFzdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJCXN0YXR1cyA9IHVwZGF0ZUNhcGFiaWx0eUVkZ2VzKGNhcGFiaWxpdHlOZXdMYWJlbCwgY2FwYWJpbGl0eUN1cnJlbnRMYWJlbCwgcGFpciwgY2FwYWJpbGl0eVJlbERlZi5nZXRUb05vZGUoKSk7CisJCQlpZiAoIXN0YXR1cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB1cGRhdGVSZXF1aXJlbWVudEVkZ2VzKEdyYXBoRWRnZUxhYmVscyByZXF1aXJtZW50TmV3TGFiZWwsIEdyYXBoRWRnZUxhYmVscyByZXF1aXJtZW50Q3VycmVudExhYmVsLCBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcGFpciwgU3RyaW5nIHJlcXVpcmVtZW50T3duZXJJZCkgeworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXFPd25lclJJID0gdGl0YW5HZW5lcmljRGFvLmdldFZlcnRleEJ5UHJvcGVydHkoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLCByZXF1aXJlbWVudE93bmVySWQpOworCQlpZiAocmVxT3duZXJSSS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHJlcXVpcm1lbnQgT3duZXIgYnkgSWQge30uIEVycm9yOiB7fSIsIHJlcXVpcmVtZW50T3duZXJJZCwgcmVxT3duZXJSSS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMocmVxT3duZXJSSS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gcmVxT3duZXJSSS5sZWZ0KCkudmFsdWUoKS5lZGdlcyhEaXJlY3Rpb24uT1VULCByZXF1aXJtZW50Q3VycmVudExhYmVsLm5hbWUoKSwgcmVxdWlybWVudE5ld0xhYmVsLm5hbWUoKSk7CisJCWlmIChlZGdlSXRlciA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIk5vIGVkZ2VzIHdpdGggbGFiZWwge30gZm9yIHdvbmVyIFJJIHt9IiwgcmVxdWlybWVudEN1cnJlbnRMYWJlbCwgcmVxdWlyZW1lbnRPd25lcklkKTsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwkJYm9vbGVhbiBhc3NvY2lhdGUgPSByZXF1aXJtZW50TmV3TGFiZWwuZXF1YWxzKEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX1JFUVVJUkVNRU5UX0ZVTExGSUxMRUQpID8gdHJ1ZSA6IGZhbHNlOworCQl3aGlsZSAoZWRnZUl0ZXIuaGFzTmV4dCgpKSB7CisJCQlUaXRhbkVkZ2UgZWRnZSA9IChUaXRhbkVkZ2UpIGVkZ2VJdGVyLm5leHQoKTsKKwkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZWRnZS5wcm9wZXJ0eShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpLnZhbHVlKCk7CisJCQlpZiAocGFpci5nZXRSZXF1aXJlbWVudCgpLmVxdWFscyhuYW1lKSkgeworCQkJCVRpdGFuVmVydGV4IHJlcVZlcnRleCA9IGVkZ2UuaW5WZXJ0ZXgoKTsKKwkJCQlTdHJpbmcgcmVxdWlyZW1lbnRJZCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShyZXFWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQkJCS8vIHZlcmlmeSB2cyByZXF1aXJlbWVudCBpZCAuICggZm9yIHJlcXVpcmVtZW50cyB3aXRoIHNhbWUgbmFtZSkKKwkJCQlpZiAocmVxdWlyZW1lbnRJZC5lcXVhbHMocGFpci5nZXRSZXF1aXJlbWVudFVpZCgpKSkgeworCQkJCQlTdHJpbmcgb3duZXJJZE9uRWRnZSA9IChTdHJpbmcpIGVkZ2UudmFsdWUoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuT1dORVJfSUQuZ2V0UHJvcGVydHkoKSk7CisJCQkJCWlmIChvd25lcklkT25FZGdlLmVxdWFscyhwYWlyLmdldFJlcXVpcmVtZW50T3duZXJJZCgpKSkgeworCQkJCQkJU3RyaW5nIHJlcXVpcmVkT2NjdXJyZW5jZXMgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoZWRnZSwgR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRURfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQlTdHJpbmcgbGVmdE9jY3VycmVuY2VzID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGVkZ2UsIEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LkxFRlRfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisKKwkJCQkJCVN0cmluZyByZXF1aXJlZE9jY3VycmVuY2VzTmV3ID0gIjAiOworCQkJCQkJU3RyaW5nIGxlZnRPY2N1cnJlbmNlc05ldyA9IFJlcXVpcmVtZW50RGF0YS5NQVhfREVGQVVMVF9PQ0NVUlJFTkNFUzsKKwkJCQkJCWlmIChyZXF1aXJlZE9jY3VycmVuY2VzICE9IG51bGwpIHsKKwkJCQkJCQlJbnRlZ2VyIGlPY2N1cnJlbmNlcyA9IEludGVnZXIucGFyc2VJbnQocmVxdWlyZWRPY2N1cnJlbmNlcyk7CisJCQkJCQkJaWYgKGFzc29jaWF0ZSkgeworCQkJCQkJCQlpZiAoaU9jY3VycmVuY2VzID4gMCkgeworCQkJCQkJCQkJaU9jY3VycmVuY2VzLS07CisJCQkJCQkJCQlyZXF1aXJlZE9jY3VycmVuY2VzTmV3ID0gaU9jY3VycmVuY2VzLnRvU3RyaW5nKCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlTdHJpbmcgcmVxTWluT2NjdXJyZW5jZXMgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkocmVxVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk1JTl9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCQkJaWYgKHJlcU1pbk9jY3VycmVuY2VzID09IG51bGwpIHsKKwkJCQkJCQkJCXJlcU1pbk9jY3VycmVuY2VzID0gUmVxdWlyZW1lbnREYXRhLk1JTl9PQ0NVUlJFTkNFUzsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoSW50ZWdlci5wYXJzZUludChyZXFNaW5PY2N1cnJlbmNlcykgPiBpT2NjdXJyZW5jZXMpIHsKKwkJCQkJCQkJCWlPY2N1cnJlbmNlcysrOworCQkJCQkJCQkJcmVxdWlyZWRPY2N1cnJlbmNlc05ldyA9IGlPY2N1cnJlbmNlcy50b1N0cmluZygpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXMoZWRnZSk7CisJCQkJCQlwcm9wZXJ0aWVzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpLCByZXF1aXJlZE9jY3VycmVuY2VzTmV3KTsKKworCQkJCQkJaWYgKGxlZnRPY2N1cnJlbmNlcyAhPSBudWxsICYmICFsZWZ0T2NjdXJyZW5jZXMuZXF1YWxzKFJlcXVpcmVtZW50RGF0YS5NQVhfT0NDVVJSRU5DRVMpKSB7CisJCQkJCQkJSW50ZWdlciBpT2NjdXJyZW5jZXMgPSBJbnRlZ2VyLnBhcnNlSW50KGxlZnRPY2N1cnJlbmNlcyk7CisJCQkJCQkJaWYgKGFzc29jaWF0ZSkgeworCQkJCQkJCQlpZiAoaU9jY3VycmVuY2VzID4gMCkgeworCQkJCQkJCQkJaU9jY3VycmVuY2VzLS07CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpT2NjdXJyZW5jZXMrKzsKKwkJCQkJCQl9CisJCQkJCQkJbGVmdE9jY3VycmVuY2VzTmV3ID0gaU9jY3VycmVuY2VzLnRvU3RyaW5nKCk7CisJCQkJCQkJcHJvcGVydGllcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpLCBsZWZ0T2NjdXJyZW5jZXNOZXcpOworCQkJCQkJCWlmICgoYXNzb2NpYXRlICYmIGlPY2N1cnJlbmNlcyA9PSAwKSB8fCAoIWFzc29jaWF0ZSAmJiBpT2NjdXJyZW5jZXMgPT0gMSkpIHsKKwkJCQkJCQkJLy8gbW92ZSBlZGdlIHRvIGZ1bGwgZmlsbGVkIHN0YXRlCisJCQkJCQkJCVRpdGFuVmVydGV4IG91dFZlcnRleCA9IGVkZ2Uub3V0VmVydGV4KCk7CisJCQkJCQkJCVRpdGFuRWRnZSBuZXdFZGdlID0gb3V0VmVydGV4LmFkZEVkZ2UocmVxdWlybWVudE5ld0xhYmVsLmdldFByb3BlcnR5KCksIHJlcVZlcnRleCk7CisJCQkJCQkJCXRpdGFuR2VuZXJpY0Rhby5zZXRQcm9wZXJ0aWVzKG5ld0VkZ2UsIHByb3BlcnRpZXMpOworCQkJCQkJCQllZGdlLnJlbW92ZSgpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXRpdGFuR2VuZXJpY0Rhby5zZXRQcm9wZXJ0aWVzKGVkZ2UsIHByb3BlcnRpZXMpOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbGVmdE9jY3VycmVuY2VzTmV3ID0gbGVmdE9jY3VycmVuY2VzOworCQkJCQkJCXByb3BlcnRpZXMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LkxFRlRfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSwgbGVmdE9jY3VycmVuY2VzTmV3KTsKKwkJCQkJCQl0aXRhbkdlbmVyaWNEYW8uc2V0UHJvcGVydGllcyhlZGdlLCBwcm9wZXJ0aWVzKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZUNhcGFiaWx0eUVkZ2VzKEdyYXBoRWRnZUxhYmVscyBjYXBhYmlsdHlOZXdMYWJlbCwgR3JhcGhFZGdlTGFiZWxzIGNhcGFiaWx0eUN1cnJlbnRMYWJlbCwgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHBhaXIsIFN0cmluZyBjYXBhYmlsdHlPd25lcklkKSB7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcE93bmVyUkkgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0VmVydGV4QnlQcm9wZXJ0eShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIGNhcGFiaWx0eU93bmVySWQpOworCQlpZiAoY2FwT3duZXJSSS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHJlcXVpcm1lbnQgT3duZXIgYnkgSWQge30uIEVycm9yOiB7fSIsIGNhcGFiaWx0eU93bmVySWQsIGNhcE93bmVyUkkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNhcE93bmVyUkkucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlJdGVyYXRvcjxFZGdlPiBlZGdlSXRlciA9IGNhcE93bmVyUkkubGVmdCgpLnZhbHVlKCkuZWRnZXMoRGlyZWN0aW9uLk9VVCwgY2FwYWJpbHR5Q3VycmVudExhYmVsLm5hbWUoKSwgY2FwYWJpbHR5TmV3TGFiZWwubmFtZSgpKTsKKwkJaWYgKGVkZ2VJdGVyID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiTm8gZWRnZXMgd2l0aCBsYWJlbCB7fSBmb3Igb3duZXIgUkkge30iLCBjYXBhYmlsdHlDdXJyZW50TGFiZWwsIGNhcGFiaWx0eU93bmVySWQpOworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCQlib29sZWFuIGFzc29jaWF0ZSA9IGNhcGFiaWx0eU5ld0xhYmVsLmVxdWFscyhHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9DQVBBQklMSVRZX0ZVTExGSUxMRUQpID8gdHJ1ZSA6IGZhbHNlOworCisJCXdoaWxlIChlZGdlSXRlci5oYXNOZXh0KCkpIHsKKwkJCVRpdGFuRWRnZSBlZGdlID0gKFRpdGFuRWRnZSkgZWRnZUl0ZXIubmV4dCgpOworCQkJVGl0YW5WZXJ0ZXggY2FwVmVydGV4ID0gZWRnZS5pblZlcnRleCgpOworCQkJLy8gZWRnZS5wcm9wZXJ0eShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpLnZhbHVlKCk7CisKKwkJCVN0cmluZyBjYXBhYmlsdHlJZCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShjYXBWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQkJLy8gdmVyaWZ5IHZzIGNhcGFiaWxpdHkgaWQgLiAoIGZvciBjYXBhYmlsdHkgd2l0aCBzYW1lIG5hbWUpCisJCQlpZiAoY2FwYWJpbHR5SWQuZXF1YWxzKHBhaXIuZ2V0Q2FwYWJpbGl0eVVpZCgpKSkgeworCQkJCVN0cmluZyBvd25lcklkT25FZGdlID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGVkZ2UsIEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk9XTkVSX0lELmdldFByb3BlcnR5KCkpOworCQkJCWlmIChvd25lcklkT25FZGdlLmVxdWFscyhwYWlyLmdldENhcGFiaWxpdHlPd25lcklkKCkpKSB7CisKKwkJCQkJU3RyaW5nIHJlcXVpcmVkT2NjdXJyZW5jZXMgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoZWRnZSwgR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUkVRVUlSRURfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisJCQkJCVN0cmluZyBsZWZ0T2NjdXJyZW5jZXMgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoZWRnZSwgR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKworCQkJCQlTdHJpbmcgcmVxdWlyZWRPY2N1cnJlbmNlc05ldyA9ICIwIjsKKwkJCQkJU3RyaW5nIGxlZnRPY2N1cnJlbmNlc05ldyA9IENhcGFiaWxpdHlEYXRhLk1BWF9PQ0NVUlJFTkNFUzsKKwkJCQkJaWYgKHJlcXVpcmVkT2NjdXJyZW5jZXMgIT0gbnVsbCkgeworCQkJCQkJSW50ZWdlciBpT2NjdXJyZW5jZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHJlcXVpcmVkT2NjdXJyZW5jZXMpOworCQkJCQkJaWYgKGFzc29jaWF0ZSkgeworCQkJCQkJCWlmIChpT2NjdXJyZW5jZXMgPiAwKSB7CisJCQkJCQkJCWlPY2N1cnJlbmNlcy0tOworCQkJCQkJCQlyZXF1aXJlZE9jY3VycmVuY2VzTmV3ID0gaU9jY3VycmVuY2VzLnRvU3RyaW5nKCk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlTdHJpbmcgcmVxTWluT2NjdXJyZW5jZXMgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoY2FwVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk1JTl9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCQlpZiAocmVxTWluT2NjdXJyZW5jZXMgPT0gbnVsbCkgeworCQkJCQkJCQlyZXFNaW5PY2N1cnJlbmNlcyA9IENhcGFiaWxpdHlEYXRhLk1JTl9PQ0NVUlJFTkNFUzsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKEludGVnZXIucGFyc2VJbnQocmVxTWluT2NjdXJyZW5jZXMpID4gaU9jY3VycmVuY2VzKSB7CisJCQkJCQkJCWlPY2N1cnJlbmNlcysrOworCQkJCQkJCQlyZXF1aXJlZE9jY3VycmVuY2VzTmV3ID0gaU9jY3VycmVuY2VzLnRvU3RyaW5nKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKGVkZ2UpOworCQkJCQlwcm9wZXJ0aWVzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpLCByZXF1aXJlZE9jY3VycmVuY2VzTmV3KTsKKworCQkJCQlpZiAobGVmdE9jY3VycmVuY2VzICE9IG51bGwgJiYgIWxlZnRPY2N1cnJlbmNlcy5lcXVhbHMoQ2FwYWJpbGl0eURhdGEuTUFYX09DQ1VSUkVOQ0VTKSkgeworCQkJCQkJSW50ZWdlciBpT2NjdXJyZW5jZXMgPSBJbnRlZ2VyLnBhcnNlSW50KGxlZnRPY2N1cnJlbmNlcyk7CisJCQkJCQlpZiAoYXNzb2NpYXRlKSB7CisJCQkJCQkJaWYgKGlPY2N1cnJlbmNlcyA+IDApIHsKKwkJCQkJCQkJaU9jY3VycmVuY2VzLS07CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpT2NjdXJyZW5jZXMrKzsKKwkJCQkJCX0KKwkJCQkJCWxlZnRPY2N1cnJlbmNlc05ldyA9IGlPY2N1cnJlbmNlcy50b1N0cmluZygpOworCQkJCQkJcHJvcGVydGllcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpLCBsZWZ0T2NjdXJyZW5jZXNOZXcpOworCQkJCQkJaWYgKChhc3NvY2lhdGUgJiYgaU9jY3VycmVuY2VzID09IDApIHx8ICghYXNzb2NpYXRlICYmIGlPY2N1cnJlbmNlcyA9PSAxKSkgeworCQkJCQkJCS8vIG1vdmUgZWRnZSB0byBmdWxsIGZpbGxlZCBzdGF0ZQorCQkJCQkJCVRpdGFuVmVydGV4IG91dFZlcnRleCA9IGVkZ2Uub3V0VmVydGV4KCk7CisJCQkJCQkJVGl0YW5FZGdlIG5ld0VkZ2UgPSBvdXRWZXJ0ZXguYWRkRWRnZShjYXBhYmlsdHlOZXdMYWJlbC5nZXRQcm9wZXJ0eSgpLCBjYXBWZXJ0ZXgpOworCQkJCQkJCXRpdGFuR2VuZXJpY0Rhby5zZXRQcm9wZXJ0aWVzKG5ld0VkZ2UsIHByb3BlcnRpZXMpOworCQkJCQkJCWVkZ2UucmVtb3ZlKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRpdGFuR2VuZXJpY0Rhby5zZXRQcm9wZXJ0aWVzKGVkZ2UsIHByb3BlcnRpZXMpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJcHJvcGVydGllcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpLCBsZWZ0T2NjdXJyZW5jZXNOZXcpOworCQkJCQkJdGl0YW5HZW5lcmljRGFvLnNldFByb3BlcnRpZXMoZWRnZSwgcHJvcGVydGllcyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkaXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMoU3RyaW5nIHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxdWlyZW1lbnREZWYpIHsKKworCQlyZXR1cm4gZGlzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKHNlcnZpY2VJZCwgbm9kZVR5cGUsIHJlcXVpcmVtZW50RGVmLCBmYWxzZSk7CisJfQorCisJcHJpdmF0ZSBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgYnVpbGRDYXBhYmlsaXR5UmVzdWx0KFN0cmluZyBmcm9tUmVzSW5zdGFuY2VVaWQsIFN0cmluZyB0b1Jlc0luc3RhbmNlVWlkLCBTdHJpbmcgcmVxdWlyZW1lbnQsIExpc3Q8UmVsYXRpb25zaGlwSW5zdERhdGE+IHJlbGF0aW9uc2hpcEluc3REYXRhTGlzdCkgeworCisJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiBjYXBhYmlsaXR5UmVsRGVmID0gbmV3IFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZigpOworCQljYXBhYmlsaXR5UmVsRGVmLnNldEZyb21Ob2RlKGZyb21SZXNJbnN0YW5jZVVpZCk7CisJCWNhcGFiaWxpdHlSZWxEZWYuc2V0VG9Ob2RlKHRvUmVzSW5zdGFuY2VVaWQpOworCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25zaGlwcyA9IG5ldyBBcnJheUxpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPigpOworCQlmb3IgKFJlbGF0aW9uc2hpcEluc3REYXRhIHJlbGF0aW9uc2hpcEluc3REYXRhIDogcmVsYXRpb25zaGlwSW5zdERhdGFMaXN0KSB7CisJCQlSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcEltcGwgPSBuZXcgUmVsYXRpb25zaGlwSW1wbCgpOworCQkJcmVsYXRpb25zaGlwSW1wbC5zZXRUeXBlKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFR5cGUoKSk7CisJCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVxUmVsID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcihyZXF1aXJlbWVudCwgcmVsYXRpb25zaGlwSW1wbCk7CisJCQljYXBhYmlsaXR5UmVsRGVmLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwcyk7CisJCQlyZXFSZWwuc2V0Q2FwYWJpbGl0eU93bmVySWQocmVsYXRpb25zaGlwSW5zdERhdGEuZ2V0Q2FwYWJpbGl0eU93bmVySWQoKSk7CisJCQlyZXFSZWwuc2V0Q2FwYWJpbGl0eVVpZChyZWxhdGlvbnNoaXBJbnN0RGF0YS5nZXRDYXBhYmlsdHlJZCgpKTsKKwkJCXJlcVJlbC5zZXRSZXF1aXJlbWVudE93bmVySWQocmVsYXRpb25zaGlwSW5zdERhdGEuZ2V0UmVxdWlyZW1lbnRPd25lcklkKCkpOworCQkJcmVxUmVsLnNldFJlcXVpcmVtZW50VWlkKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFJlcXVpcmVtZW50SWQoKSk7CisJCQlyZWxhdGlvbnNoaXBzLmFkZChyZXFSZWwpOworCQl9CisJCXJldHVybiBjYXBhYmlsaXR5UmVsRGVmOworCisJfQorCisJcHVibGljIEVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UoU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBmcm9tUmVzSW5zdGFuY2VVaWQsIFN0cmluZyB0b1Jlc0luc3RhbmNlVWlkLCBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25QYWlyKSB7CisJCVN0cmluZyByZWxhdGlvbnNoaXAgPSBudWxsOworCQlTdHJpbmcgcmVxdWlyZW1lbnQgPSByZWxhdGlvblBhaXIuZ2V0UmVxdWlyZW1lbnQoKTsKKwkJaWYgKHJlbGF0aW9uUGFpci5nZXRSZWxhdGlvbnNoaXAoKSAhPSBudWxsKSB7CisJCQlyZWxhdGlvbnNoaXAgPSByZWxhdGlvblBhaXIuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZSgpOworCQl9CisKKwkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGFzc29jaWF0ZSByZXNvdXJjZSBpbnN0YW5jZSB7fSB0byByZXNvdXJjZSBpbnN0YW5jZSB7fSB1bmRlciBjb21wb25lbnQge30uIFJlcXVpcmVtZW50IGlzIHt9LiIsIGZyb21SZXNJbnN0YW5jZVVpZCwgdG9SZXNJbnN0YW5jZVVpZCwgY29tcG9uZW50SWQsIHJlcXVpcmVtZW50KTsKKwkJfQorCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmcm9tUmVzb3VyY2VJbnN0RGF0YVJlcyA9IGZpbmRNYW5kYXRvcnlSZXNvdXJjZUluc3REYXRhKGZyb21SZXNJbnN0YW5jZVVpZCk7CisJCWlmIChmcm9tUmVzb3VyY2VJbnN0RGF0YVJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZyb21SZXNvdXJjZUluc3REYXRhUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIGZyb21SZXNJbnN0YW5jZVVpZCwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCQlDb21wb25lbnRJbnN0YW5jZURhdGEgZnJvbVJlc291cmNlSW5zdGFuY2VEYXRhID0gZnJvbVJlc291cmNlSW5zdERhdGFSZXMubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB0b1Jlc291cmNlSW5zdERhdGFSZXMgPSBmaW5kTWFuZGF0b3J5UmVzb3VyY2VJbnN0RGF0YSh0b1Jlc0luc3RhbmNlVWlkKTsKKwkJaWYgKHRvUmVzb3VyY2VJbnN0RGF0YVJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHRvUmVzb3VyY2VJbnN0RGF0YVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHJlc291cmNlIGluc3RhbmNlICIgKyB0b1Jlc0luc3RhbmNlVWlkICsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCUNvbXBvbmVudEluc3RhbmNlRGF0YSB0b1Jlc291cmNlSW5zdGFuY2VEYXRhID0gdG9SZXNvdXJjZUluc3REYXRhUmVzLmxlZnQoKS52YWx1ZSgpOworCQkvLyBUSEUgY29tcG9uZW50IE5vZGVUeXBlRW51bSBzaG91bGQgYmUgc2VudAorCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBpc1Jlc291cmNlSW5zdE9mU2VydmljZSA9IHZlcmlmeVJlc291cmNlSW5zdGFuY2VVbmRlckNvbXBvbmVudChub2RlVHlwZSwgY29tcG9uZW50SWQsIGZyb21SZXNJbnN0YW5jZVVpZCk7CisJCWlmIChpc1Jlc291cmNlSW5zdE9mU2VydmljZSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChpc1Jlc291cmNlSW5zdE9mU2VydmljZSk7CisJCX0KKwkJaXNSZXNvdXJjZUluc3RPZlNlcnZpY2UgPSB2ZXJpZnlSZXNvdXJjZUluc3RhbmNlVW5kZXJDb21wb25lbnQobm9kZVR5cGUsIGNvbXBvbmVudElkLCB0b1Jlc0luc3RhbmNlVWlkKTsKKwkJaWYgKGlzUmVzb3VyY2VJbnN0T2ZTZXJ2aWNlICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGlzUmVzb3VyY2VJbnN0T2ZTZXJ2aWNlKTsKKwkJfQorCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFJlbGF0aW9uc2hpcFR5cGVEYXRhLCBTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaXNWYWxpZFJlcyA9IHZhbGlkYXRlUmVxdWlyZW1lbnRWc0NhcGFiaWxpdHkoZnJvbVJlc291cmNlSW5zdGFuY2VEYXRhLCB0b1Jlc291cmNlSW5zdGFuY2VEYXRhLCByZXF1aXJlbWVudCwgcmVsYXRpb25zaGlwLCByZWxhdGlvblBhaXIpOworCQlpZiAoaXNWYWxpZFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGlzVmFsaWRSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gdmFsaWRhdGUgcmVxdWlyZW1lbnQge30gYmV0d2VlbiByZXNvdXJjZSBpbnN0YW5jZSB7fSB0byByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVxdWlyZW1lbnQsIGZyb21SZXNJbnN0YW5jZVVpZCwgdG9SZXNJbnN0YW5jZVVpZCwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCVJlbGF0aW9uc2hpcFR5cGVEYXRhIHJlbGF0aW9uc2hpcFR5cGVEYXRhID0gaXNWYWxpZFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRLZXkoKTsKKwkJU3RyaW5nIGNhcGFiaWxpdHlOYW1lID0gaXNWYWxpZFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRWYWx1ZSgpOworCQlSZWxhdGlvbnNoaXBJbnN0RGF0YSByZWxhdGlvbnNoaXBJbnN0RGF0YSA9IGJ1aWxkUmVsYXRpb25zaGlwSW5zdERhdGEoZnJvbVJlc0luc3RhbmNlVWlkLCByZXF1aXJlbWVudCwgcmVsYXRpb25zaGlwVHlwZURhdGEsIHJlbGF0aW9uUGFpcik7CisJCUVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSBjcmVhdGVSZWxhdGlvbnNoaXBJbnN0RGF0YShmcm9tUmVzb3VyY2VJbnN0RGF0YVJlcy5sZWZ0KCkudmFsdWUoKSwgcmVsYXRpb25zaGlwSW5zdERhdGEsIHJlbGF0aW9uc2hpcFR5cGVEYXRhLCByZXF1aXJlbWVudCk7CisKKwkJaWYgKGNyZWF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlSZWxhdGlvbnNoaXBJbnN0RGF0YSBjcmVhdGVkUmVsSW5zdERhdGEgPSBjcmVhdGVOb2RlLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZVJlc0luc3QgPSBhc3NvY2lhdGVSZWxhdGlvbnNoaXBJbnN0VG9UYXJnZXQodG9SZXNvdXJjZUluc3REYXRhUmVzLmxlZnQoKS52YWx1ZSgpLCByZXF1aXJlbWVudCwgY2FwYWJpbGl0eU5hbWUsIGNyZWF0ZWRSZWxJbnN0RGF0YSk7CisKKwkJaWYgKGFzc29jaWF0ZVJlc0luc3QuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhc3NvY2lhdGVSZXNJbnN0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZWxhdGlvbnNoaXAgaW5zdGFuY2Uge30gdG8gdGFyZ2V0IG5vZGUge30uIFN0YXR1cyBpcyB7fSIsIGNyZWF0ZWRSZWxJbnN0RGF0YS5nZXRVbmlxdWVJZCgpLCB0b1Jlc0luc3RhbmNlVWlkLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNyZWF0ZU5vZGUubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgdmVyaWZ5UmVzb3VyY2VJbnN0YW5jZVVuZGVyQ29tcG9uZW50KE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwgU3RyaW5nIGNvbnRhaW5lckNvbXBvbmVudElkLCBTdHJpbmcgcmVzSW5zdGFuY2VVaWQpIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldFBhcmVudE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLCByZXNJbnN0YW5jZVVpZCwgR3JhcGhFZGdlTGFiZWxzLlJFU09VUkNFX0lOU1QsCisJCQkJY29udGFpbmVyTm9kZVR5cGUsIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKHBhcmVudE5vZGUuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBwYXJlbnROb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB0byB0aGUgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc0luc3RhbmNlVWlkLCBzdGF0dXMpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IGNvbXBvbmVudHNSZXMgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQlDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50TWV0YWRhdGFEYXRhID0gY29tcG9uZW50c1Jlcy5nZXRLZXkoKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gKFN0cmluZykgY29tcG9uZW50TWV0YWRhdGFEYXRhLmdldFVuaXF1ZUlkKCk7CisKKwkJaWYgKGNvbnRhaW5lckNvbXBvbmVudElkLmVxdWFscyh1bmlxdWVJZCkpIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfSBlbHNlIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZUluY29ycmVjdFNlcnZpY2VFcnJvciwgIlJlc291cmNlIEluc3RhbmNlIC0gdmVyaWZ5UmVzb3VyY2VJbnN0YW5jZVVuZGVyQ29tcG9uZW50IiwgY29udGFpbmVyQ29tcG9uZW50SWQpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW5jb3JyZWN0Q29tcG9uZW50RXJyb3IoIlJlc291cmNlIEluc3RhbmNlIC0gdmVyaWZ5UmVzb3VyY2VJbnN0YW5jZVVuZGVyQ29tcG9uZW50IiwgY29udGFpbmVyTm9kZVR5cGUuZ2V0TmFtZSgpLCBjb250YWluZXJDb21wb25lbnRJZCk7CisJCQlsb2cuZGVidWcoIlRoZSBwcm92aWRlZCBjb21wb25lbnQgaWQge30gaXMgbm90IGVxdWFsIHRvIHRoZSBjb21wb25lbnQgKHt9KSB3aGljaCBhc3NvY2lhdGVkIHRvIHJlc291cmNlIGluc3RhbmNlIHt9LiIsIGNvbnRhaW5lckNvbXBvbmVudElkLCB1bmlxdWVJZCwgcmVzSW5zdGFuY2VVaWQpOworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCX0KKworCX0KKworCS8qKgorCSAqIGZpbmQgdGhlIHJlc291cmNlIGluc3RhbmNlIG5vZGUgaW4gZ3JhcGguCisJICogCisJICogQHBhcmFtIHJlc0luc3RhbmNlVWlkCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRNYW5kYXRvcnlSZXNvdXJjZUluc3REYXRhKFN0cmluZyByZXNJbnN0YW5jZVVpZCkgeworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzU3RhdHVzID0gZmluZFJlc291cmNlSW5zdGFuY2UocmVzSW5zdGFuY2VVaWQpOworCQlpZiAocmVzU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmVzU3RhdHVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCQlDb21wb25lbnRJbnN0YW5jZURhdGEgcmlEYXRhID0gcmVzU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmlEYXRhKTsKKwl9CisKKwkvKioKKwkgKiBhc3NvY2lhdGUgcmVsYXRpb25zaGlwIGluc3RhbmNlIG5vZGUgdG8gdGhlIHRhcmdldCByZXNvdXJjZSBpbnN0YW5jZSBub2RlLgorCSAqIAorCSAqIEBwYXJhbSB0b1Jlc0luc3RhbmNlCisJICogQHBhcmFtIHJlcXVpcmVtZW50CisJICogQHBhcmFtIHJlbEluc3REYXRhCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVSZWxhdGlvbnNoaXBJbnN0VG9UYXJnZXQoQ29tcG9uZW50SW5zdGFuY2VEYXRhIHRvUmVzSW5zdGFuY2UsIFN0cmluZyByZXF1aXJlbWVudCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lLCBSZWxhdGlvbnNoaXBJbnN0RGF0YSByZWxJbnN0RGF0YSkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjYXBhYmlsaXR5TmFtZSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocmVsSW5zdERhdGEsIHRvUmVzSW5zdGFuY2UsIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX05PREUsIHByb3BzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGluZyByZWxhdGlvbiBiZXR3ZWVuIHJlbGF0aW9uc2hpcCBpbnN0YW5jZSB7fSB0byB0YXJnZXQgbm9kZSB7fSIsIHJlbEluc3REYXRhLmdldFVuaXF1ZUlkKCksIHRvUmVzSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uOworCisJfQorCisJLyoqCisJICogY3JlYXRlIHJlc2xhdGlvbnNoaXAgaW5zdGFuY2Ugbm9kZSBhbmQgYXNzb2NpYXRlIHRoZSByZW9zdXJjZSBpbnN0YW5jZSBub2RlIHRvIGl0LgorCSAqIAorCSAqIEBwYXJhbSByZXNJbnN0YW5jZQorCSAqIEBwYXJhbSByZWxhdGlvbnNoaXBJbnN0RGF0YQorCSAqIEBwYXJhbSByZWxhdGlvbnNoaXBUeXBlRGF0YQorCSAqIEBwYXJhbSByZXF1aXJlbWVudE5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvbnNoaXBJbnN0RGF0YShDb21wb25lbnRJbnN0YW5jZURhdGEgcmVzSW5zdGFuY2UsIFJlbGF0aW9uc2hpcEluc3REYXRhIHJlbGF0aW9uc2hpcEluc3REYXRhLCBSZWxhdGlvbnNoaXBUeXBlRGF0YSByZWxhdGlvbnNoaXBUeXBlRGF0YSwgU3RyaW5nIHJlcXVpcmVtZW50TmFtZSkgeworCisJCUVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShyZWxhdGlvbnNoaXBJbnN0RGF0YSwgUmVsYXRpb25zaGlwSW5zdERhdGEuY2xhc3MpOworCQlpZiAoY3JlYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHJlbGF0aW9uc2hpcCBpbnN0YW5jZSBub2RlIGluIGdyYXBoLiBzdGF0dXMgaXMge30iLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJUmVsYXRpb25zaGlwSW5zdERhdGEgY3JlYXRlZFJlbGF0aW9uc2hpcEluc3QgPSBjcmVhdGVOb2RlLmxlZnQoKS52YWx1ZSgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wZXJ0aWVzLnB1dCgibmFtZSIsIHJlcXVpcmVtZW50TmFtZSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocmVzSW5zdGFuY2UsIGNyZWF0ZWRSZWxhdGlvbnNoaXBJbnN0LCBHcmFwaEVkZ2VMYWJlbHMuUkVMQVRJT05TSElQX0lOU1QsIHByb3BlcnRpZXMpOworCQlpZiAoY3JlYXRlUmVsYXRpb24uaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjcmVhdGVSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2UgaW5zdGFuY2UgIiArIHJlc0luc3RhbmNlLmdldFVuaXF1ZUlkS2V5KCkgKyAiIHRvIHJlbGF0aW9uc2hpcCBpbnN0YW5jZSAiICsgY3JlYXRlZFJlbGF0aW9uc2hpcEluc3QuZ2V0VW5pcXVlSWQoKSArICIuIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVkUmVsYXRpb25zaGlwSW5zdCk7CisJfQorCisJLyoqCisJICogY2hlY2sgd2hldGhlciB3ZSBjYW4gYXNzb2NpYXRlIHJlc291cmNlIGluc3RhbmNlcyBmb3IgYSBnaXZlbiByZXF1aXJlbWVudC4KKwkgKiAKKwkgKiAxLiBjaGVjayB0aGUgc291cmNlIHJlc291cmNlIGluc3RhbmNlIGNvbnRhaW5zIHRoZSByZXF1aXJlbWVudAorCSAqIAorCSAqIDIuIGNoZWNrIHRoZSB0YXJnZXQgcmVzb3VyY2UgaW5zdGFuY2UgY29udGFpbnMgYSBjYXBhYmlsaXR5IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVxdWlyZW1lbnQKKwkgKiAKKwkgKiBAcGFyYW0gZnJvbVJlc0luc3RhbmNlCisJICogQHBhcmFtIHRvUmVzSW5zdGFuY2UKKwkgKiBAcGFyYW0gcmVxdWlyZW1lbnQKKwkgKiBAcGFyYW0gcmVsYXRpb25zaGlwCisJICogQHBhcmFtIHJlbGF0aW9uUGFpcgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxJbW11dGFibGVQYWlyPFJlbGF0aW9uc2hpcFR5cGVEYXRhLCBTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVSZXF1aXJlbWVudFZzQ2FwYWJpbGl0eShDb21wb25lbnRJbnN0YW5jZURhdGEgZnJvbVJlc0luc3RhbmNlLCBDb21wb25lbnRJbnN0YW5jZURhdGEgdG9SZXNJbnN0YW5jZSwgU3RyaW5nIHJlcXVpcmVtZW50LCBTdHJpbmcgcmVsYXRpb25zaGlwLAorCQkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uUGFpcikgeworCisJCVN0cmluZyBmcm9tUmVzb3VyY2VVaWQgPSBmcm9tUmVzSW5zdGFuY2UuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuZ2V0Q29tcG9uZW50VWlkKCk7CisKKwkJU3RyaW5nIHRvUmVzb3VyY2VVaWQgPSB0b1Jlc0luc3RhbmNlLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldENvbXBvbmVudFVpZCgpOworCQlFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlEZWZpbml0aW9uRSA9IGNhcGFiaWxpdHlPcGVyYXRpb24uZ2V0Q2FwYWJpbGl0eShyZWxhdGlvblBhaXIuZ2V0Q2FwYWJpbGl0eVVpZCgpLCB0cnVlKTsKKwkJaWYgKGNhcGFiaWxpdHlEZWZpbml0aW9uRS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiVGhlIGNhcGFiaWxpdHkgY2Fubm90IGJlIGZvdW5kIHt9IiwgcmVsYXRpb25QYWlyLmdldENhcGFiaWxpdHlVaWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQl9CisJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXF1aXJlbWVudERlZmluaXRpb25FID0gcmVxdWlyZW1lbnRPcGVyYXRpb24uZ2V0UmVxdWlyZW1lbnQocmVsYXRpb25QYWlyLmdldFJlcXVpcmVtZW50VWlkKCkpOworCQlpZiAocmVxdWlyZW1lbnREZWZpbml0aW9uRS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiVGhlIHJlcXVpcmVtZW50IGNhbm5vdCBiZSBmb3VuZCB7fSIgLCByZWxhdGlvblBhaXIuZ2V0UmVxdWlyZW1lbnRVaWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQl9CisJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZmluaXRpb24gPSByZXF1aXJlbWVudERlZmluaXRpb25FLmxlZnQoKS52YWx1ZSgpOworCQlTdHJpbmcgZmV0Y2hlZFJlcXVpcmVtZW50UmVsYXRpb25zaGlwID0gcmVxdWlyZW1lbnREZWZpbml0aW9uLmdldFJlbGF0aW9uc2hpcCgpOworCisJCVN0cmluZyBmZXRjaGVkUmVxdWlyZW1lbnRDYXBhYmlsaXR5ID0gcmVxdWlyZW1lbnREZWZpbml0aW9uLmdldENhcGFiaWxpdHkoKTsKKwkJLy8gVE9ETyB0ZW1wb3JhcnkgcmVtb3ZlIG9mIGNhcGFiaWxpdHkgc291cmNlcyB2YWxpZGF0aW9uIC0gdW5jb21tZW50CisJCS8vIGFmdGVyICBhbGlnbm1lbnQKKwkJLy8gU3RyaW5nIGZldGNoZWRSZXF1aXJlbWVudE5vZGVOYW1lID0gcmVxdWlyZW1lbnREZWZpbml0aW9uLmdldE5vZGUoKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUF2YWlsYWJsZVJlcXVpcmVtZW50KGZyb21SZXNJbnN0YW5jZSwgcmVsYXRpb25QYWlyKTsKKwkJaWYgKCFzdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmVycm9yKCJUaGUgcmVxdWlyZW1lbnQgaXNuJ3QgYXZhaWxhYmxlLCBzdGF0dXMge30iLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCXN0YXR1cyA9IHZhbGlkYXRlQXZhaWxhYmxlQ2FwYWJpbHR5KHRvUmVzSW5zdGFuY2UsIHJlbGF0aW9uUGFpcik7CisJCWlmICghc3RhdHVzLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5lcnJvcigiVGhlIGNhcGFiaWx0eSBpc24ndCBhdmFpbGFibGUsIHN0YXR1cyB7fSIsIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG9yaWdpbkNhcGFiaWx0eSA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgcmVsYXRpb25QYWlyLmdldENhcGFiaWxpdHlPd25lcklkKCksIENvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisJCWlmIChvcmlnaW5DYXBhYmlsdHkuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCB0aGUgb3JpZ2luIHJlc291cmNlIGZvciBjYXBhYmlsdHkgcmVzb3VyY2UgaW5zdGFuY2Ugd2l0aCBpZCB7fSwgZXJyb3Ige30iLCByZWxhdGlvblBhaXIuZ2V0Q2FwYWJpbGl0eU93bmVySWQoKSwgb3JpZ2luQ2FwYWJpbHR5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9yaWdpbkNhcGFiaWx0eS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCS8vIFRPRE8gdGVtcG9yYXJ5IHJlbW92ZSBvZiBjYXBhYmlsaXR5IHNvdXJjZXMgdmFsaWRhdGlvbiAtIHVuY29tbWVudAorCQkvLyBhZnRlciAgYWxpZ25tZW50CisJCS8vIFN0cmluZyBvcmlnaW5DYXBhYklkID0KKwkJLy8gb3JpZ2luQ2FwYWJpbHR5LmxlZnQoKS52YWx1ZSgpLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldENvbXBvbmVudFVpZCgpOworCisJCS8vIExpc3Q8U3RyaW5nPiBjYXBhYmlsaXR5U291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkvLyBUaXRhbk9wZXJhdGlvblN0YXR1cyBjYXBhYmlsdHlTb3VyY2VzUmVzdWx0ID0KKwkJLy8gcmVzb3VyY2VPcGVyYXRpb24uZmlsbFJlc291cmNlRGVyaXZlZExpc3RGcm9tR3JhcGgob3JpZ2luQ2FwYWJJZCwKKwkJLy8gY2FwYWJpbGl0eVNvdXJjZXMpOworCQkvLyBpZiAoIVRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LLmVxdWFscyhjYXBhYmlsdHlTb3VyY2VzUmVzdWx0KSkgeworCQkvLyBsb2cuZXJyb3IoIkZhaWxlZCB0byBmaWxsIGNhcGFiaWx0eSBjb3VyY2VzIGZvciByZXNvdXJjZSB3aXRoIGlkICIgKworCQkvLyBvcmlnaW5DYXBhYklkICsgIiAsIGVycm9yICIgKyBjYXBhYmlsdHlTb3VyY2VzUmVzdWx0KTsKKwkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChvcmlnaW5DYXBhYmlsdHkucmlnaHQoKS52YWx1ZSgpKTsKKwkJLy8gfQorCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiA9IGNhcGFiaWxpdHlEZWZpbml0aW9uRS5sZWZ0KCkudmFsdWUoKTsKKwkJU3RyaW5nIGNhcGFiaWxpdHlOYW1lID0gcmVxdWlyZW1lbnQ7CisKKwkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQlsb2cuZGVidWcoIlRoZSBjYXBhYmlsaXR5IHt9IG9mIHJlc291cmNlIHt9IGFwcHJvcHJpYXRlcyB0byByZXF1aXJlbXQge30gb24gcmVzb3VyY2Uge30iLCBjYXBhYmlsaXR5RGVmaW5pdGlvbiwgdG9SZXNvdXJjZVVpZCwgcmVxdWlyZW1lbnQsIGZyb21SZXNvdXJjZVVpZCk7CisJCX0KKwkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlID0gY2FwYWJpbGl0eURlZmluaXRpb24uZ2V0VHlwZSgpOworCisJCWlmIChmYWxzZSA9PSBmZXRjaGVkUmVxdWlyZW1lbnRDYXBhYmlsaXR5LmVxdWFscyhjYXBhYmlsaXR5VHlwZSkpIHsKKwkJCWxvZy5lcnJvcigiVGhlIGNhcGFiaWxpdHkgdHlwZSBpbiB0aGUgcmVxdWlyZW1lbnQgKHt9KSBkb2VzIG5vdCBlcXVhbCB0byB0aGUgY2FwYWJpbGl0eSBvbiB0aGUgcmVzb3VyY2Uge30oe30pIiwgZmV0Y2hlZFJlcXVpcmVtZW50Q2FwYWJpbGl0eSwgdG9SZXNvdXJjZVVpZCwgY2FwYWJpbGl0eVR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5NQVRDSF9OT1RfRk9VTkQpOworCQl9CisKKwkJLy8gaWYgKGZldGNoZWRSZXF1aXJlbWVudE5vZGVOYW1lICE9IG51bGwgJiYKKwkJLy8gIWNhcGFiaWxpdHlTb3VyY2VzLmNvbnRhaW5zKGZldGNoZWRSZXF1aXJlbWVudE5vZGVOYW1lKSkgeworCQkvLyBsb2cuZXJyb3IoIlRoZSB0YXJnZXQgcmVzb3VyY2UgaW5zdGFuY2UgIiArIHRvUmVzb3VyY2VVaWQgKyAiIGlzIG5vdAorCQkvLyBvZiB0eXBlICIgKyBmZXRjaGVkUmVxdWlyZW1lbnROb2RlTmFtZSk7CisJCS8vIHJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTUFUQ0hfTk9UX0ZPVU5EKTsKKwkJLy8gfQorCisJCVJlbGF0aW9uc2hpcFR5cGVEYXRhIHJlbGF0aW9uc2hpcFR5cGVEYXRhID0gbmV3IFJlbGF0aW9uc2hpcFR5cGVEYXRhKCk7CisJCXJlbGF0aW9uc2hpcFR5cGVEYXRhLmdldFJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbigpLnNldFR5cGUoZmV0Y2hlZFJlcXVpcmVtZW50UmVsYXRpb25zaGlwKTsKKworCQlJbW11dGFibGVQYWlyPFJlbGF0aW9uc2hpcFR5cGVEYXRhLCBTdHJpbmc+IHJlc3VsdCA9IG5ldyBJbW11dGFibGVQYWlyPFJlbGF0aW9uc2hpcFR5cGVEYXRhLCBTdHJpbmc+KHJlbGF0aW9uc2hpcFR5cGVEYXRhLCBjYXBhYmlsaXR5TmFtZSk7CisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBdmFpbGFibGVSZXF1aXJlbWVudChDb21wb25lbnRJbnN0YW5jZURhdGEgZnJvbVJlc0luc3RhbmNlLCBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25QYWlyKSB7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZyb21SaSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgZnJvbVJlc0luc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQlpZiAoZnJvbVJpLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggY29tcG9uZW50IGluc3RhbmNlIHt9LiBFcnJvcjoge30iLCBmcm9tUmVzSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgZnJvbVJpLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gZnJvbVJpLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlJdGVyYXRvcjxFZGdlPiBlZGdlSXRlciA9IGZyb21SaS5sZWZ0KCkudmFsdWUoKS5lZGdlcyhEaXJlY3Rpb24uT1VULCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVC5uYW1lKCkpOworCQlpZiAoZWRnZUl0ZXIgPT0gbnVsbCB8fCAhZWRnZUl0ZXIuaGFzTmV4dCgpKSB7CisJCQlsb2cuZGVidWcoIk5vIGF2YWlsYWJsZSBDQUxDVUxBVEVEX1JFUVVJUkVNRU5UIGVkZ2VzLiBBbGwgZnVsbCBmaWxsZWQgZm9yIFJJIHt9IiwgZnJvbVJlc0luc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk1BVENIX05PVF9GT1VORDsKKwkJfQorCQlib29sZWFuIGV4aXN0ID0gZmFsc2U7CisJCXdoaWxlIChlZGdlSXRlci5oYXNOZXh0KCkpIHsKKwkJCUVkZ2UgZWRnZSA9IGVkZ2VJdGVyLm5leHQoKTsKKwkJCVRpdGFuVmVydGV4IHJlcVZlcnRleCA9IChUaXRhblZlcnRleCkgZWRnZS5pblZlcnRleCgpOworCQkJU3RyaW5nIHJlcUlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KHJlcVZlcnRleCwgVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlcXVpcmVtZW50KSk7CisJCQlpZiAocmVxSWQuZXF1YWxzKHJlbGF0aW9uUGFpci5nZXRSZXF1aXJlbWVudFVpZCgpKSkgeworCQkJCVN0cmluZyBvd25lcklkT25FZGdlID0gKFN0cmluZykgZWRnZS52YWx1ZShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5PV05FUl9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlpZiAob3duZXJJZE9uRWRnZS5lcXVhbHMocmVsYXRpb25QYWlyLmdldFJlcXVpcmVtZW50T3duZXJJZCgpKSkgeworCQkJCQlTdHJpbmcgbGVmdE9jY3VycmVuY2VzID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGVkZ2UsIEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LkxFRlRfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisJCQkJCWlmIChsZWZ0T2NjdXJyZW5jZXMgIT0gbnVsbCAmJiAhbGVmdE9jY3VycmVuY2VzLmVxdWFscyhSZXF1aXJlbWVudERhdGEuTUFYX09DQ1VSUkVOQ0VTKSkgeworCQkJCQkJSW50ZWdlciBsZWZ0SW50VmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KGxlZnRPY2N1cnJlbmNlcyk7CisJCQkJCQlpZiAobGVmdEludFZhbHVlID4gMCkgeworCQkJCQkJCWV4aXN0ID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWV4aXN0ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGV4aXN0ID8gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0sgOiBUaXRhbk9wZXJhdGlvblN0YXR1cy5NQVRDSF9OT1RfRk9VTkQ7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZUF2YWlsYWJsZUNhcGFiaWx0eShDb21wb25lbnRJbnN0YW5jZURhdGEgdG9SZXNJbnN0YW5jZSwgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uUGFpcikgeworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmcm9tUmkgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0VmVydGV4QnlQcm9wZXJ0eShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHRvUmVzSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWlmIChmcm9tUmkuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCBjb21wb25lbnQgaW5zdGFuY2Uge30uIGVycm9yIHt9IiwgdG9SZXNJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBmcm9tUmkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBmcm9tUmkucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCUl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gZnJvbVJpLmxlZnQoKS52YWx1ZSgpLmVkZ2VzKERpcmVjdGlvbi5PVVQsIEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX0NBUEFCSUxJVFkubmFtZSgpKTsKKwkJaWYgKGVkZ2VJdGVyID09IG51bGwgfHwgIWVkZ2VJdGVyLmhhc05leHQoKSkgeworCQkJbG9nLmRlYnVnKCJObyBhdmFpbGFibGUgQ0FMQ1VMQVRFRF9DQVBBQklMSVRZIGVkZ2VzLiBBbGwgZnVsbCBmaWxsZWQgZm9yIFJJIHt9IiwgdG9SZXNJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5NQVRDSF9OT1RfRk9VTkQ7CisJCX0KKwkJYm9vbGVhbiBleGlzdCA9IGZhbHNlOworCQl3aGlsZSAoZWRnZUl0ZXIuaGFzTmV4dCgpKSB7CisJCQlFZGdlIGVkZ2UgPSBlZGdlSXRlci5uZXh0KCk7CisJCQlUaXRhblZlcnRleCByZXFWZXJ0ZXggPSAoVGl0YW5WZXJ0ZXgpIGVkZ2UuaW5WZXJ0ZXgoKTsKKwkJCVN0cmluZyBjYXBJZCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShyZXFWZXJ0ZXgsIFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5KSk7CisJCQlpZiAoY2FwSWQuZXF1YWxzKHJlbGF0aW9uUGFpci5nZXRDYXBhYmlsaXR5VWlkKCkpKSB7CisJCQkJU3RyaW5nIG93bmVySWRPbkVkZ2UgPSAoU3RyaW5nKSBlZGdlLnZhbHVlKEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk9XTkVSX0lELmdldFByb3BlcnR5KCkpOworCQkJCWlmIChvd25lcklkT25FZGdlLmVxdWFscyhyZWxhdGlvblBhaXIuZ2V0Q2FwYWJpbGl0eU93bmVySWQoKSkpIHsKKwkJCQkJU3RyaW5nIGxlZnRPY2N1cnJlbmNlcyA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShlZGdlLCBHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpOworCQkJCQlpZiAobGVmdE9jY3VycmVuY2VzICE9IG51bGwgJiYgIWxlZnRPY2N1cnJlbmNlcy5lcXVhbHMoQ2FwYWJpbGl0eURhdGEuTUFYX09DQ1VSUkVOQ0VTKSkgeworCQkJCQkJSW50ZWdlciBsZWZ0SW50VmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KGxlZnRPY2N1cnJlbmNlcyk7CisJCQkJCQlpZiAobGVmdEludFZhbHVlID4gMCkgeworCQkJCQkJCWV4aXN0ID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWV4aXN0ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGV4aXN0ID8gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0sgOiBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQ7CisJfQorCisJcHJpdmF0ZSBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGZpbmRDYXBhYmlsaXR5T2ZUeXBlKE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMsIFN0cmluZyBmZXRjaGVkUmVxdWlyZW1lbnRDYXBhYmlsaXR5KSB7CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4+KCk7CisKKwkJaWYgKGNhcGFiaWxpdGllcyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWZvciAoRW50cnk8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gZW50cnkgOiBjYXBhYmlsaXRpZXMuZW50cnlTZXQoKSkgeworCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJU3RyaW5nIHR5cGUgPSBjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXRUeXBlKCk7CisJCQlpZiAoZmV0Y2hlZFJlcXVpcmVtZW50Q2FwYWJpbGl0eS5lcXVhbHModHlwZSkpIHsKKwkJCQlJbW11dGFibGVQYWlyPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+IHBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPihlbnRyeS5nZXRLZXkoKSwgY2FwYWJpbGl0eURlZmluaXRpb24pOworCQkJCXJlc3VsdC5hZGQocGFpcik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByb3RlY3RlZCBUaXRhbk9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZVRoZVRhcmdldFJlc291cmNlSW5zdGFuY2UoU3RyaW5nIGZldGNoZWRSZXF1aXJlbWVudE5vZGVOYW1lLCBTdHJpbmcgcmVzb3VyY2VVaWQpIHsKKworCQlpZiAoZmV0Y2hlZFJlcXVpcmVtZW50Tm9kZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisKKwkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gcmVzb3VyY2VzUGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPigpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXNvdXJjZU9wZXJhdGlvbi5maW5kUmVzb3VyY2VzUGF0aFJlY3Vyc2l2ZWx5KHJlc291cmNlVWlkLCByZXNvdXJjZXNQYXRoTGlzdCk7CisJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgdGhlIHBhcmVudCBsaXN0IG9mIHJlc291cmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZVVpZCwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCWlmIChyZXNvdXJjZXNQYXRoTGlzdCAhPSBudWxsKSB7CisJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA6IHJlc291cmNlc1BhdGhMaXN0KSB7CisJCQkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOworCQkJCWlmIChmZXRjaGVkUmVxdWlyZW1lbnROb2RlTmFtZS5lcXVhbHMocmVzb3VyY2VOYW1lKSkgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWxvZy5kZWJ1ZygiVGhlIHJlc291cmNlIHt9IGlzIG9mIHR5cGUge30iLCByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSwgZmV0Y2hlZFJlcXVpcmVtZW50Tm9kZU5hbWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAodHJ1ZSA9PSBmb3VuZCkgeworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9IGVsc2UgeworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk1BVENIX05PVF9GT1VORDsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBSZWxhdGlvbnNoaXBJbnN0RGF0YSBidWlsZFJlbGF0aW9uc2hpcEluc3REYXRhKFN0cmluZyBmcm9tUmVzSW5zdGFuY2VVaWQsIFN0cmluZyByZXF1aXJlbWVudCwgUmVsYXRpb25zaGlwVHlwZURhdGEgcmVsYXRpb25zaGlwVHlwZURhdGEsIFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvblBhaXIpIHsKKworCQlSZWxhdGlvbnNoaXBJbnN0RGF0YSByZWxhdGlvbnNoaXBJbnN0RGF0YSA9IG5ldyBSZWxhdGlvbnNoaXBJbnN0RGF0YSgpOworCQlyZWxhdGlvbnNoaXBJbnN0RGF0YS5zZXRVbmlxdWVJZChVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZWxhdGlvbnNpcEluc3RJbnN0YW5jZVVpZChmcm9tUmVzSW5zdGFuY2VVaWQsIHJlcXVpcmVtZW50KSk7CisJCVN0cmluZyB0eXBlID0gbnVsbDsKKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGVEYXRhICE9IG51bGwpIHsKKwkJCXR5cGUgPSByZWxhdGlvbnNoaXBUeXBlRGF0YS5nZXRSZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24oKS5nZXRUeXBlKCk7CisJCX0KKworCQlyZWxhdGlvbnNoaXBJbnN0RGF0YS5zZXRUeXBlKHR5cGUpOworCQlMb25nIGNyZWF0aW9uRGF0ZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlyZWxhdGlvbnNoaXBJbnN0RGF0YS5zZXRDcmVhdGlvblRpbWUoY3JlYXRpb25EYXRlKTsKKwkJcmVsYXRpb25zaGlwSW5zdERhdGEuc2V0TW9kaWZpY2F0aW9uVGltZShjcmVhdGlvbkRhdGUpOworCQlyZWxhdGlvbnNoaXBJbnN0RGF0YS5zZXRDYXBhYmlsaXR5T3duZXJJZChyZWxhdGlvblBhaXIuZ2V0Q2FwYWJpbGl0eU93bmVySWQoKSk7CisJCXJlbGF0aW9uc2hpcEluc3REYXRhLnNldFJlcXVpcmVtZW50T3duZXJJZChyZWxhdGlvblBhaXIuZ2V0UmVxdWlyZW1lbnRPd25lcklkKCkpOworCQlyZWxhdGlvbnNoaXBJbnN0RGF0YS5zZXRDYXBhYmlsdHlJZChyZWxhdGlvblBhaXIuZ2V0Q2FwYWJpbGl0eVVpZCgpKTsKKwkJcmVsYXRpb25zaGlwSW5zdERhdGEuc2V0UmVxdWlyZW1lbnRJZChyZWxhdGlvblBhaXIuZ2V0UmVxdWlyZW1lbnRVaWQoKSk7CisKKwkJcmV0dXJuIHJlbGF0aW9uc2hpcEluc3REYXRhOworCX0KKworCXByaXZhdGUgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRSZXNvdXJjZUluc3RhbmNlKFN0cmluZyByZXNJbnN0YW5jZVVpZCkgeworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLCByZXNJbnN0YW5jZVVpZCwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKworCQlyZXR1cm4gbm9kZTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlc291cmNlSW5zdGFuY2UoU3RyaW5nIHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCwgQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXMgPSB1cGRhdGVSZXNvdXJjZUluc3RhbmNlSW5TZXJ2aWNlKHNlcnZpY2VJZCwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgcmVzb3VyY2VJbnN0YW5jZSk7CisKKwkJCWlmICh1cGRhdGVSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBkYXRlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VVaWQsIHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJQ29tcG9uZW50SW5zdGFuY2UgdmFsdWUgPSB1cGRhdGVSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHZhbHVlKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQljb21taXRPclJvbGxiYWNrKHJlc3VsdCk7CisJCQl9CisJCX0KKworCX0KKworCS8qKgorCSAqIHByZXBhcmUgbmV3IHJlc291cmNlIGluc3RhbmNlIG9iamVjdCBmb3IgdXBkYXRlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2UKKwkgKiBAcGFyYW0gY3VycmVudEluc3QKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZSBub3JtYWxpemVSZXNvdXJjZUluc3RhbmNlRm9yVXBkYXRlKENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlRGF0YSBjdXJyZW50SW5zdCkgeworCisJCUNvbXBvbmVudEluc3RhbmNlIGluc3RhbmNlID0gbmV3IENvbXBvbmVudEluc3RhbmNlKCk7CisJCWluc3RhbmNlLnNldFVuaXF1ZUlkKChTdHJpbmcpIGN1cnJlbnRJbnN0LmdldFVuaXF1ZUlkKCkpOworCQlMb25nIG1vZGlmaWNhdGlvblRpbWUgPSByZXNvdXJjZUluc3RhbmNlLmdldE1vZGlmaWNhdGlvblRpbWUoKTsKKwkJaWYgKG1vZGlmaWNhdGlvblRpbWUgPT0gbnVsbCkgeworCQkJbW9kaWZpY2F0aW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CisJCWluc3RhbmNlLnNldE1vZGlmaWNhdGlvblRpbWUobW9kaWZpY2F0aW9uVGltZSk7CisJCWluc3RhbmNlLnNldFBvc1gocmVzb3VyY2VJbnN0YW5jZS5nZXRQb3NYKCkpOworCQlpbnN0YW5jZS5zZXRQb3NZKHJlc291cmNlSW5zdGFuY2UuZ2V0UG9zWSgpKTsKKwkJaW5zdGFuY2Uuc2V0RGVzY3JpcHRpb24ocmVzb3VyY2VJbnN0YW5jZS5nZXREZXNjcmlwdGlvbigpKTsKKwkJaW5zdGFuY2Uuc2V0TmFtZShyZXNvdXJjZUluc3RhbmNlLmdldE5hbWUoKSk7CisJCWluc3RhbmNlLnNldE5vcm1hbGl6ZWROYW1lKHJlc291cmNlSW5zdGFuY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCWluc3RhbmNlLnNldFByb3BlcnR5VmFsdWVDb3VudGVyKHJlc291cmNlSW5zdGFuY2UuZ2V0UHJvcGVydHlWYWx1ZUNvdW50ZXIoKSk7CisJCWluc3RhbmNlLnNldEF0dHJpYnV0ZVZhbHVlQ291bnRlcihyZXNvdXJjZUluc3RhbmNlLmdldEF0dHJpYnV0ZVZhbHVlQ291bnRlcigpKTsKKwkJaW5zdGFuY2Uuc2V0SW5wdXRWYWx1ZUNvdW50ZXIocmVzb3VyY2VJbnN0YW5jZS5nZXRJbnB1dFZhbHVlQ291bnRlcigpKTsKKwkJcmV0dXJuIGluc3RhbmNlOworCX0KKworCXByaXZhdGUgdm9pZCBwcmludERpZmYoQ29tcG9uZW50SW5zdGFuY2VEYXRhIGN1cnJlbnRJbnN0LCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlKSB7CisKKwkJbG9nLmRlYnVnKCJUaGUgY3VycmVudCBSZXNvdXJjZSBJbnN0YW5jZSBkZXRhaWxzIGFyZSA6IHt9IiwgY3VycmVudEluc3QpOworCQlsb2cuZGVidWcoIlRoZSByZWNlaXZlZCBSZXNvdXJjZSBJbnN0YW5jZSBkZXRhaWxzIGZvciB1cGRhdGUgYXJlIDoge30iLCByZXNvdXJjZUluc3RhbmNlKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlc291cmNlSW5zdGFuY2UoU3RyaW5nIHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKworCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2VJbnN0YW5jZShzZXJ2aWNlSWQsIG5vZGVUeXBlLCByZXNvdXJjZUluc3RhbmNlTmFtZSwgcmVzb3VyY2VJbnN0YW5jZSwgZmFsc2UpOworCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXNvdXJjZUluc3RhbmNlSW5TZXJ2aWNlKFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlVWlkLCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlKSB7CisKKwkJbG9nLmRlYnVnKCJHb2luZyB0byB1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFByb3BlcnRpZXMgYXJlIHt9IiwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgcmVzb3VyY2VJbnN0YW5jZSk7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kSW5zdFJlcyA9IGZpbmRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VVaWQpOworCQlpZiAoZmluZEluc3RSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kSW5zdFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlVWlkLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJQ29tcG9uZW50SW5zdGFuY2VEYXRhIGN1cnJlbnRJbnN0ID0gZmluZEluc3RSZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJcHJpbnREaWZmKGN1cnJlbnRJbnN0LCByZXNvdXJjZUluc3RhbmNlKTsKKwkJfQorCisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2VGb3JVcGRhdGUgPSBub3JtYWxpemVSZXNvdXJjZUluc3RhbmNlRm9yVXBkYXRlKHJlc291cmNlSW5zdGFuY2UsIGN1cnJlbnRJbnN0KTsKKworCQlDb21wb25lbnRJbnN0YW5jZURhdGEgcmVzb3VyY2VJbnN0YW5jZURhdGEgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VEYXRhKHJlc291cmNlSW5zdGFuY2VGb3JVcGRhdGUpOworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlUmVzID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocmVzb3VyY2VJbnN0YW5jZURhdGEsIENvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisJCWlmICh1cGRhdGVOb2RlUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBkYXRlTm9kZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VVaWQsIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlDb21wb25lbnRJbnN0YW5jZURhdGEgdmFsdWUgPSB1cGRhdGVOb2RlUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCUNvbXBvbmVudEluc3RhbmNlIGluc3RhbmNlID0gbmV3IENvbXBvbmVudEluc3RhbmNlKHZhbHVlLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpKTsKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW5zdGFuY2UpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDb21wb25lbnRJbnN0YW5jZXMoU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc0luc3RhbmNlc09mU2VydmljZSA9IGdldENvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb250YWluZXJOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisKKwkJCWxvZy50cmFjZSgiQWZ0ZXIgZmV0Y2hpbmcgcmVzb3VyY2UgaW5zdGFuY2VzIG9mIGNvbXBvbmVudCB7fS4gcmVzdWx0IGlzIHt9IiwgY29tcG9uZW50SWQsIHJlc0luc3RhbmNlc09mU2VydmljZSk7CisJCQlpZiAocmVzSW5zdGFuY2VzT2ZTZXJ2aWNlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHJlc0luc3RhbmNlc09mU2VydmljZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCByZXNvdXJjZSBpbnN0YW5jZXMgb2Ygc2VydmljZSB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SWQsIHN0YXR1cyk7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4gaW1tdXRhYmxlUGFpciA9IHJlc0luc3RhbmNlc09mU2VydmljZS5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IG5vZGVzID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmlzRW1wdHkoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChpbW11dGFibGVQYWlyKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWNvbW1pdE9yUm9sbGJhY2socmVzdWx0KTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaXNDb21wb25lbnRJbnN0YW5jZU5hbWVFeGlzdChTdHJpbmcgcGFyZW50Q29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBJbnN0SWQsIFN0cmluZyBjb21wb25lbnRJbnN0TmFtZSkgeworCisJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQlFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlcyA9IGlzQ29tcG9uZW50SW5zdGFuY2VOYW1lRXhpc3RPbkdyYXBoKHBhcmVudENvbXBvbmVudElkLCBub2RlVHlwZSwgY29tcEluc3RJZCwgY29tcG9uZW50SW5zdE5hbWUpOworCisJCWlmICh1cGRhdGVSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSB1cGRhdGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBjb21wb25lbnQgaW5zdGFuY2UgbmFtZSB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdE5hbWUsIHN0YXR1cyk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlCb29sZWFuIHZhbHVlID0gdXBkYXRlUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHZhbHVlKTsKKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGlzQ29tcG9uZW50SW5zdGFuY2VOYW1lRXhpc3RPbkdyYXBoKFN0cmluZyBwYXJlbnRDb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIHBhcmVudE5vZGVUeXBlLCBTdHJpbmcgY29tcEluc3RJZCwgU3RyaW5nIGNvbXBvbmVudEluc3ROYW1lKSB7CisKKwkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaFJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpOworCQlpZiAoZ3JhcGhSZXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBncmFwaC4gc3RhdHVzIGlzIHt9IiwgZ3JhcGhSZXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaFJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXMubGVmdCgpLnZhbHVlKCk7CisJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IHRpdGFuR3JhcGgucXVlcnkoKS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUocGFyZW50Tm9kZVR5cGUpLCBwYXJlbnRDb21wb25lbnRJZCkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRpY2VzID09IG51bGwgfHwgZmFsc2UgPT0gdmVydGljZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCk7CisJCX0KKworCQlUaXRhblZlcnRleCBzZXJ2aWNlVmVydGV4ID0gdmVydGljZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisJCVRpdGFuVmVydGV4UXVlcnkgcXVlcnkgPSBzZXJ2aWNlVmVydGV4LnF1ZXJ5KCk7CisJCXF1ZXJ5ID0gcXVlcnkubGFiZWxzKEdyYXBoRWRnZUxhYmVscy5SRVNPVVJDRV9JTlNULmdldFByb3BlcnR5KCkpOworCQlJdGVyYWJsZTxWZXJ0ZXg+IHZlcnRzID0gcXVlcnkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRzID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiTm8gZWRnZXMgaW4gZ3JhcGggZm9yIGNyaXRlcmlhIik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKwkJSXRlcmF0b3I8VmVydGV4PiB2SXRlciA9IHZlcnRzLml0ZXJhdG9yKCk7CisJCXdoaWxlICh2SXRlci5oYXNOZXh0KCkpIHsKKwkJCVZlcnRleCB2ZXJ0ID0gdkl0ZXIubmV4dCgpOworCQkJU3RyaW5nIHJlc0luc3ROYW1lID0gdmVydC52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCWlmIChyZXNJbnN0TmFtZS5lcXVhbHMoY29tcG9uZW50SW5zdE5hbWUpKSB7CisJCQkJaWYgKGNvbXBJbnN0SWQgIT0gbnVsbCkgey8vIHdpbGwgYmUgbnVsbCBpZiB3ZSBnb3QgaGVyZSBmcm9tCisJCQkJCQkJCQkJCS8vIGNyZWF0ZQorCQkJCQkvLyBVcGRhdGUgY2FzZSAtIHNraXBwaW5nIGlmIHRoaXMgaXMgdGhlIHNhbWUgY29tcG9uZW50CisJCQkJCS8vIGluc3RhbmNlIHdlIGFyZSB1cGRhdGluZywgdGhhdCBpcyBhbGxvd2luZworCQkJCQkvLyB1cGRhdGUgb2YgdGhlIHVuY2hhbmdlZCBuYW1lIG9uIGEgY29tcG9uZW50IGluc3RhbmNlLgorCQkJCQkvLyBUaGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IHBvc2l0aW9uIG9ubHkgdXBkYXRlLCBzaW5jZQorCQkJCQkvLyBuYW1lIHNob3VsZAorCQkJCQkvLyBhbHdheXMgYmUgcGFzc2VkIGluIHVwZGF0ZSwgYW5kIGluIHBvc2l0aW9uIGNhc2UsIHRoZQorCQkJCQkvLyBuYW1lIHdpbGwgYmUgdW5jaGFuZ2VkLgorCQkJCQlTdHJpbmcgdW5pcXVlSWQgPSB2ZXJ0LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQkJCQlpZiAodW5pcXVlSWQuZXF1YWxzKGNvbXBJbnN0SWQpKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoQm9vbGVhbi5UUlVFKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoQm9vbGVhbi5GQUxTRSk7CisJfQorCisJLyoqCisJICogZmluZCByZXNvdXJjZSBpbnN0YW5jZXMgYW5kIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIHJlbGF0aW9uc2hpcHMgb2YgYSBnaXZlbiByZXNvdXJjZQorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwgTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUpIHsKKworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGZldGNoIGFsbCByZXNvdXJjZSBpbnN0YW5jZXMgdW5kZXIgY29tcG9uZW50IHt9IiwgY29tcG9uZW50SWQpOworCisJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShjb250YWluZXJOb2RlVHlwZSksIGNvbXBvbmVudElkLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAoY29tcG9uZW50UmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY29tcG9uZW50UmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgY29tcG9uZW50IHt9LiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJZCwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc291cmNlSW5zdGFuY2VzUmVzID0gZ2V0QWxsQ29tcG9uZW50SW5zdGFuY2VGcm9tR3JhcGgoY29tcG9uZW50SWQsIGNvbnRhaW5lck5vZGVUeXBlLCB0cnVlKTsKKwkJaWYgKHJlc291cmNlSW5zdGFuY2VzUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmVzb3VyY2VJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJSZXNvdXJjZSBpbnN0YW5jZSB3YXMgZm91bmQgdW5kZXIgY29tcG9uZW50IHt9LiBzdGF0dXMgaXMge30iLCBjb21wb25lbnRJZCwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlc1Jlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+KCk7CisJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiByZXF1aXJlbWVudHNSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4oKTsKKworCQlMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+PiByZXNvdXJjZUluc3RhbmNlcyA9IHJlc291cmNlSW5zdGFuY2VzUmVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAocmVzb3VyY2VJbnN0YW5jZXMgIT0gbnVsbCAmJiBmYWxzZSA9PSByZXNvdXJjZUluc3RhbmNlcy5pc0VtcHR5KCkpIHsKKwkJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY29tcEluc3RDYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPj4oKTsKKwkJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IGNvbXBJbnN0UmVxID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+PigpOworCQkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPj4gY29tcEluc3RBcnRpZmFjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4+KCk7CisJCQlNYXA8U3RyaW5nLCBDb21wb25lbnQ+IGNvbXBJbnN0T3JpZ2luc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29tcG9uZW50PigpOworCisJCQlmb3IgKEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgOiByZXNvdXJjZUluc3RhbmNlcykgeworCisJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhIHJlc291cmNlSW5zdGFuY2VEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZmV0Y2ggdGhlIHJlbGF0aW9uc2hpcHMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCByZXNvdXJjZUluc3RhbmNlRGF0YSk7CisKKwkJCQlDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlID0gbmV3IENvbXBvbmVudEluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpKTsKKworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdldEZ1bGxDb21wb25lbnRJbnN0YW5jZShjb21wSW5zdENhcGFiaWxpdGllcywgY29tcEluc3RSZXEsIGNvbXBJbnN0QXJ0aWZhY3RzLCBjb21wSW5zdE9yaWdpbnNNYXAsIHJlc291cmNlSW5zdGFuY2UsIGNvbXBJbnN0Tm9kZVR5cGUpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCQlyZXNvdXJjZXNSZXN1bHQuYWRkKHJlc291cmNlSW5zdGFuY2UpOworCisJCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZWxhdGlvbnNoaXBzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLAorCQkJCQkJKFN0cmluZykgcmVzb3VyY2VJbnN0YW5jZURhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLlJFTEFUSU9OU0hJUF9JTlNULCBOb2RlVHlwZUVudW0uUmVsYXRpb25zaGlwSW5zdCwgUmVsYXRpb25zaGlwSW5zdERhdGEuY2xhc3MpOworCisJCQkJaWYgKHJlbGF0aW9uc2hpcHNSZXMuaXNSaWdodCgpKSB7CisJCQkJCXN0YXR1cyA9IHJlbGF0aW9uc2hpcHNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkFmdGVyIGZldGNoaW5nIGFsbCByZXNsYXRpb25zaGlwcyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fSB1bmRlciBjb21wb25lbnQge30gLiBzdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJZCwgc3RhdHVzKTsKKwkJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCByZWxhdGlvbmhpcHMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30gdW5kZXIgY29tcG9uZW50IHt9LiBzdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRJZCwgc3RhdHVzKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCVN0cmluZyBzb3VyY2VSZXNvdXJjZVVpZCA9IChTdHJpbmcpIHJlc291cmNlSW5zdGFuY2VEYXRhLmdldFVuaXF1ZUlkKCk7CisKKwkJCQlNYXA8U3RyaW5nLCBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBSZWxhdGlvbnNoaXBJbnN0RGF0YT4+PiB0YXJnZXROb2RlVG9SZWxhdGlvbnNoaXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFJlbGF0aW9uc2hpcEluc3REYXRhPj4+KCk7CisKKwkJCQlMaXN0PEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIEdyYXBoRWRnZT4+IHJlbGF0aW9uc2hpcHNJbXBsID0gcmVsYXRpb25zaGlwc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlzdGF0dXMgPSBwb3B1bGF0ZVRhcmdldEFuZFJlbGF0aW9uc0ZvckdpdmVuU291cmNlKHRhcmdldE5vZGVUb1JlbGF0aW9uc2hpcCwgcmVsYXRpb25zaGlwc0ltcGwpOworCisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJfQorCisJCQkJaWYgKHRhcmdldE5vZGVUb1JlbGF0aW9uc2hpcC5pc0VtcHR5KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJObyB0YXJnZXQgZm91bmQgZm9yIHJlbGF0aW9uc2hpcCBpbnN0YW5jZXMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCByZXNvdXJjZUluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQpOworCQkJCX0KKworCQkJCWJ1aWxkUmVsYXRpb25zRm9yU291cmNlKHJlcXVpcmVtZW50c1Jlc3VsdCwgc291cmNlUmVzb3VyY2VVaWQsIHRhcmdldE5vZGVUb1JlbGF0aW9uc2hpcCk7CisKKwkJCX0KKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ldyBJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+KHJlc291cmNlc1Jlc3VsdCwgcmVxdWlyZW1lbnRzUmVzdWx0KSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlbGF0aW9uc0ZvclNvdXJjZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCkgeworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFJlbGF0aW9uc2hpcEluc3REYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlbGF0aW9uc2hpcHNSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VVaWQsCisJCQkJR3JhcGhFZGdlTGFiZWxzLlJFTEFUSU9OU0hJUF9JTlNULCBOb2RlVHlwZUVudW0uUmVsYXRpb25zaGlwSW5zdCwgUmVsYXRpb25zaGlwSW5zdERhdGEuY2xhc3MpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1czsKKwkJTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IHJlcXVpcmVtZW50c1Jlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPigpOworCisJCWlmIChyZWxhdGlvbnNoaXBzUmVzLmlzUmlnaHQoKSkgeworCQkJc3RhdHVzID0gcmVsYXRpb25zaGlwc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkFmdGVyIGZldGNoaW5nIGFsbCByZXNsYXRpb25zaGlwcyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlcXVpcmVtZW50c1Jlc3VsdCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgcmVsYXRpb25oaXBzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlVWlkLCBzdGF0dXMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCU1hcDxTdHJpbmcsIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFJlbGF0aW9uc2hpcEluc3REYXRhPj4+IHRhcmdldE5vZGVUb1JlbGF0aW9uc2hpcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW5zdERhdGE+Pj4oKTsKKworCQlMaXN0PEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIEdyYXBoRWRnZT4+IHJlbGF0aW9uc2hpcHNJbXBsID0gcmVsYXRpb25zaGlwc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJc3RhdHVzID0gcG9wdWxhdGVUYXJnZXRBbmRSZWxhdGlvbnNGb3JHaXZlblNvdXJjZSh0YXJnZXROb2RlVG9SZWxhdGlvbnNoaXAsIHJlbGF0aW9uc2hpcHNJbXBsKTsKKworCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlpZiAodGFyZ2V0Tm9kZVRvUmVsYXRpb25zaGlwLmlzRW1wdHkoKSkgeworCQkJbG9nLmVycm9yKCJObyB0YXJnZXQgZm91bmQgZm9yIHJlbGF0aW9uc2hpcCBpbnN0YW5jZXMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCByZXNvdXJjZUluc3RhbmNlVWlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9FTEVNRU5UKTsKKwkJfQorCisJCWJ1aWxkUmVsYXRpb25zRm9yU291cmNlKHJlcXVpcmVtZW50c1Jlc3VsdCwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgdGFyZ2V0Tm9kZVRvUmVsYXRpb25zaGlwKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlcXVpcmVtZW50c1Jlc3VsdCk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UmVsYXRpb25zRm9yVGFyZ2V0KFN0cmluZyByZXNvdXJjZUluc3RhbmNlVWlkKSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVsYXRpb25zaGlwc1JlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQYXJlbnROb2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VVaWQsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkNBUEFCSUxJVFlfTk9ERSwgTm9kZVR5cGVFbnVtLlJlbGF0aW9uc2hpcEluc3QsIFJlbGF0aW9uc2hpcEluc3REYXRhLmNsYXNzKTsKKworCQlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gcmVxdWlyZW1lbnRzUmVzdWx0ID0gbmV3IEFycmF5TGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+KCk7CisKKwkJaWYgKHJlbGF0aW9uc2hpcHNSZXMuaXNSaWdodCgpKSB7CisJCQlzdGF0dXMgPSByZWxhdGlvbnNoaXBzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZmV0Y2hpbmcgYWxsIHJlc2xhdGlvbnNoaXBzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlVWlkLCBzdGF0dXMpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVxdWlyZW1lbnRzUmVzdWx0KTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCByZWxhdGlvbmhpcHMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VVaWQsIHN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJfQorCQl9CisKKwkJTWFwPFN0cmluZywgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW5zdERhdGE+Pj4gc291cmNlTm9kZVRvUmVsYXRpb25zaGlwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBSZWxhdGlvbnNoaXBJbnN0RGF0YT4+PigpOworCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgR3JhcGhFZGdlPj4gcmVsYXRpb25zaGlwc0ltcGwgPSByZWxhdGlvbnNoaXBzUmVzLmxlZnQoKS52YWx1ZSgpOworCQlzdGF0dXMgPSBwb3B1bGF0ZVNvdXJjZUFuZFJlbGF0aW9uc0ZvckdpdmVuVGFyZ2V0KHNvdXJjZU5vZGVUb1JlbGF0aW9uc2hpcCwgcmVsYXRpb25zaGlwc0ltcGwpOworCisJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCWlmIChzb3VyY2VOb2RlVG9SZWxhdGlvbnNoaXAuaXNFbXB0eSgpKSB7CisJCQlsb2cuZXJyb3IoIk5vIHRhcmdldCBmb3VuZCBmb3IgcmVsYXRpb25zaGlwIGluc3RhbmNlcyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIHJlc291cmNlSW5zdGFuY2VVaWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQpOworCQl9CisKKwkJYnVpbGRSZWxhdGlvbnNGb3JUYXJnZXQocmVxdWlyZW1lbnRzUmVzdWx0LCByZXNvdXJjZUluc3RhbmNlVWlkLCBzb3VyY2VOb2RlVG9SZWxhdGlvbnNoaXApOworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVxdWlyZW1lbnRzUmVzdWx0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRGdWxsQ29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlKSB7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY29tcEluc3RDYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPj4oKTsKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPj4gY29tcEluc3RSZXEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+KCk7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4+IGNvbXBJbnN0QXJ0aWZhY3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+PigpOworCQlNYXA8U3RyaW5nLCBDb21wb25lbnQ+IGNvbXBJbnN0T3JpZ2lucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29tcG9uZW50PigpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZ1bGxSZXNvdXJjZUluc3RhbmNlID0gZ2V0RnVsbENvbXBvbmVudEluc3RhbmNlKGNvbXBJbnN0Q2FwYWJpbGl0aWVzLCBjb21wSW5zdFJlcSwgY29tcEluc3RBcnRpZmFjdHMsIGNvbXBJbnN0T3JpZ2lucywgY29tcG9uZW50SW5zdGFuY2UsIGNvbXBJbnN0Tm9kZVR5cGUpOworCQlpZiAoIWZ1bGxSZXNvdXJjZUluc3RhbmNlLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBmdWxsIGRhdGEgb2YgcmVzb3VyY2UgaW5zdGFuY2UuIGVycm9yOiB7fSIsIGZ1bGxSZXNvdXJjZUluc3RhbmNlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhmdWxsUmVzb3VyY2VJbnN0YW5jZSkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnRJbnN0YW5jZSk7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBnZXRGdWxsQ29tcG9uZW50SW5zdGFuY2UoTWFwPFN0cmluZywgTWFwPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+PiBjb21wSW5zdENhcGFiaWxpdGllcywgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPj4gY29tcEluc3RSZXEsCisJCQlNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+PiBjb21wSW5zdEFydGlmYWN0cywgTWFwPFN0cmluZywgQ29tcG9uZW50PiBjb21wSW5zdE9yaWdpbnMsIENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0LCBOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSkgeworCQlDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihjb21wSW5zdE5vZGVUeXBlKTsKKwkJU3RyaW5nIGNvbXBvbmVudFVpZCA9IGNvbXBJbnN0LmdldENvbXBvbmVudFVpZCgpOworCQlpZiAoY29tcEluc3RPcmlnaW5zLmNvbnRhaW5zS2V5KGNvbXBvbmVudFVpZCkpIHsKKwkJCWNvbXBvbmVudCA9IGNvbXBJbnN0T3JpZ2lucy5nZXQoY29tcG9uZW50VWlkKTsKKwkJfSBlbHNlIHsKKwkJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG1ldGFkYXRhQ29tcG9uZW50ID0gY29tcG9uZW50T3BlcmF0aW9uLmdldE1ldGFkYXRhQ29tcG9uZW50KGNvbXBvbmVudFVpZCwgdHJ1ZSk7CisJCQlpZiAobWV0YWRhdGFDb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggdGhlIG9yaWdpbiBjb21wb25lbnQgZm9yIGNvbXBvbmVudCBpbnN0YW5jZSwgb3JpZ2luIElkIHt9LCBlcnJvcjoge30iLCBjb21wb25lbnRVaWQsIG1ldGFkYXRhQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQl9CisJCQljb21wb25lbnQgPSBtZXRhZGF0YUNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKTsKKwkJCWNvbXBJbnN0T3JpZ2lucy5wdXQoY29tcG9uZW50VWlkLCBjb21wb25lbnQpOworCisJCX0KKwkJU3RyaW5nIGljb24gPSBjb21wb25lbnQuZ2V0SWNvbigpOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkZldGNoIHRoZSByZXNvdXJjZSBpbnN0YW5jZSBpY29uIGZyb20gdGhlIHJlc291cmNlIGl0c2VsZi4gaWNvbiA9IHt9IiwgaWNvbik7CisJCWNvbXBJbnN0LnNldEljb24oaWNvbik7CisJCVN0cmluZyBjb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKKwkJY29tcEluc3Quc2V0Q29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKTsKKwkJY29tcEluc3Quc2V0Q29tcG9uZW50VmVyc2lvbihjb21wb25lbnQuZ2V0VmVyc2lvbigpKTsKKwkJaWYgKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkgPT0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpIHsKKwkJCWNvbXBJbnN0LnNldFRvc2NhQ29tcG9uZW50TmFtZSgoKFJlc291cmNlKSBjb21wb25lbnQpLmdldFRvc2NhUmVzb3VyY2VOYW1lKCkpOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQkvLyBGb3IgVkZDL1ZML0NQCisJCWlmIChjb21wSW5zdE5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5SZXNvdXJjZSAmJiAoKFJlc291cmNlKSBjb21wb25lbnQpLmdldFJlc291cmNlVHlwZSgpICE9IFJlc291cmNlVHlwZUVudW0uVkYpIHsKKwkJCXJlc291cmNlT3BlcmF0aW9uLmZpbGxSZXNvdXJjZURlcml2ZWRMaXN0RnJvbUdyYXBoKGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBkZXJpdmVkRnJvbUxpc3QpOworCQl9IGVsc2UgeworCQkJLy8gR2V0dGluZyBjb21wb25lbnQgaW5zdGFuY2VzIHRoYXQgdGhlIG9yaWdpbiBjb21wb25lbnQgb2YgdGhpcworCQkJLy8gY29tcG9uZW50IGluc3RhbmNlIGlzIHRoZWlyIGNvbnRhaW5lciwgc28gd2UgY2FuIHVzZSB0aGUgbG9naWMgb2YKKwkJCS8vIGdldHRpbmcgcmVxL2NhcCBmcm9tIHRoZW0KKwkJCS8vIGFuZCBmaWxsIHRoaXMgY29tcG9uZW50IGluc3RhbmNlIHdpdGggdGhvc2UgcmVxL2NhcAorCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsQ29tcG9uZW50SW5zdGFuY2VGcm9tR3JhcGggPSBnZXRBbGxDb21wb25lbnRJbnN0YW5jZUZyb21HcmFwaChjb21wb25lbnRVaWQsIGNvbXBJbnN0Tm9kZVR5cGUsIHRydWUpOworCQkJaWYgKGFsbENvbXBvbmVudEluc3RhbmNlRnJvbUdyYXBoLmlzUmlnaHQoKSAmJiBhbGxDb21wb25lbnRJbnN0YW5jZUZyb21HcmFwaC5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBjb21wb25lbnQgaW5zdGFuY2VzIGZvciBjb21wb25lbnQge30gb2YgdHlwZSB7fSIsIGNvbXBvbmVudFVpZCwgY29tcEluc3ROb2RlVHlwZSk7CisJCQkJcmV0dXJuIGFsbENvbXBvbmVudEluc3RhbmNlRnJvbUdyYXBoLnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0KKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+IGFsbENJcyA9IGFsbENvbXBvbmVudEluc3RhbmNlRnJvbUdyYXBoLmlzTGVmdCgpID8gYWxsQ29tcG9uZW50SW5zdGFuY2VGcm9tR3JhcGgubGVmdCgpLnZhbHVlKCkgOiBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4gZW50cnkgOiBhbGxDSXMpIHsKKwkJCQljb21wb25lbnRJbnN0YW5jZXMuYWRkKG5ldyBDb21wb25lbnRJbnN0YW5jZShlbnRyeS5sZWZ0LmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpKSk7CisJCQl9CisJCQljb21wb25lbnQuc2V0Q29tcG9uZW50SW5zdGFuY2VzKGNvbXBvbmVudEluc3RhbmNlcyk7CisJCX0KKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNhcFN0YXR1cyA9IHNldENvbXBJbnN0Q2FwYWJpbGl0aWVzRnJvbUdyYXBoKGNvbXBJbnN0Q2FwYWJpbGl0aWVzLCBjb21wb25lbnQsIGNvbXBJbnN0Tm9kZVR5cGUsIGNvbXBJbnN0LCBkZXJpdmVkRnJvbUxpc3QpOworCQlpZiAoY2FwU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgY2FwYWJpbGl0eSBvZiByZXNvdXJjZSB7fS4gc3RhdHVzIGlzIHt9IiwgY29tcG9uZW50TmFtZSwgY2FwU3RhdHVzKTsKKworCQl9CisJCWNhcFN0YXR1cyA9IHNldENvbXBJbnN0UmVxdWlyZW1lbnRzRnJvbUdyYXBoKGNvbXBJbnN0UmVxLCBjb21wb25lbnQsIGNvbXBJbnN0Tm9kZVR5cGUsIGNvbXBJbnN0KTsKKwkJaWYgKGNhcFN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmaW5kIHJlcXVpcmVtZW50cyBvZiByZXNvdXJjZSB7fS4gc3RhdHVzIGlzIHt9IiwgY29tcG9uZW50TmFtZSwgY2FwU3RhdHVzKTsKKworCQl9CisKKwkJY2FwU3RhdHVzID0gc2V0Q29tcEluc3REZXBsb3ltZW50QXJ0aWZhY3RzRnJvbUdyYXBoKGNvbXBJbnN0QXJ0aWZhY3RzLCBjb21wb25lbnRVaWQsIGNvbXBJbnN0KTsKKwkJaWYgKGNhcFN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmaW5kIHJlc291cmNlIGRlcGxveW1lbnQgYXJ0aWZhY3RzIG9mIHJlc291cmNlIHt9LiBzdGF0dXMgaXMge30iLCBjb21wb25lbnROYW1lLCBjYXBTdGF0dXMpOworCisJCX0KKworCQljYXBTdGF0dXMgPSBzZXRDb21wSW5zdEFydGlmYWN0c0Zyb21HcmFwaChjb21wSW5zdCk7CisJCWlmIChjYXBTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmluZCByZXNvdXJjZSBkZXBsb3ltZW50IGFydGlmYWN0cyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fSAuIHN0YXR1cyBpcyB7fSIsIGNvbXBJbnN0LmdldE5hbWUoKSwgY2FwU3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc2V0Q29tcEluc3RBcnRpZmFjdHNGcm9tR3JhcGgoQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSkgeworCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZGVwbG95bWVudEFydGlmYWN0cyA9IG51bGw7CisJCWlmIChyZXNvdXJjZUluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSA9PSBudWxsKSB7CisJCQlkZXBsb3ltZW50QXJ0aWZhY3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KCk7CisJCX0gZWxzZSB7CisJCQlkZXBsb3ltZW50QXJ0aWZhY3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+KHJlc291cmNlSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpKTsKKwkJfQorCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBhcnRpZmFjdE9wZXJhdGlvbi5nZXRBcnRpZmFjdHMocmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSwgdHJ1ZSwgQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQuZ2V0VHlwZSgpKTsKKwkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfSBlbHNlIHsKKwkJCQlyZXNvdXJjZUluc3RhbmNlLnNldERlcGxveW1lbnRBcnRpZmFjdHMoZGVwbG95bWVudEFydGlmYWN0cyk7CisJCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCX0KKworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKChhcnRpZmFjdHMgIT0gbnVsbCkgJiYgIWFydGlmYWN0cy5pc0VtcHR5KCkpIHsKKwkJCWZvciAoQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0IDogYXJ0aWZhY3RzLnZhbHVlcygpKSB7CisJCQkJaWYgKGFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoQXJ0aWZhY3RUeXBlRW51bS5IRUFUX0VOVi5nZXRUeXBlKCkpKSB7CisJCQkJCUVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaGVhdFBhcmFtc0ZvckVudiA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEhlYXRQYXJhbXNGb3JFbnYoYXJ0aWZhY3QpOworCQkJCQlpZiAoaGVhdFBhcmFtc0ZvckVudi5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBoZWF0IHBhcmFtZXRlcnMgdmFsdWVzIGZvciBoZWF0IGFydGlmYWN0IHt9IiwgYXJ0aWZhY3QuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCQlyZXR1cm4gaGVhdFBhcmFtc0ZvckVudi5yaWdodCgpLnZhbHVlKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhcnRpZmFjdC5zZXRIZWF0UGFyYW1ldGVycyhoZWF0UGFyYW1zRm9yRW52LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gYWRkIHJlc291cmNlIGluc3RhbmNlIGFydGlmYWN0cyB0byB0aGUgYXJ0aWZhY3RzIGluaGVyaXRlZCBmcm9tCisJCQkvLyByZXNvdXJjZQorCQkJZGVwbG95bWVudEFydGlmYWN0cy5wdXRBbGwoYXJ0aWZhY3RzKTsKKwkJCXJlc291cmNlSW5zdGFuY2Uuc2V0RGVwbG95bWVudEFydGlmYWN0cyhkZXBsb3ltZW50QXJ0aWZhY3RzKTsKKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJLy8gcmVzb3VyY2VJbnN0YW5jZSkgeworCS8vIEFycmF5TGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4oKTsKKwkvLyBoZWF0RW52QXJ0aWZhY3QuZ2V0R2VuZXJhdGVkRnJvbUlkKCkpOworCS8vIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgR3JhcGhFZGdlPj4sCisJLy8gVGl0YW5PcGVyYXRpb25TdGF0dXM+IGhlYXRFbnZWYWx1ZXNXaXRoRWRnZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkvLyAhaGVhdEVudlZhbHVlc1dpdGhFZGdlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpCisJLy8geworCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIGhlYXRFbnZWYWx1ZXNXaXRoRWRnZXMubGVmdCgpLnZhbHVlKCkpeworCS8vIHBhaXIucmlnaHQuZ2V0UHJvcGVydGllcygpLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCS8vIGhlYXRWYWx1ZXNNYXAuZ2V0KHBhcmFtZXRlci5nZXROYW1lKCkpOworCXByaXZhdGUgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ29tcG9uZW50SW5zdGFuY2VGcm9tR3JhcGgoU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gY29udGFpbmVyTm9kZVR5cGUsIGJvb2xlYW4gd2l0aEVkZ2VzKSB7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZmV0Y2ggYWxsIHJlc291cmNlIGluc3RhbmNlcyBub2RlcyBpbiBncmFwaCBhc3NvY2lhdGUgdG8gY29tcG9uZW50IHt9IiwgY29tcG9uZW50SWQpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluc3RhbmNlc1JlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKGNvbnRhaW5lck5vZGVUeXBlKSwgY29tcG9uZW50SWQsIEdyYXBoRWRnZUxhYmVscy5SRVNPVVJDRV9JTlNULAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MsIHdpdGhFZGdlcyk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZmV0Y2hpbmcgYWxsIGNvbXBvbmVudCBpbnN0YW5jZXMgdW5kZXIgY29tcG9uZW50IHt9IiwgY29tcG9uZW50SWQpOworCisJCWlmIChyZXNvdXJjZUluc3RhbmNlc1Jlcy5pc0xlZnQoKSkgeworCQkJcHJpbnRBbGxSZXNvdXJjZUluc3RhbmNlc05hbWVzKHJlc291cmNlSW5zdGFuY2VzUmVzKTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VJbnN0YW5jZXNSZXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50QWxsUmVzb3VyY2VJbnN0YW5jZXNOYW1lcyhFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluc3RhbmNlc1JlcykgeworCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlidWlsZGVyLmFwcGVuZCgiUmVzdWx0IGlzICIpOworCQkJTGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPj4gbGlzdFJlc0RhdGEgPSByZXNvdXJjZUluc3RhbmNlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4gcmVzSW5zdFBhaXIgOiBsaXN0UmVzRGF0YSkgeworCQkJCUNvbXBvbmVudEluc3RhbmNlRGF0YSByZXNkYXRhID0gcmVzSW5zdFBhaXIuZ2V0TGVmdCgpOworCQkJCWJ1aWxkZXIuYXBwZW5kKHJlc2RhdGEuZ2V0TmFtZSgpKS5hcHBlbmQoIiwgIik7CisJCQl9CisJCQlsb2cudHJhY2UoYnVpbGRlci50b1N0cmluZygpKTsKKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgcG9wdWxhdGVUYXJnZXRBbmRSZWxhdGlvbnNGb3JHaXZlblNvdXJjZShNYXA8U3RyaW5nLCBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBSZWxhdGlvbnNoaXBJbnN0RGF0YT4+PiB0YXJnZXROb2RlVG9SZWxhdGlvbnNoaXAsIExpc3Q8SW1tdXRhYmxlUGFpcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgR3JhcGhFZGdlPj4gcmVsYXRpb25zaGlwc0ltcGwpIHsKKwkJaWYgKHJlbGF0aW9uc2hpcHNJbXBsICE9IG51bGwgJiYgZmFsc2UgPT0gcmVsYXRpb25zaGlwc0ltcGwuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIEdyYXBoRWRnZT4gcGFpciA6IHJlbGF0aW9uc2hpcHNJbXBsKSB7CisJCQkJUmVsYXRpb25zaGlwSW5zdERhdGEgcmVsYXRpb25zaGlwSW5zdERhdGEgPSBwYWlyLmdldEtleSgpOworCisJCQkJR3JhcGhFZGdlIHJlcXVpcmVtZW50RWRnZSA9IHBhaXIuZ2V0VmFsdWUoKTsKKwkJCQlTdHJpbmcgcmVxdWlyZW1lbnROYW1lID0gKFN0cmluZykgcmVxdWlyZW1lbnRFZGdlLmdldFByb3BlcnRpZXMoKS5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCisJCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdGFyZ2V0Tm9kZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChyZWxhdGlvbnNoaXBJbnN0RGF0YS5nZXRVbmlxdWVJZEtleSgpLCByZWxhdGlvbnNoaXBJbnN0RGF0YS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWV9OT0RFLAorCQkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisKKwkJCQlpZiAodGFyZ2V0Tm9kZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdGFyZ2V0Tm9kZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgdGhlIHRhcmdldCBub2RlIG9mIHJlbGF0aW9uc2hpcCBpbnN0IHt9LiBTdGF0dXMgaXMge30iLCByZWxhdGlvbnNoaXBJbnN0RGF0YSwgc3RhdHVzKTsKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisKKwkJCQlhZGRSZWxhdGlvbnNoaXBJbnN0VG9UYXJnZXRNYXAodGFyZ2V0Tm9kZVRvUmVsYXRpb25zaGlwLCByZWxhdGlvbnNoaXBJbnN0RGF0YSwgcmVxdWlyZW1lbnROYW1lLCB0YXJnZXROb2RlUmVzKTsKKworCQkJfQorCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgcG9wdWxhdGVTb3VyY2VBbmRSZWxhdGlvbnNGb3JHaXZlblRhcmdldChNYXA8U3RyaW5nLCBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBSZWxhdGlvbnNoaXBJbnN0RGF0YT4+PiBzb3VyY2VOb2RlVG9SZWxhdGlvbnNoaXAsIExpc3Q8SW1tdXRhYmxlUGFpcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgR3JhcGhFZGdlPj4gcmVsYXRpb25zaGlwc0ltcGwpIHsKKwkJaWYgKHJlbGF0aW9uc2hpcHNJbXBsICE9IG51bGwgJiYgZmFsc2UgPT0gcmVsYXRpb25zaGlwc0ltcGwuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIEdyYXBoRWRnZT4gcGFpciA6IHJlbGF0aW9uc2hpcHNJbXBsKSB7CisJCQkJUmVsYXRpb25zaGlwSW5zdERhdGEgcmVsYXRpb25zaGlwSW5zdERhdGEgPSBwYWlyLmdldEtleSgpOworCisJCQkJR3JhcGhFZGdlIHJlcXVpcmVtZW50RWRnZSA9IHBhaXIuZ2V0VmFsdWUoKTsKKwkJCQlTdHJpbmcgcmVxdWlyZW1lbnROYW1lID0gKFN0cmluZykgcmVxdWlyZW1lbnRFZGdlLmdldFByb3BlcnRpZXMoKS5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCisJCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc291cmNlTm9kZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQYXJlbnROb2RlKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFVuaXF1ZUlkS2V5KCksIHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5SRUxBVElPTlNISVBfSU5TVCwKKwkJCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCisJCQkJaWYgKHNvdXJjZU5vZGVSZXMuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHNvdXJjZU5vZGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHRoZSBzb3VyY2Ugbm9kZSBvZiByZWxhdGlvbnNoaXAgaW5zdCB7fS4gU3RhdHVzIGlzIHt9IiwgcmVsYXRpb25zaGlwSW5zdERhdGEsIHN0YXR1cyk7CisJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCisJCQkJYWRkUmVsYXRpb25zaGlwSW5zdFRvVGFyZ2V0TWFwKHNvdXJjZU5vZGVUb1JlbGF0aW9uc2hpcCwgcmVsYXRpb25zaGlwSW5zdERhdGEsIHJlcXVpcmVtZW50TmFtZSwgc291cmNlTm9kZVJlcyk7CisKKwkJCX0KKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIHZvaWQgYnVpbGRSZWxhdGlvbnNGb3JTb3VyY2UoTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+IHJlcXVpcmVtZW50c1Jlc3VsdCwgU3RyaW5nIHNvdXJjZVJlc291cmNlVWlkLCBNYXA8U3RyaW5nLCBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBSZWxhdGlvbnNoaXBJbnN0RGF0YT4+PiB0YXJnZXROb2RlVG9SZWxhdGlvbnNoaXApIHsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFJlbGF0aW9uc2hpcEluc3REYXRhPj4+IHRhcmdldFRvUmVsIDogdGFyZ2V0Tm9kZVRvUmVsYXRpb25zaGlwLmVudHJ5U2V0KCkpIHsKKwkJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCQlyZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuc2V0RnJvbU5vZGUoc291cmNlUmVzb3VyY2VVaWQpOworCQkJU3RyaW5nIHRhcmdldFVpZCA9IHRhcmdldFRvUmVsLmdldEtleSgpOworCQkJcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLnNldFRvTm9kZSh0YXJnZXRVaWQpOworCisJCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25zaGlwcyA9IG5ldyBBcnJheUxpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPigpOworCisJCQlwb3B1bGF0ZVJlbGF0aW9uc2hpcHModGFyZ2V0VG9SZWwsIHJlbGF0aW9uc2hpcHMpOworCQkJcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwcyk7CisKKwkJCXJlcXVpcmVtZW50c1Jlc3VsdC5hZGQocmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBidWlsZFJlbGF0aW9uc0ZvclRhcmdldChMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gcmVxdWlyZW1lbnRzUmVzdWx0LCBTdHJpbmcgdGFyZ2V0UmVzb3VyY2VVaWQsIE1hcDxTdHJpbmcsIExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFJlbGF0aW9uc2hpcEluc3REYXRhPj4+IHNvdXJjZU5vZGVUb1JlbGF0aW9uc2hpcCkgeworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW5zdERhdGE+Pj4gc291cmNlVG9SZWwgOiBzb3VyY2VOb2RlVG9SZWxhdGlvbnNoaXAuZW50cnlTZXQoKSkgeworCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJCXJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZi5zZXRUb05vZGUodGFyZ2V0UmVzb3VyY2VVaWQpOworCQkJU3RyaW5nIHNvdXJjZVVpZCA9IHNvdXJjZVRvUmVsLmdldEtleSgpOworCQkJcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLnNldEZyb21Ob2RlKHNvdXJjZVVpZCk7CisKKwkJCUxpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPiByZWxhdGlvbnNoaXBzID0gbmV3IEFycmF5TGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+KCk7CisKKwkJCXBvcHVsYXRlUmVsYXRpb25zaGlwcyhzb3VyY2VUb1JlbCwgcmVsYXRpb25zaGlwcyk7CisJCQlyZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzKTsKKworCQkJcmVxdWlyZW1lbnRzUmVzdWx0LmFkZChyZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFJlbGF0aW9uc2hpcEluc3RUb1RhcmdldE1hcChNYXA8U3RyaW5nLCBMaXN0PEltbXV0YWJsZVBhaXI8U3RyaW5nLCBSZWxhdGlvbnNoaXBJbnN0RGF0YT4+PiB0YXJnZXROb2RlVG9SZWxhdGlvbnNoaXAsIFJlbGF0aW9uc2hpcEluc3REYXRhIHJlbGF0aW9uc2hpcEluc3REYXRhLCBTdHJpbmcgcmVxdWlyZW1lbnROYW1lLAorCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdGFyZ2V0Tm9kZVJlcykgeworCisJCUltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+IHRhcmdldFJlc291cmNlUGFpciA9IHRhcmdldE5vZGVSZXMubGVmdCgpLnZhbHVlKCk7CisJCUNvbXBvbmVudEluc3RhbmNlRGF0YSB0YXJnZXRSZXNvdXJjZURhdGEgPSB0YXJnZXRSZXNvdXJjZVBhaXIuZ2V0S2V5KCk7CisKKwkJR3JhcGhFZGdlIGVkZ2UgPSB0YXJnZXRSZXNvdXJjZVBhaXIucmlnaHQ7CisJCWlmIChlZGdlLmdldEVkZ2VUeXBlKCkuZXF1YWxzKEdyYXBoRWRnZUxhYmVscy5SRUxBVElPTlNISVBfSU5TVCkpIHsKKwkJCXJlcXVpcmVtZW50TmFtZSA9IChTdHJpbmcpIGVkZ2UuZ2V0UHJvcGVydGllcygpLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQl9CisKKwkJU3RyaW5nIHRhcmdldFJlc291cmNlVWlkID0gKFN0cmluZykgdGFyZ2V0UmVzb3VyY2VEYXRhLmdldFVuaXF1ZUlkKCk7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFJlbGF0aW9uc2hpcEluc3REYXRhPj4gcmVxdWlyZW1lbnRSZWxhdGlvbnNoaXBQYWlyID0gdGFyZ2V0Tm9kZVRvUmVsYXRpb25zaGlwLmdldCh0YXJnZXRSZXNvdXJjZVVpZCk7CisJCWlmIChyZXF1aXJlbWVudFJlbGF0aW9uc2hpcFBhaXIgPT0gbnVsbCkgeworCQkJcmVxdWlyZW1lbnRSZWxhdGlvbnNoaXBQYWlyID0gbmV3IEFycmF5TGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW5zdERhdGE+PigpOworCQkJdGFyZ2V0Tm9kZVRvUmVsYXRpb25zaGlwLnB1dCh0YXJnZXRSZXNvdXJjZVVpZCwgcmVxdWlyZW1lbnRSZWxhdGlvbnNoaXBQYWlyKTsKKwkJfQorCQlJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW5zdERhdGE+IHJlcVJlbGF0aW9uc2hpcFBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFJlbGF0aW9uc2hpcEluc3REYXRhPihyZXF1aXJlbWVudE5hbWUsIHJlbGF0aW9uc2hpcEluc3REYXRhKTsKKwkJcmVxdWlyZW1lbnRSZWxhdGlvbnNoaXBQYWlyLmFkZChyZXFSZWxhdGlvbnNoaXBQYWlyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVSZWxhdGlvbnNoaXBzKEVudHJ5PFN0cmluZywgTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW5zdERhdGE+Pj4gdGFyZ2V0VG9SZWwsIExpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPiByZWxhdGlvbnNoaXBzKSB7CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgUmVsYXRpb25zaGlwSW5zdERhdGE+PiB2YWx1ZXMgPSB0YXJnZXRUb1JlbC5nZXRWYWx1ZSgpOworCQlmb3IgKEltbXV0YWJsZVBhaXI8U3RyaW5nLCBSZWxhdGlvbnNoaXBJbnN0RGF0YT4gdmFsdWUgOiB2YWx1ZXMpIHsKKwkJCVN0cmluZyByZXFOYW1lID0gdmFsdWUuZ2V0S2V5KCk7CisJCQlSZWxhdGlvbnNoaXBJbnN0RGF0YSByZWxhdGlvbnNoaXBJbnN0RGF0YSA9IHZhbHVlLmdldFZhbHVlKCk7CisJCQlSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcEltcGwgPSBuZXcgUmVsYXRpb25zaGlwSW1wbCgpOworCQkJcmVsYXRpb25zaGlwSW1wbC5zZXRUeXBlKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFR5cGUoKSk7CisJCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcGFpciA9IG5ldyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIocmVxTmFtZSwgcmVsYXRpb25zaGlwSW1wbCk7CisJCQlwYWlyLnNldENhcGFiaWxpdHlPd25lcklkKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldENhcGFiaWxpdHlPd25lcklkKCkpOworCQkJcGFpci5zZXRDYXBhYmlsaXR5VWlkKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldENhcGFiaWx0eUlkKCkpOworCQkJcGFpci5zZXRSZXF1aXJlbWVudE93bmVySWQocmVsYXRpb25zaGlwSW5zdERhdGEuZ2V0UmVxdWlyZW1lbnRPd25lcklkKCkpOworCQkJcGFpci5zZXRSZXF1aXJlbWVudFVpZChyZWxhdGlvbnNoaXBJbnN0RGF0YS5nZXRSZXF1aXJlbWVudElkKCkpOworCQkJcmVsYXRpb25zaGlwcy5hZGQocGFpcik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHJlc291cmNlT3BlcmF0aW9uCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VPcGVyYXRpb24oUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb24pIHsKKwkJdGhpcy5yZXNvdXJjZU9wZXJhdGlvbiA9IHJlc291cmNlT3BlcmF0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlbGF0aW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG11bHRpUmVxdWlyZW1lbnRzID0gYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXNNdWx0aVJlcXVpcmVtZW50cyhjb21wb25lbnRJZCwgbm9kZVR5cGUsIHJlbGF0aW9uKTsKKwkJCWlmIChtdWx0aVJlcXVpcmVtZW50cy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBtdWx0aVJlcXVpcmVtZW50cy5yaWdodCgpLnZhbHVlKCk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsICJhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXMiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VzIik7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNvbXBvbmVudCBpbnN0YW5jZXMuIHt9LiBTdGF0dXMgaXMge30iLCByZWxhdGlvbiwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB1cGRhdGVDYWxjdWxhdGVkQ2FwUmVxUmVzdWx0ID0gdXBkYXRlQ2FsY3VsYXRlZENhcFJlcShyZWxhdGlvbiwgdHJ1ZSk7CisJCQlpZiAoIXVwZGF0ZUNhbGN1bGF0ZWRDYXBSZXFSZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRGFvU3lzdGVtRXJyb3IsICJhc3NvY2lhdGVDb21wb25lbnRJbnN0YW5jZXMiKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVEYW9TeXN0ZW1FcnJvcigiYXNzb2NpYXRlQ29tcG9uZW50SW5zdGFuY2VzIik7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNvbXBvbmVudCBpbnN0YW5jZXMuIHt9LiBTdGF0dXMgaXMge30iLCByZWxhdGlvbiwgdXBkYXRlQ2FsY3VsYXRlZENhcFJlcVJlc3VsdCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHVwZGF0ZUNhbGN1bGF0ZWRDYXBSZXFSZXN1bHQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChtdWx0aVJlcXVpcmVtZW50cy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJY29tbWl0T3JSb2xsYmFjayhyZXN1bHQpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXNNdWx0aVJlcXVpcmVtZW50cyhTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlbGF0aW9uKSB7CisKKwkJU3RyaW5nIGZyb21Ob2RlID0gcmVsYXRpb24uZ2V0RnJvbU5vZGUoKTsKKwkJU3RyaW5nIHRvTm9kZSA9IHJlbGF0aW9uLmdldFRvTm9kZSgpOworCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcHMoKTsKKwkJaWYgKHJlbGF0aW9uc2hpcHMgPT0gbnVsbCB8fCByZWxhdGlvbnNoaXBzLmlzRW1wdHkoKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkQWRkaW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yLCAiQXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMgLSBtaXNzaW5nIHJlbGF0aW9uc2hpcCIsIGZyb21Ob2RlLCBjb21wb25lbnRJZCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRBZGRpbmdSZXNvdXJjZUluc3RhbmNlRXJyb3IoIkFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzIC0gbWlzc2luZyByZWxhdGlvbnNoaXAiLCBmcm9tTm9kZSwgY29tcG9uZW50SWQpOworCQkJbG9nLmRlYnVnKCJObyByZXF1aXJlbWVudCBkZWZpbml0aW9uIHNlbnQgaW4gb3JkZXIgdG8gc2V0IHRoZSByZWxhdGlvbiBiZXR3ZWVuIHt9IHRvIHt9IiwgZnJvbU5vZGUsIHRvTm9kZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQl9CisKKwkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHNSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4oKTsKKwkJZm9yIChSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgaW1tdXRhYmxlUGFpciA6IHJlbGF0aW9uc2hpcHMpIHsKKwkJCVN0cmluZyByZXF1aXJlbWVudCA9IGltbXV0YWJsZVBhaXIuZ2V0UmVxdWlyZW1lbnQoKTsKKworCQkJRWl0aGVyPFJlbGF0aW9uc2hpcEluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlUmVzID0gY29ubmVjdFJlc291cmNlc0luU2VydmljZShjb21wb25lbnRJZCwgbm9kZVR5cGUsIGZyb21Ob2RlLCB0b05vZGUsIGltbXV0YWJsZVBhaXIpOworCisJCQlpZiAoYXNzb2NpYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFzc29jaWF0ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkJlRmFpbGVkQWRkaW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yLCAiQXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMiLCBmcm9tTm9kZSwgY29tcG9uZW50SWQpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZEFkZGluZ1Jlc291cmNlSW5zdGFuY2VFcnJvcigiQXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMgLSBtaXNzaW5nIHJlbGF0aW9uc2hpcCIsIGZyb21Ob2RlLCBjb21wb25lbnRJZCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHJlc291cmNlIGluc3RhbmNlIHt9IHRvIHJlc291cmNlIGluc3RuYWNlIHt9LiBTdGF0dXMgaXMge30iLCBmcm9tTm9kZSwgdG9Ob2RlLCBzdGF0dXMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKworCQkJUmVsYXRpb25zaGlwSW5zdERhdGEgcmVsYXRpb25zaGlwSW5zdERhdGEgPSBhc3NvY2lhdGVSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcEltcGxSZXN1bHQgPSBuZXcgUmVsYXRpb25zaGlwSW1wbCgpOworCQkJcmVsYXRpb25zaGlwSW1wbFJlc3VsdC5zZXRUeXBlKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFR5cGUoKSk7CisJCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcihyZXF1aXJlbWVudCwgcmVsYXRpb25zaGlwSW1wbFJlc3VsdCk7CisJCQlyZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIuc2V0Q2FwYWJpbGl0eShpbW11dGFibGVQYWlyLmdldENhcGFiaWxpdHkoKSk7CisJCQlyZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIuc2V0Q2FwYWJpbGl0eU93bmVySWQocmVsYXRpb25zaGlwSW5zdERhdGEuZ2V0Q2FwYWJpbGl0eU93bmVySWQoKSk7CisJCQlyZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJlbGF0aW9uc2hpcEluc3REYXRhLmdldFJlcXVpcmVtZW50T3duZXJJZCgpKTsKKwkJCXJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpci5zZXRDYXBhYmlsaXR5VWlkKGltbXV0YWJsZVBhaXIuZ2V0Q2FwYWJpbGl0eVVpZCgpKTsKKwkJCXJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpci5zZXRSZXF1aXJlbWVudFVpZChpbW11dGFibGVQYWlyLmdldFJlcXVpcmVtZW50VWlkKCkpOworCQkJcmVsYXRpb25zaGlwc1Jlc3VsdC5hZGQocmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKTsKKworCQl9CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGNhcGFiaWxpdHlSZWxEZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCWNhcGFiaWxpdHlSZWxEZWYuc2V0RnJvbU5vZGUoZnJvbU5vZGUpOworCQljYXBhYmlsaXR5UmVsRGVmLnNldFRvTm9kZSh0b05vZGUpOworCQljYXBhYmlsaXR5UmVsRGVmLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwc1Jlc3VsdCk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhcGFiaWxpdHlSZWxEZWYpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlbGF0aW9uKSB7CisJCXJldHVybiBhc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhjb21wb25lbnRJZCwgbm9kZVR5cGUsIHJlbGF0aW9uLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsQ29tcG9uZW50SW5zdGFuY2VzKFN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBtdWx0aVJlcXVpcmVtZW50cyA9IGRlbGV0ZUFsbENvbXBvbmVudEluc3RhbmNlc0ludGVybmFsKGNvbnRhaW5lckNvbXBvbmVudElkLCBjb250YWluZXJOb2RlVHlwZSk7CisJCQlpZiAobXVsdGlSZXF1aXJlbWVudHMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gbXVsdGlSZXF1aXJlbWVudHMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChtdWx0aVJlcXVpcmVtZW50cy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5CZVN5c3RlbUVycm9yLCAiZGVsZXRlQWxsUmVzb3VyY2VJbnN0YW5jZXMgLSBtaXNzaW5nIHJlbGF0aW9uc2hpcCIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVTeXN0ZW1FcnJvcigiZGVsZXRlQWxsUmVzb3VyY2VJbnN0YW5jZXMgLSBtaXNzaW5nIHJlbGF0aW9uc2hpcCIpOworCQkJCX0KKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgcmVzb3VyY2UgaW5zdGFuY2VzIG9mIHNlcnZpY2Uge30uIFN0YXR1cyBpcyB7fSIsIGNvbnRhaW5lckNvbXBvbmVudElkLCBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQobXVsdGlSZXF1aXJlbWVudHMubGVmdCgpLnZhbHVlKCkpOworCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWNvbW1pdE9yUm9sbGJhY2socmVzdWx0KTsKKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsQ29tcG9uZW50SW5zdGFuY2VzKFN0cmluZyBjb250YWluZXJDb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisJCXJldHVybiBkZWxldGVBbGxDb21wb25lbnRJbnN0YW5jZXMoY29udGFpbmVyQ29tcG9uZW50SWQsIG5vZGVUeXBlLCBmYWxzZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbENvbXBvbmVudEluc3RhbmNlc0ludGVybmFsKFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJbG9nLmRlYnVnKCJHb2luZyB0byBkZWxldGUgYWxsIHJlc291cmNlIGluc3RhbmNlcyBhbmQgdGhlaXIgcmVsYXRpb3NoaXBzIGZyb20gc2VydmljZSB7fSIsIGNvbXBvbmVudElkKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluc3RhbmNlc1JlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgY29tcG9uZW50SWQsIEdyYXBoRWRnZUxhYmVscy5SRVNPVVJDRV9JTlNULAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCisJCWlmIChyZXNvdXJjZUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHJlc291cmNlSW5zdGFuY2VzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZmV0Y2hpbmcgYWxsIHJlc291cmNlIGluc3RhbmNlcyBvZiBzZXJ2aWNlIHt9LiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJZCwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+KCk7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+IGxpc3RPZlJlc0luc3RhbmNlcyA9IHJlc291cmNlSW5zdGFuY2VzUmVzLmxlZnQoKS52YWx1ZSgpOworCQlmb3IgKEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+IHJlc0luc3RhbmNlIDogbGlzdE9mUmVzSW5zdGFuY2VzKSB7CisJCQlDb21wb25lbnRJbnN0YW5jZURhdGEgcmVzb3VyY2VJbnN0YW5jZURhdGEgPSByZXNJbnN0YW5jZS5nZXRLZXkoKTsKKwkJCVN0cmluZyByZXNvdXJjZUluc3RVaWQgPSByZXNvdXJjZUluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpOworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVtb3ZlUmVzb3VyY2VJbnN0YW5jZVJlcyA9IHJlbW92ZUNvbXBvbmVudEluc3RhbmNlRnJvbUNvbXBvbmVudChub2RlVHlwZSwgY29tcG9uZW50SWQsIHJlc291cmNlSW5zdFVpZCk7CisJCQlsb2cuZGVidWcoIkFmdGVyIHJlbW92aW5nIHJlc291cmNlIGluc3RhbmNlIHt9LiBSZXN1bHQgaXMge30iLCByZXNvdXJjZUluc3RVaWQsIHJlbW92ZVJlc291cmNlSW5zdGFuY2VSZXMpOworCQkJaWYgKHJlbW92ZVJlc291cmNlSW5zdGFuY2VSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmVtb3ZlUmVzb3VyY2VJbnN0YW5jZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJBZnRlciByZW1vdmluZyByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0VWlkLCBzdGF0dXMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSByZW1vdmVSZXNvdXJjZUluc3RhbmNlUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJcmVzdWx0LmFkZChyZXNvdXJjZUluc3RhbmNlKTsKKwkJfQorCisJCWxvZy5kZWJ1ZygiVGhlIGZvbGxvd2luZyByZXNvdXJjZSBpbnN0YW5jZXMgd2FzIGRlbGV0ZWQgZnJvbSBzZXJ2aWNlIHt9Ont9IiwgY29tcG9uZW50SWQsIHJlc3VsdCk7CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJfQorCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBNYXA8U3RyaW5nLCBTdHJpbmc+PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2xvbmVBbGxDb21wb25lbnRJbnN0YW5jZXNGcm9tQ29udGFpbmVyQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnRJZEZyb20sIENvbXBvbmVudCBjb21wb25lbnQsIE5vZGVUeXBlRW51bSBjb250YWluZXJOb2RlVHlwZSwKKwkJCU5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlLCBMaWZlY3ljbGVTdGF0ZUVudW0gdGFyZ2V0TGlmZWN5Y2xlLCBNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+PiBpbnB1dHNWYWx1ZXNNYXApIHsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZT4oKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBvbGRDb21wSW5zdFRvTmV3ID0gbmV3IEhhc2hNYXA8PigpOworCisJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIE1hcDxTdHJpbmcsIFN0cmluZz4+IHJlc3VsdCA9IG5ldyBJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBNYXA8U3RyaW5nLCBTdHJpbmc+PihsaXN0LCBvbGRDb21wSW5zdFRvTmV3KTsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWxsUmVzb3VyY2VJbnN0YW5jZXMgPSBnZXRBbGxDb21wb25lbnRJbnN0YW5jZXMoY29tcG9uZW50SWRGcm9tLCBjb250YWluZXJOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSwgdHJ1ZSk7CisKKwkJaWYgKGFsbFJlc291cmNlSW5zdGFuY2VzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxSZXNvdXJjZUluc3RhbmNlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgYWxsIHJlc291cmNlIGluc3RhbmNlcyBmb3Igc2VydmljZSB7fS4gc3RhdHVzPXt9IiwgY29tcG9uZW50SWRGcm9tLCBzdGF0dXMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJpTGlzdCA9IGFsbFJlc291cmNlSW5zdGFuY2VzLmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCU1hcDxTdHJpbmcsIENvbXBvbmVudEluc3RhbmNlPiByaU1hcHBlciA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJaW50IGluc3RhbmNlTnVtYmVyID0gMDsKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZSByaSA6IHJpTGlzdCkgeworCQkJaW5zdGFuY2VOdW1iZXIrKzsKKwkJCVN0cmluZyBvcmlnUmlVbmlxdWVJRCA9IHJpLmdldFVuaXF1ZUlkKCk7CisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlc291cmNlSW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgY29udGFpbmVyTm9kZVR5cGUsIFN0cmluZy52YWx1ZU9mKGluc3RhbmNlTnVtYmVyKSwgZmFsc2UsIHJpLCBjb21wSW5zdE5vZGVUeXBlLCB0cnVlLCB0cnVlKTsKKwkJCWlmIChjcmVhdGVSZXNvdXJjZUluc3RhbmNlLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gY2xvbmUgcmVzb3VyY2UgaW5zdGFuY2Uge30uIHN0YXR1cyA9e30iLCBvcmlnUmlVbmlxdWVJRCwgc3RhdHVzKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisJCQlDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVkSW5zdGFuY2UgPSBjcmVhdGVSZXNvdXJjZUluc3RhbmNlLmxlZnQoKS52YWx1ZSgpOworCQkJcmlNYXBwZXIucHV0KG9yaWdSaVVuaXF1ZUlELCBjcmVhdGVkSW5zdGFuY2UpOworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVBcnRpZmFjdHNUb1Jlc291cmNlID0gY2xvbmVSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzKGNyZWF0ZWRJbnN0YW5jZSwgcmksIHRhcmdldExpZmVjeWNsZSk7CisJCQlpZiAoYXNzb2NpYXRlQXJ0aWZhY3RzVG9SZXNvdXJjZSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY2xvbmUgcmVzb3VyY2UgaW5zdGFuY2Uge30gYXJ0aWZhY3RzLiBlcnJvciB7fSAiLCByaS5nZXROb3JtYWxpemVkTmFtZSgpLCBhc3NvY2lhdGVBcnRpZmFjdHNUb1Jlc291cmNlLm5hbWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChhc3NvY2lhdGVBcnRpZmFjdHNUb1Jlc291cmNlKTsKKwkJCX0KKworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2UgPSBjbG9uZVJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eVZhbHVlcyhjcmVhdGVkSW5zdGFuY2UsIHJpKTsKKwkJCWlmIChhc3NvY2lhdGVQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2UgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNsb25lIHJlc291cmNlIGluc3RhbmNlIHt9IHByb3BlcnR5IHZhbHVlcy4gZXJyb3Ige30gIiwgcmkuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYXNzb2NpYXRlUHJvcGVydHlWYWx1ZXNUb1Jlc291cmNlLm5hbWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChhc3NvY2lhdGVQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2UpOworCQkJfQorCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUF0dHJpYnV0ZVZhbHVlc1RvUmVzb3VyY2UgPSBjbG9uZVJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGVWYWx1ZXMoY3JlYXRlZEluc3RhbmNlLCByaSk7CisJCQlpZiAoYXNzb2NpYXRlQXR0cmlidXRlVmFsdWVzVG9SZXNvdXJjZSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY2xvbmUgcmVzb3VyY2UgaW5zdGFuY2Uge30gYXR0cmlidXRlIHZhbHVlcy4gZXJyb3Ige30gIiwgcmkuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYXNzb2NpYXRlQXR0cmlidXRlVmFsdWVzVG9SZXNvdXJjZS5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYXNzb2NpYXRlQXR0cmlidXRlVmFsdWVzVG9SZXNvdXJjZSk7CisJCQl9CisKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlSW5wdXRWYWx1ZXNUb1Jlc291cmNlID0gY2xvbmVSZXNvdXJjZUluc3RhbmNlSW5wdXRzVmFsdWVzKGNyZWF0ZWRJbnN0YW5jZSwgcmksIGNvbXBvbmVudCwgaW5wdXRzVmFsdWVzTWFwKTsKKwkJCWlmIChhc3NvY2lhdGVJbnB1dFZhbHVlc1RvUmVzb3VyY2UgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNsb25lIHJlc291cmNlIGluc3RhbmNlIHt9IHByb3BlcnR5IHZhbHVlcy4gZXJyb3Ige30gIiwgcmkuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYXNzb2NpYXRlUHJvcGVydHlWYWx1ZXNUb1Jlc291cmNlLm5hbWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChhc3NvY2lhdGVQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2UpOworCQkJfQorCisJCQlsaXN0LmFkZChjcmVhdGVkSW5zdGFuY2UpOworCQkJb2xkQ29tcEluc3RUb05ldy5wdXQob3JpZ1JpVW5pcXVlSUQsIGNyZWF0ZWRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCisJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiByZWxhdGlvbnNMaXN0ID0gYWxsUmVzb3VyY2VJbnN0YW5jZXMubGVmdCgpLnZhbHVlKCkucmlnaHQ7CisJCWZvciAoUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlbGF0aW9uIDogcmVsYXRpb25zTGlzdCkgeworCQkJU3RyaW5nIG9yaWdGcm9tID0gcmVsYXRpb24uZ2V0RnJvbU5vZGUoKTsKKwkJCVN0cmluZyBvcmlnVG8gPSByZWxhdGlvbi5nZXRUb05vZGUoKTsKKwkJCXJlbGF0aW9uLnNldEZyb21Ob2RlKHJpTWFwcGVyLmdldChvcmlnRnJvbSkuZ2V0VW5pcXVlSWQoKSk7CisJCQlyZWxhdGlvbi5zZXRUb05vZGUocmlNYXBwZXIuZ2V0KG9yaWdUbykuZ2V0VW5pcXVlSWQoKSk7CisJCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gcmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcHMoKTsKKwkJCWZvciAoUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHBhaXIgOiByZWxhdGlvbnNoaXBzKSB7CisJCQkJLy8gZm9yIGFsbCBhdG9taWMgcmVzb3VyY2UgaW5zdGFuY2VzIG5lZWQgdG8gdXBkYXRlIHRvIHJlbGV2YW50CisJCQkJLy8gbmV3IHJpIGlkcworCQkJCVN0cmluZyBjYXBPd25lcklkID0gcGFpci5nZXRDYXBhYmlsaXR5T3duZXJJZCgpOworCQkJCVN0cmluZyByZXFPd25lcklkID0gcGFpci5nZXRSZXF1aXJlbWVudE93bmVySWQoKTsKKwkJCQlpZiAoaXNBdG9taWNDb21wb25lbnRJbnN0YW5jZShyaU1hcHBlci5nZXQob3JpZ0Zyb20pKSkgeworCQkJCQlyZXFPd25lcklkID0gcmlNYXBwZXIuZ2V0KHJlcU93bmVySWQpLmdldFVuaXF1ZUlkKCk7CisJCQkJfQorCQkJCWlmIChpc0F0b21pY0NvbXBvbmVudEluc3RhbmNlKHJpTWFwcGVyLmdldChvcmlnVG8pKSkgeworCQkJCQljYXBPd25lcklkID0gcmlNYXBwZXIuZ2V0KGNhcE93bmVySWQpLmdldFVuaXF1ZUlkKCk7CisJCQkJfQorCQkJCXBhaXIuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJlcU93bmVySWQpOworCQkJCXBhaXIuc2V0Q2FwYWJpbGl0eU93bmVySWQoY2FwT3duZXJJZCk7CisJCQl9CisKKwkJCUVpdGhlcjxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUluc3RhbmNlcyA9IGFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb250YWluZXJOb2RlVHlwZSwgcmVsYXRpb24sIHRydWUpOworCQkJaWYgKGFzc29jaWF0ZUluc3RhbmNlcy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFzc29jaWF0ZUluc3RhbmNlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gYXNzb3NpYXRlIHJlc291cmNlIGluc3RhbmNlIHt9IGFuZCByZXNvdXJjZSBpbnN0YW5jZSB7fS4gc3RhdHVzID17fSIsIHJlbGF0aW9uLmdldEZyb21Ob2RlKCksIHJlbGF0aW9uLmdldFRvTm9kZSgpLCBzdGF0dXMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXB1YmxpYyBFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTWFwPFN0cmluZywgU3RyaW5nPj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lQWxsQ29tcG9uZW50SW5zdGFuY2VzRnJvbUNvbnRhaW5lckNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50SWRGcm9tLCBTdHJpbmcgY29tcG9uZW50SWRUbywgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLAorCQkJTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUsIExpZmVjeWNsZVN0YXRlRW51bSB0YXJnZXRMaWZlY3ljbGUsIFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4LCBSZXNvdXJjZSBwcmV2UmVzb3VyY2UsIFJlc291cmNlIG5ld1Jlc291cmNlLCBNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiBpbnB1dHNQcm9wTWFwKSB7CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gb2xkQ29tcEluc3RUb05ldyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHQgPSBuZXcgSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTWFwPFN0cmluZywgU3RyaW5nPj4obGlzdCwgb2xkQ29tcEluc3RUb05ldyk7CisKKwkJLy8gRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sCisJCS8vIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+CisJCS8vIGFsbFJlc291cmNlSW5zdGFuY2VzID0gZ2V0QWxsQ29tcG9uZW50SW5zdGFuY2VzKGNvbXBvbmVudElkRnJvbSwKKwkJLy8gY29udGFpbmVyTm9kZVR5cGUsIGNvbXBJbnN0Tm9kZVR5cGUsIHRydWUpOworCQkvLworCQkvLworCQkvLyBpZiAoYWxsUmVzb3VyY2VJbnN0YW5jZXMuaXNSaWdodCgpKSB7CisJCS8vIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsUmVzb3VyY2VJbnN0YW5jZXMucmlnaHQoKS52YWx1ZSgpOworCQkvLyBpZiAoc3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJLy8KKwkJLy8gcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCS8vIH0gZWxzZSB7CisJCS8vIGxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCBhbGwgcmVzb3VyY2UgaW5zdGFuY2VzIGZvciBzZXJ2aWNlIHt9LgorCQkvLyBzdGF0dXM9e30iLCBjb21wb25lbnRJZEZyb20sIHN0YXR1cyk7CisJCS8vIHJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJLy8gfQorCQkvLyB9CisKKwkJLy8gSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwKKwkJLy8gTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PiBpbnN0YW5jZVJlbGF0aW9uUGFpciA9CisJCS8vIGFsbFJlc291cmNlSW5zdGFuY2VzLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sCisJCS8vIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4gaW5zdGFuY2VSZWxhdGlvblBhaXIgPSBuZXcKKwkJLy8gSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwKKwkJLy8gTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PihwcmV2UmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCksCisJCS8vIHByZXZSZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKSk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJpTGlzdCA9IHByZXZSZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2U+IHJpTWFwcGVyID0gbmV3IEhhc2hNYXA8PigpOworCQlpbnQgaW5zdGFuY2VOdW1iZXIgPSAwOworCQlsb25nIHRpbWVQcm9wZXJ0aWVzID0gMDsKKwkJaWYgKHJpTGlzdCAhPSBudWxsKSB7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIHJpIDogcmlMaXN0KSB7CisJCQkJaW5zdGFuY2VOdW1iZXIrKzsKKwkJCQlTdHJpbmcgb3JpZ1JpVW5pcXVlSUQgPSByaS5nZXRVbmlxdWVJZCgpOworCQkJCUVpdGhlcjxUaXRhblZlcnRleCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudElkVG8sIGNvbnRhaW5lck5vZGVUeXBlLCBTdHJpbmcudmFsdWVPZihpbnN0YW5jZU51bWJlciksIGZhbHNlLCByaSwgY29tcEluc3ROb2RlVHlwZSwgdHJ1ZSwgdHJ1ZSwgbWV0YWRhdGFWZXJ0ZXgpOworCQkJCWlmIChjcmVhdGVSZXNvdXJjZUluc3RhbmNlLmlzUmlnaHQoKSkgeworCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVJlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBjbG9uZSByZXNvdXJjZSBpbnN0YW5jZSB7fS4gc3RhdHVzID17fSIsIG9yaWdSaVVuaXF1ZUlELCBzdGF0dXMpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJfQorCQkJCVRpdGFuVmVydGV4IGNyZWF0ZWRJbnN0YW5jZSA9IGNyZWF0ZVJlc291cmNlSW5zdGFuY2UubGVmdCgpLnZhbHVlKCk7CisJCQkJU3RyaW5nIGNyZWF0ZWRJbnN0YW5jZUlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGNyZWF0ZWRJbnN0YW5jZSwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUFydGlmYWN0c1RvUmVzb3VyY2UgPSBjbG9uZVJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMoY3JlYXRlZEluc3RhbmNlLCByaSwgdGFyZ2V0TGlmZWN5Y2xlKTsKKwkJCQlpZiAoYXNzb2NpYXRlQXJ0aWZhY3RzVG9SZXNvdXJjZSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNsb25lIHJlc291cmNlIGluc3RhbmNlIHt9IGFydGlmYWN0cy4gZXJyb3Ige30gIiwgcmkuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYXNzb2NpYXRlQXJ0aWZhY3RzVG9SZXNvdXJjZS5uYW1lKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFzc29jaWF0ZUFydGlmYWN0c1RvUmVzb3VyY2UpOworCQkJCX0KKworCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZVByb3BlcnR5VmFsdWVzVG9SZXNvdXJjZSA9IGNsb25lUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5VmFsdWVzKGNyZWF0ZWRJbnN0YW5jZSwgcmksIGlucHV0c1Byb3BNYXAsIG5ld1Jlc291cmNlKTsKKwkJCQlpZiAoYXNzb2NpYXRlUHJvcGVydHlWYWx1ZXNUb1Jlc291cmNlICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY2xvbmUgcmVzb3VyY2UgaW5zdGFuY2Uge30gcHJvcGVydHkgdmFsdWVzLiBlcnJvciB7fSAiLCByaS5nZXROb3JtYWxpemVkTmFtZSgpLCBhc3NvY2lhdGVQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2UubmFtZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChhc3NvY2lhdGVQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2UpOworCQkJCX0KKwkJCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCXRpbWVQcm9wZXJ0aWVzICs9IChlbmQgLSBzdGFydCk7CisKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUF0dHJpYnV0ZVZhbHVlc1RvUmVzb3VyY2UgPSBjbG9uZVJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGVWYWx1ZXMoY3JlYXRlZEluc3RhbmNlLCByaSwgY3JlYXRlZEluc3RhbmNlSWQpOworCQkJCWlmIChhc3NvY2lhdGVBdHRyaWJ1dGVWYWx1ZXNUb1Jlc291cmNlICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gY2xvbmUgcmVzb3VyY2UgaW5zdGFuY2Uge30gYXR0cmlidXRlIHZhbHVlcy4gZXJyb3Ige30gIiwgcmkuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYXNzb2NpYXRlQXR0cmlidXRlVmFsdWVzVG9SZXNvdXJjZS5uYW1lKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFzc29jaWF0ZUF0dHJpYnV0ZVZhbHVlc1RvUmVzb3VyY2UpOworCQkJCX0KKworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlSW5wdXRWYWx1ZXNUb1Jlc291cmNlID0gY2xvbmVSZXNvdXJjZUluc3RhbmNlSW5wdXRzVmFsdWVzKGNyZWF0ZWRJbnN0YW5jZSwgcmksIGNyZWF0ZWRJbnN0YW5jZUlkLCBuZXdSZXNvdXJjZSwgbnVsbCk7CisJCQkJaWYgKGFzc29jaWF0ZUlucHV0VmFsdWVzVG9SZXNvdXJjZSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNsb25lIHJlc291cmNlIGluc3RhbmNlIHt9IHByb3BlcnR5IHZhbHVlcy4gZXJyb3Ige30gIiwgcmkuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgYXNzb2NpYXRlUHJvcGVydHlWYWx1ZXNUb1Jlc291cmNlLm5hbWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoYXNzb2NpYXRlUHJvcGVydHlWYWx1ZXNUb1Jlc291cmNlKTsKKwkJCQl9CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXMoY3JlYXRlZEluc3RhbmNlKTsKKwkJCQlDb21wb25lbnRJbnN0YW5jZURhdGEgY3JlYXRlZENvbXBvbmVudEluc3RhbmNlID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgcHJvcGVydGllcywgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJCQlDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVkUmVzb3VyY2VJbnN0YW5jZSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZShjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2UuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkpOworCQkJCXJpTWFwcGVyLnB1dChvcmlnUmlVbmlxdWVJRCwgY3JlYXRlZFJlc291cmNlSW5zdGFuY2UpOworCisJCQkJbGlzdC5hZGQoY3JlYXRlZFJlc291cmNlSW5zdGFuY2UpOworCQkJCW9sZENvbXBJbnN0VG9OZXcucHV0KG9yaWdSaVVuaXF1ZUlELCBjcmVhdGVkUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCX0KKwkJfQorCQlsb2cuaW5mbygiKioqKioqKioqKiogdG90YWwgcHJvcGVydGllcyBpbiBtcyB7fSIsIHRpbWVQcm9wZXJ0aWVzKTsKKworCQkvLyBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gcmVsYXRpb25zTGlzdCA9CisJCS8vIGluc3RhbmNlUmVsYXRpb25QYWlyLnJpZ2h0OworCQlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gcmVsYXRpb25zTGlzdCA9IHByZXZSZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKTsKKwkJaWYgKHJlbGF0aW9uc0xpc3QgIT0gbnVsbCkgeworCQkJZm9yIChSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVsYXRpb24gOiByZWxhdGlvbnNMaXN0KSB7CisJCQkJU3RyaW5nIG9yaWdGcm9tID0gcmVsYXRpb24uZ2V0RnJvbU5vZGUoKTsKKwkJCQlTdHJpbmcgb3JpZ1RvID0gcmVsYXRpb24uZ2V0VG9Ob2RlKCk7CisJCQkJcmVsYXRpb24uc2V0RnJvbU5vZGUocmlNYXBwZXIuZ2V0KG9yaWdGcm9tKS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlyZWxhdGlvbi5zZXRUb05vZGUocmlNYXBwZXIuZ2V0KG9yaWdUbykuZ2V0VW5pcXVlSWQoKSk7CisJCQkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMgPSByZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBzKCk7CisJCQkJZm9yIChSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcGFpciA6IHJlbGF0aW9uc2hpcHMpIHsKKwkJCQkJLy8gZm9yIGFsbCBhdG9taWMgcmVzb3VyY2UgaW5zdGFuY2VzIG5lZWQgdG8gdXBkYXRlIHRvCisJCQkJCS8vIHJlbGV2YW50CisJCQkJCS8vIG5ldyByaSBpZHMKKwkJCQkJU3RyaW5nIGNhcE93bmVySWQgPSBwYWlyLmdldENhcGFiaWxpdHlPd25lcklkKCk7CisJCQkJCVN0cmluZyByZXFPd25lcklkID0gcGFpci5nZXRSZXF1aXJlbWVudE93bmVySWQoKTsKKwkJCQkJaWYgKGlzQXRvbWljQ29tcG9uZW50SW5zdGFuY2UocmlNYXBwZXIuZ2V0KG9yaWdGcm9tKSkpIHsKKwkJCQkJCXJlcU93bmVySWQgPSByaU1hcHBlci5nZXQocmVxT3duZXJJZCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQkJfQorCQkJCQlpZiAoaXNBdG9taWNDb21wb25lbnRJbnN0YW5jZShyaU1hcHBlci5nZXQob3JpZ1RvKSkpIHsKKwkJCQkJCWNhcE93bmVySWQgPSByaU1hcHBlci5nZXQoY2FwT3duZXJJZCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQkJfQorCQkJCQlwYWlyLnNldFJlcXVpcmVtZW50T3duZXJJZChyZXFPd25lcklkKTsKKwkJCQkJcGFpci5zZXRDYXBhYmlsaXR5T3duZXJJZChjYXBPd25lcklkKTsKKwkJCQl9CisKKwkJCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVJbnN0YW5jZXMgPSBhc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhjb21wb25lbnRJZFRvLCBjb250YWluZXJOb2RlVHlwZSwgcmVsYXRpb24sIHRydWUpOworCQkJCWlmIChhc3NvY2lhdGVJbnN0YW5jZXMuaXNSaWdodCgpKSB7CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYXNzb2NpYXRlSW5zdGFuY2VzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gYXNzb3NpYXRlIHJlc291cmNlIGluc3RhbmNlIHt9IGFuZCByZXNvdXJjZSBpbnN0YW5jZSB7fS4gc3RhdHVzID17fSIsIHJlbGF0aW9uLmdldEZyb21Ob2RlKCksIHJlbGF0aW9uLmdldFRvTm9kZSgpLCBzdGF0dXMpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0F0b21pY0NvbXBvbmVudEluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlKSB7CisJCU9yaWdpblR5cGVFbnVtIG9yaWdpblR5cGUgPSBjb21wb25lbnRJbnN0YW5jZS5nZXRPcmlnaW5UeXBlKCk7CisJCWlmIChvcmlnaW5UeXBlLmVxdWFscyhPcmlnaW5UeXBlRW51bS5WRkMpIHx8IG9yaWdpblR5cGUuZXF1YWxzKE9yaWdpblR5cGVFbnVtLlZMKSB8fCBvcmlnaW5UeXBlLmVxdWFscyhPcmlnaW5UeXBlRW51bS5DUCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgY2xvbmVSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzKENvbXBvbmVudEluc3RhbmNlIHRvUmVzb3VyY2VJbnN0YW5jZSwgQ29tcG9uZW50SW5zdGFuY2UgZnJvbVJlc291cmNlSW5zdGFuY2UsIExpZmVjeWNsZVN0YXRlRW51bSB0YXJnZXRMaWZlY3ljbGUpIHsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QXJ0aWZhY3RzT2ZSSSA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0cyhmcm9tUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSwgdHJ1ZSk7CisJCWlmIChnZXRBcnRpZmFjdHNPZlJJLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRBcnRpZmFjdHNPZlJJLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCXN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBnZXRBcnRpZmFjdHNPZlJJLmxlZnQoKS52YWx1ZSgpOworCQlmb3IgKEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGFydGlmYWN0cy5lbnRyeVNldCgpKSB7CisKKwkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJLy8gVVM2ODcxMzUgRG8gbm90IEFkZCBWRl9NT0RVTEVTX01FVEFEQVRBIHdoZW4gY2hlY2tpbmcgb3V0CisJCQlpZiAoQXJ0aWZhY3RUeXBlRW51bS5WRl9NT0RVTEVTX01FVEFEQVRBLmdldFR5cGUoKS5lcXVhbHMoYXJ0aWZhY3REZWZpbml0aW9uLmdldEFydGlmYWN0VHlwZSgpKSkgeworCQkJCS8vIFRoZSBhcnRpZmFjdCBvZiB0eXBlIFZGX01PRFVMRVNfTUVUQURBVEEgc2hvdWxkIG5vdCBiZSBjbG9uZWQKKwkJCQkvLyB1bmxlc3Mgd2UgYXJlIGNoYW5naW5nIHRoZSBzdGF0ZSB0byBjZXJ0aWZpZWQuCisJCQkJaWYgKHRhcmdldExpZmVjeWNsZSAhPSBudWxsICYmIHRhcmdldExpZmVjeWNsZSAhPSBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEFyaWZhY3RUb1Jlc291cmNlID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3REZWZpbml0aW9uKTsKKworCQkJYWRkQXJpZmFjdFRvUmVzb3VyY2UgPSBhcnRpZmFjdE9wZXJhdGlvbi5hZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3REZWZpbml0aW9uLCB0b1Jlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsIGZhbHNlLCB0cnVlKTsKKworCQkJaWYgKGFkZEFyaWZhY3RUb1Jlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBhZGRBcmlmYWN0VG9SZXNvdXJjZS5yaWdodCgpLnZhbHVlKCk7CisJCQl9CisJCX0KKwkJdG9SZXNvdXJjZUluc3RhbmNlLnNldERlcGxveW1lbnRBcnRpZmFjdHMoYXJ0aWZhY3RzKTsKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNsb25lUmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cyhUaXRhblZlcnRleCB0b1Jlc291cmNlSW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlIGZyb21SZXNvdXJjZUluc3RhbmNlLCBMaWZlY3ljbGVTdGF0ZUVudW0gdGFyZ2V0TGlmZWN5Y2xlKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFRpdGFuVmVydGV4PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QXJ0aWZhY3RzT2ZSSSA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0c1ZlcnRlY2llcyhmcm9tUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSwgdHJ1ZSk7CisJCWlmIChnZXRBcnRpZmFjdHNPZlJJLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRBcnRpZmFjdHNPZlJJLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCXN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJTWFwPFN0cmluZywgVGl0YW5WZXJ0ZXg+IGFydGlmYWN0cyA9IGdldEFydGlmYWN0c09mUkkubGVmdCgpLnZhbHVlKCk7CisJCWZvciAoRW50cnk8U3RyaW5nLCBUaXRhblZlcnRleD4gZW50cnkgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCisJCQlUaXRhblZlcnRleCBhcnRpZmFjdFZlcnRleCA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkvLyBVUzY4NzEzNSBEbyBub3QgQWRkIFZGX01PRFVMRVNfTUVUQURBVEEgd2hlbiBjaGVja2luZyBvdXQKKwkJCVN0cmluZyBhcnRpZmFjdFR5cGUgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoYXJ0aWZhY3RWZXJ0ZXgsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVJUSUZBQ1RfVFlQRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCVN0cmluZyBsYWJlbCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShhcnRpZmFjdFZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5BUlRJRkFDVF9MQUJFTC5nZXRQcm9wZXJ0eSgpKTsKKwkJCWlmIChBcnRpZmFjdFR5cGVFbnVtLlZGX01PRFVMRVNfTUVUQURBVEEuZ2V0VHlwZSgpLmVxdWFscyhhcnRpZmFjdFR5cGUpKSB7CisJCQkJLy8gVGhlIGFydGlmYWN0IG9mIHR5cGUgVkZfTU9EVUxFU19NRVRBREFUQSBzaG91bGQgbm90IGJlIGNsb25lZAorCQkJCS8vIHVubGVzcyB3ZSBhcmUgY2hhbmdpbmcgdGhlIHN0YXRlIHRvIGNlcnRpZmllZC4KKwkJCQlpZiAodGFyZ2V0TGlmZWN5Y2xlICE9IG51bGwgJiYgdGFyZ2V0TGlmZWN5Y2xlICE9IExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZEFyaWZhY3RUb1Jlc291cmNlID0gYXJ0aWZhY3RPcGVyYXRpb24uYWRkQXJpZmFjdFRvQ29tcG9uZW50KGFydGlmYWN0VmVydGV4LCB0b1Jlc291cmNlSW5zdGFuY2UsIGxhYmVsKTsKKworCQkJaWYgKCFhZGRBcmlmYWN0VG9SZXNvdXJjZS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlyZXR1cm4gYWRkQXJpZmFjdFRvUmVzb3VyY2U7CisJCQl9CisJCX0KKwkJLy8gdG9SZXNvdXJjZUluc3RhbmNlLnNldERlcGxveW1lbnRBcnRpZmFjdHMoYXJ0aWZhY3RzKTsKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbmNyZWFzZUFuZEdldFJlc291cmNlSW5zdGFuY2VTcGVjaWZpY0NvdW50ZXIoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeSBjb3VudGVyVHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisKKwkJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJCWlmIChncmFwaFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4U2VydmljZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCWlmICh2ZXJ0ZXhTZXJ2aWNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGZldGNoIHZlcnRleCBvZiByZXNvdXJjZSBpbnN0YW5jZSBmb3IgaWQgPSB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdmVydGV4U2VydmljZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCQl9CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModmVydGV4U2VydmljZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJVmVydGV4IHZlcnRleCA9IHZlcnRleFNlcnZpY2UubGVmdCgpLnZhbHVlKCk7CisKKwkJCVZlcnRleFByb3BlcnR5PE9iamVjdD4gdmVydGV4UHJvcGVydHkgPSB2ZXJ0ZXgucHJvcGVydHkoY291bnRlclR5cGUuZ2V0UHJvcGVydHkoKSk7CisJCQlJbnRlZ2VyIGNvdW50ZXIgPSAwOworCQkJaWYgKHZlcnRleFByb3BlcnR5LmlzUHJlc2VudCgpKSB7CisJCQkJaWYgKHZlcnRleFByb3BlcnR5LnZhbHVlKCkgIT0gbnVsbCkgeworCQkJCQljb3VudGVyID0gKEludGVnZXIpIHZlcnRleFByb3BlcnR5LnZhbHVlKCk7CisJCQkJfQorCQkJfQorCisJCQljb3VudGVyKys7CisJCQl2ZXJ0ZXgucHJvcGVydHkoY291bnRlclR5cGUuZ2V0UHJvcGVydHkoKSwgY291bnRlcik7CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNvdW50ZXIpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoImluY3JlYXNlQW5kR2V0UmVzb3VyY2VJbnN0YW5jZVNwZWNpZmljQ291bnRlciBvcGVyYXRpb24gOiBHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoImluY3JlYXNlQW5kR2V0UmVzb3VyY2VJbnN0YW5jZVNwZWNpZmljQ291bnRlciBvcGVyYXRpb24gOiBHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbmNyZWFzZUFuZEdldFJlc291cmNlSW5zdGFuY2VTcGVjaWZpY0NvdW50ZXIoVGl0YW5WZXJ0ZXggcmVzb3VyY2VJbnN0YW5jZVZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeSBjb3VudGVyVHlwZSkgeworCisJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCVZlcnRleFByb3BlcnR5PE9iamVjdD4gdmVydGV4UHJvcGVydHkgPSByZXNvdXJjZUluc3RhbmNlVmVydGV4LnByb3BlcnR5KGNvdW50ZXJUeXBlLmdldFByb3BlcnR5KCkpOworCQlJbnRlZ2VyIGNvdW50ZXIgPSAwOworCQlpZiAodmVydGV4UHJvcGVydHkuaXNQcmVzZW50KCkpIHsKKwkJCWlmICh2ZXJ0ZXhQcm9wZXJ0eS52YWx1ZSgpICE9IG51bGwpIHsKKwkJCQljb3VudGVyID0gKEludGVnZXIpIHZlcnRleFByb3BlcnR5LnZhbHVlKCk7CisJCQl9CisJCX0KKwkJY291bnRlcisrOworCQlyZXNvdXJjZUluc3RhbmNlVmVydGV4LnByb3BlcnR5KGNvdW50ZXJUeXBlLmdldFByb3BlcnR5KCksIGNvdW50ZXIpOworCisJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNvdW50ZXIpOworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbENvbXBvbmVudEluc3RhbmNlc05hbWVzKFN0cmluZyBzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzSW5zdGFuY2VzT2ZTZXJ2aWNlID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VzTmFtZU9mU2VydmljZShzZXJ2aWNlSWQsIG5vZGVUeXBlKTsKKworCQkJbG9nLmRlYnVnKCJBZnRlciBmZXRjaGluZyByZXNvdXJjZSBpbnN0YW5jZXMgb2Ygc2VydmljZSB7fS4gUmVzdWx0IGlzIHt9Iiwgc2VydmljZUlkLCByZXNJbnN0YW5jZXNPZlNlcnZpY2UpOworCQkJaWYgKHJlc0luc3RhbmNlc09mU2VydmljZS5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXNJbnN0YW5jZXNPZlNlcnZpY2UucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgcmVzb3VyY2UgaW5zdGFuY2VzIG9mIHNlcnZpY2Uge30uIFN0YXR1cyBpcyB7fSIsIHNlcnZpY2VJZCwgc3RhdHVzKTsKKwkJCQl9CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gcmVzSW5zdGFuY2VzT2ZTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpOworCisJCQlpZiAobmFtZXMgPT0gbnVsbCB8fCBuYW1lcy5pc0VtcHR5KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQobmFtZXMpOworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWNvbW1pdE9yUm9sbGJhY2socmVzdWx0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8U3RyaW5nPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEluc3RhbmNlc05hbWVPZlNlcnZpY2UoU3RyaW5nIHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJTGlzdDxTdHJpbmc+IHJlc291cmNlc0luc3RhbnNlTmFtZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluc3RhbmNlc1JlcyA9IGdldEFsbENvbXBvbmVudEluc3RhbmNlRnJvbUdyYXBoKHNlcnZpY2VJZCwgbm9kZVR5cGUsIGZhbHNlKTsKKwkJaWYgKHJlc291cmNlSW5zdGFuY2VzUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmVzb3VyY2VJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJSZXNvdXJjZSBpbnN0YW5jZSB3YXMgZm91bmQgdW5kZXIgc2VydmljZSB7fS4gU3RhdHVzIGlzIHt9Iiwgc2VydmljZUlkLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPj4gcmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZUluc3RhbmNlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHJlc291cmNlSW5zdGFuY2VzICE9IG51bGwgJiYgZmFsc2UgPT0gcmVzb3VyY2VJbnN0YW5jZXMuaXNFbXB0eSgpKSB7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA6IHJlc291cmNlSW5zdGFuY2VzKSB7CisJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhIHJlc291cmNlSW5zdGFuY2VEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGZldGNoIHRoZSByZWxhdGlvbnNoaXBzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9IiwgcmVzb3VyY2VJbnN0YW5jZURhdGEpOworCQkJCXJlc291cmNlc0luc3RhbnNlTmFtZS5hZGQocmVzb3VyY2VJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKKworCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlc0luc3RhbnNlTmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbENvbXBvbmVudEluc3RhbmNlc05hbWVzKFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJcmV0dXJuIGdldEFsbENvbXBvbmVudEluc3RhbmNlc05hbWVzKGNvbXBvbmVudElkLCBub2RlVHlwZSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlSW5zdGFuY2VCeUlkKFN0cmluZyByZXNvdXJjZUlkKSB7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluc3RhbmNlRGF0YSA9IGZpbmRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSWQpOworCisJCWlmIChyZXNvdXJjZUluc3RhbmNlRGF0YS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZXNvdXJjZUluc3RhbmNlRGF0YS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChuZXcgQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZURhdGEubGVmdCgpLnZhbHVlKCkuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkpKTsKKworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzZXRDb21wSW5zdERlcGxveW1lbnRBcnRpZmFjdHNGcm9tR3JhcGgoTWFwPFN0cmluZywgTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPj4gcmVzb3VyY2VzQXJ0aWZhY3RzLCBTdHJpbmcgdW5pcXVlSWQsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKworCQlpZiAocmVzb3VyY2VzQXJ0aWZhY3RzLmNvbnRhaW5zS2V5KHVuaXF1ZUlkKSkgeworCQkJcmVzb3VyY2VJbnN0YW5jZS5zZXREZXBsb3ltZW50QXJ0aWZhY3RzKHJlc291cmNlc0FydGlmYWN0cy5nZXQodW5pcXVlSWQpKTsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0cyh1bmlxdWVJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5nZXRUeXBlKCkpOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldHVybiBzdGF0dXM7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJfQorCQl9CisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQlpZiAoIWFydGlmYWN0cy5pc0VtcHR5KCkpIHsKKwkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gdGVtcEFydGlmYWN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPihhcnRpZmFjdHMpOworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3QgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJCWlmICghYXJ0aWZhY3QuZ2V0VmFsdWUoKS5jaGVja0VzSWRFeGlzdCgpKSB7CisJCQkJCXRlbXBBcnRpZmFjdHMucmVtb3ZlKGFydGlmYWN0LmdldEtleSgpKTsKKwkJCQl9CisJCQl9CisJCQlyZXNvdXJjZUluc3RhbmNlLnNldERlcGxveW1lbnRBcnRpZmFjdHModGVtcEFydGlmYWN0cyk7CisJCQlyZXNvdXJjZXNBcnRpZmFjdHMucHV0KHVuaXF1ZUlkLCB0ZW1wQXJ0aWZhY3RzKTsKKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldENvbXBJbnN0Q2FwYWJpbGl0aWVzRnJvbUdyYXBoKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPj4gcmVzb3VyY2VzQ2FwYWJpbGl0aWVzLCBDb21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gY29tcEluc3RUeXBlLCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlLAorCQkJTGlzdDxTdHJpbmc+IHJlc3BvdXJjZURlcml2ZWRMaXN0KSB7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXM7CisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29tcEluc3RUeXBlKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckNhcGFiaWxpdGllcyA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRDYXBhYmlsaXRpZXMoY29tcG9uZW50LCBjb21wSW5zdFR5cGUsIHRydWUpOworCQlpZiAoZWl0aGVyQ2FwYWJpbGl0aWVzLmlzTGVmdCgpKSB7CisJCQlzdGF0dXMgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllcyA9IGVpdGhlckNhcGFiaWxpdGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCAmJiAhY2FwYWJpbGl0aWVzLmlzRW1wdHkoKSkgeworCQkJCWNhcGFiaWxpdGllcy5mb3JFYWNoKCh0eXBlLCBsaXN0KSAtPiB7CisJCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7CisJCQkJCQlsaXN0LmZvckVhY2goKGNhcGFiaWxpdHkpIC0+IHsKKwkJCQkJCQkvLyBXZSB3YW50IHRvIHNldCBvd25lcklkIG9ubHkgZm9yIGluc3RhbmNlcyBjb21pbmcKKwkJCQkJCQkvLyBmcm9tIGF0b21pYyByZXNvdXJjZXMsIG90aGVyd2lzZSB3ZSBkb24ndCB3YW50CisJCQkJCQkJLy8gdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvd25lcklkIG9mIHVuZGVybHlpbmcKKwkJCQkJCQkvLyBjb21wb25lbnQgaW5zdGFuY2VzCisJCQkJCQkJaWYgKGlzQXRvbWljUmVzb3VyY2UoY29tcG9uZW50KSkgeworCQkJCQkJCQljYXBhYmlsaXR5LnNldE93bmVySWQocmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCQkJY2FwYWJpbGl0eS5zZXRPd25lck5hbWUocmVzb3VyY2VJbnN0YW5jZS5nZXROYW1lKCkpOworCQkJCQkJCQljYXBhYmlsaXR5LnNldENhcGFiaWxpdHlTb3VyY2VzKHJlc3BvdXJjZURlcml2ZWRMaXN0KTsKKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJfQorCQkJCX0pOworCQkJCXJlc291cmNlSW5zdGFuY2Uuc2V0Q2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzZXRDb21wSW5zdFJlcXVpcmVtZW50c0Zyb21HcmFwaChNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+PiByZXNvdXJjZXNSZXEsIENvbXBvbmVudCBjb21wb25lbnQsIE5vZGVUeXBlRW51bSBjb21wSW5zdFR5cGUsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXM7CisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24oY29tcEluc3RUeXBlKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDYXBhYmlsaXRpZXMgPSBjb21wb25lbnRPcGVyYXRpb24uZ2V0UmVxdWlyZW1lbnRzKGNvbXBvbmVudCwgY29tcEluc3RUeXBlLCB0cnVlKTsKKwkJaWYgKGVpdGhlckNhcGFiaWxpdGllcy5pc0xlZnQoKSkgeworCQkJc3RhdHVzID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzID0gZWl0aGVyQ2FwYWJpbGl0aWVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJlcXVpcmVtZW50cyAhPSBudWxsICYmICFyZXF1aXJlbWVudHMuaXNFbXB0eSgpKSB7CisJCQkJLy8gV2Ugd2FudCB0byBzZXQgb3duZXJJZCBvbmx5IGZvciBpbnN0YW5jZXMgY29taW5nIGZyb20gYXRvbWljCisJCQkJLy8gcmVzb3VyY2VzLCBvdGhlcndpc2Ugd2UgZG9uJ3Qgd2FudAorCQkJCS8vIHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3Rpbmcgb3duZXJJZCBvZiB1bmRlcmx5aW5nIGNvbXBvbmVudAorCQkJCS8vIGluc3RhbmNlcworCQkJCWlmIChpc0F0b21pY1Jlc291cmNlKGNvbXBvbmVudCkpIHsKKwkJCQkJcmVxdWlyZW1lbnRzLmZvckVhY2goKHR5cGUsIGxpc3QpIC0+IHsKKwkJCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7CisJCQkJCQkJbGlzdC5mb3JFYWNoKChyZXF1aXJlbWVudCkgLT4geworCQkJCQkJCQlyZXF1aXJlbWVudC5zZXRPd25lcklkKHJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCQkJCXJlcXVpcmVtZW50LnNldE93bmVyTmFtZShyZXNvdXJjZUluc3RhbmNlLmdldE5hbWUoKSk7CisJCQkJCQkJfSk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCQlyZXNvdXJjZUluc3RhbmNlLnNldFJlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdHVzID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0aWVzKENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0YW5jZSwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCisJCURhdGFOb2RlQ29sbGVjdG9yPENhcGFiaWxpdHlEYXRhPiBjb2xsZWN0b3IgPSAoKSAtPiB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZUVudW0pLCBjb21wSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkNBTENVTEFURURfQ0FQQUJJTElUWSwgTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHksCisJCQkJQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCisJCXJldHVybiBnZXREYXRhRnJvbUdyYXBoKGNvbGxlY3Rvcik7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UmVxdWlyZW1lbnRzKENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0YW5jZSwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCisJCURhdGFOb2RlQ29sbGVjdG9yPFJlcXVpcmVtZW50RGF0YT4gY29sbGVjdG9yID0gKCkgLT4gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGVFbnVtKSwgY29tcEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX1JFUVVJUkVNRU5ULCBOb2RlVHlwZUVudW0uUmVxdWlyZW1lbnQsCisJCQkJUmVxdWlyZW1lbnREYXRhLmNsYXNzKTsKKworCQlyZXR1cm4gZ2V0RGF0YUZyb21HcmFwaChjb2xsZWN0b3IpOworCisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0F2YWlsYWJsZVJlcXVpcmVtZW50KENvbXBvbmVudEluc3RhbmNlIGZyb21SZXNJbnN0YW5jZSwgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uUGFpcikgeworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmcm9tUmkgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0VmVydGV4QnlQcm9wZXJ0eShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIGZyb21SZXNJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJaWYgKGZyb21SaS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGNvbXBvbmVudCBpbnN0YW5jZSB7fSAgZXJyb3Ige30iLCBmcm9tUmVzSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgZnJvbVJpLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlJdGVyYXRvcjxFZGdlPiBlZGdlSXRlciA9IGZyb21SaS5sZWZ0KCkudmFsdWUoKS5lZGdlcyhEaXJlY3Rpb24uT1VULCBHcmFwaEVkZ2VMYWJlbHMuQ0FMQ1VMQVRFRF9SRVFVSVJFTUVOVC5uYW1lKCkpOworCQlpZiAoZWRnZUl0ZXIgPT0gbnVsbCB8fCAhZWRnZUl0ZXIuaGFzTmV4dCgpKSB7CisJCQlsb2cuZGVidWcoIk5vIGF2YWlsYWJsZSBDQUxDVUxBVEVEX1JFUVVJUkVNRU5UIGVkZ2VzLiBBbGwgZnVsbCBmaWxsZWQgZm9yIFJJIHt9IiwgZnJvbVJlc0luc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJfQorCQlib29sZWFuIGV4aXN0ID0gZmFsc2U7CisJCXdoaWxlIChlZGdlSXRlci5oYXNOZXh0KCkpIHsKKwkJCUVkZ2UgZWRnZSA9IGVkZ2VJdGVyLm5leHQoKTsKKwkJCVRpdGFuVmVydGV4IHJlcVZlcnRleCA9IChUaXRhblZlcnRleCkgZWRnZS5pblZlcnRleCgpOworCQkJU3RyaW5nIHJlcUlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KHJlcVZlcnRleCwgVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlcXVpcmVtZW50KSk7CisJCQlpZiAocmVxSWQuZXF1YWxzKHJlbGF0aW9uUGFpci5nZXRSZXF1aXJlbWVudFVpZCgpKSkgeworCQkJCVN0cmluZyBvd25lcklkT25FZGdlID0gKFN0cmluZykgZWRnZS52YWx1ZShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5PV05FUl9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlpZiAob3duZXJJZE9uRWRnZS5lcXVhbHMocmVsYXRpb25QYWlyLmdldFJlcXVpcmVtZW50T3duZXJJZCgpKSkgeworCQkJCQlTdHJpbmcgbGVmdE9jY3VycmVuY2VzID0gKFN0cmluZykgZWRnZS52YWx1ZShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5MRUZUX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpOworCQkJCQlpZiAobGVmdE9jY3VycmVuY2VzICE9IG51bGwgJiYgIWxlZnRPY2N1cnJlbmNlcy5lcXVhbHMoUmVxdWlyZW1lbnREYXRhLk1BWF9PQ0NVUlJFTkNFUykpIHsKKwkJCQkJCUludGVnZXIgbGVmdEludFZhbHVlID0gSW50ZWdlci5wYXJzZUludChsZWZ0T2NjdXJyZW5jZXMpOworCQkJCQkJaWYgKGxlZnRJbnRWYWx1ZSA+IDApIHsKKwkJCQkJCQlleGlzdCA9IHRydWU7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlleGlzdCA9IHRydWU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChleGlzdCk7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0F2YWlsYWJsZUNhcGFiaWx0eShDb21wb25lbnRJbnN0YW5jZSB0b1Jlc0luc3RhbmNlLCBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25QYWlyKSB7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZyb21SaSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgdG9SZXNJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJaWYgKGZyb21SaS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGNvbXBvbmVudCBpbnN0YW5jZSB7fS4gRXJyb3I6IHt9IiwgdG9SZXNJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBmcm9tUmkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisJCUl0ZXJhdG9yPEVkZ2U+IGVkZ2VJdGVyID0gZnJvbVJpLmxlZnQoKS52YWx1ZSgpLmVkZ2VzKERpcmVjdGlvbi5PVVQsIEdyYXBoRWRnZUxhYmVscy5DQUxDVUxBVEVEX0NBUEFCSUxJVFkubmFtZSgpKTsKKwkJaWYgKGVkZ2VJdGVyID09IG51bGwgfHwgIWVkZ2VJdGVyLmhhc05leHQoKSkgeworCQkJbG9nLmRlYnVnKCJObyBhdmFpbGFibGUgQ0FMQ1VMQVRFRF9DQVBBQklMSVRZIGVkZ2VzLiBBbGwgZnVsbCBmaWxsZWQgZm9yIFJJIHt9IiwgdG9SZXNJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisJCWJvb2xlYW4gZXhpc3QgPSBmYWxzZTsKKwkJd2hpbGUgKGVkZ2VJdGVyLmhhc05leHQoKSkgeworCQkJRWRnZSBlZGdlID0gZWRnZUl0ZXIubmV4dCgpOworCQkJVGl0YW5WZXJ0ZXggcmVxVmVydGV4ID0gKFRpdGFuVmVydGV4KSBlZGdlLmluVmVydGV4KCk7CisJCQlTdHJpbmcgY2FwSWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkocmVxVmVydGV4LCBVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSkpOworCQkJaWYgKGNhcElkLmVxdWFscyhyZWxhdGlvblBhaXIuZ2V0Q2FwYWJpbGl0eVVpZCgpKSkgeworCQkJCVN0cmluZyBvd25lcklkT25FZGdlID0gKFN0cmluZykgZWRnZS52YWx1ZShHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5PV05FUl9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlpZiAob3duZXJJZE9uRWRnZS5lcXVhbHMocmVsYXRpb25QYWlyLmdldENhcGFiaWxpdHlPd25lcklkKCkpKSB7CisJCQkJCVN0cmluZyBsZWZ0T2NjdXJyZW5jZXMgPSAoU3RyaW5nKSBlZGdlLnZhbHVlKEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LkxFRlRfT0NDVVJSRU5DRVMuZ2V0UHJvcGVydHkoKSk7CisJCQkJCWlmIChsZWZ0T2NjdXJyZW5jZXMgIT0gbnVsbCAmJiAhbGVmdE9jY3VycmVuY2VzLmVxdWFscyhDYXBhYmlsaXR5RGF0YS5NQVhfT0NDVVJSRU5DRVMpKSB7CisJCQkJCQlJbnRlZ2VyIGxlZnRJbnRWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQobGVmdE9jY3VycmVuY2VzKTsKKwkJCQkJCWlmIChsZWZ0SW50VmFsdWUgPiAwKSB7CisJCQkJCQkJZXhpc3QgPSB0cnVlOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJZXhpc3QgPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZXhpc3QpOworCX0KKworCWludGVyZmFjZSBEYXRhTm9kZUNvbGxlY3RvcjxEYXRhPiB7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhTm9kZXMoKTsKKwl9CisKKwlwdWJsaWMgPERhdGE+IEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhRnJvbUdyYXBoKERhdGFOb2RlQ29sbGVjdG9yPERhdGE+IGRhdGFDb2xsZWN0b3IpIHsKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclJldDsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5Ob2RlcyA9IGRhdGFDb2xsZWN0b3IuZ2V0RGF0YU5vZGVzKCk7CisKKwkJaWYgKGNoaWxkcmVuTm9kZXMuaXNMZWZ0KCkpIHsKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxEYXRhLCBHcmFwaEVkZ2U+PiBjb2xsZWN0ZWREYXRhID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKS5zdHJlYW0oKS5tYXAoZWxlbWVudCAtPiBuZXcgSW1tdXRhYmxlUGFpcjxEYXRhLCBHcmFwaEVkZ2U+KGVsZW1lbnQuZ2V0TGVmdCgpLCBlbGVtZW50LmdldFJpZ2h0KCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJZWl0aGVyUmV0ID0gRWl0aGVyLmxlZnQoY29sbGVjdGVkRGF0YSk7CisJCX0gZWxzZSB7CisJCQllaXRoZXJSZXQgPSBFaXRoZXIucmlnaHQoY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBlaXRoZXJSZXQ7CisJfQorCisJcHVibGljIENvbXBvbmVudE9wZXJhdGlvbiBnZXRDb21wb25lbnRPcGVyYXRpb24oTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHsKKwkJaWYgKE5vZGVUeXBlRW51bS5TZXJ2aWNlID09IGNvbXBvbmVudFR5cGUpIHsKKwkJCXJldHVybiBzZXJ2aWNlT3BlcmF0aW9uOworCQl9IGVsc2UgaWYgKE5vZGVUeXBlRW51bS5SZXNvdXJjZSA9PSBjb21wb25lbnRUeXBlKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VPcGVyYXRpb247CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzQXRvbWljUmVzb3VyY2UoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQkvLyB0cnVlIGlmIGNvbXBvbmVudCBpcyBvZiB0eXBlIFZML0NQL1ZGQworCQlib29sZWFuIGlzRnJvbUF0b21pY1Jlc291cmNlID0gKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkgPT0gQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UgJiYgKChSZXNvdXJjZSkgY29tcG9uZW50KS5nZXRSZXNvdXJjZVR5cGUoKSAhPSBSZXNvdXJjZVR5cGVFbnVtLlZGKTsKKwkJcmV0dXJuIGlzRnJvbUF0b21pY1Jlc291cmNlOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjbG9uZVJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGVWYWx1ZXMoQ29tcG9uZW50SW5zdGFuY2UgY3JlYXRlZEluc3RhbmNlLCBDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlKSB7CisJCVdyYXBwZXI8U3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RvcmFnZVN0YXR1c1dyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVdyYXBwZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4+IGNvbXBJbnN0YW5jZUF0dExpc3QgPSBuZXcgV3JhcHBlcjw+KCk7CisKKwkJZmluZEFsbEF0dHJpYnV0ZXNPZlJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZSwgY29tcEluc3RhbmNlQXR0TGlzdCwgc3RvcmFnZVN0YXR1c1dyYXBwZXIpOworCisJCWlmIChzdG9yYWdlU3RhdHVzV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlTGlzdE5vdEVtcHR5KHN0b3JhZ2VTdGF0dXNXcmFwcGVyLCBjb21wSW5zdGFuY2VBdHRMaXN0LmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCisJCWlmIChzdG9yYWdlU3RhdHVzV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNPbkluc3RhbmNlID0gY29tcEluc3RhbmNlQXR0TGlzdC5nZXRJbm5lckVsZW1lbnQoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc09uSW5zdGFuY2Uuc2l6ZSgpICYmIHN0b3JhZ2VTdGF0dXNXcmFwcGVyLmlzRW1wdHkoKTsgaSsrKSB7CisJCQkJY2xvbmVTaW5nbGVBdHRyaWJ1dGVPblJlc291cmNlSW5zdGFuY2UoY3JlYXRlZEluc3RhbmNlLCBhdHRyaWJ1dGVzT25JbnN0YW5jZS5nZXQoaSksIHN0b3JhZ2VTdGF0dXNXcmFwcGVyKTsKKwkJCX0KKwkJfQorCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gc3RvcmFnZVN0YXR1c1dyYXBwZXIuaXNFbXB0eSgpID8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyA6IHN0b3JhZ2VTdGF0dXNXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNsb25lUmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZVZhbHVlcyhUaXRhblZlcnRleCBjcmVhdGVkSW5zdGFuY2VWZXJ0ZXgsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UsIFN0cmluZyBpbnN0YW5jZUlkKSB7CisJCVdyYXBwZXI8U3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RvcmFnZVN0YXR1c1dyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCVdyYXBwZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZT4+IGNvbXBJbnN0YW5jZUF0dExpc3QgPSBuZXcgV3JhcHBlcjw+KCk7CisKKwkJZmluZEFsbEF0dHJpYnV0ZXNPZlJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZSwgY29tcEluc3RhbmNlQXR0TGlzdCwgc3RvcmFnZVN0YXR1c1dyYXBwZXIpOworCisJCWlmIChzdG9yYWdlU3RhdHVzV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXZhbGlkYXRlTGlzdE5vdEVtcHR5KHN0b3JhZ2VTdGF0dXNXcmFwcGVyLCBjb21wSW5zdGFuY2VBdHRMaXN0LmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCisJCWlmIChzdG9yYWdlU3RhdHVzV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNPbkluc3RhbmNlID0gY29tcEluc3RhbmNlQXR0TGlzdC5nZXRJbm5lckVsZW1lbnQoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc09uSW5zdGFuY2Uuc2l6ZSgpICYmIHN0b3JhZ2VTdGF0dXNXcmFwcGVyLmlzRW1wdHkoKTsgaSsrKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBjbG9uZVNpbmdsZUF0dHJpYnV0ZU9uUmVzb3VyY2VJbnN0YW5jZShjcmVhdGVkSW5zdGFuY2VWZXJ0ZXgsIGF0dHJpYnV0ZXNPbkluc3RhbmNlLmdldChpKSwgaW5zdGFuY2VJZCk7CisJCQkJaWYgKCFyZXN1bHQuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWxvZy50cmFjZSgiRmFpbGVkIHRvIGNsb25lIGF0dHJpYnV0ZSBmb3IgaW5zdGFuY2Uge30gZXJyb3Ige30iLCBpbnN0YW5jZUlkLCByZXN1bHQpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gc3RvcmFnZVN0YXR1c1dyYXBwZXIuaXNFbXB0eSgpID8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyA6IHN0b3JhZ2VTdGF0dXNXcmFwcGVyLmdldElubmVyRWxlbWVudCgpOworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHJpdmF0ZSA8VD4gdm9pZCB2YWxpZGF0ZUxpc3ROb3RFbXB0eShXcmFwcGVyPFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0b3JhZ2VTdGF0dXNXcmFwcGVyLCBMaXN0PFQ+IGF0dHJpYnV0ZXNPbkluc3RhbmNlKSB7CisJCWlmIChhdHRyaWJ1dGVzT25JbnN0YW5jZSA9PSBudWxsIHx8IGF0dHJpYnV0ZXNPbkluc3RhbmNlLmlzRW1wdHkoKSA9PSB0cnVlKSB7CisJCQlzdG9yYWdlU3RhdHVzV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZmluZEFsbEF0dHJpYnV0ZXNPZlJlc291cmNlSW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSwgV3JhcHBlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPj4gY29tcEluc3RhbmNlQXR0TGlzdCwgV3JhcHBlcjxTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdG9yYWdlU3RhdHVzV3JhcHBlcikgeworCisJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbEF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVPcGVyYXRpb24uZ2V0QWxsQXR0cmlidXRlc09mUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlKTsKKwkJaWYgKGFsbEF0dHJpYnV0ZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxBdHRyaWJ1dGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cyk7CisJCQlzdG9yYWdlU3RhdHVzV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoc3RvcmFnZVN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQljb21wSW5zdGFuY2VBdHRMaXN0LnNldElubmVyRWxlbWVudChhbGxBdHRyaWJ1dGVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjbG9uZVNpbmdsZUF0dHJpYnV0ZU9uUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZSBjcmVhdGVkSW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGF0dHJpYnV0ZSwgV3JhcHBlcjxTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdG9yYWdlU3RhdHVzV3JhcHBlcikgeworCQkvLyBPbmx5IGlmIHZhbHVlVW5pcXVlSWQgaXMgbm90IGVtcHR5LCB0aGVuIGl0cyBiZWxvbmdzIHRvIHRoZQorCQkvLyBpbnN0YW5jZQorCQlpZiAoYXR0cmlidXRlLmdldFZhbHVlVW5pcXVlVWlkKCkgIT0gbnVsbCkgeworCQkJYXR0cmlidXRlLnNldFZhbHVlVW5pcXVlVWlkKG51bGwpOworCQkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvdW50ZXJSZXMgPSBpbmNyZWFzZUFuZEdldFJlc291cmNlSW5zdGFuY2VTcGVjaWZpY0NvdW50ZXIoY3JlYXRlZEluc3RhbmNlLmdldFVuaXF1ZUlkKCksIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQVRUUklCVVRFX0NPVU5URVIsIHRydWUpOworCQkJaWYgKGNvdW50ZXJSZXMuaXNSaWdodCgpKSB7CisJCQkJc3RvcmFnZVN0YXR1c1dyYXBwZXIuc2V0SW5uZXJFbGVtZW50KGNvdW50ZXJSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJRWl0aGVyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEF0dHJpYnV0ZVRvUmVzb3VyY2VJbnN0YW5jZSA9IGFkZEF0dHJpYnV0ZVRvUmVzb3VyY2VJbnN0YW5jZShhdHRyaWJ1dGUsIGNyZWF0ZWRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBjb3VudGVyUmVzLmxlZnQoKS52YWx1ZSgpKTsKKworCQkJCWlmIChhZGRBdHRyaWJ1dGVUb1Jlc291cmNlSW5zdGFuY2UuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZEF0dHJpYnV0ZVRvUmVzb3VyY2VJbnN0YW5jZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCQkJc3RvcmFnZVN0YXR1c1dyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHN0b3JhZ2VTdGF0dXMpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNsb25lU2luZ2xlQXR0cmlidXRlT25SZXNvdXJjZUluc3RhbmNlKFRpdGFuVmVydGV4IGNyZWF0ZWRJbnN0YW5jZVZlcnRleCwgQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgaW5zdGFuY2VJZCkgeworCQkvLyBPbmx5IGlmIHZhbHVlVW5pcXVlSWQgaXMgbm90IGVtcHR5LCB0aGVuIGl0cyBiZWxvbmdzIHRvIHRoZQorCQkvLyBpbnN0YW5jZQorCQlpZiAoYXR0cmlidXRlLmdldFZhbHVlVW5pcXVlVWlkKCkgIT0gbnVsbCkgeworCQkJYXR0cmlidXRlLnNldFZhbHVlVW5pcXVlVWlkKG51bGwpOworCQkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvdW50ZXJSZXMgPSBpbmNyZWFzZUFuZEdldFJlc291cmNlSW5zdGFuY2VTcGVjaWZpY0NvdW50ZXIoY3JlYXRlZEluc3RhbmNlVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFUVFJJQlVURV9DT1VOVEVSKTsKKwkJCWlmIChjb3VudGVyUmVzLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBjb3VudGVyUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0gZWxzZSB7CisJCQkJRWl0aGVyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEF0dHJpYnV0ZVRvUmVzb3VyY2VJbnN0YW5jZSA9IGFkZEF0dHJpYnV0ZVRvUmVzb3VyY2VJbnN0YW5jZShhdHRyaWJ1dGUsIGluc3RhbmNlSWQsIGNvdW50ZXJSZXMubGVmdCgpLnZhbHVlKCkpOworCisJCQkJaWYgKGFkZEF0dHJpYnV0ZVRvUmVzb3VyY2VJbnN0YW5jZS5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkQXR0cmlidXRlVG9SZXNvdXJjZUluc3RhbmNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlU3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpOworCQkJCQlyZXR1cm4gc3RvcmFnZVN0YXR1czsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgY29ubmVjdEF0dFZhbHVlRGF0YVRvQ29tcG9uZW50SW5zdGFuY2VEYXRhKFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciwgQ29tcG9uZW50SW5zdGFuY2VEYXRhIGNvbXBJbnMsIEF0dHJpYnV0ZVZhbHVlRGF0YSBhdHRWYWx1ZURhdGEpIHsKKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihjb21wSW5zLCBhdHRWYWx1ZURhdGEsIEdyYXBoRWRnZUxhYmVscy5BVFRSSUJVVEVfVkFMVUUsIG51bGwpOworCisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVSZWxSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChvcGVyYXRpb25TdGF0dXMpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJjb25uZWN0QXR0VmFsdWVEYXRhVG9Db21wb25lbnRJbnN0YW5jZURhdGEiLAorCQkJCQkiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSBpbnN0YW5jZSAiICsgY29tcElucy5nZXRVbmlxdWVJZCgpICsgIiBhdHRyaWJ1dGUgdmFsdWUgIiArIGF0dFZhbHVlRGF0YS5nZXRVbmlxdWVJZCgpICsgIiBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXMsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbm5lY3RJbnB1dFZhbHVlRGF0YVRvQ29tcG9uZW50SW5zdGFuY2VEYXRhKFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciwgQ29tcG9uZW50SW5zdGFuY2VEYXRhIGNvbXBJbnMsIElucHV0VmFsdWVEYXRhIGF0dFZhbHVlRGF0YSkgeworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNvbXBJbnMsIGF0dFZhbHVlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOUFVUX1ZBTFVFLCBudWxsKTsKKworCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQob3BlcmF0aW9uU3RhdHVzKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiY29ubmVjdElucHV0VmFsdWVEYXRhVG9Db21wb25lbnRJbnN0YW5jZURhdGEiLAorCQkJCQkiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSBpbnN0YW5jZSAiICsgY29tcElucy5nZXRVbmlxdWVJZCgpICsgIiBpbnB1dCB2YWx1ZSAiICsgYXR0VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCkgKyAiIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cywgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY29ubmVjdEF0dFZhbHVlRGF0YVRvQXR0RGF0YShXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIsIEF0dHJpYnV0ZURhdGEgYXR0RGF0YSwgQXR0cmlidXRlVmFsdWVEYXRhIGF0dFZhbHVlRGF0YSkgeworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGF0dFZhbHVlRGF0YSwgYXR0RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkFUVFJJQlVURV9JTVBMLCBudWxsKTsKKworCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiY29ubmVjdEF0dFZhbHVlRGF0YVRvQXR0RGF0YSIsCisJCQkJCSJGYWlsZWQgdG8gYXNzb2NpYXRlIGF0dHJpYnV0ZSB2YWx1ZSAiICsgYXR0VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCkgKyAiIHRvIGF0dHJpYnV0ZSAiICsgYXR0RGF0YS5nZXRVbmlxdWVJZCgpICsgIiBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXMsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY29ubmVjdElucHV0VmFsdWVEYXRhVG9JbnB1dERhdGEoV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyLCBJbnB1dHNEYXRhIGF0dERhdGEsIElucHV0VmFsdWVEYXRhIGF0dFZhbHVlRGF0YSkgeworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGF0dFZhbHVlRGF0YSwgYXR0RGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOUFVUX0lNUEwsIG51bGwpOworCisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVSZWxSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJjb25uZWN0SW5wdXRWYWx1ZURhdGFUb0lucHV0RGF0YSIsICJGYWlsZWQgdG8gYXNzb2NpYXRlIGlucHV0IHZhbHVlICIgKyBhdHRWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKSArICIgdG8gaW5wdXQgIiArIGF0dERhdGEuZ2V0VW5pcXVlSWQoKSArICIgaW4gZ3JhcGguIHN0YXR1cyBpcyAiICsgb3BlcmF0aW9uU3RhdHVzLAorCQkJCQlFcnJvclNldmVyaXR5LkVSUk9SKTsKKworCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChvcGVyYXRpb25TdGF0dXMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUF0dHJpYnV0ZVZhbHVlRGF0YU5vZGUoQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgYXR0cmlidXRlSW5zdGFuY2VQcm9wZXJ0eSwgSW50ZWdlciBpbmRleCwgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyLCBDb21wb25lbnRJbnN0YW5jZURhdGEgcmVzb3VyY2VJbnN0YW5jZURhdGEsCisJCQlXcmFwcGVyPEF0dHJpYnV0ZVZhbHVlRGF0YT4gYXR0VmFsdWVEYXRhV3JhcHBlcikgeworCQlTdHJpbmcgdmFsdWVVbmlxdWVVaWQgPSBhdHRyaWJ1dGVJbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCk7CisJCWlmICh2YWx1ZVVuaXF1ZVVpZCA9PSBudWxsKSB7CisKKwkJCVN0cmluZyBhdHRWYWx1ZURhdGF1bmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGVWYWx1ZVVpZChyZXNvdXJjZUluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBpbmRleCk7CisJCQlBdHRyaWJ1dGVWYWx1ZURhdGEgYXR0cmlidXRlVmFsdWVEYXRhID0gYnVpbGRBdHRyaWJ1dGVWYWx1ZURhdGFGcm9tQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUoYXR0cmlidXRlSW5zdGFuY2VQcm9wZXJ0eSwgYXR0VmFsdWVEYXRhdW5pcXVlSWQpOworCisJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgYXR0cmlidXRlIHZhbHVlIHRvIGdyYXBoIHt9IiwgYXR0cmlidXRlVmFsdWVEYXRhKTsKKwkJCUVpdGhlcjxBdHRyaWJ1dGVWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoYXR0cmlidXRlVmFsdWVEYXRhLCBBdHRyaWJ1dGVWYWx1ZURhdGEuY2xhc3MpOworCQkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgYXR0cmlidXRlIHZhbHVlIHRvIGdyYXBoIHt9IiwgYXR0cmlidXRlVmFsdWVEYXRhKTsKKworCQkJaWYgKGNyZWF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChvcGVyYXRpb25TdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlhdHRWYWx1ZURhdGFXcmFwcGVyLnNldElubmVyRWxlbWVudChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJDcmVhdGVBdHRyaWJ1dGVWYWx1ZURhdGFOb2RlIiwgImF0dHJpYnV0ZSB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4iLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCk7CisJCX0KKwl9CisKKwkvKgorCSAqIHByaXZhdGUgdm9pZCBjcmVhdGVJbnB1dFZhbHVlRGF0YU5vZGUoQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBpbnB1dEluc3RhbmNlUHJvcGVydHksIEludGVnZXIgaW5kZXgsIFdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciwgQ29tcG9uZW50SW5zdGFuY2VEYXRhIHJlc291cmNlSW5zdGFuY2VEYXRhLCBXcmFwcGVyPEF0dHJpYnV0ZVZhbHVlRGF0YT4gYXR0VmFsdWVEYXRhV3JhcHBlcikgeworCSAqIFN0cmluZyB2YWx1ZVVuaXF1ZVVpZCA9IGlucHV0SW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZVVuaXF1ZVVpZCgpOyBpZiAodmFsdWVVbmlxdWVVaWQgPT0gbnVsbCkgeworCSAqIAorCSAqIFN0cmluZyBhdHRWYWx1ZURhdGF1bmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlSW5zdGFuY2VJbnB1dFZhbHVlVWlkKHJlc291cmNlSW5zdGFuY2VEYXRhLiBnZXRVbmlxdWVJZCgpLCBpbmRleCk7IEF0dHJpYnV0ZVZhbHVlRGF0YSBhdHRyaWJ1dGVWYWx1ZURhdGEgPSBidWlsZEF0dHJpYnV0ZVZhbHVlRGF0YUZyb21Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSggaW5wdXRJbnN0YW5jZVByb3BlcnR5LAorCSAqIGF0dFZhbHVlRGF0YXVuaXF1ZUlkKTsKKwkgKiAKKwkgKiBsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgYXR0cmlidXRlIHZhbHVlIHRvIGdyYXBoIHt9IiwgYXR0cmlidXRlVmFsdWVEYXRhKTsgRWl0aGVyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShhdHRyaWJ1dGVWYWx1ZURhdGEsIEF0dHJpYnV0ZVZhbHVlRGF0YS5jbGFzcyk7CisJICogbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgYXR0cmlidXRlIHZhbHVlIHRvIGdyYXBoIHt9IiwgYXR0cmlidXRlVmFsdWVEYXRhKTsKKwkgKiAKKwkgKiBpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7IGVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQob3BlcmF0aW9uU3RhdHVzKTsgfSBlbHNlIHsgYXR0VmFsdWVEYXRhV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoY3JlYXRlTm9kZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7IH0KKwkgKiAKKwkgKiB9IGVsc2UgeyBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoICJDcmVhdGVBdHRyaWJ1dGVWYWx1ZURhdGFOb2RlIiwgImF0dHJpYnV0ZSB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4iLCBFcnJvclNldmVyaXR5LkVSUk9SKTsgZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKTsgfSB9CisJICovCisKKwlwcml2YXRlIEF0dHJpYnV0ZVZhbHVlRGF0YSBidWlsZEF0dHJpYnV0ZVZhbHVlRGF0YUZyb21Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZShDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSByZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlLCBTdHJpbmcgdW5pcXVlSWQpIHsKKwkJQXR0cmlidXRlVmFsdWVEYXRhIGF0dHJpYnV0ZVZhbHVlRGF0YSA9IG5ldyBBdHRyaWJ1dGVWYWx1ZURhdGEoKTsKKwkJYXR0cmlidXRlVmFsdWVEYXRhLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJYXR0cmlidXRlVmFsdWVEYXRhLnNldEhpZGRlbihyZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlLmlzSGlkZGVuKCkpOworCQlhdHRyaWJ1dGVWYWx1ZURhdGEuc2V0VmFsdWUocmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZS5nZXRWYWx1ZSgpKTsKKwkJYXR0cmlidXRlVmFsdWVEYXRhLnNldFR5cGUocmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZS5nZXRUeXBlKCkpOworCQlsb25nIGN1cnJlbnRUaW1lTWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWF0dHJpYnV0ZVZhbHVlRGF0YS5zZXRDcmVhdGlvblRpbWUoY3VycmVudFRpbWVNaWxsaXMpOworCQlhdHRyaWJ1dGVWYWx1ZURhdGEuc2V0TW9kaWZpY2F0aW9uVGltZShjdXJyZW50VGltZU1pbGxpcyk7CisJCXJldHVybiBhdHRyaWJ1dGVWYWx1ZURhdGE7CisJfQorCisJcHJpdmF0ZSBJbnB1dFZhbHVlRGF0YSBidWlsZEF0dHJpYnV0ZVZhbHVlRGF0YUZyb21Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZShDb21wb25lbnRJbnN0YW5jZUlucHV0IHJlc291cmNlSW5zdGFuY2VJbnB1dCwgU3RyaW5nIHVuaXF1ZUlkKSB7CisJCUlucHV0VmFsdWVEYXRhIGlucHV0VmFsdWVEYXRhID0gbmV3IElucHV0VmFsdWVEYXRhKCk7CisJCWlucHV0VmFsdWVEYXRhLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJaW5wdXRWYWx1ZURhdGEuc2V0SGlkZGVuKHJlc291cmNlSW5zdGFuY2VJbnB1dC5pc0hpZGRlbigpKTsKKwkJaW5wdXRWYWx1ZURhdGEuc2V0VmFsdWUocmVzb3VyY2VJbnN0YW5jZUlucHV0LmdldFZhbHVlKCkpOworCQlpbnB1dFZhbHVlRGF0YS5zZXRUeXBlKHJlc291cmNlSW5zdGFuY2VJbnB1dC5nZXRUeXBlKCkpOworCQlsb25nIGN1cnJlbnRUaW1lTWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWlucHV0VmFsdWVEYXRhLnNldENyZWF0aW9uVGltZShjdXJyZW50VGltZU1pbGxpcyk7CisJCWlucHV0VmFsdWVEYXRhLnNldE1vZGlmaWNhdGlvblRpbWUoY3VycmVudFRpbWVNaWxsaXMpOworCQlyZXR1cm4gaW5wdXRWYWx1ZURhdGE7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNsb25lUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5VmFsdWVzKENvbXBvbmVudEluc3RhbmNlIHRvUmVzb3VyY2VJbnN0YW5jZSwgQ29tcG9uZW50SW5zdGFuY2UgZnJvbVJlc291cmNlSW5zdGFuY2UpIHsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbFByb3BlcnRpZXMgPSBwcm9wZXJ0eU9wZXJhdGlvbi5nZXRBbGxQcm9wZXJ0aWVzT2ZSZXNvdXJjZUluc3RhbmNlT25seVByb3BlcnR5RGVmSWQoZnJvbVJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWlmIChhbGxQcm9wZXJ0aWVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsUHJvcGVydGllcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJfQorCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlU3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpOworCQkJcmV0dXJuIHN0b3JhZ2VTdGF0dXM7CisJCX0KKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnRpZXNPbkluc3RhbmNlID0gYWxsUHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHByb3BlcnRpZXNPbkluc3RhbmNlID09IG51bGwgfHwgcHJvcGVydGllc09uSW5zdGFuY2UuaXNFbXB0eSgpID09IHRydWUpIHsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisKKwkJZm9yIChDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BlcnR5IDogcHJvcGVydGllc09uSW5zdGFuY2UpIHsKKworCQkJLy8gT25seSBpZiB2YWx1ZVVuaXF1ZUlkIGlzIG5vdCBlbXB0eSwgdGhlbiBpdHMgYmVsb25ncyB0byB0aGUKKwkJCS8vIGluc3RhbmNlCisJCQlpZiAocHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKSAhPSBudWxsKSB7CisJCQkJcHJvcGVydHkuc2V0VmFsdWVVbmlxdWVVaWQobnVsbCk7CisJCQkJTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzID0gcHJvcGVydHkuZ2V0UnVsZXMoKTsKKwkJCQlpZiAocnVsZXMgIT0gbnVsbCkgeworCQkJCQlmb3IgKFByb3BlcnR5UnVsZSBwcm9wZXJ0eVJ1bGUgOiBydWxlcykgeworCQkJCQkJcHJvcGVydHlSdWxlLnJlcGxhY2VGaXJzdFRva2VuKHRvUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCA9IHRvUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCisJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY291bnRlclJlcyA9IHRoaXMuaW5jcmVhc2VBbmRHZXRSZXNvdXJjZUluc3RhbmNlU3BlY2lmaWNDb3VudGVyKHJlc291cmNlSW5zdGFuY2VJZCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5QUk9QRVJUWV9DT1VOVEVSLCB0cnVlKTsKKworCQkJaWYgKGNvdW50ZXJSZXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJpbmNyZWFzZUFuZEdldFJlc291cmNlUHJvcGVydHlDb3VudGVyIGZhaWxlZCByZXNvdXJjZSBpbnN0YW5jZSB7fSBwcm9wZXJ0eSB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgcHJvcGVydHkpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY291bnRlclJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJCUludGVnZXIgaW5kZXggPSBjb3VudGVyUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VJbnN0YW5jZSA9IHRoaXMuYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UocHJvcGVydHksIHRvUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBmYWxzZSwgaW5kZXgpOworCisJCQlpZiAoYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCQlyZXR1cm4gc3RvcmFnZVN0YXR1czsKKwkJCX0KKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjbG9uZVJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eVZhbHVlcyhUaXRhblZlcnRleCB0b1Jlc291cmNlSW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlIGZyb21SZXNvdXJjZUluc3RhbmNlLCBNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiBpbnB1dHNQcm9wTWFwLCBSZXNvdXJjZSBuZXdSZXNvdXJjZSkgeworCisJCVN0cmluZyByaUlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KHRvUmVzb3VyY2VJbnN0YW5jZSwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSk7CisJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsUHJvcGVydGllcyA9IHByb3BlcnR5T3BlcmF0aW9uLmdldEFsbFByb3BlcnRpZXNPZlJlc291cmNlSW5zdGFuY2VPbmx5UHJvcGVydHlEZWZJZChmcm9tUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJTGlzdDxJbnB1dERlZmluaXRpb24+IG5ld0lucHV0cyA9IG5ld1Jlc291cmNlLmdldElucHV0cygpOworCQkvLworCQlpZiAoYWxsUHJvcGVydGllcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbFByb3BlcnRpZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCXJldHVybiBzdG9yYWdlU3RhdHVzOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0aWVzT25JbnN0YW5jZSA9IGFsbFByb3BlcnRpZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChwcm9wZXJ0aWVzT25JbnN0YW5jZSA9PSBudWxsIHx8IHByb3BlcnRpZXNPbkluc3RhbmNlLmlzRW1wdHkoKSA9PSB0cnVlKSB7CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfQorCisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eSA6IHByb3BlcnRpZXNPbkluc3RhbmNlKSB7CisKKwkJCS8vIE9ubHkgaWYgdmFsdWVVbmlxdWVJZCBpcyBub3QgZW1wdHksIHRoZW4gaXRzIGJlbG9uZ3MgdG8gdGhlCisJCQkvLyBpbnN0YW5jZQorCQkJaWYgKHByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCkgIT0gbnVsbCkgeworCQkJCXByb3BlcnR5LnNldFZhbHVlVW5pcXVlVWlkKG51bGwpOworCQkJCUxpc3Q8UHJvcGVydHlSdWxlPiBydWxlcyA9IHByb3BlcnR5LmdldFJ1bGVzKCk7CisJCQkJaWYgKHJ1bGVzICE9IG51bGwpIHsKKwkJCQkJZm9yIChQcm9wZXJ0eVJ1bGUgcHJvcGVydHlSdWxlIDogcnVsZXMpIHsKKwkJCQkJCXByb3BlcnR5UnVsZS5yZXBsYWNlRmlyc3RUb2tlbihyaUlkKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCA9IHJpSWQ7CisKKwkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb3VudGVyUmVzID0gdGhpcy5pbmNyZWFzZUFuZEdldFJlc291cmNlSW5zdGFuY2VTcGVjaWZpY0NvdW50ZXIodG9SZXNvdXJjZUluc3RhbmNlLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlBST1BFUlRZX0NPVU5URVIpOworCisJCQlpZiAoY291bnRlclJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImluY3JlYXNlQW5kR2V0UmVzb3VyY2VQcm9wZXJ0eUNvdW50ZXIgZmFpbGVkIHJlc291cmNlIGluc3RhbmNlIHt9IHByb3BlcnR5IHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBwcm9wZXJ0eSk7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjb3VudGVyUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQkJSW50ZWdlciBpbmRleCA9IGNvdW50ZXJSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UgPSB0aGlzLmFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlKHByb3BlcnR5LCB0b1Jlc291cmNlSW5zdGFuY2UsIGZhbHNlLCBpbmRleCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCQkJaWYgKGFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlLmlzUmlnaHQoKSAmJiAhYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHN0b3JhZ2VTdGF0dXM7CisJCQl9CisJCQlpZiAoYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UuaXNMZWZ0KCkpIHsKKwkJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IG5ld1Byb3AgPSBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VJbnN0YW5jZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlTZXQ8U3RyaW5nPiBpbnB1dHNLZXkgPSBpbnB1dHNQcm9wTWFwLmtleVNldCgpOworCQkJCVN0cmluZyBpbnB1dFRvQXNzTmFtZSA9IG51bGw7CisJCQkJR2V0SW5wdXRWYWx1ZUluZm8gZ2V0SW5wdXRJbmZvID0gbnVsbDsKKwkJCQlmb3IgKFN0cmluZyBpbnB1dE5hbWUgOiBpbnB1dHNLZXkpIHsKKwkJCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wc0xpc3QgPSBpbnB1dHNQcm9wTWFwLmdldChpbnB1dE5hbWUpOworCQkJCQlPcHRpb25hbDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBvcCA9IHByb3BzTGlzdC5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFVuaXF1ZUlkKCkuZXF1YWxzKHByb3BlcnR5LmdldFVuaXF1ZUlkKCkpKS5maW5kQW55KCk7CisJCQkJCWlmIChvcC5pc1ByZXNlbnQoKSkgeworCQkJCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnBQcm9wID0gb3AuZ2V0KCk7CisJCQkJCQlnZXRJbnB1dEluZm8gPSBuZXcgR2V0SW5wdXRWYWx1ZUluZm8oKTsKKwkJCQkJCWdldElucHV0SW5mby5zZXRQcm9wTmFtZShpbnBQcm9wLmdldE5hbWUoKSk7CisJCQkJCQlnZXRJbnB1dEluZm8uc2V0SW5wdXROYW1lKGlucHV0TmFtZSk7CisJCQkJCQlpbnB1dFRvQXNzTmFtZSA9IGlucHV0TmFtZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQl9CisJCQkJaWYgKGlucHV0VG9Bc3NOYW1lICE9IG51bGwpIHsKKwkJCQkJZm9yIChJbnB1dERlZmluaXRpb24gaW5wdXQxIDogbmV3SW5wdXRzKSB7CisJCQkJCQlpZiAoaW5wdXQxLmdldE5hbWUoKS5lcXVhbHMoaW5wdXRUb0Fzc05hbWUpKSB7CisJCQkJCQkJdGhpcy5pbnB1dE9wZXJhdGlvbi5hc3NvY2lhdGVQcm9wZXJ0eVRvSW5wdXQocmlJZCwgaW5wdXQxLmdldFVuaXF1ZUlkKCksIG5ld1Byb3AsIGdldElucHV0SW5mbyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjbG9uZVJlc291cmNlSW5zdGFuY2VJbnB1dHNWYWx1ZXMoQ29tcG9uZW50SW5zdGFuY2UgdG9SZXNvdXJjZUluc3RhbmNlLCBDb21wb25lbnRJbnN0YW5jZSBmcm9tUmVzb3VyY2VJbnN0YW5jZSwgQ29tcG9uZW50IGNvbW9uZW50VG8sIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4+IGlucHV0c1ZhbHVlc01hcCkgeworCisJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsUHJvcGVydGllcyA9IGlucHV0T3BlcmF0aW9uLmdldEFsbElucHV0c09mUmVzb3VyY2VJbnN0YW5jZU9ubHlJbnB1dERlZklkKGZyb21SZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQlpZiAoYWxsUHJvcGVydGllcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbFByb3BlcnRpZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCXJldHVybiBzdG9yYWdlU3RhdHVzOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiBwcm9wZXJ0aWVzT25JbnN0YW5jZSA9IGFsbFByb3BlcnRpZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChwcm9wZXJ0aWVzT25JbnN0YW5jZSA9PSBudWxsIHx8IHByb3BlcnRpZXNPbkluc3RhbmNlLmlzRW1wdHkoKSA9PSB0cnVlKSB7CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfQorCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gbmV3SW5wdXRzID0gY29tb25lbnRUby5nZXRJbnB1dHMoKTsKKworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlSW5wdXQgcHJvcGVydHkgOiBwcm9wZXJ0aWVzT25JbnN0YW5jZSkgeworCisJCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRUb0FzcyA9IG5ldyBBcnJheUxpc3Q8SW5wdXREZWZpbml0aW9uPigpOworCQkJaWYgKG5ld0lucHV0cyAhPSBudWxsICYmICFpbnB1dHNWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7CisKKwkJCQlTZXQ8U3RyaW5nPiBpbnB1dHNOYW1lID0gaW5wdXRzVmFsdWVzTWFwLmtleVNldCgpOworCQkJCWZvciAoU3RyaW5nIG5hbWUgOiBpbnB1dHNOYW1lKSB7CisJCQkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gaW5wdXRzVmFsdWUgPSBpbnB1dHNWYWx1ZXNNYXAuZ2V0KG5hbWUpOworCQkJCQlpZiAoaW5wdXRzVmFsdWUgIT0gbnVsbCkgeworCQkJCQkJT3B0aW9uYWw8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gb3AgPSBpbnB1dHNWYWx1ZS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFZhbHVlVW5pcXVlVWlkKCkuZXF1YWxzKHByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCkpKS5maW5kQW55KCk7CisJCQkJCQlpZiAob3AuaXNQcmVzZW50KCkpIHsKKwkJCQkJCQlPcHRpb25hbDxJbnB1dERlZmluaXRpb24+IG9wdGlvbmFsID0gbmV3SW5wdXRzLnN0cmVhbSgpLmZpbHRlcihlIC0+IGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEFueSgpOworCQkJCQkJCWlmIChvcHRpb25hbC5pc1ByZXNlbnQoKSkgeworCQkJCQkJCQlpbnB1dFRvQXNzLmFkZChvcHRpb25hbC5nZXQoKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBPbmx5IGlmIHZhbHVlVW5pcXVlSWQgaXMgbm90IGVtcHR5LCB0aGVuIGl0cyBiZWxvbmdzIHRvIHRoZQorCQkJLy8gaW5zdGFuY2UKKwkJCWlmIChwcm9wZXJ0eS5nZXRWYWx1ZVVuaXF1ZVVpZCgpICE9IG51bGwpIHsKKwkJCQlwcm9wZXJ0eS5zZXRWYWx1ZVVuaXF1ZVVpZChudWxsKTsKKwkJCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSBwcm9wZXJ0eS5nZXRSdWxlcygpOworCQkJCWlmIChydWxlcyAhPSBudWxsKSB7CisJCQkJCWZvciAoUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZSA6IHJ1bGVzKSB7CisJCQkJCQlwcm9wZXJ0eVJ1bGUucmVwbGFjZUZpcnN0VG9rZW4odG9SZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkID0gdG9SZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb3VudGVyUmVzID0gdGhpcy5pbmNyZWFzZUFuZEdldFJlc291cmNlSW5zdGFuY2VTcGVjaWZpY0NvdW50ZXIocmVzb3VyY2VJbnN0YW5jZUlkLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklOUFVUX0NPVU5URVIsIHRydWUpOworCisJCQlpZiAoY291bnRlclJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoImluY3JlYXNlQW5kR2V0UmVzb3VyY2VQcm9wZXJ0eUNvdW50ZXIgZmFpbGVkIHJlc291cmNlIGluc3RhbmNlIHt9IHByb3BlcnR5IHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBwcm9wZXJ0eSk7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjb3VudGVyUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQkJSW50ZWdlciBpbmRleCA9IGNvdW50ZXJSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCUVpdGhlcjxJbnB1dFZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlID0gdGhpcy5hZGRJbnB1dFRvUmVzb3VyY2VJbnN0YW5jZShwcm9wZXJ0eSwgdG9SZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIGluZGV4KTsKKworCQkJaWYgKGFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cyk7CisJCQkJcmV0dXJuIHN0b3JhZ2VTdGF0dXM7CisJCQl9CisKKwkJCWZvciAoSW5wdXREZWZpbml0aW9uIGlucHV0IDogaW5wdXRUb0FzcykgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBpbnB1dC5nZXROYW1lKCkpOworCQkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5PV05FUl9JRC5nZXRQcm9wZXJ0eSgpLCB0b1Jlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCQlHcmFwaE5vZGUgaW5wdXREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uSW5wdXQsIGlucHV0LmdldFVuaXF1ZUlkKCkpOworCQkJCUdyYXBoTm9kZSBwcm9wZXJ0eURhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5JbnB1dFZhbHVlLCBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VJbnN0YW5jZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcFJlZlJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihpbnB1dERhdGEsIHByb3BlcnR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkdFVF9JTlBVVCwgcHJvcHMpOworCisJCQkJaWYgKGFkZFByb3BSZWZSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZFByb3BSZWZSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvY2lhdGUgaW5wdXQge30gIHRvIGlucHV0IHZhbHVlIHt9IGluIGdyYXBoLiBTdGF0dXMgaXMge30iLCBpbnB1dC5nZXRVbmlxdWVJZCgpLCBwcm9wZXJ0eURhdGEuZ2V0VW5pcXVlSWQoKSwgc3RhdHVzKTsKKworCQkJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjbG9uZVJlc291cmNlSW5zdGFuY2VJbnB1dHNWYWx1ZXMoVGl0YW5WZXJ0ZXggdG9SZXNvdXJjZUluc3RhbmNlVmVydGV4LCBDb21wb25lbnRJbnN0YW5jZSBmcm9tUmVzb3VyY2VJbnN0YW5jZSwgU3RyaW5nIGluc3RhbmNlSWQsIFJlc291cmNlIG5ld1Jlc291cmNlLCBNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+PiBpbnB1dHNWYWx1ZXNNYXApIHsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbFByb3BlcnRpZXMgPSBpbnB1dE9wZXJhdGlvbi5nZXRBbGxJbnB1dHNPZlJlc291cmNlSW5zdGFuY2VPbmx5SW5wdXREZWZJZChmcm9tUmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJaWYgKGFsbFByb3BlcnRpZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxQcm9wZXJ0aWVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cyk7CisJCQlyZXR1cm4gc3RvcmFnZVN0YXR1czsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gcHJvcGVydGllc09uSW5zdGFuY2UgPSBhbGxQcm9wZXJ0aWVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAocHJvcGVydGllc09uSW5zdGFuY2UgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzT25JbnN0YW5jZS5pc0VtcHR5KCkgPT0gdHJ1ZSkgeworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCX0KKworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlSW5wdXQgcHJvcGVydHkgOiBwcm9wZXJ0aWVzT25JbnN0YW5jZSkgeworCisJCQkvLyBPbmx5IGlmIHZhbHVlVW5pcXVlSWQgaXMgbm90IGVtcHR5LCB0aGVuIGl0cyBiZWxvbmdzIHRvIHRoZQorCQkJLy8gaW5zdGFuY2UKKwkJCWlmIChwcm9wZXJ0eS5nZXRWYWx1ZVVuaXF1ZVVpZCgpICE9IG51bGwpIHsKKwkJCQlwcm9wZXJ0eS5zZXRWYWx1ZVVuaXF1ZVVpZChudWxsKTsKKwkJCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSBwcm9wZXJ0eS5nZXRSdWxlcygpOworCQkJCWlmIChydWxlcyAhPSBudWxsKSB7CisJCQkJCWZvciAoUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZSA6IHJ1bGVzKSB7CisJCQkJCQlwcm9wZXJ0eVJ1bGUucmVwbGFjZUZpcnN0VG9rZW4oaW5zdGFuY2VJZCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCVN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQgPSBpbnN0YW5jZUlkOworCisJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY291bnRlclJlcyA9IHRoaXMuaW5jcmVhc2VBbmRHZXRSZXNvdXJjZUluc3RhbmNlU3BlY2lmaWNDb3VudGVyKHRvUmVzb3VyY2VJbnN0YW5jZVZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JTlBVVF9DT1VOVEVSKTsKKworCQkJaWYgKGNvdW50ZXJSZXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJpbmNyZWFzZUFuZEdldFJlc291cmNlUHJvcGVydHlDb3VudGVyIGZhaWxlZCByZXNvdXJjZSBpbnN0YW5jZSB7fSBwcm9wZXJ0eSB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgcHJvcGVydHkpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY291bnRlclJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJCUludGVnZXIgaW5kZXggPSBjb3VudGVyUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8SW5wdXRWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VJbnN0YW5jZSA9IHRoaXMuYWRkSW5wdXRUb1Jlc291cmNlSW5zdGFuY2UocHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgaW5kZXgpOworCisJCQlpZiAoYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCQlyZXR1cm4gc3RvcmFnZVN0YXR1czsKKwkJCX0KKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydHlWYWx1ZUluUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCS8vIFRPRE86IHZlcmlmeSB2YWxpZFVuaXF1ZUlkIGV4aXN0cworCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gdGhpcy51cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgdHJ1ZSk7CisKKwkJCWlmIChlaXRoZXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHZhbHVlIHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9IGluIEdyYXBoLiBzdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgZWl0aGVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfSBlbHNlIHsKKwkJCQlQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSA9IGVpdGhlclN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcHJvcGVydHlWYWx1ZVJlc3VsdCA9IHByb3BlcnR5T3BlcmF0aW9uLmJ1aWxkUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KHByb3BlcnR5VmFsdWVEYXRhLCByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkpOworCisJCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5IGlzIHt9IiwgcHJvcGVydHlWYWx1ZVJlc3VsdCk7CisKKwkJCQlFaXRoZXI8U3RyaW5nLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZERlZmF1bHRWYWx1ZSA9IHByb3BlcnR5T3BlcmF0aW9uLmZpbmREZWZhdWx0VmFsdWVGcm9tU2Vjb25kUG9zaXRpb24ocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFBhdGgoKSwgcHJvcGVydHlWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJCQlpZiAoZmluZERlZmF1bHRWYWx1ZS5pc1JpZ2h0KCkpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZmluZERlZmF1bHRWYWx1ZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGZpbmREZWZhdWx0VmFsdWUubGVmdCgpLnZhbHVlKCk7CisJCQkJcHJvcGVydHlWYWx1ZVJlc3VsdC5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKKwkJCQlsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBkZWZhdWx0IHZhbHVlIGluIFJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSBpcyB7fSIsIGRlZmF1bHRWYWx1ZSk7CisKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChwcm9wZXJ0eVZhbHVlUmVzdWx0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisKKwkJZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVXBkYXRlRGF0YUNvbnRhaW5lcjxTb21lRGF0YSwgU29tZVZhbHVlRGF0YT4geworCQlmaW5hbCBXcmFwcGVyPFNvbWVWYWx1ZURhdGE+IHZhbHVlRGF0YVdyYXBwZXI7CisJCWZpbmFsIFdyYXBwZXI8U29tZURhdGE+IGRhdGFXcmFwcGVyOworCQlmaW5hbCBHcmFwaEVkZ2VMYWJlbHMgZ3JhcGhFZGdlOworCQlmaW5hbCBTdXBwbGllcjxDbGFzczxTb21lRGF0YT4+IHNvbWVEYXRhQ2xhc3NHZW47CisJCWZpbmFsIFN1cHBsaWVyPENsYXNzPFNvbWVWYWx1ZURhdGE+PiBzb21lVmFsdWVEYXRhQ2xhc3NHZW47CisJCWZpbmFsIE5vZGVUeXBlRW51bSBub2RlVHlwZTsKKwkJZmluYWwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlVmFsdWU7CisKKwkJcHJpdmF0ZSBVcGRhdGVEYXRhQ29udGFpbmVyKEdyYXBoRWRnZUxhYmVscyBncmFwaEVkZ2UsIFN1cHBsaWVyPENsYXNzPFNvbWVEYXRhPj4gc29tZURhdGFDbGFzc0dlbiwgU3VwcGxpZXI8Q2xhc3M8U29tZVZhbHVlRGF0YT4+IHNvbWVWYWx1ZURhdGFDbGFzc0dlbiwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBOb2RlVHlwZUVudW0gbm9kZVR5cGVWYWx1ZSkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMudmFsdWVEYXRhV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJCXRoaXMuZGF0YVdyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCQl0aGlzLmdyYXBoRWRnZSA9IGdyYXBoRWRnZTsKKwkJCXRoaXMuc29tZURhdGFDbGFzc0dlbiA9IHNvbWVEYXRhQ2xhc3NHZW47CisJCQl0aGlzLnNvbWVWYWx1ZURhdGFDbGFzc0dlbiA9IHNvbWVWYWx1ZURhdGFDbGFzc0dlbjsKKwkJCXRoaXMubm9kZVR5cGUgPSBub2RlVHlwZTsKKwkJCXRoaXMubm9kZVR5cGVWYWx1ZSA9IG5vZGVUeXBlVmFsdWU7CisJCX0KKworCQlwdWJsaWMgV3JhcHBlcjxTb21lVmFsdWVEYXRhPiBnZXRWYWx1ZURhdGFXcmFwcGVyKCkgeworCQkJcmV0dXJuIHZhbHVlRGF0YVdyYXBwZXI7CisJCX0KKworCQlwdWJsaWMgV3JhcHBlcjxTb21lRGF0YT4gZ2V0RGF0YVdyYXBwZXIoKSB7CisJCQlyZXR1cm4gZGF0YVdyYXBwZXI7CisJCX0KKworCQlwdWJsaWMgR3JhcGhFZGdlTGFiZWxzIGdldEdyYXBoRWRnZSgpIHsKKwkJCXJldHVybiBncmFwaEVkZ2U7CisJCX0KKworCQlwdWJsaWMgU3VwcGxpZXI8Q2xhc3M8U29tZURhdGE+PiBnZXRTb21lRGF0YUNsYXNzR2VuKCkgeworCQkJcmV0dXJuIHNvbWVEYXRhQ2xhc3NHZW47CisJCX0KKworCQlwdWJsaWMgU3VwcGxpZXI8Q2xhc3M8U29tZVZhbHVlRGF0YT4+IGdldFNvbWVWYWx1ZURhdGFDbGFzc0dlbigpIHsKKwkJCXJldHVybiBzb21lVmFsdWVEYXRhQ2xhc3NHZW47CisJCX0KKworCQlwdWJsaWMgTm9kZVR5cGVFbnVtIGdldE5vZGVUeXBlKCkgeworCQkJcmV0dXJuIG5vZGVUeXBlOworCQl9CisKKwkJcHVibGljIE5vZGVUeXBlRW51bSBnZXROb2RlVHlwZVZhbHVlKCkgeworCQkJcmV0dXJuIG5vZGVUeXBlVmFsdWU7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU9yVXBkYXRlQXR0cmlidXRlT2ZSZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGF0dHJpYnV0ZUluc3RhbmNlUHJvcGVydHksIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQpIHsKKwkJRWl0aGVyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKwkJLy8gQ3JlYXRlCisJCWlmIChhdHRyaWJ1dGVJbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCkgPT0gbnVsbCkgeworCQkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvdW50ZXJSZXMgPSBpbmNyZWFzZUFuZEdldFJlc291cmNlSW5zdGFuY2VTcGVjaWZpY0NvdW50ZXIocmVzb3VyY2VJbnN0YW5jZUlkLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkFUVFJJQlVURV9DT1VOVEVSLCB0cnVlKTsKKwkJCWlmIChjb3VudGVyUmVzLmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiY3JlYXRlT3JVcGRhdGVBdHRyaWJ1dGVPZlJlc291cmNlSW5zdGFuY2UiLCAiRmFpbGVkIHRvIGdldCBBdHRyaWJ1dGVWYWx1ZURhdGEgQ291bnRlciIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1Jlc291cmNlSW5zdGFuY2UoYXR0cmlidXRlSW5zdGFuY2VQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBjb3VudGVyUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQkvLyBVcGRhdGUKKwkJZWxzZSB7CisJCQlyZXN1bHQgPSB1cGRhdGVBdHRyaWJ1dGVPZlJlc291cmNlSW5zdGFuY2UoYXR0cmlidXRlSW5zdGFuY2VQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHVwZGF0ZSB2YWx1ZSBvZiBhdHRyaWJ1dGUgb24gcmVzb3VyY2UgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZQorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlSWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8QXR0cmlidXRlVmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQXR0cmlidXRlT2ZSZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQpIHsKKworCQlFaXRoZXI8QXR0cmlidXRlVmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlVcGRhdGVEYXRhQ29udGFpbmVyPEF0dHJpYnV0ZURhdGEsIEF0dHJpYnV0ZVZhbHVlRGF0YT4gdXBkYXRlRGF0YUNvbnRhaW5lciA9IG5ldyBVcGRhdGVEYXRhQ29udGFpbmVyPD4oR3JhcGhFZGdlTGFiZWxzLkFUVFJJQlVURV9JTVBMLCAoKCkgLT4gQXR0cmlidXRlRGF0YS5jbGFzcyksICgoKSAtPiBBdHRyaWJ1dGVWYWx1ZURhdGEuY2xhc3MpLCBOb2RlVHlwZUVudW0uQXR0cmlidXRlLAorCQkJCU5vZGVUeXBlRW51bS5BdHRyaWJ1dGVWYWx1ZSk7CisJCXByZVVwZGF0ZUVsZW1lbnRPZlJlc291cmNlSW5zdGFuY2VWYWxpZGF0aW9ucyh1cGRhdGVEYXRhQ29udGFpbmVyLCByZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yV3JhcHBlcik7CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlBdHRyaWJ1dGVWYWx1ZURhdGEgYXR0cmlidXRlVmFsdWVEYXRhID0gdXBkYXRlRGF0YUNvbnRhaW5lci5nZXRWYWx1ZURhdGFXcmFwcGVyKCkuZ2V0SW5uZXJFbGVtZW50KCk7CisJCQlhdHRyaWJ1dGVWYWx1ZURhdGEuc2V0SGlkZGVuKHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUuaXNIaWRkZW4oKSk7CisJCQlhdHRyaWJ1dGVWYWx1ZURhdGEuc2V0VmFsdWUocmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZS5nZXRWYWx1ZSgpKTsKKwkJCUVpdGhlcjxBdHRyaWJ1dGVWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXMgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShhdHRyaWJ1dGVWYWx1ZURhdGEsIEF0dHJpYnV0ZVZhbHVlRGF0YS5jbGFzcyk7CisJCQlpZiAodXBkYXRlUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHVwZGF0ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJZXJyb3JXcmFwcGVyLnNldElubmVyRWxlbWVudChzdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh1cGRhdGVSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCWlmICghZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEF0dHJpYnV0ZVRvUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBhdHRyaWJ1dGVJbnN0YW5jZVByb3BlcnR5LCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBJbnRlZ2VyIGluZGV4KSB7CisJCVdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJV3JhcHBlcjxDb21wb25lbnRJbnN0YW5jZURhdGE+IGNvbXBJbnNXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlXcmFwcGVyPEF0dHJpYnV0ZURhdGE+IGF0dERhdGFXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlXcmFwcGVyPEF0dHJpYnV0ZVZhbHVlRGF0YT4gYXR0VmFsdWVEYXRhV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKworCQkvLyBWZXJpZnkgUkkgRXhpc3QKKwkJdmFsaWRhdGVSSUV4aXN0KHJlc291cmNlSW5zdGFuY2VJZCwgY29tcEluc1dyYXBwZXIsIGVycm9yV3JhcHBlcik7CisKKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCS8vIFZlcmlmeSBBdHRyaWJ1dGUgRXhpc3QKKwkJCXZhbGlkYXRlRWxlbWVudEV4aXN0SW5HcmFwaChhdHRyaWJ1dGVJbnN0YW5jZVByb3BlcnR5LmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5BdHRyaWJ1dGUsICgpIC0+IEF0dHJpYnV0ZURhdGEuY2xhc3MsIGF0dERhdGFXcmFwcGVyLCBlcnJvcldyYXBwZXIpOworCQl9CisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkvLyBDcmVhdGUgQXR0cmlidXRlVmFsdWVEYXRhIHRoYXQgaXMgY29ubmVjdGVkIHRvIFJJCisJCQljcmVhdGVBdHRyaWJ1dGVWYWx1ZURhdGFOb2RlKGF0dHJpYnV0ZUluc3RhbmNlUHJvcGVydHksIGluZGV4LCBlcnJvcldyYXBwZXIsIGNvbXBJbnNXcmFwcGVyLmdldElubmVyRWxlbWVudCgpLCBhdHRWYWx1ZURhdGFXcmFwcGVyKTsKKwkJfQorCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJLy8gQ29ubmVjdCBBdHRyaWJ1dGVWYWx1ZURhdGEgKEF0dCBvbiBSSSkgdG8gQXR0RGF0YSAoQXR0IG9uCisJCQkvLyBSZXNvdXJjZSkKKwkJCWNvbm5lY3RBdHRWYWx1ZURhdGFUb0F0dERhdGEoZXJyb3JXcmFwcGVyLCBhdHREYXRhV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgYXR0VmFsdWVEYXRhV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKwkJaWYgKGVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCS8vIENvbm5lY3QgQXR0cmlidXRlVmFsdWVEYXRhIHRvIFJJCisJCQljb25uZWN0QXR0VmFsdWVEYXRhVG9Db21wb25lbnRJbnN0YW5jZURhdGEoZXJyb3JXcmFwcGVyLCBjb21wSW5zV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgYXR0VmFsdWVEYXRhV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKworCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGF0dFZhbHVlRGF0YVdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcldyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCkpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiB1cGRhdGUgdmFsdWUgb2YgYXR0cmlidXRlIG9uIHJlc291cmNlIGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VQcm9lcnR5CisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgYm9vbGVhbiBpc1ZhbGlkYXRlKSB7CisKKwkJV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyID0gbmV3IFdyYXBwZXI8PigpOworCQlVcGRhdGVEYXRhQ29udGFpbmVyPFByb3BlcnR5RGF0YSwgUHJvcGVydHlWYWx1ZURhdGE+IHVwZGF0ZURhdGFDb250YWluZXIgPSBuZXcgVXBkYXRlRGF0YUNvbnRhaW5lcjw+KEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCAoKCkgLT4gUHJvcGVydHlEYXRhLmNsYXNzKSwgKCgpIC0+IFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKSwgTm9kZVR5cGVFbnVtLlByb3BlcnR5LAorCQkJCU5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlKTsKKworCQlwcmVVcGRhdGVFbGVtZW50T2ZSZXNvdXJjZUluc3RhbmNlVmFsaWRhdGlvbnModXBkYXRlRGF0YUNvbnRhaW5lciwgcmVzb3VyY2VJbnN0YW5jZVByb2VydHksIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3JXcmFwcGVyKTsKKwkJaWYgKCFlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVycm9yV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCX0KKworCQllbHNlIHsKKwkJCVN0cmluZyB2YWx1ZSA9IHJlc291cmNlSW5zdGFuY2VQcm9lcnR5LmdldFZhbHVlKCk7CisJCQkvLyBTcGVjaWZpYyBWYWxpZGF0aW9uIExvZ2ljCisJCQlQcm9wZXJ0eURhdGEgcHJvcGVydHlEYXRhID0gdXBkYXRlRGF0YUNvbnRhaW5lci5nZXREYXRhV3JhcHBlcigpLmdldElubmVyRWxlbWVudCgpOworCisJCQlTdHJpbmcgaW5uZXJUeXBlID0gbnVsbDsKKworCQkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwcm9wRGF0YURlZiA9IHByb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCk7CisJCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcERhdGFEZWYuZ2V0VHlwZSgpOworCQkJVG9zY2FQcm9wZXJ0eVR5cGUgdHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKHByb3BlcnR5VHlwZSk7CisJCQlsb2cuZGVidWcoIlRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB7fSBpcyB7fSIsIHByb3BlcnR5RGF0YS5nZXRVbmlxdWVJZCgpLCBwcm9wZXJ0eVR5cGUpOworCisJCQlpZiAodHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5MSVNUIHx8IHR5cGUgPT0gVG9zY2FQcm9wZXJ0eVR5cGUuTUFQKSB7CisJCQkJU2NoZW1hRGVmaW5pdGlvbiBkZWYgPSBwcm9wRGF0YURlZi5nZXRTY2hlbWEoKTsKKwkJCQlpZiAoZGVmID09IG51bGwpIHsKKwkJCQkJbG9nLmRlYnVnKCJTY2hlbWEgZG9lc24ndCBleGlzdHMgZm9yIHByb3BlcnR5IG9mIHR5cGUge30iLCB0eXBlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCQl9CisJCQkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwcm9wRGVmID0gZGVmLmdldFByb3BlcnR5KCk7CisJCQkJaWYgKHByb3BEZWYgPT0gbnVsbCkgeworCQkJCQlsb2cuZGVidWcoIlByb3BlcnR5IGluIFNjaGVtYSBEZWZpbml0aW9uIGluc2lkZSBwcm9wZXJ0eSBvZiB0eXBlIHt9IGRvZXNuJ3QgZXhpc3QiLCB0eXBlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCQl9CisJCQkJaW5uZXJUeXBlID0gcHJvcERlZi5nZXRUeXBlKCk7CisJCQl9CisJCQkvLyBTcGVjaWZpYyBVcGRhdGUgTG9naWMKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsRGF0YVR5cGVzID0gZGF0YVR5cGVDYWNoZS5nZXRBbGwoKTsKKwkJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIlVwZGF0ZVByb3BlcnR5VmFsdWVPbkNvbXBvbmVudEluc3RhbmNlIiwgIkZhaWxlZCB0byB1cGRhdGUgcHJvcGVydHkgdmFsdWUgb24gaW5zdGFuY2UuIFN0YXR1cyBpcyAiICsgc3RhdHVzLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisJCQlFaXRoZXI8T2JqZWN0LCBCb29sZWFuPiBpc1ZhbGlkID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5VHlwZSwgdmFsdWUsIGlzVmFsaWRhdGUsIGlubmVyVHlwZSwgYWxsRGF0YVR5cGVzLmxlZnQoKS52YWx1ZSgpKTsKKworCQkJU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWU7CisJCQlpZiAoaXNWYWxpZC5pc1JpZ2h0KCkpIHsKKwkJCQlCb29sZWFuIHJlcyA9IGlzVmFsaWQucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChyZXMgPT0gZmFsc2UpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCU9iamVjdCBvYmplY3QgPSBpc1ZhbGlkLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChvYmplY3QgIT0gbnVsbCkgeworCQkJCQluZXdWYWx1ZSA9IG9iamVjdC50b1N0cmluZygpOworCQkJCX0KKwkJCX0KKwkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gdXBkYXRlRGF0YUNvbnRhaW5lci5nZXRWYWx1ZURhdGFXcmFwcGVyKCkuZ2V0SW5uZXJFbGVtZW50KCk7CisJCQlsb2cuZGVidWcoIkdvaW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHt9IHRvIHt9IiwgcHJvcGVydHlWYWx1ZURhdGEuZ2V0VmFsdWUoKSwgbmV3VmFsdWUpOworCQkJcHJvcGVydHlWYWx1ZURhdGEuc2V0VmFsdWUobmV3VmFsdWUpOworCisJCQlJbW11dGFibGVQYWlyPFN0cmluZywgQm9vbGVhbj4gcGFpciA9IHByb3BlcnR5T3BlcmF0aW9uLnZhbGlkYXRlQW5kVXBkYXRlUnVsZXMocHJvcGVydHlUeXBlLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eS5nZXRSdWxlcygpLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSwgaXNWYWxpZGF0ZSk7CisJCQlpZiAocGFpci5nZXRSaWdodCgpICE9IG51bGwgJiYgcGFpci5nZXRSaWdodCgpID09IGZhbHNlKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZFZhbHVlRXJyb3IoIkFkZCBwcm9wZXJ0eSB2YWx1ZSIsIHBhaXIuZ2V0TGVmdCgpLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5VHlwZSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCX0KKwkJCXByb3BlcnR5T3BlcmF0aW9uLnVwZGF0ZVJ1bGVzSW5Qcm9wZXJ0eVZhbHVlKHByb3BlcnR5VmFsdWVEYXRhLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocHJvcGVydHlWYWx1ZURhdGEsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJCWlmICh1cGRhdGVSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBkYXRlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisKKwl9CisKKwkvKioKKwkgKiB1cGRhdGUgdmFsdWUgb2YgYXR0cmlidXRlIG9uIHJlc291cmNlIGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VQcm9lcnR5CisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPElucHV0VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlSW5wdXRPZlJlc291cmNlSW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2VJbnB1dCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCkgeworCisJCVdyYXBwZXI8VGl0YW5PcGVyYXRpb25TdGF0dXM+IGVycm9yV3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJVXBkYXRlRGF0YUNvbnRhaW5lcjxQcm9wZXJ0eURhdGEsIElucHV0VmFsdWVEYXRhPiB1cGRhdGVEYXRhQ29udGFpbmVyID0gbmV3IFVwZGF0ZURhdGFDb250YWluZXI8PihHcmFwaEVkZ2VMYWJlbHMuSU5QVVRfSU1QTCwgKCgpIC0+IFByb3BlcnR5RGF0YS5jbGFzcyksICgoKSAtPiBJbnB1dFZhbHVlRGF0YS5jbGFzcyksIE5vZGVUeXBlRW51bS5JbnB1dCwgTm9kZVR5cGVFbnVtLklucHV0VmFsdWUpOworCisJCXByZVVwZGF0ZUVsZW1lbnRPZlJlc291cmNlSW5zdGFuY2VWYWxpZGF0aW9ucyh1cGRhdGVEYXRhQ29udGFpbmVyLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcldyYXBwZXIpOworCQlpZiAoIWVycm9yV3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJfQorCisJCWVsc2UgeworCQkJU3RyaW5nIHZhbHVlID0gcmVzb3VyY2VJbnN0YW5jZVByb2VydHkuZ2V0VmFsdWUoKTsKKwkJCS8vIFNwZWNpZmljIFZhbGlkYXRpb24gTG9naWMKKwkJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSB1cGRhdGVEYXRhQ29udGFpbmVyLmdldERhdGFXcmFwcGVyKCkuZ2V0SW5uZXJFbGVtZW50KCk7CisKKwkJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCisJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEYXRhRGVmID0gcHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKTsKKwkJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wRGF0YURlZi5nZXRUeXBlKCk7CisJCQlUb3NjYVByb3BlcnR5VHlwZSB0eXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUocHJvcGVydHlUeXBlKTsKKwkJCWxvZy5kZWJ1ZygiVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5IHt9IGlzIHt9IiwgcHJvcGVydHlEYXRhLmdldFVuaXF1ZUlkKCksIHByb3BlcnR5VHlwZSk7CisKKwkJCWlmICh0eXBlID09IFRvc2NhUHJvcGVydHlUeXBlLkxJU1QgfHwgdHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5NQVApIHsKKwkJCQlTY2hlbWFEZWZpbml0aW9uIGRlZiA9IHByb3BEYXRhRGVmLmdldFNjaGVtYSgpOworCQkJCWlmIChkZWYgPT0gbnVsbCkgeworCQkJCQlsb2cuZGVidWcoIlNjaGVtYSBkb2Vzbid0IGV4aXN0cyBmb3IgcHJvcGVydHkgb2YgdHlwZSB7fSIsIHR5cGUpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJCX0KKwkJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEZWYgPSBkZWYuZ2V0UHJvcGVydHkoKTsKKwkJCQlpZiAocHJvcERlZiA9PSBudWxsKSB7CisJCQkJCWxvZy5kZWJ1ZygiUHJvcGVydHkgaW4gU2NoZW1hIERlZmluaXRpb24gaW5zaWRlIHByb3BlcnR5IG9mIHR5cGUge30gZG9lc24ndCBleGlzdCIsIHR5cGUpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJCX0KKwkJCQlpbm5lclR5cGUgPSBwcm9wRGVmLmdldFR5cGUoKTsKKwkJCX0KKwkJCS8vIFNwZWNpZmljIFVwZGF0ZSBMb2dpYworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBkYXRhVHlwZUNhY2hlLmdldEFsbCgpOworCQkJaWYgKGFsbERhdGFUeXBlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiVXBkYXRlUHJvcGVydHlWYWx1ZU9uQ29tcG9uZW50SW5zdGFuY2UiLCAiRmFpbGVkIHRvIHVwZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBvbiBpbnN0YW5jZS4gU3RhdHVzIGlzICIgKyBzdGF0dXMsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBFaXRoZXI8T2JqZWN0LCBCb29sZWFuPiBpc1ZhbGlkID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5VHlwZSwgdmFsdWUsIGlubmVyVHlwZSwgYWxsRGF0YVR5cGVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCSAqIAorCQkJICogU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWU7IGlmIChpc1ZhbGlkLmlzUmlnaHQoKSkgeyBCb29sZWFuIHJlcyA9IGlzVmFsaWQucmlnaHQoKS52YWx1ZSgpOyBpZiAocmVzID09IGZhbHNlKSB7IHJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVCk7IH0gfSBlbHNlIHsgT2JqZWN0IG9iamVjdCA9IGlzVmFsaWQubGVmdCgpLnZhbHVlKCk7IGlmIChvYmplY3QgIT0KKwkJCSAqIG51bGwpIHsgbmV3VmFsdWUgPSBvYmplY3QudG9TdHJpbmcoKTsgfSB9IElucHV0VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gdXBkYXRlRGF0YUNvbnRhaW5lci5nZXRWYWx1ZURhdGFXcmFwcGVyKCkuZ2V0SW5uZXJFbGVtZW50KCk7IGxvZy5kZWJ1ZygiR29pbmcgdG8gdXBkYXRlIHByb3BlcnR5IHZhbHVlIGZyb20ge30gdG8ge30iLCBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRWYWx1ZSgpLCBuZXdWYWx1ZSk7IHByb3BlcnR5VmFsdWVEYXRhLnNldFZhbHVlKG5ld1ZhbHVlKTsKKwkJCSAqIAorCQkJICogSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+IHBhaXIgPSBwcm9wZXJ0eU9wZXJhdGlvbi52YWxpZGF0ZUFuZFVwZGF0ZVJ1bGVzKHByb3BlcnR5VHlwZSwgcmVzb3VyY2VJbnN0YW5jZVByb2VydHkuZ2V0UnVsZXMoKSwgaW5uZXJUeXBlLCBhbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCkpOyBpZiAocGFpci5nZXRSaWdodCgpICE9IG51bGwgJiYgcGFpci5nZXRSaWdodCgpID09IGZhbHNlKSB7CisJCQkgKiBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuIGxvZ0JlSW52YWxpZFZhbHVlRXJyb3IoIkFkZCBwcm9wZXJ0eSB2YWx1ZSIsIHBhaXIuZ2V0TGVmdCgpLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5VHlwZSk7IHJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVCk7IH0KKwkJCSAqIHByb3BlcnR5T3BlcmF0aW9uLnVwZGF0ZVJ1bGVzSW5Qcm9wZXJ0eVZhbHVlKHByb3BlcnR5VmFsdWVEYXRhLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCSAqIAorCQkJICogRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocHJvcGVydHlWYWx1ZURhdGEsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsgaWYgKHVwZGF0ZVJlcy5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBkYXRlUmVzLnJpZ2h0KCkudmFsdWUoKTsgcmV0dXJuCisJCQkgKiBFaXRoZXIucmlnaHQoc3RhdHVzKTsgfSBlbHNlIHsgcmV0dXJuIEVpdGhlci5sZWZ0KHVwZGF0ZVJlcy5sZWZ0KCkudmFsdWUoKSk7IH0KKwkJCSAqLworCQl9CisJCXJldHVybiBudWxsOworCisJfQorCisJcHJpdmF0ZSA8U29tZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUsIFNvbWVWYWx1ZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGU+IHZvaWQgcHJlVXBkYXRlRWxlbWVudE9mUmVzb3VyY2VJbnN0YW5jZVZhbGlkYXRpb25zKFVwZGF0ZURhdGFDb250YWluZXI8U29tZURhdGEsIFNvbWVWYWx1ZURhdGE+IHVwZGF0ZURhdGFDb250YWluZXIsIElDb21wb25lbnRJbnN0YW5jZUNvbm5lY3RlZEVsZW1lbnQgcmVzb3VyY2VJbnN0YW5jZVByb2VydHksCisJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIpIHsKKworCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJLy8gVmVyaWZ5IFZGQyBpbnN0YW5jZSBFeGlzdAorCQkJdmFsaWRhdGVSSUV4aXN0KHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkvLyBFeGFtcGxlOiBWZXJpZnkgUHJvcGVydHkgY29ubmVjdGVkIHRvIFZGQyBleGlzdAorCQkJdmFsaWRhdGVFbGVtZW50Q29ubmVjdGVkVG9Db21wb25lbnRFeGlzdCh1cGRhdGVEYXRhQ29udGFpbmVyLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eSwgZXJyb3JXcmFwcGVyKTsKKwkJfQorCisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkvLyBFeGFtcGxlOiBWZXJpZnkgUHJvcGVydHlWYWx1ZSBjb25uZWN0ZWQgdG8gVkZDIEluc3RhbmNlIGV4aXN0CisJCQl2YWxpZGF0ZUVsZW1lbnRDb25uZWN0ZWRUb0NvbXBvbmVudEluc3RhbmNlRXhpc3QodXBkYXRlRGF0YUNvbnRhaW5lciwgcmVzb3VyY2VJbnN0YW5jZVByb2VydHksIGVycm9yV3JhcHBlcik7CisJCX0KKworCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJLy8gRXhhbXBsZTogVmVyaWZ5IFByb3BlcnR5VmFsdWUgY29ubmVjdGVkIFByb3BlcnR5CisJCQl2YWxpZGF0ZUVsZW1lbnRDb25uZWN0ZWRUb0luc3RhbmNlKHVwZGF0ZURhdGFDb250YWluZXIsIHJlc291cmNlSW5zdGFuY2VQcm9lcnR5LCBlcnJvcldyYXBwZXIpOworCQl9CisJfQorCisJcHJpdmF0ZSA8U29tZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUsIFNvbWVWYWx1ZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGU+IHZvaWQgdmFsaWRhdGVFbGVtZW50Q29ubmVjdGVkVG9JbnN0YW5jZShVcGRhdGVEYXRhQ29udGFpbmVyPFNvbWVEYXRhLCBTb21lVmFsdWVEYXRhPiB1cGRhdGVEYXRhQ29udGFpbmVyLCBJQ29tcG9uZW50SW5zdGFuY2VDb25uZWN0ZWRFbGVtZW50IHJlc291cmNlSW5zdGFuY2VQcm9lcnR5LAorCQkJV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyKSB7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFNvbWVEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUodXBkYXRlRGF0YUNvbnRhaW5lci5nZXROb2RlVHlwZVZhbHVlKCkpLCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eS5nZXRWYWx1ZVVuaXF1ZVVpZCgpLAorCQkJCXVwZGF0ZURhdGFDb250YWluZXIuZ2V0R3JhcGhFZGdlKCksIHVwZGF0ZURhdGFDb250YWluZXIuZ2V0Tm9kZVR5cGUoKSwgdXBkYXRlRGF0YUNvbnRhaW5lci5nZXRTb21lRGF0YUNsYXNzR2VuKCkuZ2V0KCkpOworCisJCWlmIChjaGlsZC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNoaWxkLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoc3RhdHVzKTsKKworCQl9IGVsc2UgeworCQkJdXBkYXRlRGF0YUNvbnRhaW5lci5nZXREYXRhV3JhcHBlcigpLnNldElubmVyRWxlbWVudChjaGlsZC5sZWZ0KCkudmFsdWUoKS5sZWZ0KTsKKwkJfQorCX0KKworCXByaXZhdGUgPFNvbWVWYWx1ZURhdGEgZXh0ZW5kcyBHcmFwaE5vZGUsIFNvbWVEYXRhIGV4dGVuZHMgR3JhcGhOb2RlPiB2b2lkIHZhbGlkYXRlRWxlbWVudENvbm5lY3RlZFRvQ29tcG9uZW50SW5zdGFuY2VFeGlzdChVcGRhdGVEYXRhQ29udGFpbmVyPFNvbWVEYXRhLCBTb21lVmFsdWVEYXRhPiB1cGRhdGVEYXRhQ29udGFpbmVyLAorCQkJSUNvbXBvbmVudEluc3RhbmNlQ29ubmVjdGVkRWxlbWVudCByZXNvdXJjZUluc3RhbmNlUHJvZXJ0eSwgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyKSB7CisJCVN0cmluZyB2YWx1ZVVuaXF1ZVVpZCA9IHJlc291cmNlSW5zdGFuY2VQcm9lcnR5LmdldFZhbHVlVW5pcXVlVWlkKCk7CisJCWlmICh2YWx1ZVVuaXF1ZVVpZCA9PSBudWxsKSB7CisJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQl9IGVsc2UgeworCQkJRWl0aGVyPFNvbWVWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUHJvcGVydHlWYWx1ZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKHVwZGF0ZURhdGFDb250YWluZXIuZ2V0Tm9kZVR5cGVWYWx1ZSgpKSwgdmFsdWVVbmlxdWVVaWQsIHVwZGF0ZURhdGFDb250YWluZXIuZ2V0U29tZVZhbHVlRGF0YUNsYXNzR2VuKCkuZ2V0KCkpOworCQkJaWYgKGZpbmRQcm9wZXJ0eVZhbHVlUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRQcm9wZXJ0eVZhbHVlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJCX0KKwkJCQllcnJvcldyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHN0YXR1cyk7CisJCQl9IGVsc2UgeworCQkJCXVwZGF0ZURhdGFDb250YWluZXIuZ2V0VmFsdWVEYXRhV3JhcHBlcigpLnNldElubmVyRWxlbWVudChmaW5kUHJvcGVydHlWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIDxTb21lRGF0YSBleHRlbmRzIEdyYXBoTm9kZSwgU29tZVZhbHVlRGF0YSBleHRlbmRzIEdyYXBoTm9kZT4gdm9pZCB2YWxpZGF0ZUVsZW1lbnRDb25uZWN0ZWRUb0NvbXBvbmVudEV4aXN0KFVwZGF0ZURhdGFDb250YWluZXI8U29tZURhdGEsIFNvbWVWYWx1ZURhdGE+IHVwZGF0ZURhdGFDb250YWluZXIsCisJCQlJQ29tcG9uZW50SW5zdGFuY2VDb25uZWN0ZWRFbGVtZW50IHJlc291cmNlSW5zdGFuY2VFbGVtZW50Q29ubmVjdGVkLCBXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIpIHsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gcmVzb3VyY2VJbnN0YW5jZUVsZW1lbnRDb25uZWN0ZWQuZ2V0VW5pcXVlSWQoKTsKKwkJRWl0aGVyPFNvbWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFByb3BlcnR5RGVmUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUodXBkYXRlRGF0YUNvbnRhaW5lci5nZXROb2RlVHlwZSgpKSwgdW5pcXVlSWQsIHVwZGF0ZURhdGFDb250YWluZXIuZ2V0U29tZURhdGFDbGFzc0dlbigpLmdldCgpKTsKKworCQlpZiAoZmluZFByb3BlcnR5RGVmUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFByb3BlcnR5RGVmUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoc3RhdHVzKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJJRXhpc3QoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyKSB7CisJCXZhbGlkYXRlUklFeGlzdChyZXNvdXJjZUluc3RhbmNlSWQsIG51bGwsIGVycm9yV3JhcHBlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUklFeGlzdChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBXcmFwcGVyPENvbXBvbmVudEluc3RhbmNlRGF0YT4gY29tcEluc0RhdGFXcmFwcGVyLCBXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIpIHsKKwkJdmFsaWRhdGVFbGVtZW50RXhpc3RJbkdyYXBoKHJlc291cmNlSW5zdGFuY2VJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsICgpIC0+IENvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcywgY29tcEluc0RhdGFXcmFwcGVyLCBlcnJvcldyYXBwZXIpOworCX0KKworCXB1YmxpYyA8RWxlbWVudERhdGEgZXh0ZW5kcyBHcmFwaE5vZGU+IHZvaWQgdmFsaWRhdGVFbGVtZW50RXhpc3RJbkdyYXBoKFN0cmluZyBlbGVtZW50VW5pcXVlSWQsIE5vZGVUeXBlRW51bSBlbGVtZW50Tm9kZVR5cGUsIFN1cHBsaWVyPENsYXNzPEVsZW1lbnREYXRhPj4gZWxlbWVudENsYXNzR2VuLCBXcmFwcGVyPEVsZW1lbnREYXRhPiBlbGVtZW50RGF0YVdyYXBwZXIsCisJCQlXcmFwcGVyPFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlcnJvcldyYXBwZXIpIHsKKwkJRWl0aGVyPEVsZW1lbnREYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFJlc0luc3RhbmNlUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoZWxlbWVudE5vZGVUeXBlKSwgZWxlbWVudFVuaXF1ZUlkLCBlbGVtZW50Q2xhc3NHZW4uZ2V0KCkpOworCQlpZiAoZmluZFJlc0luc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFJlc0luc3RhbmNlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChlbGVtZW50RGF0YVdyYXBwZXIgIT0gbnVsbCkgeworCQkJCWVsZW1lbnREYXRhV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZmluZFJlc0luc3RhbmNlUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIGFkZCBwcm9wZXJ0eSB0byByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHBhcmFtIGluZGV4CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgYm9vbGVhbiBpc1ZhbGlkYXRlLCBJbnRlZ2VyIGluZGV4KSB7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRSZXNJbnN0YW5jZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCisJCWlmIChmaW5kUmVzSW5zdGFuY2VSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kUmVzSW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJU3RyaW5nIHByb3BlcnR5SWQgPSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0VW5pcXVlSWQoKTsKKwkJRWl0aGVyPFByb3BlcnR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRQcm9wZXJ0eURlZlJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSksIHByb3BlcnR5SWQsIFByb3BlcnR5RGF0YS5jbGFzcyk7CisKKwkJaWYgKGZpbmRQcm9wZXJ0eURlZlJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRQcm9wZXJ0eURlZlJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlTdHJpbmcgdmFsdWVVbmlxdWVVaWQgPSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKTsKKwkJaWYgKHZhbHVlVW5pcXVlVWlkID09IG51bGwpIHsKKworCQkJUHJvcGVydHlEYXRhIHByb3BlcnR5RGF0YSA9IGZpbmRQcm9wZXJ0eURlZlJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlRGF0YSByZXNvdXJjZUluc3RhbmNlRGF0YSA9IGZpbmRSZXNJbnN0YW5jZVJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQkJSW1tdXRhYmxlUGFpcjxUaXRhbk9wZXJhdGlvblN0YXR1cywgU3RyaW5nPiBpc1Byb3BlcnR5VmFsdWVFeGlzdHMgPSBwcm9wZXJ0eU9wZXJhdGlvbi5maW5kUHJvcGVydHlWYWx1ZShyZXNvdXJjZUluc3RhbmNlSWQsIHByb3BlcnR5SWQpOworCQkJaWYgKGlzUHJvcGVydHlWYWx1ZUV4aXN0cy5nZXRMZWZ0KCkgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCkgeworCQkJCWxvZy5kZWJ1ZygiVGhlIHByb3BlcnR5IHt9IGFscmVhZHkgYWRkZWQgdG8gdGhlIHJlc291cmNlIGluc3RhbmNlIHt9IiwgcHJvcGVydHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWVVbmlxdWVVaWQoaXNQcm9wZXJ0eVZhbHVlRXhpc3RzLmdldFJpZ2h0KCkpOworCQkJCUVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlID0gdXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQsIGlzVmFsaWRhdGUpOworCQkJCWlmICh1cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZS5pc1JpZ2h0KCkpIHsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJVcGRhdGVQcm9wZXJ0eVZhbHVlT25Db21wb25lbnRJbnN0YW5jZSIsICJGYWlsZWQgdG8gdXBkYXRlIHByb3BlcnR5IHZhbHVlIG9uIGluc3RhbmNlLiBTdGF0dXMgaXMgIiArIHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlLnJpZ2h0KCkudmFsdWUoKSwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQodXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJaWYgKGlzUHJvcGVydHlWYWx1ZUV4aXN0cy5nZXRMZWZ0KCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJBZnRlciBmaW5kaW5nIHByb3BlcnR5IHZhbHVlIG9mIHt9IG9uIGNvbXBvbmVudCBpbnN0YW5jZSB7fSIsIHByb3BlcnR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChpc1Byb3BlcnR5VmFsdWVFeGlzdHMuZ2V0TGVmdCgpKTsKKwkJCX0KKworCQkJU3RyaW5nIGlubmVyVHlwZSA9IG51bGw7CisKKwkJCVByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcERhdGFEZWYgPSBwcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpOworCQkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHByb3BEYXRhRGVmLmdldFR5cGUoKTsKKwkJCVN0cmluZyB2YWx1ZSA9IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZSgpOworCQkJVG9zY2FQcm9wZXJ0eVR5cGUgdHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKHByb3BlcnR5VHlwZSk7CisKKwkJCWlmICh0eXBlID09IFRvc2NhUHJvcGVydHlUeXBlLkxJU1QgfHwgdHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5NQVApIHsKKwkJCQlTY2hlbWFEZWZpbml0aW9uIGRlZiA9IHByb3BEYXRhRGVmLmdldFNjaGVtYSgpOworCQkJCWlmIChkZWYgPT0gbnVsbCkgeworCQkJCQlsb2cuZGVidWcoIlNjaGVtYSBkb2Vzbid0IGV4aXN0cyBmb3IgcHJvcGVydHkgb2YgdHlwZSB7fSIsIHR5cGUpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJCX0KKwkJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEZWYgPSBkZWYuZ2V0UHJvcGVydHkoKTsKKwkJCQlpZiAocHJvcERlZiA9PSBudWxsKSB7CisJCQkJCWxvZy5kZWJ1ZygiUHJvcGVydHkgaW4gU2NoZW1hIERlZmluaXRpb24gaW5zaWRlIHByb3BlcnR5IG9mIHR5cGUge30gZG9lc24ndCBleGlzdCIsIHR5cGUpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJCX0KKwkJCQlpbm5lclR5cGUgPSBwcm9wRGVmLmdldFR5cGUoKTsKKwkJCX0KKworCQkJbG9nLmRlYnVnKCJCZWZvcmUgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlIik7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbERhdGFUeXBlcyA9IGRhdGFUeXBlQ2FjaGUuZ2V0QWxsKCk7CisJCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbERhdGFUeXBlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJVcGRhdGVQcm9wZXJ0eVZhbHVlT25Db21wb25lbnRJbnN0YW5jZSIsICJGYWlsZWQgdG8gdXBkYXRlIHByb3BlcnR5IHZhbHVlIG9uIGluc3RhbmNlLiBTdGF0dXMgaXMgIiArIHN0YXR1cywgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJfQorCQkJRWl0aGVyPE9iamVjdCwgQm9vbGVhbj4gaXNWYWxpZCA9IHByb3BlcnR5T3BlcmF0aW9uLnZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eVR5cGUsIHZhbHVlLCBpc1ZhbGlkYXRlLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcoIkFmdGVyIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZS4gaXNWYWxpZCA9IHt9IiwgaXNWYWxpZCk7CisKKwkJCVN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlOworCQkJaWYgKGlzVmFsaWQuaXNSaWdodCgpKSB7CisJCQkJQm9vbGVhbiByZXMgPSBpc1ZhbGlkLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAocmVzID09IGZhbHNlKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlPYmplY3Qgb2JqZWN0ID0gaXNWYWxpZC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJbmV3VmFsdWUgPSBvYmplY3QudG9TdHJpbmcoKTsKKwkJCQl9CisJCQl9CisKKwkJCVN0cmluZyB1bmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eVZhbHVlVWlkKHJlc291cmNlSW5zdGFuY2VEYXRhLmdldFVuaXF1ZUlkKCksIGluZGV4KTsKKwkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gbmV3IFByb3BlcnR5VmFsdWVEYXRhKCk7CisJCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRWYWx1ZShuZXdWYWx1ZSk7CisKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIHZhbGlkYXRlQW5kVXBkYXRlUnVsZXMiKTsKKwkJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPiBwYWlyID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVSdWxlcyhwcm9wZXJ0eVR5cGUsIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5nZXRSdWxlcygpLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSwgaXNWYWxpZGF0ZSk7CisJCQlsb2cuZGVidWcoIkFmdGVyIHZhbGlkYXRlQW5kVXBkYXRlUnVsZXMuIHBhaXIgPSB7fSIsIHBhaXIpOworCQkJaWYgKHBhaXIuZ2V0UmlnaHQoKSAhPSBudWxsICYmIHBhaXIuZ2V0UmlnaHQoKSA9PSBmYWxzZSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRWYWx1ZUVycm9yKCJBZGQgcHJvcGVydHkgdmFsdWUiLCBwYWlyLmdldExlZnQoKSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHlUeXBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJfQorCQkJcHJvcGVydHlPcGVyYXRpb24uYWRkUnVsZXNUb05ld1Byb3BlcnR5VmFsdWUocHJvcGVydHlWYWx1ZURhdGEsIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCQkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIHByb3BlcnR5IHZhbHVlIHRvIGdyYXBoIHt9IiwgcHJvcGVydHlWYWx1ZURhdGEpOworCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHByb3BlcnR5VmFsdWVEYXRhLCBQcm9wZXJ0eVZhbHVlRGF0YS5jbGFzcyk7CisJCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZSB0byBncmFwaCB7fSIsIHByb3BlcnR5VmFsdWVEYXRhKTsKKworCQkJaWYgKGNyZWF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJfQorCQkJcHJvcGVydHlWYWx1ZURhdGEgPSBjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihwcm9wZXJ0eVZhbHVlRGF0YSwgcHJvcGVydHlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfSU1QTCwgbnVsbCk7CisKKwkJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkvLyBUT0RPOiBjaGFuZ2UgbG9nZ2VyCisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHByb3BlcnR5IHZhbHVlICIgKyB1bmlxdWVJZCArICIgdG8gcHJvcGVydHkgIiArIHByb3BlcnR5SWQgKyAiIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJfQorCisJCQljcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocmVzb3VyY2VJbnN0YW5jZURhdGEsIHByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfVkFMVUUsIG51bGwpOworCisJCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJLy8gVE9ETzogY2hhbmdlIGxvZ2dlcgorCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSBpbnN0YW5jZSAiICsgcmVzb3VyY2VJbnN0YW5jZUlkICsgIiBwcm9wZXJ0eSB2YWx1ZSAiICsgdW5pcXVlSWQgKyAiIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJfQorCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocHJvcGVydHlWYWx1ZURhdGEpOworCQl9IGVsc2UgeworCQkJbG9nLmVycm9yKCJwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCk7CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCBUaXRhblZlcnRleCByZXNvdXJjZUluc3RhbmNlVmVydGV4LCBib29sZWFuIGlzVmFsaWRhdGUsIEludGVnZXIgaW5kZXgsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQpIHsKKworCQlTdHJpbmcgcHJvcGVydHlJZCA9IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5nZXRVbmlxdWVJZCgpOworCQlFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFByb3BlcnR5RGVmUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlByb3BlcnR5KSwgcHJvcGVydHlJZCwgUHJvcGVydHlEYXRhLmNsYXNzKTsKKworCQlpZiAoZmluZFByb3BlcnR5RGVmUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFByb3BlcnR5RGVmUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCVN0cmluZyB2YWx1ZVVuaXF1ZVVpZCA9IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZVVuaXF1ZVVpZCgpOworCQlpZiAodmFsdWVVbmlxdWVVaWQgPT0gbnVsbCkgeworCisJCQlQcm9wZXJ0eURhdGEgcHJvcGVydHlEYXRhID0gZmluZFByb3BlcnR5RGVmUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlJbW11dGFibGVQYWlyPFRpdGFuT3BlcmF0aW9uU3RhdHVzLCBTdHJpbmc+IGlzUHJvcGVydHlWYWx1ZUV4aXN0cyA9IHByb3BlcnR5T3BlcmF0aW9uLmZpbmRQcm9wZXJ0eVZhbHVlKHJlc291cmNlSW5zdGFuY2VJZCwgcHJvcGVydHlJZCk7CisJCQlpZiAoaXNQcm9wZXJ0eVZhbHVlRXhpc3RzLmdldExlZnQoKSA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKSB7CisJCQkJbG9nLnRyYWNlKCJUaGUgcHJvcGVydHkge30gYWxyZWFkeSBhZGRlZCB0byB0aGUgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBwcm9wZXJ0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZVVuaXF1ZVVpZChpc1Byb3BlcnR5VmFsdWVFeGlzdHMuZ2V0UmlnaHQoKSk7CisJCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UgPSB1cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgaXNWYWxpZGF0ZSk7CisJCQkJaWYgKHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlLmlzUmlnaHQoKSkgeworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIlVwZGF0ZVByb3BlcnR5VmFsdWVPbkNvbXBvbmVudEluc3RhbmNlIiwgIkZhaWxlZCB0byB1cGRhdGUgcHJvcGVydHkgdmFsdWUgb24gaW5zdGFuY2UuIFN0YXR1cyBpcyAiICsgdXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh1cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJCX0KKworCQkJaWYgKGlzUHJvcGVydHlWYWx1ZUV4aXN0cy5nZXRMZWZ0KCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLnRyYWNlKCJBZnRlciBmaW5kaW5nIHByb3BlcnR5IHZhbHVlIG9mIHt9IG9uIGNvbXBvbmVuZXQgaW5zdGFuY2Uge30iLCBwcm9wZXJ0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoaXNQcm9wZXJ0eVZhbHVlRXhpc3RzLmdldExlZnQoKSk7CisJCQl9CisKKwkJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCisJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEYXRhRGVmID0gcHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKTsKKwkJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wRGF0YURlZi5nZXRUeXBlKCk7CisJCQlTdHJpbmcgdmFsdWUgPSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWUoKTsKKwkJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZShwcm9wZXJ0eVR5cGUpOworCisJCQlpZiAodHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5MSVNUIHx8IHR5cGUgPT0gVG9zY2FQcm9wZXJ0eVR5cGUuTUFQKSB7CisJCQkJU2NoZW1hRGVmaW5pdGlvbiBkZWYgPSBwcm9wRGF0YURlZi5nZXRTY2hlbWEoKTsKKwkJCQlpZiAoZGVmID09IG51bGwpIHsKKwkJCQkJbG9nLmRlYnVnKCJTY2hlbWEgZG9lc24ndCBleGlzdHMgZm9yIHByb3BlcnR5IG9mIHR5cGUge30iLCB0eXBlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCQl9CisJCQkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwcm9wRGVmID0gZGVmLmdldFByb3BlcnR5KCk7CisJCQkJaWYgKHByb3BEZWYgPT0gbnVsbCkgeworCQkJCQlsb2cuZGVidWcoIlByb3BlcnR5IGluIFNjaGVtYSBEZWZpbml0aW9uIGluc2lkZSBwcm9wZXJ0eSBvZiB0eXBlIHt9IGRvZXNuJ3QgZXhpc3QiLCB0eXBlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCQl9CisJCQkJaW5uZXJUeXBlID0gcHJvcERlZi5nZXRUeXBlKCk7CisJCQl9CisKKwkJCWxvZy50cmFjZSgiQmVmb3JlIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZSIpOworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBkYXRhVHlwZUNhY2hlLmdldEFsbCgpOworCQkJaWYgKGFsbERhdGFUeXBlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiVXBkYXRlUHJvcGVydHlWYWx1ZU9uQ29tcG9uZW50SW5zdGFuY2UiLCAiRmFpbGVkIHRvIHVwZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBvbiBpbnN0YW5jZS4gU3RhdHVzIGlzICIgKyBzdGF0dXMsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJCUVpdGhlcjxPYmplY3QsIEJvb2xlYW4+IGlzVmFsaWQgPSBwcm9wZXJ0eU9wZXJhdGlvbi52YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5VmFsdWUocHJvcGVydHlUeXBlLCB2YWx1ZSwgaXNWYWxpZGF0ZSwgaW5uZXJUeXBlLCBhbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCkpOworCQkJbG9nLnRyYWNlKCJBZnRlciB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5VmFsdWUuIGlzVmFsaWQgPSB7fSIsIGlzVmFsaWQpOworCisJCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZTsKKwkJCWlmIChpc1ZhbGlkLmlzUmlnaHQoKSkgeworCQkJCUJvb2xlYW4gcmVzID0gaXNWYWxpZC5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHJlcyA9PSBmYWxzZSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJT2JqZWN0IG9iamVjdCA9IGlzVmFsaWQubGVmdCgpLnZhbHVlKCk7CisJCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7CisJCQkJCW5ld1ZhbHVlID0gb2JqZWN0LnRvU3RyaW5nKCk7CisJCQkJfQorCQkJfQorCisJCQlTdHJpbmcgdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXNvdXJjZUluc3RhbmNlUHJvcGVydHlWYWx1ZVVpZChyZXNvdXJjZUluc3RhbmNlSWQsIGluZGV4KTsKKwkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gbmV3IFByb3BlcnR5VmFsdWVEYXRhKCk7CisJCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRWYWx1ZShuZXdWYWx1ZSk7CisKKwkJCWxvZy50cmFjZSgiQmVmb3JlIHZhbGlkYXRlQW5kVXBkYXRlUnVsZXMiKTsKKwkJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPiBwYWlyID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVSdWxlcyhwcm9wZXJ0eVR5cGUsIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5nZXRSdWxlcygpLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSwgaXNWYWxpZGF0ZSk7CisJCQlsb2cuZGVidWcoIkFmdGVyIHZhbGlkYXRlQW5kVXBkYXRlUnVsZXMuIHBhaXIgPSB7fSIsIHBhaXIpOworCQkJaWYgKHBhaXIuZ2V0UmlnaHQoKSAhPSBudWxsICYmIHBhaXIuZ2V0UmlnaHQoKSA9PSBmYWxzZSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRWYWx1ZUVycm9yKCJBZGQgcHJvcGVydHkgdmFsdWUiLCBwYWlyLmdldExlZnQoKSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHlUeXBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJfQorCQkJcHJvcGVydHlPcGVyYXRpb24uYWRkUnVsZXNUb05ld1Byb3BlcnR5VmFsdWUocHJvcGVydHlWYWx1ZURhdGEsIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKworCQkJbG9nLnRyYWNlKCJCZWZvcmUgYWRkaW5nIHByb3BlcnR5IHZhbHVlIHRvIGdyYXBoIHt9IiwgcHJvcGVydHlWYWx1ZURhdGEpOworCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHByb3BlcnR5VmFsdWVEYXRhLCBQcm9wZXJ0eVZhbHVlRGF0YS5jbGFzcyk7CisJCQlsb2cudHJhY2UoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZSB0byBncmFwaCB7fSIsIHByb3BlcnR5VmFsdWVEYXRhKTsKKworCQkJaWYgKGNyZWF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJfQorCQkJcHJvcGVydHlWYWx1ZURhdGEgPSBjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihwcm9wZXJ0eVZhbHVlRGF0YSwgcHJvcGVydHlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfSU1QTCwgbnVsbCk7CisKKwkJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkvLyBUT0RPOiBjaGFuZ2UgbG9nZ2VyCisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHByb3BlcnR5IHZhbHVlICIgKyB1bmlxdWVJZCArICIgdG8gcHJvcGVydHkgIiArIHByb3BlcnR5SWQgKyAiIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJfQorCisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlZGdlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZUVkZ2UocmVzb3VyY2VJbnN0YW5jZVZlcnRleCwgcHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9WQUxVRSwgbnVsbCk7CisKKwkJCWlmICghZWRnZVJlc3VsdC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHJlc291cmNlIGluc3RhbmNlICIgKyByZXNvdXJjZUluc3RhbmNlSWQgKyAiIHByb3BlcnR5IHZhbHVlICIgKyB1bmlxdWVJZCArICIgaW4gZ3JhcGguIHN0YXR1cyBpcyAiICsgZWRnZVJlc3VsdCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChlZGdlUmVzdWx0KTsKKwkJCX0KKworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eVZhbHVlUmVzdWx0ID0gcHJvcGVydHlPcGVyYXRpb24uYnVpbGRSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkocHJvcGVydHlWYWx1ZURhdGEsIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSk7CisJCQlsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgaXMge30iLCBwcm9wZXJ0eVZhbHVlUmVzdWx0KTsKKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHByb3BlcnR5VmFsdWVSZXN1bHQpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIGFkZCBwcm9wZXJ0eSB0byByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHBhcmFtIGluZGV4CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8SW5wdXRWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRJbnB1dFRvUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZUlucHV0IHJlc291cmNlSW5zdGFuY2VJbnB1dCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgSW50ZWdlciBpbmRleCkgeworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUmVzSW5zdGFuY2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKworCQlpZiAoZmluZFJlc0luc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFJlc0luc3RhbmNlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCVN0cmluZyBwcm9wZXJ0eUlkID0gcmVzb3VyY2VJbnN0YW5jZUlucHV0LmdldFVuaXF1ZUlkKCk7CisJCUVpdGhlcjxJbnB1dHNEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFByb3BlcnR5RGVmUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLklucHV0KSwgcHJvcGVydHlJZCwgSW5wdXRzRGF0YS5jbGFzcyk7CisKKwkJaWYgKGZpbmRQcm9wZXJ0eURlZlJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRQcm9wZXJ0eURlZlJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlTdHJpbmcgdmFsdWVVbmlxdWVVaWQgPSByZXNvdXJjZUluc3RhbmNlSW5wdXQuZ2V0VmFsdWVVbmlxdWVVaWQoKTsKKwkJaWYgKHZhbHVlVW5pcXVlVWlkID09IG51bGwpIHsKKworCQkJSW5wdXRzRGF0YSBwcm9wZXJ0eURhdGEgPSBmaW5kUHJvcGVydHlEZWZSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlRGF0YSByZXNvdXJjZUluc3RhbmNlRGF0YSA9IGZpbmRSZXNJbnN0YW5jZVJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQkJSW1tdXRhYmxlUGFpcjxUaXRhbk9wZXJhdGlvblN0YXR1cywgU3RyaW5nPiBpc0lucHV0VmFsdWVFeGlzdHMgPSBpbnB1dE9wZXJhdGlvbi5maW5kSW5wdXRWYWx1ZShyZXNvdXJjZUluc3RhbmNlSWQsIHByb3BlcnR5SWQpOworCQkJaWYgKGlzSW5wdXRWYWx1ZUV4aXN0cy5nZXRMZWZ0KCkgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCkgeworCQkJCWxvZy5kZWJ1ZygiVGhlIHByb3BlcnR5IHt9IGFscmVhZHkgYWRkZWQgdG8gdGhlIHJlc291cmNlIGluc2FuY2Uge30iLCBwcm9wZXJ0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJCXJlc291cmNlSW5zdGFuY2VJbnB1dC5zZXRWYWx1ZVVuaXF1ZVVpZChpc0lucHV0VmFsdWVFeGlzdHMuZ2V0UmlnaHQoKSk7CisJCQkJLyoKKwkJCQkgKiBFaXRoZXI8SW5wdXRWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZSA9IHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VJbnB1dCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsgaWYgKHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlLmlzUmlnaHQoKSkgeworCQkJCSAqIEJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvciggIlVwZGF0ZVByb3BlcnR5VmFsdWVPbkNvbXBvbmVudEluc3RhbmNlIiwgIkZhaWxlZCB0byB1cGRhdGUgcHJvcGVydHkgdmFsdWUgb24gaW5zdGFuY2UuIFN0YXR1cyBpcyAiICsgdXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkgKiByZXR1cm4gRWl0aGVyLnJpZ2h0KHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlLnJpZ2h0KCkudmFsdWUoKSApOyB9IHJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZS5sZWZ0KCkudmFsdWUoKSk7CisJCQkJICovCisJCQl9CisKKwkJCWlmIChpc0lucHV0VmFsdWVFeGlzdHMuZ2V0TGVmdCgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZmluZGluZyBpbnB1dCB2YWx1ZSBvZiB7fSBvbiBjb21wbmVudCBpbnN0YW5jZSB7fSIsIHByb3BlcnR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChpc0lucHV0VmFsdWVFeGlzdHMuZ2V0TGVmdCgpKTsKKwkJCX0KKworCQkJU3RyaW5nIGlubmVyVHlwZSA9IG51bGw7CisKKwkJCVByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcERhdGFEZWYgPSBwcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpOworCQkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHByb3BEYXRhRGVmLmdldFR5cGUoKTsKKwkJCVN0cmluZyB2YWx1ZSA9IHJlc291cmNlSW5zdGFuY2VJbnB1dC5nZXRWYWx1ZSgpOworCQkJVG9zY2FQcm9wZXJ0eVR5cGUgdHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKHByb3BlcnR5VHlwZSk7CisKKwkJCWlmICh0eXBlID09IFRvc2NhUHJvcGVydHlUeXBlLkxJU1QgfHwgdHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5NQVApIHsKKwkJCQlTY2hlbWFEZWZpbml0aW9uIGRlZiA9IHByb3BEYXRhRGVmLmdldFNjaGVtYSgpOworCQkJCWlmIChkZWYgPT0gbnVsbCkgeworCQkJCQlsb2cuZGVidWcoIlNjaGVtYSBkb2Vzbid0IGV4aXN0cyBmb3IgcHJvcGVydHkgb2YgdHlwZSB7fSIsIHR5cGUpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJCX0KKwkJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEZWYgPSBkZWYuZ2V0UHJvcGVydHkoKTsKKwkJCQlpZiAocHJvcERlZiA9PSBudWxsKSB7CisJCQkJCWxvZy5kZWJ1ZygiUHJvcGVydHkgaW4gU2NoZW1hIERlZmluaXRpb24gaW5zaWRlIHByb3BlcnR5IG9mIHR5cGUge30gZG9lc24ndCBleGlzdHMiLCB0eXBlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKwkJCQl9CisJCQkJaW5uZXJUeXBlID0gcHJvcERlZi5nZXRUeXBlKCk7CisJCQl9CisKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZSIpOworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBkYXRhVHlwZUNhY2hlLmdldEFsbCgpOworCQkJaWYgKGFsbERhdGFUeXBlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiVXBkYXRlUHJvcGVydHlWYWx1ZU9uQ29tcG9uZW50SW5zdGFuY2UiLCAiRmFpbGVkIHRvIHVwZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBvbiBpbnN0YW5jZS4gU3RhdHVzIGlzICIgKyBzdGF0dXMsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJLy8JRWl0aGVyPE9iamVjdCwgQm9vbGVhbj4gaXNWYWxpZCA9IHByb3BlcnR5T3BlcmF0aW9uLnZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eVR5cGUsIHZhbHVlLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCS8vCWxvZy5kZWJ1ZygiQWZ0ZXIgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlLiBpc1ZhbGlkID0ge30iLCBpc1ZhbGlkKTsKKworCQkJLypTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZTsKKwkJCWlmIChpc1ZhbGlkLmlzUmlnaHQoKSkgeworCQkJCUJvb2xlYW4gcmVzID0gaXNWYWxpZC5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHJlcyA9PSBmYWxzZSkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJT2JqZWN0IG9iamVjdCA9IGlzVmFsaWQubGVmdCgpLnZhbHVlKCk7CisJCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7CisJCQkJCW5ld1ZhbHVlID0gb2JqZWN0LnRvU3RyaW5nKCk7CisJCQkJfQorCQkJfSovCisKKwkJCVN0cmluZyB1bmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlSW5zdGFuY2VJbnB1dFZhbHVlVWlkKHJlc291cmNlSW5zdGFuY2VEYXRhLmdldFVuaXF1ZUlkKCksIGluZGV4KTsKKwkJCUlucHV0VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gbmV3IElucHV0VmFsdWVEYXRhKCk7CisJCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRWYWx1ZSh2YWx1ZSk7CisKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIHZhbGlkYXRlQW5kVXBkYXRlUnVsZXMiKTsKKwkJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPiBwYWlyID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVSdWxlcyhwcm9wZXJ0eVR5cGUsIHJlc291cmNlSW5zdGFuY2VJbnB1dC5nZXRSdWxlcygpLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSwgdHJ1ZSk7CisJCQlsb2cuZGVidWcoIkFmdGVyIHZhbGlkYXRlQW5kVXBkYXRlUnVsZXMuIHBhaXIgPSB7fSIsIHBhaXIpOworCQkJaWYgKHBhaXIuZ2V0UmlnaHQoKSAhPSBudWxsICYmIHBhaXIuZ2V0UmlnaHQoKSA9PSBmYWxzZSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRWYWx1ZUVycm9yKCJBZGQgcHJvcGVydHkgdmFsdWUiLCBwYWlyLmdldExlZnQoKSwgcmVzb3VyY2VJbnN0YW5jZUlucHV0LmdldE5hbWUoKSwgcHJvcGVydHlUeXBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJfQorCQkJLy8gcHJvcGVydHlPcGVyYXRpb24uYWRkUnVsZXNUb05ld1Byb3BlcnR5VmFsdWUocHJvcGVydHlWYWx1ZURhdGEsCisJCQkvLyByZXNvdXJjZUluc3RhbmNlSW5wdXQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZSB0byBncmFwaCB7fSIsIHByb3BlcnR5VmFsdWVEYXRhKTsKKwkJCUVpdGhlcjxJbnB1dFZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9wZXJ0eVZhbHVlRGF0YSwgSW5wdXRWYWx1ZURhdGEuY2xhc3MpOworCQkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcHJvcGVydHkgdmFsdWUgdG8gZ3JhcGgge30iLCBwcm9wZXJ0eVZhbHVlRGF0YSk7CisKKwkJCWlmIChjcmVhdGVOb2RlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJCX0KKworCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocHJvcGVydHlWYWx1ZURhdGEsIHByb3BlcnR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOUFVUX0lNUEwsIG51bGwpOworCisJCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJLy8gVE9ETzogY2hhbmdlIGxvZ2dlcgorCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSBwcm9wZXJ0eSB2YWx1ZSB7fSB0byBwcm9wZXJ0eSB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHByb3BlcnR5SWQsIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJfQorCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMxID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJCXByb3BlcnRpZXMxLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIHJlc291cmNlSW5zdGFuY2VEYXRhLmdldENvbXBvbmVudEluc3REYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisJCQlwcm9wZXJ0aWVzMS5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuT1dORVJfSUQuZ2V0UHJvcGVydHkoKSwgcmVzb3VyY2VJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCWNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihyZXNvdXJjZUluc3RhbmNlRGF0YSwgcHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZUxhYmVscy5JTlBVVF9WQUxVRSwgcHJvcGVydGllczEpOworCisJCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCS8vIFRPRE86IGNoYW5nZSBsb2dnZXIKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2UgaW5zdGFuY2Uge30gcHJvcGVydHkgdmFsdWUge30gaW4gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgdW5pcXVlSWQsIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCisJCQl9CisKKwkJCS8vIGlucHV0T3BlcmF0aW9uLmFzc29jaWF0ZVByb3BlcnR5VG9JbnB1dChyZXNvdXJjZUluc3RhbmNlSWQsCisJCQkvLyByZXNvdXJjZUluc3RhbmNlSW5wdXQuZ2V0SW5wdXRJZCgpLCBwcm9wZXJ0eVZhbHVlRGF0YSwKKwkJCS8vIHJlc291cmNlSW5zdGFuY2VJbnB1dC5nZXROYW1lKCkpOworCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlTm9kZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCX0gZWxzZSB7CisJCQlsb2cuZXJyb3IoInByb3BlcnR5IHZhbHVlIGFscmVhZHkgZXhpc3RzLiIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQXR0cmlidXRlVmFsdWVUb1Jlc291cmNlSW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUgcmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgSW50ZWdlciBpbmRleCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8QXR0cmlidXRlVmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gdGhpcy5hZGRBdHRyaWJ1dGVUb1Jlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBpbmRleCk7CisKKwkJCWlmIChlaXRoZXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGF0dHJpYnV0ZSB2YWx1ZSB7fSB0byByZXNvdXJjZSBpbnN0YW5jZSB7fSBpbiBHcmFwaC4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlaXRoZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCUF0dHJpYnV0ZVZhbHVlRGF0YSBhdHRyaWJ1dGVWYWx1ZURhdGEgPSBlaXRoZXJTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSBhdHRyaWJ1dGVWYWx1ZVJlc3VsdCA9IGF0dHJpYnV0ZU9wZXJhdGlvbi5idWlsZFJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUoYXR0cmlidXRlVmFsdWVEYXRhLCByZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlKTsKKwkJCQlsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBSZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlIGlzIHt9IiwgYXR0cmlidXRlVmFsdWVSZXN1bHQpOworCisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoYXR0cmlidXRlVmFsdWVSZXN1bHQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKworCQlmaW5hbGx5IHsKKwkJCWhhbmRsZVRyYW5zYWN0aW9uQ29tbWl0Um9sbGJhY2soaW5UcmFuc2FjdGlvbiwgcmVzdWx0KTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VBdHRyaWJ1dGUsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUF0dHJpYnV0ZVZhbHVlSW5SZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJRWl0aGVyPEF0dHJpYnV0ZVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckF0dHJpYnV0ZVZhbHVlID0gdXBkYXRlQXR0cmlidXRlT2ZSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJCWlmIChlaXRoZXJBdHRyaWJ1dGVWYWx1ZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgYXR0cmlidXRlIHZhbHVlIHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9IGluIEdyYXBoLiBzdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlQXR0cmlidXRlLCByZXNvdXJjZUluc3RhbmNlSWQsIGVpdGhlckF0dHJpYnV0ZVZhbHVlLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlckF0dHJpYnV0ZVZhbHVlLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCUF0dHJpYnV0ZVZhbHVlRGF0YSBhdHRyaWJ1dGVWYWx1ZURhdGEgPSBlaXRoZXJBdHRyaWJ1dGVWYWx1ZS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCUNvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlIGF0dHJpYnV0ZVZhbHVlUmVzdWx0ID0gYXR0cmlidXRlT3BlcmF0aW9uLmJ1aWxkUmVzb3VyY2VJbnN0YW5jZUF0dHJpYnV0ZShhdHRyaWJ1dGVWYWx1ZURhdGEsIHJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUpOworCQkJCWxvZy5kZWJ1ZygiVGhlIHJldHVybmVkIFJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGUgaXMge30iLCBhdHRyaWJ1dGVWYWx1ZVJlc3VsdCk7CisKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChhdHRyaWJ1dGVWYWx1ZVJlc3VsdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCisJCWZpbmFsbHkgeworCQkJaGFuZGxlVHJhbnNhY3Rpb25Db21taXRSb2xsYmFjayhpblRyYW5zYWN0aW9uLCByZXN1bHQpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VmFsdWVUb1Jlc291cmNlSW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIEludGVnZXIgaW5kZXgsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gYWRkUHJvcGVydHlWYWx1ZVRvUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgdHJ1ZSwgaW5kZXgsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlWYWx1ZVRvUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgYm9vbGVhbiBpc1ZhbGlkYXRlLCBJbnRlZ2VyIGluZGV4LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQkvLy8gI1JVTEVTIFNVUFBPUlQKKwkJLy8vIElnbm9yZSBydWxlcyByZWNlaXZlZCBmcm9tIGNsaWVudCB0aWxsIHN1cHBvcnQKKwkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFJ1bGVzKG51bGwpOworCQkvLy8KKwkJLy8vCisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQsIGlzVmFsaWRhdGUsIGluZGV4KTsKKworCQkJaWYgKGVpdGhlclN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcHJvcGVydHkgdmFsdWUge30gdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30gaW4gR3JhcGguIHN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlaXRoZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gZWl0aGVyU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eVZhbHVlUmVzdWx0ID0gcHJvcGVydHlPcGVyYXRpb24uYnVpbGRSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkocHJvcGVydHlWYWx1ZURhdGEsIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSk7CisJCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5IGlzIHt9IiwgcHJvcGVydHlWYWx1ZVJlc3VsdCk7CisKKwkJCQlFaXRoZXI8U3RyaW5nLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZERlZmF1bHRWYWx1ZSA9IHByb3BlcnR5T3BlcmF0aW9uLmZpbmREZWZhdWx0VmFsdWVGcm9tU2Vjb25kUG9zaXRpb24ocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFBhdGgoKSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFVuaXF1ZUlkKCksIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5nZXREZWZhdWx0VmFsdWUoKSk7CisJCQkJaWYgKGZpbmREZWZhdWx0VmFsdWUuaXNSaWdodCgpKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGZpbmREZWZhdWx0VmFsdWUucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBmaW5kRGVmYXVsdFZhbHVlLmxlZnQoKS52YWx1ZSgpOworCQkJCXByb3BlcnR5VmFsdWVSZXN1bHQuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisJCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgZGVmYXVsdCB2YWx1ZSBpbiBSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgaXMge30iLCBkZWZhdWx0VmFsdWUpOworCisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocHJvcGVydHlWYWx1ZVJlc3VsdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCisJCWZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VJbnB1dCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkSW5wdXRWYWx1ZVRvUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZUlucHV0IHJlc291cmNlSW5zdGFuY2VJbnB1dCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgSW50ZWdlciBpbmRleCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJLy8vICNSVUxFUyBTVVBQT1JUCisJCS8vLyBJZ25vcmUgcnVsZXMgcmVjZWl2ZWQgZnJvbSBjbGllbnQgdGlsbCBzdXBwb3J0CisJCXJlc291cmNlSW5zdGFuY2VJbnB1dC5zZXRSdWxlcyhudWxsKTsKKwkJLy8vCisJCS8vLworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUlucHV0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxJbnB1dFZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclN0YXR1cyA9IGFkZElucHV0VG9SZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VJbnB1dCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBpbmRleCk7CisKKwkJCWlmIChlaXRoZXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGlucHV0IHZhbHVlIHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9IGluIEdyYXBoLiBzdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlSW5wdXQsIHJlc291cmNlSW5zdGFuY2VJZCwgZWl0aGVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfSBlbHNlIHsKKwkJCQlJbnB1dFZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSA9IGVpdGhlclN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJCUNvbXBvbmVudEluc3RhbmNlSW5wdXQgcHJvcGVydHlWYWx1ZVJlc3VsdCA9IGlucHV0T3BlcmF0aW9uLmJ1aWxkUmVzb3VyY2VJbnN0YW5jZUlucHV0KHByb3BlcnR5VmFsdWVEYXRhLCByZXNvdXJjZUluc3RhbmNlSW5wdXQpOworCQkJCWxvZy5kZWJ1ZygiVGhlIHJldHVybmVkIFJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSBpcyB7fSIsIHByb3BlcnR5VmFsdWVSZXN1bHQpOworCisJCQkJRWl0aGVyPFN0cmluZywgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmREZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eU9wZXJhdGlvbi5maW5kRGVmYXVsdFZhbHVlRnJvbVNlY29uZFBvc2l0aW9uKHJlc291cmNlSW5zdGFuY2VJbnB1dC5nZXRQYXRoKCksIHJlc291cmNlSW5zdGFuY2VJbnB1dC5nZXRVbmlxdWVJZCgpLCByZXNvdXJjZUluc3RhbmNlSW5wdXQuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJCWlmIChmaW5kRGVmYXVsdFZhbHVlLmlzUmlnaHQoKSkgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhmaW5kRGVmYXVsdFZhbHVlLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZmluZERlZmF1bHRWYWx1ZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlwcm9wZXJ0eVZhbHVlUmVzdWx0LnNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOworCQkJCWxvZy5kZWJ1ZygiVGhlIHJldHVybmVkIGRlZmF1bHQgdmFsdWUgaW4gUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5IGlzIHt9IiwgZGVmYXVsdFZhbHVlKTsKKworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHByb3BlcnR5VmFsdWVSZXN1bHQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKworCQlmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2VzLCBNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4+IGFscmVhZHlQcm9jZXNzZWRSZXNvdXJjZXMsCisJCQlNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiByZXNvdXJjZUluc3RhbmNlc1Byb3BlcnRpZXMsIE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2UsIEludGVnZXI+PiBwcm9jZXNzZWRJbnN0YW5jZXMsIExpc3Q8U3RyaW5nPiBwYXRoKSB7CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlIDogcmVzb3VyY2VJbnN0YW5jZXMpIHsKKworCQkJcGF0aC5hZGQoY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcyA9IGdldENvbXBvbmVudEluc3RhbmNlUHJvcGVydGllcyhjb21wb25lbnRJbnN0YW5jZSwgYWxyZWFkeVByb2Nlc3NlZFJlc291cmNlcywgcmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzLCBwcm9jZXNzZWRJbnN0YW5jZXMsIHBhdGgpOworCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJfQorCQkJfQorCisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGNvbXBJbnN0YW5jZVByb3BlcnR5TGlzdCA9IGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoY29tcEluc3RhbmNlUHJvcGVydHlMaXN0ICE9IG51bGwpIHsKKwkJCQlyZXN1bHQuYWRkQWxsKGNvbXBJbnN0YW5jZVByb3BlcnR5TGlzdCk7CisJCQl9CisKKwkJCVN0cmluZyB1bmlxdWVJZCA9IGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCk7CisJCQlpZiAoZmFsc2UgPT0gcHJvY2Vzc2VkSW5zdGFuY2VzLmNvbnRhaW5zS2V5KHVuaXF1ZUlkKSkgeworCQkJCXByb2Nlc3NlZEluc3RhbmNlcy5wdXQodW5pcXVlSWQsIG5ldyBJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBJbnRlZ2VyPihjb21wb25lbnRJbnN0YW5jZSwgcGF0aC5zaXplKCkpKTsKKwkJCX0KKwkJCXBhdGgucmVtb3ZlKHBhdGguc2l6ZSgpIC0gMSk7CisKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEluc3RhbmNlUHJvcGVydGllcyhDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlLCBNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4+IGFscmVhZHlQcm9jZXNzZWRSZXNvdXJjZXMsCisJCQlNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiBhbHJlYWR5UHJvY2Vzc2VkSW5zdGFuY2VzLCBNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBJbnRlZ2VyPj4gcHJvY2Vzc2VkSW5zdGFuY2VzLCBMaXN0PFN0cmluZz4gcGF0aCkgeworCisJCS8vIDEuIEdvIG92ZXIgZWFjaCBpbnN0YW5jZQorCQkvLyAxLjEgZ2V0IGFsbCBwcm9wZXJ0aWVzIG9mIGZyb20gdGhlIHBhcmVudHMgb2YgdGhlIGluc3RhbmNlCisJCS8vIDEuMiBnZXQgYWxsIHVwZGF0ZWQgcHJvcGVydGllcworCQkvLyAxLjMgZmluZCBhbGwgaW5zdGFuY2VzIGluY2x1ZGVkIGluIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnN0YW5jZSBhbmQKKwkJLy8gcnVuIHRoaXMgbWV0aG9kIG9uIHRoZW0uCisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gdXBkYXRlIHByb3BlcnRpZXMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQlTdHJpbmcgcmVzb3VyY2VVaWQgPSByZXNvdXJjZUluc3RhbmNlLmdldENvbXBvbmVudFVpZCgpOworCisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gYWxyZWFkeVByb2Nlc3NlZFJlc291cmNlcy5nZXQocmVzb3VyY2VVaWQpOworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7CisJCQlwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsUmVzID0gcHJvcGVydHlPcGVyYXRpb24uZmluZEFsbFJlc291cmNlUHJvcGVydGllc1JlY3Vyc2l2ZWx5KHJlc291cmNlVWlkLCBwcm9wZXJ0aWVzKTsKKwkJCWlmIChmaW5kQWxsUmVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChmaW5kQWxsUmVzKTsKKwkJCX0KKwkJCWFscmVhZHlQcm9jZXNzZWRSZXNvdXJjZXMucHV0KHJlc291cmNlVWlkLCBwcm9wZXJ0aWVzKTsKKwkJfQorCisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZ2V0dGluZyBwcm9wZXJ0aWVzIG9mIHJlc291cmNlIHt9IC4gTnVtYmVyIG9mIHByb3BlcnRpZXMgaXMge30iLCByZXNvdXJjZVVpZCwgKHByb3BlcnRpZXMgPT0gbnVsbCA/IDAgOiBwcm9wZXJ0aWVzLnNpemUoKSkpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKGZhbHNlID09IHByb3BlcnRpZXMuaXNFbXB0eSgpKSB7CisKKwkJCS8vIFRPRE86IFdFIE1BWSBIQVZFIElORElSRUNUIFBST1BFUlRZIFZBTFVFIEFMU08gSU4gQ0FTRSBOTworCQkJLy8gUFJPUEVSVFkgT04gVEhJUyBDT01QT05FTlQKKworCQkJLy8gU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVaWQgPSByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA6IHByb3BlcnRpZXMpIHsKKworCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7CisJCQkJU3RyaW5nIHZhbHVlID0gZGVmYXVsdFZhbHVlOworCQkJCVN0cmluZyB2YWx1ZVVpZCA9IG51bGw7CisKKwkJCQkvLyBTdHJpbmcgcHJvcGVydHlJZCA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCisJCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eShwcm9wZXJ0eURlZmluaXRpb24sIHZhbHVlLCB2YWx1ZVVpZCk7CisKKwkJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0UGF0aChjbG9uZUxpc3QocGF0aCkpOworCisJCQkJLy8gVE9ETzogY3VycmVudGx5IGlnbm9yZSBjb25zdHJhaW50cyBzaW5jZSB0aGV5IGFyZSBub3QgaW51c2UKKwkJCQkvLyBhbmQgY2F1c2UgdG8gZXJyb3IgaW4gY29udmVydGlvbiB0byBvYmplY3QuCisJCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldENvbnN0cmFpbnRzKG51bGwpOworCisJCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5TGlzdC5hZGQocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KTsKKworCQkJfQorCisJCX0KKworCQlPcmlnaW5UeXBlRW51bSBvcmlnaW5UeXBlID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRPcmlnaW5UeXBlKCk7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZEluc3RhbmNlc1VuZGVyUGFyZW50T2ZJbnN0YW5jZSA9IGZpbmRJbnN0YW5jZXNVbmRlclBhcmVudE9mSW5zdGFuY2Uob3JpZ2luVHlwZSwgcmVzb3VyY2VVaWQpOworCisJCWlmIChmaW5kSW5zdGFuY2VzVW5kZXJQYXJlbnRPZkluc3RhbmNlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZEluc3RhbmNlc1VuZGVyUGFyZW50T2ZJbnN0YW5jZS5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGxpc3RPZkluc3RhbmNlcyA9IGZpbmRJbnN0YW5jZXNVbmRlclBhcmVudE9mSW5zdGFuY2UubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMgPSBnZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKGxpc3RPZkluc3RhbmNlcywgYWxyZWFkeVByb2Nlc3NlZFJlc291cmNlcywgYWxyZWFkeVByb2Nlc3NlZEluc3RhbmNlcywgcHJvY2Vzc2VkSW5zdGFuY2VzLCBwYXRoKTsKKwkJCWlmIChjb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCX0KKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gY3VycmVudExpc3QgPSBjb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKGN1cnJlbnRMaXN0ICE9IG51bGwpIHsKKwkJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHlMaXN0LmFkZEFsbChjdXJyZW50TGlzdCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5TGlzdCk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRJbnN0YW5jZXNVbmRlclBhcmVudE9mSW5zdGFuY2UoT3JpZ2luVHlwZUVudW0gb3JpZ2luVHlwZSwgU3RyaW5nIHJlc291cmNlVWlkKSB7CisKKwkJTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlID0gbnVsbDsKKwkJTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUgPSBudWxsOworCisJCXN3aXRjaCAob3JpZ2luVHlwZSkgeworCisJCWNhc2UgVkY6CisJCQljb250YWluZXJOb2RlVHlwZSA9IE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwkJCWNvbXBJbnN0Tm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uUmVzb3VyY2U7CisJCQlicmVhazsKKwkJY2FzZSBTRVJWSUNFOgorCQkJY29udGFpbmVyTm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uU2VydmljZTsKKwkJCWNvbXBJbnN0Tm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uUmVzb3VyY2U7CisJCQlicmVhazsKKwkJY2FzZSBQUk9EVUNUOgorCQkJY29udGFpbmVyTm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uUHJvZHVjdDsKKwkJCWNvbXBJbnN0Tm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uU2VydmljZTsKKwkJY2FzZSBWRkM6CisJCWNhc2UgVkw6CisJCWNhc2UgQ1A6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvbnRhaW5lck5vZGVUeXBlID09IG51bGwgfHwgY29tcEluc3ROb2RlVHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudChyZXNvdXJjZVVpZCwgY29udGFpbmVyTm9kZVR5cGUsIGNvbXBJbnN0Tm9kZVR5cGUpOworCisJCWlmIChjb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZ2V0dGluZyBpbnN0YW5jZXMgb2Yge30gIGZyb20gdHlwZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VVaWQsIG9yaWdpblR5cGUsIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBsaXN0T2ZJbnN0YW5jZXMgPSBjb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKS5nZXRMZWZ0KCk7CisJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlTdHJpbmcgbXNnID0gIkFmdGVyIGdldHRpbmcgaW5zdGFuY2VzIG9mIHt9ICBmcm9tIHR5cGUge30gICB7fS4iOworCQkJCWxvZy5kZWJ1Zyhtc2csIHJlc291cmNlVWlkLCBvcmlnaW5UeXBlLCAobGlzdE9mSW5zdGFuY2VzICE9IG51bGwgPyBsaXN0T2ZJbnN0YW5jZXMuc2l6ZSgpIDogMCkpOworCQkJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKwkJCQkJbG9nLnRyYWNlKG1zZywgcmVzb3VyY2VVaWQsIG9yaWdpblR5cGUsIGxpc3RPZkluc3RhbmNlcyk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQobGlzdE9mSW5zdGFuY2VzKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gY2xvbmVMaXN0KExpc3Q8U3RyaW5nPiBsaXN0KSB7CisKKwkJaWYgKGxpc3QgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlMaXN0PFN0cmluZz4gY2xvbmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY2xvbmVkTGlzdC5hZGRBbGwobGlzdCk7CisKKwkJcmV0dXJuIGNsb25lZExpc3Q7CisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kQWxsUHJvcGVydHlWYWx1ZU9uSW5zdGFuY2VzKE1hcDxTdHJpbmcsIEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2UsIEludGVnZXI+PiBwcm9jZXNzZWRJbnN0YW5jZXMpIHsKKworCQlpZiAocHJvY2Vzc2VkSW5zdGFuY2VzID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spOworCQl9CisKKwkJU2V0PEVudHJ5PFN0cmluZywgSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZSwgSW50ZWdlcj4+PiBlbnRyeVNldCA9IHByb2Nlc3NlZEluc3RhbmNlcy5lbnRyeVNldCgpOworCisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiBwcm9wZXJ0eVRvSW5zdGFuY2VWYWx1ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlmb3IgKEVudHJ5PFN0cmluZywgSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZSwgSW50ZWdlcj4+IGVudHJ5IDogZW50cnlTZXQpIHsKKworCQkJU3RyaW5nIGNvbXBJbnN0VW5pcXVlSWQgPSBlbnRyeS5nZXRLZXkoKTsKKworCQkJSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZSwgSW50ZWdlcj4gcGFpciA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlID0gcGFpci5nZXRMZWZ0KCk7CisJCQlJbnRlZ2VyIGxldmVsID0gcGFpci5nZXRSaWdodCgpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHByb3BlcHJ0eVZhbHVlT25DSVJlc3VsdCA9IGZpbmRQcm9wZXJ0eVZhbHVlT25Db21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZSk7CisKKwkJCWlmIChwcm9wZXBydHlWYWx1ZU9uQ0lSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVwcnR5VmFsdWVPbkNJUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlWYWx1ZXNPbkNJID0gcHJvcGVwcnR5VmFsdWVPbkNJUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHByb3BlcHJ0eVZhbHVlT25DSVJlc3VsdCAhPSBudWxsKSB7CisJCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkgOiBwcm9wZXJ0eVZhbHVlc09uQ0kpIHsKKwkJCQkJYm9vbGVhbiByZXN1bHQgPSBhZGRQcm9wZXJ0eVZhbHVlKGNvbXBJbnN0VW5pcXVlSWQsIGluc3RhbmNlUHJvcGVydHksIHByb3BlcnR5VG9JbnN0YW5jZVZhbHVlKTsKKwkJCQkJaWYgKHJlc3VsdCA9PSBmYWxzZSkgeworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHByb3BlcnR5VG9JbnN0YW5jZVZhbHVlKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYWRkUHJvcGVydHlWYWx1ZShTdHJpbmcgY29tcEluc3RVbmlxdWVJZCwgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5LCBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gcHJvcGVydHlUb0luc3RhbmNlVmFsdWUpIHsKKworCQlTdHJpbmcgcHJvcGVydHlVaWQgPSBpbnN0YW5jZVByb3BlcnR5LmdldFVuaXF1ZUlkKCk7CisKKwkJTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gbWFwID0gcHJvcGVydHlUb0luc3RhbmNlVmFsdWUuZ2V0KHByb3BlcnR5VWlkKTsKKwkJaWYgKG1hcCA9PSBudWxsKSB7CisJCQltYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlwcm9wZXJ0eVRvSW5zdGFuY2VWYWx1ZS5wdXQocHJvcGVydHlVaWQsIG1hcCk7CisJCX0KKworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHB1dElmQWJzZW50ID0gbWFwLnB1dElmQWJzZW50KGNvbXBJbnN0VW5pcXVlSWQsIGluc3RhbmNlUHJvcGVydHkpOworCQlpZiAocHV0SWZBYnNlbnQgIT0gbnVsbCkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsVW5leHBlY3RlZEVycm9yKCJmaW5kIHByb3BlcnR5IHZhbHVlIiwgIkZvdW5kIDIgdmFsdWVzIG9uIHRoZSBzYW1lIGluc3RhbmNlIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKworCX0KKworCXByaXZhdGUgYm9vbGVhbiBhZGRJbnB1dFZhbHVlKFN0cmluZyBjb21wSW5zdFVuaXF1ZUlkLCBDb21wb25lbnRJbnN0YW5jZUlucHV0IGluc3RhbmNlUHJvcGVydHksIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIENvbXBvbmVudEluc3RhbmNlSW5wdXQ+PiBwcm9wZXJ0eVRvSW5zdGFuY2VWYWx1ZSkgeworCisJCVN0cmluZyBwcm9wZXJ0eVVpZCA9IGluc3RhbmNlUHJvcGVydHkuZ2V0VW5pcXVlSWQoKTsKKworCQlNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZUlucHV0PiBtYXAgPSBwcm9wZXJ0eVRvSW5zdGFuY2VWYWx1ZS5nZXQocHJvcGVydHlVaWQpOworCQlpZiAobWFwID09IG51bGwpIHsKKwkJCW1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCXByb3BlcnR5VG9JbnN0YW5jZVZhbHVlLnB1dChwcm9wZXJ0eVVpZCwgbWFwKTsKKwkJfQorCisJCUNvbXBvbmVudEluc3RhbmNlSW5wdXQgcHV0SWZBYnNlbnQgPSBtYXAucHV0SWZBYnNlbnQoY29tcEluc3RVbmlxdWVJZCwgaW5zdGFuY2VQcm9wZXJ0eSk7CisJCWlmIChwdXRJZkFic2VudCAhPSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxVbmV4cGVjdGVkRXJyb3IoImZpbmQgcHJvcGVydHkgdmFsdWUiLCAiRm91bmQgMiB2YWx1ZXMgb24gdGhlIHNhbWUgaW5zdGFuY2UiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRQcm9wZXJ0eVZhbHVlT25Db21wb25lbnRJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSkgeworCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCA9IGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCk7CisJCU9yaWdpblR5cGVFbnVtIG9yaWdpblR5cGUgPSBjb21wb25lbnRJbnN0YW5jZS5nZXRPcmlnaW5UeXBlKCk7CisKKwkJTm9kZVR5cGVFbnVtIGluc3RhbmNlTm9kZVR5cGUgPSBmaW5kSW5zdGFuY2VOb2RlVHlwZUVudW1Gcm9tT3JpZ2luVHlwZShvcmlnaW5UeXBlKTsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHByb3BlcnR5VmFsdWVzUmVzdWx0ID0gcHJvcGVydHlPcGVyYXRpb24uZ2V0QWxsUHJvcGVydGllc09mUmVzb3VyY2VJbnN0YW5jZU9ubHlQcm9wZXJ0eURlZklkKHJlc291cmNlSW5zdGFuY2VVaWQsIGluc3RhbmNlTm9kZVR5cGUpOworCisJCWxvZy5kZWJ1ZygiQWZ0ZXIgZmV0Y2hpbmcgcHJvcGVydHkgdW5kZXIgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCByZXNvdXJjZUluc3RhbmNlVWlkKTsKKwkJaWYgKHByb3BlcnR5VmFsdWVzUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydHlWYWx1ZXNSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChwcm9wZXJ0eVZhbHVlc1Jlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKKwlwcml2YXRlIE5vZGVUeXBlRW51bSBmaW5kSW5zdGFuY2VOb2RlVHlwZUVudW1Gcm9tT3JpZ2luVHlwZShPcmlnaW5UeXBlRW51bSBvcmlnaW5UeXBlKSB7CisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlOworCQlzd2l0Y2ggKG9yaWdpblR5cGUpIHsKKwkJY2FzZSBTRVJWSUNFOgorCQkJbm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gbm9kZVR5cGU7CisJfQorCisJLyoqCisJICogYWRkIGNhcGFiaWxpdHkgcHJvcGVydHkgdmFsdWVzIHRvIHJlc291cmNlIGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEBwYXJhbSBjYXBhYmlsaXR5CisJICogQHBhcmFtIGlzTmV3bHlDcmVhdGVkUmVzb3VyY2VJbnN0YW5jZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPE1hcDxDYXBhYmlsaXR5SW5zdERhdGEsIExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZENhcGFiaWxpdHlQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2VJbnN0YW5jZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5LCBib29sZWFuIGlzTmV3bHlDcmVhdGVkUmVzb3VyY2VJbnN0YW5jZSkgeworCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgY2FwYWJpbGl0eSBwcm9wZXJ0eSB2YWx1ZXMgdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30uIiwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCisJCUVpdGhlcjxNYXA8Q2FwYWJpbGl0eUluc3REYXRhLCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBJbnN0V2l0aFByb3BlcnRpZXNSZXMgPSBjYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24uY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlT2ZDYXBhYmlsaXR5V2l0aFByb3BlcnR5VmFsdWVzRm9yUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlSWQsCisJCQkJY2FwYWJpbGl0eS5nZXRVbmlxdWVJZCgpLCBjYXBhYmlsaXR5LmdldE5hbWUoKSwgY2FwYWJpbGl0eS5nZXRQcm9wZXJ0aWVzKCksICFpc05ld2x5Q3JlYXRlZFJlc291cmNlSW5zdGFuY2UpOworCQlpZiAoYWRkQ2FwSW5zdFdpdGhQcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJZXJyb3IgPSBhZGRDYXBJbnN0V2l0aFByb3BlcnRpZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb3RpYXRlIGNhcGFiaWxpdHkgaW5zdGFuY2UgdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYWRkaW5nIGNhcGFiaWxpdHkgcHJvcGVydHkgdmFsdWVzIHRvIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChhZGRDYXBJbnN0V2l0aFByb3BlcnRpZXNSZXMubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRDYXBhYmlsaXR5UHJvcGVydHlWYWx1ZXNUb1Jlc291cmNlSW5zdGFuY2UoVGl0YW5WZXJ0ZXggcmVzb3VyY2VJbnN0YW5jZVZlcnRleCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eSwgYm9vbGVhbiBpc05ld2x5Q3JlYXRlZFJlc291cmNlSW5zdGFuY2UpIHsKKwkJbG9nLnRyYWNlKCJCZWZvcmUgYWRkaW5nIGNhcGFiaWxpdHkgcHJvcGVydHkgdmFsdWVzIHRvIHJlc291cmNlIGluc3RhbmNlIHt9LiIsIHJlc291cmNlSW5zdGFuY2VJZCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkQ2FwSW5zdFdpdGhQcm9wZXJ0aWVzUmVzID0gY2FwYWJpbGl0eUluc3RhbmNlT3BlcmF0aW9uLmNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZU9mQ2FwYWJpbGl0eVdpdGhQcm9wZXJ0eVZhbHVlc0ZvclJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVZlcnRleCwgcmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5LmdldFVuaXF1ZUlkKCksCisJCQkJY2FwYWJpbGl0eS5nZXROYW1lKCksIGNhcGFiaWxpdHkuZ2V0UHJvcGVydGllcygpLCAhaXNOZXdseUNyZWF0ZWRSZXNvdXJjZUluc3RhbmNlKTsKKwkJaWYgKCFhZGRDYXBJbnN0V2l0aFByb3BlcnRpZXNSZXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJZXJyb3IgPSBhZGRDYXBJbnN0V2l0aFByb3BlcnRpZXNSZXM7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvdGlhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZSB0byByZXNvdXJjZSBpbnN0YW5jZSB7fSAuIHN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYWRkaW5nIGNhcGFiaWxpdHkgcHJvcGVydHkgdmFsdWVzIHRvIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoqCisJICogdXBkYXRlIGNhcGFiaWxpdHkgcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdHkKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHBhcmFtIGNhcGFiaWxpdHlJZAorCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQ2FwYWJpbGl0eVByb3BlcnR5VmFsdWVzT2ZSZXNvdXJjZUluc3RhbmNlKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5SWQsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlWYWx1ZXMpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgdXBkYXRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdHkge30gb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30uIiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBlcnJvciA9IG51bGw7CisJCUVpdGhlcjxMaXN0PFByb3BlcnR5VmFsdWVEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNhcGFiaWxpdHlQcm9wZXJ0eVZhbHVlc1JlcyA9IGNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbi51cGRhdGVDYXBhYmlsaXR5UHJvcGVydHlWYWx1ZXMocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5SWQsIHByb3BlcnR5VmFsdWVzKTsKKwkJaWYgKHVwZGF0ZUNhcGFiaWxpdHlQcm9wZXJ0eVZhbHVlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCWVycm9yID0gdXBkYXRlQ2FwYWJpbGl0eVByb3BlcnR5VmFsdWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSB7fSBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIHVwZGF0aW5nIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IHt9IG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQlpZiAoZXJyb3IgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHVwZGF0ZUNhcGFiaWxpdHlQcm9wZXJ0eVZhbHVlc1Jlcy5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJLyoqCisJICogZGVsZXRlIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IGZyb20gcmVzb3VyY2UgaW5zdGFuY2UKKwkgKiAKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUlkCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnR5VmFsdWVzT2ZDYXBhYmlsaXR5RnJvbVJlc291cmNlSW5zdGFuY2UoU3RyaW5nIGNhcGFiaWxpdHlJZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCkgeworCQlsb2cuZGVidWcoIkJlZm9yZSBkZWxldGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSB7fSBmcm9tIHJlc291cmNlIGluc3RhbmNlIHt9LiIsIGNhcGFiaWxpdHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlFaXRoZXI8Q2FwYWJpbGl0eUluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQ2FwSW5zdFdpdGhQcm9wZXJ0aWVzUmVzID0gbnVsbDsKKwkJRWl0aGVyPENhcGFiaWxpdHlJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENhcEluc3RCeUNhcGFiaWxpdHlSZXMgPSBjYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24uZ2V0Q2FwYWJpbGl0eUluc3RhbmNlT2ZDYXBhYmlsaXR5T2ZSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eUlkKTsKKwkJaWYgKGdldENhcEluc3RCeUNhcGFiaWxpdHlSZXMuaXNSaWdodCgpKSB7CisJCQllcnJvciA9IGdldENhcEluc3RCeUNhcGFiaWxpdHlSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiBjYXBhYmlsaXR5IHt9IG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjYXBhYmlsaXR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQl9CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlTdHJpbmcgY2FwYWJpbGl0eUluc3RhbmNlSWQgPSBnZXRDYXBJbnN0QnlDYXBhYmlsaXR5UmVzLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisJCQlkZWxldGVDYXBJbnN0V2l0aFByb3BlcnRpZXNSZXMgPSBjYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24uZGVsZXRlQ2FwYWJpbGl0eUluc3RhbmNlRnJvbVJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5SW5zdGFuY2VJZCk7CisJCQlpZiAoZGVsZXRlQ2FwSW5zdFdpdGhQcm9wZXJ0aWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCWVycm9yID0gZGVsZXRlQ2FwSW5zdFdpdGhQcm9wZXJ0aWVzUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSB0byByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eUluc3RhbmNlSWQsIHJlc291cmNlSW5zdGFuY2VJZCwgZXJyb3IpOworCQkJfQorCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdHkge30gZnJvbSByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY2FwYWJpbGl0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChkZWxldGVDYXBJbnN0V2l0aFByb3BlcnRpZXNSZXMubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCS8qKgorCSAqIGNsb25lIGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mIHJlc291cmNlIGluc3RhbmNlCisJICogCisJICogQHBhcmFtIGNyZWF0ZWRDb21wb25lbnRJbnN0YW5jZQorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPE1hcDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiwgTGlzdDxQcm9wZXJ0eVZhbHVlRGF0YT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2xvbmVDYXBhYmlsaXR5SW5zdGFuY2VzT2ZSZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlRGF0YSBjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCQlsb2cuZGVidWcoIkJlZm9yZSBjbG9uaW5nIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiIsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJTWFwPEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+LCBMaXN0PFByb3BlcnR5VmFsdWVEYXRhPj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNsb25lQXNzb2NpYXRlQ0lXaXRoUHJvcGVydHlWYWx1ZXNSZXM7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNSZXMgPSBjYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24uZ2V0QWxsQ2FwYWJpbGl0eUluc3RhbmNlc09mUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlSWQpOworCQlpZiAoZ2V0QWxsQ2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkgJiYgIWdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQllcnJvciA9IGdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mIGNvbXBvbmVudCBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0KKwkJaWYgKGdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNSZXMuaXNMZWZ0KCkpIHsKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4+IGNhcGFiaWxpdHlJbnN0YW5jZXMgPSBnZXRBbGxDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGFsbENhcGFiaWxpdGllc01hcCA9IHJlc291cmNlSW5zdGFuY2UuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBhbGxDYXBhYmlsaXRpZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGN1ckxpc3QgOiBhbGxDYXBhYmlsaXRpZXNNYXAudmFsdWVzKCkpIHsKKwkJCQlhbGxDYXBhYmlsaXRpZXNMaXN0LmFkZEFsbChjdXJMaXN0KTsKKwkJCX0KKwkJCU1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBhYmlsaXRpZXMgPSBhbGxDYXBhYmlsaXRpZXNMaXN0LnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChDYXBhYmlsaXR5RGVmaW5pdGlvbjo6Z2V0VW5pcXVlSWQsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKwkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNBUEFCSUxJVFlfSUQuZ2V0UHJvcGVydHkoKTsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4gY2FwYWJpbGl0eUluc3RQYWlyIDogY2FwYWJpbGl0eUluc3RhbmNlcykgeworCQkJCVN0cmluZyBjYXBhYmlsaXR5SWQgPSAoU3RyaW5nKSBjYXBhYmlsaXR5SW5zdFBhaXIuZ2V0UmlnaHQoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KHByb3BlcnR5TmFtZSk7CisJCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gcmVsYXRlZENhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZ2V0KGNhcGFiaWxpdHlJZCk7CisJCQkJY2xvbmVBc3NvY2lhdGVDSVdpdGhQcm9wZXJ0eVZhbHVlc1JlcyA9IGNhcGFiaWxpdHlJbnN0YW5jZU9wZXJhdGlvbi5jbG9uZUFzc29jaWF0ZUNhcGFiaWxpdHlJbnN0YW5jZVdpdGhQcm9wZXJ0eVZhbHVlcyhjcmVhdGVkQ29tcG9uZW50SW5zdGFuY2UsIHJlbGF0ZWRDYXBhYmlsaXR5LCBjYXBhYmlsaXR5SW5zdFBhaXIpOworCQkJCWlmIChjbG9uZUFzc29jaWF0ZUNJV2l0aFByb3BlcnR5VmFsdWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCQllcnJvciA9IGNsb25lQXNzb2NpYXRlQ0lXaXRoUHJvcGVydHlWYWx1ZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjbG9uZSBjYXBhYmlsaXR5IGluc3RhbmNlcyB7fSBvZiBjb21wb25lbnQgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIGNhcGFiaWxpdHlJbnN0UGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdC5wdXQobmV3IEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+KGNsb25lQXNzb2NpYXRlQ0lXaXRoUHJvcGVydHlWYWx1ZXNSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpLCBjYXBhYmlsaXR5SW5zdFBhaXIuZ2V0UmlnaHQoKSksIGNsb25lQXNzb2NpYXRlQ0lXaXRoUHJvcGVydHlWYWx1ZXNSZXMubGVmdCgpLnZhbHVlKCkuZ2V0UmlnaHQoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgY2xvbmluZyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNhcGFiaWxpdHlJbnN0YW5jZXNPZlJlc291cmNlSW5zdGFuY2UoVGl0YW5WZXJ0ZXggY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkID0gcmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpOworCQlsb2cuZGVidWcoIkJlZm9yZSBjbG9uaW5nIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiIsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2xvbmVBc3NvY2lhdGVDSVdpdGhQcm9wZXJ0eVZhbHVlc1JlcyA9IG51bGw7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNSZXMgPSBjYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24uZ2V0QWxsQ2FwYWJpbGl0eUluc3RhbmNlc09mUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlSWQpOworCQlpZiAoZ2V0QWxsQ2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkgJiYgIWdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQllcnJvciA9IGdldEFsbENhcGFiaWxpdHlJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGNhcGFiaWxpdHkgaW5zdGFuY2VzIG9mIGNvbXBvbmVudCBpbnN0YW5jZSB7fS4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCX0KKwkJTGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBHcmFwaEVkZ2U+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChnZXRBbGxDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmlzTGVmdCgpKSB7CisJCQlMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+PiBjYXBhYmlsaXR5SW5zdGFuY2VzID0gZ2V0QWxsQ2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBhbGxDYXBhYmlsaXRpZXNNYXAgPSByZXNvdXJjZUluc3RhbmNlLmdldENhcGFiaWxpdGllcygpOworCQkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gYWxsQ2FwYWJpbGl0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJZm9yIChMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjdXJMaXN0IDogYWxsQ2FwYWJpbGl0aWVzTWFwLnZhbHVlcygpKSB7CisJCQkJYWxsQ2FwYWJpbGl0aWVzTGlzdC5hZGRBbGwoY3VyTGlzdCk7CisJCQl9CisJCQlNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwYWJpbGl0aWVzID0gYWxsQ2FwYWJpbGl0aWVzTGlzdC5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoQ2FwYWJpbGl0eURlZmluaXRpb246OmdldFVuaXF1ZUlkLCBGdW5jdGlvbi5pZGVudGl0eSgpKSk7CisJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCk7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+IGNhcGFiaWxpdHlJbnN0UGFpciA6IGNhcGFiaWxpdHlJbnN0YW5jZXMpIHsKKwkJCQlTdHJpbmcgY2FwYWJpbGl0eUlkID0gKFN0cmluZykgY2FwYWJpbGl0eUluc3RQYWlyLmdldFJpZ2h0KCkuZ2V0UHJvcGVydGllcygpLmdldChwcm9wZXJ0eU5hbWUpOworCQkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIHJlbGF0ZWRDYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmdldChjYXBhYmlsaXR5SWQpOworCQkJCWNsb25lQXNzb2NpYXRlQ0lXaXRoUHJvcGVydHlWYWx1ZXNSZXMgPSBjYXBhYmlsaXR5SW5zdGFuY2VPcGVyYXRpb24uY2xvbmVBc3NvY2lhdGVDYXBhYmlsaXR5SW5zdGFuY2VXaXRoUHJvcGVydHlWYWx1ZXMoY29tcG9uZW50SW5zdGFuY2VWZXJ0ZXgsIHJlbGF0ZWRDYXBhYmlsaXR5LCBjYXBhYmlsaXR5SW5zdFBhaXIpOworCQkJCWlmIChjbG9uZUFzc29jaWF0ZUNJV2l0aFByb3BlcnR5VmFsdWVzUmVzLmlzUmlnaHQoKSkgeworCQkJCQllcnJvciA9IGNsb25lQXNzb2NpYXRlQ0lXaXRoUHJvcGVydHlWYWx1ZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjbG9uZSBjYXBhYmlsaXR5IGluc3RhbmNlcyB7fSBvZiBjb21wb25lbnQgaW5zdGFuY2Uge30uIHN0YXR1cyBpcyB7fSIsIGNhcGFiaWxpdHlJbnN0UGFpci5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3QuYWRkKG5ldyBJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBHcmFwaEVkZ2U+KGNsb25lQXNzb2NpYXRlQ0lXaXRoUHJvcGVydHlWYWx1ZXNSZXMubGVmdCgpLnZhbHVlKCksIGNhcGFiaWxpdHlJbnN0UGFpci5yaWdodCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlsb2cuZGVidWcoIkFmdGVyIGNsb25pbmcgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJbnN0YW5jZUlkLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQobGlzdCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChlcnJvcik7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ29tcG9uZW50SW5zdGFuY2VzTWV0YWRhdGFPbmx5KFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlKSB7CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzUmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZT4oKTsKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIubGVmdChjb21wb25lbnRJbnN0YW5jZXNSZXN1bHQpOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc291cmNlSW5zdGFuY2VzUmVzID0gZ2V0QWxsQ29tcG9uZW50SW5zdGFuY2VGcm9tR3JhcGgoY29tcG9uZW50SWQsIGNvbnRhaW5lck5vZGVUeXBlLCBmYWxzZSk7CisKKwkJaWYgKHJlc291cmNlSW5zdGFuY2VzUmVzLmlzUmlnaHQoKSkgeworCisJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlsb2cuZGVidWcoIlJlc291cmNlIGluc3RhbmNlIHdhcyBmb3VuZCB1bmRlciBzZXJ2aWNlIHt9IC4gc3RhdHVzIGlzIHt9ICIsIGNvbXBvbmVudElkLCByZXNvdXJjZUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlc291cmNlSW5zdGFuY2VzUmVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgR3JhcGhFZGdlPj4gcmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZUluc3RhbmNlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHJlc291cmNlSW5zdGFuY2VzICE9IG51bGwgJiYgZmFsc2UgPT0gcmVzb3VyY2VJbnN0YW5jZXMuaXNFbXB0eSgpKSB7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA6IHJlc291cmNlSW5zdGFuY2VzKSB7CisJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhIHJlc291cmNlSW5zdGFuY2VEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBmZXRjaCB0aGUgcmVsYXRpb25zaGlwcyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIHJlc291cmNlSW5zdGFuY2VEYXRhKTsKKwkJCQl9CisJCQkJY29tcG9uZW50SW5zdGFuY2VzUmVzdWx0LmFkZChuZXcgQ29tcG9uZW50SW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkpKTsKKworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQ2FwRGVmUHJvcGVydHlWYWx1ZXMoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdHlEZWZMaXN0KSB7CisJCVN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkID0gY29tcG9uZW50SW5zdGFuY2UuZ2V0VW5pcXVlSWQoKTsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgdXBkYXRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdGllcyBvZiBjb21wb25lbnQgaXN0YW5jZSB7fS4iLCBjb21wb25lbnRJbnN0YW5jZUlkKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZXJyb3IgPSBudWxsOworCQlOb2RlVHlwZUVudW0gbm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uZ2V0QnlOYW1lSWdub3JlQ2FzZShjb21wb25lbnRJbnN0YW5jZS5nZXRPcmlnaW5UeXBlKCkuZ2V0SW5zdGFuY2VUeXBlKCkudHJpbSgpKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBnZXR0aW5nIGFsbCBjYXBhYmlsaXR5IGluc3RhbmNlcyBvZiBjb21wb25lbnQgaXN0YW5jZSB7fS4iLCBjb21wb25lbnRJbnN0YW5jZUlkKTsKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1JlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgY29tcG9uZW50SW5zdGFuY2VJZCwgR3JhcGhFZGdlTGFiZWxzLkNBUEFCSUxJVFlfSU5TVCwKKwkJCQlOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eUluc3QsIENhcGFiaWxpdHlJbnN0RGF0YS5jbGFzcyk7CisJCWlmIChnZXRDYXBhYmlsaXR5SW5zdGFuY2VzUmVzLmlzUmlnaHQoKSAmJiAhZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCWVycm9yID0gZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBjYXBhYmlsaXR5IEluc3RhbmNlcyBvZiByZXNvdXJjZSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2UuZ2V0TmFtZSgpLCBlcnJvcik7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciBnZXR0aW5nIGFsbCBjYXBhYmlsaXR5IGluc3RhbmNlcyBvZiBjb21wb25lbnQgaXN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SW5zdGFuY2VJZCwgZXJyb3IpOworCQlNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlRGF0YT4+IG92ZXJyaWRlZENhcGFiaWxpdGllc0hNID0gbmV3IEhhc2hNYXA8PigpOworCQlpZiAoZ2V0Q2FwYWJpbGl0eUluc3RhbmNlc1Jlcy5pc0xlZnQoKSkgeworCQkJTGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPj4gY2FwYWJpbGl0eUluc3REYXRhUGFpciA9IGdldENhcGFiaWxpdHlJbnN0YW5jZXNSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4gY3VyQ2FwYWJpbGl0eVBhaXIgOiBjYXBhYmlsaXR5SW5zdERhdGFQYWlyKSB7CisJCQkJQ2FwYWJpbGl0eUluc3REYXRhIGN1ckNhcGFiaWxpdHlJbnN0ID0gY3VyQ2FwYWJpbGl0eVBhaXIuZ2V0TGVmdCgpOworCQkJCVN0cmluZyBjdXJDYXBJbnN0VWlkID0gY3VyQ2FwYWJpbGl0eUluc3QuZ2V0VW5pcXVlSWQoKTsKKworCQkJCWxvZy5kZWJ1ZygiQmVmb3JlIGdldHRpbmcgYWxsIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IG9mIGNvbXBvbmVudCBpc3RhbmNlIHt9LiIsIGN1ckNhcEluc3RVaWQsIGNvbXBvbmVudEluc3RhbmNlSWQpOworCQkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0T3ZlcnJpZGVkUHJvcGVydHlWYWx1ZXNSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uZ2V0QnlOYW1lKGN1ckNhcGFiaWxpdHlJbnN0LmdldExhYmVsKCkpKSwKKwkJCQkJCWN1ckNhcEluc3RVaWQsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9WQUxVRSwgTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJCQlpZiAoZ2V0T3ZlcnJpZGVkUHJvcGVydHlWYWx1ZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJCWVycm9yID0gZ2V0T3ZlcnJpZGVkUHJvcGVydHlWYWx1ZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgY3VyQ2FwSW5zdFVpZCwgZXJyb3IpOworCQkJCX0KKworCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZ2V0dGluZyBhbGwgcHJvcGVydHkgdmFsdWVzIG9mIGNhcGFiaWxpdHkgaW5zdGFuY2Uge30gb2YgY29tcG9uZW50IGlzdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIGN1ckNhcEluc3RVaWQsIGNvbXBvbmVudEluc3RhbmNlSWQsIGVycm9yKTsKKwkJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlRGF0YT4gb3ZlcnJpZGVkUHJvcGVydHlWYWx1ZXNITSA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQlMaXN0PEltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4+IG92ZXJyaWRlZFByb3BlcnR5VmFsdWVzID0gZ2V0T3ZlcnJpZGVkUHJvcGVydHlWYWx1ZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJZm9yIChJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+IGN1clByb3BlcnR5VmFsdWVQYWlyIDogb3ZlcnJpZGVkUHJvcGVydHlWYWx1ZXMpIHsKKwkJCQkJUHJvcGVydHlWYWx1ZURhdGEgY3VyUHJvcGVydHlWYWx1ZSA9IGN1clByb3BlcnR5VmFsdWVQYWlyLmdldExlZnQoKTsKKwkJCQkJU3RyaW5nIHByb3BlcnR5VmFsdWVVaWQgPSBjdXJQcm9wZXJ0eVZhbHVlLmdldFVuaXF1ZUlkKCk7CisJCQkJCWxvZy5kZWJ1ZygiQmVmb3JlIGdldHRpbmcgcHJvcGVydHkgcmVsYXRlZCB0byBwcm9wZXJ0eSB2YWx1ZSB7fSBvZiBjYXBhYmlsaXR5IGluc3RhbmNlIHt9IG9mIGNvbXBvbmVudCBpc3RhbmNlIHt9LiIsIHByb3BlcnR5VmFsdWVVaWQsIGN1ckNhcEluc3RVaWQsIGNvbXBvbmVudEluc3RhbmNlSWQpOworCQkJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRQcm9wZXJ0eURhdGFSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShjdXJQcm9wZXJ0eVZhbHVlLmdldExhYmVsKCkpKSwgcHJvcGVydHlWYWx1ZVVpZCwKKwkJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfSU1QTCwgTm9kZVR5cGVFbnVtLlByb3BlcnR5LCBQcm9wZXJ0eURhdGEuY2xhc3MpOworCQkJCQlpZiAoZ2V0UHJvcGVydHlEYXRhUmVzLmlzUmlnaHQoKSkgeworCQkJCQkJZXJyb3IgPSBnZXRPdmVycmlkZWRQcm9wZXJ0eVZhbHVlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBwcm9wZXJ0eSBvZiBwcm9wZXJ0eSB2YWx1ZSB7fSBTdGF0dXMgaXMge30iLCBwcm9wZXJ0eVZhbHVlVWlkLCBlcnJvcik7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQkJbG9nLmRlYnVnKCJBZnRlciBnZXR0aW5nIHByb3BlcnR5IHJlbGF0ZWQgdG8gcHJvcGVydHkgdmFsdWUge30gb2YgY2FwYWJpbGl0eSBpbnN0YW5jZSB7fSBvZiBjb21wb25lbnQgaXN0YW5jZSB7fS4gU3RhdHVzIGlzIHt9IiwgcHJvcGVydHlWYWx1ZVVpZCwgY3VyQ2FwSW5zdFVpZCwgY29tcG9uZW50SW5zdGFuY2VJZCwgZXJyb3IpOworCQkJCQl9CisJCQkJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBnZXRQcm9wZXJ0eURhdGFSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpOworCQkJCQlvdmVycmlkZWRQcm9wZXJ0eVZhbHVlc0hNLnB1dCgoU3RyaW5nKSBwcm9wZXJ0eURhdGEuZ2V0VW5pcXVlSWQoKSwgY3VyUHJvcGVydHlWYWx1ZSk7CisJCQkJfQorCQkJCW92ZXJyaWRlZENhcGFiaWxpdGllc0hNLnB1dCgoU3RyaW5nKSBjdXJDYXBhYmlsaXR5UGFpci5nZXRSaWdodCgpLmdldFByb3BlcnRpZXMoKS5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCkpLCBvdmVycmlkZWRQcm9wZXJ0eVZhbHVlc0hNKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiAhb3ZlcnJpZGVkQ2FwYWJpbGl0aWVzSE0uaXNFbXB0eSgpKSB7CisJCQl1cGRhdGVDYXBhYmlsaXR5UHJvcGVydHlWYWx1ZXMoY29tcG9uZW50SW5zdGFuY2UuZ2V0Q2FwYWJpbGl0aWVzKCksIGNhcGFiaWxpdHlEZWZMaXN0LCBvdmVycmlkZWRDYXBhYmlsaXRpZXNITSk7CisJCX0KKwkJbG9nLmRlYnVnKCJBZnRlciB1cGRhdGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgY2FwYWJpbGl0aWVzIG9mIGNvbXBvbmVudCBpc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJbnN0YW5jZUlkLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2FwYWJpbGl0eURlZkxpc3QpOworCQl9CisJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVDYXBhYmlsaXR5UHJvcGVydHlWYWx1ZXMoTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc09mUkksIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGllc09mQ29udGFpbmVyLCBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlRGF0YT4+IG92ZXJyaWRlZENhcGFiaWxpdGllc0hNKSB7CisKKwkJY2FwYWJpbGl0aWVzT2ZDb250YWluZXIuc3RyZWFtKCkuZmlsdGVyKGNhcGFiaWxpdHkgLT4gb3ZlcnJpZGVkQ2FwYWJpbGl0aWVzSE0uY29udGFpbnNLZXkoY2FwYWJpbGl0eS5nZXRVbmlxdWVJZCgpKSkuZm9yRWFjaChjYXBhYmlsaXR5IC0+IHsKKwkJCWJvb2xlYW4gdXBkYXRlUHJvcGVydGllcyA9IGZhbHNlOworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BlcnR5IDogY2FwYWJpbGl0eS5nZXRQcm9wZXJ0aWVzKCkpIHsKKwkJCQlpZiAob3ZlcnJpZGVkQ2FwYWJpbGl0aWVzSE0uZ2V0KGNhcGFiaWxpdHkuZ2V0VW5pcXVlSWQoKSkuY29udGFpbnNLZXkocHJvcGVydHkuZ2V0VW5pcXVlSWQoKSkpIHsKKwkJCQkJcHJvcGVydHkuc2V0VmFsdWUob3ZlcnJpZGVkQ2FwYWJpbGl0aWVzSE0uZ2V0KGNhcGFiaWxpdHkuZ2V0VW5pcXVlSWQoKSkuZ2V0KHByb3BlcnR5LmdldFVuaXF1ZUlkKCkpLmdldFZhbHVlKCkpOworCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZVVuaXF1ZVVpZChvdmVycmlkZWRDYXBhYmlsaXRpZXNITS5nZXQoY2FwYWJpbGl0eS5nZXRVbmlxdWVJZCgpKS5nZXQocHJvcGVydHkuZ2V0VW5pcXVlSWQoKSkuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCXVwZGF0ZVByb3BlcnRpZXMgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWlmICh1cGRhdGVQcm9wZXJ0aWVzKSB7CisJCQkJY2FwYWJpbGl0aWVzT2ZSSS5nZXQoY2FwYWJpbGl0eS5nZXRUeXBlKCkpLmdldCgwKS5zZXRQcm9wZXJ0aWVzKGNhcGFiaWxpdHkuZ2V0UHJvcGVydGllcygpKTsKKwkJCX0KKwkJfSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZUlucHV0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVJbnB1dFZhbHVlSW5SZXNvdXJjZUluc3RhbmNlKENvbXBvbmVudEluc3RhbmNlSW5wdXQgaW5wdXQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIGJvb2xlYW4gYikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hDSUVudkFydGlmYWN0cyhTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCkgeworCQlFaXRoZXI8TWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RzKGNvbXBvbmVudEluc3RhbmNlSWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCB0cnVlLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5nZXRUeXBlKCkpOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSAmJiByZXN1bHQucmlnaHQoKS52YWx1ZSgpID09IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ29tcG9uZW50T3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NvbXBvbmVudE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDNjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NvbXBvbmVudE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjg4NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudGltZS5EdXJhdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVRyaXBsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5HcmFwaEVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLlJlbGF0aW9uRW5kUG9pbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlF1ZXJ5VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdyYXBoQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY2F0ZWdvcnkuR3JvdXBpbmdEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY29tcG9uZW50cy5Db21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLlJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkZpbHRlcktleUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VJbnB1dDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudFBhcmFtZXRlcnNWaWV3OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW5wdXREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5BcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2FjaGUuQ29tcG9uZW50Q2FjaGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5Lkdyb3VwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNhcGFiaWxpdHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUVsZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVJlcXVpcmVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudE1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9kdWN0TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlcXVpcmVtZW50RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5TZXJ2aWNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlRhZ0RhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVW5pcXVlSWREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LkNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeS5Hcm91cGluZ0RhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnV0aWxzLkNvbW1vbkJlVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUud29ya2Vycy5Kb2I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUud29ya2Vycy5NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlN0cmVhbVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zbGY0ai5NREM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGhRdWVyeTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRPcGVyYXRpb24geworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21wb25lbnRPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbzsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgSUFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBJRWxlbWVudE9wZXJhdGlvbiBlbGVtZW50T3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBJQ2FwYWJpbGl0eU9wZXJhdGlvbiBjYXBhYmlsaXR5T3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBJUmVxdWlyZW1lbnRPcGVyYXRpb24gcmVxdWlyZW1lbnRPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uIGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIElucHV0c09wZXJhdGlvbiBpbnB1dE9wZXJhdGlvbjsKKworCUBBdXRvd2lyZWQKKwlwcm90ZWN0ZWQgSUFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbiBhZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb247CisKKwlAQXV0b3dpcmVkCisJcHJvdGVjdGVkIEdyb3VwT3BlcmF0aW9uIGdyb3VwT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBJbnB1dHNPcGVyYXRpb24gaW5wdXRzT3BlcmF0aW9uOworCisJQEF1dG93aXJlZAorCXByb3RlY3RlZCBBcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUgYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlOworCisJQEF1dG93aXJlZAorCXByaXZhdGUgQ29tcG9uZW50Q2FjaGUgY29tcG9uZW50Q2FjaGU7CisKKwlwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHV1aWROZXdWZXJzaW9uID0gUGF0dGVybi5jb21waWxlKCJeXFxkezEsfS4xIik7CisKKwlwcm90ZWN0ZWQgR3NvbiBwcmV0dHlKc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCXByb3RlY3RlZCBFaXRoZXI8TGlzdDxUYWdEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTmV3VGFnc0xpc3QoTGlzdDxTdHJpbmc+IHRhZ3MpIHsKKworCQlMaXN0PFRhZ0RhdGE+IGV4aXN0aW5nVGFncyA9IG5ldyBBcnJheUxpc3Q8VGFnRGF0YT4oKTsKKwkJTGlzdDxUYWdEYXRhPiB0YWdzVG9DcmVhdGUgPSBuZXcgQXJyYXlMaXN0PFRhZ0RhdGE+KCk7CisJCUVpdGhlcjxMaXN0PFRhZ0RhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGl0YW5HZW5lcmljRGFvLmdldEFsbChOb2RlVHlwZUVudW0uVGFnLCBUYWdEYXRhLmNsYXNzKTsKKworCQlpZiAoKGVpdGhlci5pc1JpZ2h0KCkpICYmIChlaXRoZXIucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfSBlbHNlIGlmIChlaXRoZXIuaXNMZWZ0KCkpIHsKKwkJCWV4aXN0aW5nVGFncyA9IGVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJfQorCisJCWZvciAoU3RyaW5nIHRhZ05hbWUgOiB0YWdzKSB7CisJCQlUYWdEYXRhIHRhZyA9IG5ldyBUYWdEYXRhKHRhZ05hbWUpOworCQkJaWYgKChleGlzdGluZ1RhZ3MgPT0gbnVsbCkgfHwgKCFleGlzdGluZ1RhZ3MuY29udGFpbnModGFnKSkpIHsKKwkJCQl0YWdzVG9DcmVhdGUuYWRkKHRhZyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHRhZ3NUb0NyZWF0ZSk7CisKKwl9CisKKwlwcm90ZWN0ZWQgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjcmVhdGVUYWdOb2Rlc09uR3JhcGgoTGlzdDxUYWdEYXRhPiB0YWdzVG9DcmVhdGUpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkvLyBJbiBvcmRlciB0byBhdm9pZCBkdXBsaWNhdGUgdGFncworCQl0YWdzVG9DcmVhdGUgPSBJbW11dGFibGVTZXQuY29weU9mKHRhZ3NUb0NyZWF0ZSkuYXNMaXN0KCk7CisJCWlmICh0YWdzVG9DcmVhdGUgIT0gbnVsbCAmJiBmYWxzZSA9PSB0YWdzVG9DcmVhdGUuaXNFbXB0eSgpKSB7CisJCQlmb3IgKFRhZ0RhdGEgdGFnRGF0YSA6IHRhZ3NUb0NyZWF0ZSkgeworCQkJCWxvZy5kZWJ1ZygiQmVmb3JlIGNyZWF0aW5nIHRhZyB7fSIsIHRhZ0RhdGEpOworCQkJCUVpdGhlcjxUYWdEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlVGFnUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUodGFnRGF0YSwgVGFnRGF0YS5jbGFzcyk7CisJCQkJaWYgKGNyZWF0ZVRhZ1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlVGFnUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmVycm9yKCJDYW5ub3QgY3JlYXRlIHt9IGluIHRoZSBncmFwaC4gU3RhdHVzIGlzIHt9IiwgdGFnRGF0YSwgc3RhdHVzKTsKKwkJCQkJcmVzdWx0ID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpOworCisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbmcgdGFnIHt9IiwgdGFnRGF0YSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0Q29tcG9uZW50QnlVdWlkKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHV1aWQpIHsKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50UmVzdWx0ID0gbnVsbDsKKwkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbGF0ZXN0Q29tcG9uZW50TWV0YWRhdGFSZXMgPSBnZXRMYXRlc3RDb21wb25lbnRNZXRhZGF0YUJ5VXVpZChub2RlVHlwZSwgdXVpZCk7CisJCWlmIChsYXRlc3RDb21wb25lbnRNZXRhZGF0YVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWdldENvbXBvbmVudFJlc3VsdCA9IEVpdGhlci5yaWdodChsYXRlc3RDb21wb25lbnRNZXRhZGF0YVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCWlmIChnZXRDb21wb25lbnRSZXN1bHQgPT0gbnVsbCkgeworCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGxhdGVzdFZlcnNpb24gPSBsYXRlc3RDb21wb25lbnRNZXRhZGF0YVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCVN0cmluZyBpZCA9IGxhdGVzdFZlcnNpb24uZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCk7CisJCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnQgPSBnZXRDb21wb25lbnQoaWQsIGZhbHNlKTsKKwkJCWlmIChjb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBjb21wb25lbnQgd2l0aCB0eXBlIHt9IGFuZCBpZCB7fSwgZXJyb3I6IHt9Iiwgbm9kZVR5cGUsIGlkLCBjb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlnZXRDb21wb25lbnRSZXN1bHQgPSBFaXRoZXIucmlnaHQoY29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9IGVsc2UgeworCQkJCWdldENvbXBvbmVudFJlc3VsdCA9IEVpdGhlci5sZWZ0KGNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdldENvbXBvbmVudFJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0Q29tcG9uZW50TWV0YWRhdGFCeVV1aWQoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdXVpZCkgeworCisJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudFJlc3VsdCA9IG51bGw7CisJCUxpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiBsYXRlc3RWZXJzaW9uTGlzdCA9IG51bGw7CisJCUNvbXBvbmVudE1ldGFkYXRhRGF0YSBsYXRlc3RWZXJzaW9uID0gbnVsbDsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVVSUQuZ2V0UHJvcGVydHkoKSwgdXVpZCk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50RWl0aGVyID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEobm9kZVR5cGUsIHByb3BlcnRpZXNUb01hdGNoLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAoZ2V0Q29tcG9uZW50RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHdpdGggdHlwZSB7fSBhbmQgdXVpZCB7fSwgZXJyb3I6IHt9Iiwgbm9kZVR5cGUsIHV1aWQsIGdldENvbXBvbmVudEVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJZ2V0Q29tcG9uZW50UmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ2V0Q29tcG9uZW50RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSkpOworCisJCX0KKwkJaWYgKGdldENvbXBvbmVudFJlc3VsdCA9PSBudWxsKSB7CisJCQlsYXRlc3RWZXJzaW9uTGlzdCA9IGdldENvbXBvbmVudEVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChsYXRlc3RWZXJzaW9uTGlzdC5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvbXBvbmVudCB3aXRoIHR5cGUge30gYW5kIHV1aWQge30gd2FzIG5vdCBmb3VuZCIsIG5vZGVUeXBlLCB1dWlkKTsKKwkJCQlnZXRDb21wb25lbnRSZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfQorCQl9CisJCWlmIChnZXRDb21wb25lbnRSZXN1bHQgPT0gbnVsbCkgeworCQkJbGF0ZXN0VmVyc2lvbiA9IGxhdGVzdFZlcnNpb25MaXN0LnNpemUoKSA9PSAxID8gbGF0ZXN0VmVyc2lvbkxpc3QuZ2V0KDApCisJCQkJCTogbGF0ZXN0VmVyc2lvbkxpc3Quc3RyZWFtKCkubWF4KChjMSwgYzIpIC0+IERvdWJsZS5jb21wYXJlKERvdWJsZS5wYXJzZURvdWJsZShjMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKSwgRG91YmxlLnBhcnNlRG91YmxlKGMyLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCkpKSkuZ2V0KCk7CisJCQlnZXRDb21wb25lbnRSZXN1bHQgPSBFaXRoZXIubGVmdChsYXRlc3RWZXJzaW9uKTsKKwkJfQorCQlyZXR1cm4gZ2V0Q29tcG9uZW50UmVzdWx0OworCX0KKworCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEJ5TGFiZWxBbmRJZChTdHJpbmcgdW5pcXVlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgQ2xhc3M8VD4gY2xhenopIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIHVuaXF1ZUlkKTsKKwkJRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNwb25zZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKG5vZGVUeXBlLCBwcm9wZXJ0aWVzVG9NYXRjaCwgY2xhenopOworCQlpZiAoZ2V0UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZldGNoIGNvbXBvbmVudCB3aXRoIHR5cGUge30gYW5kIHVuaXF1ZSBpZCB7fSwgZXJyb3I6IHt9Iiwgbm9kZVR5cGUsIHVuaXF1ZUlkLCBnZXRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGdldFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSkpOworCisJCX0KKwkJTGlzdDxUPiBzZXJ2aWNlRGF0YUxpc3QgPSBnZXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHNlcnZpY2VEYXRhTGlzdC5pc0VtcHR5KCkpIHsKKwkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IHdpdGggdHlwZSB7fSBhbmQgdW5pcXVlIGlkIHt9IHdhcyBub3QgZm91bmQiLCBub2RlVHlwZSwgdW5pcXVlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKwkJVCBzZXJ2aWNlRGF0YSA9IHNlcnZpY2VEYXRhTGlzdC5nZXQoMCk7CisJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlRGF0YSk7CisJfQorCisJLy8gcHJvdGVjdGVkIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4KKwkvLyBnZXRDb21wb25lbnRCeUxhYmVsQW5kSWRfdHgoU3RyaW5nIHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJLy8gQ2xhc3M8VD4gY2xhenopIHsKKwkvLworCS8vIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2ggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkvLyBwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLAorCS8vIHVuaXF1ZUlkKTsKKwkvLyBFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlc3BvbnNlID0KKwkvLyB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYV90eChub2RlVHlwZSwgcHJvcGVydGllc1RvTWF0Y2gsIGNsYXp6KTsKKwkvLyBpZiAoZ2V0UmVzcG9uc2UuaXNSaWdodCgpKSB7CisJLy8gbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBjb21wb25lbnQgd2l0aCB0eXBlIHt9IGFuZCB1bmlxdWUgaWQge30sIGVycm9yOgorCS8vIHt9Iiwgbm9kZVR5cGUsIHVuaXF1ZUlkLCBnZXRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGdldFJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSkpOworCS8vCisJLy8gfQorCS8vIExpc3Q8VD4gc2VydmljZURhdGFMaXN0ID0gZ2V0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJLy8gaWYgKHNlcnZpY2VEYXRhTGlzdC5pc0VtcHR5KCkpIHsKKwkvLyBsb2cuZGVidWcoIkNvbXBvbmVudCB3aXRoIHR5cGUge30gYW5kIHVuaXF1ZSBpZCB7fSB3YXMgbm90IGZvdW5kIiwKKwkvLyBub2RlVHlwZSwgdW5pcXVlSWQpOworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCS8vIH0KKwkvLyBUIHNlcnZpY2VEYXRhID0gc2VydmljZURhdGFMaXN0LmdldCgwKTsKKwkvLyByZXR1cm4gRWl0aGVyLmxlZnQoc2VydmljZURhdGEpOworCS8vIH0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnQKKwkgKiBAcGFyYW0gdW5pcXVlSWQKKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldENvbXBvbmVudENyZWF0b3JGcm9tR3JhcGgoQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8VXNlckRhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldFBhcmVudE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLkNSRUFUT1IsIE5vZGVUeXBlRW51bS5Vc2VyLCBVc2VyRGF0YS5jbGFzcyk7CisJCWlmIChwYXJlbnROb2RlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIHBhcmVudE5vZGUucmlnaHQoKS52YWx1ZSgpOworCQl9CisKKwkJSW1tdXRhYmxlUGFpcjxVc2VyRGF0YSwgR3JhcGhFZGdlPiB2YWx1ZSA9IHBhcmVudE5vZGUubGVmdCgpLnZhbHVlKCk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiRm91bmQgcGFyZW50IG5vZGUge30iLCB2YWx1ZSk7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gdmFsdWUuZ2V0S2V5KCk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQnVpbGQgcmVzb3VyY2UgOiBzZXQgY3JlYXRvciB1c2VySWQgdG8ge30iLCB1c2VyRGF0YS5nZXRVc2VySWQoKSk7CisJCVN0cmluZyBmdWxsTmFtZSA9IGJ1aWxkRnVsbE5hbWUodXNlckRhdGEpOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkJ1aWxkIHJlc291cmNlIDogc2V0IGxhc3QgbW9kaWZpZXIgZnVsbCBuYW1lIHRvIHt9ICIsIGZ1bGxOYW1lKTsKKwkJY29tcG9uZW50LnNldENyZWF0b3JVc2VySWQodXNlckRhdGEuZ2V0VXNlcklkKCkpOworCQljb21wb25lbnQuc2V0Q3JlYXRvckZ1bGxOYW1lKGZ1bGxOYW1lKTsKKworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldENvbXBvbmVudExhc3RNb2RpZmllckZyb21HcmFwaChDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgdW5pcXVlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFVzZXJEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQYXJlbnROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSLCBOb2RlVHlwZUVudW0uVXNlciwgVXNlckRhdGEuY2xhc3MpOworCQlpZiAocGFyZW50Tm9kZS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBwYXJlbnROb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8VXNlckRhdGEsIEdyYXBoRWRnZT4gdmFsdWUgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkZvdW5kIHBhcmVudCBub2RlIHt9IiwgdmFsdWUpOworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IHZhbHVlLmdldEtleSgpOworCisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQnVpbGQgcmVzb3VyY2UgOiBzZXQgbGFzdCBtb2RpZmllciB1c2VySWQgdG8ge30iLCB1c2VyRGF0YS5nZXRVc2VySWQoKSk7CisJCVN0cmluZyBmdWxsTmFtZSA9IGJ1aWxkRnVsbE5hbWUodXNlckRhdGEpOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkJ1aWxkIHJlc291cmNlIDogc2V0IGxhc3QgbW9kaWZpZXIgZnVsbCBuYW1lIHRvIHt9IiwgZnVsbE5hbWUpOworCQljb21wb25lbnQuc2V0TGFzdFVwZGF0ZXJVc2VySWQodXNlckRhdGEuZ2V0VXNlcklkKCkpOworCQljb21wb25lbnQuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShmdWxsTmFtZSk7CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSB1c2VyRGF0YQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbE5hbWUoVXNlckRhdGEgdXNlckRhdGEpIHsKKworCQlTdHJpbmcgZnVsbE5hbWUgPSB1c2VyRGF0YS5nZXRGaXJzdE5hbWUoKTsKKwkJaWYgKGZ1bGxOYW1lID09IG51bGwpIHsKKwkJCWZ1bGxOYW1lID0gIiI7CisJCX0gZWxzZSB7CisJCQlmdWxsTmFtZSA9IGZ1bGxOYW1lICsgIiAiOworCQl9CisJCVN0cmluZyBsYXN0TmFtZSA9IHVzZXJEYXRhLmdldExhc3ROYW1lKCk7CisJCWlmIChsYXN0TmFtZSAhPSBudWxsKSB7CisJCQlmdWxsTmFtZSArPSBsYXN0TmFtZTsKKwkJfQorCQlyZXR1cm4gZnVsbE5hbWU7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRVc2VyKFN0cmluZyB1c2VySWQpIHsKKwkJU3RyaW5nIGtleSA9IFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKTsKKwkJRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFVzZXIgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShrZXksIHVzZXJJZCwgVXNlckRhdGEuY2xhc3MpOworCQlyZXR1cm4gZmluZFVzZXI7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRVc2VyVmVydGV4KFN0cmluZyB1c2VySWQpIHsKKwkJU3RyaW5nIGtleSA9IFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKTsKKwkJcmV0dXJuIHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KGtleSwgdXNlcklkKTsKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEdyb3VwaW5nRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRHcm91cGluZyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBncm91cGluZ0lkKSB7CisJCVN0cmluZyBrZXkgPSBVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSk7CisJCUVpdGhlcjxHcm91cGluZ0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kR3JvdXBpbmcgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShrZXksIGdyb3VwaW5nSWQsIEdyb3VwaW5nRGF0YS5jbGFzcyk7CisJCXJldHVybiBmaW5kR3JvdXBpbmc7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxTdWJDYXRlZ29yeURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kU3ViQ2F0ZWdvcnkoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgc3ViQ2F0ZWdvcnlJZCkgeworCQlTdHJpbmcga2V5ID0gVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpOworCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFN1YkNhdGVnb3J5ID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoa2V5LCBzdWJDYXRlZ29yeUlkLCBTdWJDYXRlZ29yeURhdGEuY2xhc3MpOworCQlyZXR1cm4gZmluZFN1YkNhdGVnb3J5OworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZENhdGVnb3J5KE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNhdGVnb3J5SWQpIHsKKwkJU3RyaW5nIGtleSA9IFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKTsKKwkJRWl0aGVyPENhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRDYXRlZ29yeSA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKGtleSwgY2F0ZWdvcnlJZCwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJcmV0dXJuIGZpbmRDYXRlZ29yeTsKKwl9CisKKwlwcm90ZWN0ZWQgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlTWV0YWRhdGFUb0NvbXBvbmVudChDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50RGF0YSwgVXNlckRhdGEgdXNlckRhdGEsIFVzZXJEYXRhIHVwZGF0ZXIsIENhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEsIExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGRlcml2ZWRSZXNvdXJjZXMpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIGNvbXBvbmVudERhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbih1cGRhdGVyLCBjb21wb25lbnREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIHByb3BzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyB1c2VyIHt9IHRvIGNvbXBvbmVudCB7fS4gRWRnZSB0eXBlIGlzIHt9IiwgdXBkYXRlciwgY29tcG9uZW50RGF0YS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUpOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIHJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlyZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24odXBkYXRlciwgY29tcG9uZW50RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkxBU1RfTU9ESUZJRVIsIG51bGwpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHVzZXIge30gdG8gY29tcG9uZW50IHt9LiBFZGdlIHR5cGUgaXMge30iLCB1cGRhdGVyLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSKTsKKwkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSB1c2VyICIgKyB1cGRhdGVyICsgIiB0byBjb21wb25lbnQgIiArIGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSArICIuIEVkZ2UgdHlwZSBpcyAiICsgR3JhcGhFZGdlTGFiZWxzLkxBU1RfTU9ESUZJRVIpOworCQkJcmV0dXJuIHJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlyZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24odXNlckRhdGEsIGNvbXBvbmVudERhdGEsIEdyYXBoRWRnZUxhYmVscy5DUkVBVE9SLCBudWxsKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyB1c2VyIHt9IHRvIGNvbXBvbmVudCB7fS4gRWRnZSB0eXBlIGlzIHt9IiwgdXNlckRhdGEsIGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkNSRUFUT1IpOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHVzZXIgIiArIHVzZXJEYXRhICsgIiB0byBjb21wb25lbnQgIiArIGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSArICIuIEVkZ2UgdHlwZSBpcyAiICsgR3JhcGhFZGdlTGFiZWxzLkNSRUFUT1IpOworCQkJcmV0dXJuIHJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlpZiAoZGVyaXZlZFJlc291cmNlcyAhPSBudWxsKSB7CisJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIGRlcml2ZWRSZXNvdXJjZSA6IGRlcml2ZWRSZXNvdXJjZXMpIHsKKwkJCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIGNvbXBvbmVudCB7fSB0byBwYXJlbnQgY29tcG9uZW50IHt9LiBFZ2RlIHR5cGUgaXMge30iLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIGRlcml2ZWRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NKTsKKwkJCQlyZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY29tcG9uZW50RGF0YSwgZGVyaXZlZFJlc291cmNlLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBudWxsKTsKKwkJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgdXNlciB7fSB0byBjb21wb25lbnQge30uIEVkZ2UgdHlwZSBpcyB7fSIsIHVzZXJEYXRhLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DUkVBVE9SKTsKKwkJCQkJcmV0dXJuIHJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGNhdGVnb3J5RGF0YSAhPSBudWxsKSB7CisJCQlyZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY29tcG9uZW50RGF0YSwgY2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlksIG51bGwpOworCQkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyBjb21wb25lbnQge30gdG8gY2F0ZWdvcnkge30uIEVkZ2UgdHlwZSBpcyB7fSIsIGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSwgY2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlkpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWVsZCB0byBhc3NvY2lhdGUgY29tcG9uZW50IHt9IHRvIGNhdGVnb3J5IHt9LiBFZGdlIHR5cGUgaXMge30iLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIGNhdGVnb3J5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkNBVEVHT1JZKTsKKwkJCQlyZXR1cm4gcmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcm90ZWN0ZWQgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVBcnRpZmFjdHNUb0NvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsIENvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnREYXRhLCBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cykgeworCisJCWlmIChhcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQXJpZmFjdFRvUmVzb3VyY2UgPSBFaXRoZXIubGVmdChhcnRpZmFjdERlZmluaXRpb24pOworCQkJCS8vIGlmICgoYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkgIT0gbnVsbCkgJiYKKwkJCQkvLyAhYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkuaXNFbXB0eSgpKSB7CisJCQkJYWRkQXJpZmFjdFRvUmVzb3VyY2UgPSBhcnRpZmFjdE9wZXJhdGlvbi5hZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3REZWZpbml0aW9uLCAoU3RyaW5nKSBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIG5vZGVUeXBlLCBmYWxzZSwgdHJ1ZSk7CisJCQkJLy8gfQorCisJCQkJaWYgKGFkZEFyaWZhY3RUb1Jlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gYWRkQXJpZmFjdFRvUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVSZXNvdXJjZU5hbWVVbmlxdWVuZXNzKFN0cmluZyBuYW1lLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGhhc1Byb3BzLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGhhc05vdFByb3BzLCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCWlmIChoYXNQcm9wcyA9PSBudWxsKSB7CisJCQloYXNQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQl9CisJCVN0cmluZyBub3JtYWxpemVkTmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKG5hbWUpOworCQloYXNQcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OT1JNQUxJWkVEX05BTUUuZ2V0UHJvcGVydHkoKSwgbm9ybWFsaXplZE5hbWUpOworCisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc291cmNlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgaGFzUHJvcHMsIGhhc05vdFByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChyZXNvdXJjZXMuaXNSaWdodCgpICYmIHJlc291cmNlcy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgcmVzb3VyY2VzIGZyb20gZ3JhcGggd2l0aCBwcm9wZXJ0eSBuYW1lOiB7fSIsIG5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlc291cmNlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZUxpc3QgPSAocmVzb3VyY2VzLmlzTGVmdCgpID8gcmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpIDogbnVsbCk7CisJCWlmIChyZXNvdXJjZUxpc3QgIT0gbnVsbCAmJiByZXNvdXJjZUxpc3Quc2l6ZSgpID4gMCkgeworCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA6IHJlc291cmNlTGlzdCkgeworCQkJCQlidWlsZGVyLmFwcGVuZChyZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSArICJ8Iik7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygicmVzb3VyY2VzICB3aXRoIHByb3BlcnR5IG5hbWU6IHt9IGV4aXN0cyBpbiBncmFwaC4gRm91bmQge30iLCBuYW1lLCBidWlsZGVyLnRvU3RyaW5nKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygicmVzb3VyY2VzICB3aXRoIHByb3BlcnR5IG5hbWU6IiArIG5hbWUgKyAiIGRvZXMgbm90IGV4aXN0cyBpbiBncmFwaCIpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisKKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVVbmlxdWVuZXNzKFN0cmluZyBuYW1lLCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRPU0NBX1JFU09VUkNFX05BTUUuZ2V0UHJvcGVydHkoKSwgbmFtZSk7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VzID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBwcm9wZXJ0aWVzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChyZXNvdXJjZXMuaXNSaWdodCgpICYmIHJlc291cmNlcy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgcmVzb3VyY2VzIGZyb20gZ3JhcGggd2l0aCBwcm9wZXJ0eSBuYW1lOiIgKyBuYW1lKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZXNvdXJjZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKwkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gcmVzb3VyY2VMaXN0ID0gKHJlc291cmNlcy5pc0xlZnQoKSA/IHJlc291cmNlcy5sZWZ0KCkudmFsdWUoKSA6IG51bGwpOworCQlpZiAocmVzb3VyY2VMaXN0ICE9IG51bGwgJiYgcmVzb3VyY2VMaXN0LnNpemUoKSA+IDApIHsKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJZm9yIChSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgOiByZXNvdXJjZUxpc3QpIHsKKwkJCQkJYnVpbGRlci5hcHBlbmQocmVzb3VyY2VEYXRhLmdldFVuaXF1ZUlkKCkgKyAifCIpOworCQkJCX0KKwkJCQlsb2cuZGVidWcoInJlc291cmNlcyAgd2l0aCBwcm9wZXJ0eSBuYW1lOiIgKyBuYW1lICsgIiBleGlzdHMgaW4gZ3JhcGguIGZvdW5kICIgKyBidWlsZGVyLnRvU3RyaW5nKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygicmVzb3VyY2VzICB3aXRoIHByb3BlcnR5IG5hbWU6IHt9IGRvd3Mgbm90IGV4aXN0cyBpbiB0aGUgZ3JhcGgiLCBuYW1lKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZVNlcnZpY2VOYW1lVW5pcXVlbmVzcyhTdHJpbmcgbmFtZSwgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbykgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCVN0cmluZyBub3JtYWxpemVkTmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKG5hbWUpOworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRS5nZXRQcm9wZXJ0eSgpLCBub3JtYWxpemVkTmFtZSk7CisKKwkJRWl0aGVyPExpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBwcm9wZXJ0aWVzLCBTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJaWYgKHNlcnZpY2VzLmlzUmlnaHQoKSAmJiBzZXJ2aWNlcy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgc2VydmljZXMgZnJvbSBncmFwaCB3aXRoIHByb3BlcnR5IG5hbWU6IHt9IiwgbmFtZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc2VydmljZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKwkJTGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiBzZXJ2aWNlTGlzdCA9IChzZXJ2aWNlcy5pc0xlZnQoKSA/IHNlcnZpY2VzLmxlZnQoKS52YWx1ZSgpIDogbnVsbCk7CisJCWlmIChzZXJ2aWNlTGlzdCAhPSBudWxsICYmIHNlcnZpY2VMaXN0LnNpemUoKSA+IDApIHsKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJZm9yIChTZXJ2aWNlTWV0YWRhdGFEYXRhIHNlcnZpY2VEYXRhIDogc2VydmljZUxpc3QpIHsKKwkJCQkJYnVpbGRlci5hcHBlbmQoc2VydmljZURhdGEuZ2V0VW5pcXVlSWQoKSArICJ8Iik7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiU2VydmljZSB3aXRoIHByb3BlcnR5IG5hbWU6IHt9IGV4aXN0cyBpbiBncmFwaC4gRm91bmQge30iLCBuYW1lLCBidWlsZGVyLnRvU3RyaW5nKCkpOworCQkJfQorCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJTZXJ2aWNlICB3aXRoIHByb3BlcnR5IG5hbWU6IHt9IGRvd3Mgbm90IGV4aXN0cyBpbiBncmFwaCIsIG5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVVbmlxdWVuZXNzKFN0cmluZyBuYW1lLCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCVN0cmluZyBub3JtYWxpemVkTmFtZSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKG5hbWUpOworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRS5nZXRQcm9wZXJ0eSgpLCBub3JtYWxpemVkTmFtZSk7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudHMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYSh0eXBlLCBwcm9wZXJ0aWVzLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAoY29tcG9uZW50cy5pc1JpZ2h0KCkgJiYgY29tcG9uZW50cy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgY29tcG9uZW50cyBmcm9tIGdyYXBoIHdpdGggcHJvcGVydHkgbmFtZToge30iLCBuYW1lKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhjb21wb25lbnRzLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisJCUxpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiBjb21wb25lbnRMaXN0ID0gKGNvbXBvbmVudHMuaXNMZWZ0KCkgPyBjb21wb25lbnRzLmxlZnQoKS52YWx1ZSgpIDogbnVsbCk7CisJCWlmIChjb21wb25lbnRMaXN0ICE9IG51bGwgJiYgY29tcG9uZW50TGlzdC5zaXplKCkgPiAwKSB7CisJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCWZvciAoQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudERhdGEgOiBjb21wb25lbnRMaXN0KSB7CisJCQkJCWJ1aWxkZXIuYXBwZW5kKGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSArICJ8Iik7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IHdpdGggcHJvcGVydHkgbmFtZToge30gZXhpc3RzIGluIGdyYXBoLiBGb3VuZCB7fSIsIG5hbWUsIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisJCQl9CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChmYWxzZSk7CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIkNvbXBvbmVudCB3aXRoIHByb3BlcnR5IG5hbWU6IHt9IGRvZXMgbm90IGV4aXN0cyBpbiBncmFwaCIsIG5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHRydWUpOworCQl9CisJfQorCisJLy8gcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldENvbXBvbmVudENhdGVnb3J5RnJvbUdyYXBoKFN0cmluZworCS8vIHVuaXF1ZUlkLCBDb21wb25lbnQgY29tcG9uZW50LCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvLAorCS8vIE5vZGVUeXBlRW51bSBjYXRlZ29yeVR5cGUpIHsKKwkvLworCS8vIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiwKKwkvLyBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZSA9CisJLy8gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwKKwkvLyB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLkNBVEVHT1JZLCBjYXRlZ29yeVR5cGUsCisJLy8gQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkvLyBpZiAocGFyZW50Tm9kZS5pc1JpZ2h0KCkpIHsKKwkvLyByZXR1cm4gcGFyZW50Tm9kZS5yaWdodCgpLnZhbHVlKCk7CisJLy8gfQorCS8vCisJLy8gTGlzdDxJbW11dGFibGVQYWlyPENhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPj4gbGlzdFZhbHVlID0KKwkvLyBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCS8vIGxvZy5kZWJ1ZygiUmVzdWx0IGFmdGVyIGxvb2tpbmcgZm9yIGNhdGVnb3J5IG5vZGVzIHBvaW50ZWQgYnkgcmVzb3VyY2UgIgorCS8vICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIiArIGxpc3RWYWx1ZSk7CisJLy8gaWYgKGxpc3RWYWx1ZS5zaXplKCkgPiAxKSB7CisJLy8gbG9nLmVycm9yKCJNdWx0aXBsZSBlZGdlcyBmb3VkIGJldHdlZW4gcmVzb3VyY2UgIiArIHVuaXF1ZUlkICsgIiB0bworCS8vIGNhdGVnb3J5IG5vZGVzLiIpOworCS8vIH0KKwkvLyBJbW11dGFibGVQYWlyPENhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPiB2YWx1ZSA9IGxpc3RWYWx1ZS5nZXQoMCk7CisJLy8gbG9nLmRlYnVnKCJGb3VuZCBwYXJlbnQgbm9kZSB7fSIsIHZhbHVlKTsKKwkvLworCS8vIENhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEgPSB2YWx1ZS5nZXRLZXkoKTsKKwkvLyBTdHJpbmcgY2F0ZWdvcnlTdHIgPSBudWxsOworCS8vIGlmCisJLy8gKE5vZGVUeXBlRW51bS5SZXNvdXJjZUNhdGVnb3J5Lm5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGNhdGVnb3J5RGF0YS5nZXRMYWJlbCgpKSkKKwkvLyB7CisJLy8gU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJLy8gc2IuYXBwZW5kKCgoUmVzb3VyY2VDYXRlZ29yeURhdGEpIGNhdGVnb3J5RGF0YSkuZ2V0Q2F0ZWdvcnlOYW1lKCkpOworCS8vIHNiLmFwcGVuZCgiLyIpOworCS8vIHNiLmFwcGVuZChjYXRlZ29yeURhdGEuZ2V0TmFtZSgpKTsKKwkvLyBjYXRlZ29yeVN0ciA9IHNiLnRvU3RyaW5nKCk7CisJLy8gfSBlbHNlIHsKKwkvLyBjYXRlZ29yeVN0ciA9IGNhdGVnb3J5RGF0YS5nZXROYW1lKCk7CisJLy8gfQorCS8vCisJLy8gY29tcG9uZW50LnNldENhdGVnb3J5KGNhdGVnb3J5U3RyKTsKKwkvLyByZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJLy8gfQorCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc2V0QXJ0aWZhY3RGcm9tR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBDb21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gdHlwZSwgSUFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uKSB7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0cyA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0cyh1bmlxdWVJZCwgdHlwZSwgdHJ1ZSk7CisJCWlmIChhcnRpZmFjdHMuaXNSaWdodCgpKSB7CisJCQlyZXN1bHQgPSBhcnRpZmFjdHMucmlnaHQoKS52YWx1ZSgpOworCQl9IGVsc2UgeworCQkJLy8gY29tcG9uZW50LnNldEFydGlmYWN0cyhhcnRpZmFjdHMubGVmdCgpLnZhbHVlKCkpOworCQkJY3JlYXRlU3BlY2lmaWNBcnRpZmFjdExpc3QoY29tcG9uZW50LCBhcnRpZmFjdHMubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJvdGVjdGVkIENvbXBvbmVudCBjcmVhdGVTcGVjaWZpY0FydGlmYWN0TGlzdChDb21wb25lbnQgY29tcG9uZW50LCBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cykgeworCisJCWlmIChhcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gbmV3IEhhc2hNYXA8PigpOworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBzZXJ2aWNlQXBpQXJ0aWZhY3RzID0gbmV3IEhhc2hNYXA8PigpOworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiB0b3NjYUFydGlmYWN0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQkJU2V0PEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPj4gc3BlY2lmaWNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJQXJ0aWZhY3RHcm91cFR5cGVFbnVtIGFydGlmYWN0R3JvdXBUeXBlID0gYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RHcm91cFR5cGUoKTsKKwkJCQlpZiAoYXJ0aWZhY3RHcm91cFR5cGUgPT0gbnVsbCkgeworCQkJCQlhcnRpZmFjdEdyb3VwVHlwZSA9IEFydGlmYWN0R3JvdXBUeXBlRW51bS5JTkZPUk1BVElPTkFMOworCQkJCX0KKworCQkJCXN3aXRjaCAoYXJ0aWZhY3RHcm91cFR5cGUpIHsKKwkJCQljYXNlIERFUExPWU1FTlQ6CisJCQkJCWRlcGxveW1lbnRBcnRpZmFjdHMucHV0KGFydGlmYWN0LmdldEFydGlmYWN0TGFiZWwoKSwgYXJ0aWZhY3QpOworCQkJCQlzcGVjaWZpY2V0LmFkZChlbnRyeSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0VSVklDRV9BUEk6CisJCQkJCXNlcnZpY2VBcGlBcnRpZmFjdHMucHV0KGFydGlmYWN0LmdldEFydGlmYWN0TGFiZWwoKSwgYXJ0aWZhY3QpOworCQkJCQlzcGVjaWZpY2V0LmFkZChlbnRyeSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVE9TQ0E6CisJCQkJCXRvc2NhQXJ0aWZhY3RzLnB1dChhcnRpZmFjdC5nZXRBcnRpZmFjdExhYmVsKCksIGFydGlmYWN0KTsKKwkJCQkJc3BlY2lmaWNldC5hZGQoZW50cnkpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0KKwkJCWFydGlmYWN0cy5lbnRyeVNldCgpLnJlbW92ZUFsbChzcGVjaWZpY2V0KTsKKworCQkJY29tcG9uZW50LnNldFNwZWNpZmljQ29tcG9uZXRUeXBlQXJ0aWZhY3RzKHNlcnZpY2VBcGlBcnRpZmFjdHMpOworCQkJY29tcG9uZW50LnNldERlcGxveW1lbnRBcnRpZmFjdHMoZGVwbG95bWVudEFydGlmYWN0cyk7CisJCQljb21wb25lbnQuc2V0VG9zY2FBcnRpZmFjdHModG9zY2FBcnRpZmFjdHMpOworCQkJY29tcG9uZW50LnNldEFydGlmYWN0cyhhcnRpZmFjdHMpOworCQl9CisJCXJldHVybiBjb21wb25lbnQ7CisJfQorCisJcHJpdmF0ZSA8VCwgUyBleHRlbmRzIENvbXBvbmVudE1ldGFkYXRhRGF0YT4gRWl0aGVyPExpc3Q8VD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbGxlY3RDb21wb25lbnRzKFRpdGFuR3JhcGggZ3JhcGgsIE5vZGVUeXBlRW51bSBuZWVkZWRUeXBlLCBTdHJpbmcgY2F0ZWdvcnlVaWQsIE5vZGVUeXBlRW51bSBjYXRlZ29yeVR5cGUsIENsYXNzPFM+IGNsYXp6KSB7CisJCUxpc3Q8VD4gY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFMsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UGFyZW50Tm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoY2F0ZWdvcnlUeXBlKSwgY2F0ZWdvcnlVaWQsIEdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSwgbmVlZGVkVHlwZSwgY2xhenopOworCQlpZiAocGFyZW50Tm9kZXMuaXNMZWZ0KCkpIHsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxTLCBHcmFwaEVkZ2U+IGNvbXBvbmVudCA6IHBhcmVudE5vZGVzLmxlZnQoKS52YWx1ZSgpKSB7CisJCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBjb21wb25lbnREYXRhID0gY29tcG9uZW50LmdldExlZnQoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCk7CisJCQkJQm9vbGVhbiBpc0hpZ2hlc3QgPSBjb21wb25lbnREYXRhLmlzSGlnaGVzdFZlcnNpb24oKTsKKwkJCQlCb29sZWFuIGlzQ29tcGxleCA9IG5lZWRlZFR5cGUgPT0gTm9kZVR5cGVFbnVtLlJlc291cmNlID8gUmVzb3VyY2VUeXBlRW51bS5WRi5lcXVhbHMoKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGNvbXBvbmVudERhdGEpLmdldFJlc291cmNlVHlwZSgpKSA6IHRydWU7CisJCQkJaWYgKGlzSGlnaGVzdCAmJiBpc0NvbXBsZXgpIHsKKwkJCQkJRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGdldExpZ2h0Q29tcG9uZW50KGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCQkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJCWNvbXBvbmVudHMuYWRkKHJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnRzKTsKKwl9CisKKwlwcm90ZWN0ZWQgPFQsIFMgZXh0ZW5kcyBDb21wb25lbnRNZXRhZGF0YURhdGE+IEVpdGhlcjxMaXN0PFQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmZXRjaEJ5Q2F0ZWdvcnlPclN1YkNhdGVnb3J5VWlkKFN0cmluZyBjYXRlZ29yeVVpZCwgTm9kZVR5cGVFbnVtIGNhdGVnb3J5VHlwZSwgU3RyaW5nIGNhdGVnb3J5TGFiZWwsIE5vZGVUeXBlRW51bSBuZWVkZWRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24sCisJCQlDbGFzczxTPiBjbGF6eikgeworCQl0cnkgeworCQkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpOworCQkJaWYgKGdyYXBoLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaC5yaWdodCgpLnZhbHVlKCkpKTsKKworCQkJfQorCQkJcmV0dXJuIGNvbGxlY3RDb21wb25lbnRzKGdyYXBoLmxlZnQoKS52YWx1ZSgpLCBuZWVkZWRUeXBlLCBjYXRlZ29yeVVpZCwgY2F0ZWdvcnlUeXBlLCBjbGF6eik7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIDxULCBTIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhPiBFaXRoZXI8TGlzdDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hCeUNhdGVnb3J5T3JTdWJDYXRlZ29yeU5hbWUoU3RyaW5nIGNhdGVnb3J5TmFtZSwgTm9kZVR5cGVFbnVtIGNhdGVnb3J5VHlwZSwgU3RyaW5nIGNhdGVnb3J5TGFiZWwsIE5vZGVUeXBlRW51bSBuZWVkZWRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24sCisJCQlDbGFzczxTPiBjbGF6eikgeworCQlMaXN0PFQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdHJ5IHsKKwkJCUNsYXNzIGNhdGVnb3J5Q2xhenogPSBjYXRlZ29yeVR5cGUgPT0gTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSA/IENhdGVnb3J5RGF0YS5jbGFzcyA6IFN1YkNhdGVnb3J5RGF0YS5jbGFzczsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgY2F0ZWdvcnlOYW1lKTsKKwkJCUVpdGhlcjxMaXN0PEdyYXBoTm9kZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXRlZ29yeSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKGNhdGVnb3J5VHlwZSwgcHJvcHMsIGNhdGVnb3J5Q2xhenopOworCQkJaWYgKGdldENhdGVnb3J5LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5DQVRFR09SWV9OT1RfRk9VTkQpOworCQkJfQorCQkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpOworCQkJaWYgKGdyYXBoLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaC5yaWdodCgpLnZhbHVlKCkpKTsKKworCQkJfQorCQkJZm9yIChHcmFwaE5vZGUgY2F0ZWdvcnkgOiBnZXRDYXRlZ29yeS5sZWZ0KCkudmFsdWUoKSkgeworCQkJCUVpdGhlcjxMaXN0PFQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBjb2xsZWN0Q29tcG9uZW50cyhncmFwaC5sZWZ0KCkudmFsdWUoKSwgbmVlZGVkVHlwZSwgKFN0cmluZykgY2F0ZWdvcnkuZ2V0VW5pcXVlSWQoKSwgY2F0ZWdvcnlUeXBlLCBjbGF6eik7CisJCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQkJY29tcG9uZW50cy5hZGRBbGwocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudHMpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCX0KKwl9CisKKwk8VD4gRWl0aGVyPExpc3Q8VD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEZpbHRlcmVkQ29tcG9uZW50cyhNYXA8RmlsdGVyS2V5RW51bSwgU3RyaW5nPiBmaWx0ZXJzLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIE5vZGVUeXBlRW51bSBuZWVkZWRUeXBlKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8TGlzdDxDb21wb25lbnQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRGb2xsb3dlZENvbXBvbmVudChTdHJpbmcgdXNlcklkLCBTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMsIFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvLAorCQkJTm9kZVR5cGVFbnVtIG5lZWRlZFR5cGUpIHsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ3JhcGgucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB1c2VyczsKKworCQkJaWYgKHVzZXJJZCA9PSBudWxsKSB7CisJCQkJLy8gZ2V0IGFsbCB1c2VycyBieSBsYWJlbAorCQkJCS8vIGZvciBUZXN0ZXIgYW5kIEFkbWluIHJldHJpZXZlIGFsbCB1c2VycworCisJCQkJLy8gdXNlcnMgPQorCQkJCS8vIGdyYXBoLmxlZnQoKS52YWx1ZSgpLmdldFZlcnRpY2VzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwKKwkJCQkvLyBOb2RlVHlwZUVudW0uVXNlci5nZXROYW1lKCkpOworCQkJCXVzZXJzID0gZ3JhcGgubGVmdCgpLnZhbHVlKCkucXVlcnkoKS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uVXNlci5nZXROYW1lKCkpLnZlcnRpY2VzKCk7CisKKwkJCX0gZWxzZSB7CisJCQkJLy8gZm9yIERlc2lnbmVyIHJldHJpZXZlIHNwZWNpZmljIHVzZXIKKwkJCQlTdHJpbmcga2V5ID0gVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlVzZXIpOworCQkJCS8vIHVzZXJzID0gZ3JhcGgubGVmdCgpLnZhbHVlKCkuZ2V0VmVydGljZXMoa2V5LCB1c2VySWQpOworCQkJCXVzZXJzID0gZ3JhcGgubGVmdCgpLnZhbHVlKCkucXVlcnkoKS5oYXMoa2V5LCB1c2VySWQpLnZlcnRpY2VzKCk7CisJCQl9CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gdXNlckl0ZXJhdG9yID0gdXNlcnMuaXRlcmF0b3IoKTsKKworCQkJTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCXdoaWxlICh1c2VySXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJVmVydGV4IHZlcnRleFVzZXIgPSB1c2VySXRlcmF0b3IubmV4dCgpOworCisJCQkJLy8gZ2V0IGFsbCByZXNvdXJjZSB3aXRoIGN1cnJlbnQgc3RhdGUKKwkJCQlJdGVyYXRvcjxFZGdlPiBpdGVyYXRvciA9IHZlcnRleFVzZXIuZWRnZXMoRGlyZWN0aW9uLk9VVCwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLmdldFByb3BlcnR5KCkpOworCisJCQkJTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHNQZXJVc2VyID0gZmV0Y2hDb21wb25lbnRzKGxpZmVjeWNsZVN0YXRlcywgaXRlcmF0b3IsIG5lZWRlZFR5cGUsIGluVHJhbnNhY3Rpb24pOworCisJCQkJSGFzaFNldDxTdHJpbmc+IGlkcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCQkJCWlmIChjb21wb25lbnRzUGVyVXNlciAhPSBudWxsKSB7CisJCQkJCWZvciAoQ29tcG9uZW50IGNvbXAgOiBjb21wb25lbnRzUGVyVXNlcikgeworCQkJCQkJaWRzLmFkZChjb21wLmdldFVuaXF1ZUlkKCkpOworCQkJCQkJY29tcG9uZW50cy5hZGQoY29tcCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAobGFzdFN0YXRlU3RhdGVzICE9IG51bGwgJiYgIWxhc3RTdGF0ZVN0YXRlcy5pc0VtcHR5KCkpIHsKKwkJCQkJLy8gZ2V0IGFsbCByZXNvdXJjZSB3aXRoIGxhc3Qgc3RhdGUKKwkJCQkJaXRlcmF0b3IgPSB2ZXJ0ZXhVc2VyLmVkZ2VzKERpcmVjdGlvbi5PVVQsIEdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFLmdldFByb3BlcnR5KCkpOworCQkJCQlib29sZWFuIGlzRmlyc3Q7CisJCQkJCWNvbXBvbmVudHNQZXJVc2VyID0gZmV0Y2hDb21wb25lbnRzKGxhc3RTdGF0ZVN0YXRlcywgaXRlcmF0b3IsIG5lZWRlZFR5cGUsIGluVHJhbnNhY3Rpb24pOworCQkJCQlpZiAoY29tcG9uZW50c1BlclVzZXIgIT0gbnVsbCkgeworCQkJCQkJZm9yIChDb21wb25lbnQgY29tcCA6IGNvbXBvbmVudHNQZXJVc2VyKSB7CisJCQkJCQkJaXNGaXJzdCA9IHRydWU7CisKKwkJCQkJCQlpZiAoaWRzLmNvbnRhaW5zKGNvbXAuZ2V0VW5pcXVlSWQoKSkpIHsKKwkJCQkJCQkJaXNGaXJzdCA9IGZhbHNlOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoaXNGaXJzdCA9PSB0cnVlKSB7CisJCQkJCQkJCWNvbXBvbmVudHMuYWRkKGNvbXApOworCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQl9IC8vIHdobGlsZSB1c2VycworCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjb21wb25lbnRzKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudD4gZmV0Y2hDb21wb25lbnRzKFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxpZmVjeWNsZVN0YXRlcywgSXRlcmF0b3I8RWRnZT4gaXRlcmF0b3IsIE5vZGVUeXBlRW51bSBuZWVkZWRUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJRWRnZSBlZGdlID0gaXRlcmF0b3IubmV4dCgpOworCisJCQlTdHJpbmcgc3RhdGVTdHIgPSBlZGdlLnZhbHVlKEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCkpOworCQkJTGlmZWN5Y2xlU3RhdGVFbnVtIHN0YXRlID0gTGlmZWN5Y2xlU3RhdGVFbnVtLmZpbmRTdGF0ZShzdGF0ZVN0cik7CisJCQlpZiAoc3RhdGUgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1Zygibm90IHN1cHBvcnRlZCBTVEFURSBmb3IgZWxlbWVudCB7fSIsIHN0YXRlU3RyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChsaWZlY3ljbGVTdGF0ZXMgIT0gbnVsbCAmJiBsaWZlY3ljbGVTdGF0ZXMuY29udGFpbnMoc3RhdGUpKSB7CisJCQkJVmVydGV4IHZlcnRleENvbXBvbmVudCA9IGVkZ2UuaW5WZXJ0ZXgoKTsKKworCQkJCUJvb2xlYW4gaXNIaWdoZXN0ID0gdmVydGV4Q29tcG9uZW50LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCkpOworCQkJCWlmIChpc0hpZ2hlc3QpIHsKKworCQkJCQlTdHJpbmcgbm9kZVR5cGVTdHIgPSB2ZXJ0ZXhDb21wb25lbnQudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJLy8gZ2V0IG9ubHkgbGF0ZXN0IHZlcnNpb25zCisJCQkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IE5vZGVUeXBlRW51bS5nZXRCeU5hbWUobm9kZVR5cGVTdHIpOworCisJCQkJCWlmIChub2RlVHlwZSA9PSBudWxsKSB7CisJCQkJCQlsb2cuZGVidWcoIm1pc3Npbmcgbm9kZSBsYWJlbCBmb3IgdmVydGV4IHt9IiwgdmVydGV4Q29tcG9uZW50KTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJaWYgKG5lZWRlZFR5cGUuZXF1YWxzKG5vZGVUeXBlKSkgeworCQkJCQkJc3dpdGNoIChub2RlVHlwZSkgeworCQkJCQkJY2FzZSBTZXJ2aWNlOgorCQkJCQkJCWhhbmRsZU5vZGUoY29tcG9uZW50cywgdmVydGV4Q29tcG9uZW50LCBub2RlVHlwZSwgaW5UcmFuc2FjdGlvbik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFJlc291cmNlOgorCQkJCQkJCUJvb2xlYW4gaXNBYnRyYWN0ID0gdmVydGV4Q29tcG9uZW50LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfQUJTVFJBQ1QuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQkJaWYgKGZhbHNlID09IGlzQWJ0cmFjdCkgeworCQkJCQkJCQloYW5kbGVOb2RlKGNvbXBvbmVudHMsIHZlcnRleENvbXBvbmVudCwgbm9kZVR5cGUsIGluVHJhbnNhY3Rpb24pOworCQkJCQkJCX0gLy8gaWYgbm90IGFic3RyYWN0CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFByb2R1Y3Q6CisJCQkJCQkJaGFuZGxlTm9kZShjb21wb25lbnRzLCB2ZXJ0ZXhDb21wb25lbnQsIG5vZGVUeXBlLCBpblRyYW5zYWN0aW9uKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJbG9nLmRlYnVnKCJub3Qgc3VwcG9ydGVkIG5vZGUgdHlwZSB7fSIsIG5vZGVUeXBlKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0vLyBjYXNlCisJCQkJCX0gLy8gbmVlZGVkIHR5cGUKKwkJCQl9CisJCQl9IC8vIGlmCisJCX0gLy8gd2hpbGUgcmVzb3VyY2VzCisJCXJldHVybiBjb21wb25lbnRzOworCX0KKworCXByb3RlY3RlZCA8VD4gdm9pZCBoYW5kbGVOb2RlKExpc3Q8VD4gY29tcG9uZW50cywgVmVydGV4IHZlcnRleENvbXBvbmVudCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJU3RyaW5nIGlkOworCisJCWlkID0gdmVydGV4Q29tcG9uZW50LnZhbHVlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSk7CisJCWlmIChpZCAhPSBudWxsKSB7CisJCQlFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50ID0gZ2V0TGlnaHRDb21wb25lbnQoaWQsIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgY29tcG9uZW50IGZvciBpZCA9IHt9IGVycm9yOiB7fSBza2lwIHJlc291cmNlIiwgaWQsIGNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQljb21wb25lbnRzLmFkZChjb21wb25lbnQubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9IGVsc2UgeworCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSB0aGlzLnRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKHZlcnRleENvbXBvbmVudCk7CisJCQlsb2cuZGVidWcoIm1pc3NpbmcgcmVzb3VyY2UgdW5pcXVlIGlkIGZvciBub2RlIHdpdGggcHJvcGVydGllcyB7fSIsIHByb3BlcnRpZXMpOworCQl9CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqIEBwYXJhbSBpblRyYW5zYWN0aW9uCisJICogQHBhcmFtIHRpdGFuR2VuZXJpY0RhbworCSAqIEBwYXJhbSBjbGF6egorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvLCBDbGFzczxUPiBjbGF6eiwgTm9kZVR5cGVFbnVtIHR5cGUpIHsKKworCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQlyZXR1cm4gdXBkYXRlQ29tcG9uZW50RmlsdGVyUmVzdWx0KGNvbXBvbmVudCwgaW5UcmFuc2FjdGlvbiwgdGl0YW5HZW5lcmljRGFvLCBjbGF6eiwgdHlwZSwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8QXJ0aWZhY3REYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZW5lcmF0ZUFuZFVwZGF0ZVRvc2NhRmlsZU5hbWUoU3RyaW5nIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSB0eXBlLCBBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q29uZmlnID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFRvc2NhQXJ0aWZhY3RzKCkuZW50cnlTZXQoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSkpCisJCQkJLmZpbmRBbnkoKS5nZXQoKS5nZXRWYWx1ZSgpOworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3ROYW1lKGNvbXBvbmVudFR5cGUgKyAiLSIgKyBjb21wb25lbnROYW1lICsgZ2V0Q29uZmlnLmdldCgiYXJ0aWZhY3ROYW1lIikpOworCQlyZXR1cm4gYXJ0aWZhY3RPcGVyYXRpb24udXBkYXRlVG9zY2FBcnRpZmFjdE5hbWVPbkdyYXBoKGFydGlmYWN0SW5mbywgYXJ0aWZhY3RJbmZvLmdldFVuaXF1ZUlkKCksIHR5cGUsIGNvbXBvbmVudElkKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBtb3ZlQ2F0ZWdvcnlFZGdlKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnREYXRhLCBDYXRlZ29yeURlZmluaXRpb24gbmV3Q2F0ZWdvcnksIE5vZGVUeXBlRW51bSB0eXBlKSB7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJCUdyYXBoUmVsYXRpb24gY2F0ZWdvcnlSZWxhdGlvbiA9IG5ldyBHcmFwaFJlbGF0aW9uKCk7CisJCWNhdGVnb3J5UmVsYXRpb24uc2V0VHlwZShHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlkuZ2V0UHJvcGVydHkoKSk7CisJCVJlbGF0aW9uRW5kUG9pbnQgcmVsYXRpb25FbmRQb2ludCA9IG5ldyBSZWxhdGlvbkVuZFBvaW50KHR5cGUsIFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKHR5cGUpLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCWNhdGVnb3J5UmVsYXRpb24uc2V0RnJvbShyZWxhdGlvbkVuZFBvaW50KTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVPdXRnb2luZ1JlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU91dGdvaW5nUmVsYXRpb24oY2F0ZWdvcnlSZWxhdGlvbik7CisJCWlmIChkZWxldGVPdXRnb2luZ1JlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIGNhdGVnb3J5IGZyb20gY29tcG9uZW50IHt9LiBFZGdlIHR5cGUgaXMge30iLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSk7CisJCQlyZXN1bHQgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGRlbGV0ZU91dGdvaW5nUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlsb2cuZGVidWcoIkFmdGVyIHJlbW92aW5nIGVkZ2UgZnJvbSBncmFwaCB7fSIsIGRlbGV0ZU91dGdvaW5nUmVsYXRpb24pOworCisJCU5vZGVUeXBlRW51bSBjYXRlZ29yeVR5cGU7CisJCWlmIChOb2RlVHlwZUVudW0uU2VydmljZS5uYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0eXBlLm5hbWUoKSkpIHsKKwkJCWNhdGVnb3J5VHlwZSA9IE5vZGVUeXBlRW51bS5TZXJ2aWNlQ2F0ZWdvcnk7CisJCX0gZWxzZSB7CisJCQljYXRlZ29yeVR5cGUgPSBOb2RlVHlwZUVudW0uUmVzb3VyY2VDYXRlZ29yeTsKKwkJfQorCQlFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjYXRlZ29yeVJlc3VsdCA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0TmV3Q2F0ZWdvcnlEYXRhKG5ld0NhdGVnb3J5LmdldE5hbWUoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJaWYgKGNhdGVnb3J5UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXRlZ29yeVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIGNhdGVnb3J5ICIgKyBuZXdDYXRlZ29yeS5nZXROYW1lKCkgKyAiIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCUNhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEgPSBjYXRlZ29yeVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihjb21wb25lbnREYXRhLCBjYXRlZ29yeURhdGEsIEdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSwgbnVsbCk7CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcgY2F0ZWdvcnkge30gdG8gY29tcG9uZW50IHt9LiBFZGdlIHR5cGUgaXMge30iLCBjYXRlZ29yeURhdGEsIGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkNBVEVHT1JZKTsKKwkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGNhdGVnb3J5IHt9IHRvIGNvbXBvbmVudCB7fS4gRWRnZSB0eXBlIGlzIHt9IiwgY2F0ZWdvcnlEYXRhLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSk7CisJCQlyZXN1bHQgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNyZWF0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgbW92ZUxhc3RNb2RpZmllckVkZ2UoQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudERhdGEsIFVzZXJEYXRhIG1vZGlmaWVyVXNlckRhdGEsIE5vZGVUeXBlRW51bSB0eXBlKSB7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJCUdyYXBoUmVsYXRpb24gbGFzdE1vZGlmaWVyUmVsYXRpb24gPSBuZXcgR3JhcGhSZWxhdGlvbigpOworCQlsYXN0TW9kaWZpZXJSZWxhdGlvbi5zZXRUeXBlKEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSLmdldFByb3BlcnR5KCkpOworCQlSZWxhdGlvbkVuZFBvaW50IHJlbGF0aW9uRW5kUG9pbnQgPSBuZXcgUmVsYXRpb25FbmRQb2ludCh0eXBlLCBVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZSh0eXBlKSwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQlsYXN0TW9kaWZpZXJSZWxhdGlvbi5zZXRUbyhyZWxhdGlvbkVuZFBvaW50KTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVJbmNvbWluZ1JlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZUluY29taW5nUmVsYXRpb24obGFzdE1vZGlmaWVyUmVsYXRpb24pOworCQlpZiAoZGVsZXRlSW5jb21pbmdSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSB1c2VyIGZyb20gY29tcG9uZW50IHt9LiBFZGdlIHR5cGUgaXMge30iLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSKTsKKwkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZGVsZXRlSW5jb21pbmdSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24obW9kaWZpZXJVc2VyRGF0YSwgY29tcG9uZW50RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkxBU1RfTU9ESUZJRVIsIG51bGwpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHVzZXIge30gdG8gY29tcG9uZW50IHt9LiBFZGdlIHR5cGUgaXMge30iLCBtb2RpZmllclVzZXJEYXRhLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSKTsKKwkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHVzZXIge30gdG8gY29tcG9uZW50IHt9LiBFZGdlIHR5cGUgaXMge30iLCBtb2RpZmllclVzZXJEYXRhLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSKTsKKwkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoY3JlYXRlUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9uZW50TWV0YWRhdGFEYXRhIGdldE1ldGFEYXRhRnJvbUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KTsKKworCXB1YmxpYyBhYnN0cmFjdCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgYWJzdHJhY3QgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnQoU3RyaW5nIGlkLCBDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgYm9vbGVhbiBpblRyYXNuYWN0aW9uKTsKKworCS8vIHB1YmxpYyBhYnN0cmFjdCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+CisJLy8gZ2V0Q29tcG9uZW50X3R4KFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgYWJzdHJhY3QgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMaWdodENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwdWJsaWMgYWJzdHJhY3QgPFQ+IEVpdGhlcjxMaXN0PFQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRGaWx0ZXJlZENvbXBvbmVudHMoTWFwPEZpbHRlcktleUVudW0sIFN0cmluZz4gZmlsdGVycywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCWFic3RyYWN0IENvbXBvbmVudCBjb252ZXJ0Q29tcG9uZW50TWV0YWRhdGFEYXRhVG9Db21wb25lbnQoQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudE1ldGFkYXRhRGF0YSk7CisKKwlhYnN0cmFjdCBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRDb21wb25lbnRDYXRlZ29yaWVzRnJvbUdyYXBoKENvbXBvbmVudCBjb21wb25lbnQpOworCisJcHJvdGVjdGVkIGFic3RyYWN0IEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE1ldGFkYXRhQ29tcG9uZW50KFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudChUIGNvbXBvbmVudCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudEZpbHRlclJlc3VsdChUIGNvbXBvbmVudCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBmaWx0ZXJQYXJhbWV0ZXJzVmlldyk7CisKKwlwdWJsaWMgYWJzdHJhY3QgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQ29tcG9uZW50KFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lQ29tcG9uZW50KFQgb3RoZXIsIFN0cmluZyB2ZXJzaW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIGNsb25lQ29tcG9uZW50KG90aGVyLCB2ZXJzaW9uLCBudWxsLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNvbXBvbmVudChUIG90aGVyLCBTdHJpbmcgdmVyc2lvbiwgTGlmZWN5Y2xlU3RhdGVFbnVtIHRhcmdldExpZmVjeWNsZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXB1YmxpYyBhYnN0cmFjdCBDb21wb25lbnQgZ2V0RGVmYXVsdENvbXBvbmVudCgpOworCisJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21wb25lbnRFeGlzdChTdHJpbmcgY29tcG9uZW50SWQpOworCisJcHVibGljIGFic3RyYWN0IEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVFeGlzdHMoU3RyaW5nIGNvbXBvbmVudE5hbWUpOworCisJcHVibGljIGFic3RyYWN0IEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0NvbXBvbmVudEluVXNlKFN0cmluZyBjb21wb25lbnRJZCk7CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGlzQ29tcG9uZW50SW5Vc2UoU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShuZXcgVW5pcXVlSWREYXRhKG5vZGVUeXBlLCBjb21wb25lbnRJZCksIEdyYXBoRWRnZUxhYmVscy5JTlNUQU5DRV9PRiwgbnVsbCk7CisJCWlmIChyZWxhdGlvbkJ5Q3JpdGVyaWEuaXNSaWdodCgpICYmICFyZWxhdGlvbkJ5Q3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBjaGVjayByZWxhdGlvbnMgZm9yIGNvbXBvbmVudCBub2RlLiBpZCA9IHt9LCB0eXBlID0ge30sIGVycm9yID0ge30iLCBjb21wb25lbnRJZCwgbm9kZVR5cGUsIHJlbGF0aW9uQnlDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZWxhdGlvbkJ5Q3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKworCQlpZiAocmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKSB7CisJCQkvLyBjb21wb25lbnQgaXMgaW4gdXNlCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCQl9CisKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ29tcG9uZW50c01hcmtlZEZvckRlbGV0aW9uKCk7CisKKwlwcm90ZWN0ZWQgRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ29tcG9uZW50c01hcmtlZEZvckRlbGV0aW9uKE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCisJCUxpc3Q8U3RyaW5nPiBjb21wb25lbnRJZHNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkvLyBnZXQgYWxsIGNvbXBvbmVudHMgbWFya2VkIGZvciBkZWxldGUKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ERUxFVEVELmdldFByb3BlcnR5KCksIHRydWUpOworCisJCUVpdGhlcjxMaXN0PENvbXBvbmVudE1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRzVG9EZWxldGUgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShub2RlVHlwZSwgcHJvcHMsIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKGNvbXBvbmVudHNUb0RlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gY29tcG9uZW50c1RvRGVsZXRlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChlcnJvci5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCWxvZy50cmFjZSgibm8gY29tcG9uZW50cyB0byBkZWxldGUiKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29tcG9uZW50SWRzVG9EZWxldGUpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuaW5mbygiZmFpbGVkIHRvIGZpbmQgY29tcG9uZW50cyB0byBkZWxldGUuIGVycm9yIDoge30iLCBlcnJvci5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhlcnJvcikpOworCQkJfQorCisJCX0KKwkJZm9yIChDb21wb25lbnRNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhIDogY29tcG9uZW50c1RvRGVsZXRlLmxlZnQoKS52YWx1ZSgpKSB7CisJCQljb21wb25lbnRJZHNUb0RlbGV0ZS5hZGQocmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29tcG9uZW50SWRzVG9EZWxldGUpOworCX0KKworCXByb3RlY3RlZCA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBfX2dldExhc3RWZXJzaW9uKE5vZGVUeXBlRW51bSB0eXBlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzLCBDbGFzczxUPiBjbGF6eikgeworCQl0cnkgeworCisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChncmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlUaXRhbkdyYXBoIHRHcmFwaCA9IGdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQkJVGl0YW5HcmFwaFF1ZXJ5PD8gZXh0ZW5kcyBUaXRhbkdyYXBoUXVlcnk+IHF1ZXJ5ID0gdEdyYXBoLnF1ZXJ5KCk7CisJCQlxdWVyeSA9IHF1ZXJ5LmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIHR5cGUuZ2V0TmFtZSgpKTsKKworCQkJaWYgKHByb3BzICE9IG51bGwgJiYgIXByb3BzLmlzRW1wdHkoKSkgeworCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHByb3BzLmVudHJ5U2V0KCkpIHsKKwkJCQkJcXVlcnkgPSBxdWVyeS5oYXNOb3QoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJCXF1ZXJ5LmhhcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKworCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gcXVlcnkudmVydGljZXMoKTsKKworCQkJaWYgKHZlcnRpY2VzID09IG51bGwpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQl9CisKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCQlMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld1Byb3AgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyh2ZXJ0ZXgpOworCQkJCVQgZWxlbWVudCA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgbmV3UHJvcCwgY2xhenopOworCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7CisJCQl9CisJCQlpZiAocmVzdWx0LnNpemUoKSA9PSAwKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfQorCQkJbG9nLmRlYnVnKCJObyBub2RlcyBpbiBncmFwaCBmb3IgY3JpdGVyaWEgOiBmcm9tIHR5cGUgPSB7fSBhbmQgcHJvcGVydGllcyA9IHt9IiwgdHlwZSwgcHJvcHMpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCBnZXQgYnkgY3JpdGVyaWEgZm9yIHR5cGUgPSB7fSBhbmQgcHJvcGVydGllcyA9IHt9LiB7fSIsIHR5cGUsIHByb3BzLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5HcmFwaENsaWVudC5oYW5kbGVUaXRhbkV4Y2VwdGlvbihlKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxMaXN0PFQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0TGFzdFZlcnNpb24oTm9kZVR5cGVFbnVtIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gaGFzTm90UHJvcHMsIENsYXNzPFQ+IGNsYXp6KSB7CisJCXJldHVybiBnZXRMYXN0VmVyc2lvbih0eXBlLCBudWxsLCBoYXNOb3RQcm9wcywgY2xhenopOworCX0KKworCXByb3RlY3RlZCA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXN0VmVyc2lvbihOb2RlVHlwZUVudW0gdHlwZSwgTWFwPFN0cmluZywgT2JqZWN0PiBoYXNQcm9wcywgTWFwPFN0cmluZywgT2JqZWN0PiBoYXNOb3RQcm9wcywgQ2xhc3M8VD4gY2xhenopIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCisJCWlmIChoYXNQcm9wcyAhPSBudWxsKSB7CisJCQlwcm9wcy5wdXRBbGwoaGFzUHJvcHMpOworCQl9CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKworCQlFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYSh0eXBlLCBwcm9wcywgaGFzTm90UHJvcHMsIGNsYXp6KTsKKworCQlyZXR1cm4gYnlDcml0ZXJpYTsKKworCX0KKworCXB1YmxpYyA8VCwgUyBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPFNldDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50Q2F0YWxvZ0RhdGEoTm9kZVR5cGVFbnVtIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2gsIENsYXNzPFQ+IGNsYXp6MSwgQ2xhc3M8Uz4gY2xhenoyLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJbG9nLmRlYnVnKCJTdGFydCBnZXRDb21wb25lbnRDYXRhbG9nRGF0YSBmb3IgdHlwZToge30iLCB0eXBlLm5hbWUoKSk7CisJCVNldDxUPiByZXN1bHQgPSBuZXcgSGFzaFNldDxUPigpOworCQlFaXRoZXI8TGlzdDxTPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGxhc3RWZXJzaW9uTm9kZXMgPSBnZXRMYXN0VmVyc2lvbih0eXBlLCBwcm9wZXJ0aWVzVG9NYXRjaCwgY2xhenoyKTsKKwkJRWl0aGVyPFNldDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbGFzdCA9IHJldHJpZXZlQ29tcG9uZW50c0Zyb21Ob2RlcyhsYXN0VmVyc2lvbk5vZGVzLCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGxhc3QuaXNMZWZ0KCkgJiYgbGFzdC5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKSB7CisJCQlyZXN1bHQuYWRkQWxsKGxhc3QubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCWlmICh0eXBlID09IE5vZGVUeXBlRW51bS5SZXNvdXJjZSkgeworCQkJcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfQUJTVFJBQ1QuZ2V0UHJvcGVydHkoKSwgZmFsc2UpOworCQl9CisJCUVpdGhlcjxMaXN0PFM+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50c05vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEodHlwZSwgcHJvcGVydGllc1RvTWF0Y2gsIGNsYXp6Mik7CisJCUVpdGhlcjxTZXQ8VD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNlcnRpZmllZCA9IHJldHJpZXZlQ29tcG9uZW50c0Zyb21Ob2Rlcyhjb21wb25lbnRzTm9kZXMsIGluVHJhbnNhY3Rpb24pOworCQlpZiAoY2VydGlmaWVkLmlzTGVmdCgpICYmIGNlcnRpZmllZC5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKSB7CisJCQlyZXN1bHQuYWRkQWxsKGNlcnRpZmllZC5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisKKwl9CisKKwlwcm90ZWN0ZWQgPFQsIFMgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxTZXQ8VD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJldHJpZXZlQ29tcG9uZW50c0Zyb21Ob2RlcyhFaXRoZXI8TGlzdDxTPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudHNOb2RlcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCVNldDxUPiByZXN1bHQgPSBuZXcgSGFzaFNldDxUPigpOworCQlpZiAoY29tcG9uZW50c05vZGVzLmlzUmlnaHQoKSkgeworCQkJLy8gaW4gY2FzZSBvZiBOT1RfRk9VTkQgZnJvbSBUaXRhbiBjbGllbnQgcmV0dXJuIHRvIFVJIGVtcHR5IGxpc3QKKwkJCWlmIChjb21wb25lbnRzTm9kZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJbG9nLmRlYnVnKCJObyBjb21wb25lbnRzIHdlcmUgZm91bmQiKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNvbXBvbmVudHNOb2Rlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxpc3Q8Uz4gY29tcG9uZW50RGF0YUxpc3QgPSBjb21wb25lbnRzTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlmb3IgKFMgY29tcG9uZW50RGF0YSA6IGNvbXBvbmVudERhdGFMaXN0KSB7CisJCQkJLy8gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudCA9CisJCQkJLy8gZ2V0Q29tcG9uZW50KChTdHJpbmcpIGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSwKKwkJCQkvLyBpblRyYW5zYWN0aW9uKTsKKwkJCQlFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50ID0gZ2V0TGlnaHRDb21wb25lbnQoKFN0cmluZykgY29tcG9uZW50RGF0YS5nZXRVbmlxdWVJZCgpLCBpblRyYW5zYWN0aW9uKTsKKwkJCQlpZiAoY29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgY29tcG9uZW50IGZvciBpZCA9IHt9IGVycm9yIDoge30gc2tpcCByZXNvdXJjZSIsIGNvbXBvbmVudERhdGEuZ2V0VW5pcXVlSWQoKSwgY29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCS8vIHJldHVybiBFaXRoZXIucmlnaHQoc2VydmljZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdC5hZGQoY29tcG9uZW50LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJfQorCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlQXJ0aWZhY3RzRnJvbUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCisJCVN0cmluZyBjb21wb25lbnRJZCA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkvLyBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IGNvbXBvbmVudC5nZXRBcnRpZmFjdHMoKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0c1JlcyA9IGFydGlmYWN0T3BlcmF0aW9uLmdldEFydGlmYWN0cyhjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZSwgdHJ1ZSk7CisJCWlmIChhcnRpZmFjdHNSZXMuaXNSaWdodCgpICYmICFhcnRpZmFjdHNSZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCXJldHVybiBhcnRpZmFjdHNSZXMucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCWlmIChhcnRpZmFjdHNSZXMuaXNMZWZ0KCkgJiYgYXJ0aWZhY3RzUmVzLmxlZnQoKS52YWx1ZSgpICE9IG51bGwpIHsKKwkJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gYXJ0aWZhY3RzUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVtb3ZlQXJpZmFjdEZyb21SZXNvdXJjZSA9IGFydGlmYWN0T3BlcmF0aW9uLnJlbW92ZUFyaWZhY3RGcm9tUmVzb3VyY2UoY29tcG9uZW50SWQsIGFydGlmYWN0RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnRUeXBlLCB0cnVlLCB0cnVlKTsKKwkJCQlpZiAocmVtb3ZlQXJpZmFjdEZyb21SZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIHJlbW92ZUFyaWZhY3RGcm9tUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0VGVzdGVyRm9sbG93ZWRDb21wb25lbnQoU3RyaW5nIHVzZXJJZCwgU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24sIE5vZGVUeXBlRW51bSBuZWVkZWRUeXBlKSB7CisJCUxpc3Q8Q29tcG9uZW50PiByZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVpdGhlcjxMaXN0PENvbXBvbmVudD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJpcCA9IGdldEZvbGxvd2VkQ29tcG9uZW50KHVzZXJJZCwgbGlmZWN5Y2xlU3RhdGVzLCBudWxsLCBpblRyYW5zYWN0aW9uLCB0aXRhbkdlbmVyaWNEYW8sIG5lZWRlZFR5cGUpOworCQlpZiAocmlwLmlzTGVmdCgpKSB7CisJCQlMaXN0PENvbXBvbmVudD4gcmlwUmVzID0gcmlwLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJpcFJlcyAhPSBudWxsICYmICFyaXBSZXMuaXNFbXB0eSgpKSB7CisJCQkJcmVzTGlzdC5hZGRBbGwocmlwUmVzKTsKKwkJCX0KKwkJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IHJmY1N0YXRlID0gbmV3IEhhc2hTZXQ8PigpOworCQkJcmZjU3RhdGUuYWRkKExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZmMgPSBnZXRGb2xsb3dlZENvbXBvbmVudChudWxsLCByZmNTdGF0ZSwgbnVsbCwgaW5UcmFuc2FjdGlvbiwgdGl0YW5HZW5lcmljRGFvLCBuZWVkZWRUeXBlKTsKKwkJCWlmIChyZmMuaXNMZWZ0KCkpIHsKKwkJCQlMaXN0PENvbXBvbmVudD4gcmZjUmVzID0gcmZjLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChyZmNSZXMgIT0gbnVsbCAmJiAhcmZjUmVzLmlzRW1wdHkoKSkgeworCQkJCQlyZXNMaXN0LmFkZEFsbChyZmNSZXMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZmMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChyaXAucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzTGlzdCk7CisKKwl9CisKKwkvKioKKwkgKiBnZW5lcmF0ZSBVVUlEIG9ubHkgZm9yIGNhc2UgdGhhdCB2ZXJzaW9uIGlzICJYWC4wMSIgLSAoc3RhcnQgbmV3IHZlcnNpb24pCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqLworCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVVVJRChDb21wb25lbnQgY29tcG9uZW50KSB7CisJCVN0cmluZyB2ZXJzaW9uID0gY29tcG9uZW50LmdldFZlcnNpb24oKTsKKwkJaWYgKHV1aWROZXdWZXJzaW9uLm1hdGNoZXIodmVyc2lvbikubWF0Y2hlcygpKSB7CisJCQlVVUlEIHV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKwkJCWNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VVVJRCh1dWlkLnRvU3RyaW5nKCkpOworCQkJTURDLnB1dCgic2VydmljZUluc3RhbmNlSUQiLCB1dWlkLnRvU3RyaW5nKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgR3JhcGhOb2RlPiBFaXRoZXI8TWFwPFN0cmluZywgU3RyaW5nPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFZlcnNpb25MaXN0KE5vZGVUeXBlRW51bSB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgQ29tcG9uZW50IGNvbXBvbmVudCwgQ2xhc3M8VD4gY2xhenopIHsKKwkJcmV0dXJuIGdldFZlcnNpb25MaXN0KHR5cGUsIHZlcnNpb24sIGNvbXBvbmVudC5nZXRVVUlEKCksIGNvbXBvbmVudC5nZXRTeXN0ZW1OYW1lKCksIGNsYXp6KTsKKwl9CisKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0VmVyc2lvbkxpc3QoTm9kZVR5cGVFbnVtIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgdXVpZCwgU3RyaW5nIHN5c3RlbU5hbWUsIENsYXNzPFQ+IGNsYXp6KSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBoYXNOb3RQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWlmICh2ZXJzaW9uLnN0YXJ0c1dpdGgoIjAiKSkgeworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVVVJRC5nZXRQcm9wZXJ0eSgpLCB1dWlkKTsKKwkJfSBlbHNlIHsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNZU1RFTV9OQU1FLmdldFByb3BlcnR5KCksIHN5c3RlbU5hbWUpOworCQl9CisJCWhhc05vdFByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0RFTEVURUQuZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCUVpdGhlcjxMaXN0PFQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEodHlwZSwgcHJvcHMsIGhhc05vdFByb3BzLCBjbGF6eik7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQlpZiAoIXJlc3VsdC5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgUmVzb3VyY2U6CisJCQkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gY29tcG9uZW50cyA9IChMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPikgcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgZGF0YSA6IGNvbXBvbmVudHMpIHsKKwkJCQkJdmVyc2lvbk1hcC5wdXQoZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpLCAoU3RyaW5nKSBkYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU2VydmljZToKKwkJCQlMaXN0PFNlcnZpY2VNZXRhZGF0YURhdGE+IGNvbXBvbmVudHNTID0gKExpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4pIHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlmb3IgKFNlcnZpY2VNZXRhZGF0YURhdGEgZGF0YSA6IGNvbXBvbmVudHNTKSB7CisJCQkJCXZlcnNpb25NYXAucHV0KGRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSwgKFN0cmluZykgZGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFByb2R1Y3Q6CisJCQkJTGlzdDxQcm9kdWN0TWV0YWRhdGFEYXRhPiBjb21wb25lbnRzUCA9IChMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+KSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQkJZm9yIChQcm9kdWN0TWV0YWRhdGFEYXRhIGRhdGEgOiBjb21wb25lbnRzUCkgeworCQkJCQl2ZXJzaW9uTWFwLnB1dChkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCksIChTdHJpbmcpIGRhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdCh2ZXJzaW9uTWFwKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb24oTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQpIHsKKworCQlFaXRoZXI8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVzID0gYWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLmRlbGV0ZUFsbEFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcmFtZXRlcnMobm9kZVR5cGUsIGNvbXBvbmVudElkLCB0cnVlKTsKKworCQlpZiAoZGVsZXRlUmVzLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uIGluZm9ybWF0aW9uRGVmaW5pdGlvbikgeworCisJCUVpdGhlcjxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gYWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uLmFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbk5vZGUobm9kZVR5cGUsIGNvbXBvbmVudElkLCBpbmZvcm1hdGlvbkRlZmluaXRpb24pOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhblN0YXR1cyA9IHN0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh0aXRhblN0YXR1cyk7CisJCX0KKworCQlsb2cudHJhY2UoIkFmdGVyIGFkZGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGNvbXBvbmVudCB7fS4gUmVzdWx0IGlzIHt9IiwgY29tcG9uZW50SWQsIHN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwcm90ZWN0ZWQgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb24oTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQsIEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24gaW5mb3JtYXRpb25EZWZpbml0aW9uLCBUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCkgeworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbi5hZGRBZGRpdGlvbmFsSW5mb3JtYXRpb25Ob2RlKG5vZGVUeXBlLCBjb21wb25lbnRJZCwgaW5mb3JtYXRpb25EZWZpbml0aW9uLCBtZXRhZGF0YVZlcnRleCk7CisJCWxvZy50cmFjZSgiQWZ0ZXIgYWRkaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gY29tcG9uZW50IHt9LiBSZXN1bHQgaXMge30iLCBjb21wb25lbnRJZCwgc3RhdHVzKTsKKworCQlpZiAoIXN0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpOworCQl9CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50QXJ0aWZhY3RzRm9yRGVsZXRlKFN0cmluZyBwYXJlbnRJZCwgTm9kZVR5cGVFbnVtIHBhcmVudFR5cGUsIGJvb2xlYW4gaW5UcmFuc2FjdG9uKSB7CisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0c1Jlc3BvbnNlID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RzKHBhcmVudElkLCBwYXJlbnRUeXBlLCBpblRyYW5zYWN0b24pOworCQlpZiAoYXJ0aWZhY3RzUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlpZiAoIWFydGlmYWN0c1Jlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gcmV0cmlldmUgYXJ0aWZhY3RzIGZvciB7fSB7fSIsIHBhcmVudFR5cGUsIHBhcmVudElkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFydGlmYWN0c1Jlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhcnRpZmFjdHMuYWRkQWxsKGFydGlmYWN0c1Jlc3BvbnNlLmxlZnQoKS52YWx1ZSgpLnZhbHVlcygpKTsKKwkJfQorCisJCWlmIChOb2RlVHlwZUVudW0uUmVzb3VyY2UuZXF1YWxzKHBhcmVudFR5cGUpKSB7CisJCQlFaXRoZXI8TGlzdDxBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbnRlcmZhY2VzQXJ0aWZhY3RzRm9yUmVzb3VyY2UgPSBnZXRBZGRpdGlvbmFsQXJ0aWZhY3RzKHBhcmVudElkLCBmYWxzZSwgdHJ1ZSk7CisJCQlpZiAoYXJ0aWZhY3RzUmVzcG9uc2UuaXNSaWdodCgpICYmICFpbnRlcmZhY2VzQXJ0aWZhY3RzRm9yUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byByZXRyaWV2ZSBpbnRlcmZhY2UgYXJ0aWZhY3RzIGZvciB7fSB7fSIsIHBhcmVudFR5cGUsIHBhcmVudElkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGludGVyZmFjZXNBcnRpZmFjdHNGb3JSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIGlmIChhcnRpZmFjdHNSZXNwb25zZS5pc0xlZnQoKSkgeworCQkJCWFydGlmYWN0cy5hZGRBbGwoaW50ZXJmYWNlc0FydGlmYWN0c0ZvclJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoYXJ0aWZhY3RzKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRJbnRlcm5hbEZpZWxkcyhDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50TWV0YWRhdGFEYXRhKSB7CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLkNvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IGNvbXBvbmVudE1ldGFkYXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCk7CisJCUxvbmcgY3JlYXRpb25EYXRlID0gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXRDcmVhdGlvbkRhdGUoKTsKKworCQlsb25nIGN1cnJlbnREYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWlmIChjcmVhdGlvbkRhdGUgPT0gbnVsbCkgeworCQkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5zZXRDcmVhdGlvbkRhdGUoY3VycmVudERhdGUpOworCQl9CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uc2V0TGFzdFVwZGF0ZURhdGUoY3VycmVudERhdGUpOworCisJCVN0cmluZyBsaWZlY3ljbGVTdGF0ZUVudW0gPSBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldFN0YXRlKCk7CisJCWlmIChsaWZlY3ljbGVTdGF0ZUVudW0gPT0gbnVsbCkgeworCQkJbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpOworCQl9CisJCVN0cmluZyBjb21wb25lbnRVbmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZENvbXBvbmVudFVuaXF1ZUlkKCk7CisJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uc2V0VW5pcXVlSWQoY29tcG9uZW50VW5pcXVlSWQpOworCQltZXRhZGF0YURhdGFEZWZpbml0aW9uLnNldEhpZ2hlc3RWZXJzaW9uKHRydWUpOworCX0KKworCXByb3RlY3RlZCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVRhZ3NGb3JDb21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlMaXN0PFN0cmluZz4gdGFncyA9IGNvbXBvbmVudC5nZXRUYWdzKCk7CisJCWlmICh0YWdzICE9IG51bGwgJiYgZmFsc2UgPT0gdGFncy5pc0VtcHR5KCkpIHsKKwkJCUVpdGhlcjxMaXN0PFRhZ0RhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB0YWdzUmVzdWx0ID0gY3JlYXRlTmV3VGFnc0xpc3QodGFncyk7CisKKwkJCWlmICh0YWdzUmVzdWx0ID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoInRhZ3NSZXN1bHQgaXMgbnVsbCIpOworCQkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQl9CisJCQlpZiAodGFnc1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gdGFnc1Jlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQl9CisJCQlMaXN0PFRhZ0RhdGE+IHRhZ3NUb0NyZWF0ZSA9IHRhZ3NSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gY3JlYXRlVGFnTm9kZXNPbkdyYXBoKHRhZ3NUb0NyZWF0ZSk7CisJCX0KKwkJbG9nLnRyYWNlKCJBbGwgdGFncyBjcmVhdGVkIHN1Y2Nlc2Z1bGx5IGZvciBjb21wb25lbnQge30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8TGlzdDxHcm91cGluZ0RhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmaW5kR3JvdXBpbmdzRm9yQ29tcG9uZW50KE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBjb21wb25lbnQuZ2V0Q2F0ZWdvcmllcygpOworCQlMaXN0PEdyb3VwaW5nRGF0YT4gZ3JvdXBpbmdEYXRhVG9Bc3NvY2lhdGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKGNhdGVnb3JpZXMgIT0gbnVsbCkgeworCQkJZ3JvdXBpbmdEYXRhVG9Bc3NvY2lhdGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiA6IGNhdGVnb3JpZXMpIHsKKwkJCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gc3ViY2F0ZWdvcmllcyA9IGNhdGVnb3J5RGVmaW5pdGlvbi5nZXRTdWJjYXRlZ29yaWVzKCk7CisJCQkJaWYgKHN1YmNhdGVnb3JpZXMgIT0gbnVsbCkgeworCQkJCQlmb3IgKFN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeURlZmluaXRpb24gOiBzdWJjYXRlZ29yaWVzKSB7CisJCQkJCQlMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4gZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbnMgPSBzdWJDYXRlZ29yeURlZmluaXRpb24uZ2V0R3JvdXBpbmdzKCk7CisJCQkJCQlpZiAoZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbnMgIT0gbnVsbCkgeworCQkJCQkJCWZvciAoR3JvdXBpbmdEYXRhRGVmaW5pdGlvbiBncm91cGluZyA6IGdyb3VwaW5nRGF0YURlZmluaXRpb25zKSB7CisJCQkJCQkJCVN0cmluZyBncm91cGluZ0lkID0gZ3JvdXBpbmcuZ2V0VW5pcXVlSWQoKTsKKwkJCQkJCQkJRWl0aGVyPEdyb3VwaW5nRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRHcm91cGluZ0VpdGhlciA9IGZpbmRHcm91cGluZyhub2RlVHlwZUVudW0sIGdyb3VwaW5nSWQpOworCQkJCQkJCQlpZiAoZmluZEdyb3VwaW5nRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZEdyb3VwaW5nRWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJCQkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgZ3JvdXBpbmcge30gaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMge30iLCBncm91cGluZ0lkLCBzdGF0dXMpOworCQkJCQkJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQ0FURUdPUllfTk9UX0ZPVU5EKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWdyb3VwaW5nRGF0YVRvQXNzb2NpYXRlLmFkZChmaW5kR3JvdXBpbmdFaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChncm91cGluZ0RhdGFUb0Fzc29jaWF0ZSk7CisJfQorCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUdyb3VwaW5nc1RvQ29tcG9uZW50KENvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnRNZXRhZGF0YURhdGEsIExpc3Q8R3JvdXBpbmdEYXRhPiBncm91cGluZ0RhdGFUb0Fzc29jaWF0ZSkgeworCQlmb3IgKEdyb3VwaW5nRGF0YSBncm91cGluZ0RhdGEgOiBncm91cGluZ0RhdGFUb0Fzc29jaWF0ZSkgeworCQkJR3JhcGhFZGdlTGFiZWxzIGdyb3VwaW5nTGFiZWwgPSBHcmFwaEVkZ2VMYWJlbHMuR1JPVVBJTkc7CisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihjb21wb25lbnRNZXRhZGF0YURhdGEsIGdyb3VwaW5nRGF0YSwgZ3JvdXBpbmdMYWJlbCwgbnVsbCk7CisJCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIGdyb3VwaW5nIHt9IHRvIGNvbXBvbmVudCB7fS4gRWRnZSB0eXBlIGlzIHt9IiwgZ3JvdXBpbmdEYXRhLCBjb21wb25lbnRNZXRhZGF0YURhdGEsIGdyb3VwaW5nTGFiZWwpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0KKwkJfQorCQlsb2cudHJhY2UoIkFsbCBncm91cGluZ3MgYXNzb2NpYXRlZCBzdWNjZXNmdWxseSB0byBjb21wb25lbnQge30iLCBjb21wb25lbnRNZXRhZGF0YURhdGEpOworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHVibGljIGFic3RyYWN0IEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbmNyZWFzZUFuZEdldENvbXBvbmVudEluc3RhbmNlQ291bnRlcihTdHJpbmcgY29tcG9uZW50SWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwcm90ZWN0ZWQgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGluY3JlYXNlQW5kR2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyKFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisKKwkJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJCWlmIChncmFwaFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4U2VydmljZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgY29tcG9uZW50SWQpOworCQkJaWYgKHZlcnRleFNlcnZpY2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZmV0Y2ggdmVydGV4IG9mIGNvbXBvbmVudCBtZXRhZGF0YSwgbm9kZVR5cGU6e30gLCBpZDoge30iLCBub2RlVHlwZSwgY29tcG9uZW50SWQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHZlcnRleFNlcnZpY2UucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVZlcnRleCB2ZXJ0ZXggPSB2ZXJ0ZXhTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpOworCQkJSW50ZWdlciBpbnN0YW5jZUNvdW50ZXIgPSB2ZXJ0ZXgudmFsdWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JTlNUQU5DRV9DT1VOVEVSLmdldFByb3BlcnR5KCkpOworCQkJKytpbnN0YW5jZUNvdW50ZXI7CisJCQl2ZXJ0ZXgucHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JTlNUQU5DRV9DT1VOVEVSLmdldFByb3BlcnR5KCksIGluc3RhbmNlQ291bnRlcik7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChpbnN0YW5jZUNvdW50ZXIpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImluY3JlYXNlQW5kR2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyIG9wZXJhdGlvbiA6IEdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiaW5jcmVhc2VBbmRHZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIgb3BlcmF0aW9uIDogR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCXByb3RlY3RlZCBFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyKFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBpbnQgY291bnRlciwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGhSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ3JhcGhSZXN1bHQucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleFNlcnZpY2UgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0VmVydGV4QnlQcm9wZXJ0eShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGNvbXBvbmVudElkKTsKKwkJCWlmICh2ZXJ0ZXhTZXJ2aWNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGZldGNoIHZlcnRleCBvZiBjb21wb25lbnQgbWV0YWRhdGEgb2ZvciBpZCA9IHt9IiwgY29tcG9uZW50SWQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHZlcnRleFNlcnZpY2UucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVZlcnRleCB2ZXJ0ZXggPSB2ZXJ0ZXhTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpOworCQkJdmVydGV4LnByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5TVEFOQ0VfQ09VTlRFUi5nZXRQcm9wZXJ0eSgpLCBjb3VudGVyKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNvdW50ZXIpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImRlbGV0ZVNlcnZpY2Ugb3BlcmF0aW9uIDogR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJkZWxldGVTZXJ2aWNlIG9wZXJhdGlvbiA6IEdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlwcm90ZWN0ZWQgVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0Q29tcG9uZW50SW5zdGFuY2VzRnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgQ29tcG9uZW50IGNvbXBvbmVudCwgTm9kZVR5cGVFbnVtIGNvbnRhaW5lck5vZGVUeXBlLCBOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2UgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5nZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudCh1bmlxdWVJZCwgY29udGFpbmVyTm9kZVR5cGUsIGNvbXBJbnN0Tm9kZVR5cGUpOworCisJCWlmIChyZXNvdXJjZUluc3RhbmNlc09mU2VydmljZS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9IGVsc2UgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHJlc291cmNlIGluc3RhbmNlcyBhbmQgdGhlaXIgcmVsYXRpb25zLiBzdGF0dXMgaXMge30iLCBzdGF0dXMpOworCQkJfQorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4gaW1tdXRhYmxlUGFpciA9IHJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBpbnN0YW5jZXMgPSBpbW11dGFibGVQYWlyLmdldEtleSgpOworCQlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gcmVsYXRpb25zID0gaW1tdXRhYmxlUGFpci5nZXRWYWx1ZSgpOworCisJCWNvbXBvbmVudC5zZXRDb21wb25lbnRJbnN0YW5jZXMoaW5zdGFuY2VzKTsKKwkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyhyZWxhdGlvbnMpOworCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwkvKioKKwkgKiBzZXQgYWxsIHByb3BlcnRpZXMgb2YgYWxsIG9mIGl0cyByZXNvdXJjZXMKKwkgKiAKKwkgKiBAcGFyYW0gdW5pcXVlSWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIF9fX3NldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXNGcm9tR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBDb21wb25lbnQgY29tcG9uZW50KSB7CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzb3VyY2VJbnN0YW5jZXMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gcmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPj4gYWxyZWFkeVByb2Nlc3NlZFJlc291cmNlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlpZiAocmVzb3VyY2VJbnN0YW5jZXMgIT0gbnVsbCkgeworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlIDogcmVzb3VyY2VJbnN0YW5jZXMpIHsKKworCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gdXBkYXRlIHByb3BlcnRpZXMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQkJCVN0cmluZyByZXNvdXJjZVVpZCA9IHJlc291cmNlSW5zdGFuY2UuZ2V0Q29tcG9uZW50VWlkKCk7CisKKwkJCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IGFscmVhZHlQcm9jZXNzZWRSZXNvdXJjZXMuZ2V0KHJlc291cmNlVWlkKTsKKwkJCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7CisJCQkJCXByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZEFsbFJlcyA9IHByb3BlcnR5T3BlcmF0aW9uLmZpbmRBbGxSZXNvdXJjZVByb3BlcnRpZXNSZWN1cnNpdmVseShyZXNvdXJjZVVpZCwgcHJvcGVydGllcyk7CisJCQkJCWlmIChmaW5kQWxsUmVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCQlyZXR1cm4gZmluZEFsbFJlczsKKwkJCQkJfQorCQkJCQlhbHJlYWR5UHJvY2Vzc2VkUmVzb3VyY2VzLnB1dChyZXNvdXJjZVVpZCwgcHJvcGVydGllcyk7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZ2V0dGluZyBwcm9wZXJ0aWVzIG9mIHJlc291cmNlIHt9LiBOdW1iZXIgb2YgcHJvcGVydGllcyBpcyB7fSIsIHJlc291cmNlVWlkLCAocHJvcGVydGllcyA9PSBudWxsID8gMCA6IHByb3BlcnRpZXMuc2l6ZSgpKSk7CisJCQkJaWYgKGZhbHNlID09IHByb3BlcnRpZXMuaXNFbXB0eSgpKSB7CisKKwkJCQkJU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVaWQgPSByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJCQkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eVZhbHVlc1JlcyA9IHByb3BlcnR5T3BlcmF0aW9uLmdldEFsbFByb3BlcnRpZXNPZlJlc291cmNlSW5zdGFuY2VPbmx5UHJvcGVydHlEZWZJZChyZXNvdXJjZUluc3RhbmNlVWlkKTsKKwkJCQkJbG9nLmRlYnVnKCJBZnRlciBmZXRjaGluZyBwcm9wZXJ0eSB1bmRlciByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIHJlc291cmNlSW5zdGFuY2VVaWQpOworCQkJCQlpZiAocHJvcGVydHlWYWx1ZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBwcm9wZXJ0eVZhbHVlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBwcm9wZXJ0eUlkVG9WYWx1ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQkJcG9wdWxhdGVNYXBwZXJXaXRoUHJvcGVydHlWYWx1ZXMocHJvcGVydHlWYWx1ZXNSZXMsIHByb3BlcnR5SWRUb1ZhbHVlKTsKKworCQkJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQkJZm9yIChQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uIDogcHJvcGVydGllcykgeworCisJCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpOworCQkJCQkJU3RyaW5nIHZhbHVlID0gZGVmYXVsdFZhbHVlOworCQkJCQkJU3RyaW5nIHZhbHVlVWlkID0gbnVsbDsKKworCQkJCQkJU3RyaW5nIHByb3BlcnR5SWQgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKTsKKwkJCQkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgdmFsdWVkUHJvcGVydHkgPSBwcm9wZXJ0eUlkVG9WYWx1ZS5nZXQocHJvcGVydHlJZCk7CisJCQkJCQlpZiAodmFsdWVkUHJvcGVydHkgIT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlZFByb3BlcnR5LmdldFZhbHVlKCk7CisJCQkJCQkJLy8gaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKwkJCQkJCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQkJCQkJCS8vIH0KKworCQkJCQkJCXZhbHVlVWlkID0gdmFsdWVkUHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKTsKKwkJCQkJCQlsb2cudHJhY2UoIkZvdW5kIHZhbHVlIHt9IHVuZGVyIHJlc291cmNlIGluc3RhbmNlIHdoaWNlIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlIHt9IiwgdmFsdWUsIGRlZmF1bHRWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KHByb3BlcnR5RGVmaW5pdGlvbiwgdmFsdWUsIHZhbHVlVWlkKTsKKworCQkJCQkJLy8gVE9ETzogY3VycmVudGx5IGlnbm9yZSBjb25zdHJhaW50cyBzaW5jZSB0aGV5IGFyZSBub3QKKwkJCQkJCS8vIGludXNlIGFuZCBjYXVzZSB0byBlcnJvciBpbiBjb252ZXJ0aW9uIHRvIG9iamVjdC4KKwkJCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRDb25zdHJhaW50cyhudWxsKTsKKworCQkJCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5TGlzdC5hZGQocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KTsKKworCQkJCQl9CisKKwkJCQkJcmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzLnB1dChyZXNvdXJjZUluc3RhbmNlVWlkLCByZXNvdXJjZUluc3RhbmNlUHJvcGVydHlMaXN0KTsKKwkJCQl9CisKKwkJCX0KKworCQkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMocmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzKTsKKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVNYXBwZXJXaXRoUHJvcGVydHlWYWx1ZXMoRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eVZhbHVlc1JlcywgTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydHlJZFRvVmFsdWUpIHsKKworCQlpZiAocHJvcGVydHlWYWx1ZXNSZXMuaXNMZWZ0KCkpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcmVzb3VyY2VJbnN0YW5jZVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJlc291cmNlSW5zdGFuY2VWYWx1ZXMgIT0gbnVsbCkgeworCQkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgOiByZXNvdXJjZUluc3RhbmNlVmFsdWVzKSB7CisJCQkJCXByb3BlcnR5SWRUb1ZhbHVlLnB1dChyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWRkaXRpb25hbEFydGlmYWN0cyhTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiByZWN1cnNpdmVseSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHZhbGlkYXRlQ2F0ZWdvcmllcyhDb21wb25lbnQgY3VycmVudENvbXBvbmVudCwgQ29tcG9uZW50IGNvbXBvbmVudCwgQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudERhdGEsIE5vZGVUeXBlRW51bSB0eXBlKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCA8VCBleHRlbmRzIENvbXBvbmVudD4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB1cGRhdGVEZXJpdmVkKENvbXBvbmVudCBjb21wb25lbnQsIENvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LCBDb21wb25lbnRNZXRhZGF0YURhdGEgdXBkYXRlZFJlc291cmNlRGF0YSwgQ2xhc3M8VD4gY2xhenopOworCisJcHVibGljIGFic3RyYWN0IEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG1hcmtDb21wb25lbnRUb0RlbGV0ZShDb21wb25lbnQgY29tcG9uZW50VG9EZWxldGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbik7CisKKwlwcm90ZWN0ZWQgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaW50ZXJuYWxNYXJrQ29tcG9uZW50VG9EZWxldGUoQ29tcG9uZW50IGNvbXBvbmVudFRvRGVsZXRlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQlpZiAoKGNvbXBvbmVudFRvRGVsZXRlLmdldElzRGVsZXRlZCgpICE9IG51bGwpICYmIGNvbXBvbmVudFRvRGVsZXRlLmdldElzRGVsZXRlZCgpICYmICFjb21wb25lbnRUb0RlbGV0ZS5pc0hpZ2hlc3RWZXJzaW9uKCkpIHsKKwkJCS8vIGNvbXBvbmVudCBhbHJlYWR5IG1hcmtlZCBmb3IgZGVsZXRlCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjb21wb25lbnRUb0RlbGV0ZSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgeworCisJCQlDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50TWV0YURhdGEgPSBnZXRNZXRhRGF0YUZyb21Db21wb25lbnQoY29tcG9uZW50VG9EZWxldGUpOworCisJCQljb21wb25lbnRNZXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0SXNEZWxldGVkKHRydWUpOworCQkJY29tcG9uZW50TWV0YURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldEhpZ2hlc3RWZXJzaW9uKGZhbHNlKTsKKwkJCWNvbXBvbmVudE1ldGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRMYXN0VXBkYXRlRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCQl0cnkgeworCQkJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUoY29tcG9uZW50TWV0YURhdGEsIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZUNvbXBvbmVudDsKKwkJCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIGNvbXBvbmVudCB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50TWV0YURhdGEuZ2V0VW5pcXVlSWQoKSwgdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl1cGRhdGVDb21wb25lbnQgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHVwZGF0ZUNvbXBvbmVudCk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoY29tcG9uZW50VG9EZWxldGUpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGZpbmFsbHkgeworCisJCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5lcnJvcigidXBkYXRlUmVzb3VyY2Ugb3BlcmF0aW9uIDogR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbG9nLmRlYnVnKCJ1cGRhdGVSZXNvdXJjZSBvcGVyYXRpb24gOiBHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29udmVydFJlcURhdGFMaXN0VG9SZXFEZWZMaXN0KENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBMaXN0PEltbXV0YWJsZVBhaXI8UmVxdWlyZW1lbnREYXRhLCBHcmFwaEVkZ2U+PiByZXF1aXJlbWVudERhdGEpIHsKKwkJQ29udmVydERhdGFUb0RlZjxSZXF1aXJlbWVudERlZmluaXRpb24sIFJlcXVpcmVtZW50RGF0YT4gY29udmVydG9yID0gKGRhdGEsIGVkZ2UpIC0+IGNvbnZlcnRSZXFEYXRhVG9SZXFEZWYoZGF0YSwgZWRnZSk7CisJCUFkZE93bmVyRGF0YTxSZXF1aXJlbWVudERlZmluaXRpb24+IGRhdGFBZGRlciA9IChyZXFEZWYsIGNvbXBJbnN0YW5jZSkgLT4gYWRkT3duZXJEYXRhUmVxKHJlcURlZiwgY29tcEluc3RhbmNlKTsKKworCQlyZXR1cm4gY29udmVydERhdGFUb0RlZmluaXRpb24oY29tcG9uZW50SW5zdGFuY2UsIHJlcXVpcmVtZW50RGF0YSwgY29udmVydG9yLCBkYXRhQWRkZXIpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29udmVydENhcERhdGFMaXN0VG9DYXBEZWZMaXN0KENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlLCBMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+IGNhcGFiaWxpdHlEYXRhKSB7CisJCUNvbnZlcnREYXRhVG9EZWY8Q2FwYWJpbGl0eURlZmluaXRpb24sIENhcGFiaWxpdHlEYXRhPiBjb252ZXJ0b3IgPSAoZGF0YSwgZWRnZSkgLT4gY29udmVydENhcERhdGFUb0NhcERlZihkYXRhLCBlZGdlKTsKKwkJQWRkT3duZXJEYXRhPENhcGFiaWxpdHlEZWZpbml0aW9uPiBkYXRhQWRkZXIgPSAoY2FwRGVmLCBjb21wSW5zdGFuY2UpIC0+IGFkZE93bmVyRGF0YUNhcChjYXBEZWYsIGNvbXBJbnN0YW5jZSk7CisJCUVpdGhlcjxMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbnZlcnRhdGlvblJlc3VsdCA9IGNvbnZlcnREYXRhVG9EZWZpbml0aW9uKGNvbXBvbmVudEluc3RhbmNlLCBjYXBhYmlsaXR5RGF0YSwgY29udmVydG9yLCBkYXRhQWRkZXIpOworCQlpZiAoY29udmVydGF0aW9uUmVzdWx0LmlzTGVmdCgpKSB7CisJCQljb252ZXJ0YXRpb25SZXN1bHQgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi51cGRhdGVDYXBEZWZQcm9wZXJ0eVZhbHVlcyhjb21wb25lbnRJbnN0YW5jZSwgY29udmVydGF0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJfQorCQlyZXR1cm4gY29udmVydGF0aW9uUmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29udmVydENhcERhdGFUb0NhcERlZihDYXBhYmlsaXR5RGF0YSBkYXRhLCBHcmFwaEVkZ2UgZWRnZSkgeworCQlFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJEZWYgPSBjYXBhYmlsaXR5T3BlcmF0aW9uLmdldENhcGFiaWxpdHlCeUNhcGFiaWxpdHlEYXRhKGRhdGEpOworCisJCWlmIChlaXRoZXJEZWYuaXNMZWZ0KCkpIHsKKwkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcERlZiA9IGVpdGhlckRlZi5sZWZ0KCkudmFsdWUoKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGVkZ2UuZ2V0UHJvcGVydGllcygpOworCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlTdHJpbmcgc291cmNlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuU09VUkNFLmdldFByb3BlcnR5KCkpOworCQkJCUxpc3Q8U3RyaW5nPiBzb3VyY2VzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJCWNhcGFiaWxpdHlPcGVyYXRpb24uZ2V0Q2FwYWJpbGl0eVNvdXJjZXNMaXN0KHNvdXJjZSwgc291cmNlc0xpc3QpOworCQkJCWNhcERlZi5zZXROYW1lKG5hbWUpOworCQkJCWNhcERlZi5zZXRDYXBhYmlsaXR5U291cmNlcyhzb3VyY2VzTGlzdCk7CisKKwkJCQlTdHJpbmcgcmVxdWlyZWRPY2N1cnJlbmNlcyA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFUVVJUkVEX09DQ1VSUkVOQ0VTLmdldFByb3BlcnR5KCkpOworCQkJCWlmIChyZXF1aXJlZE9jY3VycmVuY2VzICE9IG51bGwpIHsKKwkJCQkJY2FwRGVmLnNldE1pbk9jY3VycmVuY2VzKHJlcXVpcmVkT2NjdXJyZW5jZXMpOworCQkJCX0KKwkJCQlTdHJpbmcgbGVmdE9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlpZiAobGVmdE9jY3VycmVuY2VzICE9IG51bGwpIHsKKwkJCQkJY2FwRGVmLnNldE1heE9jY3VycmVuY2VzKGxlZnRPY2N1cnJlbmNlcyk7CisJCQkJfQorCisJCQl9CisJCQllaXRoZXJEZWYgPSBFaXRoZXIubGVmdChjYXBEZWYpOworCQl9CisJCXJldHVybiBlaXRoZXJEZWY7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29udmVydFJlcURhdGFUb1JlcURlZihSZXF1aXJlbWVudERhdGEgZGF0YSwgR3JhcGhFZGdlIGVkZ2UpIHsKKwkJRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckRlZiA9IHJlcXVpcmVtZW50T3BlcmF0aW9uLmdldFJlcXVpcmVtZW50KGRhdGEuZ2V0VW5pcXVlSWQoKSk7CisKKwkJaWYgKGVpdGhlckRlZi5pc0xlZnQoKSkgeworCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmID0gZWl0aGVyRGVmLmxlZnQoKS52YWx1ZSgpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZWRnZS5nZXRQcm9wZXJ0aWVzKCk7CisJCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCXJlcXVpcmVtZW50RGVmLnNldE5hbWUobmFtZSk7CisJCQkJU3RyaW5nIHJlcXVpcmVkT2NjdXJyZW5jZXMgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVFVSVJFRF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlpZiAocmVxdWlyZWRPY2N1cnJlbmNlcyAhPSBudWxsKSB7CisJCQkJCXJlcXVpcmVtZW50RGVmLnNldE1pbk9jY3VycmVuY2VzKHJlcXVpcmVkT2NjdXJyZW5jZXMpOworCQkJCX0KKwkJCQlTdHJpbmcgbGVmdE9jY3VycmVuY2VzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTEVGVF9PQ0NVUlJFTkNFUy5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlpZiAobGVmdE9jY3VycmVuY2VzICE9IG51bGwpIHsKKwkJCQkJcmVxdWlyZW1lbnREZWYuc2V0TWF4T2NjdXJyZW5jZXMobGVmdE9jY3VycmVuY2VzKTsKKwkJCQl9CisJCQl9CisJCQllaXRoZXJEZWYgPSBFaXRoZXIubGVmdChyZXF1aXJlbWVudERlZik7CisJCX0KKwkJcmV0dXJuIGVpdGhlckRlZjsKKwl9CisKKwlwcml2YXRlIDxEZWYsIERhdGE+IEVpdGhlcjxMaXN0PERlZj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb252ZXJ0RGF0YVRvRGVmaW5pdGlvbihDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSwgTGlzdDxJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4+IHJlcXVpcmVtZW50RGF0YSwgQ29udmVydERhdGFUb0RlZjxEZWYsIERhdGE+IGNvbnZlcnRvciwgQWRkT3duZXJEYXRhPERlZj4gZGF0YUFkZGVyKSB7CisJCUVpdGhlcjxMaXN0PERlZj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXN1bHQ7CisJCS8vIENvbnZlcnQgRGF0YSBUbyBEZWZpbml0aW9uCisJCVN0cmVhbTxFaXRoZXI8RGVmLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+IHJlcURlZlN0cmVhbSA9IHJlcXVpcmVtZW50RGF0YS5zdHJlYW0oKS5tYXAoZSAtPiBjb252ZXJ0b3IuY29udmVydChlLmxlZnQsIGUucmlnaHQpKTsKKworCQkvLyBDb2xsZWN0IEJ1dCBTdG9wIEFmdGVyIEZpcnN0IEVycm9yCisJCUxpc3Q8RWl0aGVyPERlZiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+PiBmaWx0ZXJlZFJlcURlZkxpc3QgPSBTdHJlYW1VdGlscy50YWtlV2hpbGVQbHVzT25lKHJlcURlZlN0cmVhbSwgcCAtPiBwLmlzTGVmdCgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlPcHRpb25hbDxFaXRoZXI8RGVmLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+IG9wdGlvbmFsRXJyb3IgPSBmaWx0ZXJlZFJlcURlZkxpc3Quc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5pc1JpZ2h0KCkpLmZpbmRBbnkoKTsKKwkJaWYgKG9wdGlvbmFsRXJyb3IuaXNQcmVzZW50KCkpIHsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChvcHRpb25hbEVycm9yLmdldCgpLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0gZWxzZSB7CisJCQkvLyBDb252ZXJ0IEZyb20gRWl0aGVyIFRvIERlZmluaXRpb24gQW5kIENvbGxlY3QKKwkJCUxpc3Q8RGVmPiByZXFEZWZMaXN0ID0gZmlsdGVyZWRSZXFEZWZMaXN0LnN0cmVhbSgpLm1hcChlIC0+IGUubGVmdCgpLnZhbHVlKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkvLyBBZGQgT3duZXIgRGF0YQorCQkJcmVxRGVmTGlzdC5mb3JFYWNoKGUgLT4gZGF0YUFkZGVyLmFkZERhdGEoZSwgY29tcG9uZW50SW5zdGFuY2UpKTsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KHJlcURlZkxpc3QpOworCQl9CisKKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlpbnRlcmZhY2UgQ29udmVydERhdGFUb0RlZjxEZWYsIERhdGE+IHsKKwkJRWl0aGVyPERlZiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbnZlcnQoRGF0YSBkLCBHcmFwaEVkZ2UgZWRnZSk7CisJfQorCisJaW50ZXJmYWNlIEFkZE93bmVyRGF0YTxEZWY+IHsKKwkJdm9pZCBhZGREYXRhKERlZiBkZWYsIENvbXBvbmVudEluc3RhbmNlIGNvbXBJbnN0YW5jZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZE93bmVyRGF0YUNhcChDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBEZWYsIENvbXBvbmVudEluc3RhbmNlIGNvbXBvbmVudEluc3RhbmNlKSB7CisJCWNhcERlZi5zZXRPd25lcklkKGNvbXBvbmVudEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQljYXBEZWYuc2V0T3duZXJOYW1lKGNvbXBvbmVudEluc3RhbmNlLmdldE5hbWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZE93bmVyRGF0YVJlcShSZXF1aXJlbWVudERlZmluaXRpb24gcmVxRGVmLCBDb21wb25lbnRJbnN0YW5jZSBjb21wb25lbnRJbnN0YW5jZSkgeworCQlyZXFEZWYuc2V0T3duZXJJZChjb21wb25lbnRJbnN0YW5jZS5nZXRVbmlxdWVJZCgpKTsKKwkJcmVxRGVmLnNldE93bmVyTmFtZShjb21wb25lbnRJbnN0YW5jZS5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlcXVpcmVtZW50cyhDb21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gZW1wdHlNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQoZW1wdHlNYXApOworCQl0cnkgeworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlcyAhPSBudWxsKSB7CisJCQkJRnVuY3Rpb248Q29tcG9uZW50SW5zdGFuY2UsIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UmVxdWlyZW1lbnREYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+PiBkYXRhQ29sbGVjdG9yID0gZSAtPiBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5nZXRSZXF1aXJlbWVudHMoZSwgbm9kZVR5cGVFbnVtKTsKKwkJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFJlcXVpcmVtZW50RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyRGF0YUNvbGxlY3RlZCA9IGNvbGxlY3REYXRhRnJvbUNvbXBvbmVudHNJbnN0YW5jZXMoY29tcG9uZW50SW5zdGFuY2VzLAorCQkJCQkJZGF0YUNvbGxlY3Rvcik7CisJCQkJaWYgKGVpdGhlckRhdGFDb2xsZWN0ZWQuaXNSaWdodCgpKSB7CisJCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlaXRoZXJEYXRhQ29sbGVjdGVkLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gQ29udmVydHMgRGF0YSB0byBEZWYgc3RvcCBpZiBlbmNvdW50ZXJlZCBjb252ZXJzaW9uIGVycm9yCisJCQkJCURhdGFEZWZDb252ZXJ0b3I8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBSZXF1aXJlbWVudERhdGE+IHNvbWVDb252ZXJ0b3IgPSAoZTEsIGUyKSAtPiBjb252ZXJ0UmVxRGF0YUxpc3RUb1JlcURlZkxpc3QoZTEsIGUyKTsKKwkJCQkJRWl0aGVyPExpc3Q8TGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZ1bGxEZWZMaXN0ID0gY29udmVydERhdGFUb0RlZkNvbXBvbmVudExldmVsKGVpdGhlckRhdGFDb2xsZWN0ZWQubGVmdCgpLnZhbHVlKCksIHNvbWVDb252ZXJ0b3IpOworCQkJCQlpZiAoZnVsbERlZkxpc3QuaXNSaWdodCgpKSB7CisJCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQoZnVsbERlZkxpc3QucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVN0cmVhbTxSZXF1aXJlbWVudERlZmluaXRpb24+IGRlZlN0cmVhbSA9IGZ1bGxEZWZMaXN0LmxlZnQoKS52YWx1ZSgpLnN0cmVhbSgpLmZsYXRNYXAoZSAtPiBlLnN0cmVhbSgpKTsKKwkJCQkJCS8vIENvbGxlY3QgdG8gTWFwIGFuZCB1c2luZyBncm91cGluZyBieQorCQkJCQkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBjYXBUeXBlQ2FwTGlzdE1hcCA9IGRlZlN0cmVhbS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShlIC0+IGUuZ2V0Q2FwYWJpbGl0eSgpKSk7CisJCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIubGVmdChjYXBUeXBlQ2FwTGlzdE1hcCk7CisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKGluVHJhbnNhY3Rpb24gPT0gZmFsc2UpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0aWVzKENvbXBvbmVudCBjb21wb25lbnQsIE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlmaW5hbCBIYXNoTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGVtcHR5TWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQoZW1wdHlNYXApOworCQl0cnkgeworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQkJaWYgKGNvbXBvbmVudEluc3RhbmNlcyAhPSBudWxsKSB7CisJCQkJRnVuY3Rpb248Q29tcG9uZW50SW5zdGFuY2UsIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+IGRhdGFDb2xsZWN0b3IgPSBlIC0+IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmdldENhcGFiaWxpdGllcyhlLCBub2RlVHlwZUVudW0pOworCQkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2UsIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckRhdGFDb2xsZWN0ZWQgPSBjb2xsZWN0RGF0YUZyb21Db21wb25lbnRzSW5zdGFuY2VzKGNvbXBvbmVudEluc3RhbmNlcywKKwkJCQkJCWRhdGFDb2xsZWN0b3IpOworCQkJCWlmIChlaXRoZXJEYXRhQ29sbGVjdGVkLmlzUmlnaHQoKSkgeworCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQoZWl0aGVyRGF0YUNvbGxlY3RlZC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIENvbnZlcnRzIENhcERhdGEgdG8gQ2FwRGVmIHJlbW92ZXMgc3RvcCBpZiBlbmNvdW50ZXJlZAorCQkJCQkvLyBjb252ZXJzaW9uIGVycm9yCisJCQkJCURhdGFEZWZDb252ZXJ0b3I8Q2FwYWJpbGl0eURlZmluaXRpb24sIENhcGFiaWxpdHlEYXRhPiBzb21lQ29udmVydG9yID0gKGUxLCBlMikgLT4gY29udmVydENhcERhdGFMaXN0VG9DYXBEZWZMaXN0KGUxLCBlMik7CisJCQkJCUVpdGhlcjxMaXN0PExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZ1bGxEZWZMaXN0ID0gY29udmVydERhdGFUb0RlZkNvbXBvbmVudExldmVsKGVpdGhlckRhdGFDb2xsZWN0ZWQubGVmdCgpLnZhbHVlKCksIHNvbWVDb252ZXJ0b3IpOworCQkJCQlpZiAoZnVsbERlZkxpc3QuaXNSaWdodCgpKSB7CisJCQkJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQoZnVsbERlZkxpc3QucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVN0cmVhbTxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gZGVmU3RyZWFtID0gZnVsbERlZkxpc3QubGVmdCgpLnZhbHVlKCkuc3RyZWFtKCkuZmxhdE1hcChlIC0+IGUuc3RyZWFtKCkpOworCQkJCQkJLy8gQ29sbGVjdCB0byBNYXAgZ3JvdXBpbmcgYnkgVHlwZQorCQkJCQkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcFR5cGVDYXBMaXN0TWFwID0gZGVmU3RyZWFtLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KGUgLT4gZS5nZXRUeXBlKCkpKTsKKwkJCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KGNhcFR5cGVDYXBMaXN0TWFwKTsKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoaW5UcmFuc2FjdGlvbiA9PSBmYWxzZSkgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisJfQorCisJcHVibGljIDxEYXRhPiBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbGxlY3REYXRhRnJvbUNvbXBvbmVudHNJbnN0YW5jZXMoTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzLAorCQkJRnVuY3Rpb248Q29tcG9uZW50SW5zdGFuY2UsIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4gZGF0YUdldHRlcikgeworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlc3VsdDsKKworCQkvLyBHZXQgTGlzdCBvZiBFYWNoIGNvbXBvbmVudEluc3RhbmNlIGFuZCBpdCdzIENhcGFiaWxpdGllcyBEYXRhCisJCVN0cmVhbTxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+PiBvd25lckRhdGFTdHJlYW0gPSBjb21wb25lbnRJbnN0YW5jZXMuc3RyZWFtKCkubWFwKGVsZW1lbnQgLT4gbmV3IEltbXV0YWJsZVBhaXI8PihlbGVtZW50LCBkYXRhR2V0dGVyLmFwcGx5KGVsZW1lbnQpKSk7CisJCS8vIENvbGxlY3QgYnV0IHN0b3AgYWZ0ZXIgZmlyc3QgZXJyb3IKKwkJTGlzdDxJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+PiBvd25lckNhcERhdGFMaXN0ID0gU3RyZWFtVXRpbHMKKwkJCQkudGFrZVdoaWxlUGx1c09uZShvd25lckRhdGFTdHJlYW0sIHAgLT4gcC5yaWdodC5pc0xlZnQoKSB8fCBwLnJpZ2h0LmlzUmlnaHQoKSAmJiBwLnJpZ2h0LnJpZ2h0KCkudmFsdWUoKSA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJT3B0aW9uYWw8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZSwgRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+Pj4gb3B0aW9uYWxFcnJvciA9IG93bmVyQ2FwRGF0YUxpc3Quc3RyZWFtKCkKKwkJCQkuZmlsdGVyKHAgLT4gcC5yaWdodC5pc1JpZ2h0KCkgJiYgcC5yaWdodC5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKS5maW5kQW55KCk7CisJCWlmIChvcHRpb25hbEVycm9yLmlzUHJlc2VudCgpKSB7CisJCQllaXRoZXJSZXN1bHQgPSBFaXRoZXIucmlnaHQob3B0aW9uYWxFcnJvci5nZXQoKS5yaWdodC5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQob3duZXJDYXBEYXRhTGlzdC5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLnJpZ2h0LmlzTGVmdCgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKwkJfQorCisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisJfQorCisJaW50ZXJmYWNlIERhdGFEZWZDb252ZXJ0b3I8RGVmLCBEYXRhPiB7CisJCUVpdGhlcjxMaXN0PERlZj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb252ZXJ0RGF0YVRvRGVmQ29tcG9uZW50SW5zdGFuY2UoQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UsIExpc3Q8SW1tdXRhYmxlUGFpcjxEYXRhLCBHcmFwaEVkZ2U+PiBkYXRhKTsKKwl9CisKKwlwdWJsaWMgPERlZiwgRGF0YT4gRWl0aGVyPExpc3Q8TGlzdDxEZWY+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbnZlcnREYXRhVG9EZWZDb21wb25lbnRMZXZlbChMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2UsIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4+IG93bmVyQ2FwRGF0YUxpc3QsCisJCQlEYXRhRGVmQ29udmVydG9yPERlZiwgRGF0YT4gY29udmVydG9yKSB7CisJCS8vIENvbnZlcnRzIENhcERhdGEgdG8gQ2FwRGVmIHJlbW92ZXMgc3RvcCBpZiBlbmNvdW50ZXJlZCBjb252ZXJzaW9uCisJCS8vIGVycm9yCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gbnVsbDsKKwkJTGlzdDxMaXN0PERlZj4+IGRlZkxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvd25lckNhcERhdGFMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+IGltbXV0YWJsZVBhaXIgPSBvd25lckNhcERhdGFMaXN0LmdldChpKTsKKwkJCUVpdGhlcjxMaXN0PERlZj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb252ZXJ0Q2FwRGF0YUxpc3RUb0NhcERlZkxpc3QgPSBjb252ZXJ0b3IuY29udmVydERhdGFUb0RlZkNvbXBvbmVudEluc3RhbmNlKGltbXV0YWJsZVBhaXIubGVmdCwgaW1tdXRhYmxlUGFpci5yaWdodC5sZWZ0KCkudmFsdWUoKSk7CisJCQlpZiAoY29udmVydENhcERhdGFMaXN0VG9DYXBEZWZMaXN0LmlzUmlnaHQoKSkgeworCQkJCWVycm9yID0gY29udmVydENhcERhdGFMaXN0VG9DYXBEZWZMaXN0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJZGVmTGlzdC5hZGQoY29udmVydENhcERhdGFMaXN0VG9DYXBEZWZMaXN0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQl9CisJCUVpdGhlcjxMaXN0PExpc3Q8RGVmPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXN1bHQgPSAoZXJyb3IgIT0gbnVsbCkgPyBFaXRoZXIucmlnaHQoZXJyb3IpIDogRWl0aGVyLmxlZnQoZGVmTGlzdCk7CisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIENvbXBvbmVudE1ldGFkYXRhRGF0YT4gZmluZExhdGVzdFZlcnNpb24oTGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+IHJlc291cmNlRGF0YUxpc3QpIHsKKwkJTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBDb21wb25lbnRNZXRhZGF0YURhdGE+IGxhdGVzdFZlcnNpb25NYXAgPSBuZXcgSGFzaE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgQ29tcG9uZW50TWV0YWRhdGFEYXRhPigpOworCQlmb3IgKENvbXBvbmVudE1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgOiByZXNvdXJjZURhdGFMaXN0KSB7CisJCQlDb21wb25lbnRNZXRhZGF0YURhdGEgbGF0ZXN0VmVyc2lvbkRhdGEgPSByZXNvdXJjZURhdGE7CisKKwkJCUNvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCk7CisJCQlQYWlyPFN0cmluZywgU3RyaW5nPiBwYWlyID0gY3JlYXRlS2V5UGFpcihsYXRlc3RWZXJzaW9uRGF0YSk7CisJCQlpZiAobGF0ZXN0VmVyc2lvbk1hcC5jb250YWluc0tleShwYWlyKSkgeworCQkJCWxhdGVzdFZlcnNpb25EYXRhID0gbGF0ZXN0VmVyc2lvbk1hcC5nZXQocGFpcik7CisJCQkJU3RyaW5nIGN1cnJlbnRWZXJzaW9uID0gbGF0ZXN0VmVyc2lvbkRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKTsKKwkJCQlTdHJpbmcgbmV3VmVyc2lvbiA9IG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0VmVyc2lvbigpOworCQkJCWlmIChDb21tb25CZVV0aWxzLmNvbXBhcmVBc2RjQ29tcG9uZW50VmVyc2lvbnMobmV3VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7CisJCQkJCWxhdGVzdFZlcnNpb25EYXRhID0gcmVzb3VyY2VEYXRhOworCQkJCX0KKwkJCX0KKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCQlsb2cuZGVidWcoImxhc3QgY2VydGlmaWVkIHZlcnNpb24gb2YgcmVzb3VyY2UgPSB7fSAgdmVyc2lvbiBpcyB7fSIsIGxhdGVzdFZlcnNpb25EYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksIGxhdGVzdFZlcnNpb25EYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCkpOworCisJCQlsYXRlc3RWZXJzaW9uTWFwLnB1dChwYWlyLCBsYXRlc3RWZXJzaW9uRGF0YSk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBDb21wb25lbnRNZXRhZGF0YURhdGE+IHJlc1ZlcnNpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbXBvbmVudE1ldGFkYXRhRGF0YT4oKTsKKwkJZm9yIChDb21wb25lbnRNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhIDogbGF0ZXN0VmVyc2lvbk1hcC52YWx1ZXMoKSkgeworCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGxhdGVzdFZlcnNpb25EYXRhID0gcmVzb3VyY2VEYXRhOworCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBtZXRhZGF0YURhdGFEZWZpbml0aW9uID0gcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKTsKKwkJCWlmIChyZXNWZXJzaW9uTWFwLmNvbnRhaW5zS2V5KG1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0VVVJRCgpKSkgeworCQkJCWxhdGVzdFZlcnNpb25EYXRhID0gcmVzVmVyc2lvbk1hcC5nZXQobWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXRVVUlEKCkpOworCQkJCVN0cmluZyBjdXJyZW50VmVyc2lvbiA9IGxhdGVzdFZlcnNpb25EYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCk7CisJCQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldFZlcnNpb24oKTsKKwkJCQlpZiAoQ29tbW9uQmVVdGlscy5jb21wYXJlQXNkY0NvbXBvbmVudFZlcnNpb25zKG5ld1ZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSkgeworCQkJCQlsYXRlc3RWZXJzaW9uRGF0YSA9IHJlc291cmNlRGF0YTsKKwkJCQl9CisJCQl9CisJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQkJbG9nLmRlYnVnKCJsYXN0IHV1aWQgdmVyc2lvbiBvZiByZXNvdXJjZSA9IHt9ICB2ZXJzaW9uIGlzIHt9IiwgbGF0ZXN0VmVyc2lvbkRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwgbGF0ZXN0VmVyc2lvbkRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSk7CisJCQlyZXNWZXJzaW9uTWFwLnB1dChsYXRlc3RWZXJzaW9uRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VVVJRCgpLCBsYXRlc3RWZXJzaW9uRGF0YSk7CisJCX0KKworCQlyZXR1cm4gcmVzVmVyc2lvbk1hcDsKKwl9CisKKwlwcml2YXRlIFBhaXI8U3RyaW5nLCBTdHJpbmc+IGNyZWF0ZUtleVBhaXIoQ29tcG9uZW50TWV0YWRhdGFEYXRhIG1ldGFkYXRhRGF0YSkgeworCQlQYWlyPFN0cmluZywgU3RyaW5nPiBwYWlyID0gbnVsbDsKKwkJTm9kZVR5cGVFbnVtIGxhYmVsID0gTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShtZXRhZGF0YURhdGEuZ2V0TGFiZWwoKSk7CisJCXN3aXRjaCAobGFiZWwpIHsKKwkJY2FzZSBSZXNvdXJjZToKKwkJCXBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4obWV0YWRhdGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBtZXRhZGF0YURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5nZXRSZXNvdXJjZVR5cGUoKS5nZXRWYWx1ZSgpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGFpciA9IG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPihtZXRhZGF0YURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSwgbWV0YWRhdGFEYXRhLmdldExhYmVsKCkpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gcGFpcjsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbGxlY3Rpb248Q29tcG9uZW50TWV0YWRhdGFEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0VmVyc2lvbk5vdEFic3RyYWN0Q29tcG9uZW50c01ldGFkYXRhT25seShib29sZWFuIGlzQWJzdHJhY3QsIEJvb2xlYW4gaXNIaWdoZXN0LCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIGludGVybmFsQ29tcG9uZW50VHlwZSkgeworCQl0cnkgeworCisJCQkvLyBNYXA8U3RyaW5nLCBPYmplY3Q+IGhhc1Bwcm9wZXJ0aWVzVG9NYXRjaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCS8vIE1hcDxTdHJpbmcsIE9iamVjdD4gaGFzTm90UHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8PigpOworCQkJTGlzdDxJbW11dGFibGVUcmlwbGU8UXVlcnlUeXBlLCBTdHJpbmcsIE9iamVjdD4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWlmIChjb21wb25lbnRUeXBlRW51bS5lcXVhbHMoQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpKSB7CisJCQkJLy8gaGFzUHByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0FCU1RSQUNULmdldFByb3BlcnR5KCksCisJCQkJLy8gaXNBYnN0cmFjdCk7CisJCQkJcHJvcGVydGllcy5hZGQobmV3IEltbXV0YWJsZVRyaXBsZTw+KFF1ZXJ5VHlwZS5IQVMsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfQUJTVFJBQ1QuZ2V0UHJvcGVydHkoKSwgaXNBYnN0cmFjdCkpOworCisJCQkJaWYgKGludGVybmFsQ29tcG9uZW50VHlwZSAhPSBudWxsKSB7CisJCQkJCXN3aXRjaCAoaW50ZXJuYWxDb21wb25lbnRUeXBlLnRvTG93ZXJDYXNlKCkpIHsKKwkJCQkJY2FzZSAidmYiOgorCQkJCQkJcHJvcGVydGllcy5hZGQobmV3IEltbXV0YWJsZVRyaXBsZTw+KFF1ZXJ5VHlwZS5IQVNfTk9ULCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSwgUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpKTsKKwkJCQkJCXByb3BlcnRpZXMuYWRkKG5ldyBJbW11dGFibGVUcmlwbGU8PihRdWVyeVR5cGUuSEFTX05PVCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVNPVVJDRV9UWVBFLmdldFByb3BlcnR5KCksIFJlc291cmNlVHlwZUVudW0uVkwubmFtZSgpKSk7CisJCQkJCQkvLyBoYXNOb3RQcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLAorCQkJCQkJLy8gUmVzb3VyY2VUeXBlRW51bS5WRi5uYW1lKCkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgInNlcnZpY2UiOgorCQkJCQkJcHJvcGVydGllcy5hZGQobmV3IEltbXV0YWJsZVRyaXBsZTw+KFF1ZXJ5VHlwZS5IQVNfTk9ULCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSwgUmVzb3VyY2VUeXBlRW51bS5WRkMubmFtZSgpKSk7CisJCQkJCQlwcm9wZXJ0aWVzLmFkZChuZXcgSW1tdXRhYmxlVHJpcGxlPD4oUXVlcnlUeXBlLkhBU19OT1QsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLm5hbWUoKSkpOworCQkJCQkJLy8gaGFzTm90UHByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSwKKwkJCQkJCS8vIFJlc291cmNlVHlwZUVudW0uVkZDLm5hbWUoKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAidmwiOgorCQkJCQkJcHJvcGVydGllcy5hZGQobmV3IEltbXV0YWJsZVRyaXBsZTw+KFF1ZXJ5VHlwZS5IQVMsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCBSZXNvdXJjZVR5cGVFbnVtLlZMLm5hbWUoKSkpOworCQkJCQkJLy8gaGFzUHByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJFU09VUkNFX1RZUEUuZ2V0UHJvcGVydHkoKSwKKwkJCQkJCS8vIFJlc291cmNlVHlwZUVudW0uVkwubmFtZSgpKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvLyBoYXNOb3RQcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwKKwkJCS8vIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULm5hbWUoKSk7CisJCQlwcm9wZXJ0aWVzLmFkZChuZXcgSW1tdXRhYmxlVHJpcGxlPD4oUXVlcnlUeXBlLkhBU19OT1QsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQubmFtZSgpKSk7CisJCQkvLyBoYXNOb3RQcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfREVMRVRFRC5nZXRQcm9wZXJ0eSgpLAorCQkJLy8gdHJ1ZSk7CisJCQlwcm9wZXJ0aWVzLmFkZChuZXcgSW1tdXRhYmxlVHJpcGxlPD4oUXVlcnlUeXBlLkhBU19OT1QsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfREVMRVRFRC5nZXRQcm9wZXJ0eSgpLCB0cnVlKSk7CisJCQkvLyBFaXRoZXI8TGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4KKwkJCS8vIHJlc291cmNlTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYSgKKwkJCS8vIGNvbXBvbmVudFR5cGVFbnVtLmdldE5vZGVUeXBlKCksIGhhc1Bwcm9wZXJ0aWVzVG9NYXRjaCwKKwkJCS8vIGhhc05vdFBwcm9wZXJ0aWVzVG9NYXRjaCwKKwkJCS8vIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VOb2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKGNvbXBvbmVudFR5cGVFbnVtLmdldE5vZGVUeXBlKCksIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcywgcHJvcGVydGllcyk7CisJCQlpZiAocmVzb3VyY2VOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCQkvLyBpbiBjYXNlIG9mIE5PVF9GT1VORCBmcm9tIFRpdGFuIGNsaWVudCByZXR1cm4gdG8gVUkgZW1wdHkKKwkJCQkvLyBsaXN0CisJCQkJaWYgKHJlc291cmNlTm9kZXMucmlnaHQoKS52YWx1ZSgpLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgQXJyYXlMaXN0PD4oKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlc291cmNlTm9kZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlMaXN0PENvbXBvbmVudE1ldGFkYXRhRGF0YT4gcmVzb3VyY2VEYXRhTGlzdCA9IHJlc291cmNlTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJQ29sbGVjdGlvbjxDb21wb25lbnRNZXRhZGF0YURhdGE+IHJlc0NvbGxlY3Rpb24gPSByZXNvdXJjZURhdGFMaXN0OworCQkJCWlmIChpc0hpZ2hlc3QgIT0gbnVsbCAmJiBpc0hpZ2hlc3QpIHsKKwkJCQkJTWFwPFN0cmluZywgQ29tcG9uZW50TWV0YWRhdGFEYXRhPiBsYXRlc3RWZXJzaW9uTGlzdE1hcCA9IGZpbmRMYXRlc3RWZXJzaW9uKHJlc291cmNlRGF0YUxpc3QpOworCQkJCQlyZXNDb2xsZWN0aW9uID0gbGF0ZXN0VmVyc2lvbkxpc3RNYXAudmFsdWVzKCk7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIubGVmdChyZXNDb2xsZWN0aW9uKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdFZlcnNpb25Ob3RBYnN0cmFjdENvbXBvbmVudHMoYm9vbGVhbiBpc0Fic3RyYWN0LCBCb29sZWFuIGlzSGlnaGVzdCwgQ29tcG9uZW50VHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyBpbnRlcm5hbENvbXBvbmVudFR5cGUsIExpc3Q8U3RyaW5nPiBjb21wb25lbnRVaWRzKSB7CisJCXRyeSB7CisJCQlMaXN0PENvbXBvbmVudD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlNYXA8U3RyaW5nLCBSZXNvdXJjZVR5cGVFbnVtPiBjb21wb25lbnRVaWRzTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQkJaWYgKGNvbXBvbmVudFVpZHMgPT0gbnVsbCkgeworCQkJCUVpdGhlcjxDb2xsZWN0aW9uPENvbXBvbmVudE1ldGFkYXRhRGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlTm9kZXMgPSBnZXRMYXRlc3RWZXJzaW9uTm90QWJzdHJhY3RDb21wb25lbnRzTWV0YWRhdGFPbmx5KGlzQWJzdHJhY3QsIGlzSGlnaGVzdCwgY29tcG9uZW50VHlwZUVudW0sIGludGVybmFsQ29tcG9uZW50VHlwZSk7CisJCQkJaWYgKHJlc291cmNlTm9kZXMuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzb3VyY2VOb2Rlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlDb2xsZWN0aW9uPENvbXBvbmVudE1ldGFkYXRhRGF0YT4gY29sbGVjdGlvbiA9IHJlc291cmNlTm9kZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7CisJCQkJCWNvbXBvbmVudFVpZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQl9IGVsc2UgeworCQkJCQljb21wb25lbnRVaWRzID0gY29sbGVjdGlvbi5zdHJlYW0oKS5tYXAocCAtPiBwLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJCQkvLyBjb2xsZWN0aW9uLmZvckVhY2gocCAtPiB7CisJCQkJCS8vIGlmIChOb2RlVHlwZUVudW0uUmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhwLmdldExhYmVsKCkpKQorCQkJCQkvLyB7CisJCQkJCS8vIGNvbXBvbmVudFVpZHNNYXAucHV0KHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCQkJCS8vICgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKQorCQkJCQkvLyBwLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuZ2V0UmVzb3VyY2VUeXBlKCkpOworCQkJCQkvLyB9CisJCQkJCS8vIH0pOworCisJCQkJfQorCisJCQl9CisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50VWlkcy5pc0VtcHR5KCkpIHsKKworCQkJCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7CisJCQkJaW50IG51bWJlck9mV29ya2VycyA9IDU7CisKKwkJCQltYW5hZ2VyLmluaXQobnVtYmVyT2ZXb3JrZXJzKTsKKwkJCQlmb3IgKFN0cmluZyBjb21wb25lbnRVaWQgOiBjb21wb25lbnRVaWRzKSB7CisJCQkJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3ID0gYnVpbGRDb21wb25lbnRWaWV3Rm9yTm90QWJzdHJhY3QoKTsKKwkJCQkJLy8gUmVzb3VyY2VUeXBlRW51bSB0eXBlID0KKwkJCQkJLy8gY29tcG9uZW50VWlkc01hcC5nZXQoY29tcG9uZW50VWlkKTsKKwkJCQkJLy8gaWYgKHR5cGUgIT0gbnVsbCAmJiBSZXNvdXJjZVR5cGVFbnVtLlZMLmVxdWFscyh0eXBlKSkgeworCQkJCQlpZiAoaW50ZXJuYWxDb21wb25lbnRUeXBlICE9IG51bGwgJiYgInZsIi5lcXVhbHNJZ25vcmVDYXNlKGludGVybmFsQ29tcG9uZW50VHlwZSkpIHsKKwkJCQkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUNhcGFiaWxpdGllcyhmYWxzZSk7CisJCQkJCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVSZXF1aXJlbWVudHMoZmFsc2UpOworCQkJCQl9CisJCQkJCW1hbmFnZXIuYWRkSm9iKG5ldyBKb2IoKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkb1dvcmsoKSB7CisJCQkJCQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCQkJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudCA9IGdldENvbXBvbmVudChjb21wb25lbnRVaWQsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBmYWxzZSk7CisJCQkJCQkJLy8gbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkJCQkJLy8gbG9nLmluZm8oIioqKioqKioqKiogVGltZSBjYWxjdWxhdGlvbiBpbiBtczoKKwkJCQkJCQkvLyBnZXRDb21wb25lbnQgc2luZ2xlIHt9IiwgKHN0b3Atc3RhcnQpKTsKKwkJCQkJCQlyZXR1cm4gY29tcG9uZW50OworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQkJTGlua2VkQmxvY2tpbmdRdWV1ZTxFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPj4gcmVzID0gbWFuYWdlci5zdGFydCgpOworCisJCQkJZm9yIChFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZSA6IHJlcykgeworCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworCQkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHJlc291cmNlIHJldHVybmVkIG51bGwgIik7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJCX0KKwkJCQkJaWYgKHJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHJlc291cmNlIGZvciBlcnJvciBpcyB7fSIsIHJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCX0KKwkJCQkJQ29tcG9uZW50IGNvbXBvbmVudCA9IHJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQkJCQljb21wb25lbnQuc2V0Q29udGFjdElkKG51bGwpOworCQkJCQljb21wb25lbnQuc2V0Q3JlYXRpb25EYXRlKG51bGwpOworCQkJCQljb21wb25lbnQuc2V0Q3JlYXRvclVzZXJJZChudWxsKTsKKwkJCQkJY29tcG9uZW50LnNldENyZWF0b3JGdWxsTmFtZShudWxsKTsKKwkJCQkJY29tcG9uZW50LnNldExhc3RVcGRhdGVEYXRlKG51bGwpOworCQkJCQljb21wb25lbnQuc2V0TGFzdFVwZGF0ZXJVc2VySWQobnVsbCk7CisJCQkJCWNvbXBvbmVudC5zZXRMYXN0VXBkYXRlckZ1bGxOYW1lKG51bGwpOworCQkJCQljb21wb25lbnQuc2V0Tm9ybWFsaXplZE5hbWUobnVsbCk7CisJCQkJCXJlc3VsdC5hZGQocmVzb3VyY2UubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKworCQkJCWlmIChjb21wb25lbnRVaWRzLnNpemUoKSAhPSByZXN1bHQuc2l6ZSgpKSB7CisJCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCQkJCWxvZy5kZWJ1Zygib25lIG9mIHRoZSB3b3JrZXJzIGZhaWxlZCB0byBjb21wbGV0ZSBqb2IgIik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCisJCX0gZmluYWxseSB7CisJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCX0KKwl9CisKKwlwcml2YXRlIENvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGJ1aWxkQ29tcG9uZW50Vmlld0Zvck5vdEFic3RyYWN0KCkgeworCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5kaXNhYmxlQWxsKCk7CisJCS8vIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZVJlcXVpcmVtZW50cyhmYWxzZSk7CisJCS8vIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUNhcGFiaWxpdGllcyhmYWxzZSk7CisJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUNhdGVnb3JpZXMoZmFsc2UpOworCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5zZXRJZ25vcmVBbGxWZXJzaW9ucyhmYWxzZSk7CisJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUFsbFZlcnNpb25zKGZhbHNlKTsKKwkJcmV0dXJuIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3OworCX0KKworCXByb3RlY3RlZCBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRDYXBhYmlsaXRpZXNGcm9tR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBDb21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5TdGF0dXM7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJDYXBhYmlsaXRpZXMgPSBnZXRDYXBhYmlsaXRpZXMoY29tcG9uZW50LCBub2RlVHlwZSwgdHJ1ZSk7CisJCWlmIChlaXRoZXJDYXBhYmlsaXRpZXMuaXNMZWZ0KCkpIHsKKwkJCXRpdGFuU3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQlNYXA8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gY2FwYWJpbGl0aWVzID0gZWl0aGVyQ2FwYWJpbGl0aWVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKGNhcGFiaWxpdGllcyAhPSBudWxsICYmICFjYXBhYmlsaXRpZXMuaXNFbXB0eSgpKSB7CisJCQkJY29tcG9uZW50LnNldENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGl0YW5TdGF0dXMgPSBlaXRoZXJDYXBhYmlsaXRpZXMucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCXJldHVybiB0aXRhblN0YXR1czsKKwl9CisKKwlwcm90ZWN0ZWQgVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0UmVxdWlyZW1lbnRzRnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgQ29tcG9uZW50IGNvbXBvbmVudCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1czsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXF1aXJlbWVudHMgPSBnZXRSZXF1aXJlbWVudHMoY29tcG9uZW50LCBub2RlVHlwZSwgZmFsc2UpOworCQlpZiAoZWl0aGVyUmVxdWlyZW1lbnRzLmlzTGVmdCgpKSB7CisJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzID0gZWl0aGVyUmVxdWlyZW1lbnRzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJlcXVpcmVtZW50cyAhPSBudWxsICYmICFyZXF1aXJlbWVudHMuaXNFbXB0eSgpKSB7CisJCQkJY29tcG9uZW50LnNldFJlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdHVzID0gZWl0aGVyUmVxdWlyZW1lbnRzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzQ29tcG9uZW50RXhpc3QoU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb21wVmVydGV4ID0gdGl0YW5HZW5lcmljRGFvLmdldFZlcnRleEJ5UHJvcGVydHkoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjb21wb25lbnRJZCk7CisJCWlmIChjb21wVmVydGV4LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZmV0Y2ggdmVydGV4IG9mIGNvbXBvbmVudCBkYXRhIGZvciBpZCB7fSIsIGNvbXBvbmVudElkKTsKKwkJCXJlc3VsdCA9IGZhbHNlOworCisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwk8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExpZ2h0Q29tcG9uZW50KFN0cmluZyBpZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbWV0YWRhdGFDb21wb25lbnQgPSBnZXRNZXRhZGF0YUNvbXBvbmVudChpZCwgbm9kZVR5cGUsIGluVHJhbnNhY3Rpb24pOworCQlpZiAobWV0YWRhdGFDb21wb25lbnQuaXNSaWdodCgpKSB7CisKKwkJfQorCQlUIGNvbXBvbmVudCA9IG51bGw7CisJCXRyeSB7CisJCQlsb2cuZGVidWcoIlN0YXJ0aW5nIHRvIGJ1aWxkIGxpZ2h0IGNvbXBvbmVudCBvZiB0eXBlIHt9LCBpZCB7fSIsIG5vZGVUeXBlLCBpZCk7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGhSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGdyYXBoUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfQorCQkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGVjaWVzID0gdGl0YW5HcmFwaC5xdWVyeSgpLmhhcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGlkKS52ZXJ0aWNlcygpOworCQkJaWYgKHZlcnRlY2llcyAhPSBudWxsKSB7CisJCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGVjaWVzLml0ZXJhdG9yKCk7CisJCQkJaWYgKGl0ZXJhdG9yICE9IG51bGwgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVzb3VyY2VQcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXModmVydGV4KTsKKwkJCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudE1ldGFkYXRhRGF0YSA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudChub2RlVHlwZS5nZXROYW1lKCksIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIHJlc291cmNlUHJvcGVydGllcywgQ29tcG9uZW50TWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCQkJY29tcG9uZW50ID0gKFQpIGNvbnZlcnRDb21wb25lbnRNZXRhZGF0YURhdGFUb0NvbXBvbmVudChjb21wb25lbnRNZXRhZGF0YURhdGEpOworCisJCQkJCS8vIGdldCBjcmVhdG9yCisJCQkJCUl0ZXJhdG9yPEVkZ2U+IGl0ZXJDcmVhdG9yID0gdmVydGV4LmVkZ2VzKERpcmVjdGlvbi5JTiwgR3JhcGhFZGdlTGFiZWxzLkNSRUFUT1IubmFtZSgpKTsKKwkJCQkJaWYgKGl0ZXJDcmVhdG9yLmhhc05leHQoKSA9PSBmYWxzZSkgeworCQkJCQkJbG9nLmRlYnVnKCJubyBjcmVhdG9yIHdhcyBkZWZpbmVkIGZvciBjb21wb25lbnQge30iLCBpZCk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJCX0KKwkJCQkJVmVydGV4IHZlcnRleENyZWF0b3IgPSBpdGVyQ3JlYXRvci5uZXh0KCkub3V0VmVydGV4KCk7CisJCQkJCVVzZXJEYXRhIGNyZWF0b3IgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoTm9kZVR5cGVFbnVtLlVzZXIuZ2V0TmFtZSgpLCBHcmFwaEVsZW1lbnRUeXBlRW51bS5Ob2RlLCB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyh2ZXJ0ZXhDcmVhdG9yKSwgVXNlckRhdGEuY2xhc3MpOworCQkJCQlsb2cuZGVidWcoIkJ1aWxkIGNvbXBvbmVudCA6IHNldCBjcmVhdG9yIHVzZXJJZCB0byB7fSIsIGNyZWF0b3IuZ2V0VXNlcklkKCkpOworCQkJCQlTdHJpbmcgZnVsbE5hbWUgPSBidWlsZEZ1bGxOYW1lKGNyZWF0b3IpOworCQkJCQlsb2cuZGVidWcoIkJ1aWxkIGNvbXBvbmVudCA6IHNldCBjcmVhdG9yIGZ1bGwgbmFtZSB0byB7fSIsIGZ1bGxOYW1lKTsKKwkJCQkJKChDb21wb25lbnQpIGNvbXBvbmVudCkuc2V0Q3JlYXRvclVzZXJJZChjcmVhdG9yLmdldFVzZXJJZCgpKTsKKwkJCQkJKChDb21wb25lbnQpIGNvbXBvbmVudCkuc2V0Q3JlYXRvckZ1bGxOYW1lKGZ1bGxOYW1lKTsKKworCQkJCQkvLyBnZXQgbW9kaWZpZXIKKwkJCQkJSXRlcmF0b3I8RWRnZT4gaXRlck1vZGlmaWVyID0gdmVydGV4LmVkZ2VzKERpcmVjdGlvbi5JTiwgR3JhcGhFZGdlTGFiZWxzLkxBU1RfTU9ESUZJRVIubmFtZSgpKTsKKworCQkJCQlpZiAoaXRlck1vZGlmaWVyLmhhc05leHQoKSA9PSBmYWxzZSkgeworCQkJCQkJbG9nLmRlYnVnKCJubyBtb2RpZmllciB3YXMgZGVmaW5lZCBmb3IgY29tcG9uZW50IHt9IiwgaWQpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCQl9CisJCQkJCVZlcnRleCB2ZXJ0ZXhNb2RpZmllciA9IGl0ZXJNb2RpZmllci5uZXh0KCkub3V0VmVydGV4KCk7CisJCQkJCVVzZXJEYXRhIG1vZGlmaWVyID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KE5vZGVUeXBlRW51bS5Vc2VyLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXModmVydGV4TW9kaWZpZXIpLCBVc2VyRGF0YS5jbGFzcyk7CisJCQkJCWxvZy5kZWJ1ZygiQnVpbGQgY29tcG9uZW50IDogc2V0IGxhc3QgbW9kaWZpZXIgdXNlcklkIHRvIHt9IiwgY3JlYXRvci5nZXRVc2VySWQoKSk7CisJCQkJCWZ1bGxOYW1lID0gYnVpbGRGdWxsTmFtZShtb2RpZmllcik7CisJCQkJCWxvZy5kZWJ1ZygiQnVpbGQgY29tcG9uZW50IDogc2V0IGxhc3QgbW9kaWZpZXIgZnVsbCBuYW1lIHRvIHt9IiwgZnVsbE5hbWUpOworCQkJCQkoKENvbXBvbmVudCkgY29tcG9uZW50KS5zZXRMYXN0VXBkYXRlclVzZXJJZChtb2RpZmllci5nZXRVc2VySWQoKSk7CisJCQkJCSgoQ29tcG9uZW50KSBjb21wb25lbnQpLnNldExhc3RVcGRhdGVyRnVsbE5hbWUoZnVsbE5hbWUpOworCisJCQkJCS8vIGdldCBjYXRlZ29yeQorCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBzZXRDb21wb25lbnRDYXRlZ29yaWVzRnJvbUdyYXBoKChDb21wb25lbnQpIGNvbXBvbmVudCk7CisJCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIE5vdGhpbmcgZm91bmQKKwkJCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgd2l0aCBpZCB7fSBub3QgZm91bmQiLCBpZCk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gTm90aGluZyBmb3VuZAorCQkJCWxvZy5kZWJ1ZygiQ29tcG9uZW50IHdpdGggaWQge30gbm90IGZvdW5kIiwgaWQpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfQorCQkJbG9nLmRlYnVnKCJFbmRlZCB0byBidWlsZCBsaWdodCBjb21wb25lbnQgb2YgdHlwZSB7fSwgaWQge30iLCBub2RlVHlwZSwgaWQpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbXBvbmVudCk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCX0KKworCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE1ldGFkYXRhQ29tcG9uZW50KFN0cmluZyBpZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCXRyeSB7CisJCQlsb2cuZGVidWcoIlN0YXJ0aW5nIHRvIGJ1aWxkIG1ldGFkYXRhIGNvbXBvbmVudCBvZiB0eXBlIHt9LCBpZCB7fSIsIG5vZGVUeXBlLCBpZCk7CisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGhSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGdyYXBoUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfQorCQkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGVjaWVzID0gdGl0YW5HcmFwaC5xdWVyeSgpLmhhcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGlkKS52ZXJ0aWNlcygpOworCQkJaWYgKHZlcnRlY2llcyAhPSBudWxsKSB7CisJCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGVjaWVzLml0ZXJhdG9yKCk7CisJCQkJaWYgKGl0ZXJhdG9yICE9IG51bGwgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVzb3VyY2VQcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXModmVydGV4KTsKKwkJCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudE1ldGFkYXRhRGF0YSA9IEdyYXBoRWxlbWVudEZhY3RvcnkuY3JlYXRlRWxlbWVudChub2RlVHlwZS5nZXROYW1lKCksIEdyYXBoRWxlbWVudFR5cGVFbnVtLk5vZGUsIHJlc291cmNlUHJvcGVydGllcywgQ29tcG9uZW50TWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCQkJY29tcG9uZW50ID0gY29udmVydENvbXBvbmVudE1ldGFkYXRhRGF0YVRvQ29tcG9uZW50KGNvbXBvbmVudE1ldGFkYXRhRGF0YSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gTm90aGluZyBmb3VuZAorCQkJCQlsb2cuZGVidWcoIkNvbXBvbmVudCB3aXRoIGlkIHt9IG5vdCBmb3VuZCIsIGlkKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBOb3RoaW5nIGZvdW5kCisJCQkJbG9nLmRlYnVnKCJDb21wb25lbnQgd2l0aCBpZCB7fSBub3QgZm91bmQiLCBpZCk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQl9CisJCQlsb2cuZGVidWcoIkVuZGVkIHRvIGJ1aWxkIG1ldGFkYXRhIGNvbXBvbmVudCBvZiB0eXBlIHt9LCBpZCB7fSIsIG5vZGVUeXBlLCBpZCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29tcG9uZW50KTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRJbnN0YW5jZUNvdXRuZXIoU3RyaW5nIG9yaWdTZXJ2aWNlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0OworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCWlmIChncmFwaFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGdyYXBoUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhTZXJ2aWNlID0gdGl0YW5HZW5lcmljRGFvLmdldFZlcnRleEJ5UHJvcGVydHkoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBvcmlnU2VydmljZUlkKTsKKwkJaWYgKHZlcnRleFNlcnZpY2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBmZXRjaCB2ZXJ0ZXggb2YgY29tcG9uZW50IG1ldGFkYXRhLCBub2RlVHlwZTp7fSAsIGlkOiB7fSIsIG5vZGVUeXBlLCBvcmlnU2VydmljZUlkKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHZlcnRleFNlcnZpY2UucmlnaHQoKS52YWx1ZSgpKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCVZlcnRleCB2ZXJ0ZXggPSB2ZXJ0ZXhTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpOworCQlJbnRlZ2VyIGluc3RhbmNlQ291bnRlciA9IHZlcnRleC52YWx1ZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklOU1RBTkNFX0NPVU5URVIuZ2V0UHJvcGVydHkoKSk7CisJCXJldHVybiBFaXRoZXIubGVmdChpbnN0YW5jZUNvdW50ZXIpOworCX0KKworCXByb3RlY3RlZCBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzRnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgQ29tcG9uZW50IGNvbXBvbmVudCkgeworCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4+IHJlc291cmNlSW5zdGFuY2VzUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4+IGFscmVhZHlQcm9jZXNzZWRSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gYWxyZWFkeVByb2Nlc3NlZEluc3RhbmNlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlNYXA8U3RyaW5nLCBJbW11dGFibGVQYWlyPENvbXBvbmVudEluc3RhbmNlLCBJbnRlZ2VyPj4gcHJvY2Vzc2VkSW5zdGFuY2VzID0gbmV3IEhhc2hNYXA8PigpOworCisJCWlmIChyZXNvdXJjZUluc3RhbmNlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA6IHJlc291cmNlSW5zdGFuY2VzKSB7CisKKwkJCQlMaXN0PFN0cmluZz4gcGF0aCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCXBhdGguYWRkKHJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRJbnN0YW5jZVByb3BlcnRpZXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5nZXRDb21wb25lbnRJbnN0YW5jZVByb3BlcnRpZXMocmVzb3VyY2VJbnN0YW5jZSwgYWxyZWFkeVByb2Nlc3NlZFJlc291cmNlcywgYWxyZWFkeVByb2Nlc3NlZEluc3RhbmNlcywKKwkJCQkJCXByb2Nlc3NlZEluc3RhbmNlcywgcGF0aCk7CisKKwkJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0aWVzLmlzUmlnaHQoKSkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjb21wb25lbnRJbnN0YW5jZVByb3BlcnRpZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCQl9CisJCQkJfQorCisJCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBsaXN0T2ZQcm9wcyA9IGNvbXBvbmVudEluc3RhbmNlUHJvcGVydGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCA9IHJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKTsKKwkJCQlyZXNvdXJjZUluc3RhbmNlc1Byb3BlcnRpZXMucHV0KHJlc291cmNlSW5zdGFuY2VVaWQsIGxpc3RPZlByb3BzKTsKKworCQkJCS8vIGFscmVhZHlQcm9jZXNzZWRJbnN0YW5jZXMucHV0KHJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQkvLyByZXNvdXJjZUluc3RhbmNlKTsKKworCQkJCXByb2Nlc3NlZEluc3RhbmNlcy5wdXQocmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBuZXcgSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZSwgSW50ZWdlcj4ocmVzb3VyY2VJbnN0YW5jZSwgcGF0aC5zaXplKCkpKTsKKwkJCQlwYXRoLnJlbW92ZShwYXRoLnNpemUoKSAtIDEpOworCisJCQl9CisKKwkJfQorCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kQWxsUHJvcGVydGllc1ZhbHVlc09uSW5zdGFuY2VzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uZmluZEFsbFByb3BlcnR5VmFsdWVPbkluc3RhbmNlcyhwcm9jZXNzZWRJbnN0YW5jZXMpOworCQkvLyAxLiBjaGVjayBzdGF0dXMKKwkJaWYgKGZpbmRBbGxQcm9wZXJ0aWVzVmFsdWVzT25JbnN0YW5jZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kQWxsUHJvcGVydGllc1ZhbHVlc09uSW5zdGFuY2VzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQl9CisJCS8vIDIuIG1lcmdlIGRhdGEgZnJvbSBydWxlcyBvbiBwcm9wZXJ0aWVzIChyZXNvdXJjZUluc3RhbmNlc1Byb3BlcnRpZXMpCisJCXByb3BlcnR5T3BlcmF0aW9uLnVwZGF0ZVByb3BlcnRpZXNCeVByb3BlcnR5VmFsdWVzKHJlc291cmNlSW5zdGFuY2VzUHJvcGVydGllcywgZmluZEFsbFByb3BlcnRpZXNWYWx1ZXNPbkluc3RhbmNlcy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMocmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzKTsKKworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldENvbXBvbmVudEluc3RhbmNlc0lucHV0c0Zyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIENvbXBvbmVudCBjb21wb25lbnQpIHsKKworCQlNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+PiByZXNvdXJjZUluc3RhbmNlc0lucHV0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGNvbXBvbmVudEluc3RhbmNlcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKwkJaWYgKGNvbXBvbmVudEluc3RhbmNlcyAhPSBudWxsKSB7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgOiBjb21wb25lbnRJbnN0YW5jZXMpIHsKKwkJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclJJQXR0cmlidXRlcyA9IGlucHV0T3BlcmF0aW9uLmdldEFsbElucHV0c09mUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlKTsKKwkJCQlpZiAoZWl0aGVyUklBdHRyaWJ1dGVzLmlzUmlnaHQoKSkgeworCQkJCQlpZiAoZWl0aGVyUklBdHRyaWJ1dGVzLnJpZ2h0KCkudmFsdWUoKSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJCXN0YXR1cyA9IGVpdGhlclJJQXR0cmlidXRlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJlc291cmNlSW5zdGFuY2VzSW5wdXRzLnB1dChyZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIGVpdGhlclJJQXR0cmlidXRlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQkJaWYgKCFyZXNvdXJjZUluc3RhbmNlc0lucHV0cy5pc0VtcHR5KCkpCisJCQkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc0lucHV0cyhyZXNvdXJjZUluc3RhbmNlc0lucHV0cyk7CisJCX0KKworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyBFaXRoZXI8U3RyaW5nLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRJbnZhcmlhbnRVVUlEKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFN0cmluZywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleEJ5UHJvcGVydHkgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0VmVydGV4QnlQcm9wZXJ0eShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGNvbXBvbmVudElkKTsKKwkJCWlmICh2ZXJ0ZXhCeVByb3BlcnR5LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHZlcnRleEJ5UHJvcGVydHkucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJlcyA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJfSBlbHNlIHsKKwkJCQlWZXJ0ZXggdiA9IHZlcnRleEJ5UHJvcGVydHkubGVmdCgpLnZhbHVlKCk7CisJCQkJU3RyaW5nIGludmFyaWFudFVVSUQgPSB2LnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5WQVJJQU5UX1VVSUQuZ2V0UHJvcGVydHkoKSk7CisKKwkJCQlpZiAoaW52YXJpYW50VVVJRCA9PSBudWxsIHx8IGludmFyaWFudFVVSUQuaXNFbXB0eSgpKSB7CisKKwkJCQkJbG9nLmluZm8oIlRoZSBjb21wb25lbnQge30gaGFzIGVtcHR5IGludmFyaWFudCBVVUlELiIsIGNvbXBvbmVudElkKTsKKwkJCQkJcmVzID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9FTEVNRU5UKSk7CisKKwkJCQl9CisJCQkJcmVzID0gRWl0aGVyLmxlZnQoaW52YXJpYW50VVVJRCk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworCXByb3RlY3RlZCBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRHcm91cHNGcm9tR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBDb21wb25lbnQgY29tcG9uZW50LCBOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtKSB7CisKKwkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcyA9IGdyb3VwT3BlcmF0aW9uLmdldEFsbEdyb3Vwc0Zyb21HcmFwaCh1bmlxdWVJZCwgbm9kZVR5cGVFbnVtKTsKKwkJaWYgKHJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJfQorCQljb21wb25lbnQuc2V0R3JvdXBzKHJlcy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldENvbXBvbmVudElucHV0c0Zyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIENvbXBvbmVudCBjb21wb25lbnQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUxpc3Q8SW5wdXREZWZpbml0aW9uPiBpbnB1dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gaW5wdXRzT3BlcmF0aW9uLmZpbmRBbGxSZXNvdXJjZUlucHV0cyh1bmlxdWVJZCwgaW5wdXRzKTsKKwkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJY29tcG9uZW50LnNldElucHV0cyhpbnB1dHMpOworCQl9CisKKwkJcmV0dXJuIHN0YXR1czsKKworCX0KKworCXByb3RlY3RlZCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUdyb3VwcyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjb21wb25lbnRJZCkgeworCisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlcyA9IGdyb3VwT3BlcmF0aW9uLmRlbGV0ZUFsbEdyb3Vwcyhjb21wb25lbnRJZCwgbm9kZVR5cGUsIHRydWUpOworCisJCWlmIChkZWxldGVSZXMuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRlbGV0ZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwcm90ZWN0ZWQgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVJbnB1dHNGcm9tQ29tcG9uZW50KE5vZGVUeXBlRW51bSB0eXBlRW51bSwgQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlFaXRoZXI8TWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsSW5wdXRzQXNzb2NpYXRlZFRvTm9kZSA9IGlucHV0c09wZXJhdGlvbi5kZWxldGVBbGxJbnB1dHNBc3NvY2lhdGVkVG9Ob2RlKHR5cGVFbnVtLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCXJldHVybiBkZWxldGVBbGxJbnB1dHNBc3NvY2lhdGVkVG9Ob2RlLmlzUmlnaHQoKSA/IGRlbGV0ZUFsbElucHV0c0Fzc29jaWF0ZWRUb05vZGUucmlnaHQoKS52YWx1ZSgpIDogU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcm90ZWN0ZWQgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlSW5wdXRzVG9Db21wb25lbnQoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBDb21wb25lbnRNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhLCBMaXN0PElucHV0RGVmaW5pdGlvbj4gcHJvcGVydGllcykgeworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsRGF0YVR5cGVzID0gYXBwbGljYXRpb25EYXRhVHlwZUNhY2hlLmdldEFsbCgpOworCQlpZiAoYWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQ2Fubm90IGZpbmQgYW55IGRhdGEgdHlwZS4gU3RhdHVzIGlzIHt9LiIsIHN0YXR1cyk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBjb252ZXJ0ZWRQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCWZvciAoSW5wdXREZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA6IHByb3BlcnRpZXMpIHsKKwkJCQljb252ZXJ0ZWRQcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eURlZmluaXRpb24uZ2V0TmFtZSgpLCBwcm9wZXJ0eURlZmluaXRpb24pOworCQkJfQorCisJCQlFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gb3BlcmF0aW9uU3RhdHVzID0gaW5wdXRzT3BlcmF0aW9uLmFkZElucHV0c1RvR3JhcGgocmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCBub2RlVHlwZSwgY29udmVydGVkUHJvcGVydGllcywgYWxsRGF0YVR5cGVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWlmIChvcGVyYXRpb25TdGF0dXMuaXNMZWZ0KCkpCisJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJZWxzZQorCQkJCXJldHVybiBvcGVyYXRpb25TdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUlucHV0c1RvQ29tcG9uZW50KFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4LCBTdHJpbmcgY29tcG9uZW50SWQsIExpc3Q8SW5wdXREZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBhcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUuZ2V0QWxsKCk7CisJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDYW5ub3QgZmluZCBhbnkgZGF0YSB0eXBlLiBTdGF0dXMgaXMge30uIiwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlNYXA8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+IGNvbnZlcnRlZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJZm9yIChJbnB1dERlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uIDogcHJvcGVydGllcykgeworCQkJCWNvbnZlcnRlZFByb3BlcnRpZXMucHV0KHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCksIHByb3BlcnR5RGVmaW5pdGlvbik7CisJCQl9CisKKwkJCXJldHVybiBpbnB1dHNPcGVyYXRpb24uYWRkSW5wdXRzVG9HcmFwaChtZXRhZGF0YVZlcnRleCwgY29tcG9uZW50SWQsIGNvbnZlcnRlZFByb3BlcnRpZXMsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDb21wb25lbnRJbnN0bmNlc01ldGFkYXRhKFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisJCUluc3RhbnQgc3RhcnQgPSBJbnN0YW50Lm5vdygpOworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uZ2V0QWxsQ29tcG9uZW50SW5zdGFuY2VzTWV0YWRhdGFPbmx5KGNvbXBvbmVudElkLCBub2RlVHlwZSk7CisJCUluc3RhbnQgZW5kID0gSW5zdGFudC5ub3coKTsKKwkJbG9nLmRlYnVnKCJUT1RBTCBUSU1FIEJMIEdFVCBJTlNUQU5DRVM6IHt9IiwgRHVyYXRpb24uYmV0d2VlbihzdGFydCwgZW5kKSk7IC8vIHByaW50cworCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gUFQxTTMuNTUzUworCQlyZXR1cm4gcmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2U7CisJfQorCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50PiwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRzRnJvbUNhY2hlRm9yQ2F0YWxvZyhTZXQ8U3RyaW5nPiBjb21wb25lbnRzLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisKKwkJRWl0aGVyPEltbXV0YWJsZVRyaXBsZTxMaXN0PENvbXBvbmVudD4sIExpc3Q8Q29tcG9uZW50PiwgU2V0PFN0cmluZz4+LCBBY3Rpb25TdGF0dXM+IGNvbXBvbmVudHNGb3JDYXRhbG9nID0gY29tcG9uZW50Q2FjaGUuZ2V0Q29tcG9uZW50c0ZvckNhdGFsb2coY29tcG9uZW50cywgY29tcG9uZW50VHlwZSk7CisJCWlmIChjb21wb25lbnRzRm9yQ2F0YWxvZy5pc0xlZnQoKSkgeworCQkJSW1tdXRhYmxlVHJpcGxlPExpc3Q8Q29tcG9uZW50PiwgTGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4gaW1tdXRhYmxlVHJpcGxlID0gY29tcG9uZW50c0ZvckNhdGFsb2cubGVmdCgpLnZhbHVlKCk7CisJCQlMaXN0PENvbXBvbmVudD4gZm91bmRDb21wb25lbnRzID0gaW1tdXRhYmxlVHJpcGxlLmdldExlZnQoKTsKKworCQkJaWYgKGZvdW5kQ29tcG9uZW50cyAhPSBudWxsKSB7CisJCQkJLy8gZm91bmRDb21wb25lbnRzLmZvckVhY2gocCAtPiByZXN1bHQuYWRkKChSZXNvdXJjZSlwKSk7CisJCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIHt9cyBhZGRlZCB0byBjYXRhbG9nIGZyb20gY2FjaGUgaXMge30iLCBjb21wb25lbnRUeXBlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCBmb3VuZENvbXBvbmVudHMuc2l6ZSgpKTsKKworCQkJfQorCQkJTGlzdDxDb21wb25lbnQ+IGZvdW5kRGlydHlDb21wb25lbnRzID0gaW1tdXRhYmxlVHJpcGxlLmdldE1pZGRsZSgpOworCQkJU2V0PFN0cmluZz4gbm9uQ2FjaGVkQ29tcG9uZW50cyA9IGltbXV0YWJsZVRyaXBsZS5nZXRSaWdodCgpOworCQkJaW50IG51bWJlckRpcnR5UmVzb3VyY2VzID0gZm91bmREaXJ0eUNvbXBvbmVudHMgPT0gbnVsbCA/IDAgOiBmb3VuZERpcnR5Q29tcG9uZW50cy5zaXplKCk7CisJCQlpbnQgbnVtYmVyTm9uQ2FjaGVkID0gbm9uQ2FjaGVkQ29tcG9uZW50cyA9PSBudWxsID8gMCA6IG5vbkNhY2hlZENvbXBvbmVudHMuc2l6ZSgpOworCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIGxlZnQge31zIGZvciBjYXRhbG9nIGlzIHt9IiwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgbnVtYmVyRGlydHlSZXNvdXJjZXMgKyBudW1iZXJOb25DYWNoZWQpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZvdW5kQ29tcG9uZW50cyk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudHNGb3JDYXRhbG9nLnJpZ2h0KCkudmFsdWUoKSk7CisJfQorCisJcHVibGljIDxUIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhPiBFaXRoZXI8TGlzdDxUPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldExpc3RPZkhpZ2hlc3RDb21wb25lbnRzKE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIENsYXNzPFQ+IGNsYXp6KSB7CisKKwkJbG9uZyBzdGFydEZldGNoQWxsU3RhdGVzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2hIaWdlc3QgPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BlcnRpZXNUb01hdGNoSGlnZXN0LnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKwkJRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxIaWdoZXN0U3RhdGVzID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEobm9kZVR5cGVFbnVtLCBwcm9wZXJ0aWVzVG9NYXRjaEhpZ2VzdCwgY2xhenopOworCQlpZiAoYWxsSGlnaGVzdFN0YXRlcy5pc1JpZ2h0KCkgJiYgYWxsSGlnaGVzdFN0YXRlcy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFsbEhpZ2hlc3RTdGF0ZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlsb25nIGVuZEZldGNoQWxsU3RhdGVzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJaWYgKGFsbEhpZ2hlc3RTdGF0ZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3IEFycmF5TGlzdDw+KCkpOworCQl9CisJCUxpc3Q8VD4gc2VydmljZXMgPSBhbGxIaWdoZXN0U3RhdGVzLmxlZnQoKS52YWx1ZSgpOworCisJCUxpc3Q8VD4gY2VydGlmaWVkSGlnaGVzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlMaXN0PFQ+IG5vdENlcnRpZmllZEhpZ2hlc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChUIHJlRGF0YSA6IHNlcnZpY2VzKSB7CisJCQlpZiAocmVEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRTdGF0ZSgpLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSkpIHsKKwkJCQljZXJ0aWZpZWRIaWdoZXN0LmFkZChyZURhdGEpOworCQkJfSBlbHNlIHsKKwkJCQlub3RDZXJ0aWZpZWRIaWdoZXN0LmFkZChyZURhdGEpOworCQkJfQorCQl9CisKKwkJbG9nLmRlYnVnKCJGZXRjaCBjYXRhbG9nIHt9cyBhbGwgc3RhdGVzOiBjZXJ0aWZpZWQge30sIG5vbmNlcnRpZmllZCB7fSIsIG5vZGVUeXBlRW51bS5nZXROYW1lKCksIGNlcnRpZmllZEhpZ2hlc3Quc2l6ZSgpLCBub3RDZXJ0aWZpZWRIaWdoZXN0LnNpemUoKSk7CisJCWxvZy5kZWJ1ZygiRmV0Y2ggY2F0YWxvZyB7fXMgYWxsIHN0YXRlcyBmcm9tIGdyYXBoIHRvb2sge30gbXMiLCBub2RlVHlwZUVudW0uZ2V0TmFtZSgpLCBlbmRGZXRjaEFsbFN0YXRlcyAtIHN0YXJ0RmV0Y2hBbGxTdGF0ZXMpOworCisJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHNlcnZpY2VOYW1lcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChUIGRhdGEgOiBub3RDZXJ0aWZpZWRIaWdoZXN0KSB7CisJCQlTdHJpbmcgc2VydmljZU5hbWUgPSBkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7CisJCQlzZXJ2aWNlTmFtZXMucHV0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlTmFtZSk7CisJCX0KKworCQlmb3IgKFQgZGF0YSA6IGNlcnRpZmllZEhpZ2hlc3QpIHsKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKTsKKwkJCWlmICghc2VydmljZU5hbWVzLmNvbnRhaW5zS2V5KHNlcnZpY2VOYW1lKSkgeworCQkJCW5vdENlcnRpZmllZEhpZ2hlc3QuYWRkKGRhdGEpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG5vdENlcnRpZmllZEhpZ2hlc3QpOworCX0KKworCXByb3RlY3RlZCA8VCBleHRlbmRzIENvbXBvbmVudD4gRWl0aGVyPFQsIEFjdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZShTdHJpbmcgdW5pcXVlSWQsIENvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnRNZXRhZGF0YURhdGEsIENvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBDbGFzczxUPiBjbGF6eiwKKwkJCUNvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtKSB7CisKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl0cnkgeworCisJCQlsb25nIGxhc3RNb2RpZmljYXRpb25UaW1lID0gY29tcG9uZW50TWV0YWRhdGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRMYXN0VXBkYXRlRGF0ZSgpOworCQkJRWl0aGVyPENvbXBvbmVudCwgQWN0aW9uU3RhdHVzPiBjYWNoZUNvbXBvbmVudFJlcyA9IHRoaXMuY29tcG9uZW50Q2FjaGUuZ2V0Q29tcG9uZW50KHVuaXF1ZUlkLCBsYXN0TW9kaWZpY2F0aW9uVGltZSk7CisJCQlpZiAoY2FjaGVDb21wb25lbnRSZXMuaXNMZWZ0KCkpIHsKKwkJCQlDb21wb25lbnQgY2FjaGVkQ29tcG9uZW50ID0gY2FjaGVDb21wb25lbnRSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQkvLyBNdXN0IGNhbGN1bGF0ZSBhbGxWZXJzaW9ucworCQkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUFsbFZlcnNpb25zKCkpIHsKKwkJCQkJQ2xhc3M8PyBleHRlbmRzIENvbXBvbmVudE1ldGFkYXRhRGF0YT4gY2xhenoxID0gbnVsbDsKKwkJCQkJc3dpdGNoIChjb21wb25lbnRUeXBlRW51bSkgeworCQkJCQljYXNlIFJFU09VUkNFOgorCQkJCQkJY2xhenoxID0gUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3M7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTRVJWSUNFOgorCQkJCQkJY2xhenoxID0gU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzczsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFBST0RVQ1Q6CisJCQkJCQljbGF6ejEgPSBQcm9kdWN0TWV0YWRhdGFEYXRhLmNsYXNzOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoY2xhenoxICE9IG51bGwpIHsKKwkJCQkJCS8vIGxvbmcgc3RhcnRHZXRBbGxWZXJzaW9ucyA9CisJCQkJCQkvLyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVyc2lvbkxpc3QgPSBnZXRWZXJzaW9uTGlzdChjb21wb25lbnRUeXBlRW51bS5nZXROb2RlVHlwZSgpLCBjYWNoZWRDb21wb25lbnQuZ2V0VmVyc2lvbigpLCBjYWNoZWRDb21wb25lbnQuZ2V0VVVJRCgpLCBjYWNoZWRDb21wb25lbnQuZ2V0U3lzdGVtTmFtZSgpLCBjbGF6ejEpOworCQkJCQkJLy8gbG9nLmRlYnVnKCJGZXRjaCBhbGwgdmVyc2lvbnMgZm9yIGNvbXBvbmVudCB7fSB0b29rCisJCQkJCQkvLyB7fSBtcyIsIGNhY2hlZENvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQkJLy8gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydEdldEFsbFZlcnNpb25zKTsKKwkJCQkJCWlmICh2ZXJzaW9uTGlzdC5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQkJCX0KKworCQkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhbGxWZXJzaW9ucyA9IHZlcnNpb25MaXN0LmxlZnQoKS52YWx1ZSgpOworCQkJCQkJY2FjaGVkQ29tcG9uZW50LnNldEFsbFZlcnNpb25zKGFsbFZlcnNpb25zKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChjb21wb25lbnRQYXJhbWV0ZXJzVmlldyAhPSBudWxsKSB7CisJCQkJCWNhY2hlZENvbXBvbmVudCA9IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmZpbHRlcihjYWNoZWRDb21wb25lbnQsIGNvbXBvbmVudFR5cGVFbnVtKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNsYXp6LmNhc3QoY2FjaGVkQ29tcG9uZW50KSk7CisJCQl9CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY2FjaGVDb21wb25lbnRSZXMucmlnaHQoKS52YWx1ZSgpKTsKKworCQl9IGZpbmFsbHkgeworCQkJbG9nLnRyYWNlKCJGZXRjaCBjb21wb25lbnQge30gd2l0aCB1aWQge30gZnJvbSBjYWNoZSB0b29rIHt9IG1zIiwgY29tcG9uZW50VHlwZUVudW0ubmFtZSgpLnRvTG93ZXJDYXNlKCksIHVuaXF1ZUlkLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiwgQWN0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRzRnJvbUNhY2hlRm9yQ2F0YWxvZyhNYXA8U3RyaW5nLCBMb25nPiBjb21wb25lbnRzLCBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlKSB7CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50c0ZvckNhdGFsb2cgPSBjb21wb25lbnRDYWNoZS5nZXRDb21wb25lbnRzRm9yQ2F0YWxvZyhjb21wb25lbnRzLCBjb21wb25lbnRUeXBlKTsKKwkJaWYgKGNvbXBvbmVudHNGb3JDYXRhbG9nLmlzTGVmdCgpKSB7CisJCQlJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50PiwgU2V0PFN0cmluZz4+IGltbXV0YWJsZVBhaXIgPSBjb21wb25lbnRzRm9yQ2F0YWxvZy5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8Q29tcG9uZW50PiBmb3VuZENvbXBvbmVudHMgPSBpbW11dGFibGVQYWlyLmdldExlZnQoKTsKKworCQkJaWYgKGZvdW5kQ29tcG9uZW50cyAhPSBudWxsKSB7CisJCQkJLy8gZm91bmRDb21wb25lbnRzLmZvckVhY2gocCAtPiByZXN1bHQuYWRkKChSZXNvdXJjZSlwKSk7CisJCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIHt9cyBhZGRlZCB0byBjYXRhbG9nIGZyb20gY2FjaGUgaXMge30iLCBjb21wb25lbnRUeXBlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLCBmb3VuZENvbXBvbmVudHMuc2l6ZSgpKTsKKwkJCX0KKwkJCVNldDxTdHJpbmc+IGxlZnRDb21wb25lbnRzID0gaW1tdXRhYmxlUGFpci5nZXRSaWdodCgpOworCQkJaW50IG51bWJlck5vbkNhY2hlZCA9IGxlZnRDb21wb25lbnRzID09IG51bGwgPyAwIDogbGVmdENvbXBvbmVudHMuc2l6ZSgpOworCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIGxlZnQge31zIGZvciBjYXRhbG9nIGlzIHt9IiwgY29tcG9uZW50VHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgbnVtYmVyTm9uQ2FjaGVkKTsKKworCQkJSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiByZXN1bHQgPSBuZXcgSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+Pihmb3VuZENvbXBvbmVudHMsIGxlZnRDb21wb25lbnRzKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnRzRm9yQ2F0YWxvZy5yaWdodCgpLnZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnQKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEBwYXJhbSB0aXRhbkdlbmVyaWNEYW8KKwkgKiBAcGFyYW0gY2xhenoKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQ29tcG9uZW50RmlsdGVyUmVzdWx0KENvbXBvbmVudCBjb21wb25lbnQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbywgQ2xhc3M8VD4gY2xhenosIE5vZGVUeXBlRW51bSB0eXBlLCBDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBmaWx0ZXJSZXN1bHQpIHsKKwkJRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJbG9nLmRlYnVnKCJJbiB1cGRhdGVDb21wb25lbnQuIHJlY2VpdmVkIGNvbXBvbmVudCB1aWQgPSB7fSIsIChjb21wb25lbnQgPT0gbnVsbCA/IG51bGwgOiBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSkpOworCQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7CisJCQkJbG9nLmVycm9yKCJTZXJ2aWNlIG9iamVjdCBpcyBudWxsIik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUNvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnREYXRhID0gZ2V0TWV0YURhdGFGcm9tQ29tcG9uZW50KGNvbXBvbmVudCk7CisKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgY29udmVydGluZyBjb21wb25lbnQgdG8gY29tcG9uZW50RGF0YS4gQ29tcG9uZW50RGF0YSA9IHt9IiwgY29tcG9uZW50RGF0YSk7CisKKwkJCWlmIChjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCkgPT0gbnVsbCkgeworCQkJCWxvZy5lcnJvcigiUmVzb3VyY2UgaWQgaXMgbWlzc2luZyBpbiB0aGUgcmVxdWVzdC4iKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1QpOworCQkJfQorCisJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY291bnRlclN0YXR1cyA9IHRoaXMuZ2V0Q29tcG9uZW50SW5zdGFuY2VDb3V0bmVyKGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldE5vZGVUeXBlKCkpOworCisJCQlpZiAoY291bnRlclN0YXR1cy5pc1JpZ2h0KCkpIHsKKworCQkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgY29tcG9uZW50SW5zdGFuY2VDb3VudGVyIGZvciBjb21wb25lbnQge30gaW4gdGhlIGdyYXBoLiBTdGF0dXMgaXMge30iLCBjb21wb25lbnREYXRhLmdldFVuaXF1ZUlkKCksIGNvdW50ZXJTdGF0dXMpOworCQkJCS8vIHJlc3VsdCA9IHNlbmRFcnJvcihzdGF0dXMsCisJCQkJLy8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJY29tcG9uZW50RGF0YS5zZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIoY291bnRlclN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCVN0cmluZyBtb2RpZmllclVzZXJJZCA9IGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpOworCQkJaWYgKG1vZGlmaWVyVXNlcklkID09IG51bGwgfHwgbW9kaWZpZXJVc2VySWQuaXNFbXB0eSgpKSB7CisJCQkJbG9nLmVycm9yKCJ1c2VySWQgaXMgbWlzc2luZyBpbiB0aGUgcmVxdWVzdC4iKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRVc2VyID0gZmluZFVzZXIobW9kaWZpZXJVc2VySWQpOworCisJCQlpZiAoZmluZFVzZXIuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFVzZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgdXNlciB7fSBpbiB0aGUgZ3JhcGguIFN0YXR1cyBpcyB7fSIsIG1vZGlmaWVyVXNlcklkLCBzdGF0dXMpOworCQkJCS8vIHJlc3VsdCA9IHNlbmRFcnJvcihzdGF0dXMsCisJCQkJLy8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVXNlckRhdGEgbW9kaWZpZXJVc2VyRGF0YSA9IGZpbmRVc2VyLmxlZnQoKS52YWx1ZSgpOworCQkJU3RyaW5nIHJlc291cmNlSWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKworCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgPSBuZXcgQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcoKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmRpc2FibGVBbGwoKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZVVzZXJzKGZhbHNlKTsKKwkJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZUNhdGVnb3JpZXMoZmFsc2UpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlRGVyaXZlZEZyb20oZmFsc2UpOworCQkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQXJ0aWZhY3RzKGZhbHNlKTsKKwkJCUVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjdXJyZW50Q29tcG9uZW50UmVzdWx0ID0gdGhpcy5nZXRDb21wb25lbnQocmVzb3VyY2VJZCwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGN1cnJlbnRDb21wb25lbnRSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJDYW5ub3QgZmluZCByZXNvdXJjZSB3aXRoIGlkIHt9IGluIHRoZSBncmFwaC4iLCByZXNvdXJjZUlkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY3VycmVudENvbXBvbmVudFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUNvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50ID0gKENvbXBvbmVudCkgY3VycmVudENvbXBvbmVudFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCVN0cmluZyBjdXJyZW50TW9kaWZpZXIgPSBjdXJyZW50Q29tcG9uZW50LmdldExhc3RVcGRhdGVyVXNlcklkKCk7CisKKwkJCWlmIChjdXJyZW50TW9kaWZpZXIuZXF1YWxzKG1vZGlmaWVyVXNlckRhdGEuZ2V0VW5pcXVlSWQoKSkpIHsKKwkJCQlsb2cuZGVidWcoIkdyYXBoIExBU1QgTU9ESUZJRVIgZWRnZSBzaG91bGQgbm90IGJlIGNoYW5nZWQgc2luY2UgdGhlIG1vZGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG1vZGlmaWVyLiIpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIHVwZGF0ZSB0aGUgbGFzdCBtb2RpZmllciB1c2VyIG9mIHRoZSByZXNvdXJjZSBmcm9tIHt9IHRvIHt9IiwgY3VycmVudE1vZGlmaWVyLCBtb2RpZmllclVzZXJJZCk7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBtb3ZlTGFzdE1vZGlmaWVyRWRnZShjb21wb25lbnQsIGNvbXBvbmVudERhdGEsIG1vZGlmaWVyVXNlckRhdGEsIHR5cGUpOworCQkJCWxvZy5kZWJ1ZygiRmluaXNoIHRvIHVwZGF0ZSB0aGUgbGFzdCBtb2RpZmllciB1c2VyIG9mIHRoZSByZXNvdXJjZSBmcm9tIHt9IHRvIHt9LiBTdGF0dXMgaXMge30iLCBjdXJyZW50TW9kaWZpZXIsIG1vZGlmaWVyVXNlcklkLCBzdGF0dXMpOworCQkJCWlmIChzdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCQlmaW5hbCBsb25nIGN1cnJlbnRUaW1lTWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb2cuZGVidWcoIkdvaW5nIHRvIHVwZGF0ZSB0aGUgbGFzdCBVcGRhdGUgRGF0ZSBvZiB0aGUgcmVzb3VyY2UgZnJvbSB7fSB0byB7fSIsIGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlRGF0ZSgpLCBjdXJyZW50VGltZU1pbGxpcyk7CisJCQljb21wb25lbnQuc2V0TGFzdFVwZGF0ZURhdGUoY3VycmVudFRpbWVNaWxsaXMpOworCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNoZWNrQ2F0ZWdvcmllcyA9IHZhbGlkYXRlQ2F0ZWdvcmllcyhjdXJyZW50Q29tcG9uZW50LCBjb21wb25lbnQsIGNvbXBvbmVudERhdGEsIHR5cGUpOworCQkJaWYgKGNoZWNrQ2F0ZWdvcmllcyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNoZWNrQ2F0ZWdvcmllcyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJTGlzdDxTdHJpbmc+IHRhZ3MgPSBjb21wb25lbnQuZ2V0VGFncygpOworCQkJaWYgKHRhZ3MgIT0gbnVsbCAmJiBmYWxzZSA9PSB0YWdzLmlzRW1wdHkoKSkgeworCQkJCUVpdGhlcjxMaXN0PFRhZ0RhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB0YWdzUmVzdWx0ID0gY3JlYXRlTmV3VGFnc0xpc3QodGFncyk7CisJCQkJaWYgKHRhZ3NSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCh0YWdzUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJCUxpc3Q8VGFnRGF0YT4gdGFnc1RvQ3JlYXRlID0gdGFnc1Jlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAodGFnc1RvQ3JlYXRlICE9IG51bGwgJiYgIXRhZ3NUb0NyZWF0ZS5pc0VtcHR5KCkpIHsKKwkJCQkJdGFnc1RvQ3JlYXRlID0gSW1tdXRhYmxlU2V0LmNvcHlPZih0YWdzVG9DcmVhdGUpLmFzTGlzdCgpOworCQkJCQlmb3IgKFRhZ0RhdGEgdGFnRGF0YSA6IHRhZ3NUb0NyZWF0ZSkgeworCQkJCQkJbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgdGFnIHt9IiwgdGFnRGF0YSk7CisJCQkJCQlFaXRoZXI8VGFnRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVRhZ1Jlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHRhZ0RhdGEsIFRhZ0RhdGEuY2xhc3MpOworCQkJCQkJaWYgKGNyZWF0ZVRhZ1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjcmVhdGVUYWdSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCQkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgdGFnIHt9IGluIHRoZSBncmFwaC4gU3RhdHVzIGlzIHt9IiwgdGFnRGF0YSwgc3RhdHVzKTsKKwkJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQkJfQorCQkJCQkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGluZyB0YWcge30iLCB0YWdEYXRhKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShjb21wb25lbnREYXRhLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgcmVzb3VyY2Uge30uIFN0YXR1cyBpcyB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCB1cGRhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlDb21wb25lbnRNZXRhZGF0YURhdGEgdXBkYXRlZFJlc291cmNlRGF0YSA9IHVwZGF0ZU5vZGUubGVmdCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkNvbXBvbmVudERhdGEgQWZ0ZXIgdXBkYXRlIGlzIHt9IiwgdXBkYXRlZFJlc291cmNlRGF0YSk7CisKKwkJCS8vIERFMjMwMTk1IGluIGNhc2UgcmVzb3VyY2UgbmFtZSBjaGFuZ2VkIHVwZGF0ZSBUT1NDQSBhcnRpZmFjdHMKKwkJCS8vIGZpbGUgbmFtZXMgYWNjb3JkaW5nbHkKKwkJCVN0cmluZyBuZXdTeXN0ZW1OYW1lID0gdXBkYXRlZFJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3lzdGVtTmFtZSgpOworCQkJaWYgKG5ld1N5c3RlbU5hbWUgIT0gbnVsbCAmJiAhbmV3U3lzdGVtTmFtZS5lcXVhbHMoY3VycmVudENvbXBvbmVudC5nZXRTeXN0ZW1OYW1lKCkpKSB7CisJCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiB0b3NjYUFydGlmYWN0cyA9IGNvbXBvbmVudC5nZXRUb3NjYUFydGlmYWN0cygpOworCQkJCWlmICh0b3NjYUFydGlmYWN0cyAhPSBudWxsKSB7CisJCQkJCWZvciAoRW50cnk8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0IDogdG9zY2FBcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJCQkJRWl0aGVyPEFydGlmYWN0RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTmFtZSA9IGdlbmVyYXRlQW5kVXBkYXRlVG9zY2FGaWxlTmFtZShjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZhbHVlKCkudG9Mb3dlckNhc2UoKSwgbmV3U3lzdGVtTmFtZSwgdXBkYXRlZFJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCQkJdHlwZSwgYXJ0aWZhY3QuZ2V0VmFsdWUoKSk7CisJCQkJCQlpZiAodXBkYXRlTmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodXBkYXRlTmFtZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkuZXF1YWxzKENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSkgeworCQkJCXVwZGF0ZURlcml2ZWQoY29tcG9uZW50LCBjdXJyZW50Q29tcG9uZW50LCBjb21wb25lbnREYXRhLCBjb21wb25lbnQuZ2V0Q2xhc3MoKSk7CisJCQl9CisKKwkJCUVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVkUmVzb3VyY2UgPSBnZXRDb21wb25lbnQoY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIGZpbHRlclJlc3VsdCwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAodXBkYXRlZFJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiUmVzb3VyY2UgaWQgaXMgbWlzc2luZyBpbiB0aGUgcmVxdWVzdC4gc3RhdHVzIGlzIHt9IiwgdXBkYXRlZFJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVQgdXBkYXRlZFJlc291cmNlVmFsdWUgPSB1cGRhdGVkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh1cGRhdGVkUmVzb3VyY2VWYWx1ZSk7CisKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCS8vIFN0cmluZyBqc29uID0gcHJldHR5SnNvbi50b0pzb24ocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkvLyBsb2cuZGVidWcoIlJlc291cmNlIHJldHJpZXZlZCBhZnRlciB1cGRhdGUgaXMge30iLCBqc29uKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigidXBkYXRlQ29tcG9uZW50IG9wZXJhdGlvbiA6IEdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygidXBkYXRlQ29tcG9uZW50IG9wZXJhdGlvbiA6IEdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Db25zdW1lck9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Db25zdW1lck9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZmE0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NvbnN1bWVyT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ29uc3VtZXJPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db25zdW1lckRhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImNvbnN1bWVyLW9wZXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgQ29uc3VtZXJPcGVyYXRpb24gaW1wbGVtZW50cyBJQ29uc3VtZXJPcGVyYXRpb24geworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29uc3VtZXJPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBDb25zdW1lck9wZXJhdGlvbigpIHsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q3JlZGVudGlhbHMoU3RyaW5nIGNvbnN1bWVyTmFtZSkgeworCQlFaXRoZXI8Q29uc3VtZXJEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQlsb2cuZGVidWcoInJldHJpdmluZyBDcmVkZW50aWFscyBmb3I6IHt9LiIsIGNvbnN1bWVyTmFtZSk7CisJCUVpdGhlcjxDb25zdW1lckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DT05TVU1FUl9OQU1FLmdldFByb3BlcnR5KCksIGNvbnN1bWVyTmFtZSwgQ29uc3VtZXJEYXRhLmNsYXNzKTsKKwkJaWYgKGdldE5vZGUuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXROb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRXJyb3IgcmV0dXJuZWQgYWZ0ZXIgZ2V0IENvbnN1bWVyIERhdGEgbm9kZSAiICsgY29uc3VtZXJOYW1lICsgIi4gc3RhdHVzIHJldHVybmVkIGlzICIgKyBzdGF0dXMpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCUNvbnN1bWVyRGF0YSBjb25zdW1lckRhdGEgPSBnZXROb2RlLmxlZnQoKS52YWx1ZSgpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29uc3VtZXJEYXRhKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENvbnN1bWVyRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlQ3JlZGVudGlhbHMoQ29uc3VtZXJEYXRhIGNvbnN1bWVyRGF0YSkgeworCQlyZXR1cm4gY3JlYXRlQ3JlZGVudGlhbHMoY29uc3VtZXJEYXRhLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUNyZWRlbnRpYWxzKENvbnN1bWVyRGF0YSBjb25zdW1lckRhdGEsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8Q29uc3VtZXJEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJjcmVhdGluZyBDcmVkZW50aWFscyBmb3I6IHt9LiIsIGNvbnN1bWVyRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCUVpdGhlcjxDb25zdW1lckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoY29uc3VtZXJEYXRhLCBDb25zdW1lckRhdGEuY2xhc3MpOworCQkJaWYgKGNyZWF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJFcnJvciByZXR1cm5lZCBhZnRlciBjcmVhdGluZyBDb25zdW1lciBEYXRhIG5vZGUgIiArIGNvbnN1bWVyRGF0YS5nZXRVbmlxdWVJZCgpICsgIi4gc3RhdHVzIHJldHVybmVkIGlzICIgKyBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlDb25zdW1lckRhdGEgY3JlYXRlZENvbnN1bWVyRGF0YSA9IGNyZWF0ZU5vZGUubGVmdCgpLnZhbHVlKCk7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjcmVhdGVkQ29uc3VtZXJEYXRhKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQloYW5kbGVUcmFuc2FjdGlvbihpblRyYW5zYWN0aW9uLCByZXN1bHQpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNyZWRlbnRpYWxzKFN0cmluZyBjb25zdW1lck5hbWUpIHsKKwkJcmV0dXJuIGRlbGV0ZUNyZWRlbnRpYWxzKGNvbnN1bWVyTmFtZSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29uc3VtZXJEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDcmVkZW50aWFscyhTdHJpbmcgY29uc3VtZXJOYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPENvbnN1bWVyRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWxvZy5kZWJ1ZygiZGVsZXRlIENyZWRlbnRpYWxzIGZvcjoge30iLCBjb25zdW1lck5hbWUpOworCQkJRWl0aGVyPENvbnN1bWVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlNVTUVSX05BTUUuZ2V0UHJvcGVydHkoKSwgY29uc3VtZXJOYW1lLCBDb25zdW1lckRhdGEuY2xhc3MpOworCQkJaWYgKGRlbGV0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJFcnJvciByZXR1cm5lZCBhZnRlciBkZWxldGUgQ29uc3VtZXIgRGF0YSBub2RlIHt9LiBTdGF0dXMgcmV0dXJuZWQgaXMge30iLCBjb25zdW1lck5hbWUsIHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJQ29uc3VtZXJEYXRhIGRlbGV0ZWRDb25zdW1lckRhdGEgPSBkZWxldGVOb2RlLmxlZnQoKS52YWx1ZSgpOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZGVsZXRlZENvbnN1bWVyRGF0YSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaGFuZGxlVHJhbnNhY3Rpb24oaW5UcmFuc2FjdGlvbiwgcmVzdWx0KTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb25zdW1lckRhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNyZWRlbnRpYWxzKENvbnN1bWVyRGF0YSBjb25zdW1lckRhdGEpIHsKKwkJcmV0dXJuIHVwZGF0ZUNyZWRlbnRpYWxzKGNvbnN1bWVyRGF0YSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29uc3VtZXJEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVDcmVkZW50aWFscyhDb25zdW1lckRhdGEgY29uc3VtZXJEYXRhLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8Q29uc3VtZXJEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGUgQ3JlZGVudGlhbHMgZm9yOiB7fS4iLCBjb25zdW1lckRhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQlFaXRoZXI8Q29uc3VtZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKGNvbnN1bWVyRGF0YSwgQ29uc3VtZXJEYXRhLmNsYXNzKTsKKwkJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRXJyb3IgcmV0dXJuZWQgYWZ0ZXIgZGVsZXRlIENvbnN1bWVyIERhdGEgbm9kZSB7fS4gU3RhdHVzIHJldHVybmVkIGlzIHt9IiwgY29uc3VtZXJEYXRhLmdldFVuaXF1ZUlkKCksIHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUNvbnN1bWVyRGF0YSB1cGRhdGVkQ29uc3VtZXJEYXRhID0gdXBkYXRlTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZWRDb25zdW1lckRhdGEpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWhhbmRsZVRyYW5zYWN0aW9uKGluVHJhbnNhY3Rpb24sIHJlc3VsdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlVHJhbnNhY3Rpb24oYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBFaXRoZXI8Q29uc3VtZXJEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQpIHsKKwkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Dc2FyT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NzYXJPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDIwY2UwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Dc2FyT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuV2lsZGNhcmRGaWxlRmlsdGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5aaXBVdGlsOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQoImNzYXItb3BlcmF0aW9uIikKK3B1YmxpYyBjbGFzcyBDc2FyT3BlcmF0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDc2FyT3BlcmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgT25ib2FyZGluZ0NsaWVudCBvbmJvYXJkaW5nQ2xpZW50OworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisJCUNzYXJPcGVyYXRpb24gY3Nhck9wZXJhdGlvbiA9IG5ldyBDc2FyT3BlcmF0aW9uKCk7CisJCWNzYXJPcGVyYXRpb24uaW5pdCgpOworCisJCVN0cmluZyBjc2FyVXVpZCA9ICI3MDAyNUNGNjA4MUI0ODlDQTdCMUNCQTU4M0Q1Mjc4RCI7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBieXRlW10+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjc2FyID0gY3Nhck9wZXJhdGlvbi5nZXRDc2FyKGNzYXJVdWlkLCBudWxsKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGNzYXIubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCisJfQorCisJLy8gTW9jayByZXR1cm5pbmcgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtIHVudGlsIHdlIGhhdmUgQVBJIGZyb20gb25ib2FyZGluZworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgYnl0ZVtdPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TW9ja0NzYXIoU3RyaW5nIGNzYXJVdWlkKSB7CisJCUZpbGUgZGlyID0gbmV3IEZpbGUoIi92YXIvdG1wL21vY2tDc2FyIik7CisJCUZpbGVGaWx0ZXIgZmlsZUZpbHRlciA9IG5ldyBXaWxkY2FyZEZpbGVGaWx0ZXIoIiouY3NhciIpOworCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKGZpbGVGaWx0ZXIpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQlGaWxlIGNzYXIgPSBmaWxlc1tpXTsKKwkJCWlmIChjc2FyLmdldE5hbWUoKS5zdGFydHNXaXRoKGNzYXJVdWlkKSkgeworCQkJCWxvZy5kZWJ1ZygiRm91bmQgQ1NBUiBmaWxlIHt9IG1hdGNoaW5nIHRoZSBwYXNzZWQgY3NhclV1aWQge30iLCBjc2FyLmdldEFic29sdXRlUGF0aCgpLCBjc2FyVXVpZCk7CisJCQkJYnl0ZVtdIGRhdGE7CisJCQkJdHJ5IHsKKwkJCQkJZGF0YSA9IEZpbGVzLnJlYWRBbGxCeXRlcyhjc2FyLnRvUGF0aCgpKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy5kZWJ1ZygiRXJyb3IgcmVhZGluZyBtb2NrIGZpbGUgZm9yIENTQVIsIGVycm9yOiB7fSIsIGUpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQl9CisJCQkJTWFwPFN0cmluZywgYnl0ZVtdPiByZWFkWmlwID0gWmlwVXRpbC5yZWFkWmlwKGRhdGEpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZWFkWmlwKTsKKwkJCX0KKwkJfQorCQlsb2cuZGVidWcoIkNvdWxkbid0IGZpbmQgbW9jayBmaWxlIGZvciBDU0FSIHN0YXJ0aW5nIHdpdGgge30iLCBjc2FyVXVpZCk7CisJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5DU0FSX05PVF9GT1VORCk7CisJfQorCisJLyoqCisJICogZ2V0IGNzYXIgZnJvbSByZW1vdGUgcmVwb3NpdG9yeQorCSAqIAorCSAqIEBwYXJhbSBjc2FyVXVpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIGJ5dGVbXT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENzYXIoU3RyaW5nIGNzYXJVdWlkLCBVc2VyIHVzZXIpIHsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgYnl0ZVtdPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gb25ib2FyZGluZ0NsaWVudC5nZXRDc2FyKGNzYXJVdWlkLAorCQkJCXVzZXIuZ2V0VXNlcklkKCkpOworCisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkNhbm5vdCBmaW5kIGNzYXIge30uIFN0YXR1cyByZXR1cm5lZCBpcyB7fSIsIGNzYXJVdWlkLCByZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfSBlbHNlIHsKKwkJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gdmFsdWVzID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgZmlsZXMgYXJlIHt9IiwgdmFsdWVzLmtleVNldCgpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIE9uYm9hcmRpbmdDbGllbnQgZ2V0T25ib2FyZGluZ0NsaWVudCgpIHsKKwkJcmV0dXJuIG9uYm9hcmRpbmdDbGllbnQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0Rhb1N0YXR1c0NvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9EYW9TdGF0dXNDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg3YzViCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9EYW9TdGF0dXNDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuUmVzb3VyY2VVcGxvYWRTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmNhc3NhbmRyYS5DYXNzYW5kcmFPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBEYW9TdGF0dXNDb252ZXJ0ZXIgeworCisJcHVibGljIHN0YXRpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhblN0YXR1cykgeworCisJCWlmICh0aXRhblN0YXR1cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQl9CisKKwkJc3dpdGNoICh0aXRhblN0YXR1cykgeworCisJCWNhc2UgT0s6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKworCQljYXNlIE5PVF9DT05ORUNURUQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5DT05ORUNUSU9OX0ZBSUxVUkU7CisKKwkJY2FzZSBOT1RfRk9VTkQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQ7CisKKwkJY2FzZSBOT1RfQ1JFQVRFRDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlNDSEVNQV9FUlJPUjsKKworCQljYXNlIElOREVYX0NBTk5PVF9CRV9DSEFOR0VEOgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuU0NIRU1BX0VSUk9SOworCisJCWNhc2UgTUlTU0lOR19VTklRVUVfSUQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVDsKKwkJY2FzZSBBTFJFQURZX0xPQ0tFRDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkZBSUxFRF9UT19MT0NLX0VMRU1FTlQ7CisKKwkJY2FzZSBUSVRBTl9TQ0hFTUFfVklPTEFUSU9OOgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuU0NIRU1BX1ZJT0xBVElPTjsKKworCQljYXNlIElOVkFMSURfSUQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQljYXNlIE1BVENIX05PVF9GT1VORDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk1BVENIX05PVF9GT1VORDsKKworCQljYXNlIElMTEVHQUxfQVJHVU1FTlQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVDsKKwkJLy8gY2FzZSBIVFRQX1BST1RPQ09MX0VSUk9SOgorCQkvLyByZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5IVFRQX1BST1RPQ09MX0VSUk9SOworCQkvLyBjYXNlIERCX05PVF9BVkFJTEFCTEU6CisJCS8vIHJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlNUT1JBR0VfTk9UX0FWQUlMQUJMRTsKKwkJLy8gY2FzZSBEQl9SRUFEX09OTFk6CisJCS8vIHJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlJFQURfT05MWV9TVE9SQUdFOworCQkvLyBjYXNlIEJBRF9SRVFVRVNUOgorCQkvLyByZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVDsKKwkJLy8gY2FzZSBMRUdBQ1lfSU5ERVhfRVJST1I6CisJCS8vIHJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlNUT1JBR0VfTEVHQUNZX0lOREVYX0VSUk9SOworCQkvLyBjYXNlIFNDSEVNQV9FUlJPUjoKKwkJLy8gcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuU0NIRU1BX0VSUk9SOworCQkvLyBjYXNlIFRSQU5TQUNUSU9OX0VSUk9SOgorCQkvLyByZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5UUkFOU0FDVElPTl9FUlJPUjsKKwkJLy8gY2FzZSBFWEVDVVRJT05fRkFJTEVEOgorCQkvLyByZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5FWEVVQ1RJT05fRkFJTEVEOworCQljYXNlIEFMUkVBRFlfRVhJU1Q6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5FTlRJVFlfQUxSRUFEWV9FWElTVFM7CisJCWNhc2UgUFJPUEVSVFlfTkFNRV9BTFJFQURZX0VYSVNUUzoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlBST1BFUlRZX05BTUVfQUxSRUFEWV9FWElTVFM7CisJCWNhc2UgSU5WQUxJRF9QUk9QRVJUWToKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFk7CisJCS8vIGNhc2UgV1JPTkdfSU5QVVQ6CisJCS8vIHJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkJBRF9SRVFVRVNUOworCQkvLyBjYXNlIEdFTkVSQUxfRVJST1I6CisJCS8vIHJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCS8vIGNhc2UgTk9UX1NVUFBPUlRFRDoKKwkJLy8gcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjb252ZXJ0UnNyY1VwbG9hZFN0YXR1c1RvU3RvcmFnZVN0YXR1cygKKwkJCVJlc291cmNlVXBsb2FkU3RhdHVzIHJlc291cmNlVXBsb2FkU3RhdHVzKSB7CisJCWlmIChyZXNvdXJjZVVwbG9hZFN0YXR1cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQl9CisJCXN3aXRjaCAocmVzb3VyY2VVcGxvYWRTdGF0dXMpIHsKKwkJY2FzZSBPSzoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQljYXNlIEFMUkVBRFlfRVhJU1Q6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5FTlRJVFlfQUxSRUFEWV9FWElTVFM7CisJCWNhc2UgTk9UX0VYSVNUOgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5EOworCQljYXNlIFNFUlZJQ0VfTk9UX0VYSVNUOgorCQljYXNlIENPTVBPTkVOVF9OT1RfRVhJU1Q6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQ7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNvbnZlcnRDYXNzYW5kcmFTdGF0dXNUb1N0b3JhZ2VTdGF0dXMoQ2Fzc2FuZHJhT3BlcmF0aW9uU3RhdHVzIHN0YXR1cykgeworCQlpZiAoc3RhdHVzID09IG51bGwpIHsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBPSzoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQljYXNlIENMVVNURVJfTk9UX0NPTk5FQ1RFRDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkNPTk5FQ1RJT05fRkFJTFVSRTsKKwkJY2FzZSBLRVlTUEFDRV9OT1RfQ09OTkVDVEVEOgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuU1RPUkFHRV9OT1RfQVZBSUxBQkxFOworCQljYXNlIE5PVF9GT1VORDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORDsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvRWxlbWVudE9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9FbGVtZW50T3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4YTFkMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvRWxlbWVudE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY2F0ZWdvcnkuQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY2F0ZWdvcnkuR3JvdXBpbmdEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eVNjb3BlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlRhZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuR3JvdXBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlRhZ0RhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5Lkdyb3VwaW5nRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeS5TdWJDYXRlZ29yeURhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoOworLy9pbXBvcnQgY29tLnRpbmtlcnBvcC5ibHVlcHJpbnRzLlZlcnRleDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImVsZW1lbnQtb3BlcmF0aW9uIikKK3B1YmxpYyBjbGFzcyBFbGVtZW50T3BlcmF0aW9uIGltcGxlbWVudHMgSUVsZW1lbnRPcGVyYXRpb24geworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlwdWJsaWMgRWxlbWVudE9wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRWxlbWVudE9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJLyoKKwkgKiBPbGQgZmxvdworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGdldEFsbFNlcnZpY2VDYXRlZ29yaWVzKCkgeworCQlyZXR1cm4gZ2V0QWxsQ2F0ZWdvcmllcyhOb2RlVHlwZUVudW0uU2VydmljZU5ld0NhdGVnb3J5LCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4sIEFjdGlvblN0YXR1cz4gZ2V0QWxsUmVzb3VyY2VDYXRlZ29yaWVzKCkgeworCQlyZXR1cm4gZ2V0QWxsQ2F0ZWdvcmllcyhOb2RlVHlwZUVudW0uUmVzb3VyY2VOZXdDYXRlZ29yeSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGdldEFsbFByb2R1Y3RDYXRlZ29yaWVzKCkgeworCQlyZXR1cm4gZ2V0QWxsQ2F0ZWdvcmllcyhOb2RlVHlwZUVudW0uUHJvZHVjdENhdGVnb3J5LCBmYWxzZSk7CisJfQorCS8qCisJICogCisJICovCisKKwkvKgorCSAqIE5ldyBmbG93CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlQ2F0ZWdvcnkoQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5LCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKwkJcmV0dXJuIGNyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5LCBub2RlVHlwZSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGNyZWF0ZUNhdGVnb3J5KENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJY2F0ZWdvcnkuc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2F0ZWdvcnlVaWQoY2F0ZWdvcnkuZ2V0Tm9ybWFsaXplZE5hbWUoKSwgbm9kZVR5cGUpKTsKKwkJQ2F0ZWdvcnlEYXRhIGNhdGVnb3J5RGF0YSA9IG5ldyBDYXRlZ29yeURhdGEobm9kZVR5cGUsIGNhdGVnb3J5KTsKKworCQl0cnkgeworCQkJRWl0aGVyPENhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShjYXRlZ29yeURhdGEsCisJCQkJCUNhdGVnb3J5RGF0YS5jbGFzcyk7CisJCQlpZiAoY3JlYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB2YWx1ZSA9IGNyZWF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCUFjdGlvblN0YXR1cyBhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgY3JlYXRpbmcgY2F0ZWdvcnksIHJlYXNvbiB7fSIsIHZhbHVlKTsKKwkJCQlpZiAodmFsdWUgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuVElUQU5fU0NIRU1BX1ZJT0xBVElPTikgeworCQkJCQlhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX0FMUkVBRFlfRVhJU1RTOworCQkJCX0KKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoYWN0aW9uU3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNyZWF0ZWQgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKGNyZWF0ZU5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNyZWF0ZWQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5pc0xlZnQoKSkgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlU3ViQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5SWQsCisJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnksIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCQlyZXR1cm4gY3JlYXRlU3ViQ2F0ZWdvcnkoY2F0ZWdvcnlJZCwgc3ViQ2F0ZWdvcnksIG5vZGVUeXBlLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gY3JlYXRlU3ViQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5SWQsCisJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViQ2F0ZWdvcnksIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQkvLyBjcmVhdGUgZWRnZSBmcm9tIGNhdGVnb3J5IHRvIHN1Yi1jYXRlZ29yeQorCQkJRWl0aGVyPENhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhdGVnb3J5Tm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGNhdGVnb3J5SWQsIENhdGVnb3J5RGF0YS5jbGFzcyk7CisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlpZiAoY2F0ZWdvcnlOb2RlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gY2F0ZWdvcnlOb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgZmV0Y2hpbmcgY2F0ZWdvcnksIHJlYXNvbiB7fSIsIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlpZiAodGl0YW5PcGVyYXRpb25TdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCWFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5EOworCQkJCX0KKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoYWN0aW9uU3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlDYXRlZ29yeURhdGFEZWZpbml0aW9uIGNhdGVnb3J5RGF0YURlZmluaXRpb24gPSBjYXRlZ29yeU5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpOworCQkJc3ViQ2F0ZWdvcnkuc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkU3ViQ2F0ZWdvcnlVaWQoY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLAorCQkJCQlzdWJDYXRlZ29yeS5nZXROb3JtYWxpemVkTmFtZSgpKSk7CisJCQlTdWJDYXRlZ29yeURhdGEgc3ViQ2F0ZWdvcnlEYXRhID0gbmV3IFN1YkNhdGVnb3J5RGF0YShub2RlVHlwZSwgc3ViQ2F0ZWdvcnkpOworCisJCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3ViQ2F0ZWdvcnlOb2RlID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoc3ViQ2F0ZWdvcnlEYXRhLAorCQkJCQlTdWJDYXRlZ29yeURhdGEuY2xhc3MpOworCQkJaWYgKHN1YkNhdGVnb3J5Tm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IHN1YkNhdGVnb3J5Tm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJQcm9ibGVtIHdoaWxlIGNyZWF0aW5nIGNhdGVnb3J5LCByZWFzb24ge30iLCB0aXRhbk9wZXJhdGlvblN0YXR1cyk7CisJCQkJaWYgKHRpdGFuT3BlcmF0aW9uU3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLlRJVEFOX1NDSEVNQV9WSU9MQVRJT04pIHsKKwkJCQkJYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9TVUJfQ0FURUdPUllfRVhJU1RTX0ZPUl9DQVRFR09SWTsKKwkJCQl9CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFjdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbigKKwkJCQkJY2F0ZWdvcnlOb2RlLmxlZnQoKS52YWx1ZSgpLCBzdWJDYXRlZ29yeU5vZGUubGVmdCgpLnZhbHVlKCksIEdyYXBoRWRnZUxhYmVscy5TVUJfQ0FURUdPUlksIG51bGwpOworCQkJaWYgKHJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBjcmVhdGUgcmVsYXRpb24gYmV0d2VlbiBjYXRlZ29yeSBhbmQgc3ViLWNhdGVnb3J5ICIsIHJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFjdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeUNyZWF0ZWQgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKAorCQkJCQlzdWJDYXRlZ29yeU5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHN1YkNhdGVnb3J5Q3JlYXRlZCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluVHJhbnNhY3Rpb24gPT0gZmFsc2UpIHsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEdyb3VwaW5nRGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBjcmVhdGVHcm91cGluZyhTdHJpbmcgc3ViQ2F0ZWdvcnlJZCwgR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nLAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJRWl0aGVyPEdyb3VwaW5nRGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQkvLyBjcmVhdGUgZWRnZSBmcm9tIHN1Yi1jYXRlZ29yeSB0byBncm91cGluZworCQkJRWl0aGVyPFN1YkNhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN1YkNhdGVnb3J5Tm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIHN1YkNhdGVnb3J5SWQsIFN1YkNhdGVnb3J5RGF0YS5jbGFzcyk7CisJCQlBY3Rpb25TdGF0dXMgYWN0aW9uU3RhdHVzID0gQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQlpZiAoc3ViQ2F0ZWdvcnlOb2RlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gc3ViQ2F0ZWdvcnlOb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgZmV0Y2hpbmcgY2F0ZWdvcnksIHJlYXNvbiB7fSIsIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlpZiAodGl0YW5PcGVyYXRpb25TdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuVElUQU5fU0NIRU1BX1ZJT0xBVElPTikgeworCQkJCQlhY3Rpb25TdGF0dXMgPSBBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORDsKKwkJCQl9CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFjdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJU3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiBzdWJDYXREYXRhID0gc3ViQ2F0ZWdvcnlOb2RlLmxlZnQoKS52YWx1ZSgpLmdldFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24oKTsKKwkJCWdyb3VwaW5nLnNldFVuaXF1ZUlkKAorCQkJCQlVbmlxdWVJZEJ1aWxkZXIuYnVpbGRHcm91cGluZ1VpZChzdWJDYXREYXRhLmdldFVuaXF1ZUlkKCksIGdyb3VwaW5nLmdldE5vcm1hbGl6ZWROYW1lKCkpKTsKKwkJCUdyb3VwaW5nRGF0YSBncm91cGluZ0RhdGEgPSBuZXcgR3JvdXBpbmdEYXRhKG5vZGVUeXBlLCBncm91cGluZyk7CisKKwkJCUVpdGhlcjxHcm91cGluZ0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cGluZ05vZGUgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShncm91cGluZ0RhdGEsCisJCQkJCUdyb3VwaW5nRGF0YS5jbGFzcyk7CisJCQlpZiAoZ3JvdXBpbmdOb2RlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gZ3JvdXBpbmdOb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgY3JlYXRpbmcgZ3JvdXBpbmcsIHJlYXNvbiB7fSIsIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlpZiAodGl0YW5PcGVyYXRpb25TdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCWFjdGlvblN0YXR1cyA9IEFjdGlvblN0YXR1cy5DT01QT05FTlRfR1JPVVBJTkdfRVhJU1RTX0ZPUl9TVUJfQ0FURUdPUlk7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChhY3Rpb25TdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oCisJCQkJCXN1YkNhdGVnb3J5Tm9kZS5sZWZ0KCkudmFsdWUoKSwgZ3JvdXBpbmdOb2RlLmxlZnQoKS52YWx1ZSgpLCBHcmFwaEVkZ2VMYWJlbHMuR1JPVVBJTkcsIG51bGwpOworCQkJaWYgKHJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBjcmVhdGUgcmVsYXRpb24gYmV0d2VlbiBzdWItY2F0ZWdvcnkgYW5kIGdyb3VwaW5nIiwgcmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoYWN0aW9uU3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nQ3JlYXRlZCA9IG5ldyBHcm91cGluZ0RlZmluaXRpb24oCisJCQkJCWdyb3VwaW5nTm9kZS5sZWZ0KCkudmFsdWUoKS5nZXRHcm91cGluZ0RhdGFEZWZpbml0aW9uKCkpOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JvdXBpbmdDcmVhdGVkKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfSBlbHNlIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxDYXRlZ29yeURlZmluaXRpb24+LCBBY3Rpb25TdGF0dXM+IGdldEFsbENhdGVnb3JpZXMoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXRyeSB7CisJCQlpZiAobm9kZVR5cGUgIT0gTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnkgJiYgbm9kZVR5cGUgIT0gTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeQorCQkJCQkmJiBub2RlVHlwZSAhPSBOb2RlVHlwZUVudW0uUHJvZHVjdENhdGVnb3J5KSB7CisJCQkJbG9nLmRlYnVnKCJVbmtub3duIGNhdGVnb3J5IHR5cGUge30iLCBub2RlVHlwZS5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCisJCQlFaXRoZXI8TGlzdDxvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeS5DYXRlZ29yeURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXRBbGwobm9kZVR5cGUsIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LkNhdGVnb3J5RGF0YS5jbGFzcyk7CisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSAmJiAoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQkJbG9nLmRlYnVnKCJQcm9ibGVtIHdoaWxlIGdldCBhbGwgY2F0ZWdvcmllcy4gcmVhc29uIC0ge30iLCBlaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJCUxpc3Q8Q2F0ZWdvcnlEYXRhPiBjYXRlZ29yeURhdGFMaXN0ID0gZWl0aGVyLmlzTGVmdCgpID8gZWl0aGVyLmxlZnQoKS52YWx1ZSgpIDogbnVsbDsKKwkJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBjYXRlZ29yeUxpc3QgPSBuZXcgQXJyYXlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4oKTsKKwkJCWlmIChjYXRlZ29yeURhdGFMaXN0ICE9IG51bGwpIHsKKwkJCQlmb3IgKENhdGVnb3J5RGF0YSBlbGVtIDogY2F0ZWdvcnlEYXRhTGlzdCkgeworCQkJCQlDYXRlZ29yeURhdGFEZWZpbml0aW9uIGNhdGVnb3J5RGF0YURlZmluaXRpb24gPSBlbGVtLmdldENhdGVnb3J5RGF0YURlZmluaXRpb24oKTsKKworCQkJCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbihjYXRlZ29yeURhdGFEZWZpbml0aW9uKTsKKwkJCQkJU3RyaW5nIGNhdGVnb3J5TmFtZSA9IGNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0TmFtZSgpOworCQkJCQlsb2cudHJhY2UoIkZvdW5kIGNhdGVnb3J5IHt9LCBjYXRlZ29yeSB0eXBlIHt9IiwgY2F0ZWdvcnlOYW1lLCBub2RlVHlwZSk7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldFN1YkNhdGVnb3JpZXMgPSBzZXRTdWJDYXRlZ29yaWVzKG5vZGVUeXBlLCBjYXRlZ29yeURlZmluaXRpb24pOworCQkJCQlpZiAoc2V0U3ViQ2F0ZWdvcmllcyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gc2V0IHN1Yi1jYXRlZ29yaWVzIGZvciBjYXRlZ29yeSB7fSwgY2F0ZWdvcnkgdHlwZSB7fSwgZXJyb3Ige30iLAorCQkJCQkJCQljYXRlZ29yeU5hbWUsIG5vZGVUeXBlLCBzZXRTdWJDYXRlZ29yaWVzKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCQl9CisJCQkJCWNhdGVnb3J5TGlzdC5hZGQoY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2F0ZWdvcnlMaXN0KTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmICghaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0U3ViQ2F0ZWdvcmllcyhOb2RlVHlwZUVudW0gcGFyZW50Tm9kZVR5cGUsIENhdGVnb3J5RGVmaW5pdGlvbiBwYXJlbnRDYXRlZ29yeSkgeworCQlOb2RlVHlwZUVudW0gY2hpbGROb2RlVHlwZSA9IGdldENoaWxkTm9kZVR5cGUocGFyZW50Tm9kZVR5cGUpOworCQlpZiAoY2hpbGROb2RlVHlwZSAhPSBudWxsKSB7CisJCQlTdHJpbmcgY2F0ZWdvcnlOYW1lID0gcGFyZW50Q2F0ZWdvcnkuZ2V0TmFtZSgpOworCQkJbG9nLnRyYWNlKCJHZXR0aW5nIHN1Yi1jYXRlZ29yaWVzIGZvciBjYXRlZ29yeSB7fSwgY2F0ZWdvcnkgdHlwZSB7fSIsIGNhdGVnb3J5TmFtZSwgcGFyZW50Tm9kZVR5cGUpOworCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShwYXJlbnROb2RlVHlwZSksIHBhcmVudENhdGVnb3J5LmdldFVuaXF1ZUlkKCksCisJCQkJCQkJR3JhcGhFZGdlTGFiZWxzLlNVQl9DQVRFR09SWSwgY2hpbGROb2RlVHlwZSwgU3ViQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJCWlmIChwYXJlbnROb2RlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gcGFyZW50Tm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHRpdGFuT3BlcmF0aW9uU3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlsb2cudHJhY2UoIkRpZG4ndCBmaW5kIHN1YmNhdGVnb3JpZXMgZm9yIGNhdGVnb3J5IHt9LCBjYXRlZ29yeSB0eXBlIHt9IiwgY2F0ZWdvcnlOYW1lLAorCQkJCQkJCXBhcmVudE5vZGVUeXBlKTsKKwkJCQkJdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCQl9CisJCQkJcmV0dXJuIHRpdGFuT3BlcmF0aW9uU3RhdHVzOworCQkJfQorCQkJTGlzdDxJbW11dGFibGVQYWlyPFN1YkNhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPj4gc3Vic0NhdGVnb3JpZXNEYXRhID0gcGFyZW50Tm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uPiBzdWJDYXRlZ29yaWVzRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4gc3ViQ2F0UGFpciA6IHN1YnNDYXRlZ29yaWVzRGF0YSkgeworCQkJCVN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gc3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiA9IHN1YkNhdFBhaXIuZ2V0TGVmdCgpCisJCQkJCQkuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpOworCQkJCVN1YkNhdGVnb3J5RGVmaW5pdGlvbiBzdWJDYXRlZ29yeURlZmluaXRpb24gPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24pOworCisJCQkJbG9nLnRyYWNlKCJGb3VuZCBzdWItY2F0ZWdvcnkge30gZm9yIGNhdGVnb3J5IHt9LCBjYXRlZ29yeSB0eXBlIHt9IiwKKwkJCQkJCXN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24uZ2V0TmFtZSgpLCBjYXRlZ29yeU5hbWUsIHBhcmVudE5vZGVUeXBlKTsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRHcm91cGluZ3MgPSBzZXRHcm91cGluZ3MoY2hpbGROb2RlVHlwZSwgc3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJCQlpZiAoc2V0R3JvdXBpbmdzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHNldCBncm91cGluZ3MgZm9yIHN1Yi1jYXRlZ29yeSB7fSwgc3ViLWNhdGVnb3J5IHR5cGUge30sIGVycm9yIHt9IiwKKwkJCQkJCQlzdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uLmdldE5hbWUoKSwgY2hpbGROb2RlVHlwZSwgc2V0R3JvdXBpbmdzKTsKKwkJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCQkJfQorCQkJCXN1YkNhdGVnb3JpZXNEZWZpbml0aW9ucy5hZGQoc3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJCX0KKwkJCXBhcmVudENhdGVnb3J5LnNldFN1YmNhdGVnb3JpZXMoc3ViQ2F0ZWdvcmllc0RlZmluaXRpb25zKTsKKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRHcm91cGluZ3MoTm9kZVR5cGVFbnVtIHBhcmVudE5vZGVUeXBlLCBTdWJDYXRlZ29yeURlZmluaXRpb24gcGFyZW50U3ViQ2F0ZWdvcnkpIHsKKwkJTm9kZVR5cGVFbnVtIGNoaWxkTm9kZVR5cGUgPSBnZXRDaGlsZE5vZGVUeXBlKHBhcmVudE5vZGVUeXBlKTsKKwkJaWYgKGNoaWxkTm9kZVR5cGUgIT0gbnVsbCkgeworCQkJU3RyaW5nIHN1YkNhdGVnb3J5TmFtZSA9IHBhcmVudFN1YkNhdGVnb3J5LmdldE5hbWUoKTsKKwkJCWxvZy50cmFjZSgiR2V0dGluZyBncm91cGluZ3MgZm9yIHN1YmNhdGVnb3J5IHt9LCBzdWJjYXRlZ29yeSB0eXBlIHt9Iiwgc3ViQ2F0ZWdvcnlOYW1lLCBwYXJlbnROb2RlVHlwZSk7CisJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEdyb3VwaW5nRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKHBhcmVudE5vZGVUeXBlKSwgcGFyZW50U3ViQ2F0ZWdvcnkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuR1JPVVBJTkcsIGNoaWxkTm9kZVR5cGUsIEdyb3VwaW5nRGF0YS5jbGFzcyk7CisJCQlpZiAocGFyZW50Tm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IHBhcmVudE5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmICh0aXRhbk9wZXJhdGlvblN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJbG9nLnRyYWNlKCJEaWRuJ3QgZmluZCBncm91cGluZ3MgZm9yIHN1YmNhdGVnb3J5IHt9LCBzdWJjYXRlZ29yeSB0eXBlIHt9Iiwgc3ViQ2F0ZWdvcnlOYW1lLAorCQkJCQkJCXBhcmVudE5vZGVUeXBlKTsKKwkJCQkJdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCQl9CisJCQkJcmV0dXJuIHRpdGFuT3BlcmF0aW9uU3RhdHVzOworCQkJfQorCQkJTGlzdDxJbW11dGFibGVQYWlyPEdyb3VwaW5nRGF0YSwgR3JhcGhFZGdlPj4gZ3JvdXBpbmdEYXRhID0gcGFyZW50Tm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8R3JvdXBpbmdEZWZpbml0aW9uPiBncm91cGluZ0RlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8R3JvdXBpbmdEYXRhLCBHcmFwaEVkZ2U+IGdyb3VwUGFpciA6IGdyb3VwaW5nRGF0YSkgeworCQkJCUdyb3VwaW5nRGF0YURlZmluaXRpb24gZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbiA9IGdyb3VwUGFpci5nZXRMZWZ0KCkuZ2V0R3JvdXBpbmdEYXRhRGVmaW5pdGlvbigpOworCQkJCWxvZy50cmFjZSgiRm91bmQgZ3JvdXBpbmcge30gZm9yIHN1Yi1jYXRlZ29yeSB7fSwgc3ViLWNhdGVnb3J5IHR5cGUge30iLAorCQkJCQkJZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbi5nZXROYW1lKCksIHN1YkNhdGVnb3J5TmFtZSwgcGFyZW50Tm9kZVR5cGUpOworCQkJCWdyb3VwaW5nRGVmaW5pdGlvbnMuYWRkKG5ldyBHcm91cGluZ0RlZmluaXRpb24oZ3JvdXBpbmdEYXRhRGVmaW5pdGlvbikpOworCQkJfQorCQkJcGFyZW50U3ViQ2F0ZWdvcnkuc2V0R3JvdXBpbmdzKGdyb3VwaW5nRGVmaW5pdGlvbnMpOworCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBOb2RlVHlwZUVudW0gZ2V0Q2hpbGROb2RlVHlwZShOb2RlVHlwZUVudW0gcGFyZW50VHlwZUVudW0pIHsKKwkJTm9kZVR5cGVFbnVtIHJlcyA9IG51bGw7CisJCXN3aXRjaCAocGFyZW50VHlwZUVudW0pIHsKKwkJY2FzZSBSZXNvdXJjZU5ld0NhdGVnb3J5OgorCQkJcmVzID0gTm9kZVR5cGVFbnVtLlJlc291cmNlU3ViY2F0ZWdvcnk7CisJCQlicmVhazsKKwkJY2FzZSBQcm9kdWN0Q2F0ZWdvcnk6CisJCQlyZXMgPSBOb2RlVHlwZUVudW0uUHJvZHVjdFN1YmNhdGVnb3J5OworCQkJYnJlYWs7CisJCWNhc2UgUHJvZHVjdFN1YmNhdGVnb3J5OgorCQkJcmVzID0gTm9kZVR5cGVFbnVtLlByb2R1Y3RHcm91cGluZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBnZXRDYXRlZ29yeShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBjYXRlZ29yeUlkKSB7CisJCXRyeSB7CisJCQlpZiAobm9kZVR5cGUgIT0gTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnkgJiYgbm9kZVR5cGUgIT0gTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeQorCQkJCQkmJiBub2RlVHlwZSAhPSBOb2RlVHlwZUVudW0uUHJvZHVjdENhdGVnb3J5KSB7CisJCQkJbG9nLmRlYnVnKCJVbmtub3duIGNhdGVnb3J5IHR5cGUge30iLCBub2RlVHlwZS5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCisJCQlFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2F0ZWdvcnlEYXRhRWl0aGVyID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgY2F0ZWdvcnlJZCwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJCWlmIChjYXRlZ29yeURhdGFFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBjYXRlZ29yeURhdGFFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBnZXQgY2F0ZWdvcnkgYnkgaWQge30uIHJlYXNvbiB7fSIsIGNhdGVnb3J5SWQsIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlpZiAodGl0YW5PcGVyYXRpb25TdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkNPTVBPTkVOVF9DQVRFR09SWV9OT1RfRk9VTkQpOworCQkJCX0KKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJCUNhdGVnb3J5RGF0YURlZmluaXRpb24gY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiA9IGNhdGVnb3J5RGF0YUVpdGhlci5sZWZ0KCkudmFsdWUoKQorCQkJCQkuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ldyBDYXRlZ29yeURlZmluaXRpb24oY2F0ZWdvcnlEYXRhRGVmaW5pdGlvbikpOworCQl9IGZpbmFsbHkgeworCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gZ2V0U3ViQ2F0ZWdvcnkoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgc3ViQ2F0ZWdvcnlJZCkgeworCQl0cnkgeworCQkJaWYgKG5vZGVUeXBlICE9IE5vZGVUeXBlRW51bS5SZXNvdXJjZVN1YmNhdGVnb3J5ICYmIG5vZGVUeXBlICE9IE5vZGVUeXBlRW51bS5Qcm9kdWN0U3ViY2F0ZWdvcnkpIHsKKwkJCQlsb2cuZGVidWcoIlVua25vd24gc3ViLWNhdGVnb3J5IHR5cGUge30iLCBub2RlVHlwZS5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCisJCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3ViQ2F0ZWdvcnlEYXRhRWl0aGVyID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgc3ViQ2F0ZWdvcnlJZCwgU3ViQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJCWlmIChzdWJDYXRlZ29yeURhdGFFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBzdWJDYXRlZ29yeURhdGFFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBnZXQgc3ViLWNhdGVnb3J5IGJ5IGlkIHt9LiByZWFzb24ge30iLCBzdWJDYXRlZ29yeUlkLCB0aXRhbk9wZXJhdGlvblN0YXR1cyk7CisJCQkJaWYgKHRpdGFuT3BlcmF0aW9uU3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5DT01QT05FTlRfQ0FURUdPUllfTk9UX0ZPVU5EKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisJCQlTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gPSBzdWJDYXRlZ29yeURhdGFFaXRoZXIubGVmdCgpLnZhbHVlKCkKKwkJCQkJLmdldFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24oKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKHN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24pKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGRlbGV0ZUNhdGVnb3J5KE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIGNhdGVnb3J5SWQpIHsKKwkJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJaWYgKG5vZGVUeXBlICE9IE5vZGVUeXBlRW51bS5SZXNvdXJjZU5ld0NhdGVnb3J5ICYmIG5vZGVUeXBlICE9IE5vZGVUeXBlRW51bS5TZXJ2aWNlTmV3Q2F0ZWdvcnkKKwkJCQkJJiYgbm9kZVR5cGUgIT0gTm9kZVR5cGVFbnVtLlByb2R1Y3RDYXRlZ29yeSkgeworCQkJCWxvZy5kZWJ1ZygiVW5rbm93biBjYXRlZ29yeSB0eXBlIHt9Iiwgbm9kZVR5cGUubmFtZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2F0ZWdvcnlEYXRhRWl0aGVyID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgY2F0ZWdvcnlJZCwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJCWlmIChjYXRlZ29yeURhdGFFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgIGNhdGVnb3J5IGZvciBpZCB7fSAiLCBjYXRlZ29yeUlkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGggPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJCWlmIChncmFwaC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZldGNoIHRpdGFuIGdyYXBoIik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlUaXRhbkdyYXBoIHRHcmFwaCA9IGdyYXBoLmxlZnQoKS52YWx1ZSgpOworCisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXNBcnRpZmFjdCA9IHRHcmFwaC5xdWVyeSgpCisJCQkJCS5oYXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBjYXRlZ29yeUlkKS52ZXJ0aWNlcygpOworCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXNBcnRpZmFjdC5pdGVyYXRvcigpOworCQkJaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlsb2cuZGVidWcoIk5vIGNhdGVnb3J5IG5vZGUgZm9yIGlkID0ge30iLCBjYXRlZ29yeUlkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlWZXJ0ZXggYXJ0aWZhY3RWID0gaXRlcmF0b3IubmV4dCgpOworCQkJYXJ0aWZhY3RWLnJlbW92ZSgpOworCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIGRlbGV0ZWQgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKAorCQkJCQljYXRlZ29yeURhdGFFaXRoZXIubGVmdCgpLnZhbHVlKCkuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGRlbGV0ZWQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxTdWJDYXRlZ29yeURlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gZGVsZXRlU3ViQ2F0ZWdvcnkoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgc3ViQ2F0ZWdvcnlJZCkgeworCQlFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAobm9kZVR5cGUgIT0gTm9kZVR5cGVFbnVtLlJlc291cmNlU3ViY2F0ZWdvcnkgJiYgbm9kZVR5cGUgIT0gTm9kZVR5cGVFbnVtLlByb2R1Y3RTdWJjYXRlZ29yeSkgeworCQkJCWxvZy5kZWJ1ZygiVW5rbm93biBzdWItY2F0ZWdvcnkgdHlwZSB7fSIsIG5vZGVUeXBlLm5hbWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJRWl0aGVyPFN1YkNhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN1YkNhdGVnb3J5RGF0YUVpdGhlciA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIHN1YkNhdGVnb3J5SWQsIFN1YkNhdGVnb3J5RGF0YS5jbGFzcyk7CisJCQlpZiAoc3ViQ2F0ZWdvcnlEYXRhRWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlICBzdWItY2F0ZWdvcnkgZm9yIGlkIHt9Iiwgc3ViQ2F0ZWdvcnlJZCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCB0aXRhbiBncmFwaCIpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVGl0YW5HcmFwaCB0R3JhcGggPSBncmFwaC5sZWZ0KCkudmFsdWUoKTsKKworCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzQXJ0aWZhY3QgPSB0R3JhcGgucXVlcnkoKQorCQkJCQkuaGFzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgc3ViQ2F0ZWdvcnlJZCkudmVydGljZXMoKTsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzQXJ0aWZhY3QuaXRlcmF0b3IoKTsKKwkJCWlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJbG9nLmRlYnVnKCJObyBzdWItY2F0ZWdvcnkgbm9kZSBmb3IgaWQge30iLCBzdWJDYXRlZ29yeUlkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlWZXJ0ZXggYXJ0aWZhY3RWID0gaXRlcmF0b3IubmV4dCgpOworCQkJYXJ0aWZhY3RWLnJlbW92ZSgpOworCQkJOworCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIGRlbGV0ZWQgPSBuZXcgU3ViQ2F0ZWdvcnlEZWZpbml0aW9uKAorCQkJCQlzdWJDYXRlZ29yeURhdGFFaXRoZXIubGVmdCgpLnZhbHVlKCkuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGRlbGV0ZWQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9IGVsc2UgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEdyb3VwaW5nRGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiBkZWxldGVHcm91cGluZyhOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyBncm91cGluZ0lkKSB7CisJCUVpdGhlcjxHcm91cGluZ0RlZmluaXRpb24sIEFjdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmIChub2RlVHlwZSAhPSBOb2RlVHlwZUVudW0uUHJvZHVjdEdyb3VwaW5nKSB7CisJCQkJbG9nLmRlYnVnKCJVbmtub3duIGdyb3VwaW5nIHR5cGUge30iLCBub2RlVHlwZS5uYW1lKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCUVpdGhlcjxHcm91cGluZ0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cGluZ0RhdGFFaXRoZXIgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBncm91cGluZ0lkLCBHcm91cGluZ0RhdGEuY2xhc3MpOworCQkJaWYgKGdyb3VwaW5nRGF0YUVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSAgZ3JvdXBpbmcgZm9yIGlkIHt9IiwgZ3JvdXBpbmdJZCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGguaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCB0aXRhbiBncmFwaCIpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVGl0YW5HcmFwaCB0R3JhcGggPSBncmFwaC5sZWZ0KCkudmFsdWUoKTsKKworCQkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzQXJ0aWZhY3QgPSB0R3JhcGgucXVlcnkoKQorCQkJCQkuaGFzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgZ3JvdXBpbmdJZCkudmVydGljZXMoKTsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzQXJ0aWZhY3QuaXRlcmF0b3IoKTsKKwkJCWlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJbG9nLmRlYnVnKCJObyBncm91cGluZyBub2RlIGZvciBpZCB7fSIsIGdyb3VwaW5nSWQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVZlcnRleCBhcnRpZmFjdFYgPSBpdGVyYXRvci5uZXh0KCk7CisJCQlhcnRpZmFjdFYucmVtb3ZlKCk7CisJCQk7CisJCQlHcm91cGluZ0RlZmluaXRpb24gZGVsZXRlZCA9IG5ldyBHcm91cGluZ0RlZmluaXRpb24oCisJCQkJCWdyb3VwaW5nRGF0YUVpdGhlci5sZWZ0KCkudmFsdWUoKS5nZXRHcm91cGluZ0RhdGFEZWZpbml0aW9uKCkpOworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZGVsZXRlZCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5pc0xlZnQoKSkgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0gZWxzZSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIEFjdGlvblN0YXR1cz4gaXNDYXRlZ29yeVVuaXF1ZUZvclR5cGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgbm9ybWFsaXplZE5hbWUpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BlcnRpZXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLmdldFByb3BlcnR5KCksIG5vcm1hbGl6ZWROYW1lKTsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxMaXN0PENhdGVnb3J5RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXRlZ29yeUVpdGhlciA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKG5vZGVUeXBlLAorCQkJCQlwcm9wZXJ0aWVzLCBDYXRlZ29yeURhdGEuY2xhc3MpOworCQkJaWYgKGNhdGVnb3J5RWl0aGVyLmlzUmlnaHQoKSAmJiBjYXRlZ29yeUVpdGhlci5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGNhdGVnb3JpZXMsIG5vZGVUeXBlIHt9LCBub3JtYWxpemVkTmFtZSB7fSwgZXJyb3Ige30iLCBub2RlVHlwZSwKKwkJCQkJCW5vcm1hbGl6ZWROYW1lLCBjYXRlZ29yeUVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQkJTGlzdDxDYXRlZ29yeURhdGE+IGNhdGVnb3J5TGlzdCA9IChjYXRlZ29yeUVpdGhlci5pc0xlZnQoKSA/IGNhdGVnb3J5RWl0aGVyLmxlZnQoKS52YWx1ZSgpIDogbnVsbCk7CisJCQlpZiAoY2F0ZWdvcnlMaXN0ICE9IG51bGwgJiYgY2F0ZWdvcnlMaXN0LnNpemUoKSA+IDApIHsKKwkJCQlsb2cuZGVidWcoIkZvdW5kIGNhdGVnb3J5IGZvciBub2RlVHlwZSB7fSB3aXRoIG5vcm1hbGl6ZWROYW1lIHt9Iiwgbm9kZVR5cGUsIG5vcm1hbGl6ZWROYW1lKTsKKwkJCQlpZiAoY2F0ZWdvcnlMaXN0LnNpemUoKSA+IDEpIHsKKwkJCQkJbG9nLmRlYnVnKCJGb3VuZCBtb3JlIHRoYW4gMSB1bmlxdWUgY2F0ZWdvcmllcyBmb3Igbm9kZVR5cGUge30gd2l0aCBub3JtYWxpemVkTmFtZSIsIG5vZGVUeXBlLAorCQkJCQkJCW5vcm1hbGl6ZWROYW1lKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIubGVmdChmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiQ2F0ZWdvcnkgZm9yIG5vZGVUeXBlIHt9IHdpdGggbm9ybWFsaXplZE5hbWUge30gZG9lc24ndCBleGlzdCBpbiBncmFwaCIsIG5vZGVUeXBlLAorCQkJCQkJbm9ybWFsaXplZE5hbWUpOworCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgQWN0aW9uU3RhdHVzPiBpc1N1YkNhdGVnb3J5VW5pcXVlRm9yQ2F0ZWdvcnkoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLAorCQkJU3RyaW5nIHN1YkNhdGVnb3J5Tm9ybU5hbWUsIFN0cmluZyBwYXJlbnRDYXRlZ29yeUlkKSB7CisKKwkJU3RyaW5nIHN1YkNhdGVnb3J5SWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRTdWJDYXRlZ29yeVVpZChwYXJlbnRDYXRlZ29yeUlkLCBzdWJDYXRlZ29yeU5vcm1OYW1lKTsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxTdWJDYXRlZ29yeURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzdWJDYXRlZ29yeURhdGFFaXRoZXIgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBzdWJDYXRlZ29yeUlkLCBTdWJDYXRlZ29yeURhdGEuY2xhc3MpOworCQkJaWYgKHN1YkNhdGVnb3J5RGF0YUVpdGhlci5pc1JpZ2h0KCkKKwkJCQkJJiYgc3ViQ2F0ZWdvcnlEYXRhRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgc3ViLWNhdGVnb3J5IHdpdGggaWQge30sIGVycm9yIHt9Iiwgc3ViQ2F0ZWdvcnlJZCwKKwkJCQkJCXN1YkNhdGVnb3J5RGF0YUVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQkJU3ViQ2F0ZWdvcnlEYXRhIHN1YkNhdGVnb3J5RGF0YSA9IChzdWJDYXRlZ29yeURhdGFFaXRoZXIuaXNMZWZ0KCkgPyBzdWJDYXRlZ29yeURhdGFFaXRoZXIubGVmdCgpLnZhbHVlKCkKKwkJCQkJOiBudWxsKTsKKwkJCWlmIChzdWJDYXRlZ29yeURhdGEgIT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiRm91bmQgc3ViLWNhdGVnb3J5IHdpdGggaWQge30iLCBzdWJDYXRlZ29yeUlkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIlN1Yi1jYXRlZ29yeSBmb3IgaWQge30gZG9lc24ndCBleGlzdCBpbiBncmFwaCIsIHN1YkNhdGVnb3J5SWQpOworCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgQWN0aW9uU3RhdHVzPiBpc0dyb3VwaW5nVW5pcXVlRm9yU3ViQ2F0ZWdvcnkoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgZ3JvdXBpbmdOb3JtTmFtZSwKKwkJCVN0cmluZyBwYXJlbnRTdWJDYXRlZ29yeUlkKSB7CisKKwkJU3RyaW5nIGdyb3VwaW5nSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRHcm91cGluZ1VpZChwYXJlbnRTdWJDYXRlZ29yeUlkLCBncm91cGluZ05vcm1OYW1lKTsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxHcm91cGluZ0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cGluZ0RhdGFFaXRoZXIgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCBncm91cGluZ0lkLCBHcm91cGluZ0RhdGEuY2xhc3MpOworCQkJaWYgKGdyb3VwaW5nRGF0YUVpdGhlci5pc1JpZ2h0KCkgJiYgZ3JvdXBpbmdEYXRhRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgZ3JvdXBpbmcgd2l0aCBpZCB7fSwgZXJyb3Ige30iLCBncm91cGluZ0lkLAorCQkJCQkJZ3JvdXBpbmdEYXRhRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisJCQlHcm91cGluZ0RhdGEgZ3JvdXBpbmdEYXRhID0gKGdyb3VwaW5nRGF0YUVpdGhlci5pc0xlZnQoKSA/IGdyb3VwaW5nRGF0YUVpdGhlci5sZWZ0KCkudmFsdWUoKSA6IG51bGwpOworCQkJaWYgKGdyb3VwaW5nRGF0YSAhPSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJGb3VuZCBncm91cGluZyB3aXRoIGlkIHt9IiwgZ3JvdXBpbmdJZCk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJHcm91cGluZyBmb3IgaWQge30gZG9lc24ndCBleGlzdCBpbiBncmFwaCIsIGdyb3VwaW5nSWQpOworCQkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGdldFN1YkNhdGVnb3J5VW5pcXVlRm9yVHlwZShOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRS5nZXRQcm9wZXJ0eSgpLCBub3JtYWxpemVkTmFtZSk7CisJCXRyeSB7CisJCQlFaXRoZXI8TGlzdDxTdWJDYXRlZ29yeURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3ViQ2F0ZWdvcnlFaXRoZXIgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldEJ5Q3JpdGVyaWEobm9kZVR5cGUsIHByb3BlcnRpZXMsIFN1YkNhdGVnb3J5RGF0YS5jbGFzcyk7CisJCQlpZiAoc3ViQ2F0ZWdvcnlFaXRoZXIuaXNSaWdodCgpICYmIHN1YkNhdGVnb3J5RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgc3ViLWNhdGVnb3JpZXMsIG5vZGVUeXBlIHt9LCBub3JtYWxpemVkTmFtZSB7fSwgZXJyb3Ige30iLCBub2RlVHlwZSwKKwkJCQkJCW5vcm1hbGl6ZWROYW1lLCBzdWJDYXRlZ29yeUVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQkJTGlzdDxTdWJDYXRlZ29yeURhdGE+IHN1YkNhdGVnb3J5TGlzdCA9IChzdWJDYXRlZ29yeUVpdGhlci5pc0xlZnQoKSA/IHN1YkNhdGVnb3J5RWl0aGVyLmxlZnQoKS52YWx1ZSgpCisJCQkJCTogbnVsbCk7CisJCQlpZiAoc3ViQ2F0ZWdvcnlMaXN0ICE9IG51bGwgJiYgc3ViQ2F0ZWdvcnlMaXN0LnNpemUoKSA+IDApIHsKKwkJCQlsb2cuZGVidWcoIkZvdW5kIHN1Yi1jYXRlZ29yeSBmb3Igbm9kZVR5cGUge30gd2l0aCBub3JtYWxpemVkTmFtZSB7fSIsIG5vZGVUeXBlLCBub3JtYWxpemVkTmFtZSk7CisJCQkJU3ViQ2F0ZWdvcnlEYXRhIHN1YkNhdGVnb3J5RGF0YSA9IHN1YkNhdGVnb3J5TGlzdC5nZXQoMCk7CisJCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBTdWJDYXRlZ29yeURlZmluaXRpb24oCisJCQkJCQlzdWJDYXRlZ29yeURhdGEuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoc3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJTdWItY2F0ZWdvcnkgZm9yIG5vZGVUeXBlIHt9IHdpdGggbm9ybWFsaXplZE5hbWUge30gZG9lc24ndCBleGlzdCBpbiBncmFwaCIsIG5vZGVUeXBlLAorCQkJCQkJbm9ybWFsaXplZE5hbWUpOworCQkJCXJldHVybiBFaXRoZXIubGVmdChudWxsKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBpbmdEZWZpbml0aW9uLCBBY3Rpb25TdGF0dXM+IGdldEdyb3VwaW5nVW5pcXVlRm9yVHlwZShOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlTdHJpbmcgZ3JvdXBpbmdOb3JtYWxpemVkTmFtZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BlcnRpZXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLmdldFByb3BlcnR5KCksIGdyb3VwaW5nTm9ybWFsaXplZE5hbWUpOworCQl0cnkgeworCQkJRWl0aGVyPExpc3Q8R3JvdXBpbmdEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyb3VwaW5nRWl0aGVyID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEobm9kZVR5cGUsCisJCQkJCXByb3BlcnRpZXMsIEdyb3VwaW5nRGF0YS5jbGFzcyk7CisJCQlpZiAoZ3JvdXBpbmdFaXRoZXIuaXNSaWdodCgpICYmIGdyb3VwaW5nRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgZ3JvdXBpbmcsIG5vZGVUeXBlIHt9LCBub3JtYWxpemVkTmFtZSB7fSwgZXJyb3Ige30iLCBub2RlVHlwZSwKKwkJCQkJCWdyb3VwaW5nTm9ybWFsaXplZE5hbWUsIGdyb3VwaW5nRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisJCQlMaXN0PEdyb3VwaW5nRGF0YT4gZ3JvdXBpbmdMaXN0ID0gKGdyb3VwaW5nRWl0aGVyLmlzTGVmdCgpID8gZ3JvdXBpbmdFaXRoZXIubGVmdCgpLnZhbHVlKCkgOiBudWxsKTsKKwkJCWlmIChncm91cGluZ0xpc3QgIT0gbnVsbCAmJiBncm91cGluZ0xpc3Quc2l6ZSgpID4gMCkgeworCQkJCWxvZy5kZWJ1ZygiRm91bmQgZ3JvdXBpbmcgZm9yIG5vZGVUeXBlIHt9IHdpdGggbm9ybWFsaXplZE5hbWUge30iLCBub2RlVHlwZSwgZ3JvdXBpbmdOb3JtYWxpemVkTmFtZSk7CisJCQkJR3JvdXBpbmdEYXRhIGdyb3VwaW5nRGF0YSA9IGdyb3VwaW5nTGlzdC5nZXQoMCk7CisJCQkJR3JvdXBpbmdEZWZpbml0aW9uIGdyb3VwaW5nRGVmaW5pdGlvbiA9IG5ldyBHcm91cGluZ0RlZmluaXRpb24oCisJCQkJCQlncm91cGluZ0RhdGEuZ2V0R3JvdXBpbmdEYXRhRGVmaW5pdGlvbigpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZ3JvdXBpbmdEZWZpbml0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJHcm91cGluZyBmb3Igbm9kZVR5cGUge30gd2l0aCBub3JtYWxpemVkTmFtZSB7fSBkb2Vzbid0IGV4aXN0IGluIGdyYXBoIiwgbm9kZVR5cGUsCisJCQkJCQlncm91cGluZ05vcm1hbGl6ZWROYW1lKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQobnVsbCk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCX0KKwl9CisKKwkvKgorCSAqCisJICovCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8VGFnPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxUYWdzKCkgeworCQl0cnkgeworCQkJRWl0aGVyPExpc3Q8VGFnRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QWxsKE5vZGVUeXBlRW51bS5UYWcsCisJCQkJCVRhZ0RhdGEuY2xhc3MpOworCQkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgZ2V0IGFsbCB0YWdzLiByZWFzb24gLSB7fSIsIGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQkJTGlzdDxUYWdEYXRhPiB0YWdEYXRhTGlzdCA9IGVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8VGFnPiB0YWdMaXN0ID0gY29udmVydFRvTGlzdE9mVGFnKHRhZ0RhdGFMaXN0KTsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0YWdMaXN0KTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhdGVnb3J5RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2F0ZWdvcnlEYXRhKAorCQkJU3RyaW5nIG5hbWUsIE5vZGVUeXBlRW51bSB0eXBlLCBDbGFzczxUPiBjbGF6eikgeworCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQlTdHJpbmcgY2F0ZWdvcnlVaWQgPSBudWxsOworCQkJaWYgKHR5cGUgPT0gTm9kZVR5cGVFbnVtLlJlc291cmNlQ2F0ZWdvcnkpIHsKKwkJCQlTdHJpbmdbXSBjYXRlZ29yeUZpZWxkcyA9IG5hbWUuc3BsaXQoIi8iKTsKKwkJCQlpZiAoY2F0ZWdvcnlGaWVsZHMubGVuZ3RoICE9IDIpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkNBVEVHT1JZX05PVF9GT1VORCk7CisJCQkJfQorCQkJCWNhdGVnb3J5VWlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVzb3VyY2VDYXRlZ29yeVVpZChjYXRlZ29yeUZpZWxkc1swXSwgY2F0ZWdvcnlGaWVsZHNbMV0sIHR5cGUpOworCQkJfSBlbHNlIHsKKwkJCQljYXRlZ29yeVVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFNlcnZpY2VDYXRlZ29yeVVpZChuYW1lLCB0eXBlKTsKKwkJCX0KKwkJCUVpdGhlcjxULCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUodHlwZSksCisJCQkJCWNhdGVnb3J5VWlkLCBjbGF6eik7CisKKwkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBnZXRpbmcgY2F0ZWdvcnkgd2l0aCBpZCB7fS4gcmVhc29uIC0ge30iLCBjYXRlZ29yeVVpZCwgdGl0YW5PcGVyYXRpb25TdGF0dXMubmFtZSgpKTsKKwkJCQlpZiAodGl0YW5PcGVyYXRpb25TdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5DQVRFR09SWV9OT1RfRk9VTkQpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoKG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhdGVnb3J5RGF0YSkgZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCX0KKworCXByaXZhdGUgTGlzdDxUYWc+IGNvbnZlcnRUb0xpc3RPZlRhZyhMaXN0PFRhZ0RhdGE+IHRhZ0RhdGFMaXN0KSB7CisJCUxpc3Q8VGFnPiB0YWdMaXN0ID0gbmV3IEFycmF5TGlzdDxUYWc+KCk7CisJCWZvciAoVGFnRGF0YSBlbGVtIDogdGFnRGF0YUxpc3QpIHsKKwkJCVRhZyB0YWcgPSBuZXcgVGFnKCk7CisJCQl0YWcuc2V0TmFtZShlbGVtLmdldE5hbWUoKSk7CisJCQl0YWdMaXN0LmFkZCh0YWcpOworCQl9CisJCXJldHVybiB0YWdMaXN0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxQcm9wZXJ0eVNjb3BlPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxQcm9wZXJ0eVNjb3BlcygpIHsKKwkJLy8gTW9jaworCQlMaXN0PFByb3BlcnR5U2NvcGU+IHByb3BlcnR5U2NvcGVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVNjb3BlPigpOworCQlQcm9wZXJ0eVNjb3BlIHByb3BlcnR5U2NvcGUxID0gbmV3IFByb3BlcnR5U2NvcGUoKTsKKwkJcHJvcGVydHlTY29wZTEuc2V0TmFtZSgiQSZBSSIpOworCQlQcm9wZXJ0eVNjb3BlIHByb3BlcnR5U2NvcGUyID0gbmV3IFByb3BlcnR5U2NvcGUoKTsKKwkJcHJvcGVydHlTY29wZTIuc2V0TmFtZSgiT3JkZXIiKTsKKwkJUHJvcGVydHlTY29wZSBwcm9wZXJ0eVNjb3BlMyA9IG5ldyBQcm9wZXJ0eVNjb3BlKCk7CisJCXByb3BlcnR5U2NvcGUzLnNldE5hbWUoIlJ1bnRpbWUiKTsKKwkJcHJvcGVydHlTY29wZXMuYWRkKHByb3BlcnR5U2NvcGUxKTsKKwkJcHJvcGVydHlTY29wZXMuYWRkKHByb3BlcnR5U2NvcGUyKTsKKwkJcHJvcGVydHlTY29wZXMuYWRkKHByb3BlcnR5U2NvcGUzKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHByb3BlcnR5U2NvcGVzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3RUeXBlPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxBcnRpZmFjdFR5cGVzKCkgeworCQlMaXN0PEFydGlmYWN0VHlwZT4gYXJ0aWZhY3RUeXBlcyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3RUeXBlPigpOworCisJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdFR5cGVzTGlzdCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpCisJCQkJLmdldEFydGlmYWN0VHlwZXMoKTsKKwkJZm9yIChTdHJpbmcgYXJ0aWZhY3RUeXBlIDogYXJ0aWZhY3RUeXBlc0xpc3QpIHsKKwkJCUFydGlmYWN0VHlwZSBhcnRpZmFjdFQgPSBuZXcgQXJ0aWZhY3RUeXBlKCk7CisJCQlhcnRpZmFjdFQuc2V0TmFtZShhcnRpZmFjdFR5cGUpOworCQkJYXJ0aWZhY3RUeXBlcy5hZGQoYXJ0aWZhY3RUKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoYXJ0aWZhY3RUeXBlcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBPYmplY3Q+LCBBY3Rpb25TdGF0dXM+IGdldEFsbERlcGxveW1lbnRBcnRpZmFjdFR5cGVzKCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJ0aWZhY3RUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiBhcnRpZmFjdFJlc291cmNlVHlwZXMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpCisJCQkJLmdldENvbmZpZ3VyYXRpb24oKS5nZXRSZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJTWFwPFN0cmluZywgRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZz4gYXJ0aWZhY3RTZXJ2aWNlVHlwZXMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpCisJCQkJLmdldENvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0cygpOworCQlNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiBhcnRpZmFjdFJlc291cmNlSW5zdGFuY2VUeXBlcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyCisJCQkJLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisKKwkJYXJ0aWZhY3RUeXBlcy5wdXQoInJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cyIsIGFydGlmYWN0UmVzb3VyY2VUeXBlcyk7CisJCWFydGlmYWN0VHlwZXMucHV0KCJzZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0cyIsIGFydGlmYWN0U2VydmljZVR5cGVzKTsKKwkJYXJ0aWZhY3RUeXBlcy5wdXQoInJlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzIiwgYXJ0aWZhY3RSZXNvdXJjZUluc3RhbmNlVHlwZXMpOworCisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdFR5cGVzKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8SW50ZWdlciwgQWN0aW9uU3RhdHVzPiBnZXREZWZhdWx0SGVhdFRpbWVvdXQoKSB7CisJCXJldHVybiBFaXRoZXIubGVmdChDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKQorCQkJCS5nZXREZWZhdWx0SGVhdEFydGlmYWN0VGltZW91dE1pbnV0ZXMoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBBY3Rpb25TdGF0dXM+IGdldFJlc291cmNlVHlwZXNNYXAoKSB7CisJCVJlc291cmNlVHlwZUVudW1bXSBlbnVtQ29uc3RhbnRzID0gUmVzb3VyY2VUeXBlRW51bS5jbGFzcy5nZXRFbnVtQ29uc3RhbnRzKCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVzb3VyY2VUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlpZiAoZW51bUNvbnN0YW50cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db25zdGFudHMubGVuZ3RoOyArK2kpIHsKKwkJCQlyZXNvdXJjZVR5cGVzLnB1dChlbnVtQ29uc3RhbnRzW2ldLm5hbWUoKSwgZW51bUNvbnN0YW50c1tpXS5nZXRWYWx1ZSgpKTsKKwkJCX0KKworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZVR5cGVzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQgZXh0ZW5kcyBHcmFwaE5vZGU+IEVpdGhlcjxDYXRlZ29yeURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE5ld0NhdGVnb3J5RGF0YShTdHJpbmcgbmFtZSwKKwkJCU5vZGVUeXBlRW51bSB0eXBlLCBDbGFzczxUPiBjbGF6eikgeworCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQlTdHJpbmcgY2F0ZWdvcnlVaWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRTZXJ2aWNlQ2F0ZWdvcnlVaWQobmFtZSwgdHlwZSk7CisJCQlNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIG5hbWUpOworCQkJRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYSh0eXBlLCBwcm9wcywgY2xhenopOworCisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gZWl0aGVyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgZ2V0aW5nIGNhdGVnb3J5IHdpdGggaWQge30uIHJlYXNvbiAtIHt9IiwgY2F0ZWdvcnlVaWQsIHRpdGFuT3BlcmF0aW9uU3RhdHVzLm5hbWUoKSk7CisJCQkJaWYgKHRpdGFuT3BlcmF0aW9uU3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQ0FURUdPUllfTk9UX0ZPVU5EKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KChDYXRlZ29yeURhdGEpIGVpdGhlci5sZWZ0KCkudmFsdWUoKS5nZXQoMCkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0dyYXBoTG9ja09wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9HcmFwaExvY2tPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU0MWU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9HcmFwaExvY2tPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLlJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklDYWNoZU1hbmdlck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JR3JhcGhMb2NrT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJncmFwaC1sb2NrLW9wZXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgR3JhcGhMb2NrT3BlcmF0aW9uIGltcGxlbWVudHMgSUdyYXBoTG9ja09wZXJhdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc291cmNlT3BlcmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbzsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJQ2FjaGVNYW5nZXJPcGVyYXRpb24gY2FjaGVNYW5hZ2VyT3BlcmF0aW9uOworCisJcHVibGljIEdyYXBoTG9ja09wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5JR3JhcGhMb2NrT3BlcmF0aW9uIworCSAqIGxvY2tSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nLAorCSAqIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXNvdXJjZU9wZXJhdGlvbikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisJCWxvZy5pbmZvKCJsb2NrIHJlc291cmNlIHdpdGggaWQge30iLCBjb21wb25lbnRJZCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGxvY2tFbGVtZW50U3RhdHVzID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJLy8gU0VUIExBU1QgVVBEQVRFIERBVEUgT0YgVEhFIENPTVBPTkVOVC4KKwkJCS8vIEluIHRoaXMgd2F5IHdlIG1hcmsgdGhlIGNvbXBvbmVudCBhcyB1cGRhdGVkIG9uZSAoYW5kIGNvbXBvbmVudAorCQkJLy8gd29uJ3QgYmUgZmV0Y2hlZCBmcm9tIGNhY2hlIHNpbmNlIHRoZSBjb21wb25lbnQgaW4gY2FjaGUgaGFzCisJCQkvLyBkaWZmZXJlbnQgdGltZXN0YW1wKQorCQkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVRpbWUgPSB1cGRhdGVNb2RpZmljYXRpb25UaW1lT2ZDb21wb25lbnQoCisJCQkJCWNvbXBvbmVudElkLCBub2RlVHlwZSk7CisJCQlpZiAodXBkYXRlVGltZS5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSB1cGRhdGVUaW1lLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAob3BlcmF0aW9uU3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKG9wZXJhdGlvblN0YXR1cyk7CisJCQkJfQorCQkJfQorCisJCQlsb2NrRWxlbWVudFN0YXR1cyA9IHRpdGFuR2VuZXJpY0Rhby5sb2NrRWxlbWVudChjb21wb25lbnRJZCwgbm9kZVR5cGUpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2NrRWxlbWVudFN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLkFMUkVBRFlfTE9DS0VEOworCisJCX0KKworCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhsb2NrRWxlbWVudFN0YXR1cyk7CisKKwl9CisKKwkvKioKKwkgKiB1cGRhdGUgdGhlIGxhc3QgdXBkYXRlIGRhdGUgb2YgdGhlIGNvbXBvbmVudAorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnRJZAorCSAqIEBwYXJhbSBub2RlVHlwZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVNb2RpZmljYXRpb25UaW1lT2ZDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudElkLAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJaWYgKG5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5SZXNvdXJjZSB8fCBub2RlVHlwZSA9PSBOb2RlVHlwZUVudW0uU2VydmljZSB8fCBub2RlVHlwZSA9PSBOb2RlVHlwZUVudW0uUHJvZHVjdCkgeworCQkJLy8gV2UgZmV0Y2ggYWxsIG5vZGUgc2luY2UgdXBkYXRlIG9ubHkgdGltZXN0YW1wIG1ha2UgcHJvYmxlbXMgc2luY2UKKwkJCS8vIHRoZXJlIGlzIGRlZmF1bHQgcmVzb3VyY2UgdHlwZSAoVkZDKSB3aGljaCBjaGFuZ2VzIGNvbXBvbmVudAorCQkJLy8gcmVzb3VyY2UgdHlwZSB3aGVuIHdlIHVwZGF0ZSBvbmx5IHRpbWVzdGFtcChSZXNvdXJjZU1ldGFkYXRhRGF0YQorCQkJLy8gY29udGFpbnMgZGVmYXVsdCB2YWx1ZSBWRkMgb24gcmVzb3VyY2VUeXBlIGZpZWxkKS4KKwkJCUVpdGhlcjxDb21wb25lbnRNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kQ29tcCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGNvbXBvbmVudElkLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCQlpZiAoZmluZENvbXAuaXNSaWdodCgpKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChmaW5kQ29tcC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudE1ldGFkYXRhRGF0YSA9IGZpbmRDb21wLmxlZnQoKS52YWx1ZSgpOworCQkJY29tcG9uZW50TWV0YWRhdGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRMYXN0VXBkYXRlRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCQlFaXRoZXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkudXBkYXRlTm9kZShjb21wb25lbnRNZXRhZGF0YURhdGEsIENvbXBvbmVudE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlyZXR1cm4gdXBkYXRlTm9kZTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5JR3JhcGhMb2NrT3BlcmF0aW9uIworCSAqIHVubG9ja1Jlc291cmNlKGphdmEubGFuZy5TdHJpbmcsCisJICogb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVJlc291cmNlT3BlcmF0aW9uKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVubG9ja0NvbXBvbmVudChTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCisJCUVpdGhlcjxMb25nLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDb21wb25lbnRUb0NhY2hlUGFydDEgPSBhZGRDb21wb25lbnRUb0NhY2hlUGFydDFXaXRob3V0Q29tbWl0KAorCQkJCWNvbXBvbmVudElkLCBub2RlVHlwZSk7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgbG9ja0VsZW1lbnRTdGF0dXMgPSB0aXRhbkdlbmVyaWNEYW8ucmVsZWFzZUVsZW1lbnQoY29tcG9uZW50SWQsIG5vZGVUeXBlKTsKKworCQlpZiAoYWRkQ29tcG9uZW50VG9DYWNoZVBhcnQxLmlzTGVmdCgpKSB7CisJCQlMb25nIGxhc3RVcGRhdGVEYXRlID0gYWRkQ29tcG9uZW50VG9DYWNoZVBhcnQxLmxlZnQoKS52YWx1ZSgpOworCQkJYWRkQ29tcG9uZW50VG9DYWNoZVBhcnQyKGNvbXBvbmVudElkLCBsYXN0VXBkYXRlRGF0ZSwgbm9kZVR5cGUpOworCQl9CisKKwkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMobG9ja0VsZW1lbnRTdGF0dXMpOworCX0KKworCXByaXZhdGUgUmVzb3VyY2VNZXRhZGF0YURhdGEgZ2V0UmVzb3VyY2VNZXRhRGF0YUZyb21SZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgcmVzb3VyY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKTsKKwkJcmV0dXJuIHJlc291cmNlRGF0YTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB1bmxvY2tDb21wb25lbnRCeU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJRWl0aGVyPExvbmcsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZENvbXBvbmVudFRvQ2FjaGVQYXJ0MSA9IGFkZENvbXBvbmVudFRvQ2FjaGVQYXJ0MVdpdGhvdXRDb21taXQoCisJCQkJY29tcG9uZW50SWQsIG5vZGVUeXBlKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBsb2NrRWxlbWVudFN0YXR1cyA9IHRpdGFuR2VuZXJpY0Rhby5yZWxlYXNlRWxlbWVudChuYW1lLCBub2RlVHlwZSk7CisKKwkJaWYgKGFkZENvbXBvbmVudFRvQ2FjaGVQYXJ0MS5pc0xlZnQoKSkgeworCQkJTG9uZyBsYXN0VXBkYXRlRGF0ZSA9IGFkZENvbXBvbmVudFRvQ2FjaGVQYXJ0MS5sZWZ0KCkudmFsdWUoKTsKKwkJCWFkZENvbXBvbmVudFRvQ2FjaGVQYXJ0Mihjb21wb25lbnRJZCwgbGFzdFVwZGF0ZURhdGUsIG5vZGVUeXBlKTsKKwkJfQorCisJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGxvY2tFbGVtZW50U3RhdHVzKTsKKwl9CisKKwkvKioKKwkgKiBXZSBmZXRjaCB0aGUgbGFzdCB1cGRhdGUgZGF0ZSBvZiB0aGUgY29tcG9uZW50CisJICogCisJICogQHBhcmFtIGNvbXBvbmVudElkCisJICogQHBhcmFtIG5vZGVUeXBlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPExvbmcsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZENvbXBvbmVudFRvQ2FjaGVQYXJ0MVdpdGhvdXRDb21taXQoU3RyaW5nIGNvbXBvbmVudElkLAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisJCWlmIChjb21wb25lbnRJZCAhPSBudWxsKSB7IC8vIEluIGNhc2Ugb2YgZXJyb3IsIHRoZSBjb21wb25lbnRJZCBtaWdodCBiZQorCQkJCQkJCQkJLy8gZW1wdHkuCisJCQlpZiAobm9kZVR5cGUgPT0gTm9kZVR5cGVFbnVtLlJlc291cmNlIHx8IG5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5TZXJ2aWNlCisJCQkJCXx8IG5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5Qcm9kdWN0KSB7CisJCQkJTG9uZyBsYXN0VXBkYXRlRGF0ZSA9IG51bGw7CisJCQkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzUmVzdWx0ID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkJCS5nZXRDb21wb25lbnRCeUxhYmVsQW5kSWQoY29tcG9uZW50SWQsIG5vZGVUeXBlLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJCWlmIChyZXNSZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIHJlc291cmNlTWV0YWRhdGFEYXRhID0gcmVzUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCQlsYXN0VXBkYXRlRGF0ZSA9IHJlc291cmNlTWV0YWRhdGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRMYXN0VXBkYXRlRGF0ZSgpOworCisJCQkJCXJldHVybiBFaXRoZXIubGVmdChsYXN0VXBkYXRlRGF0ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEKTsKKwl9CisKKwkvKioKKwkgKiBhZGQgdGhlIGNvbXBvbmVudCB0byB0aGUgY2FjaGUKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50SWQKKwkgKiBAcGFyYW0gbGFzdFVwZGF0ZURhdGUKKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8TG9uZywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQ29tcG9uZW50VG9DYWNoZVBhcnQyKFN0cmluZyBjb21wb25lbnRJZCwgTG9uZyBsYXN0VXBkYXRlRGF0ZSwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCQlpZiAoY29tcG9uZW50SWQgIT0gbnVsbCkgeyAvLyBJbiBjYXNlIG9mIGVycm9yLCB0aGUgY29tcG9uZW50SWQgbWlnaHQgYmUKKwkJCQkJCQkJCS8vIGVtcHR5LgorCQkJaWYgKG5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5SZXNvdXJjZSB8fCBub2RlVHlwZSA9PSBOb2RlVHlwZUVudW0uU2VydmljZQorCQkJCQl8fCBub2RlVHlwZSA9PSBOb2RlVHlwZUVudW0uUHJvZHVjdCkgeworCQkJCS8vIGFkZCB0YXNrIHRvIFEKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGFkZCBjb21wb25lbnQge30gb2YgdHlwZSB7fSB0byBjYWNoZSIsIGNvbXBvbmVudElkLCBub2RlVHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQkJY2FjaGVNYW5hZ2VyT3BlcmF0aW9uLnVwZGF0ZUNvbXBvbmVudEluQ2FjaGUoY29tcG9uZW50SWQsIGxhc3RVcGRhdGVEYXRlLCBub2RlVHlwZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrQ29tcG9uZW50QnlOYW1lKFN0cmluZyBuYW1lLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKwkJbG9nLmluZm8oImxvY2sgcmVzb3VyY2Ugd2l0aCBuYW1lIHt9IiwgbmFtZSk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGxvY2tFbGVtZW50U3RhdHVzID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJbG9ja0VsZW1lbnRTdGF0dXMgPSB0aXRhbkdlbmVyaWNEYW8ubG9ja0VsZW1lbnQobmFtZSwgbm9kZVR5cGUpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2NrRWxlbWVudFN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLkFMUkVBRFlfTE9DS0VEOworCisJCX0KKworCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhsb2NrRWxlbWVudFN0YXR1cyk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0dyb3VwT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0dyb3VwT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMmJlNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvR3JvdXBPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDIwOTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuR3JvdXBQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZS5BcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUdyb3VwT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudEluc3RhbmNlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuR3JvdXBEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkdyb3VwVHlwZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5VmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlNlcnZpY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVW5pcXVlSWREYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJncm91cC1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIEdyb3VwT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJR3JvdXBPcGVyYXRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFERElOR19HUk9VUCA9ICJBZGRpbmdHcm91cCI7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFTEVUSU5HX0dST1VQID0gIkRlbGV0aW5nR3JvdXAiOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUxFVElOR19BTExfR1JPVVBTID0gIkRlbGV0aW5nQWxsR3JvdXBzIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJTkdfR1JPVVBfVE9fQ09NUF9JTlNUID0gIkFzc29jaWF0aW5nR3JvdXBUb0NvbXBvbmVudEluc3RhbmNlIjsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihHcm91cE9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIEdyb3VwVHlwZU9wZXJhdGlvbiBncm91cFR5cGVPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQXBwbGljYXRpb25EYXRhVHlwZUNhY2hlIGRhdGFUeXBlQ2FjaGU7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEdyb3VwVG9HcmFwaChOb2RlVHlwZUVudW0gbm9kZVR5cGVFbnVtLCBTdHJpbmcgY29tcG9uZW50SWQsCisJCQlHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uKSB7CisKKwkJU3RyaW5nIGdyb3VwVHlwZVVpZCA9IGdyb3VwRGVmaW5pdGlvbi5nZXRUeXBlVWlkKCk7CisKKwkJaWYgKGdyb3VwVHlwZVVpZCA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCAiR3JvdXAgdHlwZSBpZCBpcyBlbXB0eSIsCisJCQkJCUVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJfQorCisJCUNvbXBvbmVudE1ldGFkYXRhRGF0YSBtZXRhRGF0YSA9IG51bGw7CisJCWlmIChub2RlVHlwZUVudW0gPT0gTm9kZVR5cGVFbnVtLlJlc291cmNlKSB7CisJCQltZXRhRGF0YSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQl9IGVsc2UgeworCQkJbWV0YURhdGEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YSgpOworCQl9CisJCW1ldGFEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChjb21wb25lbnRJZCk7CisKKwkJZ3JvdXBEZWZpbml0aW9uLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZEdyb3VwVW5pcXVlSWQoY29tcG9uZW50SWQsIGdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKKworCQlpbnQgcHJvcGVydGllc1NpemUgPSBncm91cERlZmluaXRpb24uZ2V0UHJvcGVydGllcygpID09IG51bGwgPyAwIDogZ3JvdXBEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKS5zaXplKCk7CisJCWdyb3VwRGVmaW5pdGlvbi5zZXRQcm9wZXJ0eVZhbHVlQ291bnRlcihwcm9wZXJ0aWVzU2l6ZSk7CisKKwkJR3JvdXBEYXRhIGdyb3VwRGF0YSA9IG5ldyBHcm91cERhdGEoZ3JvdXBEZWZpbml0aW9uKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBudWxsOworCQkvLyBBZGRpbmcgZ3JvdXAgZGF0YSBub2RlIHRvIGdyYXBoCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBncm91cCB0byBncmFwaCB7fSIsIGdyb3VwRGF0YS50b1N0cmluZygpKTsKKwkJRWl0aGVyPEdyb3VwRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShncm91cERhdGEsCisJCQkJR3JvdXBEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgZ3JvdXAgdG8gZ3JhcGgge30iLCBncm91cERhdGEudG9TdHJpbmcoKSk7CisJCWlmIChjcmVhdGVOb2RlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJc3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgZ3JvdXAge30gdG8gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIGdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCksIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQkvLyBBc3NvY2lhdGUgZ3JvdXAgdG8gZ3JvdXAgdHlwZQorCQlsb2cuZGVidWcoIkdvaW5nIHRvIGFzc29jaWF0ZSBncm91cCB7fSB0byBpdHMgZ3JvdXBUeXBlIHt9IiwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgZ3JvdXBEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlR3JvdXBUeXBlUmVzID0gYXNzb2NpYXRlR3JvdXBUb0dyb3VwVHlwZShncm91cERhdGEsCisJCQkJZ3JvdXBUeXBlVWlkKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyBncm91cCB7fSB0byBpdHMgZ3JvdXBUeXBlIHt9LiBTdGF0dXMgaXMge30iLCBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLCBncm91cERlZmluaXRpb24uZ2V0VHlwZSgpLCBhc3NvY2lhdGVHcm91cFR5cGVSZXMpOworCQlpZiAoYXNzb2NpYXRlR3JvdXBUeXBlUmVzLmlzUmlnaHQoKSkgeworCQkJc3RhdHVzID0gYXNzb2NpYXRlR3JvdXBUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJGYWlsZWQgdG8gYXNzb2NpYXRlIGdyb3VwICIgKyBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpICsgIiB0byBpdHMgZ3JvdXBUeXBlICIKKwkJCQkJKyBncm91cERlZmluaXRpb24uZ2V0VHlwZSgpICsgIiBpbiBncmFwaC4iOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKEFERElOR19HUk9VUCwgZGVzY3JpcHRpb24sIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJLy8gQXNzb2NpYXRlIGdyb3VwIHRvIGNvbXBvbmVudCBSRVNPVVJDRS9TRVJWSUNFL1BST0RVQ1QKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVDb21wb25lbnRSZXMgPSBhc3NvY2lhdGVHcm91cFRvQ29tcG9uZW50KGdyb3VwRGF0YSwKKwkJCQlub2RlVHlwZUVudW0sIGNvbXBvbmVudElkKTsKKwkJaWYgKGFzc29jaWF0ZUNvbXBvbmVudFJlcy5pc1JpZ2h0KCkpIHsKKwkJCXN0YXR1cyA9IGFzc29jaWF0ZUNvbXBvbmVudFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiRmFpbGVkIHRvIGFzc29jaWF0ZSBncm91cCAiICsgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSArICIgdG8gIgorCQkJCQkrIG5vZGVUeXBlRW51bS5nZXROYW1lKCkgKyAiICIgKyBjb21wb25lbnRJZCArICIuIHN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKEFERElOR19HUk9VUCwgZGVzY3JpcHRpb24sIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cFR5cGVSZXMgPSBncm91cFR5cGVPcGVyYXRpb24KKwkJCQkuZ2V0R3JvdXBUeXBlQnlVaWQoZ3JvdXBEZWZpbml0aW9uLmdldFR5cGVVaWQoKSk7CisJCWlmIChncm91cFR5cGVSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBncm91cFR5cGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmluZCBncm91cCB0eXBlIHt9IiwgZ3JvdXBEZWZpbml0aW9uLmdldFR5cGVVaWQoKSk7CisJCQlpZiAob3BlcmF0aW9uU3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCk7CisJCQl9CisJCX0KKwkJR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGVEZWZpbml0aW9uID0gZ3JvdXBUeXBlUmVzLmxlZnQoKS52YWx1ZSgpOworCQkvLyAxLiBmaW5kIHByb3BlcnRpZXMgZnJvbSBncm91cCB0eXBlCisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBncm91cFR5cGVQcm9wZXJ0aWVzID0gZ3JvdXBUeXBlRGVmaW5pdGlvbi5nZXRQcm9wZXJ0aWVzKCk7CisKKwkJLy8gMi4gY2hlY2sgdGhlIHByb3BlcnRpZXMgZXhpc3RzIGluIHRoZSBncm91cCB0eXBlLgorCQkvLyAzLiBhZGQgcGFyZW50IHVuaXF1ZSBpZCB0byB0aGUgcHJvcGVydGllcworCQkvLyA0LiBhZGQgbm9kZSBwZXIgZ3JvdXAgcHJvcGVydHkgd2hpY2ggdGhlIGdyb3VwIHBvaW50IHRvIGl0IGFuZCBpdAorCQkvLyBwb2ludHMgdG8gdGhlIHBhcmVudCB1bmlxdWUgaWQKKworCQkvLyBBZGRpbmcgcHJvcGVydGllcyB0byBncm91cAorCQlMaXN0PEdyb3VwUHJvcGVydHk+IHByb3BlcnRpZXMgPSBncm91cERlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgZmFsc2UgPT0gcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKworCQkJaWYgKGdyb3VwVHlwZVByb3BlcnRpZXMgPT0gbnVsbCB8fCB0cnVlID09IGdyb3VwVHlwZVByb3BlcnRpZXMuaXNFbXB0eSgpKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludmFsaWRJbnB1dEVycm9yKEFERElOR19HUk9VUCwKKwkJCQkJCSJncm91cCB0eXBlIGRvZXMgbm90IGhhdmUgcHJvcGVydGllcyIsIEVycm9yU2V2ZXJpdHkuSU5GTyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5NQVRDSF9OT1RfRk9VTkQpOworCQkJfQorCisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGdyb3VwVHlwZVByb3BlcnRpZXNNYXAgPSBncm91cFR5cGVQcm9wZXJ0aWVzLnN0cmVhbSgpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAocCAtPiBwLmdldE5hbWUoKSwgcCAtPiBwKSk7CisKKwkJCUVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5UmVzdWx0ID0gbnVsbDsKKwkJCWludCBpID0gMTsKKwkJCWZvciAoR3JvdXBQcm9wZXJ0eSBwcm9wIDogcHJvcGVydGllcykgeworCQkJCWFkZFByb3BlcnR5UmVzdWx0ID0gYWRkUHJvcGVydHlUb0dyb3VwKGdyb3VwRGF0YSwgcHJvcCwgZ3JvdXBUeXBlUHJvcGVydGllc01hcC5nZXQocHJvcC5nZXROYW1lKCkpLCBpKTsKKwkJCQlpZiAoYWRkUHJvcGVydHlSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCXN0YXR1cyA9IGFkZFByb3BlcnR5UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIkZhaWxlZCB0byBhc3NvY2lhdGUgZ3JvdXAgIiArIGdyb3VwRGF0YS5nZXRVbmlxdWVJZCgpICsgIiB0byBwcm9wZXJ0eSAiCisJCQkJCQkJKyBwcm9wLmdldE5hbWUoKSArICIgaW4gZ3JhcGguIFN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwKKwkJCQkJCQlFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCQlpKys7CisJCQl9CisJCX0KKworCQkvLyBBc3NvY2lhdGUgYXJ0aWZhY3RzIHRvIGdyb3VwCisJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHMgPSBncm91cERlZmluaXRpb24uZ2V0QXJ0aWZhY3RzKCk7CisKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXBPbkdyYXBoID0gYXNzb2NpYXRlQXJ0aWZhY3RzVG9Hcm91cE9uR3JhcGgoCisJCQkJZ3JvdXBEYXRhLmdldEdyb3VwRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCBhcnRpZmFjdHMpOworCQlpZiAoYXNzb2NpYXRlQXJ0aWZhY3RzVG9Hcm91cE9uR3JhcGguaXNSaWdodCgpCisJCQkJJiYgYXNzb2NpYXRlQXJ0aWZhY3RzVG9Hcm91cE9uR3JhcGgucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKwkJLyoKKwkJICogRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRBcnRpZmFjdHNSZWZSZXN1bHQgPQorCQkgKiBudWxsOyBpZiAoYXJ0aWZhY3RzICE9IG51bGwpIHsgZm9yIChTdHJpbmcgYXJ0aWZhY3RJZCA6IGFydGlmYWN0cykgeworCQkgKiBFaXRoZXI8QXJ0aWZhY3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZEFydGlmYWN0UmVzID0KKwkJICogdGl0YW5HZW5lcmljRGFvIC5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlcgorCQkgKiAuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYpLCBhcnRpZmFjdElkLAorCQkgKiBBcnRpZmFjdERhdGEuY2xhc3MpOyBpZiAoZmluZEFydGlmYWN0UmVzLmlzUmlnaHQoKSkgeyBzdGF0dXMgPQorCQkgKiBmaW5kQXJ0aWZhY3RSZXMucmlnaHQoKS52YWx1ZSgpOyBpZiAoc3RhdHVzID09CisJCSAqIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeyBzdGF0dXMgPQorCQkgKiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOyB9IFN0cmluZyBkZXNjcmlwdGlvbiA9CisJCSAqICJGYWlsZWQgdG8gYXNzb2NpYXRlIGdyb3VwICIgKyBncm91cERhdGEuZ2V0VW5pcXVlSWQoKSArCisJCSAqICIgdG8gYXJ0aWZhY3QgIiArIGFydGlmYWN0SWQgKyAiIGluIGdyYXBoLiBTdGF0dXMgaXMgIiArIHN0YXR1czsKKwkJICogQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCBBRERJTkdfR1JPVVAsCisJCSAqIGRlc2NyaXB0aW9uLCBFcnJvclNldmVyaXR5LkVSUk9SKTsgcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOyB9CisJCSAqIAorCQkgKiBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCSAqIHByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwKKwkJICogZmluZEFydGlmYWN0UmVzLmxlZnQoKS52YWx1ZSgpLmdldExhYmVsKCkpOworCQkgKiAKKwkJICogYWRkQXJ0aWZhY3RzUmVmUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKCBncm91cERhdGEsCisJCSAqIGZpbmRBcnRpZmFjdFJlcy5sZWZ0KCkudmFsdWUoKSwgR3JhcGhFZGdlTGFiZWxzLkdST1VQX0FSVElGQUNUX1JFRiwKKwkJICogcHJvcHMpOworCQkgKiAKKwkJICogaWYgKGFkZEFydGlmYWN0c1JlZlJlc3VsdC5pc1JpZ2h0KCkpIHsgc3RhdHVzID0KKwkJICogYWRkQXJ0aWZhY3RzUmVmUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsgU3RyaW5nIGRlc2NyaXB0aW9uID0KKwkJICogIkZhaWxlZCB0byBhc3NvY2lhdGUgZ3JvdXAgIiArIGdyb3VwRGF0YS5nZXRVbmlxdWVJZCgpICsKKwkJICogIiB0byBhcnRpZmFjdCAiICsgYXJ0aWZhY3RJZCArICIgaW4gZ3JhcGguIFN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkgKiBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIEFERElOR19HUk9VUCwKKwkJICogZGVzY3JpcHRpb24sIEVycm9yU2V2ZXJpdHkuRVJST1IpOyByZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7IH0gfSB9CisJCSAqLworCisJCS8vIEFzc29jaWF0ZSBncm91cCB0byBtZW1iZXJzCisJCS8vIG1hcCBvZiBjb21wb25lbnRJbnN0YW5jZXMgPG5hbWU6IHVuaXF1ZUlkPgorCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMgPSBncm91cERlZmluaXRpb24uZ2V0TWVtYmVycygpOworCisJCWlmIChtZW1iZXJzICE9IG51bGwgJiYgZmFsc2UgPT0gbWVtYmVycy5pc0VtcHR5KCkpIHsKKwkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkTWVtYmVyc1JlZlJlc3VsdCA9IG51bGw7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBtZW1iZXIgOiBtZW1iZXJzLmVudHJ5U2V0KCkpIHsKKwkJCQlpZiAobWVtYmVyLmdldFZhbHVlKCkgPT0gbnVsbCB8fCBtZW1iZXIuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kQ29tcG9uZW50SW5zdGFuY2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZSgKKwkJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgbWVtYmVyLmdldFZhbHVlKCksCisJCQkJCQlDb21wb25lbnRJbnN0YW5jZURhdGEuY2xhc3MpOworCQkJCWlmIChmaW5kQ29tcG9uZW50SW5zdGFuY2VSZXMuaXNSaWdodCgpKSB7CisJCQkJCXN0YXR1cyA9IGZpbmRDb21wb25lbnRJbnN0YW5jZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJCQl9CisJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJGYWlsZWQgdG8gZmluZCB0byBmaW5kIG1lbWJlciBvZiBncm91cCAiICsgbWVtYmVyLmdldFZhbHVlKCkKKwkJCQkJCQkrICIgaW4gZ3JhcGguIFN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwKKwkJCQkJCQlFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBtZW1iZXIuZ2V0S2V5KCkpOworCQkJCWFkZE1lbWJlcnNSZWZSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oZ3JvdXBEYXRhLCBmaW5kQ29tcG9uZW50SW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCksCisJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuR1JPVVBfTUVNQkVSLCBwcm9wcyk7CisKKwkJCQlpZiAoYWRkTWVtYmVyc1JlZlJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJc3RhdHVzID0gYWRkTWVtYmVyc1JlZlJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJGYWlsZWQgdG8gYXNzb2NpYXRlIGdyb3VwICIgKyBncm91cERhdGEuZ2V0VW5pcXVlSWQoKQorCQkJCQkJCSsgIiB0byBjb21wb25lbnQgaW5zdGFuY2UgIiArIG1lbWJlci5nZXRWYWx1ZSgpICsgIiBpbiBncmFwaC4gU3RhdHVzIGlzICIgKyBzdGF0dXM7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcihBRERJTkdfR1JPVVAsIGRlc2NyaXB0aW9uLAorCQkJCQkJCUVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGdyb3VwRGF0YSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVRvR3JvdXAoR3JvdXBEYXRhIGdyb3VwRGF0YSwKKwkJCUdyb3VwUHJvcGVydHkgZ3JvdXBQcm9wZXJ0eSwgUHJvcGVydHlEZWZpbml0aW9uIHByb3AsIEludGVnZXIgaW5kZXgpIHsKKworCQlpZiAocHJvcCA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQl9CisKKwkJU3RyaW5nIHByb3BlcnR5SWQgPSBwcm9wLmdldFVuaXF1ZUlkKCk7CisJCUVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUHJvcGVydHlEZWZSZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUHJvcGVydHkpLCBwcm9wZXJ0eUlkLCBQcm9wZXJ0eURhdGEuY2xhc3MpOworCisJCWlmIChmaW5kUHJvcGVydHlEZWZSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kUHJvcGVydHlEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJUHJvcGVydHlEYXRhIHByb3BlcnR5RGF0YSA9IGZpbmRQcm9wZXJ0eURlZlJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEYXRhRGVmID0gcHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKTsKKwkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHByb3BEYXRhRGVmLmdldFR5cGUoKTsKKwkJU3RyaW5nIHZhbHVlID0gZ3JvdXBQcm9wZXJ0eS5nZXRWYWx1ZSgpOworCisJCUVpdGhlcjxTdHJpbmcsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGVja0lubmVyVHlwZSA9IHByb3BlcnR5T3BlcmF0aW9uLmNoZWNrSW5uZXJUeXBlKHByb3BEYXRhRGVmKTsKKwkJaWYgKGNoZWNrSW5uZXJUeXBlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2hlY2tJbm5lclR5cGUucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJU3RyaW5nIGlubmVyVHlwZSA9IGNoZWNrSW5uZXJUeXBlLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsRGF0YVR5cGVzID0gZGF0YVR5cGVDYWNoZS5nZXRBbGwoKTsKKwkJaWYgKGFsbERhdGFUeXBlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbERhdGFUeXBlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIkFkZFByb3BlcnR5VG9Hcm91cCIsCisJCQkJCSJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHRvIGdyb3VwLiBTdGF0dXMgaXMgIiArIHN0YXR1cywgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisKKwkJfQorCisJCWxvZy5kZWJ1ZygiQmVmb3JlIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZSIpOworCQlFaXRoZXI8T2JqZWN0LCBCb29sZWFuPiBpc1ZhbGlkID0gcHJvcGVydHlPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5VHlwZSwgdmFsdWUsCisJCQkJaW5uZXJUeXBlLCBhbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCkpOworCQlsb2cuZGVidWcoIkFmdGVyIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZS4gaXNWYWxpZCA9IHt9IiwgaXNWYWxpZCk7CisKKwkJU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWU7CisJCWlmIChpc1ZhbGlkLmlzUmlnaHQoKSkgeworCQkJQm9vbGVhbiByZXMgPSBpc1ZhbGlkLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChyZXMgPT0gZmFsc2UpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOworCQkJfQorCQl9IGVsc2UgeworCQkJT2JqZWN0IG9iamVjdCA9IGlzVmFsaWQubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKKwkJCQluZXdWYWx1ZSA9IG9iamVjdC50b1N0cmluZygpOworCQkJfQorCQl9CisKKwkJU3RyaW5nIHVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkR3JvdXBQcm9wZXJ0eVZhbHVlVWlkKChTdHJpbmcpIGdyb3VwRGF0YS5nZXRVbmlxdWVJZCgpLCBpbmRleCk7CisJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gbmV3IFByb3BlcnR5VmFsdWVEYXRhKCk7CisJCXByb3BlcnR5VmFsdWVEYXRhLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJcHJvcGVydHlWYWx1ZURhdGEuc2V0VmFsdWUobmV3VmFsdWUpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZSB0byBncmFwaCB7fSIscHJvcGVydHlWYWx1ZURhdGEpOworCQlFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUocHJvcGVydHlWYWx1ZURhdGEsCisJCQkJUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB2YWx1ZSB0byBncmFwaCB7fSIsIHByb3BlcnR5VmFsdWVEYXRhKTsKKworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocHJvcGVydHlWYWx1ZURhdGEsCisJCQkJcHJvcGVydHlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfSU1QTCwgbnVsbCk7CisKKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiRmFpbGVkIHRvIGFzc29jaWF0ZSBwcm9wZXJ0eSB2YWx1ZSAiICsgdW5pcXVlSWQgKyAiIHRvIHByb3BlcnR5ICIgKyBwcm9wZXJ0eUlkCisJCQkJCSsgIiBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXM7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQljcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oZ3JvdXBEYXRhLCBwcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFLAorCQkJCW51bGwpOworCisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJGYWlsZWQgdG8gYXNzb2NpYXRlIGdyb3VwICIgKyBncm91cERhdGEuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKQorCQkJCQkrICIgdG8gcHJvcGVydHkgdmFsdWUgIiArIHVuaXF1ZUlkICsgIiBpbiBncmFwaC4gU3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXM7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlTm9kZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUdyb3VwVG9Db21wb25lbnQoR3JvdXBEYXRhIGdyb3VwRGF0YSwKKwkJCU5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIFN0cmluZyBjb21wb25lbnRJZCkgeworCQlVbmlxdWVJZERhdGEgY29tcG9uZW50SWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShub2RlVHlwZUVudW0sIGNvbXBvbmVudElkKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhc3NvY2lhdGluZyBjb21wb25lbnQge30gdG8gZ3JvdXAge30uIiwgY29tcG9uZW50SWQsIGdyb3VwRGF0YSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBncm91cERhdGEuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGNvbXBvbmVudElkRGF0YSwKKwkJCQlncm91cERhdGEsIEdyYXBoRWRnZUxhYmVscy5HUk9VUCwgcHJvcHMpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIGNvbXBvbmVudCB7fSB0byBncm91cCB7fS4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SWQsIGdyb3VwRGF0YSwgY3JlYXRlUmVsUmVzdWx0KTsKKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBhc3NvY2lhdGUgY29tcG9uZW50IHt9IHRvIGdyb3VwIHt9IGluIGdyYXBoLiBTdGF0dXMgaXMge30iLCBjb21wb25lbnRJZCwgZ3JvdXBEYXRhLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNyZWF0ZVJlbFJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUdyb3VwVG9Hcm91cFR5cGUoR3JvdXBEYXRhIGdyb3VwRGF0YSwKKwkJCVN0cmluZyBncm91cFR5cGVVaWQpIHsKKworCQlVbmlxdWVJZERhdGEgZ3JvdXBUeXBlSWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uR3JvdXBUeXBlLCBncm91cFR5cGVVaWQpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFzc29jaWF0aW5nIHt9IHRvIGdyb3VwIHR5cGUge30gKHVpZCA9IHt9KS4iLCBncm91cERhdGEsIGdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuZ2V0VHlwZSgpLCBncm91cFR5cGVVaWQpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihncm91cERhdGEsCisJCQkJZ3JvdXBUeXBlSWREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuVFlQRV9PRiwgbnVsbCk7CisJCQorCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcge30gdG8gZ3JvdXAgdHlwZSB7fSAodWlkID0ge30pLiBSZXN1bHQgaXMge30iLCBncm91cERhdGEsIGdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuZ2V0VHlwZSgpLCBncm91cFR5cGVVaWQsIGNyZWF0ZVJlbFJlc3VsdCk7CisJCX0KKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZVJlbFJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkR3JvdXAoTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSwgU3RyaW5nIGNvbXBvbmVudElkLAorCQkJR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbikgeworCQlyZXR1cm4gYWRkR3JvdXAobm9kZVR5cGVFbnVtLCBjb21wb25lbnRJZCwgZ3JvdXBEZWZpbml0aW9uLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEdyb3VwKE5vZGVUeXBlRW51bSBub2RlVHlwZUVudW0sIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlFaXRoZXI8R3JvdXBEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkR3JvdXBSZXMgPSBhZGRHcm91cFRvR3JhcGgobm9kZVR5cGVFbnVtLCBjb21wb25lbnRJZCwKKwkJCQkJZ3JvdXBEZWZpbml0aW9uKTsKKwkJCWlmIChhZGRHcm91cFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhZGRHcm91cFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQl9IGVsc2UgeworCisJCQkJR3JvdXBEYXRhIGdyb3VwRGF0YSA9IGFkZEdyb3VwUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCVN0cmluZyBncm91cFVpZCA9IGdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQlyZXN1bHQgPSB0aGlzLmdldEdyb3VwKGdyb3VwVWlkLCB0cnVlKTsKKworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4gRmFpbGVkIHRvIGFkZCBncm91cCB7fSB0byB7fSIsIGdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCksIG5vZGVUeXBlRW51bS50b1N0cmluZygpKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgR3JvdXBEZWZpbml0aW9uIGNvbnZlcnRHcm91cERhdGFUb0dyb3VwRGVmaW5pdGlvbihHcm91cERhdGEgZ3JvdXBEYXRhKSB7CisJCUdyb3VwRGVmaW5pdGlvbiBuZXdHcm91cERlZmluaXRpb24gPSBuZXcgR3JvdXBEZWZpbml0aW9uKGdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkpOworCQlyZXR1cm4gbmV3R3JvdXBEZWZpbml0aW9uOworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRHcm91cChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJcmV0dXJuIGdldEdyb3VwKHVuaXF1ZUlkLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwKFN0cmluZyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JvdXBGcm9tR3JhcGggPSB0aGlzLmdldEdyb3VwRnJvbUdyYXBoKHVuaXF1ZUlkKTsKKworCQkJaWYgKGdyb3VwRnJvbUdyYXBoLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdyb3VwRnJvbUdyYXBoLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBncm91cCB7fSBmcm9tIGdyYXBoLiBTdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCX0gZWxzZSB7CisJCQkJR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA9IGdyb3VwRnJvbUdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGdyb3VwRGVmaW5pdGlvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRHcm91cEZyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQpIHsKKworCQlyZXR1cm4gZ2V0R3JvdXBGcm9tR3JhcGgodW5pcXVlSWQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCisJfQorCisJLyoqCisJICogZ2V0IHRoZSBsaXN0IG9mIGFydGlmYWN0cyByZWxhdGVkIHRvIGEgZ2l2ZW4gZ3JvdXAKKwkgKiAKKwkgKiBAcGFyYW0gZ3JvdXBVbmlxdWVJZAorCSAqIEByZXR1cm4KKwkgKi8KKwkvLyBwcml2YXRlIEVpdGhlcjxMaXN0PFN0cmluZz4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRHcm91cEFydGlmYWN0cygKKwkvLyBTdHJpbmcgZ3JvdXBVbmlxdWVJZCkgeworCS8vCisJLy8gRWl0aGVyPExpc3Q8U3RyaW5nPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJLy8KKwkvLyBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPj4sCisJLy8gVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkvLyAuZ2V0Q2hpbGRyZW5Ob2RlcygKKwkvLyBVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uR3JvdXApLAorCS8vIGdyb3VwVW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5HUk9VUF9BUlRJRkFDVF9SRUYsCisJLy8gTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCS8vIGlmIChjaGlsZHJlbk5vZGVzLmlzUmlnaHQoKSkgeworCS8vIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCS8vIGlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJLy8gc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJLy8gfQorCS8vIHJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCS8vCisJLy8gfSBlbHNlIHsKKwkvLworCS8vIExpc3Q8U3RyaW5nPiBhcnRpZmFjdHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJLy8gTGlzdDxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IGNoaWxkcmVuTm9kZXMKKwkvLyAubGVmdCgpLnZhbHVlKCk7CisJLy8gaWYgKGxpc3QgIT0gbnVsbCkgeworCS8vIGZvciAoSW1tdXRhYmxlUGFpcjxBcnRpZmFjdERhdGEsIEdyYXBoRWRnZT4gcGFpciA6IGxpc3QpIHsKKwkvLyBBcnRpZmFjdERhdGEgYXJ0aWZhY3REYXRhID0gcGFpci5nZXRLZXkoKTsKKwkvLyBTdHJpbmcgdW5pcXVlSWQgPSBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpCisJLy8gLmdldFVuaXF1ZUlkKCk7CisJLy8gYXJ0aWZhY3RzTGlzdC5hZGQodW5pcXVlSWQpOworCS8vIH0KKwkvLyB9CisJLy8KKwkvLyBsb2cuZGVidWcoIlRoZSBhcnRpZmFjdHMgbGlzdCByZWxhdGVkIHRvIGdyb3VwIHt9IGlzIHt9IiwgZ3JvdXBVbmlxdWVJZCwgYXJ0aWZhY3RzTGlzdCk7CisJLy8gcmVzdWx0ID0gRWl0aGVyLmxlZnQoYXJ0aWZhY3RzTGlzdCk7CisJLy8gfQorCS8vCisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLworCS8vIH0KKworCS8qKgorCSAqIGdldCBtZW1iZXJzIG9mIGdyb3VwCisJICogCisJICogQHBhcmFtIGdyb3VwVW5pcXVlSWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIEVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXBNZW1iZXJzKFN0cmluZyBncm91cFVuaXF1ZUlkKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFN0cmluZz4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uR3JvdXApLCBncm91cFVuaXF1ZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkdST1VQX01FTUJFUiwgTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsIENvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisKKwkJaWYgKGNoaWxkcmVuTm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjaGlsZHJlbk5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKworCQl9IGVsc2UgeworCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXBJbnN0YU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4+IGxpc3QgPSBjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKGxpc3QgIT0gbnVsbCkgeworCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIEdyYXBoRWRnZT4gcGFpciA6IGxpc3QpIHsKKwkJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhIGNvbXBvbmVudEluc3RhbmNlRGF0YSA9IHBhaXIuZ2V0S2V5KCk7CisKKwkJCQkJU3RyaW5nIGNvbXBJbnN0VW5pcXVlSWQgPSBjb21wb25lbnRJbnN0YW5jZURhdGEuZ2V0Q29tcG9uZW50SW5zdERhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQkJU3RyaW5nIGNvbXBJbnN0TmFtZSA9IGNvbXBvbmVudEluc3RhbmNlRGF0YS5nZXROYW1lKCk7CisJCQkJCWNvbXBJbnN0YU1hcC5wdXQoY29tcEluc3ROYW1lLCBjb21wSW5zdFVuaXF1ZUlkKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNvbXBJbnN0YU1hcCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwVHlwZU9mR3JvdXAoU3RyaW5nIGdyb3VwVW5pcXVlSWQpIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxHcm91cFR5cGVEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JvdXBUeXBlUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Hcm91cCksIGdyb3VwVW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5UWVBFX09GLAorCQkJCU5vZGVUeXBlRW51bS5Hcm91cFR5cGUsIEdyb3VwVHlwZURhdGEuY2xhc3MpOworCisJCWlmIChncm91cFR5cGVSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBncm91cFR5cGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDYW5ub3QgZmluZCBncm91cCB0eXBlIGFzc29jaWF0ZWQgd2l0aCBjYXBhYmlsaXR5IHt9LiBTdGF0dXMgaXMge30iLCBncm91cFVuaXF1ZUlkLCBzdGF0dXMpOworCisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRGaW5kQXNzb2NpYXRpb25FcnJvcigiRmV0Y2ggR3JvdXAgdHlwZSIsCisJCQkJCU5vZGVUeXBlRW51bS5Hcm91cFR5cGUuZ2V0TmFtZSgpLCBncm91cFVuaXF1ZUlkLCBTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZ3JvdXBUeXBlUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlHcm91cFR5cGVEYXRhIGdyb3VwVHlwZURhdGEgPSBncm91cFR5cGVSZXMubGVmdCgpLnZhbHVlKCkuZ2V0S2V5KCk7CisKKwkJRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cFR5cGVCeVVpZCA9IGdyb3VwVHlwZU9wZXJhdGlvbgorCQkJCS5nZXRHcm91cFR5cGVCeVVpZChncm91cFR5cGVEYXRhLmdldEdyb3VwVHlwZURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSk7CisKKwkJcmV0dXJuIGdyb3VwVHlwZUJ5VWlkOworCisJfQorCisJLyoqCisJICogZ2V0IGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBncm91cC4KKwkgKiAKKwkgKiB0aGUgcHJvcGVydCBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20gdGhlIGdyb3VwIHR5cGUuCisJICogCisJICogQHBhcmFtIGdyb3VwVWlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxHcm91cFByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwUHJvcGVydGllcyhTdHJpbmcgZ3JvdXBVaWQpIHsKKworCQlMaXN0PEdyb3VwUHJvcGVydHk+IGdyb3VwUHJvcGVydGllc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyb3VwVHlwZU9mR3JvdXBSZXMgPSBnZXRHcm91cFR5cGVPZkdyb3VwKGdyb3VwVWlkKTsKKworCQlpZiAoZ3JvdXBUeXBlT2ZHcm91cFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdyb3VwVHlwZU9mR3JvdXBSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGVEZWZpbml0aW9uID0gZ3JvdXBUeXBlT2ZHcm91cFJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBHZXQgdGhlIHByb3BlcnRpZXMgb24gdGhlIGdyb3VwIHR5cGUgb2YgdGhpcyBncm91cAorCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gZ3JvdXBUeXBlUHJvcGVydGllcyA9IGdyb3VwVHlwZURlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCisJCWlmIChncm91cFR5cGVQcm9wZXJ0aWVzID09IG51bGwgfHwgdHJ1ZSA9PSBncm91cFR5cGVQcm9wZXJ0aWVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5PSyk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHVpZFRvUHJvcERlZk1hcCA9IGdyb3VwVHlwZVByb3BlcnRpZXMuc3RyZWFtKCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKHAgLT4gcC5nZXRVbmlxdWVJZCgpLCBwIC0+IHApKTsKKworCQkvLyBGaW5kIGFsbCBwcm9wZXJ0aWVzIHZhbHVlcyBvbiB0aGUgZ3JvdXAKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eUltcGxOb2RlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Hcm91cCksIGdyb3VwVWlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFLCBOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSwgUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCisJCWlmIChwcm9wZXJ0eUltcGxOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHByb3BlcnR5SW1wbE5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJZ3JvdXBQcm9wZXJ0aWVzTGlzdCA9IGdyb3VwVHlwZVByb3BlcnRpZXMuc3RyZWFtKCkKKwkJCQkJCS5tYXAocCAtPiBuZXcgR3JvdXBQcm9wZXJ0eShwLCBwLmdldERlZmF1bHRWYWx1ZSgpLCBudWxsKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZ3JvdXBQcm9wZXJ0aWVzTGlzdCk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IHByb3BlcnR5SW1wbE5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAobGlzdCA9PSBudWxsIHx8IHRydWUgPT0gbGlzdC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spOworCQl9CisKKwkJTGlzdDxTdHJpbmc+IHByb2Nlc3NlZFByb3BzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJZm9yIChJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5VmFsdWUgOiBsaXN0KSB7CisKKwkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gcHJvcGVydHlWYWx1ZS5nZXRMZWZ0KCk7CisJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZVVpZCA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRWYWx1ZSgpOworCisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eURlZlJlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUpLCBwcm9wZXJ0eVZhbHVlVWlkLAorCQkJCQkJCUdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCBOb2RlVHlwZUVudW0uUHJvcGVydHksIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJCQlpZiAocHJvcGVydHlEZWZSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydHlEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKworCQkJSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4gcHJvcGVydHlEZWZQYWlyID0gcHJvcGVydHlEZWZSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBwcm9wZXJ0eURlZlBhaXIubGVmdDsKKwkJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gcHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpOworCisJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gdWlkVG9Qcm9wRGVmTWFwLmdldChwcm9wZXJ0eVVuaXF1ZUlkKTsKKwkJCUdyb3VwUHJvcGVydHkgZ3JvdXBQcm9wZXJ0eSA9IG5ldyBHcm91cFByb3BlcnR5KHByb3BlcnR5RGVmaW5pdGlvbiwgdmFsdWUsIHByb3BlcnR5VmFsdWVVaWQpOworCisJCQlwcm9jZXNzZWRQcm9wcy5hZGQocHJvcGVydHlVbmlxdWVJZCk7CisKKwkJCWdyb3VwUHJvcGVydGllc0xpc3QuYWRkKGdyb3VwUHJvcGVydHkpOworCisJCX0KKworCQkvLyBGaW5kIGFsbCBwcm9wZXJ0aWVzIHdoaWNoIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgdmFsdWUgb24gdGhlIGdyb3VwLgorCQlMaXN0PEdyb3VwUHJvcGVydHk+IGxlZnRQcm9wcyA9IGdyb3VwVHlwZVByb3BlcnRpZXMuc3RyZWFtKCkKKwkJCQkvLyBmaWx0ZXIgb3V0IHRoZSBncm91cCB0eXBlIHByb3BlcnRpZXMgd2hpY2ggYWxyZWFkeSBwcm9jZXNzZWQKKwkJCQkuZmlsdGVyKHAgLT4gZmFsc2UgPT0gcHJvY2Vzc2VkUHJvcHMuY29udGFpbnMocC5nZXRVbmlxdWVJZCgpKSkKKwkJCQkubWFwKHAgLT4gbmV3IEdyb3VwUHJvcGVydHkocCwgcC5nZXREZWZhdWx0VmFsdWUoKSwgbnVsbCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCWlmIChsZWZ0UHJvcHMgIT0gbnVsbCkgeworCQkJZ3JvdXBQcm9wZXJ0aWVzTGlzdC5hZGRBbGwobGVmdFByb3BzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChncm91cFByb3BlcnRpZXNMaXN0KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbEdyb3Vwc0Zyb21HcmFwaChTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0pIHsKKworCQlyZXR1cm4gZ2V0QWxsR3JvdXBzRnJvbUdyYXBoKGNvbXBvbmVudElkLCBjb21wb25lbnRUeXBlRW51bSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsR3JvdXBzKFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBjb21wVHlwZUVudW0sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbEdyb3VwcyA9IHRoaXMuZ2V0QWxsR3JvdXBzRnJvbUdyYXBoKGNvbXBvbmVudElkLAorCQkJCQljb21wVHlwZUVudW0pOworCisJCQlpZiAoYWxsR3JvdXBzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbEdyb3Vwcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgYWxsIGdyb3VwcyBvZiBjb21wb25lbnQge30gZnJvbSBncmFwaC4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SWQsCisJCQkJCQlzdGF0dXMpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJCX0KKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCX0gZWxzZSB7CisJCQkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc0RlZmluaXRpb24gPSBhbGxHcm91cHMubGVmdCgpLnZhbHVlKCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JvdXBzRGVmaW5pdGlvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbEdyb3VwcyhTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcFR5cGVFbnVtKSB7CisJCXJldHVybiBnZXRBbGxHcm91cHMoY29tcG9uZW50SWQsIGNvbXBUeXBlRW51bSwgZmFsc2UpOworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JvdXBEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlR3JvdXBGcm9tR3JhcGgoU3RyaW5nIGdyb3VwVW5pcXVlSWQpIHsKKworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JvdXBGcm9tR3JhcGggPSB0aGlzLmdldEdyb3VwRnJvbUdyYXBoKGdyb3VwVW5pcXVlSWQpOworCQlpZiAoZ3JvdXBGcm9tR3JhcGguaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBncm91cEZyb21HcmFwaC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkNhbm5vdCBmaW5kIGdyb3VwIHt9IG9uIGdyYXBoLiBTdGF0dXMgaXMge30iLCBncm91cFVuaXF1ZUlkLCBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA9IGdyb3VwRnJvbUdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQkvLyAxLiBkZWxldGUgYWxsIHByb3BlcnRpZXMgdmFsdWVzIG5vZGVzCisJCUxpc3Q8R3JvdXBQcm9wZXJ0eT4gcHJvcGVydGllcyA9IGdyb3VwRGVmaW5pdGlvbi5nZXRQcm9wZXJ0aWVzKCk7CisJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCWZvciAoR3JvdXBQcm9wZXJ0eSBncm91cFByb3BlcnR5IDogcHJvcGVydGllcykgeworCQkJCVN0cmluZyBwcm9wVmFsdWVVbmlxdWVJZCA9IGdyb3VwUHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKTsKKworCQkJCWlmIChwcm9wVmFsdWVVbmlxdWVJZCAhPSBudWxsKSB7CisJCQkJCVVuaXF1ZUlkRGF0YSB1bmlxdWVJZERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlLCBwcm9wVmFsdWVVbmlxdWVJZCk7CisJCQkJCUVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJCQkuZGVsZXRlTm9kZSh1bmlxdWVJZERhdGEsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJCQkJaWYgKGRlbGV0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBncm91cEZyb21HcmFwaC5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBTdHJpbmcuZm9ybWF0KAorCQkJCQkJCQkiRmFpbGVkIHRvIGRlbGV0ZSBwcm9wZXJ0eSB7fSB1bmRlciBncm91cCB7fSIgKyBncm91cFVuaXF1ZUlkCisJCQkJCQkJCQkJKyAiIG9uIGdyYXBoLiBTdGF0dXMgaXMge30iLAorCQkJCQkJCQlwcm9wVmFsdWVVbmlxdWVJZCwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgc3RhdHVzLm5hbWUoKSk7CisJCQkJCQlsb2cuZGVidWcoZGVzY3JpcHRpb24pOworCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkRGVsZXRlTm9kZUVycm9yKERFTEVUSU5HX0dST1VQLCBwcm9wVmFsdWVVbmlxdWVJZCwKKwkJCQkJCQkJc3RhdHVzLm5hbWUoKSk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsb2cudHJhY2UoIlByb3BlcnR5IHt9IHdhcyBkZWxldGVkIGZyb20gZ2VvdXAge30iLCBwcm9wVmFsdWVVbmlxdWVJZCwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyAyLiBkZWxldGUgdGhlIGdyb3VwIG5vZGUKKwkJVW5pcXVlSWREYXRhIHVuaXF1ZUlkRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkdyb3VwLCBncm91cFVuaXF1ZUlkKTsKKwkJRWl0aGVyPEdyb3VwRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZSh1bmlxdWVJZERhdGEsIEdyb3VwRGF0YS5jbGFzcyk7CisJCWlmIChkZWxldGVOb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ3JvdXBGcm9tR3JhcGgucmlnaHQoKS52YWx1ZSgpOworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gU3RyaW5nLmZvcm1hdCgKKwkJCQkJIkZhaWxlZCB0byBkZWxldGUgZ3JvdXAge30gd2l0aCB1aWQgIiArIGdyb3VwVW5pcXVlSWQgKyAiIG9uIGdyYXBoLiBTdGF0dXMgaXMge30iLAorCQkJCQlncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLCBncm91cFVuaXF1ZUlkLCBzdGF0dXMubmFtZSgpKTsKKwkJCWxvZy5kZWJ1ZyhkZXNjcmlwdGlvbik7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWREZWxldGVOb2RlRXJyb3IoREVMRVRJTkdfR1JPVVAsIGdyb3VwVW5pcXVlSWQsIHN0YXR1cy5uYW1lKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9IGVsc2UgeworCQkJbG9nLnRyYWNlKCJHcm91cCB7fSB3YXMgZGVsZXRlZCBmcm9tIGdyb3VwIiwgZ3JvdXBVbmlxdWVJZCk7CisJCX0KKworCQlHcm91cERhdGEgZ3JvdXBEYXRhID0gZGVsZXRlTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGdyb3VwRGF0YSk7CisJfQorCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUdyb3VwKFN0cmluZyBncm91cFVuaXF1ZUlkKSB7CisJCXJldHVybiBkZWxldGVHcm91cChncm91cFVuaXF1ZUlkLCBmYWxzZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUdyb3VwKFN0cmluZyBncm91cFVuaXF1ZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxHcm91cERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVHcm91cCA9IHRoaXMuZGVsZXRlR3JvdXBGcm9tR3JhcGgoZ3JvdXBVbmlxdWVJZCk7CisKKwkJCWlmIChkZWxldGVHcm91cC5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVHcm91cC5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGdyb3VwIHt9IGZyb20gZ3JhcGguIFN0YXR1cyBpcyAiLCBncm91cFVuaXF1ZUlkLCBzdGF0dXMubmFtZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCX0gZWxzZSB7CisJCQkJR3JvdXBEYXRhIGdyb3VwRGF0YSA9IGRlbGV0ZUdyb3VwLmxlZnQoKS52YWx1ZSgpOworCQkJCUdyb3VwRGVmaW5pdGlvbiBncm91cERlZmluaXRpb24gPSBjb252ZXJ0R3JvdXBEYXRhVG9Hcm91cERlZmluaXRpb24oZ3JvdXBEYXRhKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChncm91cERlZmluaXRpb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRXhlY3V0ZVJvbGxiYWNrRXJyb3IoIlJvbGxiYWNrIG9uIGdyYXBoIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsR3JvdXBzRnJvbUdyYXBoKFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSkgeworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8R3JvdXBEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShjb21wb25lbnRUeXBlRW51bSksIGNvbXBvbmVudElkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkdST1VQLCBOb2RlVHlwZUVudW0uR3JvdXAsIEdyb3VwRGF0YS5jbGFzcyk7CisKKwkJaWYgKGNoaWxkcmVuTm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjaGlsZHJlbk5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkRmluZEFsbE5vZGVzRXJyb3IoREVMRVRJTkdfQUxMX0dST1VQUywKKwkJCQkJCU5vZGVUeXBlRW51bS5Hcm91cC5uYW1lKCksIGNvbXBvbmVudElkLCBzdGF0dXMubmFtZSgpKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlMaXN0PEltbXV0YWJsZVBhaXI8R3JvdXBEYXRhLCBHcmFwaEVkZ2U+PiBsaXN0ID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGxpc3QgIT0gbnVsbCkgeworCQkJZm9yIChJbW11dGFibGVQYWlyPEdyb3VwRGF0YSwgR3JhcGhFZGdlPiBwYWlyIDogbGlzdCkgeworCQkJCVN0cmluZyB1bmlxdWVJZCA9IHBhaXIubGVmdC5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQlFaXRoZXI8R3JvdXBEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlR3JvdXBGcm9tR3JhcGggPSBkZWxldGVHcm91cEZyb21HcmFwaCh1bmlxdWVJZCk7CisJCQkJaWYgKGRlbGV0ZUdyb3VwRnJvbUdyYXBoLmlzUmlnaHQoKSkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVHcm91cEZyb21HcmFwaC5yaWdodCgpLnZhbHVlKCk7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZERlbGV0ZU5vZGVFcnJvcihERUxFVElOR19BTExfR1JPVVBTLCB1bmlxdWVJZCwKKwkJCQkJCQlzdGF0dXMubmFtZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCQlHcm91cERhdGEgZ3JvdXBEYXRhID0gZGVsZXRlR3JvdXBGcm9tR3JhcGgubGVmdCgpLnZhbHVlKCk7CisJCQkJR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA9IGNvbnZlcnRHcm91cERhdGFUb0dyb3VwRGVmaW5pdGlvbihncm91cERhdGEpOworCQkJCXJlc3VsdC5hZGQoZ3JvdXBEZWZpbml0aW9uKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxHcm91cHMoU3RyaW5nIGNvbXBvbmVudElkLAorCQkJTm9kZVR5cGVFbnVtIGNvbXBUeXBlRW51bSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsR3JvdXBzID0gdGhpcy5kZWxldGVBbGxHcm91cHNGcm9tR3JhcGgoY29tcG9uZW50SWQsCisJCQkJCWNvbXBUeXBlRW51bSk7CisKKwkJCWlmIChhbGxHcm91cHMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsR3JvdXBzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgYWxsIGdyb3VwcyBvZiBjb21wb25lbnQge30gZnJvbSBncmFwaC4gU3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SWQsIHN0YXR1cyk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJfSBlbHNlIHsKKwkJCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzRGVmaW5pdGlvbiA9IGFsbEdyb3Vwcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChncm91cHNEZWZpbml0aW9uKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUV4ZWN1dGVSb2xsYmFja0Vycm9yKCJSb2xsYmFjayBvbiBncmFwaCIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsR3JvdXBzKFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBjb21wVHlwZUVudW0pIHsKKwkJcmV0dXJuIGRlbGV0ZUFsbEdyb3Vwcyhjb21wb25lbnRJZCwgY29tcFR5cGVFbnVtLCBmYWxzZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHByZXBhcmVHcm91cHNGb3JDbG9uaW5nKAorCQkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50IG9yaWdSZXNvdXJjZSwKKwkJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIE1hcDxTdHJpbmcsIFN0cmluZz4+IGNsb25lSW5zdGFuY2VzKSB7CisKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc1RvQ3JlYXRlID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KGdyb3Vwc1RvQ3JlYXRlKTsKKworCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzID0gb3JpZ1Jlc291cmNlLmdldEdyb3VwcygpOworCisJCWlmIChncm91cHMgIT0gbnVsbCkgeworCQkJLy8ga2VlcCB0eXBlVWlkCisJCQkvLyBrZWVwIGFydGlmYWN0cyB1aWRzCisJCQkvLyByZW1vdmUgcHJvcGVydGllcyB3aXRob3V0IHZhbHVlVW5pcXVlSWQKKwkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA6IGdyb3VwcykgeworCisJCQkJR3JvdXBEZWZpbml0aW9uIGdkVG9DcmVhdGUgPSBuZXcgR3JvdXBEZWZpbml0aW9uKGdyb3VwRGVmaW5pdGlvbik7CisJCQkJZ2RUb0NyZWF0ZS5zZXRVbmlxdWVJZChudWxsKTsKKwkJCQlnZFRvQ3JlYXRlLnNldE1lbWJlcnMobnVsbCk7CisKKwkJCQlMaXN0PEdyb3VwUHJvcGVydHk+IHByb3BlcnRpZXMgPSBncm91cERlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCQkJLy8gVGFrZSBwcm9wZXJ0aWVzIHdoaWNoIHdhcyB1cGRhdGVkIGluIHRoZQorCQkJCQkvLyBncm91cChnZXRWYWx1ZVVuaXF1ZVVpZCAhPSBudWxsKSwKKwkJCQkJLy8gVGhlbiBzZXQgbnVsbCBpbnN0ZWFkIG9mIHRoZSB2YWx1ZShwcmVwYXJlIGZvciB0aGUKKwkJCQkJLy8gY3JlYXRpb24pLgorCQkJCQlMaXN0PEdyb3VwUHJvcGVydHk+IHByb3BlcnRpZXNUb1VwZGF0ZSA9IHByb3BlcnRpZXMuc3RyZWFtKCkKKwkJCQkJCQkuZmlsdGVyKHAgLT4gcC5nZXRWYWx1ZVVuaXF1ZVVpZCgpICE9IG51bGwpLm1hcChwIC0+IHsKKwkJCQkJCQkJcC5zZXRWYWx1ZVVuaXF1ZVVpZChudWxsKTsKKwkJCQkJCQkJcmV0dXJuIHA7CisJCQkJCQkJfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJCQlnZFRvQ3JlYXRlLnNldFByb3BlcnRpZXMocHJvcGVydGllc1RvVXBkYXRlKTsKKworCQkJCX0KKworCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gbWVtYmVycyA9IGdyb3VwRGVmaW5pdGlvbi5nZXRNZW1iZXJzKCk7CisJCQkJaWYgKGNsb25lSW5zdGFuY2VzICE9IG51bGwpIHsKKwkJCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY3JlYXRlZEluc3RhbmNlcyA9IGNsb25lSW5zdGFuY2VzLmxlZnQ7CisJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gb2xkQ29tcFVpZFRvTmV3ID0gY2xvbmVJbnN0YW5jZXMucmlnaHQ7CisJCQkJCWlmIChtZW1iZXJzICE9IG51bGwgJiYgY3JlYXRlZEluc3RhbmNlcyAhPSBudWxsKSB7CisKKwkJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gY29tcEluc3RJZFRvTmFtZSA9IGNyZWF0ZWRJbnN0YW5jZXMuc3RyZWFtKCkKKwkJCQkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0VW5pcXVlSWQoKSwgcCAtPiBwLmdldE5hbWUoKSkpOworCisJCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnNUb0NyZWF0ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQkJCQkJZm9yIChTdHJpbmcgb2xkQ29tcEluc3RJZCA6IG1lbWJlcnMudmFsdWVzKCkpIHsKKwkJCQkJCQlTdHJpbmcgbmV3Q29tcEluc3RVaWQgPSBvbGRDb21wVWlkVG9OZXcuZ2V0KG9sZENvbXBJbnN0SWQpOworCQkJCQkJCWlmIChuZXdDb21wSW5zdFVpZCA9PSBudWxsKSB7CisJCQkJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk1BVENIX05PVF9GT1VORCk7CisJCQkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCQkJfQorCQkJCQkJCVN0cmluZyBuZXdDb21wSW5zdE5hbWUgPSBjb21wSW5zdElkVG9OYW1lLmdldChuZXdDb21wSW5zdFVpZCk7CisJCQkJCQkJbWVtYmVyc1RvQ3JlYXRlLnB1dChuZXdDb21wSW5zdE5hbWUsIG5ld0NvbXBJbnN0VWlkKTsKKwkJCQkJCX0KKworCQkJCQkJZ2RUb0NyZWF0ZS5zZXRNZW1iZXJzKG1lbWJlcnNUb0NyZWF0ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlsb2cuZGVidWcoIlRoZSBncm91cCBkZWZpbml0aW9uIGZvciBjcmVhdGlvbiBpcyB7fSIsIGdkVG9DcmVhdGUpOworCisJCQkJZ3JvdXBzVG9DcmVhdGUuYWRkKGdkVG9DcmVhdGUpOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRHcm91cHMoTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSwKKwkJCVN0cmluZyBjb21wb25lbnRJZCwgTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3VwcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGNyZWF0ZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCWlmIChncm91cHMgIT0gbnVsbCkgeworCQkJCWZvciAoR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA6IGdyb3VwcykgeworCQkJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRHcm91cCA9IHRoaXMuYWRkR3JvdXAobm9kZVR5cGVFbnVtLCBjb21wb25lbnRJZCwKKwkJCQkJCQlncm91cERlZmluaXRpb24sIHRydWUpOworCQkJCQlpZiAoYWRkR3JvdXAuaXNSaWdodCgpKSB7CisJCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZEdyb3VwLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCWNyZWF0ZWRHcm91cHMuYWRkKGFkZEdyb3VwLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNyZWF0ZWRHcm91cHMpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUV4ZWN1dGVSb2xsYmFja0Vycm9yKCJSb2xsYmFjayBvbiBncmFwaCIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBc3NvY2lhdGVkR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZUZyb21HcmFwaCgKKwkJCVN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkKSB7CisKKwkJTGlzdDxTdHJpbmc+IGdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFaXRoZXI8TGlzdDxTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JvdXBzKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEdyb3VwRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRQYXJlbnROb2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIGNvbXBvbmVudEluc3RhbmNlSWQsCisJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuR1JPVVBfTUVNQkVSLCBOb2RlVHlwZUVudW0uR3JvdXAsIEdyb3VwRGF0YS5jbGFzcyk7CisKKwkJaWYgKHBhcmVudE5vZGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcGFyZW50Tm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRGaW5kUGFyZW50RXJyb3IoIkZldGNoR3JvdXBNZW1iZXJzIiwgY29tcG9uZW50SW5zdGFuY2VJZCwKKwkJCQkJCXN0YXR1cy5uYW1lKCkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPEdyb3VwRGF0YSwgR3JhcGhFZGdlPj4gZmV0Y2hlZEdyb3VwcyA9IHBhcmVudE5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoZmV0Y2hlZEdyb3VwcyAhPSBudWxsKSB7CisJCQlMaXN0PFN0cmluZz4gbGlzdCA9IGZldGNoZWRHcm91cHMuc3RyZWFtKCkubWFwKHAgLT4gcC5sZWZ0LmdldEdyb3VwRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCWdyb3Vwcy5hZGRBbGwobGlzdCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFzc29jaWF0ZWRHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlKAorCQkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPExpc3Q8U3RyaW5nPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyb3VwcyA9IHRoaXMKKwkJCQkJLmdldEFzc29jaWF0ZWRHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlRnJvbUdyYXBoKGNvbXBvbmVudEluc3RhbmNlSWQpOworCisJCQlpZiAoZ3JvdXBzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdyb3Vwcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gZ3JvdXBzLmxlZnQoKS52YWx1ZSgpOworCisJCQlyZXR1cm4gRWl0aGVyLmxlZnQobGlzdCk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFN0cmluZz4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFzc29jaWF0ZWRHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlKAorCQkJU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQpIHsKKwkJcmV0dXJuIGdldEFzc29jaWF0ZWRHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlSWQsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8R3JhcGhSZWxhdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVHcm91cHNUb0NvbXBvbmVudEluc3RhbmNlT25HcmFwaCgKKwkJCUxpc3Q8U3RyaW5nPiBncm91cHMsIFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBTdHJpbmcgY29tcEluc3ROYW1lKSB7CisKKwkJTGlzdDxHcmFwaFJlbGF0aW9uPiByZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRWl0aGVyPExpc3Q8R3JhcGhSZWxhdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIubGVmdChyZWxhdGlvbnMpOworCisJCWlmIChncm91cHMgIT0gbnVsbCAmJiBmYWxzZSA9PSBncm91cHMuaXNFbXB0eSgpKSB7CisKKwkJCVVuaXF1ZUlkRGF0YSBjb21wSW5zdERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLCBjb21wb25lbnRJbnN0YW5jZUlkKTsKKworCQkJZm9yIChTdHJpbmcgZ3JvdXBJZCA6IGdyb3VwcykgeworCQkJCVVuaXF1ZUlkRGF0YSBncm91cERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5Hcm91cCwgZ3JvdXBJZCk7CisKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjb21wSW5zdE5hbWUpOworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oZ3JvdXBEYXRhLAorCQkJCQkJY29tcEluc3REYXRhLCBHcmFwaEVkZ2VMYWJlbHMuR1JPVVBfTUVNQkVSLCBwcm9wcyk7CisJCQkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjcmVhdGVSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCk7CisJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJGYWlsZWQgdG8gYXNzb2NpYXRlIGdyb3VwICIgKyBncm91cERhdGEuZ2V0VW5pcXVlSWQoKQorCQkJCQkJCSsgIiB0byBjb21wb25lbnQgaW5zdGFuY2UgIiArIGNvbXBJbnN0TmFtZSArICIgaW4gZ3JhcGguIFN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQVNTT0NJQVRJTkdfR1JPVVBfVE9fQ09NUF9JTlNULCBkZXNjcmlwdGlvbiwKKwkJCQkJCQlFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlHcmFwaFJlbGF0aW9uIGdyYXBoUmVsYXRpb24gPSBjcmVhdGVSZWxhdGlvbi5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZWxhdGlvbnMuYWRkKGdyYXBoUmVsYXRpb24pOworCQkJfQorCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZShMaXN0PFN0cmluZz4gZ3JvdXBzLCBTdHJpbmcgY29tcG9uZW50SW5zdGFuY2VJZCwKKwkJCVN0cmluZyBjb21wSW5zdE5hbWUpIHsKKworCQlyZXR1cm4gYXNzb2NpYXRlR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZShncm91cHMsIGNvbXBvbmVudEluc3RhbmNlSWQsIGNvbXBJbnN0TmFtZSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUdyb3Vwc1RvQ29tcG9uZW50SW5zdGFuY2UoTGlzdDxTdHJpbmc+IGdyb3VwcywgU3RyaW5nIGNvbXBvbmVudEluc3RhbmNlSWQsCisJCQlTdHJpbmcgY29tcEluc3ROYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCUVpdGhlcjxMaXN0PEdyYXBoUmVsYXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGhpcworCQkJCQkuYXNzb2NpYXRlR3JvdXBzVG9Db21wb25lbnRJbnN0YW5jZU9uR3JhcGgoZ3JvdXBzLCBjb21wb25lbnRJbnN0YW5jZUlkLCBjb21wSW5zdE5hbWUpOworCisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJfQorCQkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0ICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PEdyYXBoUmVsYXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZUFsbEdyb3Vwc0Zyb21BcnRpZmFjdE9uR3JhcGgoU3RyaW5nIGNvbXBvbmVudElkLAorCQkJTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTdHJpbmcgYXJ0aWZhY3RJZCkgeworCisJCUxpc3Q8R3JhcGhSZWxhdGlvbj4gcmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUVpdGhlcjxMaXN0PEdyYXBoUmVsYXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLmxlZnQocmVsYXRpb25zKTsKKworCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsR3JvdXBzRnJvbUdyYXBoID0gZ2V0QWxsR3JvdXBzRnJvbUdyYXBoKGNvbXBvbmVudElkLAorCQkJCWNvbXBvbmVudFR5cGVFbnVtLCB0cnVlLCB0cnVlLCBmYWxzZSk7CisJCWlmIChhbGxHcm91cHNGcm9tR3JhcGguaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxHcm91cHNGcm9tR3JhcGgucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGFsbEdyb3VwcyA9IGFsbEdyb3Vwc0Zyb21HcmFwaC5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGFsbEdyb3VwcyA9PSBudWxsIHx8IGFsbEdyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spOworCQl9CisKKwkJLy8gRmluZCBhbGwgZ3JvdXBzIHdoaWNoIGNvbnRhaW5zIHRoaXMgYXJ0aWZhY3QgaWQKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGFzc29jaWF0ZWRHcm91cHMgPSBhbGxHcm91cHMuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKHAgLT4gcC5nZXRBcnRpZmFjdHMoKSAhPSBudWxsICYmIHAuZ2V0QXJ0aWZhY3RzKCkuY29udGFpbnMoYXJ0aWZhY3RJZCkpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJaWYgKGFzc29jaWF0ZWRHcm91cHMgIT0gbnVsbCAmJiBmYWxzZSA9PSBhc3NvY2lhdGVkR3JvdXBzLmlzRW1wdHkoKSkgeworCQkJbG9nLmRlYnVnKCJUaGUgZ3JvdXBzIHt9IGNvbnRhaW5zIHRoZSBhcnRpZmFjdCB7fSIsIGFzc29jaWF0ZWRHcm91cHMuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSksIGFydGlmYWN0SWQpOworCisJCQlVbmlxdWVJZERhdGEgYXJ0aWZhY3REYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIGFydGlmYWN0SWQpOworCQkJZm9yIChHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uIDogYXNzb2NpYXRlZEdyb3VwcykgeworCQkJCVVuaXF1ZUlkRGF0YSBncm91cERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5Hcm91cCwgZ3JvdXBEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlUmVsYXRpb24oZ3JvdXBEYXRhLAorCQkJCQkJYXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2VMYWJlbHMuR1JPVVBfQVJUSUZBQ1RfUkVGKTsKKwkJCQlpZiAoZGVsZXRlUmVsYXRpb24uaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRlbGV0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJCX0KKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKworCQkJCXJlbGF0aW9ucy5hZGQoZGVsZXRlUmVsYXRpb24ubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIk5vIGdyb3VwIHVuZGVyIGNvbXBvbmVudCBpZCB7fSBpcyBhc3NvY2lhdGVkIHRvIGFydGlmYWN0IHt9IiwgY29tcG9uZW50SWQsIGFydGlmYWN0SWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5PSyk7CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXBGcm9tR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBib29sZWFuIHNraXBQcm9wZXJ0aWVzLAorCQkJYm9vbGVhbiBza2lwTWVtYmVycywgYm9vbGVhbiBza2lwQXJ0aWZhY3RzKSB7CisKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJRWl0aGVyPEdyb3VwRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyb3VwUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkdyb3VwKSwgdW5pcXVlSWQsIEdyb3VwRGF0YS5jbGFzcyk7CisJCWlmIChncm91cFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdyb3VwUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGdyb3VwIHt9ICBmcm9tIGdyYXBoLiBTdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgc3RhdHVzKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yKCJGZXRjaCBHcm91cCIsIHVuaXF1ZUlkLAorCQkJCQlTdHJpbmcudmFsdWVPZihzdGF0dXMpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUdyb3VwRGF0YSBncm91cERhdGEgPSBncm91cFJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uID0gY29udmVydEdyb3VwRGF0YVRvR3JvdXBEZWZpbml0aW9uKGdyb3VwRGF0YSk7CisKKwkJRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cFR5cGVPZkdyb3VwID0gZ2V0R3JvdXBUeXBlT2ZHcm91cCh1bmlxdWVJZCk7CisKKwkJaWYgKGdyb3VwVHlwZU9mR3JvdXAuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBncm91cFR5cGVPZkdyb3VwLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdHkgdHlwZSBvZiBjYXBhYmlsaXR5IHt9LiBTdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgc3RhdHVzKTsKKworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGVEZWZpbml0aW9uID0gZ3JvdXBUeXBlT2ZHcm91cC5sZWZ0KCkudmFsdWUoKTsKKworCQlncm91cERlZmluaXRpb24uc2V0VHlwZVVpZChncm91cFR5cGVEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCisJCWlmIChmYWxzZSA9PSBza2lwTWVtYmVycykgeworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIFN0cmluZz4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBtZW1iZXJzUmVzID0gZ2V0R3JvdXBNZW1iZXJzKHVuaXF1ZUlkKTsKKwkJCWlmIChtZW1iZXJzUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IG1lbWJlcnNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMgPSBtZW1iZXJzUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCWdyb3VwRGVmaW5pdGlvbi5zZXRNZW1iZXJzKG1lbWJlcnMpOworCQkJfQorCQl9CisKKwkJaWYgKGZhbHNlID09IHNraXBQcm9wZXJ0aWVzKSB7CisJCQlFaXRoZXI8TGlzdDxHcm91cFByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHByb3BlcnRpZXNSZXMgPSBnZXRHcm91cFByb3BlcnRpZXModW5pcXVlSWQpOworCQkJaWYgKHByb3BlcnRpZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydGllc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUxpc3Q8R3JvdXBQcm9wZXJ0eT4gcHJvcGVydGllcyA9IHByb3BlcnRpZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJZ3JvdXBEZWZpbml0aW9uLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisJCQl9CisJCX0KKworCQlpZiAoZmFsc2UgPT0gc2tpcEFydGlmYWN0cykgeworCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RzUmVzID0gZ2V0R3JvdXBBcnRpZmFjdHNQYWlycygKKwkJCQkJdW5pcXVlSWQpOworCQkJaWYgKGFydGlmYWN0c1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhcnRpZmFjdHNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzVWlkID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJTGlzdDxTdHJpbmc+IGFydGlmYWN0c1VVSUQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4+IGxpc3QgPSBhcnRpZmFjdHNSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJaWYgKGxpc3QgIT0gbnVsbCkgeworCQkJCQlmb3IgKEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+IHBhaXIgOiBsaXN0KSB7CisJCQkJCQlTdHJpbmcgdWlkID0gcGFpci5sZWZ0OworCQkJCQkJU3RyaW5nIFVVSUQgPSBwYWlyLnJpZ2h0OworCQkJCQkJYXJ0aWZhY3RzVWlkLmFkZCh1aWQpOworCQkJCQkJYXJ0aWZhY3RzVVVJRC5hZGQoVVVJRCk7CisJCQkJCX0KKwkJCQkJZ3JvdXBEZWZpbml0aW9uLnNldEFydGlmYWN0cyhhcnRpZmFjdHNVaWQpOworCQkJCQlncm91cERlZmluaXRpb24uc2V0QXJ0aWZhY3RzVXVpZChhcnRpZmFjdHNVVUlEKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JvdXBEZWZpbml0aW9uKTsKKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNHcm91cEV4aXN0KFN0cmluZyBncm91cE5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxMaXN0PEdyb3VwRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJHcm91cCA9IG51bGw7CisJCXRyeSB7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlwcm9wZXJ0aWVzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgZ3JvdXBOYW1lKTsKKworCQkJZWl0aGVyR3JvdXAgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uR3JvdXAsIHByb3BlcnRpZXMsIEdyb3VwRGF0YS5jbGFzcyk7CisJCQlyZXR1cm4gZWl0aGVyR3JvdXAuaXNMZWZ0KCkgJiYgIWVpdGhlckdyb3VwLmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKTsKKworCQl9IGZpbmFsbHkgeworCQkJaGFuZGxlVHJhbnNhY3Rpb25Db21taXRSb2xsYmFjayhpblRyYW5zYWN0aW9uLCBlaXRoZXJHcm91cCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbEdyb3Vwc0Zyb21HcmFwaChTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIGJvb2xlYW4gc2tpcFByb3BlcnRpZXMsIGJvb2xlYW4gc2tpcE1lbWJlcnMsIGJvb2xlYW4gc2tpcEFydGlmYWN0cykgeworCisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PEdyb3VwRGVmaW5pdGlvbj4oKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEdyb3VwRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoY29tcG9uZW50VHlwZUVudW0pLCBjb21wb25lbnRJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5HUk9VUCwgTm9kZVR5cGVFbnVtLkdyb3VwLCBHcm91cERhdGEuY2xhc3MpOworCisJCWlmIChjaGlsZHJlbk5vZGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8R3JvdXBEYXRhLCBHcmFwaEVkZ2U+PiBncmFwaEdyb3VwcyA9IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJaWYgKGdyYXBoR3JvdXBzID09IG51bGwgfHwgdHJ1ZSA9PSBncmFwaEdyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCisJCS8vIENvbnN1bWVyPFN0cmluZz4gY29uc3VtZXIgPSAoeCkgLT4gZ2V0R3JvdXAoeCk7CisJCS8vIFN0cmVhbVV0aWxzLnRha2VXaGlsZShncmFwaEdyb3Vwcy5zdHJlYW0oKS5tYXAocCAtPgorCQkvLyBwLmxlZnQuZ2V0VW5pcXVlSWQoKSksIGNvbnN1bWVyKTsKKworCQlmb3IgKEltbXV0YWJsZVBhaXI8R3JvdXBEYXRhLCBHcmFwaEVkZ2U+IHBhaXIgOiBncmFwaEdyb3VwcykgeworCisJCQlTdHJpbmcgZ3JvdXBVbmlxdWVJZCA9IHBhaXIubGVmdC5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cFJlcyA9IHRoaXMuZ2V0R3JvdXBGcm9tR3JhcGgoZ3JvdXBVbmlxdWVJZCwKKwkJCQkJc2tpcFByb3BlcnRpZXMsIHNraXBNZW1iZXJzLCBza2lwQXJ0aWZhY3RzKTsKKworCQkJaWYgKGdyb3VwUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdyb3VwUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJCX0KKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9IGVsc2UgeworCQkJCWdyb3Vwcy5hZGQoZ3JvdXBSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoZ3JvdXBzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkaXNzb2NpYXRlQWxsR3JvdXBzRnJvbUFydGlmYWN0KFN0cmluZyBjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLAorCQkJU3RyaW5nIGFydGlmYWN0SWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJRWl0aGVyPExpc3Q8R3JhcGhSZWxhdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSB0aGlzCisJCQkJCS5kaXNzb2NpYXRlQWxsR3JvdXBzRnJvbUFydGlmYWN0T25HcmFwaChjb21wb25lbnRJZCwgY29tcG9uZW50VHlwZUVudW0sIGFydGlmYWN0SWQpOworCisJCQlpZiAoZWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJfQorCQkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0ICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGlzc29jaWF0ZUFsbEdyb3Vwc0Zyb21BcnRpZmFjdChTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwKKwkJCVN0cmluZyBhcnRpZmFjdElkKSB7CisKKwkJcmV0dXJuIGRpc3NvY2lhdGVBbGxHcm91cHNGcm9tQXJ0aWZhY3QoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLCBhcnRpZmFjdElkLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGRpc3NvY2lhdGVBbmRBc3NvY2lhdGVHcm91cHNGcm9tQXJ0aWZhY3RPbkdyYXBoKFN0cmluZyBjb21wb25lbnRJZCwKKwkJCU5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgU3RyaW5nIG9sZEFydGlmYWN0SWQsIEFydGlmYWN0RGF0YSBuZXdBcnRpZmFjdCkgeworCisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxHcm91cHNGcm9tR3JhcGggPSBnZXRBbGxHcm91cHNGcm9tR3JhcGgoY29tcG9uZW50SWQsCisJCQkJY29tcG9uZW50VHlwZUVudW0sIHRydWUsIHRydWUsIGZhbHNlKTsKKwkJaWYgKGFsbEdyb3Vwc0Zyb21HcmFwaC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbEdyb3Vwc0Zyb21HcmFwaC5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJTGlzdDxHcm91cERlZmluaXRpb24+IGFsbEdyb3VwcyA9IGFsbEdyb3Vwc0Zyb21HcmFwaC5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGFsbEdyb3VwcyA9PSBudWxsIHx8IGFsbEdyb3Vwcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfQorCisJCS8vIEZpbmQgYWxsIGdyb3VwcyB3aGljaCBjb250YWlucyB0aGlzIGFydGlmYWN0IGlkCisJCUxpc3Q8R3JvdXBEZWZpbml0aW9uPiBhc3NvY2lhdGVkR3JvdXBzID0gYWxsR3JvdXBzLnN0cmVhbSgpCisJCQkJLmZpbHRlcihwIC0+IHAuZ2V0QXJ0aWZhY3RzKCkgIT0gbnVsbCAmJiBwLmdldEFydGlmYWN0cygpLmNvbnRhaW5zKG9sZEFydGlmYWN0SWQpKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCWlmIChhc3NvY2lhdGVkR3JvdXBzICE9IG51bGwgJiYgZmFsc2UgPT0gYXNzb2NpYXRlZEdyb3Vwcy5pc0VtcHR5KCkpIHsKKworCQkJbG9nLmRlYnVnKCJUaGUgZ3JvdXBzIHt9IGNvbnRhaW5zIHRoZSBhcnRpZmFjdCB7fSIsIGFzc29jaWF0ZWRHcm91cHMuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSksIG9sZEFydGlmYWN0SWQpOworCisJCQlVbmlxdWVJZERhdGEgb2xkQXJ0aWZhY3REYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIG9sZEFydGlmYWN0SWQpOworCQkJVW5pcXVlSWREYXRhIG5ld0FydGlmYWN0RGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLAorCQkJCQluZXdBcnRpZmFjdC5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSk7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIG5ld0FydGlmYWN0RGF0YS5nZXRMYWJlbCgpKTsKKworCQkJZm9yIChHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uIDogYXNzb2NpYXRlZEdyb3VwcykgeworCQkJCVVuaXF1ZUlkRGF0YSBncm91cERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5Hcm91cCwgZ3JvdXBEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCisJCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVSZWxhdGlvbihncm91cERhdGEsCisJCQkJCQlvbGRBcnRpZmFjdERhdGEsIEdyYXBoRWRnZUxhYmVscy5HUk9VUF9BUlRJRkFDVF9SRUYpOworCQkJCWxvZy50cmFjZSgiQWZ0ZXIgZGlzc29jaWF0ZSBncm91cCB7fSBmcm9tIGFydGlmYWMge30iLCBncm91cERlZmluaXRpb24uZ2V0TmFtZSgpLCBvbGRBcnRpZmFjdElkKTsKKwkJCQlpZiAoZGVsZXRlUmVsYXRpb24uaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRlbGV0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisKKwkJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGdyb3VwRGF0YSwKKwkJCQkJCW5ld0FydGlmYWN0RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkdST1VQX0FSVElGQUNUX1JFRiwgcHJvcHMpOworCQkJCWxvZy50cmFjZSgiQWZ0ZXIgYXNzb2NpYXRlIGdyb3VwIHt9IHRvIGFydGlmYWN0IHt9IiwgZ3JvdXBEZWZpbml0aW9uLmdldE5hbWUoKSwgbmV3QXJ0aWZhY3QuZ2V0VW5pcXVlSWRLZXkoKSk7CisJCQkJaWYgKGNyZWF0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjcmVhdGVSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJCQl9CisJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRpc3NvY2lhdGVBbmRBc3NvY2lhdGVHcm91cHNGcm9tQXJ0aWZhY3QoU3RyaW5nIGNvbXBvbmVudElkLAorCQkJTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGVFbnVtLCBTdHJpbmcgb2xkQXJ0aWZhY3RJZCwgQXJ0aWZhY3REYXRhIG5ld0FydGlmYWN0LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHRoaXMuZGlzc29jaWF0ZUFuZEFzc29jaWF0ZUdyb3Vwc0Zyb21BcnRpZmFjdE9uR3JhcGgoY29tcG9uZW50SWQsCisJCQkJCWNvbXBvbmVudFR5cGVFbnVtLCBvbGRBcnRpZmFjdElkLCBuZXdBcnRpZmFjdCk7CisKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0sgJiYgc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0ICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGlzc29jaWF0ZUFuZEFzc29jaWF0ZUdyb3Vwc0Zyb21BcnRpZmFjdChTdHJpbmcgY29tcG9uZW50SWQsCisJCQlOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZUVudW0sIFN0cmluZyBvbGRBcnRpZmFjdElkLCBBcnRpZmFjdERhdGEgbmV3QXJ0aWZhY3QpIHsKKwkJcmV0dXJuIGRpc3NvY2lhdGVBbmRBc3NvY2lhdGVHcm91cHNGcm9tQXJ0aWZhY3QoY29tcG9uZW50SWQsIGNvbXBvbmVudFR5cGVFbnVtLCBvbGRBcnRpZmFjdElkLCBuZXdBcnRpZmFjdCwKKwkJCQlmYWxzZSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRHcm91cEFydGlmYWN0c1BhaXJzKAorCQkJU3RyaW5nIGdyb3VwVW5pcXVlSWQpIHsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8QXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uR3JvdXApLCBncm91cFVuaXF1ZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkdST1VQX0FSVElGQUNUX1JFRiwgTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCisJCX0gZWxzZSB7CisKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4+IGFydGlmYWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxBcnRpZmFjdERhdGEsIEdyYXBoRWRnZT4+IGxpc3QgPSBjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKGxpc3QgIT0gbnVsbCkgeworCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxBcnRpZmFjdERhdGEsIEdyYXBoRWRnZT4gcGFpciA6IGxpc3QpIHsKKwkJCQkJQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IHBhaXIuZ2V0S2V5KCk7CisJCQkJCVN0cmluZyB1bmlxdWVJZCA9IGFydGlmYWN0RGF0YS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQkJU3RyaW5nIFVVSUQgPSBhcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0VVVJRCgpOworCQkJCQlJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBhcnRpZmFjdCA9IG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPih1bmlxdWVJZCwgVVVJRCk7CisJCQkJCWFydGlmYWN0c0xpc3QuYWRkKGFydGlmYWN0KTsKKwkJCQl9CisJCQl9CisKKwkJCWxvZy5kZWJ1ZygiVGhlIGFydGlmYWN0cyBsaXN0IHJlbGF0ZWQgdG8gZ3JvdXAge30gaXMge30iLCBncm91cFVuaXF1ZUlkLCBhcnRpZmFjdHNMaXN0KTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGFydGlmYWN0c0xpc3QpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBWZXJzaW9uT25HcmFwaChMaXN0PFN0cmluZz4gZ3JvdXBzVW5pcXVlSWQpIHsKKworCQlpZiAoZ3JvdXBzVW5pcXVlSWQgIT0gbnVsbCkgeworCisJCQlMaXN0PEdyb3VwRGVmaW5pdGlvbj4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKFN0cmluZyBncm91cFVpZCA6IGdyb3Vwc1VuaXF1ZUlkKSB7CisJCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IHVwZGF0ZUdyb3VwVmVyc2lvbk9uR3JhcGgoZ3JvdXBVaWQpOworCQkJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSB2ZXJzaW9uIG9mIGdyb3VwIHt9IiwgZ3JvdXBVaWQpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlncm91cHMuYWRkKGVpdGhlci5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZ3JvdXBzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spOworCisJfQorCisJLyoqCisJICogdXBkYXRlIHRoZSBncm91cCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gZ3JvdXAuIEl0IGFsc28gY3JlYXRlcyBhIG5ldyBVVUlELgorCSAqIAorCSAqIEBwYXJhbSBncm91cFVuaXF1ZUlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBWZXJzaW9uT25HcmFwaChTdHJpbmcgZ3JvdXBVbmlxdWVJZCkgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cEZyb21HcmFwaCA9IHRoaXMuZ2V0R3JvdXBGcm9tR3JhcGgoZ3JvdXBVbmlxdWVJZCwgZmFsc2UsCisJCQkJZmFsc2UsIGZhbHNlKTsKKworCQlpZiAoZ3JvdXBGcm9tR3JhcGguaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBncm91cEZyb21HcmFwaC5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlHcm91cERlZmluaXRpb24gZ3JvdXBEZWZpbml0aW9uID0gZ3JvdXBGcm9tR3JhcGgubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgdmVyc2lvbiA9IGdyb3VwRGVmaW5pdGlvbi5nZXRWZXJzaW9uKCk7CisJCQlTdHJpbmcgbmV3VmVyc2lvbiA9IGluY3JlYXNlTWFqb3JWZXJzaW9uKHZlcnNpb24pOworCQkJSW50ZWdlciBwdkNvdW50ZXIgPSBncm91cERlZmluaXRpb24uZ2V0UHJvcGVydHlWYWx1ZUNvdW50ZXIoKTsKKworCQkJR3JvdXBEYXRhIGdyb3VwRGF0YSA9IG5ldyBHcm91cERhdGEoKTsKKwkJCWdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoZ3JvdXBVbmlxdWVJZCk7CisJCQlncm91cERhdGEuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLnNldFZlcnNpb24obmV3VmVyc2lvbik7CisJCQlncm91cERhdGEuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLnNldFByb3BlcnR5VmFsdWVDb3VudGVyKHB2Q291bnRlcik7CisKKwkJCVN0cmluZyBncm91cFVVSUQgPSBVbmlxdWVJZEJ1aWxkZXIuZ2VuZXJhdGVVVUlEKCk7CisJCQlncm91cERhdGEuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLnNldEdyb3VwVVVJRChncm91cFVVSUQpOworCisJCQlFaXRoZXI8R3JvdXBEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKGdyb3VwRGF0YSwgR3JvdXBEYXRhLmNsYXNzKTsKKwkJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlncm91cEZyb21HcmFwaCA9IHRoaXMuZ2V0R3JvdXBGcm9tR3JhcGgoZ3JvdXBVbmlxdWVJZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCQkJcmV0dXJuIGdyb3VwRnJvbUdyYXBoOworCQkJfQorCisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZ3JvdXAgaXMgYW4gaW50ZWdlci4gSW4gb3JkZXIgdG8gc3VwcG9ydCBCQywgd2UgbWlnaHQKKwkgKiBnZXQgYSB2ZXJzaW9uIGluIGEgZmxvYXQgZm9ybWF0LgorCSAqIAorCSAqIEBwYXJhbSB2ZXJzaW9uCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgU3RyaW5nIGluY3JlYXNlTWFqb3JWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisKKwkJU3RyaW5nW10gdmVyc2lvblBhcnRzID0gdmVyc2lvbi5zcGxpdChMaWZlY3ljbGVPcGVyYXRpb24uVkVSU0lPTl9ERUxJTUVURVJfUkVHRVhQKTsKKwkJSW50ZWdlciBtYWpvclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHZlcnNpb25QYXJ0c1swXSk7CisKKwkJbWFqb3JWZXJzaW9uKys7CisKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKG1ham9yVmVyc2lvbik7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXBPbkdyYXBoKFN0cmluZyBncm91cElkLAorCQkJTGlzdDxTdHJpbmc+IGFydGlmYWN0c0lkKSB7CisKKwkJaWYgKGFydGlmYWN0c0lkID09IG51bGwgfHwgYXJ0aWZhY3RzSWQuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKwkJfQorCisJCWZvciAoU3RyaW5nIGFydGlmYWN0SWQgOiBhcnRpZmFjdHNJZCkgeworCQkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRBcnRpZmFjdFJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKAorCQkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYpLCBhcnRpZmFjdElkLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQkJaWYgKGZpbmRBcnRpZmFjdFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kQXJ0aWZhY3RSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9ICJGYWlsZWQgdG8gYXNzb2NpYXRlIGdyb3VwICIgKyBncm91cElkICsgIiB0byBhcnRpZmFjdCAiICsgYXJ0aWZhY3RJZAorCQkJCQkJKyAiIGluIGdyYXBoLiBTdGF0dXMgaXMgIiArIHN0YXR1czsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJfQorCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGZpbmRBcnRpZmFjdFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRMYWJlbCgpKTsKKworCQkJR3JhcGhOb2RlIGdyb3VwRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkdyb3VwLCBncm91cElkKTsKKwkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkQXJ0aWZhY3RzUmVmUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKAorCQkJCQlncm91cERhdGEsIGZpbmRBcnRpZmFjdFJlcy5sZWZ0KCkudmFsdWUoKSwgR3JhcGhFZGdlTGFiZWxzLkdST1VQX0FSVElGQUNUX1JFRiwgcHJvcHMpOworCisJCQlpZiAoYWRkQXJ0aWZhY3RzUmVmUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZEFydGlmYWN0c1JlZlJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIkZhaWxlZCB0byBhc3NvY2lhdGUgZ3JvdXAgIiArIGdyb3VwRGF0YS5nZXRVbmlxdWVJZCgpICsgIiB0byBhcnRpZmFjdCAiCisJCQkJCQkrIGFydGlmYWN0SWQgKyAiIGluIGdyYXBoLiBTdGF0dXMgaXMgIiArIHN0YXR1czsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJfQorCQl9CisKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyb3VwRnJvbUdyYXBoID0gdGhpcy5nZXRHcm91cEZyb21HcmFwaChncm91cElkLCB0cnVlLCB0cnVlLAorCQkJCWZhbHNlKTsKKworCQlyZXR1cm4gZ3JvdXBGcm9tR3JhcGg7CisJfQorCisJcHVibGljIEVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVNZW1iZXJzVG9Hcm91cE9uR3JhcGgoU3RyaW5nIGdyb3VwSWQsCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMpIHsKKworCQlpZiAobWVtYmVycyAhPSBudWxsICYmIGZhbHNlID09IG1lbWJlcnMuaXNFbXB0eSgpKSB7CisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZE1lbWJlcnNSZWZSZXN1bHQgPSBudWxsOworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gbWVtYmVyIDogbWVtYmVycy5lbnRyeVNldCgpKSB7CisJCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRDb21wb25lbnRJbnN0YW5jZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKAorCQkJCQkJVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UpLCBtZW1iZXIuZ2V0VmFsdWUoKSwKKwkJCQkJCUNvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisJCQkJaWYgKGZpbmRDb21wb25lbnRJbnN0YW5jZVJlcy5pc1JpZ2h0KCkpIHsKKworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kQ29tcG9uZW50SW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCQkJfQorCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiRmFpbGVkIHRvIGZpbmQgdG8gZmluZCBjb21wb25lbnQgaW5zdGFuY2UgZ3JvdXAgIiArIG1lbWJlci5nZXRWYWx1ZSgpCisJCQkJCQkJKyAiIGluIGdyYXBoLiBTdGF0dXMgaXMgIiArIHN0YXR1czsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKEFERElOR19HUk9VUCwgZGVzY3JpcHRpb24sCisJCQkJCQkJRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQl9CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgbWVtYmVyLmdldEtleSgpKTsKKwkJCQlHcmFwaE5vZGUgZ3JvdXBEYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uR3JvdXAsIGdyb3VwSWQpOworCQkJCWFkZE1lbWJlcnNSZWZSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oZ3JvdXBEYXRhLCBmaW5kQ29tcG9uZW50SW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCksCisJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuR1JPVVBfTUVNQkVSLCBwcm9wcyk7CisJCQkJaWYgKGFkZE1lbWJlcnNSZWZSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFkZE1lbWJlcnNSZWZSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiRmFpbGVkIHRvIGFzc29jaWF0ZSBncm91cCAiICsgZ3JvdXBEYXRhLmdldFVuaXF1ZUlkKCkKKwkJCQkJCQkrICIgdG8gY29tcG9uZW50IGluc3RhbmNlICIgKyBtZW1iZXIuZ2V0VmFsdWUoKSArICIgaW4gZ3JhcGguIFN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwKKwkJCQkJCQlFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cEZyb21HcmFwaCA9IHRoaXMuZ2V0R3JvdXBGcm9tR3JhcGgoZ3JvdXBJZCwgdHJ1ZSwgZmFsc2UsCisJCQkJdHJ1ZSk7CisKKwkJcmV0dXJuIGdyb3VwRnJvbUdyYXBoOworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZUFydGlmYWN0c0Zyb21Hcm91cE9uR3JhcGgoU3RyaW5nIGdyb3VwSWQsCisJCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RzSWQpIHsKKworCQlpZiAoYXJ0aWZhY3RzSWQgPT0gbnVsbCB8fCBhcnRpZmFjdHNJZC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spOworCQl9CisKKwkJVW5pcXVlSWREYXRhIGdyb3VwRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkdyb3VwLCBncm91cElkKTsKKwkJZm9yIChTdHJpbmcgYXJ0aWZhY3RJZCA6IGFydGlmYWN0c0lkKSB7CisKKwkJCVVuaXF1ZUlkRGF0YSBhcnRpZmFjdERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5Hcm91cCwgYXJ0aWZhY3RJZCk7CisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZVJlbGF0aW9uKGdyb3VwRGF0YSwKKwkJCQkJYXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2VMYWJlbHMuR1JPVVBfQVJUSUZBQ1RfUkVGKTsKKwkJCWxvZy50cmFjZSgiQWZ0ZXIgZGlzc29jaWF0ZSBncm91cCB7fSBmcm9tIGFydGlmYWN0IHt9IiwgZ3JvdXBJZCwgYXJ0aWZhY3RJZCk7CisKKwkJCWlmIChkZWxldGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCQl9CisJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIkZhaWxlZCB0byBkaWFzc29jaWF0ZSBncm91cCAiICsgZ3JvdXBJZCArICIgZnJvbSBhcnRpZmFjdCAiICsgYXJ0aWZhY3RJZAorCQkJCQkJKyAiIGluIGdyYXBoLiBTdGF0dXMgaXMgIiArIHN0YXR1czsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQURESU5HX0dST1VQLCBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJfQorCisJCX0KKworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JvdXBGcm9tR3JhcGggPSB0aGlzLmdldEdyb3VwRnJvbUdyYXBoKGdyb3VwSWQsIHRydWUsIHRydWUsCisJCQkJZmFsc2UpOworCisJCXJldHVybiBncm91cEZyb21HcmFwaDsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZU1lbWJlcnNGcm9tR3JvdXBPbkdyYXBoKFN0cmluZyBncm91cElkLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBtZW1iZXJzKSB7CisKKwkJaWYgKG1lbWJlcnMgPT0gbnVsbCB8fCBtZW1iZXJzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5PSyk7CisJCX0KKworCQlVbmlxdWVJZERhdGEgZ3JvdXBEYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uR3JvdXAsIGdyb3VwSWQpOworCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBtZW1iZXIgOiBtZW1iZXJzLmVudHJ5U2V0KCkpIHsKKworCQkJVW5pcXVlSWREYXRhIGFydGlmYWN0RGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkdyb3VwLCBtZW1iZXIuZ2V0VmFsdWUoKSk7CisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZVJlbGF0aW9uKGdyb3VwRGF0YSwKKwkJCQkJYXJ0aWZhY3REYXRhLCBHcmFwaEVkZ2VMYWJlbHMuR1JPVVBfTUVNQkVSKTsKKwkJCWxvZy50cmFjZSgiQWZ0ZXIgZGlzc29jaWF0ZSBncm91cCB7fSBmcm9tIG1lbWJlcnMiLCBncm91cElkLCBtZW1iZXIuZ2V0VmFsdWUoKSk7CisKKwkJCWlmIChkZWxldGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCQl9CisJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIkZhaWxlZCB0byBkaWFzc29jaWF0ZSBncm91cCAiICsgZ3JvdXBJZCArICIgZnJvbSBtZW1iZXIgIiArIG1lbWJlci5nZXRWYWx1ZSgpCisJCQkJCQkrICIgaW4gZ3JhcGguIFN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcihBRERJTkdfR1JPVVAsIGRlc2NyaXB0aW9uLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisKKwkJfQorCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cEZyb21HcmFwaCA9IHRoaXMuZ2V0R3JvdXBGcm9tR3JhcGgoZ3JvdXBJZCwgdHJ1ZSwgdHJ1ZSwKKwkJCQlmYWxzZSk7CisKKwkJcmV0dXJuIGdyb3VwRnJvbUdyYXBoOworCisJfQorCisJLyoqCisJICogZGlzc29jaWF0ZSBhcnRpZmFjdHMgZnJvbSBhIGdyb3VwLiBJdCBkbyBub3QgZGVsZXRlIHRoZSBhcnRpZmFjdHMgISEhCisJICogCisJICogQHBhcmFtIGdyb3VwSWQKKwkgKiBAcGFyYW0gYXJ0aWZhY3RzSWQKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZUFydGlmYWN0c0Zyb21Hcm91cChTdHJpbmcgZ3JvdXBJZCwKKwkJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHNJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHRpdGFuUmVzID0gdGhpcy5kaXNzb2NpYXRlQXJ0aWZhY3RzRnJvbUdyb3VwT25HcmFwaChncm91cElkLAorCQkJCQlhcnRpZmFjdHNJZCk7CisKKwkJCWlmICh0aXRhblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIKKwkJCQkJCS5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModGl0YW5SZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RvcmFnZU9wZXJhdGlvblN0YXR1cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodGl0YW5SZXMubGVmdCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUV4ZWN1dGVSb2xsYmFja0Vycm9yKCJSb2xsYmFjayBvbiBncmFwaCIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZU1lbWJlcnNGcm9tR3JvdXAoU3RyaW5nIGdyb3VwSWQsCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB0aXRhblJlcyA9IHRoaXMuZGlzc29jaWF0ZU1lbWJlcnNGcm9tR3JvdXBPbkdyYXBoKGdyb3VwSWQsCisJCQkJCW1lbWJlcnMpOworCisJCQlpZiAodGl0YW5SZXMuaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlT3BlcmF0aW9uU3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyCisJCQkJCQkuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHRpdGFuUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRpdGFuUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJLyoqCisJICogQXNzb2NpYXRlIGFydGlmYWN0cyB0byBhIGdpdmVuIGdyb3VwCisJICogCisJICogQHBhcmFtIGdyb3VwSWQKKwkgKiBAcGFyYW0gYXJ0aWZhY3RzSWQKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlQXJ0aWZhY3RzVG9Hcm91cChTdHJpbmcgZ3JvdXBJZCwKKwkJCUxpc3Q8U3RyaW5nPiBhcnRpZmFjdHNJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdGl0YW5SZXMgPSB0aGlzLmFzc29jaWF0ZUFydGlmYWN0c1RvR3JvdXBPbkdyYXBoKGdyb3VwSWQsCisJCQkJCWFydGlmYWN0c0lkKTsKKworCQkJaWYgKHRpdGFuUmVzLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyCisJCQkJCQkuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHRpdGFuUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRpdGFuUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJLyoqCisJICogQXNzb2NpYXRlIGFydGlmYWN0cyB0byBhIGdpdmVuIGdyb3VwCisJICogCisJICogQHBhcmFtIGdyb3VwSWQKKwkgKiBAcGFyYW0gYXJ0aWZhY3RzSWQKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlTWVtYmVyc1RvR3JvdXAoU3RyaW5nIGdyb3VwSWQsCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1lbWJlcnMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHRpdGFuUmVzID0gdGhpcy5hc3NvY2lhdGVNZW1iZXJzVG9Hcm91cE9uR3JhcGgoZ3JvdXBJZCwKKwkJCQkJbWVtYmVycyk7CisKKwkJCWlmICh0aXRhblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlcgorCQkJCQkJLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh0aXRhblJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHRpdGFuUmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUdyb3VwVmVyc2lvbihMaXN0PFN0cmluZz4gZ3JvdXBzSWQsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBWZXJzaW9uT25HcmFwaCA9IHRoaXMKKwkJCQkJLnVwZGF0ZUdyb3VwVmVyc2lvbk9uR3JhcGgoZ3JvdXBzSWQpOworCisJCQlpZiAodXBkYXRlR3JvdXBWZXJzaW9uT25HcmFwaC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyCisJCQkJCQkuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHVwZGF0ZUdyb3VwVmVyc2lvbk9uR3JhcGgucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodXBkYXRlR3JvdXBWZXJzaW9uT25HcmFwaC5sZWZ0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRXhlY3V0ZVJvbGxiYWNrRXJyb3IoIlJvbGxiYWNrIG9uIGdyYXBoIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyBFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVHcm91cE5hbWUoU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcgbmV3TmFtZSwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQlFaXRoZXI8R3JvdXBEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlR3JvdXBOYW1lT25HcmFwaCA9IHRoaXMudXBkYXRlR3JvdXBOYW1lT25HcmFwaCh1bmlxdWVJZCwKKwkJCQkJbmV3TmFtZSk7CisKKwkJCWlmICh1cGRhdGVHcm91cE5hbWVPbkdyYXBoLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCgKKwkJCQkJCURhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModXBkYXRlR3JvdXBOYW1lT25HcmFwaC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh1cGRhdGVHcm91cE5hbWVPbkdyYXBoLmxlZnQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigiUm9sbGJhY2sgb24gZ3JhcGgiKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPEdyb3VwRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUdyb3VwTmFtZU9uR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBTdHJpbmcgbmV3TmFtZSkgeworCisJCUVpdGhlcjxHcm91cERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cEZyb21HcmFwaCA9IHRoaXMuZ2V0R3JvdXBGcm9tR3JhcGgodW5pcXVlSWQsIGZhbHNlLCBmYWxzZSwKKwkJCQlmYWxzZSk7CisKKwkJaWYgKGdyb3VwRnJvbUdyYXBoLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ3JvdXBGcm9tR3JhcGgucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9IGVsc2UgeworCQkJR3JvdXBEZWZpbml0aW9uIGdyb3VwRGVmaW5pdGlvbiA9IGdyb3VwRnJvbUdyYXBoLmxlZnQoKS52YWx1ZSgpOworCQkJU3RyaW5nIHZlcnNpb24gPSBncm91cERlZmluaXRpb24uZ2V0VmVyc2lvbigpOworCQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBpbmNyZWFzZU1ham9yVmVyc2lvbih2ZXJzaW9uKTsKKwkJCUludGVnZXIgcHZDb3VudGVyID0gZ3JvdXBEZWZpbml0aW9uLmdldFByb3BlcnR5VmFsdWVDb3VudGVyKCk7CisKKwkJCUdyb3VwRGF0YSBncm91cERhdGEgPSBuZXcgR3JvdXBEYXRhKCk7CisJCQlncm91cERhdGEuZ2V0R3JvdXBEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJCWdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKKwkJCWdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuc2V0TmFtZShuZXdOYW1lKTsKKwkJCWdyb3VwRGF0YS5nZXRHcm91cERhdGFEZWZpbml0aW9uKCkuc2V0UHJvcGVydHlWYWx1ZUNvdW50ZXIocHZDb3VudGVyKTsKKworCQkJRWl0aGVyPEdyb3VwRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShncm91cERhdGEsIEdyb3VwRGF0YS5jbGFzcyk7CisJCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJZ3JvdXBGcm9tR3JhcGggPSB0aGlzLmdldEdyb3VwRnJvbUdyYXBoKHVuaXF1ZUlkLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwkJCQlyZXR1cm4gZ3JvdXBGcm9tR3JhcGg7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0dyb3VwVHlwZU9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Hcm91cFR5cGVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjUxZTUwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Hcm91cFR5cGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWRnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Hcm91cFR5cGVEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cFR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JR3JvdXBUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eVR5cGVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkdyb3VwVHlwZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJncm91cC10eXBlLW9wZXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgR3JvdXBUeXBlT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJR3JvdXBUeXBlT3BlcmF0aW9uIHsKKworCVN0cmluZyBDUkVBVEVfRkxPV19DT05URVhUID0gIkNyZWF0ZUdyb3VwVHlwZSI7CisJU3RyaW5nIEdFVF9GTE9XX0NPTlRFWFQgPSAiR2V0R3JvdXBUeXBlIjsKKworCUBSZXNvdXJjZQorCXByaXZhdGUgUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb247CisKKwlwdWJsaWMgR3JvdXBUeXBlT3BlcmF0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihHcm91cFR5cGVPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qKgorCSAqIEZPUiBURVNUIE9OTFkKKwkgKiAKKwkgKiBAcGFyYW0gdGl0YW5HZW5lcmljRGFvCisJICovCisJcHVibGljIHZvaWQgc2V0VGl0YW5HZW5lcmljRGFvKFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW8pIHsKKwkJdGhpcy50aXRhbkdlbmVyaWNEYW8gPSB0aXRhbkdlbmVyaWNEYW87CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxHcm91cFR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRHcm91cFR5cGUoR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGVEZWZpbml0aW9uKSB7CisKKwkJcmV0dXJuIGFkZEdyb3VwVHlwZShncm91cFR5cGVEZWZpbml0aW9uLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxHcm91cFR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRHcm91cFR5cGUoR3JvdXBUeXBlRGVmaW5pdGlvbiBncm91cFR5cGVEZWZpbml0aW9uLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPEdyb3VwVHlwZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJTdGF0dXMgPSBhZGRHcm91cFR5cGVUb0dyYXBoKGdyb3VwVHlwZURlZmluaXRpb24pOworCisJCQlpZiAoZWl0aGVyU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZENyZWF0ZU5vZGVFcnJvcihDUkVBVEVfRkxPV19DT05URVhULAorCQkJCQkJZ3JvdXBUeXBlRGVmaW5pdGlvbi5nZXRUeXBlKCksIGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIKKwkJCQkJCS5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKworCQkJfSBlbHNlIHsKKwkJCQlHcm91cFR5cGVEYXRhIGdyb3VwVHlwZURhdGEgPSBlaXRoZXJTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlTdHJpbmcgdW5pcXVlSWQgPSBncm91cFR5cGVEYXRhLmdldFVuaXF1ZUlkKCk7CisJCQkJRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdyb3VwVHlwZVJlcyA9IHRoaXMuZ2V0R3JvdXBUeXBlKHVuaXF1ZUlkLCB0cnVlKTsKKworCQkJCWlmIChncm91cFR5cGVSZXMuaXNSaWdodCgpKSB7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yKEdFVF9GTE9XX0NPTlRFWFQsCisJCQkJCQkJZ3JvdXBUeXBlRGVmaW5pdGlvbi5nZXRUeXBlKCksIGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQl9CisKKwkJCQlyZXN1bHQgPSBncm91cFR5cGVSZXM7CisKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaGFuZGxlVHJhbnNhY3Rpb25Db21taXRSb2xsYmFjayhpblRyYW5zYWN0aW9uLCByZXN1bHQpOworCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRHcm91cFR5cGVCeVVpZChTdHJpbmcgdW5pcXVlSWQpIHsKKworCQlFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJRWl0aGVyPEdyb3VwVHlwZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncm91cFR5cGVzUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkdyb3VwVHlwZSksIHVuaXF1ZUlkLCBHcm91cFR5cGVEYXRhLmNsYXNzKTsKKworCQlpZiAoZ3JvdXBUeXBlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdyb3VwVHlwZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJHcm91cCB0eXBlIHt9IGNhbm5vdCBiZSBmb3VuZCBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlHcm91cFR5cGVEYXRhIGd0RGF0YSA9IGdyb3VwVHlwZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCUdyb3VwVHlwZURlZmluaXRpb24gZ3JvdXBUeXBlRGVmaW5pdGlvbiA9IG5ldyBHcm91cFR5cGVEZWZpbml0aW9uKGd0RGF0YS5nZXRHcm91cFR5cGVEYXRhRGVmaW5pdGlvbigpKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBwcm9wZXJ0aWVzU3RhdHVzID0gcHJvcGVydHlPcGVyYXRpb24uZmlsbFByb3BlcnRpZXModW5pcXVlSWQsCisJCQkJcHJvcGVyTGlzdCAtPiBncm91cFR5cGVEZWZpbml0aW9uLnNldFByb3BlcnRpZXMocHJvcGVyTGlzdCkpOworCisJCWlmIChwcm9wZXJ0aWVzU3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBwcm9wZXJ0aWVzIG9mIGNhcGFiaWxpdHkgdHlwZSB7fSIsIHVuaXF1ZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocHJvcGVydGllc1N0YXR1cyk7CisJCX0KKworCQlyZXN1bHQgPSBFaXRoZXIubGVmdChncm91cFR5cGVEZWZpbml0aW9uKTsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXBUeXBlKFN0cmluZyB1bmlxdWVJZCkgeworCisJCXJldHVybiBnZXRHcm91cFR5cGUodW5pcXVlSWQsIGZhbHNlKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXBUeXBlKFN0cmluZyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUZ1bmN0aW9uPFN0cmluZywgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4gZ3JvdXBUeXBlR2V0dGVyID0gdUlkIC0+IGdldEdyb3VwVHlwZUJ5VWlkKAorCQkJCXVJZCk7CisJCXJldHVybiBnZXRFbGVtZW50VHlwZShncm91cFR5cGVHZXR0ZXIsIHVuaXF1ZUlkLCBpblRyYW5zYWN0aW9uKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0R3JvdXBUeXBlQnlUeXBlKFN0cmluZyB0eXBlKSB7CisJCXJldHVybiBnZXRMYXRlc3RHcm91cFR5cGVCeVR5cGUodHlwZSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0R3JvdXBUeXBlQnlUeXBlKFN0cmluZyB0eXBlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwQ3JpdGVyaWEgPSBuZXcgSGFzaE1hcDw+KCk7CisJCW1hcENyaXRlcmlhLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSwgdHlwZSk7CisJCW1hcENyaXRlcmlhLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKworCQlyZXR1cm4gZ2V0R3JvdXBUeXBlQnlDcml0ZXJpYSh0eXBlLCBtYXBDcml0ZXJpYSwgaW5UcmFuc2FjdGlvbik7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwVHlwZUJ5Q3JpdGVyaWEoU3RyaW5nIHR5cGUsCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmICh0eXBlID09IG51bGwgfHwgdHlwZS5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuZXJyb3IoInR5cGUgaXMgZW1wdHkiKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8TGlzdDxHcm91cFR5cGVEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyb3VwVHlwZUVpdGhlciA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uR3JvdXBUeXBlLCBwcm9wZXJ0aWVzLCBHcm91cFR5cGVEYXRhLmNsYXNzKTsKKwkJCWlmIChncm91cFR5cGVFaXRoZXIuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyCisJCQkJCQkucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncm91cFR5cGVFaXRoZXIucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9IGVsc2UgeworCQkJCUdyb3VwVHlwZURhdGFEZWZpbml0aW9uIGRhdGFEZWZpbml0aW9uID0gZ3JvdXBUeXBlRWl0aGVyLmxlZnQoKS52YWx1ZSgpLnN0cmVhbSgpCisJCQkJCQkubWFwKGUgLT4gZS5nZXRHcm91cFR5cGVEYXRhRGVmaW5pdGlvbigpKS5maW5kRmlyc3QoKS5nZXQoKTsKKwkJCQlyZXN1bHQgPSBnZXRHcm91cFR5cGUoZGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgaW5UcmFuc2FjdGlvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWhhbmRsZVRyYW5zYWN0aW9uQ29tbWl0Um9sbGJhY2soaW5UcmFuc2FjdGlvbiwgcmVzdWx0KTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8R3JvdXBUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0R3JvdXBUeXBlQnlUeXBlQW5kVmVyc2lvbihTdHJpbmcgdHlwZSwKKwkJCVN0cmluZyB2ZXJzaW9uKSB7CisJCXJldHVybiBnZXRHcm91cFR5cGVCeVR5cGVBbmRWZXJzaW9uKHR5cGUsIHZlcnNpb24sIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEdyb3VwVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEdyb3VwVHlwZUJ5VHlwZUFuZFZlcnNpb24oU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwQ3JpdGVyaWEgPSBuZXcgSGFzaE1hcDw+KCk7CisJCW1hcENyaXRlcmlhLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSwgdHlwZSk7CisJCW1hcENyaXRlcmlhLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdmVyc2lvbik7CisKKwkJcmV0dXJuIGdldEdyb3VwVHlwZUJ5Q3JpdGVyaWEodHlwZSwgbWFwQ3JpdGVyaWEsIGluVHJhbnNhY3Rpb24pOworCX0KKworCS8qKgorCSAqIAorCSAqIEFkZCBncm91cCB0eXBlIHRvIGdyYXBoLgorCSAqIAorCSAqIDEuIEFkZCBncm91cCB0eXBlIG5vZGUKKwkgKiAKKwkgKiAyLiBBZGQgZWRnZSBiZXR3ZWVuIHRoZSBmb3JtZXIgbm9kZSB0byBpdHMgcGFyZW50KGlmIGV4aXN0cykKKwkgKiAKKwkgKiAzLiBBZGQgcHJvcGVydHkgbm9kZSBhbmQgYXNzb2NpYXRlIGl0IHRvIHRoZSBub2RlIGNyZWF0ZWQgYXQgIzEuIChwZXIKKwkgKiBwcm9wZXJ0eSAmIGlmIGV4aXN0cykKKwkgKiAKKwkgKiBAcGFyYW0gZ3JvdXBUeXBlRGVmaW5pdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxHcm91cFR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkR3JvdXBUeXBlVG9HcmFwaChHcm91cFR5cGVEZWZpbml0aW9uIGdyb3VwVHlwZURlZmluaXRpb24pIHsKKworCQlsb2cuZGVidWcoIkdvdCBncm91cCB0eXBlIHt9IiwgZ3JvdXBUeXBlRGVmaW5pdGlvbik7CisKKwkJU3RyaW5nIGN0VW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRHcm91cFR5cGVVaWQoZ3JvdXBUeXBlRGVmaW5pdGlvbi5nZXRUeXBlKCksCisJCQkJZ3JvdXBUeXBlRGVmaW5pdGlvbi5nZXRWZXJzaW9uKCkpOworCQkvLyBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0VW5pcXVlSWQoY3RVbmlxdWVJZCk7CisKKwkJR3JvdXBUeXBlRGF0YSBncm91cFR5cGVEYXRhID0gYnVpbGRHcm91cFR5cGVEYXRhKGdyb3VwVHlwZURlZmluaXRpb24sIGN0VW5pcXVlSWQpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBncm91cCB0eXBlIHRvIGdyYXBoLiBncm91cFR5cGVEYXRhID0ge30iLCBncm91cFR5cGVEYXRhKTsKKworCQlFaXRoZXI8R3JvdXBUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUdUUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoZ3JvdXBUeXBlRGF0YSwKKwkJCQlHcm91cFR5cGVEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgZ3JvdXAgdHlwZSB0byBncmFwaC4gc3RhdHVzIGlzID0ge30iLCBjcmVhdGVHVFJlc3VsdCk7CisKKwkJaWYgKGNyZWF0ZUdUUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlR1RSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGdyb3VwIHR5cGUge30gdG8gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIGdyb3VwVHlwZURlZmluaXRpb24uZ2V0VHlwZSgpLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJR3JvdXBUeXBlRGF0YSByZXN1bHRDVEQgPSBjcmVhdGVHVFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBncm91cFR5cGVEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0aWVzVG9DYXBhYmxpdHlUeXBlID0gcHJvcGVydHlPcGVyYXRpb24KKwkJCQkuYWRkUHJvcGVydGllc1RvRWxlbWVudFR5cGUocmVzdWx0Q1RELmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5Hcm91cFR5cGUsIHByb3BlcnRpZXMpOworCQlpZiAoYWRkUHJvcGVydGllc1RvQ2FwYWJsaXR5VHlwZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIGFkZCBwcm9wZXJ0aWVzIHt9IHRvIGNhcGFiaWxpdHkge30iLCBwcm9wZXJ0aWVzLCBncm91cFR5cGVEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFkZFByb3BlcnRpZXNUb0NhcGFibGl0eVR5cGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCVN0cmluZyBkZXJpdmVkRnJvbSA9IGdyb3VwVHlwZURlZmluaXRpb24uZ2V0RGVyaXZlZEZyb20oKTsKKwkJaWYgKGRlcml2ZWRGcm9tICE9IG51bGwpIHsKKworCQkJLy8gVE9ETzogTmVlZCB0byBmaW5kIHRoZSBwYXJlbnQuIG5lZWQgdG8gdGFrZSB0aGUgbGF0ZXN0IG9uZSBzaW5jZQorCQkJLy8gd2UgbWF5IGhhdmUgbWFueSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSB0eXBlCisJCQkvKgorCQkJICogbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgcmVsYXRpb24gYmV0d2VlbiBncm91cCB0eXBlIHt9IHRvIGl0cyBwYXJlbnQge30iLCBjdFVuaXF1ZUlkLCBkZXJpdmVkRnJvbSk7IFVuaXF1ZUlkRGF0YSBmcm9tCisJCQkgKiA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCBjdFVuaXF1ZUlkKTsKKwkJCSAqIFVuaXF1ZUlkRGF0YSB0byA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLAorCQkJICogZGVyaXZlZEZyb20pOyBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+CisJCQkgKiBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0RhbyAuY3JlYXRlUmVsYXRpb24oZnJvbSwgdG8sCisJCQkgKiBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBudWxsKTsKKwkJCSAqIGxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRlIHJlbGF0aW9uIGJldHdlZW4gY2FwYWJpbGl0eSB0eXBlIHt9IHRvIGl0cyBwYXJlbnQge30uIFN0YXR1cyBpcyB7fSIsIGN0VW5pcXVlSWQsIGRlcml2ZWRGcm9tLCBpZiAoY3JlYXRlUmVsYXRpb24uaXNSaWdodCgpKSB7IHJldHVybgorCQkJICogRWl0aGVyLnJpZ2h0KGNyZWF0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7IH0KKwkJCSAqIAorCQkJICovCisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlR1RSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJLyoqCisJICogCisJICogY29udmVydCBiZXR3ZWVuIGdyYXBoIE5vZGUgb2JqZWN0IHRvIEphdmEgb2JqZWN0CisJICogCisJICogQHBhcmFtIGNhcGFiaWxpdHlUeXBlRGF0YQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNvbnZlcnRDVERhdGFUb0NURGVmaW5pdGlvbihDYXBhYmlsaXR5VHlwZURhdGEgY2FwYWJpbGl0eVR5cGVEYXRhKSB7CisJCWxvZy5kZWJ1ZygiVGhlIG9iamVjdCByZXR1cm5lZCBhZnRlciBjcmVhdGUgY2FwYWJpbGl0eSBpcyB7fSIsIGNhcGFiaWxpdHlUeXBlRGF0YSk7CisKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmUmVzdWx0ID0gbmV3IENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigKKwkJCQljYXBhYmlsaXR5VHlwZURhdGEuZ2V0Q2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbigpKTsKKworCQlyZXR1cm4gY2FwYWJpbGl0eVR5cGVEZWZSZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBHcm91cFR5cGVEYXRhIGJ1aWxkR3JvdXBUeXBlRGF0YShHcm91cFR5cGVEZWZpbml0aW9uIGdyb3VwVHlwZURlZmluaXRpb24sIFN0cmluZyBjdFVuaXF1ZUlkKSB7CisKKwkJR3JvdXBUeXBlRGF0YSBncm91cFR5cGVEYXRhID0gbmV3IEdyb3VwVHlwZURhdGEoZ3JvdXBUeXBlRGVmaW5pdGlvbik7CisKKwkJZ3JvdXBUeXBlRGF0YS5nZXRHcm91cFR5cGVEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKGN0VW5pcXVlSWQpOworCQlMb25nIGNyZWF0aW9uRGF0ZSA9IGdyb3VwVHlwZURhdGEuZ2V0R3JvdXBUeXBlRGF0YURlZmluaXRpb24oKS5nZXRDcmVhdGlvblRpbWUoKTsKKwkJaWYgKGNyZWF0aW9uRGF0ZSA9PSBudWxsKSB7CisJCQljcmVhdGlvbkRhdGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJfQorCQlncm91cFR5cGVEYXRhLmdldEdyb3VwVHlwZURhdGFEZWZpbml0aW9uKCkuc2V0Q3JlYXRpb25UaW1lKGNyZWF0aW9uRGF0ZSk7CisJCWdyb3VwVHlwZURhdGEuZ2V0R3JvdXBUeXBlRGF0YURlZmluaXRpb24oKS5zZXRNb2RpZmljYXRpb25UaW1lKGNyZWF0aW9uRGF0ZSk7CisKKwkJcmV0dXJuIGdyb3VwVHlwZURhdGE7CisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0NhcGFiaWxpdHlUeXBlRGVyaXZlZEZyb20oU3RyaW5nIGNoaWxkQ2FuZGlkYXRlVHlwZSwKKwkJCVN0cmluZyBwYXJlbnRDYW5kaWRhdGVUeXBlKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2ggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcGVydGllc1RvTWF0Y2gucHV0KFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5VHlwZSksIGNoaWxkQ2FuZGlkYXRlVHlwZSk7CisJCUVpdGhlcjxMaXN0PENhcGFiaWxpdHlUeXBlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNwb25zZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5VHlwZSwgcHJvcGVydGllc1RvTWF0Y2gsIENhcGFiaWxpdHlUeXBlRGF0YS5jbGFzcyk7CisJCWlmIChnZXRSZXNwb25zZS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gZ2V0UmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmZXRjaCBjYXBhYmlsaXR5IHR5cGUge30sIGVycm9yOiB7fSIsIGNoaWxkQ2FuZGlkYXRlVHlwZSwgdGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHRpdGFuT3BlcmF0aW9uU3RhdHVzKSk7CisJCX0KKwkJU3RyaW5nIGNoaWxkVW5pcXVlSWQgPSBnZXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKTsKKwkJU2V0PFN0cmluZz4gdHJhdmVsbGVkVHlwZXMgPSBuZXcgSGFzaFNldDw+KCk7CisJCWRvIHsKKwkJCXRyYXZlbGxlZFR5cGVzLmFkZChjaGlsZFVuaXF1ZUlkKTsKKwkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eVR5cGVEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlKSwgY2hpbGRVbmlxdWVJZCwKKwkJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUsIENhcGFiaWxpdHlUeXBlRGF0YS5jbGFzcyk7CisJCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCQlpZiAoY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuT3BlcmF0aW9uU3RhdHVzID0gZ2V0UmVzcG9uc2UucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZldGNoIGRlcml2ZWQgZnJvbSBub2RlIGZvciBjYXBhYmlsaXR5IHR5cGUge30sIGVycm9yOiB7fSIsIGNoaWxkQ2FuZGlkYXRlVHlwZSwKKwkJCQkJCQl0aXRhbk9wZXJhdGlvblN0YXR1cyk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh0aXRhbk9wZXJhdGlvblN0YXR1cykpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiRGVyaXZlZCBmcm9tIG5vZGUgaXMgbm90IGZvdW5kIGZvciB0eXBlIHt9IC0gdGhpcyBpcyBPSyBmb3Igcm9vdCBjYXBhYmlsaXR5LiIpOworCQkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCQkJCX0KKwkJCX0KKwkJCVN0cmluZyBkZXJpdmVkRnJvbVVuaXF1ZUlkID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKS5nZXQoMCkuZ2V0TGVmdCgpLmdldFVuaXF1ZUlkKCk7CisJCQlpZiAoZGVyaXZlZEZyb21VbmlxdWVJZC5lcXVhbHMocGFyZW50Q2FuZGlkYXRlVHlwZSkpIHsKKwkJCQlsb2cuZGVidWcoIlZlcmlmaWVkIHRoYXQgY2FwYWJpbGl0eSB0eXBlIHt9IGRlcml2ZXMgZnJvbSBjYXBhYmlsaXR5IHR5cGUge30iLCBjaGlsZENhbmRpZGF0ZVR5cGUsCisJCQkJCQlwYXJlbnRDYW5kaWRhdGVUeXBlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJCQl9CisJCQljaGlsZFVuaXF1ZUlkID0gZGVyaXZlZEZyb21VbmlxdWVJZDsKKwkJfSB3aGlsZSAoIXRyYXZlbGxlZFR5cGVzLmNvbnRhaW5zKGNoaWxkVW5pcXVlSWQpKTsKKwkJLy8gdGhpcyBzdG9wIGNvbmRpdGlvbiBzaG91bGQgbmV2ZXIgYmUgdXNlZCwgaWYgd2UgdXNlIGl0LCB3ZSBoYXZlIGFuCisJCS8vIGlsbGVnYWwgY3ljbGUgaW4gZ3JhcGggLSAiZGVyaXZlZCBmcm9tIiBoaWVyYXJjaHkgY2Fubm90IGJlIGN5Y2xlZC4KKwkJLy8gSXQncyBoZXJlIGp1c3QgdG8gYXZvaWQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHdlIGhhdmUgc3VjaCBjeWNsZS4KKwkJbG9nLmVycm9yKCJEZXRlY3RlZCBhIGN5Y2xlIG9mIFwiZGVyaXZlZCBmcm9tXCIgZWRnZXMgc3RhcnRpbmcgYXQgY2FwYWJpbGl0eSB0eXBlIG5vZGUge30iLCBjaGlsZFVuaXF1ZUlkKTsKKwkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCX0KKworCS8qKgorCSAqIEZPUiBURVNUIE9OTFkKKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydHlPcGVyYXRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU9wZXJhdGlvbihQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbikgeworCQl0aGlzLnByb3BlcnR5T3BlcmF0aW9uID0gcHJvcGVydHlPcGVyYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxHcm91cFR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0R3JvdXBUeXBlQnlOYW1lRnJvbUdyYXBoKFN0cmluZyBuYW1lKSB7CisKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0hlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0hlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3YjhjNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvSGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ5MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLkFwcGxpY2F0aW9uRGF0YVR5cGVDYWNoZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5oZWF0LkhlYXRQYXJhbWV0ZXJUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklIZWF0UGFyYW1ldGVyc09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuUHJvcGVydHlWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzLlByb3BlcnR5VHlwZVZhbGlkYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5IZWF0UGFyYW1ldGVyRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5IZWF0UGFyYW1ldGVyVmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVuaXF1ZUlkRGF0YTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJoZWF0LXBhcmFtZXRlci1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIEhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uIGltcGxlbWVudHMgSUhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1ZBTFVFID0gbnVsbDsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlwcml2YXRlIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlwdWJsaWMgVGl0YW5HZW5lcmljRGFvIGdldFRpdGFuR2VuZXJpY0RhbygpIHsKKwkJcmV0dXJuIHRpdGFuR2VuZXJpY0RhbzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaXRhbkdlbmVyaWNEYW8oVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbykgeworCQl0aGlzLnRpdGFuR2VuZXJpY0RhbyA9IHRpdGFuR2VuZXJpY0RhbzsKKwl9CisKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBnZXRIZWF0UGFyYW1ldGVyc09mTm9kZShOb2RlVHlwZUVudW0gbm9kZVR5cGUsIFN0cmluZyB1bmlxdWVJZCwgTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gcHJvcGVydGllcykgeworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlckRhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5Ob2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5IRUFUX1BBUkFNRVRFUiwgTm9kZVR5cGVFbnVtLkhlYXRQYXJhbWV0ZXIsCisJCQkJSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCisJCWlmIChjaGlsZHJlbk5vZGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJfQorCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxIZWF0UGFyYW1ldGVyRGF0YSwgR3JhcGhFZGdlPj4gdmFsdWVzID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxIZWF0UGFyYW1ldGVyRGF0YSwgR3JhcGhFZGdlPiBpbW11dGFibGVQYWlyIDogdmFsdWVzKSB7CisJCQkJR3JhcGhFZGdlIGVkZ2UgPSBpbW11dGFibGVQYWlyLmdldFZhbHVlKCk7CisJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIGVkZ2UuZ2V0UHJvcGVydGllcygpLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJCQlsb2cuZGVidWcoIlByb3BlcnR5IHt9IGlzIGFzc29jaWF0ZWQgdG8gbm9kZSB7fSIsIHByb3BlcnR5TmFtZSwgdW5pcXVlSWQpOworCQkJCUhlYXRQYXJhbWV0ZXJEYXRhIHByb3BlcnR5RGF0YSA9IGltbXV0YWJsZVBhaXIuZ2V0S2V5KCk7CisJCQkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gY29udmVydFBhcmFtZXRlckRhdGFUb1BhcmFtZXRlckRlZmluaXRpb24ocHJvcGVydHlEYXRhLCBwcm9wZXJ0eU5hbWUsIHVuaXF1ZUlkKTsKKworCQkJCXByb3BlcnRpZXMuYWRkKHByb3BlcnR5RGVmaW5pdGlvbik7CisKKwkJCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKwkJCQkJbG9nLnRyYWNlKCJnZXRIZWF0UGFyYW1ldGVyc09mTm9kZSAtIHByb3BlcnR5IHt9IGFzc29jaWF0ZWQgdG8gbm9kZSB7fSIsIHByb3BlcnR5RGVmaW5pdGlvbiwgdW5pcXVlSWQpOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZ2V0UGFyYW1ldGVyc1ZhbHVlTm9kZXMoTm9kZVR5cGVFbnVtIHBhcmVudE5vZGVUeXBlLCBTdHJpbmcgcGFyZW50VW5pcXVlSWQsIExpc3Q8SGVhdFBhcmFtZXRlclZhbHVlRGF0YT4gaGVhdFZhbHVlcykgeworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUocGFyZW50Tm9kZVR5cGUpLCBwYXJlbnRVbmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLlBBUkFNRVRFUl9WQUxVRSwKKwkJCQlOb2RlVHlwZUVudW0uSGVhdFBhcmFtZXRlclZhbHVlLCBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLmNsYXNzKTsKKworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cyk7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gdmFsdWVzID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgOiB2YWx1ZXMpIHsKKwkJCQlHcmFwaEVkZ2UgZWRnZSA9IGltbXV0YWJsZVBhaXIuZ2V0VmFsdWUoKTsKKwkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgZWRnZS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCQlsb2cudHJhY2UoIkhlYXQgdmFsdWUgIiArIHByb3BlcnR5TmFtZSArICIgaXMgYXNzb2NpYXRlZCB0byBub2RlICIgKyBwYXJlbnRVbmlxdWVJZCk7CisJCQkJSGVhdFBhcmFtZXRlclZhbHVlRGF0YSBwcm9wZXJ0eURhdGEgPSBpbW11dGFibGVQYWlyLmdldEtleSgpOworCisJCQkJaGVhdFZhbHVlcy5hZGQocHJvcGVydHlEYXRhKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsSGVhdFBhcmFtZXRlcnNBc3NvY2lhdGVkVG9Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+KCk7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcHJvcGVydGllc09mTm9kZVJlcyA9IGdldEhlYXRQYXJhbWV0ZXJzT2ZOb2RlKG5vZGVUeXBlLCB1bmlxdWVJZCwgaGVhdFBhcmFtcyk7CisKKwkJaWYgKCFwcm9wZXJ0aWVzT2ZOb2RlUmVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSAmJiAhcHJvcGVydGllc09mTm9kZVJlcy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHByb3BlcnRpZXNPZk5vZGVSZXMpOworCQl9CisKKwkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gOiBoZWF0UGFyYW1zKSB7CisKKwkJCVN0cmluZyBwcm9wZXJ0eVVpZCA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCQkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUHJvcGVydHlSZXMgPSBkZWxldGVIZWF0UGFyYW1ldGVyRnJvbUdyYXBoKHByb3BlcnR5VWlkKTsKKwkJCWlmIChkZWxldGVQcm9wZXJ0eVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBkZWxldGUgaGVhdCBwYXJhbWV0ZXIgd2l0aCBpZCB7fSIsIHByb3BlcnR5VWlkKTsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVQcm9wZXJ0eVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCQl9CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJfQorCisJCX0KKworCQlsb2cuZGVidWcoIlRoZSBoZWF0IHBhcmFtZXRlcnMgZGVsZXRlZCBmcm9tIG5vZGUge30gYXJlIHt9IiwgdW5pcXVlSWQsIGhlYXRQYXJhbXMpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaGVhdFBhcmFtcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgZGVsZXRlQWxsSGVhdFZhbHVlc0Fzc29jaWF0ZWRUb05vZGUoTm9kZVR5cGVFbnVtIHBhcmVudE5vZGVUeXBlLCBTdHJpbmcgcGFyZW50VW5pcXVlSWQpIHsKKworCQlMaXN0PEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGE+IGhlYXRWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGE+KCk7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcHJvcGVydGllc09mTm9kZVJlcyA9IGdldFBhcmFtZXRlcnNWYWx1ZU5vZGVzKHBhcmVudE5vZGVUeXBlLCBwYXJlbnRVbmlxdWVJZCwgaGVhdFZhbHVlcyk7CisKKwkJaWYgKCFwcm9wZXJ0aWVzT2ZOb2RlUmVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSAmJiAhcHJvcGVydGllc09mTm9kZVJlcy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQlyZXR1cm4gcHJvcGVydGllc09mTm9kZVJlczsKKwkJfQorCisJCWZvciAoSGVhdFBhcmFtZXRlclZhbHVlRGF0YSBwcm9wZXJ0eURlZmluaXRpb24gOiBoZWF0VmFsdWVzKSB7CisKKwkJCVN0cmluZyBwcm9wZXJ0eVVpZCA9IChTdHJpbmcpIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCQkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVQcm9wZXJ0eVJlcyA9IGRlbGV0ZUhlYXRQYXJhbWV0ZXJWYWx1ZUZyb21HcmFwaChwcm9wZXJ0eVVpZCk7CisJCQlpZiAoZGVsZXRlUHJvcGVydHlSZXMuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIGhlYXQgcGFyYW1ldGVyIHZhbHVlIHdpdGggaWQge30iLCBwcm9wZXJ0eVVpZCk7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlUHJvcGVydHlSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cyk7CisJCQl9CisKKwkJfQorCisJCWxvZy5kZWJ1ZygiVGhlIGhlYXQgdmFsdWVzIGRlbGV0ZWQgZnJvbSBub2RlIHt9IGFyZSB7fSIsIHBhcmVudFVuaXF1ZUlkLCBoZWF0VmFsdWVzKTsKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8SGVhdFBhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVIZWF0UGFyYW1ldGVyRnJvbUdyYXBoKFN0cmluZyBwcm9wZXJ0eUlkKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIGRlbGV0aW5nIGhlYXQgcGFyYW1ldGVyIGZyb20gZ3JhcGgge30iLCBwcm9wZXJ0eUlkKTsKKwkJcmV0dXJuIHRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5IZWF0UGFyYW1ldGVyKSwgcHJvcGVydHlJZCwgSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVIZWF0UGFyYW1ldGVyVmFsdWVGcm9tR3JhcGgoU3RyaW5nIHByb3BlcnR5SWQpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZGVsZXRpbmcgaGVhdCBwYXJhbWV0ZXIgZnJvbSBncmFwaCB7fSIsIHByb3BlcnR5SWQpOworCQlyZXR1cm4gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkhlYXRQYXJhbWV0ZXJWYWx1ZSksIHByb3BlcnR5SWQsIEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEuY2xhc3MpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnRpZXNUb0dyYXBoKExpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IHByb3BlcnRpZXMsIFN0cmluZyBwYXJlbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJZm9yIChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gOiBwcm9wZXJ0aWVzKSB7CisKKwkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlEZWZpbml0aW9uLmdldE5hbWUoKTsKKworCQkJCS8vIHR5cGUgYW5kIHZhbHVlIHNob3VsZCBiZSB2YWxpZGF0ZWQgaW4gYnVzaW5lc3MgbG9naWM6CisJCQkJLy8gQXJ0aWZhY3RzQnVzaW5lc3NMb2dpYy52YWxpZGF0ZUFuZENvbnZlcnRIZWF0UGFyYW1lcnMoQXJ0aWZhY3REZWZpbml0aW9uKQorCisJCQkJLy8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5ID0KKwkJCQkvLyB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5KHByb3BlcnR5RGVmaW5pdGlvbik7CisJCQkJLy8gaWYgKHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCS8vIGxvZy5lcnJvcigiUHJvcGVydHkgIiArIHByb3BlcnR5RGVmaW5pdGlvbiArICIgaXMgaW52YWxpZC4KKwkJCQkvLyBTdGF0dXMgaXMgIiArIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkpOworCQkJCS8vIHJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkJBRF9SRVFVRVNUOworCQkJCS8vIH0KKworCQkJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VG9HcmFwaCA9IGFkZFByb3BlcnR5VG9HcmFwaChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5RGVmaW5pdGlvbiwgcGFyZW50SWQsIG5vZGVUeXBlKTsKKworCQkJCWlmIChhZGRQcm9wZXJ0eVRvR3JhcGguaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFkZFByb3BlcnR5VG9HcmFwaC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlSGVhdFBhcmFtZXRlcnMoTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gcHJvcGVydGllcykgeworCisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJCWZvciAoSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7CisKKwkJCUhlYXRQYXJhbWV0ZXJEYXRhIGhlYXRQYXJhbWV0ZXJEYXRhID0gbmV3IEhlYXRQYXJhbWV0ZXJEYXRhKHByb3BlcnR5KTsKKwkJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShoZWF0UGFyYW1ldGVyRGF0YSwgSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCQkJaWYgKHVwZGF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIGhlYXQgcGFyYW1ldGVyIGluIGdyYXBoLiBpZCA9IHt9IiwgcHJvcGVydHkuZ2V0VW5pcXVlSWQoKSk7CisJCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHVibGljIEVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VG9HcmFwaChTdHJpbmcgcHJvcGVydHlOYW1lLCBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24sIFN0cmluZyBwYXJlbnRJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlKSB7CisKKwkJVW5pcXVlSWREYXRhIHBhcmVudE5vZGUgPSBuZXcgVW5pcXVlSWREYXRhKG5vZGVUeXBlLCBwYXJlbnRJZCk7CisKKwkJcHJvcGVydHlEZWZpbml0aW9uLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZEhlYXRQYXJhbWV0ZXJVbmlxdWVJZChwYXJlbnRJZCwgcHJvcGVydHlOYW1lKSk7CisJCUhlYXRQYXJhbWV0ZXJEYXRhIHByb3BlcnR5RGF0YSA9IG5ldyBIZWF0UGFyYW1ldGVyRGF0YShwcm9wZXJ0eURlZmluaXRpb24pOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB0byBncmFwaCB7fSIsIHByb3BlcnR5RGF0YSk7CisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9wZXJ0eURhdGEsIEhlYXRQYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcHJvcGVydHkgdG8gZ3JhcGgge30iLCBwcm9wZXJ0eURhdGEpOworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHt9IHRvIGdyYXBoLiBTdGF0dXMgaXMge30iLCBwcm9wZXJ0eU5hbWUsIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlOYW1lKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocGFyZW50Tm9kZSwgcHJvcGVydHlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuSEVBVF9QQVJBTUVURVIsIHByb3BzKTsKKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSB7fSB7fSB0byBoZWF0IHBhcmFtZXRlciB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9Iiwgbm9kZVR5cGUuZ2V0TmFtZSgpLCBwYXJlbnRJZCwgcHJvcGVydHlOYW1lLCBvcGVyYXRpb25TdGF0dXMpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNyZWF0ZU5vZGVSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24pIHsKKworCQlsb2cudHJhY2UoIkdvaW5nIHRvIHZhbGlkYXRlIHByb3BlcnR5IHR5cGUgYW5kIHZhbHVlLiB7fSIsIHByb3BlcnR5RGVmaW5pdGlvbik7CisKKwkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCk7CisJCUhlYXRQYXJhbWV0ZXJUeXBlIHR5cGUgPSBnZXRUeXBlKHByb3BlcnR5VHlwZSk7CisKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJbG9nLmluZm8oIlRoZSB0eXBlIHt9IG9mIGhlYXQgaXMgaW52YWxpZCIsIHR5cGUpOworCisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX1RZUEU7CisJCX0KKwkJcHJvcGVydHlEZWZpbml0aW9uLnNldFR5cGUodHlwZS5nZXRUeXBlKCkpOworCisJCWxvZy50cmFjZSgiQWZ0ZXIgdmFsaWRhdGluZyBwcm9wZXJ0eSB0eXBlIHt9IiwgcHJvcGVydHlUeXBlKTsKKworCQkvLyB2YWxpZGF0ZSBkZWZhdWx0IHZhbHVlCisJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7CisJCWJvb2xlYW4gaXNWYWxpZFByb3BlcnR5ID0gaXNWYWxpZFZhbHVlKHR5cGUsIGRlZmF1bHRWYWx1ZSk7CisJCWlmIChmYWxzZSA9PSBpc1ZhbGlkUHJvcGVydHkpIHsKKwkJCWxvZy5pbmZvKCJUaGUgdmFsdWUge30gb2YgcHJvcGVydHkgZnJvbSB0eXBlIHt9IGlzIGludmFsaWQiLCBkZWZhdWx0VmFsdWUsIHR5cGUpOworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9WQUxVRTsKKwkJfQorCisJCVByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgY29udmVydGVyID0gdHlwZS5nZXRDb252ZXJ0ZXIoKTsKKworCQlpZiAoaXNFbXB0eVZhbHVlKGRlZmF1bHRWYWx1ZSkpIHsKKwkJCWxvZy5kZWJ1ZygiRGVmYXVsdCB2YWx1ZSB3YXMgbm90IHNlbnQgZm9yIHByb3BlcnR5IHt9LiBTZXQgZGVmYXVsdCB2YWx1ZSB0byB7fSIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCksIEVNUFRZX1ZBTFVFKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoRU1QVFlfVkFMVUUpOworCQl9IGVsc2UgaWYgKGZhbHNlID09IGlzRW1wdHlWYWx1ZShkZWZhdWx0VmFsdWUpKSB7CisJCQlTdHJpbmcgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZXIuY29udmVydChkZWZhdWx0VmFsdWUsIG51bGwsIG51bGwpOworCQkJcHJvcGVydHlEZWZpbml0aW9uLnNldERlZmF1bHRWYWx1ZShjb252ZXJ0ZWRWYWx1ZSk7CisJCX0KKworCQkvLyB2YWxpZGF0ZSBjdXJyZW50IHZhbHVlCisJCVN0cmluZyB2YWx1ZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDdXJyZW50VmFsdWUoKTsKKwkJaXNWYWxpZFByb3BlcnR5ID0gaXNWYWxpZFZhbHVlKHR5cGUsIHZhbHVlKTsKKwkJaWYgKGZhbHNlID09IGlzVmFsaWRQcm9wZXJ0eSkgeworCQkJbG9nLmluZm8oIlRoZSB2YWx1ZSB7fSBvZiBwcm9wZXJ0eSBmcm9tIHR5cGUge30gaXMgaW52YWxpZCIsIHZhbHVlLCB0eXBlKTsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfVkFMVUU7CisJCX0KKworCQlpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkgeworCQkJbG9nLmRlYnVnKCJWYWx1ZSB3YXMgbm90IHNlbnQgZm9yIHByb3BlcnR5IHt9LiBTZXQgdmFsdWUgdG8ge30iLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0TmFtZSgpLCBFTVBUWV9WQUxVRSk7CisJCQlwcm9wZXJ0eURlZmluaXRpb24uc2V0Q3VycmVudFZhbHVlKEVNUFRZX1ZBTFVFKTsKKwkJfSBlbHNlIGlmICghdmFsdWUuZXF1YWxzKCIiKSkgeworCQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLmNvbnZlcnQodmFsdWUsIG51bGwsIG51bGwpOworCQkJcHJvcGVydHlEZWZpbml0aW9uLnNldEN1cnJlbnRWYWx1ZShjb252ZXJ0ZWRWYWx1ZSk7CisJCX0KKworCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgSGVhdFBhcmFtZXRlckRlZmluaXRpb24gY29udmVydFBhcmFtZXRlckRhdGFUb1BhcmFtZXRlckRlZmluaXRpb24oSGVhdFBhcmFtZXRlckRhdGEgcHJvcGVydHlEYXRhUmVzdWx0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCQlsb2cuZGVidWcoImNvbnZlcnQgdG8gSGVhdFBhcmFtZXJlRGVmaW5pdGlvbiB7fSIsIHByb3BlcnR5RGF0YVJlc3VsdCk7CisKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcHJvcGVydHlEZWZSZXN1bHQgPSBuZXcgSGVhdFBhcmFtZXRlckRlZmluaXRpb24ocHJvcGVydHlEYXRhUmVzdWx0LmdldEhlYXREYXRhRGVmaW5pdGlvbigpKTsKKworCQlwcm9wZXJ0eURlZlJlc3VsdC5zZXROYW1lKHByb3BlcnR5TmFtZSk7CisKKwkJcmV0dXJuIHByb3BlcnR5RGVmUmVzdWx0OworCX0KKworCXByaXZhdGUgSGVhdFBhcmFtZXRlclR5cGUgZ2V0VHlwZShTdHJpbmcgcHJvcGVydHlUeXBlKSB7CisKKwkJSGVhdFBhcmFtZXRlclR5cGUgdHlwZSA9IEhlYXRQYXJhbWV0ZXJUeXBlLmlzVmFsaWRUeXBlKHByb3BlcnR5VHlwZSk7CisKKwkJcmV0dXJuIHR5cGU7CisKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUgdHlwZSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmIChpc0VtcHR5VmFsdWUodmFsdWUpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCVByb3BlcnR5VHlwZVZhbGlkYXRvciB2YWxpZGF0b3IgPSB0eXBlLmdldFZhbGlkYXRvcigpOworCisJCWJvb2xlYW4gaXNWYWxpZCA9IHZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlLCBudWxsLCBudWxsKTsKKwkJaWYgKHRydWUgPT0gaXNWYWxpZCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRW1wdHlWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc051bGxQYXJhbShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUhlYXRQYXJhbWV0ZXJWYWx1ZShIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW0sIFN0cmluZyBhcnRpZmFjdElkLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCkgeworCQlTdHJpbmcgaGVhdEVudklkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkSGVhdFBhcmFtZXRlclZhbHVlVW5pcXVlSWQocmVzb3VyY2VJbnN0YW5jZUlkLCBhcnRpZmFjdExhYmVsLCBoZWF0UGFyYW0uZ2V0TmFtZSgpKTsKKwkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgaGVhdEVudklkLCBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLmNsYXNzKTsKKwkJaWYgKGdldE5vZGUuaXNSaWdodCgpIHx8IGdldE5vZGUubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJaWYgKGhlYXRQYXJhbS5nZXRDdXJyZW50VmFsdWUoKSA9PSBudWxsIHx8IChoZWF0UGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCAmJiBoZWF0UGFyYW0uZ2V0Q3VycmVudFZhbHVlKCkuZXF1YWxzKGhlYXRQYXJhbS5nZXREZWZhdWx0VmFsdWUoKSkpKSB7CisJCQkJbG9nLmRlYnVnKCJVcGRhdGVkIGhlYXQgcGFyYW1ldGVyIHZhbHVlIGVxdWFscyBkZWZhdWx0IHZhbHVlLiBObyBuZWVkIHRvIGNyZWF0ZSBoZWF0IHBhcmFtZXRlciB2YWx1ZSBmb3IgaGVhdCBwYXJhbWV0ZXIge30iLCBoZWF0UGFyYW0uZ2V0VW5pcXVlSWQoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG51bGwpOworCQkJfQorCQkJcmV0dXJuIGNyZWF0ZUhlYXRQYXJhbWV0ZXJWYWx1ZShoZWF0UGFyYW0sIGFydGlmYWN0SWQsIHJlc291cmNlSW5zdGFuY2VJZCwgYXJ0aWZhY3RMYWJlbCk7CisJCX0gZWxzZSB7CisJCQloZWF0UGFyYW0uc2V0VW5pcXVlSWQoaGVhdEVudklkKTsKKwkJCXJldHVybiB1cGRhdGVIZWF0UGFyYW1ldGVyVmFsdWUoaGVhdFBhcmFtKTsKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlSGVhdFBhcmFtZXRlclZhbHVlKEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbSkgeworCQlIZWF0UGFyYW1ldGVyVmFsdWVEYXRhIGhlYXRQYXJhbWV0ZXJWYWx1ZSA9IG5ldyBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhKCk7CisJCWhlYXRQYXJhbWV0ZXJWYWx1ZS5zZXRVbmlxdWVJZChoZWF0UGFyYW0uZ2V0VW5pcXVlSWQoKSk7CisJCWlmIChoZWF0UGFyYW0uZ2V0Q3VycmVudFZhbHVlKCkgPT0gbnVsbCB8fCAoaGVhdFBhcmFtLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwgJiYgaGVhdFBhcmFtLmdldEN1cnJlbnRWYWx1ZSgpLmVxdWFscyhoZWF0UGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCkpKSkgeworCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVQYXJhbWV0ZXJWYWx1ZUluY29taW5nUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlSW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEoaGVhdFBhcmFtZXRlclZhbHVlLCBHcmFwaEVkZ2VMYWJlbHMuUEFSQU1FVEVSX1ZBTFVFLCBudWxsKTsKKwkJCWlmIChkZWxldGVQYXJhbWV0ZXJWYWx1ZUluY29taW5nUmVsYXRpb24uaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGhlYXQgcGFyYW1ldGVyIHZhbHVlIGluY29taW5nIHJlbGF0aW9uIG9uIGdyYXBoLiBpZCA9IHt9IiwgaGVhdFBhcmFtZXRlclZhbHVlLmdldFVuaXF1ZUlkKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhkZWxldGVQYXJhbWV0ZXJWYWx1ZUluY29taW5nUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisJCQlFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldE91dGdvaW5nUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uZ2V0T3V0Z29pbmdFZGdlQnlDcml0ZXJpYShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCAoU3RyaW5nKSBoZWF0UGFyYW1ldGVyVmFsdWUuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLlBBUkFNRVRFUl9JTVBMLCBudWxsKTsKKwkJCWlmIChnZXRPdXRnb2luZ1JlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBoZWF0IHBhcmFtZXRlciB2YWx1ZSBvdXRnb2luZyByZWxhdGlvbiBmcm9tIGdyYXBoLiBpZCA9IHt9IiwgaGVhdFBhcmFtZXRlclZhbHVlLmdldFVuaXF1ZUlkKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhnZXRPdXRnb2luZ1JlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfQorCQkJRWRnZSBlZGdlID0gZ2V0T3V0Z29pbmdSZWxhdGlvbi5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChlZGdlID09IG51bGwpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgaGVhdCBwYXJhbWV0ZXIgdmFsdWUgb3V0Z29pbmcgcmVsYXRpb24gZnJvbSBncmFwaC4gaWQgPSB7fSIsIGhlYXRQYXJhbWV0ZXJWYWx1ZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisJCQllZGdlLnJlbW92ZSgpOworCisJCQlFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShoZWF0UGFyYW1ldGVyVmFsdWUsIEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEuY2xhc3MpOworCQkJaWYgKGRlbGV0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGVsZXRlIGhlYXQgcGFyYW1ldGVyIHZhbHVlIG9uIGdyYXBoLiBpZCA9IHt9IiwgaGVhdFBhcmFtZXRlclZhbHVlLmdldFVuaXF1ZUlkKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhkZWxldGVOb2RlLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGRlbGV0ZU5vZGUubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCWhlYXRQYXJhbWV0ZXJWYWx1ZS5zZXRWYWx1ZShoZWF0UGFyYW0uZ2V0Q3VycmVudFZhbHVlKCkpOworCQlFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShoZWF0UGFyYW1ldGVyVmFsdWUsIEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEuY2xhc3MpOworCQlpZiAodXBkYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBoZWF0IHBhcmFtZXRlciB2YWx1ZSBpbiBncmFwaC4gaWQgPSB7fSIsIGhlYXRQYXJhbWV0ZXJWYWx1ZS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh1cGRhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVOb2RlLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUhlYXRQYXJhbWV0ZXJWYWx1ZShIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW0sIFN0cmluZyBhcnRpZmFjdElkLCBTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCkgeworCisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkSGVhdFZhbHVlVG9HcmFwaCA9IGFkZEhlYXRWYWx1ZVRvR3JhcGgoaGVhdFBhcmFtLCBhcnRpZmFjdExhYmVsLCBhcnRpZmFjdElkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQlpZiAoYWRkSGVhdFZhbHVlVG9HcmFwaC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNyZWF0ZSBoZWF0IHBhcmFtZXRlcnMgdmFsdWUgb24gZ3JhcGggZm9yIGFydGlmYWN0IHt9IiwgYXJ0aWZhY3RJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYWRkSGVhdFZhbHVlVG9HcmFwaC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoYWRkSGVhdFZhbHVlVG9HcmFwaC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHVibGljIEVpdGhlcjxIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkSGVhdFZhbHVlVG9HcmFwaChIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW1ldGVyLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCwgU3RyaW5nIGFydGlmYWN0SWQsIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQpIHsKKworCQlVbmlxdWVJZERhdGEgaGVhdEVudk5vZGUgPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwgYXJ0aWZhY3RJZCk7CisJCUhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEgaGVhdFZhbHVlRGF0YSA9IG5ldyBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhKCk7CisJCWhlYXRWYWx1ZURhdGEuc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkSGVhdFBhcmFtZXRlclZhbHVlVW5pcXVlSWQocmVzb3VyY2VJbnN0YW5jZUlkLCBhcnRpZmFjdExhYmVsLCBoZWF0UGFyYW1ldGVyLmdldE5hbWUoKSkpOworCQloZWF0VmFsdWVEYXRhLnNldFZhbHVlKGhlYXRQYXJhbWV0ZXIuZ2V0Q3VycmVudFZhbHVlKCkpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB0byBncmFwaCB7fSIsIGhlYXRWYWx1ZURhdGEpOworCQlFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShoZWF0VmFsdWVEYXRhLCBIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcHJvcGVydHkgdG8gZ3JhcGgge30iLCBoZWF0VmFsdWVEYXRhKTsKKwkJaWYgKGNyZWF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBoZWF0IHZhbHVlIHt9IHRvIGdyYXBoLiBTdGF0dXMgaXMge30iLCBoZWF0VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCksIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgaGVhdFBhcmFtZXRlci5nZXROYW1lKCkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihoZWF0RW52Tm9kZSwgaGVhdFZhbHVlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlBBUkFNRVRFUl9WQUxVRSwgcHJvcHMpOworCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlUmVsUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSBoZWF0IHZhbHVlIHt9IHRvIGhlYXQgZW52IGFydGlmYWN0IHt9IGluIGdyYXBoLiBTdGF0dXMgaXMge30iLCBoZWF0VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCksIGFydGlmYWN0SWQsIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKwkJVW5pcXVlSWREYXRhIGhlYXRQYXJhbWV0ZXJOb2RlID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uSGVhdFBhcmFtZXRlciwgaGVhdFBhcmFtZXRlci5nZXRVbmlxdWVJZCgpKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWwyUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGhlYXRWYWx1ZURhdGEsIGhlYXRQYXJhbWV0ZXJOb2RlLCBHcmFwaEVkZ2VMYWJlbHMuUEFSQU1FVEVSX0lNUEwsIG51bGwpOworCQlpZiAoY3JlYXRlUmVsMlJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbDJSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGhlYXQgdmFsdWUge30gdG8gaGVhdCBwYXJhbWV0ZXIge30gaW4gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIGhlYXRWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKSwgaGVhdFBhcmFtZXRlci5nZXROYW1lKCksIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlTm9kZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvSW5wdXRzT3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0lucHV0c09wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDEzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0lucHV0c09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE4NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnByb2Nlc3MudHJhdmVyc2FsLk9yZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkRpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5HcmFwaEVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWxlbWVudFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdElucHV0c01hcDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUlucHV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkdldElucHV0VmFsdWVJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklucHV0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUlucHV0c09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkF0dHJpYnV0ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50SW5zdGFuY2VEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNvbXBvbmVudE1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5JbnB1dFZhbHVlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5JbnB1dHNEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9wZXJ0eVZhbHVlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuV3JhcHBlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkVkZ2U7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhbkdyYXBoOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleFF1ZXJ5OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuYXR0cmlidXRlLkNtcDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJpbnB1dC1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIElucHV0c09wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIGltcGxlbWVudHMgSUlucHV0c09wZXJhdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJTkdfSU5QVVRfVE9fUFJPUCA9ICJBc3NvY2lhdGluZ0lucHV0VG9Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5IjsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbnB1dHNPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBBdXRvd2lyZWQKKwlwcml2YXRlIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uIGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uOworCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwkvKioKKwkgKiBEZWxldGUgc3BlY2lmaWMgaW5wdXQgZnJvbSBjb21wb25lbnQgQWx0aG91Z2ggaW5wdXRJZCBpcyB1bmlxdWUsIHBhc3MgYWxzbyBjb21wb25lbnRJZCBhcyBhbGwgb3RoZXIgbWV0aG9kcywgYW5kIGFsc28gY2hlY2sgdGhhdCB0aGUgaW5wdXRJZCBpcyBpbnNpZGUgdGhhdCBjb21wb25lbnRJZC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFN0cmluZywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlSW5wdXQoU3RyaW5nIGlucHV0SWQpIHsKKwkJbG9nLmRlYnVnKFN0cmluZy5mb3JtYXQoIkJlZm9yZSBkZWxldGluZyBpbnB1dDogJXMgZnJvbSBncmFwaCIsIGlucHV0SWQpKTsKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbnB1dHNWYWx1ZVN0YXR1cyA9IHRoaXMuZ2V0Q29tcG9uZW50SW5zdGFuY2VJbnB1dHNCeUlucHV0SWQoaW5wdXRJZCk7CisJCWlmKGlucHV0c1ZhbHVlU3RhdHVzLmlzTGVmdCgpKXsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gaW5wdXRzVmFsdWVMaXMgPSBpbnB1dHNWYWx1ZVN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmKCFpbnB1dHNWYWx1ZUxpcy5pc0VtcHR5KCkpeworCQkJCWZvcihDb21wb25lbnRJbnN0YW5jZUlucHV0IGlucHV0VmFsdWU6IGlucHV0c1ZhbHVlTGlzKXsKKwkJCQkJRWl0aGVyPElucHV0VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5JbnB1dFZhbHVlKSwgaW5wdXRWYWx1ZS5nZXRWYWx1ZVVuaXF1ZVVpZCgpLCBJbnB1dFZhbHVlRGF0YS5jbGFzcyk7CisJCQkJCWlmIChkZWxldGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGRlbGV0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKTsKKwkJCQkJfSAKKwkJCQl9CisJCQl9CisJCX0KKwkJRWl0aGVyPElucHV0c0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLklucHV0KSwgaW5wdXRJZCwgSW5wdXRzRGF0YS5jbGFzcyk7CisJCWlmIChkZWxldGVOb2RlLmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGRlbGV0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChpbnB1dElkKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxJbnB1dERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkSW5wdXRzVG9HcmFwaChTdHJpbmcgY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBpbnB1dHMsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisKKwkJTGlzdDxJbnB1dERlZmluaXRpb24+IG5ld0lucHV0cyA9IG5ldyBBcnJheUxpc3Q8SW5wdXREZWZpbml0aW9uPigpOworCQlpZiAoaW5wdXRzICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+IGVudHJ5IDogaW5wdXRzLmVudHJ5U2V0KCkpIHsKKworCQkJCVN0cmluZyBpbnB1dE5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlJbnB1dERlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSA9IHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkocHJvcGVydHlEZWZpbml0aW9uLCBkYXRhVHlwZXMpOworCQkJCWlmICh2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5ICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmVycm9yKCJQcm9wZXJ0eSAiICsgcHJvcGVydHlEZWZpbml0aW9uICsgIiBpcyBpbnZhbGlkLiBTdGF0dXMgaXMgIiArIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfUFJPUEVSVFkpOworCQkJCX0KKworCQkJCUVpdGhlcjxJbnB1dHNEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlUb0dyYXBoID0gYWRkSW5wdXRUb0dyYXBoKGlucHV0TmFtZSwgcHJvcGVydHlEZWZpbml0aW9uLCBjb21wb25lbnRJZCwgbm9kZVR5cGUpOworCisJCQkJaWYgKGFkZFByb3BlcnR5VG9HcmFwaC5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChhZGRQcm9wZXJ0eVRvR3JhcGgucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQkJSW5wdXREZWZpbml0aW9uIGNyZWF0ZWRJbnB1dHlEZWZpbml0aW9uID0gY29udmVydElucHV0RGF0YVRvSW5wdXREZWZpbml0aW9uKGFkZFByb3BlcnR5VG9HcmFwaC5sZWZ0KCkudmFsdWUoKSk7CisJCQkJY3JlYXRlZElucHV0eURlZmluaXRpb24uc2V0TmFtZShpbnB1dE5hbWUpOworCQkJCWNyZWF0ZWRJbnB1dHlEZWZpbml0aW9uLnNldFBhcmVudFVuaXF1ZUlkKGNvbXBvbmVudElkKTsKKwkJCQluZXdJbnB1dHMuYWRkKGNyZWF0ZWRJbnB1dHlEZWZpbml0aW9uKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChuZXdJbnB1dHMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRJbnB1dHNUb0dyYXBoKFRpdGFuVmVydGV4IG1ldGFkYXRhLCBTdHJpbmcgY29tcG9uZW50SWQsIE1hcDxTdHJpbmcsIElucHV0RGVmaW5pdGlvbj4gaW5wdXRzLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCWlmIChpbnB1dHMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIElucHV0RGVmaW5pdGlvbj4gZW50cnkgOiBpbnB1dHMuZW50cnlTZXQoKSkgeworCisJCQkJU3RyaW5nIGlucHV0TmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJCUlucHV0RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5ID0gdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShwcm9wZXJ0eURlZmluaXRpb24sIGRhdGFUeXBlcyk7CisJCQkJaWYgKHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlsb2cuZXJyb3IoIlByb3BlcnR5IHt9IGlzIGludmFsaWQuIFN0YXR1cyBpcyB7fSAiLCBwcm9wZXJ0eURlZmluaXRpb24sIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkpOworCQkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9QUk9QRVJUWTsKKwkJCQl9CisKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0eVRvR3JhcGggPSBhZGRJbnB1dFRvR3JhcGgobWV0YWRhdGEsIGlucHV0TmFtZSwgcHJvcGVydHlEZWZpbml0aW9uLCBjb21wb25lbnRJZCk7CisKKwkJCQlpZiAoIWFkZFByb3BlcnR5VG9HcmFwaC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCXJldHVybiBhZGRQcm9wZXJ0eVRvR3JhcGg7CisJCQkJfQorCisJCQl9CisJCX0KKworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PElucHV0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldElucHV0c09mQ29tcG9uZW50KFN0cmluZyBjb21wSWQsIFN0cmluZyBmcm9tTmFtZSwgaW50IGFtb3VudCkgeworCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmICgoZnJvbU5hbWUgPT0gbnVsbCB8fCBmcm9tTmFtZS5pc0VtcHR5KCkpICYmIGFtb3VudCA9PSAwKSB7CisKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRBbGxSZXNvdXJjZUlucHV0cyhjb21wSWQsIGlucHV0cyk7CisKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBzZXQgaW5wdXRzIG9mIHJlc291cmNlIHt9LiBzdGF0dXMgaXMge30iLCBjb21wSWQsIHN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJfQorCisJCX0gZWxzZSB7CisKKwkJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJCWlmIChncmFwaFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byByZXRyaWV2ZSBncmFwaC4gc3RhdHVzIGlzIHt9IiwgZ3JhcGhSZXMpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaFJlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0KKworCQkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IHRpdGFuR3JhcGgucXVlcnkoKS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgY29tcElkKS52ZXJ0aWNlcygpOworCQkJaWYgKHZlcnRpY2VzID09IG51bGwgfHwgZmFsc2UgPT0gdmVydGljZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCkpOworCQkJfQorCisJCQlUaXRhblZlcnRleCByb290VmVydGV4ID0gdmVydGljZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQlUaXRhblZlcnRleFF1ZXJ5PD8+IHF1ZXJ5OworCQkJaWYgKGZyb21OYW1lID09IG51bGwgfHwgZnJvbU5hbWUuaXNFbXB0eSgpKQorCQkJCXF1ZXJ5ID0gcm9vdFZlcnRleC5xdWVyeSgpLmRpcmVjdGlvbihEaXJlY3Rpb24uT1VUKS5sYWJlbHMoR3JhcGhFZGdlTGFiZWxzLklOUFVULmdldFByb3BlcnR5KCkpLm9yZGVyQnkoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBPcmRlci5pbmNyKS5saW1pdChhbW91bnQpOworCQkJZWxzZQorCQkJCXF1ZXJ5ID0gcm9vdFZlcnRleC5xdWVyeSgpLmRpcmVjdGlvbihEaXJlY3Rpb24uT1VUKS5sYWJlbHMoR3JhcGhFZGdlTGFiZWxzLklOUFVULmdldFByb3BlcnR5KCkpLm9yZGVyQnkoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBPcmRlci5pbmNyKS5oYXMoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBDbXAuR1JFQVRFUl9USEFOLCBmcm9tTmFtZSkubGltaXQoYW1vdW50KTsKKworCQkJSXRlcmFibGU8VGl0YW5FZGdlPiBlZGdlc0NyZWF0b3JFZ2VzID0gcXVlcnkuZWRnZXMoKTsKKworCQkJaWYgKGVkZ2VzQ3JlYXRvckVnZXMgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiTm8gZWRnZXMgaW4gZ3JhcGggZm9yIGNyaXRlcmlhIik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpOworCQkJfQorCQkJSXRlcmF0b3I8VGl0YW5FZGdlPiBlZGdlc0NyZWF0b3JJdGVyYXRvciA9IGVkZ2VzQ3JlYXRvckVnZXMuaXRlcmF0b3IoKTsKKworCQkJaWYgKGVkZ2VzQ3JlYXRvckl0ZXJhdG9yICE9IG51bGwpIHsKKwkJCQl3aGlsZSAoZWRnZXNDcmVhdG9ySXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCUVkZ2UgZWRnZSA9IGVkZ2VzQ3JlYXRvckl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJR3JhcGhFZGdlIGdyYXBoRWRnZSA9IG51bGw7CisKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcHMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydGllcyhlZGdlKTsKKwkJCQkJR3JhcGhFZGdlTGFiZWxzIGVkZ2VUeXBlRnJvbUdyYXBoID0gR3JhcGhFZGdlTGFiZWxzLmdldEJ5TmFtZShlZGdlLmxhYmVsKCkpOworCQkJCQlncmFwaEVkZ2UgPSBuZXcgR3JhcGhFZGdlKGVkZ2VUeXBlRnJvbUdyYXBoLCBlZGdlUHJvcHMpOworCisJCQkJCVZlcnRleCBvdXRnb2luZ1ZlcnRleCA9IGVkZ2UuaW5WZXJ0ZXgoKTsKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnRpZXMob3V0Z29pbmdWZXJ0ZXgpOworCQkJCQlJbnB1dHNEYXRhIGRhdGEgPSBHcmFwaEVsZW1lbnRGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoTm9kZVR5cGVFbnVtLklucHV0LmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgcHJvcGVydGllcywgSW5wdXRzRGF0YS5jbGFzcyk7CisJCQkJCVN0cmluZyBpbnB1dE5hbWUgPSAoU3RyaW5nKSBncmFwaEVkZ2UuZ2V0UHJvcGVydGllcygpLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCQlJbnB1dERlZmluaXRpb24gaW5wdXREZWZpbml0aW9uID0gdGhpcy5jb252ZXJ0SW5wdXREYXRhVG9JbnB1dERlZmluaXRpb24oZGF0YSk7CisJCQkJCWlucHV0RGVmaW5pdGlvbi5zZXROYW1lKGlucHV0TmFtZSk7CisJCQkJCWlucHV0RGVmaW5pdGlvbi5zZXRQYXJlbnRVbmlxdWVJZChjb21wSWQpOworCisJCQkJCWlucHV0cy5hZGQoaW5wdXREZWZpbml0aW9uKTsKKworCQkJCX0KKwkJCX0KKworCQl9CisJCWlmICh0cnVlID09IGlucHV0cy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChpbnB1dHMpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBJbnB1dERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxJbnB1dHNBc3NvY2lhdGVkVG9Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJV3JhcHBlcjxUaXRhbk9wZXJhdGlvblN0YXR1cz4gZXJyb3JXcmFwcGVyOworCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gaW5wdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRBbGxSZXNvdXJjZUF0dHJpYnVlcyA9IHRoaXMuZmluZE5vZGVOb25JbmhlcmV0ZWRJbnB1dHModW5pcXVlSWQsIGlucHV0cyk7CisJCWVycm9yV3JhcHBlciA9IChmaW5kQWxsUmVzb3VyY2VBdHRyaWJ1ZXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spID8gbmV3IFdyYXBwZXI8PihmaW5kQWxsUmVzb3VyY2VBdHRyaWJ1ZXMpIDogbmV3IFdyYXBwZXI8PigpOworCisJCWlmIChlcnJvcldyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQlmb3IgKElucHV0RGVmaW5pdGlvbiBpbkRlZiA6IGlucHV0cykgeworCQkJCWxvZy5kZWJ1ZygiQmVmb3JlIGRlbGV0aW5nIGlucHV0cyBmcm9tIGdyYXBoIHt9IiwgaW5EZWYuZ2V0VW5pcXVlSWQoKSk7CisJCQkJRWl0aGVyPElucHV0c0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLklucHV0KSwgaW5EZWYuZ2V0VW5pcXVlSWQoKSwgSW5wdXRzRGF0YS5jbGFzcyk7CisJCQkJaWYgKGRlbGV0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJCWVycm9yV3JhcHBlci5zZXRJbm5lckVsZW1lbnQoZGVsZXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZXJyb3JXcmFwcGVyLmlzRW1wdHkoKSkgeworCQkJTWFwPFN0cmluZywgSW5wdXREZWZpbml0aW9uPiBpbnB1dHNNYXAgPSBpbnB1dHMuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGUgLT4gZS5nZXROYW1lKCksIGUgLT4gZSkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGlucHV0c01hcCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZXJyb3JXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKSk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8SW5wdXRzRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkSW5wdXQoU3RyaW5nIGlucHV0TmFtZSwgSW5wdXREZWZpbml0aW9uIGlucHV0RGVmaW5pdGlvbiwgU3RyaW5nIHJlc291cmNlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSkgeworCisJCUNvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnRNZXRhZGF0YSA9IG51bGw7CisKKwkJRWl0aGVyPElucHV0c0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBhZGRJbnB1dFRvR3JhcGgoaW5wdXROYW1lLCBpbnB1dERlZmluaXRpb24sIHJlc291cmNlSWQsIG5vZGVUeXBlKTsKKwkJaWYgKGVpdGhlci5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0b3JhZ2VTdGF0dXMpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChlaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8QXR0cmlidXRlRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlSW5wdXQoU3RyaW5nIGlucHV0SWQsIElucHV0RGVmaW5pdGlvbiBuZXdJbkRlZiwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPElucHV0c0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRJbnB1dFRvR3JhcGgoU3RyaW5nIHByb3BlcnR5TmFtZSwgSW5wdXREZWZpbml0aW9uIGlucHV0RGVmaW5pdGlvbiwgU3RyaW5nIGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUpIHsKKworCQlVbmlxdWVJZERhdGEgZnJvbSA9IG5ldyBVbmlxdWVJZERhdGEobm9kZVR5cGUsIGNvbXBvbmVudElkKTsKKworCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBpbnB1dERlZmluaXRpb24uZ2V0Q29uc3RyYWludHMoKTsKKworCQlpbnB1dERlZmluaXRpb24uc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChjb21wb25lbnRJZCwgcHJvcGVydHlOYW1lKSk7CisJCUlucHV0c0RhdGEgaW5wdXREYXRhID0gbmV3IElucHV0c0RhdGEoaW5wdXREZWZpbml0aW9uLCBjb252ZXJ0Q29uc3RyYWludHNUb1N0cmluZyhjb25zdHJhaW50cykpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB0byBncmFwaCB7fSIsIGlucHV0RGF0YSk7CisJCUVpdGhlcjxJbnB1dHNEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKGlucHV0RGF0YSwgSW5wdXRzRGF0YS5jbGFzcyk7CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYWRkaW5nIGlucHV0IHRvIGdyYXBoIHt9IiwgaW5wdXREYXRhKTsKKwkJaWYgKGNyZWF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBpbnB1dCB7fSB0byBncmFwaC4gc3RhdHVzIGlzIHt9IiwgcHJvcGVydHlOYW1lLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eU5hbWUpOworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKGZyb20sIGlucHV0RGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOUFVULCBwcm9wcyk7CisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSB7fSB0byBwcm9wZXJ0eSB7fSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9IiwgY29tcG9uZW50SWQsIHByb3BlcnR5TmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRJbnB1dFRvR3JhcGgoVGl0YW5WZXJ0ZXggdmVydGV4LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBJbnB1dERlZmluaXRpb24gaW5wdXREZWZpbml0aW9uLCBTdHJpbmcgY29tcG9uZW50SWQpIHsKKworCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBpbnB1dERlZmluaXRpb24uZ2V0Q29uc3RyYWludHMoKTsKKworCQlpbnB1dERlZmluaXRpb24uc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChjb21wb25lbnRJZCwgcHJvcGVydHlOYW1lKSk7CisJCUlucHV0c0RhdGEgaW5wdXREYXRhID0gbmV3IElucHV0c0RhdGEoaW5wdXREZWZpbml0aW9uLCBjb252ZXJ0Q29uc3RyYWludHNUb1N0cmluZyhjb25zdHJhaW50cykpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB0byBncmFwaCB7fSIsIGlucHV0RGF0YSk7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShpbnB1dERhdGEpOworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGlucHV0IHt9IHRvIGdyYXBoLiBzdGF0dXMgaXMge30iLCBwcm9wZXJ0eU5hbWUsIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gb3BlcmF0aW9uU3RhdHVzOworCQl9CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eU5hbWUpOworCQlUaXRhblZlcnRleCBpbnB1dFZlcnRleCA9IGNyZWF0ZU5vZGVSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKHZlcnRleCwgaW5wdXRWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscy5JTlBVVCwgcHJvcHMpOworCQlpZiAoIWNyZWF0ZVJlbFJlc3VsdC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVSZWxSZXN1bHQ7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2Uge30gdG8gcHJvcGVydHkge30gaW4gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIGNvbXBvbmVudElkLCBwcm9wZXJ0eU5hbWUsIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gb3BlcmF0aW9uU3RhdHVzOworCQl9CisKKwkJcmV0dXJuIGNyZWF0ZVJlbFJlc3VsdDsKKworCX0KKworCXB1YmxpYyBJbnB1dERlZmluaXRpb24gY29udmVydElucHV0RGF0YVRvSW5wdXREZWZpbml0aW9uKElucHV0c0RhdGEgaW5wdXREYXRhUmVzdWx0KSB7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiVGhlIG9iamVjdCByZXR1cm5lZCBhZnRlciBjcmVhdGUgcHJvcGVydHkgaXMge30iLCBpbnB1dERhdGFSZXN1bHQpOworCisJCUlucHV0RGVmaW5pdGlvbiBwcm9wZXJ0eURlZlJlc3VsdCA9IG5ldyBJbnB1dERlZmluaXRpb24oaW5wdXREYXRhUmVzdWx0LmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKSk7CisJCXByb3BlcnR5RGVmUmVzdWx0LnNldENvbnN0cmFpbnRzKGNvbnZlcnRDb25zdHJhaW50cyhpbnB1dERhdGFSZXN1bHQuZ2V0Q29uc3RyYWludHMoKSkpOworCisJCXJldHVybiBwcm9wZXJ0eURlZlJlc3VsdDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lucHV0RXhpc3QoTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0cywgU3RyaW5nIHJlc291cmNlVWlkLCBTdHJpbmcgaW5wdXROYW1lKSB7CisKKwkJaWYgKGlucHV0cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlmb3IgKElucHV0RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gOiBpbnB1dHMpIHsKKwkJCVN0cmluZyBwYXJlbnRVbmlxdWVJZCA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRQYXJlbnRVbmlxdWVJZCgpOworCQkJU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0TmFtZSgpOworCisJCQlpZiAocGFyZW50VW5pcXVlSWQuZXF1YWxzKHJlc291cmNlVWlkKSAmJiBuYW1lLmVxdWFscyhpbnB1dE5hbWUpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZEFsbFJlc291cmNlSW5wdXRzKFN0cmluZyB1bmlxdWVJZCwgTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0cykgeworCQkvLyBmaW5hbCBOb2RlRWxlbWVudEZldGNoZXI8SW5wdXREZWZpbml0aW9uPiBzaW5nbGVOb2RlRmV0Y2hlciA9CisJCS8vIChyZXNvdXJjZUlkUGFyYW0sIGF0dHJpYnV0ZXNQYXJhbSkgLT4KKwkJLy8gZmluZE5vZGVOb25JbmhlcmV0ZWRJbnB1dHMocmVzb3VyY2VJZFBhcmFtLCBjb21wb25lbnRUeXBlLAorCQkvLyBhdHRyaWJ1dGVzUGFyYW0pOworCQkvLyByZXR1cm4gZmluZEFsbFJlc291cmNlRWxlbWVudHNEZWZpbml0aW9uUmVjdXJzaXZlbHkodW5pcXVlSWQsIGlucHV0cywKKwkJLy8gc2luZ2xlTm9kZUZldGNoZXIpOworCQlyZXR1cm4gZmluZE5vZGVOb25JbmhlcmV0ZWRJbnB1dHModW5pcXVlSWQsIGlucHV0cyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmROb2RlTm9uSW5oZXJldGVkSW5wdXRzKFN0cmluZyB1bmlxdWVJZCwgTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0cykgeworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPElucHV0c0RhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5Ob2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIHVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMuSU5QVVQsIE5vZGVUeXBlRW51bS5JbnB1dCwgSW5wdXRzRGF0YS5jbGFzcyk7CisKKwkJaWYgKGNoaWxkcmVuTm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjaGlsZHJlbk5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPElucHV0c0RhdGEsIEdyYXBoRWRnZT4+IHZhbHVlcyA9IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmICh2YWx1ZXMgIT0gbnVsbCkgeworCisJCQlmb3IgKEltbXV0YWJsZVBhaXI8SW5wdXRzRGF0YSwgR3JhcGhFZGdlPiBpbW11dGFibGVQYWlyIDogdmFsdWVzKSB7CisJCQkJR3JhcGhFZGdlIGVkZ2UgPSBpbW11dGFibGVQYWlyLmdldFZhbHVlKCk7CisJCQkJU3RyaW5nIGlucHV0TmFtZSA9IChTdHJpbmcpIGVkZ2UuZ2V0UHJvcGVydGllcygpLmdldChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCWxvZy5kZWJ1ZygiSW5wdXQge30gIGlzIGFzc29jaWF0ZWQgdG8gbm9kZSB7fSIsIGlucHV0TmFtZSwgdW5pcXVlSWQpOworCQkJCUlucHV0c0RhdGEgaW5wdXREYXRhID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCQlJbnB1dERlZmluaXRpb24gaW5wdXREZWZpbml0aW9uID0gdGhpcy5jb252ZXJ0SW5wdXREYXRhVG9JbnB1dERlZmluaXRpb24oaW5wdXREYXRhKTsKKworCQkJCWlucHV0RGVmaW5pdGlvbi5zZXROYW1lKGlucHV0TmFtZSk7CisJCQkJaW5wdXREZWZpbml0aW9uLnNldFBhcmVudFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKworCQkJCWlucHV0cy5hZGQoaW5wdXREZWZpbml0aW9uKTsKKworCQkJCWxvZy50cmFjZSgiZmluZElucHV0c09mTm9kZSAtIGlucHV0IHt9ICBhc3NvY2lhdGVkIHRvIG5vZGUge30iLCBpbnB1dERlZmluaXRpb24sIHVuaXF1ZUlkKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBFaXRoZXI8SW5wdXREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRJbnB1dEJ5SWQoU3RyaW5nIHVuaXF1ZUlkLCBib29sZWFuIHNraXBQcm9wZXJ0aWVzLCBib29sZWFuIHNraXBJbnB1dHN2YWx1ZSkgeworCQlFaXRoZXI8SW5wdXREZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gZ2V0SW5wdXRGcm9tR3JhcGgodW5pcXVlSWQsIHNraXBQcm9wZXJ0aWVzLCBza2lwSW5wdXRzdmFsdWUpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBnZXQgaW5wdXQge30gZnJvbSBncmFwaCB7fS4gc3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKKwlwdWJsaWMgPEVsZW1lbnREZWZpbml0aW9uPiBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsUmVzb3VyY2VFbGVtZW50c0RlZmluaXRpb25SZWN1cnNpdmVseShTdHJpbmcgcmVzb3VyY2VJZCwgTGlzdDxFbGVtZW50RGVmaW5pdGlvbj4gZWxlbWVudHMsIE5vZGVFbGVtZW50RmV0Y2hlcjxFbGVtZW50RGVmaW5pdGlvbj4gc2luZ2xlTm9kZUZldGNoZXIpIHsKKworCQlsb2cudHJhY2UoIkdvaW5nIHRvIGZldGNoIGVsZW1lbnRzIHVuZGVyIHJlc291cmNlIHt9IiwgcmVzb3VyY2VJZCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHJlc291cmNlQXR0cmlidXRlc1N0YXR1cyA9IHNpbmdsZU5vZGVGZXRjaGVyLmZpbmRBbGxOb2RlRWxlbWVudHMocmVzb3VyY2VJZCwgZWxlbWVudHMpOworCisJCWlmIChyZXNvdXJjZUF0dHJpYnV0ZXNTdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiByZXNvdXJjZUF0dHJpYnV0ZXNTdGF0dXM7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmVudE5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHJlc291cmNlSWQsIEdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00sIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCWlmIChwYXJlbnROb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHBhcmVudE5vZGVzU3RhdHVzID0gcGFyZW50Tm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHBhcmVudE5vZGVzU3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiZmluZEFsbFJlc291cmNlRWxlbWVudHNEZWZpbml0aW9uUmVjdXJzaXZlbHkiLCAiRmFpbGVkIHRvIGZpbmQgcGFyZW50IGVsZW1lbnRzIG9mIHJlc291cmNlICIgKyByZXNvdXJjZUlkICsgIi4gc3RhdHVzIGlzICIgKyBwYXJlbnROb2Rlc1N0YXR1cywgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIHBhcmVudE5vZGVzU3RhdHVzOworCQkJfQorCQl9CisKKwkJaWYgKHBhcmVudE5vZGVzLmlzTGVmdCgpKSB7CisJCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhcm5ldE5vZGVQYWlyID0gcGFyZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgcGFyZW50VW5pcXVlSWQgPSBwYXJuZXROb2RlUGFpci5nZXRLZXkoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFBhcmVudEludFN0YXR1cyA9IGZpbmRBbGxSZXNvdXJjZUVsZW1lbnRzRGVmaW5pdGlvblJlY3Vyc2l2ZWx5KHBhcmVudFVuaXF1ZUlkLCBlbGVtZW50cywgc2luZ2xlTm9kZUZldGNoZXIpOworCisJCQlpZiAoYWRkUGFyZW50SW50U3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJmaW5kQWxsUmVzb3VyY2VFbGVtZW50c0RlZmluaXRpb25SZWN1cnNpdmVseSIsICJGYWlsZWQgdG8gZmluZCBhbGwgcmVzb3VyY2UgZWxlbWVudHMgb2YgcmVzb3VyY2UgIiArIHBhcmVudFVuaXF1ZUlkLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKworCQkJCXJldHVybiBhZGRQYXJlbnRJbnRTdGF0dXM7CisJCQl9CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVQcm9wZXJ0eVRvSW5wdXQoU3RyaW5nIHJpSWQsIFN0cmluZyBpbnB1dElkLCBJbnB1dFZhbHVlRGF0YSBwcm9wZXJ0eSwgU3RyaW5nIG5hbWUpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJaWYgKGdyYXBoUmVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gcmV0cmlldmUgZ3JhcGguIHN0YXR1cyBpcyB7fSIsIGdyYXBoUmVzKTsKKwkJCXJldHVybiBncmFwaFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlUaXRhbkdyYXBoIHRpdGFuR3JhcGggPSBncmFwaFJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IHRpdGFuR3JhcGgucXVlcnkoKS5oYXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHkuZ2V0VW5pcXVlSWQoKSkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRpY2VzID09IG51bGwgfHwgZmFsc2UgPT0gdmVydGljZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKwkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQl9CisJCS8vIEVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUHJvcGVydHlEZWZSZXMgPQorCQkvLyB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUHJvcGVydHkpLAorCQkvLyBwcm9wZXJ0eUlkLCBQcm9wZXJ0eURhdGEuY2xhc3MpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgbmFtZSk7CisJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5PV05FUl9JRC5nZXRQcm9wZXJ0eSgpLCByaUlkKTsKKworCQlHcmFwaE5vZGUgaW5wdXREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uSW5wdXQsIGlucHV0SWQpOworCQlHcmFwaE5vZGUgcHJvcGVydHlEYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uSW5wdXRWYWx1ZSwgcHJvcGVydHkuZ2V0VW5pcXVlSWQoKSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcFJlZlJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihpbnB1dERhdGEsIHByb3BlcnR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkdFVF9JTlBVVCwgcHJvcHMpOworCisJCWlmIChhZGRQcm9wUmVmUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJc3RhdHVzID0gYWRkUHJvcFJlZlJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiRmFpbGVkIHRvIGFzc29jaWF0ZSBpbnB1dCAiICsgaW5wdXREYXRhLmdldFVuaXF1ZUlkKCkgKyAiIHRvIHByb3BlcnR5ICIgKyBwcm9wZXJ0eS5nZXRVbmlxdWVJZCgpICsgIiBpbiBncmFwaC4gU3RhdHVzIGlzICIgKyBzdGF0dXM7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoQVNTT0NJQVRJTkdfSU5QVVRfVE9fUFJPUCwgZGVzY3JpcHRpb24sIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCisJfQorCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZVByb3BlcnR5VG9JbnB1dChTdHJpbmcgcmlJZCwgU3RyaW5nIGlucHV0SWQsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcHJvcGVydHksIEdldElucHV0VmFsdWVJbmZvIGdldElucHV0KSB7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCWlmIChncmFwaFJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHJldHJpZXZlIGdyYXBoLiBzdGF0dXMgaXMge30iLCBncmFwaFJlcyk7CisJCQlyZXR1cm4gZ3JhcGhSZXMucmlnaHQoKS52YWx1ZSgpOworCQl9CisKKwkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXMubGVmdCgpLnZhbHVlKCk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSB0aXRhbkdyYXBoLnF1ZXJ5KCkuaGFzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIHByb3BlcnR5LmdldFVuaXF1ZUlkKCkpLnZlcnRpY2VzKCk7CisJCWlmICh2ZXJ0aWNlcyA9PSBudWxsIHx8IGZhbHNlID09IHZlcnRpY2VzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJfQorCQkvLyBFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFByb3BlcnR5RGVmUmVzID0KKwkJLy8gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlByb3BlcnR5KSwKKwkJLy8gcHJvcGVydHlJZCwgUHJvcGVydHlEYXRhLmNsYXNzKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWlmKGdldElucHV0IT1udWxsKXsKKwkJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGdldElucHV0LmdldFByb3BOYW1lKCkpOworCQkJaWYgKGdldElucHV0LmlzTGlzdCgpKSB7CisJCQkJU3RyaW5nIGluZGV4ID0gZ2V0SW5wdXQuZ2V0SW5kZXhWYWx1ZSgpLnRvU3RyaW5nKCk7CisJCQkJaWYgKGdldElucHV0LmdldEdldElucHV0SW5kZXgoKSAhPSBudWxsKSB7CisJCQkJCWluZGV4ID0gZ2V0SW5wdXQuZ2V0R2V0SW5wdXRJbmRleCgpLmdldElucHV0TmFtZSgpOworCQorCQkJCX0KKwkJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuR0VUX0lOUFVUX0lOREVYLmdldFByb3BlcnR5KCksIGluZGV4KTsKKwkJCX0KKwkJfQorCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuT1dORVJfSUQuZ2V0UHJvcGVydHkoKSwgcmlJZCk7CisKKwkJR3JhcGhOb2RlIGlucHV0RGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLklucHV0LCBpbnB1dElkKTsKKwkJR3JhcGhOb2RlIHByb3BlcnR5RGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUsIHByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BSZWZSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oaW5wdXREYXRhLCBwcm9wZXJ0eURhdGEsIEdyYXBoRWRnZUxhYmVscy5HRVRfSU5QVVQsIHByb3BzKTsKKworCQlpZiAoYWRkUHJvcFJlZlJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCXN0YXR1cyA9IGFkZFByb3BSZWZSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIkZhaWxlZCB0byBhc3NvY2lhdGUgaW5wdXQgIiArIGlucHV0RGF0YS5nZXRVbmlxdWVJZCgpICsgIiB0byBwcm9wZXJ0eSAiICsgcHJvcGVydHkuZ2V0VW5pcXVlSWQoKSArICIgaW4gZ3JhcGguIFN0YXR1cyBpcyAiICsgc3RhdHVzOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKEFTU09DSUFUSU5HX0lOUFVUX1RPX1BST1AsIGRlc2NyaXB0aW9uLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPElucHV0RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldElucHV0RnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgYm9vbGVhbiBza2lwUHJvcGVydGllcywgYm9vbGVhbiBza2lwSW5wdXRzVmFsdWUpIHsKKworCQlFaXRoZXI8SW5wdXREZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQlFaXRoZXI8SW5wdXRzRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGlucHV0UmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLklucHV0KSwgdW5pcXVlSWQsIElucHV0c0RhdGEuY2xhc3MpOworCQlpZiAoaW5wdXRSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBpbnB1dFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaWV2ZSBncm91cCB7fSAgZnJvbSBncmFwaC4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHN0YXR1cyk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcigiRmV0Y2ggR3JvdXAiLCB1bmlxdWVJZCwgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzKSk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlJbnB1dHNEYXRhIGlucHV0RGF0YSA9IGlucHV0UmVzLmxlZnQoKS52YWx1ZSgpOworCisJCUlucHV0RGVmaW5pdGlvbiBncm91cERlZmluaXRpb24gPSB0aGlzLmNvbnZlcnRJbnB1dERhdGFUb0lucHV0RGVmaW5pdGlvbihpbnB1dERhdGEpOworCisJCWlmIChmYWxzZSA9PSBza2lwSW5wdXRzVmFsdWUpIHsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gcHJvcHNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PigpOworCisJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPElucHV0VmFsdWVEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHByb3BlcnR5SW1wbE5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLklucHV0KSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5HRVRfSU5QVVQsIE5vZGVUeXBlRW51bS5JbnB1dFZhbHVlLCBJbnB1dFZhbHVlRGF0YS5jbGFzcyk7CisKKwkJCWlmIChwcm9wZXJ0eUltcGxOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBwcm9wZXJ0eUltcGxOb2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCQkKKwkJCX0KKwkJCWlmKHByb3BlcnR5SW1wbE5vZGVzLmlzTGVmdCgpKXsKKwkJCQlMaXN0PEltbXV0YWJsZVBhaXI8SW5wdXRWYWx1ZURhdGEsIEdyYXBoRWRnZT4+IHByb3BlcnR5RGF0YVBhaXJMaXN0ID0gcHJvcGVydHlJbXBsTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJZm9yIChJbW11dGFibGVQYWlyPElucHV0VmFsdWVEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5VmFsdWUgOiBwcm9wZXJ0eURhdGFQYWlyTGlzdCkgeworCQorCQkJCQlJbnB1dFZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSA9IHByb3BlcnR5VmFsdWUuZ2V0TGVmdCgpOworCQkJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZVVpZCA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCk7CisJCQkJCVN0cmluZyB2YWx1ZSA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFZhbHVlKCk7CisJCisJCQkJCUVpdGhlcjxJbW11dGFibGVQYWlyPFByb3BlcnR5RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHByb3BlcnR5RGVmUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5JbnB1dFZhbHVlKSwgcHJvcGVydHlWYWx1ZVVpZCwgR3JhcGhFZGdlTGFiZWxzLklOUFVUX0lNUEwsIE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSwgUHJvcGVydHlEYXRhLmNsYXNzKTsKKwkJCQkJaWYgKHByb3BlcnR5RGVmUmVzLmlzUmlnaHQoKSkgeworCQkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydHlEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCQl9CisJCisJCQkJCUltbXV0YWJsZVBhaXI8UHJvcGVydHlEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5RGVmUGFpciA9IHByb3BlcnR5RGVmUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IChTdHJpbmcpIHByb3BlcnR5RGVmUGFpci5sZWZ0LmdldFVuaXF1ZUlkKCk7CisJCisJCQkJCUNvbXBvbmVudEluc3RhbmNlSW5wdXQgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5ID0gbmV3IENvbXBvbmVudEluc3RhbmNlSW5wdXQoKTsKKwkJCQkJLy8gc2V0IHByb3BlcnR5IG9yaWdpbmFsIHVuaXF1ZSBpZAorCQkJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VW5pcXVlSWQocHJvcGVydHlVbmlxdWVJZCk7CisJCQkJCS8vIHNldCByZXNvdXJjZSBpZAorCQkJCQkvLyBUT0RPOiBlc29mZXIgYWRkIHJlc291cmNlIGlkCisJCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXJlbnRVbmlxdWVJZChudWxsKTsKKwkJCQkJLy8gc2V0IHZhbHVlCisJCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7CisJCQkJCS8vIHNldCBwcm9wZXJ0eSB2YWx1ZSB1bmlxdWUgaWQKKwkJCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlVW5pcXVlVWlkKHByb3BlcnR5VmFsdWVVaWQpOworCQkJCQkvLyBzZXQgcnVsZXMKKwkJCQkJLy8gcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFJ1bGVzKHByb3BlcnR5VmFsdWVEYXRhLmdldFJ1bGVzKCkpOworCQorCQkJCQlwcm9wc0xpc3QuYWRkKHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSk7CisJCisJCQkJfQorCQorCQkJCWdyb3VwRGVmaW5pdGlvbi5zZXRJbnB1dHNWYWx1ZShwcm9wc0xpc3QpOworCQkJfQorCisJCX0KKworCQlpZiAoZmFsc2UgPT0gc2tpcFByb3BlcnRpZXMpIHsKKwkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcHJvcGVydHlJbXBsTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLkdFVF9JTlBVVCwgTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKworCQkJaWYgKHByb3BlcnR5SW1wbE5vZGVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHByb3BlcnR5SW1wbE5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IHByb3BlcnR5SW1wbE5vZGVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlpZiAobGlzdCA9PSBudWxsIHx8IHRydWUgPT0gbGlzdC5pc0VtcHR5KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQl9CisKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcHNScmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4gcHJvcGVydHlWYWx1ZURhdGFQYWlyIDogbGlzdCkgeworCQkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gcHJvcGVydHlWYWx1ZURhdGFQYWlyLmxlZnQ7CisJCQkJU3RyaW5nIHByb3BlcnR5VmFsdWVVaWQgPSBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRVbmlxdWVJZCgpOworCQkJCVN0cmluZyB2YWx1ZSA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFZhbHVlKCk7CisKKwkJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eURlZlJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSksIHByb3BlcnR5VmFsdWVVaWQsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCBOb2RlVHlwZUVudW0uUHJvcGVydHksIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJCQkJaWYgKHByb3BlcnR5RGVmUmVzLmlzUmlnaHQoKSkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBwcm9wZXJ0eURlZlJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCQl9CisJCQkJCQorCQkJCX0KKwkJCQlpZihwcm9wZXJ0eURlZlJlcy5pc0xlZnQoKSl7CisKKwkJCQkJSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4gcHJvcGVydHlEZWZQYWlyID0gcHJvcGVydHlEZWZSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBwcm9wZXJ0eURlZlBhaXIubGVmdDsKKwkJCQkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSAoU3RyaW5nKSBwcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCk7CisJCisJCQkJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5ID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJCQkJLy8gc2V0IHByb3BlcnR5IG9yaWdpbmFsIHVuaXF1ZSBpZAorCQkJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VW5pcXVlSWQocHJvcGVydHlVbmlxdWVJZCk7CisJCQkJCS8vIHNldCByZXNvdXJjZSBpZAorCQkJCQkvLyBUT0RPOiBlc29mZXIgYWRkIHJlc291cmNlIGlkCisJCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXJlbnRVbmlxdWVJZChudWxsKTsKKwkJCQkJLy8gc2V0IHZhbHVlCisJCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7CisJCQkJCS8vIHNldCBwcm9wZXJ0eSB2YWx1ZSB1bmlxdWUgaWQKKwkJCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlVW5pcXVlVWlkKHByb3BlcnR5VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJCQkvLyBzZXQgcnVsZXMKKwkJCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFJ1bGVzKHByb3BlcnR5VmFsdWVEYXRhLmdldFJ1bGVzKCkpOworCQkJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VHlwZShwcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpLmdldFR5cGUoKSk7CisJCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRTY2hlbWEocHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7CisJCQkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXROYW1lKChTdHJpbmcpIHByb3BlcnR5VmFsdWVEYXRhUGFpci5yaWdodC5nZXRQcm9wZXJ0aWVzKCkuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKSk7CisJCisJCQkJCXByb3BzUnJlc3VsdC5hZGQocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KTsKKwkJCQl9CisJCisJCQkJZ3JvdXBEZWZpbml0aW9uLnNldFByb3BlcnRpZXMocHJvcHNScmVzdWx0KTsKKwkJCX0KKworCQl9CisKKwkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JvdXBEZWZpbml0aW9uKTsKKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCisJcHVibGljIEltbXV0YWJsZVBhaXI8VGl0YW5PcGVyYXRpb25TdGF0dXMsIFN0cmluZz4gZmluZElucHV0VmFsdWUoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgU3RyaW5nIHByb3BlcnR5SWQpIHsKKworCQlsb2cuZGVidWcoIkdvaW5nIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHByb3BlcnR5IHt9IGFscmVhZHkgYWRkZWQgdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBwcm9wZXJ0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCisJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsUmVzID0gZ2V0QWxsSW5wdXRzT2ZSZXNvdXJjZUluc3RhbmNlT25seUlucHV0RGVmSWQocmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJaWYgKGdldEFsbFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGdldEFsbFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cudHJhY2UoIkFmdGVyIGZldGNoaW5nIGFsbCBwcm9wZXJ0aWVzIG9mIHJlc291cmNlIGluc3RhbmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUluc3RhbmNlSWQsIHN0YXR1cyk7CisJCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8VGl0YW5PcGVyYXRpb25TdGF0dXMsIFN0cmluZz4oc3RhdHVzLCBudWxsKTsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gbGlzdCA9IGdldEFsbFJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGxpc3QgIT0gbnVsbCkgeworCQkJZm9yIChDb21wb25lbnRJbnN0YW5jZUlucHV0IGluc3RhbmNlUHJvcGVydHkgOiBsaXN0KSB7CisJCQkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSBpbnN0YW5jZVByb3BlcnR5LmdldFVuaXF1ZUlkKCk7CisJCQkJU3RyaW5nIHZhbHVlVW5pcXVlVWlkID0gaW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZVVuaXF1ZVVpZCgpOworCQkJCWxvZy50cmFjZSgiR28gb3ZlciBwcm9wZXJ0eSB7fSB1bmRlciByZXNvdXJjZSBpbnN0YW5jZSB7fS4gdmFsdWVVbmlxdWVJZCA9IHt9IiwgcHJvcGVydHlVbmlxdWVJZCwgcmVzb3VyY2VJbnN0YW5jZUlkLCB2YWx1ZVVuaXF1ZVVpZCk7CisJCQkJaWYgKHByb3BlcnR5SWQuZXF1YWxzKHByb3BlcnR5VW5pcXVlSWQpICYmIHZhbHVlVW5pcXVlVWlkICE9IG51bGwpIHsKKwkJCQkJbG9nLmRlYnVnKCJUaGUgcHJvcGVydHkge30gYWxyZWFkeSBjcmVhdGVkIHVuZGVyIHJlc291cmNlIGluc3RhbmNlIHt9IiwgcHJvcGVydHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQkJcmV0dXJuIG5ldyBJbW11dGFibGVQYWlyPFRpdGFuT3BlcmF0aW9uU3RhdHVzLCBTdHJpbmc+KFRpdGFuT3BlcmF0aW9uU3RhdHVzLkFMUkVBRFlfRVhJU1QsIHZhbHVlVW5pcXVlVWlkKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8VGl0YW5PcGVyYXRpb25TdGF0dXMsIFN0cmluZz4oVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm4gYWxsIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB0byByZXNvdXJjZSBpbnN0YW5jZS4gVGhlIHJlc3VsdCBkb2VzIGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSB1bmlxdWUgaWQgYnV0IG5vdCBpdHMgdHlwZSwgZGVmYXVsdCB2YWx1ZS4uLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlVWlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbElucHV0c09mUmVzb3VyY2VJbnN0YW5jZU9ubHlJbnB1dERlZklkKFN0cmluZyByZXNvdXJjZUluc3RhbmNlVWlkKSB7CisKKwkJcmV0dXJuIGdldEFsbElucHV0c09mUmVzb3VyY2VJbnN0YW5jZU9ubHlJbnB1dERlZklkKHJlc291cmNlSW5zdGFuY2VVaWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKTsKKworCX0KKworCS8qKgorCSAqIHJldHVybiBhbGwgcHJvcGVydGllcyBhc3NvY2lhdGVkIHRvIHJlc291cmNlIGluc3RhbmNlLiBUaGUgcmVzdWx0IGRvZXMgY29udGFpbnMgdGhlIHByb3BlcnR5IHVuaXF1ZSBpZCBidXQgbm90IGl0cyB0eXBlLCBkZWZhdWx0IHZhbHVlLi4uCisJICogCisJICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VVaWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0c0J5SW5wdXRJZChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCwgU3RyaW5nIGlucHV0SWQpIHsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IGdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzQnlJbnB1dElkKGlucHV0SWQpOworCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChzdGF0dXMubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJLyoqCisJICogcmV0dXJuIGFsbCBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgdG8gcmVzb3VyY2UgaW5zdGFuY2UuIFRoZSByZXN1bHQgZG9lcyBjb250YWlucyB0aGUgcHJvcGVydHkgdW5pcXVlIGlkIGJ1dCBub3QgaXRzIHR5cGUsIGRlZmF1bHQgdmFsdWUuLi4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZVVpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEluc3RhbmNlUHJvcGVydGllc0J5SW5wdXRJZChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCwgU3RyaW5nIGlucHV0SWQpIHsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IGdldENvbXBvbmVudEluc3RhbmNlUHJvcGVydGllc0J5SW5wdXRJZChpbnB1dElkKTsKKwkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoc3RhdHVzLmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbElucHV0c09mUmVzb3VyY2VJbnN0YW5jZU9ubHlJbnB1dERlZklkKFN0cmluZyByZXNvdXJjZUluc3RhbmNlVWlkLCBOb2RlVHlwZUVudW0gaW5zdGFuY2VOb2RlVHlwZSkgeworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUmVzSW5zdGFuY2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShpbnN0YW5jZU5vZGVUeXBlKSwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKworCQlpZiAoZmluZFJlc0luc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFJlc0luc3RhbmNlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8SW5wdXRWYWx1ZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcHJvcGVydHlJbXBsTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShpbnN0YW5jZU5vZGVUeXBlKSwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgR3JhcGhFZGdlTGFiZWxzLklOUFVUX1ZBTFVFLCBOb2RlVHlwZUVudW0uSW5wdXRWYWx1ZSwgSW5wdXRWYWx1ZURhdGEuY2xhc3MpOworCisJCWlmIChwcm9wZXJ0eUltcGxOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHByb3BlcnR5SW1wbE5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxJbnB1dFZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IHByb3BlcnR5SW1wbE5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAobGlzdCA9PSBudWxsIHx8IHRydWUgPT0gbGlzdC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCisJCQorCQlmb3IgKEltbXV0YWJsZVBhaXI8SW5wdXRWYWx1ZURhdGEsIEdyYXBoRWRnZT4gcHJvcGVydHlWYWx1ZURhdGFQYWlyIDogbGlzdCkgeworCQkJCisJCQlJbnB1dFZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSA9IHByb3BlcnR5VmFsdWVEYXRhUGFpci5nZXRMZWZ0KCk7CisJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZVVpZCA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRWYWx1ZSgpOworCisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxJbnB1dHNEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5wdXROb2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQYXJlbnROb2RlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIHByb3BlcnR5VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5HRVRfSU5QVVQsIE5vZGVUeXBlRW51bS5JbnB1dCwgSW5wdXRzRGF0YS5jbGFzcyk7CisKKwkJCWlmIChpbnB1dE5vZGVzLmlzUmlnaHQoKSkgeworCisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChpbnB1dE5vZGVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCUlucHV0c0RhdGEgaW5wdXQgPSBpbnB1dE5vZGVzLmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCQlTdHJpbmcgaW5wdXRJZCA9IGlucHV0LmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpOworCisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eURlZlJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uSW5wdXRWYWx1ZSksIHByb3BlcnR5VmFsdWVVaWQsIEdyYXBoRWRnZUxhYmVscy5JTlBVVF9JTVBMLCBOb2RlVHlwZUVudW0uUHJvcGVydHksIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJCQlpZiAocHJvcGVydHlEZWZSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydHlEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKworCQkJSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4gcHJvcGVydHlEZWZQYWlyID0gcHJvcGVydHlEZWZSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlQcm9wZXJ0eURhdGEgcHJvcGVydHlEYXRhID0gcHJvcGVydHlEZWZQYWlyLmxlZnQ7CisJCQlFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGlucHV0c0VnZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdFZGdlQnlDcml0ZXJpYShwcm9wZXJ0eURhdGEsIEdyYXBoRWRnZUxhYmVscy5JTlBVVCwgbnVsbCk7CisJCQlpZiAoaW5wdXRzRWdlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBpbnB1dHNFZ2VzLnJpZ2h0KCkudmFsdWUoKTsKKworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJCUVkZ2UgZWRnZSA9IGlucHV0c0VnZXMubGVmdCgpLnZhbHVlKCk7CisJCQlTdHJpbmcgaW5wdXROYW1lID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGVkZ2UsIEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisKKwkJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gKFN0cmluZykgcHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpOworCQkJCisKKwkJCUNvbXBvbmVudEluc3RhbmNlSW5wdXQgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5ID0gbmV3IENvbXBvbmVudEluc3RhbmNlSW5wdXQocHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKSwgaW5wdXRJZCwgdmFsdWUsIHByb3BlcnR5VmFsdWVVaWQpOworCQkJCisJCQkvL3Jlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXROYW1lKGlucHV0TmFtZSk7CisJCQkvLyBzZXQgcmVzb3VyY2UgaWQKKwkJCS8vIFRPRE86IGVzb2ZlciBhZGQgcmVzb3VyY2UgaWQKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXROYW1lKGlucHV0TmFtZSk7CisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0UGFyZW50VW5pcXVlSWQoaW5wdXRJZCk7CisJCQkvLyBzZXQgdmFsdWUKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7CisJCQkvLyBzZXQgcHJvcGVydHkgdmFsdWUgdW5pcXVlIGlkCisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWVVbmlxdWVVaWQocHJvcGVydHlWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkvLyBzZXQgcnVsZXMKKwkJCS8vIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRSdWxlcyhwcm9wZXJ0eVZhbHVlRGF0YS5nZXRSdWxlcygpKTsKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRUeXBlKHByb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkuZ2V0VHlwZSgpKTsKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRTY2hlbWEocHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7CisJCQkvL3Jlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRDb21wb25lbnRJbnN0YW5jZU5hbWUoY29tcG9uZW50SW5zTmFtZSk7CisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0Q29tcG9uZW50SW5zdGFuY2VJZChyZXNvdXJjZUluc3RhbmNlVWlkKTsKKworCQkJcmVzdWx0LmFkZChyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkpOworCQl9CisKKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VJbnB1dD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0c0J5SW5wdXRJZChTdHJpbmcgaW5wdXRJZCkgeworCisJCUVpdGhlcjxJbnB1dHNEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFJlc0lucHV0UmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgaW5wdXRJZCwgSW5wdXRzRGF0YS5jbGFzcyk7CisKKwkJaWYgKGZpbmRSZXNJbnB1dFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRSZXNJbnB1dFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQkKKworCQkvLyBFaXRoZXI8TGlzdDxJbnB1dFZhbHVlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eUltcGxOb2RlcworCQkvLyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5JbnB1dFZhbHVlLCBwcm9wcywKKwkJLy8gSW5wdXRWYWx1ZURhdGEuY2xhc3MpOworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2ZXJ0ZXhTZXJ2aWNlID0gdGl0YW5HZW5lcmljRGFvLmdldFZlcnRleEJ5UHJvcGVydHkoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgaW5wdXRJZCk7CisKKwkJaWYgKHZlcnRleFNlcnZpY2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBmZXRjaCB2ZXJ0ZXggb2YgcmVzb3VyY2UgaW5wdXQgZm9yIGlkID0ge30iLCBpbnB1dElkKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHZlcnRleFNlcnZpY2UucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJfQorCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKwkJVGl0YW5WZXJ0ZXggdmVydGV4ID0gdmVydGV4U2VydmljZS5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPElucHV0VmFsdWVEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHByb3BlcnR5SW1wbE5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgaW5wdXRJZCwgR3JhcGhFZGdlTGFiZWxzLkdFVF9JTlBVVCwgTm9kZVR5cGVFbnVtLklucHV0VmFsdWUsIElucHV0VmFsdWVEYXRhLmNsYXNzKTsKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCWlmIChwcm9wZXJ0eUltcGxOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHByb3BlcnR5SW1wbE5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxJbnB1dFZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IHByb3BlcnR5SW1wbE5vZGVzLmxlZnQoKS52YWx1ZSgpOworCisJCWlmIChsaXN0ID09IG51bGwgfHwgdHJ1ZSA9PSBsaXN0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChJbW11dGFibGVQYWlyPElucHV0VmFsdWVEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5VmFsdWVEYXRhUGFpciA6IGxpc3QpIHsKKwkJCUlucHV0VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gcHJvcGVydHlWYWx1ZURhdGFQYWlyLmxlZnQ7CisJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZVVpZCA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRWYWx1ZSgpOworCQkJLy8gRWl0aGVyPExpc3Q8RWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvdXQgPQorCQkJLy8gdGl0YW5HZW5lcmljRGFvLmdldEVkZ2VzRm9yTm9kZShwcm9wZXJ0eVZhbHVlRGF0YSwKKwkJCS8vIERpcmVjdGlvbi5PVVQpOworCQkJLy8gRWl0aGVyPExpc3Q8RWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbiA9CisJCQkvLyB0aXRhbkdlbmVyaWNEYW8uZ2V0RWRnZXNGb3JOb2RlKHByb3BlcnR5VmFsdWVEYXRhLCBEaXJlY3Rpb24uSU4pOworCQkJRWl0aGVyPEVkZ2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbnB1dHN2YWx1ZUVnZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdFZGdlQnlDcml0ZXJpYShwcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOUFVUX1ZBTFVFLCBudWxsKTsKKwkJCWlmIChpbnB1dHN2YWx1ZUVnZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gaW5wdXRzdmFsdWVFZ2VzLnJpZ2h0KCkudmFsdWUoKTsKKworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJCUVkZ2UgZWRnZSA9IGlucHV0c3ZhbHVlRWdlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCVN0cmluZyBjb21wb25lbnRJbnNOYW1lID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KGVkZ2UsIEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQlTdHJpbmcgY29tcG9uZW50SW5zSWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoZWRnZSwgR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuT1dORVJfSUQuZ2V0UHJvcGVydHkoKSk7CisKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPElucHV0c0RhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eURlZlJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uSW5wdXRWYWx1ZSksIHByb3BlcnR5VmFsdWVVaWQsIEdyYXBoRWRnZUxhYmVscy5JTlBVVF9JTVBMLCBOb2RlVHlwZUVudW0uSW5wdXQsIElucHV0c0RhdGEuY2xhc3MpOworCisJCQlpZiAocHJvcGVydHlEZWZSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydHlEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKworCQkJSW1tdXRhYmxlUGFpcjxJbnB1dHNEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5RGVmUGFpciA9IHByb3BlcnR5RGVmUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlJbnB1dHNEYXRhIHByb3BlcnR5RGF0YSA9IHByb3BlcnR5RGVmUGFpci5sZWZ0OworCisJCQlFaXRoZXI8RWRnZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGlucHV0c0VnZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdFZGdlQnlDcml0ZXJpYShwcm9wZXJ0eURhdGEsIEdyYXBoRWRnZUxhYmVscy5JTlBVVCwgbnVsbCk7CisJCQlpZiAoaW5wdXRzRWdlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBpbnB1dHNFZ2VzLnJpZ2h0KCkudmFsdWUoKTsKKworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKwkJCWVkZ2UgPSBpbnB1dHNFZ2VzLmxlZnQoKS52YWx1ZSgpOworCQkJU3RyaW5nIGlucHV0TmFtZSA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShlZGdlLCBHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCisJCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IChTdHJpbmcpIHByb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2VJbnB1dCByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VJbnB1dChwcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpLCBpbnB1dElkLCB2YWx1ZSwgcHJvcGVydHlWYWx1ZVVpZCk7CisJCQkvLyBzZXQgcHJvcGVydHkgb3JpZ2luYWwgdW5pcXVlIGlkCisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VW5pcXVlSWQocHJvcGVydHlVbmlxdWVJZCk7CisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0TmFtZShpbnB1dE5hbWUpOworCQkJLy8gc2V0IHJlc291cmNlIGlkCisJCQkvLyBUT0RPOiBlc29mZXIgYWRkIHJlc291cmNlIGlkCisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0UGFyZW50VW5pcXVlSWQobnVsbCk7CisJCQkvLyBzZXQgdmFsdWUKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7CisJCQkvLyBzZXQgcHJvcGVydHkgdmFsdWUgdW5pcXVlIGlkCisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWVVbmlxdWVVaWQocHJvcGVydHlWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkvLyBzZXQgcnVsZXMKKwkJCS8vIHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRSdWxlcyhwcm9wZXJ0eVZhbHVlRGF0YS5nZXRSdWxlcygpKTsKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRUeXBlKHByb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkuZ2V0VHlwZSgpKTsKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRTY2hlbWEocHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7CisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0Q29tcG9uZW50SW5zdGFuY2VOYW1lKGNvbXBvbmVudEluc05hbWUpOworCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldENvbXBvbmVudEluc3RhbmNlSWQoY29tcG9uZW50SW5zSWQpOworCisJCQlyZXN1bHQuYWRkKHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEluc3RhbmNlUHJvcGVydGllc0J5SW5wdXRJZChTdHJpbmcgaW5wdXRJZCkgeworCisJCUVpdGhlcjxJbnB1dHNEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFJlc0lucHV0UmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgaW5wdXRJZCwgSW5wdXRzRGF0YS5jbGFzcyk7CisKKwkJaWYgKGZpbmRSZXNJbnB1dFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRSZXNJbnB1dFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQkvL01hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJLy9wcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuT1dORVJfSUQuZ2V0UHJvcGVydHkoKSwgcmVzb3VyY2VJbnN0YW5jZVVpZCk7CisKKwkJLy8gRWl0aGVyPExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4KKwkJLy8gcHJvcGVydHlJbXBsTm9kZXMgPQorCQkvLyB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSwgcHJvcHMsCisJCS8vIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVydGV4U2VydmljZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIGlucHV0SWQpOworCisJCWlmICh2ZXJ0ZXhTZXJ2aWNlLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZmV0Y2ggdmVydGV4IG9mIHJlc291cmNlIGlucHV0IGZvciBpZCA9IHt9IiwgaW5wdXRJZCk7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSB2ZXJ0ZXhTZXJ2aWNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisJCVRpdGFuVmVydGV4IHZlcnRleCA9IHZlcnRleFNlcnZpY2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4sCisJCS8vIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eUltcGxOb2RlcyA9CisJCS8vIHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbkJ5RWRnZUNyaXRlcmlhKHZlcnRleCwgaW5wdXRJZCwKKwkJLy8gR3JhcGhFZGdlTGFiZWxzLkdFVF9JTlBVVCwgTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUsCisJCS8vIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzLCBwcm9wcyk7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcHJvcGVydHlJbXBsTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCBpbnB1dElkLCBHcmFwaEVkZ2VMYWJlbHMuR0VUX0lOUFVULCBOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSwgUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCisJCWlmIChwcm9wZXJ0eUltcGxOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHByb3BlcnR5SW1wbE5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gbGlzdCA9IHByb3BlcnR5SW1wbE5vZGVzLmxlZnQoKS52YWx1ZSgpOworCisJCWlmIChsaXN0ID09IG51bGwgfHwgdHJ1ZSA9PSBsaXN0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5VmFsdWVEYXRhUGFpciA6IGxpc3QpIHsKKwkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gcHJvcGVydHlWYWx1ZURhdGFQYWlyLmxlZnQ7CisJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZVVpZCA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRWYWx1ZSgpOworCisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eURlZlJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSksIHByb3BlcnR5VmFsdWVVaWQsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCBOb2RlVHlwZUVudW0uUHJvcGVydHksIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJCQlpZiAocHJvcGVydHlEZWZSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydHlEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0KKworCQkJSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4gcHJvcGVydHlEZWZQYWlyID0gcHJvcGVydHlEZWZSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlQcm9wZXJ0eURhdGEgcHJvcGVydHlEYXRhID0gcHJvcGVydHlEZWZQYWlyLmxlZnQ7CisJCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IChTdHJpbmcpIHByb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQkJLy8gc2V0IHByb3BlcnR5IG9yaWdpbmFsIHVuaXF1ZSBpZAorCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFVuaXF1ZUlkKHByb3BlcnR5VW5pcXVlSWQpOworCQkJLy8gc2V0IHJlc291cmNlIGlkCisJCQkvLyBUT0RPOiBlc29mZXIgYWRkIHJlc291cmNlIGlkCisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0UGFyZW50VW5pcXVlSWQobnVsbCk7CisJCQkvLyBzZXQgdmFsdWUKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7CisJCQkvLyBzZXQgcHJvcGVydHkgdmFsdWUgdW5pcXVlIGlkCisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWVVbmlxdWVVaWQocHJvcGVydHlWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkvLyBzZXQgcnVsZXMKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRSdWxlcyhwcm9wZXJ0eVZhbHVlRGF0YS5nZXRSdWxlcygpKTsKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRUeXBlKHByb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkuZ2V0VHlwZSgpKTsKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRTY2hlbWEocHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7CisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0TmFtZSgoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlRGF0YVBhaXIucmlnaHQuZ2V0UHJvcGVydGllcygpLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkpOworCisJCQlyZXN1bHQuYWRkKHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBidWlsZFJlc291cmNlSW5zdGFuY2VJbnB1dChJbnB1dFZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSwgQ29tcG9uZW50SW5zdGFuY2VJbnB1dCByZXNvdXJjZUluc3RhbmNlSW5wdXQpIHsKKworCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRWYWx1ZSgpOworCQlTdHJpbmcgdWlkID0gcHJvcGVydHlWYWx1ZURhdGEuZ2V0VW5pcXVlSWQoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBpbnN0YW5jZVByb3BlcnR5ID0gbmV3IENvbXBvbmVudEluc3RhbmNlSW5wdXQocmVzb3VyY2VJbnN0YW5jZUlucHV0LCB2YWx1ZSwgdWlkKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXRoKHJlc291cmNlSW5zdGFuY2VJbnB1dC5nZXRQYXRoKCkpOworCisJCXJldHVybiBpbnN0YW5jZVByb3BlcnR5OworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbElucHV0c09mUmVzb3VyY2VJbnN0YW5jZShDb21wb25lbnRJbnN0YW5jZSBjb21wSW5zdGFuY2UpIHsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKworCQlyZXR1cm4gZ2V0QWxsSW5wdXRzT2ZSZXNvdXJjZUluc3RhbmNlT25seUlucHV0RGVmSWQoY29tcEluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PElucHV0RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZElucHV0c1RvQ29tcG9uZW50KFN0cmluZyByZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsIENvbXBvbmVudEluc3RJbnB1dHNNYXAgY29tcG9uZW50SW5zSW5wdXRzLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlMaXN0PElucHV0RGVmaW5pdGlvbj4gcmVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5wdXREZWZpbml0aW9uPigpOworCQlNYXA8U3RyaW5nLCBMaXN0PElucHV0RGVmaW5pdGlvbj4+IG5ld0lucHV0c01hcCA9IGNvbXBvbmVudEluc0lucHV0cy5nZXRDb21wb25lbnRJbnN0YW5jZUlucHV0c01hcCgpOworCQlpZiAobmV3SW5wdXRzTWFwICE9IG51bGwgJiYgIW5ld0lucHV0c01hcC5pc0VtcHR5KCkpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PElucHV0RGVmaW5pdGlvbj4+IGVudHJ5IDogbmV3SW5wdXRzTWFwLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcgY29tcEluc3RJZCA9IGVudHJ5LmdldEtleSgpOworCQkJCUxpc3Q8SW5wdXREZWZpbml0aW9uPiBpbnB1dHMgPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJaWYgKGlucHV0cyAhPSBudWxsICYmICFpbnB1dHMuaXNFbXB0eSgpKSB7CisJCQkJCWZvciAoSW5wdXREZWZpbml0aW9uIGlucHV0IDogaW5wdXRzKSB7CisKKwkJCQkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb3VudGVyUmVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uaW5jcmVhc2VBbmRHZXRSZXNvdXJjZUluc3RhbmNlU3BlY2lmaWNDb3VudGVyKGNvbXBJbnN0SWQsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSU5QVVRfQ09VTlRFUiwgdHJ1ZSk7CisJCQkJCQlpZiAoY291bnRlclJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlsb2cuZGVidWcoImluY3JlYXNlQW5kR2V0UmVzb3VyY2VJbnB1dENvdW50ZXIgZmFpbGVkIHJlc291cmNlIGluc3RhbmNlIHt9IiwgY29tcEluc3RJZCk7CisJCQkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjb3VudGVyUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCUVpdGhlcjxJbnB1dERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvbGRJbnB1dEVpdGhlciA9IGdldElucHV0RnJvbUdyYXBoKGlucHV0LmdldFVuaXF1ZUlkKCksIHRydWUsIHRydWUpOworCQkJCQkJaWYgKG9sZElucHV0RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGdldCBpbnB1dCAge30gIiwgIGlucHV0LmdldFVuaXF1ZUlkKCkpOworCisJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKG9sZElucHV0RWl0aGVyLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCQkJfQorCQkJCQkJSlNPTk9iamVjdCBqb2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKwkJCQkJCWpvYmplY3QucHV0KCJnZXRfaW5wdXQiLCBpbnB1dC5nZXROYW1lKCkpOworCQkJCQkJSW5wdXREZWZpbml0aW9uIG9sZElucHV0ID0gb2xkSW5wdXRFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQkJCQkKKwkJCQkJCUNvbXBvbmVudEluc3RhbmNlSW5wdXQgaW5wdXRWYWx1ZSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZUlucHV0KG9sZElucHV0LCBqb2JqZWN0LnRvSlNPTlN0cmluZygpLCBudWxsKTsKKwkJCQkJCUludGVnZXIgaW5kZXggPSBjb3VudGVyUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQkJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VJbnB1dCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uYWRkSW5wdXRWYWx1ZVRvUmVzb3VyY2VJbnN0YW5jZShpbnB1dFZhbHVlLCBjb21wSW5zdElkLCBpbmRleCwgdHJ1ZSk7CisKKwkJCQkJCWlmIChlaXRoZXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGlucHV0IHZhbHVlIHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9IGluIEdyYXBoLiBzdGF0dXMgaXMge30iLCBpbnB1dFZhbHVlLCBjb21wSW5zdElkLCBlaXRoZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJfQorCQkJCQkJQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBpbnB1dFZhbHVlRGF0YSA9IGVpdGhlclN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJCQkJLy8gQ29tcG9uZW50SW5zdGFuY2VJbnB1dCBwcm9wZXJ0eVZhbHVlUmVzdWx0ID0KKwkJCQkJCS8vIGJ1aWxkUmVzb3VyY2VJbnN0YW5jZUlucHV0KHByb3BlcnR5VmFsdWVEYXRhLAorCQkJCQkJLy8gaW5wdXRWYWx1ZSk7CisJCQkJCQkvLyBsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgaXMgIgorCQkJCQkJLy8gKyBwcm9wZXJ0eVZhbHVlUmVzdWx0KTsKKworCQkJCQkJU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKKwkJCQkJCWlucHV0LnNldFNjaGVtYShvbGRJbnB1dEVpdGhlci5sZWZ0KCkudmFsdWUoKS5nZXRTY2hlbWEoKSk7CisJCQkJCQlpbnB1dC5zZXREZWZhdWx0VmFsdWUob2xkSW5wdXQuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQkJCQkJaW5wdXQuc2V0Q29uc3RyYWludHMob2xkSW5wdXQuZ2V0Q29uc3RyYWludHMoKSk7CisJCQkJCQlpbnB1dC5zZXREZXNjcmlwdGlvbihvbGRJbnB1dC5nZXREZXNjcmlwdGlvbigpKTsKKwkJCQkJCWlucHV0LnNldEhpZGRlbihvbGRJbnB1dC5pc0hpZGRlbigpKTsKKwkJCQkJCWlucHV0LnNldEltbXV0YWJsZShvbGRJbnB1dC5pc0ltbXV0YWJsZSgpKTsKKwkJCQkJCWlucHV0LnNldERlZmluaXRpb24ob2xkSW5wdXQuaXNEZWZpbml0aW9uKCkpOworCQkJCQkJaW5wdXQuc2V0UmVxdWlyZWQob2xkSW5wdXQuaXNSZXF1aXJlZCgpKTsKKworIAkJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSA9IHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkoaW5wdXQsIGRhdGFUeXBlcyk7CisJCQkJCQlpZiAodmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCQkJbG9nLmVycm9yKCJQcm9wZXJ0eSB7fSBpcyBpbnZhbGlkLiBTdGF0dXMgaXMge30iLCBpbnB1dCwgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSk7CisJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5KTsKKwkJCQkJCX0KKworCQkJCQkJRWl0aGVyPElucHV0c0RhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVRvR3JhcGggPSBhZGRJbnB1dFRvR3JhcGgoaW5wdXROYW1lLCBpbnB1dCwgcmVzb3VyY2VJZCwgbm9kZVR5cGUpOworCisJCQkJCQlpZiAoYWRkUHJvcGVydHlUb0dyYXBoLmlzUmlnaHQoKSkgeworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhZGRQcm9wZXJ0eVRvR3JhcGgucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJCQl9CisJCQkJCQlJbnB1dERlZmluaXRpb24gY3JlYXRlZElucHV0eURlZmluaXRpb24gPSBjb252ZXJ0SW5wdXREYXRhVG9JbnB1dERlZmluaXRpb24oYWRkUHJvcGVydHlUb0dyYXBoLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJCWNyZWF0ZWRJbnB1dHlEZWZpbml0aW9uLnNldE5hbWUoaW5wdXROYW1lKTsKKwkJCQkJCWNyZWF0ZWRJbnB1dHlEZWZpbml0aW9uLnNldFBhcmVudFVuaXF1ZUlkKHJlc291cmNlSWQpOworCisJCQkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQkJCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBjcmVhdGVkSW5wdXR5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQkJCQkJcHJvcHMucHV0KEdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5Lk9XTkVSX0lELmdldFByb3BlcnR5KCksIGNvbXBJbnN0SWQpOworCisJCQkJCQlHcmFwaE5vZGUgcHJvcGVydHlEYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uSW5wdXRWYWx1ZSwgaW5wdXRWYWx1ZURhdGEuZ2V0VmFsdWVVbmlxdWVVaWQoKSk7CisKKwkJCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcFJlZlJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihhZGRQcm9wZXJ0eVRvR3JhcGgubGVmdCgpLnZhbHVlKCksIHByb3BlcnR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkdFVF9JTlBVVCwgcHJvcHMpOworCisJCQkJCQlpZiAoYWRkUHJvcFJlZlJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhZGRQcm9wUmVmUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiRmFpbGVkIHRvIGFzc29jaWF0ZSBpbnB1dCAiICsgYWRkUHJvcGVydHlUb0dyYXBoLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkgKyAiIHRvIGlucHV0IHZhbHVlICIgKyBpbnB1dFZhbHVlRGF0YS5nZXRVbmlxdWVJZCgpICsgIiBpbiBncmFwaC4gU3RhdHVzIGlzICIgKyBzdGF0dXM7CisJCQkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKEFTU09DSUFUSU5HX0lOUFVUX1RPX1BST1AsIGRlc2NyaXB0aW9uLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJCQl9CisKKwkJCQkJCXJlc0xpc3QuYWRkKGNyZWF0ZWRJbnB1dHlEZWZpbml0aW9uKTsKKworCQkJCQl9CisJCQkJfQorCisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc0xpc3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9JbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyOWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzA4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblRyYW5zYWN0aW9uOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuRXZlbnQuU3RhdHVzQ2hhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5JbnRlcmZhY2VEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuT3BlcmF0aW9uRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BcnRpZmFjdERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW50ZXJmYWNlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkFydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5JbnRlcmZhY2VEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLk9wZXJhdGlvbkRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BDb21wb25lbnQoImludGVyZmFjZS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIEludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbiBpbXBsZW1lbnRzIElJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIEludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbzsKKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkSW50ZXJmYWNlVG9SZXNvdXJjZShJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZiwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgeworCisJCXJldHVybiBhZGRJbnRlcmZhY2VUb1Jlc291cmNlKGludGVyZiwgcmVzb3VyY2VJZCwgaW50ZXJmYWNlTmFtZSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkSW50ZXJmYWNlVG9SZXNvdXJjZShJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZiwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJcmV0dXJuIGNyZWF0ZUludGVyZmFjZU9uUmVzb3VyY2UoaW50ZXJmLCByZXNvdXJjZUlkLCBpbnRlcmZhY2VOYW1lLCB0cnVlLCBpblRyYW5zYWN0aW9uKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPE9wZXJhdGlvbkRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRPcGVyYXRpb25Ub0dyYXBoKEludGVyZmFjZURlZmluaXRpb24gaW50ZXJmLCBTdHJpbmcgb3BOYW1lLAorCQkJT3BlcmF0aW9uIG9wLCBJbnRlcmZhY2VEYXRhIGludGVyZmFjZURhdGEpIHsKKworCQlvcC5zZXRVbmlxdWVJZChVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKChTdHJpbmcpIGludGVyZmFjZURhdGEuZ2V0VW5pcXVlSWQoKSwgb3BOYW1lKSk7CisJCU9wZXJhdGlvbkRhdGEgb3BlcmF0aW9uRGF0YSA9IG5ldyBPcGVyYXRpb25EYXRhKG9wKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgb3BlcmF0aW9uIHRvIGdyYXBoIHt9Iiwgb3BlcmF0aW9uRGF0YSk7CisJCUVpdGhlcjxPcGVyYXRpb25EYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlT3BOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUob3BlcmF0aW9uRGF0YSwKKwkJCQlPcGVyYXRpb25EYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgb3BlcmF0aW9uIHRvIGdyYXBoIHt9Iiwgb3BlcmF0aW9uRGF0YSk7CisKKwkJaWYgKGNyZWF0ZU9wTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wU3RhdHVzID0gY3JlYXRlT3BOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBvcGVyYXRpb24ge30gdG8gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIG9wTmFtZSwgb3BTdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcFN0YXR1cyk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgb3BOYW1lKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oaW50ZXJmYWNlRGF0YSwKKwkJCQlvcGVyYXRpb25EYXRhLCBHcmFwaEVkZ2VMYWJlbHMuSU5URVJGQUNFX09QRVJBVElPTiwgcHJvcHMpOworCisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVPcE5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIG9wZXJhdGlvbiB7fSB0byBwcm9wZXJ0eSB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IiwgaW50ZXJmYWNlRGF0YS5nZXRVbmlxdWVJZCgpLCBvcE5hbWUsIG9wZXJhdGlvblN0YXR1cyk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVPcE5vZGVSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRPcGVyYXRpb25Ub0dyYXBoKEludGVyZmFjZURlZmluaXRpb24gaW50ZXJmLCBTdHJpbmcgb3BOYW1lLAorCQkJT3BlcmF0aW9uIG9wLCBUaXRhblZlcnRleCBpbnRlcmZhY2VWZXJ0ZXgpIHsKKworCQlTdHJpbmcgaW50ZXJmYWNlSWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkoaW50ZXJmYWNlVmVydGV4LAorCQkJCUdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCQlvcC5zZXRVbmlxdWVJZChVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKGludGVyZmFjZUlkLCBvcE5hbWUpKTsKKwkJT3BlcmF0aW9uRGF0YSBvcGVyYXRpb25EYXRhID0gbmV3IE9wZXJhdGlvbkRhdGEob3ApOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBvcGVyYXRpb24gdG8gZ3JhcGgge30iLCBvcGVyYXRpb25EYXRhKTsKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlT3BOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUob3BlcmF0aW9uRGF0YSk7CisKKwkJaWYgKGNyZWF0ZU9wTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wU3RhdHVzID0gY3JlYXRlT3BOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBvcGVyYXRpb24ge30gdG8gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIG9wTmFtZSwgb3BTdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcFN0YXR1cyk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgb3BOYW1lKTsKKwkJVGl0YW5WZXJ0ZXggb3BlcmF0aW9uVmVydGV4ID0gY3JlYXRlT3BOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShpbnRlcmZhY2VWZXJ0ZXgsIG9wZXJhdGlvblZlcnRleCwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuSU5URVJGQUNFX09QRVJBVElPTiwgcHJvcHMpOworCisJCWlmICghY3JlYXRlUmVsUmVzdWx0LmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSBvcGVyYXRpb24ge30gdG8gcHJvcGVydHkge30gaW4gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIGludGVyZmFjZUlkLCBvcE5hbWUsCisJCQkJCWNyZWF0ZVJlbFJlc3VsdCk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY3JlYXRlUmVsUmVzdWx0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQob3BlcmF0aW9uVmVydGV4KTsKKwl9CisKKwlwcml2YXRlIEludGVyZmFjZURlZmluaXRpb24gY29udmVydEludGVyZmFjZURhdGFUb0ludGVyZmFjZURlZmluaXRpb24oSW50ZXJmYWNlRGF0YSBpbnRlcmZhY2VEYXRhKSB7CisKKwkJbG9nLmRlYnVnKCJUaGUgb2JqZWN0IHJldHVybmVkIGFmdGVyIGNyZWF0ZSBpbnRlcmZhY2UgaXMge30iLCBpbnRlcmZhY2VEYXRhKTsKKworCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZlJlc3VsdCA9IG5ldyBJbnRlcmZhY2VEZWZpbml0aW9uKGludGVyZmFjZURhdGEuZ2V0SW50ZXJmYWNlRGF0YURlZmluaXRpb24oKSk7CisKKwkJcmV0dXJuIGludGVyZmFjZURlZlJlc3VsdDsKKworCX0KKworCXByaXZhdGUgT3BlcmF0aW9uIGNvbnZlcnRPcGVyYXRpb25EYXRhVG9PcGVyYXRpb24oT3BlcmF0aW9uRGF0YSBvcGVyYXRpb25EYXRhKSB7CisKKwkJbG9nLmRlYnVnKCJUaGUgb2JqZWN0IHJldHVybmVkIGFmdGVyIGNyZWF0ZSBvcGVyYXRpb24gaXMge30iLCBvcGVyYXRpb25EYXRhKTsKKworCQlPcGVyYXRpb24gb3BlcmF0aW9uRGVmUmVzdWx0ID0gbmV3IE9wZXJhdGlvbihvcGVyYXRpb25EYXRhLmdldE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKCkpOworCisJCXJldHVybiBvcGVyYXRpb25EZWZSZXN1bHQ7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbnRlcmZhY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkSW50ZXJmYWNlVG9HcmFwaChJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZUluZm8sCisJCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlJbnRlcmZhY2VEYXRhIGludGVyZmFjZURhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YShpbnRlcmZhY2VJbmZvKTsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChyZXNvdXJjZUlkKTsKKworCQlTdHJpbmcgaW50ZXJmYWNlTmFtZVNwbGl0dGVkID0gZ2V0U2hvcnRJbnRlcmZhY2VOYW1lKGludGVyZmFjZUluZm8pOworCisJCWludGVyZmFjZUluZm8uc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChyZXNvdXJjZUlkLCBpbnRlcmZhY2VOYW1lU3BsaXR0ZWQpKTsKKworCQlFaXRoZXI8SW50ZXJmYWNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGV4aXN0SW50ZXJmYWNlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE5vZGUoaW50ZXJmYWNlRGF0YS5nZXRVbmlxdWVJZEtleSgpLCBpbnRlcmZhY2VEYXRhLmdldFVuaXF1ZUlkKCksIEludGVyZmFjZURhdGEuY2xhc3MpOworCisJCWlmIChleGlzdEludGVyZmFjZS5pc1JpZ2h0KCkpIHsKKworCQkJcmV0dXJuIGNyZWF0ZUludGVyZmFjZU5vZGVBbmRSZWxhdGlvbihpbnRlcmZhY2VOYW1lU3BsaXR0ZWQsIHJlc291cmNlSWQsIGludGVyZmFjZURhdGEsIHJlc291cmNlRGF0YSk7CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIkludGVyZmFjZSB7fSBhbHJlYWR5IGV4aXN0IiwgaW50ZXJmYWNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZEludGVyZmFjZVRvR3JhcGgoSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VJbmZvLAorCQkJU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyByZXNvdXJjZUlkLCBUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCkgeworCisJCUludGVyZmFjZURhdGEgaW50ZXJmYWNlRGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKGludGVyZmFjZUluZm8pOworCisJCVN0cmluZyBpbnRlcmZhY2VOYW1lU3BsaXR0ZWQgPSBnZXRTaG9ydEludGVyZmFjZU5hbWUoaW50ZXJmYWNlSW5mbyk7CisKKwkJaW50ZXJmYWNlSW5mby5zZXRVbmlxdWVJZChVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKHJlc291cmNlSWQsIGludGVyZmFjZU5hbWVTcGxpdHRlZCkpOworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGV4aXN0SW50ZXJmYWNlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldFZlcnRleEJ5UHJvcGVydHkoaW50ZXJmYWNlRGF0YS5nZXRVbmlxdWVJZEtleSgpLCBpbnRlcmZhY2VEYXRhLmdldFVuaXF1ZUlkKCkpOworCisJCWlmIChleGlzdEludGVyZmFjZS5pc1JpZ2h0KCkpIHsKKworCQkJcmV0dXJuIGNyZWF0ZUludGVyZmFjZU5vZGVBbmRSZWxhdGlvbihpbnRlcmZhY2VOYW1lU3BsaXR0ZWQsIHJlc291cmNlSWQsIGludGVyZmFjZURhdGEsIG1ldGFkYXRhVmVydGV4KTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiSW50ZXJmYWNlIHt9ICBhbHJlYWR5IGV4aXN0IiwgaW50ZXJmYWNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbnRlcmZhY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlSW50ZXJmYWNlTm9kZUFuZFJlbGF0aW9uKFN0cmluZyBpbnRlcmZhY2VOYW1lLAorCQkJU3RyaW5nIHJlc291cmNlSWQsIEludGVyZmFjZURhdGEgaW50ZXJmYWNlRGF0YSwgUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBpbnRlcmZhY2UgdG8gZ3JhcGgge30iLCBpbnRlcmZhY2VEYXRhKTsKKwkJRWl0aGVyPEludGVyZmFjZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoaW50ZXJmYWNlRGF0YSwKKwkJCQlJbnRlcmZhY2VEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcHJvcGVydHkgdG8gZ3JhcGgge30iLCBpbnRlcmZhY2VEYXRhKTsKKworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGludGVyZmFjZSB7fSB0byBncmFwaC4gU3RhdHVzIGlzIHt9IiwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBpbnRlcmZhY2VOYW1lKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocmVzb3VyY2VEYXRhLAorCQkJCWludGVyZmFjZURhdGEsIEdyYXBoRWRnZUxhYmVscy5JTlRFUkZBQ0UsIHByb3BzKTsKKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHJlc291cmNlIHt9IHRvIHByb3BlcnR5IHt9IGluIGdyYXBoLiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUlkLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25TdGF0dXMpOworCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlTm9kZVJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVJbnRlcmZhY2VOb2RlQW5kUmVsYXRpb24oU3RyaW5nIGludGVyZmFjZU5hbWUsCisJCQlTdHJpbmcgcmVzb3VyY2VJZCwgSW50ZXJmYWNlRGF0YSBpbnRlcmZhY2VEYXRhLCBUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCkgeworCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgaW50ZXJmYWNlIHRvIGdyYXBoIHt9IiwgaW50ZXJmYWNlRGF0YSk7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShpbnRlcmZhY2VEYXRhKTsKKworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGludGVyZmFjZSB7fSB0byBncmFwaC4gc3RhdHVzIGlzIHt9IiwgaW50ZXJmYWNlTmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBpbnRlcmZhY2VOYW1lKTsKKwkJVGl0YW5WZXJ0ZXggaW50ZXJmYWNlVmVydGV4ID0gY3JlYXRlTm9kZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZUVkZ2UobWV0YWRhdGFWZXJ0ZXgsIGludGVyZmFjZVZlcnRleCwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuSU5URVJGQUNFLCBwcm9wcyk7CisJCWlmICghY3JlYXRlUmVsUmVzdWx0LmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSB7fSB0byBwcm9wZXJ0eSB7fSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwKKwkJCQkJaW50ZXJmYWNlTmFtZSwgY3JlYXRlUmVsUmVzdWx0KTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW50ZXJmYWNlVmVydGV4KTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxPcGVyYXRpb25EYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlT3BlcmF0aW9uTm9kZUFuZFJlbGF0aW9uKFN0cmluZyBvcGVyYXRpb25OYW1lLAorCQkJT3BlcmF0aW9uRGF0YSBvcGVyYXRpb25EYXRhLCBJbnRlcmZhY2VEYXRhIGludGVyZmFjZURhdGEpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIG9wZXJhdGlvbiB0byBncmFwaCB7fSIsIG9wZXJhdGlvbkRhdGEpOworCQlFaXRoZXI8T3BlcmF0aW9uRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShvcGVyYXRpb25EYXRhLAorCQkJCU9wZXJhdGlvbkRhdGEuY2xhc3MpOworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBvcGVyYXRpb24gdG8gZ3JhcGgge30iLCBpbnRlcmZhY2VEYXRhKTsKKworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGludGVyZm9wZXJhdGlvbmNlIHt9IHRvIGdyYXBoLiBTdGF0dXMgaXMge30iLCBvcGVyYXRpb25OYW1lLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIG9wZXJhdGlvbk5hbWUpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihpbnRlcmZhY2VEYXRhLAorCQkJCW9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZUxhYmVscy5JTlRFUkZBQ0VfT1BFUkFUSU9OLCBwcm9wcyk7CisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSBvcGVyYXRpb24ge30gdG8gaW50ZXJmYWNlIHt9IGluIGdyYXBoLiBTdGF0dXMgaXMge30iLCBvcGVyYXRpb25OYW1lLCBpbnRlcmZhY2VEYXRhLmdldFVuaXF1ZUlkKCksIG9wZXJhdGlvblN0YXR1cyk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEludGVyZmFjZSgKKwkvLyBTdHJpbmcgaW50ZXJmYWNlSWQpIHsKKwkvLworCS8vIC8qCisJLy8gKiBFaXRoZXI8SW50ZXJmYWNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlc3VsdCA9CisJLy8gKiB0aGlzLnRpdGFuR2VuZXJpY0RhbworCS8vICogLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkludGVyZmFjZSksCisJLy8gKiBpbnRlcmZhY2VJZCwgSW50ZXJmYWNlRGF0YS5jbGFzcyk7IGlmIChnZXRSZXN1bHQuaXNMZWZ0KCkpIHsKKwkvLyAqIEludGVyZmFjZURhdGEgcHJvcGVydHlEYXRhID0gZ2V0UmVzdWx0LmxlZnQoKS52YWx1ZSgpOyByZXR1cm4KKwkvLyAqIEVpdGhlci5sZWZ0KGNvbnZlcnRQcm9wZXJ0eURhdGFUb1Byb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eURhdGEpKTsgfQorCS8vICogZWxzZSB7IFRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuU3RhdHVzID0gZ2V0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkvLyAqIGxvZy5kZWJ1ZygiTm9kZSB3aXRoIGlkIHt9IHdhcyBub3QgZm91bmQgaW4gdGhlIGdyYXBoLiBTdGF0dXM6IHt9IiwgcHJvcGVydHlJZCwgdGl0YW5TdGF0dXMpOworCS8vICogU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlT3BlcmF0aW9uU3RhdHVzID0KKwkvLyAqIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModGl0YW5TdGF0dXMpOworCS8vICogcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlT3BlcmF0aW9uU3RhdHVzKTsgfQorCS8vICovCisJLy8gcmV0dXJuIG51bGw7CisJLy8gfQorCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRJbnRlcmZhY2UoCisJLy8gU3RyaW5nIGludGVyZmFjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJLy8gcmV0dXJuIG51bGw7CisJLy8gfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsSW50ZXJmYWNlc09mUmVzb3VyY2UoCisJCQlTdHJpbmcgcmVzb3VyY2VJZG4sIGJvb2xlYW4gcmVjdXJzaXZlbHkpIHsKKwkJcmV0dXJuIGdldEFsbEludGVyZmFjZXNPZlJlc291cmNlKHJlc291cmNlSWRuLCByZWN1cnNpdmVseSwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbEludGVyZmFjZXNPZlJlc291cmNlKAorCQkJU3RyaW5nIHJlc291cmNlSWQsIGJvb2xlYW4gcmVjdXJzaXZlbHksIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4oKTsKKwkJdHJ5IHsKKwkJCWlmICgocmVzb3VyY2VJZCA9PSBudWxsKSB8fCByZXNvdXJjZUlkLmlzRW1wdHkoKSkgeworCQkJCWxvZy5lcnJvcigicmVzb3VyY2VJZCBpcyBlbXB0eSIpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRJbnRlcmZhY2VzUmVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCWlmIChyZWN1cnNpdmVseSkgeworCQkJCWZpbmRJbnRlcmZhY2VzUmVzID0gZmluZEFsbEludGVyZmFjZXNSZWN1cnNpdmVseShyZXNvdXJjZUlkLCBpbnRlcmZhY2VzKTsKKwkJCX0gZWxzZSB7CisJCQkJZmluZEludGVyZmFjZXNSZXMgPSBmaW5kQWxsSW50ZXJmYWNlc05vdFJlY3Vyc2l2ZWx5KHJlc291cmNlSWQsIGludGVyZmFjZXMpOworCQkJfQorCQkJaWYgKCFmaW5kSW50ZXJmYWNlc1Jlcy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGFsbCBpbnRlcmZhY2VzIG9mIHJlc291cmNlIHt9LiBTdGF0dXMgaXMge30iLCByZXNvdXJjZUlkLCBmaW5kSW50ZXJmYWNlc1Jlcyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZmluZEludGVyZmFjZXNSZXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoaW50ZXJmYWNlcyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRBbGxJbnRlcmZhY2VzTm90UmVjdXJzaXZlbHkoU3RyaW5nIHJlc291cmNlSWQsCisJCQlNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiBpbnRlcmZhY2VzKSB7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxJbnRlcmZhY2VEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGludGVyZmFjZU5vZGVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgcmVzb3VyY2VJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5JTlRFUkZBQ0UsIE5vZGVUeXBlRW51bS5JbnRlcmZhY2UsIEludGVyZmFjZURhdGEuY2xhc3MpOworCisJCWlmIChpbnRlcmZhY2VOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGludGVyZmFjZU5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxJbnRlcmZhY2VEYXRhLCBHcmFwaEVkZ2U+PiBpbnRlcmZhY2VMaXN0ID0gaW50ZXJmYWNlTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoaW50ZXJmYWNlTGlzdCAhPSBudWxsKSB7CisJCQkJZm9yIChJbW11dGFibGVQYWlyPEludGVyZmFjZURhdGEsIEdyYXBoRWRnZT4gaW50ZXJmYWNlUGFpciA6IGludGVyZmFjZUxpc3QpIHsKKwkJCQkJU3RyaW5nIGludGVyZmFjZVVuaXF1ZUlkID0gKFN0cmluZykgaW50ZXJmYWNlUGFpci5nZXRLZXkoKS5nZXRVbmlxdWVJZCgpOworCQkJCQlFaXRoZXI8U3RyaW5nLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW50ZXJmYWNlTmFtZVJlcyA9IGdldFByb3BlcnR5VmFsdWVGcm9tRWRnZSgKKwkJCQkJCQlpbnRlcmZhY2VQYWlyLmdldFZhbHVlKCksIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRSk7CisJCQkJCWlmIChpbnRlcmZhY2VOYW1lUmVzLmlzUmlnaHQoKSkgeworCQkJCQkJbG9nLmVycm9yKCJUaGUgcmVxdWlyZW1lbnQgbmFtZSBpcyBtaXNzaW5nIG9uIHRoZSBlZGdlIG9mIHJlcXVpcmVtZW50IHt9IiwgaW50ZXJmYWNlVW5pcXVlSWQpOworCQkJCQkJcmV0dXJuIGludGVyZmFjZU5hbWVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQl9CisJCQkJCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbnRlcmZhY2VEZWZSZXMgPSBnZXROb25SZWN1cnNpdmVJbnRlcmZhY2UoCisJCQkJCQkJaW50ZXJmYWNlUGFpci5nZXRLZXkoKSk7CisJCQkJCWlmIChpbnRlcmZhY2VEZWZSZXMuaXNSaWdodCgpKSB7CisJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBpbnRlcmZhY2VEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGludGVyZmFjZSBhY3Rpb25zIG9mIGludGVyZmFjZSB7fSIsIGludGVyZmFjZVVuaXF1ZUlkKTsKKwkJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJCX0KKworCQkJCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24gPSBpbnRlcmZhY2VEZWZSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCWlmICh0cnVlID09IGludGVyZmFjZXMuY29udGFpbnNLZXkoaW50ZXJmYWNlTmFtZSkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiVGhlIGludGVyZmFjZSB7fSB3YXMgYWxyZWFkeSBkZWZpbmVkIGluIGRlcml2ZWQgcmVzb3VyY2UuIGFkZCBub3Qgb3ZlcnJpZGVuIG9wZXJhdGlvbnMiLCBpbnRlcmZhY2VOYW1lKTsKKwkJCQkJCUludGVyZmFjZURlZmluaXRpb24gZXhpc3RJbnRlcmZhY2UgPSBpbnRlcmZhY2VzLmdldChpbnRlcmZhY2VOYW1lKTsKKwkJCQkJCWFkZE1pc3NpbmdPcGVyYXRpb25zVG9JbnRlcmZhY2UoaW50ZXJmYWNlRGVmaW5pdGlvbiwgZXhpc3RJbnRlcmZhY2UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW50ZXJmYWNlcy5wdXQoaW50ZXJmYWNlTmFtZSwgaW50ZXJmYWNlRGVmaW5pdGlvbik7CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRBbGxJbnRlcmZhY2VzUmVjdXJzaXZlbHkoU3RyaW5nIHJlc291cmNlSWQsCisJCQlNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiBpbnRlcmZhY2VzKSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZEFsbEludGVyZmFjZXNOb3RSZWN1cnNpdmVseSA9IGZpbmRBbGxJbnRlcmZhY2VzTm90UmVjdXJzaXZlbHkocmVzb3VyY2VJZCwgaW50ZXJmYWNlcyk7CisJCWlmICghZmluZEFsbEludGVyZmFjZXNOb3RSZWN1cnNpdmVseS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBnZXQgaW50ZXJmYWNlcyBmb3IgcmVzb3VyY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSWQsIGZpbmRBbGxJbnRlcmZhY2VzTm90UmVjdXJzaXZlbHkpOworCQl9CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKHBhcmVudE5vZGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcGFyZW50Tm9kZXNTdGF0dXMgPSBwYXJlbnROb2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAocGFyZW50Tm9kZXNTdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJGaW5pc2ggdG8gbG9va3VwIGZvciBwYXJuZXQgaW50ZXJmYWNlcyIpOworCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBwYXJlbnQgaW50ZXJmYWNlcyBvZiByZXNvdXJjZSB7fS4gU3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgcGFyZW50Tm9kZXNTdGF0dXMpOworCQkJCXJldHVybiBwYXJlbnROb2Rlc1N0YXR1czsKKwkJCX0KKwkJfQorCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhcm5ldE5vZGVQYWlyID0gcGFyZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyBwYXJlbnRVbmlxdWVJZCA9IHBhcm5ldE5vZGVQYWlyLmdldEtleSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQYXJlbnRJbnRTdGF0dXMgPSBmaW5kQWxsSW50ZXJmYWNlc1JlY3Vyc2l2ZWx5KHBhcmVudFVuaXF1ZUlkLCBpbnRlcmZhY2VzKTsKKworCQlpZiAoYWRkUGFyZW50SW50U3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBhbGwgaW50ZXJmYWNlcyBvZiByZXNvdXJjZSB7fSIsIHBhcmVudFVuaXF1ZUlkKTsKKwkJCXJldHVybiBhZGRQYXJlbnRJbnRTdGF0dXM7CisJCX0KKworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8U3RyaW5nLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UHJvcGVydHlWYWx1ZUZyb21FZGdlKEdyYXBoRWRnZSBlZGdlLAorCQkJR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeSBwcm9wZXJ0eSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVkZ2VQcm9wcyA9IGVkZ2UuZ2V0UHJvcGVydGllcygpOworCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG51bGw7CisJCWlmIChlZGdlUHJvcHMgIT0gbnVsbCkgeworCQkJaW50ZXJmYWNlTmFtZSA9IChTdHJpbmcpIGVkZ2VQcm9wcy5nZXQocHJvcGVydHkuZ2V0UHJvcGVydHkoKSk7CisJCQlpZiAoaW50ZXJmYWNlTmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChpbnRlcmZhY2VOYW1lKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Tm9uUmVjdXJzaXZlSW50ZXJmYWNlKEludGVyZmFjZURhdGEgaW50ZXJmYWNlRGF0YSkgeworCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZmV0Y2ggdGhlIG9wZXJhdGlvbnMgYXNzb2NpYXRlIHRvIGludGVyZmFjZSB7fSIsIGludGVyZmFjZURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCUludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmaW5pdGlvbiA9IG5ldyBJbnRlcmZhY2VEZWZpbml0aW9uKGludGVyZmFjZURhdGEuZ2V0SW50ZXJmYWNlRGF0YURlZmluaXRpb24oKSk7CisKKwkJU3RyaW5nIGludGVyZmFjZUlkID0gaW50ZXJmYWNlRGF0YS5nZXRVbmlxdWVJZCgpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gb3BlcmF0aW9uc1JlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZHJlbk5vZGVzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIGludGVyZmFjZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLklOVEVSRkFDRV9PUEVSQVRJT04sIE5vZGVUeXBlRW51bS5JbnRlcmZhY2VPcGVyYXRpb24sIE9wZXJhdGlvbkRhdGEuY2xhc3MpOworCisJCWlmIChvcGVyYXRpb25zUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gb3BlcmF0aW9uc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGludGVyZmFjZURlZmluaXRpb24pOworCQkJfQorCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4+IG9wZXJhdGlvbkxpc3QgPSBvcGVyYXRpb25zUmVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAob3BlcmF0aW9uTGlzdCAhPSBudWxsICYmICFvcGVyYXRpb25MaXN0LmlzRW1wdHkoKSkgeworCQkJZm9yIChJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4gb3BlcmF0aW9uUGFpciA6IG9wZXJhdGlvbkxpc3QpIHsKKwkJCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihvcGVyYXRpb25QYWlyLmdldEtleSgpLmdldE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKCkpOworCQkJCUVpdGhlcjxTdHJpbmcsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvcGVyYXRpb25OYW1lUmVzID0gZ2V0UHJvcGVydHlWYWx1ZUZyb21FZGdlKAorCQkJCQkJb3BlcmF0aW9uUGFpci5nZXRWYWx1ZSgpLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUpOworCQkJCWlmIChvcGVyYXRpb25OYW1lUmVzLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIlRoZSBvcGVyYXRpb24gbmFtZSBpcyBtaXNzaW5nIG9uIHRoZSBlZGdlIG9mIG9wZXJhdGlvbiB7fSIsIG9wZXJhdGlvblBhaXIuZ2V0S2V5KCkuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uTmFtZVJlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbk5hbWVSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJZmluZE9wZXJhdGlvbkltcGxlbWVudGF0aW9uKG9wZXJhdGlvbik7CisJCQkJaW50ZXJmYWNlRGVmaW5pdGlvbi5nZXRPcGVyYXRpb25zKCkucHV0KG9wZXJhdGlvbk5hbWUsIG9wZXJhdGlvbik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW50ZXJmYWNlRGVmaW5pdGlvbik7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGZpbmRPcGVyYXRpb25JbXBsZW1lbnRhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKSB7CisKKwkJU3RyaW5nIG9wZXJhdGlvbklkID0gb3BlcmF0aW9uLmdldFVuaXF1ZUlkKCk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdHNSZXMgPSBhcnRpZmFjdE9wZXJhdGlvbgorCQkJCS5nZXRBcnRpZmFjdHMob3BlcmF0aW9uSWQsIE5vZGVUeXBlRW51bS5JbnRlcmZhY2VPcGVyYXRpb24sIHRydWUpOworCQlpZiAoYXJ0aWZhY3RzUmVzLmlzUmlnaHQoKSB8fCBhcnRpZmFjdHNSZXMubGVmdCgpLnZhbHVlKCkgPT0gbnVsbCkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0IGFydGlmYWN0IGZyb20gZ3JhcGggZm9yIG9wZXJhdGlvbiBpZCB7fS4gc3RhdHVzIGlzIHt9Iiwgb3BlcmF0aW9uSWQsCisJCQkJCWFydGlmYWN0c1Jlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGFydGlmYWN0c1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCX0gZWxzZSB7CisJCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IGFydGlmYWN0c1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGFydGlmYWN0cy5rZXlTZXQoKS5pdGVyYXRvcigpOworCisJCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlvcGVyYXRpb24uc2V0SW1wbGVtZW50YXRpb24oYXJ0aWZhY3RzLmdldChpdGVyLm5leHQoKSkpOworCQkJfQorCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRNaXNzaW5nT3BlcmF0aW9uc1RvSW50ZXJmYWNlKEludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmaW5pdGlvbiwKKwkJCUludGVyZmFjZURlZmluaXRpb24gZXhpc3RJbnRlcmZhY2UpIHsKKwkJTWFwPFN0cmluZywgT3BlcmF0aW9uPiBleGlzdE9wZXJhdGlvbnMgPSBleGlzdEludGVyZmFjZS5nZXRPcGVyYXRpb25zKCk7CisJCU1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IGludGVyZmFjZURlZmluaXRpb24uZ2V0T3BlcmF0aW9ucygpOworCQlpZiAob3BlcmF0aW9ucyAhPSBudWxsICYmICFvcGVyYXRpb25zLmlzRW1wdHkoKSkgeworCQkJU2V0PEVudHJ5PFN0cmluZywgT3BlcmF0aW9uPj4gb3BlcmF0aW9uc1NldCA9IG9wZXJhdGlvbnMuZW50cnlTZXQoKTsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbiA6IG9wZXJhdGlvbnNTZXQpIHsKKwkJCQlpZiAoIWV4aXN0T3BlcmF0aW9ucy5jb250YWluc0tleShvcGVyYXRpb24uZ2V0S2V5KCkpKSB7CisJCQkJCWV4aXN0T3BlcmF0aW9ucy5wdXQob3BlcmF0aW9uLmdldEtleSgpLCBvcGVyYXRpb24uZ2V0VmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVJbnRlcmZhY2VPcGVyYXRpb24oU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VOYW1lLAorCQkJU3RyaW5nIG9wZXJhdGlvbk5hbWUsIE9wZXJhdGlvbiBpbnRlcmYpIHsKKworCQlyZXR1cm4gdXBkYXRlSW50ZXJmYWNlT3BlcmF0aW9uKHJlc291cmNlSWQsIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUsIGludGVyZiwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVJbnRlcmZhY2VPcGVyYXRpb24oU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VOYW1lLAorCQkJU3RyaW5nIG9wZXJhdGlvbk5hbWUsIE9wZXJhdGlvbiBvcGVyYXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSB1cGRhdGVPcGVyYXRpb25PbkdyYXBoKG9wZXJhdGlvbiwgcmVzb3VyY2VJZCwgaW50ZXJmYWNlTmFtZSwKKwkJCQlvcGVyYXRpb25OYW1lKTsKKworCQkvKgorCQkgKiBpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeyBpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkgKiB0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsgfSBsb2cuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgb3BlcmF0aW9uICIKKwkJICogKyBvcGVyYXRpb25OYW1lICsgIiBvZiBpbnRlcmZhY2VOYW1lICIgKyBpbnRlcmZhY2VOYW1lICsKKwkJICogIiBvZiByZXNvdXJjZSIgKyByZXNvdXJjZUlkKTsgcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIKKwkJICogLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7IH0gZWxzZSB7CisJCSAqIGlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7IHRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsgfQorCQkgKiBPcGVyYXRpb25EYXRhIG9wZXJhdGlvbkRhdGEgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCSAqIAorCQkgKiBPcGVyYXRpb24gb3BlcmF0aW9uRGVmUmVzdWx0ID0KKwkJICogY29udmVydE9wZXJhdGlvbkRhdGFUb09wZXJhdGlvbihvcGVyYXRpb25EYXRhKTsKKwkJICogCisJCSAqIAorCQkgKiBsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBPcGVyYXRpb25EZWZpbnRpb24gaXMge30iLCBvcGVyYXRpb25EZWZSZXN1bHQpOyByZXR1cm4gRWl0aGVyLmxlZnQob3BlcmF0aW9uRGVmUmVzdWx0KTsgfQorCQkgKi8KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxPcGVyYXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU9wZXJhdGlvbk9uR3JhcGgoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIHJlc291cmNlSWQsCisJCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEludGVyZmFjZURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5Ob2RlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZHJlbk5vZGVzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIHJlc291cmNlSWQsCisJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuSU5URVJGQUNFLCBOb2RlVHlwZUVudW0uSW50ZXJmYWNlLCBJbnRlcmZhY2VEYXRhLmNsYXNzKTsKKworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCS8qCisJCQkgKiBJbnRlcmZhY2VEZWZpbml0aW9uIGludERlZiA9IG5ldyBJbnRlcmZhY2VEZWZpbml0aW9uKCk7CisJCQkgKiBpbnREZWYuc2V0VHlwZShpbnRlcmZhY2VOYW1lKTsgTWFwPFN0cmluZywgT3BlcmF0aW9uPiBvcE1hcCA9IG5ldworCQkJICogSGFzaE1hcDxTdHJpbmcsIE9wZXJhdGlvbj4oKTsgb3BNYXAucHV0KG9wZXJhdGlvbk5hbWUsCisJCQkgKiBvcGVyYXRpb24pOyBpbnREZWYuc2V0T3BlcmF0aW9ucyhvcE1hcCk7CisJCQkgKiBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhdHVzUmVzID0KKwkJCSAqIHRoaXMgLmNyZWF0ZUludGVyZmFjZU9uUmVzb3VyY2UoaW50RGVmLCByZXNvdXJjZUlkLAorCQkJICogaW50ZXJmYWNlTmFtZSwgdHJ1ZSk7IGlmIChzdGF0dXNSZXMuaXNSaWdodCgpKSByZXR1cm4KKwkJCSAqIEVpdGhlci5yaWdodChzdGF0dXNSZXMucmlnaHQoKS52YWx1ZSgpKTsgZWxzZSB7CisJCQkgKiBJbnRlcmZhY2VEZWZpbml0aW9uIG5ld0RlZiA9IHN0YXR1c1Jlcy5sZWZ0KCkudmFsdWUoKTsgT3BlcmF0aW9uCisJCQkgKiByZXMgPSBuZXdEZWYuZ2V0T3BlcmF0aW9ucygpLmdldChvcGVyYXRpb25OYW1lKTsgcmV0dXJuCisJCQkgKiBFaXRoZXIubGVmdChyZXMpOyB9CisJCQkgKi8KKwkJCXJldHVybiB1cGRhdGVPcGVyYXRpb25Gcm9tUGFyZW50Tm9kZShvcGVyYXRpb24sIHJlc291cmNlSWQsIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUpOworCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdXBkYXRlRXhpc3RpbmdPcGVyYXRpb24ocmVzb3VyY2VJZCwgb3BlcmF0aW9uLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25OYW1lLCBjaGlsZHJlbk5vZGVzKTsKKworCQl9CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxPcGVyYXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUV4aXN0aW5nT3BlcmF0aW9uKFN0cmluZyByZXNvdXJjZUlkLCBPcGVyYXRpb24gb3BlcmF0aW9uLAorCQkJU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyBvcGVyYXRpb25OYW1lLAorCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxJbnRlcmZhY2VEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMpIHsKKwkJT3BlcmF0aW9uIG5ld09wZXJhdGlvbiA9IG51bGw7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKworCQlmb3IgKEltbXV0YWJsZVBhaXI8SW50ZXJmYWNlRGF0YSwgR3JhcGhFZGdlPiBpbnRlcmZhY2VEYXRhTm9kZSA6IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCkpIHsKKworCQkJR3JhcGhFZGdlIGludGVyZmFjZUVkZ2UgPSBpbnRlcmZhY2VEYXRhTm9kZS5nZXRSaWdodCgpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBpbnRlcmZhY2VFZGdlUHJvcCA9IGludGVyZmFjZUVkZ2UuZ2V0UHJvcGVydGllcygpOworCQkJSW50ZXJmYWNlRGF0YSBpbnRlcmZhY2VEYXRhID0gaW50ZXJmYWNlRGF0YU5vZGUuZ2V0S2V5KCk7CisKKwkJCWlmIChpbnRlcmZhY2VFZGdlUHJvcC5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpLmVxdWFscyhpbnRlcmZhY2VOYW1lKSkgeworCQkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8T3BlcmF0aW9uRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvcGVyYXRpb25SZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJCS5nZXRDaGlsZHJlbk5vZGVzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksCisJCQkJCQkJCShTdHJpbmcpIGludGVyZmFjZURhdGFOb2RlLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuSU5URVJGQUNFX09QRVJBVElPTiwKKwkJCQkJCQkJTm9kZVR5cGVFbnVtLkludGVyZmFjZU9wZXJhdGlvbiwgT3BlcmF0aW9uRGF0YS5jbGFzcyk7CisJCQkJaWYgKG9wZXJhdGlvblJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBvcGVyYXRpb24ge30gb24gaW50ZXJmYWNlIHt9Iiwgb3BlcmF0aW9uTmFtZSwgaW50ZXJmYWNlTmFtZSk7CisJCQkJCXJldHVybiBFaXRoZXIKKwkJCQkJCQkucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhvcGVyYXRpb25SZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJTGlzdDxJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4+IG9wZXJhdGlvbnMgPSBvcGVyYXRpb25SZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxPcGVyYXRpb25EYXRhLCBHcmFwaEVkZ2U+IG9wZXJhdGlvblBhaXJFZGdlIDogb3BlcmF0aW9ucykgeworCQkJCQkJR3JhcGhFZGdlIG9wRWRnZSA9IG9wZXJhdGlvblBhaXJFZGdlLmdldFJpZ2h0KCk7CisJCQkJCQlPcGVyYXRpb25EYXRhIG9wRGF0YSA9IG9wZXJhdGlvblBhaXJFZGdlLmdldExlZnQoKTsKKwkJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gb3BFZGdlUHJvcCA9IG9wRWRnZS5nZXRQcm9wZXJ0aWVzKCk7CisJCQkJCQlpZiAob3BFZGdlUHJvcC5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpLmVxdWFscyhvcGVyYXRpb25OYW1lKSkgeworCQkJCQkJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdCA9IG9wZXJhdGlvbi5nZXRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJCUVpdGhlcjxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0UmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkJCQkuZ2V0Q2hpbGQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwKKwkJCQkJCQkJCQkJKFN0cmluZykgb3BEYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5BUlRJRkFDVF9SRUYsCisJCQkJCQkJCQkJCU5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJCQkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhcnRTdGF0dXM7CisJCQkJCQkJaWYgKGFydGlmYWN0UmVzLmlzUmlnaHQoKSkgeworCQkJCQkJCQlhcnRTdGF0dXMgPSBhcnRpZmFjdE9wZXJhdGlvbi5hZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3QsCisJCQkJCQkJCQkJKFN0cmluZykgb3BlcmF0aW9uUGFpckVkZ2UuZ2V0TGVmdCgpLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCQkJTm9kZVR5cGVFbnVtLkludGVyZmFjZU9wZXJhdGlvbiwgdHJ1ZSwgdHJ1ZSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJYXJ0U3RhdHVzID0gYXJ0aWZhY3RPcGVyYXRpb24udXBkYXRlQXJpZmFjdE9uUmVzb3VyY2UoYXJ0aWZhY3QsCisJCQkJCQkJCQkJKFN0cmluZykgb3BlcmF0aW9uUGFpckVkZ2UuZ2V0TGVmdCgpLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCQkJKFN0cmluZykgYXJ0aWZhY3RSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCQkJTm9kZVR5cGVFbnVtLkludGVyZmFjZU9wZXJhdGlvbiwgdHJ1ZSk7CisJCQkJCQkJfQorCQkJCQkJCWlmIChhcnRTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgYXJ0aWZhY3Qge30iLCBvcGVyYXRpb25OYW1lLCBpbnRlcmZhY2VOYW1lKTsKKwkJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChhcnRTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQluZXdPcGVyYXRpb24gPSB0aGlzLmNvbnZlcnRPcGVyYXRpb25EYXRhVG9PcGVyYXRpb24ob3BEYXRhKTsKKwkJCQkJCQkJbmV3T3BlcmF0aW9uLnNldEltcGxlbWVudGF0aW9uKGFydFN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJCWlmIChuZXdPcGVyYXRpb24gPT0gbnVsbCkgeworCQkJCQkJRWl0aGVyPEludGVyZmFjZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnRJbnRlcmZhY2VTdGF0dXMgPSBmaW5kSW50ZXJmYWNlT25QYXJlbnROb2RlKAorCQkJCQkJCQlyZXNvdXJjZUlkLCBpbnRlcmZhY2VOYW1lKTsKKwkJCQkJCWlmIChwYXJlbnRJbnRlcmZhY2VTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJCQkJbG9nLmRlYnVnKCJJbnRlcmZhY2Uge30gbm90IGV4aXN0IiwgaW50ZXJmYWNlTmFtZSk7CisJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIKKwkJCQkJCQkJCS5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMocGFyZW50SW50ZXJmYWNlU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCQkJfQorCisJCQkJCQlJbnRlcmZhY2VEYXRhIHBhcmVudEludGVyZmFjZURhdGEgPSBwYXJlbnRJbnRlcmZhY2VTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gb3BSZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJCQkJLmdldENoaWxkcmVuTm9kZXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwKKwkJCQkJCQkJCQkoU3RyaW5nKSBwYXJlbnRJbnRlcmZhY2VEYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5JTlRFUkZBQ0VfT1BFUkFUSU9OLAorCQkJCQkJCQkJCU5vZGVUeXBlRW51bS5JbnRlcmZhY2VPcGVyYXRpb24sIE9wZXJhdGlvbkRhdGEuY2xhc3MpOworCQkJCQkJaWYgKG9wUmVzLmlzUmlnaHQoKSkgeworCQkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgb3BlcmF0aW9uIHt9IG9uIGludGVyZmFjZSIsIG9wZXJhdGlvbk5hbWUsIGludGVyZmFjZU5hbWUpOworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoCisJCQkJCQkJCQlEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKG9wZXJhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpKTsKKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlMaXN0PEltbXV0YWJsZVBhaXI8T3BlcmF0aW9uRGF0YSwgR3JhcGhFZGdlPj4gcGFyZW50T3BlcmF0aW9ucyA9IG9wUmVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQkJCWZvciAoSW1tdXRhYmxlUGFpcjxPcGVyYXRpb25EYXRhLCBHcmFwaEVkZ2U+IG9wZXJhdGlvblBhaXJFZGdlIDogcGFyZW50T3BlcmF0aW9ucykgeworCQkJCQkJCQlHcmFwaEVkZ2Ugb3BFZGdlID0gb3BlcmF0aW9uUGFpckVkZ2UuZ2V0UmlnaHQoKTsKKwkJCQkJCQkJT3BlcmF0aW9uRGF0YSBvcERhdGEgPSBvcGVyYXRpb25QYWlyRWRnZS5nZXRMZWZ0KCk7CisJCQkJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gb3BFZGdlUHJvcCA9IG9wRWRnZS5nZXRQcm9wZXJ0aWVzKCk7CisJCQkJCQkJCWlmIChvcEVkZ2VQcm9wLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkKKwkJCQkJCQkJCQkuZXF1YWxzKG9wZXJhdGlvbk5hbWUpKSB7CisJCQkJCQkJCQlyZXR1cm4gY29weUFuZENyZWF0ZU5ld09wZXJhdGlvbihvcGVyYXRpb24sIGludGVyZmFjZU5hbWUsIG9wZXJhdGlvbk5hbWUsIG51bGwsCisJCQkJCQkJCQkJCWludGVyZmFjZURhdGEsIG9wZXJhdGlvblJlcywgb3BEYXRhKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJLy8gbm90IGZvdW5kCisJCQkJc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQVJUSUZBQ1RfTk9UX0ZPVU5EOworCQkJfQorCisJCX0KKwkJaWYgKG5ld09wZXJhdGlvbiA9PSBudWxsKQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlT3BlcmF0aW9uU3RhdHVzKTsKKwkJZWxzZQorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ld09wZXJhdGlvbik7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb3B5QW5kQ3JlYXRlTmV3T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24sCisJCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIE9wZXJhdGlvbiBuZXdPcGVyYXRpb24sIEludGVyZmFjZURhdGEgaW50ZXJmYWNlRGF0YSwKKwkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8T3BlcmF0aW9uRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvcGVyYXRpb25SZXMsCisJCQlPcGVyYXRpb25EYXRhIG9wRGF0YSkgeworCQlPcGVyYXRpb25EYXRhRGVmaW5pdGlvbiBvcERhdGFJbmZvID0gb3BEYXRhLmdldE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKCk7CisJCU9wZXJhdGlvbkRhdGFEZWZpbml0aW9uIG5ld09wZXJhdGlvbkluZm8gPSBuZXcgT3BlcmF0aW9uRGF0YURlZmluaXRpb24ob3BEYXRhSW5mbyk7CisJCW5ld09wZXJhdGlvbkluZm8uc2V0VW5pcXVlSWQoCisJCQkJVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChpbnRlcmZhY2VEYXRhLmdldFVuaXF1ZUlkKCksIG9wZXJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKSkpOworCQlPcGVyYXRpb25EYXRhIG5ld29wRGF0YSA9IG5ldyBPcGVyYXRpb25EYXRhKG5ld09wZXJhdGlvbkluZm8pOworCQlFaXRoZXI8T3BlcmF0aW9uRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU9wZXJhdGlvbk5vZGVBbmRSZWxhdGlvbihvcGVyYXRpb25OYW1lLAorCQkJCW5ld29wRGF0YSwgaW50ZXJmYWNlRGF0YSk7CisJCWlmIChvcGVyYXRpb25TdGF0dXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgb3BlcmF0aW9uIHt9IG9uIGludGVyZmFjZSB7fSIsIG9wZXJhdGlvbk5hbWUsIGludGVyZmFjZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKG9wZXJhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3QgPSBvcGVyYXRpb24uZ2V0SW1wbGVtZW50YXRpb24oKTsKKwkJaWYgKGFydGlmYWN0ICE9IG51bGwpIHsKKwkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydFN0YXR1cyA9IGFydGlmYWN0T3BlcmF0aW9uLmFkZEFyaWZhY3RUb0NvbXBvbmVudCgKKwkJCQkJYXJ0aWZhY3QsIChTdHJpbmcpIG9wZXJhdGlvblN0YXR1cy5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uSW50ZXJmYWNlT3BlcmF0aW9uLAorCQkJCQl0cnVlLCB0cnVlKTsKKwkJCWlmIChhcnRTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGFydGlmYWN0IHt9IHRvIGludGVyZmFjZSB7fSIsIG9wZXJhdGlvbk5hbWUsIGludGVyZmFjZU5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQluZXdPcGVyYXRpb24gPSB0aGlzLmNvbnZlcnRPcGVyYXRpb25EYXRhVG9PcGVyYXRpb24ob3BEYXRhKTsKKwkJCQluZXdPcGVyYXRpb24uc2V0SW1wbGVtZW50YXRpb24oYXJ0U3RhdHVzLmxlZnQoKS52YWx1ZSgpKTsKKworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChuZXdPcGVyYXRpb24pOworCX0KKworCXByaXZhdGUgRWl0aGVyPE9wZXJhdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlT3BlcmF0aW9uRnJvbVBhcmVudE5vZGUoT3BlcmF0aW9uIG9wZXJhdGlvbiwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHsKKwkJLy8gT3BlcmF0aW9uIG5ld09wZXJhdGlvbiA9IG51bGw7CisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHJlc291cmNlSWQpOworCQlFaXRoZXI8SW50ZXJmYWNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmVudEludGVyZmFjZVN0YXR1cyA9IGZpbmRJbnRlcmZhY2VPblBhcmVudE5vZGUocmVzb3VyY2VJZCwKKwkJCQlpbnRlcmZhY2VOYW1lKTsKKwkJaWYgKHBhcmVudEludGVyZmFjZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiSW50ZXJmYWNlIHt9IG5vdCBleGlzdCIsIGludGVyZmFjZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlcgorCQkJCQkucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhwYXJlbnRJbnRlcmZhY2VTdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKworCQlJbnRlcmZhY2VEYXRhIGludGVyZmFjZURhdGEgPSBwYXJlbnRJbnRlcmZhY2VTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCUludGVyZmFjZURhdGFEZWZpbml0aW9uIGludERhdGFEZWZpbml0aW9uID0gaW50ZXJmYWNlRGF0YS5nZXRJbnRlcmZhY2VEYXRhRGVmaW5pdGlvbigpOworCQlJbnRlcmZhY2VEYXRhRGVmaW5pdGlvbiBuZXdJbnRlcmZhY2VJbmZvID0gbmV3IEludGVyZmFjZURhdGFEZWZpbml0aW9uKGludERhdGFEZWZpbml0aW9uKTsKKworCQlTdHJpbmcgaW50ZXJmYWNlTmFtZVNwbGl0dGVkID0gZ2V0U2hvcnRJbnRlcmZhY2VOYW1lKGludERhdGFEZWZpbml0aW9uKTsKKworCQluZXdJbnRlcmZhY2VJbmZvLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZFByb3BlcnR5VW5pcXVlSWQocmVzb3VyY2VJZCwgaW50ZXJmYWNlTmFtZVNwbGl0dGVkKSk7CisJCUludGVyZmFjZURhdGEgdXBkYXRlZEludGVyZmFjZURhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YShuZXdJbnRlcmZhY2VJbmZvKTsKKwkJRWl0aGVyPEludGVyZmFjZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVTdGF0dXMgPSBjcmVhdGVJbnRlcmZhY2VOb2RlQW5kUmVsYXRpb24oaW50ZXJmYWNlTmFtZSwKKwkJCQlyZXNvdXJjZUlkLCB1cGRhdGVkSW50ZXJmYWNlRGF0YSwgcmVzb3VyY2VEYXRhKTsKKwkJaWYgKGNyZWF0ZVN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2Ugbm9kZSB7fSBvbiByZXNvdXJjZSB7fSIsIGludGVyZmFjZU5hbWUsIHJlc291cmNlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNyZWF0ZVN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCisJCUludGVyZmFjZURhdGEgbmV3SW50ZXJmYWNlTm9kZSA9IGNyZWF0ZVN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24obmV3SW50ZXJmYWNlTm9kZSwKKwkJCQlpbnRlcmZhY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBudWxsKTsKKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgaW50ZXJmYWNlIHt9IHRvIGludGVyZmFjZSB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IiwgaW50ZXJmYWNlRGF0YS5nZXRVbmlxdWVJZCgpLCBuZXdJbnRlcmZhY2VOb2RlLmdldFVuaXF1ZUlkKCksIG9wZXJhdGlvblN0YXR1cyk7CisKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhvcGVyYXRpb25TdGF0dXMpKTsKKwkJfQorCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gb3BlcmF0aW9uUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkcmVuTm9kZXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwKKwkJCQkJCShTdHJpbmcpIGludGVyZmFjZURhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLklOVEVSRkFDRV9PUEVSQVRJT04sCisJCQkJCQlOb2RlVHlwZUVudW0uSW50ZXJmYWNlT3BlcmF0aW9uLCBPcGVyYXRpb25EYXRhLmNsYXNzKTsKKwkJaWYgKG9wZXJhdGlvblJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgb3BlcmF0aW9uIHt9IG9uIGludGVyZmFjZSB7fSIsIG9wZXJhdGlvbk5hbWUsIGludGVyZmFjZU5hbWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKG9wZXJhdGlvblJlcy5yaWdodCgpLnZhbHVlKCkpKTsKKworCQl9IGVsc2UgeworCQkJTGlzdDxJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4+IG9wZXJhdGlvbnMgPSBvcGVyYXRpb25SZXMubGVmdCgpLnZhbHVlKCk7CisJCQlmb3IgKEltbXV0YWJsZVBhaXI8T3BlcmF0aW9uRGF0YSwgR3JhcGhFZGdlPiBvcGVyYXRpb25QYWlyRWRnZSA6IG9wZXJhdGlvbnMpIHsKKwkJCQlHcmFwaEVkZ2Ugb3BFZGdlID0gb3BlcmF0aW9uUGFpckVkZ2UuZ2V0UmlnaHQoKTsKKwkJCQlPcGVyYXRpb25EYXRhIG9wRGF0YSA9IG9wZXJhdGlvblBhaXJFZGdlLmdldExlZnQoKTsKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG9wRWRnZVByb3AgPSBvcEVkZ2UuZ2V0UHJvcGVydGllcygpOworCQkJCWlmIChvcEVkZ2VQcm9wLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkuZXF1YWxzKG9wZXJhdGlvbk5hbWUpKSB7CisKKwkJCQkJcmV0dXJuIGNvcHlBbmRDcmVhdGVOZXdPcGVyYXRpb24ob3BlcmF0aW9uLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25OYW1lLCBudWxsLCAvLyBjaGFuZ2VkCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZnJvbQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5ld09wZXJhdGlvbgorCQkJCQkJCW5ld0ludGVyZmFjZU5vZGUsIG9wZXJhdGlvblJlcywgb3BEYXRhKTsKKworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBpZihuZXdPcGVyYXRpb24gPT0gbnVsbCkKKwkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkvLyBlbHNlCisJCS8vIHJldHVybiBFaXRoZXIubGVmdChuZXdPcGVyYXRpb24pOworCX0KKworCXByaXZhdGUgRWl0aGVyPEludGVyZmFjZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kSW50ZXJmYWNlT25QYXJlbnROb2RlKFN0cmluZyByZXNvdXJjZUlkLAorCQkJU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmVudFJlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCByZXNvdXJjZUlkLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLAorCQkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChwYXJlbnRSZXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImludGVyZmFjZSB7fSBub3QgZm91bmQiLCBpbnRlcmZhY2VOYW1lKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocGFyZW50UmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJSW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPiBwYXJlbk5vZGUgPSBwYXJlbnRSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxJbnRlcmZhY2VEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLAorCQkJCQkJcGFyZW5Ob2RlLmdldEtleSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuSU5URVJGQUNFLAorCQkJCQkJTm9kZVR5cGVFbnVtLkludGVyZmFjZSwgSW50ZXJmYWNlRGF0YS5jbGFzcyk7CisJCWlmIChjaGlsZHJlbk5vZGVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGZpbmRJbnRlcmZhY2VPblBhcmVudE5vZGUocGFyZW5Ob2RlLmdldEtleSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLAorCQkJCQlpbnRlcmZhY2VOYW1lKTsKKworCQl9IGVsc2UgeworCQkJZm9yIChJbW11dGFibGVQYWlyPEludGVyZmFjZURhdGEsIEdyYXBoRWRnZT4gaW50ZXJmYWNlRGF0YU5vZGUgOiBjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpKSB7CisKKwkJCQlHcmFwaEVkZ2UgaW50ZXJmYWNlRWRnZSA9IGludGVyZmFjZURhdGFOb2RlLmdldFJpZ2h0KCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBpbnRlcmZhY2VFZGdlUHJvcCA9IGludGVyZmFjZUVkZ2UuZ2V0UHJvcGVydGllcygpOworCisJCQkJaWYgKGludGVyZmFjZUVkZ2VQcm9wLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSkuZXF1YWxzKGludGVyZmFjZU5hbWUpKSB7CisJCQkJCXJldHVybiBFaXRoZXIubGVmdChpbnRlcmZhY2VEYXRhTm9kZS5nZXRLZXkoKSk7CisJCQkJfQorCisJCQl9CisJCQlyZXR1cm4gZmluZEludGVyZmFjZU9uUGFyZW50Tm9kZShwYXJlbk5vZGUuZ2V0S2V5KCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCQkJCWludGVyZmFjZU5hbWUpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUludGVyZmFjZU9uUmVzb3VyY2UoSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmYsCisJCQlTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGludGVyZmFjZU5hbWUsIGJvb2xlYW4gZmFpbElmRXhpc3QsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxJbnRlcmZhY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gYWRkSW50ZXJmYWNlVG9HcmFwaChpbnRlcmYsIGludGVyZmFjZU5hbWUsIHJlc291cmNlSWQpOworCisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBpbnRlcmZhY2Uge30gdG8gcmVzb3VyY2Uge30iLCBpbnRlcmZhY2VOYW1lLCByZXNvdXJjZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0gZWxzZSB7CisKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQkJSW50ZXJmYWNlRGF0YSBpbnRlcmZhY2VEYXRhID0gc3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZlJlc3VsdCA9IGNvbnZlcnRJbnRlcmZhY2VEYXRhVG9JbnRlcmZhY2VEZWZpbml0aW9uKGludGVyZmFjZURhdGEpOworCQkJTWFwPFN0cmluZywgT3BlcmF0aW9uPiBvcGVyYXRpb25zID0gaW50ZXJmLmdldE9wZXJhdGlvbnMoKTsKKwkJCWlmIChvcGVyYXRpb25zICE9IG51bGwgJiYgIW9wZXJhdGlvbnMuaXNFbXB0eSgpKSB7CisJCQkJU2V0PFN0cmluZz4gb3BOYW1lcyA9IG9wZXJhdGlvbnMua2V5U2V0KCk7CisJCQkJTWFwPFN0cmluZywgT3BlcmF0aW9uPiBuZXdPcGVyYXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPcGVyYXRpb24+KCk7CisJCQkJZm9yIChTdHJpbmcgb3BlcmF0aW9uTmFtZSA6IG9wTmFtZXMpIHsKKworCQkJCQlPcGVyYXRpb24gb3AgPSBvcGVyYXRpb25zLmdldChvcGVyYXRpb25OYW1lKTsKKwkJCQkJRWl0aGVyPE9wZXJhdGlvbkRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvcFN0YXR1cyA9IGFkZE9wZXJhdGlvblRvR3JhcGgoaW50ZXJmLCBvcGVyYXRpb25OYW1lLAorCQkJCQkJCW9wLCBpbnRlcmZhY2VEYXRhKTsKKwkJCQkJaWYgKHN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIG9wZXJhdGlvbiB7fSB0byBpbnRlcmZhY2Uge30iLCBvcGVyYXRpb25OYW1lLCBpbnRlcmZhY2VOYW1lKTsKKwkJCQkJfSBlbHNlIGlmIChzdGF0dXMuaXNMZWZ0KCkpIHsKKwkJCQkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCQkJfQorCQkJCQkJT3BlcmF0aW9uRGF0YSBvcERhdGEgPSBvcFN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJCU9wZXJhdGlvbiBuZXdPcGVyYXRpb24gPSB0aGlzLmNvbnZlcnRPcGVyYXRpb25EYXRhVG9PcGVyYXRpb24ob3BEYXRhKTsKKworCQkJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydCA9IG9wLmdldEltcGxlbWVudGF0aW9uKCk7CisJCQkJCQlpZiAoYXJ0ICE9IG51bGwpIHsKKwkJCQkJCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhcnRSZXMgPSBhcnRpZmFjdE9wZXJhdGlvbgorCQkJCQkJCQkJLmFkZEFyaWZhY3RUb0NvbXBvbmVudChhcnQsIChTdHJpbmcpIG9wRGF0YS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCQkJCQlOb2RlVHlwZUVudW0uSW50ZXJmYWNlT3BlcmF0aW9uLCBmYWlsSWZFeGlzdCwgdHJ1ZSk7CisJCQkJCQkJaWYgKGFydFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBhcnRpZmFjdCB7fSB0byBpbnRlcmZhY2Uge30iLCBvcGVyYXRpb25OYW1lLCBpbnRlcmZhY2VOYW1lKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQluZXdPcGVyYXRpb24uc2V0SW1wbGVtZW50YXRpb24oYXJ0UmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJCQl9CisJCQkJCQkJbmV3T3BlcmF0aW9ucy5wdXQob3BlcmF0aW9uTmFtZSwgbmV3T3BlcmF0aW9uKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpbnRlcmZhY2VEZWZSZXN1bHQuc2V0T3BlcmF0aW9ucyhuZXdPcGVyYXRpb25zKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiVGhlIHJldHVybmVkIEludGVyZmFjZURlZmludGlvbiBpcyB7fSIsIGludGVyZmFjZURlZlJlc3VsdCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW50ZXJmYWNlRGVmUmVzdWx0KTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgY3JlYXRlSW50ZXJmYWNlT25SZXNvdXJjZShJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZiwgU3RyaW5nIHJlc291cmNlSWQsCisJCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSwgYm9vbGVhbiBmYWlsSWZFeGlzdCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCkgeworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGludGVyZmFjZVJlc3VsdCA9IGFkZEludGVyZmFjZVRvR3JhcGgoaW50ZXJmLCBpbnRlcmZhY2VOYW1lLAorCQkJCXJlc291cmNlSWQsIG1ldGFkYXRhVmVydGV4KTsKKworCQlpZiAoaW50ZXJmYWNlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0KKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBpbnRlcmZhY2Uge30gdG8gcmVzb3VyY2Uge30iLCBpbnRlcmZhY2VOYW1lLCByZXNvdXJjZUlkKTsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGludGVyZmFjZVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCVRpdGFuVmVydGV4IGludGVyZmFjZVZlcnRleCA9IGludGVyZmFjZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkJLy8gSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZSZXN1bHQgPQorCQkJLy8gY29udmVydEludGVyZmFjZURhdGFUb0ludGVyZmFjZURlZmluaXRpb24oaW50ZXJmYWNlRGF0YSk7CisJCQlNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBpbnRlcmYuZ2V0T3BlcmF0aW9ucygpOworCQkJaWYgKG9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhb3BlcmF0aW9ucy5pc0VtcHR5KCkpIHsKKwkJCQlTZXQ8U3RyaW5nPiBvcE5hbWVzID0gb3BlcmF0aW9ucy5rZXlTZXQoKTsKKwkJCQlmb3IgKFN0cmluZyBvcGVyYXRpb25OYW1lIDogb3BOYW1lcykgeworCisJCQkJCU9wZXJhdGlvbiBvcCA9IG9wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbk5hbWUpOworCQkJCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvcGVyYXRpb25SZXN1bHQgPSBhZGRPcGVyYXRpb25Ub0dyYXBoKGludGVyZiwKKwkJCQkJCQlvcGVyYXRpb25OYW1lLCBvcCwgaW50ZXJmYWNlVmVydGV4KTsKKwkJCQkJaWYgKG9wZXJhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJCQl9CisJCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgb3BlcmF0aW9uIHt9IHRvIGludGVyZmFjZSB7fSIsIG9wZXJhdGlvbk5hbWUsIGludGVyZmFjZU5hbWUpOworCQkJCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMob3BlcmF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQkJCX0KKwkJCQkJCVRpdGFuVmVydGV4IG9wZXJhdGlvblZlcnRleCA9IG9wZXJhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydCA9IG9wLmdldEltcGxlbWVudGF0aW9uKCk7CisJCQkJCQlpZiAoYXJ0ICE9IG51bGwpIHsKKwkJCQkJCQlTdHJpbmcgb3BJZCA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShvcGVyYXRpb25WZXJ0ZXgsCisJCQkJCQkJCQlHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFydFJlcyA9IGFydGlmYWN0T3BlcmF0aW9uLmFkZEFyaWZhY3RUb0NvbXBvbmVudChhcnQsIG9wSWQsCisJCQkJCQkJCQlOb2RlVHlwZUVudW0uSW50ZXJmYWNlT3BlcmF0aW9uLCBmYWlsSWZFeGlzdCwgb3BlcmF0aW9uVmVydGV4KTsKKwkJCQkJCQlpZiAoIWFydFJlcy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQkJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCQkJCQl9CisJCQkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBhcnRpZmFjdCB7fSB0byBpbnRlcmZhY2Uge30iLCBvcGVyYXRpb25OYW1lLCBpbnRlcmZhY2VOYW1lKTsKKwkJCQkJCQkJcmV0dXJuIGFydFJlczsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxPcGVyYXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUludGVyZmFjZU9wZXJhdGlvbihTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGludGVyZmFjZU5hbWUsCisJCQlTdHJpbmcgb3BlcmF0aW9uSWQpIHsKKwkJcmV0dXJuIGRlbGV0ZUludGVyZmFjZU9wZXJhdGlvbihyZXNvdXJjZUlkLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25JZCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVJbnRlcmZhY2VPcGVyYXRpb24oU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VOYW1lLAorCQkJU3RyaW5nIG9wZXJhdGlvbklkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8T3BlcmF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gcmVtb3ZlT3BlcmF0aW9uT25HcmFwaChyZXNvdXJjZUlkLCBpbnRlcmZhY2VOYW1lLCBvcGVyYXRpb25JZCk7CisJCWlmIChzdGF0dXMuaXNSaWdodCgpKSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJfQorCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIG9wZXJhdGlvbiB7fSBvZiBpbnRlcmZhY2Uge30gcmVzb3VyY2Uge30iLCBvcGVyYXRpb25JZCwgaW50ZXJmYWNlTmFtZSwgcmVzb3VyY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9IGVsc2UgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisKKwkJCU9wZXJhdGlvbiBvcERlZlJlc3VsdCA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsvLyBjb252ZXJ0T3BlcmF0aW9uRGF0YVRvT3BlcmF0aW9uKG9wZXJhdGlvbkRhdGEpOworCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgT3BlcmF0aW9uIGlzIHt9Iiwgb3BEZWZSZXN1bHQpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG9wRGVmUmVzdWx0KTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVJbnRlcmZhY2VPZlJlc291cmNlT25HcmFwaChTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCUludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBpbnRlcmZhY2VEZWYuZ2V0T3BlcmF0aW9ucygpOworCQlTdHJpbmcgaW50ZXJmYWNlTmFtZVNwbGl0dGVkID0gZ2V0U2hvcnRJbnRlcmZhY2VOYW1lKGludGVyZmFjZURlZik7CisJCWlmIChvcGVyYXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBPcGVyYXRpb24+IGVudHJ5IDogb3BlcmF0aW9ucy5lbnRyeVNldCgpKSB7CisKKwkJCQlPcGVyYXRpb24gb3AgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCUVpdGhlcjxPcGVyYXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlbW92ZU9wZXJhdGlvbkZyb21SZXNvdXJjZSA9IGRlbGV0ZUludGVyZmFjZU9wZXJhdGlvbigKKwkJCQkJCXJlc291cmNlSWQsIGludGVyZmFjZU5hbWVTcGxpdHRlZCwgb3AuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCQkJaWYgKHJlbW92ZU9wZXJhdGlvbkZyb21SZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCQl9CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSBvcGVyYXRpb24ge30gb2YgaW50ZXJmYWNlIHt9IHJlc291cmNlIHt9Iiwgb3AuZ2V0VW5pcXVlSWQoKSwgaW50ZXJmYWNlRGVmLmdldFR5cGUoKSwgcmVzb3VyY2VJZCk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVtb3ZlT3BlcmF0aW9uRnJvbVJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChpbnRlcmZhY2VEZWYpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8T3BlcmF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVtb3ZlT3BlcmF0aW9uT25HcmFwaChTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGludGVyZmFjZU5hbWUsCisJCQlTdHJpbmcgb3BlcmF0aW9uSWQpIHsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgZGVsZXRpbmcgb3BlcmF0aW9uIGZyb20gZ3JhcGgge30iLCBvcGVyYXRpb25JZCk7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxJbnRlcmZhY2VEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCByZXNvdXJjZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLklOVEVSRkFDRSwgTm9kZVR5cGVFbnVtLkludGVyZmFjZSwgSW50ZXJmYWNlRGF0YS5jbGFzcyk7CisKKwkJaWYgKGNoaWxkcmVuTm9kZXMuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIk5vdCBmb3VuZCBpbnRlcmZhY2Uge30iLCBpbnRlcmZhY2VOYW1lKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCU9wZXJhdGlvbkRhdGEgb3BEYXRhID0gbnVsbDsKKwkJZm9yIChJbW11dGFibGVQYWlyPEludGVyZmFjZURhdGEsIEdyYXBoRWRnZT4gaW50ZXJmYWNlRGF0YU5vZGUgOiBjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpKSB7CisKKwkJCUdyYXBoRWRnZSBpbnRlcmZhY2VFZGdlID0gaW50ZXJmYWNlRGF0YU5vZGUuZ2V0UmlnaHQoKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gaW50ZXJmYWNlRWRnZVByb3AgPSBpbnRlcmZhY2VFZGdlLmdldFByb3BlcnRpZXMoKTsKKworCQkJU3RyaW5nIGludGVyZmFjZVNwbGl0ZWROYW1lID0gc3BsaXRUeXBlKGludGVyZmFjZU5hbWUpOworCisJCQlpZiAoaW50ZXJmYWNlRWRnZVByb3AuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKS5lcXVhbHMoaW50ZXJmYWNlU3BsaXRlZE5hbWUpKSB7CisJCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxPcGVyYXRpb25EYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG9wZXJhdGlvblJlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkJLmdldENoaWxkcmVuTm9kZXMoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwKKwkJCQkJCQkJKFN0cmluZykgaW50ZXJmYWNlRGF0YU5vZGUuZ2V0TGVmdCgpLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5JTlRFUkZBQ0VfT1BFUkFUSU9OLAorCQkJCQkJCQlOb2RlVHlwZUVudW0uSW50ZXJmYWNlT3BlcmF0aW9uLCBPcGVyYXRpb25EYXRhLmNsYXNzKTsKKwkJCQlpZiAob3BlcmF0aW9uUmVzLmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIG9wZXJhdGlvbiB7fSIsIG9wZXJhdGlvbklkLCBpbnRlcmZhY2VOYW1lKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25SZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQkJTGlzdDxJbW11dGFibGVQYWlyPE9wZXJhdGlvbkRhdGEsIEdyYXBoRWRnZT4+IG9wZXJhdGlvbnMgPSBvcGVyYXRpb25SZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlmb3IgKEltbXV0YWJsZVBhaXI8T3BlcmF0aW9uRGF0YSwgR3JhcGhFZGdlPiBvcGVyYXRpb25QYWlyRWRnZSA6IG9wZXJhdGlvbnMpIHsKKworCQkJCQlvcERhdGEgPSBvcGVyYXRpb25QYWlyRWRnZS5nZXRMZWZ0KCk7CisJCQkJCWlmIChvcERhdGEuZ2V0VW5pcXVlSWQoKS5lcXVhbHMob3BlcmF0aW9uSWQpKSB7CisKKwkJCQkJCUVpdGhlcjxJbW11dGFibGVQYWlyPEFydGlmYWN0RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0UmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkJCS5nZXRDaGlsZChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLAorCQkJCQkJCQkJCShTdHJpbmcpIG9wZXJhdGlvblBhaXJFZGdlLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCQkJCUdyYXBoRWRnZUxhYmVscy5BUlRJRkFDVF9SRUYsIE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJCQkJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFyU3RhdHVzID0gbnVsbDsKKwkJCQkJCWlmIChhcnRpZmFjdFJlcy5pc0xlZnQoKSkgeworCQkJCQkJCUFydGlmYWN0RGF0YSBhckRhdGEgPSBhcnRpZmFjdFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRLZXkoKTsKKwkJCQkJCQlhclN0YXR1cyA9IGFydGlmYWN0T3BlcmF0aW9uLnJlbW92ZUFyaWZhY3RGcm9tUmVzb3VyY2UoCisJCQkJCQkJCQkoU3RyaW5nKSBvcGVyYXRpb25QYWlyRWRnZS5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgKFN0cmluZykgYXJEYXRhLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCQlOb2RlVHlwZUVudW0uSW50ZXJmYWNlT3BlcmF0aW9uLCB0cnVlLCB0cnVlKTsKKwkJCQkJCQlpZiAoYXJTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSBhcnRpZmFjdCB7fSIsIGFyRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlFaXRoZXI8T3BlcmF0aW9uRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU9wU3RhdHVzID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUoCisJCQkJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5JbnRlcmZhY2VPcGVyYXRpb24pLCBvcERhdGEuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCQkJT3BlcmF0aW9uRGF0YS5jbGFzcyk7CisJCQkJCQlpZiAoZGVsZXRlT3BTdGF0dXMuaXNSaWdodCgpKSB7CisJCQkJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIG9wZXJhdGlvbiB7fSIsIG9wRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJCQkJfQorCQkJCQkJb3BEYXRhID0gZGVsZXRlT3BTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQkJCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihvcERhdGEuZ2V0T3BlcmF0aW9uRGF0YURlZmluaXRpb24oKSk7CisJCQkJCQlpZiAoYXJTdGF0dXMgIT0gbnVsbCkgeworCQkJCQkJCW9wZXJhdGlvbi5zZXRJbXBsZW1lbnRhdGlvbihhclN0YXR1cy5sZWZ0KCkudmFsdWUoKSk7CisJCQkJCQl9CisJCQkJCQlpZiAob3BlcmF0aW9ucy5zaXplKCkgPD0gMSkgeworCQkJCQkJCUVpdGhlcjxJbnRlcmZhY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlSW50ZXJmYWNlU3RhdHVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkJCQkuZGVsZXRlTm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uSW50ZXJmYWNlKSwKKwkJCQkJCQkJCQkJaW50ZXJmYWNlRGF0YU5vZGUubGVmdC5nZXRVbmlxdWVJZCgpLCBJbnRlcmZhY2VEYXRhLmNsYXNzKTsKKwkJCQkJCQlpZiAoZGVsZXRlSW50ZXJmYWNlU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCQkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBkZWxldGUgaW50ZXJmYWNlIHt9IiwgaW50ZXJmYWNlRGF0YU5vZGUubGVmdC5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEKTsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG9wZXJhdGlvbik7CisKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWxvZy5kZWJ1ZygiTm90IGZvdW5kIG9wZXJhdGlvbiB7fSIsIGludGVyZmFjZU5hbWUpOworCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkvLyB9CisKKwl9CisKKwlwcml2YXRlIFN0cmluZyBzcGxpdFR5cGUoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKwkJU3RyaW5nIGludGVyZmFjZVNwbGl0dGVkTmFtZTsKKwkJU3RyaW5nW10gcGFja2FnZU5hbWUgPSBpbnRlcmZhY2VOYW1lLnNwbGl0KCJcXC4iKTsKKworCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoID09IDApIHsKKwkJCWludGVyZmFjZVNwbGl0dGVkTmFtZSA9IGludGVyZmFjZU5hbWU7CisJCX0gZWxzZSB7CisJCQlpbnRlcmZhY2VTcGxpdHRlZE5hbWUgPSBwYWNrYWdlTmFtZVtwYWNrYWdlTmFtZS5sZW5ndGggLSAxXTsKKwkJfQorCisJCXJldHVybiBpbnRlcmZhY2VTcGxpdHRlZE5hbWUudG9Mb3dlckNhc2UoKTsKKwl9CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHRpdGFuR2VuZXJpY0RhbworCSAqLworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0T3BlcmF0aW9uKEFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uKSB7CisJCXRoaXMuYXJ0aWZhY3RPcGVyYXRpb24gPSBhcnRpZmFjdE9wZXJhdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUludGVyZmFjZVR5cGUoSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmYsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisKKwkJCUludGVyZmFjZURhdGEgaW50ZXJmYWNlRGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKGludGVyZik7CisJCQlpbnRlcmYuc2V0VW5pcXVlSWQoaW50ZXJmLmdldFR5cGUoKS50b0xvd2VyQ2FzZSgpKTsKKworCQkJRWl0aGVyPEludGVyZmFjZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBleGlzdEludGVyZmFjZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0Tm9kZShpbnRlcmZhY2VEYXRhLmdldFVuaXF1ZUlkS2V5KCksIGludGVyZmFjZURhdGEuZ2V0VW5pcXVlSWQoKSwgSW50ZXJmYWNlRGF0YS5jbGFzcyk7CisKKwkJCWlmIChleGlzdEludGVyZmFjZS5pc0xlZnQoKSkgeworCQkJCS8vIGFscmVhZHkgZXhpc3QKKwkJCQlsb2cuZGVidWcoIkludGVyZmFjZSB0eXBlIGFscmVhZHkgZXhpc3Qge30iLCBpbnRlcmZhY2VEYXRhKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5FTlRJVFlfQUxSRUFEWV9FWElTVFMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBpbnRlcmZhY2UgdHlwZSB0byBncmFwaCB7fSIsIGludGVyZmFjZURhdGEpOworCQkJRWl0aGVyPEludGVyZmFjZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoaW50ZXJmYWNlRGF0YSwKKwkJCQkJSW50ZXJmYWNlRGF0YS5jbGFzcyk7CisJCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB0eXBlIHRvIGdyYXBoIHt9IiwgaW50ZXJmYWNlRGF0YSk7CisKKwkJCWlmIChjcmVhdGVOb2RlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBpbnRlcmZhY2Uge30gdG8gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIGludGVyZi5nZXRUeXBlKCksIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMob3BlcmF0aW9uU3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZSZXN1bHQgPSBjb252ZXJ0SW50ZXJmYWNlRGF0YVRvSW50ZXJmYWNlRGVmaW5pdGlvbihpbnRlcmZhY2VEYXRhKTsKKwkJCU1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IGludGVyZi5nZXRPcGVyYXRpb25zKCk7CisKKwkJCWlmIChvcGVyYXRpb25zICE9IG51bGwgJiYgIW9wZXJhdGlvbnMuaXNFbXB0eSgpKSB7CisJCQkJTWFwPFN0cmluZywgT3BlcmF0aW9uPiBuZXdPcGVyYXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPcGVyYXRpb24+KCk7CisKKwkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9uIDogb3BlcmF0aW9ucy5lbnRyeVNldCgpKSB7CisJCQkJCUVpdGhlcjxPcGVyYXRpb25EYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gb3BTdGF0dXMgPSBhZGRPcGVyYXRpb25Ub0dyYXBoKGludGVyZiwKKwkJCQkJCQlvcGVyYXRpb24uZ2V0S2V5KCksIG9wZXJhdGlvbi5nZXRWYWx1ZSgpLCBpbnRlcmZhY2VEYXRhKTsKKwkJCQkJaWYgKG9wU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgb3BlcmF0aW9uIHt9IHRvIGludGVyZmFjZSB7fSIsIG9wZXJhdGlvbi5nZXRLZXkoKSwgaW50ZXJmLmdldFR5cGUoKSk7CisKKwkJCQkJCXJlc3VsdCA9IEVpdGhlcgorCQkJCQkJCQkucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhvcFN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlPcGVyYXRpb25EYXRhIG9wRGF0YSA9IG9wU3RhdHVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQkJT3BlcmF0aW9uIG5ld09wZXJhdGlvbiA9IHRoaXMuY29udmVydE9wZXJhdGlvbkRhdGFUb09wZXJhdGlvbihvcERhdGEpOworCQkJCQkJbmV3T3BlcmF0aW9ucy5wdXQob3BlcmF0aW9uLmdldEtleSgpLCBuZXdPcGVyYXRpb24pOworCQkJCQl9CisJCQkJfQorCQkJCWludGVyZmFjZURlZlJlc3VsdC5zZXRPcGVyYXRpb25zKG5ld09wZXJhdGlvbnMpOworCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoaW50ZXJmYWNlRGVmUmVzdWx0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbnRlcmZhY2VEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZUlkKSB7CisJCUVpdGhlcjxJbnRlcmZhY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkludGVyZmFjZSksIGludGVyZmFjZUlkLCBJbnRlcmZhY2VEYXRhLmNsYXNzKTsKKwkJaWYgKGdldFJlc3VsdC5pc0xlZnQoKSkgeworCQkJSW50ZXJmYWNlRGF0YSBpbnRlcmZhY2VEYXRhID0gZ2V0UmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnZlcnRJbnRlcmZhY2VEYXRhVG9JbnRlcmZhY2VEZWZpbml0aW9uKGludGVyZmFjZURhdGEpKTsKKwkJfSBlbHNlIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHRpdGFuU3RhdHVzID0gZ2V0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiTm9kZSB3aXRoIGlkIHt9IHdhcyBub3QgZm91bmQgaW4gdGhlIGdyYXBoLiBTdGF0dXM6IHt9IiwgaW50ZXJmYWNlSWQsIHRpdGFuU3RhdHVzKTsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlcgorCQkJCQkuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHRpdGFuU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZU9wZXJhdGlvblN0YXR1cyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVJbnRlcmZhY2VUb05vZGUoR3JhcGhOb2RlIG5vZGUsIEludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmaW5pdGlvbiwKKwkJCVRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4KSB7CisKKwkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW50ZXJmYWNlRGF0YSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5JbnRlcmZhY2UpLCBpbnRlcmZhY2VEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQlpZiAoaW50ZXJmYWNlRGF0YS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGludGVyZmFjZURhdGEucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gZ2V0U2hvcnRJbnRlcmZhY2VOYW1lKGludGVyZmFjZURlZmluaXRpb24pOworCisJCXByb3BlcnRpZXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBpbnRlcmZhY2VOYW1lLnRvTG93ZXJDYXNlKCkpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKG1ldGFkYXRhVmVydGV4LCBpbnRlcmZhY2VEYXRhLmxlZnQoKS52YWx1ZSgpLAorCQkJCUdyYXBoRWRnZUxhYmVscy5JTlRFUkZBQ0UsIHByb3BlcnRpZXMpOworCQlpZiAoIWNyZWF0ZVJlbGF0aW9uLmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNyZWF0ZVJlbGF0aW9uKTsKKwkJfQorCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRJbnRlcmZhY2VOYW1lKEludGVyZmFjZURhdGFEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24pIHsKKwkJU3RyaW5nW10gcGFja2FnZU5hbWUgPSBpbnRlcmZhY2VEZWZpbml0aW9uLmdldFR5cGUoKS5zcGxpdCgiXFwuIik7CisJCVN0cmluZyBpbnRlcmZhY2VOYW1lOworCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoID09IDApIHsKKwkJCWludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VEZWZpbml0aW9uLmdldFR5cGUoKTsKKwkJfSBlbHNlIHsKKwkJCWludGVyZmFjZU5hbWUgPSBwYWNrYWdlTmFtZVtwYWNrYWdlTmFtZS5sZW5ndGggLSAxXTsKKwkJfQorCQlyZXR1cm4gaW50ZXJmYWNlTmFtZS50b0xvd2VyQ2FzZSgpOworCX0KKworCS8qKiAKKwkgKiAKKwkgKi8KKwlwdWJsaWMgRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZUludGVyZmFjZVR5cGUoSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmYpIHsKKwkJcmV0dXJuIGNyZWF0ZUludGVyZmFjZVR5cGUoaW50ZXJmLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxPcGVyYXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFNwZWNpZmljT3BlcmF0aW9uKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlVHlwZSwKKwkJCVN0cmluZyBvcGVyYXRpb25OYW1lKSB7CisJCWxvZy50cmFjZSgiR2V0dGluZyBvcGVyYXRpb24sIHJlc291cmNlSWQge30sIGludGVyZmFjZVR5cGUge30sIG9wZXJhdGlvbk5hbWUge30iLCByZXNvdXJjZUlkLCBpbnRlcmZhY2VUeXBlLAorCQkJCW9wZXJhdGlvbk5hbWUpOworCQlFaXRoZXI8TWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFsbEludGVyZmFjZXNPZlJlc291cmNlID0gZ2V0QWxsSW50ZXJmYWNlc09mUmVzb3VyY2UoCisJCQkJcmVzb3VyY2VJZCwgZmFsc2UpOworCQlpZiAoYWxsSW50ZXJmYWNlc09mUmVzb3VyY2UuaXNSaWdodCgpIHx8IGFsbEludGVyZmFjZXNPZlJlc291cmNlLmxlZnQoKS52YWx1ZSgpID09IG51bGwKKwkJCQl8fCBhbGxJbnRlcmZhY2VzT2ZSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKS5nZXQoaW50ZXJmYWNlVHlwZSkgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmaW5kIGludGVyZmFjZSBkZWZpbml0aW9uIG9mIHR5cGUge30gZm9yIHJlc291cmNlIGlkIHt9IiwgaW50ZXJmYWNlVHlwZSwgcmVzb3VyY2VJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFsbEludGVyZmFjZXNPZlJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZpbml0aW9uID0gYWxsSW50ZXJmYWNlc09mUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0KGludGVyZmFjZVR5cGUpOworCQlNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBpbnRlcmZhY2VEZWZpbml0aW9uLmdldE9wZXJhdGlvbnMoKTsKKwkJaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCB8fCBvcGVyYXRpb25zLmdldChvcGVyYXRpb25OYW1lKSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZpbmQgb3BlcmF0aW9uIGZvciBvcGVyYXRpb24gbmFtZSB7fSwgaW50ZXJmYWNlIHR5cGUge30iLCBvcGVyYXRpb25OYW1lLCBpbnRlcmZhY2VUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQob3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uTmFtZSkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZUludGVyZmFjZUZyb21Ob2RlKEdyYXBoTm9kZSBub2RlLAorCQkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZpbml0aW9uKSB7CisKKwkJRWl0aGVyPEludGVyZmFjZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbnRlcmZhY2VEYXRhID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoCisJCQkJVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkludGVyZmFjZSksIGludGVyZmFjZURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwKKwkJCQlJbnRlcmZhY2VEYXRhLmNsYXNzKTsKKwkJaWYgKGludGVyZmFjZURhdGEuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZpbmQgaW50ZXJmYWNlIHt9IiwgaW50ZXJmYWNlRGVmaW5pdGlvbik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoaW50ZXJmYWNlRGF0YS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCisJCUludGVyZmFjZURhdGEgdmFsdWUgPSBpbnRlcmZhY2VEYXRhLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZVJlbGF0aW9uKG5vZGUsIHZhbHVlLAorCQkJCUdyYXBoRWRnZUxhYmVscy5JTlRFUkZBQ0UpOworCQlpZiAoZGVsZXRlUmVsYXRpb24uaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkNvdWxkbid0IGRpc3NvY2lhdGUgaW50ZXJmYWNlIGJldHdlZW4gbm9kZSB7fSB0byBub2RlIHt9LiBTdGF0dXMgaXMge30iLCBub2RlLmdldFVuaXF1ZUlkKCksCisJCQkJCXZhbHVlLmdldFVuaXF1ZUlkKCksIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoaW50ZXJmYWNlRGVmaW5pdGlvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0xpZmVjeWNsZU9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9MaWZlY3ljbGVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM5NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9MaWZlY3ljbGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDExNDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5SZWxhdGlvbkVuZFBvaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGlzdHJpYnV0aW9uU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklMaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuU2VydmljZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgibGlmZWN5Y2xlLW9wZXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgTGlmZWN5Y2xlT3BlcmF0aW9uIGltcGxlbWVudHMgSUxpZmVjeWNsZU9wZXJhdGlvbiB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0RFTElNRVRFUiA9ICIuIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0RFTElNRVRFUl9SRUdFWFAgPSAiXFwuIjsKKworCXB1YmxpYyBMaWZlY3ljbGVPcGVyYXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpZmVjeWNsZU9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFNlcnZpY2VPcGVyYXRpb24gc2VydmljZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBQcm9kdWN0T3BlcmF0aW9uIHByb2R1Y3RPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbzsKKworCXB1YmxpYyBSZXNvdXJjZU9wZXJhdGlvbiBnZXRSZXNvdXJjZU9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHJlc291cmNlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlT3BlcmF0aW9uKFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uKSB7CisJCXRoaXMucmVzb3VyY2VPcGVyYXRpb24gPSByZXNvdXJjZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgU2VydmljZU9wZXJhdGlvbiBnZXRTZXJ2aWNlT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gc2VydmljZU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50T3BlcmF0aW9uIGdldENvbXBvbmVudE9wZXJhdGlvbihOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZSkgeworCQlpZiAoTm9kZVR5cGVFbnVtLlNlcnZpY2UuZXF1YWxzKGNvbXBvbmVudFR5cGUpKSB7CisJCQlyZXR1cm4gc2VydmljZU9wZXJhdGlvbjsKKwkJfSBlbHNlIGlmIChOb2RlVHlwZUVudW0uUmVzb3VyY2UuZXF1YWxzKGNvbXBvbmVudFR5cGUpKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VPcGVyYXRpb247CisJCX0gZWxzZSBpZiAoTm9kZVR5cGVFbnVtLlByb2R1Y3QuZXF1YWxzKGNvbXBvbmVudFR5cGUpKSB7CisJCQlyZXR1cm4gcHJvZHVjdE9wZXJhdGlvbjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlT3BlcmF0aW9uKFNlcnZpY2VPcGVyYXRpb24gc2VydmljZU9wZXJhdGlvbikgeworCQl0aGlzLnNlcnZpY2VPcGVyYXRpb24gPSBzZXJ2aWNlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBUaXRhbkdlbmVyaWNEYW8gZ2V0VGl0YW5HZW5lcmljRGFvKCkgeworCQlyZXR1cm4gdGl0YW5HZW5lcmljRGFvOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50T3duZXIoU3RyaW5nIHJlc291cmNlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJdHJ5IHsKKworCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8VXNlckRhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldFBhcmVudE5vZGUoCisJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgcmVzb3VyY2VJZCwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBOb2RlVHlwZUVudW0uVXNlciwKKwkJCQkJVXNlckRhdGEuY2xhc3MpOworCisJCQlpZiAocGFyZW50Tm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMocGFyZW50Tm9kZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0KKworCQkJSW1tdXRhYmxlUGFpcjxVc2VyRGF0YSwgR3JhcGhFZGdlPiB2YWx1ZSA9IHBhcmVudE5vZGUubGVmdCgpLnZhbHVlKCk7CisKKwkJCVVzZXIgb3duZXIgPSBuZXcgVXNlcih2YWx1ZS5sZWZ0KTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KG93bmVyKTsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNoZWNrb3V0Q29tcG9uZW50KE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCUNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgbW9kaWZpZXIsIFVzZXIgY3VycmVudE93bmVyLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCS8vIHVwZGF0ZSBvbGQgY29tcG9uZW50CisJCQlpZiAoIWNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKSkgeworCQkJCWNvbXBvbmVudC5zZXRIaWdoZXN0VmVyc2lvbihmYWxzZSk7CisJCQkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihub2RlVHlwZSk7CisJCQkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudCA9IGNvbXBvbmVudE9wZXJhdGlvbgorCQkJCQkJLnVwZGF0ZUNvbXBvbmVudChjb21wb25lbnQsIGluVHJhbnNhY3Rpb24sIHRpdGFuR2VuZXJpY0RhbywgY29tcG9uZW50LmdldENsYXNzKCksIG5vZGVUeXBlKTsKKwkJCQlpZiAodXBkYXRlQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gdXBkYXRlQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBzZXQgbGlmZWN5Y2xlIGZvciBjb21wb25lbnQge30gdG8gc3RhdGUge30sIGVycm9yOiB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBlcnJvcik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZXJyb3IpOworCQkJCX0KKworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgY2hhbmdlU3RhdGVUb0xhc3RTdGF0ZSA9IGNoYW5nZVN0YXRlUmVsYXRpb24obm9kZVR5cGUsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQkJY3VycmVudE93bmVyLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIEdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFKTsKKwkJCQlpZiAoIWNoYW5nZVN0YXRlVG9MYXN0U3RhdGUuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjaGFuZ2VTdGF0ZVRvTGFzdFN0YXRlKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCS8vIGNsb25lIHRoZSBjb21wb25lbnQKKwkJCXJlc3VsdCA9IGNsb25lQ29tcG9uZW50Rm9yQ2hlY2tvdXQoY29tcG9uZW50LCBub2RlVHlwZSwgbW9kaWZpZXIpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvdWxkbid0IHNldCBsaWZlY3ljbGUgZm9yIGNvbXBvbmVudCB7fSB0byBzdGF0ZSB7fSwgZXJyb3I6IHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksCisJCQkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgcmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lQ29tcG9uZW50Rm9yQ2VydGlmaWVkKENvbXBvbmVudCBjb21wb25lbnQsCisJCQlVc2VyIG1vZGlmaWVyLCBJbnRlZ2VyIG1ham9yVmVyc2lvbikgeworCisJCS8vIHNldCBuZXcgdmVyc2lvbgorCQlTdHJpbmcgY2VydGlmaWVkVmVyc2lvbiA9IChtYWpvclZlcnNpb24gKyAxKSArIFZFUlNJT05fREVMSU1FVEVSICsgIjAiOworCQljb21wb25lbnQuc2V0VmVyc2lvbihjZXJ0aWZpZWRWZXJzaW9uKTsKKwkJY29tcG9uZW50LnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCQljb21wb25lbnQuc2V0TGFzdFVwZGF0ZURhdGUobnVsbCk7CisJCWNvbXBvbmVudC5zZXRMYXN0VXBkYXRlclVzZXJJZChtb2RpZmllci5nZXRVc2VySWQoKSk7CisJCWNvbXBvbmVudC5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkuZ2V0Tm9kZVR5cGUoKSk7CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNvbXBvbmVudFJlc3VsdCA9IGNvbXBvbmVudE9wZXJhdGlvbgorCQkJCS5jbG9uZUNvbXBvbmVudChjb21wb25lbnQsIGNlcnRpZmllZFZlcnNpb24sIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIHRydWUpOworCisJCXJldHVybiBjbG9uZUNvbXBvbmVudFJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVuZG9DaGVja291dChOb2RlVHlwZUVudW0gbm9kZVR5cGUsIENvbXBvbmVudCBjb21wb25lbnQsCisJCQlVc2VyIG1vZGlmaWVyLCBVc2VyIGN1cnJlbnRPd25lciwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKG5vZGVUeXBlKTsKKworCQkvLyB0aGlzIGlzIGluIGNhc2UgcHJldlZlcnNpb24gaXMgMC4wIC0gcmV0dXJuaW5nIE9PVEIgY29tcG9uZW50CisJCUNvbXBvbmVudCBwcmV2Q29tcG9uZW50ID0gY29tcG9uZW50T3BlcmF0aW9uLmdldERlZmF1bHRDb21wb25lbnQoKTsKKwkJdHJ5IHsKKwkJCS8vIGZpbmQgcHJldmlvdXMgdmVyc2lvbgorCQkJU3RyaW5nW10gdmVyc2lvblBhcnRzID0gY29tcG9uZW50LmdldFZlcnNpb24oKS5zcGxpdChWRVJTSU9OX0RFTElNRVRFUl9SRUdFWFApOworCQkJSW50ZWdlciBtaW5vclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHZlcnNpb25QYXJ0c1sxXSkgLSAxOworCQkJU3RyaW5nIHByZXZpb3VzVmVyc2lvbiA9IHZlcnNpb25QYXJ0c1swXSArIFZFUlNJT05fREVMSU1FVEVSICsgbWlub3JWZXJzaW9uOworCisJCQlpZiAoIXByZXZpb3VzVmVyc2lvbi5lcXVhbHMoIjAuMCIpKSB7CisJCQkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU9sZFJlc291cmNlUmVzdWx0ID0gdXBkYXRlT2xkQ29tcG9uZW50QmVmb3JlVW5kb0NoZWNrb3V0KAorCQkJCQkJY29tcG9uZW50T3BlcmF0aW9uLCBwcmV2Q29tcG9uZW50LCBjb21wb25lbnQsIHByZXZpb3VzVmVyc2lvbiwgbm9kZVR5cGUsIHRydWUpOworCQkJCWlmICh1cGRhdGVPbGRSZXNvdXJjZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJcmVzdWx0ID0gdXBkYXRlT2xkUmVzb3VyY2VSZXN1bHQ7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJCXByZXZDb21wb25lbnQgPSB1cGRhdGVPbGRSZXNvdXJjZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCX0KKworCQkJLy8gZGVsZXRlIHRoZSBjb21wb25lbnQKKwkJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZXNvdXJjZVJlc3VsdCA9IGNvbXBvbmVudE9wZXJhdGlvbgorCQkJCQkuZGVsZXRlQ29tcG9uZW50KGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJCWlmIChkZWxldGVSZXNvdXJjZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBkZWxldGVSZXNvdXJjZVJlc3VsdDsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvLyByZXR1cm4gdGhlIGRlbGV0ZWQgcmVzb3VyY2UKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHByZXZDb21wb25lbnQpOworCisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tpbkNvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZUNoZWNraW5JbkdyYXBoID0gdXBkYXRlQ2hlY2tpbkluR3JhcGgobm9kZVR5cGUsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQljb21wb25lbnQuZ2V0TGlmZWN5Y2xlU3RhdGUoKSwgbW9kaWZpZXIsIG93bmVyKTsKKwkJCWlmICghdXBkYXRlQ2hlY2tpbkluR3JhcGguZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gdXBkYXRlIHN0YXRlIG9mIHJlc291cmNlIHt9LiBzdGF0dXM9e30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCXVwZGF0ZUNoZWNraW5JbkdyYXBoKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVwZGF0ZUNoZWNraW5JbkdyYXBoKTsKKwkJCX0KKwkJCUxpZmVjeWNsZVN0YXRlRW51bSBzdGF0ZSA9IExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU47CisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IGJ1aWxkRmlsdGVyRm9yRmV0Y2hDb21wb25lbnRBZnRlckNoYW5nZVN0YXRlKCk7CisJCQlyZXN1bHQgPSB1cGRhdGVDb21wb25lbnRNRChjb21wb25lbnQsIG1vZGlmaWVyLCBzdGF0ZSwgbm9kZVR5cGUsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3KTsKKwkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBzZXQgbGlmZWN5Y2xlIGZvciBjb21wb25lbnQge30gdG8gc3RhdGUge30sIGVycm9yOiB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQkJc3RhdGUsIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIENvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGJ1aWxkRmlsdGVyRm9yRmV0Y2hDb21wb25lbnRBZnRlckNoYW5nZVN0YXRlKCkgeworCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQljb21wb25lbnRQYXJhbWV0ZXJzVmlldy5kaXNhYmxlQWxsKCk7CisJCWNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LnNldElnbm9yZVVzZXJzKGZhbHNlKTsKKwkJLy8gVXNlZCB3aGVuIHdlIHJ1bm5pbmcgbXVsdGlwbGUgY2hhbmdlIHN0YXRlcyBhbmQgd2FudCB0byB1c2UgdGhlCisJCS8vIHJlc3VsdCBmcm9tIGFub3RoZXIgY2hhbmdlCisJCS8vIHN0YXRlKExpZmVjeWNsZU9wZXJhdGlvblRlc3QuY2VydGlmaWNhdGlvblN0YXR1c0NoYW5nZSkKKwkJY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuc2V0SWdub3JlQ2F0ZWdvcmllcyhmYWxzZSk7CisJCXJldHVybiBjb21wb25lbnRQYXJhbWV0ZXJzVmlldzsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlQ2hlY2tpbkluR3JhcGgoTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRJZCwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSBzdGF0ZSwgVXNlciBtb2RpZmllciwgVXNlciBvd25lcikgeworCisJCS8vIGNoZWNrIGlmIHdlIGNhbmNlbCByZmMKKwkJaWYgKHN0YXRlLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pKSB7CisKKwkJCS8vIHJlbW92ZSBsYXN0IGNoZWNraW4KKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQkJVW5pcXVlSWREYXRhIHJlc291cmNlRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoY29tcG9uZW50VHlwZSwgY29tcG9uZW50SWQpOworCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmRlbGV0ZUluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJCWlmIChkZWxldGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIGxhc3Qgc3RhdGUgcmVsYXRpb24iKTsKKwkJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTkNPTlNJU1RFTkNZOworCQkJfQorCQl9CisKKwkJLy8gcmVtb3ZlIENIRUNLT1VUIHJlbGF0aW9uCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlVXNlclRvUmVzb3VyY2VSZWxhdGlvbiA9IHJlbW92ZVVzZXJUb1Jlc291cmNlUmVsYXRpb24oY29tcG9uZW50VHlwZSwKKwkJCQlvd25lci5nZXRVc2VySWQoKSwgY29tcG9uZW50SWQsIEdyYXBoRWRnZUxhYmVscy5TVEFURSk7CisJCWlmICghcmVtb3ZlVXNlclRvUmVzb3VyY2VSZWxhdGlvbi5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCXJldHVybiByZW1vdmVVc2VyVG9SZXNvdXJjZVJlbGF0aW9uOworCQl9CisKKwkJLy8gY3JlYXRlIENIRUNLSU4gcmVsYXRpb24KKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjcmVhdGVVc2VyVG9SZXNvdXJjZVJlbGF0aW9uID0gY3JlYXRlVXNlclRvUmVzb3VyY2VSZWxhdGlvbihjb21wb25lbnRUeXBlLAorCQkJCW1vZGlmaWVyLmdldFVzZXJJZCgpLCBjb21wb25lbnRJZCwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWlmICghY3JlYXRlVXNlclRvUmVzb3VyY2VSZWxhdGlvbi5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCXJldHVybiBjcmVhdGVVc2VyVG9SZXNvdXJjZVJlbGF0aW9uOworCQl9CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnQgY29tcG9uZW50LCBVc2VyIG1vZGlmaWVyLCBVc2VyIG93bmVyLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZVJmY09uR3JhcGggPSB1cGRhdGVSZmNPbkdyYXBoKG5vZGVUeXBlLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJY29tcG9uZW50LmdldExpZmVjeWNsZVN0YXRlKCksIG1vZGlmaWVyLCBvd25lcik7CisJCQlpZiAoIXVwZGF0ZVJmY09uR3JhcGguZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gdXBkYXRlIHN0YXRlIG9mIHJlc291cmNlIHt9LiBzdGF0dXM9e30iLCBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCXVwZGF0ZVJmY09uR3JhcGgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodXBkYXRlUmZjT25HcmFwaCk7CisJCQl9CisKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSBzdGF0ZSA9IExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTjsKKworCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgPSBidWlsZEZpbHRlckZvckZldGNoQ29tcG9uZW50QWZ0ZXJDaGFuZ2VTdGF0ZSgpOworCisJCQlyZXN1bHQgPSB1cGRhdGVDb21wb25lbnRNRChjb21wb25lbnQsIG1vZGlmaWVyLCBzdGF0ZSwgbm9kZVR5cGUsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3KTsKKwkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBzZXQgbGlmZWN5Y2xlIGZvciBjb21wb25lbnQge30gdG8gc3RhdGUge30sIGVycm9yOiB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQkJc3RhdGUsIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB1cGRhdGVSZmNPbkdyYXBoKE5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQsCisJCQlMaWZlY3ljbGVTdGF0ZUVudW0gc3RhdGUsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIpIHsKKworCQlpZiAoc3RhdGUuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKSkgeworCQkJLy8gaWYgdGhpcyBpcyBhdG9taWMgY2hlY2tpbiArIFJGQzogY3JlYXRlIGNoZWNraW4gcmVsYXRpb24KKworCQkJLy8gcmVtb3ZlIENIRUNLT1VUIHJlbGF0aW9uCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlbGF0aW9uU3RhdHVzID0gcmVtb3ZlVXNlclRvUmVzb3VyY2VSZWxhdGlvbihjb21wb25lbnRUeXBlLCBvd25lci5nZXRVc2VySWQoKSwKKwkJCQkJY29tcG9uZW50SWQsIEdyYXBoRWRnZUxhYmVscy5TVEFURSk7CisJCQlpZiAoIXJlbGF0aW9uU3RhdHVzLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCXJldHVybiByZWxhdGlvblN0YXR1czsKKwkJCX0KKworCQkJLy8gY3JlYXRlIENIRUNLSU4gcmVsYXRpb24KKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQkJcmVsYXRpb25TdGF0dXMgPSBjcmVhdGVVc2VyVG9SZXNvdXJjZVJlbGF0aW9uKGNvbXBvbmVudFR5cGUsIG1vZGlmaWVyLmdldFVzZXJJZCgpLCBjb21wb25lbnRJZCwKKwkJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJCWlmICghcmVsYXRpb25TdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmV0dXJuIHJlbGF0aW9uU3RhdHVzOworCQkJfQorCQl9IGVsc2UgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjaGFuZ2VTdGF0dXMgPSBjaGFuZ2VSZWxhdGlvbkxhYmVsKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkLCBvd25lciwKKwkJCQkJR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSk7CisJCQlpZiAoIWNoYW5nZVN0YXR1cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlyZXR1cm4gY2hhbmdlU3RhdHVzOworCQkJfQorCQl9CisKKwkJLy8gY3JlYXRlIFJGQyByZWxhdGlvbgorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgY2hhbmdlUmVsYXRpb25MYWJlbCA9IGNyZWF0ZVVzZXJUb1Jlc291cmNlUmVsYXRpb24oY29tcG9uZW50VHlwZSwgbW9kaWZpZXIuZ2V0VXNlcklkKCksCisJCQkJY29tcG9uZW50SWQsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgcHJvcHMpOworCQlpZiAoIWNoYW5nZVJlbGF0aW9uTGFiZWwuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlyZXR1cm4gY2hhbmdlUmVsYXRpb25MYWJlbDsKKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgY2hhbmdlUmVsYXRpb25MYWJlbChOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLCBVc2VyIG93bmVyLAorCQkJR3JhcGhFZGdlTGFiZWxzIHByZXZMYWJlbCwgR3JhcGhFZGdlTGFiZWxzIHRvTGFiZWwpIHsKKwkJVW5pcXVlSWREYXRhIHJlc291cmNlViA9IG5ldyBVbmlxdWVJZERhdGEoY29tcG9uZW50VHlwZSwgY29tcG9uZW50SWQpOworCQlVc2VyRGF0YSB1c2VyViA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyVi5zZXRVc2VySWQob3duZXIuZ2V0VXNlcklkKCkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcGxhY2VSZWxhdGlvbkxhYmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLnJlcGxhY2VSZWxhdGlvbkxhYmVsKHVzZXJWLCByZXNvdXJjZVYsIHByZXZMYWJlbCwgdG9MYWJlbCk7CisJCWlmIChyZXBsYWNlUmVsYXRpb25MYWJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIHJlcGxhY2UgbGFiZWwgZnJvbSBsYXN0IHN0YXRlIHRvIHN0YXRlIik7CisJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZXBsYWNlUmVsYXRpb25MYWJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhcnRDb21wb25lbnRDZXJ0aWZpY2F0aW9uKE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCUNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlT25HcmFwaCA9IHVwZGF0ZVN0YXJ0Q2VydGlmaWNhdGlvbk9uR3JhcGgobm9kZVR5cGUsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQltb2RpZmllciwgb3duZXIpOworCQkJaWYgKCF1cGRhdGVPbkdyYXBoLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIHVwZGF0ZSBzdGF0ZSBvZiByZXNvdXJjZSB7fS4gc3RhdHVzPXt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIHVwZGF0ZU9uR3JhcGgpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodXBkYXRlT25HcmFwaCk7CisJCQl9CisKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSBzdGF0ZSA9IExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTOworCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgPSBidWlsZEZpbHRlckZvckZldGNoQ29tcG9uZW50QWZ0ZXJDaGFuZ2VTdGF0ZSgpOworCisJCQlyZXN1bHQgPSB1cGRhdGVDb21wb25lbnRNRChjb21wb25lbnQsIG1vZGlmaWVyLCBzdGF0ZSwgbm9kZVR5cGUsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3KTsKKwkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBzZXQgbGlmZWN5Y2xlIGZvciBjb21wb25lbnQge30gdG8gc3RhdGUge30sIGVycm9yOiB7fSIsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLAorCQkJCQkJc3RhdGUsIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlU3RhcnRDZXJ0aWZpY2F0aW9uT25HcmFwaChOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZSwgU3RyaW5nIGNvbXBvbmVudElkLAorCQkJVXNlciBtb2RpZmllciwgVXNlciBvd25lcikgeworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNoYW5nZVJlbGF0aW9uTGFiZWwgPSBjaGFuZ2VSZWxhdGlvbkxhYmVsKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkLCBvd25lciwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIEdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFKTsKKwkJaWYgKCFjaGFuZ2VSZWxhdGlvbkxhYmVsLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIGNoYW5nZVJlbGF0aW9uTGFiZWw7CisJCX0KKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVVzZXJUb1Jlc291cmNlUmVsYXRpb24gPSBjcmVhdGVVc2VyVG9SZXNvdXJjZVJlbGF0aW9uKGNvbXBvbmVudFR5cGUsCisJCQkJbW9kaWZpZXIuZ2V0VXNlcklkKCksIGNvbXBvbmVudElkLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIHByb3BzKTsKKwkJaWYgKCFjcmVhdGVVc2VyVG9SZXNvdXJjZVJlbGF0aW9uLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIGNyZWF0ZVVzZXJUb1Jlc291cmNlUmVsYXRpb247CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjZXJ0aWZ5Q29tcG9uZW50KE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCUNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgbW9kaWZpZXIsIFVzZXIgY3VycmVudE93bmVyLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCVN0cmluZyByZXNvdXJjZUlkQmVmb3JlQ2VydGlmeSA9IGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpOworCQkJU3RyaW5nW10gdmVyc2lvblBhcnRzID0gY29tcG9uZW50LmdldFZlcnNpb24oKS5zcGxpdChWRVJTSU9OX0RFTElNRVRFUl9SRUdFWFApOworCQkJSW50ZWdlciBtYWpvclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHZlcnNpb25QYXJ0c1swXSk7CisKKwkJCS8vIHVwZGF0ZSBvbGQgY2VydGlmaWVkIHJlc291cmNlCisJCQlpZiAobWFqb3JWZXJzaW9uID4gMCkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlTGFzdENlcnRpZmllZFJlc291cmNlID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCQl1cGRhdGVMYXN0Q2VydGlmaWVkUmVzb3VyY2UgPSB1cGRhdGVMYXN0Q2VydGlmaWVkQ29tcG9uZW50KGNvbXBvbmVudCwgbWFqb3JWZXJzaW9uKTsKKwkJCQlpZiAoIXVwZGF0ZUxhc3RDZXJ0aWZpZWRSZXNvdXJjZS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodCh1cGRhdGVMYXN0Q2VydGlmaWVkUmVzb3VyY2UpOworCQkJCX0KKwkJCX0KKworCQkJLy8gY2xvbmUgdGhlIHJlc291cmNlCisJCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzb3VyY2VSZXN1bHQgPSBFaXRoZXIKKwkJCQkJLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlzd2l0Y2ggKG5vZGVUeXBlKSB7CisJCQljYXNlIFNlcnZpY2U6CisJCQljYXNlIFJlc291cmNlOgorCQkJCWNyZWF0ZVJlc291cmNlUmVzdWx0ID0gY2xvbmVDb21wb25lbnRGb3JDZXJ0aWZpZWQoY29tcG9uZW50LCBtb2RpZmllciwgbWFqb3JWZXJzaW9uKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbG9nLmVycm9yKCJjb21wb25lbnQgb2JqZWN0IGlzIHdpdGggdHlwZSB7fSAuIEl0J3Mgbm90IHN1cHBvcnRlZCB0eXBlIik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCWlmIChjcmVhdGVSZXNvdXJjZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgbmV3IHJlc291cmNlIHZlcnNpb24gZm9yIGNoZWNrb3V0LiIpOworCQkJCXJlc3VsdCA9IGNyZWF0ZVJlc291cmNlUmVzdWx0OworCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZVJlc3VsdDsKKwkJCX0KKworCQkJQ29tcG9uZW50IGNlcnRpZmllZFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2VSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJCS8vIGFkZCByZmMgcmVsYXRpb24gdG8gcHJlc2VydmUgZm9sbG93ZXIgaW5mb3JtYXRpb24KKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYWRkUmZjUmVsYXRpb24gPSBhZGRSZmNSZWxhdGlvblRvQ2VydGZpZWRDb21wb25lbnQobm9kZVR5cGUsIHJlc291cmNlSWRCZWZvcmVDZXJ0aWZ5LAorCQkJCQljZXJ0aWZpZWRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCWlmICghYWRkUmZjUmVsYXRpb24uZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFkZFJmY1JlbGF0aW9uKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjZXJ0aWZpZWRSZXNvdXJjZSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU9sZENvbXBvbmVudFZlcnNpb25zKE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCVN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgdXVpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24obm9kZVR5cGUpOworCisJCXRyeSB7CisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvbGRWZXJzaW9uc1RvRGVsZXRlID0gZ2V0Q29tcG9uZW50VGVtcFZlcnNpb25zKG5vZGVUeXBlLAorCQkJCQl1dWlkKTsKKworCQkJaWYgKG9sZFZlcnNpb25zVG9EZWxldGUuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KG9sZFZlcnNpb25zVG9EZWxldGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlmb3IgKENvbXBvbmVudCByZXNvdXJjZVRvRGVsZXRlIDogb2xkVmVyc2lvbnNUb0RlbGV0ZS5sZWZ0KCkudmFsdWUoKSkgeworCisJCQkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzb3VyY2UgPSBjb21wb25lbnRPcGVyYXRpb24KKwkJCQkJCS5tYXJrQ29tcG9uZW50VG9EZWxldGUocmVzb3VyY2VUb0RlbGV0ZSwgaW5UcmFuc2FjdGlvbik7CisJCQkJaWYgKHVwZGF0ZVJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodXBkYXRlUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh0cnVlKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZFJmY1JlbGF0aW9uVG9DZXJ0ZmllZENvbXBvbmVudChOb2RlVHlwZUVudW0gY29tcG9uZW50VHlwZSwKKwkJCVN0cmluZyByZXNvdXJjZUlkQmVmb3JlQ2VydGlmeSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJLy8gZ2V0IHVzZXIgb2YgY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCVVuaXF1ZUlkRGF0YSBjb21wb25lbnRWID0gbmV3IFVuaXF1ZUlkRGF0YShjb21wb25lbnRUeXBlLCByZXNvdXJjZUlkQmVmb3JlQ2VydGlmeSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZmNSZWxhdGlvblJlc3BvbnNlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKGNvbXBvbmVudFYsIEdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFLCBwcm9wcyk7CisJCWlmIChyZmNSZWxhdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcmZjUmVsYXRpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBmaW5kIHJmYyByZWxhdGlvbiBmb3IgY29tcG9uZW50IHt9LiBzdGF0dXM9IiwgcmVzb3VyY2VJZEJlZm9yZUNlcnRpZnksIHN0YXR1cyk7CisJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpOworCQl9CisJCUdyYXBoUmVsYXRpb24gcmZjUmVsYXRpb24gPSByZmNSZWxhdGlvblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlyZmNSZWxhdGlvbi5zZXRUbygKKwkJCQluZXcgUmVsYXRpb25FbmRQb2ludChjb21wb25lbnRUeXBlLCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpLCB1bmlxdWVJZCkpOworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb25SZXNwb25zZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5jcmVhdGVSZWxhdGlvbihyZmNSZWxhdGlvbik7CisJCWlmIChjcmVhdGVSZWxhdGlvblJlc3BvbnNlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlUmVsYXRpb25SZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgcmZjIHJlbGF0aW9uIGZvciBjb21wb25lbnQge30uIHN0YXR1cz0iLCB1bmlxdWVJZCwgc3RhdHVzKTsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlTGFzdENlcnRpZmllZENvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBJbnRlZ2VyIG1ham9yVmVyc2lvbikgeworCisJCU5vZGVUeXBlRW51bSBub2RlVHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkuZ2V0Tm9kZVR5cGUoKTsKKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihub2RlVHlwZSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gYWRkaXRpb25hbFF1ZXJ5UGFyYW1zID0gbnVsbDsKKwkJaWYgKG5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5SZXNvdXJjZSkgeworCQkJUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUgPSAoKFJlc291cmNlKSBjb21wb25lbnQpLmdldFJlc291cmNlVHlwZSgpOworCQkJYWRkaXRpb25hbFF1ZXJ5UGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlhZGRpdGlvbmFsUXVlcnlQYXJhbXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCByZXNvdXJjZVR5cGUubmFtZSgpKTsKKwkJfQorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGFzdENlcnRpZmllZFJlc3BvbnNlID0gY29tcG9uZW50T3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudEJ5TmFtZUFuZFZlcnNpb24oY29tcG9uZW50LmdldE5hbWUoKSwgbWFqb3JWZXJzaW9uICsgVkVSU0lPTl9ERUxJTUVURVIgKyAiMCIsCisJCQkJCQlhZGRpdGlvbmFsUXVlcnlQYXJhbXMsIHRydWUpOworCisJCWlmIChnZXRMYXN0Q2VydGlmaWVkUmVzcG9uc2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byB1cGRhdGUgbGFzdCBjZXJ0aWZpZWQgcmVzb3VyY2UuIHN0YXR1cz17fSIsIGdldExhc3RDZXJ0aWZpZWRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIGdldExhc3RDZXJ0aWZpZWRSZXNwb25zZS5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlDb21wb25lbnQgbGFzdENlcnRpZmllZCA9IGdldExhc3RDZXJ0aWZpZWRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJbGFzdENlcnRpZmllZC5zZXRIaWdoZXN0VmVyc2lvbihmYWxzZSk7CisJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVJlc291cmNlID0gY29tcG9uZW50T3BlcmF0aW9uLnVwZGF0ZUNvbXBvbmVudChsYXN0Q2VydGlmaWVkLAorCQkJCXRydWUpOworCQlpZiAodXBkYXRlUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byB1cGRhdGUgbGFzdCBjZXJ0aWZpZWQgcmVzb3VyY2UuIHN0YXR1cz17fSIsIHVwZGF0ZVJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gdXBkYXRlUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2xvbmVDb21wb25lbnRGb3JDaGVja291dChDb21wb25lbnQgY29tcG9uZW50LAorCQkJTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBVc2VyIG1vZGlmaWVyKSB7CisKKwkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiA9IGdldENvbXBvbmVudE9wZXJhdGlvbihub2RlVHlwZSk7CisJCVN0cmluZyBwcmV2SWQgPSBjb21wb25lbnQuZ2V0VW5pcXVlSWQoKTsKKwkJLy8gc2V0IG5ldyB2ZXJzaW9uCisJCUVpdGhlcjxTdHJpbmcsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG5leHRWZXJzaW9uID0gZ2V0TmV4dFZlcnNpb24oY29tcG9uZW50LmdldFZlcnNpb24oKSk7CisJCWlmIChuZXh0VmVyc2lvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQobmV4dFZlcnNpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCS8vIGlmIGNoZWNrb3V0IG9uIGNlcnRpZmllZCBzZXJ2aWNlIC0gaW5pdCBkaXN0cmlidXRpb24gc3RhdHVzIGJhY2sKKwkJaWYgKG5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5TZXJ2aWNlICYmIGNvbXBvbmVudC5nZXRMaWZlY3ljbGVTdGF0ZSgpLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKSkgeworCQkJKChTZXJ2aWNlKSBjb21wb25lbnQpLnNldERpc3RyaWJ1dGlvblN0YXR1cyhEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQpOworCQl9CisKKwkJU3RyaW5nIHZlcnNpb24gPSBuZXh0VmVyc2lvbi5sZWZ0KCkudmFsdWUoKTsKKwkJY29tcG9uZW50LnNldExpZmVjeWNsZVN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJY29tcG9uZW50LnNldExhc3RVcGRhdGVEYXRlKG51bGwpOworCQljb21wb25lbnQuc2V0TGFzdFVwZGF0ZXJVc2VySWQobW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCQljb21wb25lbnQuc2V0SGlnaGVzdFZlcnNpb24odHJ1ZSk7CisKKwkJLy8gY2hlY2sgdmVyc2lvbiBvZiByZXNvdXJjZSBkb2VzIG5vdCBleGlzdC4gTm90ZSB0aGF0IHJlc291cmNlIHR5cGUgVkYKKwkJLy8gY2FuIGhhdmUgc2FtZSBuYW1lIGFzIHJlc291cmNlIHR5cGUgVkZDCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gYWRkaXRpb25hbFF1ZXJ5UGFyYW1zID0gbnVsbDsKKwkJaWYgKG5vZGVUeXBlID09IE5vZGVUeXBlRW51bS5SZXNvdXJjZSkgeworCQkJUmVzb3VyY2VUeXBlRW51bSByZXNvdXJjZVR5cGUgPSAoKFJlc291cmNlKSBjb21wb25lbnQpLmdldFJlc291cmNlVHlwZSgpOworCQkJYWRkaXRpb25hbFF1ZXJ5UGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlhZGRpdGlvbmFsUXVlcnlQYXJhbXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCByZXNvdXJjZVR5cGUubmFtZSgpKTsKKwkJfQorCQlTdHJpbmcgbmFtZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOworCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhbHJlYWR5RXhpc3RSZXN1bHQgPSBjb21wb25lbnRPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50QnlOYW1lQW5kVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBhZGRpdGlvbmFsUXVlcnlQYXJhbXMsIHRydWUpOworCQlpZiAoYWxyZWFkeUV4aXN0UmVzdWx0LmlzTGVmdCgpKSB7CisJCQlsb2cuZGVidWcoIkNvbXBvbmVudCB3aXRoIG5hbWUge30gYW5kIHZlcnNpb24ge30gYWxyZWFkeSBleGlzdCIsIG5hbWUsIHZlcnNpb24pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkVOVElUWV9BTFJFQURZX0VYSVNUUyk7CisKKwkJfQorCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IGFscmVhZHlFeGlzdFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCWlmIChzdG9yYWdlT3BlcmF0aW9uU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlsb2cuZGVidWcoCisJCQkJCSJVbmV4cGVjdGVkIGVycm9yIHdoZW4gY2hlY2tpbmcgaWYgY29tcG9uZW50IHdpdGggbmFtZSB7fSBhbmQgdmVyc2lvbiB7fSBhbHJlYWR5IGV4aXN0LCBlcnJvcjoge30iLAorCQkJCQluYW1lLCB2ZXJzaW9uLCBzdG9yYWdlT3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZU9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNvbXBvbmVudFJlc3BvbnNlID0gY29tcG9uZW50T3BlcmF0aW9uLmNsb25lQ29tcG9uZW50KGNvbXBvbmVudCwKKwkJCQl2ZXJzaW9uLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwgdHJ1ZSk7CisKKwkJcmV0dXJuIGNsb25lQ29tcG9uZW50UmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8U3RyaW5nLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXROZXh0VmVyc2lvbihTdHJpbmcgY3VyclZlcnNpb24pIHsKKwkJU3RyaW5nW10gdmVyc2lvblBhcnRzID0gY3VyclZlcnNpb24uc3BsaXQoVkVSU0lPTl9ERUxJTUVURVJfUkVHRVhQKTsKKwkJaWYgKHZlcnNpb25QYXJ0cyA9PSBudWxsIHx8IHZlcnNpb25QYXJ0cy5sZW5ndGggIT0gMikgeworCQkJbG9nLmVycm9yKCJpbnZhbGlkIHZlcnNpb24ge30iLCBjdXJyVmVyc2lvbik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1QpOworCQl9CisKKwkJSW50ZWdlciBtaW5vclZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHZlcnNpb25QYXJ0c1sxXSkgKyAxOworCQlTdHJpbmcgbmV3VmVyc2lvbiA9IHZlcnNpb25QYXJ0c1swXSArIFZFUlNJT05fREVMSU1FVEVSICsgbWlub3JWZXJzaW9uOworCQlyZXR1cm4gRWl0aGVyLmxlZnQobmV3VmVyc2lvbik7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldFJlbGF0aW9uRm9yQ2FuY2VsQ2VydGlmaWNhdGlvbihMaWZlY3ljbGVTdGF0ZUVudW0gbmV4dFN0YXRlLAorCQkJTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRJZCkgeworCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCVVuaXF1ZUlkRGF0YSBjb21wb25lbnREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCk7CisKKwkJLy8gZGVsZXRlIHJlbGF0aW9uIENFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmRlbGV0ZUluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKGNvbXBvbmVudERhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgcHJvcHMpOworCQlpZiAoZGVsZXRlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIGxhc3Qgc3RhdGUgcmVsYXRpb24iKTsKKwkJCXJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5DT05TSVNURU5DWTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQkvLyBkZWxldGUgcmVsYXRpb24gUkVBRFlfRk9SX0NFUlRJRklDQVRJT04gKExBU1RfU1RBVEUpCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIG5leHRTdGF0ZSk7CisKKwkJZGVsZXRlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZUluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKGNvbXBvbmVudERhdGEsIEdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFLAorCQkJCXByb3BzKTsKKwkJaWYgKGRlbGV0ZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSBsYXN0IHN0YXRlIHJlbGF0aW9uIik7CisJCQlyZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOQ09OU0lTVEVOQ1k7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCUdyYXBoUmVsYXRpb24gb3JpZ1JlbGF0aW9uID0gZGVsZXRlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGNyZWF0ZSByZWxhdGlvbiBSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiAoU1RBVEUpCisJCVVzZXJEYXRhIHVzZXIgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlci5zZXRVc2VySWQoKFN0cmluZykgb3JpZ1JlbGF0aW9uLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHVzZXIsCisJCQkJY29tcG9uZW50RGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBvcmlnUmVsYXRpb24udG9HcmFwaE1hcCgpKTsKKworCQlpZiAoY3JlYXRlUmVsYXRpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byB1cGRhdGUgbGFzdCBzdGF0ZSByZWxhdGlvbi4gc3RhdHVzPXt9IiwgY3JlYXRlUmVsYXRpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5DT05TSVNURU5DWTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldFJlbGF0aW9uRm9yRmFpbENlcnRpZmljYXRpb24oTGlmZWN5Y2xlU3RhdGVFbnVtIG5leHRTdGF0ZSwKKwkJCU5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQpIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IG51bGw7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJVW5pcXVlSWREYXRhIGNvbXBvbmVudERhdGEgPSBuZXcgVW5pcXVlSWREYXRhKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkKTsKKworCQkvLyBkZWxldGUgcmVsYXRpb24gQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZGVsZXRlSW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEoY29tcG9uZW50RGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWlmIChkZWxldGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgbGFzdCBzdGF0ZSByZWxhdGlvbiIpOworCQkJcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTkNPTlNJU1RFTkNZOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8vIGRlbGV0ZSByZWxhdGlvbiBSRUFEWV9GT1JfQ0VSVElGSUNBVElPTgorCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCisJCWRlbGV0ZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShjb21wb25lbnREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSwKKwkJCQlwcm9wcyk7CisJCWlmIChkZWxldGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgbGFzdCBzdGF0ZSByZWxhdGlvbiIpOworCQkJcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTkNPTlNJU1RFTkNZOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8vIGRlbGV0ZSByZWxhdGlvbiBOT1RfQ0VSVElGSUVEX0NIRUNLSU4gKGluIG9yZGVyIHRvIGNoYW5nZSB0byBTVEFURSkKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWRlbGV0ZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShjb21wb25lbnREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSwKKwkJCQlwcm9wcyk7CisJCWlmIChkZWxldGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgbGFzdCBzdGF0ZSByZWxhdGlvbiIpOworCQkJcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTkNPTlNJU1RFTkNZOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8vIGNyZWF0ZSBuZXcgU1RBVEUgcmVsYXRpb24gTk9UX0NFUlRJRklFRF9DSEVDS0lOCisJCUdyYXBoUmVsYXRpb24gb3JpZ1JlbGF0aW9uID0gZGVsZXRlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQlVc2VyRGF0YSB1c2VyID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXIuc2V0VXNlcklkKChTdHJpbmcpIG9yaWdSZWxhdGlvbi5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvblJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbih1c2VyLAorCQkJCWNvbXBvbmVudERhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgb3JpZ1JlbGF0aW9uLnRvR3JhcGhNYXAoKSk7CisKKwkJaWYgKGNyZWF0ZVJlbGF0aW9uUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJmYWlsZWQgdG8gdXBkYXRlIGxhc3Qgc3RhdGUgcmVsYXRpb24iKTsKKwkJCXJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5DT05TSVNURU5DWTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJLyoqCisJICogdXBkYXRlIHNlcnZpY2UgbWV0YWRhdGEgLSBsYXN0VXBkYXRlciBhbmQgc3RhdGUKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQHBhcmFtIG1vZGlmaWVyCisJICogQHBhcmFtIG5leHRTdGF0ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudE1EKENvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgbW9kaWZpZXIsCisJCQlMaWZlY3ljbGVTdGF0ZUVudW0gbmV4dFN0YXRlLCBOb2RlVHlwZUVudW0gbm9kZVR5cGUsCisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyByZXR1cm5lZENvbXBvbmVudFBhcmFtZXRlcnNWaWV3RmlsdGVyKSB7CisKKwkJaWYgKHJldHVybmVkQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXdGaWx0ZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuZWRDb21wb25lbnRQYXJhbWV0ZXJzVmlld0ZpbHRlciA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQl9CisKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCWNvbXBvbmVudC5zZXRMYXN0VXBkYXRlRGF0ZShudWxsKTsKKwkJY29tcG9uZW50LnNldExhc3RVcGRhdGVyVXNlcklkKG1vZGlmaWVyLmdldFVzZXJJZCgpKTsKKworCQlDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uID0gZ2V0Q29tcG9uZW50T3BlcmF0aW9uKG5vZGVUeXBlKTsKKwkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgZmlsdGVyUGFyYW1ldGVyc1ZpZXcgPSBidWlsZEZpbHRlckZvckZldGNoQ29tcG9uZW50QWZ0ZXJDaGFuZ2VTdGF0ZSgpOworCQlsb2cuZGVidWcoInVwZGF0ZUNvbXBvbmVudE1EOjp1cGRhdGVDb21wb25lbnRGaWx0ZXJSZXN1bHQgc3RhcnQiKTsKKwkJcmVzdWx0ID0gY29tcG9uZW50T3BlcmF0aW9uLnVwZGF0ZUNvbXBvbmVudEZpbHRlclJlc3VsdChjb21wb25lbnQsIHRydWUsIGZpbHRlclBhcmFtZXRlcnNWaWV3KTsKKwkJbG9nLmRlYnVnKCJ1cGRhdGVDb21wb25lbnRNRDo6dXBkYXRlQ29tcG9uZW50RmlsdGVyUmVzdWx0IGVuZCIpOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIGNvbXBvbmVudCBmb3IgY2VydGlmaWNhdGlvbiByZXF1ZXN0LCBlcnJvcjoge30iLCByZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJbG9nLmRlYnVnKCJ1cGRhdGVDb21wb25lbnRNRDo6Z2V0QW5kVXBkYXRlTWV0YWRhdGEgc3RhcnQiKTsKKwkJLy8gZ2V0IHNlcnZpY2UgTUQKKwkJRWl0aGVyPENvbXBvbmVudE1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudERhdGFSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZSgKKwkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShub2RlVHlwZSksIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAoY29tcG9uZW50RGF0YVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGdldCBzZXJ2aWNlIGRhdGEgZnJvbSBncmFwaCIpOworCQkJcmV0dXJuIEVpdGhlcgorCQkJCQkucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhjb21wb25lbnREYXRhUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisKKwkJLy8gc2V0IHN0YXRlIG9uIHJlc291cmNlCisJCUNvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnREYXRhID0gY29tcG9uZW50RGF0YVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJY29tcG9uZW50RGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3RhdGUobmV4dFN0YXRlLm5hbWUoKSk7CisJCWNvbXBvbmVudC5zZXRMaWZlY3ljbGVTdGF0ZShuZXh0U3RhdGUpOworCQlFaXRoZXI8Q29tcG9uZW50TWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKGNvbXBvbmVudERhdGEsCisJCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJ1cGRhdGVDb21wb25lbnRNRDo6Z2V0QW5kVXBkYXRlTWV0YWRhdGEgZW5kIik7CisJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gdXBkYXRlIGNvbXBvbmVudCAiICsgY29tcG9uZW50LmdldFVuaXF1ZUlkKCkgKyAiLiBzdGF0dXMgaXMgIgorCQkJCQkrIHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWxvZy5kZWJ1ZygidXBkYXRlQ29tcG9uZW50TUQ6OmdldEFuZFVwZGF0ZU1ldGFkYXRhIHN0YXJ0Iik7CisJCUVpdGhlcjxPYmplY3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VBZnRlckNoYW5nZSA9IGNvbXBvbmVudE9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnQoY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIHJldHVybmVkQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXdGaWx0ZXIsIHRydWUpOworCQlsb2cuZGVidWcoInVwZGF0ZUNvbXBvbmVudE1EOjpnZXRBbmRVcGRhdGVNZXRhZGF0YSBlbmQiKTsKKwkJaWYgKHNlcnZpY2VBZnRlckNoYW5nZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGdldCBjb21wb25lbnQgIiArIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpICsgIiBhZnRlciBjaGFuZ2UuIHN0YXR1cyBpcyAiCisJCQkJCSsgdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KChDb21wb25lbnQpIHNlcnZpY2VBZnRlckNoYW5nZS5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJLyoqCisJICogdXBkYXRlIHJlc291Y2UgbWV0YWRhdGEgLSBsYXN0VXBkYXRlciBhbmQgc3RhdGUKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2UKKwkgKiBAcGFyYW0gbW9kaWZpZXIKKwkgKiBAcGFyYW0gbmV4dFN0YXRlCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXNvdXJjZU1EKFJlc291cmNlIHJlc291cmNlLCBVc2VyIG1vZGlmaWVyLAorCQkJTGlmZWN5Y2xlU3RhdGVFbnVtIG5leHRTdGF0ZSkgeworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0OworCQlyZXNvdXJjZS5zZXRMYXN0VXBkYXRlRGF0ZShudWxsKTsKKwkJcmVzb3VyY2Uuc2V0TGFzdFVwZGF0ZXJVc2VySWQobW9kaWZpZXIuZ2V0VXNlcklkKCkpOworCisJCXJlc3VsdCA9IHJlc291cmNlT3BlcmF0aW9uLnVwZGF0ZVJlc291cmNlKHJlc291cmNlLCB0cnVlKTsKKwkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIHVwZGF0ZSByZXNvdXJjZSBmb3IgY2VydGlmaWNhdGlvbiByZXF1ZXN0LiIpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQkvLyBnZXQgcmVzb3VyY2UgTUQKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VEYXRhUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoCisJCQkJVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChyZXNvdXJjZURhdGFSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgcmVzb3VyY2UgZGF0YSBmcm9tIGdyYXBoIik7CisJCQlyZXR1cm4gRWl0aGVyCisJCQkJCS5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlc291cmNlRGF0YVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCisJCS8vIHNldCBzdGF0ZSBvbiByZXNvdXJjZQorCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSByZXNvdXJjZURhdGFSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3RhdGUobmV4dFN0YXRlLm5hbWUoKSk7CisJCXJlc291cmNlLnNldExpZmVjeWNsZVN0YXRlKG5leHRTdGF0ZSk7CisJCUVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gdXBkYXRlIHJlc291cmNlICIgKyByZXNvdXJjZS5nZXRVbmlxdWVJZCgpICsgIi4gc3RhdHVzIGlzICIKKwkJCQkJKyB1cGRhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh1cGRhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8Q29tcG9uZW50PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50VGVtcFZlcnNpb25zKE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCVN0cmluZyB1dWlkKSB7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCUxpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnQ+KCk7CisJCUNvbXBvbmVudE9wZXJhdGlvbiBjb21wb25lbnRPcGVyYXRpb24gPSBnZXRDb21wb25lbnRPcGVyYXRpb24obm9kZVR5cGUpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gaGFzUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBoYXNOb3RQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWNyZWF0ZU9sZFZlcnNpb25zQ3JpdGVyaWEobm9kZVR5cGUsIHV1aWQsIGhhc1Byb3BzLCBoYXNOb3RQcm9wcyk7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShub2RlVHlwZSwgaGFzUHJvcHMsIGhhc05vdFByb3BzLCBDb21wb25lbnRNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCWlmIChnZXRCeUNyaXRlcmlhLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0IG9sZCB2ZXJzaW9ucyBmb3IgY29tcG9uZW50LCB0eXBlOnt9LCBpZDoge30iLCBub2RlVHlwZSwgdXVpZCk7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhnZXRCeUNyaXRlcmlhLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUxpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiBvbGRWZXJzaW9uQ29tcG9uZW50cyA9IGdldEJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCk7CisJCWZvciAoQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudCA6IG9sZFZlcnNpb25Db21wb25lbnRzKSB7CisJCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZVJlcyA9IGNvbXBvbmVudE9wZXJhdGlvbgorCQkJCQkuZ2V0Q29tcG9uZW50KGNvbXBvbmVudC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCQlpZiAocmVzb3VyY2VSZXMuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlc291cmNlUmVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0gZWxzZSB7CisJCQkJY29tcG9uZW50TGlzdC5hZGQocmVzb3VyY2VSZXMubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNvbXBvbmVudExpc3QpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVPbGRWZXJzaW9uc0NyaXRlcmlhKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHV1aWQsIE1hcDxTdHJpbmcsIE9iamVjdD4gaGFzUHJvcHMsCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGhhc05vdFByb3BzKSB7CisKKwkJaGFzUHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVVVJRC5nZXRQcm9wZXJ0eSgpLCB1dWlkKTsKKwkJaGFzUHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgbm9kZVR5cGUubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQloYXNOb3RQcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlT2xkQ29tcG9uZW50QmVmb3JlVW5kb0NoZWNrb3V0KAorCQkJQ29tcG9uZW50T3BlcmF0aW9uIGNvbXBvbmVudE9wZXJhdGlvbiwgQ29tcG9uZW50IHByZXZDb21wb25lbnQsIENvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LAorCQkJU3RyaW5nIHByZXZpb3VzVmVyc2lvbiwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlsb2cuZGVidWcoInVwZGF0ZSBwcmV2aW91cyB2ZXJzaW9uIG9mIGNvbXBvbmVudCIpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxRdWVyeVBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWlmIChub2RlVHlwZSA9PSBOb2RlVHlwZUVudW0uUmVzb3VyY2UpIHsKKwkJCVJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlID0gKChSZXNvdXJjZSkgY3VycmVudENvbXBvbmVudCkuZ2V0UmVzb3VyY2VUeXBlKCk7CisKKwkJCWFkZGl0aW9uYWxRdWVyeVBhcmFtcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVNPVVJDRV9UWVBFLmdldFByb3BlcnR5KCksIHJlc291cmNlVHlwZS5uYW1lKCkpOworCQl9CisJCUNvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IGN1cnJlbnRDb21wb25lbnQuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkKKwkJCQkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpOworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T2xkZXJDb21wUmVzdWx0ID0gY29tcG9uZW50T3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudEJ5TmFtZUFuZFZlcnNpb24obWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXROYW1lKCksIHByZXZpb3VzVmVyc2lvbiwgYWRkaXRpb25hbFF1ZXJ5UGFyYW1zLAorCQkJCQkJdHJ1ZSk7CisKKwkJLy8gaWYgcHJldmlvdXMgdmVyc2lvbiBleGlzdCAtIHNldCBpdCBhcyBjdXJyZW50IHZlcnNpb24KKwkJaWYgKGdldE9sZGVyQ29tcFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWlmIChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORC5lcXVhbHMoZ2V0T2xkZXJDb21wUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSkpIHsKKwkJCQlsb2cuZGVidWcoIk5vIGNvbXBvbmVudHMgYnkgbmFtZSBhbmQgdmVyc2lvbiA6IHt9IHt9IiwgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXROYW1lKCksIHByZXZpb3VzVmVyc2lvbik7CisJCQkJbG9nLmRlYnVnKCJOYW1lIG1heSBoYXZlIGNoYW5nZWQsIHNpbmNlIHRoZSB2ZXJzaW9uIGlzbid0IGNlcnRpZmllZCAgdHJ5IHRvIGZldGNoIGJ5IFVVSUQge30iLCBtZXRhZGF0YURhdGFEZWZpbml0aW9uLmdldFVVSUQoKSk7CisJCQkJYWRkaXRpb25hbFF1ZXJ5UGFyYW1zLmNsZWFyKCk7CisJCQkJYWRkaXRpb25hbFF1ZXJ5UGFyYW1zLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVVSUQuZ2V0UHJvcGVydHkoKSwKKwkJCQkJCW1ldGFkYXRhRGF0YURlZmluaXRpb24uZ2V0VVVJRCgpKTsKKwkJCQlhZGRpdGlvbmFsUXVlcnlQYXJhbXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCBwcmV2aW91c1ZlcnNpb24pOworCisJCQkJRWl0aGVyPExpc3Q8Q29tcG9uZW50TWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5VVVJRCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkJLmdldEJ5Q3JpdGVyaWEobm9kZVR5cGUsIGFkZGl0aW9uYWxRdWVyeVBhcmFtcywgQ29tcG9uZW50TWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCQlpZiAoYnlVVUlELmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBmZXRjaCBieSBVVUlEIHt9IiwgbWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXRVVUlEKCkpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYnlVVUlELnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCX0KKwkJCQlTdHJpbmcgcHJldlZlcnNpb25JZCA9IChTdHJpbmcpIGJ5VVVJRC5sZWZ0KCkudmFsdWUoKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50ID0gY29tcG9uZW50T3BlcmF0aW9uCisJCQkJCQkuZ2V0Q29tcG9uZW50KHByZXZWZXJzaW9uSWQsIGluVHJhbnNhY3Rpb24pOworCQkJCWlmIChjb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHByZXZpb3VzIGNvbXBvbmVudCBieSBJRCB7fSIsIHByZXZWZXJzaW9uSWQpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlwcmV2Q29tcG9uZW50ID0gY29tcG9uZW50LmxlZnQoKS52YWx1ZSgpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBmaW5kIHByZXZpb3VzIHZlcnNpb24uIHN0YXR1cz17fSAiLCBnZXRPbGRlckNvbXBSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gZ2V0T2xkZXJDb21wUmVzdWx0OworCQkJfQorCQl9IGVsc2UgeworCQkJcHJldkNvbXBvbmVudCA9IGdldE9sZGVyQ29tcFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJfQorCisJCS8vIGlmIGxhc3QgcmVzb3VyY2UgaXMgY2VydGlmaWVkIC0gZG9uJ3QgdG91Y2ggaXQuCisJCWlmIChwcmV2Q29tcG9uZW50LmdldFZlcnNpb24oKS5lbmRzV2l0aCgiLjAiKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHByZXZDb21wb25lbnQpOworCQl9CisKKwkJcHJldkNvbXBvbmVudC5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKwkJRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQ29tcFJlc3VsdCA9IGNvbXBvbmVudE9wZXJhdGlvbi51cGRhdGVDb21wb25lbnQocHJldkNvbXBvbmVudCwKKwkJCQlpblRyYW5zYWN0aW9uKTsKKwkJaWYgKHVwZGF0ZUNvbXBSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoImZhaWxlZCB0byB1cGRhdGUgcHJldiB2ZXJzaW9uIG9mIGNvbXBvbmVudCIpOworCQkJcmV0dXJuIHVwZGF0ZUNvbXBSZXN1bHQ7CisJCX0KKworCQlVc2VyIHVzZXIgPSBuZXcgVXNlcigpOworCQl1c2VyLnNldFVzZXJJZChwcmV2Q29tcG9uZW50LmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNoYW5nZVN0YXRlUmVsYXRpb24gPSBjaGFuZ2VTdGF0ZVJlbGF0aW9uKG5vZGVUeXBlLCBwcmV2Q29tcG9uZW50LmdldFVuaXF1ZUlkKCksIHVzZXIsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIEdyYXBoRWRnZUxhYmVscy5TVEFURSk7CisJCWlmICghY2hhbmdlU3RhdGVSZWxhdGlvbi5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY2hhbmdlU3RhdGVSZWxhdGlvbik7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocHJldkNvbXBvbmVudCk7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGNoYW5nZVN0YXRlUmVsYXRpb24oTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgY29tcG9uZW50SWQsIFVzZXIgY3VycmVudE93bmVyLAorCQkJR3JhcGhFZGdlTGFiZWxzIGZyb20sIEdyYXBoRWRnZUxhYmVscyB0bykgeworCQlVbmlxdWVJZERhdGEgY29tcG9uZW50RGF0YSA9IG5ldyBVbmlxdWVJZERhdGEobm9kZVR5cGUsIGNvbXBvbmVudElkKTsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKGN1cnJlbnRPd25lci5nZXRVc2VySWQoKSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVwbGFjZVJlbGF0aW9uTGFiZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkucmVwbGFjZVJlbGF0aW9uTGFiZWwodXNlckRhdGEsIGNvbXBvbmVudERhdGEsIGZyb20sIHRvKTsKKwkJaWYgKHJlcGxhY2VSZWxhdGlvbkxhYmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5TdGF0dXMgPSByZXBsYWNlUmVsYXRpb25MYWJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byByZXBsYWNlIGxhYmVsIGZyb20ge30gdG8ge30uIHN0YXR1cyA9IHt9IiwgZnJvbSwgdG8sIHRpdGFuU3RhdHVzKTsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5DT05TSVNURU5DWTsKKwkJCWlmICghdGl0YW5TdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpKSB7CisJCQkJc3RvcmFnZVN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModGl0YW5TdGF0dXMpOworCQkJfQorCQkJcmV0dXJuIHN0b3JhZ2VTdGF0dXM7CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlbW92ZVVzZXJUb1Jlc291cmNlUmVsYXRpb24oTm9kZVR5cGVFbnVtIGNvbXBvbmVudFR5cGUsIFN0cmluZyBpZEZyb20sIFN0cmluZyBpZFRvLAorCQkJR3JhcGhFZGdlTGFiZWxzIGxhYmVsKSB7CisKKwkJVW5pcXVlSWREYXRhIGNvbXBvbmVudFYgPSBuZXcgVW5pcXVlSWREYXRhKGNvbXBvbmVudFR5cGUsIGlkVG8pOworCQlVc2VyRGF0YSB1c2VyViA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyVi5zZXRVc2VySWQoaWRGcm9tKTsKKwkJLy8gZGVsZXRlIHJlbGF0aW9uCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVsYXRpb25SZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlUmVsYXRpb24odXNlclYsCisJCQkJY29tcG9uZW50ViwgbGFiZWwpOworCQlpZiAoZGVsZXRlUmVsYXRpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBkZWxldGUgcmVsYXRpb24uIHN0YXR1cz17fSIsIGRlbGV0ZVJlbGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhkZWxldGVSZWxhdGlvblJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBjcmVhdGVVc2VyVG9SZXNvdXJjZVJlbGF0aW9uKE5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlLCBTdHJpbmcgaWRGcm9tLCBTdHJpbmcgaWRUbywKKwkJCUdyYXBoRWRnZUxhYmVscyBsYWJlbCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcykgeworCisJCVVuaXF1ZUlkRGF0YSBjb21wb25lbnRWID0gbmV3IFVuaXF1ZUlkRGF0YShjb21wb25lbnRUeXBlLCBpZFRvKTsKKwkJVXNlckRhdGEgdXNlclYgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlclYuc2V0VXNlcklkKGlkRnJvbSk7CisJCS8vIGNyZWF0ZSByZWxhdGlvbgorCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHVzZXJWLAorCQkJCWNvbXBvbmVudFYsIGxhYmVsLCBwcm9wcyk7CisJCWlmIChjcmVhdGVSZWxhdGlvblJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSByZWxhdGlvbi4gc3RhdHVzPXt9IiwgY3JlYXRlUmVsYXRpb25SZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNyZWF0ZVJlbGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjYW5jZWxPckZhaWxDZXJ0aWZpY2F0aW9uKE5vZGVUeXBlRW51bSBub2RlVHlwZSwKKwkJCUNvbXBvbmVudCBjb21wb25lbnQsIFVzZXIgbW9kaWZpZXIsIFVzZXIgb3duZXIsIExpZmVjeWNsZVN0YXRlRW51bSBuZXh0U3RhdGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJdHJ5IHsKKworCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgPSBidWlsZEZpbHRlckZvckZldGNoQ29tcG9uZW50QWZ0ZXJDaGFuZ2VTdGF0ZSgpOworCQkJcmVzdWx0ID0gdXBkYXRlQ29tcG9uZW50TUQoY29tcG9uZW50LCBtb2RpZmllciwgbmV4dFN0YXRlLCBub2RlVHlwZSwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvdWxkbid0IHNldCBsaWZlY3ljbGUgZm9yIGNvbXBvbmVudCB7fSB0byBzdGF0ZSB7fSwgZXJyb3I6IHt9IiwgY29tcG9uZW50LmdldFVuaXF1ZUlkKCksCisJCQkJCQluZXh0U3RhdGUsIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQkvLyBjYW5jZWwgY2VydGlmaWNhdGlvbiBwcm9jZXNzCisJCQlpZiAobmV4dFN0YXRlLmVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pKSB7CisJCQkJc3RhdHVzID0gc2V0UmVsYXRpb25Gb3JDYW5jZWxDZXJ0aWZpY2F0aW9uKG5leHRTdGF0ZSwgbm9kZVR5cGUsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKworCQkJfSAvLyBmYWlsIGNlcnRpZmljYXRpb24KKwkJCWVsc2UgaWYgKG5leHRTdGF0ZS5lcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTikpIHsKKwkJCQlzdGF0dXMgPSBzZXRSZWxhdGlvbkZvckZhaWxDZXJ0aWZpY2F0aW9uKG5leHRTdGF0ZSwgbm9kZVR5cGUsIGNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKwkJCX0KKworCQkJaWYgKCFzdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL05lbzRqU3RhdHVzQ29udmVydGVyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL05lbzRqU3RhdHVzQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MzFmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvTmVvNGpTdGF0dXNDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLk5lbzRqT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBOZW80alN0YXR1c0NvbnZlcnRlciB7CisKKwlwdWJsaWMgc3RhdGljIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgY29udmVydE5lbzRqU3RhdHVzVG9TdG9yYWdlU3RhdHVzKE5lbzRqT3BlcmF0aW9uU3RhdHVzIG5lbzRqU3RhdHVzKSB7CisKKwkJaWYgKG5lbzRqU3RhdHVzID09IG51bGwpIHsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKworCQlzd2l0Y2ggKG5lbzRqU3RhdHVzKSB7CisKKwkJY2FzZSBPSzoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJCWNhc2UgTk9UX0NPTk5FQ1RFRDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkNPTk5FQ1RJT05fRkFJTFVSRTsKKworCQljYXNlIE5PVF9BVVRIT1JJWkVEOgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuUEVSTUlTU0lPTl9FUlJPUjsKKworCQljYXNlIEhUVFBfUFJPVE9DT0xfRVJST1I6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5IVFRQX1BST1RPQ09MX0VSUk9SOworCQljYXNlIERCX05PVF9BVkFJTEFCTEU6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5TVE9SQUdFX05PVF9BVkFJTEFCTEU7CisJCWNhc2UgREJfUkVBRF9PTkxZOgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuUkVBRF9PTkxZX1NUT1JBR0U7CisJCWNhc2UgQkFEX1JFUVVFU1Q6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVDsKKwkJY2FzZSBMRUdBQ1lfSU5ERVhfRVJST1I6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5TVE9SQUdFX0xFR0FDWV9JTkRFWF9FUlJPUjsKKwkJY2FzZSBTQ0hFTUFfRVJST1I6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5TQ0hFTUFfRVJST1I7CisJCWNhc2UgVFJBTlNBQ1RJT05fRVJST1I6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5UUkFOU0FDVElPTl9FUlJPUjsKKwkJY2FzZSBFWEVDVVRJT05fRkFJTEVEOgorCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuRVhFVUNUSU9OX0ZBSUxFRDsKKwkJY2FzZSBFTlRJVFlfQUxSRUFEWV9FWElTVDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkVOVElUWV9BTFJFQURZX0VYSVNUUzsKKwkJY2FzZSBXUk9OR19JTlBVVDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkJBRF9SRVFVRVNUOworCQljYXNlIEdFTkVSQUxfRVJST1I6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQljYXNlIE5PVF9TVVBQT1JURUQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKKwkJY2FzZSBOT1RfRk9VTkQ6CisJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQ7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1I7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9PbmJvYXJkaW5nQ2xpZW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL09uYm9hcmRpbmdDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y4Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9PbmJvYXJkaW5nQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuV2lsZGNhcmRGaWxlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLk9uYm9hcmRpbmdDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnJlc3QuSHR0cFJlc3RDbGllbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnJlc3QuUmVzdENvbmZpZ3VyYXRpb25JbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnJlc3QuYXBpLlJlc3RSZXNwb25zZUFzQnl0ZUFycmF5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlppcFV0aWw7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgib25ib2FyZGluZy1jbGllbnQiKQorcHVibGljIGNsYXNzIE9uYm9hcmRpbmdDbGllbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9uYm9hcmRpbmdDbGllbnQuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgSHR0cFJlc3RDbGllbnQgaHR0cFJlc3RDbGllbnQgPSBudWxsOworCisJcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBkb3dubG9hZENzYXJIZWFkZXJzID0gbmV3IFByb3BlcnRpZXMoKTsKKworCXN0YXRpYyB7CisJCWRvd25sb2FkQ3NhckhlYWRlcnMucHV0KCJBY2NlcHQiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisJfQorCisJcHVibGljIE9uYm9hcmRpbmdDbGllbnQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisJCU9uYm9hcmRpbmdDbGllbnQgY3Nhck9wZXJhdGlvbiA9IG5ldyBPbmJvYXJkaW5nQ2xpZW50KCk7CisJCWNzYXJPcGVyYXRpb24uaW5pdCgpOworCisJCVN0cmluZyBjc2FyVXVpZCA9ICI3MDAyNUNGNjA4MUI0ODlDQTdCMUNCQTU4M0Q1Mjc4RCI7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBieXRlW10+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjc2FyID0gY3Nhck9wZXJhdGlvbi5nZXRDc2FyKGNzYXJVdWlkLCBudWxsKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGNzYXIubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJQFBvc3RDb25zdHJ1Y3QKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCisJCS8vIFRPRE86IHJlYWQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZyb20gT25ib2FyZGluZ0NvbmZpZworCQkvLyBvbmJvYXJkaW5nQ29uZmlnID0KKwkJLy8gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0T25ib2FyZGluZygpOworCisJCVJlc3RDb25maWd1cmF0aW9uSW5mbyByZXN0Q29uZmlndXJhdGlvbkluZm8gPSBuZXcgUmVzdENvbmZpZ3VyYXRpb25JbmZvKCk7CisJCWh0dHBSZXN0Q2xpZW50ID0gbmV3IEh0dHBSZXN0Q2xpZW50KHJlc3RDb25maWd1cmF0aW9uSW5mbyk7CisKKwkJaWYgKGZhbHNlID09IGh0dHBSZXN0Q2xpZW50LmlzSW5pdGlhbGl6ZWQoKSkgeworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJJbml0aWFsaXplUmVzdENsaWVudCIsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZXN0IGNsaWVudCIsIEVycm9yU2V2ZXJpdHkuRkFUQUwpOworCQkJaHR0cFJlc3RDbGllbnQgPSBudWxsOworCQl9CisKKwl9CisKKwkvLyBNb2NrIHJldHVybmluZyBhIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gdW50aWwgd2UgaGF2ZSBBUEkgZnJvbSBvbmJvYXJkaW5nCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBieXRlW10+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRNb2NrQ3NhcihTdHJpbmcgY3NhclV1aWQpIHsKKwkJRmlsZSBkaXIgPSBuZXcgRmlsZSgiL3Zhci90bXAvbW9ja0NzYXIiKTsKKwkJRmlsZUZpbHRlciBmaWxlRmlsdGVyID0gbmV3IFdpbGRjYXJkRmlsZUZpbHRlcigiKi5jc2FyIik7CisJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoZmlsZUZpbHRlcik7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKwkJCUZpbGUgY3NhciA9IGZpbGVzW2ldOworCQkJaWYgKGNzYXIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoY3NhclV1aWQpKSB7CisJCQkJbG9nLmRlYnVnKCJGb3VuZCBDU0FSIGZpbGUge30gbWF0Y2hpbmcgdGhlIHBhc3NlZCBjc2FyVXVpZCB7fSIsIGNzYXIuZ2V0QWJzb2x1dGVQYXRoKCksIGNzYXJVdWlkKTsKKwkJCQlieXRlW10gZGF0YTsKKwkJCQl0cnkgeworCQkJCQlkYXRhID0gRmlsZXMucmVhZEFsbEJ5dGVzKGNzYXIudG9QYXRoKCkpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJbG9nLmRlYnVnKCJFcnJvciByZWFkaW5nIG1vY2sgZmlsZSBmb3IgQ1NBUiwgZXJyb3I6IHt9IiwgZSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJCX0KKwkJCQlNYXA8U3RyaW5nLCBieXRlW10+IHJlYWRaaXAgPSBaaXBVdGlsLnJlYWRaaXAoZGF0YSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlYWRaaXApOworCQkJfQorCQl9CisJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgZmluZCBtb2NrIGZpbGUgZm9yIENTQVIgc3RhcnRpbmcgd2l0aCB7fSIsIGNzYXJVdWlkKTsKKwkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBieXRlW10+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDc2FyKFN0cmluZyBjc2FyVXVpZCwgU3RyaW5nIHVzZXJJZCkgeworCisJCWlmIChodHRwUmVzdENsaWVudCA9PSBudWxsKSB7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIlJlc3RDbGllbnQiLCAiUmVzdCBDbGllbnQgY291bGQgbm90IGJlIGluaXRpYWxpemVkIiwgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQlTdHJpbmcgdXJsID0gYnVpbGREb3dubG9hZENzYXJVcmwoKSArICIvIiArIGNzYXJVdWlkOworCisJCVByb3BlcnRpZXMgaGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCWlmIChkb3dubG9hZENzYXJIZWFkZXJzICE9IG51bGwpIHsKKwkJCWRvd25sb2FkQ3NhckhlYWRlcnMuZm9yRWFjaCgoaywgdikgLT4gaGVhZGVycy5wdXQoaywgdikpOworCQl9CisKKwkJaWYgKHVzZXJJZCAhPSBudWxsKSB7CisJCQloZWFkZXJzLnB1dChDb25zdGFudHMuVVNFUl9JRF9IRUFERVIsIHVzZXJJZCk7CisJCX0KKworCQlsb2cuZGVidWcoIlVybCBmb3IgZG93bmxvYWRpbmcgY3NhciBpcyB7fS4gSGVhZGVycyBhcmUge30iLCB1cmwsIGhlYWRlcnMpOworCisJCVJlc3RSZXNwb25zZUFzQnl0ZUFycmF5IHJlc3RSZXNwb25zZSA9IGh0dHBSZXN0Q2xpZW50LmRvR2V0QXNCeXRlQXJyYXkodXJsLCBoZWFkZXJzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBmZXRjaGluZyBjc2FyIHt9LiBIdHRwIHJldHVybiBjb2RlIGlzIHt9IiwgY3NhclV1aWQsIHJlc3RSZXNwb25zZS5nZXRIdHRwU3RhdHVzQ29kZSgpKTsKKworCQlzd2l0Y2ggKHJlc3RSZXNwb25zZS5nZXRIdHRwU3RhdHVzQ29kZSgpKSB7CisJCWNhc2UgSHR0cFN0YXR1cy5TQ19PSzoKKwkJCWJ5dGVbXSBkYXRhID0gcmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCk7CisJCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoID4gMCkgeworCQkJCU1hcDxTdHJpbmcsIGJ5dGVbXT4gcmVhZFppcCA9IFppcFV0aWwucmVhZFppcChkYXRhKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVhZFppcCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiRGF0YSByZWNlaXZlZCBmcm9tIHJlc3QgaXMgbnVsbCBvciBlbXB0eSIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJfQorCisJCWNhc2UgSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQ6CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQ1NBUl9OT1RfRk9VTkQpOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCX0KKworCXB1YmxpYyBIdHRwUmVzdENsaWVudCBnZXRIdHRwUmVzdENsaWVudCgpIHsKKwkJcmV0dXJuIGh0dHBSZXN0Q2xpZW50OworCX0KKworCXB1YmxpYyB2b2lkIHNldEh0dHBSZXN0Q2xpZW50KEh0dHBSZXN0Q2xpZW50IGh0dHBSZXN0Q2xpZW50KSB7CisJCXRoaXMuaHR0cFJlc3RDbGllbnQgPSBodHRwUmVzdENsaWVudDsKKwl9CisKKwkvKioKKwkgKiBCdWlsZCB0aGUgdXJsIGZvciBkb3dubG9hZCBDU0FSCisJICogCisJICogRS5nLiwgaHR0cDovLzEuMi4zLjQ6ODE4MS9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cy9wYWNrYWdlcy8KKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBidWlsZERvd25sb2FkQ3NhclVybCgpIHsKKworCQlPbmJvYXJkaW5nQ29uZmlnIG9uYm9hcmRpbmdDb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRPbmJvYXJkaW5nKCk7CisKKwkJU3RyaW5nIHByb3RvY29sID0gb25ib2FyZGluZ0NvbmZpZy5nZXRQcm90b2NvbCgpOworCQlTdHJpbmcgaG9zdCA9IG9uYm9hcmRpbmdDb25maWcuZ2V0SG9zdCgpOworCQlJbnRlZ2VyIHBvcnQgPSBvbmJvYXJkaW5nQ29uZmlnLmdldFBvcnQoKTsKKwkJU3RyaW5nIHVyaSA9IG9uYm9hcmRpbmdDb25maWcuZ2V0RG93bmxvYWRDc2FyVXJpKCk7CisKKwkJU3RyaW5nIGdldENzYXJVcmwgPSBwcm90b2NvbCArICI6Ly8iICsgaG9zdCArICI6IiArIHBvcnQgKyB1cmk7CisKKwkJcmV0dXJuIGdldENzYXJVcmw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1BvbGljeVR5cGVPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUG9saWN5VHlwZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODVjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1BvbGljeVR5cGVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUG9saWN5VHlwZURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUG9saWN5VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklQb2xpY3lUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUG9saWN5VHlwZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJwb2xpY3ktdHlwZS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIFBvbGljeVR5cGVPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiBpbXBsZW1lbnRzIElQb2xpY3lUeXBlT3BlcmF0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRkxPV19DT05URVhUID0gIkNyZWF0ZVBvbGljeVR5cGUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRkxPV19DT05URVhUID0gIkdldFBvbGljeVR5cGUiOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCXB1YmxpYyBQb2xpY3lUeXBlT3BlcmF0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQb2xpY3lUeXBlT3BlcmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXRlc3RQb2xpY3lUeXBlQnlUeXBlKFN0cmluZyBwb2xpY3lUeXBlTmFtZSkgeworCQlyZXR1cm4gZ2V0TGF0ZXN0UG9saWN5VHlwZUJ5VHlwZShwb2xpY3lUeXBlTmFtZSwgZmFsc2UpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXRlc3RQb2xpY3lUeXBlQnlUeXBlKFN0cmluZyB0eXBlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwQ3JpdGVyaWEgPSBuZXcgSGFzaE1hcDw+KCk7CisJCW1hcENyaXRlcmlhLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRZUEUuZ2V0UHJvcGVydHkoKSwgdHlwZSk7CisJCW1hcENyaXRlcmlhLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKworCQlyZXR1cm4gZ2V0UG9saWN5VHlwZUJ5Q3JpdGVyaWEodHlwZSwgbWFwQ3JpdGVyaWEsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UG9saWN5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFBvbGljeVR5cGUoUG9saWN5VHlwZURlZmluaXRpb24gcG9saWN5VHlwZSkgeworCQlyZXR1cm4gYWRkUG9saWN5VHlwZShwb2xpY3lUeXBlLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxQb2xpY3lUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUG9saWN5VHlwZShQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xpY3lUeXBlRGVmLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxQb2xpY3lUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclN0YXR1cyA9IGFkZFBvbGljeVR5cGVUb0dyYXBoKHBvbGljeVR5cGVEZWYpOworCisJCQlpZiAoZWl0aGVyU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZENyZWF0ZU5vZGVFcnJvcihDUkVBVEVfRkxPV19DT05URVhULAorCQkJCQkJcG9saWN5VHlwZURlZi5nZXRUeXBlKCksIGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIKKwkJCQkJCS5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkpKTsKKworCQkJfSBlbHNlIHsKKwkJCQlQb2xpY3lUeXBlRGF0YSBwb2xpY3lUeXBlRGF0YSA9IGVpdGhlclN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJCVN0cmluZyB1bmlxdWVJZCA9IHBvbGljeVR5cGVEYXRhLmdldFVuaXF1ZUlkKCk7CisJCQkJRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBwb2xpY3lUeXBlUmVzID0gdGhpcy5nZXRQb2xpY3lUeXBlKHVuaXF1ZUlkLCB0cnVlKTsKKworCQkJCWlmIChwb2xpY3lUeXBlUmVzLmlzUmlnaHQoKSkgeworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcihHRVRfRkxPV19DT05URVhULAorCQkJCQkJCXBvbGljeVR5cGVEZWYuZ2V0VHlwZSgpLCBlaXRoZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJfQorCisJCQkJcmVzdWx0ID0gcG9saWN5VHlwZVJlczsKKworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQloYW5kbGVUcmFuc2FjdGlvbkNvbW1pdFJvbGxiYWNrKGluVHJhbnNhY3Rpb24sIHJlc3VsdCk7CisJCX0KKworCX0KKworCXByaXZhdGUgRWl0aGVyPFBvbGljeVR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUG9saWN5VHlwZVRvR3JhcGgoUG9saWN5VHlwZURlZmluaXRpb24gcG9saWN5VHlwZURlZikgeworCQlsb2cuZGVidWcoIkdvdCBwb2xpY3kgdHlwZSB7fSIsIHBvbGljeVR5cGVEZWYpOworCisJCVN0cmluZyBwdFVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUG9saWN5VHlwZVVpZChwb2xpY3lUeXBlRGVmLmdldFR5cGUoKSwgcG9saWN5VHlwZURlZi5nZXRWZXJzaW9uKCkpOworCisJCVBvbGljeVR5cGVEYXRhIHBvbGljeVR5cGVEYXRhID0gYnVpbGRQb2xpY3lUeXBlRGF0YShwb2xpY3lUeXBlRGVmLCBwdFVuaXF1ZUlkKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgcG9saWN5IHR5cGUgdG8gZ3JhcGguIHBvbGljeVR5cGVEYXRhID0ge30iLCBwb2xpY3lUeXBlRGF0YSk7CisKKwkJRWl0aGVyPFBvbGljeVR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyUG9saWN5VHlwZURhdGEgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwb2xpY3lUeXBlRGF0YSwKKwkJCQlQb2xpY3lUeXBlRGF0YS5jbGFzcyk7CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYWRkaW5nIHBvbGljeSB0eXBlIHRvIGdyYXBoLiBzdGF0dXMgaXMgPSB7fSIsIGVpdGhlclBvbGljeVR5cGVEYXRhKTsKKworCQlpZiAoZWl0aGVyUG9saWN5VHlwZURhdGEuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBlaXRoZXJQb2xpY3lUeXBlRGF0YS5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcG9saWN5IHR5cGUge30gdG8gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIHBvbGljeVR5cGVEZWYuZ2V0VHlwZSgpLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJUG9saWN5VHlwZURhdGEgcmVzdWx0Q1REID0gZWl0aGVyUG9saWN5VHlwZURhdGEubGVmdCgpLnZhbHVlKCk7CisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gcG9saWN5VHlwZURlZi5nZXRQcm9wZXJ0aWVzKCk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydGllc1RvUG9saWN5VHlwZSA9IHByb3BlcnR5T3BlcmF0aW9uCisJCQkJLmFkZFByb3BlcnRpZXNUb0VsZW1lbnRUeXBlKHJlc3VsdENURC5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUG9saWN5VHlwZSwgcHJvcGVydGllcyk7CisJCWlmIChhZGRQcm9wZXJ0aWVzVG9Qb2xpY3lUeXBlLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgYWRkIHByb3BlcnRpZXMge30gdG8gcG9saWN5IHt9IiwgcHJvcGVydGllcywgcG9saWN5VHlwZURlZi5nZXRUeXBlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChhZGRQcm9wZXJ0aWVzVG9Qb2xpY3lUeXBlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoZWl0aGVyUG9saWN5VHlwZURhdGEubGVmdCgpLnZhbHVlKCkpOworCX0KKworCXB1YmxpYyBFaXRoZXI8UG9saWN5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFBvbGljeVR5cGVCeUNyaXRlcmlhKFN0cmluZyB0eXBlLAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlLmlzRW1wdHkoKSkgeworCQkJCWxvZy5lcnJvcigidHlwZSBpcyBlbXB0eSIpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxMaXN0PFBvbGljeVR5cGVEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclBvbGljeURhdGEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlBvbGljeVR5cGUsIHByb3BlcnRpZXMsIFBvbGljeVR5cGVEYXRhLmNsYXNzKTsKKwkJCWlmIChlaXRoZXJQb2xpY3lEYXRhLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlcgorCQkJCQkJLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyUG9saWN5RGF0YS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0gZWxzZSB7CisJCQkJUG9saWN5VHlwZURhdGFEZWZpbml0aW9uIGRhdGFEZWZpbml0aW9uID0gZWl0aGVyUG9saWN5RGF0YS5sZWZ0KCkudmFsdWUoKS5zdHJlYW0oKQorCQkJCQkJLm1hcChlIC0+IGUuZ2V0UG9saWN5VHlwZURhdGFEZWZpbml0aW9uKCkpLmZpbmRGaXJzdCgpLmdldCgpOworCQkJCXJlc3VsdCA9IGdldFBvbGljeVR5cGUoZGF0YURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgaW5UcmFuc2FjdGlvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWhhbmRsZVRyYW5zYWN0aW9uQ29tbWl0Um9sbGJhY2soaW5UcmFuc2FjdGlvbiwgcmVzdWx0KTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UG9saWN5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFBvbGljeVR5cGUoU3RyaW5nIHVuaXF1ZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRnVuY3Rpb248U3RyaW5nLCBFaXRoZXI8UG9saWN5VHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4gcG9saWN5VHlwZUdldHRlciA9IHVJZCAtPiBnZXRQb2xpY3lUeXBlQnlVaWQoCisJCQkJdUlkKTsKKwkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKHBvbGljeVR5cGVHZXR0ZXIsIHVuaXF1ZUlkLCBpblRyYW5zYWN0aW9uKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UG9saWN5VHlwZUJ5VWlkKFN0cmluZyB1bmlxdWVJZCkgeworCQlFaXRoZXI8UG9saWN5VHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCUVpdGhlcjxQb2xpY3lUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclBvbGljeVR5cGVEYXRhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlBvbGljeVR5cGUpLCB1bmlxdWVJZCwgUG9saWN5VHlwZURhdGEuY2xhc3MpOworCisJCWlmIChlaXRoZXJQb2xpY3lUeXBlRGF0YS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGVpdGhlclBvbGljeVR5cGVEYXRhLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiUG9saWN5IHR5cGUge30gY2Fubm90IGJlIGZvdW5kIGluIGdyYXBoLiBTdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCVBvbGljeVR5cGVEYXRhIHBvbGljeVR5cGVEYXRhID0gZWl0aGVyUG9saWN5VHlwZURhdGEubGVmdCgpLnZhbHVlKCk7CisJCVBvbGljeVR5cGVEZWZpbml0aW9uIHBvbGljeVR5cGVEZWZpbml0aW9uID0gbmV3IFBvbGljeVR5cGVEZWZpbml0aW9uKAorCQkJCXBvbGljeVR5cGVEYXRhLmdldFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbigpKTsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBwcm9wZXJ0aWVzU3RhdHVzID0gcHJvcGVydHlPcGVyYXRpb24uZmlsbFByb3BlcnRpZXModW5pcXVlSWQsCisJCQkJcHJvcExpc3QgLT4gcG9saWN5VHlwZURlZmluaXRpb24uc2V0UHJvcGVydGllcyhwcm9wTGlzdCkpOworCQlpZiAocHJvcGVydGllc1N0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggcHJvcGVydGllcyBvZiBwb2xpY3kgdHlwZSB7fSIsIHVuaXF1ZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocHJvcGVydGllc1N0YXR1cyk7CisJCX0KKworCQlyZXN1bHQgPSBFaXRoZXIubGVmdChwb2xpY3lUeXBlRGVmaW5pdGlvbik7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFBvbGljeVR5cGVEYXRhIGJ1aWxkUG9saWN5VHlwZURhdGEoUG9saWN5VHlwZURlZmluaXRpb24gcG9saWN5VHlwZURlZmluaXRpb24sIFN0cmluZyBwdFVuaXF1ZUlkKSB7CisKKwkJUG9saWN5VHlwZURhdGEgcG9saWN5VHlwZURhdGEgPSBuZXcgUG9saWN5VHlwZURhdGEocG9saWN5VHlwZURlZmluaXRpb24pOworCisJCXBvbGljeVR5cGVEYXRhLmdldFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHB0VW5pcXVlSWQpOworCQlMb25nIGNyZWF0aW9uRGF0ZSA9IHBvbGljeVR5cGVEYXRhLmdldFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbigpLmdldENyZWF0aW9uVGltZSgpOworCQlpZiAoY3JlYXRpb25EYXRlID09IG51bGwpIHsKKwkJCWNyZWF0aW9uRGF0ZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CisKKwkJcG9saWN5VHlwZURhdGEuZ2V0UG9saWN5VHlwZURhdGFEZWZpbml0aW9uKCkuc2V0Q3JlYXRpb25UaW1lKGNyZWF0aW9uRGF0ZSk7CisJCXBvbGljeVR5cGVEYXRhLmdldFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbigpLnNldE1vZGlmaWNhdGlvblRpbWUoY3JlYXRpb25EYXRlKTsKKwkJcmV0dXJuIHBvbGljeVR5cGVEYXRhOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Qcm9kdWN0T3BlcmF0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1Byb2R1Y3RPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTgxOTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Qcm9kdWN0T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDY3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jYXRlZ29yeS5DYXRlZ29yeURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jYXRlZ29yeS5Hcm91cGluZ0RhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jYXRlZ29yeS5TdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9kdWN0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkZpbHRlcktleUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC4qOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5Hcm91cGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuU3ViQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklQcm9kdWN0T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb2R1Y3RNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuU2VydmljZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Vc2VyRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5jYXRlZ29yeS5DYXRlZ29yeURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuR3JvdXBpbmdEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgicHJvZHVjdC1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIFByb2R1Y3RPcGVyYXRpb24gZXh0ZW5kcyBDb21wb25lbnRPcGVyYXRpb24gaW1wbGVtZW50cyBJUHJvZHVjdE9wZXJhdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvZHVjdE9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIFByb2R1Y3RPcGVyYXRpb24oKSB7CisJCWxvZy5kZWJ1ZygiUHJvZHVjdE9wZXJhdGlvbiBjcmVhdGVkIik7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvbmVudE1ldGFkYXRhRGF0YSBnZXRNZXRhRGF0YUZyb21Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlyZXR1cm4gZ2V0UHJvZHVjdE1ldGFkYXRhRGF0YUZyb21Qcm9kdWN0KChQcm9kdWN0KSBjb21wb25lbnQpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZ2V0UHJvZHVjdChpZCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJLy8gcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50X3R4KFN0cmluZyBpZCwKKwkvLyBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkvLyByZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZ2V0UHJvZHVjdF90eChpZCwKKwkvLyBpblRyYW5zYWN0aW9uKTsKKwkvLyB9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRCeU5hbWVBbmRWZXJzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRCeU5hbWVzQW5kVmVyc2lvbihHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwKKwkJCQluYW1lLCB2ZXJzaW9uLCBhZGRpdGlvbmFsUGFyYW1zLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMaWdodENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0TGlnaHRDb21wb25lbnQoaWQsIE5vZGVUeXBlRW51bS5Qcm9kdWN0LCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQ+IEVpdGhlcjxMaXN0PFQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRGaWx0ZXJlZENvbXBvbmVudHMoTWFwPEZpbHRlcktleUVudW0sIFN0cmluZz4gZmlsdGVycywKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0RmlsdGVyZWRDb21wb25lbnRzKGZpbHRlcnMsIGluVHJhbnNhY3Rpb24sIE5vZGVUeXBlRW51bS5Qcm9kdWN0KTsKKwl9CisKKwlwcml2YXRlIFByb2R1Y3QgY29udmVydFByb2R1Y3REYXRhVG9Qcm9kdWN0KFByb2R1Y3RNZXRhZGF0YURhdGEgcHJvZHVjdERhdGEpIHsKKwkJUHJvZHVjdE1ldGFkYXRhRGVmaW5pdGlvbiBwcm9kdWN0TWV0YWRhdGFEZWZpbml0aW9uID0gbmV3IFByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24oCisJCQkJKFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBwcm9kdWN0RGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpOworCisJCVByb2R1Y3QgcHJvZHVjdCA9IG5ldyBQcm9kdWN0KHByb2R1Y3RNZXRhZGF0YURlZmluaXRpb24pOworCisJCXJldHVybiBwcm9kdWN0OworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudChUIGNvbXBvbmVudCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSB1cGRhdGVDb21wb25lbnQoKENvbXBvbmVudCkgY29tcG9uZW50LCBpblRyYW5zYWN0aW9uLAorCQkJCXRpdGFuR2VuZXJpY0RhbywgUHJvZHVjdC5jbGFzcywgTm9kZVR5cGVFbnVtLlByb2R1Y3QpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDb21wb25lbnQoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIChFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgKEVpdGhlcjw/LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZGVsZXRlUHJvZHVjdChpZCwKKwkJCQlpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWRkaXRpb25hbEFydGlmYWN0cyhTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCWJvb2xlYW4gcmVjdXJzaXZlbHksIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsCisJCQlDbGFzczxUPiBjbGF6eikgeworCQlyZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZ2V0UHJvZHVjdChpZCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCS8qKgorCSAqIERlbGV0ZXMgdGhlIHByb2R1Y3Qgbm9kZQorCSAqLworCXB1YmxpYyBFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUHJvZHVjdChTdHJpbmcgcHJvZHVjdElkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpOworCQkJaWYgKGdyYXBoUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlcgorCQkJCQkJLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ3JhcGhSZXN1bHQucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPFByb2R1Y3RNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9kdWN0Tm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKAorCQkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUHJvZHVjdCksIHByb2R1Y3RJZCwgUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAocHJvZHVjdE5vZGUuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvZHVjdE5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgcHJvZHVjdCB7fS4gU3RhdHVzIGlzIHt9IiwgcHJvZHVjdElkLCBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBwcm9kdWN0UmVzID0gZ2V0UHJvZHVjdChwcm9kdWN0SWQsIHRydWUpOworCQkJaWYgKHByb2R1Y3RSZXMuaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBwcm9kdWN0UmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHByb2R1Y3Qge30iLCBwcm9kdWN0SWQsIHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVByb2R1Y3QgcHJvZHVjdCA9IHByb2R1Y3RSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsSW5zdGFuY2VzUmVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmRlbGV0ZUFsbENvbXBvbmVudEluc3RhbmNlcyhwcm9kdWN0SWQsIE5vZGVUeXBlRW51bS5Qcm9kdWN0LCB0cnVlKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgaW5zdGFuY2VzIHVuZGVyIHByb2R1Y3Qge30uIFJlc3VsdCBpcyB7fSIsIHByb2R1Y3RJZCwgZGVsZXRlQWxsSW5zdGFuY2VzUmVzKTsKKwkJCWlmIChkZWxldGVBbGxJbnN0YW5jZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVBbGxJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIGluc3RhbmNlcyB1bmRlciBwcm9kdWN0IHt9LiBTdGF0dXMgaXMge30iLCBwcm9kdWN0SWQsIHN0YXR1cyk7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKworCQkJRWl0aGVyPFByb2R1Y3RNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVQcm9kdWN0Tm9kZVJlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZGVsZXRlTm9kZShwcm9kdWN0Tm9kZS5sZWZ0KCkudmFsdWUoKSwgUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAoZGVsZXRlUHJvZHVjdE5vZGVSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlUHJvZHVjdE5vZGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSBwcm9kdWN0IG5vZGUge30uIFN0YXR1cyBpcyB7fSIsIHByb2R1Y3RJZCwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChwcm9kdWN0KTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoImRlbGV0ZVByb2R1Y3Qgb3BlcmF0aW9uIDogR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJkZWxldGVQcm9kdWN0IG9wZXJhdGlvbiA6IEdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UHJvZHVjdD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFByb2R1Y3RDYXRhbG9nRGF0YShib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCXRyeSB7CisJCQkvKgorCQkJICogTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCSAqIAorCQkJICogcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkKKwkJCSAqICgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQkgKiBFaXRoZXI8TGlzdDxQcm9kdWN0TWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+CisJCQkgKiBsYXN0VmVyc2lvbk5vZGVzID0gZ2V0TGFzdFZlcnNpb24oTm9kZVR5cGVFbnVtLlByb2R1Y3QsCisJCQkgKiBwcm9wZXJ0aWVzVG9NYXRjaCwgUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7IGlmCisJCQkgKiAobGFzdFZlcnNpb25Ob2Rlcy5pc1JpZ2h0KCkgJiYgbGFzdFZlcnNpb25Ob2Rlcy5yaWdodCgpLnZhbHVlKCkKKwkJCSAqICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeyByZXR1cm4KKwkJCSAqIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzCisJCQkgKiAobGFzdFZlcnNpb25Ob2Rlcy5yaWdodCgpLnZhbHVlKCkpKTsgfSBMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+CisJCQkgKiBub3RDZXJ0aWZpZWRIaWdoZXN0ID0gKGxhc3RWZXJzaW9uTm9kZXMuaXNMZWZ0KCkgPworCQkJICogbGFzdFZlcnNpb25Ob2Rlcy5sZWZ0KCkudmFsdWUoKSA6IG5ldworCQkJICogQXJyYXlMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+KCkpOworCQkJICogCisJCQkgKiBwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS4KKwkJCSAqIElTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKwkJCSAqIEVpdGhlcjxMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4KKwkJCSAqIGNvbXBvbmVudHNOb2RlcyA9CisJCQkgKiB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUHJvZHVjdCwKKwkJCSAqIHByb3BlcnRpZXNUb01hdGNoLCBQcm9kdWN0TWV0YWRhdGFEYXRhLmNsYXNzKTsgaWYKKwkJCSAqIChjb21wb25lbnRzTm9kZXMuaXNSaWdodCgpICYmIGNvbXBvbmVudHNOb2Rlcy5yaWdodCgpLnZhbHVlKCkgIT0KKwkJCSAqIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeyByZXR1cm4KKwkJCSAqIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzCisJCQkgKiAoY29tcG9uZW50c05vZGVzLnJpZ2h0KCkudmFsdWUoKSkpOyB9IExpc3Q8UHJvZHVjdE1ldGFkYXRhRGF0YT4KKwkJCSAqIGNlcnRpZmllZEhpZ2hlc3QgPSAoY29tcG9uZW50c05vZGVzLmlzTGVmdCgpID8KKwkJCSAqIGNvbXBvbmVudHNOb2Rlcy5sZWZ0KCkudmFsdWUoKSA6IG5ldworCQkJICogQXJyYXlMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+KCkpOyBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldworCQkJICogSGFzaFNldDxTdHJpbmc+KCk7IGZvciAoUHJvZHVjdE1ldGFkYXRhRGF0YSBkYXRhIDoKKwkJCSAqIG5vdENlcnRpZmllZEhpZ2hlc3QpIHsgU3RyaW5nIG5hbWUgPQorCQkJICogZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOyBuYW1lcy5hZGQobmFtZSk7IH0KKwkJCSAqIAorCQkJICogZm9yIChQcm9kdWN0TWV0YWRhdGFEYXRhIGRhdGEgOiBjZXJ0aWZpZWRIaWdoZXN0KSB7IFN0cmluZworCQkJICogcHJvZHVjdE5hbWUgPSBkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7IGlmCisJCQkgKiAoIW5hbWVzLmNvbnRhaW5zKHByb2R1Y3ROYW1lKSkgeyBub3RDZXJ0aWZpZWRIaWdoZXN0LmFkZChkYXRhKTsgfQorCQkJICogfQorCQkJICovCisJCQlFaXRoZXI8TGlzdDxQcm9kdWN0TWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGxpc3RPZkhpZ2hlc3RDb21wb25lbnRzID0gdGhpcworCQkJCQkuZ2V0TGlzdE9mSGlnaGVzdENvbXBvbmVudHMoTm9kZVR5cGVFbnVtLlByb2R1Y3QsIFByb2R1Y3RNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJaWYgKGxpc3RPZkhpZ2hlc3RDb21wb25lbnRzLmlzUmlnaHQoKQorCQkJCQkmJiBsaXN0T2ZIaWdoZXN0Q29tcG9uZW50cy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCgKKwkJCQkJCURhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMobGlzdE9mSGlnaGVzdENvbXBvbmVudHMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisKKwkJCUxpc3Q8UHJvZHVjdE1ldGFkYXRhRGF0YT4gbm90Q2VydGlmaWVkSGlnaGVzdCA9IGxpc3RPZkhpZ2hlc3RDb21wb25lbnRzLmxlZnQoKS52YWx1ZSgpOworCisJCQlMaXN0PFByb2R1Y3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCQlpZiAobm90Q2VydGlmaWVkSGlnaGVzdCAhPSBudWxsICYmIGZhbHNlID09IG5vdENlcnRpZmllZEhpZ2hlc3QuaXNFbXB0eSgpKSB7CisKKwkJCQkvLyBmZXRjaCBmcm9tIGNhY2hlCisJCQkJbG9uZyBzdGFydEZldGNoQWxsRnJvbUNhY2hlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCQlNYXA8U3RyaW5nLCBMb25nPiBjb21wb25lbnRzID0gbm90Q2VydGlmaWVkSGlnaGVzdC5zdHJlYW0oKQorCQkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCXAgLT4gcC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TGFzdFVwZGF0ZURhdGUoKSkpOworCisJCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50c0Zyb21DYWNoZUZvckNhdGFsb2cgPSB0aGlzCisJCQkJCQkuZ2V0Q29tcG9uZW50c0Zyb21DYWNoZUZvckNhdGFsb2coY29tcG9uZW50cywgQ29tcG9uZW50VHlwZUVudW0uUFJPRFVDVCk7CisJCQkJaWYgKGNvbXBvbmVudHNGcm9tQ2FjaGVGb3JDYXRhbG9nLmlzTGVmdCgpKSB7CisJCQkJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4gaW1tdXRhYmxlUGFpciA9IGNvbXBvbmVudHNGcm9tQ2FjaGVGb3JDYXRhbG9nLmxlZnQoKQorCQkJCQkJCS52YWx1ZSgpOworCQkJCQlMaXN0PENvbXBvbmVudD4gbGlzdCA9IGltbXV0YWJsZVBhaXIuZ2V0TGVmdCgpOworCQkJCQlpZiAobGlzdCAhPSBudWxsKSB7CisJCQkJCQlmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBsaXN0KSB7CisJCQkJCQkJcmVzdWx0LmFkZCgoUHJvZHVjdCkgY29tcG9uZW50KTsKKwkJCQkJCX0KKwkJCQkJCUxpc3Q8U3RyaW5nPiBhZGRlZFVpZHMgPSBsaXN0LnN0cmVhbSgpCisJCQkJCQkJCS5tYXAocCAtPiBwLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpKQorCQkJCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCQkJCW5vdENlcnRpZmllZEhpZ2hlc3QgPSBub3RDZXJ0aWZpZWRIaWdoZXN0LnN0cmVhbSgpCisJCQkJCQkJCS5maWx0ZXIocCAtPiBmYWxzZSA9PSBhZGRlZFVpZHMuY29udGFpbnMocC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSkpCisJCQkJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJCQl9CisJCQkJfQorCQkJCWxvbmcgZW5kRmV0Y2hBbGxGcm9tQ2FjaGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQlsb2cuZGVidWcoIkZldGNoIGFsbCBjYXRhbG9nIHByb2R1Y3RzIG1ldGFkYXRhIGZyb20gY2FjaGUgdG9vayB7fSBtcyIsCisJCQkJCQkoZW5kRmV0Y2hBbGxGcm9tQ2FjaGUgLSBzdGFydEZldGNoQWxsRnJvbUNhY2hlKSk7CisJCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIHByb2R1Y3RzIGFkZGVkIHRvIGNhdGFsb2cgZnJvbSBjYWNoZSBpcyB7fSIsIHJlc3VsdC5zaXplKCkpOworCisJCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIHByb2R1Y3RzIG5lZWRlZCB0byBiZSBmZXRjaCBhcyBsaWdodCBjb21wb25lbnQgaXMge30iLAorCQkJCQkJbm90Q2VydGlmaWVkSGlnaGVzdC5zaXplKCkpOworCisJCQkJZm9yIChQcm9kdWN0TWV0YWRhdGFEYXRhIGRhdGEgOiBub3RDZXJ0aWZpZWRIaWdoZXN0KSB7CisJCQkJCUVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnQgPSBnZXRMaWdodENvbXBvbmVudCgKKwkJCQkJCQlkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCBpblRyYW5zYWN0aW9uKTsKKwkJCQkJaWYgKGNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBwcm9kdWN0IGZvciBpZCA9IHt9LCBlcnJvciA6IHt9LiBza2lwIHByb2R1Y3QiLCBkYXRhLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCWNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gZ2V0IGFsbCB2ZXJzaW9ucworCQkJCQkJUHJvZHVjdCBwcm9kdWN0ID0gY29tcG9uZW50LmxlZnQoKS52YWx1ZSgpOworCQkJCQkJLy8gc2V0QWxsVmVyc2lvbnMocHJvZHVjdCk7CisKKwkJCQkJCXJlc3VsdC5hZGQocHJvZHVjdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQkJbG9nLmRlYnVnKCJGZXRjaCBhbGwgY2F0YWxvZyBwcm9kdWN0cyB0b29rIHt9IG1zIiwgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QpIHsKKwkJcmV0dXJuIGNyZWF0ZVByb2R1Y3QocHJvZHVjdCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUHJvZHVjdChQcm9kdWN0IHByb2R1Y3QsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCisJCQlQcm9kdWN0TWV0YWRhdGFEYXRhIHByb2R1Y3REYXRhID0gZ2V0UHJvZHVjdE1ldGFkYXRhRGF0YUZyb21Qcm9kdWN0KHByb2R1Y3QpOworCQkJYWRkQ29tcG9uZW50SW50ZXJuYWxGaWVsZHMocHJvZHVjdERhdGEpOworCQkJU3RyaW5nIHVuaXF1ZUlkID0gKFN0cmluZykgcHJvZHVjdERhdGEuZ2V0VW5pcXVlSWQoKTsKKwkJCWdlbmVyYXRlVVVJRChwcm9kdWN0KTsKKworCQkJU3RyaW5nIHVzZXJJZCA9IHByb2R1Y3QuZ2V0Q3JlYXRvclVzZXJJZCgpOworCisJCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kVXNlciA9IGZpbmRVc2VyKHVzZXJJZCk7CisKKwkJCWlmIChmaW5kVXNlci5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kVXNlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJDYW5ub3QgZmluZCB1c2VyIHt9IGluIHRoZSBncmFwaC4gc3RhdHVzIGlzIHt9IiwgdXNlcklkLCBzdGF0dXMpOworCQkJCXJldHVybiBzZW5kRXJyb3Ioc3RhdHVzLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKTsKKwkJCX0KKworCQkJVXNlckRhdGEgY3JlYXRvclVzZXJEYXRhID0gZmluZFVzZXIubGVmdCgpLnZhbHVlKCk7CisJCQlVc2VyRGF0YSB1cGRhdGVyVXNlckRhdGEgPSBjcmVhdG9yVXNlckRhdGE7CisJCQlTdHJpbmcgdXBkYXRlclVzZXJJZCA9IHByb2R1Y3QuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKTsKKwkJCWlmICh1cGRhdGVyVXNlcklkICE9IG51bGwgJiYgIXVwZGF0ZXJVc2VySWQuZXF1YWxzKHVzZXJJZCkpIHsKKwkJCQlmaW5kVXNlciA9IGZpbmRVc2VyKHVwZGF0ZXJVc2VySWQpOworCQkJCWlmIChmaW5kVXNlci5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFVzZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIHVzZXIge30gaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMge30iLCB1c2VySWQsIHN0YXR1cyk7CisJCQkJCXJldHVybiBzZW5kRXJyb3Ioc3RhdHVzLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKTsKKwkJCQl9IGVsc2UgeworCQkJCQl1cGRhdGVyVXNlckRhdGEgPSBmaW5kVXNlci5sZWZ0KCkudmFsdWUoKTsKKwkJCQl9CisJCQl9CisKKwkJCWxvZy50cmFjZSgiQ3JlYXRpbmcgdGFncyBmb3IgcHJvZHVjdCB7fSIsIHVuaXF1ZUlkKTsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVRhZ3NGb3JDb21wb25lbnQocHJvZHVjdCk7CisJCQlpZiAoc3RvcmFnZU9wZXJhdGlvblN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlT3BlcmF0aW9uU3RhdHVzKTsKKwkJCX0KKworCQkJbG9nLnRyYWNlKCJGaW5kaW5nIGdyb3VwaW5ncyBmb3IgcHJvZHVjdCB7fSIsIHVuaXF1ZUlkKTsKKwkJCUVpdGhlcjxMaXN0PEdyb3VwaW5nRGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGZpbmRHcm91cGluZ3NGb3JDb21wb25lbnQgPSBmaW5kR3JvdXBpbmdzRm9yQ29tcG9uZW50KAorCQkJCQlOb2RlVHlwZUVudW0uUHJvZHVjdEdyb3VwaW5nLCBwcm9kdWN0KTsKKwkJCWlmIChmaW5kR3JvdXBpbmdzRm9yQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZmluZEdyb3VwaW5nc0ZvckNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJTGlzdDxHcm91cGluZ0RhdGE+IGdyb3VwaW5nRGF0YVRvQXNzb2NpYXRlID0gZmluZEdyb3VwaW5nc0ZvckNvbXBvbmVudC5sZWZ0KCkudmFsdWUoKTsKKworCQkJbG9nLmRlYnVnKCJ0cnkgdG8gY3JlYXRlIHByb2R1Y3Qgbm9kZSBvbiBncmFwaCBmb3IgaWQge30iLCB1bmlxdWVJZCk7CisJCQlFaXRoZXI8UHJvZHVjdE1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9kdWN0RGF0YSwKKwkJCQkJUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAoY3JlYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjcmVhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZXJyb3IoIkVycm9yIHJldHVybmVkIGFmdGVyIGNyZWF0aW5nIHByb2R1Y3QgZGF0YSBub2RlIHt9LiBTdGF0dXMgcmV0dXJuZWQgaXMge30iLCBwcm9kdWN0RGF0YSwKKwkJCQkJCXN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygicHJvZHVjdCBub2RlIGNyZWF0ZWQgb24gZ3JhcGggZm9yIGlkIHt9IiwgcHJvZHVjdERhdGEuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZU1ldGFkYXRhID0gYXNzb2NpYXRlTWV0YWRhdGFUb0NvbXBvbmVudChwcm9kdWN0RGF0YSwgY3JlYXRvclVzZXJEYXRhLAorCQkJCQl1cGRhdGVyVXNlckRhdGEsIG51bGwsIG51bGwpOworCQkJaWYgKGFzc29jaWF0ZU1ldGFkYXRhICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYXNzb2NpYXRlTWV0YWRhdGEpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVDYXRlZ29yaWVzID0gYXNzb2NpYXRlQ2F0ZWdvcmllc1RvUHJvZHVjdChwcm9kdWN0RGF0YSwKKwkJCQkJZ3JvdXBpbmdEYXRhVG9Bc3NvY2lhdGUpOworCQkJaWYgKGFzc29jaWF0ZUNhdGVnb3JpZXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVDYXRlZ29yaWVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJcmVzdWx0ID0gZ2V0UHJvZHVjdCh1bmlxdWVJZCwgdHJ1ZSk7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiQ2Fubm90IGdldCBmdWxsIHByb2R1Y3QgZnJvbSB0aGUgZ3JhcGguIHN0YXR1cyBpcyB7fSIsIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCVN0cmluZyBqc29uID0gcHJldHR5SnNvbi50b0pzb24ocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQlsb2cuZGVidWcoIlByb2R1Y3QgcmV0cmlldmVkIGlzIHt9IiwganNvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVDYXRlZ29yaWVzVG9Qcm9kdWN0KFByb2R1Y3RNZXRhZGF0YURhdGEgcHJvZHVjdERhdGEsCisJCQlMaXN0PEdyb3VwaW5nRGF0YT4gZ3JvdXBpbmdEYXRhVG9Bc3NvY2lhdGUpIHsKKwkJZm9yIChHcm91cGluZ0RhdGEgZ3JvdXBpbmdEYXRhIDogZ3JvdXBpbmdEYXRhVG9Bc3NvY2lhdGUpIHsKKwkJCUdyYXBoRWRnZUxhYmVscyBncm91cGluZ0xhYmVsID0gR3JhcGhFZGdlTGFiZWxzLkNBVEVHT1JJWkVEX1RPOworCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocHJvZHVjdERhdGEsCisJCQkJCWdyb3VwaW5nRGF0YSwgZ3JvdXBpbmdMYWJlbCwgbnVsbCk7CisJCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIGdyb3VwaW5nIHt9IHRvIHByb2R1Y3Qge30uIEVkZ2UgdHlwZSBpcyB7fSIsIGdyb3VwaW5nRGF0YSwgcHJvZHVjdERhdGEsCisJCQkJCWdyb3VwaW5nTGFiZWwpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0KKwkJfQorCQlsb2cudHJhY2UoIkFsbCBncm91cGluZ3MgYXNzb2NpYXRlZCBzdWNjZXNmdWxseSB0byBwcm9kdWN0IHt9IiwgcHJvZHVjdERhdGEpOworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBkaXNzb2NpYXRlQ2F0ZWdvcmllc0Zyb21Qcm9kdWN0KFByb2R1Y3RNZXRhZGF0YURhdGEgcHJvZHVjdERhdGEsCisJCQlMaXN0PEdyb3VwaW5nRGF0YT4gZ3JvdXBpbmdEYXRhVG9EaXNzb2NpYXRlKSB7CisJCWZvciAoR3JvdXBpbmdEYXRhIGdyb3VwaW5nRGF0YSA6IGdyb3VwaW5nRGF0YVRvRGlzc29jaWF0ZSkgeworCQkJR3JhcGhFZGdlTGFiZWxzIGdyb3VwaW5nTGFiZWwgPSBHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUklaRURfVE87CisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVSZWxhdGlvbihwcm9kdWN0RGF0YSwKKwkJCQkJZ3JvdXBpbmdEYXRhLCBncm91cGluZ0xhYmVsKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGlzc29jaWF0aW5nIGdyb3VwaW5nIHt9IGZyb20gcHJvZHVjdCB7fS4gRWRnZSB0eXBlIGlzIHt9IiwgZ3JvdXBpbmdEYXRhLCBwcm9kdWN0RGF0YSwKKwkJCQkJZ3JvdXBpbmdMYWJlbCk7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCXJldHVybiByZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJfQorCQl9CisJCWxvZy50cmFjZSgiQWxsIGdyb3VwaW5ncyBkaXNzb2NpYXRlZCBzdWNjZXNmdWxseSBmcm9tIHByb2R1Y3Qge30iLCBwcm9kdWN0RGF0YSk7CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRQcm9kdWN0KFN0cmluZyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3ID0gbmV3IENvbXBvbmVudFBhcmFtZXRlcnNWaWV3KCk7CisJCXJldHVybiBnZXRQcm9kdWN0KHVuaXF1ZUlkLCBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgaW5UcmFuc2FjdGlvbik7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UHJvZHVjdChTdHJpbmcgdW5pcXVlSWQsCisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCVByb2R1Y3QgcHJvZHVjdCA9IG51bGw7CisJCUVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCisJCQlOb2RlVHlwZUVudW0gcHJvZHVjdE5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlByb2R1Y3Q7CisJCQlOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSA9IE5vZGVUeXBlRW51bS5TZXJ2aWNlOworCisJCQlFaXRoZXI8UHJvZHVjdE1ldGFkYXRhRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50QnlMYWJlbCA9IGdldENvbXBvbmVudEJ5TGFiZWxBbmRJZCh1bmlxdWVJZCwKKwkJCQkJcHJvZHVjdE5vZGVUeXBlLCBQcm9kdWN0TWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChnZXRDb21wb25lbnRCeUxhYmVsLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChnZXRDb21wb25lbnRCeUxhYmVsLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVByb2R1Y3RNZXRhZGF0YURhdGEgcHJvZHVjdERhdGEgPSBnZXRDb21wb25lbnRCeUxhYmVsLmxlZnQoKS52YWx1ZSgpOworCisJCQkvLyBUcnkgdG8gZmV0Y2ggcmVzb3VyY2UgZnJvbSB0aGUgY2FjaGUuIFRoZSByZXNvdXJjZSB3aWxsIGJlCisJCQkvLyBmZXRjaGVkIG9ubHkgaWYgdGhlIHRpbWUgb24gdGhlIGNhY2hlIGVxdWFscyB0bworCQkJLy8gdGhlIHRpbWUgb24gdGhlIGdyYXBoLgorCQkJRWl0aGVyPFByb2R1Y3QsIEFjdGlvblN0YXR1cz4gY29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZSA9IHRoaXMuZ2V0Q29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZSh1bmlxdWVJZCwKKwkJCQkJcHJvZHVjdERhdGEsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBQcm9kdWN0LmNsYXNzLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKTsKKwkJCWlmIChjb21wb25lbnRGcm9tQ2FjaGVJZlVwVG9EYXRlLmlzTGVmdCgpKSB7CisJCQkJUHJvZHVjdCBjYWNoZWRQcm9kdWN0ID0gY29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlByb2R1Y3Qge30gd2l0aCB1aWQge30gd2FzIGZldGNoZWQgZnJvbSBjYWNoZS4iLCBjYWNoZWRQcm9kdWN0LmdldE5hbWUoKSwKKwkJCQkJCWNhY2hlZFByb2R1Y3QuZ2V0VW5pcXVlSWQoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhY2hlZFByb2R1Y3QpOworCQkJfQorCisJCQlwcm9kdWN0ID0gY29udmVydFByb2R1Y3REYXRhVG9Qcm9kdWN0KHByb2R1Y3REYXRhKTsKKworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gbnVsbDsKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZVVzZXJzKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRDb21wb25lbnRDcmVhdG9yRnJvbUdyYXBoKHByb2R1Y3QsIHVuaXF1ZUlkLCBwcm9kdWN0Tm9kZVR5cGUpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50TGFzdE1vZGlmaWVyRnJvbUdyYXBoKHByb2R1Y3QsIHVuaXF1ZUlkLCBwcm9kdWN0Tm9kZVR5cGUpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCQl9CisJCQl9CisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVDYXRlZ29yaWVzKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRDb21wb25lbnRDYXRlZ29yaWVzRnJvbUdyYXBoKHByb2R1Y3QpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVDb21wb25lbnRJbnN0YW5jZXMoKQorCQkJCQl8fCBmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMoKQorCQkJCQl8fCBmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNhcGFiaWxpdGllcygpCisJCQkJCXx8IGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlUmVxdWlyZW1lbnRzKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRDb21wb25lbnRJbnN0YW5jZXNGcm9tR3JhcGgodW5pcXVlSWQsIHByb2R1Y3QsIHByb2R1Y3ROb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKworCQkJCX0KKwkJCX0KKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMoKSkgeworCQkJCXN0YXR1cyA9IHNldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHByb2R1Y3QpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQ2FwYWJpbGl0aWVzKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRDYXBhYmlsaXRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHByb2R1Y3QsIE5vZGVUeXBlRW51bS5Qcm9kdWN0KTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZVJlcXVpcmVtZW50cygpKSB7CisJCQkJc3RhdHVzID0gc2V0UmVxdWlyZW1lbnRzRnJvbUdyYXBoKHVuaXF1ZUlkLCBwcm9kdWN0LCBOb2RlVHlwZUVudW0uUHJvZHVjdCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUFsbFZlcnNpb25zKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRBbGxWZXJzaW9ucyhwcm9kdWN0KTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHByb2R1Y3QpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gcHJpdmF0ZSBFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UHJvZHVjdF90eChTdHJpbmcKKwkvLyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJLy8gUHJvZHVjdCBwcm9kdWN0ID0gbnVsbDsKKwkvLyBFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkvLyB0cnkgeworCS8vCisJLy8gTm9kZVR5cGVFbnVtIHByb2R1Y3ROb2RlVHlwZSA9IE5vZGVUeXBlRW51bS5Qcm9kdWN0OworCS8vIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlNlcnZpY2U7CisJLy8KKwkvLyBFaXRoZXI8UHJvZHVjdE1ldGFkYXRhRGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50QnlMYWJlbCA9CisJLy8gZ2V0Q29tcG9uZW50QnlMYWJlbEFuZElkX3R4KHVuaXF1ZUlkLCBwcm9kdWN0Tm9kZVR5cGUsCisJLy8gUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJLy8gaWYgKGdldENvbXBvbmVudEJ5TGFiZWwuaXNSaWdodCgpKSB7CisJLy8gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGdldENvbXBvbmVudEJ5TGFiZWwucmlnaHQoKS52YWx1ZSgpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLyBQcm9kdWN0TWV0YWRhdGFEYXRhIHByb2R1Y3REYXRhID0gZ2V0Q29tcG9uZW50QnlMYWJlbC5sZWZ0KCkudmFsdWUoKTsKKwkvLyBwcm9kdWN0ID0gY29udmVydFByb2R1Y3REYXRhVG9Qcm9kdWN0KHByb2R1Y3REYXRhKTsKKwkvLworCS8vIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHNldENvbXBvbmVudENyZWF0b3JGcm9tR3JhcGgocHJvZHVjdCwKKwkvLyB1bmlxdWVJZCwgcHJvZHVjdE5vZGVUeXBlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENvbXBvbmVudExhc3RNb2RpZmllckZyb21HcmFwaChwcm9kdWN0LCB1bmlxdWVJZCwKKwkvLyBwcm9kdWN0Tm9kZVR5cGUpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXN1bHQgPQorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8KKwkvLyB9CisJLy8gc3RhdHVzID0gc2V0Q29tcG9uZW50Q2F0ZWdvcmllc0Zyb21HcmFwaChwcm9kdWN0KTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENvbXBvbmVudEluc3RhbmNlc0Zyb21HcmFwaCh1bmlxdWVJZCwgcHJvZHVjdCwKKwkvLyBwcm9kdWN0Tm9kZVR5cGUsIGNvbXBJbnN0Tm9kZVR5cGUpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXN1bHQgPQorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCBwcm9kdWN0KTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENhcGFiaWxpdGllc0Zyb21HcmFwaCh1bmlxdWVJZCwgcHJvZHVjdCwKKwkvLyBOb2RlVHlwZUVudW0uUHJvZHVjdCk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9CisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRSZXF1aXJlbWVudHNGcm9tR3JhcGgoIHVuaXF1ZUlkLCBwcm9kdWN0LAorCS8vIE5vZGVUeXBlRW51bS5Qcm9kdWN0KTs7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9CisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLyB9CisJLy8KKwkvLworCS8vIHN0YXR1cyA9IHNldEFsbFZlcnNpb25zKHByb2R1Y3QpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyB9CisJLy8KKwkvLyByZXN1bHQgPSBFaXRoZXIubGVmdChwcm9kdWN0KTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vCisJLy8gfSBmaW5hbGx5IHsKKwkvLyBpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCS8vIGlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJLy8gdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJLy8gfSBlbHNlIHsKKwkvLyB0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJLy8gfQorCS8vIH0KKwkvLyB9CisJLy8gfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRBbGxWZXJzaW9ucyhQcm9kdWN0IHByb2R1Y3QpIHsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFN0cmluZz4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXMgPSBnZXRWZXJzaW9uTGlzdChOb2RlVHlwZUVudW0uUHJvZHVjdCwKKwkJCQlwcm9kdWN0LmdldFZlcnNpb24oKSwgcHJvZHVjdCwgUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChyZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gcmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlwcm9kdWN0LnNldEFsbFZlcnNpb25zKHJlcy5sZWZ0KCkudmFsdWUoKSk7CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZW5kRXJyb3IoVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzLAorCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXNJZk5vdEZvdW5kKSB7CisJCUVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQ7CisJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzSWZOb3RGb3VuZCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJQE92ZXJyaWRlCisJVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0Q29tcG9uZW50Q2F0ZWdvcmllc0Zyb21HcmFwaChDb21wb25lbnQgY29tcG9uZW50KSB7CisJCVByb2R1Y3QgcHJvZHVjdCA9IChQcm9kdWN0KSBjb21wb25lbnQ7CisJCS8vIEJ1aWxkaW5nIHRoZSBjYXQtPnN1YmNhdC0+Z3JvdXBpbmcgdHJpcGxlcworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEdyb3VwaW5nRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlByb2R1Y3QpLCBwcm9kdWN0LmdldFVuaXF1ZUlkKCksCisJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUklaRURfVE8sIE5vZGVUeXBlRW51bS5Qcm9kdWN0R3JvdXBpbmcsIEdyb3VwaW5nRGF0YS5jbGFzcyk7CisJCWlmIChjaGlsZHJlbk5vZGVzLmlzUmlnaHQoKSkgeworCQkJaWYgKGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCWxvZy5kZWJ1ZygiRXJyb3Igd2hlbiBmaW5kaW5nIGdyb3VwaW5ncyBmb3IgdGhpcyBwcm9kdWN0LCBlcnJvciB7fSIsIGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiTm8gZ3JvdXBpbmdzIGZvdW5kIGZvciB0aGlzIHByb2R1Y3QgLSB0aGlzIG1pZ2h0IGJlIG5vcm1hbCIpOworCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJfQorCQlNYXA8Q2F0ZWdvcnlEZWZpbml0aW9uLCBNYXA8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4+PiBjYXRlZ29yaWVzRGF0YVN0cnVjdHVyZSA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlMaXN0PEltbXV0YWJsZVBhaXI8R3JvdXBpbmdEYXRhLCBHcmFwaEVkZ2U+PiB2YWx1ZUxpc3QgPSBjaGlsZHJlbk5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQlmb3IgKEltbXV0YWJsZVBhaXI8R3JvdXBpbmdEYXRhLCBHcmFwaEVkZ2U+IGdyb3VwUGFpciA6IHZhbHVlTGlzdCkgeworCQkJR3JvdXBpbmdEYXRhIGdyb3VwaW5nRGF0YSA9IGdyb3VwUGFpci5nZXRMZWZ0KCk7CisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnRTdWJDYXQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLmdldFBhcmVudE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlByb2R1Y3RHcm91cGluZyksCisJCQkJCQkJKFN0cmluZykgZ3JvdXBpbmdEYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5HUk9VUElORywKKwkJCQkJCQlOb2RlVHlwZUVudW0uUHJvZHVjdFN1YmNhdGVnb3J5LCBTdWJDYXRlZ29yeURhdGEuY2xhc3MpOworCQkJaWYgKHBhcmVudFN1YkNhdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNhbm5vdCBmaW5kIHN1YmNhdGVnb3J5IGZvciBncm91cGluZyB7fSIsIGdyb3VwaW5nRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlyZXR1cm4gcGFyZW50U3ViQ2F0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCX0KKwkJCVN1YkNhdGVnb3J5RGF0YSBzdWJDYXREYXRhID0gcGFyZW50U3ViQ2F0LmxlZnQoKS52YWx1ZSgpLmdldExlZnQoKTsKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmVudENhdCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZ2V0UGFyZW50Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUHJvZHVjdFN1YmNhdGVnb3J5KSwKKwkJCQkJCQkoU3RyaW5nKSBzdWJDYXREYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5TVUJfQ0FURUdPUlksCisJCQkJCQkJTm9kZVR5cGVFbnVtLlByb2R1Y3RDYXRlZ29yeSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJCWlmIChwYXJlbnRDYXQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDYW5ub3QgZmluZCBjYXRlZ29yeSBmb3Igc3ViY2F0ZWdvcnkge30iLCBzdWJDYXREYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJCXJldHVybiBwYXJlbnRDYXQucmlnaHQoKS52YWx1ZSgpOworCQkJfQorCisJCQkvLyBCdWlsZGluZyBkYXRhIHN0cnVjdHVyZSBvZiBjYXRlZ29yaWVzIGhpZXJhcmNoeQorCQkJQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24gPSBwYXJlbnRDYXQubGVmdCgpLnZhbHVlKCkuZ2V0TGVmdCgpLmdldENhdGVnb3J5RGF0YURlZmluaXRpb24oKTsKKwkJCVN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gc3ViRGVmaW5pdGlvbiA9IHN1YkNhdERhdGEuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpOworCQkJR3JvdXBpbmdEYXRhRGVmaW5pdGlvbiBncm91cGluZ0RlZmluaXRpb24gPSBncm91cGluZ0RhdGEuZ2V0R3JvdXBpbmdEYXRhRGVmaW5pdGlvbigpOworCisJCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWYgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKGNhdGVnb3J5RGVmaW5pdGlvbik7CisJCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViRGVmID0gbmV3IFN1YkNhdGVnb3J5RGVmaW5pdGlvbihzdWJEZWZpbml0aW9uKTsKKwkJCUdyb3VwaW5nRGVmaW5pdGlvbiBncm91cGluZ0RlZiA9IG5ldyBHcm91cGluZ0RlZmluaXRpb24oZ3JvdXBpbmdEZWZpbml0aW9uKTsKKworCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGb3VuZCBjYXRlZ29yeSB7fSAtPiBzdWJjYXRlZ29yeSB7fSAtPiBncm91cGluZyB7fSBmb3IgcHJvZHVjdCB7fSIsCQkJCisJCQkJCWNhdGVnb3J5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBzdWJDYXREYXRhLmdldFVuaXF1ZUlkKCksIGdyb3VwaW5nRGF0YS5nZXRVbmlxdWVJZCgpLAorCQkJCQlwcm9kdWN0LmdldFVuaXF1ZUlkKCkpOworCQkJfQorCQkJTWFwPFN1YkNhdGVnb3J5RGVmaW5pdGlvbiwgTGlzdDxHcm91cGluZ0RlZmluaXRpb24+PiBzdWJNYXAgPSBjYXRlZ29yaWVzRGF0YVN0cnVjdHVyZS5nZXQoY2F0ZWdvcnlEZWYpOworCQkJaWYgKHN1Yk1hcCA9PSBudWxsKSB7CisJCQkJc3ViTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQkJCWNhdGVnb3JpZXNEYXRhU3RydWN0dXJlLnB1dChjYXRlZ29yeURlZiwgc3ViTWFwKTsKKwkJCX0KKwkJCUxpc3Q8R3JvdXBpbmdEZWZpbml0aW9uPiBncm91cExpc3QgPSBzdWJNYXAuZ2V0KHN1YkRlZik7CisJCQlpZiAoZ3JvdXBMaXN0ID09IG51bGwpIHsKKwkJCQlncm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQlzdWJNYXAucHV0KHN1YkRlZiwgZ3JvdXBMaXN0KTsKKwkJCX0KKwkJCWdyb3VwTGlzdC5hZGQoZ3JvdXBpbmdEZWYpOworCQl9CisJCWNvbnZlcnRUb0NhdGVnb3JpZXNMaXN0KHByb2R1Y3QsIGNhdGVnb3JpZXNEYXRhU3RydWN0dXJlKTsKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgdm9pZCBjb252ZXJ0VG9DYXRlZ29yaWVzTGlzdChQcm9kdWN0IHByb2R1Y3QsCisJCQlNYXA8Q2F0ZWdvcnlEZWZpbml0aW9uLCBNYXA8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4+PiBjYXRlZ29yaWVzRGF0YVN0cnVjdHVyZSkgeworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcnlEYXRhTGlzdCA9IHByb2R1Y3QuZ2V0Q2F0ZWdvcmllcygpOworCQlpZiAoY2F0ZWdvcnlEYXRhTGlzdCA9PSBudWxsKSB7CisJCQljYXRlZ29yeURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxDYXRlZ29yeURlZmluaXRpb24+KCk7CisJCX0KKwkJZm9yIChFbnRyeTxDYXRlZ29yeURlZmluaXRpb24sIE1hcDxTdWJDYXRlZ29yeURlZmluaXRpb24sIExpc3Q8R3JvdXBpbmdEZWZpbml0aW9uPj4+IHRyaXBsZSA6IGNhdGVnb3JpZXNEYXRhU3RydWN0dXJlCisJCQkJLmVudHJ5U2V0KCkpIHsKKwkJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZmluaXRpb24gPSB0cmlwbGUuZ2V0S2V5KCk7CisJCQlMaXN0PFN1YkNhdGVnb3J5RGVmaW5pdGlvbj4gc3ViTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJY2F0ZWdvcnlEZWZpbml0aW9uLnNldFN1YmNhdGVnb3JpZXMoc3ViTGlzdCk7CisJCQlNYXA8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4+IHZhbHVlID0gdHJpcGxlLmdldFZhbHVlKCk7CisKKwkJCWZvciAoRW50cnk8U3ViQ2F0ZWdvcnlEZWZpbml0aW9uLCBMaXN0PEdyb3VwaW5nRGVmaW5pdGlvbj4+IHBhaXIgOiB2YWx1ZS5lbnRyeVNldCgpKSB7CisJCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIHN1YkNhdGVnb3J5RGVmaW5pdGlvbiA9IHBhaXIuZ2V0S2V5KCk7CisJCQkJTGlzdDxHcm91cGluZ0RlZmluaXRpb24+IGxpc3QgPSBwYWlyLmdldFZhbHVlKCk7CisJCQkJc3ViTGlzdC5hZGQoc3ViQ2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJCQlzdWJDYXRlZ29yeURlZmluaXRpb24uc2V0R3JvdXBpbmdzKGxpc3QpOworCQkJfQorCQkJY2F0ZWdvcnlEYXRhTGlzdC5hZGQoY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJfQorCQlwcm9kdWN0LnNldENhdGVnb3JpZXMoY2F0ZWdvcnlEYXRhTGlzdCk7CisJCWxvZy5kZWJ1ZygiRmV0Y2hlZCBjYXRlZ29yaWVzIGZvciBwcm9kdWN0IHt9LCBjYXRlZ29yaWVzOiB7fSIsIHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSwKKwkJCQlBcnJheXMudG9TdHJpbmcoY2F0ZWdvcnlEYXRhTGlzdC50b0FycmF5KCkpKTsKKwl9CisKKwlwcml2YXRlIFByb2R1Y3RNZXRhZGF0YURhdGEgZ2V0UHJvZHVjdE1ldGFkYXRhRGF0YUZyb21Qcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCkgeworCQlQcm9kdWN0TWV0YWRhdGFEYXRhIHByb2R1Y3RNZXRhZGF0YSA9IG5ldyBQcm9kdWN0TWV0YWRhdGFEYXRhKAorCQkJCShQcm9kdWN0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgcHJvZHVjdC5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpOworCQlyZXR1cm4gcHJvZHVjdE1ldGFkYXRhOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzQ29tcG9uZW50RXhpc3QoU3RyaW5nIGlkKSB7CisJCXJldHVybiBpc0NvbXBvbmVudEV4aXN0KGlkLCBOb2RlVHlwZUVudW0uUHJvZHVjdCk7CisJfQorCisJLy8gQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2xvbmVDb21wb25lbnQoVCBvdGhlciwKKwkvLyBTdHJpbmcgdmVyc2lvbiwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJLy8gcmV0dXJuIChFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGNsb25lUHJvZHVjdCgoUHJvZHVjdClvdGhlciwKKwkvLyB2ZXJzaW9uLCBpblRyYW5zYWN0aW9uKTsKKwkvLyB9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNvbXBvbmVudChUIG90aGVyLCBTdHJpbmcgdmVyc2lvbiwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSB0YXJnZXRMaWZlY3ljbGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgY2xvbmVQcm9kdWN0KChQcm9kdWN0KSBvdGhlciwgdmVyc2lvbiwgdGFyZ2V0TGlmZWN5Y2xlLAorCQkJCWluVHJhbnNhY3Rpb24pOworCX0KKworCXByaXZhdGUgRWl0aGVyPFByb2R1Y3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lUHJvZHVjdChQcm9kdWN0IG90aGVyLCBTdHJpbmcgdmVyc2lvbiwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSB0YXJnZXRMaWZlY3ljbGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJU3RyaW5nIG9yaWdQcm9kdWN0SWQgPSBvdGhlci5nZXRVbmlxdWVJZCgpOworCQkJb3RoZXIuc2V0VmVyc2lvbih2ZXJzaW9uKTsKKwkJCW90aGVyLnNldFVuaXF1ZUlkKG51bGwpOworCisJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY291bnRlclN0YXR1cyA9IGdldENvbXBvbmVudEluc3RhbmNlQ291dG5lcihvcmlnUHJvZHVjdElkLAorCQkJCQlOb2RlVHlwZUVudW0uUHJvZHVjdCk7CisJCQlpZiAoY291bnRlclN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNvdW50ZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCByZXNvdXJjZSBpbnN0YW5jZSBjb3VudGVyIG9uIHByb2R1Y3Qge30uIHN0YXR1cz17fSIsIG9yaWdQcm9kdWN0SWQsCisJCQkJCQljb3VudGVyU3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUHJvZHVjdE1EID0gY3JlYXRlUHJvZHVjdChvdGhlciwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoY3JlYXRlUHJvZHVjdE1ELmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlUHJvZHVjdE1ELnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBjbG9uZSBwcm9kdWN0LiBzdGF0dXM9IHt9Iiwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJUHJvZHVjdCBwcm9kdWN0ID0gY3JlYXRlUHJvZHVjdE1ELmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTWFwPFN0cmluZywgU3RyaW5nPj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lSW5zdGFuY2VzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uY2xvbmVBbGxDb21wb25lbnRJbnN0YW5jZXNGcm9tQ29udGFpbmVyQ29tcG9uZW50KG9yaWdQcm9kdWN0SWQsIHByb2R1Y3QsCisJCQkJCU5vZGVUeXBlRW51bS5Qcm9kdWN0LCBOb2RlVHlwZUVudW0uU2VydmljZSwgdGFyZ2V0TGlmZWN5Y2xlLCBudWxsKTsKKwkJCWlmIChjbG9uZUluc3RhbmNlcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoY2xvbmVJbnN0YW5jZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2V0UmVzb3VyY2VJbnN0YW5jZUNvdW50ZXIgPSBzZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIoCisJCQkJCXByb2R1Y3QuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlByb2R1Y3QsIGNvdW50ZXJTdGF0dXMubGVmdCgpLnZhbHVlKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHNldFJlc291cmNlSW5zdGFuY2VDb3VudGVyLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gc2V0UmVzb3VyY2VJbnN0YW5jZUNvdW50ZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIHNldCByZXNvdXJjZSBpbnN0YW5jZSBjb3VudGVyIG9uIHByb2R1Y3Qge30uIHN0YXR1cz17fSIsIHByb2R1Y3QuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCXNldFJlc291cmNlSW5zdGFuY2VDb3VudGVyKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSB0aGlzLmdldFByb2R1Y3QocHJvZHVjdC5nZXRVbmlxdWVJZCgpLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJDYW5ub3QgZ2V0IGZ1bGwgcHJvZHVjdCBmcm9tIHRoZSBncmFwaC4gc3RhdHVzIGlzIHt9IiwgcmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJU3RyaW5nIGpzb24gPSBwcmV0dHlKc29uLnRvSnNvbihyZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJCWxvZy5kZWJ1ZygiUHJvZHVjdCByZXRyaWV2ZWQgaXMge30iLCBqc29uKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UHJvZHVjdCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QnlOYW1lc0FuZFZlcnNpb24oU3RyaW5nIG5hbWVLZXksIFN0cmluZyBuYW1lVmFsdWUsCisJCQlTdHJpbmcgdmVyc2lvbiwgTWFwPFN0cmluZywgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQobmFtZUtleSwgbmFtZVZhbHVlKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB2ZXJzaW9uKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlByb2R1Y3QuZ2V0TmFtZSgpKTsKKwkJaWYgKGFkZGl0aW9uYWxQYXJhbXMgIT0gbnVsbCAmJiAhYWRkaXRpb25hbFBhcmFtcy5pc0VtcHR5KCkpIHsKKwkJCXByb3BzLnB1dEFsbChhZGRpdGlvbmFsUGFyYW1zKTsKKwkJfQorCisJCUVpdGhlcjxMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5Qcm9kdWN0LCBwcm9wcywgUHJvZHVjdE1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKGJ5Q3JpdGVyaWEuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYnlDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlMaXN0PFByb2R1Y3RNZXRhZGF0YURhdGE+IGRhdGFMaXN0ID0gYnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGRhdGFMaXN0ICE9IG51bGwgJiYgIWRhdGFMaXN0LmlzRW1wdHkoKSkgeworCQkJaWYgKGRhdGFMaXN0LnNpemUoKSA+IDEpIHsKKwkJCQlsb2cuZGVidWcoIk1vcmUgdGhhdCBvbmUgaW5zdGFuY2Ugb2YgcHJvZHVjdCBmb3IgbmFtZSB7fSBhbmQgdmVyc2lvbiB7fSIsIG5hbWVWYWx1ZSwgdmVyc2lvbik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQkJUHJvZHVjdE1ldGFkYXRhRGF0YSBwcm9kdWN0RGF0YSA9IGRhdGFMaXN0LmdldCgwKTsKKwkJCUVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBwcm9kdWN0ID0gZ2V0UHJvZHVjdCgKKwkJCQkJcHJvZHVjdERhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHByb2R1Y3QuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggcHJvZHVjdCwgbmFtZSB7fSBpZCB7fSIsIHByb2R1Y3REYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCksCisJCQkJCQlwcm9kdWN0RGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSk7CisJCQl9CisJCQlyZXR1cm4gcHJvZHVjdDsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUHJvZHVjdCBnZXREZWZhdWx0Q29tcG9uZW50KCkgeworCQlyZXR1cm4gbmV3IFByb2R1Y3QoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ+IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlRGVyaXZlZCgKKwkJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQsIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LAorCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudERhdGEsIENsYXNzPFQ+IGNsYXp6KSB7CisJCWxvZy5kZWJ1ZygiRGVyaXZlZCBjbGFzcyBpc24ndCBzdXBwb3J0ZWQgZm9yIHByb2R1Y3QiKTsKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbmNyZWFzZUFuZEdldENvbXBvbmVudEluc3RhbmNlQ291bnRlcihTdHJpbmcgY29tcG9uZW50SWQsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIGluY3JlYXNlQW5kR2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyKGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0uUHJvZHVjdCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVDYXRlZ29yaWVzKENvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LCBDb21wb25lbnQgY29tcG9uZW50LAorCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudERhdGEsIE5vZGVUeXBlRW51bSB0eXBlKSB7CisJCS8vIEFzIGFncmVlZCB3aXRoIEVsbGEsIHVwZGF0ZSBjYXRlZ29yaWVzIC0gZGVsZXRlIG9sZCBhbmQgY3JlYXRlIG5ldworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBuZXdjYXRlZ29yaWVzID0gY29tcG9uZW50LmdldENhdGVnb3JpZXMoKTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGN1cnJlbnRjYXRlZ29yaWVzID0gY3VycmVudENvbXBvbmVudC5nZXRDYXRlZ29yaWVzKCk7CisJCWlmIChuZXdjYXRlZ29yaWVzICE9IG51bGwpIHsKKwkJCWlmIChjdXJyZW50Y2F0ZWdvcmllcyAhPSBudWxsICYmICFjdXJyZW50Y2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKKwkJCQlFaXRoZXI8TGlzdDxHcm91cGluZ0RhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmaW5kR3JvdXBpbmdzRm9yQ29tcG9uZW50ID0gZmluZEdyb3VwaW5nc0ZvckNvbXBvbmVudCgKKwkJCQkJCU5vZGVUeXBlRW51bS5Qcm9kdWN0R3JvdXBpbmcsIGN1cnJlbnRDb21wb25lbnQpOworCQkJCWlmIChmaW5kR3JvdXBpbmdzRm9yQ29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCQlzdGF0dXMgPSBmaW5kR3JvdXBpbmdzRm9yQ29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQl9CisJCQkJTGlzdDxHcm91cGluZ0RhdGE+IGdyb3VwaW5nRGF0YVRvRGlzc29jaWF0ZSA9IGZpbmRHcm91cGluZ3NGb3JDb21wb25lbnQubGVmdCgpLnZhbHVlKCk7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5TdGF0dXMgPSBkaXNzb2NpYXRlQ2F0ZWdvcmllc0Zyb21Qcm9kdWN0KChQcm9kdWN0TWV0YWRhdGFEYXRhKSBjb21wb25lbnREYXRhLAorCQkJCQkJZ3JvdXBpbmdEYXRhVG9EaXNzb2NpYXRlKTsKKwkJCQlpZiAodGl0YW5TdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJc3RhdHVzID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh0aXRhblN0YXR1cyk7CisJCQkJfQorCQkJfQorCQkJaWYgKCFuZXdjYXRlZ29yaWVzLmlzRW1wdHkoKSkgeworCQkJCUVpdGhlcjxMaXN0PEdyb3VwaW5nRGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGZpbmRHcm91cGluZ3NGb3JDb21wb25lbnQgPSBmaW5kR3JvdXBpbmdzRm9yQ29tcG9uZW50KAorCQkJCQkJTm9kZVR5cGVFbnVtLlByb2R1Y3RHcm91cGluZywgY29tcG9uZW50KTsKKwkJCQlpZiAoZmluZEdyb3VwaW5nc0ZvckNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQkJc3RhdHVzID0gZmluZEdyb3VwaW5nc0ZvckNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCk7CisJCQkJfQorCQkJCUxpc3Q8R3JvdXBpbmdEYXRhPiBncm91cGluZ0RhdGFUb0Fzc29jaWF0ZSA9IGZpbmRHcm91cGluZ3NGb3JDb21wb25lbnQubGVmdCgpLnZhbHVlKCk7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5TdGF0dXMgPSBhc3NvY2lhdGVDYXRlZ29yaWVzVG9Qcm9kdWN0KChQcm9kdWN0TWV0YWRhdGFEYXRhKSBjb21wb25lbnREYXRhLAorCQkJCQkJZ3JvdXBpbmdEYXRhVG9Bc3NvY2lhdGUpOworCQkJCWlmICh0aXRhblN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlzdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHRpdGFuU3RhdHVzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UHJvZHVjdD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEZvbGxvd2VkKFN0cmluZyB1c2VySWQsCisJCQlTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMsIFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPExpc3Q8UHJvZHVjdD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRGb2xsb3dlZENvbXBvbmVudCgKKwkJCQl1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgbGFzdFN0YXRlU3RhdGVzLCBpblRyYW5zYWN0aW9uLCB0aXRhbkdlbmVyaWNEYW8sIE5vZGVUeXBlRW51bS5Qcm9kdWN0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TWV0YWRhdGFDb21wb25lbnQoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIGdldE1ldGFkYXRhQ29tcG9uZW50KGlkLCBOb2RlVHlwZUVudW0uUHJvZHVjdCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJQ29tcG9uZW50IGNvbnZlcnRDb21wb25lbnRNZXRhZGF0YURhdGFUb0NvbXBvbmVudChDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50TWV0YWRhdGFEYXRhKSB7CisJCXJldHVybiBjb252ZXJ0UHJvZHVjdERhdGFUb1Byb2R1Y3QoKFByb2R1Y3RNZXRhZGF0YURhdGEpIGNvbXBvbmVudE1ldGFkYXRhRGF0YSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVFeGlzdHMoU3RyaW5nIHByb2R1Y3ROYW1lKSB7CisJCXJldHVybiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVVbmlxdWVuZXNzKHByb2R1Y3ROYW1lLCB0aXRhbkdlbmVyaWNEYW8sIE5vZGVUeXBlRW51bS5Qcm9kdWN0KTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbWFya0NvbXBvbmVudFRvRGVsZXRlKENvbXBvbmVudCBjb21wb25lbnRUb0RlbGV0ZSwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkvLyBtYXJrQ29tcG9uZW50VG9EZWxldGUgaXMgbm90IGRlZmluZWQgeWV0IGZvciBwcm9kdWN0cworCQlyZXR1cm4gKEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBkZWxldGVQcm9kdWN0KAorCQkJCWNvbXBvbmVudFRvRGVsZXRlLmdldFVuaXF1ZUlkKCksIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgeworCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKKwkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaXNDb21wb25lbnRJblVzZShTdHJpbmcgY29tcG9uZW50SWQpIHsKKwkJcmV0dXJuIGlzQ29tcG9uZW50SW5Vc2UoY29tcG9uZW50SWQsIE5vZGVUeXBlRW51bS5Qcm9kdWN0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ29tcG9uZW50c01hcmtlZEZvckRlbGV0aW9uKCkgeworCQkvLyBtYXJrRm9yRGVsZXRpb24gZm9yIHByb2R1Y3RzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ldyBBcnJheUxpc3Q8PigpKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFByb2R1Y3QsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFByb2R1Y3RCeU5hbWVBbmRWZXJzaW9uKFN0cmluZyBwcm9kdWN0TmFtZSwgU3RyaW5nIHByb2R1Y3RWZXJzaW9uLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRCeU5hbWVzQW5kVmVyc2lvbihHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRS5nZXRQcm9wZXJ0eSgpLAorCQkJCVZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKHByb2R1Y3ROYW1lKSwgcHJvZHVjdFZlcnNpb24sIG51bGwsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsCisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRQcm9kdWN0KGlkLCBmYWxzZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVQcm9kdWN0KFByb2R1Y3QgcHJvZHVjdCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLAorCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgZmlsdGVyUmVzdWx0VmlldykgeworCQlyZXR1cm4gKEVpdGhlcjxQcm9kdWN0LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgdXBkYXRlQ29tcG9uZW50RmlsdGVyUmVzdWx0KHByb2R1Y3QsIGluVHJhbnNhY3Rpb24sCisJCQkJdGl0YW5HZW5lcmljRGFvLCBwcm9kdWN0LmdldENsYXNzKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmaWx0ZXJSZXN1bHRWaWV3KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVDb21wb25lbnRGaWx0ZXJSZXN1bHQoVCBjb21wb25lbnQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwKKwkJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGZpbHRlclJlc3VsdFZpZXcpIHsKKwkJcmV0dXJuIChFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIHVwZGF0ZVByb2R1Y3QoKFByb2R1Y3QpIGNvbXBvbmVudCwgaW5UcmFuc2FjdGlvbiwgZmlsdGVyUmVzdWx0Vmlldyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Qcm9wZXJ0eU9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Qcm9wZXJ0eU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNzc1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1Byb3BlcnR5T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNzg4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdKb2luZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVHJhbnNhY3Rpb247CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uSnNvbk5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uSnNvblByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uT2JqZWN0Q29kZWM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLkRlc2VyaWFsaXphdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguR3JhcGhFbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVsZW1lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eVJ1bGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUlucHV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLklDb21wbGV4RGVmYXVsdFZhbHVlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkNvbnN0cmFpbnRUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkdyZWF0ZXJPckVxdWFsQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5HcmVhdGVyVGhhbkNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuSW5SYW5nZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuTGVzc09yRXF1YWxDb25zdHJhaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkxlc3NUaGFuQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5NaW5MZW5ndGhDb25zdHJhaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLlZhbGlkVmFsdWVzQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlByb3BlcnR5VmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5EYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzLlByb3BlcnR5VHlwZVZhbGlkYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRJbnN0YW5jZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuRGF0YVR5cGVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLklucHV0VmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Qcm9wZXJ0eVZhbHVlRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25zdGFudHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25EZXNlcmlhbGl6YXRpb25Db250ZXh0OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRGVzZXJpYWxpemVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uU2VyaWFsaXphdGlvbkNvbnRleHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25TZXJpYWxpemVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJwcm9wZXJ0eS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIFByb3BlcnR5T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJUHJvcGVydHlPcGVyYXRpb24geworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisJCUxpc3Q8UGF0dGVybj4gYnVpbGRGdW5jdGlvblBhdHRlcm5zID0gYnVpbGRGdW5jdGlvblBhdHRlcm5zKCk7CisKKwkJZm9yIChQYXR0ZXJuIHBhdHRlcm4gOiBidWlsZEZ1bmN0aW9uUGF0dGVybnMpIHsKKworCQkJU3RyaW5nW10gc3RycyA9IHsgInN0cl9yZXBsYWNlIiwgInsgc3RyX3JlcGxhY2U6IiwgIiB7c3RyX3JlcGxhY2U6IiwgIiB7ICAgc3RyX3JlcGxhY2U6IiwgIntzdHJfcmVwbGFjZToiIH07CisJCQlmb3IgKFN0cmluZyBzdHIgOiBzdHJzKSB7CisJCQkJTWF0Y2hlciBtID0gcGF0dGVybi5tYXRjaGVyKHN0cik7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKHBhdHRlcm4ucGF0dGVybigpICsgIiAiICsgc3RyICsgIiAiICsgbS5maW5kKCkpOworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7CisKKwlwdWJsaWMgUHJvcGVydHlPcGVyYXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb3BlcnR5T3BlcmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIHN0YXRpYyBMaXN0PFBhdHRlcm4+IGZ1bmN0aW9uUGF0dGVybnMgPSBudWxsOworCisJc3RhdGljIHsKKworCQlmdW5jdGlvblBhdHRlcm5zID0gYnVpbGRGdW5jdGlvblBhdHRlcm5zKCk7CisJfQorCisJLyoqCisJICogVGhlIHZhbHVlIG9mIGZ1bmN0aW9ucyBpcyBpbiBhIGpzb24gZm9ybWF0LiBCdWlsZCBwYXR0ZXJuIGZvciBlYWNoIGZ1bmN0aW9uIG5hbWUKKwkgKiAKKwkgKiB7IHN0cl9yZXBsYWNlOiAuLi4uIH0ge3N0cl9yZXBsYWNlOiAuLi4uIH0ge3N0cl9yZXBsYWNlOiAuLi4uIH0geyBzdHJfcmVwbGFjZTogLi4uLiB9CisJICogCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgc3RhdGljIExpc3Q8UGF0dGVybj4gYnVpbGRGdW5jdGlvblBhdHRlcm5zKCkgeworCisJCUxpc3Q8UGF0dGVybj4gZnVuY3Rpb25QYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCVN0cmluZ1tdIGZ1bmN0aW9ucyA9IHsgImdldF9pbnB1dCIsICJnZXRfcHJvcGVydHkiIH07CisKKwkJZm9yIChTdHJpbmcgZnVuY3Rpb24gOiBmdW5jdGlvbnMpIHsKKwkJCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXlsgXSpcXHtbIF0qIiArIGZ1bmN0aW9uICsgIjoiKTsKKwkJCWZ1bmN0aW9uUGF0dGVybnMuYWRkKHBhdHRlcm4pOworCQl9CisKKwkJcmV0dXJuIGZ1bmN0aW9uUGF0dGVybnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxQcm9wZXJ0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFByb3BlcnR5T2ZSZXNvdXJjZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCisJCVN0cmluZyBwcm9wZXJ0eUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChyZXNvdXJjZUlkLCBwcm9wZXJ0eU5hbWUpOworCisJCUVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXN1bHQgPSB0aGlzLnRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSksIHByb3BlcnR5SWQsIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJCWlmIChnZXRSZXN1bHQuaXNMZWZ0KCkpIHsKKwkJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBnZXRSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29udmVydFByb3BlcnR5RGF0YVRvUHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5RGF0YSwgcHJvcGVydHlOYW1lLCByZXNvdXJjZUlkKSk7CisJCX0gZWxzZSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhblN0YXR1cyA9IGdldFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIk5vZGUgd2l0aCBpZCB7fSB3YXMgbm90IGZvdW5kIGluIHRoZSBncmFwaC4gU3RhdHVzOiB7fSIsIHByb3BlcnR5SWQsIHRpdGFuU3RhdHVzKTsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZU9wZXJhdGlvblN0YXR1cyA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXModGl0YW5TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlT3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JUHJvcGVydHlPcGVyYXRpb24jIGFkZFByb3BlcnR5VG9SZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb24sIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5kYXRhdHlwZS5Ob2RlVHlwZUVudW0sIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJLyoKKwkgKiBAT3ZlcnJpZGUgcHVibGljIEVpdGhlcjxQcm9wZXJ0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5VG9SZXNvdXJjZSggU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCSAqIAorCSAqIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgaXNWYWxpZFByb3BlcnR5ID0gaXNUeXBlRXhpc3RzQW5kVmFsaWQocHJvcGVydHlEZWZpbml0aW9uKTsgaWYgKGlzVmFsaWRQcm9wZXJ0eSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7IHJldHVybiBFaXRoZXIucmlnaHQoaXNWYWxpZFByb3BlcnR5KTsgfQorCSAqIAorCSAqIEVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSBhZGRQcm9wZXJ0eVRvR3JhcGgocHJvcGVydHlOYW1lLCBwcm9wZXJ0eURlZmluaXRpb24sIHJlc291cmNlSWQpOworCSAqIAorCSAqIGlmIChzdGF0dXMuaXNSaWdodCgpKSB7IHRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOyBsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcHJvcGVydHkgIiArIHByb3BlcnR5TmFtZSArICIgdG8gcmVzb3VyY2UgIiArIHJlc291cmNlSWQpOyByZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzLiByaWdodCgpLnZhbHVlKCkpKTsgfSBlbHNlCisJICogeyB0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7IFByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJICogCisJICogUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmUmVzdWx0ID0gY29udmVydFByb3BlcnR5RGF0YVRvUHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5RGF0YSwgcHJvcGVydHlOYW1lLCByZXNvdXJjZUlkKTsgbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgUHJvcGVydHlEZWZpbnRpb24gaXMge30iLCBwcm9wZXJ0eURlZmluaXRpb24pOyByZXR1cm4gRWl0aGVyLmxlZnQocHJvcGVydHlEZWZSZXN1bHQpOyB9CisJICogCisJICogCisJICogfQorCSAqLworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBpc1R5cGVFeGlzdHNBbmRWYWxpZChQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uKSB7CisKKwkJVG9zY2FQcm9wZXJ0eVR5cGUgdHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCisJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfVFlQRTsKKwkJfQorCisJCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VHlwZSgpOworCQlTdHJpbmcgaW5uZXJUeXBlID0gbnVsbDsKKwkJU3RyaW5nIHZhbHVlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpOworCisJCWlmIChwcm9wZXJ0eVR5cGUuZXF1YWxzKFRvc2NhUHJvcGVydHlUeXBlLkxJU1QpIHx8IHByb3BlcnR5VHlwZS5lcXVhbHMoVG9zY2FQcm9wZXJ0eVR5cGUuTUFQKSkgeworCQkJU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWE7CisJCQlpZiAoKHNjaGVtYSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRTY2hlbWEoKSkgIT0gbnVsbCkgeworCQkJCVByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcGVydHk7CisJCQkJaWYgKChwcm9wZXJ0eSA9IHNjaGVtYS5nZXRQcm9wZXJ0eSgpKSAhPSBudWxsKSB7CisJCQkJCWlubmVyVHlwZSA9IHByb3BlcnR5LmdldFR5cGUoKTsKKworCQkJCX0KKwkJCX0KKwkJfQorCisJCVByb3BlcnR5VHlwZVZhbGlkYXRvciB2YWxpZGF0b3IgPSB0eXBlLmdldFZhbGlkYXRvcigpOworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IChFTVBUWV9WQUxVRSAhPSBudWxsICYmIEVNUFRZX1ZBTFVFLmVxdWFscyhwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpKSkgeworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCX0gZWxzZSB7CisJCQlib29sZWFuIGlzVmFsaWQgPSB2YWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKTsKKwkJCWlmICh0cnVlID09IGlzVmFsaWQpIHsKKwkJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9WQUxVRTsKKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIFByb3BlcnR5RGVmaW5pdGlvbiBjb252ZXJ0UHJvcGVydHlEYXRhVG9Qcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlEYXRhIHByb3BlcnR5RGF0YVJlc3VsdCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHJlc291cmNlSWQpIHsKKwkJbG9nLmRlYnVnKCJUaGUgb2JqZWN0IHJldHVybmVkIGFmdGVyIGNyZWF0ZSBwcm9wZXJ0eSBpcyB7fSIsIHByb3BlcnR5RGF0YVJlc3VsdCk7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmUmVzdWx0ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eURhdGFSZXN1bHQuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpKTsKKwkJcHJvcGVydHlEZWZSZXN1bHQuc2V0Q29uc3RyYWludHMoY29udmVydENvbnN0cmFpbnRzKHByb3BlcnR5RGF0YVJlc3VsdC5nZXRDb25zdHJhaW50cygpKSk7CisJCXByb3BlcnR5RGVmUmVzdWx0LnNldE5hbWUocHJvcGVydHlOYW1lKTsKKwkJcHJvcGVydHlEZWZSZXN1bHQuc2V0UGFyZW50VW5pcXVlSWQocmVzb3VyY2VJZCk7CisKKwkJcmV0dXJuIHByb3BlcnR5RGVmUmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvcGVydHlDb25zdHJhaW50U2VyaWFsaXNlciBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemVyPFByb3BlcnR5Q29uc3RyYWludD4geworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSnNvbkVsZW1lbnQgc2VyaWFsaXplKFByb3BlcnR5Q29uc3RyYWludCBzcmMsIFR5cGUgdHlwZU9mU3JjLCBKc29uU2VyaWFsaXphdGlvbkNvbnRleHQgY29udGV4dCkgeworCQkJSnNvblBhcnNlciBwYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOworCQkJSnNvbk9iamVjdCByZXN1bHQgPSBuZXcgSnNvbk9iamVjdCgpOworCQkJSnNvbkFycmF5IGpzb25BcnJheSA9IG5ldyBKc29uQXJyYXkoKTsKKwkJCWlmIChzcmMgaW5zdGFuY2VvZiBJblJhbmdlQ29uc3RyYWludCkgeworCQkJCUluUmFuZ2VDb25zdHJhaW50IHJhbmdlQ29uc3RyYWludCA9IChJblJhbmdlQ29uc3RyYWludCkgc3JjOworCQkJCWpzb25BcnJheS5hZGQocGFyc2VyLnBhcnNlKHJhbmdlQ29uc3RyYWludC5nZXRSYW5nZU1pblZhbHVlKCkpKTsKKwkJCQlqc29uQXJyYXkuYWRkKHBhcnNlci5wYXJzZShyYW5nZUNvbnN0cmFpbnQuZ2V0UmFuZ2VNYXhWYWx1ZSgpKSk7CisJCQkJcmVzdWx0LmFkZCgiaW5SYW5nZSIsIGpzb25BcnJheSk7CisJCQl9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIEdyZWF0ZXJUaGFuQ29uc3RyYWludCkgeworCQkJCUdyZWF0ZXJUaGFuQ29uc3RyYWludCBncmVhdGVyVGhhbkNvbnN0cmFpbnQgPSAoR3JlYXRlclRoYW5Db25zdHJhaW50KSBzcmM7CisJCQkJanNvbkFycmF5LmFkZChwYXJzZXIucGFyc2UoZ3JlYXRlclRoYW5Db25zdHJhaW50LmdldEdyZWF0ZXJUaGFuKCkpKTsKKwkJCQlyZXN1bHQuYWRkKCJncmVhdGVyVGhhbiIsIGpzb25BcnJheSk7CisJCQl9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIExlc3NPckVxdWFsQ29uc3RyYWludCkgeworCQkJCUxlc3NPckVxdWFsQ29uc3RyYWludCBsZXNzT3JFcXVhbENvbnN0cmFpbnQgPSAoTGVzc09yRXF1YWxDb25zdHJhaW50KSBzcmM7CisJCQkJanNvbkFycmF5LmFkZChwYXJzZXIucGFyc2UobGVzc09yRXF1YWxDb25zdHJhaW50LmdldExlc3NPckVxdWFsKCkpKTsKKwkJCQlyZXN1bHQuYWRkKCJsZXNzT3JFcXVhbCIsIGpzb25BcnJheSk7CisJCQl9IGVsc2UgeworCQkJCWxvZy53YXJuKCJQcm9wZXJ0eUNvbnN0cmFpbnQge30gaXMgbm90IHN1cHBvcnRlZC4gSWdub3JlZC4iLCBzcmMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnR5Q29uc3RyYWludERlc2VyaWFsaXNlciBpbXBsZW1lbnRzIEpzb25EZXNlcmlhbGl6ZXI8UHJvcGVydHlDb25zdHJhaW50PiB7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBQcm9wZXJ0eUNvbnN0cmFpbnQgZGVzZXJpYWxpemUoSnNvbkVsZW1lbnQganNvbiwgVHlwZSB0eXBlT2ZULCBKc29uRGVzZXJpYWxpemF0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSnNvblBhcnNlRXhjZXB0aW9uIHsKKworCQkJUHJvcGVydHlDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludCA9IG51bGw7CisKKwkJCVNldDxFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50Pj4gc2V0ID0ganNvbi5nZXRBc0pzb25PYmplY3QoKS5lbnRyeVNldCgpOworCisJCQlpZiAoc2V0LnNpemUoKSA9PSAxKSB7CisJCQkJRW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4gZWxlbWVudCA9IHNldC5pdGVyYXRvcigpLm5leHQoKTsKKwkJCQlTdHJpbmcga2V5ID0gZWxlbWVudC5nZXRLZXkoKTsKKwkJCQlKc29uRWxlbWVudCB2YWx1ZSA9IGVsZW1lbnQuZ2V0VmFsdWUoKTsKKworCQkJCUNvbnN0cmFpbnRUeXBlIGNvbnN0cmFpbnRUeXBlID0gQ29uc3RyYWludFR5cGUuZ2V0QnlUeXBlKGtleSk7CisJCQkJaWYgKGNvbnN0cmFpbnRUeXBlID09IG51bGwpIHsKKwkJCQkJbG9nLndhcm4oIkNvbnN0cmFpbnRUeXBlIHdhcyBub3QgZm91bmQgZm9yIGNvbnN0cmFpbnQgbmFtZTp7fSIsIGtleSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3dpdGNoIChjb25zdHJhaW50VHlwZSkgeworCQkJCQljYXNlIElOX1JBTkdFOgorCisJCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEpzb25BcnJheSkgeworCQkJCQkJCQlKc29uQXJyYXkgcmFuZ2VBcnJheSA9IChKc29uQXJyYXkpIHZhbHVlOworCQkJCQkJCQlpZiAocmFuZ2VBcnJheS5zaXplKCkgIT0gMikgeworCQkJCQkJCQkJbG9nLmVycm9yKCJUaGUgcmFuZ2UgY29uc3RyYWludCBjb250ZW50IGlzIGludmFsaWQuIHZhbHVlID0ge30iLCB2YWx1ZSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlJblJhbmdlQ29uc3RyYWludCByYW5nZUNvbnN0cmFpbnQgPSBuZXcgSW5SYW5nZUNvbnN0cmFpbnQoKTsKKwkJCQkJCQkJCVN0cmluZyBtaW5WYWx1ZSA9IHJhbmdlQXJyYXkuZ2V0KDApLmdldEFzU3RyaW5nKCk7CisJCQkJCQkJCQlTdHJpbmcgbWF4VmFsdWUgPSByYW5nZUFycmF5LmdldCgxKS5nZXRBc1N0cmluZygpOworCQkJCQkJCQkJcmFuZ2VDb25zdHJhaW50LnNldFJhbmdlTWluVmFsdWUobWluVmFsdWUpOworCQkJCQkJCQkJcmFuZ2VDb25zdHJhaW50LnNldFJhbmdlTWF4VmFsdWUobWF4VmFsdWUpOworCQkJCQkJCQkJcHJvcGVydHlDb25zdHJhaW50ID0gcmFuZ2VDb25zdHJhaW50OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWxvZy53YXJuKCJUaGUgdmFsdWUgb2YgR3JlYXRlclRoYW5Db25zdHJhaW50IGlzIG51bGwiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEdSRUFURVJfVEhBTjoKKwkJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCQkJU3RyaW5nIGFzU3RyaW5nID0gdmFsdWUuZ2V0QXNTdHJpbmcoKTsKKwkJCQkJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgdmFsdWUgdG8gR3JlYXRlclRoYW5Db25zdHJhaW50IG9iamVjdC4gdmFsdWUgPSB7fSIsIGFzU3RyaW5nKTsKKwkJCQkJCQlwcm9wZXJ0eUNvbnN0cmFpbnQgPSBuZXcgR3JlYXRlclRoYW5Db25zdHJhaW50KGFzU3RyaW5nKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbG9nLndhcm4oIlRoZSB2YWx1ZSBvZiBHcmVhdGVyVGhhbkNvbnN0cmFpbnQgaXMgbnVsbCIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBMRVNTX1RIQU46CisJCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyBhc1N0cmluZyA9IHZhbHVlLmdldEFzU3RyaW5nKCk7CisJCQkJCQkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIHZhbHVlIHRvIExlc3NUaGFuQ29uc3RyYWludCBvYmplY3QuIHZhbHVlID0ge30iLCBhc1N0cmluZyk7CisJCQkJCQkJcHJvcGVydHlDb25zdHJhaW50ID0gbmV3IExlc3NUaGFuQ29uc3RyYWludChhc1N0cmluZyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWxvZy53YXJuKCJUaGUgdmFsdWUgb2YgTGVzc1RoYW5Db25zdHJhaW50IGlzIG51bGwiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEdSRUFURVJfT1JfRVFVQUw6CisJCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQkJCVN0cmluZyBhc1N0cmluZyA9IHZhbHVlLmdldEFzU3RyaW5nKCk7CisJCQkJCQkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIHZhbHVlIHRvIEdyZWF0ZXJUaGFuQ29uc3RyYWludCBvYmplY3QuIHZhbHVlID0ge30iLCBhc1N0cmluZyk7CisJCQkJCQkJcHJvcGVydHlDb25zdHJhaW50ID0gbmV3IEdyZWF0ZXJPckVxdWFsQ29uc3RyYWludChhc1N0cmluZyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWxvZy53YXJuKCJUaGUgdmFsdWUgb2YgR3JlYXRlck9yRXF1YWxDb25zdHJhaW50IGlzIG51bGwiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIExFU1NfT1JfRVFVQUw6CisKKwkJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCQkJU3RyaW5nIGFzU3RyaW5nID0gdmFsdWUuZ2V0QXNTdHJpbmcoKTsKKwkJCQkJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgdmFsdWUgdG8gTGVzc09yRXF1YWxDb25zdHJhaW50IG9iamVjdC4gdmFsdWUgPSB7fSIsIGFzU3RyaW5nKTsKKwkJCQkJCQlwcm9wZXJ0eUNvbnN0cmFpbnQgPSBuZXcgTGVzc09yRXF1YWxDb25zdHJhaW50KGFzU3RyaW5nKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbG9nLndhcm4oIlRoZSB2YWx1ZSBvZiBHcmVhdGVyVGhhbkNvbnN0cmFpbnQgaXMgbnVsbCIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBWQUxJRF9WQUxVRVM6CisKKwkJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSnNvbkFycmF5KSB7CisJCQkJCQkJCUpzb25BcnJheSByYW5nZUFycmF5ID0gKEpzb25BcnJheSkgdmFsdWU7CisJCQkJCQkJCWlmIChyYW5nZUFycmF5LnNpemUoKSA9PSAwKSB7CisJCQkJCQkJCQlsb2cuZXJyb3IoIlRoZSB2YWxpZCB2YWx1ZXMgY29uc3RyYWludCBjb250ZW50IGlzIGludmFsaWQuIHZhbHVlID0ge30iLCB2YWx1ZSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlWYWxpZFZhbHVlc0NvbnN0cmFpbnQgdnZDb25zdHJhaW50ID0gbmV3IFZhbGlkVmFsdWVzQ29uc3RyYWludCgpOworCQkJCQkJCQkJTGlzdDxTdHJpbmc+IHZhbGlkVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkJCQkJCQlmb3IgKEpzb25FbGVtZW50IGpzb25FbGVtZW50IDogcmFuZ2VBcnJheSkgeworCQkJCQkJCQkJCVN0cmluZyBpdGVtID0ganNvbkVsZW1lbnQuZ2V0QXNTdHJpbmcoKTsKKwkJCQkJCQkJCQl2YWxpZFZhbHVlcy5hZGQoaXRlbSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQl2dkNvbnN0cmFpbnQuc2V0VmFsaWRWYWx1ZXModmFsaWRWYWx1ZXMpOworCQkJCQkJCQkJcHJvcGVydHlDb25zdHJhaW50ID0gdnZDb25zdHJhaW50OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWxvZy53YXJuKCJUaGUgdmFsdWUgb2YgVmFsaWRWYWx1ZXNDb25zdHJhaW50IGlzIG51bGwiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUlOX0xFTkdUSDoKKwkJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCQkJaW50IGFzSW50ID0gdmFsdWUuZ2V0QXNJbnQoKTsKKwkJCQkJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgdmFsdWUgdG8gTWluIExlbmd0aCBvYmplY3QuIHZhbHVlID0ge30iLCBhc0ludCk7CisJCQkJCQkJcHJvcGVydHlDb25zdHJhaW50ID0gbmV3IE1pbkxlbmd0aENvbnN0cmFpbnQoYXNJbnQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlsb2cud2FybigiVGhlIHZhbHVlIG9mIE1pbkxlbmd0aENvbnN0cmFpbnQgaXMgbnVsbCIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlsb2cud2FybigiS2V5IHt9IGlzIG5vdCBzdXBwb3J0ZWQuIElnbm9yZWQuIiwga2V5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHByb3BlcnR5Q29uc3RyYWludDsKKwkJfQorCisJfQorCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnRpZXNUb0dyYXBoKE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcywgU3RyaW5nIHJlc291cmNlSWQsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VJZCk7CisKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKworCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSA9IHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkocHJvcGVydHlEZWZpbml0aW9uLCBkYXRhVHlwZXMpOworCQkJCWlmICh2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5ICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJbG9nLmVycm9yKCJQcm9wZXJ0eSB7fSBpcyBpbnZhbGlkLiBTdGF0dXMgaXMge30iLCBwcm9wZXJ0eURlZmluaXRpb24sIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkpOworCQkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVDsKKwkJCQl9CisKKwkJCQlFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlUb0dyYXBoID0gYWRkUHJvcGVydHlUb0dyYXBoKHByb3BlcnR5TmFtZSwgcHJvcGVydHlEZWZpbml0aW9uLCByZXNvdXJjZUlkKTsKKworCQkJCWlmIChhZGRQcm9wZXJ0eVRvR3JhcGguaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiBhZGRQcm9wZXJ0eVRvR3JhcGgucmlnaHQoKS52YWx1ZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0aWVzVG9HcmFwaChUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCwgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcywgU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCisJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5ID0gdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShwcm9wZXJ0eURlZmluaXRpb24sIGRhdGFUeXBlcyk7CisJCQkJaWYgKHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlsb2cuZXJyb3IoIlByb3BlcnR5IHt9IGlzIGludmFsaWQuIFN0YXR1cyBpcyB7fSIsIHByb3BlcnR5RGVmaW5pdGlvbiwgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSk7CisJCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UOworCQkJCX0KKworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnR5VG9HcmFwaCA9IGFkZFByb3BlcnR5VG9HcmFwaEJ5VmVydGV4KG1ldGFkYXRhVmVydGV4LCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5RGVmaW5pdGlvbiwgcmVzb3VyY2VJZCk7CisKKwkJCQlpZiAoIWFkZFByb3BlcnR5VG9HcmFwaC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCXJldHVybiBhZGRQcm9wZXJ0eVRvR3JhcGg7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHVibGljIEVpdGhlcjxQcm9wZXJ0eURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24sIFN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJRWl0aGVyPFByb3BlcnR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IGFkZFByb3BlcnR5VG9HcmFwaChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5RGVmaW5pdGlvbiwgcmVzb3VyY2VJZCk7CisJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcHJvcGVydHlEZWZpbml0aW9uCisJICogQHJldHVybgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkoSUNvbXBsZXhEZWZhdWx0VmFsdWUgcHJvcGVydHlEZWZpbml0aW9uLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCWxvZy50cmFjZSgiR29pbmcgdG8gdmFsaWRhdGUgcHJvcGVydHkgdHlwZSBhbmQgdmFsdWUuIHt9IiwgcHJvcGVydHlEZWZpbml0aW9uKTsKKworCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFR5cGUoKTsKKwkJU3RyaW5nIHZhbHVlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpOworCisJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBnZXRUeXBlKHByb3BlcnR5VHlwZSk7CisKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCisJCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YVR5cGVzLmdldChwcm9wZXJ0eVR5cGUpOworCQkJaWYgKGRhdGFUeXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQkJbG9nLmRlYnVnKCJUaGUgdHlwZSB7fSBvZiBwcm9wZXJ0eSBjYW5ub3QgYmUgZm91bmQuIiwgcHJvcGVydHlUeXBlKTsKKwkJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX1RZUEU7CisJCQl9CisKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVBbmRVcGRhdGVDb21wbGV4VmFsdWUocHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eVR5cGUsIHZhbHVlLCBkYXRhVHlwZURlZmluaXRpb24sIGRhdGFUeXBlcyk7CisKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJfQorCQlTdHJpbmcgaW5uZXJUeXBlID0gbnVsbDsKKworCQlFaXRoZXI8U3RyaW5nLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hlY2tJbm5lclR5cGUgPSBnZXRJbm5lclR5cGUodHlwZSwgKCkgLT4gcHJvcGVydHlEZWZpbml0aW9uLmdldFNjaGVtYSgpKTsKKwkJaWYgKGNoZWNrSW5uZXJUeXBlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9UWVBFOworCQl9CisJCWlubmVyVHlwZSA9IGNoZWNrSW5uZXJUeXBlLmxlZnQoKS52YWx1ZSgpOworCisJCWxvZy50cmFjZSgiQWZ0ZXIgdmFsaWRhdGluZyBwcm9wZXJ0eSB0eXBlIHt9IiwgcHJvcGVydHlUeXBlKTsKKworCQlib29sZWFuIGlzVmFsaWRQcm9wZXJ0eSA9IGlzVmFsaWRWYWx1ZSh0eXBlLCB2YWx1ZSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQlpZiAoZmFsc2UgPT0gaXNWYWxpZFByb3BlcnR5KSB7CisJCQlsb2cuaW5mbygiVGhlIHZhbHVlIHt9IG9mIHByb3BlcnR5IGZyb20gdHlwZSB7fSBpcyBpbnZhbGlkIiwgdmFsdWUsIHR5cGUpOworCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9WQUxVRTsKKwkJfQorCisJCVByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgY29udmVydGVyID0gdHlwZS5nZXRDb252ZXJ0ZXIoKTsKKworCQlpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkgeworCQkJbG9nLmRlYnVnKCJEZWZhdWx0IHZhbHVlIHdhcyBub3Qgc2VudCBmb3IgcHJvcGVydHkge30uIFNldCBkZWZhdWx0IHZhbHVlIHRvIHt9IiwgcHJvcGVydHlEZWZpbml0aW9uLmdldE5hbWUoKSwgRU1QVFlfVkFMVUUpOworCQkJcHJvcGVydHlEZWZpbml0aW9uLnNldERlZmF1bHRWYWx1ZShFTVBUWV9WQUxVRSk7CisJCX0gZWxzZSBpZiAoZmFsc2UgPT0gaXNFbXB0eVZhbHVlKHZhbHVlKSkgeworCQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLmNvbnZlcnQodmFsdWUsIGlubmVyVHlwZSwgZGF0YVR5cGVzKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUoY29udmVydGVkVmFsdWUpOworCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCS8qCisJICogcHVibGljIEVpdGhlcjxPYmplY3QsIEJvb2xlYW4+IHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlUeXBlLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUpIHsKKwkgKiAKKwkgKiBsb2cuIHRyYWNlKCJHb2luZyB0byB2YWxpZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBhbmQgaXRzIHR5cGUuIHR5cGUgPSB7fSwgdmFsdWUgPSB7fSIgLHByb3BlcnR5VHlwZSwgdmFsdWUpOworCSAqIAorCSAqIFRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBnZXRUeXBlKHByb3BlcnR5VHlwZSk7CisJICogCisJICogaWYgKHR5cGUgPT0gbnVsbCkgeworCSAqIAorCSAqIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBleHRlcm5hbERhdGFUeXBlID0gZ2V0RXh0ZXJuYWxEYXRhVHlwZShwcm9wZXJ0eVR5cGUpOyBpZiAoZXh0ZXJuYWxEYXRhVHlwZS5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZXh0ZXJuYWxEYXRhVHlwZS5yaWdodCgpLnZhbHVlKCk7IGxvZy5kZWJ1ZygiVGhlIHR5cGUgIiArIHByb3BlcnR5VHlwZSArCisJICogIiBvZiBwcm9wZXJ0eSBjYW5ub3QgYmUgZm91bmQuIFN0YXR1cyBpcyAiICsgc3RhdHVzKTsgaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsgQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLiBsb2dCZUludmFsaWRUeXBlRXJyb3IoInZhbGlkYXRlIHByb3BlcnR5IHR5cGUiLCBwcm9wZXJ0eVR5cGUsICJwcm9wZXJ0eSIpOyB9IHJldHVybiBFaXRoZXIucmlnaHQoZmFsc2UpOyB9CisJICogCisJICogRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGV4dGVybmFsRGF0YVR5cGUubGVmdCgpLnZhbHVlKCk7CisJICogCisJICogRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXNSZXMgPSBnZXRBbGxEYXRhVHlwZXMoKTsgaWYgKGFsbERhdGFUeXBlc1Jlcy5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWxsRGF0YVR5cGVzUmVzLnJpZ2h0KCkudmFsdWUoKTsgcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7IH0KKwkgKiAKKwkgKiBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IGFsbERhdGFUeXBlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkgKiAKKwkgKiBJbW11dGFibGVQYWlyPEpzb25FbGVtZW50LCBCb29sZWFuPiB2YWxpZGF0ZVJlc3VsdCA9IGRhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyLnZhbGlkYXRlQW5kVXBkYXRlKHZhbHVlLCBkYXRhVHlwZURlZmluaXRpb24sIGFsbERhdGFUeXBlcyk7CisJICogCisJICogaWYgKHZhbGlkYXRlUmVzdWx0LnJpZ2h0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7IGxvZy5kZWJ1ZygiVGhlIHZhbHVlIHt9IG9mIHByb3BlcnR5IGZyb20gdHlwZSB7fSBpcyBpbnZhbGlkIiwgdmFsdWUsIHByb3BlcnR5VHlwZSk7IHJldHVybiBFaXRoZXIucmlnaHQoZmFsc2UpOyB9CisJICogCisJICogSnNvbkVsZW1lbnQganNvbkVsZW1lbnQgPSB2YWxpZGF0ZVJlc3VsdC5sZWZ0OworCSAqIAorCSAqIFN0cmluZyB2YWx1ZUZyb21Kc29uRWxlbWVudCA9IGdldFZhbHVlRnJvbUpzb25FbGVtZW50KGpzb25FbGVtZW50KTsKKwkgKiAKKwkgKiByZXR1cm4gRWl0aGVyLmxlZnQodmFsdWVGcm9tSnNvbkVsZW1lbnQpOworCSAqIAorCSAqIH0KKwkgKiAKKwkgKiBsb2cudHJhY2UoIkFmdGVyIHZhbGlkYXRpbmcgcHJvcGVydHkgdHlwZSAiICsgcHJvcGVydHlUeXBlKTsKKwkgKiAKKwkgKiBib29sZWFuIGlzVmFsaWRQcm9wZXJ0eSA9IGlzVmFsaWRWYWx1ZSh0eXBlLCB2YWx1ZSwgaW5uZXJUeXBlKTsgaWYgKGZhbHNlID09IGlzVmFsaWRQcm9wZXJ0eSkgeyBsb2cuZGVidWcoIlRoZSB2YWx1ZSB7fSBvZiBwcm9wZXJ0eSBmcm9tIHR5cGUge30gaXMgaW52YWxpZCIsIHZhbHVlLCB0eXBlKTsgcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7IH0KKwkgKiAKKwkgKiAKKwkgKiBPYmplY3QgY29udmVydGVkVmFsdWUgPSB2YWx1ZTsgaWYgKGZhbHNlID09IGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHsgUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0eXBlLmdldENvbnZlcnRlcigpOyBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlci5jb252ZXJ0KHZhbHVlLCBudWxsKTsgfQorCSAqIAorCSAqIHJldHVybiBFaXRoZXIubGVmdChjb252ZXJ0ZWRWYWx1ZSk7IH0KKwkgKi8KKworCXB1YmxpYyBFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlUb0dyYXBoKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24sIFN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VJZCk7CisKKwkJTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzID0gcHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCk7CisKKwkJcHJvcGVydHlEZWZpbml0aW9uLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZFByb3BlcnR5VW5pcXVlSWQocmVzb3VyY2VJZCwgcHJvcGVydHlOYW1lKSk7CisJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBuZXcgUHJvcGVydHlEYXRhKHByb3BlcnR5RGVmaW5pdGlvbiwgY29udmVydENvbnN0cmFpbnRzVG9TdHJpbmcoY29uc3RyYWludHMpKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgcHJvcGVydHkgdG8gZ3JhcGgge30iLCBwcm9wZXJ0eURhdGEpOworCQlFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZVJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHByb3BlcnR5RGF0YSwgUHJvcGVydHlEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcHJvcGVydHkgdG8gZ3JhcGgge30iLCBwcm9wZXJ0eURhdGEpOworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHt9IHRvIGdyYXBoLiBTdGF0dXMgaXMge30iLCBwcm9wZXJ0eU5hbWUsIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlOYW1lKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocmVzb3VyY2VEYXRhLCBwcm9wZXJ0eURhdGEsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWSwgcHJvcHMpOworCQlpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2Uge30gdG8gcHJvcGVydHkge30gaW4gZ3JhcGguIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSWQsIHByb3BlcnR5TmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0eVRvR3JhcGhCeVZlcnRleChUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiwgU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0Q29uc3RyYWludHMoKTsKKworCQlwcm9wZXJ0eURlZmluaXRpb24uc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChyZXNvdXJjZUlkLCBwcm9wZXJ0eU5hbWUpKTsKKwkJUHJvcGVydHlEYXRhIHByb3BlcnR5RGF0YSA9IG5ldyBQcm9wZXJ0eURhdGEocHJvcGVydHlEZWZpbml0aW9uLCBjb252ZXJ0Q29uc3RyYWludHNUb1N0cmluZyhjb25zdHJhaW50cykpOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyBwcm9wZXJ0eSB0byBncmFwaCB7fSIsIHByb3BlcnR5RGF0YSk7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9wZXJ0eURhdGEpOworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBwcm9wZXJ0eSB0byBncmFwaCB7fSIsIHByb3BlcnR5RGF0YSk7CisJCWlmIChjcmVhdGVOb2RlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcHJvcGVydHkge30gdG8gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIHByb3BlcnR5TmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBvcGVyYXRpb25TdGF0dXM7CisJCX0KKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlOYW1lKTsKKwkJVGl0YW5WZXJ0ZXggcHJvcGVydHlWZXJ0ZXggPSBjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShtZXRhZGF0YVZlcnRleCwgcHJvcGVydHlWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWSwgcHJvcHMpOworCQlpZiAoIWNyZWF0ZVJlbFJlc3VsdC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2Uge30gdG8gcHJvcGVydHkge30gaW4gZ3JhcGguIHN0YXR1cyBpcyB7fSIsIHJlc291cmNlSWQsIHByb3BlcnR5TmFtZSwgY3JlYXRlUmVsUmVzdWx0KTsKKwkJCXJldHVybiBjcmVhdGVSZWxSZXN1bHQ7CisJCX0KKworCQlyZXR1cm4gY3JlYXRlUmVsUmVzdWx0OworCisJfQorCisJcHVibGljIFRpdGFuR2VuZXJpY0RhbyBnZXRUaXRhbkdlbmVyaWNEYW8oKSB7CisJCXJldHVybiB0aXRhbkdlbmVyaWNEYW87CisJfQorCisJLy8gcHVibGljIEVpdGhlcjxQcm9wZXJ0eURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+CisJLy8gZGVsZXRlUHJvcGVydHlGcm9tR3JhcGhGcm9tQmwoU3RyaW5nIHByb3BlcnR5SWQpIHsKKwkvLworCS8vIH0KKworCXB1YmxpYyBFaXRoZXI8UHJvcGVydHlEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlJZCkgeworCQlFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gZGVsZXRlUHJvcGVydHlGcm9tR3JhcGgocHJvcGVydHlJZCk7CisJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFByb3BlcnR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnR5RnJvbUdyYXBoKFN0cmluZyBwcm9wZXJ0eUlkKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIGRlbGV0aW5nIHByb3BlcnR5IGZyb20gZ3JhcGgge30iLCBwcm9wZXJ0eUlkKTsKKwkJcmV0dXJuIHRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSksIHByb3BlcnR5SWQsIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJfQorCisJcHVibGljIEVpdGhlcjxQcm9wZXJ0eURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUlkLCBQcm9wZXJ0eURlZmluaXRpb24gbmV3UHJvcGVydHlEZWZpbml0aW9uLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSA9IHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkobmV3UHJvcGVydHlEZWZpbml0aW9uLCBkYXRhVHlwZXMpOworCQlpZiAodmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkpOworCQl9CisKKwkJRWl0aGVyPFByb3BlcnR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IHVwZGF0ZVByb3BlcnR5RnJvbUdyYXBoKHByb3BlcnR5SWQsIG5ld1Byb3BlcnR5RGVmaW5pdGlvbik7CisJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGVpdGhlci5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoZWl0aGVyLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFByb3BlcnR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVByb3BlcnR5RnJvbUdyYXBoKFN0cmluZyBwcm9wZXJ0eUlkLCBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uKSB7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQmVmb3JlIHVwZGF0aW5nIHByb3BlcnR5IG9uIGdyYXBoIHt9IiwgcHJvcGVydHlJZCk7CisKKwkJLy8gZ2V0IHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBkYXRhCisJCUVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXNQcm9wZXJ0eSA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSksIHByb3BlcnR5SWQsIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJCWlmIChzdGF0dXNQcm9wZXJ0eS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBnZXQgcHJvcGVydHkgd2l0aCBpZCB7fS4gUmVhc29uIC0ge30iLCBwcm9wZXJ0eUlkLCBzdGF0dXNQcm9wZXJ0eS5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzUHJvcGVydHkucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlQcm9wZXJ0eURhdGEgb3JnUHJvcGVydHlEYXRhID0gc3RhdHVzUHJvcGVydHkubGVmdCgpLnZhbHVlKCk7CisJCVByb3BlcnR5RGF0YURlZmluaXRpb24gb3JnUHJvcGVydHlEYXRhRGVmaW5pdGlvbiA9IG9yZ1Byb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCk7CisKKwkJLy8gY3JlYXRlIG5ldyBwcm9wZXJ0eSBkYXRhIHRvIHVwZGF0ZQorCQlQcm9wZXJ0eURhdGEgbmV3UHJvcGVydHlEYXRhID0gbmV3IFByb3BlcnR5RGF0YSgpOworCQluZXdQcm9wZXJ0eURhdGEuc2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbihwcm9wZXJ0eURlZmluaXRpb24pOworCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIG5ld1Byb3BlcnR5RGF0YURlZmluaXRpb24gPSBuZXdQcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpOworCisJCS8vIHVwZGF0ZSB0aGUgb3JpZ2luYWwgcHJvcGVydHkgZGF0YSB3aXRoIG5ldyB2YWx1ZXMKKwkJaWYgKG9yZ1Byb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkgPT0gbnVsbCkgeworCQkJb3JnUHJvcGVydHlEYXRhRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUobmV3UHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIW9yZ1Byb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKG5ld1Byb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpKSB7CisJCQkJb3JnUHJvcGVydHlEYXRhRGVmaW5pdGlvbi5zZXREZWZhdWx0VmFsdWUobmV3UHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7CisJCQl9CisJCX0KKwkJaWYgKG9yZ1Byb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSA9PSBudWxsKSB7CisJCQlvcmdQcm9wZXJ0eURhdGFEZWZpbml0aW9uLnNldERlc2NyaXB0aW9uKG5ld1Byb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIW9yZ1Byb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMobmV3UHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKSkgeworCQkJCW9yZ1Byb3BlcnR5RGF0YURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24obmV3UHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKwkJCX0KKwkJfQorCQlpZiAoIW9yZ1Byb3BlcnR5RGF0YURlZmluaXRpb24uZ2V0VHlwZSgpLmVxdWFscyhuZXdQcm9wZXJ0eURhdGFEZWZpbml0aW9uLmdldFR5cGUoKSkpIHsKKwkJCW9yZ1Byb3BlcnR5RGF0YURlZmluaXRpb24uc2V0VHlwZShuZXdQcm9wZXJ0eURhdGFEZWZpbml0aW9uLmdldFR5cGUoKSk7CisJCX0KKwkJaWYgKG5ld1Byb3BlcnR5RGF0YS5nZXRDb25zdHJhaW50cygpICE9IG51bGwpIHsKKwkJCW9yZ1Byb3BlcnR5RGF0YS5zZXRDb25zdHJhaW50cyhuZXdQcm9wZXJ0eURhdGEuZ2V0Q29uc3RyYWludHMoKSk7CisJCX0KKwkJb3JnUHJvcGVydHlEYXRhRGVmaW5pdGlvbi5zZXRTY2hlbWEobmV3UHJvcGVydHlEYXRhRGVmaW5pdGlvbi5nZXRTY2hlbWEoKSk7CisKKwkJcmV0dXJuIHRpdGFuR2VuZXJpY0Rhby51cGRhdGVOb2RlKG9yZ1Byb3BlcnR5RGF0YSwgUHJvcGVydHlEYXRhLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHRpdGFuR2VuZXJpY0RhbworCSAqLworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCXB1YmxpYyBFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlUb05vZGVUeXBlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24sIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzID0gcHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCk7CisKKwkJcHJvcGVydHlEZWZpbml0aW9uLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZFByb3BlcnR5VW5pcXVlSWQodW5pcXVlSWQsIHByb3BlcnR5TmFtZSkpOworCQlQcm9wZXJ0eURhdGEgcHJvcGVydHlEYXRhID0gbmV3IFByb3BlcnR5RGF0YShwcm9wZXJ0eURlZmluaXRpb24sIGNvbnZlcnRDb25zdHJhaW50c1RvU3RyaW5nKGNvbnN0cmFpbnRzKSk7CisKKwkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIHByb3BlcnR5IHRvIGdyYXBoIHt9IiwgcHJvcGVydHlEYXRhKTsKKwkJRWl0aGVyPFByb3BlcnR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShwcm9wZXJ0eURhdGEsIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgYWRkaW5nIHByb3BlcnR5IHRvIGdyYXBoIHt9IiwgcHJvcGVydHlEYXRhKTsKKwkJaWYgKGNyZWF0ZU5vZGVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCBwcm9wZXJ0eSB7fSB0byBncmFwaC4gU3RhdHVzIGlzIHt9IiwgcHJvcGVydHlOYW1lLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIHByb3BlcnR5TmFtZSk7CisKKwkJVW5pcXVlSWREYXRhIHVuaXF1ZUlkRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEobm9kZVR5cGUsIHVuaXF1ZUlkKTsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgYXNzb2NpYXRpbmcge30gdG8gcHJvcGVydHkge30uIiwgdW5pcXVlSWREYXRhLCBwcm9wZXJ0eU5hbWUpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbih1bmlxdWVJZERhdGEsIHByb3BlcnR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZLCBwcm9wcyk7CisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSB7fSB0byBwcm9wZXJ0eSB7fSBpbiBncmFwaC4gU3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHByb3BlcnR5TmFtZSwgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQcm9wZXJ0eVRvTm9kZVR5cGUoVGl0YW5WZXJ0ZXggZWxlbWVudFZlcnRleCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdW5pcXVlSWQpIHsKKworCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0Q29uc3RyYWludHMoKTsKKworCQlwcm9wZXJ0eURlZmluaXRpb24uc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZCh1bmlxdWVJZCwgcHJvcGVydHlOYW1lKSk7CisJCVByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBuZXcgUHJvcGVydHlEYXRhKHByb3BlcnR5RGVmaW5pdGlvbiwgY29udmVydENvbnN0cmFpbnRzVG9TdHJpbmcoY29uc3RyYWludHMpKTsKKworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgcHJvcGVydHkgdG8gZ3JhcGgge30iLCBwcm9wZXJ0eURhdGEpOworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUocHJvcGVydHlEYXRhKTsKKwkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorCQkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcHJvcGVydHkgdG8gZ3JhcGgge30iLCBwcm9wZXJ0eURhdGEpOworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHt9IHRvIGdyYXBoLiBzdGF0dXMgaXMge30gIiwgcHJvcGVydHlOYW1lLCBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIG9wZXJhdGlvblN0YXR1czsKKwkJfQorCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eU5hbWUpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKGVsZW1lbnRWZXJ0ZXgsIHByb3BlcnR5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZLCBwcm9wcyk7CisJCWlmICghY3JlYXRlUmVsUmVzdWx0LmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSB7fSB0byBwcm9wZXJ0eSB7fSBpbiBncmFwaC4gc3RhdHVzIGlzIHt9IiwgdW5pcXVlSWQsIHByb3BlcnR5TmFtZSwgY3JlYXRlUmVsUmVzdWx0KTsKKwkJCXJldHVybiBjcmVhdGVSZWxSZXN1bHQ7CisJCX0KKworCQlyZXR1cm4gY3JlYXRlUmVsUmVzdWx0OworCisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFByb3BlcnRpZXNPZk5vZGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdW5pcXVlSWQpIHsKKworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHJlc291cmNlUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4oKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUobm9kZVR5cGUpLCB1bmlxdWVJZCwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZLCBOb2RlVHlwZUVudW0uUHJvcGVydHksCisJCQkJUHJvcGVydHlEYXRhLmNsYXNzKTsKKworCQlpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5RGF0YSwgR3JhcGhFZGdlPj4gdmFsdWVzID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA6IHZhbHVlcykgeworCQkJCUdyYXBoRWRnZSBlZGdlID0gaW1tdXRhYmxlUGFpci5nZXRWYWx1ZSgpOworCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBlZGdlLmdldFByb3BlcnRpZXMoKS5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCWxvZy5kZWJ1ZygiUHJvcGVydHkge30gaXMgYXNzb2NpYXRlZCB0byBub2RlIHt9IiwgcHJvcGVydHlOYW1lLCB1bmlxdWVJZCk7CisJCQkJUHJvcGVydHlEYXRhIHByb3BlcnR5RGF0YSA9IGltbXV0YWJsZVBhaXIuZ2V0S2V5KCk7CisJCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IHRoaXMuY29udmVydFByb3BlcnR5RGF0YVRvUHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5RGF0YSwgcHJvcGVydHlOYW1lLCB1bmlxdWVJZCk7CisJCQkJcmVzb3VyY2VQcm9wcy5wdXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eURlZmluaXRpb24pOworCQkJfQorCisJCX0KKworCQlsb2cuZGVidWcoIlRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgdG8gbm9kZSB7fSBhcmUge30iLCB1bmlxdWVJZCwgcmVzb3VyY2VQcm9wcyk7CisJCXJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZVByb3BzKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFByb3BlcnRpZXNBc3NvY2lhdGVkVG9Ob2RlKE5vZGVUeXBlRW51bSBub2RlVHlwZSwgU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0aWVzT2ZOb2RlUmVzID0gZmluZFByb3BlcnRpZXNPZk5vZGUobm9kZVR5cGUsIHVuaXF1ZUlkKTsKKworCQlpZiAocHJvcGVydGllc09mTm9kZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHByb3BlcnRpZXNPZk5vZGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQl9CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiB2YWx1ZSA9IHByb3BlcnRpZXNPZk5vZGVSZXMubGVmdCgpLnZhbHVlKCk7CisJCWZvciAoUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA6IHZhbHVlLnZhbHVlcygpKSB7CisKKwkJCVN0cmluZyBwcm9wZXJ0eVVpZCA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCQkJRWl0aGVyPFByb3BlcnR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnR5UmVzID0gZGVsZXRlUHJvcGVydHlGcm9tR3JhcGgocHJvcGVydHlVaWQpOworCQkJaWYgKGRlbGV0ZVByb3BlcnR5UmVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSBwcm9wZXJ0eSB3aXRoIGlkICIgKyBwcm9wZXJ0eVVpZCk7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlUHJvcGVydHlSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCXN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfSUQ7CisJCQkJfQorCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCX0KKworCQl9CisKKwkJbG9nLmRlYnVnKCJUaGUgcHJvcGVydGllcyBkZWxldGVkIGZyb20gbm9kZSB7fSBhcmUge30iLCB1bmlxdWVJZCwgdmFsdWUpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQodmFsdWUpOworCX0KKworCS8qKgorCSAqIGZldGNoIGFsbCBwcm9wZXJ0aWVzIHVuZGVyIGEgZ2l2ZW4gcmVzb3VyY2UoaW5jbHVkZXMgaXRzIHBhcmVudHMnIHJlc291cmNlcykKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsUmVzb3VyY2VQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoU3RyaW5nIHJlc291cmNlSWQsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisJCWZpbmFsIE5vZGVFbGVtZW50RmV0Y2hlcjxQcm9wZXJ0eURlZmluaXRpb24+IHNpbmdsZU5vZGVGZXRjaGVyID0gKHJlc291cmNlSWRQYXJhbSwgYXR0cmlidXRlc1BhcmFtKSAtPiBmaW5kUHJvcGVydGllc09mTm9kZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlSWRQYXJhbSwgYXR0cmlidXRlc1BhcmFtKTsKKwkJcmV0dXJuIGZpbmRBbGxSZXNvdXJjZUVsZW1lbnRzRGVmaW5pdGlvblJlY3Vyc2l2ZWx5KHJlc291cmNlSWQsIHByb3BlcnRpZXMsIHNpbmdsZU5vZGVGZXRjaGVyKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZVR5cGUKKwkgKiBAcGFyYW0gdW5pcXVlSWQKKwkgKiBAcGFyYW0gcHJvcGVydGllcworCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZFByb3BlcnRpZXNPZk5vZGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBTdHJpbmcgdW5pcXVlSWQsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2hpbGRyZW5Ob2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKG5vZGVUeXBlKSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWSwgTm9kZVR5cGVFbnVtLlByb3BlcnR5LAorCQkJCVByb3BlcnR5RGF0YS5jbGFzcyk7CisKKwkJaWYgKGNoaWxkcmVuTm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjaGlsZHJlbk5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJTGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5RGF0YSwgR3JhcGhFZGdlPj4gdmFsdWVzID0gY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisKKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4gaW1tdXRhYmxlUGFpciA6IHZhbHVlcykgeworCQkJCUdyYXBoRWRnZSBlZGdlID0gaW1tdXRhYmxlUGFpci5nZXRWYWx1ZSgpOworCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBlZGdlLmdldFByb3BlcnRpZXMoKS5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCQkJbG9nLmRlYnVnKCJQcm9wZXJ0eSB7fSBpcyBhc3NvY2lhdGVkIHRvIG5vZGUge30iLCBwcm9wZXJ0eU5hbWUsIHVuaXF1ZUlkKTsKKwkJCQlQcm9wZXJ0eURhdGEgcHJvcGVydHlEYXRhID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gdGhpcy5jb252ZXJ0UHJvcGVydHlEYXRhVG9Qcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHlEYXRhLCBwcm9wZXJ0eU5hbWUsIHVuaXF1ZUlkKTsKKworCQkJCXByb3BlcnRpZXMuYWRkKHByb3BlcnR5RGVmaW5pdGlvbik7CisKKwkJCQlpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisJCQkJCWxvZy50cmFjZSgiZmluZFByb3BlcnRpZXNPZk5vZGUgLSBwcm9wZXJ0eSB7fSBhc3NvY2lhdGVkIHRvIG5vZGUge30iLCBwcm9wZXJ0eURlZmluaXRpb24sIHVuaXF1ZUlkKTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFeGlzdChMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcywgU3RyaW5nIHJlc291cmNlVWlkLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJZm9yIChQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uIDogcHJvcGVydGllcykgeworCQkJU3RyaW5nIHBhcmVudFVuaXF1ZUlkID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFBhcmVudFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgbmFtZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCk7CisKKwkJCWlmIChwYXJlbnRVbmlxdWVJZC5lcXVhbHMocmVzb3VyY2VVaWQpICYmIG5hbWUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKworCX0KKworCS8qKgorCSAqIGFkZCBwcm9wZXJ0eSB0byByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSBpbm5lclR5cGUKKwkgKiAgICAgICAgICAgIFRPRE8gLy8gKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5IC8vICogQHBhcmFtIHJlc291cmNlSW5zdGFuY2VJZCAvLyAqIEBwYXJhbSBpbmRleAorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwkvKgorCSAqIHB1YmxpYyBFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VJbnN0YW5jZSggQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIEludGVnZXIgaW5kZXgpIHsKKwkgKiAKKwkgKiBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFJlc0luc3RhbmNlUmVzID0gdGl0YW5HZW5lcmljRGFvIC5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlciAuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkgKiAKKwkgKiBpZiAoZmluZFJlc0luc3RhbmNlUmVzLmlzUmlnaHQoKSkgeyBUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kUmVzSW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpOyBpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeyBzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOyB9IHJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsgfQorCSAqIAorCSAqIFN0cmluZyBwcm9wZXJ0eUlkID0gcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFVuaXF1ZUlkKCk7IEVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUHJvcGVydHlEZWZSZXMgPSB0aXRhbkdlbmVyaWNEYW8gLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyIC5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSksIHByb3BlcnR5SWQsIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJICogCisJICogaWYgKGZpbmRQcm9wZXJ0eURlZlJlcy5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFByb3BlcnR5RGVmUmVzLnJpZ2h0KCkudmFsdWUoKTsgaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsgc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsgfSByZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7IH0KKwkgKiAKKwkgKiBTdHJpbmcgdmFsdWVVbmlxdWVVaWQgPSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKTsgaWYgKHZhbHVlVW5pcXVlVWlkID09IG51bGwpIHsKKwkgKiAKKwkgKiBQcm9wZXJ0eURhdGEgcHJvcGVydHlEYXRhID0gZmluZFByb3BlcnR5RGVmUmVzLmxlZnQoKS52YWx1ZSgpOyBDb21wb25lbnRJbnN0YW5jZURhdGEgcmVzb3VyY2VJbnN0YW5jZURhdGEgPSBmaW5kUmVzSW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJICogCisJICogSW1tdXRhYmxlUGFpcjxUaXRhbk9wZXJhdGlvblN0YXR1cywgU3RyaW5nPiBpc1Byb3BlcnR5VmFsdWVFeGlzdHMgPSBmaW5kUHJvcGVydHlWYWx1ZShyZXNvdXJjZUluc3RhbmNlSWQsIHByb3BlcnR5SWQpOyBpZiAoaXNQcm9wZXJ0eVZhbHVlRXhpc3RzLmdldExlZnQoKSA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKSB7IGxvZy5kZWJ1ZygiVGhlIHByb3BlcnR5ICIgKyBwcm9wZXJ0eUlkICsKKwkgKiAiIGFscmVhZHkgYWRkZWQgdG8gdGhlIHJlc291cmNlIGluc3RhbmNlICIgKyByZXNvdXJjZUluc3RhbmNlSWQpOyByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWVVbmlxdWVVaWQoaXNQcm9wZXJ0eVZhbHVlRXhpc3RzLmdldFJpZ2h0ICgpKTsgRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UgPQorCSAqIHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgcmVzb3VyY2VJbnN0YW5jZUlkKTsgaWYgKHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlLmlzUmlnaHQoKSkgeyBCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoICJVcGRhdGVQcm9wZXJ0eVZhbHVlT25Db21wb25lbnRJbnN0YW5jZSIsCisJICogIkZhaWxlZCB0byB1cGRhdGUgcHJvcGVydHkgdmFsdWUgb24gaW5zdGFuY2UuIFN0YXR1cyBpcyAiICsgdXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpLCBFcnJvclNldmVyaXR5LkVSUk9SKTsgcmV0dXJuIEVpdGhlci5yaWdodCh1cGRhdGVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZS5yaWdodCgpLnZhbHVlKCkpOyB9IHJldHVybgorCSAqIEVpdGhlci5sZWZ0KHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlLmxlZnQoKS52YWx1ZSgpKTsgfQorCSAqIAorCSAqIGlmIChpc1Byb3BlcnR5VmFsdWVFeGlzdHMuZ2V0TGVmdCgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeyBsb2cuZGVidWcoIkFmdGVyIGZpbmRpbmcgcHJvcGVydHkgdmFsdWUgb2Yge30gb24gY29tcG9uZW50IGluc3RhbmNlIHt9IiwgcHJvcGVydHlJZCwgcmVzb3VyY2VJbnN0YW5jZUlkKTsgcmV0dXJuIEVpdGhlci5yaWdodChpc1Byb3BlcnR5VmFsdWVFeGlzdHMuZ2V0TGVmdCgpKTsgfQorCSAqIAorCSAqIFN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eURhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpLmdldFR5cGUoKTsgU3RyaW5nIHZhbHVlID0gcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlKCk7IEVpdGhlcjxPYmplY3QsIEJvb2xlYW4+IGlzVmFsaWQgPSB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5VmFsdWUocHJvcGVydHlUeXBlLCB2YWx1ZSk7CisJICogCisJICogU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWU7IGlmIChpc1ZhbGlkLmlzUmlnaHQoKSkgeyBCb29sZWFuIHJlcyA9IGlzVmFsaWQucmlnaHQoKS52YWx1ZSgpOyBpZiAocmVzID09IGZhbHNlKSB7IHJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSUxMRUdBTF9BUkdVTUVOVCk7IH0gfSBlbHNlIHsgT2JqZWN0IG9iamVjdCA9IGlzVmFsaWQubGVmdCgpLnZhbHVlKCk7IGlmIChvYmplY3QgIT0gbnVsbCkgeworCSAqIG5ld1ZhbHVlID0gb2JqZWN0LnRvU3RyaW5nKCk7IH0gfQorCSAqIAorCSAqIFN0cmluZyB1bmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eVZhbHVlVWlkKCByZXNvdXJjZUluc3RhbmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBpbmRleCk7IFByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gbmV3IFByb3BlcnR5VmFsdWVEYXRhKCk7IHByb3BlcnR5VmFsdWVEYXRhLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkgKiBwcm9wZXJ0eVZhbHVlRGF0YS5zZXRWYWx1ZShuZXdWYWx1ZSk7CisJICogCisJICogSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+IHBhaXIgPSB2YWxpZGF0ZUFuZFVwZGF0ZVJ1bGVzKHByb3BlcnR5VHlwZSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFJ1bGVzKCkpOyBpZiAocGFpci5nZXRSaWdodCgpICE9IG51bGwgJiYgcGFpci5nZXRSaWdodCgpID09IGZhbHNlKSB7IEJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS4KKwkgKiBsb2dCZUludmFsaWRWYWx1ZUVycm9yKCJBZGQgcHJvcGVydHkgdmFsdWUiLCBwYWlyLmdldExlZnQoKSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHlUeXBlKTsgcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsgfSBhZGRSdWxlc1RvTmV3UHJvcGVydHlWYWx1ZShwcm9wZXJ0eVZhbHVlRGF0YSwKKwkgKiByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCk7CisJICogCisJICogbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIHByb3BlcnR5IHZhbHVlIHRvIGdyYXBoIHt9IiwgcHJvcGVydHlWYWx1ZURhdGEpOyBFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvIC5jcmVhdGVOb2RlKHByb3BlcnR5VmFsdWVEYXRhLCBQcm9wZXJ0eVZhbHVlRGF0YS5jbGFzcyk7CisJICogbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcHJvcGVydHkgdmFsdWUgdG8gZ3JhcGgge30iLCBwcm9wZXJ0eVZhbHVlRGF0YSk7CisJICogCisJICogRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8gLmNyZWF0ZVJlbGF0aW9uKHByb3BlcnR5VmFsdWVEYXRhLCBwcm9wZXJ0eURhdGEsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9JTVBMLCBudWxsKTsKKwkgKiAKKwkgKiBpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeyBUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkgLnZhbHVlKCk7IC8vVE9ETzogY2hhbmdlIGxvZ2dlciBsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcHJvcGVydHkgdmFsdWUgIiArIHVuaXF1ZUlkICsgIiB0byBwcm9wZXJ0eSAiICsgcHJvcGVydHlJZCArCisJICogIiBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXMpOyByZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7IH0KKwkgKiAKKwkgKiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8gLmNyZWF0ZVJlbGF0aW9uKHJlc291cmNlSW5zdGFuY2VEYXRhLCBwcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFLCBudWxsKTsKKwkgKiAKKwkgKiBpZiAoY3JlYXRlUmVsUmVzdWx0LmlzUmlnaHQoKSkgeyBUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVOb2RlUmVzdWx0LnJpZ2h0KCkgLnZhbHVlKCk7IC8vVE9ETzogY2hhbmdlIGxvZ2dlciBsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2UgaW5zdGFuY2UgIiArIHJlc291cmNlSW5zdGFuY2VJZCArICIgcHJvcGVydHkgdmFsdWUgIiArIHVuaXF1ZUlkICsKKwkgKiAiIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cyk7IHJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsgfQorCSAqIAorCSAqIHJldHVybiBFaXRoZXIubGVmdChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsgfSBlbHNlIHsgbG9nLmVycm9yKCJwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4iKTsgcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5BTFJFQURZX0VYSVNUKTsgfQorCSAqIAorCSAqIH0KKwkgKi8KKwlwdWJsaWMgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+IHZhbGlkYXRlQW5kVXBkYXRlUnVsZXMoU3RyaW5nIHByb3BlcnR5VHlwZSwgTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcywgYm9vbGVhbiBpc1ZhbGlkYXRlKSB7CisKKwkJaWYgKHJ1bGVzID09IG51bGwgfHwgcnVsZXMuaXNFbXB0eSgpID09IHRydWUpIHsKKwkJCXJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+KG51bGwsIHRydWUpOworCQl9CisKKwkJZm9yIChQcm9wZXJ0eVJ1bGUgcnVsZSA6IHJ1bGVzKSB7CisJCQlTdHJpbmcgdmFsdWUgPSBydWxlLmdldFZhbHVlKCk7CisJCQlFaXRoZXI8T2JqZWN0LCBCb29sZWFuPiB1cGRhdGVSZXN1bHQgPSB2YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5VmFsdWUocHJvcGVydHlUeXBlLCB2YWx1ZSwgaXNWYWxpZGF0ZSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQkJaWYgKHVwZGF0ZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlCb29sZWFuIHN0YXR1cyA9IHVwZGF0ZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyA9PSBmYWxzZSkgeworCQkJCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPih2YWx1ZSwgc3RhdHVzKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7CisJCQkJT2JqZWN0IG9iamVjdCA9IHVwZGF0ZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKKwkJCQkJbmV3VmFsdWUgPSBvYmplY3QudG9TdHJpbmcoKTsKKwkJCQl9CisJCQkJcnVsZS5zZXRWYWx1ZShuZXdWYWx1ZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPihudWxsLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSdWxlc1RvTmV3UHJvcGVydHlWYWx1ZShQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSwgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQpIHsKKworCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0UnVsZXMoKTsKKwkJaWYgKHJ1bGVzID09IG51bGwpIHsKKwkJCVByb3BlcnR5UnVsZSBwcm9wZXJ0eVJ1bGUgPSBidWlsZFJ1bGVGcm9tUGF0aChwcm9wZXJ0eVZhbHVlRGF0YSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJcnVsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCXJ1bGVzLmFkZChwcm9wZXJ0eVJ1bGUpOworCQl9IGVsc2UgeworCQkJcnVsZXMgPSBzb3J0UnVsZXMocnVsZXMpOworCQl9CisKKwkJcHJvcGVydHlWYWx1ZURhdGEuc2V0UnVsZXMocnVsZXMpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlSdWxlIGJ1aWxkUnVsZUZyb21QYXRoKFByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCkgeworCQlMaXN0PFN0cmluZz4gcGF0aCA9IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5nZXRQYXRoKCk7CisJCS8vIEZPUiBCQy4gU2luY2Ugb2xkIFByb3BlcnR5IHZhbHVlcyBvbiBWRkMvVkYgZG9lcyBub3QgaGF2ZSBydWxlcyBvbgorCQkvLyBncmFwaC4KKwkJLy8gVXBkYXRlIGNvdWxkIGJlIGRvbmUgb24gb25lIGxldmVsIG9ubHksIHRodXMgd2UgY2FuIHVzZSB0aGlzCisJCS8vIG9wZXJhdGlvbiB0byBhdm9pZCBtaWdyYXRpb24uCisJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5pc0VtcHR5KCkgPT0gdHJ1ZSkgeworCQkJcGF0aCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJcGF0aC5hZGQocmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJfQorCQlQcm9wZXJ0eVJ1bGUgcHJvcGVydHlSdWxlID0gbmV3IFByb3BlcnR5UnVsZSgpOworCQlwcm9wZXJ0eVJ1bGUuc2V0UnVsZShwYXRoKTsKKwkJcHJvcGVydHlSdWxlLnNldFZhbHVlKHByb3BlcnR5VmFsdWVEYXRhLmdldFZhbHVlKCkpOworCQlyZXR1cm4gcHJvcGVydHlSdWxlOworCX0KKworCXByaXZhdGUgTGlzdDxQcm9wZXJ0eVJ1bGU+IHNvcnRSdWxlcyhMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMpIHsKKworCQkvLyBUT0RPOiBzb3J0IHRoZSBydWxlcyBieSBzaXplIGFuZCBiaW5hcnkgcmVwcmVzZW50YXRpb24uCisJCS8vICh4LCB5LCAuKykgLS0+IDExMCA2IHByaW9yaXR5IDEKKwkJLy8gKHgsIC4rLCB6KSAtLT4gMTAxIDUgcHJpb3JpdHkgMgorCisJCXJldHVybiBydWxlczsKKwl9CisKKwlwdWJsaWMgSW1tdXRhYmxlUGFpcjxUaXRhbk9wZXJhdGlvblN0YXR1cywgU3RyaW5nPiBmaW5kUHJvcGVydHlWYWx1ZShTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZUlkLCBTdHJpbmcgcHJvcGVydHlJZCkgeworCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gY2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkge30gYWxyZWFkeSBhZGRlZCB0byByZXNvdXJjZSBpbnN0YW5jZSB7fSIsIHByb3BlcnR5SWQsIHJlc291cmNlSW5zdGFuY2VJZCk7CisKKwkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxSZXMgPSB0aGlzLmdldEFsbFByb3BlcnRpZXNPZlJlc291cmNlSW5zdGFuY2VPbmx5UHJvcGVydHlEZWZJZChyZXNvdXJjZUluc3RhbmNlSWQpOworCQlpZiAoZ2V0QWxsUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0QWxsUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy50cmFjZSgiQWZ0ZXIgZmV0Y2hpbmcgYWxsIHByb3BlcnRpZXMgb2YgcmVzb3VyY2UgaW5zdGFuY2Uge30uIFN0YXR1cyBpcyB7fSIsIHJlc291cmNlSW5zdGFuY2VJZCwgc3RhdHVzKTsKKwkJCXJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxUaXRhbk9wZXJhdGlvblN0YXR1cywgU3RyaW5nPihzdGF0dXMsIG51bGwpOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBsaXN0ID0gZ2V0QWxsUmVzLmxlZnQoKS52YWx1ZSgpOworCQlpZiAobGlzdCAhPSBudWxsKSB7CisJCQlmb3IgKENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eSA6IGxpc3QpIHsKKwkJCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IGluc3RhbmNlUHJvcGVydHkuZ2V0VW5pcXVlSWQoKTsKKwkJCQlTdHJpbmcgdmFsdWVVbmlxdWVVaWQgPSBpbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCk7CisJCQkJbG9nLnRyYWNlKCJHbyBvdmVyIHByb3BlcnR5IHt9IHVuZGVyIHJlc291cmNlIGluc3RhbmNlIHt9LiB2YWx1ZVVuaXF1ZUlkID0ge30iLCBwcm9wZXJ0eVVuaXF1ZUlkLCByZXNvdXJjZUluc3RhbmNlSWQsIHZhbHVlVW5pcXVlVWlkKTsKKwkJCQlpZiAocHJvcGVydHlJZC5lcXVhbHMocHJvcGVydHlVbmlxdWVJZCkgJiYgdmFsdWVVbmlxdWVVaWQgIT0gbnVsbCkgeworCQkJCQlsb2cuZGVidWcoIlRoZSBwcm9wZXJ0eSB7fSBhbHJlYWR5IGNyZWF0ZWQgdW5kZXIgcmVzb3VyY2UgaW5zdGFuY2Uge30iLCBwcm9wZXJ0eUlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8VGl0YW5PcGVyYXRpb25TdGF0dXMsIFN0cmluZz4oVGl0YW5PcGVyYXRpb25TdGF0dXMuQUxSRUFEWV9FWElTVCwgdmFsdWVVbmlxdWVVaWQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxUaXRhbk9wZXJhdGlvblN0YXR1cywgU3RyaW5nPihUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsIG51bGwpOworCX0KKworCS8qKgorCSAqIHVwZGF0ZSB2YWx1ZSBvZiBwcm9wZXJ0eSBvbiByZXNvdXJjZSBpbnN0YW5jZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZUlkCisJICogQHJldHVybgorCSAqLworCS8qCisJICogcHVibGljIEVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVByb3BlcnR5T2ZSZXNvdXJjZUluc3RhbmNlKCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCkgeworCSAqIAorCSAqIC8vLyAjUlVMRVMgU1VQUE9SVCAvLy8gSWdub3JlIHJ1bGVzIHJlY2VpdmVkIGZyb20gY2xpZW50IHRpbGwgc3VwcG9ydCByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0UnVsZXMobnVsbCk7IC8vLyAvLy8gRWl0aGVyPENvbXBvbmVudEluc3RhbmNlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRSZXNJbnN0YW5jZVJlcyA9IHRpdGFuR2VuZXJpY0RhbyAuZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIKKwkgKiAuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkgKiAKKwkgKiBpZiAoZmluZFJlc0luc3RhbmNlUmVzLmlzUmlnaHQoKSkgeyBUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kUmVzSW5zdGFuY2VSZXMucmlnaHQoKS52YWx1ZSgpOyBpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeyBzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOyB9IHJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsgfQorCSAqIAorCSAqIFN0cmluZyBwcm9wZXJ0eUlkID0gcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFVuaXF1ZUlkKCk7IEVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUHJvcGVydHlEZWZSZXMgPSB0aXRhbkdlbmVyaWNEYW8gLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyIC5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSksIHByb3BlcnR5SWQsIFByb3BlcnR5RGF0YS5jbGFzcyk7CisJICogCisJICogaWYgKGZpbmRQcm9wZXJ0eURlZlJlcy5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFByb3BlcnR5RGVmUmVzLnJpZ2h0KCkudmFsdWUoKTsgcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOyB9CisJICogCisJICogU3RyaW5nIHZhbHVlVW5pcXVlVWlkID0gcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlVW5pcXVlVWlkKCk7IGlmICh2YWx1ZVVuaXF1ZVVpZCA9PSBudWxsKSB7IHJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCk7IH0gZWxzZSB7IEVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRQcm9wZXJ0eVZhbHVlUmVzID0KKwkgKiB0aXRhbkdlbmVyaWNEYW8gLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyIC5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlKSwgdmFsdWVVbmlxdWVVaWQsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsgaWYgKGZpbmRQcm9wZXJ0eVZhbHVlUmVzLmlzUmlnaHQoKSkgeyBUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kUHJvcGVydHlWYWx1ZVJlcy5yaWdodCgpLnZhbHVlKCk7IGlmCisJICogKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsgc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsgfSByZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7IH0KKwkgKiAKKwkgKiBTdHJpbmcgdmFsdWUgPSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWUoKTsKKwkgKiAKKwkgKiBFaXRoZXI8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIgLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUpLCB2YWx1ZVVuaXF1ZVVpZCwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX0lNUEwsIE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSwKKwkgKiBQcm9wZXJ0eURhdGEuY2xhc3MpOworCSAqIAorCSAqIGlmIChjaGlsZC5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2hpbGQucmlnaHQoKS52YWx1ZSgpOyBpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeyBzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOyB9IHJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsgfQorCSAqIAorCSAqIFByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSBjaGlsZC5sZWZ0KCkudmFsdWUoKS5sZWZ0OyBTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcGVydHlEYXRhLmdldFByb3BlcnR5RGF0YURlZmluaXRpb24oKS5nZXRUeXBlKCk7CisJICogCisJICogbG9nLmRlYnVnKCJUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkge30gaXMge30iLCBwcm9wZXJ0eURhdGEuZ2V0VW5pcXVlSWQoKSwgcHJvcGVydHlUeXBlKTsKKwkgKiAKKwkgKiBFaXRoZXI8T2JqZWN0LCBCb29sZWFuPiBpc1ZhbGlkID0gdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5VHlwZSwgdmFsdWUpOworCSAqIAorCSAqIFN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlOyBpZiAoaXNWYWxpZC5pc1JpZ2h0KCkpIHsgQm9vbGVhbiByZXMgPSBpc1ZhbGlkLnJpZ2h0KCkudmFsdWUoKTsgaWYgKHJlcyA9PSBmYWxzZSkgeyByZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLklMTEVHQUxfQVJHVU1FTlQpOyB9IH0gZWxzZSB7IE9iamVjdCBvYmplY3QgPSBpc1ZhbGlkLmxlZnQoKS52YWx1ZSgpOyBpZiAob2JqZWN0ICE9IG51bGwpIHsKKwkgKiBuZXdWYWx1ZSA9IG9iamVjdC50b1N0cmluZygpOyB9IH0gUHJvcGVydHlWYWx1ZURhdGEgcHJvcGVydHlWYWx1ZURhdGEgPSBmaW5kUHJvcGVydHlWYWx1ZVJlcy5sZWZ0KCkudmFsdWUoKTsgbG9nLmRlYnVnKCJHb2luZyB0byB1cGRhdGUgcHJvcGVydHkgdmFsdWUgZnJvbSB7fSB0byB7fSIsIHByb3BlcnR5VmFsdWVEYXRhLmdldFZhbHVlKCksIG5ld1ZhbHVlKTsKKwkgKiBwcm9wZXJ0eVZhbHVlRGF0YS5zZXRWYWx1ZShuZXdWYWx1ZSk7CisJICogCisJICogSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+IHBhaXIgPSB2YWxpZGF0ZUFuZFVwZGF0ZVJ1bGVzKHByb3BlcnR5VHlwZSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFJ1bGVzKCkpOyBpZiAocGFpci5nZXRSaWdodCgpICE9IG51bGwgJiYgcGFpci5nZXRSaWdodCgpID09IGZhbHNlKSB7IEJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS4KKwkgKiBsb2dCZUludmFsaWRWYWx1ZUVycm9yKCJBZGQgcHJvcGVydHkgdmFsdWUiLCBwYWlyLmdldExlZnQoKSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHlUeXBlKTsgcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsgfSB1cGRhdGVSdWxlc0luUHJvcGVydHlWYWx1ZShwcm9wZXJ0eVZhbHVlRGF0YSwKKwkgKiByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCk7CisJICogCisJICogRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocHJvcGVydHlWYWx1ZURhdGEsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsgaWYgKHVwZGF0ZVJlcy5pc1JpZ2h0KCkpIHsgVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gdXBkYXRlUmVzLnJpZ2h0KCkudmFsdWUoKTsgcmV0dXJuCisJICogRWl0aGVyLnJpZ2h0KHN0YXR1cyk7IH0gZWxzZSB7IHJldHVybiBFaXRoZXIubGVmdCh1cGRhdGVSZXMubGVmdCgpLnZhbHVlKCkpOyB9IH0KKwkgKiAKKwkgKiB9CisJICovCisKKwlwdWJsaWMgdm9pZCB1cGRhdGVSdWxlc0luUHJvcGVydHlWYWx1ZShQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSwgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQpIHsKKworCQlMaXN0PFByb3BlcnR5UnVsZT4gY3VycmVudFJ1bGVzID0gcHJvcGVydHlWYWx1ZURhdGEuZ2V0UnVsZXMoKTsKKworCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuZ2V0UnVsZXMoKTsKKwkJLy8gaWYgcnVsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisJCWlmIChydWxlcyA9PSBudWxsKSB7CisKKwkJCVByb3BlcnR5UnVsZSBwcm9wZXJ0eVJ1bGUgPSBidWlsZFJ1bGVGcm9tUGF0aChwcm9wZXJ0eVZhbHVlRGF0YSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQpOworCQkJcnVsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCXJ1bGVzLmFkZChwcm9wZXJ0eVJ1bGUpOworCisJCQlpZiAoY3VycmVudFJ1bGVzICE9IG51bGwpIHsKKwkJCQlydWxlcyA9IG1lcmdlUnVsZXMoY3VycmVudFJ1bGVzLCBydWxlcyk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCS8vIEZ1bGwgbW9kZS4gYWxsIHJ1bGVzIGFyZSBzZW50IGluIHVwZGF0ZSBvcGVyYXRpb24uCisJCQlydWxlcyA9IHNvcnRSdWxlcyhydWxlcyk7CisJCX0KKworCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRSdWxlcyhydWxlcyk7CisKKwl9CisKKwlwcml2YXRlIExpc3Q8UHJvcGVydHlSdWxlPiBtZXJnZVJ1bGVzKExpc3Q8UHJvcGVydHlSdWxlPiBjdXJyZW50UnVsZXMsIExpc3Q8UHJvcGVydHlSdWxlPiBuZXdSdWxlcykgeworCisJCUxpc3Q8UHJvcGVydHlSdWxlPiBtZXJnZWRSdWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCWlmIChuZXdSdWxlcyA9PSBudWxsIHx8IG5ld1J1bGVzLmlzRW1wdHkoKSA9PSB0cnVlKSB7CisJCQlyZXR1cm4gY3VycmVudFJ1bGVzOworCQl9CisKKwkJZm9yIChQcm9wZXJ0eVJ1bGUgcnVsZSA6IGN1cnJlbnRSdWxlcykgeworCQkJUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZSA9IG5ldyBQcm9wZXJ0eVJ1bGUocnVsZS5nZXRSdWxlKCksIHJ1bGUuZ2V0VmFsdWUoKSk7CisJCQltZXJnZWRSdWxlcy5hZGQocHJvcGVydHlSdWxlKTsKKwkJfQorCisJCWZvciAoUHJvcGVydHlSdWxlIHJ1bGUgOiBuZXdSdWxlcykgeworCQkJUHJvcGVydHlSdWxlIGZvdW5kUnVsZSA9IGZpbmRSdWxlSW5MaXN0KHJ1bGUsIG1lcmdlZFJ1bGVzKTsKKwkJCWlmIChmb3VuZFJ1bGUgIT0gbnVsbCkgeworCQkJCWZvdW5kUnVsZS5zZXRWYWx1ZShydWxlLmdldFZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQltZXJnZWRSdWxlcy5hZGQocnVsZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbWVyZ2VkUnVsZXM7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVJ1bGUgZmluZFJ1bGVJbkxpc3QoUHJvcGVydHlSdWxlIHJ1bGUsIExpc3Q8UHJvcGVydHlSdWxlPiBydWxlcykgeworCisJCWlmIChydWxlcyA9PSBudWxsIHx8IHJ1bGVzLmlzRW1wdHkoKSA9PSB0cnVlIHx8IHJ1bGUuZ2V0UnVsZSgpID09IG51bGwgfHwgcnVsZS5nZXRSdWxlKCkuaXNFbXB0eSgpID09IHRydWUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJUHJvcGVydHlSdWxlIGZvdW5kUnVsZSA9IG51bGw7CisJCWZvciAoUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZSA6IHJ1bGVzKSB7CisJCQlpZiAocnVsZS5nZXRSdWxlU2l6ZSgpICE9IHByb3BlcnR5UnVsZS5nZXRSdWxlU2l6ZSgpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlib29sZWFuIGVxdWFscyA9IHByb3BlcnR5UnVsZS5jb21wYXJlUnVsZShydWxlKTsKKwkJCWlmIChlcXVhbHMgPT0gdHJ1ZSkgeworCQkJCWZvdW5kUnVsZSA9IHByb3BlcnR5UnVsZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmb3VuZFJ1bGU7CisJfQorCisJLyoqCisJICogcmV0dXJuIGFsbCBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgdG8gcmVzb3VyY2UgaW5zdGFuY2UuIFRoZSByZXN1bHQgZG9lcyBjb250YWlucyB0aGUgcHJvcGVydHkgdW5pcXVlIGlkIGJ1dCBub3QgaXRzIHR5cGUsIGRlZmF1bHQgdmFsdWUuLi4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZVVpZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxQcm9wZXJ0aWVzT2ZSZXNvdXJjZUluc3RhbmNlT25seVByb3BlcnR5RGVmSWQoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVaWQpIHsKKworCQlyZXR1cm4gZ2V0QWxsUHJvcGVydGllc09mUmVzb3VyY2VJbnN0YW5jZU9ubHlQcm9wZXJ0eURlZklkKHJlc291cmNlSW5zdGFuY2VVaWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKTsKKworCX0KKworCS8qCisJICogcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVZhbHVlVG9SZXNvdXJjZUluc3RhbmNlKCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgSW50ZWdlciBpbmRleCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJICogCisJICogLy8vICNSVUxFUyBTVVBQT1JUIC8vLyBJZ25vcmUgcnVsZXMgcmVjZWl2ZWQgZnJvbSBjbGllbnQgdGlsbCBzdXBwb3J0IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRSdWxlcyhudWxsKTsgLy8vIC8vLworCSAqIAorCSAqIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCSAqIAorCSAqIHRyeSB7CisJICogCisJICogRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gdGhpcyAuYWRkUHJvcGVydHlUb1Jlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQsIGluZGV4KTsKKwkgKiAKKwkgKiBpZiAoZWl0aGVyU3RhdHVzLmlzUmlnaHQoKSkgeyBsb2cuZXJyb3IoICJGYWlsZWQgdG8gYWRkIHByb3BlcnR5IHZhbHVlIHt9IHRvIHJlc291cmNlIGluc3RhbmNlIHt9IGluIEdyYXBoLiBzdGF0dXMgaXMge30iICwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQsIGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsgcmVzdWx0ID0KKwkgKiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyIC5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyU3RhdHVzLnJpZ2h0KCkgLnZhbHVlKCkpKTsgcmV0dXJuIHJlc3VsdDsgfSBlbHNlIHsgUHJvcGVydHlWYWx1ZURhdGEgcHJvcGVydHlWYWx1ZURhdGEgPSBlaXRoZXJTdGF0dXMubGVmdCgpIC52YWx1ZSgpOworCSAqIAorCSAqIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcHJvcGVydHlWYWx1ZVJlc3VsdCA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KCBwcm9wZXJ0eVZhbHVlRGF0YSwgcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KTsKKwkgKiAKKwkgKiBsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkgaXMge30iLCBwcm9wZXJ0eVZhbHVlUmVzdWx0KTsgcmVzdWx0ID0gRWl0aGVyLmxlZnQocHJvcGVydHlWYWx1ZVJlc3VsdCk7IHJldHVybiByZXN1bHQ7IH0gfQorCSAqIAorCSAqIGZpbmFsbHkgeyBpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeyBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeyBsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7IHRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOyB9IGVsc2UgeyBsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOyB0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJICogfSB9IH0KKwkgKiAKKwkgKiB9CisJICogCisJICogcHVibGljIEVpdGhlcjxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVQcm9wZXJ0eVZhbHVlSW5SZXNvdXJjZUluc3RhbmNlKCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJICogCisJICogRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJICogCisJICogdHJ5IHsgLy9UT0RPOiB2ZXJpZnkgdmFsaWRVbmlxdWVJZCBleGlzdHMgRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gdGhpcyAudXBkYXRlUHJvcGVydHlPZlJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LCByZXNvdXJjZUluc3RhbmNlSWQpOworCSAqIAorCSAqIGlmIChlaXRoZXJTdGF0dXMuaXNSaWdodCgpKSB7IGxvZy5lcnJvciggIkZhaWxlZCB0byBhZGQgcHJvcGVydHkgdmFsdWUge30gdG8gcmVzb3VyY2UgaW5zdGFuY2Uge30gaW4gR3JhcGguIHN0YXR1cyBpcyB7fSIgLCByZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHJlc291cmNlSW5zdGFuY2VJZCwgZWl0aGVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOyByZXN1bHQgPQorCSAqIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIgLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhlaXRoZXJTdGF0dXMucmlnaHQoKSAudmFsdWUoKSkpOyByZXR1cm4gcmVzdWx0OyB9IGVsc2UgeyBQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSA9IGVpdGhlclN0YXR1cy5sZWZ0KCkgLnZhbHVlKCk7CisJICogCisJICogQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eVZhbHVlUmVzdWx0ID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlUHJvcGVydHkoIHByb3BlcnR5VmFsdWVEYXRhLCByZXNvdXJjZUluc3RhbmNlUHJvcGVydHkpOworCSAqIAorCSAqIGxvZy5kZWJ1ZygiVGhlIHJldHVybmVkIFJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSBpcyB7fSIsIHByb3BlcnR5VmFsdWVSZXN1bHQpOyByZXN1bHQgPSBFaXRoZXIubGVmdChwcm9wZXJ0eVZhbHVlUmVzdWx0KTsgcmV0dXJuIHJlc3VsdDsgfSB9CisJICogCisJICogZmluYWxseSB7IGlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7IGlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7IGxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsgdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7IH0gZWxzZSB7IGxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7IHRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkgKiB9IH0gfQorCSAqIAorCSAqIH0KKwkgKi8KKworCXB1YmxpYyBFaXRoZXI8UHJvcGVydHlWYWx1ZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZW1vdmVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZShTdHJpbmcgcHJvcGVydHlWYWx1ZVVpZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCkgeworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUmVzSW5zdGFuY2VSZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSksIHJlc291cmNlSW5zdGFuY2VJZCwgQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKworCQlpZiAoZmluZFJlc0luc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFJlc0luc3RhbmNlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRQcm9wZXJ0eURlZlJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlKSwgcHJvcGVydHlWYWx1ZVVpZCwgUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCisJCWlmIChmaW5kUHJvcGVydHlEZWZSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kUHJvcGVydHlEZWZSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lEOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5nZXRSZWxhdGlvbihmaW5kUmVzSW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCksIGZpbmRQcm9wZXJ0eURlZlJlcy5sZWZ0KCkudmFsdWUoKSwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFKTsKKwkJaWYgKHJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJLy8gVE9ETzogYWRkIGVycm9yIGluIGNhc2Ugb2YgZXJyb3IKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCUVpdGhlcjxQcm9wZXJ0eVZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShmaW5kUHJvcGVydHlEZWZSZXMubGVmdCgpLnZhbHVlKCksIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJaWYgKGRlbGV0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRlbGV0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlQcm9wZXJ0eVZhbHVlRGF0YSB2YWx1ZSA9IGRlbGV0ZU5vZGUubGVmdCgpLnZhbHVlKCk7CisJCXJldHVybiBFaXRoZXIubGVmdCh2YWx1ZSk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlbW92ZVByb3BlcnR5VmFsdWVGcm9tUmVzb3VyY2VJbnN0YW5jZShTdHJpbmcgcHJvcGVydHlWYWx1ZVVpZCwgU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlUHJvcGVydHksIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyU3RhdHVzID0gdGhpcy5yZW1vdmVQcm9wZXJ0eU9mUmVzb3VyY2VJbnN0YW5jZShwcm9wZXJ0eVZhbHVlVWlkLCByZXNvdXJjZUluc3RhbmNlSWQpOworCisJCQlpZiAoZWl0aGVyU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHJlbW92ZSBwcm9wZXJ0eSB2YWx1ZSB7fSBmcm9tIHJlc291cmNlIGluc3RhbmNlIHt9IGluIEdyYXBoLiBzdGF0dXMgaXMge30iLCBwcm9wZXJ0eVZhbHVlVWlkLCByZXNvdXJjZUluc3RhbmNlSWQsIGVpdGhlclN0YXR1cy5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhlaXRoZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0gZWxzZSB7CisJCQkJUHJvcGVydHlWYWx1ZURhdGEgcHJvcGVydHlWYWx1ZURhdGEgPSBlaXRoZXJTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHByb3BlcnR5VmFsdWVSZXN1bHQgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQkJCXByb3BlcnR5VmFsdWVSZXN1bHQuc2V0VW5pcXVlSWQocmVzb3VyY2VJbnN0YW5jZUlkKTsKKwkJCQlwcm9wZXJ0eVZhbHVlUmVzdWx0LnNldFZhbHVlKHByb3BlcnR5VmFsdWVEYXRhLmdldFZhbHVlKCkpOworCisJCQkJbG9nLmRlYnVnKCJUaGUgcmV0dXJuZWQgUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5IGlzIHt9IiwgcHJvcGVydHlWYWx1ZVJlc3VsdCk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocHJvcGVydHlWYWx1ZVJlc3VsdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCisJCWZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5KFByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSkgeworCisJCVN0cmluZyB2YWx1ZSA9IHByb3BlcnR5VmFsdWVEYXRhLmdldFZhbHVlKCk7CisJCVN0cmluZyB1aWQgPSBwcm9wZXJ0eVZhbHVlRGF0YS5nZXRVbmlxdWVJZCgpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eShyZXNvdXJjZUluc3RhbmNlUHJvcGVydHksIHZhbHVlLCB1aWQpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldFBhdGgocmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LmdldFBhdGgoKSk7CisKKwkJcmV0dXJuIGluc3RhbmNlUHJvcGVydHk7CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eUNvbnN0cmFpbnRKYWNrc29uRGVzZXJpYWxpc2VyIGV4dGVuZHMgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLkpzb25EZXNlcmlhbGl6ZXI8UHJvcGVydHlDb25zdHJhaW50PiB7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBQcm9wZXJ0eUNvbnN0cmFpbnQgZGVzZXJpYWxpemUob3JnLmNvZGVoYXVzLmphY2tzb24uSnNvblBhcnNlciBqc29uLCBEZXNlcmlhbGl6YXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgSnNvblByb2Nlc3NpbmdFeGNlcHRpb24geworCisJCQlPYmplY3RDb2RlYyBvYyA9IGpzb24uZ2V0Q29kZWMoKTsKKwkJCUpzb25Ob2RlIG5vZGUgPSBvYy5yZWFkVHJlZShqc29uKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eURlZmF1bHRWYWx1ZVZhbGlkKElDb21wbGV4RGVmYXVsdFZhbHVlIHByb3BlcnR5RGVmaW5pdGlvbiwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJaWYgKHByb3BlcnR5RGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7CisJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFR5cGUoKTsKKwkJVG9zY2FQcm9wZXJ0eVR5cGUgdHlwZSA9IGdldFR5cGUocHJvcGVydHlUeXBlKTsKKwkJaWYgKHR5cGUgPT0gVG9zY2FQcm9wZXJ0eVR5cGUuTElTVCB8fCB0eXBlID09IFRvc2NhUHJvcGVydHlUeXBlLk1BUCkgeworCQkJU2NoZW1hRGVmaW5pdGlvbiBkZWYgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0U2NoZW1hKCk7CisJCQlpZiAoZGVmID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BEZWYgPSBkZWYuZ2V0UHJvcGVydHkoKTsKKwkJCWlmIChwcm9wRGVmID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpbm5lclR5cGUgPSBwcm9wRGVmLmdldFR5cGUoKTsKKwkJfQorCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7CisJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCWlzVmFsaWQgPSBpc1ZhbGlkVmFsdWUodHlwZSwgdmFsdWUsIGlubmVyVHlwZSwgZGF0YVR5cGVzKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy50cmFjZSgiVGhlIGdpdmVuIHR5cGUge30gaXMgbm90IGEgcHJlIGRlZmluZWQgb25lLiIsIHByb3BlcnR5VHlwZSk7CisKKwkJCURhdGFUeXBlRGVmaW5pdGlvbiBmb3VuZER0ID0gZGF0YVR5cGVzLmdldChwcm9wZXJ0eVR5cGUpOworCQkJaWYgKGZvdW5kRHQgIT0gbnVsbCkgeworCQkJCWlzVmFsaWQgPSBpc1ZhbGlkQ29tcGxleFZhbHVlKGZvdW5kRHQsIHZhbHVlLCBkYXRhVHlwZXMpOworCQkJfSBlbHNlIHsKKwkJCQlpc1ZhbGlkID0gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIGlzVmFsaWQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVR5cGVWYWxpZChJQ29tcGxleERlZmF1bHRWYWx1ZSBwcm9wZXJ0eSkgeworCisJCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUocHJvcGVydHkuZ2V0VHlwZSgpKSA9PSBudWxsKSB7CisKKwkJCUVpdGhlcjxCb29sZWFuLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVmaW5lZEluRGF0YVR5cGVzID0gaXNEZWZpbmVkSW5EYXRhVHlwZXMocHJvcGVydHkuZ2V0VHlwZSgpKTsKKworCQkJaWYgKGRlZmluZWRJbkRhdGFUeXBlcy5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCUJvb2xlYW4gaXNFeGlzdCA9IGRlZmluZWRJbkRhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlyZXR1cm4gaXNFeGlzdC5ib29sZWFuVmFsdWUoKTsKKwkJCX0KKworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbW11dGFibGVQYWlyPFN0cmluZywgQm9vbGVhbj4gaXNQcm9wZXJ0eUlubmVyVHlwZVZhbGlkKElDb21wbGV4RGVmYXVsdFZhbHVlIHByb3BlcnR5LCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPihudWxsLCBmYWxzZSk7CisJCX0KKworCQlTY2hlbWFEZWZpbml0aW9uIHNjaGVtYTsKKwkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBpbm5lclByb3A7CisJCVN0cmluZyBpbm5lclR5cGUgPSBudWxsOworCQlpZiAoKHNjaGVtYSA9IHByb3BlcnR5LmdldFNjaGVtYSgpKSAhPSBudWxsKSB7CisJCQlpZiAoKGlubmVyUHJvcCA9IHNjaGVtYS5nZXRQcm9wZXJ0eSgpKSAhPSBudWxsKSB7CisJCQkJaW5uZXJUeXBlID0gaW5uZXJQcm9wLmdldFR5cGUoKTsKKwkJCX0KKwkJfQorCisJCVRvc2NhUHJvcGVydHlUeXBlIGlubmVyVG9zY2FUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUoaW5uZXJUeXBlKTsKKworCQlpZiAoaW5uZXJUb3NjYVR5cGUgPT0gbnVsbCkgeworCQkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGRhdGFUeXBlcy5nZXQoaW5uZXJUeXBlKTsKKwkJCWlmIChkYXRhVHlwZURlZmluaXRpb24gPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiVGhlIGlubmVyIHR5cGUge30gaXMgbm90IGEgZGF0YSB0eXBlIiwgaW5uZXJUeXBlKTsKKwkJCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPihpbm5lclR5cGUsIGZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJUaGUgaW5uZXIgdHlwZSB7fSBpcyBhIGRhdGEgdHlwZS4gRGF0YSB0eXBlIGRlZmluaXRpb24gaXMge30iLCBpbm5lclR5cGUsIGRhdGFUeXBlRGVmaW5pdGlvbik7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPihpbm5lclR5cGUsIHRydWUpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkQ29tcGxleFZhbHVlKERhdGFUeXBlRGVmaW5pdGlvbiBmb3VuZER0LCBTdHJpbmcgdmFsdWUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCS8qCisJCSAqIEVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsRGF0YVR5cGVzUmVzID0gZ2V0QWxsRGF0YVR5cGVzKCk7IGlmIChhbGxEYXRhVHlwZXNSZXMuaXNSaWdodCgpKSB7IFRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbERhdGFUeXBlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCSAqIGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIGRhdGEgdHlwZXMgZnJvbSBncmFwaC4gU3RhdHVzIGlzIHt9Iiwgc3RhdHVzKTsgcmV0dXJuIGZhbHNlOyB9CisJCSAqIAorCQkgKiBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IGFsbERhdGFUeXBlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJICovCisJCUltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+IHZhbGlkYXRlQW5kVXBkYXRlID0gZGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIudmFsaWRhdGVBbmRVcGRhdGUodmFsdWUsIGZvdW5kRHQsIGRhdGFUeXBlcyk7CisKKwkJbG9nLnRyYWNlKCJUaGUgcmVzdWx0IGFmdGVyIHZhbGlkYXRpbmcgY29tcGxleCB2YWx1ZSBvZiB0eXBlIHt9IGlzIHt9IiwgZm91bmREdC5nZXROYW1lKCksIHZhbGlkYXRlQW5kVXBkYXRlKTsKKworCQlyZXR1cm4gdmFsaWRhdGVBbmRVcGRhdGUucmlnaHQuYm9vbGVhblZhbHVlKCk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZEFsbERhdGFUeXBlRGVmaW5pdGlvbihEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uKSB7CisKKwkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBuYW1lVG9EYXRhVHlwZURlZiA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQlEYXRhVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSBkYXRhVHlwZURlZmluaXRpb247CisKKwkJd2hpbGUgKHR5cGVEZWZpbml0aW9uICE9IG51bGwpIHsKKworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSB0eXBlRGVmaW5pdGlvbi5nZXRQcm9wZXJ0aWVzKCk7CisJCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQkJZm9yIChQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uIDogcHJvcGVydGllcykgeworCQkJCQlTdHJpbmcgdHlwZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCk7CisJCQkJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkYXRhVHlwZUJ5TmFtZSA9IHRoaXMuZ2V0RGF0YVR5cGVVc2luZ05hbWUodHlwZSk7CisJCQkJCWlmIChkYXRhVHlwZUJ5TmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZGF0YVR5cGVCeU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCURhdGFUeXBlRGVmaW5pdGlvbiB2YWx1ZSA9IGRhdGFUeXBlQnlOYW1lLmxlZnQoKS52YWx1ZSgpOworCQkJCQkJaWYgKGZhbHNlID09IG5hbWVUb0RhdGFUeXBlRGVmLmNvbnRhaW5zS2V5KHR5cGUpKSB7CisJCQkJCQkJbmFtZVRvRGF0YVR5cGVEZWYucHV0KHR5cGUsIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfQorCQkJfQorCisJCQl0eXBlRGVmaW5pdGlvbiA9IHR5cGVEZWZpbml0aW9uLmdldERlcml2ZWRGcm9tKCk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQobmFtZVRvRGF0YVR5cGVEZWYpOworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEFsbFByb3BlcnRpZXNPZlJlc291cmNlSW5zdGFuY2VPbmx5UHJvcGVydHlEZWZJZChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVpZCwgTm9kZVR5cGVFbnVtIGluc3RhbmNlTm9kZVR5cGUpIHsKKworCQkvLyBFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4KKwkJLy8gZmluZFJlc0luc3RhbmNlUmVzID0KKwkJLy8gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoaW5zdGFuY2VOb2RlVHlwZSksCisJCS8vIHJlc291cmNlSW5zdGFuY2VVaWQsIENvbXBvbmVudEluc3RhbmNlRGF0YS5jbGFzcyk7CisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRSZXNJbnN0YW5jZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKGluc3RhbmNlTm9kZVR5cGUpLCByZXNvdXJjZUluc3RhbmNlVWlkKTsKKworCQlpZiAoZmluZFJlc0luc3RhbmNlUmVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFJlc0luc3RhbmNlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCS8vIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4+LAorCQkvLyBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcHJvcGVydHlJbXBsTm9kZXMgPQorCQkvLyB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShpbnN0YW5jZU5vZGVUeXBlKSwKKwkJLy8gcmVzb3VyY2VJbnN0YW5jZVVpZCwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFLAorCQkvLyBOb2RlVHlwZUVudW0uUHJvcGVydHlWYWx1ZSwgUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eUltcGxOb2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlblZlcnRlY2llcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShpbnN0YW5jZU5vZGVUeXBlKSwgcmVzb3VyY2VJbnN0YW5jZVVpZCwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFKTsKKworCQlpZiAocHJvcGVydHlJbXBsTm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBwcm9wZXJ0eUltcGxOb2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8VGl0YW5WZXJ0ZXgsIEVkZ2U+PiBsaXN0ID0gcHJvcGVydHlJbXBsTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChsaXN0ID09IG51bGwgfHwgdHJ1ZSA9PSBsaXN0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChJbW11dGFibGVQYWlyPFRpdGFuVmVydGV4LCBFZGdlPiBwcm9wZXJ0eVZhbHVlIDogbGlzdCkgeworCQkJVGl0YW5WZXJ0ZXggcHJvcGVydHlWYWx1ZURhdGFWZXJ0ZXggPSBwcm9wZXJ0eVZhbHVlLmdldExlZnQoKTsKKwkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlVWlkID0gKFN0cmluZykgdGl0YW5HZW5lcmljRGFvLmdldFByb3BlcnR5KHByb3BlcnR5VmFsdWVEYXRhVmVydGV4LCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0eShwcm9wZXJ0eVZhbHVlRGF0YVZlcnRleCwgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WQUxVRS5nZXRQcm9wZXJ0eSgpKTsKKworCQkJSW1tdXRhYmxlUGFpcjxUaXRhblZlcnRleCwgRWRnZT4gcHJvcGVydHlEZWZQYWlyID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkVmVydGV4KHByb3BlcnR5VmFsdWVEYXRhVmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfSU1QTCk7CisJCQlpZiAocHJvcGVydHlEZWZQYWlyID09IG51bGwpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQl9CisKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQcm9wZXJ0aWVzKHByb3BlcnR5VmFsdWVEYXRhVmVydGV4KTsKKwkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhID0gR3JhcGhFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KE5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlLmdldE5hbWUoKSwgR3JhcGhFbGVtZW50VHlwZUVudW0uTm9kZSwgcHJvcGVydGllcywgUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpOworCQkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSAoU3RyaW5nKSB0aXRhbkdlbmVyaWNEYW8uZ2V0UHJvcGVydHkocHJvcGVydHlEZWZQYWlyLmxlZnQsIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCkpOworCisJCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCQkvLyBzZXQgcHJvcGVydHkgb3JpZ2luYWwgdW5pcXVlIGlkCisJCQlyZXNvdXJjZUluc3RhbmNlUHJvcGVydHkuc2V0VW5pcXVlSWQocHJvcGVydHlVbmlxdWVJZCk7CisJCQkvLyBzZXQgcmVzb3VyY2UgaWQKKwkJCS8vIFRPRE86IGVzb2ZlciBhZGQgcmVzb3VyY2UgaWQKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXJlbnRVbmlxdWVJZChudWxsKTsKKwkJCS8vIHNldCB2YWx1ZQorCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKKwkJCS8vIHNldCBwcm9wZXJ0eSB2YWx1ZSB1bmlxdWUgaWQKKwkJCXJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZVVuaXF1ZVVpZChwcm9wZXJ0eVZhbHVlVWlkKTsKKwkJCS8vIHNldCBydWxlcworCQkJcmVzb3VyY2VJbnN0YW5jZVByb3BlcnR5LnNldFJ1bGVzKHByb3BlcnR5VmFsdWVEYXRhLmdldFJ1bGVzKCkpOworCisJCQlyZXN1bHQuYWRkKHJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwl9CisKKwkvKioKKwkgKiBGaW5kIHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGxpc3Qgb2YgY29tcG9uZW50IGluc3RhbmNlcy4gU3RhcnQgdGhlIHNlYXJjaCBmcm9tIHRoZSBzZWNvbmQgY29tcG9uZW50IGluc3RhbmNlCisJICogCisJICogQHBhcmFtIHBhdGhPZkNvbXBvbmVudEluc3RhbmNlcworCSAqIEBwYXJhbSBwcm9wZXJ0eVVuaXF1ZUlkCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPFN0cmluZywgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmREZWZhdWx0VmFsdWVGcm9tU2Vjb25kUG9zaXRpb24oTGlzdDxTdHJpbmc+IHBhdGhPZkNvbXBvbmVudEluc3RhbmNlcywgU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKworCQlsb2cudHJhY2UoIkluIGZpbmQgZGVmYXVsdCB2YWx1ZTogcGF0aD0iICsgcGF0aE9mQ29tcG9uZW50SW5zdGFuY2VzICsgInByb3BlcnR5VW5pcUlkPSIgKyBwcm9wZXJ0eVVuaXF1ZUlkICsgImRlZmF1bHRWYWx1ZT0iICsgZGVmYXVsdFZhbHVlKTsKKworCQlpZiAocGF0aE9mQ29tcG9uZW50SW5zdGFuY2VzID09IG51bGwgfHwgcGF0aE9mQ29tcG9uZW50SW5zdGFuY2VzLnNpemUoKSA8IDIpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChkZWZhdWx0VmFsdWUpOworCQl9CisKKwkJU3RyaW5nIHJlc3VsdCA9IGRlZmF1bHRWYWx1ZTsKKworCQlmb3IgKGludCBpID0gMTsgaSA8IHBhdGhPZkNvbXBvbmVudEluc3RhbmNlcy5zaXplKCk7IGkrKykgeworCQkJU3RyaW5nIGNvbXBJbnN0YW5jZUlkID0gcGF0aE9mQ29tcG9uZW50SW5zdGFuY2VzLmdldChpKTsKKworCQkJRWl0aGVyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eVZhbHVlc1Jlc3VsdCA9IHRoaXMuZ2V0QWxsUHJvcGVydGllc09mUmVzb3VyY2VJbnN0YW5jZU9ubHlQcm9wZXJ0eURlZklkKGNvbXBJbnN0YW5jZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZSk7CisKKwkJCWxvZy50cmFjZSgiQWZ0ZXIgZmV0Y2hpbmcgcHJvcGVydGllcyB2YWx1ZXMgb2YgY29tcG9uZW50IGluc3RhbmNlIHt9LiB7fSIsIGNvbXBJbnN0YW5jZUlkLCBwcm9wZXJ0eVZhbHVlc1Jlc3VsdCk7CisKKwkJCWlmIChwcm9wZXJ0eVZhbHVlc1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBwcm9wZXJ0eVZhbHVlc1Jlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0gZWxzZSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBmb3VuZENvbXBJbnN0YW5jZVByb3BlcnR5ID0gZmV0Y2hCeVByb3BlcnR5VWlkKHByb3BlcnR5VmFsdWVzUmVzdWx0LmxlZnQoKS52YWx1ZSgpLCBwcm9wZXJ0eVVuaXF1ZUlkKTsKKwkJCWxvZy50cmFjZSgiQWZ0ZXIgZmluZGluZyB0aGUgY29tcG9uZW50IGluc3RhbmNlIHByb3BlcnR5IG9uIHt9LiB7fSIsIGNvbXBJbnN0YW5jZUlkLCBmb3VuZENvbXBJbnN0YW5jZVByb3BlcnR5KTsKKworCQkJaWYgKGZvdW5kQ29tcEluc3RhbmNlUHJvcGVydHkgPT0gbnVsbCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSBnZXRPckJ1aWxkUnVsZXNJZk5vdEV4aXN0cyhwYXRoT2ZDb21wb25lbnRJbnN0YW5jZXMuc2l6ZSgpIC0gaSwgcGF0aE9mQ29tcG9uZW50SW5zdGFuY2VzLmdldChpKSwgZm91bmRDb21wSW5zdGFuY2VQcm9wZXJ0eS5nZXRSdWxlcygpLCBmb3VuZENvbXBJbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlKCkpOworCisJCQlsb2cudHJhY2UoIlJ1bGVzIG9mIHByb3BlcnR5IHt9IG9uIGNvbXBvbmVudCBpbnN0YW5jZSB7fSBhcmUge30iLCBwcm9wZXJ0eVVuaXF1ZUlkLCBjb21wSW5zdGFuY2VJZCwgcnVsZXMpOworCQkJUHJvcGVydHlSdWxlIG1hdGNoZWRSdWxlID0gZmluZE1hdGNoUnVsZShwYXRoT2ZDb21wb25lbnRJbnN0YW5jZXMsIGksIHJ1bGVzKTsKKwkJCWxvZy50cmFjZSgiTWF0Y2ggcnVsZSBpcyB7fSIsIG1hdGNoZWRSdWxlKTsKKworCQkJaWYgKG1hdGNoZWRSdWxlICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSBtYXRjaGVkUnVsZS5nZXRWYWx1ZSgpOworCQkJCWJyZWFrOworCQkJfQorCisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKworCX0KKworCXByaXZhdGUgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBmZXRjaEJ5UHJvcGVydHlVaWQoTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBsaXN0LCBTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCkgeworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAobGlzdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0UHJvcGVydHkgOiBsaXN0KSB7CisJCQlpZiAoaW5zdFByb3BlcnR5LmdldFVuaXF1ZUlkKCkuZXF1YWxzKHByb3BlcnR5VW5pcXVlSWQpKSB7CisJCQkJcmVzdWx0ID0gaW5zdFByb3BlcnR5OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIExpc3Q8UHJvcGVydHlSdWxlPiBnZXRPckJ1aWxkUnVsZXNJZk5vdEV4aXN0cyhpbnQgcnVsZVNpemUsIFN0cmluZyBjb21wSW5zdGFuY2VJZCwgTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzLCBTdHJpbmcgdmFsdWUpIHsKKworCQlpZiAocnVsZXMgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJ1bGVzOworCQl9CisKKwkJcnVsZXMgPSBidWlsZERlZmF1bHRSdWxlKGNvbXBJbnN0YW5jZUlkLCBydWxlU2l6ZSwgdmFsdWUpOworCisJCXJldHVybiBydWxlczsKKworCX0KKworCXByaXZhdGUgTGlzdDxQcm9wZXJ0eVJ1bGU+IGdldFJ1bGVzT2ZQcm9wZXJ0eVZhbHVlKGludCBzaXplLCBTdHJpbmcgaW5zdGFuY2VJZCwgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KSB7CisJCUxpc3Q8UHJvcGVydHlSdWxlPiBydWxlcyA9IGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuZ2V0UnVsZXMoKTsKKwkJaWYgKHJ1bGVzID09IG51bGwpIHsKKwkJCXJ1bGVzID0gYnVpbGREZWZhdWx0UnVsZShpbnN0YW5jZUlkLCBzaXplLCBjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlKCkpOworCQl9CisJCXJldHVybiBydWxlczsKKwl9CisKKwlwcml2YXRlIExpc3Q8UHJvcGVydHlSdWxlPiBidWlsZERlZmF1bHRSdWxlKFN0cmluZyBjb21wb25lbnRJbnN0YW5jZUlkLCBpbnQgc2l6ZSwgU3RyaW5nIHZhbHVlKSB7CisKKwkJTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUxpc3Q8U3RyaW5nPiBydWxlID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJ1bGUuYWRkKGNvbXBvbmVudEluc3RhbmNlSWQpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKKwkJCXJ1bGUuYWRkKFByb3BlcnR5UnVsZS5SVUxFX0FOWV9NQVRDSCk7CisJCX0KKwkJUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZSA9IG5ldyBQcm9wZXJ0eVJ1bGUocnVsZSwgdmFsdWUpOworCQlydWxlcy5hZGQocHJvcGVydHlSdWxlKTsKKworCQlyZXR1cm4gcnVsZXM7CisKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5UnVsZSBmaW5kTWF0Y2hSdWxlKExpc3Q8U3RyaW5nPiBwYXRoT2ZJbnN0YW5jZXMsIGludCBsZXZlbCwgTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzKSB7CisKKwkJUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZSA9IG51bGw7CisKKwkJU3RyaW5nIHN0cmluZ0Zvck1hdGNoID0gYnVpbGRTdHJpbmdGb3JNYXRjaChwYXRoT2ZJbnN0YW5jZXMsIGxldmVsKTsKKworCQlTdHJpbmcgZmlyc3RDb21wSW5zdGFuY2UgPSBwYXRoT2ZJbnN0YW5jZXMuZ2V0KGxldmVsKTsKKworCQlpZiAocnVsZXMgIT0gbnVsbCkgeworCisJCQlmb3IgKFByb3BlcnR5UnVsZSBydWxlIDogcnVsZXMpIHsKKworCQkJCWludCBydWxlU2l6ZSA9IHJ1bGUuZ2V0UnVsZSgpLnNpemUoKTsKKwkJCQkvLyBjaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBydWxlIGVxdWFscyB0byB0aGUgbGVuZ3RoIG9mIHRoZQorCQkJCS8vIGluc3RhbmNlcyBwYXRoLgorCQkJCWlmIChydWxlU2l6ZSAhPSBwYXRoT2ZJbnN0YW5jZXMuc2l6ZSgpIC0gbGV2ZWwpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHJ1bGUgc3RhcnRzIHdpdGggY29ycmVjdCBjb21wb25lbnQgaW5zdGFuY2UgaWQKKwkJCQlpZiAoZmFsc2UgPT0gY2hlY2tGaXJzdEl0ZW0oZmlyc3RDb21wSW5zdGFuY2UsIHJ1bGUuZ2V0Rmlyc3RUb2tlbigpKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlTdHJpbmcgc2Vjb25kVG9rZW4gPSBydWxlLmdldFRva2VuKDIpOworCQkJCWlmIChzZWNvbmRUb2tlbiAhPSBudWxsICYmIChzZWNvbmRUb2tlbi5lcXVhbHMoUHJvcGVydHlSdWxlLkZPUkNFX0FMTCkgfHwgc2Vjb25kVG9rZW4uZXF1YWxzKFByb3BlcnR5UnVsZS5BTEwpKSkgeworCQkJCQlwcm9wZXJ0eVJ1bGUgPSBydWxlOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlTdHJpbmcgcGF0dGVyblN0ciA9IGJ1aWxkU3RyaW5nRm9yTWF0Y2gocnVsZS5nZXRSdWxlKCksIDApOworCisJCQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm5TdHIpOworCisJCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKHN0cmluZ0Zvck1hdGNoKTsKKworCQkJCWlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworCQkJCQlsb2cudHJhY2UoInt9IG1hdGNoZXMgdGhlIHJ1bGUge30iLCBzdHJpbmdGb3JNYXRjaCwgcGF0dGVyblN0cik7CisJCQkJCXByb3BlcnR5UnVsZSA9IHJ1bGU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIHByb3BlcnR5UnVsZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tGaXJzdEl0ZW0oU3RyaW5nIGxlZnQsIFN0cmluZyByaWdodCkgeworCQlpZiAobGVmdCAhPSBudWxsICYmIGxlZnQuZXF1YWxzKHJpZ2h0KSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkU3RyaW5nRm9yTWF0Y2goTGlzdDxTdHJpbmc+IHBhdGhPZkluc3RhbmNlcywgaW50IGxldmVsKSB7CisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJZm9yIChpbnQgaSA9IGxldmVsOyBpIDwgcGF0aE9mSW5zdGFuY2VzLnNpemUoKTsgaSsrKSB7CisJCQlidWlsZGVyLmFwcGVuZChwYXRoT2ZJbnN0YW5jZXMuZ2V0KGkpKTsKKwkJCWlmIChpIDwgcGF0aE9mSW5zdGFuY2VzLnNpemUoKSAtIDEpIHsKKwkJCQlidWlsZGVyLmFwcGVuZCgiIyIpOworCQkJfQorCQl9CisJCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlUHJvcGVydHlCeUJlc3RNYXRjaChTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCwgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5LCBNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBpbnN0YW5jZUlkVG9WYWx1ZSkgeworCisJCUxpc3Q8U3RyaW5nPiBwYXRoT2ZJbnN0YW5jZXMgPSBpbnN0YW5jZVByb3BlcnR5LmdldFBhdGgoKTsKKwkJaW50IGxldmVsID0gMDsKKwkJaW50IHNpemUgPSBwYXRoT2ZJbnN0YW5jZXMuc2l6ZSgpOworCQlpbnQgbnVtYmVyT2ZNYXRjaGVzID0gMDsKKwkJZm9yIChTdHJpbmcgaW5zdGFuY2VJZCA6IHBhdGhPZkluc3RhbmNlcykgeworCQkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBjb21wb25lbnRJbnN0YW5jZVByb3BlcnR5ID0gaW5zdGFuY2VJZFRvVmFsdWUuZ2V0KGluc3RhbmNlSWQpOworCisJCQlpZiAoY29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSAhPSBudWxsKSB7CisKKwkJCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSBnZXRSdWxlc09mUHJvcGVydHlWYWx1ZShzaXplIC0gbGV2ZWwsIGluc3RhbmNlSWQsIGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkpOworCQkJCS8vIElmIGl0IGlzIHRoZSBmaXJzdCBsZXZlbCBpbnN0YW5jZSwgdGhlbiB1cGRhdGUgdmFsdWVVbml1cWVJZAorCQkJCS8vIHBhcmFtZXRlciBpbiBvcmRlciB0byBrbm93IG9uIHVwZGF0ZSB0aGF0CisJCQkJLy8gd2Ugc2hvdWxkIHVwZGF0ZSBhbmQgbm90IGNyZWF0ZSBuZXcgbm9kZSBvbiBncmFwaC4KKwkJCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJCQlpbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlVW5pcXVlVWlkKGNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKSk7CisJCQkJCWluc3RhbmNlUHJvcGVydHkuc2V0UnVsZXMocnVsZXMpOworCQkJCX0KKworCQkJCVByb3BlcnR5UnVsZSBydWxlID0gZmluZE1hdGNoUnVsZShwYXRoT2ZJbnN0YW5jZXMsIGxldmVsLCBydWxlcyk7CisJCQkJaWYgKHJ1bGUgIT0gbnVsbCkgeworCQkJCQludW1iZXJPZk1hdGNoZXMrKzsKKwkJCQkJU3RyaW5nIHZhbHVlID0gcnVsZS5nZXRWYWx1ZSgpOworCQkJCQlpZiAobnVtYmVyT2ZNYXRjaGVzID09IDEpIHsKKwkJCQkJCWluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOworCQkJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJCQkJbG9nLmRlYnVnKCJTZXQgdGhlIHZhbHVlIG9mIHByb3BlcnR5ICIgKyBwcm9wZXJ0eVVuaXF1ZUlkICsgIiAiICsgaW5zdGFuY2VQcm9wZXJ0eS5nZXROYW1lKCkgKyAiIG9uIHBhdGggIiArIHBhdGhPZkluc3RhbmNlcyArICIgdG8gYmUgIiArIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChudW1iZXJPZk1hdGNoZXMgPT0gMikgeworCQkJCQkJLy8gSW4gY2FzZSBvZiBhbm90aGVyIHByb3BlcnR5IHZhbHVlIG1hdGNoLCB0aGVuIHVzZSB0aGUKKwkJCQkJCS8vIHZhbHVlIHRvIGJlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKwkJCQkJCWluc3RhbmNlUHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKHZhbHVlKTsKKwkJCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQkJCWxvZy5kZWJ1ZygiU2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHByb3BlcnR5ICIgKyBwcm9wZXJ0eVVuaXF1ZUlkICsgIiAiICsgaW5zdGFuY2VQcm9wZXJ0eS5nZXROYW1lKCkgKyAiIG9uIHBhdGggIiArIHBhdGhPZkluc3RhbmNlcyArICIgdG8gYmUgIiArIHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJbGV2ZWwrKzsKKwkJfQorCisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlUHJvcGVydGllc0J5UHJvcGVydHlWYWx1ZXMoTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gcmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzLCBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gdmFsdWVzKSB7CisKKwkJaWYgKHJlc291cmNlSW5zdGFuY2VzUHJvcGVydGllcyA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGFsbFByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJQ29sbGVjdGlvbjxMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiBwcm9wZXJ0aWVzID0gcmVzb3VyY2VJbnN0YW5jZXNQcm9wZXJ0aWVzLnZhbHVlcygpOworCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+PiBpdGVyYXRvciA9IHByb3BlcnRpZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGNvbXBJbnN0YW5jZVByb3BlcnR5TGlzdCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlhbGxQcm9wZXJ0aWVzLmFkZEFsbChjb21wSW5zdGFuY2VQcm9wZXJ0eUxpc3QpOworCQkJfQorCQl9CisKKwkJLy8gR28gb3ZlciBlYWNoIHByb3BlcnR5IGFuZCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcnVsZSB3aGljaCB1cGRhdGVzCisJCS8vIGl0CisJCWZvciAoQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5IDogYWxsUHJvcGVydGllcykgeworCisJCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9IGluc3RhbmNlUHJvcGVydHkuZ2V0VW5pcXVlSWQoKTsKKworCQkJLy8gZ2V0IHRoZSBjaGFuZ2VzIHBlciBjb21wb25lbnRJbnN0YW5jZUlkLgorCQkJTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gaW5zdGFuY2VJZFRvVmFsdWUgPSB2YWx1ZXMuZ2V0KHByb3BlcnR5VW5pcXVlSWQpOworCisJCQlpZiAoaW5zdGFuY2VJZFRvVmFsdWUgPT0gbnVsbCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl0aGlzLnVwZGF0ZVByb3BlcnR5QnlCZXN0TWF0Y2gocHJvcGVydHlVbmlxdWVJZCwgaW5zdGFuY2VQcm9wZXJ0eSwgaW5zdGFuY2VJZFRvVmFsdWUpOworCisJCX0KKworCX0KKworCS8qKgorCSAqIAorCSAqIEFkZCBkYXRhIHR5cGUgdG8gZ3JhcGguCisJICogCisJICogMS4gQWRkIGRhdGEgdHlwZSBub2RlCisJICogCisJICogMi4gQWRkIGVkZ2UgYmV0d2VlbiB0aGUgZm9ybWVyIG5vZGUgdG8gaXRzIHBhcmVudChpZiBleGlzdHMpCisJICogCisJICogMy4gQWRkIHByb3BlcnR5IG5vZGUgYW5kIGFzc29jaWF0ZSBpdCB0byB0aGUgbm9kZSBjcmVhdGVkIGF0ICMxLiAocGVyIHByb3BlcnR5ICYgaWYgZXhpc3RzKQorCSAqIAorCSAqIEBwYXJhbSBkYXRhVHlwZURlZmluaXRpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8RGF0YVR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkRGF0YVR5cGVUb0dyYXBoKERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24pIHsKKworCQlsb2cuZGVidWcoIkdvdCBkYXRhIHR5cGUgIiArIGRhdGFUeXBlRGVmaW5pdGlvbik7CisKKwkJU3RyaW5nIGR0VW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGREYXRhVHlwZVVpZChkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKworCQlEYXRhVHlwZURhdGEgZGF0YVR5cGVEYXRhID0gYnVpbGREYXRhVHlwZURhdGEoZGF0YVR5cGVEZWZpbml0aW9uLCBkdFVuaXF1ZUlkKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBhZGRpbmcgZGF0YSB0eXBlIHRvIGdyYXBoLiBkYXRhVHlwZURhdGEgPSAiICsgZGF0YVR5cGVEYXRhKTsKKwkJRWl0aGVyPERhdGFUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZURhdGFUeXBlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoZGF0YVR5cGVEYXRhLCBEYXRhVHlwZURhdGEuY2xhc3MpOworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyBkYXRhIHR5cGUgdG8gZ3JhcGguIHN0YXR1cyBpcyA9IHt9IiwgY3JlYXRlRGF0YVR5cGVSZXN1bHQpOworCisJCWlmIChjcmVhdGVEYXRhVHlwZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZURhdGFUeXBlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRhdGEgdHlwZSAiICsgZGF0YVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSArICIgdG8gZ3JhcGguIHN0YXR1cyBpcyAiICsgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZEFkZGluZ05vZGVUeXBlRXJyb3IoIkFkZERhdGFUeXBlIiwgTm9kZVR5cGVFbnVtLkRhdGFUeXBlLmdldE5hbWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlEYXRhVHlwZURhdGEgcmVzdWx0Q1REID0gY3JlYXRlRGF0YVR5cGVSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gZGF0YVR5cGVEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKTsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0aWVzVG9EYXRhVHlwZSA9IGFkZFByb3BlcnRpZXNUb0RhdGFUeXBlKHJlc3VsdENURC5nZXRVbmlxdWVJZCgpLCBwcm9wZXJ0aWVzKTsKKwkJaWYgKGFkZFByb3BlcnRpZXNUb0RhdGFUeXBlLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgYWRkIHByb3BlcnRpZXMgIiArIHByb3BlcnRpZXMgKyAiIHRvIGRhdGEgdHlwZSAiICsgZGF0YVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFkZFByb3BlcnRpZXNUb0RhdGFUeXBlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlTdHJpbmcgZGVyaXZlZEZyb20gPSBkYXRhVHlwZURlZmluaXRpb24uZ2V0RGVyaXZlZEZyb21OYW1lKCk7CisJCWlmIChkZXJpdmVkRnJvbSAhPSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyByZWxhdGlvbiBiZXR3ZWVuIGRhdGEgdHlwZSAiICsgZHRVbmlxdWVJZCArICIgdG8gaXRzIHBhcmVudCAiICsgZGVyaXZlZEZyb20pOworCQkJVW5pcXVlSWREYXRhIGZyb20gPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5EYXRhVHlwZSwgZHRVbmlxdWVJZCk7CisKKwkJCVN0cmluZyBkZXJpdmVGcm9tVWlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkRGF0YVR5cGVVaWQoZGVyaXZlZEZyb20pOworCQkJVW5pcXVlSWREYXRhIHRvID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uRGF0YVR5cGUsIGRlcml2ZUZyb21VaWQpOworCQkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihmcm9tLCB0bywgR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgbnVsbCk7CisJCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0ZSByZWxhdGlvbiBiZXR3ZWVuIGNhcGFiaWxpdHkgdHlwZSAiICsgZHRVbmlxdWVJZCArICIgdG8gaXRzIHBhcmVudCAiICsgZGVyaXZlZEZyb20gKyAiLiBzdGF0dXMgaXMgIiArIGNyZWF0ZVJlbGF0aW9uKTsKKwkJCWlmIChjcmVhdGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNyZWF0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY3JlYXRlRGF0YVR5cGVSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCisJfQorCisJcHJpdmF0ZSBEYXRhVHlwZURhdGEgYnVpbGREYXRhVHlwZURhdGEoRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiwgU3RyaW5nIGN0VW5pcXVlSWQpIHsKKworCQlEYXRhVHlwZURhdGEgZGF0YVR5cGVEYXRhID0gbmV3IERhdGFUeXBlRGF0YShkYXRhVHlwZURlZmluaXRpb24pOworCisJCWRhdGFUeXBlRGF0YS5nZXREYXRhVHlwZURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoY3RVbmlxdWVJZCk7CisJCUxvbmcgY3JlYXRpb25EYXRlID0gZGF0YVR5cGVEYXRhLmdldERhdGFUeXBlRGF0YURlZmluaXRpb24oKS5nZXRDcmVhdGlvblRpbWUoKTsKKwkJaWYgKGNyZWF0aW9uRGF0ZSA9PSBudWxsKSB7CisJCQljcmVhdGlvbkRhdGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJfQorCQlkYXRhVHlwZURhdGEuZ2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpLnNldENyZWF0aW9uVGltZShjcmVhdGlvbkRhdGUpOworCQlkYXRhVHlwZURhdGEuZ2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpLnNldE1vZGlmaWNhdGlvblRpbWUoY3JlYXRpb25EYXRlKTsKKworCQlyZXR1cm4gZGF0YVR5cGVEYXRhOworCX0KKworCS8qKgorCSAqIGFkZCBwcm9wZXJ0aWVzIHRvIGNhcGFiaWxpdHkgdHlwZS4KKwkgKiAKKwkgKiBQZXIgcHJvcGVydHksIGFkZCBhIHByb3BlcnR5IG5vZGUgYW5kIGFzc29jaWF0ZSBpdCB0byB0aGUgY2FwYWJpbGl0eSB0eXBlCisJICogCisJICogQHBhcmFtIHVuaXF1ZUlkCisJICogQHBhcmFtIHByb3BlcnRpZXMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFByb3BlcnRpZXNUb0RhdGFUeXBlKFN0cmluZyB1bmlxdWVJZCwgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE+IHByb3BlcnRpZXNEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE+KCk7CisKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBmYWxzZSA9PSBwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgeworCQkJZm9yIChQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uIDogcHJvcGVydGllcykgeworCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0TmFtZSgpOworCisJCQkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCk7CisJCQkJRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB2YWxpZFByb3BlcnR5VHlwZSA9IGlzVmFsaWRQcm9wZXJ0eVR5cGUocHJvcGVydHlUeXBlKTsKKwkJCQlpZiAodmFsaWRQcm9wZXJ0eVR5cGUuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRGF0YSB0eXBlICIgKyB1bmlxdWVJZCArICIgY29udGFpbnMgaW52YWxpZCBwcm9wZXJ0eSB0eXBlICIgKyBwcm9wZXJ0eVR5cGUpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHZhbGlkUHJvcGVydHlUeXBlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJCUJvb2xlYW4gaXNWYWxpZCA9IHZhbGlkUHJvcGVydHlUeXBlLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChpc1ZhbGlkID09IG51bGwgfHwgaXNWYWxpZC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgeworCQkJCQlsb2cuZGVidWcoIkRhdGEgdHlwZSAiICsgdW5pcXVlSWQgKyAiIGNvbnRhaW5zIGludmFsaWQgcHJvcGVydHkgdHlwZSAiICsgcHJvcGVydHlUeXBlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX1RZUEUpOworCQkJCX0KKworCQkJCUVpdGhlcjxQcm9wZXJ0eURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0eVRvTm9kZVR5cGUgPSB0aGlzLmFkZFByb3BlcnR5VG9Ob2RlVHlwZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5RGVmaW5pdGlvbiwgTm9kZVR5cGVFbnVtLkRhdGFUeXBlLCB1bmlxdWVJZCk7CisJCQkJaWYgKGFkZFByb3BlcnR5VG9Ob2RlVHlwZS5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gYWRkUHJvcGVydHlUb05vZGVUeXBlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYXNzb2NpYXRlIGRhdGEgdHlwZSAiICsgdW5pcXVlSWQgKyAiIHRvIHByb3BlcnR5ICIgKyBwcm9wZXJ0eU5hbWUgKyAiIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiQWRkUHJvcGVydHlUb0RhdGFUeXBlIiwgIkZhaWxlZCB0byBhc3NvY2lhdGUgcHJvcGVydHkgdG8gZGF0YSB0eXBlLiBTdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cywgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJCQl9CisJCQkJcHJvcGVydGllc0RhdGEucHV0KHByb3BlcnR5TmFtZSwgYWRkUHJvcGVydHlUb05vZGVUeXBlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJRGF0YVR5cGVEYXRhIGRhdGFUeXBlRGF0YSA9IG5ldyBEYXRhVHlwZURhdGEoKTsKKwkJCWRhdGFUeXBlRGF0YS5nZXREYXRhVHlwZURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCQkJbG9uZyBtb2RpZmljYXRpb25UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlkYXRhVHlwZURhdGEuZ2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpLnNldE1vZGlmaWNhdGlvblRpbWUobW9kaWZpY2F0aW9uVGltZSk7CisKKwkJCUVpdGhlcjxEYXRhVHlwZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUoZGF0YVR5cGVEYXRhLCBEYXRhVHlwZURhdGEuY2xhc3MpOworCQkJaWYgKHVwZGF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdXBkYXRlIG1vZGlmaWNhdGlvbiB0aW1lIGRhdGEgdHlwZSAiICsgdW5pcXVlSWQgKyAiIGZyb20gZ3JhcGguIHN0YXR1cyBpcyAiICsgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nSW50ZXJuYWxGbG93RXJyb3IoIkFkZFByb3BlcnR5VG9EYXRhVHlwZSIsICJGYWlsZWQgdG8gZmV0Y2ggZGF0YSB0eXBlLiBTdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cywgRXJyb3JTZXZlcml0eS5FUlJPUik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIlVwZGF0ZSBkYXRhIHR5cGUgdWlkIHt9LiBTZXQgbW9kaWZpY2F0aW9uIHRpbWUgdG8ge30iLCB1bmlxdWVJZCwgbW9kaWZpY2F0aW9uVGltZSk7CisJCQl9CisKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChwcm9wZXJ0aWVzRGF0YSk7CisKKwl9CisKKwkvKioKKwkgKiBCdWlsZCBEYXRhIHR5cGUgb2JqZWN0IGZyb20gZ3JhcGggYnkgdW5pcXVlIGlkCisJICogCisJICogQHBhcmFtIHVuaXF1ZUlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0RGF0YVR5cGVCeVVpZChTdHJpbmcgdW5pcXVlSWQpIHsKKworCQlFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQlFaXRoZXI8RGF0YVR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGF0YVR5cGVzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkRhdGFUeXBlKSwgdW5pcXVlSWQsIERhdGFUeXBlRGF0YS5jbGFzcyk7CisKKwkJaWYgKGRhdGFUeXBlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRhdGFUeXBlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkRhdGEgdHlwZSAiICsgdW5pcXVlSWQgKyAiIGNhbm5vdCBiZSBmb3VuZCBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJRGF0YVR5cGVEYXRhIGN0RGF0YSA9IGRhdGFUeXBlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IG5ldyBEYXRhVHlwZURlZmluaXRpb24oY3REYXRhLmdldERhdGFUeXBlRGF0YURlZmluaXRpb24oKSk7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcHJvcGVydGllc1N0YXR1cyA9IGZpbGxQcm9wZXJ0aWVzKHVuaXF1ZUlkLCBkYXRhVHlwZURlZmluaXRpb24pOworCQlpZiAocHJvcGVydGllc1N0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggcHJvcGVydGllcyBvZiBkYXRhIHR5cGUgIiArIHVuaXF1ZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocHJvcGVydGllc1N0YXR1cyk7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxEYXRhVHlwZURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5EYXRhVHlwZSksIHVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBOb2RlVHlwZUVudW0uRGF0YVR5cGUsCisJCQkJRGF0YVR5cGVEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciByZXRyaWV2aW5nIERFUklWRURfRlJPTSBub2RlIG9mICIgKyB1bmlxdWVJZCArICIuIHN0YXR1cyBpcyAiICsgcGFyZW50Tm9kZSk7CisJCWlmIChwYXJlbnROb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBwYXJlbnROb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmICh0aXRhbk9wZXJhdGlvblN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHRoZSBwYXJlbnQgZGF0YSB0eXBlIG9mIGRhdGEgdHlwZSAiICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIiArIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBkZXJpdmVkIGZyb20gbm9kZSB3YXMgZm91bmQKKwkJCUltbXV0YWJsZVBhaXI8RGF0YVR5cGVEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQkJRGF0YVR5cGVEYXRhIHBhcmVudENUID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKworCQkJU3RyaW5nIHBhcmVudFVuaXF1ZUlkID0gcGFyZW50Q1QuZ2V0VW5pcXVlSWQoKTsKKwkJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkYXRhVHlwZUJ5VWlkID0gZ2V0RGF0YVR5cGVCeVVpZChwYXJlbnRVbmlxdWVJZCk7CisKKwkJCWlmIChkYXRhVHlwZUJ5VWlkLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZGF0YVR5cGVCeVVpZC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlEYXRhVHlwZURlZmluaXRpb24gcGFyZW50RGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YVR5cGVCeVVpZC5sZWZ0KCkudmFsdWUoKTsKKworCQkJZGF0YVR5cGVEZWZpbml0aW9uLnNldERlcml2ZWRGcm9tKHBhcmVudERhdGFUeXBlRGVmaW5pdGlvbik7CisKKwkJfQorCQlyZXN1bHQgPSBFaXRoZXIubGVmdChkYXRhVHlwZURlZmluaXRpb24pOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaWxsUHJvcGVydGllcyhTdHJpbmcgdW5pcXVlSWQsIERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24pIHsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRQcm9wZXJ0aWVzT2ZOb2RlID0gdGhpcy5maW5kUHJvcGVydGllc09mTm9kZShOb2RlVHlwZUVudW0uRGF0YVR5cGUsIHVuaXF1ZUlkKTsKKwkJaWYgKGZpbmRQcm9wZXJ0aWVzT2ZOb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBmaW5kUHJvcGVydGllc09mTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkFmdGVyIGxvb2tpbmcgZm9yIHByb3BlcnRpZXMgb2YgdmVydGV4ICIgKyB1bmlxdWVJZCArICIuIHN0YXR1cyBpcyAiICsgdGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJaWYgKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORC5lcXVhbHModGl0YW5PcGVyYXRpb25TdGF0dXMpKSB7CisJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdGl0YW5PcGVyYXRpb25TdGF0dXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBmaW5kUHJvcGVydGllc09mTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5pc0VtcHR5KCkgPT0gZmFsc2UpIHsKKwkJCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gbGlzdE9mUHJvcHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkJCWZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGVudHJ5IDogcHJvcGVydGllcy5lbnRyeVNldCgpKSB7CisJCQkJCVN0cmluZyBwcm9wTmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJUHJvcGVydHlEZWZpbml0aW9uIG5ld1Byb3BlcnR5RGVmaW5pdGlvbiA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJCQkJbmV3UHJvcGVydHlEZWZpbml0aW9uLnNldE5hbWUocHJvcE5hbWUpOworCQkJCQlsaXN0T2ZQcm9wcy5hZGQobmV3UHJvcGVydHlEZWZpbml0aW9uKTsKKwkJCQl9CisJCQkJZGF0YVR5cGVEZWZpbml0aW9uLnNldFByb3BlcnRpZXMobGlzdE9mUHJvcHMpOworCQkJfQorCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZERhdGFUeXBlKERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJRWl0aGVyPERhdGFUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclN0YXR1cyA9IGFkZERhdGFUeXBlVG9HcmFwaChkYXRhVHlwZURlZmluaXRpb24pOworCisJCQlpZiAoZWl0aGVyU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFkZCBkYXRhIHR5cGUge30gdG8gR3JhcGguIHN0YXR1cyBpcyB7fSIsIGRhdGFUeXBlRGVmaW5pdGlvbiwgZWl0aGVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUZhaWxlZEFkZGluZ05vZGVUeXBlRXJyb3IoIkFkZERhdGFUeXBlIiwgIkRhdGFUeXBlIik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZWl0aGVyU3RhdHVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9IGVsc2UgeworCQkJCURhdGFUeXBlRGF0YSBjYXBhYmlsaXR5VHlwZURhdGEgPSBlaXRoZXJTdGF0dXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZSZXN1bHQgPSBjb252ZXJ0RFREYXRhVG9EVERlZmluaXRpb24oY2FwYWJpbGl0eVR5cGVEYXRhKTsKKwkJCQlsb2cuZGVidWcoIlRoZSByZXR1cm5lZCBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gaXMgIiArIGRhdGFUeXBlRGVmUmVzdWx0KTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChkYXRhVHlwZURlZlJlc3VsdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkRGF0YVR5cGUoRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbikgeworCQlyZXR1cm4gYWRkRGF0YVR5cGUoZGF0YVR5cGVEZWZpbml0aW9uLCB0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0RGF0YVR5cGVCeU5hbWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisKKwkJCVN0cmluZyBkdFVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZERhdGFUeXBlVWlkKG5hbWUpOworCQkJRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGN0UmVzdWx0ID0gdGhpcy5nZXREYXRhVHlwZUJ5VWlkKGR0VWlkKTsKKworCQkJaWYgKGN0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGN0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiBjYXBhYmlsaXR5IHR5cGUgIiArIG5hbWUgKyAic3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCX0KKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhjdFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjdFJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldERhdGFUeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBnZXREYXRhVHlwZUJ5TmFtZShuYW1lLCB0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0RGF0YVR5cGVCeU5hbWVXaXRob3V0RGVyaXZlZChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0RGF0YVR5cGVCeU5hbWVXaXRob3V0RGVyaXZlZChuYW1lLCB0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0RGF0YVR5cGVCeU5hbWVXaXRob3V0RGVyaXZlZChTdHJpbmcgbmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJU3RyaW5nIHVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZERhdGFUeXBlVWlkKG5hbWUpOworCQkJRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGN0UmVzdWx0ID0gdGhpcy5nZXREYXRhVHlwZUJ5VWlkV2l0aG91dERlcml2ZWREYXRhVHlwZXModWlkKTsKKworCQkJaWYgKGN0UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGN0UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiBjYXBhYmlsaXR5IHR5cGUgIiArIG5hbWUgKyAic3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCX0KKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhjdFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChjdFJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhVHlwZUJ5VWlkV2l0aG91dERlcml2ZWREYXRhVHlwZXMoU3RyaW5nIHVuaXF1ZUlkKSB7CisKKwkJRWl0aGVyPERhdGFUeXBlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRhdGFUeXBlc1JlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5EYXRhVHlwZSksIHVuaXF1ZUlkLCBEYXRhVHlwZURhdGEuY2xhc3MpOworCisJCWlmIChkYXRhVHlwZXNSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkYXRhVHlwZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJEYXRhIHR5cGUgIiArIHVuaXF1ZUlkICsgIiBjYW5ub3QgYmUgZm91bmQgaW4gZ3JhcGguIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCURhdGFUeXBlRGF0YSBjdERhdGEgPSBkYXRhVHlwZXNSZXMubGVmdCgpLnZhbHVlKCk7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBuZXcgRGF0YVR5cGVEZWZpbml0aW9uKGN0RGF0YS5nZXREYXRhVHlwZURhdGFEZWZpbml0aW9uKCkpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHByb3BlcnRpZXNTdGF0dXMgPSBmaWxsUHJvcGVydGllcyh1bmlxdWVJZCwgZGF0YVR5cGVEZWZpbml0aW9uKTsKKwkJaWYgKHByb3BlcnRpZXNTdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHByb3BlcnRpZXMgb2YgZGF0YSB0eXBlICIgKyB1bmlxdWVJZCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHByb3BlcnRpZXNTdGF0dXMpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRhdGFUeXBlRGVmaW5pdGlvbik7CisJfQorCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhVHlwZUJ5TmFtZVdpdGhvdXREZXJpdmVkRGF0YVR5cGVzKFN0cmluZyBuYW1lKSB7CisKKwkJU3RyaW5nIHVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZERhdGFUeXBlVWlkKG5hbWUpOworCQlyZXR1cm4gZ2V0RGF0YVR5cGVCeVVpZFdpdGhvdXREZXJpdmVkRGF0YVR5cGVzKHVpZCk7CisKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBjb252ZXJ0IGJldHdlZW4gZ3JhcGggTm9kZSBvYmplY3QgdG8gSmF2YSBvYmplY3QKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YVR5cGVEYXRhCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBEYXRhVHlwZURlZmluaXRpb24gY29udmVydERURGF0YVRvRFREZWZpbml0aW9uKERhdGFUeXBlRGF0YSBkYXRhVHlwZURhdGEpIHsKKwkJbG9nLmRlYnVnKCJUaGUgb2JqZWN0IHJldHVybmVkIGFmdGVyIGNyZWF0ZSBkYXRhIHR5cGUgaXMgIiArIGRhdGFUeXBlRGF0YSk7CisKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmUmVzdWx0ID0gbmV3IERhdGFUeXBlRGVmaW5pdGlvbihkYXRhVHlwZURhdGEuZ2V0RGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpKTsKKworCQlyZXR1cm4gZGF0YVR5cGVEZWZSZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGlzVmFsaWRQcm9wZXJ0eVR5cGUoU3RyaW5nIHByb3BlcnR5VHlwZSkgeworCisJCWlmIChwcm9wZXJ0eVR5cGUgPT0gbnVsbCB8fCBwcm9wZXJ0eVR5cGUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoZmFsc2UpOworCQl9CisKKwkJVG9zY2FQcm9wZXJ0eVR5cGUgdG9zY2FQcm9wZXJ0eVR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZShwcm9wZXJ0eVR5cGUpOworCQlpZiAodG9zY2FQcm9wZXJ0eVR5cGUgPT0gbnVsbCkgeworCQkJRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWZpbmVkSW5EYXRhVHlwZXMgPSBpc0RlZmluZWRJbkRhdGFUeXBlcyhwcm9wZXJ0eVR5cGUpOworCQkJcmV0dXJuIGRlZmluZWRJbkRhdGFUeXBlczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKwkJfQorCX0KKworCXByaXZhdGUgRWl0aGVyPEJvb2xlYW4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpc0RlZmluZWRJbkRhdGFUeXBlcyhTdHJpbmcgcHJvcGVydHlUeXBlKSB7CisKKwkJU3RyaW5nIGRhdGFUeXBlVWlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkRGF0YVR5cGVVaWQocHJvcGVydHlUeXBlKTsKKwkJRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRhdGFUeXBlQnlVaWQgPSBnZXREYXRhVHlwZUJ5VWlkKGRhdGFUeXBlVWlkKTsKKwkJaWYgKGRhdGFUeXBlQnlVaWQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkYXRhVHlwZUJ5VWlkLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZhbHNlKTsKKwkJCX0KKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdCh0cnVlKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEV4dGVybmFsRGF0YVR5cGUoU3RyaW5nIHByb3BlcnR5VHlwZSkgeworCisJCVN0cmluZyBkYXRhVHlwZVVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZERhdGFUeXBlVWlkKHByb3BlcnR5VHlwZSk7CisJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkYXRhVHlwZUJ5VWlkID0gZ2V0RGF0YVR5cGVCeVVpZChkYXRhVHlwZVVpZCk7CisJCWlmIChkYXRhVHlwZUJ5VWlkLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGF0YVR5cGVCeVVpZC5yaWdodCgpLnZhbHVlKCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQoZGF0YVR5cGVCeVVpZC5sZWZ0KCkudmFsdWUoKSk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxEYXRhVHlwZXMoKSB7CisKKwkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLmxlZnQoZGF0YVR5cGVzKTsKKworCQlFaXRoZXI8TGlzdDxEYXRhVHlwZURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsRGF0YVR5cGVzID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLkRhdGFUeXBlLCBudWxsLCBEYXRhVHlwZURhdGEuY2xhc3MpOworCQlpZiAoZ2V0QWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0QWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisKKwkJTGlzdDxEYXRhVHlwZURhdGE+IGxpc3QgPSBnZXRBbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCk7CisJCWlmIChsaXN0ICE9IG51bGwpIHsKKworCQkJbG9nLnRyYWNlKCJOdW1iZXIgb2YgZGF0YSB0eXBlcyB0byBsb2FkIGlzICIgKyBsaXN0LnNpemUoKSk7CisKKwkJCUxpc3Q8U3RyaW5nPiBjb2xsZWN0ID0gbGlzdC5zdHJlYW0oKS5tYXAocCAtPiBwLmdldERhdGFUeXBlRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQlsb2cudHJhY2UoIlRoZSBkYXRhIHR5cGVzIHRvIGxvYWQgYXJlICIgKyBjb2xsZWN0KTsKKworCQkJZm9yIChEYXRhVHlwZURhdGEgZGF0YVR5cGVEYXRhIDogbGlzdCkgeworCisJCQkJbG9nLnRyYWNlKCJHb2luZyB0byBmZXRjaCBkYXRhIHR5cGUgIiArIGRhdGFUeXBlRGF0YS5nZXREYXRhVHlwZURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpICsgIi4gdWlkIGlzICIgKyBkYXRhVHlwZURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkJRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRhdGFUeXBlQnlVaWQgPSB0aGlzLmdldEFuZEFkZERhdGFUeXBlQnlVaWQoZGF0YVR5cGVEYXRhLmdldFVuaXF1ZUlkKCksIGRhdGFUeXBlcyk7CisJCQkJaWYgKGRhdGFUeXBlQnlVaWQuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRhdGFUeXBlQnlVaWQucmlnaHQoKS52YWx1ZSgpOworCQkJCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRDsKKwkJCQkJfQorCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy50cmFjZSgiQWZ0ZXIgZmV0Y2hpbmcgYWxsIGRhdGEgdHlwZXMgIiArIHJlc3VsdCk7CisJCQl9IGVsc2UgeworCQkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gbWFwID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChtYXAgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgdHlwZXMgPSBtYXAua2V5U2V0KCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiLCAiWyIsICJdIikpOworCQkJCQlsb2cudHJhY2UoIkFmdGVyIGZldGNoaW5nIGFsbCBkYXRhIHR5cGVzICIgKyB0eXBlcyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBCdWlsZCBEYXRhIHR5cGUgb2JqZWN0IGZyb20gZ3JhcGggYnkgdW5pcXVlIGlkCisJICogCisJICogQHBhcmFtIHVuaXF1ZUlkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QW5kQWRkRGF0YVR5cGVCeVVpZChTdHJpbmcgdW5pcXVlSWQsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzKSB7CisKKwkJRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJaWYgKGFsbERhdGFUeXBlcy5jb250YWluc0tleSh1bmlxdWVJZCkpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChhbGxEYXRhVHlwZXMuZ2V0KHVuaXF1ZUlkKSk7CisJCX0KKworCQlFaXRoZXI8RGF0YVR5cGVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGF0YVR5cGVzUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLkRhdGFUeXBlKSwgdW5pcXVlSWQsIERhdGFUeXBlRGF0YS5jbGFzcyk7CisKKwkJaWYgKGRhdGFUeXBlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRhdGFUeXBlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZGVidWcoIkRhdGEgdHlwZSAiICsgdW5pcXVlSWQgKyAiIGNhbm5vdCBiZSBmb3VuZCBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJRGF0YVR5cGVEYXRhIGN0RGF0YSA9IGRhdGFUeXBlc1Jlcy5sZWZ0KCkudmFsdWUoKTsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IG5ldyBEYXRhVHlwZURlZmluaXRpb24oY3REYXRhLmdldERhdGFUeXBlRGF0YURlZmluaXRpb24oKSk7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcHJvcGVydGllc1N0YXR1cyA9IGZpbGxQcm9wZXJ0aWVzKHVuaXF1ZUlkLCBkYXRhVHlwZURlZmluaXRpb24pOworCQlpZiAocHJvcGVydGllc1N0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggcHJvcGVydGllcyBvZiBkYXRhIHR5cGUgIiArIHVuaXF1ZUlkKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocHJvcGVydGllc1N0YXR1cyk7CisJCX0KKworCQlhbGxEYXRhVHlwZXMucHV0KGRhdGFUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCksIGRhdGFUeXBlRGVmaW5pdGlvbik7CisKKwkJU3RyaW5nIGRlcml2ZWRGcm9tID0gZGF0YVR5cGVEZWZpbml0aW9uLmdldERlcml2ZWRGcm9tTmFtZSgpOworCQlpZiAoYWxsRGF0YVR5cGVzLmNvbnRhaW5zS2V5KGRlcml2ZWRGcm9tKSkgeworCQkJRGF0YVR5cGVEZWZpbml0aW9uIHBhcmVudERhdGFUeXBlRGVmaW5pdGlvbiA9IGFsbERhdGFUeXBlcy5nZXQoZGVyaXZlZEZyb20pOworCisJCQlkYXRhVHlwZURlZmluaXRpb24uc2V0RGVyaXZlZEZyb20ocGFyZW50RGF0YVR5cGVEZWZpbml0aW9uKTsKKworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGRhdGFUeXBlRGVmaW5pdGlvbik7CisJCX0KKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxEYXRhVHlwZURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5EYXRhVHlwZSksIHVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBOb2RlVHlwZUVudW0uRGF0YVR5cGUsCisJCQkJRGF0YVR5cGVEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciByZXRyaWV2aW5nIERFUklWRURfRlJPTSBub2RlIG9mICIgKyB1bmlxdWVJZCArICIuIHN0YXR1cyBpcyAiICsgcGFyZW50Tm9kZSk7CisJCWlmIChwYXJlbnROb2RlLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgdGl0YW5PcGVyYXRpb25TdGF0dXMgPSBwYXJlbnROb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmICh0aXRhbk9wZXJhdGlvblN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHRoZSBwYXJlbnQgZGF0YSB0eXBlIG9mIGRhdGEgdHlwZSAiICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIiArIHRpdGFuT3BlcmF0aW9uU3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQodGl0YW5PcGVyYXRpb25TdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBkZXJpdmVkIGZyb20gbm9kZSB3YXMgZm91bmQKKwkJCUltbXV0YWJsZVBhaXI8RGF0YVR5cGVEYXRhLCBHcmFwaEVkZ2U+IGltbXV0YWJsZVBhaXIgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQkJRGF0YVR5cGVEYXRhIHBhcmVudENUID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKworCQkJU3RyaW5nIHBhcmVudFVuaXF1ZUlkID0gcGFyZW50Q1QuZ2V0VW5pcXVlSWQoKTsKKwkJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkYXRhVHlwZUJ5VWlkID0gZ2V0RGF0YVR5cGVCeVVpZChwYXJlbnRVbmlxdWVJZCk7CisKKwkJCWlmIChkYXRhVHlwZUJ5VWlkLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZGF0YVR5cGVCeVVpZC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlEYXRhVHlwZURlZmluaXRpb24gcGFyZW50RGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YVR5cGVCeVVpZC5sZWZ0KCkudmFsdWUoKTsKKworCQkJZGF0YVR5cGVEZWZpbml0aW9uLnNldERlcml2ZWRGcm9tKHBhcmVudERhdGFUeXBlRGVmaW5pdGlvbik7CisKKwkJfQorCQlyZXN1bHQgPSBFaXRoZXIubGVmdChkYXRhVHlwZURlZmluaXRpb24pOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXREYXRhVHlwZVVzaW5nTmFtZShTdHJpbmcgbmFtZSkgeworCisJCVN0cmluZyB1aWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGREYXRhVHlwZVVpZChuYW1lKTsKKworCQlFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGF0YVR5cGVCeVVpZCA9IGdldERhdGFUeXBlQnlVaWQodWlkKTsKKworCQlyZXR1cm4gZGF0YVR5cGVCeVVpZDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFN0cmluZywgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoZWNrSW5uZXJUeXBlKFByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcERhdGFEZWYpIHsKKworCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcERhdGFEZWYuZ2V0VHlwZSgpOworCisJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZShwcm9wZXJ0eVR5cGUpOworCisJCUVpdGhlcjxTdHJpbmcsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBnZXRJbm5lclR5cGUodHlwZSwgKCkgLT4gcHJvcERhdGFEZWYuZ2V0U2NoZW1hKCkpOworCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PERhdGFUeXBlRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxEYXRhVHlwZU5vZGVzKCkgeworCQlFaXRoZXI8TGlzdDxEYXRhVHlwZURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsRGF0YVR5cGVzID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLkRhdGFUeXBlLCBudWxsLCBEYXRhVHlwZURhdGEuY2xhc3MpOworCQlpZiAoZ2V0QWxsRGF0YVR5cGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZ2V0QWxsRGF0YVR5cGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJc3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJfQorCQl9CisJCXJldHVybiBnZXRBbGxEYXRhVHlwZXM7CisJfQorCisJcHVibGljIEVpdGhlcjxPYmplY3QsIEJvb2xlYW4+IHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlUeXBlLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaXNWYWxpZGF0ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJbG9nLnRyYWNlKCJHb2luZyB0byB2YWxpZGF0ZSBwcm9wZXJ0eSB2YWx1ZSBhbmQgaXRzIHR5cGUuIHR5cGUgPSB7fSwgdmFsdWUgPSB7fSIsIHByb3BlcnR5VHlwZSwgdmFsdWUpOworCQlUb3NjYVByb3BlcnR5VHlwZSB0eXBlID0gZ2V0VHlwZShwcm9wZXJ0eVR5cGUpOworCisJCWlmIChpc1ZhbGlkYXRlKSB7CisKKwkJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YVR5cGVzLmdldChwcm9wZXJ0eVR5cGUpOworCQkJCUltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+IHZhbGlkYXRlUmVzdWx0ID0gZGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIudmFsaWRhdGVBbmRVcGRhdGUodmFsdWUsIGRhdGFUeXBlRGVmaW5pdGlvbiwgZGF0YVR5cGVzKTsKKwkJCQlpZiAodmFsaWRhdGVSZXN1bHQucmlnaHQuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKKwkJCQkJbG9nLmRlYnVnKCJUaGUgdmFsdWUge30gb2YgcHJvcGVydHkgZnJvbSB0eXBlIHt9IGlzIGludmFsaWQiLCB2YWx1ZSwgcHJvcGVydHlUeXBlKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCQkJfQorCQkJCUpzb25FbGVtZW50IGpzb25FbGVtZW50ID0gdmFsaWRhdGVSZXN1bHQubGVmdDsKKwkJCQlTdHJpbmcgdmFsdWVGcm9tSnNvbkVsZW1lbnQgPSBnZXRWYWx1ZUZyb21Kc29uRWxlbWVudChqc29uRWxlbWVudCk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbHVlRnJvbUpzb25FbGVtZW50KTsKKwkJCX0KKwkJCWxvZy50cmFjZSgiYmVmb3JlIHZhbGlkYXRpbmcgcHJvcGVydHkgdHlwZSB7fSIsIHByb3BlcnR5VHlwZSk7CisJCQlib29sZWFuIGlzVmFsaWRQcm9wZXJ0eSA9IGlzVmFsaWRWYWx1ZSh0eXBlLCB2YWx1ZSwgaW5uZXJUeXBlLCBkYXRhVHlwZXMpOworCQkJaWYgKGZhbHNlID09IGlzVmFsaWRQcm9wZXJ0eSkgeworCQkJCWxvZy5kZWJ1ZygiVGhlIHZhbHVlIHt9IG9mIHByb3BlcnR5IGZyb20gdHlwZSB7fSBpcyBpbnZhbGlkIiwgdmFsdWUsIHR5cGUpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoZmFsc2UpOworCQkJfQorCQl9CisJCU9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IHZhbHVlOworCQlpZiAoZmFsc2UgPT0gaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiBpc1ZhbGlkYXRlKSB7CisJCQlQcm9wZXJ0eVZhbHVlQ29udmVydGVyIGNvbnZlcnRlciA9IHR5cGUuZ2V0Q29udmVydGVyKCk7CisJCQljb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlci5jb252ZXJ0KHZhbHVlLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnZlcnRlZFZhbHVlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE9iamVjdCwgQm9vbGVhbj4gdmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eVR5cGUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJcmV0dXJuIHZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eVR5cGUsIHZhbHVlLCB0cnVlLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisJfQorCisJLyoKKwkgKiBAT3ZlcnJpZGUgcHVibGljIFByb3BlcnR5T3BlcmF0aW9uIGdldFByb3BlcnR5T3BlcmF0aW9uKCkgeyByZXR1cm4gdGhpczsgfQorCSAqLworCXByb3RlY3RlZCBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaWxsUHJvcGVydGllcyhTdHJpbmcgdW5pcXVlSWQsIENvbnN1bWVyPExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPj4gcHJvcGVydHlTZXR0ZXIpIHsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUHJvcGVydGllc09mTm9kZSA9IHRoaXMuZmluZFByb3BlcnRpZXNPZk5vZGUoTm9kZVR5cGVFbnVtLkdyb3VwVHlwZSwgdW5pcXVlSWQpOworCQlpZiAoZmluZFByb3BlcnRpZXNPZk5vZGUuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cyA9IGZpbmRQcm9wZXJ0aWVzT2ZOb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgbG9va2luZyBmb3IgcHJvcGVydGllcyBvZiB2ZXJ0ZXggIiArIHVuaXF1ZUlkICsgIi4gc3RhdHVzIGlzICIgKyB0aXRhbk9wZXJhdGlvblN0YXR1cyk7CisJCQlpZiAoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELmVxdWFscyh0aXRhbk9wZXJhdGlvblN0YXR1cykpIHsKKwkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0aXRhbk9wZXJhdGlvblN0YXR1czsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IGZpbmRQcm9wZXJ0aWVzT2ZOb2RlLmxlZnQoKS52YWx1ZSgpOworCisJCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNBc0xpc3QgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXRWYWx1ZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJCXByb3BlcnR5U2V0dGVyLmFjY2VwdChwcm9wZXJ0aWVzQXNMaXN0KTsKKwkJCX0KKworCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQl9CisJfQorCisJLyoqCisJICogYWRkIHByb3BlcnRpZXMgdG8gZWxlbWVudCB0eXBlLgorCSAqIAorCSAqIFBlciBwcm9wZXJ0eSwgYWRkIGEgcHJvcGVydHkgbm9kZSBhbmQgYXNzb2NpYXRlIGl0IHRvIHRoZSBlbGVtZW50IHR5cGUKKwkgKiAKKwkgKiBAcGFyYW0gdW5pcXVlSWQKKwkgKiBAcGFyYW0gcHJvcGVydGllc01hcAorCSAqICAgICAgICAgICAgVE9ETworCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0aWVzVG9FbGVtZW50VHlwZShTdHJpbmcgdW5pcXVlSWQsIE5vZGVUeXBlRW51bSBub2RlVHlwZSwgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzTWFwKSB7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPiBwcm9wZXJ0aWVzRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPigpOworCisJCWlmIChwcm9wZXJ0aWVzTWFwICE9IG51bGwpIHsKKworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydHlEZWZpbml0aW9uRW50cnkgOiBwcm9wZXJ0aWVzTWFwLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlEZWZpbml0aW9uRW50cnkuZ2V0S2V5KCk7CisKKwkJCQlFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydHlUb05vZGVUeXBlID0gdGhpcy5hZGRQcm9wZXJ0eVRvTm9kZVR5cGUocHJvcGVydHlOYW1lLCBwcm9wZXJ0eURlZmluaXRpb25FbnRyeS5nZXRWYWx1ZSgpLCBub2RlVHlwZSwgdW5pcXVlSWQpOworCisJCQkJaWYgKGFkZFByb3BlcnR5VG9Ob2RlVHlwZS5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gYWRkUHJvcGVydHlUb05vZGVUeXBlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlICIgKyBub2RlVHlwZS5nZXROYW1lKCkgKyAiICIgKyB1bmlxdWVJZCArICIgdG8gcHJvcGVydHkgIiArIHByb3BlcnR5TmFtZSArICIgaW4gZ3JhcGguIHN0YXR1cyBpcyAiICsgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQkJCX0KKwkJCQlwcm9wZXJ0aWVzRGF0YS5wdXQocHJvcGVydHlOYW1lLCBhZGRQcm9wZXJ0eVRvTm9kZVR5cGUubGVmdCgpLnZhbHVlKCkpOworCisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocHJvcGVydGllc0RhdGEpOworCisJfQorCisJcHJvdGVjdGVkIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZFByb3BlcnRpZXNUb0VsZW1lbnRUeXBlKFN0cmluZyB1bmlxdWVJZCwgTm9kZVR5cGVFbnVtIG5vZGVUeXBlLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNNYXAsIFRpdGFuVmVydGV4IGVsZW1lbnRWZXJ0ZXgpIHsKKworCQlpZiAocHJvcGVydGllc01hcCAhPSBudWxsKSB7CisKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnR5RGVmaW5pdGlvbkVudHJ5IDogcHJvcGVydGllc01hcC5lbnRyeVNldCgpKSB7CisJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5RGVmaW5pdGlvbkVudHJ5LmdldEtleSgpOworCisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gdGhpcy5hZGRQcm9wZXJ0eVRvTm9kZVR5cGUoZWxlbWVudFZlcnRleCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eURlZmluaXRpb25FbnRyeS5nZXRWYWx1ZSgpLCBub2RlVHlwZSwgdW5pcXVlSWQpOworCisJCQkJaWYgKCFvcGVyYXRpb25TdGF0dXMuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUge30ge30gIHRvIHByb3BlcnR5IHt9IGluIGdyYXBoLiBzdGF0dXMgaXMge30iLCBub2RlVHlwZS5nZXROYW1lKCksIHVuaXF1ZUlkLCBwcm9wZXJ0eU5hbWUsIG9wZXJhdGlvblN0YXR1cyk7CisJCQkJCXJldHVybiBvcGVyYXRpb25TdGF0dXM7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydGllc1RvRWxlbWVudFR5cGUoU3RyaW5nIHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0gZWxlbWVudFR5cGUsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wTWFwOworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7CisJCQlwcm9wTWFwID0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXByb3BNYXAgPSBwcm9wZXJ0aWVzLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwcm9wRGVmIC0+IHByb3BEZWYuZ2V0TmFtZSgpLCBwcm9wRGVmIC0+IHByb3BEZWYpKTsKKwkJfQorCQlyZXR1cm4gYWRkUHJvcGVydGllc1RvRWxlbWVudFR5cGUodW5pcXVlSWQsIGVsZW1lbnRUeXBlLCBwcm9wTWFwKTsKKwl9CisKKwlwdWJsaWMgVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkUHJvcGVydGllc1RvRWxlbWVudFR5cGUoVGl0YW5WZXJ0ZXggZWxlbWVudFZlcnRleCwgU3RyaW5nIHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0gZWxlbWVudFR5cGUsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wTWFwOworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7CisJCQlwcm9wTWFwID0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCXByb3BNYXAgPSBwcm9wZXJ0aWVzLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwcm9wRGVmIC0+IHByb3BEZWYuZ2V0TmFtZSgpLCBwcm9wRGVmIC0+IHByb3BEZWYpKTsKKwkJfQorCQlyZXR1cm4gYWRkUHJvcGVydGllc1RvRWxlbWVudFR5cGUodW5pcXVlSWQsIGVsZW1lbnRUeXBlLCBwcm9wTWFwLCBlbGVtZW50VmVydGV4KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPERhdGFUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlRGF0YVR5cGUoRGF0YVR5cGVEZWZpbml0aW9uIG5ld0RhdGFUeXBlRGVmaW5pdGlvbiwgRGF0YVR5cGVEZWZpbml0aW9uIG9sZERhdGFUeXBlRGVmaW5pdGlvbikgeworCQlyZXR1cm4gdXBkYXRlRGF0YVR5cGUobmV3RGF0YVR5cGVEZWZpbml0aW9uLCBvbGREYXRhVHlwZURlZmluaXRpb24sIHRydWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVEYXRhVHlwZShEYXRhVHlwZURlZmluaXRpb24gbmV3RGF0YVR5cGVEZWZpbml0aW9uLCBEYXRhVHlwZURlZmluaXRpb24gb2xkRGF0YVR5cGVEZWZpbml0aW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8RGF0YVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBuZXdQcm9wZXJ0aWVzID0gbmV3RGF0YVR5cGVEZWZpbml0aW9uLmdldFByb3BlcnRpZXMoKTsKKworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IG9sZFByb3BlcnRpZXMgPSBvbGREYXRhVHlwZURlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCisJCQlTdHJpbmcgbmV3RGVyaXZlZEZyb21OYW1lID0gZ2V0RGVyaXZlZEZyb21OYW1lKG5ld0RhdGFUeXBlRGVmaW5pdGlvbik7CisKKwkJCVN0cmluZyBvbGREZXJpdmVkRnJvbU5hbWUgPSBnZXREZXJpdmVkRnJvbU5hbWUob2xkRGF0YVR5cGVEZWZpbml0aW9uKTsKKworCQkJU3RyaW5nIGRhdGFUeXBlTmFtZSA9IG5ld0RhdGFUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCk7CisKKwkJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzVG9BZGQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWlmIChpc1Byb3BlcnR5T21pdHRlZChuZXdQcm9wZXJ0aWVzLCBvbGRQcm9wZXJ0aWVzLCBkYXRhVHlwZU5hbWUpIHx8IGlzUHJvcGVydHlUeXBlQ2hhbmdlZChkYXRhVHlwZU5hbWUsIG5ld1Byb3BlcnRpZXMsIG9sZFByb3BlcnRpZXMsIHByb3BlcnRpZXNUb0FkZCkgfHwgaXNEZXJpdmVkRnJvbU5hbWVDaGFuZ2VkKGRhdGFUeXBlTmFtZSwgbmV3RGVyaXZlZEZyb21OYW1lLCBvbGREZXJpdmVkRnJvbU5hbWUpKSB7CisKKwkJCQlsb2cuZGVidWcoIlRoZSBuZXcgZGF0YSB0eXBlICIgKyBkYXRhVHlwZU5hbWUgKyAiIGlzIGludmFsaWQuIik7CisKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5DQU5OT1RfVVBEQVRFX0VYSVNUSU5HX0VOVElUWSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJaWYgKHByb3BlcnRpZXNUb0FkZCA9PSBudWxsIHx8IHByb3BlcnRpZXNUb0FkZC5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuZGVidWcoIk5vIG5ldyBwcm9wZXJ0aWVzIGhhcyBiZWVuIGRlZmluZWQgaW4gdGhlIG5ldyBkYXRhIHR5cGUgIiArIG5ld0RhdGFUeXBlRGVmaW5pdGlvbik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUHJvcGVydGllc1RvRGF0YVR5cGUgPSBhZGRQcm9wZXJ0aWVzVG9EYXRhVHlwZShvbGREYXRhVHlwZURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgcHJvcGVydGllc1RvQWRkKTsKKworCQkJaWYgKGFkZFByb3BlcnRpZXNUb0RhdGFUeXBlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBkYXRhIHR5cGUge30gdG8gR3JhcGguIFN0YXR1cyBpcyB7fSIsIG9sZERhdGFUeXBlRGVmaW5pdGlvbiwgYWRkUHJvcGVydGllc1RvRGF0YVR5cGUucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlRmFpbGVkQWRkaW5nTm9kZVR5cGVFcnJvcigiVXBkYXRlRGF0YVR5cGUiLCAiUHJvcGVydHkiKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhZGRQcm9wZXJ0aWVzVG9EYXRhVHlwZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfSBlbHNlIHsKKworCQkJCUVpdGhlcjxEYXRhVHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkYXRhVHlwZUJ5VWlkID0gdGhpcy5nZXREYXRhVHlwZUJ5VWlkKG9sZERhdGFUeXBlRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpKTsKKwkJCQlpZiAoZGF0YVR5cGVCeVVpZC5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUHJvcGVydGllc1RvRGF0YVR5cGUucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgZGF0YSB0eXBlIHt9IGFmdGVyIHVwZGF0ZS4gU3RhdHVzIGlzIHt9Iiwgb2xkRGF0YVR5cGVEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIHN0YXR1cy5uYW1lKCkpOworCQkJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcigiVXBkYXRlRGF0YVR5cGUiLCAiUHJvcGVydHkiLCBzdGF0dXMubmFtZSgpKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoZGF0YVR5cGVCeVVpZC5sZWZ0KCkudmFsdWUoKSk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVyaXZlZEZyb21OYW1lKERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24pIHsKKwkJU3RyaW5nIGRlcml2ZWRGcm9tTmFtZSA9IGRhdGFUeXBlRGVmaW5pdGlvbi5nZXREZXJpdmVkRnJvbU5hbWUoKTsKKwkJLy8gaWYgKGRlcml2ZWRGcm9tTmFtZSA9PSBudWxsKSB7CisJCS8vIERhdGFUeXBlRGVmaW5pdGlvbiBkZXJpdmVkRnJvbSA9IGRhdGFUeXBlRGVmaW5pdGlvbi5nZXREZXJpdmVkRnJvbSgpOworCQkvLyBpZiAoZGVyaXZlZEZyb20gIT0gbnVsbCkgeworCQkvLyBsb2cuZGVidWcoIkRlcnZpZWQgZnJvbSBpcyB0YWtlbiBmcm9tIGRlZmluaXRpb24iKTsKKwkJLy8gZGVyaXZlZEZyb21OYW1lID0gZGVyaXZlZEZyb20uZ2V0TmFtZSgpOworCQkvLyB9CisJCS8vIH0gZWxzZSB7CisJCS8vIGxvZy5kZWJ1ZygiRGVydmllZCBmcm9tIGlzIHRha2VuIGZyb20gZmllbGQgZGVyaXZlZEZyb21OYW1lIik7CisJCS8vIH0KKwkJcmV0dXJuIGRlcml2ZWRGcm9tTmFtZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNQcm9wZXJ0eVR5cGVDaGFuZ2VkKFN0cmluZyBkYXRhVHlwZU5hbWUsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBuZXdQcm9wZXJ0aWVzLCBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gb2xkUHJvcGVydGllcywgTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IG91dHB1dFByb3BlcnRpZXNUb0FkZCkgeworCisJCWlmIChuZXdQcm9wZXJ0aWVzICE9IG51bGwgJiYgb2xkUHJvcGVydGllcyAhPSBudWxsKSB7CisKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gbmV3UHJvcHNNYXBwZXIgPSBuZXdQcm9wZXJ0aWVzLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0TmFtZSgpLCBwIC0+IHApKTsKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gb2xkUHJvcHNNYXBwZXIgPSBvbGRQcm9wZXJ0aWVzLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0TmFtZSgpLCBwIC0+IHApKTsKKworCQkJZm9yIChFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gbmV3UHJvcGVydHlFbnRyeSA6IG5ld1Byb3BzTWFwcGVyLmVudHJ5U2V0KCkpIHsKKworCQkJCVN0cmluZyBwcm9wTmFtZSA9IG5ld1Byb3BlcnR5RW50cnkuZ2V0S2V5KCk7CisJCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BEZWYgPSBuZXdQcm9wZXJ0eUVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQlQcm9wZXJ0eURlZmluaXRpb24gb2xkUHJvcGVydHlEZWZpbml0aW9uID0gb2xkUHJvcHNNYXBwZXIuZ2V0KHByb3BOYW1lKTsKKwkJCQlpZiAob2xkUHJvcGVydHlEZWZpbml0aW9uID09IG51bGwpIHsKKwkJCQkJbG9nLmRlYnVnKCJOZXcgcHJvcGVydHkge30gcmVjZWl2ZWQgaW4gdGhlIGRhdGEgdHlwZSB7fSIsIHByb3BOYW1lLCBkYXRhVHlwZU5hbWUpOworCQkJCQlvdXRwdXRQcm9wZXJ0aWVzVG9BZGQuYWRkKHByb3BEZWYpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlTdHJpbmcgb2xkVHlwZSA9IG9sZFByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCk7CisJCQkJU3RyaW5nIG9sZEVudHJ5VHlwZSA9IGdldEVudHJ5VHlwZShvbGRQcm9wZXJ0eURlZmluaXRpb24pOworCisJCQkJU3RyaW5nIG5ld1R5cGUgPSBwcm9wRGVmLmdldFR5cGUoKTsKKwkJCQlTdHJpbmcgbmV3RW50cnlUeXBlID0gZ2V0RW50cnlUeXBlKHByb3BEZWYpOworCisJCQkJaWYgKGZhbHNlID09IG9sZFR5cGUuZXF1YWxzKG5ld1R5cGUpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRXhpc3RpbmcgcHJvcGVydHkge30gaW4gZGF0YSB0eXBlIHt9IGhhcyBhIGRpZmZlcm5ldCB0eXBlIHt9IHRoYW4gdGhlIG5ldyBvbmUge30iLCBwcm9wTmFtZSwgZGF0YVR5cGVOYW1lLCBvbGRUeXBlLCBuZXdUeXBlKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCisJCQkJaWYgKGZhbHNlID09IGVxdWFsc0VudHJ5VHlwZXMob2xkRW50cnlUeXBlLCBuZXdFbnRyeVR5cGUpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRXhpc3RpbmcgcHJvcGVydHkge30gaW4gZGF0YSB0eXBlIHt9IGhhcyBhIGRpZmZlcm5ldCBlbnRyeSB0eXBlIHt9IHRoYW4gdGhlIG5ldyBvbmUge30iLCBwcm9wTmFtZSwgZGF0YVR5cGVOYW1lLCBvbGRFbnRyeVR5cGUsIG5ld0VudHJ5VHlwZSk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKworCQkJfQorCisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGVxdWFsc0VudHJ5VHlwZXMoU3RyaW5nIG9sZEVudHJ5VHlwZSwgU3RyaW5nIG5ld0VudHJ5VHlwZSkgeworCisJCWlmIChvbGRFbnRyeVR5cGUgPT0gbnVsbCAmJiBuZXdFbnRyeVR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSBpZiAob2xkRW50cnlUeXBlICE9IG51bGwgJiYgbmV3RW50cnlUeXBlICE9IG51bGwpIHsKKwkJCXJldHVybiBvbGRFbnRyeVR5cGUuZXF1YWxzKG5ld0VudHJ5VHlwZSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRFbnRyeVR5cGUoUHJvcGVydHlEZWZpbml0aW9uIG9sZFByb3BlcnR5RGVmaW5pdGlvbikgeworCQlTdHJpbmcgZW50cnlUeXBlID0gbnVsbDsKKwkJU2NoZW1hRGVmaW5pdGlvbiBzY2hlbWEgPSBvbGRQcm9wZXJ0eURlZmluaXRpb24uZ2V0U2NoZW1hKCk7CisJCWlmIChzY2hlbWEgIT0gbnVsbCkgeworCQkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBzY2hlbWFQcm9wZXJ0eSA9IHNjaGVtYS5nZXRQcm9wZXJ0eSgpOworCQkJaWYgKHNjaGVtYVByb3BlcnR5ICE9IG51bGwpIHsKKwkJCQllbnRyeVR5cGUgPSBzY2hlbWFQcm9wZXJ0eS5nZXRUeXBlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVudHJ5VHlwZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNQcm9wZXJ0eU9taXR0ZWQoTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IG5ld1Byb3BlcnRpZXMsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBvbGRQcm9wZXJ0aWVzLCBTdHJpbmcgZGF0YVR5cGVOYW1lKSB7CisKKwkJYm9vbGVhbiBpc1ZhbGlkID0gdmFsaWRhdGVDaGFuZ2VJbkNhc2VPZkVtcHR5UHJvcGVydGllcyhuZXdQcm9wZXJ0aWVzLCBvbGRQcm9wZXJ0aWVzLCBkYXRhVHlwZU5hbWUpOworCQlpZiAoZmFsc2UgPT0gaXNWYWxpZCkgeworCQkJbG9nLmRlYnVnKCJBdCBsZWFzdCBvbmUgcHJvcGVydHkgaXMgbWlzc2luZyBpbiB0aGUgbmV3IGRhdGEgdHlwZSB7fSIsIGRhdGFUeXBlTmFtZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobmV3UHJvcGVydGllcyAhPSBudWxsICYmIG9sZFByb3BlcnRpZXMgIT0gbnVsbCkgeworCisJCQlMaXN0PFN0cmluZz4gbmV3UHJvcHMgPSBuZXdQcm9wZXJ0aWVzLnN0cmVhbSgpLm1hcChwIC0+IHAuZ2V0TmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJTGlzdDxTdHJpbmc+IG9sZFByb3BzID0gb2xkUHJvcGVydGllcy5zdHJlYW0oKS5tYXAocCAtPiBwLmdldE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJaWYgKGZhbHNlID09IG5ld1Byb3BzLmNvbnRhaW5zQWxsKG9sZFByb3BzKSkgeworCQkJCVN0cmluZ0pvaW5lciBqb2luZXIgPSBuZXcgU3RyaW5nSm9pbmVyKCIsIiwgIlsiLCAiXSIpOworCQkJCW5ld1Byb3BzLmZvckVhY2gocCAtPiBqb2luZXIuYWRkKHApKTsKKwkJCQlsb2cuZGVidWcoIlByb3BlcnRpZXMge30gaW4gZGF0YSB0eXBlIHt9IGFyZSBtaXNzaW5nLCBidXQgdGhleSBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIGV4aXN0aW5nIGRhdGEgdHlwZSIsIGpvaW5lci50b1N0cmluZygpLCBkYXRhVHlwZU5hbWUpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUNoYW5nZUluQ2FzZU9mRW1wdHlQcm9wZXJ0aWVzKExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBuZXdQcm9wZXJ0aWVzLCBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gb2xkUHJvcGVydGllcywgU3RyaW5nIGRhdGFUeXBlTmFtZSkgeworCisJCWlmIChuZXdQcm9wZXJ0aWVzICE9IG51bGwpIHsKKwkJCWlmIChuZXdQcm9wZXJ0aWVzLmlzRW1wdHkoKSkgeworCQkJCW5ld1Byb3BlcnRpZXMgPSBudWxsOworCQkJfQorCQl9CisKKwkJaWYgKG9sZFByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJaWYgKG9sZFByb3BlcnRpZXMuaXNFbXB0eSgpKSB7CisJCQkJb2xkUHJvcGVydGllcyA9IG51bGw7CisJCQl9CisJCX0KKworCQlpZiAoKG5ld1Byb3BlcnRpZXMgPT0gbnVsbCAmJiBvbGRQcm9wZXJ0aWVzID09IG51bGwpIHx8IChuZXdQcm9wZXJ0aWVzICE9IG51bGwgJiYgb2xkUHJvcGVydGllcyAhPSBudWxsKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRGVyaXZlZEZyb21OYW1lQ2hhbmdlZChTdHJpbmcgZGF0YVR5cGVOYW1lLCBTdHJpbmcgbmV3RGVyaXZlZEZyb21OYW1lLCBTdHJpbmcgb2xkRGVyaXZlZEZyb21OYW1lKSB7CisKKwkJaWYgKG5ld0Rlcml2ZWRGcm9tTmFtZSAhPSBudWxsKSB7CisJCQlib29sZWFuIGlzRXF1YWwgPSBuZXdEZXJpdmVkRnJvbU5hbWUuZXF1YWxzKG9sZERlcml2ZWRGcm9tTmFtZSk7CisJCQlpZiAoZmFsc2UgPT0gaXNFcXVhbCkgeworCQkJCWxvZy5kZWJ1ZygiVGhlIG5ldyBkYXRhdHlwZSB7fSBkZXJpdmVkIGZyb20gYW5vdGhlciBkYXRhIHR5cGUge30gdGhhbiB0aGUgZXhpc3Rpbmcgb25lIHt9IiwgZGF0YVR5cGVOYW1lLCBuZXdEZXJpdmVkRnJvbU5hbWUsIG9sZERlcml2ZWRGcm9tTmFtZSk7CisJCQl9CisJCQlyZXR1cm4gIWlzRXF1YWw7CisJCX0gZWxzZSBpZiAob2xkRGVyaXZlZEZyb21OYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsvLyBuZXc9bnVsbCwgb2xkICE9IG51bGwKKwkJCWxvZy5kZWJ1ZygiVGhlIG5ldyBkYXRhdHlwZSB7fSBkZXJpdmVkIGZyb20gYW5vdGhlciBkYXRhIHR5cGUge30gdGhhbiB0aGUgZXhpc3Rpbmcgb25lIHt9IiwgZGF0YVR5cGVOYW1lLCBuZXdEZXJpdmVkRnJvbU5hbWUsIG9sZERlcml2ZWRGcm9tTmFtZSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJfQorCisJLyoqCisJICogCisJICogRnV0dXJlIC0gdW5maW5pc2hlZAorCSAqIAorCSAqIEBwYXJhbSB0eXBlCisJICogQHBhcmFtIHZhbHVlCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVmFsdWVUb3NjYUZ1bmN0aW9uKFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHsKKworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCisJCWlmIChUb3NjYVByb3BlcnR5VHlwZS5TVFJJTkcuZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSB8fCBpc1NjYWxhckRlcml2ZWRGcm9tU3RyaW5nKHR5cGUpKSB7CisKKwkJfQorCisJCVN0cmluZ1tdIGZ1bmN0aW9ucyA9IHsgImdldF9pbnB1dCIgfTsKKworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCisJCQlmb3IgKFN0cmluZyBmdW5jdGlvbiA6IGZ1bmN0aW9ucykgeworCisJCQl9CisKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisKKwl9CisKKwkvKioKKwkgKiBGdXR1cmUgLSB1bmZpbmlzaGVkCisJICogCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzU2NhbGFyRGVyaXZlZEZyb21TdHJpbmcoU3RyaW5nIHR5cGUpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9SZXF1aXJlbWVudE9wZXJhdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9SZXF1aXJlbWVudE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODkyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1JlcXVpcmVtZW50T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNjc0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5UcmFuc2FjdGlvbjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWRnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWx0eUluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlBvaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnRJbXBsRGVmOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklSZXF1aXJlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlJbnN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5VHlwZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlWYWx1ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVxdWlyZW1lbnREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlcXVpcmVtZW50SW1wbERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVW5pcXVlSWREYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAQ29tcG9uZW50KCJyZXF1aXJlbWVudC1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIFJlcXVpcmVtZW50T3BlcmF0aW9uIGltcGxlbWVudHMgSVJlcXVpcmVtZW50T3BlcmF0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQSA9ICJOQSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxfU0lHTiA9ICI9IjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKKworCXB1YmxpYyBSZXF1aXJlbWVudE9wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVxdWlyZW1lbnRPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbzsKKworCS8qKgorCSAqIEZPUiBURVNUIE9OTFkKKwkgKiAKKwkgKiBAcGFyYW0gdGl0YW5HZW5lcmljRGFvCisJICovCisJcHVibGljIHZvaWQgc2V0VGl0YW5HZW5lcmljRGFvKFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW8pIHsKKwkJdGhpcy50aXRhbkdlbmVyaWNEYW8gPSB0aXRhbkdlbmVyaWNEYW87CisJfQorCisJcHJvdGVjdGVkIENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjb252ZXJ0Q1REYXRhVG9DVERlZmluaXRpb24oQ2FwYWJpbGl0eVR5cGVEYXRhIGNhcGFiaWxpdHlUeXBlRGF0YSkgeworCQlsb2cuZGVidWcoIlRoZSBvYmplY3QgcmV0dXJuZWQgYWZ0ZXIgY3JlYXRlIGNhcGFiaWxpdHkgaXMgIiArIGNhcGFiaWxpdHlUeXBlRGF0YSk7CisKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmUmVzdWx0ID0gbmV3IENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigKKwkJCQljYXBhYmlsaXR5VHlwZURhdGEuZ2V0Q2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbigpKTsKKworCQlyZXR1cm4gY2FwYWJpbGl0eVR5cGVEZWZSZXN1bHQ7CisJfQorCisJLyoqCisJICogRk9SIFRFU1QgT05MWQorCSAqIAorCSAqIEBwYXJhbSBjYXBhYmlsaXR5T3BlcmF0aW9uCisJICovCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0eU9wZXJhdGlvbihDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb24pIHsKKwkJdGhpcy5jYXBhYmlsaXR5T3BlcmF0aW9uID0gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbihDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbikgeworCQl0aGlzLmNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZShTdHJpbmcgcmVxTmFtZSwKKwkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCisJCXJldHVybiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UocmVxTmFtZSwgcmVxRGVmaW5pdGlvbiwgcmVzb3VyY2VJZCwgZmFsc2UpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVSZXF1aXJlbWVudFRvUmVsYXRpb25zaGlwVHlwZShSZXF1aXJlbWVudERhdGEgcmVxRGF0YSwKKwkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uKSB7CisKKwkJU3RyaW5nIHJlbGF0aW9uc2hpcCA9IHJlcURlZmluaXRpb24uZ2V0UmVsYXRpb25zaGlwKCk7CisKKwkJaWYgKHJlbGF0aW9uc2hpcCA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIlRoZSBwcm92aWRlZCByZWxhdGlvbnNoaXAgaXMgbnVsbC4iKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCQlVbmlxdWVJZERhdGEgdW5pcXVlSWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uUmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihyZXFEYXRhLAorCQkJCXVuaXF1ZUlkRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlJFTEFUSU9OU0hJUF9UWVBFLCBudWxsKTsKKworCQlyZXR1cm4gY3JlYXRlUmVsYXRpb247CisKKwl9CisKKwkvKioKKwkgKiBBc3NvY2lhdGUgdGhlIHJlcXVpcmVtZW50IG5vZGUgdG8gaXRzIGNhcGFiaWxpdHkgdHlwZQorCSAqIAorCSAqIEBwYXJhbSByZXFEYXRhCisJICogQHBhcmFtIHJlcURlZmluaXRpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZVJlcXVpcmVtZW50VG9DYXBhYmlsaXR5VHlwZShSZXF1aXJlbWVudERhdGEgcmVxRGF0YSwKKwkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uKSB7CisKKwkJU3RyaW5nIGNhcGFiaWxpdHkgPSByZXFEZWZpbml0aW9uLmdldENhcGFiaWxpdHkoKTsKKworCQlVbmlxdWVJZERhdGEgdW5pcXVlSWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eVR5cGUsIGNhcGFiaWxpdHkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHJlcURhdGEsCisJCQkJdW5pcXVlSWREYXRhLCBHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWV9UWVBFLCBudWxsKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHJlcXVpcmVtZW50RGF0YSAiICsgcmVxRGF0YSArICIgdG8gY2FwYWJpbGl0eSAiICsgY2FwYWJpbGl0eSArICIuIHN0YXR1cyBpcyAiCisJCQkJKyBjcmVhdGVSZWxhdGlvbik7CisKKwkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlUmVxdWlyZW1lbnRUb0NhcGFiaWxpdHlUeXBlKFRpdGFuVmVydGV4IHJlcURhdGEsCisJCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxRGVmaW5pdGlvbikgeworCisJCVN0cmluZyBjYXBhYmlsaXR5ID0gcmVxRGVmaW5pdGlvbi5nZXRDYXBhYmlsaXR5KCk7CisKKwkJVW5pcXVlSWREYXRhIHVuaXF1ZUlkRGF0YSA9IG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCBjYXBhYmlsaXR5KTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShyZXFEYXRhLCB1bmlxdWVJZERhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkNBUEFCSUxJVFlfVFlQRSwgbnVsbCk7CisKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyByZXF1aXJlbWVudERhdGEge30gdG8gY2FwYWJpbGl0eSB7fS4gc3RhdHVzIGlzIHt9IiArIHJlcURhdGEsIGNhcGFiaWxpdHksCisJCQkJY3JlYXRlUmVsYXRpb24pOworCisJCXJldHVybiBjcmVhdGVSZWxhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBBc3NvY2lhdGUgcmVxdWlyZW1lbnQgaW1wbCBub2RlIHRvIGNhcGFiaWxpdHkgaW5zdGFuY2Ugbm9kZQorCSAqIAorCSAqIEBwYXJhbSByZXFJbXBsRGF0YQorCSAqIEBwYXJhbSBjYXBhYmlsaXR5SW5zdERhdGEKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eU5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZVJlcXVpcmVtZW50SW1wbFRvQ2FwYWJpbGl0eUluc3QoCisJCQlSZXF1aXJlbWVudEltcGxEYXRhIHJlcUltcGxEYXRhLCBDYXBhYmlsaXR5SW5zdERhdGEgY2FwYWJpbGl0eUluc3REYXRhLCBTdHJpbmcgY2FwYWJpbGl0eU5hbWUpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgY2FwYWJpbGl0eU5hbWUpOworCisJCWxvZy5kZWJ1ZygKKwkJCQkiQmVmb3JlIGFzc29jaWF0aW5nIHJlcXVpcmVtZW50IGltcGwgIiArIHJlcUltcGxEYXRhICsgIiB0byBjYXBhYmlsaXR5IGluc3RhbmNlICIgKyBjYXBhYmlsaXR5SW5zdERhdGEpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHJlcUltcGxEYXRhLAorCQkJCWNhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkNBUEFCSUxJVFlfSU5TVCwgcHJvcHMpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHJlcXVpcmVtZW50IGltcGwgIiArIHJlcUltcGxEYXRhICsgIiB0byBjYXBhYmlsaXR5IGluc3RhbmNlICIgKyBjYXBhYmlsaXR5SW5zdERhdGEKKwkJCQkrICIuc3RhdHVzIGlzICIgKyBjcmVhdGVSZWxhdGlvbik7CisKKwkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uOworCisJfQorCisJLyoqCisJICogQWRkIHJlcXVpcmVtZW50IG5vZGUgdG8gZ3JhcGgKKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSByZXFOYW1lCisJICogQHBhcmFtIHJlcURlZmluaXRpb24KKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8UmVxdWlyZW1lbnREYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnREYXRhKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcmVxTmFtZSwKKwkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uKSB7CisKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VJZCk7CisKKwkJUmVxdWlyZW1lbnREYXRhIHJlcXVpcmVtZW50RGF0YSA9IGJ1aWxkUmVxdWlyZW1lbnREYXRhKHJlc291cmNlSWQsIHJlcU5hbWUsIHJlcURlZmluaXRpb24pOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyByZXF1aXJlbWVudCBkYXRhIHRvIGdyYXBoIHt9IiwgcmVxdWlyZW1lbnREYXRhKTsKKwkJRWl0aGVyPFJlcXVpcmVtZW50RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShyZXF1aXJlbWVudERhdGEsCisJCQkJUmVxdWlyZW1lbnREYXRhLmNsYXNzKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyByZXF1aXJlbWVudCB0byBncmFwaCB7fSIsIHJlcXVpcmVtZW50RGF0YSk7CisJCWlmIChjcmVhdGVOb2RlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcmVxdWlyZW1lbnQgIiArIHJlcU5hbWUgKyAiIFsgIiArIHJlcXVpcmVtZW50RGF0YSArICIgXSAiICsgIiB0byBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJKyBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYXNzb2NpYXRlUmVzb3VyY2VEYXRhVG9SZXF1aXJlbWVudERhdGEocmVzb3VyY2VJZCwgcmVxTmFtZSwgcmVzb3VyY2VEYXRhLAorCQkJCXJlcXVpcmVtZW50RGF0YSk7CisJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnREYXRhKFRpdGFuVmVydGV4IHZlcnRleCwgU3RyaW5nIHJlc291cmNlSWQsCisJCQlTdHJpbmcgcmVxTmFtZSwgUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcURlZmluaXRpb24pIHsKKworCQlSZXF1aXJlbWVudERhdGEgcmVxdWlyZW1lbnREYXRhID0gYnVpbGRSZXF1aXJlbWVudERhdGEocmVzb3VyY2VJZCwgcmVxTmFtZSwgcmVxRGVmaW5pdGlvbik7CisKKwkJbG9nLmRlYnVnKCJCZWZvcmUgYWRkaW5nIHJlcXVpcmVtZW50IGRhdGEgdG8gZ3JhcGgge30iLCByZXF1aXJlbWVudERhdGEpOworCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUocmVxdWlyZW1lbnREYXRhKTsKKworCQlsb2cuZGVidWcoIkFmdGVyIGFkZGluZyByZXF1aXJlbWVudCB0byBncmFwaCB7fSIsIHJlcXVpcmVtZW50RGF0YSk7CisJCWlmIChjcmVhdGVOb2RlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gY3JlYXRlTm9kZVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhZGQgcmVxdWlyZW1lbnQgIiArIHJlcU5hbWUgKyAiIFsgIiArIHJlcXVpcmVtZW50RGF0YSArICIgXSAiICsgIiB0byBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJKyBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYXNzb2NpYXRlUmVzb3VyY2VEYXRhVG9SZXF1aXJlbWVudERhdGEocmVzb3VyY2VJZCwgcmVxTmFtZSwgdmVydGV4LAorCQkJCWNyZWF0ZU5vZGVSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQlpZiAoIXN0YXR1cy5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNyZWF0ZU5vZGVSZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIEFzc3NvY2lhdGUgcmVzb3VyY2Ugbm9kZSB0byByZXF1aXJlbWVudCBub2RlIHdpdGggUkVRVUlSRU1FTlQgbGFiZWwgYW5kCisJICogcmVxdWlyZW1lbnQgbmFtZSBhcyBwcm9wZXJ0eSBvbiB0aGUgZWRnZS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VJZAorCSAqIEBwYXJhbSByZXFOYW1lCisJICogQHBhcmFtIHJlc291cmNlRGF0YQorCSAqIEBwYXJhbSByZXF1aXJlbWVudERhdGEKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVSZXNvdXJjZURhdGFUb1JlcXVpcmVtZW50RGF0YShTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHJlcU5hbWUsCisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEsIFJlcXVpcmVtZW50RGF0YSByZXF1aXJlbWVudERhdGEpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcmVxTmFtZSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHJlc291cmNlRGF0YSwKKwkJCQlyZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZUxhYmVscy5SRVFVSVJFTUVOVCwgcHJvcHMpOworCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW4gZWRnZSBiZXR3ZWVuIHJlc291cmNlICIgKyByZXNvdXJjZUlkICsgIiB0byByZXF1aXJlbWVudCAiICsgcmVxdWlyZW1lbnREYXRhKTsKKwkJaWYgKGNyZWF0ZVJlbFJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZVJlbFJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVzb3VyY2UgIiArIHJlc291cmNlSWQgKyAiIHRvIHJlcXVpcmVtZW50ICIgKyByZXFOYW1lICsgIlsgIgorCQkJCQkrIHJlcXVpcmVtZW50RGF0YSArICJdIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlUmVzb3VyY2VEYXRhVG9SZXF1aXJlbWVudERhdGEoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyByZXFOYW1lLAorCQkJVGl0YW5WZXJ0ZXggcmVzb3VyY2VWZXJ0ZXgsIFRpdGFuVmVydGV4IHJlcXVpcmVtZW50VmVydGV4KSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIHJlcU5hbWUpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZShyZXNvdXJjZVZlcnRleCwgcmVxdWlyZW1lbnRWZXJ0ZXgsCisJCQkJR3JhcGhFZGdlTGFiZWxzLlJFUVVJUkVNRU5ULCBwcm9wcyk7CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgY3JlYXRpbiBlZGdlIGJldHdlZW4gcmVzb3VyY2Uge30gdG8gcmVxdWlyZW1lbnQge30iLCByZXNvdXJjZUlkLCByZXF1aXJlbWVudFZlcnRleCk7CisJCWlmICghY3JlYXRlUmVsUmVzdWx0LmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSB7fSB0byByZXF1aXJlbWVudCB7fSBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyByZXNvdXJjZUlkLCByZXFOYW1lLAorCQkJCQljcmVhdGVSZWxSZXN1bHQpOworCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFJlcXVpcmVtZW50RGF0YSBidWlsZFJlcXVpcmVtZW50RGF0YShTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHJlcU5hbWUsCisJCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxRGVmaW5pdGlvbikgeworCisJCVJlcXVpcmVtZW50RGF0YSByZXF1aXJlbWVudERhdGEgPSBuZXcgUmVxdWlyZW1lbnREYXRhKCk7CisJCXJlcXVpcmVtZW50RGF0YS5zZXROb2RlKHJlcURlZmluaXRpb24uZ2V0Tm9kZSgpKTsKKwkJcmVxdWlyZW1lbnREYXRhLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlcXVpcmVtZW50VWlkKHJlc291cmNlSWQsIHJlcU5hbWUpKTsKKwkJTG9uZyBjcmVhdGlvblRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJcmVxdWlyZW1lbnREYXRhLnNldENyZWF0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQlyZXF1aXJlbWVudERhdGEuc2V0TW9kaWZpY2F0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQlyZXF1aXJlbWVudERhdGEuc2V0UmVsYXRpb25zaGlwVHlwZShyZXFEZWZpbml0aW9uLmdldFJlbGF0aW9uc2hpcCgpKTsKKwkJcmVxdWlyZW1lbnREYXRhLnNldE1pbk9jY3VycmVuY2VzKHJlcURlZmluaXRpb24uZ2V0TWluT2NjdXJyZW5jZXMoKSk7CisJCXJlcXVpcmVtZW50RGF0YS5zZXRNYXhPY2N1cnJlbmNlcyhyZXFEZWZpbml0aW9uLmdldE1heE9jY3VycmVuY2VzKCkpOworCisJCXJldHVybiByZXF1aXJlbWVudERhdGE7CisJfQorCisJLyoqCisJICogYnVpbGQgcmVxdWlyZW1lbnQgaW1wbCBub2RlIGFzc29jaWF0ZSBpdCB0byByZXNvdXJjZSwgcmVxdWlyZW1lbnQgJgorCSAqIGltcGxlbWVudGF0aW9uIHJlc291cmNlCisJICogCisJICogW1JFU09VUkNFXSAtLT4gW1JFUVVJUkVNRU5UIElNUExdIC0tPiBbIFJFU09VUkNFIElNUEwgXSB8IFYgW1JFUVVJUkVNRU5UXQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUxhYmVsCisJICogQHBhcmFtIHJlc291cmNlSWQKKwkgKiBAcGFyYW0gcmVxTmFtZQorCSAqIEBwYXJhbSByZXF1aXJlbWVudFVpZAorCSAqIEBwYXJhbSByZXFJbXBsRGVmaW5pdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxSZXF1aXJlbWVudEltcGxEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnRJbXBsRGF0YShOb2RlVHlwZUVudW0gcmVzb3VyY2VMYWJlbCwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcmVxTmFtZSwgU3RyaW5nIHJlcXVpcmVtZW50VWlkLCBSZXF1aXJlbWVudEltcGxEZWYgcmVxSW1wbERlZmluaXRpb24pIHsKKworCQlSZXF1aXJlbWVudEltcGxEYXRhIHJlcXVpcmVtZW50SW1wbERhdGEgPSBidWlsZFJlcXVpcmVtZW50SW1wbERhdGEocmVzb3VyY2VJZCwgcmVxTmFtZSwgcmVxSW1wbERlZmluaXRpb24pOworCisJCWxvZy5kZWJ1ZygiQmVmb3JlIGFkZGluZyByZXF1aXJlbWVudCBpbXBsIGRhdGEgdG8gZ3JhcGggIiArIHJlcXVpcmVtZW50SW1wbERhdGEpOworCQlFaXRoZXI8UmVxdWlyZW1lbnRJbXBsRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGVSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuY3JlYXRlTm9kZShyZXF1aXJlbWVudEltcGxEYXRhLCBSZXF1aXJlbWVudEltcGxEYXRhLmNsYXNzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhZGRpbmcgcmVxdWlyZW1lbnQgdG8gZ3JhcGggIiArIHJlcXVpcmVtZW50SW1wbERhdGEgKyAiLiBzdGF0dXMgaXMgIiArIGNyZWF0ZU5vZGVSZXN1bHQpOworCQlpZiAoY3JlYXRlTm9kZVJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGNyZWF0ZU5vZGVSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHJlcXVpcmVtZW50ICIgKyByZXFOYW1lICsgIiBbICIgKyByZXF1aXJlbWVudEltcGxEYXRhICsgIiBdICIKKwkJCQkJKyAiIHRvIGdyYXBoLiBzdGF0dXMgaXMgIiArIG9wZXJhdGlvblN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG9wZXJhdGlvblN0YXR1cyk7CisJCX0KKworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IGFzc29jaWF0ZVJlcUltcGxSb1Jlc291cmNlKHJlc291cmNlTGFiZWwsCisJCQkJcmVzb3VyY2VJZCwgcmVxTmFtZSwgcmVxdWlyZW1lbnRJbXBsRGF0YSk7CisJCWlmIChjcmVhdGVSZWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVSZWxSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHJlc291cmNlICIgKyByZXNvdXJjZUlkICsgIiB0byByZXF1aXJlbWVudCBpbXBsICIgKyByZXF1aXJlbWVudEltcGxEYXRhCisJCQkJCSsgIlsgIiArIHJlcXVpcmVtZW50SW1wbERhdGEgKyAiXSBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBvcGVyYXRpb25TdGF0dXMpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChvcGVyYXRpb25TdGF0dXMpOworCQl9CisKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVUb1Jlc291cmNlSW1wbCA9IGFzc29jaWF0ZVJlcUltcGxUb0ltcGxSZXNvdXJjZSgKKwkJCQlyZXF1aXJlbWVudEltcGxEYXRhLCByZXFJbXBsRGVmaW5pdGlvbi5nZXROb2RlSWQoKSk7CisJCWlmIChhc3NvY2lhdGVUb1Jlc291cmNlSW1wbC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGFzc29jaWF0ZVRvUmVzb3VyY2VJbXBsLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXF1aXJlbWVudCBpbXBsICIgKyByZXF1aXJlbWVudEltcGxEYXRhICsgIiB0byByZXNvdXJjZSBpbXBsICIKKwkJCQkJKyByZXFJbXBsRGVmaW5pdGlvbi5nZXROb2RlSWQoKSArICJbICIgKyByZXF1aXJlbWVudEltcGxEYXRhICsgIl0gaW4gZ3JhcGguIHN0YXR1cyBpcyAiCisJCQkJCSsgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlVG9SZXF1aXJlbWVudCA9IGFzc29jaWF0ZVJlcUltcGxUb1JlcXVpcmVtZW50KAorCQkJCXJlcXVpcmVtZW50SW1wbERhdGEsIHJlcXVpcmVtZW50VWlkKTsKKwkJaWYgKGFzc29jaWF0ZVRvUmVxdWlyZW1lbnQuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBhc3NvY2lhdGVUb1JlcXVpcmVtZW50LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXF1aXJlbWVudCBpbXBsICIgKyByZXF1aXJlbWVudEltcGxEYXRhICsgIiB0byByZXF1aXJlbWVudCAiICsgcmVxTmFtZQorCQkJCQkrICIgaW4gZ3JhcGguIHN0YXR1cyBpcyAiICsgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQob3BlcmF0aW9uU3RhdHVzKTsKKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChjcmVhdGVOb2RlUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCX0KKworCXByaXZhdGUgUmVxdWlyZW1lbnRJbXBsRGF0YSBidWlsZFJlcXVpcmVtZW50SW1wbERhdGEoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyByZXFOYW1lLAorCQkJUmVxdWlyZW1lbnRJbXBsRGVmIHJlcUltcGxEZWZpbml0aW9uKSB7CisJCVN0cmluZyByZXFJbXBsVWlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVxdWlyZW1lbnRJbXBsVWlkKHJlc291cmNlSWQsIHJlcU5hbWUpOworCQlSZXF1aXJlbWVudEltcGxEYXRhIHJlcXVpcmVtZW50SW1wbERhdGEgPSBuZXcgUmVxdWlyZW1lbnRJbXBsRGF0YSgpOworCQlyZXF1aXJlbWVudEltcGxEYXRhLnNldE5hbWUocmVxTmFtZSk7CisJCXJlcXVpcmVtZW50SW1wbERhdGEuc2V0VW5pcXVlSWQocmVxSW1wbFVpZCk7CisJCUxvbmcgY3JlYXRpb25UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCXJlcXVpcmVtZW50SW1wbERhdGEuc2V0Q3JlYXRpb25UaW1lKGNyZWF0aW9uVGltZSk7CisJCXJlcXVpcmVtZW50SW1wbERhdGEuc2V0TW9kaWZpY2F0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQlQb2ludCBwb2ludCA9IHJlcUltcGxEZWZpbml0aW9uLmdldFBvaW50KCk7CisJCWlmIChwb2ludCAhPSBudWxsKSB7CisJCQlyZXF1aXJlbWVudEltcGxEYXRhLnNldFBvc1gocG9pbnQuZ2V0WCgpKTsKKwkJCXJlcXVpcmVtZW50SW1wbERhdGEuc2V0UG9zWShwb2ludC5nZXRZKCkpOworCQl9CisJCXJldHVybiByZXF1aXJlbWVudEltcGxEYXRhOworCX0KKworCS8qKgorCSAqIGFzc29jaWF0ZSByZXF1aXJlbWVudCBpbXBsIG5vZGUgdG8gdGhlIHNvdXJjZSByZXF1aXJlbWVudC4gVGhlIHNvdXJjZQorCSAqIHJlcXVpcmVtZW50IG1heWJlIGJlbG9uZ3MgdG8gb25lIG9mIHBhcmVudHMuCisJICogCisJICogQHBhcmFtIHJlcXVpcmVtZW50SW1wbERhdGEKKwkgKiBAcGFyYW0gcmVxdWlyZW1lbnRVaWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZVJlcUltcGxUb1JlcXVpcmVtZW50KAorCQkJUmVxdWlyZW1lbnRJbXBsRGF0YSByZXF1aXJlbWVudEltcGxEYXRhLCBTdHJpbmcgcmVxdWlyZW1lbnRVaWQpIHsKKworCQlVbmlxdWVJZERhdGEgdG8gPSBuZXcgVW5pcXVlSWREYXRhKE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudCwgcmVxdWlyZW1lbnRVaWQpOworCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyBlZGdlIGJldHdlZW4gcmVxdWlyZW1lbnQgaW1wbCAiICsgcmVxdWlyZW1lbnRJbXBsRGF0YSArICIgdG8gcmVxdWlyZW1lbnQgIgorCQkJCSsgcmVxdWlyZW1lbnRVaWQpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5jcmVhdGVSZWxhdGlvbihyZXF1aXJlbWVudEltcGxEYXRhLCB0bywgR3JhcGhFZGdlTGFiZWxzLklNUExFTUVOVEFUSU9OX09GLCBudWxsKTsKKwkJbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgZWRnZSBiZXR3ZWVuIHJlcXVpcmVtZW50IGltcGwgIiArIHJlcXVpcmVtZW50SW1wbERhdGEgKyAiIHRvIHJlcXVpcmVtZW50ICIKKwkJCQkrIHJlcXVpcmVtZW50VWlkICsgIi4gc3RhdHVzIGlzICIgKyBjcmVhdGVSZWxSZXN1bHQpOworCisJCXJldHVybiBjcmVhdGVSZWxSZXN1bHQ7CisJfQorCisJLyoqCisJICogQXNzb2NpYXRlIHJlcXVpcmVtZW50IGltcGwgbm9kZSB0byB0aGUgbm9kZSB3aGljaCBzdXBwbHkgdGhpcworCSAqIHJlcXVpcmVtZW50LgorCSAqIAorCSAqIEBwYXJhbSByZXF1aXJlbWVudEltcGxEYXRhCisJICogQHBhcmFtIG5vZGVJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlUmVxSW1wbFRvSW1wbFJlc291cmNlKAorCQkJUmVxdWlyZW1lbnRJbXBsRGF0YSByZXF1aXJlbWVudEltcGxEYXRhLCBTdHJpbmcgbm9kZUlkKSB7CisKKwkJVW5pcXVlSWREYXRhIG5vZGVJbXBsID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIG5vZGVJZCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBub2RlSWQpOworCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyBlZGdlIGJldHdlZW4gcmVxdWlyZW1lbnQgaW1wbCAiICsgcmVxdWlyZW1lbnRJbXBsRGF0YSArICIgdG8gbm9kZSBpbXBsICIgKyBub2RlSWQpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbFJlc3VsdCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5jcmVhdGVSZWxhdGlvbihyZXF1aXJlbWVudEltcGxEYXRhLCBub2RlSW1wbCwgR3JhcGhFZGdlTGFiZWxzLk5PREVfSU1QTCwgcHJvcHMpOworCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW5nIGVkZ2UgYmV0d2VlbiByZXF1aXJlbWVudCAiICsgcmVxdWlyZW1lbnRJbXBsRGF0YSArICIgdG8gbm9kZSBpbXBsICIgKyBub2RlSWQKKwkJCQkrICIuIHN0YXR1cyBpcyAiICsgY3JlYXRlUmVsUmVzdWx0KTsKKworCQlyZXR1cm4gY3JlYXRlUmVsUmVzdWx0OworCX0KKworCS8qKgorCSAqIGNyZWF0ZSBhbiBlZGdlIGJldHdlZW4gdGhlIHJlcXVpcmVtZW50IGltcGwgbm9kZSB0byB0aGUgaW1wbGVtZW50YXRpb24KKwkgKiByZXNvdXJjZS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VMYWJlbAorCSAqIEBwYXJhbSByZXNvdXJjZUlkCisJICogQHBhcmFtIHJlcU5hbWUKKwkgKiBAcGFyYW0gcmVxdWlyZW1lbnRJbXBsRGF0YQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlUmVxSW1wbFJvUmVzb3VyY2UoTm9kZVR5cGVFbnVtIHJlc291cmNlTGFiZWwsCisJCQlTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHJlcU5hbWUsIFJlcXVpcmVtZW50SW1wbERhdGEgcmVxdWlyZW1lbnRJbXBsRGF0YSkgeworCisJCVVuaXF1ZUlkRGF0YSByZXNvdXJjZSA9IG5ldyBVbmlxdWVJZERhdGEocmVzb3VyY2VMYWJlbCwgcmVzb3VyY2VJZCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCByZXFOYW1lKTsKKwkJbG9nLmRlYnVnKAorCQkJCSJCZWZvcmUgY3JlYXRpbmcgZWRnZSBiZXR3ZWVuIHJlc291cmNlICIgKyByZXNvdXJjZUlkICsgIiB0byByZXF1aXJlbWVudCBpbXBsICIgKyByZXF1aXJlbWVudEltcGxEYXRhKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocmVzb3VyY2UsCisJCQkJcmVxdWlyZW1lbnRJbXBsRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlJFUVVJUkVNRU5UX0lNUEwsIHByb3BzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBjcmVhdGluZyBlZGdlIGJldHdlZW4gdG8gcmVxdWlyZW1lbnQgaW1wbCAiICsgcmVxdWlyZW1lbnRJbXBsRGF0YSArICIgdG8gcmVzb3VyY2UgIiArIHJlc291cmNlCisJCQkJKyAiLiBzdGF0dXMgaXMgIiArIGNyZWF0ZVJlbFJlc3VsdCk7CisKKwkJcmV0dXJuIGNyZWF0ZVJlbFJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVOb2RlRXhpc3RzKFN0cmluZyBub2RlKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UoU3RyaW5nIHJlcU5hbWUsCisJCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxRGVmaW5pdGlvbiwgU3RyaW5nIHJlc291cmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisKKwkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gYWRkIHJlcXVpcmVtZW50ICIgKyByZXFOYW1lICsgIiB0byByZXNvdXJjZSAiICsgcmVzb3VyY2VJZAorCQkJCQkrICIuIHJlcXVpcmVtZW50IGRlZmluaXRpb24gaXMgIiArIHJlcURlZmluaXRpb24pOworCisJCQl2YWxpZGF0ZU5vZGVFeGlzdHMocmVxRGVmaW5pdGlvbi5nZXROb2RlKCkpOworCisJCQkvLyAxLiBhZGQgcmVxdWlyZW1lbnQgbm9kZSBpbiBncmFwaCBhbmQgYXNzb2NpYXRlIGl0IHRvIHRoZSByZXNvdXJjZQorCQkJbG9nLmRlYnVnKCJHb2luZyB0byBhZGQgcmVxdWlyZW1lbnQgbm9kZSBpbiBncmFwaCBhbmQgYXNzb2NpYXRlIGl0IHRvIHRoZSByZXNvdXJjZSIpOworCQkJRWl0aGVyPFJlcXVpcmVtZW50RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50RGF0YSA9IGFkZFJlcXVpcmVtZW50RGF0YShyZXNvdXJjZUlkLCByZXFOYW1lLAorCQkJCQlyZXFEZWZpbml0aW9uKTsKKwkJCWlmIChhZGRSZXF1aXJlbWVudERhdGEuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHJlcXVpcmVtZW50ICIgKyByZXFOYW1lICsgIiBub2RlIHRvIGdyYXBoLiBzdGF0dXMgaXMgIiArIGFkZFJlcXVpcmVtZW50RGF0YSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KAorCQkJCQkJRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhZGRSZXF1aXJlbWVudERhdGEucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJUmVxdWlyZW1lbnREYXRhIHJlcXVpcmVtZW50RGF0YSA9IGFkZFJlcXVpcmVtZW50RGF0YS5sZWZ0KCkudmFsdWUoKTsKKworCQkJbG9nLmRlYnVnKCJHb2luZyB0byBhc3NvY2lhdGUgdGhlIHJlcXVpcmVtZW50IHRvIHRoZSBhcHByaW9wcmlhdGUgY2FwYWJpbGl0eSB0eXBlIik7CisJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFzc29jaWF0ZVJlcVRvQ2FwYWJpbGl0eVR5cGUgPSBhc3NvY2lhdGVSZXF1aXJlbWVudFRvQ2FwYWJpbGl0eVR5cGUoCisJCQkJCXJlcXVpcmVtZW50RGF0YSwgcmVxRGVmaW5pdGlvbik7CisJCQlpZiAoYXNzb2NpYXRlUmVxVG9DYXBhYmlsaXR5VHlwZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVxdWlyZW1lbnQgZGF0YSBub2RlICIgKyByZXF1aXJlbWVudERhdGEKKwkJCQkJCSsgIiB0byB0aGUgY2FwYWJpbGl0eSB0eXBlIG5vZGUgIiArIHJlcURlZmluaXRpb24uZ2V0Q2FwYWJpbGl0eSgpKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyCisJCQkJCQkuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFzc29jaWF0ZVJlcVRvQ2FwYWJpbGl0eVR5cGUucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJLy8gVE9ETzogZXNvZmVyIGFzc29jaWF0ZSByZXF1aXJlbWVudCB0byB0aGUgcmVsYXRpb25zaGlwIHR5cGUKKwkJCS8qCisJCQkgKiBFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+CisJCQkgKiBhc3NvY2lhdGVSZXFUb1JlbHNoaXBUeXBlID0KKwkJCSAqIGFzc29jaWF0ZVJlcXVpcmVtZW50VG9SZWxhdGlvbnNoaXBUeXBlKCByZXF1aXJlbWVudERhdGEsCisJCQkgKiByZXFEZWZpbml0aW9uKTsKKwkJCSAqIAorCQkJICogaWYgKGFzc29jaWF0ZVJlcVRvUmVsc2hpcFR5cGUuaXNSaWdodCgpICYmCisJCQkgKiBhc3NvY2lhdGVSZXFUb1JlbHNoaXBUeXBlLnJpZ2h0KCkudmFsdWUoKSAhPQorCQkJICogVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkgKiBsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVxdWlyZW1lbnQgZGF0YSBub2RlICIgKworCQkJICogcmVxdWlyZW1lbnREYXRhICsgIiB0byB0aGUgcmVsYXRpb25zaGlwIHR5cGUgbm9kZSAiICsKKwkJCSAqIHJlcURlZmluaXRpb24uZ2V0UmVsYXRpb25zaGlwKCkpOyByZXN1bHQgPSBFaXRoZXIKKwkJCSAqIC5yaWdodChUaXRhblN0YXR1c0NvbnZlcnRlcgorCQkJICogLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVSZXFUb1JlbHNoaXBUeXBlCisJCQkgKiAucmlnaHQoKS52YWx1ZSgpKSk7IHJldHVybiByZXN1bHQ7IH0KKwkJCSAqLworCisJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGZldGNoIHRoZSByZXF1aXJlbWVudCAiICsgcmVxTmFtZSArICIgZnJvbSBncmFwaCIpOworCQkJRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcXVpcmVtZW50RGVmaW5pdGlvblJlcyA9IGdldFJlcXVpcmVtZW50KAorCQkJCQlyZXF1aXJlbWVudERhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQlpZiAocmVxdWlyZW1lbnREZWZpbml0aW9uUmVzLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodCgKKwkJCQkJCURhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMocmVxdWlyZW1lbnREZWZpbml0aW9uUmVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHJlcXVpcmVtZW50RGVmaW5pdGlvblJlcy5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UoVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgsIFN0cmluZyByZXFOYW1lLAorCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcURlZmluaXRpb24sIFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCXRyeSB7CisKKwkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gYWRkIHJlcXVpcmVtZW50IHt9IHRvIHJlc291cmNlIC4gcmVxdWlyZW1lbnQgZGVmaW5pdGlvbiBpcyAiLCByZXFOYW1lLCByZXNvdXJjZUlkLAorCQkJCQlyZXFEZWZpbml0aW9uKTsKKworCQkJdmFsaWRhdGVOb2RlRXhpc3RzKHJlcURlZmluaXRpb24uZ2V0Tm9kZSgpKTsKKworCQkJLy8gMS4gYWRkIHJlcXVpcmVtZW50IG5vZGUgaW4gZ3JhcGggYW5kIGFzc29jaWF0ZSBpdCB0byB0aGUgcmVzb3VyY2UKKwkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gYWRkIHJlcXVpcmVtZW50IG5vZGUgaW4gZ3JhcGggYW5kIGFzc29jaWF0ZSBpdCB0byB0aGUgcmVzb3VyY2UiKTsKKwkJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50RGF0YSA9IGFkZFJlcXVpcmVtZW50RGF0YShtZXRhZGF0YVZlcnRleCwKKwkJCQkJcmVzb3VyY2VJZCwgcmVxTmFtZSwgcmVxRGVmaW5pdGlvbik7CisJCQlpZiAoYWRkUmVxdWlyZW1lbnREYXRhLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCByZXF1aXJlbWVudCB7fSBub2RlIHRvIGdyYXBoLiBzdGF0dXMgaXMge30iLCByZXFOYW1lLAorCQkJCQkJYWRkUmVxdWlyZW1lbnREYXRhLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhZGRSZXF1aXJlbWVudERhdGEucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGFzc29jaWF0ZSB0aGUgcmVxdWlyZW1lbnQgdG8gdGhlIGFwcHJpb3ByaWF0ZSBjYXBhYmlsaXR5IHR5cGUiKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZVJlcVRvQ2FwYWJpbGl0eVR5cGUgPSBhc3NvY2lhdGVSZXF1aXJlbWVudFRvQ2FwYWJpbGl0eVR5cGUoCisJCQkJCWFkZFJlcXVpcmVtZW50RGF0YS5sZWZ0KCkudmFsdWUoKSwgcmVxRGVmaW5pdGlvbik7CisJCQlpZiAoIWFzc29jaWF0ZVJlcVRvQ2FwYWJpbGl0eVR5cGUuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXF1aXJlbWVudCBkYXRhIG5vZGUge30gdG8gdGhlIGNhcGFiaWxpdHkgdHlwZSBub2RlIHt9IiArIHJlcURlZmluaXRpb24sCisJCQkJCQlyZXFEZWZpbml0aW9uLmdldENhcGFiaWxpdHkoKSk7CisJCQkJcmVzdWx0ID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVSZXFUb0NhcGFiaWxpdHlUeXBlKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgIXJlc3VsdC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJLyoqCisJICogRmV0Y2ggcmVxdWlyZW1lbnQgZnJvbSBncmFwaAorCSAqIAorCSAqIEBwYXJhbSB1bmlxdWVJZAorCSAqICAgICAgICAgICAgLSB0aGUgdW5pcXVlaWQgb2YgdGhlIHJlcXVpcmVtZW50IGluIHRoZSBncmFwaAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlcXVpcmVtZW50KFN0cmluZyB1bmlxdWVJZCkgeworCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZmV0Y2ggdGhlIHJlcXVpcmVtZW50IHt9IGZyb20gZ3JhcGguIiwgdW5pcXVlSWQpOworCQlFaXRoZXI8UmVxdWlyZW1lbnREYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVxRGF0YVJlc3VsdCA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudCksIHVuaXF1ZUlkLCBSZXF1aXJlbWVudERhdGEuY2xhc3MpOworCisJCWlmIChyZXFEYXRhUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCByZXF1aXJlbWVudCBub2RlIGluIGdyYXBoICIgKyB1bmlxdWVJZCArICIuIHN0YXR1cyBpcyAiICsgcmVxRGF0YVJlc3VsdCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlcURhdGFSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZmV0Y2ggdGhlIGNhcGFiaWxpdHkgdHlwZSBhc3NvY2lhdGUgdG8gcmVxdWlyZW1lbnQge30iLCB1bmlxdWVJZCk7CisJCUVpdGhlcjxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlUeXBlRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIHVuaXF1ZUlkLCBHcmFwaEVkZ2VMYWJlbHMuQ0FQQUJJTElUWV9UWVBFLAorCQkJCQkJTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHlUeXBlLCBDYXBhYmlsaXR5VHlwZURhdGEuY2xhc3MpOworCisJCWlmIChjYXBhYmlsaXR5VHlwZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgdGhlIGNhcGFiaWxpdHkgb2YgYSBnaXZlbiByZXF1aXJlbWVudCAiICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIgorCQkJCQkrIGNhcGFiaWxpdHlUeXBlUmVzKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY2FwYWJpbGl0eVR5cGVSZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eVR5cGVEYXRhLCBHcmFwaEVkZ2U+IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5VHlwZVJlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlTdHJpbmcgY2FwYWJpbGl0eVR5cGUgPSBjYXBhYmlsaXR5LmdldEtleSgpLmdldENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24oKS5nZXRUeXBlKCk7CisKKwkJLy8gVE9ETzogZXNvZmVyIGFkZCByZWxhdGlvbnNoaXAgYXMgZWRnZQorCQkvKgorCQkgKiBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFJlbGF0aW9uc2hpcFR5cGVEYXRhLCBHcmFwaEVkZ2U+PiwKKwkJICogVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlbGF0aW9uc2hpcFJlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkgKiAuZ2V0Q2hpbGRyZW5Ob2RlcyggR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwKKwkJICogdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5SRUxBVElPTlNISVBfVFlQRSwKKwkJICogTm9kZVR5cGVFbnVtLlJlbGF0aW9uc2hpcFR5cGUsIFJlbGF0aW9uc2hpcFR5cGVEYXRhLmNsYXNzKTsKKwkJICogCisJCSAqIGlmIChyZWxhdGlvbnNoaXBSZXMuaXNSaWdodCgpICYmIHJlbGF0aW9uc2hpcFJlcy5yaWdodCgpLnZhbHVlKCkgIT0KKwkJICogVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCSAqIGxvZy5lcnJvcigiQ2Fubm90IGZpbmQgdGhlIGNhcGFiaWxpdHkgb2YgYSBnaXZlbiByZXF1aXJlbWVudCAiICsKKwkJICogdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIiArIGNhcGFiaWxpdHlUeXBlc1Jlcyk7IHJldHVybgorCQkgKiBFaXRoZXIucmlnaHQocmVsYXRpb25zaGlwUmVzLnJpZ2h0KCkudmFsdWUoKSk7IH0KKwkJICogCisJCSAqIFN0cmluZyByZWxhdGlvbnNoaXBUeXBlID0gbnVsbDsgaWYgKHJlbGF0aW9uc2hpcFJlcy5pc0xlZnQoKSkgeworCQkgKiBMaXN0PEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwVHlwZURhdGEsIEdyYXBoRWRnZT4+IHJzdFBhaXJzID0KKwkJICogcmVsYXRpb25zaGlwUmVzIC5sZWZ0KCkudmFsdWUoKTsgaWYgKHJzdFBhaXJzID09IG51bGwgfHwgdHJ1ZSA9PQorCQkgKiByc3RQYWlycy5pc0VtcHR5KCkpIHsgbG9nLmVycm9yKAorCQkgKiAiQ2Fubm90IGZpbmQgdGhlIGNhcGFiaWxpdHkgb2YgYSBnaXZlbiByZXF1aXJlbWVudCAiICsgdW5pcXVlSWQpOworCQkgKiByZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7IH0KKwkJICogCisJCSAqIEltbXV0YWJsZVBhaXI8UmVsYXRpb25zaGlwVHlwZURhdGEsIEdyYXBoRWRnZT4gcmVsYXRpb25zaGlwID0KKwkJICogcnN0UGFpcnMgLmdldCgwKTsgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC5nZXRLZXkoKS5nZXRUeXBlKCk7CisJCSAqIH0KKwkJICovCisKKwkJbG9nLmRlYnVnKCJHb2luZyB0byBmZXRjaCB0aGUgY2FwYWJpbGl0eSB0eXBlIGFzc29jaWF0ZSB0byByZXF1aXJlbWVudCB7fSIsIHVuaXF1ZUlkKTsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldFBhcmVudE5vZGUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VTklRVUVfSUQuZ2V0UHJvcGVydHkoKSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5SRVFVSVJFTUVOVCwKKwkJCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAocGFyZW50Tm9kZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgdGhlIHBhcmVudCByZXNvdXJjZSBmb3IgYSBnaXZlbiByZXF1aXJlbWVudCAiICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIgorCQkJCQkrIHBhcmVudE5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocGFyZW50Tm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQl9CisKKwkJUmVxdWlyZW1lbnREYXRhIHJlcXVpcmVtZW50RGF0YSA9IHJlcURhdGFSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmaW5pdGlvbiA9IG5ldyBSZXF1aXJlbWVudERlZmluaXRpb24oKTsKKwkJcmVxdWlyZW1lbnREZWZpbml0aW9uLnNldE93bmVySWQocGFyZW50Tm9kZS5sZWZ0KCkudmFsdWUoKS5nZXRMZWZ0KCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCkpOworCQlyZXF1aXJlbWVudERlZmluaXRpb24uc2V0Tm9kZShyZXF1aXJlbWVudERhdGEuZ2V0Tm9kZSgpKTsKKwkJcmVxdWlyZW1lbnREZWZpbml0aW9uLnNldFVuaXF1ZUlkKHJlcXVpcmVtZW50RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJcmVxdWlyZW1lbnREZWZpbml0aW9uLnNldENhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGUpOworCQlyZXF1aXJlbWVudERlZmluaXRpb24uc2V0UmVsYXRpb25zaGlwKHJlcXVpcmVtZW50RGF0YS5nZXRSZWxhdGlvbnNoaXBUeXBlKCkpOworCQlyZXF1aXJlbWVudERlZmluaXRpb24uc2V0TWluT2NjdXJyZW5jZXMocmVxdWlyZW1lbnREYXRhLmdldE1pbk9jY3VycmVuY2VzKCkpOworCQlyZXF1aXJlbWVudERlZmluaXRpb24uc2V0TWF4T2NjdXJyZW5jZXMocmVxdWlyZW1lbnREYXRhLmdldE1heE9jY3VycmVuY2VzKCkpOworCisJCXJldHVybiBFaXRoZXIubGVmdChyZXF1aXJlbWVudERlZmluaXRpb24pOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlcXVpcmVtZW50T2ZSZXNvdXJjZShTdHJpbmcgcmVxTmFtZSwKKwkJCVN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJcmV0dXJuIGdldFJlcXVpcmVtZW50T2ZSZXNvdXJjZShyZXFOYW1lLCByZXNvdXJjZUlkLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlcXVpcmVtZW50T2ZSZXNvdXJjZShTdHJpbmcgcmVxTmFtZSwKKwkJCVN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQlTdHJpbmcgcmVxVW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXF1aXJlbWVudFVpZChyZXNvdXJjZUlkLCByZXFOYW1lKTsKKwkJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXF1aXJlbWVudFJlcyA9IGdldFJlcXVpcmVtZW50KHJlcVVuaXF1ZUlkKTsKKworCQkJaWYgKHJlcXVpcmVtZW50UmVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHJldHJpZXZlIHJlcXVpcmVtZW50ICIgKyByZXFOYW1lICsgIiBhc3NvY2lhdGVkIHRvIHJlc291cmNlICIgKyByZXNvdXJjZUlkKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIKKwkJCQkJCS5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlcXVpcmVtZW50UmVzLnJpZ2h0KCkudmFsdWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChyZXF1aXJlbWVudFJlcy5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnRJbXBsVG9SZXNvdXJjZShTdHJpbmcgcmVxTmFtZSwKKwkJCVJlcXVpcmVtZW50SW1wbERlZiByZXFEZWZpbml0aW9uLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHBhcmVudFJlcVVuaXF1ZUlkKSB7CisKKwkJcmV0dXJuIGFkZFJlcXVpcmVtZW50SW1wbFRvUmVzb3VyY2UocmVxTmFtZSwgcmVxRGVmaW5pdGlvbiwgcmVzb3VyY2VJZCwgcGFyZW50UmVxVW5pcXVlSWQsIGZhbHNlKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRSZXF1aXJlbWVudEltcGxUb1Jlc291cmNlKFN0cmluZyByZXFOYW1lLAorCQkJUmVxdWlyZW1lbnRJbXBsRGVmIHJlcUltcGxEZWZpbml0aW9uLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIHBhcmVudFJlcVVuaXF1ZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCS8vIGZpbmQgdGhlIHJlcXVpcmVtZW50IGRlZmluZWQgYXQgdGhlIHJlc291cmNlIGl0c2VsZiBvciB1bmRlciBvbmUKKwkJCS8vIG9mIGl0cyBwYXJlbnRzCisJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFJlcSA9IGdldFJlcXVpcmVtZW50KHBhcmVudFJlcVVuaXF1ZUlkKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgbG9va2luZyBmb3IgcmVxdWlyZW1lbnQgIiArIHBhcmVudFJlcVVuaXF1ZUlkICsgIi4gc3RhdHVzIGlzICIgKyBmaW5kUmVxKTsKKwkJCWlmIChmaW5kUmVxLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRSZXEucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiVGhlIHJlcXVpcm1lbnQgIiArIHBhcmVudFJlcVVuaXF1ZUlkICsgIiB3YXMgbm90IGZvdW5kIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJCSsgZmluZFJlcS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uID0gZmluZFJlcS5sZWZ0KCkudmFsdWUoKTsKKwkJCVN0cmluZyByZXFOb2RlID0gcmVxRGVmaW5pdGlvbi5nZXROb2RlKCk7CisJCQlTdHJpbmcgcmVxQ2FwYWJpbGl0eSA9IHJlcURlZmluaXRpb24uZ2V0Q2FwYWJpbGl0eSgpOworCisJCQlTdHJpbmcgbm9kZUlkSW1wbCA9IHJlcUltcGxEZWZpbml0aW9uLmdldE5vZGVJZCgpOworCisJCQljaGVja05vZGVJZEltcGxlbWVudHNSZXF1aXJlbWVudE5vZGUobm9kZUlkSW1wbCwgcmVxTm9kZSk7CisKKwkJCUVpdGhlcjxSZXF1aXJlbWVudEltcGxEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnRJbXBsRGF0YSA9IGFkZFJlcXVpcmVtZW50SW1wbERhdGEoCisJCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzb3VyY2VJZCwgcmVxTmFtZSwgcGFyZW50UmVxVW5pcXVlSWQsIHJlcUltcGxEZWZpbml0aW9uKTsKKworCQkJaWYgKGFkZFJlcXVpcmVtZW50SW1wbERhdGEuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYWRkUmVxdWlyZW1lbnRJbXBsRGF0YS5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIHJlcXVpcmVtZW50IGRhdGEgaW1wbCBub2RlIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJCSsgYWRkUmVxdWlyZW1lbnRJbXBsRGF0YS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlSZXF1aXJlbWVudEltcGxEYXRhIHJlcXVpcmVtZW50SW1wbERhdGEgPSBhZGRSZXF1aXJlbWVudEltcGxEYXRhLmxlZnQoKS52YWx1ZSgpOworCisJCQlsb2cuZGVidWcoIkFkZCB0aGUgcHJvcGVydGllcyBvZiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSB0YXJnZXQgbm9kZSAiICsgbm9kZUlkSW1wbAorCQkJCQkrICIgdG8gdGhlIHJlcXVpcmVtZW50IGltcGwgbm9kZSAiICsgcmVxdWlyZW1lbnRJbXBsRGF0YS5nZXRVbmlxdWVJZCgpICsgIiBpbiBncmFwaC4iKTsKKwkJCU1hcDxTdHJpbmcsIENhcGFiaWx0eUluc3RhbmNlPiByZXF1aXJlbWVudFByb3BlcnRpZXNQZXJDYXBhYmlsaXR5ID0gcmVxSW1wbERlZmluaXRpb24KKwkJCQkJLmdldFJlcXVpcmVtZW50UHJvcGVydGllcygpOworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYWRkUHJvcHNSZXN1bHQgPSBhZGRDYXBhYmlsaXR5UHJvcGVydGllc1RvUmVxSW1wbChyZXF1aXJlbWVudEltcGxEYXRhLCByZXFDYXBhYmlsaXR5LAorCQkJCQlub2RlSWRJbXBsLCByZXF1aXJlbWVudFByb3BlcnRpZXNQZXJDYXBhYmlsaXR5KTsKKworCQkJaWYgKGFkZFByb3BzUmVzdWx0ICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYWRkIGNhcGFiaWxpdGllcyBwcm9wZXJ0aWVzIHRvIFJlcXVpcmVtZW50IGltcGwgIiArIHJlcXVpcmVtZW50SW1wbERhdGEpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFkZFByb3BzUmVzdWx0KSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocmVxRGVmaW5pdGlvbik7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXF1aXJlbWVudEltcGxEZWYsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXF1aXJlbWVudEltcGxPZlJlc291cmNlKFN0cmluZyByZXFOYW1lLAorCQkJU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlSZXF1aXJlbWVudEltcGxEZWYgcmVxdWlyZW1lbnRJbXBsRGVmID0gbmV3IFJlcXVpcmVtZW50SW1wbERlZigpOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UmVxdWlyZW1lbnRJbXBsRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXFJbXBsTm9kZXNSZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLlJFUVVJUkVNRU5UX0lNUEwsIE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudEltcGwsIFJlcXVpcmVtZW50SW1wbERhdGEuY2xhc3MpOworCQlsb2cuZGVidWcoIkFmdGVyIGxvb2tpbmcgZm9yIHJlcXVpcmVtZW50IGltcGwgZWRnZSBvZiByZXNvdXJjZSAiICsgcmVzb3VyY2VJZCk7CisJCWlmIChyZXFJbXBsTm9kZXNSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXFJbXBsTm9kZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQl9CisKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlMaXN0PEltbXV0YWJsZVBhaXI8UmVxdWlyZW1lbnRJbXBsRGF0YSwgR3JhcGhFZGdlPj4gcmVxSW1wbE5vZGVzID0gcmVxSW1wbE5vZGVzUmVzLmxlZnQoKS52YWx1ZSgpOworCQlmb3IgKEltbXV0YWJsZVBhaXI8UmVxdWlyZW1lbnRJbXBsRGF0YSwgR3JhcGhFZGdlPiBlbnRyeSA6IHJlcUltcGxOb2RlcykgeworCQkJR3JhcGhFZGdlIGdyYXBoRWRnZSA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQlTdHJpbmcgZWRnZVR5cGUgPSAoU3RyaW5nKSBncmFwaEVkZ2UuZ2V0UHJvcGVydGllcygpLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQlpZiAocmVxTmFtZS5lcXVhbHMoZWRnZVR5cGUpKSB7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCVJlcXVpcmVtZW50SW1wbERhdGEgcmVxdWlyZW1lbnRJbXBsRGF0YSA9IGVudHJ5LmdldEtleSgpOworCisJCQkJcmVxdWlyZW1lbnRJbXBsRGVmLnNldFVuaXF1ZUlkKHJlcXVpcmVtZW50SW1wbERhdGEuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5vZGVJbXBsUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCQkuZ2V0Q2hpbGQoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlcXVpcmVtZW50SW1wbCksCisJCQkJCQkJCXJlcXVpcmVtZW50SW1wbERhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLk5PREVfSU1QTCwgTm9kZVR5cGVFbnVtLlJlc291cmNlLAorCQkJCQkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJCQlpZiAobm9kZUltcGxSZXMuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IG5vZGVJbXBsUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJObyBpbXBsZW1lbnRhdGlvbiByZXNvdXJjZSB3YXMgZm91bmQgdW5kZXIgcmVxdWlyZW1lbnQgaW1wbCAiCisJCQkJCQkJKyByZXF1aXJlbWVudEltcGxEYXRhLmdldFVuaXF1ZUlkKCkgKyAiLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKwkJCQlTdHJpbmcgbm9kZUltcGwgPSBub2RlSW1wbFJlcy5sZWZ0KCkudmFsdWUoKS5nZXRLZXkoKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQlyZXF1aXJlbWVudEltcGxEZWYuc2V0Tm9kZUlkKG5vZGVJbXBsKTsKKworCQkJCVN0cmluZyBwb3NYID0gcmVxdWlyZW1lbnRJbXBsRGF0YS5nZXRQb3NYKCk7CisJCQkJU3RyaW5nIHBvc1kgPSByZXF1aXJlbWVudEltcGxEYXRhLmdldFBvc1koKTsKKwkJCQlpZiAocG9zWCAhPSBudWxsICYmIHBvc1kgIT0gbnVsbCkgeworCQkJCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludChwb3NYLCBwb3NZKTsKKwkJCQkJcmVxdWlyZW1lbnRJbXBsRGVmLnNldFBvaW50KHBvaW50KTsKKwkJCQl9CisKKwkJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXBhSW5zdERhdGFSZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJCS5nZXRDaGlsZHJlbk5vZGVzKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudEltcGwpLAorCQkJCQkJCQlyZXF1aXJlbWVudEltcGxEYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsCisJCQkJCQkJCU5vZGVUeXBlRW51bS5DYXBhYmlsaXR5SW5zdCwgQ2FwYWJpbGl0eUluc3REYXRhLmNsYXNzKTsKKwkJCQlpZiAoY2FwYUluc3REYXRhUmVzLmlzUmlnaHQoKSkgeworCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjYXBhSW5zdERhdGFSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZGVidWcoIk5vIGNhcGFiaWxpdHkgaW5zdGFuY2Ugd2FzIGZvdW5kIHVuZGVyIHJlcXVpcmVtZW50IGltcGwgIgorCQkJCQkJCSsgcmVxdWlyZW1lbnRJbXBsRGF0YS5nZXRVbmlxdWVJZCgpICsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQl9CisKKwkJCQlNYXA8U3RyaW5nLCBDYXBhYmlsdHlJbnN0YW5jZT4gcmVxdWlyZW1lbnRQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDYXBhYmlsdHlJbnN0YW5jZT4oKTsKKworCQkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4+IGxpc3QgPSBjYXBhSW5zdERhdGFSZXMubGVmdCgpLnZhbHVlKCk7CisJCQkJZm9yIChJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiBjYXBhYmlsaXR5SW5zdCA6IGxpc3QpIHsKKwkJCQkJQ2FwYWJpbGl0eUluc3REYXRhIGNhcGFiaWxpdHlJbnN0RGF0YSA9IGNhcGFiaWxpdHlJbnN0LmdldEtleSgpOworCQkJCQlHcmFwaEVkZ2UgZWRnZSA9IGNhcGFiaWxpdHlJbnN0LmdldFZhbHVlKCk7CisJCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGVkZ2UuZ2V0UHJvcGVydGllcygpOworCQkJCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7CisJCQkJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIHRoZSBwcm9wZXJ0eSAiICsgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkKKwkJCQkJCQkJKyAiIG9uIHRoZSBlZGdlICIgKyBlZGdlKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9FTEVNRU5UKTsKKwkJCQkJfQorCQkJCQlTdHJpbmcgY2FwYWJpbGl0eU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQkJCWlmIChjYXBhYmlsaXR5TmFtZSA9PSBudWxsKSB7CisJCQkJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIHRoZSBwcm9wZXJ0eSAiICsgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkKKwkJCQkJCQkJKyAiIG9uIHRoZSBlZGdlICIgKyBlZGdlKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9FTEVNRU5UKTsKKwkJCQkJfQorCisJCQkJCS8vIExpc3Q8U3RyaW5nPiBrZXlWYWx1ZVByb3BlcnRpZXNMaXN0ID0gY2FwYWJpbGl0eUluc3REYXRhCisJCQkJCS8vIC5nZXRQcm9wZXJ0aWVzKCk7CisJCQkJCS8vIE1hcDxTdHJpbmcsIFN0cmluZz4gYWN0dWFsVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLAorCQkJCQkvLyBTdHJpbmc+KCk7CisJCQkJCS8vIGZpbGxNYXBGcm9tS2V5VmFsdWVMaXN0KGtleVZhbHVlUHJvcGVydGllc0xpc3QsCisJCQkJCS8vIGFjdHVhbFZhbHVlcyk7CisJCQkJCUNhcGFiaWx0eUluc3RhbmNlIGNhcGFiaWx0eUluc3RhbmNlID0gbmV3IENhcGFiaWx0eUluc3RhbmNlKCk7CisJCQkJCWNhcGFiaWx0eUluc3RhbmNlLnNldFVuaXF1ZUlkKGNhcGFiaWxpdHlJbnN0RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJLy8gY2FwYWJpbHR5SW5zdGFuY2Uuc2V0UHJvcGVydGllcyhhY3R1YWxWYWx1ZXMpOworCQkJCQlyZXF1aXJlbWVudFByb3BlcnRpZXMucHV0KGNhcGFiaWxpdHlOYW1lLCBjYXBhYmlsdHlJbnN0YW5jZSk7CisKKwkJCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcm9wZXJ0eVZhbHVlTm9kZXNSZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eUluc3QpLAorCQkJCQkJCQkJY2FwYWJpbGl0eUluc3REYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9WQUxVRSwKKwkJCQkJCQkJCU5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlLCBQcm9wZXJ0eVZhbHVlRGF0YS5jbGFzcyk7CisKKwkJCQkJaWYgKHByb3BlcnR5VmFsdWVOb2Rlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHByb3BlcnR5VmFsdWVOb2Rlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgdGhlIHByb3BlcnR5IHZhbHVlcyBvZiBjYXBhYmlsaXR5IGluc3RhbmNlICIgKyBjYXBhYmlsaXR5SW5zdERhdGEKKwkJCQkJCQkJCSsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gcHJvcGVydHlWYWx1ZU5vZGVzID0gcHJvcGVydHlWYWx1ZU5vZGVzUmVzCisJCQkJCQkJCS5sZWZ0KCkudmFsdWUoKTsKKworCQkJCQkJaWYgKHByb3BlcnR5VmFsdWVOb2RlcyAhPSBudWxsKSB7CisKKwkJCQkJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFjdHVhbFZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQkJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbGxQcm9wZXJ0aWVzUmVzdWx0ID0gZmlsbFByb3BlcnRpZXNNYXBGcm9tTm9kZXMocHJvcGVydHlWYWx1ZU5vZGVzLAorCQkJCQkJCQkJYWN0dWFsVmFsdWVzKTsKKworCQkJCQkJCWlmIChmaWxsUHJvcGVydGllc1Jlc3VsdCAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBwcm9wZXJ0aWVzIG9mIGNhcGFiaWxpdHkgIiArIGNhcGFiaWxpdHlOYW1lKTsKKwkJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChmaWxsUHJvcGVydGllc1Jlc3VsdCk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKGZhbHNlID09IGFjdHVhbFZhbHVlcy5pc0VtcHR5KCkpIHsKKwkJCQkJCQkJY2FwYWJpbHR5SW5zdGFuY2Uuc2V0UHJvcGVydGllcyhhY3R1YWxWYWx1ZXMpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfQorCisJCQkJcmVxdWlyZW1lbnRJbXBsRGVmLnNldFJlcXVpcmVtZW50UHJvcGVydGllcyhyZXF1aXJlbWVudFByb3BlcnRpZXMpOworCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKGZhbHNlID09IGZvdW5kKSB7CisJCQlsb2cuZGVidWcoIkNhbm5vdCBmaW5kIHJlcXVpcmVtZW50IGltcGwgdW5kZXIgcmVzb3VyY2UgIiArIHJlc291cmNlSWQpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlcXVpcmVtZW50SW1wbERlZik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbGxNYXBGcm9tS2V5VmFsdWVMaXN0KExpc3Q8U3RyaW5nPiBrZXlWYWx1ZVByb3BlcnRpZXNMaXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFjdHVhbFZhbHVlcykgeworCisJCWlmIChrZXlWYWx1ZVByb3BlcnRpZXNMaXN0ICE9IG51bGwpIHsKKwkJCWZvciAoU3RyaW5nIGtleVZhbHVlIDoga2V5VmFsdWVQcm9wZXJ0aWVzTGlzdCkgeworCQkJCWludCBlcXVhbFNpZ25Mb2NhdGlvbiA9IGtleVZhbHVlLmluZGV4T2YoRVFVQUxfU0lHTik7CisJCQkJaWYgKGVxdWFsU2lnbkxvY2F0aW9uID4gLTEpIHsKKwkJCQkJU3RyaW5nIGtleSA9IGtleVZhbHVlLnN1YnN0cmluZygwLCBlcXVhbFNpZ25Mb2NhdGlvbik7CisJCQkJCVN0cmluZyB2YWx1ZSA9IEVNUFRZX1NUUklORzsKKwkJCQkJaWYgKGVxdWFsU2lnbkxvY2F0aW9uICsgMSA8IGtleVZhbHVlLmxlbmd0aCgpKSB7CisJCQkJCQl2YWx1ZSA9IGtleVZhbHVlLnN1YnN0cmluZyhlcXVhbFNpZ25Mb2NhdGlvbiArIDEpOworCQkJCQl9CisJCQkJCWFjdHVhbFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbGxQcm9wZXJ0aWVzTWFwRnJvbU5vZGVzKAorCQkJTGlzdDxJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+PiBwcm9wZXJ0eVZhbHVlTm9kZXMsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWN0dWFsVmFsdWVzKSB7CisJCWlmIChwcm9wZXJ0eVZhbHVlTm9kZXMgIT0gbnVsbCkgeworCQkJZm9yIChJbW11dGFibGVQYWlyPFByb3BlcnR5VmFsdWVEYXRhLCBHcmFwaEVkZ2U+IHByb3BlcnR5VmFsdWVQYWlyIDogcHJvcGVydHlWYWx1ZU5vZGVzKSB7CisJCQkJUHJvcGVydHlWYWx1ZURhdGEgcHJvcGVydHlWYWx1ZURhdGEgPSBwcm9wZXJ0eVZhbHVlUGFpci5nZXRLZXkoKTsKKwkJCQlHcmFwaEVkZ2UgcHJvcGVydHlWYWx1ZUVkZ2UgPSBwcm9wZXJ0eVZhbHVlUGFpci5nZXRWYWx1ZSgpOworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlFZGdlUHJvcHMgPSBwcm9wZXJ0eVZhbHVlRWRnZS5nZXRQcm9wZXJ0aWVzKCk7CisJCQkJaWYgKHByb3BlcnR5RWRnZVByb3BzID09IG51bGwpIHsKKwkJCQkJbG9nLmVycm9yKCJDYW5ub3QgZmluZCB0aGUgcHJvcGVydHkgIiArIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpCisJCQkJCQkJKyAiIG9uIHRoZSBlZGdlICIgKyBwcm9wZXJ0eVZhbHVlRWRnZSk7CisJCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQ7CisJCQkJfQorCQkJCVN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0eUVkZ2VQcm9wcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkpOworCQkJCWlmIChwYXJhbU5hbWUgPT0gbnVsbCkgeworCQkJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIHRoZSBwcm9wZXJ0eSAiICsgR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCkKKwkJCQkJCQkrICIgb24gdGhlIGVkZ2UgIiArIHByb3BlcnR5VmFsdWVFZGdlKTsKKwkJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLklOVkFMSURfRUxFTUVOVDsKKwkJCQl9CisJCQkJYWN0dWFsVmFsdWVzLnB1dChwYXJhbU5hbWUsIHByb3BlcnR5VmFsdWVEYXRhLmdldFZhbHVlKCkpOworCQkJfQorCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFkZENhcGFiaWxpdHlQcm9wZXJ0aWVzVG9SZXFJbXBsKFJlcXVpcmVtZW50SW1wbERhdGEgcmVxSW1wbERhdGEsIFN0cmluZyByZXFDYXBhYmlsaXR5LAorCQkJU3RyaW5nIG5vZGVJZEltcGwsIE1hcDxTdHJpbmcsIENhcGFiaWx0eUluc3RhbmNlPiBwcm9wZXJ0aWVzVmFsdWVQZXJDYXBhYmlsaXR5KSB7CisKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVzdWx0ID0gbnVsbDsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbENhcGFiaWxpdGllcyA9IGNhcGFiaWxpdHlPcGVyYXRpb24KKwkJCQkuZ2V0QWxsQ2FwYWJpbGl0aWVzUGFpcnMobm9kZUlkSW1wbCk7CisJCWxvZy50cmFjZSgiQXR0ZXIgbG9va2luZyBmb3IgdGhlIGNhcGFiaWxpdGllcyBvZiByZXNvdXJjZSAiICsgbm9kZUlkSW1wbCArICIuIHJlc3VsdCBpcyAiICsgYWxsQ2FwYWJpbGl0aWVzKTsKKwkJaWYgKGFsbENhcGFiaWxpdGllcy5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFsbENhcGFiaWxpdGllcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZpbmQgY2FwYWJpbGl0aWVzIG9mIHJlc291cmNlICIgKyBub2RlSWRJbXBsICsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCXJldHVybiBzdGF0dXM7CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwgR3JhcGhFZGdlPj4gY2FwYWJpbGl0aWVzVmFsdWUgPSBhbGxDYXBhYmlsaXRpZXMubGVmdCgpLnZhbHVlKCk7CisJCQljaGVja0ltcGxOb2RlQ29udGFpbnNSZXFDYXBhYmlsaXR5KHJlcUNhcGFiaWxpdHksIGNhcGFiaWxpdGllc1ZhbHVlKTsKKworCQkJZm9yIChJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+IGVudHJ5IDogY2FwYWJpbGl0aWVzVmFsdWUpIHsKKworCQkJCUNhcGFiaWxpdHlEYXRhIGNhcGFiaWxpdHlEYXRhID0gZW50cnkuZ2V0S2V5KCk7CisKKwkJCQlHcmFwaEVkZ2UgZ3JhcGhFZGdlID0gZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJCUVpdGhlcjxTdHJpbmcsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXBhYmlsaXR5TmFtZVJlc3VsdCA9IGZpbmRDYXBhYmlsaXR5TmFtZShjYXBhYmlsaXR5RGF0YSwKKwkJCQkJCWdyYXBoRWRnZSk7CisKKwkJCQlpZiAoY2FwYWJpbGl0eU5hbWVSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNhcGFiaWxpdHlOYW1lUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmVycm9yKAorCQkJCQkJCSJGYWlsZWQgdG8gZmluZCBjYXBhYmlsaXR5IG5hbWUgZnJvbSB0aGUgZWRnZSBhc3NvY2lhdGVkIHRvIGNhcGFiaWxpdHkgIiArIGNhcGFiaWxpdHlEYXRhKTsKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisKKwkJCQlTdHJpbmcgY2FwYWJpbGl0eU5hbWUgPSBjYXBhYmlsaXR5TmFtZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIHNldCBwcm9wZXJ0aWVzIG9mIGNhcGFiaWxpdHkgIiArIGNhcGFiaWxpdHlOYW1lKTsKKwkJCQlTdHJpbmcgY2FiaWxpdHlEYXRhVWlkID0gY2FwYWJpbGl0eURhdGEuZ2V0VW5pcXVlSWQoKTsKKworCQkJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjdERhdGFSZXN1bHQgPSBjYXBhYmlsaXR5T3BlcmF0aW9uCisJCQkJCQkuZ2V0Q2FwYWJpbGl0eVR5cGVPZkNhcGFiaWxpdHkoY2FiaWxpdHlEYXRhVWlkKTsKKworCQkJCWlmIChjdERhdGFSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgY2FwYWJpbGl0eSB0eXBlIG9mIGNhcGJpbGl0eSAiICsgY2FiaWxpdHlEYXRhVWlkICsgIi4gc3RhdHVzIGlzICIKKwkJCQkJCQkrIGN0RGF0YVJlc3VsdCk7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGN0RGF0YVJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCisJCQkJQ2FwYWJpbGl0eVR5cGVEYXRhIGNhcGFiaWxpdHlUeXBlRGF0YSA9IGN0RGF0YVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcHJvcGVydGllc1N0YXR1cyA9IGZpbmRQcm9wZXJ0aWVzT2ZDYXBhYmlsaXR5KAorCQkJCQkJY2FwYWJpbGl0eVR5cGVEYXRhKTsKKwkJCQlpZiAocHJvcGVydGllc1N0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydGllc1N0YXR1cy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHByb3BlcnRpZXMgZGVmaW5pdGlvbnMgZnJvbSBjYXBhYmlsaXR5LiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCisJCQkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gcHJvcGVydGllc1N0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKworCQkJCUNhcGFiaWx0eUluc3RhbmNlIGNhcGFiaWx0eUluc3RhbmNlID0gbnVsbDsKKwkJCQlpZiAocHJvcGVydGllc1ZhbHVlUGVyQ2FwYWJpbGl0eSAhPSBudWxsKSB7CisJCQkJCWNhcGFiaWx0eUluc3RhbmNlID0gcHJvcGVydGllc1ZhbHVlUGVyQ2FwYWJpbGl0eS5nZXQoY2FwYWJpbGl0eU5hbWUpOworCQkJCX0KKworCQkJCUVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VOb2RlID0gY3JlYXRlQ2FwYWJpbGl0eUluc3RhbmNlTm9kZSgKKwkJCQkJCWNhcGFiaWxpdHlOYW1lLCByZXFJbXBsRGF0YSk7CisJCQkJaWYgKGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgY2FwYWJpbGl0eSBpbnN0YW5jZSBub2RlICgiICsgY2FwYWJpbGl0eU5hbWUgKyAiKSBpbiBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJCQkrIHN0YXR1cyk7CisKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisJCQkJQ2FwYWJpbGl0eUluc3REYXRhIGNhcGFiaWxpdHlJbnN0RGF0YSA9IGNyZWF0ZUNhcGFiaWxpdHlJbnN0YW5jZU5vZGUubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlFaXRoZXI8TGlzdDxHcmFwaFJlbGF0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGluc3RhbmNlUHJvcGVydGllcyA9IGFkZFByb3BlcnRpZXNUb0NhcGFiaWxpdHlJbnN0YW5jZSgKKwkJCQkJCXByb3BlcnRpZXMsIGNhcGFiaWx0eUluc3RhbmNlLCBjYXBhYmlsaXR5SW5zdERhdGEpOworCisJCQkJaWYgKGluc3RhbmNlUHJvcGVydGllcy5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gaW5zdGFuY2VQcm9wZXJ0aWVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gYWRkIHByb3BlcnRpZXMgdG8gY2FwYWJpbGl0eSBpbnN0YW5jZS4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlQ2FwYWJpbGl0eUluc3RUb0NhcGFiaWxpdHlUeXBlID0gYXNzb2NpYXRlQ2FwYWJpbGl0eUluc3RUb0NhcGFiaWxpdHlUeXBlKAorCQkJCQkJY2FwYWJpbGl0eUluc3REYXRhLCBjYXBhYmlsaXR5VHlwZURhdGEpOworCQkJCWlmIChhc3NvY2lhdGVDYXBhYmlsaXR5SW5zdFRvQ2FwYWJpbGl0eVR5cGUuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGFzc29jaWF0ZUNhcGFiaWxpdHlJbnN0VG9DYXBhYmlsaXR5VHlwZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSBjYXBhYmlsaXR5IGluc3RhbmNlICIgKyBjYXBhYmlsaXR5SW5zdERhdGEKKwkJCQkJCQkrICIgdG8gY2FwYWJpbGl0eSB0eXBlIG5vZGUgIiArIGNhcGFiaWxpdHlUeXBlRGF0YSArICIgaW4gZ3JhcGguIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKworCQkJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlQ2FwYWJpbGl0eUluc3QgPSBhc3NvY2lhdGVSZXF1aXJlbWVudEltcGxUb0NhcGFiaWxpdHlJbnN0KAorCQkJCQkJcmVxSW1wbERhdGEsIGNhcGFiaWxpdHlJbnN0RGF0YSwgY2FwYWJpbGl0eU5hbWUpOworCQkJCWlmIChhc3NvY2lhdGVDYXBhYmlsaXR5SW5zdC5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gYXNzb2NpYXRlQ2FwYWJpbGl0eUluc3QucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgcmVxdWlyZW1lbnQgaW1wbCAiICsgcmVxSW1wbERhdGEgKyAiIHRvIGNhcGFiaWxpdHkgaW5zdGFuY2Ugbm9kZSAiCisJCQkJCQkJKyBjYXBhYmlsaXR5SW5zdERhdGEgKyAiIG9mIGNhcGFiaWxpdHkgIiArIGNhcGFiaWxpdHlOYW1lICsgIikgaW4gZ3JhcGguIHN0YXR1cyBpcyAiCisJCQkJCQkJKyBzdGF0dXMpOworCisJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCisJCQl9CisJCQlyZXN1bHQgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kUHJvcGVydGllc09mQ2FwYWJpbGl0eSgKKwkJCUNhcGFiaWxpdHlUeXBlRGF0YSBjYXBhYmlsaXR5VHlwZURhdGEpIHsKKwkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlVWlkID0gY2FwYWJpbGl0eVR5cGVEYXRhLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlUmVzdWx0ID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24KKwkJCQkuZ2V0Q2FwYWJpbGl0eVR5cGVCeVVpZChjYXBhYmlsaXR5VHlwZVVpZCk7CisKKwkJaWYgKGNhcGFiaWxpdHlUeXBlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBjYXBhYmlsaXR5VHlwZSAiICsgY2FwYWJpbGl0eVR5cGVVaWQgKyAiIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJKyBjYXBhYmlsaXR5VHlwZVJlc3VsdCk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNhcGFiaWxpdHlUeXBlUmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY2FwYWJpbGl0eVR5cGVEZWYgPSBjYXBhYmlsaXR5VHlwZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gY2FwYWJpbGl0eVR5cGVEZWYuZ2V0UHJvcGVydGllcygpOworCisJCXJldHVybiBFaXRoZXIubGVmdChwcm9wZXJ0aWVzKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTdHJpbmcsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kQ2FwYWJpbGl0eU5hbWUoQ2FwYWJpbGl0eURhdGEgY2FwYWJpbGl0eURhdGEsCisJCQlHcmFwaEVkZ2UgZ3JhcGhFZGdlKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gZWRnZVByb3BzID0gZ3JhcGhFZGdlLmdldFByb3BlcnRpZXMoKTsKKwkJU3RyaW5nIGNhcGFiaWxpdHlOYW1lID0gKFN0cmluZykgZWRnZVByb3BzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisKKwkJaWYgKGNhcGFiaWxpdHlOYW1lID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQ2Fubm90IGZpbmQgdGhlIG5hbWUgb2YgdGhlIGNhcGFiaWxpdHkgYXNzb2NpYXRlZCB0byBub2RlICIgKyBjYXBhYmlsaXR5RGF0YSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhcGFiaWxpdHlOYW1lKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXNzb2NpYXRlQ2FwYWJpbGl0eUluc3RUb0NhcGFiaWxpdHlUeXBlKAorCQkJQ2FwYWJpbGl0eUluc3REYXRhIGNhcGFiaWxpdHlJbnN0RGF0YSwgQ2FwYWJpbGl0eVR5cGVEYXRhIGNhcGFiaWxpdHlUeXBlRGF0YSkgeworCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY2FwYWJpbGl0eUluc3REYXRhLAorCQkJCWNhcGFiaWxpdHlUeXBlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLklOU1RBTkNFX09GLCBudWxsKTsKKworCQlyZXR1cm4gY3JlYXRlUmVsYXRpb247CisKKwl9CisKKwkvKioKKwkgKiBhZGQgcHJvcGVydHkgdmFsdWUgbm9kZSB3aXRoIGRlZmF1bHQgdmFsdWUgb2Ygb3ZlcnJpZGUgdmFsdWUgYW5kCisJICogYXNzb2NpYXRlIGl0IHRvIHRoZSBjYXBhYmlsaXR5IGluc3RhbmNlIG5vZGUKKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydGllcworCSAqICAgICAgICAgICAgLSBwcm9wZXJ0aWVzIGRlZmluaXRpb24uIG9sZCBhbHNvIGRlZmF1bHQgdmFsdWUKKwkgKiBAcGFyYW0gY2FwYWJpbGl0eUluc3RhbmNlCisJICogICAgICAgICAgICAtIGhvbGQgYWxzbyBwcm9wZXJ0aWVzIG5ldyB2YWx1ZShpZiBleGlzdHMpCisJICogQHBhcmFtIGNhcGFiaWxpdHlJbnN0RGF0YQorCSAqICAgICAgICAgICAgLSB0aGUgZ3JhcGggbm9kZSB3aGljaCB3ZSBhc3NvY2lhdGUgdGhlIHByb3BlcnRpZXMgdmFsdWUgbm9kZQorCSAqICAgICAgICAgICAgdG8uCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPExpc3Q8R3JhcGhSZWxhdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhZGRQcm9wZXJ0aWVzVG9DYXBhYmlsaXR5SW5zdGFuY2UoCisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMsIENhcGFiaWx0eUluc3RhbmNlIGNhcGFiaWxpdHlJbnN0YW5jZSwKKwkJCUNhcGFiaWxpdHlJbnN0RGF0YSBjYXBhYmlsaXR5SW5zdERhdGEpIHsKKworCQlMaXN0PEdyYXBoUmVsYXRpb24+IHJlbGF0aW9uc1Jlc3VsdCA9IG5ldyBBcnJheUxpc3Q8R3JhcGhSZWxhdGlvbj4oKTsKKworCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCisJCQkJU3RyaW5nIHBhcmFtTmFtZSA9IGVudHJ5LmdldEtleSgpOworCisJCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHNldFByb3BlcnR5VmFsdWUoY2FwYWJpbGl0eUluc3RhbmNlLCBwYXJhbU5hbWUsIHByb3BlcnR5RGVmaW5pdGlvbik7CisKKwkJCQlQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSA9IGJ1aWxkUHJvcGVydHlWYWx1ZURhdGEoY2FwYWJpbGl0eUluc3REYXRhLmdldFVuaXF1ZUlkKCksCisJCQkJCQlwYXJhbU5hbWUsIHByb3BlcnR5VmFsdWUpOworCisJCQkJbG9nLmRlYnVnKCJCZWZvcmUgY3JlYXRpbmcgcHJvcGVydHkgdmFsdWUgZGF0YSBub2RlICIgKyBwcm9wZXJ0eVZhbHVlRGF0YSArICIgaW4gZ3JhcGguIik7CisJCQkJRWl0aGVyPFByb3BlcnR5VmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkJLmNyZWF0ZU5vZGUocHJvcGVydHlWYWx1ZURhdGEsIFByb3BlcnR5VmFsdWVEYXRhLmNsYXNzKTsKKwkJCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyBwcm9wZXJ0eSB2YWx1ZSBkYXRhIG5vZGUgIiArIHByb3BlcnR5VmFsdWVEYXRhICsgIiBpbiBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJCSsgY3JlYXRlTm9kZSk7CisJCQkJaWYgKGNyZWF0ZU5vZGUuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgcHJvcGVydHkgdmFsdWUgbm9kZSBpbiBncmFwaCAiICsgcHJvcGVydHlWYWx1ZURhdGEgKyAiLiBzdGF0dXMgaXMgIgorCQkJCQkJCSsgc3RhdHVzKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKworCQkJCVByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhQ3JlYXRlZCA9IGNyZWF0ZU5vZGUubGVmdCgpLnZhbHVlKCk7CisKKwkJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gYXNzb2NpYXRlQ2FwYWJpbGl0eUluc3RUb1Byb3BlcnR5VmFsdWUoCisJCQkJCQljYXBhYmlsaXR5SW5zdERhdGEsIHBhcmFtTmFtZSwgcHJvcGVydHlWYWx1ZURhdGFDcmVhdGVkKTsKKworCQkJCWlmIChjcmVhdGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSByZWxhdGlvbiBiZXR3ZWVuIGNhcGFiaWxpdHkgaW5zdGFuY2UgIgorCQkJCQkJCSsgY2FwYWJpbGl0eUluc3REYXRhLmdldFVuaXF1ZUlkKCkgKyAiIHRvIHByb3BlcnR5IHZhbHVlICIKKwkJCQkJCQkrIHByb3BlcnR5VmFsdWVEYXRhQ3JlYXRlZC5nZXRVbmlxdWVJZCgpICsgIiBpbiBncmFwaC4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJfQorCisJCQkJcmVsYXRpb25zUmVzdWx0LmFkZChjcmVhdGVSZWxhdGlvbi5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChyZWxhdGlvbnNSZXN1bHQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVDYXBhYmlsaXR5SW5zdFRvUHJvcGVydHlWYWx1ZSgKKwkJCUNhcGFiaWxpdHlJbnN0RGF0YSBjYXBhYmlsaXR5SW5zdERhdGEsIFN0cmluZyBwYXJhbU5hbWUsIFByb3BlcnR5VmFsdWVEYXRhIHByb3BlcnR5VmFsdWVEYXRhQ3JlYXRlZCkgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gZWRnZVByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWVkZ2VQcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIHBhcmFtTmFtZSk7CisJCWxvZy5kZWJ1ZygiQmVnaW4gY3JlYXRpbmcgcmVsYXRpb24gYmV0d2VlbiBjYXBhYmlsaXR5IGluc3RhbmNlICIgKyBjYXBhYmlsaXR5SW5zdERhdGEgKyAiIHRvIHByb3BlcnR5IHZhbHVlICIKKwkJCQkrIHByb3BlcnR5VmFsdWVEYXRhQ3JlYXRlZCArICIgaW4gZ3JhcGguIik7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oY2FwYWJpbGl0eUluc3REYXRhLAorCQkJCXByb3BlcnR5VmFsdWVEYXRhQ3JlYXRlZCwgR3JhcGhFZGdlTGFiZWxzLlBST1BFUlRZX1ZBTFVFLCBlZGdlUHJvcHMpOworCQlsb2cuZGVidWcoIkFmdGVyIGNyZWF0aW5nIHJlbGF0aW9uIGJldHdlZW4gY2FwYWJpbGl0eSBpbnN0YW5jZSAiICsgY2FwYWJpbGl0eUluc3REYXRhICsgIiB0byBwcm9wZXJ0eSB2YWx1ZSAiCisJCQkJKyBwcm9wZXJ0eVZhbHVlRGF0YUNyZWF0ZWQgKyAiIGluIGdyYXBoLiBzdGF0dXMgaXMgIiArIGNyZWF0ZVJlbGF0aW9uKTsKKworCQlyZXR1cm4gY3JlYXRlUmVsYXRpb247CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgc2V0UHJvcGVydHlWYWx1ZShDYXBhYmlsdHlJbnN0YW5jZSBjYXBhYmlsaXR5SW5zdGFuY2UsIFN0cmluZyBwYXJhbU5hbWUsCisJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uKSB7CisJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gTkE7CisJCWlmIChwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKTsKKwkJfQorCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXNWYWx1ZSA9IG51bGw7CisJCWlmIChjYXBhYmlsaXR5SW5zdGFuY2UgIT0gbnVsbCkgeworCQkJcHJvcGVydGllc1ZhbHVlID0gY2FwYWJpbGl0eUluc3RhbmNlLmdldFByb3BlcnRpZXMoKTsKKwkJCWlmIChwcm9wZXJ0aWVzVmFsdWUgIT0gbnVsbCkgeworCQkJCVN0cmluZyB0bXBWYWx1ZSA9IHByb3BlcnRpZXNWYWx1ZS5nZXQocGFyYW1OYW1lKTsKKwkJCQlpZiAodG1wVmFsdWUgIT0gbnVsbCkgeworCQkJCQlwcm9wZXJ0eVZhbHVlID0gdG1wVmFsdWU7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBwcm9wZXJ0eVZhbHVlOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUHJvcGVydHlrZXlWYWx1ZShTdHJpbmcgcGFyYW1OYW1lLCBTdHJpbmcgcGFyYW1WYWx1ZSkgeworCQlyZXR1cm4gcGFyYW1OYW1lICsgRVFVQUxfU0lHTiArIHBhcmFtVmFsdWU7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlRGF0YSBidWlsZFByb3BlcnR5VmFsdWVEYXRhKFN0cmluZyBjYXBhYmlsaXR5SW5zdERhdGFVaWQsIFN0cmluZyBwYXJhbU5hbWUsCisJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSkgeworCQlQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wZXJ0eVZhbHVlRGF0YSA9IG5ldyBQcm9wZXJ0eVZhbHVlRGF0YSgpOworCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRWYWx1ZShwcm9wZXJ0eVZhbHVlKTsKKwkJU3RyaW5nIHVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFByb3BlcnR5VmFsdWVVbmlxdWVJZChjYXBhYmlsaXR5SW5zdERhdGFVaWQsIHBhcmFtTmFtZSk7CisJCXByb3BlcnR5VmFsdWVEYXRhLnNldFVuaXF1ZUlkKHVpZCk7CisJCUxvbmcgY3JlYXRpb25EYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCXByb3BlcnR5VmFsdWVEYXRhLnNldENyZWF0aW9uVGltZShjcmVhdGlvbkRhdGUpOworCQlwcm9wZXJ0eVZhbHVlRGF0YS5zZXRNb2RpZmljYXRpb25UaW1lKGNyZWF0aW9uRGF0ZSk7CisJCXJldHVybiBwcm9wZXJ0eVZhbHVlRGF0YTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVDYXBhYmlsaXR5SW5zdGFuY2VOb2RlKFN0cmluZyBjYXBhYmlsaXR5TmFtZSwKKwkJCVJlcXVpcmVtZW50SW1wbERhdGEgcmVxSW1wbERhdGEpIHsKKworCQlDYXBhYmlsaXR5SW5zdERhdGEgY2FwYWJpbGl0eUluc3REYXRhID0gbmV3IENhcGFiaWxpdHlJbnN0RGF0YSgpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRDYXBhYmlsaXR5SW5zdGFuY2VVaWQocmVxSW1wbERhdGEuZ2V0VW5pcXVlSWQoKSwgY2FwYWJpbGl0eU5hbWUpOworCisJCWNhcGFiaWxpdHlJbnN0RGF0YS5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCS8vIGNhcGFiaWxpdHlJbnN0RGF0YS5zZXRQcm9wZXJ0aWVzKGluc3RhbmNlUHJvcGVydGllcyk7CisJCUxvbmcgY3JlYXRpb25EYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWNhcGFiaWxpdHlJbnN0RGF0YS5zZXRDcmVhdGlvblRpbWUoY3JlYXRpb25EYXRlKTsKKwkJY2FwYWJpbGl0eUluc3REYXRhLnNldE1vZGlmaWNhdGlvblRpbWUoY3JlYXRpb25EYXRlKTsKKworCQlsb2cuZGVidWcoIkJlZm9yZSBjcmVhdGluZyBjYXBhYmlsaXR5IGluc3RhbmNlIG5vZGUgaW4gZ3JhcGggIiArIGNhcGFiaWxpdHlJbnN0RGF0YSk7CisJCUVpdGhlcjxDYXBhYmlsaXR5SW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoY2FwYWJpbGl0eUluc3REYXRhLAorCQkJCUNhcGFiaWxpdHlJbnN0RGF0YS5jbGFzcyk7CisJCWxvZy5kZWJ1ZygKKwkJCQkiQWZ0ZXIgY3JlYXRpbmcgY2FwYWJpbGl0eSBpbnN0YW5jZSBub2RlIGluIGdyYXBoICIgKyBjYXBhYmlsaXR5SW5zdERhdGEgKyAiLiBzdGF0dXMgaXMgIiArIGNyZWF0ZU5vZGUpOworCisJCXJldHVybiBjcmVhdGVOb2RlOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja05vZGVJZEltcGxlbWVudHNSZXF1aXJlbWVudE5vZGUoU3RyaW5nIG5vZGVJZEltcGwsIFN0cmluZyByZXFOb2RlKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0ltcGxOb2RlQ29udGFpbnNSZXFDYXBhYmlsaXR5KFN0cmluZyByZXFDYXBhYmlsaXR5LAorCQkJTGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+PiBjYXBhYmlsaXRpZXNWYWx1ZSkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbFJlcXVpcmVtZW50c09mUmVzb3VyY2VPbmx5KAorCQkJU3RyaW5nIHJlc291cmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCU1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxdWlyZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+KCk7CisJCQlTZXQ8U3RyaW5nPiBjYXNlSW5zZW5zaXRpdmVSZXFOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRBbGxSZXF1aXJlbWVudHNOb25SZWN1cnNpdmUocmVzb3VyY2VJZCwgcmVxdWlyZW1lbnRzLAorCQkJCQljYXNlSW5zZW5zaXRpdmVSZXFOYW1lcyk7CisKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBnZXQgYWxsIHJlcXVpcmVtZW50cyBvZiByZXNvdXJjZSAiICsgcmVzb3VyY2VJZCArICIuIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQl9IGVsc2UgeworCQkJCS8vIFRPRE8gaGFuZGxlIHJlcXVpcmVtZW50SW1wbAorCQkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KGNvbnZlcnRSZXF1aXJlbWVudE1hcChyZXF1aXJlbWVudHMsIG51bGwsIG51bGwpKTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlUmVxdWlyZW1lbnRzKFN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCU1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxdWlyZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+KCk7CisJCVNldDxTdHJpbmc+IGNhc2VJbnNlbnNpdGl2ZVJlcU5hbWVzID0gbmV3IEhhc2hTZXQ8PigpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRBbGxSZXF1aXJlbWVudHNSZWN1cnNpdmVseShyZXNvdXJjZUlkLCByZXF1aXJlbWVudHMsIGNhc2VJbnNlbnNpdGl2ZVJlcU5hbWVzKTsKKwkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGFsbCByZXF1aXJlbWVudHMgb2YgcmVzb3VyY2UgIiArIHJlc291cmNlSWQgKyAiLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoIlRoZSByZXF1aXJlbWVudHMgcmV0dXJuZWQgZm9yIHJlc291cmNlIHt9IGFyZSB7fSIsIHJlc291cmNlSWQsIHJlcXVpcmVtZW50cyk7CisKKwkJCWlmIChyZXF1aXJlbWVudHMgIT0gbnVsbCkgeworCQkJCWZvciAoRW50cnk8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+IGVudHJ5IDogcmVxdWlyZW1lbnRzLmVudHJ5U2V0KCkpIHsKKwkJCQkJU3RyaW5nIHJlcU5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQkJRWl0aGVyPFJlcXVpcmVtZW50SW1wbERlZiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcUltcGxSZXMgPSB0aGlzCisJCQkJCQkJLmdldFJlcXVpcmVtZW50SW1wbE9mUmVzb3VyY2UocmVxTmFtZSwgcmVzb3VyY2VJZCk7CisJCQkJCWlmIChyZXFJbXBsUmVzLmlzUmlnaHQoKSkgeworCisJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyByZXFJbXBsUmVzU3RhdHVzID0gcmVxSW1wbFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlpZiAocmVxSW1wbFJlc1N0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJCQlsb2cuZGVidWcoIkNhbm5vdCBmaW5kIGltcGxlbWVudGF0aW9uIG9mIHJlcXVpcmVtZW50IHt9IHVuZGVyIHJlc291cmNlIHt9IiwgcmVxTmFtZSwKKwkJCQkJCQkJCXJlc291cmNlSWQpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIGltcGxlbWVudGF0aW9uIG9mIHJlcXVpcmVtZW50IHt9IHVuZGVyIHJlc291cmNlIHt9IiwgcmVxTmFtZSwKKwkJCQkJCQkJCXJlc291cmNlSWQpOworCQkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVxSW1wbFJlc1N0YXR1cyk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxdWlyZW1lbnREZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJCS8vIFJlcXVpcmVtZW50SW1wbERlZiByZXF1aXJlbWVudEltcGxEZWYgPQorCQkJCQkJLy8gcmVxSW1wbFJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJCS8vIHJlcXVpcmVtZW50RGVmaW5pdGlvbi5zZXRSZXF1aXJlbWVudEltcGwocmVxdWlyZW1lbnRJbXBsRGVmKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWxvZy5kZWJ1ZygiVGhlIHJlcXVpcmVtZW50cyByZXR1cm5lZCBmb3IgcmVzb3VyY2Uge30gYWZ0ZXIgZmV0Y2hpbmcgcmVxdWlyZW1lbnQgaW1wbCBhcmUge30iLCByZXNvdXJjZUlkLAorCQkJCQlyZXF1aXJlbWVudHMpOworCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChyZXF1aXJlbWVudHMpOworCisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbFJlc291cmNlUmVxdWlyZW1lbnRzKAorCQkJU3RyaW5nIHJlc291cmNlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW50ZXJuYWxSZXN1bHQgPSBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cygKKwkJCQkJcmVzb3VyY2VJZCk7CisJCQlpZiAoaW50ZXJuYWxSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gaW50ZXJuYWxSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHJlcXVpcmVtZW50cyBvZiByZXNvdXJjZSB7fSAuIHN0YXR1cyBpcyB7fSIsIHJlc291cmNlSWQsIHN0YXR1cyk7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCU1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gdmFsdWUgPSBpbnRlcm5hbFJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodmFsdWUpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQkJLy8gTWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1aXJlbWVudHMgPSBuZXcKKwkJCS8vIEhhc2hNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+KCk7CisJCQkvLyBUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kQWxsUmVxdWlyZW1lbnRzUmVjdXJzaXZlbHkoCisJCQkvLyByZXNvdXJjZUlkLCByZXF1aXJlbWVudHMpOworCQkJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJLy8gbG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGFsbCByZXF1aXJlbWVudHMgb2YgcmVzb3VyY2UgIgorCQkJLy8gKyByZXNvdXJjZUlkICsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChUaXRhblN0YXR1c0NvbnZlcnRlcgorCQkJLy8gLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCS8vIH0gZWxzZSB7CisJCQkvLyBsb2cuZGVidWcoIlRoZSByZXF1aXJlbWVudHMgcmV0dXJuZWQgZm9yIHJlc291cmNlICIKKwkJCS8vICsgcmVzb3VyY2VJZCArICIgYXJlICIgKyByZXF1aXJlbWVudHMpOworCQkJLy8KKwkJCS8vIGlmIChyZXF1aXJlbWVudHMgIT0gbnVsbCkgeworCQkJLy8gZm9yIChFbnRyeTxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gZW50cnkgOiByZXF1aXJlbWVudHMKKwkJCS8vIC5lbnRyeVNldCgpKSB7CisJCQkvLyBTdHJpbmcgcmVxTmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJLy8gRWl0aGVyPFJlcXVpcmVtZW50SW1wbERlZiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcUltcGxSZXMgPQorCQkJLy8gdGhpcworCQkJLy8gLmdldFJlcXVpcmVtZW50SW1wbE9mUmVzb3VyY2UocmVxTmFtZSwKKwkJCS8vIHJlc291cmNlSWQpOworCQkJLy8gaWYgKHJlcUltcGxSZXMuaXNSaWdodCgpKSB7CisJCQkvLworCQkJLy8gVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVxSW1wbFJlc1N0YXR1cyA9IHJlcUltcGxSZXMKKwkJCS8vIC5yaWdodCgpLnZhbHVlKCk7CisJCQkvLyBpZiAocmVxSW1wbFJlc1N0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCS8vIGxvZy53YXJuKCJDYW5ub3QgZmluZCBpbXBsZW1lbnRhdGlvbiBvZiByZXF1aXJlbWVudCAiCisJCQkvLyArIHJlcU5hbWUKKwkJCS8vICsgIiB1bmRlciByZXNvdXJjZSAiCisJCQkvLyArIHJlc291cmNlSWQpOworCQkJLy8gfSBlbHNlIHsKKwkJCS8vIGxvZy5lcnJvcigiQ2Fubm90IGZpbmQgaW1wbGVtZW50YXRpb24gb2YgcmVxdWlyZW1lbnQgIgorCQkJLy8gKyByZXFOYW1lCisJCQkvLyArICIgdW5kZXIgcmVzb3VyY2UgIgorCQkJLy8gKyByZXNvdXJjZUlkKTsKKwkJCS8vIHJldHVybiBFaXRoZXIKKwkJCS8vIC5yaWdodChUaXRhblN0YXR1c0NvbnZlcnRlcgorCQkJLy8gLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZXFJbXBsUmVzU3RhdHVzKSk7CisJCQkvLyB9CisJCQkvLyB9IGVsc2UgeworCQkJLy8gUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmaW5pdGlvbiA9IGVudHJ5CisJCQkvLyAuZ2V0VmFsdWUoKTsKKwkJCS8vIFJlcXVpcmVtZW50SW1wbERlZiByZXF1aXJlbWVudEltcGxEZWYgPSByZXFJbXBsUmVzCisJCQkvLyAubGVmdCgpLnZhbHVlKCk7CisJCQkvLyByZXF1aXJlbWVudERlZmluaXRpb24KKwkJCS8vIC5zZXRSZXF1aXJlbWVudEltcGwocmVxdWlyZW1lbnRJbXBsRGVmKTsKKwkJCS8vIH0KKwkJCS8vIH0KKwkJCS8vIH0KKwkJCS8vIGxvZy5kZWJ1ZygiVGhlIHJlcXVpcmVtZW50cyByZXR1cm5lZCBmb3IgcmVzb3VyY2UgIgorCQkJLy8gKyByZXNvdXJjZUlkICsgIiBhZnRlciBmZXRjaGluZyByZXF1aXJlbWVudCBpbXBsIGFyZSAiCisJCQkvLyArIHJlcXVpcmVtZW50cyk7CisJCQkvLworCQkJLy8gcmVzdWx0ID0gRWl0aGVyLmxlZnQocmVxdWlyZW1lbnRzKTsKKwkJCS8vCisJCQkvLyByZXR1cm4gcmVzdWx0OworCQkJLy8gfQorCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxSZXNvdXJjZVJlcXVpcmVtZW50cygKKwkJCVN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJcmV0dXJuIGdldEFsbFJlc291cmNlUmVxdWlyZW1lbnRzKHJlc291cmNlSWQsIGZhbHNlKTsKKworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsUmVxdWlyZW1lbnRzUmVjdXJzaXZlbHkoU3RyaW5nIHJlc291cmNlSWQsCisJCQlNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcXVpcmVtZW50cywgU2V0PFN0cmluZz4gY2FzZUluc2Vuc2l0aXZlUmVxTmFtZXMpIHsKKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBub25SZWN1cnNpdmVSZXN1bHQgPSBmaW5kQWxsUmVxdWlyZW1lbnRzTm9uUmVjdXJzaXZlKHJlc291cmNlSWQsIHJlcXVpcmVtZW50cywKKwkJCQljYXNlSW5zZW5zaXRpdmVSZXFOYW1lcyk7CisJCWlmICghbm9uUmVjdXJzaXZlUmVzdWx0LmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykKKwkJCQkmJiAhbm9uUmVjdXJzaXZlUmVzdWx0LmVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpKSB7CisJCQlyZXR1cm4gbm9uUmVjdXJzaXZlUmVzdWx0OworCQl9CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKHBhcmVudE5vZGVzLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcGFyZW50Tm9kZXNTdGF0dXMgPSBwYXJlbnROb2Rlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAocGFyZW50Tm9kZXNTdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJGaW5pc2ggdG8gbG9va3VwIGZvciBwYXJuZXQgcmVxdWlyZW1lbnRzIik7CisJCQkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIHBhcmVudCByZXF1aXJlbWVudHMgb2YgcmVzb3VyY2Uge30gLiBzdGF0dXMgaXMge30iLCByZXNvdXJjZUlkLAorCQkJCQkJcGFyZW50Tm9kZXNTdGF0dXMpOworCQkJCXJldHVybiBwYXJlbnROb2Rlc1N0YXR1czsKKwkJCX0KKwkJfQorCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHBhcm5ldE5vZGVQYWlyID0gcGFyZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyBwYXJlbnRVbmlxdWVJZCA9IHBhcm5ldE5vZGVQYWlyLmdldEtleSgpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhZGRQYXJlbnRSZXFTdGF0dXMgPSBmaW5kQWxsUmVxdWlyZW1lbnRzUmVjdXJzaXZlbHkocGFyZW50VW5pcXVlSWQsIHJlcXVpcmVtZW50cywKKwkJCQljYXNlSW5zZW5zaXRpdmVSZXFOYW1lcyk7CisKKwkJaWYgKGFkZFBhcmVudFJlcVN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWxsIHJlcXVpcmVtZW50cyBvZiByZXNvdXJjZSB7fSIsIHBhcmVudFVuaXF1ZUlkKTsKKwkJCXJldHVybiBhZGRQYXJlbnRSZXFTdGF0dXM7CisJCX0KKworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsUmVxdWlyZW1lbnRzTm9uUmVjdXJzaXZlKFN0cmluZyByZXNvdXJjZUlkLAorCQkJTWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPiByZXF1aXJlbWVudHMsIFNldDxTdHJpbmc+IGNhc2VJbnNlbnNpdGl2ZVJlcU5hbWVzKSB7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UmVxdWlyZW1lbnREYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcXVpcmVtZW50Tm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLAorCQkJCQkJR3JhcGhFZGdlTGFiZWxzLlJFUVVJUkVNRU5ULCBOb2RlVHlwZUVudW0uUmVxdWlyZW1lbnQsIFJlcXVpcmVtZW50RGF0YS5jbGFzcyk7CisKKwkJaWYgKHJlcXVpcmVtZW50Tm9kZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXF1aXJlbWVudE5vZGVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxpc3Q8SW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZT4+IHJlcXVpcmVtZW50TGlzdCA9IHJlcXVpcmVtZW50Tm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAocmVxdWlyZW1lbnRMaXN0ICE9IG51bGwpIHsKKwkJCQlmb3IgKEltbXV0YWJsZVBhaXI8UmVxdWlyZW1lbnREYXRhLCBHcmFwaEVkZ2U+IHJlcXVpcmVtZW50UGFpciA6IHJlcXVpcmVtZW50TGlzdCkgeworCQkJCQlTdHJpbmcgcmVxVW5pcXVlSWQgPSByZXF1aXJlbWVudFBhaXIuZ2V0S2V5KCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlZGdlUHJvcHMgPSByZXF1aXJlbWVudFBhaXIuZ2V0VmFsdWUoKS5nZXRQcm9wZXJ0aWVzKCk7CisJCQkJCVN0cmluZyByZXFOYW1lID0gbnVsbDsKKwkJCQkJaWYgKGVkZ2VQcm9wcyAhPSBudWxsKSB7CisJCQkJCQlyZXFOYW1lID0gKFN0cmluZykgZWRnZVByb3BzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSk7CisJCQkJCQlpZiAocmVxTmFtZSA9PSBudWxsKSB7CisJCQkJCQkJbG9nLmVycm9yKCJUaGUgcmVxdWlyZW1lbnQgbmFtZSBpcyBtaXNzaW5nIG9uIHRoZSBlZGdlIG9mIHJlcXVpcmVtZW50ICAiICsgcmVxVW5pcXVlSWQpOworCQkJCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0VMRU1FTlQ7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsb2cuZXJyb3IoIlRoZSByZXF1aXJlbWVudCBuYW1lIGlzIG1pc3Npbmcgb24gdGhlIGVkZ2Ugb2YgcmVxdWlyZW1lbnQgICIgKyByZXFVbmlxdWVJZCk7CisJCQkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9FTEVNRU5UOworCQkJCQl9CisJCQkJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXF1aXJlbWVudERlZlJlcyA9IHRoaXMKKwkJCQkJCQkuZ2V0UmVxdWlyZW1lbnQocmVxVW5pcXVlSWQpOworCQkJCQlpZiAocmVxdWlyZW1lbnREZWZSZXMuaXNSaWdodCgpKSB7CisJCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXF1aXJlbWVudERlZlJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBnZXQgcmVxdWlyZW1lbnQgcHJvcGVydGllcyBvZiByZXF1aXJlbWVudCAiICsgcmVxVW5pcXVlSWQpOworCQkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQkJfQorCisJCQkJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXF1aXJlbWVudERlZmluaXRpb24gPSByZXF1aXJlbWVudERlZlJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJcmVxdWlyZW1lbnREZWZpbml0aW9uLnNldE5hbWUocmVxTmFtZSk7CisJCQkJCS8vIFVTNjMxNDYyCisJCQkJCWlmIChjYXNlSW5zZW5zaXRpdmVSZXFOYW1lcy5jb250YWlucyhyZXFOYW1lLnRvTG93ZXJDYXNlKCkpKSB7CisJCQkJCQlsb2cuZGVidWcoCisJCQkJCQkJCSJUaGUgcmVxdWlyZW1lbnQge30gd2FzIGFscmVhZHkgZGVmaW5lZCBpbiBkZXJpdmVkIHJlc291cmNlIChjYXNlIGluc2Vuc2l0aXZlKS4gSWdub3JlIHt9IGZyb20gcmVzb3VyY2Uge30iLAorCQkJCQkJCQlyZXFOYW1lLCByZXFOYW1lLCByZXNvdXJjZUlkKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlcXVpcmVtZW50cy5wdXQocmVxTmFtZSwgcmVxdWlyZW1lbnREZWZpbml0aW9uKTsKKwkJCQkJCWNhc2VJbnNlbnNpdGl2ZVJlcU5hbWVzLmFkZChyZXFOYW1lLnRvTG93ZXJDYXNlKCkpOworCQkJCQl9CisKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZVJlcXVpcmVtZW50RnJvbUdyYXBoKFN0cmluZyByZXF1aXJlbWVudElkKSB7CisJCWxvZy5kZWJ1ZygiQmVmb3JlIGRlbGV0aW5nIHJlcXVpcmVtZW50IGZyb20gZ3JhcGggIiArIHJlcXVpcmVtZW50SWQpOworCQlFaXRoZXI8UmVxdWlyZW1lbnREYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTm9kZVN0YXR1cyA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudCksIHJlcXVpcmVtZW50SWQsIFJlcXVpcmVtZW50RGF0YS5jbGFzcyk7CisJCWlmIChkZWxldGVOb2RlU3RhdHVzLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZGVsZXRlIHJlcXVpcmVtZW50IHdpdGggaWQge30uIHN0YXR1cz17fSIsIHJlcXVpcmVtZW50SWQsCisJCQkJCWRlbGV0ZU5vZGVTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGRlbGV0ZU5vZGVTdGF0dXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFJlcXVpcmVtZW50cyhTdHJpbmcgcmVzb3VyY2VJZCkgeworCisJCXJldHVybiBnZXRBbGxSZXNvdXJjZVJlcXVpcmVtZW50cyhyZXNvdXJjZUlkLCBmYWxzZSk7CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFJlcXVpcmVtZW50cyhTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFJlcyA9IGRlbGV0ZUFsbFJlcXVpcmVtZW50c09mUmVzb3VyY2UoCisJCQkJCXJlc291cmNlSWQpOworCQkJaWYgKGRlbGV0ZUFsbFJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVBbGxSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSByZXF1aXJlbWVudHMgb2YgcmVzb3VyY2UgIiArIHJlc291cmNlSWQgKyAiLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQkJfQorCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCU1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gdmFsdWUgPSBkZWxldGVBbGxSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdCh2YWx1ZSk7CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxSZXF1aXJlbWVudHNPZlJlc291cmNlKAorCQkJU3RyaW5nIHJlc291cmNlSWQpIHsKKworCQlNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPigpOworCQlTZXQ8U3RyaW5nPiBjYXNlSW5zZW5zaXRpdmVSZXFOYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgcmVxdWlyZW1lbnRzUmVzID0gZmluZEFsbFJlcXVpcmVtZW50c05vblJlY3Vyc2l2ZShyZXNvdXJjZUlkLCByZXF1aXJlbWVudHMsCisJCQkJY2FzZUluc2Vuc2l0aXZlUmVxTmFtZXMpOworCQlpZiAocmVxdWlyZW1lbnRzUmVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlcXVpcmVtZW50c1Jlcyk7CisJCX0KKworCQlpZiAocmVxdWlyZW1lbnRzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisKKwkJZm9yIChFbnRyeTxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gZW50cnkgOiByZXF1aXJlbWVudHMuZW50cnlTZXQoKSkgeworCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcXVpcmVtZW50RGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCVN0cmluZyByZXF1aXJlbWVudFVpZCA9IHJlcXVpcmVtZW50RGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpOworCisJCQlFaXRoZXI8UmVxdWlyZW1lbnREYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTm9kZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKAorCQkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVxdWlyZW1lbnQpLCByZXF1aXJlbWVudFVpZCwgUmVxdWlyZW1lbnREYXRhLmNsYXNzKTsKKwkJCWlmIChkZWxldGVOb2RlUmVzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRlbGV0ZU5vZGVSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSByZXF1aXJlbWVudCAiICsgcmVxdWlyZW1lbnRVaWQgKyAiIG9mIHJlc291cmNlICIgKyByZXNvdXJjZUlkKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVxdWlyZW1lbnRzKTsKKworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IGNvbnZlcnRSZXF1aXJlbWVudE1hcCgKKwkJCU1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxdWlyZW1lbnRNYXAsIFN0cmluZyBvd25lcklkLCBTdHJpbmcgb3duZXJOYW1lKSB7CisKKwkJTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiB0eXBlVG9SZXF1aXJlbWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PigpOworCQlyZXF1aXJlbWVudE1hcC5mb3JFYWNoKChyZXFOYW1lLCByZXF1aXJlbWVudCkgLT4geworCQkJLy8gcmVxdWlyZW1lbnQuc2V0T3duZXJJZChvd25lcklkKTsKKwkJCS8vIHJlcXVpcmVtZW50LnNldE93bmVyTmFtZShvd25lck5hbWUpOworCQkJaWYgKHR5cGVUb1JlcXVpcmVtZW50TWFwLmNvbnRhaW5zS2V5KHJlcXVpcmVtZW50LmdldENhcGFiaWxpdHkoKSkpIHsKKwkJCQl0eXBlVG9SZXF1aXJlbWVudE1hcC5nZXQocmVxdWlyZW1lbnQuZ2V0Q2FwYWJpbGl0eSgpKS5hZGQocmVxdWlyZW1lbnQpOworCQkJfSBlbHNlIHsKKwkJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPigpOworCQkJCWxpc3QuYWRkKHJlcXVpcmVtZW50KTsKKwkJCQl0eXBlVG9SZXF1aXJlbWVudE1hcC5wdXQocmVxdWlyZW1lbnQuZ2V0Q2FwYWJpbGl0eSgpLCBsaXN0KTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiB0eXBlVG9SZXF1aXJlbWVudE1hcDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUmVzb3VyY2VPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUmVzb3VyY2VPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM2OTNkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9SZXNvdXJjZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzA4OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5hcGkuQWN0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoTm9kZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuUmVsYXRpb25FbmRQb2ludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLlJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLkZpbHRlcktleUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5BdHRyaWJ1dGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZVByb3BlcnR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudFBhcmFtZXRlcnNWaWV3OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Hcm91cERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW5wdXREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkludGVyZmFjZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlTWV0YWRhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhY2hlLkNvbXBvbmVudENhY2hlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5TdWJDYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQXJ0aWZhY3RPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUF0dHJpYnV0ZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JRWxlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLnV0aWxzLkdyYXBoRGVsZXRlVXRpbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVGFnRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTURDOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0Bvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50KCJyZXNvdXJjZS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIFJlc291cmNlT3BlcmF0aW9uIGV4dGVuZHMgQ29tcG9uZW50T3BlcmF0aW9uIGltcGxlbWVudHMgSVJlc291cmNlT3BlcmF0aW9uIHsKKworCXB1YmxpYyBSZXNvdXJjZU9wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzb3VyY2VPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJQXR0cmlidXRlT3BlcmF0aW9uIGF0dHJpYnV0ZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBSZXF1aXJlbWVudE9wZXJhdGlvbiByZXF1aXJlbWVudE9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlCisJcHJpdmF0ZSBJRWxlbWVudE9wZXJhdGlvbiBlbGVtZW50T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24gYWRkaW9BZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgR3JvdXBPcGVyYXRpb24gZ3JvdXBPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ29tcG9uZW50Q2FjaGUgY29tcG9uZW50Q2FjaGU7CisKKwlwcml2YXRlIEdzb24gcHJldHR5SnNvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisKKwlwcml2YXRlIEdyYXBoRGVsZXRlVXRpbCBncmFwaERlbGV0ZVV0aWwgPSBuZXcgR3JhcGhEZWxldGVVdGlsKCk7CisKKwlwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHV1aWROZXdWZXJzaW9uID0gUGF0dGVybi5jb21waWxlKCJeXFxkezEsfS4xIik7CisJcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiB1dWlkTm9ybWF0aXZlTmV3VmVyc2lvbiA9IFBhdHRlcm4uY29tcGlsZSgiXlxcZHsxLH0uMCIpOworCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHJlc291cmNlLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJZ2VuZXJhdGVVVUlEKHJlc291cmNlKTsKKworCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gZ2V0UmVzb3VyY2VNZXRhRGF0YUZyb21SZXNvdXJjZShyZXNvdXJjZSk7CisJCQlTdHJpbmcgcmVzb3VyY2VVbmlxdWVJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCQlpZiAocmVzb3VyY2VVbmlxdWVJZCA9PSBudWxsKSB7CisJCQkJcmVzb3VyY2VVbmlxdWVJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlVW5pcXVlSWQoKTsKKwkJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHJlc291cmNlVW5pcXVlSWQpOworCQkJfQorCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKworCQkJU3RyaW5nIHVzZXJJZCA9IHJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKTsKKworCQkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFVzZXIgPSBmaW5kVXNlclZlcnRleCh1c2VySWQpOworCisJCQlpZiAoZmluZFVzZXIuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFVzZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgdXNlciAiICsgdXNlcklkICsgIiBpbiB0aGUgZ3JhcGguIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCQlyZXR1cm4gc2VuZEVycm9yKHN0YXR1cywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCk7CisJCQl9CisKKwkJCVRpdGFuVmVydGV4IGNyZWF0b3JWZXJ0ZXggPSBmaW5kVXNlci5sZWZ0KCkudmFsdWUoKTsKKwkJCVRpdGFuVmVydGV4IHVwZGF0ZXJWZXJ0ZXggPSBjcmVhdG9yVmVydGV4OworCisJCQlTdHJpbmcgdXBkYXRlclVzZXJJZCA9IHJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCk7CisJCQlpZiAodXBkYXRlclVzZXJJZCAhPSBudWxsICYmICF1cGRhdGVyVXNlcklkLmVxdWFscyh1c2VySWQpKSB7CisJCQkJZmluZFVzZXIgPSBmaW5kVXNlclZlcnRleCh1cGRhdGVyVXNlcklkKTsKKwkJCQlpZiAoZmluZFVzZXIuaXNSaWdodCgpKSB7CisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZpbmRVc2VyLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQkJbG9nLmVycm9yKCJDYW5ub3QgZmluZCB1c2VyICIgKyB1c2VySWQgKyAiIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCQlyZXR1cm4gc2VuZEVycm9yKHN0YXR1cywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdXBkYXRlclZlcnRleCA9IGZpbmRVc2VyLmxlZnQoKS52YWx1ZSgpOworCQkJCX0KKwkJCX0KKworCQkJLy8gZ2V0IGRlcml2ZWQgZnJvbSByZXNvdXJjZXMKKwkJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGRlcml2ZWRSZXNvdXJjZXMgPSBudWxsOworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZXJpdmVkUmVzb3VyY2VzUmVzdWx0ID0gZmluZERlcml2ZWRSZXNvdXJjZXMocmVzb3VyY2UpOworCQkJaWYgKGRlcml2ZWRSZXNvdXJjZXNSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGRlcml2ZWRSZXNvdXJjZXNSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfSBlbHNlIHsKKwkJCQlkZXJpdmVkUmVzb3VyY2VzID0gZGVyaXZlZFJlc291cmNlc1Jlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCX0KKworCQkJTGlzdDxTdHJpbmc+IHRhZ3MgPSByZXNvdXJjZS5nZXRUYWdzKCk7CisJCQlpZiAodGFncyAhPSBudWxsICYmIGZhbHNlID09IHRhZ3MuaXNFbXB0eSgpKSB7CisJCQkJRWl0aGVyPExpc3Q8VGFnRGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHRhZ3NSZXN1bHQgPSBjcmVhdGVOZXdUYWdzTGlzdCh0YWdzKTsKKwkJCQlpZiAodGFnc1Jlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHRhZ3NSZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQkJTGlzdDxUYWdEYXRhPiB0YWdzVG9DcmVhdGUgPSB0YWdzUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlVGFnTm9kZXNPbkdyYXBoKHRhZ3NUb0NyZWF0ZSk7CisJCQkJaWYgKCFzdGF0dXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKworCQkJRWl0aGVyPFRpdGFuVmVydGV4LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlZFZlcnRleCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHJlc291cmNlRGF0YSk7CisJCQlpZiAoY3JlYXRlZFZlcnRleC5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBjcmVhdGVkVmVydGV4LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZXJyb3IoIkVycm9yIHJldHVybmVkIGFmdGVyIGNyZWF0aW5nIHJlc291cmNlIGRhdGEgbm9kZSB7fS4gc3RhdHVzIHJldHVybmVkIGlzICIsIHJlc291cmNlRGF0YSwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXggPSBjcmVhdGVkVmVydGV4LmxlZnQoKS52YWx1ZSgpOworCisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVNZXRhZGF0YSA9IGFzc29jaWF0ZU1ldGFkYXRhVG9SZXNvdXJjZShyZXNvdXJjZURhdGEsIGNyZWF0b3JWZXJ0ZXgsIHVwZGF0ZXJWZXJ0ZXgsIGRlcml2ZWRSZXNvdXJjZXMsIG1ldGFkYXRhVmVydGV4KTsKKwkJCWlmIChhc3NvY2lhdGVNZXRhZGF0YSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFzc29jaWF0ZU1ldGFkYXRhKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQ2F0ZWdvcnkgPSBhc3Nvc2lhdGVNZXRhZGF0YVRvQ2F0ZWdvcnkocmVzb3VyY2UsIHJlc291cmNlRGF0YSk7CisJCQlpZiAoYXNzb2NpYXRlQ2F0ZWdvcnkgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChhc3NvY2lhdGVDYXRlZ29yeSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlUHJvcGVydGllcyA9IGFzc29jaWF0ZVByb3BlcnRpZXNUb1Jlc291cmNlKG1ldGFkYXRhVmVydGV4LCByZXNvdXJjZVVuaXF1ZUlkLCByZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkpOworCQkJaWYgKGFzc29jaWF0ZVByb3BlcnRpZXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVQcm9wZXJ0aWVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQXR0cmlidXRlcyA9IGFzc29jaWF0ZUF0dHJpYnV0ZXNUb1Jlc291cmNlKG1ldGFkYXRhVmVydGV4LCByZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCksIHJlc291cmNlVW5pcXVlSWQpOworCQkJaWYgKGFzc29jaWF0ZUF0dHJpYnV0ZXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVBdHRyaWJ1dGVzKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlSW5wdXRzID0gYXNzb2NpYXRlSW5wdXRzVG9Db21wb25lbnQobWV0YWRhdGFWZXJ0ZXgsIHJlc291cmNlVW5pcXVlSWQsIHJlc291cmNlLmdldElucHV0cygpKTsKKwkJCWlmIChhc3NvY2lhdGVJbnB1dHMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVJbnB1dHMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZVJlcXVpcmVtZW50cyA9IGFzc29jaWF0ZVJlcXVpcmVtZW50c1RvUmVzb3VyY2UobWV0YWRhdGFWZXJ0ZXgsIHJlc291cmNlVW5pcXVlSWQsIHJlc291cmNlLmdldFJlcXVpcmVtZW50cygpKTsKKwkJCWlmIChhc3NvY2lhdGVSZXF1aXJlbWVudHMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChhc3NvY2lhdGVSZXF1aXJlbWVudHMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQ2FwYWJpbGl0aWVzID0gYXNzb2NpYXRlQ2FwYWJpbGl0aWVzVG9SZXNvdXJjZShtZXRhZGF0YVZlcnRleCwgcmVzb3VyY2VVbmlxdWVJZCwgcmVzb3VyY2UuZ2V0Q2FwYWJpbGl0aWVzKCkpOworCQkJaWYgKGFzc29jaWF0ZUNhcGFiaWxpdGllcyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFzc29jaWF0ZUNhcGFiaWxpdGllcyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVJbnRlcmZhY2VzID0gYXNzb2NpYXRlSW50ZXJmYWNlc1RvUmVzb3VyY2UocmVzb3VyY2VEYXRhLCByZXNvdXJjZS5nZXRJbnRlcmZhY2VzKCksIG1ldGFkYXRhVmVydGV4KTsKKwkJCWlmIChhc3NvY2lhdGVJbnRlcmZhY2VzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoYXNzb2NpYXRlSW50ZXJmYWNlcyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiByZXNvdXJjZUFydGlmYWN0cyA9IHJlc291cmNlLmdldEFydGlmYWN0cygpOworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBkZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiB0b3NjYUFydGlmYWN0cyA9IHJlc291cmNlLmdldFRvc2NhQXJ0aWZhY3RzKCk7CisJCQlpZiAocmVzb3VyY2VBcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJCWlmIChkZXBsb3ltZW50QXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCQkJcmVzb3VyY2VBcnRpZmFjdHMucHV0QWxsKGRlcGxveW1lbnRBcnRpZmFjdHMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmVzb3VyY2VBcnRpZmFjdHMgPSBkZXBsb3ltZW50QXJ0aWZhY3RzOworCQkJfQorCQkJaWYgKHRvc2NhQXJ0aWZhY3RzICE9IG51bGwpIHsKKwkJCQlpZiAocmVzb3VyY2VBcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJCQlyZXNvdXJjZUFydGlmYWN0cy5wdXRBbGwodG9zY2FBcnRpZmFjdHMpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc291cmNlQXJ0aWZhY3RzID0gdG9zY2FBcnRpZmFjdHM7CisJCQkJfQorCQkJfQorCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUFydGlmYWN0cyA9IGFzc29jaWF0ZUFydGlmYWN0c1RvUmVzb3VyY2UobWV0YWRhdGFWZXJ0ZXgsIHJlc291cmNlVW5pcXVlSWQsIHJlc291cmNlQXJ0aWZhY3RzKTsKKwkJCWlmIChhc3NvY2lhdGVBcnRpZmFjdHMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChhc3NvY2lhdGVBcnRpZmFjdHMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUxpc3Q8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbj4gYWRkaXRpb25hbEluZm9ybWF0aW9uID0gcmVzb3VyY2UuZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCk7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IGFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvblRvUmVzb3VyY2UobWV0YWRhdGFWZXJ0ZXgsIHJlc291cmNlVW5pcXVlSWQsIGFkZGl0aW9uYWxJbmZvcm1hdGlvbik7CisJCQlpZiAoYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSB0aGlzLmdldFJlc291cmNlKHJlc291cmNlVW5pcXVlSWQsIHRydWUpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkNhbm5vdCBnZXQgZnVsbCByZXNvdXJjZSBmcm9tIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyByZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCisJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlTdHJpbmcganNvbiA9IHByZXR0eUpzb24udG9Kc29uKHJlc3VsdC5sZWZ0KCkudmFsdWUoKSk7CisJCQkJbG9nLmRlYnVnKCJSZXNvdXJjZSByZXRyaWV2ZWQgaXMgIiArIGpzb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3Nvc2lhdGVNZXRhZGF0YVRvQ2F0ZWdvcnkoUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSkgeworCQkvLyBnZXQgY2F0ZWdvcnkKKwkJU3RyaW5nIGNhdGVnb3J5TmFtZSA9IHJlc291cmNlLmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpOworCQlTdHJpbmcgc3ViY2F0ZWdvcnlOYW1lID0gcmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKS5nZXRTdWJjYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKTsKKworCQlDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhID0gbnVsbDsKKwkJRWl0aGVyPENhdGVnb3J5RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2F0ZWdvcnlSZXN1bHQgPSBlbGVtZW50T3BlcmF0aW9uLmdldE5ld0NhdGVnb3J5RGF0YShjYXRlZ29yeU5hbWUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZU5ld0NhdGVnb3J5LCBDYXRlZ29yeURhdGEuY2xhc3MpOworCQlpZiAoY2F0ZWdvcnlSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNhdGVnb3J5UmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgY2F0ZWdvcnkgIiArIGNhdGVnb3J5TmFtZSArICIgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQlyZXR1cm4gY2F0ZWdvcnlSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQl9CisJCWNhdGVnb3J5RGF0YSA9IGNhdGVnb3J5UmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQlpZiAoY2F0ZWdvcnlEYXRhICE9IG51bGwpIHsKKwkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8U3ViQ2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkcmVuTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VOZXdDYXRlZ29yeSksIChTdHJpbmcpIGNhdGVnb3J5RGF0YS5nZXRVbmlxdWVJZCgpLAorCQkJCQlHcmFwaEVkZ2VMYWJlbHMuU1VCX0NBVEVHT1JZLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VTdWJjYXRlZ29yeSwgU3ViQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJCWlmIChjaGlsZHJlbk5vZGVzLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpZWxkIHRvIGZldGNoIHN1YiBjYXRlZ29yaWVzIGZvciAgcmVzb3VyY2UgY2F0ZWdvcnkiICsgY2F0ZWdvcnlEYXRhLmdldENhdGVnb3J5RGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKwkJCWZvciAoSW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4gcGFpciA6IGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQlTdWJDYXRlZ29yeURhdGEgc3ViY2F0ZWdvcnlEYXRhID0gcGFpci5sZWZ0OworCQkJCWlmIChzdWJjYXRlZ29yeURhdGEuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKS5lcXVhbHMoc3ViY2F0ZWdvcnlOYW1lKSkgeworCQkJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihyZXNvdXJjZURhdGEsIHN1YmNhdGVnb3J5RGF0YSwgR3JhcGhFZGdlTGFiZWxzLkNBVEVHT1JZLCBudWxsKTsKKwkJCQkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyByZXNvdXJjZSAiICsgcmVzb3VyY2VEYXRhLmdldFVuaXF1ZUlkKCkgKyAiIHRvIHN1YmNhdGVnb3J5ICIgKyBzdWJjYXRlZ29yeURhdGEgKyAiLiBFZGdlIHR5cGUgaXMgIiArIEdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSk7CisJCQkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZXJyb3IoIkZhaWVsZCB0byBhc3NvY2lhdGUgcmVzb3VyY2UgIiArIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpICsgIiB0byBjYXRlZ29yeSAiICsgY2F0ZWdvcnlEYXRhICsgIi4gRWRnZSB0eXBlIGlzICIgKyBHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlkpOworCQkJCQkJcmV0dXJuIERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uVG9SZXNvdXJjZShUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCwgU3RyaW5nIHJlc291cmNlVW5pcXVlSWQsIExpc3Q8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbj4gYWRkaXRpb25hbEluZm9ybWF0aW9uKSB7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBudWxsOworCQlpZiAoYWRkaXRpb25hbEluZm9ybWF0aW9uID09IG51bGwgfHwgdHJ1ZSA9PSBhZGRpdGlvbmFsSW5mb3JtYXRpb24uaXNFbXB0eSgpKSB7CisJCQlyZXN1bHQgPSBzdXBlci5hZGRBZGRpdGlvbmFsSW5mb3JtYXRpb24oTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZVVuaXF1ZUlkLCBudWxsLCBtZXRhZGF0YVZlcnRleCk7CisJCX0gZWxzZSB7CisJCQlpZiAoYWRkaXRpb25hbEluZm9ybWF0aW9uLnNpemUoKSA9PSAxKSB7CisJCQkJcmVzdWx0ID0gc3VwZXIuYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzb3VyY2VVbmlxdWVJZCwgYWRkaXRpb25hbEluZm9ybWF0aW9uLmdldCgwKSk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1Q7CisJCQkJbG9nLmluZm8oIkNhbm5vdCBjcmVhdGUgcmVzb3VyY2Ugd2l0aCBtb3JlIHRoYW4gb25lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2JqZWN0LiBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG9iamVjdCBpcyB7fSIsIGFkZGl0aW9uYWxJbmZvcm1hdGlvbi5zaXplKCkpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVVVJRChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlTdHJpbmcgcHJldlVVSUQgPSByZXNvdXJjZS5nZXRVVUlEKCk7CisJCVN0cmluZyB2ZXJzaW9uID0gcmVzb3VyY2UuZ2V0VmVyc2lvbigpOworCQlpZiAoKHByZXZVVUlEID09IG51bGwgJiYgdXVpZE5vcm1hdGl2ZU5ld1ZlcnNpb24ubWF0Y2hlcih2ZXJzaW9uKS5tYXRjaGVzKCkpIHx8IHV1aWROZXdWZXJzaW9uLm1hdGNoZXIodmVyc2lvbikubWF0Y2hlcygpKSB7CisJCQlVVUlEIHV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKwkJCXJlc291cmNlLnNldFVVSUQodXVpZC50b1N0cmluZygpKTsKKwkJCU1EQy5wdXQoInNlcnZpY2VJbnN0YW5jZUlEIiwgdXVpZC50b1N0cmluZygpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG92ZXJyaWRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlIHJlc291cmNlU2F2ZWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlU2F2ZWQuZ2V0VW5pcXVlSWQoKTsKKworCQkJLy8gb3ZlcnJpZGUgaW50ZXJmYWNlcyB0byBjb3B5IG9ubHkgcmVzb3VyY2UncyBpbnRlcmZhY2VzIGFuZCBub3QKKwkJCS8vIGRlcml2ZWQgaW50ZXJmYWNlcworCQkJRWl0aGVyPE1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbnRlcmZhY2VzT2ZSZXNvdXJjZU9ubHkgPSBpbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24uZ2V0QWxsSW50ZXJmYWNlc09mUmVzb3VyY2UocmVzb3VyY2VTYXZlZC5nZXRVbmlxdWVJZCgpLCBmYWxzZSwgdHJ1ZSk7CisJCQlpZiAoaW50ZXJmYWNlc09mUmVzb3VyY2VPbmx5LmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCBpbnRlcmZhY2VzIG9mIHJlc291cmNlLiByZXNvdXJjZUlkIHt9IHN0YXR1cyBpcyB7fSIsIHJlc291cmNlSWQsIGludGVyZmFjZXNPZlJlc291cmNlT25seS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChpbnRlcmZhY2VzT2ZSZXNvdXJjZU9ubHkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmVzb3VyY2Uuc2V0SW50ZXJmYWNlcyhpbnRlcmZhY2VzT2ZSZXNvdXJjZU9ubHkubGVmdCgpLnZhbHVlKCkpOworCQkJcmVzb3VyY2Uuc2V0QXJ0aWZhY3RzKHJlc291cmNlU2F2ZWQuZ2V0QXJ0aWZhY3RzKCkpOworCQkJcmVzb3VyY2Uuc2V0RGVwbG95bWVudEFydGlmYWN0cyhyZXNvdXJjZVNhdmVkLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKSk7CisJCQlyZXNvdXJjZS5zZXRHcm91cHMocmVzb3VyY2VTYXZlZC5nZXRHcm91cHMoKSk7CisJCQlyZXNvdXJjZS5zZXRJbnB1dHMobnVsbCk7CisJCQlyZXNvdXJjZS5zZXRMYXN0VXBkYXRlRGF0ZShudWxsKTsKKwkJCXJlc291cmNlLnNldEhpZ2hlc3RWZXJzaW9uKHRydWUpOworCisJCQkvLyBkZWxldGUgZm9ybWVyIHJlc291cmNlCisJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlc291cmNlID0gZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZCwgdHJ1ZSk7CisJCQlpZiAoZGVsZXRlUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZGVsZXRlIG9sZCByZXNvdXJjZSB3aXRoIGlkIHt9LiBzdGF0dXMgPSB7fSIsIHJlc291cmNlSWQsIGRlbGV0ZVJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gZGVsZXRlUmVzb3VyY2U7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB0cnVlKTsKKwkJCWlmIChjcmVhdGVSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgbmV3IHZlcnNpb24gb2YgcmVzb3VyY2Uge30gc3RhdHVzID0ge30iLCByZXNvdXJjZUlkLCBjcmVhdGVSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IGNyZWF0ZVJlc291cmNlOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUdyb3VwRWl0aGVyID0gY2xvbmVHcm91cHMocmVzb3VyY2UsIG5ld1Jlc291cmNlLCBudWxsLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmIChjbG9uZUdyb3VwRWl0aGVyLmlzTGVmdCgpKSB7CisJCQkJbmV3UmVzb3VyY2Uuc2V0R3JvdXBzKGNsb25lR3JvdXBFaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIGlmIChjbG9uZUdyb3VwRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gY2xvbmUgZ3JvdXAgb2YgcmVzb3VyY2Uge30gc3RhdHVzID0ge30iLCByZXNvdXJjZUlkLCBjbG9uZUdyb3VwRWl0aGVyLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGNsb25lR3JvdXBFaXRoZXIucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlyZXN1bHQgPSBFaXRoZXIubGVmdChuZXdSZXNvdXJjZSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVDYXBhYmlsaXRpZXNUb1Jlc291cmNlKFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4LCBTdHJpbmcgcmVzb3VyY2VJZGEsIE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXMpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRDYXBhYmlsaXR5VG9SZXNvdXJjZSA9IG51bGw7CisJCWlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBlbnRyeSA6IGNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisKKwkJCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlmb3IgKENhcGFiaWxpdHlEZWZpbml0aW9uIGl0ZW0gOiBjYXBEZWZpbml0aW9uKSB7CisJCQkJCWFkZENhcGFiaWxpdHlUb1Jlc291cmNlID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5hZGRDYXBhYmlsaXR5KG1ldGFkYXRhVmVydGV4LCByZXNvdXJjZUlkYSwgaXRlbS5nZXROYW1lKCksIGl0ZW0sIHRydWUpOworCQkJCQlpZiAoIWFkZENhcGFiaWxpdHlUb1Jlc291cmNlLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQkJcmV0dXJuIGFkZENhcGFiaWxpdHlUb1Jlc291cmNlOworCQkJCQl9CisKKwkJCQl9CisJCQl9CisKKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlUmVxdWlyZW1lbnRzVG9SZXNvdXJjZShUaXRhblZlcnRleCBtZXRhZGF0YVZlcnRleCwgU3RyaW5nIHJlc291cmNlSWQsIE1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzKSB7CisKKwkJaWYgKHJlcXVpcmVtZW50cyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBlbnRyeSA6IHJlcXVpcmVtZW50cy5lbnRyeVNldCgpKSB7CisKKwkJCQlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxRGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJZm9yIChSZXF1aXJlbWVudERlZmluaXRpb24gaXRlbSA6IHJlcURlZmluaXRpb24pIHsKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UgPSByZXF1aXJlbWVudE9wZXJhdGlvbi5hZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UobWV0YWRhdGFWZXJ0ZXgsIGl0ZW0uZ2V0TmFtZSgpLCBpdGVtLCByZXNvdXJjZUlkLCB0cnVlKTsKKworCQkJCQlpZiAoIWFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJCXJldHVybiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZUFydGlmYWN0c1RvUmVzb3VyY2UoVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgsIFN0cmluZyByZXNvdXJjZUlkLCBNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cykgeworCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJaWYgKGFydGlmYWN0cyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBlbnRyeSA6IGFydGlmYWN0cy5lbnRyeVNldCgpKSB7CisKKwkJCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlzdGF0dXMgPSBhcnRpZmFjdE9wZXJhdGlvbi5hZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3REZWZpbml0aW9uLCByZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlLCBtZXRhZGF0YVZlcnRleCk7CisKKwkJCQlpZiAoIXN0YXR1cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVJbnRlcmZhY2VzVG9SZXNvdXJjZShSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEsIE1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+IGludGVyZmFjZXMsIFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4KSB7CisKKwkJaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+IGVudHJ5IDogaW50ZXJmYWNlcy5lbnRyeVNldCgpKSB7CisKKwkJCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzOworCQkJCWlmICgoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuaXNBYnN0cmFjdCgpKSB7CisJCQkJCXN0YXR1cyA9IGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbi5hc3NvY2lhdGVJbnRlcmZhY2VUb05vZGUocmVzb3VyY2VEYXRhLCBpbnRlcmZhY2VEZWZpbml0aW9uLCBtZXRhZGF0YVZlcnRleCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RhdHVzID0gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmNyZWF0ZUludGVyZmFjZU9uUmVzb3VyY2UoaW50ZXJmYWNlRGVmaW5pdGlvbiwgcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCBpbnRlcmZhY2VEZWZpbml0aW9uLmdldFR5cGUoKSwgZmFsc2UsIHRydWUsIG1ldGFkYXRhVmVydGV4KTsKKwkJCQl9CisKKwkJCQlpZiAoIXN0YXR1cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VuZEVycm9yKFRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXNJZk5vdEZvdW5kKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0OworCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1c0lmTm90Rm91bmQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlUHJvcGVydGllc1RvUmVzb3VyY2UoVGl0YW5WZXJ0ZXggbWV0YWRhdFZlcnRleCwgU3RyaW5nIHJlc291cmNlSWQsIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBhcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUuZ2V0QWxsKCk7CisJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDYW5ub3QgZmluZCBhbnkgZGF0YSB0eXBlLiBTdGF0dXMgaXMge30uIiwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGNvbnZlcnRlZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJZm9yIChQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uIDogcHJvcGVydGllcykgeworCQkJCWNvbnZlcnRlZFByb3BlcnRpZXMucHV0KHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCksIHByb3BlcnR5RGVmaW5pdGlvbik7CisJCQl9CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBwcm9wZXJ0eU9wZXJhdGlvbi5hZGRQcm9wZXJ0aWVzVG9HcmFwaChtZXRhZGF0VmVydGV4LCBjb252ZXJ0ZWRQcm9wZXJ0aWVzLCBhbGxEYXRhVHlwZXMubGVmdCgpLnZhbHVlKCksIHJlc291cmNlSWQpOworCQkJcmV0dXJuIG9wZXJhdGlvblN0YXR1czsKKwkJfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQXR0cmlidXRlc1RvUmVzb3VyY2UoVGl0YW5WZXJ0ZXggbWV0YWRhdGFWZXJ0ZXgsIExpc3Q8QXR0cmlidXRlRGVmaW5pdGlvbj4gYXR0cmlidXRlcywgU3RyaW5nIHJlc291cmNlSWQpIHsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbGxEYXRhVHlwZXMgPSBhcHBsaWNhdGlvbkRhdGFUeXBlQ2FjaGUuZ2V0QWxsKCk7CisJCWlmIChhbGxEYXRhVHlwZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBhbGxEYXRhVHlwZXMucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmRlYnVnKCJDYW5ub3QgZmluZCBhbnkgZGF0YSB0eXBlLiBTdGF0dXMgaXMge30uIiwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQlNYXA8U3RyaW5nLCBBdHRyaWJ1dGVEZWZpbml0aW9uPiBjb252ZXJ0ZWRBdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoZSAtPiBlLmdldE5hbWUoKSwgZSAtPiBlKSk7CisJCQlvcGVyYXRpb25TdGF0dXMgPSBhdHRyaWJ1dGVPcGVyYXRpb24uYWRkQXR0cmlidXRlc1RvR3JhcGgobWV0YWRhdGFWZXJ0ZXgsIGNvbnZlcnRlZEF0dHJpYnV0ZXMsIHJlc291cmNlSWQsIGFsbERhdGFUeXBlcy5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIG9wZXJhdGlvblN0YXR1czsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGFzc29jaWF0ZU1ldGFkYXRhVG9SZXNvdXJjZShSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEsIFRpdGFuVmVydGV4IGNyZWF0b3JWZXJ0ZXgsIFRpdGFuVmVydGV4IHVwZGF0ZXJWZXJ0ZXgsIExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGRlcml2ZWRSZXNvdXJjZXMsIFRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4KSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCByZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCkpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVFZGdlKHVwZGF0ZXJWZXJ0ZXgsIG1ldGFkYXRhVmVydGV4LCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIHByb3BzKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyB1c2VyIHt9IHRvIHJlc291cmNlIHt9LiBFZGdlIHR5cGUgaXMge30iLCB1cGRhdGVyVmVydGV4LCByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFKTsKKwkJaWYgKCFyZXN1bHQuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlRWRnZSh1cGRhdGVyVmVydGV4LCBtZXRhZGF0YVZlcnRleCwgR3JhcGhFZGdlTGFiZWxzLkxBU1RfTU9ESUZJRVIsIG51bGwpOworCQlsb2cuZGVidWcoIkFmdGVyIGFzc29jaWF0aW5nIHVzZXIge30gIHRvIHJlc291cmNlIHt9LiBFZGdlIHR5cGUgaXMge30iLCB1cGRhdGVyVmVydGV4LCByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkxBU1RfTU9ESUZJRVIpOworCQlpZiAoIXJlc3VsdC5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgdXNlciB7fSAgdG8gcmVzb3VyY2Uge30uIEVkZ2UgdHlwZSBpcyB7fSIsIHVwZGF0ZXJWZXJ0ZXgsIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9NT0RJRklFUik7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJcmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZUVkZ2UoY3JlYXRvclZlcnRleCwgbWV0YWRhdGFWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscy5DUkVBVE9SLCBudWxsKTsKKwkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyB1c2VyIHt9IHRvIHJlc291cmNlIHt9LiBFZGdlIHR5cGUgaXMge30gIiwgY3JlYXRvclZlcnRleCwgcmVzb3VyY2VEYXRhLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DUkVBVE9SKTsKKwkJaWYgKCFyZXN1bHQuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gYXNzb2NpYXRlIHVzZXIge30gdG8gcmVzb3VyY2Uge30uIEVkZ2UgdHlwZSBpcyB7fSAiLCBjcmVhdG9yVmVydGV4LCByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkNSRUFUT1IpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQkvLyBUT0RPIEV2ZyA6IG5lZWQgdG8gY2hhbmdlIHRvby4uCisJCWlmIChkZXJpdmVkUmVzb3VyY2VzICE9IG51bGwpIHsKKwkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgZGVyaXZlZFJlc291cmNlIDogZGVyaXZlZFJlc291cmNlcykgeworCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcgcmVzb3VyY2UgIiArIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpICsgIiB0byBwYXJlbnQgcmVzb3VyY2UgIiArIGRlcml2ZWRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpICsgIi4gRWRnZSB0eXBlIGlzICIgKyBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NKTsKKwkJCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKHJlc291cmNlRGF0YSwgZGVyaXZlZFJlc291cmNlLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLCBudWxsKTsKKwkJCQlpZiAoY3JlYXRlUmVsYXRpb25SZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSB7fSB0byBkZXJpdmVkICIsIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uUmVzdWx0LnJpZ2h0KCkudmFsdWUoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmluZERlcml2ZWRSZXNvdXJjZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBkZXJpdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4oKTsKKwkJTGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tUmVzb3VyY2VzID0gcmVzb3VyY2UuZ2V0RGVyaXZlZEZyb20oKTsKKwkJaWYgKGRlcml2ZWRGcm9tUmVzb3VyY2VzICE9IG51bGwgJiYgZmFsc2UgPT0gZGVyaXZlZEZyb21SZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisKKwkJCWZvciAoU3RyaW5nIHBhcmVudFJlc291cmNlIDogZGVyaXZlZEZyb21SZXNvdXJjZXMpIHsKKworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2ggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQkJLy8gcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfQUJTVFJBQ1QuZ2V0UHJvcGVydHkoKSwKKwkJCQkvLyB0cnVlKTsKKwkJCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5UT1NDQV9SRVNPVVJDRV9OQU1FLmdldFByb3BlcnR5KCksIHBhcmVudFJlc291cmNlKTsKKwkJCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisKKwkJCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRQYXJlbnRSZXNvdXJjZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BlcnRpZXNUb01hdGNoLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gcmVzb3VyY2VzID0gbnVsbDsKKwkJCQlpZiAoZ2V0UGFyZW50UmVzb3VyY2VzLmlzUmlnaHQoKSkgeworCQkJCQkvKgorCQkJCQkgKiBsb2cuZGVidWcoICJDYW5ub3QgZmluZCBwYXJlbnQgcmVzb3VyY2UgYnkgdG9zY2EgcmVzb3VyY2UgbmFtZSIgKyBwYXJlbnRSZXNvdXJjZSArICIgaW4gdGhlIGdyYXBoLiBUcnkgdG8gZmluZCBieSBuYW1lIik7IE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1dpdGhSZXNvdXJjZU5hbWVUb01hdGNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQkJCSAqIHByb3BlcnRpZXNXaXRoUmVzb3VyY2VOYW1lVG9NYXRjaC5wdXQoIEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOyBwcm9wZXJ0aWVzV2l0aFJlc291cmNlTmFtZVRvTWF0Y2gucHV0KCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcGFyZW50UmVzb3VyY2UpOworCQkJCQkgKiBwcm9wZXJ0aWVzV2l0aFJlc291cmNlTmFtZVRvTWF0Y2gucHV0KCBHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSggKSwgdHJ1ZSk7CisJCQkJCSAqIAorCQkJCQkgKiBnZXRQYXJlbnRSZXNvdXJjZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BlcnRpZXNXaXRoUmVzb3VyY2VOYW1lVG9NYXRjaCwgUmVzb3VyY2VEYXRhLmNsYXNzKTsgaWYgKGdldFBhcmVudFJlc291cmNlcy5pc1JpZ2h0KCkpIHsgbG9nLmVycm9yKAorCQkJCQkgKiAiQ2Fubm90IGZpbmQgcGFyZW50IHJlc291cmNlIGJ5IHRvc2NhIHJlc291cmNlIG5hbWUiICsgcGFyZW50UmVzb3VyY2UgKyAiIGluIHRoZSBncmFwaC4iKTsgcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLiBQQVJFTlRfUkVTT1VSQ0VfTk9UX0ZPVU5EKTsgfWVsc2V7IHJlc291cmNlcyA9IGdldFBhcmVudFJlc291cmNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJICogCisJCQkJCSAqIH0KKwkJCQkJICovCisJCQkJCWxvZy5lcnJvcigiQ2Fubm90IGZpbmQgcGFyZW50IHJlc291cmNlIGJ5IHRvc2NhIHJlc291cmNlIG5hbWUiICsgcGFyZW50UmVzb3VyY2UgKyAiIGluIHRoZSBncmFwaC4iKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQpOworCisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzb3VyY2VzID0gZ2V0UGFyZW50UmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpOworCQkJCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLnNpemUoKSA9PSAwKSB7CisJCQkJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIHBhcmVudCByZXNvdXJjZSBieSB0b3NjIG5hbWUiICsgcGFyZW50UmVzb3VyY2UgKyAiIGluIHRoZSBncmFwaC4gcmVzb3VyY2VzIHNpemUgaXMgZW1wdHkiKTsKKwkJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5QQVJFTlRfUkVTT1VSQ0VfTk9UX0ZPVU5EKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChyZXNvdXJjZXMuc2l6ZSgpID4gMSkgeworCQkJCQkJCWxvZy5lcnJvcigiTXVsdGlwbGUgcGFyZW50IHJlc291cmNlcyBjYWxsZWQgIiArIHBhcmVudFJlc291cmNlICsgIiBmb3VuZCBpbiB0aGUgZ3JhcGguIik7CisJCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk1VTFRJUExFX1BBUkVOVF9SRVNPVVJDRV9GT1VORCk7CisJCQkJCQl9CisJCQkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSBwYXJlbnRSZXNvdXJjZURhdGEgPSByZXNvdXJjZXMuZ2V0KDApOworCQkJCQkJZGVyaXZlZFJlc291cmNlcy5hZGQocGFyZW50UmVzb3VyY2VEYXRhKTsKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRlcml2ZWRSZXNvdXJjZXMpOworCX0KKworCXByaXZhdGUgUmVzb3VyY2VNZXRhZGF0YURhdGEgZ2V0UmVzb3VyY2VNZXRhRGF0YUZyb21SZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgcmVzb3VyY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKTsKKwkJaWYgKHJlc291cmNlLmdldE5vcm1hbGl6ZWROYW1lKCkgPT0gbnVsbCB8fCByZXNvdXJjZS5nZXROb3JtYWxpemVkTmFtZSgpLmlzRW1wdHkoKSkgeworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXROb3JtYWxpemVkTmFtZShWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShyZXNvdXJjZS5nZXROYW1lKCkpKTsKKwkJfQorCQlpZiAocmVzb3VyY2UuZ2V0U3lzdGVtTmFtZSgpID09IG51bGwgfHwgcmVzb3VyY2UuZ2V0U3lzdGVtTmFtZSgpLmlzRW1wdHkoKSkgeworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTeXN0ZW1OYW1lKFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKHJlc291cmNlLmdldE5hbWUoKSkpOworCQl9CisKKwkJTGlmZWN5Y2xlU3RhdGVFbnVtIGxpZmVjeWNsZVN0YXRlRW51bSA9IHJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCk7CisJCWlmIChsaWZlY3ljbGVTdGF0ZUVudW0gPT0gbnVsbCkgeworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVC5uYW1lKCkpOworCQl9CisJCWxvbmcgY3VycmVudERhdGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJaWYgKHJlc291cmNlLmdldENyZWF0aW9uRGF0ZSgpID09IG51bGwpIHsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0Q3JlYXRpb25EYXRlKGN1cnJlbnREYXRlKTsKKwkJfQorCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldExhc3RVcGRhdGVEYXRlKGN1cnJlbnREYXRlKTsKKworCQlyZXR1cm4gcmVzb3VyY2VEYXRhOworCX0KKworCXByaXZhdGUgUmVzb3VyY2VNZXRhZGF0YURhdGEgZ2V0UmVzb3VyY2VNZXRhRGF0YUZvclVwZGF0ZShSZXNvdXJjZSByZXNvdXJjZSkgeworCQkvLyBQQSAtIHBsZWFzZSBub3RlOiBpZiB5b3UgYWRkIGhlcmUgYW55IGZpZWxkcywgbWFrZSBzdXJlIHRoZXkgYXJlCisJCS8vIHZhbGlkYXRlZCAoaWYgbmVlZGVkKQorCQkvLyBhdCBSZXNvdXJjZUJ1c2luZXNzTG9naWMudmFsaWRhdGVSZXNvdXJjZUZpZWxkc0JlZm9yZVVwZGF0ZSgpIGFuZAorCQkvLyB0ZXN0ZWQgYXQgUmVzb3VyY2VCdXNpbmVzc0xvZ2ljVGVzdC4KKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gZ2V0UmVzb3VyY2VNZXRhRGF0YUZyb21SZXNvdXJjZShyZXNvdXJjZSk7CisJCS8vIHJlc291cmNlRGF0YS5zZXRMYXN0VXBkYXRlRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCS8vIHJlc291cmNlRGF0YS5zZXRIaWdoZXN0VmVyc2lvbihyZXNvdXJjZS5pc0hpZ2hlc3RWZXJzaW9uKCkpOworCQkvLyByZXNvdXJjZURhdGEuc2V0Tm9ybWFsaXplZE5hbWUocmVzb3VyY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSk7CisJCS8vIHJlc291cmNlRGF0YS5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkubmFtZSgpKTsKKworCQlyZXR1cm4gcmVzb3VyY2VEYXRhOworCX0KKworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlKFN0cmluZyB1bmlxdWVJZCkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2UodW5pcXVlSWQsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZShTdHJpbmcgdW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQlyZXR1cm4gZ2V0UmVzb3VyY2UodW5pcXVlSWQsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwkvLyBwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZShTdHJpbmcKKwkvLyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJLy8KKwkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJLy8gdHJ5IHsKKwkvLworCS8vIE5vZGVUeXBlRW51bSByZXNvdXJjZU5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCS8vIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCS8vCisJLy8gRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPgorCS8vIGNvbXBvbmVudEJ5TGFiZWxBbmRJZCA9IGdldENvbXBvbmVudEJ5TGFiZWxBbmRJZCh1bmlxdWVJZCwKKwkvLyByZXNvdXJjZU5vZGVUeXBlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJLy8gaWYgKGNvbXBvbmVudEJ5TGFiZWxBbmRJZC5pc1JpZ2h0KCkpIHsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudEJ5TGFiZWxBbmRJZC5yaWdodCgpLnZhbHVlKCkpOworCS8vIH0KKwkvLyBSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBjb21wb25lbnRCeUxhYmVsQW5kSWQubGVmdCgpLnZhbHVlKCk7CisJLy8gcmVzb3VyY2UgPSBjb252ZXJ0UmVzb3VyY2VEYXRhVG9SZXNvdXJjZShyZXNvdXJjZURhdGEpOworCS8vCisJLy8gVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gc2V0UmVzb3VyY2VDcmVhdG9yRnJvbUdyYXBoKHJlc291cmNlLAorCS8vIHVuaXF1ZUlkKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0UmVzb3VyY2VMYXN0TW9kaWZpZXJGcm9tR3JhcGgocmVzb3VyY2UsIHVuaXF1ZUlkKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0UmVzb3VyY2VQcm9wZXJ0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldFJlc291cmNlQXR0cmlidXRlc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRSZXNvdXJjZURlcml2ZWRGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0Q29tcG9uZW50Q2F0ZWdvcmllc0Zyb21HcmFwaChyZXNvdXJjZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENvbXBvbmVudEluc3RhbmNlc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UsCisJLy8gcmVzb3VyY2VOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vCisJLy8gfQorCS8vCisJLy8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzZXRSZXF1aXJlbWVudHNTdGF0dXMgPQorCS8vIHNldFJlc291cmNlUmVxdWlyZW1lbnRzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSwgdHJ1ZSk7CisJLy8gaWYgKHNldFJlcXVpcmVtZW50c1N0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gbG9nLmVycm9yKCJGYWlsZWQgdG8gc2V0IHJlcXVpcmVtZW50IG9mIHJlc291cmNlICIgKyB1bmlxdWVJZCArICIuIHN0YXR1cworCS8vIGlzICIgKyBzZXRSZXF1aXJlbWVudHNTdGF0dXMpOworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoc2V0UmVxdWlyZW1lbnRzU3RhdHVzKTsKKwkvLyB9CisJLy8KKwkvLyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPQorCS8vIHNldFJlc291cmNlQ2FwYWJpbGl0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJLy8gaWYgKHN0b3JhZ2VTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJLy8gfQorCS8vCisJLy8gc3RvcmFnZVN0YXR1cyA9IHNldEFydGlmYWN0RnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJLy8gaWYgKHN0b3JhZ2VTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0Q29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBzdG9yYWdlU3RhdHVzID0gc2V0UmVzb3VyY2VJbnRlcmZhY2VzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJLy8gaWYgKHN0b3JhZ2VTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJLy8gfQorCS8vCisJLy8gc3RvcmFnZVN0YXR1cyA9IHNldFJlc291cmNlQWRkaXRpb25hbEluZm9ybWF0aW9uRnJvbUdyYXBoKHVuaXF1ZUlkLAorCS8vIHJlc291cmNlKTsKKwkvLyBpZiAoc3RvcmFnZVN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkvLyB9CisJLy8gc3RhdHVzID0gc2V0QWxsVmVyc2lvbnMocmVzb3VyY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRHcm91cHNGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyB9CisJLy8KKwkvLyB9IGZpbmFsbHkgeworCS8vIGlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJLy8gdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCS8vIH0KKwkvLyB9CisJLy8KKwkvLyByZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCS8vIH0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0Q29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlc0Zyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIFJlc291cmNlIGNvbXBvbmVudCkgeworCQlNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPj4gcmVzb3VyY2VJbnN0YW5jZXNBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8PigpOworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gY29tcG9uZW50SW5zdGFuY2VzID0gY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlcygpOworCQlpZiAoY29tcG9uZW50SW5zdGFuY2VzICE9IG51bGwpIHsKKwkJCWZvciAoQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA6IGNvbXBvbmVudEluc3RhbmNlcykgeworCQkJCUVpdGhlcjxMaXN0PENvbXBvbmVudEluc3RhbmNlQXR0cmlidXRlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclJJQXR0cmlidXRlcyA9IGF0dHJpYnV0ZU9wZXJhdGlvbi5nZXRBbGxBdHRyaWJ1dGVzT2ZSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2UpOworCQkJCWlmIChlaXRoZXJSSUF0dHJpYnV0ZXMuaXNSaWdodCgpKSB7CisJCQkJCXN0YXR1cyA9IGVpdGhlclJJQXR0cmlidXRlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc291cmNlSW5zdGFuY2VzQXR0cmlidXRlcy5wdXQocmVzb3VyY2VJbnN0YW5jZS5nZXRVbmlxdWVJZCgpLCBlaXRoZXJSSUF0dHJpYnV0ZXMubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCX0KKworCQkJY29tcG9uZW50LnNldENvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMocmVzb3VyY2VJbnN0YW5jZXNBdHRyaWJ1dGVzKTsKKwkJfQorCisJCXJldHVybiBzdGF0dXM7CisKKwl9CisKKwkvLyBwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZV90eChTdHJpbmcKKwkvLyB1bmlxdWVJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJLy8KKwkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJLy8gdHJ5IHsKKwkvLworCS8vIE5vZGVUeXBlRW51bSByZXNvdXJjZU5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCS8vIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCS8vCisJLy8gRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPgorCS8vIGNvbXBvbmVudEJ5TGFiZWxBbmRJZCA9IGdldENvbXBvbmVudEJ5TGFiZWxBbmRJZF90eCh1bmlxdWVJZCwKKwkvLyByZXNvdXJjZU5vZGVUeXBlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJLy8gaWYgKGNvbXBvbmVudEJ5TGFiZWxBbmRJZC5pc1JpZ2h0KCkpIHsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudEJ5TGFiZWxBbmRJZC5yaWdodCgpLnZhbHVlKCkpOworCS8vIH0KKwkvLyBSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBjb21wb25lbnRCeUxhYmVsQW5kSWQubGVmdCgpLnZhbHVlKCk7CisJLy8gcmVzb3VyY2UgPSBjb252ZXJ0UmVzb3VyY2VEYXRhVG9SZXNvdXJjZShyZXNvdXJjZURhdGEpOworCS8vCisJLy8gVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gc2V0UmVzb3VyY2VDcmVhdG9yRnJvbUdyYXBoKHJlc291cmNlLAorCS8vIHVuaXF1ZUlkKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0UmVzb3VyY2VMYXN0TW9kaWZpZXJGcm9tR3JhcGgocmVzb3VyY2UsIHVuaXF1ZUlkKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0UmVzb3VyY2VQcm9wZXJ0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldFJlc291cmNlRGVyaXZlZEZyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRDb21wb25lbnRDYXRlZ29yaWVzRnJvbUdyYXBoKHJlc291cmNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0Q29tcG9uZW50SW5zdGFuY2VzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSwKKwkvLyByZXNvdXJjZU5vZGVUeXBlLCBjb21wSW5zdE5vZGVUeXBlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldFJlcXVpcmVtZW50c1N0YXR1cyA9CisJLy8gc2V0UmVzb3VyY2VSZXF1aXJlbWVudHNGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlLCB0cnVlKTsKKwkvLyBpZiAoc2V0UmVxdWlyZW1lbnRzU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyBsb2cuZXJyb3IoIkZhaWxlZCB0byBzZXQgcmVxdWlyZW1lbnQgb2YgcmVzb3VyY2UgIiArIHVuaXF1ZUlkICsgIi4gc3RhdHVzCisJLy8gaXMgIiArIHNldFJlcXVpcmVtZW50c1N0YXR1cyk7CisJLy8gcmV0dXJuIEVpdGhlci5yaWdodChzZXRSZXF1aXJlbWVudHNTdGF0dXMpOworCS8vIH0KKwkvLworCS8vIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9CisJLy8gc2V0UmVzb3VyY2VDYXBhYmlsaXRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlKTsKKwkvLyBpZiAoc3RvcmFnZVN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkvLyB9CisJLy8KKwkvLyBzdG9yYWdlU3RhdHVzID0gc2V0QXJ0aWZhY3RGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlKTsKKwkvLyBpZiAoc3RvcmFnZVN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vCisJLy8gfQorCS8vCisJLy8gc3RvcmFnZVN0YXR1cyA9IHNldFJlc291cmNlSW50ZXJmYWNlc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCS8vIGlmIChzdG9yYWdlU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4gRWl0aGVyLnJpZ2h0KHN0b3JhZ2VTdGF0dXMpOworCS8vIH0KKwkvLworCS8vIHN0b3JhZ2VTdGF0dXMgPSBzZXRSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkZyb21HcmFwaCh1bmlxdWVJZCwKKwkvLyByZXNvdXJjZSk7CisJLy8gaWYgKHN0b3JhZ2VTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJLy8gfQorCS8vIHN0YXR1cyA9IHNldEFsbFZlcnNpb25zKHJlc291cmNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gfSBmaW5hbGx5IHsKKwkvLyBpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCS8vIHRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkvLyB9CisJLy8gfQorCS8vCisJLy8gcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlKTsKKwkvLyB9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc2V0UmVzb3VyY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25Gcm9tR3JhcGgoU3RyaW5nIHVuaXF1ZUlkLCBSZXNvdXJjZSByZXNvdXJjZSkgeworCisJCUxpc3Q8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbj4gYWRkaXRpb25hbEluZm9ybWF0aW9uID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvbi5nZXRBbGxBZGRpdGlvbmFsSW5mb3JtYXRpb25QYXJhbWV0ZXJzKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdW5pcXVlSWQsIHRydWUsIHRydWUpOworCisJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGVpdGhlci5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBhZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQlhZGRpdGlvbmFsSW5mb3JtYXRpb24uYWRkKGFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24pOworCisJCXJlc291cmNlLnNldEFkZGl0aW9uYWxJbmZvcm1hdGlvbihhZGRpdGlvbmFsSW5mb3JtYXRpb24pOworCisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldFJlc291cmNlSW50ZXJmYWNlc0Zyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIFJlc291cmNlIHJlc291cmNlKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXNSZXMgPSBpbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24uZ2V0QWxsSW50ZXJmYWNlc09mUmVzb3VyY2UodW5pcXVlSWQsIHRydWUsIHRydWUpOworCQlpZiAoc3RhdHVzUmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIHN0YXR1c1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCX0KKwkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gdmFsdWUgPSBzdGF0dXNSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJcmVzb3VyY2Uuc2V0SW50ZXJmYWNlcyh2YWx1ZSk7CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldFJlc291cmNlQ2FwYWJpbGl0aWVzRnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXRTdGF0dXM7CisJCUVpdGhlcjxNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNhcGFiaWxpdHlPcGVyYXRpb24uZ2V0QWxsQ2FwYWJpbGl0aWVzT2ZSZXNvdXJjZSh1bmlxdWVJZCwgdHJ1ZSwgdHJ1ZSk7CisJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHJlc3VsdC5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0U3RhdHVzID0gc3RhdHVzOworCQkJfSBlbHNlIHsKKwkJCQlyZXRTdGF0dXMgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJfQorCQl9IGVsc2UgeworCQkJTWFwPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGllcyA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmIChjYXBhYmlsaXRpZXMgPT0gbnVsbCB8fCBjYXBhYmlsaXRpZXMuaXNFbXB0eSgpKSB7CisJCQkJRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckNhcGFiaWxpdGllcyA9IHN1cGVyLmdldENhcGFiaWxpdGllcyhyZXNvdXJjZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlKTsKKwkJCQlpZiAoZWl0aGVyQ2FwYWJpbGl0aWVzLmlzTGVmdCgpKSB7CisJCQkJCXJldFN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYWxjdWxhdGVkQ2FwYWJpbGl0aWVzID0gZWl0aGVyQ2FwYWJpbGl0aWVzLmxlZnQoKS52YWx1ZSgpOworCQkJCQlyZXNvdXJjZS5zZXRDYXBhYmlsaXRpZXMoY2FsY3VsYXRlZENhcGFiaWxpdGllcyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0U3RhdHVzID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQlyZXRTdGF0dXMgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJCXJlc291cmNlLnNldENhcGFiaWxpdGllcyhjYXBhYmlsaXR5T3BlcmF0aW9uLmNvbnZlcnRDYXBhYmlsaXR5TWFwKGNhcGFiaWxpdGllcywgbnVsbCwgbnVsbCkpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIHJldFN0YXR1czsKKworCX0KKworCXB1YmxpYyBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0Q2FwYWJpbGl0aWVzKG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQsIE5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJdHJ5IHsKKwkJCUVpdGhlcjxNYXA8U3RyaW5nLCBDYXBhYmlsaXR5RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGNhcGFiaWxpdHlPcGVyYXRpb24uZ2V0QWxsQ2FwYWJpbGl0aWVzT2ZSZXNvdXJjZShjb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSwgdHJ1ZSk7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSB8fCByZXN1bHQubGVmdCgpLnZhbHVlKCkuaXNFbXB0eSgpKSB7CisJCQkJZmluYWwgRWl0aGVyPE1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckNhcGFiaWxpdGllcyA9IHN1cGVyLmdldENhcGFiaWxpdGllcyhjb21wb25lbnQsIGNvbXBvbmVudFR5cGVFbnVtLCBpblRyYW5zYWN0aW9uKTsKKwkJCQlyZXR1cm4gZWl0aGVyQ2FwYWJpbGl0aWVzOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2FwYWJpbGl0eU9wZXJhdGlvbi5jb252ZXJ0Q2FwYWJpbGl0eU1hcChyZXN1bHQubGVmdCgpLnZhbHVlKCksIG51bGwsIG51bGwpKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblRyYW5zYWN0aW9uID09IGZhbHNlKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UmVxdWlyZW1lbnRzKG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCBjb21wb25lbnQsIE5vZGVUeXBlRW51bSBjb21wb25lbnRUeXBlRW51bSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXRyeSB7CisJCQlFaXRoZXI8TWFwPFN0cmluZywgUmVxdWlyZW1lbnREZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gcmVxdWlyZW1lbnRPcGVyYXRpb24uZ2V0QWxsUmVzb3VyY2VSZXF1aXJlbWVudHMoY29tcG9uZW50LmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkgfHwgcmVzdWx0LmxlZnQoKS52YWx1ZSgpLmlzRW1wdHkoKSkgeworCQkJCWZpbmFsIEVpdGhlcjxNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyQ2FwYWJpbGl0aWVzID0gc3VwZXIuZ2V0UmVxdWlyZW1lbnRzKGNvbXBvbmVudCwgY29tcG9uZW50VHlwZUVudW0sIHRydWUpOworCQkJCXJldHVybiBlaXRoZXJDYXBhYmlsaXRpZXM7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBFaXRoZXIubGVmdChyZXF1aXJlbWVudE9wZXJhdGlvbi5jb252ZXJ0UmVxdWlyZW1lbnRNYXAocmVzdWx0LmxlZnQoKS52YWx1ZSgpLCBudWxsLCBudWxsKSk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoaW5UcmFuc2FjdGlvbiA9PSBmYWxzZSkgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldFJlc291cmNlUmVxdWlyZW1lbnRzRnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJldFN0YXR1czsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHJlcXVpcmVtZW50T3BlcmF0aW9uLmdldEFsbFJlc291cmNlUmVxdWlyZW1lbnRzKHVuaXF1ZUlkLCBpblRyYW5zYWN0aW9uKTsKKwkJOworCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSByZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldFN0YXR1cyA9IHN0YXR1czsKKwkJCX0gZWxzZSB7CisJCQkJcmV0U3RhdHVzID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCU1hcDxTdHJpbmcsIFJlcXVpcmVtZW50RGVmaW5pdGlvbj4gcmVxdWlyZW1lbnRzID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJlcXVpcmVtZW50cyA9PSBudWxsIHx8IHJlcXVpcmVtZW50cy5pc0VtcHR5KCkpIHsKKwkJCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlckNhcGFiaWxpdGllcyA9IHN1cGVyLmdldFJlcXVpcmVtZW50cyhyZXNvdXJjZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlKTsKKwkJCQlpZiAoZWl0aGVyQ2FwYWJpbGl0aWVzLmlzTGVmdCgpKSB7CisJCQkJCXJldFN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQkJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gY2FsY3VsYXRlZENhcGFiaWxpdGllcyA9IGVpdGhlckNhcGFiaWxpdGllcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQkJcmVzb3VyY2Uuc2V0UmVxdWlyZW1lbnRzKGNhbGN1bGF0ZWRDYXBhYmlsaXRpZXMpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldFN0YXR1cyA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJcmV0U3RhdHVzID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCQlyZXNvdXJjZS5zZXRSZXF1aXJlbWVudHMocmVxdWlyZW1lbnRPcGVyYXRpb24uY29udmVydFJlcXVpcmVtZW50TWFwKHJlcXVpcmVtZW50cywgbnVsbCwgbnVsbCkpOworCQkJfQorCisJCX0KKwkJcmV0dXJuIHJldFN0YXR1czsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldFJlc291cmNlUHJvcGVydGllc0Zyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIFJlc291cmNlIHJlc291cmNlKSB7CisKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJvcGVydHlPcGVyYXRpb24uZmluZEFsbFJlc291cmNlUHJvcGVydGllc1JlY3Vyc2l2ZWx5KHVuaXF1ZUlkLCBwcm9wZXJ0aWVzKTsKKwkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJcmVzb3VyY2Uuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKwkJfQorCisJCXJldHVybiBzdGF0dXM7CisKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldFJlc291cmNlQXR0cmlidXRlc0Zyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIFJlc291cmNlIHJlc291cmNlKSB7CisKKwkJTGlzdDxBdHRyaWJ1dGVEZWZpbml0aW9uPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGF0dHJpYnV0ZU9wZXJhdGlvbi5maW5kQWxsUmVzb3VyY2VBdHRyaWJ1dGVzUmVjdXJzaXZlbHkodW5pcXVlSWQsIGF0dHJpYnV0ZXMpOworCQlpZiAoc3RhdHVzID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQlyZXNvdXJjZS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworCQl9CisKKwkJcmV0dXJuIHN0YXR1czsKKworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0UmVzb3VyY2VEZXJpdmVkRnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJTGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGxpc3RGcm9tR3JhcGhTdGF0dXMgPSBmaWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaCh1bmlxdWVJZCwgZGVyaXZlZEZyb21MaXN0KTsKKwkJaWYgKCFUaXRhbk9wZXJhdGlvblN0YXR1cy5PSy5lcXVhbHMobGlzdEZyb21HcmFwaFN0YXR1cykpIHsKKwkJCXJldHVybiBsaXN0RnJvbUdyYXBoU3RhdHVzOworCQl9CisKKwkJaWYgKGZhbHNlID09IGRlcml2ZWRGcm9tTGlzdC5pc0VtcHR5KCkpIHsKKwkJCWlmIChkZXJpdmVkRnJvbUxpc3Quc2l6ZSgpID4gMSkgeworCQkJCUxpc3Q8U3RyaW5nPiBsYXN0RGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQlsYXN0RGVyaXZlZEZyb20uYWRkKGRlcml2ZWRGcm9tTGlzdC5nZXQoMSkpOworCQkJCXJlc291cmNlLnNldERlcml2ZWRGcm9tKGxhc3REZXJpdmVkRnJvbSk7CisJCQkJcmVzb3VyY2Uuc2V0RGVyaXZlZExpc3QoZGVyaXZlZEZyb21MaXN0KTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzb3VyY2Uuc2V0RGVyaXZlZEZyb20obnVsbCk7CisJCQkJcmVzb3VyY2Uuc2V0RGVyaXZlZExpc3QoZGVyaXZlZEZyb21MaXN0KTsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXB1YmxpYyBUaXRhbk9wZXJhdGlvblN0YXR1cyBmaWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIExpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbUxpc3QpIHsKKwkJLy8gRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPj4sCisJCS8vIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0KKwkJLy8gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwKKwkJLy8gdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5ERVJJVkVEX0ZST00sCisJCS8vIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQkvLworCQkvLyBpZiAoY2hpbGRyZW5Ob2Rlcy5pc1JpZ2h0KCkgJiYgKGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpICE9CisJCS8vIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJLy8gcmV0dXJuIGNoaWxkcmVuTm9kZXMucmlnaHQoKS52YWx1ZSgpOworCQkvLyB9IGVsc2UgaWYgKGNoaWxkcmVuTm9kZXMuaXNMZWZ0KCkpIHsKKwkJLy8KKwkJLy8gTGlzdDxJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+PiBwYWlyTGlzdCA9CisJCS8vIGNoaWxkcmVuTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCS8vIGZvciAoSW1tdXRhYmxlUGFpcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlPiBwYWlyIDogcGFpckxpc3QpCisJCS8vIHsKKwkJLy8gZGVyaXZlZEZyb21MaXN0LmFkZChwYWlyLmxlZnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7CisJCS8vIHJldHVybgorCQkvLyBmaWxsUmVzb3VyY2VEZXJpdmVkTGlzdEZyb21HcmFwaChwYWlyLmxlZnQuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCS8vIGRlcml2ZWRGcm9tTGlzdCk7CisJCS8vIH0KKwkJLy8gfQorCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBkZXJpdmVkRGF0YSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+KCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGZpbmRSZXNvdXJjZXNQYXRoUmVjdXJzaXZlbHkgPSBmaW5kUmVzb3VyY2VzUGF0aFJlY3Vyc2l2ZWx5KHVuaXF1ZUlkLCBkZXJpdmVkRGF0YSk7CisJCWlmICghZmluZFJlc291cmNlc1BhdGhSZWN1cnNpdmVseS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQlyZXR1cm4gZmluZFJlc291cmNlc1BhdGhSZWN1cnNpdmVseTsKKwkJfQorCQlkZXJpdmVkRGF0YS5mb3JFYWNoKHJlc291cmNlRGF0YSAtPiBkZXJpdmVkRnJvbUxpc3QuYWRkKCgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSByZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5nZXRUb3NjYVJlc291cmNlTmFtZSgpKSk7CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldFJlc291cmNlTGFzdE1vZGlmaWVyRnJvbUdyYXBoKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFVzZXJEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQYXJlbnROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHJlc291cmNlSWQsIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSLCBOb2RlVHlwZUVudW0uVXNlciwKKwkJCQlVc2VyRGF0YS5jbGFzcyk7CisJCWlmIChwYXJlbnROb2RlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIHBhcmVudE5vZGUucmlnaHQoKS52YWx1ZSgpOworCQl9CisKKwkJSW1tdXRhYmxlUGFpcjxVc2VyRGF0YSwgR3JhcGhFZGdlPiB2YWx1ZSA9IHBhcmVudE5vZGUubGVmdCgpLnZhbHVlKCk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiRm91bmQgcGFyZW50IG5vZGUge30iLCB2YWx1ZSk7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gdmFsdWUuZ2V0S2V5KCk7CisKKwkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQlsb2cuZGVidWcoIkJ1aWxkIHJlc291cmNlIDogc2V0IGxhc3QgbW9kaWZpZXIgdXNlcklkIHRvIHt9IiwgdXNlckRhdGEuZ2V0VXNlcklkKCkpOworCQl9CisKKwkJU3RyaW5nIGZ1bGxOYW1lID0gYnVpbGRGdWxsTmFtZSh1c2VyRGF0YSk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQnVpbGQgcmVzb3VyY2UgOiBzZXQgbGFzdCBtb2RpZmllciBmdWxsIG5hbWUgdG8ge30iLCBmdWxsTmFtZSk7CisJCXJlc291cmNlLnNldExhc3RVcGRhdGVyVXNlcklkKHVzZXJEYXRhLmdldFVzZXJJZCgpKTsKKwkJcmVzb3VyY2Uuc2V0TGFzdFVwZGF0ZXJGdWxsTmFtZShmdWxsTmFtZSk7CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0UmVzb3VyY2VDcmVhdG9yRnJvbUdyYXBoKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcmVzb3VyY2VJZCkgeworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPFVzZXJEYXRhLCBHcmFwaEVkZ2U+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyZW50Tm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRQYXJlbnROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHJlc291cmNlSWQsIEdyYXBoRWRnZUxhYmVscy5DUkVBVE9SLCBOb2RlVHlwZUVudW0uVXNlciwgVXNlckRhdGEuY2xhc3MpOworCQlpZiAocGFyZW50Tm9kZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgdGhlIGNyZWF0b3Igb2YgcmVzb3VyY2Uge30iLCByZXNvdXJjZUlkKTsKKwkJCXJldHVybiBwYXJlbnROb2RlLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCisJCUltbXV0YWJsZVBhaXI8VXNlckRhdGEsIEdyYXBoRWRnZT4gdmFsdWUgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkZvdW5kIHBhcmVudCBub2RlIHt9IiwgdmFsdWUpOworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IHZhbHVlLmdldEtleSgpOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCWxvZy5kZWJ1ZygiQnVpbGQgcmVzb3VyY2UgOiBzZXQgY3JlYXRvciB1c2VySWQgdG8ge30iLCB1c2VyRGF0YS5nZXRVc2VySWQoKSk7CisJCX0KKwkJU3RyaW5nIGZ1bGxOYW1lID0gYnVpbGRGdWxsTmFtZSh1c2VyRGF0YSk7CisJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKwkJCWxvZy5kZWJ1ZygiQnVpbGQgcmVzb3VyY2UgOiBzZXQgY3JlYXRvciBmdWxsIG5hbWUgdG8ge30iLCBmdWxsTmFtZSk7CisJCXJlc291cmNlLnNldENyZWF0b3JVc2VySWQodXNlckRhdGEuZ2V0VXNlcklkKCkpOworCQlyZXNvdXJjZS5zZXRDcmVhdG9yRnVsbE5hbWUoZnVsbE5hbWUpOworCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRDb21wb25lbnRDYXRlZ29yaWVzRnJvbUdyYXBoKENvbXBvbmVudCByZXNvdXJjZSkgeworCQlTdHJpbmcgdW5pcXVlSWQgPSByZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFN1YkNhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgdW5pcXVlSWQsIEdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2VTdWJjYXRlZ29yeSwgU3ViQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJaWYgKHBhcmVudE5vZGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gcGFyZW50Tm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8U3ViQ2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiBsaXN0VmFsdWUgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQlsb2cuZGVidWcoIlJlc3VsdCBhZnRlciBsb29raW5nIGZvciBzdWJjYXRlZ29yeSBub2RlcyBwb2ludGVkIGJ5IHJlc291cmNlIHt9LiBzdGF0dXMgaXMge30iLCB1bmlxdWVJZCwgbGlzdFZhbHVlKTsKKwkJaWYgKGxpc3RWYWx1ZS5zaXplKCkgPiAxKSB7CisJCQlsb2cuZXJyb3IoIk11bHRpcGxlIGVkZ2VzIGZvdWQgYmV0d2VlbiByZXNvdXJjZSB7fSB0byBzdWJjYXRlZ29yeSBub2Rlcy4iLCB1bmlxdWVJZCk7CisJCX0KKwkJSW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4gdmFsdWUgPSBsaXN0VmFsdWUuZ2V0KDApOworCQlsb2cuZGVidWcoIkZvdW5kIHBhcmVudCBub2RlIHt9IiwgdmFsdWUpOworCisJCVN1YkNhdGVnb3J5RGF0YSBzdWJjYXRlZ29yeURhdGEgPSB2YWx1ZS5nZXRLZXkoKTsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXRlZ29yeU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0UGFyZW50Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2VTdWJjYXRlZ29yeSksIChTdHJpbmcpIHN1YmNhdGVnb3J5RGF0YS5nZXRVbmlxdWVJZCgpLAorCQkJCUdyYXBoRWRnZUxhYmVscy5TVUJfQ0FURUdPUlksIE5vZGVUeXBlRW51bS5SZXNvdXJjZU5ld0NhdGVnb3J5LCBDYXRlZ29yeURhdGEuY2xhc3MpOworCQlpZiAoY2F0ZWdvcnlOb2RlLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIGNhdGVnb3J5Tm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhID0gY2F0ZWdvcnlOb2RlLmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXREZWYgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKGNhdGVnb3J5RGF0YS5nZXRDYXRlZ29yeURhdGFEZWZpbml0aW9uKCkpOworCQlTdWJDYXRlZ29yeURlZmluaXRpb24gc3ViY2F0RGVmID0gbmV3IFN1YkNhdGVnb3J5RGVmaW5pdGlvbihzdWJjYXRlZ29yeURhdGEuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpKTsKKworCQlyZXNvdXJjZS5hZGRDYXRlZ29yeShjYXREZWYsIHN1YmNhdERlZik7CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGJ1aWxkRnVsbE5hbWUoVXNlckRhdGEgdXNlckRhdGEpIHsKKworCQlTdHJpbmcgZnVsbE5hbWUgPSB1c2VyRGF0YS5nZXRGaXJzdE5hbWUoKTsKKwkJaWYgKGZ1bGxOYW1lID09IG51bGwpIHsKKwkJCWZ1bGxOYW1lID0gIiI7CisJCX0gZWxzZSB7CisJCQlmdWxsTmFtZSA9IGZ1bGxOYW1lICsgIiAiOworCQl9CisJCVN0cmluZyBsYXN0TmFtZSA9IHVzZXJEYXRhLmdldExhc3ROYW1lKCk7CisJCWlmIChsYXN0TmFtZSAhPSBudWxsKSB7CisJCQlmdWxsTmFtZSArPSBsYXN0TmFtZTsKKwkJfQorCQlyZXR1cm4gZnVsbE5hbWU7CisJfQorCisJcHJpdmF0ZSBSZXNvdXJjZSBjb252ZXJ0UmVzb3VyY2VEYXRhVG9SZXNvdXJjZShSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEpIHsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGVmaW5pdGlvbiByZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24gPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURlZmluaXRpb24oKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UocmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKTsKKworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlSWQpIHsKKwkJcmV0dXJuIGRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworCisJCXJldHVybiB1cGRhdGVSZXNvdXJjZShyZXNvdXJjZSwgZmFsc2UpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXROdW1iZXJPZlJlc291cmNlc0J5TmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIHJlc291cmNlTmFtZSk7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ2V0UGFyZW50UmVzb3VyY2VzID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBwcm9wZXJ0aWVzVG9NYXRjaCwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlsb2cuZGVidWcoInJlc3VsdCBhZnRlciBzZWFyY2hpbmcgZm9yIHJlc291cmNlcyBjYWxsZWQgIiArIHJlc291cmNlTmFtZSArICIgaXMgIiArIGdldFBhcmVudFJlc291cmNlcyk7CisJCWlmIChnZXRQYXJlbnRSZXNvdXJjZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhblN0YXR1cyA9IGdldFBhcmVudFJlc291cmNlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAodGl0YW5TdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmRlYnVnKCJOdW1iZXIgb2YgcmV0dXJuZWQgcmVzb3VyY2VzIGlzIDAuIik7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KDApOworCQkJfQorCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHRpdGFuU3RhdHVzKSk7CisJCX0gZWxzZSB7CisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiB2YWx1ZSA9IGdldFBhcmVudFJlc291cmNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCWludCBudW1iZXJPRlJlc291cmNlcyA9ICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLnNpemUoKSk7CisJCQlsb2cuZGVidWcoIlRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHJldHVybmVkIGFmdGVyIHNlYXJjaGluZyBmb3IgcmVzb3VyY2UgY2FsbGVkICIgKyByZXNvdXJjZU5hbWUgKyAiIGlzICIgKyBudW1iZXJPRlJlc291cmNlcyk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQobnVtYmVyT0ZSZXNvdXJjZXMpOworCQl9CisJfQorCisJcHVibGljIFByb3BlcnR5T3BlcmF0aW9uIGdldFByb3BlcnR5T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gcHJvcGVydHlPcGVyYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHlPcGVyYXRpb24oUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb24pIHsKKwkJdGhpcy5wcm9wZXJ0eU9wZXJhdGlvbiA9IHByb3BlcnR5T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBSZXF1aXJlbWVudE9wZXJhdGlvbiBnZXRSZXF1aXJlbWVudE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIHJlcXVpcmVtZW50T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50T3BlcmF0aW9uKFJlcXVpcmVtZW50T3BlcmF0aW9uIHJlcXVpcmVtZW50T3BlcmF0aW9uKSB7CisJCXRoaXMucmVxdWlyZW1lbnRPcGVyYXRpb24gPSByZXF1aXJlbWVudE9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgQ2FwYWJpbGl0eU9wZXJhdGlvbiBnZXRDYXBhYmlsaXR5T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5T3BlcmF0aW9uKENhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbikgeworCQl0aGlzLmNhcGFiaWxpdHlPcGVyYXRpb24gPSBjYXBhYmlsaXR5T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBJQXJ0aWZhY3RPcGVyYXRpb24gZ2V0QXJ0aWZhY3RPcGVyYXRpb24oKSB7CisJCXJldHVybiBhcnRpZmFjdE9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdE9wZXJhdGlvbihJQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb24pIHsKKwkJdGhpcy5hcnRpZmFjdE9wZXJhdGlvbiA9IGFydGlmYWN0T3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24gZ2V0SW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uKCkgeworCQlyZXR1cm4gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbihJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uKSB7CisJCXRoaXMuaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uID0gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBUaXRhbkdlbmVyaWNEYW8gZ2V0VGl0YW5HZW5lcmljRGFvKCkgeworCQlyZXR1cm4gdGl0YW5HZW5lcmljRGFvOworCX0KKworCXB1YmxpYyBJRWxlbWVudE9wZXJhdGlvbiBnZXRFbGVtZW50T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gZWxlbWVudE9wZXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbGVtZW50T3BlcmF0aW9uKElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb24pIHsKKwkJdGhpcy5lbGVtZW50T3BlcmF0aW9uID0gZWxlbWVudE9wZXJhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIHRpdGFuR2VuZXJpY0RhbworCSAqLworCXB1YmxpYyB2b2lkIHNldFRpdGFuR2VuZXJpY0RhbyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvKSB7CisJCXRoaXMudGl0YW5HZW5lcmljRGFvID0gdGl0YW5HZW5lcmljRGFvOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEFsbENlcnRpZmllZFJlc291cmNlcyhib29sZWFuIGlzQWJzdHJhY3QpIHsKKworCQlyZXR1cm4gZ2V0QWxsQ2VydGlmaWVkUmVzb3VyY2VzKGlzQWJzdHJhY3QsIG51bGwpOworCisJfQorCisJQE92ZXJyaWRlCisJLyoqCisJICogRGVsZXRlcyB0aGUgcmVzb3VyY2Ugbm9kZSwgcHJvcGVydHkgbm9kZXMgYW5kIHJlbGF0aW9uIHRvIGFydGlmYWN0cy4gTVVTVCBoYW5kbGUgZGVsZXRpb24gb2YgYXJ0aWZhY3QgZnJvbSBhcnRpZmFjdHMgcmVwb3NpdG9yeSBvdXRzaWRlIHRoaXMgbWV0aG9kIChpbiBjYXRhbG9nLWJlKQorCSAqLworCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl0cnkgeworCisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGhSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZ3JhcGhSZXN1bHQucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVGl0YW5HcmFwaCB0aXRhbkdyYXBoID0gZ3JhcGhSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGVjaWVzID0gdGl0YW5HcmFwaC5xdWVyeSgpLmhhcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkKS52ZXJ0aWNlcygpOworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUVpdGhlciA9IGdldFJlc291cmNlKHJlc291cmNlSWQsIHRydWUpOworCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZUVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKwkJCWlmICh2ZXJ0ZWNpZXMgIT0gbnVsbCAmJiByZXNvdXJjZUVpdGhlci5pc0xlZnQoKSkgeworCQkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRlY2llcy5pdGVyYXRvcigpOworCQkJCWlmIChpdGVyYXRvciAhPSBudWxsICYmIGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQlWZXJ0ZXggcm9vdFZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZGVsZXRlQ2hpbGRyZW5Ob2RlcyA9IGdyYXBoRGVsZXRlVXRpbC5kZWxldGVDaGlsZHJlbk5vZGVzKHJvb3RWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWSk7CisJCQkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgcHJvcGVydGllcyBub2RlcyBpbiB0aGUgZ3JhcGguIHN0YXR1cyBpcyAiICsgZGVsZXRlQ2hpbGRyZW5Ob2Rlcyk7CisJCQkJCWlmIChkZWxldGVDaGlsZHJlbk5vZGVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhkZWxldGVDaGlsZHJlbk5vZGVzKSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlSW50ZXJmYWNlc0Zyb21SZXNvdXJjZSA9IHJlbW92ZUludGVyZmFjZXNGcm9tUmVzb3VyY2UocmVzb3VyY2UpOworCQkJCQlsb2cuZGVidWcoIkFmdGVyIGRlbGV0aW5nIGludGVyZmFjZXMgbm9kZXMgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlbW92ZUludGVyZmFjZXNGcm9tUmVzb3VyY2UpOworCQkJCQlpZiAoIXJlbW92ZUludGVyZmFjZXNGcm9tUmVzb3VyY2UuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVtb3ZlSW50ZXJmYWNlc0Zyb21SZXNvdXJjZSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlQXJ0aWZhY3RzRnJvbVJlc291cmNlID0gcmVtb3ZlQXJ0aWZhY3RzRnJvbVJlc291cmNlKHJlc291cmNlKTsKKwkJCQkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBhcnRpZmFjdHMgbm9kZXMgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlbW92ZUFydGlmYWN0c0Zyb21SZXNvdXJjZSk7CisJCQkJCWlmICghcmVtb3ZlQXJ0aWZhY3RzRnJvbVJlc291cmNlLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUFydGlmYWN0c0Zyb21SZXNvdXJjZSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlQ2FwYWJpbGl0aWVzRnJvbVJlc291cmNlID0gcmVtb3ZlQ2FwYWJpbGl0aWVzRnJvbVJlc291cmNlKHJlc291cmNlKTsKKwkJCQkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBjYXBhYmlsaXRpZXMgbm9kZXMgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlbW92ZUNhcGFiaWxpdGllc0Zyb21SZXNvdXJjZSk7CisJCQkJCWlmICghcmVtb3ZlQ2FwYWJpbGl0aWVzRnJvbVJlc291cmNlLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUNhcGFiaWxpdGllc0Zyb21SZXNvdXJjZSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVSZXF1aXJlbWVudHNGcm9tUmVzb3VyY2UgPSByZW1vdmVSZXF1aXJlbWVudHNGcm9tUmVzb3VyY2UocmVzb3VyY2UpOworCQkJCQlsb2cuZGVidWcoIkFmdGVyIGRlbGV0aW5nIHJlcXVpcmVtZW50cyBub2RlcyBpbiB0aGUgZ3JhcGguIHN0YXR1cyBpcyAiICsgcmVtb3ZlUmVxdWlyZW1lbnRzRnJvbVJlc291cmNlKTsKKwkJCQkJaWYgKCFyZW1vdmVSZXF1aXJlbWVudHNGcm9tUmVzb3VyY2UuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVtb3ZlUmVxdWlyZW1lbnRzRnJvbVJlc291cmNlKTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKworCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlbW92ZVJJc0Zyb21SZXNvdXJjZSA9IHJlbW92ZVJlc291cmNlSW5zdGFuY2VGcm9tUmVzb3VyY2UocmVzb3VyY2UpOworCQkJCQlsb2cuZGVidWcoIkFmdGVyIGRlbGV0aW5nIHJlc291cmNlIGluc3RhbmNlIG5vZGVzIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyByZW1vdmVSSXNGcm9tUmVzb3VyY2UpOworCQkJCQlpZiAoIXJlbW92ZVJJc0Zyb21SZXNvdXJjZS5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZW1vdmVSSXNGcm9tUmVzb3VyY2UpOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlQXR0cmlidXRlc0Zyb21SZXNvdXJjZSA9IHJlbW92ZUF0dHJpYnV0ZXNGcm9tUmVzb3VyY2UocmVzb3VyY2UpOworCQkJCQlsb2cuZGVidWcoIkFmdGVyIGRlbGV0aW5nIHJlcXVpcmVtZW50cyBub2RlcyBpbiB0aGUgZ3JhcGguIHN0YXR1cyBpcyAiICsgcmVtb3ZlUmVxdWlyZW1lbnRzRnJvbVJlc291cmNlKTsKKwkJCQkJaWYgKHJlbW92ZUF0dHJpYnV0ZXNGcm9tUmVzb3VyY2UgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUF0dHJpYnV0ZXNGcm9tUmVzb3VyY2UpOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlSW5wdXRzRnJvbVJlc291cmNlID0gcmVtb3ZlSW5wdXRzRnJvbUNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlKTsKKwkJCQkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyByZXF1aXJlbWVudHMgbm9kZXMgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlbW92ZUlucHV0c0Zyb21SZXNvdXJjZSk7CisJCQkJCWlmIChyZW1vdmVJbnB1dHNGcm9tUmVzb3VyY2UgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUlucHV0c0Zyb21SZXNvdXJjZSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVBZGRpdGlvbmFsSW5mb3JtYXRpb25Gcm9tUmVzb3VyY2UgPSBzdXBlci5kZWxldGVBZGRpdGlvbmFsSW5mb3JtYXRpb24oTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5vZGUgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlbW92ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkZyb21SZXNvdXJjZSk7CisJCQkJCWlmICghcmVtb3ZlQWRkaXRpb25hbEluZm9ybWF0aW9uRnJvbVJlc291cmNlLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkZyb21SZXNvdXJjZSk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVHcm91cHNGcm9tUmVzb3VyY2UgPSBzdXBlci5kZWxldGVHcm91cHMoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJbG9nLmRlYnVnKCJBZnRlciBkZWxldGluZyBncm91cCBub2RlcyBpbiB0aGUgZ3JhcGguIHN0YXR1cyBpcyAiICsgcmVtb3ZlR3JvdXBzRnJvbVJlc291cmNlKTsKKwkJCQkJaWYgKCFyZW1vdmVHcm91cHNGcm9tUmVzb3VyY2UuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQocmVtb3ZlR3JvdXBzRnJvbVJlc291cmNlKTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKworCQkJCQlyb290VmVydGV4LnJlbW92ZSgpOworCisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJkZWxldGVSZXNvdXJjZSBvcGVyYXRpb24gOiBHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoImRlbGV0ZVJlc291cmNlIG9wZXJhdGlvbiA6IEdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlQXR0cmlidXRlc0Zyb21SZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworCQlFaXRoZXI8TWFwPFN0cmluZywgQXR0cmlidXRlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbEF0dHJpYnV0ZUFzc29jaWF0ZWRUb05vZGUgPSBhdHRyaWJ1dGVPcGVyYXRpb24uZGVsZXRlQWxsQXR0cmlidXRlQXNzb2NpYXRlZFRvTm9kZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlyZXR1cm4gZGVsZXRlQWxsQXR0cmlidXRlQXNzb2NpYXRlZFRvTm9kZS5pc1JpZ2h0KCkgPyBkZWxldGVBbGxBdHRyaWJ1dGVBc3NvY2lhdGVkVG9Ob2RlLnJpZ2h0KCkudmFsdWUoKSA6IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlbW92ZUFydGlmYWN0c0Zyb21SZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworCisJCVN0cmluZyByZXNvdXJjZUlkID0gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhbGxBcnRpZmFjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJaWYgKHJlc291cmNlLmdldEFydGlmYWN0cygpICE9IG51bGwpIHsKKwkJCWFsbEFydGlmYWN0cy5wdXRBbGwocmVzb3VyY2UuZ2V0QXJ0aWZhY3RzKCkpOworCQl9CisJCWlmIChyZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkgIT0gbnVsbCkgeworCQkJYWxsQXJ0aWZhY3RzLnB1dEFsbChyZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkpOworCQl9CisJCWlmIChhbGxBcnRpZmFjdHMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBhbGxBcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCisJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVtb3ZlQXJpZmFjdEZyb21SZXNvdXJjZSA9IGFydGlmYWN0T3BlcmF0aW9uLnJlbW92ZUFyaWZhY3RGcm9tUmVzb3VyY2UocmVzb3VyY2VJZCwgYXJ0aWZhY3REZWZpbml0aW9uLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSwgdHJ1ZSk7CisJCQkJaWYgKHJlbW92ZUFyaWZhY3RGcm9tUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJCXJldHVybiByZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlbW92ZUludGVyZmFjZXNGcm9tUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCS8vIGRlbGV0ZSBvbmx5IGludGVyZmFjZXMgb2YgdGhpcyByZXNvdXJjZSAobm90IGludGVyZmFjZXMgZGVyaXZlZCkKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhbGxJbnRlcmZhY2VzT2ZSZXNvdXJjZSA9IGludGVyZmFjZUxpZmVjeWNsZU9wZXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzT2ZSZXNvdXJjZShyZXNvdXJjZUlkLCBmYWxzZSwgdHJ1ZSk7CisJCWlmIChhbGxJbnRlcmZhY2VzT2ZSZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCBpbnRlcmZhY2VzIGZvciByZXNvdXJjZSB7fS4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgYWxsSW50ZXJmYWNlc09mUmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBhbGxJbnRlcmZhY2VzT2ZSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCk7CisJCX0KKwkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50ZXJmYWNlcyA9IGFsbEludGVyZmFjZXNPZlJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gZW50cnkgOiBpbnRlcmZhY2VzLmVudHJ5U2V0KCkpIHsKKwkJCQlCb29sZWFuIGlzQWJzdHJhY3QgPSByZXNvdXJjZS5pc0Fic3RyYWN0KCk7CisKKwkJCQlJbnRlcmZhY2VEZWZpbml0aW9uIGludGVyZmFjZURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCS8vIGVzb2ZlciAtIGluIGNhc2UgdGhlIHJlc291cmNlIGlzIGFic3RyYWN0LCB3ZSBkZWxldGluZyBvbmx5CisJCQkJLy8gdGhlIGVkZ2UgdG8gdGhlIGludGVyZmFjZS4KKwkJCQlpZiAoaXNBYnN0cmFjdCAhPSBudWxsICYmIHRydWUgPT0gaXNBYnN0cmFjdC5ib29sZWFuVmFsdWUoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGRpc3NvY2lhdGUgcmVzb3VyY2Uge30gZnJvbSBpbnRlcmZhY2Uge30iLCByZXNvdXJjZUlkLCBpbnRlcmZhY2VEZWZpbml0aW9uLmdldFVuaXF1ZUlkKCkpOworCQkJCQlVbmlxdWVJZERhdGEgdW5pcXVlSWREYXRhID0gbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc291cmNlSWQpOworCQkJCQlFaXRoZXI8SW50ZXJmYWNlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGlzc29jaWF0ZUludGVyZmFjZUZyb21Ob2RlID0gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmRpc3NvY2lhdGVJbnRlcmZhY2VGcm9tTm9kZSh1bmlxdWVJZERhdGEsIGludGVyZmFjZURlZmluaXRpb24pOworCQkJCQlpZiAoZGlzc29jaWF0ZUludGVyZmFjZUZyb21Ob2RlLmlzUmlnaHQoKSkgeworCQkJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZGlzc29jaWF0ZSByZXNvdXJjZSB7fSBmcm9tIGludGVyZmFjZSB7fS4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgaW50ZXJmYWNlRGVmaW5pdGlvbi5nZXRVbmlxdWVJZCgpLCBkaXNzb2NpYXRlSW50ZXJmYWNlRnJvbU5vZGUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJCXJldHVybiBkaXNzb2NpYXRlSW50ZXJmYWNlRnJvbU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUludGVyZmFjZU9mUmVzb3VyY2VPbkdyYXBoID0gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmRlbGV0ZUludGVyZmFjZU9mUmVzb3VyY2VPbkdyYXBoKHJlc291cmNlSWQsIGludGVyZmFjZURlZmluaXRpb24sIHRydWUpOworCQkJCQlpZiAoZGVsZXRlSW50ZXJmYWNlT2ZSZXNvdXJjZU9uR3JhcGguaXNSaWdodCgpKSB7CisJCQkJCQlyZXR1cm4gZGVsZXRlSW50ZXJmYWNlT2ZSZXNvdXJjZU9uR3JhcGgucmlnaHQoKS52YWx1ZSgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVDYXBhYmlsaXRpZXNGcm9tUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQWxsUmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5kZWxldGVBbGxDYXBhYmlsaXRpZXMocmVzb3VyY2VJZCwgdHJ1ZSk7CisJCWlmIChkZWxldGVBbGxSZXMuaXNSaWdodCgpKSB7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGRlbGV0ZUFsbFJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAoc3RhdHVzID09IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgcmVtb3ZlUmVxdWlyZW1lbnRzRnJvbVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7CisKKwkJU3RyaW5nIHJlc291cmNlSWQgPSByZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBSZXF1aXJlbWVudERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxSZXMgPSByZXF1aXJlbWVudE9wZXJhdGlvbi5kZWxldGVBbGxSZXF1aXJlbWVudHMocmVzb3VyY2VJZCwgdHJ1ZSk7CisKKwkJaWYgKGRlbGV0ZUFsbFJlcy5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlQWxsUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJCX0KKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCXByaXZhdGUgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVSZXNvdXJjZUluc3RhbmNlRnJvbVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7CisJCVN0cmluZyByZXNvdXJjZUlkID0gcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFJlc291cmNlSW5zdGFuY2VzUmVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uZGVsZXRlQWxsQ29tcG9uZW50SW5zdGFuY2VzKHJlc291cmNlSWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSk7CisJCWlmIChkZWxldGVBbGxSZXNvdXJjZUluc3RhbmNlc1Jlcy5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlQWxsUmVzb3VyY2VJbnN0YW5jZXNSZXMucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQkJfQorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlyZXR1cm4gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgdXBkYXRlQ29tcG9uZW50KHJlc291cmNlLCBpblRyYW5zYWN0aW9uLCB0aXRhbkdlbmVyaWNEYW8sIHJlc291cmNlLmdldENsYXNzKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDb21wb25lbnQ+IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlRGVyaXZlZChDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnQgY3VycmVudENvbXBvbmVudCwgQ29tcG9uZW50TWV0YWRhdGFEYXRhIHVwZGF0ZWRSZXNvdXJjZURhdGEsIENsYXNzPFQ+IGNsYXp6KSB7CisJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBjb21wb25lbnQ7CisJCVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IChSZXNvdXJjZSkgY3VycmVudENvbXBvbmVudDsKKwkJaWYgKHJlc291cmNlLmdldERlcml2ZWRGcm9tKCkgIT0gbnVsbCkgey8vIG1lYW5pbmcgZGVyaXZlZCBmcm9tIGNoYW5nZWQKKworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmaW5kRGVyaXZlZFJlc291cmNlc09sZCA9IGZpbmREZXJpdmVkUmVzb3VyY2VzKGN1cnJlbnRSZXNvdXJjZSk7CisJCQlpZiAoZmluZERlcml2ZWRSZXNvdXJjZXNPbGQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJDb3VsZG4ndCBmaW5kIGRlcml2ZWQgcmVzb3VyY2Uge30gZm9yIGN1cnJlbnQgcmVzb3VyY2UgaW4gdGhlIGdyYXBoIiwgY3VycmVudFJlc291cmNlLmdldERlcml2ZWRGcm9tKCkuZ2V0KDApKTsKKwkJCQlyZXR1cm4gZmluZERlcml2ZWRSZXNvdXJjZXNPbGQucmlnaHQoKS52YWx1ZSgpOworCQkJfQorCisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBvbGREZXJpdmVkID0gZmluZERlcml2ZWRSZXNvdXJjZXNPbGQubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAob2xkRGVyaXZlZC5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuZGVidWcoIkRlcml2ZWQgZnJvbSBsaXN0IGZldGNoZWQgZnJvbSBEQiBmb3IgY3VycmVudCByZXNvdXJjZSBpcyBlbXB0eSIpOworCQkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQ7CisJCQl9CisKKwkJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmluZERlcml2ZWRSZXNvdXJjZXNOZXcgPSBmaW5kRGVyaXZlZFJlc291cmNlcygoUmVzb3VyY2UpIHJlc291cmNlKTsKKwkJCWlmIChmaW5kRGVyaXZlZFJlc291cmNlc05ldy5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkNvdWxkbid0IGZpbmQgZGVyaXZlZCByZXNvdXJjZSB7fSBmb3IgdXBkYXRlIHJlc291cmNlIGluIHRoZSBncmFwaCIsIHJlc291cmNlLmdldERlcml2ZWRGcm9tKCkuZ2V0KDApKTsKKwkJCQlyZXR1cm4gZmluZERlcml2ZWRSZXNvdXJjZXNOZXcucmlnaHQoKS52YWx1ZSgpOworCQkJfQorCisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBuZXdEZXJpdmVkID0gZmluZERlcml2ZWRSZXNvdXJjZXNOZXcubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAobmV3RGVyaXZlZC5pc0VtcHR5KCkpIHsKKwkJCQlsb2cuZGVidWcoIkRlcml2ZWQgZnJvbSBsaXN0IGZldGNoZWQgZnJvbSBEQiBmb3IgdXBkYXRlZCByZXNvdXJjZSBpcyBlbXB0eSIpOworCQkJCXJldHVybiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQ7CisJCQl9CisKKwkJCUVpdGhlcjxCb29sZWFuLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVhc3NvY2lhdGVEZXJpdmVkRnJvbSA9IHJlYXNzb2NpYXRlRGVyaXZlZEZyb20oKFJlc291cmNlTWV0YWRhdGFEYXRhKSB1cGRhdGVkUmVzb3VyY2VEYXRhLCBvbGREZXJpdmVkLCBuZXdEZXJpdmVkKTsKKwkJCWlmIChyZWFzc29jaWF0ZURlcml2ZWRGcm9tLmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiQ291bGRuJ3QgY2hhbmdlIGRlcml2ZWQgZnJvbSBmb3IgdGhlIHJlc291cmUiKTsKKwkJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhyZWFzc29jaWF0ZURlcml2ZWRGcm9tLnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8Qm9vbGVhbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlYXNzb2NpYXRlRGVyaXZlZEZyb20oUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhLCBMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBvbGREZXJpdmVkLCBMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBuZXdEZXJpdmVkKSB7CisJCVJlc291cmNlTWV0YWRhdGFEYXRhIG9sZERlcml2ZWROb2RlID0gb2xkRGVyaXZlZC5nZXQoMCk7CisJCWxvZy5kZWJ1ZygiRGlzc29jaWF0aW5nIHJlc291cmNlIHt9IGZyb20gb2xkIHBhcmVudCByZXNvdXJjZSB7fSIsIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpLCBvbGREZXJpdmVkTm9kZS5nZXRVbmlxdWVJZCgpKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0Rhby5kZWxldGVSZWxhdGlvbihyZXNvdXJjZURhdGEsIG9sZERlcml2ZWROb2RlLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NKTsKKwkJaWYgKGRlbGV0ZVJlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZGlzc29jaWF0ZSByZXNvdXJjZSB7fSBmcm9tIG9sZCBwYXJlbnQgcmVzb3VyY2Uge30iLCByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSwgb2xkRGVyaXZlZE5vZGUuZ2V0VW5pcXVlSWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGRlbGV0ZVJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgbmV3RGVyaXZlZE5vZGUgPSBuZXdEZXJpdmVkLmdldCgwKTsKKwkJbG9nLmRlYnVnKCJBc3NvY2lhdGluZyByZXNvdXJjZSB7fSB3aXRoIG5ldyBwYXJlbnQgcmVzb3VyY2Uge30iLCByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSwgbmV3RGVyaXZlZE5vZGUuZ2V0VW5pcXVlSWQoKSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWRkUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24ocmVzb3VyY2VEYXRhLCBuZXdEZXJpdmVkTm9kZSwgR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgbnVsbCk7CisJCWlmIChhZGRSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGFzc29jaWF0ZSByZXNvdXJjZSB7fSB3aXRoIG5ldyBwYXJlbnQgcmVzb3VyY2Uge30iLCByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSwgbmV3RGVyaXZlZE5vZGUuZ2V0VW5pcXVlSWQoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGFkZFJlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIG1vdmVDYXRlZ29yeUVkZ2UoUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSwgQ2F0ZWdvcnlEZWZpbml0aW9uIG5ld0NhdGVnb3J5KSB7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCisJCUdyYXBoUmVsYXRpb24gY2F0ZWdvcnlSZWxhdGlvbiA9IG5ldyBHcmFwaFJlbGF0aW9uKCk7CisJCWNhdGVnb3J5UmVsYXRpb24uc2V0VHlwZShHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlkuZ2V0UHJvcGVydHkoKSk7CisJCVJlbGF0aW9uRW5kUG9pbnQgcmVsYXRpb25FbmRQb2ludCA9IG5ldyBSZWxhdGlvbkVuZFBvaW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWNhdGVnb3J5UmVsYXRpb24uc2V0RnJvbShyZWxhdGlvbkVuZFBvaW50KTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVPdXRnb2luZ1JlbGF0aW9uID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU91dGdvaW5nUmVsYXRpb24oY2F0ZWdvcnlSZWxhdGlvbik7CisJCWlmIChkZWxldGVPdXRnb2luZ1JlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIGNhdGVnb3J5IGZyb20gcmVzb3VyY2UgIiArIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpICsgIi4gRWRnZSB0eXBlIGlzICIgKyBHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlkpOworCQkJcmVzdWx0ID0gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhkZWxldGVPdXRnb2luZ1JlbGF0aW9uLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJbG9nLmRlYnVnKCJBZnRlciByZW1vdmluZyBlZGdlIGZyb20gZ3JhcGggIiArIGRlbGV0ZU91dGdvaW5nUmVsYXRpb24pOworCisJCXJldHVybiBhc3Nvc2lhdGVNZXRhZGF0YVRvQ2F0ZWdvcnkocmVzb3VyY2UsIHJlc291cmNlRGF0YSk7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIG1vdmVMYXN0TW9kaWZpZXJFZGdlKFJlc291cmNlIHJlc291cmNlLCBSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEsIFVzZXJEYXRhIG1vZGlmaWVyVXNlckRhdGEpIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwkJR3JhcGhSZWxhdGlvbiBsYXN0TW9kaWZpZXJSZWxhdGlvbiA9IG5ldyBHcmFwaFJlbGF0aW9uKCk7CisJCWxhc3RNb2RpZmllclJlbGF0aW9uLnNldFR5cGUoR3JhcGhFZGdlTGFiZWxzLkxBU1RfTU9ESUZJRVIuZ2V0UHJvcGVydHkoKSk7CisJCVJlbGF0aW9uRW5kUG9pbnQgcmVsYXRpb25FbmRQb2ludCA9IG5ldyBSZWxhdGlvbkVuZFBvaW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlKSwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWxhc3RNb2RpZmllclJlbGF0aW9uLnNldFRvKHJlbGF0aW9uRW5kUG9pbnQpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUluY29taW5nUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uZGVsZXRlSW5jb21pbmdSZWxhdGlvbihsYXN0TW9kaWZpZXJSZWxhdGlvbik7CisJCWlmIChkZWxldGVJbmNvbWluZ1JlbGF0aW9uLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIHVzZXIgZnJvbSByZXNvdXJjZSAiICsgcmVzb3VyY2VEYXRhLmdldFVuaXF1ZUlkKCkgKyAiLiBFZGdlIHR5cGUgaXMgIiArIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSKTsKKwkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoZGVsZXRlSW5jb21pbmdSZWxhdGlvbi5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24obW9kaWZpZXJVc2VyRGF0YSwgcmVzb3VyY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9NT0RJRklFUiwgbnVsbCk7CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcgdXNlciAiICsgbW9kaWZpZXJVc2VyRGF0YSArICIgdG8gcmVzb3VyY2UgIiArIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpICsgIi4gRWRnZSB0eXBlIGlzICIgKyBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9NT0RJRklFUik7CisJCWlmIChjcmVhdGVSZWxhdGlvbi5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGFzc29jaWF0ZSB1c2VyICIgKyBtb2RpZmllclVzZXJEYXRhICsgIiB0byByZXNvdXJjZSAiICsgcmVzb3VyY2VEYXRhLmdldFVuaXF1ZUlkKCkgKyAiLiBFZGdlIHR5cGUgaXMgIiArIEdyYXBoRWRnZUxhYmVscy5MQVNUX01PRElGSUVSKTsKKwkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoY3JlYXRlUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkKSB7CisKKwkJU3RyaW5nIGtleSA9IFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCUVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRSZXNvdXJjZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKGtleSwgcmVzb3VyY2VJZCwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCXJldHVybiBmaW5kUmVzb3VyY2U7CisJfQorCisJcHJpdmF0ZSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldEFydGlmYWN0RnJvbUdyYXBoKFN0cmluZyB1bmlxdWVJZCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZXN1bHQgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQlFaXRoZXI8TWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RzID0gYXJ0aWZhY3RPcGVyYXRpb24uZ2V0QXJ0aWZhY3RzKHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUpOworCQlpZiAoYXJ0aWZhY3RzLmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gYXJ0aWZhY3RzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfSBlbHNlIHsKKwkJCWNyZWF0ZVNwZWNpZmljQXJ0aWZhY3RMaXN0KHJlc291cmNlLCBhcnRpZmFjdHMubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgQ29tcG9uZW50PiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50KFN0cmluZyBpZCwgQ2xhc3M8VD4gY2xhenopIHsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudCA9IGdldFJlc291cmNlKGlkKTsKKwkJaWYgKGNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGNsYXp6LmNhc3QoY29tcG9uZW50LmxlZnQoKS52YWx1ZSgpKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZVJlc291cmNlTmFtZUV4aXN0cyhTdHJpbmcgcmVzb3VyY2VOYW1lLCBSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSkgeworCQlpZiAocmVzb3VyY2VUeXBlICE9IG51bGwpIHsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJcHJvcGVydGllcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVNPVVJDRV9UWVBFLmdldFByb3BlcnR5KCksIFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKwkJCWlmIChyZXNvdXJjZVR5cGUuZXF1YWxzKFJlc291cmNlVHlwZUVudW0uVkYpKSB7CisJCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2VOYW1lVW5pcXVlbmVzcyhyZXNvdXJjZU5hbWUsIHByb3BlcnRpZXMsIG51bGwsIHRpdGFuR2VuZXJpY0Rhbyk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlTmFtZVVuaXF1ZW5lc3MocmVzb3VyY2VOYW1lLCBudWxsLCBwcm9wZXJ0aWVzLCB0aXRhbkdlbmVyaWNEYW8pOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdmFsaWRhdGVSZXNvdXJjZU5hbWVVbmlxdWVuZXNzKHJlc291cmNlTmFtZSwgbnVsbCwgbnVsbCwgdGl0YW5HZW5lcmljRGFvKTsKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZVRvc2NhUmVzb3VyY2VOYW1lRXhpc3RzKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKKwkJcmV0dXJuIHZhbGlkYXRlVG9zY2FSZXNvdXJjZU5hbWVVbmlxdWVuZXNzKHRlbXBsYXRlTmFtZSwgdGl0YW5HZW5lcmljRGFvKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWRkaXRpb25hbEFydGlmYWN0cyhTdHJpbmcgcmVzb3VyY2VJZCwgYm9vbGVhbiByZWN1cnNpdmVseSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUxpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlFaXRoZXI8TWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGludGVyZmFjZXNPZlJlc291cmNlID0gaW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uLmdldEFsbEludGVyZmFjZXNPZlJlc291cmNlKHJlc291cmNlSWQsIGZhbHNlLCB0cnVlKTsKKwkJaWYgKGludGVyZmFjZXNPZlJlc291cmNlLmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0IGFsbCByZXNvdXJjZSBpbnRlcmZhY2VzLiByZXNvdXJjZSBpZD17fS4gc3RhdHVzID17fSIsIHJlc291cmNlSWQsIGludGVyZmFjZXNPZlJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGludGVyZmFjZXNPZlJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKworCQlNYXA8U3RyaW5nLCBJbnRlcmZhY2VEZWZpbml0aW9uPiBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc09mUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJCWlmIChpbnRlcmZhY2VzICE9IG51bGwgJiYgIWludGVyZmFjZXMuaXNFbXB0eSgpKSB7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gZW50cnkgOiBpbnRlcmZhY2VzLmVudHJ5U2V0KCkpIHsKKworCQkJCUludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQkJTWFwPFN0cmluZywgT3BlcmF0aW9uPiBvcGVyYXRpb25zID0gaW50ZXJmYWNlRGVmaW5pdGlvbi5nZXRPcGVyYXRpb25zKCk7CisJCQkJaWYgKG9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhb3BlcmF0aW9ucy5pc0VtcHR5KCkpIHsKKwkJCQkJZm9yIChFbnRyeTxTdHJpbmcsIE9wZXJhdGlvbj4gb3BFbnRyeSA6IG9wZXJhdGlvbnMuZW50cnlTZXQoKSkgeworCisJCQkJCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BFbnRyeS5nZXRWYWx1ZSgpOworCQkJCQkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0RGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRJbXBsZW1lbnRhdGlvbigpOworCQkJCQkJaWYgKGFydGlmYWN0RGVmaW5pdGlvbiAhPSBudWxsKSB7CisJCQkJCQkJYXJ0aWZhY3RzLmFkZChhcnRpZmFjdERlZmluaXRpb24pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdHMpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEZvbGxvd2VkKFN0cmluZyB1c2VySWQsIFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxpZmVjeWNsZVN0YXRlcywgU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGFzdFN0YXRlU3RhdGVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIChFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRGb2xsb3dlZENvbXBvbmVudCh1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgbGFzdFN0YXRlU3RhdGVzLCBpblRyYW5zYWN0aW9uLCB0aXRhbkdlbmVyaWNEYW8sIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50KFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRSZXNvdXJjZShpZCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJcHJpdmF0ZSBPcHRpb25hbDxJbW11dGFibGVQYWlyPFN1YkNhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPj4gdmFsaWRhdGVDYXRlZ29yeUhpZXJhcmN5KExpc3Q8SW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4+IGNoaWxkTm9kZXMsIFN0cmluZyBzdWJDYXRlZ29yeU5hbWUpIHsKKwkJUHJlZGljYXRlPEltbXV0YWJsZVBhaXI8U3ViQ2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiBtYXRjaE5hbWUgPSBwIC0+IHAuZ2V0TGVmdCgpLmdldFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkuZXF1YWxzKHN1YkNhdGVnb3J5TmFtZSk7CisJCXJldHVybiBjaGlsZE5vZGVzLnN0cmVhbSgpLmZpbHRlcihtYXRjaE5hbWUpLmZpbmRBbnkoKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8U3ViQ2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsU3ViQ2F0ZWdvcmllcyhTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7CisJCUVpdGhlcjxDYXRlZ29yeURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNhdGVnb3J5UmVzdWx0ID0gZWxlbWVudE9wZXJhdGlvbi5nZXROZXdDYXRlZ29yeURhdGEoY2F0ZWdvcnlOYW1lLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VOZXdDYXRlZ29yeSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJaWYgKGNhdGVnb3J5UmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjYXRlZ29yeVJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQl9CisJCUNhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEgPSBjYXRlZ29yeVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFN1YkNhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjaGlsZHJlbk5vZGVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnkpLCAoU3RyaW5nKSBjYXRlZ29yeURhdGEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuU1VCX0NBVEVHT1JZLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VTdWJjYXRlZ29yeSwgU3ViQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJaWYgKGNoaWxkcmVuTm9kZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoY2hpbGRyZW5Ob2Rlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2hpbGRyZW5Ob2Rlcy5sZWZ0KCkudmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBFaXRoZXI8TGlzdDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0RmlsdGVyZWRDb21wb25lbnRzKE1hcDxGaWx0ZXJLZXlFbnVtLCBTdHJpbmc+IGZpbHRlcnMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCVN0cmluZyBzdWJDYXRlZ29yeU5hbWUgPSBmaWx0ZXJzLmdldChGaWx0ZXJLZXlFbnVtLlNVQl9DQVRFR09SWSk7CisJCVN0cmluZyBjYXRlZ29yeU5hbWUgPSBmaWx0ZXJzLmdldChGaWx0ZXJLZXlFbnVtLkNBVEVHT1JZKTsKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdWJjYXRlZ29yaWVzID0gbnVsbDsKKwkJT3B0aW9uYWw8SW1tdXRhYmxlUGFpcjxTdWJDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4+IHN1YkNhdGVnb3J5RGF0YSA9IG51bGw7CisKKwkJaWYgKGNhdGVnb3J5TmFtZSAhPSBudWxsKSB7CisJCQlzdWJjYXRlZ29yaWVzID0gZ2V0QWxsU3ViQ2F0ZWdvcmllcyhjYXRlZ29yeU5hbWUpOworCQkJaWYgKHN1YmNhdGVnb3JpZXMuaXNSaWdodCgpKSB7CisJCQkJZmlsdGVycy5yZW1vdmUoRmlsdGVyS2V5RW51bS5TVUJfQ0FURUdPUlkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3ViY2F0ZWdvcmllcy5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCWlmIChzdWJDYXRlZ29yeU5hbWUgIT0gbnVsbCkgeyAvLyBwcmltYXJ5IGZpbHRlcgorCQkJaWYgKGNhdGVnb3J5TmFtZSAhPSBudWxsKSB7CisJCQkJc3ViQ2F0ZWdvcnlEYXRhID0gdmFsaWRhdGVDYXRlZ29yeUhpZXJhcmN5KHN1YmNhdGVnb3JpZXMubGVmdCgpLnZhbHVlKCksIHN1YkNhdGVnb3J5TmFtZSk7CisJCQkJaWYgKCFzdWJDYXRlZ29yeURhdGEuaXNQcmVzZW50KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk1BVENIX05PVF9GT1VORCk7CisJCQkJfQorCQkJCXJldHVybiBmZXRjaEJ5Q2F0ZWdvcnlPclN1YkNhdGVnb3J5VWlkKChTdHJpbmcpIHN1YkNhdGVnb3J5RGF0YS5nZXQoKS5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlU3ViY2F0ZWdvcnksIEdyYXBoRWRnZUxhYmVscy5TVUJfQ0FURUdPUlkuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBpblRyYW5zYWN0aW9uLAorCQkJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJfQorCisJCQlyZXR1cm4gZmV0Y2hCeUNhdGVnb3J5T3JTdWJDYXRlZ29yeU5hbWUoc3ViQ2F0ZWdvcnlOYW1lLCBOb2RlVHlwZUVudW0uUmVzb3VyY2VTdWJjYXRlZ29yeSwgR3JhcGhFZGdlTGFiZWxzLlNVQl9DQVRFR09SWS5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGluVHJhbnNhY3Rpb24sIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJfQorCQlyZXR1cm4gZmV0Y2hCeU1haW5DYXRlZ29yeShzdWJjYXRlZ29yaWVzLmxlZnQoKS52YWx1ZSgpLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIDxUPiBFaXRoZXI8TGlzdDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hCeU1haW5DYXRlZ29yeShMaXN0PEltbXV0YWJsZVBhaXI8U3ViQ2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiBzdWJjYXRlZ29yaWVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJTGlzdDxUPiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJZm9yIChJbW11dGFibGVQYWlyPFN1YkNhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPiBzdWJDYXRlZ29yeSA6IHN1YmNhdGVnb3JpZXMpIHsKKwkJCUVpdGhlcjxMaXN0PFQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmZXRjaGVkID0gZmV0Y2hCeUNhdGVnb3J5T3JTdWJDYXRlZ29yeVVpZCgoU3RyaW5nKSBzdWJDYXRlZ29yeS5nZXRMZWZ0KCkuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlU3ViY2F0ZWdvcnksIEdyYXBoRWRnZUxhYmVscy5TVUJfQ0FURUdPUlkuZ2V0UHJvcGVydHkoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLAorCQkJCQlpblRyYW5zYWN0aW9uLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAoZmV0Y2hlZC5pc1JpZ2h0KCkpIHsKKwkJCQkvLyByZXR1cm4gZmV0Y2hlZDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNvbXBvbmVudHMuYWRkQWxsKGZldGNoZWQubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChjb21wb25lbnRzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMaWdodENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0TGlnaHRDb21wb25lbnQoaWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJLy8gd2lsbCBiZSBpbXBsZW1lbnQgbGF0ZXIKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9uZW50TWV0YWRhdGFEYXRhIGdldE1ldGFEYXRhRnJvbUNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KSB7CisJCXJldHVybiBnZXRSZXNvdXJjZU1ldGFEYXRhRnJvbVJlc291cmNlKChSZXNvdXJjZSkgY29tcG9uZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFNldDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENhdGFsb2dEYXRhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2gsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0Q29tcG9uZW50Q2F0YWxvZ0RhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBwcm9wZXJ0aWVzVG9NYXRjaCwgUmVzb3VyY2UuY2xhc3MsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwcm90ZWN0ZWQgVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZFJlc291cmNlc1BhdGhSZWN1cnNpdmVseShTdHJpbmcgcmVzb3VyY2VJZCwgTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gcmVzb3VyY2VzUGF0aExpc3QpIHsKKworCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlUmVzID0gdGhpcy50aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKG5vZGVSZXMuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBub2RlUmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHJlc291cmNlIHt9IC4gc3RhdHVzIGlzIHt9IiwgcmVzb3VyY2VJZCwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBub2RlUmVzLmxlZnQoKS52YWx1ZSgpOworCQlyZXNvdXJjZXNQYXRoTGlzdC5hZGQocmVzb3VyY2VEYXRhKTsKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIEdyYXBoRWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnRSZXNvdXJjZVJlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZChVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVzb3VyY2UpLCByZXNvdXJjZUlkLCBHcmFwaEVkZ2VMYWJlbHMuREVSSVZFRF9GUk9NLAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCXdoaWxlIChwYXJlbnRSZXNvdXJjZVJlcy5pc0xlZnQoKSkgeworCisJCQlJbW11dGFibGVQYWlyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBHcmFwaEVkZ2U+IHZhbHVlID0gcGFyZW50UmVzb3VyY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSBwYXJlbnRSZXNvdXJjZURhdGEgPSB2YWx1ZS5nZXRLZXkoKTsKKworCQkJcmVzb3VyY2VzUGF0aExpc3QuYWRkKHBhcmVudFJlc291cmNlRGF0YSk7CisKKwkJCXBhcmVudFJlc291cmNlUmVzID0gdGl0YW5HZW5lcmljRGFvLmdldENoaWxkKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZSksIHBhcmVudFJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLkRFUklWRURfRlJPTSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLAorCQkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCX0KKworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBwYXJlbnRSZXNvdXJjZVJlcy5yaWdodCgpLnZhbHVlKCk7CisKKwkJaWYgKG9wZXJhdGlvblN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCXJldHVybiBvcGVyYXRpb25TdGF0dXM7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCX0KKworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudChUIGNvbXBvbmVudCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSB1cGRhdGVSZXNvdXJjZSgoUmVzb3VyY2UpIGNvbXBvbmVudCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gKEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBkZWxldGVSZXNvdXJjZShpZCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0QnlUb3NjYVJlc291cmNlTmFtZShTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0TGF0ZXN0QnlOYW1lKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVE9TQ0FfUkVTT1VSQ0VfTkFNRS5nZXRQcm9wZXJ0eSgpLCB0b3NjYVJlc291cmNlTmFtZSwgaW5UcmFuc2FjdGlvbik7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXRlc3RCeU5hbWUoU3RyaW5nIHJlc291cmNlTmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRMYXRlc3RCeU5hbWUoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIHJlc291cmNlTmFtZSwgaW5UcmFuc2FjdGlvbik7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0QnlOYW1lKFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHJlc291cmNlTmFtZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCXByb3BzLnB1dChwcm9wZXJ0eSwgcmVzb3VyY2VOYW1lKTsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKworCQkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaGlnaGVzdFJlc291cmNlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcHMsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChoaWdoZXN0UmVzb3VyY2VzLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGhpZ2hlc3RSZXNvdXJjZXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiZmFpbGVkIHRvIGZpbmQgcmVzb3VyY2Ugd2l0aCBuYW1lIHt9LiBzdGF0dXM9e30gIiwgcmVzb3VyY2VOYW1lLCBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IHJlc291cmNlcyA9IGhpZ2hlc3RSZXNvdXJjZXMubGVmdCgpLnZhbHVlKCk7CisJCQlkb3VibGUgdmVyc2lvbiA9IDAuMDsKKwkJCVJlc291cmNlTWV0YWRhdGFEYXRhIGhpZ2hlc3RSZXNvdXJjZSA9IG51bGw7CisJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CisJCQkJZG91YmxlIHJlc291cmNlVmVyc2lvbiA9IERvdWJsZS5wYXJzZURvdWJsZShyZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VmVyc2lvbigpKTsKKwkJCQlpZiAocmVzb3VyY2VWZXJzaW9uID4gdmVyc2lvbikgeworCQkJCQl2ZXJzaW9uID0gcmVzb3VyY2VWZXJzaW9uOworCQkJCQloaWdoZXN0UmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJCQl9CisJCQl9CisJCQlyZXN1bHQgPSBnZXRSZXNvdXJjZShoaWdoZXN0UmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZXJyb3IoImdldExhdGVzdEJ5TmFtZSBvcGVyYXRpb24gOiBHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoImdldExhdGVzdEJ5TmFtZSBvcGVyYXRpb24gOiBHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0VGVzdGVyRm9sbG93ZWQoU3RyaW5nIHVzZXJJZCwgU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIChFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRUZXN0ZXJGb2xsb3dlZENvbXBvbmVudCh1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgaW5UcmFuc2FjdGlvbiwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZUNhdGFsb2dEYXRhKGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VDYXRhbG9nRGF0YShpblRyYW5zYWN0aW9uLCBudWxsKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VDYXRhbG9nRGF0YShib29sZWFuIGluVHJhbnNhY3Rpb24sIE1hcDxTdHJpbmcsIE9iamVjdD4gb3RoZXJUb01hdGNoKSB7CisKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCWxvbmcgc3RhcnRGZXRjaEFsbFN0YXRlcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoSGlnZXN0ID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wZXJ0aWVzVG9NYXRjaEhpZ2VzdC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCXByb3BlcnRpZXNUb01hdGNoSGlnZXN0LnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0FCU1RSQUNULmdldFByb3BlcnR5KCksIGZhbHNlKTsKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYWxsSGlnaGVzdFN0YXRlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcGVydGllc1RvTWF0Y2hIaWdlc3QsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJaWYgKGFsbEhpZ2hlc3RTdGF0ZXMuaXNSaWdodCgpICYmIGFsbEhpZ2hlc3RTdGF0ZXMucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFsbEhpZ2hlc3RTdGF0ZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKworCQlpZiAoYWxsSGlnaGVzdFN0YXRlcy5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdChuZXcgQXJyYXlMaXN0PD4oKSk7CisJCX0KKwkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gbGlzdCA9IGFsbEhpZ2hlc3RTdGF0ZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gY2VydGlmaWVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IG5vbmNlcnRpZmllZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlRGF0YSA6IGxpc3QpIHsKKwkJCWlmIChyZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCkuZXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKSkgeworCQkJCWNlcnRpZmllZC5hZGQocmVEYXRhKTsKKwkJCX0gZWxzZSB7CisJCQkJbm9uY2VydGlmaWVkLmFkZChyZURhdGEpOworCQkJfQorCQl9CisKKwkJbG9uZyBlbmRGZXRjaEFsbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlsb2cuZGVidWcoIkZldGNoIGNhdGFsb2cgcmVzb3VyY2VzIGFsbCBzdGF0ZXM6IGNlcnRpZmllZCB7fSwgbm9uY2VydGlmaWVkIHt9IiwgY2VydGlmaWVkLnNpemUoKSwgbm9uY2VydGlmaWVkLnNpemUoKSk7CisJCWxvZy5kZWJ1ZygiRmV0Y2ggY2F0YWxvZyByZXNvdXJjZXMgYWxsIHN0YXRlcyBmcm9tIGdyYXBoIHRvb2sge30gbXMiLCBlbmRGZXRjaEFsbCAtIHN0YXJ0RmV0Y2hBbGxTdGF0ZXMpOworCisJCXRyeSB7CisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiBub3RDZXJ0aWZpZWRIaWdoZXN0ID0gbm9uY2VydGlmaWVkOworCQkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gY2VydGlmaWVkSGlnaGVzdExpc3QgPSBjZXJ0aWZpZWQ7CisKKwkJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IFZGTmFtZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBWRkNOYW1lcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgZGF0YSA6IG5vdENlcnRpZmllZEhpZ2hlc3QpIHsKKwkJCQlTdHJpbmcgc2VydmljZU5hbWUgPSBkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCk7CisJCQkJaWYgKCgoUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSkuZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKFJlc291cmNlVHlwZUVudW0uVkYpKSB7CisJCQkJCVZGTmFtZXMucHV0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlTmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJVkZDTmFtZXMucHV0KHNlcnZpY2VOYW1lLCBzZXJ2aWNlTmFtZSk7CisJCQkJfQorCQkJfQorCisJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIGRhdGEgOiBjZXJ0aWZpZWRIaWdoZXN0TGlzdCkgeworCQkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKTsKKwkJCQlpZiAoKChSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIGRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKS5nZXRSZXNvdXJjZVR5cGUoKS5lcXVhbHMoUmVzb3VyY2VUeXBlRW51bS5WRikpIHsKKwkJCQkJaWYgKCFWRk5hbWVzLmNvbnRhaW5zS2V5KHNlcnZpY2VOYW1lKSkgeworCQkJCQkJbm90Q2VydGlmaWVkSGlnaGVzdC5hZGQoZGF0YSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIVZGQ05hbWVzLmNvbnRhaW5zS2V5KHNlcnZpY2VOYW1lKSkgeworCQkJCQkJbm90Q2VydGlmaWVkSGlnaGVzdC5hZGQoZGF0YSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWxvbmcgZW5kRmV0Y2hBbGxGcm9tR3JhcGggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCWxvZy5kZWJ1ZygiRmV0Y2ggYWxsIGNhdGFsb2cgcmVzb3VyY2VzIG1ldGFkYXRhIGZyb20gZ3JhcGggdG9vayB7fSBtcyIsIGVuZEZldGNoQWxsRnJvbUdyYXBoIC0gc3RhcnQpOworCisJCQlsb25nIHN0YXJ0RmV0Y2hBbGxGcm9tQ2FjaGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkJTGlzdDxSZXNvdXJjZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJCU1hcDxTdHJpbmcsIExvbmc+IGNvbXBvbmVudHMgPSBub3RDZXJ0aWZpZWRIaWdoZXN0LnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIHAgLT4gcC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TGFzdFVwZGF0ZURhdGUoKSkpOworCisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudD4sIFNldDxTdHJpbmc+PiwgQWN0aW9uU3RhdHVzPiBjb21wb25lbnRzRm9yQ2F0YWxvZyA9IGNvbXBvbmVudENhY2hlLmdldENvbXBvbmVudHNGb3JDYXRhbG9nKGNvbXBvbmVudHMsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKwkJCWlmIChjb21wb25lbnRzRm9yQ2F0YWxvZy5pc0xlZnQoKSkgeworCQkJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4gaW1tdXRhYmxlUGFpciA9IGNvbXBvbmVudHNGb3JDYXRhbG9nLmxlZnQoKS52YWx1ZSgpOworCQkJCUxpc3Q8Q29tcG9uZW50PiBmb3VuZENvbXBvbmVudHMgPSBpbW11dGFibGVQYWlyLmdldExlZnQoKTsKKwkJCQlpZiAoZm91bmRDb21wb25lbnRzICE9IG51bGwpIHsKKwkJCQkJZm91bmRDb21wb25lbnRzLmZvckVhY2gocCAtPiByZXN1bHQuYWRkKChSZXNvdXJjZSkgcCkpOworCQkJCQlsb2cuZGVidWcoIlRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGFkZGVkIHRvIGNhdGFsb2cgZnJvbSBjYWNoZSBpcyB7fSIsIGZvdW5kQ29tcG9uZW50cy5zaXplKCkpOworCisJCQkJCUxpc3Q8U3RyaW5nPiBmb3VuZENvbXBvbmVudHNVaWQgPSBmb3VuZENvbXBvbmVudHMuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXRVbmlxdWVJZCgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJCQlub3RDZXJ0aWZpZWRIaWdoZXN0ID0gbm90Q2VydGlmaWVkSGlnaGVzdC5zdHJlYW0oKS5maWx0ZXIocCAtPiBmYWxzZSA9PSBmb3VuZENvbXBvbmVudHNVaWQuY29udGFpbnMocC5nZXRVbmlxdWVJZCgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCQl9CisJCQkJU2V0PFN0cmluZz4gbm9uQ2FjaGVkQ29tcG9uZW50cyA9IGltbXV0YWJsZVBhaXIuZ2V0UmlnaHQoKTsKKwkJCQlpbnQgbnVtYmVyTm9uQ2FjaGVkID0gbm9uQ2FjaGVkQ29tcG9uZW50cyA9PSBudWxsID8gMCA6IG5vbkNhY2hlZENvbXBvbmVudHMuc2l6ZSgpOworCQkJCWxvZy5kZWJ1ZygiVGhlIG51bWJlciBvZiBsZWZ0IHJlc291cmNlcyBmb3IgY2F0YWxvZyBpcyB7fSIsIG51bWJlck5vbkNhY2hlZCk7CisKKwkJCX0KKworCQkJbG9uZyBlbmRGZXRjaEFsbEZyb21DYWNoZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJbG9nLmRlYnVnKCJGZXRjaCBhbGwgY2F0YWxvZyByZXNvdXJjZXMgbWV0YWRhdGEgZnJvbSBjYWNoZSB0b29rICIgKyAoZW5kRmV0Y2hBbGxGcm9tQ2FjaGUgLSBzdGFydEZldGNoQWxsRnJvbUNhY2hlKSArICIgbXMiKTsKKworCQkJbG9uZyBzdGFydEZldGNoRnJvbUdyYXBoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb2cuZGVidWcoIlRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIG5lZWRlZCB0byBiZSBmZXRjaCBhcyBsaWdodCBjb21wb25lbnQgaXMge30iLCBub3RDZXJ0aWZpZWRIaWdoZXN0LnNpemUoKSk7CisJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIGRhdGEgOiBub3RDZXJ0aWZpZWRIaWdoZXN0KSB7CisJCQkJU3RyaW5nIHVuaXF1ZUlkID0gZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKTsKKwkJCQlsb2cudHJhY2UoIkZldGNoIGNhdGFsb2cgcmVzb3VyY2Ugbm9uIGNhY2hlZCB7fSB7fSIsIHVuaXF1ZUlkLCBkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXROYW1lKCkpOworCQkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50ID0gZ2V0TGlnaHRDb21wb25lbnQodW5pcXVlSWQsIGluVHJhbnNhY3Rpb24pOworCQkJCWlmIChjb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBTZXJ2aWNlIGZvciBpZCA9ICAiICsgZGF0YS5nZXRVbmlxdWVJZCgpICsgIiAgZXJyb3IgOiAiICsgY29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSArICIgc2tpcCByZXNvdXJjZSIpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdC5hZGQoY29tcG9uZW50LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCQlsb25nIGVuZEZldGNoRnJvbUdyYXBoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlsb2cuZGVidWcoIkZldGNoIGNhdGFsb2cgcmVzb3VyY2VzIGZyb20gZ3JhcGggdG9vayAiICsgKGVuZEZldGNoRnJvbUdyYXBoIC0gc3RhcnRGZXRjaEZyb21HcmFwaCkgKyAiIG1zIik7CisKKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCisJCX0gZmluYWxseSB7CisJCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJbG9nLmRlYnVnKCJGZXRjaCBhbGwgY2F0YWxvZyByZXNvdXJjZXMgdG9vayB7fSBtcyIsIGVuZCAtIHN0YXJ0KTsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VDYXRhbG9nRGF0YVZGTGF0ZXN0Q2VydGlmaWVkQW5kTm9uQ2VydGlmaWVkKGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5SRVNPVVJDRV9UWVBFLmdldFByb3BlcnR5KCksIFJlc291cmNlVHlwZUVudW0uVkYubmFtZSgpKTsKKworCQlyZXR1cm4gZ2V0UmVzb3VyY2VDYXRhbG9nRGF0YUxhdGVzdENlcnRpZmllZEFuZE5vbkNlcnRpZmllZChpblRyYW5zYWN0aW9uLCBwcm9wZXJ0aWVzVG9NYXRjaCk7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlQ2F0YWxvZ0RhdGFMYXRlc3RDZXJ0aWZpZWRBbmROb25DZXJ0aWZpZWQoYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBNYXA8U3RyaW5nLCBPYmplY3Q+IG90aGVyVG9NYXRjaCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8PigpOworCisJCWlmIChvdGhlclRvTWF0Y2ggIT0gbnVsbCkgeworCQkJcHJvcGVydGllc1RvTWF0Y2gucHV0QWxsKG90aGVyVG9NYXRjaCk7CisJCX0KKworCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbGFzdFZlcnNpb25Ob2RlcyA9IHRpdGFuR2VuZXJpY0Rhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcGVydGllc1RvTWF0Y2gsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlMaXN0PFJlc291cmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlpZiAobGFzdFZlcnNpb25Ob2Rlcy5pc1JpZ2h0KCkgJiYgbGFzdFZlcnNpb25Ob2Rlcy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMobGFzdFZlcnNpb25Ob2Rlcy5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCisJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGxpc3RPZkhpZ2hlc3Q7CisKKwkJaWYgKGxhc3RWZXJzaW9uTm9kZXMuaXNMZWZ0KCkpIHsKKwkJCWxpc3RPZkhpZ2hlc3QgPSBsYXN0VmVyc2lvbk5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCX0KKworCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIGRhdGEgOiBsaXN0T2ZIaWdoZXN0KSB7CisJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudCA9IGdldExpZ2h0Q29tcG9uZW50KGRhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKGNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgU2VydmljZSBmb3IgaWQgPSAgIiArIGRhdGEuZ2V0VW5pcXVlSWQoKSArICIgIGVycm9yIDogIiArIGNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkgKyAiIHNraXAgcmVzb3VyY2UiKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0LmFkZChjb21wb25lbnQubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXByaXZhdGUgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZUxpc3RCeUNyaXRlcmlhKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZS5nZXROYW1lKCkpOworCisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKGJ5Q3JpdGVyaWEuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoYnlDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJfQorCQlMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZXNEYXRhTGlzdCA9IGJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCk7CisJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgZGF0YSA6IHJlc291cmNlc0RhdGFMaXN0KSB7CisJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlID0gZ2V0UmVzb3VyY2UoZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAocmVzb3VyY2UuaXNMZWZ0KCkpIHsKKwkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggcmVzb3VyY2UgZm9yIG5hbWUgPSAiICsgZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpICsgIiAgYW5kIGlkID0gIiArIGRhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc291cmNlcyk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VMaXN0QnlVdWlkKFN0cmluZyB1dWlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIGdldExhdGVzdFJlc291cmNlQnlVdWlkKHV1aWQsIGZhbHNlLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXRlc3RSZXNvdXJjZUJ5VXVpZChTdHJpbmcgdXVpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRMYXRlc3RSZXNvdXJjZUJ5VXVpZCh1dWlkLCB0cnVlLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0UmVzb3VyY2VCeVV1aWQoU3RyaW5nIHV1aWQsIGJvb2xlYW4gaXNMYXRlc3QsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWlmIChpc0xhdGVzdCkgeworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCksIGlzTGF0ZXN0KTsKKwkJfQorCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VVUlELmdldFByb3BlcnR5KCksIHV1aWQpOworCQlyZXR1cm4gZ2V0UmVzb3VyY2VMaXN0QnlDcml0ZXJpYShwcm9wcywgaW5UcmFuc2FjdGlvbik7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VMaXN0QnlTeXN0ZW1OYW1lKFN0cmluZyBzeXN0ZW1OYW1lLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TWVNURU1fTkFNRS5nZXRQcm9wZXJ0eSgpLCBzeXN0ZW1OYW1lKTsKKwkJcmV0dXJuIGdldFJlc291cmNlTGlzdEJ5Q3JpdGVyaWEocHJvcHMsIGluVHJhbnNhY3Rpb24pOworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlTGlzdEJ5VG9zY2FOYW1lKFN0cmluZyB0b3NjYU5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRPU0NBX1JFU09VUkNFX05BTUUuZ2V0UHJvcGVydHkoKSwgdG9zY2FOYW1lKTsKKwkJcmV0dXJuIGdldFJlc291cmNlTGlzdEJ5Q3JpdGVyaWEocHJvcHMsIGluVHJhbnNhY3Rpb24pOworCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0QnlOYW1lc0FuZFZlcnNpb24oR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIG5hbWUsIHZlcnNpb24sIG51bGwsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24pIHsKKwkJcmV0dXJuIGdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBmYWxzZSk7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QnlOYW1lc0FuZFZlcnNpb24oU3RyaW5nIG5hbWVLZXksIFN0cmluZyBuYW1lVmFsdWUsIFN0cmluZyB2ZXJzaW9uLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChuYW1lS2V5LCBuYW1lVmFsdWUpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRVJTSU9OLmdldFByb3BlcnR5KCksIHZlcnNpb24pOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJaWYgKGFkZGl0aW9uYWxQYXJhbXMgIT0gbnVsbCAmJiAhYWRkaXRpb25hbFBhcmFtcy5pc0VtcHR5KCkpIHsKKwkJCXByb3BzLnB1dEFsbChhZGRpdGlvbmFsUGFyYW1zKTsKKwkJfQorCisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworCQlpZiAoYnlDcml0ZXJpYS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhieUNyaXRlcmlhLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGRhdGFMaXN0ID0gYnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKTsKKwkJaWYgKGRhdGFMaXN0ICE9IG51bGwgJiYgIWRhdGFMaXN0LmlzRW1wdHkoKSkgeworCQkJLy8gaWYgKGRhdGFMaXN0LnNpemUoKSA+IDEpIHsKKwkJCS8vIGxvZy5kZWJ1ZygiTW9yZSB0aGF0IG9uZSBpbnN0YW5jZSBvZiByZXNvdXJjZSBmb3IgbmFtZSA9IiArCisJCQkvLyBuYW1lVmFsdWUgKyAiIGFuZCB2ZXJzaW9uID0gIiArIHZlcnNpb24pOworCQkJLy8gcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJLy8gfQorCQkJZm9yIChSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgOiBkYXRhTGlzdCkgeworCQkJCS8vIFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IGRhdGFMaXN0LmdldCgwKTsKKwkJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCBpblRyYW5zYWN0aW9uKTsKKwkJCQlpZiAocmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHJlc291cmNlIGZvciBuYW1lID0gIiArIHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpICsgIiAgYW5kIGlkID0gIiArIHJlc291cmNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlyZXNvdXJjZXNMaXN0LmFkZChyZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisJCQl9CisJCQkvLyByZXR1cm4gcmVzb3VyY2U7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2VzTGlzdCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZ2V0UmVzb3VyY2VCeVN5c3RlbU5hbWVBbmRWZXJzaW9uKG5hbWUsIHZlcnNpb24sIGFkZGl0aW9uYWxQYXJhbXMsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlQnlTeXN0ZW1OYW1lQW5kVmVyc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sIE1hcDxTdHJpbmcsIE9iamVjdD4gYWRkaXRpb25hbFBhcmFtcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYnlOYW1lc0FuZFZlcnNpb24gPSBnZXRCeU5hbWVzQW5kVmVyc2lvbihHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5PUk1BTElaRURfTkFNRS5nZXRQcm9wZXJ0eSgpLCBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShuYW1lKSwgdmVyc2lvbiwgYWRkaXRpb25hbFBhcmFtcywgaW5UcmFuc2FjdGlvbik7CisJCWlmIChieU5hbWVzQW5kVmVyc2lvbi5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoYnlOYW1lc0FuZFZlcnNpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlMaXN0PFJlc291cmNlPiByZXNvdXJjZXNMaXN0ID0gYnlOYW1lc0FuZFZlcnNpb24ubGVmdCgpLnZhbHVlKCk7CisJCWlmIChyZXNvdXJjZXNMaXN0LnNpemUoKSA+IDEpIHsKKwkJCWxvZy5kZWJ1ZygiTW9yZSB0aGF0IG9uZSBpbnN0YW5jZSBvZiByZXNvdXJjZSBmb3IgbmFtZSA9IiArIG5hbWUgKyAiIGFuZCB2ZXJzaW9uID0gIiArIHZlcnNpb24pOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChyZXNvdXJjZXNMaXN0LmdldCgwKSk7CisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRBbGxWZXJzaW9ucyhSZXNvdXJjZSByZXNvdXJjZSkgeworCQlFaXRoZXI8TWFwPFN0cmluZywgU3RyaW5nPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlcyA9IGdldFZlcnNpb25MaXN0KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzb3VyY2UuZ2V0VmVyc2lvbigpLCByZXNvdXJjZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAocmVzLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIHJlcy5yaWdodCgpLnZhbHVlKCk7CisJCX0KKwkJcmVzb3VyY2Uuc2V0QWxsVmVyc2lvbnMocmVzLmxlZnQoKS52YWx1ZSgpKTsKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEdyYXBoTm9kZT4gRWl0aGVyPE1hcDxTdHJpbmcsIFN0cmluZz4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBnZXRWZXJzaW9uTGlzdChOb2RlVHlwZUVudW0gdHlwZSwgU3RyaW5nIHZlcnNpb24sIENvbXBvbmVudCBjb21wb25lbnQsIENsYXNzPFQ+IGNsYXp6KSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBoYXNOb3RQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCWlmICh2ZXJzaW9uLnN0YXJ0c1dpdGgoIjAiKSkgeworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVVVJRC5nZXRQcm9wZXJ0eSgpLCBjb21wb25lbnQuZ2V0VVVJRCgpKTsKKwkJfSBlbHNlIHsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNZU1RFTV9OQU1FLmdldFByb3BlcnR5KCksIGNvbXBvbmVudC5nZXRTeXN0ZW1OYW1lKCkpOworCQkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuUkVTT1VSQ0VfVFlQRS5nZXRQcm9wZXJ0eSgpLCAoKFJlc291cmNlKSBjb21wb25lbnQpLmdldFJlc291cmNlVHlwZSgpLm5hbWUoKSk7CisJCX0KKwkJaGFzTm90UHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfREVMRVRFRC5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKwkJRWl0aGVyPExpc3Q8VD4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYSh0eXBlLCBwcm9wcywgaGFzTm90UHJvcHMsIGNsYXp6KTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCWlmICghcmVzdWx0LnJpZ2h0KCkudmFsdWUoKS5lcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+IGNvbXBvbmVudHMgPSAoTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4pIHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgZGF0YSA6IGNvbXBvbmVudHMpIHsKKwkJCQl2ZXJzaW9uTWFwLnB1dChkYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRWZXJzaW9uKCksIChTdHJpbmcpIGRhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodmVyc2lvbk1hcCk7CisJfQorCisJLyoqCisJICogdXBkYXRlIG9ubHkgdGhlIHJlc291cmNlIG9iamVjdCBpdHNlbGYgd2l0aG91dCB0YWcsIGRlcml2ZWQgZnJvbSBvciBhbnkgb3RoZXIgbmVpZ2hib3Vycy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2UKKwkgKiBAcGFyYW0gaW5UcmFuc2FjdGlvbgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXNvdXJjZU1ldGFkYXRhKFJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJbG9nLmRlYnVnKCJJbiB1cGRhdGVSZXNvdXJjZS4gcmVjZWl2ZWQgcmVzb3VyY2UgPSAiICsgKHJlc291cmNlID09IG51bGwgPyBudWxsIDogcmVzb3VyY2UudG9TdHJpbmcoKSkpOworCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCQlsb2cuZXJyb3IoIlJlc291cmNlIG9iamVjdCBpcyBudWxsIik7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0SGlnaGVzdFZlcnNpb24ocmVzb3VyY2UuaXNIaWdoZXN0VmVyc2lvbigpKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgY29udmVydGluZyByZXNvdXJjZSB0byBSZXNvdXJjZURhdGEuIFJlc291cmNlRGF0YSA9ICIgKyByZXNvdXJjZURhdGEpOworCisJCQlpZiAocmVzb3VyY2VEYXRhLmdldFVuaXF1ZUlkKCkgPT0gbnVsbCkgeworCQkJCWxvZy5lcnJvcigiUmVzb3VyY2UgaWQgaXMgbWlzc2luZyBpbiB0aGUgcmVxdWVzdC4iKTsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuQkFEX1JFUVVFU1QpOworCQkJfQorCisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUocmVzb3VyY2VEYXRhLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSByZXNvdXJjZSAiICsgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSArICIuIHN0YXR1cyBpcyAiICsgdXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHVwZGF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVkUmVzb3VyY2UgPSBnZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJCWlmICh1cGRhdGVkUmVzb3VyY2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJSZXNvdXJjZSBpZCBpcyBtaXNzaW5nIGluIHRoZSByZXF1ZXN0LiBzdGF0dXMgaXMgIiArIHVwZGF0ZWRSZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkJBRF9SRVFVRVNUKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlSZXNvdXJjZSB1cGRhdGVkUmVzb3VyY2VWYWx1ZSA9IHVwZGF0ZWRSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHVwZGF0ZWRSZXNvdXJjZVZhbHVlKTsKKworCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJU3RyaW5nIGpzb24gPSBwcmV0dHlKc29uLnRvSnNvbihyZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJCWxvZy5kZWJ1ZygiUmVzb3VyY2UgcmV0cmlldmVkIGFmdGVyIHVwZGF0ZSBpcyAiICsganNvbik7CisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJHb2luZyB0byBleGVjdXRlIHJvbGxiYWNrIG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDZXJ0aWZpZWRSZXNvdXJjZXMoYm9vbGVhbiBpc0Fic3RyYWN0LCBCb29sZWFuIGlzSGlnaGVzdCkgeworCisJCXRyeSB7CisJCQlMaXN0PFJlc291cmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2ggPSBuZXcgSGFzaE1hcDw+KCk7CisJCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19BQlNUUkFDVC5nZXRQcm9wZXJ0eSgpLCBpc0Fic3RyYWN0KTsKKwkJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKTsKKworCQkJaWYgKGlzSGlnaGVzdCAhPSBudWxsKSB7CisJCQkJcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCksIGlzSGlnaGVzdC5ib29sZWFuVmFsdWUoKSk7CisJCQl9CisKKwkJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc291cmNlTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BlcnRpZXNUb01hdGNoLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCWlmIChyZXNvdXJjZU5vZGVzLmlzUmlnaHQoKSkgeworCQkJCS8vIGluIGNhc2Ugb2YgTk9UX0ZPVU5EIGZyb20gVGl0YW4gY2xpZW50IHJldHVybiB0byBVSSBlbXB0eQorCQkJCS8vIGxpc3QKKwkJCQlpZiAocmVzb3VyY2VOb2Rlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHJlc291cmNlTm9kZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZURhdGFMaXN0ID0gcmVzb3VyY2VOb2Rlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCQlmb3IgKFJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA6IHJlc291cmNlRGF0YUxpc3QpIHsKKwkJCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZSA9IGdldFJlc291cmNlKHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSk7CisJCQkJCWlmIChyZXNvdXJjZS5pc1JpZ2h0KCkpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHJlc291cmNlIGZvciBpZCA9ICIgKyByZXNvdXJjZURhdGEuZ2V0VW5pcXVlSWQoKSArICIgIGVycm9yIGlzICIgKyByZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXNvdXJjZS5yaWdodCgpLnZhbHVlKCkpOworCQkJCQl9CisJCQkJCXJlc3VsdC5hZGQocmVzb3VyY2UubGVmdCgpLnZhbHVlKCkpOworCQkJCX0KKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0Q2VydGlmaWVkQnlUb3NjYVJlc291cmNlTmFtZShTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0TGF0ZXN0Q2VydGlmaWVkQnlDcml0ZXJpYShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlRPU0NBX1JFU09VUkNFX05BTUUuZ2V0UHJvcGVydHkoKSwgdG9zY2FSZXNvdXJjZU5hbWUsIGluVHJhbnNhY3Rpb24pOworCisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0Q2VydGlmaWVkQnlDcml0ZXJpYShTdHJpbmcgcHJvcGVydHksIFN0cmluZyByZXNvdXJjZU5hbWUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCQlwcm9wcy5wdXQocHJvcGVydHksIHJlc291cmNlTmFtZSk7CisJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisKKwkJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGhpZ2hlc3RSZXNvdXJjZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAoaGlnaGVzdFJlc291cmNlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBoaWdoZXN0UmVzb3VyY2VzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoImZhaWxlZCB0byBmaW5kIHJlc291cmNlIHdpdGggbmFtZSB7fS4gc3RhdHVzPXt9ICIsIHJlc291cmNlTmFtZSwgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZXMgPSBoaWdoZXN0UmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpOworCQkJZG91YmxlIHZlcnNpb24gPSAwLjA7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSBoaWdoZXN0UmVzb3VyY2UgPSBudWxsOworCQkJZm9yIChSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZSA6IHJlc291cmNlcykgeworCQkJCWRvdWJsZSByZXNvdXJjZVZlcnNpb24gPSBEb3VibGUucGFyc2VEb3VibGUocmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFZlcnNpb24oKSk7CisJCQkJaWYgKHJlc291cmNlVmVyc2lvbiA+IHZlcnNpb24pIHsKKwkJCQkJdmVyc2lvbiA9IHJlc291cmNlVmVyc2lvbjsKKwkJCQkJaGlnaGVzdFJlc291cmNlID0gcmVzb3VyY2U7CisJCQkJfQorCQkJfQorCQkJcmVzdWx0ID0gZ2V0UmVzb3VyY2UoaGlnaGVzdFJlc291cmNlLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmVycm9yKCJnZXRMYXRlc3RCeU5hbWUgb3BlcmF0aW9uIDogR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJnZXRMYXRlc3RCeU5hbWUgb3BlcmF0aW9uIDogR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCX0KKworCXB1YmxpYyBFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGZpbmRMYXN0Q2VydGlmaWVkUmVzb3VyY2VCeU5hbWUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQlyZXR1cm4gZ2V0UmVzb3VyY2VMaXN0QnlDcml0ZXJpYShwcm9wcywgZmFsc2UpOworCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmluZExhc3RDZXJ0aWZpZWRSZXNvdXJjZUJ5VVVJRChSZXNvdXJjZSByZXNvdXJjZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVVSUQuZ2V0UHJvcGVydHkoKSwgcmVzb3VyY2UuZ2V0VVVJRCgpKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQlyZXR1cm4gZ2V0UmVzb3VyY2VMaXN0QnlDcml0ZXJpYShwcm9wcywgZmFsc2UpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNDb21wb25lbnRFeGlzdChTdHJpbmcgcmVzb3VyY2VJZCkgeworCQlyZXR1cm4gaXNDb21wb25lbnRFeGlzdChyZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lQ29tcG9uZW50KFQgb3RoZXIsIFN0cmluZyB2ZXJzaW9uLCBMaWZlY3ljbGVTdGF0ZUVudW0gdGFyZ2V0TGlmZWN5Y2xlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIChFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGNsb25lUmVzb3VyY2UoKFJlc291cmNlKSBvdGhlciwgdmVyc2lvbiwgdGFyZ2V0TGlmZWN5Y2xlLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGluY3JlYXNlQW5kR2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyKFN0cmluZyBjb21wb25lbnRJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBpbmNyZWFzZUFuZEdldENvbXBvbmVudEluc3RhbmNlQ291bnRlcihjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2xvbmVSZXNvdXJjZShSZXNvdXJjZSBvdGhlciwgU3RyaW5nIHZlcnNpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gY2xvbmVSZXNvdXJjZShvdGhlciwgdmVyc2lvbiwgbnVsbCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lUmVzb3VyY2UoUmVzb3VyY2Ugb3RoZXIsIFN0cmluZyB2ZXJzaW9uLCBMaWZlY3ljbGVTdGF0ZUVudW0gdGFyZ2V0TGlmZWN5Y2xlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCisJCXRyeSB7CisJCQlTdHJpbmcgb3JpZ1Jzb3VyY2VJZCA9IG90aGVyLmdldFVuaXF1ZUlkKCk7CisKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgb3ZlcnJpZGVTdGF0dXMgPSBvdmVycmlkZVJlY3Vyc2l2ZU1lbWJlcnMob3RoZXIsIG9yaWdSc291cmNlSWQpOworCQkJaWYgKCFvdmVycmlkZVN0YXR1cy5lcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KG92ZXJyaWRlU3RhdHVzKTsKKwkJCX0KKwkJCW90aGVyLnNldFZlcnNpb24odmVyc2lvbik7CisJCQlvdGhlci5zZXRVbmlxdWVJZChudWxsKTsKKworCQkJTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0cyA9IG90aGVyLmdldElucHV0cygpOworCQkJTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4gaW5wdXRzUHJvcE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5Pj4oKTsKKworCQkJaWYgKGlucHV0cyAhPSBudWxsKSB7CisJCQkJZm9yIChJbnB1dERlZmluaXRpb24gaW5wdXQgOiBpbnB1dHMpIHsKKworCQkJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGlucHV0UHJvcFN0YXR1cyA9IGlucHV0T3BlcmF0aW9uLmdldENvbXBvbmVudEluc3RhbmNlUHJvcGVydGllc0J5SW5wdXRJZChpbnB1dC5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJaWYgKGlucHV0UHJvcFN0YXR1cy5pc0xlZnQoKSkgeworCQkJCQkJaWYgKGlucHV0UHJvcFN0YXR1cy5sZWZ0KCkudmFsdWUoKSAhPSBudWxsKQorCQkJCQkJCWlucHV0c1Byb3BNYXAucHV0KGlucHV0LmdldE5hbWUoKSwgaW5wdXRQcm9wU3RhdHVzLmxlZnQoKS52YWx1ZSgpKTsKKworCQkJCQl9CisKKwkJCQl9CisJCQl9CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVzb3VyY2VNRCA9IGNyZWF0ZVJlc291cmNlKG90aGVyLCBpblRyYW5zYWN0aW9uKTsKKwkJCWlmIChjcmVhdGVSZXNvdXJjZU1ELmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY3JlYXRlUmVzb3VyY2VNRC5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gY2xvbmUgcmVzb3VyY2UuIHN0YXR1cz0ge30iLCBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlTUQubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8VGl0YW5WZXJ0ZXgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBtZXRhZGF0YVZlcnRleEVpdGhlciA9IHRpdGFuR2VuZXJpY0Rhby5nZXRWZXJ0ZXhCeVByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCksIHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJaWYgKG1ldGFkYXRhVmVydGV4RWl0aGVyLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIGVycm9yID0gbWV0YWRhdGFWZXJ0ZXhFaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGZldGNoIHZlcnRleCBvZiBtZXRhZGF0YSB7fSBlcnJvciB7fSIsIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGVycm9yKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhlcnJvcikpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCVRpdGFuVmVydGV4IG1ldGFkYXRhVmVydGV4ID0gbWV0YWRhdGFWZXJ0ZXhFaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTWFwPFN0cmluZywgU3RyaW5nPj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lSW5zdGFuY2VzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uY2xvbmVBbGxDb21wb25lbnRJbnN0YW5jZXNGcm9tQ29udGFpbmVyQ29tcG9uZW50KG9yaWdSc291cmNlSWQsIHJlc291cmNlLmdldFVuaXF1ZUlkKCksCisJCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0YXJnZXRMaWZlY3ljbGUsIG1ldGFkYXRhVmVydGV4LCBvdGhlciwgcmVzb3VyY2UsIGlucHV0c1Byb3BNYXApOworCQkJaWYgKGNsb25lSW5zdGFuY2VzLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjbG9uZUluc3RhbmNlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb3VudGVyU3RhdHVzID0gZ2V0Q29tcG9uZW50SW5zdGFuY2VDb3V0bmVyKG9yaWdSc291cmNlSWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQlpZiAoY291bnRlclN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNvdW50ZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCByZXNvdXJjZSBpbnN0YW5jZSBjb3VudGVyIG9uIHNlcnZpY2Uge30uIHN0YXR1cz17fSIsIG9yaWdSc291cmNlSWQsIGNvdW50ZXJTdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXRSZXNvdXJjZUluc3RhbmNlQ291bnRlciA9IHNldENvbXBvbmVudEluc3RhbmNlQ291bnRlcihyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGNvdW50ZXJTdGF0dXMubGVmdCgpLnZhbHVlKCksIHRydWUpOworCQkJaWYgKHNldFJlc291cmNlSW5zdGFuY2VDb3VudGVyLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gc2V0UmVzb3VyY2VJbnN0YW5jZUNvdW50ZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIHNldCByZXNvdXJjZSBpbnN0YW5jZSBjb3VudGVyIG9uIHNlcnZpY2Uge30uIHN0YXR1cz17fSIsIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPExpc3Q8R3JvdXBEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2xvbmVkR3JvdXBzID0gY2xvbmVHcm91cHMob3RoZXIsIHJlc291cmNlLCBjbG9uZUluc3RhbmNlcy5sZWZ0KCkudmFsdWUoKSwgdHJ1ZSk7CisJCQlpZiAoY2xvbmVkR3JvdXBzLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2xvbmVkR3JvdXBzLnJpZ2h0KCkudmFsdWUoKTsKKwkJCQlpZiAoc3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCisJCQlyZXN1bHQgPSB0aGlzLmdldFJlc291cmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkNhbm5vdCBnZXQgZnVsbCBzZXJ2aWNlIGZyb20gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCVN0cmluZyBqc29uID0gcHJldHR5SnNvbi50b0pzb24ocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkvLyBsb2cuZGVidWcoIlJlc291cmNlIHJldHJpZXZlZCBpcyB7fSIsIGpzb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgb3ZlcnJpZGVSZWN1cnNpdmVNZW1iZXJzKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcHJldklkKSB7CisJCS8vIG92ZXJyaWRlIHJlcXVpcmVtZW50cyB0byBjb3B5IG9ubHkgcmVzb3VyY2UncyByZXF1aXJlbWVudHMgYW5kIG5vdAorCQkvLyBkZXJpdmVkIHJlcXVpcmVtZW50cworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVxdWlyZW1lbnRzT2ZSZXNvdXJjZU9ubHkgPSBnZXRSZXF1aXJlbWVudE9wZXJhdGlvbigpLmdldEFsbFJlcXVpcmVtZW50c09mUmVzb3VyY2VPbmx5KHByZXZJZCwgdHJ1ZSk7CisJCWlmIChyZXF1aXJlbWVudHNPZlJlc291cmNlT25seS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCByZXF1aXJlbWVudHMgb2YgcmVzb3VyY2UuIHJlc291cmNlSWQge30gc3RhdHVzIGlzIHt9IiwgcHJldklkLCByZXF1aXJlbWVudHNPZlJlc291cmNlT25seS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmV0dXJuIHJlcXVpcmVtZW50c09mUmVzb3VyY2VPbmx5LnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlyZXNvdXJjZS5zZXRSZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzT2ZSZXNvdXJjZU9ubHkubGVmdCgpLnZhbHVlKCkpOworCisJCS8vIG92ZXJyaWRlIGNhcGFiaWxpdGllcyB0byBjb3B5IG9ubHkgcmVzb3VyY2UncyByZXF1aXJlbWVudHMgYW5kIG5vdAorCQkvLyBkZXJpdmVkIHJlcXVpcmVtZW50cworCQlFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjYXBhYmlsaXRpZXNPZlJlc291cmNlT25seSA9IGdldFJlc291cmNlQ2FwYWJpbGl0aWVzTWFwKHByZXZJZCk7CisKKwkJcmVzb3VyY2Uuc2V0Q2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllc09mUmVzb3VyY2VPbmx5LmxlZnQoKS52YWx1ZSgpKTsKKworCQkvLyBvdmVycmlkZSBpbnRlcmZhY2VzIHRvIGNvcHkgb25seSByZXNvdXJjZSdzIGludGVyZmFjZXMgYW5kIG5vdAorCQkvLyBkZXJpdmVkIGludGVyZmFjZXMKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbnRlcmZhY2VzT2ZSZXNvdXJjZU9ubHkgPSBnZXRJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24oKS5nZXRBbGxJbnRlcmZhY2VzT2ZSZXNvdXJjZShwcmV2SWQsIGZhbHNlLCB0cnVlKTsKKwkJaWYgKGludGVyZmFjZXNPZlJlc291cmNlT25seS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCBpbnRlcmZhY2VzIG9mIHJlc291cmNlLiByZXNvdXJjZUlkIHt9IHN0YXR1cyBpcyB7fSIsIHByZXZJZCwgaW50ZXJmYWNlc09mUmVzb3VyY2VPbmx5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gaW50ZXJmYWNlc09mUmVzb3VyY2VPbmx5LnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlyZXNvdXJjZS5zZXRJbnRlcmZhY2VzKGludGVyZmFjZXNPZlJlc291cmNlT25seS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJTGlzdDxBdHRyaWJ1dGVEZWZpbml0aW9uPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGF0dHJpYnV0ZU9wZXJhdGlvbi5maW5kTm9kZU5vbkluaGVyZXRlZEF0dHJpYnVlcyhwcmV2SWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgYXR0cmlidXRlcyk7CisJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCXJldHVybiBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlyZXNvdXJjZS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworCQl9CisKKwkJLy8gb3ZlcnJpZGUgcHJvcGVydGllcyB0byBjb3B5IG9ubHkgcmVzb3VyY2UncyBwcm9wZXJ0aWVzIGFuZCBub3QKKwkJLy8gZGVyaXZlZCBwcm9wZXJ0aWVzCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcHJvcGVydGllc09mUmVzb3VyY2VPbmx5ID0gZ2V0UHJvcGVydHlPcGVyYXRpb24oKS5maW5kUHJvcGVydGllc09mTm9kZShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByZXZJZCk7CisKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHJlc291cmNlUHJvcGVydGllcyA9IG51bGw7CisJCWlmIChwcm9wZXJ0aWVzT2ZSZXNvdXJjZU9ubHkuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhblN0YXR1cyA9IHByb3BlcnRpZXNPZlJlc291cmNlT25seS5yaWdodCgpLnZhbHVlKCk7CisJCQlpZiAodGl0YW5TdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgcmVzb3VyY2UuIHJlc291cmNlSWQge30gc3RhdHVzIGlzIHt9IiwgcHJldklkLCBwcm9wZXJ0aWVzT2ZSZXNvdXJjZU9ubHkucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyh0aXRhblN0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXNNYXAgPSBwcm9wZXJ0aWVzT2ZSZXNvdXJjZU9ubHkubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAocHJvcGVydGllc01hcCAhPSBudWxsKSB7CisJCQkJcmVzb3VyY2VQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURlZmluaXRpb24+KCk7CisJCQkJcmVzb3VyY2VQcm9wZXJ0aWVzLmFkZEFsbChwcm9wZXJ0aWVzTWFwLnZhbHVlcygpKTsKKwkJCX0KKwkJfQorCQlyZXNvdXJjZS5zZXRQcm9wZXJ0aWVzKHJlc291cmNlUHJvcGVydGllcyk7CisKKwkJcmV0dXJuIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZUNhcGFiaWxpdGllc01hcChTdHJpbmcgcHJldklkKSB7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIENhcGFiaWxpdHlEZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2FwYWJpbGl0aWVzT2ZSZXNvdXJjZU9ubHkgPSBnZXRDYXBhYmlsaXR5T3BlcmF0aW9uKCkuZ2V0QWxsQ2FwYWJpbGl0aWVzT2ZSZXNvdXJjZShwcmV2SWQsIGZhbHNlLCB0cnVlKTsKKwkJaWYgKGNhcGFiaWxpdGllc09mUmVzb3VyY2VPbmx5LmlzUmlnaHQoKSkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gZ2V0IGNhcGFiaWxpdGllcyBvZiByZXNvdXJjZS4gcmVzb3VyY2VJZCB7fSBzdGF0dXMgaXMge30iLCBwcmV2SWQsIGNhcGFiaWxpdGllc09mUmVzb3VyY2VPbmx5LnJpZ2h0KCkudmFsdWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNhcGFiaWxpdGllc09mUmVzb3VyY2VPbmx5LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdHlNYXAgPSBnZXRDYXBhYmlsaXR5T3BlcmF0aW9uKCkuY29udmVydENhcGFiaWxpdHlNYXAoY2FwYWJpbGl0aWVzT2ZSZXNvdXJjZU9ubHkubGVmdCgpLnZhbHVlKCksIG51bGwsIG51bGwpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2FwYWJpbGl0eU1hcCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVDYXRlZ29yaWVzKENvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LCBDb21wb25lbnQgY29tcG9uZW50LCBDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50RGF0YSwgTm9kZVR5cGVFbnVtIHR5cGUpIHsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LOworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gbmV3Q2F0ZWdvcnlMaXN0ID0gY29tcG9uZW50LmdldENhdGVnb3JpZXMoKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIG5ld0NhdGVnb3J5ID0gbmV3Q2F0ZWdvcnlMaXN0LmdldCgwKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGN1cnJlbnRDYXRlZ29yeSA9IGN1cnJlbnRDb21wb25lbnQuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKTsKKwkJYm9vbGVhbiBjYXRlZ29yeVdhc0NoYW5nZWQgPSBmYWxzZTsKKworCQlpZiAobmV3Q2F0ZWdvcnkuZ2V0TmFtZSgpICE9IG51bGwgJiYgZmFsc2UgPT0gbmV3Q2F0ZWdvcnkuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2F0ZWdvcnkuZ2V0TmFtZSgpKSkgeworCQkJLy8gdGhlIGNhdGVnb3J5IHdhcyBjaGFuZ2VkCisJCQljYXRlZ29yeVdhc0NoYW5nZWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJLy8gdGhlIHN1Yi1jYXRlZ29yeSB3YXMgY2hhbmdlZAorCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIGN1cnJTdWJjYXRlZ29yeSA9IGN1cnJlbnRDYXRlZ29yeS5nZXRTdWJjYXRlZ29yaWVzKCkuZ2V0KDApOworCQkJU3ViQ2F0ZWdvcnlEZWZpbml0aW9uIG5ld1N1YmNhdGVnb3J5ID0gbmV3Q2F0ZWdvcnkuZ2V0U3ViY2F0ZWdvcmllcygpLmdldCgwKTsKKwkJCWlmIChuZXdTdWJjYXRlZ29yeS5nZXROYW1lKCkgIT0gbnVsbCAmJiBmYWxzZSA9PSBuZXdTdWJjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKGN1cnJTdWJjYXRlZ29yeS5nZXROYW1lKCkpKSB7CisJCQkJbG9nLmRlYnVnKCJHb2luZyB0byB1cGRhdGUgdGhlIGNhdGVnb3J5IG9mIHRoZSByZXNvdXJjZSBmcm9tICIgKyBjdXJyZW50Q2F0ZWdvcnkgKyAiIHRvICIgKyBuZXdDYXRlZ29yeSk7CisJCQkJY2F0ZWdvcnlXYXNDaGFuZ2VkID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZiAoY2F0ZWdvcnlXYXNDaGFuZ2VkKSB7CisJCQlzdGF0dXMgPSBtb3ZlQ2F0ZWdvcnlFZGdlKChSZXNvdXJjZSkgY29tcG9uZW50LCAoUmVzb3VyY2VNZXRhZGF0YURhdGEpIGNvbXBvbmVudERhdGEsIG5ld0NhdGVnb3J5KTsKKwkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gdXBkYXRlIHRoZSBjYXRlZ29yeSBvZiB0aGUgcmVzb3VyY2UgZnJvbSAiICsgY3VycmVudENhdGVnb3J5ICsgIiB0byAiICsgbmV3Q2F0ZWdvcnkgKyAiLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVmYXVsdENvbXBvbmVudCgpIHsKKwkJcmV0dXJuIG5ldyBSZXNvdXJjZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRNZXRhZGF0YUNvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0TWV0YWRhdGFDb21wb25lbnQoaWQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJQ29tcG9uZW50IGNvbnZlcnRDb21wb25lbnRNZXRhZGF0YURhdGFUb0NvbXBvbmVudChDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50TWV0YWRhdGFEYXRhKSB7CisJCXJldHVybiBjb252ZXJ0UmVzb3VyY2VEYXRhVG9SZXNvdXJjZSgoUmVzb3VyY2VNZXRhZGF0YURhdGEpIGNvbXBvbmVudE1ldGFkYXRhRGF0YSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVFeGlzdHMoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKKwkJcmV0dXJuIHZhbGlkYXRlQ29tcG9uZW50TmFtZVVuaXF1ZW5lc3MoY29tcG9uZW50TmFtZSwgdGl0YW5HZW5lcmljRGFvLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBtYXJrQ29tcG9uZW50VG9EZWxldGUoQ29tcG9uZW50IGNvbXBvbmVudFRvRGVsZXRlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIGludGVybmFsTWFya0NvbXBvbmVudFRvRGVsZXRlKGNvbXBvbmVudFRvRGVsZXRlLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGlzQ29tcG9uZW50SW5Vc2UoU3RyaW5nIGNvbXBvbmVudElkKSB7CisJCXJldHVybiBpc1Jlc291cmNlSW5Vc2UoY29tcG9uZW50SWQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDb21wb25lbnRzTWFya2VkRm9yRGVsZXRpb24oKSB7CisJCXJldHVybiBnZXRBbGxSZXNvdXJjZXNNYXJrZWRGb3JEZWxldGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxSZXNvdXJjZXNNYXJrZWRGb3JEZWxldGlvbigpIHsKKwkJcmV0dXJuIGdldEFsbENvbXBvbmVudHNNYXJrZWRGb3JEZWxldGlvbihOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaXNSZXNvdXJjZUluVXNlKFN0cmluZyByZXNvdXJjZVRvRGVsZXRlKSB7CisJCXJldHVybiBpc0NvbXBvbmVudEluVXNlKHJlc291cmNlVG9EZWxldGUsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lR3JvdXBzKFJlc291cmNlIHJlc291cmNlLCBSZXNvdXJjZSBuZXdSZXNvdXJjZSwgSW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTWFwPFN0cmluZywgU3RyaW5nPj4gY2xvbmVJbnN0YW5jZXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCisJCUVpdGhlcjxMaXN0PEdyb3VwRGVmaW5pdGlvbj4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJaWYgKHJlc291cmNlLmdldEdyb3VwcygpID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSyk7CisJCX0KKworCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBwcmVwYXJlR3JvdXBzRm9yQ2xvbmluZyA9IGdyb3VwT3BlcmF0aW9uLnByZXBhcmVHcm91cHNGb3JDbG9uaW5nKHJlc291cmNlLCBjbG9uZUluc3RhbmNlcyk7CisJCWlmIChwcmVwYXJlR3JvdXBzRm9yQ2xvbmluZy5pc1JpZ2h0KCkpIHsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gcHJlcGFyZUdyb3Vwc0ZvckNsb25pbmcucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJDbG9uZVJlc291cmNlIiwgIkZhaWxlZCB0byBwcmVwYXJlIGdyb3VwcyBmb3IgY2xvbmluZyIsIEVycm9yU2V2ZXJpdHkuRVJST1IpOworCQkJfQorCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgeworCQkJTGlzdDxHcm91cERlZmluaXRpb24+IGdyb3Vwc1RvQ3JlYXRlID0gcHJlcGFyZUdyb3Vwc0ZvckNsb25pbmcubGVmdCgpLnZhbHVlKCk7CisJCQlpZiAoZ3JvdXBzVG9DcmVhdGUgIT0gbnVsbCAmJiBmYWxzZSA9PSBncm91cHNUb0NyZWF0ZS5pc0VtcHR5KCkpIHsKKwkJCQlFaXRoZXI8TGlzdDxHcm91cERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRHcm91cHMgPSBncm91cE9wZXJhdGlvbi5hZGRHcm91cHMoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBuZXdSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBncm91cHNUb0NyZWF0ZSwgaW5UcmFuc2FjdGlvbik7CisJCQkJaWYgKGFkZEdyb3Vwcy5pc1JpZ2h0KCkpIHsKKwkJCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsRmxvd0Vycm9yKCJDbG9uZVJlc291cmNlIiwgIkZhaWxlZCB0byBjbG9uZSBncm91cHMiLCBFcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFkZEdyb3Vwcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCXJldHVybiBFaXRoZXIubGVmdChhZGRHcm91cHMubGVmdCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spOworCQkJfQorCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TGF0ZXN0UmVzb3VyY2VCeUNzYXJPck5hbWUoU3RyaW5nIGNzYXJVVUlELCBTdHJpbmcgc3lzdGVtTmFtZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DU0FSX1VVSUQuZ2V0UHJvcGVydHkoKSwgY3NhclVVSUQpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlTWV0YWRhdGFEYXRhID0gbnVsbDsKKwkJTGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4gcmVzb3VyY2VNZXRhZGF0YURhdGFMaXN0ID0gbnVsbDsKKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYnlDc2FyID0gdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBwcm9wcywgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlpZiAoYnlDc2FyLmlzUmlnaHQoKSkgeworCQkJaWYgKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORC5lcXVhbHMoYnlDc2FyLnJpZ2h0KCkudmFsdWUoKSkpIHsKKwkJCQlwcm9wcy5jbGVhcigpOworCQkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCB0cnVlKTsKKwkJCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TWVNURU1fTkFNRS5nZXRQcm9wZXJ0eSgpLCBzeXN0ZW1OYW1lKTsKKwkJCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBieVN5c3RlbW5hbWUgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQkJaWYgKGJ5U3lzdGVtbmFtZS5pc1JpZ2h0KCkpIHsKKwkJCQkJbG9nLmRlYnVnKCJnZXRMYXRlc3RSZXNvdXJjZUJ5Q3Nhck9yTmFtZSAtIEZhaWxlZCB0byBmaW5kIGJ5IHN5c3RlbSBuYW1lIHt9ICBlcnJvciB7fSAiLCBzeXN0ZW1OYW1lLCBieVN5c3RlbW5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGJ5U3lzdGVtbmFtZS5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQl9CisJCQkJaWYgKGJ5U3lzdGVtbmFtZS5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPiAyKSB7CisJCQkJCWxvZy5kZWJ1ZygiZ2V0TGF0ZXN0UmVzb3VyY2VCeUNzYXJPck5hbWUgLSBnZXRCeUNyaXRlcmlhKGJ5IHN5c3RlbSBuYW1lKSBtdXN0IHJldHVybiBvbmx5IDIgbGF0ZXN0IHZlcnNpb24sIGJ1dCB3YXMgcmV0dXJuZWQgLSAiICsgYnlTeXN0ZW1uYW1lLmxlZnQoKS52YWx1ZSgpLnNpemUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCQl9CisJCQkJcmVzb3VyY2VNZXRhZGF0YURhdGFMaXN0ID0gYnlTeXN0ZW1uYW1lLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmIChyZXNvdXJjZU1ldGFkYXRhRGF0YUxpc3Quc2l6ZSgpID09IDEpIHsKKwkJCQkJcmVzb3VyY2VNZXRhZGF0YURhdGEgPSByZXNvdXJjZU1ldGFkYXRhRGF0YUxpc3QuZ2V0KDApOworCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgY3VyUmVzb3VyY2UgOiByZXNvdXJjZU1ldGFkYXRhRGF0YUxpc3QpIHsKKwkJCQkJCWlmICghY3VyUmVzb3VyY2UuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFN0YXRlKCkuZXF1YWxzKCJDRVJUSUZJRUQiKSkgeworCQkJCQkJCXJlc291cmNlTWV0YWRhdGFEYXRhID0gY3VyUmVzb3VyY2U7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHJlc291cmNlTWV0YWRhdGFEYXRhID09IG51bGwpIHsKKwkJCQkJbG9nLmRlYnVnKCJnZXRMYXRlc3RSZXNvdXJjZUJ5Q3Nhck9yTmFtZSAtIGdldEJ5Q3JpdGVyaWEoYnkgc3lzdGVtIG5hbWUpIHJldHVybmVkIDIgbGF0ZXN0IENFUlRJRklFRCB2ZXJzaW9ucyIpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJfQorCQkJCWlmIChyZXNvdXJjZU1ldGFkYXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0Q3NhclVVSUQoKSAhPSBudWxsICYmICFyZXNvdXJjZU1ldGFkYXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0Q3NhclVVSUQoKS5lcXVhbHMoY3NhclVVSUQpKSB7CisJCQkJCWxvZy5kZWJ1ZygiZ2V0TGF0ZXN0UmVzb3VyY2VCeUNzYXJPck5hbWUgLSBzYW1lIHN5c3RlbSBuYW1lIHt9IGJ1dCBkaWZmZXJlbnQgY3NhclVVSUQuIGV4aXN0IHt9IGFuZCBuZXcge30gIiwgc3lzdGVtTmFtZSwgcmVzb3VyY2VNZXRhZGF0YURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldENzYXJVVUlEKCksIGNzYXJVVUlEKTsKKwkJCQkJLy8gY29ycmVjdCBlcnJvciB3aWxsIGJlIHJldHVybmVkIGZyb20gY3JlYXRlIGZsb3cuIHdpdGggYWxsCisJCQkJCS8vIGNvcnJlY3QgYXVkaXQgcmVjb3JkcyEhISEhCisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQkJCX0KKwkJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKFN0cmluZykgcmVzb3VyY2VNZXRhZGF0YURhdGEuZ2V0VW5pcXVlSWQoKSk7CisJCQkJcmV0dXJuIHJlc291cmNlOworCQkJfQorCQl9IGVsc2UgeworCQkJcmVzb3VyY2VNZXRhZGF0YURhdGFMaXN0ID0gYnlDc2FyLmxlZnQoKS52YWx1ZSgpOworCQkJaWYgKHJlc291cmNlTWV0YWRhdGFEYXRhTGlzdC5zaXplKCkgPiAyKSB7CisJCQkJbG9nLmRlYnVnKCJnZXRMYXRlc3RSZXNvdXJjZUJ5Q3Nhck9yTmFtZSAtIGdldEJ5Q3JpdGVyaWEoYnkgY3NhcikgbXVzdCByZXR1cm4gb25seSAyIGxhdGVzdCB2ZXJzaW9uLCBidXQgd2FzIHJldHVybmVkIC0gIiArIGJ5Q3Nhci5sZWZ0KCkudmFsdWUoKS5zaXplKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJCWlmIChyZXNvdXJjZU1ldGFkYXRhRGF0YUxpc3Quc2l6ZSgpID09IDEpIHsKKwkJCQlyZXNvdXJjZU1ldGFkYXRhRGF0YSA9IHJlc291cmNlTWV0YWRhdGFEYXRhTGlzdC5nZXQoMCk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoUmVzb3VyY2VNZXRhZGF0YURhdGEgY3VyUmVzb3VyY2UgOiByZXNvdXJjZU1ldGFkYXRhRGF0YUxpc3QpIHsKKwkJCQkJaWYgKCFjdXJSZXNvdXJjZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0U3RhdGUoKS5lcXVhbHMoIkNFUlRJRklFRCIpKSB7CisJCQkJCQlyZXNvdXJjZU1ldGFkYXRhRGF0YSA9IGN1clJlc291cmNlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAocmVzb3VyY2VNZXRhZGF0YURhdGEgPT0gbnVsbCkgeworCQkJCWxvZy5kZWJ1ZygiZ2V0TGF0ZXN0UmVzb3VyY2VCeUNzYXJPck5hbWUgLSBnZXRCeUNyaXRlcmlhKGJ5IGNzYXIpIHJldHVybmVkIDIgbGF0ZXN0IENFUlRJRklFRCB2ZXJzaW9ucyIpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgoU3RyaW5nKSByZXNvdXJjZU1ldGFkYXRhRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSk7CisJCQlyZXR1cm4gcmVzb3VyY2U7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVDc2FyVXVpZFVuaXF1ZW5lc3MoU3RyaW5nIGNzYXJVVUlEKSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ1NBUl9VVUlELmdldFByb3BlcnR5KCksIGNzYXJVVUlEKTsKKworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBieUNzYXIgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHByb3BzLCBSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChieUNzYXIuaXNSaWdodCgpKSB7CisJCQlpZiAoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELmVxdWFscyhieUNzYXIucmlnaHQoKS52YWx1ZSgpKSkgeworCQkJCXJldHVybiBFaXRoZXIubGVmdChudWxsKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGJ5Q3Nhci5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoYnlDc2FyLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2UoU3RyaW5nIHVuaXF1ZUlkLCBDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQl0cnkgeworCisJCQlOb2RlVHlwZUVudW0gcmVzb3VyY2VOb2RlVHlwZSA9IE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwkJCU5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudEJ5TGFiZWxBbmRJZCA9IGdldENvbXBvbmVudEJ5TGFiZWxBbmRJZCh1bmlxdWVJZCwgcmVzb3VyY2VOb2RlVHlwZSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJaWYgKGNvbXBvbmVudEJ5TGFiZWxBbmRJZC5pc1JpZ2h0KCkpIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGNvbXBvbmVudEJ5TGFiZWxBbmRJZC5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gY29tcG9uZW50QnlMYWJlbEFuZElkLmxlZnQoKS52YWx1ZSgpOworCisJCQkvLyBUcnkgdG8gZmV0Y2ggcmVzb3VyY2UgZnJvbSB0aGUgY2FjaGUuIFRoZSByZXNvdXJjZSB3aWxsIGJlCisJCQkvLyBmZXRjaGVkIG9ubHkgaWYgdGhlIHRpbWUgb24gdGhlIGNhY2hlIGVxdWFscyB0bworCQkJLy8gdGhlIHRpbWUgb24gdGhlIGdyYXBoLgorCQkJRWl0aGVyPFJlc291cmNlLCBBY3Rpb25TdGF0dXM+IGNvbXBvbmVudEZyb21DYWNoZUlmVXBUb0RhdGUgPSB0aGlzLmdldENvbXBvbmVudEZyb21DYWNoZUlmVXBUb0RhdGUodW5pcXVlSWQsIHJlc291cmNlRGF0YSwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIFJlc291cmNlLmNsYXNzLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSk7CisJCQlpZiAoY29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZS5pc0xlZnQoKSkgeworCQkJCVJlc291cmNlIGNhY2hlZFJlc291cmNlID0gY29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlJlc291cmNlIHt9IHdpdGggdWlkIHt9IHdhcyBmZXRjaGVkIGZyb20gY2FjaGUuIiwgY2FjaGVkUmVzb3VyY2UuZ2V0TmFtZSgpLCBjYWNoZWRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2FjaGVkUmVzb3VyY2UpOworCQkJfQorCisJCQlyZXNvdXJjZSA9IGNvbnZlcnRSZXNvdXJjZURhdGFUb1Jlc291cmNlKHJlc291cmNlRGF0YSk7CisKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IG51bGw7CisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVVc2VycygpKSB7CisJCQkJc3RhdHVzID0gc2V0UmVzb3VyY2VDcmVhdG9yRnJvbUdyYXBoKHJlc291cmNlLCB1bmlxdWVJZCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfQorCisJCQkJc3RhdHVzID0gc2V0UmVzb3VyY2VMYXN0TW9kaWZpZXJGcm9tR3JhcGgocmVzb3VyY2UsIHVuaXF1ZUlkKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZVByb3BlcnRpZXMoKSkgeworCQkJCXN0YXR1cyA9IHNldFJlc291cmNlUHJvcGVydGllc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQXR0cmlidXRlc0Zyb20oKSkgeworCQkJCXN0YXR1cyA9IHNldFJlc291cmNlQXR0cmlidXRlc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlRGVyaXZlZEZyb20oKSkgeworCQkJCXN0YXR1cyA9IHNldFJlc291cmNlRGVyaXZlZEZyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQ2F0ZWdvcmllcygpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50Q2F0ZWdvcmllc0Zyb21HcmFwaChyZXNvdXJjZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBTaW5jZSBjYXBhYmlsaXRpZXMgYW5kIHJlcXVpcmVtZW50cyBhbmQgaW5zdGFuY2VzIHByb3BlcnRpZXMgYXJlCisJCQkvLyBiYXNlZCBvbiBjb21wb25lbnQgaW5zdGFuY2VzLCB0aGVuIHdlIG11c3QgZmV0Y2ggdGhlIGluc3RhbmNlcy4KKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlcygpIHx8IGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQ29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcygpIHx8IGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQ29tcG9uZW50SW5zdGFuY2VzSW5wdXRzKCkKKwkJCQkJfHwgZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVDYXBhYmlsaXRpZXMoKSB8fCBmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZVJlcXVpcmVtZW50cygpKSB7CisKKwkJCQlzdGF0dXMgPSBzZXRDb21wb25lbnRJbnN0YW5jZXNGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlLCByZXNvdXJjZU5vZGVUeXBlLCBjb21wSW5zdE5vZGVUeXBlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKworCQkJCX0KKwkJCX0KKworCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlUmVxdWlyZW1lbnRzKCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHNldFJlcXVpcmVtZW50c1N0YXR1cyA9IHNldFJlc291cmNlUmVxdWlyZW1lbnRzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSwgdHJ1ZSk7CisJCQkJaWYgKHNldFJlcXVpcmVtZW50c1N0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHNldCByZXF1aXJlbWVudCBvZiByZXNvdXJjZSAiICsgdW5pcXVlSWQgKyAiLiBzdGF0dXMgaXMgIiArIHNldFJlcXVpcmVtZW50c1N0YXR1cyk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc2V0UmVxdWlyZW1lbnRzU3RhdHVzKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUlucHV0cygpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50SW5wdXRzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSwgdHJ1ZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBzZXQgaW5wdXRzIG9mIHJlc291cmNlICIgKyB1bmlxdWVJZCArICIuIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCX0KKworCQkJfQorCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBudWxsOworCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQ2FwYWJpbGl0aWVzKCkpIHsKKwkJCQlzdG9yYWdlU3RhdHVzID0gc2V0UmVzb3VyY2VDYXBhYmlsaXRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlKTsKKwkJCQlpZiAoc3RvcmFnZVN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVBcnRpZmFjdHMoKSkgeworCQkJCXN0b3JhZ2VTdGF0dXMgPSBzZXRBcnRpZmFjdEZyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCQkJCWlmIChzdG9yYWdlU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVDb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzRnJvbSgpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCisJCQkJfQorCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0cygpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50SW5zdGFuY2VzSW5wdXRzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUludGVyZmFjZXMoKSkgeworCQkJCXN0b3JhZ2VTdGF0dXMgPSBzZXRSZXNvdXJjZUludGVyZmFjZXNGcm9tR3JhcGgodW5pcXVlSWQsIHJlc291cmNlKTsKKwkJCQlpZiAoc3RvcmFnZVN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVBZGRpdGlvbmFsSW5mb3JtYXRpb24oKSkgeworCQkJCXN0b3JhZ2VTdGF0dXMgPSBzZXRSZXNvdXJjZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkZyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UpOworCQkJCWlmIChzdG9yYWdlU3RhdHVzICE9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUFsbFZlcnNpb25zKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRBbGxWZXJzaW9ucyhyZXNvdXJjZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVHcm91cHMoKSkgeworCQkJCXN0YXR1cyA9IHNldEdyb3Vwc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAodHJ1ZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlcygpKSB7CisJCQkJcmVzb3VyY2Uuc2V0Q29tcG9uZW50SW5zdGFuY2VzKG51bGwpOworCQkJCXJlc291cmNlLnNldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyhudWxsKTsKKwkJCX0KKworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzb3VyY2UpOworCisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50KFN0cmluZyBpZCwgQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIGJvb2xlYW4gaW5UcmFzbmFjdGlvbikgeworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50ID0gZ2V0UmVzb3VyY2UoaWQsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBpblRyYXNuYWN0aW9uKTsKKwkJaWYgKGNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIChFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGNvbXBvbmVudDsKKwl9CisKKwkvLyBAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLCBDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBmaWx0ZXJSZXN1bHRWaWV3KSB7CisJCXJldHVybiAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgdXBkYXRlQ29tcG9uZW50RmlsdGVyUmVzdWx0KHJlc291cmNlLCBpblRyYW5zYWN0aW9uLCB0aXRhbkdlbmVyaWNEYW8sIHJlc291cmNlLmdldENsYXNzKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmlsdGVyUmVzdWx0Vmlldyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQ29tcG9uZW50RmlsdGVyUmVzdWx0KFQgY29tcG9uZW50LCBib29sZWFuIGluVHJhbnNhY3Rpb24sIENvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGZpbHRlclJlc3VsdFZpZXcpIHsKKwkJcmV0dXJuIChFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIHVwZGF0ZVJlc291cmNlKChSZXNvdXJjZSkgY29tcG9uZW50LCBpblRyYW5zYWN0aW9uLCBmaWx0ZXJSZXN1bHRWaWV3KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1NlcnZpY2VPcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvU2VydmljZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MjI5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1NlcnZpY2VPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDE1NjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhFZGdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5SZWxhdGlvbkVuZFBvaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLlNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuRmlsdGVyS2V5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZUlucHV0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudFBhcmFtZXRlcnNWaWV3OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRpc3RyaWJ1dGlvblN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW5wdXREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2VNZXRhZGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUFydGlmYWN0T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklFbGVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklTZXJ2aWNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50TWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5TZXJ2aWNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LkNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudCgic2VydmljZS1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIFNlcnZpY2VPcGVyYXRpb24gZXh0ZW5kcyBDb21wb25lbnRPcGVyYXRpb24gaW1wbGVtZW50cyBJU2VydmljZU9wZXJhdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2VydmljZU9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJQFJlc291cmNlCisJcHJpdmF0ZSBJQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb247CisKKwlAUmVzb3VyY2UKKwlwcml2YXRlIElFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb247CisKKwlwdWJsaWMgU2VydmljZU9wZXJhdGlvbigpIHsKKwkJbG9nLmRlYnVnKCJTZXJ2aWNlT3BlcmF0aW9uIGNyZWF0ZWQiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisJCXJldHVybiBjcmVhdGVTZXJ2aWNlKHNlcnZpY2UsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisKKwkJdHJ5IHsKKworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YSA9IGdldFNlcnZpY2VNZXRhRGF0YUZyb21TZXJ2aWNlKHNlcnZpY2UpOworCQkJYWRkQ29tcG9uZW50SW50ZXJuYWxGaWVsZHMoc2VydmljZURhdGEpOworCQkJU3RyaW5nIHVuaXF1ZUlkID0gKFN0cmluZykgc2VydmljZURhdGEuZ2V0VW5pcXVlSWQoKTsKKwkJCWdlbmVyYXRlVVVJRChzZXJ2aWNlKTsKKworCQkJU3RyaW5nIHVzZXJJZCA9IHNlcnZpY2UuZ2V0Q3JlYXRvclVzZXJJZCgpOworCisJCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kVXNlciA9IGZpbmRVc2VyKHVzZXJJZCk7CisKKwkJCWlmIChmaW5kVXNlci5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBmaW5kVXNlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJDYW5ub3QgZmluZCB1c2VyICIgKyB1c2VySWQgKyAiIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCXJldHVybiBzZW5kRXJyb3Ioc3RhdHVzLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKTsKKwkJCX0KKworCQkJVXNlckRhdGEgY3JlYXRvclVzZXJEYXRhID0gZmluZFVzZXIubGVmdCgpLnZhbHVlKCk7CisJCQlVc2VyRGF0YSB1cGRhdGVyVXNlckRhdGEgPSBjcmVhdG9yVXNlckRhdGE7CisJCQlTdHJpbmcgdXBkYXRlclVzZXJJZCA9IHNlcnZpY2UuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKTsKKwkJCWlmICh1cGRhdGVyVXNlcklkICE9IG51bGwgJiYgIXVwZGF0ZXJVc2VySWQuZXF1YWxzKHVzZXJJZCkpIHsKKwkJCQlmaW5kVXNlciA9IGZpbmRVc2VyKHVwZGF0ZXJVc2VySWQpOworCQkJCWlmIChmaW5kVXNlci5pc1JpZ2h0KCkpIHsKKwkJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFVzZXIucmlnaHQoKS52YWx1ZSgpOworCQkJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIHVzZXIgIiArIHVzZXJJZCArICIgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQkJCXJldHVybiBzZW5kRXJyb3Ioc3RhdHVzLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKTsKKwkJCQl9IGVsc2UgeworCQkJCQl1cGRhdGVyVXNlckRhdGEgPSBmaW5kVXNlci5sZWZ0KCkudmFsdWUoKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIGdldCBjYXRlZ29yeQorCQkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBzZXJ2aWNlLmdldENhdGVnb3JpZXMoKTsKKwkJCUNhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEgPSBudWxsOworCisJCQlTdHJpbmcgY2F0ZWdvcnlOYW1lID0gY2F0ZWdvcmllcy5nZXQoMCkuZ2V0TmFtZSgpOworCQkJaWYgKGNhdGVnb3J5TmFtZSAhPSBudWxsKSB7CisJCQkJRWl0aGVyPENhdGVnb3J5RGF0YSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2F0ZWdvcnlSZXN1bHQgPSBlbGVtZW50T3BlcmF0aW9uCisJCQkJCQkuZ2V0TmV3Q2F0ZWdvcnlEYXRhKGNhdGVnb3J5TmFtZSwgTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJCQlpZiAoY2F0ZWdvcnlSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gY2F0ZWdvcnlSZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJCQkvKgorCQkJCQkgKiBUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhblN0YXR1cyA9IG51bGw7CisJCQkJCSAqIGlmKEFjdGlvblN0YXR1cy5DQVRFR09SWV9OT1RfRk9VTkQuZXF1YWxzKHN0YXR1cykpeworCQkJCQkgKiB0aXRhblN0YXR1cyA9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORDsgfWVsc2V7CisJCQkJCSAqIHRpdGFuU3RhdHVzID0gVGl0YW5PcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUjsgfQorCQkJCQkgKi8KKwkJCQkJbG9nLmVycm9yKCJDYW5ub3QgZmluZCBjYXRlZ29yeSAiICsgY2F0ZWdvcnlOYW1lICsgIiBpbiB0aGUgZ3JhcGguIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCX0KKworCQkJCWNhdGVnb3J5RGF0YSA9IGNhdGVnb3J5UmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCQkJfQorCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgPSBjcmVhdGVUYWdzRm9yQ29tcG9uZW50KHNlcnZpY2UpOworCQkJaWYgKHN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoc3RvcmFnZU9wZXJhdGlvblN0YXR1cyk7CisJCQl9CisKKwkJCWxvZy5kZWJ1ZygidHJ5IHRvIGNyZWF0ZSBzZXJ2aWNlIG5vZGUgb24gZ3JhcGggZm9yIGlkICIgKyBzZXJ2aWNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJCUVpdGhlcjxTZXJ2aWNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHNlcnZpY2VEYXRhLAorCQkJCQlTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChjcmVhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZU5vZGUucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiRXJyb3IgcmV0dXJuZWQgYWZ0ZXIgY3JlYXRpbmcgc2VydmljZSBkYXRhIG5vZGUgIiArIHNlcnZpY2VEYXRhICsgIi4gc3RhdHVzIHJldHVybmVkIGlzICIKKwkJCQkJCSsgc3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJbG9nLmRlYnVnKCJjcmVhdGUgc2VydmljZSBub2RlIGNyZWF0ZWQgb24gZ3JhcGggZm9yIGlkICIgKyBzZXJ2aWNlRGF0YS5nZXRVbmlxdWVJZCgpKTsKKworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlTWV0YWRhdGEgPSBhc3NvY2lhdGVNZXRhZGF0YVRvQ29tcG9uZW50KHNlcnZpY2VEYXRhLCBjcmVhdG9yVXNlckRhdGEsCisJCQkJCXVwZGF0ZXJVc2VyRGF0YSwgbnVsbCwgbnVsbCk7CisJCQlpZiAoYXNzb2NpYXRlTWV0YWRhdGEgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVNZXRhZGF0YSkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBhc3NvY2lhdGVDYXRlZ29yeSA9IGFzc29jaWF0ZU1ldGFkYXRhQ2F0ZWdvcnlUb0NvbXBvbmVudChzZXJ2aWNlRGF0YSwgY2F0ZWdvcnlEYXRhKTsKKwkJCWlmIChhc3NvY2lhdGVDYXRlZ29yeSAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGFzc29jaWF0ZUNhdGVnb3J5KSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhbGxBcnRpZmFjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4oKTsKKwkJCWlmIChzZXJ2aWNlLmdldEFydGlmYWN0cygpICE9IG51bGwpIHsKKwkJCQlhbGxBcnRpZmFjdHMucHV0QWxsKHNlcnZpY2UuZ2V0QXJ0aWZhY3RzKCkpOworCQkJfQorCQkJaWYgKHNlcnZpY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpICE9IG51bGwpIHsKKwkJCQlhbGxBcnRpZmFjdHMucHV0QWxsKHNlcnZpY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpKTsKKwkJCX0KKwkJCWlmIChzZXJ2aWNlLmdldFNlcnZpY2VBcGlBcnRpZmFjdHMoKSAhPSBudWxsKSB7CisJCQkJYWxsQXJ0aWZhY3RzLnB1dEFsbChzZXJ2aWNlLmdldFNlcnZpY2VBcGlBcnRpZmFjdHMoKSk7CisJCQl9CisJCQlpZiAoc2VydmljZS5nZXRUb3NjYUFydGlmYWN0cygpICE9IG51bGwpIHsKKwkJCQlhbGxBcnRpZmFjdHMucHV0QWxsKHNlcnZpY2UuZ2V0VG9zY2FBcnRpZmFjdHMoKSk7CisJCQl9CisKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlQXJ0aWZhY3RzID0gYXNzb2NpYXRlQXJ0aWZhY3RzVG9Db21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHNlcnZpY2VEYXRhLAorCQkJCQlhbGxBcnRpZmFjdHMpOworCQkJaWYgKGFzc29jaWF0ZUFydGlmYWN0cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGFzc29jaWF0ZUFydGlmYWN0cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlSW5wdXRzID0gYXNzb2NpYXRlSW5wdXRzVG9Db21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHNlcnZpY2VEYXRhLAorCQkJCQlzZXJ2aWNlLmdldElucHV0cygpKTsKKwkJCWlmIChhc3NvY2lhdGVJbnB1dHMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhhc3NvY2lhdGVJbnB1dHMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlMaXN0PEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24+IGFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IHNlcnZpY2UuZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCk7CisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIGFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IGFkZEFkZGl0aW9uYWxJbmZvcm1hdGlvblRvU2VydmljZSh1bmlxdWVJZCwKKwkJCQkJYWRkaXRpb25hbEluZm9ybWF0aW9uKTsKKwkJCWlmIChhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb24gIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChhZGRBZGRpdGlvbmFsSW5mb3JtYXRpb24pOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IHRoaXMuZ2V0U2VydmljZSh1bmlxdWVJZCwgdHJ1ZSk7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiQ2Fubm90IGdldCBmdWxsIHNlcnZpY2UgZnJvbSB0aGUgZ3JhcGguIHN0YXR1cyBpcyAiICsgcmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChyZXN1bHQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCX0KKworCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJU3RyaW5nIGpzb24gPSBwcmV0dHlKc29uLnRvSnNvbihyZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCQkJCWxvZy5kZWJ1ZygiU2VydmljZSByZXRyaWV2ZWQgaXMgIiArIGpzb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBleGVjdXRlIGNvbW1pdCBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgYXNzb2NpYXRlTWV0YWRhdGFDYXRlZ29yeVRvQ29tcG9uZW50KFNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGEsCisJCQlDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhKSB7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0OworCQlpZiAoY2F0ZWdvcnlEYXRhICE9IG51bGwpIHsKKwkJCXJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbihzZXJ2aWNlRGF0YSwgY2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlksIG51bGwpOworCQkJbG9nLmRlYnVnKCJBZnRlciBhc3NvY2lhdGluZyBjb21wb25lbnQgIiArIHNlcnZpY2VEYXRhLmdldFVuaXF1ZUlkKCkgKyAiIHRvIGNhdGVnb3J5ICIgKyBjYXRlZ29yeURhdGEKKwkJCQkJKyAiLiBFZGdlIHR5cGUgaXMgIiArIEdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSk7CisJCQlpZiAocmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCWxvZy5lcnJvcigiRmFpZWxkIHRvIGFzc29jaWF0ZSBjb21wb25lbnQgIiArIHNlcnZpY2VEYXRhLmdldFVuaXF1ZUlkKCkgKyAiIHRvIGNhdGVnb3J5ICIgKyBjYXRlZ29yeURhdGEKKwkJCQkJCSsgIi4gRWRnZSB0eXBlIGlzICIgKyBHcmFwaEVkZ2VMYWJlbHMuQ0FURUdPUlkpOworCQkJCXJldHVybiByZXN1bHQucmlnaHQoKS52YWx1ZSgpOworCQkJfQorCQl9CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwcml2YXRlIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uVG9TZXJ2aWNlKFN0cmluZyByZXNvdXJjZVVuaXF1ZUlkLAorCQkJTGlzdDxBZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uPiBhZGRpdGlvbmFsSW5mb3JtYXRpb24pIHsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IG51bGw7CisKKwkJaWYgKGFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9PSBudWxsIHx8IHRydWUgPT0gYWRkaXRpb25hbEluZm9ybWF0aW9uLmlzRW1wdHkoKSkgeworCQkJcmVzdWx0ID0gc3VwZXIuYWRkQWRkaXRpb25hbEluZm9ybWF0aW9uKE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXNvdXJjZVVuaXF1ZUlkLCBudWxsKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChhZGRpdGlvbmFsSW5mb3JtYXRpb24uc2l6ZSgpID09IDEpIHsKKwkJCQlyZXN1bHQgPSBzdXBlci5hZGRBZGRpdGlvbmFsSW5mb3JtYXRpb24oTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc291cmNlVW5pcXVlSWQsCisJCQkJCQlhZGRpdGlvbmFsSW5mb3JtYXRpb24uZ2V0KDApKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0ID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5CQURfUkVRVUVTVDsKKwkJCQlsb2cuaW5mbygKKwkJCQkJCSJDYW5ub3QgY3JlYXRlIHJlc291cmNlIHdpdGggbW9yZSB0aGFuIG9uZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9iamVjdC4gVGhlIG51bWJlciBvZiByZWNlaXZlZCBvYmplY3QgaXMgIgorCQkJCQkJCQkrIGFkZGl0aW9uYWxJbmZvcm1hdGlvbi5zaXplKCkpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZVNlcnZpY2UoU2VydmljZSBvdGhlciwgU3RyaW5nIHZlcnNpb24sIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gY2xvbmVTZXJ2aWNlKG90aGVyLCB2ZXJzaW9uLCBudWxsLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lU2VydmljZShTZXJ2aWNlIG90aGVyLCBTdHJpbmcgdmVyc2lvbiwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSB0YXJnZXRMaWZlY3ljbGUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKworCQl0cnkgeworCQkJU3RyaW5nIG9yaWdTZXJ2aWNlSWQgPSBvdGhlci5nZXRVbmlxdWVJZCgpOworCQkJb3RoZXIuc2V0VmVyc2lvbih2ZXJzaW9uKTsKKwkJCW90aGVyLnNldFVuaXF1ZUlkKG51bGwpOworCisJCQlFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY291bnRlclN0YXR1cyA9IGdldENvbXBvbmVudEluc3RhbmNlQ291dG5lcihvcmlnU2VydmljZUlkLAorCQkJCQlOb2RlVHlwZUVudW0uU2VydmljZSk7CisJCQlpZiAoY291bnRlclN0YXR1cy5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNvdW50ZXJTdGF0dXMucmlnaHQoKS52YWx1ZSgpOworCQkJCWxvZy5lcnJvcigiZmFpbGVkIHRvIGdldCByZXNvdXJjZSBpbnN0YW5jZSBjb3VudGVyIG9uIHNlcnZpY2Uge30uIHN0YXR1cz17fSIsIG9yaWdTZXJ2aWNlSWQsCisJCQkJCQljb3VudGVyU3RhdHVzKTsKKwkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RhdHVzKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJTWFwPFN0cmluZywgTGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0Pj4gaW5wdXRzVmFsdWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENvbXBvbmVudEluc3RhbmNlSW5wdXQ+PigpOworCQkJTGlzdDxJbnB1dERlZmluaXRpb24+IGlucHV0cyA9IG90aGVyLmdldElucHV0cygpOworCQkJaWYoaW5wdXRzICE9IG51bGwpeworCQkJCWZvcihJbnB1dERlZmluaXRpb24gaW5wdXQ6IGlucHV0cyl7CisJCQkJCQorCQkJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZUlucHV0PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGlucHV0U3RhdHVzID0gaW5wdXRPcGVyYXRpb24uZ2V0Q29tcG9uZW50SW5zdGFuY2VJbnB1dHNCeUlucHV0SWQoaW5wdXQuZ2V0VW5pcXVlSWQoKSk7CQkJCQorCQkJCQkKKwkJCQkJaWYoaW5wdXRTdGF0dXMuaXNMZWZ0KCkpeworCQkJCQkJaWYoaW5wdXRTdGF0dXMubGVmdCgpLnZhbHVlKCkgIT0gbnVsbCkKKwkJCQkJCQlpbnB1dHNWYWx1ZXNNYXAucHV0KGlucHV0LmdldE5hbWUoKSwgaW5wdXRTdGF0dXMubGVmdCgpLnZhbHVlKCkpOwkJCQkJCQorCQkJCQl9CQkJCQkKKwkJCQl9CisJCQl9CQkJCisKKwkJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVTZXJ2aWNlTUQgPSBjcmVhdGVTZXJ2aWNlKG90aGVyLCB0cnVlKTsKKwkJCQorCQkJaWYgKGNyZWF0ZVNlcnZpY2VNRC5pc1JpZ2h0KCkpIHsKKwkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVNlcnZpY2VNRC5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gY2xvbmUgc2VydmljZS4gc3RhdHVzPSB7fSIsIHN0YXR1cyk7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCisJCQlTZXJ2aWNlIHNlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlTUQubGVmdCgpLnZhbHVlKCk7CQkJCisKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBNYXA8U3RyaW5nLCBTdHJpbmc+PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2xvbmVJbnN0YW5jZXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5jbG9uZUFsbENvbXBvbmVudEluc3RhbmNlc0Zyb21Db250YWluZXJDb21wb25lbnQob3JpZ1NlcnZpY2VJZCwgc2VydmljZSwKKwkJCQkJTm9kZVR5cGVFbnVtLlNlcnZpY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdGFyZ2V0TGlmZWN5Y2xlLCBpbnB1dHNWYWx1ZXNNYXApOworCQkJaWYgKGNsb25lSW5zdGFuY2VzLmlzUmlnaHQoKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChjbG9uZUluc3RhbmNlcy5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCUVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXRSZXNvdXJjZUluc3RhbmNlQ291bnRlciA9IHNldENvbXBvbmVudEluc3RhbmNlQ291bnRlcigKKwkJCQkJc2VydmljZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uU2VydmljZSwgY291bnRlclN0YXR1cy5sZWZ0KCkudmFsdWUoKSwgdHJ1ZSk7CisJCQlpZiAoc2V0UmVzb3VyY2VJbnN0YW5jZUNvdW50ZXIuaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBzZXRSZXNvdXJjZUluc3RhbmNlQ291bnRlci5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJmYWlsZWQgdG8gc2V0IHJlc291cmNlIGluc3RhbmNlIGNvdW50ZXIgb24gc2VydmljZSB7fS4gc3RhdHVzPXt9Iiwgc2VydmljZS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJc2V0UmVzb3VyY2VJbnN0YW5jZUNvdW50ZXIpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IHRoaXMuZ2V0U2VydmljZShzZXJ2aWNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoIkNhbm5vdCBnZXQgZnVsbCBzZXJ2aWNlIGZyb20gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlc3VsdC5yaWdodCgpLnZhbHVlKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzdWx0LnJpZ2h0KCkudmFsdWUoKSk7CisJCQl9CisKKwkJCWlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJCVN0cmluZyBqc29uID0gcHJldHR5SnNvbi50b0pzb24ocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQlsb2cudHJhY2UoIlJlc291cmNlIHJldHJpZXZlZCBpcyB7fSIsIGpzb24pOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5yb2xsYmFjaygpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiR29pbmcgdG8gZXhlY3V0ZSBjb21taXQgb24gZ3JhcGguIik7CisJCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIFNlcnZpY2VNZXRhZGF0YURhdGEgZ2V0U2VydmljZU1ldGFEYXRhRnJvbVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisJCVNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YSgKKwkJCQkoU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIHNlcnZpY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpKTsKKwkJaWYgKHNlcnZpY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKSA9PSBudWxsIHx8IHNlcnZpY2UuZ2V0Tm9ybWFsaXplZE5hbWUoKS5pc0VtcHR5KCkpIHsKKwkJCXNlcnZpY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKQorCQkJCQkuc2V0Tm9ybWFsaXplZE5hbWUoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudE5hbWUoc2VydmljZS5nZXROYW1lKCkpKTsKKwkJfQorCQlpZiAoc2VydmljZS5nZXRTeXN0ZW1OYW1lKCkgPT0gbnVsbCB8fCBzZXJ2aWNlLmdldFN5c3RlbU5hbWUoKS5pc0VtcHR5KCkpIHsKKwkJCXNlcnZpY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKQorCQkJCQkuc2V0U3lzdGVtTmFtZShWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShzZXJ2aWNlLmdldE5hbWUoKSkpOworCQl9CisKKwkJcmV0dXJuIHNlcnZpY2VEYXRhOworCX0KKworCXByaXZhdGUgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlbmRFcnJvcihUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMsCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0YXR1c0lmTm90Rm91bmQpIHsKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKwkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXNJZk5vdEZvdW5kKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisKKwkvKiogCisJICogCisJICovCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlKFN0cmluZyB1bmlxdWVJZCkgeworCQlyZXR1cm4gZ2V0U2VydmljZSh1bmlxdWVJZCwgZmFsc2UpOworCX0KKworCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZShTdHJpbmcgdW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldyA9IG5ldyBDb21wb25lbnRQYXJhbWV0ZXJzVmlldygpOworCQlyZXR1cm4gZ2V0U2VydmljZSh1bmlxdWVJZCwgY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcsIGluVHJhbnNhY3Rpb24pOworCX0KKwkvLyBwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFNlcnZpY2UoU3RyaW5nCisJLy8gdW5pcXVlSWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCS8vCisJLy8gU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKKwkvLyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkvLyB0cnkgeworCS8vCisJLy8gTm9kZVR5cGVFbnVtIHNlcnZpY2VOb2RlVHlwZSA9IE5vZGVUeXBlRW51bS5TZXJ2aWNlOworCS8vIE5vZGVUeXBlRW51bSBjb21wSW5zdE5vZGVUeXBlID0gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCS8vCisJLy8gRWl0aGVyPFNlcnZpY2VNZXRhZGF0YURhdGEsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudEJ5TGFiZWwgPQorCS8vIGdldENvbXBvbmVudEJ5TGFiZWxBbmRJZCh1bmlxdWVJZCwgc2VydmljZU5vZGVUeXBlLAorCS8vIFNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCS8vIGlmIChnZXRDb21wb25lbnRCeUxhYmVsLmlzUmlnaHQoKSkgeworCS8vIHJlc3VsdCA9IEVpdGhlci5yaWdodChnZXRDb21wb25lbnRCeUxhYmVsLnJpZ2h0KCkudmFsdWUoKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLyB9CisJLy8gU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YSA9IGdldENvbXBvbmVudEJ5TGFiZWwubGVmdCgpLnZhbHVlKCk7CisJLy8gc2VydmljZSA9IGNvbnZlcnRTZXJ2aWNlRGF0YVRvU2VydmljZShzZXJ2aWNlRGF0YSk7CisJLy8KKwkvLyBUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBzZXRDb21wb25lbnRDcmVhdG9yRnJvbUdyYXBoKHNlcnZpY2UsCisJLy8gdW5pcXVlSWQsIHNlcnZpY2VOb2RlVHlwZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9CisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRDb21wb25lbnRMYXN0TW9kaWZpZXJGcm9tR3JhcGgoc2VydmljZSwgdW5pcXVlSWQsCisJLy8gc2VydmljZU5vZGVUeXBlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vCisJLy8gfQorCS8vIHN0YXR1cyA9IHNldENvbXBvbmVudENhdGVnb3JpZXNGcm9tR3JhcGgoc2VydmljZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9CisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLworCS8vIH0KKwkvLworCS8vIC8vIHN0YXR1cyA9IHNldFNlcnZpY2VQcm9wZXJ0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCByZXNvdXJjZSwgdmVydGV4KTsKKwkvLyAvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KFRpdGFuU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyAvLyB9CisJLy8KKwkvLyBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHN0b3JhZ2VTdGF0dXMgPSBzZXRBcnRpZmFjdEZyb21HcmFwaCh1bmlxdWVJZCwKKwkvLyBzZXJ2aWNlLCBzZXJ2aWNlTm9kZVR5cGUsIGFydGlmYWN0T3BlcmF0aW9uKTsKKwkvLyBpZiAoc3RvcmFnZVN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0b3JhZ2VTdGF0dXMpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0Q29tcG9uZW50SW5zdGFuY2VzRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlLAorCS8vIHNlcnZpY2VOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9CisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHNlcnZpY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXN1bHQgPQorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0Q2FwYWJpbGl0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlLAorCS8vIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldFJlcXVpcmVtZW50c0Zyb21HcmFwaCggdW5pcXVlSWQsIHNlcnZpY2UsCisJLy8gTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXN1bHQgPQorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0QWxsVmVyc2lvbnMoc2VydmljZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldFNlcnZpY2VBZGRpdGlvbmFsSW5mb3JtYXRpb25Gcm9tR3JhcGgodW5pcXVlSWQsIHNlcnZpY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRHcm91cHNGcm9tR3JhcGgodW5pcXVlSWQsIHNlcnZpY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIH0KKwkvLworCS8vIHJlc3VsdCA9IEVpdGhlci5sZWZ0KHNlcnZpY2UpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8gfSBmaW5hbGx5IHsKKwkvLyBpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCS8vIGlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJLy8gdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJLy8gfSBlbHNlIHsKKwkvLyB0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJLy8gfQorCS8vIH0KKwkvLyB9CisJLy8gfQorCisJcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlKFN0cmluZyB1bmlxdWVJZCwKKwkJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKworCQlTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJTm9kZVR5cGVFbnVtIHNlcnZpY2VOb2RlVHlwZSA9IE5vZGVUeXBlRW51bS5TZXJ2aWNlOworCQkJTm9kZVR5cGVFbnVtIGNvbXBJbnN0Tm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uUmVzb3VyY2U7CisKKwkJCUVpdGhlcjxTZXJ2aWNlTWV0YWRhdGFEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRCeUxhYmVsID0gZ2V0Q29tcG9uZW50QnlMYWJlbEFuZElkKHVuaXF1ZUlkLAorCQkJCQlzZXJ2aWNlTm9kZVR5cGUsIFNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJaWYgKGdldENvbXBvbmVudEJ5TGFiZWwuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGdldENvbXBvbmVudEJ5TGFiZWwucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YSA9IGdldENvbXBvbmVudEJ5TGFiZWwubGVmdCgpLnZhbHVlKCk7CisJCQkvLyBUcnkgdG8gZmV0Y2ggcmVzb3VyY2UgZnJvbSB0aGUgY2FjaGUuIFRoZSByZXNvdXJjZSB3aWxsIGJlCisJCQkvLyBmZXRjaGVkIG9ubHkgaWYgdGhlIHRpbWUgb24gdGhlIGNhY2hlIGVxdWFscyB0bworCQkJLy8gdGhlIHRpbWUgb24gdGhlIGdyYXBoLgorCQkJRWl0aGVyPFNlcnZpY2UsIEFjdGlvblN0YXR1cz4gY29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZSA9IHRoaXMuZ2V0Q29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZSh1bmlxdWVJZCwKKwkJCQkJc2VydmljZURhdGEsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBTZXJ2aWNlLmNsYXNzLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKTsKKwkJCWlmIChjb21wb25lbnRGcm9tQ2FjaGVJZlVwVG9EYXRlLmlzTGVmdCgpKSB7CisJCQkJU2VydmljZSBjYWNoZWRTZXJ2aWNlID0gY29tcG9uZW50RnJvbUNhY2hlSWZVcFRvRGF0ZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlsb2cuZGVidWcoIlNlcnZpY2Uge30gd2l0aCB1aWQge30gd2FzIGZldGNoZWQgZnJvbSBjYWNoZS4iLCBjYWNoZWRTZXJ2aWNlLmdldE5hbWUoKSwKKwkJCQkJCWNhY2hlZFNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNhY2hlZFNlcnZpY2UpOworCQkJfQorCisJCQlzZXJ2aWNlID0gY29udmVydFNlcnZpY2VEYXRhVG9TZXJ2aWNlKHNlcnZpY2VEYXRhKTsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IG51bGw7CisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVVc2VycygpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50Q3JlYXRvckZyb21HcmFwaChzZXJ2aWNlLCB1bmlxdWVJZCwgc2VydmljZU5vZGVUeXBlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCXN0YXR1cyA9IHNldENvbXBvbmVudExhc3RNb2RpZmllckZyb21HcmFwaChzZXJ2aWNlLCB1bmlxdWVJZCwgc2VydmljZU5vZGVUeXBlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCisJCQkJfQorCQkJfQorCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQ2F0ZWdvcmllcygpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50Q2F0ZWdvcmllc0Zyb21HcmFwaChzZXJ2aWNlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCisJCQkJfQorCQkJfQorCisJCQkvLyBzdGF0dXMgPSBzZXRTZXJ2aWNlUHJvcGVydGllc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UsCisJCQkvLyB2ZXJ0ZXgpOworCQkJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJLy8gcmV0dXJuCisJCQkvLyBFaXRoZXIucmlnaHQoVGl0YW5TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJLy8gfQorCisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVBcnRpZmFjdHMoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RvcmFnZVN0YXR1cyA9IHNldEFydGlmYWN0RnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlLCBzZXJ2aWNlTm9kZVR5cGUsCisJCQkJCQlhcnRpZmFjdE9wZXJhdGlvbik7CisJCQkJaWYgKHN0b3JhZ2VTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoc3RvcmFnZVN0YXR1cyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVDb21wb25lbnRJbnN0YW5jZXMoKQorCQkJCQl8fCBmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMoKQorCQkJCQl8fCBmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNhcGFiaWxpdGllcygpCisJCQkJCXx8IGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlUmVxdWlyZW1lbnRzKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRDb21wb25lbnRJbnN0YW5jZXNGcm9tR3JhcGgodW5pcXVlSWQsIHNlcnZpY2UsIHNlcnZpY2VOb2RlVHlwZSwgY29tcEluc3ROb2RlVHlwZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKworCQkJCX0KKwkJCX0KKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMoKSkgeworCQkJCXN0YXR1cyA9IHNldENvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHNlcnZpY2UpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQ2FwYWJpbGl0aWVzKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRDYXBhYmlsaXRpZXNGcm9tR3JhcGgodW5pcXVlSWQsIHNlcnZpY2UsIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZVJlcXVpcmVtZW50cygpKSB7CisJCQkJc3RhdHVzID0gc2V0UmVxdWlyZW1lbnRzRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlLCBOb2RlVHlwZUVudW0uU2VydmljZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmFsc2UgPT0gY29tcG9uZW50UGFyYW1ldGVyc1ZpZXcuaXNJZ25vcmVBbGxWZXJzaW9ucygpKSB7CisJCQkJc3RhdHVzID0gc2V0QWxsVmVyc2lvbnMoc2VydmljZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfQorCQkJfQorCQkJaWYgKGZhbHNlID09IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LmlzSWdub3JlQWRkaXRpb25hbEluZm9ybWF0aW9uKCkpIHsKKwkJCQlzdGF0dXMgPSBzZXRTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUdyb3VwcygpKSB7CisJCQkJc3RhdHVzID0gc2V0R3JvdXBzRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCX0KKwkJCX0KKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUlucHV0cygpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50SW5wdXRzRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlLCB0cnVlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIHNldCBpbnB1dHMgb2YgcmVzb3VyY2UgIiArIHVuaXF1ZUlkICsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJfQorCisJCQl9CisKKwkJCWlmIChmYWxzZSA9PSBjb21wb25lbnRQYXJhbWV0ZXJzVmlldy5pc0lnbm9yZUNvbXBvbmVudEluc3RhbmNlc0lucHV0cygpKSB7CisJCQkJc3RhdHVzID0gc2V0Q29tcG9uZW50SW5zdGFuY2VzSW5wdXRzRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKworCQkJCX0KKwkJCX0KKworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQoc2VydmljZSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gcHVibGljIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlX3R4KFN0cmluZworCS8vIHVuaXF1ZUlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkvLworCS8vIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7CisJLy8gRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IG51bGw7CisJLy8gdHJ5IHsKKwkvLworCS8vIE5vZGVUeXBlRW51bSBzZXJ2aWNlTm9kZVR5cGUgPSBOb2RlVHlwZUVudW0uU2VydmljZTsKKwkvLyBOb2RlVHlwZUVudW0gY29tcEluc3ROb2RlVHlwZSA9IE5vZGVUeXBlRW51bS5SZXNvdXJjZTsKKwkvLworCS8vIEVpdGhlcjxTZXJ2aWNlTWV0YWRhdGFEYXRhLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRCeUxhYmVsID0KKwkvLyBnZXRDb21wb25lbnRCeUxhYmVsQW5kSWRfdHgodW5pcXVlSWQsIHNlcnZpY2VOb2RlVHlwZSwKKwkvLyBTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkvLyBpZiAoZ2V0Q29tcG9uZW50QnlMYWJlbC5pc1JpZ2h0KCkpIHsKKwkvLyByZXN1bHQgPSBFaXRoZXIucmlnaHQoZ2V0Q29tcG9uZW50QnlMYWJlbC5yaWdodCgpLnZhbHVlKCkpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8gfQorCS8vIFNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGEgPSBnZXRDb21wb25lbnRCeUxhYmVsLmxlZnQoKS52YWx1ZSgpOworCS8vIHNlcnZpY2UgPSBjb252ZXJ0U2VydmljZURhdGFUb1NlcnZpY2Uoc2VydmljZURhdGEpOworCS8vCisJLy8gVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gc2V0Q29tcG9uZW50Q3JlYXRvckZyb21HcmFwaChzZXJ2aWNlLAorCS8vIHVuaXF1ZUlkLCBzZXJ2aWNlTm9kZVR5cGUpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXN1bHQgPQorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8gfQorCS8vCisJLy8gc3RhdHVzID0gc2V0Q29tcG9uZW50TGFzdE1vZGlmaWVyRnJvbUdyYXBoKHNlcnZpY2UsIHVuaXF1ZUlkLAorCS8vIHNlcnZpY2VOb2RlVHlwZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9CisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLworCS8vIH0KKwkvLyBzdGF0dXMgPSBzZXRDb21wb25lbnRDYXRlZ29yaWVzRnJvbUdyYXBoKHNlcnZpY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXN1bHQgPQorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8KKwkvLyB9CisJLy8KKwkvLyAvLyBzdGF0dXMgPSBzZXRTZXJ2aWNlUHJvcGVydGllc0Zyb21HcmFwaCh1bmlxdWVJZCwgcmVzb3VyY2UsIHZlcnRleCk7CisJLy8gLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIC8vIHJldHVybgorCS8vIEVpdGhlci5yaWdodChUaXRhblN0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gLy8gfQorCS8vCisJLy8gU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdG9yYWdlU3RhdHVzID0gc2V0QXJ0aWZhY3RGcm9tR3JhcGgodW5pcXVlSWQsCisJLy8gc2VydmljZSwgc2VydmljZU5vZGVUeXBlLCBhcnRpZmFjdE9wZXJhdGlvbik7CisJLy8gaWYgKHN0b3JhZ2VTdGF0dXMgIT0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9IEVpdGhlci5yaWdodChzdG9yYWdlU3RhdHVzKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENvbXBvbmVudEluc3RhbmNlc0Zyb21HcmFwaCh1bmlxdWVJZCwgc2VydmljZSwKKwkvLyBzZXJ2aWNlTm9kZVR5cGUsIGNvbXBJbnN0Tm9kZVR5cGUpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXN1bHQgPQorCS8vIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCS8vIHJldHVybiByZXN1bHQ7CisJLy8KKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRDb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldENhcGFiaWxpdGllc0Zyb21HcmFwaCh1bmlxdWVJZCwgc2VydmljZSwKKwkvLyBOb2RlVHlwZUVudW0uU2VydmljZSk7CisJLy8gaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSykgeworCS8vIHJlc3VsdCA9CisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRSZXF1aXJlbWVudHNGcm9tR3JhcGgoIHVuaXF1ZUlkLCBzZXJ2aWNlLAorCS8vIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmVzdWx0ID0KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyByZXR1cm4gcmVzdWx0OworCS8vIH0KKwkvLworCS8vIHN0YXR1cyA9IHNldEFsbFZlcnNpb25zKHNlcnZpY2UpOworCS8vIGlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0spIHsKKwkvLyByZXR1cm4KKwkvLyBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhzdGF0dXMpKTsKKwkvLyB9CisJLy8KKwkvLyBzdGF0dXMgPSBzZXRTZXJ2aWNlQWRkaXRpb25hbEluZm9ybWF0aW9uRnJvbUdyYXBoKHVuaXF1ZUlkLCBzZXJ2aWNlKTsKKwkvLyBpZiAoc3RhdHVzICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJLy8gcmV0dXJuCisJLy8gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJLy8gfQorCS8vCisJLy8gcmVzdWx0ID0gRWl0aGVyLmxlZnQoc2VydmljZSk7CisJLy8gcmV0dXJuIHJlc3VsdDsKKwkvLyB9IGZpbmFsbHkgeworCS8vIGlmIChmYWxzZSA9PSBpblRyYW5zYWN0aW9uKSB7CisJLy8gaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkvLyB0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkvLyB9IGVsc2UgeworCS8vIHRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkvLyB9CisJLy8gfQorCS8vIH0KKwkvLyB9CisKKwlAT3ZlcnJpZGUKKwlUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRDb21wb25lbnRDYXRlZ29yaWVzRnJvbUdyYXBoKENvbXBvbmVudCBzZXJ2aWNlKSB7CisKKwkJU3RyaW5nIHVuaXF1ZUlkID0gc2VydmljZS5nZXRVbmlxdWVJZCgpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhdGVnb3J5RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJlbnROb2RlID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldENoaWxkcmVuTm9kZXMoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlNlcnZpY2UpLCB1bmlxdWVJZCwKKwkJCQkJCUdyYXBoRWRnZUxhYmVscy5DQVRFR09SWSwgTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJaWYgKHBhcmVudE5vZGUuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gcGFyZW50Tm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCX0KKworCQlMaXN0PEltbXV0YWJsZVBhaXI8Q2F0ZWdvcnlEYXRhLCBHcmFwaEVkZ2U+PiBsaXN0VmFsdWUgPSBwYXJlbnROb2RlLmxlZnQoKS52YWx1ZSgpOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIlJlc3VsdCBhZnRlciBsb29raW5nIGZvciBjYXRlZ29yeSBub2RlcyBwb2ludGVkIGJ5IHNlcnZpY2Uge30uIHN0YXR1cyBpcyB7fSIsIHVuaXF1ZUlkLAorCQkJCQlsaXN0VmFsdWUpOworCQlpZiAobGlzdFZhbHVlLnNpemUoKSA+IDEpIHsKKwkJCWxvZy5lcnJvcigiTXVsdGlwbGUgZWRnZXMgZm91ZCBiZXR3ZWVuIHJlc291cmNlICIgKyB1bmlxdWVJZCArICIgdG8gY2F0ZWdvcnkgbm9kZXMuIik7CisJCX0KKwkJSW1tdXRhYmxlUGFpcjxDYXRlZ29yeURhdGEsIEdyYXBoRWRnZT4gdmFsdWUgPSBsaXN0VmFsdWUuZ2V0KDApOworCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisJCQlsb2cuZGVidWcoIkZvdW5kIHBhcmVudCBub2RlIHt9IiwgdmFsdWUpOworCisJCUNhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEgPSB2YWx1ZS5nZXRLZXkoKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmaW5pdGlvbiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oY2F0ZWdvcnlEYXRhLmdldENhdGVnb3J5RGF0YURlZmluaXRpb24oKSk7CisKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnlEZWZpbml0aW9uKTsKKwkJc2VydmljZS5zZXRDYXRlZ29yaWVzKGNhdGVnb3JpZXMpOworCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVNlcnZpY2UoU3RyaW5nIHNlcnZpY2VJZCkgeworCQlyZXR1cm4gZGVsZXRlU2VydmljZShzZXJ2aWNlSWQsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVNlcnZpY2UoU3RyaW5nIHNlcnZpY2VJZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQl0cnkgeworCisJCQlFaXRoZXI8VGl0YW5HcmFwaCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdyYXBoUmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLmdldEdyYXBoKCk7CisJCQlpZiAoZ3JhcGhSZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyCisJCQkJCQkucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhncmFwaFJlc3VsdC5yaWdodCgpLnZhbHVlKCkpKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8U2VydmljZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VOb2RlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoCisJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5TZXJ2aWNlKSwgc2VydmljZUlkLCBTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChzZXJ2aWNlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBzZXJ2aWNlTm9kZS5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBzZXJ2aWNlICIgKyBzZXJ2aWNlSWQgKyAiLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJfQorCisJCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZVJlcyA9IGdldFNlcnZpY2Uoc2VydmljZUlkLCB0cnVlKTsKKwkJCWlmIChzZXJ2aWNlUmVzLmlzUmlnaHQoKSkgeworCQkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gc2VydmljZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZmluZCBzZXZpY2UgIiArIHNlcnZpY2VJZCArICIuc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChzdGF0dXMpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUFsbFJlc291cmNlSW5zdGFuY2VzUmVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmRlbGV0ZUFsbENvbXBvbmVudEluc3RhbmNlcyhzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCB0cnVlKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgcmVzb3VyY2UgaW5zdGFuY2VzIHVuZGVyIHNlcnZpY2UgIiArIHNlcnZpY2VJZCArICIuUmVzdWx0IGlzICIKKwkJCQkJKyBkZWxldGVBbGxSZXNvdXJjZUluc3RhbmNlc1Jlcyk7CisJCQlpZiAoZGVsZXRlQWxsUmVzb3VyY2VJbnN0YW5jZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVBbGxSZXNvdXJjZUluc3RhbmNlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCQlsb2cuZXJyb3IoCisJCQkJCQkJIkZhaWxlZCB0byBkZWxldGUgcmVzb3VyY2UgaW5zdGFuY2VzIHVuZGVyIHNlcnZpY2UgIiArIHNlcnZpY2VJZCArICIgLnN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVBcnRpZmFjdHNGcm9tUmVzb3VyY2UgPSByZW1vdmVBcnRpZmFjdHNGcm9tQ29tcG9uZW50KHNlcnZpY2UsCisJCQkJCU5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgYXJ0aWZhY3RzIG5vZGVzIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyByZW1vdmVBcnRpZmFjdHNGcm9tUmVzb3VyY2UpOworCQkJaWYgKCFyZW1vdmVBcnRpZmFjdHNGcm9tUmVzb3VyY2UuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUFydGlmYWN0c0Zyb21SZXNvdXJjZSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVJbnB1dHNGcm9tUmVzb3VyY2UgPSByZW1vdmVJbnB1dHNGcm9tQ29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBzZXJ2aWNlKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgcmVxdWlyZW1lbnRzIG5vZGVzIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyByZW1vdmVJbnB1dHNGcm9tUmVzb3VyY2UpOworCQkJaWYgKHJlbW92ZUlucHV0c0Zyb21SZXNvdXJjZSAhPSBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUlucHV0c0Zyb21SZXNvdXJjZSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQ2hpbGRyZW5Ob2Rlc1JlcyA9IHRpdGFuR2VuZXJpY0RhbworCQkJCQkuZGVsZXRlQ2hpbGRyZW5Ob2RlcyhVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uU2VydmljZSksIHNlcnZpY2VJZCwKKwkJCQkJCQlHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFksIE5vZGVUeXBlRW51bS5Qcm9wZXJ0eSwgUHJvcGVydHlEYXRhLmNsYXNzKTsKKworCQkJaWYgKGRlbGV0ZUNoaWxkcmVuTm9kZXNSZXMuaXNSaWdodCgpKSB7CisJCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZGVsZXRlQ2hpbGRyZW5Ob2Rlc1Jlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJaWYgKHN0YXR1cyAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoc3RhdHVzKSk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCisJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlbW92ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkZyb21TZXJ2aWNlID0gc3VwZXIuZGVsZXRlQWRkaXRpb25hbEluZm9ybWF0aW9uKAorCQkJCQlOb2RlVHlwZUVudW0uU2VydmljZSwgc2VydmljZUlkKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBub2RlIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIKKwkJCQkJKyByZW1vdmVBZGRpdGlvbmFsSW5mb3JtYXRpb25Gcm9tU2VydmljZSk7CisJCQlpZiAoIXJlbW92ZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkZyb21TZXJ2aWNlLmVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LKSkgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChyZW1vdmVBZGRpdGlvbmFsSW5mb3JtYXRpb25Gcm9tU2VydmljZSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyByZW1vdmVHcm91cHNGcm9tU2VydmljZSA9IHN1cGVyLmRlbGV0ZUdyb3VwcyhOb2RlVHlwZUVudW0uU2VydmljZSwgc2VydmljZUlkKTsKKwkJCWxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgZ3JvdXAgbm9kZXMgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHJlbW92ZUdyb3Vwc0Zyb21TZXJ2aWNlKTsKKwkJCWlmICghcmVtb3ZlR3JvdXBzRnJvbVNlcnZpY2UuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHJlbW92ZUdyb3Vwc0Zyb21TZXJ2aWNlKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQlFaXRoZXI8U2VydmljZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVNlcnZpY2VOb2RlUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJCS5kZWxldGVOb2RlKHNlcnZpY2VOb2RlLmxlZnQoKS52YWx1ZSgpLCBTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWlmIChkZWxldGVTZXJ2aWNlTm9kZVJlcy5pc1JpZ2h0KCkpIHsKKwkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBkZWxldGVTZXJ2aWNlTm9kZVJlcy5yaWdodCgpLnZhbHVlKCk7CisJCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIHNlcnZpY2Ugbm9kZSAiICsgc2VydmljZUlkICsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKHN0YXR1cykpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCXJlc3VsdCA9IEVpdGhlci5sZWZ0KHNlcnZpY2UpOworCisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzUmlnaHQoKSkgeworCQkJCQlsb2cuZGVidWcoImRlbGV0ZVNlcnZpY2Ugb3BlcmF0aW9uIDogR29pbmcgdG8gZXhlY3V0ZSByb2xsYmFjayBvbiBncmFwaC4iKTsKKwkJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJkZWxldGVTZXJ2aWNlIG9wZXJhdGlvbiA6IEdvaW5nIHRvIGV4ZWN1dGUgY29tbWl0IG9uIGdyYXBoLiIpOworCQkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlU2VydmljZU5hbWVFeGlzdHMoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisJCXJldHVybiB2YWxpZGF0ZVNlcnZpY2VOYW1lVW5pcXVlbmVzcyhzZXJ2aWNlTmFtZSwgdGl0YW5HZW5lcmljRGFvKTsKKwl9CisKKwlwcml2YXRlIFNlcnZpY2UgY29udmVydFNlcnZpY2VEYXRhVG9TZXJ2aWNlKFNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGEpIHsKKwkJU2VydmljZU1ldGFkYXRhRGVmaW5pdGlvbiBzZXJ2aWNlTWV0YWRhdGFEZWZpbml0aW9uID0gbmV3IFNlcnZpY2VNZXRhZGF0YURlZmluaXRpb24oCisJCQkJKFNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKSBzZXJ2aWNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpOworCisJCVNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlKHNlcnZpY2VNZXRhZGF0YURlZmluaXRpb24pOworCisJCXJldHVybiBzZXJ2aWNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIENvbXBvbmVudD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsIENsYXNzPFQ+IGNsYXp6KSB7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudCA9IGdldFNlcnZpY2UoaWQpOworCQlpZiAoY29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChjb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJfQorCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2xhenouY2FzdChjb21wb25lbnQubGVmdCgpLnZhbHVlKCkpKTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgRWl0aGVyPExpc3Q8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEZvbGxvd2VkKFN0cmluZyB1c2VySWQsCisJCQlTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMsIFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJcmV0dXJuIChFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIChFaXRoZXI8PywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGdldEZvbGxvd2VkQ29tcG9uZW50KAorCQkJCXVzZXJJZCwgbGlmZWN5Y2xlU3RhdGVzLCBsYXN0U3RhdGVTdGF0ZXMsIGluVHJhbnNhY3Rpb24sIHRpdGFuR2VuZXJpY0RhbywgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZ2V0U2VydmljZShpZCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJLy8gQE92ZXJyaWRlCisJLy8gcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50X3R4KFN0cmluZyBpZCwKKwkvLyBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkvLyByZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZ2V0U2VydmljZV90eChpZCwKKwkvLyBpblRyYW5zYWN0aW9uKTsKKwkvLyB9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFNldDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q2F0YWxvZ0RhdGEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0Q29tcG9uZW50Q2F0YWxvZ0RhdGEoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHByb3BlcnRpZXNUb01hdGNoLCBTZXJ2aWNlLmNsYXNzLAorCQkJCVNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3MsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlU2VydmljZShTZXJ2aWNlIHNlcnZpY2UsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gdXBkYXRlQ29tcG9uZW50KHNlcnZpY2UsIGluVHJhbnNhY3Rpb24sIHRpdGFuR2VuZXJpY0RhbywKKwkJCQlTZXJ2aWNlLmNsYXNzLCBOb2RlVHlwZUVudW0uU2VydmljZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQ29tcG9uZW50KFQgY29tcG9uZW50LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIChFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIHVwZGF0ZVNlcnZpY2UoKFNlcnZpY2UpIGNvbXBvbmVudCwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZUNvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gKEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBkZWxldGVTZXJ2aWNlKGlkLAorCQkJCWluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb25lbnRNZXRhZGF0YURhdGEgZ2V0TWV0YURhdGFGcm9tQ29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJcmV0dXJuIGdldFNlcnZpY2VNZXRhRGF0YUZyb21TZXJ2aWNlKChTZXJ2aWNlKSBjb21wb25lbnQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExpZ2h0Q29tcG9uZW50KFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRMaWdodENvbXBvbmVudChpZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPExpc3Q8VD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldEZpbHRlcmVkQ29tcG9uZW50cyhNYXA8RmlsdGVyS2V5RW51bSwgU3RyaW5nPiBmaWx0ZXJzLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCUVpdGhlcjxMaXN0PFQ+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnRzID0gbnVsbDsKKworCQlTdHJpbmcgY2F0ZWdvcnlOYW1lID0gZmlsdGVycy5nZXQoRmlsdGVyS2V5RW51bS5DQVRFR09SWSk7CisJCVN0cmluZyBkaXN0cmlidXRpb25TdGF0dXMgPSBmaWx0ZXJzLmdldChGaWx0ZXJLZXlFbnVtLkRJU1RSSUJVVElPTl9TVEFUVVMpOworCQlEaXN0cmlidXRpb25TdGF0dXNFbnVtIGRpc3RFbnVtID0gRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5maW5kU3RhdGUoZGlzdHJpYnV0aW9uU3RhdHVzKTsKKwkJaWYgKGRpc3RyaWJ1dGlvblN0YXR1cyAhPSBudWxsICYmIGRpc3RFbnVtID09IG51bGwpIHsKKwkJCWZpbHRlcnMucmVtb3ZlKEZpbHRlcktleUVudW0uQ0FURUdPUlkpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkNBVEVHT1JZX05PVF9GT1VORCk7CisJCX0KKworCQlpZiAoY2F0ZWdvcnlOYW1lICE9IG51bGwpIHsgLy8gcHJpbWFyeSBmaWx0ZXIKKwkJCWNvbXBvbmVudHMgPSBmZXRjaEJ5Q2F0ZWdvcnlPclN1YkNhdGVnb3J5TmFtZShjYXRlZ29yeU5hbWUsIE5vZGVUeXBlRW51bS5TZXJ2aWNlTmV3Q2F0ZWdvcnksCisJCQkJCUdyYXBoRWRnZUxhYmVscy5DQVRFR09SWS5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uU2VydmljZSwgaW5UcmFuc2FjdGlvbiwKKwkJCQkJU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlpZiAoY29tcG9uZW50cy5pc0xlZnQoKSAmJiBkaXN0RW51bSAhPSBudWxsKSB7Ly8gc2Vjb25kYXJ5IGZpbHRlcgorCQkJCVByZWRpY2F0ZTxUPiBzdGF0dXNGaWx0ZXIgPSBwIC0+ICgoU2VydmljZSkgcCkuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCkuZXF1YWxzKGRpc3RFbnVtKTsKKwkJCQlyZXR1cm4gRWl0aGVyCisJCQkJCQkubGVmdChjb21wb25lbnRzLmxlZnQoKS52YWx1ZSgpLnN0cmVhbSgpLmZpbHRlcihzdGF0dXNGaWx0ZXIpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworCQkJfQorCQkJZmlsdGVycy5yZW1vdmUoRmlsdGVyS2V5RW51bS5ESVNUUklCVVRJT05fU1RBVFVTKTsKKwkJCXJldHVybiBjb21wb25lbnRzOworCQl9CisJCWNvbXBvbmVudHMgPSBmZXRjaEJ5RGlzdHJpYnV0aW9uU3RhdHVzKGRpc3RFbnVtLm5hbWUoKSwgaW5UcmFuc2FjdGlvbik7CisJCWlmIChjb21wb25lbnRzLmlzUmlnaHQoKSkgeyAvLyBub3QgZm91bmQgPT0gZW1wdHkgbGlzdAorCQkJcmV0dXJuIEVpdGhlci5sZWZ0KG5ldyBBcnJheUxpc3Q8PigpKTsKKwkJfQorCQlyZXR1cm4gY29tcG9uZW50czsKKwl9CisKKwlwcml2YXRlIDxUPiBFaXRoZXI8TGlzdDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hCeURpc3RyaWJ1dGlvblN0YXR1cyhTdHJpbmcgc3RhdHVzLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuRElTVFJJQlVUSU9OX1NUQVRVUy5nZXRQcm9wZXJ0eSgpLCBzdGF0dXMpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCXJldHVybiAoRWl0aGVyPExpc3Q8VD4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRTZXJ2aWNlTGlzdEJ5Q3JpdGVyaWEoCisJCQkJcHJvcHMsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0VGVzdGVyRm9sbG93ZWQoU3RyaW5nIHVzZXJJZCwKKwkJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxpZmVjeWNsZVN0YXRlcywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPExpc3Q8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSAoRWl0aGVyPD8sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBnZXRUZXN0ZXJGb2xsb3dlZENvbXBvbmVudCgKKwkJCQl1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgaW5UcmFuc2FjdGlvbiwgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCX0KKworCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlRGVzdHJpYnV0aW9uU3RhdHVzKFNlcnZpY2Ugc2VydmljZSwgVXNlciB1c2VyLAorCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bSBkaXN0cmlidXRpb25TdGF0dXMpIHsKKwkJU3RyaW5nIHVzZXJJZCA9IHVzZXIuZ2V0VXNlcklkKCk7CisJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRVc2VyID0gZmluZFVzZXIodXNlcklkKTsKKwkJaWYgKGZpbmRVc2VyLmlzUmlnaHQoKSkgeworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gZmluZFVzZXIucmlnaHQoKS52YWx1ZSgpOworCQkJbG9nLmVycm9yKCJDYW5ub3QgZmluZCB1c2VyICIgKyB1c2VySWQgKyAiIGluIHRoZSBncmFwaC4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQkJcmV0dXJuIHNlbmRFcnJvcihzdGF0dXMsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuVVNFUl9OT1RfRk9VTkQpOworCQl9CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gZmluZFVzZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPFNlcnZpY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlTWV0YWRhdGFEYXRhUmVxdWVzZXQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZSgKKwkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uU2VydmljZSksIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQlTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJaWYgKHNlcnZpY2VNZXRhZGF0YURhdGFSZXF1ZXNldC5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IHNlcnZpY2VNZXRhZGF0YURhdGFSZXF1ZXNldC5yaWdodCgpLnZhbHVlKCk7CisJCQlsb2cuZXJyb3IoIkNhbm5vdCBmaW5kIHNlcnZpY2UgIiArIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSArICIgaW4gdGhlIGdyYXBoLiBzdGF0dXMgaXMgIiArIHN0YXR1cyk7CisJCQlyZXR1cm4gc2VuZEVycm9yKHN0YXR1cywgU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpOworCQl9CisJCVNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZU1ldGFkYXRhRGF0YSA9IHNlcnZpY2VNZXRhZGF0YURhdGFSZXF1ZXNldC5sZWZ0KCkudmFsdWUoKTsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0s7CisKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVJbmNvbWluZ1JlbGF0aW9uID0gZGVsZXRlTGFzdERpc3RyaWJ1dGlvbk1vZGlmaWVyUmVsYXRpb24oCisJCQkJc2VydmljZSk7CisJCWlmIChkZWxldGVJbmNvbWluZ1JlbGF0aW9uLmlzUmlnaHQoKQorCQkJCSYmIGRlbGV0ZUluY29taW5nUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIHVzZXIgZnJvbSBjb21wb25lbnQgIiArIHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSArICIuIEVkZ2UgdHlwZSBpcyAiCisJCQkJCSsgR3JhcGhFZGdlTGFiZWxzLkxBU1RfRElTVFJJQlVUSU9OX1NUQVRFX01PRElGQUlFUik7CisJCQlyZXN1bHQgPSBEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGRlbGV0ZUluY29taW5nUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzdWx0KTsKKwkJfQorCisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24gPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24odXNlckRhdGEsCisJCQkJc2VydmljZU1ldGFkYXRhRGF0YSwgR3JhcGhFZGdlTGFiZWxzLkxBU1RfRElTVFJJQlVUSU9OX1NUQVRFX01PRElGQUlFUiwgbnVsbCk7CisJCWxvZy5kZWJ1ZygiQWZ0ZXIgYXNzb2NpYXRpbmcgdXNlciAiICsgdXNlckRhdGEgKyAiIHRvIGNvbXBvbmVudCAiICsgc2VydmljZU1ldGFkYXRhRGF0YS5nZXRVbmlxdWVJZCgpCisJCQkJKyAiLiBFZGdlIHR5cGUgaXMgIiArIEdyYXBoRWRnZUxhYmVscy5MQVNUX0RJU1RSSUJVVElPTl9TVEFURV9NT0RJRkFJRVIpOworCQlpZiAoY3JlYXRlUmVsYXRpb24uaXNSaWdodCgpKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBhc3NvY2lhdGUgdXNlciAiICsgdXNlckRhdGEgKyAiIHRvIGNvbXBvbmVudCAiICsgc2VydmljZU1ldGFkYXRhRGF0YS5nZXRVbmlxdWVJZCgpCisJCQkJCSsgIi4gRWRnZSB0eXBlIGlzICIgKyBHcmFwaEVkZ2VMYWJlbHMuTEFTVF9ESVNUUklCVVRJT05fU1RBVEVfTU9ESUZBSUVSKTsKKwkJCXJlc3VsdCA9IERhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMoY3JlYXRlUmVsYXRpb24ucmlnaHQoKS52YWx1ZSgpKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQocmVzdWx0KTsKKwkJfQorCQlzZXJ2aWNlLnNldERpc3RyaWJ1dGlvblN0YXR1cyhkaXN0cmlidXRpb25TdGF0dXMpOworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlUmVzcG9uc2UgPSB1cGRhdGVDb21wb25lbnQoc2VydmljZSwgdHJ1ZSwgdGl0YW5HZW5lcmljRGFvLAorCQkJCVNlcnZpY2UuY2xhc3MsIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKworCQlyZXR1cm4gdXBkYXRlUmVzcG9uc2U7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTGFzdERpc3RyaWJ1dGlvbk1vZGlmaWVyUmVsYXRpb24oU2VydmljZSBzZXJ2aWNlKSB7CisJCUdyYXBoUmVsYXRpb24gbGFzdERpc3RyaWJ1dGlvblN0YXRlTW9kaWZhaWVyUmVsYXRpb24gPSBuZXcgR3JhcGhSZWxhdGlvbigpOworCQlsYXN0RGlzdHJpYnV0aW9uU3RhdGVNb2RpZmFpZXJSZWxhdGlvbi5zZXRUeXBlKEdyYXBoRWRnZUxhYmVscy5MQVNUX0RJU1RSSUJVVElPTl9TVEFURV9NT0RJRkFJRVIuZ2V0UHJvcGVydHkoKSk7CisJCVJlbGF0aW9uRW5kUG9pbnQgcmVsYXRpb25FbmRQb2ludCA9IG5ldyBSZWxhdGlvbkVuZFBvaW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5TZXJ2aWNlKSwgc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJbGFzdERpc3RyaWJ1dGlvblN0YXRlTW9kaWZhaWVyUmVsYXRpb24uc2V0VG8ocmVsYXRpb25FbmRQb2ludCk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGVsZXRlSW5jb21pbmdSZWxhdGlvbiA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5kZWxldGVJbmNvbWluZ1JlbGF0aW9uKGxhc3REaXN0cmlidXRpb25TdGF0ZU1vZGlmYWllclJlbGF0aW9uKTsKKwkJcmV0dXJuIGRlbGV0ZUluY29taW5nUmVsYXRpb247CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxTZXQ8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENlcnRpZmllZFNlcnZpY2VzV2l0aERpc3RTdGF0dXMoCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoLCBTZXQ8RGlzdHJpYnV0aW9uU3RhdHVzRW51bT4gZGlzdFN0YXR1cywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCWxvZy5kZWJ1ZygiU3RhcnQgZ2V0Q2VydGlmaWVkU2VydmljZXNXaXRoRGlzdFN0YXR1cy4iKTsKKwkJU2V0PFNlcnZpY2U+IHNlcnZpY2VzU2V0ID0gbmV3IEhhc2hTZXQ8U2VydmljZT4oKTsKKwkJaWYgKGRpc3RTdGF0dXMgIT0gbnVsbCAmJiAhZGlzdFN0YXR1cy5pc0VtcHR5KCkpIHsKKwkJCWZvciAoRGlzdHJpYnV0aW9uU3RhdHVzRW51bSBzdGF0dXMgOiBkaXN0U3RhdHVzKSB7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQlwcm9wcy5wdXRBbGwocHJvcGVydGllc1RvTWF0Y2gpOworCQkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkRJU1RSSUJVVElPTl9TVEFUVVMuZ2V0UHJvcGVydHkoKSwgc3RhdHVzLm5hbWUoKSk7CisJCQkJRWl0aGVyPFNldDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZXMgPSByZXRyaWV2ZUNlcnRpZmllZFNlcnZpY2VzV2l0aFN0YXR1cygKKwkJCQkJCWluVHJhbnNhY3Rpb24sIHNlcnZpY2VzU2V0LCBwcm9wcyk7CisJCQkJaWYgKHNlcnZpY2VzLmlzUmlnaHQoKSkgeworCQkJCQlyZXR1cm4gc2VydmljZXM7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2VydmljZXNTZXQuYWRkQWxsKHNlcnZpY2VzLmxlZnQoKS52YWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoc2VydmljZXNTZXQpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHJldHJpZXZlQ2VydGlmaWVkU2VydmljZXNXaXRoU3RhdHVzKGluVHJhbnNhY3Rpb24sIHNlcnZpY2VzU2V0LCBwcm9wZXJ0aWVzVG9NYXRjaCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEVpdGhlcjxTZXQ8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJldHJpZXZlQ2VydGlmaWVkU2VydmljZXNXaXRoU3RhdHVzKGJvb2xlYW4gaW5UcmFuc2FjdGlvbiwKKwkJCVNldDxTZXJ2aWNlPiBzZXJ2aWNlc1NldCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcykgeworCQlFaXRoZXI8TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyaXRlcmlhUmVzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHByb3BzLCBTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJcmV0dXJuIHJldHJpZXZlQ29tcG9uZW50c0Zyb21Ob2Rlcyhjcml0ZXJpYVJlcywgaW5UcmFuc2FjdGlvbik7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlQ2F0YWxvZ0RhdGEoYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisJCXRyeSB7CisJCQkvKgorCQkJICogTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCSAqIHByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5CisJCQkgKiAoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQkJICogRWl0aGVyPExpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPgorCQkJICogbGFzdFZlcnNpb25Ob2RlcyA9IGdldExhc3RWZXJzaW9uKE5vZGVUeXBlRW51bS5TZXJ2aWNlLAorCQkJICogcHJvcGVydGllc1RvTWF0Y2gsIFNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3MpOyBpZgorCQkJICogKGxhc3RWZXJzaW9uTm9kZXMuaXNSaWdodCgpICYmIGxhc3RWZXJzaW9uTm9kZXMucmlnaHQoKS52YWx1ZSgpCisJCQkgKiAhPSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsgcmV0dXJuCisJCQkgKiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cworCQkJICogKGxhc3RWZXJzaW9uTm9kZXMucmlnaHQoKS52YWx1ZSgpKSk7IH0gTGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPgorCQkJICogbm90Q2VydGlmaWVkSGlnaGVzdCA9IChsYXN0VmVyc2lvbk5vZGVzLmlzTGVmdCgpID8KKwkJCSAqIGxhc3RWZXJzaW9uTm9kZXMubGVmdCgpLnZhbHVlKCkgOiBuZXcKKwkJCSAqIEFycmF5TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPigpKTsKKwkJCSAqIAorCQkJICogcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuCisJCQkgKiBJU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwgdHJ1ZSk7CisJCQkgKiBFaXRoZXI8TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+CisJCQkgKiBjb21wb25lbnRzTm9kZXMgPQorCQkJICogdGl0YW5HZW5lcmljRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlNlcnZpY2UsCisJCQkgKiBwcm9wZXJ0aWVzVG9NYXRjaCwgU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzcyk7IGlmCisJCQkgKiAoY29tcG9uZW50c05vZGVzLmlzUmlnaHQoKSAmJiBjb21wb25lbnRzTm9kZXMucmlnaHQoKS52YWx1ZSgpICE9CisJCQkgKiBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsgcmV0dXJuCisJCQkgKiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cworCQkJICogKGNvbXBvbmVudHNOb2Rlcy5yaWdodCgpLnZhbHVlKCkpKTsgfSBMaXN0PFNlcnZpY2VNZXRhZGF0YURhdGE+CisJCQkgKiBjZXJ0aWZpZWRIaWdoZXN0ID0gKGNvbXBvbmVudHNOb2Rlcy5pc0xlZnQoKSA/CisJCQkgKiBjb21wb25lbnRzTm9kZXMubGVmdCgpLnZhbHVlKCkgOiBuZXcKKwkJCSAqIEFycmF5TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPigpKTsKKwkJCSAqLworCisJCQlFaXRoZXI8TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGxpc3RPZkhpZ2hlc3RDb21wb25lbnRzID0gdGhpcworCQkJCQkuZ2V0TGlzdE9mSGlnaGVzdENvbXBvbmVudHMoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIFNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJaWYgKGxpc3RPZkhpZ2hlc3RDb21wb25lbnRzLmlzUmlnaHQoKQorCQkJCQkmJiBsaXN0T2ZIaWdoZXN0Q29tcG9uZW50cy5yaWdodCgpLnZhbHVlKCkgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodCgKKwkJCQkJCURhb1N0YXR1c0NvbnZlcnRlci5jb252ZXJ0VGl0YW5TdGF0dXNUb1N0b3JhZ2VTdGF0dXMobGlzdE9mSGlnaGVzdENvbXBvbmVudHMucmlnaHQoKS52YWx1ZSgpKSk7CisJCQl9CisKKwkJCUxpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4gbm90Q2VydGlmaWVkSGlnaGVzdCA9IGxpc3RPZkhpZ2hlc3RDb21wb25lbnRzLmxlZnQoKS52YWx1ZSgpOworCisJCQlMaXN0PFNlcnZpY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCQlpZiAobm90Q2VydGlmaWVkSGlnaGVzdCAhPSBudWxsICYmIGZhbHNlID09IG5vdENlcnRpZmllZEhpZ2hlc3QuaXNFbXB0eSgpKSB7CisKKwkJCQkvLyBmZXRjaCBmcm9tIGNhY2hlCisJCQkJbG9uZyBzdGFydEZldGNoQWxsRnJvbUNhY2hlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCQlNYXA8U3RyaW5nLCBMb25nPiBjb21wb25lbnRzID0gbm90Q2VydGlmaWVkSGlnaGVzdC5zdHJlYW0oKQorCQkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChwIC0+IHAuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksCisJCQkJCQkJCXAgLT4gcC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TGFzdFVwZGF0ZURhdGUoKSkpOworCisJCQkJRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4sIEFjdGlvblN0YXR1cz4gY29tcG9uZW50c0Zyb21DYWNoZUZvckNhdGFsb2cgPSB0aGlzCisJCQkJCQkuZ2V0Q29tcG9uZW50c0Zyb21DYWNoZUZvckNhdGFsb2coY29tcG9uZW50cywgQ29tcG9uZW50VHlwZUVudW0uU0VSVklDRSk7CisJCQkJaWYgKGNvbXBvbmVudHNGcm9tQ2FjaGVGb3JDYXRhbG9nLmlzTGVmdCgpKSB7CisJCQkJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnQ+LCBTZXQ8U3RyaW5nPj4gaW1tdXRhYmxlUGFpciA9IGNvbXBvbmVudHNGcm9tQ2FjaGVGb3JDYXRhbG9nLmxlZnQoKQorCQkJCQkJCS52YWx1ZSgpOworCQkJCQlMaXN0PENvbXBvbmVudD4gbGlzdCA9IGltbXV0YWJsZVBhaXIuZ2V0TGVmdCgpOworCQkJCQlpZiAobGlzdCAhPSBudWxsKSB7CisJCQkJCQlmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBsaXN0KSB7CisJCQkJCQkJcmVzdWx0LmFkZCgoU2VydmljZSkgY29tcG9uZW50KTsKKwkJCQkJCX0KKwkJCQkJCUxpc3Q8U3RyaW5nPiBhZGRlZFVpZHMgPSBsaXN0LnN0cmVhbSgpCisJCQkJCQkJCS5tYXAocCAtPiBwLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpKQorCQkJCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCQkJCW5vdENlcnRpZmllZEhpZ2hlc3QgPSBub3RDZXJ0aWZpZWRIaWdoZXN0LnN0cmVhbSgpCisJCQkJCQkJCS5maWx0ZXIocCAtPiBmYWxzZSA9PSBhZGRlZFVpZHMuY29udGFpbnMocC5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSkpCisJCQkJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQkJCQl9CisJCQkJfQorCQkJCWxvbmcgZW5kRmV0Y2hBbGxGcm9tQ2FjaGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQlsb2cuZGVidWcoIkZldGNoIGFsbCBjYXRhbG9nIHNlcnZpY2VzIG1ldGFkYXRhIGZyb20gY2FjaGUgdG9vayB7fSBtcyIsCisJCQkJCQkoZW5kRmV0Y2hBbGxGcm9tQ2FjaGUgLSBzdGFydEZldGNoQWxsRnJvbUNhY2hlKSk7CisJCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIHNlcnZpY2VzIGFkZGVkIHRvIGNhdGFsb2cgZnJvbSBjYWNoZSBpcyB7fSIsIHJlc3VsdC5zaXplKCkpOworCisJCQkJbG9nLmRlYnVnKCJUaGUgbnVtYmVyIG9mIHNlcnZpY2VzIG5lZWRlZCB0byBiZSBmZXRjaCBhcyBsaWdodCBjb21wb25lbnQgaXMge30iLAorCQkJCQkJbm90Q2VydGlmaWVkSGlnaGVzdC5zaXplKCkpOworCQkJCWZvciAoU2VydmljZU1ldGFkYXRhRGF0YSBkYXRhIDogbm90Q2VydGlmaWVkSGlnaGVzdCkgeworCQkJCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY29tcG9uZW50ID0gZ2V0TGlnaHRDb21wb25lbnQoCisJCQkJCQkJZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgaW5UcmFuc2FjdGlvbik7CisJCQkJCWlmIChjb21wb25lbnQuaXNSaWdodCgpKSB7CisJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBnZXQgU2VydmljZSBmb3IgaWQgPSB7fSwgZXJyb3IgOiB7fS4gU2tpcCBzZXJ2aWNlIiwgZGF0YS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCQljb21wb25lbnQucmlnaHQoKS52YWx1ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlc3VsdC5hZGQoY29tcG9uZW50LmxlZnQoKS52YWx1ZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZhbHNlID09IGluVHJhbnNhY3Rpb24pIHsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCQlsb2cuZGVidWcoIkZldGNoIGFsbCBjYXRhbG9nIHNlcnZpY2VzIHRvb2sgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICIgbXMiKTsKKwkJfQorCisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlQ2F0YWxvZ0RhdGFMYXRlc3RDZXJ0aWZpZWRBbmROb3RDZXJ0aWZpZWQoCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworCisJCXByb3BlcnRpZXMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfSElHSEVTVF9WRVJTSU9OLmdldFByb3BlcnR5KCksIHRydWUpOworCQlMaXN0PFNlcnZpY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFaXRoZXI8TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGxhc3RWZXJzaW9uTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uU2VydmljZSwgcHJvcGVydGllcywgU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJaWYgKGxhc3RWZXJzaW9uTm9kZXMuaXNSaWdodCgpICYmIGxhc3RWZXJzaW9uTm9kZXMucmlnaHQoKS52YWx1ZSgpICE9IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGxhc3RWZXJzaW9uTm9kZXMucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKworCQlMaXN0PFNlcnZpY2VNZXRhZGF0YURhdGE+IGxhdGVzdFNlcnZpY2VzOworCisJCWlmIChsYXN0VmVyc2lvbk5vZGVzLmlzTGVmdCgpKSB7CisJCQlsYXRlc3RTZXJ2aWNlcyA9IGxhc3RWZXJzaW9uTm9kZXMubGVmdCgpLnZhbHVlKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJfQorCisJCWZvciAoU2VydmljZU1ldGFkYXRhRGF0YSBkYXRhIDogbGF0ZXN0U2VydmljZXMpIHsKKwkJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjb21wb25lbnQgPSBnZXRMaWdodENvbXBvbmVudCgKKwkJCQkJZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoY29tcG9uZW50LmlzUmlnaHQoKSkgeworCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBTZXJ2aWNlIGZvciBpZCA9ICAiICsgZGF0YS5nZXRVbmlxdWVJZCgpICsgIiAgZXJyb3IgOiAiCisJCQkJCQkrIGNvbXBvbmVudC5yaWdodCgpLnZhbHVlKCkgKyAiIHNraXAgcmVzb3VyY2UiKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0LmFkZChjb21wb25lbnQubGVmdCgpLnZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlTGlzdEJ5Q3JpdGVyaWEoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcywKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uU2VydmljZS5nZXROYW1lKCkpOworCQlFaXRoZXI8TGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uU2VydmljZSwgcHJvcHMsIFNlcnZpY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJCWlmIChieUNyaXRlcmlhLmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChEYW9TdGF0dXNDb252ZXJ0ZXIuY29udmVydFRpdGFuU3RhdHVzVG9TdG9yYWdlU3RhdHVzKGJ5Q3JpdGVyaWEucmlnaHQoKS52YWx1ZSgpKSk7CisJCX0KKwkJTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZT4oKTsKKwkJTGlzdDxTZXJ2aWNlTWV0YWRhdGFEYXRhPiBzZXJ2aWNlc0RhdGFMaXN0ID0gYnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKTsKKwkJZm9yIChTZXJ2aWNlTWV0YWRhdGFEYXRhIGRhdGEgOiBzZXJ2aWNlc0RhdGFMaXN0KSB7CisJCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZSA9IGdldFNlcnZpY2UoZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJaW5UcmFuc2FjdGlvbik7CisJCQlpZiAoc2VydmljZS5pc0xlZnQoKSkgeworCQkJCXNlcnZpY2VzLmFkZChzZXJ2aWNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggcmVzb3VyY2UgZm9yIG5hbWUgPSAiICsgZGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0TmFtZSgpCisJCQkJCQkrICIgIGFuZCBpZCA9ICIgKyBkYXRhLmdldFVuaXF1ZUlkKCkpOworCQkJfQorCQl9CisJCXJldHVybiBFaXRoZXIubGVmdChzZXJ2aWNlcyk7CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRTZXJ2aWNlTGlzdEJ5VXVpZChTdHJpbmcgdXVpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRMYXRlc3RTZXJ2aWNlQnlVdWlkKHV1aWQsIGZhbHNlLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldExhdGVzdFNlcnZpY2VCeVV1aWQoU3RyaW5nIHV1aWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0TGF0ZXN0U2VydmljZUJ5VXVpZCh1dWlkLCB0cnVlLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIEVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMYXRlc3RTZXJ2aWNlQnlVdWlkKFN0cmluZyB1dWlkLCBib29sZWFuIGlzTGF0ZXN0LAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlpZiAoaXNMYXRlc3QpIHsKKwkJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0hJR0hFU1RfVkVSU0lPTi5nZXRQcm9wZXJ0eSgpLCBpc0xhdGVzdCk7CisJCX0KKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VVUlELmdldFByb3BlcnR5KCksIHV1aWQpOworCQlyZXR1cm4gZ2V0U2VydmljZUxpc3RCeUNyaXRlcmlhKHByb3BzLCBpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8U2VydmljZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFNlcnZpY2VMaXN0QnlTeXN0ZW1OYW1lKFN0cmluZyBzeXN0ZW1OYW1lLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1lTVEVNX05BTUUuZ2V0UHJvcGVydHkoKSwgc3lzdGVtTmFtZSk7CisJCXJldHVybiBnZXRTZXJ2aWNlTGlzdEJ5Q3JpdGVyaWEocHJvcHMsIGluVHJhbnNhY3Rpb24pOworCX0KKworCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLAorCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIGdldEJ5TmFtZXNBbmRWZXJzaW9uKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTk9STUFMSVpFRF9OQU1FLmdldFByb3BlcnR5KCksCisJCQkJVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudE5hbWUobmFtZSksIHZlcnNpb24sIGFkZGl0aW9uYWxQYXJhbXMsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uKSB7CisJCXJldHVybiBnZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBudWxsLCBmYWxzZSk7CisJfQorCisJcHJvdGVjdGVkIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRCeU5hbWVzQW5kVmVyc2lvbihTdHJpbmcgbmFtZUtleSwgU3RyaW5nIG5hbWVWYWx1ZSwKKwkJCVN0cmluZyB2ZXJzaW9uLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChuYW1lS2V5LCBuYW1lVmFsdWUpOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5WRVJTSU9OLmdldFByb3BlcnR5KCksIHZlcnNpb24pOworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpLCBOb2RlVHlwZUVudW0uU2VydmljZS5nZXROYW1lKCkpOworCQlpZiAoYWRkaXRpb25hbFBhcmFtcyAhPSBudWxsICYmICFhZGRpdGlvbmFsUGFyYW1zLmlzRW1wdHkoKSkgeworCQkJcHJvcHMucHV0QWxsKGFkZGl0aW9uYWxQYXJhbXMpOworCQl9CisKKwkJRWl0aGVyPExpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBieUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHByb3BzLCBTZXJ2aWNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlpZiAoYnlDcml0ZXJpYS5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoRGFvU3RhdHVzQ29udmVydGVyLmNvbnZlcnRUaXRhblN0YXR1c1RvU3RvcmFnZVN0YXR1cyhieUNyaXRlcmlhLnJpZ2h0KCkudmFsdWUoKSkpOworCQl9CisJCUxpc3Q8U2VydmljZU1ldGFkYXRhRGF0YT4gZGF0YUxpc3QgPSBieUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpOworCQlpZiAoZGF0YUxpc3QgIT0gbnVsbCAmJiAhZGF0YUxpc3QuaXNFbXB0eSgpKSB7CisJCQlpZiAoZGF0YUxpc3Quc2l6ZSgpID4gMSkgeworCQkJCWxvZy5kZWJ1ZygiTW9yZSB0aGF0IG9uZSBpbnN0YW5jZSBvZiByZXNvdXJjZSBmb3IgbmFtZSA9IiArIG5hbWVWYWx1ZSArICIgYW5kIHZlcnNpb24gPSAiICsgdmVyc2lvbik7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJfQorCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YSA9IGRhdGFMaXN0LmdldCgwKTsKKwkJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlID0gZ2V0U2VydmljZSgKKwkJCQkJc2VydmljZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCksIGluVHJhbnNhY3Rpb24pOworCQkJaWYgKHNlcnZpY2UuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gZmV0Y2ggcmVzb3VyY2UgZm9yIG5hbWUgPSAiICsgc2VydmljZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldE5hbWUoKQorCQkJCQkJKyAiICBhbmQgaWQgPSAiICsgc2VydmljZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLmdldFVuaXF1ZUlkKCkpOworCQkJfQorCQkJcmV0dXJuIHNlcnZpY2U7CisJCX0KKwkJcmV0dXJuIEVpdGhlci5yaWdodChTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisJfQorCisJcHJvdGVjdGVkIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50QnlOYW1lQW5kVmVyc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxQYXJhbXMsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24obmFtZSwgdmVyc2lvbiwgYWRkaXRpb25hbFBhcmFtcywKKwkJCQlpblRyYW5zYWN0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFNlcnZpY2VCeVN5c3RlbU5hbWVBbmRWZXJzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwKKwkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlyZXR1cm4gZ2V0QnlOYW1lc0FuZFZlcnNpb24oR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TWVNURU1fTkFNRS5nZXRQcm9wZXJ0eSgpLCBuYW1lLCB2ZXJzaW9uLCBudWxsLAorCQkJCWluVHJhbnNhY3Rpb24pOworCX0KKworCXByaXZhdGUgVGl0YW5PcGVyYXRpb25TdGF0dXMgc2V0U2VydmljZUFkZGl0aW9uYWxJbmZvcm1hdGlvbkZyb21HcmFwaChTdHJpbmcgdW5pcXVlSWQsIFNlcnZpY2Ugc2VydmljZSkgeworCisJCUxpc3Q8QWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbj4gYWRkaXRpb25hbEluZm9ybWF0aW9uID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJRWl0aGVyPEFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBhZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24KKwkJCQkuZ2V0QWxsQWRkaXRpb25hbEluZm9ybWF0aW9uUGFyYW1ldGVycyhOb2RlVHlwZUVudW0uU2VydmljZSwgdW5pcXVlSWQsIHRydWUpOworCisJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBlaXRoZXIucmlnaHQoKS52YWx1ZSgpOworCQkJaWYgKHN0YXR1cyA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlyZXR1cm4gVGl0YW5PcGVyYXRpb25TdGF0dXMuT0s7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJQWRkaXRpb25hbEluZm9ybWF0aW9uRGVmaW5pdGlvbiBhZGRpdGlvbmFsSW5mb3JtYXRpb25EZWZpbml0aW9uID0gZWl0aGVyLmxlZnQoKS52YWx1ZSgpOworCQlhZGRpdGlvbmFsSW5mb3JtYXRpb24uYWRkKGFkZGl0aW9uYWxJbmZvcm1hdGlvbkRlZmluaXRpb24pOworCisJCXNlcnZpY2Uuc2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKGFkZGl0aW9uYWxJbmZvcm1hdGlvbik7CisKKwkJcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LOworCisJfQorCisJcHJpdmF0ZSBUaXRhbk9wZXJhdGlvblN0YXR1cyBzZXRBbGxWZXJzaW9ucyhTZXJ2aWNlIHNlcnZpY2UpIHsKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFN0cmluZz4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXMgPSBnZXRWZXJzaW9uTGlzdChOb2RlVHlwZUVudW0uU2VydmljZSwKKwkJCQlzZXJ2aWNlLmdldFZlcnNpb24oKSwgc2VydmljZSwgU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWlmIChyZXMuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gcmVzLnJpZ2h0KCkudmFsdWUoKTsKKwkJfQorCQlzZXJ2aWNlLnNldEFsbFZlcnNpb25zKHJlcy5sZWZ0KCkudmFsdWUoKSk7CisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPExpc3Q8QXJ0aWZhY3REZWZpbml0aW9uPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWRkaXRpb25hbEFydGlmYWN0cyhTdHJpbmcgcmVzb3VyY2VJZCwKKwkJCWJvb2xlYW4gcmVjdXJzaXZlbHksIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlMaXN0PEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJldHVybiBFaXRoZXIubGVmdChhcnRpZmFjdHMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzQ29tcG9uZW50RXhpc3QoU3RyaW5nIHNlcnZpY2VJZCkgeworCQlyZXR1cm4gaXNDb21wb25lbnRFeGlzdChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwl9CisKKwkvLyBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNvbXBvbmVudChUIG90aGVyLAorCS8vIFN0cmluZyB2ZXJzaW9uLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkvLyByZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgY2xvbmVTZXJ2aWNlKChTZXJ2aWNlKW90aGVyLAorCS8vIHZlcnNpb24sIGluVHJhbnNhY3Rpb24pOworCS8vIH0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lQ29tcG9uZW50KFQgb3RoZXIsIFN0cmluZyB2ZXJzaW9uLAorCQkJTGlmZWN5Y2xlU3RhdGVFbnVtIHRhcmdldExpZmVjeWNsZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiAoRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBjbG9uZVNlcnZpY2UoKFNlcnZpY2UpIG90aGVyLCB2ZXJzaW9uLCB0YXJnZXRMaWZlY3ljbGUsCisJCQkJaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxJbnRlZ2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpbmNyZWFzZUFuZEdldENvbXBvbmVudEluc3RhbmNlQ291bnRlcihTdHJpbmcgY29tcG9uZW50SWQsCisJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJcmV0dXJuIGluY3JlYXNlQW5kR2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyKGNvbXBvbmVudElkLCBOb2RlVHlwZUVudW0uU2VydmljZSwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdmFsaWRhdGVDYXRlZ29yaWVzKENvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LCBDb21wb25lbnQgY29tcG9uZW50LAorCQkJQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudERhdGEsIE5vZGVUeXBlRW51bSB0eXBlKSB7CisJCUxpc3Q8Q2F0ZWdvcnlEZWZpbml0aW9uPiBuZXdjYXRlZ29yaWVzID0gY29tcG9uZW50LmdldENhdGVnb3JpZXMoKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIG5ld0NhdCA9IG5ld2NhdGVnb3JpZXMuZ2V0KDApOworCQlDYXRlZ29yeURlZmluaXRpb24gY3VycmVudENhdGVnb3J5ID0gY3VycmVudENvbXBvbmVudC5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApOworCisJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgc3RhdHVzID0gU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSzsKKwkJaWYgKG5ld0NhdCAhPSBudWxsICYmIG5ld0NhdC5nZXROYW1lKCkgIT0gbnVsbCAmJiBmYWxzZSA9PSBuZXdDYXQuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2F0ZWdvcnkuZ2V0TmFtZSgpKSkgeworCQkJbG9nLmRlYnVnKAorCQkJCQkiR29pbmcgdG8gdXBkYXRlIHRoZSBjYXRlZ29yeSBvZiB0aGUgcmVzb3VyY2UgZnJvbSAiICsgY3VycmVudENhdGVnb3J5ICsgIiB0byAiICsgbmV3Q2F0LmdldE5hbWUoKSk7CisKKwkJCXN0YXR1cyA9IG1vdmVDYXRlZ29yeUVkZ2UoY29tcG9uZW50LCBjb21wb25lbnREYXRhLCBuZXdDYXQsIHR5cGUpOworCQkJbG9nLmRlYnVnKCJHb2luZyB0byB1cGRhdGUgdGhlIGNhdGVnb3J5IG9mIHRoZSByZXNvdXJjZSBmcm9tICIgKyBjdXJyZW50Q2F0ZWdvcnkgKyAiIHRvICIgKyBuZXdDYXQuZ2V0TmFtZSgpCisJCQkJCSsgIi4gc3RhdHVzIGlzICIgKyBzdGF0dXMpOworCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ29tcG9uZW50PiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHVwZGF0ZURlcml2ZWQoQ29tcG9uZW50IGNvbXBvbmVudCwKKwkJCUNvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LCBDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50RGF0YSwgQ2xhc3M8VD4gY2xhenopIHsKKwkJbG9nLmRlYnVnKCJEZXJpdmVkIGNsYXNzIGlzbid0IHN1cHBvcnRlZCBmb3IgcmVzb3VyY2UiKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNlcnZpY2UgZ2V0RGVmYXVsdENvbXBvbmVudCgpIHsKKwkJcmV0dXJuIG5ldyBTZXJ2aWNlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE1ldGFkYXRhQ29tcG9uZW50KFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRNZXRhZGF0YUNvbXBvbmVudChpZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGluVHJhbnNhY3Rpb24pOworCX0KKworCUBPdmVycmlkZQorCUNvbXBvbmVudCBjb252ZXJ0Q29tcG9uZW50TWV0YWRhdGFEYXRhVG9Db21wb25lbnQoQ29tcG9uZW50TWV0YWRhdGFEYXRhIGNvbXBvbmVudE1ldGFkYXRhRGF0YSkgeworCQlyZXR1cm4gY29udmVydFNlcnZpY2VEYXRhVG9TZXJ2aWNlKChTZXJ2aWNlTWV0YWRhdGFEYXRhKSBjb21wb25lbnRNZXRhZGF0YURhdGEpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdmFsaWRhdGVDb21wb25lbnROYW1lRXhpc3RzKFN0cmluZyBjb21wb25lbnROYW1lKSB7CisJCXJldHVybiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVVbmlxdWVuZXNzKGNvbXBvbmVudE5hbWUsIHRpdGFuR2VuZXJpY0RhbywgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBtYXJrQ29tcG9uZW50VG9EZWxldGUoQ29tcG9uZW50IGNvbXBvbmVudFRvRGVsZXRlLAorCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBpbnRlcm5hbE1hcmtDb21wb25lbnRUb0RlbGV0ZShjb21wb25lbnRUb0RlbGV0ZSwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0NvbXBvbmVudEluVXNlKFN0cmluZyBjb21wb25lbnRJZCkgeworCQlyZXR1cm4gaXNDb21wb25lbnRJblVzZShjb21wb25lbnRJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxTdHJpbmc+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBbGxDb21wb25lbnRzTWFya2VkRm9yRGVsZXRpb24oKSB7CisJCXJldHVybiBnZXRBbGxDb21wb25lbnRzTWFya2VkRm9yRGVsZXRpb24oTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsCisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBjb21wb25lbnRQYXJhbWV0ZXJzVmlldywgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbXBvbmVudCA9IGdldFNlcnZpY2UoaWQsIGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBpblRyYW5zYWN0aW9uKTsKKwkJaWYgKGNvbXBvbmVudC5pc1JpZ2h0KCkpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoY29tcG9uZW50LnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJcmV0dXJuIChFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGNvbXBvbmVudDsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlLCBib29sZWFuIGluVHJhbnNhY3Rpb24sCisJCQlDb21wb25lbnRQYXJhbWV0ZXJzVmlldyBmaWx0ZXJSZXN1bHRWaWV3KSB7CisJCXJldHVybiAoRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSB1cGRhdGVDb21wb25lbnRGaWx0ZXJSZXN1bHQoc2VydmljZSwgaW5UcmFuc2FjdGlvbiwKKwkJCQl0aXRhbkdlbmVyaWNEYW8sIHNlcnZpY2UuZ2V0Q2xhc3MoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZpbHRlclJlc3VsdFZpZXcpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudEZpbHRlclJlc3VsdChUIGNvbXBvbmVudCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uLAorCQkJQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgZmlsdGVyUmVzdWx0VmlldykgeworCQlyZXR1cm4gKEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgdXBkYXRlU2VydmljZSgoU2VydmljZSkgY29tcG9uZW50LCBpblRyYW5zYWN0aW9uLCBmaWx0ZXJSZXN1bHRWaWV3KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1VuaXF1ZUlkQnVpbGRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9VbmlxdWVJZEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJjZjZkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9VbmlxdWVJZEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDI0NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlNlcnZpY2VDYXRlZ29yeURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVGFnRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Vc2VyRGF0YTsKKworcHVibGljIGNsYXNzIFVuaXF1ZUlkQnVpbGRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRE9UID0gIi4iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFUX1BBUkFNX1BSRUZJWCA9ICJoZWF0XyI7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFByb3BlcnR5VW5pcXVlSWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJcmV0dXJuIHJlc291cmNlSWQgKyBET1QgKyBwcm9wZXJ0eU5hbWU7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRIZWF0UGFyYW1ldGVyVW5pcXVlSWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJcmV0dXJuIHJlc291cmNlSWQgKyBET1QgKyBIRUFUX1BBUkFNX1BSRUZJWCArIHByb3BlcnR5TmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEhlYXRQYXJhbWV0ZXJWYWx1ZVVuaXF1ZUlkKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgYXJ0aWZhY3RMYWJlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlyZXR1cm4gcmVzb3VyY2VJZCArIERPVCArIGFydGlmYWN0TGFiZWwgKyBET1QgKyBwcm9wZXJ0eU5hbWU7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwlwcml2YXRlIHN0YXRpYyBUYWdEYXRhIHRhZ0RhdGEgPSBuZXcgVGFnRGF0YSgpOworCXByaXZhdGUgc3RhdGljIFJlc291cmNlQ2F0ZWdvcnlEYXRhIHJlc0NhdGVnb3J5RGF0YSA9IG5ldyBSZXNvdXJjZUNhdGVnb3J5RGF0YSgpOworCXByaXZhdGUgc3RhdGljIFNlcnZpY2VDYXRlZ29yeURhdGEgc2VyQ2F0ZWdvcnlEYXRhID0gbmV3IFNlcnZpY2VDYXRlZ29yeURhdGEoKTsKKworCXByaXZhdGUgc3RhdGljIE1hcDxOb2RlVHlwZUVudW0sIFN0cmluZz4gbm9kZVR5cGVUb1VuaXF1ZUtleU1hcHBlciA9IG5ldyBIYXNoTWFwPE5vZGVUeXBlRW51bSwgU3RyaW5nPigpOworCisJc3RhdGljIHsKKworCQlub2RlVHlwZVRvVW5pcXVlS2V5TWFwcGVyLnB1dChOb2RlVHlwZUVudW0uVXNlciwgdXNlckRhdGEuZ2V0VW5pcXVlSWRLZXkoKSk7CisJCW5vZGVUeXBlVG9VbmlxdWVLZXlNYXBwZXIucHV0KE5vZGVUeXBlRW51bS5UYWcsIHRhZ0RhdGEuZ2V0VW5pcXVlSWRLZXkoKSk7CisJCW5vZGVUeXBlVG9VbmlxdWVLZXlNYXBwZXIucHV0KE5vZGVUeXBlRW51bS5SZXNvdXJjZUNhdGVnb3J5LCByZXNDYXRlZ29yeURhdGEuZ2V0VW5pcXVlSWRLZXkoKSk7CisJCW5vZGVUeXBlVG9VbmlxdWVLZXlNYXBwZXIucHV0KE5vZGVUeXBlRW51bS5TZXJ2aWNlQ2F0ZWdvcnksIHNlckNhdGVnb3J5RGF0YS5nZXRVbmlxdWVJZEtleSgpKTsKKwl9CisKKwkvKioKKwkgKiBmaW5kIHRoZSB1bmlxdWUgaWQga2V5IG9mIGEgbm9kZSBvbiB0aGUgZ3JhcGgKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZVR5cGVFbnVtCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtIG5vZGVUeXBlRW51bSkgeworCisJCVN0cmluZyBrZXkgPSBub2RlVHlwZVRvVW5pcXVlS2V5TWFwcGVyLmdldChub2RlVHlwZUVudW0pOworCQlpZiAoa2V5ID09IG51bGwpIHsKKwkJCWtleSA9IEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVU5JUVVFX0lELmdldFByb3BlcnR5KCk7CisJCX0KKworCQlyZXR1cm4ga2V5OworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUmVzb3VyY2VVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIGdlbmVyYXRlVVVJRCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlVVVJRCgpIHsKKwkJVVVJRCB1dWlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisJCXJldHVybiB1dWlkLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRDb21wb25lbnRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIGdlbmVyYXRlVVVJRCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkQ29uc3RhbnRQcm9kdWN0SWQoKSB7CisJCXJldHVybiBnZW5lcmF0ZVVVSUQoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZENhcGFiaWxpdHlUeXBlVWlkKFN0cmluZyB0eXBlKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkQXR0cmlidXRlVWlkKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgYXR0TmFtZSkgeworCQlyZXR1cm4gTm9kZVR5cGVFbnVtLkF0dHJpYnV0ZS5nZXROYW1lKCkgKyBET1QgKyByZXNvdXJjZUlkICsgRE9UICsgYXR0TmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFJlcXVpcmVtZW50VWlkKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgcmVxTmFtZSkgeworCQlyZXR1cm4gcmVzb3VyY2VJZCArIERPVCArIHJlcU5hbWU7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRSZXF1aXJlbWVudEltcGxVaWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyByZXFOYW1lKSB7CisKKwkJcmV0dXJuIE5vZGVUeXBlRW51bS5SZXF1aXJlbWVudEltcGwuZ2V0TmFtZSgpICsgRE9UICsgcmVzb3VyY2VJZCArIERPVCArIHJlcU5hbWU7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZENhcGFiaWxpdHlVaWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBjYXBhYmlsaXR5TmFtZSkgeworCQlyZXR1cm4gTm9kZVR5cGVFbnVtLkNhcGFiaWxpdHkuZ2V0TmFtZSgpICsgRE9UICsgcmVzb3VyY2VJZCArIERPVCArIGNhcGFiaWxpdHlOYW1lOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkQ2FwYWJpbGl0eUluc3RhbmNlVWlkKFN0cmluZyBwYXJlbnRJZCwgU3RyaW5nIGNhcGFiaWxpdHlOYW1lKSB7CisJCXJldHVybiBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eUluc3QuZ2V0TmFtZSgpICsgRE9UICsgcGFyZW50SWQgKyBET1QgKyBjYXBhYmlsaXR5TmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFByb3BlcnR5VmFsdWVVbmlxdWVJZChTdHJpbmcgcGFyZW50SWQsIFN0cmluZyBwYXJhbU5hbWUpIHsKKwkJcmV0dXJuIE5vZGVUeXBlRW51bS5Qcm9wZXJ0eVZhbHVlLmdldE5hbWUoKSArIERPVCArIHBhcmVudElkICsgRE9UICsgcGFyYW1OYW1lOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkQXJ0aWZhY3RCeUludGVyZmFjZVVuaXF1ZUlkKFN0cmluZyByZXNvdXJjZUlkLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbiwKKwkJCVN0cmluZyBhcnRpZmFjdExhYmVsKSB7CisKKwkJcmV0dXJuIHJlc291cmNlSWQgKyBET1QgKyBpbnRlcmZhY2VOYW1lICsgRE9UICsgb3BlcmF0aW9uICsgRE9UICsgYXJ0aWZhY3RMYWJlbDsKKwl9CisKKwkvLyBwdWJsaWMgc3RhdGljIFN0cmluZworCS8vIGJ1aWxkQXJ0aWZhY3RCeUludGVyZmFjZVVuaXF1ZUlkQW5kUnNyY05hbWVWZXJzaW9uKFN0cmluZworCS8vIHJlc291cmNlTmFtZSxTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLFN0cmluZyBpbnRlcmZhY2VOYW1lLFN0cmluZworCS8vIG9wZXJhdGlvbixTdHJpbmcgYXJ0aWZhY3RMYWJlbCkgeworCS8vIFN0cmluZyByZXNvdXJjZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVzb3VyY2VVbmlxdWVJZChyZXNvdXJjZU5hbWUsCisJLy8gcmVzb3VyY2VWZXJzaW9uKTsKKwkvLyByZXR1cm4gcmVzb3VyY2VJZCArIERPVCArIGludGVyZmFjZU5hbWUgKyBET1QgK29wZXJhdGlvbiArIERPVCArCisJLy8gYXJ0aWZhY3RMYWJlbDsKKwkvLyB9CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRBcnRpZmFjdEJ5SW50ZXJmYWNlVW5pcXVlSWRBbmRSc3JjSWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VOYW1lLAorCQkJU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIGFydGlmYWN0TGFiZWwpIHsKKwkJcmV0dXJuIHJlc291cmNlSWQgKyBET1QgKyBpbnRlcmZhY2VOYW1lICsgRE9UICsgb3BlcmF0aW9uICsgRE9UICsgYXJ0aWZhY3RMYWJlbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZE9wZXJhdGlvbkJ5SW50ZXJmYWNlVW5pcXVlSWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBTdHJpbmcgb3BlcmF0aW9uKSB7CisKKwkJcmV0dXJuIHJlc291cmNlSWQgKyBET1QgKyBpbnRlcmZhY2VOYW1lICsgRE9UICsgb3BlcmF0aW9uOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkSW50ZXJmYWNlVW5pcXVlSWQoU3RyaW5nIHJlc291cmNlSWQsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisJCXJldHVybiByZXNvdXJjZUlkICsgRE9UICsgaW50ZXJmYWNlTmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFJlc291cmNlSW5zdGFuY2VVbml1cWVJZChTdHJpbmcgc2VydmljZUlkLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGxvZ2ljYWxOYW1lKSB7CisKKwkJcmV0dXJuIHNlcnZpY2VJZCArIERPVCArIHJlc291cmNlSWQgKyBET1QgKyBsb2dpY2FsTmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFJlbGF0aW9uc2lwSW5zdEluc3RhbmNlVWlkKFN0cmluZyByZXNvdXJjZUluc3RVaWQsIFN0cmluZyByZXF1aXJlbWVudCkgeworCisJCXJldHVybiBnZW5lcmF0ZVVVSUQoKTsKKwl9CisKKwkvKgorCSAqIFRPRE8gUGF2ZWwgVG8gYmUgcmVtb3ZlZCB3aGVuIG5ldyBjYXRlZ29yeSBsb2dpYyBjb21lcyBpbgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUmVzb3VyY2VDYXRlZ29yeVVpZChTdHJpbmcgY2F0ZWdvcnlOYW1lLCBTdHJpbmcgc3ViY2F0ZWdvcnlOYW1lLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCQlyZXR1cm4gdHlwZS5nZXROYW1lKCkgKyBET1QgKyBjYXRlZ29yeU5hbWUgKyBET1QgKyBzdWJjYXRlZ29yeU5hbWU7CisJfQorCisJLyoKKwkgKiBUT0RPIFBhdmVsIFRvIGJlIHJlbW92ZWQgd2hlbiBuZXcgY2F0ZWdvcnkgbG9naWMgY29tZXMgaW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFNlcnZpY2VDYXRlZ29yeVVpZChTdHJpbmcgY2F0ZWdvcnlOYW1lLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCQlyZXR1cm4gdHlwZS5nZXROYW1lKCkgKyBET1QgKyBjYXRlZ29yeU5hbWU7CisJfQorCisJLy8gTmV3IGxvZ2ljCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRDYXRlZ29yeVVpZChTdHJpbmcgY2F0ZWdvcnlOYW1lLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCQlyZXR1cm4gdHlwZS5nZXROYW1lKCkgKyBET1QgKyBjYXRlZ29yeU5hbWU7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRTdWJDYXRlZ29yeVVpZChTdHJpbmcgY2F0ZWdvcnlVaWQsIFN0cmluZyBzdWJDYXRlZ29yeU5hbWUpIHsKKwkJcmV0dXJuIGNhdGVnb3J5VWlkICsgRE9UICsgc3ViQ2F0ZWdvcnlOYW1lOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkR3JvdXBpbmdVaWQoU3RyaW5nIHN1YkNhdGVnb3J5VWlkLCBTdHJpbmcgZ3JvdXBpbmdOYW1lKSB7CisJCXJldHVybiBzdWJDYXRlZ29yeVVpZCArIERPVCArIGdyb3VwaW5nTmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFJlc291cmNlSW5zdGFuY2VQcm9wZXJ0eVZhbHVlVWlkKFN0cmluZyByZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQsIEludGVnZXIgaW5kZXgpIHsKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCArIERPVCArICJwcm9wZXJ0eSIgKyBET1QgKyBpbmRleDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFJlc291cmNlSW5zdGFuY2VBdHRyaWJ1dGVWYWx1ZVVpZChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkLCBJbnRlZ2VyIGluZGV4KSB7CisJCXJldHVybiByZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQgKyBET1QgKyAiYXR0cmlidXRlIiArIERPVCArIGluZGV4OworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUmVzb3VyY2VJbnN0YW5jZUlucHV0VmFsdWVVaWQoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCwgSW50ZWdlciBpbmRleCkgeworCQlyZXR1cm4gcmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkICsgRE9UICsgImlucHV0IiArIERPVCArIGluZGV4OworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkQWRkaXRpb25hbEluZm9ybWF0aW9uVW5pcXVlSWQoU3RyaW5nIHJlc291cmNlVW5pcXVlSWQpIHsKKwkJcmV0dXJuIHJlc291cmNlVW5pcXVlSWQgKyBET1QgKyAiYWRkaXRpb25hbGluZm9ybWF0aW9uIjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEhlYXRQYXJhbVZhbHVlVWlkKFN0cmluZyBoZWF0RW52QXJ0aWZhY3RJZCwgU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKKwkJcmV0dXJuIGhlYXRFbnZBcnRpZmFjdElkICsgRE9UICsgcGFyYW1ldGVyTmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZERhdGFUeXBlVWlkKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuYW1lICsgRE9UICsgImRhdGF0eXBlIjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEludmFyaWFudFVVSUQoKSB7CisJCXJldHVybiBnZW5lcmF0ZVVVSUQoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEdyb3VwVHlwZVVpZChTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24pIHsKKwkJcmV0dXJuIHR5cGUgKyBET1QgKyB2ZXJzaW9uICsgRE9UICsgImdyb3VwdHlwZSI7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRQb2xpY3lUeXBlVWlkKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgeworCQlyZXR1cm4gdHlwZSArIERPVCArIHZlcnNpb24gKyBET1QgKyAicG9saWN5dHlwZSI7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRHcm91cFVuaXF1ZUlkKFN0cmluZyBjb21wb25lbnRJZCwgU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNvbXBvbmVudElkICsgRE9UICsgbmFtZSArIERPVCArICJncm91cCI7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRHcm91cFByb3BlcnR5VmFsdWVVaWQoU3RyaW5nIGdyb3VwVW5pcXVlSWQsIEludGVnZXIgaW5kZXgpIHsKKwkJcmV0dXJuIGdyb3VwVW5pcXVlSWQgKyBET1QgKyAicHJvcGVydHkiICsgRE9UICsgaW5kZXg7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVzZXJGdW5jdGlvbmFsTWVudVVpZChTdHJpbmcgdXNlcklkKSB7CisJCXJldHVybiB1c2VySWQgKyBET1QgKyAiZnVuY3Rpb25hbG1lbnUiOworCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Vc2VyQWRtaW5PcGVyYXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvVXNlckFkbWluT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViYjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvVXNlckFkbWluT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1MDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4UHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmFwaS5BY3Rpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuVXNlclN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5GdW5jdGlvbmFsTWVudUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JVXNlckFkbWluT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckZ1bmN0aW9uYWxNZW51RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5XcmFwcGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLk1ldGhvZEFjdGl2YXRpb25TdGF0dXNFbnVtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQENvbXBvbmVudCgidXNlci1vcGVyYXRpb24iKQorcHVibGljIGNsYXNzIFVzZXJBZG1pbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElVc2VyQWRtaW5PcGVyYXRpb24geworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlwdWJsaWMgVXNlckFkbWluT3BlcmF0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVc2VyQWRtaW5PcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBnZXRJbmFjdGl2ZVVzZXJEYXRhKFN0cmluZyBpZCkgeworCQlyZXR1cm4gZ2V0VXNlckRhdGEoaWQsIGZhbHNlLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGdldFVzZXJEYXRhKFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCXJldHVybiBnZXRVc2VyRGF0YShpZCwgdHJ1ZSwgaW5UcmFuc2FjdGlvbik7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBnZXRVc2VyRGF0YShTdHJpbmcgaWQsIGJvb2xlYW4gaXNBY3RpdmUsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQlsb2cuZGVidWcoImdldFVzZXJEYXRhIC0gc3RhcnQiKTsKKwkJV3JhcHBlcjxFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPj4gcmVzdWx0V3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJV3JhcHBlcjxVc2VyRGF0YT4gdXNlcldyYXBwZXIgPSBuZXcgV3JhcHBlcjw+KCk7CisJCXRyeSB7CisJCQl2YWxpZGF0ZVVzZXJFeGlzdHMocmVzdWx0V3JhcHBlciwgdXNlcldyYXBwZXIsIGlkKTsKKworCQkJaWYgKHJlc3VsdFdyYXBwZXIuaXNFbXB0eSgpKSB7CisJCQkJdmFsaWRhdGVVc2VyRGF0YShyZXN1bHRXcmFwcGVyLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSwgaWQpOworCisJCQl9CisJCQlpZiAocmVzdWx0V3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQlpZiAoaXNBY3RpdmUpIHsKKwkJCQkJdmFsaWRhdGVBY3RpdmVVc2VyKHJlc3VsdFdyYXBwZXIsIHVzZXJXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2YWxpZGF0ZUluQWN0aXZlVXNlcihyZXN1bHRXcmFwcGVyLCB1c2VyV3JhcHBlci5nZXRJbm5lckVsZW1lbnQoKSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAocmVzdWx0V3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIubGVmdChjb252ZXJ0VG9Vc2VyKHVzZXJXcmFwcGVyLmdldElubmVyRWxlbWVudCgpKSk7CisJCQkJcmVzdWx0V3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzdWx0KTsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZmFsc2UgPT0gaW5UcmFuc2FjdGlvbikgeworCQkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiZ2V0VXNlckRhdGEgLSBlbmQiKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUluQWN0aXZlVXNlcihXcmFwcGVyPEVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+PiByZXN1bHRXcmFwcGVyLCBVc2VyRGF0YSB1c2VyRGF0YSkgeworCQlVc2VyIHVzZXIgPSBjb252ZXJ0VG9Vc2VyKHVzZXJEYXRhKTsKKwkJaWYgKHVzZXIuZ2V0U3RhdHVzKCkgPT0gVXNlclN0YXR1c0VudW0uQUNUSVZFKSB7CisJCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLlVTRVJfTk9UX0ZPVU5EKTsKKwkJCXJlc3VsdFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3VsdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVBY3RpdmVVc2VyKFdyYXBwZXI8RWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4+IHJlc3VsdFdyYXBwZXIsIFVzZXJEYXRhIHVzZXJEYXRhKSB7CisJCVVzZXIgdXNlciA9IGNvbnZlcnRUb1VzZXIodXNlckRhdGEpOworCQlpZiAodXNlci5nZXRTdGF0dXMoKSA9PSBVc2VyU3RhdHVzRW51bS5JTkFDVElWRSkgeworCQkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5VU0VSX0lOQUNUSVZFKTsKKwkJCXJlc3VsdFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3VsdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVVc2VyRGF0YShXcmFwcGVyPEVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+PiByZXN1bHRXcmFwcGVyLCBVc2VyRGF0YSB1c2VyRGF0YSwgU3RyaW5nIGlkKSB7CisJCWlmICh1c2VyRGF0YSA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIlByb2JsZW0gZ2V0IFVzZXIgd2l0aCB1c2VySWQge30uIFJlYXNvbiAtICBlaXRoZXIubGVmdCgpLnZhbHVlKCkgPSBudWxsIiwgaWQpOworCQkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCXJlc3VsdFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3VsdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVVc2VyRXhpc3RzKFdyYXBwZXI8RWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4+IHJlc3VsdFdyYXBwZXIsIFdyYXBwZXI8VXNlckRhdGE+IHVzZXJXcmFwcGVyLAorCQkJU3RyaW5nIGlkKSB7CisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IHJlc3VsdDsKKwkJaWYgKGlkID09IG51bGwpIHsKKwkJCWxvZy5pbmZvKCJVc2VyIHVzZXJJZCAgaXMgZW1wdHkiKTsKKwkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuTUlTU0lOR19JTkZPUk1BVElPTik7CisJCQlyZXN1bHRXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXN1bHQpOworCQkJcmV0dXJuOworCQl9CisJCWlkID0gaWQudG9Mb3dlckNhc2UoKTsKKwkJRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlVzZXIpLCBpZCwgVXNlckRhdGEuY2xhc3MpOworCisJCWlmIChlaXRoZXIuaXNSaWdodCgpKSB7CisJCQlpZiAoZWl0aGVyLnJpZ2h0KCkudmFsdWUoKSA9PSBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQpIHsKKwkJCQlsb2cuZGVidWcoIlVzZXIgd2l0aCB1c2VySWQge30gbm90IGZvdW5kIiwgaWQpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuVVNFUl9OT1RfRk9VTkQpOworCQkJCXJlc3VsdFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3VsdCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygiUHJvYmxlbSBnZXQgVXNlciB3aXRoIHVzZXJJZCB7fS4gUmVhc29uIC0ge30iLCBpZCwgZWl0aGVyLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmVzdWx0V3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzdWx0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVzZXJXcmFwcGVyLnNldElubmVyRWxlbWVudChlaXRoZXIubGVmdCgpLnZhbHVlKCkpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzYXZlVXNlckRhdGEoVXNlciB1c2VyKSB7CisKKwkJRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVVzZXJEYXRhIHVzZXJEYXRhID0gY29udmVydFRvVXNlckRhdGEodXNlcik7CisJCQlyZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZSh1c2VyRGF0YSwgVXNlckRhdGEuY2xhc3MpOworCQkJaWYgKHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgc2F2aW5nIFVzZXIge30uIFJlYXNvbiAtIHt9IiwgdXNlckRhdGEudG9TdHJpbmcoKSwgcmVzdWx0LnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiVXNlciB7fSBzYXZlZCBzdWNjZXNzZnVsbHkiLCB1c2VyRGF0YS50b1N0cmluZygpKTsKKwkJCXJldHVybiBFaXRoZXIubGVmdChjb252ZXJ0VG9Vc2VyKHJlc3VsdC5sZWZ0KCkudmFsdWUoKSkpOworCisJCX0gZmluYWxseSB7CisKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmVycm9yKCJzYXZlVXNlckRhdGEgLSBGYWlsZWQiKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8ucm9sbGJhY2soKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmRlYnVnKCJzYXZlVXNlckRhdGEgLSBlbmQiKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVVzZXJEYXRhKFVzZXIgdXNlcikgeworCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJbG9nLmRlYnVnKCJ1cGRhdGVVc2VyRGF0YSAtIHN0YXJ0Iik7CisJCQlVc2VyRGF0YSB1c2VyRGF0YSA9IGNvbnZlcnRUb1VzZXJEYXRhKHVzZXIpOworCQkJcmVzdWx0ID0gdGl0YW5HZW5lcmljRGFvLnVwZGF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJCWlmIChyZXN1bHQuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJQcm9ibGVtIHdoaWxlIHVwZGF0aW5nIFVzZXIge30uIFJlYXNvbiAtIHt9IiwgdXNlckRhdGEudG9TdHJpbmcoKSwgcmVzdWx0LnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiVXNlciB7fSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSIsIHVzZXJEYXRhLnRvU3RyaW5nKCkpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnZlcnRUb1VzZXIocmVzdWx0LmxlZnQoKS52YWx1ZSgpKSk7CisKKwkJfSBmaW5hbGx5IHsKKworCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc1JpZ2h0KCkpIHsKKwkJCQlsb2cuZXJyb3IoInVwZGF0ZVVzZXJEYXRhIC0gRmFpbGVkIik7CisJCQkJdGl0YW5HZW5lcmljRGFvLnJvbGxiYWNrKCk7CisJCQl9IGVsc2UgeworCQkJCWxvZy5kZWJ1ZygidXBkYXRlVXNlckRhdGEgLSBlbmQiKTsKKwkJCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCQl9CisKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVBY3RpdmF0ZVVzZXIoVXNlciB1c2VyKSB7CisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQ7CisJCXVzZXIuc2V0U3RhdHVzKFVzZXJTdGF0dXNFbnVtLklOQUNUSVZFKTsKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHVwZGF0ZVVzZXJEYXRhKHVzZXIpOworCQlpZiAoc3RhdHVzLmlzUmlnaHQoKSkgeworCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KHN0YXR1cy5yaWdodCgpLnZhbHVlKCkpOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gRWl0aGVyLmxlZnQodXNlcik7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZGVsZXRlVXNlckRhdGEoU3RyaW5nIGlkKSB7CisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IHJlc3VsdDsKKwkJRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyR2V0ID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE5vZGUoVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlVzZXIpLCBpZCwgVXNlckRhdGEuY2xhc3MpOworCQlpZiAoZWl0aGVyR2V0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJQcm9ibGVtIHdoaWxlIHJldHJpdmluZyB1c2VyIHdpdGggdXNlcklkIHt9IiwgaWQpOworCQkJaWYgKGVpdGhlckdldC5yaWdodCgpLnZhbHVlKCkgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmVzdWx0ID0gRWl0aGVyLnJpZ2h0KEFjdGlvblN0YXR1cy5VU0VSX05PVF9GT1VORCk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IGRlbGV0ZVVzZXJMb2dpYyhlaXRoZXJHZXQubGVmdCgpLnZhbHVlKCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiBkZWxldGVVc2VyTG9naWMoVXNlckRhdGEgdXNlckRhdGEpIHsKKwkJV3JhcHBlcjxFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPj4gcmVzdWx0V3JhcHBlciA9IG5ldyBXcmFwcGVyPD4oKTsKKwkJdHJ5IHsKKwkJCXZhbGlkYXRlVXNlckhhc05vQ29ubmVjdGlvbnMocmVzdWx0V3JhcHBlciwgdXNlckRhdGEpOworCisJCQlpZiAocmVzdWx0V3JhcHBlci5pc0VtcHR5KCkpIHsKKwkJCQlkZWxldGVVc2VyKHJlc3VsdFdyYXBwZXIsIHVzZXJEYXRhKTsKKwkJCX0KKworCQl9IGZpbmFsbHkgeworCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdFdyYXBwZXIuZ2V0SW5uZXJFbGVtZW50KCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVVzZXIoV3JhcHBlcjxFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPj4gcmVzdWx0V3JhcHBlciwgVXNlckRhdGEgdXNlckRhdGEpIHsKKwkJRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyRGVsZXRlID0gdGl0YW5HZW5lcmljRGFvLmRlbGV0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJaWYgKGVpdGhlckRlbGV0ZS5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBkZWxldGluZyBVc2VyIHt9LiBSZWFzb24gLSB7fSIsIHVzZXJEYXRhLnRvU3RyaW5nKCksIGVpdGhlckRlbGV0ZS5yaWdodCgpLnZhbHVlKCkubmFtZSgpKTsKKwkJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQlyZXN1bHRXcmFwcGVyLnNldElubmVyRWxlbWVudChyZXN1bHQpOworCQl9IGVsc2UgeworCQkJbG9nLmRlYnVnKCJVc2VyIHt9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5IiwgdXNlckRhdGEudG9TdHJpbmcoKSk7CisJCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIubGVmdChjb252ZXJ0VG9Vc2VyKGVpdGhlckRlbGV0ZS5sZWZ0KCkudmFsdWUoKSkpOworCQkJcmVzdWx0V3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzdWx0KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVVzZXJIYXNOb0Nvbm5lY3Rpb25zKFdyYXBwZXI8RWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4+IHJlc3VsdFdyYXBwZXIsIFVzZXJEYXRhIHVzZXJEYXRhKSB7CisJCWlmIChyZXN1bHRXcmFwcGVyLmlzRW1wdHkoKSkgeworCisJCQlFaXRoZXI8TGlzdDxFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVkZ2VzRm9yTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRFZGdlc0Zvck5vZGUodXNlckRhdGEsCisJCQkJCURpcmVjdGlvbi5CT1RIKTsKKwkJCWlmIChlZGdlc0Zvck5vZGUuaXNSaWdodCgpKSB7CisJCQkJbG9nLmRlYnVnKCJQcm9ibGVtIHdoaWxlIGRlbGV0aW5nIFVzZXIge30uIFJlYXNvbiAtIHt9IiwgdXNlckRhdGEudG9TdHJpbmcoKSwgZWRnZXNGb3JOb2RlLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQkJcmVzdWx0V3JhcHBlci5zZXRJbm5lckVsZW1lbnQocmVzdWx0KTsKKwkJCX0gZWxzZSB7CisJCQkJTGlzdDxFZGdlPiB2ZXJ0ZXhFZGdlcyA9IGVkZ2VzRm9yTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwkJCQlpZiAodmVydGV4RWRnZXMuc2l6ZSgpID4gMCkgeworCQkJCQlFaXRoZXI8VXNlciwgQWN0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLlVTRVJfSEFTX0FDVElWRV9FTEVNRU5UUyk7CisJCQkJCXJlc3VsdFdyYXBwZXIuc2V0SW5uZXJFbGVtZW50KHJlc3VsdCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIEVpdGhlcjxMaXN0PEVkZ2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRVc2VyUGFuZGluZ1Rhc2tzTGlzdChVc2VyIHVzZXIsCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IGNvbnZlcnRUb1VzZXJEYXRhKHVzZXIpOworCisJCUVpdGhlcjxUaXRhblZlcnRleCwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHZlcnRleFVzZXIgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0VmVydGV4QnlQcm9wZXJ0eShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uVXNlciksIHVzZXIuZ2V0VXNlcklkKCkpOworCQlpZiAodmVydGV4VXNlci5pc1JpZ2h0KCkpIHsKKwkJCWxvZy5kZWJ1ZygiUHJvYmxlbSB3aGlsZSBkZWxldGluZyBVc2VyIHt9LiBSZWFzb24gLSB7fSIsIHVzZXJEYXRhLnRvU3RyaW5nKCksIHZlcnRleFVzZXIucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCX0KKworCQlMaXN0PEVkZ2U+IHBhbmRpbmdUYXNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlFaXRoZXI8TGlzdDxFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVkZ2VzID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldE91dGdvaW5nRWRnZXNCeUNyaXRlcmlhKHZlcnRleFVzZXIubGVmdCgpLnZhbHVlKCksIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgcHJvcGVydGllcyk7CisKKwkJaWYgKGVkZ2VzLmlzUmlnaHQoKSB8fCBlZGdlcy5sZWZ0KCkudmFsdWUoKSA9PSBudWxsKSB7CisJCQlpZiAoZWRnZXMucmlnaHQoKS52YWx1ZSgpID09IFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkgeworCQkJCXJldHVybiBFaXRoZXIubGVmdChwYW5kaW5nVGFza3MpOworCQkJfSBlbHNlIHsKKwkJCQlsb2cuZGVidWcoIlByb2JsZW0gd2hpbGUgZGVsZXRpbmcgVXNlciB7fSIsIHVzZXJEYXRhLnRvU3RyaW5nKCksIGVkZ2VzLnJpZ2h0KCkudmFsdWUoKS5uYW1lKCkpOworCQkJCXJldHVybiBFaXRoZXIucmlnaHQoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5HRU5FUkFMX0VSUk9SKTsKKwkJCX0KKwkJfQorCisJCWZvciAoRWRnZSBlZGdlIDogZWRnZXMubGVmdCgpLnZhbHVlKCkpIHsKKwkJCVZlcnRleCBjb21wb25lbnRWZXJ0ZXggPSBlZGdlLmluVmVydGV4KCk7CisJCQlWZXJ0ZXhQcm9wZXJ0eTxPYmplY3Q+IHByb3BlcnR5ID0gY29tcG9uZW50VmVydGV4CisJCQkJCS5wcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LklTX0RFTEVURUQuZ2V0UHJvcGVydHkoKSk7CisJCQlpZiAoIXByb3BlcnR5LmlzUHJlc2VudCgpKSB7CisJCQkJcGFuZGluZ1Rhc2tzLmFkZChlZGdlKTsKKwkJCX0gZWxzZSB7CisJCQkJQm9vbGVhbiBpc0RlbGV0ZWRWYWx1ZSA9IChqYXZhLmxhbmcuQm9vbGVhbikgcHJvcGVydHkudmFsdWUoKTsKKwkJCQlpZiAoaXNEZWxldGVkVmFsdWUgPT0gbnVsbCB8fCBpc0RlbGV0ZWRWYWx1ZSA9PSBmYWxzZSkgeworCQkJCQlwYW5kaW5nVGFza3MuYWRkKGVkZ2UpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBFaXRoZXIubGVmdChwYW5kaW5nVGFza3MpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFaXRoZXI8TGlzdDxVc2VyPiwgQWN0aW9uU3RhdHVzPiBnZXRBbGxVc2Vyc1dpdGhSb2xlKFN0cmluZyByb2xlLCBTdHJpbmcgc3RhdHVzKSB7CisJCXRyeSB7CisJCQlMaXN0PFVzZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzVG9NYXRjaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWlmIChyb2xlICE9IG51bGwgJiYgIXJvbGUudHJpbSgpLmlzRW1wdHkoKSkgeworCQkJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlJPTEUuZ2V0UHJvcGVydHkoKSwgcm9sZSk7CisJCQl9CisJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc0VtcHR5KCkpIHsKKwkJCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5VU0VSX1NUQVRVUy5nZXRQcm9wZXJ0eSgpLCBzdGF0dXMpOworCQkJfQorCisJCQlFaXRoZXI8TGlzdDxVc2VyRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1c2VyTm9kZXMgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0QnlDcml0ZXJpYShOb2RlVHlwZUVudW0uVXNlciwKKwkJCQkJcHJvcGVydGllc1RvTWF0Y2gsIFVzZXJEYXRhLmNsYXNzKTsKKworCQkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQkJaWYgKHVzZXJOb2Rlcy5pc1JpZ2h0KCkpIHsKKwkJCQkvLyBpbiBjYXNlIG9mIE5PVF9GT1VORCBmcm9tIFRpdGFuIHJldHVybiBlbXB0eSBsaXN0CisJCQkJaWYgKHVzZXJOb2Rlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmVycm9yKCJQcm9ibGVtIHdoaWxlIGdldHRpbmcgYWxsIHVzZXJzIHdpdGggcm9sZSB7fS4gUmVhc29uIC0ge30iLCByb2xlLCB1c2VyTm9kZXMucmlnaHQoKS52YWx1ZSgpLm5hbWUoKSk7CisJCQkJCXJldHVybiBFaXRoZXIucmlnaHQoQWN0aW9uU3RhdHVzLkdFTkVSQUxfRVJST1IpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJTGlzdDxVc2VyRGF0YT4gdXNlckRhdGFMaXN0ID0gdXNlck5vZGVzLmxlZnQoKS52YWx1ZSgpOworCQkJCWlmICh1c2VyRGF0YUxpc3QgIT0gbnVsbCkgeworCQkJCQlmb3IgKFVzZXJEYXRhIHVzZXJEYXRhIDogdXNlckRhdGFMaXN0KSB7CisJCQkJCQlVc2VyIHVzZXIgPSBjb252ZXJ0VG9Vc2VyKHVzZXJEYXRhKTsKKwkJCQkJCXJlc3VsdC5hZGQodXNlcik7CisJCQkJCX0KKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHJlc3VsdCk7CisJCQkJfQorCQkJCWxvZy5kZWJ1ZygiTm8gdXNlcnMgd2VyZSBmb3VuZCB3aXRoIHJvbGUge30iLCByb2xlKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQocmVzdWx0KTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBVc2VyIGNvbnZlcnRUb1VzZXIoVXNlckRhdGEgdXNlckRhdGEpIHsKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQodXNlckRhdGEuZ2V0VXNlcklkKCkpOworCQl1c2VyLnNldEVtYWlsKHVzZXJEYXRhLmdldEVtYWlsKCkpOworCQl1c2VyLnNldEZpcnN0TmFtZSh1c2VyRGF0YS5nZXRGaXJzdE5hbWUoKSk7CisJCXVzZXIuc2V0TGFzdE5hbWUodXNlckRhdGEuZ2V0TGFzdE5hbWUoKSk7CisJCXVzZXIuc2V0Um9sZSh1c2VyRGF0YS5nZXRSb2xlKCkpOworCQl1c2VyLnNldExhc3RMb2dpblRpbWUodXNlckRhdGEuZ2V0TGFzdExvZ2luVGltZSgpKTsKKwkJLy8gU3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0gdXNlciBzdGF0dXMgbWF5IG5vdCBleGlzdCBpbiBvbGQKKwkJLy8gdXNlcnMKKwkJRWl0aGVyPFVzZXJTdGF0dXNFbnVtLCBNZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bT4gZWl0aGVyID0gVXNlclN0YXR1c0VudW0uZmluZEJ5TmFtZSh1c2VyRGF0YS5nZXRTdGF0dXMoKSk7CisJCXVzZXIuc2V0U3RhdHVzKGVpdGhlci5pc0xlZnQoKSA/IGVpdGhlci5sZWZ0KCkudmFsdWUoKSA6IFVzZXJTdGF0dXNFbnVtLkFDVElWRSk7CisJCXJldHVybiB1c2VyOworCX0KKworCXByb3RlY3RlZCBVc2VyRGF0YSBjb252ZXJ0VG9Vc2VyRGF0YShVc2VyIHVzZXIpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKHVzZXIuZ2V0VXNlcklkKCkudG9Mb3dlckNhc2UoKSk7CisJCXVzZXJEYXRhLnNldEVtYWlsKHVzZXIuZ2V0RW1haWwoKSk7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpKTsKKwkJdXNlckRhdGEuc2V0TGFzdE5hbWUodXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJdXNlckRhdGEuc2V0Um9sZSh1c2VyLmdldFJvbGUoKSk7CisJCXVzZXJEYXRhLnNldFN0YXR1cyh1c2VyLmdldFN0YXR1cygpLm5hbWUoKSk7CisJCXVzZXJEYXRhLnNldExhc3RMb2dpblRpbWUodXNlci5nZXRMYXN0TG9naW5UaW1lKCkpOworCQlyZXR1cm4gdXNlckRhdGE7CisJfQorCisJcHVibGljIEVpdGhlcjxJbW11dGFibGVQYWlyPFVzZXIsIEZ1bmN0aW9uYWxNZW51SW5mbz4sIEFjdGlvblN0YXR1cz4gZ2V0VXNlckRhdGFXaXRoRnVuY3Rpb25hbE1lbnUoU3RyaW5nIHVzZXJJZCkgeworCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IHVzZXJEYXRhID0gZ2V0VXNlckRhdGEodXNlcklkLCB0cnVlLCB0cnVlKTsKKworCQlpZiAodXNlckRhdGEuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHVzZXJEYXRhLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0KKwkJVXNlciB1c2VyID0gdXNlckRhdGEubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxVc2VyRnVuY3Rpb25hbE1lbnVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZnVuY3Rpb25hbE1lbnUgPSBnZXRGdW5jdGlvbmFsTWVudSh1c2VySWQpOworCisJCUZ1bmN0aW9uYWxNZW51SW5mbyBmdW5jdGlvbmFsTWVudUluZm8gPSBuZXcgRnVuY3Rpb25hbE1lbnVJbmZvKCk7CisJCWlmIChmdW5jdGlvbmFsTWVudS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZ1bmN0aW9uYWxNZW51LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgIT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJcmV0dXJuIEVpdGhlci5yaWdodChBY3Rpb25TdGF0dXMuR0VORVJBTF9FUlJPUik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlVc2VyRnVuY3Rpb25hbE1lbnVEYXRhIHVzZXJGdW5jdGlvbmFsTWVudURhdGEgPSBmdW5jdGlvbmFsTWVudS5sZWZ0KCkudmFsdWUoKTsKKwkJCWZ1bmN0aW9uYWxNZW51SW5mby5zZXRGdW5jdGlvbmFsTWVudSh1c2VyRnVuY3Rpb25hbE1lbnVEYXRhLmdldEZ1bmN0aW9uYWxNZW51KCkpOworCQl9CisKKwkJSW1tdXRhYmxlUGFpcjxVc2VyLCBGdW5jdGlvbmFsTWVudUluZm8+IHJlc3VsdCA9IG5ldyBJbW11dGFibGVQYWlyPFVzZXIsIEZ1bmN0aW9uYWxNZW51SW5mbz4odXNlciwKKwkJCQlmdW5jdGlvbmFsTWVudUluZm8pOworCisJCXJldHVybiBFaXRoZXIubGVmdChyZXN1bHQpOworCX0KKworCXB1YmxpYyBFaXRoZXI8VXNlckZ1bmN0aW9uYWxNZW51RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldEZ1bmN0aW9uYWxNZW51KFN0cmluZyB1c2VySWQpIHsKKworCQlFaXRoZXI8VXNlckZ1bmN0aW9uYWxNZW51RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdDsKKwkJaWYgKHVzZXJJZCA9PSBudWxsKSB7CisJCQlsb2cuaW5mbygiVXNlciB1c2VySWQgIGlzIGVtcHR5Iik7CisJCQlyZXN1bHQgPSBFaXRoZXIucmlnaHQoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJdXNlcklkID0gdXNlcklkLnRvTG93ZXJDYXNlKCk7CisJCVN0cmluZyB1aWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRVc2VyRnVuY3Rpb25hbE1lbnVVaWQodXNlcklkKTsKKworCQlFaXRoZXI8VXNlckZ1bmN0aW9uYWxNZW51RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyRnVuY3Rpb25hbE1lbnUpLCB1aWQsIFVzZXJGdW5jdGlvbmFsTWVudURhdGEuY2xhc3MpOworCisJCXJldHVybiBlaXRoZXI7CisJfQorCisJcHVibGljIEVpdGhlcjxGdW5jdGlvbmFsTWVudUluZm8sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVPclVwZGF0ZUZ1bmN0aW9uYWxNZW51KFN0cmluZyB1c2VySWQsIFN0cmluZyBuZXdGdW5jdGlvbmFsTWVudSkgeworCisJCUVpdGhlcjxVc2VyRnVuY3Rpb25hbE1lbnVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZnVuY3Rpb25hbE1lbnUgPSBnZXRGdW5jdGlvbmFsTWVudSh1c2VySWQpOworCisJCWlmIChmdW5jdGlvbmFsTWVudS5pc1JpZ2h0KCkpIHsKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHN0YXR1cyA9IGZ1bmN0aW9uYWxNZW51LnJpZ2h0KCkudmFsdWUoKTsKKwkJCWlmIChzdGF0dXMgPT0gVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSB7CisJCQkJU3RyaW5nIHVpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFVzZXJGdW5jdGlvbmFsTWVudVVpZCh1c2VySWQpOworCQkJCVVzZXJGdW5jdGlvbmFsTWVudURhdGEgZnVuY3Rpb25hbE1lbnVEYXRhID0gbmV3IFVzZXJGdW5jdGlvbmFsTWVudURhdGEobmV3RnVuY3Rpb25hbE1lbnUsIHVpZCk7CisKKwkJCQlFaXRoZXI8VXNlckZ1bmN0aW9uYWxNZW51RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJCS5jcmVhdGVOb2RlKGZ1bmN0aW9uYWxNZW51RGF0YSwgVXNlckZ1bmN0aW9uYWxNZW51RGF0YS5jbGFzcyk7CisKKwkJCQlpZiAoY3JlYXRlTm9kZS5pc1JpZ2h0KCkpIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChjcmVhdGVOb2RlLnJpZ2h0KCkudmFsdWUoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGNvbnZlcnQoY3JlYXRlTm9kZS5sZWZ0KCkudmFsdWUoKSkpOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KHN0YXR1cyk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCVVzZXJGdW5jdGlvbmFsTWVudURhdGEgdXNlckZ1bmN0aW9uYWxNZW51RGF0YSA9IGZ1bmN0aW9uYWxNZW51LmxlZnQoKS52YWx1ZSgpOworCQkJdXNlckZ1bmN0aW9uYWxNZW51RGF0YS5zZXRGdW5jdGlvbmFsTWVudShuZXdGdW5jdGlvbmFsTWVudSk7CisJCQlFaXRoZXI8VXNlckZ1bmN0aW9uYWxNZW51RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkJLnVwZGF0ZU5vZGUodXNlckZ1bmN0aW9uYWxNZW51RGF0YSwgVXNlckZ1bmN0aW9uYWxNZW51RGF0YS5jbGFzcyk7CisKKwkJCWlmICh1cGRhdGVOb2RlLmlzUmlnaHQoKSkgeworCQkJCXJldHVybiBFaXRoZXIucmlnaHQodXBkYXRlTm9kZS5yaWdodCgpLnZhbHVlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY29udmVydCh1cGRhdGVOb2RlLmxlZnQoKS52YWx1ZSgpKSk7CisJCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgRnVuY3Rpb25hbE1lbnVJbmZvIGNvbnZlcnQoVXNlckZ1bmN0aW9uYWxNZW51RGF0YSBmdW5jdGlvbmFsTWVudURhdGEpIHsKKworCQlpZiAoZnVuY3Rpb25hbE1lbnVEYXRhID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJRnVuY3Rpb25hbE1lbnVJbmZvIGZ1bmN0aW9uYWxNZW51SW5mbyA9IG5ldyBGdW5jdGlvbmFsTWVudUluZm8oKTsKKwkJZnVuY3Rpb25hbE1lbnVJbmZvLnNldEZ1bmN0aW9uYWxNZW51KGZ1bmN0aW9uYWxNZW51RGF0YS5nZXRGdW5jdGlvbmFsTWVudSgpKTsKKworCQlyZXR1cm4gZnVuY3Rpb25hbE1lbnVJbmZvOworCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy91dGlscy9Db21wb25lbnRWYWxpZGF0aW9uVXRpbHMuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL3V0aWxzL0NvbXBvbmVudFZhbGlkYXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjU2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy91dGlscy9Db21wb25lbnRWYWxpZGF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMudXRpbHM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSUNvbXBvbmVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuSVNlcnZpY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBvbmVudFZhbGlkYXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbldvcmtPblJlc291cmNlKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdXNlcklkKSB7CisJCS8vIHZlcmlmeSByZXNvdXJjZSBpcyBjaGVja2VkLW91dAorCQlpZiAocmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSAhPSBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCkgeworCQkJbG9nLmRlYnVnKCJyZXNvdXJjZSBpcyBub3QgY2hlY2tlZC1vdXQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvLyB2ZXJpZnkgcmVzb3VyY2UgaXMgbm90IGRlbGV0ZWQKKwkJaWYgKChyZXNvdXJjZS5nZXRJc0RlbGV0ZWQoKSAhPSBudWxsKSAmJiAocmVzb3VyY2UuZ2V0SXNEZWxldGVkKCkgPT0gdHJ1ZSkpIHsKKwkJCWxvZy5kZWJ1ZygicmVzb3VyY2UgaXMgbWFya2VkIGFzIGRlbGV0ZSIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCS8vIHZlcmlmeSByZXNvdXJjZSBsYXN0IHVwZGF0ZSB1c2VyIGlzIHRoZSBjdXJyZW50IHVzZXIKKwkJaWYgKCF1c2VySWQuZXF1YWxzKHJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCkpKSB7CisJCQlsb2cuZGVidWcoInJlc291cmNlIGxhc3QgdXBkYXRlIGlzIG5vdCB7fSIsIHVzZXJJZCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbldvcmtPblJlc291cmNlKFN0cmluZyByZXNvdXJjZUlkLCBJUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb24sCisJCQlTdHJpbmcgdXNlcklkKSB7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VSZXN1bHQgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRMaWdodENvbXBvbmVudChyZXNvdXJjZUlkLAorCQkJCWZhbHNlKTsKKworCQlpZiAoZ2V0UmVzb3VyY2VSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byByZXRyaXZlIHJlc291cmNlLCByZXNvdXJjZSBpZCB7fSIsIHJlc291cmNlSWQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJcmV0dXJuIGNhbldvcmtPblJlc291cmNlKHJlc291cmNlLCB1c2VySWQpOworCisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbldvcmtPblNlcnZpY2UoU3RyaW5nIHNlcnZpY2VJZCwgSVNlcnZpY2VPcGVyYXRpb24gc2VydmljZU9wZXJhdGlvbiwgU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VSZXN1bHQgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldExpZ2h0Q29tcG9uZW50KHNlcnZpY2VJZCwKKwkJCQlmYWxzZSk7CisKKwkJaWYgKGdldFJlc291cmNlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgc2VydmljZSwgc2VydmljZSBpZCB7fSIsIHNlcnZpY2VJZCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU2VydmljZSBzZXJ2aWNlID0gZ2V0UmVzb3VyY2VSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJcmV0dXJuIGNhbldvcmtPbkNvbXBvbmVudChzZXJ2aWNlLCB1c2VySWQpOworCisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbldvcmtPbkNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50SWQsIElDb21wb25lbnRPcGVyYXRpb24gY29tcG9uZW50T3BlcmF0aW9uLAorCQkJU3RyaW5nIHVzZXJJZCkgeworCQlFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRSZXNvdXJjZVJlc3VsdCA9IGNvbXBvbmVudE9wZXJhdGlvbi5nZXRMaWdodENvbXBvbmVudChjb21wb25lbnRJZCwKKwkJCQlmYWxzZSk7CisKKwkJaWYgKGdldFJlc291cmNlUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcmV0cmlldmUgY29tcG9uZW50LCBjb21wb25lbnQgaWQge30iLCBjb21wb25lbnRJZCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQ29tcG9uZW50IHNlcnZpY2UgPSBnZXRSZXNvdXJjZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQlyZXR1cm4gY2FuV29ya09uQ29tcG9uZW50KHNlcnZpY2UsIHVzZXJJZCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbldvcmtPbkNvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgdXNlcklkKSB7CisJCS8vIHZlcmlmeSByZXNvdXJjZSBpcyBjaGVja2VkLW91dAorCQlpZiAoY29tcG9uZW50LmdldExpZmVjeWNsZVN0YXRlKCkgIT0gTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpIHsKKwkJCWxvZy5kZWJ1ZygicmVzb3VyY2UgaXMgbm90IGNoZWNrZWQtb3V0Iik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyB2ZXJpZnkgdXNlcklkIGlzIG5vdCBudWxsCisJCWlmICh1c2VySWQgPT0gbnVsbCkgeworCQkJbG9nLmRlYnVnKCJjdXJyZW50IHVzZXIgdXNlcklkIGlzIG51bGwiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIHZlcmlmeSByZXNvdXJjZSBsYXN0IHVwZGF0ZSB1c2VyIGlzIHRoZSBjdXJyZW50IHVzZXIKKwkJaWYgKCF1c2VySWQuZXF1YWxzKGNvbXBvbmVudC5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKSkgeworCQkJbG9nLmRlYnVnKCJyZXNvdXJjZSBsYXN0IHVwZGF0ZXIgdXNlcklkIGlzIG5vdCB7fSIsIHVzZXJJZCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy91dGlscy9HcmFwaERlbGV0ZVV0aWwuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL3V0aWxzL0dyYXBoRGVsZXRlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzgyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy91dGlscy9HcmFwaERlbGV0ZVV0aWwuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMudXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRGlyZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVkZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUudXRpbC5FbGVtZW50SGVscGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBHcmFwaERlbGV0ZVV0aWwgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdyYXBoRGVsZXRlVXRpbC5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIFRpdGFuT3BlcmF0aW9uU3RhdHVzIGRlbGV0ZUNoaWxkcmVuTm9kZXMoVmVydGV4IHJvb3RWZXJ0ZXgsIEdyYXBoRWRnZUxhYmVscyBlZGdlVHlwZSkgeworCisJCS8vIEl0ZXJhYmxlPEVkZ2U+IGVkZ2VzQ3JlYXRvckl0ZXJhYmxlID0KKwkJLy8gcm9vdFZlcnRleC5nZXRFZGdlcyhEaXJlY3Rpb24uT1VULAorCQkvLyBlZGdlVHlwZS5uYW1lKCkpOworCQlJdGVyYXRvcjxFZGdlPiBlZGdlc0NyZWF0b3JJdGVyYXRvciA9IHJvb3RWZXJ0ZXguZWRnZXMoRGlyZWN0aW9uLk9VVCwgZWRnZVR5cGUuZ2V0UHJvcGVydHkoKSk7CisKKwkJd2hpbGUgKGVkZ2VzQ3JlYXRvckl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJRWRnZSBlZGdlID0gZWRnZXNDcmVhdG9ySXRlcmF0b3IubmV4dCgpOworCQkJVmVydGV4IGluY29taW5nVmVydGV4ID0gZWRnZS5pblZlcnRleCgpOworCQkJSXRlcmF0b3I8RWRnZT4gb3V0RWRnZXMgPSBpbmNvbWluZ1ZlcnRleC5lZGdlcyhEaXJlY3Rpb24uT1VUKTsKKworCQkJaWYgKG91dEVkZ2VzLmhhc05leHQoKSkgeworCQkJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5DQU5OT1RfREVMRVRFX05PTl9MRUFGX05PREU7CisJCQl9IGVsc2UgeworCQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG51bGw7CisJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQkJCXByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKGluY29taW5nVmVydGV4KTsKKwkJCQkJbG9nLmRlYnVnKCJHb2luZyB0byBkZWxldGUgdmVydGV4IHt9IiwgcHJvcGVydGllcyk7CisJCQkJfQorCQkJCWluY29taW5nVmVydGV4LnJlbW92ZSgpOworCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCQkJCQlsb2cuZGVidWcoIkFmdGVyIGRlbGV0aW5nIHZlcnRleCB7fSIsIHByb3BlcnRpZXMpOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJLy8KKwkJLy8gaWYgKGVkZ2VzQ3JlYXRvckl0ZXJhYmxlICE9IG51bGwpIHsKKwkJLy8gZm9yIChFZGdlIGVkZ2UgOiBlZGdlc0NyZWF0b3JJdGVyYWJsZSkgeworCQkvLworCQkvLyBWZXJ0ZXggaW5jb21pbmdWZXJ0ZXggPSBlZGdlLmdldFZlcnRleChEaXJlY3Rpb24uSU4pOworCQkvLyBJdGVyYWJsZTxFZGdlPiBvdXRFZGdlcyA9IGluY29taW5nVmVydGV4LmdldEVkZ2VzKERpcmVjdGlvbi5PVVQpOworCQkvLyBpZiAob3V0RWRnZXMgIT0gbnVsbCkgeworCQkvLyBpZiAob3V0RWRnZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKwkJLy8gcmV0dXJuIFRpdGFuT3BlcmF0aW9uU3RhdHVzLkNBTk5PVF9ERUxFVEVfTk9OX0xFQUZfTk9ERTsKKwkJLy8gfSBlbHNlIHsKKwkJLy8gTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbnVsbDsKKwkJLy8gaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCS8vIHByb3BlcnRpZXMgPSBFbGVtZW50SGVscGVyLmdldFByb3BlcnRpZXMoaW5jb21pbmdWZXJ0ZXgpOworCQkvLyBsb2cuZGVidWcoIkdvaW5nIHRvIGRlbGV0ZSB2ZXJ0ZXgge30iLCBwcm9wZXJ0aWVzKTsKKwkJLy8gfQorCQkvLyBpbmNvbWluZ1ZlcnRleC5yZW1vdmUoKTsKKwkJLy8gaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCS8vIGxvZy5kZWJ1ZygiQWZ0ZXIgZGVsZXRpbmcgdmVydGV4IHt9IiwgcHJvcGVydGllcyk7CisJCS8vIH0KKwkJLy8gfQorCQkvLyB9CisJCS8vCisJCS8vIH0KKwkJLy8gfQorCisJCXJldHVybiBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSzsKKworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoRWxlbWVudCBlbGVtZW50KSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBudWxsOworCisJCWlmIChlbGVtZW50LmtleXMoKSAhPSBudWxsICYmIGVsZW1lbnQua2V5cygpLnNpemUoKSA+IDApIHsKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5PiBwcm9wZXJ0eU1hcCA9IEVsZW1lbnRIZWxwZXIucHJvcGVydHlNYXAoZWxlbWVudCwKKwkJCQkJZWxlbWVudC5rZXlzKCkudG9BcnJheShuZXcgU3RyaW5nW2VsZW1lbnQua2V5cygpLnNpemUoKV0pKTsKKwkJCXJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCQlmb3IgKEVudHJ5PFN0cmluZywgUHJvcGVydHk+IGVudHJ5IDogcHJvcGVydHlNYXAuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLnZhbHVlKCk7CisKKwkJCQlyZXN1bHQucHV0KGtleSwgdmFsdWUpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvVG9zY2FQcm9wZXJ0eVR5cGUuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9Ub3NjYVByb3BlcnR5VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYmI4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvVG9zY2FQcm9wZXJ0eVR5cGUuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVycy5Cb29sZWFuQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuRGVmYXVsdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLkZsb2F0Q29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuSW50ZWdlckNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLkpzb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVycy5MaXN0Q29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuTWFwQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuUHJvcGVydHlWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlRvc2NhQm9vbGVhbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlRvc2NhRmxvYXRDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVycy5Ub3NjYUpzb25WYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlRvc2NhTGlzdFZhbHVlQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuVG9zY2FNYXBWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlRvc2NhU3RyaW5nQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuVG9zY2FWYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlRvc2NhVmFsdWVEZWZhdWx0Q29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuQm9vbGVhblZhbGlkYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzLkZsb2F0VmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuSW50ZWdlclZhbGlkYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzLkpzb25WYWxpZGF0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5LZXlWYWxpZGF0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5MaXN0VmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuTWFwVmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuUHJvcGVydHlUeXBlVmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuU3RyaW5nVmFsaWRhdG9yOworCisvKioKKyAqIFRoZSBwcmltaXRpdmUgdHlwZSB0aGF0IFRPU0NBIFlBTUwgc3VwcG9ydHMuCisgKiAKKyAqIEBhdXRob3IgZXNvZmVyCisgKi8KK3B1YmxpYyBlbnVtIFRvc2NhUHJvcGVydHlUeXBlIHsKKworCVJvb3QoInRvc2NhLmRhdGF0eXBlcy5Sb290IiwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSksCisKKwlTVFJJTkcoInN0cmluZyIsIFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBTdHJpbmdDb252ZXJ0b3IuZ2V0SW5zdGFuY2UoKSwgVG9zY2FTdHJpbmdDb252ZXJ0b3IuZ2V0SW5zdGFuY2UoKSksCisKKwlCT09MRUFOKCJib29sZWFuIiwgQm9vbGVhblZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBUb3NjYUJvb2xlYW5Db252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSwKKwkJCUJvb2xlYW5Db252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSksCisKKwlGTE9BVCgiZmxvYXQiLCBGbG9hdFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBUb3NjYUZsb2F0Q29udmVydGVyLmdldEluc3RhbmNlKCksIEZsb2F0Q29udmVydGVyLmdldEluc3RhbmNlKCkpLAorCisJSU5URUdFUigiaW50ZWdlciIsIEludGVnZXJWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKSwgRGVmYXVsdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpLCBJbnRlZ2VyQ29udmVydGVyLmdldEluc3RhbmNlKCkpLAorCisJU0NBTEFSX1VOSVRfU0laRSgic2NhbGFyLXVuaXQuc2l6ZSIsIFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBEZWZhdWx0Q29udmVydGVyLmdldEluc3RhbmNlKCksCisJCQlUb3NjYVZhbHVlRGVmYXVsdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpKSwKKworCVNDQUxBUl9VTklUX1RJTUUoInNjYWxhci11bml0LnRpbWUiLCBTdHJpbmdWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKSwgRGVmYXVsdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpLAorCQkJVG9zY2FWYWx1ZURlZmF1bHRDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSksCisKKwlTQ0FMQVJfVU5JVF9GUkVRVUVOQ1koInNjYWxhci11bml0LmZyZXF1ZW5jeSIsIFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBEZWZhdWx0Q29udmVydGVyLmdldEluc3RhbmNlKCksCisJCQlUb3NjYVZhbHVlRGVmYXVsdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpKSwKKworCVJBTkdFKCJyYW5nZSIsIFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBEZWZhdWx0Q29udmVydGVyLmdldEluc3RhbmNlKCksCisJCQlUb3NjYVZhbHVlRGVmYXVsdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpKSwKKworCVRJTUVTVEFNUCgidGltZXN0YW1wIiwgU3RyaW5nVmFsaWRhdG9yLmdldEluc3RhbmNlKCksIERlZmF1bHRDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSwKKwkJCVRvc2NhVmFsdWVEZWZhdWx0Q29udmVydGVyLmdldEluc3RhbmNlKCkpLAorCisJTUFQKCJtYXAiLCBNYXBWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKSwgTWFwQ29udmVydGVyLmdldEluc3RhbmNlKCksIFRvc2NhTWFwVmFsdWVDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSksCisKKwlMSVNUKCJsaXN0IiwgTGlzdFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBMaXN0Q29udmVydGVyLmdldEluc3RhbmNlKCksIFRvc2NhTGlzdFZhbHVlQ29udmVydGVyLmdldEluc3RhbmNlKCkpLAorCisJVkVSU0lPTigidmVyc2lvbiIsIFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLCBEZWZhdWx0Q29udmVydGVyLmdldEluc3RhbmNlKCksCisJCQlUb3NjYVZhbHVlRGVmYXVsdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpKSwKKworCUtFWSgia2V5IiwgS2V5VmFsaWRhdG9yLmdldEluc3RhbmNlKCksIFN0cmluZ0NvbnZlcnRvci5nZXRJbnN0YW5jZSgpLCBUb3NjYVZhbHVlRGVmYXVsdENvbnZlcnRlci5nZXRJbnN0YW5jZSgpKSwKKworCUpTT04oImpzb24iLCBKc29uVmFsaWRhdG9yLmdldEluc3RhbmNlKCksIEpzb25Db252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSwgVG9zY2FKc29uVmFsdWVDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSk7CisKKwkvLyBDUkVERU5USUFMKCJ0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbCIsIFN0cmluZ1ZhbGlkYXRvci5nZXRJbnN0YW5jZSgpLAorCS8vIERlZmF1bHRDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKSk7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCXByaXZhdGUgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHZhbGlkYXRvcjsKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgY29udmVydGVyOworCXByaXZhdGUgVG9zY2FWYWx1ZUNvbnZlcnRlciB2YWx1ZUNvbnZlcnRlcjsKKwlwcml2YXRlIGJvb2xlYW4gaXNBYnN0cmFjdCA9IGZhbHNlOworCisJVG9zY2FQcm9wZXJ0eVR5cGUoU3RyaW5nIHR5cGUsIFByb3BlcnR5VHlwZVZhbGlkYXRvciB2YWxpZGF0b3IsIFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgY29udmVydGVyLAorCQkJVG9zY2FWYWx1ZUNvbnZlcnRlciB2YWx1ZUNvbnZlcnRlcikgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKKwkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7CisJCXRoaXMudmFsdWVDb252ZXJ0ZXIgPSB2YWx1ZUNvbnZlcnRlcjsKKwl9CisKKwlUb3NjYVByb3BlcnR5VHlwZShTdHJpbmcgdHlwZSwgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHZhbGlkYXRvciwgUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBjb252ZXJ0ZXIsCisJCQlUb3NjYVZhbHVlQ29udmVydGVyIHZhbHVlQ29udmVydGVyLCBib29sZWFuIGlzQWJzdHJhY3QpIHsKKwkJdGhpcyh0eXBlLCB2YWxpZGF0b3IsIGNvbnZlcnRlciwgdmFsdWVDb252ZXJ0ZXIpOworCQl0aGlzLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OworCX0KKworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gVElNRVNUQU1QX1JFR0VYID0gUGF0dGVybgorCS8vIC5jb21waWxlKCJbMC05XVswLTldWzAtOV1bMC05XS1bMC05XVswLTldLVswLTldWzAtOV18WzAtOV1bMC05XVswLTldWzAtOV0tWzAtOV1bMC05XT8tWzAtOV1bMC05XT8oW1R0XXxbCisJLy8gXFx0XSspWzAtOV1bMC05XT86WzAtOV1bMC05XTpbMC05XVswLTldKFxcLlswLTldKik/KChbIFxcdF0qKVp8KFsKKwkvLyBcXHRdKilbLStdWzAtOV1bMC05XT8oOlswLTldWzAtOV0pPyk/Iik7CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIHZhbGlkYXRvcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoUHJvcGVydHlUeXBlVmFsaWRhdG9yIHZhbGlkYXRvcikgeworCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBjb252ZXJ0ZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisJCXJldHVybiBpc0Fic3RyYWN0OworCX0KKworCXB1YmxpYyB2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gaXNBYnN0cmFjdCkgeworCQl0aGlzLmlzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OworCX0KKworCXB1YmxpYyBUb3NjYVZhbHVlQ29udmVydGVyIGdldFZhbHVlQ29udmVydGVyKCkgeworCQlyZXR1cm4gdmFsdWVDb252ZXJ0ZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWVDb252ZXJ0ZXIoVG9zY2FWYWx1ZUNvbnZlcnRlciB2YWx1ZUNvbnZlcnRlcikgeworCQl0aGlzLnZhbHVlQ29udmVydGVyID0gdmFsdWVDb252ZXJ0ZXI7CisJfQorCisJcHVibGljIHN0YXRpYyBUb3NjYVByb3BlcnR5VHlwZSBpc1ZhbGlkVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJZm9yIChUb3NjYVByb3BlcnR5VHlwZSB0eXBlIDogVG9zY2FQcm9wZXJ0eVR5cGUudmFsdWVzKCkpIHsKKwkJCWlmICh0eXBlLmdldFR5cGUoKS5lcXVhbHModHlwZU5hbWUpKSB7CisJCQkJcmV0dXJuIHR5cGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2NhbGFyVHlwZShTdHJpbmcgZGF0YVR5cGVOYW1lKSB7CisKKwkJVG9zY2FQcm9wZXJ0eVR5cGUgaXNQcmltaXRpdmVUb3NjYVR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZShkYXRhVHlwZU5hbWUpOworCisJCXJldHVybiBpc1ByaW1pdGl2ZVRvc2NhVHlwZSAhPSBudWxsICYmIGlzUHJpbWl0aXZlVG9zY2FUeXBlLmlzQWJzdHJhY3QoKSA9PSBmYWxzZTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgVG9zY2FQcm9wZXJ0eVR5cGUgZ2V0VHlwZUlmU2NhbGFyKFN0cmluZyBkYXRhVHlwZU5hbWUpIHsKKworCQlUb3NjYVByb3BlcnR5VHlwZSBpc1ByaW1pdGl2ZVRvc2NhVHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKGRhdGFUeXBlTmFtZSk7CisKKwkJaWYgKGlzUHJpbWl0aXZlVG9zY2FUeXBlICE9IG51bGwgJiYgaXNQcmltaXRpdmVUb3NjYVR5cGUuaXNBYnN0cmFjdCgpID09IGZhbHNlKSB7CisJCQlyZXR1cm4gaXNQcmltaXRpdmVUb3NjYVR5cGU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIG5hbWUoKS50b0xvd2VyQ2FzZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9Ub3NjYVR5cGUuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9Ub3NjYVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY0MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL1Rvc2NhVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2E7CisKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBUaGUgcHJpbWl0aXZlIHR5cGUgdGhhdCBUT1NDQSBZQU1MIHN1cHBvcnRzLgorICogCisgKiBAYXV0aG9yIG1rdgorICovCitwdWJsaWMgZW51bSBUb3NjYVR5cGUgeworCVNUUklORywgSU5URUdFUiwgRkxPQVQsIEJPT0xFQU4sIFRJTUVTVEFNUCwgVkVSU0lPTjsKKworCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gVElNRVNUQU1QX1JFR0VYID0gUGF0dGVybgorCS8vIC5jb21waWxlKCJbMC05XVswLTldWzAtOV1bMC05XS1bMC05XVswLTldLVswLTldWzAtOV18WzAtOV1bMC05XVswLTldWzAtOV0tWzAtOV1bMC05XT8tWzAtOV1bMC05XT8oW1R0XXxbCisJLy8gXFx0XSspWzAtOV1bMC05XT86WzAtOV1bMC05XTpbMC05XVswLTldKFxcLlswLTldKik/KChbIFxcdF0qKVp8KFsKKwkvLyBcXHRdKilbLStdWzAtOV1bMC05XT8oOlswLTldWzAtOV0pPyk/Iik7CisKKwlwdWJsaWMgc3RhdGljIFRvc2NhVHlwZSBmcm9tWWFtbFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgeworCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdHJ5IHsKKwkJCXJldHVybiBUb3NjYVR5cGUudmFsdWVPZih0eXBlTmFtZS50b1VwcGVyQ2FzZSgpKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQlzd2l0Y2ggKHRoaXMpIHsKKwkJY2FzZSBCT09MRUFOOgorCQkJcmV0dXJuIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpOworCQljYXNlIEZMT0FUOgorCQkJcmV0dXJuIGlzRmxvYXQodmFsdWUpOworCQljYXNlIElOVEVHRVI6CisJCQlyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKTsKKwkJY2FzZSBTVFJJTkc6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSBUSU1FU1RBTVA6CisJCQl0cnkgeworCQkJCURhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0Lk1FRElVTSwgRGF0ZUZvcm1hdC5NRURJVU0sIExvY2FsZS5VUykucGFyc2UodmFsdWUpOworCQkJCXJldHVybiB0cnVlOworCQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJY2FzZSBWRVJTSU9OOgorCQkJcmV0dXJuIFZlcnNpb25VdGlsLmlzVmFsaWQodmFsdWUpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRmxvYXQoU3RyaW5nIHZhbHVlKSB7CisJCXRyeSB7CisJCQlGbG9hdC52YWx1ZU9mKHZhbHVlKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNJbnRlZ2VyKFN0cmluZyB2YWx1ZSkgeworCQl0cnkgeworCQkJTG9uZy52YWx1ZU9mKHZhbHVlKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnQoU3RyaW5nIHZhbHVlKSB7CisJCXN3aXRjaCAodGhpcykgeworCQljYXNlIFNUUklORzoKKwkJCXJldHVybiB2YWx1ZTsKKwkJY2FzZSBCT09MRUFOOgorCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7CisJCWNhc2UgRkxPQVQ6CisJCQlyZXR1cm4gRG91YmxlLnZhbHVlT2YodmFsdWUpOworCQljYXNlIElOVEVHRVI6CisJCQlyZXR1cm4gTG9uZy52YWx1ZU9mKHZhbHVlKTsKKwkJY2FzZSBUSU1FU1RBTVA6CisJCQl0cnkgeworCQkJCXJldHVybiBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5NRURJVU0sIERhdGVGb3JtYXQuTUVESVVNLCBMb2NhbGUuVVMpLnBhcnNlKHZhbHVlKTsKKwkJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgdGltZXN0YW1wIiwgZSk7CisJCQl9CisJCWNhc2UgVkVSU0lPTjoKKwkJCXJldHVybiBWZXJzaW9uVXRpbC5wYXJzZVZlcnNpb24odmFsdWUpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbmFtZSgpLnRvTG93ZXJDYXNlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL1ZlcnNpb25VdGlsLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvVmVyc2lvblV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQ4MDZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL1ZlcnNpb25VdGlsLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhOworCitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52ZXJzaW9uLkFwcGxpY2F0aW9uVmVyc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52ZXJzaW9uLlZlcnNpb247CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBWZXJzaW9uVXRpbCB7CisKKwkvKiogVXRpbGl0eSBjbGFzcyBzaG91bGQgbm90IGhhdmUgcHVibGljIGNvbnN0cnVjdG9yLiAqLworCXByaXZhdGUgVmVyc2lvblV0aWwoKSB7CisJfQorCisJLyoqCisJICogVGhlIHZlcnNpb24gbXVzdCBiZWdpbiB3aXRoIGEgYmxvYyBvZiBudW1iZXJzLCBhbmQgdGhlbiBpdCBjYW4gaGF2ZSBvbmUKKwkgKiBvciBtb3JlIGJsb2Mgb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkgJy4nIGFuZCB0aGVuIGl0IGNhbiBoYXZlIGFscGhhCisJICogbnVtZXJpYyBibG9jIHNlcGFyYXRlZCBieSAnLicgb3IgJy0nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFZFUlNJT05fUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXFxkKyg/OlxcLlxcZCspKig/OltcXC4tXVxccHtBbG51bX0rKSoiKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfSURFTlRJRklFUiA9ICJTTkFQU0hPVCI7CisKKwkvKioKKwkgKiBDaGVjayBpZiBhIHZlcnNpb24gaXMgYSBTTkFQU0hPVCAoZGV2ZWxvcG1lbnQpIHZlcnNpb24uCisJICogCisJICogQHBhcmFtIHZlcnNpb24KKwkgKiAgICAgICAgICAgIFRoZSBhY3R1YWwgdmVyc2lvbiBzdHJpbmcuCisJICogQHJldHVybiBUcnVlIGlmIHRoZSB2ZXJzaW9uIGlzIGEgU05BUFNIT1QgdmVyc2lvbiwgZmFsc2UgaWYgbm90IChSRUxFQVNFCisJICogICAgICAgICB2ZXJzaW9uKS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTbmFwc2hvdChTdHJpbmcgdmVyc2lvbikgeworCQlyZXR1cm4gdmVyc2lvbi50b1VwcGVyQ2FzZSgpLmNvbnRhaW5zKFNOQVBTSE9UX0lERU5USUZJRVIpOworCX0KKworCS8qKgorCSAqIENoZWNrIGlmIGEgdmVyc2lvbiBpcyB2YWxpZAorCSAqIAorCSAqIEBwYXJhbSB2ZXJzaW9uCisJICogICAgICAgICAgICB2ZXJzaW9uIHN0cmluZyB0byBwYXJzZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIGZvbGxvd2luZyB0aGUgZGVmaW5lZCB2ZXJzaW9uIHBhdHRlcm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmVyc2lvbikgeworCQlyZXR1cm4gVkVSU0lPTl9QQVRURVJOLm1hdGNoZXIodmVyc2lvbikubWF0Y2hlcygpOworCX0KKworCS8qKgorCSAqIFBhcnNlIHRoZSB2ZXJzaW9uJ3MgdGV4dCB0byBwcm9kdWNlIGEgY29tcGFyYWJsZSB2ZXJzaW9uIG9iamVjdAorCSAqIAorCSAqIEBwYXJhbSB2ZXJzaW9uCisJICogICAgICAgICAgICB2ZXJzaW9uIHRleHQgdG8gcGFyc2UKKwkgKiBAcmV0dXJuIGEgY29tcGFyYWJsZSB2ZXJzaW9uIG9iamVjdAorCSAqIEB0aHJvd3MgQXBwbGljYXRpb25WZXJzaW9uRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHZlcnNpb24gdGV4dCBpcyBub3QgZm9sbG93aW5nIHRoZSBkZWZpbmVkIHZlcnNpb24KKwkgKiAgICAgICAgICAgICBwYXR0ZXJuCisJICovCisJcHVibGljIHN0YXRpYyBWZXJzaW9uIHBhcnNlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQlpZiAoIWlzVmFsaWQodmVyc2lvbikpIHsKKwkJCXRocm93IG5ldyBBcHBsaWNhdGlvblZlcnNpb25FeGNlcHRpb24oCisJCQkJCSJUaGlzIHZlcnNpb24gaXMgbm90IHZhbGlkIFsiICsgdmVyc2lvbiArICJdIGFzIGl0IGRvZXMgbm90IG1hdGNoIFsiICsgVkVSU0lPTl9QQVRURVJOICsgIl0iKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBuZXcgVmVyc2lvbih2ZXJzaW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbXBhcmUgMiB2ZXJzaW9ucworCSAqIAorCSAqIEBwYXJhbSB2ZXJzaW9uTGVmdAorCSAqIEBwYXJhbSB2ZXJzaW9uUmlnaHQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShTdHJpbmcgdmVyc2lvbkxlZnQsIFN0cmluZyB2ZXJzaW9uUmlnaHQpIHsKKwkJcmV0dXJuIHBhcnNlVmVyc2lvbih2ZXJzaW9uTGVmdCkuY29tcGFyZVRvKHBhcnNlVmVyc2lvbih2ZXJzaW9uUmlnaHQpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvQWJzdHJhY3RDb21wYXJhYmxlUHJvcGVydHlDb25zdHJhaW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvQWJzdHJhY3RDb21wYXJhYmxlUHJvcGVydHlDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0NjY5MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9BYnN0cmFjdENvbXBhcmFibGVQcm9wZXJ0eUNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKworQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBhcmFibGVQcm9wZXJ0eUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5Q29uc3RyYWludCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMDAyNjI3NzU0MDUzMzI2MzIxTDsKKworCXByaXZhdGUgQ29tcGFyYWJsZSBjb21wYXJhYmxlOworCisJcHJvdGVjdGVkIENvbXBhcmFibGUgZ2V0Q29tcGFyYWJsZSgpIHsKKwkJcmV0dXJuIGNvbXBhcmFibGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmF3VGV4dFZhbHVlLCBUb3NjYVR5cGUgcHJvcGVydHlUeXBlKQorCQkJdGhyb3dzIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24geworCQkvLyBQZXJmb3JtIHZlcmlmaWNhdGlvbiB0aGF0IHRoZSBwcm9wZXJ0eSB0eXBlIGlzIHN1cHBvcnRlZCBmb3IKKwkJLy8gY29tcGFyaXNvbgorCQlDb25zdHJhaW50VXRpbC5jaGVja0NvbXBhcmFibGVUeXBlKHByb3BlcnR5VHlwZSk7CisJCS8vIENoZWNrIGlmIHRoZSB0ZXh0IHZhbHVlIGlzIHZhbGlkIGZvciB0aGUgcHJvcGVydHkgdHlwZQorCQlpZiAocHJvcGVydHlUeXBlLmlzVmFsaWRWYWx1ZShyYXdUZXh0VmFsdWUpKSB7CisJCQkvLyBDb252ZXJ0IHRoZSByYXcgdGV4dCB2YWx1ZSB0byBhIGNvbXBhcmFibGUgdmFsdWUKKwkJCWNvbXBhcmFibGUgPSBDb25zdHJhaW50VXRpbC5jb252ZXJ0VG9Db21wYXJhYmxlKHByb3BlcnR5VHlwZSwgcmF3VGV4dFZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCS8vIEludmFsaWQgdmFsdWUgdGhyb3cgZXhjZXB0aW9uCisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbigKKwkJCQkJIlRoZSB2YWx1ZSBbIiArIHJhd1RleHRWYWx1ZSArICJdIGlzIG5vdCB2YWxpZCBmb3IgdGhlIHR5cGUgWyIgKyBwcm9wZXJ0eVR5cGUgKyAiXSIpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9WYWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVmFsdWUgdG8gY2hlY2sgaXMgbnVsbCIpOworCQl9CisJCWlmICghKGNvbXBhcmFibGUuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKHByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSkpKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVmFsdWUgdG8gY2hlY2sgaXMgbm90IGNvbXBhcmFibGUgdG8gcmVmZXJlbmNlIHR5cGUsIHZhbHVlIHR5cGUgWyIKKwkJCQkJKyBwcm9wZXJ0eVZhbHVlLmdldENsYXNzKCkgKyAiXSwgcmVmZXJlbmNlIHR5cGUgWyIgKyBjb21wYXJhYmxlLmdldENsYXNzKCkgKyAiXSIpOworCQl9CisJCWRvVmFsaWRhdGUocHJvcGVydHlWYWx1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0Fic3RyYWN0UHJvcGVydHlDb25zdHJhaW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvQWJzdHJhY3RQcm9wZXJ0eUNvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBhN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0Fic3RyYWN0UHJvcGVydHlDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZlcnNpb24uQXBwbGljYXRpb25WZXJzaW9uRXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9wZXJ0eUNvbnN0cmFpbnQgaW1wbGVtZW50cyBQcm9wZXJ0eUNvbnN0cmFpbnQsIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NDU5NTIyMjc1NDU5NzIzMzc0TDsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKFRvc2NhVHlwZSB0b3NjYVR5cGUsIFN0cmluZyBwcm9wZXJ0eVRleHRWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQl0cnkgeworCQkJdmFsaWRhdGUodG9zY2FUeXBlLmNvbnZlcnQocHJvcGVydHlUZXh0VmFsdWUpKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgQXBwbGljYXRpb25WZXJzaW9uRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKAorCQkJCQkiU3RyaW5nIHZhbHVlIFsiICsgcHJvcGVydHlUZXh0VmFsdWUgKyAiXSBpcyBub3QgdmFsaWQgZm9yIHR5cGUgWyIgKyB0b3NjYVR5cGUgKyAiXSIsIGUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0Fic3RyYWN0U3RyaW5nUHJvcGVydHlDb25zdHJhaW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvQWJzdHJhY3RTdHJpbmdQcm9wZXJ0eUNvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJjYWEyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0Fic3RyYWN0U3RyaW5nUHJvcGVydHlDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uLkNvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cmluZ1Byb3BlcnR5Q29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlDb25zdHJhaW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4NTc2MDUxNjQ5MzgxMzYyMzJMOworCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9WYWxpZGF0ZShTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVmFsdWUgdG8gdmFsaWRhdGUgaXMgbnVsbCIpOworCQl9CisJCWlmICghKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVGhpcyBjb25zdHJhaW50IGNhbiBvbmx5IGJlIGFwcGxpZWQgb24gU3RyaW5nIHZhbHVlIik7CisJCX0KKwkJZG9WYWxpZGF0ZSgoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFRvc2NhVHlwZSBwcm9wZXJ0eVR5cGUpIHRocm93cyBDb25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uIHsKKwkJQ29uc3RyYWludFV0aWwuY2hlY2tTdHJpbmdUeXBlKHByb3BlcnR5VHlwZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0NvbnN0cmFpbnRUeXBlLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvQ29uc3RyYWludFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE5ZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0NvbnN0cmFpbnRUeXBlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGVudW0gQ29uc3RyYWludFR5cGUgeworCisJSU5fUkFOR0UoImluUmFuZ2UiKSwKKworCUdSRUFURVJfVEhBTigiZ3JlYXRlclRoYW4iLCAiZ3JlYXRlcl90aGFuIiksCisKKwlHUkVBVEVSX09SX0VRVUFMKCJncmVhdGVyT3JFcXVhbCIsICJncmVhdGVyX29yX2VxdWFsIiksCisKKwlMRVNTX09SX0VRVUFMKCJsZXNzT3JFcXVhbCIsICJsZXNzX29yX2VxdWFsIiksCisKKwlNSU5fTEVOR1RIKCJtaW5MZW5ndGgiLCAibWluX2xlbmd0aCIpLAorCisJVkFMSURfVkFMVUVTKCJ2YWxpZFZhbHVlcyIsICJ2YWxpZF92YWx1ZXMiKSwKKworCUxFU1NfVEhBTigibGVzc1RoYW4iLCAibGVzc190aGFuIik7CisKKwlMaXN0PFN0cmluZz4gdHlwZXM7CisKKwlwcml2YXRlIENvbnN0cmFpbnRUeXBlKFN0cmluZy4uLiB0eXBlcykgeworCQl0aGlzLnR5cGVzID0gQXJyYXlzLmFzTGlzdCh0eXBlcyk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUeXBlcygpIHsKKwkJcmV0dXJuIHR5cGVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29uc3RyYWludFR5cGUgZ2V0QnlUeXBlKFN0cmluZyB0eXBlKSB7CisJCWZvciAoQ29uc3RyYWludFR5cGUgaW5zdCA6IENvbnN0cmFpbnRUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoaW5zdC5nZXRUeXBlcygpLmNvbnRhaW5zKHR5cGUpKSB7CisJCQkJcmV0dXJuIGluc3Q7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0NvbnN0cmFpbnRVdGlsLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvQ29uc3RyYWludFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0NvbnN0cmFpbnRVdGlsLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50czsKKworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gdmFsaWRhdGUgY29uc3RyYWludHMgdHlwZXMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdHJhaW50VXRpbCB7CisKKwlwcml2YXRlIENvbnN0cmFpbnRVdGlsKCkgeworCX0KKworCS8qKgorCSAqIFZhbGlkYXRlcyB0aGF0IHRoZSB7QGxpbmsgVG9zY2FUeXBlfSBzcGVjaWZpZWQgaXMgYQorCSAqIHtAbGluayBUb3NjYVR5cGUjU1RSSU5HfS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydHlUeXBlCisJICogICAgICAgICAgICBUaGUgcHJvcGVydHkgdG9zY2EgdHlwZS4KKwkgKiBAdGhyb3dzIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBJbiBjYXNlIHRoZSB0eXBlIGlzIG5vdCB7QGxpbmsgVG9zY2FUeXBlI1NUUklOR30uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrU3RyaW5nVHlwZShUb3NjYVR5cGUgcHJvcGVydHlUeXBlKSB0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiB7CisJCWlmICghVG9zY2FUeXBlLlNUUklORy5lcXVhbHMocHJvcGVydHlUeXBlKSkgeworCQkJdGhyb3cgbmV3IENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24oCisJCQkJCSJJbnZhbGlkIHByb3BlcnR5IHR5cGUgPCIgKyBwcm9wZXJ0eVR5cGUudG9TdHJpbmcoKSArICI+Iik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gdG9zY2EgdHlwZSBpcyBzdXBwb3J0ZWQgZm9yIGNvbXBhcmlzb24KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydHlUeXBlCisJICogICAgICAgICAgICB0aGUgdG9zY2EgdHlwZSB0byBjaGVjaworCSAqIEB0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBwcm9wZXJ0eSB0eXBlIGNhbm5vdCBiZSBjb21wYXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0NvbXBhcmFibGVUeXBlKFRvc2NhVHlwZSBwcm9wZXJ0eVR5cGUpCisJCQl0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiB7CisJCS8vIFRoZSB2YWxpZGl0eSBvZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBhc3N1cmVkIGJ5IHVzIHdpdGggb3VyCisJCS8vIFRvc2NhVHlwZS5jb252ZXJ0KCkgbWV0aG9kCisJCS8vIGhlcmUgd2UganVzdCB3YW50IHRvIGNoZWNrIHRoYXQgdGhlIGNvbnN0cmFpbnQgaXMgbm90IHVzZWQgb24KKwkJLy8gdW5zdXBwb3J0ZWQgdHlwZSBhcyBib29sZWFuCisJCXN3aXRjaCAocHJvcGVydHlUeXBlKSB7CisJCWNhc2UgRkxPQVQ6CisJCWNhc2UgSU5URUdFUjoKKwkJY2FzZSBUSU1FU1RBTVA6CisJCWNhc2UgVkVSU0lPTjoKKwkJCWJyZWFrOworCQljYXNlIFNUUklORzoKKwkJY2FzZSBCT09MRUFOOgorCQkJdGhyb3cgbmV3IENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24oCisJCQkJCSJDb25zdHJhaW50IGlzIGludmFsaWQgZm9yIHByb3BlcnR5IHR5cGUgPCIgKyBwcm9wZXJ0eVR5cGUudG9TdHJpbmcoKSArICI+Iik7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbigKKwkJCQkJIkludmFsaWQgcHJvcGVydHkgdHlwZSA8IiArIHByb3BlcnR5VHlwZS50b1N0cmluZygpICsgIj4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnQgYSBzdHJpbmcgdmFsdWUgZm9sbG93aW5nIGl0cyB0eXBlIHRocm93IGV4Y2VwdGlvbiBpZiBpdCBjYW5ub3QgYmUKKwkgKiBjb252ZXJ0ZWQgdG8gYSBjb21wYXJhYmxlCisJICogCisJICogQHBhcmFtIHByb3BlcnR5VHlwZQorCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5CisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gY29udmVydAorCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBjb21wYXJhYmxlCisJICogQHRocm93cyBDb25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBub3QgYSBjb21wYXJhYmxlCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKwlwdWJsaWMgc3RhdGljIENvbXBhcmFibGUgY29udmVydFRvQ29tcGFyYWJsZShUb3NjYVR5cGUgcHJvcGVydHlUeXBlLCBTdHJpbmcgdmFsdWUpCisJCQl0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiB7CisJCU9iamVjdCBjb21wYXJhYmxlT2JqID0gcHJvcGVydHlUeXBlLmNvbnZlcnQodmFsdWUpOworCQlpZiAoIShjb21wYXJhYmxlT2JqIGluc3RhbmNlb2YgQ29tcGFyYWJsZSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJUcnkgdG8gY29udmVydCBhIHZhbHVlIG9mIGEgdHlwZSB3aGljaCBpcyBub3QgY29tcGFyYWJsZSBbIiArIHByb3BlcnR5VHlwZSArICJdIHRvIENvbXBhcmFibGUiKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAoQ29tcGFyYWJsZSkgY29tcGFyYWJsZU9iajsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3RyYWludEluZm9ybWF0aW9uIHsKKwkJcHVibGljIENvbnN0cmFpbnRJbmZvcm1hdGlvbihTdHJpbmcgbmFtZSwgT2JqZWN0IHJlZmVyZW5jZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgdHlwZSkgeworCisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCisJCX0KKworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIE9iamVjdCByZWZlcmVuY2U7CisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCQlwcml2YXRlIFN0cmluZyB0eXBlOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29uc3RyYWludEluZm9ybWF0aW9uIGdldENvbnN0cmFpbnRJbmZvcm1hdGlvbihPYmplY3QgY29uc3RyYWludCkgdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24geworCQlQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGNvbnN0cmFpbnQuZ2V0Q2xhc3MoKSkKKwkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworCQlQcm9wZXJ0eURlc2NyaXB0b3IgZmlyc3REZXNjcmlwdG9yID0gbnVsbDsKKwkJZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yIDogcHJvcGVydHlEZXNjcmlwdG9ycykgeworCQkJaWYgKHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCAmJiBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0V3JpdGVNZXRob2QoKSAhPSBudWxsKSB7CisJCQkJZmlyc3REZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmaXJzdERlc2NyaXB0b3IgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEludHJvc3BlY3Rpb25FeGNlcHRpb24oIkNhbm5vdCBmaW5kIGNvbnN0cmFpbnQgbmFtZSIpOworCQl9CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IENvbnN0cmFpbnRJbmZvcm1hdGlvbihmaXJzdERlc2NyaXB0b3IuZ2V0TmFtZSgpLAorCQkJCQlmaXJzdERlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpLmludm9rZShjb25zdHJhaW50KSwgbnVsbCwgbnVsbCk7CisJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKCJDYW5ub3QgcmV0cmlldmUgY29uc3RyYWludCByZWZlcmVuY2UgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9FcXVhbENvbnN0cmFpbnQuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9FcXVhbENvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzBkY2IwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0VxdWFsQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOworCisvL2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSWdub3JlOworCitwdWJsaWMgY2xhc3MgRXF1YWxDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eUNvbnN0cmFpbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNTk2MDkzMzQxNzQ0NjQxNDgzTDsKKworCUBOb3ROdWxsCisJcHJpdmF0ZSBTdHJpbmcgZXF1YWw7CisKKwkvLyBASnNvbklnbm9yZQorCXByaXZhdGUgT2JqZWN0IHR5cGVkOworCisJcHVibGljIEVxdWFsQ29uc3RyYWludChTdHJpbmcgZXF1YWwpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5lcXVhbCA9IGVxdWFsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVG9zY2FUeXBlIHByb3BlcnR5VHlwZSkgdGhyb3dzIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlUeXBlLmlzVmFsaWRWYWx1ZShlcXVhbCkpIHsKKwkJCXR5cGVkID0gcHJvcGVydHlUeXBlLmNvbnZlcnQoZXF1YWwpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24oImVxdWFsIGNvbnN0cmFpbnQgaGFzIGludmFsaWQgdmFsdWUgPCIgKyBlcXVhbAorCQkJCQkrICI+IHByb3BlcnR5IHR5cGUgaXMgPCIgKyBwcm9wZXJ0eVR5cGUudG9TdHJpbmcoKSArICI+Iik7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7CisJCQlpZiAodHlwZWQgIT0gbnVsbCkgeworCQkJCWZhaWwobnVsbCk7CisJCQl9CisJCX0gZWxzZSBpZiAodHlwZWQgPT0gbnVsbCkgeworCQkJZmFpbChwcm9wZXJ0eVZhbHVlKTsKKwkJfSBlbHNlIGlmICghdHlwZWQuZXF1YWxzKHByb3BlcnR5VmFsdWUpKSB7CisJCQlmYWlsKHByb3BlcnR5VmFsdWUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGZhaWwoT2JqZWN0IHByb3BlcnR5VmFsdWUpIHRocm93cyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oIkVxdWFsIGNvbnN0cmFpbnQgdmlvbGF0aW9uLCB0aGUgcmVmZXJlbmNlIGlzIDwiICsgZXF1YWwKKwkJCQkrICI+IGJ1dCB0aGUgdmFsdWUgdG8gY29tcGFyZSBpcyA8IiArIHByb3BlcnR5VmFsdWUgKyAiPiIpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9HcmVhdGVyT3JFcXVhbENvbnN0cmFpbnQuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9HcmVhdGVyT3JFcXVhbENvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjJjM2FkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0dyZWF0ZXJPckVxdWFsQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgR3JlYXRlck9yRXF1YWxDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJhYmxlUHJvcGVydHlDb25zdHJhaW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTkzNzg1MTA3NzAzNDQ5MDYwOUw7CisKKwlATm90TnVsbAorCXByaXZhdGUgU3RyaW5nIGdyZWF0ZXJPckVxdWFsOworCisJcHVibGljIEdyZWF0ZXJPckVxdWFsQ29uc3RyYWludChTdHJpbmcgZ3JlYXRlck9yRXF1YWwpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5ncmVhdGVyT3JFcXVhbCA9IGdyZWF0ZXJPckVxdWFsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVG9zY2FUeXBlIHByb3BlcnR5VHlwZSkgdGhyb3dzIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24geworCQlpbml0aWFsaXplKGdyZWF0ZXJPckVxdWFsLCBwcm9wZXJ0eVR5cGUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUpIHRocm93cyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKGdldENvbXBhcmFibGUoKS5jb21wYXJlVG8ocHJvcGVydHlWYWx1ZSkgPiAwKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihwcm9wZXJ0eVZhbHVlICsgIiA8PSAiICsgZ3JlYXRlck9yRXF1YWwpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0dyZWF0ZXJUaGFuQ29uc3RyYWludC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0dyZWF0ZXJUaGFuQ29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTJhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvR3JlYXRlclRoYW5Db25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uLkNvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBHcmVhdGVyVGhhbkNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmFibGVQcm9wZXJ0eUNvbnN0cmFpbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDA1NzIzMjE1NTEyMTIxODk2TDsKKworCXB1YmxpYyBHcmVhdGVyVGhhbkNvbnN0cmFpbnQoU3RyaW5nIGdyZWF0ZXJUaGFuKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZ3JlYXRlclRoYW4gPSBncmVhdGVyVGhhbjsKKwl9CisKKwlATm90TnVsbAorCXByaXZhdGUgU3RyaW5nIGdyZWF0ZXJUaGFuOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUb3NjYVR5cGUgcHJvcGVydHlUeXBlKSB0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiB7CisJCWluaXRpYWxpemUoZ3JlYXRlclRoYW4sIHByb3BlcnR5VHlwZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAoZ2V0Q29tcGFyYWJsZSgpLmNvbXBhcmVUbyhwcm9wZXJ0eVZhbHVlKSA+PSAwKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihwcm9wZXJ0eVZhbHVlICsgIiA8ICIgKyBncmVhdGVyVGhhbik7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEdyZWF0ZXJUaGFuKCkgeworCQlyZXR1cm4gZ3JlYXRlclRoYW47CisJfQorCisJcHVibGljIHZvaWQgc2V0R3JlYXRlclRoYW4oU3RyaW5nIGdyZWF0ZXJUaGFuKSB7CisJCXRoaXMuZ3JlYXRlclRoYW4gPSBncmVhdGVyVGhhbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9JblJhbmdlQ29uc3RyYWludC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0luUmFuZ2VDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MjFjMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9JblJhbmdlQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKworLy9pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblByb3BlcnR5OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK3B1YmxpYyBjbGFzcyBJblJhbmdlQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlDb25zdHJhaW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MDM4NDAxNzA3MTUyODI0NDkzTDsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGluUmFuZ2U7CisKKwlwcml2YXRlIENvbXBhcmFibGUgbWluOworCXByaXZhdGUgQ29tcGFyYWJsZSBtYXg7CisKKwlwdWJsaWMgSW5SYW5nZUNvbnN0cmFpbnQoTGlzdDxTdHJpbmc+IGluUmFuZ2UpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5pblJhbmdlID0gaW5SYW5nZTsKKwl9CisKKwlwdWJsaWMgSW5SYW5nZUNvbnN0cmFpbnQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUb3NjYVR5cGUgcHJvcGVydHlUeXBlKSB0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiB7CisJCS8vIFBlcmZvcm0gdmVyaWZpY2F0aW9uIHRoYXQgdGhlIHByb3BlcnR5IHR5cGUgaXMgc3VwcG9ydGVkIGZvcgorCQkvLyBjb21wYXJpc29uCisJCUNvbnN0cmFpbnRVdGlsLmNoZWNrQ29tcGFyYWJsZVR5cGUocHJvcGVydHlUeXBlKTsKKwkJaWYgKGluUmFuZ2UgPT0gbnVsbCB8fCBpblJhbmdlLnNpemUoKSAhPSAyKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbigiSW4gcmFuZ2UgY29uc3RyYWludCBtdXN0IGhhdmUgdHdvIGVsZW1lbnRzLiIpOworCQl9CisJCVN0cmluZyBtaW5SYXdUZXh0ID0gaW5SYW5nZS5nZXQoMCk7CisJCVN0cmluZyBtYXhSYXdUZXh0ID0gaW5SYW5nZS5nZXQoMSk7CisJCWlmICghcHJvcGVydHlUeXBlLmlzVmFsaWRWYWx1ZShtaW5SYXdUZXh0KSkgeworCQkJdGhyb3cgbmV3IENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24oIkludmFsaWQgbWluIHZhbHVlIGZvciBpbiByYW5nZSBjb25zdHJhaW50IFsiCisJCQkJCSsgbWluUmF3VGV4dCArICJdIGFzIGl0IGRvZXMgbm90IGZvbGxvdyB0aGUgcHJvcGVydHkgdHlwZSBbIiArIHByb3BlcnR5VHlwZSArICJdIik7CisJCX0KKwkJaWYgKCFwcm9wZXJ0eVR5cGUuaXNWYWxpZFZhbHVlKG1heFJhd1RleHQpKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbigiSW52YWxpZCBtYXggdmFsdWUgZm9yIGluIHJhbmdlIGNvbnN0cmFpbnQgWyIKKwkJCQkJKyBtYXhSYXdUZXh0ICsgIl0gYXMgaXQgZG9lcyBub3QgZm9sbG93IHRoZSBwcm9wZXJ0eSB0eXBlIFsiICsgcHJvcGVydHlUeXBlICsgIl0iKTsKKwkJfQorCQltaW4gPSBDb25zdHJhaW50VXRpbC5jb252ZXJ0VG9Db21wYXJhYmxlKHByb3BlcnR5VHlwZSwgbWluUmF3VGV4dCk7CisJCW1heCA9IENvbnN0cmFpbnRVdGlsLmNvbnZlcnRUb0NvbXBhcmFibGUocHJvcGVydHlUeXBlLCBtYXhSYXdUZXh0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVmFsdWUgdG8gY2hlY2sgaXMgbnVsbCIpOworCQl9CisJCWlmICghKG1pbi5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20ocHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpKSkpIHsKKwkJCXRocm93IG5ldyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKCJWYWx1ZSB0byBjaGVjayBpcyBub3QgY29tcGFyYWJsZSB0byByYW5nZSB0eXBlLCB2YWx1ZSB0eXBlIFsiCisJCQkJCSsgcHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpICsgIl0sIHJhbmdlIHR5cGUgWyIgKyBtaW4uZ2V0Q2xhc3MoKSArICJdIik7CisJCX0KKwkJaWYgKG1pbi5jb21wYXJlVG8ocHJvcGVydHlWYWx1ZSkgPiAwIHx8IG1heC5jb21wYXJlVG8ocHJvcGVydHlWYWx1ZSkgPCAwKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVGhlIHZhbHVlIFsiICsgcHJvcGVydHlWYWx1ZSArICJdIGlzIG91dCBvZiByYW5nZSAiICsgaW5SYW5nZSk7CisJCX0KKwl9CisKKwkvLyBASnNvblByb3BlcnR5CisJQE5vdE51bGwKKwlwdWJsaWMgU3RyaW5nIGdldFJhbmdlTWluVmFsdWUoKSB7CisJCWlmIChpblJhbmdlICE9IG51bGwpIHsKKwkJCXJldHVybiBpblJhbmdlLmdldCgwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLy8gQEpzb25Qcm9wZXJ0eQorCXB1YmxpYyB2b2lkIHNldFJhbmdlTWluVmFsdWUoU3RyaW5nIG1pblZhbHVlKSB7CisJCWlmIChpblJhbmdlID09IG51bGwpIHsKKwkJCWluUmFuZ2UgPSBMaXN0cy5uZXdBcnJheUxpc3QobWluVmFsdWUsICIiKTsKKwkJfSBlbHNlIHsKKwkJCWluUmFuZ2Uuc2V0KDAsIG1pblZhbHVlKTsKKwkJfQorCX0KKworCS8vIEBKc29uUHJvcGVydHkKKwlATm90TnVsbAorCXB1YmxpYyBTdHJpbmcgZ2V0UmFuZ2VNYXhWYWx1ZSgpIHsKKwkJaWYgKGluUmFuZ2UgIT0gbnVsbCkgeworCQkJcmV0dXJuIGluUmFuZ2UuZ2V0KDEpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvLyBASnNvblByb3BlcnR5CisJcHVibGljIHZvaWQgc2V0UmFuZ2VNYXhWYWx1ZShTdHJpbmcgbWF4VmFsdWUpIHsKKwkJaWYgKGluUmFuZ2UgPT0gbnVsbCkgeworCQkJaW5SYW5nZSA9IExpc3RzLm5ld0FycmF5TGlzdCgiIiwgbWF4VmFsdWUpOworCQl9IGVsc2UgeworCQkJaW5SYW5nZS5zZXQoMSwgbWF4VmFsdWUpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvTGVuZ3RoQ29uc3RyYWludC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0xlbmd0aENvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmEwMDcxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL0xlbmd0aENvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgTGVuZ3RoQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0U3RyaW5nUHJvcGVydHlDb25zdHJhaW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyNDk5MTIwMzAyODE3OTEyMzNMOworCisJQE5vdE51bGwKKwlwcml2YXRlIEludGVnZXIgbGVuZ3RoOworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZShTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAocHJvcGVydHlWYWx1ZS5sZW5ndGgoKSAhPSBsZW5ndGgpIHsKKwkJCXRocm93IG5ldyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKCJUaGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBpcyBub3QgZXF1YWxzIHRvIFsiICsgbGVuZ3RoICsgIl0iKTsKKwkJfQorCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBsZW5ndGgpIHsKKwkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvTGVzc09yRXF1YWxDb25zdHJhaW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvTGVzc09yRXF1YWxDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MWZlMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9MZXNzT3JFcXVhbENvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKworLy9pbXBvcnQgYWxpZW40Y2xvdWQuanNvbi5kZXNlcmlhbGl6ZXIuVGV4dERlc2VyaWFsaXplcjsKKy8vaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5hbm5vdGF0aW9uLkpzb25EZXNlcmlhbGl6ZTsKKworcHVibGljIGNsYXNzIExlc3NPckVxdWFsQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0Q29tcGFyYWJsZVByb3BlcnR5Q29uc3RyYWludCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDkwNzg2NDMxNzY4NzEzODY3OEw7CisKKwkvLyBASnNvbkRlc2VyaWFsaXplKHVzaW5nID0gVGV4dERlc2VyaWFsaXplci5jbGFzcykKKwlATm90TnVsbAorCXByaXZhdGUgU3RyaW5nIGxlc3NPckVxdWFsOworCisJcHVibGljIExlc3NPckVxdWFsQ29uc3RyYWludChTdHJpbmcgbGVzc09yRXF1YWwpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5sZXNzT3JFcXVhbCA9IGxlc3NPckVxdWFsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVG9zY2FUeXBlIHByb3BlcnR5VHlwZSkgdGhyb3dzIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24geworCQlpbml0aWFsaXplKGxlc3NPckVxdWFsLCBwcm9wZXJ0eVR5cGUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvVmFsaWRhdGUoT2JqZWN0IHByb3BlcnR5VmFsdWUpIHRocm93cyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKGdldENvbXBhcmFibGUoKS5jb21wYXJlVG8ocHJvcGVydHlWYWx1ZSkgPCAwKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihwcm9wZXJ0eVZhbHVlICsgIiA+PSAiICsgbGVzc09yRXF1YWwpOworCQl9CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMZXNzT3JFcXVhbCgpIHsKKwkJcmV0dXJuIGxlc3NPckVxdWFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldExlc3NPckVxdWFsKFN0cmluZyBsZXNzT3JFcXVhbCkgeworCQl0aGlzLmxlc3NPckVxdWFsID0gbGVzc09yRXF1YWw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvTGVzc1RoYW5Db25zdHJhaW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvTGVzc1RoYW5Db25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjNDNmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9MZXNzVGhhbkNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIExlc3NUaGFuQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0Q29tcGFyYWJsZVByb3BlcnR5Q29uc3RyYWludCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjY3NjIzMDE0NzAzODU5NTAxTDsKKworCUBOb3ROdWxsCisJcHJpdmF0ZSBTdHJpbmcgbGVzc1RoYW47CisKKwlwdWJsaWMgTGVzc1RoYW5Db25zdHJhaW50KFN0cmluZyBsZXNzVGhhbikgeworCQlzdXBlcigpOworCQl0aGlzLmxlc3NUaGFuID0gbGVzc1RoYW47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUb3NjYVR5cGUgcHJvcGVydHlUeXBlKSB0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiB7CisJCWluaXRpYWxpemUobGVzc1RoYW4sIHByb3BlcnR5VHlwZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAoZ2V0Q29tcGFyYWJsZSgpLmNvbXBhcmVUbyhwcm9wZXJ0eVZhbHVlKSA8PSAwKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihwcm9wZXJ0eVZhbHVlICsgIiA+ICIgKyBsZXNzVGhhbik7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9NYXhMZW5ndGhDb25zdHJhaW50LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvTWF4TGVuZ3RoQ29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTgwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvTWF4TGVuZ3RoQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBNYXhMZW5ndGhDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdQcm9wZXJ0eUNvbnN0cmFpbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjM3NzYwMzcwNTY3MDIwMTI1Nkw7CisKKwlATm90TnVsbAorCXByaXZhdGUgSW50ZWdlciBtYXhMZW5ndGg7CisKKwlwdWJsaWMgTWF4TGVuZ3RoQ29uc3RyYWludChJbnRlZ2VyIG1heExlbmd0aCkgeworCQl0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDsKKwl9CisKKwlwdWJsaWMgTWF4TGVuZ3RoQ29uc3RyYWludCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChwcm9wZXJ0eVZhbHVlLmxlbmd0aCgpID4gbWF4TGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFsiICsgbWF4TGVuZ3RoICsgIl0iKTsKKwkJfQorCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldE1heExlbmd0aCgpIHsKKwkJcmV0dXJuIG1heExlbmd0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNYXhMZW5ndGgoSW50ZWdlciBtYXhMZW5ndGgpIHsKKwkJdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL01pbkxlbmd0aENvbnN0cmFpbnQuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9NaW5MZW5ndGhDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZTVmYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9NaW5MZW5ndGhDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE1pbkxlbmd0aENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZ1Byb3BlcnR5Q29uc3RyYWludCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjQyMjQyNDY4MDgxMTI0MEw7CisKKwlATm90TnVsbAorCXByaXZhdGUgSW50ZWdlciBtaW5MZW5ndGg7CisKKwlwdWJsaWMgTWluTGVuZ3RoQ29uc3RyYWludChJbnRlZ2VyIG1pbkxlbmd0aCkgeworCQl0aGlzLm1pbkxlbmd0aCA9IG1pbkxlbmd0aDsKKwl9CisKKwlwdWJsaWMgTWluTGVuZ3RoQ29uc3RyYWludCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChwcm9wZXJ0eVZhbHVlLmxlbmd0aCgpIDwgbWluTGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIFsiICsgbWluTGVuZ3RoICsgIl0iKTsKKwkJfQorCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldE1pbkxlbmd0aCgpIHsKKwkJcmV0dXJuIG1pbkxlbmd0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNaW5MZW5ndGgoSW50ZWdlciBtaW5MZW5ndGgpIHsKKwkJdGhpcy5taW5MZW5ndGggPSBtaW5MZW5ndGg7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvUGF0dGVybkNvbnN0cmFpbnQuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9QYXR0ZXJuQ29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NWMxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvUGF0dGVybkNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOworCisvL2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSWdub3JlOworCitwdWJsaWMgY2xhc3MgUGF0dGVybkNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZ1Byb3BlcnR5Q29uc3RyYWludCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NzA4MTg1Mjk0OTY4Njk3MTA3TDsKKworCUBOb3ROdWxsCisJcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKKworCS8vIEBKc29uSWdub3JlCisJcHJpdmF0ZSBQYXR0ZXJuIGNvbXBpbGVkUGF0dGVybjsKKworCXB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKKwkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKwkJdGhpcy5jb21waWxlZFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUodGhpcy5wYXR0ZXJuKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiB7CisJCWlmICghY29tcGlsZWRQYXR0ZXJuLm1hdGNoZXIocHJvcGVydHlWYWx1ZSkubWF0Y2hlcygpKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVGhlIHZhbHVlIGRvIG5vdCBtYXRjaCBwYXR0ZXJuICIgKyBwYXR0ZXJuKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9WYWxpZFZhbHVlc0NvbnN0cmFpbnQuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9WYWxpZFZhbHVlc0NvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzhmNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL1ZhbGlkVmFsdWVzQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uLkNvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKKy8vaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCitwdWJsaWMgY2xhc3MgVmFsaWRWYWx1ZXNDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eUNvbnN0cmFpbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTkwNjA4NzE4MDA3OTg5Mjg1M0w7CisKKwlATm90TnVsbAorCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkVmFsdWVzOworCS8vIEBKc29uSWdub3JlCisJcHJpdmF0ZSBTZXQ8T2JqZWN0PiB2YWxpZFZhbHVlc1R5cGVkOworCisJcHVibGljIFZhbGlkVmFsdWVzQ29uc3RyYWludChMaXN0PFN0cmluZz4gdmFsaWRWYWx1ZXMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy52YWxpZFZhbHVlcyA9IHZhbGlkVmFsdWVzOworCX0KKworCXB1YmxpYyBWYWxpZFZhbHVlc0NvbnN0cmFpbnQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUb3NjYVR5cGUgcHJvcGVydHlUeXBlKSB0aHJvd3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiB7CisJCXZhbGlkVmFsdWVzVHlwZWQgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKwkJaWYgKHZhbGlkVmFsdWVzID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBDb25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uKAorCQkJCQkidmFsaWRWYWx1ZXMgY29uc3RyYWludCBoYXMgaW52YWxpZCB2YWx1ZSA8PiBwcm9wZXJ0eSB0eXBlIGlzIDwiICsgcHJvcGVydHlUeXBlLnRvU3RyaW5nKCkgKyAiPiIpOworCQl9CisJCWZvciAoU3RyaW5nIHZhbHVlIDogdmFsaWRWYWx1ZXMpIHsKKwkJCWlmICghcHJvcGVydHlUeXBlLmlzVmFsaWRWYWx1ZSh2YWx1ZSkpIHsKKwkJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbigidmFsaWRWYWx1ZXMgY29uc3RyYWludCBoYXMgaW52YWxpZCB2YWx1ZSA8IgorCQkJCQkJKyB2YWx1ZSArICI+IHByb3BlcnR5IHR5cGUgaXMgPCIgKyBwcm9wZXJ0eVR5cGUudG9TdHJpbmcoKSArICI+Iik7CisJCQl9IGVsc2UgeworCQkJCXZhbGlkVmFsdWVzVHlwZWQuYWRkKHByb3BlcnR5VHlwZS5jb252ZXJ0KHZhbHVlKSk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24geworCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiVmFsdWUgdG8gdmFsaWRhdGUgaXMgbnVsbCIpOworCQl9CisJCWlmICghdmFsaWRWYWx1ZXNUeXBlZC5jb250YWlucyhwcm9wZXJ0eVZhbHVlKSkgeworCQkJdGhyb3cgbmV3IENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oIlRoZSB2YWx1ZSBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIik7CisJCX0KKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFZhbGlkVmFsdWVzKCkgeworCQlyZXR1cm4gdmFsaWRWYWx1ZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsaWRWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbGlkVmFsdWVzKSB7CisJCXRoaXMudmFsaWRWYWx1ZXMgPSB2YWxpZFZhbHVlczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludEZ1bmN0aW9uYWxFeGNlcHRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludEZ1bmN0aW9uYWxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQxNjVmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL2V4Y2VwdGlvbi9Db25zdHJhaW50RnVuY3Rpb25hbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb247CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5Db25zdHJhaW50VXRpbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5Db25zdHJhaW50VXRpbC5Db25zdHJhaW50SW5mb3JtYXRpb247CisKKy8qKgorICogQWxsIGZ1bmN0aW9uYWwgZXJyb3IgcmVsYXRlZCB0byBjb25zdHJhaW50IHByb2Nlc3NpbmcgbXVzdCBnbyBoZXJlCisgKiAKKyAqIEBhdXRob3IgbWt2CisgKiAKKyAqLworcHVibGljIGNsYXNzIENvbnN0cmFpbnRGdW5jdGlvbmFsRXhjZXB0aW9uIGV4dGVuZHMgRnVuY3Rpb25hbEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXByb3RlY3RlZCBDb25zdHJhaW50SW5mb3JtYXRpb24gY29uc3RyYWludEluZm9ybWF0aW9uOworCisJcHVibGljIENvbnN0cmFpbnRGdW5jdGlvbmFsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCX0KKworCXB1YmxpYyBDb25zdHJhaW50RnVuY3Rpb25hbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKKwlwdWJsaWMgQ29uc3RyYWludEZ1bmN0aW9uYWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwgQ29uc3RyYWludEluZm9ybWF0aW9uIGNvbnN0cmFpbnRJbmZvcm1hdGlvbikgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJCXRoaXMuY29uc3RyYWludEluZm9ybWF0aW9uID0gY29uc3RyYWludEluZm9ybWF0aW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL2V4Y2VwdGlvbi9Db25zdHJhaW50UmVxdWlyZWRQYXJhbWV0ZXJFeGNlcHRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludFJlcXVpcmVkUGFyYW1ldGVyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNjQwNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludFJlcXVpcmVkUGFyYW1ldGVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkNvbnN0cmFpbnRVdGlsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkNvbnN0cmFpbnRVdGlsLkNvbnN0cmFpbnRJbmZvcm1hdGlvbjsKKworLyoqCisgKiBFeGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gYSByZXF1aXJlZCBwcm9wZXJ0eSBpcyBub3QgcHJvdmlkZWQKKyAqIAorICogQGF1dGhvciBtb3Vyb3V2aQorICoKKyAqLworcHVibGljIGNsYXNzIENvbnN0cmFpbnRSZXF1aXJlZFBhcmFtZXRlckV4Y2VwdGlvbiBleHRlbmRzIENvbnN0cmFpbnRGdW5jdGlvbmFsRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJcHVibGljIENvbnN0cmFpbnRSZXF1aXJlZFBhcmFtZXRlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKKwlwdWJsaWMgQ29uc3RyYWludFJlcXVpcmVkUGFyYW1ldGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCX0KKworCXB1YmxpYyBDb25zdHJhaW50UmVxdWlyZWRQYXJhbWV0ZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwKKwkJCUNvbnN0cmFpbnRJbmZvcm1hdGlvbiBjb25zdHJhaW50SW5mb3JtYXRpb24pIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCQl0aGlzLmNvbnN0cmFpbnRJbmZvcm1hdGlvbiA9IGNvbnN0cmFpbnRJbmZvcm1hdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludFRlY2huaWNhbEV4Y2VwdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL2V4Y2VwdGlvbi9Db25zdHJhaW50VGVjaG5pY2FsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxNmFjNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludFRlY2huaWNhbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb247CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIGNvbnN0cmFpbnQgcmVsYXRlZCBleGNlcHRpb25zCisgKiAKKyAqIEBhdXRob3IgZXNvZmVyCisgKiAKKyAqLworcHVibGljIGNsYXNzIENvbnN0cmFpbnRUZWNobmljYWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTgyOTM2MDczMDk4MDUyMTU2N0w7CisKKwlwdWJsaWMgQ29uc3RyYWludFRlY2huaWNhbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKwl9CisKKwlwdWJsaWMgQ29uc3RyYWludFRlY2huaWNhbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL2V4Y2VwdGlvbi9Db25zdHJhaW50VmFsdWVEb05vdE1hdGNoUHJvcGVydHlUeXBlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMGQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb247CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5Db25zdHJhaW50VXRpbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5Db25zdHJhaW50VXRpbC5Db25zdHJhaW50SW5mb3JtYXRpb247CisKKy8qKgorICogRXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGEgY29uc3RyYWludCBkZWZpbml0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUKKyAqIHNwZWNpZmllZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIHRoZSBwcm9wZXJ0eSB0eXBlLgorICogCisgKiBAYXV0aG9yIGVzb2ZlcgorICovCitwdWJsaWMgY2xhc3MgQ29uc3RyYWludFZhbHVlRG9Ob3RNYXRjaFByb3BlcnR5VHlwZUV4Y2VwdGlvbiBleHRlbmRzIENvbnN0cmFpbnRGdW5jdGlvbmFsRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzNDI2MTM4NDk2NjA5NTc2NTFMOworCisJcHVibGljIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorCisJcHVibGljIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJcHVibGljIENvbnN0cmFpbnRWYWx1ZURvTm90TWF0Y2hQcm9wZXJ0eVR5cGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwKKwkJCUNvbnN0cmFpbnRJbmZvcm1hdGlvbiBjb25zdHJhaW50SW5mb3JtYXRpb24pIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCQl0aGlzLmNvbnN0cmFpbnRJbmZvcm1hdGlvbiA9IGNvbnN0cmFpbnRJbmZvcm1hdGlvbjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvZXhjZXB0aW9uL0NvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2U2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29uc3RyYWludHMvZXhjZXB0aW9uL0NvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuZXhjZXB0aW9uOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuQ29uc3RyYWludFV0aWw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuQ29uc3RyYWludFV0aWwuQ29uc3RyYWludEluZm9ybWF0aW9uOworCisvKioKKyAqIEV4Y2VwdGlvbiBoYXBwZW5lZCB3aGlsZSB1c2VyIHZpb2xhdGVkIGEgcHJlZGVmaW5lZCBjb25zdHJhaW50CisgKiAKKyAqIEBhdXRob3IgbWt2CisgKiAKKyAqLworcHVibGljIGNsYXNzIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBDb25zdHJhaW50RnVuY3Rpb25hbEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXB1YmxpYyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KKworCXB1YmxpYyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCX0KKworCXB1YmxpYyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UsIENvbnN0cmFpbnRJbmZvcm1hdGlvbiBjb25zdHJhaW50SW5mb3JtYXRpb24pIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCQl0aGlzLmNvbnN0cmFpbnRJbmZvcm1hdGlvbiA9IGNvbnN0cmFpbnRJbmZvcm1hdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vRnVuY3Rpb25hbEV4Y2VwdGlvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL2V4Y2VwdGlvbi9GdW5jdGlvbmFsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NDMwNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vRnVuY3Rpb25hbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb247CisKKy8qKgorICogQWxsIGZ1bmN0aW9uYWwgZXhjZXB0aW9uIHdoaWNoIGlzIHJlbGF0ZWQgdG8gdXNlciBpbnB1dCBtdXN0IGdvIGhlcmUuIEl0J3MgYQorICogY2hlY2tlZCBleGNlcHRpb24gdG8gZm9yY2UgZXJyb3IgaGFuZGxpbmcgYW5kIGNoZWNraW5nLgorICogCisgKiBAYXV0aG9yIG1rdgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBGdW5jdGlvbmFsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY3MTI4NDU2ODU3OTg3OTI0OTNMOworCisJcHVibGljIEZ1bmN0aW9uYWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJcHVibGljIEZ1bmN0aW9uYWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL2V4Y2VwdGlvbi9JbnZhbGlkUHJvcGVydHlDb25zdHJhaW50SW1wbGVtZW50YXRpb25FeGNlcHRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vSW52YWxpZFByb3BlcnR5Q29uc3RyYWludEltcGxlbWVudGF0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMzFkOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vSW52YWxpZFByb3BlcnR5Q29uc3RyYWludEltcGxlbWVudGF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbjsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gdGhlIHVzZXIgZGVmaW5lcyBpbnZhbGlkIGN1c3RvbSBwcm9wZXJ0eSBjb25zdHJhaW50CisgKiAKKyAqIEBhdXRob3IgbWt2CisgKiAKKyAqLworcHVibGljIGNsYXNzIEludmFsaWRQcm9wZXJ0eUNvbnN0cmFpbnRJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIENvbnN0cmFpbnRUZWNobmljYWxFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc5NzU1MDk0NDMyODU0NDcwNkw7CisKKwlwdWJsaWMgSW52YWxpZFByb3BlcnR5Q29uc3RyYWludEltcGxlbWVudGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCX0KKworCXB1YmxpYyBJbnZhbGlkUHJvcGVydHlDb25zdHJhaW50SW1wbGVtZW50YXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnN0cmFpbnRzL2V4Y2VwdGlvbi9UZWNobmljYWxFeGNlcHRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vVGVjaG5pY2FsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkZGVlYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb25zdHJhaW50cy9leGNlcHRpb24vVGVjaG5pY2FsRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLmV4Y2VwdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgQWxpZW4gdGVjaG5pY2FsIGV4Y2VwdGlvbgorICoKKyAqIEBhdXRob3IgbWt2CisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVjaG5pY2FsRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTE1MjQ3MzE4MzAyNTM5MDE2MUw7CisKKwlwdWJsaWMgVGVjaG5pY2FsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCX0KKworCXB1YmxpYyBUZWNobmljYWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvQm9vbGVhbkNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvQm9vbGVhbkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjFlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Cb29sZWFuQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgQm9vbGVhbkNvbnZlcnRlciBpbXBsZW1lbnRzIFRvc2NhVmFsdWVDb252ZXJ0ZXIgeworCXByaXZhdGUgc3RhdGljIEJvb2xlYW5Db252ZXJ0ZXIgYm9vbGVhbkNvbnZlcnRlciA9IG5ldyBCb29sZWFuQ29udmVydGVyKCk7CisKKwlwdWJsaWMgc3RhdGljIEJvb2xlYW5Db252ZXJ0ZXIgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBib29sZWFuQ29udmVydGVyOworCX0KKworCXByaXZhdGUgQm9vbGVhbkNvbnZlcnRlcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29udmVydFRvVG9zY2FWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0RlZmF1bHRDb252ZXJ0ZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0RlZmF1bHRDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTkwMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvRGVmYXVsdENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIERlZmF1bHRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIERlZmF1bHRDb252ZXJ0ZXIgZGVmYXVsdENvbnZlcnRlciA9IG5ldyBEZWZhdWx0Q29udmVydGVyKCk7CisKKwlwdWJsaWMgc3RhdGljIERlZmF1bHRDb252ZXJ0ZXIgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBkZWZhdWx0Q29udmVydGVyOworCX0KKworCXByaXZhdGUgRGVmYXVsdENvbnZlcnRlcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9GbG9hdENvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvRmxvYXRDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VkZDliCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvRmxvYXRDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBGbG9hdENvbnZlcnRlciBpbXBsZW1lbnRzIFRvc2NhVmFsdWVDb252ZXJ0ZXIgeworCXByaXZhdGUgc3RhdGljIEZsb2F0Q29udmVydGVyIGZsb2F0Q29udmVydGVyID0gbmV3IEZsb2F0Q29udmVydGVyKCk7CisKKwlwdWJsaWMgc3RhdGljIEZsb2F0Q29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gZmxvYXRDb252ZXJ0ZXI7CisJfQorCisJcHJpdmF0ZSBGbG9hdENvbnZlcnRlcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29udmVydFRvVG9zY2FWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCXJldHVybiBEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0hlYXRCb29sZWFuQ29udmVydGVyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9IZWF0Qm9vbGVhbkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2IyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9IZWF0Qm9vbGVhbkNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEhlYXRCb29sZWFuQ29udmVydGVyIGltcGxlbWVudHMgUHJvcGVydHlWYWx1ZUNvbnZlcnRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBIZWF0Qm9vbGVhbkNvbnZlcnRlciBib29sZWFuQ29udmVydGVyID0gbmV3IEhlYXRCb29sZWFuQ29udmVydGVyKCk7CisKKwlwdWJsaWMgc3RhdGljIEhlYXRCb29sZWFuQ29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gYm9vbGVhbkNvbnZlcnRlcjsKKwl9CisKKwlwcml2YXRlIEhlYXRCb29sZWFuQ29udmVydGVyKCkgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInQiKSB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJvbiIpCisJCQkJfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgieWVzIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgieSIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIjEiKSkgeworCQkJcmV0dXJuICJ0cnVlIjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAiZmFsc2UiOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9IZWF0Q29tbWFEZWxpbWl0ZWRMaXN0Q29udmVydGVyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9IZWF0Q29tbWFEZWxpbWl0ZWRMaXN0Q29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4MzQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0hlYXRDb21tYURlbGltaXRlZExpc3RDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworCitwdWJsaWMgY2xhc3MgSGVhdENvbW1hRGVsaW1pdGVkTGlzdENvbnZlcnRlciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgSGVhdENvbW1hRGVsaW1pdGVkTGlzdENvbnZlcnRlciBzdHJpbmdDb252ZXJ0ZXIgPSBuZXcgSGVhdENvbW1hRGVsaW1pdGVkTGlzdENvbnZlcnRlcigpOworCisJcHVibGljIHN0YXRpYyBIZWF0Q29tbWFEZWxpbWl0ZWRMaXN0Q29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gc3RyaW5nQ29udmVydGVyOworCX0KKworCXByaXZhdGUgSGVhdENvbW1hRGVsaW1pdGVkTGlzdENvbnZlcnRlcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydChTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCVN0cmluZyBjb3ZlcnRlZCA9IFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKG9yaWdpbmFsKTsKKwkJY292ZXJ0ZWQgPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlSHRtbFRhZ3NPbmx5KGNvdmVydGVkKTsKKwkJY292ZXJ0ZWQgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlV2hpdGVzcGFjZShjb3ZlcnRlZCk7CisJCWNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLnN0cmlwT2N0ZXRzKGNvdmVydGVkKTsKKworCQlyZXR1cm4gY292ZXJ0ZWQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9IZWF0SnNvbkNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSGVhdEpzb25Db252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTA3N2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSGVhdEpzb25Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworCitwdWJsaWMgY2xhc3MgSGVhdEpzb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIEhlYXRKc29uQ29udmVydGVyIGpzb25Db252ZXJ0ZXIgPSBuZXcgSGVhdEpzb25Db252ZXJ0ZXIoKTsKKworCXB1YmxpYyBzdGF0aWMgSGVhdEpzb25Db252ZXJ0ZXIgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBqc29uQ29udmVydGVyOworCX0KKworCXByaXZhdGUgSGVhdEpzb25Db252ZXJ0ZXIoKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIG9yaWdpbmFsLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlTdHJpbmcgY292ZXJ0ZWQgPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlTm9uZVV0ZjhDaGFycyhvcmlnaW5hbCk7CisJCWNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLnJlbW92ZUh0bWxUYWdzT25seShjb3ZlcnRlZCk7CisJCWNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZVdoaXRlc3BhY2UoY292ZXJ0ZWQpOworCQljb3ZlcnRlZCA9IFZhbGlkYXRpb25VdGlscy5zdHJpcE9jdGV0cyhjb3ZlcnRlZCk7CisJCS8vIEFzIG9wcG9zZWQgdG8gc3RyaW5nIGNvbnZlcnRlciwga2VlcGluZyB0aGUgIiBhbmQgJyBzeW1ib2xzCisJCXJldHVybiBjb3ZlcnRlZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0hlYXROdW1iZXJDb252ZXJ0ZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0hlYXROdW1iZXJDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc4MWJlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSGVhdE51bWJlckNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEhlYXROdW1iZXJDb252ZXJ0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIEhlYXROdW1iZXJDb252ZXJ0ZXIgbnVtYmVyQ29udmVydGVyID0gbmV3IEhlYXROdW1iZXJDb252ZXJ0ZXIoKTsKKworCXB1YmxpYyBzdGF0aWMgSGVhdE51bWJlckNvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG51bWJlckNvbnZlcnRlcjsKKwl9CisKKwlwcml2YXRlIEhlYXROdW1iZXJDb252ZXJ0ZXIoKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIG9yaWdpbmFsLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCWlmIChvcmlnaW5hbCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXJldHVybiBuZXcgQmlnRGVjaW1hbChvcmlnaW5hbCkudG9QbGFpblN0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSGVhdFN0cmluZ0NvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSGVhdFN0cmluZ0NvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NWRiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9IZWF0U3RyaW5nQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKKworcHVibGljIGNsYXNzIEhlYXRTdHJpbmdDb252ZXJ0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIEhlYXRTdHJpbmdDb252ZXJ0ZXIgc3RyaW5nQ29udmVydGVyID0gbmV3IEhlYXRTdHJpbmdDb252ZXJ0ZXIoKTsKKworCXB1YmxpYyBzdGF0aWMgSGVhdFN0cmluZ0NvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIHN0cmluZ0NvbnZlcnRlcjsKKwl9CisKKwlwcml2YXRlIEhlYXRTdHJpbmdDb252ZXJ0ZXIoKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIG9yaWdpbmFsLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlTdHJpbmcgY292ZXJ0ZWQgPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlTm9uZVV0ZjhDaGFycyhvcmlnaW5hbCk7CisJCWNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZVdoaXRlc3BhY2UoY292ZXJ0ZWQpOworCQljb3ZlcnRlZCA9IFZhbGlkYXRpb25VdGlscy5zdHJpcE9jdGV0cyhjb3ZlcnRlZCk7CisJCWNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLnJlbW92ZUh0bWxUYWdzT25seShjb3ZlcnRlZCk7CisJCWNvdmVydGVkID0gY292ZXJ0ZWQucmVwbGFjZUFsbCgiXCIiLCAiIikucmVwbGFjZUFsbCgiXCciLCAiIik7CisKKwkJcmV0dXJuIGNvdmVydGVkOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSW50ZWdlckNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSW50ZWdlckNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmU1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9JbnRlZ2VyQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgSW50ZWdlckNvbnZlcnRlciBpbXBsZW1lbnRzIFRvc2NhVmFsdWVDb252ZXJ0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgSW50ZWdlckNvbnZlcnRlciBpbnRlZ2VyQ29udmVydGVyID0gbmV3IEludGVnZXJDb252ZXJ0ZXIoKTsKKworCXB1YmxpYyBzdGF0aWMgSW50ZWdlckNvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGludGVnZXJDb252ZXJ0ZXI7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyQ29udmVydGVyKCkgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb252ZXJ0VG9Ub3NjYVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSnNvbkNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvSnNvbkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Nzk0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Kc29uQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdzb25GYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvblJlYWRlcjsKKworcHVibGljIGNsYXNzIEpzb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIEpzb25Db252ZXJ0ZXIganNvbkNvbnZlcnRlciA9IG5ldyBKc29uQ29udmVydGVyKCk7CisKKwlwcml2YXRlIHN0YXRpYyBKc29uUGFyc2VyIGpzb25QYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOworCisJcHJpdmF0ZSBzdGF0aWMgR3NvbiBnc29uID0gR3NvbkZhY3RvcnkuZ2V0R3NvbigpOworCisJcHVibGljIHN0YXRpYyBKc29uQ29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4ganNvbkNvbnZlcnRlcjsKKwl9CisKKwlwcml2YXRlIEpzb25Db252ZXJ0ZXIoKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih2YWx1ZSk7CisJCUpzb25SZWFkZXIganNvblJlYWRlciA9IG5ldyBKc29uUmVhZGVyKHJlYWRlcik7CisJCWpzb25SZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKwkJSnNvbkVsZW1lbnQganNvbkVsZW1lbnQgPSBqc29uUGFyc2VyLnBhcnNlKGpzb25SZWFkZXIpOworCQlpZiAoanNvbkVsZW1lbnQuaXNKc29uUHJpbWl0aXZlKCkpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCQlyZXR1cm4gZ3Nvbi50b0pzb24oanNvbkVsZW1lbnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0xpc3RDb252ZXJ0ZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0xpc3RDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjY1Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvTGlzdENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5CZUVjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVByb3BlcnR5VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzLkRhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuTGlzdFZhbGlkYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5Hc29uRmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5Kc29uVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIExpc3RDb252ZXJ0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIExpc3RDb252ZXJ0ZXIgbGlzdENvbnZlcnRlciA9IG5ldyBMaXN0Q29udmVydGVyKCk7CisJcHJpdmF0ZSBzdGF0aWMgR3NvbiBnc29uID0gR3NvbkZhY3RvcnkuZ2V0R3NvbigpOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMaXN0VmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKwlEYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlciBkYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlciA9IERhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyLmdldEluc3RhbmNlKCk7CisKKwlwcml2YXRlIHN0YXRpYyBKc29uUGFyc2VyIGpzb25QYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOworCisJcHVibGljIHN0YXRpYyBMaXN0Q29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gbGlzdENvbnZlcnRlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlFaXRoZXI8U3RyaW5nLCBCb29sZWFuPiBjb252ZXJ0V2l0aEVycm9yUmVzdWx0ID0gdGhpcy5jb252ZXJ0V2l0aEVycm9yUmVzdWx0KHZhbHVlLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisJCWlmIChjb252ZXJ0V2l0aEVycm9yUmVzdWx0LmlzUmlnaHQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gY29udmVydFdpdGhFcnJvclJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gY29udmVydFdpdGhFcnJvclJlc3VsdChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsCisJCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCBpbm5lclR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbHVlKTsKKwkJfQorCisJCVByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgaW5uZXJDb252ZXJ0ZXI7CisJCVRvc2NhUHJvcGVydHlUeXBlIGlubmVyVG9zY2FUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUoaW5uZXJUeXBlKTsKKworCQlpZiAoaW5uZXJUb3NjYVR5cGUgIT0gbnVsbCkgeworCQkJUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBpbm5lckNvbnZlcnRlcjE7CisJCQlzd2l0Y2ggKGlubmVyVG9zY2FUeXBlKSB7CisJCQljYXNlIFNUUklORzoKKwkJCQlpbm5lckNvbnZlcnRlcjEgPSBUb3NjYVByb3BlcnR5VHlwZS5TVFJJTkcuZ2V0Q29udmVydGVyKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVHRVI6CisJCQkJaW5uZXJDb252ZXJ0ZXIxID0gVG9zY2FQcm9wZXJ0eVR5cGUuSU5URUdFUi5nZXRDb252ZXJ0ZXIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkxPQVQ6CisJCQkJaW5uZXJDb252ZXJ0ZXIxID0gVG9zY2FQcm9wZXJ0eVR5cGUuRkxPQVQuZ2V0Q29udmVydGVyKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEJPT0xFQU46CisJCQkJaW5uZXJDb252ZXJ0ZXIxID0gVG9zY2FQcm9wZXJ0eVR5cGUuQk9PTEVBTi5nZXRDb252ZXJ0ZXIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSlNPTjoKKwkJCQlpbm5lckNvbnZlcnRlcjEgPSBUb3NjYVByb3BlcnR5VHlwZS5KU09OLmdldENvbnZlcnRlcigpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsb2cuZGVidWcoImlubmVyIFRvc2NhIFR5cGUgaXMgdW5rbm93biIpOworCQkJCXJldHVybiBFaXRoZXIubGVmdCh2YWx1ZSk7CisJCQl9CisJCQlpbm5lckNvbnZlcnRlciA9IGlubmVyQ29udmVydGVyMTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiaW5uZXIgVG9zY2EgVHlwZSB7fSBpYSBhIGNvbXBsZXggZGF0YSB0eXBlLiIsIGlubmVyVHlwZSk7CisKKwkJCUVpdGhlcjxTdHJpbmcsIEJvb2xlYW4+IHZhbGlkYXRlQ29tcGxleElubmVyVHlwZSA9IGNvbnZlcnRDb21wbGV4SW5uZXJUeXBlKHZhbHVlLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisKKwkJCXJldHVybiB2YWxpZGF0ZUNvbXBsZXhJbm5lclR5cGU7CisJCX0KKworCQl0cnkgeworCQkJQXJyYXlMaXN0PFN0cmluZz4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisJCQlKc29uQXJyYXkgam8gPSAoSnNvbkFycmF5KSBqc29uUGFyc2VyLnBhcnNlKHZhbHVlKTsKKwkJCWludCBzaXplID0gam8uc2l6ZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlKc29uRWxlbWVudCBjdXJyZW50VmFsdWUgPSBqby5nZXQoaSk7CisJCQkJU3RyaW5nIGVsZW1lbnQgPSBKc29uVXRpbHMudG9TdHJpbmcoY3VycmVudFZhbHVlKTsKKworCQkJCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5pc0VtcHR5KCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsZW1lbnQgPSBpbm5lckNvbnZlcnRlci5jb252ZXJ0KGVsZW1lbnQsIG51bGwsIGRhdGFUeXBlcyk7CisJCQkJbmV3TGlzdC5hZGQoZWxlbWVudCk7CisJCQl9CisKKwkJCXN3aXRjaCAoaW5uZXJUb3NjYVR5cGUpIHsKKwkJCWNhc2UgU1RSSU5HOgorCQkJCXZhbHVlID0gZ3Nvbi50b0pzb24obmV3TGlzdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVHRVI6CisJCQkJTGlzdDxCaWdJbnRlZ2VyPiBpbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxCaWdJbnRlZ2VyPigpOworCisJCQkJZm9yIChTdHJpbmcgc3RyIDogbmV3TGlzdCkgeworCQkJCQlpbnQgYmFzZSA9IDEwOworCQkJCQlpZiAoc3RyLmNvbnRhaW5zKCIweCIpKSB7CisJCQkJCQlzdHIgPSBzdHIucmVwbGFjZUZpcnN0KCIweCIsICIiKTsKKwkJCQkJCWJhc2UgPSAxNjsKKwkJCQkJfQorCQkJCQlpZiAoc3RyLmNvbnRhaW5zKCIwbyIpKSB7CisJCQkJCQlzdHIgPSBzdHIucmVwbGFjZUZpcnN0KCIwbyIsICIiKTsKKwkJCQkJCWJhc2UgPSA4OworCQkJCQl9CisJCQkJCWludExpc3QuYWRkKG5ldyBCaWdJbnRlZ2VyKHN0ciwgYmFzZSkpOworCQkJCX0KKwkJCQl2YWx1ZSA9IGdzb24udG9Kc29uKGludExpc3QpOworCQkJCWJyZWFrOworCQkJY2FzZSBGTE9BVDoKKwkJCQl2YWx1ZSA9ICJbIjsKKwkJCQlmb3IgKFN0cmluZyBzdHIgOiBuZXdMaXN0KSB7CisJCQkJCXZhbHVlICs9IHN0ciArICIsIjsKKwkJCQl9CisJCQkJdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKKwkJCQl2YWx1ZSArPSAiXSI7CisJCQkJYnJlYWs7CisJCQljYXNlIEJPT0xFQU46CisJCQkJTGlzdDxCb29sZWFuPiBib29sTGlzdCA9IG5ldyBBcnJheUxpc3Q8Qm9vbGVhbj4oKTsKKwkJCQlmb3IgKFN0cmluZyBzdHIgOiBuZXdMaXN0KSB7CisJCQkJCWJvb2xMaXN0LmFkZChCb29sZWFuLnZhbHVlT2Yoc3RyKSk7CisJCQkJfQorCQkJCXZhbHVlID0gZ3Nvbi50b0pzb24oYm9vbExpc3QpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl2YWx1ZSA9IGdzb24udG9Kc29uKG5ld0xpc3QpOworCQkJCWxvZy5kZWJ1ZygiaW5uZXIgVG9zY2EgVHlwZSB1bmtub3duIDoge30iLCBpbm5lclRvc2NhVHlwZSk7CisJCQl9CisKKwkJfSBjYXRjaCAoSnNvblBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHBhcnNlIGpzb24gOiB7fS4ge30iLCB2YWx1ZSwgZSk7CisJCQlCZUVjb21wRXJyb3JNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9nQmVJbnZhbGlkSnNvbklucHV0KCJMaXN0IENvbnZlcnRlciIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodmFsdWUpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gY29udmVydENvbXBsZXhJbm5lclR5cGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLAorCQkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uID0gYWxsRGF0YVR5cGVzLmdldChpbm5lclR5cGUpOworCQlpZiAoZGF0YVR5cGVEZWZpbml0aW9uID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiQ2Fubm90IGZpbmQgZGF0YSB0eXBlIHt9IiwgaW5uZXJUeXBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZmFsc2UpOworCQl9CisKKwkJTGlzdDxKc29uRWxlbWVudD4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCXRyeSB7CisKKwkJCUpzb25BcnJheSBqbyA9IChKc29uQXJyYXkpIGpzb25QYXJzZXIucGFyc2UodmFsdWUpOworCQkJaW50IHNpemUgPSBqby5zaXplKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCUpzb25FbGVtZW50IGN1cnJlbnRWYWx1ZSA9IGpvLmdldChpKTsKKworCQkJCWlmIChjdXJyZW50VmFsdWUgIT0gbnVsbCkgeworCisJCQkJCVN0cmluZyBlbGVtZW50ID0gSnNvblV0aWxzLnRvU3RyaW5nKGN1cnJlbnRWYWx1ZSk7CisKKwkJCQkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGVBbmRVcGRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlcgorCQkJCQkJCS52YWxpZGF0ZUFuZFVwZGF0ZShlbGVtZW50LCBkYXRhVHlwZURlZmluaXRpb24sIGFsbERhdGFUeXBlcyk7CisJCQkJCWlmICh2YWxpZGF0ZUFuZFVwZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgeworCQkJCQkJbG9nLmRlYnVnKCJDYW5ub3QgcGFyc2UgdmFsdWUge30gZnJvbSB0eXBlIHt9IGluIGxpc3QgcG9zaXRpb24ge30iLCBjdXJyZW50VmFsdWUsIGlubmVyVHlwZSwgaSk7CisJCQkJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZhbHNlKTsKKwkJCQkJfQorCQkJCQlKc29uRWxlbWVudCBuZXdWYWx1ZSA9IHZhbGlkYXRlQW5kVXBkYXRlLmxlZnQ7CisJCQkJCW5ld0xpc3QuYWRkKG5ld1ZhbHVlKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBwYXJzZSB0aGUgdmFsdWUge30gb2YgbGlzdCBwYXJhbWV0ZXIuIiwgdmFsdWUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCX0KKwkJdmFsdWUgPSBnc29uLnRvSnNvbihuZXdMaXN0KTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbHVlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0xvd2VyQ2FzZUNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvTG93ZXJDYXNlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzYmUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL0xvd2VyQ2FzZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIExvd2VyQ2FzZUNvbnZlcnRlciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTG93ZXJDYXNlQ29udmVydGVyIGJvb2xlYW5Db252ZXJ0ZXIgPSBuZXcgTG93ZXJDYXNlQ29udmVydGVyKCk7CisKKwlwdWJsaWMgc3RhdGljIExvd2VyQ2FzZUNvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGJvb2xlYW5Db252ZXJ0ZXI7CisJfQorCisJcHJpdmF0ZSBMb3dlckNhc2VDb252ZXJ0ZXIoKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL01hcENvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvTWFwQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxYzZkMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL01hcENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuRGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5MaXN0VmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdzb25GYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkpzb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIE1hcENvbnZlcnRlciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgTWFwQ29udmVydGVyIG1hcENvbnZlcnRlciA9IG5ldyBNYXBDb252ZXJ0ZXIoKTsKKwlwcml2YXRlIHN0YXRpYyBHc29uIGdzb24gPSBHc29uRmFjdG9yeS5nZXRHc29uKCk7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpc3RWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworCURhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyIGRhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyID0gRGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKTsKKworCXByaXZhdGUgc3RhdGljIEpzb25QYXJzZXIganNvblBhcnNlciA9IG5ldyBKc29uUGFyc2VyKCk7CisKKwlwdWJsaWMgc3RhdGljIE1hcENvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG1hcENvbnZlcnRlcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCUVpdGhlcjxTdHJpbmcsIEJvb2xlYW4+IGNvbnZlcnRXaXRoRXJyb3JSZXN1bHQgPSB0aGlzLmNvbnZlcnRXaXRoRXJyb3JSZXN1bHQodmFsdWUsIGlubmVyVHlwZSwgZGF0YVR5cGVzKTsKKwkJaWYgKGNvbnZlcnRXaXRoRXJyb3JSZXN1bHQuaXNSaWdodCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXJldHVybiBjb252ZXJ0V2l0aEVycm9yUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCX0KKworCXB1YmxpYyBFaXRoZXI8U3RyaW5nLCBCb29sZWFuPiBjb252ZXJ0V2l0aEVycm9yUmVzdWx0KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwKKwkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisKKwkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gIiIgfHwgaW5uZXJUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBFaXRoZXIubGVmdCh2YWx1ZSk7CisJCX0KKworCQlQcm9wZXJ0eVZhbHVlQ29udmVydGVyIGlubmVyQ29udmVydGVyOworCQlQcm9wZXJ0eVZhbHVlQ29udmVydGVyIGtleUNvbnZlcnRlciA9IFRvc2NhUHJvcGVydHlUeXBlLlNUUklORy5nZXRDb252ZXJ0ZXIoKTsKKwkJVG9zY2FQcm9wZXJ0eVR5cGUgaW5uZXJUb3NjYVR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZShpbm5lclR5cGUpOworCisJCWlmIChpbm5lclRvc2NhVHlwZSAhPSBudWxsKSB7CisJCQlzd2l0Y2ggKGlubmVyVG9zY2FUeXBlKSB7CisJCQljYXNlIFNUUklORzoKKwkJCQlpbm5lckNvbnZlcnRlciA9IFRvc2NhUHJvcGVydHlUeXBlLlNUUklORy5nZXRDb252ZXJ0ZXIoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URUdFUjoKKwkJCQlpbm5lckNvbnZlcnRlciA9IFRvc2NhUHJvcGVydHlUeXBlLklOVEVHRVIuZ2V0Q29udmVydGVyKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMT0FUOgorCQkJCWlubmVyQ29udmVydGVyID0gVG9zY2FQcm9wZXJ0eVR5cGUuRkxPQVQuZ2V0Q29udmVydGVyKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEJPT0xFQU46CisJCQkJaW5uZXJDb252ZXJ0ZXIgPSBUb3NjYVByb3BlcnR5VHlwZS5CT09MRUFOLmdldENvbnZlcnRlcigpOworCQkJCWJyZWFrOworCQkJY2FzZSBKU09OOgorCQkJCWlubmVyQ29udmVydGVyID0gVG9zY2FQcm9wZXJ0eVR5cGUuSlNPTi5nZXRDb252ZXJ0ZXIoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbG9nLmRlYnVnKCJpbm5lciBUb3NjYSBUeXBlIGlzIHVua25vd24iKTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQodmFsdWUpOworCQkJfQorCisJCX0gZWxzZSB7CisKKwkJCWxvZy5kZWJ1ZygiaW5uZXIgVG9zY2EgVHlwZSB7fSBpYSBhIGNvbXBsZXggZGF0YSB0eXBlLiIsIGlubmVyVHlwZSk7CisKKwkJCUVpdGhlcjxTdHJpbmcsIEJvb2xlYW4+IHZhbGlkYXRlQ29tcGxleElubmVyVHlwZSA9IGNvbnZlcnRDb21wbGV4SW5uZXJUeXBlKHZhbHVlLCBpbm5lclR5cGUsIGtleUNvbnZlcnRlciwKKwkJCQkJZGF0YVR5cGVzKTsKKworCQkJcmV0dXJuIHZhbGlkYXRlQ29tcGxleElubmVyVHlwZTsKKworCQl9CisKKwkJdHJ5IHsKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gbmV3TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJCUpzb25FbGVtZW50IGpzb25PYmplY3QgPSBqc29uUGFyc2VyLnBhcnNlKHZhbHVlKTsKKwkJCUpzb25PYmplY3QgYXNKc29uT2JqZWN0ID0ganNvbk9iamVjdC5nZXRBc0pzb25PYmplY3QoKTsKKwkJCVNldDxFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50Pj4gZW50cnlTZXQgPSBhc0pzb25PYmplY3QuZW50cnlTZXQoKTsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4gZW50cnkgOiBlbnRyeVNldCkgeworCQkJCVN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlKc29uRWxlbWVudCBqc29uVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJa2V5ID0ga2V5Q29udmVydGVyLmNvbnZlcnQoZW50cnkuZ2V0S2V5KCksIG51bGwsIGRhdGFUeXBlcyk7CisKKwkJCQlTdHJpbmcgZWxlbWVudCA9IEpzb25VdGlscy50b1N0cmluZyhqc29uVmFsdWUpOworCisJCQkJU3RyaW5nIHZhbCA9IGlubmVyQ29udmVydGVyLmNvbnZlcnQoZWxlbWVudCwgbnVsbCwgZGF0YVR5cGVzKTsKKwkJCQluZXdNYXAucHV0KGtleSwgdmFsKTsKKwkJCX0KKworCQkJU3RyaW5nIG9ialZhbDsKKwkJCXN3aXRjaCAoaW5uZXJUb3NjYVR5cGUpIHsKKwkJCWNhc2UgU1RSSU5HOgorCQkJCXZhbHVlID0gZ3Nvbi50b0pzb24obmV3TWFwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URUdFUjoKKwkJCQlTdHJpbmcga2V5ID0gbnVsbDsKKwkJCQlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisJCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogbmV3TWFwLmVudHJ5U2V0KCkpIHsKKwkJCQkJb2JqVmFsID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJa2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJCWlmIChvYmpWYWwgIT0gbnVsbCkgeworCQkJCQkJaW50TWFwLnB1dChrZXksIEludGVnZXIudmFsdWVPZihvYmpWYWwudG9TdHJpbmcoKSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW50TWFwLnB1dChrZXksIG51bGwpOworCQkJCQl9CisKKwkJCQl9CisJCQkJdmFsdWUgPSBnc29uLnRvSnNvbihpbnRNYXApOworCQkJCWJyZWFrOworCQkJY2FzZSBGTE9BVDoKKwkJCQl2YWx1ZSA9ICJ7IjsKKwkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBuZXdNYXAuZW50cnlTZXQoKSkgeworCQkJCQlvYmpWYWwgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCQlpZiAob2JqVmFsID09IG51bGwpIHsKKwkJCQkJCW9ialZhbCA9ICJudWxsIjsKKwkJCQkJfQorCQkJCQlrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQkJdmFsdWUgKz0gIlwiIiArIGtleSArICJcIjoiICsgb2JqVmFsLnRvU3RyaW5nKCkgKyAiLCI7CisJCQkJfQorCQkJCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCgpIC0gMSk7CisJCQkJdmFsdWUgKz0gIn0iOworCQkJCWJyZWFrOworCQkJY2FzZSBCT09MRUFOOgorCQkJCU1hcDxTdHJpbmcsIEJvb2xlYW4+IGJvb2xNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7CisJCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogbmV3TWFwLmVudHJ5U2V0KCkpIHsKKwkJCQkJb2JqVmFsID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJa2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJCWlmIChvYmpWYWwgIT0gbnVsbCkgeworCQkJCQkJYm9vbE1hcC5wdXQoa2V5LCBCb29sZWFuLnZhbHVlT2Yob2JqVmFsLnRvU3RyaW5nKCkpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJvb2xNYXAucHV0KGtleSwgbnVsbCk7CisJCQkJCX0KKwkJCQl9CisJCQkJdmFsdWUgPSBnc29uLnRvSnNvbihib29sTWFwKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdmFsdWUgPSBnc29uLnRvSnNvbihuZXdNYXApOworCQkJCWxvZy5kZWJ1ZygiaW5uZXIgVG9zY2EgVHlwZSB1bmtub3duIDoge30iLCBpbm5lclRvc2NhVHlwZSk7CisJCQl9CisJCX0gY2F0Y2ggKEpzb25QYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBwYXJzZSBqc29uIDoge30uIHt9IiwgdmFsdWUsIGUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiTWFwIENvbnZlcnRlciIpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gRWl0aGVyLmxlZnQodmFsdWUpOworCisJfQorCisJLyoqCisJICogY29udmVydCB0aGUganNvbiB2YWx1ZSBvZiBtYXAgd2hlbiB0aGUgaW5uZXIgdHlwZSBpcyBhIGNvbXBsZXggZGF0YSB0eXBlCisJICogCisJICogQHBhcmFtIHZhbHVlCisJICogQHBhcmFtIGlubmVyVHlwZQorCSAqIEBwYXJhbSBrZXlDb252ZXJ0ZXIKKwkgKiBAcGFyYW0gYWxsRGF0YVR5cGVzCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gY29udmVydENvbXBsZXhJbm5lclR5cGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLAorCQkJUHJvcGVydHlWYWx1ZUNvbnZlcnRlciBrZXlDb252ZXJ0ZXIsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzKSB7CisKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGFsbERhdGFUeXBlcy5nZXQoaW5uZXJUeXBlKTsKKwkJaWYgKGRhdGFUeXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkNhbm5vdCBmaW5kIGRhdGEgdHlwZSB7fSIsIGlubmVyVHlwZSk7CisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZhbHNlKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIEpzb25FbGVtZW50PiBuZXdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpzb25FbGVtZW50PigpOworCisJCXRyeSB7CisKKwkJCUpzb25FbGVtZW50IGpzb25PYmplY3QgPSBqc29uUGFyc2VyLnBhcnNlKHZhbHVlKTsKKwkJCUpzb25PYmplY3QgYXNKc29uT2JqZWN0ID0ganNvbk9iamVjdC5nZXRBc0pzb25PYmplY3QoKTsKKwkJCVNldDxFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50Pj4gZW50cnlTZXQgPSBhc0pzb25PYmplY3QuZW50cnlTZXQoKTsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4gZW50cnkgOiBlbnRyeVNldCkgeworCQkJCVN0cmluZyBjdXJyZW50S2V5ID0ga2V5Q29udmVydGVyLmNvbnZlcnQoZW50cnkuZ2V0S2V5KCksIG51bGwsIGFsbERhdGFUeXBlcyk7CisKKwkJCQlKc29uRWxlbWVudCBjdXJyZW50VmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJaWYgKGN1cnJlbnRWYWx1ZSAhPSBudWxsKSB7CisKKwkJCQkJU3RyaW5nIGVsZW1lbnQgPSBKc29uVXRpbHMudG9TdHJpbmcoY3VycmVudFZhbHVlKTsKKworCQkJCQlJbW11dGFibGVQYWlyPEpzb25FbGVtZW50LCBCb29sZWFuPiB2YWxpZGF0ZUFuZFVwZGF0ZSA9IGRhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyCisJCQkJCQkJLnZhbGlkYXRlQW5kVXBkYXRlKGVsZW1lbnQsIGRhdGFUeXBlRGVmaW5pdGlvbiwgYWxsRGF0YVR5cGVzKTsKKwkJCQkJaWYgKHZhbGlkYXRlQW5kVXBkYXRlLnJpZ2h0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7CisJCQkJCQlsb2cuZGVidWcoIkNhbm5vdCBwYXJzZSB2YWx1ZSB7fSBmcm9tIHR5cGUge30gb2Yga2V5IHt9IiwgY3VycmVudFZhbHVlLCBpbm5lclR5cGUsIGN1cnJlbnRLZXkpOworCQkJCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCQkJCX0KKwkJCQkJSnNvbkVsZW1lbnQgbmV3VmFsdWUgPSB2YWxpZGF0ZUFuZFVwZGF0ZS5sZWZ0OworCQkJCQluZXdNYXAucHV0KGN1cnJlbnRLZXksIG5ld1ZhbHVlKTsKKwkJCQl9IGVsc2UgeworCQkJCQluZXdNYXAucHV0KGN1cnJlbnRLZXksIG51bGwpOworCQkJCX0KKwkJCX0KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJDYW5ub3QgcGFyc2UgdmFsdWUge30gb2YgbWFwIGZyb20gaW5uZXIgdHlwZSB7fSIsIHZhbHVlLCBpbm5lclR5cGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCX0KKworCQl2YWx1ZSA9IGdzb24udG9Kc29uKG5ld01hcCk7CisJCXJldHVybiBFaXRoZXIubGVmdCh2YWx1ZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Qcm9wZXJ0eVZhbHVlQ29udmVydGVyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Qcm9wZXJ0eVZhbHVlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0Nzg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Byb3BlcnR5VmFsdWVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWx1ZUNvbnZlcnRlciB7CisKKwlTdHJpbmcgY29udmVydChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvU3RyaW5nQ29udmVydG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9TdHJpbmdDb252ZXJ0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE3ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvU3RyaW5nQ29udmVydG9yLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKKworcHVibGljIGNsYXNzIFN0cmluZ0NvbnZlcnRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQ29udmVydG9yIHN0cmluZ0NvbnZlcnRlciA9IG5ldyBTdHJpbmdDb252ZXJ0b3IoKTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nQ29udmVydG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gc3RyaW5nQ29udmVydGVyOworCX0KKworCXByaXZhdGUgU3RyaW5nQ29udmVydG9yKCkgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyBvcmlnaW5hbCwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJaWYgKG9yaWdpbmFsID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVN0cmluZyBjb3ZlcnRlZCA9IFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKG9yaWdpbmFsKTsKKworCQkvLyBjb3ZlcnRlZCA9IFZhbGlkYXRpb25VdGlscy5jb252ZXJ0SHRtbFRhZ3NUb0VudGl0aWVzKGNvdmVydGVkKTsKKwkJY292ZXJ0ZWQgPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlV2hpdGVzcGFjZShjb3ZlcnRlZCk7CisJCWNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLnN0cmlwT2N0ZXRzKGNvdmVydGVkKTsKKwkJY292ZXJ0ZWQgPSBWYWxpZGF0aW9uVXRpbHMucmVtb3ZlSHRtbFRhZ3NPbmx5KGNvdmVydGVkKTsKKworCQlyZXR1cm4gY292ZXJ0ZWQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYUJvb2xlYW5Db252ZXJ0ZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhQm9vbGVhbkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzQxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYUJvb2xlYW5Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBUb3NjYUJvb2xlYW5Db252ZXJ0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIFRvc2NhQm9vbGVhbkNvbnZlcnRlciBib29sZWFuQ29udmVydGVyID0gbmV3IFRvc2NhQm9vbGVhbkNvbnZlcnRlcigpOworCisJcHVibGljIHN0YXRpYyBUb3NjYUJvb2xlYW5Db252ZXJ0ZXIgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBib29sZWFuQ29udmVydGVyOworCX0KKworCXByaXZhdGUgVG9zY2FCb29sZWFuQ29udmVydGVyKCkgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm9uIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgieWVzIikKKwkJCQl8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ5IikpIHsKKwkJCXJldHVybiAidHJ1ZSI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gImZhbHNlIjsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FGbG9hdENvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FGbG9hdENvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkN2Y5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYUZsb2F0Q29udmVydGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgVG9zY2FGbG9hdENvbnZlcnRlciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVDb252ZXJ0ZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgVG9zY2FGbG9hdENvbnZlcnRlciBudW1iZXJDb252ZXJ0ZXIgPSBuZXcgVG9zY2FGbG9hdENvbnZlcnRlcigpOworCisJcHVibGljIHN0YXRpYyBUb3NjYUZsb2F0Q29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gbnVtYmVyQ29udmVydGVyOworCX0KKworCXByaXZhdGUgVG9zY2FGbG9hdENvbnZlcnRlcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydChTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCWlmIChvcmlnaW5hbCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAob3JpZ2luYWwuY29udGFpbnMoImYiKSB8fCBvcmlnaW5hbC5jb250YWlucygiRiIpKQorCQkJb3JpZ2luYWwgPSBvcmlnaW5hbC50b0xvd2VyQ2FzZSgpLnJlcGxhY2VGaXJzdCgiZiIsICIiKTsKKwkJcmV0dXJuIG5ldyBCaWdEZWNpbWFsKG9yaWdpbmFsKS50b1BsYWluU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYUpzb25WYWx1ZUNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FKc29uVmFsdWVDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzAwODhlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FKc29uVmFsdWVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uUmVhZGVyOworCitwdWJsaWMgY2xhc3MgVG9zY2FKc29uVmFsdWVDb252ZXJ0ZXIgZXh0ZW5kcyBUb3NjYVZhbHVlQmFzZUNvbnZlcnRlciBpbXBsZW1lbnRzIFRvc2NhVmFsdWVDb252ZXJ0ZXIgeworCXByaXZhdGUgc3RhdGljIFRvc2NhSnNvblZhbHVlQ29udmVydGVyIHRvc2NhSnNvbkNvbnZlcnRlciA9IG5ldyBUb3NjYUpzb25WYWx1ZUNvbnZlcnRlcigpOworCisJcHVibGljIHN0YXRpYyBUb3NjYUpzb25WYWx1ZUNvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIHRvc2NhSnNvbkNvbnZlcnRlcjsKKwl9CisKKwlwcml2YXRlIFRvc2NhSnNvblZhbHVlQ29udmVydGVyKCkgeworCisJfQorCisJSnNvblBhcnNlciBqc29uUGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29udmVydFRvVG9zY2FWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHZhbHVlKTsKKwkJSnNvblJlYWRlciBqc29uUmVhZGVyID0gbmV3IEpzb25SZWFkZXIocmVhZGVyKTsKKwkJanNvblJlYWRlci5zZXRMZW5pZW50KHRydWUpOworCQlKc29uRWxlbWVudCBqc29uRWxlbWVudCA9IGpzb25QYXJzZXIucGFyc2UoanNvblJlYWRlcik7CisJCWlmIChqc29uRWxlbWVudC5pc0pzb25QcmltaXRpdmUoKSkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJCXJldHVybiBoYW5kbGVDb21wbGV4SnNvblZhbHVlKGpzb25FbGVtZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYUxpc3RWYWx1ZUNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FMaXN0VmFsdWVDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM0NDZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FMaXN0VmFsdWVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVByb3BlcnR5VHlwZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25SZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBUb3NjYUxpc3RWYWx1ZUNvbnZlcnRlciBleHRlbmRzIFRvc2NhVmFsdWVCYXNlQ29udmVydGVyIGltcGxlbWVudHMgVG9zY2FWYWx1ZUNvbnZlcnRlciB7CisJcHJpdmF0ZSBzdGF0aWMgVG9zY2FMaXN0VmFsdWVDb252ZXJ0ZXIgbGlzdENvbnZlcnRlciA9IG5ldyBUb3NjYUxpc3RWYWx1ZUNvbnZlcnRlcigpOworCXByaXZhdGUgSnNvblBhcnNlciBqc29uUGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVG9zY2FMaXN0VmFsdWVDb252ZXJ0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgVG9zY2FMaXN0VmFsdWVDb252ZXJ0ZXIgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBsaXN0Q29udmVydGVyOworCX0KKworCXByaXZhdGUgVG9zY2FMaXN0VmFsdWVDb252ZXJ0ZXIoKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUb1Rvc2NhVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJdHJ5IHsKKwkJCVRvc2NhUHJvcGVydHlUeXBlIGlubmVyVG9zY2FUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUoaW5uZXJUeXBlKTsKKwkJCVRvc2NhVmFsdWVDb252ZXJ0ZXIgaW5uZXJDb252ZXJ0ZXIgPSBudWxsOworCQkJYm9vbGVhbiBpc1NjYWxhciA9IHRydWU7CisJCQlpZiAoaW5uZXJUb3NjYVR5cGUgIT0gbnVsbCkgeworCQkJCWlubmVyQ29udmVydGVyID0gaW5uZXJUb3NjYVR5cGUuZ2V0VmFsdWVDb252ZXJ0ZXIoKTsKKwkJCX0gZWxzZSB7CisJCQkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGRhdGFUeXBlcy5nZXQoaW5uZXJUeXBlKTsKKworCQkJCWlmIChkYXRhVHlwZURlZmluaXRpb24gIT0gbnVsbCkgeworCQkJCQlUb3NjYVByb3BlcnR5VHlwZSB0b3NjYVByb3BlcnR5VHlwZSA9IG51bGw7CisJCQkJCWlmICgodG9zY2FQcm9wZXJ0eVR5cGUgPSBpc1NjYWxhclR5cGUoZGF0YVR5cGVEZWZpbml0aW9uKSkgIT0gbnVsbCkgeworCQkJCQkJaW5uZXJDb252ZXJ0ZXIgPSB0b3NjYVByb3BlcnR5VHlwZS5nZXRWYWx1ZUNvbnZlcnRlcigpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaXNTY2FsYXIgPSBmYWxzZTsKKwkJCQkJCWlubmVyQ29udmVydGVyID0gVG9zY2FNYXBWYWx1ZUNvbnZlcnRlci5nZXRJbnN0YW5jZSgpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbG9nLmRlYnVnKCJpbm5lciBUb3NjYSBUeXBlIGlzIG51bGwiKTsKKwkJCQkJcmV0dXJuIHZhbHVlOworCQkJCX0KKwkJCX0KKwkJCUpzb25FbGVtZW50IGpzb25FbGVtZW50ID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIodmFsdWUpOworCQkJCUpzb25SZWFkZXIganNvblJlYWRlciA9IG5ldyBKc29uUmVhZGVyKHJlYWRlcik7CisJCQkJanNvblJlYWRlci5zZXRMZW5pZW50KHRydWUpOworCisJCQkJanNvbkVsZW1lbnQgPSBqc29uUGFyc2VyLnBhcnNlKGpzb25SZWFkZXIpOworCQkJfSBjYXRjaCAoSnNvblN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQkJbG9nLmRlYnVnKCJjb252ZXJ0VG9Ub3NjYVZhbHVlIGZhaWxlZCB0byBwYXJzZSBqc29uIHZhbHVlIDoiLCBlKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmIChqc29uRWxlbWVudCA9PSBudWxsIHx8IHRydWUgPT0ganNvbkVsZW1lbnQuaXNKc29uTnVsbCgpKSB7CisJCQkJbG9nLmRlYnVnKCJjb252ZXJ0VG9Ub3NjYVZhbHVlIGpzb24gZWxlbWVudCBpcyBudWxsIik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlpZiAoanNvbkVsZW1lbnQuaXNKc29uQXJyYXkoKSA9PSBmYWxzZSkgeworCQkJCS8vIGdldF9pbnB1dCBhbGwgYXJyYXkgbGlrZSBnZXRfaW5wdXQ6IHFyb3V0ZXJfbmFtZXMKKwkJCQlyZXR1cm4gaGFuZGxlQ29tcGxleEpzb25WYWx1ZShqc29uRWxlbWVudCk7CisJCQl9CisJCQlKc29uQXJyYXkgYXNKc29uQXJyYXkgPSBqc29uRWxlbWVudC5nZXRBc0pzb25BcnJheSgpOworCisJCQlBcnJheUxpc3Q8T2JqZWN0PiB0b3NjYUxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKwkJCWZpbmFsIGJvb2xlYW4gaXNTY2FsYXJGID0gaXNTY2FsYXI7CisJCQlmaW5hbCBUb3NjYVZhbHVlQ29udmVydGVyIGlubmVyQ29udmVydGVyRmluYWwgPSBpbm5lckNvbnZlcnRlcjsKKwkJCWFzSnNvbkFycmF5LmZvckVhY2goZSAtPiB7CisJCQkJT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKKwkJCQlpZiAoaXNTY2FsYXJGKSB7CisJCQkJCWxvZy5kZWJ1ZygidHJ5IHRvIGNvbnZlcnQgc2NhbGFyIHZhbHVlIHt9IiwgZS5nZXRBc1N0cmluZygpKTsKKwkJCQkJaWYgKGUuZ2V0QXNTdHJpbmcoKSA9PSBudWxsKSB7CisJCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IG51bGw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlKc29uRWxlbWVudCBzaW5nbGVFbGVtZW50ID0ganNvblBhcnNlci5wYXJzZShlLmdldEFzU3RyaW5nKCkpOworCQkJCQkJaWYgKHNpbmdsZUVsZW1lbnQuaXNKc29uUHJpbWl0aXZlKCkpIHsKKwkJCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGlubmVyQ29udmVydGVyRmluYWwuY29udmVydFRvVG9zY2FWYWx1ZShlLmdldEFzU3RyaW5nKCksIGlubmVyVHlwZSwKKwkJCQkJCQkJCWRhdGFUeXBlcyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvbnZlcnRlZFZhbHVlID0gaGFuZGxlQ29tcGxleEpzb25WYWx1ZShzaW5nbGVFbGVtZW50KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCUpzb25PYmplY3QgYXNKc29uT2JqZWN0ID0gZS5nZXRBc0pzb25PYmplY3QoKTsKKwkJCQkJU2V0PEVudHJ5PFN0cmluZywgSnNvbkVsZW1lbnQ+PiBlbnRyeVNldCA9IGFzSnNvbk9iamVjdC5lbnRyeVNldCgpOworCisJCQkJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBkYXRhVHlwZXMuZ2V0KGlubmVyVHlwZSk7CisJCQkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gYWxsUHJvcGVydGllcyA9IGdldEFsbFByb3BlcnRpZXMoZGF0YVR5cGVEZWZpbml0aW9uKTsKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiB0b3NjYU9iamVjdFByZXNlbnRhdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCQkJLy8gbG9nLmRlYnVnKCJ0cnkgdG8gY29udmVydCBkYXRhdHlwZSB2YWx1ZSB7fSIsCisJCQkJCS8vIGUuZ2V0QXNTdHJpbmcoKSk7CisKKwkJCQkJZm9yIChFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50PiBlbnRyeSA6IGVudHJ5U2V0KSB7CisJCQkJCQlTdHJpbmcgcHJvcE5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKworCQkJCQkJSnNvbkVsZW1lbnQgZWxlbWVudFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQkJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBhbGxQcm9wZXJ0aWVzLmdldChwcm9wTmFtZSk7CisJCQkJCQlpZiAocHJvcGVydHlEZWZpbml0aW9uID09IG51bGwpIHsKKwkJCQkJCQlsb2cuZGVidWcoIlRoZSBwcm9wZXJ0eSB7fSB3YXMgbm90IGZvdW5kIHVuZGVyIGRhdGEgdHlwZSB7fSIsIHByb3BOYW1lLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCQkvLyByZXR1cm4gbnVsbDsKKwkJCQkJCX0KKwkJCQkJCVN0cmluZyB0eXBlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFR5cGUoKTsKKwkJCQkJCVRvc2NhUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKHR5cGUpOworCQkJCQkJT2JqZWN0IGNvbnZWYWx1ZTsKKwkJCQkJCWlmIChwcm9wZXJ0eVR5cGUgIT0gbnVsbCkgeworCQkJCQkJCWlmIChlbGVtZW50VmFsdWUuaXNKc29uUHJpbWl0aXZlKCkpIHsKKwkJCQkJCQkJVG9zY2FWYWx1ZUNvbnZlcnRlciB2YWx1ZUNvbnZlcnRlciA9IHByb3BlcnR5VHlwZS5nZXRWYWx1ZUNvbnZlcnRlcigpOworCQkJCQkJCQljb252VmFsdWUgPSB2YWx1ZUNvbnZlcnRlci5jb252ZXJ0VG9Ub3NjYVZhbHVlKGVsZW1lbnRWYWx1ZS5nZXRBc1N0cmluZygpLCB0eXBlLAorCQkJCQkJCQkJCWRhdGFUeXBlcyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKFRvc2NhUHJvcGVydHlUeXBlLk1BUC5lcXVhbHModHlwZSkgfHwgVG9zY2FQcm9wZXJ0eVR5cGUuTElTVC5lcXVhbHMocHJvcGVydHlUeXBlKSkgeworCQkJCQkJCQkJVG9zY2FWYWx1ZUNvbnZlcnRlciB2YWx1ZUNvbnZlcnRlciA9IHByb3BlcnR5VHlwZS5nZXRWYWx1ZUNvbnZlcnRlcigpOworCQkJCQkJCQkJU3RyaW5nIGpzb24gPSBnc29uLnRvSnNvbihlbGVtZW50VmFsdWUpOworCQkJCQkJCQkJU3RyaW5nIGlubmVyVHlwZVJlY3Vyc2l2ZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLmdldFR5cGUoKTsKKwkJCQkJCQkJCWNvbnZWYWx1ZSA9IHZhbHVlQ29udmVydGVyLmNvbnZlcnRUb1Rvc2NhVmFsdWUoanNvbiwgaW5uZXJUeXBlUmVjdXJzaXZlLCBkYXRhVHlwZXMpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJY29udlZhbHVlID0gaGFuZGxlQ29tcGxleEpzb25WYWx1ZShlbGVtZW50VmFsdWUpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlTdHJpbmcganNvbiA9IGdzb24udG9Kc29uKGVsZW1lbnRWYWx1ZSk7CisJCQkJCQkJY29udlZhbHVlID0gY29udmVydFRvVG9zY2FWYWx1ZShqc29uLCB0eXBlLCBkYXRhVHlwZXMpOworCQkJCQkJfQorCQkJCQkJdG9zY2FPYmplY3RQcmVzZW50YXRpb24ucHV0KHByb3BOYW1lLCBjb252VmFsdWUpOworCQkJCQl9CisJCQkJCWNvbnZlcnRlZFZhbHVlID0gdG9zY2FPYmplY3RQcmVzZW50YXRpb247CisJCQkJfQorCQkJCXRvc2NhTGlzdC5hZGQoY29udmVydGVkVmFsdWUpOworCQkJfSk7CisJCQlyZXR1cm4gdG9zY2FMaXN0OworCQl9IGNhdGNoICgKKworCQlKc29uUGFyc2VFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcGFyc2UganNvbiA6IHt9LiB7fSIsIHZhbHVlLCBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRKc29uSW5wdXQoIkxpc3QgQ29udmVydGVyIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FNYXBWYWx1ZUNvbnZlcnRlci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FNYXBWYWx1ZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYU1hcFZhbHVlQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzOworCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25SZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBUb3NjYU1hcFZhbHVlQ29udmVydGVyIGV4dGVuZHMgVG9zY2FWYWx1ZUJhc2VDb252ZXJ0ZXIgaW1wbGVtZW50cyBUb3NjYVZhbHVlQ29udmVydGVyIHsKKwlwcml2YXRlIHN0YXRpYyBUb3NjYU1hcFZhbHVlQ29udmVydGVyIG1hcENvbnZlcnRlciA9IG5ldyBUb3NjYU1hcFZhbHVlQ29udmVydGVyKCk7CisKKwlwcml2YXRlIEpzb25QYXJzZXIganNvblBhcnNlciA9IG5ldyBKc29uUGFyc2VyKCk7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRvc2NhTWFwVmFsdWVDb252ZXJ0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgVG9zY2FNYXBWYWx1ZUNvbnZlcnRlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG1hcENvbnZlcnRlcjsKKwl9CisKKwlwcml2YXRlIFRvc2NhTWFwVmFsdWVDb252ZXJ0ZXIoKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRUb1Rvc2NhVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJCXRyeSB7CisJCQlUb3NjYVByb3BlcnR5VHlwZSBpbm5lclRvc2NhVHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKGlubmVyVHlwZSk7CisJCQlUb3NjYVZhbHVlQ29udmVydGVyIGlubmVyQ29udmVydGVyID0gbnVsbDsKKwkJCWJvb2xlYW4gaXNTY2FsYXIgPSB0cnVlOworCQkJaWYgKGlubmVyVG9zY2FUeXBlICE9IG51bGwpIHsKKwkJCQlpbm5lckNvbnZlcnRlciA9IGlubmVyVG9zY2FUeXBlLmdldFZhbHVlQ29udmVydGVyKCk7CisJCQl9IGVsc2UgeworCisJCQkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGRhdGFUeXBlcy5nZXQoaW5uZXJUeXBlKTsKKwkJCQlpZiAoZGF0YVR5cGVEZWZpbml0aW9uICE9IG51bGwpIHsKKwkJCQkJVG9zY2FQcm9wZXJ0eVR5cGUgdG9zY2FQcm9wZXJ0eVR5cGUgPSBudWxsOworCQkJCQlpZiAoKHRvc2NhUHJvcGVydHlUeXBlID0gaXNTY2FsYXJUeXBlKGRhdGFUeXBlRGVmaW5pdGlvbikpICE9IG51bGwpIHsKKwkJCQkJCWlubmVyQ29udmVydGVyID0gdG9zY2FQcm9wZXJ0eVR5cGUuZ2V0VmFsdWVDb252ZXJ0ZXIoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlzU2NhbGFyID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBUT0RPIGhhbmRsZSBnZXRpbnB1dAorCQkJCQlsb2cuZGVidWcoImlubmVyIFRvc2NhIFR5cGUgaXMgbnVsbCIpOworCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJfQorCisJCQl9CisJCQlKc29uRWxlbWVudCBqc29uRWxlbWVudCA9IG51bGw7CisJCQl0cnkgeworCQkJCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHZhbHVlKTsKKwkJCQlKc29uUmVhZGVyIGpzb25SZWFkZXIgPSBuZXcgSnNvblJlYWRlcihyZWFkZXIpOworCQkJCWpzb25SZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKworCQkJCWpzb25FbGVtZW50ID0ganNvblBhcnNlci5wYXJzZShqc29uUmVhZGVyKTsKKworCQkJfSBjYXRjaCAoSnNvblN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQkJbG9nLmRlYnVnKCJjb252ZXJ0VG9Ub3NjYVZhbHVlIGZhaWxlZCB0byBwYXJzZSBqc29uIHZhbHVlIDoiLCBlKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmIChqc29uRWxlbWVudCA9PSBudWxsIHx8IHRydWUgPT0ganNvbkVsZW1lbnQuaXNKc29uTnVsbCgpKSB7CisJCQkJbG9nLmRlYnVnKCJjb252ZXJ0VG9Ub3NjYVZhbHVlIGpzb24gZWxlbWVudCBpcyBudWxsIik7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlKc29uT2JqZWN0IGFzSnNvbk9iamVjdCA9IGpzb25FbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQkJU2V0PEVudHJ5PFN0cmluZywgSnNvbkVsZW1lbnQ+PiBlbnRyeVNldCA9IGFzSnNvbk9iamVjdC5lbnRyeVNldCgpOworCisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQkJZmluYWwgYm9vbGVhbiBpc1NjYWxhckYgPSBpc1NjYWxhcjsKKwkJCWZpbmFsIFRvc2NhVmFsdWVDb252ZXJ0ZXIgaW5uZXJDb252ZXJ0ZXJGaW5hbCA9IGlubmVyQ29udmVydGVyOworCQkJZW50cnlTZXQuZm9yRWFjaChlIC0+IHsKKwkJCQlsb2cuZGVidWcoInRyeSBjb252ZXJ0IGVsZW1lbnQge30iLCBlLmdldFZhbHVlKCkpOworCQkJCU9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnREYXRhVHlwZVRvVG9zY2FNYXAoaW5uZXJUeXBlLCBkYXRhVHlwZXMsIGlubmVyQ29udmVydGVyRmluYWwsIGlzU2NhbGFyRiwKKwkJCQkJCWUuZ2V0VmFsdWUoKSk7CisJCQkJdG9zY2FNYXAucHV0KGUuZ2V0S2V5KCksIGNvbnZlcnRlZFZhbHVlKTsKKwkJCX0pOworCQkJcmV0dXJuIHRvc2NhTWFwOworCQl9IGNhdGNoIChKc29uUGFyc2VFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcGFyc2UganNvbiA6IHt9LiB7fSIsIHZhbHVlLCBlKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dCZUludmFsaWRKc29uSW5wdXQoIkxpc3QgQ29udmVydGVyIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBPYmplY3QgY29udmVydERhdGFUeXBlVG9Ub3NjYU1hcChTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcywKKwkJCVRvc2NhVmFsdWVDb252ZXJ0ZXIgaW5uZXJDb252ZXJ0ZXIsIGZpbmFsIGJvb2xlYW4gaXNTY2FsYXJGLCBKc29uRWxlbWVudCBlbnRyeVZhbHVlKSB7CisJCU9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7CisJCWlmIChpc1NjYWxhckYgJiYgZW50cnlWYWx1ZS5pc0pzb25QcmltaXRpdmUoKSkgeworCQkJbG9nLmRlYnVnKCJ0cnkgY29udmVydCBzY2FsYXIgdmFsdWUge30iLCBlbnRyeVZhbHVlLmdldEFzU3RyaW5nKCkpOworCQkJaWYgKGVudHJ5VmFsdWUuZ2V0QXNTdHJpbmcoKSA9PSBudWxsKSB7CisJCQkJY29udmVydGVkVmFsdWUgPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQljb252ZXJ0ZWRWYWx1ZSA9IGlubmVyQ29udmVydGVyLmNvbnZlcnRUb1Rvc2NhVmFsdWUoZW50cnlWYWx1ZS5nZXRBc1N0cmluZygpLCBpbm5lclR5cGUsIGRhdGFUeXBlcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlKc29uT2JqZWN0IGFzSnNvbk9iamVjdEluID0gZW50cnlWYWx1ZS5nZXRBc0pzb25PYmplY3QoKTsKKwkJCVNldDxFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50Pj4gZW50cnlTZXRJbiA9IGFzSnNvbk9iamVjdEluLmVudHJ5U2V0KCk7CisKKwkJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBkYXRhVHlwZXMuZ2V0KGlubmVyVHlwZSk7CisJCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGFsbFByb3BlcnRpZXMgPSBnZXRBbGxQcm9wZXJ0aWVzKGRhdGFUeXBlRGVmaW5pdGlvbik7CisJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhT2JqZWN0UHJlc2VudGF0aW9uID0gbmV3IEhhc2hNYXA8PigpOworCisJCQlmb3IgKEVudHJ5PFN0cmluZywgSnNvbkVsZW1lbnQ+IGVudHJ5IDogZW50cnlTZXRJbikgeworCQkJCVN0cmluZyBwcm9wTmFtZSA9IGVudHJ5LmdldEtleSgpOworCisJCQkJSnNvbkVsZW1lbnQgZWxlbWVudFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlPYmplY3QgY29udlZhbHVlOworCQkJCWlmIChpc1NjYWxhckYgPT0gZmFsc2UpIHsKKwkJCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IGFsbFByb3BlcnRpZXMuZ2V0KHByb3BOYW1lKTsKKwkJCQkJaWYgKHByb3BlcnR5RGVmaW5pdGlvbiA9PSBudWxsICYmIGlzU2NhbGFyRikgeworCQkJCQkJbG9nLmRlYnVnKCJUaGUgcHJvcGVydHkge30gd2FzIG5vdCBmb3VuZCB1bmRlciBkYXRhIHR5cGUge30iLCBwcm9wTmFtZSwgZGF0YVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCVN0cmluZyB0eXBlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFR5cGUoKTsKKwkJCQkJVG9zY2FQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUodHlwZSk7CisJCQkJCWlmIChwcm9wZXJ0eVR5cGUgIT0gbnVsbCkgeworCQkJCQkJaWYgKGVsZW1lbnRWYWx1ZS5pc0pzb25QcmltaXRpdmUoKSkgeworCQkJCQkJCVRvc2NhVmFsdWVDb252ZXJ0ZXIgdmFsdWVDb252ZXJ0ZXIgPSBwcm9wZXJ0eVR5cGUuZ2V0VmFsdWVDb252ZXJ0ZXIoKTsKKwkJCQkJCQljb252VmFsdWUgPSB2YWx1ZUNvbnZlcnRlci5jb252ZXJ0VG9Ub3NjYVZhbHVlKGVsZW1lbnRWYWx1ZS5nZXRBc1N0cmluZygpLCB0eXBlLCBkYXRhVHlwZXMpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoVG9zY2FQcm9wZXJ0eVR5cGUuTUFQLmVxdWFscyh0eXBlKSB8fCBUb3NjYVByb3BlcnR5VHlwZS5MSVNULmVxdWFscyhwcm9wZXJ0eVR5cGUpKSB7CisJCQkJCQkJCVRvc2NhVmFsdWVDb252ZXJ0ZXIgdmFsdWVDb252ZXJ0ZXIgPSBwcm9wZXJ0eVR5cGUuZ2V0VmFsdWVDb252ZXJ0ZXIoKTsKKwkJCQkJCQkJU3RyaW5nIGpzb24gPSBnc29uLnRvSnNvbihlbGVtZW50VmFsdWUpOworCQkJCQkJCQlTdHJpbmcgaW5uZXJUeXBlUmVjdXJzaXZlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpOworCQkJCQkJCQljb252VmFsdWUgPSB2YWx1ZUNvbnZlcnRlci5jb252ZXJ0VG9Ub3NjYVZhbHVlKGpzb24sIGlubmVyVHlwZVJlY3Vyc2l2ZSwgZGF0YVR5cGVzKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQljb252VmFsdWUgPSBoYW5kbGVDb21wbGV4SnNvblZhbHVlKGVsZW1lbnRWYWx1ZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJY29udlZhbHVlID0gY29udmVydFRvVG9zY2FWYWx1ZShlbGVtZW50VmFsdWUuZ2V0QXNTdHJpbmcoKSwgdHlwZSwgZGF0YVR5cGVzKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChlbGVtZW50VmFsdWUuaXNKc29uUHJpbWl0aXZlKCkpIHsKKwkJCQkJCWNvbnZWYWx1ZSA9IGpzb24ySmF2YVByaW1pdGl2ZShlbGVtZW50VmFsdWUuZ2V0QXNKc29uUHJpbWl0aXZlKCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29udlZhbHVlID0gaGFuZGxlQ29tcGxleEpzb25WYWx1ZShlbGVtZW50VmFsdWUpOworCQkJCQl9CisJCQkJfQorCQkJCXRvc2NhT2JqZWN0UHJlc2VudGF0aW9uLnB1dChwcm9wTmFtZSwgY29udlZhbHVlKTsKKwkJCX0KKwkJCWNvbnZlcnRlZFZhbHVlID0gdG9zY2FPYmplY3RQcmVzZW50YXRpb247CisJCX0KKwkJcmV0dXJuIGNvbnZlcnRlZFZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FTdHJpbmdDb252ZXJ0b3IuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhU3RyaW5nQ29udmVydG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyOGQyNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhU3RyaW5nQ29udmVydG9yLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgVG9zY2FTdHJpbmdDb252ZXJ0b3IgaW1wbGVtZW50cyBUb3NjYVZhbHVlQ29udmVydGVyIHsKKwlwcml2YXRlIHN0YXRpYyBUb3NjYVN0cmluZ0NvbnZlcnRvciBzdHJpbmdDb252ZXJ0ZXIgPSBuZXcgVG9zY2FTdHJpbmdDb252ZXJ0b3IoKTsKKworCXB1YmxpYyBzdGF0aWMgVG9zY2FTdHJpbmdDb252ZXJ0b3IgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBzdHJpbmdDb252ZXJ0ZXI7CisJfQorCisJcHJpdmF0ZSBUb3NjYVN0cmluZ0NvbnZlcnRvcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY29udmVydFRvVG9zY2FWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhVmFsdWVCYXNlQ29udmVydGVyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYVZhbHVlQmFzZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODYzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvY29udmVydGVycy9Ub3NjYVZhbHVlQmFzZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVByb3BlcnR5VHlwZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QcmltaXRpdmU7CisKK3B1YmxpYyBjbGFzcyBUb3NjYVZhbHVlQmFzZUNvbnZlcnRlciB7CisJcHJvdGVjdGVkIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRvc2NhVmFsdWVCYXNlQ29udmVydGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBnZXRBbGxQcm9wZXJ0aWVzKERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24pIHsKKworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGFsbFBhcmVudHNQcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQl3aGlsZSAoZGF0YVR5cGVEZWZpbml0aW9uICE9IG51bGwpIHsKKworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IGN1cnJlbnRQYXJlbnRzUHJvcHMgPSBkYXRhVHlwZURlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCQkJaWYgKGN1cnJlbnRQYXJlbnRzUHJvcHMgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRQYXJlbnRzUHJvcHMuc3RyZWFtKCkuZm9yRWFjaChwIC0+IGFsbFBhcmVudHNQcm9wcy5wdXQocC5nZXROYW1lKCksIHApKTsKKwkJCX0KKworCQkJZGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YVR5cGVEZWZpbml0aW9uLmdldERlcml2ZWRGcm9tKCk7CisJCX0KKworCQlyZXR1cm4gYWxsUGFyZW50c1Byb3BzOworCX0KKworCXB1YmxpYyBUb3NjYVByb3BlcnR5VHlwZSBpc1NjYWxhclR5cGUoRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmKSB7CisKKwkJVG9zY2FQcm9wZXJ0eVR5cGUgcmVzdWx0ID0gbnVsbDsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGUgPSBkYXRhVHlwZURlZjsKKworCQl3aGlsZSAoZGF0YVR5cGUgIT0gbnVsbCkgeworCisJCQlTdHJpbmcgbmFtZSA9IGRhdGFUeXBlLmdldE5hbWUoKTsKKwkJCVRvc2NhUHJvcGVydHlUeXBlIHR5cGVJZlNjYWxhciA9IFRvc2NhUHJvcGVydHlUeXBlLmdldFR5cGVJZlNjYWxhcihuYW1lKTsKKwkJCWlmICh0eXBlSWZTY2FsYXIgIT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IHR5cGVJZlNjYWxhcjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGF0YVR5cGUgPSBkYXRhVHlwZS5nZXREZXJpdmVkRnJvbSgpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGhhbmRsZUNvbXBsZXhKc29uVmFsdWUoSnNvbkVsZW1lbnQgZWxlbWVudFZhbHVlKSB7CisJCU9iamVjdCBqc29uVmFsdWUgPSBudWxsOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJaWYgKCBlbGVtZW50VmFsdWUuaXNKc29uT2JqZWN0KCkgKXsKKwkJCUpzb25PYmplY3QganNvbk9iID0gZWxlbWVudFZhbHVlLmdldEFzSnNvbk9iamVjdCgpOworCQkJU2V0PEVudHJ5PFN0cmluZywgSnNvbkVsZW1lbnQ+PiBlbnRyeVNldCA9IGpzb25PYi5lbnRyeVNldCgpOworCQkJSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4+IGl0ZXJhdG9yRW50cnkgPSBlbnRyeVNldC5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yRW50cnkuaGFzTmV4dCgpKSB7CisJCQkJRW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4gZW50cnkgPSBpdGVyYXRvckVudHJ5Lm5leHQoKTsKKwkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKS5pc0pzb25BcnJheSgpKSB7CisJCQkJCUxpc3Q8T2JqZWN0PiBhcnJheSA9IGhhbmRsZUpzb25BcnJheShlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCQkJdmFsdWUucHV0KGVudHJ5LmdldEtleSgpLCBhcnJheSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJT2JqZWN0IG9iamVjdDsKKwkJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkuaXNKc29uUHJpbWl0aXZlKCkpIHsKKwkJCQkJCW9iamVjdCA9IGpzb24ySmF2YVByaW1pdGl2ZShlbnRyeS5nZXRWYWx1ZSgpLmdldEFzSnNvblByaW1pdGl2ZSgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW9iamVjdCA9IGhhbmRsZUNvbXBsZXhKc29uVmFsdWUoZW50cnkuZ2V0VmFsdWUoKSk7CisJCQkJCX0KKwkJCQkJdmFsdWUucHV0KGVudHJ5LmdldEtleSgpLCBvYmplY3QpOworCQkJCX0KKwkJCX0KKwkJCWpzb25WYWx1ZSA9IHZhbHVlOworCQl9ZWxzZXsKKwkJCWlmICggZWxlbWVudFZhbHVlLmlzSnNvbkFycmF5KCkgKXsKKwkJCQlqc29uVmFsdWUgPSBoYW5kbGVKc29uQXJyYXkoZWxlbWVudFZhbHVlKTsKKwkJCX1lbHNleworCQkJCWxvZy5kZWJ1Zygibm90IHN1cHBvcnRlZCBqc29uIHR5cGUge30gIixlbGVtZW50VmFsdWUpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4ganNvblZhbHVlOworCX0KKworCXByaXZhdGUgTGlzdDxPYmplY3Q+IGhhbmRsZUpzb25BcnJheShKc29uRWxlbWVudCBlbnRyeSkgeworCQlMaXN0PE9iamVjdD4gYXJyYXkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJSnNvbkFycmF5IGpzb25BcnJheSA9IGVudHJ5LmdldEFzSnNvbkFycmF5KCk7CisJCUl0ZXJhdG9yPEpzb25FbGVtZW50PiBpdGVyYXRvciA9IGpzb25BcnJheS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlPYmplY3Qgb2JqZWN0OworCQkJSnNvbkVsZW1lbnQgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChlbGVtZW50LmlzSnNvblByaW1pdGl2ZSgpKSB7CisJCQkJb2JqZWN0ID0ganNvbjJKYXZhUHJpbWl0aXZlKGVsZW1lbnQuZ2V0QXNKc29uUHJpbWl0aXZlKCkpOworCQkJfSBlbHNlIHsKKwkJCQlvYmplY3QgPSBoYW5kbGVDb21wbGV4SnNvblZhbHVlKGVsZW1lbnQpOworCQkJfQorCQkJYXJyYXkuYWRkKG9iamVjdCk7CisJCX0KKwkJcmV0dXJuIGFycmF5OworCX0KKworCXB1YmxpYyBPYmplY3QganNvbjJKYXZhUHJpbWl0aXZlKEpzb25QcmltaXRpdmUgcHJpbSkgeworCQlpZiAocHJpbS5pc0Jvb2xlYW4oKSkgeworCQkJcmV0dXJuIHByaW0uZ2V0QXNCb29sZWFuKCk7CisJCX0gZWxzZSBpZiAocHJpbS5pc1N0cmluZygpKSB7CisJCQlyZXR1cm4gcHJpbS5nZXRBc1N0cmluZygpOworCQl9IGVsc2UgaWYgKHByaW0uaXNOdW1iZXIoKSkgeworCQkJU3RyaW5nIHN0clJlcGVzZW50YXRpb24gPSBwcmltLmdldEFzU3RyaW5nKCk7CisJCQlpZiAoc3RyUmVwZXNlbnRhdGlvbi5jb250YWlucygiLiIpKSB7CisJCQkJcmV0dXJuIHByaW0uZ2V0QXNEb3VibGUoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHByaW0uZ2V0QXNJbnQoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhVmFsdWVDb252ZXJ0ZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhVmFsdWVDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVkNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FWYWx1ZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKKworcHVibGljIGludGVyZmFjZSBUb3NjYVZhbHVlQ29udmVydGVyIHsKKwlPYmplY3QgY29udmVydFRvVG9zY2FWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gZGF0YVR5cGVzKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL2NvbnZlcnRlcnMvVG9zY2FWYWx1ZURlZmF1bHRDb252ZXJ0ZXIuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhVmFsdWVEZWZhdWx0Q29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYjI0MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS9jb252ZXJ0ZXJzL1Rvc2NhVmFsdWVEZWZhdWx0Q29udmVydGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgVG9zY2FWYWx1ZURlZmF1bHRDb252ZXJ0ZXIgaW1wbGVtZW50cyBUb3NjYVZhbHVlQ29udmVydGVyIHsKKwlwcml2YXRlIHN0YXRpYyBUb3NjYVZhbHVlRGVmYXVsdENvbnZlcnRlciBkZWFmdWx0Q29udmVydGVyID0gbmV3IFRvc2NhVmFsdWVEZWZhdWx0Q29udmVydGVyKCk7CisKKwlwdWJsaWMgc3RhdGljIFRvc2NhVmFsdWVEZWZhdWx0Q29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gZGVhZnVsdENvbnZlcnRlcjsKKwl9CisKKwlwcml2YXRlIFRvc2NhVmFsdWVEZWZhdWx0Q29udmVydGVyKCkgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjb252ZXJ0VG9Ub3NjYVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBkYXRhVHlwZXMpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvQm9vbGVhblZhbGlkYXRvci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvQm9vbGVhblZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjBlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9Cb29sZWFuVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBCb29sZWFuVmFsaWRhdG9yIGltcGxlbWVudHMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHsKKworCXByaXZhdGUgc3RhdGljIEJvb2xlYW5WYWxpZGF0b3IgYm9vbGVhblZhbGlkYXRvciA9IG5ldyBCb29sZWFuVmFsaWRhdG9yKCk7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdmFsaWRWYWx1ZXMgPSB7ICJ0cnVlIiwgInQiLCAib24iLCAieWVzIiwgInkiLCAiMSIsICJmYWxzZSIsICJmIiwgIm9mZiIsICJubyIsICJuIiwgIjAiIH07CisKKwlwdWJsaWMgc3RhdGljIEJvb2xlYW5WYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBib29sZWFuVmFsaWRhdG9yOworCX0KKworCXByaXZhdGUgQm9vbGVhblZhbGlkYXRvcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiAoQXJyYXlzLnN0cmVhbSh2YWxpZFZhbHVlcykuZmlsdGVyKHN0ciAtPiBzdHIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpLnRvQXJyYXkoKS5sZW5ndGggPT0gMSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUpIHsKKwkJcmV0dXJuIGlzVmFsaWQodmFsdWUsIG51bGwsIG51bGwpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0RhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9EYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzZhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9EYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNDk5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5Ub3NjYVByb3BlcnR5VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb252ZXJ0ZXJzLlByb3BlcnR5VmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblByaW1pdGl2ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblN5bnRheEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIERhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyIHsKKworCXByaXZhdGUgc3RhdGljIERhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyIGRhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyID0gbmV3IERhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyKCk7CisKKwlwdWJsaWMgc3RhdGljIERhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gZGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXI7CisJfQorCisJcHJpdmF0ZSBEYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlcigpIHsKKworCX0KKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlci5jbGFzcy5nZXROYW1lKCkpOworCisJSnNvblBhcnNlciBqc29uUGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKKworCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlJbW11dGFibGVQYWlyPEpzb25FbGVtZW50LCBCb29sZWFuPiBmYWxzZVJlc3VsdCA9IG5ldyBJbW11dGFibGVQYWlyPEpzb25FbGVtZW50LCBCb29sZWFuPihudWxsLCBmYWxzZSk7CisJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdHJ1ZUVtcHR5UmVzdWx0ID0gbmV3IEltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+KG51bGwsIHRydWUpOworCisJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+IHRydWVTdHJpbmdFbXB0eVJlc3VsdCA9IG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgQm9vbGVhbj4obnVsbCwgdHJ1ZSk7CisJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+IGZhbHNlU3RyaW5nRW1wdHlSZXN1bHQgPSBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+KG51bGwsIHRydWUpOworCisJcHJpdmF0ZSBUb3NjYVByb3BlcnR5VHlwZSBpc0RhdGFUeXBlRGVydmllZEZyb21TY2FsYXJUeXBlKERhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZikgeworCisJCVRvc2NhUHJvcGVydHlUeXBlIHJlc3VsdCA9IG51bGw7CisKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlID0gZGF0YVR5cGVEZWY7CisKKwkJd2hpbGUgKGRhdGFUeXBlICE9IG51bGwpIHsKKworCQkJU3RyaW5nIG5hbWUgPSBkYXRhVHlwZS5nZXROYW1lKCk7CisJCQlUb3NjYVByb3BlcnR5VHlwZSB0eXBlSWZTY2FsYXIgPSBUb3NjYVByb3BlcnR5VHlwZS5nZXRUeXBlSWZTY2FsYXIobmFtZSk7CisJCQlpZiAodHlwZUlmU2NhbGFyICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSB0eXBlSWZTY2FsYXI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRhdGFUeXBlID0gZGF0YVR5cGUuZ2V0RGVyaXZlZEZyb20oKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBJbW11dGFibGVQYWlyPEpzb25FbGVtZW50LCBCb29sZWFuPiB2YWxpZGF0ZUFuZFVwZGF0ZShKc29uRWxlbWVudCBqc29uRWxlbWVudCwKKwkJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24sIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzKSB7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBhbGxQcm9wZXJ0aWVzID0gZ2V0QWxsUHJvcGVydGllcyhkYXRhVHlwZURlZmluaXRpb24pOworCisJCVRvc2NhUHJvcGVydHlUeXBlIHRvc2NhUHJvcGVydHlUeXBlID0gbnVsbDsKKwkJaWYgKCh0b3NjYVByb3BlcnR5VHlwZSA9IGlzRGF0YVR5cGVEZXJ2aWVkRnJvbVNjYWxhclR5cGUoZGF0YVR5cGVEZWZpbml0aW9uKSkgIT0gbnVsbCkgeworCisJCQlQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgdmFsaWRhdG9yID0gdG9zY2FQcm9wZXJ0eVR5cGUuZ2V0VmFsaWRhdG9yKCk7CisJCQlQcm9wZXJ0eVZhbHVlQ29udmVydGVyIGNvbnZlcnRlciA9IHRvc2NhUHJvcGVydHlUeXBlLmdldENvbnZlcnRlcigpOworCQkJaWYgKGpzb25FbGVtZW50ID09IG51bGwgfHwgdHJ1ZSA9PSBqc29uRWxlbWVudC5pc0pzb25OdWxsKCkpIHsKKwkJCQlib29sZWFuIHZhbGlkID0gdmFsaWRhdG9yLmlzVmFsaWQobnVsbCwgbnVsbCwgYWxsRGF0YVR5cGVzKTsKKwkJCQlpZiAoZmFsc2UgPT0gdmFsaWQpIHsKKwkJCQkJbG9nLnRyYWNlKCJGYWlsZWQgaW4gdmFsaWRhdGlvbiBvZiBwcm9wZXJ0eSB7fSBmcm9tIHR5cGUge30iLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJCQkJcmV0dXJuIGZhbHNlUmVzdWx0OworCQkJCX0KKwkJCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+KGpzb25FbGVtZW50LCB0cnVlKTsKKworCQkJfSBlbHNlIHsKKwkJCQlpZiAodHJ1ZSA9PSBqc29uRWxlbWVudC5pc0pzb25QcmltaXRpdmUoKSkgeworCQkJCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQkJCQlpZiAoanNvbkVsZW1lbnQgIT0gbnVsbCkgeworCQkJCQkJaWYgKGpzb25FbGVtZW50LnRvU3RyaW5nKCkuaXNFbXB0eSgpKSB7CisJCQkJCQkJdmFsdWUgPSAiIjsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdmFsdWUgPSBqc29uRWxlbWVudC50b1N0cmluZygpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJvb2xlYW4gdmFsaWQgPSB2YWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSwgbnVsbCwgbnVsbCk7CisJCQkJCWlmIChmYWxzZSA9PSB2YWxpZCkgeworCQkJCQkJbG9nLnRyYWNlKCJGYWlsZWQgaW4gdmFsaWRhdGlvbiBvZiBwcm9wZXJ0eSB7fSBmcm9tIHR5cGUge30uIEpzb24gcHJpbWl0aXZlIHZhbHVlIGlzIHt9IiwgZGF0YVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSwgZGF0YVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSwgdmFsdWUpOworCQkJCQkJcmV0dXJuIGZhbHNlUmVzdWx0OworCQkJCQl9CisKKwkJCQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLmNvbnZlcnQodmFsdWUsIG51bGwsIGFsbERhdGFUeXBlcyk7CisJCQkJCUpzb25FbGVtZW50IGVsZW1lbnQgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJZWxlbWVudCA9IGpzb25QYXJzZXIucGFyc2UoY29udmVydGVkVmFsdWUpOworCQkJCQl9IGNhdGNoIChKc29uU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHBhcnNlIHZhbHVlIHt9IG9mIHByb3BlcnR5IHt9LiB7fSIsIGNvbnZlcnRlZFZhbHVlLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpLCBlKTsKKwkJCQkJCXJldHVybiBmYWxzZVJlc3VsdDsKKwkJCQkJfQorCisJCQkJCXJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4oZWxlbWVudCwgdHJ1ZSk7CisKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBNQVAsIExJU1QsIE9USEVSIHR5cGVzIGNhbm5vdCBiZSBhcHBsaWVkIGRhdGEgdHlwZQorCQkJCQkvLyBkZWZpbml0aW9uIHNjYWxhciB0eXBlLiBXZSBjdXJyZW50bHkgY2Fubm90IGRlcml2ZWQgZnJvbQorCQkJCQkvLyBtYXAvbGlzdC4gKGNhbm5vdCBhZGQgdGhlIGVudHJ5IHNjaGVtYSB0byBpdCkKKwkJCQkJbG9nLmRlYnVnKCJXZSBjYW5ub3QgZGVyaXZlIGZyb20gbGlzdC9tYXAuIFRodXMsIHRoZSB2YWx1ZSBjYW5ub3QgYmUgbm90IHByaW1pdGl2ZSBzaW5jZSB0aGUgZGF0YSB0eXBlIHt9IGlzIHNjYWxhciBvbmUiLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKworCQkJCQlyZXR1cm4gZmFsc2VSZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCisJCQlpZiAoanNvbkVsZW1lbnQgPT0gbnVsbCB8fCBqc29uRWxlbWVudC5pc0pzb25OdWxsKCkpIHsKKworCQkJCXJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4oanNvbkVsZW1lbnQsIHRydWUpOworCisJCQl9IGVsc2UgeworCisJCQkJaWYgKGpzb25FbGVtZW50LmlzSnNvbk9iamVjdCgpKSB7CisKKwkJCQkJSnNvbk9iamVjdCBidWlsZEpzb25PYmplY3QgPSBuZXcgSnNvbk9iamVjdCgpOworCisJCQkJCUpzb25PYmplY3QgYXNKc29uT2JqZWN0ID0ganNvbkVsZW1lbnQuZ2V0QXNKc29uT2JqZWN0KCk7CisJCQkJCVNldDxFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50Pj4gZW50cnlTZXQgPSBhc0pzb25PYmplY3QuZW50cnlTZXQoKTsKKworCQkJCQlmb3IgKEVudHJ5PFN0cmluZywgSnNvbkVsZW1lbnQ+IGVudHJ5IDogZW50cnlTZXQpIHsKKwkJCQkJCVN0cmluZyBwcm9wTmFtZSA9IGVudHJ5LmdldEtleSgpOworCisJCQkJCQlKc29uRWxlbWVudCBlbGVtZW50VmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCisJCQkJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gYWxsUHJvcGVydGllcy5nZXQocHJvcE5hbWUpOworCQkJCQkJaWYgKHByb3BlcnR5RGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQkJCQkJbG9nLmRlYnVnKCJUaGUgcHJvcGVydHkge30gd2FzIG5vdCBmb3VuZCB1bmRlciBkYXRhIHR5cGUge30iLCBwcm9wTmFtZSwgZGF0YVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCQkJCQkJcmV0dXJuIGZhbHNlUmVzdWx0OworCQkJCQkJfQorCQkJCQkJU3RyaW5nIHR5cGUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VHlwZSgpOworCQkJCQkJYm9vbGVhbiBpc1NjYWxhclR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1NjYWxhclR5cGUodHlwZSk7CisKKwkJCQkJCWlmICh0cnVlID09IGlzU2NhbGFyVHlwZSkgeworCQkJCQkJCVRvc2NhUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKHR5cGUpOworCQkJCQkJCWlmIChwcm9wZXJ0eVR5cGUgPT0gbnVsbCkgeworCQkJCQkJCQlsb2cuZGVidWcoImNhbm5vdCBmaW5kIHRoZSB7fSB1bmRlciBkZWZhdWx0IHRvc2NhIHByb3BlcnR5IHR5cGVzIiwgdHlwZSk7CisJCQkJCQkJCXJldHVybiBmYWxzZVJlc3VsdDsKKwkJCQkJCQl9CisJCQkJCQkJUHJvcGVydHlUeXBlVmFsaWRhdG9yIHZhbGlkYXRvciA9IHByb3BlcnR5VHlwZS5nZXRWYWxpZGF0b3IoKTsKKwkJCQkJCQlTdHJpbmcgaW5uZXJUeXBlID0gbnVsbDsKKwkJCQkJCQlpZiAocHJvcGVydHlUeXBlID09IFRvc2NhUHJvcGVydHlUeXBlLkxJU1QgfHwgcHJvcGVydHlUeXBlID09IFRvc2NhUHJvcGVydHlUeXBlLk1BUCkgeworCQkJCQkJCQlpZiAocHJvcGVydHlEZWZpbml0aW9uLmdldFNjaGVtYSgpICE9IG51bGwKKwkJCQkJCQkJCQkmJiBwcm9wZXJ0eURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKSAhPSBudWxsKSB7CisJCQkJCQkJCQlpbm5lclR5cGUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5nZXRUeXBlKCk7CisJCQkJCQkJCQlpZiAoaW5uZXJUeXBlID09IG51bGwpIHsKKwkJCQkJCQkJCQlsb2cuZGVidWcoIlByb3BlcnR5IHR5cGUge30gbXVzdCBoYXZlIGlubmVyIHR5cGUgaW4gaXRzIGRlY2xhcmF0aW9uLiIsIHByb3BlcnR5VHlwZSk7CisJCQkJCQkJCQkJcmV0dXJuIGZhbHNlUmVzdWx0OworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKKwkJCQkJCQlpZiAoZWxlbWVudFZhbHVlICE9IG51bGwpIHsKKwkJCQkJCQkJaWYgKGVsZW1lbnRWYWx1ZS5pc0pzb25QcmltaXRpdmUoKSAmJiBlbGVtZW50VmFsdWUuZ2V0QXNTdHJpbmcoKS5pc0VtcHR5KCkpIHsKKwkJCQkJCQkJCXZhbHVlID0gIiI7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl2YWx1ZSA9IGVsZW1lbnRWYWx1ZS50b1N0cmluZygpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJYm9vbGVhbiBpc1ZhbGlkID0gdmFsaWRhdG9yLmlzVmFsaWQodmFsdWUsIGlubmVyVHlwZSwgYWxsRGF0YVR5cGVzKTsKKwkJCQkJCQlpZiAoZmFsc2UgPT0gaXNWYWxpZCkgeworCQkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCB0byB2YWxpZGF0ZSB0aGUgdmFsdWUge30gZnJvbSB0eXBlIHt9IiwgdmFsdWUsIHByb3BlcnR5VHlwZSk7CisJCQkJCQkJCXJldHVybiBmYWxzZVJlc3VsdDsKKwkJCQkJCQl9CisKKwkJCQkJCQlQcm9wZXJ0eVZhbHVlQ29udmVydGVyIGNvbnZlcnRlciA9IHByb3BlcnR5VHlwZS5nZXRDb252ZXJ0ZXIoKTsKKwkJCQkJCQlTdHJpbmcgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZXIuY29udmVydCh2YWx1ZSwgaW5uZXJUeXBlLCBhbGxEYXRhVHlwZXMpOworCisJCQkJCQkJSnNvbkVsZW1lbnQgZWxlbWVudCA9IG51bGw7CisJCQkJCQkJaWYgKGNvbnZlcnRlZFZhbHVlICE9IG51bGwpIHsKKwkJCQkJCQkJaWYgKGNvbnZlcnRlZFZhbHVlLmlzRW1wdHkoKSkgeworCQkJCQkJCQkJZWxlbWVudCA9IG5ldyBKc29uUHJpbWl0aXZlKCIiKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQkJZWxlbWVudCA9IGpzb25QYXJzZXIucGFyc2UoY29udmVydGVkVmFsdWUpOworCQkJCQkJCQkJfSBjYXRjaCAoSnNvblN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gcGFyc2UgdmFsdWUge30gb2YgdHlwZSB7fS4ge30iLCBjb252ZXJ0ZWRWYWx1ZSwgcHJvcGVydHlUeXBlLCBlKTsKKwkJCQkJCQkJCQlyZXR1cm4gZmFsc2VSZXN1bHQ7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJYnVpbGRKc29uT2JqZWN0LmFkZChwcm9wTmFtZSwgZWxlbWVudCk7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQlEYXRhVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSBhbGxEYXRhVHlwZXMuZ2V0KHR5cGUpOworCQkJCQkJCWlmICh0eXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQkJCQkJCWxvZy5kZWJ1ZygiVGhlIGRhdGEgdHlwZSB7XSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGdpdmVuIGRhdGEgdHlwZSBsaXN0LiIsIHR5cGUpOworCQkJCQkJCQlyZXR1cm4gZmFsc2VSZXN1bHQ7CisJCQkJCQkJfQorCisJCQkJCQkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gaXNWYWxpZCA9IHZhbGlkYXRlQW5kVXBkYXRlKGVsZW1lbnRWYWx1ZSwKKwkJCQkJCQkJCXR5cGVEZWZpbml0aW9uLCBhbGxEYXRhVHlwZXMpOworCisJCQkJCQkJaWYgKGZhbHNlID09IGlzVmFsaWQuZ2V0UmlnaHQoKS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQkJCQlsb2cuZGVidWcoIkZhaWxlZCBpbiB2YWxpZGF0aW9uIG9mIHZhbHVlIHt9IGZyb20gdHlwZSB7fSIsIChlbGVtZW50VmFsdWUgIT0gbnVsbCA/IGVsZW1lbnRWYWx1ZS50b1N0cmluZygpIDogbnVsbCksIHR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCQkJCQkJCXJldHVybiBmYWxzZVJlc3VsdDsKKwkJCQkJCQl9CisKKwkJCQkJCQlidWlsZEpzb25PYmplY3QuYWRkKHByb3BOYW1lLCBpc1ZhbGlkLmdldExlZnQoKSk7CisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJCXJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4oYnVpbGRKc29uT2JqZWN0LCB0cnVlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuZGVidWcoIlRoZSB2YWx1ZSB7fSBvZiB0eXBlIHt9IHNob3VsZCBiZSBqc29uIG9iamVjdCIsIChqc29uRWxlbWVudCAhPSBudWxsID8ganNvbkVsZW1lbnQudG9TdHJpbmcoKSA6IG51bGwpLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkJCQkJcmV0dXJuIGZhbHNlUmVzdWx0OworCQkJCX0KKworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGVBbmRVcGRhdGUoU3RyaW5nIHZhbHVlLCBEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uLAorCQkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMpIHsKKworCQlJbW11dGFibGVQYWlyPEpzb25FbGVtZW50LCBCb29sZWFuPiByZXN1bHQgPSBmYWxzZVJlc3VsdDsKKworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiB0cnVlRW1wdHlSZXN1bHQ7CisJCX0KKworCQlKc29uRWxlbWVudCBqc29uRWxlbWVudCA9IG51bGw7CisJCXRyeSB7CisJCQlqc29uRWxlbWVudCA9IGpzb25QYXJzZXIucGFyc2UodmFsdWUpOworCQl9IGNhdGNoIChKc29uU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZVJlc3VsdDsKKwkJfQorCisJCXJlc3VsdCA9IHZhbGlkYXRlQW5kVXBkYXRlKGpzb25FbGVtZW50LCBkYXRhVHlwZURlZmluaXRpb24sIGFsbERhdGFUeXBlcyk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZ2V0QWxsUHJvcGVydGllcyhEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uKSB7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBhbGxQYXJlbnRzUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4oKTsKKworCQl3aGlsZSAoZGF0YVR5cGVEZWZpbml0aW9uICE9IG51bGwpIHsKKworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IGN1cnJlbnRQYXJlbnRzUHJvcHMgPSBkYXRhVHlwZURlZmluaXRpb24uZ2V0UHJvcGVydGllcygpOworCQkJaWYgKGN1cnJlbnRQYXJlbnRzUHJvcHMgIT0gbnVsbCkgeworCQkJCWN1cnJlbnRQYXJlbnRzUHJvcHMuc3RyZWFtKCkuZm9yRWFjaChwIC0+IGFsbFBhcmVudHNQcm9wcy5wdXQocC5nZXROYW1lKCksIHApKTsKKwkJCX0KKworCQkJZGF0YVR5cGVEZWZpbml0aW9uID0gZGF0YVR5cGVEZWZpbml0aW9uLmdldERlcml2ZWRGcm9tKCk7CisJCX0KKworCQlyZXR1cm4gYWxsUGFyZW50c1Byb3BzOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlRnJvbUpzb25FbGVtZW50KEpzb25FbGVtZW50IGpzb25FbGVtZW50KSB7CisJCVN0cmluZyB2YWx1ZSA9IG51bGw7CisKKwkJaWYgKGpzb25FbGVtZW50ID09IG51bGwgfHwganNvbkVsZW1lbnQuaXNKc29uTnVsbCgpKSB7CisJCQl2YWx1ZSA9IFByb3BlcnR5T3BlcmF0aW9uLkVNUFRZX1ZBTFVFOworCQl9IGVsc2UgeworCQkJaWYgKGpzb25FbGVtZW50LnRvU3RyaW5nKCkuaXNFbXB0eSgpKSB7CisJCQkJdmFsdWUgPSAiIjsKKwkJCX0gZWxzZSB7CisJCQkJdmFsdWUgPSBqc29uRWxlbWVudC50b1N0cmluZygpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uLAorCQkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMpIHsKKworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlKc29uRWxlbWVudCBqc29uRWxlbWVudCA9IG51bGw7CisJCXRyeSB7CisJCQlqc29uRWxlbWVudCA9IGpzb25QYXJzZXIucGFyc2UodmFsdWUpOworCQl9IGNhdGNoIChKc29uU3ludGF4RXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIHBhcnNlIHRoZSB2YWx1ZSB7fSBmcm9tIHR5cGUge30uIHt9IiwgdmFsdWUsIGRhdGFUeXBlRGVmaW5pdGlvbiwgZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXN1bHQgPSBpc1ZhbGlkKGpzb25FbGVtZW50LCBkYXRhVHlwZURlZmluaXRpb24sIGFsbERhdGFUeXBlcyk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChKc29uRWxlbWVudCBqc29uRWxlbWVudCwgRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiwKKwkJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzKSB7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBhbGxQcm9wZXJ0aWVzID0gZ2V0QWxsUHJvcGVydGllcyhkYXRhVHlwZURlZmluaXRpb24pOworCisJCVRvc2NhUHJvcGVydHlUeXBlIHRvc2NhUHJvcGVydHlUeXBlID0gbnVsbDsKKwkJaWYgKCh0b3NjYVByb3BlcnR5VHlwZSA9IGlzRGF0YVR5cGVEZXJ2aWVkRnJvbVNjYWxhclR5cGUoZGF0YVR5cGVEZWZpbml0aW9uKSkgIT0gbnVsbCkgeworCisJCQlQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgdmFsaWRhdG9yID0gdG9zY2FQcm9wZXJ0eVR5cGUuZ2V0VmFsaWRhdG9yKCk7CisJCQlpZiAoanNvbkVsZW1lbnQgPT0gbnVsbCB8fCB0cnVlID09IGpzb25FbGVtZW50LmlzSnNvbk51bGwoKSkgeworCQkJCWJvb2xlYW4gdmFsaWQgPSB2YWxpZGF0b3IuaXNWYWxpZChudWxsLCBudWxsLCBhbGxEYXRhVHlwZXMpOworCQkJCWlmIChmYWxzZSA9PSB2YWxpZCkgeworCQkJCQlsb2cudHJhY2UoIkZhaWxlZCBpbiB2YWxpZGF0aW9uIG9mIHByb3BlcnR5ICIgKyBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICsgIiBmcm9tIHR5cGUgIgorCQkJCQkJCSsgZGF0YVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJfSBlbHNlIHsKKwkJCQlpZiAodHJ1ZSA9PSBqc29uRWxlbWVudC5pc0pzb25QcmltaXRpdmUoKSkgeworCQkJCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQkJCQlpZiAoanNvbkVsZW1lbnQgIT0gbnVsbCkgeworCQkJCQkJaWYgKGpzb25FbGVtZW50LnRvU3RyaW5nKCkuaXNFbXB0eSgpKSB7CisJCQkJCQkJdmFsdWUgPSAiIjsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdmFsdWUgPSBqc29uRWxlbWVudC50b1N0cmluZygpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJvb2xlYW4gdmFsaWQgPSB2YWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSwgbnVsbCwgYWxsRGF0YVR5cGVzKTsKKwkJCQkJaWYgKGZhbHNlID09IHZhbGlkKSB7CisJCQkJCQlsb2cudHJhY2UoIkZhaWxlZCBpbiB2YWxpZGF0aW9uIG9mIHByb3BlcnR5IHt9IGZyb20gdHlwZSB7fS4gSnNvbiBwcmltaXRpdmUgdmFsdWUgaXMge30iLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpLCB2YWx1ZSk7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKworCQkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJCX0gZWxzZSB7CisJCQkJCS8vIE1BUCwgTElTVCwgT1RIRVIgdHlwZXMgY2Fubm90IGJlIGFwcGxpZWQgZGF0YSB0eXBlCisJCQkJCS8vIGRlZmluaXRpb24gc2NhbGFyIHR5cGUuIFdlIGN1cnJlbnRseSBjYW5ub3QgZGVyaXZlZCBmcm9tCisJCQkJCS8vIG1hcC9saXN0LiAoY2Fubm90IGFkZCB0aGUgZW50cnkgc2NoZW1hIHRvIGl0KQorCQkJCQlsb2cuZGVidWcoIldlIGNhbm5vdCBkZXJpdmUgZnJvbSBsaXN0L21hcC4gVGh1cywgdGhlIHZhbHVlIGNhbm5vdCBiZSBub3QgcHJpbWl0aXZlIHNpbmNlIHRoZSBkYXRhIHR5cGUge30gaXMgc2NhbGFyIG9uZSIsIGRhdGFUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOworCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCWlmIChqc29uRWxlbWVudCA9PSBudWxsIHx8IGpzb25FbGVtZW50LmlzSnNvbk51bGwoKSkgeworCisJCQkJcmV0dXJuIHRydWU7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlpZiAoanNvbkVsZW1lbnQuaXNKc29uT2JqZWN0KCkpIHsKKworCQkJCQlKc29uT2JqZWN0IGFzSnNvbk9iamVjdCA9IGpzb25FbGVtZW50LmdldEFzSnNvbk9iamVjdCgpOworCQkJCQlTZXQ8RW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4+IGVudHJ5U2V0ID0gYXNKc29uT2JqZWN0LmVudHJ5U2V0KCk7CisKKwkJCQkJZm9yIChFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50PiBlbnRyeSA6IGVudHJ5U2V0KSB7CisJCQkJCQlTdHJpbmcgcHJvcE5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKworCQkJCQkJSnNvbkVsZW1lbnQgZWxlbWVudFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IGFsbFByb3BlcnRpZXMuZ2V0KHByb3BOYW1lKTsKKwkJCQkJCWlmIChwcm9wZXJ0eURlZmluaXRpb24gPT0gbnVsbCkgeworCQkJCQkJCWxvZy5kZWJ1ZygiVGhlIHByb3BlcnR5IHt9IHdhcyBub3QgZm91bmQgdW5kZXIgZGF0YSB0cHllIHt9IiwgcHJvcE5hbWUsIGRhdGFUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCVN0cmluZyB0eXBlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFR5cGUoKTsKKwkJCQkJCWJvb2xlYW4gaXNTY2FsYXJUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNTY2FsYXJUeXBlKHR5cGUpOworCisJCQkJCQlpZiAodHJ1ZSA9PSBpc1NjYWxhclR5cGUpIHsKKwkJCQkJCQlUb3NjYVByb3BlcnR5VHlwZSBwcm9wZXJ0eVR5cGUgPSBUb3NjYVByb3BlcnR5VHlwZS5pc1ZhbGlkVHlwZSh0eXBlKTsKKwkJCQkJCQlpZiAocHJvcGVydHlUeXBlID09IG51bGwpIHsKKwkJCQkJCQkJbG9nLmRlYnVnKCJjYW5ub3QgZmluZCB0aGUge30gdW5kZXIgZGVmYXVsdCB0b3NjYSBwcm9wZXJ0eSB0eXBlcyIsIHR5cGUpOworCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfQorCQkJCQkJCVByb3BlcnR5VHlwZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBwcm9wZXJ0eVR5cGUuZ2V0VmFsaWRhdG9yKCk7CisJCQkJCQkJU3RyaW5nIGlubmVyVHlwZSA9IG51bGw7CisJCQkJCQkJaWYgKHByb3BlcnR5VHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5MSVNUIHx8IHByb3BlcnR5VHlwZSA9PSBUb3NjYVByb3BlcnR5VHlwZS5NQVApIHsKKwkJCQkJCQkJaWYgKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRTY2hlbWEoKSAhPSBudWxsCisJCQkJCQkJCQkJJiYgcHJvcGVydHlEZWZpbml0aW9uLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkgIT0gbnVsbCkgeworCQkJCQkJCQkJaW5uZXJUeXBlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuZ2V0VHlwZSgpOworCQkJCQkJCQkJaWYgKGlubmVyVHlwZSA9PSBudWxsKSB7CisJCQkJCQkJCQkJbG9nLmRlYnVnKCJQcm9wZXJ0eSB0eXBlIHt9IG11c3QgaGF2ZSBpbm5lciB0eXBlIGluIGl0cyBkZWNsZXJhdGlvbi4iLCBwcm9wZXJ0eVR5cGUpOworCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7CisJCQkJCQkJaWYgKGVsZW1lbnRWYWx1ZSAhPSBudWxsKSB7CisJCQkJCQkJCWlmIChlbGVtZW50VmFsdWUuaXNKc29uUHJpbWl0aXZlKCkgJiYgZWxlbWVudFZhbHVlLmdldEFzU3RyaW5nKCkuaXNFbXB0eSgpKSB7CisJCQkJCQkJCQl2YWx1ZSA9ICIiOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJdmFsdWUgPSBlbGVtZW50VmFsdWUudG9TdHJpbmcoKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCWJvb2xlYW4gaXNWYWxpZCA9IHZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcyk7CisJCQkJCQkJaWYgKGZhbHNlID09IGlzVmFsaWQpIHsKKwkJCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gdmFsaWRhdGUgdGhlIHZhbHVlIHt9IGZyb20gdHlwZSB7fSIsIHZhbHVlLCBwcm9wZXJ0eVR5cGUpOworCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfQorCisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJRGF0YVR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gYWxsRGF0YVR5cGVzLmdldCh0eXBlKTsKKwkJCQkJCQlpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkgeworCQkJCQkJCQlsb2cuZGVidWcoIlRoZSBkYXRhIHR5cGUge30gY2Fub3QgYmUgZm91bmQgaW4gdGhlIGdpdmVuIGRhdGEgdHlwZSBsaXN0LiIsIHR5cGUpOworCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfQorCisJCQkJCQkJYm9vbGVhbiBpc1ZhbGlkID0gaXNWYWxpZChlbGVtZW50VmFsdWUsIHR5cGVEZWZpbml0aW9uLCBhbGxEYXRhVHlwZXMpOworCisJCQkJCQkJaWYgKGZhbHNlID09IGlzVmFsaWQpIHsKKwkJCQkJCQkJbG9nLmRlYnVnKCJGYWlsZWQgaW4gdmFsaWRhdGlvbiBvZiB2YWx1ZSB7fSBmcm9tIHR5cGUge30iLCAoZWxlbWVudFZhbHVlICE9IG51bGwgPyBlbGVtZW50VmFsdWUudG9TdHJpbmcoKSA6IG51bGwpLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZy5kZWJ1ZygiVGhlIHZhbHVlIHt9IG9mIHR5cGUge30gc2hvdWxkIGJlIGpzb24gb2JqZWN0IiwgKGpzb25FbGVtZW50ICE9IG51bGwgPyBqc29uRWxlbWVudC50b1N0cmluZygpIDogbnVsbCksIGRhdGFUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQl9CisJCX0KKworCX0KKworCS8vIHB1YmxpYyBJbW11dGFibGVQYWlyPFN0cmluZywgQm9vbGVhbj4KKwkvLyB2YWxpZGF0ZUFuZFVwZGF0ZUFuZFJldHVyblN0cmluZyhTdHJpbmcgdmFsdWUsIERhdGFUeXBlRGVmaW5pdGlvbgorCS8vIGRhdGFUeXBlRGVmaW5pdGlvbiwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMpIHsKKwkvLworCS8vIEltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+IHJlc3VsdCA9IGZhbHNlUmVzdWx0OworCS8vCisJLy8gaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisJLy8gcmV0dXJuIHRydWVTdHJpbmdFbXB0eVJlc3VsdDsKKwkvLyB9CisJLy8KKwkvLyBKc29uRWxlbWVudCBqc29uRWxlbWVudCA9IG51bGw7CisJLy8gdHJ5IHsKKwkvLyBqc29uRWxlbWVudCA9IGpzb25QYXJzZXIucGFyc2UodmFsdWUpOworCS8vIH0gY2F0Y2ggKEpzb25TeW50YXhFeGNlcHRpb24gZSkgeworCS8vIHJldHVybiBmYWxzZVN0cmluZ0VtcHR5UmVzdWx0OworCS8vIH0KKwkvLworCS8vIHJlc3VsdCA9IHZhbGlkYXRlQW5kVXBkYXRlKGpzb25FbGVtZW50LCBkYXRhVHlwZURlZmluaXRpb24sCisJLy8gYWxsRGF0YVR5cGVzKTsKKwkvLworCS8vIGlmIChyZXN1bHQucmlnaHQuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKKwkvLyBsb2cuZGVidWcoIlRoZSB2YWx1ZSB7fSBvZiBwcm9wZXJ0eSBmcm9tIHR5cGUge30gaXMgaW52YWxpZCIsIHZhbHVlLCBkYXRhVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKKwkvLyByZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBCb29sZWFuPih2YWx1ZSwgZmFsc2UpOworCS8vIH0KKwkvLworCS8vIFN0cmluZyB2YWx1ZUZyb21Kc29uRWxlbWVudCA9IGdldFZhbHVlRnJvbUpzb25FbGVtZW50KHJlc3VsdC5sZWZ0KTsKKwkvLworCS8vIHJldHVybiBuZXcgSW1tdXRhYmxlUGFpcjxTdHJpbmcsIEJvb2xlYW4+KHZhbHVlRnJvbUpzb25FbGVtZW50LCB0cnVlKTsKKwkvLyB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0Zsb2F0VmFsaWRhdG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9GbG9hdFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MThlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9GbG9hdFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEZsb2F0VmFsaWRhdG9yIGltcGxlbWVudHMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHsKKworCXByaXZhdGUgc3RhdGljIEZsb2F0VmFsaWRhdG9yIEZsb2F0VmFsaWRhdG9yID0gbmV3IEZsb2F0VmFsaWRhdG9yKCk7CisKKwlwdWJsaWMgc3RhdGljIEZsb2F0VmFsaWRhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gRmxvYXRWYWxpZGF0b3I7CisJfQorCisJcHJpdmF0ZSBGbG9hdFZhbGlkYXRvcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXRyeSB7CisJCQlGbG9hdC5wYXJzZUZsb2F0KHZhbHVlKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlKSB7CisJCXJldHVybiBpc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIG51bGwpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvSGVhdEJvb2xlYW5WYWxpZGF0b3IuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0hlYXRCb29sZWFuVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0MDUxZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0hlYXRCb29sZWFuVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgSGVhdEJvb2xlYW5WYWxpZGF0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgeworCisJcHJpdmF0ZSBzdGF0aWMgSGVhdEJvb2xlYW5WYWxpZGF0b3IgYm9vbGVhblZhbGlkYXRvciA9IG5ldyBIZWF0Qm9vbGVhblZhbGlkYXRvcigpOworCisJcHVibGljIHN0YXRpYyBIZWF0Qm9vbGVhblZhbGlkYXRvciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGJvb2xlYW5WYWxpZGF0b3I7CisJfQorCisJcHJpdmF0ZSBIZWF0Qm9vbGVhblZhbGlkYXRvcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0IikKKwkJCQl8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJmIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgib24iKSB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJvZmYiKQorCQkJCXx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm5vIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgieSIpCisJCQkJfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgibiIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIjEiKSB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCIwIikpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlKSB7CisJCXJldHVybiBpc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIG51bGwpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvSGVhdENvbW1hRGVsaW1pdGVkTGlzdFZhbGlkYXRvci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvSGVhdENvbW1hRGVsaW1pdGVkTGlzdFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGRiZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9IZWF0Q29tbWFEZWxpbWl0ZWRMaXN0VmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKKworcHVibGljIGNsYXNzIEhlYXRDb21tYURlbGltaXRlZExpc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgeworCisJcHJpdmF0ZSBzdGF0aWMgSGVhdENvbW1hRGVsaW1pdGVkTGlzdFZhbGlkYXRvciBzdHJpbmdWYWxpZGF0b3IgPSBuZXcgSGVhdENvbW1hRGVsaW1pdGVkTGlzdFZhbGlkYXRvcigpOworCisJcHVibGljIHN0YXRpYyBIZWF0Q29tbWFEZWxpbWl0ZWRMaXN0VmFsaWRhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gc3RyaW5nVmFsaWRhdG9yOworCX0KKworCXByaXZhdGUgSGVhdENvbW1hRGVsaW1pdGVkTGlzdFZhbGlkYXRvcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCVN0cmluZyBjb3ZlcnRlZCA9IFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKHZhbHVlKTsKKwkJcmV0dXJuIFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUlzRW5nbGlzaChjb3ZlcnRlZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUpIHsKKwkJcmV0dXJuIGlzVmFsaWQodmFsdWUsIGlubmVyVHlwZSwgbnVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvSGVhdE51bWJlclZhbGlkYXRvci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvSGVhdE51bWJlclZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzRhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9IZWF0TnVtYmVyVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgSGVhdE51bWJlclZhbGlkYXRvciBpbXBsZW1lbnRzIFByb3BlcnR5VHlwZVZhbGlkYXRvciB7CisKKwlwcml2YXRlIHN0YXRpYyBIZWF0TnVtYmVyVmFsaWRhdG9yIG51bWJlclZhbGlkYXRvciA9IG5ldyBIZWF0TnVtYmVyVmFsaWRhdG9yKCk7CisKKwlwcml2YXRlIHN0YXRpYyBGbG9hdFZhbGlkYXRvciBmbG9hdFZhbGlkYXRvciA9IEZsb2F0VmFsaWRhdG9yLmdldEluc3RhbmNlKCk7CisJcHJpdmF0ZSBzdGF0aWMgSW50ZWdlclZhbGlkYXRvciBpbnRlZ2VyVmFsaWRhdG9yID0gSW50ZWdlclZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOworCisJcHVibGljIHN0YXRpYyBIZWF0TnVtYmVyVmFsaWRhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gbnVtYmVyVmFsaWRhdG9yOworCX0KKworCXByaXZhdGUgSGVhdE51bWJlclZhbGlkYXRvcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlib29sZWFuIHZhbGlkID0gaW50ZWdlclZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlLCBudWxsLCBhbGxEYXRhVHlwZXMpOworCisJCWlmICghdmFsaWQpIHsKKwkJCXZhbGlkID0gZmxvYXRWYWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSwgbnVsbCwgYWxsRGF0YVR5cGVzKTsKKwkJfQorCisJCXJldHVybiB2YWxpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSkgeworCQlyZXR1cm4gaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9IZWF0U3RyaW5nVmFsaWRhdG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9IZWF0U3RyaW5nVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3YjdmNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0hlYXRTdHJpbmdWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuVmFsaWRhdGlvblV0aWxzOworCitwdWJsaWMgY2xhc3MgSGVhdFN0cmluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIFByb3BlcnR5VHlwZVZhbGlkYXRvciB7CisKKwlwcml2YXRlIHN0YXRpYyBIZWF0U3RyaW5nVmFsaWRhdG9yIHN0cmluZ1ZhbGlkYXRvciA9IG5ldyBIZWF0U3RyaW5nVmFsaWRhdG9yKCk7CisKKwlwdWJsaWMgc3RhdGljIEhlYXRTdHJpbmdWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBzdHJpbmdWYWxpZGF0b3I7CisJfQorCisJcHJpdmF0ZSBIZWF0U3RyaW5nVmFsaWRhdG9yKCkgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzKSB7CisKKwkJaWYgKHZhbHVlID09IG51bGwgfHwgdHJ1ZSA9PSB2YWx1ZS5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJU3RyaW5nIGNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLnJlbW92ZU5vbmVVdGY4Q2hhcnModmFsdWUpOworCQlyZXR1cm4gVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSXNFbmdsaXNoKGNvdmVydGVkKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSkgeworCQlyZXR1cm4gaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9JbnRlZ2VyVmFsaWRhdG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9JbnRlZ2VyVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMzIxYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0ludGVnZXJWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBJbnRlZ2VyVmFsaWRhdG9yIGltcGxlbWVudHMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHsKKworCXByaXZhdGUgc3RhdGljIEludGVnZXJWYWxpZGF0b3IgaW50ZWdlclZhbGlkYXRvciA9IG5ldyBJbnRlZ2VyVmFsaWRhdG9yKCk7CisKKwlwcml2YXRlIEludGVnZXJWYWxpZGF0b3IoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBJbnRlZ2VyVmFsaWRhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gaW50ZWdlclZhbGlkYXRvcjsKKwl9CisKKwlwcml2YXRlIGNsYXNzIFBhdHRlcm5CYXNlIHsKKwkJcHVibGljIFBhdHRlcm5CYXNlKFBhdHRlcm4gcGF0dGVybiwgSW50ZWdlciBiYXNlKSB7CisJCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworCQkJdGhpcy5iYXNlID0gYmFzZTsKKwkJfQorCisJCVBhdHRlcm4gcGF0dGVybjsKKwkJSW50ZWdlciBiYXNlOworCX0KKworCXByaXZhdGUgUGF0dGVybkJhc2UgYmFzZThQYXR0ZXJuID0gbmV3IFBhdHRlcm5CYXNlKFBhdHRlcm4uY29tcGlsZSgiKFstK10pPzBvKFswLTddKykiKSwgOCk7CisJcHJpdmF0ZSBQYXR0ZXJuQmFzZSBiYXNlMTBQYXR0ZXJuID0gbmV3IFBhdHRlcm5CYXNlKFBhdHRlcm4uY29tcGlsZSgiKFstK10pPygwfFsxLTldWzAtOV0qKSIpLCAxMCk7CisJcHJpdmF0ZSBQYXR0ZXJuQmFzZSBiYXNlMTZQYXR0ZXJuID0gbmV3IFBhdHRlcm5CYXNlKFBhdHRlcm4uY29tcGlsZSgiKFstK10pPzB4KFswLTlhLWZBLUZdKykiKSwgMTYpOworCisJcHJpdmF0ZSBQYXR0ZXJuQmFzZVtdIHBhdHRlcm5zID0geyBiYXNlMTBQYXR0ZXJuLCBiYXNlOFBhdHRlcm4sIGJhc2UxNlBhdHRlcm4gfTsKKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWZvciAoUGF0dGVybkJhc2UgcGF0dGVybkJhc2UgOiBwYXR0ZXJucykgeworCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybkJhc2UucGF0dGVybi5tYXRjaGVyKHZhbHVlKTsKKwkJCUxvbmcgcGFyc2VkID0gbnVsbDsKKwkJCWlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworCQkJCXRyeSB7CisJCQkJCXBhcnNlZCA9IExvbmcucGFyc2VMb25nKG1hdGNoZXIuZ3JvdXAoMiksIHBhdHRlcm5CYXNlLmJhc2UpOworCQkJCQlpZiAobWF0Y2hlci5ncm91cCgxKSAhPSBudWxsICYmIG1hdGNoZXIuZ3JvdXAoMSkuY29tcGFyZVRvKCItIikgPT0gMCkgeworCQkJCQkJcGFyc2VkICo9IC0xOworCQkJCQl9CisJCQkJCXJldHVybiAoSW50ZWdlci5NSU5fVkFMVUUgPD0gcGFyc2VkICYmIHBhcnNlZCA8PSAoSW50ZWdlci5NQVhfVkFMVUUpKSA/IHRydWUgOiBmYWxzZTsKKwkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSkgeworCQlyZXR1cm4gaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9Kc29uVmFsaWRhdG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9Kc29uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0ZmU2MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0pzb25WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9yczsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuR3NvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuSnNvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25SZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBKc29uVmFsaWRhdG9yIGltcGxlbWVudHMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHsKKworCXByaXZhdGUgc3RhdGljIEpzb25WYWxpZGF0b3IganNvblZhbGlkYXRvciA9IG5ldyBKc29uVmFsaWRhdG9yKCk7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSnNvblZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBzdGF0aWMgSnNvblBhcnNlciBqc29uUGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKKworCXB1YmxpYyBzdGF0aWMgSnNvblZhbGlkYXRvciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGpzb25WYWxpZGF0b3I7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzKSB7CisKKwkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQl0cnkgeworCQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIodmFsdWUpOworCQkJSnNvblJlYWRlciBqc29uUmVhZGVyID0gbmV3IEpzb25SZWFkZXIocmVhZGVyKTsKKwkJCWpzb25SZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKwkJCWpzb25QYXJzZXIucGFyc2UoanNvblJlYWRlcik7CisJCX0gY2F0Y2ggKEpzb25TeW50YXhFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJFcnJvciBwYXJzaW5nIEpTT04gcHJvcGVydHkiLCBlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlKSB7CisJCXJldHVybiBpc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIG51bGwpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0tleVZhbGlkYXRvci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvS2V5VmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxMWUyNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0tleVZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBLZXlWYWxpZGF0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX01BWElNVU1fTEVOR1RIID0gMTAwOworCisJcHJpdmF0ZSBzdGF0aWMgS2V5VmFsaWRhdG9yIGtleVZhbGlkYXRvciA9IG5ldyBLZXlWYWxpZGF0b3IoKTsKKworCXB1YmxpYyBzdGF0aWMgS2V5VmFsaWRhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4ga2V5VmFsaWRhdG9yOworCX0KKworCXByaXZhdGUgS2V5VmFsaWRhdG9yKCkgeworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsIE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzKSB7CisKKwkJaWYgKHZhbHVlID09IG51bGwgfHwgdHJ1ZSA9PSB2YWx1ZS5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICh2YWx1ZS5sZW5ndGgoKSA+IFNUUklOR19NQVhJTVVNX0xFTkdUSCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCVN0cmluZyBjb3ZlcnRlZCA9IFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKHZhbHVlKTsKKwkJcmV0dXJuIFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUlzRW5nbGlzaChjb3ZlcnRlZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUpIHsKKwkJcmV0dXJuIGlzVmFsaWQodmFsdWUsIGlubmVyVHlwZSwgbnVsbCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9MaXN0VmFsaWRhdG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9MaXN0VmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4MzQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0xpc3RWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhUHJvcGVydHlUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkpzb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25TeW50YXhFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBMaXN0VmFsaWRhdG9yIGltcGxlbWVudHMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHsKKworCXByaXZhdGUgc3RhdGljIExpc3RWYWxpZGF0b3IgbGlzdFZhbGlkYXRvciA9IG5ldyBMaXN0VmFsaWRhdG9yKCk7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGlzdFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCkpOworCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwlwcml2YXRlIHN0YXRpYyBKc29uUGFyc2VyIGpzb25QYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOworCisJcHJpdmF0ZSBzdGF0aWMgRGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIgZGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIgPSBEYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlci5nZXRJbnN0YW5jZSgpOworCisJcHVibGljIHN0YXRpYyBMaXN0VmFsaWRhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gbGlzdFZhbGlkYXRvcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMpIHsKKworCQlsb2cuZGVidWcoIkdvaW5nIHRvIHZhbGlkYXRlIHZhbHVlIHt9IHdpdGggaW5uZXIgdHlwZSB7fSIsIHZhbHVlLCBpbm5lclR5cGUpOworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09ICIiKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoaW5uZXJUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCVByb3BlcnR5VHlwZVZhbGlkYXRvciBpbm5lclZhbGlkYXRvcjsKKworCQlUb3NjYVByb3BlcnR5VHlwZSBpbm5lclRvc2NhVHlwZSA9IFRvc2NhUHJvcGVydHlUeXBlLmlzVmFsaWRUeXBlKGlubmVyVHlwZSk7CisKKwkJaWYgKGlubmVyVG9zY2FUeXBlICE9IG51bGwpIHsKKwkJCXN3aXRjaCAoaW5uZXJUb3NjYVR5cGUpIHsKKwkJCWNhc2UgU1RSSU5HOgorCQkJCWlubmVyVmFsaWRhdG9yID0gVG9zY2FQcm9wZXJ0eVR5cGUuU1RSSU5HLmdldFZhbGlkYXRvcigpOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFR0VSOgorCQkJCWlubmVyVmFsaWRhdG9yID0gVG9zY2FQcm9wZXJ0eVR5cGUuSU5URUdFUi5nZXRWYWxpZGF0b3IoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkxPQVQ6CisJCQkJaW5uZXJWYWxpZGF0b3IgPSBUb3NjYVByb3BlcnR5VHlwZS5GTE9BVC5nZXRWYWxpZGF0b3IoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQk9PTEVBTjoKKwkJCQlpbm5lclZhbGlkYXRvciA9IFRvc2NhUHJvcGVydHlUeXBlLkJPT0xFQU4uZ2V0VmFsaWRhdG9yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEpTT046CisJCQkJaW5uZXJWYWxpZGF0b3IgPSBUb3NjYVByb3BlcnR5VHlwZS5KU09OLmdldFZhbGlkYXRvcigpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsb2cuZGVidWcoImlubmVyIFRvc2NhIFR5cGUgaXMgdW5rbm93bjoge30iLCBpbm5lclRvc2NhVHlwZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlsb2cuZGVidWcoImlubmVyIFRvc2NhIFR5cGUgaXM6IHt9IiwgaW5uZXJUeXBlKTsKKworCQkJYm9vbGVhbiBpc1ZhbGlkID0gdmFsaWRhdGVDb21wbGV4SW5uZXJUeXBlKHZhbHVlLCBpbm5lclR5cGUsIGFsbERhdGFUeXBlcyk7CisJCQlsb2cuZGVidWcoIkZpbmlzaCB0byB2YWxpZGF0ZSB2YWx1ZSB7fSBvZiBsaXN0IHdpdGggaW5uZXIgdHlwZSB7fS4gcmVzdWx0IGlzOiB7fSIsIHZhbHVlLCBpbm5lclR5cGUsIGlzVmFsaWQpOworCQkJcmV0dXJuIGlzVmFsaWQ7CisJCX0KKworCQl0cnkgeworCQkJSnNvbkFycmF5IGpvID0gKEpzb25BcnJheSkganNvblBhcnNlci5wYXJzZSh2YWx1ZSk7CisJCQlpbnQgc2l6ZSA9IGpvLnNpemUoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJSnNvbkVsZW1lbnQgY3VycmVudFZhbHVlID0gam8uZ2V0KGkpOworCQkJCVN0cmluZyBlbGVtZW50ID0gSnNvblV0aWxzLnRvU3RyaW5nKGN1cnJlbnRWYWx1ZSk7CisJCQkJaWYgKCFpbm5lclZhbGlkYXRvci5pc1ZhbGlkKGVsZW1lbnQsIG51bGwsIGFsbERhdGFUeXBlcykpIHsKKwkJCQkJbG9nLmRlYnVnKCJ2YWxpZGF0aW9uIG9mIGVsZW1lbnQgOiB7fSBmYWlsZWQiLCBlbGVtZW50KTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJfQorCQkJcmV0dXJuIHRydWU7CisKKwkJfSBjYXRjaCAoSnNvblN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBwYXJzZSBqc29uIDoge30uIHt9IiwgdmFsdWUsIGUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiTGlzdCBWYWxpZGF0b3IiKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlKSB7CisJCXJldHVybiBpc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIG51bGwpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUNvbXBsZXhJbm5lclR5cGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLAorCQkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gaW5uZXJEYXRhVHlwZURlZmluaXRpb24gPSBhbGxEYXRhVHlwZXMuZ2V0KGlubmVyVHlwZSk7CisJCWlmIChpbm5lckRhdGFUeXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQlsb2cuZGVidWcoIkRhdGEgdHlwZSB7fSBjYW5ub3QgYmUgZm91bmQgaW4gb3VyIGRhdGEgdHlwZXMuIiwgaW5uZXJUeXBlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXRyeSB7CisKKwkJCUpzb25BcnJheSBqbyA9IChKc29uQXJyYXkpIGpzb25QYXJzZXIucGFyc2UodmFsdWUpOworCQkJaW50IHNpemUgPSBqby5zaXplKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCUpzb25FbGVtZW50IGN1cnJlbnRWYWx1ZSA9IGpvLmdldChpKTsKKwkJCQlpZiAoY3VycmVudFZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGVsZW1lbnQgPSBKc29uVXRpbHMudG9TdHJpbmcoY3VycmVudFZhbHVlKTsKKwkJCQkJYm9vbGVhbiBpc1ZhbGlkID0gZGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIuaXNWYWxpZChlbGVtZW50LCBpbm5lckRhdGFUeXBlRGVmaW5pdGlvbiwKKwkJCQkJCQlhbGxEYXRhVHlwZXMpOworCQkJCQlpZiAoaXNWYWxpZCA9PSBmYWxzZSkgeworCQkJCQkJbG9nLmRlYnVnKCJDYW5ub3QgcGFyc2UgdmFsdWUge30gZnJvbSB0eXBlIHt9IGluIGxpc3QgcGFyYW1ldGVyIiwgY3VycmVudFZhbHVlLCBpbm5lclR5cGUpOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkVycm9yIHdoZW4gcGFyc2luZyBKU09OIG9mIG9iamVjdCBvZiB0eXBlICIsIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvTWFwVmFsaWRhdG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9NYXBWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGZmYzNmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvTWFwVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQmVFY29tcEVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5EYXRhVHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuSnNvblV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25TeW50YXhFeGNlcHRpb247CisKKy8qCisgKiBQcm9wZXJ0eSBUeXBlIE1hcCBjb3JyZWN0IHVzYWdlOgorICogbnVsbCBrZXkgbnVsbCB2YWx1ZSA9IFlhbWwgcmVhZGVyIGVycm9yCit2YWxpZCBrZXkgbnVsbCB2YWx1ZSA9IGtleSAmIHZhbHVlIGRlbGV0ZWQKK2R1cGxpY2F0ZWQga2V5cyA9IGxhc3Qga2V5IGlzIHRha2VuCittaXNtYXRjaCBiZXR3ZWVuIGlubmVyIHR5cGUgYW5kIHZhbHVlcyB0eXBlID0gcmV0dXJuZWQgbWlzbWF0Y2ggaW4gZGF0YSB0eXBlCit2YWxpZGF0b3JzIGFuZCBjb252ZXJ0ZXJzIHdvcmtzIHRoZSBzYW1lIGFzIGJlZm9yZQorCitUeXBlczoKK3doZW4gd3JpdHRlbiBsaW5lIGJ5IGxpbmUgOgorCQkJCQlrZXkxIDogdmFsMQorCQkJCQlrZXkyIDogdmFsMgora2V5MSBhbmQgdmFsIGRvZXMgbm90IG5lZWQgIiAgICAiICwgZXZlbiBpZiB2YWwxIGlzIGEgc3RyaW5nLgorCit3aGVuIHdyaXR0ZW4gYXMgb25lIGxpbmUgOiB7ImtleTEiOnZhbDEgLCAia2V5MiI6dmFsMn0KK0tleXMgYWx3YXlzIG5lZWQgIiAiIGFyb3VuZCB0aGVtLgorICovCitwdWJsaWMgY2xhc3MgTWFwVmFsaWRhdG9yIGltcGxlbWVudHMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHsKKworCXByaXZhdGUgc3RhdGljIE1hcFZhbGlkYXRvciBtYXBWYWxpZGF0b3IgPSBuZXcgTWFwVmFsaWRhdG9yKCk7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWFwVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSk7CisJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCXByaXZhdGUgc3RhdGljIERhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyIGRhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyID0gRGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKTsKKworCXByaXZhdGUgc3RhdGljIEpzb25QYXJzZXIganNvblBhcnNlciA9IG5ldyBKc29uUGFyc2VyKCk7CisKKwlwdWJsaWMgc3RhdGljIE1hcFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG1hcFZhbGlkYXRvcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSwgTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMpIHsKKworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSAiIikgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGlubmVyVHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlQcm9wZXJ0eVR5cGVWYWxpZGF0b3IgaW5uZXJWYWxpZGF0b3I7CisJCVByb3BlcnR5VHlwZVZhbGlkYXRvciBrZXlWYWxpZGF0b3IgPSBUb3NjYVByb3BlcnR5VHlwZS5LRVkuZ2V0VmFsaWRhdG9yKCk7CisJCVRvc2NhUHJvcGVydHlUeXBlIGlubmVyVG9zY2FUeXBlID0gVG9zY2FQcm9wZXJ0eVR5cGUuaXNWYWxpZFR5cGUoaW5uZXJUeXBlKTsKKworCQlpZiAoaW5uZXJUb3NjYVR5cGUgIT0gbnVsbCkgeworCQkJc3dpdGNoIChpbm5lclRvc2NhVHlwZSkgeworCQkJY2FzZSBTVFJJTkc6CisJCQkJaW5uZXJWYWxpZGF0b3IgPSBUb3NjYVByb3BlcnR5VHlwZS5TVFJJTkcuZ2V0VmFsaWRhdG9yKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVHRVI6CisJCQkJaW5uZXJWYWxpZGF0b3IgPSBUb3NjYVByb3BlcnR5VHlwZS5JTlRFR0VSLmdldFZhbGlkYXRvcigpOworCQkJCWJyZWFrOworCQkJY2FzZSBGTE9BVDoKKwkJCQlpbm5lclZhbGlkYXRvciA9IFRvc2NhUHJvcGVydHlUeXBlLkZMT0FULmdldFZhbGlkYXRvcigpOworCQkJCWJyZWFrOworCQkJY2FzZSBCT09MRUFOOgorCQkJCWlubmVyVmFsaWRhdG9yID0gVG9zY2FQcm9wZXJ0eVR5cGUuQk9PTEVBTi5nZXRWYWxpZGF0b3IoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSlNPTjoKKwkJCQlpbm5lclZhbGlkYXRvciA9IFRvc2NhUHJvcGVydHlUeXBlLkpTT04uZ2V0VmFsaWRhdG9yKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWxvZy5kZWJ1ZygiaW5uZXIgVG9zY2EgVHlwZSBpcyB1bmtub3duOiB7fSIsIGlubmVyVG9zY2FUeXBlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWxvZy5kZWJ1ZygiaW5uZXIgVG9zY2EgVHlwZSBpczoge30iLCBpbm5lclR5cGUpOworCisJCQlib29sZWFuIGlzVmFsaWQgPSB2YWxpZGF0ZUNvbXBsZXhJbm5lclR5cGUodmFsdWUsIGlubmVyVHlwZSwgYWxsRGF0YVR5cGVzKTsKKwkJCWxvZy5kZWJ1ZygiRmluaXNoIHRvIHZhbGlkYXRlIHZhbHVlIHt9IG9mIG1hcCB3aXRoIGlubmVyIHR5cGUge30uIFJlc3VsdCBpcyB7fSIsIHZhbHVlLCBpbm5lclR5cGUsIGlzVmFsaWQpOworCQkJcmV0dXJuIGlzVmFsaWQ7CisKKwkJfQorCisJCXRyeSB7CisJCQlKc29uRWxlbWVudCBqc29uT2JqZWN0ID0ganNvblBhcnNlci5wYXJzZSh2YWx1ZSk7CisJCQlKc29uT2JqZWN0IGFzSnNvbk9iamVjdCA9IGpzb25PYmplY3QuZ2V0QXNKc29uT2JqZWN0KCk7CisJCQlTZXQ8RW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4+IGVudHJ5U2V0ID0gYXNKc29uT2JqZWN0LmVudHJ5U2V0KCk7CisJCQlmb3IgKEVudHJ5PFN0cmluZywgSnNvbkVsZW1lbnQ+IGVudHJ5IDogZW50cnlTZXQpIHsKKwkJCQlTdHJpbmcgY3VycmVudEtleSA9IGVudHJ5LmdldEtleSgpOworCQkJCUpzb25FbGVtZW50IGpzb25WYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQlTdHJpbmcgZWxlbWVudCA9IEpzb25VdGlscy50b1N0cmluZyhqc29uVmFsdWUpOworCisJCQkJaWYgKCFpbm5lclZhbGlkYXRvci5pc1ZhbGlkKGVsZW1lbnQsIG51bGwsIGFsbERhdGFUeXBlcykKKwkJCQkJCXx8ICFrZXlWYWxpZGF0b3IuaXNWYWxpZChlbnRyeS5nZXRLZXkoKSwgbnVsbCwgYWxsRGF0YVR5cGVzKSkgeworCQkJCQlsb2cuZGVidWcoInZhbGlkYXRpb24gb2Yga2V5IDoge30sIGVsZW1lbnQ6IHt9IGZhaWxlZCIsIGN1cnJlbnRLZXksIGVudHJ5LmdldFZhbHVlKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoSnNvblN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBwYXJzZSBqc29uIDoge30uIHt9IiwgdmFsdWUsIGUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0JlSW52YWxpZEpzb25JbnB1dCgiTWFwIFZhbGlkYXRvciIpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCisJfQorCisJcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQ29tcGxleElubmVyVHlwZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUsCisJCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCURhdGFUeXBlRGVmaW5pdGlvbiBpbm5lckRhdGFUeXBlRGVmaW5pdGlvbiA9IGFsbERhdGFUeXBlcy5nZXQoaW5uZXJUeXBlKTsKKwkJaWYgKGlubmVyRGF0YVR5cGVEZWZpbml0aW9uID09IG51bGwpIHsKKwkJCWxvZy5kZWJ1ZygiRGF0YSB0eXBlIHt9IGNhbm5vdCBiZSBmb3VuZCBpbiBvdXIgZGF0YSB0eXBlcy4iLCBpbm5lclR5cGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJdHJ5IHsKKwkJCUpzb25FbGVtZW50IGpzb25PYmplY3QgPSBqc29uUGFyc2VyLnBhcnNlKHZhbHVlKTsKKwkJCUpzb25PYmplY3QgYXNKc29uT2JqZWN0ID0ganNvbk9iamVjdC5nZXRBc0pzb25PYmplY3QoKTsKKwkJCVNldDxFbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50Pj4gZW50cnlTZXQgPSBhc0pzb25PYmplY3QuZW50cnlTZXQoKTsKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4gZW50cnkgOiBlbnRyeVNldCkgeworCQkJCVN0cmluZyBjdXJyZW50S2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJSnNvbkVsZW1lbnQgY3VycmVudFZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKworCQkJCWlmIChjdXJyZW50VmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZWxlbWVudCA9IEpzb25VdGlscy50b1N0cmluZyhjdXJyZW50VmFsdWUpOworCQkJCQlib29sZWFuIGlzVmFsaWQgPSBkYXRhVHlwZVZhbGlkYXRvckNvbnZlcnRlci5pc1ZhbGlkKGVsZW1lbnQsIGlubmVyRGF0YVR5cGVEZWZpbml0aW9uLAorCQkJCQkJCWFsbERhdGFUeXBlcyk7CisJCQkJCWlmIChpc1ZhbGlkID09IGZhbHNlKSB7CisJCQkJCQlsb2cuZGVidWcoIkNhbm5vdCBwYXJzZSB2YWx1ZSB7fSBmcm9tIHR5cGUge30gb2Yga2V5IHt9IiwgY3VycmVudFZhbHVlLCBpbm5lclR5cGUsIGN1cnJlbnRLZXkpOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkNhbm5vdCBwYXJzZSB2YWx1ZSB7fSBvZiBtYXAgZnJvbSBpbm5lciB0eXBlIHt9LiB7fSIsIHZhbHVlLCBpbm5lclR5cGUsIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUpIHsKKwkJcmV0dXJuIGlzVmFsaWQodmFsdWUsIGlubmVyVHlwZSwgbnVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvUHJvcGVydHlUeXBlVmFsaWRhdG9yLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9Qcm9wZXJ0eVR5cGVWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg2MjE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvUHJvcGVydHlUeXBlVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5VHlwZVZhbGlkYXRvciB7CisKKwlib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyk7CisKKwlib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlKTsKKwkvKgorCSAqIFRoZSB2YWx1ZSBmb3JtYXQgc2hvdWxkIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIOKAnFByb3BlcnR5IFR5cGXvv70/IDoKKwkgKiDigJxpbnRlZ2Vy77+9PyAtIHZhbGlkIHRhZzp5YW1sLm9yZywyMDAyOmludCAsIHRoZSBudW1iZXIgYmFzZSA4LDEwLDE4IHNob3VsZAorCSAqIGJlIGhhbmRsZWQgKCBoaW50IDogdG8gdmFsaWRhdGUgYnkgY2FsbGluZyBwYXJzZUludCgKKwkgKiBzLDEwKS9wYXJzZUludChzLDE2KS9wYXJzZUludChzLDgpIG9yIGp1c3QgcmVnZXhwIFstK10/WzAtOV0rIGZvciBCYXNlIDEwCisJICogLCBbLStdPzBbMC03XSsgZm9yIEJhc2UgOCAsIFstK10/MHhbMC05YS1mQS1GXSsgZm9yIEJhc2UgMTYKKwkgKiAKKwkgKiDigJxmbG9hdO+/vT8gLSB2YWxpZCB0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCAsIHBhcnNlRmxvYXQoKSDigJxib29sZWFu77+9PyAtIHZhbGlkCisJICogdGFnOnlhbWwub3JnLDIwMDI6Ym9vbCA6IGNhbiBiZSBvbmx5IOKAnHRydWXvv70/IG9yIOKAnGZhbHNl77+9PyAoIHVwcGVyIGNhc2UKKwkgKiBjaGFyYWN0ZXJzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSA6IFRSVUUgLT50cnVlLCBUcnVlLT50cnVlCisJICog4oCcc3RyaW5n77+9PyAtIHZhbGlkIHRhZzp5YW1sLm9yZywyMDAyOnN0ciBhbmQgbGltaXRlZCB0byAxMDAgY2hhcnMuCisJICogCisJICovCisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL1N0cmluZ1ZhbGlkYXRvci5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvU3RyaW5nVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5OTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL1N0cmluZ1ZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52YWxpZGF0b3JzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbi5Ub3NjYVZhbGlkYXRvcnNDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGF0YVR5cGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgU3RyaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgUHJvcGVydHlUeXBlVmFsaWRhdG9yIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU1RSSU5HX01BWElNVU1fTEVOR1RIID0gMTAwOworCisJcHVibGljIHN0YXRpYyBpbnQgU1RSSU5HX01BWElNVU1fTEVOR1RIID0gREVGQVVMVF9TVFJJTkdfTUFYSU1VTV9MRU5HVEg7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RyaW5nVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdWYWxpZGF0b3Igc3RyaW5nVmFsaWRhdG9yID0gbmV3IFN0cmluZ1ZhbGlkYXRvcigpOworCisJcHVibGljIHN0YXRpYyBTdHJpbmdWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBzdHJpbmdWYWxpZGF0b3I7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdWYWxpZGF0b3IoKSB7CisJCWlmIChDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpICE9IG51bGwpIHsKKwkJCVRvc2NhVmFsaWRhdG9yc0NvbmZpZyB0b3NjYVZhbGlkYXRvcnMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbmZpZ3VyYXRpb24oKQorCQkJCQkuZ2V0VG9zY2FWYWxpZGF0b3JzKCk7CisJCQlsb2cuZGVidWcoInRvc2NhVmFsaWRhdG9ycz17fSIsIHRvc2NhVmFsaWRhdG9ycyk7CisJCQlpZiAodG9zY2FWYWxpZGF0b3JzICE9IG51bGwpIHsKKwkJCQlJbnRlZ2VyIHN0cmluZ01heExlbmd0aCA9IHRvc2NhVmFsaWRhdG9ycy5nZXRTdHJpbmdNYXhMZW5ndGgoKTsKKwkJCQlpZiAoc3RyaW5nTWF4TGVuZ3RoICE9IG51bGwpIHsKKwkJCQkJU1RSSU5HX01BWElNVU1fTEVOR1RIID0gc3RyaW5nTWF4TGVuZ3RoOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmICh2YWx1ZS5sZW5ndGgoKSA+IFNUUklOR19NQVhJTVVNX0xFTkdUSCkgeworCQkJbG9nLmRlYnVnKCJwYXJhbWV0ZXIgU3RyaW5nIGxlbmd0aCB7fSBpcyBoaWdoZXIgdGhlIGNvbmZpZ3VyZWQoe30pIiwgdmFsdWUubGVuZ3RoKCksIFNUUklOR19NQVhJTVVNX0xFTkdUSCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU3RyaW5nIGNvdmVydGVkID0gVmFsaWRhdGlvblV0aWxzLnJlbW92ZU5vbmVVdGY4Q2hhcnModmFsdWUpOworCQlib29sZWFuIGlzVmFsaWQgPSBWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJc0FzY2lpKGNvdmVydGVkKTsKKworCQlpZiAoZmFsc2UgPT0gaXNWYWxpZCkgeworCQkJbG9nLmRlYnVnKCJwYXJhbWV0ZXIgU3RyaW5nIHZhbHVlIHt9IGlzIG5vdCBhc2NpaSBzdHJpbmcuIiwgKHZhbHVlICE9IG51bGwgPyB2YWx1ZS5zdWJzdHJpbmcoMCwgTWF0aC5taW4odmFsdWUubGVuZ3RoKCksIDIwKSkgOiBudWxsKSk7CisJCX0KKworCQlyZXR1cm4gaXNWYWxpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGlubmVyVHlwZSkgeworCQlyZXR1cm4gaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9Ub3NjYUJvb2xlYW5WYWxpZGF0b3IuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL1Rvc2NhQm9vbGVhblZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGRmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmFsaWRhdG9ycy9Ub3NjYUJvb2xlYW5WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIFRvc2NhQm9vbGVhblZhbGlkYXRvciBpbXBsZW1lbnRzIFByb3BlcnR5VHlwZVZhbGlkYXRvciB7CisKKwlwcml2YXRlIHN0YXRpYyBUb3NjYUJvb2xlYW5WYWxpZGF0b3IgYm9vbGVhblZhbGlkYXRvciA9IG5ldyBUb3NjYUJvb2xlYW5WYWxpZGF0b3IoKTsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHZhbGlkVmFsdWVzID0geyAidHJ1ZSIsICJvbiIsICJ5ZXMiLCAieSIsICJmYWxzZSIsICJvZmYiLCAibm8iLCAibiIgfTsKKworCXB1YmxpYyBzdGF0aWMgVG9zY2FCb29sZWFuVmFsaWRhdG9yIGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gYm9vbGVhblZhbGlkYXRvcjsKKwl9CisKKwlwcml2YXRlIFRvc2NhQm9vbGVhblZhbGlkYXRvcigpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaW5uZXJUeXBlLCBNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGRhdGFUeXBlcykgeworCisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHRydWUgPT0gdmFsdWUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiAoQXJyYXlzLnN0cmVhbSh2YWxpZFZhbHVlcykuZmlsdGVyKHN0ciAtPiBzdHIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpLnRvQXJyYXkoKS5sZW5ndGggPT0gMSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIFN0cmluZyBpbm5lclR5cGUpIHsKKwkJcmV0dXJuIGlzVmFsaWQodmFsdWUsIGlubmVyVHlwZSwgbnVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZlcnNpb24vQXBwbGljYXRpb25WZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmVyc2lvbi9BcHBsaWNhdGlvblZlcnNpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWRmZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZlcnNpb24vQXBwbGljYXRpb25WZXJzaW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZlcnNpb247CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5leGNlcHRpb24uVGVjaG5pY2FsRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25WZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgVGVjaG5pY2FsRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MTkyODM0ODU1MDU3MTc3MjUyTDsKKworCXB1YmxpYyBBcHBsaWNhdGlvblZlcnNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJcHVibGljIEFwcGxpY2F0aW9uVmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmVyc2lvbi9Db21wYXJhYmxlVmVyc2lvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZlcnNpb24vQ29tcGFyYWJsZVZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVkOGJmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZlcnNpb24vQ29tcGFyYWJsZVZlcnNpb24uamF2YQpAQCAtMCwwICsxLDQ2MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZlcnNpb247CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqCisgKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHZlcnNpb24gY29tcGFyaXNvbi4KKyAqIAorICogPHA+CisgKiBGZWF0dXJlczoKKyAqIDx1bD4KKyAqIDxsaT5taXhpbmcgb2YgJzxjb2RlPi08L2NvZGU+JyAoZGFzaCkgYW5kICc8Y29kZT4uPC9jb2RlPicgKGRvdCkKKyAqIHNlcGFyYXRvcnMsPC9saT4KKyAqIDxsaT50cmFuc2l0aW9uIGJldHdlZW4gY2hhcmFjdGVycyBhbmQgZGlnaXRzIGFsc28gY29uc3RpdHV0ZXMgYSBzZXBhcmF0b3I6CisgKiA8Y29kZT4xLjBhbHBoYTEgPSZndDsgWzEsIDAsIGFscGhhLCAxXTwvY29kZT48L2xpPgorICogPGxpPnVubGltaXRlZCBudW1iZXIgb2YgdmVyc2lvbiBjb21wb25lbnRzLDwvbGk+CisgKiA8bGk+dmVyc2lvbiBjb21wb25lbnRzIGluIHRoZSB0ZXh0IGNhbiBiZSBkaWdpdHMgb3Igc3RyaW5ncyw8L2xpPgorICogPGxpPnN0cmluZ3MgYXJlIGNoZWNrZWQgZm9yIHdlbGwta25vd24gcXVhbGlmaWVycyBhbmQgdGhlIHF1YWxpZmllciBvcmRlcmluZworICogaXMgdXNlZCBmb3IgdmVyc2lvbiBvcmRlcmluZy4gV2VsbC1rbm93biBxdWFsaWZpZXJzIChjYXNlIGluc2Vuc2l0aXZlKSBhcmU6CisgKiA8dWw+CisgKiA8bGk+PGNvZGU+YWxwaGE8L2NvZGU+IG9yIDxjb2RlPmE8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5iZXRhPC9jb2RlPiBvciA8Y29kZT5iPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+bWlsZXN0b25lPC9jb2RlPiBvciA8Y29kZT5tPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+cmM8L2NvZGU+IG9yIDxjb2RlPmNyPC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+c25hcHNob3Q8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT4odGhlIGVtcHR5IHN0cmluZyk8L2NvZGU+IG9yIDxjb2RlPmdhPC9jb2RlPiBvcgorICogPGNvZGU+ZmluYWw8L2NvZGU+PC9saT4KKyAqIDxsaT48Y29kZT5zcDwvY29kZT48L2xpPgorICogPC91bD4KKyAqIFVua25vd24gcXVhbGlmaWVycyBhcmUgY29uc2lkZXJlZCBhZnRlciBrbm93biBxdWFsaWZpZXJzLCB3aXRoIGxleGljYWwgb3JkZXIKKyAqIChhbHdheXMgY2FzZSBpbnNlbnNpdGl2ZSksPC9saT4KKyAqIDxsaT5hIGRhc2ggdXN1YWxseSBwcmVjZWRlcyBhIHF1YWxpZmllciwgYW5kIGlzIGFsd2F5cyBsZXNzIGltcG9ydGFudCB0aGFuCisgKiBzb21ldGhpbmcgcHJlY2VkZWQgd2l0aCBhIGRvdC48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIAorICogQHNlZSA8YSBocmVmPQorICogICAgICAiaHR0cHM6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9NQVZFTk9MRC9WZXJzaW9uaW5nIj4iVmVyc2lvbmluZyIKKyAqICAgICAgb24gTWF2ZW4gV2lraTwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtlbm5leUBhcGFjaGUub3JnIj5LZW5uZXkgV2VzdGVyaG9mPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86aGJvdXRlbXlAYXBhY2hlLm9yZyI+SGVydsOpIEJvdXRlbXk8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYXJhYmxlVmVyc2lvbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8Q29tcGFyYWJsZVZlcnNpb24+IHsKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCXByaXZhdGUgU3RyaW5nIGNhbm9uaWNhbDsKKworCXByaXZhdGUgTGlzdEl0ZW0gaXRlbXM7CisKKwlwcml2YXRlIGludGVyZmFjZSBJdGVtIHsKKwkJaW50IElOVEVHRVJfSVRFTSA9IDA7CisJCWludCBTVFJJTkdfSVRFTSA9IDE7CisJCWludCBMSVNUX0lURU0gPSAyOworCisJCWludCBjb21wYXJlVG8oSXRlbSBpdGVtKTsKKworCQlpbnQgZ2V0VHlwZSgpOworCisJCWJvb2xlYW4gaXNOdWxsKCk7CisJfQorCisJLyoqCisJICogUmVwcmVzZW50cyBhIG51bWVyaWMgaXRlbSBpbiB0aGUgdmVyc2lvbiBpdGVtIGxpc3QuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW50ZWdlckl0ZW0gaW1wbGVtZW50cyBJdGVtIHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCSUdfSU5URUdFUl9aRVJPID0gbmV3IEJpZ0ludGVnZXIoIjAiKTsKKworCQlwcml2YXRlIGZpbmFsIEJpZ0ludGVnZXIgdmFsdWU7CisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VySXRlbSBaRVJPID0gbmV3IEludGVnZXJJdGVtKCk7CisKKwkJcHJpdmF0ZSBJbnRlZ2VySXRlbSgpIHsKKwkJCXRoaXMudmFsdWUgPSBCSUdfSU5URUdFUl9aRVJPOworCQl9CisKKwkJcHVibGljIEludGVnZXJJdGVtKFN0cmluZyBzdHIpIHsKKwkJCXRoaXMudmFsdWUgPSBuZXcgQmlnSW50ZWdlcihzdHIpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiBJTlRFR0VSX0lURU07CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgeworCQkJcmV0dXJuIEJJR19JTlRFR0VSX1pFUk8uZXF1YWxzKHZhbHVlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhJdGVtIGl0ZW0pIHsKKwkJCWlmIChpdGVtID09IG51bGwpIHsKKwkJCQlyZXR1cm4gQklHX0lOVEVHRVJfWkVSTy5lcXVhbHModmFsdWUpID8gMCA6IDE7IC8vIDEuMCA9PSAxLCAxLjEKKwkJCQkJCQkJCQkJCQkJCQkvLyA+IDEKKwkJCX0KKworCQkJc3dpdGNoIChpdGVtLmdldFR5cGUoKSkgeworCQkJY2FzZSBJTlRFR0VSX0lURU06CisJCQkJcmV0dXJuIHZhbHVlLmNvbXBhcmVUbygoKEludGVnZXJJdGVtKSBpdGVtKS52YWx1ZSk7CisKKwkJCWNhc2UgU1RSSU5HX0lURU06CisJCQkJcmV0dXJuIDE7IC8vIDEuMSA+IDEtc3AKKworCQkJY2FzZSBMSVNUX0lURU06CisJCQkJcmV0dXJuIDE7IC8vIDEuMSA+IDEtMQorCisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGl0ZW06ICIgKyBpdGVtLmdldENsYXNzKCkpOworCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlcHJlc2VudHMgYSBzdHJpbmcgaW4gdGhlIHZlcnNpb24gaXRlbSBsaXN0LCB1c3VhbGx5IGEgcXVhbGlmaWVyLgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ0l0ZW0gaW1wbGVtZW50cyBJdGVtIHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUVVBTElGSUVSUyA9IHsgImFscGhhIiwgImJldGEiLCAibWlsZXN0b25lIiwgInJjIiwgInNuYXBzaG90IiwgIiIsICJzcCIgfTsKKworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gX1FVQUxJRklFUlMgPSBBcnJheXMuYXNMaXN0KFFVQUxJRklFUlMpOworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnRpZXMgQUxJQVNFUyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCXN0YXRpYyB7CisJCQlBTElBU0VTLnB1dCgiZ2EiLCAiIik7CisJCQlBTElBU0VTLnB1dCgiZmluYWwiLCAiIik7CisJCQlBTElBU0VTLnB1dCgiY3IiLCAicmMiKTsKKwkJfQorCisJCS8qKgorCQkgKiBBIGNvbXBhcmFibGUgdmFsdWUgZm9yIHRoZSBlbXB0eS1zdHJpbmcgcXVhbGlmaWVyLiBUaGlzIG9uZSBpcyB1c2VkCisJCSAqIHRvIGRldGVybWluZSBpZiBhIGdpdmVuIHF1YWxpZmllciBtYWtlcyB0aGUgdmVyc2lvbiBvbGRlciB0aGFuIG9uZQorCQkgKiB3aXRob3V0IGEgcXVhbGlmaWVyLCBvciBtb3JlIHJlY2VudC4KKwkJICovCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxFQVNFX1ZFUlNJT05fSU5ERVggPSBTdHJpbmcudmFsdWVPZihfUVVBTElGSUVSUy5pbmRleE9mKCIiKSk7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZ0l0ZW0oU3RyaW5nIHZhbHVlLCBib29sZWFuIGZvbGxvd2VkQnlEaWdpdCkgeworCQkJaWYgKGZvbGxvd2VkQnlEaWdpdCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAxKSB7CisJCQkJLy8gYTEgPSBhbHBoYS0xLCBiMSA9IGJldGEtMSwgbTEgPSBtaWxlc3RvbmUtMQorCQkJCXN3aXRjaCAodmFsdWUuY2hhckF0KDApKSB7CisJCQkJY2FzZSAnYSc6CisJCQkJCXZhbHVlID0gImFscGhhIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnYic6CisJCQkJCXZhbHVlID0gImJldGEiOworCQkJCQlicmVhazsKKwkJCQljYXNlICdtJzoKKwkJCQkJdmFsdWUgPSAibWlsZXN0b25lIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJdGhpcy52YWx1ZSA9IEFMSUFTRVMuZ2V0UHJvcGVydHkodmFsdWUsIHZhbHVlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCQlyZXR1cm4gU1RSSU5HX0lURU07CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgeworCQkJcmV0dXJuIChjb21wYXJhYmxlUXVhbGlmaWVyKHZhbHVlKS5jb21wYXJlVG8oUkVMRUFTRV9WRVJTSU9OX0lOREVYKSA9PSAwKTsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIGEgY29tcGFyYWJsZSB2YWx1ZSBmb3IgYSBxdWFsaWZpZXIuCisJCSAqIAorCQkgKiBUaGlzIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIG9yZGVyaW5nIG9mIGtub3duIHF1YWxpZmllcnMgdGhlbgorCQkgKiB1bmtub3duIHF1YWxpZmllcnMgd2l0aCBsZXhpY2FsIG9yZGVyaW5nLgorCQkgKiAKKwkJICoganVzdCByZXR1cm5pbmcgYW4gSW50ZWdlciB3aXRoIHRoZSBpbmRleCBoZXJlIGlzIGZhc3RlciwgYnV0IHJlcXVpcmVzCisJCSAqIGEgbG90IG9mIGlmL3RoZW4vZWxzZSB0byBjaGVjayBmb3IgLTEgb3IgUVVBTElGSUVSUy5zaXplIGFuZCB0aGVuCisJCSAqIHJlc29ydCB0byBsZXhpY2FsIG9yZGVyaW5nLiBNb3N0IGNvbXBhcmlzb25zIGFyZSBkZWNpZGVkIGJ5IHRoZSBmaXJzdAorCQkgKiBjaGFyYWN0ZXIsIHNvIHRoaXMgaXMgc3RpbGwgZmFzdC4gSWYgbW9yZSBjaGFyYWN0ZXJzIGFyZSBuZWVkZWQgdGhlbgorCQkgKiBpdCByZXF1aXJlcyBhIGxleGljYWwgc29ydCBhbnl3YXkuCisJCSAqIAorCQkgKiBAcGFyYW0gcXVhbGlmaWVyCisJCSAqIEByZXR1cm4gYW4gZXF1aXZhbGVudCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbGV4aWNhbCBjb21wYXJpc29uCisJCSAqLworCQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wYXJhYmxlUXVhbGlmaWVyKFN0cmluZyBxdWFsaWZpZXIpIHsKKwkJCWludCBpID0gX1FVQUxJRklFUlMuaW5kZXhPZihxdWFsaWZpZXIpOworCisJCQlyZXR1cm4gaSA9PSAtMSA/IChfUVVBTElGSUVSUy5zaXplKCkgKyAiLSIgKyBxdWFsaWZpZXIpIDogU3RyaW5nLnZhbHVlT2YoaSk7CisJCX0KKworCQkvLyBAT3ZlcnJpZGUKKwkJcHVibGljIGludCBjb21wYXJlVG8oSXRlbSBpdGVtKSB7CisJCQlpZiAoaXRlbSA9PSBudWxsKSB7CisJCQkJLy8gMS1yYyA8IDEsIDEtZ2EgPiAxCisJCQkJcmV0dXJuIGNvbXBhcmFibGVRdWFsaWZpZXIodmFsdWUpLmNvbXBhcmVUbyhSRUxFQVNFX1ZFUlNJT05fSU5ERVgpOworCQkJfQorCQkJc3dpdGNoIChpdGVtLmdldFR5cGUoKSkgeworCQkJY2FzZSBJTlRFR0VSX0lURU06CisJCQkJcmV0dXJuIC0xOyAvLyAxLmFueSA8IDEuMSA/CisKKwkJCWNhc2UgU1RSSU5HX0lURU06CisJCQkJcmV0dXJuIGNvbXBhcmFibGVRdWFsaWZpZXIodmFsdWUpLmNvbXBhcmVUbyhjb21wYXJhYmxlUXVhbGlmaWVyKCgoU3RyaW5nSXRlbSkgaXRlbSkudmFsdWUpKTsKKworCQkJY2FzZSBMSVNUX0lURU06CisJCQkJcmV0dXJuIC0xOyAvLyAxLmFueSA8IDEtMQorCisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGl0ZW06ICIgKyBpdGVtLmdldENsYXNzKCkpOworCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXByZXNlbnRzIGEgdmVyc2lvbiBsaXN0IGl0ZW0uIFRoaXMgY2xhc3MgaXMgdXNlZCBib3RoIGZvciB0aGUgZ2xvYmFsCisJICogaXRlbSBsaXN0IGFuZCBmb3Igc3ViLWxpc3RzICh3aGljaCBzdGFydCB3aXRoICctKG51bWJlciknIGluIHRoZSB2ZXJzaW9uCisJICogc3BlY2lmaWNhdGlvbikuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdEl0ZW0gZXh0ZW5kcyBBcnJheUxpc3Q8SXRlbT4gaW1wbGVtZW50cyBJdGVtIHsKKworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDc0MDIyNjc0MTAwMTE0OTY1N0w7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKwkJCXJldHVybiBMSVNUX0lURU07CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgeworCQkJcmV0dXJuIChzaXplKCkgPT0gMCk7CisJCX0KKworCQl2b2lkIG5vcm1hbGl6ZSgpIHsKKwkJCWZvciAoTGlzdEl0ZXJhdG9yPEl0ZW0+IGl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yKHNpemUoKSk7IGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7KSB7CisJCQkJSXRlbSBpdGVtID0gaXRlcmF0b3IucHJldmlvdXMoKTsKKwkJCQlpZiAoaXRlbS5pc051bGwoKSkgeworCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsgLy8gcmVtb3ZlIG51bGwgdHJhaWxpbmcgaXRlbXM6IDAsICIiLAorCQkJCQkJCQkJCS8vIGVtcHR5IGxpc3QKKwkJCQl9IGVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBjb21wYXJlVG8oSXRlbSBpdGVtKSB7CisJCQlpZiAoaXRlbSA9PSBudWxsKSB7CisJCQkJaWYgKHNpemUoKSA9PSAwKSB7CisJCQkJCXJldHVybiAwOyAvLyAxLTAgPSAxLSAobm9ybWFsaXplKSA9IDEKKwkJCQl9CisJCQkJSXRlbSBmaXJzdCA9IGdldCgwKTsKKwkJCQlyZXR1cm4gZmlyc3QuY29tcGFyZVRvKG51bGwpOworCQkJfQorCQkJc3dpdGNoIChpdGVtLmdldFR5cGUoKSkgeworCQkJY2FzZSBJTlRFR0VSX0lURU06CisJCQkJcmV0dXJuIC0xOyAvLyAxLTEgPCAxLjAueAorCisJCQljYXNlIFNUUklOR19JVEVNOgorCQkJCXJldHVybiAxOyAvLyAxLTEgPiAxLXNwCisKKwkJCWNhc2UgTElTVF9JVEVNOgorCQkJCUl0ZXJhdG9yPEl0ZW0+IGxlZnQgPSBpdGVyYXRvcigpOworCQkJCUl0ZXJhdG9yPEl0ZW0+IHJpZ2h0ID0gKChMaXN0SXRlbSkgaXRlbSkuaXRlcmF0b3IoKTsKKworCQkJCXdoaWxlIChsZWZ0Lmhhc05leHQoKSB8fCByaWdodC5oYXNOZXh0KCkpIHsKKwkJCQkJSXRlbSBsID0gbGVmdC5oYXNOZXh0KCkgPyBsZWZ0Lm5leHQoKSA6IG51bGw7CisJCQkJCUl0ZW0gciA9IHJpZ2h0Lmhhc05leHQoKSA/IHJpZ2h0Lm5leHQoKSA6IG51bGw7CisKKwkJCQkJaW50IHJlc3VsdCA9IDA7CisJCQkJCWlmIChyICE9IG51bGwgJiYgbCAhPSBudWxsKSB7CisJCQkJCQlyZXN1bHQgPSBsLmNvbXBhcmVUbyhyKTsKKwkJCQkJfSBlbHNlIGlmIChyID09IG51bGwgJiYgbCA9PSBudWxsKSB7CisJCQkJCQlyZXN1bHQgPSAwOworCQkJCQl9IGVsc2UgaWYgKGwgPT0gbnVsbCkgeworCQkJCQkJcmVzdWx0ID0gLTE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXN1bHQgPSAxOworCQkJCQl9CisKKwkJCQkJLy8gaWYgdGhpcyBpcyBzaG9ydGVyLCB0aGVuIGludmVydCB0aGUgY29tcGFyZSBhbmQgbXVsIHdpdGgKKwkJCQkJLy8gLTEKKwkJCQkJLy8gaW50IHJlc3VsdCA9IChsID09IG51bGwgPyAociA9PSBudWxsID8gMCA6IC0xICoKKwkJCQkJLy8gci5jb21wYXJlVG8obCkpIDogbC5jb21wYXJlVG8ocikpOworCisJCQkJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiAwOworCisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGl0ZW06ICIgKyBpdGVtLmdldENsYXNzKCkpOworCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCIoIik7CisJCQlmb3IgKEl0ZXJhdG9yPEl0ZW0+IGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCQlidWZmZXIuYXBwZW5kKGl0ZXIubmV4dCgpKTsKKwkJCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJYnVmZmVyLmFwcGVuZCgnLCcpOworCQkJCX0KKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoJyknKTsKKwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwkJfQorCX0KKworCXB1YmxpYyBDb21wYXJhYmxlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQlwYXJzZVZlcnNpb24odmVyc2lvbik7CisJfQorCisJcHVibGljIGZpbmFsIHZvaWQgcGFyc2VWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmFsdWUgPSB2ZXJzaW9uOworCisJCWl0ZW1zID0gbmV3IExpc3RJdGVtKCk7CisKKwkJdmVyc2lvbiA9IHZlcnNpb24udG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworCisJCUxpc3RJdGVtIGxpc3QgPSBpdGVtczsKKworCQlTdGFjazxJdGVtPiBzdGFjayA9IG5ldyBTdGFjazxJdGVtPigpOworCQlzdGFjay5wdXNoKGxpc3QpOworCisJCWJvb2xlYW4gaXNEaWdpdCA9IGZhbHNlOworCisJCWludCBzdGFydEluZGV4ID0gMDsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb24ubGVuZ3RoKCk7IGkrKykgeworCQkJY2hhciBjID0gdmVyc2lvbi5jaGFyQXQoaSk7CisKKwkJCWlmIChjID09ICcuJykgeworCQkJCWlmIChpID09IHN0YXJ0SW5kZXgpIHsKKwkJCQkJbGlzdC5hZGQoSW50ZWdlckl0ZW0uWkVSTyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGlzdC5hZGQocGFyc2VJdGVtKGlzRGlnaXQsIHZlcnNpb24uc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGkpKSk7CisJCQkJfQorCQkJCXN0YXJ0SW5kZXggPSBpICsgMTsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnLScpIHsKKwkJCQlpZiAoaSA9PSBzdGFydEluZGV4KSB7CisJCQkJCWxpc3QuYWRkKEludGVnZXJJdGVtLlpFUk8pOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3QuYWRkKHBhcnNlSXRlbShpc0RpZ2l0LCB2ZXJzaW9uLnN1YnN0cmluZyhzdGFydEluZGV4LCBpKSkpOworCQkJCX0KKwkJCQlzdGFydEluZGV4ID0gaSArIDE7CisKKwkJCQlpZiAoaXNEaWdpdCkgeworCQkJCQlsaXN0Lm5vcm1hbGl6ZSgpOyAvLyAxLjAtKiA9IDEtKgorCisJCQkJCWlmICgoaSArIDEgPCB2ZXJzaW9uLmxlbmd0aCgpKSAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh2ZXJzaW9uLmNoYXJBdChpICsgMSkpKSB7CisJCQkJCQkvLyBuZXcgTGlzdEl0ZW0gb25seSBpZiBwcmV2aW91cyB3ZXJlIGRpZ2l0cyBhbmQgbmV3CisJCQkJCQkvLyBjaGFyIGlzIGEgZGlnaXQsCisJCQkJCQkvLyBpZSBuZWVkIHRvIGRpZmZlcmVudGlhdGUgb25seSAxLjEgZnJvbSAxLTEKKwkJCQkJCWxpc3QuYWRkKGxpc3QgPSBuZXcgTGlzdEl0ZW0oKSk7CisKKwkJCQkJCXN0YWNrLnB1c2gobGlzdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMpKSB7CisJCQkJaWYgKCFpc0RpZ2l0ICYmIGkgPiBzdGFydEluZGV4KSB7CisJCQkJCWxpc3QuYWRkKG5ldyBTdHJpbmdJdGVtKHZlcnNpb24uc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGkpLCB0cnVlKSk7CisJCQkJCXN0YXJ0SW5kZXggPSBpOworCQkJCX0KKworCQkJCWlzRGlnaXQgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaXNEaWdpdCAmJiBpID4gc3RhcnRJbmRleCkgeworCQkJCQlsaXN0LmFkZChwYXJzZUl0ZW0odHJ1ZSwgdmVyc2lvbi5zdWJzdHJpbmcoc3RhcnRJbmRleCwgaSkpKTsKKwkJCQkJc3RhcnRJbmRleCA9IGk7CisJCQkJfQorCisJCQkJaXNEaWdpdCA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPiBzdGFydEluZGV4KSB7CisJCQlsaXN0LmFkZChwYXJzZUl0ZW0oaXNEaWdpdCwgdmVyc2lvbi5zdWJzdHJpbmcoc3RhcnRJbmRleCkpKTsKKwkJfQorCisJCXdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7CisJCQlsaXN0ID0gKExpc3RJdGVtKSBzdGFjay5wb3AoKTsKKwkJCWxpc3Qubm9ybWFsaXplKCk7CisJCX0KKworCQljYW5vbmljYWwgPSBpdGVtcy50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgc3RhdGljIEl0ZW0gcGFyc2VJdGVtKGJvb2xlYW4gaXNEaWdpdCwgU3RyaW5nIGJ1ZikgeworCQlyZXR1cm4gaXNEaWdpdCA/IG5ldyBJbnRlZ2VySXRlbShidWYpIDogbmV3IFN0cmluZ0l0ZW0oYnVmLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBjb21wYXJlVG8oQ29tcGFyYWJsZVZlcnNpb24gbykgeworCQlyZXR1cm4gaXRlbXMuY29tcGFyZVRvKG8uaXRlbXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJcmV0dXJuIChvIGluc3RhbmNlb2YgQ29tcGFyYWJsZVZlcnNpb24pICYmIGNhbm9uaWNhbC5lcXVhbHMoKChDb21wYXJhYmxlVmVyc2lvbikgbykuY2Fub25pY2FsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gY2Fub25pY2FsLmhhc2hDb2RlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZlcnNpb24vVmVyc2lvbi5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZlcnNpb24vVmVyc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGVlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvdG9zY2EvdmVyc2lvbi9WZXJzaW9uLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS52ZXJzaW9uOworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYXJ0aWZhY3QgdmVyc2lvbmluZy4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnJldHRAYXBhY2hlLm9yZyI+QnJldHQgUG9ydGVyPC9hPgorICovCitwdWJsaWMgY2xhc3MgVmVyc2lvbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8VmVyc2lvbj4geworCXByaXZhdGUgSW50ZWdlciBtYWpvclZlcnNpb247CisKKwlwcml2YXRlIEludGVnZXIgbWlub3JWZXJzaW9uOworCisJcHJpdmF0ZSBJbnRlZ2VyIGluY3JlbWVudGFsVmVyc2lvbjsKKworCXByaXZhdGUgSW50ZWdlciBidWlsZE51bWJlcjsKKworCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllcjsKKworCXByaXZhdGUgQ29tcGFyYWJsZVZlcnNpb24gY29tcGFyYWJsZTsKKworCXB1YmxpYyBWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXBhcnNlVmVyc2lvbih2ZXJzaW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gMTEgKyBjb21wYXJhYmxlLmhhc2hDb2RlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworCQlpZiAodGhpcyA9PSBvdGhlcikgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFZlcnNpb24pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gY29tcGFyZVRvKChWZXJzaW9uKSBvdGhlcikgPT0gMDsKKwl9CisKKwlwdWJsaWMgaW50IGNvbXBhcmVUbyhWZXJzaW9uIG90aGVyVmVyc2lvbikgeworCQlyZXR1cm4gdGhpcy5jb21wYXJhYmxlLmNvbXBhcmVUbyhvdGhlclZlcnNpb24uY29tcGFyYWJsZSk7CisJfQorCisJcHVibGljIGludCBnZXRNYWpvclZlcnNpb24oKSB7CisJCXJldHVybiBtYWpvclZlcnNpb24gIT0gbnVsbCA/IG1ham9yVmVyc2lvbiA6IDA7CisJfQorCisJcHVibGljIGludCBnZXRNaW5vclZlcnNpb24oKSB7CisJCXJldHVybiBtaW5vclZlcnNpb24gIT0gbnVsbCA/IG1pbm9yVmVyc2lvbiA6IDA7CisJfQorCisJcHVibGljIGludCBnZXRJbmNyZW1lbnRhbFZlcnNpb24oKSB7CisJCXJldHVybiBpbmNyZW1lbnRhbFZlcnNpb24gIT0gbnVsbCA/IGluY3JlbWVudGFsVmVyc2lvbiA6IDA7CisJfQorCisJcHVibGljIGludCBnZXRCdWlsZE51bWJlcigpIHsKKwkJcmV0dXJuIGJ1aWxkTnVtYmVyICE9IG51bGwgPyBidWlsZE51bWJlciA6IDA7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZXIoKSB7CisJCXJldHVybiBxdWFsaWZpZXI7CisJfQorCisJcHVibGljIGZpbmFsIHZvaWQgcGFyc2VWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCWNvbXBhcmFibGUgPSBuZXcgQ29tcGFyYWJsZVZlcnNpb24odmVyc2lvbik7CisKKwkJaW50IGluZGV4ID0gdmVyc2lvbi5pbmRleE9mKCItIik7CisKKwkJU3RyaW5nIHBhcnQxOworCQlTdHJpbmcgcGFydDIgPSBudWxsOworCisJCWlmIChpbmRleCA8IDApIHsKKwkJCXBhcnQxID0gdmVyc2lvbjsKKwkJfSBlbHNlIHsKKwkJCXBhcnQxID0gdmVyc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkJcGFydDIgPSB2ZXJzaW9uLnN1YnN0cmluZyhpbmRleCArIDEpOworCQl9CisKKwkJaWYgKHBhcnQyICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJaWYgKChwYXJ0Mi5sZW5ndGgoKSA9PSAxKSB8fCAhcGFydDIuc3RhcnRzV2l0aCgiMCIpKSB7CisJCQkJCWJ1aWxkTnVtYmVyID0gSW50ZWdlci52YWx1ZU9mKHBhcnQyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlxdWFsaWZpZXIgPSBwYXJ0MjsKKwkJCQl9CisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCXF1YWxpZmllciA9IHBhcnQyOworCQkJfQorCQl9CisKKwkJaWYgKCghcGFydDEuY29udGFpbnMoIi4iKSkgJiYgIXBhcnQxLnN0YXJ0c1dpdGgoIjAiKSkgeworCQkJdHJ5IHsKKwkJCQltYWpvclZlcnNpb24gPSBJbnRlZ2VyLnZhbHVlT2YocGFydDEpOworCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBxdWFsaWZpZXIgaXMgdGhlIHdob2xlIHZlcnNpb24sIGluY2x1ZGluZyAiLSIKKwkJCQlxdWFsaWZpZXIgPSB2ZXJzaW9uOworCQkJCWJ1aWxkTnVtYmVyID0gbnVsbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJvb2xlYW4gZmFsbGJhY2sgPSBmYWxzZTsKKworCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGFydDEsICIuIik7CisJCQl0cnkgeworCQkJCW1ham9yVmVyc2lvbiA9IGdldE5leHRJbnRlZ2VyVG9rZW4odG9rKTsKKwkJCQlpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQltaW5vclZlcnNpb24gPSBnZXROZXh0SW50ZWdlclRva2VuKHRvayk7CisJCQkJfQorCQkJCWlmICh0b2suaGFzTW9yZVRva2VucygpKSB7CisJCQkJCWluY3JlbWVudGFsVmVyc2lvbiA9IGdldE5leHRJbnRlZ2VyVG9rZW4odG9rKTsKKwkJCQl9CisJCQkJaWYgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQkJcXVhbGlmaWVyID0gdG9rLm5leHRUb2tlbigpOworCQkJCQlmYWxsYmFjayA9IFBhdHRlcm4uY29tcGlsZSgiXFxkKyIpLm1hdGNoZXIocXVhbGlmaWVyKS5tYXRjaGVzKCk7CisJCQkJfQorCisJCQkJLy8gc3RyaW5nIHRva2VuemllciB3b24ndCBkZXRlY3QgdGhlc2UgYW5kIGlnbm9yZXMgdGhlbQorCQkJCWlmIChwYXJ0MS5jb250YWlucygiLi4iKSB8fCBwYXJ0MS5zdGFydHNXaXRoKCIuIikgfHwgcGFydDEuZW5kc1dpdGgoIi4iKSkgeworCQkJCQlmYWxsYmFjayA9IHRydWU7CisJCQkJfQorCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQlmYWxsYmFjayA9IHRydWU7CisJCQl9CisKKwkJCWlmIChmYWxsYmFjaykgeworCQkJCS8vIHF1YWxpZmllciBpcyB0aGUgd2hvbGUgdmVyc2lvbiwgaW5jbHVkaW5nICItIgorCQkJCXF1YWxpZmllciA9IHZlcnNpb247CisJCQkJbWFqb3JWZXJzaW9uID0gbnVsbDsKKwkJCQltaW5vclZlcnNpb24gPSBudWxsOworCQkJCWluY3JlbWVudGFsVmVyc2lvbiA9IG51bGw7CisJCQkJYnVpbGROdW1iZXIgPSBudWxsOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSW50ZWdlciBnZXROZXh0SW50ZWdlclRva2VuKFN0cmluZ1Rva2VuaXplciB0b2spIHsKKwkJU3RyaW5nIHMgPSB0b2submV4dFRva2VuKCk7CisJCWlmICgocy5sZW5ndGgoKSA+IDEpICYmIHMuc3RhcnRzV2l0aCgiMCIpKSB7CisJCQl0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJOdW1iZXIgcGFydCBoYXMgYSBsZWFkaW5nIDA6ICciICsgcyArICInIik7CisJCX0KKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZihzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gY29tcGFyYWJsZS50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS91bml0dGVzdHMvdXRpbHMvRmFjdG9yeVV0aWxzLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdW5pdHRlc3RzL3V0aWxzL0ZhY3RvcnlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWE4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdW5pdHRlc3RzL3V0aWxzL0ZhY3RvcnlVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUudW5pdHRlc3RzLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaEVkZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb3BlcnR5RGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk9yaWdpblR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudEluc3RhbmNlUHJvcGVydHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5SW5zdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5VmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlcXVpcmVtZW50RGF0YTsKKworcHVibGljIGZpbmFsIGNsYXNzIEZhY3RvcnlVdGlscyB7CisJcHJpdmF0ZSBGYWN0b3J5VXRpbHMoKSB7CisJfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVBBQklMSVRZX1RZUEUgPSAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlVkZXaXRoUkkoU3RyaW5nIHJpVmVyc2lvbikgeworCQlSZXNvdXJjZSB2ZiA9IGNyZWF0ZVZGKCk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpID0gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZVdpdGhWZXJzaW9uKHJpVmVyc2lvbik7CisJCWFkZENvbXBvbmVudEluc3RhbmNlVG9WRih2ZiwgcmkpOworCQlyZXR1cm4gdmY7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVWRigpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJcmVzb3VyY2Uuc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZENvbXBvbmVudEluc3RhbmNlVG9WRihSZXNvdXJjZSB2ZiwgQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSkgeworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiBjb21wb25lbnRzSW5zdGFuY2VzID0gdmYuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkgIT0gbnVsbCA/IHZmLmdldENvbXBvbmVudEluc3RhbmNlcygpCisJCQkJOiBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY29tcG9uZW50c0luc3RhbmNlcy5hZGQocmVzb3VyY2VJbnN0YW5jZSk7CisJCXZmLnNldENvbXBvbmVudEluc3RhbmNlcyhjb21wb25lbnRzSW5zdGFuY2VzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbXBvbmVudEluc3RhbmNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2UoKSB7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpID0gbmV3IENvbXBvbmVudEluc3RhbmNlKCk7CisJCXJpLnNldENvbXBvbmVudFZlcnNpb24oIjAuMSIpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQlyaS5zZXRDb21wb25lbnRVaWQodW5pcXVlSWQpOworCQlyaS5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCXJpLnNldE5hbWUoImdlbmVyaWNSSSIgKyB1bmlxdWVJZCk7CisJCXJpLnNldE9yaWdpblR5cGUoT3JpZ2luVHlwZUVudW0uVkYpOworCQlyZXR1cm4gcmk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbXBvbmVudEluc3RhbmNlIGNyZWF0ZVJlc291cmNlSW5zdGFuY2VXaXRoVmVyc2lvbihTdHJpbmcgcmlWZXJzaW9uKSB7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpID0gY3JlYXRlUmVzb3VyY2VJbnN0YW5jZSgpOworCQlyaS5zZXRDb21wb25lbnRWZXJzaW9uKHJpVmVyc2lvbik7CisJCXJldHVybiByaTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENhcGFiaWxpdHlEYXRhIGNyZWF0ZUNhcGFiaWxpdHlEYXRhKCkgeworCQlDYXBhYmlsaXR5RGF0YSBjYXBEYXRhID0gbmV3IENhcGFiaWxpdHlEYXRhKCk7CisJCVN0cmluZyB1bmlxdWVJZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCWNhcERhdGEuc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCisJCWNhcERhdGEuc2V0VHlwZShDb25zdGFudHMuREVGQVVMVF9DQVBBQklMSVRZX1RZUEUpOworCQlyZXR1cm4gY2FwRGF0YTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlcXVpcmVtZW50RGF0YSBjcmVhdGVSZXF1aXJlbWVudERhdGEoKSB7CisJCVJlcXVpcmVtZW50RGF0YSByZXFEYXRhID0gbmV3IFJlcXVpcmVtZW50RGF0YSgpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQlyZXFEYXRhLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJcmV0dXJuIHJlcURhdGE7CisJfQorCisJcHVibGljIHN0YXRpYyBDYXBhYmlsaXR5RGVmaW5pdGlvbiBjb252ZXJ0Q2FwYWJpbGl0eURhdGFUb0NhcGFiaWxpdHlEZWZpbml0aW9uQWRkUHJvcGVydGllcygKKwkJCUNhcGFiaWxpdHlEYXRhIGNhcERhdGEpIHsKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwRGVmID0gbmV3IENhcGFiaWxpdHlEZWZpbml0aW9uKCk7CisJCWNhcERlZi5zZXROYW1lKCJDYXAyIik7CisJCWNhcERlZi5zZXREZXNjcmlwdGlvbihjYXBEYXRhLmdldERlc2NyaXB0aW9uKCkpOworCQljYXBEZWYuc2V0VW5pcXVlSWQoY2FwRGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJY2FwRGVmLnNldFZhbGlkU291cmNlVHlwZXMoY2FwRGF0YS5nZXRWYWxpZFNvdXJjZVR5cGVzKCkpOworCQljYXBEZWYuc2V0VHlwZShjYXBEYXRhLmdldFR5cGUoKSk7CisJCWNhcERlZi5zZXRQcm9wZXJ0aWVzKG5ldyBBcnJheUxpc3Q8PigpKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBob3N0ID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJaG9zdC5zZXRVbmlxdWVJZChVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpKTsKKwkJaG9zdC5zZXROYW1lKCJob3N0Iik7CisJCWhvc3Quc2V0RGVmYXVsdFZhbHVlKCJkZWZob3N0Iik7CisJCWhvc3Quc2V0VHlwZSgic3RyaW5nIik7CisKKwkJaG9zdC5zZXRTY2hlbWEobmV3IFNjaGVtYURlZmluaXRpb24oKSk7CisJCWhvc3QuZ2V0U2NoZW1hKCkuc2V0UHJvcGVydHkobmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKSk7CisJCWhvc3QuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJzdHJpbmciKTsKKworCQljYXBEZWYuZ2V0UHJvcGVydGllcygpLmFkZChob3N0KTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwb3J0ID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJcG9ydC5zZXROYW1lKCJwb3J0Iik7CisJCXBvcnQuc2V0RGVmYXVsdFZhbHVlKCJkZWZwb3J0Iik7CisJCXBvcnQuc2V0VW5pcXVlSWQoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisJCXBvcnQuc2V0VHlwZSgic3RyaW5nIik7CisKKwkJcG9ydC5zZXRTY2hlbWEobmV3IFNjaGVtYURlZmluaXRpb24oKSk7CisJCXBvcnQuZ2V0U2NoZW1hKCkuc2V0UHJvcGVydHkobmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKSk7CisJCXBvcnQuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJzdHJpbmciKTsKKworCQljYXBEZWYuZ2V0UHJvcGVydGllcygpLmFkZChwb3J0KTsKKwkJcmV0dXJuIGNhcERlZjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eUxpc3QoKSB7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGhvc3QgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlob3N0LnNldFVuaXF1ZUlkKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworCQlob3N0LnNldE5hbWUoImhvc3QiKTsKKwkJaG9zdC5zZXRWYWx1ZSgibmV3aG9zdCIpOworCQlob3N0LnNldFR5cGUoInN0cmluZyIpOworCisJCWhvc3Quc2V0U2NoZW1hKG5ldyBTY2hlbWFEZWZpbml0aW9uKCkpOworCQlob3N0LmdldFNjaGVtYSgpLnNldFByb3BlcnR5KG5ldyBQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkpOworCQlob3N0LmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZSgic3RyaW5nIik7CisKKwkJcHJvcGVydGllcy5hZGQoaG9zdCk7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgcG9ydCA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCXBvcnQuc2V0TmFtZSgicG9ydCIpOworCQlwb3J0LnNldFZhbHVlKCJuZXdwb3J0Iik7CisJCXBvcnQuc2V0VW5pcXVlSWQoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisJCXBvcnQuc2V0VHlwZSgic3RyaW5nIik7CisKKwkJcG9ydC5zZXRTY2hlbWEobmV3IFNjaGVtYURlZmluaXRpb24oKSk7CisJCXBvcnQuZ2V0U2NoZW1hKCkuc2V0UHJvcGVydHkobmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKSk7CisJCXBvcnQuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJzdHJpbmciKTsKKworCQlwcm9wZXJ0aWVzLmFkZChwb3J0KTsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXF1aXJlbWVudERlZmluaXRpb24gY29udmVydFJlcXVpcmVtZW50RGF0YUlEVG9SZXF1aXJlbWVudERlZmluaXRpb24oU3RyaW5nIHJlcURhdGFJZCkgeworCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxRGVmID0gbmV3IFJlcXVpcmVtZW50RGVmaW5pdGlvbigpOworCQlyZXFEZWYuc2V0VW5pcXVlSWQocmVxRGF0YUlkKTsKKwkJcmVxRGVmLnNldENhcGFiaWxpdHkoQ29uc3RhbnRzLkRFRkFVTFRfQ0FQQUJJTElUWV9UWVBFKTsKKwkJcmV0dXJuIHJlcURlZjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEdyYXBoRWRnZSBjcmVhdGVHcmFwaEVkZ2UoKSB7CisJCUdyYXBoRWRnZSBncmFwaEVkZ2UgPSBuZXcgR3JhcGhFZGdlKCk7CisJCXJldHVybiBncmFwaEVkZ2U7CisJfQorCisJcHVibGljIHN0YXRpYyBDYXBhYmlsaXR5SW5zdERhdGEgY3JlYXRlQ2FwYWJpbGl0eUluc3REYXRhKCkgeworCQlDYXBhYmlsaXR5SW5zdERhdGEgY2FwSW5zdERhdGEgPSBuZXcgQ2FwYWJpbGl0eUluc3REYXRhKCk7CisJCVN0cmluZyB1bmlxdWVJZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCWNhcEluc3REYXRhLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJcmV0dXJuIGNhcEluc3REYXRhOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlWYWx1ZURhdGEgY3JlYXRlUHJvcGVydHlEYXRhKCkgeworCQlQcm9wZXJ0eVZhbHVlRGF0YSBwcm9wRGF0YSA9IG5ldyBQcm9wZXJ0eVZhbHVlRGF0YSgpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQlwcm9wRGF0YS5zZXRWYWx1ZSgibG9jYWxob3N0Iik7CisJCXByb3BEYXRhLnNldFVuaXF1ZUlkKHVuaXF1ZUlkKTsKKwkJcmV0dXJuIHByb3BEYXRhOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlEYXRhIGNvbnZlcnRDYXBhYmlsaXR5RGVmaW5pdGlvblRvQ2FwYWJpbGl0eURhdGEoUHJvcGVydHlEZWZpbml0aW9uIHByb3BEZWYpIHsKKwkJUHJvcGVydHlEYXRhIHByb3BEYXRhID0gbmV3IFByb3BlcnR5RGF0YSgpOworCQlwcm9wRGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocHJvcERlZi5nZXRVbmlxdWVJZCgpKTsKKwkJcHJvcERhdGEuZ2V0UHJvcGVydHlEYXRhRGVmaW5pdGlvbigpLnNldERlZmF1bHRWYWx1ZShwcm9wRGVmLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJcmV0dXJuIHByb3BEYXRhOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ2FwYWJpbGl0eURlZmluaXRpb24gY29udmVydENhcGFiaWxpdHlEYXRhVG9DYXBhYmlsaXR5RGVmaW5pdGlvblJvb3QoQ2FwYWJpbGl0eURhdGEgY2FwRGF0YSkgeworCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBEZWYgPSBuZXcgQ2FwYWJpbGl0eURlZmluaXRpb24oKTsKKwkJY2FwRGVmLnNldE5hbWUoIkNhcDEiKTsKKwkJY2FwRGVmLnNldERlc2NyaXB0aW9uKGNhcERhdGEuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWNhcERlZi5zZXRVbmlxdWVJZChjYXBEYXRhLmdldFVuaXF1ZUlkKCkpOworCQljYXBEZWYuc2V0VmFsaWRTb3VyY2VUeXBlcyhjYXBEYXRhLmdldFZhbGlkU291cmNlVHlwZXMoKSk7CisJCWNhcERlZi5zZXRUeXBlKGNhcERhdGEuZ2V0VHlwZSgpKTsKKwkJY2FwRGVmLnNldFByb3BlcnRpZXMobmV3IEFycmF5TGlzdDw+KCkpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGhvc3QgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlob3N0LnNldFVuaXF1ZUlkKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworCQlob3N0LnNldE5hbWUoImhvc3QiKTsKKwkJaG9zdC5zZXREZWZhdWx0VmFsdWUoInJvb3Rob3N0Iik7CisJCWhvc3Quc2V0VHlwZSgic3RyaW5nIik7CisKKwkJaG9zdC5zZXRTY2hlbWEobmV3IFNjaGVtYURlZmluaXRpb24oKSk7CisJCWhvc3QuZ2V0U2NoZW1hKCkuc2V0UHJvcGVydHkobmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKSk7CisJCWhvc3QuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJzdHJpbmciKTsKKworCQljYXBEZWYuZ2V0UHJvcGVydGllcygpLmFkZChob3N0KTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwb3J0ID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJcG9ydC5zZXROYW1lKCJwb3J0Iik7CisJCXBvcnQuc2V0RGVmYXVsdFZhbHVlKCJyb290cG9ydCIpOworCQlwb3J0LnNldFVuaXF1ZUlkKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworCQlwb3J0LnNldFR5cGUoInN0cmluZyIpOworCisJCXBvcnQuc2V0U2NoZW1hKG5ldyBTY2hlbWFEZWZpbml0aW9uKCkpOworCQlwb3J0LmdldFNjaGVtYSgpLnNldFByb3BlcnR5KG5ldyBQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkpOworCQlwb3J0LmdldFNjaGVtYSgpLmdldFByb3BlcnR5KCkuc2V0VHlwZSgic3RyaW5nIik7CisKKwkJY2FwRGVmLmdldFByb3BlcnRpZXMoKS5hZGQocG9ydCk7CisJCXJldHVybiBjYXBEZWY7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL01vZGVsVGVzdEJhc2UuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Nb2RlbFRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4YWE2MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9Nb2RlbFRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuRlNDb25maWd1cmF0aW9uU291cmNlOworCitwdWJsaWMgY2xhc3MgTW9kZWxUZXN0QmFzZSB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOworCisJcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7CisJCWlmIChDb25maWd1cmF0aW9uTWFuYWdlci5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpID09IG51bGwpIHsKKwkJCVN0cmluZyBhcHBDb25maWdEaXIgPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZyI7CisJCQlDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcgRlNDb25maWd1cmF0aW9uU291cmNlKAorCQkJCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwgYXBwQ29uZmlnRGlyKTsKKwkJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25Tb3VyY2UpOworCisJCQlDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOworCQkJY29uZmlndXJhdGlvbi5zZXRUaXRhbkluTWVtb3J5R3JhcGgodHJ1ZSk7CisKKwkJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9Kc29uT2JqZWN0VGVzdC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvSnNvbk9iamVjdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDEwMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvSnNvbk9iamVjdFRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9uczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXBsb2FkUmVzb3VyY2VJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLlVwbG9hZEFydGlmYWN0SW5mbzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLkpzb25QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk1hcHBpbmdFeGNlcHRpb247CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKKworcHVibGljIGNsYXNzIEpzb25PYmplY3RUZXN0IHsKKworCXByaXZhdGUgT2JqZWN0TWFwcGVyIG1hcHBlcjsKKwlVcGxvYWRSZXNvdXJjZUluZm8gaW5wdXRPYmplY3RSZWY7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5QVVRfUkVTT1VSQ0VfU1RSSU5HID0gInsgIFwicGF5bG9hZERhdGFcIiA6IFwiTXkgVGVzdCBPYmplY3RcIiwgIFwicGF5bG9hZE5hbWVcIiA6IFwiVGVzdE5hbWVcIiwgIgorCQkJKyAiICBcImRlc2NyaXB0aW9uXCI6XCJteV9kZXNjcmlwdGlvblwiLFwidGFnc1wiOltcInRhZzFcIl0sICIKKwkJCSsgIlwiYXJ0aWZhY3RMaXN0XCIgOiBbIHsgICAgXCJhcnRpZmFjdE5hbWVcIiA6IFwibXlBcnRpZmFjdDBcIiwgIFwiYXJ0aWZhY3RQYXRoXCIgOiBcInNjcmlwdHMvXCIsICBcImFydGlmYWN0VHlwZVwiIDogXCJQVVBQRVRcIiwgICAiCisJCQkrICIgXCJhcnRpZmFjdERlc2NyaXB0aW9uXCIgOiBcIlRoaXMgaXMgRGVzY3JpcHRpb25cIiwgICAgXCJhcnRpZmFjdERhdGFcIiA6IG51bGwgIH0sICIKKwkJCSsgInsgICAgXCJhcnRpZmFjdE5hbWVcIiA6IFwibXlBcnRpZmFjdDFcIiwgIFwiYXJ0aWZhY3RQYXRoXCIgOiBcInNjcmlwdHMvXCIsIFwiYXJ0aWZhY3RUeXBlXCIgOiBcIlBVUFBFVFwiLCAgICBcImFydGlmYWN0RGVzY3JpcHRpb25cIiA6IFwiVGhpcyBpcyBEZXNjcmlwdGlvblwiLCAiCisJCQkrICIgICBcImFydGlmYWN0RGF0YVwiIDogbnVsbCAgfSBdLCBcImNvbnRhY3RJZFwiIDogbnVsbCwgXCJuYW1lXCIgOiBudWxsLCBcInJlc291cmNlSWNvblBhdGhcIiA6IG51bGwsIFwidmVuZG9yTmFtZVwiIDogbnVsbCwgXCJ2ZW5kb3JSZWxlYXNlXCIgOiBudWxsICwgXCJyZXNvdXJjZVR5cGVcIiA6IFwiVkZDXCIgfSI7CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisJCW1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKwkJQXJyYXlMaXN0PFVwbG9hZEFydGlmYWN0SW5mbz4gYXJ0aWZhY3RMaXN0ID0gbmV3IEFycmF5TGlzdDxVcGxvYWRBcnRpZmFjdEluZm8+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlVcGxvYWRBcnRpZmFjdEluZm8gYXJ0aWZhY3RJbmZvID0gbmV3IFVwbG9hZEFydGlmYWN0SW5mbygibXlBcnRpZmFjdCIgKyBpLCAic2NyaXB0cy8iLAorCQkJCQlBcnRpZmFjdFR5cGVFbnVtLlBVUFBFVCwgIlRoaXMgaXMgRGVzY3JpcHRpb24iKTsKKwkJCWFydGlmYWN0TGlzdC5hZGQoYXJ0aWZhY3RJbmZvKTsKKwkJfQorCQlBcnJheUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXRhZ3MuYWRkKCJ0YWcxIik7CisJCWlucHV0T2JqZWN0UmVmID0gbmV3IFVwbG9hZFJlc291cmNlSW5mbygiTXkgVGVzdCBPYmplY3QiLCAiVGVzdE5hbWUiLCAibXlfZGVzY3JpcHRpb24iLCBudWxsLCB0YWdzLAorCQkJCWFydGlmYWN0TGlzdCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdUb1VwbG9hZFJlc291cmNlSW5mbygpIHRocm93cyBKc29uUGFyc2VFeGNlcHRpb24sIEpzb25NYXBwaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVVwbG9hZFJlc291cmNlSW5mbyByZXNvdXJjZU9iamVjdFRlc3QgPSBtYXBwZXIucmVhZFZhbHVlKElOUFVUX1JFU09VUkNFX1NUUklORywgVXBsb2FkUmVzb3VyY2VJbmZvLmNsYXNzKTsKKwkJYXNzZXJ0RXF1YWxzKGlucHV0T2JqZWN0UmVmLCByZXNvdXJjZU9iamVjdFRlc3QpOworCisJfQorCisJLy8gQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VXBsb2FkUmVzb3VyY2VJbmZvVG9TdHJpbmcoKSB0aHJvd3MgSnNvblBhcnNlRXhjZXB0aW9uLCBKc29uTWFwcGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlTdHJpbmcgcmVmQXNTdHJpbmcgPSBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKGlucHV0T2JqZWN0UmVmKTsKKwkJU3RyaW5nIHVuRm9ybWF0dGVkU3RyaW5nID0gcmVmQXNTdHJpbmcucmVwbGFjZSgiXG4iLCAiIikucmVwbGFjZSgiXHQiLCAiIikucmVwbGFjZSgiICIsICIiKTsKKworCQlhc3NlcnRFcXVhbHModW5Gb3JtYXR0ZWRTdHJpbmcsIElOUFVUX1JFU09VUkNFX1NUUklORy5yZXBsYWNlKCJcbiIsICIiKS5yZXBsYWNlKCJcdCIsICIiKS5yZXBsYWNlKCIgIiwgIiIpKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9BZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4NzFmMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuQXJ0aWZhY3REYXRhRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5JbnRlcmZhY2VEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Nb2RlbFRlc3RCYXNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qb2ludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwudXRpbC5PcGVyYXRpb25UZXN0c1V0aWw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5JblJhbmdlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5MZXNzT3JFcXVhbENvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uLkRlbGV0ZVJlZmVyZW5jZWRPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuQ29udGV4dENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuanVuaXQ0LlNwcmluZ0pVbml0NENsYXNzUnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKKy8vaW1wb3J0IGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy5WZXJ0ZXg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAUnVuV2l0aChTcHJpbmdKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK0BDb250ZXh0Q29uZmlndXJhdGlvbigiY2xhc3NwYXRoOmFwcGxpY2F0aW9uLWNvbnRleHQtdGVzdC54bWwiKQorcHVibGljIGNsYXNzIEFkZGl0aW9uYWxJbmZvcm1hdGlvbk9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2RlbFRlc3RCYXNlIHsKKworCXByaXZhdGUgR3NvbiBwcmV0dHlHc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBVU0VSX0lEID0gIm11dXNlcmlkIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTkFNRSA9ICJjYXRlZ29yeS9teWNhdGVnb3J5IjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAidGl0YW4tZ2VuZXJpYy1kYW8iKQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJyZXNvdXJjZS1vcGVyYXRpb24iKQorCXByaXZhdGUgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImFkZGl0aW9uYWwtaW5mb3JtYXRpb24tb3BlcmF0aW9uIikKKwlwcml2YXRlIElBZGRpdGlvbmFsSW5mb3JtYXRpb25PcGVyYXRpb24gYWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uOworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVVzZXJBbmRDYXRlZ29yeSgpIHsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoQ0FURUdPUllfTkFNRSk7CisJCWRlbGV0ZUFuZENyZWF0ZVVzZXIoVVNFUl9JRCwgImZpcnN0XyIgKyBVU0VSX0lELCAibGFzdF8iICsgVVNFUl9JRCk7CisKKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBCZWZvcmVDbGFzcygpIHsKKworCQlNb2RlbFRlc3RCYXNlLmluaXQoKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdER1bW15KCkgeworCisJCWFzc2VydFRydWUoYWRkaXRpb25hbEluZm9ybWF0aW9uT3BlcmF0aW9uICE9IG51bGwpOworCisJfQorCisJcHJpdmF0ZSBpbnQgZ2V0TnVtYmVyT2ZWZXJ0aWNlc09uR3JhcGgoKSB7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXN1bHQgPSB0aXRhbkRhby5nZXRHcmFwaCgpOworCQlUaXRhbkdyYXBoIGdyYXBoID0gZ3JhcGhSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJaW50IGkgPSAwOworCQlJdGVyYWJsZTxUaXRhblZlcnRleD4gdmVydGljZXMgPSBncmFwaC5xdWVyeSgpLnZlcnRpY2VzKCk7CisJCWlmICh2ZXJ0aWNlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVRpdGFuVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlpKys7CisJCQl9CisKKwkJfQorCisJCXRpdGFuRGFvLmNvbW1pdCgpOworCisJCXJldHVybiBpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZERlbGV0ZVJlc291cmNlKCkgeworCisJCWludCBiZWZvcmUgPSBnZXROdW1iZXJPZlZlcnRpY2VzT25HcmFwaCgpOworCisJCVJlc291cmNlIG5ld1Jlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgInRlc3RDcmVhdGVBbmREZWxldGVSZXNvdXJjZSIsICIwLjEiLCBudWxsLCBmYWxzZSwKKwkJCQl0cnVlKTsKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBuZXdSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVSZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJaW50IGFmdGVyID0gZ2V0TnVtYmVyT2ZWZXJ0aWNlc09uR3JhcGgoKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIG51bWJlciBvZiB2ZXJ0aWNlcyBub3QgY2hhbmdlZCIsIGJlZm9yZSwgYWZ0ZXIpOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgYnVpbGRSZXNvdXJjZU1ldGFkYXRhKFN0cmluZyB1c2VySWQsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHJlc291cmNlTmFtZSwKKwkJCVN0cmluZyByZXNvdXJjZVZlcnNpb24pIHsKKworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOworCQlyZXNvdXJjZS5zZXROYW1lKHJlc291cmNlTmFtZSk7CisJCXJlc291cmNlLnNldFZlcnNpb24ocmVzb3VyY2VWZXJzaW9uKTsKKwkJOworCQlyZXNvdXJjZS5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24gMSIpOworCQlyZXNvdXJjZS5zZXRBYnN0cmFjdChmYWxzZSk7CisJCXJlc291cmNlLnNldENyZWF0b3JVc2VySWQodXNlcklkKTsKKwkJcmVzb3VyY2Uuc2V0Q29udGFjdElkKCJjb250YWN0SWRAc2RjLmNvbSIpOworCQlyZXNvdXJjZS5zZXRWZW5kb3JOYW1lKCJ2ZW5kb3IgMSIpOworCQlyZXNvdXJjZS5zZXRWZW5kb3JSZWxlYXNlKCIxLjAuMCIpOworCQlTdHJpbmdbXSBjYXRlZ29yeUFyciA9IGNhdGVnb3J5LnNwbGl0KCIvIik7CisJCXJlc291cmNlLmFkZENhdGVnb3J5KGNhdGVnb3J5QXJyWzBdLCBjYXRlZ29yeUFyclsxXSk7CisJCXJlc291cmNlLnNldEljb24oImltYWdlcy9teS5wbmciKTsKKwkJLy8gTGlzdDxTdHJpbmc+IHRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJLy8gdGFncy5hZGQoIlRBRzEiKTsKKwkJLy8gdGFncy5hZGQoIlRBRzIiKTsKKwkJLy8gcmVzb3VyY2Uuc2V0VGFncyh0YWdzKTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZGVsZXRlQW5kQ3JlYXRlVXNlcihTdHJpbmcgdXNlcklkLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKHVzZXJJZCk7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZShmaXJzdE5hbWUpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZShsYXN0TmFtZSk7CisKKwkJdGl0YW5EYW8uZGVsZXRlTm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uVXNlciksIHVzZXJJZCwgVXNlckRhdGEuY2xhc3MpOworCQl0aXRhbkRhby5jcmVhdGVOb2RlKHVzZXJEYXRhLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNvbW1pdCgpOworCisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7CisJCVN0cmluZ1tdIG5hbWVzID0gY2F0ZWdvcnkuc3BsaXQoIi8iKTsKKwkJT3BlcmF0aW9uVGVzdHNVdGlsLmRlbGV0ZUFuZENyZWF0ZVJlc291cmNlQ2F0ZWdvcnkobmFtZXNbMF0sIG5hbWVzWzFdLCB0aXRhbkRhbyk7CisJfQorCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFN0cmluZyB1c2VySWQsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIHJlc291cmNlVmVyc2lvbiwKKwkJCVN0cmluZyBwYXJlbnRSZXNvdXJjZU5hbWUsIGJvb2xlYW4gaXNBYnN0cmFjdCwgYm9vbGVhbiBpc0hpZ2hlc3RWZXJzaW9uKSB7CisKKwkJTGlzdDxTdHJpbmc+IGRlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWlmIChwYXJlbnRSZXNvdXJjZU5hbWUgIT0gbnVsbCkgeworCQkJZGVyaXZlZEZyb20uYWRkKHBhcmVudFJlc291cmNlTmFtZSk7CisJCX0KKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBidWlsZFJlc291cmNlTWV0YWRhdGEodXNlcklkLCBjYXRlZ29yeSwgcmVzb3VyY2VOYW1lLCByZXNvdXJjZVZlcnNpb24pOworCisJCXJlc291cmNlLnNldEFic3RyYWN0KGlzQWJzdHJhY3QpOworCQlyZXNvdXJjZS5zZXRIaWdoZXN0VmVyc2lvbihpc0hpZ2hlc3RWZXJzaW9uKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHJlc291cmNlT3BlcmF0aW9uLmNyZWF0ZVJlc291cmNlKHJlc291cmNlLCB0cnVlKTsKKworCQlhc3NlcnRUcnVlKHJlc3VsdC5pc0xlZnQoKSk7CisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugc3RhdGUiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlyZXN1bHRSZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKworCQlyZXR1cm4gcmVzdWx0UmVzb3VyY2U7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQXJ0aWZhY3RPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0FydGlmYWN0T3BlcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNDNlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0FydGlmYWN0T3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTc0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTW9kZWxUZXN0QmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JR3JhcGhMb2NrT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWwuT3BlcmF0aW9uVGVzdHNVdGlsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkFydGlmYWN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5IZWF0UGFyYW1ldGVyRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5Db250ZXh0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5qdW5pdDQuU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQFJ1bldpdGgoU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitAQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKK3B1YmxpYyBjbGFzcyBBcnRpZmFjdE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2RlbFRlc3RCYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9OQU1FID0gIm15SGVhdEFydGlmYWN0IjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAidGl0YW4tZ2VuZXJpYy1kYW8iKQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJzZXJ2aWNlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBTZXJ2aWNlT3BlcmF0aW9uIHNlcnZpY2VPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSUdyYXBoTG9ja09wZXJhdGlvbiBncmFwaExvY2tPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gInJlcXVpcmVtZW50LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBSZXF1aXJlbWVudE9wZXJhdGlvbiByZXF1aXJlbWVudE9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAicmVzb3VyY2Utb3BlcmF0aW9uIikKKwlwcml2YXRlIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJwcm9wZXJ0eS1vcGVyYXRpb24iKQorCXByaXZhdGUgUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImNhcGFiaWxpdHktb3BlcmF0aW9uIikKKwlwcml2YXRlIENhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAiY2FwYWJpbGl0eS10eXBlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAiY29tcG9uZW50LWluc3RhbmNlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJsaWZlY3ljbGUtb3BlcmF0aW9uIikKKwlwcml2YXRlIExpZmVjeWNsZU9wZXJhdGlvbiBsaWZlY3ljbGVPcGVyYXRpb247CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2VydmljZU9wZXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0lEID0gInJlc291cmNlSWQiOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9JRF8yID0gInJlc291cmNlSWQyIjsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBVU0VSX0lEID0gIm11c2VyaWQiOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRFR09SWV9OQU1FID0gImNhdGVnb3J5L215Y2F0ZWdvcnkiOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQmVmb3JlQ2xhc3MoKSB7CisKKwkJTW9kZWxUZXN0QmFzZS5pbml0KCk7CisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVVzZXJBbmRDYXRlZ29yeSgpIHsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoQ0FURUdPUllfTkFNRSk7CisJCWRlbGV0ZUFuZENyZWF0ZVVzZXIoVVNFUl9JRCwgImZpcnN0XyIgKyBVU0VSX0lELCAibGFzdF8iICsgVVNFUl9JRCwgbnVsbCk7CisJfQorCisvLwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRBcnRpZmFjdFRvU2VydmljZVZlcnNpb25BbmRVVUlETm90TnVsbCgpIHsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQljYXRlZ29yeS5zZXROYW1lKENBVEVHT1JZX05BTUUpOworCisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJzZXJ2Y2VUZXN0MiI7CisJCVN0cmluZyBzZXJ2aWNlVmVyc2lvbiA9ICIwLjEiOworCQlTdHJpbmcgdXNlcklkID0gVVNFUl9JRDsKKwkJU2VydmljZSBzZXJ2aWNlQWZ0ZXJTYXZlID0gY3JlYXRlU2VydmljZSh1c2VySWQsIGNhdGVnb3J5LCBzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHRydWUpOworCQlsb2cuZGVidWcoInt9Iiwgc2VydmljZUFmdGVyU2F2ZSk7CisJCVN0cmluZyBzZXJ2aWNlSWQgPSBzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbyA9IGFkZEFydGlmYWN0VG9TZXJ2aWNlKHVzZXJJZCwgc2VydmljZUlkLCAiaW5zdGFsbF9hcGFjaGUiKTsKKworCQlhc3NlcnRFcXVhbHMoImFkZCBpbmZvcm1hdGlvbmFsIGFydGlmYWN0IHZlcnNpb24gOiAiICsgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VmVyc2lvbigpLCAiMSIsCisJCQkJYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VmVyc2lvbigpKTsKKworCQlhc3NlcnROb3ROdWxsKCJhZGQgaW5mb3JtYXRpb25hbCBhcnRpZmFjdCB2ZXJzaW9uIDogIiArIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFVVSUQoKSwKKwkJCQlhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RVVUlEKCkpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWFzc2VydFRydWUoc2VydmljZS5pc0xlZnQoKSk7CisKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSBzZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmdldEFydGlmYWN0cygpOworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIGFydGlmYWN0SWQgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpLmdldERlc2NyaXB0aW9uKCk7CisKKwkJCWFydGlmYWN0T3BlcmF0aW9uLnJlbW92ZUFyaWZhY3RGcm9tUmVzb3VyY2Uoc2VydmljZUlkLCBhcnRpZmFjdElkLCBOb2RlVHlwZUVudW0uU2VydmljZSwgdHJ1ZSwgZmFsc2UpOworCQl9CisJCXNlcnZpY2UgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uoc2VydmljZUlkKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlLmlzTGVmdCgpKTsKKworCQlhcnRpZmFjdHMgPSBzZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmdldEFydGlmYWN0cygpOworCQlhc3NlcnRFcXVhbHMoMCwgYXJ0aWZhY3RzLnNpemUoKSk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VEZWxldGUgPSBzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2Uoc2VydmljZUlkKTsKKworCQlFaXRoZXI8TGlzdDxBcnRpZmFjdERhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYnlDcml0ZXJpYSA9IHRpdGFuRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLAorCQkJCW51bGwsIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoYnlDcml0ZXJpYS5pc1JpZ2h0KCkpOworCQlhc3NlcnRFcXVhbHMoVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELCBieUNyaXRlcmlhLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VBZnRlclNhdmUuZ2V0VW5pcXVlSWQoKSk7CisKKwl9CisKKy8vCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFydGlmYWN0VG9TZXJ2aWNlVmVyc2lvbk5vdENoYW5nZWQoKSB7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJY2F0ZWdvcnkuc2V0TmFtZShDQVRFR09SWV9OQU1FKTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gInNlcnZjZVRlc3QyIjsKKwkJU3RyaW5nIHNlcnZpY2VWZXJzaW9uID0gIjAuMSI7CisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCQlTZXJ2aWNlIHNlcnZpY2VBZnRlclNhdmUgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgdHJ1ZSk7CisJCWxvZy5kZWJ1Zygie30iLCBzZXJ2aWNlQWZ0ZXJTYXZlKTsKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IHNlcnZpY2VBZnRlclNhdmUuZ2V0VW5pcXVlSWQoKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvID0gYWRkQXJ0aWZhY3RUb1NlcnZpY2UodXNlcklkLCBzZXJ2aWNlSWQsICJpbnN0YWxsX2FwYWNoZSIpOworCisJCVN0cmluZyB2ZXJzaW9uID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VmVyc2lvbigpOworCQlTdHJpbmcgYXJ0VXVpZCA9IGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFVVSUQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGQgaW5mb3JtYXRpb25hbCBhcnRpZmFjdCB2ZXJzaW9uIDogIiArIHZlcnNpb24sICIxIiwgdmVyc2lvbik7CisKKwkJYXJ0aWZhY3RJbmZvLnNldERlc2NyaXB0aW9uKCJqZ2hsc2sgbmV3IGRlc2ZuamRoIik7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3QgPSBhcnRpZmFjdE9wZXJhdGlvbi51cGRhdGVBcmlmYWN0T25SZXNvdXJjZSgKKwkJCQlhcnRpZmFjdEluZm8sIHNlcnZpY2VJZCwgYXJ0aWZhY3RJbmZvLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmYWxzZSk7CisJCVN0cmluZyBuZXdWZXJzaW9uID0gYXJ0aWZhY3QubGVmdCgpLnZhbHVlKCkuZ2V0QXJ0aWZhY3RWZXJzaW9uKCk7CisJCVN0cmluZyBuZXdBcnRVdWlkID0gYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VVVJRCgpOworCQlhc3NlcnRFcXVhbHMoImFkZCBpbmZvcm1hdGlvbmFsIGFydGlmYWN0IHZlcnNpb24gOiAiICsgbmV3VmVyc2lvbiwgbmV3VmVyc2lvbiwgdmVyc2lvbik7CisJCWFzc2VydEVxdWFscygiYWRkIGluZm9ybWF0aW9uYWwgYXJ0aWZhY3QgdXVpZCA6ICIgKyBuZXdBcnRVdWlkLCBuZXdBcnRVdWlkLCBhcnRVdWlkKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZSA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZShzZXJ2aWNlSWQpOworCQlhc3NlcnRUcnVlKHNlcnZpY2UuaXNMZWZ0KCkpOworCisJCU1hcDxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gYXJ0aWZhY3RzID0gc2VydmljZS5sZWZ0KCkudmFsdWUoKS5nZXRBcnRpZmFjdHMoKTsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGVudHJ5IDogYXJ0aWZhY3RzLmVudHJ5U2V0KCkpIHsKKwkJCVN0cmluZyBhcnRpZmFjdElkID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZW50cnkuZ2V0VmFsdWUoKS5nZXREZXNjcmlwdGlvbigpOworCisJCQlhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKHNlcnZpY2VJZCwgYXJ0aWZhY3RJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHRydWUsIGZhbHNlKTsKKwkJfQorCQlzZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWFzc2VydFRydWUoc2VydmljZS5pc0xlZnQoKSk7CisKKwkJYXJ0aWZhY3RzID0gc2VydmljZS5sZWZ0KCkudmFsdWUoKS5nZXRBcnRpZmFjdHMoKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGFydGlmYWN0cy5zaXplKCkpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlRGVsZXRlID0gc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZCk7CisKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkRhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwKKwkJCQludWxsLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGJ5Q3JpdGVyaWEuaXNSaWdodCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwgYnlDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCkpOworCisJCXNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGVsZXRlQXJ0aWZhY3RXaXRoSGVhdFBhcmFtcygpIHsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RXaXRoSGVhdCA9IGNyZWF0ZVJlc291cmNlV2l0aEhlYXQoKTsKKworCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVycyA9IGFydGlmYWN0V2l0aEhlYXQuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJYXNzZXJ0Tm90TnVsbChoZWF0UGFyYW1ldGVycyk7CisJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnMuc2l6ZSgpID09IDEpOworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwYXJhbWV0ZXIgPSBoZWF0UGFyYW1ldGVycy5nZXQoMCk7CisJCUhlYXRQYXJhbWV0ZXJEYXRhIHBhcmFtZXRlckRhdGEgPSBuZXcgSGVhdFBhcmFtZXRlckRhdGEocGFyYW1ldGVyKTsKKwkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyYW1ldGVyTm9kZSA9IHRpdGFuRGFvLmdldE5vZGUocGFyYW1ldGVyRGF0YS5nZXRVbmlxdWVJZEtleSgpLAorCQkJCXBhcmFtZXRlckRhdGEuZ2V0VW5pcXVlSWQoKSwgSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHBhcmFtZXRlck5vZGUuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlbW92ZUFyaWZhY3QgPSBhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKAorCQkJCVJFU09VUkNFX0lELCBhcnRpZmFjdFdpdGhIZWF0LmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHJlbW92ZUFyaWZhY3QuaXNMZWZ0KCkpOworCisJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBuZXcgQXJ0aWZhY3REYXRhKGFydGlmYWN0V2l0aEhlYXQpOworCQlFaXRoZXI8QXJ0aWZhY3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RBZnRlckRlbGV0ZSA9IHRpdGFuRGFvLmdldE5vZGUoYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkS2V5KCksCisJCQkJYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkKCksIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoYXJ0aWZhY3RBZnRlckRlbGV0ZS5pc1JpZ2h0KCkpOworCisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmFtZXRlck5vZGVBZnRlckRlbGV0ZSA9IHRpdGFuRGFvCisJCQkJLmdldE5vZGUocGFyYW1ldGVyRGF0YS5nZXRVbmlxdWVJZEtleSgpLCBwYXJhbWV0ZXJEYXRhLmdldFVuaXF1ZUlkKCksIEhlYXRQYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJOb2RlQWZ0ZXJEZWxldGUuaXNSaWdodCgpKTsKKworCQl0aXRhbkRhby5kZWxldGVOb2RlKG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSRVNPVVJDRV9JRCksIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBcnRpZmFjdFdpdGhIZWF0UGFyYW1zKCkgeworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdFdpdGhIZWF0ID0gY3JlYXRlUmVzb3VyY2VXaXRoSGVhdCgpOworCisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzID0gYXJ0aWZhY3RXaXRoSGVhdC5nZXRIZWF0UGFyYW1ldGVycygpOworCQlhc3NlcnROb3ROdWxsKGhlYXRQYXJhbWV0ZXJzKTsKKwkJYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVycy5zaXplKCkgPT0gMSk7CisJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHBhcmFtZXRlciA9IGhlYXRQYXJhbWV0ZXJzLmdldCgwKTsKKwkJSGVhdFBhcmFtZXRlckRhdGEgcGFyYW1ldGVyRGF0YSA9IG5ldyBIZWF0UGFyYW1ldGVyRGF0YShwYXJhbWV0ZXIpOworCQlFaXRoZXI8SGVhdFBhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJhbWV0ZXJOb2RlID0gdGl0YW5EYW8uZ2V0Tm9kZShwYXJhbWV0ZXJEYXRhLmdldFVuaXF1ZUlkS2V5KCksCisJCQkJcGFyYW1ldGVyRGF0YS5nZXRVbmlxdWVJZCgpLCBIZWF0UGFyYW1ldGVyRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUocGFyYW1ldGVyTm9kZS5pc0xlZnQoKSk7CisKKwkJLy8gdXBkYXRlIHRvIGFydGlmYWN0IHdpdGhvdXQgcGFyYW1zCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdE5vUGFyYW1zID0gY3JlYXRlQXJ0aWZhY3REZWZpbml0aW9uKFVTRVJfSUQsIFJFU09VUkNFX0lELCBBUlRJRkFDVF9OQU1FKTsKKwkJYXJ0aWZhY3ROb1BhcmFtcy5zZXRVbmlxdWVJZChhcnRpZmFjdFdpdGhIZWF0LmdldFVuaXF1ZUlkKCkpOworCQlhcnRpZmFjdE5vUGFyYW1zLnNldEFydGlmYWN0VHlwZSgiSEVBVCIpOworCQlhcnRpZmFjdE5vUGFyYW1zLnNldEFydGlmYWN0VmVyc2lvbigiMiIpOworCQlhcnRpZmFjdE5vUGFyYW1zLnNldEFydGlmYWN0R3JvdXBUeXBlKEFydGlmYWN0R3JvdXBUeXBlRW51bS5ERVBMT1lNRU5UKTsKKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVBcmlmYWN0ID0gYXJ0aWZhY3RPcGVyYXRpb24udXBkYXRlQXJpZmFjdE9uUmVzb3VyY2UoCisJCQkJYXJ0aWZhY3ROb1BhcmFtcywgUkVTT1VSQ0VfSUQsIGFydGlmYWN0V2l0aEhlYXQuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUodXBkYXRlQXJpZmFjdC5pc0xlZnQoKSk7CisKKwkJQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IG5ldyBBcnRpZmFjdERhdGEoYXJ0aWZhY3RXaXRoSGVhdCk7CisJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdEFmdGVyVXBkYXRlID0gdGl0YW5EYW8uZ2V0Tm9kZShhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWRLZXkoKSwKKwkJCQlhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWQoKSwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShhcnRpZmFjdEFmdGVyVXBkYXRlLmlzTGVmdCgpKTsKKwkJQXJ0aWZhY3REYXRhIGFydGlmYWN0QWZ0ZXJVcGRhdGVWYWx1ZSA9IGFydGlmYWN0QWZ0ZXJVcGRhdGUubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYXJ0aWZhY3ROb1BhcmFtcy5nZXRBcnRpZmFjdFZlcnNpb24oKQorCQkJCS5lcXVhbHMoYXJ0aWZhY3RBZnRlclVwZGF0ZVZhbHVlLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRBcnRpZmFjdFZlcnNpb24oKSkpOworCisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmFtZXRlck5vZGVBZnRlckRlbGV0ZSA9IHRpdGFuRGFvCisJCQkJLmdldE5vZGUocGFyYW1ldGVyRGF0YS5nZXRVbmlxdWVJZEtleSgpLCBwYXJhbWV0ZXJEYXRhLmdldFVuaXF1ZUlkKCksIEhlYXRQYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJOb2RlQWZ0ZXJEZWxldGUuaXNSaWdodCgpKTsKKworCQlhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKFJFU09VUkNFX0lELCBhcnRpZmFjdFdpdGhIZWF0LmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwKKwkJCQl0cnVlLCBmYWxzZSk7CisJCXRpdGFuRGFvLmRlbGV0ZU5vZGUobmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIFJFU09VUkNFX0lEKSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQl0aXRhbkRhby5kZWxldGVOb2RlKG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSRVNPVVJDRV9JRF8yKSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFydGlmYWN0TWV0YWRhdGFXaXRoSGVhdFBhcmFtcygpIHsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RXaXRoSGVhdCA9IGNyZWF0ZVJlc291cmNlV2l0aEhlYXQoKTsKKworCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVycyA9IGFydGlmYWN0V2l0aEhlYXQuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJYXNzZXJ0Tm90TnVsbChoZWF0UGFyYW1ldGVycyk7CisJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnMuc2l6ZSgpID09IDEpOworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwYXJhbWV0ZXIgPSBoZWF0UGFyYW1ldGVycy5nZXQoMCk7CisJCUhlYXRQYXJhbWV0ZXJEYXRhIHBhcmFtZXRlckRhdGEgPSBuZXcgSGVhdFBhcmFtZXRlckRhdGEocGFyYW1ldGVyKTsKKwkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyYW1ldGVyTm9kZSA9IHRpdGFuRGFvLmdldE5vZGUocGFyYW1ldGVyRGF0YS5nZXRVbmlxdWVJZEtleSgpLAorCQkJCXBhcmFtZXRlckRhdGEuZ2V0VW5pcXVlSWQoKSwgSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHBhcmFtZXRlck5vZGUuaXNMZWZ0KCkpOworCisJCS8vIHVwZGF0ZSB0byBhcnRpZmFjdCB3aXRob3V0IHBhcmFtcworCQlhcnRpZmFjdFdpdGhIZWF0LnNldEFydGlmYWN0VmVyc2lvbigiMiIpOworCQlhcnRpZmFjdFdpdGhIZWF0LnNldEFydGlmYWN0Q2hlY2tzdW0obnVsbCk7CisJCWFydGlmYWN0V2l0aEhlYXQuc2V0UGF5bG9hZERhdGEobnVsbCk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gdXBkYXRlQXJpZmFjdCA9IGFydGlmYWN0T3BlcmF0aW9uLnVwZGF0ZUFyaWZhY3RPblJlc291cmNlKAorCQkJCWFydGlmYWN0V2l0aEhlYXQsIFJFU09VUkNFX0lELCBhcnRpZmFjdFdpdGhIZWF0LmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHVwZGF0ZUFyaWZhY3QuaXNMZWZ0KCkpOworCisJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGEgPSBuZXcgQXJ0aWZhY3REYXRhKGFydGlmYWN0V2l0aEhlYXQpOworCQlFaXRoZXI8QXJ0aWZhY3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3RBZnRlclVwZGF0ZSA9IHRpdGFuRGFvLmdldE5vZGUoYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkS2V5KCksCisJCQkJYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkKCksIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoYXJ0aWZhY3RBZnRlclVwZGF0ZS5pc0xlZnQoKSk7CisJCUFydGlmYWN0RGF0YSBhcnRpZmFjdEFmdGVyVXBkYXRlVmFsdWUgPSBhcnRpZmFjdEFmdGVyVXBkYXRlLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0V2l0aEhlYXQuZ2V0QXJ0aWZhY3RWZXJzaW9uKCkKKwkJCQkuZXF1YWxzKGFydGlmYWN0QWZ0ZXJVcGRhdGVWYWx1ZS5nZXRBcnRpZmFjdERhdGFEZWZpbml0aW9uKCkuZ2V0QXJ0aWZhY3RWZXJzaW9uKCkpKTsKKworCQlFaXRoZXI8SGVhdFBhcmFtZXRlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwYXJhbWV0ZXJOb2RlQWZ0ZXJEZWxldGUgPSB0aXRhbkRhbworCQkJCS5nZXROb2RlKHBhcmFtZXRlckRhdGEuZ2V0VW5pcXVlSWRLZXkoKSwgcGFyYW1ldGVyRGF0YS5nZXRVbmlxdWVJZCgpLCBIZWF0UGFyYW1ldGVyRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUocGFyYW1ldGVyTm9kZUFmdGVyRGVsZXRlLmlzTGVmdCgpKTsKKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZW1vdmVBcmlmYWN0ID0gYXJ0aWZhY3RPcGVyYXRpb24ucmVtb3ZlQXJpZmFjdEZyb21SZXNvdXJjZSgKKwkJCQlSRVNPVVJDRV9JRF8yLCAoU3RyaW5nKSBhcnRpZmFjdEFmdGVyVXBkYXRlVmFsdWUuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlLCBmYWxzZSk7CisJCXJlbW92ZUFyaWZhY3QgPSBhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKFJFU09VUkNFX0lELCBhcnRpZmFjdFdpdGhIZWF0LmdldFVuaXF1ZUlkKCksCisJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlLCBmYWxzZSk7CisJCXRpdGFuRGFvLmRlbGV0ZU5vZGUobmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIFJFU09VUkNFX0lEKSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQl0aXRhbkRhby5kZWxldGVOb2RlKG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSRVNPVVJDRV9JRF8yKSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVIZWF0QXJ0aWZhY3RXaXRoVHdvUmVzb3VyY2VzKCkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RXaXRoSGVhdCA9IGNyZWF0ZVJlc291cmNlV2l0aEhlYXQoKTsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZTIgPSBjcmVhdGVSZXNvdXJjZShSRVNPVVJDRV9JRF8yKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlwcm9wcy5wdXQoR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpLCBBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVC5uYW1lKCkpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZVJlbGF0aW9uID0gdGl0YW5EYW8uY3JlYXRlUmVsYXRpb24ocmVzb3VyY2UyLAorCQkJCW5ldyBBcnRpZmFjdERhdGEoYXJ0aWZhY3RXaXRoSGVhdCksIEdyYXBoRWRnZUxhYmVscy5BUlRJRkFDVF9SRUYsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZWxhdGlvbi5pc0xlZnQoKSk7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMgPSBhcnRpZmFjdFdpdGhIZWF0LmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCWFzc2VydE5vdE51bGwoaGVhdFBhcmFtZXRlcnMpOworCQlhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzLnNpemUoKSA9PSAxKTsKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcGFyYW1ldGVyID0gaGVhdFBhcmFtZXRlcnMuZ2V0KDApOworCQlIZWF0UGFyYW1ldGVyRGF0YSBwYXJhbWV0ZXJEYXRhID0gbmV3IEhlYXRQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlcik7CisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHBhcmFtZXRlck5vZGUgPSB0aXRhbkRhby5nZXROb2RlKHBhcmFtZXRlckRhdGEuZ2V0VW5pcXVlSWRLZXkoKSwKKwkJCQlwYXJhbWV0ZXJEYXRhLmdldFVuaXF1ZUlkKCksIEhlYXRQYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJOb2RlLmlzTGVmdCgpKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gYXRpZmFjdFRvVXBkYXRlID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbihhcnRpZmFjdFdpdGhIZWF0KTsKKworCQkvLyB1cGRhdGUgdG8gYXJ0aWZhY3Qgd2l0aG91dCBwYXJhbXMKKwkJYXRpZmFjdFRvVXBkYXRlLnNldEFydGlmYWN0VmVyc2lvbigiMiIpOworCQlhdGlmYWN0VG9VcGRhdGUuc2V0QXJ0aWZhY3RDaGVja3N1bShudWxsKTsKKwkJYXRpZmFjdFRvVXBkYXRlLnNldFBheWxvYWREYXRhKG51bGwpOworCisJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbVVwZGF0ZSA9IG5ldyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbihwYXJhbWV0ZXIpOworCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0UGFyYW1ldGVyc1VwZGF0ZWQgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQloZWF0UGFyYW1VcGRhdGUuc2V0Q3VycmVudFZhbHVlKCI1NSIpOworCQloZWF0UGFyYW1ldGVyc1VwZGF0ZWQuYWRkKGhlYXRQYXJhbVVwZGF0ZSk7CisJCWF0aWZhY3RUb1VwZGF0ZS5zZXRIZWF0UGFyYW1ldGVycyhoZWF0UGFyYW1ldGVyc1VwZGF0ZWQpOworCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUFyaWZhY3QgPSBhcnRpZmFjdE9wZXJhdGlvbi51cGRhdGVBcmlmYWN0T25SZXNvdXJjZSgKKwkJCQlhdGlmYWN0VG9VcGRhdGUsIFJFU09VUkNFX0lEXzIsIGF0aWZhY3RUb1VwZGF0ZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZSh1cGRhdGVBcmlmYWN0LmlzTGVmdCgpKTsKKworCQkvLyB2ZXJpZnkgb2xkIGFydGlmYWN0IGFuZCBwYXJhbWV0ZXIgc3RpbGwgZXhpc3QKKwkJQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IG5ldyBBcnRpZmFjdERhdGEoYXJ0aWZhY3RXaXRoSGVhdCk7CisJCUVpdGhlcjxBcnRpZmFjdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBvcmlnQXJ0aWZhY3QgPSB0aXRhbkRhby5nZXROb2RlKGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZEtleSgpLAorCQkJCWFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKG9yaWdBcnRpZmFjdC5pc0xlZnQoKSk7CisJCUFydGlmYWN0RGF0YSBvcmlnQXJ0aWZhY3REYXRhID0gb3JpZ0FydGlmYWN0LmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0V2l0aEhlYXQuZ2V0QXJ0aWZhY3RWZXJzaW9uKCkKKwkJCQkuZXF1YWxzKG9yaWdBcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0VmVyc2lvbigpKSk7CisKKwkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyYW1ldGVyTm9kZUFmdGVyRGVsZXRlID0gdGl0YW5EYW8KKwkJCQkuZ2V0Tm9kZShwYXJhbWV0ZXJEYXRhLmdldFVuaXF1ZUlkS2V5KCksIHBhcmFtZXRlckRhdGEuZ2V0VW5pcXVlSWQoKSwgSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHBhcmFtZXRlck5vZGVBZnRlckRlbGV0ZS5pc0xlZnQoKSk7CisKKwkJLy8gdmVyaWZ5IG5ldyBhcnRpZmFjdCBhbmQgbmV3IHBhcmFtZXRlcgorCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uVXBkYXRlZCA9IHVwZGF0ZUFyaWZhY3QubGVmdCgpLnZhbHVlKCk7CisJCUFydGlmYWN0RGF0YSBhcnRpZmFjdERhdGFVcGRhdGVkID0gbmV3IEFydGlmYWN0RGF0YShhcnRpZmFjdERlZmluaXRpb25VcGRhdGVkKTsKKwkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZWRBcnRpZmFjdCA9IHRpdGFuRGFvCisJCQkJLmdldE5vZGUoYXJ0aWZhY3REYXRhVXBkYXRlZC5nZXRVbmlxdWVJZEtleSgpLCBhcnRpZmFjdERhdGFVcGRhdGVkLmdldFVuaXF1ZUlkKCksIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUodXBkYXRlZEFydGlmYWN0LmlzTGVmdCgpKTsKKwkJQXJ0aWZhY3REYXRhIHVwZGF0ZWRBcnRpZmFjdERhdGEgPSB1cGRhdGVkQXJ0aWZhY3QubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYXRpZmFjdFRvVXBkYXRlLmdldEFydGlmYWN0VmVyc2lvbigpCisJCQkJLmVxdWFscyh1cGRhdGVkQXJ0aWZhY3REYXRhLmdldEFydGlmYWN0RGF0YURlZmluaXRpb24oKS5nZXRBcnRpZmFjdFZlcnNpb24oKSkpOworCQlhc3NlcnRGYWxzZSgKKwkJCQkoKFN0cmluZykgdXBkYXRlZEFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZCgpKS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIG9yaWdBcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWQoKSkpOworCisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbWV0ZXJzQWZ0ZXJVcGRhdGUgPSBhcnRpZmFjdERlZmluaXRpb25VcGRhdGVkLmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCWFzc2VydE5vdE51bGwoaGVhdFBhcmFtZXRlcnNBZnRlclVwZGF0ZSk7CisJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNBZnRlclVwZGF0ZS5zaXplKCkgPT0gMSk7CisJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIFVwZGF0ZWRIZWF0UGFyYW1ldGVyID0gaGVhdFBhcmFtZXRlcnNBZnRlclVwZGF0ZS5nZXQoMCk7CisJCWFzc2VydEZhbHNlKFVwZGF0ZWRIZWF0UGFyYW1ldGVyLmdldFVuaXF1ZUlkKCkuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBwYXJhbWV0ZXJEYXRhLmdldFVuaXF1ZUlkKCkpKTsKKwkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcGFyYW1ldGVyTm9kZUFmdGVyVXBkYXRlID0gdGl0YW5EYW8uZ2V0Tm9kZSgKKwkJCQluZXcgSGVhdFBhcmFtZXRlckRhdGEoVXBkYXRlZEhlYXRQYXJhbWV0ZXIpLmdldFVuaXF1ZUlkS2V5KCksIFVwZGF0ZWRIZWF0UGFyYW1ldGVyLmdldFVuaXF1ZUlkKCksCisJCQkJSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHBhcmFtZXRlck5vZGVBZnRlclVwZGF0ZS5pc0xlZnQoKSk7CisKKwkJLy8gZGVsZXRlIG5ldyBhcnRpZmFjdAorCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZW1vdmVBcmlmYWN0ID0gYXJ0aWZhY3RPcGVyYXRpb24ucmVtb3ZlQXJpZmFjdEZyb21SZXNvdXJjZSgKKwkJCQlSRVNPVVJDRV9JRF8yLCBhcnRpZmFjdERlZmluaXRpb25VcGRhdGVkLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHJlbW92ZUFyaWZhY3QuaXNMZWZ0KCkpOworCisJCS8vIHZlcmlmeSBvbGQgYXJ0aWZhY3QgYW5kIHBhcmFtZXRlciBzdGlsbCBleGlzdAorCQlvcmlnQXJ0aWZhY3QgPSB0aXRhbkRhby5nZXROb2RlKGFydGlmYWN0RGF0YS5nZXRVbmlxdWVJZEtleSgpLCBhcnRpZmFjdERhdGEuZ2V0VW5pcXVlSWQoKSwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShvcmlnQXJ0aWZhY3QuaXNMZWZ0KCkpOworCQlvcmlnQXJ0aWZhY3REYXRhID0gb3JpZ0FydGlmYWN0LmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0V2l0aEhlYXQuZ2V0QXJ0aWZhY3RWZXJzaW9uKCkKKwkJCQkuZXF1YWxzKG9yaWdBcnRpZmFjdERhdGEuZ2V0QXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpLmdldEFydGlmYWN0VmVyc2lvbigpKSk7CisKKwkJcGFyYW1ldGVyTm9kZUFmdGVyRGVsZXRlID0gdGl0YW5EYW8uZ2V0Tm9kZShwYXJhbWV0ZXJEYXRhLmdldFVuaXF1ZUlkS2V5KCksIHBhcmFtZXRlckRhdGEuZ2V0VW5pcXVlSWQoKSwKKwkJCQlIZWF0UGFyYW1ldGVyRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUocGFyYW1ldGVyTm9kZUFmdGVyRGVsZXRlLmlzTGVmdCgpKTsKKworCQkvLyB2ZXJpZnkgbmV3IGFydGlmYWN0IGlzIGRlbGV0ZWQKKwkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0QWZ0ZXJEZWxldGUgPSB0aXRhbkRhbworCQkJCS5nZXROb2RlKGFydGlmYWN0RGF0YVVwZGF0ZWQuZ2V0VW5pcXVlSWRLZXkoKSwgYXJ0aWZhY3REYXRhVXBkYXRlZC5nZXRVbmlxdWVJZCgpLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0QWZ0ZXJEZWxldGUuaXNSaWdodCgpKTsKKworCQlwYXJhbWV0ZXJOb2RlQWZ0ZXJEZWxldGUgPSB0aXRhbkRhby5nZXROb2RlKG5ldyBIZWF0UGFyYW1ldGVyRGF0YShVcGRhdGVkSGVhdFBhcmFtZXRlcikuZ2V0VW5pcXVlSWRLZXkoKSwKKwkJCQluZXcgSGVhdFBhcmFtZXRlckRhdGEoVXBkYXRlZEhlYXRQYXJhbWV0ZXIpLmdldFVuaXF1ZUlkKCksIEhlYXRQYXJhbWV0ZXJEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJOb2RlQWZ0ZXJEZWxldGUuaXNSaWdodCgpKTsKKworCQlhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKFJFU09VUkNFX0lELCBhcnRpZmFjdFdpdGhIZWF0LmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwKKwkJCQl0cnVlLCBmYWxzZSk7CisJCXRpdGFuRGFvLmRlbGV0ZU5vZGUobmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uUmVzb3VyY2UsIFJFU09VUkNFX0lEKSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQl0aXRhbkRhby5kZWxldGVOb2RlKG5ldyBVbmlxdWVJZERhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBSRVNPVVJDRV9JRF8yKSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCX0KKworCXByaXZhdGUgQXJ0aWZhY3REZWZpbml0aW9uIGNyZWF0ZVJlc291cmNlV2l0aEhlYXQoKSB7CisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoUkVTT1VSQ0VfSUQpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWZpbml0aW9uID0gY3JlYXRlQXJ0aWZhY3REZWZpbml0aW9uKFVTRVJfSUQsIFJFU09VUkNFX0lELCBBUlRJRkFDVF9OQU1FKTsKKwkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEFydGlmYWN0VHlwZSgiSEVBVCIpOworCQlhcnRpZmFjdERlZmluaXRpb24uc2V0QXJ0aWZhY3RHcm91cFR5cGUoQXJ0aWZhY3RHcm91cFR5cGVFbnVtLkRFUExPWU1FTlQpOworCisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPigpOworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBoZWF0UGFyYW0gPSBuZXcgSGVhdFBhcmFtZXRlckRlZmluaXRpb24oKTsKKwkJaGVhdFBhcmFtLnNldEN1cnJlbnRWYWx1ZSgiMTEiKTsKKwkJaGVhdFBhcmFtLnNldERlZmF1bHRWYWx1ZSgiMjIiKTsKKwkJaGVhdFBhcmFtLnNldERlc2NyaXB0aW9uKCJkZXNjIik7CisJCWhlYXRQYXJhbS5zZXROYW1lKCJteVBhcmFtIik7CisJCWhlYXRQYXJhbS5zZXRUeXBlKCJudW1iZXIiKTsKKwkJaGVhdFBhcmFtcy5hZGQoaGVhdFBhcmFtKTsKKwkJYXJ0aWZhY3REZWZpbml0aW9uLnNldEhlYXRQYXJhbWV0ZXJzKGhlYXRQYXJhbXMpOworCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0ID0gYXJ0aWZhY3RPcGVyYXRpb24KKwkJCQkuYWRkQXJpZmFjdFRvQ29tcG9uZW50KGFydGlmYWN0RGVmaW5pdGlvbiwgUkVTT1VSQ0VfSUQsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0LmlzTGVmdCgpKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0V2l0aEhlYXQgPSBhcnRpZmFjdC5sZWZ0KCkudmFsdWUoKTsKKwkJcmV0dXJuIGFydGlmYWN0V2l0aEhlYXQ7CisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdERlZmluaXRpb24gYWRkQXJ0aWZhY3RUb1NlcnZpY2UoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHNlcnZpY2VJZCwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvID0gY3JlYXRlQXJ0aWZhY3REZWZpbml0aW9uKHVzZXJJZCwgc2VydmljZUlkLCBhcnRpZmFjdE5hbWUpOworCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0ID0gYXJ0aWZhY3RPcGVyYXRpb24KKwkJCQkuYWRkQXJpZmFjdFRvQ29tcG9uZW50KGFydGlmYWN0SW5mbywgc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSwgdHJ1ZSwgdHJ1ZSk7CisJCWFzc2VydFRydWUoYXJ0aWZhY3QuaXNMZWZ0KCkpOworCQlyZXR1cm4gYXJ0aWZhY3QubGVmdCgpLnZhbHVlKCk7CisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdERlZmluaXRpb24gY3JlYXRlQXJ0aWZhY3REZWZpbml0aW9uKFN0cmluZyB1c2VySWQsIFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbyA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oKTsKKworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3ROYW1lKGFydGlmYWN0TmFtZSArICIuc2giKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZSgiU0hFTEwiKTsKKwkJYXJ0aWZhY3RJbmZvLnNldERlc2NyaXB0aW9uKCJoZGtmaHNrZGZnaCIpOworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RDaGVja3N1bSgiVUVzREJBb0FBQUFJQUFlTGIwYkRReiIpOworCisJCWFydGlmYWN0SW5mby5zZXRVc2VySWRDcmVhdG9yKHVzZXJJZCk7CisJCVN0cmluZyBmdWxsTmFtZSA9ICJKaW0gSCI7CisJCWFydGlmYWN0SW5mby5zZXRVcGRhdGVyRnVsbE5hbWUoZnVsbE5hbWUpOworCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJYXJ0aWZhY3RJbmZvLnNldENyZWF0b3JGdWxsTmFtZShmdWxsTmFtZSk7CisJCWFydGlmYWN0SW5mby5zZXRDcmVhdGlvbkRhdGUodGltZSk7CisJCWFydGlmYWN0SW5mby5zZXRMYXN0VXBkYXRlRGF0ZSh0aW1lKTsKKwkJYXJ0aWZhY3RJbmZvLnNldFVzZXJJZExhc3RVcGRhdGVyKHVzZXJJZCk7CisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdExhYmVsKGFydGlmYWN0TmFtZSk7CisJCWFydGlmYWN0SW5mby5zZXRVbmlxdWVJZChVbmlxdWVJZEJ1aWxkZXIuYnVpbGRQcm9wZXJ0eVVuaXF1ZUlkKHNlcnZpY2VJZCwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSkpOworCQlyZXR1cm4gYXJ0aWZhY3RJbmZvOworCX0KKworCXB1YmxpYyBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoU3RyaW5nIHVzZXJJZCwgQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5LCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbiwKKwkJCWJvb2xlYW4gaXNIaWdoZXN0VmVyc2lvbikgeworCisJCVNlcnZpY2Ugc2VydmljZSA9IGJ1aWxkU2VydmljZU1ldGFkYXRhKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbik7CisKKwkJc2VydmljZS5zZXRIaWdoZXN0VmVyc2lvbihpc0hpZ2hlc3RWZXJzaW9uKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gc2VydmljZU9wZXJhdGlvbi5jcmVhdGVTZXJ2aWNlKHNlcnZpY2UsIHRydWUpOworCisJCWxvZy5pbmZvKHJlc3VsdC50b1N0cmluZygpKTsKKwkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNMZWZ0KCkpOworCQlTZXJ2aWNlIHJlc3VsdFNlcnZpY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSB1bmlxdWUgaWQiLAorCQkvLyBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRTZXJ2aWNlVW5pcXVlSWQoc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uKSwKKwkJLy8gcmVzdWx0U2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBzdGF0ZSIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULAorCQkJCXJlc3VsdFNlcnZpY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSk7CisKKwkJcmV0dXJuIHJlc3VsdFNlcnZpY2U7CisJfQorCisJcHJpdmF0ZSBTZXJ2aWNlIGJ1aWxkU2VydmljZU1ldGFkYXRhKFN0cmluZyB1c2VySWQsIENhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSwgU3RyaW5nIHNlcnZpY2VOYW1lLAorCQkJU3RyaW5nIHNlcnZpY2VWZXJzaW9uKSB7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsKKwkJc2VydmljZS5zZXROYW1lKHNlcnZpY2VOYW1lKTsKKwkJc2VydmljZS5zZXRWZXJzaW9uKHNlcnZpY2VWZXJzaW9uKTsKKwkJc2VydmljZS5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24gMSIpOworCisJCXNlcnZpY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VySWQpOworCQlzZXJ2aWNlLnNldENvbnRhY3RJZCgiY29udGFjdElkQHNkYy5jb20iKTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOworCQlzZXJ2aWNlLnNldENhdGVnb3JpZXMoY2F0ZWdvcmllcyk7CisJCXNlcnZpY2Uuc2V0SWNvbigiaW1hZ2VzL215LnBuZyIpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZCgiVEFHMSIpOworCQl0YWdzLmFkZCgiVEFHMiIpOworCQlzZXJ2aWNlLnNldFRhZ3ModGFncyk7CisJCXJldHVybiBzZXJ2aWNlOworCX0KKworCXByaXZhdGUgdm9pZCBkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKKwkJU3RyaW5nW10gbmFtZXMgPSBjYXRlZ29yeS5zcGxpdCgiLyIpOworCQlPcGVyYXRpb25UZXN0c1V0aWwuZGVsZXRlQW5kQ3JlYXRlU2VydmljZUNhdGVnb3J5KGNhdGVnb3J5LCB0aXRhbkRhbyk7CisJCU9wZXJhdGlvblRlc3RzVXRpbC5kZWxldGVBbmRDcmVhdGVSZXNvdXJjZUNhdGVnb3J5KG5hbWVzWzBdLCBuYW1lc1sxXSwgdGl0YW5EYW8pOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZGVsZXRlQW5kQ3JlYXRlVXNlcihTdHJpbmcgdXNlcklkLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyByb2xlKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCh1c2VySWQpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoZmlyc3ROYW1lKTsKKwkJdXNlckRhdGEuc2V0TGFzdE5hbWUobGFzdE5hbWUpOworCQlpZiAocm9sZSAhPSBudWxsICYmICFyb2xlLmlzRW1wdHkoKSkgeworCQkJdXNlckRhdGEuc2V0Um9sZShyb2xlKTsKKwkJfSBlbHNlIHsKKwkJCXVzZXJEYXRhLnNldFJvbGUoIkFETUlOIik7CisJCX0KKworCQl0aXRhbkRhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNyZWF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXB1YmxpYyBSZXNvdXJjZU1ldGFkYXRhRGF0YSBjcmVhdGVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGExID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXNlcnZpY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VOYW1lKTsKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZSA9IHRpdGFuRGFvLmNyZWF0ZU5vZGUoc2VydmljZURhdGExLAorCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlhc3NlcnRUcnVlKCJjaGVjayByZXNvdXJjZSBjcmVhdGVkIiwgY3JlYXRlTm9kZS5pc0xlZnQoKSk7CisJCXJldHVybiBjcmVhdGVOb2RlLmxlZnQoKS52YWx1ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODQyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Nb2RlbFRlc3RCYXNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5JblJhbmdlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5MZXNzT3JFcXVhbENvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LkNvbnRleHRDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0Lmp1bml0NC5TcHJpbmdKVW5pdDRDbGFzc1J1bm5lcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAUnVuV2l0aChTcHJpbmdKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK0BDb250ZXh0Q29uZmlndXJhdGlvbigiY2xhc3NwYXRoOmFwcGxpY2F0aW9uLWNvbnRleHQtdGVzdC54bWwiKQorLy8gQFRlc3RFeGVjdXRpb25MaXN0ZW5lcnMobGlzdGVuZXJzID0geworLy8gRGVwZW5kZW5jeUluamVjdGlvblRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzcywKKy8vIERpcnRpZXNDb250ZXh0VGVzdEV4ZWN1dGlvbkxpc3RlbmVyLmNsYXNzLAorLy8gVHJhbnNhY3Rpb25hbFRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzcyB9KQorcHVibGljIGNsYXNzIENhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZGVsVGVzdEJhc2UgeworCisJQFJlc291cmNlKG5hbWUgPSAidGl0YW4tZ2VuZXJpYy1kYW8iKQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvOworCisJQFJlc291cmNlKG5hbWUgPSAiY2FwYWJpbGl0eS10eXBlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEJlZm9yZUNsYXNzKCkgeworCQkvLyBFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1tb2RlbCIpOworCQkvLyBTdHJpbmcgYXBwQ29uZmlnRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1tb2RlbCI7CisJCS8vIENvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldworCQkvLyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksCisJCS8vIGFwcENvbmZpZ0Rpcik7CisKKwkJLy8gY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoCisJCS8vIG5ldyBDb25maWd1cmF0aW9uU291cmNlKCkgeworCQkvLworCQkvLyBAT3ZlcnJpZGUKKwkJLy8gcHVibGljIDxUPiBUIGdldEFuZFdhdGNoQ29uZmlndXJhdGlvbihDbGFzczxUPiBjbGFzc05hbWUsCisJCS8vIENvbmZpZ3VyYXRpb25MaXN0ZW5lciBjb25maWd1cmF0aW9uTGlzdGVuZXIpIHsKKwkJLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLyByZXR1cm4gbnVsbDsKKwkJLy8gfQorCQkvLworCQkvLyBAT3ZlcnJpZGUKKwkJLy8gcHVibGljIDxUPiB2b2lkIGFkZFdhdGNoQ29uZmlndXJhdGlvbihDbGFzczxUPiBjbGFzc05hbWUsCisJCS8vIENvbmZpZ3VyYXRpb25MaXN0ZW5lciBjb25maWd1cmF0aW9uTGlzdGVuZXIpIHsKKwkJLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkvLworCQkvLyB9CisJCS8vIH0pOworCQkvLworCQkvLyBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOworCQkvLyBjb25maWd1cmF0aW9uLnNldFRpdGFuSW5NZW1vcnlHcmFwaCh0cnVlKTsKKwkJLy8KKwkJLy8gY29uZmlndXJhdGlvbk1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKKwkJTW9kZWxUZXN0QmFzZS5pbml0KCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REdW1teSgpIHsKKworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uICE9IG51bGwpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2FwYWJpbGl0eVR5cGUoKSB7CisKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiA9IG5ldyBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24oKTsKKwkJY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLnNldERlc2NyaXB0aW9uKCJkZXNjMSIpOworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0VHlwZSgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcjEiKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5VHlwZTEgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbgorCQkJCS5hZGRDYXBhYmlsaXR5VHlwZShjYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIHRydWUpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNhcGFiaWxpdHkgdHlwZSBhZGRlZCIsIHRydWUsIGFkZENhcGFiaWxpdHlUeXBlMS5pc0xlZnQoKSk7CisKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlQWRkZWQgPSBhZGRDYXBhYmlsaXR5VHlwZTEubGVmdCgpLnZhbHVlKCk7CisJCWNvbXBhcmVCZXR3ZWVuQ3JlYXRlZFRvU2VudChjYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIGNhcGFiaWxpdHlUeXBlQWRkZWQpOworCisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjYXBhYmlsaXR5VHlwZUJ5VWlkID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24KKwkJCQkuZ2V0Q2FwYWJpbGl0eVR5cGVCeVVpZChjYXBhYmlsaXR5VHlwZUFkZGVkLmdldFVuaXF1ZUlkKCkpOworCQljb21wYXJlQmV0d2VlbkNyZWF0ZWRUb1NlbnQoY2FwYWJpbGl0eVR5cGVCeVVpZC5sZWZ0KCkudmFsdWUoKSwgY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5VHlwZTIgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbgorCQkJCS5hZGRDYXBhYmlsaXR5VHlwZShjYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIHRydWUpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNhcGFiaWxpdHkgdHlwZSBmYWlsZWQiLCB0cnVlLCBhZGRDYXBhYmlsaXR5VHlwZTIuaXNSaWdodCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCBlcnJvciIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuU0NIRU1BX1ZJT0xBVElPTiwKKwkJCQlhZGRDYXBhYmlsaXR5VHlwZTIucmlnaHQoKS52YWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZERlcnZpZWRDYXBhYmlsaXR5VHlwZSgpIHsKKworCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uID0gbmV3IENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigpOworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24oImRlc2MxIik7CisJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXRUeXBlKCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyMiIpOworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0RGVyaXZlZEZyb20oImRlcml2ZWRGcm9tIik7CisKKwkJRWl0aGVyPENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQ2FwYWJpbGl0eVR5cGUxID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24KKwkJCQkuYWRkQ2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCB0cnVlKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJjaGVjayBjYXBhYmlsaXR5IHR5cGUgcGFyZW50IG5vdCBleGlzdCIsCisJCS8vIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCwKKwkJLy8gYWRkQ2FwYWJpbGl0eVR5cGUxLnJpZ2h0KCkudmFsdWUoKSk7CisJCS8vIFRPRE86IGVzb2ZlciBjaGFuZ2UgdG8gSU5WQUxJRF9JRAorCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNhcGFiaWxpdHkgdHlwZSBwYXJlbnQgbm90IGV4aXN0IiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lELAorCQkJCWFkZENhcGFiaWxpdHlUeXBlMS5yaWdodCgpLnZhbHVlKCkpOworCX0KKworCXB1YmxpYyBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY3JlYXRlQ2FwYWJpbGl0eShTdHJpbmcgY2FwYWJpbGl0eVR5cGVOYW1lKSB7CisKKwkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiA9IG5ldyBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24oKTsKKwkJY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLnNldERlc2NyaXB0aW9uKCJkZXNjMSIpOworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0VHlwZShjYXBhYmlsaXR5VHlwZU5hbWUpOworCisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPigpOworCisJCVN0cmluZyBwcm9wTmFtZTEgPSAiZGlza19zaXplIjsKKwkJU3RyaW5nIHByb3BOYW1lMiA9ICJudW1fY3B1cyI7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5MSA9IGJ1aWxkUHJvcGVydHkxKCk7CisKKwkJcHJvcGVydGllcy5wdXQocHJvcE5hbWUxLCBwcm9wZXJ0eTEpOworCisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eTIgPSBidWlsZFByb3BlcnR5MigpOworCisJCXByb3BlcnRpZXMucHV0KHByb3BOYW1lMiwgcHJvcGVydHkyKTsKKworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5VHlwZTEgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbgorCQkJCS5hZGRDYXBhYmlsaXR5VHlwZShjYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIHRydWUpOworCisJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb25DcmVhdGVkID0gYWRkQ2FwYWJpbGl0eVR5cGUxLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjYXBhYmlsaXR5VHlwZSA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uCisJCQkJLmdldENhcGFiaWxpdHlUeXBlKGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbkNyZWF0ZWQuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgY2FwYWJpbGl0eSB0eXBlIGZldGNoZWQiLCB0cnVlLCBjYXBhYmlsaXR5VHlwZS5pc0xlZnQoKSk7CisJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBmZXRjaGVkQ1REID0gY2FwYWJpbGl0eVR5cGUubGVmdCgpLnZhbHVlKCk7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBmZXRjaGVkUHJvcHMgPSBmZXRjaGVkQ1RELmdldFByb3BlcnRpZXMoKTsKKworCQljb21wYXJlUHJvcGVydGllcyhmZXRjaGVkUHJvcHMsIHByb3BlcnRpZXMpOworCisJCXJldHVybiBmZXRjaGVkQ1REOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2FwYWJpbGl0eVR5cGVXaXRoUHJvcGVydGllcygpIHsKKworCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uID0gbmV3IENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigpOworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24oImRlc2MxIik7CisJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXRUeXBlKCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyMyIpOworCisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPigpOworCisJCVN0cmluZyBwcm9wTmFtZTEgPSAiZGlza19zaXplIjsKKwkJU3RyaW5nIHByb3BOYW1lMiA9ICJudW1fY3B1cyI7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5MSA9IGJ1aWxkUHJvcGVydHkxKCk7CisKKwkJcHJvcGVydGllcy5wdXQocHJvcE5hbWUxLCBwcm9wZXJ0eTEpOworCisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eTIgPSBidWlsZFByb3BlcnR5MigpOworCisJCXByb3BlcnRpZXMucHV0KHByb3BOYW1lMiwgcHJvcGVydHkyKTsKKworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5VHlwZTEgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbgorCQkJCS5hZGRDYXBhYmlsaXR5VHlwZShjYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIHRydWUpOworCisJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb25DcmVhdGVkID0gYWRkQ2FwYWJpbGl0eVR5cGUxLmxlZnQoKS52YWx1ZSgpOworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjYXBhYmlsaXR5VHlwZSA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uCisJCQkJLmdldENhcGFiaWxpdHlUeXBlKGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbkNyZWF0ZWQuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgY2FwYWJpbGl0eSB0eXBlIGZldGNoZWQiLCB0cnVlLCBjYXBhYmlsaXR5VHlwZS5pc0xlZnQoKSk7CisJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBmZXRjaGVkQ1REID0gY2FwYWJpbGl0eVR5cGUubGVmdCgpLnZhbHVlKCk7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBmZXRjaGVkUHJvcHMgPSBmZXRjaGVkQ1RELmdldFByb3BlcnRpZXMoKTsKKworCQljb21wYXJlUHJvcGVydGllcyhmZXRjaGVkUHJvcHMsIHByb3BlcnRpZXMpOworCX0KKworCXByaXZhdGUgdm9pZCBjb21wYXJlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGZpcnN0LCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHNlY29uZCkgeworCisJCWFzc2VydFRydWUoImNoZWNrIHByb3BlcnRpZXMgYXJlIGZ1bGwgb3IgZW1wdHkiLAorCQkJCSgoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkgfHwgKGZpcnN0ICE9IG51bGwgJiYgc2Vjb25kICE9IG51bGwpKSk7CisJCWlmIChmaXJzdCAhPSBudWxsKSB7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHByb3BlcnRpZXMgc2l6ZSIsIGZpcnN0LnNpemUoKSwgc2Vjb25kLnNpemUoKSk7CisKKwkJCWZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGVudHJ5IDogZmlyc3QuZW50cnlTZXQoKSkgeworCisJCQkJU3RyaW5nIHByb3BOYW1lID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJUHJvcGVydHlEZWZpbml0aW9uIHNlY29uZFBEID0gc2Vjb25kLmdldChwcm9wTmFtZSk7CisJCQkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgcHJvcGVydHkgIiArIHByb3BOYW1lICsgIiBpbiAiICsgc2Vjb25kLCBzZWNvbmRQRCk7CisKKwkJCQlQcm9wZXJ0eURlZmluaXRpb24gZmlyc3RQRCA9IGVudHJ5LmdldFZhbHVlKCk7CisKKwkJCQljb21wYXJlUHJvcGVydHlEZWZpbml0aW9uKGZpcnN0UEQsIHNlY29uZFBEKTsKKwkJCX0KKworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXBhYmlsaXR5VHlwZU5vdEZvdW5kKCkgeworCisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24KKwkJCQkuZ2V0Q2FwYWJpbGl0eVR5cGUoIm5vdF9leGlzdHMiKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBub3QgZm91bmQgaXMgcmV0dXJuZWQiLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwgY2FwYWJpbGl0eVR5cGUucmlnaHQoKS52YWx1ZSgpKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBjb21wYXJlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5RGVmaW5pdGlvbiBmaXJzdCwgUHJvcGVydHlEZWZpbml0aW9uIHNlY29uZCkgeworCisJCWFzc2VydFRydWUoImNoZWNrIG9iamVjdHMgYXJlIGZ1bGwgb3IgZW1wdHkiLAorCQkJCSgoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkgfHwgKGZpcnN0ICE9IG51bGwgJiYgc2Vjb25kICE9IG51bGwpKSk7CisJCWlmIChmaXJzdCAhPSBudWxsKSB7CisJCQlhc3NlcnRUcnVlKCJjaGVjayBwcm9wZXJ0eSBkZWZhdWx0IHZhbHVlIiwgY29tcGFyZVZhbHVlKGZpcnN0LmdldERlZmF1bHRWYWx1ZSgpLCBzZWNvbmQuZ2V0RGVmYXVsdFZhbHVlKCkpKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHByb3BlcnR5IGRlc2NyaXB0aW9uIiwgY29tcGFyZVZhbHVlKGZpcnN0LmdldERlc2NyaXB0aW9uKCksIHNlY29uZC5nZXREZXNjcmlwdGlvbigpKSk7CisJCQlhc3NlcnRUcnVlKCJjaGVjayBwcm9wZXJ0eSB0eXBlIiwgY29tcGFyZVZhbHVlKGZpcnN0LmdldFR5cGUoKSwgc2Vjb25kLmdldFR5cGUoKSkpOworCQkJY29tcGFyZUxpc3QoZmlyc3QuZ2V0Q29uc3RyYWludHMoKSwgc2Vjb25kLmdldENvbnN0cmFpbnRzKCkpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgY29tcGFyZUxpc3QoTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGZpcnN0LCBMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gc2Vjb25kKSB7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgbGlzdHMgYXJlIGZ1bGwgb3IgZW1wdHkiLAorCQkJCSgoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkgfHwgKGZpcnN0ICE9IG51bGwgJiYgc2Vjb25kICE9IG51bGwpKSk7CisJCWlmIChmaXJzdCAhPSBudWxsKSB7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIGxpc3Qgc2l6ZSIsIGZpcnN0LnNpemUoKSwgc2Vjb25kLnNpemUoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFByb3BlcnR5RGVmaW5pdGlvbiBidWlsZFByb3BlcnR5MigpIHsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5MiA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkyLnNldERlZmF1bHRWYWx1ZSgiMiIpOworCQlwcm9wZXJ0eTIuc2V0RGVzY3JpcHRpb24oIk51bWJlciBvZiAoYWN0dWFsIG9yIHZpcnR1YWwpIENQVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDb21wdXRlIG5vZGUuIik7CisJCXByb3BlcnR5Mi5zZXRUeXBlKFRvc2NhVHlwZS5JTlRFR0VSLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzMyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PigpOworCQlMaXN0PFN0cmluZz4gcmFuZ2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmFuZ2UuYWRkKCIxIik7CisJCXJhbmdlLmFkZCgiNCIpOworCisJCUluUmFuZ2VDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludDMgPSBuZXcgSW5SYW5nZUNvbnN0cmFpbnQocmFuZ2UpOworCQljb25zdHJhaW50czMuYWRkKHByb3BlcnR5Q29uc3RyYWludDMpOworCQkvLyBwcm9wZXJ0eTIuc2V0Q29uc3RyYWludHMoY29uc3RyYWludHMzKTsKKwkJcHJvcGVydHkyLnNldENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzMyk7CisJCXJldHVybiBwcm9wZXJ0eTI7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eURlZmluaXRpb24gYnVpbGRQcm9wZXJ0eTEoKSB7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eTEgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5MS5zZXREZWZhdWx0VmFsdWUoIjEwIik7CisJCXByb3BlcnR5MS5zZXREZXNjcmlwdGlvbigKKwkJCQkiU2l6ZSBvZiB0aGUgbG9jYWwgZGlzaywgaW4gR2lnYWJ5dGVzIChHQiksIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGUgQ29tcHV0ZSBub2RlLiIpOworCQlwcm9wZXJ0eTEuc2V0VHlwZShUb3NjYVR5cGUuSU5URUdFUi5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PigpOworCQlHcmVhdGVyVGhhbkNvbnN0cmFpbnQgcHJvcGVydHlDb25zdHJhaW50MSA9IG5ldyBHcmVhdGVyVGhhbkNvbnN0cmFpbnQoIjAiKTsKKwkJY29uc3RyYWludHMuYWRkKHByb3BlcnR5Q29uc3RyYWludDEpOworCisJCUxlc3NPckVxdWFsQ29uc3RyYWludCBwcm9wZXJ0eUNvbnN0cmFpbnQyID0gbmV3IExlc3NPckVxdWFsQ29uc3RyYWludCgiMTAiKTsKKwkJY29uc3RyYWludHMuYWRkKHByb3BlcnR5Q29uc3RyYWludDIpOworCisJCXByb3BlcnR5MS5zZXRDb25zdHJhaW50cyhjb25zdHJhaW50cyk7CisJCXJldHVybiBwcm9wZXJ0eTE7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbXBhcmVCZXR3ZWVuQ3JlYXRlZFRvU2VudChDYXBhYmlsaXR5VHlwZURlZmluaXRpb24geCwgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIHkpIHsKKworCQlhc3NlcnRUcnVlKGNvbXBhcmVWYWx1ZSh4LmdldERlcml2ZWRGcm9tKCksIHkuZ2V0RGVyaXZlZEZyb20oKSkpOworCQlhc3NlcnRUcnVlKGNvbXBhcmVWYWx1ZSh4LmdldFR5cGUoKSwgeS5nZXRUeXBlKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjb21wYXJlVmFsdWUoeC5nZXREZXNjcmlwdGlvbigpLCB5LmdldERlc2NyaXB0aW9uKCkpKTsKKworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbXBhcmVWYWx1ZShTdHJpbmcgZmlyc3QsIFN0cmluZyBzZWNvbmQpIHsKKworCQlpZiAoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGZpcnN0ICE9IG51bGwpIHsKKwkJCXJldHVybiBmaXJzdC5lcXVhbHMoc2Vjb25kKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbnMoVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvLCBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbikgeworCQl0aGlzLnRpdGFuRGFvID0gdGl0YW5EYW87CisJCXRoaXMuY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Db21wb25lbnRJbnN0YW5jZU9wZXJhdGlvblNwcmluZ1Rlc3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb25TcHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjYjFlZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb25TcHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw1NDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLmlvLklvQ29yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlByb3BlcnR5RGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzLlNjaGVtYURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTW9kZWxUZXN0QmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYXRlZ29yeS5DYXRlZ29yeURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5MaWZlY3ljbGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXNvdXJjZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuU2VydmljZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC51dGlsLk9wZXJhdGlvblRlc3RzVXRpbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwudXRpbC5SZXNvdXJjZUNyZWF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5JblJhbmdlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5MZXNzT3JFcXVhbENvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eUluc3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5VmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlNlcnZpY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUudW5pdHRlc3RzLnV0aWxzLkZhY3RvcnlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51bml0dGVzdHMudXRpbHMuRmFjdG9yeVV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LkNvbnRleHRDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0Lmp1bml0NC5TcHJpbmdKVW5pdDRDbGFzc1J1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAUnVuV2l0aChTcHJpbmdKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK0BDb250ZXh0Q29uZmlndXJhdGlvbigiY2xhc3NwYXRoOmFwcGxpY2F0aW9uLWNvbnRleHQtdGVzdC54bWwiKQorcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uU3ByaW5nVGVzdCBleHRlbmRzIE1vZGVsVGVzdEJhc2UgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvblNwcmluZ1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwlAUmVzb3VyY2UobmFtZSA9ICJjb21wb25lbnQtaW5zdGFuY2Utb3BlcmF0aW9uIikKKwlwcml2YXRlIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uIGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uOworCisJQFJlc291cmNlKG5hbWUgPSAiY29tcG9uZW50LWluc3RhbmNlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uOworCisJQFJlc291cmNlKG5hbWUgPSAiY2FwYWJpbGl0eS10eXBlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKKworCUBSZXNvdXJjZShuYW1lID0gImNhcGFiaWxpdHktb3BlcmF0aW9uIikKKwlwdWJsaWMgQ2FwYWJpbGl0eU9wZXJhdGlvbiBjYXBhYmlsaXR5T3BlcmF0aW9uOworCisJQFJlc291cmNlKG5hbWUgPSAic2VydmljZS1vcGVyYXRpb24iKQorCXByaXZhdGUgU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uOworCisJQFJlc291cmNlKG5hbWUgPSAicmVzb3VyY2Utb3BlcmF0aW9uIikKKwlwcml2YXRlIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQFJlc291cmNlKG5hbWUgPSAicHJvcGVydHktb3BlcmF0aW9uIikKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQFJlc291cmNlKG5hbWUgPSAibGlmZWN5Y2xlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBMaWZlY3ljbGVPcGVyYXRpb24gbGlmZWN5Y2xlT3BlcmF0aW9uOworCisJVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbzsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRFR09SWV9OQU1FID0gImNhdGVnb3J5L215Y2F0ZWdvcnkiOworCisJVXNlciByZmNVc2VyOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQmVmb3JlQ2xhc3MoKSB7CisJCU1vZGVsVGVzdEJhc2UuaW5pdCgpOworCisJfQorCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7CisJCXRpdGFuR2VuZXJpY0RhbyA9IGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLnRpdGFuR2VuZXJpY0RhbzsKKwkJRWl0aGVyPFRpdGFuR3JhcGgsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBncmFwaFJlc3VsdCA9IHRpdGFuR2VuZXJpY0Rhby5nZXRHcmFwaCgpOworCQlUaXRhbkdyYXBoIGdyYXBoID0gZ3JhcGhSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS52ZXJ0aWNlcygpOworCQlpZiAodmVydGljZXMgIT0gbnVsbCkgeworCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJdmVydGV4LnJlbW92ZSgpOworCQkJfQorCisJCX0KKwkJdGl0YW5HZW5lcmljRGFvLmNvbW1pdCgpOworCQlkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShDQVRFR09SWV9OQU1FKTsKKwkJVXNlckRhdGEgbW9kaWZpZXJEYXRhID0gZGVsZXRlQW5kQ3JlYXRlVXNlcihSZXNvdXJjZUNyZWF0aW9uVXRpbHMuTU9ESUZJRVJfQVRUX1VJRCArICJyZmMiLAorCQkJCVJlc291cmNlQ3JlYXRpb25VdGlscy5NT0RJRklFUl9GSVJTVF9OQU1FLCBSZXNvdXJjZUNyZWF0aW9uVXRpbHMuTU9ESUZJRVJfTEFTVF9OQU1FLCAiQURNSU4iKTsKKwkJcmZjVXNlciA9IGNvbnZlcnRVc2VyRGF0YVRvVXNlcihtb2RpZmllckRhdGEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZENhcGFiaWxpdHlQcm9wZXJ0eVZhbHVlc1RvUmVzb3VyY2VJbnN0YW5jZSgpIHsKKwkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QxMjMiOworCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZSByb290UmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZShyZmNVc2VyLmdldFVzZXJJZCgpLCBDQVRFR09SWV9OQU1FLCByb290TmFtZSwKKwkJCQkiMS4wIiwgbnVsbCwgZmFsc2UsIHRydWUpOworCisJCS8vIGNlcnRpZmljYXRpb24gcmVxdWVzdAorCQlFaXRoZXI8PyBleHRlbmRzIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVxdWVzdENlcnRpZmljYXRpb25SZXN1bHQgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkucmVxdWVzdENlcnRpZmljYXRpb25Db21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByb290UmVzb3VyY2UsIHJmY1VzZXIsIHJmY1VzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1ZXN0Q2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UgcmVzdWx0UmVzb3VyY2UgPSAob3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UpIHJlcXVlc3RDZXJ0aWZpY2F0aW9uUmVzdWx0CisJCQkJLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIHN0YXJ0IGNlcnRpZmljYXRpb24KKwkJRWl0aGVyPD8gZXh0ZW5kcyBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdCA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5zdGFydENvbXBvbmVudENlcnRpZmljYXRpb24oTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXN1bHRSZXNvdXJjZSwgcmZjVXNlciwgcmZjVXNlciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0LmlzTGVmdCgpKTsKKworCQlFaXRoZXI8PyBleHRlbmRzIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2VydGlmaWVkUmVzb3VyY2VSZXMgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuY2VydGlmeUNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJvb3RSZXNvdXJjZSwgcmZjVXNlciwgcmZjVXNlciwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGNlcnRpZmllZFJlc291cmNlUmVzLmlzTGVmdCgpKTsKKworCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY2FwYWJpbGl0eVR5cGUgPSBidWlsZENhcGFiaWxpdHlUeXBlKCk7CisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHlUeXBlUmVzID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24KKwkJCQkuYWRkQ2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eVR5cGUpOworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdHlUeXBlUmVzLmlzTGVmdCgpKTsKKworCQlDYXBhYmlsaXR5RGF0YSBjYXBEYXRhID0gRmFjdG9yeVV0aWxzLmNyZWF0ZUNhcGFiaWxpdHlEYXRhKCk7CisJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEZWZpbml0aW9uUm9vdCA9IEZhY3RvcnlVdGlscworCQkJCS5jb252ZXJ0Q2FwYWJpbGl0eURhdGFUb0NhcGFiaWxpdHlEZWZpbml0aW9uUm9vdChjYXBEYXRhKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZENhcGFiaWxpdHlSb290UmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5hZGRDYXBhYmlsaXR5KAorCQkJCShTdHJpbmcpIGNlcnRpZmllZFJlc291cmNlUmVzLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCksIGNhcGFiaWxpdHlEZWZpbml0aW9uUm9vdC5nZXROYW1lKCksCisJCQkJY2FwYWJpbGl0eURlZmluaXRpb25Sb290KTsKKwkJYXNzZXJ0VHJ1ZShhZGRDYXBhYmlsaXR5Um9vdFJlcy5pc0xlZnQoKSk7CisKKwkJU3RyaW5nIHJlc291cmNlTmFtZSA9ICJ0b3NjYS5ub2Rlcy5BcGFjaGUuMi4wIjsKKworCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiA9IEZhY3RvcnlVdGlscworCQkJCS5jb252ZXJ0Q2FwYWJpbGl0eURhdGFUb0NhcGFiaWxpdHlEZWZpbml0aW9uQWRkUHJvcGVydGllcyhjYXBEYXRhKTsKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZShyZmNVc2VyLmdldFVzZXJJZCgpLCBDQVRFR09SWV9OQU1FLCByZXNvdXJjZU5hbWUsCisJCQkJIjAuMSIsIHJvb3ROYW1lLCBmYWxzZSwgdHJ1ZSk7CisKKwkJRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRDYXBhYmlsaXR5UmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbgorCQkJCS5hZGRDYXBhYmlsaXR5KChTdHJpbmcpIHJlc291cmNlLmdldFVuaXF1ZUlkKCksIGNhcGFiaWxpdHlEZWZpbml0aW9uLmdldE5hbWUoKSwgY2FwYWJpbGl0eURlZmluaXRpb24pOworCQlhc3NlcnRUcnVlKGFkZENhcGFiaWxpdHlSZXMuaXNMZWZ0KCkpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnRpZXMgPSBhZGRDYXBhYmlsaXR5UmVzLmxlZnQoKS52YWx1ZSgpLmdldFByb3BlcnRpZXMoKTsKKwkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzLnNpemUoKSA9PSAyKTsKKworCQlFaXRoZXI8b3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNsb25lZFJlc291cmNlUmVzID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkuY2xvbmVDb21wb25lbnQocmVzb3VyY2UsICIwLjIiLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY2xvbmVkUmVzb3VyY2VSZXMuaXNMZWZ0KCkpOworCQlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZSBjbG9uZWRSZXNvdXJjZSA9IGNsb25lZFJlc291cmNlUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCUNvbXBvbmVudEluc3RhbmNlIGluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKGNsb25lZFJlc291cmNlLmdldFVuaXF1ZUlkKCksICIxIiwgInRvc2NhLm5vZGVzLkFwYWNoZSIpOworCisJCVNlcnZpY2Ugb3JpZ1NlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlKHJmY1VzZXIuZ2V0VXNlcklkKCksIENBVEVHT1JZX05BTUUsICJteS1zZXJ2aWNlIiwgIjEuMCIsIHRydWUpOworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZTIgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uob3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQlmYWxzZSk7CisJCWFzc2VydFRydWUoc2VydmljZTIuaXNMZWZ0KCkpOworCQlvcmlnU2VydmljZSA9IHNlcnZpY2UyLmxlZnQoKS52YWx1ZSgpOworCisJCUdzb24gcHJldHR5R3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCVN0cmluZyBqc29uID0gcHJldHR5R3Nvbi50b0pzb24ob3JpZ1NlcnZpY2UpOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJU2VydmljZSBmdWxsU2VydmljZSA9IG9yaWdTZXJ2aWNlOworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudCgoU3RyaW5nKSBvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uU2VydmljZSwgIjEiLAorCQkJCQkJdHJ1ZSwgaW5zdGFuY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHN0YXR1cy5pc0xlZnQoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eSA9IGFkZENhcGFiaWxpdHlSZXMubGVmdCgpLnZhbHVlKCk7CisJCWNhcGFiaWxpdHkuc2V0TmFtZShjYXBhYmlsaXR5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IHByb3BlcnR5VmFsdWVzID0gRmFjdG9yeVV0aWxzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHlMaXN0KCk7CisJCWNhcGFiaWxpdHkuc2V0UHJvcGVydGllcyhwcm9wZXJ0eVZhbHVlcyk7CisKKwkJRWl0aGVyPE1hcDxDYXBhYmlsaXR5SW5zdERhdGEsIExpc3Q8UHJvcGVydHlWYWx1ZURhdGE+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFkZENQVnNUb1JpUmVzID0gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuYWRkQ2FwYWJpbGl0eVByb3BlcnR5VmFsdWVzVG9SZXNvdXJjZUluc3RhbmNlKHJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgY2FwYWJpbGl0eSwgdHJ1ZSk7CisJCWFzc2VydFRydWUoYWRkQ1BWc1RvUmlSZXMuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVTZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5jbG9uZVNlcnZpY2UoZnVsbFNlcnZpY2UsICIyLjAiLAorCQkJCWZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllc01hcCA9IGNyZWF0ZVNlcnZpY2UubGVmdCgpLnZhbHVlKCkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzTWFwICE9IG51bGwgJiYgY2FwYWJpbGl0aWVzTWFwLnNpemUoKSA9PSAxKTsKKwkJTWFwPFN0cmluZywgQ2FwYWJpbGl0eURlZmluaXRpb24+IGNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5zdHJlYW0oKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoQ2FwYWJpbGl0eURlZmluaXRpb246OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKwkJYXNzZXJ0VHJ1ZShjYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoIkNhcDEiKSAmJiBjYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoIkNhcDIiKSk7CisKKwkJLy8gU3RyaW5nIG91dHB1dEZpbGUgPSBleHBvcnRHcmFwaE1sKCk7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGV4cG9ydEdyYXBoTWwoKSB7CisJCVN0cmluZyByZXN1bHQgPSBudWxsOworCQlTdHJpbmcgb3V0cHV0RmlsZSA9ICJDOlxcT3V0cHV0IiArIEZpbGUuc2VwYXJhdG9yICsgImV4cG9ydEdyYXBoLiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuZ3JhcGhtbCI7CisJCVRpdGFuR3JhcGggZ3JhcGggPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKTsKKwkJdHJ5IHsKKwkJCXRyeSAoZmluYWwgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpKSkgeworCQkJCWdyYXBoLmlvKElvQ29yZS5ncmFwaG1sKCkpLndyaXRlcigpLm5vcm1hbGl6ZSh0cnVlKS5jcmVhdGUoKS53cml0ZUdyYXBoKG9zLCBncmFwaCk7CisJCQl9CisJCQlyZXN1bHQgPSBvdXRwdXRGaWxlOworCQkJZ3JhcGgudHgoKS5jb21taXQoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWdyYXBoLnR4KCkucm9sbGJhY2soKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKworCX0KKworCXByaXZhdGUgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGJ1aWxkQ2FwYWJpbGl0eVR5cGUoKSB7CisJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZSA9IG5ldyBDYXBhYmlsaXR5VHlwZURlZmluaXRpb24oKTsKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKKworCQljYXBhYmlsaXR5VHlwZS5zZXRUeXBlKENvbnN0YW50cy5ERUZBVUxUX0NBUEFCSUxJVFlfVFlQRSk7CisJCWNhcGFiaWxpdHlUeXBlLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIGhvc3QgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCWhvc3Quc2V0VW5pcXVlSWQoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisJCWhvc3Quc2V0TmFtZSgiaG9zdCIpOworCQlob3N0LnNldERlZmF1bHRWYWx1ZSgiY2FwdHlwZWhvc3QiKTsKKwkJaG9zdC5zZXRUeXBlKCJzdHJpbmciKTsKKworCQlob3N0LnNldFNjaGVtYShuZXcgU2NoZW1hRGVmaW5pdGlvbigpKTsKKwkJaG9zdC5nZXRTY2hlbWEoKS5zZXRQcm9wZXJ0eShuZXcgUHJvcGVydHlEYXRhRGVmaW5pdGlvbigpKTsKKwkJaG9zdC5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUoInN0cmluZyIpOworCisJCVByb3BlcnR5RGVmaW5pdGlvbiBwb3J0ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwb3J0LnNldE5hbWUoInBvcnQiKTsKKwkJcG9ydC5zZXREZWZhdWx0VmFsdWUoImNhcHR5cGVwb3J0Iik7CisJCXBvcnQuc2V0VW5pcXVlSWQoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisJCXBvcnQuc2V0VHlwZSgic3RyaW5nIik7CisKKwkJcG9ydC5zZXRTY2hlbWEobmV3IFNjaGVtYURlZmluaXRpb24oKSk7CisJCXBvcnQuZ2V0U2NoZW1hKCkuc2V0UHJvcGVydHkobmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKSk7CisJCXBvcnQuZ2V0U2NoZW1hKCkuZ2V0UHJvcGVydHkoKS5zZXRUeXBlKCJzdHJpbmciKTsKKworCQlQcm9wZXJ0eURlZmluaXRpb24gcm9vdHByb3BlcnR5ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlyb290cHJvcGVydHkuc2V0TmFtZSgiY2FwdHlwZXByb3BlcnR5Iik7CisJCXJvb3Rwcm9wZXJ0eS5zZXREZWZhdWx0VmFsdWUoImNhcHR5cGV2YWx1ZSIpOworCQlyb290cHJvcGVydHkuc2V0VW5pcXVlSWQoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisJCXJvb3Rwcm9wZXJ0eS5zZXRUeXBlKCJzdHJpbmciKTsKKworCQlyb290cHJvcGVydHkuc2V0U2NoZW1hKG5ldyBTY2hlbWFEZWZpbml0aW9uKCkpOworCQlyb290cHJvcGVydHkuZ2V0U2NoZW1hKCkuc2V0UHJvcGVydHkobmV3IFByb3BlcnR5RGF0YURlZmluaXRpb24oKSk7CisJCXJvb3Rwcm9wZXJ0eS5nZXRTY2hlbWEoKS5nZXRQcm9wZXJ0eSgpLnNldFR5cGUoInN0cmluZyIpOworCisJCXByb3BlcnRpZXMucHV0KCJob3N0IiwgaG9zdCk7CisJCXByb3BlcnRpZXMucHV0KCJwb3J0IiwgcG9ydCk7CisJCXByb3BlcnRpZXMucHV0KCJjYXB0eXBlcHJvcGVydHkiLCByb290cHJvcGVydHkpOworCQlyZXR1cm4gY2FwYWJpbGl0eVR5cGU7CisJfQorCisJcHJpdmF0ZSBDYXBhYmlsaXR5SW5zdERhdGEgYnVpbGRDYXBhYmlsaXR5SW5zdGFuY2VEYXRhKFN0cmluZyByZXNvdXJjZUluc3RhbmNlSWQsIENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHkpIHsKKwkJQ2FwYWJpbGl0eUluc3REYXRhIGNhcGFiaWxpdHlJbnN0YW5jZSA9IG5ldyBDYXBhYmlsaXR5SW5zdERhdGEoKTsKKwkJTG9uZyBjcmVhdGlvblRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2FwYWJpbGl0eUluc3RhbmNlVWlkKHJlc291cmNlSW5zdGFuY2VJZCwgY2FwYWJpbGl0eS5nZXROYW1lKCkpOworCQljYXBhYmlsaXR5SW5zdGFuY2Uuc2V0Q3JlYXRpb25UaW1lKGNyZWF0aW9uVGltZSk7CisJCWNhcGFiaWxpdHlJbnN0YW5jZS5zZXRNb2RpZmljYXRpb25UaW1lKGNyZWF0aW9uVGltZSk7CisJCWNhcGFiaWxpdHlJbnN0YW5jZS5zZXRVbmlxdWVJZCh1bmlxdWVJZCk7CisJCXJldHVybiBjYXBhYmlsaXR5SW5zdGFuY2U7CisJfQorCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZSBidWlsZFJlc291cmNlSW5zdGFuY2UoU3RyaW5nIHJlc3B1cmNlVWlkLCBTdHJpbmcgaW5zdGFuY2VOdW1iZXIsIFN0cmluZyBuYW1lKSB7CisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2UoKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXROYW1lKG5hbWUpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldERlc2NyaXB0aW9uKCJkZXNjMSIpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldFBvc1goIjIwIik7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0UG9zWSgiNDAiKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXRDb21wb25lbnRVaWQocmVzcHVyY2VVaWQpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldENyZWF0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0TW9kaWZpY2F0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0Tm9ybWFsaXplZE5hbWUoUmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvblRlc3Qubm9ybWFsaXNlQ29tcG9uZW50SW5zdGFuY2VOYW1lKG5hbWUpKTsKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2U7CisJfQorCisJcHVibGljIFJlc291cmNlTWV0YWRhdGFEYXRhIGNyZWF0ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUsIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW8pIHsKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGExID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXNlcnZpY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VOYW1lKTsKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZSA9IHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHNlcnZpY2VEYXRhMSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoImNoZWNrIHNlcnZpY2UgY3JlYXRlZCIsIGNyZWF0ZU5vZGUuaXNMZWZ0KCkpOworCQlyZXR1cm4gY3JlYXRlTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgU2VydmljZU1ldGFkYXRhRGF0YSBjcmVhdGVTZXJ2aWNlTWV0YWRhdGFEYXRhKFN0cmluZyBzZXJ2aWNlTmFtZSwgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbykgeworCQlTZXJ2aWNlTWV0YWRhdGFEYXRhIHNlcnZpY2VEYXRhMSA9IG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhKCk7CisJCXNlcnZpY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoc2VydmljZU5hbWUpOworCQlFaXRoZXI8U2VydmljZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZShzZXJ2aWNlRGF0YTEsCisJCQkJU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoImNoZWNrIHNlcnZpY2UgY3JlYXRlZCIsIGNyZWF0ZU5vZGUuaXNMZWZ0KCkpOworCQlyZXR1cm4gY3JlYXRlTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgU2VydmljZSBjcmVhdGVTZXJ2aWNlKFN0cmluZyB1c2VySWQsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgc2VydmljZVZlcnNpb24sCisJCQlib29sZWFuIGlzSGlnaGVzdFZlcnNpb24pIHsKKwkJU2VydmljZSBzZXJ2aWNlID0gYnVpbGRTZXJ2aWNlTWV0YWRhdGEodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uKTsKKwkJc2VydmljZS5zZXRIaWdoZXN0VmVyc2lvbihpc0hpZ2hlc3RWZXJzaW9uKTsKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IHNlcnZpY2VPcGVyYXRpb24uY3JlYXRlU2VydmljZShzZXJ2aWNlLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNMZWZ0KCkpOworCQlTZXJ2aWNlIHJlc3VsdFNlcnZpY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugc3RhdGUiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlyZXN1bHRTZXJ2aWNlLmdldExpZmVjeWNsZVN0YXRlKCkpOworCQlyZXR1cm4gcmVzdWx0U2VydmljZTsKKwl9CisKKwlwcml2YXRlIFNlcnZpY2UgYnVpbGRTZXJ2aWNlTWV0YWRhdGEoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbikgeworCQlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZSgpOworCQlzZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWUpOworCQlzZXJ2aWNlLnNldFZlcnNpb24oc2VydmljZVZlcnNpb24pOworCQlzZXJ2aWNlLnNldERlc2NyaXB0aW9uKCJkZXNjcmlwdGlvbiAxIik7CisJCXNlcnZpY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VySWQpOworCQlzZXJ2aWNlLnNldENvbnRhY3RJZCgiY29udGFjdElkQHNkYy5jb20iKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uIGNhdGVnb3J5RGVmID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOworCQljYXRlZ29yeURlZi5zZXROYW1lKGNhdGVnb3J5KTsKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnlEZWYpOworCQlzZXJ2aWNlLnNldENhdGVnb3JpZXMoY2F0ZWdvcmllcyk7CisJCXNlcnZpY2Uuc2V0SWNvbigiaW1hZ2VzL215LnBuZyIpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZCgiVEFHMSIpOworCQl0YWdzLmFkZCgiVEFHMiIpOworCQlzZXJ2aWNlLnNldFRhZ3ModGFncyk7CisJCXJldHVybiBzZXJ2aWNlOworCX0KKworCXByaXZhdGUgdm9pZCBkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKKwkJU3RyaW5nW10gbmFtZXMgPSBjYXRlZ29yeS5zcGxpdCgiLyIpOworCQlPcGVyYXRpb25UZXN0c1V0aWwuZGVsZXRlQW5kQ3JlYXRlU2VydmljZUNhdGVnb3J5KGNhdGVnb3J5LCB0aXRhbkdlbmVyaWNEYW8pOworCQlPcGVyYXRpb25UZXN0c1V0aWwuZGVsZXRlQW5kQ3JlYXRlUmVzb3VyY2VDYXRlZ29yeShuYW1lc1swXSwgbmFtZXNbMV0sIHRpdGFuR2VuZXJpY0Rhbyk7CisJfQorCisJcHJpdmF0ZSBVc2VyRGF0YSBkZWxldGVBbmRDcmVhdGVVc2VyKFN0cmluZyB1c2VySWQsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIHJvbGUpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKHVzZXJJZCk7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZShmaXJzdE5hbWUpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZShsYXN0TmFtZSk7CisJCWlmIChyb2xlICE9IG51bGwgJiYgIXJvbGUuaXNFbXB0eSgpKSB7CisJCQl1c2VyRGF0YS5zZXRSb2xlKHJvbGUpOworCQl9IGVsc2UgeworCQkJdXNlckRhdGEuc2V0Um9sZSgiQURNSU4iKTsKKwkJfQorCQl0aXRhbkdlbmVyaWNEYW8uZGVsZXRlTm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uVXNlciksIHVzZXJJZCwgVXNlckRhdGEuY2xhc3MpOworCQl0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZSh1c2VyRGF0YSwgVXNlckRhdGEuY2xhc3MpOworCQl0aXRhbkdlbmVyaWNEYW8uY29tbWl0KCk7CisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwdWJsaWMgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgcmVzb3VyY2VOYW1lLAorCQkJU3RyaW5nIHJlc291cmNlVmVyc2lvbiwgU3RyaW5nIHBhcmVudFJlc291cmNlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGlzSGlnaGVzdFZlcnNpb24pIHsKKworCQlTdHJpbmcgcHJvcE5hbWUxID0gImRpc2tfc2l6ZSI7CisJCVN0cmluZyBwcm9wTmFtZTIgPSAibnVtX2NwdXMiOworCisJCUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZiAocGFyZW50UmVzb3VyY2VOYW1lICE9IG51bGwpIHsKKwkJCWRlcml2ZWRGcm9tLmFkZChwYXJlbnRSZXNvdXJjZU5hbWUpOworCQl9CisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlIHJlc291cmNlID0gYnVpbGRSZXNvdXJjZU1ldGFkYXRhKHVzZXJJZCwgY2F0ZWdvcnksIHJlc291cmNlTmFtZSwKKwkJCQlyZXNvdXJjZVZlcnNpb24pOworCisJCXJlc291cmNlLnNldEFic3RyYWN0KGlzQWJzdHJhY3QpOworCQlyZXNvdXJjZS5zZXRIaWdoZXN0VmVyc2lvbihpc0hpZ2hlc3RWZXJzaW9uKTsKKworCQlNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4oKTsKKworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHkxID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eTEuc2V0RGVmYXVsdFZhbHVlKCIxMCIpOworCQlwcm9wZXJ0eTEuc2V0RGVzY3JpcHRpb24oCisJCQkJIlNpemUgb2YgdGhlIGxvY2FsIGRpc2ssIGluIEdpZ2FieXRlcyAoR0IpLCBhdmFpbGFibGUgdG8gYXBwbGljYXRpb25zIHJ1bm5pbmcgb24gdGhlIENvbXB1dGUgbm9kZS4iKTsKKwkJcHJvcGVydHkxLnNldFR5cGUoVG9zY2FUeXBlLklOVEVHRVIubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4oKTsKKwkJR3JlYXRlclRoYW5Db25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludDEgPSBuZXcgR3JlYXRlclRoYW5Db25zdHJhaW50KCIwIik7CisJCWxvZy5kZWJ1Zygie30iLCBwcm9wZXJ0eUNvbnN0cmFpbnQxKTsKKworCQljb25zdHJhaW50cy5hZGQocHJvcGVydHlDb25zdHJhaW50MSk7CisKKwkJTGVzc09yRXF1YWxDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludDIgPSBuZXcgTGVzc09yRXF1YWxDb25zdHJhaW50KCIxMCIpOworCQljb25zdHJhaW50cy5hZGQocHJvcGVydHlDb25zdHJhaW50Mik7CisKKwkJcHJvcGVydHkxLnNldENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKworCQlwcm9wZXJ0aWVzLnB1dChwcm9wTmFtZTEsIHByb3BlcnR5MSk7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5MiA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkyLnNldERlZmF1bHRWYWx1ZSgiMiIpOworCQlwcm9wZXJ0eTIuc2V0RGVzY3JpcHRpb24oIk51bWJlciBvZiAoYWN0dWFsIG9yIHZpcnR1YWwpIENQVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDb21wdXRlIG5vZGUuIik7CisJCXByb3BlcnR5Mi5zZXRUeXBlKFRvc2NhVHlwZS5JTlRFR0VSLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzMyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PigpOworCQlMaXN0PFN0cmluZz4gcmFuZ2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmFuZ2UuYWRkKCIxIik7CisJCXJhbmdlLmFkZCgiNCIpOworCisJCUluUmFuZ2VDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludDMgPSBuZXcgSW5SYW5nZUNvbnN0cmFpbnQocmFuZ2UpOworCQljb25zdHJhaW50czMuYWRkKHByb3BlcnR5Q29uc3RyYWludDMpOworCQlwcm9wZXJ0eTIuc2V0Q29uc3RyYWludHMoY29uc3RyYWludHMzKTsKKwkJcHJvcGVydGllcy5wdXQocHJvcE5hbWUyLCBwcm9wZXJ0eTIpOworCisJCXJlc291cmNlLnNldERlcml2ZWRGcm9tKGRlcml2ZWRGcm9tKTsKKworCQlyZXNvdXJjZS5zZXRQcm9wZXJ0aWVzKGNvbnZlcnRNYXBUb0xpc3QocHJvcGVydGllcykpOworCisJCUVpdGhlcjxvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UsIHRydWUpOworCisJCWFzc2VydFRydWUocmVzdWx0LmlzTGVmdCgpKTsKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2UgcmVzdWx0UmVzb3VyY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugc3RhdGUiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKwkJCQlyZXN1bHRSZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPFByb3BlcnR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gcHJvcGVydHlPcGVyYXRpb24uZ2V0UHJvcGVydHlPZlJlc291cmNlKHByb3BOYW1lMSwKKwkJCQlyZXNvdXJjZUlkKTsKKworCQlhc3NlcnRUcnVlKGVpdGhlci5pc0xlZnQoKSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgZGVmYXVsdCB2YWx1ZSIsIHByb3BlcnR5MS5nZXREZWZhdWx0VmFsdWUoKSwgcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBwcm9wZXJ0eSBkZXNjcmlwdGlvbiIsIHByb3BlcnR5MS5nZXREZXNjcmlwdGlvbigpLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgdHlwZSIsIHByb3BlcnR5MS5nZXRUeXBlKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHByb3BlcnR5IHVuaXF1ZSBpZCIsIHByb3BlcnR5MS5nZXRVbmlxdWVJZCgpLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgY29uc2l0cmFpbnRzIHNpemUiLCBwcm9wZXJ0eTEuZ2V0Q29uc3RyYWludHMoKS5zaXplKCksCisJCQkJcHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKKworCQlyZXR1cm4gcmVzdWx0UmVzb3VyY2U7CisJfQorCisJcHJpdmF0ZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZSBidWlsZFJlc291cmNlTWV0YWRhdGEoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGNhdGVnb3J5LAorCQkJU3RyaW5nIHJlc291cmNlTmFtZSwgU3RyaW5nIHJlc291cmNlVmVyc2lvbikgeworCisJCW9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlIHJlc291cmNlID0gbmV3IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlKCk7CisJCXJlc291cmNlLnNldE5hbWUocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2Uuc2V0VmVyc2lvbihyZXNvdXJjZVZlcnNpb24pOworCQk7CisJCXJlc291cmNlLnNldERlc2NyaXB0aW9uKCJkZXNjcmlwdGlvbiAxIik7CisJCXJlc291cmNlLnNldEFic3RyYWN0KGZhbHNlKTsKKwkJcmVzb3VyY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VySWQpOworCQlyZXNvdXJjZS5zZXRDb250YWN0SWQoImNvbnRhY3RJZEBzZGMuY29tIik7CisJCXJlc291cmNlLnNldFZlbmRvck5hbWUoInZlbmRvciAxIik7CisJCXJlc291cmNlLnNldFZlbmRvclJlbGVhc2UoIjEuMC4wIik7CisJCXJlc291cmNlLnNldFRvc2NhUmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7CisJCVN0cmluZ1tdIGNhdGVnb3J5QXJyID0gY2F0ZWdvcnkuc3BsaXQoIi8iKTsKKwkJcmVzb3VyY2UuYWRkQ2F0ZWdvcnkoY2F0ZWdvcnlBcnJbMF0sIGNhdGVnb3J5QXJyWzFdKTsKKwkJcmVzb3VyY2Uuc2V0SWNvbigiaW1hZ2VzL215LnBuZyIpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZCgiVEFHMSIpOworCQl0YWdzLmFkZCgiVEFHMiIpOworCQlyZXNvdXJjZS5zZXRUYWdzKHRhZ3MpOworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gY29udmVydE1hcFRvTGlzdChNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7CisJCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXROYW1lKG5hbWUpOworCQkJZGVmaW5pdGlvbnMuYWRkKHByb3BlcnR5RGVmaW5pdGlvbik7CisJCX0KKworCQlyZXR1cm4gZGVmaW5pdGlvbnM7CisJfQorCisJcHJpdmF0ZSBVc2VyIGNvbnZlcnRVc2VyRGF0YVRvVXNlcihVc2VyRGF0YSBtb2RpZmllckRhdGEpIHsKKwkJVXNlciBtb2RpZmllciA9IG5ldyBVc2VyKCk7CisJCW1vZGlmaWVyLnNldFVzZXJJZChtb2RpZmllckRhdGEuZ2V0VXNlcklkKCkpOworCQltb2RpZmllci5zZXRFbWFpbChtb2RpZmllckRhdGEuZ2V0RW1haWwoKSk7CisJCW1vZGlmaWVyLnNldEZpcnN0TmFtZShtb2RpZmllckRhdGEuZ2V0Rmlyc3ROYW1lKCkpOworCQltb2RpZmllci5zZXRMYXN0TmFtZShtb2RpZmllckRhdGEuZ2V0TGFzdE5hbWUoKSk7CisJCW1vZGlmaWVyLnNldFJvbGUobW9kaWZpZXJEYXRhLmdldFJvbGUoKSk7CisJCXJldHVybiBtb2RpZmllcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uVGVzdC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Db21wb25lbnRJbnN0YW5jZU9wZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzdjOWYwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Db21wb25lbnRJbnN0YW5jZU9wZXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uSW5qZWN0TW9ja3M7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWRnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhOb2RlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5DYXBhYmlsaXR5SW5zdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVxdWlyZW1lbnREYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnVuaXR0ZXN0cy51dGlscy5GYWN0b3J5VXRpbHM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uVGVzdCB7CisKKwlASW5qZWN0TW9ja3MKKwlDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiA9IG5ldyBDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbigpOworCUBJbmplY3RNb2NrcworCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuR2VuZXJpY0RhbyA9IE1vY2tpdG8ubW9jayhUaXRhbkdlbmVyaWNEYW8uY2xhc3MpOworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisJCU1vY2tpdG8ucmVzZXQodGl0YW5HZW5lcmljRGFvKTsKKwkJTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXBhYmlsaXRpZXMoKSB7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmkgPSBGYWN0b3J5VXRpbHMuY3JlYXRlUmVzb3VyY2VJbnN0YW5jZSgpOworCQlDYXBhYmlsaXR5RGF0YSBjYXBEYXRhID0gRmFjdG9yeVV0aWxzLmNyZWF0ZUNhcGFiaWxpdHlEYXRhKCk7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8R3JhcGhOb2RlLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkTm9kZXNSZXR1cm5lZCA9IHByZXBhcmVDaGlsZE5vZGVSZXRWYWx1ZSgKKwkJCQljYXBEYXRhKTsKKworCQlNb2NraXRvLndoZW4odGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwKKwkJCQlNb2NraXRvLmFueShHcmFwaEVkZ2VMYWJlbHMuY2xhc3MpLCBNb2NraXRvLmFueShOb2RlVHlwZUVudW0uY2xhc3MpLCBNb2NraXRvLmFueSgpKSkKKwkJCQkudGhlblJldHVybihjaGlsZE5vZGVzUmV0dXJuZWQpOworCisJCS8vIEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2UsIExpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5RGF0YSwKKwkJLy8gR3JhcGhFZGdlPj4+IGluc3RhbmNlQW5kQ2FwYWJpbGl0aWVzID0KKwkJLy8gY29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24uZ2V0Q2FwYWJpbGl0aWVzKHJpLAorCQkvLyBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5zdGFuY2VBbmRDYXBhYmlsaXRpZXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5nZXRDYXBhYmlsaXRpZXMocmksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisKKwkJLy8gYXNzZXJ0VHJ1ZShpbnN0YW5jZUFuZENhcGFiaWxpdGllcy5sZWZ0LmdldFVuaXF1ZUlkKCkuZXF1YWxzKHJpLmdldFVuaXF1ZUlkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShpbnN0YW5jZUFuZENhcGFiaWxpdGllcy5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPT0gMSk7CisJCWFzc2VydFRydWUoaW5zdGFuY2VBbmRDYXBhYmlsaXRpZXMubGVmdCgpLnZhbHVlKCkuZ2V0KDApLmxlZnQuZ2V0VW5pcXVlSWQoKS5lcXVhbHMoY2FwRGF0YS5nZXRVbmlxdWVJZCgpKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXF1aXJlbWVudHMoKSB7CisJCUNvbXBvbmVudEluc3RhbmNlIHJpID0gRmFjdG9yeVV0aWxzLmNyZWF0ZVJlc291cmNlSW5zdGFuY2UoKTsKKwkJUmVxdWlyZW1lbnREYXRhIHJlcURhdGEgPSBGYWN0b3J5VXRpbHMuY3JlYXRlUmVxdWlyZW1lbnREYXRhKCk7CisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8R3JhcGhOb2RlLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNoaWxkTm9kZXNSZXR1cm5lZCA9IHByZXBhcmVDaGlsZE5vZGVSZXRWYWx1ZSgKKwkJCQlyZXFEYXRhKTsKKworCQlNb2NraXRvLndoZW4odGl0YW5HZW5lcmljRGFvLmdldENoaWxkcmVuTm9kZXMoTW9ja2l0by5hbnlTdHJpbmcoKSwgTW9ja2l0by5hbnlTdHJpbmcoKSwKKwkJCQlNb2NraXRvLmFueShHcmFwaEVkZ2VMYWJlbHMuY2xhc3MpLCBNb2NraXRvLmFueShOb2RlVHlwZUVudW0uY2xhc3MpLCBNb2NraXRvLmFueSgpKSkKKwkJCQkudGhlblJldHVybihjaGlsZE5vZGVzUmV0dXJuZWQpOworCisJCS8vIEltbXV0YWJsZVBhaXI8Q29tcG9uZW50SW5zdGFuY2UsIExpc3Q8SW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsCisJCS8vIEdyYXBoRWRnZT4+PiBpbnN0YW5jZUFuZENhcGFiaWxpdGllcyA9CisJCS8vIGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmdldFJlcXVpcmVtZW50cyhyaSwKKwkJLy8gTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJRWl0aGVyPExpc3Q8SW1tdXRhYmxlUGFpcjxSZXF1aXJlbWVudERhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5zdGFuY2VBbmRDYXBhYmlsaXRpZXMgPSBjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5nZXRSZXF1aXJlbWVudHMocmksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisKKwkJLy8gYXNzZXJ0VHJ1ZShpbnN0YW5jZUFuZENhcGFiaWxpdGllcy5sZWZ0LmdldFVuaXF1ZUlkKCkuZXF1YWxzKHJpLmdldFVuaXF1ZUlkKCkpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShpbnN0YW5jZUFuZENhcGFiaWxpdGllcy5yaWdodC5zaXplKCkgPT0gMSk7CisJCS8vIGFzc2VydFRydWUoaW5zdGFuY2VBbmRDYXBhYmlsaXRpZXMucmlnaHQuZ2V0KDApLmxlZnQuZ2V0VW5pcXVlSWQoKS5lcXVhbHMocmVxRGF0YS5nZXRVbmlxdWVJZCgpKSk7CisKKwkJYXNzZXJ0VHJ1ZShpbnN0YW5jZUFuZENhcGFiaWxpdGllcy5sZWZ0KCkudmFsdWUoKS5zaXplKCkgPT0gMSk7CisJCWFzc2VydFRydWUoaW5zdGFuY2VBbmRDYXBhYmlsaXRpZXMubGVmdCgpLnZhbHVlKCkuZ2V0KDApLmxlZnQuZ2V0VW5pcXVlSWQoKS5lcXVhbHMocmVxRGF0YS5nZXRVbmlxdWVJZCgpKSk7CisKKwl9CisKKwlwcml2YXRlIENhcGFiaWxpdHlJbnN0RGF0YSBidWlsZENhcGFiaWxpdHlJbnN0YW5jZURhdGEoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VJZCwgQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eSkgeworCQlDYXBhYmlsaXR5SW5zdERhdGEgY2FwYWJpbGl0eUluc3RhbmNlID0gbmV3IENhcGFiaWxpdHlJbnN0RGF0YSgpOworCQlMb25nIGNyZWF0aW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRDYXBhYmlsaXR5SW5zdGFuY2VVaWQocmVzb3VyY2VJbnN0YW5jZUlkLCBjYXBhYmlsaXR5LmdldE5hbWUoKSk7CisKKwkJY2FwYWJpbGl0eUluc3RhbmNlLnNldENyZWF0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQljYXBhYmlsaXR5SW5zdGFuY2Uuc2V0TW9kaWZpY2F0aW9uVGltZShjcmVhdGlvblRpbWUpOworCQljYXBhYmlsaXR5SW5zdGFuY2Uuc2V0VW5pcXVlSWQodW5pcXVlSWQpOworCisJCXJldHVybiBjYXBhYmlsaXR5SW5zdGFuY2U7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPEdyYXBoTm9kZSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcmVwYXJlQ2hpbGROb2RlUmV0VmFsdWUoCisJCQlHcmFwaE5vZGUgZGF0YSkgeworCQlJbW11dGFibGVQYWlyPEdyYXBoTm9kZSwgR3JhcGhFZGdlPiBwYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8PihkYXRhLCBGYWN0b3J5VXRpbHMuY3JlYXRlR3JhcGhFZGdlKCkpOworCQlMaXN0PEltbXV0YWJsZVBhaXI8R3JhcGhOb2RlLCBHcmFwaEVkZ2U+PiByZXRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXJldExpc3QuYWRkKHBhaXIpOworCQlyZXR1cm4gRWl0aGVyLmxlZnQocmV0TGlzdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NvbXBvbmVudE9wZXJhdGlvblRlc3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvQ29tcG9uZW50T3BlcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDE4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0NvbXBvbmVudE9wZXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDM5NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWRnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5GaWx0ZXJLZXlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRQYXJhbWV0ZXJzVmlldzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JQ2FwYWJpbGl0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5JUmVxdWlyZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkNvbXBvbmVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkNhcGFiaWxpdHlJbnN0RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Db21wb25lbnRNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5VmFsdWVEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlcXVpcmVtZW50RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS51bml0dGVzdHMudXRpbHMuRmFjdG9yeVV0aWxzOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRPcGVyYXRpb25UZXN0IHsKKwlASW5qZWN0TW9ja3MKKwlDb21wb25lbnRPcGVyYXRpb24gY29tcE9wZXJhdGlvbiA9IGdldEFubm9uaW11c0ltcGwoKTsKKworCUNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uIGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uID0gTW9ja2l0by5tb2NrKENvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmNsYXNzKTsKKwlUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvID0gTW9ja2l0by5tb2NrKFRpdGFuR2VuZXJpY0Rhby5jbGFzcyk7CisJSUNhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbiA9IE1vY2tpdG8ubW9jayhJQ2FwYWJpbGl0eU9wZXJhdGlvbi5jbGFzcyk7CisJSVJlcXVpcmVtZW50T3BlcmF0aW9uIHJlcXVpcmVtZW50T3BlcmF0aW9uID0gTW9ja2l0by5tb2NrKElSZXF1aXJlbWVudE9wZXJhdGlvbi5jbGFzcyk7CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpIHsKKwkJTW9ja2l0by5yZXNldChjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiwgcmVxdWlyZW1lbnRPcGVyYXRpb24sIGNhcGFiaWxpdHlPcGVyYXRpb24pOworCQlNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldENhcGFiaWxpdGllcygpIHsKKwkJUmVzb3VyY2UgdmYgPSBGYWN0b3J5VXRpbHMuY3JlYXRlVkYoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmkgPSBGYWN0b3J5VXRpbHMuY3JlYXRlUmVzb3VyY2VJbnN0YW5jZSgpOworCQlDYXBhYmlsaXR5RGF0YSBjYXBEYXRhID0gRmFjdG9yeVV0aWxzLmNyZWF0ZUNhcGFiaWxpdHlEYXRhKCk7CisKKwkJRmFjdG9yeVV0aWxzLmFkZENvbXBvbmVudEluc3RhbmNlVG9WRih2ZiwgcmkpOworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPENhcGFiaWxpdHlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcERhdGFMaXN0ID0gcHJlcGFyZUNvbXBPcGVyYXRpb25SZXR1cm5WYWx1ZSgKKwkJCQlyaSwgY2FwRGF0YSk7CisKKwkJcHJlcGFyZU1vY2tzRm9yQ2FwYWJpbGl0aWVzTWV0aG9kcyhyaSwgY2FwRGF0YUxpc3QpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXMgPSBjb21wT3BlcmF0aW9uCisJCQkJLmdldENhcGFiaWxpdGllcyh2ZiwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSkubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoY2FwYWJpbGl0aWVzLnNpemUoKSA9PSAxKTsKKwkJRW50cnk8U3RyaW5nLCBMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPj4gZW50cnkgPSBjYXBhYmlsaXRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKwkJYXNzZXJ0VHJ1ZShlbnRyeS5nZXRLZXkoKS5lcXVhbHMoY2FwRGF0YS5nZXRUeXBlKCkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZShlbnRyeS5nZXRWYWx1ZSgpLmdldCgwKS5nZXRVbmlxdWVJZCgpLmVxdWFscyhjYXBEYXRhLmdldFVuaXF1ZUlkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXF1aXJtZW50cygpIHsKKwkJUmVzb3VyY2UgdmYgPSBGYWN0b3J5VXRpbHMuY3JlYXRlVkYoKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmkgPSBGYWN0b3J5VXRpbHMuY3JlYXRlUmVzb3VyY2VJbnN0YW5jZSgpOworCisJCVJlcXVpcmVtZW50RGF0YSByZXFEYXRhID0gRmFjdG9yeVV0aWxzLmNyZWF0ZVJlcXVpcmVtZW50RGF0YSgpOworCisJCUZhY3RvcnlVdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZVRvVkYodmYsIHJpKTsKKworCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFJlcXVpcmVtZW50RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXFEYXRhRWRnZUxpc3QgPSBwcmVwYXJlQ29tcE9wZXJhdGlvblJldHVyblZhbHVlKAorCQkJCXJpLCByZXFEYXRhKTsKKworCQlwcmVwYXJlTW9ja3NGb3JSZXF1aXJtZW5ldHNNZXRob2RzKHJpLCByZXFEYXRhRWRnZUxpc3QpOworCisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzID0gY29tcE9wZXJhdGlvbgorCQkJCS5nZXRSZXF1aXJlbWVudHModmYsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKHJlcXVpcmVtZW50cy5zaXplKCkgPT0gMSk7CisJCUVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBlbnRyeSA9IHJlcXVpcmVtZW50cy5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOworCQlhc3NlcnRUcnVlKGVudHJ5LmdldEtleSgpLmVxdWFscyhGYWN0b3J5VXRpbHMuQ29uc3RhbnRzLkRFRkFVTFRfQ0FQQUJJTElUWV9UWVBFKSk7CisJCWFzc2VydFRydWUoZW50cnkuZ2V0VmFsdWUoKS5zaXplKCkgPT0gMSk7CisJCWFzc2VydFRydWUoZW50cnkuZ2V0VmFsdWUoKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKS5lcXVhbHMocmVxRGF0YS5nZXRVbmlxdWVJZCgpKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByZXBhcmVNb2Nrc0ZvclJlcXVpcm1lbmV0c01ldGhvZHMoQ29tcG9uZW50SW5zdGFuY2UgcmksCisJCQlFaXRoZXI8TGlzdDxJbW11dGFibGVQYWlyPFJlcXVpcmVtZW50RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXFEYXRhRWRnZUxpc3QpIHsKKworCQl3aGVuKGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLmdldFJlcXVpcmVtZW50cyhyaSwgTm9kZVR5cGVFbnVtLlJlc291cmNlKSkudGhlblJldHVybihyZXFEYXRhRWRnZUxpc3QpOworCQl3aGVuKHJlcXVpcmVtZW50T3BlcmF0aW9uLmdldFJlcXVpcmVtZW50KE1vY2tpdG8uYW55U3RyaW5nKCkpKS50aGVuKGNyZWF0ZVJlcURlZkFuc3dlcigpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJlcGFyZU1vY2tzRm9yQ2FwYWJpbGl0aWVzTWV0aG9kcyhDb21wb25lbnRJbnN0YW5jZSByaSwKKwkJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eURhdGEsIEdyYXBoRWRnZT4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY2FwRGF0YUxpc3QpIHsKKwkJd2hlbihjb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbi5nZXRDYXBhYmlsaXRpZXMocmksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSkpLnRoZW5SZXR1cm4oY2FwRGF0YUxpc3QpOworCQl3aGVuKGNhcGFiaWxpdHlPcGVyYXRpb24uZ2V0Q2FwYWJpbGl0eUJ5Q2FwYWJpbGl0eURhdGEoTW9ja2l0by5hbnkoQ2FwYWJpbGl0eURhdGEuY2xhc3MpKSkKKwkJCQkudGhlbihjcmVhdGVDYXBEZWZCeURhdGFBbnN3ZXIoKSk7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxDYXBhYmlsaXR5SW5zdERhdGEsIEdyYXBoRWRnZT4+IGNhcEluc3RMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUNhcGFiaWxpdHlJbnN0RGF0YSBjdXJDYXBhYmlsaXR5SW5zdCA9IEZhY3RvcnlVdGlscy5jcmVhdGVDYXBhYmlsaXR5SW5zdERhdGEoKTsKKwkJR3JhcGhFZGdlIGVkZ2UgPSBuZXcgR3JhcGhFZGdlKCk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJcHJvcGVydGllcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5DQVBBQklMSVRZX0lELmdldFByb3BlcnR5KCksCisJCQkJY2FwRGF0YUxpc3QubGVmdCgpLnZhbHVlKCkuZ2V0KDApLmdldExlZnQoKS5nZXRVbmlxdWVJZCgpKTsKKwkJZWRnZS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCQlJbW11dGFibGVQYWlyPENhcGFiaWxpdHlJbnN0RGF0YSwgR3JhcGhFZGdlPiBwYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8Q2FwYWJpbGl0eUluc3REYXRhLCBHcmFwaEVkZ2U+KAorCQkJCWN1ckNhcGFiaWxpdHlJbnN0LCBlZGdlKTsKKwkJY2FwSW5zdExpc3QuYWRkKHBhaXIpOworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKAorCQkJCQkJTm9kZVR5cGVFbnVtLmdldEJ5TmFtZUlnbm9yZUNhc2UocmkuZ2V0T3JpZ2luVHlwZSgpLmdldEluc3RhbmNlVHlwZSgpLnRyaW0oKSkpLAorCQkJCXJpLmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5DQVBBQklMSVRZX0lOU1QsIE5vZGVUeXBlRW51bS5DYXBhYmlsaXR5SW5zdCwKKwkJCQlDYXBhYmlsaXR5SW5zdERhdGEuY2xhc3MpKS50aGVuUmV0dXJuKEVpdGhlci5sZWZ0KGNhcEluc3RMaXN0KSk7CisKKwkJd2hlbih0aXRhbkdlbmVyaWNEYW8uZ2V0Q2hpbGQoCisJCQkJVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLmdldEJ5TmFtZShjdXJDYXBhYmlsaXR5SW5zdC5nZXRMYWJlbCgpKSksCisJCQkJY3VyQ2FwYWJpbGl0eUluc3QuZ2V0VW5pcXVlSWQoKSwgR3JhcGhFZGdlTGFiZWxzLklOU1RBTkNFX09GLCBOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSwKKwkJCQlDYXBhYmlsaXR5RGF0YS5jbGFzcykpLnRoZW5SZXR1cm4oRWl0aGVyLmxlZnQoY2FwRGF0YUxpc3QubGVmdCgpLnZhbHVlKCkuZ2V0KDApKSk7CisKKwkJUHJvcGVydHlWYWx1ZURhdGEgcHJvcGVydHlWYWx1ZURhdGEgPSBGYWN0b3J5VXRpbHMuY3JlYXRlUHJvcGVydHlEYXRhKCk7CisJCUltbXV0YWJsZVBhaXI8UHJvcGVydHlWYWx1ZURhdGEsIEdyYXBoRWRnZT4gcHJvcFBhaXIgPSBuZXcgSW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPigKKwkJCQlwcm9wZXJ0eVZhbHVlRGF0YSwgbnVsbCk7CisJCUxpc3Q8SW1tdXRhYmxlUGFpcjxQcm9wZXJ0eVZhbHVlRGF0YSwgR3JhcGhFZGdlPj4gcHJvcFBhaXJMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXByb3BQYWlyTGlzdC5hZGQocHJvcFBhaXIpOworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZHJlbk5vZGVzKAorCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5nZXRCeU5hbWUoY3VyQ2FwYWJpbGl0eUluc3QuZ2V0TGFiZWwoKSkpLAorCQkJCWN1ckNhcGFiaWxpdHlJbnN0LmdldFVuaXF1ZUlkKCksIEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWV9WQUxVRSwgTm9kZVR5cGVFbnVtLlByb3BlcnR5VmFsdWUsCisJCQkJUHJvcGVydHlWYWx1ZURhdGEuY2xhc3MpKS50aGVuUmV0dXJuKEVpdGhlci5sZWZ0KHByb3BQYWlyTGlzdCkpOworCisJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcERlZiA9IEZhY3RvcnlVdGlscworCQkJCS5jb252ZXJ0Q2FwYWJpbGl0eURhdGFUb0NhcGFiaWxpdHlEZWZpbml0aW9uQWRkUHJvcGVydGllcyhjYXBEYXRhTGlzdC5sZWZ0KCkudmFsdWUoKS5nZXQoMCkuZ2V0TGVmdCgpKTsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BEZWZMaXN0ID0gY2FwRGVmLmdldFByb3BlcnRpZXMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMoImhvc3QiKSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BEZWYgPSBwcm9wRGVmTGlzdC5nZXQoMCk7CisJCVByb3BlcnR5RGF0YSBwcm9wRGF0YSA9IEZhY3RvcnlVdGlscy5jb252ZXJ0Q2FwYWJpbGl0eURlZmluaXRpb25Ub0NhcGFiaWxpdHlEYXRhKHByb3BEZWYpOworCisJCUltbXV0YWJsZVBhaXI8UHJvcGVydHlEYXRhLCBHcmFwaEVkZ2U+IGRlZlByb3BQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8UHJvcGVydHlEYXRhLCBHcmFwaEVkZ2U+KHByb3BEYXRhLCBlZGdlKTsKKworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5nZXRDaGlsZCgKKwkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uZ2V0QnlOYW1lKHByb3BlcnR5VmFsdWVEYXRhLmdldExhYmVsKCkpKSwKKwkJCQlwcm9wZXJ0eVZhbHVlRGF0YS5nZXRVbmlxdWVJZCgpLCBHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfSU1QTCwgTm9kZVR5cGVFbnVtLlByb3BlcnR5LAorCQkJCVByb3BlcnR5RGF0YS5jbGFzcykpLnRoZW5SZXR1cm4oRWl0aGVyLmxlZnQoZGVmUHJvcFBhaXIpKTsKKwkJTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4gY2FwRGVmTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXBEZWZMaXN0LmFkZChjYXBEZWYpOworCQl3aGVuKGNvbXBvbmVudEluc3RhbmNlT3BlcmF0aW9uLnVwZGF0ZUNhcERlZlByb3BlcnR5VmFsdWVzKE1vY2tpdG8uYW55KENvbXBvbmVudEluc3RhbmNlLmNsYXNzKSwKKwkJCQlNb2NraXRvLmFueShMaXN0LmNsYXNzKSkpLnRoZW5SZXR1cm4oRWl0aGVyLmxlZnQoY2FwRGVmTGlzdCkpOworCX0KKworCXByaXZhdGUgPERhdGE+IEVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8RGF0YSwgR3JhcGhFZGdlPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBwcmVwYXJlQ29tcE9wZXJhdGlvblJldHVyblZhbHVlKAorCQkJQ29tcG9uZW50SW5zdGFuY2UgcmksIERhdGEgZGF0YSkgeworCQlJbW11dGFibGVQYWlyPERhdGEsIEdyYXBoRWRnZT4gZGF0YUVkZ2VQYWlyID0gbmV3IEltbXV0YWJsZVBhaXI8PihkYXRhLCBuZXcgR3JhcGhFZGdlKCkpOworCQlMaXN0PEltbXV0YWJsZVBhaXI8RGF0YSwgR3JhcGhFZGdlPj4gZGF0YUVkZ2VMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWRhdGFFZGdlTGlzdC5hZGQoZGF0YUVkZ2VQYWlyKTsKKwkJcmV0dXJuIEVpdGhlci5sZWZ0KGRhdGFFZGdlTGlzdCk7CisJfQorCisJcHJpdmF0ZSBBbnN3ZXI8RWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+PiBjcmVhdGVSZXFEZWZBbnN3ZXIoKSB7CisJCXJldHVybiBuZXcgQW5zd2VyPEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4oKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKQorCQkJCQl0aHJvd3MgVGhyb3dhYmxlIHsKKwkJCQlTdHJpbmcgcmVxRGF0YUlkID0gKFN0cmluZykgaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKVswXTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoRmFjdG9yeVV0aWxzLmNvbnZlcnRSZXF1aXJlbWVudERhdGFJRFRvUmVxdWlyZW1lbnREZWZpbml0aW9uKHJlcURhdGFJZCkpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgQW5zd2VyPEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+PiBjcmVhdGVDYXBEZWZCeURhdGFBbnN3ZXIoKSB7CisJCXJldHVybiBuZXcgQW5zd2VyPEVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+PigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikKKwkJCQkJdGhyb3dzIFRocm93YWJsZSB7CisJCQkJQ2FwYWJpbGl0eURhdGEgY2FwRGF0YSA9IChDYXBhYmlsaXR5RGF0YSkgaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKVswXTsKKwkJCQlyZXR1cm4gRWl0aGVyLmxlZnQoRmFjdG9yeVV0aWxzLmNvbnZlcnRDYXBhYmlsaXR5RGF0YVRvQ2FwYWJpbGl0eURlZmluaXRpb25BZGRQcm9wZXJ0aWVzKGNhcERhdGEpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIENvbXBvbmVudE9wZXJhdGlvbiBnZXRBbm5vbmltdXNJbXBsKCkgeworCQlyZXR1cm4gbmV3IENvbXBvbmVudE9wZXJhdGlvbigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RvcmFnZU9wZXJhdGlvblN0YXR1cyB2YWxpZGF0ZUNhdGVnb3JpZXMoQ29tcG9uZW50IGN1cnJlbnRDb21wb25lbnQsIENvbXBvbmVudCBjb21wb25lbnQsCisJCQkJCUNvbXBvbmVudE1ldGFkYXRhRGF0YSBjb21wb25lbnREYXRhLCBOb2RlVHlwZUVudW0gdHlwZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDb21wb25lbnQ+IFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgdXBkYXRlRGVyaXZlZChDb21wb25lbnQgY29tcG9uZW50LAorCQkJCQlDb21wb25lbnQgY3VycmVudENvbXBvbmVudCwgQ29tcG9uZW50TWV0YWRhdGFEYXRhIHVwZGF0ZWRSZXNvdXJjZURhdGEsIENsYXNzPFQ+IGNsYXp6KSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZUNvbXBvbmVudChUIGNvbXBvbmVudCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBFaXRoZXI8SW50ZWdlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gaW5jcmVhc2VBbmRHZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIoU3RyaW5nIGNvbXBvbmVudElkLAorCQkJCQlib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbXBvbmVudE1ldGFkYXRhRGF0YSBnZXRNZXRhRGF0YUZyb21Db21wb25lbnQoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRMaWdodENvbXBvbmVudChTdHJpbmcgaWQsIGJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDb21wb25lbnRCeU5hbWVBbmRWZXJzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwKKwkJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhZGRpdGlvbmFsUGFyYW1zLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0Q29tcG9uZW50KFN0cmluZyBpZCwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQkvLyBAT3ZlcnJpZGUKKwkJCS8vIHB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+CisJCQkvLyBnZXRDb21wb25lbnRfdHgoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCS8vIHJldHVybiBudWxsOworCQkJLy8gfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBFaXRoZXI8TGlzdDxBcnRpZmFjdERlZmluaXRpb24+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRBZGRpdGlvbmFsQXJ0aWZhY3RzKFN0cmluZyByZXNvdXJjZUlkLAorCQkJCQlib29sZWFuIHJlY3Vyc2l2ZWx5LCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIDxUPiBFaXRoZXI8VCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2xvbmVDb21wb25lbnQoVCBvdGhlciwgU3RyaW5nIHZlcnNpb24sCisJCQkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQ29tcG9uZW50IGdldERlZmF1bHRDb21wb25lbnQoKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzQ29tcG9uZW50RXhpc3QoU3RyaW5nIGNvbXBvbmVudElkKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0TWV0YWRhdGFDb21wb25lbnQoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJQ29tcG9uZW50IGNvbnZlcnRDb21wb25lbnRNZXRhZGF0YURhdGFUb0NvbXBvbmVudChDb21wb25lbnRNZXRhZGF0YURhdGEgY29tcG9uZW50TWV0YWRhdGFEYXRhKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHNldENvbXBvbmVudENhdGVnb3JpZXNGcm9tR3JhcGgoQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgRWl0aGVyPEJvb2xlYW4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHZhbGlkYXRlQ29tcG9uZW50TmFtZUV4aXN0cyhTdHJpbmcgY29tcG9uZW50TmFtZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgRWl0aGVyPENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbWFya0NvbXBvbmVudFRvRGVsZXRlKENvbXBvbmVudCBjb21wb25lbnRUb0RlbGV0ZSwKKwkJCQkJYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBFaXRoZXI8Q29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVDb21wb25lbnQoU3RyaW5nIGlkLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBpc0NvbXBvbmVudEluVXNlKFN0cmluZyBjb21wb25lbnRJZCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgRWl0aGVyPExpc3Q8U3RyaW5nPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0QWxsQ29tcG9uZW50c01hcmtlZEZvckRlbGV0aW9uKCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjbG9uZUNvbXBvbmVudChUIG90aGVyLCBTdHJpbmcgdmVyc2lvbiwKKwkJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtIHRhcmdldExpZmVjeWNsZSwgYm9vbGVhbiBpblRyYW5zYWN0aW9uKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8VD4gRWl0aGVyPFQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldENvbXBvbmVudChTdHJpbmcgaWQsCisJCQkJCUNvbXBvbmVudFBhcmFtZXRlcnNWaWV3IGNvbXBvbmVudFBhcmFtZXRlcnNWaWV3LCBib29sZWFuIGluVHJhc25hY3Rpb24pIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIDxUPiBFaXRoZXI8TGlzdDxUPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0RmlsdGVyZWRDb21wb25lbnRzKE1hcDxGaWx0ZXJLZXlFbnVtLCBTdHJpbmc+IGZpbHRlcnMsCisJCQkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbikgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgPFQ+IEVpdGhlcjxULCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVDb21wb25lbnRGaWx0ZXJSZXN1bHQoVCBjb21wb25lbnQsCisJCQkJCWJvb2xlYW4gaW5UcmFuc2FjdGlvbiwgQ29tcG9uZW50UGFyYW1ldGVyc1ZpZXcgZmlsdGVyUGFyYW1ldGVyc1ZpZXcpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvRWxlbWVudE9wZXJhdGlvblRlc3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvRWxlbWVudE9wZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI5MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9FbGVtZW50T3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3RUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk1vZGVsVGVzdEJhc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5FbGVtZW50T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC51dGlsLk9wZXJhdGlvblRlc3RzVXRpbDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5Db250ZXh0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5qdW5pdDQuU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQFJ1bldpdGgoU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitAQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKK3B1YmxpYyBjbGFzcyBFbGVtZW50T3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZGVsVGVzdEJhc2UgeworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJlbGVtZW50LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBFbGVtZW50T3BlcmF0aW9uIGVsZW1lbnRPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gInRpdGFuLWdlbmVyaWMtZGFvIikKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkRhbzsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRFR09SWSA9ICJjYXRlZ29yeSI7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNVQkNBVEVHT1JZID0gInN1YmNhdGVnb3J5IjsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEJlZm9yZUNsYXNzKCkgeworCQkvLyBFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1tb2RlbCIpOworCQkvLyBTdHJpbmcgYXBwQ29uZmlnRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1tb2RlbCI7CisJCS8vIENvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldworCQkvLyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksCisJCS8vIGFwcENvbmZpZ0Rpcik7CisKKwkJTW9kZWxUZXN0QmFzZS5pbml0KCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdHNUeXBlcygpIHsKKworCQlMaXN0PFN0cmluZz4gYXJ0aWZhY3RUeXBlc0NmZyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlhcnRpZmFjdFR5cGVzQ2ZnLmFkZCgidHlwZTEiKTsKKwkJYXJ0aWZhY3RUeXBlc0NmZy5hZGQoInR5cGUyIik7CisJCWFydGlmYWN0VHlwZXNDZmcuYWRkKCJ0eXBlMyIpOworCQlhcnRpZmFjdFR5cGVzQ2ZnLmFkZCgidHlwZTQiKTsKKwkJY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpLnNldEFydGlmYWN0VHlwZXMoYXJ0aWZhY3RUeXBlc0NmZyk7CisJCUVpdGhlcjxMaXN0PEFydGlmYWN0VHlwZT4sIEFjdGlvblN0YXR1cz4gYWxsQXJ0aWZhY3RUeXBlcyA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0QWxsQXJ0aWZhY3RUeXBlcygpOworCQlhc3NlcnRUcnVlKGFsbEFydGlmYWN0VHlwZXMuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMoYXJ0aWZhY3RUeXBlc0NmZy5zaXplKCksIGFsbEFydGlmYWN0VHlwZXMubGVmdCgpLnZhbHVlKCkuc2l6ZSgpKTsKKworCQlhcnRpZmFjdFR5cGVzQ2ZnLnJlbW92ZSgwKTsKKwkJYWxsQXJ0aWZhY3RUeXBlcyA9IGVsZW1lbnRPcGVyYXRpb24uZ2V0QWxsQXJ0aWZhY3RUeXBlcygpOworCQlhc3NlcnRUcnVlKGFsbEFydGlmYWN0VHlwZXMuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMoYXJ0aWZhY3RUeXBlc0NmZy5zaXplKCksIGFsbEFydGlmYWN0VHlwZXMubGVmdCgpLnZhbHVlKCkuc2l6ZSgpKTsKKworCQlhcnRpZmFjdFR5cGVzQ2ZnLmFkZCgidHlwZTUiKTsKKwl9CisKKwkvLyBAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZUFuZFNlcnZpY2VDYXRlZ290eSgpIHsKKwkJU3RyaW5nIGlkID0gT3BlcmF0aW9uVGVzdHNVdGlsLmRlbGV0ZUFuZENyZWF0ZVJlc291cmNlQ2F0ZWdvcnkoQ0FURUdPUlksIFNVQkNBVEVHT1JZLCB0aXRhbkRhbyk7CisKKwkJRWl0aGVyPENhdGVnb3J5RGVmaW5pdGlvbiwgQWN0aW9uU3RhdHVzPiByZXMgPSBlbGVtZW50T3BlcmF0aW9uLmdldENhdGVnb3J5KE5vZGVUeXBlRW51bS5SZXNvdXJjZU5ld0NhdGVnb3J5LAorCQkJCWlkKTsKKwkJYXNzZXJ0VHJ1ZShyZXMuaXNMZWZ0KCkpOworCQlDYXRlZ29yeURlZmluaXRpb24gY2F0ZWdvcnlEZWZpbml0aW9uID0gKENhdGVnb3J5RGVmaW5pdGlvbikgcmVzLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMoQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbi5nZXRTdWJjYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisKKwkJaWQgPSBPcGVyYXRpb25UZXN0c1V0aWwuZGVsZXRlQW5kQ3JlYXRlU2VydmljZUNhdGVnb3J5KENBVEVHT1JZLCB0aXRhbkRhbyk7CisKKwkJcmVzID0gZWxlbWVudE9wZXJhdGlvbi5nZXRDYXRlZ29yeShOb2RlVHlwZUVudW0uU2VydmljZU5ld0NhdGVnb3J5LCBpZCk7CisJCWFzc2VydFRydWUocmVzLmlzTGVmdCgpKTsKKwkJY2F0ZWdvcnlEZWZpbml0aW9uID0gKENhdGVnb3J5RGVmaW5pdGlvbikgcmVzLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMoQ0FURUdPUlksIGNhdGVnb3J5RGVmaW5pdGlvbi5nZXROYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvSGVhdFBhcmFtZXRlcnNPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0hlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjU1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0hlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55TWFwOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnlPYmplY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmVxOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk1vZGVsVGVzdEJhc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuaGVhdC5IZWF0UGFyYW1ldGVyVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5IZWF0UGFyYW1ldGVyc09wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5IZWF0UGFyYW1ldGVyRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5IZWF0UGFyYW1ldGVyVmFsdWVEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBIZWF0UGFyYW1ldGVyc09wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2RlbFRlc3RCYXNlIHsKKworCUhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uIGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uID0gbmV3IEhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uKCk7CisKKwlUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvID0gTW9ja2l0by5tb2NrKFRpdGFuR2VuZXJpY0Rhby5jbGFzcyk7CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisJCWhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLnNldFRpdGFuR2VuZXJpY0Rhbyh0aXRhbkdlbmVyaWNEYW8pOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VUZXN0KCkgeworCisJCVN0cmluZyBwcm9wTmFtZSA9ICJteVByb3AiOworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eSA9IGJ1aWxkSGVhdFByb3BlcnR5RGVmaW5pdGlvbigpOworCisJCUhlYXRQYXJhbWV0ZXJEYXRhIHByb3BlcnR5RGF0YSA9IG5ldyBIZWF0UGFyYW1ldGVyRGF0YShwcm9wZXJ0eSk7CisKKwkJRWl0aGVyPEhlYXRQYXJhbWV0ZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gRWl0aGVyLmxlZnQocHJvcGVydHlEYXRhKTsKKworCQlHcmFwaFJlbGF0aW9uIGdyYXBoUmVsYXRpb24gPSBuZXcgR3JhcGhSZWxhdGlvbigpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlbGF0aW9uUmVzdWx0ID0gRWl0aGVyLmxlZnQoZ3JhcGhSZWxhdGlvbik7CisKKwkJd2hlbih0aXRhbkdlbmVyaWNEYW8uY3JlYXRlTm9kZSgoSGVhdFBhcmFtZXRlckRhdGEpIGFueU9iamVjdCgpLCBlcShIZWF0UGFyYW1ldGVyRGF0YS5jbGFzcykpKQorCQkJCS50aGVuUmV0dXJuKGVpdGhlcik7CisJCXdoZW4odGl0YW5HZW5lcmljRGFvLmNyZWF0ZVJlbGF0aW9uKChHcmFwaE5vZGUpIGFueU9iamVjdCgpLCAoR3JhcGhOb2RlKSBhbnlPYmplY3QoKSwKKwkJCQllcShHcmFwaEVkZ2VMYWJlbHMuSEVBVF9QQVJBTUVURVIpLCBhbnlNYXAoKSkpLnRoZW5SZXR1cm4ocmVsYXRpb25SZXN1bHQpOworCisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmFkZFByb3BlcnR5VG9HcmFwaChwcm9wTmFtZSwKKwkJCQlwcm9wZXJ0eSwgInJlc291cmNlSWQuYXJ0aWZhY3RJZCIsIE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZik7CisKKwkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNMZWZ0KCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUxpc3RUb1Jlc291cmNlVGVzdCgpIHsKKworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eSA9IGJ1aWxkSGVhdFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eTIgPSBidWlsZEhlYXRQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkyLnNldE5hbWUoInAyIik7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+KCk7CisJCXBhcmFtZXRlcnMuYWRkKHByb3BlcnR5KTsKKwkJcGFyYW1ldGVycy5hZGQocHJvcGVydHkyKTsKKworCQlIZWF0UGFyYW1ldGVyRGF0YSBwcm9wZXJ0eURhdGEgPSBuZXcgSGVhdFBhcmFtZXRlckRhdGEocHJvcGVydHkpOworCisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IEVpdGhlci5sZWZ0KHByb3BlcnR5RGF0YSk7CisKKwkJR3JhcGhSZWxhdGlvbiBncmFwaFJlbGF0aW9uID0gbmV3IEdyYXBoUmVsYXRpb24oKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZWxhdGlvblJlc3VsdCA9IEVpdGhlci5sZWZ0KGdyYXBoUmVsYXRpb24pOworCisJCXdoZW4odGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoKEhlYXRQYXJhbWV0ZXJEYXRhKSBhbnlPYmplY3QoKSwgZXEoSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpKSkKKwkJCQkudGhlblJldHVybihlaXRoZXIpOworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbigoR3JhcGhOb2RlKSBhbnlPYmplY3QoKSwgKEdyYXBoTm9kZSkgYW55T2JqZWN0KCksCisJCQkJZXEoR3JhcGhFZGdlTGFiZWxzLkhFQVRfUEFSQU1FVEVSKSwgYW55TWFwKCkpKS50aGVuUmV0dXJuKHJlbGF0aW9uUmVzdWx0KTsKKworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIHJlc3VsdCA9IGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmFkZFByb3BlcnRpZXNUb0dyYXBoKHBhcmFtZXRlcnMsCisJCQkJInJlc291cmNlSWQuYXJ0aWZhY3RJZCIsIE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZik7CisKKwkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0ssIHJlc3VsdCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdWYWx1ZXMoKSB7CisJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLlNUUklORywgIjUwYWFhIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE51bWJlclZhbHVlcygpIHsKKwkJYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuTlVNQkVSLCAiNTAiKSk7CisJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLk5VTUJFUiwgIjUwLjUiKSk7CisJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLk5VTUJFUiwgIjB4MTEiKSk7CisKKwkJYXNzZXJ0RmFsc2UoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLk5VTUJFUiwgImFhYSIpKTsKKwkJYXNzZXJ0RmFsc2UoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLk5VTUJFUiwgIj8+ISIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RKc29uVmFsdWVzKCkgeworCQlhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5KU09OLCAieyBcIm1lbWJlclwiIDogXCI1MFwifSIpKTsKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gYnVpbGRIZWF0Qm9vbGVhblByb3BlcnR5RGVmaW5pdGlvbigKKwkJCQlIZWF0UGFyYW1ldGVyVHlwZS5KU09OLmdldFR5cGUoKSwgInsgXCJtZW1iZXJcIiA6IFwiNTBcIn0iKTsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi52YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5KHByb3BlcnR5RGVmaW5pdGlvbik7CisJCWFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LLCBvcGVyYXRpb25TdGF0dXMpOworCQlhc3NlcnRFcXVhbHMoSGVhdFBhcmFtZXRlclR5cGUuSlNPTi5nZXRUeXBlKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TGlzdFZhbHVlcygpIHsKKwkJYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuQ09NTUFfREVMSU1JVEVEX0xJU1QsICJvbmUsIHR3byIpKTsKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gYnVpbGRIZWF0Qm9vbGVhblByb3BlcnR5RGVmaW5pdGlvbigKKwkJCQlIZWF0UGFyYW1ldGVyVHlwZS5DT01NQV9ERUxJTUlURURfTElTVC5nZXRUeXBlKCksICJvbmUsIHR3byIpOworCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLnZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0ssIG9wZXJhdGlvblN0YXR1cyk7CisJCWFzc2VydEVxdWFscyhIZWF0UGFyYW1ldGVyVHlwZS5DT01NQV9ERUxJTUlURURfTElTVC5nZXRUeXBlKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm9uZSwgdHdvIiwgcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuVmFsdWVzKCkgeworCisJCVN0cmluZ1tdIHRydWVBcnJheSA9IHsgInRydWUiLCAidCIsICIxIiwgIm9uIiwgInkiLCAieWVzIiB9OworCQlTdHJpbmdbXSBmYWxzZUFycmF5ID0geyAiZmFsc2UiLCAiZiIsICIwIiwgIm9mZiIsICJuIiwgIm5vIiB9OworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJ1ZUFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5CT09MRUFOLCB0cnVlQXJyYXlbaV0pKTsKKwkJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IGJ1aWxkSGVhdEJvb2xlYW5Qcm9wZXJ0eURlZmluaXRpb24oCisJCQkJCUhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4uZ2V0VHlwZSgpLCB0cnVlQXJyYXlbaV0pOworCQkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbgorCQkJCQkudmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShwcm9wZXJ0eURlZmluaXRpb24pOworCQkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0ssIG9wZXJhdGlvblN0YXR1cyk7CisJCQlhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOworCisJCQlhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5CT09MRUFOLCB0cnVlQXJyYXlbaV0pKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbiA9IGJ1aWxkSGVhdEJvb2xlYW5Qcm9wZXJ0eURlZmluaXRpb24oSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTi5nZXRUeXBlKCksCisJCQkJCXRydWVBcnJheVtpXS50b1VwcGVyQ2FzZSgpKTsKKwkJCW9wZXJhdGlvblN0YXR1cyA9IGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLnZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJCWFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LLCBvcGVyYXRpb25TdGF0dXMpOworCQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKKworCQkJYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTiwgdHJ1ZUFycmF5W2ldKSk7CisJCQlwcm9wZXJ0eURlZmluaXRpb24gPSBidWlsZEhlYXRCb29sZWFuUHJvcGVydHlEZWZpbml0aW9uKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4uZ2V0VHlwZSgpLAorCQkJCQl0cnVlQXJyYXlbaV0udG9Mb3dlckNhc2UoKSk7CisJCQlvcGVyYXRpb25TdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi52YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5KHByb3BlcnR5RGVmaW5pdGlvbik7CisJCQlhc3NlcnRFcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSywgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCWFzc2VydEVxdWFscygidHJ1ZSIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IGZhbHNlQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4sIGZhbHNlQXJyYXlbaV0pKTsKKwkJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IGJ1aWxkSGVhdEJvb2xlYW5Qcm9wZXJ0eURlZmluaXRpb24oCisJCQkJCUhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4uZ2V0VHlwZSgpLCBmYWxzZUFycmF5W2ldKTsKKwkJCVN0b3JhZ2VPcGVyYXRpb25TdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24KKwkJCQkJLnZhbGlkYXRlQW5kVXBkYXRlUHJvcGVydHkocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJCWFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LLCBvcGVyYXRpb25TdGF0dXMpOworCQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7CisKKwkJCWFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4sIGZhbHNlQXJyYXlbaV0pKTsKKwkJCXByb3BlcnR5RGVmaW5pdGlvbiA9IGJ1aWxkSGVhdEJvb2xlYW5Qcm9wZXJ0eURlZmluaXRpb24oSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTi5nZXRUeXBlKCksCisJCQkJCWZhbHNlQXJyYXlbaV0udG9VcHBlckNhc2UoKSk7CisJCQlvcGVyYXRpb25TdGF0dXMgPSBoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi52YWxpZGF0ZUFuZFVwZGF0ZVByb3BlcnR5KHByb3BlcnR5RGVmaW5pdGlvbik7CisJCQlhc3NlcnRFcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5PSywgb3BlcmF0aW9uU3RhdHVzKTsKKwkJCWFzc2VydEVxdWFscygiZmFsc2UiLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOworCisJCQlhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5CT09MRUFOLCBmYWxzZUFycmF5W2ldKSk7CisJCQlwcm9wZXJ0eURlZmluaXRpb24gPSBidWlsZEhlYXRCb29sZWFuUHJvcGVydHlEZWZpbml0aW9uKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4uZ2V0VHlwZSgpLAorCQkJCQlmYWxzZUFycmF5W2ldLnRvTG93ZXJDYXNlKCkpOworCQkJb3BlcmF0aW9uU3RhdHVzID0gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24udmFsaWRhdGVBbmRVcGRhdGVQcm9wZXJ0eShwcm9wZXJ0eURlZmluaXRpb24pOworCQkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0ssIG9wZXJhdGlvblN0YXR1cyk7CisJCQlhc3NlcnRFcXVhbHMoImZhbHNlIiwgcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJfQorCisJCS8vIGFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4sCisJCS8vICJ0cnVlIikpOworCQkvLyBhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5CT09MRUFOLAorCQkvLyAidCIpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTiwKKwkJLy8gIjEiKSk7CisJCS8vIGFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4sCisJCS8vICJvbiIpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTiwKKwkJLy8gInkiKSk7CisJCS8vIGFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4sCisJCS8vICJ5ZXMiKSk7CisJCS8vIGFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4sCisJCS8vICJmYWxzZSIpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTiwKKwkJLy8gImYiKSk7CisJCS8vIGFzc2VydFRydWUoaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uaXNWYWxpZFZhbHVlKEhlYXRQYXJhbWV0ZXJUeXBlLkJPT0xFQU4sCisJCS8vICIwIikpOworCQkvLyBhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5CT09MRUFOLAorCQkvLyAib2ZmIikpOworCQkvLyBhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5CT09MRUFOLAorCQkvLyAibiIpKTsKKwkJLy8gYXNzZXJ0VHJ1ZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTiwKKwkJLy8gIm5vIikpOworCisJCWFzc2VydEZhbHNlKGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uLmlzVmFsaWRWYWx1ZShIZWF0UGFyYW1ldGVyVHlwZS5CT09MRUFOLCAiYmxhYmxhIikpOworCQlhc3NlcnRGYWxzZShoZWF0UGFyYW1ldGVyc09wZXJhdGlvbi5pc1ZhbGlkVmFsdWUoSGVhdFBhcmFtZXRlclR5cGUuQk9PTEVBTiwgIjIiKSk7CisJfQorCisJcHJpdmF0ZSBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBidWlsZEhlYXRQcm9wZXJ0eURlZmluaXRpb24oKSB7CisJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIHBhcmFtZXRlciA9IG5ldyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbigpOworCisJCXBhcmFtZXRlci5zZXROYW1lKCJwMSIpOworCQlwYXJhbWV0ZXIuc2V0VHlwZSgic3RyaW5nIik7CisJCXBhcmFtZXRlci5zZXREZWZhdWx0VmFsdWUoImRlZiIpOworCQlwYXJhbWV0ZXIuc2V0Q3VycmVudFZhbHVlKCJjdXJyZW50Iik7CisJCXBhcmFtZXRlci5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24iKTsKKworCQlyZXR1cm4gcGFyYW1ldGVyOworCX0KKworCXByaXZhdGUgSGVhdFBhcmFtZXRlckRlZmluaXRpb24gYnVpbGRIZWF0Qm9vbGVhblByb3BlcnR5RGVmaW5pdGlvbihTdHJpbmcgdHlwZSwgU3RyaW5nIGJvb2xWYWx1ZSkgeworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwYXJhbWV0ZXIgPSBuZXcgSGVhdFBhcmFtZXRlckRlZmluaXRpb24oKTsKKworCQlwYXJhbWV0ZXIuc2V0TmFtZSgicGFyYW1ldGVyMSIpOworCQlwYXJhbWV0ZXIuc2V0VHlwZSh0eXBlKTsKKwkJcGFyYW1ldGVyLnNldERlZmF1bHRWYWx1ZShib29sVmFsdWUpOworCQlwYXJhbWV0ZXIuc2V0RGVzY3JpcHRpb24oImRlc2NyaXB0aW9uIik7CisKKwkJcmV0dXJuIHBhcmFtZXRlcjsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5VG9SZXNvdXJjZUluc3RhbmNlVGVzdCgpIHsKKworCQlIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbiBwcm9wZXJ0eSA9IGJ1aWxkSGVhdFByb3BlcnR5RGVmaW5pdGlvbigpOworCisJCUhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEgcHJvcGVydHlEYXRhID0gbmV3IEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEoKTsKKwkJcHJvcGVydHlEYXRhLnNldFVuaXF1ZUlkKCJibGEiKTsKKwkJcHJvcGVydHlEYXRhLnNldFZhbHVlKCJ2YWx1ZTEiKTsKKworCQlFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlciA9IEVpdGhlci5sZWZ0KHByb3BlcnR5RGF0YSk7CisKKwkJR3JhcGhSZWxhdGlvbiBncmFwaFJlbGF0aW9uID0gbmV3IEdyYXBoUmVsYXRpb24oKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZWxhdGlvblJlc3VsdCA9IEVpdGhlci5sZWZ0KGdyYXBoUmVsYXRpb24pOworCisJCXdoZW4odGl0YW5HZW5lcmljRGFvLmNyZWF0ZU5vZGUoKEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEpIGFueU9iamVjdCgpLCBlcShIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLmNsYXNzKSkpCisJCQkJLnRoZW5SZXR1cm4oZWl0aGVyKTsKKwkJd2hlbih0aXRhbkdlbmVyaWNEYW8uY3JlYXRlUmVsYXRpb24oKEdyYXBoTm9kZSkgYW55T2JqZWN0KCksIChHcmFwaE5vZGUpIGFueU9iamVjdCgpLAorCQkJCWVxKEdyYXBoRWRnZUxhYmVscy5QQVJBTUVURVJfVkFMVUUpLCBhbnlNYXAoKSkpLnRoZW5SZXR1cm4ocmVsYXRpb25SZXN1bHQpOworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbigoR3JhcGhOb2RlKSBhbnlPYmplY3QoKSwgKEdyYXBoTm9kZSkgYW55T2JqZWN0KCksCisJCQkJZXEoR3JhcGhFZGdlTGFiZWxzLlBBUkFNRVRFUl9JTVBMKSwgYW55TWFwKCkpKS50aGVuUmV0dXJuKHJlbGF0aW9uUmVzdWx0KTsKKworCQlFaXRoZXI8SGVhdFBhcmFtZXRlclZhbHVlRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uCisJCQkJLmFkZEhlYXRWYWx1ZVRvR3JhcGgocHJvcGVydHksICJhcnRpZmFjdExhYmVsIiwgInJlc291cmNlSW5zdGFuY2VJZC5hcnRpZmFjdElkIiwgInJlc291cmNlSW5zdGFuY2VJZCIpOworCisJCWFzc2VydFRydWUocmVzdWx0LmlzTGVmdCgpKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9JbnRlcmZhY2VPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0ludGVyZmFjZU9wZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWViN2RiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9JbnRlcmZhY2VPcGVyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5BcnRpZmFjdERhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkludGVyZmFjZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk1vZGVsVGVzdEJhc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWwuT3BlcmF0aW9uVGVzdHNVdGlsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlTWV0YWRhdGFEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuQ29udGV4dENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuanVuaXQ0LlNwcmluZ0pVbml0NENsYXNzUnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BSdW5XaXRoKFNwcmluZ0pVbml0NENsYXNzUnVubmVyLmNsYXNzKQorQENvbnRleHRDb25maWd1cmF0aW9uKCJjbGFzc3BhdGg6YXBwbGljYXRpb24tY29udGV4dC10ZXN0LnhtbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJmYWNlT3BlcmF0aW9uVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEludGVyZmFjZU9wZXJhdGlvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIEdzb24gcHJldHR5R3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVNFUl9JRCA9ICJtdXNlcklkIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTkFNRSA9ICJjYXRlZ29yeS9teWNhdGVnb3J5IjsKKwkvLyBJbnRlcmZhY2VMaWZlY3ljbGVPcGVyYXRpb24gaW50ZXJmYWNlT3BlcmF0aW9uID0gbmV3CisJLy8gSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uKCk7CisKKwkvLyBUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvID0gTW9ja2l0by5tb2NrKFRpdGFuR2VuZXJpY0Rhby5jbGFzcyk7CisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJ0aXRhbi1nZW5lcmljLWRhbyIpCisJcHJpdmF0ZSBUaXRhbkdlbmVyaWNEYW8gdGl0YW5EYW87CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImludGVyZmFjZS1vcGVyYXRpb24iKQorCXByaXZhdGUgSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAicmVzb3VyY2Utb3BlcmF0aW9uIikKKwlwcml2YXRlIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJwcm9wZXJ0eS1vcGVyYXRpb24iKQorCXByaXZhdGUgUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb247CisKKwkvLyBAUmVzb3VyY2UobmFtZSA9ICJhcnRpZmFjdC1vcGVyYXRpb24iKQorCS8vIHByaXZhdGUgQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb247CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgY3JlYXRlVXNlckFuZENhdGVnb3J5KCkgeworCQlkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShDQVRFR09SWV9OQU1FKTsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcihVU0VSX0lELCAiZmlyc3RfIiArIFVTRVJfSUQsICJsYXN0XyIgKyBVU0VSX0lEKTsKKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBCZWZvcmVDbGFzcygpIHsKKwkJLy8gRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcE5hbWUoImNhdGFsb2ctbW9kZWwiKTsKKwkJLy8gU3RyaW5nIGFwcENvbmZpZ0RpciA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NhdGFsb2ctbW9kZWwiOworCQkvLyBDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UgPSBuZXcKKwkJLy8gRlNDb25maWd1cmF0aW9uU291cmNlKEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VMaXN0ZW5lcigpLAorCQkvLyBhcHBDb25maWdEaXIpOworCisJCU1vZGVsVGVzdEJhc2UuaW5pdCgpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RHVtbXkoKSB7CisKKwkJYXNzZXJ0VHJ1ZShpbnRlcmZhY2VPcGVyYXRpb24gIT0gbnVsbCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGFkZEludGVyZmFjZVRvUmVzb3VyY2VUZXN0KCkgeworCisJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUgPSAibXljYXBhYmlsaXR5MSI7CisJCVN0cmluZyByZXFOYW1lID0gImhvc3QiOworCQlTdHJpbmcgcmVxTm9kZU5hbWUgPSAidG9zY2Eubm9kZXMuQ29tcHV0ZTEiOworCQlTdHJpbmcgcm9vdE5hbWUgPSAiUm9vdDEwMCI7CisJCVN0cmluZyBzb2Z0d2FyZUNvbXBOYW1lID0gInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IjsKKwkJU3RyaW5nIGNvbXB1dGVOb2RlTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIjsKKwkJU3RyaW5nIG15UmVzb3VyY2VWZXJzaW9uID0gIjMwMC4wIjsKKwkJU3RyaW5nIHJlcVJlbGF0aW9uc2hpcCA9ICJteXJlbGF0aW9uc2hpcCI7CisKKwkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJcmVzb3VyY2VPcGVyYXRpb25UZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIHJlc291cmNlT3BlcmF0aW9uLCBwcm9wZXJ0eU9wZXJhdGlvbik7CisKKwkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMTAwLjAiLCBudWxsLAorCQkJCXRydWUsIHRydWUpOworCisJCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gInN0YW5kYXJkIjsKKwkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZpbml0aW9uID0gYnVpbGRJbnRlcmZhY2VEZWZpbml0aW9uKCk7CisKKwkJT3BlcmF0aW9uIG9wID0gYnVpbGRPcGVyYXRpb25EZWZpbml0aW9uKCk7CisJCU1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3BlcmF0aW9uPigpOworCQlvcGVyYXRpb25zLnB1dCgiQ3JlYXRlIiwgb3ApOworCQlpbnRlcmZhY2VEZWZpbml0aW9uLnNldE9wZXJhdGlvbnMob3BlcmF0aW9ucyk7CisKKwkJRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGludGVyZmFjZU9wZXJhdGlvbgorCQkJCS5hZGRJbnRlcmZhY2VUb1Jlc291cmNlKGludGVyZmFjZURlZmluaXRpb24sIHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCAic3RhbmRhcmQiKTsKKworCQlhc3NlcnRUcnVlKHJlc3VsdC5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCByZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0UmVzb3VyY2VSZXMgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCS5nZXRSZXNvdXJjZShyb290UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoZ2V0UmVzb3VyY2VSZXMuaXNMZWZ0KCkpOworCQlSZXNvdXJjZSByZXNvdXJjZVdpdGhJbnRlcmZhY2UgPSBnZXRSZXNvdXJjZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50ZXJmYWNlcyA9IHJlc291cmNlV2l0aEludGVyZmFjZS5nZXRJbnRlcmZhY2VzKCk7CisJCWFzc2VydE5vdE51bGwoaW50ZXJmYWNlcyk7CisJCWFzc2VydEZhbHNlKGludGVyZmFjZXMuaXNFbXB0eSgpKTsKKwkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZpbml0aW9uMiA9IGludGVyZmFjZXMuZ2V0KGludGVyZmFjZU5hbWUpOworCQlhc3NlcnROb3ROdWxsKGludGVyZmFjZURlZmluaXRpb24yLmdldE9wZXJhdGlvbnMoKSk7CisJCWFzc2VydEZhbHNlKGludGVyZmFjZURlZmluaXRpb24yLmdldE9wZXJhdGlvbnMoKS5pc0VtcHR5KCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVJbnRlcmZhY2VUb1Jlc291cmNlVGVzdCgpIHsKKworCQlTdHJpbmcgcmVxTmFtZSA9ICJob3N0IjsKKwkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QyMDAiOworCQlTdHJpbmcgc29mdHdhcmVDb21wTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudCI7CisKKwkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJcmVzb3VyY2VPcGVyYXRpb25UZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIHJlc291cmNlT3BlcmF0aW9uLCBwcm9wZXJ0eU9wZXJhdGlvbik7CisKKwkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMjAwLjAiLCBudWxsLAorCQkJCXRydWUsIHRydWUpOworCisJCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gInN0YW5kYXJkIjsKKwkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZpbml0aW9uID0gYnVpbGRJbnRlcmZhY2VEZWZpbml0aW9uKCk7CisKKwkJT3BlcmF0aW9uIG9wID0gYnVpbGRPcGVyYXRpb25EZWZpbml0aW9uKCk7CisJCU1hcDxTdHJpbmcsIE9wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3BlcmF0aW9uPigpOworCQlvcGVyYXRpb25zLnB1dCgiY3JlYXRlIiwgb3ApOworCQlpbnRlcmZhY2VEZWZpbml0aW9uLnNldE9wZXJhdGlvbnMob3BlcmF0aW9ucyk7CisKKwkJRWl0aGVyPEludGVyZmFjZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IGludGVyZmFjZU9wZXJhdGlvbgorCQkJCS5hZGRJbnRlcmZhY2VUb1Jlc291cmNlKGludGVyZmFjZURlZmluaXRpb24sIHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCAic3RhbmRhcmQiKTsKKworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChyb290UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHVwZGF0ZU5vZGUuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCS5nZXRSZXNvdXJjZShyb290UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJYXNzZXJ0VHJ1ZShmZXRjaFJvb3RSZXNvdXJjZS5pc0xlZnQoKSk7CisJCVN0cmluZyByb290UmVzb3VyY2VKc29uID0gcHJldHR5R3Nvbi50b0pzb24oZmV0Y2hSb290UmVzb3VyY2UubGVmdCgpLnZhbHVlKCkpOworCQlsb2cuZGVidWcocm9vdFJlc291cmNlSnNvbik7CisKKwkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkiNDAwLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQlhc3NlcnRUcnVlKHJlc3VsdC5pc0xlZnQoKSk7CisJCWxvZy5kZWJ1Zygie30iLCByZXN1bHQubGVmdCgpLnZhbHVlKCkpOworCisJCWFkZEltcGxlbWVudGF0aW9uVG9PcGVyYXRpb24ob3ApOworCQkvLyBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZworCQkvLyBvcGVyYXRpb25OYW1lLE9wZXJhdGlvbiBpbnRlcmYKKworCQlFaXRoZXI8T3BlcmF0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvcFJlc3VsdCA9IGludGVyZmFjZU9wZXJhdGlvbgorCQkJCS51cGRhdGVJbnRlcmZhY2VPcGVyYXRpb24oc29mdHdhcmVDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgInN0YW5kYXJkIiwgImNyZWF0ZSIsIG9wKTsKKwkJLy8gUHJpbnRHcmFwaCBwZyA9IG5ldyBQcmludEdyYXBoKCk7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihwZy5idWlsZEdyYXBoRm9yV2ViZ3JhcGhXaXoodGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSkpOworCQlhc3NlcnRUcnVlKG9wUmVzdWx0LmlzTGVmdCgpKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIG9wUmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldFJlc291cmNlUmVzID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkuZ2V0UmVzb3VyY2Uoc29mdHdhcmVDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoZ2V0UmVzb3VyY2VSZXMuaXNMZWZ0KCkpOworCQlSZXNvdXJjZSByZXNvdXJjZVdpdGhJbnRlcmZhY2UgPSBnZXRSZXNvdXJjZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJTWFwPFN0cmluZywgSW50ZXJmYWNlRGVmaW5pdGlvbj4gaW50ZXJmYWNlcyA9IHJlc291cmNlV2l0aEludGVyZmFjZS5nZXRJbnRlcmZhY2VzKCk7CisJCWFzc2VydE5vdE51bGwoaW50ZXJmYWNlcyk7CisJCWFzc2VydEZhbHNlKGludGVyZmFjZXMuaXNFbXB0eSgpKTsKKwkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlcmZhY2VEZWZpbml0aW9uMiA9IGludGVyZmFjZXMuZ2V0KGludGVyZmFjZU5hbWUpOworCQlhc3NlcnROb3ROdWxsKGludGVyZmFjZURlZmluaXRpb24yLmdldE9wZXJhdGlvbnMoKSk7CisJCWFzc2VydEZhbHNlKGludGVyZmFjZURlZmluaXRpb24yLmdldE9wZXJhdGlvbnMoKS5pc0VtcHR5KCkpOworCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gaW50ZXJmYWNlRGVmaW5pdGlvbjIuZ2V0T3BlcmF0aW9ucygpLmdldCgiY3JlYXRlIik7CisJCWFzc2VydE5vdE51bGwob3BlcmF0aW9uKTsKKwkJYXNzZXJ0Tm90TnVsbChvcGVyYXRpb24uZ2V0SW1wbGVtZW50YXRpb24oKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEltcGxlbWVudGF0aW9uVG9PcGVyYXRpb24oT3BlcmF0aW9uIG9wKSB7CisJCUFydGlmYWN0RGF0YURlZmluaXRpb24gYXJ0aWZhY3REYXRhRGVmID0gbmV3IEFydGlmYWN0RGF0YURlZmluaXRpb24oKTsKKwkJYXJ0aWZhY3REYXRhRGVmLnNldEFydGlmYWN0Q2hlY2tzdW0oIllUZzJNamc0TVdKaE5tSTVOekJpTnpkREZrTVdJPSIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0QXJ0aWZhY3ROYW1lKCJjcmVhdGVfbXlSb290LnNoIik7CisJCWFydGlmYWN0RGF0YURlZi5zZXRBcnRpZmFjdExhYmVsKCJjcmVhdGVfbXlSb290Iik7CisJCWFydGlmYWN0RGF0YURlZi5zZXRBcnRpZmFjdFR5cGUoIlNIRUxMIik7CisJCWFydGlmYWN0RGF0YURlZi5zZXREZXNjcmlwdGlvbigiZ29vZCBkZXNjcmlwdGlvbiIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0RXNJZCgiZXNJZCIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0VW5pcXVlSWQob3AuZ2V0VW5pcXVlSWQoKSArICIuIiArIGFydGlmYWN0RGF0YURlZi5nZXRBcnRpZmFjdExhYmVsKCkpOworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3REZWYgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKGFydGlmYWN0RGF0YURlZiwgIlVFc0RCQW9BQUFBSUFBZUxiMGJEUXoiKTsKKwkJb3Auc2V0SW1wbGVtZW50YXRpb24oYXJ0aWZhY3REZWYpOworCX0KKworCXByaXZhdGUgSW50ZXJmYWNlRGVmaW5pdGlvbiBidWlsZEludGVyZmFjZURlZmluaXRpb24oKSB7CisJCUludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmaW5pdGlvbiA9IG5ldyBJbnRlcmZhY2VEZWZpbml0aW9uKCk7CisJCWludGVyZmFjZURlZmluaXRpb24uc2V0VHlwZSgidG9zY2EuaW50ZXJmYWNlcy5zdGFuZGFyZCIpOworCQlpbnRlcmZhY2VEZWZpbml0aW9uLnNldENyZWF0aW9uRGF0ZShuZXcgTG9uZygxMDEyMzIpKTsKKworCQlyZXR1cm4gaW50ZXJmYWNlRGVmaW5pdGlvbjsKKwl9CisKKwlwcml2YXRlIE9wZXJhdGlvbiBidWlsZE9wZXJhdGlvbkRlZmluaXRpb24oKSB7CisJCU9wZXJhdGlvbiBvcCA9IG5ldyBPcGVyYXRpb24oKTsKKwkJb3Auc2V0Q3JlYXRpb25EYXRlKG5ldyBMb25nKDEwMTIzMikpOworCQlvcC5zZXREZXNjcmlwdGlvbigiYXNkYSIpOworCisJCXJldHVybiBvcDsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7CisJCVN0cmluZ1tdIG5hbWVzID0gY2F0ZWdvcnkuc3BsaXQoIi8iKTsKKwkJT3BlcmF0aW9uVGVzdHNVdGlsLmRlbGV0ZUFuZENyZWF0ZVJlc291cmNlQ2F0ZWdvcnkobmFtZXNbMF0sIG5hbWVzWzFdLCB0aXRhbkRhbyk7CisJfQorCisJcHJpdmF0ZSBVc2VyRGF0YSBkZWxldGVBbmRDcmVhdGVVc2VyKFN0cmluZyB1c2VySWQsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyRGF0YS5zZXRVc2VySWQodXNlcklkKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKGZpcnN0TmFtZSk7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKGxhc3ROYW1lKTsKKworCQl0aXRhbkRhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNyZWF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9MaWZlY3ljbGVPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL0xpZmVjeWNsZU9wZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjA5MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9MaWZlY3ljbGVPcGVyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxOTkxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uZ3JhcGguZGF0YXR5cGUuR3JhcGhSZWxhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzLlNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5BcnRpZmFjdERhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuSW50ZXJmYWNlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTW9kZWxUZXN0QmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudERlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuU2VydmljZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLmNhdGVnb3J5LkNhdGVnb3J5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC51dGlsLk9wZXJhdGlvblRlc3RzVXRpbDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwudXRpbC5SZXNvdXJjZUNyZWF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5MZXNzT3JFcXVhbENvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ2FwYWJpbGl0eURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQ29tcG9uZW50SW5zdGFuY2VEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkludGVyZmFjZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuT3BlcmF0aW9uRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXF1aXJlbWVudERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuU2VydmljZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Vc2VyRGF0YTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LkNvbnRleHRDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0Lmp1bml0NC5TcHJpbmdKVW5pdDRDbGFzc1J1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMuVmVydGV4OworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5WZXJ0ZXg7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQFJ1bldpdGgoU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitAQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVPcGVyYXRpb25UZXN0IGV4dGVuZHMgTW9kZWxUZXN0QmFzZSB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpZmVjeWNsZU9wZXJhdGlvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9IT1NURURfT04gPSAiSG9zdGVkT24iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSRkFDRV9PUEVSQVRJT05fQ1JFQVRFID0gImNyZWF0ZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJGQUNFX05BTUUgPSAic3RhbmRhcmQiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX05BTUUgPSAiY2F0ZWdvcnkvbXljYXRlZ29yeSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gIm15U2VydmljZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRU1FTlRfTkFNRSA9ICJyZXF1aXJlbWVudE5hbWUiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTkFNRSA9ICJjYXBOYW1lIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0lEID0gIm11c2VySWQiOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW87CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIExpZmVjeWNsZU9wZXJhdGlvbiBsaWZlY3ljbGVPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgSW50ZXJmYWNlTGlmZWN5Y2xlT3BlcmF0aW9uIGludGVyZmFjZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAicHJvcGVydHktb3BlcmF0aW9uIikKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJjYXBhYmlsaXR5LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImNvbXBvbmVudC1pbnN0YW5jZS1vcGVyYXRpb24iKQorCXByaXZhdGUgQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAicmVxdWlyZW1lbnQtb3BlcmF0aW9uIikKKwlwcml2YXRlIFJlcXVpcmVtZW50T3BlcmF0aW9uIHJlcXVpcmVtZW50T3BlcmF0aW9uOworCisJVXNlciBjaGVja291dFVzZXI7CisJVXNlciBjaGVja2luVXNlcjsKKwlVc2VyIHJmY1VzZXI7CisJVXNlciB0ZXN0ZXJVc2VyOworCVVzZXIgYWRtaW5Vc2VyOworCisJQFJ1bGUKKwlwdWJsaWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIGluaXRMaWZlY3ljbGVPcGVyYXRpb24oKSB7CisJCU1vZGVsVGVzdEJhc2UuaW5pdCgpOworCQkvLyBuZXcgQ29uZmlndXJhdGlvblNvdXJjZSgpIHsKKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyA8VD4gVCBnZXRBbmRXYXRjaENvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gY2xhc3NOYW1lLAorCQkvLyBDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisJCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8gcmV0dXJuIG51bGw7CisJCS8vIH0KKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyA8VD4gdm9pZCBhZGRXYXRjaENvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gY2xhc3NOYW1lLAorCQkvLyBDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisJCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8KKwkJLy8gfQorCQkvLyB9KTsKKwkJLy8KKworCX0KKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXR1cEJlZm9yZSgpIHsKKwkJY2xlYXJHcmFwaCgpOworCQlVc2VyRGF0YSBtb2RpZmllckRhdGEgPSBkZWxldGVBbmRDcmVhdGVVc2VyKFJlc291cmNlQ3JlYXRpb25VdGlscy5NT0RJRklFUl9BVFRfVUlEICsgImNvIiwKKwkJCQlSZXNvdXJjZUNyZWF0aW9uVXRpbHMuTU9ESUZJRVJfRklSU1RfTkFNRSwgUmVzb3VyY2VDcmVhdGlvblV0aWxzLk1PRElGSUVSX0xBU1RfTkFNRSwgIkFETUlOIik7CisJCWNoZWNrb3V0VXNlciA9IGNvbnZlcnRVc2VyRGF0YVRvVXNlcihtb2RpZmllckRhdGEpOworCisJCW1vZGlmaWVyRGF0YSA9IGRlbGV0ZUFuZENyZWF0ZVVzZXIoUmVzb3VyY2VDcmVhdGlvblV0aWxzLk1PRElGSUVSX0FUVF9VSUQgKyAiY2kiLAorCQkJCVJlc291cmNlQ3JlYXRpb25VdGlscy5NT0RJRklFUl9GSVJTVF9OQU1FLCBSZXNvdXJjZUNyZWF0aW9uVXRpbHMuTU9ESUZJRVJfTEFTVF9OQU1FLCAiQURNSU4iKTsKKwkJY2hlY2tpblVzZXIgPSBjb252ZXJ0VXNlckRhdGFUb1VzZXIobW9kaWZpZXJEYXRhKTsKKworCQltb2RpZmllckRhdGEgPSBkZWxldGVBbmRDcmVhdGVVc2VyKFJlc291cmNlQ3JlYXRpb25VdGlscy5NT0RJRklFUl9BVFRfVUlEICsgInJmYyIsCisJCQkJUmVzb3VyY2VDcmVhdGlvblV0aWxzLk1PRElGSUVSX0ZJUlNUX05BTUUsIFJlc291cmNlQ3JlYXRpb25VdGlscy5NT0RJRklFUl9MQVNUX05BTUUsICJBRE1JTiIpOworCQlyZmNVc2VyID0gY29udmVydFVzZXJEYXRhVG9Vc2VyKG1vZGlmaWVyRGF0YSk7CisKKwkJbW9kaWZpZXJEYXRhID0gZGVsZXRlQW5kQ3JlYXRlVXNlcihSZXNvdXJjZUNyZWF0aW9uVXRpbHMuTU9ESUZJRVJfQVRUX1VJRCArICJ0ZXN0ZXIiLAorCQkJCVJlc291cmNlQ3JlYXRpb25VdGlscy5NT0RJRklFUl9GSVJTVF9OQU1FLCBSZXNvdXJjZUNyZWF0aW9uVXRpbHMuTU9ESUZJRVJfTEFTVF9OQU1FLCAiVEVTVEVSIik7CisJCXRlc3RlclVzZXIgPSBjb252ZXJ0VXNlckRhdGFUb1VzZXIobW9kaWZpZXJEYXRhKTsKKworCQltb2RpZmllckRhdGEgPSBkZWxldGVBbmRDcmVhdGVVc2VyKFJlc291cmNlQ3JlYXRpb25VdGlscy5NT0RJRklFUl9BVFRfVUlEICsgImFkbWluIiwKKwkJCQlSZXNvdXJjZUNyZWF0aW9uVXRpbHMuTU9ESUZJRVJfRklSU1RfTkFNRSwgUmVzb3VyY2VDcmVhdGlvblV0aWxzLk1PRElGSUVSX0xBU1RfTkFNRSwgIkFETUlOIik7CisJCWFkbWluVXNlciA9IGNvbnZlcnRVc2VyRGF0YVRvVXNlcihtb2RpZmllckRhdGEpOworCisJCW1vZGlmaWVyRGF0YSA9IGRlbGV0ZUFuZENyZWF0ZVVzZXIoVVNFUl9JRCwgImZpcnN0XyIgKyBVU0VSX0lELCAibGFzdF8iICsgVVNFUl9JRCwgIkFETUlOIik7CisJCWFkbWluVXNlciA9IGNvbnZlcnRVc2VyRGF0YVRvVXNlcihtb2RpZmllckRhdGEpOworCisJCVN0cmluZ1tdIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRS5zcGxpdCgiLyIpOworCQlPcGVyYXRpb25UZXN0c1V0aWwuZGVsZXRlQW5kQ3JlYXRlU2VydmljZUNhdGVnb3J5KENBVEVHT1JZX05BTUUsIHRpdGFuR2VuZXJpY0Rhbyk7CisJCU9wZXJhdGlvblRlc3RzVXRpbC5kZWxldGVBbmRDcmVhdGVSZXNvdXJjZUNhdGVnb3J5KGNhdGVnb3J5WzBdLCBjYXRlZ29yeVsxXSwgdGl0YW5HZW5lcmljRGFvKTsKKworCX0KKworCUBBZnRlcgorCXB1YmxpYyB2b2lkIHRlYXJkb3duKCkgeworCQljbGVhckdyYXBoKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyR3JhcGgoKSB7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJVGl0YW5HcmFwaCBncmFwaCA9IGdyYXBoUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IGdyYXBoLnF1ZXJ5KCkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRpY2VzICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJVGl0YW5WZXJ0ZXggdmVydGV4ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCS8vIGdyYXBoLnJlbW92ZVZlcnRleCh2ZXJ0ZXgpOworCQkJCXZlcnRleC5yZW1vdmUoKTsKKwkJCX0KKworCQl9CisJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGdldE93bmVyVGVzdCgpIHsKKworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RSZXNvdXJjZShjaGVja291dFVzZXIuZ2V0VXNlcklkKCksICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBudWxsKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRPd25lcihyZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgbW9kaWZpZXIiLCBjaGVja291dFVzZXIuZ2V0VXNlcklkKCksIHJlc291cmNlT3duZXIuZ2V0VXNlcklkKCkpOworCisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqIENIRUNLT1VUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRDZXJ0aWZpZWRUZXN0KCkgeworCisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlID0gY3JlYXRlVGVzdFJlc291cmNlKGFkbWluVXNlci5nZXRVc2VySWQoKSwgIjEuMCIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIG51bGwpOworCQlTdHJpbmcgb3JpZ1VuaXF1ZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvcmlnUmVzb3VyY2VSZXN1bHQgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShvcmlnVW5pcXVlSWQpOworCQlSZXNvdXJjZSBvcmlnUmVzb3VyY2UgPSBvcmlnUmVzb3VyY2VSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uZ2V0Q29tcG9uZW50T3duZXIob3JpZ1VuaXF1ZUlkLAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciByZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjaGVja291dAorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNoZWNrb3V0UmVzcG9uc2UgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNrb3V0Q29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzdWx0UmVzb3VyY2UsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGNoZWNrb3V0UmVzcG9uc2UuaXNMZWZ0KCkpOworCQlSZXNvdXJjZSBjaGVja291dFJlc291cmNlID0gY2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldFZlcnNpb24oKSwgIjEuMSIpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCksIGFkbWluVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCksIGNoZWNrb3V0VXNlci5nZXRVc2VySWQoKSk7CisKKwkJLy8gYXNzZXJ0IG93bmVyIGNoYW5nZWQKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRPd25lcihjaGVja291dFJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJcmVzb3VyY2VPd25lciA9IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU93bmVyLmVxdWFscyhjaGVja291dFVzZXIpKTsKKworCQkvLyBhc3NlcnQgb3JpZ2luYWwgcmVzb3VyY2Ugbm90IGRlbGV0ZWQKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPcmlnUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShvcmlnVW5pcXVlSWQpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGNyZWF0ZWQiLCB0cnVlLCBnZXRPcmlnUmVzb3VyY2UuaXNMZWZ0KCkpOworCQkvLyBhc3NlcnRFcXVhbHMoImFzc2VydCBvcmlnaW5hbCByZXNvdXJjZSBub3QgY2hhbmdlZCIsIG9yaWdSZXNvdXJjZSwKKwkJLy8gZ2V0T3JpZ1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrb3V0RGVmYXVsdFRlc3QoKSB7CisKKwkJUmVzb3VyY2UgcmVzdWx0UmVzb3VyY2UgPSBjcmVhdGVUZXN0UmVzb3VyY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIG51bGwpOworCQlTdHJpbmcgb3JpZ1VuaXF1ZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihvcmlnVW5pcXVlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIHJlc291cmNlT3duZXIgPSBnZXRPd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGNoZWNrb3V0CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tvdXRSZXNwb25zZSA9IChFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuY2hlY2tvdXRDb21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXN1bHRSZXNvdXJjZSwgY2hlY2tvdXRVc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2hlY2tvdXRSZXNwb25zZS5pc0xlZnQoKSk7CisJCVJlc291cmNlIGNoZWNrb3V0UmVzb3VyY2UgPSBjaGVja291dFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNrb3V0UmVzb3VyY2UuZ2V0VmVyc2lvbigpLCAiMC4yIik7CisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKSwgY2hlY2tpblVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLCBjaGVja291dFVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5pc0hpZ2hlc3RWZXJzaW9uKCksIHRydWUpOworCisJCS8vIGFzc2VydCBvd25lciBjaGFuZ2VkCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50T3duZXIoY2hlY2tvdXRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5pc0xlZnQoKSk7CisJCXJlc291cmNlT3duZXIgPSBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUocmVzb3VyY2VPd25lci5lcXVhbHMoY2hlY2tvdXRVc2VyKSk7CisKKwkJLy8gYXNzZXJ0IG9yaWdpbmFsIHJlc291cmNlIG5vdCBkZWxldGVkCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3JpZ1Jlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2Uob3JpZ1VuaXF1ZUlkKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBjcmVhdGVkIiwgdHJ1ZSwgZ2V0T3JpZ1Jlc291cmNlLmlzTGVmdCgpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJhc3NlcnQgb3JpZ2luYWwgcmVzb3VyY2Ugbm90IGNoYW5nZWQiLCBvcmlnUmVzb3VyY2UsCisJCS8vIGdldE9yaWdSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYXNzZXJ0IG9yaWdpbmFsIHJlc291cmNlIG5vdCBoaWdoZXN0IHZlcnNpb24iLCBmYWxzZSwKKwkJCQlnZXRPcmlnUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuaXNIaWdoZXN0VmVyc2lvbigpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrb3V0RnVsbFJlc291cmNlVGVzdCgpIHsKKworCQlSZXNvdXJjZSBvcmlnUmVzb3VyY2UgPSBjcmVhdGVGdWxsVGVzdFJlc291cmNlKGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpLCAiMC4xIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJU3RyaW5nIG9yaWdVbmlxdWVJZCA9IG9yaWdSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uLmdldENvbXBvbmVudE93bmVyKG9yaWdVbmlxdWVJZCwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gY2hlY2tvdXQKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja291dFJlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jaGVja291dENvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIG9yaWdSZXNvdXJjZSwgY2hlY2tvdXRVc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2hlY2tvdXRSZXNwb25zZS5pc0xlZnQoKSk7CisJCVJlc291cmNlIGNoZWNrb3V0UmVzb3VyY2UgPSBjaGVja291dFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNrb3V0UmVzb3VyY2UuZ2V0VmVyc2lvbigpLCAiMC4yIik7CisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKSwgY2hlY2tpblVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLCBjaGVja291dFVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5pc0hpZ2hlc3RWZXJzaW9uKCksIHRydWUpOworCisJCWFzc2VydE5vdE51bGwoY2hlY2tvdXRSZXNvdXJjZS5nZXRBcnRpZmFjdHMoKSk7CisJCWFzc2VydEZhbHNlKGNoZWNrb3V0UmVzb3VyY2UuZ2V0QXJ0aWZhY3RzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChjaGVja291dFJlc291cmNlLmdldEludGVyZmFjZXMoKSk7CisJCWFzc2VydEZhbHNlKGNoZWNrb3V0UmVzb3VyY2UuZ2V0SW50ZXJmYWNlcygpLmlzRW1wdHkoKSk7CisJCU1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+IGludGVyZmFjZXMgPSBjaGVja291dFJlc291cmNlLmdldEludGVyZmFjZXMoKTsKKwkJYXNzZXJ0VHJ1ZShpbnRlcmZhY2VzLmNvbnRhaW5zS2V5KElOVEVSRkFDRV9OQU1FKSk7CisJCUludGVyZmFjZURlZmluaXRpb24gaW50ZXJmYWNlRGVmID0gaW50ZXJmYWNlcy5nZXQoSU5URVJGQUNFX05BTUUpOworCQlNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBpbnRlcmZhY2VEZWYuZ2V0T3BlcmF0aW9ucygpOworCQlhc3NlcnROb3ROdWxsKG9wZXJhdGlvbnMpOworCQlhc3NlcnRGYWxzZShvcGVyYXRpb25zLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUob3BlcmF0aW9ucy5jb250YWluc0tleShJTlRFUkZBQ0VfT1BFUkFUSU9OX0NSRUFURSkpOworCQlPcGVyYXRpb24gb3AgPSBvcGVyYXRpb25zLmdldChJTlRFUkZBQ0VfT1BFUkFUSU9OX0NSRUFURSk7CisJCWFzc2VydE5vdE51bGwob3AuZ2V0SW1wbGVtZW50YXRpb24oKSk7CisKKwkJLy8gYXNzZXJ0IG93bmVyIGNoYW5nZWQKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRPd25lcihjaGVja291dFJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJcmVzb3VyY2VPd25lciA9IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU93bmVyLmVxdWFscyhjaGVja291dFVzZXIpKTsKKworCQkvLyBhc3NlcnQgb3JpZ2luYWwgcmVzb3VyY2Ugbm90IGRlbGV0ZWQKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPcmlnUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShvcmlnVW5pcXVlSWQpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGNyZWF0ZWQiLCB0cnVlLCBnZXRPcmlnUmVzb3VyY2UuaXNMZWZ0KCkpOworCQkvLyBhc3NlcnRFcXVhbHMoImFzc2VydCBvcmlnaW5hbCByZXNvdXJjZSBub3QgY2hhbmdlZCIsIG9yaWdSZXNvdXJjZSwKKwkJLy8gZ2V0T3JpZ1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhc3NlcnQgb3JpZ2luYWwgcmVzb3VyY2Ugbm90IGhpZ2hlc3QgdmVyc2lvbiIsIGZhbHNlLAorCQkJCWdldE9yaWdSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKS5pc0hpZ2hlc3RWZXJzaW9uKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VPd25lclJlc291cmNlTm90RXhpc3RUZXN0KCkgeworCisJCS8vIGNyZWF0ZSByZXNvdXJjZSBtZXRhZGF0YQorCQlSZXNvdXJjZSByZXNvdXJjZSA9IGJ1aWxkUmVzb3VyY2VNZXRhZGF0YShhZG1pblVzZXIuZ2V0VXNlcklkKCksIENBVEVHT1JZX05BTUUpOworCQlyZXNvdXJjZS5zZXRMaWZlY3ljbGVTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKTsKKwkJcmVzb3VyY2Uuc2V0VW5pcXVlSWQoIm15LXJlc291cmNlLjAuMSIpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gb3JpZ1Jlc291cmNlUmVzdWx0ID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UoIm15LXJlc291cmNlLjAuMSIpOworCQlhc3NlcnRFcXVhbHMoImFzc2VydCByZXNvdXJjZSBub3QgZXhpc3QiLCB0cnVlLCBvcmlnUmVzb3VyY2VSZXN1bHQuaXNSaWdodCgpKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugb3duZXIKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcigibXktcmVzb3VyY2UuMC4xIiwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImFzc2VydCBubyBvd25lciIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNSaWdodCgpKTsKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBzdGF0dXMgPSBnZXRPd25lclJlc3BvbnNlLnJpZ2h0KCkudmFsdWUoKTsKKworCQlhc3NlcnRFcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5JTlZBTElEX0lELCBzdGF0dXMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja291dFJlc291cmNlVHdpY2UoKSB7CisKKwkJUmVzb3VyY2UgcmVzdWx0UmVzb3VyY2UgPSBjcmVhdGVUZXN0UmVzb3VyY2UoYWRtaW5Vc2VyLmdldFVzZXJJZCgpLCAiMS4wIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgbnVsbCk7CisJCVN0cmluZyBvcmlnVW5pcXVlSWQgPSByZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG9yaWdSZXNvdXJjZVJlc3VsdCA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKG9yaWdVbmlxdWVJZCk7CisJCVJlc291cmNlIG9yaWdSZXNvdXJjZSA9IG9yaWdSZXNvdXJjZVJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihvcmlnVW5pcXVlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIHJlc291cmNlT3duZXIgPSBnZXRPd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGZpcnN0IGNoZWNrb3V0CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tvdXRSZXNwb25zZTEgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNrb3V0Q29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzdWx0UmVzb3VyY2UsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGNoZWNrb3V0UmVzcG9uc2UxLmlzTGVmdCgpKTsKKworCQkvLyBzZWNvbmQgY2hlY2tvdXQKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja291dFJlc3BvbnNlMiA9IChFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuY2hlY2tvdXRDb21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBvcmlnUmVzb3VyY2UsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNoZWNrb3V0IGZhaWxlZCIsIHRydWUsIGNoZWNrb3V0UmVzcG9uc2UyLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkVOVElUWV9BTFJFQURZX0VYSVNUUywgY2hlY2tvdXRSZXNwb25zZTIucmlnaHQoKS52YWx1ZSgpKTsKKworCX0KKworCS8qKioqKioqKiBTRVJWSUNFICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja291dFNlcnZpY2VEZWZhdWx0VGVzdCgpIHsKKworCQlTZXJ2aWNlIHJlc3VsdFJlc291cmNlID0gY3JlYXRlVGVzdFNlcnZpY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIG51bGwpOworCQlTdHJpbmcgb3JpZ1VuaXF1ZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihvcmlnVW5pcXVlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gY2hlY2tvdXQKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNoZWNrb3V0UmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuY2hlY2tvdXRDb21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFJlc291cmNlLCBjaGVja291dFVzZXIsIHJlc291cmNlT3duZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBjaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJQ29tcG9uZW50IGNoZWNrb3V0UmVzb3VyY2UgPSBjaGVja291dFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNrb3V0UmVzb3VyY2UuZ2V0VmVyc2lvbigpLCAiMC4yIik7CisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKSwgY2hlY2tpblVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLCBjaGVja291dFVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5pc0hpZ2hlc3RWZXJzaW9uKCksIHRydWUpOworCisJCS8vIGFzc2VydCBvd25lciBjaGFuZ2VkCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50T3duZXIoY2hlY2tvdXRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uU2VydmljZSwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJcmVzb3VyY2VPd25lciA9IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU93bmVyLmVxdWFscyhjaGVja291dFVzZXIpKTsKKworCQkvLyBhc3NlcnQgb3JpZ2luYWwgcmVzb3VyY2Ugbm90IGRlbGV0ZWQKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE9yaWdSZXNvdXJjZSA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZShvcmlnVW5pcXVlSWQpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGNyZWF0ZWQiLCB0cnVlLCBnZXRPcmlnUmVzb3VyY2UuaXNMZWZ0KCkpOworCQkvLyBhc3NlcnRFcXVhbHMoImFzc2VydCBvcmlnaW5hbCByZXNvdXJjZSBub3QgY2hhbmdlZCIsIG9yaWdSZXNvdXJjZSwKKwkJLy8gZ2V0T3JpZ1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhc3NlcnQgb3JpZ2luYWwgcmVzb3VyY2Ugbm90IGhpZ2hlc3QgdmVyc2lvbiIsIGZhbHNlLAorCQkJCWdldE9yaWdSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKS5pc0hpZ2hlc3RWZXJzaW9uKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRGdWxsU2VydmljZVRlc3QoKSB7CisKKwkJU2VydmljZSBvcmlnU2VydmljZSA9IGNyZWF0ZVRlc3RTZXJ2aWNlKGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpLCAiMC4xIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBudWxsKTsKKwkJU3RyaW5nIG9yaWdVbmlxdWVJZCA9IG9yaWdTZXJ2aWNlLmdldFVuaXF1ZUlkKCk7CisKKwkJLy8gYWRkIGFydGlmYWN0cworCQlhZGRBcnRpZmFjdFRvU2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgb3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKSwgImluc3RhbGxfYXBhY2hlIik7CisJCWFkZEFydGlmYWN0VG9TZXJ2aWNlKGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpLCBvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpLCAic3RhcnRfYXBhY2hlIik7CisKKwkJLy8gYWRkIHJlc291cmNlIGluc3RhbmNlcworCQlSZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uVGVzdCByaVRlc3QgPSBuZXcgUmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvblRlc3QoKTsKKwkJcmlUZXN0LnNldE9wZXJhdGlvbnModGl0YW5HZW5lcmljRGFvLCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiwgcmVxdWlyZW1lbnRPcGVyYXRpb24sIGNhcGFiaWxpdHlPcGVyYXRpb24sCisJCQkJcmVzb3VyY2VPcGVyYXRpb24sIHByb3BlcnR5T3BlcmF0aW9uLCByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uKTsKKwkJcmlUZXN0LmFkZFJlc291cmNlSW5zdGFuY2VzQW5kUmVsYXRpb24ob3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uZ2V0Q29tcG9uZW50T3duZXIob3JpZ1VuaXF1ZUlkLAorCQkJCU5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIHJlc291cmNlT3duZXIgPSBnZXRPd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlQmVmb3JlQ2hlY2tvdXQgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uob3JpZ1VuaXF1ZUlkLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlQmVmb3JlQ2hlY2tvdXQuaXNMZWZ0KCkpOworCQlvcmlnU2VydmljZSA9IHNlcnZpY2VCZWZvcmVDaGVja291dC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjaGVja291dAorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tvdXRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jaGVja291dENvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgb3JpZ1NlcnZpY2UsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGNoZWNrb3V0UmVzcG9uc2UuaXNMZWZ0KCkpOworCQlTZXJ2aWNlIGNoZWNrb3V0UmVzb3VyY2UgPSAoU2VydmljZSkgY2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCWFzc2VydEVxdWFscyhjaGVja291dFJlc291cmNlLmdldFZlcnNpb24oKSwgIjAuMiIpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tvdXRSZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCksIGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNrb3V0UmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSwgY2hlY2tvdXRVc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNrb3V0UmVzb3VyY2UuaXNIaWdoZXN0VmVyc2lvbigpLCB0cnVlKTsKKworCQlhc3NlcnROb3ROdWxsKGNoZWNrb3V0UmVzb3VyY2UuZ2V0QXJ0aWZhY3RzKCkpOworCQlhc3NlcnRGYWxzZShjaGVja291dFJlc291cmNlLmdldEFydGlmYWN0cygpLmlzRW1wdHkoKSk7CisJCWFzc2VydE5vdE51bGwoY2hlY2tvdXRSZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSk7CisJCWFzc2VydEZhbHNlKGNoZWNrb3V0UmVzb3VyY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChjaGVja291dFJlc291cmNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpKTsKKwkJYXNzZXJ0RmFsc2UoY2hlY2tvdXRSZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKS5pc0VtcHR5KCkpOworCisJCS8vIGFzc2VydCBvd25lciBjaGFuZ2VkCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50T3duZXIoY2hlY2tvdXRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uU2VydmljZSwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJcmVzb3VyY2VPd25lciA9IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU93bmVyLmVxdWFscyhjaGVja291dFVzZXIpKTsKKworCQkvLyBhc3NlcnQgb3JpZ2luYWwgcmVzb3VyY2Ugbm90IGRlbGV0ZWQKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE9yaWdSZXNvdXJjZSA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZShvcmlnVW5pcXVlSWQpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHNlcnZpY2UgY3JlYXRlZCIsIHRydWUsIGdldE9yaWdSZXNvdXJjZS5pc0xlZnQoKSk7CisJCS8vIGFzc2VydEVxdWFscygiYXNzZXJ0IG9yaWdpbmFsIHJlc291cmNlIG5vdCBjaGFuZ2VkIiwgb3JpZ1Jlc291cmNlLAorCQkvLyBnZXRPcmlnUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImFzc2VydCBvcmlnaW5hbCBzZXJ2aWNlIG5vdCBoaWdoZXN0IHZlcnNpb24iLCBmYWxzZSwKKwkJCQlnZXRPcmlnUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuaXNIaWdoZXN0VmVyc2lvbigpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrb3V0U2VydmljZVR3aWNlKCkgeworCisJCVNlcnZpY2UgcmVzdWx0UmVzb3VyY2UgPSBjcmVhdGVUZXN0U2VydmljZShhZG1pblVzZXIuZ2V0VXNlcklkKCksICIxLjAiLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELCBudWxsKTsKKwkJU3RyaW5nIG9yaWdVbmlxdWVJZCA9IHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvcmlnUmVzb3VyY2VSZXN1bHQgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uob3JpZ1VuaXF1ZUlkKTsKKwkJU2VydmljZSBvcmlnUmVzb3VyY2UgPSBvcmlnUmVzb3VyY2VSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uZ2V0Q29tcG9uZW50T3duZXIob3JpZ1VuaXF1ZUlkLAorCQkJCU5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIHJlc291cmNlT3duZXIgPSBnZXRPd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGZpcnN0IGNoZWNrb3V0CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja291dFJlc3BvbnNlMSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jaGVja291dENvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0UmVzb3VyY2UsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGNoZWNrb3V0UmVzcG9uc2UxLmlzTGVmdCgpKTsKKworCQkvLyBzZWNvbmQgY2hlY2tvdXQKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNoZWNrb3V0UmVzcG9uc2UyID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNrb3V0Q29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBvcmlnUmVzb3VyY2UsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNoZWNrb3V0IGZhaWxlZCIsIHRydWUsIGNoZWNrb3V0UmVzcG9uc2UyLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLkVOVElUWV9BTFJFQURZX0VYSVNUUywgY2hlY2tvdXRSZXNwb25zZTIucmlnaHQoKS52YWx1ZSgpKTsKKworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIRUNLSU4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNraW5EZWZhdWx0VGVzdCgpIHsKKworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RSZXNvdXJjZShhZG1pblVzZXIuZ2V0VXNlcklkKCksICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBudWxsKTsKKwkJU3RyaW5nIG9yaWdVbmlxdWVJZCA9IHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uZ2V0Q29tcG9uZW50T3duZXIob3JpZ1VuaXF1ZUlkLAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciByZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjaGVja2luCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tpblJlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jaGVja2luQ29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzdWx0UmVzb3VyY2UsIGNoZWNraW5Vc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2hlY2tpblJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJUmVzb3VyY2UgY2hlY2tpblJlc291cmNlID0gY2hlY2tpblJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCWFzc2VydEVxdWFscyhjaGVja2luUmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscyhjaGVja2luUmVzb3VyY2UuZ2V0VmVyc2lvbigpLCAiMC4xIik7CisJCWFzc2VydEVxdWFscyhjaGVja2luUmVzb3VyY2UuZ2V0Q3JlYXRvclVzZXJJZCgpLCBhZG1pblVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tpblJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCksIGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpKTsKKworCQkvLyBhc3NlcnQgb3duZXIgY2hhbmdlZAorCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJDaGVja291dFJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKGNoZWNraW5SZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5pc0xlZnQoKSk7CisJCXJlc291cmNlT3duZXIgPSBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUocmVzb3VyY2VPd25lci5lcXVhbHMoY2hlY2tpblVzZXIpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tpbkZyb21SZmNUZXN0KCkgeworCisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlID0gY3JlYXRlVGVzdFJlc291cmNlKGFkbWluVXNlci5nZXRVc2VySWQoKSwgIjAuMSIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIG51bGwpOworCQlTdHJpbmcgb3JpZ1VuaXF1ZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihvcmlnVW5pcXVlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIHJlc291cmNlT3duZXIgPSBnZXRPd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGNoZWNraW4KKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjaGVja2luUmVzcG9uc2UgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNraW5Db21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXN1bHRSZXNvdXJjZSwgY2hlY2tpblVzZXIsIHJlc291cmNlT3duZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBjaGVja2luUmVzcG9uc2UuaXNMZWZ0KCkpOworCisJCS8vIHJmYworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJmY1Jlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGNoZWNraW5SZXNwb25zZS5sZWZ0KCkudmFsdWUoKSwgcmZjVXNlciwKKwkJCQkJCWNoZWNraW5Vc2VyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2hlY2tpblJlc3BvbnNlLmlzTGVmdCgpKTsKKworCQkvLyBjaGVja2luIChjYW5jZWwgcmZjKQorCQljaGVja2luUmVzcG9uc2UgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNraW5Db21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZmNSZXNwb25zZS5sZWZ0KCkudmFsdWUoKSwgY2hlY2tpblVzZXIsIHJmY1VzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBjaGVja2luUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlyZXN1bHRSZXNvdXJjZSA9IGNoZWNraW5SZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlhc3NlcnRFcXVhbHMocmVzdWx0UmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWFzc2VydEVxdWFscyhyZXN1bHRSZXNvdXJjZS5nZXRWZXJzaW9uKCksICIwLjEiKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdFJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKSwgYWRtaW5Vc2VyLmdldFVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdFJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCksIGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpKTsKKworCQkvLyBhc3NlcnQgb3duZXIgY2hhbmdlZAorCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJDaGVja291dFJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJcmVzb3VyY2VPd25lciA9IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU93bmVyLmVxdWFscyhjaGVja2luVXNlcikpOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNSaWdodCgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEocmVzb3VyY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsCisJCQkJcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpLCBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKworCX0KKworCS8qKiogU0VSVklDRSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tpblNlcnZpY2VEZWZhdWx0VGVzdCgpIHsKKworCQlTZXJ2aWNlIHJlc3VsdFNlcnZpY2UgPSBjcmVhdGVUZXN0U2VydmljZShhZG1pblVzZXIuZ2V0VXNlcklkKCksICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBudWxsKTsKKwkJU3RyaW5nIG9yaWdVbmlxdWVJZCA9IHJlc3VsdFNlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihvcmlnVW5pcXVlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gY2hlY2tpbgorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tpblJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNraW5Db21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFNlcnZpY2UsIGNoZWNraW5Vc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgc2VydmljZSBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBjaGVja2luUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlTZXJ2aWNlIGNoZWNraW5SZXNvdXJjZSA9IChTZXJ2aWNlKSBjaGVja2luUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJYXNzZXJ0RXF1YWxzKGNoZWNraW5SZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNraW5SZXNvdXJjZS5nZXRWZXJzaW9uKCksICIwLjEiKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNraW5SZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCksIGFkbWluVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luUmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSwgY2hlY2tpblVzZXIuZ2V0VXNlcklkKCkpOworCisJCS8vIGFzc2VydCBvd25lciBjaGFuZ2VkCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50T3duZXIoY2hlY2tpblJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UuaXNMZWZ0KCkpOworCQlyZXNvdXJjZU93bmVyID0gZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKHJlc291cmNlT3duZXIuZXF1YWxzKGNoZWNraW5Vc2VyKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNraW5TZXJ2aWNlRnJvbVJmY1Rlc3QoKSB7CisKKwkJU2VydmljZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RTZXJ2aWNlKGFkbWluVXNlci5nZXRVc2VySWQoKSwgIjAuMSIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIG51bGwpOworCQlTdHJpbmcgb3JpZ1VuaXF1ZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihvcmlnVW5pcXVlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gY2hlY2tpbgorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tpblJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNraW5Db21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFJlc291cmNlLCBjaGVja2luVXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHNlcnZpY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2hlY2tpblJlc3BvbnNlLmlzTGVmdCgpKTsKKworCQkvLyByZmMKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJmY1Jlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBjaGVja2luUmVzcG9uc2UubGVmdCgpLnZhbHVlKCksIHJmY1VzZXIsCisJCQkJCQljaGVja2luVXNlciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHNlcnZpY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2hlY2tpblJlc3BvbnNlLmlzTGVmdCgpKTsKKworCQkvLyBjaGVja2luIChjYW5jZWwgcmZjKQorCQljaGVja2luUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uY2hlY2tpbkNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmZjUmVzcG9uc2UubGVmdCgpLnZhbHVlKCksCisJCQkJY2hlY2tpblVzZXIsIHJmY1VzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBjaGVja2luUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlyZXN1bHRSZXNvdXJjZSA9IChTZXJ2aWNlKSBjaGVja2luUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlhc3NlcnRFcXVhbHMocmVzdWx0UmVzb3VyY2UuZ2V0VmVyc2lvbigpLCAiMC4xIik7CisJCWFzc2VydEVxdWFscyhyZXN1bHRSZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCksIGFkbWluVXNlci5nZXRVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyhyZXN1bHRSZXNvdXJjZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLCBjaGVja2luVXNlci5nZXRVc2VySWQoKSk7CisKKwkJLy8gYXNzZXJ0IG93bmVyIGNoYW5nZWQKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRPd25lcihyZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uU2VydmljZSwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJcmVzb3VyY2VPd25lciA9IGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU93bmVyLmVxdWFscyhjaGVja2luVXNlcikpOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24oKTsKKwkJbWV0YWRhdGEuc2V0VW5pcXVlSWQocmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVNlcnZpY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFNlcnZpY2VNZXRhZGF0YURhdGEobWV0YWRhdGEpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzUmlnaHQoKSk7CisKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLAorCQkJCXByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFVORE8gQ0hFQ0tPVVQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVuZG9DaGVja291dE5ld1Jlc291cmNlVGVzdCgpIHsKKworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RSZXNvdXJjZShhZG1pblVzZXIuZ2V0VXNlcklkKCksICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULCBudWxsKTsKKwkJU3RyaW5nIG9yaWdVbmlxdWVJZCA9IHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uZ2V0Q29tcG9uZW50T3duZXIob3JpZ1VuaXF1ZUlkLAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciByZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLworCisJCS8vIHVuZG8gY2hlY2tvdXQKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1bmRvQ2hlY2tvdXRSZXNwb25zZSA9IChFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkudW5kb0NoZWNrb3V0KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzdWx0UmVzb3VyY2UsIGFkbWluVXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIHVuZG9DaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG9yaWdSZXNvdXJjZVJlc3VsdCA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKG9yaWdVbmlxdWVJZCk7CisJCWFzc2VydFRydWUob3JpZ1Jlc291cmNlUmVzdWx0LmlzUmlnaHQoKSk7CisJCS8qCisJCSAqIGFzc2VydFRydWUob3JpZ1Jlc291cmNlUmVzdWx0LmlzTGVmdCgpKTsKKwkJICogYXNzZXJ0VHJ1ZShvcmlnUmVzb3VyY2VSZXN1bHQubGVmdCgpLnZhbHVlKCkuZ2V0SXNEZWxldGVkKCkgPT0gdHJ1ZSk7CisJCSAqLworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdW5kb0NoZWNrb3V0TmV3RnVsbFJlc291cmNlVGVzdCgpIHsKKworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZUZ1bGxUZXN0UmVzb3VyY2UoYWRtaW5Vc2VyLmdldFVzZXJJZCgpLCAiMC4xIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCVN0cmluZyBvcmlnVW5pcXVlSWQgPSByZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uLmdldENvbXBvbmVudE93bmVyKG9yaWdVbmlxdWVJZCwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gdW5kbyBjaGVja291dAorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVuZG9DaGVja291dFJlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS51bmRvQ2hlY2tvdXQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXN1bHRSZXNvdXJjZSwgYWRtaW5Vc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgdW5kb0NoZWNrb3V0UmVzcG9uc2UuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gb3JpZ1Jlc291cmNlUmVzdWx0ID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2Uob3JpZ1VuaXF1ZUlkKTsKKwkJLyoKKwkJICogYXNzZXJ0VHJ1ZShvcmlnUmVzb3VyY2VSZXN1bHQuaXNMZWZ0KCkpOworCQkgKiBhc3NlcnRUcnVlKG9yaWdSZXNvdXJjZVJlc3VsdC5sZWZ0KCkudmFsdWUoKS5nZXRJc0RlbGV0ZWQoKSA9PSB0cnVlKTsKKwkJICovIGFzc2VydFRydWUob3JpZ1Jlc291cmNlUmVzdWx0LmlzUmlnaHQoKSk7CisKKwkJU3RyaW5nIGludGVyZmFjZUlkID0gb3JpZ1VuaXF1ZUlkICsgIi4iICsgSU5URVJGQUNFX05BTUU7CisJCUVpdGhlcjxJbnRlcmZhY2VEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbm9kZSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5JbnRlcmZhY2UpLCBpbnRlcmZhY2VJZCwgSW50ZXJmYWNlRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUobm9kZS5pc1JpZ2h0KCkpOworCisJCVN0cmluZyBvcGVyYXRpb25JZCA9IGludGVyZmFjZUlkICsgIi4iICsgSU5URVJGQUNFX09QRVJBVElPTl9DUkVBVEU7CisJCUVpdGhlcjxPcGVyYXRpb25EYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gb3AgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZSgKKwkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uSW50ZXJmYWNlT3BlcmF0aW9uKSwgb3BlcmF0aW9uSWQsIE9wZXJhdGlvbkRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKG9wLmlzUmlnaHQoKSk7CisKKwkJU3RyaW5nIGNhcGFiaWxpdHlJZCA9ICJjYXBhYmlsaXR5LiIgKyBvcmlnVW5pcXVlSWQgKyAiLiIgKyBDQVBBQklMSVRZX05BTUU7CisJCUVpdGhlcjxDYXBhYmlsaXR5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNhcGFiaWxpdHkgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0Tm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uQ2FwYWJpbGl0eSksIGNhcGFiaWxpdHlJZCwgQ2FwYWJpbGl0eURhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGNhcGFiaWxpdHkuaXNSaWdodCgpKTsKKworCQlTdHJpbmcgcmVxdWlyZW1lbnRJZCA9IG9yaWdVbmlxdWVJZCArICIuIiArIFJFUVVJUkVNRU5UX05BTUU7CisJCUVpdGhlcjxSZXF1aXJlbWVudERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0Tm9kZSgKKwkJCQlVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uUmVxdWlyZW1lbnQpLCByZXF1aXJlbWVudElkLCBSZXF1aXJlbWVudERhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHJlcS5pc1JpZ2h0KCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1bmRvQ2hlY2tvdXRFeGlzdGluZ1Jlc291cmNlVGVzdCgpIHsKKworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RSZXNvdXJjZShhZG1pblVzZXIuZ2V0VXNlcklkKCksICIwLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIG51bGwpOworCisJCS8vIGdldCByZXNvdXJjZSBvd25lcgorCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRPd25lcihyZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJU3RyaW5nIHByZXZSZXNvdXJjZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQyID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jaGVja291dENvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc3VsdFJlc291cmNlLCBjaGVja291dFVzZXIsIHJlc291cmNlT3duZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBjcmVhdGVkIiwgdHJ1ZSwgcmVzdWx0Mi5pc0xlZnQoKSk7CisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlMiA9IHJlc3VsdDIubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gZ2V0IHJlc291cmNlIG93bmVyCisJCWdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uZ2V0Q29tcG9uZW50T3duZXIocmVzdWx0UmVzb3VyY2UyLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwKKwkJCQlmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlyZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlT3duZXIsIGNoZWNrb3V0VXNlcik7CisKKwkJLy8gdW5kbyBjaGVja291dAorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVuZG9DaGVja291dFJlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS51bmRvQ2hlY2tvdXQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXN1bHRSZXNvdXJjZTIsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIHVuZG9DaGVja291dFJlc3BvbnNlLmlzTGVmdCgpKTsKKworCQkvLyBnZXQgcHJldmlvdXMgcmVzb3VyY2UKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUFmdGVyVW5kbyA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHByZXZSZXNvdXJjZUlkKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUFmdGVyVW5kby5pc0xlZnQoKSk7CisJCVJlc291cmNlIGFjdHVhbFJlc291cmNlID0gcmVzb3VyY2VBZnRlclVuZG8ubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUoYWN0dWFsUmVzb3VyY2UuaXNIaWdoZXN0VmVyc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGFkbWluVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsUmVzb3VyY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGFkbWluVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsUmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscygiMC4xIiwgYWN0dWFsUmVzb3VyY2UuZ2V0VmVyc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIGFjdHVhbFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gb3JpZ1Jlc291cmNlUmVzdWx0ID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkuZ2V0UmVzb3VyY2UocmVzdWx0UmVzb3VyY2UyLmdldFVuaXF1ZUlkKCkpOworCQkvKgorCQkgKiBhc3NlcnRUcnVlKG9yaWdSZXNvdXJjZVJlc3VsdC5pc0xlZnQoKSk7CisJCSAqIGFzc2VydFRydWUob3JpZ1Jlc291cmNlUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldElzRGVsZXRlZCgpID09IHRydWUpOworCQkgKi8gYXNzZXJ0VHJ1ZShvcmlnUmVzb3VyY2VSZXN1bHQuaXNSaWdodCgpKTsKKworCX0KKworCS8qKioqIFNFUlZJQ0UgKioqLworCUBUZXN0CisJcHVibGljIHZvaWQgdW5kb0NoZWNrb3V0TmV3U2VydmljZVRlc3QoKSB7CisKKwkJU2VydmljZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RTZXJ2aWNlKGFkbWluVXNlci5nZXRVc2VySWQoKSwgIjAuMSIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsIG51bGwpOworCQlTdHJpbmcgb3JpZ1VuaXF1ZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihvcmlnVW5pcXVlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8KKworCQkvLyB1bmRvIGNoZWNrb3V0CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1bmRvQ2hlY2tvdXRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS51bmRvQ2hlY2tvdXQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFJlc291cmNlLCBhZG1pblVzZXIsIHJlc291cmNlT3duZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCB1bmRvQ2hlY2tvdXRSZXNwb25zZS5pc0xlZnQoKSk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG9yaWdSZXNvdXJjZVJlc3VsdCA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZShvcmlnVW5pcXVlSWQpOworCQkvKgorCQkgKiBhc3NlcnRUcnVlKG9yaWdSZXNvdXJjZVJlc3VsdC5pc0xlZnQoKSk7CisJCSAqIGFzc2VydFRydWUob3JpZ1Jlc291cmNlUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldElzRGVsZXRlZCgpID09IHRydWUpOworCQkgKi8gYXNzZXJ0VHJ1ZShvcmlnUmVzb3VyY2VSZXN1bHQuaXNSaWdodCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdW5kb0NoZWNrb3V0TmV3RnVsbFNlcnZpY2VUZXN0KCkgeworCisJCVNlcnZpY2Ugb3JpZ1NlcnZpY2UgPSBjcmVhdGVUZXN0U2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjAuMSIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwgbnVsbCk7CisJCVN0cmluZyBvcmlnVW5pcXVlSWQgPSBvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpOworCisJCS8vIGFkZCBhcnRpZmFjdHMKKwkJYWRkQXJ0aWZhY3RUb1NlcnZpY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksIG9yaWdTZXJ2aWNlLmdldFVuaXF1ZUlkKCksICJpbnN0YWxsX2FwYWNoZSIpOworCQlhZGRBcnRpZmFjdFRvU2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgb3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKSwgInN0YXJ0X2FwYWNoZSIpOworCisJCS8vIGFkZCByZXNvdXJjZSBpbnN0YW5jZXMKKwkJUmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvblRlc3QgcmlUZXN0ID0gbmV3IFJlc291cmNlSW5zdGFuY2VPcGVyYXRpb25UZXN0KCk7CisJCXJpVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuR2VuZXJpY0RhbywgY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24sIHJlcXVpcmVtZW50T3BlcmF0aW9uLCBjYXBhYmlsaXR5T3BlcmF0aW9uLAorCQkJCXJlc291cmNlT3BlcmF0aW9uLCBwcm9wZXJ0eU9wZXJhdGlvbiwgcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbik7CisJCXJpVGVzdC5hZGRSZXNvdXJjZUluc3RhbmNlc0FuZFJlbGF0aW9uKG9yaWdTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uLmdldENvbXBvbmVudE93bmVyKG9yaWdVbmlxdWVJZCwKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2UgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uob3JpZ1VuaXF1ZUlkKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlLmlzTGVmdCgpKTsKKworCQlTZXJ2aWNlIHJlc3VsdFJlc291cmNlID0gc2VydmljZS5sZWZ0KCkudmFsdWUoKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzb3VyY2VJbnN0YW5jZXMgPSByZXN1bHRSZXNvdXJjZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKTsKKworCQkvLyB1bmRvIGNoZWNrb3V0CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1bmRvQ2hlY2tvdXRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS51bmRvQ2hlY2tvdXQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFJlc291cmNlLCBhZG1pblVzZXIsIHJlc291cmNlT3duZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCB1bmRvQ2hlY2tvdXRSZXNwb25zZS5pc0xlZnQoKSk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG9yaWdSZXNvdXJjZVJlc3VsdCA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZShvcmlnVW5pcXVlSWQpOworCQkvKgorCQkgKiBhc3NlcnRUcnVlKG9yaWdSZXNvdXJjZVJlc3VsdC5pc0xlZnQoKSk7CisJCSAqIGFzc2VydFRydWUob3JpZ1Jlc291cmNlUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldElzRGVsZXRlZCgpID09IHRydWUpOworCQkgKi8gYXNzZXJ0VHJ1ZShvcmlnUmVzb3VyY2VSZXN1bHQuaXNSaWdodCgpKTsKKworCQlmb3IgKENvbXBvbmVudEluc3RhbmNlIHJpIDogcmVzb3VyY2VJbnN0YW5jZXMpIHsKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBub2RlID0gdGl0YW5HZW5lcmljRGFvLmdldE5vZGUoCisJCQkJCVVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlKSwgcmkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJQ29tcG9uZW50SW5zdGFuY2VEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUobm9kZS5pc1JpZ2h0KCkpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVuZG9DaGVja291dEV4aXN0aW5nU2VydmljZVRlc3QoKSB7CisKKwkJU2VydmljZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RTZXJ2aWNlKGFkbWluVXNlci5nZXRVc2VySWQoKSwgIjAuMSIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwgbnVsbCk7CisKKwkJLy8gZ2V0IHJlc291cmNlIG93bmVyCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciByZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlTdHJpbmcgcHJldlJlc291cmNlSWQgPSByZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0MiA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jaGVja291dENvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0UmVzb3VyY2UsIGNoZWNrb3V0VXNlciwgcmVzb3VyY2VPd25lciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGNyZWF0ZWQiLCB0cnVlLCByZXN1bHQyLmlzTGVmdCgpKTsKKwkJQ29tcG9uZW50IHJlc3VsdFJlc291cmNlMiA9IHJlc3VsdDIubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyByZXN1bHQyVWlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugb3duZXIKKwkJZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbi5nZXRDb21wb25lbnRPd25lcihyZXN1bHRSZXNvdXJjZTIuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLAorCQkJCWZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCXJlc291cmNlT3duZXIgPSBnZXRPd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VPd25lciwgY2hlY2tvdXRVc2VyKTsKKworCQkvLyB1bmRvIGNoZWNrb3V0CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1bmRvQ2hlY2tvdXRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS51bmRvQ2hlY2tvdXQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFJlc291cmNlMiwgY2hlY2tvdXRVc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgdW5kb0NoZWNrb3V0UmVzcG9uc2UuaXNMZWZ0KCkpOworCisJCS8vIGdldCBwcmV2aW91cyByZXNvdXJjZQorCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VBZnRlclVuZG8gPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2UocHJldlJlc291cmNlSWQpOworCQlhc3NlcnRUcnVlKHJlc291cmNlQWZ0ZXJVbmRvLmlzTGVmdCgpKTsKKwkJU2VydmljZSBhY3R1YWxSZXNvdXJjZSA9IHJlc291cmNlQWZ0ZXJVbmRvLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKGFjdHVhbFJlc291cmNlLmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhhZG1pblVzZXIuZ2V0VXNlcklkKCksIGFjdHVhbFJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyhhZG1pblVzZXIuZ2V0VXNlcklkKCksIGFjdHVhbFJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoIjAuMSIsIGFjdHVhbFJlc291cmNlLmdldFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBhY3R1YWxSZXNvdXJjZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gb3JpZ1Jlc291cmNlUmVzdWx0ID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHJlc3VsdDJVaWQpOworCQkvKgorCQkgKiBhc3NlcnRUcnVlKG9yaWdSZXNvdXJjZVJlc3VsdC5pc0xlZnQoKSk7CisJCSAqIGFzc2VydFRydWUob3JpZ1Jlc291cmNlUmVzdWx0LmxlZnQoKS52YWx1ZSgpLmdldElzRGVsZXRlZCgpID09IHRydWUpOworCQkgKi8gYXNzZXJ0VHJ1ZShvcmlnUmVzb3VyY2VSZXN1bHQuaXNSaWdodCgpKTsKKworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQ0VSVElGSUNBVElPTiBSRVFVRVNUCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjZXJ0UmVxRGVmYXVsdFRlc3QoKSB7CisJCVJlc291cmNlIGFjdHVhbFJlc291cmNlID0gdGVzdENlcnRpZmljYXRpb25SZXF1ZXN0KExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoYWN0dWFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMocmZjVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGFkbWluVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGF0b21pY0NoZWNraW5DZXJ0UmVxVGVzdCgpIHsKKwkJUmVzb3VyY2UgYWN0dWFsUmVzb3VyY2UgPSB0ZXN0Q2VydGlmaWNhdGlvblJlcXVlc3QoTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQpOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoYWN0dWFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMocmZjVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJmY1VzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgdGVzdENlcnRpZmljYXRpb25SZXF1ZXN0KExpZmVjeWNsZVN0YXRlRW51bSBwcmVTdGF0ZSkgeworCisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlID0gY3JlYXRlVGVzdFJlc291cmNlKGFkbWluVXNlci5nZXRVc2VySWQoKSwgIjAuMSIsIHByZVN0YXRlLCBudWxsKTsKKwkJU3RyaW5nIG9yaWdVbmlxdWVJZCA9IHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24uZ2V0Q29tcG9uZW50T3duZXIob3JpZ1VuaXF1ZUlkLAorCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciByZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjaGVja2luCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2VydFJlcVJlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc3VsdFJlc291cmNlLCByZmNVc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2VydFJlcVJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VBZnRlckNoYW5nZSA9IGNlcnRSZXFSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VBZnRlckNoYW5nZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VBZnRlckNoYW5nZS5nZXRWZXJzaW9uKCksICIwLjEiKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlQWZ0ZXJDaGFuZ2UuZ2V0Q3JlYXRvclVzZXJJZCgpLCBhZG1pblVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VBZnRlckNoYW5nZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLCByZmNVc2VyLmdldFVzZXJJZCgpKTsKKworCQkvLyBhc3NlcnQgb3duZXIgY2hhbmdlZAorCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJDaGVja291dFJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlQWZ0ZXJDaGFuZ2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UuaXNMZWZ0KCkpOworCQlyZXNvdXJjZU93bmVyID0gZ2V0T3duZXJDaGVja291dFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRUcnVlKHJlc291cmNlT3duZXIuZXF1YWxzKHJmY1VzZXIpKTsKKworCQlyZXR1cm4gcmVzb3VyY2VBZnRlckNoYW5nZTsKKwl9CisKKwkvKiogU0VSVklDRSAqKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNlcnRTZXJ2aWNlUmVxRGVmYXVsdFRlc3QoKSB7CisJCVNlcnZpY2UgYWN0dWFsUmVzb3VyY2UgPSB0ZXN0U2VydmljZUNlcnRpZmljYXRpb25SZXF1ZXN0KExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24oKTsKKwkJbWV0YWRhdGEuc2V0VW5pcXVlSWQoYWN0dWFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YShtZXRhZGF0YSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHNlcnZpY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhyZmNVc2VyLmdldFVzZXJJZCgpLCBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEoc2VydmljZURhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhhZG1pblVzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhdG9taWNTZXJ2aWNlQ2hlY2tpbkNlcnRSZXFUZXN0KCkgeworCQlTZXJ2aWNlIGFjdHVhbFJlc291cmNlID0gdGVzdFNlcnZpY2VDZXJ0aWZpY2F0aW9uUmVxdWVzdChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisKKwkJLy8gYXNzZXJ0IHJlbGF0aW9ucworCQlTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBtZXRhZGF0YSA9IG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpOworCQltZXRhZGF0YS5zZXRVbmlxdWVJZChhY3R1YWxSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YSA9IG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhKG1ldGFkYXRhKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEoc2VydmljZURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJmY1VzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShzZXJ2aWNlRGF0YSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJmY1VzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgU2VydmljZSB0ZXN0U2VydmljZUNlcnRpZmljYXRpb25SZXF1ZXN0KExpZmVjeWNsZVN0YXRlRW51bSBwcmVTdGF0ZSkgeworCisJCVNlcnZpY2UgcmVzdWx0UmVzb3VyY2UgPSBjcmVhdGVUZXN0U2VydmljZShhZG1pblVzZXIuZ2V0VXNlcklkKCksICIwLjEiLCBwcmVTdGF0ZSwgbnVsbCk7CisJCVN0cmluZyBvcmlnVW5pcXVlSWQgPSByZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uLmdldENvbXBvbmVudE93bmVyKG9yaWdVbmlxdWVJZCwKKwkJCQlOb2RlVHlwZUVudW0uU2VydmljZSwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciByZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjaGVja2luCisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjZXJ0UmVxUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkucmVxdWVzdENlcnRpZmljYXRpb25Db21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFJlc291cmNlLCByZmNVc2VyLCByZXNvdXJjZU93bmVyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2Ugb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgY2VydFJlcVJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJU2VydmljZSByZXNvdXJjZUFmdGVyQ2hhbmdlID0gKFNlcnZpY2UpIGNlcnRSZXFSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VBZnRlckNoYW5nZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VBZnRlckNoYW5nZS5nZXRWZXJzaW9uKCksICIwLjEiKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc291cmNlQWZ0ZXJDaGFuZ2UuZ2V0Q3JlYXRvclVzZXJJZCgpLCBhZG1pblVzZXIuZ2V0VXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMocmVzb3VyY2VBZnRlckNoYW5nZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpLCByZmNVc2VyLmdldFVzZXJJZCgpKTsKKworCQkvLyBhc3NlcnQgb3duZXIgY2hhbmdlZAorCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJDaGVja291dFJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKHJlc291cmNlQWZ0ZXJDaGFuZ2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyQ2hlY2tvdXRSZXNwb25zZS5pc0xlZnQoKSk7CisJCXJlc291cmNlT3duZXIgPSBnZXRPd25lckNoZWNrb3V0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUocmVzb3VyY2VPd25lci5lcXVhbHMocmZjVXNlcikpOworCisJCXJldHVybiByZXNvdXJjZUFmdGVyQ2hhbmdlOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU1RBUlQgQ0VSVElGSUNBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCUBUZXN0CisJcHVibGljIHZvaWQgc3RhcnRDZXJ0aWZpY2F0aW9uVGVzdCgpIHsKKworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RSZXNvdXJjZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjAuMiIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwgbnVsbCk7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVxdWVzdENlcnRpZmljYXRpb25SZXN1bHQgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzdWx0UmVzb3VyY2UsIHJmY1VzZXIsIGNoZWNraW5Vc2VyLCBmYWxzZSk7CisJCWFzc2VydFRydWUocmVxdWVzdENlcnRpZmljYXRpb25SZXN1bHQuaXNMZWZ0KCkpOworCisJCS8vIHN0YXJ0IGNlcnRpZmljYXRpb24KKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGFydENlcnRpZmljYXRpb25SZXN1bHQgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc3VsdFJlc291cmNlLCB0ZXN0ZXJVc2VyLCByZmNVc2VyLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisJCVJlc291cmNlIGFjdHVhbFJlc291cmNlID0gc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGdldCByZXNvdXJjZSBvd25lcgorCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRPd25lcihhY3R1YWxSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyh0ZXN0ZXJVc2VyLmdldFVzZXJJZCgpLCByZXNvdXJjZU93bmVyLmdldFVzZXJJZCgpKTsKKworCQlhc3NlcnRUcnVlKGFjdHVhbFJlc291cmNlLmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsUmVzb3VyY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRlc3RlclVzZXIuZ2V0VXNlcklkKCksIGFjdHVhbFJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MsIGFjdHVhbFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkpOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoYWN0dWFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEocmVzb3VyY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyh0ZXN0ZXJVc2VyLmdldFVzZXJJZCgpLCBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhyZmNVc2VyLmdldFVzZXJJZCgpLCBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEocmVzb3VyY2VEYXRhLAorCQkJCUdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCX0KKworCS8qKiBTRVJWSUNFICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzdGFydFNlcnZpY2VDZXJ0aWZpY2F0aW9uVGVzdCgpIHsKKworCQlTZXJ2aWNlIHJlc3VsdFJlc291cmNlID0gY3JlYXRlVGVzdFNlcnZpY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIwLjIiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIG51bGwpOworCisJCS8vIGNlcnRpZmljYXRpb24gcmVxdWVzdAorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVxdWVzdENlcnRpZmljYXRpb25SZXN1bHQgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkucmVxdWVzdENlcnRpZmljYXRpb25Db21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFJlc291cmNlLCByZmNVc2VyLCBjaGVja2luVXNlciwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHJlcXVlc3RDZXJ0aWZpY2F0aW9uUmVzdWx0LmlzTGVmdCgpKTsKKworCQkvLyBzdGFydCBjZXJ0aWZpY2F0aW9uCisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGFydENlcnRpZmljYXRpb25SZXN1bHQgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuc3RhcnRDb21wb25lbnRDZXJ0aWZpY2F0aW9uKE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXN1bHRSZXNvdXJjZSwgdGVzdGVyVXNlciwgcmZjVXNlciwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscyh0cnVlLCBzdGFydENlcnRpZmljYXRpb25SZXN1bHQuaXNMZWZ0KCkpOworCQlTZXJ2aWNlIGFjdHVhbFJlc291cmNlID0gKFNlcnZpY2UpIHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBnZXQgcmVzb3VyY2Ugb3duZXIKKwkJRWl0aGVyPFVzZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE93bmVyUmVzcG9uc2UgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50T3duZXIoYWN0dWFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyh0ZXN0ZXJVc2VyLmdldFVzZXJJZCgpLCByZXNvdXJjZU93bmVyLmdldFVzZXJJZCgpKTsKKworCQlhc3NlcnRUcnVlKGFjdHVhbFJlc291cmNlLmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsUmVzb3VyY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRlc3RlclVzZXIuZ2V0VXNlcklkKCksIGFjdHVhbFJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MsIGFjdHVhbFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkpOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24gbWV0YWRhdGEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24oKTsKKwkJbWV0YWRhdGEuc2V0VW5pcXVlSWQoYWN0dWFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCVNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YShtZXRhZGF0YSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEoc2VydmljZURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRlc3RlclVzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHNlcnZpY2VEYXRhLAorCQkJCUdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMocmZjVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHNlcnZpY2VEYXRhLAorCQkJCUdyYXBoRWRnZUxhYmVscy5MQVNUX1NUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRkFJTCBDRVJUSUZJQ0FUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmYWlsQ2VydGlmaWNhdGlvblRlc3QoKSB7CisKKwkJUmVzb3VyY2UgYWN0dWFsUmVzb3VyY2UgPSBjZXJ0aWZpY2F0aW9uU3RhdHVzQ2hhbmdlKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIGNoZWNraW5Vc2VyKTsKKworCQkvLyBhc3NlcnQgcmVsYXRpb25zCisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKGFjdHVhbFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJLy8gb2xkIGVkZ2VzIHJlbW92ZWQKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNSaWdodCgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc1JpZ2h0KCkpOworCisJCS8vIG5ldyBzdGF0ZSBpcyBjaGVja2luCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwKKwkJCQlwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCX0KKworCS8qKiogU0VSVklDRSAqKi8KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmFpbENlcnRpZmljYXRpb25TZXJ2aWNlVGVzdCgpIHsKKworCQlTZXJ2aWNlIGFjdHVhbFNlcnZpY2UgPSBjZXJ0aWZpY2F0aW9uU3RhdHVzQ2hhbmdlU2VydmljZShMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBjaGVja2luVXNlcik7CisKKwkJLy8gYXNzZXJ0IHJlbGF0aW9ucworCQlTZXJ2aWNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IG5ldyBTZXJ2aWNlTWV0YWRhdGFEYXRhKChTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgYWN0dWFsU2VydmljZQorCQkJCS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKwkJLy8gb2xkIGVkZ2VzIHJlbW92ZWQKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCQlFaXRoZXI8R3JhcGhSZWxhdGlvbiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvCisJCQkJLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNSaWdodCgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc1JpZ2h0KCkpOworCisJCS8vIG5ldyBzdGF0ZSBpcyBjaGVja2luCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwKKwkJCQlwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQ0FOQ0VMIENFUlRJRklDQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNhbmNlbENlcnRpZmljYXRpb25UZXN0KCkgeworCisJCVJlc291cmNlIGFjdHVhbFJlc291cmNlID0gY2VydGlmaWNhdGlvblN0YXR1c0NoYW5nZShMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04sIHJmY1VzZXIpOworCisJCS8vIGFzc2VydCByZWxhdGlvbnMKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoYWN0dWFsUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQkvLyBvbGQgZWRnZXMgcmVtb3ZlZAorCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEocmVzb3VyY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc1JpZ2h0KCkpOworCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisKKwkJLy8gbmV3IHN0YXRlIGlzIHJmYworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwKKwkJCQlwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNMZWZ0KCkpOworCQlhc3NlcnRFcXVhbHMocmZjVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisJfQorCisJLyoqIFNFUlZJQ0UgKiovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjYW5jZWxDZXJ0aWZpY2F0aW9uU2VydmljZVRlc3QoKSB7CisKKwkJU2VydmljZSBhY3R1YWxTZXJ2aWNlID0gY2VydGlmaWNhdGlvblN0YXR1c0NoYW5nZVNlcnZpY2UoTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OLCByZmNVc2VyKTsKKworCQkvLyBhc3NlcnQgcmVsYXRpb25zCisJCVNlcnZpY2VNZXRhZGF0YURhdGEgU2VydmljZU5vZGUgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YSgpOworCQlTZXJ2aWNlTm9kZS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoYWN0dWFsU2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCS8vIG9sZCBlZGdlcyByZW1vdmVkCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShTZXJ2aWNlTm9kZSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLCBwcm9wcyk7CisJCWFzc2VydFRydWUoaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEuaXNSaWdodCgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOKTsKKwkJaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEoU2VydmljZU5vZGUsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luVXNlci5nZXRVc2VySWQoKSwgaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEubGVmdCgpLnZhbHVlKCkuZ2V0RnJvbSgpLmdldElkVmFsdWUoKSk7CisKKwkJLy8gbmV3IHN0YXRlIGlzIHJmYworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShTZXJ2aWNlTm9kZSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLAorCQkJCXByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhyZmNVc2VyLmdldFVzZXJJZCgpLCBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDRVJUSUZZICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjZXJ0aWZ5VGVzdCgpIHsKKworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IGNyZWF0ZVRlc3RSZXNvdXJjZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjAuMiIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwgbnVsbCk7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVxdWVzdENlcnRpZmljYXRpb25SZXN1bHQgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzdWx0UmVzb3VyY2UsIHJmY1VzZXIsIGNoZWNraW5Vc2VyLCBmYWxzZSk7CisJCWFzc2VydFRydWUocmVxdWVzdENlcnRpZmljYXRpb25SZXN1bHQuaXNMZWZ0KCkpOworCisJCS8vIHN0YXJ0IGNlcnRpZmljYXRpb24KKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGFydENlcnRpZmljYXRpb25SZXN1bHQgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc3VsdFJlc291cmNlLCB0ZXN0ZXJVc2VyLCByZmNVc2VyLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdGFydENlcnRpZmljYXRpb25SZXN1bHQuaXNMZWZ0KCkpOworCQlSZXNvdXJjZSBhY3R1YWxSZXNvdXJjZSA9IHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjYW5jZWwgY2VydGlmaWNhdGlvbgorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gQ2VydGlmaWNhdGlvblJlc3VsdCA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jZXJ0aWZ5Q29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgYWN0dWFsUmVzb3VyY2UsIHRlc3RlclVzZXIsIHRlc3RlclVzZXIsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHModHJ1ZSwgQ2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisJCWFjdHVhbFJlc291cmNlID0gKFJlc291cmNlKSBDZXJ0aWZpY2F0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGdldCByZXNvdXJjZSBvd25lcgorCQlFaXRoZXI8VXNlciwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3duZXJSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRPd25lcihhY3R1YWxSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyh0ZXN0ZXJVc2VyLmdldFVzZXJJZCgpLCByZXNvdXJjZU93bmVyLmdldFVzZXJJZCgpKTsKKworCQlhc3NlcnRUcnVlKGFjdHVhbFJlc291cmNlLmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsUmVzb3VyY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRlc3RlclVzZXIuZ2V0VXNlcklkKCksIGFjdHVhbFJlc291cmNlLmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgYWN0dWFsUmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSk7CisKKwkJLy8gYXNzZXJ0IHJlbGF0aW9ucworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChhY3R1YWxSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCS8vIG9sZCBlZGdlcyByZW1vdmVkCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0RhbworCQkJCS5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzUmlnaHQoKSk7CisKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTik7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzUmlnaHQoKSk7CisKKwkJLy8gbmV3IHN0YXRlIGlzIGNlcnRpZmllZAorCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKTsKKwkJaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEocmVzb3VyY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsCisJCQkJcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRlc3RlclVzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuTEFTVF9TVEFURSwgcHJvcHMpOworCQlhc3NlcnRUcnVlKGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJmY1VzZXIuZ2V0VXNlcklkKCksIGluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhLmxlZnQoKS52YWx1ZSgpLmdldEZyb20oKS5nZXRJZFZhbHVlKCkpOworCisJfQorCisJLyoqKioqKioqIFNFUlZJQ0UgKiovCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNlcnRpZnlTZXJ2aWNlVGVzdCgpIHsKKworCQlTZXJ2aWNlIHJlc3VsdFNlcnZpY2UgPSBjcmVhdGVUZXN0U2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjAuMiIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwgbnVsbCk7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXF1ZXN0Q2VydGlmaWNhdGlvblJlc3VsdCA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZSwgcmZjVXNlciwgY2hlY2tpblVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1ZXN0Q2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0ID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZSwgdGVzdGVyVXNlciwgcmZjVXNlciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0LmlzTGVmdCgpKTsKKwkJU2VydmljZSBhY3R1YWxTZXJ2aWNlID0gKFNlcnZpY2UpIHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjYW5jZWwgY2VydGlmaWNhdGlvbgorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gQ2VydGlmaWNhdGlvblJlc3VsdCA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jZXJ0aWZ5Q29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBhY3R1YWxTZXJ2aWNlLCB0ZXN0ZXJVc2VyLCB0ZXN0ZXJVc2VyLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIENlcnRpZmljYXRpb25SZXN1bHQuaXNMZWZ0KCkpOworCQlhY3R1YWxTZXJ2aWNlID0gKFNlcnZpY2UpIENlcnRpZmljYXRpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gZ2V0IHJlc291cmNlIG93bmVyCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKGFjdHVhbFNlcnZpY2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgb2JqZWN0IGlzIHJldHVybmVkIiwgdHJ1ZSwgZ2V0T3duZXJSZXNwb25zZS5pc0xlZnQoKSk7CisJCVVzZXIgcmVzb3VyY2VPd25lciA9IGdldE93bmVyUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyh0ZXN0ZXJVc2VyLmdldFVzZXJJZCgpLCByZXNvdXJjZU93bmVyLmdldFVzZXJJZCgpKTsKKworCQlhc3NlcnRUcnVlKGFjdHVhbFNlcnZpY2UuaXNIaWdoZXN0VmVyc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpLCBhY3R1YWxTZXJ2aWNlLmdldENyZWF0b3JVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyh0ZXN0ZXJVc2VyLmdldFVzZXJJZCgpLCBhY3R1YWxTZXJ2aWNlLmdldExhc3RVcGRhdGVyVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHMoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCwgYWN0dWFsU2VydmljZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKworCQkvLyBhc3NlcnQgcmVsYXRpb25zCisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKGFjdHVhbFNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCQkvLyBvbGQgZWRnZXMgcmVtb3ZlZAorCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gaW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEgPSB0aXRhbkdlbmVyaWNEYW8KKwkJCQkuZ2V0SW5jb21pbmdSZWxhdGlvbkJ5Q3JpdGVyaWEocmVzb3VyY2VEYXRhLCBHcmFwaEVkZ2VMYWJlbHMuU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc1JpZ2h0KCkpOworCisJCXByb3BzLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc1JpZ2h0KCkpOworCisJCS8vIG5ldyBzdGF0ZSBpcyBjZXJ0aWZpZWQKKwkJcHJvcHMucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuU1RBVEUuZ2V0UHJvcGVydHkoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRCk7CisJCWluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhID0gdGl0YW5HZW5lcmljRGFvLmdldEluY29taW5nUmVsYXRpb25CeUNyaXRlcmlhKHJlc291cmNlRGF0YSwgR3JhcGhFZGdlTGFiZWxzLlNUQVRFLAorCQkJCXByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyh0ZXN0ZXJVc2VyLmdldFVzZXJJZCgpLCBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKworCQlwcm9wcy5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCQlpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYSA9IHRpdGFuR2VuZXJpY0Rhby5nZXRJbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYShyZXNvdXJjZURhdGEsCisJCQkJR3JhcGhFZGdlTGFiZWxzLkxBU1RfU1RBVEUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhyZmNVc2VyLmdldFVzZXJJZCgpLCBpbmNvbWluZ1JlbGF0aW9uQnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5nZXRGcm9tKCkuZ2V0SWRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlbGV0ZU9sZFZlcnNpb25zUmVzb3VyY2UoKSB7CisJCS8vIHNpbXVsYXRlCisJCWNyZWF0ZVRlc3RSZXNvdXJjZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjEuMCIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIG51bGwpOworCQlSZXNvdXJjZSByZXNvdXJjZU5ld1ZlcnNpb24gPSBjcmVhdGVUZXN0UmVzb3VyY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIxLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIG51bGwpOworCQljcmVhdGVUZXN0UmVzb3VyY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIxLjIiLCBMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLAorCQkJCXJlc291cmNlTmV3VmVyc2lvbi5nZXRVVUlEKCkpOworCQljcmVhdGVUZXN0UmVzb3VyY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIxLjMiLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUywKKwkJCQlyZXNvdXJjZU5ld1ZlcnNpb24uZ2V0VVVJRCgpKTsKKwkJUmVzb3VyY2UgY2VydGlmaWVkUmVzb3VyY2UgPSBjcmVhdGVUZXN0UmVzb3VyY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIyLjAiLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELAorCQkJCXJlc291cmNlTmV3VmVyc2lvbi5nZXRVVUlEKCkpOworCisJCUVpdGhlcjxCb29sZWFuLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVPbGRDb21wb25lbnRWZXJzaW9ucyA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5kZWxldGVPbGRDb21wb25lbnRWZXJzaW9ucyhOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGNlcnRpZmllZFJlc291cmNlLmdldE5hbWUoKSwKKwkJCQkJCWNlcnRpZmllZFJlc291cmNlLmdldFVVSUQoKSwgZmFsc2UpOworCisJCWFzc2VydFRydWUoZGVsZXRlT2xkQ29tcG9uZW50VmVyc2lvbnMuaXNMZWZ0KCkpOworCisJCVN0cmluZyByZXNvdXJjZU5hbWUgPSBjZXJ0aWZpZWRSZXNvdXJjZS5nZXROYW1lKCk7CisJCUVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCS5nZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24ocmVzb3VyY2VOYW1lLCAiMS4wIiwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzTGVmdCgpKTsKKworCQlyZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsICIyLjAiLCBmYWxzZSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuaXNMZWZ0KCkpOworCisJCXJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHJlc291cmNlTmFtZSwgIjEuMSIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc0xlZnQoKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuc2l6ZSgpID09IDEpOworCQlSZXNvdXJjZSBkZWxldGVkID0gcmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0KDApOworCQlhc3NlcnRUcnVlKGRlbGV0ZWQuZ2V0SXNEZWxldGVkKCkpOworCQkvLyBhc3NlcnRFcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsCisJCS8vIHJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJcmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24ocmVzb3VyY2VOYW1lLCAiMS4yIiwgZmFsc2UpOworCQkvLyBhc3NlcnRUcnVlKHJlc291cmNlLmlzUmlnaHQoKSk7CisJCS8vIGFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwKKwkJLy8gcmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc0xlZnQoKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuc2l6ZSgpID09IDEpOworCQlkZWxldGVkID0gcmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0KDApOworCQlhc3NlcnRUcnVlKGRlbGV0ZWQuZ2V0SXNEZWxldGVkKCkpOworCisJCXJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHJlc291cmNlTmFtZSwgIjEuMyIsIGZhbHNlKTsKKwkJLy8gYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc1JpZ2h0KCkpOworCQkvLyBhc3NlcnRFcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsCisJCS8vIHJlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuaXNMZWZ0KCkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmxlZnQoKS52YWx1ZSgpLnNpemUoKSA9PSAxKTsKKwkJZGVsZXRlZCA9IHJlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVkLmdldElzRGVsZXRlZCgpKTsKKwl9CisJCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlT2xkVmVyc2lvbnNTZXJ2aWNlKCkgeworCQkvLyBzaW11bGF0ZQorCQljcmVhdGVUZXN0U2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjEuMCIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsIG51bGwpOworCQlTZXJ2aWNlIHNlcnZpY2VOZXdVVWlkID0gY3JlYXRlVGVzdFNlcnZpY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIxLjEiLAorCQkJCUxpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sIG51bGwpOworCQljcmVhdGVUZXN0U2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjEuMiIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4sCisJCQkJc2VydmljZU5ld1VVaWQuZ2V0VVVJRCgpKTsKKwkJY3JlYXRlVGVzdFNlcnZpY2UoY2hlY2tpblVzZXIuZ2V0VXNlcklkKCksICIxLjMiLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUywKKwkJCQlzZXJ2aWNlTmV3VVVpZC5nZXRVVUlEKCkpOworCQlTZXJ2aWNlIGNlcnRpZmllZFNlcnZpY2UgPSBjcmVhdGVUZXN0U2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjIuMCIsIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQsCisJCQkJc2VydmljZU5ld1VVaWQuZ2V0VVVJRCgpKTsKKworCQlFaXRoZXI8Qm9vbGVhbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlT2xkQ29tcG9uZW50VmVyc2lvbnMgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuZGVsZXRlT2xkQ29tcG9uZW50VmVyc2lvbnMoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGNlcnRpZmllZFNlcnZpY2UuZ2V0TmFtZSgpLAorCQkJCQkJY2VydGlmaWVkU2VydmljZS5nZXRVVUlEKCksIGZhbHNlKTsKKworCQlhc3NlcnRUcnVlKGRlbGV0ZU9sZENvbXBvbmVudFZlcnNpb25zLmlzTGVmdCgpKTsKKworCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gY2VydGlmaWVkU2VydmljZS5nZXROYW1lKCk7CisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsCisJCQkJIjEuMCIsIG51bGwsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlLmlzTGVmdCgpKTsKKworCQlzZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsICIyLjAiLCBudWxsLCBmYWxzZSk7CisJCWFzc2VydFRydWUoc2VydmljZS5pc0xlZnQoKSk7CisKKwkJc2VydmljZSA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24ocmVzb3VyY2VOYW1lLCAiMS4xIiwgbnVsbCwgZmFsc2UpOworCQkvKgorCQkgKiBhc3NlcnRUcnVlKHJlc291cmNlLmlzUmlnaHQoKSk7CisJCSAqIGFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwKKwkJICogcmVzb3VyY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJICovCisJCWFzc2VydFRydWUoc2VydmljZS5pc0xlZnQoKSk7CisJCWFzc2VydFRydWUoc2VydmljZS5sZWZ0KCkudmFsdWUoKS5nZXRJc0RlbGV0ZWQoKSk7CisKKwkJc2VydmljZSA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24ocmVzb3VyY2VOYW1lLCAiMS4yIiwgbnVsbCwgZmFsc2UpOworCisJCXNlcnZpY2UgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKHJlc291cmNlTmFtZSwgIjEuMyIsIG51bGwsIGZhbHNlKTsKKwkJLyoKKwkJICogYXNzZXJ0VHJ1ZShzZXJ2aWNlLmlzUmlnaHQoKSk7CisJCSAqIGFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwKKwkJICogc2VydmljZS5yaWdodCgpLnZhbHVlKCkpOworCQkgKi8KKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlLmlzTGVmdCgpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmdldElzRGVsZXRlZCgpKTsKKworCQlzZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihyZXNvdXJjZU5hbWUsICIxLjMiLCBudWxsLCBmYWxzZSk7CisJCS8qCisJCSAqIGFzc2VydFRydWUoc2VydmljZS5pc1JpZ2h0KCkpOworCQkgKiBhc3NlcnRFcXVhbHMoU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsCisJCSAqIHNlcnZpY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJICovCisJCWFzc2VydFRydWUoc2VydmljZS5pc0xlZnQoKSk7CisJCWFzc2VydFRydWUoc2VydmljZS5sZWZ0KCkudmFsdWUoKS5nZXRJc0RlbGV0ZWQoKSk7CisKKwl9CisKKwlwcml2YXRlIFJlc291cmNlIGNlcnRpZmljYXRpb25TdGF0dXNDaGFuZ2UoTGlmZWN5Y2xlU3RhdGVFbnVtIG5leHRTdGF0ZSwgVXNlciBleHBlY3RlZE93bmVyKSB7CisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlID0gY3JlYXRlVGVzdFJlc291cmNlKGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpLCAiMC4yIiwKKwkJCQlMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS0lOLCBudWxsKTsKKworCQkvLyBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXF1ZXN0Q2VydGlmaWNhdGlvblJlc3VsdCA9IChFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkucmVxdWVzdENlcnRpZmljYXRpb25Db21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXN1bHRSZXNvdXJjZSwgcmZjVXNlciwgY2hlY2tpblVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1ZXN0Q2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdCA9IChFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuc3RhcnRDb21wb25lbnRDZXJ0aWZpY2F0aW9uKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcmVzdWx0UmVzb3VyY2UsIHRlc3RlclVzZXIsIHJmY1VzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisJCVJlc291cmNlIGFjdHVhbFJlc291cmNlID0gc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCS8vIGNhbmNlbCBjZXJ0aWZpY2F0aW9uCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmFpbENlcnRpZmljYXRpb25SZXN1bHQgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNhbmNlbE9yRmFpbENlcnRpZmljYXRpb24oTm9kZVR5cGVFbnVtLlJlc291cmNlLCBhY3R1YWxSZXNvdXJjZSwgdGVzdGVyVXNlciwgdGVzdGVyVXNlciwgbmV4dFN0YXRlLAorCQkJCQkJZmFsc2UpOworCisJCWFzc2VydEVxdWFscyh0cnVlLCBmYWlsQ2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisJCWFjdHVhbFJlc291cmNlID0gZmFpbENlcnRpZmljYXRpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gZ2V0IHJlc291cmNlIG93bmVyCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKGFjdHVhbFJlc291cmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdXNlciBvYmplY3QgaXMgcmV0dXJuZWQiLCB0cnVlLCBnZXRPd25lclJlc3BvbnNlLmlzTGVmdCgpKTsKKwkJVXNlciByZXNvdXJjZU93bmVyID0gZ2V0T3duZXJSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3duZXIsIHJlc291cmNlT3duZXIpOworCisJCWFzc2VydFRydWUoYWN0dWFsUmVzb3VyY2UuaXNIaWdoZXN0VmVyc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGNoZWNraW5Vc2VyLmdldFVzZXJJZCgpLCBhY3R1YWxSZXNvdXJjZS5nZXRDcmVhdG9yVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHModGVzdGVyVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsUmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZXJVc2VySWQoKSk7CisJCWFzc2VydEVxdWFscyhuZXh0U3RhdGUsIGFjdHVhbFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkpOworCQlyZXR1cm4gYWN0dWFsUmVzb3VyY2U7CisJfQorCisJcHJpdmF0ZSBTZXJ2aWNlIGNlcnRpZmljYXRpb25TdGF0dXNDaGFuZ2VTZXJ2aWNlKExpZmVjeWNsZVN0YXRlRW51bSBuZXh0U3RhdGUsIFVzZXIgZXhwZWN0ZWRPd25lcikgeworCQlTZXJ2aWNlIHJlc3VsdFNlcnZpY2UgPSBjcmVhdGVUZXN0U2VydmljZShjaGVja2luVXNlci5nZXRVc2VySWQoKSwgIjAuMiIsCisJCQkJTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiwgbnVsbCk7CisKKwkJLy8gY2VydGlmaWNhdGlvbiByZXF1ZXN0CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXF1ZXN0Q2VydGlmaWNhdGlvblJlc3VsdCA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZSwgcmZjVXNlciwgY2hlY2tpblVzZXIsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXF1ZXN0Q2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisKKwkJLy8gc3RhcnQgY2VydGlmaWNhdGlvbgorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0ID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZSwgdGVzdGVyVXNlciwgcmZjVXNlciwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0LmlzTGVmdCgpKTsKKwkJU2VydmljZSBhY3R1YWxTZXJ2aWNlID0gKFNlcnZpY2UpIHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBjYW5jZWwgY2VydGlmaWNhdGlvbgorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmFpbENlcnRpZmljYXRpb25SZXN1bHQgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuY2FuY2VsT3JGYWlsQ2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uU2VydmljZSwgYWN0dWFsU2VydmljZSwgdGVzdGVyVXNlciwgdGVzdGVyVXNlciwgbmV4dFN0YXRlLAorCQkJCQkJZmFsc2UpOworCisJCWFzc2VydEVxdWFscyh0cnVlLCBmYWlsQ2VydGlmaWNhdGlvblJlc3VsdC5pc0xlZnQoKSk7CisJCWFjdHVhbFNlcnZpY2UgPSAoU2VydmljZSkgZmFpbENlcnRpZmljYXRpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gZ2V0IHJlc291cmNlIG93bmVyCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPd25lclJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudE93bmVyKGFjdHVhbFNlcnZpY2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB1c2VyIG9iamVjdCBpcyByZXR1cm5lZCIsIHRydWUsIGdldE93bmVyUmVzcG9uc2UuaXNMZWZ0KCkpOworCQlVc2VyIHJlc291cmNlT3duZXIgPSBnZXRPd25lclJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRPd25lciwgcmVzb3VyY2VPd25lcik7CisKKwkJYXNzZXJ0VHJ1ZShhY3R1YWxTZXJ2aWNlLmlzSGlnaGVzdFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscyhjaGVja2luVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsU2VydmljZS5nZXRDcmVhdG9yVXNlcklkKCkpOworCQlhc3NlcnRFcXVhbHModGVzdGVyVXNlci5nZXRVc2VySWQoKSwgYWN0dWFsU2VydmljZS5nZXRMYXN0VXBkYXRlclVzZXJJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5leHRTdGF0ZSwgYWN0dWFsU2VydmljZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKwkJcmV0dXJuIGFjdHVhbFNlcnZpY2U7CisJfQorCisJcHJpdmF0ZSBSZXNvdXJjZSBjcmVhdGVUZXN0UmVzb3VyY2UoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHZlcnNpb24sIExpZmVjeWNsZVN0YXRlRW51bSBzdGF0ZSwgU3RyaW5nIHV1aWQpIHsKKwkJLy8gY3JlYXRlIHJlc291cmNlIGluIGdyYXBoCisKKwkJUmVzb3VyY2UgcmVzb3VyY2UyID0gYnVpbGRSZXNvdXJjZU1ldGFkYXRhKHVzZXJJZCwgQ0FURUdPUllfTkFNRSk7CisJCXJlc291cmNlMi5zZXRWZXJzaW9uKHZlcnNpb24pOworCQk7CisJCXJlc291cmNlMi5zZXRMaWZlY3ljbGVTdGF0ZShzdGF0ZSk7CisJCXJlc291cmNlMi5zZXRVVUlEKHV1aWQpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gcmVzb3VyY2VPcGVyYXRpb24uY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UyKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBjcmVhdGVkIiwgdHJ1ZSwgcmVzdWx0LmlzTGVmdCgpKTsKKwkJUmVzb3VyY2UgcmVzdWx0UmVzb3VyY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisJCXJldHVybiByZXN1bHRSZXNvdXJjZTsKKwl9CisKKwlwcml2YXRlIFNlcnZpY2UgY3JlYXRlVGVzdFNlcnZpY2UoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHZlcnNpb24sIExpZmVjeWNsZVN0YXRlRW51bSBzdGF0ZSwgU3RyaW5nIHV1aWQpIHsKKwkJLy8gY3JlYXRlIHJlc291cmNlIGluIGdyYXBoCisKKwkJU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsKKwkJc2VydmljZS5zZXROYW1lKFNFUlZJQ0VfTkFNRSk7CisJCXNlcnZpY2Uuc2V0VmVyc2lvbih2ZXJzaW9uKTsKKwkJc2VydmljZS5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24gMSIpOworCQlzZXJ2aWNlLnNldENyZWF0b3JVc2VySWQodXNlcklkKTsKKwkJc2VydmljZS5zZXRDb250YWN0SWQoImNvbnRhY3RJZEBzZGMuY29tIik7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeSA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJY2F0ZWdvcnkuc2V0TmFtZShDQVRFR09SWV9OQU1FKTsKKworCQlMaXN0PENhdGVnb3J5RGVmaW5pdGlvbj4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CisJCXNlcnZpY2Uuc2V0Q2F0ZWdvcmllcyhjYXRlZ29yaWVzKTsKKwkJc2VydmljZS5zZXRJY29uKCJpbWFnZXMvbXkucG5nIik7CisJCUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRhZ3MuYWRkKCJUQUcxIik7CisJCXRhZ3MuYWRkKCJUQUcyIik7CisJCXNlcnZpY2Uuc2V0VGFncyh0YWdzKTsKKwkJc2VydmljZS5zZXRVVUlEKHV1aWQpOworCisJCXNlcnZpY2Uuc2V0TGlmZWN5Y2xlU3RhdGUoc3RhdGUpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBzZXJ2aWNlT3BlcmF0aW9uLmNyZWF0ZVNlcnZpY2Uoc2VydmljZSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgc2VydmljZSBjcmVhdGVkIiwgdHJ1ZSwgcmVzdWx0LmlzTGVmdCgpKTsKKwkJU2VydmljZSByZXN1bHRSZXNvdXJjZSA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJcmV0dXJuIHJlc3VsdFJlc291cmNlOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlRnVsbFRlc3RSZXNvdXJjZShTdHJpbmcgdXNlcklkLCBTdHJpbmcgdmVyc2lvbiwgTGlmZWN5Y2xlU3RhdGVFbnVtIHN0YXRlKSB7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UyID0gYnVpbGRSZXNvdXJjZU1ldGFkYXRhKHVzZXJJZCwgQ0FURUdPUllfTkFNRSk7CisJCXJlc291cmNlMi5zZXRWZXJzaW9uKHZlcnNpb24pOworCQk7CisJCXJlc291cmNlMi5zZXRMaWZlY3ljbGVTdGF0ZShzdGF0ZSk7CisKKwkJSW50ZXJmYWNlRGVmaW5pdGlvbiBpbnRlciA9IG5ldyBJbnRlcmZhY2VEZWZpbml0aW9uKElOVEVSRkFDRV9OQU1FLCAiaW50ZXJmYWNlIGRlc2NyaXB0aW9uIiwgbnVsbCk7CisKKwkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24oKTsKKwkJb3BlcmF0aW9uLnNldERlc2NyaXB0aW9uKCJvcCBkZXNjcmlwdGlvbiIpOworCQlvcGVyYXRpb24uc2V0VW5pcXVlSWQoaW50ZXIuZ2V0VW5pcXVlSWQoKSArICIuIiArIElOVEVSRkFDRV9PUEVSQVRJT05fQ1JFQVRFKTsKKworCQlBcnRpZmFjdERhdGFEZWZpbml0aW9uIGFydGlmYWN0RGF0YURlZiA9IG5ldyBBcnRpZmFjdERhdGFEZWZpbml0aW9uKCk7CisJCWFydGlmYWN0RGF0YURlZi5zZXRBcnRpZmFjdENoZWNrc3VtKCJZVGcyTWpnNE1XSmhObUk1TnpCaU56ZERGa01XST0iKTsKKwkJYXJ0aWZhY3REYXRhRGVmLnNldEFydGlmYWN0TmFtZSgiY3JlYXRlX215Um9vdC5zaCIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0QXJ0aWZhY3RMYWJlbCgiY3JlYXRlX215Um9vdCIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0QXJ0aWZhY3RUeXBlKCJTSEVMTCIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0RGVzY3JpcHRpb24oImdvb2QgZGVzY3JpcHRpb24iKTsKKwkJYXJ0aWZhY3REYXRhRGVmLnNldEVzSWQoImVzSWQiKTsKKwkJYXJ0aWZhY3REYXRhRGVmLnNldFVuaXF1ZUlkKG9wZXJhdGlvbi5nZXRVbmlxdWVJZCgpICsgIi4iICsgYXJ0aWZhY3REYXRhRGVmLmdldEFydGlmYWN0TGFiZWwoKSk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdERlZiA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oYXJ0aWZhY3REYXRhRGVmLCAiVUVzREJBb0FBQUFJQUFlTGIwYkRReiIpOworCisJCW9wZXJhdGlvbi5zZXRJbXBsZW1lbnRhdGlvbihhcnRpZmFjdERlZik7CisJCW9wZXJhdGlvbi5zZXRDcmVhdGlvbkRhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQlNYXA8U3RyaW5nLCBPcGVyYXRpb24+IG9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJb3BzLnB1dChJTlRFUkZBQ0VfT1BFUkFUSU9OX0NSRUFURSwgb3BlcmF0aW9uKTsKKwkJaW50ZXIuc2V0T3BlcmF0aW9ucyhvcHMpOworCisJCU1hcDxTdHJpbmcsIEludGVyZmFjZURlZmluaXRpb24+IGludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWludGVyZmFjZXMucHV0KElOVEVSRkFDRV9OQU1FLCBpbnRlcik7CisKKwkJcmVzb3VyY2UyLnNldEludGVyZmFjZXMoaW50ZXJmYWNlcyk7CisKKwkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlTmFtZSA9IENBUEFCSUxJVFlfSE9TVEVEX09OOworCQljcmVhdGVDYXBhYmlsaXR5T25HcmFwaChjYXBhYmlsaXR5VHlwZU5hbWUpOworCisJCS8vIGNyZWF0ZSBjYXBhYmlsaXR5IGRlZmluaXRpb24KKwkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbGl0eURlZmluaXRpb24gPSBuZXcgQ2FwYWJpbGl0eURlZmluaXRpb24oKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24oIm15IGNhcGFiaWxpdHkiKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VHlwZShjYXBhYmlsaXR5VHlwZU5hbWUpOworCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXROYW1lKENBUEFCSUxJVFlfTkFNRSk7CisJCU1hcDxTdHJpbmcsIExpc3Q8Q2FwYWJpbGl0eURlZmluaXRpb24+PiBjYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCUxpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXZhbGlkU291cmNlVHlwZXMuYWRkKCJ0b3NjYS5ub2Rlcy5TQyIpOworCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXRWYWxpZFNvdXJjZVR5cGVzKHZhbGlkU291cmNlVHlwZXMpOworCQlMaXN0PENhcGFiaWxpdHlEZWZpbml0aW9uPiBjYXBsaXN0ID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4oKTsKKwkJY2FwbGlzdC5hZGQoY2FwYWJpbGl0eURlZmluaXRpb24pOworCQljYXBhYmlsaXRpZXMucHV0KGNhcGFiaWxpdHlUeXBlTmFtZSwgY2FwbGlzdCk7CisJCXJlc291cmNlMi5zZXRDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKTsKKworCQkvLyBhZGQgcmVxdWlyZW1lbnQgZGVmaW5pdGlvbgorCQlSZXF1aXJlbWVudERlZmluaXRpb24gcmVxRGVmaW5pdGlvbiA9IG5ldyBSZXF1aXJlbWVudERlZmluaXRpb24oKTsKKwkJLy8gcmVxRGVmaW5pdGlvbi5zZXROb2RlKHJlcU5vZGVOYW1lKTsKKwkJLy8gcmVxRGVmaW5pdGlvbi5zZXRSZWxhdGlvbnNoaXAocmVxUmVsYXRpb25zaGlwKTsKKworCQlyZXFEZWZpbml0aW9uLnNldENhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKwkJcmVxRGVmaW5pdGlvbi5zZXROYW1lKFJFUVVJUkVNRU5UX05BTUUpOworCQlNYXA8U3RyaW5nLCBMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4+IHJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+IHJlcWxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlcXVpcmVtZW50RGVmaW5pdGlvbj4oKTsKKwkJcmVxbGlzdC5hZGQocmVxRGVmaW5pdGlvbik7CisJCXJlcXVpcmVtZW50cy5wdXQoY2FwYWJpbGl0eVR5cGVOYW1lLCByZXFsaXN0KTsKKwkJcmVzb3VyY2UyLnNldFJlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzdWx0ID0gcmVzb3VyY2VPcGVyYXRpb24uY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UyKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBjcmVhdGVkIiwgdHJ1ZSwgcmVzdWx0LmlzTGVmdCgpKTsKKwkJUmVzb3VyY2UgcmVzdWx0UmVzb3VyY2UgPSByZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gYWRkIGFydGlmYWN0cyB0byByZXNvdXJjZQorCQkvLyBBcnRpZmFjdERhdGFEZWZpbml0aW9uIGFydGlmYWN0RGF0YURlZiA9IG5ldworCQkvLyBBcnRpZmFjdERhdGFEZWZpbml0aW9uKCk7CisJCWFydGlmYWN0RGF0YURlZi5zZXRBcnRpZmFjdENoZWNrc3VtKCJZVGcyTWpnNE1XSmhObUk1TnpCaU56ZERGa01XST0iKTsKKwkJYXJ0aWZhY3REYXRhRGVmLnNldEFydGlmYWN0TmFtZSgiY3JlYXRlX215Um9vdC5zaCIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0QXJ0aWZhY3RMYWJlbCgiY3JlYXRlX215Um9vdCIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0QXJ0aWZhY3RUeXBlKCJTSEVMTCIpOworCQlhcnRpZmFjdERhdGFEZWYuc2V0RGVzY3JpcHRpb24oImdvb2QgZGVzY3JpcHRpb24iKTsKKwkJYXJ0aWZhY3REYXRhRGVmLnNldEVzSWQoImVzSWQiKTsKKwkJYXJ0aWZhY3REYXRhRGVmLnNldFVuaXF1ZUlkKHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCkgKyAiLiIgKyBhcnRpZmFjdERhdGFEZWYuZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJYXJ0aWZhY3REZWYgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKGFydGlmYWN0RGF0YURlZiwgIlVFc0RCQW9BQUFBSUFBZUxiMGJEUXoiKTsKKwkJLy8gYXJ0aWZhY3RzLnB1dCgibXlBcnRpZmFjdCIsIGFydGlmYWN0RGVmKTsKKwkJLy8gcmVzb3VyY2UyLnNldEFydGlmYWN0cyhhcnRpZmFjdHMpOworCisJCUVpdGhlcjxBcnRpZmFjdERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZEFyaWZhY3RUb1Jlc291cmNlID0gYXJ0aWZhY3RPcGVyYXRpb24KKwkJCQkuYWRkQXJpZmFjdFRvQ29tcG9uZW50KGFydGlmYWN0RGVmLCByZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShhZGRBcmlmYWN0VG9SZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHJlc3VsdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzTGVmdCgpKTsKKworCQlHc29uIHByZXR0eUdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCQlTdHJpbmcganNvbiA9IHByZXR0eUdzb24udG9Kc29uKHJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJbG9nLmRlYnVnKGpzb24pOworCQlyZXR1cm4gcmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhcGFiaWxpdHlPbkdyYXBoKFN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUpIHsKKworCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uID0gbmV3IENhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbigpOworCQljYXBhYmlsaXR5VHlwZURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24oImRlc2MxIik7CisJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXRUeXBlKGNhcGFiaWxpdHlUeXBlTmFtZSk7CisJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPigpOworCQlTdHJpbmcgcHJvcE5hbWUxID0gImRpc2tfc2l6ZSI7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eTEgPSBidWlsZFByb3BlcnR5MSgpOworCQlwcm9wZXJ0aWVzLnB1dChwcm9wTmFtZTEsIHByb3BlcnR5MSk7CisJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCisJCUVpdGhlcjxDYXBhYmlsaXR5VHlwZURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZENhcGFiaWxpdHlUeXBlMSA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uCisJCQkJLmFkZENhcGFiaWxpdHlUeXBlKGNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbik7CisJCWFzc2VydFRydWUoYWRkQ2FwYWJpbGl0eVR5cGUxLmlzTGVmdCgpKTsKKwl9CisKKwlwcml2YXRlIFVzZXIgY29udmVydFVzZXJEYXRhVG9Vc2VyKFVzZXJEYXRhIG1vZGlmaWVyRGF0YSkgeworCQlVc2VyIG1vZGlmaWVyID0gbmV3IFVzZXIoKTsKKwkJbW9kaWZpZXIuc2V0VXNlcklkKG1vZGlmaWVyRGF0YS5nZXRVc2VySWQoKSk7CisJCW1vZGlmaWVyLnNldEVtYWlsKG1vZGlmaWVyRGF0YS5nZXRFbWFpbCgpKTsKKwkJbW9kaWZpZXIuc2V0Rmlyc3ROYW1lKG1vZGlmaWVyRGF0YS5nZXRGaXJzdE5hbWUoKSk7CisJCW1vZGlmaWVyLnNldExhc3ROYW1lKG1vZGlmaWVyRGF0YS5nZXRMYXN0TmFtZSgpKTsKKwkJbW9kaWZpZXIuc2V0Um9sZShtb2RpZmllckRhdGEuZ2V0Um9sZSgpKTsKKwkJcmV0dXJuIG1vZGlmaWVyOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgYnVpbGRSZXNvdXJjZU1ldGFkYXRhKFN0cmluZyB1c2VySWQsIFN0cmluZyBjYXRlZ29yeSkgeworCQkvLyBkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShjYXRlZ29yeSk7CisKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKKwkJcmVzb3VyY2Uuc2V0TmFtZSgibXktcmVzb3VyY2UiKTsKKwkJcmVzb3VyY2Uuc2V0VmVyc2lvbigiMS4wIik7CisJCTsKKwkJcmVzb3VyY2Uuc2V0RGVzY3JpcHRpb24oImRlc2NyaXB0aW9uIDEiKTsKKwkJcmVzb3VyY2Uuc2V0QWJzdHJhY3QoZmFsc2UpOworCQlyZXNvdXJjZS5zZXRDcmVhdG9yVXNlcklkKHVzZXJJZCk7CisJCXJlc291cmNlLnNldENvbnRhY3RJZCgiY29udGFjdElkQHNkYy5jb20iKTsKKwkJcmVzb3VyY2Uuc2V0VmVuZG9yTmFtZSgidmVuZG9yIDEiKTsKKwkJcmVzb3VyY2Uuc2V0VmVuZG9yUmVsZWFzZSgiMS4wLjAiKTsKKwkJU3RyaW5nW10gY2F0ZWdvcnlBcnIgPSBjYXRlZ29yeS5zcGxpdCgiLyIpOworCQlyZXNvdXJjZS5hZGRDYXRlZ29yeShjYXRlZ29yeUFyclswXSwgY2F0ZWdvcnlBcnJbMV0pOworCQlyZXNvdXJjZS5zZXRJY29uKCJpbWFnZXMvbXkucG5nIik7CisJCUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRhZ3MuYWRkKCJUQUcxIik7CisJCXRhZ3MuYWRkKCJUQUcyIik7CisJCXJlc291cmNlLnNldFRhZ3ModGFncyk7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKKwlwdWJsaWMgVXNlckRhdGEgZGVsZXRlQW5kQ3JlYXRlVXNlcihTdHJpbmcgdXNlcklkLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyByb2xlKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCh1c2VySWQpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoZmlyc3ROYW1lKTsKKwkJdXNlckRhdGEuc2V0TGFzdE5hbWUobGFzdE5hbWUpOworCQl1c2VyRGF0YS5zZXRSb2xlKHJvbGUpOworCisJCXRpdGFuR2VuZXJpY0Rhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKHVzZXJEYXRhLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKworCQlyZXR1cm4gdXNlckRhdGE7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlEZWZpbml0aW9uIGJ1aWxkUHJvcGVydHkxKCkgeworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHkxID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eTEuc2V0RGVmYXVsdFZhbHVlKCIxMCIpOworCQlwcm9wZXJ0eTEuc2V0RGVzY3JpcHRpb24oCisJCQkJIlNpemUgb2YgdGhlIGxvY2FsIGRpc2ssIGluIEdpZ2FieXRlcyAoR0IpLCBhdmFpbGFibGUgdG8gYXBwbGljYXRpb25zIHJ1bm5pbmcgb24gdGhlIENvbXB1dGUgbm9kZS4iKTsKKwkJcHJvcGVydHkxLnNldFR5cGUoVG9zY2FUeXBlLklOVEVHRVIubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4oKTsKKwkJR3JlYXRlclRoYW5Db25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludDEgPSBuZXcgR3JlYXRlclRoYW5Db25zdHJhaW50KCIwIik7CisJCWNvbnN0cmFpbnRzLmFkZChwcm9wZXJ0eUNvbnN0cmFpbnQxKTsKKworCQlMZXNzT3JFcXVhbENvbnN0cmFpbnQgcHJvcGVydHlDb25zdHJhaW50MiA9IG5ldyBMZXNzT3JFcXVhbENvbnN0cmFpbnQoIjEwIik7CisJCWNvbnN0cmFpbnRzLmFkZChwcm9wZXJ0eUNvbnN0cmFpbnQyKTsKKworCQlwcm9wZXJ0eTEuc2V0Q29uc3RyYWludHMoY29uc3RyYWludHMpOworCQlyZXR1cm4gcHJvcGVydHkxOworCX0KKworCXByaXZhdGUgQXJ0aWZhY3REZWZpbml0aW9uIGFkZEFydGlmYWN0VG9TZXJ2aWNlKFN0cmluZyB1c2VySWQsIFN0cmluZyBzZXJ2aWNlSWQsIFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGFydGlmYWN0SW5mbyA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oKTsKKworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3ROYW1lKGFydGlmYWN0TmFtZSArICIuc2giKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZSgiU0hFTEwiKTsKKwkJYXJ0aWZhY3RJbmZvLnNldERlc2NyaXB0aW9uKCJoZGtmaHNrZGZnaCIpOworCQlhcnRpZmFjdEluZm8uc2V0UGF5bG9hZERhdGEoIlVFc0RCQW9BQUFBSUFBZUxiMGJEUXoiKTsKKworCQlhcnRpZmFjdEluZm8uc2V0VXNlcklkQ3JlYXRvcih1c2VySWQpOworCQlTdHJpbmcgZnVsbE5hbWUgPSAiSmltIEgiOworCQlhcnRpZmFjdEluZm8uc2V0VXBkYXRlckZ1bGxOYW1lKGZ1bGxOYW1lKTsKKwkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWFydGlmYWN0SW5mby5zZXRDcmVhdG9yRnVsbE5hbWUoZnVsbE5hbWUpOworCQlhcnRpZmFjdEluZm8uc2V0Q3JlYXRpb25EYXRlKHRpbWUpOworCQlhcnRpZmFjdEluZm8uc2V0TGFzdFVwZGF0ZURhdGUodGltZSk7CisJCWFydGlmYWN0SW5mby5zZXRVc2VySWRMYXN0VXBkYXRlcih1c2VySWQpOworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RMYWJlbChhcnRpZmFjdE5hbWUpOworCQlhcnRpZmFjdEluZm8uc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUHJvcGVydHlVbmlxdWVJZChzZXJ2aWNlSWQsIGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkpKTsKKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhcnRpZmFjdCA9IGFydGlmYWN0T3BlcmF0aW9uCisJCQkJLmFkZEFyaWZhY3RUb0NvbXBvbmVudChhcnRpZmFjdEluZm8sIHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHRydWUsIHRydWUpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0LmlzTGVmdCgpKTsKKwkJcmV0dXJuIGFydGlmYWN0SW5mbzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUG9saWN5VHlwZU9wZXJhdGlvblRlc3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUG9saWN5VHlwZU9wZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ2YzgzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9Qb2xpY3lUeXBlT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qb2xpY3lUeXBlRGF0YURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTW9kZWxUZXN0QmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qb2xpY3lUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmFwaS5TdG9yYWdlT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qb2xpY3lUeXBlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LkNvbnRleHRDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0Lmp1bml0NC5TcHJpbmdKVW5pdDRDbGFzc1J1bm5lcjsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuVmVydGV4OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK0BSdW5XaXRoKFNwcmluZ0pVbml0NENsYXNzUnVubmVyLmNsYXNzKQorQENvbnRleHRDb25maWd1cmF0aW9uKCJjbGFzc3BhdGg6YXBwbGljYXRpb24tY29udGV4dC10ZXN0LnhtbCIpCisKK3B1YmxpYyBjbGFzcyBQb2xpY3lUeXBlT3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZGVsVGVzdEJhc2UgeworCisJQFJlc291cmNlKG5hbWUgPSAicG9saWN5LXR5cGUtb3BlcmF0aW9uIikKKwlwcml2YXRlIFBvbGljeVR5cGVPcGVyYXRpb24gcG9saWN5VHlwZU9wZXJhdGlvbjsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEJlZm9yZUNsYXNzKCkgeworCQlNb2RlbFRlc3RCYXNlLmluaXQoKTsKKworCX0KKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBjbGVhblVwKCkgeworCQlUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvID0gcG9saWN5VHlwZU9wZXJhdGlvbi50aXRhbkdlbmVyaWNEYW87CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXN1bHQgPSB0aXRhbkdlbmVyaWNEYW8uZ2V0R3JhcGgoKTsKKwkJVGl0YW5HcmFwaCBncmFwaCA9IGdyYXBoUmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCisJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IGdyYXBoLnF1ZXJ5KCkudmVydGljZXMoKTsKKwkJaWYgKHZlcnRpY2VzICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJVGl0YW5WZXJ0ZXggdmVydGV4ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCXZlcnRleC5yZW1vdmUoKTsKKwkJCX0KKworCQl9CisJCXRpdGFuR2VuZXJpY0Rhby5jb21taXQoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRQb2xpY3lUeXBlKCkgeworCisJCVBvbGljeVR5cGVEZWZpbml0aW9uIHBvbGljeVR5cGVQcmVDcmVhdGUgPSBjcmVhdGVQb2xpY3lUeXBlRGVmKCk7CisJCWFzc2VydFRydWUoU3RyaW5nVXRpbHMuaXNFbXB0eShwb2xpY3lUeXBlUHJlQ3JlYXRlLmdldFVuaXF1ZUlkKCkpKTsKKwkJRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRQb2xpY3lUeXBlID0gcG9saWN5VHlwZU9wZXJhdGlvbgorCQkJCS5hZGRQb2xpY3lUeXBlKHBvbGljeVR5cGVQcmVDcmVhdGUpOworCQlhc3NlcnRUcnVlKGFkZFBvbGljeVR5cGUuaXNMZWZ0KCkpOworCQlQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xpY3lUeXBlUG9zdENyZWF0ZSA9IGFkZFBvbGljeVR5cGUubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhwb2xpY3lUeXBlUG9zdENyZWF0ZS5nZXRUeXBlKCksIHBvbGljeVR5cGVQcmVDcmVhdGUuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHBvbGljeVR5cGVQb3N0Q3JlYXRlLmdldERlc2NyaXB0aW9uKCksIHBvbGljeVR5cGVQcmVDcmVhdGUuZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJYXNzZXJ0VHJ1ZSghU3RyaW5nVXRpbHMuaXNFbXB0eShwb2xpY3lUeXBlUG9zdENyZWF0ZS5nZXRVbmlxdWVJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGF0ZXN0UG9saWN5VHlwZUJ5VHlwZSgpIHsKKwkJUG9saWN5VHlwZURlZmluaXRpb24gcG9saWN5VHlwZUNyZWF0ZWQgPSBwb2xpY3lUeXBlT3BlcmF0aW9uLmFkZFBvbGljeVR5cGUoY3JlYXRlUG9saWN5VHlwZURlZigpKS5sZWZ0KCkKKwkJCQkudmFsdWUoKTsKKwkJRWl0aGVyPFBvbGljeVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJQb2xpY3lUeXBlRmV0Y2hlZCA9IHBvbGljeVR5cGVPcGVyYXRpb24KKwkJCQkuZ2V0TGF0ZXN0UG9saWN5VHlwZUJ5VHlwZShwb2xpY3lUeXBlQ3JlYXRlZC5nZXRUeXBlKCkpOworCQlhc3NlcnRUcnVlKGVpdGhlclBvbGljeVR5cGVGZXRjaGVkLmlzTGVmdCgpKTsKKwkJUG9saWN5VHlwZURlZmluaXRpb24gcG9saWN5VHlwZUZldGNoZWQgPSBlaXRoZXJQb2xpY3lUeXBlRmV0Y2hlZC5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKHBvbGljeVR5cGVGZXRjaGVkLnRvU3RyaW5nKCksIHBvbGljeVR5cGVDcmVhdGVkLnRvU3RyaW5nKCkpOworCisJfQorCisJcHJpdmF0ZSBQb2xpY3lUeXBlRGVmaW5pdGlvbiBjcmVhdGVQb2xpY3lUeXBlRGVmKCkgeworCQlQb2xpY3lUeXBlRGF0YURlZmluaXRpb24gcG9saWN5VHlwZURhdGFEZWZpbml0aW9uID0gbmV3IFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbigpOworCQlwb2xpY3lUeXBlRGF0YURlZmluaXRpb24KKwkJCQkuc2V0RGVzY3JpcHRpb24oImRlc2NyaXB0aW9uOiBUaGUgVE9TQ0EgUG9saWN5IFR5cGUgYWxsIG90aGVyIFRPU0NBIFBvbGljeSBUeXBlcyBkZXJpdmUgZnJvbSIpOworCQlwb2xpY3lUeXBlRGF0YURlZmluaXRpb24uc2V0VHlwZSgidG9zY2EucG9saWNpZXMuUm9vdCIpOworCQlQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xpY3lUeXBlRGVmaW5pdGlvbiA9IG5ldyBQb2xpY3lUeXBlRGVmaW5pdGlvbihwb2xpY3lUeXBlRGF0YURlZmluaXRpb24pOworCQlwb2xpY3lUeXBlRGVmaW5pdGlvbi5zZXRIaWdoZXN0VmVyc2lvbih0cnVlKTsKKwkJcG9saWN5VHlwZURlZmluaXRpb24uc2V0VmVyc2lvbigiMS4wIik7CisJCXJldHVybiBwb2xpY3lUeXBlRGVmaW5pdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUHJvcGVydHlPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1Byb3BlcnR5T3BlcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWEzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1Byb3BlcnR5T3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQ4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55TWFwOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnlPYmplY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmVxOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaE5vZGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoUmVsYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZUxhYmVsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHMuUHJvcGVydHlSdWxlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Nb2RlbFRlc3RCYXNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlByb3BlcnR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FUeXBlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnN0cmFpbnRzLkdyZWF0ZXJUaGFuQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5JblJhbmdlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5MZXNzT3JFcXVhbENvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUHJvcGVydHlEYXRhOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eU9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2RlbFRlc3RCYXNlIHsKKworCVByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uID0gbmV3IFByb3BlcnR5T3BlcmF0aW9uKCk7CisKKwlUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvID0gTW9ja2l0by5tb2NrKFRpdGFuR2VuZXJpY0Rhby5jbGFzcyk7CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisJCXByb3BlcnR5T3BlcmF0aW9uLnNldFRpdGFuR2VuZXJpY0Rhbyh0aXRhbkdlbmVyaWNEYW8pOworCisJfQorCisJLyoKKwkgKiBAVGVzdCBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eVRvUmVzb3VyY2VUZXN0KCkgeworCSAqIAorCSAqIFN0cmluZyBwcm9wTmFtZSA9ICJteVByb3AiOyBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHkgPQorCSAqIGJ1aWxkUHJvcGVydHlEZWZpbml0aW9uKCk7IExpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb25zdHJhaW50cyA9CisJICogYnVpbGRDb25zdHJhaW50cygpOyBwcm9wZXJ0eS5zZXRDb25zdHJhaW50cyhjb25zdHJhaW50cyk7CisJICogCisJICogUHJvcGVydHlEYXRhIHByb3BlcnR5RGF0YSA9IG5ldyBQcm9wZXJ0eURhdGEocHJvcGVydHksCisJICogcHJvcGVydHlPcGVyYXRpb24uY29udmVydENvbnN0cmFpbnRzVG9TdHJpbmcoY29uc3RyYWludHMpKTsKKwkgKiAKKwkgKiBFaXRoZXI8UHJvcGVydHlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0KKwkgKiBFaXRoZXIubGVmdChwcm9wZXJ0eURhdGEpOworCSAqIC8vd2hlbihwcm9wZXJ0eURhby5jcmVhdGUoKEdyYXBoTmVpZ2hib3VyVGFibGUpYW55T2JqZWN0KCksCisJICogZXEoUHJvcGVydHlEYXRhLmNsYXNzKSwgZXEoTm9kZVR5cGVFbnVtLlByb3BlcnR5KSkpLnRoZW5SZXR1cm4oZWl0aGVyKTsKKwkgKiBHcmFwaFJlbGF0aW9uIGdyYXBoUmVsYXRpb24gPSBuZXcgR3JhcGhSZWxhdGlvbigpOyBFaXRoZXI8R3JhcGhSZWxhdGlvbiwKKwkgKiBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVsYXRpb25SZXN1bHQgPSBFaXRoZXIubGVmdChncmFwaFJlbGF0aW9uKTsKKwkgKiAKKwkgKiB3aGVuKHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVOb2RlKChQcm9wZXJ0eURhdGEpYW55T2JqZWN0KCksCisJICogZXEoUHJvcGVydHlEYXRhLmNsYXNzKSkpLnRoZW5SZXR1cm4oZWl0aGVyKTsKKwkgKiB3aGVuKHRpdGFuR2VuZXJpY0Rhby5jcmVhdGVSZWxhdGlvbigoR3JhcGhOb2RlKWFueU9iamVjdCgpLAorCSAqIChHcmFwaE5vZGUpYW55T2JqZWN0KCksIGVxKEdyYXBoRWRnZUxhYmVscy5QUk9QRVJUWSksCisJICogYW55TWFwKCkpKS50aGVuUmV0dXJuKHJlbGF0aW9uUmVzdWx0KTsKKwkgKiAKKwkgKiBFaXRoZXI8UHJvcGVydHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPQorCSAqIHByb3BlcnR5T3BlcmF0aW9uLmFkZFByb3BlcnR5VG9SZXNvdXJjZShwcm9wTmFtZSwgcHJvcGVydHksCisJICogTm9kZVR5cGVFbnVtLlJlc291cmNlLCAibXktcmVzb3VyY2UuMS4wIik7CisJICogCisJICogYXNzZXJ0VHJ1ZShyZXN1bHQuaXNMZWZ0KCkpOyBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0LmxlZnQoKS52YWx1ZSgpKTsKKwkgKiBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gcmVzdWx0LmxlZnQoKS52YWx1ZSgpOworCSAqIAorCSAqIExpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBvcmlnaW5hbENvbnN0cmFpbnRzID0gcHJvcGVydHkuZ2V0Q29uc3RyYWludHMoKTsKKwkgKiBMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gcHJvcGVydHlDb25zdHJhaW50c1Jlc3VsdCA9CisJICogcHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCk7CisJICogYXNzZXJ0RXF1YWxzKHByb3BlcnR5Q29uc3RyYWludHNSZXN1bHQuc2l6ZSgpLAorCSAqIG9yaWdpbmFsQ29uc3RyYWludHMuc2l6ZSgpKTsKKwkgKiAKKwkgKiB9CisJICovCisJcHJpdmF0ZSBQcm9wZXJ0eURlZmluaXRpb24gYnVpbGRQcm9wZXJ0eURlZmluaXRpb24oKSB7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKCIxMCIpOworCQlwcm9wZXJ0eS5zZXREZXNjcmlwdGlvbigKKwkJCQkiU2l6ZSBvZiB0aGUgbG9jYWwgZGlzaywgaW4gR2lnYWJ5dGVzIChHQiksIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGUgQ29tcHV0ZSBub2RlLiIpOworCQlwcm9wZXJ0eS5zZXRUeXBlKFRvc2NhVHlwZS5JTlRFR0VSLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJcmV0dXJuIHByb3BlcnR5OworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgYWRkUHJvcGVydGllc1RvR3JhcGhUYWJsZVRlc3QoKSB7CisKKwkJLy8gTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLAorCQkvLyBQcm9wZXJ0eURlZmluaXRpb24+KCk7CisJCS8vIFN0cmluZyBwcm9wTmFtZSA9ICJteVByb3AiOworCQkvLyBQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHkgPSBidWlsZFByb3BlcnR5RGVmaW5pdGlvbigpOworCQkvLworCQkvLyBMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBidWlsZENvbnN0cmFpbnRzKCk7CisJCS8vIHByb3BlcnR5LnNldENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKwkJLy8KKwkJLy8gcHJvcGVydGllcy5wdXQocHJvcE5hbWUsIHByb3BlcnR5KTsKKwkJLy8KKwkJLy8gR3JhcGhOZWlnaGJvdXJUYWJsZSBncmFwaE5laWdoYm91clRhYmxlID0gbmV3IEdyYXBoTmVpZ2hib3VyVGFibGUoKTsKKwkJLy8gUmVzb3VyY2VEYXRhIHJlc291cmNlRGF0YSA9IG5ldyBSZXNvdXJjZURhdGEoKTsKKwkJLy8gU3RyaW5nIHJlc291cmNlTmFtZSA9ICJteS1yZXNvdXJjZSI7CisJCS8vIFN0cmluZyByZXNvdXJjZVZlcnNpb24gPSAiMS4wIjsKKwkJLy8gU3RyaW5nIHJlc291cmNlSWQgPSByZXNvdXJjZU5hbWUgKyAiLiIgKyByZXNvdXJjZVZlcnNpb247CisJCS8vIHJlc291cmNlRGF0YS5zZXRVbmlxdWVJZChyZXNvdXJjZUlkKTsKKwkJLy8gaW50IHJlc291cmNlSW5kZXggPSBncmFwaE5laWdoYm91clRhYmxlLmFkZE5vZGUocmVzb3VyY2VEYXRhKTsKKwkJLy8KKwkJLy8gaGVhdFBhcmFtZXRlcnNPcGVyYXRpb24uYWRkUHJvcGVydGllc1RvR3JhcGhUYWJsZShwcm9wZXJ0aWVzLAorCQkvLyBncmFwaE5laWdoYm91clRhYmxlLCByZXNvdXJjZUluZGV4LCByZXNvdXJjZUlkKTsKKwkJLy8KKwkJLy8gYXNzZXJ0RXF1YWxzKDIsIGdyYXBoTmVpZ2hib3VyVGFibGUuZ2V0Tm9kZXMoKS5zaXplKCkpOworCQkvLyBhc3NlcnRFcXVhbHMoMSwgZ3JhcGhOZWlnaGJvdXJUYWJsZS5nZXREaXJlY3RlZEVkZ2VzKCkuc2l6ZSgpKTsKKwkJLy8gTGlzdDxHcmFwaE5vZGU+IG5vZGVzID0gZ3JhcGhOZWlnaGJvdXJUYWJsZS5nZXROb2RlcygpOworCQkvLyBib29sZWFuIG5vZGVGb3VuZCA9IGZhbHNlOworCQkvLyBmb3IgKEdyYXBoTm9kZSBuZW80ak5vZGUgOiBub2RlcykgeworCQkvLyBpZiAobmVvNGpOb2RlIGluc3RhbmNlb2YgUHJvcGVydHlEYXRhKSB7CisJCS8vIFByb3BlcnR5RGF0YSBwcm9wZXJ0eURhdGEgPSAoUHJvcGVydHlEYXRhKW5lbzRqTm9kZTsKKwkJLy8gYXNzZXJ0RXF1YWxzKCJjaGVjayBwcm9wZXJ0eSB1bmlxdWUgaWQiLCByZXNvdXJjZUlkICsgIi4iICsgcHJvcE5hbWUsCisJCS8vIHByb3BlcnR5RGF0YS5nZXRVbmlxdWVJZCgpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCksCisJCS8vIHByb3BlcnR5RGF0YS5nZXRQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCS8vIG5vZGVGb3VuZCA9IHRydWU7CisJCS8vIH0KKwkJLy8gfQorCQkvLyBhc3NlcnRFcXVhbHMoImxvb2tpbmcgZm9yIFByb3BlcnR5RGF0YSBvYmplY3QgaW4gdGFibGUiLCB0cnVlLAorCQkvLyBub2RlRm91bmQpOworCQkvLworCQkvLyBOb2RlUmVsYXRpb24gbm9kZVJlbGF0aW9uID0KKwkJLy8gZ3JhcGhOZWlnaGJvdXJUYWJsZS5nZXREaXJlY3RlZEVkZ2VzKCkuZ2V0KDApOworCQkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIGZyb20gaW5kZXggdG8gaW5kZXggZWRnZSIsIDAsCisJCS8vIG5vZGVSZWxhdGlvbi5nZXRGcm9tSW5kZXgoKSk7CisJCS8vIGFzc2VydEVxdWFscygiY2hlY2sgZnJvbSBpbmRleCB0byBpbmRleCBlZGdlIiwgMSwKKwkJLy8gbm9kZVJlbGF0aW9uLmdldFRvSW5kZXgoKSk7CisJCS8vIGFzc2VydEVxdWFscygiY2hlY2sgZWRnZSB0eXBlIiwKKwkJLy8gR3JhcGhFZGdlUHJvcGVydGllc0RpY3Rpb25hcnkuUFJPUEVSVFksCisJCS8vIG5vZGVSZWxhdGlvbi5nZXRFZGdlKCkuZ2V0RWRnZVR5cGUoKSk7CisJCS8vIGFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydCBuYW1lIG9uIGVkZ2UiLCB0cnVlLAorCQkvLyBub2RlUmVsYXRpb24uZ2V0RWRnZSgpLmdldFByb3BlcnRpZXMoKS52YWx1ZXMoKS5jb250YWlucyhwcm9wTmFtZSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29udmVydENvbnN0cmFpbnRzVGVzdCgpIHsKKworCQlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4gY29uc3RyYWludHMgPSBidWlsZENvbnN0cmFpbnRzKCk7CisJCUxpc3Q8U3RyaW5nPiBjb252ZXJ0ZWRTdHJpbmdDb25zdHJhaW50cyA9IHByb3BlcnR5T3BlcmF0aW9uLmNvbnZlcnRDb25zdHJhaW50c1RvU3RyaW5nKGNvbnN0cmFpbnRzKTsKKwkJYXNzZXJ0RXF1YWxzKCJjb25zdHJhaW50cyBzaXplIiwgY29uc3RyYWludHMuc2l6ZSgpLCBjb252ZXJ0ZWRTdHJpbmdDb25zdHJhaW50cy5zaXplKCkpOworCisJCUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb252ZXJ0ZWRDb25zdHJhaW50cyA9IHByb3BlcnR5T3BlcmF0aW9uCisJCQkJLmNvbnZlcnRDb25zdHJhaW50cyhjb252ZXJ0ZWRTdHJpbmdDb25zdHJhaW50cyk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgc2l6ZSBvZiBjb25zdHJhaW50cyIsIGNvbnN0cmFpbnRzLnNpemUoKSwgY29udmVydGVkQ29uc3RyYWludHMuc2l6ZSgpKTsKKworCQlTZXQ8U3RyaW5nPiBjb25zdHJhaW50c0NsYXNzZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoUHJvcGVydHlDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludCA6IGNvbnN0cmFpbnRzKSB7CisJCQljb25zdHJhaW50c0NsYXNzZXMuYWRkKHByb3BlcnR5Q29uc3RyYWludC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJCX0KKworCQlmb3IgKFByb3BlcnR5Q29uc3RyYWludCBwcm9wZXJ0eUNvbnN0cmFpbnQgOiBjb252ZXJ0ZWRDb25zdHJhaW50cykgeworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgYWxsIGNsYXNzZXMgZ2VuZXJhdGVkIiwKKwkJCQkJY29uc3RyYWludHNDbGFzc2VzLmNvbnRhaW5zKHByb3BlcnR5Q29uc3RyYWludC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eURlZmF1bHRWYWx1ZVZhbGlkX05vRGVmYXVsdCgpIHsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eS5zZXROYW1lKCJteVByb3BlcnR5Iik7CisJCXByb3BlcnR5LnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuQk9PTEVBTi5nZXRUeXBlKCkpOworCQlhc3NlcnRUcnVlKHByb3BlcnR5T3BlcmF0aW9uLmlzUHJvcGVydHlEZWZhdWx0VmFsdWVWYWxpZChwcm9wZXJ0eSwgbnVsbCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlEZWZhdWx0VmFsdWVWYWxpZF9WYWxpZERlZmF1bHQoKSB7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkuc2V0TmFtZSgibXlQcm9wZXJ0eSIpOworCQlwcm9wZXJ0eS5zZXRUeXBlKFRvc2NhUHJvcGVydHlUeXBlLklOVEVHRVIuZ2V0VHlwZSgpKTsKKwkJcHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKCI1MCIpOworCQlhc3NlcnRUcnVlKHByb3BlcnR5T3BlcmF0aW9uLmlzUHJvcGVydHlEZWZhdWx0VmFsdWVWYWxpZChwcm9wZXJ0eSwgbnVsbCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlEZWZhdWx0VmFsdWVWYWxpZF9JbnZhbGlkRGVmYXVsdCgpIHsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eS5zZXROYW1lKCJteVByb3BlcnR5Iik7CisJCXByb3BlcnR5LnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuQk9PTEVBTi5nZXRUeXBlKCkpOworCQlwcm9wZXJ0eS5zZXREZWZhdWx0VmFsdWUoIjUwIik7CisJCWFzc2VydEZhbHNlKHByb3BlcnR5T3BlcmF0aW9uLmlzUHJvcGVydHlEZWZhdWx0VmFsdWVWYWxpZChwcm9wZXJ0eSwgbnVsbCkpOworCX0KKworCXByaXZhdGUgTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGJ1aWxkQ29uc3RyYWludHMoKSB7CisJCUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PigpOworCQlHcmVhdGVyVGhhbkNvbnN0cmFpbnQgcHJvcGVydHlDb25zdHJhaW50MSA9IG5ldyBHcmVhdGVyVGhhbkNvbnN0cmFpbnQoIjAiKTsKKwkJTGVzc09yRXF1YWxDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludDIgPSBuZXcgTGVzc09yRXF1YWxDb25zdHJhaW50KCIxMCIpOworCQlMaXN0PFN0cmluZz4gcmFuZ2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJcmFuZ2UuYWRkKCIwIik7CisJCXJhbmdlLmFkZCgiMTAwIik7CisJCUluUmFuZ2VDb25zdHJhaW50IHByb3BlcnR5Q29uc3RyYWludDMgPSBuZXcgSW5SYW5nZUNvbnN0cmFpbnQocmFuZ2UpOworCQljb25zdHJhaW50cy5hZGQocHJvcGVydHlDb25zdHJhaW50MSk7CisJCWNvbnN0cmFpbnRzLmFkZChwcm9wZXJ0eUNvbnN0cmFpbnQyKTsKKwkJY29uc3RyYWludHMuYWRkKHByb3BlcnR5Q29uc3RyYWludDMpOworCQlyZXR1cm4gY29uc3RyYWludHM7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kUHJvcGVydHlWYWx1ZUJlc3RNYXRjaDEoKSB7CisKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSAieDEiOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlKCJ2MSIpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldERlZmF1bHRWYWx1ZSgidnYxIik7CisJCUxpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXBhdGguYWRkKCJub2RlMSIpOworCQlwYXRoLmFkZCgibm9kZTIiKTsKKwkJcGF0aC5hZGQoIm5vZGUzIik7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0UGF0aChwYXRoKTsKKworCQlNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBpbnN0YW5jZUlkVG9WYWx1ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkxLnNldFZhbHVlKCJ2MW5vZGUxIik7CisJCWluc3RhbmNlSWRUb1ZhbHVlLnB1dCgibm9kZTEiLCBpbnN0YW5jZVByb3BlcnR5MSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MiA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkyLnNldFZhbHVlKCJ2MW5vZGUyIik7CisJCWluc3RhbmNlSWRUb1ZhbHVlLnB1dCgibm9kZTIiLCBpbnN0YW5jZVByb3BlcnR5Mik7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MyA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkzLnNldFZhbHVlKCJ2MW5vZGUzIik7CisJCWluc3RhbmNlSWRUb1ZhbHVlLnB1dCgibm9kZTMiLCBpbnN0YW5jZVByb3BlcnR5Myk7CisKKwkJcHJvcGVydHlPcGVyYXRpb24udXBkYXRlUHJvcGVydHlCeUJlc3RNYXRjaChwcm9wZXJ0eVVuaXF1ZUlkLCBpbnN0YW5jZVByb3BlcnR5LCBpbnN0YW5jZUlkVG9WYWx1ZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB2YWx1ZSIsICJ2MW5vZGUxIiwgaW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBkZWZhdWx0IHZhbHVlIiwgInYxbm9kZTIiLCBpbnN0YW5jZVByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmluZFByb3BlcnR5VmFsdWVCZXN0TWF0Y2gyKCkgeworCisJCVN0cmluZyBwcm9wZXJ0eVVuaXF1ZUlkID0gIngxIjsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5ID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eS5zZXRWYWx1ZSgidjEiKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eS5zZXREZWZhdWx0VmFsdWUoInZ2MSIpOworCQlMaXN0PFN0cmluZz4gcGF0aCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlwYXRoLmFkZCgibm9kZTEiKTsKKwkJcGF0aC5hZGQoIm5vZGUyIik7CisJCXBhdGguYWRkKCJub2RlMyIpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldFBhdGgocGF0aCk7CisKKwkJTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gaW5zdGFuY2VJZFRvVmFsdWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+KCk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MiA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkyLnNldFZhbHVlKCJ2MW5vZGUyIik7CisJCWluc3RhbmNlUHJvcGVydHkyLnNldFZhbHVlVW5pcXVlVWlkKCJhYWFhIik7CisJCWluc3RhbmNlSWRUb1ZhbHVlLnB1dCgibm9kZTIiLCBpbnN0YW5jZVByb3BlcnR5Mik7CisKKwkJcHJvcGVydHlPcGVyYXRpb24udXBkYXRlUHJvcGVydHlCeUJlc3RNYXRjaChwcm9wZXJ0eVVuaXF1ZUlkLCBpbnN0YW5jZVByb3BlcnR5LCBpbnN0YW5jZUlkVG9WYWx1ZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB2YWx1ZSIsICJ2MW5vZGUyIiwgaW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBkZWZhdWx0IHZhbHVlIiwgInZ2MSIsIGluc3RhbmNlUHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnROdWxsKCJjaGVjayB2YWx1ZSB1bmlxdWUgaWQgaXMgbnVsbCIsIGluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWVVbmlxdWVVaWQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRQcm9wZXJ0eVZhbHVlQmVzdE1hdGNoMygpIHsKKworCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9ICJ4MSI7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWUoInYxIik7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKCJ2djEiKTsKKwkJTGlzdDxTdHJpbmc+IHBhdGggPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcGF0aC5hZGQoIm5vZGUxIik7CisJCXBhdGguYWRkKCJub2RlMiIpOworCQlwYXRoLmFkZCgibm9kZTMiKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXRoKHBhdGgpOworCisJCU1hcDxTdHJpbmcsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGluc3RhbmNlSWRUb1ZhbHVlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkxID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eTEuc2V0VmFsdWUoInYxbm9kZTEiKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eTEuc2V0VmFsdWVVbmlxdWVVaWQoImFhYWEiKTsKKwkJaW5zdGFuY2VJZFRvVmFsdWUucHV0KCJub2RlMSIsIGluc3RhbmNlUHJvcGVydHkxKTsKKworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkzID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eTMuc2V0VmFsdWUoInYxbm9kZTMiKTsKKwkJaW5zdGFuY2VJZFRvVmFsdWUucHV0KCJub2RlMyIsIGluc3RhbmNlUHJvcGVydHkzKTsKKworCQlwcm9wZXJ0eU9wZXJhdGlvbi51cGRhdGVQcm9wZXJ0eUJ5QmVzdE1hdGNoKHByb3BlcnR5VW5pcXVlSWQsIGluc3RhbmNlUHJvcGVydHksIGluc3RhbmNlSWRUb1ZhbHVlKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHZhbHVlIiwgInYxbm9kZTEiLCBpbnN0YW5jZVByb3BlcnR5LmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGRlZmF1bHQgdmFsdWUiLCAidjFub2RlMyIsIGluc3RhbmNlUHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHZhbGlkIHVuaXF1ZSBpZCIsIGluc3RhbmNlUHJvcGVydHkxLmdldFZhbHVlVW5pcXVlVWlkKCksCisJCQkJaW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZVVuaXF1ZVVpZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmluZFByb3BlcnR5VmFsdWVCZXN0TWF0Y2gxUnVsZXMoKSB7CisKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSAieDEiOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlKCJ2MSIpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldERlZmF1bHRWYWx1ZSgidnYxIik7CisJCUxpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXBhdGguYWRkKCJub2RlMSIpOworCQlwYXRoLmFkZCgibm9kZTIiKTsKKwkJcGF0aC5hZGQoIm5vZGUzIik7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0UGF0aChwYXRoKTsKKworCQlNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBpbnN0YW5jZUlkVG9WYWx1ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkxLnNldFZhbHVlKCJ2MW5vZGUxIik7CisKKwkJTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVByb3BlcnR5UnVsZSBwcm9wZXJ0eVJ1bGUgPSBuZXcgUHJvcGVydHlSdWxlKCk7CisJCVN0cmluZ1tdIHJ1bGVBcnIgPSB7ICJub2RlMSIsICIuKyIsICJub2RlMyIgfTsKKwkJTGlzdDxTdHJpbmc+IHJ1bGUxID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QocnVsZUFycikpOworCQlwcm9wZXJ0eVJ1bGUuc2V0UnVsZShydWxlMSk7CisJCXByb3BlcnR5UnVsZS5zZXRWYWx1ZSgiODgiKTsKKwkJcnVsZXMuYWRkKHByb3BlcnR5UnVsZSk7CisJCWluc3RhbmNlUHJvcGVydHkxLnNldFJ1bGVzKHJ1bGVzKTsKKworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUxIiwgaW5zdGFuY2VQcm9wZXJ0eTEpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eTIgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5Mi5zZXRWYWx1ZSgidjFub2RlMiIpOworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUyIiwgaW5zdGFuY2VQcm9wZXJ0eTIpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eTMgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5My5zZXRWYWx1ZSgidjFub2RlMyIpOworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUzIiwgaW5zdGFuY2VQcm9wZXJ0eTMpOworCisJCXByb3BlcnR5T3BlcmF0aW9uLnVwZGF0ZVByb3BlcnR5QnlCZXN0TWF0Y2gocHJvcGVydHlVbmlxdWVJZCwgaW5zdGFuY2VQcm9wZXJ0eSwgaW5zdGFuY2VJZFRvVmFsdWUpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdmFsdWUiLCBwcm9wZXJ0eVJ1bGUuZ2V0VmFsdWUoKSwgaW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBkZWZhdWx0IHZhbHVlIiwgInYxbm9kZTIiLCBpbnN0YW5jZVByb3BlcnR5LmdldERlZmF1bHRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmluZFByb3BlcnR5VmFsdWVCZXN0TWF0Y2gyUnVsZXMoKSB7CisKKwkJU3RyaW5nIHByb3BlcnR5VW5pcXVlSWQgPSAieDEiOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldFZhbHVlKCJ2MSIpOworCQlpbnN0YW5jZVByb3BlcnR5LnNldERlZmF1bHRWYWx1ZSgidnYxIik7CisJCUxpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXBhdGguYWRkKCJub2RlMSIpOworCQlwYXRoLmFkZCgibm9kZTIiKTsKKwkJcGF0aC5hZGQoIm5vZGUzIik7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0UGF0aChwYXRoKTsKKworCQlNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PiBpbnN0YW5jZUlkVG9WYWx1ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkxLnNldFZhbHVlKCJ2MW5vZGUxIik7CisKKwkJTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVByb3BlcnR5UnVsZSBwcm9wZXJ0eVJ1bGUxID0gbmV3IFByb3BlcnR5UnVsZSgpOworCQlTdHJpbmdbXSBydWxlQXJyMSA9IHsgIm5vZGUxIiwgIm5vZGUyIiwgIi4rIiB9OworCQlMaXN0PFN0cmluZz4gcnVsZTEgPSBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChydWxlQXJyMSkpOworCQlwcm9wZXJ0eVJ1bGUxLnNldFJ1bGUocnVsZTEpOworCQlwcm9wZXJ0eVJ1bGUxLnNldFZhbHVlKCI4OCIpOworCisJCVByb3BlcnR5UnVsZSBwcm9wZXJ0eVJ1bGUyID0gbmV3IFByb3BlcnR5UnVsZSgpOworCQlTdHJpbmdbXSBydWxlQXJyMiA9IHsgIm5vZGUxIiwgIm5vZGUyIiwgIm5vZGUzIiB9OworCQlMaXN0PFN0cmluZz4gcnVsZTIgPSBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChydWxlQXJyMikpOworCQlwcm9wZXJ0eVJ1bGUyLnNldFJ1bGUocnVsZTIpOworCQlwcm9wZXJ0eVJ1bGUyLnNldFZhbHVlKCI5OSIpOworCisJCXJ1bGVzLmFkZChwcm9wZXJ0eVJ1bGUyKTsKKwkJcnVsZXMuYWRkKHByb3BlcnR5UnVsZTEpOworCisJCWluc3RhbmNlUHJvcGVydHkxLnNldFJ1bGVzKHJ1bGVzKTsKKworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUxIiwgaW5zdGFuY2VQcm9wZXJ0eTEpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eTIgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5Mi5zZXRWYWx1ZSgidjFub2RlMiIpOworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUyIiwgaW5zdGFuY2VQcm9wZXJ0eTIpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eTMgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5My5zZXRWYWx1ZSgidjFub2RlMyIpOworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUzIiwgaW5zdGFuY2VQcm9wZXJ0eTMpOworCisJCXByb3BlcnR5T3BlcmF0aW9uLnVwZGF0ZVByb3BlcnR5QnlCZXN0TWF0Y2gocHJvcGVydHlVbmlxdWVJZCwgaW5zdGFuY2VQcm9wZXJ0eSwgaW5zdGFuY2VJZFRvVmFsdWUpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdmFsdWUiLCBwcm9wZXJ0eVJ1bGUyLmdldFZhbHVlKCksIGluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgZGVmYXVsdCB2YWx1ZSIsICJ2MW5vZGUyIiwgaW5zdGFuY2VQcm9wZXJ0eS5nZXREZWZhdWx0VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRQcm9wZXJ0eVZhbHVlQmVzdE1hdGNoMVJ1bGVMb3dMZXZlbCgpIHsKKworCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9ICJ4MSI7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWUoInYxIik7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKCJ2djEiKTsKKwkJTGlzdDxTdHJpbmc+IHBhdGggPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcGF0aC5hZGQoIm5vZGUxIik7CisJCXBhdGguYWRkKCJub2RlMiIpOworCQlwYXRoLmFkZCgibm9kZTMiKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXRoKHBhdGgpOworCisJCU1hcDxTdHJpbmcsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGluc3RhbmNlSWRUb1ZhbHVlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkxID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eTEuc2V0VmFsdWUoInYxbm9kZTEiKTsKKworCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZTEgPSBuZXcgUHJvcGVydHlSdWxlKCk7CisJCVN0cmluZ1tdIHJ1bGVBcnIxID0geyAibm9kZTEiLCAibm9kZTIiLCAiLisiIH07CisJCUxpc3Q8U3RyaW5nPiBydWxlMSA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KHJ1bGVBcnIxKSk7CisJCXByb3BlcnR5UnVsZTEuc2V0UnVsZShydWxlMSk7CisJCXByb3BlcnR5UnVsZTEuc2V0VmFsdWUoIjg4Iik7CisKKwkJUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZTIgPSBuZXcgUHJvcGVydHlSdWxlKCk7CisJCVN0cmluZ1tdIHJ1bGVBcnIyID0geyAibm9kZTEiLCAibm9kZTIiLCAibm9kZTMiIH07CisJCUxpc3Q8U3RyaW5nPiBydWxlMiA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KHJ1bGVBcnIyKSk7CisJCXByb3BlcnR5UnVsZTIuc2V0UnVsZShydWxlMik7CisJCXByb3BlcnR5UnVsZTIuc2V0VmFsdWUoIjk5Iik7CisKKwkJcnVsZXMuYWRkKHByb3BlcnR5UnVsZTIpOworCQlydWxlcy5hZGQocHJvcGVydHlSdWxlMSk7CisKKwkJaW5zdGFuY2VQcm9wZXJ0eTEuc2V0UnVsZXMocnVsZXMpOworCisJCWluc3RhbmNlSWRUb1ZhbHVlLnB1dCgibm9kZTEiLCBpbnN0YW5jZVByb3BlcnR5MSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MiA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkyLnNldFZhbHVlKCJ2MW5vZGUyIik7CisKKwkJTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzMyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlQcm9wZXJ0eVJ1bGUgcHJvcGVydHlSdWxlMyA9IG5ldyBQcm9wZXJ0eVJ1bGUoKTsKKwkJU3RyaW5nW10gcnVsZUFycjMgPSB7ICJub2RlMiIsICJub2RlMyIgfTsKKwkJTGlzdDxTdHJpbmc+IHJ1bGUzID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QocnVsZUFycjMpKTsKKwkJcHJvcGVydHlSdWxlMy5zZXRSdWxlKHJ1bGUzKTsKKwkJcHJvcGVydHlSdWxlMy5zZXRWYWx1ZSgiNzciKTsKKwkJcnVsZXMzLmFkZChwcm9wZXJ0eVJ1bGUzKTsKKworCQlpbnN0YW5jZVByb3BlcnR5Mi5zZXRSdWxlcyhydWxlczMpOworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUyIiwgaW5zdGFuY2VQcm9wZXJ0eTIpOworCisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eTMgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlpbnN0YW5jZVByb3BlcnR5My5zZXRWYWx1ZSgidjFub2RlMyIpOworCQlpbnN0YW5jZUlkVG9WYWx1ZS5wdXQoIm5vZGUzIiwgaW5zdGFuY2VQcm9wZXJ0eTMpOworCisJCXByb3BlcnR5T3BlcmF0aW9uLnVwZGF0ZVByb3BlcnR5QnlCZXN0TWF0Y2gocHJvcGVydHlVbmlxdWVJZCwgaW5zdGFuY2VQcm9wZXJ0eSwgaW5zdGFuY2VJZFRvVmFsdWUpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgdmFsdWUiLCBwcm9wZXJ0eVJ1bGUyLmdldFZhbHVlKCksIGluc3RhbmNlUHJvcGVydHkuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgZGVmYXVsdCB2YWx1ZSIsIHByb3BlcnR5UnVsZTMuZ2V0VmFsdWUoKSwgaW5zdGFuY2VQcm9wZXJ0eS5nZXREZWZhdWx0VmFsdWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRQcm9wZXJ0eVZhbHVlQmVzdE1hdGNoRGVmYXVsdFZhbHVlTm90Q2hhbmdlZCgpIHsKKworCQlTdHJpbmcgcHJvcGVydHlVbmlxdWVJZCA9ICJ4MSI7CisJCUNvbXBvbmVudEluc3RhbmNlUHJvcGVydHkgaW5zdGFuY2VQcm9wZXJ0eSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0VmFsdWUoInYxIik7CisJCWluc3RhbmNlUHJvcGVydHkuc2V0RGVmYXVsdFZhbHVlKCJ2djEiKTsKKwkJTGlzdDxTdHJpbmc+IHBhdGggPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcGF0aC5hZGQoIm5vZGUxIik7CisJCXBhdGguYWRkKCJub2RlMiIpOworCQlwYXRoLmFkZCgibm9kZTMiKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eS5zZXRQYXRoKHBhdGgpOworCisJCU1hcDxTdHJpbmcsIENvbXBvbmVudEluc3RhbmNlUHJvcGVydHk+IGluc3RhbmNlSWRUb1ZhbHVlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5PigpOworCQlDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5IGluc3RhbmNlUHJvcGVydHkxID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJaW5zdGFuY2VQcm9wZXJ0eTEuc2V0VmFsdWUoInYxbm9kZTEiKTsKKworCQlMaXN0PFByb3BlcnR5UnVsZT4gcnVsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZTEgPSBuZXcgUHJvcGVydHlSdWxlKCk7CisJCVN0cmluZ1tdIHJ1bGVBcnIxID0geyAibm9kZTEiLCAibm9kZTIiLCAiLisiIH07CisJCUxpc3Q8U3RyaW5nPiBydWxlMSA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KHJ1bGVBcnIxKSk7CisJCXByb3BlcnR5UnVsZTEuc2V0UnVsZShydWxlMSk7CisJCXByb3BlcnR5UnVsZTEuc2V0VmFsdWUoIjg4Iik7CisKKwkJUHJvcGVydHlSdWxlIHByb3BlcnR5UnVsZTIgPSBuZXcgUHJvcGVydHlSdWxlKCk7CisJCVN0cmluZ1tdIHJ1bGVBcnIyID0geyAibm9kZTEiLCAibm9kZTIiLCAibm9kZTMiIH07CisJCUxpc3Q8U3RyaW5nPiBydWxlMiA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KHJ1bGVBcnIyKSk7CisJCXByb3BlcnR5UnVsZTIuc2V0UnVsZShydWxlMik7CisJCXByb3BlcnR5UnVsZTIuc2V0VmFsdWUoIjk5Iik7CisKKwkJcnVsZXMuYWRkKHByb3BlcnR5UnVsZTIpOworCQlydWxlcy5hZGQocHJvcGVydHlSdWxlMSk7CisKKwkJaW5zdGFuY2VQcm9wZXJ0eTEuc2V0UnVsZXMocnVsZXMpOworCisJCWluc3RhbmNlSWRUb1ZhbHVlLnB1dCgibm9kZTEiLCBpbnN0YW5jZVByb3BlcnR5MSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZVByb3BlcnR5MiA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCWluc3RhbmNlUHJvcGVydHkyLnNldFZhbHVlKCJ2MW5vZGUyIik7CisKKwkJTGlzdDxQcm9wZXJ0eVJ1bGU+IHJ1bGVzMyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlQcm9wZXJ0eVJ1bGUgcHJvcGVydHlSdWxlMyA9IG5ldyBQcm9wZXJ0eVJ1bGUoKTsKKwkJU3RyaW5nW10gcnVsZUFycjMgPSB7ICJub2RlMiIsICJub2RlMzMzIiB9OworCQlMaXN0PFN0cmluZz4gcnVsZTMgPSBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChydWxlQXJyMykpOworCQlwcm9wZXJ0eVJ1bGUzLnNldFJ1bGUocnVsZTMpOworCQlwcm9wZXJ0eVJ1bGUzLnNldFZhbHVlKCI3NyIpOworCQlydWxlczMuYWRkKHByb3BlcnR5UnVsZTMpOworCisJCWluc3RhbmNlUHJvcGVydHkyLnNldFJ1bGVzKHJ1bGVzMyk7CisJCWluc3RhbmNlSWRUb1ZhbHVlLnB1dCgibm9kZTIiLCBpbnN0YW5jZVByb3BlcnR5Mik7CisKKwkJcHJvcGVydHlPcGVyYXRpb24udXBkYXRlUHJvcGVydHlCeUJlc3RNYXRjaChwcm9wZXJ0eVVuaXF1ZUlkLCBpbnN0YW5jZVByb3BlcnR5LCBpbnN0YW5jZUlkVG9WYWx1ZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB2YWx1ZSIsIHByb3BlcnR5UnVsZTIuZ2V0VmFsdWUoKSwgaW5zdGFuY2VQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBkZWZhdWx0IHZhbHVlIiwgInZ2MSIsIGluc3RhbmNlUHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCkpOworCisJfQorCisJLy8gYWRkIGFsbCBydWxlIHR5cGVzCisJLy8gYWRkIHJ1bGUgd2l0aCBzaXplID0gMShpbnN0YW5jZSBpdHNlbGYgPSBBTEwpLiByZWxldmFudCBmb3IgVkxpLiBlcXVhbHMKKwkvLyB0byBYLiouKi4qIGluIGFsbCBwYXRocyBzaXplCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1JlcXVpcmVtZW50T3BlcmF0aW9uVGVzdC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9SZXF1aXJlbWVudE9wZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRiNTAxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9SZXF1aXJlbWVudE9wZXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuR2VuZXJpY0RhbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5PcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5DYXBhYmlsaXR5VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ2FwYWJpbHR5SW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLk1vZGVsVGVzdEJhc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudEltcGxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlByb3BlcnR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5SZXF1aXJlbWVudE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUmVzb3VyY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlVuaXF1ZUlkQnVpbGRlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwudXRpbC5PcGVyYXRpb25UZXN0c1V0aWw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWwuUHJpbnRHcmFwaDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Vc2VyRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5Db250ZXh0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5qdW5pdDQuU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQFJ1bldpdGgoU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitAQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKK3B1YmxpYyBjbGFzcyBSZXF1aXJlbWVudE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2RlbFRlc3RCYXNlIHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVxdWlyZW1lbnRPcGVyYXRpb25UZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBHc29uIHByZXR0eUdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVTRVJfSUQgPSAibXVzZXJJZCI7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX05BTUUgPSAiY2F0ZWdvcnkvbXljYXRlZ29yeSI7CisKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAidGl0YW4tZ2VuZXJpYy1kYW8iKQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJyZXF1aXJlbWVudC1vcGVyYXRpb24iKQorCXByaXZhdGUgUmVxdWlyZW1lbnRPcGVyYXRpb24gcmVxdWlyZW1lbnRPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gInJlc291cmNlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAicHJvcGVydHktb3BlcmF0aW9uIikKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJjYXBhYmlsaXR5LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImNhcGFiaWxpdHktdHlwZS1vcGVyYXRpb24iKQorCXByaXZhdGUgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBCZWZvcmVDbGFzcygpIHsKKworCQkvLyBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigKKwkJLy8gbmV3IENvbmZpZ3VyYXRpb25Tb3VyY2UoKSB7CisJCS8vCisJCS8vIEBPdmVycmlkZQorCQkvLyBwdWJsaWMgPFQ+IFQgZ2V0QW5kV2F0Y2hDb25maWd1cmF0aW9uKENsYXNzPFQ+IGNsYXNzTmFtZSwKKwkJLy8gQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgeworCQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIHJldHVybiBudWxsOworCQkvLyB9CisJCS8vCisJCS8vIEBPdmVycmlkZQorCQkvLyBwdWJsaWMgPFQ+IHZvaWQgYWRkV2F0Y2hDb25maWd1cmF0aW9uKENsYXNzPFQ+IGNsYXNzTmFtZSwKKwkJLy8gQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgeworCQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vCisJCS8vIH0KKwkJLy8gfSk7CisJCS8vCisJCS8vIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisJCS8vIGNvbmZpZ3VyYXRpb24uc2V0VGl0YW5Jbk1lbW9yeUdyYXBoKHRydWUpOworCQkvLworCQkvLyBjb25maWd1cmF0aW9uTWFuYWdlci5zZXRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOworCQlNb2RlbFRlc3RCYXNlLmluaXQoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REdW1teSgpIHsKKworCQlhc3NlcnRUcnVlKHJlcXVpcmVtZW50T3BlcmF0aW9uICE9IG51bGwpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVxdWlyZW1lbnROb3RFeGlzdENhcGFiaWxpdHkoKSB7CisKKwkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uID0gbmV3IFJlcXVpcmVtZW50RGVmaW5pdGlvbigpOworCQlyZXFEZWZpbml0aW9uLnNldE5vZGUoInRvc2NhLm5vZGVzLkNvbXB1dGUiKTsKKwkJcmVxRGVmaW5pdGlvbi5zZXRSZWxhdGlvbnNoaXAoIm15cmVsYXRpb25zaGlwIik7CisJCXJlcURlZmluaXRpb24uc2V0Q2FwYWJpbGl0eSgibXljYXBhYmlsaXR5X19fMiIpOworCisJCVJlc291cmNlT3BlcmF0aW9uVGVzdCByZXNvdXJjZU9wZXJhdGlvblRlc3QgPSBuZXcgUmVzb3VyY2VPcGVyYXRpb25UZXN0KCk7CisJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsICJteS1yZXNvdXJjZSIsICIwLjEiLCBudWxsLAorCQkJCXRydWUsIHRydWUpOworCisJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSA9IHJlcXVpcmVtZW50T3BlcmF0aW9uCisJCQkJLmFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZShyZXFOYW1lLCByZXFEZWZpbml0aW9uLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBlcnJvciIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCwgYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlLnJpZ2h0KCkudmFsdWUoKSk7CisKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgY3JlYXRlVXNlckFuZENhdGVnb3J5KCkgeworCQlTdHJpbmdbXSBjYXRlZ29yeSA9IENBVEVHT1JZX05BTUUuc3BsaXQoIi8iKTsKKwkJT3BlcmF0aW9uVGVzdHNVdGlsLmRlbGV0ZUFuZENyZWF0ZVJlc291cmNlQ2F0ZWdvcnkoY2F0ZWdvcnlbMF0sIGNhdGVnb3J5WzFdLCB0aXRhbkRhbyk7CisJCWRlbGV0ZUFuZENyZWF0ZVVzZXIoVVNFUl9JRCwgImZpcnN0XyIgKyBVU0VSX0lELCAibGFzdF8iICsgVVNFUl9JRCk7CisJfQorCisJcHJpdmF0ZSBVc2VyRGF0YSBkZWxldGVBbmRDcmVhdGVVc2VyKFN0cmluZyB1c2VySWQsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyRGF0YS5zZXRVc2VySWQodXNlcklkKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKGZpcnN0TmFtZSk7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKGxhc3ROYW1lKTsKKworCQl0aXRhbkRhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNyZWF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKwkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRSZXF1aXJlbWVudFdpdGhDYXBhYmlsaXR5KCkgeworCisJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUgPSAidG9zY2Eubm9kZXMuQ29udGFpbmVyIjsKKworCQlTdHJpbmcgcmVxTmFtZSA9ICJob3N0IjsKKwkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcURlZmluaXRpb24gPSBuZXcgUmVxdWlyZW1lbnREZWZpbml0aW9uKCk7CisJCXJlcURlZmluaXRpb24uc2V0Tm9kZSgidG9zY2Eubm9kZXMuQ29tcHV0ZSIpOworCQlyZXFEZWZpbml0aW9uLnNldFJlbGF0aW9uc2hpcCgibXlyZWxhdGlvbnNoaXAiKTsKKwkJcmVxRGVmaW5pdGlvbi5zZXRDYXBhYmlsaXR5KGNhcGFiaWxpdHlUeXBlTmFtZSk7CisKKwkJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCA9IG5ldyBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QoKTsKKwkJY2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uKTsKKworCQljYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QuY3JlYXRlQ2FwYWJpbGl0eShjYXBhYmlsaXR5VHlwZU5hbWUpOworCisJCVJlc291cmNlT3BlcmF0aW9uVGVzdCByZXNvdXJjZU9wZXJhdGlvblRlc3QgPSBuZXcgUmVzb3VyY2VPcGVyYXRpb25UZXN0KCk7CisJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsICJteS1yZXNvdXJjZSIsICIyLjAiLCBudWxsLAorCQkJCXRydWUsIHRydWUpOworCisJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSA9IHJlcXVpcmVtZW50T3BlcmF0aW9uCisJCQkJLmFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZShyZXFOYW1lLCByZXFEZWZpbml0aW9uLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlcXVpcmVtZW50IHdhcyBhZGRlZCIsIHRydWUsIGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZTIgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJU3RyaW5nIGpzb24gPSBwcmV0dHlHc29uLnRvSnNvbihyZXNvdXJjZTIpOworCQlsb2cuZGVidWcoanNvbik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjb21wYXJlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGNhcGFiaWxpdHlQcm9wZXJ0aWVzLAorCQkJQ2FwYWJpbHR5SW5zdGFuY2UgY2FwYWJpbHR5SW5zdGFuY2UsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWN0dWFsKSB7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gY2FwYWJpbHR5SW5zdGFuY2UuZ2V0UHJvcGVydGllcygpOworCisJCWZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IGVudHJ5IDogY2FwYWJpbGl0eVByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIHBhcmFtTmFtZSA9IGVudHJ5LmdldEtleSgpOworCQkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7CisJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpOworCisJCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldChwYXJhbU5hbWUpOworCisJCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBudWxsOworCQkJaWYgKGFjdHVhbCAhPSBudWxsKSB7CisJCQkJYWN0dWFsVmFsdWUgPSBhY3R1YWwuZ2V0KHBhcmFtTmFtZSk7CisJCQl9CisJCQlpZiAoYWN0dWFsVmFsdWUgIT0gbnVsbCkgeworCQkJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgdmFsdWUgb2Yga2V5ICIgKyBwYXJhbU5hbWUsIHZhbHVlLCBhY3R1YWxWYWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgdmFsdWUgb2Yga2V5ICIgKyBwYXJhbU5hbWUsIHZhbHVlLCBkZWZhdWx0VmFsdWUpOworCQkJfQorCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvblRlc3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWY1MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC9SZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUxMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5ncmFwaC5kYXRhdHlwZS5HcmFwaFJlbGF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaEVkZ2VMYWJlbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLm5lbzRqLkdyYXBoRWRnZVByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQXJ0aWZhY3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5IZWF0UGFyYW1ldGVyRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTW9kZWxUZXN0QmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZWxhdGlvbnNoaXBJbXBsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUmVxdWlyZW1lbnREZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLlN0b3JhZ2VPcGVyYXRpb25TdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkFydGlmYWN0T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5DYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Qcm9wZXJ0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUmVxdWlyZW1lbnRPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5VbmlxdWVJZEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWwuT3BlcmF0aW9uVGVzdHNVdGlsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC51dGlsLlByaW50R3JhcGg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkhlYXRQYXJhbWV0ZXJEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLkhlYXRQYXJhbWV0ZXJWYWx1ZURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVsYXRpb25zaGlwSW5zdERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuUmVzb3VyY2VNZXRhZGF0YURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuU2VydmljZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5VbmlxdWVJZERhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5BcnRpZmFjdEdyb3VwVHlwZUVudW07CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5Db250ZXh0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5qdW5pdDQuU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworQFJ1bldpdGgoU3ByaW5nSlVuaXQ0Q2xhc3NSdW5uZXIuY2xhc3MpCitAQ29udGV4dENvbmZpZ3VyYXRpb24oImNsYXNzcGF0aDphcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZGVsVGVzdEJhc2UgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgR3NvbiBwcmV0dHlHc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBVU0VSX0lEID0gIm11c2VySWQiOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRFR09SWV9OQU1FID0gImNhdGVnb3J5L215Y2F0ZWdvcnkiOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJ0aXRhbi1nZW5lcmljLWRhbyIpCisJcHJpdmF0ZSBUaXRhbkdlbmVyaWNEYW8gdGl0YW5EYW87CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gInJlcXVpcmVtZW50LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBSZXF1aXJlbWVudE9wZXJhdGlvbiByZXF1aXJlbWVudE9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAicmVzb3VyY2Utb3BlcmF0aW9uIikKKwlwcml2YXRlIFJlc291cmNlT3BlcmF0aW9uIHJlc291cmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJwcm9wZXJ0eS1vcGVyYXRpb24iKQorCXByaXZhdGUgUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImNhcGFiaWxpdHktb3BlcmF0aW9uIikKKwlwcml2YXRlIENhcGFiaWxpdHlPcGVyYXRpb24gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAiY2FwYWJpbGl0eS10eXBlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAiY29tcG9uZW50LWluc3RhbmNlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIEhlYXRQYXJhbWV0ZXJzT3BlcmF0aW9uIGhlYXRQYXJhbWV0ZXJPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZQorCXByaXZhdGUgQXJ0aWZhY3RPcGVyYXRpb24gYXJ0aWZhY3RPcGVyYXRpb247CisKKwlwcml2YXRlIFN0cmluZyBDQVBBQklMSVRZXzEgPSAibXljYXBhYmlsaXR5MTAxIjsKKwlwcml2YXRlIFN0cmluZyBDQVBBQklMSVRZXzIgPSAibXljYXBhYmlsaXR5MTAyIjsKKworCXByaXZhdGUgSW50ZWdlciBURVNUX0NMQVNTX05VTUJFUiA9IDE7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ09NUE9ORU5UX05BTUVfREVMSU1FVEVSX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIltcXC5cXC1cXF9dKyIpOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIENPTVBPTkVOVF9JTkNUQU5DRV9OQU1FX0RFTElNRVRFUl9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJbXFwuXFwtXFxfXSsiKTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEJlZm9yZUNsYXNzKCkgeworCisJCS8vIGNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKAorCQkvLyBuZXcgQ29uZmlndXJhdGlvblNvdXJjZSgpIHsKKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyA8VD4gVCBnZXRBbmRXYXRjaENvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gY2xhc3NOYW1lLAorCQkvLyBDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisJCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8gcmV0dXJuIG51bGw7CisJCS8vIH0KKwkJLy8KKwkJLy8gQE92ZXJyaWRlCisJCS8vIHB1YmxpYyA8VD4gdm9pZCBhZGRXYXRjaENvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gY2xhc3NOYW1lLAorCQkvLyBDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisJCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJLy8KKwkJLy8gfQorCQkvLyB9KTsKKwkJLy8KKwkJLy8gQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKwkJLy8KKwkJLy8gLy8vL2lubWVtb3J5CisJCS8vIGJvb2xlYW4gdXNlSW5NZW1vcnkgPSB0cnVlOworCQkvLyBpZiAodXNlSW5NZW1vcnkpIHsKKwkJLy8gY29uZmlndXJhdGlvbi5zZXRUaXRhbkluTWVtb3J5R3JhcGgodHJ1ZSk7CisJCS8vIH0gZWxzZSB7CisJCS8vIGNvbmZpZ3VyYXRpb24uc2V0VGl0YW5Jbk1lbW9yeUdyYXBoKGZhbHNlKTsKKwkJLy8gY29uZmlndXJhdGlvbi5zZXRUaXRhbkNmZ0ZpbGUoIkM6XFxHaXRfd29ya1xcRDItU0RuQ1xcY2F0YWxvZy1iZVxcc3JjXFxtYWluXFxyZXNvdXJjZXNcXGNvbmZpZ1xcdGl0YW4ucHJvcGVydGllcyIpOworCQkvLyB9CisJCS8vCisJCS8vCisJCS8vCisJCS8vIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7CisJCU1vZGVsVGVzdEJhc2UuaW5pdCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbnMoVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvLCBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbiwKKwkJCVJlcXVpcmVtZW50T3BlcmF0aW9uIHJlcXVpcmVtZW50T3BlcmF0aW9uLCBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb24sCisJCQlSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbiwgUHJvcGVydHlPcGVyYXRpb24gcHJvcGVydHlPcGVyYXRpb24sCisJCQlDb21wb25lbnRJbnN0YW5jZU9wZXJhdGlvbiByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uMikgeworCQl0aGlzLnRpdGFuRGFvID0gdGl0YW5EYW87CisJCXRoaXMuY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbjsKKwkJdGhpcy5jYXBhYmlsaXR5T3BlcmF0aW9uID0gY2FwYWJpbGl0eU9wZXJhdGlvbjsKKwkJdGhpcy5yZXF1aXJlbWVudE9wZXJhdGlvbiA9IHJlcXVpcmVtZW50T3BlcmF0aW9uOworCQl0aGlzLnJlc291cmNlT3BlcmF0aW9uID0gcmVzb3VyY2VPcGVyYXRpb247CisJCXRoaXMucHJvcGVydHlPcGVyYXRpb24gPSBwcm9wZXJ0eU9wZXJhdGlvbjsKKwkJdGhpcy5yZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbjI7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RHVtbXkoKSB7CisKKwkJYXNzZXJ0VHJ1ZShyZXF1aXJlbWVudE9wZXJhdGlvbiAhPSBudWxsKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFJlc291cmNlSW5zdGFuY2VJbnZhbGlkU2VydmljZUlkKCkgeworCisJCXRyeSB7CisJCQlDb21wb25lbnRJbnN0YW5jZSBpbnN0YW5jZSA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZSgidG9zY2Eubm9kZXMuQXBhY2hlLjIuMCIsICIxIiwgInRvc2NhLm5vZGVzLkFwYWNoZSIpOworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KCJzZXJ2aWNlMSIsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMSIsIHRydWUsIGluc3RhbmNlLAorCQkJCQkJCU5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBmYWlsZWQgc3RhdHVzIC0gc2VydmljZSBpcyBub3QgaW4gZ3JhcGgiLCB0cnVlLCBzdGF0dXMuaXNSaWdodCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgZmFpbGVkIHN0YXR1cyB2YWx1ZSAtIHNlcnZpY2UgaXMgbm90IGluIGdyYXBoIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCwKKwkJCQkJc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisJCX0gZmluYWxseSB7CisJCQl0aXRhbkRhby5yb2xsYmFjaygpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBZGRSZXNvdXJjZUluc3RhbmNlVmFsaWRTZXJ2aWNlSWRJbnZhbGlkUmVzb3VyY2VJZCgpIHsKKwkJdHJ5IHsKKworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTEgPSBjcmVhdGVTZXJ2aWNlKCJteXNlcnZpY2UxLjEuMCIpOworCisJCQlDb21wb25lbnRJbnN0YW5jZSBpbnN0YW5jZSA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZSgidG9zY2Eubm9kZXMuQXBhY2hlLjIuMCIsICIxIiwgInRvc2NhLm5vZGVzLkFwYWNoZSIpOworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KChTdHJpbmcpIHNlcnZpY2VEYXRhMS5nZXRVbmlxdWVJZCgpLCBOb2RlVHlwZUVudW0uU2VydmljZSwKKwkJCQkJCQkiMSIsIHRydWUsIGluc3RhbmNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBmYWlsZWQgc3RhdHVzIC0gc2VydmljZSBpcyBub3QgaW4gZ3JhcGgiLCB0cnVlLCBzdGF0dXMuaXNSaWdodCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgZmFpbGVkIHN0YXR1cyB2YWx1ZSAtIHNlcnZpY2UgaXMgbm90IGluIGdyYXBoIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuSU5WQUxJRF9JRCwKKwkJCQkJc3RhdHVzLnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCX0KKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZFJlc291cmNlSW5zdGFuY2VWYWxpZFNlcnZpY2VJZCgpIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJteXNlcnZpY2UxLjEuMCI7CisJCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gInRvc2NhLm5vZGVzLkFwYWNoZS4yLjAiOworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTEgPSBjcmVhdGVTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKwkJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlTmFtZSk7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIGluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJIjEiLCAidG9zY2Eubm9kZXMuQXBhY2hlIik7CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQoKFN0cmluZykgc2VydmljZURhdGExLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLAorCQkJCQkJCSIxIiwgdHJ1ZSwgaW5zdGFuY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHN1Y2Nlc3Mgc3RhdHVzIC0gc2VydmljZSBpcyBub3QgaW4gZ3JhcGgiLCB0cnVlLCBzdGF0dXMuaXNMZWZ0KCkpOworCisJCQlDb21wb25lbnRJbnN0YW5jZSB2YWx1ZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgbmFtZSBleGlzdHMiLCAidG9zY2Eubm9kZXMuQXBhY2hlIDEiLCB2YWx1ZS5nZXROYW1lKCkpOworCisJCQlTZXJ2aWNlTWV0YWRhdGFEYXRhIHNlcnZpY2VEYXRhMiA9IGRlbGV0ZVNlcnZpY2Uoc2VydmljZU5hbWUpOworCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhMiA9IGRlbGV0ZVJlc291cmNlKHJlc291cmNlTmFtZSk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXNvdXJjZUluc3RhbmNlKCkgeworCQl0cnkgeworCQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gIm15c2VydmljZTEuMS4wIjsKKwkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSAidG9zY2Eubm9kZXMuQXBhY2hlLjIuMCI7CisJCQlTZXJ2aWNlTWV0YWRhdGFEYXRhIHNlcnZpY2VEYXRhMSA9IGNyZWF0ZVNlcnZpY2Uoc2VydmljZU5hbWUpOworCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2UgaW5zdGFuY2UgPSBidWlsZFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5nZXRVbmlxdWVJZCgpLAorCQkJCQkiMSIsICJ0b3NjYS5ub2Rlcy5BcGFjaGUiKTsKKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gc3RhdHVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudCgoU3RyaW5nKSBzZXJ2aWNlRGF0YTEuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsCisJCQkJCQkJIjEiLCB0cnVlLCBpbnN0YW5jZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQlMb25nIGNyZWF0aW9uVGltZSA9IHJlc291cmNlSW5zdGFuY2UuZ2V0Q3JlYXRpb25UaW1lKCk7CisJCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlSW5zdGFuY2UuZ2V0TmFtZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBzdWNjZXNzIHN0YXR1cyAtIHNlcnZpY2UgaXMgbm90IGluIGdyYXBoIiwgdHJ1ZSwgc3RhdHVzLmlzTGVmdCgpKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2UgdmFsdWUgPSBzdGF0dXMubGVmdCgpLnZhbHVlKCk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIG5hbWUgZXhpc3RzIiwgInRvc2NhLm5vZGVzLkFwYWNoZSAxIiwgdmFsdWUuZ2V0TmFtZSgpKTsKKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1MVJlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24udXBkYXRlUmVzb3VyY2VJbnN0YW5jZSgKKwkJCQkJKFN0cmluZykgc2VydmljZURhdGExLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHZhbHVlLAorCQkJCQl0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHVwZGF0ZSBzdWNjZWVkIiwgdTFSZXMuaXNMZWZ0KCkpOworCisJCQlMb25nIGxhc3RNb2RpZmljYXRpb25UaW1lTkMgPSB2YWx1ZS5nZXRNb2RpZmljYXRpb25UaW1lKCk7CisJCQlTdHJpbmcgZGVzYyA9ICJBQUFBQSI7CisJCQlTdHJpbmcgcG9zWCA9ICIxNSI7CisJCQlTdHJpbmcgcG9zWSA9ICIxMiI7CisJCQlTdHJpbmcgdXBkYXRlZE5hbWUgPSAiU2hsb2tzaGxpayI7CisJCQl2YWx1ZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKKwkJCXZhbHVlLnNldFBvc1gocG9zWCk7CisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHUyUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbi51cGRhdGVSZXNvdXJjZUluc3RhbmNlKAorCQkJCQkoU3RyaW5nKSBzZXJ2aWNlRGF0YTEuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgdmFsdWUsCisJCQkJCXRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdXBkYXRlIHN1Y2NlZWQiLCB1MlJlcy5pc0xlZnQoKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGluc3RhbmNlIHVwZGF0ZWQiLCBkZXNjLCB1MlJlcy5sZWZ0KCkudmFsdWUoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2UgdXBkYXRlZCIsIHBvc1gsIHUyUmVzLmxlZnQoKS52YWx1ZSgpLmdldFBvc1goKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGluc3RhbmNlIHVwZGF0ZWQiLCByZXNvdXJjZUluc3RhbmNlLmdldFBvc1koKSwgdTJSZXMubGVmdCgpLnZhbHVlKCkuZ2V0UG9zWSgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgbW9kaWZpY2F0aW9uIHRpbWUgd2FzIG5vdCB1cGRhdGVkIHNpbmNlIGl0IHdhcyBzdXBwbGllZCIsCisJCQkJCXUyUmVzLmxlZnQoKS52YWx1ZSgpLmdldE1vZGlmaWNhdGlvblRpbWUoKSwgbGFzdE1vZGlmaWNhdGlvblRpbWVOQyk7CisKKwkJCUxvbmcgbGFzdE1vZGlmaWNhdGlvblRpbWUgPSB2YWx1ZS5nZXRNb2RpZmljYXRpb25UaW1lKCk7CisJCQl2YWx1ZS5zZXRQb3NZKHBvc1kpOworCQkJdmFsdWUuc2V0TW9kaWZpY2F0aW9uVGltZShudWxsKTsKKwkJCXZhbHVlLnNldE5hbWUodXBkYXRlZE5hbWUpOworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1M1JlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24udXBkYXRlUmVzb3VyY2VJbnN0YW5jZSgKKwkJCQkJKFN0cmluZykgc2VydmljZURhdGExLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIHZhbHVlLAorCQkJCQl0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHVwZGF0ZSBzdWNjZWVkIiwgdTNSZXMuaXNMZWZ0KCkpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBpbnN0YW5jZSB1cGRhdGVkIiwgZGVzYywgdTNSZXMubGVmdCgpLnZhbHVlKCkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIHBvcyB4IHVwZGF0ZWQiLCBwb3NYLCB1M1Jlcy5sZWZ0KCkudmFsdWUoKS5nZXRQb3NYKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBwb3MgeSB1cGRhdGVkIiwgcG9zWSwgdTNSZXMubGVmdCgpLnZhbHVlKCkuZ2V0UG9zWSgpKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIG1vZGlmaWNhdGlvbiB0aW1lIHdhcyB1cGRhdGVkIiwKKwkJCQkJdTNSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TW9kaWZpY2F0aW9uVGltZSgpID49IGxhc3RNb2RpZmljYXRpb25UaW1lKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgY3JlYXRpb24gdGltZSB3YXMgbm90IHVwZGF0ZWQiLCBjcmVhdGlvblRpbWUsIHUzUmVzLmxlZnQoKS52YWx1ZSgpLmdldENyZWF0aW9uVGltZSgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgbmFtZSB3YXMgIHVwZGF0ZWQiLCB1cGRhdGVkTmFtZSwgdTNSZXMubGVmdCgpLnZhbHVlKCkuZ2V0TmFtZSgpKTsKKworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTIgPSBkZWxldGVTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKwkJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YTIgPSBkZWxldGVSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworCisJCX0gZmluYWxseSB7CisJCQl0aXRhbkRhby5yb2xsYmFjaygpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUmVzb3VyY2VJbnN0YW5jZSgpIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJteXNlcnZpY2UxLjEuMCI7CisJCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gInRvc2NhLm5vZGVzLkFwYWNoZS4yLjAiOworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTEgPSBjcmVhdGVTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKwkJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlTmFtZSk7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIGluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJIjEiLCAidG9zY2Eubm9kZXMuQXBhY2hlIik7CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1cyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQoKFN0cmluZykgc2VydmljZURhdGExLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5TZXJ2aWNlLAorCQkJCQkJCSIxIiwgdHJ1ZSwgaW5zdGFuY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHN1Y2Nlc3Mgc3RhdHVzIC0gc2VydmljZSBpcyBub3QgaW4gZ3JhcGgiLCB0cnVlLCBzdGF0dXMuaXNMZWZ0KCkpOworCisJCQlDb21wb25lbnRJbnN0YW5jZSB2YWx1ZSA9IHN0YXR1cy5sZWZ0KCkudmFsdWUoKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgbmFtZSBleGlzdHMiLCAidG9zY2Eubm9kZXMuQXBhY2hlIDEiLCB2YWx1ZS5nZXROYW1lKCkpOworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzdGF0dXMxID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkucmVtb3ZlQ29tcG9uZW50SW5zdGFuY2VGcm9tQ29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBzZXJ2aWNlTmFtZSwgdmFsdWUuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCWFzc2VydFRydWUoImNoZWNrIHJlc291cmNlIHNlcnZpY2Ugd2FzIGRlbGV0ZWQuIiwgc3RhdHVzMS5pc0xlZnQoKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGluc3RhbmNlIHJldHVybmVkLiIsICJ0b3NjYS5ub2Rlcy5BcGFjaGUgMSIsIHN0YXR1czEubGVmdCgpLnZhbHVlKCkuZ2V0TmFtZSgpKTsKKworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTIgPSBkZWxldGVTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKwkJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJlc291cmNlRGF0YTIgPSBkZWxldGVSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworCisJCX0gZmluYWxseSB7CisJCQl0aXRhbkRhby5yb2xsYmFjaygpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUmVzb3VyY2VJbnN0YW5jZU5vdEZvdW5kKCkgeworCQl0cnkgeworCQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gIm15c2VydmljZTEuMS4wIjsKKwkJCVNlcnZpY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGExID0gY3JlYXRlU2VydmljZShzZXJ2aWNlTmFtZSk7CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHN0YXR1czEgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5yZW1vdmVDb21wb25lbnRJbnN0YW5jZUZyb21Db21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHNlcnZpY2VOYW1lLCAic3RhbSIpOworCisJCQlhc3NlcnRUcnVlKCJjaGVjayByZXNvdXJjZSBzZXJ2aWNlIHdhcyBub3QgZGVsZXRlZC4iLCBzdGF0dXMxLmlzUmlnaHQoKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIE5PVF9GT1VORCByZXR1cm5lZC4iLCBUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsIHN0YXR1czEucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTIgPSBkZWxldGVTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKworCQl9IGZpbmFsbHkgeworCQkJdGl0YW5EYW8ucm9sbGJhY2soKTsKKwkJfQorCX0KKworCXB1YmxpYyBTZXJ2aWNlTWV0YWRhdGFEYXRhIGNyZWF0ZVNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisKKwkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YSgpOworCQlzZXJ2aWNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNlcnZpY2VOYW1lKTsKKwkJRWl0aGVyPFNlcnZpY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlID0gdGl0YW5EYW8uY3JlYXRlTm9kZShzZXJ2aWNlRGF0YTEsCisJCQkJU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgc2VydmljZSBjcmVhdGVkIiwgY3JlYXRlTm9kZS5pc0xlZnQoKSk7CisJCXJldHVybiBjcmVhdGVOb2RlLmxlZnQoKS52YWx1ZSgpOworCX0KKworCXB1YmxpYyBTZXJ2aWNlTWV0YWRhdGFEYXRhIGRlbGV0ZVNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisKKwkJU2VydmljZU1ldGFkYXRhRGF0YSBzZXJ2aWNlRGF0YTEgPSBuZXcgU2VydmljZU1ldGFkYXRhRGF0YSgpOworCQlzZXJ2aWNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNlcnZpY2VOYW1lKTsKKwkJRWl0aGVyPFNlcnZpY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlID0gdGl0YW5EYW8uZGVsZXRlTm9kZShzZXJ2aWNlRGF0YTEsCisJCQkJU2VydmljZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoImNoZWNrIHNlcnZpY2UgZGVsZXRlZCIsIGNyZWF0ZU5vZGUuaXNMZWZ0KCkpOworCQlyZXR1cm4gY3JlYXRlTm9kZS5sZWZ0KCkudmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VNZXRhZGF0YURhdGEgY3JlYXRlUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlTmFtZSkgeworCisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHNlcnZpY2VEYXRhMSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQlzZXJ2aWNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHJlc291cmNlTmFtZSk7CisJCUVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkRhby5jcmVhdGVOb2RlKHNlcnZpY2VEYXRhMSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgc2VydmljZSBjcmVhdGVkIiwgY3JlYXRlTm9kZS5pc0xlZnQoKSk7CisJCXJldHVybiBjcmVhdGVOb2RlLmxlZnQoKS52YWx1ZSgpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZU1ldGFkYXRhRGF0YSBkZWxldGVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgc2VydmljZURhdGExID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCXNlcnZpY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocmVzb3VyY2VOYW1lKTsKKwkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZSA9IHRpdGFuRGFvLmRlbGV0ZU5vZGUoc2VydmljZURhdGExLAorCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlhc3NlcnRUcnVlKCJjaGVjayBzZXJ2aWNlIGNyZWF0ZWQiLCBjcmVhdGVOb2RlLmlzTGVmdCgpKTsKKwkJcmV0dXJuIGNyZWF0ZU5vZGUubGVmdCgpLnZhbHVlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVzb3VyY2VJbnN0YW5jZUpzb24oKSB7CisJCWFkZFJlc291cmNlSW5zdGFuY2VKc29uKCk7CisJfQorCisJcHVibGljIENvbXBvbmVudEluc3RhbmNlIGFkZFJlc291cmNlSW5zdGFuY2VKc29uKCkgeworCisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSBidWlsZFJlc291cmNlSW5zdGFuY2UoInRvc2NhLm5vZGVzLkFwYWNoZS4yLjAiLCAiMSIsICJ0b3NjYS5ub2Rlcy5BcGFjaGUiKTsKKworCQlTdHJpbmcganNvbiA9IHByZXR0eUdzb24udG9Kc29uKHJlc291cmNlSW5zdGFuY2UpOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2U7CisKKwl9CisKKwlwcml2YXRlIENvbXBvbmVudEluc3RhbmNlIGJ1aWxkUmVzb3VyY2VJbnN0YW5jZShTdHJpbmcgcmVzcHVyY2VVaWQsIFN0cmluZyBpbnN0YW5jZU51bWJlciwgU3RyaW5nIG5hbWUpIHsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IG5ldyBDb21wb25lbnRJbnN0YW5jZSgpOworCQkvLyByZXNvdXJjZUluc3RhbmNlCisJCS8vIC5zZXRVbmlxdWVJZCgiPFNOPi50b3NjYS5ub2Rlcy5BcGFjaGUuMi4wLiIgKyBpbnN0YW5jZU51bWJlcik7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0TmFtZShuYW1lKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXREZXNjcmlwdGlvbigiZGVzYzEiKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXRQb3NYKCIyMCIpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldFBvc1koIjQwIik7CisJCXJlc291cmNlSW5zdGFuY2Uuc2V0Q29tcG9uZW50VWlkKHJlc3B1cmNlVWlkKTsKKwkJcmVzb3VyY2VJbnN0YW5jZS5zZXRDcmVhdGlvblRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldE1vZGlmaWNhdGlvblRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQlyZXNvdXJjZUluc3RhbmNlLnNldE5vcm1hbGl6ZWROYW1lKG5vcm1hbGlzZUNvbXBvbmVudE5hbWUobmFtZSkpOworCisJCS8vIE1hcDxTdHJpbmcsIFJlcXVpcmVtZW50SW5zdGFuY2U+IHJlcXVpcmVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywKKwkJLy8gUmVxdWlyZW1lbnRJbnN0YW5jZT4oKTsKKwkJLy8KKwkJLy8gUmVxdWlyZW1lbnRJbnN0YW5jZSByZXF1aXJlbWVudEluc3RhbmNlMSA9IG5ldyBSZXF1aXJlbWVudEluc3RhbmNlKCk7CisJCS8vIHJlcXVpcmVtZW50SW5zdGFuY2UxLnNldE5vZGUoIk5BIik7CisJCS8vIFJlbGF0aW9uc2hpcEltcGwgcmVsYXRpb25zaGlwSW1wbCA9IG5ldyBSZWxhdGlvbnNoaXBJbXBsKCk7CisJCS8vIHJlbGF0aW9uc2hpcEltcGwuc2V0VHlwZSgidG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbiIpOworCQkvLyByZXF1aXJlbWVudEluc3RhbmNlMS5zZXRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwSW1wbCk7CisJCS8vCisJCS8vIHJlcXVpcmVtZW50cy5wdXQoImhvc3QiLCByZXF1aXJlbWVudEluc3RhbmNlMSk7CisJCS8vCisJCS8vIFJlcXVpcmVtZW50SW5zdGFuY2UgcmVxdWlyZW1lbnRJbnN0YW5jZTIgPSBuZXcgUmVxdWlyZW1lbnRJbnN0YW5jZSgpOworCQkvLyByZXF1aXJlbWVudEluc3RhbmNlMi5zZXROb2RlKCJOQSIpOworCQkvLyBSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcEltcGwyID0gbmV3IFJlbGF0aW9uc2hpcEltcGwoKTsKKwkJLy8gcmVsYXRpb25zaGlwSW1wbDIuc2V0VHlwZSgidG9zY2EucmVsYXRpb25zaGlwcy5MaW5rVG8iKTsKKwkJLy8gcmVxdWlyZW1lbnRJbnN0YW5jZTIuc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcEltcGwyKTsKKwkJLy8KKwkJLy8gcmVxdWlyZW1lbnRzLnB1dCgibGluayIsIHJlcXVpcmVtZW50SW5zdGFuY2UyKTsKKwkJLy8KKwkJLy8gcmVzb3VyY2VJbnN0YW5jZS5zZXRSZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKTsKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2U7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uZW5jdFJlc291cmNlSW5zdGFuY2VzSnNvbigpIHsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGFkZFJlbGF0aW9uc2hpcCA9IGFkZFJlbGF0aW9uc2hpcCgiYXBhY2hlXzEiLCAiY29tcHV0ZV8xMDAiKTsKKwkJU3RyaW5nIGpzb24gPSBwcmV0dHlHc29uLnRvSnNvbihhZGRSZWxhdGlvbnNoaXApOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGNhcGFiaWxpdHlSZWxEZWYgPSBwcmV0dHlHc29uLmZyb21Kc29uKGpzb24sIFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZi5jbGFzcyk7CisJCWxvZy5kZWJ1Zygie30iLCBjYXBhYmlsaXR5UmVsRGVmKTsKKworCX0KKworCXB1YmxpYyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgYWRkUmVsYXRpb25zaGlwKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLnNldEZyb21Ob2RlKGZyb20pOworCQlyZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuc2V0VG9Ob2RlKHRvKTsKKwkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMgPSBuZXcgQXJyYXlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4oKTsKKworCQlTdHJpbmcgcmVxID0gImhvc3QiOworCQlSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcEltcGwgPSBuZXcgUmVsYXRpb25zaGlwSW1wbCgpOworCQlyZWxhdGlvbnNoaXBJbXBsLnNldFR5cGUoInRvc2NhLm5vZGVzLkhvc3RlZE9uIik7CisJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxzID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcihyZXEsIHJlbGF0aW9uc2hpcEltcGwpOworCQlyZWxhdGlvbnNoaXBzLmFkZChyZWxzKTsKKworCQlyZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzKTsKKworCQlyZXR1cm4gcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmOworCX0KKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBjcmVhdGVVc2VyQW5kQ2F0ZWdvcnkoKSB7CisJCWRlbGV0ZUFuZENyZWF0ZUNhdGVnb3J5KENBVEVHT1JZX05BTUUpOworCQlkZWxldGVBbmRDcmVhdGVVc2VyKFVTRVJfSUQsICJmaXJzdF8iICsgVVNFUl9JRCwgImxhc3RfIiArIFVTRVJfSUQpOworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZGVsZXRlQW5kQ3JlYXRlVXNlcihTdHJpbmcgdXNlcklkLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKHVzZXJJZCk7CisJCXVzZXJEYXRhLnNldEZpcnN0TmFtZShmaXJzdE5hbWUpOworCQl1c2VyRGF0YS5zZXRMYXN0TmFtZShsYXN0TmFtZSk7CisKKwkJdGl0YW5EYW8uZGVsZXRlTm9kZShVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uVXNlciksIHVzZXJJZCwgVXNlckRhdGEuY2xhc3MpOworCQl0aXRhbkRhby5jcmVhdGVOb2RlKHVzZXJEYXRhLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNvbW1pdCgpOworCisJCXJldHVybiB1c2VyRGF0YTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7CisJCVN0cmluZ1tdIG5hbWVzID0gY2F0ZWdvcnkuc3BsaXQoIi8iKTsKKwkJT3BlcmF0aW9uVGVzdHNVdGlsLmRlbGV0ZUFuZENyZWF0ZVJlc291cmNlQ2F0ZWdvcnkobmFtZXNbMF0sIG5hbWVzWzFdLCB0aXRhbkRhbyk7CisJCU9wZXJhdGlvblRlc3RzVXRpbC5kZWxldGVBbmRDcmVhdGVTZXJ2aWNlQ2F0ZWdvcnkoY2F0ZWdvcnksIHRpdGFuRGFvKTsKKworCQkvKgorCQkgKiBDYXRlZ29yeURhdGEgY2F0ZWdvcnlEYXRhID0gbmV3IENhdGVnb3J5RGF0YSgpOworCQkgKiBjYXRlZ29yeURhdGEuc2V0TmFtZShjYXRlZ29yeSk7CisJCSAqIAorCQkgKiB0aXRhbkRhby5kZWxldGVOb2RlKGNhdGVnb3J5RGF0YSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJICogRWl0aGVyPENhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkRhbworCQkgKiAuY3JlYXRlTm9kZShjYXRlZ29yeURhdGEsIENhdGVnb3J5RGF0YS5jbGFzcyk7CisJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgY3JlYXRpbmcgY2FldGdvcnkgIiArIGNyZWF0ZU5vZGUpOworCQkgKi8KKwl9CisKKwlAVGVzdAorCUBJZ25vcmUKKwlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdFJlc291cmNlSW5zdGFuY2VzKCkgeworCisJCVByaW50R3JhcGggcHJpbnRHcmFwaDEgPSBuZXcgUHJpbnRHcmFwaCgpOworCQlpbnQgbnVtYmVyT2ZWZXJ0aWNlcyA9IHByaW50R3JhcGgxLmdldE51bWJlck9mVmVydGljZXModGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisJCXRyeSB7CisKKwkJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUgPSBDQVBBQklMSVRZXzI7CisJCQlTdHJpbmcgcmVxTmFtZSA9ICJob3N0IjsKKwkJCVN0cmluZyByZXFOb2RlTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Db21wdXRlMiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyByb290TmFtZSA9ICJSb290MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBzb2Z0d2FyZUNvbXBOYW1lID0gInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBjb21wdXRlTm9kZU5hbWUgPSByZXFOb2RlTmFtZTsKKwkJCVN0cmluZyBteVJlc291cmNlVmVyc2lvbiA9ICI0LjAiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgcmVxUmVsYXRpb25zaGlwID0gIm15cmVsYXRpb25zaGlwIjsKKworCQkJLy8gQ3JlYXRlIENhcGFiaWxpdHkgdHlwZQorCQkJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCA9IG5ldyBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QoKTsKKwkJCWNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbik7CisJCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY3JlYXRlQ2FwYWJpbGl0eURlZiA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdAorCQkJCQkuY3JlYXRlQ2FwYWJpbGl0eShjYXBhYmlsaXR5VHlwZU5hbWUpOworCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwKKwkJCQkJdHJ1ZSwgdHJ1ZSk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCisJCQkvLyBBZGQgY2FwYWJpbGl0aWVzIHRvIENvbXB1dGUgUmVzb3VyY2UKKwkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGFkZENhcGFiaWxpdHkgPSBhZGRDYXBhYmlsaXR5VG9SZXNvdXJjZShjYXBhYmlsaXR5VHlwZU5hbWUsICJob3N0IiwgY29tcHV0ZUNvbXBvbmVudCk7CisKKwkJCS8vIENhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHlEZWZpbml0aW9uID0gbmV3CisJCQkvLyBDYXBhYmlsaXR5RGVmaW5pdGlvbigpOworCQkJLy8gY2FwYWJpbGl0eURlZmluaXRpb24uc2V0RGVzY3JpcHRpb24oIm15IGNhcGFiaWxpdHkiKTsKKwkJCS8vIGNhcGFiaWxpdHlEZWZpbml0aW9uLnNldFR5cGUoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKwkJCS8vIExpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQkvLyB2YWxpZFNvdXJjZVR5cGVzLmFkZCgidG9zY2Eubm9kZXMuU0MiKTsKKwkJCS8vIGNhcGFiaWxpdHlEZWZpbml0aW9uLnNldFZhbGlkU291cmNlVHlwZXModmFsaWRTb3VyY2VUeXBlcyk7CisJCQkvLyBFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+CisJCQkvLyBhZGRDYXBhYmlsaXR5ID0gY2FwYWJpbGl0eU9wZXJhdGlvbgorCQkJLy8gLmFkZENhcGFiaWxpdHkoY29tcHV0ZUNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCAiaG9zdCIsCisJCQkvLyBjYXBhYmlsaXR5RGVmaW5pdGlvbiwgdHJ1ZSk7CisJCQkvLyAvL2xvZ2dlci5kZWJ1ZygiYWRkQ2FwYWJpbGl0eSByZXN1bHQgIiArIGFkZENhcGFiaWxpdHkpOworCQkJLy8gYXNzZXJ0VHJ1ZSgiY2hlY2sgY2FwYWJpbGl0eSBjcmVhdGVkICIsIGFkZENhcGFiaWxpdHkuaXNMZWZ0KCkpOworCQkJLy8KKwkJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCQkvLyBjcmVhdGUgcmVxdWlyZW1lbnQgZGVmaW5pdGlvbgorCisJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UgPSBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UoCisJCQkJCWNhcGFiaWxpdHlUeXBlTmFtZSwgcmVxTmFtZSwgcmVxTm9kZU5hbWUsIHJlcVJlbGF0aW9uc2hpcCwgc29mdHdhcmVDb21wb25lbnQpOworCisJCQlTdHJpbmcgcGFyZW50UmVxVW5pcUlkID0gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisKKwkJCS8vIGNyZWF0ZSBteSByZXNvdXJjZSBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29tcG9uZW50CisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCAibXktcmVzb3VyY2UiLAorCQkJCQlteVJlc291cmNlVmVyc2lvbiwgc29mdHdhcmVDb21wb25lbnQuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gIm15c2VydmljZS4xLjAiOworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzSW5zdGFuY2VzID0gYnVpbGRTZXJ2aWNlQW5kQ29ubmVjdEJldHdlZW5SZXNvdXJjZUluc3RhbmNlcyhzZXJ2aWNlTmFtZSwgcmVzb3VyY2UsCisJCQkJCWNvbXB1dGVDb21wb25lbnQsICJob3N0IiwgZmFsc2UsIGFkZENhcGFiaWxpdHkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCisJCQlQcmludEdyYXBoIHByaW50R3JhcGggPSBuZXcgUHJpbnRHcmFwaCgpOworCQkJU3RyaW5nIHdlYkdyYXBoID0gcHJpbnRHcmFwaC5idWlsZEdyYXBoRm9yV2ViZ3JhcGhXaXoodGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcod2ViR3JhcGgpOworCisJCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlRnVsbCA9IHJlc291cmNlT3BlcmF0aW9uCisJCQkJCS5nZXRSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCWFzc2VydFRydWUocmVzb3VyY2VGdWxsLmlzTGVmdCgpKTsKKwkJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiBjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMgPSByZXNvdXJjZUZ1bGwubGVmdCgpLnZhbHVlKCkKKwkJCQkJLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpOworCisJCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgY2FwYWJpbGl0eVJlbERlZiA9IGNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucy5nZXQoMCk7CisJCQljYXBhYmlsaXR5UmVsRGVmLmdldFJlbGF0aW9uc2hpcHMoKS5nZXQoMCkuc2V0UmVxdWlyZW1lbnQoImhvc3QiKTsKKworCQkJLy8gZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZShzZXJ2aWNlTmFtZSwgcmVzSW5zdGFuY2VzLmdldCgwKSwKKwkJCS8vICJob3N0Iik7CisJCQlkaXNjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlKHNlcnZpY2VOYW1lLCBjYXBhYmlsaXR5UmVsRGVmKTsKKworCQl9IGZpbmFsbHkgeworCQkJcm9sbGJhY2tBbmRQcmludChmYWxzZSk7CisJCQljb21wYXJlR3JhcGhTaXplKG51bWJlck9mVmVydGljZXMpOworCQl9CisKKwl9CisKKwlAVGVzdAorCUBJZ25vcmUKKwlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdFJlc291cmNlSW5zdGFuY2VzMVJlcXVpcmVtZW50MkNhcGFiaWxpdGllcygpIHsKKworCQlQcmludEdyYXBoIHByaW50R3JhcGgxID0gbmV3IFByaW50R3JhcGgoKTsKKwkJaW50IG51bWJlck9mVmVydGljZXMgPSBwcmludEdyYXBoMS5nZXROdW1iZXJPZlZlcnRpY2VzKHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCisJCXRyeSB7CisKKwkJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUxID0gQ0FQQUJJTElUWV8xOworCQkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlTmFtZTIgPSBDQVBBQklMSVRZXzI7CisJCQlTdHJpbmcgcmVxTmFtZTEgPSAiaG9zdDEiOworCQkJU3RyaW5nIHJlcU5hbWUyID0gImhvc3QyIjsKKwkJCVN0cmluZyByZXFOb2RlTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Db21wdXRlMiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyByb290TmFtZSA9ICJSb290MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBzb2Z0d2FyZUNvbXBOYW1lID0gInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBjb21wdXRlTm9kZU5hbWUgPSByZXFOb2RlTmFtZTsKKwkJCVN0cmluZyBteVJlc291cmNlVmVyc2lvbiA9ICI0LjAiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgcmVxUmVsYXRpb25zaGlwID0gIm15cmVsYXRpb25zaGlwIjsKKworCQkJLy8gQ3JlYXRlIENhcGFiaWxpdHkgdHlwZQorCQkJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCA9IG5ldyBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QoKTsKKwkJCWNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbik7CisJCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY3JlYXRlQ2FwYWJpbGl0eURlZjEgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lMSk7CisJCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY3JlYXRlQ2FwYWJpbGl0eURlZjIgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lMik7CisKKwkJCVJlc291cmNlT3BlcmF0aW9uVGVzdCByZXNvdXJjZU9wZXJhdGlvblRlc3QgPSBuZXcgUmVzb3VyY2VPcGVyYXRpb25UZXN0KCk7CisJCQlyZXNvdXJjZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgcmVzb3VyY2VPcGVyYXRpb24sIHByb3BlcnR5T3BlcmF0aW9uKTsKKworCQkJLy8gY3JlYXRlIHJvb3QgcmVzb3VyY2UKKwkJCVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCByb290TmFtZSwgIjEuMCIsIG51bGwsCisJCQkJCXRydWUsIHRydWUpOworCisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJLy8gQWRkIGNhcGFiaWxpdGllcyB0byBDb21wdXRlIFJlc291cmNlCisJCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsdHkxID0gYWRkQ2FwYWJpbGl0eVRvUmVzb3VyY2UoY2FwYWJpbGl0eVR5cGVOYW1lMSwgcmVxTmFtZTEsIGNvbXB1dGVDb21wb25lbnQpOworCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbHR5MiA9IGFkZENhcGFiaWxpdHlUb1Jlc291cmNlKGNhcGFiaWxpdHlUeXBlTmFtZTIsIHJlcU5hbWUyLCBjb21wdXRlQ29tcG9uZW50KTsKKworCQkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCisJCQkvLyBjcmVhdGUgcmVxdWlyZW1lbnQgZGVmaW5pdGlvbgorCisJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UgPSBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UoCisJCQkJCWNhcGFiaWxpdHlUeXBlTmFtZTEsIHJlcU5hbWUxLCByZXFOb2RlTmFtZSwgcmVxUmVsYXRpb25zaGlwLCBzb2Z0d2FyZUNvbXBvbmVudCk7CisKKwkJCVN0cmluZyByZXF1aXJlbWVudElkID0gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgcGFyZW50UmVxVW5pcUlkID0gcmVxdWlyZW1lbnRJZDsKKworCQkJLy8gY3JlYXRlIG15IHJlc291cmNlIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb21wb25lbnQKKwkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsICJteS1yZXNvdXJjZSIsCisJCQkJCW15UmVzb3VyY2VWZXJzaW9uLCBzb2Z0d2FyZUNvbXBvbmVudC5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlTdHJpbmcgc2VydmljZU5hbWUgPSAibXlzZXJ2aWNlLjEuMCI7CisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNJbnN0YW5jZXMgPSBidWlsZFNlcnZpY2VBbmRDb25uZWN0QmV0d2VlblJlc291cmNlSW5zdGFuY2VzKHNlcnZpY2VOYW1lLCByZXNvdXJjZSwKKwkJCQkJY29tcHV0ZUNvbXBvbmVudCwgcmVxTmFtZTEsIGZhbHNlLCBjYXBhYmlsdHkxLmdldFVuaXF1ZUlkKCksIHJlcXVpcmVtZW50SWQpOworCisJCQlQcmludEdyYXBoIHByaW50R3JhcGggPSBuZXcgUHJpbnRHcmFwaCgpOworCQkJU3RyaW5nIHdlYkdyYXBoID0gcHJpbnRHcmFwaC5idWlsZEdyYXBoRm9yV2ViZ3JhcGhXaXoodGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisJCQlsb2cuZGVidWcod2ViR3JhcGgpOworCisJCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25QYWlyID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcigpOworCQkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50KHJlcU5hbWUyKTsKKworCQkJcmVsYXRpb25QYWlyLnNldENhcGFiaWxpdHlVaWQoY2FwYWJpbHR5MS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudFVpZChyZXF1aXJlbWVudElkKTsKKworCQkJRWl0aGVyPFJlbGF0aW9uc2hpcEluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29ubmVjdFJlc291cmNlc0luU2VydmljZTEgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5jb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlKHNlcnZpY2VOYW1lLCBOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzSW5zdGFuY2VzLmdldCgwKS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCXJlc0luc3RhbmNlcy5nZXQoMSkuZ2V0VW5pcXVlSWQoKSwgcmVsYXRpb25QYWlyKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgY2Fubm90IGFzc29jaWF0ZSByZXNvdXJjZSBpbnN0YW5jZXMiLCBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5ULAorCQkJCQljb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlMS5yaWdodCgpLnZhbHVlKCkpOworCQkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50KHJlcU5hbWUxKTsKKwkJCUVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UyID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuY29ubmVjdFJlc291cmNlc0luU2VydmljZShzZXJ2aWNlTmFtZSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc0luc3RhbmNlcy5nZXQoMCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCQlyZXNJbnN0YW5jZXMuZ2V0KDEpLmdldFVuaXF1ZUlkKCksIHJlbGF0aW9uUGFpcik7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNhbm5vdCBhc3NvY2lhdGUgcmVzb3VyY2UgaW5zdGFuY2VzIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuVElUQU5fU0NIRU1BX1ZJT0xBVElPTiwKKwkJCQkJY29ubmVjdFJlc291cmNlc0luU2VydmljZTIucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50KHJlcU5hbWUxKTsKKworCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGNhcGFiaWxpdHlSZWxEZWYgPSBuZXcgUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmKCk7CisJCQljYXBhYmlsaXR5UmVsRGVmLnNldEZyb21Ob2RlKHJlc0luc3RhbmNlcy5nZXQoMCkuZ2V0VW5pcXVlSWQoKSk7CisJCQljYXBhYmlsaXR5UmVsRGVmLnNldFRvTm9kZShyZXNJbnN0YW5jZXMuZ2V0KDEpLmdldFVuaXF1ZUlkKCkpOworCQkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWxpc3QuYWRkKHJlbGF0aW9uUGFpcik7CisKKwkJCWRpc2Nvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2Uoc2VydmljZU5hbWUsIGNhcGFiaWxpdHlSZWxEZWYpOworCisJCX0gZmluYWxseSB7CisJCQlyb2xsYmFja0FuZFByaW50KCk7CisJCQljb21wYXJlR3JhcGhTaXplKG51bWJlck9mVmVydGljZXMpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgcm9sbGJhY2tBbmRQcmludCgpIHsKKwkJcm9sbGJhY2tBbmRQcmludChmYWxzZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJvbGxiYWNrQW5kUHJpbnQoYm9vbGVhbiBwcmludCkgeworCQlUaXRhbk9wZXJhdGlvblN0YXR1cyByb2xsYmFjayA9IHRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCWlmIChwcmludCkgeworCQkJbG9nLmRlYnVnKCJyb2xsYmFjayBzdGF0dXM9e30iLCByb2xsYmFjayk7CisJCQlQcmludEdyYXBoIHByaW50R3JhcGggPSBuZXcgUHJpbnRHcmFwaCgpOworCQkJcHJpbnRHcmFwaC5wcmludEdyYXBoVmVydGljZXModGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0UmVzb3VyY2VJbnN0YW5jZXMyUmVxdWlyZW1lbnQyQ2FwYWJpbGl0aWVzKCkgeworCisJCVByaW50R3JhcGggcHJpbnRHcmFwaDEgPSBuZXcgUHJpbnRHcmFwaCgpOworCQlpbnQgbnVtYmVyT2ZWZXJ0aWNlcyA9IHByaW50R3JhcGgxLmdldE51bWJlck9mVmVydGljZXModGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJdHJ5IHsKKworCQkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlTmFtZTEgPSBDQVBBQklMSVRZXzE7CisJCQlTdHJpbmcgY2FwYWJpbGl0eVR5cGVOYW1lMiA9IENBUEFCSUxJVFlfMjsKKwkJCVN0cmluZyByZXFOYW1lMSA9ICJob3N0MSI7CisJCQlTdHJpbmcgcmVxTmFtZTIgPSAiaG9zdDIiOworCQkJU3RyaW5nIHJlcU5vZGVOYW1lID0gInRvc2NhLm5vZGVzLkNvbXB1dGUyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHNvZnR3YXJlQ29tcE5hbWUgPSAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIGNvbXB1dGVOb2RlTmFtZSA9IHJlcU5vZGVOYW1lOworCQkJU3RyaW5nIG15UmVzb3VyY2VWZXJzaW9uID0gIjQuMCIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyByZXFSZWxhdGlvbnNoaXAgPSAibXlyZWxhdGlvbnNoaXAiOworCisJCQkvLyBDcmVhdGUgQ2FwYWJpbGl0eSB0eXBlCisJCQlDYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QgY2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0ID0gbmV3IENhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCgpOworCQkJY2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uKTsKKwkJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjcmVhdGVDYXBhYmlsaXR5RGVmMSA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdAorCQkJCQkuY3JlYXRlQ2FwYWJpbGl0eShjYXBhYmlsaXR5VHlwZU5hbWUxKTsKKwkJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjcmVhdGVDYXBhYmlsaXR5RGVmMiA9IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdAorCQkJCQkuY3JlYXRlQ2FwYWJpbGl0eShjYXBhYmlsaXR5VHlwZU5hbWUyKTsKKworCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwKKwkJCQkJdHJ1ZSwgdHJ1ZSk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCQkJLy8gT0tLS0tLS0sKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCQkJLy8gT0tLS0tLS0tLS0sKKworCQkJLy8gQWRkIGNhcGFiaWxpdGllcyB0byBDb21wdXRlIFJlc291cmNlCisJCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsdHkxID0gYWRkQ2FwYWJpbGl0eVRvUmVzb3VyY2UoY2FwYWJpbGl0eVR5cGVOYW1lMSwgcmVxTmFtZTEsIGNvbXB1dGVDb21wb25lbnQpOworCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbHR5MiA9IGFkZENhcGFiaWxpdHlUb1Jlc291cmNlKGNhcGFiaWxpdHlUeXBlTmFtZTIsIHJlcU5hbWUyLCBjb21wdXRlQ29tcG9uZW50KTsKKworCQkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCisJCQkvLyBjcmVhdGUgcmVxdWlyZW1lbnQgZGVmaW5pdGlvbgorCisJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UxID0gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlKAorCQkJCQljYXBhYmlsaXR5VHlwZU5hbWUxLCByZXFOYW1lMSwgcmVxTm9kZU5hbWUsIHJlcVJlbGF0aW9uc2hpcCwgc29mdHdhcmVDb21wb25lbnQpOworCisJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UyID0gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlKAorCQkJCQljYXBhYmlsaXR5VHlwZU5hbWUyLCByZXFOYW1lMiwgcmVxTm9kZU5hbWUsIHJlcVJlbGF0aW9uc2hpcCwgc29mdHdhcmVDb21wb25lbnQpOworCisJCQkvLyBjcmVhdGUgbXkgcmVzb3VyY2UgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJU3RyaW5nIE1ZX1JFU09VUkNFID0gIm15LXJlc291cmNlIjsKKwkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIE1ZX1JFU09VUkNFLAorCQkJCQlteVJlc291cmNlVmVyc2lvbiwgc29mdHdhcmVDb21wb25lbnQuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gIm15c2VydmljZS4xLjAiOworCQkJU3RyaW5nIHJlcXVpcmVtZW50SWQxID0gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlMS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCQkJU3RyaW5nIHJlcXVpcmVtZW50SWQyID0gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlMi5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCQkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzSW5zdGFuY2VzID0gYnVpbGRTZXJ2aWNlQW5kQ29ubmVjdEJldHdlZW5SZXNvdXJjZUluc3RhbmNlcyhzZXJ2aWNlTmFtZSwgcmVzb3VyY2UsCisJCQkJCWNvbXB1dGVDb21wb25lbnQsIHJlcU5hbWUxLCBmYWxzZSwgY2FwYWJpbHR5MS5nZXRVbmlxdWVJZCgpLCByZXF1aXJlbWVudElkMSk7CisKKwkJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvblBhaXIgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCk7CisJCQlyZWxhdGlvblBhaXIuc2V0UmVxdWlyZW1lbnQocmVxTmFtZTIpOworCQkJcmVsYXRpb25QYWlyLnNldENhcGFiaWxpdHlVaWQoY2FwYWJpbHR5Mi5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudFVpZChyZXF1aXJlbWVudElkMik7CisJCQlyZWxhdGlvblBhaXIuc2V0Q2FwYWJpbGl0eU93bmVySWQocmVzSW5zdGFuY2VzLmdldCgxKS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudE93bmVySWQocmVzSW5zdGFuY2VzLmdldCgwKS5nZXRVbmlxdWVJZCgpKTsKKwkJCUVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UxID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuY29ubmVjdFJlc291cmNlc0luU2VydmljZShzZXJ2aWNlTmFtZSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc0luc3RhbmNlcy5nZXQoMCkuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCQlyZXNJbnN0YW5jZXMuZ2V0KDEpLmdldFVuaXF1ZUlkKCksIHJlbGF0aW9uUGFpcik7CisJCQlhc3NlcnRUcnVlKCJjaGVjayBhc3NvY2lhdGUgcmVzb3VyY2UgaW5zdGFuY2VzIHN1Y2NlZWQgIiArIHJlcU5hbWUyLCBjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlMS5pc0xlZnQoKSk7CisKKwkJCS8vIHJvbGxiYWNrQW5kUHJpbnQoKTsKKworCQkJUHJpbnRHcmFwaCBwcmludEdyYXBoID0gbmV3IFByaW50R3JhcGgoKTsKKwkJCVN0cmluZyB3ZWJHcmFwaCA9IHByaW50R3JhcGguYnVpbGRHcmFwaEZvcldlYmdyYXBoV2l6KHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKHdlYkdyYXBoKTsKKworCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcUNhcERlZiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJCXJlcUNhcERlZi5zZXRGcm9tTm9kZShyZXNJbnN0YW5jZXMuZ2V0KDApLmdldFVuaXF1ZUlkKCkpOworCQkJcmVxQ2FwRGVmLnNldFRvTm9kZShyZXNJbnN0YW5jZXMuZ2V0KDEpLmdldFVuaXF1ZUlkKCkpOworCisJCQlyZWxhdGlvblBhaXIuc2V0UmVxdWlyZW1lbnQocmVxTmFtZTEpOworCQkJcmVsYXRpb25QYWlyLnNldENhcGFiaWxpdHlVaWQoY2FwYWJpbHR5MS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudFVpZChyZXF1aXJlbWVudElkMSk7CisJCQlSZWxhdGlvbnNoaXBJbXBsIHJlbGF0aW9uc2hpcCA9IG5ldyBSZWxhdGlvbnNoaXBJbXBsKCk7CisJCQlyZWxhdGlvbnNoaXAuc2V0VHlwZShyZXFOYW1lMSk7CisJCQlyZWxhdGlvblBhaXIuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXApOworCisJCQlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJbGlzdC5hZGQocmVsYXRpb25QYWlyKTsKKwkJCXJlcUNhcERlZi5zZXRSZWxhdGlvbnNoaXBzKGxpc3QpOworCisJCQlkaXNjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlKHNlcnZpY2VOYW1lLCByZXFDYXBEZWYpOworCisJCQlyZXFDYXBEZWYuZ2V0UmVsYXRpb25zaGlwcygpLmNsZWFyKCk7CisKKwkJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvblBhaXIxID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcigpOworCQkJcmVsYXRpb25QYWlyMS5zZXRSZXF1aXJlbWVudChyZXFOYW1lMik7CisJCQlyZWxhdGlvblBhaXIxLnNldENhcGFiaWxpdHlVaWQoY2FwYWJpbHR5Mi5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uUGFpcjEuc2V0UmVxdWlyZW1lbnRVaWQocmVxdWlyZW1lbnRJZDIpOworCQkJcmVsYXRpb25QYWlyMS5zZXRDYXBhYmlsaXR5T3duZXJJZChyZXNJbnN0YW5jZXMuZ2V0KDEpLmdldFVuaXF1ZUlkKCkpOworCQkJcmVsYXRpb25QYWlyMS5zZXRSZXF1aXJlbWVudE93bmVySWQocmVzSW5zdGFuY2VzLmdldCgwKS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uc2hpcC5zZXRUeXBlKHJlcU5hbWUyKTsKKwkJCXJlbGF0aW9uUGFpcjEuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXApOworCQkJcmVxQ2FwRGVmLmdldFJlbGF0aW9uc2hpcHMoKS5hZGQocmVsYXRpb25QYWlyMSk7CisKKwkJCWRpc2Nvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2Uoc2VydmljZU5hbWUsIHJlcUNhcERlZik7CisKKwkJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZWxhdGlvbiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJCVN0cmluZyBmcm9tUmVzVWlkID0gcmVzSW5zdGFuY2VzLmdldCgwKS5nZXRVbmlxdWVJZCgpOworCQkJU3RyaW5nIHRvUmVzVWlkID0gcmVzSW5zdGFuY2VzLmdldCgxKS5nZXRVbmlxdWVJZCgpOworCQkJcmVsYXRpb24uc2V0RnJvbU5vZGUoZnJvbVJlc1VpZCk7CisJCQlyZWxhdGlvbi5zZXRUb05vZGUodG9SZXNVaWQpOworCQkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMgPSBuZXcgQXJyYXlMaXN0PFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcj4oKTsKKwkJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciBpbW11dGFibGVQYWlyMSA9IG5ldyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIocmVxTmFtZTEsIG51bGwpOworCQkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIGltbXV0YWJsZVBhaXIyID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcihyZXFOYW1lMiwgbnVsbCk7CisJCQlpbW11dGFibGVQYWlyMS5zZXRDYXBhYmlsaXR5VWlkKGNhcGFiaWx0eTEuZ2V0VW5pcXVlSWQoKSk7CisJCQlpbW11dGFibGVQYWlyMS5zZXRSZXF1aXJlbWVudFVpZChhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UxLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCQkJaW1tdXRhYmxlUGFpcjEuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJlc0luc3RhbmNlcy5nZXQoMCkuZ2V0VW5pcXVlSWQoKSk7CisJCQlpbW11dGFibGVQYWlyMS5zZXRDYXBhYmlsaXR5T3duZXJJZChyZXNJbnN0YW5jZXMuZ2V0KDEpLmdldFVuaXF1ZUlkKCkpOworCisJCQlpbW11dGFibGVQYWlyMi5zZXRDYXBhYmlsaXR5VWlkKGNhcGFiaWx0eTIuZ2V0VW5pcXVlSWQoKSk7CisJCQlpbW11dGFibGVQYWlyMi5zZXRSZXF1aXJlbWVudFVpZChhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UyLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCQkJaW1tdXRhYmxlUGFpcjIuc2V0UmVxdWlyZW1lbnRPd25lcklkKHJlc0luc3RhbmNlcy5nZXQoMCkuZ2V0VW5pcXVlSWQoKSk7CisJCQlpbW11dGFibGVQYWlyMi5zZXRDYXBhYmlsaXR5T3duZXJJZChyZXNJbnN0YW5jZXMuZ2V0KDEpLmdldFVuaXF1ZUlkKCkpOworCisJCQlyZWxhdGlvbnNoaXBzLmFkZChpbW11dGFibGVQYWlyMSk7CisJCQlyZWxhdGlvbnNoaXBzLmFkZChpbW11dGFibGVQYWlyMik7CisJCQlyZWxhdGlvbi5zZXRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcHMpOworCisJCQlFaXRoZXI8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKHNlcnZpY2VOYW1lLCBOb2RlVHlwZUVudW0uU2VydmljZSwgcmVsYXRpb24sIHRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmV0dXJuIGNvZGUgYWZ0ZXIgYXNzb2NpYXRpbmcgMiByZXF1aXJlbWVudHMgaW4gb25lIHJlcXVlc3QiLAorCQkJCQlhc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcy5pc0xlZnQoKSk7CisJCQlSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgY2FwYWJpbGl0eVJlbERlZiA9IGFzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzLmxlZnQoKS52YWx1ZSgpOworCQkJU3RyaW5nIGZyb21Ob2RlID0gY2FwYWJpbGl0eVJlbERlZi5nZXRGcm9tTm9kZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBmcm9tIG5vZGUiLCByZXNJbnN0YW5jZXMuZ2V0KDApLmdldFVuaXF1ZUlkKCksIGZyb21Ob2RlKTsKKwkJCVN0cmluZyB0b05vZGUgPSBjYXBhYmlsaXR5UmVsRGVmLmdldFRvTm9kZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayB0byBub2RlIiwgcmVzSW5zdGFuY2VzLmdldCgxKS5nZXRVbmlxdWVJZCgpLCB0b05vZGUpOworCQkJTGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+IHJlbGF0aW9uc2hpcHMyID0gY2FwYWJpbGl0eVJlbERlZi5nZXRSZWxhdGlvbnNoaXBzKCk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIG51bWJlciBvZiByZWxhdGlvbnMiLCAyLCByZWxhdGlvbnNoaXBzMi5zaXplKCkpOworCisJCQlmb3IgKFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciBwYWlyIDogcmVsYXRpb25zaGlwczIpIHsKKwkJCQlTdHJpbmcga2V5ID0gcGFpci5nZXRSZXF1aXJlbWVudCgpOworCQkJCVJlbGF0aW9uc2hpcEltcGwgcmVsYXRpb25zaGlwSW1wbCA9IHBhaXIuZ2V0UmVsYXRpb25zaGlwKCk7CisJCQkJaWYgKGtleS5lcXVhbHMocmVxTmFtZTEpKSB7CisJCQkJCVN0cmluZyB0eXBlID0gcmVsYXRpb25zaGlwSW1wbC5nZXRUeXBlKCk7CisJCQkJCWFzc2VydEVxdWFscygiQ2hlY2sgcmVsYXRpb25zaGlwIHR5cGUgbmFtZSIsIHJlcVJlbGF0aW9uc2hpcCwgdHlwZSk7CisJCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKHJlcU5hbWUyKSkgeworCQkJCQlTdHJpbmcgdHlwZSA9IHJlbGF0aW9uc2hpcEltcGwuZ2V0VHlwZSgpOworCQkJCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlbGF0aW9uc2hpcCB0eXBlIG5hbWUiLCByZXFSZWxhdGlvbnNoaXAsIHR5cGUpOworCQkJCX0gZWxzZSB7CisJCQkJCWFzc2VydFRydWUoInJlcXVpcmVtZW50ICIgKyBrZXkgKyAiIHdhcyBub3QgZm91bmQgaW4gdGhlIG9yaWdpbmFsIHJlcXVlc3QiLCBmYWxzZSk7CisJCQkJfQorCQkJfQorCisJCQl2ZXJpZnlHZXRBbGxSZXNvdXJjZUluc3RhbmNlRnJvbVNlcnZpY2UocmVxTmFtZTEsIHJlcU5hbWUyLCBzZXJ2aWNlTmFtZSwgZnJvbVJlc1VpZCwgdG9SZXNVaWQpOworCisJCQlMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiByZXNvdXJjZXNQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VNZXRhZGF0YURhdGE+KCk7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kUmVzb3VyY2VzUGF0aFJlY3Vyc2l2ZWx5ID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkJLmZpbmRSZXNvdXJjZXNQYXRoUmVjdXJzaXZlbHkocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgcmVzb3VyY2VzUGF0aExpc3QpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXR1cm5lZCBzdGF0dXMiLCBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSywgZmluZFJlc291cmNlc1BhdGhSZWN1cnNpdmVseSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIGxpc3Qgc2l6ZSIsIDMsIHJlc291cmNlc1BhdGhMaXN0LnNpemUoKSk7CisKKwkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzIHZhbGlkYXRlVGhlVGFyZ2V0UmVzb3VyY2VJbnN0YW5jZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLnZhbGlkYXRlVGhlVGFyZ2V0UmVzb3VyY2VJbnN0YW5jZShNWV9SRVNPVVJDRSwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG5hbWUgaW4gdGhlIHBhdGgiLCBUaXRhbk9wZXJhdGlvblN0YXR1cy5PSywgdmFsaWRhdGVUaGVUYXJnZXRSZXNvdXJjZUluc3RhbmNlKTsKKwkJCXZhbGlkYXRlVGhlVGFyZ2V0UmVzb3VyY2VJbnN0YW5jZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLnZhbGlkYXRlVGhlVGFyZ2V0UmVzb3VyY2VJbnN0YW5jZShzb2Z0d2FyZUNvbXBOYW1lLCByZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2UgbmFtZSBpbiB0aGUgcGF0aCIsIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LLCB2YWxpZGF0ZVRoZVRhcmdldFJlc291cmNlSW5zdGFuY2UpOworCisJCQl2YWxpZGF0ZVRoZVRhcmdldFJlc291cmNlSW5zdGFuY2UgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS52YWxpZGF0ZVRoZVRhcmdldFJlc291cmNlSW5zdGFuY2Uoc29mdHdhcmVDb21wTmFtZSArICJTVEFNIiwgcmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIG5hbWUgbm90IGluIHRoZSBwYXRoIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuTUFUQ0hfTk9UX0ZPVU5ELAorCQkJCQl2YWxpZGF0ZVRoZVRhcmdldFJlc291cmNlSW5zdGFuY2UpOworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVJlc291cmNlSW5zdGFuY2UgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5kZWxldGVDb21wb25lbnRJbnN0YW5jZShOb2RlVHlwZUVudW0uU2VydmljZSwgc2VydmljZU5hbWUsIHRvUmVzVWlkLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHJlc291cmNlIGluc3RhbmNlIHdhcyBkZWxldGVkLiIsIGRlbGV0ZVJlc291cmNlSW5zdGFuY2UuaXNMZWZ0KCkpOworCisJCX0gZmluYWxseSB7CisJCQlyb2xsYmFja0FuZFByaW50KGZhbHNlKTsKKwkJCWNvbXBhcmVHcmFwaFNpemUobnVtYmVyT2ZWZXJ0aWNlcyk7CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlHZXRBbGxSZXNvdXJjZUluc3RhbmNlRnJvbVNlcnZpY2UoU3RyaW5nIHJlcU5hbWUxLCBTdHJpbmcgcmVxTmFtZTIsIFN0cmluZyBzZXJ2aWNlTmFtZSwKKwkJCVN0cmluZyBmcm9tUmVzVWlkLCBTdHJpbmcgdG9SZXNVaWQpIHsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWxsUmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJLmdldEFsbENvbXBvbmVudEluc3RhbmNlcyhzZXJ2aWNlTmFtZSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgdHJ1ZSk7CisJCS8vIGFzc2VydFRydWUoImNoZWNrIHJldHVybiBjb2RlIGFmdGVyIGdldCBhbGwgcmVzb3VyY2UgaW5zdGFuY2VzIiwKKwkJLy8gYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMuaXNMZWZ0KCkpOworCQlJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+IGltbXV0YWJsZVBhaXIgPSBhbGxSZXNvdXJjZUluc3RhbmNlcworCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gbm9kZXMgPSBpbW11dGFibGVQYWlyLmdldEtleSgpOworCQlMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4gZWRnZXMgPSBpbW11dGFibGVQYWlyLmdldFZhbHVlKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgMiBub2RlcyByZXR1cm5lZCIsIDIsIG5vZGVzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgb25lIHJlbGF0aW9uIHJldHVybmVkIiwgMSwgZWRnZXMuc2l6ZSgpKTsKKwkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiA9IGVkZ2VzLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBmcm9tIG5vZGUiLCByZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYuZ2V0RnJvbU5vZGUoKSwgZnJvbVJlc1VpZCk7CisJCXJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZi5nZXRUb05vZGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB0byBub2RlIiwgcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLmdldFRvTm9kZSgpLCB0b1Jlc1VpZCk7CisJCWludCBzaXplID0gcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLmdldFJlbGF0aW9uc2hpcHMoKS5zaXplKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgbnVtYmVyIG9mIHJlbGF0aW9ucyIsIDIsIHNpemUpOworCQlTdHJpbmcgcmVxMSA9IHJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZi5nZXRSZWxhdGlvbnNoaXBzKCkuZ2V0KDApLmdldFJlcXVpcmVtZW50KCk7CisJCVN0cmluZyByZXEyID0gcmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmLmdldFJlbGF0aW9uc2hpcHMoKS5nZXQoMSkuZ2V0UmVxdWlyZW1lbnQoKTsKKworCQlMaXN0PFN0cmluZz4gcmVxdWlyZW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJlcXVpcmVtZW50cy5hZGQocmVxMSk7CisJCXJlcXVpcmVtZW50cy5hZGQocmVxMik7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVxdWlyZW1lbnQgcmV0dXJuZWQgIiArIHJlcU5hbWUxLCByZXF1aXJlbWVudHMuY29udGFpbnMocmVxTmFtZTEpKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVxdWlyZW1lbnQgcmV0dXJuZWQgIiArIHJlcU5hbWUyLCByZXF1aXJlbWVudHMuY29udGFpbnMocmVxTmFtZTIpKTsKKworCQlTdHJpbmcgbm9kZXNTdHIgPSBwcmV0dHlHc29uLnRvSnNvbihub2Rlcyk7CisJCVN0cmluZyBlZGdlc1N0ciA9IHByZXR0eUdzb24udG9Kc29uKGVkZ2VzKTsKKworCQlsb2cuZGVidWcobm9kZXNTdHIpOworCQlsb2cuZGVidWcoZWRnZXNTdHIpOworCX0KKworCXByaXZhdGUgRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlKFN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUxLAorCQkJU3RyaW5nIHJlcU5hbWUxLCBTdHJpbmcgcmVxTm9kZU5hbWUsIFN0cmluZyByZXFSZWxhdGlvbnNoaXAsIFJlc291cmNlIHNvZnR3YXJlQ29tcG9uZW50KSB7CisJCVJlcXVpcmVtZW50RGVmaW5pdGlvbiByZXFEZWZpbml0aW9uMSA9IG5ldyBSZXF1aXJlbWVudERlZmluaXRpb24oKTsKKwkJcmVxRGVmaW5pdGlvbjEuc2V0Tm9kZShyZXFOb2RlTmFtZSk7CisJCXJlcURlZmluaXRpb24xLnNldFJlbGF0aW9uc2hpcChyZXFSZWxhdGlvbnNoaXApOworCQlyZXFEZWZpbml0aW9uMS5zZXRDYXBhYmlsaXR5KGNhcGFiaWxpdHlUeXBlTmFtZTEpOworCQkvLyBhZGQgcmVxdWlyZW1lbnQgdG8gc29mdHdhcmUgY29tcG9uZW50CisJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSA9IHJlcXVpcmVtZW50T3BlcmF0aW9uCisJCQkJLmFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZShyZXFOYW1lMSwgcmVxRGVmaW5pdGlvbjEsIHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCksIHRydWUpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlcXVpcmVtZW50IHdhcyBhZGRlZCIsIHRydWUsIGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZS5pc0xlZnQoKSk7CisJCXJldHVybiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2U7CisJfQorCisJcHJpdmF0ZSBDYXBhYmlsaXR5RGVmaW5pdGlvbiBhZGRDYXBhYmlsaXR5VG9SZXNvdXJjZShTdHJpbmcgY2FwYWJpbGl0eVR5cGVOYW1lMSwgU3RyaW5nIHJlcU5hbWUxLAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCkgeworCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbjEgPSBuZXcgQ2FwYWJpbGl0eURlZmluaXRpb24oKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24xLnNldERlc2NyaXB0aW9uKCJteSBjYXBhYmlsaXR5Iik7CisJCWNhcGFiaWxpdHlEZWZpbml0aW9uMS5zZXRUeXBlKGNhcGFiaWxpdHlUeXBlTmFtZTEpOworCQlMaXN0PFN0cmluZz4gdmFsaWRTb3VyY2VUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl2YWxpZFNvdXJjZVR5cGVzLmFkZCgidG9zY2Eubm9kZXMuU0MiKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24xLnNldFZhbGlkU291cmNlVHlwZXModmFsaWRTb3VyY2VUeXBlcyk7CisJCUVpdGhlcjxDYXBhYmlsaXR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkQ2FwYWJpbGl0eSA9IGNhcGFiaWxpdHlPcGVyYXRpb24KKwkJCQkuYWRkQ2FwYWJpbGl0eShjb21wdXRlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCksIHJlcU5hbWUxLCBjYXBhYmlsaXR5RGVmaW5pdGlvbjEsIHRydWUpOworCQlhc3NlcnRUcnVlKCJjaGVjayBjYXBhYmlsaXR5IGNyZWF0ZWQgIiwgYWRkQ2FwYWJpbGl0eS5pc0xlZnQoKSk7CisJCXJldHVybiBhZGRDYXBhYmlsaXR5LmxlZnQoKS52YWx1ZSgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbm5lY3RSZXNvdXJjZUluc3RhbmNlc0NhcGFiaWxpdHlOYW1lRGlmZkZyb21SZXFOYW1lKCkgeworCisJCVByaW50R3JhcGggcHJpbnRHcmFwaDEgPSBuZXcgUHJpbnRHcmFwaCgpOworCQlpbnQgbnVtYmVyT2ZWZXJ0aWNlcyA9IHByaW50R3JhcGgxLmdldE51bWJlck9mVmVydGljZXModGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJdHJ5IHsKKworCQkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlTmFtZSA9IENBUEFCSUxJVFlfMjsKKwkJCVN0cmluZyByZXFOYW1lID0gImhvc3QiOworCQkJU3RyaW5nIHJlcU5vZGVOYW1lID0gInRvc2NhLm5vZGVzLkNvbXB1dGUyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHNvZnR3YXJlQ29tcE5hbWUgPSAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIGNvbXB1dGVOb2RlTmFtZSA9IHJlcU5vZGVOYW1lOworCQkJU3RyaW5nIG15UmVzb3VyY2VWZXJzaW9uID0gIjQuMCIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyByZXFSZWxhdGlvbnNoaXAgPSAibXlyZWxhdGlvbnNoaXAiOworCisJCQlTdHJpbmcgRElGRkVSRU5UX0NBUEFCSUxJVFkgPSAiaG9zdERpZmZlcm5ldCI7CisKKwkJCS8vIENyZWF0ZSBDYXBhYmlsaXR5IHR5cGUKKwkJCUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QgPSBuZXcgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0KCk7CisJCQljYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24pOworCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNyZWF0ZUNhcGFiaWxpdHlEZWYgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwKKwkJCQkJdHJ1ZSwgdHJ1ZSk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbHR5ID0gYWRkQ2FwYWJpbGl0eVRvUmVzb3VyY2UoY2FwYWJpbGl0eVR5cGVOYW1lLCBESUZGRVJFTlRfQ0FQQUJJTElUWSwKKwkJCQkJY29tcHV0ZUNvbXBvbmVudCk7CisKKwkJCS8vIGNyZWF0ZSByZXF1aXJlbWVudCBkZWZpbml0aW9uCisKKwkJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSA9IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSgKKwkJCQkJY2FwYWJpbGl0eVR5cGVOYW1lLCByZXFOYW1lLCByZXFOb2RlTmFtZSwgcmVxUmVsYXRpb25zaGlwLCBzb2Z0d2FyZUNvbXBvbmVudCk7CisKKwkJCVN0cmluZyBwYXJlbnRSZXFVbmlxSWQgPSBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKworCQkJLy8gY3JlYXRlIG15IHJlc291cmNlIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb21wb25lbnQKKwkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsICJteS1yZXNvdXJjZSIsCisJCQkJCW15UmVzb3VyY2VWZXJzaW9uLCBzb2Z0d2FyZUNvbXBvbmVudC5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlTdHJpbmcgc2VydmljZU5hbWUgPSAibXlzZXJ2aWNlLjEuMCI7CisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNJbnN0YW5jZXMgPSBidWlsZFNlcnZpY2VBbmRDb25uZWN0QmV0d2VlblJlc291cmNlSW5zdGFuY2VzKHNlcnZpY2VOYW1lLCByZXNvdXJjZSwKKwkJCQkJY29tcHV0ZUNvbXBvbmVudCwgImhvc3QiLCBmYWxzZSwgY2FwYWJpbHR5LmdldFVuaXF1ZUlkKCksIHBhcmVudFJlcVVuaXFJZCk7CisKKwkJCVByaW50R3JhcGggcHJpbnRHcmFwaCA9IG5ldyBQcmludEdyYXBoKCk7CisJCQlTdHJpbmcgd2ViR3JhcGggPSBwcmludEdyYXBoLmJ1aWxkR3JhcGhGb3JXZWJncmFwaFdpeih0aXRhbkRhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpKTsKKwkJCS8vIGxvZy5kZWJ1Zyh3ZWJHcmFwaCk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXJvbGxiYWNrQW5kUHJpbnQoKTsKKworCQkJY29tcGFyZUdyYXBoU2l6ZShudW1iZXJPZlZlcnRpY2VzKTsKKwkJfQorCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdFJlc291cmNlSW5zdGFuY2VzSW52YWxpZENhcGFiaWxpdHkoKSB7CisKKwkJUHJpbnRHcmFwaCBwcmludEdyYXBoMSA9IG5ldyBQcmludEdyYXBoKCk7CisJCWludCBudW1iZXJPZlZlcnRpY2VzID0gcHJpbnRHcmFwaDEuZ2V0TnVtYmVyT2ZWZXJ0aWNlcyh0aXRhbkRhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpKTsKKworCQl0cnkgeworCisJCQlTdHJpbmcgY2FwYWJpbGl0eVR5cGVOYW1lID0gQ0FQQUJJTElUWV8yOworCQkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCQlTdHJpbmcgcmVxTm9kZU5hbWUgPSAidG9zY2Eubm9kZXMuQ29tcHV0ZTIiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgcm9vdE5hbWUgPSAiUm9vdDIiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgc29mdHdhcmVDb21wTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudDIiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgY29tcHV0ZU5vZGVOYW1lID0gcmVxTm9kZU5hbWU7CisJCQlTdHJpbmcgbXlSZXNvdXJjZVZlcnNpb24gPSAiNC4wIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHJlcVJlbGF0aW9uc2hpcCA9ICJteXJlbGF0aW9uc2hpcCI7CisKKwkJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWVPdGhlciA9IENBUEFCSUxJVFlfMiArICJvdGhlcnR5cGUiOworCisJCQlTdHJpbmcgRElGRkVSRU5UX0NBUEFCSUxJVFkgPSAiaG9zdERpZmZlcm5ldCI7CisKKwkJCS8vIENyZWF0ZSBDYXBhYmlsaXR5IHR5cGUKKwkJCUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QgPSBuZXcgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0KCk7CisJCQljYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24pOworCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNyZWF0ZUNhcGFiaWxpdHlEZWYgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNyZWF0ZUNhcGFiaWxpdHlEZWYyID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0CisJCQkJCS5jcmVhdGVDYXBhYmlsaXR5KGNhcGFiaWxpdHlUeXBlTmFtZU90aGVyKTsKKworCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwKKwkJCQkJdHJ1ZSwgdHJ1ZSk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJYWRkQ2FwYWJpbGl0eVRvUmVzb3VyY2UoY2FwYWJpbGl0eVR5cGVOYW1lLCBESUZGRVJFTlRfQ0FQQUJJTElUWSwgY29tcHV0ZUNvbXBvbmVudCk7CisKKwkJCS8vIGNyZWF0ZSByZXF1aXJlbWVudCBkZWZpbml0aW9uCisKKwkJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSA9IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSgKKwkJCQkJY2FwYWJpbGl0eVR5cGVOYW1lT3RoZXIsIHJlcU5hbWUsIHJlcU5vZGVOYW1lLCByZXFSZWxhdGlvbnNoaXAsIHNvZnR3YXJlQ29tcG9uZW50KTsKKworCQkJU3RyaW5nIHBhcmVudFJlcVVuaXFJZCA9IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCisJCQkvLyBjcmVhdGUgbXkgcmVzb3VyY2UgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgIm15LXJlc291cmNlIiwKKwkJCQkJbXlSZXNvdXJjZVZlcnNpb24sIHNvZnR3YXJlQ29tcG9uZW50LmdldE5hbWUoKSwgdHJ1ZSwgdHJ1ZSk7CisKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJteXNlcnZpY2UuMS4wIjsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc0luc3RhbmNlcyA9IGJ1aWxkU2VydmljZUFuZENvbm5lY3RCZXR3ZWVuUmVzb3VyY2VJbnN0YW5jZXNXaXRoRXJyb3Ioc2VydmljZU5hbWUsCisJCQkJCXJlc291cmNlLCBjb21wdXRlQ29tcG9uZW50LCAiaG9zdCIsIGZhbHNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKworCQkJUHJpbnRHcmFwaCBwcmludEdyYXBoID0gbmV3IFByaW50R3JhcGgoKTsKKwkJCVN0cmluZyB3ZWJHcmFwaCA9IHByaW50R3JhcGguYnVpbGRHcmFwaEZvcldlYmdyYXBoV2l6KHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKHdlYkdyYXBoKTsKKworCQl9IGZpbmFsbHkgeworCQkJcm9sbGJhY2tBbmRQcmludCgpOworCisJCQljb21wYXJlR3JhcGhTaXplKG51bWJlck9mVmVydGljZXMpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgY29tcGFyZUdyYXBoU2l6ZShpbnQgbnVtYmVyT2ZWZXJ0aWNlcywgU2V0PFN0cmluZz4gdG9SZW1vdmVGcm9tU2V0KSB7CisJCVByaW50R3JhcGggcHJpbnRHcmFwaDIgPSBuZXcgUHJpbnRHcmFwaCgpOworCQlpbnQgbnVtYmVyT2ZWZXJ0aWNlc0N1cnIgPSBwcmludEdyYXBoMi5nZXROdW1iZXJPZlZlcnRpY2VzKHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCisJCVNldDxTdHJpbmc+IHNldCA9IHByaW50R3JhcGgyLmdldFZlcnRpY2VzU2V0KHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCQlpZiAodG9SZW1vdmVGcm9tU2V0ICE9IG51bGwpIHsKKwkJCXNldC5yZW1vdmVBbGwodG9SZW1vdmVGcm9tU2V0KTsKKwkJfQorCisJCWFzc2VydEVxdWFscygiY2hlY2sgYWxsIGRhdGEgZGVsZXRlZCBmcm9tIGdyYXBoICIgKyBzZXQsIG51bWJlck9mVmVydGljZXMsIG51bWJlck9mVmVydGljZXNDdXJyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29tcGFyZUdyYXBoU2l6ZShpbnQgbnVtYmVyT2ZWZXJ0aWNlcykgeworCQlQcmludEdyYXBoIHByaW50R3JhcGgyID0gbmV3IFByaW50R3JhcGgoKTsKKwkJaW50IG51bWJlck9mVmVydGljZXNDdXJyID0gcHJpbnRHcmFwaDIuZ2V0TnVtYmVyT2ZWZXJ0aWNlcyh0aXRhbkRhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoCisJCQkJImNoZWNrIGFsbCBkYXRhIGRlbGV0ZWQgZnJvbSBncmFwaCAiICsgcHJpbnRHcmFwaDIuZ2V0VmVydGljZXNTZXQodGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSksCisJCQkJbnVtYmVyT2ZWZXJ0aWNlcywgbnVtYmVyT2ZWZXJ0aWNlc0N1cnIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbm5lY3RSZXNvdXJjZUluc3RhbmNlc1JlcXVpcmVtZW50Tm90Rm91bmQoKSB7CisKKwkJUHJpbnRHcmFwaCBwcmludEdyYXBoMSA9IG5ldyBQcmludEdyYXBoKCk7CisJCWludCBudW1iZXJPZlZlcnRpY2VzID0gcHJpbnRHcmFwaDEuZ2V0TnVtYmVyT2ZWZXJ0aWNlcyh0aXRhbkRhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpKTsKKwkJdHJ5IHsKKworCQkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlTmFtZSA9IENBUEFCSUxJVFlfMjsKKwkJCVN0cmluZyByZXFOYW1lID0gImhvc3QiOworCQkJU3RyaW5nIHJlcU5vZGVOYW1lID0gInRvc2NhLm5vZGVzLkNvbXB1dGUyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHNvZnR3YXJlQ29tcE5hbWUgPSAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQyIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIGNvbXB1dGVOb2RlTmFtZSA9IHJlcU5vZGVOYW1lOworCQkJU3RyaW5nIG15UmVzb3VyY2VWZXJzaW9uID0gIjQuMCIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyByZXFSZWxhdGlvbnNoaXAgPSAibXlyZWxhdGlvbnNoaXAiOworCisJCQlTdHJpbmcgRElGRkVSRU5UX0NBUEFCSUxJVFkgPSAiaG9zdERpZmZlcm5ldCI7CisKKwkJCS8vIENyZWF0ZSBDYXBhYmlsaXR5IHR5cGUKKwkJCUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QgPSBuZXcgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0KCk7CisJCQljYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24pOworCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNyZWF0ZUNhcGFiaWxpdHlEZWYgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwKKwkJCQkJdHJ1ZSwgdHJ1ZSk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJYWRkQ2FwYWJpbGl0eVRvUmVzb3VyY2UoY2FwYWJpbGl0eVR5cGVOYW1lLCByZXFOYW1lLCBjb21wdXRlQ29tcG9uZW50KTsKKworCQkJLy8gY3JlYXRlIHJlcXVpcmVtZW50IGRlZmluaXRpb24KKworCQkJUmVxdWlyZW1lbnREZWZpbml0aW9uIHJlcURlZmluaXRpb24gPSBuZXcgUmVxdWlyZW1lbnREZWZpbml0aW9uKCk7CisJCQlyZXFEZWZpbml0aW9uLnNldE5vZGUocmVxTm9kZU5hbWUpOworCQkJcmVxRGVmaW5pdGlvbi5zZXRSZWxhdGlvbnNoaXAocmVxUmVsYXRpb25zaGlwKTsKKwkJCXJlcURlZmluaXRpb24uc2V0Q2FwYWJpbGl0eShjYXBhYmlsaXR5VHlwZU5hbWUpOworCQkJLy8gYWRkIHJlcXVpcmVtZW50IHRvIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJRWl0aGVyPFJlcXVpcmVtZW50RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlID0gcmVxdWlyZW1lbnRPcGVyYXRpb24KKwkJCQkJLmFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZShyZXFOYW1lICsgInNzc3Nzc3NzIiwgcmVxRGVmaW5pdGlvbiwgc29mdHdhcmVDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCQl0cnVlKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgcmVxdWlyZW1lbnQgd2FzIGFkZGVkIiwgdHJ1ZSwgYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlLmlzTGVmdCgpKTsKKworCQkJU3RyaW5nIHBhcmVudFJlcVVuaXFJZCA9IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCisJCQkvLyBjcmVhdGUgbXkgcmVzb3VyY2UgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgIm15LXJlc291cmNlIiwKKwkJCQkJbXlSZXNvdXJjZVZlcnNpb24sIHNvZnR3YXJlQ29tcG9uZW50LmdldE5hbWUoKSwgdHJ1ZSwgdHJ1ZSk7CisKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJteXNlcnZpY2UuMS4wIjsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc0luc3RhbmNlcyA9IGJ1aWxkU2VydmljZUFuZENvbm5lY3RCZXR3ZWVuUmVzb3VyY2VJbnN0YW5jZXNXaXRoRXJyb3Ioc2VydmljZU5hbWUsCisJCQkJCXJlc291cmNlLCBjb21wdXRlQ29tcG9uZW50LCAiaG9zdCIsIGZhbHNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cy5JTExFR0FMX0FSR1VNRU5UKTsKKworCQkJUHJpbnRHcmFwaCBwcmludEdyYXBoID0gbmV3IFByaW50R3JhcGgoKTsKKwkJCVN0cmluZyB3ZWJHcmFwaCA9IHByaW50R3JhcGguYnVpbGRHcmFwaEZvcldlYmdyYXBoV2l6KHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCQkJbG9nLmRlYnVnKHdlYkdyYXBoKTsKKworCQl9IGZpbmFsbHkgeworCQkJdGl0YW5EYW8ucm9sbGJhY2soKTsKKworCQkJY29tcGFyZUdyYXBoU2l6ZShudW1iZXJPZlZlcnRpY2VzKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lLCBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYgcmVxQ2FwRGVmKSB7CisKKwkJRWl0aGVyPExpc3Q8UmVsYXRpb25zaGlwSW5zdERhdGE+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZShzZXJ2aWNlTmFtZSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlcUNhcERlZik7CisJCWFzc2VydFRydWUoImNoZWNrIHJlbGF0aW9zaGlwIGluc3RhbmNlIHdhcyBkZWxldGVkIiwgZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZS5pc0xlZnQoKSk7CisKKwkJZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24uZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZShzZXJ2aWNlTmFtZSwKKwkJCQlOb2RlVHlwZUVudW0uU2VydmljZSwgcmVxQ2FwRGVmKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVsYXRpb3NoaXAgaW5zdGFuY2UgYWxyZWFkeSB3YXMgZGVsZXRlZCIsIGRpc2Nvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UuaXNSaWdodCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZWxhdGlvc2hpcCBpbnN0YW5jZSBhbHJlYWR5IHdhcyBkZWxldGVkLiBzdGF0dXMgTk9UX0ZPVU5EIiwgVGl0YW5PcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELAorCQkJCWRpc2Nvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UucmlnaHQoKS52YWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IGJ1aWxkU2VydmljZUFuZENvbm5lY3RCZXR3ZWVuUmVzb3VyY2VJbnN0YW5jZXNXaXRoRXJyb3IoU3RyaW5nIHNlcnZpY2VOYW1lLAorCQkJUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlIGNvbXB1dGVDb21wb25lbnQsIFN0cmluZyByZXF1aXJlbWVudCwgYm9vbGVhbiBpZ25vcmVDcmVhdGluZ1NlcnZpY2UsCisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyB0aXRhbk9wZXJhdGlvblN0YXR1cykgeworCisJCVN0cmluZyBzZXJ2aWNlSWQgPSAibXlzZXJ2aWNlLjEuMCI7CisKKwkJaWYgKGZhbHNlID09IGlnbm9yZUNyZWF0aW5nU2VydmljZSkgeworCQkJU2VydmljZU1ldGFkYXRhRGF0YSBjcmVhdGVTZXJ2aWNlID0gY3JlYXRlU2VydmljZShzZXJ2aWNlSWQpOworCQl9CisJCUNvbXBvbmVudEluc3RhbmNlIG15cmVzb3VyY2VJbnN0YW5jZSA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCAiMSIsIHJlc291cmNlLmdldE5hbWUoKSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcHV0ZUluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKGNvbXB1dGVDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgIjIiLAorCQkJCWNvbXB1dGVDb21wb25lbnQuZ2V0TmFtZSgpKTsKKworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBteWluc3RhbmNlUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsICIxIiwgdHJ1ZSwKKwkJCQkJCW15cmVzb3VyY2VJbnN0YW5jZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIGFkZGVkIHRvIHNlcnZpY2UiLCBteWluc3RhbmNlUmVzLmlzTGVmdCgpKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgdmFsdWUxID0gbXlpbnN0YW5jZVJlcy5sZWZ0KCkudmFsdWUoKTsKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29tcHV0ZUluc3RUZXMgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSwgIjIiLCB0cnVlLCBjb21wdXRlSW5zdGFuY2UsCisJCQkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgaW5zdGFuY2UgYWRkZWQgdG8gc2VydmljZSIsIGNvbXB1dGVJbnN0VGVzLmlzTGVmdCgpKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgdmFsdWUyID0gY29tcHV0ZUluc3RUZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyIHJlbGF0aW9uUGFpciA9IG5ldyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIoKTsKKwkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50KHJlcXVpcmVtZW50KTsKKworCQlFaXRoZXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5jb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlKHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHZhbHVlMS5nZXRVbmlxdWVJZCgpLCB2YWx1ZTIuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCXJlbGF0aW9uUGFpcik7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVsYXRpb24gd2FzIG5vdCBjcmVhdGVkIiwgY29ubmVjdFJlc291cmNlc0luU2VydmljZS5pc1JpZ2h0KCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGVycm9yIGNvZGUgYWZ0ZXIgY29ubmVjdCByZXNvdXJjZSBpbnN0YW5jZXMgZmFpbGVkIiwgdGl0YW5PcGVyYXRpb25TdGF0dXMsCisJCQkJY29ubmVjdFJlc291cmNlc0luU2VydmljZS5yaWdodCgpLnZhbHVlKCkpOworCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc0luc3RhbmNlcyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+KCk7CisJCXJlc0luc3RhbmNlcy5hZGQodmFsdWUxKTsKKworCQlyZXR1cm4gcmVzSW5zdGFuY2VzOworCisJfQorCisJcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluc3RhbmNlPiBidWlsZFNlcnZpY2VBbmRDb25uZWN0QmV0d2VlblJlc291cmNlSW5zdGFuY2VzKFN0cmluZyBzZXJ2aWNlTmFtZSwKKwkJCVJlc291cmNlIHJlc291cmNlLCBSZXNvdXJjZSBjb21wdXRlQ29tcG9uZW50LCBTdHJpbmcgcmVxdWlyZW1lbnQsIGJvb2xlYW4gaWdub3JlQ3JlYXRpbmdTZXJ2aWNlLAorCQkJU3RyaW5nIGNhcGFiaWxpdHlJZCwgU3RyaW5nIHJlcXVpcmVtZW50SWQpIHsKKworCQlTdHJpbmcgc2VydmljZUlkID0gIm15c2VydmljZS4xLjAiOworCisJCWlmIChmYWxzZSA9PSBpZ25vcmVDcmVhdGluZ1NlcnZpY2UpIHsKKwkJCVNlcnZpY2VNZXRhZGF0YURhdGEgY3JlYXRlU2VydmljZSA9IGNyZWF0ZVNlcnZpY2Uoc2VydmljZUlkKTsKKwkJfQorCQlDb21wb25lbnRJbnN0YW5jZSBteXJlc291cmNlSW5zdGFuY2UgPSBidWlsZFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgIjEiLCByZXNvdXJjZS5nZXROYW1lKCkpOworCisJCUNvbXBvbmVudEluc3RhbmNlIGNvbXB1dGVJbnN0YW5jZSA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZShjb21wdXRlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCksICIyIiwKKwkJCQljb21wdXRlQ29tcG9uZW50LmdldE5hbWUoKSk7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbXlpbnN0YW5jZVJlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMSIsIHRydWUsCisJCQkJCQlteXJlc291cmNlSW5zdGFuY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCQlhc3NlcnRUcnVlKCJjaGVjayBpbnN0YW5jZSBhZGRlZCB0byBzZXJ2aWNlIiwgbXlpbnN0YW5jZVJlcy5pc0xlZnQoKSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHZhbHVlMSA9IG15aW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXB1dGVJbnN0VGVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsICIyIiwgdHJ1ZSwgY29tcHV0ZUluc3RhbmNlLAorCQkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIGFkZGVkIHRvIHNlcnZpY2UiLCBjb21wdXRlSW5zdFRlcy5pc0xlZnQoKSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHZhbHVlMiA9IGNvbXB1dGVJbnN0VGVzLmxlZnQoKS52YWx1ZSgpOworCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgcmVsYXRpb25QYWlyID0gbmV3IFJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpcigpOworCQlyZWxhdGlvblBhaXIuc2V0UmVxdWlyZW1lbnQocmVxdWlyZW1lbnQpOworCisJCXJlbGF0aW9uUGFpci5zZXRDYXBhYmlsaXR5VWlkKGNhcGFiaWxpdHlJZCk7CisJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudFVpZChyZXF1aXJlbWVudElkKTsKKwkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50T3duZXJJZCh2YWx1ZTEuZ2V0VW5pcXVlSWQoKSk7CisJCXJlbGF0aW9uUGFpci5zZXRDYXBhYmlsaXR5T3duZXJJZCh2YWx1ZTIuZ2V0VW5pcXVlSWQoKSk7CisKKwkJRWl0aGVyPFJlbGF0aW9uc2hpcEluc3REYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29ubmVjdFJlc291cmNlc0luU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuY29ubmVjdFJlc291cmNlc0luU2VydmljZShzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCB2YWx1ZTEuZ2V0VW5pcXVlSWQoKSwgdmFsdWUyLmdldFVuaXF1ZUlkKCksCisJCQkJCQlyZWxhdGlvblBhaXIpOworCisJCWFzc2VydFRydWUoImNoZWNrIHJlbGF0aW9uIGNyZWF0ZWQiLCBjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlLmlzTGVmdCgpKTsKKworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNJbnN0YW5jZXMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluc3RhbmNlPigpOworCQlyZXNJbnN0YW5jZXMuYWRkKHZhbHVlMSk7CisJCXJlc0luc3RhbmNlcy5hZGQodmFsdWUyKTsKKworCQlyZXR1cm4gcmVzSW5zdGFuY2VzOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBnZXRBbGxSZXNvdXJjZUluc3RhbmNlc1RocmVlKCkgeworCisJCVByaW50R3JhcGggcHJpbnRHcmFwaDEgPSBuZXcgUHJpbnRHcmFwaCgpOworCQlpbnQgbnVtYmVyT2ZWZXJ0aWNlcyA9IHByaW50R3JhcGgxLmdldE51bWJlck9mVmVydGljZXModGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisJCXRyeSB7CisKKwkJCVNldDxTdHJpbmc+IHZlcnRleFNldEJlZm9yZU1ldGhvZCA9IHByaW50R3JhcGgxLmdldFZlcnRpY2VzU2V0KHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCisJCQlTdHJpbmcgY2FwYWJpbGl0eVR5cGVOYW1lID0gQ0FQQUJJTElUWV8yOworCQkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCQlTdHJpbmcgcmVxTm9kZU5hbWUgPSAidG9zY2Eubm9kZXMuQ29tcHV0ZTIiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgcm9vdE5hbWUgPSAiUm9vdDIiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgc29mdHdhcmVDb21wTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudDIiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgY29tcHV0ZU5vZGVOYW1lID0gcmVxTm9kZU5hbWU7CisJCQlTdHJpbmcgbXlSZXNvdXJjZVZlcnNpb24gPSAiNC4wIiArIFRFU1RfQ0xBU1NfTlVNQkVSOworCQkJU3RyaW5nIHJlcVJlbGF0aW9uc2hpcCA9ICJteXJlbGF0aW9uc2hpcCI7CisKKwkJCS8vIENyZWF0ZSBDYXBhYmlsaXR5IHR5cGUKKwkJCUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QgPSBuZXcgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0KCk7CisJCQljYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24pOworCQkJQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uIGNyZWF0ZUNhcGFiaWxpdHlEZWYgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwKKwkJCQkJdHJ1ZSwgdHJ1ZSk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCisJCQkvLyBBZGQgY2FwYWJpbGl0aWVzIHRvIENvbXB1dGUgUmVzb3VyY2UKKwkJCUNhcGFiaWxpdHlEZWZpbml0aW9uIGNhcGFiaWxpdHkgPSBhZGRDYXBhYmlsaXR5VG9SZXNvdXJjZShjYXBhYmlsaXR5VHlwZU5hbWUsICJob3N0IiwgY29tcHV0ZUNvbXBvbmVudCk7CisKKwkJCS8vIGNyZWF0ZSByZXF1aXJlbWVudCBkZWZpbml0aW9uCisKKwkJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSA9IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSgKKwkJCQkJY2FwYWJpbGl0eVR5cGVOYW1lLCByZXFOYW1lLCByZXFOb2RlTmFtZSwgcmVxUmVsYXRpb25zaGlwLCBzb2Z0d2FyZUNvbXBvbmVudCk7CisKKwkJCVN0cmluZyBwYXJlbnRSZXFVbmlxSWQgPSBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKworCQkJLy8gY3JlYXRlIG15IHJlc291cmNlIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb21wb25lbnQKKwkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsICJteS1yZXNvdXJjZSIsCisJCQkJCW15UmVzb3VyY2VWZXJzaW9uLCBzb2Z0d2FyZUNvbXBvbmVudC5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlTdHJpbmcgc2VydmljZUlkID0gIm15c2VydmljZS4xLjAiOworCisJCQlTZXJ2aWNlTWV0YWRhdGFEYXRhIGNyZWF0ZVNlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlKHNlcnZpY2VJZCk7CisKKwkJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhbGxSZXNvdXJjZUluc3RhbmNlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmdldEFsbENvbXBvbmVudEluc3RhbmNlcyhzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgTk9UX0ZPVU5EIGlzIHJldHVybmVkIiwgYWxsUmVzb3VyY2VJbnN0YW5jZXMuaXNSaWdodCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgTk9UX0ZPVU5EIGlzIHJldHVybmVkIiwgYWxsUmVzb3VyY2VJbnN0YW5jZXMucmlnaHQoKS52YWx1ZSgpLAorCQkJCQlTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCk7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIG15cmVzb3VyY2VJbnN0YW5jZSA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCAiMSIsICJteS1yZXNvdXJjZSIpOworCQkJbXlyZXNvdXJjZUluc3RhbmNlLnNldE5hbWUoIm15LXJlc291cmNlIik7CisKKwkJCUNvbXBvbmVudEluc3RhbmNlIGNvbXB1dGVJbnN0YW5jZTEgPSBidWlsZFJlc291cmNlSW5zdGFuY2UoY29tcHV0ZUNvbXBvbmVudC5nZXRVbmlxdWVJZCgpLCAiMiIsCisJCQkJCSJ0b3NjYS5ub2Rlcy5Db21wdXRlMiIpOworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBteWluc3RhbmNlUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMSIsIHRydWUsCisJCQkJCQkJbXlyZXNvdXJjZUluc3RhbmNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIGFkZGVkIHRvIHNlcnZpY2UiLCBteWluc3RhbmNlUmVzLmlzTGVmdCgpKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlIHZhbHVlMSA9IG15aW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCWFsbFJlc291cmNlSW5zdGFuY2VzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbi5nZXRBbGxDb21wb25lbnRJbnN0YW5jZXMoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSwKKwkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHJlc291cmNlIGluc3RhbmNlcyBmb3VuZCIsIGFsbFJlc291cmNlSW5zdGFuY2VzLmlzTGVmdCgpKTsKKwkJCUltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4gaW1tdXRhYmxlUGFpciA9IGFsbFJlc291cmNlSW5zdGFuY2VzCisJCQkJCS5sZWZ0KCkudmFsdWUoKTsKKwkJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IG5vZGVzID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCUxpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPiBlZGdlcyA9IGltbXV0YWJsZVBhaXIuZ2V0VmFsdWUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBpbnN0YW5jZXMgc2l6ZSIsIDEsIG5vZGVzLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGluc3RhbmNlcyBzaXplIiwgMCwgZWRnZXMuc2l6ZSgpKTsKKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY29tcHV0ZUluc3RUZXMgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsICIyIiwgdHJ1ZSwKKwkJCQkJCQljb21wdXRlSW5zdGFuY2UxLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIGFkZGVkIHRvIHNlcnZpY2UiLCBjb21wdXRlSW5zdFRlcy5pc0xlZnQoKSk7CisJCQlDb21wb25lbnRJbnN0YW5jZSB2YWx1ZTIgPSBjb21wdXRlSW5zdFRlcy5sZWZ0KCkudmFsdWUoKTsKKworCQkJYWxsUmVzb3VyY2VJbnN0YW5jZXMgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uLmdldEFsbENvbXBvbmVudEluc3RhbmNlcyhzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLAorCQkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2VzIGZvdW5kIiwgYWxsUmVzb3VyY2VJbnN0YW5jZXMuaXNMZWZ0KCkpOworCQkJaW1tdXRhYmxlUGFpciA9IGFsbFJlc291cmNlSW5zdGFuY2VzLmxlZnQoKS52YWx1ZSgpOworCQkJbm9kZXMgPSBpbW11dGFibGVQYWlyLmdldEtleSgpOworCQkJZWRnZXMgPSBpbW11dGFibGVQYWlyLmdldFZhbHVlKCk7CisKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2VzIHNpemUiLCAyLCBub2Rlcy5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBpbnN0YW5jZXMgc2l6ZSIsIDAsIGVkZ2VzLnNpemUoKSk7CisKKwkJCVN0cmluZyByZXF1aXJlbWVudCA9ICJob3N0IjsKKwkJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvblBhaXIgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCk7CisJCQlyZWxhdGlvblBhaXIuc2V0UmVxdWlyZW1lbnQocmVxdWlyZW1lbnQpOworCQkJcmVsYXRpb25QYWlyLnNldENhcGFiaWxpdHlVaWQoY2FwYWJpbGl0eS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudFVpZChhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKSk7CisJCQlyZWxhdGlvblBhaXIuc2V0UmVxdWlyZW1lbnRPd25lcklkKHZhbHVlMS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlbGF0aW9uUGFpci5zZXRDYXBhYmlsaXR5T3duZXJJZCh2YWx1ZTIuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCUVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5jb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlKHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHZhbHVlMS5nZXRVbmlxdWVJZCgpLAorCQkJCQkJCXZhbHVlMi5nZXRVbmlxdWVJZCgpLCByZWxhdGlvblBhaXIpOworCisJCQlhc3NlcnRUcnVlKCJjaGVjayByZWxhdGlvbiBjcmVhdGVkIiwgY29ubmVjdFJlc291cmNlc0luU2VydmljZS5pc0xlZnQoKSk7CisKKwkJCWFsbFJlc291cmNlSW5zdGFuY2VzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbi5nZXRBbGxDb21wb25lbnRJbnN0YW5jZXMoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSwKKwkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHJlc291cmNlIGluc3RhbmNlcyBmb3VuZCIsIGFsbFJlc291cmNlSW5zdGFuY2VzLmlzTGVmdCgpKTsKKwkJCWltbXV0YWJsZVBhaXIgPSBhbGxSZXNvdXJjZUluc3RhbmNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCW5vZGVzID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCWVkZ2VzID0gaW1tdXRhYmxlUGFpci5nZXRWYWx1ZSgpOworCisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGluc3RhbmNlcyBzaXplIiwgMiwgbm9kZXMuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2VzIHNpemUiLCAxLCBlZGdlcy5zaXplKCkpOworCisJCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNJbnN0YW5jZXMyID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbnN0YW5jZT4oKTsKKwkJCXJlc0luc3RhbmNlczIuYWRkKHZhbHVlMSk7CisJCQlyZXNJbnN0YW5jZXMyLmFkZCh2YWx1ZTIpOworCisJCQlDb21wb25lbnRJbnN0YW5jZSBteXJlc291cmNlSW5zdGFuY2UyID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKHJlc291cmNlLmdldFVuaXF1ZUlkKCksICIxIiwgIm15cmVzb3VyY2UyIik7CisKKwkJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IG5ld1Jlc291cmNlID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMyIsIHRydWUsCisJCQkJCQkJbXlyZXNvdXJjZUluc3RhbmNlMiwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJCWFzc2VydFRydWUoImFkZGVkIHJlc291cmNlIGluc3RhbmNlIHN1Y2Nlc3NmdWxseSIsIG5ld1Jlc291cmNlLmlzTGVmdCgpKTsKKworCQkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50KHJlcXVpcmVtZW50KTsKKwkJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudE93bmVySWQobmV3UmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKSk7CisKKwkJCUVpdGhlcjxSZWxhdGlvbnNoaXBJbnN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UyID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuY29ubmVjdFJlc291cmNlc0luU2VydmljZShzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLAorCQkJCQkJCW5ld1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCksIHZhbHVlMi5nZXRVbmlxdWVJZCgpLCByZWxhdGlvblBhaXIpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2Ugd2FzIGFkZGVkIHRvIHNlcnZpY2UiLCBjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlMi5pc0xlZnQoKSk7CisKKwkJCWFsbFJlc291cmNlSW5zdGFuY2VzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbi5nZXRBbGxDb21wb25lbnRJbnN0YW5jZXMoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSwKKwkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHJlc291cmNlIGluc3RhbmNlcyBmb3VuZCIsIGFsbFJlc291cmNlSW5zdGFuY2VzLmlzTGVmdCgpKTsKKwkJCWltbXV0YWJsZVBhaXIgPSBhbGxSZXNvdXJjZUluc3RhbmNlcy5sZWZ0KCkudmFsdWUoKTsKKwkJCW5vZGVzID0gaW1tdXRhYmxlUGFpci5nZXRLZXkoKTsKKwkJCWVkZ2VzID0gaW1tdXRhYmxlUGFpci5nZXRWYWx1ZSgpOworCisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIGluc3RhbmNlcyBzaXplIiwgMywgbm9kZXMuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2VzIHNpemUiLCAyLCBlZGdlcy5zaXplKCkpOworCisJCQlFaXRoZXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVBbGxSZXNvdXJjZUluc3RhbmNlc09mU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmRlbGV0ZUFsbENvbXBvbmVudEluc3RhbmNlc0ludGVybmFsKHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2VzIHdhcyBkZWxldGVkLiIsIGRlbGV0ZUFsbFJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgbnVtYmVyIG9mIGRlbGV0ZWQgcmVzb3VyY2UgaW5zdGFuY2VzLiIsIDMsCisJCQkJCWRlbGV0ZUFsbFJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLnNpemUoKSk7CisKKwkJCUVpdGhlcjxMaXN0PFJlbGF0aW9uc2hpcEluc3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFsbFJlbGF0aW5zaGlwSW5zdCA9IHRpdGFuRGFvCisJCQkJCS5nZXRBbGwoTm9kZVR5cGVFbnVtLlJlbGF0aW9uc2hpcEluc3QsIFJlbGF0aW9uc2hpcEluc3REYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUoImFsbFJlbGF0aW5zaGlwSW5zdCBpcyBlbXB0eSIsIGFsbFJlbGF0aW5zaGlwSW5zdC5pc1JpZ2h0KCkpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGxSZWxhdGluc2hpcEluc3QgcmVzdWx0IGlzIE5PVF9GT1VORCIsIFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwKKwkJCQkJYWxsUmVsYXRpbnNoaXBJbnN0LnJpZ2h0KCkudmFsdWUoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlQ29tcHV0ZVJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkJLmRlbGV0ZVJlc291cmNlKGNvbXB1dGVDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCQlhc3NlcnRUcnVlKCJkZWxldGUgY29tcHV0ZSByZXNvdXJjZSBzdWNjZWVkIiwgZGVsZXRlQ29tcHV0ZVJlc291cmNlLmlzTGVmdCgpKTsKKworCQkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVTQ1Jlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkJLmRlbGV0ZVJlc291cmNlKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiZGVsZXRlIHNvZnR3YXJlIGNvbXBvbmVudCByZXNvdXJjZSBzdWNjZWVkIiwgZGVsZXRlU0NSZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlTXlSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uCisJCQkJCS5kZWxldGVSZXNvdXJjZShyZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImRlbGV0ZSBteSByZXNvdXJjZSBzdWNjZWVkIiwgZGVsZXRlTXlSZXNvdXJjZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcm9vdFJlc291cmNlRGVsZXRlZCA9IHJlc291cmNlT3BlcmF0aW9uCisJCQkJCS5kZWxldGVSZXNvdXJjZShyb290UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisJCQlhc3NlcnRUcnVlKCJkZWxldGUgcm9vdCByZXNvdXJjZSBzdWNjZWVkIiwgcm9vdFJlc291cmNlRGVsZXRlZC5pc0xlZnQoKSk7CisKKwkJCVNldDxTdHJpbmc+IHZlcnRleFNldEFmdGVyRGVsZXRlID0gcHJpbnRHcmFwaDEuZ2V0VmVydGljZXNTZXQodGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJCXZlcnRleFNldEFmdGVyRGVsZXRlLnJlbW92ZUFsbCh2ZXJ0ZXhTZXRCZWZvcmVNZXRob2QpOworCisJCQlsb2cuZGVidWcoInZlcnRleFNldEFmdGVyRGVsZXRlPXt9IiwgdmVydGV4U2V0QWZ0ZXJEZWxldGUpOworCQkJbG9nLmRlYnVnKCJ2ZXJ0ZXhTZXRBZnRlckRlbGV0ZSBzaXplPXt9IiwgdmVydGV4U2V0QWZ0ZXJEZWxldGUuc2l6ZSgpKTsKKworCQkJLy8gaW50IG51bWJlck9mVmVydGljZXNBZnRlck9wZXJhdGlvbiA9CisJCQkvLyBwcmludEdyYXBoMS5nZXROdW1iZXJPZlZlcnRpY2VzKHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG51bWJlck9mVmVydGljZXNBZnRlck9wZXJhdGlvbik7CisJCQkvLyA2IC0gc2VydmljZSwgMiB0YWdzLCBjYXBhYmlsaXR5ICsgMiBwYXJhbWV0ZXJzCisJCQkvLyBjb21wYXJlR3JhcGhTaXplKG51bWJlck9mVmVydGljZXMgKyA2LCB2ZXJ0ZXhTZXRCZWZvcmVNZXRob2QpOworCisJCX0gZmluYWxseSB7CisJCQlyb2xsYmFja0FuZFByaW50KGZhbHNlKTsKKwkJCWNvbXBhcmVHcmFwaFNpemUobnVtYmVyT2ZWZXJ0aWNlcyk7CisJCQkvLyBwcmludEdyYXBoMS5wcmludEdyYXBoVmVydGljZXModGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisJCX0KKworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVSb290UmVzb3VyY2UoKSB7CisKKwkJU3RyaW5nIG5hbWUgPSAidG9zY2Eubm9kZXMuUm9vdCI7CisKKwkJU3RyaW5nIHN0YXRlID0gTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCk7CisKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhMSA9IG5ldyBSZXNvdXJjZU1ldGFkYXRhRGF0YSgpOworCQlyZXNvdXJjZURhdGExLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXNvdXJjZVVuaXF1ZUlkKCkpOworCQlyZXNvdXJjZURhdGExLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXROYW1lKG5hbWUpOworCQlyZXNvdXJjZURhdGExLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShzdGF0ZSk7CisJCXJlc291cmNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldEhpZ2hlc3RWZXJzaW9uKHRydWUpOworCQlyZXNvdXJjZURhdGExLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRDb250YWN0SWQoImNvbnRhY3RJZCIpOworCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlMSA9IHRpdGFuRGFvLmNyZWF0ZU5vZGUocmVzb3VyY2VEYXRhMSwKKwkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJbG9nLmRlYnVnKCJ7fSIsIGNyZWF0ZU5vZGUxKTsKKworCQl0aXRhbkRhby5jb21taXQoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlSZXNvdXJjZUNlcnRpZmllZCgpIHsKKwkJYm9vbGVhbiBjcmVhdGUgPSB0cnVlOworCQlTdHJpbmcgbmFtZSA9ICJteXJlc291cmNlNyI7CisJCWlmIChjcmVhdGUpIHsKKworCQkJU3RyaW5nIHN0YXRlID0gTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCk7CisJCQlib29sZWFuIGlzSGlnaGVzdFZlcnNpb24gPSB0cnVlOworCisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGExID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCQlyZXNvdXJjZURhdGExLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChuYW1lICsgIi4iICsgIjEuMCIpOworCQkJcmVzb3VyY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0TmFtZShuYW1lKTsKKwkJCXJlc291cmNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFN0YXRlKHN0YXRlKTsKKwkJCXJlc291cmNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldEhpZ2hlc3RWZXJzaW9uKHRydWUpOworCQkJcmVzb3VyY2VEYXRhMS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0Q29udGFjdElkKCJjb250YWN0SWQiKTsKKwkJCUVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUxID0gdGl0YW5EYW8uY3JlYXRlTm9kZShyZXNvdXJjZURhdGExLAorCQkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJCWxvZy5kZWJ1Zygie30iLCBjcmVhdGVOb2RlMSk7CisKKwkJCXRpdGFuRGFvLmNvbW1pdCgpOworCisJCQkvLyByZXNvdXJjZURhdGExLnNldEhpZ2hlc3RWZXJzaW9uKGZhbHNlKTsKKwkJCXJlc291cmNlRGF0YTEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldENvbnRhY3RJZCgiMjIyY29udGFjdElkMjIyIik7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGExLAorCQkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisKKwkJCXRpdGFuRGFvLmNvbW1pdCgpOworCisJCQkvLyBUaXRhbkdyYXBoIHRpdGFuR3JhcGggPSB0aXRhbkRhby5nZXRHcmFwaCgpLmxlZnQoKS52YWx1ZSgpOworCQkJLy8gSXRlcmFibGU8UmVzdWx0PFZlcnRleD4+IHZlcnRpY2VzID0KKwkJCS8vIHRpdGFuR3JhcGguaW5kZXhRdWVyeSgiaGlnaGVzdFZlcnNpb24iLAorCQkJLy8gInYuaGlnaGVzdFZlcnNpb246dHJ1ZSIpLnZlcnRpY2VzKCk7CisJCQkvLyBmb3IgKFJlc3VsdDxWZXJ0ZXg+IHZlcnRleCA6IHZlcnRpY2VzKSB7CisJCQkvLyBWZXJ0ZXggZWxlbWVudCA9IHZlcnRleC5nZXRFbGVtZW50KCk7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyhlbGVtZW50KSk7CisJCQkvLyB9CisKKwkJfQorCisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSBzZWFyY2hGb3JSZXNvdXJjZShuYW1lKTsKKworCQlsb2cuZGVidWcoInt9IiwgYnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5zaXplKCkpOworCisJCWJ5Q3JpdGVyaWEgPSBzZWFyY2hGb3JSZXNvdXJjZShuYW1lKTsKKworCQlsb2cuZGVidWcoInt9IiwgYnlDcml0ZXJpYS5sZWZ0KCkudmFsdWUoKS5zaXplKCkpOworCisJfQorCisJcHJpdmF0ZSBFaXRoZXI8TGlzdDxSZXNvdXJjZU1ldGFkYXRhRGF0YT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBzZWFyY2hGb3JSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKTsKKwkJLy8gcHJvcGVydGllc1RvTWF0Y2gucHV0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuSVNfQUJTVFJBQ1QuZ2V0UHJvcGVydHkoKSwKKwkJLy8gdHJ1ZSk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5Lk5BTUUuZ2V0UHJvcGVydHkoKSwgbmFtZSk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkNPTlRBQ1RfSUQuZ2V0UHJvcGVydHkoKSwgImNvbnRhY3RJZCIpOworCQkvLyBwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5JU19ISUdIRVNUX1ZFUlNJT04uZ2V0UHJvcGVydHkoKSwKKwkJLy8gdHJ1ZSk7CisJCUVpdGhlcjxMaXN0PFJlc291cmNlTWV0YWRhdGFEYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkRhbworCQkJCS5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgcHJvcGVydGllc1RvTWF0Y2gsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJcmV0dXJuIGJ5Q3JpdGVyaWE7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUmVzb3VyY2VJbnN0YW5jZVR3aWNlKCkgeworCisJCVByaW50R3JhcGggcHJpbnRHcmFwaDEgPSBuZXcgUHJpbnRHcmFwaCgpOworCQlpbnQgbnVtYmVyT2ZWZXJ0aWNlcyA9IHByaW50R3JhcGgxLmdldE51bWJlck9mVmVydGljZXModGl0YW5EYW8uZ2V0R3JhcGgoKS5sZWZ0KCkudmFsdWUoKSk7CisJCXRyeSB7CisKKwkJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUgPSBDQVBBQklMSVRZXzI7CisJCQlTdHJpbmcgcmVxTmFtZSA9ICJob3N0IjsKKwkJCVN0cmluZyByZXFOb2RlTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Db21wdXRlMiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyByb290TmFtZSA9ICJSb290MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBzb2Z0d2FyZUNvbXBOYW1lID0gInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBjb21wdXRlTm9kZU5hbWUgPSByZXFOb2RlTmFtZTsKKwkJCVN0cmluZyBteVJlc291cmNlVmVyc2lvbiA9ICI0LjAiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgcmVxUmVsYXRpb25zaGlwID0gIm15cmVsYXRpb25zaGlwIjsKKworCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCByZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24pOworCisJCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwKKwkJCQkJdHJ1ZSwgdHJ1ZSk7CisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQkvLyBjcmVhdGUgc29mdHdhcmUgY29tcG9uZW50CisJCQlSZXNvdXJjZSBzb2Z0d2FyZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBzb2Z0d2FyZUNvbXBOYW1lLAorCQkJCQkiMS4wIiwgcm9vdFJlc291cmNlLmdldE5hbWUoKSwgdHJ1ZSwgdHJ1ZSk7CisKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoc29mdHdhcmVDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSk7CisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFN0YXRlKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKTsKKwkJCXVwZGF0ZU5vZGUgPSB0aXRhbkRhby51cGRhdGVOb2RlKHJlc291cmNlRGF0YSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQkJYXNzZXJ0VHJ1ZSh1cGRhdGVOb2RlLmlzTGVmdCgpKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2UgbXlyZXNvdXJjZUluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCksICIxIiwKKwkJCQkJc29mdHdhcmVDb21wTmFtZSk7CisKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJteXNlcnZpY2UuMS4wIjsKKwkJCVNlcnZpY2VNZXRhZGF0YURhdGEgY3JlYXRlU2VydmljZSA9IGNyZWF0ZVNlcnZpY2Uoc2VydmljZU5hbWUpOworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBteWluc3RhbmNlUmVzMSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHNlcnZpY2VOYW1lLCBOb2RlVHlwZUVudW0uU2VydmljZSwgIjEiLCBteXJlc291cmNlSW5zdGFuY2UsCisJCQkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHJlc291cmNlIGluc3RhbmNlIHdhcyBjcmVhdGVkIiwgbXlpbnN0YW5jZVJlczEuaXNMZWZ0KCkpOworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG15aW5zdGFuY2VSZXMyID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2Uoc2VydmljZU5hbWUsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMSIsIG15cmVzb3VyY2VJbnN0YW5jZSwKKwkJCQkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2Ugd2FzIG5vdCBjcmVhdGVkIiwgbXlpbnN0YW5jZVJlczIuaXNSaWdodCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgZXJyb3IgY29kZSIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuU0NIRU1BX1ZJT0xBVElPTiwgbXlpbnN0YW5jZVJlczIucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZXNvdXJjZUluc3RhbmNlID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHNlcnZpY2VOYW1lLAorCQkJCQkJCW15aW5zdGFuY2VSZXMxLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCksIHRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2Ugd2FzIGRlbGV0ZWQiLCBkZWxldGVSZXNvdXJjZUluc3RhbmNlLmlzTGVmdCgpKTsKKworCQkJZGVsZXRlUmVzb3VyY2VJbnN0YW5jZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24uZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoTm9kZVR5cGVFbnVtLlNlcnZpY2UsCisJCQkJCXNlcnZpY2VOYW1lLCBteWluc3RhbmNlUmVzMS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpLCB0cnVlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIHJlc291cmNlIGluc3RhbmNlIHdhcyBub3QgZGVsZXRlZCIsIGRlbGV0ZVJlc291cmNlSW5zdGFuY2UuaXNSaWdodCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgcmVzb3VyY2UgaW5zdGFuY2Ugd2FzIG5vdCBkZWxldGVkIiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsCisJCQkJCWRlbGV0ZVJlc291cmNlSW5zdGFuY2UucmlnaHQoKS52YWx1ZSgpKTsKKworCQl9IGZpbmFsbHkgeworCQkJcm9sbGJhY2tBbmRQcmludChmYWxzZSk7CisJCQljb21wYXJlR3JhcGhTaXplKG51bWJlck9mVmVydGljZXMpOworCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0UmVzb3VyY2VJbnN0YW5jZXNUd2ljZSgpIHsKKworCQlQcmludEdyYXBoIHByaW50R3JhcGgxID0gbmV3IFByaW50R3JhcGgoKTsKKwkJaW50IG51bWJlck9mVmVydGljZXMgPSBwcmludEdyYXBoMS5nZXROdW1iZXJPZlZlcnRpY2VzKHRpdGFuRGFvLmdldEdyYXBoKCkubGVmdCgpLnZhbHVlKCkpOworCisJCXRyeSB7CisKKwkJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUxID0gQ0FQQUJJTElUWV8xOworCQkJU3RyaW5nIGNhcGFiaWxpdHlUeXBlTmFtZTIgPSBDQVBBQklMSVRZXzI7CisJCQlTdHJpbmcgcmVxTmFtZTEgPSAiaG9zdDEiOworCQkJU3RyaW5nIHJlcU5hbWUyID0gImhvc3QyIjsKKwkJCVN0cmluZyByZXFOb2RlTmFtZSA9ICJ0b3NjYS5ub2Rlcy5Db21wdXRlMiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyByb290TmFtZSA9ICJSb290MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBzb2Z0d2FyZUNvbXBOYW1lID0gInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50MiIgKyBURVNUX0NMQVNTX05VTUJFUjsKKwkJCVN0cmluZyBjb21wdXRlTm9kZU5hbWUgPSByZXFOb2RlTmFtZTsKKwkJCVN0cmluZyBteVJlc291cmNlVmVyc2lvbiA9ICI0LjAiICsgVEVTVF9DTEFTU19OVU1CRVI7CisJCQlTdHJpbmcgcmVxUmVsYXRpb25zaGlwID0gIm15cmVsYXRpb25zaGlwIjsKKworCQkJLy8gQ3JlYXRlIENhcGFiaWxpdHkgdHlwZQorCQkJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCA9IG5ldyBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QoKTsKKwkJCWNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbik7CisJCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY3JlYXRlQ2FwYWJpbGl0eURlZjEgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lMSk7CisJCQlDYXBhYmlsaXR5VHlwZURlZmluaXRpb24gY3JlYXRlQ2FwYWJpbGl0eURlZjIgPSBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QKKwkJCQkJLmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lMik7CisKKwkJCVJlc291cmNlT3BlcmF0aW9uVGVzdCByZXNvdXJjZU9wZXJhdGlvblRlc3QgPSBuZXcgUmVzb3VyY2VPcGVyYXRpb25UZXN0KCk7CisJCQlyZXNvdXJjZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgcmVzb3VyY2VPcGVyYXRpb24sIHByb3BlcnR5T3BlcmF0aW9uKTsKKworCQkJLy8gY3JlYXRlIHJvb3QgcmVzb3VyY2UKKwkJCVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCByb290TmFtZSwgIjEuMCIsIG51bGwsCisJCQkJCXRydWUsIHRydWUpOworCisJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsCisJCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCQkuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIHRydWUpOworCisJCQlTdHJpbmcgcm9vdFJlc291cmNlSnNvbiA9IHByZXR0eUdzb24udG9Kc29uKGZldGNoUm9vdFJlc291cmNlLmxlZnQoKS52YWx1ZSgpKTsKKwkJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKworCQkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkJIjEuMCIsIHJvb3RSZXNvdXJjZS5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpOworCQkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCQl1cGRhdGVOb2RlID0gdGl0YW5EYW8udXBkYXRlTm9kZShyZXNvdXJjZURhdGEsIFJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJCWFzc2VydFRydWUodXBkYXRlTm9kZS5pc0xlZnQoKSk7CisKKwkJCS8vIGNyZWF0ZSBjb21wdXRlIGNvbXBvbmVudAorCQkJUmVzb3VyY2UgY29tcHV0ZUNvbXBvbmVudCA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCBjb21wdXRlTm9kZU5hbWUsCisJCQkJCSIxLjAiLCByb290UmVzb3VyY2UuZ2V0TmFtZSgpLCB0cnVlLCB0cnVlKTsKKworCQkJLy8gQWRkIGNhcGFiaWxpdGllcyB0byBDb21wdXRlIFJlc291cmNlCisJCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsdHkxID0gYWRkQ2FwYWJpbGl0eVRvUmVzb3VyY2UoY2FwYWJpbGl0eVR5cGVOYW1lMSwgcmVxTmFtZTEsIGNvbXB1dGVDb21wb25lbnQpOworCQkJQ2FwYWJpbGl0eURlZmluaXRpb24gY2FwYWJpbHR5MiA9IGFkZENhcGFiaWxpdHlUb1Jlc291cmNlKGNhcGFiaWxpdHlUeXBlTmFtZTIsIHJlcU5hbWUyLCBjb21wdXRlQ29tcG9uZW50KTsKKworCQkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCisJCQkvLyBjcmVhdGUgcmVxdWlyZW1lbnQgZGVmaW5pdGlvbgorCisJCQlFaXRoZXI8UmVxdWlyZW1lbnREZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UgPSBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UoCisJCQkJCWNhcGFiaWxpdHlUeXBlTmFtZTEsIHJlcU5hbWUxLCByZXFOb2RlTmFtZSwgcmVxUmVsYXRpb25zaGlwLCBzb2Z0d2FyZUNvbXBvbmVudCk7CisKKwkJCVN0cmluZyBwYXJlbnRSZXFVbmlxSWQgPSBhZGRSZXF1aXJlbWVudFRvUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKworCQkJLy8gY3JlYXRlIG15IHJlc291cmNlIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb21wb25lbnQKKwkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsICJteS1yZXNvdXJjZSIsCisJCQkJCW15UmVzb3VyY2VWZXJzaW9uLCBzb2Z0d2FyZUNvbXBvbmVudC5nZXROYW1lKCksIHRydWUsIHRydWUpOworCisJCQlTdHJpbmcgc2VydmljZUlkID0gIm15c2VydmljZS4xLjAiOworCisJCQlTZXJ2aWNlTWV0YWRhdGFEYXRhIGNyZWF0ZVNlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCQlDb21wb25lbnRJbnN0YW5jZSBteXJlc291cmNlSW5zdGFuY2UgPSBidWlsZFJlc291cmNlSW5zdGFuY2UocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgIjEiLCAibXktcmVzb3VyY2UiKTsKKworCQkJQ29tcG9uZW50SW5zdGFuY2UgY29tcHV0ZUluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKGNvbXB1dGVDb21wb25lbnQuZ2V0VW5pcXVlSWQoKSwgIjIiLAorCQkJCQljb21wdXRlTm9kZU5hbWUpOworCisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBteWluc3RhbmNlUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMSIsIHRydWUsCisJCQkJCQkJbXlyZXNvdXJjZUluc3RhbmNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIGZhbHNlKTsKKwkJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIGFkZGVkIHRvIHNlcnZpY2UiLCBteWluc3RhbmNlUmVzLmlzTGVmdCgpKTsKKwkJCUNvbXBvbmVudEluc3RhbmNlIHZhbHVlMSA9IG15aW5zdGFuY2VSZXMubGVmdCgpLnZhbHVlKCk7CisJCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb21wdXRlSW5zdFRlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmFkZENvbXBvbmVudEluc3RhbmNlVG9Db250YWluZXJDb21wb25lbnQoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSwgIjIiLCB0cnVlLAorCQkJCQkJCWNvbXB1dGVJbnN0YW5jZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisJCQlhc3NlcnRUcnVlKCJjaGVjayBpbnN0YW5jZSBhZGRlZCB0byBzZXJ2aWNlIiwgY29tcHV0ZUluc3RUZXMuaXNMZWZ0KCkpOworCQkJQ29tcG9uZW50SW5zdGFuY2UgdmFsdWUyID0gY29tcHV0ZUluc3RUZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJCVJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiByZWxhdGlvbiA9IG5ldyBSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYoKTsKKwkJCVN0cmluZyBmcm9tUmVzVWlkID0gdmFsdWUxLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgdG9SZXNVaWQgPSB2YWx1ZTIuZ2V0VW5pcXVlSWQoKTsKKwkJCXJlbGF0aW9uLnNldEZyb21Ob2RlKGZyb21SZXNVaWQpOworCQkJcmVsYXRpb24uc2V0VG9Ob2RlKHRvUmVzVWlkKTsKKwkJCUxpc3Q8UmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyPiByZWxhdGlvbnNoaXBzID0gbmV3IEFycmF5TGlzdDxSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXI+KCk7CisJCQlSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIgaW1tdXRhYmxlUGFpcjEgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKHJlcU5hbWUxLCBudWxsKTsKKwkJCWltbXV0YWJsZVBhaXIxLnNldENhcGFiaWxpdHlVaWQoY2FwYWJpbHR5MS5nZXRVbmlxdWVJZCgpKTsKKwkJCWltbXV0YWJsZVBhaXIxLnNldFJlcXVpcmVtZW50VWlkKHBhcmVudFJlcVVuaXFJZCk7CisJCQlpbW11dGFibGVQYWlyMS5zZXRSZXF1aXJlbWVudE93bmVySWQoZnJvbVJlc1VpZCk7CisJCQlpbW11dGFibGVQYWlyMS5zZXRDYXBhYmlsaXR5T3duZXJJZCh0b1Jlc1VpZCk7CisJCQlyZWxhdGlvbnNoaXBzLmFkZChpbW11dGFibGVQYWlyMSk7CisKKwkJCXJlbGF0aW9uLnNldFJlbGF0aW9uc2hpcHMocmVsYXRpb25zaGlwcyk7CisKKwkJCUVpdGhlcjxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWYsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJCS5hc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZWxhdGlvbiwgdHJ1ZSk7CisJCQlhc3NlcnRUcnVlKCJjaGVjayBhc3NvY2lhdGlvbiBzdWNjZWVkIiwgY29ubmVjdFJlc291cmNlc0luU2VydmljZS5pc0xlZnQoKSk7CisKKwkJCXJlbGF0aW9uc2hpcHMuY2xlYXIoKTsKKwkJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciBpbW11dGFibGVQYWlyMiA9IG5ldyBSZXF1aXJlbWVudEFuZFJlbGF0aW9uc2hpcFBhaXIocmVxTmFtZTIsIG51bGwpOworCQkJaW1tdXRhYmxlUGFpcjIuc2V0Q2FwYWJpbGl0eVVpZChjYXBhYmlsdHkyLmdldFVuaXF1ZUlkKCkpOworCQkJaW1tdXRhYmxlUGFpcjIuc2V0UmVxdWlyZW1lbnRVaWQocGFyZW50UmVxVW5pcUlkKTsKKwkJCXJlbGF0aW9uc2hpcHMuYWRkKGltbXV0YWJsZVBhaXIyKTsKKworCQkJUmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmIGZpcnN0UmVsYXRpb24gPSBjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlLmxlZnQoKS52YWx1ZSgpOworCQkJY29ubmVjdFJlc291cmNlc0luU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24uYXNzb2NpYXRlUmVzb3VyY2VJbnN0YW5jZXMoc2VydmljZUlkLAorCQkJCQlOb2RlVHlwZUVudW0uU2VydmljZSwgcmVsYXRpb24sIHRydWUpOworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgYXNzb2NpYXRpb24gc3VjY2VlZCIsIGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UuaXNSaWdodCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgYXNzb2NpYXRpb24gZmFpbGVkIiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5NQVRDSF9OT1RfRk9VTkQsCisJCQkJCWNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UucmlnaHQoKS52YWx1ZSgpKTsKKworCQkJRWl0aGVyPFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkJLmRpc3NvY2lhdGVSZXNvdXJjZUluc3RhbmNlcyhzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmaXJzdFJlbGF0aW9uLCB0cnVlKTsKKworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgZGlzc29jaWF0aW9uIHN1Y2NlZWQiLCBkaXNjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlLmlzTGVmdCgpKTsKKworCQkJZGlzY29ubmVjdFJlc291cmNlc0luU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24uZGlzc29jaWF0ZVJlc291cmNlSW5zdGFuY2VzKHNlcnZpY2VJZCwKKwkJCQkJTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlbGF0aW9uLCB0cnVlKTsKKworCQkJYXNzZXJ0VHJ1ZSgiY2hlY2sgZGlzc29jaWF0aW9uIGZhaWxlZCIsIGRpc2Nvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UuaXNSaWdodCgpKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgYXNzb2NpYXRpb24gZmFpbGVkIiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsCisJCQkJCWRpc2Nvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UucmlnaHQoKS52YWx1ZSgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJvbGxiYWNrQW5kUHJpbnQoKTsKKwkJCWNvbXBhcmVHcmFwaFNpemUobnVtYmVyT2ZWZXJ0aWNlcyk7CisJCX0KKworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlQ29tcHV0ZVdpdGhDYXBhYmlsaXR5KFN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUsIFN0cmluZyBjb21wdXRlTm9kZU5hbWUsCisJCQlSZXNvdXJjZU9wZXJhdGlvblRlc3QgcmVzb3VyY2VPcGVyYXRpb25UZXN0LCBSZXNvdXJjZSByb290UmVzb3VyY2UpIHsKKwkJLy8gY3JlYXRlIGNvbXB1dGUgY29tcG9uZW50CisJCS8vIFN0cmluZyBpZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlVW5pcXVlSWQoY29tcHV0ZU5vZGVOYW1lLAorCQkvLyAiMS4wIik7CisJCS8vIGlmIChyZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShpZCkuaXNMZWZ0KCkpeworCQkvLyByZXNvdXJjZU9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZShpZCk7CisJCS8vIH0KKwkJRWl0aGVyPExpc3Q8UmVzb3VyY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvbGRSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uCisJCQkJLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbihjb21wdXRlTm9kZU5hbWUsICIxLjAiLCBmYWxzZSk7CisJCWlmIChvbGRSZXNvdXJjZS5pc0xlZnQoKSkgeworCQkJZm9yIChSZXNvdXJjZSBvbGQgOiBvbGRSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSkgeworCQkJCWlmIChvbGQuZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKFJlc291cmNlVHlwZUVudW0uVkZDKSkgeworCQkJCQlyZXNvdXJjZU9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZShvbGQuZ2V0VW5pcXVlSWQoKSk7CisJCQkJfQorCQkJfQorCisJCX0KKworCQlSZXNvdXJjZSBjb21wdXRlQ29tcG9uZW50ID0gcmVzb3VyY2VPcGVyYXRpb25UZXN0LmNyZWF0ZVJlc291cmNlKFVTRVJfSUQsIENBVEVHT1JZX05BTUUsIGNvbXB1dGVOb2RlTmFtZSwgIjEuMCIsCisJCQkJcm9vdFJlc291cmNlLmdldE5hbWUoKSwgdHJ1ZSwgdHJ1ZSk7CisKKwkJLy8gcm9sbGJhY2tBbmRQcmludCgpOworCisJCS8vIEFkZCBjYXBhYmlsaXRpZXMgdG8gQ29tcHV0ZSBSZXNvdXJjZQorCQlhZGRDYXBhYmlsaXR5VG9SZXNvdXJjZShjYXBhYmlsaXR5VHlwZU5hbWUsICJob3N0IiwgY29tcHV0ZUNvbXBvbmVudCk7CisJCXJldHVybiByZXNvdXJjZU9wZXJhdGlvbi5nZXRSZXNvdXJjZShjb21wdXRlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpLmxlZnQoKS52YWx1ZSgpOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlU29mdHdhcmVDb21wb25lbnRXaXRoUmVxKFN0cmluZyBzb2Z0d2FyZUNvbXBOYW1lLAorCQkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCwgUmVzb3VyY2Ugcm9vdFJlc291cmNlLCBTdHJpbmcgY2FwYWJpbGl0eVR5cGVOYW1lLAorCQkJU3RyaW5nIHJlcU5hbWUsIFN0cmluZyByZXFSZWxhdGlvbnNoaXAsIFN0cmluZyByZXFOb2RlTmFtZSkgeworCQlFaXRoZXI8UmVzb3VyY2VNZXRhZGF0YURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVOb2RlOworCQlSZXNvdXJjZU1ldGFkYXRhRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJLy8gY3JlYXRlIHNvZnR3YXJlIGNvbXBvbmVudAorCQkvLyBTdHJpbmcgaWQgPSBVbmlxdWVJZEJ1aWxkZXIuYnVpbGRSZXNvdXJjZVVuaXF1ZUlkKHNvZnR3YXJlQ29tcE5hbWUsCisJCS8vICIxLjAiKTsKKwkJLy8gaWYgKHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKGlkKS5pc0xlZnQoKSl7CisJCS8vIHJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKGlkKTsKKwkJLy8gfQorCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG9sZFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHNvZnR3YXJlQ29tcE5hbWUsICIxLjAiLCBmYWxzZSk7CisJCWlmIChvbGRSZXNvdXJjZS5pc0xlZnQoKSkgeworCQkJaWYgKG9sZFJlc291cmNlLmlzTGVmdCgpKSB7CisJCQkJZm9yIChSZXNvdXJjZSBvbGQgOiBvbGRSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSkgeworCQkJCQlpZiAob2xkLmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhSZXNvdXJjZVR5cGVFbnVtLlZGQykpIHsKKwkJCQkJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKG9sZC5nZXRVbmlxdWVJZCgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQl9CisKKwkJUmVzb3VyY2Ugc29mdHdhcmVDb21wb25lbnQgPSByZXNvdXJjZU9wZXJhdGlvblRlc3QuY3JlYXRlUmVzb3VyY2UoVVNFUl9JRCwgQ0FURUdPUllfTkFNRSwgc29mdHdhcmVDb21wTmFtZSwKKwkJCQkiMS4wIiwgcm9vdFJlc291cmNlLmdldE5hbWUoKSwgdHJ1ZSwgdHJ1ZSk7CisKKwkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRVbmlxdWVJZChzb2Z0d2FyZUNvbXBvbmVudC5nZXRVbmlxdWVJZCgpKTsKKwkJcmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCXVwZGF0ZU5vZGUgPSB0aXRhbkRhby51cGRhdGVOb2RlKHJlc291cmNlRGF0YSwgUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHVwZGF0ZU5vZGUuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxSZXF1aXJlbWVudERlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSA9IGFkZFJlcXVpcmVtZW50VG9SZXNvdXJjZSgKKwkJCQljYXBhYmlsaXR5VHlwZU5hbWUsIHJlcU5hbWUsIHJlcU5vZGVOYW1lLCByZXFSZWxhdGlvbnNoaXAsIHNvZnR3YXJlQ29tcG9uZW50KTsKKworCQlTdHJpbmcgcGFyZW50UmVxVW5pcUlkID0gYWRkUmVxdWlyZW1lbnRUb1Jlc291cmNlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisKKwkJcmV0dXJuIHJlc291cmNlT3BlcmF0aW9uLmdldFJlc291cmNlKHNvZnR3YXJlQ29tcG9uZW50LmdldFVuaXF1ZUlkKCkpLmxlZnQoKS52YWx1ZSgpOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlUm9vdFJlc291cmNlKFN0cmluZyByb290TmFtZSwgUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCkgeworCQkvLyBjcmVhdGUgcm9vdCByZXNvdXJjZQorCQkvLyBTdHJpbmcgcm9vdElkID0gVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVzb3VyY2VVbmlxdWVJZChyb290TmFtZSwKKwkJLy8gIjEuMCIpOworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG9sZFJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uKHJvb3ROYW1lLCAiMS4wIiwgZmFsc2UpOworCQlpZiAob2xkUmVzb3VyY2UuaXNMZWZ0KCkpIHsKKwkJCWZvciAoUmVzb3VyY2Ugb2xkIDogb2xkUmVzb3VyY2UubGVmdCgpLnZhbHVlKCkpIHsKKwkJCQlpZiAob2xkLmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhSZXNvdXJjZVR5cGVFbnVtLlZGQykpIHsKKwkJCQkJcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2Uob2xkLmdldFVuaXF1ZUlkKCkpOworCQkJCX0KKwkJCX0KKworCQl9CisJCVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uVGVzdC5jcmVhdGVSZXNvdXJjZShVU0VSX0lELCBDQVRFR09SWV9OQU1FLCByb290TmFtZSwgIjEuMCIsIG51bGwsIHRydWUsCisJCQkJdHJ1ZSk7CisJCVJlc291cmNlTWV0YWRhdGFEYXRhIHJvb3RSZXNvdXJjZURhdGEgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YURhdGEoKTsKKwkJcm9vdFJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQlyb290UmVzb3VyY2VEYXRhLmdldE1ldGFkYXRhRGF0YURlZmluaXRpb24oKS5zZXRTdGF0ZShMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisJCUVpdGhlcjxSZXNvdXJjZU1ldGFkYXRhRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHVwZGF0ZU5vZGUgPSB0aXRhbkRhby51cGRhdGVOb2RlKHJvb3RSZXNvdXJjZURhdGEsCisJCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKHVwZGF0ZU5vZGUuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZmV0Y2hSb290UmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbgorCQkJCS5nZXRSZXNvdXJjZShyb290UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgdHJ1ZSk7CisKKwkJU3RyaW5nIHJvb3RSZXNvdXJjZUpzb24gPSBwcmV0dHlHc29uLnRvSnNvbihmZXRjaFJvb3RSZXNvdXJjZS5sZWZ0KCkudmFsdWUoKSk7CisJCWxvZy5kZWJ1Zyhyb290UmVzb3VyY2VKc29uKTsKKwkJcmV0dXJuIHJvb3RSZXNvdXJjZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUluc3RhbmNlc0FuZFJlbGF0aW9uKFN0cmluZyBzZXJ2aWNlSWQpIHsKKworCQlTdHJpbmcgcm9vdE5hbWUgPSAidG9zY2Eubm9kZXMudGVzdC5yb290IjsKKwkJU3RyaW5nIHNvZnR3YXJlQ29tcE5hbWUgPSAidG9zY2Eubm9kZXMudGVzdC5zb2Z0d2FyZWNvbXBvbmVudCI7CisJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUgPSAibXlDYXBhYmlsaXR5IjsKKwkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCVN0cmluZyBjb21wdXRlTm9kZU5hbWUgPSAidG9zY2Eubm9kZXMudGVzdC5jb21wdXRlIjsKKwkJU3RyaW5nIHJlcVJlbGF0aW9uc2hpcCA9ICJteVJlbGF0aW9uc2hpcCI7CisKKwkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJcmVzb3VyY2VPcGVyYXRpb25UZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIHJlc291cmNlT3BlcmF0aW9uLCBwcm9wZXJ0eU9wZXJhdGlvbik7CisKKwkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gY3JlYXRlUm9vdFJlc291cmNlKHJvb3ROYW1lLCByZXNvdXJjZU9wZXJhdGlvblRlc3QpOworCQkvLyBDcmVhdGUgQ2FwYWJpbGl0eSB0eXBlCisJCUNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QgPSBuZXcgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0KCk7CisJCWNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdC5zZXRPcGVyYXRpb25zKHRpdGFuRGFvLCBjYXBhYmlsaXR5VHlwZU9wZXJhdGlvbik7CisJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjcmVhdGVDYXBhYmlsaXR5RGVmID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0LmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQlSZXNvdXJjZSBzb2Z0d2FyZUNvbXBvbmVudFJlc291cmNlID0gY3JlYXRlU29mdHdhcmVDb21wb25lbnRXaXRoUmVxKHNvZnR3YXJlQ29tcE5hbWUsIHJlc291cmNlT3BlcmF0aW9uVGVzdCwKKwkJCQlyb290UmVzb3VyY2UsIGNhcGFiaWxpdHlUeXBlTmFtZSwgcmVxTmFtZSwgcmVxUmVsYXRpb25zaGlwLCBjb21wdXRlTm9kZU5hbWUpOworCQlSZXNvdXJjZSBjb21wdXRlID0gY3JlYXRlQ29tcHV0ZVdpdGhDYXBhYmlsaXR5KGNhcGFiaWxpdHlUeXBlTmFtZSwgY29tcHV0ZU5vZGVOYW1lLCByZXNvdXJjZU9wZXJhdGlvblRlc3QsCisJCQkJcm9vdFJlc291cmNlKTsKKworCQkvLyByZXNvdXJjZTEKKwkJQ29tcG9uZW50SW5zdGFuY2UgbXlyZXNvdXJjZUluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKHNvZnR3YXJlQ29tcG9uZW50UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgIjEiLAorCQkJCSJ0b3NjYS5ub2Rlcy50ZXN0LnJvb3QiKTsKKworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBteWluc3RhbmNlUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsICIxIiwgdHJ1ZSwKKwkJCQkJCW15cmVzb3VyY2VJbnN0YW5jZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgaW5zdGFuY2UgYWRkZWQgdG8gc2VydmljZSIsIG15aW5zdGFuY2VSZXMuaXNMZWZ0KCkpOworCisJCS8vIHJlc291cmNlMgorCQlDb21wb25lbnRJbnN0YW5jZSBjb21wdXRlSW5zdGFuY2UgPSBidWlsZFJlc291cmNlSW5zdGFuY2UoY29tcHV0ZS5nZXRVbmlxdWVJZCgpLCAiMiIsCisJCQkJInRvc2NhLm5vZGVzLnRlc3QuY29tcHV0ZSIpOworCQlDb21wb25lbnRJbnN0YW5jZSB2YWx1ZTEgPSBteWluc3RhbmNlUmVzLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxDb21wb25lbnRJbnN0YW5jZSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNvbXB1dGVJbnN0VGVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsICIyIiwgdHJ1ZSwgY29tcHV0ZUluc3RhbmNlLAorCQkJCQkJTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIGFkZGVkIHRvIHNlcnZpY2UiLCBjb21wdXRlSW5zdFRlcy5pc0xlZnQoKSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHZhbHVlMiA9IGNvbXB1dGVJbnN0VGVzLmxlZnQoKS52YWx1ZSgpOworCisJCVJlcXVpcmVtZW50QW5kUmVsYXRpb25zaGlwUGFpciByZWxhdGlvblBhaXIgPSBuZXcgUmVxdWlyZW1lbnRBbmRSZWxhdGlvbnNoaXBQYWlyKCk7CisJCXJlbGF0aW9uUGFpci5zZXRSZXF1aXJlbWVudChyZXFOYW1lKTsKKwkJcmVsYXRpb25QYWlyLnNldENhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQlTdHJpbmcgY2FwSWQgPSAiIjsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGNhcGFiaWxpdGllcyA9IGNvbXB1dGUuZ2V0Q2FwYWJpbGl0aWVzKCk7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxDYXBhYmlsaXR5RGVmaW5pdGlvbj4+IGVudHJ5IDogY2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCWNhcElkID0gZW50cnkuZ2V0VmFsdWUoKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKTsKKwkJfQorCQlyZWxhdGlvblBhaXIuc2V0Q2FwYWJpbGl0eVVpZChjYXBJZCk7CisJCU1hcDxTdHJpbmcsIExpc3Q8UmVxdWlyZW1lbnREZWZpbml0aW9uPj4gcmVxdWlyZW1lbnRzID0gc29mdHdhcmVDb21wb25lbnRSZXNvdXJjZS5nZXRSZXF1aXJlbWVudHMoKTsKKwkJU3RyaW5nIHJlcUlkID0gIiI7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxSZXF1aXJlbWVudERlZmluaXRpb24+PiBlbnRyeSA6IHJlcXVpcmVtZW50cy5lbnRyeVNldCgpKSB7CisJCQlyZXFJZCA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0KDApLmdldFVuaXF1ZUlkKCk7CisJCX0KKwkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50VWlkKHJlcUlkKTsKKwkJcmVsYXRpb25QYWlyLnNldFJlcXVpcmVtZW50T3duZXJJZCh2YWx1ZTEuZ2V0VW5pcXVlSWQoKSk7CisJCXJlbGF0aW9uUGFpci5zZXRDYXBhYmlsaXR5T3duZXJJZCh2YWx1ZTIuZ2V0VW5pcXVlSWQoKSk7CisJCXJlbGF0aW9uUGFpci5zZXRDYXBhYmlsaXR5VWlkKGNhcElkKTsKKworCQlFaXRoZXI8UmVsYXRpb25zaGlwSW5zdERhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5jb25uZWN0UmVzb3VyY2VzSW5TZXJ2aWNlKHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHZhbHVlMS5nZXRVbmlxdWVJZCgpLCB2YWx1ZTIuZ2V0VW5pcXVlSWQoKSwKKwkJCQkJCXJlbGF0aW9uUGFpcik7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVsYXRpb24gY3JlYXRlZCIsIGNvbm5lY3RSZXNvdXJjZXNJblNlcnZpY2UuaXNMZWZ0KCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUluc3RhbmNlc1Jlc291cmNlRGVsZXRlZCgpIHsKKworCQlTdHJpbmcgcm9vdE5hbWUgPSAidG9zY2Eubm9kZXMudGVzdC5yb290IjsKKwkJU3RyaW5nIHNvZnR3YXJlQ29tcE5hbWUgPSAidG9zY2Eubm9kZXMudGVzdC5zb2Z0d2FyZWNvbXBvbmVudCI7CisJCVN0cmluZyBjYXBhYmlsaXR5VHlwZU5hbWUgPSAibXlDYXBhYmlsaXR5IjsKKwkJU3RyaW5nIHJlcU5hbWUgPSAiaG9zdCI7CisJCVN0cmluZyBjb21wdXRlTm9kZU5hbWUgPSAidG9zY2Eubm9kZXMudGVzdC5jb21wdXRlIjsKKwkJU3RyaW5nIHJlcVJlbGF0aW9uc2hpcCA9ICJteVJlbGF0aW9uc2hpcCI7CisKKwkJU2VydmljZU1ldGFkYXRhRGF0YSBvcmlnU2VydmljZSA9IGNyZWF0ZVNlcnZpY2UoIm15U2VydmljZSIpOworCQlTdHJpbmcgc2VydmljZUlkID0gKFN0cmluZykgb3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXNvdXJjZU9wZXJhdGlvblRlc3QgcmVzb3VyY2VPcGVyYXRpb25UZXN0ID0gbmV3IFJlc291cmNlT3BlcmF0aW9uVGVzdCgpOworCQlyZXNvdXJjZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgcmVzb3VyY2VPcGVyYXRpb24sIHByb3BlcnR5T3BlcmF0aW9uKTsKKworCQlSZXNvdXJjZSByb290UmVzb3VyY2UgPSBjcmVhdGVSb290UmVzb3VyY2Uocm9vdE5hbWUsIHJlc291cmNlT3BlcmF0aW9uVGVzdCk7CisJCS8vIENyZWF0ZSBDYXBhYmlsaXR5IHR5cGUKKwkJQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0IGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uVGVzdCA9IG5ldyBDYXBhYmlsaXR5VHlwZU9wZXJhdGlvblRlc3QoKTsKKwkJY2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uKTsKKwkJY2FwYWJpbGl0eVR5cGVPcGVyYXRpb25UZXN0LmNyZWF0ZUNhcGFiaWxpdHkoY2FwYWJpbGl0eVR5cGVOYW1lKTsKKworCQlSZXNvdXJjZSBzb2Z0d2FyZUNvbXBvbmVudFJlc291cmNlID0gY3JlYXRlU29mdHdhcmVDb21wb25lbnRXaXRoUmVxKHNvZnR3YXJlQ29tcE5hbWUsIHJlc291cmNlT3BlcmF0aW9uVGVzdCwKKwkJCQlyb290UmVzb3VyY2UsIGNhcGFiaWxpdHlUeXBlTmFtZSwgcmVxTmFtZSwgcmVxUmVsYXRpb25zaGlwLCBjb21wdXRlTm9kZU5hbWUpOworCisJCWRlbGV0ZVJlc291cmNlKHNvZnR3YXJlQ29tcG9uZW50UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisKKwkJLy8gcmVzb3VyY2UxCisJCUNvbXBvbmVudEluc3RhbmNlIG15cmVzb3VyY2VJbnN0YW5jZSA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZShzb2Z0d2FyZUNvbXBvbmVudFJlc291cmNlLmdldFVuaXF1ZUlkKCksICIxIiwKKwkJCQkidG9zY2Eubm9kZXMudGVzdC5yb290Iik7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbXlpbnN0YW5jZVJlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMSIsIHRydWUsCisJCQkJCQlteXJlc291cmNlSW5zdGFuY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIG5vdCBhZGRlZCB0byBzZXJ2aWNlIiwgbXlpbnN0YW5jZVJlcy5pc1JpZ2h0KCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVwbG95bWVudEFydGlmYWN0c09uUkkoKSB7CisKKwkJU3RyaW5nIHJvb3ROYW1lID0gInRvc2NhLm5vZGVzLnRlc3Qucm9vdCI7CisKKwkJU2VydmljZU1ldGFkYXRhRGF0YSBvcmlnU2VydmljZSA9IGNyZWF0ZVNlcnZpY2UoInRlc3REZXBsb3ltZW50QXJ0aWZhY3RzT25SSSIpOworCQlTdHJpbmcgc2VydmljZUlkID0gKFN0cmluZykgb3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXNvdXJjZU9wZXJhdGlvblRlc3QgcmVzb3VyY2VPcGVyYXRpb25UZXN0ID0gbmV3IFJlc291cmNlT3BlcmF0aW9uVGVzdCgpOworCQlyZXNvdXJjZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgcmVzb3VyY2VPcGVyYXRpb24sIHByb3BlcnR5T3BlcmF0aW9uKTsKKworCQlSZXNvdXJjZSByb290UmVzb3VyY2UgPSBjcmVhdGVSb290UmVzb3VyY2Uocm9vdE5hbWUsIHJlc291cmNlT3BlcmF0aW9uVGVzdCk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhZGRBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGRBcnRpZmFjdFRvUmVzb3VyY2UoVVNFUl9JRCwgcm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksCisJCQkJIm15QXJ0aWZhY3QiKTsKKworCQkvLyByZXNvdXJjZTEKKwkJQ29tcG9uZW50SW5zdGFuY2UgbXlyZXNvdXJjZUluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCAiMSIsIHJvb3ROYW1lKTsKKworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBteWluc3RhbmNlUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsICIxIiwgdHJ1ZSwKKwkJCQkJCW15cmVzb3VyY2VJbnN0YW5jZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgaW5zdGFuY2UgYWRkZWQgdG8gc2VydmljZSIsIG15aW5zdGFuY2VSZXMuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxJbW11dGFibGVQYWlyPExpc3Q8Q29tcG9uZW50SW5zdGFuY2U+LCBMaXN0PFJlcXVpcmVtZW50Q2FwYWJpbGl0eVJlbERlZj4+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2UgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uCisJCQkJLmdldENvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCWFzc2VydFRydWUocmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2UuaXNMZWZ0KCkpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNvdXJjZUluc3RhbmNlTGlzdCA9IHJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCWFzc2VydFRydWUocmVzb3VyY2VJbnN0YW5jZUxpc3Quc2l6ZSgpID09IDEpOworCQlDb21wb25lbnRJbnN0YW5jZSByZXNvdXJjZUluc3RhbmNlID0gcmVzb3VyY2VJbnN0YW5jZUxpc3QuZ2V0KDApOworCQlhc3NlcnRUcnVlKHJlc291cmNlSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLnNpemUoKSA9PSAxKTsKKwkJTWFwPFN0cmluZywgQXJ0aWZhY3REZWZpbml0aW9uPiBhcnRpZmFjdHMgPSByZXNvdXJjZUluc3RhbmNlLmdldERlcGxveW1lbnRBcnRpZmFjdHMoKTsKKwkJYXNzZXJ0Tm90TnVsbChhcnRpZmFjdHMuZ2V0KGFkZEFydGlmYWN0VG9SZXNvdXJjZS5nZXRBcnRpZmFjdExhYmVsKCkpKTsKKworCQlBcnRpZmFjdERlZmluaXRpb24gaGVhdEVudkFydGlmYWN0ID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbihhZGRBcnRpZmFjdFRvUmVzb3VyY2UpOworCQloZWF0RW52QXJ0aWZhY3Quc2V0QXJ0aWZhY3RUeXBlKCJIRUFUX0VOViIpOworCQloZWF0RW52QXJ0aWZhY3Quc2V0QXJ0aWZhY3RMYWJlbChhZGRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0QXJ0aWZhY3RMYWJlbCgpICsgImVudiIpOworCQloZWF0RW52QXJ0aWZhY3Quc2V0VW5pcXVlSWQobnVsbCk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gYXJ0aWZhY3RPcGVyYXRpb24uYWRkSGVhdEVudkFydGlmYWN0KAorCQkJCWhlYXRFbnZBcnRpZmFjdCwgYWRkQXJ0aWZhY3RUb1Jlc291cmNlLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLAorCQkJCWZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXIuaXNMZWZ0KCkpOworCisJCXJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbi5nZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudChzZXJ2aWNlSWQsCisJCQkJTm9kZVR5cGVFbnVtLlNlcnZpY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSk7CisJCWFzc2VydFRydWUocmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2UuaXNMZWZ0KCkpOworCQlyZXNvdXJjZUluc3RhbmNlTGlzdCA9IHJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmxlZnQ7CisJCWFzc2VydFRydWUocmVzb3VyY2VJbnN0YW5jZUxpc3Quc2l6ZSgpID09IDEpOworCQlyZXNvdXJjZUluc3RhbmNlID0gcmVzb3VyY2VJbnN0YW5jZUxpc3QuZ2V0KDApOworCQlhc3NlcnRUcnVlKHJlc291cmNlSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpLnNpemUoKSA9PSAyKTsKKwkJYXJ0aWZhY3RzID0gcmVzb3VyY2VJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCk7CisJCWFzc2VydE5vdE51bGwoYXJ0aWZhY3RzLmdldChhZGRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0QXJ0aWZhY3RMYWJlbCgpKSk7CisJCWFzc2VydE5vdE51bGwoYXJ0aWZhY3RzLmdldChhZGRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0QXJ0aWZhY3RMYWJlbCgpICsgImVudiIpKTsKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRFbnZGcm9tUkkgPSBhcnRpZmFjdHMuZ2V0KGFkZEFydGlmYWN0VG9SZXNvdXJjZS5nZXRBcnRpZmFjdExhYmVsKCkgKyAiZW52Iik7CisJCWFzc2VydEVxdWFscyhhZGRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgaGVhdEVudkZyb21SSS5nZXRHZW5lcmF0ZWRGcm9tSWQoKSk7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMgPSBhcnRpZmFjdHMuZ2V0KGFkZEFydGlmYWN0VG9SZXNvdXJjZS5nZXRBcnRpZmFjdExhYmVsKCkpCisJCQkJLmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCWFzc2VydE5vdE51bGwoaGVhdFBhcmFtZXRlcnMpOworCQlhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzLnNpemUoKSA9PSAxKTsKKworCQlMaXN0PEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uPiBoZWF0RW52UGFyYW1ldGVycyA9IGhlYXRFbnZGcm9tUkkuZ2V0SGVhdFBhcmFtZXRlcnMoKTsKKwkJYXNzZXJ0Tm90TnVsbChoZWF0RW52UGFyYW1ldGVycyk7CisJCWFzc2VydFRydWUoaGVhdEVudlBhcmFtZXRlcnMuc2l6ZSgpID09IDEpOworCisJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2VJbnN0YW5jZVdpdGhBcnRpZmFjdHMoKSB7CisJCVN0cmluZyByb290TmFtZSA9ICJ0b3NjYS5ub2Rlcy50ZXN0LnJvb3QiOworCisJCVNlcnZpY2VNZXRhZGF0YURhdGEgb3JpZ1NlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlKCJkZWxldGVSZXNvdXJjZUluc3RhbmNlV2l0aEFydGlmYWN0cyIpOworCQlTdHJpbmcgc2VydmljZUlkID0gKFN0cmluZykgb3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlSZXNvdXJjZU9wZXJhdGlvblRlc3QgcmVzb3VyY2VPcGVyYXRpb25UZXN0ID0gbmV3IFJlc291cmNlT3BlcmF0aW9uVGVzdCgpOworCQlyZXNvdXJjZU9wZXJhdGlvblRlc3Quc2V0T3BlcmF0aW9ucyh0aXRhbkRhbywgcmVzb3VyY2VPcGVyYXRpb24sIHByb3BlcnR5T3BlcmF0aW9uKTsKKworCQlSZXNvdXJjZSByb290UmVzb3VyY2UgPSBjcmVhdGVSb290UmVzb3VyY2Uocm9vdE5hbWUsIHJlc291cmNlT3BlcmF0aW9uVGVzdCk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBhZGRBcnRpZmFjdFRvUmVzb3VyY2UgPSBhZGRBcnRpZmFjdFRvUmVzb3VyY2UoVVNFUl9JRCwgcm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksCisJCQkJIm15QXJ0aWZhY3QiKTsKKworCQkvLyByZXNvdXJjZTEKKwkJQ29tcG9uZW50SW5zdGFuY2UgbXlyZXNvdXJjZUluc3RhbmNlID0gYnVpbGRSZXNvdXJjZUluc3RhbmNlKHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLCAiMSIsIHJvb3ROYW1lKTsKKworCQlFaXRoZXI8Q29tcG9uZW50SW5zdGFuY2UsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBteWluc3RhbmNlUmVzID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5hZGRDb21wb25lbnRJbnN0YW5jZVRvQ29udGFpbmVyQ29tcG9uZW50KHNlcnZpY2VJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsICIxIiwgdHJ1ZSwKKwkJCQkJCW15cmVzb3VyY2VJbnN0YW5jZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlLCBmYWxzZSk7CisKKwkJQXJ0aWZhY3REZWZpbml0aW9uIGhlYXRFbnZBcnRpZmFjdCA9IG5ldyBBcnRpZmFjdERlZmluaXRpb24oYWRkQXJ0aWZhY3RUb1Jlc291cmNlKTsKKwkJaGVhdEVudkFydGlmYWN0LnNldEFydGlmYWN0VHlwZSgiSEVBVF9FTlYiKTsKKwkJaGVhdEVudkFydGlmYWN0LnNldEFydGlmYWN0TGFiZWwoYWRkQXJ0aWZhY3RUb1Jlc291cmNlLmdldEFydGlmYWN0TGFiZWwoKSArICJlbnYiKTsKKwkJaGVhdEVudkFydGlmYWN0LnNldFVuaXF1ZUlkKG51bGwpOworCisJCWFzc2VydFRydWUoImNoZWNrIGluc3RhbmNlIGFkZGVkIHRvIHNlcnZpY2UiLCBteWluc3RhbmNlUmVzLmlzTGVmdCgpKTsKKworCQlFaXRoZXI8SW1tdXRhYmxlUGFpcjxMaXN0PENvbXBvbmVudEluc3RhbmNlPiwgTGlzdDxSZXF1aXJlbWVudENhcGFiaWxpdHlSZWxEZWY+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5nZXRDb21wb25lbnRJbnN0YW5jZXNPZkNvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UpOworCQlhc3NlcnRUcnVlKHJlc291cmNlSW5zdGFuY2VzT2ZTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJTGlzdDxDb21wb25lbnRJbnN0YW5jZT4gcmVzb3VyY2VJbnN0YW5jZUxpc3QgPSByZXNvdXJjZUluc3RhbmNlc09mU2VydmljZS5sZWZ0KCkudmFsdWUoKS5sZWZ0OworCQlhc3NlcnRUcnVlKHJlc291cmNlSW5zdGFuY2VMaXN0LnNpemUoKSA9PSAxKTsKKwkJQ29tcG9uZW50SW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA9IHJlc291cmNlSW5zdGFuY2VMaXN0LmdldCgwKTsKKworCQlFaXRoZXI8QXJ0aWZhY3REZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXIgPSBhcnRpZmFjdE9wZXJhdGlvbi5hZGRIZWF0RW52QXJ0aWZhY3QoCisJCQkJaGVhdEVudkFydGlmYWN0LCBhZGRBcnRpZmFjdFRvUmVzb3VyY2UsIHJlc291cmNlSW5zdGFuY2UuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlJlc291cmNlSW5zdGFuY2UsCisJCQkJZmFsc2UpOworCQlhc3NlcnRUcnVlKGVpdGhlci5pc0xlZnQoKSk7CisJCUFydGlmYWN0RGVmaW5pdGlvbiBoZWF0RW52RGVmaW5pdGlvbiA9IGVpdGhlci5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBkZWxldGUgcmVzb3VyY2UgaW5zdGFuY2UKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZXNvdXJjZUluc3RhbmNlID0gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbgorCQkJCS5kZWxldGVDb21wb25lbnRJbnN0YW5jZShOb2RlVHlwZUVudW0uU2VydmljZSwgc2VydmljZUlkLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVJlc291cmNlSW5zdGFuY2UuaXNMZWZ0KCkpOworCisJCS8vIGNoZWNrIGhlYXQgZW52IGRlbGV0ZWQKKwkJQXJ0aWZhY3REYXRhIGFydGlmYWN0RGF0YSA9IG5ldyBBcnRpZmFjdERhdGEoKTsKKwkJRWl0aGVyPEFydGlmYWN0RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGdldERlbGV0ZWRBcnRpZmFjdCA9IHRpdGFuRGFvLmdldE5vZGUoYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkS2V5KCksCisJCQkJaGVhdEVudkRlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgQXJ0aWZhY3REYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZShnZXREZWxldGVkQXJ0aWZhY3QuaXNSaWdodCgpKTsKKworCQkvLyBjaGVjayBoZWF0IGlzIG5vdCBkZWxldGVkCisJCWdldERlbGV0ZWRBcnRpZmFjdCA9IHRpdGFuRGFvLmdldE5vZGUoYXJ0aWZhY3REYXRhLmdldFVuaXF1ZUlkS2V5KCksIGFkZEFydGlmYWN0VG9SZXNvdXJjZS5nZXRVbmlxdWVJZCgpLAorCQkJCUFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoZ2V0RGVsZXRlZEFydGlmYWN0LmlzTGVmdCgpKTsKKworCQlIZWF0UGFyYW1ldGVyRGF0YSBoZWF0UGFyYW1EYXRhID0gbmV3IEhlYXRQYXJhbWV0ZXJEYXRhKCk7CisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGhlYXRQYXJhbU5vZGUgPSB0aXRhbkRhby5nZXROb2RlKGhlYXRQYXJhbURhdGEuZ2V0VW5pcXVlSWRLZXkoKSwKKwkJCQlhZGRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0SGVhdFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VW5pcXVlSWQoKSwgSGVhdFBhcmFtZXRlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGhlYXRQYXJhbU5vZGUuaXNMZWZ0KCkpOworCisJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0SGVhdEVudlBhcmFtcygpIHsKKwkJU3RyaW5nIHJvb3ROYW1lID0gInRvc2NhLm5vZGVzLnRlc3Qucm9vdCI7CisKKwkJU2VydmljZU1ldGFkYXRhRGF0YSBvcmlnU2VydmljZSA9IGNyZWF0ZVNlcnZpY2UoImdldEhlYXRFbnZQYXJhbXMiKTsKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IChTdHJpbmcpIG9yaWdTZXJ2aWNlLmdldFVuaXF1ZUlkKCk7CisKKwkJUmVzb3VyY2VPcGVyYXRpb25UZXN0IHJlc291cmNlT3BlcmF0aW9uVGVzdCA9IG5ldyBSZXNvdXJjZU9wZXJhdGlvblRlc3QoKTsKKwkJcmVzb3VyY2VPcGVyYXRpb25UZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIHJlc291cmNlT3BlcmF0aW9uLCBwcm9wZXJ0eU9wZXJhdGlvbik7CisKKwkJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gY3JlYXRlUm9vdFJlc291cmNlKHJvb3ROYW1lLCByZXNvdXJjZU9wZXJhdGlvblRlc3QpOworCQlBcnRpZmFjdERlZmluaXRpb24gYWRkQXJ0aWZhY3RUb1Jlc291cmNlID0gYWRkQXJ0aWZhY3RUb1Jlc291cmNlKFVTRVJfSUQsIHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpLAorCQkJCSJteUFydGlmYWN0Iik7CisKKwkJLy8gcmVzb3VyY2UxCisJCUNvbXBvbmVudEluc3RhbmNlIG15cmVzb3VyY2VJbnN0YW5jZSA9IGJ1aWxkUmVzb3VyY2VJbnN0YW5jZShyb290UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSwgIjEiLCByb290TmFtZSk7CisKKwkJRWl0aGVyPENvbXBvbmVudEluc3RhbmNlLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gbXlpbnN0YW5jZVJlcyA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuYWRkQ29tcG9uZW50SW5zdGFuY2VUb0NvbnRhaW5lckNvbXBvbmVudChzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCAiMSIsIHRydWUsCisJCQkJCQlteXJlc291cmNlSW5zdGFuY2UsIE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgZmFsc2UpOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBoZWF0RW52QXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3REZWZpbml0aW9uKGFkZEFydGlmYWN0VG9SZXNvdXJjZSk7CisJCWhlYXRFbnZBcnRpZmFjdC5zZXRBcnRpZmFjdFR5cGUoIkhFQVRfRU5WIik7CisJCWhlYXRFbnZBcnRpZmFjdC5zZXRBcnRpZmFjdExhYmVsKGFkZEFydGlmYWN0VG9SZXNvdXJjZS5nZXRBcnRpZmFjdExhYmVsKCkgKyAiZW52Iik7CisJCWhlYXRFbnZBcnRpZmFjdC5zZXRVbmlxdWVJZChudWxsKTsKKworCQlhc3NlcnRUcnVlKCJjaGVjayBpbnN0YW5jZSBhZGRlZCB0byBzZXJ2aWNlIiwgbXlpbnN0YW5jZVJlcy5pc0xlZnQoKSk7CisKKwkJRWl0aGVyPEltbXV0YWJsZVBhaXI8TGlzdDxDb21wb25lbnRJbnN0YW5jZT4sIExpc3Q8UmVxdWlyZW1lbnRDYXBhYmlsaXR5UmVsRGVmPj4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXNvdXJjZUluc3RhbmNlc09mU2VydmljZSA9IHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24KKwkJCQkuZ2V0Q29tcG9uZW50SW5zdGFuY2VzT2ZDb21wb25lbnQoc2VydmljZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUluc3RhbmNlc09mU2VydmljZS5pc0xlZnQoKSk7CisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+IHJlc291cmNlSW5zdGFuY2VMaXN0ID0gcmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2UubGVmdCgpLnZhbHVlKCkubGVmdDsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUluc3RhbmNlTGlzdC5zaXplKCkgPT0gMSk7CisJCUNvbXBvbmVudEluc3RhbmNlIHJlc291cmNlSW5zdGFuY2UgPSByZXNvdXJjZUluc3RhbmNlTGlzdC5nZXQoMCk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gYXJ0aWZhY3RPcGVyYXRpb24uYWRkSGVhdEVudkFydGlmYWN0KAorCQkJCWhlYXRFbnZBcnRpZmFjdCwgYWRkQXJ0aWZhY3RUb1Jlc291cmNlLCByZXNvdXJjZUluc3RhbmNlLmdldFVuaXF1ZUlkKCksIE5vZGVUeXBlRW51bS5SZXNvdXJjZUluc3RhbmNlLAorCQkJCWZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShlaXRoZXIuaXNMZWZ0KCkpOworCQlBcnRpZmFjdERlZmluaXRpb24gaGVhdEVudkRlZmluaXRpb24gPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gdXBkYXRlIHZhbHVlCisJCVN0cmluZyBuZXdIZWF0VmFsdWUgPSAiMTIzIjsKKwkJYWRkSGVhdFZhbHVlVG9FbnYoaGVhdEVudkRlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSwgYWRkQXJ0aWZhY3RUb1Jlc291cmNlLmdldEhlYXRQYXJhbWV0ZXJzKCkuZ2V0KDApLAorCQkJCW5ld0hlYXRWYWx1ZSk7CisKKwkJLy8gY2hlY2sgdmFsdWVzIHJlY2VpdmVkCisKKwkJcmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2UgPSByZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uLmdldENvbXBvbmVudEluc3RhbmNlc09mQ29tcG9uZW50KHNlcnZpY2VJZCwKKwkJCQlOb2RlVHlwZUVudW0uU2VydmljZSwgTm9kZVR5cGVFbnVtLlJlc291cmNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUluc3RhbmNlc09mU2VydmljZS5pc0xlZnQoKSk7CisJCXJlc291cmNlSW5zdGFuY2VMaXN0ID0gcmVzb3VyY2VJbnN0YW5jZXNPZlNlcnZpY2UubGVmdCgpLnZhbHVlKCkubGVmdDsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUluc3RhbmNlTGlzdC5zaXplKCkgPT0gMSk7CisJCXJlc291cmNlSW5zdGFuY2UgPSByZXNvdXJjZUluc3RhbmNlTGlzdC5nZXQoMCk7CisJCWFzc2VydFRydWUocmVzb3VyY2VJbnN0YW5jZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkuc2l6ZSgpID09IDIpOworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHJlc291cmNlSW5zdGFuY2UuZ2V0RGVwbG95bWVudEFydGlmYWN0cygpOworCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0cy5nZXQoYWRkQXJ0aWZhY3RUb1Jlc291cmNlLmdldEFydGlmYWN0TGFiZWwoKSkpOworCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0cy5nZXQoYWRkQXJ0aWZhY3RUb1Jlc291cmNlLmdldEFydGlmYWN0TGFiZWwoKSArICJlbnYiKSk7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtZXRlcnMgPSBhcnRpZmFjdHMuZ2V0KGFkZEFydGlmYWN0VG9SZXNvdXJjZS5nZXRBcnRpZmFjdExhYmVsKCkpCisJCQkJLmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCWFzc2VydE5vdE51bGwoaGVhdFBhcmFtZXRlcnMpOworCQlhc3NlcnRUcnVlKGhlYXRQYXJhbWV0ZXJzLnNpemUoKSA9PSAxKTsKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtZXRlclRlbXBsYXRlID0gaGVhdFBhcmFtZXRlcnMuZ2V0KDApOworCisJCUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+IGhlYXRFbnZQYXJhbWV0ZXJzID0gYXJ0aWZhY3RzCisJCQkJLmdldChhZGRBcnRpZmFjdFRvUmVzb3VyY2UuZ2V0QXJ0aWZhY3RMYWJlbCgpICsgImVudiIpLmdldEhlYXRQYXJhbWV0ZXJzKCk7CisJCWFzc2VydE5vdE51bGwoaGVhdEVudlBhcmFtZXRlcnMpOworCQlhc3NlcnRUcnVlKGhlYXRFbnZQYXJhbWV0ZXJzLnNpemUoKSA9PSAxKTsKKwkJSGVhdFBhcmFtZXRlckRlZmluaXRpb24gaGVhdFBhcmFtZXRlckVudiA9IGhlYXRFbnZQYXJhbWV0ZXJzLmdldCgwKTsKKworCQlhc3NlcnRFcXVhbHMoaGVhdFBhcmFtZXRlckVudi5nZXREZWZhdWx0VmFsdWUoKSwgaGVhdFBhcmFtZXRlclRlbXBsYXRlLmdldEN1cnJlbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ld0hlYXRWYWx1ZSwgaGVhdFBhcmFtZXRlckVudi5nZXRDdXJyZW50VmFsdWUoKSk7CisJCWFzc2VydEZhbHNlKG5ld0hlYXRWYWx1ZS5lcXVhbHMoaGVhdFBhcmFtZXRlclRlbXBsYXRlLmdldEN1cnJlbnRWYWx1ZSgpKSk7CisKKwkJcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCisJfQorCisJcHVibGljIHZvaWQgYWRkSGVhdFZhbHVlVG9FbnYoU3RyaW5nIGFydGlmYWN0SWQsIEhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXREZWZpbml0aW9uLCBTdHJpbmcgdmFsdWUpIHsKKwkJSGVhdFBhcmFtZXRlclZhbHVlRGF0YSBoZWF0VmFsdWVEYXRhID0gbmV3IEhlYXRQYXJhbWV0ZXJWYWx1ZURhdGEoKTsKKwkJaGVhdFZhbHVlRGF0YS5zZXRWYWx1ZSh2YWx1ZSk7CisJCWhlYXRWYWx1ZURhdGEuc2V0VW5pcXVlSWQoYXJ0aWZhY3RJZCArICIuIiArIGhlYXREZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCUVpdGhlcjxIZWF0UGFyYW1ldGVyVmFsdWVEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlVmFsdWUgPSB0aXRhbkRhby5jcmVhdGVOb2RlKGhlYXRWYWx1ZURhdGEsCisJCQkJSGVhdFBhcmFtZXRlclZhbHVlRGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoY3JlYXRlVmFsdWUuaXNMZWZ0KCkpOworCQlIZWF0UGFyYW1ldGVyVmFsdWVEYXRhIHZhbHVlMiA9IGNyZWF0ZVZhbHVlLmxlZnQoKS52YWx1ZSgpOworCQlIZWF0UGFyYW1ldGVyRGF0YSBoZWF0UGFyYW1EYXRhID0gbmV3IEhlYXRQYXJhbWV0ZXJEYXRhKGhlYXREZWZpbml0aW9uKTsKKwkJRWl0aGVyPEdyYXBoUmVsYXRpb24sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVSZWxhdGlvbiA9IHRpdGFuRGFvLmNyZWF0ZVJlbGF0aW9uKHZhbHVlMiwgaGVhdFBhcmFtRGF0YSwKKwkJCQlHcmFwaEVkZ2VMYWJlbHMuUFJPUEVSVFlfSU1QTCwgbnVsbCk7CisJCWFzc2VydFRydWUoY3JlYXRlUmVsYXRpb24uaXNMZWZ0KCkpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCXByb3BzLnB1dChHcmFwaEVkZ2VQcm9wZXJ0aWVzRGljdGlvbmFyeS5OQU1FLmdldFByb3BlcnR5KCksIGhlYXREZWZpbml0aW9uLmdldE5hbWUoKSk7CisJCUVpdGhlcjxHcmFwaFJlbGF0aW9uLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlUmVsYXRpb24yID0gdGl0YW5EYW8uY3JlYXRlUmVsYXRpb24oCisJCQkJbmV3IFVuaXF1ZUlkRGF0YShOb2RlVHlwZUVudW0uQXJ0aWZhY3RSZWYsIGFydGlmYWN0SWQpLCB2YWx1ZTIsIEdyYXBoRWRnZUxhYmVscy5QQVJBTUVURVJfVkFMVUUsIHByb3BzKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVSZWxhdGlvbjIuaXNMZWZ0KCkpOworCQl0aXRhbkRhby5jb21taXQoKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGlzZUNvbXBvbmVudE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nW10gc3BsaXQgPSBzcGxpdENvbXBvbmVudE5hbWUobmFtZSk7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChTdHJpbmcgc3BsaXRFbGVtZW50IDogc3BsaXQpIHsKKwkJCXNiLmFwcGVuZChzcGxpdEVsZW1lbnQpOworCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc3BsaXRDb21wb25lbnROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBub3JtYWxpemVkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBDT01QT05FTlRfTkFNRV9ERUxJTUVURVJfUEFUVEVSTi5tYXRjaGVyKG5vcm1hbGl6ZWROYW1lKS5yZXBsYWNlQWxsKCIgIik7CisJCVN0cmluZ1tdIHNwbGl0ID0gbm9ybWFsaXplZE5hbWUuc3BsaXQoIiAiKTsKKwkJcmV0dXJuIHNwbGl0OworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGlzZUNvbXBvbmVudEluc3RhbmNlTmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmdbXSBzcGxpdCA9IHNwbGl0Q29tcG9uZW50SW5zdGFuY2VOYW1lKG5hbWUpOworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoU3RyaW5nIHNwbGl0RWxlbWVudCA6IHNwbGl0KSB7CisJCQlzYi5hcHBlbmQoc3BsaXRFbGVtZW50KTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNwbGl0Q29tcG9uZW50SW5zdGFuY2VOYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBub3JtYWxpemVkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKwkJbm9ybWFsaXplZE5hbWUgPSBDT01QT05FTlRfSU5DVEFOQ0VfTkFNRV9ERUxJTUVURVJfUEFUVEVSTi5tYXRjaGVyKG5vcm1hbGl6ZWROYW1lKS5yZXBsYWNlQWxsKCIgIik7CisJCVN0cmluZ1tdIHNwbGl0ID0gbm9ybWFsaXplZE5hbWUuc3BsaXQoIiAiKTsKKwkJcmV0dXJuIHNwbGl0OworCX0KKworCXByaXZhdGUgQXJ0aWZhY3REZWZpbml0aW9uIGFkZEFydGlmYWN0VG9SZXNvdXJjZShTdHJpbmcgdXNlcklkLCBTdHJpbmcgcmVzb3VyY2VJZCwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3ROYW1lICsgIi55bWwiKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZSgiSEVBVCIpOworCQlhcnRpZmFjdEluZm8uc2V0RGVzY3JpcHRpb24oImhka2Zoc2tkZmdoIik7CisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdENoZWNrc3VtKCJVRXNEQkFvQUFBQUlBQWVMYjBiRFF6Iik7CisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdEdyb3VwVHlwZShBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCk7CisKKwkJYXJ0aWZhY3RJbmZvLnNldFVzZXJJZENyZWF0b3IodXNlcklkKTsKKwkJU3RyaW5nIGZ1bGxOYW1lID0gIkppbSBIIjsKKwkJYXJ0aWZhY3RJbmZvLnNldFVwZGF0ZXJGdWxsTmFtZShmdWxsTmFtZSk7CisJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlhcnRpZmFjdEluZm8uc2V0Q3JlYXRvckZ1bGxOYW1lKGZ1bGxOYW1lKTsKKwkJYXJ0aWZhY3RJbmZvLnNldENyZWF0aW9uRGF0ZSh0aW1lKTsKKwkJYXJ0aWZhY3RJbmZvLnNldExhc3RVcGRhdGVEYXRlKHRpbWUpOworCQlhcnRpZmFjdEluZm8uc2V0VXNlcklkTGFzdFVwZGF0ZXIodXNlcklkKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0TGFiZWwoYXJ0aWZhY3ROYW1lKTsKKwkJYXJ0aWZhY3RJbmZvLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZFByb3BlcnR5VW5pcXVlSWQocmVzb3VyY2VJZCwgYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSkpOworCQlhcnRpZmFjdEluZm8uc2V0RXNJZChhcnRpZmFjdEluZm8uZ2V0VW5pcXVlSWQoKSk7CisKKwkJTGlzdDxIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbj4gaGVhdFBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8SGVhdFBhcmFtZXRlckRlZmluaXRpb24+KCk7CisJCUhlYXRQYXJhbWV0ZXJEZWZpbml0aW9uIGhlYXRQYXJhbSA9IG5ldyBIZWF0UGFyYW1ldGVyRGVmaW5pdGlvbigpOworCQloZWF0UGFyYW0uc2V0Q3VycmVudFZhbHVlKCIxMSIpOworCQloZWF0UGFyYW0uc2V0RGVmYXVsdFZhbHVlKCIyMiIpOworCQloZWF0UGFyYW0uc2V0RGVzY3JpcHRpb24oImRlc2MiKTsKKwkJaGVhdFBhcmFtLnNldE5hbWUoIm15UGFyYW0iKTsKKwkJaGVhdFBhcmFtLnNldFR5cGUoIm51bWJlciIpOworCQloZWF0UGFyYW1zLmFkZChoZWF0UGFyYW0pOworCQlhcnRpZmFjdEluZm8uc2V0SGVhdFBhcmFtZXRlcnMoaGVhdFBhcmFtcyk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3QgPSBhcnRpZmFjdE9wZXJhdGlvbgorCQkJCS5hZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3RJbmZvLCByZXNvdXJjZUlkLCBOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHRydWUsIHRydWUpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0LmlzTGVmdCgpKTsKKwkJcmV0dXJuIGFydGlmYWN0LmxlZnQoKS52YWx1ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvUmVzb3VyY2VPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1Jlc291cmNlT3BlcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Nzc1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1Jlc291cmNlT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzM0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLmdyYXBoLmRhdGF0eXBlLkdyYXBoRWRnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTW9kZWxUZXN0QmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuUHJvcGVydHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLkxpZmVjeWNsZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuUHJvcGVydHlPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLlJlc291cmNlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5VbmlxdWVJZEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWwuT3BlcmF0aW9uVGVzdHNVdGlsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLlRvc2NhVHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC50b3NjYS5jb25zdHJhaW50cy5HcmVhdGVyVGhhbkNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuSW5SYW5nZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29uc3RyYWludHMuTGVzc09yRXF1YWxDb25zdHJhaW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlByb3BlcnR5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5SZXNvdXJjZU1ldGFkYXRhRGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5yZXNvdXJjZXMuZGF0YS5Vc2VyRGF0YTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0LkNvbnRleHRDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsudGVzdC5jb250ZXh0Lmp1bml0NC5TcHJpbmdKVW5pdDRDbGFzc1J1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAUnVuV2l0aChTcHJpbmdKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK0BDb250ZXh0Q29uZmlndXJhdGlvbigiY2xhc3NwYXRoOmFwcGxpY2F0aW9uLWNvbnRleHQtdGVzdC54bWwiKQorcHVibGljIGNsYXNzIFJlc291cmNlT3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZGVsVGVzdEJhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc291cmNlT3BlcmF0aW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAidGl0YW4tZ2VuZXJpYy1kYW8iKQorCXByaXZhdGUgVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJyZXNvdXJjZS1vcGVyYXRpb24iKQorCXByaXZhdGUgUmVzb3VyY2VPcGVyYXRpb24gcmVzb3VyY2VPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gInByb3BlcnR5LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBQcm9wZXJ0eU9wZXJhdGlvbiBwcm9wZXJ0eU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAibGlmZWN5Y2xlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBMaWZlY3ljbGVPcGVyYXRpb24gbGlmZWN5Y2xlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJjYXBhYmlsaXR5LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImNhcGFiaWxpdHktdHlwZS1vcGVyYXRpb24iKQorCXByaXZhdGUgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTkFNRSA9ICJjYXRlZ29yeS9teWNhdGVnb3J5IjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTkFNRV9VUERBVEVEID0gImNhdGVnb3J5MS91cGRhdGVkY2F0ZWdvcnkiOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQmVmb3JlQ2xhc3MoKSB7CisKKwkJTW9kZWxUZXN0QmFzZS5pbml0KCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3BlcmF0aW9ucyhUaXRhbkdlbmVyaWNEYW8gdGl0YW5HZW5lcmljRGFvLCBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbiwKKwkJCVByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uKSB7CisJCXRoaXMudGl0YW5EYW8gPSB0aXRhbkdlbmVyaWNEYW87CisJCXRoaXMucmVzb3VyY2VPcGVyYXRpb24gPSByZXNvdXJjZU9wZXJhdGlvbjsKKwkJdGhpcy5wcm9wZXJ0eU9wZXJhdGlvbiA9IHByb3BlcnR5T3BlcmF0aW9uOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZHVtbXlUZXN0KCkgeworCisJfQorCisJcHJpdmF0ZSBSZXNvdXJjZSBidWlsZFJlc291cmNlTWV0YWRhdGEoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgcmVzb3VyY2VOYW1lLAorCQkJU3RyaW5nIHJlc291cmNlVmVyc2lvbikgeworCisJCVJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7CisJCXJlc291cmNlLnNldE5hbWUocmVzb3VyY2VOYW1lKTsKKwkJcmVzb3VyY2Uuc2V0VmVyc2lvbihyZXNvdXJjZVZlcnNpb24pOworCQk7CisJCXJlc291cmNlLnNldERlc2NyaXB0aW9uKCJkZXNjcmlwdGlvbiAxIik7CisJCXJlc291cmNlLnNldEFic3RyYWN0KGZhbHNlKTsKKwkJcmVzb3VyY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VySWQpOworCQlyZXNvdXJjZS5zZXRDb250YWN0SWQoImNvbnRhY3RJZEBzZGMuY29tIik7CisJCXJlc291cmNlLnNldFZlbmRvck5hbWUoInZlbmRvciAxIik7CisJCXJlc291cmNlLnNldFZlbmRvclJlbGVhc2UoIjEuMC4wIik7CisJCXJlc291cmNlLnNldFRvc2NhUmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7CisJCVN0cmluZ1tdIGNhdGVnb3J5QXJyID0gY2F0ZWdvcnkuc3BsaXQoIi8iKTsKKwkJcmVzb3VyY2UuYWRkQ2F0ZWdvcnkoY2F0ZWdvcnlBcnJbMF0sIGNhdGVnb3J5QXJyWzFdKTsKKwkJcmVzb3VyY2Uuc2V0SWNvbigiaW1hZ2VzL215LnBuZyIpOworCQlMaXN0PFN0cmluZz4gdGFncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0YWdzLmFkZCgiVEFHMSIpOworCQl0YWdzLmFkZCgiVEFHMiIpOworCQlyZXNvdXJjZS5zZXRUYWdzKHRhZ3MpOworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHJpdmF0ZSBVc2VyRGF0YSBkZWxldGVBbmRDcmVhdGVVc2VyKFN0cmluZyB1c2VySWQsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG5ldyBVc2VyRGF0YSgpOworCQl1c2VyRGF0YS5zZXRVc2VySWQodXNlcklkKTsKKwkJdXNlckRhdGEuc2V0Rmlyc3ROYW1lKGZpcnN0TmFtZSk7CisJCXVzZXJEYXRhLnNldExhc3ROYW1lKGxhc3ROYW1lKTsKKworCQl0aXRhbkRhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNyZWF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCXByaXZhdGUgdm9pZCBkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKKwkJU3RyaW5nW10gbmFtZXMgPSBjYXRlZ29yeS5zcGxpdCgiLyIpOworCQlPcGVyYXRpb25UZXN0c1V0aWwuZGVsZXRlQW5kQ3JlYXRlUmVzb3VyY2VDYXRlZ29yeShuYW1lc1swXSwgbmFtZXNbMV0sIHRpdGFuRGFvKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgcmVzb3VyY2VWZXJzaW9uLAorCQkJU3RyaW5nIHBhcmVudFJlc291cmNlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGlzSGlnaGVzdFZlcnNpb24pIHsKKworCQlTdHJpbmcgcHJvcE5hbWUxID0gImRpc2tfc2l6ZSI7CisJCVN0cmluZyBwcm9wTmFtZTIgPSAibnVtX2NwdXMiOworCisJCUxpc3Q8U3RyaW5nPiBkZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZiAocGFyZW50UmVzb3VyY2VOYW1lICE9IG51bGwpIHsKKwkJCWRlcml2ZWRGcm9tLmFkZChwYXJlbnRSZXNvdXJjZU5hbWUpOworCQl9CisJCVJlc291cmNlIHJlc291cmNlID0gYnVpbGRSZXNvdXJjZU1ldGFkYXRhKHVzZXJJZCwgY2F0ZWdvcnksIHJlc291cmNlTmFtZSwgcmVzb3VyY2VWZXJzaW9uKTsKKworCQlyZXNvdXJjZS5zZXRBYnN0cmFjdChpc0Fic3RyYWN0KTsKKwkJcmVzb3VyY2Uuc2V0SGlnaGVzdFZlcnNpb24oaXNIaWdoZXN0VmVyc2lvbik7CisKKwkJTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+KCk7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5MSA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcHJvcGVydHkxLnNldERlZmF1bHRWYWx1ZSgiMTAiKTsKKwkJcHJvcGVydHkxLnNldERlc2NyaXB0aW9uKAorCQkJCSJTaXplIG9mIHRoZSBsb2NhbCBkaXNrLCBpbiBHaWdhYnl0ZXMgKEdCKSwgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBDb21wdXRlIG5vZGUuIik7CisJCXByb3BlcnR5MS5zZXRUeXBlKFRvc2NhVHlwZS5JTlRFR0VSLm5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKKwkJTGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNvbnN0cmFpbnQ+KCk7CisJCUdyZWF0ZXJUaGFuQ29uc3RyYWludCBwcm9wZXJ0eUNvbnN0cmFpbnQxID0gbmV3IEdyZWF0ZXJUaGFuQ29uc3RyYWludCgiMCIpOworCQlsb2cuZGVidWcoInt9IiwgcHJvcGVydHlDb25zdHJhaW50MSk7CisKKwkJY29uc3RyYWludHMuYWRkKHByb3BlcnR5Q29uc3RyYWludDEpOworCisJCUxlc3NPckVxdWFsQ29uc3RyYWludCBwcm9wZXJ0eUNvbnN0cmFpbnQyID0gbmV3IExlc3NPckVxdWFsQ29uc3RyYWludCgiMTAiKTsKKwkJY29uc3RyYWludHMuYWRkKHByb3BlcnR5Q29uc3RyYWludDIpOworCisJCXByb3BlcnR5MS5zZXRDb25zdHJhaW50cyhjb25zdHJhaW50cyk7CisKKwkJcHJvcGVydGllcy5wdXQocHJvcE5hbWUxLCBwcm9wZXJ0eTEpOworCisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eTIgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5Mi5zZXREZWZhdWx0VmFsdWUoIjIiKTsKKwkJcHJvcGVydHkyLnNldERlc2NyaXB0aW9uKCJOdW1iZXIgb2YgKGFjdHVhbCBvciB2aXJ0dWFsKSBDUFVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29tcHV0ZSBub2RlLiIpOworCQlwcm9wZXJ0eTIuc2V0VHlwZShUb3NjYVR5cGUuSU5URUdFUi5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCUxpc3Q8UHJvcGVydHlDb25zdHJhaW50PiBjb25zdHJhaW50czMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q29uc3RyYWludD4oKTsKKwkJTGlzdDxTdHJpbmc+IHJhbmdlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJhbmdlLmFkZCgiMSIpOworCQlyYW5nZS5hZGQoIjQiKTsKKworCQlJblJhbmdlQ29uc3RyYWludCBwcm9wZXJ0eUNvbnN0cmFpbnQzID0gbmV3IEluUmFuZ2VDb25zdHJhaW50KHJhbmdlKTsKKwkJY29uc3RyYWludHMzLmFkZChwcm9wZXJ0eUNvbnN0cmFpbnQzKTsKKwkJLy8gcHJvcGVydHkyLnNldENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzMyk7CisJCXByb3BlcnR5Mi5zZXRDb25zdHJhaW50cyhjb25zdHJhaW50czMpOworCQlwcm9wZXJ0aWVzLnB1dChwcm9wTmFtZTIsIHByb3BlcnR5Mik7CisKKwkJcmVzb3VyY2Uuc2V0RGVyaXZlZEZyb20oZGVyaXZlZEZyb20pOworCisJCXJlc291cmNlLnNldFByb3BlcnRpZXMoY29udmVydE1hcFRvTGlzdChwcm9wZXJ0aWVzKSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSByZXNvdXJjZU9wZXJhdGlvbi5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdHJ1ZSk7CisKKwkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNMZWZ0KCkpOworCQlSZXNvdXJjZSByZXN1bHRSZXNvdXJjZSA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIHVuaXF1ZSBpZCIsCisJCS8vIFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlVW5pcXVlSWQocmVzb3VyY2VOYW1lLAorCQkvLyByZXNvdXJjZVZlcnNpb24pLCByZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayByZXNvdXJjZSBzdGF0ZSIsIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULAorCQkJCXJlc3VsdFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCkpOworCisJCS8vIHJldHJpZXZlIHByb3BlcnR5IGZyb20gZ3JhcGgKKwkJU3RyaW5nIHJlc291cmNlSWQgPSByZXN1bHRSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQkvLyBTdHJpbmcgcmVzb3VyY2VJZCA9IFVuaXF1ZUlkQnVpbGRlci5idWlsZFJlc291cmNlVW5pcXVlSWQoCisJCS8vIHJlc291cmNlLmdldFJlc291cmNlTmFtZSgpLCByZXNvdXJjZS5nZXRSZXNvdXJjZVZlcnNpb24oKSk7CisKKwkJRWl0aGVyPFByb3BlcnR5RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZWl0aGVyID0gcHJvcGVydHlPcGVyYXRpb24uZ2V0UHJvcGVydHlPZlJlc291cmNlKHByb3BOYW1lMSwKKwkJCQlyZXNvdXJjZUlkKTsKKworCQlhc3NlcnRUcnVlKGVpdGhlci5pc0xlZnQoKSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBlaXRoZXIubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgZGVmYXVsdCB2YWx1ZSIsIHByb3BlcnR5MS5nZXREZWZhdWx0VmFsdWUoKSwgcHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBwcm9wZXJ0eSBkZXNjcmlwdGlvbiIsIHByb3BlcnR5MS5nZXREZXNjcmlwdGlvbigpLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgdHlwZSIsIHByb3BlcnR5MS5nZXRUeXBlKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHByb3BlcnR5IHVuaXF1ZSBpZCIsIHByb3BlcnR5MS5nZXRVbmlxdWVJZCgpLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgcHJvcGVydHkgY29uc2l0cmFpbnRzIHNpemUiLCBwcm9wZXJ0eTEuZ2V0Q29uc3RyYWludHMoKS5zaXplKCksCisJCQkJcHJvcGVydHlEZWZpbml0aW9uLmdldENvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKKworCQlyZXR1cm4gcmVzdWx0UmVzb3VyY2U7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBjb252ZXJ0TWFwVG9MaXN0KE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcykgeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKEVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJcHJvcGVydHlEZWZpbml0aW9uLnNldE5hbWUobmFtZSk7CisJCQlkZWZpbml0aW9ucy5hZGQocHJvcGVydHlEZWZpbml0aW9uKTsKKwkJfQorCisJCXJldHVybiBkZWZpbml0aW9uczsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGb2xsb3dlZCgpIHsKKwkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QxMjMiOworCisJCVN0cmluZyB1c2VySWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcih1c2VySWQsICJmaXJzdF8iICsgdXNlcklkLCAibGFzdF8iICsgdXNlcklkKTsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCisJCVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHVzZXJJZCwgY2F0ZWdvcnksIHJvb3ROYW1lLCAiMS4wIiwgbnVsbCwgZmFsc2UsIHRydWUpOworCQlsb2cuZGVidWcoIiAqKiogY3JlYXRlICoqIik7CisJCWxvZy5kZWJ1Zygie30iLCByb290UmVzb3VyY2UpOworCQlTdHJpbmcgcmVzb3VyY2VJZCA9IHJvb3RSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxpZmVjeWNsZVN0YXRlcyA9IG5ldyBIYXNoU2V0PExpZmVjeWNsZVN0YXRlRW51bT4oKTsKKwkJbGlmZWN5Y2xlU3RhdGVzLmFkZChMaWZlY3ljbGVTdGF0ZUVudW0uTk9UX0NFUlRJRklFRF9DSEVDS09VVCk7CisJCVNldDxMaWZlY3ljbGVTdGF0ZUVudW0+IGxhc3RTdGF0ZVN0YXRlcyA9IG5ldyBIYXNoU2V0PExpZmVjeWNsZVN0YXRlRW51bT4oKTsKKwkJbGFzdFN0YXRlU3RhdGVzLmFkZChMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVEKTsKKworCQlFaXRoZXI8TGlzdDxSZXNvdXJjZT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGZvbGxvd2VkID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0Rm9sbG93ZWQodXNlcklkLCBsaWZlY3ljbGVTdGF0ZXMsCisJCQkJbGFzdFN0YXRlU3RhdGVzLCBmYWxzZSk7CisJCWFzc2VydFRydWUoZm9sbG93ZWQuaXNMZWZ0KCkpOworCQlMaXN0PFJlc291cmNlPiBsaXN0ID0gZm9sbG93ZWQubGVmdCgpLnZhbHVlKCk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKKwkJcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZCk7CisKKwkJZm9sbG93ZWQgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRGb2xsb3dlZCh1c2VySWQsIGxpZmVjeWNsZVN0YXRlcywgbGFzdFN0YXRlU3RhdGVzLCBmYWxzZSk7CisJCWFzc2VydFRydWUoZm9sbG93ZWQuaXNMZWZ0KCkpOworCQlsaXN0ID0gZm9sbG93ZWQubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUobGlzdC5pc0VtcHR5KCkpOworCisJfQorCisJQElnbm9yZQorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldExhdGVzdFZlcnNpb24oKSB7CisJCVN0cmluZyByb290TmFtZSA9ICJSb290MTIzIjsKKworCQlTdHJpbmcgdXNlcklkID0gImpoMDAwMyI7CisJCVN0cmluZyBjYXRlZ29yeSA9ICJjYXRlZ29yeS9teWNhdGVnb3J5IjsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcih1c2VySWQsICJmaXJzdF8iICsgdXNlcklkLCAibGFzdF8iICsgdXNlcklkKTsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gbGF0ZXN0QnlOYW1lID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0TGF0ZXN0QnlOYW1lKHJvb3ROYW1lLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShsYXRlc3RCeU5hbWUuaXNSaWdodCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5ELCBsYXRlc3RCeU5hbWUucmlnaHQoKS52YWx1ZSgpKTsKKworCQlSZXNvdXJjZSByb290UmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSh1c2VySWQsIGNhdGVnb3J5LCByb290TmFtZSwgIjEuMCIsIG51bGwsIGZhbHNlLCB0cnVlKTsKKworCQlsYXRlc3RCeU5hbWUgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRMYXRlc3RCeU5hbWUocm9vdE5hbWUsIHRydWUpOworCQlhc3NlcnRUcnVlKGxhdGVzdEJ5TmFtZS5pc0xlZnQoKSk7CisKKwkJUmVzb3VyY2Ugcm9vdFJlc291cmNlSGlnaGVzdCA9IGNyZWF0ZVJlc291cmNlKHVzZXJJZCwgY2F0ZWdvcnksIHJvb3ROYW1lLCAiMS4zIiwgbnVsbCwgZmFsc2UsIHRydWUpOworCisJCWxhdGVzdEJ5TmFtZSA9IHJlc291cmNlT3BlcmF0aW9uLmdldExhdGVzdEJ5TmFtZShyb290TmFtZSwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGxhdGVzdEJ5TmFtZS5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhyb290UmVzb3VyY2VIaWdoZXN0LmdldFVuaXF1ZUlkKCksIGxhdGVzdEJ5TmFtZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKworCQlyZXNvdXJjZU9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZShyb290UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJvb3RSZXNvdXJjZUhpZ2hlc3QuZ2V0VW5pcXVlSWQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVSZXNvdXJjZSgpIHsKKwkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QxMjMiOworCisJCVN0cmluZyB1c2VySWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJU3RyaW5nIHVwZGF0ZWRDYXRlZ29yeSA9IENBVEVHT1JZX05BTUVfVVBEQVRFRDsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcih1c2VySWQsICJmaXJzdF8iICsgdXNlcklkLCAibGFzdF8iICsgdXNlcklkKTsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCQlkZWxldGVBbmRDcmVhdGVDYXRlZ29yeSh1cGRhdGVkQ2F0ZWdvcnkpOworCisJCVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHVzZXJJZCwgY2F0ZWdvcnksIHJvb3ROYW1lLCAiMS4xIiwgbnVsbCwgZmFsc2UsIHRydWUpOworCisJCXJvb3RSZXNvdXJjZS5zZXRDYXRlZ29yaWVzKG51bGwpOworCQlTdHJpbmdbXSB1cGRhdGVBcnIgPSB1cGRhdGVkQ2F0ZWdvcnkuc3BsaXQoIi8iKTsKKwkJcm9vdFJlc291cmNlLmFkZENhdGVnb3J5KHVwZGF0ZUFyclswXSwgdXBkYXRlQXJyWzFdKTsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSByb290UmVzb3VyY2UuZ2V0UHJvcGVydGllcygpOworCQlQcm9wZXJ0eURlZmluaXRpb24gcHJvcGVydHlEZWZpbml0aW9uID0gZmluZFByb3BlcnR5KHByb3BlcnRpZXMsICJkaXNrX3NpemUiKTsKKworCQlyb290UmVzb3VyY2Uuc2V0UHJvcGVydGllcyhuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4oKSk7CisJCXByb3BlcnR5RGVmaW5pdGlvbi5zZXROYW1lKCJteVByb3BlcnR5Iik7CisJCXJvb3RSZXNvdXJjZS5nZXRQcm9wZXJ0aWVzKCkuYWRkKHByb3BlcnR5RGVmaW5pdGlvbik7CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBvdmVycmlkZVJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24ub3ZlcnJpZGVSZXNvdXJjZShyb290UmVzb3VyY2UsCisJCQkJcm9vdFJlc291cmNlLCBmYWxzZSk7CisKKwkJYXNzZXJ0VHJ1ZShvdmVycmlkZVJlc291cmNlLmlzTGVmdCgpKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2VBZnRlciA9IG92ZXJyaWRlUmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUFmdGVyLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworCisJCWFzc2VydE5vdE51bGwoZmluZFByb3BlcnR5KHJlc291cmNlQWZ0ZXIuZ2V0UHJvcGVydGllcygpLCAibXlQcm9wZXJ0eSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQWZ0ZXIuZ2V0Q2F0ZWdvcmllcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUFmdGVyLmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0U3ViY2F0ZWdvcmllcygpLnNpemUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKHVwZGF0ZUFyclswXSwgcmVzb3VyY2VBZnRlci5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyh1cGRhdGVBcnJbMV0sIHJlc291cmNlQWZ0ZXIuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKS5nZXRTdWJjYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisKKwkJcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlc291cmNlV2l0aENhcGFiaWxpdGllcygpIHsKKwkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QxMjMiOworCisJCVN0cmluZyB1c2VySWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJU3RyaW5nIHVwZGF0ZWRDYXRlZ29yeSA9IENBVEVHT1JZX05BTUVfVVBEQVRFRDsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcih1c2VySWQsICJmaXJzdF8iICsgdXNlcklkLCAibGFzdF8iICsgdXNlcklkKTsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCQlkZWxldGVBbmRDcmVhdGVDYXRlZ29yeSh1cGRhdGVkQ2F0ZWdvcnkpOworCisJCVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHVzZXJJZCwgY2F0ZWdvcnksIHJvb3ROYW1lLCAiMS4xIiwgbnVsbCwgZmFsc2UsIHRydWUpOworCisJCUNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbiBjYXBhYmlsaXR5VHlwZURlZmluaXRpb24gPSBuZXcgQ2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uKCk7CisJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXRUeXBlKCJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIik7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBkZWxhdWx0UHJvcGVydHkxID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlkZWxhdWx0UHJvcGVydHkxLnNldE5hbWUoImRlZiIpOworCQlkZWxhdWx0UHJvcGVydHkxLnNldFR5cGUoInN0cmluZyIpOworCQlkZWxhdWx0UHJvcGVydHkxLnNldERlZmF1bHRWYWx1ZSgiZGVmIik7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIGRlbGF1bHRQcm9wZXJ0eTIgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCWRlbGF1bHRQcm9wZXJ0eTIuc2V0TmFtZSgiaG9zdCIpOworCQlkZWxhdWx0UHJvcGVydHkyLnNldFR5cGUoInN0cmluZyIpOworCQlkZWxhdWx0UHJvcGVydHkyLnNldERlZmF1bHRWYWx1ZSgidHJ1ZSIpOworCisJCUhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb24+KCk7CisJCXByb3BzLnB1dChkZWxhdWx0UHJvcGVydHkxLmdldE5hbWUoKSwgZGVsYXVsdFByb3BlcnR5MSk7CisJCXByb3BzLnB1dChkZWxhdWx0UHJvcGVydHkyLmdldE5hbWUoKSwgZGVsYXVsdFByb3BlcnR5Mik7CisJCWNhcGFiaWxpdHlUeXBlRGVmaW5pdGlvbi5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBhZGRUeXBlUmVzID0gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb24KKwkJCQkuYWRkQ2FwYWJpbGl0eVR5cGUoY2FwYWJpbGl0eVR5cGVEZWZpbml0aW9uKTsKKwkJYXNzZXJ0VHJ1ZShhZGRUeXBlUmVzLmlzTGVmdCgpKTsKKworCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBjYXBhYmlsaXR5RGVmaW5pdGlvbiA9IG5ldyBDYXBhYmlsaXR5RGVmaW5pdGlvbigpOworCQljYXBhYmlsaXR5RGVmaW5pdGlvbi5zZXREZXNjcmlwdGlvbigiZmlyc3RDYXAiKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0TmFtZSgiZmlyc3RDYXAiKTsKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0VHlwZSgidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpOworCisJCUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eT4oKTsKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eURlZmluaXRpb24xID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZWZpbml0aW9uMS5zZXROYW1lKCJ2ZXJzaW9uIik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjEuc2V0VHlwZSgic3RyaW5nIik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjEuc2V0RGVmYXVsdFZhbHVlKCIwMDciKTsKKwkJcHJvcGVydGllcy5hZGQocHJvcGVydHlEZWZpbml0aW9uMSk7CisKKwkJQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSBwcm9wZXJ0eURlZmluaXRpb24yID0gbmV3IENvbXBvbmVudEluc3RhbmNlUHJvcGVydHkoKTsKKwkJcHJvcGVydHlEZWZpbml0aW9uMi5zZXROYW1lKCJob3N0Iik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjIuc2V0VHlwZSgic3RyaW5nIik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjIuc2V0RGVmYXVsdFZhbHVlKCJsb2NhbGhvc3QiKTsKKwkJcHJvcGVydGllcy5hZGQocHJvcGVydHlEZWZpbml0aW9uMik7CisKKwkJY2FwYWJpbGl0eURlZmluaXRpb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKworCQlFaXRoZXI8Q2FwYWJpbGl0eURlZmluaXRpb24sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGFkZENhcGFiaWxpdHlSZXMgPSBjYXBhYmlsaXR5T3BlcmF0aW9uCisJCQkJLmFkZENhcGFiaWxpdHkocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCksIGNhcGFiaWxpdHlEZWZpbml0aW9uLmdldE5hbWUoKSwgY2FwYWJpbGl0eURlZmluaXRpb24pOworCQlhc3NlcnRUcnVlKGFkZENhcGFiaWxpdHlSZXMuaXNMZWZ0KCkpOworCisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBuZXdQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURlZmluaXRpb24+KCk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjEgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2VQcm9wZXJ0eSgpOworCQlwcm9wZXJ0eURlZmluaXRpb24xLnNldE5hbWUoIm51bV9jcHUiKTsKKwkJcHJvcGVydHlEZWZpbml0aW9uMS5zZXRUeXBlKCJzdHJpbmciKTsKKwkJcHJvcGVydHlEZWZpbml0aW9uMS5zZXREZWZhdWx0VmFsdWUoIjQiKTsKKwkJbmV3UHJvcGVydGllcy5hZGQocHJvcGVydHlEZWZpbml0aW9uMSk7CisKKwkJcHJvcGVydHlEZWZpbml0aW9uMiA9IG5ldyBDb21wb25lbnRJbnN0YW5jZVByb3BlcnR5KCk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjIuc2V0TmFtZSgicG9ydCIpOworCQlwcm9wZXJ0eURlZmluaXRpb24yLnNldFR5cGUoInN0cmluZyIpOworCQlwcm9wZXJ0eURlZmluaXRpb24yLnNldERlZmF1bHRWYWx1ZSgiNDQ0NCIpOworCQluZXdQcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eURlZmluaXRpb24yKTsKKworCQlDYXBhYmlsaXR5RGVmaW5pdGlvbiBhZGRlZENhcCA9IGFkZENhcGFiaWxpdHlSZXMubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YT4sIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHVwZGF0ZVByb3BlcnRpZXNSZXMgPSBjYXBhYmlsaXR5T3BlcmF0aW9uCisJCQkJLnVwZGF0ZVByb3BlcnRpZXNPZkNhcGFiaWxpdHkoYWRkZWRDYXAuZ2V0VW5pcXVlSWQoKSwgYWRkZWRDYXAuZ2V0VHlwZSgpLCBuZXdQcm9wZXJ0aWVzKTsKKwkJYXNzZXJ0VHJ1ZSh1cGRhdGVQcm9wZXJ0aWVzUmVzLmlzTGVmdCgpKTsKKworCQlQcm9wZXJ0eURlZmluaXRpb24gaW52YWxpZFByb3BlcnR5ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlpbnZhbGlkUHJvcGVydHkuc2V0TmFtZSgicG9ydCIpOworCQlpbnZhbGlkUHJvcGVydHkuc2V0VHlwZSgicnJyIik7CisJCWludmFsaWRQcm9wZXJ0eS5zZXREZWZhdWx0VmFsdWUoIjY2NiIpOworCQluZXdQcm9wZXJ0aWVzLmFkZChpbnZhbGlkUHJvcGVydHkpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVQcm9wZXJ0aWVzSW52YWxpZFJlcyA9IGNhcGFiaWxpdHlPcGVyYXRpb24KKwkJCQkudXBkYXRlUHJvcGVydGllc09mQ2FwYWJpbGl0eShhZGRlZENhcC5nZXRVbmlxdWVJZCgpLCBhZGRlZENhcC5nZXRUeXBlKCksIG5ld1Byb3BlcnRpZXMpOworCQlhc3NlcnRUcnVlKHVwZGF0ZVByb3BlcnRpZXNJbnZhbGlkUmVzLmlzUmlnaHQoKSk7CisKKwkJRWl0aGVyPENhcGFiaWxpdHlEZWZpbml0aW9uLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRDYXBhYmlsaXR5UmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbgorCQkJCS5nZXRDYXBhYmlsaXR5KGFkZGVkQ2FwLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKGdldENhcGFiaWxpdHlSZXMuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxMaXN0PEltbXV0YWJsZVBhaXI8UHJvcGVydHlEYXRhLCBHcmFwaEVkZ2U+PiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVByb3BlcnRpZXNPZkNhcGFiaWxpdHlSZXMgPSBjYXBhYmlsaXR5T3BlcmF0aW9uCisJCQkJLmRlbGV0ZVByb3BlcnRpZXNPZkNhcGFiaWxpdHkoYWRkZWRDYXAuZ2V0VW5pcXVlSWQoKSk7CisJCWFzc2VydFRydWUoZGVsZXRlUHJvcGVydGllc09mQ2FwYWJpbGl0eVJlcy5pc0xlZnQoKSk7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBkZWxldGVDYXBhYmlsaXR5UmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbgorCQkJCS5kZWxldGVDYXBhYmlsaXR5RnJvbUdyYXBoKGFkZGVkQ2FwLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKGRlbGV0ZUNhcGFiaWxpdHlSZXMuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0spKTsKKworCQlnZXRDYXBhYmlsaXR5UmVzID0gY2FwYWJpbGl0eU9wZXJhdGlvbi5nZXRDYXBhYmlsaXR5KGFkZGVkQ2FwLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRUcnVlKGdldENhcGFiaWxpdHlSZXMuaXNSaWdodCgpCisJCQkJJiYgZ2V0Q2FwYWJpbGl0eVJlcy5yaWdodCgpLnZhbHVlKCkuZXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuTk9UX0ZPVU5EKSk7CisKKwkJcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2Uocm9vdFJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlEZWZpbml0aW9uIGZpbmRQcm9wZXJ0eShMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcGVydGllcywgU3RyaW5nIHByb3BOYW1lKSB7CisKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlmb3IgKFByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24gOiBwcm9wZXJ0aWVzKSB7CisJCQlTdHJpbmcgbmFtZSA9IHByb3BlcnR5RGVmaW5pdGlvbi5nZXROYW1lKCk7CisJCQlpZiAobmFtZS5lcXVhbHMocHJvcE5hbWUpKSB7CisJCQkJcmV0dXJuIHByb3BlcnR5RGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlUmVzb3VyY2VOb3RFeGlzdCgpIHsKKwkJU3RyaW5nIHJvb3ROYW1lID0gIlJvb3QxMjMiOworCisJCVN0cmluZyB1c2VySWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcih1c2VySWQsICJmaXJzdF8iICsgdXNlcklkLCAibGFzdF8iICsgdXNlcklkKTsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCisJCVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IGJ1aWxkUmVzb3VyY2VNZXRhZGF0YSh1c2VySWQsIGNhdGVnb3J5LCByb290TmFtZSwgIjEuMSIpOworCQlyb290UmVzb3VyY2Uuc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVzb3VyY2VVbmlxdWVJZCgpKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG92ZXJyaWRlUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5vdmVycmlkZVJlc291cmNlKHJvb3RSZXNvdXJjZSwKKwkJCQlyb290UmVzb3VyY2UsIGZhbHNlKTsKKworCQlhc3NlcnRUcnVlKG92ZXJyaWRlUmVzb3VyY2UuaXNSaWdodCgpKTsKKworCX0KKworCUBJZ25vcmUKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDYXRhbG9nUmVzb3VyY2UoKSB7CisJCVN0cmluZyByZXNOYW1lID0gIm15UmVzb3VyY2UiOworCQlTdHJpbmcgdXNlcklkID0gImpoMDAwMyI7CisJCVN0cmluZyBjYXRlZ29yeSA9IENBVEVHT1JZX05BTUU7CisJCWRlbGV0ZUFuZENyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5KTsKKwkJLy8gcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2UoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkUmVzb3VyY2VVbmlxdWVJZChyZXNOYW1lLCIwLjEiKSk7CisJCVJlc291cmNlIG5ld1Jlc291cmNlID0gY3JlYXRlUmVzb3VyY2UodXNlcklkLCBjYXRlZ29yeSwgcmVzTmFtZSwgIjAuMSIsIG51bGwsIGZhbHNlLCB0cnVlKTsKKwkJU3RyaW5nIHJlc291cmNlSWQgPSBuZXdSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2ggPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKTsKKworCQlFaXRoZXI8U2V0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2F0YWxvZyA9IHJlc291cmNlT3BlcmF0aW9uLmdldENhdGFsb2dEYXRhKHByb3BlcnRpZXNUb01hdGNoLAorCQkJCWZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjYXRhbG9nLmlzTGVmdCgpKTsKKwkJU2V0PFJlc291cmNlPiBjYXRhbG9nU2V0ID0gY2F0YWxvZy5sZWZ0KCkudmFsdWUoKTsKKwkJU2V0PFN0cmluZz4gaWRTZXQgPSBuZXcgSGFzaFNldDw+KCk7CisJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjYXRhbG9nU2V0KSB7CisJCQlpZFNldC5hZGQocmVzb3VyY2UuZ2V0VW5pcXVlSWQoKSk7CisJCX0KKwkJYXNzZXJ0VHJ1ZShpZFNldC5jb250YWlucyhyZXNvdXJjZUlkKSk7CisJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQpOworCX0KKworCUBJZ25vcmUKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUZXN0ZXJGb2xsb3dlZCgpIHsKKwkJU3RyaW5nIHJvb3ROYW1lID0gIlRlc3QxIjsKKwkJU3RyaW5nIHJvb3ROYW1lMiA9ICJUZXN0MiI7CisJCVN0cmluZyByb290TmFtZTMgPSAiVGVzdDMiOworCQlTdHJpbmcgdXNlcklkID0gImpoMDAwMyI7CisJCVN0cmluZyB0ZXN0ZXJVc2VySWQgPSAidHQwMDA0IjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcih0ZXN0ZXJVc2VySWQsICJ0ZXN0ZXIiLCAibGFzdCIpOworCQlkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShjYXRlZ29yeSk7CisKKwkJU3RyaW5nIGtleSA9IFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKTsKKwkJRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZmluZFVzZXIgPSB0aXRhbkRhby5nZXROb2RlKGtleSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcyk7CisJCVVzZXIgYWRtaW5Vc2VyID0gT3BlcmF0aW9uVGVzdHNVdGlsLmNvbnZlcnRVc2VyRGF0YVRvVXNlcihmaW5kVXNlci5sZWZ0KCkudmFsdWUoKSk7CisJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRUZXN0ZXJVc2VyID0gdGl0YW5EYW8uZ2V0Tm9kZShrZXksIHRlc3RlclVzZXJJZCwgVXNlckRhdGEuY2xhc3MpOworCQlVc2VyIHRlc3RlclVzZXIgPSBPcGVyYXRpb25UZXN0c1V0aWwuY29udmVydFVzZXJEYXRhVG9Vc2VyKGZpbmRUZXN0ZXJVc2VyLmxlZnQoKS52YWx1ZSgpKTsKKworCQkvLyBDcmVhdGUgMyBuZXcgcmVzb3VyY2VzCisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UodXNlcklkLCBjYXRlZ29yeSwgcm9vdE5hbWUsICIxLjAiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CisJCWxvZy5kZWJ1Zygie30iLCByZXN1bHRSZXNvdXJjZSk7CisJCVN0cmluZyByZXNvdXJjZUlkID0gcmVzdWx0UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKwkJUmVzb3VyY2UgcmVzdWx0UmVzb3VyY2UyID0gY3JlYXRlUmVzb3VyY2UodXNlcklkLCBjYXRlZ29yeSwgcm9vdE5hbWUyLCAiMS4wIiwgbnVsbCwgZmFsc2UsIHRydWUpOworCQlsb2cuZGVidWcoInt9IiwgcmVzdWx0UmVzb3VyY2UyKTsKKwkJU3RyaW5nIHJlc291cmNlSWQyID0gcmVzdWx0UmVzb3VyY2UyLmdldFVuaXF1ZUlkKCk7CisJCVJlc291cmNlIHJlc3VsdFJlc291cmNlMyA9IGNyZWF0ZVJlc291cmNlKHVzZXJJZCwgY2F0ZWdvcnksIHJvb3ROYW1lMywgIjEuMCIsIG51bGwsIGZhbHNlLCB0cnVlKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHJlc3VsdFJlc291cmNlMyk7CisJCVN0cmluZyByZXNvdXJjZUlkMyA9IHJlc3VsdFJlc291cmNlMy5nZXRVbmlxdWVJZCgpOworCisJCS8vIHVwZGF0ZSAxIHJlc291cmNlIHRvIFJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2VydFJlcVJlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uUmVzb3VyY2UsIHJlc3VsdFJlc291cmNlLCBhZG1pblVzZXIsIGFkbWluVXNlciwgZmFsc2UpOworCQlSZXNvdXJjZSBSRkNSZXNvdXJjZSA9IGNlcnRSZXFSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKFJGQ1Jlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCksIExpZmVjeWNsZVN0YXRlRW51bS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTik7CisKKwkJLy8gdXBkYXRlIDEgcmVzb3VyY2UgdG8gQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXJ0Q2VydGlmaWNhdGlvblJlc3BvbnNlID0gKEVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4pIGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5zdGFydENvbXBvbmVudENlcnRpZmljYXRpb24oTm9kZVR5cGVFbnVtLlJlc291cmNlLCByZXN1bHRSZXNvdXJjZTIsIHRlc3RlclVzZXIsIGFkbWluVXNlciwgZmFsc2UpOworCQlSZXNvdXJjZSBJUFJlc291cmNlID0gc3RhcnRDZXJ0aWZpY2F0aW9uUmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydEVxdWFscyhJUFJlc291cmNlLmdldExpZmVjeWNsZVN0YXRlKCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKworCQlTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPiBsaWZlY3ljbGVTdGF0ZXMgPSBuZXcgSGFzaFNldDxMaWZlY3ljbGVTdGF0ZUVudW0+KCk7CisJCWxpZmVjeWNsZVN0YXRlcy5hZGQoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MpOworCisJCUVpdGhlcjxMaXN0PFJlc291cmNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVzb3VyY2VzID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0VGVzdGVyRm9sbG93ZWQodGVzdGVyVXNlcklkLAorCQkJCWxpZmVjeWNsZVN0YXRlcywgZmFsc2UpOworCisJCWFzc2VydFRydWUocmVzb3VyY2VzLmlzTGVmdCgpKTsKKwkJTGlzdDxSZXNvdXJjZT4gcmVzdWx0ID0gcmVzb3VyY2VzLmxlZnQoKS52YWx1ZSgpOworCisJCUxpc3Q8U3RyaW5nPiBpZFNldCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc3VsdCkgeworCQkJaWRTZXQuYWRkKHJlc291cmNlLmdldFVuaXF1ZUlkKCkpOworCQl9CisJCWFzc2VydFRydWUoaWRTZXQuY29udGFpbnMocmVzb3VyY2VJZCkpOworCQlhc3NlcnRUcnVlKGlkU2V0LmNvbnRhaW5zKHJlc291cmNlSWQyKSk7CisJCWFzc2VydEZhbHNlKGlkU2V0LmNvbnRhaW5zKHJlc291cmNlSWQzKSk7CisJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQpOworCQlyZXNvdXJjZU9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkMik7CisJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQzKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0VmVyc2lvbkxpc3ROb3REZWxldGVkKCkgeworCQlTdHJpbmcgcmVzTmFtZSA9ICJteVJlc291cmNlIjsKKwkJU3RyaW5nIHVzZXJJZCA9ICJqaDAwMDMiOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9OQU1FOworCQlkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShjYXRlZ29yeSk7CisKKwkJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSh1c2VySWQsIGNhdGVnb3J5LCByZXNOYW1lLCAiMC4xIiwgbnVsbCwgZmFsc2UsIHRydWUpOworCQlTdHJpbmcgcmVzb3VyY2VJZDEgPSBuZXdSZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCisJCVVzZXIgYWRtaW4gPSBuZXcgVXNlcigiaiIsICJoIiwgdXNlcklkLCBudWxsLCAiQURNSU4iLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2hlY2tvdXRSZXNvdXJjZSA9IChFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+KSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuY2hlY2tvdXRDb21wb25lbnQoTm9kZVR5cGVFbnVtLlJlc291cmNlLCBuZXdSZXNvdXJjZSwgYWRtaW4sIGFkbWluLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY2hlY2tvdXRSZXNvdXJjZS5pc0xlZnQoKSk7CisJCVJlc291cmNlIG5ld1Jlc291cmNlMiA9IGNoZWNrb3V0UmVzb3VyY2UubGVmdCgpLnZhbHVlKCk7CisJCVN0cmluZyByZXNvdXJjZUlkMiA9IG5ld1Jlc291cmNlMi5nZXRVbmlxdWVJZCgpOworCisJCVJlc291cmNlIG5ld1Jlc291cmNlMyA9IGNyZWF0ZVJlc291cmNlKHVzZXJJZCwgY2F0ZWdvcnksIHJlc05hbWUsICIwLjEiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CisJCVN0cmluZyByZXNvdXJjZUlkMyA9IG5ld1Jlc291cmNlMy5nZXRVbmlxdWVJZCgpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVyc2lvbkxpc3QgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRWZXJzaW9uTGlzdCgKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsICIwLjIiLCBuZXdSZXNvdXJjZTIuZ2V0VVVJRCgpLCBuZXdSZXNvdXJjZTIuZ2V0U3lzdGVtTmFtZSgpLAorCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKwkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uTGlzdC5pc0xlZnQoKSk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gdmVyc2lvbk1hcCA9IHZlcnNpb25MaXN0LmxlZnQoKS52YWx1ZSgpOworCisJCWFzc2VydFRydWUodmVyc2lvbk1hcC5zaXplKCkgPT0gMik7CisJCWFzc2VydFRydWUodmVyc2lvbk1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlSWQxKSk7CisJCWFzc2VydFRydWUodmVyc2lvbk1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlSWQyKSk7CisJCWFzc2VydEZhbHNlKHZlcnNpb25NYXAuY29udGFpbnNWYWx1ZShyZXNvdXJjZUlkMykpOworCisJCUVpdGhlcjxSZXNvdXJjZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlUmVzb3VyY2UgPSByZXNvdXJjZU9wZXJhdGlvbi5kZWxldGVSZXNvdXJjZShyZXNvdXJjZUlkMSk7CisJCWFzc2VydFRydWUoZGVsZXRlUmVzb3VyY2UuaXNMZWZ0KCkpOworCQlkZWxldGVSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQyKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVSZXNvdXJjZS5pc0xlZnQoKSk7CisJCWRlbGV0ZVJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZDMpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVJlc291cmNlLmlzTGVmdCgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZ2V0VmVyc2lvbkxpc3RXaXRoRGVsZXRlZCgpIHsKKwkJU3RyaW5nIHJlc05hbWUgPSAibXlSZXNvdXJjZSI7CisJCVN0cmluZyB1c2VySWQgPSAiamgwMDAzIjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCisJCVJlc291cmNlIG5ld1Jlc291cmNlID0gY3JlYXRlUmVzb3VyY2UodXNlcklkLCBjYXRlZ29yeSwgcmVzTmFtZSwgIjAuMSIsIG51bGwsIGZhbHNlLCB0cnVlKTsKKwkJU3RyaW5nIHJlc291cmNlSWQxID0gbmV3UmVzb3VyY2UuZ2V0VW5pcXVlSWQoKTsKKworCQlVc2VyIGFkbWluID0gbmV3IFVzZXIoImoiLCAiaCIsIHVzZXJJZCwgbnVsbCwgIkFETUlOIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNoZWNrb3V0UmVzb3VyY2UgPSAoRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPikgbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNoZWNrb3V0Q29tcG9uZW50KE5vZGVUeXBlRW51bS5SZXNvdXJjZSwgbmV3UmVzb3VyY2UsIGFkbWluLCBhZG1pbiwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGNoZWNrb3V0UmVzb3VyY2UuaXNMZWZ0KCkpOworCQlSZXNvdXJjZSBuZXdSZXNvdXJjZTIgPSBjaGVja291dFJlc291cmNlLmxlZnQoKS52YWx1ZSgpOworCQlTdHJpbmcgcmVzb3VyY2VJZDIgPSBuZXdSZXNvdXJjZTIuZ2V0VW5pcXVlSWQoKTsKKworCQlFaXRoZXI8UmVzb3VyY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZ2V0UmVzb3VyY2UocmVzb3VyY2VJZDEsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc0xlZnQoKSk7CisJCUVpdGhlcjxDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IG1hcmtSZXNvdXJjZVRvRGVsZXRlID0gcmVzb3VyY2VPcGVyYXRpb24KKwkJCQkubWFya0NvbXBvbmVudFRvRGVsZXRlKHJlc291cmNlLmxlZnQoKS52YWx1ZSgpLCBmYWxzZSk7CisJCWFzc2VydFRydWUobWFya1Jlc291cmNlVG9EZWxldGUuaXNMZWZ0KCkpOworCisJCUVpdGhlcjxNYXA8U3RyaW5nLCBTdHJpbmc+LCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdmVyc2lvbkxpc3QgPSByZXNvdXJjZU9wZXJhdGlvbi5nZXRWZXJzaW9uTGlzdCgKKwkJCQlOb2RlVHlwZUVudW0uUmVzb3VyY2UsICIwLjIiLCBuZXdSZXNvdXJjZTIuZ2V0VVVJRCgpLCBuZXdSZXNvdXJjZTIuZ2V0U3lzdGVtTmFtZSgpLAorCQkJCVJlc291cmNlTWV0YWRhdGFEYXRhLmNsYXNzKTsKKworCQlhc3NlcnRUcnVlKHZlcnNpb25MaXN0LmlzTGVmdCgpKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9uTWFwID0gdmVyc2lvbkxpc3QubGVmdCgpLnZhbHVlKCk7CisKKwkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uTWFwLnNpemUoKSA9PSAxKTsKKwkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlSWQxKSk7CisJCWFzc2VydFRydWUodmVyc2lvbk1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlSWQyKSk7CisKKwkJRWl0aGVyPFJlc291cmNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVSZXNvdXJjZSA9IHJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKHJlc291cmNlSWQxKTsKKwkJYXNzZXJ0VHJ1ZShkZWxldGVSZXNvdXJjZS5pc0xlZnQoKSk7CisJCWRlbGV0ZVJlc291cmNlID0gcmVzb3VyY2VPcGVyYXRpb24uZGVsZXRlUmVzb3VyY2UocmVzb3VyY2VJZDIpOworCQlhc3NlcnRUcnVlKGRlbGV0ZVJlc291cmNlLmlzTGVmdCgpKTsKKwl9CisJCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVydmllZFByb3BlcnRpZXNJblJlc291cmNlKCkgeworCisJCXRyeSB7CisJCQlTdHJpbmcgdXNlcklkID0gImpoMDAwMyI7CisJCQlTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9OQU1FOworCisJCQlkZWxldGVBbmRDcmVhdGVVc2VyKHVzZXJJZCwgImZpcnN0XyIgKyB1c2VySWQsICJsYXN0XyIgKyB1c2VySWQpOworCQkJZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCisJCQlSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZTEgPSBjcmVhdGVSZXNvdXJjZSh1c2VySWQsIGNhdGVnb3J5LCAibXlSZXNvdXJjZTEiLCAiMC4xIiwgbnVsbCwgdHJ1ZSwgZmFsc2UpOworCQkJUmVzb3VyY2VNZXRhZGF0YURhdGEgcmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlTWV0YWRhdGFEYXRhKCk7CisJCQlyZXNvdXJjZURhdGEuZ2V0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKGNyZWF0ZVJlc291cmNlMS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlc291cmNlRGF0YS5nZXRNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkuc2V0U3RhdGUoTGlmZWN5Y2xlU3RhdGVFbnVtLkNFUlRJRklFRC5uYW1lKCkpOworCQkJRWl0aGVyPFJlc291cmNlTWV0YWRhdGFEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gdXBkYXRlTm9kZSA9IHRpdGFuRGFvLnVwZGF0ZU5vZGUocmVzb3VyY2VEYXRhLAorCQkJCQlSZXNvdXJjZU1ldGFkYXRhRGF0YS5jbGFzcyk7CisJCQlhc3NlcnRUcnVlKHVwZGF0ZU5vZGUuaXNMZWZ0KCkpOworCisJCQlHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCisJCQlTdHJpbmcganNvbiA9IGdzb24udG9Kc29uKGNyZWF0ZVJlc291cmNlMSk7CisJCQlsb2cuZGVidWcoanNvbik7CisKKwkJCVJlc291cmNlIGNyZWF0ZVJlc291cmNlMiA9IGNyZWF0ZVJlc291cmNlKHVzZXJJZCwgY2F0ZWdvcnksICJteVJlc291cmNlMiIsICIwLjEiLCBjcmVhdGVSZXNvdXJjZTEuZ2V0TmFtZSgpLAorCQkJCQl0cnVlLCBmYWxzZSk7CisKKwkJCWpzb24gPSBnc29uLnRvSnNvbihjcmVhdGVSZXNvdXJjZTIpOworCQkJbG9nLmRlYnVnKGpzb24pOworCisJCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcHJvcExpc3QxID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlUaXRhbk9wZXJhdGlvblN0YXR1cyBmaW5kQWxsUmVzb3VyY2VQcm9wZXJ0aWVzUmVjdXJzaXZlbHkxID0gcHJvcGVydHlPcGVyYXRpb24KKwkJCQkJLmZpbmRBbGxSZXNvdXJjZVByb3BlcnRpZXNSZWN1cnNpdmVseShjcmVhdGVSZXNvdXJjZTEuZ2V0VW5pcXVlSWQoKSwgcHJvcExpc3QxKTsKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgc2VhcmNoIHByb3BlcnRpZXMgc3VjY2VlZCIsIGZpbmRBbGxSZXNvdXJjZVByb3BlcnRpZXNSZWN1cnNpdmVseTEsCisJCQkJCVRpdGFuT3BlcmF0aW9uU3RhdHVzLk9LKTsKKworCQkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BMaXN0MiA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJVGl0YW5PcGVyYXRpb25TdGF0dXMgZmluZEFsbFJlc291cmNlUHJvcGVydGllc1JlY3Vyc2l2ZWx5MiA9IHByb3BlcnR5T3BlcmF0aW9uCisJCQkJCS5maW5kQWxsUmVzb3VyY2VQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoY3JlYXRlUmVzb3VyY2UyLmdldFVuaXF1ZUlkKCksIHByb3BMaXN0Mik7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIHNlYXJjaCBwcm9wZXJ0aWVzIHN1Y2NlZWQiLCBmaW5kQWxsUmVzb3VyY2VQcm9wZXJ0aWVzUmVjdXJzaXZlbHkyLAorCQkJCQlUaXRhbk9wZXJhdGlvblN0YXR1cy5PSyk7CisKKwkJCWFzc2VydEVxdWFscygiY2hlY2sgbnVtYmVyIG9mIHByb3BlcnRpZXMiLCBwcm9wTGlzdDEuc2l6ZSgpICogMiwgcHJvcExpc3QyLnNpemUoKSk7CisKKwkJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKGNyZWF0ZVJlc291cmNlMS5nZXRVbmlxdWVJZCgpKTsKKwkJCXJlc291cmNlT3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlKGNyZWF0ZVJlc291cmNlMi5nZXRVbmlxdWVJZCgpKTsKKworCQl9IGZpbmFsbHkgeworCisJCX0KKwkJCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1NlcnZpY2VPcGVyYXRpb25UZXN0LmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1NlcnZpY2VPcGVyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhNWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvU2VydmljZU9wZXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDk2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuTm9kZVR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkFydGlmYWN0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGlzdHJpYnV0aW9uU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5MaWZlY3ljbGVTdGF0ZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTW9kZWxUZXN0QmFzZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuY2F0ZWdvcnkuQ2F0ZWdvcnlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuYXBpLklHcmFwaExvY2tPcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwudXRpbC5PcGVyYXRpb25UZXN0c1V0aWw7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy51dGlscy5Db21wb25lbnRWYWxpZGF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuQXJ0aWZhY3REYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlVzZXJEYXRhOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuQ29udGV4dENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LmNvbnRleHQuanVuaXQ0LlNwcmluZ0pVbml0NENsYXNzUnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmNvcmUuVGl0YW5HcmFwaDsKKy8vaW1wb3J0IGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy5WZXJ0ZXg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitAUnVuV2l0aChTcHJpbmdKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKK0BDb250ZXh0Q29uZmlndXJhdGlvbigiY2xhc3NwYXRoOmFwcGxpY2F0aW9uLWNvbnRleHQtdGVzdC54bWwiKQorcHVibGljIGNsYXNzIFNlcnZpY2VPcGVyYXRpb25UZXN0IGV4dGVuZHMgTW9kZWxUZXN0QmFzZSB7CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gInRpdGFuLWdlbmVyaWMtZGFvIikKKwlwcml2YXRlIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkRhbzsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAic2VydmljZS1vcGVyYXRpb24iKQorCXByaXZhdGUgU2VydmljZU9wZXJhdGlvbiBzZXJ2aWNlT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIElHcmFwaExvY2tPcGVyYXRpb24gZ3JhcGhMb2NrT3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UKKwlwcml2YXRlIEFydGlmYWN0T3BlcmF0aW9uIGFydGlmYWN0T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJyZXF1aXJlbWVudC1vcGVyYXRpb24iKQorCXByaXZhdGUgUmVxdWlyZW1lbnRPcGVyYXRpb24gcmVxdWlyZW1lbnRPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gInJlc291cmNlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBSZXNvdXJjZU9wZXJhdGlvbiByZXNvdXJjZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAicHJvcGVydHktb3BlcmF0aW9uIikKKwlwcml2YXRlIFByb3BlcnR5T3BlcmF0aW9uIHByb3BlcnR5T3BlcmF0aW9uOworCisJQGphdmF4LmFubm90YXRpb24uUmVzb3VyY2UobmFtZSA9ICJjYXBhYmlsaXR5LW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBDYXBhYmlsaXR5T3BlcmF0aW9uIGNhcGFiaWxpdHlPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImNhcGFiaWxpdHktdHlwZS1vcGVyYXRpb24iKQorCXByaXZhdGUgQ2FwYWJpbGl0eVR5cGVPcGVyYXRpb24gY2FwYWJpbGl0eVR5cGVPcGVyYXRpb247CisKKwlAamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZShuYW1lID0gImNvbXBvbmVudC1pbnN0YW5jZS1vcGVyYXRpb24iKQorCXByaXZhdGUgQ29tcG9uZW50SW5zdGFuY2VPcGVyYXRpb24gcmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvbjsKKworCUBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlKG5hbWUgPSAibGlmZWN5Y2xlLW9wZXJhdGlvbiIpCisJcHJpdmF0ZSBMaWZlY3ljbGVPcGVyYXRpb24gbGlmZWN5Y2xlT3BlcmF0aW9uOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlcnZpY2VPcGVyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVNFUl9JRCA9ICJtdXNlcklkIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfTkFNRSA9ICJjYXRlZ29yeS9teWNhdGVnb3J5IjsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEJlZm9yZUNsYXNzKCkgeworCQkvLyBFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZSgiY2F0YWxvZy1tb2RlbCIpOworCQkvLyBTdHJpbmcgYXBwQ29uZmlnRGlyID0gInNyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY2F0YWxvZy1tb2RlbCI7CisJCS8vIENvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldworCQkvLyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksCisJCS8vIGFwcENvbmZpZ0Rpcik7CisKKwkJLy8gY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIobmV3CisJCS8vIENvbmZpZ3VyYXRpb25Tb3VyY2UoKSB7CisJCS8vCisJCS8vIEBPdmVycmlkZQorCQkvLyBwdWJsaWMgPFQ+IFQgZ2V0QW5kV2F0Y2hDb25maWd1cmF0aW9uKENsYXNzPFQ+IGNsYXNzTmFtZSwKKwkJLy8gQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgeworCQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vIHJldHVybiBudWxsOworCQkvLyB9CisJCS8vCisJCS8vIEBPdmVycmlkZQorCQkvLyBwdWJsaWMgPFQ+IHZvaWQgYWRkV2F0Y2hDb25maWd1cmF0aW9uKENsYXNzPFQ+IGNsYXNzTmFtZSwKKwkJLy8gQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgeworCQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCS8vCisJCS8vIH0KKwkJLy8gfSk7CisKKwkJLy8gU3RyaW5nIGFwcENvbmZpZ0RpciA9ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnIjsKKwkJLy8gQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbmV3CisJCS8vIEZTQ29uZmlndXJhdGlvblNvdXJjZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlTGlzdGVuZXIoKSwKKwkJLy8gYXBwQ29uZmlnRGlyKTsKKwkJLy8gY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvblNvdXJjZSk7CisJCS8vCisJCS8vIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisJCS8vIGNvbmZpZ3VyYXRpb24uc2V0VGl0YW5Jbk1lbW9yeUdyYXBoKHRydWUpOworCQkvLy8vIGNvbmZpZ3VyYXRpb24uc2V0VGl0YW5Jbk1lbW9yeUdyYXBoKGZhbHNlKTsKKwkJLy8vLyBjb25maWd1cmF0aW9uLnNldFRpdGFuQ2ZnRmlsZSgiQzpcXERldlxcZDJcXEQyLVNEbkNcXGNhdGFsb2ctYmVcXHNyY1xcbWFpblxccmVzb3VyY2VzXFxjb25maWdcXHRpdGFuLnByb3BlcnRpZXMiKTsKKwkJLy8KKwkJLy8gY29uZmlndXJhdGlvbk1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKKworCQlNb2RlbFRlc3RCYXNlLmluaXQoKTsKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgY3JlYXRlVXNlckFuZENhdGVnb3J5KCkgeworCQlkZWxldGVBbmRDcmVhdGVDYXRlZ29yeShDQVRFR09SWV9OQU1FKTsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcihVU0VSX0lELCAiZmlyc3RfIiArIFVTRVJfSUQsICJsYXN0XyIgKyBVU0VSX0lELCBudWxsKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGR1bW15VGVzdCgpIHsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVNlcnZpY2UoKSB7CisJCVN0cmluZyBjYXRlZ29yeSA9IENBVEVHT1JZX05BTUU7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJzZXJ2Y2VUZXN0IjsKKwkJU3RyaW5nIHNlcnZpY2VWZXJzaW9uID0gIjAuMSI7CisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCQlTZXJ2aWNlIHNlcnZpY2VBZnRlclNhdmUgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgdHJ1ZSk7CisJCWxvZy5kZWJ1ZygiICoqKiBjcmVhdGUgKioiKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHNlcnZpY2VBZnRlclNhdmUpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VHZXQgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2UodW5pcXVlSWQpOworCQlhc3NlcnRUcnVlKHNlcnZpY2VHZXQuaXNMZWZ0KCkpOworCQlsb2cuZGVidWcoIiAqKiogZ2V0ICoqIik7CisJCWxvZy5kZWJ1Zygie30iLCBzZXJ2aWNlR2V0LmxlZnQoKS52YWx1ZSgpKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZURlbGV0ZSA9IHNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZSh1bmlxdWVJZCk7CisKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlRGVsZXRlLmlzTGVmdCgpKTsKKwkJbG9nLmRlYnVnKCIgKioqIGRlbGV0ZSAqKiIpOworCQlsb2cuZGVidWcoInt9Iiwgc2VydmljZURlbGV0ZS5sZWZ0KCkudmFsdWUoKSk7CisKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFydGlmYWN0cyA9IHRpdGFuRGFvLmdldEJ5Q3JpdGVyaWEoTm9kZVR5cGVFbnVtLkFydGlmYWN0UmVmLAorCQkJCW51bGwsIEFydGlmYWN0RGF0YS5jbGFzcyk7CisJCWFzc2VydFRydWUoYXJ0aWZhY3RzLmlzUmlnaHQoKSk7CisJCWFzc2VydEVxdWFscyhUaXRhbk9wZXJhdGlvblN0YXR1cy5OT1RfRk9VTkQsIGFydGlmYWN0cy5yaWdodCgpLnZhbHVlKCkpOworCisJCXNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFV0aWxzU2VydmljZSgpIHsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gInNlcnZjZVRlc3QyIjsKKwkJU3RyaW5nIHNlcnZpY2VWZXJzaW9uID0gIjAuMSI7CisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCQlTZXJ2aWNlIHNlcnZpY2VBZnRlclNhdmUgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgdHJ1ZSk7CisJCWxvZy5kZWJ1ZygiICoqKiBjcmVhdGUgKioiKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHNlcnZpY2VBZnRlclNhdmUpOworCQlTdHJpbmcgdW5pcXVlSWQgPSBzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCk7CisKKwkJYm9vbGVhbiBjYW5Xb3JrT25Db21wb25lbnQgPSBDb21wb25lbnRWYWxpZGF0aW9uVXRpbHMuY2FuV29ya09uQ29tcG9uZW50KHVuaXF1ZUlkLCBzZXJ2aWNlT3BlcmF0aW9uLCB1c2VySWQpOworCQlhc3NlcnRUcnVlKGNhbldvcmtPbkNvbXBvbmVudCk7CisKKwkJY2FuV29ya09uQ29tcG9uZW50ID0gQ29tcG9uZW50VmFsaWRhdGlvblV0aWxzLmNhbldvcmtPbkNvbXBvbmVudChzZXJ2aWNlQWZ0ZXJTYXZlLCB1c2VySWQpOworCQlhc3NlcnRUcnVlKGNhbldvcmtPbkNvbXBvbmVudCk7CisKKwkJU3RvcmFnZU9wZXJhdGlvblN0YXR1cyBsb2NrQ29tcG9uZW50ID0gZ3JhcGhMb2NrT3BlcmF0aW9uLmxvY2tDb21wb25lbnQodW5pcXVlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlKTsKKwkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2VPcGVyYXRpb25TdGF0dXMuT0ssIGxvY2tDb21wb25lbnQpOworCisJCWxvY2tDb21wb25lbnQgPSBncmFwaExvY2tPcGVyYXRpb24udW5sb2NrQ29tcG9uZW50KHVuaXF1ZUlkLCBOb2RlVHlwZUVudW0uU2VydmljZSk7CisJCWFzc2VydEVxdWFscyhTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLk9LLCBsb2NrQ29tcG9uZW50KTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZURlbGV0ZSA9IHNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZSh1bmlxdWVJZCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VDb3VudGVyKCkgeworCQlTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9OQU1FOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSAic2VydmNlVGVzdDIiOworCQlTdHJpbmcgc2VydmljZVZlcnNpb24gPSAiMC4xIjsKKwkJU3RyaW5nIHVzZXJJZCA9IFVTRVJfSUQ7CisJCVNlcnZpY2Ugc2VydmljZUFmdGVyU2F2ZSA9IGNyZWF0ZVNlcnZpY2UodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCB0cnVlKTsKKwkJbG9nLmRlYnVnKCIgKioqIGNyZWF0ZSAqKiIpOworCQlsb2cuZGVidWcoInt9Iiwgc2VydmljZUFmdGVyU2F2ZSk7CisKKwkJRWl0aGVyPEludGVnZXIsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNvdW50ZXIgPSBzZXJ2aWNlT3BlcmF0aW9uCisJCQkJLmluY3JlYXNlQW5kR2V0Q29tcG9uZW50SW5zdGFuY2VDb3VudGVyKHNlcnZpY2VBZnRlclNhdmUuZ2V0VW5pcXVlSWQoKSwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjb3VudGVyLmlzTGVmdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCAoSW50ZWdlcikgY291bnRlci5sZWZ0KCkudmFsdWUoKSk7CisKKwkJY291bnRlciA9IHNlcnZpY2VPcGVyYXRpb24uaW5jcmVhc2VBbmRHZXRDb21wb25lbnRJbnN0YW5jZUNvdW50ZXIoc2VydmljZUFmdGVyU2F2ZS5nZXRVbmlxdWVJZCgpLAorCQkJCU5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmYWxzZSk7CisJCWFzc2VydFRydWUoY291bnRlci5pc0xlZnQoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgKEludGVnZXIpIGNvdW50ZXIubGVmdCgpLnZhbHVlKCkpOworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZURlbGV0ZSA9IHNlcnZpY2VPcGVyYXRpb24KKwkJCQkuZGVsZXRlU2VydmljZShzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEFkZEFydGlmYWN0VG9TZXJ2aWNlKCkgeworCQlTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9OQU1FOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSAic2VydmNlVGVzdDIiOworCQlTdHJpbmcgc2VydmljZVZlcnNpb24gPSAiMC4xIjsKKwkJU3RyaW5nIHVzZXJJZCA9IFVTRVJfSUQ7CisJCVNlcnZpY2Ugc2VydmljZUFmdGVyU2F2ZSA9IGNyZWF0ZVNlcnZpY2UodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uLCB0cnVlKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHNlcnZpY2VBZnRlclNhdmUpOworCQlTdHJpbmcgc2VydmljZUlkID0gc2VydmljZUFmdGVyU2F2ZS5nZXRVbmlxdWVJZCgpOworCisJCUFydGlmYWN0RGVmaW5pdGlvbiBhcnRpZmFjdEluZm8gPSBhZGRBcnRpZmFjdFRvU2VydmljZSh1c2VySWQsIHNlcnZpY2VJZCwgImluc3RhbGxfYXBhY2hlIik7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2UgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uoc2VydmljZUlkKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlLmlzTGVmdCgpKTsKKworCQlNYXA8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGFydGlmYWN0cyA9IHNlcnZpY2UubGVmdCgpLnZhbHVlKCkuZ2V0QXJ0aWZhY3RzKCk7CisJCWFzc2VydEVxdWFscygxLCBhcnRpZmFjdHMuc2l6ZSgpKTsKKworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFydGlmYWN0RGVmaW5pdGlvbj4gZW50cnkgOiBhcnRpZmFjdHMuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIGFydGlmYWN0SWQgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFVuaXF1ZUlkKCk7CisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpLmdldERlc2NyaXB0aW9uKCk7CisJCQlhc3NlcnRFcXVhbHMoImhka2Zoc2tkZmdoIiwgZGVzY3JpcHRpb24pOworCisJCQlhcnRpZmFjdEluZm8uc2V0RGVzY3JpcHRpb24oImpnaGxzayBuZXcgZGVzZm5qZGgiKTsKKworCQkJYXJ0aWZhY3RPcGVyYXRpb24udXBkYXRlQXJpZmFjdE9uUmVzb3VyY2UoYXJ0aWZhY3RJbmZvLCBzZXJ2aWNlSWQsIGFydGlmYWN0SWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBmYWxzZSk7CisJCX0KKworCQlzZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWFzc2VydFRydWUoc2VydmljZS5pc0xlZnQoKSk7CisKKwkJYXJ0aWZhY3RzID0gc2VydmljZS5sZWZ0KCkudmFsdWUoKS5nZXRBcnRpZmFjdHMoKTsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnRpZmFjdERlZmluaXRpb24+IGVudHJ5IDogYXJ0aWZhY3RzLmVudHJ5U2V0KCkpIHsKKwkJCVN0cmluZyBhcnRpZmFjdElkID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZW50cnkuZ2V0VmFsdWUoKS5nZXREZXNjcmlwdGlvbigpOworCQkJYXNzZXJ0RXF1YWxzKCJqZ2hsc2sgbmV3IGRlc2ZuamRoIiwgZGVzY3JpcHRpb24pOworCisJCQlhcnRpZmFjdE9wZXJhdGlvbi5yZW1vdmVBcmlmYWN0RnJvbVJlc291cmNlKHNlcnZpY2VJZCwgYXJ0aWZhY3RJZCwgTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHRydWUsIGZhbHNlKTsKKwkJfQorCQlzZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWFzc2VydFRydWUoc2VydmljZS5pc0xlZnQoKSk7CisKKwkJYXJ0aWZhY3RzID0gc2VydmljZS5sZWZ0KCkudmFsdWUoKS5nZXRBcnRpZmFjdHMoKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGFydGlmYWN0cy5zaXplKCkpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlRGVsZXRlID0gc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZCk7CisKKwkJRWl0aGVyPExpc3Q8QXJ0aWZhY3REYXRhPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGJ5Q3JpdGVyaWEgPSB0aXRhbkRhby5nZXRCeUNyaXRlcmlhKE5vZGVUeXBlRW51bS5BcnRpZmFjdFJlZiwKKwkJCQludWxsLCBBcnRpZmFjdERhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGJ5Q3JpdGVyaWEuaXNSaWdodCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRpdGFuT3BlcmF0aW9uU3RhdHVzLk5PVF9GT1VORCwgYnlDcml0ZXJpYS5yaWdodCgpLnZhbHVlKCkpOworCisJCXNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCkpOworCisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdERlZmluaXRpb24gYWRkQXJ0aWZhY3RUb1NlcnZpY2UoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHNlcnZpY2VJZCwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQlBcnRpZmFjdERlZmluaXRpb24gYXJ0aWZhY3RJbmZvID0gbmV3IEFydGlmYWN0RGVmaW5pdGlvbigpOworCisJCWFydGlmYWN0SW5mby5zZXRBcnRpZmFjdE5hbWUoYXJ0aWZhY3ROYW1lICsgIi5zaCIpOworCQlhcnRpZmFjdEluZm8uc2V0QXJ0aWZhY3RUeXBlKCJTSEVMTCIpOworCQlhcnRpZmFjdEluZm8uc2V0RGVzY3JpcHRpb24oImhka2Zoc2tkZmdoIik7CisJCWFydGlmYWN0SW5mby5zZXRQYXlsb2FkRGF0YSgiVUVzREJBb0FBQUFJQUFlTGIwYkRReiIpOworCisJCWFydGlmYWN0SW5mby5zZXRVc2VySWRDcmVhdG9yKHVzZXJJZCk7CisJCVN0cmluZyBmdWxsTmFtZSA9ICJKaW0gSCI7CisJCWFydGlmYWN0SW5mby5zZXRVcGRhdGVyRnVsbE5hbWUoZnVsbE5hbWUpOworCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJYXJ0aWZhY3RJbmZvLnNldENyZWF0b3JGdWxsTmFtZShmdWxsTmFtZSk7CisJCWFydGlmYWN0SW5mby5zZXRDcmVhdGlvbkRhdGUodGltZSk7CisJCWFydGlmYWN0SW5mby5zZXRMYXN0VXBkYXRlRGF0ZSh0aW1lKTsKKworCQlhcnRpZmFjdEluZm8uc2V0VXNlcklkTGFzdFVwZGF0ZXIodXNlcklkKTsKKwkJYXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0TGFiZWwoYXJ0aWZhY3ROYW1lKTsKKwkJYXJ0aWZhY3RJbmZvLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZFByb3BlcnR5VW5pcXVlSWQoc2VydmljZUlkLCBhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKSk7CisKKwkJRWl0aGVyPEFydGlmYWN0RGVmaW5pdGlvbiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gYXJ0aWZhY3QgPSBhcnRpZmFjdE9wZXJhdGlvbgorCQkJCS5hZGRBcmlmYWN0VG9Db21wb25lbnQoYXJ0aWZhY3RJbmZvLCBzZXJ2aWNlSWQsIE5vZGVUeXBlRW51bS5TZXJ2aWNlLCB0cnVlLCB0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShhcnRpZmFjdC5pc0xlZnQoKSk7CisJCXJldHVybiBhcnRpZmFjdEluZm87CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Rm9sbG93ZWQoKSB7CisJCVN0cmluZyBjYXRlZ29yeSA9IENBVEVHT1JZX05BTUU7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJzZXJ2Y2VUZXN0MiI7CisJCVN0cmluZyBzZXJ2aWNlVmVyc2lvbiA9ICIwLjEiOworCQlTdHJpbmcgdXNlcklkID0gVVNFUl9JRDsKKwkJU2VydmljZSBzZXJ2aWNlQWZ0ZXJTYXZlID0gY3JlYXRlU2VydmljZSh1c2VySWQsIGNhdGVnb3J5LCBzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24sIHRydWUpOworCQlsb2cuZGVidWcoInt9Iiwgc2VydmljZUFmdGVyU2F2ZSk7CisJCVN0cmluZyBzZXJ2aWNlSWQgPSBzZXJ2aWNlQWZ0ZXJTYXZlLmdldFVuaXF1ZUlkKCk7CisKKwkJU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzID0gbmV3IEhhc2hTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPigpOworCQlsaWZlY3ljbGVTdGF0ZXMuYWRkKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwkJU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGFzdFN0YXRlU3RhdGVzID0gbmV3IEhhc2hTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPigpOworCQlsYXN0U3RhdGVTdGF0ZXMuYWRkKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQpOworCisJCUVpdGhlcjxMaXN0PFNlcnZpY2U+LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBmb2xsb3dlZCA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0Rm9sbG93ZWQodXNlcklkLCBsaWZlY3ljbGVTdGF0ZXMsCisJCQkJbGFzdFN0YXRlU3RhdGVzLCBmYWxzZSk7CisJCWFzc2VydFRydWUoZm9sbG93ZWQuaXNMZWZ0KCkpOworCQlMaXN0PFNlcnZpY2U+IGxpc3QgPSBmb2xsb3dlZC5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2VydmljZSgpIHsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gIjEyIjsKKwkJU3RyaW5nIHNlcnZpY2VWZXJzaW9uID0gIjAuMSI7CisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCQlTZXJ2aWNlIHNlcnZpY2VBZnRlclNhdmUgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgdHJ1ZSk7CisJCWxvZy5kZWJ1Zygie30iLCBzZXJ2aWNlQWZ0ZXJTYXZlKTsKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IHNlcnZpY2VBZnRlclNhdmUuZ2V0VW5pcXVlSWQoKTsKKwkJc2VydmljZUFmdGVyU2F2ZS5zZXREZXNjcmlwdGlvbigibmV3IGRlc2NyaXB0aW9uIik7CisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiB1cGRhdGVTZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi51cGRhdGVTZXJ2aWNlKHNlcnZpY2VBZnRlclNhdmUsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZSh1cGRhdGVTZXJ2aWNlLmlzTGVmdCgpKTsKKworCQl0aXRhbkRhby5jb21taXQoKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZUFmdGVyVXBkYXRlID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VJZCwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHNlcnZpY2VBZnRlclVwZGF0ZS5pc0xlZnQoKSk7CisKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCWFzc2VydEVxdWFscygibmV3IGRlc2NyaXB0aW9uIiwgc2VydmljZUFmdGVyVXBkYXRlLmxlZnQoKS52YWx1ZSgpLmdldERlc2NyaXB0aW9uKCkpOworCisJfQorCisJcHVibGljIFNlcnZpY2UgY3JlYXRlU2VydmljZShTdHJpbmcgdXNlcklkLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHNlcnZpY2VWZXJzaW9uLAorCQkJYm9vbGVhbiBpc0hpZ2hlc3RWZXJzaW9uKSB7CisKKwkJU2VydmljZSBzZXJ2aWNlID0gYnVpbGRTZXJ2aWNlTWV0YWRhdGEodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUsIHNlcnZpY2VWZXJzaW9uKTsKKworCQlzZXJ2aWNlLnNldEhpZ2hlc3RWZXJzaW9uKGlzSGlnaGVzdFZlcnNpb24pOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBzZXJ2aWNlT3BlcmF0aW9uLmNyZWF0ZVNlcnZpY2Uoc2VydmljZSwgdHJ1ZSk7CisKKwkJbG9nLmluZm8ocmVzdWx0LnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKHJlc3VsdC5pc0xlZnQoKSk7CisJCVNlcnZpY2UgcmVzdWx0U2VydmljZSA9IHJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIHVuaXF1ZSBpZCIsCisJCS8vIFVuaXF1ZUlkQnVpbGRlci5idWlsZFNlcnZpY2VVbmlxdWVJZChzZXJ2aWNlTmFtZSwgc2VydmljZVZlcnNpb24pLAorCQkvLyByZXN1bHRTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHJlc291cmNlIHN0YXRlIiwgTGlmZWN5Y2xlU3RhdGVFbnVtLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQsCisJCQkJcmVzdWx0U2VydmljZS5nZXRMaWZlY3ljbGVTdGF0ZSgpKTsKKworCQlyZXR1cm4gcmVzdWx0U2VydmljZTsKKwl9CisKKwkvLyBAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbG9uZUZ1bGxTZXJ2aWNlKCkgeworCQkvLyB0cnl7CisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCQkvLyBFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZGVsZXRlU2VydmljZSA9CisJCS8vIHNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShVbmlxdWVJZEJ1aWxkZXIuYnVpbGRTZXJ2aWNlVW5pcXVlSWQoIm15LXNlcnZpY2UiLAorCQkvLyAiMS4wIiksIGZhbHNlKTsKKwkJLy8gbG9nLmluZm8oInRlc3RDbG9uZUZ1bGxTZXJ2aWNlIC0gYWZ0ZXIgZGVsZXRlIHNlcnZpY2UuIHJlc3VsdAorCQkvLyBpcz0iK2RlbGV0ZVNlcnZpY2UpOworCQlTZXJ2aWNlIG9yaWdTZXJ2aWNlID0gY3JlYXRlU2VydmljZSh1c2VySWQsIENBVEVHT1JZX05BTUUsICJteS1zZXJ2aWNlIiwgIjEuMCIsIHRydWUpOworCisJCS8vIGFkZCBhcnRpZmFjdHMKKwkJYWRkQXJ0aWZhY3RUb1NlcnZpY2UodXNlcklkLCBvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpLCAiaW5zdGFsbF9hcGFjaGUiKTsKKwkJYWRkQXJ0aWZhY3RUb1NlcnZpY2UodXNlcklkLCBvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpLCAic3RhcnRfYXBhY2hlIik7CisKKwkJLy8gYWRkIHJlc291cmNlIGluc3RhbmNlcworCQlSZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uVGVzdCByaVRlc3QgPSBuZXcgUmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvblRlc3QoKTsKKwkJcmlUZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uLCByZXF1aXJlbWVudE9wZXJhdGlvbiwgY2FwYWJpbGl0eU9wZXJhdGlvbiwKKwkJCQlyZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24sIHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24pOworCQlyaVRlc3QuYWRkUmVzb3VyY2VJbnN0YW5jZXNBbmRSZWxhdGlvbihvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZTIgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uob3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQlmYWxzZSk7CisJCWFzc2VydFRydWUoc2VydmljZTIuaXNMZWZ0KCkpOworCQlvcmlnU2VydmljZSA9IHNlcnZpY2UyLmxlZnQoKS52YWx1ZSgpOworCisJCUdzb24gcHJldHR5R3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCVN0cmluZyBqc29uID0gcHJldHR5R3Nvbi50b0pzb24ob3JpZ1NlcnZpY2UpOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJU2VydmljZSBmdWxsU2VydmljZSA9IG9yaWdTZXJ2aWNlOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVTZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5jbG9uZVNlcnZpY2UoZnVsbFNlcnZpY2UsICIyLjAiLAorCQkJCWZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VBZnRlckNyZWF0ZSA9IHNlcnZpY2VPcGVyYXRpb24KKwkJCQkuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oIm15LXNlcnZpY2UiLCAiMi4wIiwgbnVsbCwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHNlcnZpY2VBZnRlckNyZWF0ZS5pc0xlZnQoKSk7CisJCWZ1bGxTZXJ2aWNlID0gc2VydmljZUFmdGVyQ3JlYXRlLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPcmlnU2VydmljZSA9IHNlcnZpY2VPcGVyYXRpb24KKwkJCQkuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oIm15LXNlcnZpY2UiLCAiMS4wIiwgbnVsbCwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGdldE9yaWdTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJb3JpZ1NlcnZpY2UgPSBnZXRPcmlnU2VydmljZS5sZWZ0KCkudmFsdWUoKTsKKworCQkvLyBhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCksCisJCS8vIGZ1bGxTZXJ2aWNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldEFydGlmYWN0cygpLnNpemUoKSwgZnVsbFNlcnZpY2UuZ2V0QXJ0aWZhY3RzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSwgZnVsbFNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpLnNpemUoKSwKKwkJCQlmdWxsU2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKS5zaXplKCkpOworCisJCW9yaWdTZXJ2aWNlLnNldFVuaXF1ZUlkKGZ1bGxTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlvcmlnU2VydmljZS5zZXRWZXJzaW9uKGZ1bGxTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLCBmdWxsU2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRDYXRlZ29yaWVzKCksIGZ1bGxTZXJ2aWNlLmdldENhdGVnb3JpZXMoKSk7CisKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKG9yaWdTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2Uoc2VydmljZUFmdGVyQ3JlYXRlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIH0gZmluYWxseSB7CisJCS8vIHRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCS8vIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlQWZ0ZXJDcmVhdGUgPQorCQkvLyBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2UoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkU2VydmljZVVuaXF1ZUlkKCJteS1zZXJ2aWNlIiwKKwkJLy8gIjIuMCIpLCB0cnVlKTsKKwkJLy8gYXNzZXJ0VHJ1ZShzZXJ2aWNlQWZ0ZXJDcmVhdGUuaXNSaWdodCgpKTsKKwkJLy8KKwkJLy8gRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE9yaWdTZXJ2aWNlID0KKwkJLy8gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKFVuaXF1ZUlkQnVpbGRlci5idWlsZFNlcnZpY2VVbmlxdWVJZCgibXktc2VydmljZSIsCisJCS8vICIxLjAiKSwgdHJ1ZSk7CisJCS8vIGFzc2VydFRydWUoZ2V0T3JpZ1NlcnZpY2UuaXNSaWdodCgpKTsKKwkJLy8gdGl0YW5EYW8ucm9sbGJhY2soKTsKKwkJLy8gfQorCX0KKworCS8vIEBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsb25lU2VydmljZVdpdGhvdXRSZXNvdXJjZUluc3RhbmNlcygpIHsKKwkJLy8gdHJ5eworCQlTdHJpbmcgdXNlcklkID0gVVNFUl9JRDsKKwkJLy8gRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGRlbGV0ZVNlcnZpY2UgPQorCQkvLyBzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2UoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkU2VydmljZVVuaXF1ZUlkKCJteS1zZXJ2aWNlIiwKKwkJLy8gIjEuMCIpLCBmYWxzZSk7CisJCS8vIGxvZy5pbmZvKCJ0ZXN0Q2xvbmVTZXJ2aWNlV2l0aG91dFJlc291cmNlSW5zdGFuY2VzIC0gYWZ0ZXIgZGVsZXRlCisJCS8vIHNlcnZpY2UuIHJlc3VsdCBpcz0iK2RlbGV0ZVNlcnZpY2UpOworCQlTZXJ2aWNlIG9yaWdTZXJ2aWNlID0gY3JlYXRlU2VydmljZSh1c2VySWQsIENBVEVHT1JZX05BTUUsICJteS1zZXJ2aWNlIiwgIjEuMCIsIHRydWUpOworCisJCS8vIGFkZCBhcnRpZmFjdHMKKwkJYWRkQXJ0aWZhY3RUb1NlcnZpY2UodXNlcklkLCBvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpLCAiaW5zdGFsbF9hcGFjaGUiKTsKKwkJYWRkQXJ0aWZhY3RUb1NlcnZpY2UodXNlcklkLCBvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpLCAic3RhcnRfYXBhY2hlIik7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2UyID0gc2VydmljZU9wZXJhdGlvbi5nZXRTZXJ2aWNlKG9yaWdTZXJ2aWNlLmdldFVuaXF1ZUlkKCksCisJCQkJZmFsc2UpOworCQlhc3NlcnRUcnVlKHNlcnZpY2UyLmlzTGVmdCgpKTsKKwkJb3JpZ1NlcnZpY2UgPSBzZXJ2aWNlMi5sZWZ0KCkudmFsdWUoKTsKKworCQlHc29uIHByZXR0eUdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCQlTdHJpbmcganNvbiA9IHByZXR0eUdzb24udG9Kc29uKG9yaWdTZXJ2aWNlKTsKKwkJbG9nLmRlYnVnKGpzb24pOworCisJCVNlcnZpY2UgZnVsbFNlcnZpY2UgPSBvcmlnU2VydmljZTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY3JlYXRlU2VydmljZSA9IHNlcnZpY2VPcGVyYXRpb24uY2xvbmVTZXJ2aWNlKGZ1bGxTZXJ2aWNlLCAiMi4wIiwKKwkJCQlmYWxzZSk7CisJCWFzc2VydFRydWUoY3JlYXRlU2VydmljZS5pc0xlZnQoKSk7CisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzZXJ2aWNlQWZ0ZXJDcmVhdGUgPSBzZXJ2aWNlT3BlcmF0aW9uCisJCQkJLmdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKCJteS1zZXJ2aWNlIiwgIjIuMCIsIG51bGwsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlQWZ0ZXJDcmVhdGUuaXNMZWZ0KCkpOworCQlmdWxsU2VydmljZSA9IHNlcnZpY2VBZnRlckNyZWF0ZS5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gZ2V0T3JpZ1NlcnZpY2UgPSBzZXJ2aWNlT3BlcmF0aW9uCisJCQkJLmdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKCJteS1zZXJ2aWNlIiwgIjEuMCIsIG51bGwsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShnZXRPcmlnU2VydmljZS5pc0xlZnQoKSk7CisJCW9yaWdTZXJ2aWNlID0gZ2V0T3JpZ1NlcnZpY2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLAorCQkvLyBmdWxsU2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRBcnRpZmFjdHMoKS5zaXplKCksIGZ1bGxTZXJ2aWNlLmdldEFydGlmYWN0cygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXMoKSwgZnVsbFNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkpOworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKCksIGZ1bGxTZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpKTsKKworCQlvcmlnU2VydmljZS5zZXRVbmlxdWVJZChmdWxsU2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJb3JpZ1NlcnZpY2Uuc2V0VmVyc2lvbihmdWxsU2VydmljZS5nZXRWZXJzaW9uKCkpOworCisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSwgZnVsbFNlcnZpY2UuZ2V0Q29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0Q2F0ZWdvcmllcygpLCBmdWxsU2VydmljZS5nZXRDYXRlZ29yaWVzKCkpOworCisJCXNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShnZXRPcmlnU2VydmljZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VBZnRlckNyZWF0ZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKworCQkvLyB9IGZpbmFsbHkgeworCQkvLyB0aXRhbkRhby5yb2xsYmFjaygpOworCQkvLyB9CisJfQorCisJLy8gQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmVTZXJ2aWNlV2l0aG91dEFydGlmYWN0cygpIHsKKwkJLy8gdHJ5eworCisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCisJCVNlcnZpY2Ugb3JpZ1NlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgQ0FURUdPUllfTkFNRSwgIm15LXNlcnZpY2UiLCAiMS4wIiwgdHJ1ZSk7CisKKwkJLy8gYWRkIHJlc291cmNlIGluc3RhbmNlcworCQlSZXNvdXJjZUluc3RhbmNlT3BlcmF0aW9uVGVzdCByaVRlc3QgPSBuZXcgUmVzb3VyY2VJbnN0YW5jZU9wZXJhdGlvblRlc3QoKTsKKwkJcmlUZXN0LnNldE9wZXJhdGlvbnModGl0YW5EYW8sIGNhcGFiaWxpdHlUeXBlT3BlcmF0aW9uLCByZXF1aXJlbWVudE9wZXJhdGlvbiwgY2FwYWJpbGl0eU9wZXJhdGlvbiwKKwkJCQlyZXNvdXJjZU9wZXJhdGlvbiwgcHJvcGVydHlPcGVyYXRpb24sIHJlc291cmNlSW5zdGFuY2VPcGVyYXRpb24pOworCQlyaVRlc3QuYWRkUmVzb3VyY2VJbnN0YW5jZXNBbmRSZWxhdGlvbihvcmlnU2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKworCQlFaXRoZXI8U2VydmljZSwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZTIgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFNlcnZpY2Uob3JpZ1NlcnZpY2UuZ2V0VW5pcXVlSWQoKSwKKwkJCQlmYWxzZSk7CisJCWFzc2VydFRydWUoc2VydmljZTIuaXNMZWZ0KCkpOworCQlvcmlnU2VydmljZSA9IHNlcnZpY2UyLmxlZnQoKS52YWx1ZSgpOworCisJCUdzb24gcHJldHR5R3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCVN0cmluZyBqc29uID0gcHJldHR5R3Nvbi50b0pzb24ob3JpZ1NlcnZpY2UpOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJU2VydmljZSBmdWxsU2VydmljZSA9IG9yaWdTZXJ2aWNlOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVTZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5jbG9uZVNlcnZpY2UoZnVsbFNlcnZpY2UsICIyLjAiLAorCQkJCWZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VBZnRlckNyZWF0ZSA9IHNlcnZpY2VPcGVyYXRpb24KKwkJCQkuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oIm15LXNlcnZpY2UiLCAiMi4wIiwgbnVsbCwgZmFsc2UpOworCQlhc3NlcnRUcnVlKHNlcnZpY2VBZnRlckNyZWF0ZS5pc0xlZnQoKSk7CisJCWZ1bGxTZXJ2aWNlID0gc2VydmljZUFmdGVyQ3JlYXRlLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBnZXRPcmlnU2VydmljZSA9IHNlcnZpY2VPcGVyYXRpb24KKwkJCQkuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oIm15LXNlcnZpY2UiLCAiMS4wIiwgbnVsbCwgZmFsc2UpOworCQlhc3NlcnRUcnVlKGdldE9yaWdTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJb3JpZ1NlcnZpY2UgPSBnZXRPcmlnU2VydmljZS5sZWZ0KCkudmFsdWUoKTsKKworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0QXJ0aWZhY3RzKCksIGZ1bGxTZXJ2aWNlLmdldEFydGlmYWN0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpLnNpemUoKSwgZnVsbFNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpLnNpemUoKSwKKwkJCQlmdWxsU2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKS5zaXplKCkpOworCisJCW9yaWdTZXJ2aWNlLnNldFVuaXF1ZUlkKGZ1bGxTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlvcmlnU2VydmljZS5zZXRWZXJzaW9uKGZ1bGxTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLCBmdWxsU2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRDYXRlZ29yaWVzKCksIGZ1bGxTZXJ2aWNlLmdldENhdGVnb3JpZXMoKSk7CisKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VBZnRlckNyZWF0ZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpKTsKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKGdldE9yaWdTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIH0gZmluYWxseSB7CisJCS8vIHRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCS8vIH0KKwl9CisKKwkvLyBAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbG9uZVNlcnZpY2VTaW1wbGUoKSB7CisJCS8vIHRyeXsKKwkJU3RyaW5nIHVzZXJJZCA9IFVTRVJfSUQ7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJzZXJ2aWNlVG9DbG9uZSI7CisJCS8vCisJCS8vIEVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBkZWxldGVTZXJ2aWNlID0KKwkJLy8gc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKFVuaXF1ZUlkQnVpbGRlci5idWlsZFNlcnZpY2VVbmlxdWVJZChzZXJ2aWNlTmFtZSwKKwkJLy8gIjEuMCIpKTsKKwkJLy8gbG9nLmluZm8oInRlc3RDbG9uZVNlcnZpY2VTaW1wbGUgLSBhZnRlciBkZWxldGUgc2VydmljZS4gcmVzdWx0CisJCS8vIGlzPSIrZGVsZXRlU2VydmljZSk7CisKKwkJU2VydmljZSBvcmlnU2VydmljZSA9IGNyZWF0ZVNlcnZpY2UodXNlcklkLCBDQVRFR09SWV9OQU1FLCBzZXJ2aWNlTmFtZSwgIjEuMCIsIHRydWUpOworCisJCUdzb24gcHJldHR5R3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisJCVN0cmluZyBqc29uID0gcHJldHR5R3Nvbi50b0pzb24ob3JpZ1NlcnZpY2UpOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJU2VydmljZSBmdWxsU2VydmljZSA9IG9yaWdTZXJ2aWNlOworCisJCUVpdGhlcjxTZXJ2aWNlLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVTZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbi5jbG9uZVNlcnZpY2UoZnVsbFNlcnZpY2UsICIyLjAiLAorCQkJCWZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShjcmVhdGVTZXJ2aWNlLmlzTGVmdCgpKTsKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHNlcnZpY2VBZnRlckNyZWF0ZSA9IHNlcnZpY2VPcGVyYXRpb24KKwkJCQkuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24oc2VydmljZU5hbWUsICIyLjAiLCBudWxsLCBmYWxzZSk7CisJCWFzc2VydFRydWUoc2VydmljZUFmdGVyQ3JlYXRlLmlzTGVmdCgpKTsKKwkJZnVsbFNlcnZpY2UgPSBzZXJ2aWNlQWZ0ZXJDcmVhdGUubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPFNlcnZpY2UsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGdldE9yaWdTZXJ2aWNlID0gc2VydmljZU9wZXJhdGlvbgorCQkJCS5nZXRTZXJ2aWNlQnlOYW1lQW5kVmVyc2lvbihzZXJ2aWNlTmFtZSwgIjEuMCIsIG51bGwsIGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShnZXRPcmlnU2VydmljZS5pc0xlZnQoKSk7CisJCW9yaWdTZXJ2aWNlID0gZ2V0T3JpZ1NlcnZpY2UubGVmdCgpLnZhbHVlKCk7CisKKwkJLy8gYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLAorCQkvLyBmdWxsU2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRBcnRpZmFjdHMoKSwgZnVsbFNlcnZpY2UuZ2V0QXJ0aWZhY3RzKCkpOworCQlhc3NlcnRFcXVhbHMob3JpZ1NlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzKCksIGZ1bGxTZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlcygpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucygpLCBmdWxsU2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMoKSk7CisJCW9yaWdTZXJ2aWNlLnNldFVuaXF1ZUlkKGZ1bGxTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQlvcmlnU2VydmljZS5zZXRWZXJzaW9uKGZ1bGxTZXJ2aWNlLmdldFZlcnNpb24oKSk7CisKKwkJYXNzZXJ0RXF1YWxzKG9yaWdTZXJ2aWNlLmdldENvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbigpLCBmdWxsU2VydmljZS5nZXRDb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhvcmlnU2VydmljZS5nZXRDYXRlZ29yaWVzKCksIGZ1bGxTZXJ2aWNlLmdldENhdGVnb3JpZXMoKSk7CisKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKGdldE9yaWdTZXJ2aWNlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCQlzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2Uoc2VydmljZUFmdGVyQ3JlYXRlLmxlZnQoKS52YWx1ZSgpLmdldFVuaXF1ZUlkKCkpOworCisJCS8vIH0gZmluYWxseSB7CisJCS8vIHRpdGFuRGFvLnJvbGxiYWNrKCk7CisJCS8vIH0KKwl9CisKKwlwcml2YXRlIFNlcnZpY2UgYnVpbGRTZXJ2aWNlTWV0YWRhdGEoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlVmVyc2lvbikgeworCisJCVNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlKCk7CisJCXNlcnZpY2Uuc2V0TmFtZShzZXJ2aWNlTmFtZSk7CisJCXNlcnZpY2Uuc2V0VmVyc2lvbihzZXJ2aWNlVmVyc2lvbik7CisJCXNlcnZpY2Uuc2V0RGVzY3JpcHRpb24oImRlc2NyaXB0aW9uIDEiKTsKKworCQlzZXJ2aWNlLnNldENyZWF0b3JVc2VySWQodXNlcklkKTsKKwkJc2VydmljZS5zZXRDb250YWN0SWQoImNvbnRhY3RJZEBzZGMuY29tIik7CisJCUNhdGVnb3J5RGVmaW5pdGlvbiBjYXRlZ29yeURlZiA9IG5ldyBDYXRlZ29yeURlZmluaXRpb24oKTsKKwkJY2F0ZWdvcnlEZWYuc2V0TmFtZShjYXRlZ29yeSk7CisKKwkJTGlzdDxDYXRlZ29yeURlZmluaXRpb24+IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnlEZWYpOworCQlzZXJ2aWNlLnNldENhdGVnb3JpZXMoY2F0ZWdvcmllcyk7CisKKwkJc2VydmljZS5zZXRJY29uKCJpbWFnZXMvbXkucG5nIik7CisJCUxpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRhZ3MuYWRkKCJUQUcxIik7CisJCXRhZ3MuYWRkKCJUQUcyIik7CisJCXNlcnZpY2Uuc2V0VGFncyh0YWdzKTsKKwkJcmV0dXJuIHNlcnZpY2U7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUFuZENyZWF0ZUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworCQlTdHJpbmdbXSBuYW1lcyA9IGNhdGVnb3J5LnNwbGl0KCIvIik7CisJCU9wZXJhdGlvblRlc3RzVXRpbC5kZWxldGVBbmRDcmVhdGVTZXJ2aWNlQ2F0ZWdvcnkoY2F0ZWdvcnksIHRpdGFuRGFvKTsKKwkJT3BlcmF0aW9uVGVzdHNVdGlsLmRlbGV0ZUFuZENyZWF0ZVJlc291cmNlQ2F0ZWdvcnkobmFtZXNbMF0sIG5hbWVzWzFdLCB0aXRhbkRhbyk7CisKKwkJLyoKKwkJICogQ2F0ZWdvcnlEYXRhIGNhdGVnb3J5RGF0YSA9IG5ldyBDYXRlZ29yeURhdGEoKTsKKwkJICogY2F0ZWdvcnlEYXRhLnNldE5hbWUoY2F0ZWdvcnkpOworCQkgKiAKKwkJICogdGl0YW5EYW8uZGVsZXRlTm9kZShjYXRlZ29yeURhdGEsIENhdGVnb3J5RGF0YS5jbGFzcyk7CisJCSAqIEVpdGhlcjxDYXRlZ29yeURhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBjcmVhdGVOb2RlID0KKwkJICogdGl0YW5EYW8uY3JlYXRlTm9kZShjYXRlZ29yeURhdGEsIENhdGVnb3J5RGF0YS5jbGFzcyk7CisJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgY3JlYXRpbmcgY2FldGdvcnkgIiArIGNyZWF0ZU5vZGUpOworCQkgKi8KKworCX0KKworCXByaXZhdGUgVXNlckRhdGEgZGVsZXRlQW5kQ3JlYXRlVXNlcihTdHJpbmcgdXNlcklkLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyByb2xlKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbmV3IFVzZXJEYXRhKCk7CisJCXVzZXJEYXRhLnNldFVzZXJJZCh1c2VySWQpOworCQl1c2VyRGF0YS5zZXRGaXJzdE5hbWUoZmlyc3ROYW1lKTsKKwkJdXNlckRhdGEuc2V0TGFzdE5hbWUobGFzdE5hbWUpOworCQlpZiAocm9sZSAhPSBudWxsICYmICFyb2xlLmlzRW1wdHkoKSkgeworCQkJdXNlckRhdGEuc2V0Um9sZShyb2xlKTsKKwkJfSBlbHNlIHsKKwkJCXVzZXJEYXRhLnNldFJvbGUoIkFETUlOIik7CisJCX0KKworCQl0aXRhbkRhby5kZWxldGVOb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmNyZWF0ZU5vZGUodXNlckRhdGEsIFVzZXJEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY29tbWl0KCk7CisKKwkJcmV0dXJuIHVzZXJEYXRhOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENhdGFsb2dTZXJ2aWNlKCkgeworCQlTdHJpbmcgdXNlcklkID0gVVNFUl9JRDsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gIk15U2VydmljZSI7CisJCVN0cmluZyBzZXJ2aWNlVmVyc2lvbiA9ICIwLjEiOworCQlTZXJ2aWNlIHNlcnZpY2VBZnRlclNhdmUgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lLCBzZXJ2aWNlVmVyc2lvbiwgdHJ1ZSk7CisJCWxvZy5kZWJ1Zygie30iLCBzZXJ2aWNlQWZ0ZXJTYXZlKTsKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IHNlcnZpY2VBZnRlclNhdmUuZ2V0VW5pcXVlSWQoKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisKKwkJRWl0aGVyPFNldDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2F0YWxvZyA9IHNlcnZpY2VPcGVyYXRpb24uZ2V0Q2F0YWxvZ0RhdGEocHJvcGVydGllc1RvTWF0Y2gsCisJCQkJZmFsc2UpOworCQlhc3NlcnRUcnVlKGNhdGFsb2cuaXNMZWZ0KCkpOworCQlTZXQ8U2VydmljZT4gY2F0YWxvZ1NldCA9IGNhdGFsb2cubGVmdCgpLnZhbHVlKCk7CisJCVNldDxTdHJpbmc+IGlkU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworCQlmb3IgKFNlcnZpY2Ugc2VydmljZSA6IGNhdGFsb2dTZXQpIHsKKwkJCWlkU2V0LmFkZChzZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworCQl9CisJCWFzc2VydFRydWUoaWRTZXQuY29udGFpbnMoc2VydmljZUlkKSk7CisJCXNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShzZXJ2aWNlSWQpOworCX0KKworCUBBZnRlcgorCXB1YmxpYyB2b2lkIHRlYXJkb3duKCkgeworCQljbGVhckdyYXBoKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyR3JhcGgoKSB7CisJCUVpdGhlcjxUaXRhbkdyYXBoLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gZ3JhcGhSZXN1bHQgPSB0aXRhbkRhby5nZXRHcmFwaCgpOworCQlUaXRhbkdyYXBoIGdyYXBoID0gZ3JhcGhSZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS52ZXJ0aWNlcygpOworCQlpZiAodmVydGljZXMgIT0gbnVsbCkgeworCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlUaXRhblZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJLy8gZ3JhcGgucmVtb3ZlVmVydGV4KHZlcnRleCk7CisJCQkJdmVydGV4LnJlbW92ZSgpOworCQkJfQorCisJCX0KKwkJdGl0YW5EYW8uY29tbWl0KCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VGVzdGVyRm9sbG93ZWQoKSB7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJUZXN0MSI7CisJCVN0cmluZyBzZXJ2aWNlTmFtZTIgPSAiVGVzdDIiOworCQlTdHJpbmcgc2VydmljZU5hbWUzID0gIlRlc3QzIjsKKwkJU3RyaW5nIHVzZXJJZCA9IFVTRVJfSUQ7CisJCVN0cmluZyB0ZXN0ZXJVc2VySWQgPSAidHQwMDA0IjsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gQ0FURUdPUllfTkFNRTsKKwkJZGVsZXRlQW5kQ3JlYXRlVXNlcih0ZXN0ZXJVc2VySWQsICJ0ZXN0ZXIiLCAibGFzdCIsICJURVNURVIiKTsKKwkJLy8gZGVsZXRlQW5kQ3JlYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpOworCisJCVN0cmluZyBrZXkgPSBVbmlxdWVJZEJ1aWxkZXIuZ2V0S2V5QnlOb2RlVHlwZShOb2RlVHlwZUVudW0uVXNlcik7CisJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGZpbmRVc2VyID0gdGl0YW5EYW8uZ2V0Tm9kZShrZXksIHVzZXJJZCwgVXNlckRhdGEuY2xhc3MpOworCQlVc2VyIGFkbWluVXNlciA9IE9wZXJhdGlvblRlc3RzVXRpbC5jb252ZXJ0VXNlckRhdGFUb1VzZXIoZmluZFVzZXIubGVmdCgpLnZhbHVlKCkpOworCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kVGVzdGVyVXNlciA9IHRpdGFuRGFvLmdldE5vZGUoa2V5LCB0ZXN0ZXJVc2VySWQsIFVzZXJEYXRhLmNsYXNzKTsKKwkJVXNlciB0ZXN0ZXJVc2VyID0gT3BlcmF0aW9uVGVzdHNVdGlsLmNvbnZlcnRVc2VyRGF0YVRvVXNlcihmaW5kVGVzdGVyVXNlci5sZWZ0KCkudmFsdWUoKSk7CisKKwkJLy8gQ3JlYXRlIDMgbmV3IHNlcnZpY2VzCisJCVNlcnZpY2UgcmVzdWx0U2VydmljZSA9IGNyZWF0ZVNlcnZpY2UodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUsICIwLjEiLCBmYWxzZSk7CisJCWxvZy5kZWJ1Zygie30iLCByZXN1bHRTZXJ2aWNlKTsKKwkJU3RyaW5nIHNlcnZpY2VJZCA9IHJlc3VsdFNlcnZpY2UuZ2V0VW5pcXVlSWQoKTsKKwkJU2VydmljZSByZXN1bHRTZXJ2aWNlMiA9IGNyZWF0ZVNlcnZpY2UodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUyLCAiMC4xIiwgZmFsc2UpOworCQlsb2cuZGVidWcoInt9IiwgcmVzdWx0U2VydmljZTIpOworCQlTdHJpbmcgc2VydmljZUlkMiA9IHJlc3VsdFNlcnZpY2UyLmdldFVuaXF1ZUlkKCk7CisJCVNlcnZpY2UgcmVzdWx0U2VydmljZTMgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lMywgIjAuMSIsIGZhbHNlKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHJlc3VsdFNlcnZpY2UzKTsKKwkJU3RyaW5nIHNlcnZpY2VJZDMgPSByZXN1bHRTZXJ2aWNlMy5nZXRVbmlxdWVJZCgpOworCisJCS8vIHVwZGF0ZSAxIHNlcnZpY2UgdG8gUkVBRFlfRk9SX0NFUlRJRklDQVRJT04KKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNlcnRSZXFSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZSwgYWRtaW5Vc2VyLCBhZG1pblVzZXIsIGZhbHNlKTsKKwkJU2VydmljZSBSRkNTZXJ2aWNlID0gKFNlcnZpY2UpIGNlcnRSZXFSZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKFJGQ1NlcnZpY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSwgTGlmZWN5Y2xlU3RhdGVFbnVtLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OKTsKKworCQkvLyB1cGRhdGUgMSBzZXJ2aWNlIHRvIENFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXJ0Q2VydGlmaWNhdGlvblJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZTIsIHRlc3RlclVzZXIsIGFkbWluVXNlciwgZmFsc2UpOworCQlTZXJ2aWNlIElQU2VydmljZSA9IChTZXJ2aWNlKSBzdGFydENlcnRpZmljYXRpb25SZXNwb25zZS5sZWZ0KCkudmFsdWUoKTsKKwkJYXNzZXJ0RXF1YWxzKElQU2VydmljZS5nZXRMaWZlY3ljbGVTdGF0ZSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyk7CisKKwkJU2V0PExpZmVjeWNsZVN0YXRlRW51bT4gbGlmZWN5Y2xlU3RhdGVzID0gbmV3IEhhc2hTZXQ8TGlmZWN5Y2xlU3RhdGVFbnVtPigpOworCQlsaWZlY3ljbGVTdGF0ZXMuYWRkKExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTKTsKKworCQlFaXRoZXI8TGlzdDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZXMgPSBzZXJ2aWNlT3BlcmF0aW9uLmdldFRlc3RlckZvbGxvd2VkKHRlc3RlclVzZXJJZCwKKwkJCQlsaWZlY3ljbGVTdGF0ZXMsIGZhbHNlKTsKKworCQlhc3NlcnRUcnVlKHNlcnZpY2VzLmlzTGVmdCgpKTsKKwkJTGlzdDxTZXJ2aWNlPiByZXN1bHQgPSBzZXJ2aWNlcy5sZWZ0KCkudmFsdWUoKTsKKworCQlMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoU2VydmljZSBzZXJ2aWNlIDogcmVzdWx0KSB7CisJCQlpZHMuYWRkKHNlcnZpY2UuZ2V0VW5pcXVlSWQoKSk7CisJCX0KKwkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoc2VydmljZUlkKSk7CisJCWFzc2VydFRydWUoaWRzLmNvbnRhaW5zKHNlcnZpY2VJZDIpKTsKKwkJYXNzZXJ0RmFsc2UoaWRzLmNvbnRhaW5zKHNlcnZpY2VJZDMpKTsKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZCk7CisJCXNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShzZXJ2aWNlSWQyKTsKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZDMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0T3BzRm9sbG93ZWQoKSB7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJUZXN0MSI7CisJCVN0cmluZyBzZXJ2aWNlTmFtZTIgPSAiVGVzdDIiOworCQlTdHJpbmcgc2VydmljZU5hbWUzID0gIlRlc3QzIjsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lNCA9ICJUZXN0NCI7CisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9OQU1FOworCQlTdHJpbmcga2V5ID0gVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlVzZXIpOworCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kVXNlciA9IHRpdGFuRGFvLmdldE5vZGUoa2V5LCB1c2VySWQsIFVzZXJEYXRhLmNsYXNzKTsKKwkJVXNlciBhZG1pblVzZXIgPSBPcGVyYXRpb25UZXN0c1V0aWwuY29udmVydFVzZXJEYXRhVG9Vc2VyKGZpbmRVc2VyLmxlZnQoKS52YWx1ZSgpKTsKKworCQkvLyBDcmVhdGUgNCBuZXcgc2VydmljZXMKKwkJU2VydmljZSByZXN1bHRTZXJ2aWNlID0gY3JlYXRlU2VydmljZSh1c2VySWQsIGNhdGVnb3J5LCBzZXJ2aWNlTmFtZSwgIjAuMSIsIGZhbHNlKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHJlc3VsdFNlcnZpY2UpOworCQlTdHJpbmcgc2VydmljZUlkID0gcmVzdWx0U2VydmljZS5nZXRVbmlxdWVJZCgpOworCQlTZXJ2aWNlIHJlc3VsdFNlcnZpY2UyID0gY3JlYXRlU2VydmljZSh1c2VySWQsIGNhdGVnb3J5LCBzZXJ2aWNlTmFtZTIsICIwLjEiLCBmYWxzZSk7CisJCWxvZy5kZWJ1Zygie30iLCByZXN1bHRTZXJ2aWNlMik7CisJCVN0cmluZyBzZXJ2aWNlSWQyID0gcmVzdWx0U2VydmljZTIuZ2V0VW5pcXVlSWQoKTsKKwkJU2VydmljZSByZXN1bHRTZXJ2aWNlMyA9IGNyZWF0ZVNlcnZpY2UodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUzLCAiMC4xIiwgZmFsc2UpOworCQlsb2cuZGVidWcoInt9IiwgcmVzdWx0U2VydmljZTMpOworCQlTdHJpbmcgc2VydmljZUlkMyA9IHJlc3VsdFNlcnZpY2UzLmdldFVuaXF1ZUlkKCk7CisJCVNlcnZpY2UgcmVzdWx0U2VydmljZTQgPSBjcmVhdGVTZXJ2aWNlKHVzZXJJZCwgY2F0ZWdvcnksIHNlcnZpY2VOYW1lNCwgIjAuMSIsIGZhbHNlKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHJlc3VsdFNlcnZpY2UzKTsKKwkJU3RyaW5nIHNlcnZpY2VJZDQgPSByZXN1bHRTZXJ2aWNlNC5nZXRVbmlxdWVJZCgpOworCisJCS8vIHVwZGF0ZSAxIHNlcnZpY2UgdG8gQ0VSVElGSUVEIGRpc3Qgc3RhdHVzIERJU1RSSUJVVEVECisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXFDZXJ0aWZpY2F0aW9uUmVzdWx0ID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXN1bHRTZXJ2aWNlLCBhZG1pblVzZXIsIGFkbWluVXNlciwgZmFsc2UpOworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0ID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZSwgYWRtaW5Vc2VyLCBhZG1pblVzZXIsIGZhbHNlKTsKKwkJU2VydmljZSBhY3R1YWxTZXJ2aWNlID0gKFNlcnZpY2UpIHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2VydFJlc3BvbnNlID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNlcnRpZnlDb21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFNlcnZpY2UsIGFkbWluVXNlciwgYWRtaW5Vc2VyLCBmYWxzZSk7CisJCVNlcnZpY2UgY2VydGlmaWVkU2VydmljZSA9IChTZXJ2aWNlKSBjZXJ0UmVzcG9uc2UubGVmdCgpLnZhbHVlKCk7CisJCXNlcnZpY2VPcGVyYXRpb24udXBkYXRlRGVzdHJpYnV0aW9uU3RhdHVzKHJlc3VsdFNlcnZpY2UsIGFkbWluVXNlciwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCk7CisKKwkJLy8gdXBkYXRlIDEgc2VydmljZSB0byBDRVJUSUZJRUQgZGlzdCBzdGF0dXMgRElTVFJJQlVUSU9OX0FQUFJPVkVECisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXFDZXJ0aWZpY2F0aW9uUmVzdWx0MiA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZTIsIGFkbWluVXNlciwgYWRtaW5Vc2VyLCBmYWxzZSk7CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGFydENlcnRpZmljYXRpb25SZXN1bHQyID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZTIsIGFkbWluVXNlciwgYWRtaW5Vc2VyLCBmYWxzZSk7CisJCVNlcnZpY2UgYWN0dWFsU2VydmljZTIgPSAoU2VydmljZSkgc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0Mi5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2VydFJlc3BvbnNlMiA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jZXJ0aWZ5Q29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXN1bHRTZXJ2aWNlMiwgYWRtaW5Vc2VyLCBhZG1pblVzZXIsIGZhbHNlKTsKKwkJU2VydmljZSBjZXJ0aWZpZWRTZXJ2aWNlMiA9IChTZXJ2aWNlKSBjZXJ0UmVzcG9uc2UyLmxlZnQoKS52YWx1ZSgpOworCQlzZXJ2aWNlT3BlcmF0aW9uLnVwZGF0ZURlc3RyaWJ1dGlvblN0YXR1cyhyZXN1bHRTZXJ2aWNlMiwgYWRtaW5Vc2VyLAorCQkJCURpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVEKTsKKworCQkvLyB1cGRhdGUgMSBzZXJ2aWNlIHRvIENFUlRJRklFRCBkaXN0IHN0YXR1cyBESVNUUklCVVRJT05fUkVKRUNURUQKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHJlcUNlcnRpZmljYXRpb25SZXN1bHQzID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnJlcXVlc3RDZXJ0aWZpY2F0aW9uQ29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXN1bHRTZXJ2aWNlMywgYWRtaW5Vc2VyLCBhZG1pblVzZXIsIGZhbHNlKTsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdDMgPSBsaWZlY3ljbGVPcGVyYXRpb24KKwkJCQkuc3RhcnRDb21wb25lbnRDZXJ0aWZpY2F0aW9uKE5vZGVUeXBlRW51bS5TZXJ2aWNlLCByZXN1bHRTZXJ2aWNlMywgYWRtaW5Vc2VyLCBhZG1pblVzZXIsIGZhbHNlKTsKKwkJU2VydmljZSBhY3R1YWxTZXJ2aWNlMyA9IChTZXJ2aWNlKSBzdGFydENlcnRpZmljYXRpb25SZXN1bHQzLmxlZnQoKS52YWx1ZSgpOworCisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBjZXJ0UmVzcG9uc2UzID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLmNlcnRpZnlDb21wb25lbnQoTm9kZVR5cGVFbnVtLlNlcnZpY2UsIGFjdHVhbFNlcnZpY2UzLCBhZG1pblVzZXIsIGFkbWluVXNlciwgZmFsc2UpOworCQlTZXJ2aWNlIGNlcnRpZmllZFNlcnZpY2UzID0gKFNlcnZpY2UpIGNlcnRSZXNwb25zZTMubGVmdCgpLnZhbHVlKCk7CisJCXNlcnZpY2VPcGVyYXRpb24udXBkYXRlRGVzdHJpYnV0aW9uU3RhdHVzKGNlcnRpZmllZFNlcnZpY2UzLCBhZG1pblVzZXIsCisJCQkJRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRJT05fUkVKRUNURUQpOworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc1RvTWF0Y2ggPSBuZXcgSGFzaE1hcDw+KCk7CisJCXByb3BlcnRpZXNUb01hdGNoLnB1dChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlNUQVRFLmdldFByb3BlcnR5KCksIExpZmVjeWNsZVN0YXRlRW51bS5DRVJUSUZJRUQubmFtZSgpKTsKKworCQlTZXQ8RGlzdHJpYnV0aW9uU3RhdHVzRW51bT4gZGlzdFN0YXR1cyA9IG5ldyBIYXNoU2V0PERpc3RyaWJ1dGlvblN0YXR1c0VudW0+KCk7CisJCWRpc3RTdGF0dXMuYWRkKERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVUSU9OX0FQUFJPVkVEKTsKKwkJZGlzdFN0YXR1cy5hZGQoRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCk7CisKKwkJRWl0aGVyPFNldDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZXMgPSBzZXJ2aWNlT3BlcmF0aW9uCisJCQkJLmdldENlcnRpZmllZFNlcnZpY2VzV2l0aERpc3RTdGF0dXMocHJvcGVydGllc1RvTWF0Y2gsIGRpc3RTdGF0dXMsIGZhbHNlKTsKKworCQlhc3NlcnRUcnVlKHNlcnZpY2VzLmlzTGVmdCgpKTsKKwkJU2V0PFNlcnZpY2U+IHJlc3VsdCA9IHNlcnZpY2VzLmxlZnQoKS52YWx1ZSgpOworCisJCUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChTZXJ2aWNlIHNlcnZpY2UgOiByZXN1bHQpIHsKKwkJCWlkcy5hZGQoc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhjZXJ0aWZpZWRTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoY2VydGlmaWVkU2VydmljZTIuZ2V0VW5pcXVlSWQoKSkpOworCQlhc3NlcnRGYWxzZShpZHMuY29udGFpbnMoY2VydGlmaWVkU2VydmljZTMuZ2V0VW5pcXVlSWQoKSkpOworCQlhc3NlcnRGYWxzZShpZHMuY29udGFpbnMocmVzdWx0U2VydmljZTQuZ2V0VW5pcXVlSWQoKSkpOworCQlzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2Uoc2VydmljZUlkKTsKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZDIpOworCQlzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2Uoc2VydmljZUlkMyk7CisJCXNlcnZpY2VPcGVyYXRpb24uZGVsZXRlU2VydmljZShzZXJ2aWNlSWQ0KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHb3Zlcm5vckZvbGxvd2VkKCkgeworCQlTdHJpbmcgc2VydmljZU5hbWUgPSAiVGVzdDEiOworCQlTdHJpbmcgc2VydmljZU5hbWUyID0gIlRlc3QyIjsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lMyA9ICJUZXN0MyI7CisJCVN0cmluZyB1c2VySWQgPSBVU0VSX0lEOworCQlTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9OQU1FOworCQlTdHJpbmcga2V5ID0gVW5pcXVlSWRCdWlsZGVyLmdldEtleUJ5Tm9kZVR5cGUoTm9kZVR5cGVFbnVtLlVzZXIpOworCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBmaW5kVXNlciA9IHRpdGFuRGFvLmdldE5vZGUoa2V5LCB1c2VySWQsIFVzZXJEYXRhLmNsYXNzKTsKKwkJVXNlciBhZG1pblVzZXIgPSBPcGVyYXRpb25UZXN0c1V0aWwuY29udmVydFVzZXJEYXRhVG9Vc2VyKGZpbmRVc2VyLmxlZnQoKS52YWx1ZSgpKTsKKworCQkvLyBDcmVhdGUgMyBuZXcgc2VydmljZXMKKwkJU2VydmljZSByZXN1bHRTZXJ2aWNlID0gY3JlYXRlU2VydmljZSh1c2VySWQsIGNhdGVnb3J5LCBzZXJ2aWNlTmFtZSwgIjAuMSIsIGZhbHNlKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIHJlc3VsdFNlcnZpY2UpOworCQlTdHJpbmcgc2VydmljZUlkID0gcmVzdWx0U2VydmljZS5nZXRVbmlxdWVJZCgpOworCQlTZXJ2aWNlIHJlc3VsdFNlcnZpY2UyID0gY3JlYXRlU2VydmljZSh1c2VySWQsIGNhdGVnb3J5LCBzZXJ2aWNlTmFtZTIsICIwLjEiLCBmYWxzZSk7CisJCWxvZy5kZWJ1Zygie30iLCByZXN1bHRTZXJ2aWNlMik7CisJCVN0cmluZyBzZXJ2aWNlSWQyID0gcmVzdWx0U2VydmljZTIuZ2V0VW5pcXVlSWQoKTsKKwkJU2VydmljZSByZXN1bHRTZXJ2aWNlMyA9IGNyZWF0ZVNlcnZpY2UodXNlcklkLCBjYXRlZ29yeSwgc2VydmljZU5hbWUzLCAiMC4xIiwgZmFsc2UpOworCQlsb2cuZGVidWcoInt9IiwgcmVzdWx0U2VydmljZTMpOworCQlTdHJpbmcgc2VydmljZUlkMyA9IHJlc3VsdFNlcnZpY2UzLmdldFVuaXF1ZUlkKCk7CisKKwkJLy8gdXBkYXRlIDEgc2VydmljZSB0byBDRVJUSUZJRUQgKyBESVNUUklCVVRFRAorCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gcmVxQ2VydGlmaWNhdGlvblJlc3VsdCA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZSwgYWRtaW5Vc2VyLCBhZG1pblVzZXIsIGZhbHNlKTsKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IHN0YXJ0Q2VydGlmaWNhdGlvblJlc3VsdCA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5zdGFydENvbXBvbmVudENlcnRpZmljYXRpb24oTm9kZVR5cGVFbnVtLlNlcnZpY2UsIHJlc3VsdFNlcnZpY2UsIGFkbWluVXNlciwgYWRtaW5Vc2VyLCBmYWxzZSk7CisJCVNlcnZpY2UgYWN0dWFsU2VydmljZSA9IChTZXJ2aWNlKSBzdGFydENlcnRpZmljYXRpb25SZXN1bHQubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPD8gZXh0ZW5kcyBDb21wb25lbnQsIFN0b3JhZ2VPcGVyYXRpb25TdGF0dXM+IGNlcnRSZXNwb25zZSA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jZXJ0aWZ5Q29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBhY3R1YWxTZXJ2aWNlLCBhZG1pblVzZXIsIGFkbWluVXNlciwgZmFsc2UpOworCQlTZXJ2aWNlIGNlcnRpZmllZFNlcnZpY2UgPSAoU2VydmljZSkgY2VydFJlc3BvbnNlLmxlZnQoKS52YWx1ZSgpOworCQlzZXJ2aWNlT3BlcmF0aW9uLnVwZGF0ZURlc3RyaWJ1dGlvblN0YXR1cyhjZXJ0aWZpZWRTZXJ2aWNlLCBhZG1pblVzZXIsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVURUQpOworCisJCS8vIHVwZGF0ZSAxIHNlcnZpY2UgdG8gQ0VSVElGSUVEIGRpc3Qgc3RhdHVzICsgRElTVFJJQlVUSU9OX1JFSkVDVEVECisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiByZXFDZXJ0aWZpY2F0aW9uUmVzdWx0MiA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5yZXF1ZXN0Q2VydGlmaWNhdGlvbkNvbXBvbmVudChOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZTIsIGFkbWluVXNlciwgYWRtaW5Vc2VyLCBmYWxzZSk7CisJCUVpdGhlcjw/IGV4dGVuZHMgQ29tcG9uZW50LCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBzdGFydENlcnRpZmljYXRpb25SZXN1bHQyID0gbGlmZWN5Y2xlT3BlcmF0aW9uCisJCQkJLnN0YXJ0Q29tcG9uZW50Q2VydGlmaWNhdGlvbihOb2RlVHlwZUVudW0uU2VydmljZSwgcmVzdWx0U2VydmljZTIsIGFkbWluVXNlciwgYWRtaW5Vc2VyLCBmYWxzZSk7CisJCVNlcnZpY2UgYWN0dWFsU2VydmljZTIgPSAoU2VydmljZSkgc3RhcnRDZXJ0aWZpY2F0aW9uUmVzdWx0Mi5sZWZ0KCkudmFsdWUoKTsKKworCQlFaXRoZXI8PyBleHRlbmRzIENvbXBvbmVudCwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gY2VydFJlc3BvbnNlMiA9IGxpZmVjeWNsZU9wZXJhdGlvbgorCQkJCS5jZXJ0aWZ5Q29tcG9uZW50KE5vZGVUeXBlRW51bS5TZXJ2aWNlLCBhY3R1YWxTZXJ2aWNlMiwgYWRtaW5Vc2VyLCBhZG1pblVzZXIsIGZhbHNlKTsKKwkJU2VydmljZSBjZXJ0aWZpZWRTZXJ2aWNlMiA9IChTZXJ2aWNlKSBjZXJ0UmVzcG9uc2UyLmxlZnQoKS52YWx1ZSgpOworCQlzZXJ2aWNlT3BlcmF0aW9uLnVwZGF0ZURlc3RyaWJ1dGlvblN0YXR1cyhjZXJ0aWZpZWRTZXJ2aWNlMiwgYWRtaW5Vc2VyLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVEVEKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNUb01hdGNoID0gbmV3IEhhc2hNYXA8PigpOworCQlwcm9wZXJ0aWVzVG9NYXRjaC5wdXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5TVEFURS5nZXRQcm9wZXJ0eSgpLCBMaWZlY3ljbGVTdGF0ZUVudW0uQ0VSVElGSUVELm5hbWUoKSk7CisKKwkJRWl0aGVyPFNldDxTZXJ2aWNlPiwgU3RvcmFnZU9wZXJhdGlvblN0YXR1cz4gc2VydmljZXMgPSBzZXJ2aWNlT3BlcmF0aW9uCisJCQkJLmdldENlcnRpZmllZFNlcnZpY2VzV2l0aERpc3RTdGF0dXMocHJvcGVydGllc1RvTWF0Y2gsIG51bGwsIGZhbHNlKTsKKworCQlhc3NlcnRUcnVlKHNlcnZpY2VzLmlzTGVmdCgpKTsKKwkJU2V0PFNlcnZpY2U+IHJlc3VsdCA9IHNlcnZpY2VzLmxlZnQoKS52YWx1ZSgpOworCisJCUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChTZXJ2aWNlIHNlcnZpY2UgOiByZXN1bHQpIHsKKwkJCWlkcy5hZGQoc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKwkJfQorCQlhc3NlcnRUcnVlKGlkcy5jb250YWlucyhjZXJ0aWZpZWRTZXJ2aWNlLmdldFVuaXF1ZUlkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoY2VydGlmaWVkU2VydmljZTIuZ2V0VW5pcXVlSWQoKSkpOworCQlhc3NlcnRGYWxzZShpZHMuY29udGFpbnMoc2VydmljZUlkMykpOworCQlzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2Uoc2VydmljZUlkKTsKKwkJc2VydmljZU9wZXJhdGlvbi5kZWxldGVTZXJ2aWNlKHNlcnZpY2VJZDIpOworCQlzZXJ2aWNlT3BlcmF0aW9uLmRlbGV0ZVNlcnZpY2Uoc2VydmljZUlkMyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1VzZXJBZG1pbk9wZXJhdGlvblRlc3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvVXNlckFkbWluT3BlcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2U0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL1VzZXJBZG1pbk9wZXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5EaXJlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuRWRnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5HcmFwaDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5WZXJ0ZXg7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uSW5qZWN0TW9ja3M7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLm1vY2tpdG8uaW52b2NhdGlvbi5JbnZvY2F0aW9uT25Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLnN0dWJiaW5nLkFuc3dlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uYXBpLkFjdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udGl0YW4uVGl0YW5HZW5lcmljRGFvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbk9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8udXRpbHMuVXNlclN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLk5vZGVUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Nb2RlbFRlc3RCYXNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5hcGkuU3RvcmFnZU9wZXJhdGlvblN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLm9wZXJhdGlvbnMuaW1wbC5Vc2VyQWRtaW5PcGVyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Vc2VyUm9sZUVudW07CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFVzZXJBZG1pbk9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2RlbFRlc3RCYXNlIHsKKwlASW5qZWN0TW9ja3MKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBVc2VyQWRtaW5PcGVyYXRpb24gdXNlckFkbWluT3BlcmF0aW9uID0gbmV3IFVzZXJBZG1pbk9wZXJhdGlvbigpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRpdGFuR2VuZXJpY0RhbyB0aXRhbkdlbmVyaWNEYW8gPSBtb2NrKFRpdGFuR2VuZXJpY0Rhby5jbGFzcyk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU4gPSAiYWRtaW4iOworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgeworCQlNb2RlbFRlc3RCYXNlLmluaXQoKTsKKwl9CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgaW5pdE1vY2tzKCkgeworCQlNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCQlNb2NraXRvLnJlc2V0KHRpdGFuR2VuZXJpY0Rhbyk7CisJCW1vY2tUaXRhblVwZGF0ZSgpOworCQltb2NrVGl0YW5EZWxldGUoKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlQWN0aXZhdGVVc2VyRGF0YVN1Y2Nlc3MoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbW9ja1RpdGFuR2V0KEFETUlOLCBVc2VyUm9sZUVudW0uQURNSU4sIHRydWUpOworCisJCUVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVc2VyID0gdXNlckFkbWluT3BlcmF0aW9uCisJCQkJLmRlQWN0aXZhdGVVc2VyKHVzZXJBZG1pbk9wZXJhdGlvbi5jb252ZXJ0VG9Vc2VyKHVzZXJEYXRhKSk7CisKKwkJdmVyaWZ5KHRpdGFuR2VuZXJpY0RhbywgdGltZXMoMSkpLnVwZGF0ZU5vZGUoTW9ja2l0by5lcSh1c2VyRGF0YSksIE1vY2tpdG8uZXEoVXNlckRhdGEuY2xhc3MpKTsKKwkJdmVyaWZ5KHRpdGFuR2VuZXJpY0RhbywgdGltZXMoMCkpLmRlbGV0ZU5vZGUoTW9ja2l0by5hbnkoVXNlckRhdGEuY2xhc3MpLCBNb2NraXRvLmVxKFVzZXJEYXRhLmNsYXNzKSk7CisJCWFzc2VydFRydWUoZWl0aGVyVXNlci5pc0xlZnQoKSk7CisJCVVzZXIgdXNlciA9IGVpdGhlclVzZXIubGVmdCgpLnZhbHVlKCk7CisJCWFzc2VydFRydWUodXNlci5nZXRTdGF0dXMoKSA9PSBVc2VyU3RhdHVzRW51bS5JTkFDVElWRSk7CisKKwl9CisKKwkvKgorCSAqIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZUFjdGl2YXRlVXNlckRhdGFGYWlsKCl7IFVzZXJEYXRhIHVzZXJEYXRhID0KKwkgKiBtb2NrVGl0YW5HZXQoQURNSU4sIFVzZXJSb2xlRW51bS5BRE1JTiwgZmFsc2UpOworCSAqIAorCSAqIEVpdGhlcjxVc2VyLCBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJVc2VyID0KKwkgKiB1c2VyQWRtaW5PcGVyYXRpb24uZGVBY3RpdmF0ZVVzZXIodXNlckFkbWluT3BlcmF0aW9uLmNvbnZlcnRUb1VzZXIoCisJICogdXNlckRhdGEpKTsKKwkgKiAKKwkgKiB2ZXJpZnkodGl0YW5HZW5lcmljRGFvLCB0aW1lcygwKSkudXBkYXRlTm9kZShNb2NraXRvLmFueShVc2VyRGF0YS5jbGFzcyksCisJICogTW9ja2l0by5lcShVc2VyRGF0YS5jbGFzcykpOyB2ZXJpZnkodGl0YW5HZW5lcmljRGFvLAorCSAqIHRpbWVzKDApKS5kZWxldGVOb2RlKE1vY2tpdG8uYW55KFVzZXJEYXRhLmNsYXNzKSwKKwkgKiBNb2NraXRvLmVxKFVzZXJEYXRhLmNsYXNzKSk7IGFzc2VydFRydWUoZWl0aGVyVXNlci5pc1JpZ2h0KCkpOworCSAqIGFzc2VydFRydWUoZWl0aGVyVXNlci5yaWdodCgpLnZhbHVlKCkgPT0KKwkgKiBTdG9yYWdlT3BlcmF0aW9uU3RhdHVzLlVTRVJfSU5BQ1RJVkUpOworCSAqIAorCSAqIH0KKwkgKi8KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlbGV0ZVVzZXJXaXRob3V0UmVzb3VyY2VzKCkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IG1vY2tUaXRhbkdldChBRE1JTiwgVXNlclJvbGVFbnVtLkFETUlOLCB0cnVlKTsKKworCQlMaXN0PEVkZ2U+IGVkZ2VzTGlzdCA9IG5ldyBBcnJheUxpc3Q8RWRnZT4oKTsKKworCQlFaXRoZXI8TGlzdDxFZGdlPiwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KGVkZ2VzTGlzdCk7CisJCXdoZW4odGl0YW5HZW5lcmljRGFvLmdldEVkZ2VzRm9yTm9kZSh1c2VyRGF0YSwgRGlyZWN0aW9uLkJPVEgpKS50aGVuUmV0dXJuKGVpdGhlclJlc3VsdCk7CisKKwkJRWl0aGVyPFVzZXIsIEFjdGlvblN0YXR1cz4gZWl0aGVyVXNlciA9IHVzZXJBZG1pbk9wZXJhdGlvbi5kZWxldGVVc2VyRGF0YShBRE1JTik7CisJCXZlcmlmeSh0aXRhbkdlbmVyaWNEYW8sIHRpbWVzKDApKS51cGRhdGVOb2RlKE1vY2tpdG8uYW55KFVzZXJEYXRhLmNsYXNzKSwgTW9ja2l0by5lcShVc2VyRGF0YS5jbGFzcykpOworCQl2ZXJpZnkodGl0YW5HZW5lcmljRGFvLCB0aW1lcygxKSkuZGVsZXRlTm9kZSh1c2VyRGF0YSwgVXNlckRhdGEuY2xhc3MpOworCQlhc3NlcnRUcnVlKGVpdGhlclVzZXIuaXNMZWZ0KCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlVXNlcldpdGhSZXNvdXJjZXMoKSB7CisJCVVzZXJEYXRhIHVzZXJEYXRhID0gbW9ja1RpdGFuR2V0KEFETUlOLCBVc2VyUm9sZUVudW0uQURNSU4sIHRydWUpOworCisJCUxpc3Q8RWRnZT4gZWRnZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxFZGdlPigpOworCQllZGdlc0xpc3QuYWRkKGdldEVtcHR5RWRnZUltcGwoKSk7CisKKwkJRWl0aGVyPExpc3Q8RWRnZT4sIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiBlaXRoZXJSZXN1bHQgPSBFaXRoZXIubGVmdChlZGdlc0xpc3QpOworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5nZXRFZGdlc0Zvck5vZGUodXNlckRhdGEsIERpcmVjdGlvbi5CT1RIKSkudGhlblJldHVybihlaXRoZXJSZXN1bHQpOworCisJCUVpdGhlcjxVc2VyLCBBY3Rpb25TdGF0dXM+IGVpdGhlclVzZXIgPSB1c2VyQWRtaW5PcGVyYXRpb24uZGVsZXRlVXNlckRhdGEoQURNSU4pOworCQl2ZXJpZnkodGl0YW5HZW5lcmljRGFvLCB0aW1lcygwKSkudXBkYXRlTm9kZShNb2NraXRvLmFueShVc2VyRGF0YS5jbGFzcyksIE1vY2tpdG8uZXEoVXNlckRhdGEuY2xhc3MpKTsKKwkJdmVyaWZ5KHRpdGFuR2VuZXJpY0RhbywgdGltZXMoMCkpLmRlbGV0ZU5vZGUoTW9ja2l0by5hbnkoVXNlckRhdGEuY2xhc3MpLCBNb2NraXRvLmVxKFVzZXJEYXRhLmNsYXNzKSk7CisJCWFzc2VydFRydWUoZWl0aGVyVXNlci5pc1JpZ2h0KCkpOworCQlhc3NlcnRUcnVlKGVpdGhlclVzZXIucmlnaHQoKS52YWx1ZSgpID09IEFjdGlvblN0YXR1cy5VU0VSX0hBU19BQ1RJVkVfRUxFTUVOVFMpOworCisJfQorCisJcHJpdmF0ZSBFZGdlIGdldEVtcHR5RWRnZUltcGwoKSB7CisJCXJldHVybiBuZXcgRWRnZSgpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgT2JqZWN0IGlkKCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgR3JhcGggZ3JhcGgoKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyA8Vj4gUHJvcGVydHk8Vj4gcHJvcGVydHkoU3RyaW5nIGtleSwgViB2YWx1ZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFZlcnRleD4gdmVydGljZXMoRGlyZWN0aW9uIGRpcmVjdGlvbikgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgPFY+IEl0ZXJhdG9yPFByb3BlcnR5PFY+PiBwcm9wZXJ0aWVzKFN0cmluZy4uLiBwcm9wZXJ0eUtleXMpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJfTsKKwl9CisKKwlwcml2YXRlIFVzZXJEYXRhIG1vY2tUaXRhbkdldChTdHJpbmcgdXNlcklkLCBVc2VyUm9sZUVudW0gcm9sZSwgYm9vbGVhbiBpc0FjdGl2ZSkgeworCQlVc2VyRGF0YSB1c2VyRGF0YSA9IGJ1aWxkVXNlckRhdGEodXNlcklkLCByb2xlLCBpc0FjdGl2ZSk7CisJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGVpdGhlclVzZXJEYXRhID0gRWl0aGVyLmxlZnQodXNlckRhdGEpOworCQl3aGVuKHRpdGFuR2VuZXJpY0Rhby5nZXROb2RlKFVuaXF1ZUlkQnVpbGRlci5nZXRLZXlCeU5vZGVUeXBlKE5vZGVUeXBlRW51bS5Vc2VyKSwgdXNlcklkLCBVc2VyRGF0YS5jbGFzcykpCisJCQkJLnRoZW5SZXR1cm4oZWl0aGVyVXNlckRhdGEpOworCQlyZXR1cm4gdXNlckRhdGE7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb2NrVGl0YW5VcGRhdGUoKSB7CisJCWRvQW5zd2VyKG5ldyBBbnN3ZXI8RWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4+KCkgeworCQkJcHVibGljIEVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHsKKwkJCQlPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKKwkJCQlVc2VyRGF0YSByZXRWYWx1ZSA9IChVc2VyRGF0YSkgYXJnc1swXTsKKwkJCQlFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPiByZXN1bHQgPSBFaXRoZXIubGVmdChyZXRWYWx1ZSk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQl9KS53aGVuKHRpdGFuR2VuZXJpY0RhbykudXBkYXRlTm9kZShNb2NraXRvLmFueShVc2VyRGF0YS5jbGFzcyksIE1vY2tpdG8uZXEoVXNlckRhdGEuY2xhc3MpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIG1vY2tUaXRhbkRlbGV0ZSgpIHsKKwkJZG9BbnN3ZXIobmV3IEFuc3dlcjxFaXRoZXI8VXNlckRhdGEsIFRpdGFuT3BlcmF0aW9uU3RhdHVzPj4oKSB7CisJCQlwdWJsaWMgRWl0aGVyPFVzZXJEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbikgeworCQkJCU9iamVjdFtdIGFyZ3MgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpOworCQkJCVVzZXJEYXRhIHJldFZhbHVlID0gKFVzZXJEYXRhKSBhcmdzWzBdOworCQkJCUVpdGhlcjxVc2VyRGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IHJlc3VsdCA9IEVpdGhlci5sZWZ0KHJldFZhbHVlKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCX0pLndoZW4odGl0YW5HZW5lcmljRGFvKS5kZWxldGVOb2RlKE1vY2tpdG8uYW55KFVzZXJEYXRhLmNsYXNzKSwgTW9ja2l0by5lcShVc2VyRGF0YS5jbGFzcykpOworCX0KKworCXByaXZhdGUgc3RhdGljIFVzZXJEYXRhIGJ1aWxkVXNlckRhdGEoU3RyaW5nIHVzZXJJZCwgVXNlclJvbGVFbnVtIHJvbGUsIGJvb2xlYW4gaXNBY3RpdmUpIHsKKwkJVXNlckRhdGEgdXNlckRhdGEgPSBuZXcgVXNlckRhdGEoKTsKKwkJdXNlckRhdGEuc2V0VXNlcklkKHVzZXJJZCk7CisJCXVzZXJEYXRhLnNldFJvbGUocm9sZS5nZXROYW1lKCkpOworCQl1c2VyRGF0YS5zZXRTdGF0dXMoaXNBY3RpdmUgPyBVc2VyU3RhdHVzRW51bS5BQ1RJVkUubmFtZSgpIDogVXNlclN0YXR1c0VudW0uSU5BQ1RJVkUubmFtZSgpKTsKKwkJcmV0dXJuIHVzZXJEYXRhOworCisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC91dGlsL0RhdGFUeXBlVmFsaWRhdG9yVGVzdC5qYXZhIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC91dGlsL0RhdGFUeXBlVmFsaWRhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOWMyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL3V0aWwvRGF0YVR5cGVWYWxpZGF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMDA0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5Qcm9wZXJ0eURhdGFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50cy5TY2hlbWFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkRhdGFUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Qcm9wZXJ0eURlZmluaXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuVG9zY2FQcm9wZXJ0eVR5cGU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EuY29udmVydGVycy5MaXN0Q29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLmNvbnZlcnRlcnMuTWFwQ29udmVydGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuRGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5MaXN0VmFsaWRhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnMuTWFwVmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgRGF0YVR5cGVWYWxpZGF0b3JUZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGF0YVR5cGVWYWxpZGF0b3JUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKworCURhdGFUeXBlVmFsaWRhdG9yQ29udmVydGVyIGRhdGFUeXBlVmFsaWRhdG9yID0gRGF0YVR5cGVWYWxpZGF0b3JDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UoKTsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlcml2ZWRGcm9tUHJpbWl0aXZlRW1wdHlWYWx1ZSgpIHsKKworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlhbGxEYXRhVHlwZXMucHV0KCJpbnRlZ2VyIiwgZ2V0UHJpbWl0aXZlRGF0YVR5cGUoImludGVnZXIiKSk7CisKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGZyb21JbnRlZ2VyVHlwZSA9IGJ1aWxkRGVyaXZlZEZyb21JbnRlZ2VyVHlwZSgpOworCQlJbW11dGFibGVQYWlyPEpzb25FbGVtZW50LCBCb29sZWFuPiB2YWxpZGF0ZSA9IGRhdGFUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQW5kVXBkYXRlKCIiLCBmcm9tSW50ZWdlclR5cGUsCisJCQkJYWxsRGF0YVR5cGVzKTsKKworCQlhc3NlcnRUcnVlKCJjaGVjayByZXN1bHQgaXMgdmFsaWQiLCB2YWxpZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgdmFsdWUgaXMgdGhlIHNhbWUgYXMgc2VudCIsIG51bGwsIHZhbGlkYXRlLmxlZnQpOworCisJCXZhbGlkYXRlID0gZGF0YVR5cGVWYWxpZGF0b3IudmFsaWRhdGVBbmRVcGRhdGUobnVsbCwgZnJvbUludGVnZXJUeXBlLCBhbGxEYXRhVHlwZXMpOworCisJCWFzc2VydFRydWUoImNoZWNrIHJlc3VsdCBpcyB2YWxpZCIsIHZhbGlkYXRlLnJpZ2h0LmJvb2xlYW5WYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBzZW50IiwgbnVsbCwgdmFsaWRhdGUubGVmdCk7CisKKwkJdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZSgiODgiLCBmcm9tSW50ZWdlclR5cGUsIGFsbERhdGFUeXBlcyk7CisKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgcmVzdWx0IGlzIHZhbGlkIiwgdmFsaWRhdGUucmlnaHQuYm9vbGVhblZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHNlbnQiLCAiODgiLCB2YWxpZGF0ZS5sZWZ0LnRvU3RyaW5nKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlV2l0aFBhcmFtZXRlckRlcml2ZWRGcm9tUHJpbWl0aXZlRW1wdHlWYWx1ZSgpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZGVyaXZlZEZyb21JbnRlZ2VyVHlwZSA9IGJ1aWxkRGVyaXZlZEZyb21JbnRlZ2VyVHlwZSgpOworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlhbGxEYXRhVHlwZXMucHV0KCJteWludGVnZXIiLCBkZXJpdmVkRnJvbUludGVnZXJUeXBlKTsKKworCQlEYXRhVHlwZURlZmluaXRpb24gcGVyc29uRGF0YVR5cGUgPSBidWlsZFBlcnNvbkRhdGFUeXBlKCk7CisKKwkJUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oIm15IGFkZHJlc3MiLCAzMik7CisJCVN0cmluZyBqc29uID0gZ3Nvbi50b0pzb24ocGVyc29uKTsKKwkJbG9nLmRlYnVnKGpzb24pOworCisJCUltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+IHZhbGlkYXRlID0gZGF0YVR5cGVWYWxpZGF0b3IudmFsaWRhdGVBbmRVcGRhdGUoanNvbiwgcGVyc29uRGF0YVR5cGUsCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCB2YWxpZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSk7CisKKwkJcGVyc29uID0gbmV3IFBlcnNvbigibXkgYWRkcmVzcyIsIDMyKTsKKwkJanNvbiA9IGdzb24udG9Kc29uKHBlcnNvbik7CisJCWpzb24gPSBqc29uLnJlcGxhY2UoIjMyIiwgIjMyYSIpOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBwZXJzb25EYXRhVHlwZSwgYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIHZhbGlkIHZhbHVlIiwgdmFsaWRhdGUucmlnaHQuYm9vbGVhblZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlV2l0aEVtcHR5TGlzdFZhbHVlKCkgeworCisJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBidWlsZENyZWRlbnRpYWxEYXRhVHlwZSgpOworCisJCVN0cmluZ1tdIHN0ckFyciA9IHt9OworCQlMaXN0PFN0cmluZz4gc3RyTGlzdCA9IEFycmF5cy5hc0xpc3Qoc3RyQXJyKTsKKworCQkvLyBDaGVjayBlbXB0eSBsaXN0CisJCUNyZWRlbnRpYWwgY3JlZGVudGlhbCA9IG5ldyBDcmVkZW50aWFsKCJwcm90Y29sPGJyPj4iLCA1LCAidG9rZW5fdHlwZSIsICJ0b2tlbiIsIG51bGwsICJ1c2VyIiwgdHJ1ZSwgc3RyTGlzdCk7CisJCUNpdHkgbXljaXR5ID0gbmV3IENpdHkoIm15YWRkPGJyPjw8YnI+IiwgNTUpOworCQljcmVkZW50aWFsLnNldE15Y2l0eShteWNpdHkpOworCisJCVN0cmluZyBqc29uID0gZ3Nvbi50b0pzb24oY3JlZGVudGlhbCk7CisJCWxvZy5kZWJ1Zyhqc29uKTsKKworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlEYXRhVHlwZURlZmluaXRpb24gY2l0eURhdGFUeXBlID0gYnVpbGRDaXR5RGF0YVR5cGUoKTsKKwkJYWxsRGF0YVR5cGVzLnB1dCgiY2l0eSIsIGNpdHlEYXRhVHlwZSk7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCB2YWxpZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSk7CisKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsUmVzID0gZ3Nvbi5mcm9tSnNvbih2YWxpZGF0ZS5sZWZ0LnRvU3RyaW5nKCksIENyZWRlbnRpYWwuY2xhc3MpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGVtcHR5IGxpc3QiLCAwLCBjcmVkZW50aWFsUmVzLmdldE15bGlzdCgpLnNpemUoKSk7CisKKwkJbG9nLmRlYnVnKCJSZXN1bHQgaXMgPSB7fSIsIHZhbGlkYXRlLmxlZnQudG9TdHJpbmcoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVXaXRoTGlzdE51bGxWYWx1ZSgpIHsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGJ1aWxkQ3JlZGVudGlhbERhdGFUeXBlKCk7CisKKwkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4oKTsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGNpdHlEYXRhVHlwZSA9IGJ1aWxkQ2l0eURhdGFUeXBlKCk7CisJCWFsbERhdGFUeXBlcy5wdXQoImNpdHkiLCBjaXR5RGF0YVR5cGUpOworCisJCS8vIENoZWNrIGxpc3QgaXMgTlVMTAorCQlDcmVkZW50aWFsIGNyZWRlbnRpYWwgPSBuZXcgQ3JlZGVudGlhbCgicHJvdGNvbDxicj4+IiwgNSwgInRva2VuX3R5cGUiLCAidG9rZW4iLCBudWxsLCAidXNlciIsIHRydWUsIG51bGwpOworCQlDaXR5IG15Y2l0eSA9IG5ldyBDaXR5KCJteWFkZDxicj48PGJyPiIsIDU1KTsKKwkJY3JlZGVudGlhbC5zZXRNeWNpdHkobXljaXR5KTsKKworCQlTdHJpbmcganNvbiA9IGdzb24udG9Kc29uKGNyZWRlbnRpYWwpOworCisJCUltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+IHZhbGlkYXRlID0gZGF0YVR5cGVWYWxpZGF0b3IudmFsaWRhdGVBbmRVcGRhdGUoanNvbiwgZGF0YVR5cGVEZWZpbml0aW9uLAorCQkJCWFsbERhdGFUeXBlcyk7CisJCWFzc2VydFRydWUoImNoZWNrIHZhbGlkIHZhbHVlIiwgdmFsaWRhdGUucmlnaHQuYm9vbGVhblZhbHVlKCkpOworCisJCUNyZWRlbnRpYWwgY3JlZGVudGlhbFJlcyA9IGdzb24uZnJvbUpzb24odmFsaWRhdGUubGVmdC50b1N0cmluZygpLCBDcmVkZW50aWFsLmNsYXNzKTsKKwkJYXNzZXJ0TnVsbCgiY2hlY2sgbGlzdCBpcyBudWxsIiwgY3JlZGVudGlhbFJlcy5nZXRNeWxpc3QoKSk7CisJCWxvZy5kZWJ1ZygiUmVzdWx0IGlzID0ge30iLCB2YWxpZGF0ZS5sZWZ0LnRvU3RyaW5nKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlV2l0aFVzZXJOdWxsVmFsdWUoKSB7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBidWlsZENyZWRlbnRpYWxEYXRhVHlwZSgpOworCisJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+KCk7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBjaXR5RGF0YVR5cGUgPSBidWlsZENpdHlEYXRhVHlwZSgpOworCQlhbGxEYXRhVHlwZXMucHV0KCJjaXR5IiwgY2l0eURhdGFUeXBlKTsKKworCQkvLyBDaGVjayB1c2VyIGlzIG51bGwKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWwoInByb3Rjb2w8YnI+PiIsIDUsICJ0b2tlbl90eXBlIiwgInRva2VuIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgbnVsbCk7CisJCUNpdHkgbXljaXR5ID0gbmV3IENpdHkoIm15YWRkPGJyPjw8YnI+IiwgNTUpOworCQljcmVkZW50aWFsLnNldE15Y2l0eShteWNpdHkpOworCisJCVN0cmluZyBqc29uID0gZ3Nvbi50b0pzb24oY3JlZGVudGlhbCk7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCB2YWxpZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSk7CisKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsUmVzID0gZ3Nvbi5mcm9tSnNvbih2YWxpZGF0ZS5sZWZ0LnRvU3RyaW5nKCksIENyZWRlbnRpYWwuY2xhc3MpOworCQlhc3NlcnROdWxsKCJjaGVjayBsaXN0IGlzIG51bGwiLCBjcmVkZW50aWFsUmVzLmdldFVzZXIoKSk7CisJCWxvZy5kZWJ1ZygiUmVzdWx0IGlzID0ge30iLCB2YWxpZGF0ZS5sZWZ0LnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZVdpdGhFbXB0eVVzZXJWYWx1ZSgpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uID0gYnVpbGRDcmVkZW50aWFsRGF0YVR5cGUoKTsKKworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlEYXRhVHlwZURlZmluaXRpb24gY2l0eURhdGFUeXBlID0gYnVpbGRDaXR5RGF0YVR5cGUoKTsKKwkJYWxsRGF0YVR5cGVzLnB1dCgiY2l0eSIsIGNpdHlEYXRhVHlwZSk7CisJCS8vIENoZWNrIHVzZXIgaXMgZW1wdHkKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWwoInByb3Rjb2w8YnI+PiIsIDUsICJ0b2tlbl90eXBlIiwgInRva2VuIiwgbnVsbCwgIiIsIHRydWUsIG51bGwpOworCQlDaXR5IG15Y2l0eSA9IG5ldyBDaXR5KCJteWFkZDxicj48PGJyPiIsIDU1KTsKKwkJY3JlZGVudGlhbC5zZXRNeWNpdHkobXljaXR5KTsKKworCQlTdHJpbmcganNvbiA9IGdzb24udG9Kc29uKGNyZWRlbnRpYWwpOworCQlsb2cuZGVidWcoanNvbik7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCB2YWxpZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSk7CisKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsUmVzID0gZ3Nvbi5mcm9tSnNvbih2YWxpZGF0ZS5sZWZ0LnRvU3RyaW5nKCksIENyZWRlbnRpYWwuY2xhc3MpOworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBsaXN0IGlzIG5vdCBudWxsIiwgY3JlZGVudGlhbFJlcy5nZXRVc2VyKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHVzZXIgaXMgZW1wdHkiLCAiIiwgY3JlZGVudGlhbFJlcy5nZXRVc2VyKCkpOworCQlsb2cuZGVidWcoIlJlc3VsdCBpcyA9IHt9IiwgdmFsaWRhdGUubGVmdC50b1N0cmluZygpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZVdpdGhTdW1OdWxsVmFsdWUoKSB7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBidWlsZENyZWRlbnRpYWxEYXRhVHlwZSgpOworCisJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+KCk7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBjaXR5RGF0YVR5cGUgPSBidWlsZENpdHlEYXRhVHlwZSgpOworCQlhbGxEYXRhVHlwZXMucHV0KCJjaXR5IiwgY2l0eURhdGFUeXBlKTsKKworCQkvLyBDaGVjayB1c2VyIGlzIG51bGwKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWwoInByb3Rjb2w8YnI+PiIsIG51bGwsICJ0b2tlbl90eXBlIiwgInRva2VuIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgbnVsbCk7CisJCUNpdHkgbXljaXR5ID0gbmV3IENpdHkoIm15YWRkPGJyPjw8YnI+IiwgNTUpOworCQljcmVkZW50aWFsLnNldE15Y2l0eShteWNpdHkpOworCisJCVN0cmluZyBqc29uID0gZ3Nvbi50b0pzb24oY3JlZGVudGlhbCk7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCB2YWxpZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSk7CisKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsUmVzID0gZ3Nvbi5mcm9tSnNvbih2YWxpZGF0ZS5sZWZ0LnRvU3RyaW5nKCksIENyZWRlbnRpYWwuY2xhc3MpOworCQlhc3NlcnROdWxsKCJjaGVjayBsaXN0IGlzIG51bGwiLCBjcmVkZW50aWFsUmVzLmdldFN1bSgpKTsKKwkJbG9nLmRlYnVnKCJSZXN1bHQgaXMgPSB7fSIsIHZhbGlkYXRlLmxlZnQudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEpzb24oKSB7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBkYXRhVHlwZURlZmluaXRpb24gPSBidWlsZENyZWRlbnRpYWxEYXRhVHlwZSgpOworCisJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+KCk7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBjaXR5RGF0YVR5cGUgPSBidWlsZENpdHlEYXRhVHlwZSgpOworCQlhbGxEYXRhVHlwZXMucHV0KCJjaXR5IiwgY2l0eURhdGFUeXBlKTsKKworCQkvLyBDaGVjayB1c2VyIGlzIG51bGwKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWwoInByb3Rjb2w8YnI+PiIsIG51bGwsICJ0b2tlbl90eXBlIiwgInRva2VuIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgbnVsbCk7CisJCUNpdHkgbXljaXR5ID0gbmV3IENpdHkoIm15YWRkPGJyPjw8YnI+IiwgNTUpOworCQljcmVkZW50aWFsLnNldE15Y2l0eShteWNpdHkpOworCisJCVN0cmluZyBqc29uID0gZ3Nvbi50b0pzb24oY3JlZGVudGlhbCk7CisKKwkJanNvbiArPSAiZmRmZCI7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIHZhbGlkIHZhbHVlIiwgdmFsaWRhdGUucmlnaHQuYm9vbGVhblZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZElubmVyVmFsdWUoKSB7CisKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGJ1aWxkQ3JlZGVudGlhbERhdGFUeXBlKCk7CisKKwkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4oKTsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGNpdHlEYXRhVHlwZSA9IGJ1aWxkQ2l0eURhdGFUeXBlKCk7CisJCWFsbERhdGFUeXBlcy5wdXQoImNpdHkiLCBjaXR5RGF0YVR5cGUpOworCisJCS8vIENoZWNrIHVzZXIgaXMgbnVsbAorCQlDcmVkZW50aWFsIGNyZWRlbnRpYWwgPSBuZXcgQ3JlZGVudGlhbCgicHJvdGNvbDxicj4+IiwgbnVsbCwgInRva2VuX3R5cGUiLCAidG9rZW4iLCBudWxsLCBudWxsLCB0cnVlLCBudWxsKTsKKwkJQ2l0eSBteWNpdHkgPSBuZXcgQ2l0eSgibXlhZGQ8YnI+PDxicj4iLCA1NSk7CisJCWNyZWRlbnRpYWwuc2V0TXljaXR5KG15Y2l0eSk7CisKKwkJU3RyaW5nIGpzb24gPSBnc29uLnRvSnNvbihjcmVkZW50aWFsKTsKKworCQlqc29uID0ganNvbi5yZXBsYWNlKCI1NSIsICJhNTViIik7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIHZhbGlkIHZhbHVlIiwgdmFsaWRhdGUucmlnaHQuYm9vbGVhblZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZElubmVySnNvbigpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZGF0YVR5cGVEZWZpbml0aW9uID0gYnVpbGRDcmVkZW50aWFsRGF0YVR5cGUoKTsKKworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlEYXRhVHlwZURlZmluaXRpb24gY2l0eURhdGFUeXBlID0gYnVpbGRDaXR5RGF0YVR5cGUoKTsKKwkJYWxsRGF0YVR5cGVzLnB1dCgiY2l0eSIsIGNpdHlEYXRhVHlwZSk7CisKKwkJLy8gQ2hlY2sgdXNlciBpcyBudWxsCisJCUNyZWRlbnRpYWwgY3JlZGVudGlhbCA9IG5ldyBDcmVkZW50aWFsKCJwcm90Y29sPGJyPj4iLCBudWxsLCAidG9rZW5fdHlwZSIsICJ0b2tlbiIsIG51bGwsIG51bGwsIHRydWUsIG51bGwpOworCQlDaXR5IG15Y2l0eSA9IG5ldyBDaXR5KCIiLCBudWxsKTsKKworCQljcmVkZW50aWFsLnNldE15Y2l0eShteWNpdHkpOworCisJCVN0cmluZyBqc29uID0gZ3Nvbi50b0pzb24oY3JlZGVudGlhbCk7CisKKwkJanNvbiA9IGpzb24ucmVwbGFjZSgie1wiYWRkcmVzc1wiOlwiXCJ9IiwgInNjYWxhciIpOworCisJCUltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+IHZhbGlkYXRlID0gZGF0YVR5cGVWYWxpZGF0b3IudmFsaWRhdGVBbmRVcGRhdGUoanNvbiwgZGF0YVR5cGVEZWZpbml0aW9uLAorCQkJCWFsbERhdGFUeXBlcyk7CisJCWFzc2VydEZhbHNlKCJjaGVjayB2YWxpZCB2YWx1ZSIsIHZhbGlkYXRlLnJpZ2h0LmJvb2xlYW5WYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWRQcm9wZXJ0eUpzb24oKSB7CisKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGJ1aWxkQ3JlZGVudGlhbERhdGFUeXBlKCk7CisKKwkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4oKTsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGNpdHlEYXRhVHlwZSA9IGJ1aWxkQ2l0eURhdGFUeXBlKCk7CisJCWFsbERhdGFUeXBlcy5wdXQoImNpdHkiLCBjaXR5RGF0YVR5cGUpOworCisJCS8vIENoZWNrIHVzZXIgaXMgbnVsbAorCQlDcmVkZW50aWFsIGNyZWRlbnRpYWwgPSBuZXcgQ3JlZGVudGlhbCgicHJvdGNvbDxicj4+IiwgbnVsbCwgInRva2VuX3R5cGUiLCAidG9rZW4iLCBudWxsLCBudWxsLCB0cnVlLCBudWxsKTsKKwkJQ2l0eSBteWNpdHkgPSBuZXcgQ2l0eSgibXlhZGQ8YnI+PDxicj4iLCA1NSk7CisJCWNyZWRlbnRpYWwuc2V0TXljaXR5KG15Y2l0eSk7CisKKwkJU3RyaW5nIGpzb24gPSBnc29uLnRvSnNvbihjcmVkZW50aWFsKTsKKworCQlqc29uID0ganNvbi5yZXBsYWNlKCI1NSIsICJhNTViIik7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0RmFsc2UoImNoZWNrIHZhbGlkIHZhbHVlIiwgdmFsaWRhdGUucmlnaHQuYm9vbGVhblZhbHVlKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlRGF0YVR5cGVXaXRoSW50ZXJuYWxDb21wb3NpdGUoKSB7CisKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IGJ1aWxkQ3JlZGVudGlhbERhdGFUeXBlKCk7CisKKwkJU3RyaW5nW10gc3RyQXJyID0geyAiYWFhIiwgImJiYiIsICJjPGJyPmRjYyIgfTsKKwkJTGlzdDxTdHJpbmc+IHN0ckxpc3QgPSBBcnJheXMuYXNMaXN0KHN0ckFycik7CisKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsID0gbmV3IENyZWRlbnRpYWwoInByb3Rjb2w8YnI+PiIsIDUsICJ0b2tlbl90eXBlIiwgInRva2VuIiwgbnVsbCwgInVzZXIiLCB0cnVlLCBzdHJMaXN0KTsKKwkJQ2l0eSBteWNpdHkgPSBuZXcgQ2l0eSgibXlhZGQ8YnI+PDxicj4iLCA1NSk7CisJCWNyZWRlbnRpYWwuc2V0TXljaXR5KG15Y2l0eSk7CisKKwkJU3RyaW5nIGpzb24gPSBnc29uLnRvSnNvbihjcmVkZW50aWFsKTsKKworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlEYXRhVHlwZURlZmluaXRpb24gY2l0eURhdGFUeXBlID0gYnVpbGRDaXR5RGF0YVR5cGUoKTsKKwkJYWxsRGF0YVR5cGVzLnB1dCgiY2l0eSIsIGNpdHlEYXRhVHlwZSk7CisKKwkJSW1tdXRhYmxlUGFpcjxKc29uRWxlbWVudCwgQm9vbGVhbj4gdmFsaWRhdGUgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShqc29uLCBkYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCB2YWxpZGF0ZS5yaWdodC5ib29sZWFuVmFsdWUoKSk7CisKKwkJbG9nLmRlYnVnKCJSZXN1bHQgaXMgPSB7fSIsIHZhbGlkYXRlLmxlZnQudG9TdHJpbmcoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNYXBWYWxpZGF0b3IoKSB7CisKKwkJTWFwVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBNYXBWYWxpZGF0b3IoKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJLy8gSGFwcHkgU2NlbmFyaW9zCisJCS8vIDEgLSBNYXA8U3RyaW5nLEludGVnZXI+IGNoZWNrIE9LCisJCU1hcDxTdHJpbmcsIEludGVnZXI+IG1hcF8xID0gbmV3IEhhc2hNYXA8PigpOworCQltYXBfMS5wdXQoImtleTEiLCAyKTsKKwkJbWFwXzEucHV0KCJrZXkyIiwgMyk7CisJCVN0cmluZyB2YWx1ZSA9IGdzb24udG9Kc29uKG1hcF8xKTsKKwkJU3RyaW5nIGlubmVyVHlwZSA9ICJpbnRlZ2VyIjsKKwkJYXNzZXJ0VHJ1ZSgiVGVzdCBNYXAgdmFsaWRhdGlvbiB3aXRoIGlubmVyIGludGVnZXIgdHlwZSIsIHZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIG51bGwpKTsKKworCQkvLyAyIC0gTWFwPFN0cmluZyxCb29sZWFuPiBjaGVjayBPSworCQlNYXA8U3RyaW5nLCBCb29sZWFuPiBtYXBfMiA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJbWFwXzIucHV0KCJrZXkxIiwgdHJ1ZSk7CisJCW1hcF8yLnB1dCgia2V5MiIsIGZhbHNlKTsKKwkJdmFsdWUgPSBnc29uLnRvSnNvbihtYXBfMik7CisJCWlubmVyVHlwZSA9ICJib29sZWFuIjsKKwkJYXNzZXJ0VHJ1ZSgiVGVzdCBNYXAgdmFsaWRhdGlvbiB3aXRoIGlubmVyIGJvb2xlYW4gdHlwZSIsIHZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIG51bGwpKTsKKworCQkvLyAzIC0gZ2l2ZSBpbnRlZ2VyIHdpdGggcXVvdGVzCisJCWlubmVyVHlwZSA9ICJpbnRlZ2VyIjsKKwkJdmFsdWUgPSAie1wia2V5MVwiOlwiNVwiLFwia2V5MlwiOlwiN1wifSI7CisJCWFzc2VydFRydWUoIlRlc3QgTWFwIHZhbGlkYXRpb24gd2l0aCBpbm5lciBpbnRlZ2VyIHR5cGUsIGJ1dCBxb3V0ZWQgdmFsdWVzIiwKKwkJCQl2YWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKSk7CisKKwkJLy8gNCAtIGVtcHR5IGRlZmF1bHQgdmFsdWUKKwkJaW5uZXJUeXBlID0gImZsb2F0IjsKKwkJdmFsdWUgPSAiIjsKKwkJYXNzZXJ0VHJ1ZSgiVGVzdCBNYXAgdmFsaWRhdGlvbiB3aXRoIGlubmVyIGZsb2F0IHR5cGUiLCB2YWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKSk7CisKKwkJLy8gRmF1bHR5IFNjZW5hcmlvcworCQkvLyA1IC0gbWlzbWF0Y2ggaW4gZGF0YSB0eXBlCisJCXZhbHVlID0gZ3Nvbi50b0pzb24obWFwXzEpOworCQlpbm5lclR5cGUgPSAiYm9vbGVhbiI7CisJCWFzc2VydEZhbHNlKCJUZXN0IE1hcCBmYXVsdHkgdmFsaWRhdGlvbiB3aXRoIGlubmVyIGJvb2xlYW4gdHlwZSIsIHZhbGlkYXRvci5pc1ZhbGlkKHZhbHVlLCBpbm5lclR5cGUsIG51bGwpKTsKKwkJLy8gNiAtIG1pc21hdGNoIGluIGRhdGEgdHlwZQorCQl2YWx1ZSA9IGdzb24udG9Kc29uKG1hcF8yKTsKKwkJaW5uZXJUeXBlID0gImludGVnZXIiOworCQlhc3NlcnRGYWxzZSgiVGVzdCBNYXAgZmF1bHR5IHZhbGlkYXRpb24gd2l0aCBpbm5lciBpbnRlZ2VyIHR5cGUiLCB2YWxpZGF0b3IuaXNWYWxpZCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNYXBDb252ZXJ0ZXIoKSB7CisKKwkJTWFwQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBNYXBDb252ZXJ0ZXIoKTsKKwkJR3NvbiBnc29uID0gbmV3IEdzb24oKTsKKwkJLy8gSGFwcHkgU2NlbmFyaW9zCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwXzEgPSBuZXcgSGFzaE1hcDw+KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVzTWFwXzEgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJLy8gMSAtIGNoZWNrIFNwYWNlcyBlbGltaW5hdGVkICsgaHRtbCBzcXVhcmUgYnJhY2tldHMgZWxpbWluYXRlZAorCQltYXBfMS5wdXQoImtleTEiLCAiPGI+dGVzdDwvYj4iKTsKKwkJbWFwXzEucHV0KCJrZXkyIiwgIiAgICAgICAgdGVzdCIpOworCQlyZXNNYXBfMS5wdXQoImtleTEiLCAidGVzdCIpOworCQlyZXNNYXBfMS5wdXQoImtleTIiLCAiIHRlc3QiKTsKKwkJU3RyaW5nIHZhbHVlID0gZ3Nvbi50b0pzb24obWFwXzEpOworCQlTdHJpbmcgZXhwZWN0ZWRWYWwgPSBnc29uLnRvSnNvbihyZXNNYXBfMSk7CisJCVN0cmluZyBpbm5lclR5cGUgPSAic3RyaW5nIjsKKwkJYXNzZXJ0RXF1YWxzKCJUZXN0IE1hcCB2YWxpZGF0aW9uIHdpdGggaW5uZXIgc3RyaW5nIHR5cGUiLCBleHBlY3RlZFZhbCwKKwkJCQljb252ZXJ0ZXIuY29udmVydCh2YWx1ZSwgaW5uZXJUeXBlLCBudWxsKSk7CisKKwkJLy8gMiAtIGZsb2F0IGNvbnZlcnRlcgorCQlpbm5lclR5cGUgPSAiZmxvYXQiOworCQl2YWx1ZSA9ICJ7XCJrZXkxXCI6MC40NTQ1LFwia2V5MlwiOjAuMmZ9IjsKKwkJZXhwZWN0ZWRWYWwgPSAie1wia2V5MVwiOjAuNDU0NSxcImtleTJcIjowLjJ9IjsKKwkJYXNzZXJ0RXF1YWxzKCJUZXN0IE1hcCB2YWxpZGF0aW9uIHdpdGggaW5uZXIgZmxvYXQgdHlwZSIsIGV4cGVjdGVkVmFsLAorCQkJCWNvbnZlcnRlci5jb252ZXJ0KHZhbHVlLCBpbm5lclR5cGUsIG51bGwpKTsKKworCQkvLyAzIC0gY2hlY2sgZGVmYXVsdCBlbXB0eSB2YWx1ZSBjb252ZXJ0ZXIKKwkJaW5uZXJUeXBlID0gImZsb2F0IjsKKwkJdmFsdWUgPSAiIjsKKwkJZXhwZWN0ZWRWYWwgPSAiIjsKKwkJYXNzZXJ0RXF1YWxzKCJUZXN0IE1hcCB2YWxpZGF0aW9uIHdpdGggaW5uZXIgZmxvYXQgdHlwZSIsIGV4cGVjdGVkVmFsLAorCQkJCWNvbnZlcnRlci5jb252ZXJ0KHZhbHVlLCBpbm5lclR5cGUsIG51bGwpKTsKKworCQkvLyA0IC0gaW52YWxpZCBqc29uCisJCS8vIDMgLSBjaGVjayBkZWZhdWx0IGVtcHR5IHZhbHVlIGNvbnZlcnRlcgorCQlpbm5lclR5cGUgPSAiZmxvYXQiOworCQl2YWx1ZSA9ICJ7MTM0NTIzNDU1NkAjKCI7CisJCWV4cGVjdGVkVmFsID0gbnVsbDsKKwkJYXNzZXJ0RXF1YWxzKCJUZXN0IE1hcCB2YWxpZGF0aW9uIHdpdGggaW5uZXIgZmxvYXQgdHlwZSIsIGV4cGVjdGVkVmFsLAorCQkJCWNvbnZlcnRlci5jb252ZXJ0KHZhbHVlLCBpbm5lclR5cGUsIG51bGwpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbXBvc2l0ZURhdGFUeXBlV2l0aE1hcENvbXBvc2l0ZSgpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZmlsZURhdGFUeXBlRGVmaW5pdGlvbiA9IGJ1aWxkRmlsZURhdGFUeXBlKCk7CisJCU1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4gYWxsRGF0YVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+KCk7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBjaXR5RGF0YVR5cGUgPSBidWlsZENpdHlEYXRhVHlwZSgpOworCQlhbGxEYXRhVHlwZXMucHV0KCJjaXR5IiwgY2l0eURhdGFUeXBlKTsKKworCQlNeUZpbGUgbXlGaWxlID0gbmV3IE15RmlsZSgpOworCQlteUZpbGUuc2V0QWdlKDg4KTsKKwkJTWFwPFN0cmluZywgQ2l0eT4gYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJYXR0cmlidXRlcy5wdXQoImtleTEiLCBuZXcgQ2l0eSgiYWRkcmVzczE8YnI+IiwgMTEpKTsKKwkJYXR0cmlidXRlcy5wdXQoImtleTIiLCBuZXcgQ2l0eSgiYWRkcmVzczI8YnI+IiwgMjIpKTsKKwkJbXlGaWxlLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisKKwkJU3RyaW5nIHN0ciA9IGdzb24udG9Kc29uKG15RmlsZSk7CisJCWxvZy5kZWJ1ZyhzdHIpOworCisJCUltbXV0YWJsZVBhaXI8SnNvbkVsZW1lbnQsIEJvb2xlYW4+IGNvbnZlcnQgPSBkYXRhVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFuZFVwZGF0ZShzdHIsIGZpbGVEYXRhVHlwZURlZmluaXRpb24sCisJCQkJYWxsRGF0YVR5cGVzKTsKKworCQlhc3NlcnRUcnVlKCJjaGVjayBtYXAgY29udmVydGVyIHN1Y2NlZWQiLCBjb252ZXJ0LnJpZ2h0KTsKKworCQlKc29uRWxlbWVudCBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnQubGVmdDsKKworCQlsb2cuZGVidWcoInt9IiwgY29udmVydGVkVmFsdWUpOworCQlNeUZpbGUgZnJvbUpzb24gPSBnc29uLmZyb21Kc29uKGNvbnZlcnRlZFZhbHVlLCBNeUZpbGUuY2xhc3MpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgYWdlIiwgODgsIGZyb21Kc29uLmdldEFnZSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGFkZHJlc3MgMSIsICJhZGRyZXNzMSIsIGZyb21Kc29uLmdldEF0dHJpYnV0ZXMoKS5nZXQoImtleTEiKS5nZXRBZGRyZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGFkZHJlc3MgMiIsICJhZGRyZXNzMiIsIGZyb21Kc29uLmdldEF0dHJpYnV0ZXMoKS5nZXQoImtleTIiKS5nZXRBZGRyZXNzKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWFwQ29udmVydGVyV2l0aENvbXBsZXhJbm5lclR5cGUoKSB7CisKKwkJTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPiBhbGxEYXRhVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFUeXBlRGVmaW5pdGlvbj4oKTsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGNyZWRlbnRpYWxEYXRhVHlwZURlZmluaXRpb24gPSBidWlsZENyZWRlbnRpYWxEYXRhVHlwZSgpOworCQlEYXRhVHlwZURlZmluaXRpb24gY2l0eURhdGFUeXBlID0gYnVpbGRDaXR5RGF0YVR5cGUoKTsKKwkJYWxsRGF0YVR5cGVzLnB1dCgiY2l0eSIsIGNpdHlEYXRhVHlwZSk7CisJCWFsbERhdGFUeXBlcy5wdXQoImNyZWRlbnRpYWwiLCBjcmVkZW50aWFsRGF0YVR5cGVEZWZpbml0aW9uKTsKKworCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworCQkvLyBIYXBweSBTY2VuYXJpb3MKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXBfMSA9IG5ldyBIYXNoTWFwPD4oKTsKKworCQkvLyAxIC0gY2hlY2sgU3BhY2VzIGVsaW1pbmF0ZWQgKyBodG1sIHNxdWFyZSBicmFja2V0cyBlbGltaW5hdGVkCisKKwkJU3RyaW5nW10gc3RyQXJyID0geyAiYWFhIiwgImJiYiIsICJjPGJyPmRjYyIgfTsKKwkJTGlzdDxTdHJpbmc+IHN0ckxpc3QgPSBBcnJheXMuYXNMaXN0KHN0ckFycik7CisJCUNyZWRlbnRpYWwgY3JlZGVudGlhbDEgPSBuZXcgQ3JlZGVudGlhbCgicHJvdG9jb2w7OiwuXCI8YnI+PiIsIDUsICJ0b2tlbl90eXBlIiwgInRva2VuIiwgbnVsbCwgInVzZXIiLCB0cnVlLAorCQkJCXN0ckxpc3QpOworCQlDaXR5IG15Y2l0eTEgPSBuZXcgQ2l0eSgibXlhZGQ8YnI+PDxicj4iLCA1NSk7CisJCWNyZWRlbnRpYWwxLnNldE15Y2l0eShteWNpdHkxKTsKKworCQlDcmVkZW50aWFsIGNyZWRlbnRpYWwyID0gbmV3IENyZWRlbnRpYWwoInByb3RvY29sOzosLlwiPGJyPj4iLCA1LCAidG9rZW5fdHlwZSIsICJ0b2tlbiIsIG51bGwsICJ1c2VyIiwgdHJ1ZSwKKwkJCQlzdHJMaXN0KTsKKwkJQ2l0eSBteWNpdHkyID0gbmV3IENpdHkoIm15YWRkPGJyPjw8YnI+IiwgNjYpOworCQljcmVkZW50aWFsMi5zZXRNeWNpdHkobXljaXR5Mik7CisKKwkJbWFwXzEucHV0KCJrZXkxIiwgY3JlZGVudGlhbDEpOworCQltYXBfMS5wdXQoImtleTIiLCBjcmVkZW50aWFsMik7CisKKwkJU3RyaW5nIHN0ciA9IGdzb24udG9Kc29uKG1hcF8xKTsKKwkJbG9nLmRlYnVnKHN0cik7CisKKwkJTWFwQ29udmVydGVyIG1hcENvbnZlcnRlciA9IG5ldyBNYXBDb252ZXJ0ZXIoKTsKKwkJRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gY29udmVydCA9IG1hcENvbnZlcnRlci5jb252ZXJ0V2l0aEVycm9yUmVzdWx0KHN0ciwgImNyZWRlbnRpYWwiLCBhbGxEYXRhVHlwZXMpOworCisJCWFzc2VydFRydWUoImNoZWNrIG1hcCBjb252ZXJ0ZXIgc3VjY2VlZCIsIGNvbnZlcnQuaXNMZWZ0KCkpOworCisJCVN0cmluZyBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnQubGVmdCgpLnZhbHVlKCk7CisKKwkJVHlwZSB0eXBlID0gbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBDcmVkZW50aWFsPj4oKSB7CisJCX0uZ2V0VHlwZSgpOworCisJCU1hcDxTdHJpbmcsIENyZWRlbnRpYWw+IGZyb21Kc29uID0gZ3Nvbi5mcm9tSnNvbihjb252ZXJ0ZWRWYWx1ZSwgdHlwZSk7CisKKwkJQ3JlZGVudGlhbCBhY3R1YWxDcmVkZW50aWFsMSA9IGZyb21Kc29uLmdldCgia2V5MSIpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHN1bSIsIDUsIGFjdHVhbENyZWRlbnRpYWwxLmdldFN1bSgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIHByb3RvY29sIiwgInByb3RvY29sOzosLlwiPiIsIGFjdHVhbENyZWRlbnRpYWwxLmdldFByb3RvY29sKCkpOworCQlTdHJpbmdbXSBjb252ZXJ0ZWRTdHJBcnIgPSB7ICJhYWEiLCAiYmJiIiwgImNkY2MiIH07CisJCUxpc3Q8U3RyaW5nPiBjb252ZXJ0ZWRTdHJMaXN0ID0gQXJyYXlzLmFzTGlzdChjb252ZXJ0ZWRTdHJBcnIpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGxpc3QiLCBjb252ZXJ0ZWRTdHJMaXN0LCBhY3R1YWxDcmVkZW50aWFsMS5nZXRNeWxpc3QoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBjaXR5IGFkZHJlc3MiLCAibXlhZGQ8IiwgYWN0dWFsQ3JlZGVudGlhbDEuZ2V0TXljaXR5KCkuZ2V0QWRkcmVzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBjaXR5IGFkZHJlc3MiLCA1NSwgYWN0dWFsQ3JlZGVudGlhbDEuZ2V0TXljaXR5KCkuZ2V0QWdlKCkuaW50VmFsdWUoKSk7CisKKwkJQ3JlZGVudGlhbCBhY3R1YWxDcmVkZW50aWFsMiA9IGZyb21Kc29uLmdldCgia2V5MiIpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNpdHkgYWRkcmVzcyIsIDY2LCBhY3R1YWxDcmVkZW50aWFsMi5nZXRNeWNpdHkoKS5nZXRBZ2UoKS5pbnRWYWx1ZSgpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExpc3RDb252ZXJ0ZXJXaXRoQ29tcGxleElubmVyVHlwZSgpIHsKKworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlEYXRhVHlwZURlZmluaXRpb24gY3JlZGVudGlhbERhdGFUeXBlRGVmaW5pdGlvbiA9IGJ1aWxkQ3JlZGVudGlhbERhdGFUeXBlKCk7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBjaXR5RGF0YVR5cGUgPSBidWlsZENpdHlEYXRhVHlwZSgpOworCQlhbGxEYXRhVHlwZXMucHV0KCJjaXR5IiwgY2l0eURhdGFUeXBlKTsKKwkJYWxsRGF0YVR5cGVzLnB1dCgiY3JlZGVudGlhbCIsIGNyZWRlbnRpYWxEYXRhVHlwZURlZmluaXRpb24pOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisKKwkJTGlzdDxPYmplY3Q+IGxpc3QgPSBidWlsZExpc3RPZjJDcmVkZW50aWFsT2JqZWN0cygpOworCisJCVN0cmluZyBzdHIgPSBnc29uLnRvSnNvbihsaXN0KTsKKwkJbG9nLmRlYnVnKHN0cik7CisKKwkJTGlzdENvbnZlcnRlciBsaXN0Q29udmVydGVyID0gbmV3IExpc3RDb252ZXJ0ZXIoKTsKKworCQlFaXRoZXI8U3RyaW5nLCBCb29sZWFuPiBjb252ZXJ0ID0gbGlzdENvbnZlcnRlci5jb252ZXJ0V2l0aEVycm9yUmVzdWx0KHN0ciwgImNyZWRlbnRpYWwiLCBhbGxEYXRhVHlwZXMpOworCisJCWFzc2VydFRydWUoImNoZWNrIG1hcCBjb252ZXJ0ZXIgc3VjY2VlZCIsIGNvbnZlcnQuaXNMZWZ0KCkpOworCisJCVN0cmluZyBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnQubGVmdCgpLnZhbHVlKCk7CisKKwkJdmFsaWRhdGVMaXN0T2ZDcmVkZW50aWFsKGdzb24sIGNvbnZlcnRlZFZhbHVlKTsKKworCQlsaXN0LmFkZChudWxsKTsKKworCQlzdHIgPSBnc29uLnRvSnNvbihsaXN0KTsKKwkJbG9nLmRlYnVnKHN0cik7CisKKwkJY29udmVydCA9IGxpc3RDb252ZXJ0ZXIuY29udmVydFdpdGhFcnJvclJlc3VsdChzdHIsICJjcmVkZW50aWFsIiwgYWxsRGF0YVR5cGVzKTsKKworCQlhc3NlcnRUcnVlKCJjaGVjayBtYXAgY29udmVydGVyIHN1Y2NlZWQiLCBjb252ZXJ0LmlzTGVmdCgpKTsKKworCQl2YWxpZGF0ZUxpc3RPZkNyZWRlbnRpYWwoZ3NvbiwgY29udmVydGVkVmFsdWUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExpc3RWYWxpZGF0b3JXaXRoQ29tcGxleElubmVyVHlwZSgpIHsKKworCQlNYXA8U3RyaW5nLCBEYXRhVHlwZURlZmluaXRpb24+IGFsbERhdGFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YVR5cGVEZWZpbml0aW9uPigpOworCQlEYXRhVHlwZURlZmluaXRpb24gY3JlZGVudGlhbERhdGFUeXBlRGVmaW5pdGlvbiA9IGJ1aWxkQ3JlZGVudGlhbERhdGFUeXBlKCk7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBjaXR5RGF0YVR5cGUgPSBidWlsZENpdHlEYXRhVHlwZSgpOworCQlhbGxEYXRhVHlwZXMucHV0KCJjaXR5IiwgY2l0eURhdGFUeXBlKTsKKwkJYWxsRGF0YVR5cGVzLnB1dCgiY3JlZGVudGlhbCIsIGNyZWRlbnRpYWxEYXRhVHlwZURlZmluaXRpb24pOworCisJCUdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisJCS8vIEhhcHB5IFNjZW5hcmlvcworCQlMaXN0PE9iamVjdD4gbGlzdCA9IGJ1aWxkTGlzdE9mMkNyZWRlbnRpYWxPYmplY3RzKCk7CisKKwkJU3RyaW5nIHN0ciA9IGdzb24udG9Kc29uKGxpc3QpOworCQlsb2cuZGVidWcoc3RyKTsKKworCQlMaXN0VmFsaWRhdG9yIGxpc3RWYWxpZGF0b3IgPSBuZXcgTGlzdFZhbGlkYXRvcigpOworCisJCWJvb2xlYW4gaXNWYWxpZCA9IGxpc3RWYWxpZGF0b3IuaXNWYWxpZChzdHIsICJjcmVkZW50aWFsIiwgYWxsRGF0YVR5cGVzKTsKKworCQlhc3NlcnRUcnVlKCJjaGVjayB2YWxpZCB2YWx1ZSIsIGlzVmFsaWQpOworCisJCVN0cmluZyBiYWRTdHIgPSBzdHIucmVwbGFjZSgicHJvdG9jb2wiLCAicHJvdG9jb2wxIik7CisKKwkJaXNWYWxpZCA9IGxpc3RWYWxpZGF0b3IuaXNWYWxpZChiYWRTdHIsICJjcmVkZW50aWFsIiwgYWxsRGF0YVR5cGVzKTsKKworCQlhc3NlcnRGYWxzZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCBpc1ZhbGlkKTsKKworCQliYWRTdHIgPSBzdHIucmVwbGFjZSgiNTUiLCAiXCJhYVwiIik7CisKKwkJaXNWYWxpZCA9IGxpc3RWYWxpZGF0b3IuaXNWYWxpZChiYWRTdHIsICJjcmVkZW50aWFsIiwgYWxsRGF0YVR5cGVzKTsKKworCQlhc3NlcnRGYWxzZSgiY2hlY2sgdmFsaWQgdmFsdWUiLCBpc1ZhbGlkKTsKKworCX0KKworCXByaXZhdGUgTGlzdDxPYmplY3Q+IGJ1aWxkTGlzdE9mMkNyZWRlbnRpYWxPYmplY3RzKCkgeworCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCVN0cmluZ1tdIHN0ckFyciA9IHsgImFhYSIsICJiYmIiLCAiYzxicj5kY2MiIH07CisJCUxpc3Q8U3RyaW5nPiBzdHJMaXN0ID0gQXJyYXlzLmFzTGlzdChzdHJBcnIpOworCQlDcmVkZW50aWFsIGNyZWRlbnRpYWwxID0gbmV3IENyZWRlbnRpYWwoInByb3RvY29sLixcIjo7PGJyPj4iLCA1LCAidG9rZW5fdHlwZSIsICJ0b2tlbiIsIG51bGwsICJ1c2VyIiwgdHJ1ZSwKKwkJCQlzdHJMaXN0KTsKKwkJQ2l0eSBteWNpdHkxID0gbmV3IENpdHkoIm15YWRkPGJyPjw8YnI+IiwgNTUpOworCQljcmVkZW50aWFsMS5zZXRNeWNpdHkobXljaXR5MSk7CisKKwkJQ3JlZGVudGlhbCBjcmVkZW50aWFsMiA9IG5ldyBDcmVkZW50aWFsKCJwcm90b2NvbC4sXCI6Ozxicj4+IiwgNSwgInRva2VuX3R5cGUiLCAidG9rZW4iLCBudWxsLCAidXNlciIsIHRydWUsCisJCQkJc3RyTGlzdCk7CisJCUNpdHkgbXljaXR5MiA9IG5ldyBDaXR5KCJteWFkZDxicj48PGJyPiIsIDY2KTsKKwkJY3JlZGVudGlhbDIuc2V0TXljaXR5KG15Y2l0eTIpOworCisJCWxpc3QuYWRkKGNyZWRlbnRpYWwxKTsKKwkJbGlzdC5hZGQoY3JlZGVudGlhbDIpOworCQlyZXR1cm4gbGlzdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVMaXN0T2ZDcmVkZW50aWFsKEdzb24gZ3NvbiwgU3RyaW5nIGNvbnZlcnRlZFZhbHVlKSB7CisKKwkJbG9nLmRlYnVnKGNvbnZlcnRlZFZhbHVlKTsKKwkJVHlwZSB0eXBlID0gbmV3IFR5cGVUb2tlbjxMaXN0PENyZWRlbnRpYWw+PigpIHsKKwkJfS5nZXRUeXBlKCk7CisKKwkJTGlzdDxDcmVkZW50aWFsPiBmcm9tSnNvbiA9IGdzb24uZnJvbUpzb24oY29udmVydGVkVmFsdWUsIHR5cGUpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgbGlzdCBzaXplIiwgMiwgZnJvbUpzb24uc2l6ZSgpKTsKKworCQkvLyBDcmVkZW50aWFsIGFjdHVhbENyZWRlbnRpYWwxID0gZ3Nvbi5mcm9tSnNvbihsaXN0LmdldCgwKS50b1N0cmluZygpLAorCQkvLyBDcmVkZW50aWFsLmNsYXNzKTsKKwkJQ3JlZGVudGlhbCBhY3R1YWxDcmVkZW50aWFsMSA9IGZyb21Kc29uLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBzdW0iLCA1LCBhY3R1YWxDcmVkZW50aWFsMS5nZXRTdW0oKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBwcm90b2NvbCIsICJwcm90b2NvbC4sXCI6Oz4iLCBhY3R1YWxDcmVkZW50aWFsMS5nZXRQcm90b2NvbCgpKTsKKwkJU3RyaW5nW10gY29udmVydGVkU3RyQXJyID0geyAiYWFhIiwgImJiYiIsICJjZGNjIiB9OworCQlMaXN0PFN0cmluZz4gY29udmVydGVkU3RyTGlzdCA9IEFycmF5cy5hc0xpc3QoY29udmVydGVkU3RyQXJyKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBsaXN0IiwgY29udmVydGVkU3RyTGlzdCwgYWN0dWFsQ3JlZGVudGlhbDEuZ2V0TXlsaXN0KCkpOworCisJCWFzc2VydEVxdWFscygiY2hlY2sgY2l0eSBhZGRyZXNzIiwgIm15YWRkPCIsIGFjdHVhbENyZWRlbnRpYWwxLmdldE15Y2l0eSgpLmdldEFkZHJlc3MoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgY2l0eSBhZGRyZXNzIiwgNTUsIGFjdHVhbENyZWRlbnRpYWwxLmdldE15Y2l0eSgpLmdldEFnZSgpLmludFZhbHVlKCkpOworCisJCS8vIENyZWRlbnRpYWwgYWN0dWFsQ3JlZGVudGlhbDIgPSBnc29uLmZyb21Kc29uKGxpc3QuZ2V0KDEpLnRvU3RyaW5nKCksCisJCS8vIENyZWRlbnRpYWwuY2xhc3MpOworCQlDcmVkZW50aWFsIGFjdHVhbENyZWRlbnRpYWwyID0gZnJvbUpzb24uZ2V0KDEpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGNpdHkgYWRkcmVzcyIsIDY2LCBhY3R1YWxDcmVkZW50aWFsMi5nZXRNeWNpdHkoKS5nZXRBZ2UoKS5pbnRWYWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIERhdGFUeXBlRGVmaW5pdGlvbiBidWlsZENyZWRlbnRpYWxEYXRhVHlwZSgpIHsKKwkJRGF0YVR5cGVEZWZpbml0aW9uIGRhdGFUeXBlRGVmaW5pdGlvbiA9IG5ldyBEYXRhVHlwZURlZmluaXRpb24oKTsKKwkJZGF0YVR5cGVEZWZpbml0aW9uLnNldE5hbWUoImRhdGF0eXBlLjEiKTsKKwkJTGlzdDxQcm9wZXJ0eURlZmluaXRpb24+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbjEgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjEuc2V0TmFtZSgic3VtIik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjEuc2V0VHlwZShUb3NjYVByb3BlcnR5VHlwZS5JTlRFR0VSLmdldFR5cGUoKSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb24yID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eURlZmluaXRpb24yLnNldE5hbWUoInByb3RvY29sIik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjIuc2V0VHlwZShUb3NjYVByb3BlcnR5VHlwZS5TVFJJTkcuZ2V0VHlwZSgpKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbjMgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjMuc2V0TmFtZSgidG9rZW5fdHlwZSIpOworCQlwcm9wZXJ0eURlZmluaXRpb24zLnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuU1RSSU5HLmdldFR5cGUoKSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb240ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eURlZmluaXRpb240LnNldE5hbWUoInRva2VuIik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjQuc2V0VHlwZShUb3NjYVByb3BlcnR5VHlwZS5TVFJJTkcuZ2V0VHlwZSgpKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbjUgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjUuc2V0TmFtZSgia2V5cyIpOworCQlwcm9wZXJ0eURlZmluaXRpb241LnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuTUFQLmdldFR5cGUoKSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb242ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eURlZmluaXRpb242LnNldE5hbWUoIm15bGlzdCIpOworCQlwcm9wZXJ0eURlZmluaXRpb242LnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuTElTVC5nZXRUeXBlKCkpOworCQlTY2hlbWFEZWZpbml0aW9uIGVudHJ5U2NoZW1hID0gbmV3IFNjaGVtYURlZmluaXRpb24oKTsKKwkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5LnNldFR5cGUoInN0cmluZyIpOworCQllbnRyeVNjaGVtYS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjYuc2V0U2NoZW1hKGVudHJ5U2NoZW1hKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbjcgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjcuc2V0TmFtZSgidXNlciIpOworCQlwcm9wZXJ0eURlZmluaXRpb243LnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuU1RSSU5HLmdldFR5cGUoKSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBwcm9wZXJ0eURlZmluaXRpb244ID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlwcm9wZXJ0eURlZmluaXRpb244LnNldE5hbWUoImlzTWFuZGF0b3J5Iik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjguc2V0VHlwZShUb3NjYVByb3BlcnR5VHlwZS5CT09MRUFOLmdldFR5cGUoKSk7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIHByb3BlcnR5RGVmaW5pdGlvbjkgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5RGVmaW5pdGlvbjkuc2V0TmFtZSgibXljaXR5Iik7CisJCXByb3BlcnR5RGVmaW5pdGlvbjkuc2V0VHlwZSgiY2l0eSIpOworCisJCXByb3BlcnRpZXMuYWRkKHByb3BlcnR5RGVmaW5pdGlvbjEpOworCQlwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eURlZmluaXRpb24yKTsKKwkJcHJvcGVydGllcy5hZGQocHJvcGVydHlEZWZpbml0aW9uMyk7CisJCXByb3BlcnRpZXMuYWRkKHByb3BlcnR5RGVmaW5pdGlvbjQpOworCQlwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eURlZmluaXRpb241KTsKKwkJcHJvcGVydGllcy5hZGQocHJvcGVydHlEZWZpbml0aW9uNik7CisJCXByb3BlcnRpZXMuYWRkKHByb3BlcnR5RGVmaW5pdGlvbjcpOworCQlwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eURlZmluaXRpb244KTsKKwkJcHJvcGVydGllcy5hZGQocHJvcGVydHlEZWZpbml0aW9uOSk7CisKKwkJZGF0YVR5cGVEZWZpbml0aW9uLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisJCXJldHVybiBkYXRhVHlwZURlZmluaXRpb247CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGF0YVR5cGVEZWZpbml0aW9uIGJ1aWxkQ2l0eURhdGFUeXBlKCkgeworCQlEYXRhVHlwZURlZmluaXRpb24gY2l0eURhdGFUeXBlID0gbmV3IERhdGFUeXBlRGVmaW5pdGlvbigpOworCQljaXR5RGF0YVR5cGUuc2V0TmFtZSgiY2l0eSIpOworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gY2l0eVByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIGNpdHlQcm9wZXJ0eURlZmluaXRpb24xID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQljaXR5UHJvcGVydHlEZWZpbml0aW9uMS5zZXROYW1lKCJhZ2UiKTsKKwkJY2l0eVByb3BlcnR5RGVmaW5pdGlvbjEuc2V0VHlwZShUb3NjYVByb3BlcnR5VHlwZS5JTlRFR0VSLmdldFR5cGUoKSk7CisJCVByb3BlcnR5RGVmaW5pdGlvbiBjaXR5UHJvcGVydHlEZWZpbml0aW9uMiA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJY2l0eVByb3BlcnR5RGVmaW5pdGlvbjIuc2V0TmFtZSgiYWRkcmVzcyIpOworCQljaXR5UHJvcGVydHlEZWZpbml0aW9uMi5zZXRUeXBlKFRvc2NhUHJvcGVydHlUeXBlLlNUUklORy5nZXRUeXBlKCkpOworCisJCWNpdHlQcm9wZXJ0aWVzLmFkZChjaXR5UHJvcGVydHlEZWZpbml0aW9uMSk7CisJCWNpdHlQcm9wZXJ0aWVzLmFkZChjaXR5UHJvcGVydHlEZWZpbml0aW9uMik7CisKKwkJY2l0eURhdGFUeXBlLnNldFByb3BlcnRpZXMoY2l0eVByb3BlcnRpZXMpOworCQlyZXR1cm4gY2l0eURhdGFUeXBlOworCX0KKworCXByaXZhdGUgc3RhdGljIERhdGFUeXBlRGVmaW5pdGlvbiBidWlsZFBlcnNvbkRhdGFUeXBlKCkgeworCQlEYXRhVHlwZURlZmluaXRpb24gcGVyc29uRGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVEZWZpbml0aW9uKCk7CisJCXBlcnNvbkRhdGFUeXBlLnNldE5hbWUoInBlcnNvbiIpOworCQlMaXN0PFByb3BlcnR5RGVmaW5pdGlvbj4gcGVyc29uUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlQcm9wZXJ0eURlZmluaXRpb24gcGVyc29uUHJvcGVydHlEZWZpbml0aW9uMSA9IG5ldyBQcm9wZXJ0eURlZmluaXRpb24oKTsKKwkJcGVyc29uUHJvcGVydHlEZWZpbml0aW9uMS5zZXROYW1lKCJhZ2UiKTsKKwkJcGVyc29uUHJvcGVydHlEZWZpbml0aW9uMS5zZXRUeXBlKCJteWludGVnZXIiKTsKKwkJUHJvcGVydHlEZWZpbml0aW9uIHBlcnNvblByb3BlcnR5RGVmaW5pdGlvbjIgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCXBlcnNvblByb3BlcnR5RGVmaW5pdGlvbjIuc2V0TmFtZSgiYWRkcmVzcyIpOworCQlwZXJzb25Qcm9wZXJ0eURlZmluaXRpb24yLnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuU1RSSU5HLmdldFR5cGUoKSk7CisKKwkJcGVyc29uUHJvcGVydGllcy5hZGQocGVyc29uUHJvcGVydHlEZWZpbml0aW9uMSk7CisJCXBlcnNvblByb3BlcnRpZXMuYWRkKHBlcnNvblByb3BlcnR5RGVmaW5pdGlvbjIpOworCisJCXBlcnNvbkRhdGFUeXBlLnNldFByb3BlcnRpZXMocGVyc29uUHJvcGVydGllcyk7CisJCXJldHVybiBwZXJzb25EYXRhVHlwZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEYXRhVHlwZURlZmluaXRpb24gYnVpbGRGaWxlRGF0YVR5cGUoKSB7CisJCURhdGFUeXBlRGVmaW5pdGlvbiBmaWxlRGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVEZWZpbml0aW9uKCk7CisJCWZpbGVEYXRhVHlwZS5zZXROYW1lKCJmaWxlIik7CisJCUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPiBmaWxlUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlQcm9wZXJ0eURlZmluaXRpb24gZmlsZVByb3BlcnR5RGVmaW5pdGlvbjEgPSBuZXcgUHJvcGVydHlEZWZpbml0aW9uKCk7CisJCWZpbGVQcm9wZXJ0eURlZmluaXRpb24xLnNldE5hbWUoImFnZSIpOworCQlmaWxlUHJvcGVydHlEZWZpbml0aW9uMS5zZXRUeXBlKCJpbnRlZ2VyIik7CisKKwkJUHJvcGVydHlEZWZpbml0aW9uIGZpbGVQcm9wZXJ0eURlZmluaXRpb24yID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvbigpOworCQlmaWxlUHJvcGVydHlEZWZpbml0aW9uMi5zZXROYW1lKCJhdHRyaWJ1dGVzIik7CisJCWZpbGVQcm9wZXJ0eURlZmluaXRpb24yLnNldFR5cGUoVG9zY2FQcm9wZXJ0eVR5cGUuTUFQLmdldFR5cGUoKSk7CisKKwkJZmlsZVByb3BlcnRpZXMuYWRkKGZpbGVQcm9wZXJ0eURlZmluaXRpb24xKTsKKwkJZmlsZVByb3BlcnRpZXMuYWRkKGZpbGVQcm9wZXJ0eURlZmluaXRpb24yKTsKKworCQlTY2hlbWFEZWZpbml0aW9uIGVudHJ5U2NoZW1hID0gbmV3IFNjaGVtYURlZmluaXRpb24oKTsKKwkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eURhdGFEZWZpbml0aW9uKCk7CisJCXByb3BlcnR5LnNldFR5cGUoImNpdHkiKTsKKwkJZW50cnlTY2hlbWEuc2V0UHJvcGVydHkocHJvcGVydHkpOworCQlmaWxlUHJvcGVydHlEZWZpbml0aW9uMi5zZXRTY2hlbWEoZW50cnlTY2hlbWEpOworCisJCWZpbGVEYXRhVHlwZS5zZXRQcm9wZXJ0aWVzKGZpbGVQcm9wZXJ0aWVzKTsKKwkJcmV0dXJuIGZpbGVEYXRhVHlwZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEYXRhVHlwZURlZmluaXRpb24gZ2V0UHJpbWl0aXZlRGF0YVR5cGUoU3RyaW5nIHR5cGUpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZGVyaXZlZEZyb20gPSBuZXcgRGF0YVR5cGVEZWZpbml0aW9uKCk7CisJCWRlcml2ZWRGcm9tLnNldE5hbWUodHlwZSk7CisKKwkJcmV0dXJuIGRlcml2ZWRGcm9tOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGF0YVR5cGVEZWZpbml0aW9uIGJ1aWxkRGVyaXZlZEZyb21JbnRlZ2VyVHlwZSgpIHsKKworCQlEYXRhVHlwZURlZmluaXRpb24gZGVyaXZlZEZyb20gPSBnZXRQcmltaXRpdmVEYXRhVHlwZSgiaW50ZWdlciIpOworCisJCURhdGFUeXBlRGVmaW5pdGlvbiBteUludGVnZXJEYXRhVHlwZSA9IG5ldyBEYXRhVHlwZURlZmluaXRpb24oKTsKKwkJbXlJbnRlZ2VyRGF0YVR5cGUuc2V0RGVyaXZlZEZyb20oZGVyaXZlZEZyb20pOworCisJCW15SW50ZWdlckRhdGFUeXBlLnNldE5hbWUoIm15aW50ZWdlciIpOworCisJCXJldHVybiBteUludGVnZXJEYXRhVHlwZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15RmlsZSB7CisKKwkJSW50ZWdlciBhZ2U7CisKKwkJTWFwPFN0cmluZywgQ2l0eT4gYXR0cmlidXRlczsKKworCQlwdWJsaWMgSW50ZWdlciBnZXRBZ2UoKSB7CisJCQlyZXR1cm4gYWdlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0QWdlKEludGVnZXIgYWdlKSB7CisJCQl0aGlzLmFnZSA9IGFnZTsKKwkJfQorCisJCXB1YmxpYyBNYXA8U3RyaW5nLCBDaXR5PiBnZXRBdHRyaWJ1dGVzKCkgeworCQkJcmV0dXJuIGF0dHJpYnV0ZXM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKE1hcDxTdHJpbmcsIENpdHk+IGF0dHJpYnV0ZXMpIHsKKwkJCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2l0eSB7CisKKwkJU3RyaW5nIGFkZHJlc3M7CisJCUludGVnZXIgYWdlOworCisJCXB1YmxpYyBDaXR5KFN0cmluZyBhZGRyZXNzLCBJbnRlZ2VyIGFnZSkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisJCQl0aGlzLmFnZSA9IGFnZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKKwkJCXJldHVybiBhZGRyZXNzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0QWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgeworCQkJdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKwkJfQorCisJCXB1YmxpYyBJbnRlZ2VyIGdldEFnZSgpIHsKKwkJCXJldHVybiBhZ2U7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRBZ2UoSW50ZWdlciBhZ2UpIHsKKwkJCXRoaXMuYWdlID0gYWdlOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7CisKKwkJU3RyaW5nIGFkZHJlc3M7CisJCUludGVnZXIgYWdlOworCisJCXB1YmxpYyBQZXJzb24oU3RyaW5nIGFkZHJlc3MsIEludGVnZXIgYWdlKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKwkJCXRoaXMuYWdlID0gYWdlOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCkgeworCQkJcmV0dXJuIGFkZHJlc3M7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB7CisJCQl0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0QWdlKCkgeworCQkJcmV0dXJuIGFnZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEFnZShJbnRlZ2VyIGFnZSkgeworCQkJdGhpcy5hZ2UgPSBhZ2U7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiUGVyc29uIFthZGRyZXNzPSIgKyBhZGRyZXNzICsgIiwgYWdlPSIgKyBhZ2UgKyAiXSI7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ3JlZGVudGlhbCB7CisKKwkJU3RyaW5nIHByb3RvY29sOworCQlJbnRlZ2VyIHN1bTsKKwkJU3RyaW5nIHRva2VuX3R5cGU7CisJCVN0cmluZyB0b2tlbjsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBrZXlzOworCQlTdHJpbmcgdXNlcjsKKwkJQm9vbGVhbiBpc01hbmRhdG9yeTsKKwkJTGlzdDxTdHJpbmc+IG15bGlzdDsKKwkJQ2l0eSBteWNpdHk7CisKKwkJcHVibGljIENyZWRlbnRpYWwoU3RyaW5nIHByb3RvY29sLCBJbnRlZ2VyIHN1bSwgU3RyaW5nIHRva2VuX3R5cGUsIFN0cmluZyB0b2tlbiwgTWFwPFN0cmluZywgU3RyaW5nPiBrZXlzLAorCQkJCVN0cmluZyB1c2VyLCBCb29sZWFuIGlzTWFuZGF0b3J5LCBMaXN0PFN0cmluZz4gbXlsaXN0KSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOworCQkJdGhpcy5zdW0gPSBzdW07CisJCQl0aGlzLnRva2VuX3R5cGUgPSB0b2tlbl90eXBlOworCQkJdGhpcy50b2tlbiA9IHRva2VuOworCQkJdGhpcy5rZXlzID0ga2V5czsKKwkJCXRoaXMudXNlciA9IHVzZXI7CisJCQl0aGlzLmlzTWFuZGF0b3J5ID0gaXNNYW5kYXRvcnk7CisJCQl0aGlzLm15bGlzdCA9IG15bGlzdDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisJCQlyZXR1cm4gcHJvdG9jb2w7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKKwkJCXRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VG9rZW5fdHlwZSgpIHsKKwkJCXJldHVybiB0b2tlbl90eXBlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0VG9rZW5fdHlwZShTdHJpbmcgdG9rZW5fdHlwZSkgeworCQkJdGhpcy50b2tlbl90eXBlID0gdG9rZW5fdHlwZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7CisJCQlyZXR1cm4gdG9rZW47CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pIHsKKwkJCXRoaXMudG9rZW4gPSB0b2tlbjsKKwkJfQorCisJCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEtleXMoKSB7CisJCQlyZXR1cm4ga2V5czsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEtleXMoTWFwPFN0cmluZywgU3RyaW5nPiBrZXlzKSB7CisJCQl0aGlzLmtleXMgPSBrZXlzOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRVc2VyKCkgeworCQkJcmV0dXJuIHVzZXI7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyKSB7CisJCQl0aGlzLnVzZXIgPSB1c2VyOworCQl9CisKKwkJcHVibGljIEJvb2xlYW4gZ2V0SXNNYW5kYXRvcnkoKSB7CisJCQlyZXR1cm4gaXNNYW5kYXRvcnk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRJc01hbmRhdG9yeShCb29sZWFuIGlzTWFuZGF0b3J5KSB7CisJCQl0aGlzLmlzTWFuZGF0b3J5ID0gaXNNYW5kYXRvcnk7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRTdW0oKSB7CisJCQlyZXR1cm4gc3VtOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U3VtKEludGVnZXIgc3VtKSB7CisJCQl0aGlzLnN1bSA9IHN1bTsKKwkJfQorCisJCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TXlsaXN0KCkgeworCQkJcmV0dXJuIG15bGlzdDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldE15bGlzdChMaXN0PFN0cmluZz4gbXlsaXN0KSB7CisJCQl0aGlzLm15bGlzdCA9IG15bGlzdDsKKwkJfQorCisJCXB1YmxpYyBDaXR5IGdldE15Y2l0eSgpIHsKKwkJCXJldHVybiBteWNpdHk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRNeWNpdHkoQ2l0eSBteWNpdHkpIHsKKwkJCXRoaXMubXljaXR5ID0gbXljaXR5OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIkNyZWRlbnRpYWwgW3Byb3RvY29sPSIgKyBwcm90b2NvbCArICIsIHRva2VuX3R5cGU9IiArIHRva2VuX3R5cGUgKyAiLCB0b2tlbj0iICsgdG9rZW4gKyAiLCBrZXlzPSIKKwkJCQkJKyBrZXlzICsgIiwgdXNlcj0iICsgdXNlciArICIsIGlzTWFuZGF0b3J5PSIgKyBpc01hbmRhdG9yeSArICJdIjsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL3V0aWwvT3BlcmF0aW9uVGVzdHNVdGlsLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL3V0aWwvT3BlcmF0aW9uVGVzdHNVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1NmI0OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvdXRpbC9PcGVyYXRpb25UZXN0c1V0aWwuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby50aXRhbi5UaXRhbkdlbmVyaWNEYW87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLlRpdGFuT3BlcmF0aW9uU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwuVW5pcXVlSWRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlJlc291cmNlQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLlNlcnZpY2VDYXRlZ29yeURhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuVXNlckRhdGE7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUucmVzb3VyY2VzLmRhdGEuY2F0ZWdvcnkuQ2F0ZWdvcnlEYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnJlc291cmNlcy5kYXRhLmNhdGVnb3J5LlN1YkNhdGVnb3J5RGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5WYWxpZGF0aW9uVXRpbHM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIE9wZXJhdGlvblRlc3RzVXRpbCB7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVBbmRDcmVhdGVTZXJ2aWNlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5LCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5EYW8pIHsKKwkJQ2F0ZWdvcnlEYXRhIGNhdGVnb3J5RGF0YSA9IG5ldyBDYXRlZ29yeURhdGEoTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSk7CisJCWNhdGVnb3J5RGF0YS5nZXRDYXRlZ29yeURhdGFEZWZpbml0aW9uKCkuc2V0TmFtZShjYXRlZ29yeSk7CisJCWNhdGVnb3J5RGF0YS5nZXRDYXRlZ29yeURhdGFEZWZpbml0aW9uKCkKKwkJCQkuc2V0Tm9ybWFsaXplZE5hbWUoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTRVbmlxdWVuZXNzKGNhdGVnb3J5KSk7CisJCWNhdGVnb3J5RGF0YS5nZXRDYXRlZ29yeURhdGFEZWZpbml0aW9uKCkuc2V0VW5pcXVlSWQoVW5pcXVlSWRCdWlsZGVyLmJ1aWxkQ2F0ZWdvcnlVaWQoCisJCQkJVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTRVbmlxdWVuZXNzKGNhdGVnb3J5KSwgTm9kZVR5cGVFbnVtLlNlcnZpY2VOZXdDYXRlZ29yeSkpOworCQl0aXRhbkRhby5kZWxldGVOb2RlKGNhdGVnb3J5RGF0YSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJRWl0aGVyPENhdGVnb3J5RGF0YSwgVGl0YW5PcGVyYXRpb25TdGF0dXM+IGNyZWF0ZU5vZGUgPSB0aXRhbkRhby5jcmVhdGVOb2RlKGNhdGVnb3J5RGF0YSwgQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJcmV0dXJuIChTdHJpbmcpIGNyZWF0ZU5vZGUubGVmdCgpLnZhbHVlKCkuZ2V0VW5pcXVlSWQoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVBbmRDcmVhdGVSZXNvdXJjZUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHN1YmNhdGVnb3J5LAorCQkJVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvKSB7CisKKwkJQ2F0ZWdvcnlEYXRhIGNhdGVnb3J5RGF0YSA9IG5ldyBDYXRlZ29yeURhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlTmV3Q2F0ZWdvcnkpOworCQljYXRlZ29yeURhdGEuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoY2F0ZWdvcnkpOworCQljYXRlZ29yeURhdGEuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpCisJCQkJLnNldE5vcm1hbGl6ZWROYW1lKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVDYXRlZ29yeU5hbWU0VW5pcXVlbmVzcyhjYXRlZ29yeSkpOworCQljYXRlZ29yeURhdGEuZ2V0Q2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlci5idWlsZENhdGVnb3J5VWlkKAorCQkJCVZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVDYXRlZ29yeU5hbWU0VW5pcXVlbmVzcyhjYXRlZ29yeSksIE5vZGVUeXBlRW51bS5SZXNvdXJjZU5ld0NhdGVnb3J5KSk7CisKKwkJU3ViQ2F0ZWdvcnlEYXRhIHN1YmNhdGVnb3J5RGF0YSA9IG5ldyBTdWJDYXRlZ29yeURhdGEoTm9kZVR5cGVFbnVtLlJlc291cmNlU3ViY2F0ZWdvcnkpOworCQlzdWJjYXRlZ29yeURhdGEuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpLnNldE5hbWUoc3ViY2F0ZWdvcnkpOworCQlzdWJjYXRlZ29yeURhdGEuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpCisJCQkJLnNldE5vcm1hbGl6ZWROYW1lKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVDYXRlZ29yeU5hbWU0VW5pcXVlbmVzcyhzdWJjYXRlZ29yeSkpOworCQlzdWJjYXRlZ29yeURhdGEuZ2V0U3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpLnNldFVuaXF1ZUlkKFVuaXF1ZUlkQnVpbGRlcgorCQkJCS5idWlsZFN1YkNhdGVnb3J5VWlkKGNhdGVnb3J5RGF0YS5nZXRDYXRlZ29yeURhdGFEZWZpbml0aW9uKCkuZ2V0VW5pcXVlSWQoKSwgc3ViY2F0ZWdvcnkpKTsKKwkJdGl0YW5EYW8uZGVsZXRlTm9kZShjYXRlZ29yeURhdGEsIENhdGVnb3J5RGF0YS5jbGFzcyk7CisJCXRpdGFuRGFvLmRlbGV0ZU5vZGUoc3ViY2F0ZWdvcnlEYXRhLCBTdWJDYXRlZ29yeURhdGEuY2xhc3MpOworCQlFaXRoZXI8Q2F0ZWdvcnlEYXRhLCBUaXRhbk9wZXJhdGlvblN0YXR1cz4gY3JlYXRlTm9kZSA9IHRpdGFuRGFvLmNyZWF0ZU5vZGUoY2F0ZWdvcnlEYXRhLCBDYXRlZ29yeURhdGEuY2xhc3MpOworCQl0aXRhbkRhby5jcmVhdGVOb2RlKHN1YmNhdGVnb3J5RGF0YSwgU3ViQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwkJdGl0YW5EYW8uY3JlYXRlUmVsYXRpb24oY2F0ZWdvcnlEYXRhLCBzdWJjYXRlZ29yeURhdGEsIEdyYXBoRWRnZUxhYmVscy5TVUJfQ0FURUdPUlksIG51bGwpOworCQlyZXR1cm4gKFN0cmluZykgY3JlYXRlTm9kZS5sZWZ0KCkudmFsdWUoKS5nZXRVbmlxdWVJZCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVTZXJ2aWNlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5LCBUaXRhbkdlbmVyaWNEYW8gdGl0YW5EYW8pIHsKKwkJU2VydmljZUNhdGVnb3J5RGF0YSBjYXRlZ29yeURhdGEgPSBuZXcgU2VydmljZUNhdGVnb3J5RGF0YShjYXRlZ29yeSk7CisJCXRpdGFuRGFvLmRlbGV0ZU5vZGUoY2F0ZWdvcnlEYXRhLCBTZXJ2aWNlQ2F0ZWdvcnlEYXRhLmNsYXNzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUmVzb3VyY2VDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBzdWJjYXRlZ29yeSwgVGl0YW5HZW5lcmljRGFvIHRpdGFuRGFvKSB7CisJCVJlc291cmNlQ2F0ZWdvcnlEYXRhIGNhdGVnb3J5RGF0YSA9IG5ldyBSZXNvdXJjZUNhdGVnb3J5RGF0YShjYXRlZ29yeSwgc3ViY2F0ZWdvcnkpOworCQl0aXRhbkRhby5kZWxldGVOb2RlKGNhdGVnb3J5RGF0YSwgUmVzb3VyY2VDYXRlZ29yeURhdGEuY2xhc3MpOworCX0KKworCXB1YmxpYyBzdGF0aWMgVXNlciBjb252ZXJ0VXNlckRhdGFUb1VzZXIoVXNlckRhdGEgbW9kaWZpZXJEYXRhKSB7CisJCVVzZXIgbW9kaWZpZXIgPSBuZXcgVXNlcigpOworCQltb2RpZmllci5zZXRVc2VySWQobW9kaWZpZXJEYXRhLmdldFVzZXJJZCgpKTsKKwkJbW9kaWZpZXIuc2V0RW1haWwobW9kaWZpZXJEYXRhLmdldEVtYWlsKCkpOworCQltb2RpZmllci5zZXRGaXJzdE5hbWUobW9kaWZpZXJEYXRhLmdldEZpcnN0TmFtZSgpKTsKKwkJbW9kaWZpZXIuc2V0TGFzdE5hbWUobW9kaWZpZXJEYXRhLmdldExhc3ROYW1lKCkpOworCQltb2RpZmllci5zZXRSb2xlKG1vZGlmaWVyRGF0YS5nZXRSb2xlKCkpOworCQlyZXR1cm4gbW9kaWZpZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL29wZXJhdGlvbnMvaW1wbC91dGlsL1ByaW50R3JhcGguamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvdXRpbC9QcmludEdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4Y2U1NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvdXRpbC9QcmludEdyYXBoLmphdmEKQEAgLTAsMCArMSw0NjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5vcGVyYXRpb25zLmltcGwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkRpcmVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50aW5rZXJwb3AuZ3JlbWxpbi5zdHJ1Y3R1cmUuVmVydGV4OworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLnV0aWwuRWxlbWVudEhlbHBlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8ubmVvNGouR3JhcGhFZGdlTGFiZWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhby5uZW80ai5HcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Ob2RlVHlwZUVudW07CisKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuRWRnZTsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CitpbXBvcnQgY29tLnRoaW5rYXVyZWxpdXMudGl0YW4uY29yZS5UaXRhblZlcnRleDsKKy8vaW1wb3J0IGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy5EaXJlY3Rpb247CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMuRWRnZTsKKy8vaW1wb3J0IGNvbS50aW5rZXJwb3AuYmx1ZXByaW50cy5WZXJ0ZXg7CisvL2ltcG9ydCBjb20udGlua2VycG9wLmJsdWVwcmludHMudXRpbC5FbGVtZW50SGVscGVyOworCitwdWJsaWMgY2xhc3MgUHJpbnRHcmFwaCB7CisKKwlwdWJsaWMgdm9pZCBwcmludEdyYXBoVmVydGljZXMoVGl0YW5HcmFwaCBncmFwaCkgeworCisJCUl0ZXJhYmxlPFRpdGFuVmVydGV4PiB2ZXJ0aWNlcyA9IGdyYXBoLnF1ZXJ5KCkudmVydGljZXMoKTsKKworCQlpZiAodmVydGljZXMgIT0gbnVsbCkgeworCQkJSXRlcmF0b3I8VGl0YW5WZXJ0ZXg+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlWZXJ0ZXggdmVydGV4ID0gaXRlcmF0b3IubmV4dCgpOworCisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHZlcnRleCk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXJ0ZXgpKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCQkJfQorCisJCX0KKwkJLy8gZ3JhcGguY29tbWl0KCk7CisJCWdyYXBoLnR4KCkuY29tbWl0KCk7CisJfQorCisJcHVibGljIHZvaWQgcHJpbnRHcmFwaEVkZ2VzKFRpdGFuR3JhcGggZ3JhcGgpIHsKKworCQlJdGVyYWJsZTxUaXRhbkVkZ2U+IHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS5lZGdlcygpOworCisJCWlmICh2ZXJ0aWNlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxUaXRhbkVkZ2U+IGl0ZXJhdG9yID0gdmVydGljZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlFZGdlIGVkZ2UgPSBpdGVyYXRvci5uZXh0KCk7CisKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZWRnZSk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJlZGdlPSIgKyBlZGdlLmdldExhYmVsKCkgKyAiLAorCQkJCS8vIHByb3BlcnRpZXM9IisgRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKGVkZ2UpKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImVkZ2U9IiArIGVkZ2UubGFiZWwoKSArICIsIHByb3BlcnRpZXM9IisKKwkJCQkvLyBnZXRQcm9wZXJ0aWVzKGVkZ2UpKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCQkJfQorCisJCX0KKwkJLy8gZ3JhcGguY29tbWl0KCk7CisJCWdyYXBoLnR4KCkuY29tbWl0KCk7CisJfQorCisJcHVibGljIFN0cmluZyBidWlsZEdyYXBoRm9yV2ViZ3JhcGhXaXooVGl0YW5HcmFwaCBncmFwaCkgeworCisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWJ1aWxkZXIuYXBwZW5kKCJkaWdyYXBoIGZpbml0ZV9zdGF0ZV9tYWNoaW5lIHtcbiIpOworCQlidWlsZGVyLmFwcGVuZCgicmFua2Rpcj1MUjtcbiIpOworCQlidWlsZGVyLmFwcGVuZCgic2l6ZT1cIjE1LDEwXCIgXG4iKTsKKwkJLy8gbm9kZSBbc2hhcGUgPSBkb3VibGVjaXJjbGVdOyBMUl8wIExSXzMgTFJfNCBMUl84OworCQkvLyBub2RlIFtzaGFwZSA9IGNpcmNsZV07CisKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS52ZXJ0aWNlcygpOworCisJCWlmICh2ZXJ0aWNlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odmVydGV4KTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcnRleCkpOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRQcm9wZXJ0aWVzKHZlcnRleCkpOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisKKwkJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisKKwkJCQlTdHJpbmcgbm9kZUxhYmVsID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoR3JhcGhQcm9wZXJ0aWVzRGljdGlvbmFyeS5MQUJFTC5nZXRQcm9wZXJ0eSgpKTsKKworCQkJCVN0cmluZyBjb2xvciA9IGdldENvbG9yQnlOb2RlVHlwZShub2RlTGFiZWwpOworCisJCQkJU3RyaW5nIHVpZCA9IGdldE5vZGVJZEJ5TGFiZWwobm9kZUxhYmVsLCBwcm9wZXJ0aWVzKTsKKworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidWlkPSIgKyB1aWQpOworCisJCQkJU3RyaW5nIG5vZGVSZWNvcmQgPSBidWlsZE5vZGVSZWNvcmQodWlkLCBjb2xvciwgcHJvcGVydGllcyk7CisKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obm9kZVJlY29yZCk7CisKKwkJCQlidWlsZGVyLmFwcGVuZChub2RlUmVjb3JkKTsKKworCQkJCS8vIGlmIChub2RlTGFiZWwuZXF1YWxzKE5vZGVUeXBlRW51bS5DYXRlZ29yeSkpIHsKKwkJCQkvLworCQkJCS8vIFN0cmluZworCQkJCS8vCisJCQkJLy8gfSBlbHNlIChub2RlTGFiZWwuZXF1YWxzKE5vZGVUeXBlRW51bS5Vc2VyKSkgeworCQkJCS8vCisJCQkJLy8gfQorCisJCQl9CisKKwkJfQorCisJCUl0ZXJhYmxlPFRpdGFuRWRnZT4gZWRnZXMgPSBncmFwaC5xdWVyeSgpLmVkZ2VzKCk7CisKKwkJaWYgKGVkZ2VzICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPFRpdGFuRWRnZT4gaXRlcmF0b3IgPSBlZGdlcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUVkZ2UgZWRnZSA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJCS8vIFZlcnRleCB2ZXJ0ZXhGcm9tID0gZWRnZS5nZXRWZXJ0ZXgoRGlyZWN0aW9uLk9VVCk7CisJCQkJLy8gVmVydGV4IHZlcnRleFRvID0gZWRnZS5nZXRWZXJ0ZXgoRGlyZWN0aW9uLklOKTsKKwkJCQlWZXJ0ZXggdmVydGV4RnJvbSA9IGVkZ2Uub3V0VmVydGV4KCk7CisJCQkJVmVydGV4IHZlcnRleFRvID0gZWRnZS5pblZlcnRleCgpOworCisJCQkJLy8gU3RyaW5nIGZyb21VaWQgPQorCQkJCS8vIGdldE5vZGVJZEJ5TGFiZWwoKFN0cmluZyl2ZXJ0ZXhGcm9tLmdldFByb3BlcnR5KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSksCisJCQkJLy8gRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcnRleEZyb20pKTsKKwkJCQkvLyBTdHJpbmcgdG9VaWQgPQorCQkJCS8vIGdldE5vZGVJZEJ5TGFiZWwoKFN0cmluZyl2ZXJ0ZXhUby5nZXRQcm9wZXJ0eShHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LkxBQkVMLmdldFByb3BlcnR5KCkpLAorCQkJCS8vIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyh2ZXJ0ZXhUbykpOworCQkJCVN0cmluZyBmcm9tVWlkID0gZ2V0Tm9kZUlkQnlMYWJlbCh2ZXJ0ZXhGcm9tLnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSksCisJCQkJCQlnZXRQcm9wZXJ0aWVzKHZlcnRleEZyb20pKTsKKwkJCQlTdHJpbmcgdG9VaWQgPSBnZXROb2RlSWRCeUxhYmVsKHZlcnRleFRvLnZhbHVlKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSksCisJCQkJCQlnZXRQcm9wZXJ0aWVzKHZlcnRleFRvKSk7CisKKwkJCQkvLyBTdHJpbmcgZWRnZUxhYmVsID0gZWRnZS5nZXRMYWJlbCgpOworCQkJCVN0cmluZyBlZGdlTGFiZWwgPSBlZGdlLmxhYmVsKCk7CisKKwkJCQkvLyBTdHJpbmcgZWRnZVJlY29yZCA9IGJ1aWxkRWRnZVJlY29yZChmcm9tVWlkLCB0b1VpZCwKKwkJCQkvLyBlZGdlTGFiZWwsIEVsZW1lbnRIZWxwZXIuZ2V0UHJvcGVydGllcyhlZGdlKSk7CisJCQkJU3RyaW5nIGVkZ2VSZWNvcmQgPSBidWlsZEVkZ2VSZWNvcmQoZnJvbVVpZCwgdG9VaWQsIGVkZ2VMYWJlbCwgZ2V0UHJvcGVydGllcyhlZGdlKSk7CisKKwkJCQlidWlsZGVyLmFwcGVuZChlZGdlUmVjb3JkKTsKKworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlZGdlKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImVkZ2U9IiArIGVkZ2UuZ2V0TGFiZWwoKSArICIsCisJCQkJLy8gcHJvcGVydGllcz0iCisJCQkJLy8gKyBFbGVtZW50SGVscGVyLmdldFByb3BlcnRpZXMoZWRnZSkpOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZWRnZT0iICsgZWRnZS5sYWJlbCgpICsgIiwgcHJvcGVydGllcz0iCisJCQkJLy8gKyBnZXRQcm9wZXJ0aWVzKGVkZ2UpKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCQkJfQorCisJCX0KKworCQlidWlsZGVyLmFwcGVuZCgiIH0gIik7CisKKwkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKworCX0KKworCS8vIExSXzAgWyBzdHlsZSA9ICJib2xkIiBjb2xvciA9ICJyZWQiIHNoYXBlID0gIk1yZWNvcmQiIGxhYmVsID0KKwkvLyAiaGVsbG8mIzkyO253b3JsZCB8IHsgbmFtZSB8IGFwYWNoZSB9IHwgeyB2ZXJzaW9uIHwgMS4wIH0gfCB7IHVpZCB8CisJLy8gYXBhY2hlLjEuMCB9IHwgeyBzdGF0ZXwgQ0VSVElGSUVEIH0gfHsgYiB8e2N8PGhlcmU+IGR8ZX18IGZ9fCBnIHwgaCIKKwkvLyBdCisKKwkvLyBMUl8wIC0+IExSXzIgWyBsYWJlbCA9ICJTUyhCKSIgXTsKKwkvLyBMUl8wIC0+IExSXzEgWyBsYWJlbCA9ICJTUyhTKSIgXTsKKwkvLyBMUl8xIC0+IExSXzMgWyBsYWJlbCA9ICJTKCRlbmQpIiBdOworCS8vIExSXzIgLT4gTFJfNiBbIGxhYmVsID0gIlNTKGIpIiBdOworCS8vIExSXzIgLT4gTFJfNSBbIGxhYmVsID0gIlNTKGEpIiBdOworCS8vIExSXzIgLT4gTFJfNCBbIGxhYmVsID0gIlMoQSkiIF07CisJLy8gTFJfNSAtPiBMUl83IFsgbGFiZWwgPSAiUyhiKSIgXTsKKwkvLyBMUl81IC0+IExSXzUgWyBsYWJlbCA9ICJTKGEpIiBdOworCS8vIExSXzYgLT4gTFJfNiBbIGxhYmVsID0gIlMoYikiIF07CisJLy8gTFJfNiAtPiBMUl81IFsgbGFiZWwgPSAiUyhhKSIgXTsKKwkvLyBMUl83IC0+IExSXzggWyBsYWJlbCA9ICJTKGIpIiBdOworCS8vIExSXzcgLT4gTFJfNSBbIGxhYmVsID0gIlMoYSkiIF07CisJLy8gTFJfOCAtPiBMUl82IFsgbGFiZWwgPSAiUyhiKSIgXTsKKwkvLyBMUl84IC0+IExSXzUgWyBsYWJlbCA9ICJTKGEpIiBdOworCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRFZGdlUmVjb3JkKFN0cmluZyBmcm9tVWlkLCBTdHJpbmcgdG9VaWQsIFN0cmluZyBlZGdlTGFiZWwsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCS8vIExSXzAgLT4gTFJfMiBbIGxhYmVsID0gIlNTKEIpIiBdOworCisJCVN0cmluZyBnZW5lcmF0ZWRQcm9wcyA9IGdlbmVyYXRlU3RyaW5nRnJvbVByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKwkJU3RyaW5nIGNvbG9yID0gZ2V0RWRnZUNvbG9yQnlMYWJlbChlZGdlTGFiZWwpOworCisJCWJ1aWxkZXIuYXBwZW5kKCJcIiIgKyBmcm9tVWlkICsgIlwiIiArICIgLT4gIiArICJcIiIgKyB0b1VpZCArICJcIiIgKyAiIFsgY29sb3IgPSAiICsgY29sb3IgKyAiIGxhYmVsID0gXCIiCisJCQkJKyBlZGdlTGFiZWwgKyAiKCIgKyBnZW5lcmF0ZWRQcm9wcyArICIpXCIiICsgIiBdICIgKyAiXG4iKTsKKworCQlyZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEVkZ2VDb2xvckJ5TGFiZWwoU3RyaW5nIGVkZ2VMYWJlbCkgeworCisJCUdyYXBoRWRnZUxhYmVscyBlZGdlTGFiZWxFbnVtID0gR3JhcGhFZGdlTGFiZWxzLmdldEJ5TmFtZShlZGdlTGFiZWwpOworCisJCVN0cmluZyBjb2xvciA9ICJibGFjayI7CisKKwkJc3dpdGNoIChlZGdlTGFiZWxFbnVtKSB7CisJCWNhc2UgUFJPUEVSVFk6CisJCQljb2xvciA9ICJvcmFuZ2UiOworCQkJYnJlYWs7CisJCWNhc2UgQ0FQQUJJTElUWToKKwkJCWJyZWFrOworCQljYXNlIERFUklWRURfRlJPTToKKwkJCWNvbG9yID0gInJlZCI7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCXJldHVybiBjb2xvcjsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZW5lcmF0ZVN0cmluZ0Zyb21Qcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkJZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpOworCQkJCWJ1aWxkZXIuYXBwZW5kKGtleSArICI9IiArIHZhbHVlICsgIl9fIik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTm9kZVJlY29yZChTdHJpbmcgdWlkLCBTdHJpbmcgY29sb3IsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJYnVpbGRlci5hcHBlbmQoIlwiIiArIHVpZCArICJcIiIgKyAiIFsgIik7CisJCWJ1aWxkZXIuYXBwZW5kKCJzdHlsZSA9IFwiYm9sZFwiICIpOworCQlidWlsZGVyLmFwcGVuZCgiIGNvbG9yID0gXCIiICsgY29sb3IgKyAiXCIiKTsKKwkJYnVpbGRlci5hcHBlbmQoInNoYXBlID0gXCJNcmVjb3JkXCIgIik7CisKKwkJU3RyaW5nIGxhYmVsID0gIiI7CisJCWludCBtYXhLZXlMZW5ndGggPSAwOworCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeTEgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKwkJCVN0cmluZyBrZXkgPSBlbnRyeTEuZ2V0S2V5KCk7CisJCQlpbnQga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aCgpOworCQkJaWYgKGtleUxlbmd0aCA+IG1heEtleUxlbmd0aCkgeworCQkJCW1heEtleUxlbmd0aCA9IGtleUxlbmd0aDsKKwkJCX0KKwkJfQorCisJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQlmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworCisJCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisJCQlTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7CisKKwkJCWlmIChrZXkuZXF1YWxzKEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuQ09OU1RSQUlOVFMuZ2V0UHJvcGVydHkoKSkpIHsKKwkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoIlteXFx3XFxzXSIsICJfIik7CisJCQl9CisKKwkJCWtleSA9IHBhZEtleShrZXksIG1heEtleUxlbmd0aCk7CisKKwkJCWlmIChmaXJzdCkgeworCQkJCWZpcnN0ID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCWxhYmVsICs9ICIgfCAiOworCQkJfQorCQkJbGFiZWwgKz0gIiB7ICIgKyBrZXkgKyAiIHwgIiArIHZhbHVlICsgIiB9ICI7CisJCX0KKworCQlidWlsZGVyLmFwcGVuZCgibGFiZWwgPSBcIiIgKyBsYWJlbCArICJcIiAiKTsKKwkJYnVpbGRlci5hcHBlbmQoIiBdICIpOworCisJCS8vIExSXzAgWyBzdHlsZSA9ICJib2xkIiBjb2xvciA9ICJyZWQiIHNoYXBlID0gIk1yZWNvcmQiIGxhYmVsID0KKwkJLy8gImhlbGxvJiM5Mjtud29ybGQgfCB7IG5hbWUgfCBhcGFjaGUgfSB8IHsgdmVyc2lvbiB8IDEuMCB9IHwgeyB1aWQgfAorCQkvLyBhcGFjaGUuMS4wIH0gfCB7IHN0YXRlfCBDRVJUSUZJRUQgfSB8eyBiIHx7Y3w8aGVyZT4gZHxlfXwgZn18IGcgfCBoIgorCQkvLyBdCisKKwkJYnVpbGRlci5hcHBlbmQoIiBcbiAiKTsKKwkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXROb2RlSWRCeUxhYmVsKFN0cmluZyBub2RlTGFiZWwsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworCisJCU5vZGVUeXBlRW51bSB0eXBlRW51bSA9IE5vZGVUeXBlRW51bS5nZXRCeU5hbWUobm9kZUxhYmVsKTsKKworCQlTdHJpbmcgdWlkID0gbnVsbDsKKwkJc3dpdGNoICh0eXBlRW51bSkgeworCisJCWNhc2UgVXNlcjoKKwkJCXVpZCA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuVVNFUl9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCWJyZWFrOworCQljYXNlIFNlcnZpY2VDYXRlZ29yeToKKwkJY2FzZSBSZXNvdXJjZUNhdGVnb3J5OgorCQljYXNlIFRhZzoKKwkJCXVpZCA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTkFNRS5nZXRQcm9wZXJ0eSgpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl1aWQgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChHcmFwaFByb3BlcnRpZXNEaWN0aW9uYXJ5LlVOSVFVRV9JRC5nZXRQcm9wZXJ0eSgpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIHVpZDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRDb2xvckJ5Tm9kZVR5cGUoU3RyaW5nIG5vZGVMYWJlbCkgeworCisJCU5vZGVUeXBlRW51bSB0eXBlRW51bSA9IE5vZGVUeXBlRW51bS5nZXRCeU5hbWUobm9kZUxhYmVsKTsKKworCQlTdHJpbmcgY29sb3IgPSAicmVkIjsKKwkJc3dpdGNoICh0eXBlRW51bSkgeworCQljYXNlIFNlcnZpY2VDYXRlZ29yeToKKwkJCWNvbG9yID0gImJsdWUiOworCQkJYnJlYWs7CisJCWNhc2UgUmVzb3VyY2VDYXRlZ29yeToKKwkJCWNvbG9yID0gImJsdWUiOworCQkJYnJlYWs7CisJCWNhc2UgUmVzb3VyY2U6CisJCQljb2xvciA9ICJmb3Jlc3RncmVlbiI7CisJCQlicmVhazsKKwkJY2FzZSBVc2VyOgorCQkJY29sb3IgPSAiZ3JlZW4iOworCQkJYnJlYWs7CisJCWNhc2UgQ2FwYWJpbGl0eToKKwkJCWNvbG9yID0gImxpZ2h0Z3JlZW4iOworCQkJYnJlYWs7CisJCWNhc2UgQ2FwYWJpbGl0eVR5cGU6CisJCQljb2xvciA9ICJncmF5IjsKKwkJCWJyZWFrOworCQljYXNlIFByb3BlcnR5OgorCQkJY29sb3IgPSAiY3lhbiI7CisJCQlicmVhazsKKwkJY2FzZSBSZWxhdGlvbnNoaXBUeXBlOgorCQkJY29sb3IgPSAiZGFya29yY2hpZCI7CisJCQlicmVhazsKKwkJY2FzZSBSZXF1aXJlbWVudDoKKwkJCWNvbG9yID0gImdvbGQiOworCQkJYnJlYWs7CisJCWNhc2UgUmVxdWlyZW1lbnRJbXBsOgorCQkJLy8gY29sb3IgPSAiZm9yZXN0Z3JlZW4iOworCQkJY29sb3IgPSAiZ29sZCI7CisJCQlicmVhazsKKwkJY2FzZSBTZXJ2aWNlOgorCQkJY29sb3IgPSAiY3lhbjQiOworCQkJYnJlYWs7CisJCWNhc2UgVGFnOgorCQkJY29sb3IgPSAiZGltZ3JleSI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCisJCX0KKworCQlyZXR1cm4gY29sb3I7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcGFkS2V5KFN0cmluZyBrZXksIGludCBtYXhLZXlMZW5ndGgpIHsKKworCQlpbnQgbGVuID0ga2V5Lmxlbmd0aCgpOworCQlmb3IgKGludCBpID0gbGVuOyBpIDwgbWF4S2V5TGVuZ3RoOyBpKyspIHsKKwkJCWtleSArPSAiICI7CisJCX0KKworCQlyZXR1cm4ga2V5OworCX0KKworCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZWZXJ0aWNlcyhUaXRhbkdyYXBoIGdyYXBoKSB7CisJCWludCBjb3VudGVyID0gMDsKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gZ3JhcGgucXVlcnkoKS52ZXJ0aWNlcygpOworCisJCWlmICh2ZXJ0aWNlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvcjxUaXRhblZlcnRleD4gaXRlcmF0b3IgPSB2ZXJ0aWNlcy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCVZlcnRleCB2ZXJ0ZXggPSBpdGVyYXRvci5uZXh0KCk7CisJCQkJY291bnRlcisrOworCQkJfQorCQl9CisJCXJldHVybiBjb3VudGVyOworCX0KKworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRWZXJ0aWNlc1NldChUaXRhbkdyYXBoIHRpdGFuR3JhcGgpIHsKKworCQlTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKwkJSXRlcmFibGU8VGl0YW5WZXJ0ZXg+IHZlcnRpY2VzID0gdGl0YW5HcmFwaC5xdWVyeSgpLnZlcnRpY2VzKCk7CisKKwkJaWYgKHZlcnRpY2VzICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yPFRpdGFuVmVydGV4PiBpdGVyYXRvciA9IHZlcnRpY2VzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJVmVydGV4IHZlcnRleCA9IGl0ZXJhdG9yLm5leHQoKTsKKworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih2ZXJ0ZXgpOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihFbGVtZW50SGVscGVyLmdldFByb3BlcnRpZXModmVydGV4KSk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldFByb3BlcnRpZXModmVydGV4KSk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKworCQkJCS8vIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9CisJCQkJLy8gRWxlbWVudEhlbHBlci5nZXRQcm9wZXJ0aWVzKHZlcnRleCk7CisJCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyh2ZXJ0ZXgpOworCisJCQkJU3RyaW5nIG5vZGVMYWJlbCA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEdyYXBoUHJvcGVydGllc0RpY3Rpb25hcnkuTEFCRUwuZ2V0UHJvcGVydHkoKSk7CisKKwkJCQlTdHJpbmcgdWlkID0gZ2V0Tm9kZUlkQnlMYWJlbChub2RlTGFiZWwsIHByb3BlcnRpZXMpOworCisJCQkJc2V0LmFkZCh1aWQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHNldDsKKworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoRWxlbWVudCBlbGVtZW50KSB7CisKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBudWxsOworCisJCWlmIChlbGVtZW50LmtleXMoKSAhPSBudWxsICYmIGVsZW1lbnQua2V5cygpLnNpemUoKSA+IDApIHsKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5PiBwcm9wZXJ0eU1hcCA9IEVsZW1lbnRIZWxwZXIucHJvcGVydHlNYXAoZWxlbWVudCwKKwkJCQkJZWxlbWVudC5rZXlzKCkudG9BcnJheShuZXcgU3RyaW5nW2VsZW1lbnQua2V5cygpLnNpemUoKV0pKTsKKwkJCXJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJCQlmb3IgKEVudHJ5PFN0cmluZywgUHJvcGVydHk+IGVudHJ5IDogcHJvcGVydHlNYXAuZW50cnlTZXQoKSkgeworCQkJCVN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLnZhbHVlKCk7CisKKwkJCQlyZXN1bHQucHV0KGtleSwgdmFsdWUpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL3V0aWwvUmVzb3VyY2VDcmVhdGlvblV0aWxzLmphdmEgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvb3BlcmF0aW9ucy9pbXBsL3V0aWwvUmVzb3VyY2VDcmVhdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiOTUxYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9vcGVyYXRpb25zL2ltcGwvdXRpbC9SZXNvdXJjZUNyZWF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLnV0aWw7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNyZWF0aW9uVXRpbHMgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUX1VJRCA9ICJqbTAwN2EiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJUlNUX05BTUUgPSAiSnVsaWEiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBU1RfTkFNRSA9ICJIZW5kcml4IjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX05BTUUgPSAibXktcmVzb3VyY2UiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUkVTT1VSQ0VfVkVSU0lPTiA9ICIxLjAiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVVNFUl9JRCA9ICJqaDAwMDMiOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ESUZJRVJfQVRUX1VJRCA9ICJqazk5OTAiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PRElGSUVSX0ZJUlNUX05BTUUgPSAiUm9raSI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTU9ESUZJRVJfTEFTVF9OQU1FID0gIkJhbGFib2EiOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvc2VyaWFsaXplL1Rlc3RSZXNvdXJjZVNlcmlhbGl6YXRpb24uamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC9zZXJpYWxpemUvVGVzdFJlc291cmNlU2VyaWFsaXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OWUyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9kZWwvc2VyaWFsaXplL1Rlc3RSZXNvdXJjZVNlcmlhbGl6YXRpb24uamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnNlcmlhbGl6ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ0pvaW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnRJbnN0YW5jZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5TZXJpYWxpemF0aW9uVXRpbHM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZVNlcmlhbGl6YXRpb24geworCisJLy8gQFRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kQWxsQ2xhc3Nlc1VzZWRCeVJlc291cmNlKCkgeworCisJCVNldDxDbGFzcz4gY2xhc3Nlc1dpdGhvdXRTZXJpYWx6YWJsZSA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJU2V0PFN0cmluZz4gY2xhc3Nlc3RvSWdub3JlID0gbmV3IEhhc2hTZXQ8PigpOworCQljbGFzc2VzdG9JZ25vcmUuYWRkKCJqYXZhLnV0aWwuTGlzdCIpOworCQljbGFzc2VzdG9JZ25vcmUuYWRkKCJqYXZhLnV0aWwuTWFwIik7CisJCWNsYXNzZXN0b0lnbm9yZS5hZGQoImxvbmciKTsKKworCQlTZXQ8Q2xhc3M+IGFsbENsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisJCWZpbmRBbGxDbGFzc2VzVXNlZEJ5UmVzb3VyY2UoUmVzb3VyY2UuY2xhc3MsIGFsbENsYXNzZXMpOworCQlBcnJheUxpc3QgbDsKKwkJZm9yIChDbGFzcyBjbGF6eiA6IGFsbENsYXNzZXMpIHsKKwkJCUNsYXNzW10gaW50ZXJmYWNlcyA9IGNsYXp6LmdldEludGVyZmFjZXMoKTsKKwkJCWlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgY29sbGVjdCA9IEFycmF5cy5zdHJlYW0oaW50ZXJmYWNlcykubWFwKHAgLT4gcC5nZXROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCJcbiIpKTsKKworCQkJCUNsYXNzIG9yRWxzZSA9IEFycmF5cy5zdHJlYW0oaW50ZXJmYWNlcykuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpKQorCQkJCQkJLmZpbmRBbnkoKS5vckVsc2UobnVsbCk7CisJCQkJaWYgKG9yRWxzZSA9PSBudWxsKSB7CisJCQkJCWNsYXNzZXNXaXRob3V0U2VyaWFsemFibGUuYWRkKGNsYXp6KTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCisJCUxpc3Q8Q2xhc3M+IGNvbGxlY3QgPSBjbGFzc2VzV2l0aG91dFNlcmlhbHphYmxlLnN0cmVhbSgpCisJCQkJLmZpbHRlcihwIC0+IGZhbHNlID09IGNsYXNzZXN0b0lnbm9yZS5jb250YWlucyhwLmdldE5hbWUoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJaWYgKGNvbGxlY3QgIT0gbnVsbCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGNvbGxlY3Quc3RyZWFtKCkubWFwKHAgLT4gcC5nZXROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCJcbiIpKSk7CisJCQlhc3NlcnRFcXVhbHMoImNoZWNrIGFsbCBjbGFzc2VzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIiwgMCwgY29sbGVjdC5zaXplKCkpOworCQl9CisKKwl9CisKKwlwdWJsaWMgdm9pZCBmaW5kQWxsQ2xhc3Nlc1VzZWRCeVJlc291cmNlKENsYXNzIGNsYXp6LCBTZXQ8Q2xhc3M+IGFsbENsYXNzZXMpIHsKKworCQlDbGFzcyBzdXBlcmNsYXNzID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworCQlmaW5kQWxsQ2xhc3Nlc09mQ2xhc3MoY2xhenosIGFsbENsYXNzZXMpOworCisJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCWZpbmRBbGxDbGFzc2VzT2ZDbGFzcyhzdXBlcmNsYXNzLCBhbGxDbGFzc2VzKTsKKwkJfQorCisJfQorCisJcHVibGljIHZvaWQgZmluZEFsbENsYXNzZXNPZkNsYXNzKENsYXNzIGNsYXp6LCBTZXQ8Q2xhc3M+IGFsbENsYXNzZXMpIHsKKworCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7CisJCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQkJZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworCQkJCVN0cmluZyBuYW1lID0gZmllbGQuZ2V0TmFtZSgpOworCQkJCUNsYXNzIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7CisKKwkJCQlpZiAodHlwZS50b1N0cmluZygpLmNvbnRhaW5zKCIuTGlzdCIpKSB7CisJCQkJCVBhcmFtZXRlcml6ZWRUeXBlIHN0cmluZ0xpc3RUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBmaWVsZC5nZXRHZW5lcmljVHlwZSgpOworCQkJCQlDbGFzczw/PiBzdHJpbmdMaXN0Q2xhc3MgPSAoQ2xhc3M8Pz4pIHN0cmluZ0xpc3RUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cmluZ0xpc3RDbGFzcyk7IC8vIGNsYXNzCisJCQkJCS8vIGphdmEubGFuZy5TdHJpbmcuCisJCQkJCWFsbENsYXNzZXMuYWRkKHN0cmluZ0xpc3RDbGFzcyk7CisJCQkJfQorCisJCQkJaWYgKHR5cGUudG9TdHJpbmcoKS5jb250YWlucygiamF2YS51dGlsLk1hcCIpKSB7CisJCQkJCVBhcmFtZXRlcml6ZWRUeXBlIHN0cmluZ0xpc3RUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBmaWVsZC5nZXRHZW5lcmljVHlwZSgpOworCisJCQkJCVR5cGVbXSBhY3R1YWxUeXBlQXJndW1lbnRzID0gc3RyaW5nTGlzdFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOworCQkJCQlpZiAoYWN0dWFsVHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisJCQkJCQlmb3IgKFR5cGUgYWN0dWFsVHlwZSA6IGFjdHVhbFR5cGVBcmd1bWVudHMpIHsKKworCQkJCQkJCVN0cmluZyB0eXBlTmFtZSA9IGFjdHVhbFR5cGUuZ2V0VHlwZU5hbWUoKTsKKwkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZpZWxkICIgKyBuYW1lICsgIiwiICsKKwkJCQkJCQkvLyB0eXBlTmFtZSk7CisKKwkJCQkJCQlpZiAodHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YS51dGlsLkxpc3Q8IikpIHsKKwkJCQkJCQkJU3RyaW5nIGludGVybmFsQ2xhc3MgPSB0eXBlTmFtZS5yZXBsYWNlKCJqYXZhLnV0aWwuTGlzdDwiLCAiIikucmVwbGFjZSgiPiIsICIiKTsKKwkJCQkJCQkJLy8gY3JlYXRlIGNsYXNzIGZyb20gc3RyaW5nCisJCQkJCQkJCUNsYXNzIG15Q2xhc3M7CisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQlteUNsYXNzID0gQ2xhc3MuZm9yTmFtZShpbnRlcm5hbENsYXNzKTsKKwkJCQkJCQkJCWFsbENsYXNzZXMuYWRkKG15Q2xhc3MpOworCQkJCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY29udmVydCAiICsgaW50ZXJuYWxDbGFzcyArICIgdG8gY2xhc3MiLCBmYWxzZSk7CisJCQkJCQkJCX0KKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQlDbGFzcyBteUNsYXNzID0gQ2xhc3MuZm9yTmFtZSh0eXBlTmFtZSk7CisJCQkJCQkJCQlhbGxDbGFzc2VzLmFkZChteUNsYXNzKTsKKwkJCQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJCQkJYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNvbnZlcnQgIiArIHR5cGVOYW1lICsgIiB0byBjbGFzcyIsIGZhbHNlKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQl9CisKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odHlwZSk7CisJCQkJYWxsQ2xhc3Nlcy5hZGQodHlwZSk7CisJCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBhZGRJbnRlcm5hbFR5cGVPZkxpc3QoQ2xhc3MgY2xhenopIHsKKworCQkvLyBjbGF6ei4KKwkJLy8gUGFyYW1ldGVyaXplZFR5cGUgc3RyaW5nTGlzdFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpCisJCS8vIGZpZWxkLmdldEdlbmVyaWNUeXBlKCk7CisJCS8vIENsYXNzPD8+IHN0cmluZ0xpc3RDbGFzcyA9IChDbGFzczw/PikKKwkJLy8gc3RyaW5nTGlzdFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworCQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbihzdHJpbmdMaXN0Q2xhc3MpOyAvLyBjbGFzcyBqYXZhLmxhbmcuU3RyaW5nLgorCQkvLyBhbGxDbGFzc2VzLmFkZChzdHJpbmdMaXN0Q2xhc3MpOworCQkvLworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0NsYXNzSW1wbGVtZW50ZWRTZXJpYWxpemUoQ2xhc3MgY2xhenopIHsKKworCQlUeXBlW10gZ2VuZXJpY0ludGVyZmFjZXMgPSBjbGF6ei5nZXRHZW5lcmljSW50ZXJmYWNlcygpOworCQlpZiAoZ2VuZXJpY0ludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJVHlwZSBvckVsc2UgPSBBcnJheXMuc3RyZWFtKGdlbmVyaWNJbnRlcmZhY2VzKS5maWx0ZXIocCAtPiBwLmdldFR5cGVOYW1lKCkuZXF1YWxzKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpKQorCQkJCQkuZmluZEFueSgpLm9yRWxzZShudWxsKTsKKwkJCWlmIChvckVsc2UgIT0gbnVsbCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIEBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlc291cmNlU2VyaWFsaXplKCkgeworCisJCVJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7CisJCVN0cmluZyBuYW1lID0gInJlczEiOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbFZlcnNpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWFsbFZlcnNpb25zLnB1dCgia2V5YSIsICJ2YWx1ZWEiKTsKKworCQlyZXNvdXJjZS5zZXROYW1lKG5hbWUpOworCQkvLyBhbGwgdmVyc2lvbnMKKwkJcmVzb3VyY2Uuc2V0QWxsVmVyc2lvbnMoYWxsVmVyc2lvbnMpOworCQlMaXN0PENvbXBvbmVudEluc3RhbmNlPiByZXNvdXJjZUluc3RhbmNlcyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5zdGFuY2U+KCk7CisJCS8vIGNvbXBvbmVudCBpbnN0YW5jZXMKKwkJQ29tcG9uZW50SW5zdGFuY2UgY29tcG9uZW50SW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50SW5zdGFuY2UoKTsKKwkJY29tcG9uZW50SW5zdGFuY2Uuc2V0RGVzY3JpcHRpb24oImRlc2MxIik7CisJCWNvbXBvbmVudEluc3RhbmNlLnNldENvbXBvbmVudFVpZCgiY29tVWlkIik7CisJCXJlc291cmNlSW5zdGFuY2VzLmFkZChjb21wb25lbnRJbnN0YW5jZSk7CisKKwkJcmVzb3VyY2Uuc2V0Q29tcG9uZW50SW5zdGFuY2VzKHJlc291cmNlSW5zdGFuY2VzKTsKKworCQlFaXRoZXI8Ynl0ZVtdLCBCb29sZWFuPiBzZXJpYWxpemUgPSBTZXJpYWxpemF0aW9uVXRpbHMuc2VyaWFsaXplKHJlc291cmNlKTsKKwkJYXNzZXJ0VHJ1ZSgiY2hlY2sgb2JqZWN0IHNlcmlhbGl6ZWQiLCBzZXJpYWxpemUuaXNMZWZ0KCkpOworCQlieXRlW10gdmFsdWUgPSBzZXJpYWxpemUubGVmdCgpLnZhbHVlKCk7CisKKwkJRWl0aGVyPE9iamVjdCwgQm9vbGVhbj4gZGVzZXJpYWxpemUgPSBTZXJpYWxpemF0aW9uVXRpbHMuZGVzZXJpYWxpemUodmFsdWUpOworCQlhc3NlcnRUcnVlKCJjaGVjayBvYmplY3QgZGVzZXJpYWxpemVkIiwgZGVzZXJpYWxpemUuaXNMZWZ0KCkpOworCQlPYmplY3Qgb2JqID0gZGVzZXJpYWxpemUubGVmdCgpLnZhbHVlKCk7CisJCVJlc291cmNlIGRlc1Jlc291cmNlID0gKFJlc291cmNlKSBvYmo7CisJCWFzc2VydEVxdWFscygiY2hlY2sgbmFtZSIsIG5hbWUsIGRlc1Jlc291cmNlLmdldE5hbWUoKSk7CisJCXZlcmlmeUFsbFZlcnNpb25zKGRlc1Jlc291cmNlKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlBbGxWZXJzaW9ucyhSZXNvdXJjZSBkZXNSZXNvdXJjZSkgeworCQlhc3NlcnROb3ROdWxsKCJjaGVjayBhbGwgdmVyc2lvbnMiLCBkZXNSZXNvdXJjZS5nZXRBbGxWZXJzaW9ucygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaGVjayBhbGwgdmVyc2lvbiBzaXplIiwgMSwgZGVzUmVzb3VyY2UuZ2V0QWxsVmVyc2lvbnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoImNoZWNrIGFsbCB2ZXJzaW9uIGtleSIsICJrZXlhIiwgZGVzUmVzb3VyY2UuZ2V0QWxsVmVyc2lvbnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiY2hlY2sgYWxsIHZlcnNpb24gdmFsdWUiLCAidmFsdWVhIiwgZGVzUmVzb3VyY2UuZ2V0QWxsVmVyc2lvbnMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vZGVsL3Rvc2NhL3ZhbGlkYXRvcnMvSW50ZWdlclZhbGlkYXRvclRlc3QuamF2YSBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0ludGVnZXJWYWxpZGF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmZTlhOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9tb2RlbC90b3NjYS92YWxpZGF0b3JzL0ludGVnZXJWYWxpZGF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLnRvc2NhLnZhbGlkYXRvcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwudG9zY2EudmFsaWRhdG9ycy5JbnRlZ2VyVmFsaWRhdG9yOworCitwdWJsaWMgY2xhc3MgSW50ZWdlclZhbGlkYXRvclRlc3QgeworCXByaXZhdGUgc3RhdGljIEludGVnZXJWYWxpZGF0b3IgdmFsaWRhdG9yID0gSW50ZWdlclZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlclZhbGlkYXRvckRlY2ltYWwoKSB7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQobnVsbCwgbnVsbCkpOworCQlhc3NlcnRUcnVlKHZhbGlkYXRvci5pc1ZhbGlkKCIiLCBudWxsKSk7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoIjAiLCBudWxsKSk7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoIiswIiwgbnVsbCkpOworCQlhc3NlcnRUcnVlKHZhbGlkYXRvci5pc1ZhbGlkKCItMCIsIG51bGwpKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IuaXNWYWxpZCgiKzY1NDY1IiwgbnVsbCkpOworCQlhc3NlcnRUcnVlKHZhbGlkYXRvci5pc1ZhbGlkKCItNjU0NjUiLCBudWxsKSk7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoIjIxNDc0ODM2NDciLCBudWxsKSk7CisJCWFzc2VydEZhbHNlKHZhbGlkYXRvci5pc1ZhbGlkKCIyMTQ3NDgzNjQ4IiwgbnVsbCkpOworCQlhc3NlcnRUcnVlKHZhbGlkYXRvci5pc1ZhbGlkKCItMjE0NzQ4MzY0OCIsIG51bGwpKTsKKwkJYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQoIi0yMTQ3NDgzNjQ5IiwgbnVsbCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludGVnZXJWYWxpZGF0b3JIZXhhKCkgeworCQlhc3NlcnRUcnVlKHZhbGlkYXRvci5pc1ZhbGlkKCItMHhhZGMiLCBudWxsKSk7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoIisweGFkZiIsIG51bGwpKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IuaXNWYWxpZCgiMHg3RkZGRkZGRiIsIG51bGwpKTsKKwkJYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQoIjB4ODAwMDAwMDAiLCBudWxsKSk7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoIi0weDgwMDAwMDAwIiwgbnVsbCkpOworCQlhc3NlcnRGYWxzZSh2YWxpZGF0b3IuaXNWYWxpZCgiLTB4ODAwMDAwMDEiLCBudWxsKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEludGVnZXJWYWxpZGF0b3JPY3RhbCgpIHsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IuaXNWYWxpZCgiMG81NDU0MzUiLCBudWxsKSk7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoIi0wbzU0NTQzNSIsIG51bGwpKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IuaXNWYWxpZCgiMG8xNzc3Nzc3Nzc3NyIsIG51bGwpKTsKKwkJYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQoIjBvMjAwMDAwMDAwMDAiLCBudWxsKSk7CisJCWFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoIi0wbzIwMDAwMDAwMDAwIiwgbnVsbCkpOworCQlhc3NlcnRGYWxzZSh2YWxpZGF0b3IuaXNWYWxpZCgiLTBvMjAwMDAwMDAwMDEiLCBudWxsKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlclZhbGlkYXRvckluY29ycmVjdCgpIHsKKwkJYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQoIi0yLjE0NzQ4MzY0OSIsIG51bGwpKTsKKwkJYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQoImRzZmFzZjM0MjM0MiIsIG51bGwpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L3Jlc291cmNlcy9hcHBsaWNhdGlvbi1jb250ZXh0LXRlc3QueG1sIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9yZXNvdXJjZXMvYXBwbGljYXRpb24tY29udGV4dC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Y0YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9yZXNvdXJjZXMvYXBwbGljYXRpb24tY29udGV4dC10ZXN0LnhtbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpjb250ZXh0PSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2NvbnRleHQiCisJeG1sbnM6dXRpbD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0zLjAueHNkCisgICAgICAgICAgIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dCBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2NvbnRleHQvc3ByaW5nLWNvbnRleHQtMy4wLnhzZAorICAgICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL3V0aWwgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS91dGlsL3NwcmluZy11dGlsLTMuMC54c2QiPgorICAgICAgICAgICAKKworICA8Y29udGV4dDpjb21wb25lbnQtc2NhbgorICAgIGJhc2UtcGFja2FnZT0ib3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwub3BlcmF0aW9ucy5pbXBsLAorICAgIAlvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5jYWNoZSwKKwkJb3JnLm9wZW5lY29tcC5zZGMuYmUuZGFvLnRpdGFuLAorCQlvcmcub3BlbmVjb21wLnNkYy5iZS5kYW8uY2Fzc2FuZHJhIj4KKyAgIAorICA8L2NvbnRleHQ6Y29tcG9uZW50LXNjYW4+CisKKzwvYmVhbnM+CmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvZWNvbXAtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2Vjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODYzOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2Vjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDMwOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3RlIHRoZSBjb252ZW50aW9ucyBvZiB0aGUgZmllbGQgdmFsdWVzOgorIyB0eXBlIGNhbiBiZSBvbmUgb2Y6IENPTkZJR19FUlJPUiwgU1lTVEVNX0VSUk9SLCBEQVRBX0VSUk9SLCBDT05ORUNUSU9OX1BST0JMRU0sIEFVVEhFTlRJQ0FUSU9OX1BST0JMRU0KKyMgc2V2ZXJpdHkgY2FuIGJlIG9uZSBvZjogV0FSTiwgRVJST1IsIEZBVEFMCisjIGFsYXJtU2V2ZXJpdHkgY2FuIGJlIG9uZSBvZjogQ1JJVElDQUwsTUFKT1IsTUlOT1IsSU5GT1JNQVRJT05BTCxOT05FCisjIGNvZGUgaXMgYSB1bmlxdWUgaW50ZWdlciBpbiByYW5nZSBvZiAzMDAzLTk5OTkgKDMwMDAtMzAwMiBhcmUgb2NjdXBpZWQgZm9yIGludGVybmFsIHVzYWdlKQorIyBUaGUgYWJvdmUgZW51bWVyYXRpb24gdmFsdWVzIGFyZSBvdXQtb2YtdGhlLWJveCBhbmQgY2FuIGJlIGNoYW5nZWQgaW4gY29kZS4gCisjIEluIGNhc2Ugb2YgY29uZmlnIGFuZCBjb2RlIG1pc21hdGNoLCB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igd2lsbCBiZSBwcmludGVkIHRvIGxvZworIworIyMgUmFuZ2Ugb2YgQkUgY29kZXMgLSAzMDEwLTc5OTkKKworZXJyb3JzOgorCisgICAgQmVSZXN0QXBpR2VuZXJhbEVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDAwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgQkUgUkVTVCBBUEkgZXhlY3V0aW9uIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisKKyAgICBCZUhlYWx0aENoZWNrRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTAsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIGR1cmluZyBCRSBIZWFsdGggQ2hlY2siLAorICAgICAgICBhbGFybVNldmVyaXR5OiBJTkZPUk1BVElPTkFMCisgICAgfQorICAgIAorICAgIEJlSW5pdGlhbGl6YXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNhdGFsb2ctQkUgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorCisgICAgQmVSZXNvdXJjZU1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIk1hbmRhdG9yeSByZXNvdXJjZSAlcyBjYW5ub3QgYmUgZm91bmQgaW4gcmVwb3NpdG9yeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlU2VydmljZU1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIk1hbmRhdG9yeSBzZXJ2aWNlICVzIGNhbm5vdCBiZSBmb3VuZCBpbiByZXBvc2l0b3J5IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRBZGRpbmdSZXNvdXJjZUluc3RhbmNlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTMsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gYWRkIHJlc291cmNlIGluc3RhbmNlIG9mIHJlc291cmNlICVzIHRvIHNlcnZpY2UgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUluY29ycmVjdFNlcnZpY2VFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIlNlcnZpY2UgJXMgaXMgbm90IHZhbGlkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgIAorICAgIEJlUmVwb3NpdG9yeURlbGV0ZUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDE1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGRlbGV0ZSBvYmplY3QgJXMgZnJvbSByZXBvc2l0b3J5IiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVSZXBvc2l0b3J5UXVlcnlFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxNiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBmZXRjaCBmcm9tIHJlcG9zaXRvcnkgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUludmFsaWRDb25maWd1cmF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09ORklHX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTcsCisgICAgICAgIHNldmVyaXR5OiBGQVRBTCwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlciAlcyBpcyBpbnZhbGlkLiBWYWx1ZSBjb25maWd1cmVkIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAKKyAgICBCZVVlYkNvbm5lY3Rpb25FcnJvcjogeworICAgICAgICB0eXBlOiBDT05ORUNUSU9OX1BST0JMRU0sCisgICAgICAgIGNvZGU6IEFTRENfNDAwMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbm5lY3Rpb24gcHJvYmxlbSB0b3dhcmRzIFUtRUIgc2VydmVyLiBSZWFzb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVZWJTeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIG9jY3VyZWQgZHVyaW5nIGFjY2VzcyB0byBVLUVCIFNlcnZlci4gT3BlcmF0aW9uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVWViT2JqZWN0Tm90Rm91bmRFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDUsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBvY2N1cmVkIGR1cmluZyBhY2Nlc3MgdG8gVS1FQiBTZXJ2ZXIuIERhdGEgbm90IGZvdW5kOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorCisgICAgQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAyMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIG9jY3VyZWQgaW4gRGlzdHJpYnV0aW9uIEVuZ2luZS4gRmFpbGVkIG9wZXJhdGlvbjogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVlYkF1dGhlbnRpY2F0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQVVUSEVOVElDQVRJT05fUFJPQkxFTSwKKyAgICAgICAgY29kZTogQVNEQ180MDAzLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQXV0aGVudGljYXRpb24gcHJvYmxlbSB0b3dhcmRzIFUtRUIgc2VydmVyLiBSZWFzb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVZWJVbmtvd25Ib3N0RXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09OTkVDVElPTl9QUk9CTEVNLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25uZWN0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gQ2Fubm90IHJlYWNoIGhvc3QgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVlYkNvbm5lY3Rpb25FcnJvcjogeworICAgICAgICB0eXBlOiBDT05ORUNUSU9OX1BST0JMRU0sCisgICAgICAgIGNvZGU6IEFTRENfNDAwNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbm5lY3Rpb24gcHJvYmxlbSB0b3dhcmRzIFUtRUIgc2VydmVyLiIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRGlzdHJpYnV0aW9uRW5naW5lSW52YWxpZEFydGlmYWN0VHlwZTogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDYsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSBhcnRpZmFjdCB0eXBlICVzIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgbGlzdCBvZiB2YWxpZCBhcnRpZmFjdHMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUludmFsaWRUeXBlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDA4LAorICAgICAgICBzZXZlcml0eTogV0FSTiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJUaGUgdHlwZSAlcyBvZiAlcyBpcyBpbnZhbGlkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgQmVJbnZhbGlkVmFsdWVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMjgsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSB2YWx1ZSAlcyBvZiAlcyBmcm9tIHR5cGUgJXMgaXMgaW52YWxpZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfSAKKyAgICAKKyAgICBCZUZhaWxlZERlbGV0aW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDI5LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGRlbGV0ZSByZXNvdXJjZSBpbnN0YW5jZSAlcyBmcm9tIHNlcnZpY2UgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZU1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09ORklHX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMzAsCisgICAgICAgIHNldmVyaXR5OiBGQVRBTCwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlciAlcyBpcyBtaXNzaW5nIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVDb25maWd1cmF0aW9uSW52YWxpZExpc3RTaXplRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09ORklHX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMzEsCisgICAgICAgIHNldmVyaXR5OiBGQVRBTCwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlciAlcyBpcyBpbnZhbGlkLiBBdCBsZWFzdCAlcyB2YWx1ZXMgc2hhbGwgYmUgY29uZmlndXJlZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEVycm9yQ29uZmlnRmlsZUZvcm1hdDogeworICAgICAgICB0eXBlOiBDT05GSUdfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAzMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIGVsZW1lbnQgbm90IGZvdW5kIGluIFlBTUwgbmFtZTogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZU1pc3NpbmdBcnRpZmFjdEluZm9ybWF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDEwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQXJ0aWZhY3QgdXBsb2FkZWQgaGFzIG1pc3NpbmcgaW5mb3JtYXRpb24uIE1pc3NpbmcgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUFydGlmYWN0TWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkFydGlmYWN0ICVzIHJlcXVlc3RlZCBpcyBub3QgZm91bmQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUFydGlmYWN0UGF5bG9hZEludmFsaWQ6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDEyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiUGF5bG9hZCBvZiBhcnRpZmFjdCB1cGxvYWRlZCBpcyBpbnZhbGlkIChpbnZhbGlkIE1ENSBvciBlbmNyeXB0aW9uKSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVXNlck1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJVc2VyICVzIHJlcXVlc3RlZCBpcyBub3QgZm91bmQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUFydGlmYWN0SW5mb3JtYXRpb25JbnZhbGlkRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDEzLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiSW5wdXQgZm9yIGFydGlmYWN0IG1ldGFkYXRhIGlzIGludmFsaWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUZhaWxlZEFkZGluZ0NhcGFiaWxpdHlUeXBlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIGFkZGluZyBjYXBhYmlsaXR5IHR5cGUiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUNhcGFiaWxpdHlUeXBlTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxNiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNhcGFiaWxpdHkgVHlwZSAlcyBub3QgZm91bmQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUludGVyZmFjZU1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMjAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJJbnRlcmZhY2UgJXMgcmVxdWlyZWQgaXMgbWlzc2luZyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRGFvU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTQsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJPcGVyYXRpb24gdG93YXJkcyBkYXRhYmFzZSBmYWlsZWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZVN5c3RlbUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE3LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgb3BlcmF0aW9uIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDcsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBsb2NrIG9iamVjdCBmb3IgdXBkYXRlIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgCisgICAgQmVJbnZhbGlkSnNvbklucHV0OiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE4LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGNvbnZlcnQganNvbiBpbnB1dCB0byBvYmplY3QiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZURpc3RyaWJ1dGlvbk1pc3NpbmdFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMjEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJEaXN0cmlidXRpb24gJXMgcmVxdWlyZWQgaXMgbWlzc2luZyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIAorICAgICMgbGFzdCBlcnJvciBjb2RlOiBBU0RDXzQwMjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLW1vZGVsL3NyYy90ZXN0L3Jlc291cmNlcy9sb2diYWNrLXRlc3QueG1sIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nYmFjay10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI5YmZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy1tb2RlbC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nYmFjay10ZXN0LnhtbApAQCAtMCwwICsxLDEzIEBACis8IS0tIG9ubHkgb25lIGxpbmUsIHNodXQgdXAgbG9nYmFjayAhIC0tPgorPGNvbmZpZ3VyYXRpb24+CisgICAgPGFwcGVuZGVyIG5hbWU9IlNURE9VVCIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICA8UGF0dGVybj4KKyAgICAgICAgICAgICAgICAlZHt5eXl5LU1NLWRkIEhIOm1tOnNzfSBbJXRocmVhZF0gJS01bGV2ZWwgJWxvZ2dlcnszNn0gLSAlbXNnJW4KKyAgICAgICAgICAgIDwvUGF0dGVybj4KKyAgICAgICAgPC9lbmNvZGVyPgorICAgIDwvYXBwZW5kZXI+CisgICAgPHJvb3QgbGV2ZWw9Ik9GRiI+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTVERPVVQiIC8+CisgICAgPC9yb290PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvR3J1bnRmaWxlLmpzIGIvY2F0YWxvZy11aS9HcnVudGZpbGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5ZDgzMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvR3J1bnRmaWxlLmpzCkBAIC0wLDAgKzEsODA3IEBACisvLyBHZW5lcmF0ZWQgb24gMjAxNS0wNC0yOCB1c2luZworLy8gZ2VuZXJhdG9yLXdlYmFwcCAwLjUuMQorJ3VzZSBzdHJpY3QnOworCisvLyAjIEdsb2JiaW5nCisvLyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSdyZSBvbmx5IG1hdGNoaW5nIG9uZSBsZXZlbCBkb3duOgorLy8gJ3Rlc3Qvc3BlYy97LCovfSouanMnCisvLyBJZiB5b3Ugd2FudCB0byByZWN1cnNpdmVseSBtYXRjaCBhbGwgc3ViZm9sZGVycywgdXNlOgorLy8gJ3Rlc3Qvc3BlYy8qKi8qLmpzJworCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChncnVudCkgeworCisgICAgLy8gVGltZSBob3cgbG9uZyB0YXNrcyB0YWtlLiBDYW4gaGVscCB3aGVuIG9wdGltaXppbmcgYnVpbGQgdGltZXMKKyAgICByZXF1aXJlKCd0aW1lLWdydW50JykoZ3J1bnQpOworCisgICAgLy8gTG9hZCBncnVudCB0YXNrcyBhdXRvbWF0aWNhbGx5CisgICAgcmVxdWlyZSgnbG9hZC1ncnVudC10YXNrcycpKGdydW50KTsKKworICAgIC8vIENvbmZpZ3VyYWJsZSBwYXRocworICAgIHZhciBjb25maWcgPSB7CisgICAgICAgIGFwcDogJ2FwcCcsCisgICAgICAgIGFwcE1vZHVsZU5hbWU6ICdzZGNBcHAnLAorICAgICAgICBkaXN0OiAnYXBwL2Rpc3QnCisgICAgfTsKKworICAgIC8vIERlZmluZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWxsIHRoZSB0YXNrcworICAgIGdydW50LmluaXRDb25maWcoeworCisgICAgICAgIC8vIFByb2plY3Qgc2V0dGluZ3MKKyAgICAgICAgY29uZmlnOiBjb25maWcsCisKKyAgICAgICAgLy8gV2F0Y2hlcyBmaWxlcyBmb3IgY2hhbmdlcyBhbmQgcnVucyB0YXNrcyBiYXNlZCBvbiB0aGUgY2hhbmdlZCBmaWxlcworICAgICAgICB3YXRjaDogeworICAgICAgICAgICAgaHRtbDogeworICAgICAgICAgICAgICAgIGZpbGVzOiBbJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvKiovKi5odG1sJ10sCisgICAgICAgICAgICAgICAgdGFza3M6IFsnbmd0ZW1wbGF0ZXM6YXBwJ10KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBsZXNzOiB7CisgICAgICAgICAgICAgICAgZmlsZXM6IFsnPCU9IGNvbmZpZy5hcHAgJT4vKiovKi5sZXNzJ10sCisgICAgICAgICAgICAgICAgdGFza3M6IFsnbGVzczphbGwnXQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHRzOiB7CisgICAgICAgICAgICAgICAgZmlsZXM6IFsnPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy8qKi8qLnRzJ10sCisgICAgICAgICAgICAgICAgdGFza3M6IFsndHM6YWxsJ10KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBib3dlcjogeworICAgICAgICAgICAgICAgIGZpbGVzOiBbJ2Jvd2VyLmpzb24nXSwKKyAgICAgICAgICAgICAgICB0YXNrczogWyd3aXJlZGVwJ10KKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGdydW50ZmlsZTogeworICAgICAgICAgICAgICAgIGZpbGVzOiBbJ0dydW50ZmlsZS5qcyddCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBsaXZlcmVsb2FkOiB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgICAgICBsaXZlcmVsb2FkOiAnPCU9IGNvbm5lY3Qub3B0aW9ucy5saXZlcmVsb2FkICU+JworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZmlsZXM6IFsKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3ssKi99Ki5odG1sJywKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvKiovKi5odG1sJywKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvKiovKi5jc3MnLAorICAgICAgICAgICAgICAgICAgICAnLnRtcC9zdHlsZXMveywqL30qLmNzcycsCisgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9pbWFnZXMveywqL30qJworICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBjb25maWd1cmF0aW9uczogeworICAgICAgICAgICAgICAgIGZpbGVzOiBbCisgICAgICAgICAgICAgICAgICAgICdjb25maWd1cmF0aW9ucy8qLmpzb24nCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICB0YXNrczogWyduZ2NvbnN0YW50J10KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBuZ2NvbnN0YW50OiB7CisgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgZGVzdDogJ2FwcC9zY3JpcHRzL21vZHVsZXMvY29uZmlndXJhdGlvbnMuanMnLAorICAgICAgICAgICAgICAgIG5hbWU6ICdTZGMuQ29uZmlnJworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG1haW46IHsKKyAgICAgICAgICAgICAgICBjb25zdGFudHM6IHsKKyAgICAgICAgICAgICAgICAgICAgc2RjQ29uZmlnOiBncnVudC5maWxlLnJlYWRKU09OKGdydW50Lm9wdGlvbignZW52JykgPyAnY29uZmlndXJhdGlvbnMvJyArIGdydW50Lm9wdGlvbignZW52JykgKyAnLmpzb24nIDogJ2NvbmZpZ3VyYXRpb25zL3Byb2QuanNvbicpLAorICAgICAgICAgICAgICAgICAgICBzZGNNZW51OiBncnVudC5maWxlLnJlYWRKU09OKCdjb25maWd1cmF0aW9ucy9tZW51Lmpzb24nKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBleHByZXNzOiB7CisgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgcG9ydDogcHJvY2Vzcy5lbnYuUE9SVCB8fCA5MDAwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbW9jazogeworICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiAnc2VydmVyLW1vY2svbW9jay1zZXJ2ZXIuanMnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIHRzOiB7CisgICAgICAgICAgICBhbGw6IHsKKyAgICAgICAgICAgICAgICBzcmM6IFsKKyAgICAgICAgICAgICAgICAgICAgJ2FwcC9zY3JpcHRzLyoqLyoudHMnLAorICAgICAgICAgICAgICAgICAgICAndHlwaW5ncy8qKi8qLnRzJworICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgcmVmZXJlbmNlOiAnYXBwL3NjcmlwdHMvcmVmZXJlbmNlcy50cycKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzaW5nbGU6IHsKKyAgICAgICAgICAgICAgICBzcmM6IFtdCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ndGVtcGxhdGVzOiB7CisgICAgICAgICAgICBhcHA6IHsKKyAgICAgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZTogJzwlPSBjb25maWcuYXBwTW9kdWxlTmFtZSAlPicsCisgICAgICAgICAgICAgICAgICAgIHByZWZpeDogJy8nCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBzcmM6IFsKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvKiovKi5odG1sJywKKyAgICAgICAgICAgICAgICAgICAgJyFpbmRleC5odG1sJworICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgZGVzdDogJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvdGVtcGxhdGVzLmpzJworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBsZXNzOiB7CisgICAgICAgICAgICBhbGw6IHsKKyAgICAgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzOiBbJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3N0eWxlcyddCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBmaWxlczogeworICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5hcHAgJT4vc3R5bGVzL2FwcC5jc3MnOiAnPCU9IGNvbmZpZy5hcHAgJT4vc3R5bGVzL2FwcC5sZXNzJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzaW5nbGU6IHsKKyAgICAgICAgICAgICAgICBwYXRoczogWyc8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzJywKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3N0eWxlcyddLAorICAgICAgICAgICAgICAgIGZpbGVzOiBbXQorICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIGluamVjdG9yOiB7CisgICAgICAgICAgICBvcHRpb25zOiB7fSwKKyAgICAgICAgICAgIC8vIEluamVjdCBhcHBsaWNhdGlvbiBzY3JpcHQgZmlsZXMgaW50byBpbmRleC5odG1sIChkb2Vzbid0IGluY2x1ZGUgYm93ZXIpCisgICAgICAgICAgICBzY3JpcHRzX21vZGVsczogeworICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZmlsZVBhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgnL2FwcC8nLCAnJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxzY3JpcHQgc3JjPSInICsgZmlsZVBhdGggKyAnIj48L3NjcmlwdD4nOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBzdGFydHRhZzogJzwhLS0gaW5qZWN0b3I6anNfbW9kZWxzIC0tPicsCisgICAgICAgICAgICAgICAgICAgIGVuZHRhZzogJzwhLS0gZW5kaW5qZWN0b3I6anNfbW9kZWxzIC0tPicKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9pbmRleC5odG1sJzogWworICAgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzL21vZGVscy8qKi8qLmpzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnITwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvbW9kZWxzLyoqLyotdGVzdHMuanMnCisgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBzY3JpcHRzX3V0aWxzOiB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIChmaWxlUGF0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKCcvYXBwLycsICcnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHNjcmlwdCBzcmM9IicgKyBmaWxlUGF0aCArICciPjwvc2NyaXB0Pic7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0dGFnOiAnPCEtLSBpbmplY3Rvcjpqc191dGlscyAtLT4nLAorICAgICAgICAgICAgICAgICAgICBlbmR0YWc6ICc8IS0tIGVuZGluamVjdG9yOmpzX3V0aWxzIC0tPicKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9pbmRleC5odG1sJzogWworICAgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzL3V0aWxzLyoqLyouanMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICchPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy9tb2RlbHMvKiovKi10ZXN0cy5qcycKKyAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHNjcmlwdHNfZmlsdGVyczogeworICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZmlsZVBhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgnL2FwcC8nLCAnJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxzY3JpcHQgc3JjPSInICsgZmlsZVBhdGggKyAnIj48L3NjcmlwdD4nOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBzdGFydHRhZzogJzwhLS0gaW5qZWN0b3I6anNfZmlsdGVycyAtLT4nLAorICAgICAgICAgICAgICAgICAgICBlbmR0YWc6ICc8IS0tIGVuZGluamVjdG9yOmpzX2ZpbHRlcnMgLS0+JworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZmlsZXM6IHsKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L2luZGV4Lmh0bWwnOiBbCisgICAgICAgICAgICAgICAgICAgICAgICBbJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvZmlsdGVycy8qKi8qLmpzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnITwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvZmlsdGVycy8qKi8qLXRlc3RzLmpzJworICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgc2NyaXB0c19kaXJlY3RpdmVzOiB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIChmaWxlUGF0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKCcvYXBwLycsICcnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHNjcmlwdCBzcmM9IicgKyBmaWxlUGF0aCArICciPjwvc2NyaXB0Pic7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0dGFnOiAnPCEtLSBpbmplY3Rvcjpqc19kaXJlY3RpdmVzIC0tPicsCisgICAgICAgICAgICAgICAgICAgIGVuZHRhZzogJzwhLS0gZW5kaW5qZWN0b3I6anNfZGlyZWN0aXZlcyAtLT4nCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBmaWxlczogeworICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5hcHAgJT4vaW5kZXguaHRtbCc6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy9kaXJlY3RpdmVzLyoqLyouanMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICchPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy9kaXJlY3RpdmVzLyoqLyotdGVzdHMuanMnCisgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBzY3JpcHRzX3NlcnZpY2VzOiB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIChmaWxlUGF0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKCcvYXBwLycsICcnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHNjcmlwdCBzcmM9IicgKyBmaWxlUGF0aCArICciPjwvc2NyaXB0Pic7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0dGFnOiAnPCEtLSBpbmplY3Rvcjpqc19zZXJ2aWNlcyAtLT4nLAorICAgICAgICAgICAgICAgICAgICBlbmR0YWc6ICc8IS0tIGVuZGluamVjdG9yOmpzX3NlcnZpY2VzIC0tPicKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9pbmRleC5odG1sJzogWworICAgICAgICAgICAgICAgICAgICAgICAgWyc8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzL3NlcnZpY2VzLyoqLyouanMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICchPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy9zZXJ2aWNlcy8qKi8qLXRlc3RzLmpzJworICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgc2NyaXB0c192aWV3X21vZGVsczogeworICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZmlsZVBhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgnL2FwcC8nLCAnJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxzY3JpcHQgc3JjPSInICsgZmlsZVBhdGggKyAnIj48L3NjcmlwdD4nOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBzdGFydHRhZzogJzwhLS0gaW5qZWN0b3I6anNfdmlld19tb2RlbHMgLS0+JywKKyAgICAgICAgICAgICAgICAgICAgZW5kdGFnOiAnPCEtLSBlbmRpbmplY3Rvcjpqc192aWV3X21vZGVscyAtLT4nCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBmaWxlczogeworICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5hcHAgJT4vaW5kZXguaHRtbCc6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy92aWV3LW1vZGVscy8qKi8qLmpzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnITwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvdmlldy1tb2RlbHMvKiovKi10ZXN0cy5qcyddCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBJbmplY3QgY29tcG9uZW50IGxlc3MgaW50byBhcHAubGVzcworICAgICAgICAgICAgbGVzczogeworICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZmlsZVBhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgnL2FwcC9zY3JpcHRzLycsICcuLi9zY3JpcHRzLycpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKCcvYXBwL3N0eWxlcy8nLCAnJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0BpbXBvcnQgXCcnICsgZmlsZVBhdGggKyAnXCc7JzsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnR0YWc6ICcvLyBpbmplY3RvcjpsZXNzJywKKyAgICAgICAgICAgICAgICAgICAgZW5kdGFnOiAnLy8gZW5kaW5qZWN0b3I6bGVzcycKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9zdHlsZXMvYXBwLmxlc3MnOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5hcHAgJT4vc3R5bGVzLyoqLyoubGVzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy8qKi8qLmxlc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgJyE8JT0gY29uZmlnLmFwcCAlPi9zdHlsZXMvYXBwLmxlc3MnCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBJbmplY3QgY29tcG9uZW50IGNzcyBpbnRvIGluZGV4Lmh0bWwKKyAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZmlsZVBhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSgnL2FwcC8nLCAnJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoJy8udG1wLycsICcnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInICsgZmlsZVBhdGggKyAnIj4nOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBzdGFydHRhZzogJzwhLS0gaW5qZWN0b3I6Y3NzIC0tPicsCisgICAgICAgICAgICAgICAgICAgIGVuZHRhZzogJzwhLS0gZW5kaW5qZWN0b3IgLS0+JworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZmlsZXM6IHsKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L2luZGV4Lmh0bWwnOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5hcHAgJT4vc2NyaXB0cy8qKi8qLmNzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5hcHAgJT4vc3R5bGVzLyoqLyouY3NzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICchPCU9IGNvbmZpZy5hcHAgJT4vc3R5bGVzL2FwcC5jc3MnCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gVGhlIGFjdHVhbCBncnVudCBzZXJ2ZXIgc2V0dGluZ3MKKyAgICAgICAgY29ubmVjdDogeworICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgIHBvcnQ6IDkwMDAsCisgICAgICAgICAgICAgICAgb3BlbjogdHJ1ZSwKKyAgICAgICAgICAgICAgICBsaXZlcmVsb2FkOiAzNTcyOSwKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgdGhpcyB0byAnMC4wLjAuMCcgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIgZnJvbSBvdXRzaWRlCisgICAgICAgICAgICAgICAgaG9zdG5hbWU6ICdsb2NhbGhvc3QnCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbGl2ZXJlbG9hZDogeworICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgbWlkZGxld2FyZTogZnVuY3Rpb24gKGNvbm5lY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCgpLnVzZShmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vY2tBcGlzID0gcmVxdWlyZSgnLi9jb25maWd1cmF0aW9ucy9tb2NrLmpzb24nKS5zZGNDb25maWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChncnVudC5vcHRpb24oJ3JvbGUnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiYWRtaW4iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJUeXBlID0gbW9ja0FwaXMudXNlclR5cGVzLmFkbWluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidGVzdGVyIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyVHlwZSA9IG1vY2tBcGlzLnVzZXJUeXBlcy50ZXN0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJnb3Zlcm5vciI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlclR5cGUgPSBtb2NrQXBpcy51c2VyVHlwZXMuZ292ZXJub3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJvcHMiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJUeXBlID0gbW9ja0FwaXMudXNlclR5cGVzLm9wczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlc2lnbmVyIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyVHlwZSA9IG1vY2tBcGlzLnVzZXJUeXBlcy5kZXNpZ25lcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInByb2R1Y3Rfc3RyYXRlZ2lzdCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlclR5cGUgPSBtb2NrQXBpcy51c2VyVHlwZXMucHJvZHVjdF9zdHJhdGVnaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicHJvZHVjdF9tYW5hZ2VyIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyVHlwZSA9IG1vY2tBcGlzLnVzZXJUeXBlcy5wcm9kdWN0X21hbmFnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJUeXBlID0gbW9ja0FwaXMudXNlclR5cGVzLmRlc2lnbmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jb29raWUobW9ja0FwaXMuY29va2llLnVzZXJJZFN1ZmZpeCwgcmVxLmhlYWRlcnNbbW9ja0FwaXMuY29va2llLnVzZXJJZFN1ZmZpeF0gfHwgdXNlclR5cGUudXNlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNvb2tpZShtb2NrQXBpcy5jb29raWUudXNlckVtYWlsLCByZXEuaGVhZGVyc1ttb2NrQXBpcy5jb29raWUudXNlckVtYWlsXSB8fCB1c2VyVHlwZS5lbWFpbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jb29raWUobW9ja0FwaXMuY29va2llLnVzZXJGaXJzdE5hbWUsIHJlcS5oZWFkZXJzW21vY2tBcGlzLmNvb2tpZS51c2VyRmlyc3ROYW1lXSB8fCB1c2VyVHlwZS5maXJzdE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY29va2llKG1vY2tBcGlzLmNvb2tpZS51c2VyTGFzdE5hbWUsIHJlcS5oZWFkZXJzW21vY2tBcGlzLmNvb2tpZS51c2VyTGFzdE5hbWVdIHx8IHVzZXJUeXBlLmxhc3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QoKS51c2UocmVxdWlyZSgnaHR0cC1wcm94eS1taWRkbGV3YXJlJykoWycvb25ib2FyZGluZycsICcvb25ib2FyZGluZy1hcGknXSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdodHRwOi8vZmVIb3N0OjgxODEvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmU6IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QoKS51c2UoJy9ib3dlcl9jb21wb25lbnRzJywgY29ubmVjdC5zdGF0aWMoJy4vYm93ZXJfY29tcG9uZW50cycpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0KCkudXNlKCcvbm9uX2Jvd2VyX2NvbXBvbmVudHMnLCBjb25uZWN0LnN0YXRpYygnLi9ub25fYm93ZXJfY29tcG9uZW50cycpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0LnN0YXRpYyhjb25maWcuYXBwKQorICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBkaXN0OiB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgICAgICBiYXNlOiAnPCU9IGNvbmZpZy5kaXN0ICU+JywKKyAgICAgICAgICAgICAgICAgICAgbGl2ZXJlbG9hZDogZmFsc2UKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gRW1wdGllcyBmb2xkZXJzIHRvIHN0YXJ0IGZyZXNoCisgICAgICAgIGNsZWFuOiB7CisgICAgICAgICAgICBnZW5lcmF0ZWQ6IHsKKyAgICAgICAgICAgICAgICBmaWxlczogW3sKKyAgICAgICAgICAgICAgICAgICAgZG90OiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBzcmM6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzLyoqLyouanMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvKiovKi5jc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgJyE8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzLyoqL3dlbGNvbWUvc3R5bGVzLyouY3NzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9zdHlsZXMvKiovKi5jc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMvKiovKi5qcy5tYXAnCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9XQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGRpc3Q6IHsKKyAgICAgICAgICAgICAgICBmaWxlczogW3sKKyAgICAgICAgICAgICAgICAgICAgZG90OiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBzcmM6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICcudG1wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmRpc3QgJT4vKicsCisgICAgICAgICAgICAgICAgICAgICAgICAnITwlPSBjb25maWcuZGlzdCAlPi8uZ2l0KicKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH1dCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgc2VydmVyOiAnLnRtcCcKKyAgICAgICAgfSwKKyAgICAgICAgLy8gQWRkIHZlbmRvciBwcmVmaXhlZCBzdHlsZXMKKyAgICAgICAgYXV0b3ByZWZpeGVyOiB7CisgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgYnJvd3NlcnM6IFsnPiAxJScsICdsYXN0IDIgdmVyc2lvbnMnLCAnRmlyZWZveCBFU1InLCAnT3BlcmEgMTIuMSddCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgZGlzdDogeworICAgICAgICAgICAgICAgIGZpbGVzOiBbeworICAgICAgICAgICAgICAgICAgICBleHBhbmQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGN3ZDogJy50bXAvY3NzLycsCisgICAgICAgICAgICAgICAgICAgIHNyYzogJ3ssKi8qKi99Ki5jc3MnLAorICAgICAgICAgICAgICAgICAgICBkZXN0OiAnLnRtcC9jc3MvJworICAgICAgICAgICAgICAgIH1dCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gQXV0b21hdGljYWxseSBpbmplY3QgQm93ZXIgY29tcG9uZW50cyBpbnRvIHRoZSBIVE1MIGZpbGUKKyAgICAgICAgd2lyZWRlcDogeworICAgICAgICAgICAgYXBwOiB7CisgICAgICAgICAgICAgICAgaWdub3JlUGF0aDogL15cL3xcLlwuXC8vLAorICAgICAgICAgICAgICAgIHNyYzogWyc8JT0gY29uZmlnLmFwcCAlPi9pbmRleC5odG1sJ10KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICAvLyBSZW5hbWVzIGZpbGVzIGZvciBicm93c2VyIGNhY2hpbmcgcHVycG9zZXMKKyAgICAgICAgcmV2OiB7CisgICAgICAgICAgICBkaXN0OiB7CisgICAgICAgICAgICAgICAgZmlsZXM6IHsKKyAgICAgICAgICAgICAgICAgICAgc3JjOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5kaXN0ICU+L3NjcmlwdHMveywqL30qLmpzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmRpc3QgJT4vc3R5bGVzL3ssKi99Ki5jc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuZGlzdCAlPi9pbWFnZXMveywqL30qLionLAorICAgICAgICAgICAgICAgICAgICAgICAgJyE8JT0gY29uZmlnLmRpc3QgJT4vaW1hZ2VzL3Jlc291cmNlLWljb25zL3ssKi99Ki4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICchPCU9IGNvbmZpZy5kaXN0ICU+L2ltYWdlcy9zZXJ2aWNlLWljb25zL3ssKi99Ki4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICchPCU9IGNvbmZpZy5kaXN0ICU+L2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMveywqL30qLionLAorICAgICAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuZGlzdCAlPi8qLntpY28scG5nfScKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICAvLyBSZWFkcyBIVE1MIGZvciB1c2VtaW4gYmxvY2tzIHRvIGVuYWJsZSBzbWFydCBidWlsZHMgdGhhdCBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vIGNvbmNhdCwgbWluaWZ5IGFuZCByZXZpc2lvbiBmaWxlcy4gQ3JlYXRlcyBjb25maWd1cmF0aW9ucyBpbiBtZW1vcnkgc28KKyAgICAgICAgLy8gYWRkaXRpb25hbCB0YXNrcyBjYW4gb3BlcmF0ZSBvbiB0aGVtCisgICAgICAgIHVzZW1pblByZXBhcmU6IHsKKyAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICBkZXN0OiAnPCU9IGNvbmZpZy5kaXN0ICU+JworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNkYzogeworICAgICAgICAgICAgICAgIHNyYzogWyc8JT0gY29uZmlnLmFwcCAlPi9pbmRleC5odG1sJ10KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBodG1sOiAnPCU9IGNvbmZpZy5hcHAgJT4vaW5kZXguaHRtbCcKKyAgICAgICAgfSwKKworICAgICAgICAvLyBQZXJmb3JtcyByZXdyaXRlcyBiYXNlZCBvbiByZXYgYW5kIHRoZSB1c2VtaW5QcmVwYXJlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgdXNlbWluOiB7CisgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgYXNzZXRzRGlyczogWworICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5kaXN0ICU+JywKKyAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuZGlzdCAlPi9pbWFnZXMnLAorICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5kaXN0ICU+L3N0eWxlcycKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgc28gd2UgdXBkYXRlIGltYWdlIHJlZmVyZW5jZXMgaW4gb3VyIG5nLXRlbXBsYXRlcworICAgICAgICAgICAgICAgIHBhdHRlcm5zOiB7CisgICAgICAgICAgICAgICAgICAgIGpzOiBbCisgICAgICAgICAgICAgICAgICAgICAgICBbLyhhc3NldHNcL2ltYWdlc1wvLio/XC4oPzpnaWZ8anBlZ3xqcGd8cG5nfHdlYnB8c3ZnKSkvZ20sICdVcGRhdGUgdGhlIEpTIHRvIHJlZmVyZW5jZSBvdXIgcmV2dmVkIGltYWdlcyddCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgaHRtbDogWyc8JT0gY29uZmlnLmRpc3QgJT4veywqL30qLmh0bWwnXSwKKyAgICAgICAgICAgIGNzczogWyc8JT0gY29uZmlnLmRpc3QgJT4vc3R5bGVzL3ssKi99Ki5jc3MnXSwKKyAgICAgICAgICAgIGpzOiBbJzwlPSBjb25maWcuZGlzdCAlPi9wdWJsaWMveywqL30qLmpzJ10KKyAgICAgICAgfSwKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nICotbWluIHRhc2tzIHByb2R1Y2UgbWluaWZpZWQgZmlsZXMgaW4gdGhlIGRpc3QgZm9sZGVyCisgICAgICAgIGltYWdlbWluOiB7CisgICAgICAgICAgICBkaXN0OiB7CisgICAgICAgICAgICAgICAgZmlsZXM6IFt7CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgY3dkOiAnPCU9IGNvbmZpZy5hcHAgJT4vaW1hZ2VzJywKKyAgICAgICAgICAgICAgICAgICAgc3JjOiAnPCU9IGNvbmZpZy5hcHAgJT4vKiovKi57Z2lmLGpwZWcsanBnLHBuZ30nLAorICAgICAgICAgICAgICAgICAgICBkZXN0OiAnPCU9IGNvbmZpZy5kaXN0ICU+L2ltYWdlcycKKyAgICAgICAgICAgICAgICB9XQorICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIHN2Z21pbjogeworICAgICAgICAgICAgZGlzdDogeworICAgICAgICAgICAgICAgIGZpbGVzOiBbeworICAgICAgICAgICAgICAgICAgICBleHBhbmQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGN3ZDogJzwlPSBjb25maWcuYXBwICU+L2ltYWdlcycsCisgICAgICAgICAgICAgICAgICAgIHNyYzogJ3ssKi99Ki5zdmcnLAorICAgICAgICAgICAgICAgICAgICBkZXN0OiAnPCU9IGNvbmZpZy5kaXN0ICU+L2ltYWdlcycKKyAgICAgICAgICAgICAgICB9XQorICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIGh0bWxtaW46IHsKKyAgICAgICAgICAgIGRpc3Q6IHsKKyAgICAgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlQm9vbGVhbkF0dHJpYnV0ZXM6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlV2hpdGVzcGFjZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc2VydmF0aXZlQ29sbGFwc2U6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZVF1b3RlczogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ29tbWVudHNGcm9tQ0RBVEE6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUVtcHR5QXR0cmlidXRlczogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlT3B0aW9uYWxUYWdzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICByZW1vdmVSZWR1bmRhbnRBdHRyaWJ1dGVzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICB1c2VTaG9ydERvY3R5cGU6IHRydWUKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGZpbGVzOiBbeworICAgICAgICAgICAgICAgICAgICBleHBhbmQ6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGN3ZDogJzwlPSBjb25maWcuZGlzdCAlPicsCisgICAgICAgICAgICAgICAgICAgIHNyYzogJ3ssKi99Ki5odG1sJywKKyAgICAgICAgICAgICAgICAgICAgZGVzdDogJzwlPSBjb25maWcuZGlzdCAlPicKKyAgICAgICAgICAgICAgICB9XQorICAgICAgICAgICAgfQorICAgICAgICB9LAorCisvLyAgICBCeSBkZWZhdWx0LCB5b3VyIGBpbmRleC5odG1sYCdzIDwhLS0gVXNlbWluIGJsb2NrIC0tPiB3aWxsIHRha2UgY2FyZQorLy8gICAgb2YgbWluaWZpY2F0aW9uLiBUaGVzZSBuZXh0IG9wdGlvbnMgYXJlIHByZS1jb25maWd1cmVkIGlmIHlvdSBkbyBub3QKKy8vICAgIHdpc2ggdG8gdXNlIHRoZSBVc2VtaW4gYmxvY2tzLgorICAgICAgICBjc3NtaW46IHsKKyAgICAgICAgICAgIGRpc3Q6IHsKKyAgICAgICAgICAgICAgICBmaWxlczogeworICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5kaXN0ICU+L3N0eWxlcy9tYWluLmNzcyc6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICcudG1wL2Nzcy97LCovKiovfSouY3NzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzL3ssKi8qKi99Ki5jc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgJzwlPSBjb25maWcuYXBwICU+L3N0eWxlcy9hcHAuY3NzJworICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB1Z2xpZnk6IHsKKyAgICAgICAgICAgIGRpc3Q6IHsKKyAgICAgICAgICAgICAgICBmaWxlczogeworICAgICAgICAgICAgICAgICAgICAnPCU9IGNvbmZpZy5kaXN0ICU+L3NjcmlwdHMvc2NyaXB0cy5qcyc6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmRpc3QgJT4vc2NyaXB0cy9zY3JpcHRzLmpzJworICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICByZXBsYWNlOiB7CisgICAgICAgICAgICBjc3NSZXBsYWNlOiB7CisgICAgICAgICAgICAgICAgc3JjOiBbJzwlPSBjb25maWcuYXBwICU+L3NjcmlwdHMveywqLyoqL30qLmNzcycsCisgICAgICAgICAgICAgICAgICAgICc8JT0gY29uZmlnLmFwcCAlPi9zdHlsZXMveywqLyoqL30qLmNzcyddLAorICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICByZXBsYWNlbWVudHM6IFsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogJy4uLy4uLy4uL2ltYWdlcy8nLAorICAgICAgICAgICAgICAgICAgICAgICAgdG86ICcuLi9pbWFnZXMvJworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiAnLi4vLi4vaW1hZ2VzLycsCisgICAgICAgICAgICAgICAgICAgICAgICB0bzogJy4uL2ltYWdlcy8nCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb206ICcuLi8uLi8uLi9mb250cy8nLAorICAgICAgICAgICAgICAgICAgICAgICAgdG86ICcuLi9mb250cy8nCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb206ICcuLi8uLi9mb250cy8nLAorICAgICAgICAgICAgICAgICAgICAgICAgdG86ICcuLi9mb250cy8nCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb206ICcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzLycsCisgICAgICAgICAgICAgICAgICAgICAgICB0bzogJ2ltYWdlcy8nCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICBjb25jYXQ6IHsKKyAgICAgICAgICAgIGRpc3Q6IHsKKyAgICAgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcjogJztcbicKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHNyYzogWyc8JT0gY29uZmlnLmFwcCAlPi9zY3JpcHRzL3ssKi8qKi99Ki5qcyddLAorICAgICAgICAgICAgICAgIGRlc3Q6ICcudG1wL2NvbmNhdC9zY3JpcHRzL3NjcmlwdHMuanMnCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgZ2VuZXJhdGVkOiB7CisgICAgICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3I6ICdcbicKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgLy8gQ29waWVzIHJlbWFpbmluZyBmaWxlcyB0byBwbGFjZXMgb3RoZXIgdGFza3MgY2FuIHVzZQorICAgICAgICBjb3B5OiB7CisgICAgICAgICAgICBkaXN0OiB7CisgICAgICAgICAgICAgICAgZmlsZXM6IFt7CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgZG90OiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBjd2Q6ICc8JT0gY29uZmlnLmFwcCAlPicsCisgICAgICAgICAgICAgICAgICAgIGRlc3Q6ICc8JT0gY29uZmlnLmRpc3QgJT4nLAorICAgICAgICAgICAgICAgICAgICBzcmM6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICcqLntpY28scG5nLHR4dH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgJy5odGFjY2VzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAnYm93ZXJfY29tcG9uZW50cy8qKi8qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdHlsZXMvaW1hZ2VzLyoqLyonLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3N0eWxlcy9mb250cy8qKi8qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZXMvKiovKicsCisgICAgICAgICAgICAgICAgICAgICAgICAnaW5kZXguaHRtbCcKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjOiAnbm9kZV9tb2R1bGVzL2FwYWNoZS1zZXJ2ZXItY29uZmlncy9kaXN0Ly5odGFjY2VzcycsCisgICAgICAgICAgICAgICAgICAgIGRlc3Q6ICc8JT0gY29uZmlnLmRpc3QgJT4vLmh0YWNjZXNzJworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogJy50bXAvaW1hZ2VzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q6ICc8JT0gY29uZmlnLmRpc3QgJT4vaW1hZ2VzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogWydnZW5lcmF0ZWQvKiddCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETyB0byByZW1vdmUgdGhpcyBzZWN0aW9uIGFmdGVyIGludGVncmF0aW9uIG9uYm9hcmQgZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgY3dkOiAnPCU9IGNvbmZpZy5hcHAgJT4vdGhpcmQtcGFydHknLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdDogJzwlPSBjb25maWcuZGlzdCAlPi90aGlyZC1wYXJ0eScsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IFsnb25ib2FyZF9idW5kbGVfZnVsbC5qcyddCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q6ICc8JT0gY29uZmlnLmRpc3QgJT4nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UuanNvbicKKyAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzdHlsZXM6IHsKKyAgICAgICAgICAgICAgICBleHBhbmQ6IHRydWUsCisgICAgICAgICAgICAgICAgY3dkOiAnPCU9IGNvbmZpZy5hcHAgJT4vc3R5bGVzJywKKyAgICAgICAgICAgICAgICBkZXN0OiAnLnRtcC9jc3MvJywKKyAgICAgICAgICAgICAgICBzcmM6ICd7LCovKiovfSouY3NzJworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIC8vIFJ1biBzb21lIHRhc2tzIGluIHBhcmFsbGVsIHRvIHNwZWVkIHVwIGJ1aWxkIHByb2Nlc3MKKyAgICAgICAgY29uY3VycmVudDogeworICAgICAgICAgICAgc2VydmVyOiBbJ2NvcHk6c3R5bGVzJ10sCisgICAgICAgICAgICB0ZXN0OiBbJ2NvcHk6c3R5bGVzJ10sCisgICAgICAgICAgICBkaXN0OiBbCisgICAgICAgICAgICAgICAgJ2NvcHk6c3R5bGVzJywKKyAgICAgICAgICAgICAgICAnaW1hZ2VtaW4nCisgICAgICAgICAgICBdCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gICBUZXN0IHNldHRpbmdzCisgICAgICAgIGthcm1hOiB7CisgICAgICAgICAgICBkZXY6IHsKKyAgICAgICAgICAgICAgICBjb25maWdGaWxlOiAidGVzdHMva2FybWEudW5pdC5jb25mLmpzIiwKKyAgICAgICAgICAgICAgICBzaW5nbGVSdW46IHRydWUsCisgICAgICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICAgICAgICBicm93c2VyczogWydDaHJvbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VSZXBvcnRlcjogeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2h0bWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiAndGVzdHMvQ292ZXJhZ2UnCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgZGVidWc6IHsKKyAgICAgICAgICAgICAgICBjb25maWdGaWxlOiAidGVzdHMva2FybWEudW5pdC5jb25mLmpzIiwKKyAgICAgICAgICAgICAgICBzaW5nbGVSdW46IGZhbHNlLAorICAgICAgICAgICAgICAgIC8vY29tbWVudCBvdXQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IHRvIGNhbmNlbCB0aGUgd2F0Y2ggYW5kIHNlZSB0aGUgVVQgbG9nCisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJzOiBbJ0Nocm9tZSddLAorICAgICAgICAgICAgICAgICAgICByZXBvcnRlcnM6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICdqdW5pdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnZG90cycsCisgICAgICAgICAgICAgICAgICAgICAgICAncHJvZ3Jlc3MnCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgamVua2luczogeworICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGU6ICJ0ZXN0cy9rYXJtYS51bml0LmNvbmYuanMiLAorICAgICAgICAgICAgICAgIHNpbmdsZVJ1bjogdHJ1ZSwKKyAgICAgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJzOiBbJ1BoYW50b21KUyddLAorICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZVJlcG9ydGVyOiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC1zdW1tYXJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogJ3Rlc3RzL0NvdmVyYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6ICdjb3ZlcmFnZS50eHQnCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgdHNsaW50OiB7CisgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogJ3RzbGludC5qc29uJworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgICAgICAgc3JjOiBbJzwlPSBjb25maWcuYXBwICU+LyoqLyoudHMnXQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7CisKKyAgICBncnVudC5yZWdpc3RlclRhc2soJ3NlcnZlJywgJ3N0YXJ0IHRoZSBzZXJ2ZXIgYW5kIHByZXZpZXcgeW91ciBhcHAsIC0tYWxsb3ctcmVtb3RlIGZvciByZW1vdGUgYWNjZXNzJywgZnVuY3Rpb24gKHRhcmdldCkgeworCisgICAgICAgIHZhciBlbnYgPSBncnVudC5vcHRpb24oJ2VudicpOworCisgICAgICAgIGlmIChncnVudC5vcHRpb24oJ2FsbG93LXJlbW90ZScpKSB7CisgICAgICAgICAgICBncnVudC5jb25maWcuc2V0KCdjb25uZWN0Lm9wdGlvbnMuaG9zdG5hbWUnLCAnMC4wLjAuMCcpOworICAgICAgICB9CisgICAgICAgIGlmICh0YXJnZXQgPT09ICdkaXN0JykgeworICAgICAgICAgICAgcmV0dXJuIGdydW50LnRhc2sucnVuKFsnYnVpbGQnLCAnY29ubmVjdDpkaXN0OmtlZXBhbGl2ZSddKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKGVudiA9PT0gJ21vY2snKSB7CisgICAgICAgICAgICBncnVudC50YXNrLnJ1bihbCisgICAgICAgICAgICAgICAgJ2V4cHJlc3M6bW9jaycsCisgICAgICAgICAgICAgICAgJ2NsZWFuOmdlbmVyYXRlZCcsCisgICAgICAgICAgICAgICAgJ3RzOmFsbCcsCisgICAgICAgICAgICAgICAgJ25ndGVtcGxhdGVzOmFwcCcsCisgICAgICAgICAgICAgICAgJ2luamVjdG9yJywKKyAgICAgICAgICAgICAgICAnbGVzczphbGwnLAorICAgICAgICAgICAgICAgICduZ2NvbnN0YW50JywKKyAgICAgICAgICAgICAgICAnd2lyZWRlcCcsCisgICAgICAgICAgICAgICAgJ2NvbmN1cnJlbnQ6c2VydmVyJywKKyAgICAgICAgICAgICAgICAnYXV0b3ByZWZpeGVyJywKKyAgICAgICAgICAgICAgICAnY29ubmVjdDpsaXZlcmVsb2FkJywKKyAgICAgICAgICAgICAgICAnd2F0Y2g6aHRtbCcsCisgICAgICAgICAgICAgICAgJ3dhdGNoOmxlc3MnCisgICAgICAgICAgICBdKTsKKyAgICAgICAgfQorCisgICAgICAgIGdydW50LnRhc2sucnVuKFsKKyAgICAgICAgICAgICdjbGVhbjpnZW5lcmF0ZWQnLAorICAgICAgICAgICAgJ3RzOmFsbCcsCisgICAgICAgICAgICAnbmd0ZW1wbGF0ZXM6YXBwJywKKyAgICAgICAgICAgICdpbmplY3RvcicsCisgICAgICAgICAgICAnbGVzczphbGwnLAorICAgICAgICAgICAgJ25nY29uc3RhbnQnLAorICAgICAgICAgICAgJ3dpcmVkZXAnLAorICAgICAgICAgICAgJ2NvbmN1cnJlbnQ6c2VydmVyJywKKyAgICAgICAgICAgICdhdXRvcHJlZml4ZXInLAorICAgICAgICAgICAgJ2Nvbm5lY3Q6bGl2ZXJlbG9hZCcsCisgICAgICAgICAgICAnd2F0Y2gnCisgICAgICAgIF0pOworICAgIH0pOworCisgICAgZ3J1bnQucmVnaXN0ZXJUYXNrKCdidWlsZCcsIFsKKyAgICAgICAgJ2NsZWFuOmdlbmVyYXRlZCcsCisgICAgICAgICdsZXNzOmFsbCcsCisgICAgICAgICd0czphbGwnLAorICAgICAgICAnbmdjb25zdGFudCcsCisgICAgICAgICduZ3RlbXBsYXRlczphcHAnLAorICAgICAgICAnd2lyZWRlcCcsCisgICAgICAgICdyZXBsYWNlJywKKyAgICAgICAgJ2NsZWFuOmRpc3QnLAorICAgICAgICAndXNlbWluUHJlcGFyZTpzZGMnLAorICAgICAgICAnY29uY3VycmVudDpkaXN0JywKKyAgICAgICAgJ2F1dG9wcmVmaXhlcjpkaXN0JywKKyAgICAgICAgJ2NvbmNhdCcsCisgICAgICAgICdjb3B5OmRpc3QnLAorICAgICAgICAnY3NzbWluJywKKyAgICAgICAgJ3VnbGlmeScsCisgICAgICAgICdyZXYnLAorICAgICAgICAndXNlbWluJworICAgIF0pOworCisgICAgZ3J1bnQucmVnaXN0ZXJUYXNrKCJ0ZXN0IiwgZnVuY3Rpb24gKHRhcmdldCkgeworCisgICAgICAgIGlmICghKHRhcmdldCA9PT0gJ2RlYnVnJyB8fCB0YXJnZXQgPT09ICdkZXYnIHx8IHRhcmdldCA9PT0gJ2plbmtpbnMnKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXZhaWxhYmxlIGZvciB0ZXN0IGFyZSA8ZGV2fGRlYnVnfGplbmtpbnM+Iik7CisgICAgICAgIH0KKyAgICAgICAgdmFyIHRhc2tzID0gWworICAgICAgICAgICAgLy8gInRzbGludDprYXJtYSIsCisgICAgICAgICAgICAvLyAibmdjb25zdGFudCIsCisgICAgICAgICAgICAvLy8vICAiY29uY3VycmVudDp0ZXN0IiwKKyAgICAgICAgICAgIC8vICJzZXJ2aWNlc0ljb25Db25zdGFudHMiLAorICAgICAgICAgICAgLy8gImF1dG9wcmVmaXhlciIsCisgICAgICAgICAgICAvLyAibmd0ZW1wbGF0ZXM6dGVzdHNUZW1wbGF0ZXMiLAorICAgICAgICAgICAgLy8gImNvbm5lY3Q6dGVzdCIKKyAgICAgICAgXTsKKworICAgICAgICB0YXNrcy5wdXNoKCdrYXJtYTonICsgdGFyZ2V0KTsKKyAgICAgICAgaWYgKHRhcmdldCA9PT0gJ2RlYnVnJykgeworICAgICAgICAgICAgaWYgKGdydW50LmNvbmZpZy5nZXQoJ3dhdGNoLnRzJykpIHsKKyAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKCJ3YXRjaDp0cyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInRhcmdldCB3YXRjaDp0cyBpcyBub3QgYXZhaWxhYmxlLCB2ZXJpZnkgdGhhdCBpdCBleGlzdHMgaW4geW91ciBHcnVudGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBncnVudC50YXNrLnJ1bih0YXNrcyk7CisgICAgfSk7CisKKworICAgIHZhciBsZXNzU2luZ2xlVGFzayA9IGZ1bmN0aW9uIChmaWxlUGF0aCkgeworICAgICAgICB2YXIgbGVzc1NpbmdsZUZpbGVzID0gW3sKKyAgICAgICAgICAgIGV4cGFuZDogdHJ1ZSwKKyAgICAgICAgICAgIHNyYzogW2ZpbGVQYXRoLnJlcGxhY2UoL1xcL2csICcvJyldLAorICAgICAgICAgICAgZXh0OiAnLmNzcycKKyAgICAgICAgfV07CisgICAgICAgIGdydW50LmNvbmZpZygnbGVzcy5zaW5nbGUuZmlsZXMnLCBsZXNzU2luZ2xlRmlsZXMpOworICAgICAgICBncnVudC5jb25maWcoJ3dhdGNoLmxlc3MudGFza3MnLCAnbGVzczpzaW5nbGUnKTsKKworICAgIH07CisKKyAgICB2YXIgdHNTaW5nbGVUYXNrID0gZnVuY3Rpb24gKGZpbGVQYXRoKSB7CisKKyAgICAgICAgdmFyIHRzU2luZ2xlRGF0YSA9IHsKKyAgICAgICAgICAgIHNyYzogW2ZpbGVQYXRoLnJlcGxhY2UoL1xcL2csICcvJyldCisgICAgICAgIH07CisgICAgICAgIC8vIGdydW50LmNvbmZpZygndHMuc2luZ2xlJywgdHNTaW5nbGVEYXRhKTsKKworICAgIH07CisKKyAgICB2YXIgc2luZ2xlVGFza0J5VGFza05hbWUgPSB7CisgICAgICAgIC8vbGVzczogbGVzc1NpbmdsZVRhc2ssCisgICAgICAgIHRzOiB0c1NpbmdsZVRhc2sKKyAgICB9OworCisgICAgdmFyIG9uR3J1bnRXYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGFjdGlvbiwgZmlsZXBhdGgsIHRhcmdldCkgeworICAgICAgICBpZiAoc2luZ2xlVGFza0J5VGFza05hbWVbdGFyZ2V0XSkgeworICAgICAgICAgICAgc2luZ2xlVGFza0J5VGFza05hbWVbdGFyZ2V0XS5jYWxsKHVuZGVmaW5lZCwgZmlsZXBhdGgpOworICAgICAgICB9CisgICAgfTsKKyAgICBncnVudC5ldmVudC5vbignd2F0Y2gnLCBvbkdydW50V2F0Y2hFdmVudCk7Cit9OwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9TRVRUSU5HLUVOVklST05NRU5ULm1kIGIvY2F0YWxvZy11aS9TRVRUSU5HLUVOVklST05NRU5ULm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkY2NjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL1NFVFRJTkctRU5WSVJPTk1FTlQubWQKQEAgLTAsMCArMSwzNiBAQAorIyBQcmVyZXF1aXNpdGVzCisKKzEuIGluc3RhbGwgW25vZGUuanNdKGh0dHA6Ly9ub2RlanMub3JnL2Rvd25sb2FkLykKKzIuIGluc3RhbGwgW2dpdF0oaHR0cDovL2dpdC1zY20uY29tLykuIF9fTWFrZSBzdXJlIHRvIHNlbGVjdCB0aGUgb3B0aW9uIHRvIGFkZCBnaXQgaW50byAkUEFUSF9fCiszLiBpbnN0YWxsIGdydW50IHdpdGggZGVwZW5kZW5jaWVzIGBucG0gaW5zdGFsbCAtZyBib3dlciBncnVudC1jbGlgCisKKyBpZiBydW5uaW5nIG9uIE1hY09TL0xpbnV4IHRoZSBjb21tYW5kIHNob3VsZCBiZSBydW4gd2l0aCBgc3Vkb2AKKworIyBSdW5uaW5nIHRoZSBzZXJ2ZXIKKworTWFrZSBzdXJlIGFsbCB0aGUgY2xpZW50IGFuZCBucG0gZGVwZW5kZW5jaWVzIGluc3RhbGxlZCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKzEuIGBucG0gaW5zdGFsbGAKKzIuIGBib3dlciBpbnN0YWxsYAorCisKKworWW91IGFyZSB0aGVuIHByZXNlbnRlZCB3aXRoIDMgb3B0aW9ucyBgbmduaXhgLCBgdGVzdGAsIGBidWlsZGAKKworMS4gYGdydW50IHNlcnZlICAtLWVudj1tb2NrYCB3aWxsIHNldHVwIGEgZGV2KG5naW54KSBzZXJ2ZXIgdW5kZXIgYGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMGAgd2l0aCBtb2NrIGNvbmZpZ3VyYXRpb25zLiBUaGUgYXJlIGFsc28gYGdydW50IHNlcnZlOnRlc3RgIGFuZCBgZ3J1bnQgc2VydmU6cHJvZGAgb3B0aW9ucworMi4gYGdydW50IHRlc3RgIHdpbGwgcnVuIGFsbCB0aGUgdW5pdCB0ZXN0cyBpbiB0aGUgcHJvamVjdAorMy4gYGdydW50IGJ1aWxkYCB3aWxsIHJ1biBhIGJ1aWxkIHByb2Nlc3MgcmVzdWx0aW5nIHdpdGggYSBgZGlzdC9gIGZvbGRlciBpbmNsdWRpbmcgdGhlIHZlcnNpb24gcmVhZHkgdG8gYmUgZGVwbG95ZWQgKHRoaXMgdGFzayBzaG91bGQgYmUgbWFpbmx5IHJ1biBvbiB0aGUgQ0kgc2VydmVyKQorMy4gYGdydW50IGJ1aWxkOmRldmAgd2lsbCBkZXBsb3kgdG8gbmdpbnggYSBwcm9kdWN0aW9uIGFydGlmYWN0LCAobWluaWZ5IGZpbGVzKSAgCisKKyMgV2Vic3Rvcm0KKworQWx0aG91Z2ggYW55IHRleHQgZWRpdG9yIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFuZ3VsYXIgYXBwbGljYXRpb25zIFdlYnN0b3JtIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgZm9yIHRoZSB0YXNrLiBJbiBjYXNlIFdlYnN0b3JtIGlzIGNob3NlbiBtYWtlIHN1cmUgaXQgaGFzIHRoZSBmb2xsb3dpbmcgcGx1Z2luczoKKworKiBgLmVkaXRvcmNvbmZpZ2AgLSB0aGlzIHBsdWdpbiB3aWxsIGtlZXAgbGluZSBpbmRlbnRhdGlvbiBzYW1lIGFjcm9zcyBhbGwgZGV2ZWxvcGVycworKiBgYW5ndWxhci5qc2AgLSB0aGlzIHBsdWdpbiB3aWxsIGhlbHAgYXV0b2NvbXBsZXRpbmcgYW5ndWxhciBzeW50YXgKKyogYG1hcmtkb3duYCAtIHRoaXMgb25lIHdpbGwgZ2l2ZSBuaWNlIHN1cHBvcnQgdG8gd3JpdGUgLm1kIGZpbGVzIHN1Y2ggYXMgdGhpcyBvbmUgeW91IGFyZSByZWFkaW5nIHJpZ2h0IG5vdworCitUaGVzZSBjYW4gYmUgZm91bmQgaW4gcGx1Z2lucyBzZXR0aW5ncyBzZWN0aW9uIGJ5IHByZXNzaW5nIFBDOiBgQ1RSTCArIFNISUZUICsgQWAgTUFDOiBgQ01EICsgU0hJRlQgKyBBYCBhbmQgdHlwaW5nIGFkZG9ucworCisKKy0tPiBETyBOT1QgQ09NTUlUIEFOWVRISU5HIEJFRk9SRSBSVU5OSU5HIGdydW50IGJ1aWxkIC8gZ3J1bnQgbmdpbnggLyBncnVudCBuZ2lueDptb2NrIC0tZW52PW1vY2sgPC0tCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL1NFVFRJTkctTU9DSy1TRVJWRVIubWQgYi9jYXRhbG9nLXVpL1NFVFRJTkctTU9DSy1TRVJWRVIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiNTA4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvU0VUVElORy1NT0NLLVNFUlZFUi5tZApAQCAtMCwwICsxLDUzIEBACisjIFByZXJlcXVpc2l0ZXMKKworMS4gaW5zdGFsbCBbbm9kZS5qc10oaHR0cDovL25vZGVqcy5vcmcvZG93bmxvYWQvKQorMi4gaW5zdGFsbCBbZ2l0XShodHRwOi8vZ2l0LXNjbS5jb20vKS4gX19NYWtlIHN1cmUgdG8gc2VsZWN0IHRoZSBvcHRpb24gdG8gYWRkIGdpdCBpbnRvICRQQVRIX18KKzMuIGluc3RhbGwgZGVwZW5kZW5jaWVzIFtleHByZXNzLGNvcnNdIG5wbSBpbnN0YWxsIGV4cHJlc3MsIG5wbSBpbnN0YWxsIGNvcnMKKworCisKKyMgQ3JlYXRlIHRoZSBzZXJ2ZXIgZmlsZSAKK0V4YW1wbGU6CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYXIgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTsKK3ZhciBtb2NrVXJpcyA9IHJlcXVpcmUoJy4uL2NvbmZpZ3VyYXRpb25zL21vY2suanNvbicpOwordmFyIGNvcnMgPSByZXF1aXJlKCdjb3JzJyk7CisKKwordmFyIGFwcCA9IGV4cHJlc3MoKTsKKworLy8gZGVjbGFyZSBzZXJ2ZXIgY3Jvc3MgYnJvd3NlciAKK2FwcC51c2UoY29ycyh7CisgICAgb3JpZ2luOiAnKicsCisgICAgbWV0aG9kczogJ0dFVCwgUE9TVCwgUFVULCBERUxFVEUnLAorICAgIGFsbG93ZWRIZWFkZXJzOiAnQ29udGVudC1UeXBlLEF1dGhvcml6YXRpb24sSWYtTW9kaWZpZWQtU2luY2UnCit9KSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1PQ0tTIEVOUE9JTlRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwb2lGaW5kICovCithcHAuZ2V0KCcvdjEnICsgbW9ja1VyaXMuZ2VuZXJhbENvbmYuZ2V0UG9pRmluZC5zcGxpdCgndjEnKVsxXSwgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgICAgdmFyIHBvaXMgPSByZXF1aXJlKCcuL2RhdGEvcG9pL3BvaS1zZWFyY2guanNvbicpOyAvLyB0aGUganNvbiByZXNwb25zZSBmb3IgdGhlIGFwaSBjYWxsCisgICAgcmVzLnNlbmQocG9pcyk7Cit9KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGRlY2xhcmUgIHNlcnZlciBsaXN0ZW5lciAgcG9ydAordmFyIHNlcnZlciA9IGFwcC5saXN0ZW4oOTk5OSwgZnVuY3Rpb24gKCkgeworICAgIGNvbnNvbGUubG9nKCdtb2NrIHNlcnZlciBsaXN0ZW5pbmcgb24gcG9ydCAlZCcsIHNlcnZlci5hZGRyZXNzKCkucG9ydCk7Cit9KTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI2NyZWF0ZSBtb2NrRGF0ZQorCisxLiBjcmVhdGUganNvbiBmaWxlIHdpdGggdGhlIHJlc3BvbnNlLgorMi4gYWRkIHRoZSBhcGkgZW5kIHBvaW50IGluIHRoZSBzZXJ2ZXIgZmlsZSBhbmQgZGVjbGFyZSB0aGUganNvbiBmaWxlIGZvciB0aGUgcmVzcG9uc2UvICAKKworCisKKyMgUnVubmluZyB0aGUgc2VydmVyCisKKzEuIGdvIHRvIHNlcnZlciBmaWxlIGZvbGRlcgorMi4gcnVuIGNvbW1hbmQgOiBub2RlIDxGaWxlTmFtZT4KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvX2Zhdmljb24ucG5nIGIvY2F0YWxvZy11aS9hcHAvX2Zhdmljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOWYwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9fZmF2aWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvaW5kZXguaHRtbCBiL2NhdGFsb2ctdWkvYXBwL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2ZmRmZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzOTIgQEAKKzwhZG9jdHlwZSBodG1sPgorPGh0bWwgY2xhc3M9Im5vLWpzIiBkYXRhLW5nLWFwcD0ic2RjQXBwIj4KKzxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICA8dGl0bGU+U0RDPC90aXRsZT4KKyAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoIj4KKyAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImZhdmljb24ucG5nIiB0eXBlPSJpbWFnZS9wbmciPgorICAgIDwhLS08bGluayByZWw9Imljb24iIGhyZWY9ImZhdmljb24ucG5nIiB0eXBlPSJpbWFnZS9wbmciPi0tPgorCisgICAgPCEtLSBidWlsZDpjc3MoLikgc3R5bGVzL3ZlbmRvci5jc3MgLS0+CisgICAgPCEtLSBib3dlcjpjc3MgLS0+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL3BlcmZlY3Qtc2Nyb2xsYmFyL3NyYy9wZXJmZWN0LXNjcm9sbGJhci5jc3MiIC8+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdG9vbHRpcHMvZGlzdC9hbmd1bGFyLXRvb2x0aXBzLm1pbi5jc3MiIC8+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL2Jvb3RzdHJhcC9kaXN0L2Nzcy9ib290c3RyYXAuY3NzIiAvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9hbmltYXRlLmNzcy9hbmltYXRlLmNzcyIgLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci11aS1ub3RpZmljYXRpb24vZGlzdC9hbmd1bGFyLXVpLW5vdGlmaWNhdGlvbi5jc3MiIC8+CisgICAgPCEtLSBlbmRib3dlciAtLT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1yZXNpemFibGUvc3JjL2FuZ3VsYXItcmVzaXphYmxlLmNzcyIvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9xdGlwMi9qcXVlcnkucXRpcC5taW4uY3NzIi8+CisKKworCisgICAgPCEtLSBlbmRidWlsZCAtLT4KKyAgICA8IS0tIGJ1aWxkOmNzcygudG1wKSBzdHlsZXMvbWFpbi5jc3MgLS0+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdHlsZXMvYXBwLmNzcyI+CisgICAgPCEtLSAvaW5jbHVkZSAtLT4KKworICAgIDwhLS0gaW5qZWN0b3I6Y3NzIC0tPgorCisgICAgPCEtLSBlbmRpbmplY3RvciAtLT4KKyAgICA8IS0tIGVuZGJ1aWxkIC0tPgorCisgICAgPCEtLSBpbmNsdWRlOiAidHlwZSI6ICJjc3MiLCAiZmlsZXMiOiAic2NyaXB0cy8qLmNzcyIgLS0+CisgICAgPCEtLSAvaW5jbHVkZSAtLT4KKzwvaGVhZD4KKzxib2R5IGRhdGEtbmctY2xhc3M9ImJvZHlDbGFzcyI+Cis8IS0tW2lmIGx0IElFIDEwXT4KKzxwIGNsYXNzPSJicm93c2VoYXBweSI+WW91IGFyZSB1c2luZyBhbiA8c3Ryb25nPm91dGRhdGVkPC9zdHJvbmc+IGJyb3dzZXIuIFBsZWFzZSA8YSBocmVmPSJodHRwOi8vYnJvd3NlaGFwcHkuY29tLyI+dXBncmFkZQorICAgIHlvdXIgYnJvd3NlcjwvYT4gdG8gaW1wcm92ZSB5b3VyIGV4cGVyaWVuY2UuPC9wPgorPCFbZW5kaWZdLS0+CisKKworPGRpdiBjbGFzcz0ic2RjLWxvYWRpbmctcGFnZSI+CisgICAgPGgxIGNsYXNzPSJjYXB0aW9uMSI+U2lnbmluZyBpbjwvaDE+CisgICAgPHAgY2xhc3M9ImNhcHRpb24yIj5QbGVhc2Ugd2FpdC4gSWYgeW91IGFyZSB1c2luZyBJbnRlcm5ldCBFeHBsb3JlciwgcGxlYXNlIHJlYXR0ZW1wdCBhY2Nlc3MgdXNpbmcgQ2hyb21lIG9yCisgICAgICAgIEZpcmVmb3guPC9wPgorCisgICAgPC9wPgorCisgICAgPGRpdiBjbGFzcz0ibWFpbi1sb2FkZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkZXIiPgorICAgICAgICAgICAgPHN2ZyBjbGFzcz0iY2lyY3VsYXIiIHZpZXdCb3g9IjI1IDI1IDUwIDUwIj4KKyAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPSJwYXRoIiBjeD0iNTAiIGN5PSI1MCIgcj0iMjAiIGZpbGw9Im5vbmUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIi8+CisgICAgICAgICAgICA8L3N2Zz4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iZnVsbC1oZWlnaHQiIGRhdGEtdWktdmlldz0iIj48L2Rpdj4KKworPCEtLSBidWlsZDpqcyguKSBzY3JpcHRzL3ZlbmRvci5qcyAtLT4KKworPCEtLSBib3dlcjpqcyAtLT4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyL2FuZ3VsYXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1iYXNlNjQvYW5ndWxhci1iYXNlNjQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1iYXNlNjQtdXBsb2FkL3NyYy9hbmd1bGFyLWJhc2U2NC11cGxvYWQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1ib290c3RyYXAvdWktYm9vdHN0cmFwLXRwbHMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvanF1ZXJ5LXVpL2pxdWVyeS11aS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLWRyYWdkcm9wL3NyYy9hbmd1bGFyLWRyYWdkcm9wLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItZmlsdGVyL2Rpc3QvYW5ndWxhci1maWx0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1tb2Nrcy9hbmd1bGFyLW1vY2tzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL3BlcmZlY3Qtc2Nyb2xsYmFyL3NyYy9wZXJmZWN0LXNjcm9sbGJhci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXBlcmZlY3Qtc2Nyb2xsYmFyL3NyYy9hbmd1bGFyLXBlcmZlY3Qtc2Nyb2xsYmFyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItcmVzb3VyY2UvYW5ndWxhci1yZXNvdXJjZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXNhbml0aXplL2FuZ3VsYXItc2FuaXRpemUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci10b29sdGlwcy9kaXN0L2FuZ3VsYXItdG9vbHRpcHMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdHJhbnNsYXRlL2FuZ3VsYXItdHJhbnNsYXRlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdHJhbnNsYXRlLWxvYWRlci1zdGF0aWMtZmlsZXMvYW5ndWxhci10cmFuc2xhdGUtbG9hZGVyLXN0YXRpYy1maWxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXVpLXJvdXRlci9yZWxlYXNlL2FuZ3VsYXItdWktcm91dGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdXVpZDQvYW5ndWxhci11dWlkNC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAvZGlzdC9qcy9ib290c3RyYXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvY2hlY2tsaXN0LW1vZGVsL2NoZWNrbGlzdC1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9qc3BkZi9kaXN0L2pzcGRmLm1pbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLWNsaXBib2FyZC9hbmd1bGFyLWNsaXBib2FyZC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXJlc2l6YWJsZS9zcmMvYW5ndWxhci1yZXNpemFibGUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvYW5ndWxhci11aS1ub3RpZmljYXRpb24vZGlzdC9hbmd1bGFyLXVpLW5vdGlmaWNhdGlvbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9qcy1tZDUvc3JjL21kNS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9jeXRvc2NhcGUvZGlzdC9jeXRvc2NhcGUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvbG9kYXNoL2xvZGFzaC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9yZXN0YW5ndWxhci9kaXN0L3Jlc3Rhbmd1bGFyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2N5dG9zY2FwZS1leHBhbmQtY29sbGFwc2UvY3l0b3NjYXBlLWV4cGFuZC1jb2xsYXBzZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9ldi1lbWl0dGVyL2V2LWVtaXR0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvaW1hZ2VzbG9hZGVkL2ltYWdlc2xvYWRlZC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9xdGlwMi9qcXVlcnkucXRpcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9xdGlwMi9iYXNpYy9qcXVlcnkucXRpcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9jeXRvc2NhcGUtcXRpcC9jeXRvc2NhcGUtcXRpcC5qcyI+PC9zY3JpcHQ+Cis8IS0tIGVuZGJvd2VyIC0tPgorPHNjcmlwdCBzcmM9Im5vbl9ib3dlcl9jb21wb25lbnRzL2N5dG9zY2FwZS5qcy1lZGdlLWVkaXRhdGlvbi9DeXRvc2NhcGVFZGdlRWRpdGF0aW9uLmpzIj48L3NjcmlwdD4KKzwhLS0gZW5kYnVpbGQgLS0+CisKKworPCEtLSBidWlsZDpqcyh7YXBwLC50bXB9KSBzY3JpcHRzL21haW4uanMgLS0+CisKKworPCEtLSBpbmNsdWRlIHV0aWxzIC0tPgorCis8c2NyaXB0IHNyYz0ic2NyaXB0cy91dGlscy9kaWN0aW9uYXJ5L2RpY3Rpb25hcnkuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdXRpbHMvcHJvdG90eXBlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy91dGlscy9hcnRpZmFjdHMtdXRpbHMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdXRpbHMvZmlsZS11dGlscy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy91dGlscy92YWxpZGF0aW9uLXV0aWxzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3V0aWxzL2NvbXBvbmVudC1mYWN0b3J5LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3V0aWxzL2NvbXBvbmVudC1pbnN0YW5jZS1mYWN0b3J5LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3V0aWxzL2NoYW5nZS1saWZlY3ljbGUtc3RhdGUtaGFuZGxlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy91dGlscy9tb2RhbHMtaGFuZGxlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy91dGlscy9tZW51LWhhbmRsZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdXRpbHMvY29uc3RhbnRzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3V0aWxzL2NvbW1vbi11dGlscy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy91dGlscy9mdW5jdGlvbnMuanMiPjwvc2NyaXB0PgorCis8IS0tIGVuZGluamVjdG9yOmpzX3V0aWxzIC0tPgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kdWxlcy91dGlscy5qcyI+PC9zY3JpcHQ+Cis8IS0tIC9lbmQgaW5jbHVkZSB1dGlscy0tPgorCis8IS0tIGluamVjdG9yOmpzX21vZGVscyAtLT4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9hY3Rpdml0eS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvYWRkaXRpb25hbC1pbmZvcm1hdGlvbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvYXBwLWNvbmZpZy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvYXJ0aWZhY3RzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9hc2NoZW1hLXByb3BlcnR5LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9hdHRyaWJ1dGVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9jYXBhYmlsaXR5LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9jYXRlZ29yeS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvY29tbWVudHMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHMvY29tcG9uZW50LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9jb21wb25lbnRzL2Rpc3BsYXlDb21wb25lbnQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHMvcHJvZHVjdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvY29tcG9uZW50cy9yZXNvdXJjZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvY29tcG9uZW50cy9zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9jb21wb25lbnRzSW5zdGFuY2VzL2NvbXBvbmVudEluc3RhbmNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9jb21wb25lbnRzSW5zdGFuY2VzL3Byb2R1Y3RJbnN0YW5jZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvY29tcG9uZW50c0luc3RhbmNlcy9yZXNvdXJjZUluc3RhbmNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9jb21wb25lbnRzSW5zdGFuY2VzL3NlcnZpY2VJbnN0YW5jZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvY3Nhci1jb21wb25lbnQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2RhdGEtdHlwZS1wcm9wZXJ0aWVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9kYXRhLXR5cGVzLW1hcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZGF0YS10eXBlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZGlzdHJpYnV0aW9uLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9maWxlLWRvd25sb2FkLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9kMi1ub2RlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21tb24tYmFzZS1saW5rLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21tb24tY2ktbGluay1iYXNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1jaS1saW5rLWJhc2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXNpbXBsZS1saW5rLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1jaS11Y3BlLWhvc3QtbGluay5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktdWNwZS1saW5rLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1jaS12bC1saW5rLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1jaS12bC11Y3BlLWxpbmsuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2xpbmtzLWZhY3RvcnkuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL21vZHVsZS1ncmFwaC1saW5rcy9tb2R1bGUtY2ktbGluay1iYXNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9tb2R1bGUtZ3JhcGgtbGlua3MvbW9kdWxlLWNpLXZsLWxpbmsuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoVG9vbHRpcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvbGluay1tZW51LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9tYXRjaC1yZWxhdGlvbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvYmFzZS1jb21tb24tbm9kZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tbW9uLWNpLW5vZGUtYmFzZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS1iYXNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLWNwLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtdWNwZS1jcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS11Y3BlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXZmLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXZmYy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS12bC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvbW9kdWxlcy1ncmFwaC1ub2Rlcy9tb2R1bGUtbm9kZS1iYXNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9ub2Rlcy1mYWN0b3J5LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9ncmFwaC9wb2ludC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvcmVsYXRpb25NZW51T2JqZWN0cy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvZ3JhcGgvcmVsYXRpb25zaGlwLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy9pbnB1dHMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2luc3RhbmNlLWlucHV0cy1wcm9wZXJ0aWVzLW1hcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvaW5zdGFuY2VzLWlucHV0cy1tYXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL2xlZnQtcGFuZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL21lbWJlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvbW9kdWxlcy9iYXNlLW1vZHVsZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvcHJvcGVydGllcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvcmVxdWlyZW1lbnQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL3NjaGVtYS1hdHRyaWJ1dGUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kZWxzL3RhYi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9tb2RlbHMvdG9vbHRpcC1kYXRhLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy91c2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZGVscy92YWxpZGF0ZS5qcyI+PC9zY3JpcHQ+Cis8IS0tIGVuZGluamVjdG9yOmpzX21vZGVscyAtLT4KKworPHNjcmlwdCBzcmM9InRoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9idWlsZC9uZy1pbmZpbml0ZS1zY3JvbGwuanMiPjwvc2NyaXB0PgorCis8IS0tIGluamVjdG9yOmpzX2ZpbHRlcnMgLS0+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9maWx0ZXJzL19jYXRlZ29yeS1uYW1lLWZpbHRlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9maWx0ZXJzL2NhcGl0YWxpemUtZmlsdGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2ZpbHRlcnMvY2F0YWxvZy1zdGF0dXMtZmlsdGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2ZpbHRlcnMvY2F0ZWdvcnktaWNvbi1maWx0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZmlsdGVycy9jYXRlZ29yeS10eXBlLWZpbHRlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9maWx0ZXJzL2NsZWFyLXdoaXRlc3BhY2VzLWZpbHRlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9maWx0ZXJzL2VudGl0eS1maWx0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZmlsdGVycy9ncmFwaC1yZXNvdXJjZS1uYW1lLWZpbHRlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9maWx0ZXJzL3Byb2R1Y3QtY2F0ZWdvcnktbmFtZS1maWx0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZmlsdGVycy9wcm9kdWN0LXN1YmNhdGVnb3J5LW5hbWUtZmlsdGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2ZpbHRlcnMvcmVsYXRpb24tbmFtZS1mbGx0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZmlsdGVycy9yZXNvdXJjZS1uYW1lLWZpbHRlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9maWx0ZXJzL3Jlc291cmNlLXR5cGUtZmlsdGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2ZpbHRlcnMvc3RyaW5nLXRvLWRhdGUtZmlsdGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2ZpbHRlcnMvdGVzdHMtaWQtZmlsdGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2ZpbHRlcnMvdHJpbS1maWx0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZmlsdGVycy90cnVuY2F0ZS1maWx0ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZmlsdGVycy91bmRlcnNjb3JlbGVzcy1maWx0ZXIuanMiPjwvc2NyaXB0PgorPCEtLSBlbmRpbmplY3Rvcjpqc19maWx0ZXJzIC0tPgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kdWxlcy9maWx0ZXJzLmpzIj48L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9InRoaXJkLXBhcnR5L1B1bmNoT3V0UmVnaXN0cnkuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gaW5qZWN0b3I6anNfZGlyZWN0aXZlcyAtLT4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvY2xpY2tlZC1vdXRzaWRlL2NsaWNrZWQtb3V0c2lkZS1kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9jdXN0b20tdmFsaWRhdGlvbi9jdXN0b20tdmFsaWRhdGlvbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2Rvd25sb2FkLWFydGlmYWN0L2Rvd25sb2FkLWFydGlmYWN0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvZWNvbXAtaGVhZGVyL2Vjb21wLWhlYWRlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2VkaXQtbmFtZS1wb3BvdmVyL2VkaXQtbmFtZS1wb3BvdmVyLWRpcmVjdGl2ZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2VsZW1lbnRzL2NoZWNrYm94L2NoZWNrYm94LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvcmFkaW9idXR0b24vcmFkaW9idXR0b24uanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9lbGxpcHNpcy9lbGxpcHNpcy1kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9ldmVudHMvb24tbGFzdC1yZXBlYXQvb24tbGFzdC1yZXBlYXQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9maWxlLW9wZW5lci9maWxlLW9wZW5lci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2ZpbGUtdHlwZS9maWxlLXR5cGUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21tb24vY29tbW9uLWdyYXBoLXV0aWxzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbW1vbi9zdHlsZS9jb21wb25lbnQtaW5zdGFuY2VzLW5vZGVzLXN0eWxlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbW1vbi9zdHlsZS9tb2R1bGUtbm9kZS1zdHlsZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC9jb21wb3NpdGlvbi1ncmFwaC5kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvdXRpbHMvY29tcG9zaXRpb24tZ3JhcGgtZ2VuZXJhbC11dGlscy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy11dGlscy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy11dGlscy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9tYXRjaC1jYXBhYmlsaXR5LXJlcXVpZXJtZW50LXV0aWxzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2RlcGxveW1lbnQtZ3JhcGgvZGVwbG95bWVudC1ncmFwaC5kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LXV0aWxzL2RlcGxveW1lbnQtZ3JhcGgtZ2VuZXJhbC11dGlscy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9pbWFnZS1jcmVhdG9yL2ltYWdlLWNyZWF0b3Iuc2VydmljZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9wYWxldHRlL3BhbGV0dGUuZGlyZWN0aXZlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3JlbGF0aW9uLW1lbnUvcmVsYXRpb24tbWVudS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2luZm8tdG9vbHRpcC9pbmZvLXRvb2x0aXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9pbnZhbGlkLWNoYXJhY3RlcnMvaW52YWxpZC1jaGFyYWN0ZXJzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1uYXYvdG9wLW5hdi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL2xheW91dC90b3AtcHJvZ3Jlc3MvdG9wLXByb2dyZXNzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvbG9hZGVyL2xvYWRlci1kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9tb2RhbC9zZGMtbW9kYWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9wYWdlLXNjcm9sbGVyL3BhZ2Utc2Nyb2xsZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9wZXJmZWN0LXNjcm9sbGJhci9hbmd1bGFyLXBlcmZlY3Qtc2Nyb2xsYmFyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvcHJpbnQtZ3JhcGgtc2NyZWVuL3ByaW50LWdyYXBoLXNjcmVlbi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1saXN0L3R5cGUtbGlzdC1kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy90eXBlLW1hcC90eXBlLW1hcC1kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy9wdW5jaC1vdXQvcHVuY2gtb3V0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvc2RjLXRhYnMvc2RjLXNpbmdsZS10YWIvc2RjLXNpbmdsZS10YWItZGlyZWN0aXZlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvc2RjLXRhYnMvc2RjLXRhYnMtZGlyZWN0aXZlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvc3RydWN0dXJlLXRyZWUvc3RydWN0dXJlLXRyZWUtZGlyZWN0aXZlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvdGFnL3RhZy1kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy90dXRvcmlhbC90dXRvcmlhbC1kaXJlY3RpdmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy91c2VyLWhlYWRlci1kZXRhaWxzL3VzZXItaGVhZGVyLWRldGFpbHMtZGlyZWN0aXZlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94L2V4cGFuZC1jb2xsYXBzLW1lbnUtYm94LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlL2V4cGFuZC1jb2xsYXBzZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3BhZ2Utc2VsZWN0b3IvcGFnZS1zZWxlY3Rvci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkYy1rZXlib2FyZC1ldmVudHMvc2RjLWtleWJvYXJkLWV2ZW50cy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkYy10YWdzL3NkYy10YWdzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjX2Vycm9yX3Rvb2x0aXAvc2RjX2Vycm9yX3Rvb2x0aXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjLW1lc3NhZ2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjLW1lc3NhZ2VzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc21hcnQtdG9vbHRpcC9zbWFydC10b29sdGlwLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvd2l6YXJkX3N0ZXBzL3NkYy13aXphcmQtc3RlcHMuanMiPjwvc2NyaXB0PgorPCEtLSBlbmRpbmplY3Rvcjpqc19kaXJlY3RpdmVzIC0tPgorPHNjcmlwdCBzcmM9InNjcmlwdHMvbW9kdWxlcy9kaXJlY3RpdmUtbW9kdWxlLmpzIj48L3NjcmlwdD4KKworPCEtLSBpbmplY3Rvcjpqc19zZXJ2aWNlcyAtLT4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2FjdGl2aXR5LWxvZy1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2FuZ3VsYXItanMtYnJpZGdlLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvYXZhaWxhYmxlLWljb25zLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvY2FjaGUtc2VydmljZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9zZXJ2aWNlcy9jYXRlZ29yeS1yZXNvdXJjZS1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvY29tcG9uZW50LXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvY29tcG9uZW50cy9wcm9kdWN0LXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvY29tcG9uZW50cy9yZXNvdXJjZS1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvc2VydmljZS1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvdXRpbHMvY29tcG9zaXRpb24tbGVmdC1wYWxldHRlLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvY29uZmlndXJhdGlvbi11aS1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2Nvb2tpZS1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2RhdGEtdHlwZXMtc2VydmljZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9zZXJ2aWNlcy9lY29tcC1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2V2ZW50LWxpc3RlbmVyLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvaGVhZGVyLWludGVyY2VwdG9yLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL2h0dHAtZXJyb3ItaW50ZXJjZXB0b3IuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvbG9hZGVyLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvb25ib2FyZGluZy1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL3Byb2dyZXNzLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvc2VydmljZXMvcmVsYXRpb24taWNvbnMtc2VydmljZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9zZXJ2aWNlcy9zZGMtdmVyc2lvbi1zZXJ2aWNlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3NlcnZpY2VzL3NoYXJpbmctc2VydmljZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9zZXJ2aWNlcy91cmwtdG9iYXNlNjQtc2VydmljZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy9zZXJ2aWNlcy91c2VyLXJlc291cmNlLXNlcnZpY2UuanMiPjwvc2NyaXB0PgorPCEtLSBlbmRpbmplY3Rvcjpqc19zZXJ2aWNlcyAtLT4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZHVsZXMvc2VydmljZS1tb2R1bGUuanMiPjwvc2NyaXB0PgorCis8IS0tIGluamVjdG9yOmpzX3ZpZXdfbW9kZWxzIC0tPgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2FkZC1jYXRlZ29yeS1tb2RhbC9hZGQtY2F0ZWdvcnktbW9kYWwtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRtaW4tZGFzaGJvYXJkLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2NhdGVnb3J5LW1hbmFnZW1lbnQvY2F0ZWdvcnktbWFuYWdlbWVudC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvY2F0YWxvZy9jYXRhbG9nLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9jb21wb25lbnQtdmlld2VyLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2NvdmVyL2Rhc2hib2FyZC1jb3Zlci12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL2Rhc2hib2FyZC9kYXNoYm9hcmQtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9hcnRpZmFjdC1mb3JtL2FydGlmYWN0LWZvcm0tdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9hdHRyaWJ1dGUtZm9ybS9hdHRyaWJ1dGUtZnJvbS12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2Vudi1wYXJhbWV0ZXJzLWZvcm0vZW52LXBhcmFtZXRlcnMtZm9ybS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9wcm9wZXJ0eS1mb3JtL3Byb3BlcnR5LWZvcm0tdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvY29uZmlybWF0aW9uLW1vZGFsL2NvbmZpcm1hdGlvbi1tb2RhbC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9lbWFpbC1tb2RhbC9lbWFpbC1tb2RhbC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9lcnJvci1tb2RhbC9lcnJvci12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2UtYmFzZS1tb2RhbC1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLWNsaWVudC1tb2RhbC9jbGllbnQtbWVzc2FnZS1tb2RhbC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2Utc2VydmVyLW1vZGFsL3NlcnZlci1tZXNzYWdlLW1vZGFsLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL29uYm9hcmRpbmctbW9kYWwvb25ib2FyZGluZy1tb2RhbC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL29uYm9hcmQtdmVuZG9yL29uYm9hcmQtdmVuZG9yLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvcHJlbG9hZGluZy9wcmVsb2FkaW5nLXZpZXcuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvc3VwcG9ydC9zdXBwb3J0LXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvdGFicy9oaWVyYXJjaHkvaGllcmFyY2h5LXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvdHV0b3JpYWwtZW5kL3R1dG9yaWFsLWVuZC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3dlbGNvbWUtc3RlcHMtY29udHJvbGxlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3dlbGNvbWUtdmlldy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtZm9ybS1zdGVwL2FydGlmYWN0LWZvcm0tc3RlcC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2hpZXJhcmNoeS1zdGVwL2hpZXJhcmNoeS1zdGVwLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9pY29ucy1zdGVwL2ljb25zLXN0ZXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnRpZXMtc3RlcC9wcm9wZXJ0aWVzLXN0ZXAuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtY3JlYXRpb24tYmFzZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvd2l6YXJkLXN0YXRlL2NyZWF0ZS13aXphcmQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1zdGF0ZS9lZGl0LXdpemFyZC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvd2l6YXJkLXN0YXRlL2ltcG9ydC13aXphcmQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvYWN0aXZpdHktbG9nL2FjdGl2aXR5LWxvZy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9hdHRyaWJ1dGVzL2F0dHJpYnV0ZXMtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi9jb21wb3NpdGlvbi12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvYXJ0aWZhY3RzL2FydGlmYWN0cy12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvZGV0YWlscy9kZXRhaWxzLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3JlbGF0aW9ucy9yZWxhdGlvbnMtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3N0cnVjdHVyZS9zdHJ1Y3R1cmUtdmlldy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kZXBsb3ltZW50LWFydGlmYWN0cy9kZXBsb3ltZW50LWFydGlmYWN0cy12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQvZGVwbG95bWVudC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwvZGlzcmlidXRpb24tc3RhdHVzLW1vZGFsLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3RyaWJ1dGlvbi12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2dlbmVyYWwvZ2VuZXJhbC12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2ljb25zL2ljb25zLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5mb3JtYXRpb24tYXJ0aWZhY3RzL2luZm9ybWF0aW9uLWFydGlmYWN0cy12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9yZXNvdXJjZS1pbnB1dC9yZXNvdXJjZS1pbnB1dHMtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbnB1dHMvc2VydmljZS1pbnB1dC9zZXJ2aWNlLWlucHV0cy12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL21hbmFnZW1lbnQtd29ya2Zsb3cvbWFuYWdlbWVudC13b3JrZmxvdy12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL25ldHdvcmstY2FsbC1mbG93L25ldHdvcmstY2FsbC1mbG93LXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvZHVjdC1oaWVyYXJjaHkvcHJvZHVjdC1oaWVyYXJjaHktdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9yZXEtYW5kLWNhcGFiaWxpdGllcy9yZXEtYW5kLWNhcGFiaWxpdGllcy12aWV3LW1vZGVsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Rvc2NhLWFydGlmYWN0cy90b3NjYS1hcnRpZmFjdHMtdmlldy1tb2RlbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2Uvd29ya3NwYWNlLXZpZXctbW9kZWwuanMiPjwvc2NyaXB0PgorPCEtLSBlbmRpbmplY3Rvcjpqc192aWV3X21vZGVscyAtLT4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZHVsZXMvdmlldy1tb2RlbC1tb2R1bGUuanMiPjwvc2NyaXB0PgorCis8IS0taW5pdCAtLT4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL21vZHVsZXMvY29uZmlndXJhdGlvbnMuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdHMvYXBwLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHRzL3RlbXBsYXRlcy5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gZW5kYnVpbGQgLS0+CisKKzxzY3JpcHQgc3JjPSIvb25ib2FyZGluZy9wdW5jaC1vdXRzX2VuLmpzIiBhc3luYz48L3NjcmlwdD4KKworPCEtLSBpbmNsdWRlOiAidHlwZSI6ICJqcyIsICJmaWxlcyI6ICJzY3JpcHRzLyouanMiIC0tPgorCis8IS0tIC9pbmNsdWRlIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvbGFuZ3VhZ2VzL2VuX1VTX09TLmpzb24gYi9jYXRhbG9nLXVpL2FwcC9sYW5ndWFnZXMvZW5fVVNfT1MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y2MzllCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvbGFuZ3VhZ2VzL2VuX1VTX09TLmpzb24KQEAgLTAsMCArMSw0MjAgQEAKK3sKKyAgICAiPT09PT09PT09PT0gVkFMSURBVElPTiA9PT09PT09PT09PSI6ICIiLAorICAgICJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiOiAiTWF4IGxlbmd0aCB7e21heH19IGNoYXJhY3RlcnMuIiwKKyAgICAiVkFMSURBVElPTl9FUlJPUl9NSU5fTEVOR1RIIjogIk1pbiBsZW5ndGgge3ttaW59fSBjaGFyYWN0ZXJzLiIsCisgICAgIlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiOiAie3tmaWVsZH19IGlzIHJlcXVpcmVkLiIsCisgICAgIlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI6ICJTcGVjaWFsIGNoYXJhY3RlcnMgbm90IGFsbG93ZWQuIiwKKyAgICAiTEFCRUxfTUFYX1NJWkVfWFgiOiAiTWF4IHNpemUgaXMgdXAgdG8ge3tzaXplfX0iLAorICAgICJMQUJFTF9BTExfRklFTERTX0FSRV9NQU5EQVRPUlkiOiAiQWxsIGZpZWxkcyBhcmUgbWFuZGF0b3J5LiIsCisgICAgIlZBTElEQVRJT05fRVJST1JfQk9PTEVBTiI6ICJWYWx1ZSBzaG91bGQgYmUgJ1RSVUUnIG9yICdGQUxTRScuIiwKKyAgICAiVkFMSURBVElPTl9FUlJPUl9UWVBFIjogIlZhbHVlIHNob3VsZCBiZSBvZiB0eXBlIHt7dHlwZX19LiIsCisgICAgIlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSF9OT1RfSU5DTFVESU5HX05BTUUiOiAiTWF4IGxlbmd0aCB7e21heH19IGNoYXJhY3RlcnMgKGluY2x1ZGluZyBuYW1lIGxlbmd0aCkuIiwKKyAgICAiVkFMSURBVElPTl9FUlJPUl9NQVhfRklMRV9TSVpFIjogIk1heCBmaWxlIHNpemUgaXMgMTAgTUIuIiwKKyAgICAiVkFMSURBVElPTl9FUlJPUl9FTVBUWV9GSUxFIjogIlRoZSBmaWxlIHlvdSB1cGxvYWRlZCB3YXMgZW1wdHksIHBsZWFzZSB1cGxvYWQgYSB2YWxpZCBmaWxlLiIsCisgICAgIlZBTElEQVRJT05fRVJST1JfVkFMVUVfTVVTVF9CRV9DSEFOR0VEIjogIlZhbHVlIG11c3QgYmUgY2hhbmdlZCIsCisKKyAgICAiPT09PT09PT09PT0gR0VORVJBTCA9PT09PT09PT09PSI6ICIiLAorICAgICJHRU5FUkFMX0xBQkVMX1RZUEUiOiAiVHlwZToiLAorICAgICJHRU5FUkFMX0xBQkVMX1ZFUlNJT04iOiAiVmVyc2lvbjoiLAorICAgICJHRU5FUkFMX0xBQkVMX0NBVEVHT1JZIjogIkNhdGVnb3J5OiIsCisgICAgIkdFTkVSQUxfTEFCRUxfU1VCX0NBVEVHT1JZIjogIlN1YiBDYXRlZ29yeToiLAorICAgICJHRU5FUkFMX0xBQkVMX0NSRUFUSU9OX0RBVEUiOiAiQ3JlYXRpb24gRGF0ZToiLAorICAgICJHRU5FUkFMX0xBQkVMX0FVVEhPUiI6ICJBdXRob3I6IiwKKyAgICAiR0VORVJBTF9MQUJFTF9DT05UQUNUX0lEIjogIkNvbnRhY3QgSUQ6IiwKKyAgICAiR0VORVJBTF9MQUJFTF9TVEFUVVMiOiAiU3RhdHVzOiIsCisgICAgIkdFTkVSQUxfTEFCRUxfUFJPSkVDVF9DT0RFIjogIlByb2plY3QgY29kZToiLAorICAgICJHRU5FUkFMX0xBQkVMX0RFU0NSSVBUSU9OIjogIkRlc2NyaXB0aW9uOiIsCisgICAgIkdFTkVSQUxfTEFCRUxfVEFHUyI6ICJUYWdzOiIsCisgICAgIkdFTkVSQUxfTEFCRUxfUkVTT1VSQ0VfVFlQRSI6ICJSZXNvdXJjZSBUeXBlOiIsCisgICAgIkdFTkVSQUxfTEFCRUxfVkVORE9SX05BTUUiOiAiVmVuZG9yIE5hbWU6IiwKKyAgICAiR0VORVJBTF9MQUJFTF9WRU5ET1JfUkVMRUFTRSI6ICJWZW5kb3IgUmVsZWFzZToiLAorICAgICJHRU5FUkFMX0xBQkVMX0xJQ0VOU0VfVFlQRSI6ICJMaWNlbnNlIFR5cGU6IiwKKyAgICAiR0VORVJBTF9MQUJFTF9TRVJWSUNFIjogIlNlcnZpY2U6IiwKKyAgICAiR0VORVJBTF9MQUJFTF9SRVNPVVJDRSI6ICJSZXNvdXJjZToiLAorICAgICJHRU5FUkFMX0xBQkVMX1BST0RVQ1QiOiAiUHJvZHVjdDoiLAorCisgICAgIj09PT09PT09PT09IEdFTkVSQUwgRVJST1IgUEFHRVMgPT09PT09PT09PT0iOiAiIiwKKyAgICAiR0VORVJBTF9FUlJPUl80MDNfVElUTEUiOiAiU0RDIiwKKyAgICAiR0VORVJBTF9FUlJPUl80MDNfREVTQ1JJUFRJT04iOiAiU29ycnksIFlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdmlldyB0aGlzIHBhZ2UsIFBsZWFzZSBjb250YWN0IHRoZSA8YSBkYXRhLW5nLWhyZWY9J21haWx0bzp7e21haWx0b319Jz4gU2VydmljZSBEZXNpZ24gYW5kIENyZWF0aW9uIGFkbWluaXN0cmF0b3I8L2E+IGZvciBhY2Nlc3MgcGVybWlzc2lvbi4iLAorCisgICAgIj09PT09PT09PT09IEVSUk9SIFZJRVcgTU9ERUwgPT09PT09PT09PT0iOiAiIiwKKyAgICAiQURNSU5fRU1BSUwiOiAiIiwKKyAgICAiRU1BSUxfU1VCSkVDVF9QUkVGSVgiOiAiU0RDIEFjY2VzcyBSZXF1ZXN0IGZvciIsCisKKyAgICAiPT09PT09PT09PT0gVE9QIE1FTlUgPT09PT09PT09PT0iOiAiIiwKKyAgICAiVE9QX01FTlVfSE9NRV9CVVRUT04iOiAiSE9NRSIsCisgICAgIlRPUF9NRU5VX0NBVEFMT0dfQlVUVE9OIjogIkNBVEFMT0ciLAorICAgICJUT1BfTUVOVV9PTl9CT0FSRF9CVVRUT04iOiAiT05CT0FSRCIsCisKKyAgICAiPT09PT09PT09PT0gU0lHTiBJTiBQQUdFID09PT09PT09PT09IjogIiIsCisgICAgIlNJR05fSU5fQ0FQVElPTiI6ICJTaWduaW5nIGluIiwKKyAgICAiU0lHTl9JTl9ERVNDUklQVElPTiI6ICJQbGVhc2Ugd2FpdC4gSWYgeW91IGFyZSB1c2luZyBJbnRlcm5ldCBFeHBsb3JlciwgcGxlYXNlIHJlYXR0ZW1wdCBhY2Nlc3MgdXNpbmcgQ2hyb21lIG9yIEZpcmVmb3guIiwKKworICAgICI9PT09PT09PT09PSBUVVRPUklBTCBQQUdFID09PT09PT09PT09IjogIiIsCisgICAgIlRVVFJJQUxfR0VORVJBTF9QUkVWSU9VU19CVVRUT04iOiAicHJldiIsCisgICAgIlRVVFJJQUxfR0VORVJBTF9ORVhUX0JVVFRPTiI6ICJuZXh0IiwKKyAgICAiVFVUUklBTF9HRU5FUkFMX1NLSVBfQlVUVE9OIjogInNraXAiLAorICAgICJUVVRSSUFMX0dFTkVSQUxfQ0xPU0VfQlVUVE9OIjogImNsb3NlIiwKKyAgICAiVFVUUklBTF9HRU5FUkFMX05FWFRfQlVUVE9OX0VORCI6ICJkb25lIiwKKworICAgICJUVVRSSUFMX0dFTkVSQUxfVEFCXzEiOiAiV29ya3NwYWNlIiwKKyAgICAiVFVUUklBTF9HRU5FUkFMX1RBQl8yIjogIkNhdGFsb2ciLAorICAgICJUVVRSSUFMX0dFTkVSQUxfVEFCXzMiOiAiRGVzaWduIFN0dWRpbyIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTFfVElUTEUiOiAiWW91ciBQZXJzb25hbCBXb3Jrc3BhY2UiLAorICAgICJUVVRPUklBTF9QQUdFMV9URVhUIjogIlNEQyBrZWVwcyB0cmFjayBvZiB0aGUgUmVzb3VyY2VzIGFuZCBTZXJ2aWNlcyB5b3UgYXJlIGFzc2lnbmVkIHRvIHdvcmsgb24uIFlvdSBhY2Nlc3MgdGhlc2UgYXNzZXRzIGRpcmVjdGx5IGZyb20geW91ciBXb3Jrc3BhY2UuIiwKKworICAgICJUVVRPUklBTF9QQUdFMl9USVRMRSI6ICJGb2xkZXJzIiwKKyAgICAiVFVUT1JJQUxfUEFHRTJfVEVYVCI6ICJZb3VyIHBlcnNvbmFsIFdvcmtzcGFjZSBzaG93cyB0aGUgUmVzb3VyY2VzIGFuZCBTZXJ2aWNlcyBvbiB3aGljaCB5b3UgaGF2ZSByZWNlbnRseSB3b3JrZWQuIFRvIHZpZXcgYSBzdWJzZXQsIGZpbHRlciBieSBzZWxlY3RpbmcgYSBmb2xkZXIgZnJvbSB0aGUgbGVmdCBwYW5lLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTNfVElUTEUiOiAiQXNzZXRzIFN0YXR1cyBhbmQgVHlwZSIsCisgICAgIlRVVE9SSUFMX1BBR0UzX1RFWFQiOiAiRWFjaCBvZiB5b3VyIGFzc2V0cyBpcyByZXByZXNlbnRlZCBhcyBhbiBpdGVtIG9uIHlvdXIgV29ya3NwYWNlLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTRfVElUTEUiOiAiQXNzZXQgVHlwZSIsCisgICAgIlRVVE9SSUFMX1BBR0U0X1RFWFQiOiAiQXQgdGhlIHRvcCBsZWZ0IGNvcm5lciwgUiBpbmRpY2F0ZXMgYSBSZXNvdXJjZSBhbmQgUyBpbmRpY2F0ZXMgYSBTZXJ2aWNlLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTVfVElUTEUiOiAiQXNzZXQgTmFtZSIsCisgICAgIlRVVE9SSUFMX1BBR0U1X1RFWFQiOiAiQXQgdGhlIGJvdHRvbSwgUmVzb3VyY2Ugb3IgU2VydmljZSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciBhcmUgZGlzcGxheWVkLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTZfVElUTEUiOiAiQXNzZXQgSWNvbiIsCisgICAgIlRVVE9SSUFMX1BBR0U2X1RFWFQiOiAiQSBSZXNvdXJjZSBvciBTZXJ2aWNlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGljb24gY2hvc2VuIGJ5IHRoZSBEZXNpZ25lci4iLAorCisgICAgIlRVVE9SSUFMX1BBR0U3X1RJVExFIjogIkFzc2V0IFN0YXR1cyIsCisgICAgIlRVVE9SSUFMX1BBR0U3X1RFWFQiOiAiSW4gdGhlIHRvcCByaWdodCBjb3JuZXIsIGFuIGluZGljYXRpb24gb2YgdGhlIGFzc2V0J3MgY3VycmVudCBzdGF0dXMgaXMgZGlzcGxheWVkLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRThfVElUTEUiOiAiQXNzZXQgTWVudSIsCisgICAgIlRVVE9SSUFMX1BBR0U4X1RFWFQiOiAiSG92ZXIgb3ZlciB0aGUgdGhyZWUgdmVydGljYWwgZG90cyB0byB2aWV3IGEgbWVudSBvZiBhY3Rpb25zIHlvdSBjYW4gcmVxdWVzdCBmb3IgdGhlIFJlc291cmNlIG9yIFNlcnZpY2UuIiwKKworICAgICJUVVRPUklBTF9QQUdFOV9USVRMRSI6ICJTREMgQ2F0YWxvZyIsCisgICAgIlRVVE9SSUFMX1BBR0U5X1RFWFQiOiAiSW4gdGhlIFNEQyBDYXRhbG9nIHlvdSBjYW4gdmlldyBhbGwgYXZhaWxhYmxlIFJlc291cmNlcyBhbmQgU2VydmljZXMuIEFjY2VzcyB0aGUgQ2F0YWxvZyBieSBjbGlja2luZyBDYXRhbG9nIGluIHRoZSBsZWZ0IHBhbmUuIiwKKworICAgICJUVVRPUklBTF9QQUdFMTBfVElUTEUiOiAiQ2F0YWxvZyBGaWx0ZXJpbmciLAorICAgICJUVVRPUklBTF9QQUdFMTBfVEVYVCI6ICJZb3UgY2FuIGZpbHRlciB0aGUgUmVzb3VyY2VzIGFuZCBTZXJ2aWNlcyBkaXNwbGF5ZWQgaW4gdGhlIENhdGFsb2cuIENsaWNrIG9uIGNvbWJpbmF0aW9ucyBvZiB0aGUgVHlwZSwgQ2F0ZWdvcnksIGFuZCBTdGF0ZSBjcml0ZXJpYSBkaXNwbGF5ZWQgaW4gdGhlIGxlZnQgcGFuZSB0byBmaWx0ZXIgYnkgdGhvc2UgY3JpdGVyaWEuIiwKKworICAgICJUVVRPUklBTF9QQUdFMTFfVElUTEUiOiAiQ2F0YWxvZyBTZWFyY2giLAorICAgICJUVVRPUklBTF9QQUdFMTFfVEVYVCI6ICJZb3UgY2FuIGFsc28gZmlsdGVyIGJ5IHVzaW5nIHRoZSBzZWFyY2ggYmFyLiBUeXBlIGEgdGVybSwgb3IgbXVsdGlwbGUgdGVybXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gQWxsIFJlc291cmNlcyBhbmQgU2VydmljZXMgd2l0aCBhIE5hbWUsIFRhZywgb3IgRGVzY3JpcHRpb24gY29udGFpbmluZyB0aGUgc2VhcmNoIHRlcm0ocykgd2lsbCBiZSBkaXNwbGF5ZWQuIiwKKworICAgICJUVVRPUklBTF9QQUdFMTJfVElUTEUiOiAiRGVzaWduIFN0dWRpbyIsCisgICAgIlRVVE9SSUFMX1BBR0UxMl9URVhUIjogIkFzIGEgRGVzaWduZXIsIHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgRGVzaWduIFN0dWRpby4gWW91IGNhbiBhZGQsIGNoYW5nZSwgYW5kIGRlbGV0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGEgUmVzb3VyY2Ugb3IgU2VydmljZS4iLAorCisgICAgIlRVVE9SSUFMX1BBR0UxM19USVRMRSI6ICJDcmVhdGUgJiBNb2RpZnkgQXNzZXQiLAorICAgICJUVVRPUklBTF9QQUdFMTNfVEVYVCI6ICJGcm9tIHlvdXIgcGVyc29uYWwgV29ya3NwYWNlIHlvdSBjYW46PHVsPjxsaT5DcmVhdGUgYSBOZXcgUmVzb3VyY2Ugb3IgU2VydmljZSAoQ2xpY2sgQ3JlYXRlIE5ldyk8L2xpPjxsaT5Nb2RpZnkgYW4gZXhpc3RpbmcgU2VydmljZSBvciBSZXNvdXJjZSAodXNpbmcgdGhlIG1lbnUgYWN0aW9ucyk8L2xpPjwvdUw+IiwKKworICAgICJUVVRPUklBTF9QQUdFMTRfVElUTEUiOiAiQ3JlYXRlIE5ldyBBc3NldCIsCisgICAgIlRVVE9SSUFMX1BBR0UxNF9URVhUIjogIldoZW4geW91IGNyZWF0ZSBhIG5ldyBSZXNvdXJjZSBvciBTZXJ2aWNlLCB5b3UgbmVlZCB0byBmaWxsIGluIHByb2ZpbGUgZGF0YSB0byBjcmVhdGUgYSBuZXcgQ2F0YWxvZyBlbnRyeS4iLAorCisgICAgIlRVVE9SSUFMX1BBR0UxNV9USVRMRSI6ICJMZWZ0IFBhbmUiLAorICAgICJUVVRPUklBTF9QQUdFMTVfVEVYVCI6ICJJbiBjcmVhdGluZyBvciBlZGl0aW5nIGEgU2VydmljZSwgeW91IGNhbiBjaG9vc2UgZWxlbWVudHMgZnJvbSB0aGUgbGVmdCBwYW5lIHRvIGFkZCB0byB5b3VyIFNlcnZpY2UuIFlvdSBjYW4gZW50ZXIgc2VhcmNoIGNyaXRlcmlhIHRvIGNoYW5nZSB0aGUgdmlzaWJsZSBlbGVtZW50cyBpbiB0aGUgbGVmdCBwYW5lLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTE2X1RJVExFIjogIkRyYWcgJiBEcm9wIiwKKyAgICAiVFVUT1JJQUxfUEFHRTE2X1RFWFQiOiAiVG8gaW5jbHVkZSBhbiBlbGVtZW50IGluIHlvdXIgU2VydmljZSwgZHJhZyBpdCBvbnRvIHRoZSBEZXNpZ24gU3R1ZGlvLiBJZiBhIGdyZWVuIGd1aWRlIGluZGljYXRpb24gYXBwZWFycywgZHJvcCB0aGUgZWxlbWVudCBuZWFyIHRoZSBndWlkZSBhbmQgdGhlIERlc2lnbiBTdHVkaW8gd2lsbCBhdXRvbWF0aWNhbGx5IGNvbm5lY3QgdGhlIHR3byBlbGVtZW50cyBmb3IgeW91LiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTE3X1RJVExFIjogIlJlbGF0aW9uc2hpcCBTZWxlY3Rpb24iLAorICAgICJUVVRPUklBTF9QQUdFMTdfVEVYVCI6ICJXaGVuIHlvdSBjb25uZWN0IHR3byBlbGVtZW50cywgeW91IGNhbiBkZWZpbmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB0d28uIERlc2lnbiBTdHVkaW8gd2lsbCBkaXNwbGF5IHRoZSBhbGxvd2VkIHJlbGF0aW9uc2hpcHMgZnJvbSB3aGljaCB5b3UgY2FuIGNob29zZS4iLAorCisgICAgIlRVVE9SSUFMX1BBR0UxOF9USVRMRSI6ICJWaWV3ICYgRGVsZXRlIFJlbGF0aW9uc2hpcCIsCisgICAgIlRVVE9SSUFMX1BBR0UxOF9URVhUIjogIllvdSBjYW4gdmlldyBvciBkZWxldGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB0d28gZWxlbWVudHMgYnkgc2VsZWN0aW5nIHRoZSByZWxhdGlvbnNoaXAgaWNvbiBvbiB0aGUgY29ubmVjdGluZyBsaW5lLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTE5X1RJVExFIjogIkluZm9ybWF0aW9uIHRhYiIsCisgICAgIlRVVE9SSUFMX1BBR0UxOV9URVhUIjogIkhlcmUgeW91IGNhbiByZXZpZXcgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUmVzb3VyY2UsIHN1Y2ggYXMgdmVyc2lvbiwgY2F0ZWdvcnksIGF1dGhvciwgYW5kIGRlc2NyaXB0aW9uLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTIwX1RJVExFIjogIlN0cnVjdHVyZSB0YWIiLAorICAgICJUVVRPUklBTF9QQUdFMjBfVEVYVCI6ICJIZXJlIHlvdSBjYW4gcmV2aWV3IHRoZSBzdHJ1Y3R1cmFsIGNvbXBvbmVudHMgb2YgdGhlIFJlc291cmNlIGluIGEgaGllcmFyY2hpY2FsIHRyZWUgZGlhZ3JhbSwgaW5jbHVkaW5nIGFueSBjb25uZWN0ZWQgUmVzb3VyY2VzLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTIxX1RJVExFIjogIkRlcGxveW1lbnQgQXJ0aWZhY3RzIHRhYiIsCisgICAgIlRVVE9SSUFMX1BBR0UyMV9URVhUIjogIkhlcmUgeW91IGNhbiB2aWV3IGFuZCBtYW5hZ2UgdGhlIEFydGlmYWN0IGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVzb3VyY2UuIFlvdSBjYW4gZG93bmxvYWQgZXhpc3RpbmcgZmlsZXMsIHVwbG9hZCBhZGRpdGlvbmFsIGZpbGVzLCBhbmQgbWFuYWdlIEhFQVQgdGVtcGxhdGUgcGFyYW1ldGVycy4iLAorCisgICAgIlRVVE9SSUFMX1BBR0UyMl9USVRMRSI6ICJQcm9wZXJ0aWVzIHRhYiIsCisgICAgIlRVVE9SSUFMX1BBR0UyMl9URVhUIjogIkhlcmUgeW91IGNhbiBtYW5hZ2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFJlc291cmNlLiBZb3UgY2FuIHZpZXcsIGVkaXQsIGFkZCBhbmQgZGVsZXRlIHByb3BlcnRpZXMuIiwKKworICAgICJUVVRPUklBTF9QQUdFMjNfVElUTEUiOiAiSW5mb3JtYXRpb24gQXJ0aWZhY3RzIHRhYiIsCisgICAgIlRVVE9SSUFMX1BBR0UyM19URVhUIjogIkhlcmUgeW91IGNhbiBtYW5hZ2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVzb3VyY2UgKHN1Y2ggYXMgdGVzdCBzY3JpcHRzLCBmZWF0dXJlcywgYW5kIGNhcGFjaXR5KS4iLAorCisgICAgIlRVVE9SSUFMX1BBR0UyNF9USVRMRSI6ICJSZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcyB0YWIiLAorICAgICJUVVRPUklBTF9QQUdFMjRfVEVYVCI6ICJIZXJlIHlvdSBjYW4gdmlldyB0aGUgUmVzb3VyY2UgY2FwYWJpbGl0aWVzIGFuZCByZXF1aXJlbWVudHMsIGFuZCBmcm9tIHdoZXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIGRlcml2ZWQuICBJZiBhIFJlc291cmNlIGlzIGNvbm5lY3RlZCB0byBvdGhlciBSZXNvdXJjZXMsIHRoZSByZWxhdGlvbnNoaXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbiBpcyByZWZsZWN0ZWQgKGluIHRoZSBSZXF1aXJlbWVudHMgc2VjdGlvbikgb2YgdGhpcyB0YWIuIiwKKworICAgICJUVVRPUklBTF9QQUdFMjVfVElUTEUiOiAiSW5mb3JtYXRpb24gdGFiIiwKKyAgICAiVFVUT1JJQUxfUEFHRTI1X1RFWFQiOiAiSGVyZSB5b3UgY2FuIHZpZXcgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU2VydmljZSwgc3VjaCBhcyB2ZXJzaW9uLCBjYXRlZ29yeSwgYXV0aG9yLCBhbmQgZGVzY3JpcHRpb24uIiwKKworICAgICJUVVRPUklBTF9QQUdFMjZfVElUTEUiOiAiU3RydWN0dXJlIHRhYiIsCisgICAgIlRVVE9SSUFMX1BBR0UyNl9URVhUIjogIkhlcmUgeW91IGNhbiB2aWV3IHRoZSBTZXJ2aWNlIHN0cnVjdHVyZSBpbiBhIGhpZXJhcmNoaWNhbCB0cmVlIGRpYWdyYW0sIGluY2x1ZGluZyB0aGUgY29tcG9uZW50IFJlc291cmNlcy4iLAorCisgICAgIlRVVE9SSUFMX1BBR0UyN19USVRMRSI6ICJEZXBsb3ltZW50IEFydGlmYWN0cyB0YWIiLAorICAgICJUVVRPUklBTF9QQUdFMjdfVEVYVCI6ICJIZXJlIHlvdSBjYW4gdmlldyBhbmQgbWFuYWdlIHRoZSBBcnRpZmFjdCBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UuIFlvdSBjYW4gZG93bmxvYWQgZXhpc3RpbmcgZmlsZXMsIHVwbG9hZCBhZGRpdGlvbmFsIGZpbGVzLCBhbmQgbWFuYWdlIEhFQVQgdGVtcGxhdGUgcGFyYW1ldGVycy4iLAorCisgICAgIlRVVE9SSUFMX1BBR0UyOF9USVRMRSI6ICJJbnB1dHMgdGFiIiwKKyAgICAiVFVUT1JJQUxfUEFHRTI4X1RFWFQiOiAiSGVyZSB5b3UgY2FuIHZpZXcgYW5kIGVkaXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFNlcnZpY2UsIGFuZCBzZWUgZnJvbSB3aGljaCBSZXNvdXJjZSB0aGUgcGFyYW1ldGVycyBvcmlnaW5hdGVkLiBQcm9wZXJ0aWVzIGFyZSBncm91cGVkIGJ5IFJlc291cmNlIGluc3RhbmNlLiIsCisKKyAgICAiVFVUT1JJQUxfUEFHRTI5X1RJVExFIjogIkluZm9ybWF0aW9uIEFydGlmYWN0cyB0YWIiLAorICAgICJUVVRPUklBTF9QQUdFMjlfVEVYVCI6ICJIZXJlIHlvdSBjYW4gbWFuYWdlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UgKHN1Y2ggYXMgc2VydmljZSB0b3BvbG9neSwgbWVzc2FnZSBmbG93cywgYW5kIG1hbmFnZW1lbnQgZmxvd3MpLiBTb21lIG9mIHRoZXNlIGRvY3VtZW50cyBhcmUgY3JlYXRlZCBieSBlbWJlZGRlZCB0b29scywgc3VjaCBhcyBBU0UgdG9vbHMuIiwKKworICAgICJUVVRPUklBTF9QQUdFMzBfVElUTEUiOiAiQVBJIHRhYiIsCisgICAgIlRVVE9SSUFMX1BBR0UzMF9URVhUIjogIkhlcmUgeW91IGNhbiBtYW5hZ2UgdGhlIFNlcnZpY2UgQVBJIChzdWNoIGFzIG1vbml0b3JpbmcgYW5kIGluc3RhbnRpYXRpb24pLCBhbmQgeW91IGNhbiB1cGxvYWQgYW4gYXJjaGl2ZSBjb250YWluaW5nIHRoZSBIVE1MIHBhZ2VzIGFuZCB0aGUgQVBJIFVSTC4iLAorCisgICAgIlRVVE9SSUFMX0xBU1RfUEFHRV9USVRMRSI6ICJHcmVhdCEiLAorICAgICJUVVRPUklBTF9MQVNUX1BBR0VfVEVYVCI6ICJOb3cgdGhhdCB5b3UgYXJlIGZhbWlsaWFyIHdpdGggdGhlIHN5c3RlbSwgeW91IGNhbiBiZWdpbiBidWlsZGluZyEiLAorICAgICJUVVRPUklBTF9MQVNUX1BBR0VfQlROX0FDVElPTl9NWV9EQVNIQk9BUkQiOiAiTXkgRGFzaGJvYXJkIiwKKworICAgICI9PT09PT09PT09PSBDQVRBTE9HIFBBR0UgPT09PT09PT09PT0iOiAiIiwKKyAgICAiSEVBREVSX0NBUFRJT05fQ0FUQUxPRyI6ICJDYXRhbG9nIiwKKyAgICAiU09SVF9DQVBUSU9OIjogIk9yZGVyIEJ5OiIsCisgICAgIlNPUlRfQllfVVBEQVRFX0RBVEUiOiAiTGFzdCB1cGRhdGVkIiwKKyAgICAiU09SVF9BTFBIQUJFVElDQUwiOiAiQWxwaGFiZXRpY2FsIG9yZGVyIiwKKworCisgICAgIj09PT09PT09PT09IEhFQURFUiBQQUdFID09PT09PT09PT09IjogIiIsCisgICAgIkhFQURFUl9IRUxQX1RFWFRfQ0FUQUxPR19UVVRPUklBTCI6ICJDYXRhbG9nIFR1dG9yaWFsIiwKKyAgICAiSEVBREVSX0hFTFBfVEVYVF9ERVNJR05FUl9UVVRPUklBTCI6ICJEZXNpZ24gU3R1ZGlvIFR1dG9yaWFsIiwKKyAgICAiSEVBREVSX0hFTFBfVEVYVF9XT1JLU1BBQ0VfVFVUT1JJQUwiOiAiV29ya3NwYWNlIFR1dG9yaWFsIiwKKworICAgICI9PT09PT09PT09PSBXRUxDT01FIFBBR0UgPT09PT09PT09PT0iOiAiIiwKKyAgICAiV0VMQ09NRV9IRUxMTyI6ICJIZWxsbyB7e3VzZXJuYW1lfX0sIiwKKyAgICAiV0VMQ09NRV9NRVNTQUdFXzEiOiAiV2VsY29tZSB0byBTZXJ2aWNlIERlc2lnbiBhbmQgQ3JlYXRpb24gKFNEQykgUG9ydGFsLiBTREMgc3VwcG9ydHMgRG9tYWluIDIuMCBSZXNvdXJjZSBPbmJvYXJkaW5nIGFuZCBTZXJ2aWNlIENyZWF0aW9uLiIsCisgICAgIldFTENPTUVfTUVTU0FHRV8yIjogIlRoaXMgdHV0b3JpYWwgd2Fsa3MgZmlyc3QtdGltZSB1c2VycyB0aHJvdWdoIHRoZSBTREMgcG9ydGFsIGNvbXBvbmVudHMuICBGdXR1cmUgbG9naW5zIGRpcmVjdGx5IGFjY2VzcyB0aGUgU0RDIHdvcmsgcGxhdGZvcm0gd2l0aG91dCBkaXNwbGF5aW5nIHRoZSB0dXRvcmlhbC4gIFRvIHNlZSB0aGUgdHV0b3JpYWwsIGNsaWNrIHRoZSBUdXRvcmlhbCBsaW5rIG9uIGVhY2ggU0RDIHBhZ2UuIiwKKyAgICAiV0VMQ09NRV9NRVNTQUdFX0NVUlJFTlRfVkVSU0lPTiI6ICJDdXJyZW50IFZlcnNpb24ge3t2ZXJzaW9ufX0iLAorICAgICJXRUxDT01FX01FU1NBR0VfU0VFX1dIQVRTX05FVyI6ICJTZWUgd2hhdCdzIG5ldyIsCisgICAgIldFTENPTUVfQlROX1NUQVJUX1RVVE9SSUFMIjogIkxldCdzIHN0YXJ0IiwKKyAgICAiV0VMQ09NRV9CVE5fU0tJUCI6ICJza2lwIGZvciBub3ciLAorICAgICJXRUxDT01FX0JUTl9BQ1RJT05fREVTSUdOX1NUVURJTyI6ICJEZXNpZ24gU3R1ZGlvIiwKKyAgICAiV0VMQ09NRV9CVE5fQUNUSU9OX0NFUlRJRklDQVRJT05fU1RVRElPIjogIlRlc3RlcidzIFdvcmtzcGFjZSIsCisgICAgIldFTENPTUVfQlROX0FDVElPTl9HT1ZFUk5PUl9CT0FSRCI6ICJHb3Zlcm5hbmNlIEJvYXJkIiwKKyAgICAiV0VMQ09NRV9CVE5fQUNUSU9OX0RJU1RSSUJVVElPTl9TVFVESU8iOiAiRGlzdHJpYnV0aW9uIFN0dWRpbyIsCisgICAgIldFTENPTUVfQlROX0FDVElPTl9DQVRBTE9HIjogIkNhdGFsb2ciLAorCisgICAgIj09PT09PT09PT09IE9OQk9BUkQgVkVORE9SIFBBR0UgPT09PT09PT09PT0iOiAiIiwKKyAgICAiSEVBREVSX0NBUFRJT05fT05CT0FSRCI6Ik9uIEJvYXJkIiwKKworICAgICI9PT09PT09PT09PSBORVcgUkVTT1VSQ0UgU0VSVklDRSA9PT09PT09PT09PSI6ICIiLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9XUkFQUEVSX1RBQl9HRU5FUkFMX0lORk9STUFUSU9OIjogIkdlbmVyYWwgSW5mb3JtYXRpb24iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9XUkFQUEVSX1RBQl9BU1NJR05fUFJPRFVDVF9ISUVSQVJDSFkiOiAiQXNzaWduIFByb2R1Y3QgSGllcmFyY2h5IiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfV1JBUFBFUl9UQUJfQURESVRJT05BTF9JTkZPIjogIkFkZGl0aW9uYWwgSW5mb3JtYXRpb24iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9XUkFQUEVSX1RBQl9CSUxMSU5HX0FORF9PUkRFUklORyI6ICJPcmRlciBBdHRyaWJ1dGVzICYgUnVsZXMiLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9XUkFQUEVSX1RBQl9QUk9EVUNUX0NPTVBPU0lUSU9OIjogIkJpbGwgQXR0cmlidXRlcyAmIFJ1bGVzIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfU0FWRV9CVVRUT04iOiAiU2F2ZSIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0RPTkVfQlVUVE9OIjogIkRvbmUiLAorCisgICAgIj09PT09PT09PT09IE5FVyBSRVNPVVJDRSBTRVJWSUNFIEVSUk9SUyA9PT09PT09PT09PSI6ICIiLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9TRVJWSUNFX05BTUVfUkVRVUlSRUQiOiAiU2VydmljZSBuYW1lIGlzIHJlcXVpcmVkLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX01BWF9MRU5HVEhfMjUiOiAiTWF4IGxlbmd0aCAyNSBjaGFyYWN0ZXJzLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX01BWF9MRU5HVEhfNTAiOiAiTWF4IGxlbmd0aCA1MCBjaGFyYWN0ZXJzLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX01BWF9MRU5HVEhfMTI4IjogIk1heCBsZW5ndGggMTI4IGNoYXJhY3RlcnMuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfTUFYX0xFTkdUSF8xMDI0IjogIk1heCBsZW5ndGggMTAyNCBjaGFyYWN0ZXJzLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX05BTUVfRVhJU1RTIjogIk5hbWUgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfU1BFQ0lBTF9DSEFSUyI6ICJTcGVjaWFsIGNoYXJhY3RlcnMgbm90IGFsbG93ZWQuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfQ0FURUdPUllfUkVRVUlSRUQiOiAiY2F0ZWdvcnkgaXMgcmVxdWlyZWQuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfUFJPSkVDVF9DT0RFX1JFUVVJUkVEIjogIlByb2plY3QgY29kZSBpcyByZXF1aXJlZC4iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9QUk9KRUNUX0NPREVfTk9UX1ZBTElEIjogIlByb2plY3QgY29kZSBpcyBub3QgdmFsaWQuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfQ09OVEFDVF9SRVFVSVJFRCI6ICJDb250YWN0IGlzIHJlcXVpcmVkLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX0NPTlRBQ1RfTk9UX1ZBTElEIjogIkNvbnRhY3QgaXMgbm90IHZhbGlkLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1NFUlZJQ0VfREVTQ1JJUFRJT05fUkVRVUlSRUQiOiAiU2VydmljZSBkZXNjcmlwdGlvbiBpcyByZXF1aXJlZC4iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9NSU5fT05FX1RBRyI6ICJFbnRlciBhdCBsZWFzdCBvbmUgdGFnLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1RBR19OQU1FX0VYSVNUIjogIlRhZyBuYW1lIGFscmVhZHkgZXhpc3RzLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1NFUlZJQ0VfSUNPTiI6ICJJY29uIHJlcXVpcmVkLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1JFU09VUkNFX0lDT04iOiAiSWNvbiByZXF1aXJlZC4iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9SRVNPVVJDRV9OQU1FX1JFUVVJUkVEIjogIk5hbWUgaXMgcmVxdWlyZWQuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfUFJPRFVDVF9OQU1FX1JFUVVJUkVEIjogIk5hbWUgaXMgcmVxdWlyZWQuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfUkVTT1VSQ0VfREVTQ1JJUFRJT05fUkVRVUlSRUQiOiAiRGVzY3JpcHRpb24gaXMgcmVxdWlyZWQuIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfUFJPRFVDVF9ERVNDUklQVElPTl9SRVFVSVJFRCI6ICJEZXNjcmlwdGlvbiBpcyByZXF1aXJlZC4iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9WRU5ET1JfTkFNRV9SRVFVSVJFRCI6ICJWZW5kb3IgbmFtZSBpcyByZXF1aXJlZC4iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9WRU5ET1JfUkVMRUFTRV9SRVFVSVJFRCI6ICJWZW5kb3IgUmVsZWFzZSBpcyByZXF1aXJlZC4iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9URU1QTEFURV9SRVFVSVJFRCI6ICJUZW1wbGF0ZSBpcyByZXF1aXJlZC4iLAorICAgICJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9UQUdfUEFUVEVSTiI6ICJ7e3RleHR9fSIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1ZBTElEX1RPU0NBX0VYVEVOU0lPTlNfVElUTEUiOiAiSW52YWxpZCBUb3NjYSBmaWxlIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfVkFMSURfVE9TQ0FfRVhURU5TSU9OUyI6ICJGaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUge3tleHRlbnNpb25zfX0uIiwKKyAgICAiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfVE9TQ0FfRklMRV9SRVFVSVJFRCI6ICJUb3NjYSBmaWxlIGlzIHJlcXVpcmVkLiIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1ZBTElEX0NTQVJfRVhURU5TSU9OU19USVRMRSI6ICJJbnZhbGlkIGNzYXIgZmlsZSIsCisgICAgIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1ZBTElEX0NTQVJfRVhURU5TSU9OUyI6ICJGaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUge3tleHRlbnNpb25zfX0uIiwKKyAgICAiTkVXX1BST0RVQ1RfTk9fQ0FURUdPUklFU19UT19ESVNQTEFZIjogIllvdXIgcHJvZHVjdCBpcyBub3QgYXNzaWduZWQgdG8gYW55IGdyb3VwIHlldC4gPGJyPiBUbyBzZWxlY3QvZmluZCBhIGdyb3VwLCBiZWdpbiB0eXBpbmcgYWJvdmUgYW5kIHNlbGVjdCBncm91cCB0byBhZGQiLAorCisgICAgIj09PT09PT09PT09IFNVR0dFU1RFRCBJQ09OUyBUT09MVElQID09PT09PT09PT09IjogIiIsCisgICAgImNhbGxfY29udHJvbGwiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAibW9iaWxpdHkiOiAiTW9iaWxpdHkiLAorICAgICJuZXR3b3JrX2xfMS0zIjogIk5ldHdvcmsgTCAxLTMiLAorICAgICJuZXR3b3JrX2xfNCI6ICJOZXR3b3JrIEwgNCsiLAorICAgICJyb3V0ZXIiOiAiUm91dGVyIiwKKyAgICAiZGF0YWJhc2UiOiAiRGF0YWJhc2UiLAorICAgICJuZXR3b3JrIjogIk5ldHdvcmsiLAorICAgICJvYmplY3RTdG9yYWdlIjogIk9iamVjdCBTdG9yYWdlIiwKKyAgICAiY29ubmVjdG9yIjogIkNvbm5lY3RvciIsCisgICAgImJyb2NhZGUiOiAiQnJvY2FkZSIsCisgICAgImNpc2NvIjogIkNpc2NvIiwKKyAgICAiZXJpY3Nzb24iOiAiRXJpY3Nzb24iLAorICAgICJ0cm9wbyI6ICJUcm9wbyIsCisgICAgImZvcnRpbmV0IjogIkZvcnRpbmV0IiwKKyAgICAiYXR0IjogIkFUJlQiLAorICAgICJicm9hZHNvZnQiOiAiQnJvYWRTb2Z0IiwKKyAgICAiYWxjYXRlbEx1Y2VudCI6ICJBbGNhdGVsLUx1Y2VudCIsCisgICAgIm1ldGFzd2l0Y2giOiAiTWV0YXN3aXRjaCIsCisgICAgImFyaWNlbnQiOiAiQXJpY2VudCIsCisgICAgIm15U3FsIjogIk15U1FMIiwKKyAgICAianVuaXBlciI6ICJKdW5pcGVyIE5ldHdvcmtzIiwKKyAgICAib3JhY2xlIjogIk9yYWNsZSBDb3Jwb3JhdGlvbiIsCisgICAgIm5va2lhX3NpZW1lbnMiOiAiTm9raWEgTmV0d29ya3MiLAorICAgICJib3JkZXJFbGVtZW50IjogIkJvcmRlciBFbGVtZW50IiwKKyAgICAiYXBwbGljYXRpb25TZXJ2ZXIiOiAiQXBwbGljYXRpb24gU2VydmVyIiwKKyAgICAic2VydmVyIjogIlNlcnZlciIsCisgICAgInBvcnQiOiAiUG9ydCIsCisgICAgImxvYWRCYWxhbmNlciI6ICJMb2FkIEJhbGFuY2VyIiwKKyAgICAiY29tcHV0ZSI6ICJDb21wdXRlIiwKKyAgICAiZ2F0ZXdheSI6ICJHYXRld2F5IiwKKyAgICAiZGVmYXVsdGljb24iOiAiRGVmYXVsdCBJY29uIiwKKworICAgICI9PT09PT09PT09PSBBREQgQVJUSUZBQ1QgRlJPTSA9PT09PT09PT09PSI6ICIiLAorICAgICJBRERfQVJUSUZBQ1RfRVJST1JfVkFMSURfRVhURU5TSU9OUyI6ICJGaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUge3tleHRlbnNpb25zfX0uIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX0ZJTEVfUkVRVUlSRUQiOiAiQXJ0aWZhY3QgZmlsZSBpcyByZXF1aXJlZC4iLAorICAgICJBRERfQVJUSUZBQ1RfRVJST1JfTEFCRUxfUkVRVUlSRUQiOiAiQXJ0aWZhY3QgbGFiZWwgaXMgcmVxdWlyZWQuIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX0xBQkVMX01BWExFTkdUSCI6ICJNYXggbGVuZ3RoIDI1IGNoYXJhY3RlcnMuIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX0xBQkVMX1BBVFRFUk4iOiAibm90IGFsbG93ZWQgc3BlY2lhbCBjaGFyYWN0ZXJzLiIsCisgICAgIkFERF9BUlRJRkFDVF9FUlJPUl9UWVBFX1JFUVVJUkVEIjogInR5cGUgaXMgcmVxdWlyZWQuIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX1RJTUVPVVRfTUlOIjogIlRpbWVvdXQgY2FuJ3QgYmUgc2V0IHRvIHplcm8uIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX1RJTUVPVVRfTUFYTEVOR1RIIjogIk1heCBsZW5ndGggMjUgY2hhcmFjdGVycy4iLAorICAgICJBRERfQVJUSUZBQ1RfRVJST1JfVElNRU9VVF9QQVRURVJOIjogIkludmFsaWQgdmFsdWUuIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX0FQSVVSTF9SRVFVSVJFRCI6ICJBcnRpZmFjdCBVUkwgaXMgcmVxdWlyZWQuIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX0FQSVVSTF9NQVhMRU5HVEgiOiAiTWF4IGxlbmd0aCAxMDAgY2hhcmFjdGVycy4iLAorICAgICJBRERfQVJUSUZBQ1RfRVJST1JfQVBJVVJMX1VSTCI6ICJVcmwgbm90IHZhbGlkIiwKKyAgICAiQUREX0FSVElGQUNUX0VSUk9SX0RFU0NSSVBUSU9OX1JFUVVJUkVEIjogIkRlc2NyaXB0aW9uIGlzIHJlcXVpcmVkLiIsCisgICAgIkFERF9BUlRJRkFDVF9FUlJPUl9ERVNDUklQVElPTl9NQVhMRU5HVEgiOiAiTWF4IGxlbmd0aCAyNTYgY2hhcmFjdGVycy4iLAorICAgICJBRERfQVJUSUZBQ1RfRVJST1JfREVTQ1JJUFRJT05fUEFUVEVSTiI6ICJub3QgYWxsb3dlZCBzcGVjaWFsIGNoYXJhY3RlcnMuIiwKKworICAgICI9PT09PT09PT09PSBBUlRJRkFDVCBWSUVXID09PT09PT09PT09IjogIiIsCisgICAgIkFSVElGQUNUX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIjogIkRlbGV0ZSBBcnRpZmFjdCBDb25maXJtYXRpb24iLAorICAgICJBUlRJRkFDVF9WSUVXX0RFTEVURV9NT0RBTF9URVhUIjogIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJ3t7bmFtZX19Jz8iLAorCisgICAgIj09PT09PT09PT09IFBST1BFUlRZIFZJRVcgPT09PT09PT09PT0iOiAiIiwKKyAgICAiUFJPUEVSVFlfVklFV19ERUxFVEVfTU9EQUxfVElUTEUiOiAiRGVsZXRlIFByb3BlcnR5IENvbmZpcm1hdGlvbiIsCisgICAgIlBST1BFUlRZX1ZJRVdfREVMRVRFX01PREFMX1RFWFQiOiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAne3tuYW1lfX0nPyIsCisgICAgIlBST1BFUlRZX0VESVRfUEFUVEVSTiI6ICJJbnZhbGlkIHZhbHVlLiIsCisgICAgIlBST1BFUlRZX0VESVRfTElTVF9TVFJJTkciOiAiSW52YWxpZCB2YWx1ZS4gVGhlIGNvcnJlY3QgdmFsdWUgaXMgXCJYXCIsXCJZXCIiLAorICAgICJQUk9QRVJUWV9FRElUX01BUF9TVFJJTkciOiAiSW52YWxpZCB2YWx1ZS4gVGhlIGNvcnJlY3QgdmFsdWUgaXMgXCJLZXlcIjpcInZhbHVlXCIiLAorICAgICJQUk9QRVJUWV9FRElUX0xJU1RfR0VORVJJQyI6ICJJbnZhbGlkIHZhbHVlLiBUaGUgY29ycmVjdCB2YWx1ZSBpcyBYLCBZIiwKKyAgICAiUFJPUEVSVFlfRURJVF9NQVBfR0VORVJJQyI6ICJJbnZhbGlkIHZhbHVlLiBUaGUgY29ycmVjdCB2YWx1ZSBpcyBcIktleVwiOnZhbHVlIiwKKyAgICAiUFJPUEVSVFlfRURJVF9NQVBfVU5JUVVFX0tFWVMiOiAiS2V5IG11c3QgYmUgdW5pcXVlLiIsCisKKyAgICAiPT09PT09PT09PT0gQVRUUklCVVRFIFZJRVcgPT09PT09PT09PT0iOiAiIiwKKyAgICAiQVRUUklCVVRFX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIjogIkRlbGV0ZSBBdHRyaWJ1dGUgQ29uZmlybWF0aW9uIiwKKyAgICAiQVRUUklCVVRFX1ZJRVdfREVMRVRFX01PREFMX1RFWFQiOiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAne3tuYW1lfX0nPyIsCisgICAgIkFUVFJJQlVURV9FRElUX1BBVFRFUk4iOiAiSW52YWxpZCB2YWx1ZS4iLAorICAgICJORVdfQVRUUklCVVRFX0VSUk9SX05BTUVfRVhJU1RTIjoiTmFtZSBhbHJlYWR5IGV4aXN0cy4iLAorICAgICJBVFRSSUJVVEVfRURJVF9MSVNUX1NUUklORyI6ICJJbnZhbGlkIHZhbHVlLiBUaGUgY29ycmVjdCB2YWx1ZSBpcyBcIlhcIixcIllcIi4iLAorICAgICJBVFRSSUJVVEVfRURJVF9NQVBfU1RSSU5HIjogIkludmFsaWQgdmFsdWUuIFRoZSBjb3JyZWN0IHZhbHVlIGlzIFwiS2V5XCI6XCJ2YWx1ZVwiLiIsCisgICAgIkFUVFJJQlVURV9FRElUX0xJU1RfQk9PTEVBTiI6ICJJbnZhbGlkIHZhbHVlLiBUaGUgY29ycmVjdCB2YWx1ZSBpcyB0cnVlLGZhbHNlLiIsCisgICAgIkFUVFJJQlVURV9FRElUX01BUF9CT09MRUFOIjogIkludmFsaWQgdmFsdWUuIFRoZSBjb3JyZWN0IHZhbHVlIGlzIFwiS2V5XCI6dHJ1ZS4iLAorICAgICJBVFRSSUJVVEVfRURJVF9MSVNUX0dFTkVSSUMiOiAiSW52YWxpZCB2YWx1ZS4gVGhlIGNvcnJlY3QgdmFsdWUgaXMgWCwgWS4iLAorICAgICJBVFRSSUJVVEVfRURJVF9NQVBfR0VORVJJQyI6ICJJbnZhbGlkIHZhbHVlLiBUaGUgY29ycmVjdCB2YWx1ZSBpcyBcIktleVwiOnZhbHVlLiIsCisgICAgIkFUVFJJQlVURV9FRElUX01BUF9VTklRVUVfS0VZUyI6ICJLZXkgbXVzdCBiZSB1bmlxdWUuIiwKKworICAgICI9PT09PT09PT09PSBVUERBVEUgUEFSQU1FVEVSUyBGUk9NID09PT09PT09PT09IjogIiIsCisgICAgIlVQREFURV9QQVJBTUVURVJTX1RFWFQiOiAiUmV2aWV3IHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVpciBkZWZhdWx0IHZhbHVlcy4gSWYgbmVjZXNzYXJ5LCB5b3UgY2FuIG1vZGlmeSB0aGUgdmFsdWVzIGJ5IGVkaXRpbmcgdGhlIHRleHQgZmllbGRzLiIsCisgICAgIkVOVl9GSUxFX0dFTkVSQVRJT04iOiAiUGxlYXNlIG5vdGljZTogZW1wdHkgZmllbGRzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBFTlYgZmlsZSIsCisKKyAgICAiPT09PT09PT09PT0gRU5USVRZIFZJRVdFUiA9PT09PT09PT09PSI6ICIiLAorICAgICJFTlRJVFlfVklFV0VSX1BST1BFUlRJRVNfVEFCIjogIlByb3BlcnRpZXMiLAorICAgICJFTlRJVFlfVklFV0VSX0FDVElWSVRZX0xPR19UQUIiOiAiQWN0aXZpdHkgTG9nIiwKKworICAgICI9PT09PT09PT09PSBXSEFUUyBORVcgPT09PT09PT09PT0iOiAiIiwKKyAgICAiV0hBVFNfTkVXX09OIjogIldoYXQncyBuZXcgb24ge3t2ZXJzaW9ufX0iLAorICAgICJXSEFUU19ORVdfTElTVCI6ICIiLAorICAgICJXSEFUU19ORVdfMV9USVRMRSI6ICJWTkYgT24tQm9hcmRpbmciLAorICAgICJXSEFUU19ORVdfMV9CT0RZIjogIlZlbmRvcnMgY2FuIHVwbG9hZCAgVk5GIEhFQVQgZmlsZXMgJiBMaWNlbnNlIGFydGlmYWN0czx1bD48bGk+VXBsb2FkIFZORiBIRUFUIGZpbGVzPC9saT48bGk+TGljZW5zaW5nPC9saT48bGk+UXVlc3Rpb25uYWlyZTwvbGk+IiwKKyAgICAiV0hBVFNfTkVXXzJfVElUTEUiOiAiQ2FsbCAmIE5ldHdvcmsgRmxvdy1Ub29sIiwKKyAgICAiV0hBVFNfTkVXXzJfQk9EWSI6ICJJbnRyb2R1Y2VkIHRoZSBhYmlsaXR5IHRvIGhvc3QgYSAzcmQgcGFydHk8YnIvPkVuaGFuY2UgVkYgYW5kIFNlcnZpY2UgZGVzaWduIHdpdGggQ2FsbCBhbmQgTmV0d29yayBmbG93czsgQ2FsbCAmIE5ldHdvcmsgRmxvd3MgY3JlYXRlZCBhbmQgc3RvcmVkIGFzIEluZm9ybWF0aW9uIEFydGlmYWN0cy4iLAorICAgICJXSEFUU19ORVdfM19USVRMRSI6ICJJbXBvcnQgVkYgZnJvbSBPbi1Cb2FyZGVkIFZORiIsCisgICAgIldIQVRTX05FV18zX0JPRFkiOiAiSW1wb3J0IFZGIE1ldGFkYXRhIGZyb20gdmVuZG9yIHN1cHBsaWVkIENTQVIgZmlsZTxici8+Q3JlYXRlIHRoZSBWRiBiYXNlZCBvbiBkYXRhIGluY2x1ZGVkIGluIHRoZSBDU0FSIGZpbGUuIEluY2x1ZGVzOyBWRiB0b3BvbG9neSBhbmQgZGVwbG95bWVudCBhcnRpZmFjdHM8YnIvPk9uY2UgY2hlY2tlZCBpbiB0aGUgVkYgaXMgRGlzcGxheWVkIGluIHRoZSBDYXRhbG9nIiwKKyAgICAiV0hBVFNfTkVXXzRfVElUTEUiOiAiQXBwIE5hdmlnYXRpb24iLAorICAgICJXSEFUU19ORVdfNF9CT0RZIjogIlRoaXMgcmVsZWFzZSBpbnRyb2R1Y2VzIFZpZXcgYW5kIEVkaXQgbW9kZXM8b2w+PGxpPlVzZSB0aGUgdmlldyBtb2RlIHdoZW46PHVsPjxsaT5Vc2VyIGRvZXMgbm90IGhhdmUgYXV0aG9yaXphdGlvbiB0byBlZGl0IGFuIEFzc2V0PC9saT48bGk+QXNzZXQgaXMgaW4gQ2hlY2stSW4gTW9kZTwvbGk+PC91bD48L2xpPjxsaT5Vc2UgdGhlIEVkaXQgTW9kZSB3aGVuOjx1bD48bGk+VXNlciBoYXMgYXV0aG9yaXphdGlvbiB0byBlZGl0IGFuIEFzc2V0PC9saT48bGk+QXNzZXQgaXMgaW4gQ2hlY2stb3V0IE1vZGU8L2xpPjwvdWw+PC9saT48L29sPiIsCisgICAgIldIQVRTX05FV181X1RJVExFIjogIkNlcnRpZmljYXRpb24gU3R1ZGlvIiwKKyAgICAiV0hBVFNfTkVXXzVfQk9EWSI6ICJUZXN0ZXIsIEdvdmVybm9yIGFuZCBPcHMgcm9sZXMgY2FuIHZpZXcgVkYgYW5kIFNlcnZpY2UgQ29tcG9zaXRpb24uPGJyLz5UaGV5IGNhbiBhbHNvIGRvd25sb2FkIHRoZSBhc3NldOKAmXMgYXJ0aWZhY3RzLCBhbmQgZG93bmxvYWQgdGhlIGFzc2V04oCZcyByZXNvdXJjZSBpbnN0YW5jZSBhcnRpZmFjdHMiLAorICAgICJXSEFUU19ORVdfNl9USVRMRSI6ICJDb21wb3NpdGlvbjogVmlydHVhbCBMaW5rIiwKKyAgICAiV0hBVFNfTkVXXzZfQk9EWSI6ICJUaGUgYWJpbGl0eSB0byBsaW5rIFZGcyB2aWEgYSBWaXJ0dWFsIGxpbmsgaGFzIGJlZW4gZXhwYW5kZWQuIE5vdyBhIFZpcnR1YWwgbGluayBjYW4gYmUgZGVmaW5lZCBhcyBoYXZpbmcgZWl0aGVyIFBvaW50LXRvLVBvaW50IGNvbm5lY3Rpdml0eSBvciBNdWx0aS1wb2ludCBjb25uZWN0aXZpdHkuIEFkZGl0aW9uYWxseSBmcm9tIHdpdGhpbiBhIFZpcnR1YWwgTGluaywgUG9pbnQtdG8tUG9pbnQgY29ubmVjdGl2aXR5IGNhbiBiZSBkeW5hbWljYWxseSBjaGFuZ2VkIHRvIE11bHRpLVBvaW50IGNvbm5lY3Rpdml0eS4iLAorICAgICJXSEFUU19ORVdfN19USVRMRSI6ICJEaXN0cmlidXRpb24iLAorICAgICJXSEFUU19ORVdfN19CT0RZIjogIjx1bD48bGk+RGlzdHJpYnV0aW9uIG9mIGFydGlmYWN0IHRvIEFwcC1DPC9saT48bGk+RGlzdHJpYnV0aW9uIG9mIGFydGlmYWN0IHRvIEFMVFM8L2xpPjxsaT5EaXN0cmlidXRpb24gb2YgYXJ0aWZhY3QgdG8gQSZBSTwvbGk+PC91bD4iLAorICAgICJXSEFUU19ORVdfOF9USVRMRSI6ICJOZXcgQnJhbmQiLAorICAgICJXSEFUU19ORVdfOF9CT0RZIjogIkVmZm9ydCB3YXMgaW52ZXN0ZWQgaW4gaW1wcm92aW5nIHRoZSBvdmVyYWxsIGFwcGxpY2F0aW9uIFVzYWJpbGl0eSwgYW5kIHRoZSBVc2VyIEludGVyZmFjZSB3YXMgbW9kaWZpZWQgdG8gYmV0dGVyIHJlZmxlY3QgYnJhbmRpbmcgc3RhbmRhcmRzLiIsCisKKyAgICAiPT09PT09PT09PT0gVVNFUl9NQU5BR0VNRU5UIFNDUkVFTiA9PT09PT09PT09PSI6ICIiLAorICAgICJVU0VSX01BTkFHRU1FTlQiOiAiVXNlciBNYW5hZ2VtZW50IiwKKyAgICAiVVNFUl9NQU5BR0VNRU5UX1RBQkxFX0hFQURFUl9VU0VSX0lEIjogIlVzZXIgaWQiLAorICAgICJVU0VSX01BTkFHRU1FTlRfU0VBUkNIX0xBQkVMIjogIlNlYXJjaCB1c2VyIGJ5IG5hbWUsIHVzZXIgaWQsIGVtYWlsIG9yIHJvbGUiLAorICAgICJVU0VSX01BTkFHRU1FTlRfU0VBUkNIX1RFWFQiOiAiRW50ZXIgdXNlciBpZCIsCisgICAgIkNBVEVHT1JZX01BTkFHRU1FTlQiOiAiQ2F0ZWdvcnkgTWFuYWdlbWVudCIsCisgICAgIkVDT01QIjogIkVDT01QIiwKKyAgICAiTU9OSVRPUiI6ICJNb25pdG9yIiwKKyAgICAiVVNFUl9NQU5BR0VNRU5UX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIjogIkRlbGV0ZSBVc2VyIENvbmZpcm1hdGlvbiIsCisgICAgIlVTRVJfTUFOQUdFTUVOVF9WSUVXX0RFTEVURV9NT0RBTF9URVhUIjogIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHVzZXI/IiwKKyAgICAiTkVXX1VTRVJfRVJST1JfVVNFUl9JRF9SRVFVSVJFRCI6ICJVc2VyIGlkIGlzIHJlcXVpcmVkLiIsCisgICAgIk5FV19VU0VSX0VSUk9SX1VTRVJfSURfTk9UX1ZBTElEIjogIlVzZXIgaWQgbm90IHZhbGlkLiIsCisgICAgIk5FV19VU0VSX0VSUk9SX1JPTEVfUkVRVUlSRUQiOiAiVXNlciByb2xlIGlzIHJlcXVpcmVkLiIsCisKKyAgICAiPT09PT09PT09PT0gRU1BSUxfTU9EQUwgPT09PT09PT09PT0iOiAiIiwKKyAgICAiRU1BSUxfTU9EQUxfVElUTEUiOiAiU3VibWl0IEZvciBUZXN0aW5nIiwKKyAgICAiRU1BSUxfTU9EQUxfU1VCSkVDVCI6ICJ7e2VudGl0eU5hbWV9fTsgdmVyc2lvbiB7e2VudGl0eVZlcnNpb259fSIsCisgICAgIkVNQUlMX01PREFMX01FU1NBR0UiOiAiRW50ZXIgeW91ciBtZXNzYWdlIGhlcmUuLi4iLAorICAgICJFTUFJTF9PVVRMT09LX01FU1NBR0UiOiAibWFpbHRvOnt7dG99fT9zdWJqZWN0PXt7c3ViamVjdH19IGlzIG5vdyByZWFkeSBmb3IgdGVzdGluZyZib2R5PXt7bWVzc2FnZX19JTBEJTBBJTBEJTBBQ2xpY2sgb24gdGhlIGxpbmsgYmVsb3cgdG8gb3BlbiB7e2VudGl0eU5hbWVBbmRWZXJzaW9ufX0gdGhhdCBpcyByZWFkeSBmb3IgdGVzdGluZy4gJTBEJTBBe3tsaW5rfX0lMEQlMEEiLAorCisgICAgIj09PT09PT09PT09IENBVEVHT1JZX01BTkFHRU1FTlQgU0NSRUVOID09PT09PT09PT09IjogIiIsCisgICAgIlJFU09VUkNFX0NBVEVHT1JZX0hFQURFUiI6ICJSZXNvdXJjZSBDYXRlZ29yeSIsCisgICAgIlNFUlZJQ0VfQ0FURUdPUllfSEVBREVSIjogIlNlcnZpY2UgQ2F0ZWdvcnkiLAorICAgICJTVUJDQVRFR09SWV9IRUFERVIiOiAiU3ViIENhdGVnb3J5IiwKKyAgICAiQUREX0NBVEVHT1JZIjogIk5ldyIsCisgICAgIkFERF9TVUJDQVRFR09SWSI6ICJOZXciLAorICAgICJERUxFVEVfQ0FURUdPUllfTU9EQUxfSEVBREVSIjogIkRlbGV0ZSB7e21vZGVsVHlwZX19IiwKKyAgICAiREVMRVRFX0NBVEVHT1JZX01PREFMX0NBVEVHT1JZX05BTUUiOiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUge3ttb2RlbFR5cGV9fT8iLAorICAgICJDUkVBVEVfQ0FURUdPUllfTU9EQUxfSEVBREVSIjogIkNyZWF0ZSBuZXcge3ttb2RlbFR5cGV9fSIsCisgICAgIkNSRUFURV9DQVRFR09SWV9NT0RBTF9DQVRFR09SWV9OQU1FIjogIkVudGVyIHt7bW9kZWxUeXBlfX0gbmFtZSIsCisgICAgIkNSRUFURV9DQVRFR09SWV9NT0RBTF9SRVFVSVJFRCI6ICJ7e21vZGVsVHlwZX19IG5hbWUgaXMgbWFuZGF0b3J5IiwKKyAgICAiQ1JFQVRFX0NBVEVHT1JZX01PREFMX01JTkxFTkdUSCI6ICJ7e21vZGVsVHlwZX19IG5hbWUgc2hvdWxkIGJlIGF0IGxlYXN0IHt7bWlubGVuZ3RofX0gY2hhcmFjdGVycyIsCisgICAgIkNSRUFURV9DQVRFR09SWV9NT0RBTF9QQVRURVJOIjogInt7bW9kZWxUeXBlfX0gbmFtZSBpcyBub3QgdmFsaWQiCisKKywiPT09PT09PT09PT0gUERGIEZJTEUgPT09PT09PT09PT0iOiAiIiwKKyAgICAiUERGX0ZJTEVfREVDTEFSQVRJT05fQk9MRCI6ICJBVCZUIFByb3ByaWV0YXJ5IChSZXN0cmljdGVkKSIsCisgICAgIlBERl9GSUxFX0RFQ0xBUkFUSU9OIjogIk9ubHkgZm9yIHVzZSBieSBhdXRob3JpemVkIGluZGl2aWR1YWxzIG9yIGFueSBhYm92ZS1kZXNpZ25hdGVkIHRlYW0ocykgd2l0aGluIHRoZSBBVCZUIGNvbXBhbmllcyBhbmQgbm90IGZvciBnZW5lcmFsIGRpc3RyaWJ1dGlvbiIKKworLCI9PT09PT09PT09PSBERVBMT1lNRU5UIEFSVElGQUNUUyA9PT09PT09PT09PSI6ICIiLAorICAgICJERVBMT1lNRU5UX0FSVElGQUNUX05PX0FSVElGQUNUU19UT19ESVNQTEFZIjogIlRoZXJlIGFyZSBubyBkZXBsb3ltZW50IGFydGlmYWN0cyB0byBkaXNwbGF5IiwKKyAgICAiREVQTE9ZTUVOVF9BUlRJRkFDVF9CVVRUT05fQUREX0hFQVQiOiAiQWRkIHt7bmFtZX19IiwKKyAgICAiREVQTE9ZTUVOVF9BUlRJRkFDVF9CVVRUT05fQUREX0JBU0VfSEVBVCI6ICJBZGQgQmFzZSBIRUFUIEFydGlmYWN0IiwKKyAgICAiREVQTE9ZTUVOVF9BUlRJRkFDVF9CVVRUT05fQUREX05FVFdPUktfSEVBVCI6ICJBZGQgTmV0d29yayBIRUFUIEFydGlmYWN0IiwKKyAgICAiREVQTE9ZTUVOVF9BUlRJRkFDVF9CVVRUT05fQUREX1ZPTFVNRV9IRUFUIjogIkFkZCBWb2x1bWUgSEVBVCBBcnRpZmFjdCIsCisgICAgIkRFUExPWU1FTlRfQVJUSUZBQ1RfQlVUVE9OX0FERF9PVEhFUiI6ICJBZGQgT3RoZXIgQXJ0aWZhY3QiCisKKywiPT09PT09PT09PT0gSU1QT1JUIFZGID09PT09PT09PT09IjogIiIsCisgICAgIklNUE9SVF9WRl9NRVNTQUdFX0NSRUFURV9UQUtFU19MT05HX1RJTUVfVElUTEUiOiAiQ3JlYXRlIFZGIiwKKyAgICAiSU1QT1JUX1ZGX01FU1NBR0VfQ1JFQVRFX1RBS0VTX0xPTkdfVElNRV9ERVNDUklQVElPTiI6ICJZb3VyIFZGIGlzIGJlaW5nIGNyZWF0ZWQuPGJyLz5JdCBjYW4gdGFrZSB1cCB0byAxMCBtaW51dGVzLjxici8+V2hlbiBkb25lLCB5b3UgY2FuIHZpZXcgaXQgaW4gU0RDIENhdGFsb2cuIiwKKyAgICAiSU1QT1JUX1ZGX01FU1NBR0VfQ1JFQVRFX0ZJTklTSEVEX1RJVExFIjogIkNyZWF0ZS9VcGRhdGUiLAorICAgICJJTVBPUlRfVkZfTUVTU0FHRV9DUkVBVEVfRklOSVNIRURfREVTQ1JJUFRJT04iOiAic2F2ZWQgc3VjY2Vzc2Z1bGx5IiwKKyAgICAiSU1QT1JUX1ZGX0FMUkVBRFlfRVhJU1RTX1RJVExFIjogIkNyZWF0ZSBWRiIsCisgICAgIklNUE9SVF9WRl9BTFJFQURZX0VYSVNUU19ERVNDUklQVElPTiI6ICJUaGUgVkYge3t2Zk5hbWV9fSBpcyBhbHJlYWR5IGNlcnRpZmllZC48YnIvPldoZW4gdXBkYXRpbmcgYSBWRiB0aGF0IHdhcyBhbHJlYWR5IGNlcnRpZmllZCwgdGhlIHZhbHVlcyBmb3Igc2V2ZXJhbCBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIGNoYW5nZWQuPGJyLz5UaGVzZSBwYXJhbWV0ZXJzIGFyZTogTmFtZSwgQ2F0ZWdvcnkgYW5kIEljb24uIiwKKworICAgICI9PT09PT09PT09PSBUQUJTIFRJVExFID09PT09PT09PT09IjogIiIsCisgICAgIkhJRVJBUkNIWV9UQUJfVElUTEUiOiAiSElFUkFSQ0hZIiwKKworICAgICI9PT09PT09PT09PSBESVNUUklCVVRJT04gVklFVyA9PT09PT09PT09PSI6ICIiLAorICAgICJESVNUUklCVVRJT05fVklFV19USVRMRV9VU0VSX0lEIjogIlVzZXIgaWQ6IiwKKworICAgICI9PT09PT09PT09PSBTVUNDRVNTIE1FU1NBR0VTID09PT09PT09PT09IjogIiIsCisgICAgIkNIRUNLSU5fU1VDQ0VTU19NRVNTQUdFX1RFWFQiOiAiQ2hlY2tlZCBpbiBzdWNjZXNzZnVsbHkiLAorICAgICJDSEVDS0lOX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJDaGVjayBpbiIsCisgICAgIkNIRUNLT1VUX1NVQ0NFU1NfTUVTU0FHRV9URVhUIjogIkNoZWNrZWQgb3V0IHN1Y2Nlc3NmdWxseSIsCisgICAgIkNIRUNLT1VUX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJDaGVjayBvdXQiLAorICAgICJERUxFVEVfU1VDQ0VTU19NRVNTQUdFX1RFWFQiOiAiRGVsZXRlZCBzdWNjZXNzZnVsbHkiLAorICAgICJERUxFVEVfU1VDQ0VTU19NRVNTQUdFX1RJVExFIjogIkRlbGV0ZSIsCisgICAgIlNVQk1JVF9GT1JfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVEVYVCI6ICJTdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5IGZvciB0ZXN0aW5nIiwKKyAgICAiU1VCTUlUX0ZPUl9URVNUSU5HX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJTdWJtaXQgRm9yIFRlc3RpbmciLAorICAgICJTVEFSVF9URVNUSU5HX1NVQ0NFU1NfTUVTU0FHRV9URVhUIjogIlRlc3RlZCBzdWNjZXNzZnVsbHkiLAorICAgICJTVEFSVF9URVNUSU5HX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJTdGFydCBUZXN0aW5nIiwKKyAgICAiQ0FOQ0VMX1RFU1RJTkdfU1VDQ0VTU19NRVNTQUdFX1RFWFQiOiAiQ2FuY2VsbGVkIHN1Y2Nlc3NmdWxseSIsCisgICAgIkNBTkNFTF9URVNUSU5HX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJDYW5jZWwiLAorICAgICJSRUpFQ1RfU1VDQ0VTU19NRVNTQUdFX1RFWFQiOiAiUmVqZWN0ZWQgc3VjY2Vzc2Z1bGx5IiwKKyAgICAiUkVKRUNUX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJSZWplY3QiLAorICAgICJBQ0NFUFRfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVEVYVCI6ICJBY2NlcHRlZCBzdWNjZXNzZnVsbHkiLAorICAgICJBQ0NFUFRfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVElUTEUiOiAiQWNjZXB0IiwKKyAgICAiQVBQUk9WRV9TVUNDRVNTX01FU1NBR0VfVEVYVCI6ICJBcHByb3ZlZCBzdWNjZXNzZnVsbHkiLAorICAgICJBUFBST1ZFX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJBcHByb3ZlIiwKKyAgICAiRElTVFJJQlVURV9TVUNDRVNTX01FU1NBR0VfVEVYVCI6ICJEaXN0cmlidXRlZCBzdWNjZXNzZnVsbHkiLAorICAgICJESVNUUklCVVRFX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSI6ICJEaXN0cmlidXRlIiwKKworICAgICI9PT09PT09PT09PSBPTiBCT0FSRElORyBNT0RBTCBJTkZPIE1FU1NBR0VTID09PT09PT09PT09IjogIiIsCisgICAgIk9OX0JPQVJESU5HX0dFTkVSQUxfSU5GTyI6ICJEaXNwbGF5cyBhIHRhYmxlIG9mIFZTUHMgY3JlYXRlZCB1c2luZyBPbmJvYXJkaW5nLjxici8+IEVhY2ggcm93IGRpc3BsYXlzIGRldGFpbHMgZm9yIGEgc2luZ2xlIFZTUC48YnIvPiBXaGVuIGV4cGFuZGVkIHlvdSBjYW4gZWl0aGVyIGltcG9ydCBDU0FSIGZpbGVzIHRoYXQgYXJlIHlldCB0byAgYmUgaW1wb3J0ZWQgb3IgdXBkYXRlIENTQVIgZmlsZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgaW1wb3J0ZWQuIiwKKyAgICAiT05fQk9BUkRJTkdfSU1QT1JUX0lORk8iOiAiRGlzcGxheXMgdGhlIE9uYm9hcmRpbmcgcmVwb3NpdG9yeSBhbmQgc3VwcG9ydHMgaW1wb3J0aW5nIG9uLWJvYXJkZWQgQ1NBUiBmaWxlcy48YnIvPiAgU2VsZWN0ICBhbiBpbXBvcnRlZCBDU0FSIGZpbGUgdG8gY3JlYXRlIGEgVkYgZnJvbSB0aGUgb24tYm9hcmRlZCBhbmQgaW1wb3J0ZWQgIGluZm9ybWF0aW9uLiIsCisgICAgIk9OX0JPQVJESU5HX1VQREFURV9JTkZPIjogIkRpc3BsYXlzIHRoZSBPbmJvYXJkaW5nIHJlcG9zaXRvcnkgYW5kIHN1cHBvcnRzIHVwZGF0aW5nIG9uLWJvYXJkZWQgYW5kIHByZXZpb3VzbHkgaW1wb3J0ZWQgQ1NBUiBmaWxlcy48YnIvPiBDbGlja2luZyBVcGRhdGUsIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIFZGIHdpdGggaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZyb20gYSBuZXcgdmVyc2lvbiBvZiB0aGUgQ1NBUiBmaWxlLiIKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvYXBwLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9hcHAudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzODEwNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvYXBwLnRzCkBAIC0wLDAgKzEsOTM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi9yZWZlcmVuY2VzIi8+CisvKgorIFNEJkMgV2ViIFBvcnRhbCBXaXJlZnJhbWVzIOKAkyAgRGVzaWduZXIgSG9tZSBQYWdlIGFuZCBDcmVhdGUgTmV3IFNlcnZpY2UgRmxvdworICovCisvL2xpYnJhcmllcyB2YXJpYWJsZXMgdG8gcHJldmVudCBjb21waWxlIGVycm9ycworZGVjbGFyZSBsZXQganNQREY6YW55OworCittb2R1bGUgU2RjIHsKKyAgICBpbXBvcnQgVXNlciA9IFNkYy5Nb2RlbHMuVXNlcjsKKyAgICBpbXBvcnQgVXNlclJlc291cmNlU2VydmljZSA9IFNkYy5TZXJ2aWNlcy5Vc2VyUmVzb3VyY2VTZXJ2aWNlOworCisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBSZXNvdXJjZSA9IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZTsKKyAgICBsZXQgbW9kdWxlTmFtZTpzdHJpbmcgPSAnc2RjQXBwJzsKKyAgICBsZXQgdmlld01vZGVsc01vZHVsZU5hbWU6c3RyaW5nID0gJ1NkYy5WaWV3TW9kZWxzJzsKKyAgICBsZXQgZGlyZWN0aXZlc01vZHVsZU5hbWU6c3RyaW5nID0gJ1NkYy5EaXJlY3RpdmVzJzsKKyAgICBsZXQgc2VydmljZXNNb2R1bGVOYW1lOnN0cmluZyA9ICdTZGMuU2VydmljZXMnOworICAgIGxldCBmaWx0ZXJzTW9kdWxlTmFtZTpzdHJpbmcgPSAnU2RjLkZpbHRlcnMnOworICAgIGxldCB1dGlsc01vZHVsZU5hbWU6IHN0cmluZyA9ICAnU2RjLlV0aWxzJzsKKyAgICBsZXQgZGVwZW5kZW50TW9kdWxlczpBcnJheTxzdHJpbmc+ID0gWworICAgICAgICAndWkucm91dGVyJywKKyAgICAgICAgJ3VpLmJvb3RzdHJhcCcsCisgICAgICAgICduZ0RyYWdEcm9wJywKKyAgICAgICAgJ3VpLW5vdGlmaWNhdGlvbicsCisgICAgICAgICduZ1Jlc291cmNlJywKKyAgICAgICAgJ25nU2FuaXRpemUnLAorICAgICAgICAnU2RjLkNvbmZpZycsCisgICAgICAgICduYWlmLmJhc2U2NCcsCisgICAgICAgICdiYXNlNjQnLAorICAgICAgICAndXVpZDQnLAorICAgICAgICAnY2hlY2tsaXN0LW1vZGVsJywKKyAgICAgICAgJ2FuZ3VsYXIuZmlsdGVyJywKKyAgICAgICAgJ3Bhc2NhbHByZWNodC50cmFuc2xhdGUnLAorICAgICAgICAnNzIwa2IudG9vbHRpcHMnLAorICAgICAgICAncmVzdGFuZ3VsYXInLAorICAgICAgICAnYW5ndWxhci1jbGlwYm9hcmQnLAorICAgICAgICAnYW5ndWxhclJlc2l6YWJsZScsCisgICAgICAgICdpbmZpbml0ZS1zY3JvbGwnLAorICAgICAgICB2aWV3TW9kZWxzTW9kdWxlTmFtZSwKKyAgICAgICAgZGlyZWN0aXZlc01vZHVsZU5hbWUsCisgICAgICAgIHNlcnZpY2VzTW9kdWxlTmFtZSwKKyAgICAgICAgZmlsdGVyc01vZHVsZU5hbWUsCisgICAgICAgIHV0aWxzTW9kdWxlTmFtZQorICAgIF07CisKKyAgICBsZXQgYXBwTW9kdWxlOm5nLklNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShtb2R1bGVOYW1lLCBkZXBlbmRlbnRNb2R1bGVzKTsKKworICAgIGFwcE1vZHVsZS5jb25maWcoWworICAgICAgICAnJHN0YXRlUHJvdmlkZXInLAorICAgICAgICAnJHRyYW5zbGF0ZVByb3ZpZGVyJywKKyAgICAgICAgJyR1cmxSb3V0ZXJQcm92aWRlcicsCisgICAgICAgICckaHR0cFByb3ZpZGVyJywKKyAgICAgICAgJ3Rvb2x0aXBzQ29uZmlnUHJvdmlkZXInLAorICAgICAgICAnTm90aWZpY2F0aW9uUHJvdmlkZXInLAorICAgICAgICAoJHN0YXRlUHJvdmlkZXI6YW55LAorICAgICAgICAgJHRyYW5zbGF0ZVByb3ZpZGVyOmFueSwKKyAgICAgICAgICR1cmxSb3V0ZXJQcm92aWRlcjpuZy51aS5JVXJsUm91dGVyUHJvdmlkZXIsCisgICAgICAgICAkaHR0cFByb3ZpZGVyOm5nLklIdHRwUHJvdmlkZXIsCisgICAgICAgICB0b29sdGlwc0NvbmZpZ1Byb3ZpZGVyOmFueSwKKyAgICAgICAgIE5vdGlmaWNhdGlvblByb3ZpZGVyOmFueSk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvblByb3ZpZGVyLnNldE9wdGlvbnMoeworICAgICAgICAgICAgICAgIGRlbGF5OiAxMDAwMCwKKyAgICAgICAgICAgICAgICBzdGFydFRvcDogMTAsCisgICAgICAgICAgICAgICAgc3RhcnRSaWdodDogMTAsCisgICAgICAgICAgICAgICAgY2xvc2VPbkNsaWNrOiB0cnVlLAorICAgICAgICAgICAgICAgIHZlcnRpY2FsU3BhY2luZzogMjAsCisgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFNwYWNpbmc6IDIwLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uWDogJ3JpZ2h0JywKKyAgICAgICAgICAgICAgICBwb3NpdGlvblk6ICd0b3AnCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbGV0IHZpZXdNb2RlbHNIdG1sQmFzZVBhdGg6c3RyaW5nID0gJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy8nOworICAgICAgICAgICAgY29uc29sZS5pbmZvKCdhcHBNb2R1bGUuY29uZmlnOiAnLCB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoKTsKKworICAgICAgICAgICAgJHRyYW5zbGF0ZVByb3ZpZGVyLnVzZVN0YXRpY0ZpbGVzTG9hZGVyKHsKKyAgICAgICAgICAgICAgICBwcmVmaXg6ICdsYW5ndWFnZXMvJywKKyAgICAgICAgICAgICAgICBsYW5nS2V5OiAnJywKKyAgICAgICAgICAgICAgICBzdWZmaXg6ICcuanNvbj9kPScgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICR0cmFuc2xhdGVQcm92aWRlci51c2VTYW5pdGl6ZVZhbHVlU3RyYXRlZ3koJ2VzY2FwZWQnKTsKKyAgICAgICAgICAgICR0cmFuc2xhdGVQcm92aWRlci5wcmVmZXJyZWRMYW5ndWFnZSgnZW5fVVNfT1MnKTsgLy8gRm9yIG9wZW4gc291cmNlIGNoYW5nZWQgdG8gZW5fVVNfT1MKKworICAgICAgICAgICAgJGh0dHBQcm92aWRlci5pbnRlcmNlcHRvcnMucHVzaCgnU2RjLlNlcnZpY2VzLkhlYWRlckludGVyY2VwdG9yJyk7CisgICAgICAgICAgICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCdTZGMuU2VydmljZXMuSHR0cEVycm9ySW50ZXJjZXB0b3InKTsKKworICAgICAgICAgICAgJHVybFJvdXRlclByb3ZpZGVyLm90aGVyd2lzZSgnd2VsY29tZScpOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICAnZGFzaGJvYXJkJywgeworICAgICAgICAgICAgICAgICAgICB1cmw6ICcvZGFzaGJvYXJkP3Nob3cmZm9sZGVyJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICdkYXNoYm9hcmQvZGFzaGJvYXJkLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLkRhc2hib2FyZFZpZXdNb2RlbCcsCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICAnd2VsY29tZScsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnL3dlbGNvbWUnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dlbGNvbWUvd2VsY29tZS12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5XZWxjb21lVmlld01vZGVsJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgICdkYXNoYm9hcmQuY292ZXInLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJy9jb3ZlcicsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnZGFzaGJvYXJkL2NvdmVyL2Rhc2hib2FyZC1jb3Zlci12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5EYXNoYm9hcmRDb3ZlclZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICAnZGFzaGJvYXJkLnR1dG9yaWFsLWVuZCcsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnL3R1dG9yaWFsLWVuZCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAndHV0b3JpYWwtZW5kL3R1dG9yaWFsLWVuZC5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuVHV0b3JpYWxFbmRWaWV3TW9kZWwnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ2FkZGl0aW9uYWxJbmZvcm1hdGlvbicsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnL2FkZGl0aW9uYWxJbmZvcm1hdGlvbicsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnYWRkaXRpb25hbC1pbmZvcm1hdGlvbi9hZGRpdGlvbmFsLWluZm9ybWF0aW9uLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLkFkZGl0aW9uYWxJbmZvcm1hdGlvblZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICBsZXQgY29tcG9uZW50c1BhcmFtOkFycmF5PGFueT4gPSBbJyRzdGF0ZVBhcmFtcycsICdTZGMuU2VydmljZXMuRW50aXR5U2VydmljZScsJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnICwgKCRzdGF0ZVBhcmFtczphbnksIEVudGl0eVNlcnZpY2U6U2RjLlNlcnZpY2VzLkVudGl0eVNlcnZpY2UsIGNhY2hlU2VydmljZTpTZXJ2aWNlcy5DYWNoZVNlcnZpY2UpID0+IHsKKyAgICAgICAgICAgICAgICBpZihjYWNoZVNlcnZpY2UuZ2V0KCdicmVhZGNydW1ic0NvbXBvbmVudHMnKSl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgY2FjaGVTZXJ2aWNlLmdldCgnYnJlYWRjcnVtYnNDb21wb25lbnRzJyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVNlcnZpY2UuZ2V0Q2F0YWxvZygpOyAvL2dldEFsbENvbXBvbmVudHMoKSBkb2VzbnQgcmV0dXJuIGNvbXBvbmVudHMgZnJvbSBjYXRhbG9nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfV07CisKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUgKAorICAgICAgICAgICAgICAgICd3b3Jrc3BhY2UnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJy93b3Jrc3BhY2UvOmlkLzp0eXBlLycsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeydpbXBvcnRlZEZpbGUnOm51bGwsJ2NvbXBvbmVudENzYXInOm51bGwsJ3Jlc291cmNlVHlwZSc6IG51bGwsICdkaXNhYmxlQnV0dG9ucyc6IG51bGx9LCAvLyd2c3BDb21wb25lbnQnOiBudWxsLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICd3b3Jrc3BhY2Uvd29ya3NwYWNlLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLldvcmtzcGFjZVZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdENvbXBvbmVudDogWyckc3RhdGVQYXJhbXMnLCAnQ29tcG9uZW50RmFjdG9yeScgLCBmdW5jdGlvbiAoJHN0YXRlUGFyYW1zLCBDb21wb25lbnRGYWN0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkc3RhdGVQYXJhbXMudnNwQ29tcG9uZW50KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzdGF0ZVBhcmFtcy52c3BDb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkc3RhdGVQYXJhbXMuaWQpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50RmFjdG9yeS5nZXRDb21wb25lbnRGcm9tU2VydmVyKCRzdGF0ZVBhcmFtcy50eXBlLnRvVXBwZXJDYXNlKCksICRzdGF0ZVBhcmFtcy5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkc3RhdGVQYXJhbXMuY29tcG9uZW50Q3NhciAmJiAkc3RhdGVQYXJhbXMuY29tcG9uZW50Q3Nhci5jc2FyVVVJRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHN0YXRlUGFyYW1zLmNvbXBvbmVudENzYXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVtcHR5Q29tcG9uZW50ID0gQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVFbXB0eUNvbXBvbmVudCgkc3RhdGVQYXJhbXMudHlwZS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5Q29tcG9uZW50LmlzUmVzb3VyY2UoKSAmJiAkc3RhdGVQYXJhbXMucmVzb3VyY2VUeXBlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVzb3VyY2UgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDxSZXNvdXJjZT5lbXB0eUNvbXBvbmVudCkucmVzb3VyY2VUeXBlID0gJHN0YXRlUGFyYW1zLnJlc291cmNlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkc3RhdGVQYXJhbXMuaW1wb3J0ZWRGaWxlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8TW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+ZW1wdHlDb21wb25lbnQpLmltcG9ydGVkRmlsZSA9ICRzdGF0ZVBhcmFtcy5pbXBvcnRlZEZpbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5Q29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czogY29tcG9uZW50c1BhcmFtCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0dFTkVSQUwsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnZ2VuZXJhbCcsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZScsCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5HZW5lcmFsVmlld01vZGVsJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvZ2VuZXJhbC9nZW5lcmFsLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YToge3Vuc2F2ZWRDaGFuZ2VzOmZhbHNlLGJvZHlDbGFzczonZ2VuZXJhbCd9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfSUNPTlMsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnaWNvbnMnLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UnLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuSWNvbnNWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk6c3RyaW5nID0+IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2ljb25zL2ljb25zLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YToge3Vuc2F2ZWRDaGFuZ2VzOmZhbHNlLGJvZHlDbGFzczonaWNvbnMnfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfQUNUSVZJVFlfTE9HLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ2FjdGl2aXR5X2xvZycsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZScsCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5BY3Rpdml0eUxvZ1ZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2FjdGl2aXR5LWxvZy9hY3Rpdml0eS1sb2cuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YToge3Vuc2F2ZWRDaGFuZ2VzOmZhbHNlfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0RFUExPWU1FTlRfQVJUSUZBQ1RTLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ2RlcGxveW1lbnRfYXJ0aWZhY3RzJywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLkRlcGxveW1lbnRBcnRpZmFjdHNWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk6c3RyaW5nID0+IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQtYXJ0aWZhY3RzL2RlcGxveW1lbnQtYXJ0aWZhY3RzLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YTp7CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5Q2xhc3M6J2RlcGxveW1lbnRfYXJ0aWZhY3RzJworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfSElFUkFSQ0hZLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ2hpZXJhcmNoeScsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZScsCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5Qcm9kdWN0SGllcmFyY2h5Vmlld01vZGVsJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpOnN0cmluZyA9PiB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICd3b3Jrc3BhY2UvdGFicy9wcm9kdWN0LWhpZXJhcmNoeS9wcm9kdWN0LWhpZXJhcmNoeS12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0lORk9STUFUSU9OX0FSVElGQUNUUywgeworICAgICAgICAgICAgICAgICAgICB1cmw6ICdpbmZvcm1hdGlvbl9hcnRpZmFjdHMnLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UnLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuSW5mb3JtYXRpb25BcnRpZmFjdHNWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk6c3RyaW5nID0+IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2luZm9ybWF0aW9uLWFydGlmYWN0cy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMtdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBkYXRhOnsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDbGFzczonaW5mb3JtYXRpb25fYXJ0aWZhY3RzJworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfVE9TQ0FfQVJUSUZBQ1RTLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ3Rvc2NhX2FydGlmYWN0cycsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZScsCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5Ub3NjYUFydGlmYWN0c1ZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKTpzdHJpbmcgPT4geworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvdG9zY2EtYXJ0aWZhY3RzL3Rvc2NhLWFydGlmYWN0cy12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGRhdGE6eworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNsYXNzOid0b3NjYV9hcnRpZmFjdHMnCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICBVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9QUk9QRVJUSUVTLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ3Byb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UnLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuUHJvcGVydGllc1ZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL3Byb3BlcnRpZXMvcHJvcGVydGllcy12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGRhdGE6eworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNsYXNzOidwcm9wZXJ0aWVzJworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfU0VSVklDRV9JTlBVVFMsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnc2VydmljZV9pbnB1dHMnLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UnLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuU2VydmljZUlucHV0c1ZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2lucHV0cy9zZXJ2aWNlLWlucHV0L3NlcnZpY2UtaW5wdXRzLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YTp7CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5Q2xhc3M6J3dvcmtzcGFjZS1pbnB1dHMnCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICBVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9SRVNPVVJDRV9JTlBVVFMsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAncmVzb3VyY2VfaW5wdXRzJywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLlJlc291cmNlSW5wdXRzVmlld01vZGVsJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvaW5wdXRzL3Jlc291cmNlLWlucHV0L3Jlc291cmNlLWlucHV0cy12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGRhdGE6eworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNsYXNzOid3b3Jrc3BhY2UtaW5wdXRzJworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfQVRUUklCVVRFUywgeworICAgICAgICAgICAgICAgICAgICB1cmw6ICdhdHRyaWJ1dGVzJywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLkF0dHJpYnV0ZXNWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICd3b3Jrc3BhY2UvdGFicy9hdHRyaWJ1dGVzL2F0dHJpYnV0ZXMtdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBkYXRhOnsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDbGFzczonYXR0cmlidXRlcycKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX1JFUVVJUkVNRU5UU19BTkRfQ0FQQUJJTElUSUVTLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ3JlcV9hbmRfY2FwYWJpbGl0aWVzJywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLlJlcUFuZENhcGFiaWxpdGllc1ZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL3JlcS1hbmQtY2FwYWJpbGl0aWVzL3JlcS1hbmQtY2FwYWJpbGl0aWVzLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YTp7CisgICAgICAgICAgICAgICAgICAgICAgICBib2R5Q2xhc3M6J2F0dHJpYnV0ZXMnCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX01BTkFHRU1FTlRfV09SS0ZMT1csIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnbWFuYWdlbWVudF93b3JrZmxvdycsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvbWFuYWdlbWVudC13b3JrZmxvdy9tYW5hZ2VtZW50LXdvcmtmbG93LXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLk1hbmFnZW1lbnRXb3JrZmxvd1ZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICBVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9ORVRXT1JLX0NBTExfRkxPVywgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UnLAorICAgICAgICAgICAgICAgICAgICB1cmw6ICduZXR3b3JrX2NhbGxfZmxvdycsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvbmV0d29yay1jYWxsLWZsb3cvbmV0d29yay1jYWxsLWZsb3ctdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuTmV0d29ya0NhbGxGbG93Vmlld01vZGVsJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0RJU1RSSUJVVElPTiwgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UnLAorICAgICAgICAgICAgICAgICAgICB1cmw6ICdkaXN0cmlidXRpb24nLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXN0cmlidXRpb24tdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuRGlzdHJpYnV0aW9uVmlld01vZGVsJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0NPTVBPU0lUSU9OLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ2NvbXBvc2l0aW9uLycsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZScsCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5Db21wb3NpdGlvblZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKTpzdHJpbmcgPT4geworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vY29tcG9zaXRpb24tdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBkYXRhOnsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDbGFzczonY29tcG9zaXRpb24nCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICBVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9ERVBMT1lNRU5ULCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ2RlcGxveW1lbnQvJywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLkRlcGxveW1lbnRWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk6c3RyaW5nID0+IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQvZGVwbG95bWVudC12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGRhdGE6eworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNsYXNzOidjb21wb3NpdGlvbicKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgICd3b3Jrc3BhY2UuY29tcG9zaXRpb24uZGV0YWlscycsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnZGV0YWlscycsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZS5jb21wb3NpdGlvbicsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9kZXRhaWxzL2RldGFpbHMtdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuRGV0YWlsc1ZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICAnd29ya3NwYWNlLmNvbXBvc2l0aW9uLnByb3BlcnRpZXMnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ3Byb3BlcnRpZXMnLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UuY29tcG9zaXRpb24nLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvcHJvcGVydGllcy1hbmQtYXR0cmlidXRlcy9wcm9wZXJ0aWVzLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLlJlc291cmNlUHJvcGVydGllc1ZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICAnd29ya3NwYWNlLmNvbXBvc2l0aW9uLmFydGlmYWN0cycsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnYXJ0aWZhY3RzJywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlLmNvbXBvc2l0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICd3b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2FydGlmYWN0cy9hcnRpZmFjdHMtdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuUmVzb3VyY2VBcnRpZmFjdHNWaWV3TW9kZWwnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ3dvcmtzcGFjZS5jb21wb3NpdGlvbi5yZWxhdGlvbnMnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ3JlbGF0aW9ucycsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZS5jb21wb3NpdGlvbicsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9yZWxhdGlvbnMvcmVsYXRpb25zLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLlJlbGF0aW9uc1ZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICAnd29ya3NwYWNlLmNvbXBvc2l0aW9uLnJlbGF0aW9uc2hpcHMnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ3JlbGF0aW9uc2hpcHMnLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UuY29tcG9zaXRpb24nLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3Jlc291cmNlLXJlbGF0aW9uc2hpcHMvcmVzb3VyY2UtcmVsYXRpb25zaGlwcy12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5SZXNvdXJjZVJlbGF0aW9uc2hpcHNWaWV3TW9kZWwnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ3dvcmtzcGFjZS5jb21wb3NpdGlvbi5zdHJ1Y3R1cmUnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ3N0cnVjdHVyZScsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZS5jb21wb3NpdGlvbicsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9zdHJ1Y3R1cmUvc3RydWN0dXJlLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLlN0cnVjdHVyZVZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ3dvcmtzcGFjZS5jb21wb3NpdGlvbi5saWZlY3ljbGUnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJ2xpZmVjeWNsZScsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ3dvcmtzcGFjZS5jb21wb3NpdGlvbicsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9hcnRpZmFjdHMvYXJ0aWZhY3RzLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLlJlc291cmNlQXJ0aWZhY3RzVmlld01vZGVsJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRzdGF0ZVByb3ZpZGVyLnN0YXRlKAorICAgICAgICAgICAgICAgICd3b3Jrc3BhY2UuY29tcG9zaXRpb24uYXBpJywgeworICAgICAgICAgICAgICAgICAgICB1cmw6ICdhcGknLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICd3b3Jrc3BhY2UuY29tcG9zaXRpb24nLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvYXJ0aWZhY3RzL2FydGlmYWN0cy12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5SZXNvdXJjZUFydGlmYWN0c1ZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ3dvcmtzcGFjZS5jb21wb3NpdGlvbi5kZXBsb3ltZW50JywgeworICAgICAgICAgICAgICAgICAgICB1cmw6ICdkZXBsb3ltZW50JywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50OiAnd29ya3NwYWNlLmNvbXBvc2l0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICd3b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2FydGlmYWN0cy9hcnRpZmFjdHMtdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuUmVzb3VyY2VBcnRpZmFjdHNWaWV3TW9kZWwnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ2VkaXQtcmVzb3VyY2UnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJy9lZGl0LXJlc291cmNlLzppZCcsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnZW50aXR5LWhhbmRsZXIvcmVzb3VyY2UtZm9ybS9yZXNvdXJjZS1mb3JtLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLlJlc291cmNlRm9ybVZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ2VkaXQtcHJvZHVjdCcsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnL2VkaXQtcHJvZHVjdC86aWQnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ2VudGl0eS1oYW5kbGVyL3Byb2R1Y3QtZm9ybS9wcm9kdWN0LWZvcm0tdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuUHJvZHVjdEZvcm1WaWV3TW9kZWwnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ2FkbWluRGFzaGJvYXJkJywgeworICAgICAgICAgICAgICAgICAgICB1cmw6ICcvYWRtaW5EYXNoYm9hcmQnLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByb3ZpZGVyOiBbJyR0ZW1wbGF0ZUNhY2hlJywgKCR0ZW1wbGF0ZUNhY2hlKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ2FkbWluLWRhc2hib2FyZC9hZG1pbi1kYXNoYm9hcmQtdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuQWRtaW5EYXNoYm9hcmRWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogWydBRE1JTiddCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ29uYm9hcmRWZW5kb3InLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJy9vbmJvYXJkVmVuZG9yJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICdvbmJvYXJkLXZlbmRvci9vbmJvYXJkLXZlbmRvci12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5PbmJvYXJkVmVuZG9yVmlld01vZGVsJy8vLAorICAgICAgICAgICAgICAgICAgICAvL3Jlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgYXV0aDogWyIkcSIsICJTZGMuU2VydmljZXMuVXNlclJlc291cmNlU2VydmljZSIsIGZ1bmN0aW9uICgkcTphbnksIHVzZXJSZXNvdXJjZVNlcnZpY2U6U2RjLlNlcnZpY2VzLklVc2VyUmVzb3VyY2VDbGFzcykgeworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgbGV0IHVzZXJJbmZvOlNkYy5TZXJ2aWNlcy5JVXNlclJlc291cmNlID0gdXNlclJlc291cmNlU2VydmljZS5nZXRMb2dnZWRpblVzZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGlmICh1c2VySW5mbykgeworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiAkcS53aGVuKHVzZXJJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuICRxLnJlamVjdCh7YXV0aGVudGljYXRlZDogZmFsc2V9KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgfV0KKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ2NhdGFsb2cnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJy9jYXRhbG9nJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICdjYXRhbG9nL2NhdGFsb2ctdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuQ2F0YWxvZ1ZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGg6IFsiJHEiLCAiU2RjLlNlcnZpY2VzLlVzZXJSZXNvdXJjZVNlcnZpY2UiLCBmdW5jdGlvbiAoJHE6YW55LCB1c2VyUmVzb3VyY2VTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5JVXNlclJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlckluZm86U2RjLlNlcnZpY2VzLklVc2VyUmVzb3VyY2UgPSB1c2VyUmVzb3VyY2VTZXJ2aWNlLmdldExvZ2dlZGluVXNlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VySW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHEud2hlbih1c2VySW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRxLnJlamVjdCh7YXV0aGVudGljYXRlZDogZmFsc2V9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9XQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ2Rpc3RyaWJ1dGlvbicsIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAnL2Rpc3RyaWJ1dGlvbicsCisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI6IFsnJHRlbXBsYXRlQ2FjaGUnLCAoJHRlbXBsYXRlQ2FjaGUpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnZGlzdHJpYnV0aW9uL2Rpc3RyaWJ1dGlvbi12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IHZpZXdNb2RlbHNNb2R1bGVOYW1lICsgJy5EaXN0cmlidXRpb25WaWV3TW9kZWwnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHN0YXRlUHJvdmlkZXIuc3RhdGUoCisgICAgICAgICAgICAgICAgJ3N1cHBvcnQnLCB7CisgICAgICAgICAgICAgICAgICAgIHVybDogJy9zdXBwb3J0JywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICdzdXBwb3J0L3N1cHBvcnQtdmlldy5odG1sJyk7CisgICAgICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB2aWV3TW9kZWxzTW9kdWxlTmFtZSArICcuU3VwcG9ydFZpZXdNb2RlbCcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkc3RhdGVQcm92aWRlci5zdGF0ZSgKKyAgICAgICAgICAgICAgICAnZXJyb3ItNDAzJywgeworICAgICAgICAgICAgICAgICAgICB1cmw6ICcvZXJyb3ItNDAzJywKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlcjogWyckdGVtcGxhdGVDYWNoZScsICgkdGVtcGxhdGVDYWNoZSk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICdtb2RhbHMvZXJyb3ItbW9kYWwvZXJyb3ItNDAzLXZpZXcuaHRtbCcpOworICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogdmlld01vZGVsc01vZHVsZU5hbWUgKyAnLkVycm9yVmlld01vZGVsJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHRvb2x0aXBzQ29uZmlnUHJvdmlkZXIub3B0aW9ucyh7CisKKyAgICAgICAgICAgICAgICBzaWRlOidib3R0b20nLAorICAgICAgICAgICAgICAgIGRlbGF5OiAnNjAwJywKKyAgICAgICAgICAgICAgICBjbGFzczogJ3Rvb2x0aXAtY3VzdG9tJywKKyAgICAgICAgICAgICAgICBsYXp5OjAsCisgICAgICAgICAgICAgICAgdHJ5OjAKKworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfQorICAgIF0pCisgICAgICAgIC5ydW4oWydBbmd1bGFySlNCcmlkZ2UnLCAoQW5ndWxhckpTQnJpZGdlKT0+eworCisgICAgICAgIH1dKTsKKyAgICBhcHBNb2R1bGUudmFsdWUoJ1ZhbGlkYXRpb25QYXR0ZXJuJywgL15bXHNcd1wmXy46LV17MSwxMDI0fSQvKTsKKyAgICBhcHBNb2R1bGUudmFsdWUoJ1Byb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuJywgL15bYS16QS1aMC05XzotXXsxLDUwfSQvKTsvLyBERTIxMDk3NworICAgIGFwcE1vZHVsZS52YWx1ZSgnVGFnVmFsaWRhdGlvblBhdHRlcm4nLCAvXltcc1x3Xy4tXXsxLDUwfSQvKTsKKyAgIC8vIGFwcE1vZHVsZS52YWx1ZSgnVmVuZG9yVmFsaWRhdGlvblBhdHRlcm4nLCAvXlteP1xcPD46Ii98Kl17MSwyNX0kLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdWZW5kb3JWYWxpZGF0aW9uUGF0dGVybicsIC9eW1x4MjAtXHgyMVx4MjMtXHgyOVx4MkItXHgyRVx4MzAtXHgzOVx4M0JceDNEXHg0MC1ceDVCXHg1RC1ceDdCXHg3RC1ceEZGXXsxLDI1fSQvKTsKKyAgICBhcHBNb2R1bGUudmFsdWUoJ0NvbnRhY3RJZFZhbGlkYXRpb25QYXR0ZXJuJywgL15bXHNcdy1dezEsNTB9JC8pOworICAgIGFwcE1vZHVsZS52YWx1ZSgnVXNlcklkVmFsaWRhdGlvblBhdHRlcm4nLC9eW1xzXHctXXsxLDUwfSQvKTsKKyAgICBhcHBNb2R1bGUudmFsdWUoJ1Byb2plY3RDb2RlVmFsaWRhdGlvblBhdHRlcm4nLCAvXltcc1x3LV17MSw1MH0kLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdMYWJlbFZhbGlkYXRpb25QYXR0ZXJuJywgL15bXHNhLXpBLVowLTkrLV17MSwyNX0kLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdVcmxWYWxpZGF0aW9uUGF0dGVybicsIC9eKGh0dHBzP3xmdHApOlwvXC8oKCgoW0EtWmEtel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDopKkApPygoKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSkpfCgoKFtBLVphLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFtBLVphLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbQS1aYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4pKygoW0EtWmEtel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgoW0EtWmEtel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFtBLVphLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSooW0EtWmEtel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlcLj8pKDpcZCopPykoXC8oKChbQS1aYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKSsoXC8oKFtBLVphLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6fEApKikqKT8pPyhcPygoKFtBLVphLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6fEApfFtcdUUwMDAtXHVGOEZGXXxcL3xcPykqKT8oXCMoKChbQS1aYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKXxcL3xcPykqKT8kLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdJbnRlZ2VyVmFsaWRhdGlvblBhdHRlcm4nLCAvXigoWy0rXT9cZCspfChbLStdPzB4WzAtOWEtZkEtRl0rKSkkLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdJbnRlZ2VyTm9MZWFkaW5nWmVyb1ZhbGlkYXRpb25QYXR0ZXJuJywgL14oMHxbLStdP1sxLTldWzAtOV0qfFstK10/MHhbMC05YS1mQS1GXSt8Wy0rXT8wb1swLTddKykkLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdGbG9hdFZhbGlkYXRpb25QYXR0ZXJuJywgL15bLStdP1swLTldKlwuP1swLTldKyhbZUVdWy0rXT9bMC05XSspP2Y/JC8pOworICAgIGFwcE1vZHVsZS52YWx1ZSgnTnVtYmVyVmFsaWRhdGlvblBhdHRlcm4nLCAvXigoKFstK10/XGQrKXwoWy0rXT8weFswLTlhLWZBLUZdKykpfChbLStdP1swLTldKlwuP1swLTldKyhbZUVdWy0rXT9bMC05XSspPykpJC8pOworICAgIGFwcE1vZHVsZS52YWx1ZSgnS2V5VmFsaWRhdGlvblBhdHRlcm4nLCAvXltcc1x3LV17MSw1MH0kLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdDb21tZW50VmFsaWRhdGlvblBhdHRlcm4nLCAvXltcdTAwMDAtXHUwMEJGXSokLyk7CisgICAgYXBwTW9kdWxlLnZhbHVlKCdCb29sZWFuVmFsaWRhdGlvblBhdHRlcm4nLCAvXihbVHRdW1JyXVtVdV1bRWVdfFtGZl1bQWFdW0xsXVtTc11bRWVdKSQvKTsKKworCisgICAgYXBwTW9kdWxlLnJ1bihbCisgICAgICAgICckaHR0cCcsCisgICAgICAgICdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJywKKyAgICAgICAgJ1NkYy5TZXJ2aWNlcy5Db29raWVTZXJ2aWNlJywKKyAgICAgICAgJ1NkYy5TZXJ2aWNlcy5Db25maWd1cmF0aW9uVWlTZXJ2aWNlJywKKyAgICAgICAgJ1NkYy5TZXJ2aWNlcy5Vc2VyUmVzb3VyY2VTZXJ2aWNlJywKKyAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYXRlZ29yeVJlc291cmNlU2VydmljZScsCisgICAgICAgICdTZGMuU2VydmljZXMuU2RjVmVyc2lvblNlcnZpY2UnLAorICAgICAgICAnJHN0YXRlJywKKyAgICAgICAgJyRyb290U2NvcGUnLAorICAgICAgICAnJGxvY2F0aW9uJywKKyAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICdzZGNNZW51JywKKyAgICAgICAgJ01vZGFsc0hhbmRsZXInLAorCSAgICAnU2RjLlNlcnZpY2VzLkVjb21wSGVhZGVyU2VydmljZScsCisgICAgICAgICdMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UnLAorICAgICAgICAoJGh0dHA6bmcuSUh0dHBTZXJ2aWNlLAorICAgICAgICAgY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSwKKyAgICAgICAgIGNvb2tpZVNlcnZpY2U6U2VydmljZXMuQ29va2llU2VydmljZSwKKyAgICAgICAgIENvbmZpZ3VyYXRpb25VaTpTZXJ2aWNlcy5Db25maWd1cmF0aW9uVWlTZXJ2aWNlLAorICAgICAgICAgVXNlclJlc291cmNlQ2xhc3M6U2VydmljZXMuSVVzZXJSZXNvdXJjZUNsYXNzLAorICAgICAgICAgY2F0ZWdvcnlSZXNvdXJjZVNlcnZpY2U6U2RjLlNlcnZpY2VzLklDYXRlZ29yeVJlc291cmNlQ2xhc3MsCisgICAgICAgICBzZGNWZXJzaW9uU2VydmljZTpTZXJ2aWNlcy5TZGNWZXJzaW9uU2VydmljZSwKKyAgICAgICAgICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlLAorICAgICAgICAgJHJvb3RTY29wZTpuZy5JUm9vdFNjb3BlU2VydmljZSwKKyAgICAgICAgICRsb2NhdGlvbjogbmcuSUxvY2F0aW9uU2VydmljZSwKKyAgICAgICAgIHNkY0NvbmZpZzogTW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgc2RjTWVudTogTW9kZWxzLklBcHBNZW51LAorICAgICAgICAgTW9kYWxzSGFuZGxlcjpVdGlscy5Nb2RhbHNIYW5kbGVyLAorICAgICAgICAgZWNvbXBIZWFkZXJTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5FY29tcEhlYWRlclNlcnZpY2UsCisgICAgICAgICBMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2U6U2VydmljZXMuQ29tcG9uZW50cy5MZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UKKyAgICAgICAgICk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIC8vaGFuZGxlIGNhY2hlIGRhdGEgLSB2ZXJzaW9uCisgICAgICAgICAgICBsZXQgaW5pdFNkY1ZlcnNpb246RnVuY3Rpb24gPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChyZXNwb25zZSkgPT4geworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRmFpbGVkIGluaXRTZGNWZXJzaW9uJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICBjYWNoZVNlcnZpY2Uuc2V0KCd2ZXJzaW9uJywgJ04vQScpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHZlcnNpb246YW55KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJWZXJzaW9uIHJldHVybmVkIGZyb20gc2VydmVyOiAiICsgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGxldCB0bXBWZXJBcnJheSA9IHZlcnNpb24udmVyc2lvbi5zcGxpdCgiLiIpOworICAgICAgICAgICAgICAgICAgICBsZXQgdmVyID0gdG1wVmVyQXJyYXlbMF0gKyAiLiIgKyB0bXBWZXJBcnJheVsxXSArICIuIiArIHRtcFZlckFycmF5WzJdOworICAgICAgICAgICAgICAgICAgICBjYWNoZVNlcnZpY2Uuc2V0KCd2ZXJzaW9uJywgdmVyKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgc2RjVmVyc2lvblNlcnZpY2UuZ2V0VmVyc2lvbigpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBpbml0RWNvbXBNZW51OkZ1bmN0aW9uID0gKHVzZXIpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGVjb21wSGVhZGVyU2VydmljZS5nZXRNZW51SXRlbXModXNlci51c2VySWQpLnRoZW4oKGRhdGEpPT4geworICAgICAgICAgICAgICAgICAgICAkcm9vdFNjb3BlWydtZW51SXRlbXMnXSA9IGRhdGE7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgaW5pdENvbmZpZ3VyYXRpb25VaTpGdW5jdGlvbiA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25VaQorICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvblVpKCkKKyAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGNvbmZpZ3VyYXRpb25VaTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlU2VydmljZS5zZXQoJ1VJQ29uZmlndXJhdGlvbicsIGNvbmZpZ3VyYXRpb25VaSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IGluaXRDYXRlZ29yaWVzOkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCB0byBpbml0IGNhdGVnb3JpZXMnKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgY2F0ZWdvcnlSZXNvdXJjZVNlcnZpY2UuZ2V0QWxsQ2F0ZWdvcmllcyh7dHlwZXM6ICdzZXJ2aWNlcyd9LCAoY2F0ZWdvcmllczpBcnJheTxNb2RlbHMuSU1haW5DYXRlZ29yeT4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBjYWNoZVNlcnZpY2Uuc2V0KCdzZXJ2aWNlQ2F0ZWdvcmllcycsIGNhdGVnb3JpZXMpOworICAgICAgICAgICAgICAgIH0sIG9uRXJyb3IpOworCisgICAgICAgICAgICAgICAgY2F0ZWdvcnlSZXNvdXJjZVNlcnZpY2UuZ2V0QWxsQ2F0ZWdvcmllcyh7dHlwZXM6ICdyZXNvdXJjZXMnfSwgKGNhdGVnb3JpZXM6QXJyYXk8TW9kZWxzLklNYWluQ2F0ZWdvcnk+KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVTZXJ2aWNlLnNldCgncmVzb3VyY2VDYXRlZ29yaWVzJywgY2F0ZWdvcmllcyk7CisgICAgICAgICAgICAgICAgfSwgb25FcnJvcik7CisKKyAgICAgICAgICAgICAgICBjYXRlZ29yeVJlc291cmNlU2VydmljZS5nZXRBbGxDYXRlZ29yaWVzKHt0eXBlczogJ3Byb2R1Y3RzJ30sIChjYXRlZ29yaWVzOkFycmF5PE1vZGVscy5JTWFpbkNhdGVnb3J5Pik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlU2VydmljZS5zZXQoJ3Byb2R1Y3RDYXRlZ29yaWVzJywgY2F0ZWdvcmllcyk7CisgICAgICAgICAgICAgICAgfSwgb25FcnJvcik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgaW5pdEJhc2VVcmw6RnVuY3Rpb24gPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZW52OnN0cmluZyA9IHNkY0NvbmZpZy5lbnZpcm9ubWVudDsKKyAgICAgICAgICAgICAgICBsZXQgYmFzZVVybDpzdHJpbmcgPSAkbG9jYXRpb24uYWJzVXJsKCk7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coImJhc2VVcmw9IitiYXNlVXJsKTsKKworICAgICAgICAgICAgICAgIGlmKGJhc2VVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2RjQ29uZmlnLmFwaS5iYXNlVXJsID0gYmFzZVVybDsKKworICAgICAgICAgICAgICAgICAgICBpZihlbnY9PT0ncHJvZCcpeworICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdGVtcFVybCA9ICRsb2NhdGlvbi5hYnNVcmwoKS5zcGxpdCgnL3NkYzEvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFpblVybCA9IGxvY2F0aW9uLnByb3RvY29sKycvLycrbG9jYXRpb24uaG9zdG5hbWUrKGxvY2F0aW9uLnBvcnQgPyAnOicrbG9jYXRpb24ucG9ydDogJycpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIm1haW5Vcmw9IittYWluVXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNkY0NvbmZpZy5hcGkucm9vdCA9IG1haW5VcmwgKyAgc2RjQ29uZmlnLmFwaS5yb290OworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInNkY0NvbmZpZy5hcGkucm9vdD0iK3NkY0NvbmZpZy5hcGkucm9vdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgaW5pdExlZnRQYWxldHRlOkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlLmxvYWRMZWZ0UGFuZWwoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vaGFuZGxlIGh0dHAgY29uZmlnCisgICAgICAgICAgICAkaHR0cC5kZWZhdWx0cy53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOworICAgICAgICAgICAgJGh0dHAuZGVmYXVsdHMuaGVhZGVycy5jb21tb25bY29va2llU2VydmljZS5nZXRVc2VySWRTdWZmaXgoKV0gPSBjb29raWVTZXJ2aWNlLmdldFVzZXJJZCgpOworCisgICAgICAgICAgICBpbml0QmFzZVVybCgpOworICAgICAgICAgICAgaW5pdFNkY1ZlcnNpb24oKTsKKyAgICAgICAgICAgIGluaXRDb25maWd1cmF0aW9uVWkoKTsKKyAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5JTUFHRV9QQVRIID0gc2RjQ29uZmlnLmltYWdlc1BhdGg7CisgICAgICAgICAgICBpbml0TGVmdFBhbGV0dGUoKTsKKworICAgICAgICAgICAgLy9oYW5kbGUgc3RhdGVDaGFuZ2VTdGFydAorICAgICAgICAgICAgbGV0IGludGVybmFsRGVyZWdpc3RlclN0YXRlQ2hhbmdlU3RhcnRXYXRjaGVyOkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKGRlcmVnaXN0ZXJTdGF0ZUNoYW5nZVN0YXJ0V2F0Y2hlcikgeworICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlclN0YXRlQ2hhbmdlU3RhcnRXYXRjaGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgcmVtb3ZlTG9hZGVyOkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgJCgiLnNkYy1sb2FkaW5nLXBhZ2UgLm1haW4tbG9hZGVyIikuYWRkQ2xhc3MoImFuaW1hdGVkIGZhZGVPdXQiKTsKKyAgICAgICAgICAgICAgICAkKCIuc2RjLWxvYWRpbmctcGFnZSAuY2FwdGlvbjEiKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZU91dCIpOworICAgICAgICAgICAgICAgICQoIi5zZGMtbG9hZGluZy1wYWdlIC5jYXB0aW9uMiIpLmFkZENsYXNzKCJhbmltYXRlZCBmYWRlT3V0Iik7CisgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk6dm9pZD0+eworICAgICAgICAgICAgICAgICAgICAkKCIuc2RjLWxvYWRpbmctcGFnZSAubWFpbi1sb2FkZXIiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOworICAgICAgICAgICAgICAgICAgICAkKCIuc2RjLWxvYWRpbmctcGFnZSAuY2FwdGlvbjEiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOworICAgICAgICAgICAgICAgICAgICAkKCIuc2RjLWxvYWRpbmctcGFnZSAuY2FwdGlvbjIiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOworICAgICAgICAgICAgICAgICAgICAkKCIuc2RjLWxvYWRpbmctcGFnZSIpLmFkZENsYXNzKCJhbmltYXRlZCBmYWRlT3V0Iik7CisgICAgICAgICAgICAgICAgfSwxMDAwKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBvbk5hdmlnYXRlT3V0OkZ1bmN0aW9uID0gKHRvU3RhdGUsIHRvUGFyYW1zKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgb25PayA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAkc3RhdGUuY3VycmVudC5kYXRhLnVuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbyh0b1N0YXRlLm5hbWUsIHRvUGFyYW1zKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBzZGNNZW51LmFsZXJ0TWVzc2FnZXMuZXhpdFdpdGhvdXRTYXZpbmc7CisgICAgICAgICAgICAgICAgLy9vcGVuIG5vdGlmeSB0byB1c2VyIGlmIGNoYW5nZXMgYXJlIG5vdCBzYXZlZAorICAgICAgICAgICAgICAgIE1vZGFsc0hhbmRsZXIub3BlbkFsZXJ0TW9kYWwoZGF0YS50aXRsZSwgZGF0YS5tZXNzYWdlKS50aGVuKG9uT2spOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IG9uU3RhdGVDaGFuZ2VTdGFydDpGdW5jdGlvbiA9IChldmVudCwgdG9TdGF0ZSwgdG9QYXJhbXMsIGZyb21TdGF0ZSwgZnJvbVBhcmFtcyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpOworICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnJHN0YXRlQ2hhbmdlU3RhcnQnLCB0b1N0YXRlLm5hbWUpOworICAgICAgICAgICAgICAgLy9zZXQgYm9keSBjbGFzcworICAgICAgICAgICAgICAgICRyb290U2NvcGVbJ2JvZHlDbGFzcyddID0gJ2RlZmF1bHQtY2xhc3MnOworICAgICAgICAgICAgICAgIGlmKHRvU3RhdGUuZGF0YSAmJiB0b1N0YXRlLmRhdGEuYm9keUNsYXNzKXsKKyAgICAgICAgICAgICAgICAgICAgJHJvb3RTY29wZVsnYm9keUNsYXNzJ10gPSB0b1N0YXRlLmRhdGEuYm9keUNsYXNzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgaW4gY2FzZSB3ZSBhcmUgZW50ZXJpbmcgb3RoZXIgc3RhdGUgdGhlbiB3b3Jrc3BhY2UgKHVzZXIgbW92ZSB0byBjYXRhbG9nKQorICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2hhbmdlQ29tcG9uZW50Q3NhclZlcnNpb24sIHVzZXIgc2hvdWxkIG9wZW4gYWdhaW4gdGhlIFZTUCBsaXN0IGFuZCBzZWxlY3Qgb25lIGZvciB1cGRhdGUuCisgICAgICAgICAgICAgICAgaWYgKHRvU3RhdGUubmFtZS5pbmRleE9mKCd3b3Jrc3BhY2UnKSA9PT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlU2VydmljZS5jb250YWlucyhVdGlscy5Db25zdGFudHMuQ0hBTkdFX0NPTVBPTkVOVF9DU0FSX1ZFUlNJT05fRkxBRykpeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTZXJ2aWNlLnJlbW92ZShVdGlscy5Db25zdGFudHMuQ0hBTkdFX0NPTVBPTkVOVF9DU0FSX1ZFUlNJT05fRkxBRyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3NhdmluZyBsYXN0IHN0YXRlIHRvIHBhcmFtcyAsIGZvciBicmVhZGNydW1icworICAgICAgICAgICAgICAgIGlmIChbJ2Rhc2hib2FyZCcsICdjYXRhbG9nJywgJ29uYm9hcmRWZW5kb3InXS5pbmRleE9mKGZyb21TdGF0ZS5uYW1lKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRvUGFyYW1zLnByZXZpb3VzU3RhdGUgPSBmcm9tU3RhdGUubmFtZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0b1BhcmFtcy5wcmV2aW91c1N0YXRlID0gZnJvbVBhcmFtcy5wcmV2aW91c1N0YXRlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b1N0YXRlLm5hbWUgIT09ICdlcnJvci00MDMnICYmICFVc2VyUmVzb3VyY2VDbGFzcy5nZXRMb2dnZWRpblVzZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbERlcmVnaXN0ZXJTdGF0ZUNoYW5nZVN0YXJ0V2F0Y2hlcigpOworICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisgICAgICAgICAgICAgICAgICAgIFVzZXJSZXNvdXJjZUNsYXNzLmF1dGhvcml6ZSgpLiRwcm9taXNlLnRoZW4oKHVzZXI6U2VydmljZXMuSVVzZXJSZXNvdXJjZSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvZXNVc2VySGFzQWNjZXNzKHRvU3RhdGUsIHVzZXIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlLmdvKCdlcnJvci00MDMnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdVc2VyIGhhcyBubyBwZXJtaXNzaW9ucycpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlclN0YXRlQ2hhbmdlU3RhcnRXYXRjaGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJSZXNvdXJjZUNsYXNzLnNldExvZ2dlZGluVXNlcih1c2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlU2VydmljZS5zZXQoJ3VzZXInLCB1c2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDYXRlZ29yaWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAvLyAgIGluaXRFY29tcE1lbnUodXNlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRlcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVc2VyUmVzb3VyY2VDbGFzcy5nZXRMb2dnZWRpblVzZXIoKS5yb2xlID09PSAnQURNSU4nKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b1N0YXRlLm5hbWUgPSAiYWRtaW5EYXNoYm9hcmQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oImFkbWluRGFzaGJvYXJkIiwgdG9QYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlclN0YXRlQ2hhbmdlU3RhcnRXYXRjaGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciB1c2VyIGF1dGhvcml6ZWQgaW5pdCBjYXRlZ29yaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk6dm9pZD0+eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmICgkc3RhdGUuY3VycmVudC5uYW1lPT09JycgfHwgJHN0YXRlLmN1cnJlbnQubmFtZT09PSdwcmVsb2FkaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHN0YXRlLmN1cnJlbnQubmFtZSA9PT0gIndlbGNvbWUiICYmIHNkY0NvbmZpZy5vcGVuU291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlLmdvKCJkYXNoYm9hcmQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkc3RhdGUuY3VycmVudC5uYW1lPT09JycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbyh0b1N0YXRlLm5hbWUsIHRvUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCItLS0tLS0kc3RhdGUuY3VycmVudC5uYW1lPSIgKyAkc3RhdGUuY3VycmVudC5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCctLS0tLXJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIgYXV0aG9yaXplICRzdGF0ZUNoYW5nZVN0YXJ0Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOworCisgICAgICAgICAgICAgICAgICAgIH0sICgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZS5nbygnZXJyb3ItNDAzJyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygncmVnaXN0ZXJTdGF0ZUNoYW5nZVN0YXJ0V2F0Y2hlciBlcnJvci00MDMgJHN0YXRlQ2hhbmdlU3RhcnQnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoVXNlclJlc291cmNlQ2xhc3MuZ2V0TG9nZ2VkaW5Vc2VyKCkpeworICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbERlcmVnaXN0ZXJTdGF0ZUNoYW5nZVN0YXJ0V2F0Y2hlcigpOworICAgICAgICAgICAgICAgICAgICBpZighZG9lc1VzZXJIYXNBY2Nlc3ModG9TdGF0ZSwgVXNlclJlc291cmNlQ2xhc3MuZ2V0TG9nZ2VkaW5Vc2VyKCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ2Vycm9yLTQwMycpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdVc2VyIGhhcyBubyBwZXJtaXNzaW9ucycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHRvU3RhdGUubmFtZSA9PT0gIndlbGNvbWUiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oImRhc2hib2FyZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiBmb3JtIGlzIGRpcnR5IGFuZCBub3Qgc2F2ZSAgLSBub3RpZnkgdG8gdXNlcgorICAgICAgICAgICAgICAgICAgICBpZihmcm9tU3RhdGUuZGF0YSAmJiBmcm9tU3RhdGUuZGF0YS51bnNhdmVkQ2hhbmdlcyAmJiBmcm9tUGFyYW1zLmlkICE9IHRvUGFyYW1zLmlkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvbk5hdmlnYXRlT3V0KHRvU3RhdGUsIHRvUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IGRvZXNVc2VySGFzQWNjZXNzOkZ1bmN0aW9uID0gKHRvU3RhdGUsIHVzZXIpOmJvb2xlYW4gPT57CisKKyAgICAgICAgICAgICAgICBsZXQgaXNVc2VySGFzQWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZih0b1N0YXRlLnBlcm1pc3Npb25zICYmIHRvU3RhdGUucGVybWlzc2lvbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgaXNVc2VySGFzQWNjZXNzID0gXy5pbmNsdWRlcyh0b1N0YXRlLnBlcm1pc3Npb25zLCB1c2VyLnJvbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaXNVc2VySGFzQWNjZXNzOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBkZXJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXI6RnVuY3Rpb247CisKKyAgICAgICAgICAgIGxldCByZWdpc3RlclN0YXRlQ2hhbmdlU3RhcnRXYXRjaGVyOkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaW50ZXJuYWxEZXJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIoKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ3JlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIgJHN0YXRlQ2hhbmdlU3RhcnQnKTsKKyAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyU3RhdGVDaGFuZ2VTdGFydFdhdGNoZXIgPSAkcm9vdFNjb3BlLiRvbignJHN0YXRlQ2hhbmdlU3RhcnQnLCAoZXZlbnQsIHRvU3RhdGUsIHRvUGFyYW1zLCBmcm9tU3RhdGUsIGZyb21QYXJhbXMpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBvblN0YXRlQ2hhbmdlU3RhcnQoZXZlbnQsIHRvU3RhdGUsIHRvUGFyYW1zLCBmcm9tU3RhdGUsIGZyb21QYXJhbXMpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmVnaXN0ZXJTdGF0ZUNoYW5nZVN0YXJ0V2F0Y2hlcigpOworCisgICAgICAgIH1dKTsKKworCisKK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2NsaWNrZWQtb3V0c2lkZS9jbGlja2VkLW91dHNpZGUtZGlyZWN0aXZlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2NsaWNrZWQtb3V0c2lkZS9jbGlja2VkLW91dHNpZGUtZGlyZWN0aXZlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMGFmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvY2xpY2tlZC1vdXRzaWRlL2NsaWNrZWQtb3V0c2lkZS1kaXJlY3RpdmUudHMKQEAgLTAsMCArMSwxMzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworCisgICAgY2xhc3MgQ2xpY2tlZE91dHNpZGVNb2RlbHsKKworICAgICAgcHJpdmF0ZSBjbGlja2VkT3V0c2lkZUNvbnRhaW5lclNlbGVjdG9yOiBzdHJpbmc7CisgICAgICBwcml2YXRlIG9uQ2xpY2tlZE91dHNpZGVHZXR0ZXI6IEZ1bmN0aW9uOworICAgICAgcHJpdmF0ZSBjbGlja2VkT3V0c2lkZUVuYWJsZUdldHRlcjogRnVuY3Rpb247CisKKyAgICAgIGNvbnN0cnVjdG9yKGNsaWNrZWRPdXRzaWRlRGF0YTogYW55KSB7CisgICAgICAgIHRoaXMuY2xpY2tlZE91dHNpZGVDb250YWluZXJTZWxlY3RvciA9IGNsaWNrZWRPdXRzaWRlRGF0YS5jbGlja2VkT3V0c2lkZUNvbnRhaW5lclNlbGVjdG9yOworICAgICAgICB0aGlzLm9uQ2xpY2tlZE91dHNpZGVHZXR0ZXIgPSBjbGlja2VkT3V0c2lkZURhdGEub25DbGlja2VkT3V0c2lkZUdldHRlcjsKKyAgICAgICAgdGhpcy5jbGlja2VkT3V0c2lkZUVuYWJsZUdldHRlciA9IGNsaWNrZWRPdXRzaWRlRGF0YS5jbGlja2VkT3V0c2lkZUVuYWJsZUdldHRlcjsKKyAgICAgIH0KKworICAgICAgcHVibGljIGdldENsaWNrZWRPdXRzaWRlQ29udGFpbmVyU2VsZWN0b3IgPSAoKTogc3RyaW5nID0+IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2xpY2tlZE91dHNpZGVDb250YWluZXJTZWxlY3RvcjsKKyAgICAgIH0KKworICAgICAgcHVibGljIGdldE9uQ2xpY2tlZE91dHNpZGVHZXR0ZXIgPSAoKTogRnVuY3Rpb24gPT4geworICAgICAgICByZXR1cm4gdGhpcy5vbkNsaWNrZWRPdXRzaWRlR2V0dGVyOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0Q2xpY2tlZE91dHNpZGVFbmFibGVHZXR0ZXIgPSAoKTogRnVuY3Rpb24gPT4geworICAgICAgICByZXR1cm4gdGhpcy5jbGlja2VkT3V0c2lkZUVuYWJsZUdldHRlcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDbGlja2VkT3V0c2lkZURpcmVjdGl2ZVNjb3BlIGV4dGVuZHMgbmcuSVNjb3Ble30KKworICAgIGV4cG9ydCBjbGFzcyBDbGlja2VkT3V0c2lkZURpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRkb2N1bWVudDogSlF1ZXJ5LCBwcml2YXRlICRwYXJzZTogbmcuSVBhcnNlU2VydmljZSkge30KKworICAgICAgICByZXN0cmljdCA9ICdBJzsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklDbGlja2VkT3V0c2lkZURpcmVjdGl2ZVNjb3BlLCBlbGVtZW50OiBKUXVlcnksIGF0dHJzKSA9PiB7CisKKyAgICAgICAgICBsZXQgY29udGFpbmVyOiBIVE1MRWxlbWVudDsKKyAgICAgICAgICBsZXQgYXR0cnNBZnRlckV2YWwgPSBzY29wZS4kZXZhbChhdHRycy5jbGlja2VkT3V0c2lkZSk7CisgICAgICAgICAgYXR0cnNBZnRlckV2YWwub25DbGlja2VkT3V0c2lkZUdldHRlciA9IHRoaXMuJHBhcnNlKGF0dHJzQWZ0ZXJFdmFsLm9uQ2xpY2tlZE91dHNpZGUpOworICAgICAgICAgIGF0dHJzQWZ0ZXJFdmFsLmNsaWNrZWRPdXRzaWRlRW5hYmxlR2V0dGVyID0gdGhpcy4kcGFyc2UoYXR0cnNBZnRlckV2YWwuY2xpY2tlZE91dHNpZGVFbmFibGUpOworCisgICAgICAgICAgbGV0IGNsaWNrZWRPdXRzaWRlTW9kZWw6IENsaWNrZWRPdXRzaWRlTW9kZWwgPSBuZXcgQ2xpY2tlZE91dHNpZGVNb2RlbChhdHRyc0FmdGVyRXZhbCk7CisKKworICAgICAgICAgIGxldCBnZXRDb250YWluZXI6IEZ1bmN0aW9uID0gKCk6SFRNTEVsZW1lbnQgPT4geworICAgICAgICAgICAgaWYoIWNvbnRhaW5lcil7CisgICAgICAgICAgICAgIGxldCBjbGlja2VkT3V0c2lkZUNvbnRhaW5lclNlbGVjdG9yOiBzdHJpbmcgPSBjbGlja2VkT3V0c2lkZU1vZGVsLmdldENsaWNrZWRPdXRzaWRlQ29udGFpbmVyU2VsZWN0b3IoKTsKKyAgICAgICAgICAgICAgaWYoIWFuZ3VsYXIuaXNVbmRlZmluZWQoY2xpY2tlZE91dHNpZGVDb250YWluZXJTZWxlY3RvcikgJiYgY2xpY2tlZE91dHNpZGVDb250YWluZXJTZWxlY3RvciAhPT0gJycpeworICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50cyhjbGlja2VkT3V0c2lkZUNvbnRhaW5lclNlbGVjdG9yKyc6Zmlyc3QnKVswXTsKKyAgICAgICAgICAgICAgICBpZighY29udGFpbmVyKXsKKyAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnRbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbGVtZW50WzBdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyOworICAgICAgICAgIH07CisKKworICAgICAgICAgIGxldCBvbkNsaWNrZWRPdXRzaWRlID0gKGV2ZW50OiBKUXVlcnlFdmVudE9iamVjdCkgPT4geworICAgICAgICAgICAgICBsZXQgY29udGFpbmVyRG9tRWxlbWVudDogSFRNTEVsZW1lbnQgPSBnZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgbGV0IHRhcmdldERvbUVsZW1lbnRKcTogSlF1ZXJ5ID0gYW5ndWxhci5lbGVtZW50KGV2ZW50LnRhcmdldCk7CisgICAgICAgICAgICAgIGlmKHRhcmdldERvbUVsZW1lbnRKcS5oYXNDbGFzcygndG9vbHRpcCcpIHx8IHRhcmdldERvbUVsZW1lbnRKcS5wYXJlbnRzKCcudG9vbHRpcDpmaXJzdCcpLmxlbmd0aCl7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGV0IHRhcmdldERvbUVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGFyZ2V0RG9tRWxlbWVudEpxWzBdOworICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lckRvbUVsZW1lbnQuY29udGFpbnModGFyZ2V0RG9tRWxlbWVudCkpeworICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IG9uQ2xpY2tlZE91dHNpZGVHZXR0ZXI6RnVuY3Rpb24gPSBjbGlja2VkT3V0c2lkZU1vZGVsLmdldE9uQ2xpY2tlZE91dHNpZGVHZXR0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb25DbGlja2VkT3V0c2lkZUdldHRlcihzY29wZSk7CisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH07CisKKyAgICAgICAgICBsZXQgYXR0YWNoRG9tRXZlbnRzOiBGdW5jdGlvbiA9ICgpID0+IHsKKyAgICAgICAgICAgIHRoaXMuJGRvY3VtZW50Lm9uKCdtb3VzZWRvd24nLCBvbkNsaWNrZWRPdXRzaWRlKTsKKyAgICAgICAgICB9OworCisgICAgICAgICAgbGV0IGRldGFjaERvbUV2ZW50czogRnVuY3Rpb24gPSAoKSA9PiB7CisgICAgICAgICAgICB0aGlzLiRkb2N1bWVudC5vZmYoJ21vdXNlZG93bicsIG9uQ2xpY2tlZE91dHNpZGUpOworICAgICAgICAgIH07CisKKyAgICAgICAgICAvLworICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCAoKSA9PiB7CisgICAgICAgICAgICBkZXRhY2hEb21FdmVudHMoKTsKKyAgICAgICAgICB9KTsKKworCisgICAgICAgICAgc2NvcGUuJHdhdGNoKCgpID0+IHsKKyAgICAgICAgICAgIGxldCBjbGlja2VkT3V0c2lkZUVuYWJsZUdldHRlcjogRnVuY3Rpb24gPSBjbGlja2VkT3V0c2lkZU1vZGVsLmdldENsaWNrZWRPdXRzaWRlRW5hYmxlR2V0dGVyKCk7CisgICAgICAgICAgICByZXR1cm4gY2xpY2tlZE91dHNpZGVFbmFibGVHZXR0ZXIoc2NvcGUpOworICAgICAgICAgIH0sIChuZXdWYWx1ZTogYm9vbGVhbikgPT4geworICAgICAgICAgICAgICAgIGlmKG5ld1ZhbHVlKXsKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoRG9tRXZlbnRzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGV0YWNoRG9tRXZlbnRzKCk7CisgICAgICAgICAgfSk7CisKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCRkb2N1bWVudDogSlF1ZXJ5LCAkcGFyc2U6IG5nLklQYXJzZVNlcnZpY2UpID0+IHsKKyAgICAgICAgICByZXR1cm4gbmV3IENsaWNrZWRPdXRzaWRlRGlyZWN0aXZlKCRkb2N1bWVudCwgJHBhcnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENsaWNrZWRPdXRzaWRlRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJGRvY3VtZW50JywgJyRwYXJzZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2N1c3RvbS12YWxpZGF0aW9uL2N1c3RvbS12YWxpZGF0aW9uLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2N1c3RvbS12YWxpZGF0aW9uL2N1c3RvbS12YWxpZGF0aW9uLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjgzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvY3VzdG9tLXZhbGlkYXRpb24vY3VzdG9tLXZhbGlkYXRpb24udHMKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDdXN0b21WYWxpZGF0aW9uU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICB2YWxpZGF0aW9uRnVuYzogRnVuY3Rpb247CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEN1c3RvbVZhbGlkYXRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHt9CisKKyAgICAgICAgcmVxdWlyZSA9ICduZ01vZGVsJzsKKyAgICAgICAgcmVzdHJpY3QgPSAnQSc7CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICB2YWxpZGF0aW9uRnVuYzogJz0nCisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9IChzY29wZTpJQ3VzdG9tVmFsaWRhdGlvblNjb3BlLCBlbGVtLCBhdHRycywgbmdNb2RlbCkgPT4geworCisgICAgICAgICAgICBuZ01vZGVsLiR2YWxpZGF0b3JzLmN1c3RvbVZhbGlkYXRpb24gPSAobW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSA6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLnZhbGlkYXRpb25GdW5jKHZpZXdWYWx1ZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVZhbGlkYXRpb25EaXJlY3RpdmUoKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIEN1c3RvbVZhbGlkYXRpb25EaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gW107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZG93bmxvYWQtYXJ0aWZhY3QvZG93bmxvYWQtYXJ0aWZhY3QudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZG93bmxvYWQtYXJ0aWZhY3QvZG93bmxvYWQtYXJ0aWZhY3QudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZjE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9kb3dubG9hZC1hcnRpZmFjdC9kb3dubG9hZC1hcnRpZmFjdC50cwpAQCAtMCwwICsxLDE0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIERPV05MT0FEX0NTU19DTEFTU0VTIHsKKyAgICAgICAgc3RhdGljIERPV05MT0FEX0lDT04gPSAidGFibGUtZG93bmxvYWQtYnRuIHRvc2NhIjsKKyAgICAgICAgc3RhdGljIExPQURFUl9JQ09OID0gInRsdi1sb2FkZXIgc21hbGwgbG9hZGVyIjsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElEb3dubG9hZEFydGlmYWN0U2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICAkd2luZG93OmFueTsKKyAgICAgICAgYXJ0aWZhY3Q6IE1vZGVscy5BcnRpZmFjdE1vZGVsOworICAgICAgICBjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgaW5zdGFuY2U6Ym9vbGVhbjsKKyAgICAgICAgZG93bmxvYWQ6IEZ1bmN0aW9uOworICAgICAgICBzaG93TG9hZGVyOmJvb2xlYW47CisgICAgICAgIHVwZGF0ZURvd25sb2FkSWNvbjpGdW5jdGlvbjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRG93bmxvYWRBcnRpZmFjdERpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHdpbmRvdzphbnkscHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlLCBwcml2YXRlIEV2ZW50TGlzdGVuZXJTZXJ2aWNlOlNlcnZpY2VzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLCBwcml2YXRlIGZpbGVVdGlsczpTZGMuVXRpbHMuRmlsZVV0aWxzKSB7fQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgYXJ0aWZhY3Q6ICc9JywKKyAgICAgICAgICAgIGNvbXBvbmVudDogJz0nLAorICAgICAgICAgICAgaW5zdGFuY2U6Jz0nLAorICAgICAgICAgICAgc2hvd0xvYWRlcjonPScKKyAgICAgICAgfTsKKyAgICAgICAgcmVzdHJpY3QgPSAnRUEnOworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SURvd25sb2FkQXJ0aWZhY3RTY29wZSwgZWxlbWVudDphbnkpID0+IHsKKyAgICAgICAgICAgIHNjb3BlLiR3aW5kb3cgPSB0aGlzLiR3aW5kb3c7CisKKyAgICAgICAgICAgIGVsZW1lbnQub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgc2NvcGUuZG93bmxvYWQoc2NvcGUuYXJ0aWZhY3QpOworICAgICAgICAgICAgfSk7CisKKworICAgICAgICAgICAgbGV0IGluaXREb3dubG9hZExvYWRlciA9ICgpPT57CisgICAgICAgICAgICAgICAgLy9pZiB0aGUgYXJ0aWZhY3QgaXMgaW4gYSBtaWRkbGUgb2YgZG93bmxvYWQgcHJvZ3Jlc3MgcmVnaXN0ZXIgZm9ybSBjYWxsQmFjayAmIGNoYW5nZSBpY29uIGZyb20gZG93bmxvYWQgdG8gbG9hZGVyCisgICAgICAgICAgICAgICAgaWYoc2NvcGUuc2hvd0xvYWRlciAmJiAgdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KHNjb3BlLmFydGlmYWN0LnVuaXF1ZUlkKSl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlckNhbGxiYWNrKFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuRE9XTkxPQURfQVJUSUZBQ1RfRklOSVNIX0VWRU5UICsgc2NvcGUuYXJ0aWZhY3QudW5pcXVlSWQsIHNjb3BlLnVwZGF0ZURvd25sb2FkSWNvbik7CisgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jYWNoZVNlcnZpY2UuZ2V0KHNjb3BlLmFydGlmYWN0LnVuaXF1ZUlkKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFswXS5jbGFzc05hbWUgPSBET1dOTE9BRF9DU1NfQ0xBU1NFUy5MT0FERVJfSUNPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwxMDAwKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBzZXREb3dubG9hZGVkRmlsZUxvYWRlciA9ICgpPT4geworICAgICAgICAgICAgICAgIGlmKHNjb3BlLnNob3dMb2FkZXIpeworICAgICAgICAgICAgICAgICAgICAvL3NldCBpbiBjYWNoZSBzZXJ2aWNlIHRoZXQgdGhlIGFydGlmYWN0IGlzIGluIGRvd25sb2FkIHByb2dyZXNzCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLnNldChzY29wZS5hcnRpZmFjdC51bmlxdWVJZCx0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5pdERvd25sb2FkTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IHJlbW92ZURvd25sb2FkZWRGaWxlTG9hZGVyID0gKCk9PiB7CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnNob3dMb2FkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0KHNjb3BlLmFydGlmYWN0LnVuaXF1ZUlkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuRE9XTkxPQURfQVJUSUZBQ1RfRklOSVNIX0VWRU5UICsgc2NvcGUuYXJ0aWZhY3QudW5pcXVlSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgLy9yZXBsYWNlIHRoZSBsb2FkZXIgdG8gZG93bmxvYWQgaWNvbgorICAgICAgICAgICAgc2NvcGUudXBkYXRlRG93bmxvYWRJY29uID0gKCkgPT57CisgICAgICAgICAgICAgICAgZWxlbWVudFswXS5jbGFzc05hbWUgPSAgRE9XTkxPQURfQ1NTX0NMQVNTRVMuRE9XTkxPQURfSUNPTjsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgaW5pdERvd25sb2FkTG9hZGVyKCk7CisKKyAgICAgICAgICAgIHNjb3BlLmRvd25sb2FkID0gKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBvbkZhaWxkID0gKHJlc3BvbnNlKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvbkZhaWxkJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVEb3dubG9hZGVkRmlsZUxvYWRlcigpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGRhdGE6TW9kZWxzLklGaWxlRG93bmxvYWQpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEZpbGUoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZURvd25sb2FkZWRGaWxlTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHNldERvd25sb2FkZWRGaWxlTG9hZGVyKCk7CisKKyAgICAgICAgICAgICAgICBpZihzY29wZS5pbnN0YW5jZSl7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmNvbXBvbmVudC5kb3dubG9hZEluc3RhbmNlQXJ0aWZhY3QoYXJ0aWZhY3QudW5pcXVlSWQpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxkKTsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmNvbXBvbmVudC5kb3dubG9hZEFydGlmYWN0KGFydGlmYWN0LnVuaXF1ZUlkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IGRvd25sb2FkRmlsZSA9ICAoZmlsZTpNb2RlbHMuSUZpbGVEb3dubG9hZCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgIGlmIChmaWxlKXsKKyAgICAgICAgICAgICAgICAgIGxldCBibG9iID0gdGhpcy5maWxlVXRpbHMuYmFzZTY0dG9CbG9iKGZpbGUuYmFzZTY0Q29udGVudHMsJycpOworICAgICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gZmlsZS5hcnRpZmFjdE5hbWU7CisgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVdGlscy5kb3dubG9hZEZpbGUoYmxvYiwgZmlsZU5hbWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBlbGVtZW50Lm9uKCckZGVzdHJveScsICgpPT57CisgICAgICAgICAgICAgICAgLy9yZW1vdmUgbGlzdGVuZXIgb2YgZG93bmxvYWQgZXZlbnQKKyAgICAgICAgICAgICAgICBpZihzY29wZS5hcnRpZmFjdCAmJiBzY29wZS5hcnRpZmFjdC51bmlxdWVJZCl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UudW5SZWdpc3Rlck9ic2VydmVyKFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuRE9XTkxPQURfQVJUSUZBQ1RfRklOSVNIX0VWRU5UICsgc2NvcGUuYXJ0aWZhY3QudW5pcXVlSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR3aW5kb3c6YW55LGNhY2hlU2VydmljZTpTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlLEV2ZW50TGlzdGVuZXJTZXJ2aWNlOlNlcnZpY2VzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLCBmaWxlVXRpbHM6U2RjLlV0aWxzLkZpbGVVdGlscyk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERvd25sb2FkQXJ0aWZhY3REaXJlY3RpdmUoJHdpbmRvdyxjYWNoZVNlcnZpY2UsRXZlbnRMaXN0ZW5lclNlcnZpY2UsIGZpbGVVdGlscyk7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBEb3dubG9hZEFydGlmYWN0RGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHdpbmRvdycsICdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJywgJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJywgJ0ZpbGVVdGlscyddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2Vjb21wLWhlYWRlci9lY29tcC1oZWFkZXIuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lY29tcC1oZWFkZXIvZWNvbXAtaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2ZjlkZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lY29tcC1oZWFkZXIvZWNvbXAtaGVhZGVyLmh0bWwKQEAgLTAsMCArMSw3MyBAQAorPGRpdiBjbGFzcz0ic2RjLWVjb21wLWhlYWRlci13cmFwcGVyIj4KKworICAgIDxkaXYgY2xhc3M9InNkYy1lY29tcC1oZWFkZXIiPgorCisgICAgICAgIDxkaXYgY2xhc3M9InNkYy1lY29tcC1sb2dvLXdyYXBwZXIiPgorICAgICAgICAgICAgPGEgY2xhc3M9InNkYy1lY29tcC1oZWFkZXItdGl0bGUiIGRhdGEtbmctaWY9ImNsaWNrYWJsZUxvZ289PT0ndHJ1ZSciIGRhdGEtdWktc3JlZj0iZGFzaGJvYXJkIj48c3BhbiBjbGFzcz0ic2RjLWVjb21wLWxvZ28iPjwvc3Bhbj5BU0RDPC9hPgorICAgICAgICAgICAgPGEgY2xhc3M9InNkYy1lY29tcC1oZWFkZXItdGl0bGUiIGRhdGEtbmctaWY9ImNsaWNrYWJsZUxvZ289PT0nZmFsc2UnIj48c3BhbiBjbGFzcz0ic2RjLWVjb21wLWxvZ28iPjwvc3Bhbj5BU0RDPC9hPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLWVjb21wLWhlYWRlci12ZXJzaW9uIj4gdi57e3ZlcnNpb259fTwvZGl2PgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtZWNvbXAtbWVudSI+CisKKyAgICAgICAgICAgIDwhLS0gVG9wIGxldmVsIG1lbnUgLS0+CisgICAgICAgICAgICA8dWwgY2xhc3M9InNkYy1lY29tcC1tZW51LXRvcC1sZXZlbCI+CisgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJzZGMtZWNvbXAtbWVudS10b3AtbGV2ZWwtaXRlbSIKKyAgICAgICAgICAgICAgICAgICAgbmctcmVwZWF0PSJpdGVtIGluIG1lZ2FNZW51RGF0YU9iamVjdCIKKyAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aD4wIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWxlY3RlZCIgZGF0YS1uZy1pZj0iaXRlbS5tZW51SWQgPT09IHNlbGVjdGVkVG9wTWVudS5tZW51SWQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZiBkYXRhLW5nLWNsaWNrPSJmaXJzdE1lbnVMZXZlbENsaWNrKGl0ZW0ubWVudUlkKSI+e3tpdGVtLnRleHR9fTwvYT4KKworICAgICAgICAgICAgICAgICAgICA8IS0tIFNlY29uZCBsZXZlbCBtZW51IC0tPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtZWNvbXAtbWVudS1zZWNvbmQtbGV2ZWwiIGRhdGEtbmctaWY9Iml0ZW0ubWVudUlkID09PSBzZWxlY3RlZFRvcE1lbnUubWVudUlkIiBkYXRhLW5nLW1vdXNlbGVhdmU9InN1Yk1lbnVMZWF2ZUFjdGlvbihpdGVtLm1lbnVJZCkiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2RjLWVjb21wLW1lbnUtc2Vjb25kLWxldmVsLWl0ZW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXJlcGVhdD0ic3ViSXRlbSBpbiBzZWxlY3RlZFRvcE1lbnUuY2hpbGRyZW4gfCBvcmRlckJ5IDogJ2NvbHVtbiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9Int7c3ViSXRlbS50ZXh0fX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2RjLWVjb21wLW1lbnUtaXRlbS1ob3Zlcic6IG1lbnVJdGVtSG92ZXI9PT10cnVlfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctbW91c2VvdmVyPSJzdWJNZW51RW50ZXJBY3Rpb24oc3ViSXRlbS5tZW51SWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1tb3VzZWVudGVyPSJtZW51SXRlbUhvdmVyPXRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLW1vdXNlbGVhdmU9Im1lbnVJdGVtSG92ZXI9ZmFsc2UiPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08aSBuZy1pZj0ic3ViSXRlbS50ZXh0PT0nRmF2b3JpdGVzJyIgaWQ9ImZhdm9yaXRlLXN0YXIiIGNsYXNzPSJpY29uLXN0YXIgZmF2b3JpdGVzLWljb24tYWN0aXZlIj48L2k+LS0+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZiB0aXRsZT0ie3tzdWJJdGVtLnRleHR9fSIgZGF0YS1uZy1jbGljaz0ibWVtdUl0ZW1DbGljayhzdWJJdGVtKSI+e3tzdWJJdGVtLnRleHR9fTwvYT4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoaXJkIGFuZCBGb3VyIG1lbnUgcGFuZWwgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ic2RjLWVjb21wLW1lbnUtdGhpcmQtbGV2ZWwiIGRhdGEtbmctaWY9InN1Ykl0ZW0ubWVudUlkID09PSBzZWxlY3RlZFN1Yk1lbnUubWVudUlkICYmIChzZWxlY3RlZFN1Yk1lbnUuY2hpbGRyZW4gJiYgc2VsZWN0ZWRTdWJNZW51LmNoaWxkcmVuLmxlbmd0aD4wKSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InNkYy1lY29tcC1tZW51LXRoaXJkLWxldmVsLWl0ZW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctcmVwZWF0PSJ0aGlyZEl0ZW0gaW4gc2VsZWN0ZWRTdWJNZW51LmNoaWxkcmVuIHwgb3JkZXJCeSA6ICdjb2x1bW4nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9Int7dGhpcmRJdGVtLnRleHR9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InNkYy1lY29tcC1tZW51LXRoaXJkLWxldmVsLXRpdGxlIiBocmVmIHRpdGxlPSJ7e3RoaXJkSXRlbS50ZXh0fX0iIGRhdGEtbmctY2xpY2s9Im1lbXVJdGVtQ2xpY2sodGhpcmRJdGVtKSI+e3t0aGlyZEl0ZW0udGV4dH19PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtZWNvbXAtbWVudS1mb3VyLWxldmVsLXNlcGVyYXRvciI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ic2RjLWVjb21wLW1lbnUtZm91ci1sZXZlbCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2RjLWVjb21wLW1lbnUtZm91ci1sZXZlbC1pdGVtIiBkYXRhLW5nLXJlcGVhdD0iZm91ckl0ZW0gaW4gdGhpcmRJdGVtLmNoaWxkcmVuIHwgb3JkZXJCeSA6ICdjb2x1bW4nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWYgdGl0bGU9Int7Zm91ckl0ZW0udGV4dH19IiBkYXRhLW5nLWNsaWNrPSJtZW11SXRlbUNsaWNrKGZvdXJJdGVtKSI+e3tmb3VySXRlbS50ZXh0fX08L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8L2xpPgorCisgICAgICAgICAgICA8L3VsPgorCisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtZWNvbXAtdXNlci13cmFwcGVyIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtZWNvbXAtdXNlci1pY29uIj48L3NwYW4+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtZWNvbXAtdXNlci1kZXRhaWxzIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtZWNvbXAtdXNlci1kZXRhaWxzLW5hbWUtcm9sZSI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgc2RjLXNtYXJ0LXRvb2x0aXAgY2xhc3M9InNkYy1lY29tcC11c2VyLWRldGFpbHMtbmFtZSIgZGF0YS1uZy1iaW5kPSJ1c2VyLmdldE5hbWUoKSI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1lY29tcC11c2VyLWRldGFpbHMtcm9sZSIgZGF0YS1uZy1iaW5kPSJ1c2VyLmdldFJvbGVUb1ZpZXcoKSI+PC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLWVjb21wLXVzZXItZGV0YWlscy1sYXN0LWxvZ2luIiBkYXRhLW5nLXNob3c9InVzZXIuZ2V0TGFzdExvZ2luKCkhPT0nJyI+TGFzdCBMb2dpbjoge3t1c2VyLmdldExhc3RMb2dpbigpIHwgZGF0ZTogJ01NTSBkZCAmbmJzcDsgaGg6bW0gYScgOiAnVVRDJ319Jm5ic3A7VVRDPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2Vjb21wLWhlYWRlci9lY29tcC1oZWFkZXIubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lY29tcC1oZWFkZXIvZWNvbXAtaGVhZGVyLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmN2U5YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lY29tcC1oZWFkZXIvZWNvbXAtaGVhZGVyLmxlc3MKQEAgLTAsMCArMSwyOTYgQEAKK0BmaXJzdC1sZXZlbC1jb2xvcjogIzA2N2FiNDsKK0BzZWNvbmQtbGV2ZWwtY29sb3I6ICNmOGY4Zjg7CisKK0BmaXJzdC1sZXZlbC1oZWlnaHQ6IDYwcHg7CitAc2Vjb25kLWxldmVsLWhlaWdodDogNjBweDsKK0B0aGlyZC1mb3VyLWxldmVsLWhlaWdodDogMzcwcHg7CisKK0BtYXgtaXRlbS13aWR0aDogMjUwcHg7CisKKy5zZGMtZWNvbXAtaGVhZGVyLXdyYXBwZXIgeworCisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICByaWdodDogMDsKKyAgICBsZWZ0OiAwOworICAgIHotaW5kZXg6IDk5OTsKKworICAgIHVsIHsKKyAgICAgICAgbWFyZ2luOiAwOworICAgICAgICBwYWRkaW5nOiAwOworICAgIH0KKworICAgIC5zZGMtZWNvbXAtaGVhZGVyIHsKKworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZmlyc3QtbGV2ZWwtY29sb3I7CisgICAgICAgIGhlaWdodDogQGZpcnN0LWxldmVsLWhlaWdodDsKKyAgICAgICAgbGluZS1oZWlnaHQ6IEBmaXJzdC1sZXZlbC1oZWlnaHQ7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgICAgIHBhZGRpbmc6IDAgMjBweDsKKworICAgICAgICAuc2RjLWVjb21wLW1lbnUgeworICAgICAgICAgICAgZmxleC1ncm93OiA5ODsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogTEVWRUwgMSAqLworICAgIC5zZGMtZWNvbXAtbWVudS10b3AtbGV2ZWwgeworICAgICAgICBsaXN0LXN0eWxlOiBub25lOworCisgICAgICAgIC5zZGMtZWNvbXAtbWVudS10b3AtbGV2ZWwtaXRlbTpmaXJzdC1jaGlsZCB7CisgICAgICAgICAgICBtYXJnaW4tbGVmdDogMDsKKyAgICAgICAgfQorCisgICAgICAgIC5zZGMtZWNvbXAtbWVudS10b3AtbGV2ZWwtaXRlbSB7CisgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgIG1hcmdpbjogMCAyMHB4OworICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgICBhIHsKKyAgICAgICAgICAgICAgICAgLnBfMTRfbTsKKyAgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3BhbiB7CisgICAgICAgICAgICAgICAgJi5zZWxlY3RlZCB7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAwOworICAgICAgICAgICAgICAgICAgICB3aWR0aDogMDsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwOworICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogMTVweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxNXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxNXB4IHNvbGlkIEBzZWNvbmQtbGV2ZWwtY29sb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIH0KKworICAgIC8qIExFVkVMIDIgKi8KKyAgICAuc2RjLWVjb21wLW1lbnUtc2Vjb25kLWxldmVsIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHNlY29uZC1sZXZlbC1jb2xvcjsKKyAgICAgICAgYm94LXNoYWRvdzogMHB4IDFweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4zMyk7CisgICAgICAgIGhlaWdodDogQHNlY29uZC1sZXZlbC1oZWlnaHQ7CisgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CisgICAgICAgIGxpbmUtaGVpZ2h0OiBAc2Vjb25kLWxldmVsLWhlaWdodDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICAgICAgcGFkZGluZzogMCAyMHB4OworICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CisgICAgICAgIGxlZnQ6IDA7CisgICAgICAgIHJpZ2h0OiAwOworCisgICAgICAgIC5zZGMtZWNvbXAtbWVudS1zZWNvbmQtbGV2ZWwtaXRlbTpmaXJzdC1jaGlsZCB7CisgICAgICAgICAgICBtYXJnaW4tbGVmdDogMDsKKyAgICAgICAgfQorCisgICAgICAgIC5zZGMtZWNvbXAtbWVudS1zZWNvbmQtbGV2ZWwtaXRlbSB7CisgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICBoZWlnaHQ6IEBzZWNvbmQtbGV2ZWwtaGVpZ2h0OworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IEBzZWNvbmQtbGV2ZWwtaGVpZ2h0OworCisgICAgICAgICAgICAmLnNkYy1lY29tcC1tZW51LWl0ZW0taG92ZXIgeworICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDRweCBzb2xpZCAjMDY3YWI0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhIHsKKyAgICAgICAgICAgICAgICAubV8xNF9yOworICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDIwcHg7CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisKKyAgICAgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAgICAgLnNfMTRfcjsKKyAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAmOmFjdGl2ZSB7CisgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGZpeCBqdW1wIHdoZW4gaG92ZXJpbmcgdGV4dCAqLworICAgICAgICAgICAgICAgICY6YWZ0ZXIgeworICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmJsb2NrOworICAgICAgICAgICAgICAgICAgICBjb250ZW50OmF0dHIodGl0bGUpOworICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MXB4OworICAgICAgICAgICAgICAgICAgICBjb2xvcjp0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6aGlkZGVuOworICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OmhpZGRlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogTEVWRUwgMyAqLworICAgIHVsLnNkYy1lY29tcC1tZW51LXRoaXJkLWxldmVsIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogICNmZmZmZmY7CisgICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMSk7CisgICAgICAgIG1pbi1oZWlnaHQ6IEB0aGlyZC1mb3VyLWxldmVsLWhlaWdodDsKKyAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKKworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OworICAgICAgICAvKmZsZXgtd3JhcDogd3JhcDsqLworICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CisgICAgICAgIHRvcDogQGZpcnN0LWxldmVsLWhlaWdodCArIEBzZWNvbmQtbGV2ZWwtaGVpZ2h0OworICAgICAgICBsZWZ0OiAwOworICAgICAgICByaWdodDogMDsKKyAgICAgICAgcGFkZGluZzogMCA0MHB4OworCisgICAgICAgIGxpLnNkYy1lY29tcC1tZW51LXRoaXJkLWxldmVsLWl0ZW0geworICAgICAgICAgICAgaGVpZ2h0OiA0MHB4OworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDQwcHg7CisgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgICAgICAvKndpZHRoOiBAbWF4LWl0ZW0td2lkdGg7Ki8KKyAgICAgICAgICAgIG1heC13aWR0aDogQG1heC1pdGVtLXdpZHRoOworCisgICAgICAgICAgICAuc2RjLWVjb21wLW1lbnUtdGhpcmQtbGV2ZWwtdGl0bGUgeworICAgICAgICAgICAgICAgIC5tXzE0X207CisgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICAgICAgcGFkZGluZzogMCAyMHB4OworICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CisgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuc2RjLWVjb21wLW1lbnUtZm91ci1sZXZlbC1zZXBlcmF0b3IgeworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCAjZTVlNWU1OworICAgICAgICAgICAgICAgIGhlaWdodDogQHRoaXJkLWZvdXItbGV2ZWwtaGVpZ2h0IC0gMjA7CisgICAgICAgICAgICAgICAgdG9wOiAxMHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGkuc2RjLWVjb21wLW1lbnUtdGhpcmQtbGV2ZWwtaXRlbTpmaXJzdC1jaGlsZCB7CisgICAgICAgICAgICAuc2RjLWVjb21wLW1lbnUtZm91ci1sZXZlbC1zZXBlcmF0b3IgeworICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExFVkVMIDQgKi8KKyAgICB1bC5zZGMtZWNvbXAtbWVudS1mb3VyLWxldmVsIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKKworICAgICAgICBsaS5zZGMtZWNvbXAtbWVudS1mb3VyLWxldmVsLWl0ZW0geworICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICAvKndpZHRoOiBAbWF4LWl0ZW0td2lkdGg7Ki8KKyAgICAgICAgICAgIG1heC13aWR0aDogQG1heC1pdGVtLXdpZHRoOworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CisKKyAgICAgICAgICAgIGEgeworICAgICAgICAgICAgICAgIC5tXzE0X3I7CisgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisKKyAgICAgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAgICAgLnNfMTRfcjsKKyAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKy5zZGMtZWNvbXAtbG9nby13cmFwcGVyIHsKKyAgICBmbGV4LWdyb3c6IDE7CisgICAgLnBfMThfbTsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgIG1pbi13aWR0aDogMjEwcHg7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisKKyAgICAuc2RjLWVjb21wLWxvZ28geworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImltYWdlcy9hdHRfbG9nb193aGl0ZS5wbmciKTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgICAgICB3aWR0aDogNTVweDsKKyAgICAgICAgaGVpZ2h0OiA1NXB4OworICAgIH0KKworICAgIC5zZGMtZWNvbXAtaGVhZGVyLXZlcnNpb24geworICAgICAgICAuY18xNjsKKyAgICAgICAgLm9wYWNpdHkoMC44KTsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDM0cHg7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgICAgICBsZWZ0OiA1NnB4OworICAgIH0KKworICAgIGEuc2RjLWVjb21wLWhlYWRlci10aXRsZSB7CisgICAgICAgIC5wXzI0OworICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgfQorfQorCisKKy5zZGMtZWNvbXAtdXNlci13cmFwcGVyIHsKKworICAgIGZsZXgtZ3JvdzogMTsKKyAgICAucF8xNF9tOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4LWRpcmVjdGlvbjogcm93OworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgaGVpZ2h0OiBAZmlyc3QtbGV2ZWwtaGVpZ2h0OworCisgICAgLnNkYy1lY29tcC11c2VyLWljb24geworICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CisgICAgICAgIC50bHYtc3ByaXRlOworICAgICAgICAudGx2LXNwcml0ZS51c2VyOworICAgIH0KKworICAgIC5zZGMtZWNvbXAtdXNlci1kZXRhaWxzIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgICB9CisKKyAgICAuc2RjLWVjb21wLXVzZXItZGV0YWlscy1uYW1lLXJvbGUgeworICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKKworICAgICAgICAuc2RjLWVjb21wLXVzZXItZGV0YWlscy1uYW1lIHsKKyAgICAgICAgICAgIG1heC13aWR0aDogMTYwcHg7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKworICAgICAgICAgICAgLmJvbGQ7CisgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIH0KKworICAgICAgICAuc2RjLWVjb21wLXVzZXItZGV0YWlscy1yb2xlIHsKKyAgICAgICAgICAgIC5ib2xkOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDZweDsKKworICAgICAgICAgICAgJjpiZWZvcmUgeworICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogOHB4OworICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQGNvbG9yX207CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuc2RjLWVjb21wLXVzZXItZGV0YWlscy1sYXN0LWxvZ2luIHsKKyAgICAgICAgLmZvbnQtdHlwZS5fMzsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgICAgICBoZWlnaHQ6IDIwcHg7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWNvbXAtaGVhZGVyL2Vjb21wLWhlYWRlci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lY29tcC1oZWFkZXIvZWNvbXAtaGVhZGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDJjODEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWNvbXAtaGVhZGVyL2Vjb21wLWhlYWRlci50cwpAQCAtMCwwICsxLDIzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIE1lbnVJdGVtIHsKKyAgICAgICAgbWVudUlkOm51bWJlcjsKKyAgICAgICAgY29sdW1uOm51bWJlcjsKKyAgICAgICAgdGV4dDpzdHJpbmc7CisgICAgICAgIHBhcmVudE1lbnVJZDpudW1iZXI7CisgICAgICAgIHVybDpzdHJpbmc7CisgICAgICAgIGNoaWxkcmVuOkFycmF5PE1lbnVJdGVtPgorICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVjb21wSGVhZGVyRGlyZWN0aXZlU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBtZW51RGF0YTpBcnJheTxNZW51SXRlbT47CisgICAgICAgIHZlcnNpb246c3RyaW5nOworICAgICAgICBjbGlja2FibGVMb2dvOnN0cmluZzsKKyAgICAgICAgY29udGFjdFVzVXJsOnN0cmluZzsKKyAgICAgICAgZ2V0QWNjZXNzVXJsOnN0cmluZzsKKyAgICAgICAgbWVnYU1lbnVEYXRhT2JqZWN0VGVtcDpBcnJheTxhbnk+OworICAgICAgICBtZWdhTWVudURhdGFPYmplY3Q6QXJyYXk8YW55PjsKKworICAgICAgICBzZWxlY3RlZFRvcE1lbnU6TWVudUl0ZW07CisgICAgICAgIHNlbGVjdGVkU3ViTWVudTpNZW51SXRlbTsKKworICAgICAgICBmaXJzdE1lbnVMZXZlbENsaWNrOkZ1bmN0aW9uOworICAgICAgICBzdWJNZW51RW50ZXJBY3Rpb246RnVuY3Rpb247CisgICAgICAgIHN1Yk1lbnVMZWF2ZUFjdGlvbjpGdW5jdGlvbjsKKworICAgICAgICBtZW11SXRlbUNsaWNrOkZ1bmN0aW9uOworICAgICAgICB1c2VyOiBNb2RlbHMuSVVzZXI7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEVjb21wSGVhZGVyRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGh0dHA6bmcuSUh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVXNlclJlc291cmNlQ2xhc3M6U2VydmljZXMuSVVzZXJSZXNvdXJjZUNsYXNzKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgbWVudURhdGE6ICc9JywKKyAgICAgICAgICAgIHZlcnNpb246ICdAJywKKyAgICAgICAgICAgIGNsaWNrYWJsZUxvZ286ICdAPycKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHB1YmxpYyByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcHVibGljIGNvbnRyb2xsZXIgPSBFY29tcEhlYWRlckNvbnRyb2xsZXI7CisKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lY29tcC1oZWFkZXIvZWNvbXAtaGVhZGVyLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKCRzY29wZTpJRWNvbXBIZWFkZXJEaXJlY3RpdmVTY29wZSwgJGVsZW06SlF1ZXJ5LCBhdHRyOmFueSkgPT4geworCisgICAgICAgICAgICBpZiAoISRzY29wZS5jbGlja2FibGVMb2dvKXsKKyAgICAgICAgICAgICAgICAkc2NvcGUuY2xpY2thYmxlTG9nbz0idHJ1ZSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBmaW5kTWVudUl0ZW1CeUlkID0gKG1lbnVJZCk6TWVudUl0ZW0gPT4geworICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZE1lbnVJdGVtOk1lbnVJdGVtID0gXy5maW5kKCRzY29wZS5tZW51RGF0YSwgKGl0ZW06TWVudUl0ZW0pPT57CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm1lbnVJZCA9PT0gbWVudUlkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTWVudUl0ZW07CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgaW5pdFVzZXIgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZGVmYXVsdFVzZXJJZDpzdHJpbmc7CisgICAgICAgICAgICAgICAgbGV0IHVzZXI6U2VydmljZXMuSVVzZXJSZXNvdXJjZSA9IHRoaXMuVXNlclJlc291cmNlQ2xhc3MuZ2V0TG9nZ2VkaW5Vc2VyKCk7CisgICAgICAgICAgICAgICAgaWYgKCF1c2VyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVc2VySWQgPSB0aGlzLiRodHRwLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uW3RoaXMuc2RjQ29uZmlnLmNvb2tpZS51c2VySWRTdWZmaXhdOworICAgICAgICAgICAgICAgICAgICB1c2VyID0gdGhpcy5Vc2VyUmVzb3VyY2VDbGFzcy5nZXQoe2lkOiBkZWZhdWx0VXNlcklkfSwgKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudXNlciA9IG5ldyBNb2RlbHMuVXNlcih1c2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVzZXIgPSBuZXcgTW9kZWxzLlVzZXIodXNlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgJHNjb3BlLmZpcnN0TWVudUxldmVsQ2xpY2sgPSAobWVudUlkOm51bWJlcik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkTWVudUl0ZW06TWVudUl0ZW0gPSBfLmZpbmQoJHNjb3BlLm1lZ2FNZW51RGF0YU9iamVjdFRlbXAsIChpdGVtOk1lbnVJdGVtKT0+eworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5tZW51SWQgPT09IG1lbnVJZCl7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE1lbnVJdGVtKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFRvcE1lbnUgPSBzZWxlY3RlZE1lbnVJdGVtOworICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJTZWxlY3RlZCBtZW51IGl0ZW06ICIgKyBzZWxlY3RlZE1lbnVJdGVtLnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICRzY29wZS5zdWJNZW51RW50ZXJBY3Rpb24gPSAobWVudUlkOm51bWJlcik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkU3ViTWVudSA9IGZpbmRNZW51SXRlbUJ5SWQobWVudUlkKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICRzY29wZS5zdWJNZW51TGVhdmVBY3Rpb24gPSAobWVudUlkOm51bWJlcik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkVG9wTWVudSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICRzY29wZS5tZW11SXRlbUNsaWNrID0gKG1lbnVJdGVtOk1lbnVJdGVtKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAobWVudUl0ZW0udXJsKXsKKyAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWY9bWVudUl0ZW0udXJsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJNZW51IGl0ZW06ICIgKyBtZW51SXRlbS50ZXh0ICsgIiBkb2VzIG5vdCBoYXZlIGRlZmluZWQgVVJMISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGluaXRVc2VyKCk7CisKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGh0dHA6bmcuSUh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJSZXNvdXJjZUNsYXNzOlNlcnZpY2VzLklVc2VyUmVzb3VyY2VDbGFzcyk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVjb21wSGVhZGVyRGlyZWN0aXZlKCR0ZW1wbGF0ZUNhY2hlLCAkaHR0cCwgc2RjQ29uZmlnLCBVc2VyUmVzb3VyY2VDbGFzcyk7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRWNvbXBIZWFkZXJDb250cm9sbGVyIHsKKworICAgICAgICBtZXNzYWdlczphbnk7CisgICAgICAgIGdldEF0dGFjaElkOkZ1bmN0aW9uOworICAgICAgICByZW5kZXI6YW55OworICAgICAgICByZVJlbmRlcjpGdW5jdGlvbjsKKyAgICAgICAgcmVnaXN0ZXI6RnVuY3Rpb247CisgICAgICAgIGRlcmVnaXN0ZXI6RnVuY3Rpb247CisgICAgICAgIGhlYWQ6YW55OworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJGVsZW1lbnQnLAorICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJGF0dHJzJywKKyAgICAgICAgICAgICckYW5pbWF0ZScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRlbGVtZW50OkpRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc2NvcGU6SUVjb21wSGVhZGVyRGlyZWN0aXZlU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGF0dHJzOm5nLklBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRhbmltYXRlOmFueSkgeworCisgICAgICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHdhdGNoKCdtZW51RGF0YScsIChuZXdWYWwsIG9sZFZhbCkgPT4geworICAgICAgICAgICAgICAgIGlmIChuZXdWYWwpeworICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9CisKKyAgICAgICAgaW5pdCA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb250YWN0VXNVcmwgPSAiaHR0cHM6Ly93aWtpLndlYi5hdHQuY29tL2Rpc3BsYXkvRWNvbXBQb3J0YWwvRUNPTVArUG9ydGFsK0hvbWUiOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0QWNjZXNzVXJsID0gImh0dHA6Ly9lY29tcC10bHYtZGV2Mi51Y2NlbnRyYWwuYXR0LmNvbTo4MDgwL2Vjb21wcG9ydGFsL2dldF9hY2Nlc3MiOworCisgICAgICAgICAgICBsZXQgdW5mbGF0dGVuID0gKCBhcnJheSwgcGFyZW50PywgdHJlZT8gKSA9PiB7CisgICAgICAgICAgICAgICAgdHJlZSA9IHR5cGVvZiB0cmVlICE9PSAndW5kZWZpbmVkJyA/IHRyZWUgOiBbXTsKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSB0eXBlb2YgcGFyZW50ICE9PSAndW5kZWZpbmVkJyA/IHBhcmVudCA6IHsgbWVudUlkOiBudWxsIH07CisgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gXy5maWx0ZXIoIGFycmF5LCBmdW5jdGlvbihjaGlsZCl7IHJldHVybiBjaGlsZFsicGFyZW50TWVudUlkIl0gPT0gcGFyZW50Lm1lbnVJZDsgfSk7CisgICAgICAgICAgICAgICAgaWYoICFfLmlzRW1wdHkoIGNoaWxkcmVuICkgICl7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwYXJlbnQubWVudUlkID09PSBudWxsICl7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gY2hpbGRyZW47CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfLmVhY2goIGNoaWxkcmVuLCBmdW5jdGlvbiggY2hpbGQgKXsgdW5mbGF0dGVuKCBhcnJheSwgY2hpbGQgKSB9ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cmVlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IG1lbnVTdHJ1Y3R1cmVDb252ZXJ0ID0gKG1lbnVJdGVtcykgPT4geworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lbnVJdGVtcyk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubWVnYU1lbnVEYXRhT2JqZWN0VGVtcCA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SWQ6IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogIkVDT01QIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogbWVudUl0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJZDogMTAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAiSGVscCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDoiQ29udGFjdCBVcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXMuJHNjb3BlLmNvbnRhY3RVc1VybAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdOworCisgICAgICAgICAgICAgICAgLyp7CisgICAgICAgICAgICAgICAgIHRleHQ6IkdldCBBY2Nlc3MiLAorICAgICAgICAgICAgICAgICB1cmw6IHRoaXMuJHNjb3BlLmdldEFjY2Vzc1VybAorICAgICAgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUubWVnYU1lbnVEYXRhT2JqZWN0VGVtcDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBhID0gdW5mbGF0dGVuKHRoaXMuJHNjb3BlLm1lbnVEYXRhKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1lZ2FNZW51RGF0YU9iamVjdCA9IG1lbnVTdHJ1Y3R1cmVDb252ZXJ0KGEpOworICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLiRzY29wZS5tZWdhTWVudURhdGFPYmplY3QpOworICAgICAgICB9OworICAgIH0KKworICAgIEVjb21wSGVhZGVyRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCAnJGh0dHAnLCAnc2RjQ29uZmlnJywgJ1NkYy5TZXJ2aWNlcy5Vc2VyUmVzb3VyY2VTZXJ2aWNlJ107CisKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VkaXQtbmFtZS1wb3BvdmVyL2VkaXQtbW9kdWxlLW5hbWUtcG9wb3Zlci5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VkaXQtbmFtZS1wb3BvdmVyL2VkaXQtbW9kdWxlLW5hbWUtcG9wb3Zlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MGM1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWRpdC1uYW1lLXBvcG92ZXIvZWRpdC1tb2R1bGUtbmFtZS1wb3BvdmVyLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorPGRpdj4KKyAgICA8Zm9ybSBuYW1lPSJwb3BvdmVyRm9ybSIgY2xhc3M9Inctc2RjLWZvcm0iIGRhdGEtdGVzdHMtaWQ9InBvcG92ZXItZm9ybSI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJ0bHYtc3ByaXRlIHRsdi14LWJ0biBjbG9zZS1wb3BvdmVyLWJ0biIgZGF0YS10ZXN0cy1pZD0icG9wb3Zlci14LWJ1dHRvbiIgbmctY2xpY2s9ImNsb3NlUG9wb3ZlcigpIj48L3NwYW4+CisgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBvcG92ZXItbGFiZWwiIGRhdGEtdGVzdHMtaWQ9InBvcG92ZXItdmZpbnN0YW5jZS1uYW1lIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7bW9kdWxlLnZmSW5zdGFuY2VOYW1lfX0iPnt7bW9kdWxlLnZmSW5zdGFuY2VOYW1lfX08L3NwYW4+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3BvdmVyLWlucHV0Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKHBvcG92ZXJGb3JtLmhlYXROYW1lKX0iPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9Im1vZHVsZS5oZWF0TmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSI1MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iNTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJoZWF0TmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJFbnRlciBOYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPSJvZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9Im9uSW5pdCgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJoZWF0TmFtZVZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0icG9wb3Zlci1oZWF0LW5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZm9ybS1jb250cm9sIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQocG9wb3ZlckZvcm0uaGVhdE5hbWUpIj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icG9wb3ZlckZvcm0uaGVhdE5hbWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzUwJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InBvcG92ZXJGb3JtLmhlYXROYW1lLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0icG9wb3Zlci1sYWJlbCIgZGF0YS10ZXN0cy1pZD0icG9wb3Zlci1tb2R1bGUtbmFtZSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e21vZHVsZS5tb2R1bGVOYW1lfX0iPnt7bW9kdWxlLm1vZHVsZU5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRsdi1idG4gZ3JleSBwb3BvdmVyLWJ0biIgZGF0YS10ZXN0cy1pZD0icG9wb3Zlci1jbG9zZS1idXR0b24iIGRhdGEtbmctY2xpY2s9ImNsb3NlUG9wb3ZlcigpIj5DYW5jZWw8L2J1dHRvbj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRsdi1idG4gYmx1ZSBwb3BvdmVyLWJ0biIgZGF0YS10ZXN0cy1pZD0icG9wb3Zlci1zYXZlLWJ1dHRvbiIgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6ICh2YWxpZGF0ZUZpZWxkKHBvcG92ZXJGb3JtLmhlYXROYW1lKSB8fCBwb3BvdmVyRm9ybS5oZWF0TmFtZS4kdmlld1ZhbHVlID09PSBvcmlnaW5hbE5hbWUpfSIgZGF0YS1uZy1jbGljaz0idXBkYXRlSGVhdE5hbWUoKSI+U2F2ZTwvYnV0dG9uPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Zvcm0+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lZGl0LW5hbWUtcG9wb3Zlci9lZGl0LW5hbWUtcG9wb3Zlci1kaXJlY3RpdmUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWRpdC1uYW1lLXBvcG92ZXIvZWRpdC1uYW1lLXBvcG92ZXItZGlyZWN0aXZlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzNkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWRpdC1uYW1lLXBvcG92ZXIvZWRpdC1uYW1lLXBvcG92ZXItZGlyZWN0aXZlLnRzCkBAIC0wLDAgKzEsOTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVkaXROYW1lUG9wb3ZlckRpcmVjdGl2ZVNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgaXNPcGVuOiBib29sZWFuOworICAgICAgICB0ZW1wbGF0ZVVybDogc3RyaW5nOworICAgICAgICBtb2R1bGU6IGFueTsKKyAgICAgICAgZGlyZWN0aW9uOiBzdHJpbmc7CisgICAgICAgIGhlYWRlcjogc3RyaW5nOworICAgICAgICBoZWF0TmFtZVZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cDsKKyAgICAgICAgb3JpZ2luYWxOYW1lOnN0cmluZzsKKyAgICAgICAgb25TYXZlOmFueTsKKworICAgICAgICBjbG9zZVBvcG92ZXIoaXNDYW5jZWw6Ym9vbGVhbik6dm9pZDsKKyAgICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZDphbnksIG9yaWdpbmFsTmFtZTpzdHJpbmcpOmJvb2xlYW47CisgICAgICAgIHVwZGF0ZUhlYXROYW1lKGhlYXROYW1lOnN0cmluZyk6dm9pZDsKKyAgICAgICAgb25Jbml0KCk6dm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRWRpdE5hbWVQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsIHByaXZhdGUgVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwKSB7CisgICAgICAgIH0KKworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIGRpcmVjdGlvbjogIkA/IiwKKyAgICAgICAgICAgIG1vZHVsZTogIj0iLAorICAgICAgICAgICAgaGVhZGVyOiAiQD8iLAorICAgICAgICAgICAgb25TYXZlOiAiJiIKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklFZGl0TmFtZVBvcG92ZXJEaXJlY3RpdmVTY29wZSkgPT4geworICAgICAgICAgICAgaWYoIXNjb3BlLmRpcmVjdGlvbikgeworICAgICAgICAgICAgICAgIHNjb3BlLmRpcmVjdGlvbiA9ICd0b3AnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5vcmlnaW5hbE5hbWUgPSAnJzsKKyAgICAgICAgICAgIHNjb3BlLnRlbXBsYXRlVXJsID0gIi9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VkaXQtbmFtZS1wb3BvdmVyL2VkaXQtbW9kdWxlLW5hbWUtcG9wb3Zlci5odG1sIjsKKyAgICAgICAgICAgIHNjb3BlLmlzT3BlbiA9IGZhbHNlOworCisgICAgICAgICAgICBzY29wZS5jbG9zZVBvcG92ZXIgPSAoaXNDYW5jZWw6Ym9vbGVhbiA9IHRydWUpID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5pc09wZW4gPSAhc2NvcGUuaXNPcGVuOworCisgICAgICAgICAgICAgICAgaWYoaXNDYW5jZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kdWxlLmhlYXROYW1lID0gc2NvcGUub3JpZ2luYWxOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLm9uSW5pdCA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5vcmlnaW5hbE5hbWUgPSBzY29wZS5tb2R1bGUuaGVhdE5hbWU7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS52YWxpZGF0ZUZpZWxkID0gKGZpZWxkOmFueSk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEhKGZpZWxkICYmIGZpZWxkLiRkaXJ0eSAmJiBmaWVsZC4kaW52YWxpZCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5oZWF0TmFtZVZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5WYWxpZGF0aW9uUGF0dGVybjsKKworICAgICAgICAgICAgc2NvcGUudXBkYXRlSGVhdE5hbWUgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUuY2xvc2VQb3BvdmVyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzY29wZS5vblNhdmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisgICAgICAgIHJlcGxhY2UgPSB0cnVlOworICAgICAgICByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lZGl0LW5hbWUtcG9wb3Zlci9lZGl0LW5hbWUtcG9wb3Zlci12aWV3Lmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCBWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHApPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBFZGl0TmFtZVBvcG92ZXJEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUsIFZhbGlkYXRpb25QYXR0ZXJuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEVkaXROYW1lUG9wb3ZlckRpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJywgJ1ZhbGlkYXRpb25QYXR0ZXJuJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWRpdC1uYW1lLXBvcG92ZXIvZWRpdC1uYW1lLXBvcG92ZXItdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VkaXQtbmFtZS1wb3BvdmVyL2VkaXQtbmFtZS1wb3BvdmVyLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2JlZWFkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VkaXQtbmFtZS1wb3BvdmVyL2VkaXQtbmFtZS1wb3BvdmVyLXZpZXcuaHRtbApAQCAtMCwwICsxIEBACis8ZGl2IHVpYi1wb3BvdmVyLXRlbXBsYXRlPSJ0ZW1wbGF0ZVVybCIgcG9wb3Zlci10aXRsZT0ie3toZWFkZXJ9fSIgcG9wb3Zlci1wbGFjZW1lbnQ9Int7ZGlyZWN0aW9ufX0iIHBvcG92ZXItaXMtb3Blbj0iaXNPcGVuIiBwb3BvdmVyLWFwcGVuZC10by1ib2R5PSJ0cnVlIj48L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lZGl0LW5hbWUtcG9wb3Zlci9lZGl0LW5hbWUtcG9wb3Zlci5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VkaXQtbmFtZS1wb3BvdmVyL2VkaXQtbmFtZS1wb3BvdmVyLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NmEzNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lZGl0LW5hbWUtcG9wb3Zlci9lZGl0LW5hbWUtcG9wb3Zlci5sZXNzCkBAIC0wLDAgKzEsNzEgQEAKKy5wb3BvdmVyIHsKKyAgICBtYXgtd2lkdGg6IG5vbmU7CisgICAgd2lkdGg6IDMxMHB4OworICAgIGxlZnQ6IGluaXRpYWwgIWltcG9ydGFudDsKKyAgICByaWdodDogMTBweDsKKyAgICB6LWluZGV4OiAxMDA7CisgICAgYm9yZGVyLXJhZGl1czogMDsKKworICAgIC50b3AgPiAuYXJyb3cgeworICAgICAgICBib3R0b206IC04cHggIWltcG9ydGFudDsKKyAgICB9CisKKyAgICAucG9wb3Zlci10aXRsZSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzQwYjdlNDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CisgICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKKyAgICAgICAgcGFkZGluZzogOHB4IDE0cHggOHB4IDBweDsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgfQorCisgICAgLmFycm93IHsKKyAgICAgICAgbGVmdDogOTUlICFpbXBvcnRhbnQ7CisgICAgICAgIGJvcmRlci13aWR0aDogN3B4OworICAgICAgICBib3R0b206IC04cHggIWltcG9ydGFudDsKKyAgICB9CisKKyAgICAucG9wb3Zlci1jb250ZW50IHsKKyAgICAgICAgd2lkdGg6IGluaGVyaXQ7CisgICAgICAgIHBhZGRpbmc6IDlweCAyMHB4OworICAgIH0KKworICAgIC5mb3JtLWdyb3VwIHsKKyAgICAgICAgbWFyZ2luLXRvcDogOXB4OworICAgIH0KKworICAgIC5wb3BvdmVyLWJ0biB7CisgICAgICAgIGZsb2F0OnJpZ2h0OworICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgICB9CisKKyAgICAuY2xvc2UtcG9wb3Zlci1idG4geworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMTFweDsKKyAgICAgICAgcmlnaHQ6IDI1cHg7CisgICAgfQorCisgICAgLmNsb3NlLXBvcG92ZXItYnRuOmhvdmVyIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgIH0KKworICAgIC5wb3BvdmVyLWlucHV0IHsKKyAgICAgICAgaGVpZ2h0OiA0N3B4OworICAgICAgICBtYXJnaW4tYm90dG9tOjVweDsKKyAgICB9CisKKyAgICAucG9wb3Zlci1sYWJlbCB7CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgY29sb3I6IEBtYWluX2NvbG9yX2w7CisgICAgfQorCisgICAgLnctc2RjLWZvcm0gLmktc2RjLWZvcm0taXRlbSB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvY2hlY2tib3gvY2hlY2tib3guaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9jaGVja2JveC9jaGVja2JveC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvY2hlY2tib3gvY2hlY2tib3guaHRtbApAQCAtMCwwICsxLDEzIEBACis8bGFiZWwgY2xhc3M9InRsdi1jaGVja2JveCIgbmctY2xhc3M9InsnZGlzYWJsZWQnIDogZGlzYWJsZWR9Ij4KKyAgICA8aW5wdXQgIGlkPSJ7e2VsZW1JZH19IgorICAgICAgICAgICAgbmFtZT0ie3tlbGVtSWR9fSIKKyAgICAgICAgICAgIGNsYXNzPSJ0bHYtY2hlY2tib3gtaSIKKyAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgorICAgICAgICAgICAgY2hlY2tlZD0iIgorICAgICAgICAgICAgbmctZGlzYWJsZWQ9ImRpc2FibGVkIgorICAgICAgICAgICAgY2hlY2tsaXN0LW1vZGVsPSJzZGNDaGVja2xpc3RNb2RlbCIKKyAgICAgICAgICAgIGNoZWNrbGlzdC12YWx1ZT0ic2RjQ2hlY2tsaXN0VmFsdWUiCisgICAgICAgIC8+CisKKyAgICA8c3BhbiBzZGMtc21hcnQtdG9vbHRpcCBjbGFzcz0idGx2LWNoZWNrYm94LWxhYmVsIiBkYXRhLXRlc3RzLWlkPSJ7e2VsZW1JZH19Ij57e3RleHR9fTwvc3Bhbj4KKzwvbGFiZWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvY2hlY2tib3gvY2hlY2tib3gubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9jaGVja2JveC9jaGVja2JveC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDdhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvY2hlY2tib3gvY2hlY2tib3gubGVzcwpAQCAtMCwwICsxLDM1IEBACitsYWJlbC50bHYtY2hlY2tib3ggeworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cit9CisKKy8qCitpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKKyAgICBkaXNwbGF5Om5vbmU7Cit9CisKK2lucHV0W3R5cGU9ImNoZWNrYm94Il0gKyBsYWJlbCBzcGFuIHsKKyAgICBtYXJnaW4tcmlnaHQ6IDZweDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CisgICAgLnNwcml0ZS1uZXc7CisgICAgLmNoZWNrYm94X3VuY2hlY2tlZDsKKyAgICBjdXJzb3I6cG9pbnRlcjsKK30KKworaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkICsgbGFiZWwgc3BhbiB7CisgICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOworICAgIC5zcHJpdGUtbmV3OworICAgIC5jaGVja2JveF9jaGVja2VkOworfQorCitpbnB1dFt0eXBlPSJjaGVja2JveCJdOmZvY3VzICsgbGFiZWwgc3BhbiB7CisgICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOworICAgIC5zcHJpdGUtbmV3OworICAgIC5jaGVja2JveF9mb2N1czsKK30KKworaW5wdXRbdHlwZT0iY2hlY2tib3giXVtkaXNhYmxlZF0gKyBsYWJlbHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CisgICAgLnNwcml0ZS1uZXc7CisgICAgLmNoZWNrYm94X2Rpc2FibGVkOworfQorKi8KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9jaGVja2JveC9jaGVja2JveC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9jaGVja2JveC9jaGVja2JveC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVhOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VsZW1lbnRzL2NoZWNrYm94L2NoZWNrYm94LnRzCkBAIC0wLDAgKzEsNjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNoZWNrYm94RWxlbWVudFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgZWxlbUlkOiBzdHJpbmc7CisgICAgICAgIHRleHQ6IHN0cmluZzsKKyAgICAgICAgc2RjQ2hlY2tsaXN0TW9kZWw6IGFueTsKKyAgICAgICAgc2RjQ2hlY2tsaXN0VmFsdWU6IHN0cmluZzsKKyAgICAgICAgZGlzYWJsZWQ6Ym9vbGVhbjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgQ2hlY2tib3hFbGVtZW50RGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHJlcGxhY2UgPSB0cnVlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHB1YmxpYyB0cmFuc2NsdWRlID0gZmFsc2U7CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBlbGVtSWQ6ICdAJywKKyAgICAgICAgICAgIHRleHQ6ICdAJywKKyAgICAgICAgICAgIGRpc2FibGVkOiAnPScsCisgICAgICAgICAgICBzZGNDaGVja2xpc3RNb2RlbDogJz0nLAorICAgICAgICAgICAgc2RjQ2hlY2tsaXN0VmFsdWU6ICc9JworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvY2hlY2tib3gvY2hlY2tib3guaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBsaW5rID0gKHNjb3BlOklDaGVja2JveEVsZW1lbnRTY29wZSwgJGVsZW06bmcuSUF1Z21lbnRlZEpRdWVyeSwgJGF0dHJzOmFuZ3VsYXIuSUF0dHJpYnV0ZXMpID0+IHsKKyAgICAgICAgICAgIC8vJGVsZW0ucmVtb3ZlQXR0cigiaWQiKQorICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzY29wZS5zZGNDaGVja2xpc3RWYWx1ZSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94RWxlbWVudERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSwgJGZpbHRlcik7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBDaGVja2JveEVsZW1lbnREaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZScsICckZmlsdGVyJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvcmFkaW9idXR0b24vcmFkaW9idXR0b24uaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9yYWRpb2J1dHRvbi9yYWRpb2J1dHRvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMWZhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvcmFkaW9idXR0b24vcmFkaW9idXR0b24uaHRtbApAQCAtMCwwICsxLDUgQEAKKzxkaXYgY2xhc3M9InRsdi1yYWRpbyI+CisgICAgPGlucHV0IG5hbWU9Int7ZWxlbU5hbWV9fSIgaWQ9Int7ZWxlbUlkfX0iIGNsYXNzPSJ0bHYtcmFkaW8taSIgdHlwZT0icmFkaW8iIG5nLW1vZGVsPSJzZGNNb2RlbCIgbmctY2xpY2s9Im9uVmFsdWVDaGFuZ2UoKSIKKyAgICAgICAgbmctZGlzYWJsZWQ9ImRpc2FibGVkIiB2YWx1ZT0ie3t2YWx1ZX19IiAvPgorICAgIDxsYWJlbCBmb3I9Int7ZWxlbUlkfX0iIHNkYy1zbWFydC10b29sdGlwIGNsYXNzPSJ0bHYtcmFkaW8tbGFiZWwiPnt7dGV4dH19PC9sYWJlbD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VsZW1lbnRzL3JhZGlvYnV0dG9uL3JhZGlvYnV0dG9uLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvcmFkaW9idXR0b24vcmFkaW9idXR0b24ubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VsZW1lbnRzL3JhZGlvYnV0dG9uL3JhZGlvYnV0dG9uLmxlc3MKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9yYWRpb2J1dHRvbi9yYWRpb2J1dHRvbi50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9yYWRpb2J1dHRvbi9yYWRpb2J1dHRvbi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmU1OGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VsZW1lbnRzL3JhZGlvYnV0dG9uL3JhZGlvYnV0dG9uLnRzCkBAIC0wLDAgKzEsNzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgIGltcG9ydCBJTmdNb2RlbENvbnRyb2xsZXIgPSBhbmd1bGFyLklOZ01vZGVsQ29udHJvbGxlcjsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElSYWRpb2J1dHRvbkVsZW1lbnRTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIGVsZW1JZDogc3RyaW5nOworICAgICAgICBlbGVtTmFtZTogc3RyaW5nOworICAgICAgICB0ZXh0OiBzdHJpbmc7CisgICAgICAgIHNkY01vZGVsOiBhbnk7CisgICAgICAgIHZhbHVlOiBhbnk7CisgICAgICAgIGRpc2FibGVkOiBib29sZWFuOworICAgICAgICBvblZhbHVlQ2hhbmdlOkZ1bmN0aW9uOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBSYWRpb2J1dHRvbkVsZW1lbnREaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHB1YmxpYyByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcHVibGljIHRyYW5zY2x1ZGUgPSBmYWxzZTsKKworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIGVsZW1JZDogJ0AnLAorICAgICAgICAgICAgZWxlbU5hbWU6ICdAJywKKyAgICAgICAgICAgIHRleHQ6ICdAJywKKyAgICAgICAgICAgIHNkY01vZGVsOiAnPScsCisgICAgICAgICAgICB2YWx1ZTogJ0AnLAorICAgICAgICAgICAgZGlzYWJsZWQ6ICc9JywKKyAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U6ICcmJworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxlbWVudHMvcmFkaW9idXR0b24vcmFkaW9idXR0b24uaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBsaW5rID0gKHNjb3BlOklSYWRpb2J1dHRvbkVsZW1lbnRTY29wZSwgJGVsZW06bmcuSUF1Z21lbnRlZEpRdWVyeSwgJGF0dHJzOmFuZ3VsYXIuSUF0dHJpYnV0ZXMpID0+IHsKKyAgICAgICAgICAgIC8vJGVsZW0ucmVtb3ZlQXR0cigiaWQiKQorICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzY29wZS5zZGNDaGVja2xpc3RWYWx1ZSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhZGlvYnV0dG9uRWxlbWVudERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSwgJGZpbHRlcik7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBSYWRpb2J1dHRvbkVsZW1lbnREaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZScsICckZmlsdGVyJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxsaXBzaXMvZWxsaXBzaXMtZGlyZWN0aXZlLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxsaXBzaXMvZWxsaXBzaXMtZGlyZWN0aXZlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmYTA2YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGxpcHNpcy9lbGxpcHNpcy1kaXJlY3RpdmUuaHRtbApAQCAtMCwwICsxLDcgQEAKK3t7YWN0dWFsVGV4dH19CisKKzxzcGFuIGNsYXNzPSJlbGxpcHNpcy1kaXJlY3RpdmUtbW9yZS1sZXNzIgorICAgICAgZGF0YS1uZy1jbGljaz0iY29sbGFwc2VkID0gIWNvbGxhcHNlZDsgdG9nZ2xlVGV4dCgpIgorICAgICAgZGF0YS1uZy1oaWRlPSJlbGxpcHNpcy5sZW5ndGggPD0gbWF4Q2hhcnMiPgorICB7e2NvbGxhcHNlZCA/ICJNb3JlIiA6ICJMZXNzIn19Cis8L3NwYW4+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxsaXBzaXMvZWxsaXBzaXMtZGlyZWN0aXZlLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxsaXBzaXMvZWxsaXBzaXMtZGlyZWN0aXZlLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkZmRiYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGxpcHNpcy9lbGxpcHNpcy1kaXJlY3RpdmUubGVzcwpAQCAtMCwwICsxLDEwIEBACisuZWxsaXBzaXMtZGlyZWN0aXZlLW1vcmUtbGVzcyB7CisgICAgLmFfOTsKKyAgICAuYm9sZDsKKyAgICAuaGFuZDsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luLXJpZ2h0OiAxN3B4OworICAgIGxpbmUtaGVpZ2h0OiAyM3B4OworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxsaXBzaXMvZWxsaXBzaXMtZGlyZWN0aXZlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VsbGlwc2lzL2VsbGlwc2lzLWRpcmVjdGl2ZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWNjZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2VsbGlwc2lzL2VsbGlwc2lzLWRpcmVjdGl2ZS50cwpAQCAtMCwwICsxLDgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgZXhwb3J0IGludGVyZmFjZSBJRWxsaXBzaXNTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIGVsbGlwc2lzOiBzdHJpbmc7CisgICAgICAgIG1heENoYXJzOiBudW1iZXI7CisgICAgICAgIHRvZ2dsZVRleHQoKTogdm9pZDsKKyAgICAgICAgY29sbGFwc2VkOiBib29sZWFuOworICAgICAgICBhY3R1YWxUZXh0OiBzdHJpbmc7CisKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRWxsaXBzaXNEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOiBuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpIHt9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBlbGxpcHNpczogJz0nLAorICAgICAgICAgICAgbW9yZUNsYXNzOiAnQCcsCisgICAgICAgICAgICBtYXhDaGFyczogJz0nCisgICAgICAgIH07CisKKyAgICAgICAgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICByZXN0cmljdCA9ICdBJzsKKyAgICAgICAgdGVtcGxhdGUgPSAoKTogc3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZWxsaXBzaXMvZWxsaXBzaXMtZGlyZWN0aXZlLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklFbGxpcHNpc1Njb3BlLCAkZWxlbTphbnkpID0+IHsKKworCisgICAgICAgICAgICAgICAgc2NvcGUuY29sbGFwc2VkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHNjb3BlLnRvZ2dsZVRleHQgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmKHNjb3BlLmVsbGlwc2lzICYmIHNjb3BlLmNvbGxhcHNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuYWN0dWFsVGV4dCA9IHNjb3BlLmVsbGlwc2lzLnN1YnN0cigwLCBzY29wZS5tYXhDaGFycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5hY3R1YWxUZXh0ICs9IHNjb3BlLmVsbGlwc2lzLmxlbmd0aCA+IHNjb3BlLm1heENoYXJzID8gJy4uLicgOiAnJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmFjdHVhbFRleHQgPSBzY29wZS5lbGxpcHNpczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBzY29wZS4kd2F0Y2goImVsbGlwc2lzIiwgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuY29sbGFwc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUudG9nZ2xlVGV4dCgpOworICAgICAgICAgICAgICAgIH0pOworCisKKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTogbmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRWxsaXBzaXNEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgRWxsaXBzaXNEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2V2ZW50cy9vbi1sYXN0LXJlcGVhdC9vbi1sYXN0LXJlcGVhdC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ldmVudHMvb24tbGFzdC1yZXBlYXQvb24tbGFzdC1yZXBlYXQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNjgyZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ldmVudHMvb24tbGFzdC1yZXBlYXQvb24tbGFzdC1yZXBlYXQudHMKQEAgLTAsMCArMSw2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgLyoqCisgICAgICogVXNhZ2U6CisgICAgICogSW4gZGF0YS1uZy1yZXBlYXQgaHRtbDogPG9sIG5nLXJlcGVhdD0icmVjb3JkIGluIHJlY29yZHMiIG9uLWxhc3QtcmVwZWF0PgorICAgICAqIEluIHRoZSBjb250cm9sbGVyLCBjYXRjaCB0aGUgbGFzdCByZXBlYXQ6CisgICAgICogJHNjb3BlLiRvbignb25SZXBlYXRMYXN0JywgZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKXsKKyAgICAgKiAvL3dvcmsgeW91ciBtYWdpYworICAgICAqIH0pOworICAgICAqLworICAgIGV4cG9ydCBpbnRlcmZhY2UgSU9uTGFzdFJlcGVhdERpcmVjdGl2ZVNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgJGxhc3Q6YW55OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBPbkxhc3RSZXBlYXREaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHt9CisKKyAgICAgICAgc2NvcGUgPSB7fTsKKworICAgICAgICByZXN0cmljdCA9ICdBRSc7CisgICAgICAgIHJlcGxhY2UgPSB0cnVlOworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SU9uTGFzdFJlcGVhdERpcmVjdGl2ZVNjb3BlLCBlbGVtZW50OmFueSwgYXR0cnM6YW55KSA9PiB7CisgICAgICAgICAgICBsZXQgczphbnkgPSBzY29wZS4kcGFyZW50OyAvLyByZXBlYXQgc2NvcGUKKyAgICAgICAgICAgIGlmIChzLiRsYXN0KSB7CisgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICAgICBzLiRlbWl0KCdvblJlcGVhdExhc3QnLCBlbGVtZW50LCBhdHRycyk7CisgICAgICAgICAgICAgICAgfSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9uTGFzdFJlcGVhdERpcmVjdGl2ZSgpOworICAgICAgICB9OworCisgICAgfQorCisgICAgT25MYXN0UmVwZWF0RGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFtdOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2ZpbGUtb3BlbmVyL2ZpbGUtb3BlbmVyLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS1vcGVuZXIvZmlsZS1vcGVuZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY4MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2ZpbGUtb3BlbmVyL2ZpbGUtb3BlbmVyLmh0bWwKQEAgLTAsMCArMSwzIEBACis8ZGl2PgorPGlucHV0IGNsYXNzPSJpLXNkYy1kYXNoYm9hcmQtaXRlbS11cGxvYWQtaW5wdXQiICB0eXBlPSJmaWxlIiBkYXRhLXRlc3RzLWlkPSJmaWxlLXt7dGVzdHNJZH19IiBkYXRhLW5nLW1vZGVsPSJpbXBvcnRGaWxlIiAgYmFzZS1zaXh0eS1mb3VyLWlucHV0IGRhdGEtbmctY2hhbmdlPSJvbkZpbGVTZWxlY3QoKSIgYWNjZXB0PSJ7e2dldEV4dGVuc2lvbnNXaXRoRG90KCl9fSIvPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS1vcGVuZXIvZmlsZS1vcGVuZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS1vcGVuZXIvZmlsZS1vcGVuZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlM2UxOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9maWxlLW9wZW5lci9maWxlLW9wZW5lci50cwpAQCAtMCwwICsxLDc3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElGaWxlT3BlbmVyU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBpbXBvcnRGaWxlOmFueTsKKyAgICAgICAgdGVzdHNJZDphbnk7CisgICAgICAgIGV4dGVuc2lvbnM6c3RyaW5nOworCisgICAgICAgIG9uRmlsZVNlbGVjdCgpOnZvaWQ7CisgICAgICAgIG9uRmlsZVVwbG9hZChmaWxlOmFueSk6dm9pZDsKKyAgICAgICAgZ2V0RXh0ZW5zaW9uc1dpdGhEb3QoKTpzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEZpbGVPcGVuZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkY29tcGlsZTpuZy5JQ29tcGlsZVNlcnZpY2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgb25GaWxlVXBsb2FkOiAnJicsCisgICAgICAgICAgICB0ZXN0c0lkOiAnQCcsCisgICAgICAgICAgICBleHRlbnNpb25zOiAnQCcKKyAgICAgICAgfTsKKworICAgICAgICByZXN0cmljdCA9ICdBRSc7CisgICAgICAgIHJlcGxhY2UgPSB0cnVlOworICAgICAgICB0ZW1wbGF0ZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2ZpbGUtb3BlbmVyL2ZpbGUtb3BlbmVyLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklGaWxlT3BlbmVyU2NvcGUsIGVsZW1lbnQ6YW55KSA9PiB7CisKKyAgICAgICAgICAgIHNjb3BlLm9uRmlsZVNlbGVjdCA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5vbkZpbGVVcGxvYWQoe2ZpbGU6IHNjb3BlLmltcG9ydEZpbGV9KTsKKyAgICAgICAgICAgICAgICBlbGVtZW50Lmh0bWwodGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2ZpbGUtb3BlbmVyL2ZpbGUtb3BlbmVyLmh0bWwnKSk7CisgICAgICAgICAgICAgICAgdGhpcy4kY29tcGlsZShlbGVtZW50LmNvbnRlbnRzKCkpKHNjb3BlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmdldEV4dGVuc2lvbnNXaXRoRG90ID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcmV0ID0gW107CisgICAgICAgICAgICAgICAgXy5lYWNoKHNjb3BlLmV4dGVuc2lvbnMuc3BsaXQoJywnKSwgZnVuY3Rpb24oaXRlbSl7CisgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKCIuIiArIGl0ZW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldC5qb2luKCIsIik7CisgICAgICAgICAgICB9OworCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGNvbXBpbGU6bmcuSUNvbXBpbGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZU9wZW5lckRpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSwgJGNvbXBpbGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgRmlsZU9wZW5lckRpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJywgJyRjb21waWxlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS10eXBlL2ZpbGUtdHlwZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9maWxlLXR5cGUvZmlsZS10eXBlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZGVlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS10eXBlL2ZpbGUtdHlwZS50cwpAQCAtMCwwICsxLDY2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgRmlsZVR5cGVEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHt9CisKKyAgICAgICAgcmVxdWlyZSA9ICduZ01vZGVsJzsKKworICAgICAgICBsaW5rID0gKHNjb3BlLCBlbGVtLCBhdHRycywgbmdNb2RlbCkgPT4geworCisgICAgICAgICAgICBsZXQgdHlwZXNUb0FwcHJvdmUgPSAiIjsKKworICAgICAgICAgICAgYXR0cnMuJG9ic2VydmUoJ2ZpbGVUeXBlJywgKHZhbDpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgICAgICB0eXBlc1RvQXBwcm92ZSA9IHZhbDsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZShuZ01vZGVsLiR2aWV3VmFsdWUpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGxldCB2YWxpZGF0ZTogRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBsZXQgZmlsZU5hbWU6c3RyaW5nID0gZWxlbS52YWwoKSwgIHZhbGlkOmJvb2xlYW4gPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICYmIHZhbHVlICYmIHR5cGVzVG9BcHByb3ZlKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBleHRlbnNpb246c3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHR5cGVzVG9BcHByb3ZlLnNwbGl0KCcsJykuaW5kZXhPZihleHRlbnNpb24pID4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0VmFsaWRpdHkoJ2ZpbGV0eXBlJywgdmFsaWQpOworICAgICAgICAgICAgICAgIGlmKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRQcmlzdGluZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvL0ZvciBET00gLT4gbW9kZWwgdmFsaWRhdGlvbgorICAgICAgICAgICAgbmdNb2RlbC4kcGFyc2Vycy51bnNoaWZ0KHZhbGlkYXRlKTsKKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlVHlwZURpcmVjdGl2ZSgpOworICAgICAgICB9OworCisgICAgfQorCisgICAgRmlsZVR5cGVEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gW107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS11cGxvYWQvZmlsZS11cGxvYWQuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmM4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS11cGxvYWQvZmlsZS11cGxvYWQuaHRtbApAQCAtMCwwICsxLDIyIEBACis8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0gaS1zZGMtZm9ybS1maWxlLXVwbG9hZCI+CisgICAgPHNwYW4gY2xhc3M9Imktc2RjLWZvcm0tZmlsZS1uYW1lIiBkYXRhLXRlc3RzLWlkPSJmaWxlbmFtZSI+e3soZmlsZU1vZGVsICYmIGZpbGVNb2RlbC5maWxlbmFtZSkgfHwgZGVmYXVsdFRleHR9fTwvc3Bhbj4KKyAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWZpbGUtdXBsb2FkLXgtYnRuIiBuZy1jbGljaz0iY2FuY2VsKCkiIGRhdGEtbmctc2hvdz0iZmlsZU1vZGVsLmZpbGVuYW1lICYmIGZpbGVNb2RlbC5maWxlbmFtZSE9PScnICYmIGVsZW1lbnREaXNhYmxlZCE9PSd0cnVlJyI+PC9kaXY+CisgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWZpbGUtdXBsb2FkLWxhYmVsIj4KKyAgICAgICAgPGlucHV0CisgICAgICAgICAgICB0eXBlPSJmaWxlIgorICAgICAgICAgICAgbmFtZT0ie3tlbGVtZW50TmFtZX19IgorICAgICAgICAgICAgbmctbW9kZWw9Im15RmlsZU1vZGVsIgorICAgICAgICAgICAgYmFzZS1zaXh0eS1mb3VyLWlucHV0CisgICAgICAgICAgICBhY2NlcHQ9Int7Z2V0RXh0ZW5zaW9uc1dpdGhEb3QoKX19IgorICAgICAgICAgICAgZmlsZS10eXBlPSJ7e2V4dGVuc2lvbnN9fSIKKyAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJvbkZpbGVDaGFuZ2UoKSIKKyAgICAgICAgICAgIG9uY2hhbmdlPSJhbmd1bGFyLmVsZW1lbnQodGhpcykuc2NvcGUoKS5zZXRFbXB0eUVycm9yKHRoaXMpIgorICAgICAgICAgICAgb25jbGljaz0iYW5ndWxhci5lbGVtZW50KHRoaXMpLnNjb3BlKCkub25GaWxlQ2xpY2sodGhpcykiCisgICAgICAgICAgICBkYXRhLW5nLXJlcXVpcmVkPSJ7e2VsZW1lbnRSZXF1aXJlZH19IgorICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iZWxlbWVudERpc2FibGVkPT09J3RydWUnIgorICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iYnJvd3NlQnV0dG9uIgorICAgICAgICAgICAgbWF4c2l6ZT0iMTAyNDAiCisgICAgICAgICAgICAvPgorICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLXVwbG9hZC1icm93c2UtYnRuIiBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzplbGVtZW50RGlzYWJsZWQ9PT0ndHJ1ZSd9Ij5Ccm93c2U8L2Rpdj4KKyAgICA8L2xhYmVsPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS11cGxvYWQvZmlsZS11cGxvYWQubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNGIwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS11cGxvYWQvZmlsZS11cGxvYWQubGVzcwpAQCAtMCwwICsxLDc1IEBACisuaS1zZGMtZm9ybS1maWxlLXVwbG9hZCB7CisKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIG1hcmdpbi10b3A6IDA7CisgICAgd2lkdGg6IDEwMCU7CisgICAgLnBfMTsKKyAgICAuYmdfYzsKKyAgICAuYm9yZGVyLXJhZGl1cygycHgpOworICAgIGJvcmRlcjogc29saWQgMXB4IEBib3JkZXJfY29sb3JfZjsKKyAgICBoZWlnaHQ6IDMwcHg7CisKKyAgICBpbnB1dFt0eXBlPSJmaWxlIl0geworICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7CisgICAgICAgIHdpZHRoOiAxMDBweDsKKyAgICAgICAgaGVpZ2h0OiAzMHB4OworICAgICAgICBvcGFjaXR5OiAwOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHJpZ2h0OiAwOworICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICAgICAgdG9wOiAwOworICAgIH0KKworICAgIC5pLXNkYy1mb3JtLWZpbGUtbmFtZXsKKyAgICAgICAgZmxleC1ncm93OiA5OTk7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgIHBhZGRpbmc6IDNweCAxMHB4OworICAgICAgICBvcGFjaXR5OiAwLjY7CisgICAgICAgIHdpZHRoOiA4MCU7CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworCisgICAgfQorCisgICAgLmktc2RjLWZvcm0tZmlsZS11cGxvYWQteC1idG57CisgICAgICAgIGZsZXgtZ3JvdzogMTsKKyAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgLnNwcml0ZS5zbWFsbC14LWJ0bi1ibGFjazsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICB0b3A6IDEwcHg7CisgICAgICAgIHJpZ2h0OiA5cHg7CisgICAgICAgIHdpZHRoOiAxMHB4OworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgfQorICAgIC5pLXNkYy1mb3JtLWZpbGUtdXBsb2FkLWxhYmVsIHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICB3aWR0aDogMTAwcHg7CisgICAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgICAgLmJnX247CisgICAgICAgIC5iXzk7CisKKyAgICAgICAgLmZpbGUtdXBsb2FkLWJyb3dzZS1idG4geworICAgICAgICAgICAgLm5vc2VsZWN0OworICAgICAgICAgICAgcGFkZGluZzogNHB4IDZweDsKKyAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgICAgIHotaW5kZXg6IDk5OTsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIHdpZHRoOiAxMDBweDsKKyAgICAgICAgICAgIGhlaWdodDogMjhweDsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKworICAgICAgICAgICAgJi5kaXNhYmxlZCB7CisgICAgICAgICAgICAgICAgY3Vyc29yOiBkZWZhdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgJi5lcnJvciB7CisgICAgICAgIGJvcmRlci1jb2xvcjogI2RhMWYzZDsKKyAgICAgICAgb3V0bGluZTogbm9uZTsKKyAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS11cGxvYWQvZmlsZS11cGxvYWQudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS11cGxvYWQvZmlsZS11cGxvYWQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkYjNlNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC50cwpAQCAtMCwwICsxLDEzNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMS8yNy8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkTW9kZWwgeworICAgICAgICBmaWxldHlwZTogc3RyaW5nOworICAgICAgICBmaWxlbmFtZTogc3RyaW5nOworICAgICAgICBmaWxlc2l6ZTogbnVtYmVyOworICAgICAgICBiYXNlNjQ6IHN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElGaWxlVXBsb2FkU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBmaWxlTW9kZWw6IEZpbGVVcGxvYWRNb2RlbDsKKyAgICAgICAgZm9ybUVsZW1lbnQ6bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBleHRlbnNpb25zOiBzdHJpbmc7CisgICAgICAgIGVsZW1lbnREaXNhYmxlZDogc3RyaW5nOworICAgICAgICBlbGVtZW50TmFtZTogc3RyaW5nOworICAgICAgICBlbGVtZW50UmVxdWlyZWQ6IHN0cmluZzsKKyAgICAgICAgbXlGaWxlTW9kZWw6IGFueTsgLy8gRnJvbSB0aGUgbmcgYmluZCB0byA8aW5wdXQgdHlwZT1maWxlCisgICAgICAgIGRlZmF1bHRUZXh0OiBzdHJpbmc7CisgICAgICAgIG9uRmlsZUNoYW5nZWRJbkRpcmVjdGl2ZTpGdW5jdGlvbjsKKworICAgICAgICBnZXRFeHRlbnNpb25zV2l0aERvdCgpOnN0cmluZzsKKyAgICAgICAgb25GaWxlQ2hhbmdlKCk6dm9pZAorICAgICAgICBvbkZpbGVDbGljayhlbGVtZW50OmFueSk6dm9pZDsKKyAgICAgICAgc2V0RW1wdHlFcnJvcihlbGVtZW50KTp2b2lkOworICAgICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkOmFueSk6Ym9vbGVhbjsKKyAgICAgICAgY2FuY2VsKCk6dm9pZDsKKyAgICB9CisKKworICAgIGV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsIHByaXZhdGUgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbikgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBmaWxlTW9kZWw6ICc9JywKKyAgICAgICAgICAgIGZvcm1FbGVtZW50OiAnPScsCisgICAgICAgICAgICBleHRlbnNpb25zOiAnQCcsCisgICAgICAgICAgICBlbGVtZW50RGlzYWJsZWQ6ICdAJywKKyAgICAgICAgICAgIGVsZW1lbnROYW1lOiAnQCcsCisgICAgICAgICAgICBlbGVtZW50UmVxdWlyZWQ6ICdAJywKKyAgICAgICAgICAgIG9uRmlsZUNoYW5nZWRJbkRpcmVjdGl2ZTogJz0/JywKKyAgICAgICAgICAgIGRlZmF1bHRUZXh0OiAnPScsCisgICAgICAgIH07CisKKyAgICAgICAgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHJlcGxhY2UgPSB0cnVlOworICAgICAgICB0ZW1wbGF0ZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklGaWxlVXBsb2FkU2NvcGUsIGVsZW1lbnQ6YW55LCAkYXR0cjphbnkpID0+IHsKKworICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgYnJvd3NlIGhhcyBmaWxlbmFtZSwgc2V0IGl0IHZhbGlkLgorICAgICAgICAgICAgLy8gV2hlbiBlZGl0aW5nIGFydGlmYWN0IHRoZSBmaWxlIGlzIG5vdCBzZW50IGFnYWluLCBzbyBpZiB3ZSBoYXZlIGZpbGVuYW1lIEkgZG8gbm90IHdhbnQgdG8gc2hvdyBlcnJvci4KKyAgICAgICAgICAgIGlmIChzY29wZS5maWxlTW9kZWwgJiYgc2NvcGUuZmlsZU1vZGVsLmZpbGVuYW1lICYmIHNjb3BlLmZpbGVNb2RlbC5maWxlbmFtZSE9PScnKXsKKyAgICAgICAgICAgICAgICBzY29wZS5mb3JtRWxlbWVudFtzY29wZS5lbGVtZW50TmFtZV0uJHNldFZhbGlkaXR5KCdyZXF1aXJlZCcsIHRydWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5nZXRFeHRlbnNpb25zV2l0aERvdCA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHJldCA9IFtdOworICAgICAgICAgICAgICAgIGlmKHNjb3BlLmV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgXy5lYWNoKHNjb3BlLmV4dGVuc2lvbnMuc3BsaXQoJywnKSwgZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKCIuIiArIGl0ZW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0LmpvaW4oIiwiKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLm9uRmlsZUNoYW5nZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChzY29wZS5vbkZpbGVDaGFuZ2VkSW5EaXJlY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUub25GaWxlQ2hhbmdlZEluRGlyZWN0aXZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY29wZS5teUZpbGVNb2RlbCkgeworICAgICAgICAgICAgICAgICAgICBzY29wZS5maWxlTW9kZWwgPSBzY29wZS5teUZpbGVNb2RlbDsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuZm9ybUVsZW1lbnRbc2NvcGUuZWxlbWVudE5hbWVdLiRzZXRWYWxpZGl0eSgncmVxdWlyZWQnLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5zZXRFbXB0eUVycm9yID0gKGVsZW1lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZmlsZXNbMF0uc2l6ZSl7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmZvcm1FbGVtZW50W3Njb3BlLmVsZW1lbnROYW1lXS4kc2V0VmFsaWRpdHkoJ2VtcHR5RmlsZScsIHRydWUpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBzY29wZS5mb3JtRWxlbWVudFtzY29wZS5lbGVtZW50TmFtZV0uJHNldFZhbGlkaXR5KCdlbXB0eUZpbGUnLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmZpbGVNb2RlbCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFdvcmthcm91bmQsIGluIGNhc2UgdXNlciBzZWxlY3QgYSBmaWxlIHRoZW4gY2FuY2VsIChYKSB0aGVuIHNlbGVjdCB0aGUgZmlsZSBhZ2FpbiwgdGhlIGV2ZW50IG9uQ2hhbmdlIGlzIG5vdCBmaXJlZC4KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZpeCB0aGlzIGlzc3VlLgorICAgICAgICAgICAgc2NvcGUub25GaWxlQ2xpY2sgPSAoZWxlbWVudDphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBudWxsOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUuY2FuY2VsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUuZmlsZU1vZGVsLmZpbGVuYW1lID0gJyc7CisgICAgICAgICAgICAgICAgc2NvcGUuZm9ybUVsZW1lbnRbc2NvcGUuZWxlbWVudE5hbWVdLiRwcmlzdGluZTsKKyAgICAgICAgICAgICAgICBzY29wZS5mb3JtRWxlbWVudFtzY29wZS5lbGVtZW50TmFtZV0uJHNldFZhbGlkaXR5KCdyZXF1aXJlZCcsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVVwbG9hZERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSwgc2RjQ29uZmlnKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIEZpbGVVcGxvYWREaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZScsICdzZGNDb25maWcnXTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tbW9uL2NvbW1vbi1ncmFwaC11dGlscy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tbW9uL2NvbW1vbi1ncmFwaC11dGlscy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFlNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21tb24vY29tbW9uLWdyYXBoLXV0aWxzLnRzCkBAIC0wLDAgKzEsMzYxIEBACisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDEyLzIxLzIwMTYuCisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMTIvMTMvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5HcmFwaC5VdGlscyB7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tbW9uR3JhcGhVdGlscyB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBOb2Rlc0ZhY3Rvcnk6U2RjLlV0aWxzLk5vZGVzRmFjdG9yeSwgcHJpdmF0ZSBMaW5rc0ZhY3Rvcnk6U2RjLlV0aWxzLkxpbmtzRmFjdG9yeSkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2FmZUFwcGx5ID0gKHNjb3BlOm5nLklTY29wZSwgZm46YW55KSA9PiB7IC8vdG9kbyByZW1vdmUgdG8gZ2VuZXJhbCB1dGlscworICAgICAgICAgICAgbGV0IHBoYXNlID0gc2NvcGUuJHJvb3QuJCRwaGFzZTsKKyAgICAgICAgICAgIGlmIChwaGFzZSA9PSAnJGFwcGx5JyB8fCBwaGFzZSA9PSAnJGRpZ2VzdCcpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm4gJiYgKHR5cGVvZihmbikgPT09ICdmdW5jdGlvbicpKSB7CisgICAgICAgICAgICAgICAgICAgIGZuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZm4pOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEcmF3IG5vZGUgb24gdGhlIGdyYXBoCisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKiBAcGFyYW0gY29tcG9zaXRpb25HcmFwaE5vZGUKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uCisgICAgICAgICAqIEByZXR1cm5zIHtDb2xsZWN0aW9uRWxlbWVudHN9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWRkTm9kZVRvR3JhcGgoY3k6Q3kuSW5zdGFuY2UsIGNvbXBvc2l0aW9uR3JhcGhOb2RlOk1vZGVscy5HcmFwaC5Db21tb25Ob2RlQmFzZSwgcG9zaXRpb24/OkN5LlBvc2l0aW9uKTpDeS5Db2xsZWN0aW9uRWxlbWVudHMgeworCisgICAgICAgICAgICB2YXIgbm9kZSA9IGN5LmFkZCg8Q3kuRWxlbWVudERlZmluaXRpb24+IHsKKyAgICAgICAgICAgICAgICBncm91cDogJ25vZGVzJywKKyAgICAgICAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCisgICAgICAgICAgICAgICAgZGF0YTogY29tcG9zaXRpb25HcmFwaE5vZGUsCisgICAgICAgICAgICAgICAgY2xhc3NlczogY29tcG9zaXRpb25HcmFwaE5vZGUuY2xhc3NlcworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmKCFub2RlLmRhdGEoKS5pc1VjcGUpIHsgLy91Y3BlIHNob3VsZCBub3QgaGF2ZSB0b29sdGlwCisgICAgICAgICAgICAgICAgdGhpcy5pbml0Tm9kZVRvb2x0aXAobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgY29tcG9uZW50IGluc3RhbmNlIG5vZGUgYnkgdGhlIGNvbXBvbmVudEluc3RhbmNlIHBvc2l0aW9uLgorICAgICAgICAgKiBJZiB0aGUgbm9kZSBpcyBVQ1BFIHRoZSBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhbGwgY3AgbGFuJndhbiBmb3IgdGhlIHVjcGUKKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBjb21wb3NpdGlvbkdyYXBoTm9kZQorICAgICAgICAgKiBAcmV0dXJucyB7Q3kuQ29sbGVjdGlvbkVsZW1lbnRzfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFkZENvbXBvbmVudEluc3RhbmNlTm9kZVRvR3JhcGgoY3k6Q3kuSW5zdGFuY2UsIGNvbXBvc2l0aW9uR3JhcGhOb2RlOk1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZUJhc2UpOkN5LkNvbGxlY3Rpb25FbGVtZW50cyB7CisKKyAgICAgICAgICAgIGxldCBub2RlUG9zaXRpb24gPSB7CisgICAgICAgICAgICAgICAgeDogK2NvbXBvc2l0aW9uR3JhcGhOb2RlLmNvbXBvbmVudEluc3RhbmNlLnBvc1gsCisgICAgICAgICAgICAgICAgeTogK2NvbXBvc2l0aW9uR3JhcGhOb2RlLmNvbXBvbmVudEluc3RhbmNlLnBvc1kKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5hZGROb2RlVG9HcmFwaChjeSwgY29tcG9zaXRpb25HcmFwaE5vZGUsIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25HcmFwaE5vZGUuaXNVY3BlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVVY3BlQ3BOb2RlcyhjeSwgbm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBDUF9XQU4gJiBDUF9MQU4gIGZvciB0aGUgVUNQRS4gdGhpcyBpcyBhIHNwZWNpYWwgbm9kZSBvbiB0aGUgZ3JvdXAgdGhhdCB3aWxsIGJlaGF2ZSBsaWtlIHBvcnRzIG9uIHRoZSB1Y3BlCisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKiBAcGFyYW0gdWNwZUdyYXBoTm9kZQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBjcmVhdGVVY3BlQ3BOb2RlcyhjeTpDeS5JbnN0YW5jZSwgdWNwZUdyYXBoTm9kZTpDeS5Db2xsZWN0aW9uTm9kZXMpOnZvaWQgeworCisgICAgICAgICAgICBsZXQgcmVxdWlyZW1lbnRzQXJyYXk6QXJyYXk8YW55PiA9IHVjcGVHcmFwaE5vZGUuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlLnJlcXVpcmVtZW50c1sidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiXTsKKyAgICAgICAgICAgIC8vc2hvdyBvbmx5IExBTiBvciBXQU4gcmVxdWlyZW1lbnRzCisgICAgICAgICAgICByZXF1aXJlbWVudHNBcnJheSA9IF8ucmVqZWN0KHJlcXVpcmVtZW50c0FycmF5LCAocmVxdWlyZW1lbnQ6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5hbWU6c3RyaW5nID0gcmVxdWlyZW1lbnQub3duZXJOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuaW5kZXhPZignbGFuJykgPT09IC0xICYmIG5hbWUuaW5kZXhPZignd2FuJykgPT09IC0xOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXF1aXJlbWVudHNBcnJheS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICAgICAgICAgICAgbGV0IG5hbWVBID0gYS5vd25lck5hbWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW14gXSsvKVswXTsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZUIgPSBiLm93bmVyTmFtZS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bXiBdKy8pWzBdOworICAgICAgICAgICAgICAgIGxldCBudW1BID0gXy5sYXN0KGEub3duZXJOYW1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKSk7CisgICAgICAgICAgICAgICAgbGV0IG51bUIgPSBfLmxhc3QoYi5vd25lck5hbWUudG9Mb3dlckNhc2UoKS5zcGxpdCgnICcpKTsKKworICAgICAgICAgICAgICAgIGlmIChuYW1lQSA9PT0gbmFtZUIpIHJldHVybiBudW1BID4gbnVtQiA/IDEgOiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZUEgPCBuYW1lQiA/IDEgOiAtMTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gYW5ndWxhci5jb3B5KHVjcGVHcmFwaE5vZGUuYm91bmRpbmdib3goKSk7CisgICAgICAgICAgICAvL2FkZCBDUCBub2RlcyB0byBncm91cAorICAgICAgICAgICAgbGV0IHRvcENwczpudW1iZXIgPSAwOworICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlbWVudHNBcnJheS5sZW5ndGg7IGkrKykgeworCisgICAgICAgICAgICAgICAgbGV0IGNwTm9kZSA9IHRoaXMuTm9kZXNGYWN0b3J5LmNyZWF0ZVVjcGVDcE5vZGUoYW5ndWxhci5jb3B5KHVjcGVHcmFwaE5vZGUuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlKSk7CisgICAgICAgICAgICAgICAgY3BOb2RlLmNvbXBvbmVudEluc3RhbmNlLmNhcGFiaWxpdGllcyA9IHJlcXVpcmVtZW50c0FycmF5W2ldOworICAgICAgICAgICAgICAgIGNwTm9kZS5pZCA9IHJlcXVpcmVtZW50c0FycmF5W2ldLm93bmVySWQ7CisgICAgICAgICAgICAgICAgY3BOb2RlLmdyb3VwID0gdWNwZUdyYXBoTm9kZS5kYXRhKCkuY29tcG9uZW50SW5zdGFuY2UudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgY3BOb2RlLm5hbWUgPSByZXF1aXJlbWVudHNBcnJheVtpXS5vd25lck5hbWU7IC8vZm9yIHRvb2x0aXAKKyAgICAgICAgICAgICAgICBjcE5vZGUuZGlzcGxheU5hbWUgPSByZXF1aXJlbWVudHNBcnJheVtpXS5vd25lck5hbWU7CisgICAgICAgICAgICAgICAgY3BOb2RlLmRpc3BsYXlOYW1lID0gY3BOb2RlLmRpc3BsYXlOYW1lLmxlbmd0aCA+IDUgPyBjcE5vZGUuZGlzcGxheU5hbWUuc3Vic3RyaW5nKDAsIDUpICsgJy4uLicgOiBjcE5vZGUuZGlzcGxheU5hbWU7CisKKworICAgICAgICAgICAgICAgIGlmIChjcE5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2xhbicpID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY3BOb2RlLnRleHRQb3NpdGlvbiA9ICJ0b3AiOworICAgICAgICAgICAgICAgICAgICBjcE5vZGUuY29tcG9uZW50SW5zdGFuY2UucG9zWCA9IHBvc2l0aW9uLngxICsgKGkgKiA5MCkgLSAodG9wQ3BzICogOTApICsgNTM7CisgICAgICAgICAgICAgICAgICAgIGNwTm9kZS5jb21wb25lbnRJbnN0YW5jZS5wb3NZID0gcG9zaXRpb24ueTEgKyA0MDAgKyAyNzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcE5vZGUudGV4dFBvc2l0aW9uID0gImJvdHRvbSI7CisgICAgICAgICAgICAgICAgICAgIGNwTm9kZS5jb21wb25lbnRJbnN0YW5jZS5wb3NYID0gcG9zaXRpb24ueDEgKyAodG9wQ3BzICogOTApICsgNTM7CisgICAgICAgICAgICAgICAgICAgIGNwTm9kZS5jb21wb25lbnRJbnN0YW5jZS5wb3NZID0gcG9zaXRpb24ueTEgKyAyNzsKKyAgICAgICAgICAgICAgICAgICAgdG9wQ3BzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldCBjeUNwTm9kZSA9IHRoaXMuYWRkQ29tcG9uZW50SW5zdGFuY2VOb2RlVG9HcmFwaChjeSwgY3BOb2RlKTsKKyAgICAgICAgICAgICAgICBjeUNwTm9kZS5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBub2RlcyAtIGFsbCBub2RlcyBpbiBncmFwaCBpbiBvcmRlciB0byBmaW5kIHRoZSBlZGdlIGNvbm5lY3RpbmcgdGhlIHR3byBub2RlcworICAgICAgICAgKiBAcGFyYW0gZnJvbU5vZGVJZAorICAgICAgICAgKiBAcGFyYW0gdG9Ob2RlSWQKKyAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUvZmFsc2UgaWYgdGhlIGVkZ2UgaXMgY2VydGlmaWVkIChmcm9tIG5vZGUgYW5kIHRvIG5vZGUgYXJlIGNlcnRpZmllZCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpc1JlbGF0aW9uQ2VydGlmaWVkKG5vZGVzOkN5LkNvbGxlY3Rpb25Ob2RlcywgZnJvbU5vZGVJZDpzdHJpbmcsIHRvTm9kZUlkOnN0cmluZyk6Ym9vbGVhbiB7CisgICAgICAgICAgICBsZXQgcmVzb3VyY2VUZW1wID0gXy5maWx0ZXIobm9kZXMsIGZ1bmN0aW9uIChub2RlOkN5LkNvbGxlY3Rpb25GaXJzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmRhdGEoKS5pZCA9PT0gZnJvbU5vZGVJZCB8fCBub2RlLmRhdGEoKS5pZCA9PT0gdG9Ob2RlSWQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGxldCBjZXJ0aWZpZWQ6Ym9vbGVhbiA9IHRydWU7CisKKyAgICAgICAgICAgIF8uZm9yRWFjaChyZXNvdXJjZVRlbXAsIChpdGVtKSA9PiB7CisgICAgICAgICAgICAgICAgY2VydGlmaWVkID0gY2VydGlmaWVkICYmIGl0ZW0uZGF0YSgpLmNlcnRpZmllZDsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gY2VydGlmaWVkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBsaW5rIHRvIGdyYXBoIC0gb25seSBkcmF3IHRoZSBsaW5rCisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKiBAcGFyYW0gbGluaworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGluc2VydExpbmtUb0dyYXBoID0gKGN5OkN5Lkluc3RhbmNlLCBsaW5rOk1vZGVscy5Db21wb3NpdGlvbkNpTGlua0Jhc2UpID0+IHsKKworICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVsYXRpb25DZXJ0aWZpZWQoY3kubm9kZXMoKSwgbGluay5zb3VyY2UsIGxpbmsudGFyZ2V0KSkgeworICAgICAgICAgICAgICAgIGxpbmsuY2xhc3NlcyA9ICdub3QtY2VydGlmaWVkLWxpbmsnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3kuYWRkKHsKKyAgICAgICAgICAgICAgICBncm91cDogJ2VkZ2VzJywKKyAgICAgICAgICAgICAgICBkYXRhOiBsaW5rLAorICAgICAgICAgICAgICAgIGNsYXNzZXM6IGxpbmsuY2xhc3NlcworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogIGdvIG92ZXIgdGhlIHJlbGF0aW9ucyBhbmQgZHJhdyBsaW5rcyBvbiB0aGUgZ3JhcGgKKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBpbnN0YW5jZXNSZWxhdGlvbnMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbml0R3JhcGhMaW5rcyhjeTpDeS5JbnN0YW5jZSwgaW5zdGFuY2VzUmVsYXRpb25zOkFycmF5PE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbD4pIHsKKworICAgICAgICAgICAgaWYgKGluc3RhbmNlc1JlbGF0aW9ucykgeworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChpbnN0YW5jZXNSZWxhdGlvbnMsIChyZWxhdGlvbnNoaXBNb2RlbDpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHJlbGF0aW9uc2hpcE1vZGVsLnJlbGF0aW9uc2hpcHMsIChyZWxhdGlvbnNoaXA6TW9kZWxzLlJlbGF0aW9uc2hpcCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtUb0NyZWF0ZSA9IHRoaXMuTGlua3NGYWN0b3J5LmNyZWF0ZUdyYXBoTGluayhjeSwgcmVsYXRpb25zaGlwTW9kZWwsIHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmtUb0dyYXBoKGN5LCBsaW5rVG9DcmVhdGUpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgRGV0ZXJtaW5lIHdoaWNoIG5vZGVzIGFyZSBpbiB0aGUgVUNQRSBhbmQgc2V0IGNoaWxkIGRhdGEgZm9yIHRoZW0uCisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGluaXRVY3BlQ2hpbGRyZW4oY3k6Q3kuSW5zdGFuY2UpeworICAgICAgICAgICAgbGV0IHVjcGU6Q3kuQ29sbGVjdGlvbk5vZGVzID0gY3kubm9kZXMoJ1s/aXNVY3BlXScpOyAvLyBHZXQgdWNwZSBvbiBncmFwaCBpZiBleGlzdAorICAgICAgICAgICAgXy5lYWNoKGN5LmVkZ2VzKCcudWNwZS1ob3N0LWxpbmsnKSwgKGxpbmspPT57CisKKyAgICAgICAgICAgICAgICBsZXQgdWNwZUNoaWxkOkN5LkNvbGxlY3Rpb25Ob2RlcyA9IChsaW5rLnNvdXJjZSgpLmlkKCkgPT0gdWNwZS5pZCgpKT8gbGluay50YXJnZXQoKSA6IGxpbmsuc291cmNlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0VWNwZUNoaWxkRGF0YSh1Y3BlQ2hpbGQsIHVjcGUpOworCisgICAgICAgICAgICAgICAgLy92bHMgZG9udCBoYXZlIHVjcGUtaG9zdC1saW5rIGNvbm5lY3Rpb24sIHNvIG5lZWQgdG8gZmluZCB0aGVtIGFuZCBpdGVyYXRlIHNlcGFyYXRlbHkKKyAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGVkVkxzID0gdWNwZUNoaWxkLmNvbm5lY3RlZEVkZ2VzKCkuY29ubmVjdGVkTm9kZXMoJy52bC1ub2RlJyk7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNvbm5lY3RlZFZMcywgKHZsKT0+eyAvL2FsbCBjb25uZWN0ZWQgdmxzIG11c3QgYmUgVUNQRSBjaGlsZHJlbiBiZWNhdXNlIG5vdCBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gYSBWTCBvdXRzaWRlIG9mIHRoZSBVQ1BFCisgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFVjcGVDaGlsZERhdGEodmwsIHVjcGUpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogIFNldCBwcm9wZXJ0aWVzIGZvciBub2RlcyBjb250YWluZWQgYnkgdGhlIFVDUEUKKyAgICAgICAgICogQHBhcmFtIGNoaWxkTm9kZS0gbm9kZSBjb250YWluZWQgaW4gVUNQRQorICAgICAgICAgKiBAcGFyYW0gdWNwZS0gdWNwZSBjb250YWluZXIgbm9kZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGluaXRVY3BlQ2hpbGREYXRhKGNoaWxkTm9kZTpDeS5Db2xsZWN0aW9uTm9kZXMsIHVjcGU6Q3kuQ29sbGVjdGlvbk5vZGVzKXsKKworICAgICAgICAgICAgaWYoIWNoaWxkTm9kZS5kYXRhKCdpc0luc2lkZUdyb3VwJykpeworICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVWNwZUNoaWxkUG9zaXRpb24oY2hpbGROb2RlLCB1Y3BlKTsKKyAgICAgICAgICAgICAgICBjaGlsZE5vZGUuZGF0YSh7aXNJbnNpZGVHcm91cDogdHJ1ZX0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogIFVwZGF0ZXMgVUNQRSBjaGlsZCBub2RlIG9mZnNldCwgd2hpY2ggYWxsb3dzIGNoaWxkIG5vZGVzIHRvIGJlIGRyYWdnZWQgaW4gc3luY2hyb25pemF0aW9uIHdpdGggdWNwZQorICAgICAgICAgKiBAcGFyYW0gY2hpbGROb2RlLSBub2RlIGNvbnRhaW5lZCBpbiBVQ1BFCisgICAgICAgICAqIEBwYXJhbSB1Y3BlLSB1Y3BlIGNvbnRhaW5lciBub2RlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdXBkYXRlVWNwZUNoaWxkUG9zaXRpb24oY2hpbGROb2RlOkN5LkNvbGxlY3Rpb25Ob2RlcywgdWNwZTpDeS5Db2xsZWN0aW9uTm9kZXMpeworICAgICAgICAgICAgbGV0IGNoaWxkUG9zOkN5LlBvc2l0aW9uID0gY2hpbGROb2RlLnJlbGF0aXZlUG9zaXRpb24oKTsKKyAgICAgICAgICAgIGxldCB1Y3BlUG9zOkN5LlBvc2l0aW9uID0gdWNwZS5yZWxhdGl2ZVBvc2l0aW9uKCk7CisgICAgICAgICAgICBsZXQgb2Zmc2V0OkN5LlBvc2l0aW9uID0geworICAgICAgICAgICAgICAgIHg6IGNoaWxkUG9zLnggLSB1Y3BlUG9zLngsCisgICAgICAgICAgICAgICAgeTogY2hpbGRQb3MueSAtIHVjcGVQb3MueQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNoaWxkTm9kZS5kYXRhKCJ1Y3BlT2Zmc2V0Iiwgb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgUmVtb3ZlcyB1Y3BlLWNoaWxkIHByb3BlcnRpZXMgZnJvbSB0aGUgbm9kZQorICAgICAgICAgKiBAcGFyYW0gY2hpbGROb2RlLSBub2RlIGJlaW5nIHJlbW92ZWQgZnJvbSBVQ1BFCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgcmVtb3ZlVWNwZUNoaWxkRGF0YShjaGlsZE5vZGU6Q3kuQ29sbGVjdGlvbk5vZGVzKXsKKyAgICAgICAgICAgIGNoaWxkTm9kZS5yZW1vdmVEYXRhKCJ1Y3BlT2Zmc2V0Iik7CisgICAgICAgICAgICBjaGlsZE5vZGUuZGF0YSh7aXNJbnNpZGVHcm91cDogZmFsc2V9KTsKKworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgSFRNTENvb3Jkc1RvQ3l0b3NjYXBlQ29vcmRzKGN5dG9zY2FwZUJvdW5kaW5nQm94OkN5LkV4dGVudCwgbW91c2VQb3M6Q3kuUG9zaXRpb24pOkN5LlBvc2l0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiB7eDogbW91c2VQb3MueCArIGN5dG9zY2FwZUJvdW5kaW5nQm94LngxLCB5OiBtb3VzZVBvcy55ICsgY3l0b3NjYXBlQm91bmRpbmdCb3gueTF9CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgZ2V0Q3l0b3NjYXBlTm9kZVBvc2l0aW9uID0gKGN5OiBDeS5JbnN0YW5jZSwgZXZlbnQ6SURyYWdEcm9wRXZlbnQpOkN5LlBvc2l0aW9uID0+IHsKKyAgICAgICAgICAgIGxldCB0YXJnZXRPZmZzZXQgPSAkKGV2ZW50LnRhcmdldCkub2Zmc2V0KCk7CisgICAgICAgICAgICBsZXQgeCA9IGV2ZW50LnBhZ2VYIC0gdGFyZ2V0T2Zmc2V0LmxlZnQ7CisgICAgICAgICAgICBsZXQgeSA9IGV2ZW50LnBhZ2VZIC0gdGFyZ2V0T2Zmc2V0LnRvcDsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuSFRNTENvb3Jkc1RvQ3l0b3NjYXBlQ29vcmRzKGN5LmV4dGVudCgpLCB7CisgICAgICAgICAgICAgICAgeDogeCwKKyAgICAgICAgICAgICAgICB5OiB5CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworCisgICAgICAgIHB1YmxpYyBnZXROb2RlUG9zaXRpb24obm9kZTpDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKTpDeS5Qb3NpdGlvbnsKKyAgICAgICAgICAgIGxldCBub2RlUG9zaXRpb24gPSBub2RlLnJlbGF0aXZlUG9pbnQoKTsKKyAgICAgICAgICAgIGlmKG5vZGUuZGF0YSgpLmlzVWNwZSl7IC8vVUNQRXMgdXNlIGJvdW5kaW5nIGJveCBhbmQgbm90IHJlbGF0aXZlIHBvaW50LgorICAgICAgICAgICAgICAgIG5vZGVQb3NpdGlvbiA9IHt4OiBub2RlLmJvdW5kaW5nYm94KCkueDEsIHk6IG5vZGUuYm91bmRpbmdib3goKS55MX07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBub2RlUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogIHJldHVybiB0cnVlL2ZhbHNlIGlmIGZpcnN0IG5vZGUgY29udGFpbnMgaW4gc2Vjb25kIC0gdGhpcyB1c2VkIGluIG9yZGVyIHRvIHZlcmlmeSBpcyBub2RlIGlzIGVudGlyZWx5IGluc2lkZSB1Y3BlCisgICAgICAgICAqIEBwYXJhbSBmaXJzdEJveAorICAgICAgICAgKiBAcGFyYW0gc2Vjb25kQm94CisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGlzRmlyc3RCb3hDb250YWluc0luU2Vjb25kQm94KGZpcnN0Qm94OkN5LkJvdW5kaW5nQm94LCBzZWNvbmRCb3g6Q3kuQm91bmRpbmdCb3gpIHsKKworICAgICAgICAgICAgcmV0dXJuIGZpcnN0Qm94LngxID4gc2Vjb25kQm94LngxICYmIGZpcnN0Qm94LngyIDwgc2Vjb25kQm94LngyICYmIGZpcnN0Qm94LnkxID4gc2Vjb25kQm94LnkxICYmIGZpcnN0Qm94LnkyIDwgc2Vjb25kQm94LnkyOworCisgICAgICAgIH07CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgaWYgbm9kZSBub2RlIGJvdW5kcyBwb3NpdGlvbiBpcyBpbnNpZGUgYW55IHVjcGUgb24gZ3JhcGgsIGFuZCByZXR1cm4gdGhlIHVjcGUKKyAgICAgICAgICogQHBhcmFtIHtkaWFncmFtfSB0aGUgZGlhZ3JhbS4KKyAgICAgICAgICogQHBhcmFtIHtub2RlQWN0dWFsQm91bmRzfSB0aGUgYWN0dWFsIGJvdW5kIHBvc2l0aW9uIG9mIHRoZSBub2RlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB1Y3BlIGlmIGZvdW5kIGVsc2UgcmV0dXJuIG51bGwKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpc0luVWNwZSA9IChjeTogQ3kuSW5zdGFuY2UsIG5vZGVCb3VuZHM6IEN5LkJvdW5kaW5nQm94KTogQ3kuQ29sbGVjdGlvbkVsZW1lbnRzID0+IHsKKworICAgICAgICAgICAgbGV0IHVjcGVOb2RlcyA9IGN5Lm5vZGVzKCdbP2lzVWNwZV0nKS5maWx0ZXJGbigodWNwZU5vZGUpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0ZpcnN0Qm94Q29udGFpbnNJblNlY29uZEJveChub2RlQm91bmRzLCB1Y3BlTm9kZS5ib3VuZGluZ2JveCgpKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHVjcGVOb2RlczsKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBub2RlCisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBnZXRMaW5rYWJsZU5vZGVzKGN5OkN5Lkluc3RhbmNlLCBub2RlOkN5LkNvbGxlY3Rpb25GaXJzdE5vZGUpOkFycmF5PE1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZUJhc2U+eworICAgICAgICAgICAgbGV0IGNvbXBhdGlibGVOb2RlcyA9IFtdOworICAgICAgICAgICAgXy5lYWNoKGN5Lm5vZGVzKCksICh0ZW1wTm9kZSk9PnsKKyAgICAgICAgICAgICAgICBpZih0aGlzLm5vZGVMb2NhdGlvbnNDb21wYXRpYmxlKGN5LCBub2RlLCB0ZW1wTm9kZSkpeworICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlTm9kZXMucHVzaCh0ZW1wTm9kZS5kYXRhKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGNvbXBhdGlibGVOb2RlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBub2RlIGxvY2F0aW9ucyBhcmUgY29tcGF0aWJsZSBpbiByZWZlcmVuY2UgdG8gVUNQRXMuCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIG5vZGVzIGFyZSBpbiBVQ1BFIG9yIGJvdGggbm9kZXMgb3V0LCBvciBvbmUgbm9kZSBpcyBVQ1BFcGFydC4KKyAgICAgICAgICogQHBhcmFtIG5vZGUxCisgICAgICAgICAqIEBwYXJhbSBub2RlMgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIG5vZGVMb2NhdGlvbnNDb21wYXRpYmxlKGN5OkN5Lkluc3RhbmNlLCBub2RlMTpDeS5Db2xsZWN0aW9uRmlyc3ROb2RlLCBub2RlMjpDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKXsKKworICAgICAgICAgICAgbGV0IHVjcGUgPSBjeS5ub2RlcygnWz9pc1VjcGVdJyk7CisgICAgICAgICAgICBpZighdWNwZS5sZW5ndGgpeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgaWYobm9kZTEuZGF0YSgpLmlzVWNwZVBhcnQgfHwgbm9kZTIuZGF0YSgpLmlzVWNwZVBhcnQpIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICAgICAgcmV0dXJuICh0aGlzLmlzRmlyc3RCb3hDb250YWluc0luU2Vjb25kQm94KG5vZGUxLmJvdW5kaW5nYm94KCksIHVjcGUuYm91bmRpbmdib3goKSkgPT0gdGhpcy5pc0ZpcnN0Qm94Q29udGFpbnNJblNlY29uZEJveChub2RlMi5ib3VuZGluZ2JveCgpLCB1Y3BlLmJvdW5kaW5nYm94KCkpKTsKKworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0IHF0aXAgdG9vbHRpcCBvbiB0aGUgbm9kZQorICAgICAgICAgKiBAcGFyYW0gbm9kZSAtIHRoZSBub2RlIHdlIHdhbnQgdGhlIHRvb2x0aXAgdG8gYXBwbHkgb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbml0Tm9kZVRvb2x0aXAobm9kZTpDeS5Db2xsZWN0aW9uTm9kZXMpIHsKKworICAgICAgICAgICAgbGV0IG9wdHMgPSB7CisgICAgICAgICAgICAgICAgY29udGVudDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhKCduYW1lJyk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBwb3NpdGlvbjogeworICAgICAgICAgICAgICAgICAgICBteTogJ3RvcCBjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICBhdDogJ2JvdHRvbSBjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICBhZGp1c3Q6IHt4OjAsIHk6LTV9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBzdHlsZTogeworICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiAncXRpcC1kYXJrIHF0aXAtcm91bmRlZCBxdGlwLWN1c3RvbScsCisgICAgICAgICAgICAgICAgICAgIHRpcDogeworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA4CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHNob3c6IHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICdtb3VzZW92ZXInLAorICAgICAgICAgICAgICAgICAgICBkZWxheTogMTAwMAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgaGlkZToge2V2ZW50OiAnbW91c2VvdXQgbW91c2Vkb3duJ30sCisgICAgICAgICAgICAgICAgaW5jbHVkZUxhYmVsczogdHJ1ZQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKG5vZGUuZGF0YSgpLmlzVWNwZVBhcnQpeyAvL2ZpeCB0b29sdGlwIHBvc2l0aW9uaW5nIGZvciBVQ1BFLWNwcworICAgICAgICAgICAgICAgIG9wdHMucG9zaXRpb24uYWRqdXN0ID0ge3g6MCwgeToyMH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vZGUucXRpcChvcHRzKTsKKyAgICAgICAgfTsKKyAgICB9OworCisKKworICAgIENvbW1vbkdyYXBoVXRpbHMuJGluamVjdCA9IFsnTm9kZXNGYWN0b3J5JywgJ0xpbmtzRmFjdG9yeSddOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tbW9uL3N0eWxlL2NvbXBvbmVudC1pbnN0YW5jZXMtbm9kZXMtc3R5bGUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbW1vbi9zdHlsZS9jb21wb25lbnQtaW5zdGFuY2VzLW5vZGVzLXN0eWxlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzAxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbW1vbi9zdHlsZS9jb21wb25lbnQtaW5zdGFuY2VzLW5vZGVzLXN0eWxlLnRzCkBAIC0wLDAgKzEsMjU5IEBACisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDEyLzE4LzIwMTYuCisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMTIvMTMvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5HcmFwaC5VdGlscy5Db21wb25lbnRJbnRhbmNlTm9kZXNTdHlsZSB7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25HcmFwaFN0eWxlKCk6QXJyYXk8Q3kuU3R5bGVzaGVldD4geworICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnY29yZScsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnLAorICAgICAgICAgICAgICAgICAgICAnYWN0aXZlLWJnLXNpemUnOiAwLAorICAgICAgICAgICAgICAgICAgICAnc2VsZWN0aW9uLWJveC1jb2xvcic6ICdyZ2IoMCwgMTU5LCAyMTkpJywKKyAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdGlvbi1ib3gtb3BhY2l0eSc6IDAuMiwKKyAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJzogJyMwMDlmZGInLAorICAgICAgICAgICAgICAgICAgICAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnOiAxCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbm9kZScsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICdmb250LWZhbWlseSc6ICdvbW5lcy1yZWd1bGFyLHNhbnMtc2VyaWYnLAorICAgICAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogMTQsCisgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiAneWVzJywKKyAgICAgICAgICAgICAgICAgICAgJ3RleHQtZXZlbnRzJzogJ3llcycsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0LWJvcmRlci13aWR0aCc6IDE1LAorICAgICAgICAgICAgICAgICAgICAndGV4dC1ib3JkZXItY29sb3InOiBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoQ29sb3JzLk5PREVfVUNQRSwKKyAgICAgICAgICAgICAgICAgICAgJ3RleHQtbWFyZ2luLXknOiA1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RvcjogJy52Zi1ub2RlJywKKyAgICAgICAgICAgICAgICBjc3M6IHsKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAndHJhbnNwYXJlbnQnLAorICAgICAgICAgICAgICAgICAgICAnc2hhcGUnOiAncmVjdGFuZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ2RhdGEoZGlzcGxheU5hbWUpJywKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAnZGF0YShpbWcpJywKKyAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogNjUsCisgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiA2NSwKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDAsCisgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLXdpZHRoIjogNjUsCisgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWhlaWdodCI6IDY1LAorICAgICAgICAgICAgICAgICAgICAndGV4dC12YWxpZ24nOiAnYm90dG9tJywKKyAgICAgICAgICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWZpdCc6ICdjb3ZlcicsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNsaXAnOiAnbm9kZScsCisgICAgICAgICAgICAgICAgICAgICdvdmVybGF5LWNvbG9yJzogU2RjLlV0aWxzLkNvbnN0YW50cy5HcmFwaENvbG9ycy5OT0RFX0JBQ0tHUk9VTkRfQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICdvdmVybGF5LW9wYWNpdHknOiAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLnNlcnZpY2Utbm9kZScsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JywKKyAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ2RhdGEoZGlzcGxheU5hbWUpJywKKyAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6ICd5ZXMnLAorICAgICAgICAgICAgICAgICAgICAndGV4dC1ldmVudHMnOiAneWVzJywKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAnZGF0YShpbWcpJywKKyAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogNjQsCisgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiA2NCwKKyAgICAgICAgICAgICAgICAgICAgImJvcmRlci13aWR0aCI6IDAsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdib3R0b20nLAorICAgICAgICAgICAgICAgICAgICAndGV4dC1oYWxpZ24nOiAnY2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDAsCisgICAgICAgICAgICAgICAgICAgICdvdmVybGF5LWNvbG9yJzogU2RjLlV0aWxzLkNvbnN0YW50cy5HcmFwaENvbG9ycy5OT0RFX0JBQ0tHUk9VTkRfQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICdvdmVybGF5LW9wYWNpdHknOiAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RvcjogJy5jcC1ub2RlJywKKyAgICAgICAgICAgICAgICBjc3M6IHsKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDI1NSwyNTUsMjU1KScsCisgICAgICAgICAgICAgICAgICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnLAorICAgICAgICAgICAgICAgICAgICAnbGFiZWwnOiAnZGF0YShkaXNwbGF5TmFtZSknLAorICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1pbWFnZSc6ICdkYXRhKGltZyknLAorICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC13aWR0aCc6IDIxLAorICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1oZWlnaHQnOiAyMSwKKyAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogMjEsCisgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiAyMSwKKyAgICAgICAgICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ2JvdHRvbScsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1vcGFjaXR5JzogMCwKKyAgICAgICAgICAgICAgICAgICAgJ292ZXJsYXktY29sb3InOiBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoQ29sb3JzLk5PREVfQkFDS0dST1VORF9DT0xPUiwKKyAgICAgICAgICAgICAgICAgICAgJ292ZXJsYXktb3BhY2l0eSc6IDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLnZsLW5vZGUnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMjU1LDI1NSwyNTUpJywKKyAgICAgICAgICAgICAgICAgICAgJ3NoYXBlJzogJ3JlY3RhbmdsZScsCisgICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdkYXRhKGRpc3BsYXlOYW1lKScsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ2RhdGEoaW1nKScsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLXdpZHRoJzogMjEsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWhlaWdodCc6IDIxLAorICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiAyMSwKKyAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCc6IDIxLAorICAgICAgICAgICAgICAgICAgICAndGV4dC12YWxpZ24nOiAnYm90dG9tJywKKyAgICAgICAgICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLAorICAgICAgICAgICAgICAgICAgICAnb3ZlcmxheS1jb2xvcic6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuTk9ERV9CQUNLR1JPVU5EX0NPTE9SLAorICAgICAgICAgICAgICAgICAgICAnb3ZlcmxheS1vcGFjaXR5JzogMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcudWNwZS1jcCcsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogU2RjLlV0aWxzLkNvbnN0YW50cy5HcmFwaENvbG9ycy5OT0RFX1VDUEVfQ1AsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLXdpZHRoJzogMTUsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWhlaWdodCc6IDE1LAorICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiAxNSwKKyAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCc6IDE1LAorICAgICAgICAgICAgICAgICAgICAndGV4dC1oYWxpZ24nOiAnY2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgJ292ZXJsYXktb3BhY2l0eSc6IDAsCisgICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdkYXRhKGRpc3BsYXlOYW1lKScsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdkYXRhKHRleHRQb3NpdGlvbiknLAorICAgICAgICAgICAgICAgICAgICAndGV4dC1tYXJnaW4teSc6IChlbGU6Q3kuQ29sbGVjdGlvbikgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbGUuZGF0YSgndGV4dFBvc2l0aW9uJykgPT0gJ3RvcCcpPyAtNSA6IDU7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICdmb250LXNpemUnOiAxMgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcudWNwZS1ub2RlJywKKyAgICAgICAgICAgICAgICBjc3M6IHsKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtZml0JzogJ2NvdmVyJywKKyAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmctYm90dG9tJzogMCwKKyAgICAgICAgICAgICAgICAgICAgJ3BhZGRpbmctdG9wJzogMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcuc2ltcGxlLWxpbmsnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiAxLAorICAgICAgICAgICAgICAgICAgICAnbGluZS1jb2xvcic6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuQkFTRV9MSU5LLAorICAgICAgICAgICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMzYjdiOWInLAorICAgICAgICAgICAgICAgICAgICAndGFyZ2V0LWFycm93LXNoYXBlJzogJ3RyaWFuZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcicsCisgICAgICAgICAgICAgICAgICAgICdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZSc6IDMwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RvcjogJy52bC1saW5rJywKKyAgICAgICAgICAgICAgICBjc3M6IHsKKyAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogMywKKyAgICAgICAgICAgICAgICAgICAgJ2xpbmUtY29sb3InOiBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoQ29sb3JzLlZMX0xJTkssCisgICAgICAgICAgICAgICAgICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLAorICAgICAgICAgICAgICAgICAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiAzMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcudWNwZS1ob3N0LWxpbmsnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RvcjogJy5ub3QtY2VydGlmaWVkLWxpbmsnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiAxLAorICAgICAgICAgICAgICAgICAgICAnbGluZS1jb2xvcic6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuTk9UX0NFUlRJRklFRF9MSU5LLAorICAgICAgICAgICAgICAgICAgICAnY3VydmUtc3R5bGUnOiAnYmV6aWVyJywKKyAgICAgICAgICAgICAgICAgICAgJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJzogMzAsCisgICAgICAgICAgICAgICAgICAgICdsaW5lLXN0eWxlJzogJ2Rhc2hlZCcsCisgICAgICAgICAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzNiN2I5YicsCisgICAgICAgICAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctc2hhcGUnOiAndHJpYW5nbGUnCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcubm90LWNlcnRpZmllZCcsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnLAorICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1pbWFnZSc6IChlbGU6Q3kuQ29sbGVjdGlvbikgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCkuaW5pdEltYWdlKGVsZSkKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgImJvcmRlci13aWR0aCI6IDAKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25vZGU6c2VsZWN0ZWQnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLXdpZHRoIjogMiwKKyAgICAgICAgICAgICAgICAgICAgImJvcmRlci1jb2xvciI6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuTk9ERV9TRUxFQ1RFRF9CT1JERVJfQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2VkZ2U6c2VsZWN0ZWQnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnbGluZS1jb2xvcic6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuQUNUSVZFX0xJTksKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdlZGdlOmFjdGl2ZScsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICdvdmVybGF5LW9wYWNpdHknOiAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBdCisgICAgfQorCisgICAgZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2ljTm9kZUhhbmxkZSgpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHBvc2l0aW9uWDogImNlbnRlciIsCisgICAgICAgICAgICBwb3NpdGlvblk6ICJ0b3AiLAorICAgICAgICAgICAgb2Zmc2V0WDogMTUsCisgICAgICAgICAgICBvZmZzZXRZOiAtMjAsCisgICAgICAgICAgICBjb2xvcjogIiMyN2EzMzciLAorICAgICAgICAgICAgdHlwZTogImRlZmF1bHQiLAorICAgICAgICAgICAgc2luZ2xlOiBmYWxzZSwKKyAgICAgICAgICAgIG5vZGVUeXBlTmFtZXM6IFsiYmFzaWMtbm9kZSJdLAorICAgICAgICAgICAgaW1hZ2VVcmw6IFNkYy5VdGlscy5Db25zdGFudHMuSU1BR0VfUEFUSCArICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy8nICsgJ2NhbnZhc1BsdXNJY29uLnBuZycsCisgICAgICAgICAgICBsaW5lV2lkdGg6IDIsCisgICAgICAgICAgICBsaW5lU3R5bGU6ICdkYXNoZWQnCisKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRCYXNpY1NtYWxsTm9kZUhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHBvc2l0aW9uWDogImNlbnRlciIsCisgICAgICAgICAgICBwb3NpdGlvblk6ICJ0b3AiLAorICAgICAgICAgICAgb2Zmc2V0WDogMywKKyAgICAgICAgICAgIG9mZnNldFk6IC0yNSwKKyAgICAgICAgICAgIGNvbG9yOiAiIzI3YTMzNyIsCisgICAgICAgICAgICB0eXBlOiAiZGVmYXVsdCIsCisgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLAorICAgICAgICAgICAgbm9kZVR5cGVOYW1lczogWyJiYXNpYy1zbWFsbC1ub2RlIl0sCisgICAgICAgICAgICBpbWFnZVVybDogU2RjLlV0aWxzLkNvbnN0YW50cy5JTUFHRV9QQVRIICsgJy9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zLycgKyAnY2FudmFzUGx1c0ljb24ucG5nJywKKyAgICAgICAgICAgIGxpbmVXaWR0aDogMiwKKyAgICAgICAgICAgIGxpbmVTdHlsZTogJ2Rhc2hlZCcKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRVY3BlQ3BOb2RlSGFuZGxlKCkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgICAgcG9zaXRpb25YOiAiY2VudGVyIiwKKyAgICAgICAgICAgIHBvc2l0aW9uWTogImNlbnRlciIsCisgICAgICAgICAgICBvZmZzZXRYOiAtOCwKKyAgICAgICAgICAgIG9mZnNldFk6IC0xMCwKKyAgICAgICAgICAgIGNvbG9yOiAiIzI3YTMzNyIsCisgICAgICAgICAgICB0eXBlOiAiZGVmYXVsdCIsCisgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLAorICAgICAgICAgICAgbm9kZVR5cGVOYW1lczogWyJ1Y3BlLWNwLW5vZGUiXSwKKyAgICAgICAgICAgIGltYWdlVXJsOiBTZGMuVXRpbHMuQ29uc3RhbnRzLklNQUdFX1BBVEggKyAnL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvJyArICdjYW52YXNQbHVzSWNvbi5wbmcnLAorICAgICAgICAgICAgbGluZVdpZHRoOiAyLAorICAgICAgICAgICAgbGluZVN0eWxlOiAnZGFzaGVkJworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tbW9uL3N0eWxlL21vZHVsZS1ub2RlLXN0eWxlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21tb24vc3R5bGUvbW9kdWxlLW5vZGUtc3R5bGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0MzZmYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tbW9uL3N0eWxlL21vZHVsZS1ub2RlLXN0eWxlLnRzCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMS8xLzIwMTcuCisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMTIvMTgvMjAxNi4KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiAxMi8xMy8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkdyYXBoLlV0aWxzLk1vZHVsZXNOb2Rlc1N0eWxlIHsKKworICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVHcmFwaFN0eWxlKCk6QXJyYXk8Q3kuU3R5bGVzaGVldD4geworCisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcuY3ktZXhwYW5kLWNvbGxhcHNlLWNvbGxhcHNlZC1ub2RlJywKKyAgICAgICAgICAgICAgICBjc3M6IHsKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAnZGF0YShpbWcpJywKKyAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogMzQsCisgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiAzMiwKKyAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDAsCisgICAgICAgICAgICAgICAgICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnLAorICAgICAgICAgICAgICAgICAgICAnbGFiZWwnOiAnZGF0YShkaXNwbGF5TmFtZSknLAorICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogJ3llcycsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0LWV2ZW50cyc6ICd5ZXMnLAorICAgICAgICAgICAgICAgICAgICAndGV4dC12YWxpZ24nOiAnYm90dG9tJywKKyAgICAgICAgICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0LW1hcmdpbi15JzogNSwKKyAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcubW9kdWxlLW5vZGUnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsCisgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLAorICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLXdpZHRoIjogMiwKKyAgICAgICAgICAgICAgICAgICAgImJvcmRlci1jb2xvciI6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuTk9ERV9TRUxFQ1RFRF9CT1JERVJfQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICdib3JkZXItc3R5bGUnOiAnZGFzaGVkJywKKyAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ2RhdGEoZGlzcGxheU5hbWUpJywKKyAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6ICd5ZXMnLAorICAgICAgICAgICAgICAgICAgICAndGV4dC1ldmVudHMnOiAneWVzJywKKyAgICAgICAgICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ2JvdHRvbScsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAndGV4dC1tYXJnaW4teSc6IDgKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbm9kZTpzZWxlY3RlZCcsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICJib3JkZXItb3BhY2l0eSI6IDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLnNpbXBsZS1saW5rOnNlbGVjdGVkJywKKyAgICAgICAgICAgICAgICBjc3M6IHsKKyAgICAgICAgICAgICAgICAgICAgJ2xpbmUtY29sb3InOiBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoQ29sb3JzLkJBU0VfTElOSywKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLnZsLWxpbms6c2VsZWN0ZWQnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnbGluZS1jb2xvcic6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuVkxfTElOSywKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLmN5LWV4cGFuZC1jb2xsYXBzZS1jb2xsYXBzZWQtbm9kZTpzZWxlY3RlZCcsCisgICAgICAgICAgICAgICAgY3NzOiB7CisgICAgICAgICAgICAgICAgICAgICJib3JkZXItY29sb3IiOiBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoQ29sb3JzLk5PREVfU0VMRUNURURfQk9SREVSX0NPTE9SLAorICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAxLAorICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJywKKyAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLm1vZHVsZS1ub2RlOnNlbGVjdGVkJywKKyAgICAgICAgICAgICAgICBjc3M6IHsKKyAgICAgICAgICAgICAgICAgICAgImJvcmRlci1jb2xvciI6IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuTk9ERV9TRUxFQ1RFRF9CT1JERVJfQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDEKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnLmR1bW15LW5vZGUnLAorICAgICAgICAgICAgICAgIGNzczogeworICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiAyMCwKKyAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCc6IDIwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgXQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL2NvbXBvc2l0aW9uLWdyYXBoLmRpcmVjdGl2ZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvY29tcG9zaXRpb24tZ3JhcGguZGlyZWN0aXZlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOGYxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL2NvbXBvc2l0aW9uLWdyYXBoLmRpcmVjdGl2ZS50cwpAQCAtMCwwICsxLDU1NSBAQAorLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKworICAgIGltcG9ydCBDb21wb25lbnRGYWN0b3J5ID0gU2RjLlV0aWxzLkNvbXBvbmVudEZhY3Rvcnk7CisgICAgaW1wb3J0IExvYWRlclNlcnZpY2UgPSBTZGMuU2VydmljZXMuTG9hZGVyU2VydmljZTsKKyAgICBpbXBvcnQgR1JBUEhfRVZFTlRTID0gU2RjLlV0aWxzLkNvbnN0YW50cy5HUkFQSF9FVkVOVFM7CisKKyAgICBpbnRlcmZhY2UgSUNvbXBvc2l0aW9uR3JhcGhTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisKKyAgICAgICAgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgaXNWaWV3T25seTpib29sZWFuOworICAgICAgICAvLyBMaW5rIG1lbnUgLSBjcmVhdGUgbGluayBtZW51CisgICAgICAgIHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iajpNb2RlbHMuUmVsYXRpb25NZW51RGlyZWN0aXZlT2JqOworICAgICAgICBpc0xpbmtNZW51T3Blbjpib29sZWFuOworICAgICAgICBjcmVhdGVMaW5rRnJvbU1lbnU6KGNob3Nlbk1hdGNoOk1vZGVscy5NYXRjaEJhc2UsIHZsOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk9PnZvaWQ7CisKKyAgICAgICAgLy9tb2RpZnkgbGluayBtZW51IC0gZm9yIG5vdyBvbmx5IGRlbGV0ZSBtZW51CisgICAgICAgIHJlbGF0aW9uTWVudVRpbWVvdXQ6bmcuSVByb21pc2U8YW55PjsKKyAgICAgICAgbGlua01lbnVPYmplY3Q6TW9kZWxzLkxpbmtNZW51OworCisgICAgICAgIC8vbGVmdCBwYWxldHRlIGZ1bmN0aW9ucyBjYWxsYmFja3MKKyAgICAgICAgZHJvcENhbGxiYWNrKGV2ZW50OkpRdWVyeUV2ZW50T2JqZWN0LCB1aTphbnkpOnZvaWQ7CisgICAgICAgIGJlZm9yZURyb3BDYWxsYmFjayhldmVudDpJRHJhZ0Ryb3BFdmVudCk6dm9pZDsKKyAgICAgICAgdmVyaWZ5RHJvcChldmVudDpKUXVlcnlFdmVudE9iamVjdCwgdWk6YW55KTp2b2lkOworCisgICAgICAgIC8vTGlua3MgbWVudXMKKyAgICAgICAgZGVsZXRlUmVsYXRpb24obGluazpDeS5Db2xsZWN0aW9uRWRnZXMpOnZvaWQ7CisgICAgICAgIGhpZGVSZWxhdGlvbk1lbnUoKTsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25HcmFwaCBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworICAgICAgICBwcml2YXRlIF9jeTpDeS5JbnN0YW5jZTsKKyAgICAgICAgcHJpdmF0ZSBfY3VycmVudGx5Q0xpY2tlZE5vZGVQb3NpdGlvbjpDeS5Qb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSAkZG9jdW1lbnQ6SlF1ZXJ5ID0gJChkb2N1bWVudCk7CisgICAgICAgIHByaXZhdGUgZHJhZ0VsZW1lbnQ6SlF1ZXJ5OworICAgICAgICBwcml2YXRlIGRyYWdDb21wb25lbnQ6IFNkYy5Nb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRxOm5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRsb2c6bmcuSUxvZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHRpbWVvdXQ6bmcuSVRpbWVvdXRTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE5vZGVzRmFjdG9yeTpTZGMuVXRpbHMuTm9kZXNGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHM6U2RjLkdyYXBoLlV0aWxzLkNvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgR2VuZXJhbEdyYXBoVXRpbHM6R3JhcGguVXRpbHMuQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZUZhY3Rvcnk6VXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE5vZGVzR3JhcGhVdGlsczpTZGMuR3JhcGguVXRpbHMuQ29tcG9zaXRpb25HcmFwaE5vZGVzVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgZXZlbnRMaXN0ZW5lclNlcnZpY2U6U2VydmljZXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tcG9uZW50RmFjdG9yeTpDb21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIExvYWRlclNlcnZpY2U6TG9hZGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb21tb25HcmFwaFV0aWxzOkdyYXBoLlV0aWxzLkNvbW1vbkdyYXBoVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlsczpHcmFwaC5VdGlscy5NYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHJlc3RyaWN0ID0gJ0UnOworICAgICAgICB0ZW1wbGF0ZVVybCA9ICcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvY29tcG9zaXRpb24tZ3JhcGguaHRtbCc7CisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgY29tcG9uZW50OiAnPScsCisgICAgICAgICAgICBpc1ZpZXdPbmx5OiAnPScKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklDb21wb3NpdGlvbkdyYXBoU2NvcGUsIGVsOkpRdWVyeSkgPT4geworICAgICAgICAgICAgdGhpcy5sb2FkR3JhcGgoc2NvcGUsIGVsKTsKKworICAgICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsICgpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLl9jeS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKEdSQVBIX0VWRU5UUywgKGV2ZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2UudW5SZWdpc3Rlck9ic2VydmVyKGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBsb2FkR3JhcGggPSAoc2NvcGU6SUNvbXBvc2l0aW9uR3JhcGhTY29wZSwgZWw6SlF1ZXJ5KSA9PiB7CisKKworICAgICAgICAgICAgbGV0IGdyYXBoRWwgPSBlbC5maW5kKCcuc2RjLWNvbXBvc2l0aW9uLWdyYXBoLXdyYXBwZXInKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdEdyYXBoKGdyYXBoRWwsIHNjb3BlLmlzVmlld09ubHkpOworICAgICAgICAgICAgdGhpcy5pbml0R3JhcGhOb2RlcyhzY29wZS5jb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLCBzY29wZS5pc1ZpZXdPbmx5KTsKKyAgICAgICAgICAgIHRoaXMuY29tbW9uR3JhcGhVdGlscy5pbml0R3JhcGhMaW5rcyh0aGlzLl9jeSwgc2NvcGUuY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyk7CisgICAgICAgICAgICB0aGlzLmNvbW1vbkdyYXBoVXRpbHMuaW5pdFVjcGVDaGlsZHJlbih0aGlzLl9jeSk7CisgICAgICAgICAgICB0aGlzLmluaXREcm9wWm9uZShzY29wZSk7CisgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQ3l0b3NjYXBlR3JhcGhFdmVudHMoc2NvcGUpOworICAgICAgICAgICAgdGhpcy5yZWdpc3RlckN1c3RvbUV2ZW50cyhzY29wZSwgZWwpOworICAgICAgICAgICAgdGhpcy5pbml0Vmlld01vZGUoc2NvcGUuaXNWaWV3T25seSk7CisKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRHcmFwaChncmFwaEVsOkpRdWVyeSwgaXNWaWV3T25seTpib29sZWFuKSB7CisKKyAgICAgICAgICAgIHRoaXMuX2N5ID0gY3l0b3NjYXBlKHsKKyAgICAgICAgICAgICAgICBjb250YWluZXI6IGdyYXBoRWwsCisgICAgICAgICAgICAgICAgc3R5bGU6IFNkYy5HcmFwaC5VdGlscy5Db21wb25lbnRJbnRhbmNlTm9kZXNTdHlsZS5nZXRDb21wb3NpdGlvbkdyYXBoU3R5bGUoKSwKKyAgICAgICAgICAgICAgICB6b29taW5nRW5hYmxlZDogZmFsc2UsCisgICAgICAgICAgICAgICAgc2VsZWN0aW9uVHlwZTogJ3NpbmdsZScsCisgICAgICAgICAgICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICBhdXRvbG9jazogaXNWaWV3T25seSwKKyAgICAgICAgICAgICAgICBhdXRvdW5ncmFiaWZ5OiBpc1ZpZXdPbmx5CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFZpZXdNb2RlKGlzVmlld09ubHk6Ym9vbGVhbikgeworCisgICAgICAgICAgICBpZiAoaXNWaWV3T25seSkgeworICAgICAgICAgICAgICAgIC8vcmVtb3ZlIGV2ZW50IGxpc3RlbmVycworICAgICAgICAgICAgICAgIHRoaXMuX2N5Lm9mZignZHJhZycpOworICAgICAgICAgICAgICAgIHRoaXMuX2N5Lm9mZignaGFuZGxlbW91c2VvdXQnKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9jeS5vZmYoJ2hhbmRsZW1vdXNlb3ZlcicpOworICAgICAgICAgICAgICAgIHRoaXMuX2N5LmVkZ2VzKCkudW5zZWxlY3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHJlZ2lzdGVyQ3VzdG9tRXZlbnRzKHNjb3BlOklDb21wb3NpdGlvbkdyYXBoU2NvcGUsIGVsOkpRdWVyeSkgeworCisgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayhHUkFQSF9FVkVOVFMuT05fUEFMRVRURV9DT01QT05FTlRfSE9WRVJfSU4sIChjb21wb25lbnQ6TW9kZWxzLkRpc3BsYXlDb21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuaW5mbyhgY29tcG9zaXRpb24tZ3JhcGg6OnJlZ2lzdGVyRXZlbnRTZXJ2aWNlRXZlbnRzOjogcGFsZXR0ZSBob3ZlciBvbiBjb21wb25lbnQ6ICR7Y29tcG9uZW50LnVuaXF1ZUlkfWApOworCisgICAgICAgICAgICAgICAgbGV0IG5vZGVzRGF0YSA9IHRoaXMuTm9kZXNHcmFwaFV0aWxzLmdldEFsbE5vZGVzRGF0YSh0aGlzLl9jeS5ub2RlcygpKTsKKyAgICAgICAgICAgICAgICBsZXQgbm9kZXNMaW5rcyA9IHRoaXMuR2VuZXJhbEdyYXBoVXRpbHMuZ2V0QWxsQ29tcG9zaXRpb25DaUxpbmtzKHRoaXMuX2N5KTsKKworICAgICAgICAgICAgICAgIGlmICh0aGlzLkdlbmVyYWxHcmFwaFV0aWxzLmNvbXBvbmVudFJlcXVpcmVtZW50c0FuZENhcGFiaWxpdGllc0NhY2hpbmcuY29udGFpbnNLZXkoY29tcG9uZW50LnVuaXF1ZUlkKSkgeworICAgICAgICAgICAgICAgICAgICBsZXQgY2FjaGVDb21wb25lbnQgPSB0aGlzLkdlbmVyYWxHcmFwaFV0aWxzLmNvbXBvbmVudFJlcXVpcmVtZW50c0FuZENhcGFiaWxpdGllc0NhY2hpbmcuZ2V0VmFsdWUoY29tcG9uZW50LnVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkTm9kZXNEYXRhID0gdGhpcy5tYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmZpbmRCeU1hdGNoaW5nQ2FwYWJpbGl0aWVzVG9SZXF1aXJlbWVudHMoY2FjaGVDb21wb25lbnQsIG5vZGVzRGF0YSwgbm9kZXNMaW5rcyk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmhpZ2hsaWdodE1hdGNoaW5nQ29tcG9uZW50cyhmaWx0ZXJlZE5vZGVzRGF0YSwgdGhpcy5fY3kpOworICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMuZmFkZU5vbk1hY2hpbmdDb21wb25lbnRzKGZpbHRlcmVkTm9kZXNEYXRhLCBub2Rlc0RhdGEsIHRoaXMuX2N5KTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29tcG9uZW50LmNvbXBvbmVudC51cGRhdGVSZXF1aXJlbWVudHNDYXBhYmlsaXRpZXMoKQorICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY29tcG9uZW50LmNhcGFiaWxpdGllcyA9IHJlcy5jYXBhYmlsaXRpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY29tcG9uZW50LnJlcXVpcmVtZW50cyA9IHJlcy5yZXF1aXJlbWVudHM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJlZE5vZGVzRGF0YSA9IHRoaXMubWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5maW5kQnlNYXRjaGluZ0NhcGFiaWxpdGllc1RvUmVxdWlyZW1lbnRzKGNvbXBvbmVudC5jb21wb25lbnQsIG5vZGVzRGF0YSwgbm9kZXNMaW5rcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMuZmFkZU5vbk1hY2hpbmdDb21wb25lbnRzKGZpbHRlcmVkTm9kZXNEYXRhLCBub2Rlc0RhdGEsIHRoaXMuX2N5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5oaWdobGlnaHRNYXRjaGluZ0NvbXBvbmVudHMoZmlsdGVyZWROb2Rlc0RhdGEsIHRoaXMuX2N5KQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayhHUkFQSF9FVkVOVFMuT05fUEFMRVRURV9DT01QT05FTlRfSE9WRVJfT1VULCAoKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5fY3kuZW1pdCgnaGlkZWhhbmRsZXMnKTsKKyAgICAgICAgICAgICAgICB0aGlzLm1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMucmVzZXRGYWRlZE5vZGVzKHRoaXMuX2N5KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayhHUkFQSF9FVkVOVFMuT05fUEFMRVRURV9DT01QT05FTlRfRFJBR19TVEFSVCwgKGRyYWdFbGVtZW50LCBkcmFnQ29tcG9uZW50KSA9PiB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmRyYWdFbGVtZW50ID0gZHJhZ0VsZW1lbnQ7CisgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29tcG9uZW50ID0gdGhpcy5Db21wb25lbnRJbnN0YW5jZUZhY3RvcnkuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGcm9tQ29tcG9uZW50KGRyYWdDb21wb25lbnQpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlckNhbGxiYWNrKEdSQVBIX0VWRU5UUy5PTl9QQUxFVFRFX0NPTVBPTkVOVF9EUkFHX0FDVElPTiwgKGV2ZW50OklEcmFnRHJvcEV2ZW50KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5fb25Db21wb25lbnREcmFnKGV2ZW50KTsKKworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlckNhbGxiYWNrKEdSQVBIX0VWRU5UUy5PTl9DT01QT05FTlRfSU5TVEFOQ0VfTkFNRV9DSEFOR0VELCAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKSA9PiB7CisKKyAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWROb2RlID0gdGhpcy5fY3kuZ2V0RWxlbWVudEJ5SWQoY29tcG9uZW50LnVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlLm5hbWUgPSBjb21wb25lbnQubmFtZTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUuZGF0YSgnZGlzcGxheU5hbWUnLCBzZWxlY3RlZE5vZGUuZGF0YSgpLmdldERpc3BsYXlOYW1lKCkpOworCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5yZWdpc3Rlck9ic2VydmVyQ2FsbGJhY2soR1JBUEhfRVZFTlRTLk9OX0RFTEVURV9DT01QT05FTlRfSU5TVEFOQ0UsIChjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSkgPT4geworICAgICAgICAgICAgICAgIGxldCBub2RlVG9EZWxldGUgPSB0aGlzLl9jeS5nZXRFbGVtZW50QnlJZChjb21wb25lbnRJbnN0YW5jZS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgdGhpcy5Ob2Rlc0dyYXBoVXRpbHMuZGVsZXRlTm9kZSh0aGlzLl9jeSwgc2NvcGUuY29tcG9uZW50LCBub2RlVG9EZWxldGUpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlckNhbGxiYWNrKEdSQVBIX0VWRU5UUy5PTl9ERUxFVEVfTVVMVElQTEVfQ09NUE9ORU5UUywgKCkgPT4geworCisgICAgICAgICAgICAgICAgdGhpcy5fY3kuJCgnbm9kZTpzZWxlY3RlZCcpLmVhY2goKGk6bnVtYmVyLCBub2RlOkN5LkNvbGxlY3Rpb25Ob2RlcykgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLk5vZGVzR3JhcGhVdGlscy5kZWxldGVOb2RlKHRoaXMuX2N5LCBzY29wZS5jb21wb25lbnQsIG5vZGUpOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5yZWdpc3Rlck9ic2VydmVyQ2FsbGJhY2soR1JBUEhfRVZFTlRTLk9OX0RFTEVURV9FREdFLCAocmVsZWFzZUxvYWRpbmc6Ym9vbGVhbiwgbGlua3NUb0RlbGV0ZTpDeS5Db2xsZWN0aW9uRWRnZXMpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLkNvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMuZGVsZXRlTGluayh0aGlzLl9jeSwgc2NvcGUuY29tcG9uZW50LCByZWxlYXNlTG9hZGluZywgbGlua3NUb0RlbGV0ZSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5yZWdpc3Rlck9ic2VydmVyQ2FsbGJhY2soR1JBUEhfRVZFTlRTLk9OX0lOU0VSVF9OT0RFX1RPX1VDUEUsIChub2RlOkN5LkNvbGxlY3Rpb25Ob2RlcywgdWNwZTpDeS5Db2xsZWN0aW9uTm9kZXMsIHVwZGF0ZUV4aXN0aW5nTm9kZTogYm9vbGVhbikgPT4geworCisgICAgICAgICAgICAgICAgdGhpcy5jb21tb25HcmFwaFV0aWxzLmluaXRVY3BlQ2hpbGREYXRhKG5vZGUsIHVjcGUpOworICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXRlbSBpcyBhIFZMLCBhbmQgaWYgc28sIHNraXAgYWRkaW5nIHRoZSBiaW5kaW5nIHRvIHVjcGUKKyAgICAgICAgICAgICAgICBpZighKG5vZGUuZGF0YSgpIGluc3RhbmNlb2YgU2RjLk1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZVZsKSl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuQ29tcG9zaXRpb25HcmFwaExpbmtVdGlscy5jcmVhdGVWZlRvVWNwZUxpbmsoc2NvcGUuY29tcG9uZW50LCB0aGlzLl9jeSwgdWNwZS5kYXRhKCksIG5vZGUuZGF0YSgpKTsgLy9jcmVhdGUgbGluayBmcm9tIHRoZSBub2RlIHRvIHRoZSB1Y3BlCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYodXBkYXRlRXhpc3RpbmdOb2RlKXsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHZsc1BlbmRpbmdEZWxldGlvbjpDeS5Db2xsZWN0aW9uTm9kZXMgPSB0aGlzLk5vZGVzR3JhcGhVdGlscy5kZWxldGVOb2RlVkxzVXBvbk1vdmVUb09yRnJvbVVDUEUoc2NvcGUuY29tcG9uZW50LCBub2RlLmN5KCksIG5vZGUpOyAvL2RlbGV0ZSBjb25uZWN0ZWQgVkxzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgMiBsaW5rcworICAgICAgICAgICAgICAgICAgICB0aGlzLkNvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMuZGVsZXRlTGlua3NXaGVuTm9kZU1vdmVkRnJvbU9yVG9VQ1BFKHNjb3BlLmNvbXBvbmVudCwgbm9kZS5jeSgpLCBub2RlLCB2bHNQZW5kaW5nRGVsZXRpb24pOyAvL2RlbGV0ZSBhbGwgY29ubmVjdGVkIGxpbmtzIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICB0aGlzLkdlbmVyYWxHcmFwaFV0aWxzLnB1c2hVcGRhdGVDb21wb25lbnRJbnN0YW5jZUFjdGlvblRvUXVldWUoc2NvcGUuY29tcG9uZW50LCB0cnVlLCBub2RlLmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZSk7IC8vdXBkYXRlIGNvbXBvbmVudEluc3RhbmNlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5yZWdpc3Rlck9ic2VydmVyQ2FsbGJhY2soR1JBUEhfRVZFTlRTLk9OX1JFTU9WRV9OT0RFX0ZST01fVUNQRSwgKG5vZGU6Q3kuQ29sbGVjdGlvbk5vZGVzLCB1Y3BlOkN5LkNvbGxlY3Rpb25Ob2RlcykgPT4geworICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uR3JhcGhVdGlscy5yZW1vdmVVY3BlQ2hpbGREYXRhKG5vZGUpOworICAgICAgICAgICAgICAgIGxldCB2bHNQZW5kaW5nRGVsZXRpb246Q3kuQ29sbGVjdGlvbk5vZGVzID0gdGhpcy5Ob2Rlc0dyYXBoVXRpbHMuZGVsZXRlTm9kZVZMc1Vwb25Nb3ZlVG9PckZyb21VQ1BFKHNjb3BlLmNvbXBvbmVudCwgbm9kZS5jeSgpLCBub2RlKTsKKyAgICAgICAgICAgICAgICB0aGlzLkNvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMuZGVsZXRlTGlua3NXaGVuTm9kZU1vdmVkRnJvbU9yVG9VQ1BFKHNjb3BlLmNvbXBvbmVudCwgbm9kZS5jeSgpLCBub2RlLCB2bHNQZW5kaW5nRGVsZXRpb24pOyAvL2RlbGV0ZSBhbGwgY29ubmVjdGVkIGxpbmtzIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIHRoaXMuR2VuZXJhbEdyYXBoVXRpbHMucHVzaFVwZGF0ZUNvbXBvbmVudEluc3RhbmNlQWN0aW9uVG9RdWV1ZShzY29wZS5jb21wb25lbnQsIHRydWUsIG5vZGUuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlKTsgLy91cGRhdGUgY29tcG9uZW50SW5zdGFuY2UgcG9zaXRpb24KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayhHUkFQSF9FVkVOVFMuT05fVkVSU0lPTl9DSEFOR0VELCAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB0aGlzLmxvYWRHcmFwaChzY29wZSwgZWwpOworICAgICAgICAgICAgfSk7CisKKworICAgICAgICAgICAgc2NvcGUuY3JlYXRlTGlua0Zyb21NZW51ID0gKGNob3Nlbk1hdGNoOk1vZGVscy5NYXRjaEJhc2UsIHZsOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUuaXNMaW5rTWVudU9wZW4gPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHRoaXMuQ29tcG9zaXRpb25HcmFwaExpbmtVdGlscy5jcmVhdGVMaW5rRnJvbU1lbnUodGhpcy5fY3ksIGNob3Nlbk1hdGNoLCB2bCwgc2NvcGUuY29tcG9uZW50KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmhpZGVSZWxhdGlvbk1lbnUgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5jb21tb25HcmFwaFV0aWxzLnNhZmVBcHBseShzY29wZSwgKCkgPT4geworICAgICAgICAgICAgICAgICAgICBzY29wZS5saW5rTWVudU9iamVjdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHRpbWVvdXQuY2FuY2VsKHNjb3BlLnJlbGF0aW9uTWVudVRpbWVvdXQpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICBzY29wZS5kZWxldGVSZWxhdGlvbiA9IChsaW5rOkN5LkNvbGxlY3Rpb25FZGdlcykgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmhpZGVSZWxhdGlvbk1lbnUoKTsKKworICAgICAgICAgICAgICAgIC8vaWYgbXVsdGlwbGUgZWRnZXMgc2VsZWN0ZWQsIGRlbGV0ZSB0aGUgVkwgaXRzZWxmIHNvIGVkZ2VzIGdldCBkZWxldGVkIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3kuJCgnZWRnZTpzZWxlY3RlZCcpLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5Ob2Rlc0dyYXBoVXRpbHMuZGVsZXRlTm9kZSh0aGlzLl9jeSwgc2NvcGUuY29tcG9uZW50LCB0aGlzLl9jeS4kKCdub2RlOnNlbGVjdGVkJykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuQ29tcG9zaXRpb25HcmFwaExpbmtVdGlscy5kZWxldGVMaW5rKHRoaXMuX2N5LCBzY29wZS5jb21wb25lbnQsIHRydWUsIGxpbmspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgcmVnaXN0ZXJDeXRvc2NhcGVHcmFwaEV2ZW50cyhzY29wZTpJQ29tcG9zaXRpb25HcmFwaFNjb3BlKSB7CisKKyAgICAgICAgICAgIHRoaXMuX2N5Lm9uKCdhZGRlZGdlbW91c2V1cCcsIChldmVudCwgZGF0YSkgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aW9uTWVudURpcmVjdGl2ZU9iaiA9IHRoaXMuQ29tcG9zaXRpb25HcmFwaExpbmtVdGlscy5vbkxpbmtEcmF3bih0aGlzLl9jeSwgZGF0YS5zb3VyY2UsIGRhdGEudGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUucmVsYXRpb25NZW51RGlyZWN0aXZlT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmlzTGlua01lbnVPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0aGlzLl9jeS5vbigndGFwc3RhcnQnLCAnbm9kZScsIChldmVudDpDeS5FdmVudE9iamVjdCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseUNMaWNrZWROb2RlUG9zaXRpb24gPSBhbmd1bGFyLmNvcHkoZXZlbnQuY3lUYXJnZXRbMF0ucG9zaXRpb24oKSk7IC8vdXBkYXRlIG5vZGUgcG9zaXRpb24gb24gZHJhZworICAgICAgICAgICAgICAgIGlmKGV2ZW50LmN5VGFyZ2V0LmRhdGEoKS5pc1VjcGUpeworICAgICAgICAgICAgICAgICAgICB0aGlzLl9jeS5ub2RlcygnLnVjcGUtY3AnKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuY3lUYXJnZXQuc3R5bGUoJ29wYWNpdHknLCAwLjUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLl9jeS5vbignZHJhZycsICdub2RlJywgKGV2ZW50OkN5LkV2ZW50T2JqZWN0KSA9PiB7CisKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3lUYXJnZXQuZGF0YSgpLmlzRHJhZ2dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmN5VGFyZ2V0LnN0eWxlKHsnb3ZlcmxheS1vcGFjaXR5JzogMC4yNH0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5HZW5lcmFsR3JhcGhVdGlscy5pc1ZhbGlkRHJvcCh0aGlzLl9jeSwgZXZlbnQuY3lUYXJnZXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jeVRhcmdldC5zdHlsZSh7J292ZXJsYXktY29sb3InOiBVdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuTk9ERV9CQUNLR1JPVU5EX0NPTE9SfSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jeVRhcmdldC5zdHlsZSh7J292ZXJsYXktY29sb3InOiBVdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuTk9ERV9PVkVSTEFQUElOR19CQUNLR1JPVU5EX0NPTE9SfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihldmVudC5jeVRhcmdldC5kYXRhKCkuaXNVY3BlKXsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHBvcyA9IGV2ZW50LmN5VGFyZ2V0LnBvc2l0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3kubm9kZXMoJ1s/aXNJbnNpZGVHcm91cF0nKS5wb3NpdGlvbnMoKGksIG5vZGUpPT57CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHBvcy54ICsgbm9kZS5kYXRhKCJ1Y3BlT2Zmc2V0IikueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBwb3MueSArIG5vZGUuZGF0YSgidWNwZU9mZnNldCIpLnkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKworICAgICAgICAgICAgdGhpcy5fY3kub24oJ2hhbmRsZW1vdXNlb3ZlcicsIChldmVudCwgcGF5bG9hZCkgPT4geworCisgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQubm9kZS5ncmFiYmVkKCkpIHsgLy9ubyBuZWVkIHRvIGFkZCBvcGFjaXR5IHdoaWxlIHdlIGFyZSBkcmFnZ2luZyBhbmQgaG92ZXJpbmcgb3RoZSBub2RlcworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGV0IG5vZGVzRGF0YSA9IHRoaXMuTm9kZXNHcmFwaFV0aWxzLmdldEFsbE5vZGVzRGF0YSh0aGlzLl9jeS5ub2RlcygpKTsKKyAgICAgICAgICAgICAgICBsZXQgbm9kZXNMaW5rcyA9IHRoaXMuR2VuZXJhbEdyYXBoVXRpbHMuZ2V0QWxsQ29tcG9zaXRpb25DaUxpbmtzKHRoaXMuX2N5KTsKKworICAgICAgICAgICAgICAgIGxldCBsaW5rYWJsZU5vZGVzID0gdGhpcy5jb21tb25HcmFwaFV0aWxzLmdldExpbmthYmxlTm9kZXModGhpcy5fY3ksIHBheWxvYWQubm9kZSk7CisgICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkTm9kZXNEYXRhID0gdGhpcy5tYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmZpbmRCeU1hdGNoaW5nQ2FwYWJpbGl0aWVzVG9SZXF1aXJlbWVudHMocGF5bG9hZC5ub2RlLmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZSwgbGlua2FibGVOb2Rlcywgbm9kZXNMaW5rcyk7CisgICAgICAgICAgICAgICAgdGhpcy5tYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmhpZ2hsaWdodE1hdGNoaW5nQ29tcG9uZW50cyhmaWx0ZXJlZE5vZGVzRGF0YSwgdGhpcy5fY3kpOworICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5mYWRlTm9uTWFjaGluZ0NvbXBvbmVudHMoZmlsdGVyZWROb2Rlc0RhdGEsIG5vZGVzRGF0YSwgdGhpcy5fY3ksIHBheWxvYWQubm9kZS5kYXRhKCkpOworCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy5fY3kub24oJ2hhbmRsZW1vdXNlb3V0JywgKCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuX2N5LmVtaXQoJ2hpZGVoYW5kbGVzJyk7CisgICAgICAgICAgICAgICAgdGhpcy5tYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLnJlc2V0RmFkZWROb2Rlcyh0aGlzLl9jeSk7CisgICAgICAgICAgICB9KTsKKworCisgICAgICAgICAgICB0aGlzLl9jeS5vbigndGFwZW5kJywgKGV2ZW50OkN5LkV2ZW50T2JqZWN0KSA9PiB7CisKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3lUYXJnZXQgPT09IHRoaXMuX2N5KSB7IC8vT24gQmFja2dyb3VuZCBjbGlja2VkCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jeS4kKCdub2RlOnNlbGVjdGVkJykubGVuZ3RoID09PSAwKSB7IC8vaWYgdGhlIGJhY2tncm91bmQgY2xpY2sgYnV0IG5vdCBkcmFnZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLm5vdGlmeU9ic2VydmVycyhTZGMuVXRpbHMuQ29uc3RhbnRzLkdSQVBIX0VWRU5UUy5PTl9HUkFQSF9CQUNLR1JPVU5EX0NMSUNLRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmhpZGVSZWxhdGlvbk1lbnUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChldmVudC5jeVRhcmdldC5pc0VkZ2UoKSkgeyAvL09uIEVkZ2UgY2xpY2tlZAorICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuaXNWaWV3T25seSkgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB0aGlzLkNvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMuaGFuZGxlTGlua0NsaWNrKHRoaXMuX2N5LCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMub3Blbk1vZGlmeUxpbmtNZW51KHNjb3BlLCB0aGlzLkNvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMuZ2V0TW9kaWZ5TGlua01lbnUoZXZlbnQuY3lUYXJnZXRbMF0sIGV2ZW50KSwgNjAwMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZWxzZSB7IC8vT24gTm9kZSBjbGlja2VkCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N5Lm5vZGVzKCc6Z3JhYmJlZCcpLnN0eWxlKHsnb3ZlcmxheS1vcGFjaXR5JzogMH0pOworCisgICAgICAgICAgICAgICAgICAgIGxldCBpc1VjcGU6Ym9vbGVhbiA9IGV2ZW50LmN5VGFyZ2V0LmRhdGEoKS5pc1VjcGU7CisgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQb3NpdGlvbiA9IGV2ZW50LmN5VGFyZ2V0WzBdLnBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIC8vbm9kZSBwb3NpdGlvbiBjaGFuZ2VkIChkcm9wIGFmdGVyIGRyYWcgZXZlbnQpIC0gd2UgbmVlZCB0byB1cGRhdGUgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRseUNMaWNrZWROb2RlUG9zaXRpb24ueCAhPT0gbmV3UG9zaXRpb24ueCB8fCB0aGlzLl9jdXJyZW50bHlDTGlja2VkTm9kZVBvc2l0aW9uLnkgIT09IG5ld1Bvc2l0aW9uLnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2Rlc01vdmVkOkN5LkNvbGxlY3Rpb25Ob2RlcyA9IHRoaXMuX2N5LiQoJzpncmFiYmVkJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihpc1VjcGUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzTW92ZWQgPSBub2Rlc01vdmVkLmFkZCh0aGlzLl9jeS5ub2RlcygnWz9pc0luc2lkZUdyb3VwXTpmcmVlJykpOyAvLydjaGlsZCcgbm9kZXMgd2lsbCBub3QgYmUgcmVjb2duaXplZCBhcyAiZ3JhYmJlZCIgZWxlbWVudHMgd2l0aGluIGN5dG9zY2FwZS4gbWFudWFsbHkgYWRkIHRoZW0gdG8gY29sbGVjdGlvbiBvZiBub2RlcyBtb3ZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTm9kZXNHcmFwaFV0aWxzLm9uTm9kZXNQb3NpdGlvbkNoYW5nZWQodGhpcy5fY3ksIHNjb3BlLmNvbXBvbmVudCwgbm9kZXNNb3ZlZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoJ2NvbXBvc2l0aW9uLWdyYXBoOjpvbk5vZGVTZWxlY3RlZEV2ZW50OjogZmlyZWQnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseSgoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5ub3RpZnlPYnNlcnZlcnMoU2RjLlV0aWxzLkNvbnN0YW50cy5HUkFQSF9FVkVOVFMuT05fTk9ERV9TRUxFQ1RFRCwgZXZlbnQuY3lUYXJnZXQuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaXNVY3BlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N5Lm5vZGVzKCcudWNwZS1jcCcpLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmN5VGFyZ2V0LnN0eWxlKCdvcGFjaXR5JywgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLl9jeS5vbignYm94c2VsZWN0JywgJ25vZGUnLCAoZXZlbnQ6Q3kuRXZlbnRPYmplY3QpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLm5vdGlmeU9ic2VydmVycyhVdGlscy5Db25zdGFudHMuR1JBUEhfRVZFTlRTLk9OX05PREVfU0VMRUNURUQsIGV2ZW50LmN5VGFyZ2V0LmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgb3Blbk1vZGlmeUxpbmtNZW51ID0gKHNjb3BlOklDb21wb3NpdGlvbkdyYXBoU2NvcGUsIGxpbmtNZW51T2JqZWN0Ok1vZGVscy5MaW5rTWVudSwgdGltZU91dEluTWlsbGlzZWNvbmRzPzpudW1iZXIpID0+IHsKKworICAgICAgICAgICAgdGhpcy5jb21tb25HcmFwaFV0aWxzLnNhZmVBcHBseShzY29wZSwgKCkgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmxpbmtNZW51T2JqZWN0ID0gbGlua01lbnVPYmplY3Q7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgc2NvcGUucmVsYXRpb25NZW51VGltZW91dCA9IHRoaXMuJHRpbWVvdXQoKCkgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmhpZGVSZWxhdGlvbk1lbnUoKTsKKyAgICAgICAgICAgIH0sIHRpbWVPdXRJbk1pbGxpc2Vjb25kcyA/IHRpbWVPdXRJbk1pbGxpc2Vjb25kcyA6IDYwMDApOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdEdyYXBoTm9kZXMoY29tcG9uZW50SW5zdGFuY2VzOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlW10sIGlzVmlld09ubHk6Ym9vbGVhbikgeworCisgICAgICAgICAgICBpZiAoIWlzVmlld09ubHkpIHsgLy9Jbml0IG5vZGVzIGhhbmRsZSBleHRlbnNpb24gLSBlbmFibGUgZHluYW1pYyBsaW5rcworICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBoYW5kbGVzID0gbmV3IEN5dG9zY2FwZUVkZ2VFZGl0YXRpb247CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMuaW5pdCh0aGlzLl9jeSwgMTgpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLnJlZ2lzdGVySGFuZGxlKFNkYy5HcmFwaC5VdGlscy5Db21wb25lbnRJbnRhbmNlTm9kZXNTdHlsZS5nZXRCYXNpY05vZGVIYW5sZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMucmVnaXN0ZXJIYW5kbGUoU2RjLkdyYXBoLlV0aWxzLkNvbXBvbmVudEludGFuY2VOb2Rlc1N0eWxlLmdldEJhc2ljU21hbGxOb2RlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLnJlZ2lzdGVySGFuZGxlKFNkYy5HcmFwaC5VdGlscy5Db21wb25lbnRJbnRhbmNlTm9kZXNTdHlsZS5nZXRVY3BlQ3BOb2RlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0sIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfLmVhY2goY29tcG9uZW50SW5zdGFuY2VzLCAoaW5zdGFuY2UpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgY29tcG9zaXRpb25HcmFwaE5vZGU6TW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlQmFzZSA9IHRoaXMuTm9kZXNGYWN0b3J5LmNyZWF0ZU5vZGUoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uR3JhcGhVdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZU5vZGVUb0dyYXBoKHRoaXMuX2N5LCBjb21wb3NpdGlvbkdyYXBoTm9kZSk7CisgICAgICAgICAgICB9KTsKKworCisKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBpbml0RHJvcFpvbmUoc2NvcGU6SUNvbXBvc2l0aW9uR3JhcGhTY29wZSkgeworCisgICAgICAgICAgICBpZiAoc2NvcGUuaXNWaWV3T25seSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjb3BlLmRyb3BDYWxsYmFjayA9IChldmVudDpJRHJhZ0Ryb3BFdmVudCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZyhgY29tcG9zaXRpb24tZ3JhcGg6OmRyb3BDYWxsYmFjazo6IGZpcmVkYCk7CisgICAgICAgICAgICAgICAgdGhpcy5hZGROb2RlKGV2ZW50LCBzY29wZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS52ZXJpZnlEcm9wID0gKGV2ZW50OkpRdWVyeUV2ZW50T2JqZWN0KSA9PiB7CisKKyAgICAgICAgICAgICAgICBpZih0aGlzLmRyYWdFbGVtZW50Lmhhc0NsYXNzKCdyZWQnKSl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5iZWZvcmVEcm9wQ2FsbGJhY2sgPSAoZXZlbnQ6SURyYWdEcm9wRXZlbnQpOiBuZy5JUHJvbWlzZTx2b2lkPiA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGRlZmVycmVkOiBuZy5JRGVmZXJyZWQ8dm9pZD4gPSB0aGlzLiRxLmRlZmVyPHZvaWQ+KCk7CisgICAgICAgICAgICAgICAgaWYodGhpcy5kcmFnRWxlbWVudC5oYXNDbGFzcygncmVkJykpeworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIF9nZXROb2RlQkJveChldmVudDpJRHJhZ0Ryb3BFdmVudCwgcG9zaXRpb24/OkN5LlBvc2l0aW9uKSB7CisgICAgICAgICAgICBsZXQgYmJveCA9IDxDeS5Cb3VuZGluZ0JveD57fTsKKyAgICAgICAgICAgIGlmICghcG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuY29tbW9uR3JhcGhVdGlscy5nZXRDeXRvc2NhcGVOb2RlUG9zaXRpb24odGhpcy5fY3ksIGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBjdXNoaW9uV2lkdGg6bnVtYmVyID0gNDA7CisgICAgICAgICAgICBsZXQgY3VzaGlvbkhlaWdodDpudW1iZXIgPSA0MDsKKworICAgICAgICAgICAgYmJveC54MSA9IHBvc2l0aW9uLnggLSBjdXNoaW9uV2lkdGggLyAyOworICAgICAgICAgICAgYmJveC55MSA9IHBvc2l0aW9uLnkgLSBjdXNoaW9uSGVpZ2h0IC8gMjsKKyAgICAgICAgICAgIGJib3gueDIgPSBwb3NpdGlvbi54ICsgY3VzaGlvbldpZHRoIC8gMjsKKyAgICAgICAgICAgIGJib3gueTIgPSBwb3NpdGlvbi55ICsgY3VzaGlvbkhlaWdodCAvIDI7CisgICAgICAgICAgICByZXR1cm4gYmJveDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VPbkdyYXBoRnJvbUNvbXBvbmVudChmdWxsQ29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgZXZlbnQ6SURyYWdEcm9wRXZlbnQsIHNjb3BlOklDb21wb3NpdGlvbkdyYXBoU2NvcGUpIHsKKworICAgICAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlVG9DcmVhdGU6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBvbmVudEluc3RhbmNlRmFjdG9yeS5jcmVhdGVDb21wb25lbnRJbnN0YW5jZUZyb21Db21wb25lbnQoZnVsbENvbXBvbmVudCk7CisgICAgICAgICAgICBsZXQgY3l0b3NjYXBlUG9zaXRpb246Q3kuUG9zaXRpb24gPSB0aGlzLmNvbW1vbkdyYXBoVXRpbHMuZ2V0Q3l0b3NjYXBlTm9kZVBvc2l0aW9uKHRoaXMuX2N5LCBldmVudCk7CisKKyAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlVG9DcmVhdGUucG9zWCA9IGN5dG9zY2FwZVBvc2l0aW9uLng7CisgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZVRvQ3JlYXRlLnBvc1kgPSBjeXRvc2NhcGVQb3NpdGlvbi55OworCisKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZENyZWF0aW5nSW5zdGFuY2U6KGVycm9yOmFueSkgPT4gdm9pZCA9IChlcnJvcjphbnkpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLkxvYWRlclNlcnZpY2UuaGlkZUxvYWRlcignY29tcG9zaXRpb24tZ3JhcGgnKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vb24gc3VjY2VzcyAtIHVwZGF0ZSBub2RlIGRhdGEKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3NDcmVhdGluZ0luc3RhbmNlID0gKGNyZWF0ZUluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIHRoaXMuTG9hZGVyU2VydmljZS5oaWRlTG9hZGVyKCdjb21wb3NpdGlvbi1ncmFwaCcpOworCisgICAgICAgICAgICAgICAgY3JlYXRlSW5zdGFuY2UubmFtZSA9IHRoaXMuJGZpbHRlcigncmVzb3VyY2VOYW1lJykoY3JlYXRlSW5zdGFuY2UubmFtZSk7CisgICAgICAgICAgICAgICAgY3JlYXRlSW5zdGFuY2UucmVxdWlyZW1lbnRzID0gbmV3IE1vZGVscy5SZXF1aXJlbWVudHNHcm91cChmdWxsQ29tcG9uZW50LnJlcXVpcmVtZW50cyk7CisgICAgICAgICAgICAgICAgY3JlYXRlSW5zdGFuY2UuY2FwYWJpbGl0aWVzID0gbmV3IE1vZGVscy5DYXBhYmlsaXRpZXNHcm91cChmdWxsQ29tcG9uZW50LmNhcGFiaWxpdGllcyk7CisgICAgICAgICAgICAgICAgY3JlYXRlSW5zdGFuY2UuY29tcG9uZW50VmVyc2lvbiA9IGZ1bGxDb21wb25lbnQudmVyc2lvbjsKKyAgICAgICAgICAgICAgICBjcmVhdGVJbnN0YW5jZS5pY29uID0gZnVsbENvbXBvbmVudC5pY29uOworICAgICAgICAgICAgICAgIGNyZWF0ZUluc3RhbmNlLnNldEluc3RhbmNlUkMoKTsKKworICAgICAgICAgICAgICAgIGxldCBuZXdOb2RlOk1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZUJhc2UgPSB0aGlzLk5vZGVzRmFjdG9yeS5jcmVhdGVOb2RlKGNyZWF0ZUluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBsZXQgY3lOb2RlOkN5LkNvbGxlY3Rpb25Ob2RlcyA9IHRoaXMuY29tbW9uR3JhcGhVdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZU5vZGVUb0dyYXBoKHRoaXMuX2N5LCBuZXdOb2RlKTsKKworICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgbm9kZSB3YXMgZHJvcHBlZCBpbnRvIGEgVUNQRQorICAgICAgICAgICAgICAgIGxldCB1Y3BlOkN5LkNvbGxlY3Rpb25FbGVtZW50cyAgPSB0aGlzLmNvbW1vbkdyYXBoVXRpbHMuaXNJblVjcGUodGhpcy5fY3ksIGN5Tm9kZS5ib3VuZGluZ2JveCgpKTsKKyAgICAgICAgICAgICAgICBpZiAodWNwZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFV0aWxzLkNvbnN0YW50cy5HUkFQSF9FVkVOVFMuT05fSU5TRVJUX05PREVfVE9fVUNQRSwgY3lOb2RlLCB1Y3BlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBvbiBzZXJ2ZXIKKyAgICAgICAgICAgIHRoaXMuR2VuZXJhbEdyYXBoVXRpbHMuZ2V0R3JhcGhVdGlsc1NlcnZlclVwZGF0ZVF1ZXVlKCkuYWRkQmxvY2tpbmdVSUFjdGlvbigoKSA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUuY29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlVG9DcmVhdGUpLnRoZW4ob25TdWNjZXNzQ3JlYXRpbmdJbnN0YW5jZSwgb25GYWlsZWRDcmVhdGluZ0luc3RhbmNlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBfb25Db21wb25lbnREcmFnKGV2ZW50OklEcmFnRHJvcEV2ZW50KSB7CisKKyAgICAgICAgICAgIGlmKGV2ZW50LmNsaWVudFggPCBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoVUlPYmplY3RzLkRJQUdSQU1fUEFMRVRURV9XSURUSF9PRkZTRVQgfHwgZXZlbnQuY2xpZW50WSA8IFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhVSU9iamVjdHMuRElBR1JBTV9IRUFERVJfT0ZGU0VUKXsgLy9ob3ZlcmluZyBvdmVyIHBhbGV0dGUuIERvbnQgYm90aGVyIGNvbXB1dGluZyB2YWxpZGl0eSBvZiBkcm9wCisgICAgICAgICAgICAgICAgdGhpcy5kcmFnRWxlbWVudC5yZW1vdmVDbGFzcygncmVkJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgb2Zmc2V0UG9zaXRpb24gPSB7eDogZXZlbnQuY2xpZW50WCAtIFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhVSU9iamVjdHMuRElBR1JBTV9QQUxFVFRFX1dJRFRIX09GRlNFVCwgeTogZXZlbnQuY2xpZW50WSAtIFNkYy5VdGlscy5Db25zdGFudHMuR3JhcGhVSU9iamVjdHMuRElBR1JBTV9IRUFERVJfT0ZGU0VUfQorICAgICAgICAgICAgbGV0IGJib3ggPSB0aGlzLl9nZXROb2RlQkJveChldmVudCwgb2Zmc2V0UG9zaXRpb24pOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodGhpcy5HZW5lcmFsR3JhcGhVdGlscy5pc1BhbGV0dGVEcm9wVmFsaWQodGhpcy5fY3ksIGJib3gsIHRoaXMuZHJhZ0NvbXBvbmVudCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmRyYWdFbGVtZW50LnJlbW92ZUNsYXNzKCdyZWQnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5kcmFnRWxlbWVudC5hZGRDbGFzcygncmVkJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFkZE5vZGUoZXZlbnQ6SURyYWdEcm9wRXZlbnQsIHNjb3BlOklDb21wb3NpdGlvbkdyYXBoU2NvcGUpIHsKKyAgICAgICAgICAgIHRoaXMuTG9hZGVyU2VydmljZS5zaG93TG9hZGVyKCdjb21wb3NpdGlvbi1ncmFwaCcpOworCisgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoJ2NvbXBvc2l0aW9uLWdyYXBoOjphZGROb2RlOjogZmlyZWQnKTsKKyAgICAgICAgICAgIGxldCBkcmFnZ2VkQ29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IGV2ZW50LmRhdGFUcmFuc2Zlci5jb21wb25lbnQ7CisKKyAgICAgICAgICAgIGlmICh0aGlzLkdlbmVyYWxHcmFwaFV0aWxzLmNvbXBvbmVudFJlcXVpcmVtZW50c0FuZENhcGFiaWxpdGllc0NhY2hpbmcuY29udGFpbnNLZXkoZHJhZ2dlZENvbXBvbmVudC51bmlxdWVJZCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoJ2NvbXBvc2l0aW9uLWdyYXBoOjphZGROb2RlOjogY2FwYWJpbGl0aWVzIGZvdW5kIGluIGNhY2hlLCBjcmVhdGluZyBjb21wb25lbnQnKTsKKyAgICAgICAgICAgICAgICBsZXQgZnVsbENvbXBvbmVudCA9IHRoaXMuR2VuZXJhbEdyYXBoVXRpbHMuY29tcG9uZW50UmVxdWlyZW1lbnRzQW5kQ2FwYWJpbGl0aWVzQ2FjaGluZy5nZXRWYWx1ZShkcmFnZ2VkQ29tcG9uZW50LnVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlT25HcmFwaEZyb21Db21wb25lbnQoZnVsbENvbXBvbmVudCwgZXZlbnQsIHNjb3BlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygnY29tcG9zaXRpb24tZ3JhcGg6OmFkZE5vZGU6OiBjYXBhYmlsaXRpZXMgbm90IGZvdW5kLCByZXF1ZXN0aW5nIGZyb20gc2VydmVyJyk7CisgICAgICAgICAgICB0aGlzLkNvbXBvbmVudEZhY3RvcnkuZ2V0Q29tcG9uZW50RnJvbVNlcnZlcihkcmFnZ2VkQ29tcG9uZW50LmdldENvbXBvbmVudFN1YlR5cGUoKSwgZHJhZ2dlZENvbXBvbmVudC51bmlxdWVJZCkKKyAgICAgICAgICAgICAgICAudGhlbigoZnVsbENvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZU9uR3JhcGhGcm9tQ29tcG9uZW50KGZ1bGxDb21wb25lbnQsIGV2ZW50LCBzY29wZSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZXNGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua3NHcmFwaFV0aWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbEdyYXBoVXRpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRJbnN0YW5jZUZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2Rlc0dyYXBoVXRpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudExpc3RlbmVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uR3JhcGhVdGlscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMpID0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRpb25HcmFwaCgKKyAgICAgICAgICAgICAgICAkcSwKKyAgICAgICAgICAgICAgICAkZmlsdGVyLAorICAgICAgICAgICAgICAgICRsb2csCisgICAgICAgICAgICAgICAgJHRpbWVvdXQsCisgICAgICAgICAgICAgICAgTm9kZXNGYWN0b3J5LAorICAgICAgICAgICAgICAgIExpbmtzR3JhcGhVdGlscywKKyAgICAgICAgICAgICAgICBHZW5lcmFsR3JhcGhVdGlscywKKyAgICAgICAgICAgICAgICBDb21wb25lbnRJbnN0YW5jZUZhY3RvcnksCisgICAgICAgICAgICAgICAgTm9kZXNHcmFwaFV0aWxzLAorICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgIENvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgTG9hZGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICBDb21tb25HcmFwaFV0aWxzLAorICAgICAgICAgICAgICAgIE1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgQ29tcG9zaXRpb25HcmFwaC5mYWN0b3J5LiRpbmplY3QgPSBbCisgICAgICAgICckcScsCisgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgJyRsb2cnLAorICAgICAgICAnJHRpbWVvdXQnLAorICAgICAgICAnTm9kZXNGYWN0b3J5JywKKyAgICAgICAgJ0NvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMnLAorICAgICAgICAnQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscycsCisgICAgICAgICdDb21wb25lbnRJbnN0YW5jZUZhY3RvcnknLAorICAgICAgICAnQ29tcG9zaXRpb25HcmFwaE5vZGVzVXRpbHMnLAorICAgICAgICAnRXZlbnRMaXN0ZW5lclNlcnZpY2UnLAorICAgICAgICAnQ29tcG9uZW50RmFjdG9yeScsCisgICAgICAgICdMb2FkZXJTZXJ2aWNlJywKKyAgICAgICAgJ0NvbW1vbkdyYXBoVXRpbHMnLAorICAgICAgICAnTWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscycKKyAgICBdOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvY29tcG9zaXRpb24tZ3JhcGguaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvY29tcG9zaXRpb24tZ3JhcGguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJjNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC9jb21wb3NpdGlvbi1ncmFwaC5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzxsb2FkZXIgZGlzcGxheT0iaXNMb2FkaW5nIiBsb2FkZXItdHlwZT0iY29tcG9zaXRpb24tZ3JhcGgiPjwvbG9hZGVyPgorPGRpdiBjbGFzcz0ic2RjLWNvbXBvc2l0aW9uLWdyYXBoLXdyYXBwZXIiIG5nLWNsYXNzPSJ7J3ZpZXctb25seSc6aXNWaWV3T25seX0iCisgICAgIGRhdGEtZHJvcD0idHJ1ZSIKKyAgICAgZGF0YS1qcXlvdWktb3B0aW9ucz0ie2FjY2VwdDogdmVyaWZ5RHJvcH0iCisgICAgIGRhdGEtanF5b3VpLWRyb3BwYWJsZT0ie29uRHJvcDonZHJvcENhbGxiYWNrJywgYmVmb3JlRHJvcDogJ2JlZm9yZURyb3BDYWxsYmFjayd9Ij4KKzwvZGl2PgorCis8cmVsYXRpb24tbWVudSByZWxhdGlvbi1tZW51LWRpcmVjdGl2ZS1vYmo9InJlbGF0aW9uTWVudURpcmVjdGl2ZU9iaiIgaXMtbGluay1tZW51LW9wZW49ImlzTGlua01lbnVPcGVuIgorICAgICAgICAgICAgICAgY3JlYXRlLXJlbGF0aW9uPSJjcmVhdGVMaW5rRnJvbU1lbnUiIGNhbmNlbD0iY2FuY2VsUmVsYXRpb25NZW51KCkiPjwvcmVsYXRpb24tbWVudT4KKworCis8ZGl2IGNsYXNzPSJ3LXNkYy1jYW52YXMtbWVudSIKKyAgICAgZGF0YS1uZy1zaG93PSJsaW5rTWVudU9iamVjdCIgbmctc3R5bGU9IntsZWZ0OiBsaW5rTWVudU9iamVjdC5wb3NpdGlvbi54LCB0b3A6IGxpbmtNZW51T2JqZWN0LnBvc2l0aW9uLnl9IgorICAgICBpZD0icmVsYXRpb25NZW51Ij4KKworICAgIDxkaXYgY2xhc3M9Inctc2RjLWNhbnZhcy1tZW51LWNvbnRlbnQgaGFuZCIgZGF0YS1uZy1jbGljaz0iZGVsZXRlUmVsYXRpb24obGlua01lbnVPYmplY3QubGluaykiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1jYW52YXMtbWVudS1jb250ZW50LWRlbGV0ZS1idXR0b24iPjwvZGl2PgorICAgICAgICA8IS0te3tyZWxhdGlvbkNvbXBvbmVudC5kYXRhLnJlbGF0aW9uLnJlbGF0aW9uc2hpcHNbMF0ucmVsYXRpb25zaGlwLnR5cGUgfCByZWxhdGlvbk5hbWUgfX0tLT4KKyAgICAgICAgRGVsZXRlCisgICAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC9jb21wb3NpdGlvbi1ncmFwaC5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC9jb21wb3NpdGlvbi1ncmFwaC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTk5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL2NvbXBvc2l0aW9uLWdyYXBoLmxlc3MKQEAgLTAsMCArMSwxNCBAQAorY29tcG9zaXRpb24tZ3JhcGggeworICBkaXNwbGF5OiBibG9jazsKKworICAgaGVpZ2h0OjEwMCU7CisgICB3aWR0aDogMTAwJTsKKyAgLnNkYy1jb21wb3NpdGlvbi1ncmFwaC13cmFwcGVyeworICAgIGhlaWdodDoxMDAlOworICAgIHdpZHRoOiAxMDAlOworICB9CisKKyAgJi52aWV3LW9ubHl7CisgICAgYmFja2dyb3VuZC1jb2xvcjpyZ2IoMjQ4LCAyNDgsIDI0OCk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL3V0aWxzL2NvbXBvc2l0aW9uLWdyYXBoLWdlbmVyYWwtdXRpbHMudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL3V0aWxzL2NvbXBvc2l0aW9uLWdyYXBoLWdlbmVyYWwtdXRpbHMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1YTI0MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvdXRpbHMvY29tcG9zaXRpb24tZ3JhcGgtZ2VuZXJhbC11dGlscy50cwpAQCAtMCwwICsxLDI0MyBAQAorLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5HcmFwaC5VdGlscyB7CisKKyAgICBpbXBvcnQgRGljdGlvbmFyeSA9IFNkYy5VdGlscy5EaWN0aW9uYXJ5OworCisgICAgZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uR3JhcGhHZW5lcmFsVXRpbHMgeworCisgICAgICAgIHB1YmxpYyBjb21wb25lbnRSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXNDYWNoaW5nID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+KCk7CisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZ3JhcGhVdGlsc1VwZGF0ZVF1ZXVlOiBTZGMuVXRpbHMuRnVuY3Rpb25zLlF1ZXVlVXRpbHM7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkcTogbmcuSVFTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIExvYWRlclNlcnZpY2U6IFNlcnZpY2VzLkxvYWRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY29tbW9uR3JhcGhVdGlsczogU2RjLkdyYXBoLlV0aWxzLkNvbW1vbkdyYXBoVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlsczogR3JhcGguVXRpbHMuTWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscykgeworICAgICAgICAgICAgQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscy5ncmFwaFV0aWxzVXBkYXRlUXVldWUgPSBuZXcgU2RjLlV0aWxzLkZ1bmN0aW9ucy5RdWV1ZVV0aWxzKHRoaXMuJHEpOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBvZmZzZXQgZm9yIHRoZSBsaW5rIGNyZWF0aW9uIE1lbnUKKyAgICAgICAgICogQHBhcmFtIHBvaW50CisgICAgICAgICAqIEByZXR1cm5zIHtDeS5Qb3NpdGlvbn0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjYWxjTWVudU9mZnNldDogRnVuY3Rpb24gPSAocG9pbnQ6IEN5LlBvc2l0aW9uKTogQ3kuUG9zaXRpb24gPT4geworICAgICAgICAgICAgcG9pbnQueCA9IHBvaW50LnggKyA2MDsKKyAgICAgICAgICAgIHBvaW50LnkgPSBwb2ludC55ICsgMTA1OworICAgICAgICAgICAgcmV0dXJuIHBvaW50OworICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgcmV0dXJuIHRoZSB0b3AgbGVmdCBwb3NpdGlvbiBvZiB0aGUgbGluayBtZW51CisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0Tm9kZVBvc2l0aW9uCisgICAgICAgICAqIEByZXR1cm5zIHtDeS5Qb3NpdGlvbn0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBnZXRMaW5rTWVudVBvc2l0aW9uID0gKGN5OiBDeS5JbnN0YW5jZSwgdGFyZ2V0Tm9kZVBvc2l0aW9uOiBDeS5Qb3NpdGlvbikgPT4geworICAgICAgICAgICAgbGV0IG1lbnVQb3NpdGlvbjogQ3kuUG9zaXRpb24gPSB0aGlzLmNhbGNNZW51T2Zmc2V0KHRhcmdldE5vZGVQb3NpdGlvbik7IC8vZ2V0IHRoZSBsaW5rIG1pZCBwb2ludAorICAgICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0IDwgbWVudVBvc2l0aW9uLnkgKyBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoVUlPYmplY3RzLkxJTktfTUVOVV9IRUlHSFQgKyAkKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NkYy1jb21wb3NpdGlvbi1ncmFwaC13cmFwcGVyJykpLm9mZnNldCgpLnRvcCkgeyAvLyBpZiBwb3NpdGlvbiBtZW51IGlzIG92ZXJmbG93IGJvdHRvbQorICAgICAgICAgICAgICAgIG1lbnVQb3NpdGlvbi55ID0gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgLSBTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoVUlPYmplY3RzLlRPUF9IRUFERVJfSEVJR0hUIC0gU2RjLlV0aWxzLkNvbnN0YW50cy5HcmFwaFVJT2JqZWN0cy5MSU5LX01FTlVfSEVJR0hUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1lbnVQb3NpdGlvbjsKKyAgICAgICAgfTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiB3aWxsIHJldHVybiB0cnVlL2ZhbHNlIGlmIHR3byBub2RlcyBvdmVybGFwcGluZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZ3JhcGggbm9kZQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpc05vZGVzT3ZlcmxhcHBpbmcobm9kZTogQ3kuQ29sbGVjdGlvbkZpcnN0Tm9kZSwgZHJhZ2dlZE5vZGU6IEN5LkNvbGxlY3Rpb25GaXJzdE5vZGUpOiBib29sZWFuIHsKKworICAgICAgICAgICAgbGV0IG5vZGVCb3VuZGluZ0JveDogQ3kuQm91bmRpbmdCb3ggPSBub2RlLnJlbmRlcmVkQm91bmRpbmdCb3goKTsKKyAgICAgICAgICAgIGxldCBzZWNvbmROb2RlQm91bmRpbmdCb3g6IEN5LkJvdW5kaW5nQm94ID0gZHJhZ2dlZE5vZGUucmVuZGVyZWRCb3VuZGluZ0JveCgpOworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0JCb3hPdmVybGFwcGluZyhub2RlQm91bmRpbmdCb3gsIHNlY29uZE5vZGVCb3VuZGluZ0JveCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGJvdW5kaW5nIGJveGVzIG9mIHR3byBub2RlcyBhcmUgb3ZlcmxhcHBpbmcgb24gYW55IHNpZGUKKyAgICAgICAgICogQHBhcmFtIG5vZGVPbmVCQm94CisgICAgICAgICAqIEBwYXJhbSBub2RlVHdvQkJveAorICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaXNCQm94T3ZlcmxhcHBpbmcobm9kZU9uZUJCb3g6IEN5LkJvdW5kaW5nQm94LCBub2RlVHdvQkJveDogQ3kuQm91bmRpbmdCb3gpIHsKKyAgICAgICAgICAgIHJldHVybiAoKChub2RlT25lQkJveC54MSA8IG5vZGVUd29CQm94LngxICYmIG5vZGVPbmVCQm94LngyID4gbm9kZVR3b0JCb3gueDEpIHx8CisgICAgICAgICAgICAobm9kZU9uZUJCb3gueDEgPCBub2RlVHdvQkJveC54MiAmJiBub2RlT25lQkJveC54MiA+IG5vZGVUd29CQm94LngyKSB8fAorICAgICAgICAgICAgKG5vZGVUd29CQm94LngxIDwgbm9kZU9uZUJCb3gueDEgJiYgbm9kZVR3b0JCb3gueDIgPiBub2RlT25lQkJveC54MikpICYmCisgICAgICAgICAgICAoKG5vZGVPbmVCQm94LnkxIDwgbm9kZVR3b0JCb3gueTEgJiYgbm9kZU9uZUJCb3gueTIgPiBub2RlVHdvQkJveC55MSkgfHwKKyAgICAgICAgICAgIChub2RlT25lQkJveC55MSA8IG5vZGVUd29CQm94LnkyICYmIG5vZGVPbmVCQm94LnkyID4gbm9kZVR3b0JCb3gueTIpIHx8CisgICAgICAgICAgICAobm9kZVR3b0JCb3gueTEgPCBub2RlT25lQkJveC55MSAmJiBub2RlVHdvQkJveC55MiA+IG5vZGVPbmVCQm94LnkyKSkpCisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBhIHNwZWNpZmljIGNvbXBvbmVudCBpbnN0YW5jZSBjYW4gYmUgaG9zdGVkIG9uIHRoZSBVQ1BFIGluc3RhbmNlCisgICAgICAgICAqIEBwYXJhbSBjeSAtIEN5dG9zY2FwZSBpbnN0YW5jZQorICAgICAgICAgKiBAcGFyYW0gZnJvbVVjcGVJbnN0YW5jZQorICAgICAgICAgKiBAcGFyYW0gdG9Db21wb25lbnRJbnN0YW5jZQorICAgICAgICAgKiBAcmV0dXJucyB7TW9kZWxzLk1hdGNoUmVxVG9DYXBhYmlsaXR5fQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGNhbkJlSG9zdGVkT24oY3k6IEN5Lkluc3RhbmNlLCBmcm9tVWNwZUluc3RhbmNlOiBNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSwgdG9Db21wb25lbnRJbnN0YW5jZTogTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOiBNb2RlbHMuTWF0Y2hSZXFUb0NhcGFiaWxpdHkgeworCisgICAgICAgICAgICBsZXQgbWF0Y2hlczogQXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4gPSB0aGlzLm1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMuZ2V0TWF0Y2hlZFJlcXVpcmVtZW50c0NhcGFiaWxpdGllcyhmcm9tVWNwZUluc3RhbmNlLCB0b0NvbXBvbmVudEluc3RhbmNlLCB0aGlzLmdldEFsbENvbXBvc2l0aW9uQ2lMaW5rcyhjeSkpOworICAgICAgICAgICAgbGV0IGhvc3RlZE9uTWF0Y2g6IE1vZGVscy5NYXRjaEJhc2UgPSBfLmZpbmQobWF0Y2hlcywgKG1hdGNoOiBNb2RlbHMuTWF0Y2hSZXFUb0NhcGFiaWxpdHkpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2gucmVxdWlyZW1lbnQuY2FwYWJpbGl0eS50b0xvd2VyQ2FzZSgpID09PSAndG9zY2EuY2FwYWJpbGl0aWVzLmNvbnRhaW5lcic7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIDxNb2RlbHMuTWF0Y2hSZXFUb0NhcGFiaWxpdHk+aG9zdGVkT25NYXRjaDsKKyAgICAgICAgfTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBub2RlIGNhbiBiZSBkcm9wcGVkIGludG8gVUNQRQorICAgICAgICAgKiBAcGFyYW0gY3kKKyAgICAgICAgICogQHBhcmFtIG5vZGVUb0luc2VydAorICAgICAgICAgKiBAcGFyYW0gdWNwZU5vZGUKKyAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGlzVmFsaWREcm9wSW5zaWRlVUNQRShjeTogQ3kuSW5zdGFuY2UsIG5vZGVUb0luc2VydDogTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UsIHVjcGVOb2RlOiAgTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOiBib29sZWFuIHsKKworICAgICAgICAgICAgICAgIGxldCBob3N0ZWRPbk1hdGNoOiBNb2RlbHMuTWF0Y2hSZXFUb0NhcGFiaWxpdHkgPSB0aGlzLmNhbkJlSG9zdGVkT24oY3ksIHVjcGVOb2RlLCBub2RlVG9JbnNlcnQpOworICAgICAgICAgICAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSAhYW5ndWxhci5pc1VuZGVmaW5lZChob3N0ZWRPbk1hdGNoKSB8fCBub2RlVG9JbnNlcnQuaXNWbCgpOyAvL2dyb3VwIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgICAgIH07CisKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIGRyb3BzIGZyb20gcGFsZXR0ZSwgY2hlY2tzIHdoZXRoZXIgdGhlIG5vZGUgY2FuIGJlIGRyb3BwZWQuIElmIG5vZGUgaXMgYmVpbmcgaGVsZCBvdmVyIGFub3RoZXIgbm9kZSwgY2hlY2sgaWYgY2FwYWJsZSBvZiBob3N0aW5nCisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKiBAcGFyYW0gcHNldWRvTm9kZUJCb3gKKyAgICAgICAgICogQHBhcmFtIHBhbGV0dGVDb21wb25lbnRJbnN0YW5jZQorICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpc1BhbGV0dGVEcm9wVmFsaWQoY3k6IEN5Lkluc3RhbmNlLCBwc2V1ZG9Ob2RlQkJveDogQ3kuQm91bmRpbmdCb3gsIHBhbGV0dGVDb21wb25lbnRJbnN0YW5jZTpTZGMuTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpIHsKKworICAgICAgICAgICAgbGV0IGNvbXBvbmVudElzVUNQRTpib29sZWFuID0gKHBhbGV0dGVDb21wb25lbnRJbnN0YW5jZS5jYXBhYmlsaXRpZXMgJiYgcGFsZXR0ZUNvbXBvbmVudEluc3RhbmNlLmNhcGFiaWxpdGllc1sndG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciddICYmIHBhbGV0dGVDb21wb25lbnRJbnN0YW5jZS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigndWNwZScpID4gLTEpOworCisgICAgICAgICAgICBpZihjb21wb25lbnRJc1VDUEUgJiYgY3kubm9kZXMoJ1s/aXNVY3BlXScpLmxlbmd0aCA+IDApICB7IC8vc2Vjb25kIFVDUEUgbm90IGFsbG93ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBpbGxlZ2FsT3ZlcmxhcHBpbmdOb2RlcyA9IF8uZmlsdGVyKGN5Lm5vZGVzKCJbaXNTZGNFbGVtZW50XSIpLCAoZ3JhcGhOb2RlOiBDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKSA9PiB7CisKKyAgICAgICAgICAgICAgICBpZih0aGlzLmlzQkJveE92ZXJsYXBwaW5nKHBzZXVkb05vZGVCQm94LCBncmFwaE5vZGUucmVuZGVyZWRCb3VuZGluZ0JveCgpKSl7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50SXNVQ1BFICYmIGdyYXBoTm9kZS5kYXRhKCkuaXNVY3BlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNWYWxpZERyb3BJbnNpZGVVQ1BFKGN5LCBwYWxldHRlQ29tcG9uZW50SW5zdGFuY2UsIGdyYXBoTm9kZS5kYXRhKCkuY29tcG9uZW50SW5zdGFuY2UpOyAvL2lmIHRoaXMgaXMgdmFsaWQgaW5zZXJ0IGludG8gdWNwZSwgd2UgcmV0dXJuIGZhbHNlIC0gbm8gaWxsZWdhbCBvdmVybGFwcGluZyBub2RlcworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gaWxsZWdhbE92ZXJsYXBwaW5nTm9kZXMubGVuZ3RoID09PSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHdpbGwgcmV0dXJuIHRydWUvZmFsc2UgaWYgYSBkcm9wIG9mIGEgc2luZ2xlIG5vZGUgaXMgdmFsaWQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGdyYXBoIG5vZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpc1ZhbGlkRHJvcChjeTogQ3kuSW5zdGFuY2UsIGRyYWdnZWROb2RlOiBDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKTogYm9vbGVhbiB7CisKKyAgICAgICAgICAgIGxldCBpbGxlZ2FsT3ZlcmxhcHBpbmdOb2RlcyA9IF8uZmlsdGVyKGN5Lm5vZGVzKCJbaXNTZGNFbGVtZW50XSIpLCAoZ3JhcGhOb2RlOiBDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKSA9PiB7IC8vYWxsIHNkYyBub2RlcywgcmVtb3ZpbmcgY2hpbGQgbm9kZXMgKGNoaWxkZSBub2RlIGFsbHdheXMgY29sbGFwcworCisgICAgICAgICAgICAgICAgaWYgKGRyYWdnZWROb2RlLmRhdGEoKS5pc1VjcGUgJiYgKGdyYXBoTm9kZS5pc0NoaWxkKCkgfHwgZ3JhcGhOb2RlLmRhdGEoKS5pc0luc2lkZUdyb3VwKSkgeyAvL3VjcGUgY3BzIGFsd2F5cyBpbnNpZGUgdWNwZSwgbm8gb3ZlcmxhcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihkcmFnZ2VkTm9kZS5kYXRhKCkuaXNJbnNpZGVHcm91cCAmJiAoIWRyYWdnZWROb2RlLmFjdGl2ZSgpIHx8IGdyYXBoTm9kZS5kYXRhKCkuaXNVY3BlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFkcmFnZ2VkTm9kZS5kYXRhKCkuaXNVY3BlICYmICEoZHJhZ2dlZE5vZGUuZGF0YSgpIGluc3RhbmNlb2YgU2RjLk1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZVVjcGVDcCkgJiYgZ3JhcGhOb2RlLmRhdGEoKS5pc1VjcGUpIHsgLy9jYXNlIHdlIGFyZSBkcmFnZ2luZyBhIG5vZGUgaW50byBVQ1BFCisgICAgICAgICAgICAgICAgICAgIGxldCBpc0VudGlyZWx5SW5VQ1BFOmJvb2xlYW4gPSB0aGlzLmNvbW1vbkdyYXBoVXRpbHMuaXNGaXJzdEJveENvbnRhaW5zSW5TZWNvbmRCb3goZHJhZ2dlZE5vZGUucmVuZGVyZWRCb3VuZGluZ0JveCgpLCBncmFwaE5vZGUucmVuZGVyZWRCb3VuZGluZ0JveCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW50aXJlbHlJblVDUEUpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5pc1ZhbGlkRHJvcEluc2lkZVVDUEUoY3ksIGRyYWdnZWROb2RlLmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZSwgZ3JhcGhOb2RlLmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZSkpeyAvL2lmIHRoaXMgaXMgdmFsaWQgaW5zZXJ0IGludG8gdWNwZSwgd2UgcmV0dXJuIGZhbHNlIC0gbm8gaWxsZWdhbCBvdmVybGFwcGluZyBub2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ3JhcGhOb2RlLmRhdGEoKS5pZCAhPT0gZHJhZ2dlZE5vZGUuZGF0YSgpLmlkICYmIHRoaXMuaXNOb2Rlc092ZXJsYXBwaW5nKGRyYWdnZWROb2RlLCBncmFwaE5vZGUpOworCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBpbGxlZ2FsT3ZlcmxhcHBpbmdOb2Rlcy5sZW5ndGggPT09IDA7CisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHdpbGwgcmV0dXJuIHRydWUvZmFsc2UgaWYgdGhlIG1vdmUgb2YgdGhlIG5vZGVzIGlzIHZhbGlkIChubyBub2RlIG92ZXJsYXBwaW5nIGFuZCB2ZXJpZnlpbmcgaWYgaW5zZXJ0IGludG8gVUNQRSBpcyB2YWxpZCkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBub2Rlc0FycmF5IC0gdGhlIHNlbGVjdGVkIGRyYWdzIG5vZGVzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaXNHcm91cFZhbGlkRHJvcChjeTogQ3kuSW5zdGFuY2UsIG5vZGVzQXJyYXk6IEN5LkNvbGxlY3Rpb25Ob2Rlcyk6IGJvb2xlYW4geworICAgICAgICAgICAgdmFyIGZpbHRlckRyYWdnZWROb2RlcyA9IG5vZGVzQXJyYXkuZmlsdGVyKCdbP2lzRHJhZ2dhYmxlXScpOworICAgICAgICAgICAgbGV0IGlzVmFsaWREcm9wID0gXy5ldmVyeShmaWx0ZXJEcmFnZ2VkTm9kZXMsIChub2RlOiBDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKSA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZERyb3AoY3ksIG5vZGUpOworCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkRHJvcDsKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogZ2V0IGFsbCBsaW5rcyBpbiBkaWFncmFtCisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKiBAcmV0dXJucyB7YW55W118Ym9vbGVhbltdfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGdldEFsbENvbXBvc2l0aW9uQ2lMaW5rcyA9IChjeTogQ3kuSW5zdGFuY2UpOiBBcnJheTxNb2RlbHMuQ29tcG9zaXRpb25DaUxpbmtCYXNlPiA9PiB7CisgICAgICAgICAgICByZXR1cm4gXy5tYXAoY3kuZWRnZXMoIltpc1NkY0VsZW1lbnRdIiksIChlZGdlOiBDeS5Db2xsZWN0aW9uRWRnZXMpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWRnZS5kYXRhKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgR3JhcGggVXRpbHMgc2VydmVyIHF1ZXVlCisgICAgICAgICAqIEByZXR1cm5zIHtTZGMuVXRpbHMuRnVuY3Rpb25zLlF1ZXVlVXRpbHN9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZ2V0R3JhcGhVdGlsc1NlcnZlclVwZGF0ZVF1ZXVlKCk6IFNkYy5VdGlscy5GdW5jdGlvbnMuUXVldWVVdGlscyB7CisgICAgICAgICAgICByZXR1cm4gQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscy5ncmFwaFV0aWxzVXBkYXRlUXVldWU7CisgICAgICAgIH0KKyAgICAgICAgOworCisgICAgICAgIC8qKgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYmxvY2tBY3Rpb24gLSB0cnVlL2ZhbHNlIGlmIHRoaXMgaXMgYSBibG9jayBhY3Rpb24KKyAgICAgICAgICogQHBhcmFtIGluc3RhbmNlcworICAgICAgICAgKiBAcGFyYW0gY29tcG9uZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgcHVzaE11bHRpcGxlVXBkYXRlQ29tcG9uZW50SW5zdGFuY2VzUmVxdWVzdFRvUXVldWUgPSAoYmxvY2tBY3Rpb246IGJvb2xlYW4sIGluc3RhbmNlczogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+LCBjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6IHZvaWQgPT4geworICAgICAgICAgICAgaWYgKGJsb2NrQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZXRHcmFwaFV0aWxzU2VydmVyVXBkYXRlUXVldWUoKS5hZGRCbG9ja2luZ1VJQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAoKSA9PiBjb21wb25lbnQudXBkYXRlTXVsdGlwbGVDb21wb25lbnRJbnN0YW5jZXMoaW5zdGFuY2VzKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuZ2V0R3JhcGhVdGlsc1NlcnZlclVwZGF0ZVF1ZXVlKCkuYWRkTm9uQmxvY2tpbmdVSUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgKCkgPT4gY29tcG9uZW50LnVwZGF0ZU11bHRpcGxlQ29tcG9uZW50SW5zdGFuY2VzKGluc3RhbmNlcyksCisgICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuTG9hZGVyU2VydmljZS5oaWRlTG9hZGVyKCdjb21wb3NpdGlvbi1ncmFwaCcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogdGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSBjb21wb25lbnQgaW5zdGFuY2UgZGF0YQorICAgICAgICAgKiBAcGFyYW0gYmxvY2tBY3Rpb24gLSB0cnVlL2ZhbHNlIGlmIHRoaXMgaXMgYSBibG9jayBhY3Rpb24KKyAgICAgICAgICogQHBhcmFtIHVwZGF0ZWRJbnN0YW5jZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHB1c2hVcGRhdGVDb21wb25lbnRJbnN0YW5jZUFjdGlvblRvUXVldWUgPSAoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQsIGJsb2NrQWN0aW9uOiBib29sZWFuLCB1cGRhdGVkSW5zdGFuY2U6IE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTogdm9pZCA9PiB7CisKKyAgICAgICAgICAgIGlmIChibG9ja0FjdGlvbikgeworICAgICAgICAgICAgICAgIHRoaXMuTG9hZGVyU2VydmljZS5zaG93TG9hZGVyKCdjb21wb3NpdGlvbi1ncmFwaCcpOworICAgICAgICAgICAgICAgIHRoaXMuZ2V0R3JhcGhVdGlsc1NlcnZlclVwZGF0ZVF1ZXVlKCkuYWRkQmxvY2tpbmdVSUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgKCkgPT4gY29tcG9uZW50LnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHVwZGF0ZWRJbnN0YW5jZSkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmdldEdyYXBoVXRpbHNTZXJ2ZXJVcGRhdGVRdWV1ZSgpLmFkZE5vbkJsb2NraW5nVUlBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICgpID0+IGNvbXBvbmVudC51cGRhdGVDb21wb25lbnRJbnN0YW5jZSh1cGRhdGVkSW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLkxvYWRlclNlcnZpY2UuaGlkZUxvYWRlcignY29tcG9zaXRpb24tZ3JhcGgnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscy4kaW5qZWN0ID0gWyckcScsICdMb2FkZXJTZXJ2aWNlJywgICdDb21tb25HcmFwaFV0aWxzJywgJ01hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMnXTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL3V0aWxzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzLXV0aWxzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy11dGlscy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDJlNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy11dGlscy50cwpAQCAtMCwwICsxLDM0NyBAQAorLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA2LzI4LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuR3JhcGguVXRpbHMgeworCisgICAgaW1wb3J0IEltYWdlQ3JlYXRvclNlcnZpY2UgPSBTZGMuVXRpbHMuSW1hZ2VDcmVhdG9yU2VydmljZTsKKyAgICBpbXBvcnQgTW9kdWxlID0gU2RjLk1vZGVscy5Nb2R1bGU7CisgICAgZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMgeworCisgICAgICAgIHByaXZhdGUgcDJwVkw6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBwcml2YXRlIG1wMm1wVkw6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbGlua3NGYWN0b3J5OlNkYy5VdGlscy5MaW5rc0ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9hZGVyU2VydmljZTpTZXJ2aWNlcy5Mb2FkZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGdlbmVyYWxHcmFwaFV0aWxzOlNkYy5HcmFwaC5VdGlscy5Db21wb3NpdGlvbkdyYXBoR2VuZXJhbFV0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGxlZnRQYWxldHRlTG9hZGVyU2VydmljZTpTZXJ2aWNlcy5Db21wb25lbnRzLkxlZnRQYWxldHRlTG9hZGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb21wb25lbnRJbnN0YW5jZUZhY3Rvcnk6U2RjLlV0aWxzLkNvbXBvbmVudEluc3RhbmNlRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBub2Rlc0ZhY3Rvcnk6U2RjLlV0aWxzLk5vZGVzRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb21tb25HcmFwaFV0aWxzOiBTZGMuR3JhcGguVXRpbHMuQ29tbW9uR3JhcGhVdGlscywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBtYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzOiBHcmFwaC5VdGlscy5NYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzKSB7CisKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlVmxzKCk7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlbGV0ZSB0aGUgbGluayBvbiBzZXJ2ZXIgYW5kIHRoZW4gcmVtb3ZlIGl0IGZyb20gZ3JhcGgKKyAgICAgICAgICogQHBhcmFtIGNvbXBvbmVudAorICAgICAgICAgKiBAcGFyYW0gcmVsZWFzZUxvYWRpbmcgLSB0cnVlL2ZhbHNlIHJlbGVhc2UgdGhlIGxvYWRlciB3aGVuIGZpbmlzaGVkCisgICAgICAgICAqIEBwYXJhbSBsaW5rIC0gdGhlIGxpbmsgdG8gZGVsZXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZGVsZXRlTGluayA9IChjeTpDeS5JbnN0YW5jZSwgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgcmVsZWFzZUxvYWRpbmc6Ym9vbGVhbiwgbGluazpDeS5Db2xsZWN0aW9uRWRnZXMpID0+IHsKKworICAgICAgICAgICAgdGhpcy5sb2FkZXJTZXJ2aWNlLnNob3dMb2FkZXIoJ2NvbXBvc2l0aW9uLWdyYXBoJyk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzRGVsZXRlUmVsYXRpb24gPSAocmVzcG9uc2UpID0+IHsKKyAgICAgICAgICAgICAgICBjeS5yZW1vdmUobGluayk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAoIXJlbGVhc2VMb2FkaW5nKSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsR3JhcGhVdGlscy5nZXRHcmFwaFV0aWxzU2VydmVyVXBkYXRlUXVldWUoKS5hZGRCbG9ja2luZ1VJQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAoKSA9PiBjb21wb25lbnQuZGVsZXRlUmVsYXRpb24obGluay5kYXRhKCkucmVsYXRpb24pLnRoZW4ob25TdWNjZXNzRGVsZXRlUmVsYXRpb24pCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsR3JhcGhVdGlscy5nZXRHcmFwaFV0aWxzU2VydmVyVXBkYXRlUXVldWUoKS5hZGRCbG9ja2luZ1VJQWN0aW9uV2l0aFJlbGVhc2VDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgKCkgPT4gY29tcG9uZW50LmRlbGV0ZVJlbGF0aW9uKGxpbmsuZGF0YSgpLnJlbGF0aW9uKS50aGVuKG9uU3VjY2Vzc0RlbGV0ZVJlbGF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5sb2FkZXJTZXJ2aWNlLmhpZGVMb2FkZXIoJ2NvbXBvc2l0aW9uLWdyYXBoJykpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBjcmVhdGUgdGhlIGxpbmsgb24gc2VydmVyIGFuZCB0aGFuIGRyYXcgaXQgb24gZ3JhcGgKKyAgICAgICAgICogQHBhcmFtIGxpbmsgLSB0aGUgbGluayB0byBjcmVhdGUKKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjcmVhdGVMaW5rID0gKGxpbms6TW9kZWxzLkNvbXBvc2l0aW9uQ2lMaW5rQmFzZSwgY3k6Q3kuSW5zdGFuY2UsIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLmxvYWRlclNlcnZpY2Uuc2hvd0xvYWRlcignY29tcG9zaXRpb24tZ3JhcGgnKTsKKworICAgICAgICAgICAgbGV0IG9uU3VjY2VzczoocmVzcG9uc2U6TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKSA9PiB2b2lkID0gKHJlbGF0aW9uOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCkgPT4geworICAgICAgICAgICAgICAgIGxpbmsuc2V0UmVsYXRpb24ocmVsYXRpb24pOworICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uR3JhcGhVdGlscy5pbnNlcnRMaW5rVG9HcmFwaChjeSwgbGluayk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsaW5rLnVwZGF0ZUxpbmtEaXJlY3Rpb24oKTsKKworICAgICAgICAgICAgdGhpcy5nZW5lcmFsR3JhcGhVdGlscy5nZXRHcmFwaFV0aWxzU2VydmVyVXBkYXRlUXVldWUoKS5hZGRCbG9ja2luZ1VJQWN0aW9uV2l0aFJlbGVhc2VDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAoKSA9PiBjb21wb25lbnQuY3JlYXRlUmVsYXRpb24obGluay5yZWxhdGlvbikudGhlbihvblN1Y2Nlc3MpLAorICAgICAgICAgICAgICAgICgpID0+IHRoaXMubG9hZGVyU2VydmljZS5oaWRlTG9hZGVyKCdjb21wb3NpdGlvbi1ncmFwaCcpCisgICAgICAgICAgICApOworICAgICAgICB9OworCisKKyAgICAgICAgcHVibGljIGluaXRTY29wZVZscyA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICBsZXQgdmxzID0gdGhpcy5sZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UuZ2V0RnVsbERhdGFDb21wb25lbnRMaXN0KFNkYy5VdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZMKTsKKyAgICAgICAgICAgIHZscy5mb3JFYWNoKChpdGVtKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGtleSA9IF8uZmluZChPYmplY3Qua2V5cyhpdGVtLmNhcGFiaWxpdGllcyksIChrZXkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uaW5jbHVkZXMoa2V5LnRvTG93ZXJDYXNlKCksICdsaW5rYWJsZScpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGxldCBsaW5rYWJsZSA9IGl0ZW0uY2FwYWJpbGl0aWVzW2tleV07CisgICAgICAgICAgICAgICAgaWYgKGxpbmthYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rYWJsZVswXS5tYXhPY2N1cnJlbmNlcyA9PSAnMicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucDJwVkwgPSBfLmZpbmQodmxzLCAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQudW5pcXVlSWQgPT09IGl0ZW0udW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugey8vYXNzdW1pbmcgdW5ib3VuZGVkIG9jY3VycmVuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1wMm1wVkwgPSBfLmZpbmQodmxzLCAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQudW5pcXVlSWQgPT09IGl0ZW0udW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc2V0VkxsaW5rcyA9IChtYXRjaDpNb2RlbHMuTWF0Y2hSZXFUb1JlcSwgdmw6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOkFycmF5PE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbD4gPT4geworCisgICAgICAgICAgICBsZXQgcmVsYXRpb25zaGlwMSA9IG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICBsZXQgcmVsYXRpb25zaGlwMiA9IG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICBsZXQgbmV3UmVsYXRpb25zaGlwTW9kZWwxID0gbmV3IE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCgpOworICAgICAgICAgICAgbGV0IG5ld1JlbGF0aW9uc2hpcE1vZGVsMiA9IG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwoKTsKKworICAgICAgICAgICAgbGV0IGNhcGFiaWxpdHk6TW9kZWxzLkNhcGFiaWxpdHkgPSB2bC5jYXBhYmlsaXRpZXMuZmluZFZhbHVlQnlLZXkoJ2xpbmthYmxlJylbMF07CisgICAgICAgICAgICByZWxhdGlvbnNoaXAxLnNldFJlbGF0aW9uUHJvcGVydGllcyhjYXBhYmlsaXR5LCBtYXRjaC5yZXF1aXJlbWVudCk7CisgICAgICAgICAgICByZWxhdGlvbnNoaXAyLnNldFJlbGF0aW9uUHJvcGVydGllcyhjYXBhYmlsaXR5LCBtYXRjaC5zZWNvbmRSZXF1aXJlbWVudCk7CisKKyAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcE1vZGVsMS5zZXRSZWxhdGlvbnNoaXBNb2RlbFBhcmFtcyhtYXRjaC5mcm9tTm9kZSwgdmwudW5pcXVlSWQsIFtyZWxhdGlvbnNoaXAxXSk7CisgICAgICAgICAgICBuZXdSZWxhdGlvbnNoaXBNb2RlbDIuc2V0UmVsYXRpb25zaGlwTW9kZWxQYXJhbXMobWF0Y2gudG9Ob2RlLCB2bC51bmlxdWVJZCwgW3JlbGF0aW9uc2hpcDJdKTsKKworICAgICAgICAgICAgcmV0dXJuIFtuZXdSZWxhdGlvbnNoaXBNb2RlbDEsIG5ld1JlbGF0aW9uc2hpcE1vZGVsMl07CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBjcmVhdGVWbGlua3MgPSAoY3k6Q3kuSW5zdGFuY2UsIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQsIG1hdGNoUmVxVG9SZXE6TW9kZWxzLk1hdGNoUmVxVG9SZXEsIHZsOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIGxldCBjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRnJvbUNvbXBvbmVudCh2bCk7CisgICAgICAgICAgICBsZXQgZnJvbU5vZGVQb3NpdGlvbjpDeS5Qb3NpdGlvbiA9IGN5LmdldEVsZW1lbnRCeUlkKG1hdGNoUmVxVG9SZXEuZnJvbU5vZGUpLnJlbGF0aXZlUG9zaXRpb24oKTsKKyAgICAgICAgICAgIGxldCB0b05vZGVQb3NpdGlvbjpDeS5Qb3NpdGlvbiA9IGN5LmdldEVsZW1lbnRCeUlkKG1hdGNoUmVxVG9SZXEudG9Ob2RlKS5yZWxhdGl2ZVBvc2l0aW9uKCk7CisgICAgICAgICAgICBsZXQgbG9jYXRpb246Q3kuUG9zaXRpb24gPSB7CisgICAgICAgICAgICAgICAgeDogMC41ICogKGZyb21Ob2RlUG9zaXRpb24ueCArIHRvTm9kZVBvc2l0aW9uLngpLAorICAgICAgICAgICAgICAgIHk6IDAuNSAqIChmcm9tTm9kZVBvc2l0aW9uLnkgKyB0b05vZGVQb3NpdGlvbi55KQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5wb3NYID0gbG9jYXRpb24ueDsKKyAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLnBvc1kgPSBsb2NhdGlvbi55OworCisgICAgICAgICAgICBsZXQgb25GYWlsZWQ6KGVycm9yOmFueSkgPT4gdm9pZCA9IChlcnJvcjphbnkpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmxvYWRlclNlcnZpY2UuaGlkZUxvYWRlcignY29tcG9zaXRpb24tZ3JhcGgnKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRmFpbGVkJywgZXJyb3IpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uU3VjY3NlcycsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5yZXF1aXJlbWVudHMgPSBuZXcgTW9kZWxzLlJlcXVpcmVtZW50c0dyb3VwKHZsLnJlcXVpcmVtZW50cyk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2FwYWJpbGl0aWVzID0gbmV3IE1vZGVscy5DYXBhYmlsaXRpZXNHcm91cCh2bC5jYXBhYmlsaXRpZXMpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvbXBvbmVudFZlcnNpb24gPSB2bC52ZXJzaW9uOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEluc3RhbmNlUkMoKTsKKworICAgICAgICAgICAgICAgIGxldCBuZXdMaW5rcyA9IHRoaXMuc2V0VkxsaW5rcyhtYXRjaFJlcVRvUmVxLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgbGV0IG5ld05vZGUgPSB0aGlzLm5vZGVzRmFjdG9yeS5jcmVhdGVOb2RlKHJlc3BvbnNlKTsKKworICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uR3JhcGhVdGlscy5hZGRDb21wb25lbnRJbnN0YW5jZU5vZGVUb0dyYXBoKGN5LCBuZXdOb2RlKTsKKworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChuZXdMaW5rcywgKGxpbmspID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtPYmc6TW9kZWxzLkNvbXBvc2l0aW9uQ2lMaW5rQmFzZSA9IHRoaXMubGlua3NGYWN0b3J5LmNyZWF0ZUdyYXBoTGluayhjeSwgbGluaywgbGluay5yZWxhdGlvbnNoaXBzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVMaW5rKGxpbmtPYmcsIGN5LCBjb21wb25lbnQpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNvbXBvbmVudC5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGNyZWF0ZVNpbXBsZUxpbmsgPSAobWF0Y2g6TW9kZWxzLk1hdGNoUmVxVG9DYXBhYmlsaXR5LCBjeTpDeS5JbnN0YW5jZSwgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgbmV3UmVsYXRpb246TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsID0gbWF0Y2gubWF0Y2hUb1JlbGF0aW9uTW9kZWwoKTsKKyAgICAgICAgICAgIGxldCBsaW5rT2JnOk1vZGVscy5Db21wb3NpdGlvbkNpTGlua0Jhc2UgPSB0aGlzLmxpbmtzRmFjdG9yeS5jcmVhdGVHcmFwaExpbmsoY3ksbmV3UmVsYXRpb24sIG5ld1JlbGF0aW9uLnJlbGF0aW9uc2hpcHNbMF0pOworICAgICAgICAgICAgdGhpcy5jcmVhdGVMaW5rKGxpbmtPYmcsIGN5LCBjb21wb25lbnQpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjcmVhdGVMaW5rRnJvbU1lbnUgPSAoY3k6Q3kuSW5zdGFuY2UsIGNob3Nlbk1hdGNoOk1vZGVscy5NYXRjaEJhc2UsIHZsOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIGlmIChjaG9zZW5NYXRjaCkgeworICAgICAgICAgICAgICAgIGlmIChjaG9zZW5NYXRjaCAmJiBjaG9zZW5NYXRjaCBpbnN0YW5jZW9mIE1vZGVscy5NYXRjaFJlcVRvUmVxKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmxpbmtzKGN5LCBjb21wb25lbnQsIGNob3Nlbk1hdGNoLCB2bCk7IC8vVE9ETyBvcml0IGltcGxlbWVudAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2hvc2VuTWF0Y2ggJiYgY2hvc2VuTWF0Y2ggaW5zdGFuY2VvZiBNb2RlbHMuTWF0Y2hSZXFUb0NhcGFiaWxpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTaW1wbGVMaW5rKGNob3Nlbk1hdGNoLCBjeSwgY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKworICAgICAgICAvKioKKyAgICAgICAgICogRmlsdGVycyB0aGUgbWF0Y2hlcyBmb3IgVUNQRSBsaW5rcyBzbyB0aGF0IHNob3duIHJlcXVpcmVtZW50cyBhbmQgY2FwYWJpbGl0ZXMgYXJlIG9ubHkgcmVsYXRlZCB0byB0aGUgc2VsZWN0ZWQgdWNwZS1jcAorICAgICAgICAgKiBAcGFyYW0gZnJvbU5vZGUKKyAgICAgICAgICogQHBhcmFtIHRvTm9kZQorICAgICAgICAgKiBAcGFyYW0gbWF0Y2hlc0FycmF5CisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheTxNb2RlbHMuTWF0Y2hCYXNlPn0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaWx0ZXJVY3BlTGlua3MoZnJvbU5vZGU6IE1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZUJhc2UsIHRvTm9kZTogTW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlQmFzZSwgbWF0Y2hlc0FycmF5OiBBcnJheTxNb2RlbHMuTWF0Y2hCYXNlPik6IGFueSB7CisKKyAgICAgICAgICAgIGxldCBtYXRjaExpbms6IEFycmF5PE1vZGVscy5NYXRjaEJhc2U+OworCisgICAgICAgICAgICBpZiAoZnJvbU5vZGUuaXNVY3BlUGFydCkgeworICAgICAgICAgICAgICAgIG1hdGNoTGluayA9IF8uZmlsdGVyKG1hdGNoZXNBcnJheSwgKG1hdGNoOiBNb2RlbHMuTWF0Y2hCYXNlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaC5pc093bmVyKGZyb21Ob2RlLmlkKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRvTm9kZS5pc1VjcGVQYXJ0KSB7CisgICAgICAgICAgICAgICAgbWF0Y2hMaW5rID0gXy5maWx0ZXIobWF0Y2hlc0FycmF5LCAobWF0Y2g6IE1vZGVscy5NYXRjaEJhc2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmlzT3duZXIodG9Ob2RlLmlkKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXRjaExpbmsgPyBtYXRjaExpbmsgOiBtYXRjaGVzQXJyYXk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBvcGVuIHRoZSBjb25uZWN0IGxpbmsgbWVudSBpZiB0aGUgbGluayBkcmF3biBpcyB2YWxpZCAtIG1hdGNoICByZXF1aXJlbWVudHMgJiBjYXBhYmlsaXRpZXMKKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBmcm9tTm9kZQorICAgICAgICAgKiBAcGFyYW0gdG9Ob2RlCisgICAgICAgICAqIEByZXR1cm5zIHthbnl9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb25MaW5rRHJhd24oY3k6Q3kuSW5zdGFuY2UsIGZyb21Ob2RlOkN5LkNvbGxlY3Rpb25GaXJzdE5vZGUsIHRvTm9kZTpDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKTpNb2RlbHMuUmVsYXRpb25NZW51RGlyZWN0aXZlT2JqIHsKKworICAgICAgICAgICAgaWYoIXRoaXMuY29tbW9uR3JhcGhVdGlscy5ub2RlTG9jYXRpb25zQ29tcGF0aWJsZShjeSwgZnJvbU5vZGUsIHRvTm9kZSkpeyByZXR1cm4gbnVsbDsgfQorICAgICAgICAgICAgbGV0IGxpbmtNb2RlbDpBcnJheTxNb2RlbHMuQ29tcG9zaXRpb25DaUxpbmtCYXNlPiA9IHRoaXMuZ2VuZXJhbEdyYXBoVXRpbHMuZ2V0QWxsQ29tcG9zaXRpb25DaUxpbmtzKGN5KTsKKworICAgICAgICAgICAgbGV0IHBvc3NpYmxlUmVsYXRpb25zOkFycmF5PE1vZGVscy5NYXRjaEJhc2U+ID0gdGhpcy5tYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmdldE1hdGNoZWRSZXF1aXJlbWVudHNDYXBhYmlsaXRpZXMoZnJvbU5vZGUuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlLAorICAgICAgICAgICAgICAgIHRvTm9kZS5kYXRhKCkuY29tcG9uZW50SW5zdGFuY2UsIGxpbmtNb2RlbCwgdGhpcy5tcDJtcFZMKTsgLy9UT0RPIG9yaXQgLSBhZGQgcDJwIGFuZCBtcDJtcAorCisgICAgICAgICAgICAvL2ZpbHRlciByZWxhdGlvbnMgZm91bmQgdG8gbGltaXQgdG8gc3BlY2lmaWMgdWNwZS1jcAorICAgICAgICAgICAgcG9zc2libGVSZWxhdGlvbnMgPSB0aGlzLmZpbHRlclVjcGVMaW5rcyhmcm9tTm9kZS5kYXRhKCksIHRvTm9kZS5kYXRhKCksIHBvc3NpYmxlUmVsYXRpb25zKTsKKworICAgICAgICAgICAgLy9pZiBmb3VuZCBwb3NzaWJsZVJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBub2RlcyB3ZSBjcmVhdGUgcmVsYXRpb24gbWVudSBkaXJlY3RpdmUgYW5kIG9wZW4gdGhlIGxpbmsgbWVudQorICAgICAgICAgICAgaWYgKHBvc3NpYmxlUmVsYXRpb25zLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGxldCBtZW51UG9zaXRpb24gPSB0aGlzLmdlbmVyYWxHcmFwaFV0aWxzLmdldExpbmtNZW51UG9zaXRpb24oY3ksIHRvTm9kZS5yZW5kZXJlZFBvaW50KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxzLlJlbGF0aW9uTWVudURpcmVjdGl2ZU9iaihmcm9tTm9kZS5kYXRhKCksIHRvTm9kZS5kYXRhKCksIHRoaXMubXAybXBWTCwgdGhpcy5wMnBWTCwgbWVudVBvc2l0aW9uLCBwb3NzaWJsZVJlbGF0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgd2hlbiB3ZSBkcmFnIGluc3RhbmNlIGluIHRvIFVDUEUgb3Igb3V0IG9mIFVDUEUgIC0gZ2V0IGFsbCBsaW5rcyB3ZSBuZWVkIHRvIGRlbGV0ZSAtIG9uZSBub2RlIGluIHVjcGUgYW5kIG9uZSBub2RlIG91dHNpZGUgb2YgdWNwZQorICAgICAgICAgKiBAcGFyYW0gbm9kZSAtIHRoZSBub2RlIHdlIGRyYWdnZWQgaW50byBvciBvdXQgb2YgdGhlIHVjcGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBkZWxldGVMaW5rc1doZW5Ob2RlTW92ZWRGcm9tT3JUb1VDUEUoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgY3k6Q3kuSW5zdGFuY2UsIG5vZGVNb3ZlZDpDeS5Db2xsZWN0aW9uTm9kZXMsIHZsc1BlbmRpbmdEZWxldGlvbj86Q3kuQ29sbGVjdGlvbk5vZGVzKTp2b2lkIHsKKworCisgICAgICAgICAgICBsZXQgbGlua3NUb0RlbGV0ZTpDeS5Db2xsZWN0aW9uRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7CisgICAgICAgICAgICBfLmZvckVhY2gobm9kZU1vdmVkLm5laWdoYm9yaG9vZCgnbm9kZScpLCAobmVpZ2hib3JOb2RlKT0+eworCisgICAgICAgICAgICAgICAgaWYobmVpZ2hib3JOb2RlLmRhdGEoKS5pc1VjcGVQYXJ0KXsgLy9leGlzdGluZyBjb25uZWN0aW9ucyB0byB1Y3BlIG9yIHVjcGUtY3AgLSB3ZSB3YW50IHRvIGRlbGV0ZSBldmVuIHRob3VnaCBub2RlTG9jYXRpb25zQ29tcGF0aWJsZSB3aWxsIHRlY2huaWNhbGx5IHJldHVybiB0cnVlCisgICAgICAgICAgICAgICAgICAgIGxpbmtzVG9EZWxldGUgPSBsaW5rc1RvRGVsZXRlLmFkZChub2RlTW92ZWQuZWRnZXNXaXRoKG5laWdoYm9yTm9kZSkpOyAvLyBUaGlzIHdpbGwgZGVsZXRlIHRoZSB1Y3BlLWhvc3QtbGluaywgb3IgdGhlIHZsLXVjcGUtbGluayBpZiBub2RlTW92ZWQgaXMgdmwKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIXRoaXMuY29tbW9uR3JhcGhVdGlscy5ub2RlTG9jYXRpb25zQ29tcGF0aWJsZShjeSwgbm9kZU1vdmVkLCBuZWlnaGJvck5vZGUpKXsgLy9jb25uZWN0aW9uIHRvIHJlZ3VsYXIgbm9kZSBvciB2bCAtIGNoZWNrIGlmIGxvY2F0aW9ucyBhcmUgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgICAgIGlmKCF2bHNQZW5kaW5nRGVsZXRpb24gfHwgIXZsc1BlbmRpbmdEZWxldGlvbi5pbnRlcnNlY3QobmVpZ2hib3JOb2RlKS5sZW5ndGgpeyAvL0NoZWNrIGlmIHRoaXMgaXMgYSBsaW5rIHRvIGEgVkwgcGVuZGluZyBkZWxldGlvbiwgdG8gcHJldmVudCBkb3VibGUgZGVsZXRpb24gb2YgYmV0d2VlbiB0aGUgbm9kZSBtb3ZlZCBhbmQgdmwKKyAgICAgICAgICAgICAgICAgICAgICAgbGlua3NUb0RlbGV0ZSA9IGxpbmtzVG9EZWxldGUuYWRkKG5vZGVNb3ZlZC5lZGdlc1dpdGgobmVpZ2hib3JOb2RlKSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisKKworICAgICAgICAgICAgbGlua3NUb0RlbGV0ZS5lYWNoKChpLCBsaW5rKT0+eworICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlTGluayhjeSwgY29tcG9uZW50LCBmYWxzZSwgbGluayk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9OworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBob3N0ZWRPbiBsaW5rIGJldHdlZW4gYSBWRiBhbmQgVUNQRQorICAgICAgICAgKiBAcGFyYW0gY29tcG9uZW50CisgICAgICAgICAqIEBwYXJhbSBjeQorICAgICAgICAgKiBAcGFyYW0gdWNwZU5vZGUKKyAgICAgICAgICogQHBhcmFtIHZmTm9kZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGNyZWF0ZVZmVG9VY3BlTGluayA9IChjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgY3k6Q3kuSW5zdGFuY2UsIHVjcGVOb2RlOk1vZGVscy5HcmFwaC5Ob2RlVWNwZSwgdmZOb2RlOk1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZVZmKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBob3N0ZWRPbk1hdGNoOk1vZGVscy5NYXRjaFJlcVRvQ2FwYWJpbGl0eSA9IHRoaXMuZ2VuZXJhbEdyYXBoVXRpbHMuY2FuQmVIb3N0ZWRPbihjeSwgdWNwZU5vZGUuY29tcG9uZW50SW5zdGFuY2UsIHZmTm9kZS5jb21wb25lbnRJbnN0YW5jZSk7CisgICAgICAgICAgICAvKiBjcmVhdGUgcmVsYXRpb24gKi8KKyAgICAgICAgICAgIGxldCBuZXdSZWxhdGlvbiA9IG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwoKTsKKyAgICAgICAgICAgIG5ld1JlbGF0aW9uLmZyb21Ob2RlID0gdWNwZU5vZGUuaWQ7CisgICAgICAgICAgICBuZXdSZWxhdGlvbi50b05vZGUgPSB2Zk5vZGUuaWQ7CisKKyAgICAgICAgICAgIGxldCBsaW5rOk1vZGVscy5Db21wb3NpdGlvbkNpTGlua0Jhc2UgPSB0aGlzLmxpbmtzRmFjdG9yeS5jcmVhdGVVY3BlSG9zdExpbmsobmV3UmVsYXRpb24pOworICAgICAgICAgICAgbGluay5yZWxhdGlvbiA9IGhvc3RlZE9uTWF0Y2gubWF0Y2hUb1JlbGF0aW9uTW9kZWwoKTsKKyAgICAgICAgICAgIHRoaXMuY3JlYXRlTGluayhsaW5rLCBjeSwgY29tcG9uZW50KTsKKyAgICAgICAgfTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGNsaWNrIGV2ZW50IG9uIGxpbmtzLgorICAgICAgICAgKiBJZiBvbmUgZWRnZSBzZWxlY3RlZDogZG8gbm90aGluZy4KKyAgICAgICAgIC8qVHdvIGVkZ2VzIHNlbGVjdGVkIC0gYWx3YXlzIHNlbGVjdCBhbGwKKyAgICAgICAgIC8qIFRocmVlIG9yIG1vcmUgZWRnZXM6IGZpcnN0IGNsaWNrIC0gc2VsZWN0IGFsbCwgc2Vjb25kYXJ5IGNsaWNrIC0gc2VsZWN0IHNpbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBldmVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGhhbmRsZUxpbmtDbGljayhjeTpDeS5JbnN0YW5jZSwgZXZlbnQgOiBDeS5FdmVudE9iamVjdCkgeworICAgICAgICAgICAgaWYoY3kuJCgnZWRnZTpzZWxlY3RlZCcpLmxlbmd0aCA+IDIgJiYgZXZlbnQuY3lUYXJnZXRbMF0uc2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGN5LiQoJzpzZWxlY3RlZCcpLnVuc2VsZWN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgbGV0IHZsOiBDeS5Db2xsZWN0aW9uTm9kZXMgPSBldmVudC5jeVRhcmdldFswXS50YXJnZXQoJy52bC1ub2RlJyk7CisgICAgICAgICAgICAgICAgbGV0IGNvbm5lY3RlZEVkZ2VzOkN5LkNvbGxlY3Rpb25FZGdlcyA9IHZsLmNvbm5lY3RlZEVkZ2VzKCk7CisgICAgICAgICAgICAgICAgaWYgKHZsLmxlbmd0aCAmJiBjb25uZWN0ZWRFZGdlcy5sZW5ndGggPiAxKSB7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB2bC5zZWxlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZEVkZ2VzLnNlbGVjdCgpOworICAgICAgICAgICAgICAgICAgICB9LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIGZvciB0aGUgbWVudSB0aGF0IG1vZGlmaWVzIGFuIGV4aXN0aW5nIGxpbmsKKyAgICAgICAgICogQHBhcmFtIGV2ZW50CisgICAgICAgICAqIEBwYXJhbSBlbGVtZW50V2lkdGgKKyAgICAgICAgICogQHBhcmFtIGVsZW1lbnRIZWlnaHQKKyAgICAgICAgICogQHJldHVybnMge1NkYy5Nb2RlbHMuR3JhcGguUG9pbnR9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgY2FsY3VsYXRlTGlua01lbnVQb3NpdGlvbihldmVudCwgZWxlbWVudFdpZHRoLCBlbGVtZW50SGVpZ2h0KTogU2RjLk1vZGVscy5HcmFwaC5Qb2ludCB7CisgICAgICAgICAgICBsZXQgcG9pbnQ6IFNkYy5Nb2RlbHMuR3JhcGguUG9pbnQgPSBuZXcgU2RjLk1vZGVscy5HcmFwaC5Qb2ludChldmVudC5vcmlnaW5hbEV2ZW50LngsZXZlbnQub3JpZ2luYWxFdmVudC55KTsKKyAgICAgICAgICAgIGlmKGV2ZW50Lm9yaWdpbmFsRXZlbnQudmlldy5zY3JlZW4uaGVpZ2h0LWVsZW1lbnRIZWlnaHQ8cG9pbnQueSl7CisgICAgICAgICAgICAgICAgcG9pbnQueSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQudmlldy5zY3JlZW4uaGVpZ2h0LWVsZW1lbnRIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihldmVudC5vcmlnaW5hbEV2ZW50LnZpZXcuc2NyZWVuLndpZHRoLWVsZW1lbnRXaWR0aDxwb2ludC54KXsKKyAgICAgICAgICAgICAgICBwb2ludC54ID0gZXZlbnQub3JpZ2luYWxFdmVudC52aWV3LnNjcmVlbi53aWR0aC1lbGVtZW50V2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcG9pbnQ7CisgICAgICAgIH07CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgbWVudSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayBhbiBleGlzdGluZyBsaW5rLgorICAgICAgICAgKiBAcGFyYW0gbGluaworICAgICAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgICAgICogQHJldHVybnMge01vZGVscy5MaW5rTWVudX0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBnZXRNb2RpZnlMaW5rTWVudShsaW5rOkN5LkNvbGxlY3Rpb25GaXJzdEVkZ2UsIGV2ZW50OkN5LkV2ZW50T2JqZWN0KTpNb2RlbHMuTGlua01lbnV7CisgICAgICAgICAgICBsZXQgcG9pbnQ6U2RjLk1vZGVscy5HcmFwaC5Qb2ludCA9IHRoaXMuY2FsY3VsYXRlTGlua01lbnVQb3NpdGlvbihldmVudCxTZGMuVXRpbHMuQ29uc3RhbnRzLkdyYXBoVUlPYmplY3RzLk1FTlVfTElOS19WTF9XSURUSF9PRkZTRVQsU2RjLlV0aWxzLkNvbnN0YW50cy5HcmFwaFVJT2JqZWN0cy5NRU5VX0xJTktfVkxfSEVJR0hUX09GRlNFVCk7CisgICAgICAgICAgICBsZXQgbWVudTpNb2RlbHMuTGlua01lbnUgPSBuZXcgTW9kZWxzLkxpbmtNZW51KHBvaW50LCB0cnVlLCBsaW5rKTsKKyAgICAgICAgICAgIHJldHVybiBtZW51OworICAgICAgICB9OworCisgICAgfQorCisKKworICAgIENvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMuJGluamVjdCA9IFsKKyAgICAgICAgJ0xpbmtzRmFjdG9yeScsCisgICAgICAgICdMb2FkZXJTZXJ2aWNlJywKKyAgICAgICAgJ0NvbXBvc2l0aW9uR3JhcGhHZW5lcmFsVXRpbHMnLAorICAgICAgICAnTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlJywKKyAgICAgICAgJ0NvbXBvbmVudEluc3RhbmNlRmFjdG9yeScsCisgICAgICAgICdOb2Rlc0ZhY3RvcnknLAorICAgICAgICAnQ29tbW9uR3JhcGhVdGlscycsCisgICAgICAgICdNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzJworICAgIF07Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy11dGlscy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvdXRpbHMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMtdXRpbHMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMzFkMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvY29tcG9zaXRpb24tZ3JhcGgvdXRpbHMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMtdXRpbHMudHMKQEAgLTAsMCArMSwyMjAgQEAKKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMTEvOS8yMDE2LgorICovCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuR3JhcGguVXRpbHMgeworCisgICAgZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uR3JhcGhOb2Rlc1V0aWxzIHsKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBOb2Rlc0ZhY3Rvcnk6U2RjLlV0aWxzLk5vZGVzRmFjdG9yeSwgIHByaXZhdGUgJGxvZzpuZy5JTG9nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBHZW5lcmFsR3JhcGhVdGlsczpHcmFwaC5VdGlscy5Db21wb3NpdGlvbkdyYXBoR2VuZXJhbFV0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNvbW1vbkdyYXBoVXRpbHM6IFNkYy5HcmFwaC5VdGlscy5Db21tb25HcmFwaFV0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGV2ZW50TGlzdGVuZXJTZXJ2aWNlOiBTZXJ2aWNlcy5FdmVudExpc3RlbmVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb2FkZXJTZXJ2aWNlOlNlcnZpY2VzLkxvYWRlclNlcnZpY2UpIHsKKworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgY29tcG9uZW50IGluc3RhbmNlcyBmb3IgYWxsIG5vZGVzIHBhc3NlZCBpbgorICAgICAgICAgKiBAcGFyYW0gbm9kZXMgLSBDeSBub2RlcworICAgICAgICAgKiBAcmV0dXJucyB7YW55W119CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZ2V0QWxsTm9kZXNEYXRhKG5vZGVzOkN5LkNvbGxlY3Rpb25Ob2RlcykgeworICAgICAgICAgICAgcmV0dXJuIF8ubWFwKG5vZGVzLCAobm9kZTpDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKT0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5kYXRhKCk7CisgICAgICAgICAgICB9KQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWxldGVzIGNvbXBvbmVudCBpbnN0YW5jZXMgb24gc2VydmVyIGFuZCB0aGVuIHJlbW92ZXMgaXQgZnJvbSB0aGUgZ3JhcGggYXMgd2VsbAorICAgICAgICAgKiBAcGFyYW0gY3kKKyAgICAgICAgICogQHBhcmFtIGNvbXBvbmVudAorICAgICAgICAgKiBAcGFyYW0gbm9kZVRvRGVsZXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZGVsZXRlTm9kZShjeTogQ3kuSW5zdGFuY2UsIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQsIG5vZGVUb0RlbGV0ZTpDeS5Db2xsZWN0aW9uTm9kZXMpOnZvaWQgeworCisgICAgICAgICAgICB0aGlzLmxvYWRlclNlcnZpY2Uuc2hvd0xvYWRlcignY29tcG9zaXRpb24tZ3JhcGgnKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3M6KHJlc3BvbnNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKSA9PiB2b2lkID0gKHJlc3BvbnNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKSA9PiB7CisgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvblN1Y2Nlc3MnLCByZXNwb25zZSk7CisKKyAgICAgICAgICAgICAgICAvL2lmIG5vZGUgdG8gZGVsZXRlIGlzIGEgVUNQRSwgcmVtb3ZlIGFsbCBjaGlsZHJlbiAoZXhjZXB0IFVDUEUtQ1BzKSBhbmQgcmVtb3ZlIHRoZWlyICJob3N0ZWRPbiIgbGlua3MKKyAgICAgICAgICAgICAgICBpZiAobm9kZVRvRGVsZXRlLmRhdGEoKS5pc1VjcGUpeworICAgICAgICAgICAgICAgICAgICBfLmVhY2goY3kubm9kZXMoJ1s/aXNJbnNpZGVHcm91cF0nKSwgKG5vZGUpPT57CisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFNkYy5VdGlscy5Db25zdGFudHMuR1JBUEhfRVZFTlRTLk9OX1JFTU9WRV9OT0RFX0ZST01fVUNQRSwgbm9kZSwgbm9kZVRvRGVsZXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9jaGVjayB3aGV0aGVyIHRoZSBub2RlIGlzIGNvbm5lY3RlZCB0byBhbnkgVkxzIHRoYXQgb25seSBoYXZlIG9uZSBvdGhlciBjb25uZWN0aW9uLiBJZiBzbywgZGVsZXRlIHRoYXQgVkwgYXMgd2VsbAorICAgICAgICAgICAgICAgIGlmKCEobm9kZVRvRGVsZXRlLmRhdGEoKSBpbnN0YW5jZW9mIFNkYy5Nb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVWbCkpeworICAgICAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGVkVmxzOkFycmF5PEN5LkNvbGxlY3Rpb25GaXJzdE5vZGU+ID0gdGhpcy5nZXRDb25uZWN0ZWRWbFRvTm9kZShub2RlVG9EZWxldGUpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZFZsc1RvRGVsZXRlKGNvbm5lY3RlZFZscyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy91cGRhdGUgVUkKKyAgICAgICAgICAgICAgICBjeS5yZW1vdmUobm9kZVRvRGVsZXRlKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IG9uRmFpbGVkOihyZXNwb25zZTphbnkpID0+IHZvaWQgPSAocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvbkZhaWxlZCcsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy5HZW5lcmFsR3JhcGhVdGlscy5nZXRHcmFwaFV0aWxzU2VydmVyVXBkYXRlUXVldWUoKS5hZGRCbG9ja2luZ1VJQWN0aW9uV2l0aFJlbGVhc2VDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAoKSA9PiBjb21wb25lbnQuZGVsZXRlQ29tcG9uZW50SW5zdGFuY2Uobm9kZVRvRGVsZXRlLmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZS51bmlxdWVJZCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKSwKKyAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLmxvYWRlclNlcnZpY2UuaGlkZUxvYWRlcignY29tcG9zaXRpb24tZ3JhcGgnKQorICAgICAgICAgICAgKTsKKworICAgICAgICB9OworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIGFsbCBWTHMgY29ubmVjdGVkIHRvIGEgc2luZ2xlIG5vZGUKKyAgICAgICAgICogQHBhcmFtIG5vZGUKKyAgICAgICAgICogQHJldHVybnMge0FycmF5PEN5LkNvbGxlY3Rpb25GaXJzdE5vZGU+fQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGdldENvbm5lY3RlZFZsVG9Ob2RlID0gKG5vZGU6IEN5LkNvbGxlY3Rpb25Ob2Rlcyk6IEFycmF5PEN5LkNvbGxlY3Rpb25GaXJzdE5vZGU+ID0+IHsKKyAgICAgICAgICAgIGxldCBjb25uZWN0ZWRWbHM6IEFycmF5PEN5LkNvbGxlY3Rpb25GaXJzdE5vZGU+ID0gbmV3IEFycmF5PEN5LkNvbGxlY3Rpb25GaXJzdE5vZGU+KCk7CisgICAgICAgICAgICBfLmZvckVhY2gobm9kZS5jb25uZWN0ZWRFZGdlcygpLmNvbm5lY3RlZE5vZGVzKCksIChub2RlOiBDeS5Db2xsZWN0aW9uRmlyc3ROb2RlKSA9PiB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YSgpIGluc3RhbmNlb2YgTW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlVmwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkVmxzLnB1c2gobm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdGVkVmxzOworICAgICAgICB9OworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlbGV0ZSBhbGwgVkxzIHRoYXQgaGF2ZSBvbmx5IHR3byBjb25uZWN0ZWQgbm9kZXMgKHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZGVsZXRpbmcgYSBub2RlKQorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGVkVmxzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaGFuZGxlQ29ubmVjdGVkVmxzVG9EZWxldGUgPSAoY29ubmVjdGVkVmxzOiBBcnJheTxDeS5Db2xsZWN0aW9uRmlyc3ROb2RlPikgPT4geworICAgICAgICAgICAgXy5mb3JFYWNoKGNvbm5lY3RlZFZscywgKHZsVG9EZWxldGU6IEN5LkNvbGxlY3Rpb25Ob2RlcykgPT4geworCisgICAgICAgICAgICAgICAgaWYgKHZsVG9EZWxldGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPT09IDIpIHsgLy8gaWYgdmwgY29ubmVjdGVkIG9ubHkgdG8gMiBub2RlcyBuZWVkIHRvIGRlbGV0ZSB0aGUgdmwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5ub3RpZnlPYnNlcnZlcnMoU2RjLlV0aWxzLkNvbnN0YW50cy5HUkFQSF9FVkVOVFMuT05fREVMRVRFX0NPTVBPTkVOVF9JTlNUQU5DRSwgdmxUb0RlbGV0ZS5kYXRhKCkuY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gbW92aW5nIGEgbm9kZSBpbiBvciBvdXQgb2YgVUNQRS4KKyAgICAgICAgICogRGVsZXRlcyBhbGwgY29ubmVjdGVkIFZMcyB0aGF0IGhhdmUgbGVzcyB0aGFuIDIgdmFsaWQgY29ubmVjdGlvbnMgcmVtYWluaW5nIGFmdGVyIHRoZSBtb3ZlCisgICAgICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdmxzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGRlbGV0aW9uIChhc3luYykgdG8gcHJldmVudCBkdXBsaWNhdGUgY2FsbHMgd2hpbGUgZGVsZXRpb24gaXMgaW4gcHJvZ3Jlc3MKKyAgICAgICAgICogQHBhcmFtIGNvbXBvbmVudAorICAgICAgICAgKiBAcGFyYW0gY3kKKyAgICAgICAgICogQHBhcmFtIG5vZGUgLSBub2RlIHRoYXQgd2FzIG1vdmVkIGluL291dCBvZiB1Y3BlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZGVsZXRlTm9kZVZMc1Vwb25Nb3ZlVG9PckZyb21VQ1BFID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQsIGN5OkN5Lkluc3RhbmNlLCBub2RlOkN5LkNvbGxlY3Rpb25Ob2Rlcyk6Q3kuQ29sbGVjdGlvbk5vZGVzID0+eworICAgICAgICAgICAgaWYobm9kZS5kYXRhKCkgaW5zdGFuY2VvZiBNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVWbCl7IHJldHVybjt9CisKKyAgICAgICAgICAgIGxldCBjb25uZWN0ZWRWTHNUb0RlbGV0ZTpDeS5Db2xsZWN0aW9uTm9kZXMgPSBjeS5jb2xsZWN0aW9uKCk7CisgICAgICAgICAgICBfLmZvckVhY2gobm9kZS5uZWlnaGJvcmhvb2QoJ25vZGUnKSwgKGNvbm5lY3RlZE5vZGUpID0+IHsKKworICAgICAgICAgICAgICAgLy9GaW5kIGFsbCBuZWlnaGJvcmluZyBub2RlcyB0aGF0IGFyZSBWTHMKKyAgICAgICAgICAgICAgIGlmKGNvbm5lY3RlZE5vZGUuZGF0YSgpIGluc3RhbmNlb2YgIE1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZVZsKXsKKworICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgVkwncyBuZWlnaGJvcnMgdG8gc2VlIGlmIGl0IGhhcyAyIG9yIG1vcmUgbm9kZXMgd2hvc2UgbG9jYXRpb24gaXMgY29tcGF0aWJsZSB3aXRoIFZMIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgVkwgaXMgaW4gb3Igb3V0IG9mIFVDUEUpCisgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBhdGlibGVOb2RlQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgIGxldCB2bE5laWdoYm9yaG9vZCA9IGNvbm5lY3RlZE5vZGUubmVpZ2hib3Job29kKCdub2RlJyk7CisgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHZsTmVpZ2hib3Job29kLCAodmxOZWlnaGJvck5vZGUpPT57CisgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuY29tbW9uR3JhcGhVdGlscy5ub2RlTG9jYXRpb25zQ29tcGF0aWJsZShjeSwgY29ubmVjdGVkTm9kZSwgdmxOZWlnaGJvck5vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZU5vZGVDb3VudCArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgaWYoY29tcGF0aWJsZU5vZGVDb3VudCA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkVkxzVG9EZWxldGUgPSBjb25uZWN0ZWRWTHNUb0RlbGV0ZS5hZGQoY29ubmVjdGVkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGNvbm5lY3RlZFZMc1RvRGVsZXRlLmVhY2goKGksIHZsVG9EZWxldGU6Q3kuQ29sbGVjdGlvbk5vZGVzKT0+eworICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlTm9kZShjeSwgY29tcG9uZW50LCB2bFRvRGVsZXRlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3RlZFZMc1RvRGVsZXRlOworICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIG5vZGVzIHBvc2l0aW9uLiBpZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGludG8gb3Igb3V0IG9mIHVjcGUsIHRoZSBub2RlIHdpbGwgdHJpZ2dlciB0aGUgdWNwZSBldmVudHMKKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgICAgICogQHBhcmFtIG5vZGVzTW92ZWQgLSB0aGUgbm9kZS9tdWx0aXBsZSBub2RlcyBub3cgbW92ZWQgYnkgdGhlIHVzZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvbk5vZGVzUG9zaXRpb25DaGFuZ2VkID0gKGN5OiBDeS5JbnN0YW5jZSwgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgbm9kZXNNb3ZlZDogQ3kuQ29sbGVjdGlvbk5vZGVzKTogdm9pZCA9PiB7CisKKyAgICAgICAgICAgIGlmIChub2Rlc01vdmVkLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGlzVmFsaWRNb3ZlOmJvb2xlYW4gPSB0aGlzLkdlbmVyYWxHcmFwaFV0aWxzLmlzR3JvdXBWYWxpZERyb3AoY3ksIG5vZGVzTW92ZWQpOworICAgICAgICAgICAgaWYgKGlzVmFsaWRNb3ZlKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoYGNvbXBvc2l0aW9uLWdyYXBoOjpWYWxpZERyb3A6OiB1cGRhdGluZyBub2RlIHBvc2l0aW9uYCk7CisgICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlc1RvVXBkYXRlSW5Ob25CbG9ja2luZ0FjdGlvbjpBcnJheTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4gPSBuZXcgQXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+KCk7CisKKyAgICAgICAgICAgICAgICBfLmVhY2gobm9kZXNNb3ZlZCwgKG5vZGU6Q3kuQ29sbGVjdGlvbkZpcnN0Tm9kZSk9PiB7ICAvL3VwZGF0ZSBhbGwgbm9kZXMgbmV3IHBvc2l0aW9uCisKKyAgICAgICAgICAgICAgICAgICAgaWYobm9kZS5kYXRhKCkuaXNVY3BlUGFydCAmJiAhbm9kZS5kYXRhKCkuaXNVY3BlKXsgcmV0dXJuOyB9Ly9ObyBuZWVkIHRvIHVwZGF0ZSBVQ1BFLUNQcworCisgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQb3NpdGlvbjpDeS5Qb3NpdGlvbiA9IHRoaXMuY29tbW9uR3JhcGhVdGlscy5nZXROb2RlUG9zaXRpb24obm9kZSk7CisgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlLnVwZGF0ZVBvc2l0aW9uKG5ld1Bvc2l0aW9uLngsIG5ld1Bvc2l0aW9uLnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgbm9kZSBtb3ZlZCB0byBvciBmcm9tIFVDUEUKKyAgICAgICAgICAgICAgICAgICAgbGV0IHVjcGUgPSB0aGlzLmNvbW1vbkdyYXBoVXRpbHMuaXNJblVjcGUobm9kZS5jeSgpLCBub2RlLmJvdW5kaW5nYm94KCkpOworICAgICAgICAgICAgICAgICAgICBpZihub2RlLmRhdGEoKS5pc0luc2lkZUdyb3VwIHx8IHVjcGUubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVVjcGVDaGlsZE1vdmUobm9kZSwgdWNwZSwgaW5zdGFuY2VzVG9VcGRhdGVJbk5vbkJsb2NraW5nQWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlc1RvVXBkYXRlSW5Ob25CbG9ja2luZ0FjdGlvbi5wdXNoKG5vZGUuZGF0YSgpLmNvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VzVG9VcGRhdGVJbk5vbkJsb2NraW5nQWN0aW9uLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5HZW5lcmFsR3JhcGhVdGlscy5wdXNoTXVsdGlwbGVVcGRhdGVDb21wb25lbnRJbnN0YW5jZXNSZXF1ZXN0VG9RdWV1ZShmYWxzZSwgaW5zdGFuY2VzVG9VcGRhdGVJbk5vbkJsb2NraW5nQWN0aW9uLCBjb21wb25lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKGBjb21wb3NpdGlvbi1ncmFwaDo6bm90VmFsaWREcm9wOjogbm9kZSByZXR1cm4gdG8gbGF0ZXN0IHBvc2l0aW9uYCk7CisgICAgICAgICAgICAgICAgLy9yZXNldCBub2RlcyBwb3NpdGlvbgorICAgICAgICAgICAgICAgIG5vZGVzTW92ZWQucG9zaXRpb25zKChpLCBub2RlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgICAgICB4OiArbm9kZS5kYXRhKCkuY29tcG9uZW50SW5zdGFuY2UucG9zWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHk6ICtub2RlLmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZS5wb3NZCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5HZW5lcmFsR3JhcGhVdGlscy5nZXRHcmFwaFV0aWxzU2VydmVyVXBkYXRlUXVldWUoKS5hZGRCbG9ja2luZ1VJQWN0aW9uV2l0aFJlbGVhc2VDYWxsYmFjaygoKSA9PiB7CisgICAgICAgICAgICB9LCAoKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmhpZGVMb2FkZXIoJ2NvbXBvc2l0aW9uLWdyYXBoJyk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm9kZSBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkIGZyb20gVUNQRSBhbmQgdHJpZ2dlcnMgYXBwcm9wcmlhdGUgZXZlbnRzCisgICAgICAgICAqIEBwYXJhbSBub2RlIC0gbm9kZSBtb3ZlZAorICAgICAgICAgKiBAcGFyYW0gdWNwZUNvbnRhaW5lciAtIFVDUEUgY29udGFpbmVyIHRoYXQgdGhlIG5vZGUgaGFzIGJlZW4gbW92ZWQgdG8uIFdoZW4gbW92aW5nIGEgbm9kZSBvdXQgb2YgdWNwZSwgcGFyYW0gd2lsbCBiZSBlbXB0eQorICAgICAgICAgKiBAcGFyYW0gaW5zdGFuY2VzVG9VcGRhdGVJbk5vbkJsb2NraW5nQWN0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaGFuZGxlVWNwZUNoaWxkTW92ZShub2RlOkN5LkNvbGxlY3Rpb25GaXJzdE5vZGUsIHVjcGVDb250YWluZXI6Q3kuQ29sbGVjdGlvbkVsZW1lbnRzLCBpbnN0YW5jZXNUb1VwZGF0ZUluTm9uQmxvY2tpbmdBY3Rpb246QXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+KXsKKworICAgICAgICAgICAgaWYobm9kZS5kYXRhKCkuaXNJbnNpZGVHcm91cCl7CisgICAgICAgICAgICAgICAgaWYodWNwZUNvbnRhaW5lci5sZW5ndGgpeyAvL21vdmluZyBub2RlIHdpdGhpbiBVQ1BFLiBTaW1wbHkgdXBkYXRlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uR3JhcGhVdGlscy51cGRhdGVVY3BlQ2hpbGRQb3NpdGlvbig8Q3kuQ29sbGVjdGlvbk5vZGVzPm5vZGUsIHVjcGVDb250YWluZXIpOworICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNUb1VwZGF0ZUluTm9uQmxvY2tpbmdBY3Rpb24ucHVzaChub2RlLmRhdGEoKS5jb21wb25lbnRJbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy9yZW1vdmluZyBub2RlIGZyb20gVUNQRS4gTm90aWZ5IG9ic2VydmVycworICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLm5vdGlmeU9ic2VydmVycyhTZGMuVXRpbHMuQ29uc3RhbnRzLkdSQVBIX0VWRU5UUy5PTl9SRU1PVkVfTk9ERV9GUk9NX1VDUEUsIG5vZGUsIHVjcGVDb250YWluZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZighbm9kZS5kYXRhKCkuaXNJbnNpZGVHcm91cCAmJiB1Y3BlQ29udGFpbmVyLmxlbmd0aCAmJiAhbm9kZS5kYXRhKCkuaXNVY3BlUGFydCl7IC8vYWRkaW5nIG5vZGUgdG8gVUNQRQorICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFNkYy5VdGlscy5Db25zdGFudHMuR1JBUEhfRVZFTlRTLk9OX0lOU0VSVF9OT0RFX1RPX1VDUEUsIG5vZGUsIHVjcGVDb250YWluZXIsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIENvbXBvc2l0aW9uR3JhcGhOb2Rlc1V0aWxzLiRpbmplY3QgPSBbJ05vZGVzRmFjdG9yeScsICckbG9nJywgJ0NvbXBvc2l0aW9uR3JhcGhHZW5lcmFsVXRpbHMnLCAnQ29tbW9uR3JhcGhVdGlscycsICdFdmVudExpc3RlbmVyU2VydmljZScsICdMb2FkZXJTZXJ2aWNlJ107Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9tYXRjaC1jYXBhYmlsaXR5LXJlcXVpZXJtZW50LXV0aWxzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9jb21wb3NpdGlvbi1ncmFwaC91dGlscy9tYXRjaC1jYXBhYmlsaXR5LXJlcXVpZXJtZW50LXV0aWxzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNDAxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL3V0aWxzL21hdGNoLWNhcGFiaWxpdHktcmVxdWllcm1lbnQtdXRpbHMudHMKQEAgLTAsMCArMSwyNjUgQEAKKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMS8xLzIwMTcuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuR3JhcGguVXRpbHMgeworCisgICAgZXhwb3J0IGNsYXNzIE1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMgeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICB9CisKKworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbGlua2FibGUocmVxdWlyZW1lbnQxOk1vZGVscy5SZXF1aXJlbWVudCwgcmVxdWlyZW1lbnQyOk1vZGVscy5SZXF1aXJlbWVudCwgdmxDYXBhYmlsaXR5Ok1vZGVscy5DYXBhYmlsaXR5KTpib29sZWFuIHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmlzTWF0Y2gocmVxdWlyZW1lbnQxLCB2bENhcGFiaWxpdHkpICYmIE1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMuaXNNYXRjaChyZXF1aXJlbWVudDIsIHZsQ2FwYWJpbGl0eSk7CisgICAgICAgIH07CisKKworICAgICAgICAvKioKKyAgICAgICAgICogU2hvd3MgKyBpY29uIGluIGNvcm5lciBvZiBlYWNoIG5vZGUgcGFzc2VkIGluCisgICAgICAgICAqIEBwYXJhbSBmaWx0ZXJlZE5vZGVzRGF0YQorICAgICAgICAgKiBAcGFyYW0gY3kKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBoaWdobGlnaHRNYXRjaGluZ0NvbXBvbmVudHMoZmlsdGVyZWROb2Rlc0RhdGEsIGN5OkN5Lkluc3RhbmNlKSB7CisgICAgICAgICAgICBfLmVhY2goZmlsdGVyZWROb2Rlc0RhdGEsIChkYXRhOmFueSkgPT4geworICAgICAgICAgICAgICAgIGxldCBub2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoZGF0YS5pZCk7CisgICAgICAgICAgICAgICAgY3kuZW1pdCgnc2hvd2hhbmRsZScsIFtub2RlXSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIG9wYWNpdHkgdG8gZWFjaCBub2RlIHRoYXQgY2Fubm90IGJlIGxpbmtlZCB0byBob3ZlcmVkIG5vZGUKKyAgICAgICAgICogQHBhcmFtIGZpbHRlcmVkTm9kZXNEYXRhCisgICAgICAgICAqIEBwYXJhbSBub2Rlc0RhdGEKKyAgICAgICAgICogQHBhcmFtIGN5CisgICAgICAgICAqIEBwYXJhbSBob3ZlcmVkTm9kZURhdGEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmYWRlTm9uTWFjaGluZ0NvbXBvbmVudHMoZmlsdGVyZWROb2Rlc0RhdGEsIG5vZGVzRGF0YSwgY3k6Q3kuSW5zdGFuY2UsIGhvdmVyZWROb2RlRGF0YT8pIHsKKyAgICAgICAgICAgIGxldCBmYWRlTm9kZXMgPSBfLnhvcldpdGgobm9kZXNEYXRhLCBmaWx0ZXJlZE5vZGVzRGF0YSwgKG5vZGUxLCBub2RlMikgPT4geworICAgICAgICAgICAgICAgIHJldHVybiBub2RlMS5pZCA9PT0gbm9kZTIuaWQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChob3ZlcmVkTm9kZURhdGEpIHsKKyAgICAgICAgICAgICAgICBfLnJlbW92ZShmYWRlTm9kZXMsIGhvdmVyZWROb2RlRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjeS5iYXRjaCgoKT0+IHsKKyAgICAgICAgICAgICAgICBfLmVhY2goZmFkZU5vZGVzLCAobm9kZSkgPT4geworICAgICAgICAgICAgICAgICAgICBjeS5nZXRFbGVtZW50QnlJZChub2RlLmlkKS5zdHlsZSh7J2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eSc6IDAuNH0pOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSkKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNldHMgYWxsIG5vZGVzIHRvIHJlZ3VsYXIgb3BhY2l0eQorICAgICAgICAgKiBAcGFyYW0gY3kKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyByZXNldEZhZGVkTm9kZXMoY3k6Q3kuSW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGN5LmJhdGNoKCgpPT4geworICAgICAgICAgICAgICAgIGN5Lm5vZGVzKCkuc3R5bGUoeydiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHknOiAxfSk7CisgICAgICAgICAgICB9KQorICAgICAgICB9CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUFMTCBGVU5DVElPTlMgTkVFRCBSRUZBQ1RPUklORy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVxdWlyZW1lbnRGdWxmaWxsZWQoZnJvbU5vZGVJZDpzdHJpbmcsIHJlcXVpcmVtZW50OmFueSwgbGlua3M6QXJyYXk8TW9kZWxzLkNvbXBvc2l0aW9uQ2lMaW5rQmFzZT4pOmJvb2xlYW4geworICAgICAgICAgICAgcmV0dXJuIF8uc29tZShsaW5rcywgeworICAgICAgICAgICAgICAgICdyZWxhdGlvbic6IHsKKyAgICAgICAgICAgICAgICAgICAgJ2Zyb21Ob2RlJzogZnJvbU5vZGVJZCwKKyAgICAgICAgICAgICAgICAgICAgJ3JlbGF0aW9uc2hpcHMnOiBbeworICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50T3duZXJJZCc6IHJlcXVpcmVtZW50Lm93bmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyZW1lbnQnOiByZXF1aXJlbWVudC5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbGF0aW9uc2hpcCc6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6IHJlcXVpcmVtZW50LnJlbGF0aW9uc2hpcAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpc01hdGNoKHJlcXVpcmVtZW50Ok1vZGVscy5SZXF1aXJlbWVudCwgY2FwYWJpbGl0eTpNb2RlbHMuQ2FwYWJpbGl0eSk6Ym9vbGVhbiB7CisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eS50eXBlID09PSByZXF1aXJlbWVudC5jYXBhYmlsaXR5KSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVtZW50Lm5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY2FwYWJpbGl0eS5jYXBhYmlsaXR5U291cmNlcywgcmVxdWlyZW1lbnQubm9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZ2V0RnJvbVRvTWF0Y2hlcyhyZXF1aXJlbWVudHMxOk1vZGVscy5SZXF1aXJlbWVudHNHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50czI6TW9kZWxzLlJlcXVpcmVtZW50c0dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOk1vZGVscy5DYXBhYmlsaXRpZXNHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzOkFycmF5PE1vZGVscy5Db21wb3NpdGlvbkNpTGlua0Jhc2U+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUlkOnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvSWQ6c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxDYXBhYmlsaXR5PzpNb2RlbHMuQ2FwYWJpbGl0eSk6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4geworICAgICAgICAgICAgbGV0IG1hdGNoZXM6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4gPSBuZXcgQXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4oKTsKKyAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudHMxLCAocmVxdWlyZW1lbnRWYWx1ZTpBcnJheTxNb2RlbHMuUmVxdWlyZW1lbnQ+LCBrZXkpID0+IHsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2gocmVxdWlyZW1lbnRWYWx1ZSwgKHJlcXVpcmVtZW50Ok1vZGVscy5SZXF1aXJlbWVudCkgPT4geworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZW1lbnQubmFtZSAhPT0gImRlcGVuZGVuY3kiICYmICFNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLnJlcXVpcmVtZW50RnVsZmlsbGVkKGZyb21JZCwgcmVxdWlyZW1lbnQsIGxpbmtzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhcGFiaWxpdGllcywgKGNhcGFiaWxpdHlWYWx1ZTpBcnJheTxNb2RlbHMuQ2FwYWJpbGl0eT4sIGtleSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjYXBhYmlsaXR5VmFsdWUsIChjYXBhYmlsaXR5Ok1vZGVscy5DYXBhYmlsaXR5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmlzTWF0Y2gocmVxdWlyZW1lbnQsIGNhcGFiaWxpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2g6TW9kZWxzLk1hdGNoUmVxVG9DYXBhYmlsaXR5ID0gbmV3IE1vZGVscy5NYXRjaFJlcVRvQ2FwYWJpbGl0eShyZXF1aXJlbWVudCwgY2FwYWJpbGl0eSwgdHJ1ZSwgZnJvbUlkLCB0b0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZsQ2FwYWJpbGl0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudHMyLCAocmVxdWlyZW1lbnQyVmFsdWU6QXJyYXk8TW9kZWxzLlJlcXVpcmVtZW50Piwga2V5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudDJWYWx1ZSwgKHJlcXVpcmVtZW50MjpNb2RlbHMuUmVxdWlyZW1lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5yZXF1aXJlbWVudEZ1bGZpbGxlZCh0b0lkLCByZXF1aXJlbWVudDIsIGxpbmtzKSAmJiBNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLmxpbmthYmxlKHJlcXVpcmVtZW50LCByZXF1aXJlbWVudDIsIHZsQ2FwYWJpbGl0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2g6TW9kZWxzLk1hdGNoUmVxVG9SZXEgPSBuZXcgTW9kZWxzLk1hdGNoUmVxVG9SZXEocmVxdWlyZW1lbnQsIHJlcXVpcmVtZW50MiwgdHJ1ZSwgZnJvbUlkLCB0b0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZ2V0VG9Gcm9tTWF0Y2hlcyhyZXF1aXJlbWVudHM6TW9kZWxzLlJlcXVpcmVtZW50c0dyb3VwLCBjYXBhYmlsaXRpZXM6TW9kZWxzLkNhcGFiaWxpdGllc0dyb3VwLCBsaW5rczpBcnJheTxNb2RlbHMuQ29tcG9zaXRpb25DaUxpbmtCYXNlPiwgZnJvbUlkOnN0cmluZywgdG9JZDpzdHJpbmcpOkFycmF5PE1vZGVscy5NYXRjaFJlcVRvQ2FwYWJpbGl0eT4geworICAgICAgICAgICAgbGV0IG1hdGNoZXM6QXJyYXk8TW9kZWxzLk1hdGNoUmVxVG9DYXBhYmlsaXR5PiA9IFtdOworICAgICAgICAgICAgXy5mb3JFYWNoKHJlcXVpcmVtZW50cywgKHJlcXVpcmVtZW50VmFsdWU6QXJyYXk8TW9kZWxzLlJlcXVpcmVtZW50Piwga2V5KSA9PiB7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHJlcXVpcmVtZW50VmFsdWUsIChyZXF1aXJlbWVudDpNb2RlbHMuUmVxdWlyZW1lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVtZW50Lm5hbWUgIT09ICJkZXBlbmRlbmN5IiAmJiAhTWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5yZXF1aXJlbWVudEZ1bGZpbGxlZCh0b0lkLCByZXF1aXJlbWVudCwgbGlua3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goY2FwYWJpbGl0aWVzLCAoY2FwYWJpbGl0eVZhbHVlOkFycmF5PE1vZGVscy5DYXBhYmlsaXR5Piwga2V5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhcGFiaWxpdHlWYWx1ZSwgKGNhcGFiaWxpdHk6TW9kZWxzLkNhcGFiaWxpdHkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMuaXNNYXRjaChyZXF1aXJlbWVudCwgY2FwYWJpbGl0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaDpNb2RlbHMuTWF0Y2hSZXFUb0NhcGFiaWxpdHkgPSBuZXcgTW9kZWxzLk1hdGNoUmVxVG9DYXBhYmlsaXR5KHJlcXVpcmVtZW50LCBjYXBhYmlsaXR5LCBmYWxzZSwgdG9JZCwgZnJvbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGdldE1hdGNoZWRSZXF1aXJlbWVudHNDYXBhYmlsaXRpZXMoZnJvbUNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rczpBcnJheTxNb2RlbHMuQ29tcG9zaXRpb25DaUxpbmtCYXNlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmw/Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4gey8vVE9ETyBhbGxvdyBmb3IgVkwgYXJyYXkKKyAgICAgICAgICAgIGxldCBsaW5rQ2FwYWJpbGl0eTsKKyAgICAgICAgICAgIGlmICh2bCkgeworICAgICAgICAgICAgICAgIGxldCBsaW5rQ2FwYWJpbGl0aWVzOkFycmF5PE1vZGVscy5DYXBhYmlsaXR5PiA9IHZsLmNhcGFiaWxpdGllcy5maW5kVmFsdWVCeUtleSgnbGlua2FibGUnKTsKKyAgICAgICAgICAgICAgICBpZiAobGlua0NhcGFiaWxpdGllcykgeworICAgICAgICAgICAgICAgICAgICBsaW5rQ2FwYWJpbGl0eSA9IGxpbmtDYXBhYmlsaXRpZXNbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IGZyb21Ub01hdGNoZXM6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4gPSB0aGlzLmdldEZyb21Ub01hdGNoZXMoZnJvbUNvbXBvbmVudEluc3RhbmNlLnJlcXVpcmVtZW50cywKKyAgICAgICAgICAgICAgICB0b0NvbXBvbmVudEluc3RhbmNlLnJlcXVpcmVtZW50cywKKyAgICAgICAgICAgICAgICB0b0NvbXBvbmVudEluc3RhbmNlLmNhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICBsaW5rcywKKyAgICAgICAgICAgICAgICBmcm9tQ29tcG9uZW50SW5zdGFuY2UudW5pcXVlSWQsCisgICAgICAgICAgICAgICAgdG9Db21wb25lbnRJbnN0YW5jZS51bmlxdWVJZCwKKyAgICAgICAgICAgICAgICBsaW5rQ2FwYWJpbGl0eSk7CisgICAgICAgICAgICBsZXQgdG9Gcm9tTWF0Y2hlczpBcnJheTxNb2RlbHMuTWF0Y2hSZXFUb0NhcGFiaWxpdHk+ID0gdGhpcy5nZXRUb0Zyb21NYXRjaGVzKHRvQ29tcG9uZW50SW5zdGFuY2UucmVxdWlyZW1lbnRzLAorICAgICAgICAgICAgICAgIGZyb21Db21wb25lbnRJbnN0YW5jZS5jYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgbGlua3MsCisgICAgICAgICAgICAgICAgZnJvbUNvbXBvbmVudEluc3RhbmNlLnVuaXF1ZUlkLAorICAgICAgICAgICAgICAgIHRvQ29tcG9uZW50SW5zdGFuY2UudW5pcXVlSWQpOworCisgICAgICAgICAgICByZXR1cm4gZnJvbVRvTWF0Y2hlcy5jb25jYXQodG9Gcm9tTWF0Y2hlcyk7CisgICAgICAgIH0KKworCisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGVwIEk6IENoZWNrIGlmIGNhcGFiaWxpdGllcyBvZiBjb21wb25lbnQgbWF0Y2ggcmVxdWlyZW1lbnRzIG9mIG5vZGVEYXRhQXJyYXkKKyAgICAgICAgICogMS4gR2V0IGNvbXBvbmVudCBjYXBhYmlsaXRpZXMgYW5kIGxvb3Agb24gZWFjaCBjYXBhYmlsaXR5CisgICAgICAgICAqIDIuIEluc2lkZSB0aGUgbG9vcCwgcGVyZm9ybSBhbm90aGVyIGxvb3Agb24gYWxsIG5vZGVEYXRhQXJyYXksIGFuZCBmZXRjaCB0aGUgcmVxdWlyZW1lbnRzIGZvciBlYWNoIG9uZQorICAgICAgICAgKiAzLiBMb29wIG9uIHRoZSByZXF1aXJlbWVudHMsIGFuZCB2ZXJpZnkgbWF0Y2ggKHNlZSBpbiBjb2RlIHRoZSBydWxlcykKKyAgICAgICAgICoKKyAgICAgICAgICogU3RlcCBJSTogQ2hlY2sgaWYgcmVxdWlyZW1lbnRzIG9mIGNvbXBvbmVudCBtYXRjaCBjYXBhYmlsaXRpZXMgb2Ygbm9kZURhdGFBcnJheQorICAgICAgICAgKiAxLiBHZXQgY29tcG9uZW50IHJlcXVpcmVtZW50cyBhbmQgbG9vcCBvbiBlYWNoIHJlcXVpcmVtZW50CisgICAgICAgICAqIDIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb21wb25lbnQgICAgICAgICAtIHRoaXMgaXMgdGhlIGhvdmVyZWQgcmVzb3VyY2Ugb2YgdGhlIGxlZnQgcGFuZWwgb2YgY29tcG9zaXRpb24gc2NyZWVuCisgICAgICAgICAqIEBwYXJhbSBub2RlRGF0YUFycmF5ICAgICAtIEFycmF5IG9mIHJlc291cmNlIGluc3RhbmNlcyB0aGF0IGFyZSBvbiB0aGUgY2FudmFzCisgICAgICAgICAqIEBwYXJhbSBsaW5rcyAgICAgICAgICAgICAtZ2V0TWF0Y2hlZFJlcXVpcmVtZW50c0NhcGFiaWxpdGllcworICAgICAgICAgKiBAcGFyYW0gdmwgICAgICAgICAgICAgICAgLQorICAgICAgICAgKiBAcmV0dXJucyB7YW55W118VFtdfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmRCeU1hdGNoaW5nQ2FwYWJpbGl0aWVzVG9SZXF1aXJlbWVudHMoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZURhdGFBcnJheTpBcnJheTxNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVCYXNlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3M6QXJyYXk8TW9kZWxzLkNvbXBvc2l0aW9uQ2lMaW5rQmFzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsPzpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOkFycmF5PGFueT4gey8vVE9ETyBhbGxvdyBmb3IgVkwgYXJyYXkKKyAgICAgICAgICAgIGxldCByZXMgPSBbXTsKKworICAgICAgICAgICAgLy8gU1RFUCBJCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV0IGNhcGFiaWxpdGllczphbnkgPSBjb21wb25lbnQuY2FwYWJpbGl0aWVzOworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjYXBhYmlsaXRpZXMsIChjYXBhYmlsaXR5VmFsdWU6QXJyYXk8YW55PiwgY2FwYWJpbGl0eUtleSk9PiB7CisgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjYXBhYmlsaXR5VmFsdWUsIChjYXBhYmlsaXR5KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChub2RlRGF0YUFycmF5LCAobm9kZTpNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVCYXNlKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLmNvbXBvbmVudEluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXF1aXJlbWVudHM6YW55ID0gbm9kZS5jb21wb25lbnRJbnN0YW5jZS5yZXF1aXJlbWVudHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcm9tTm9kZUlkOnN0cmluZyA9IG5vZGUuY29tcG9uZW50SW5zdGFuY2UudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudHMsIChyZXF1aXJlbWVudFZhbHVlOkFycmF5PGFueT4sIHJlcXVpcmVtZW50S2V5KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudFZhbHVlLCAocmVxdWlyZW1lbnQpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlbWVudC5uYW1lICE9PSAiZGVwZW5kZW5jeSIgJiYgTWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5pc01hdGNoKHJlcXVpcmVtZW50LCBjYXBhYmlsaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhTWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5yZXF1aXJlbWVudEZ1bGZpbGxlZChmcm9tTm9kZUlkLCByZXF1aXJlbWVudCwgbGlua3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNURVAgSUkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZW1lbnRzOmFueSA9IGNvbXBvbmVudC5yZXF1aXJlbWVudHM7CisgICAgICAgICAgICAgICAgbGV0IGZyb21Ob2RlSWQ6c3RyaW5nID0gY29tcG9uZW50LnVuaXF1ZUlkOworICAgICAgICAgICAgICAgIGxldCBsaW5rQ2FwYWJpbGl0eTpBcnJheTxNb2RlbHMuQ2FwYWJpbGl0eT4gPSB2bCA/IHZsLmNhcGFiaWxpdGllcy5maW5kVmFsdWVCeUtleSgnbGlua2FibGUnKSA6IHVuZGVmaW5lZDsKKworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudHMsIChyZXF1aXJlbWVudFZhbHVlOkFycmF5PGFueT4sIHJlcXVpcmVtZW50S2V5KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHJlcXVpcmVtZW50VmFsdWUsIChyZXF1aXJlbWVudCk9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZW1lbnQubmFtZSAhPT0gImRlcGVuZGVuY3kiICYmICFNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLnJlcXVpcmVtZW50RnVsZmlsbGVkKGZyb21Ob2RlSWQsIHJlcXVpcmVtZW50LCBsaW5rcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZURhdGFBcnJheSwgKG5vZGU6YW55KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5jb21wb25lbnRJbnN0YW5jZSAmJiBub2RlLmNhdGVnb3J5ICE9PSAnZ3JvdXBDcCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYXBhYmlsaXRpZXM6YW55ID0gbm9kZS5jb21wb25lbnRJbnN0YW5jZS5jYXBhYmlsaXRpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goY2FwYWJpbGl0aWVzLCAoY2FwYWJpbGl0eVZhbHVlOkFycmF5PGFueT4sIGNhcGFiaWxpdHlLZXkpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjYXBhYmlsaXR5VmFsdWUsIChjYXBhYmlsaXR5KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMuaXNNYXRjaChyZXF1aXJlbWVudCwgY2FwYWJpbGl0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rQ2FwYWJpbGl0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rUmVxdWlyZW1lbnRzID0gbm9kZS5jb21wb25lbnRJbnN0YW5jZS5yZXF1aXJlbWVudHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGxpbmtSZXF1aXJlbWVudHMsICh2YWx1ZTpBcnJheTxhbnk+LCBrZXkpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2godmFsdWUsIChsaW5rUmVxdWlyZW1lbnQpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLnJlcXVpcmVtZW50RnVsZmlsbGVkKG5vZGUuY29tcG9uZW50SW5zdGFuY2UudW5pcXVlSWQsIGxpbmtSZXF1aXJlbWVudCwgbGlua3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgTWF0Y2hDYXBhYmlsaXRpZXNSZXF1aXJlbWVudHNVdGlscy5saW5rYWJsZShyZXF1aXJlbWVudCwgbGlua1JlcXVpcmVtZW50LCBsaW5rQ2FwYWJpbGl0eVswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBfLnVuaXEocmVzKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzLiRpbmplY3QgPSBbXTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2RlcGxveW1lbnQtZ3JhcGgvZGVwbG95bWVudC1ncmFwaC5kaXJlY3RpdmUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2RlcGxveW1lbnQtZ3JhcGgvZGVwbG95bWVudC1ncmFwaC5kaXJlY3RpdmUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkNGFlZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LWdyYXBoLmRpcmVjdGl2ZS50cwpAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiAxMi8xOS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworCisgICAgaW1wb3J0IFV0aWwgPSBqYXNtaW5lLlV0aWw7CisKKyAgICBpbnRlcmZhY2UgSURlcGxveW1lbnRHcmFwaFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRGVwbG95bWVudEdyYXBoIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisgICAgICAgIHByaXZhdGUgX2N5OkN5Lkluc3RhbmNlOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgTm9kZXNGYWN0b3J5OlV0aWxzLk5vZGVzRmFjdG9yeSwgcHJpdmF0ZSBjb21tb25HcmFwaFV0aWxzOkdyYXBoLlV0aWxzLkNvbW1vbkdyYXBoVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgZGVwbG95bWVudEdyYXBoR2VuZXJhbFV0aWxzOkdyYXBoLlV0aWxzLkRlcGxveW1lbnRHcmFwaEdlbmVyYWxVdGlscywgcHJpdmF0ZSBDb21wb25lbnRJbnN0YW5jZUZhY3Rvcnk6IFNkYy5VdGlscy5Db21wb25lbnRJbnN0YW5jZUZhY3RvcnkpIHsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3RyaWN0ID0gJ0UnOworICAgICAgICB0ZW1wbGF0ZVVybCA9ICcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LWdyYXBoLmh0bWwnOworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIGNvbXBvbmVudDogJz0nLAorICAgICAgICAgICAgaXNWaWV3T25seTogJz0nCisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9IChzY29wZTpJRGVwbG95bWVudEdyYXBoU2NvcGUsIGVsOkpRdWVyeSkgPT4geworICAgICAgICAgICAgaWYoc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSkgeworICAgICAgICAgICAgICAgIHRoaXMubG9hZEdyYXBoKHNjb3BlLCBlbCk7CisgICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckdyYXBoRXZlbnRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgaW5pdEdyYXBoTm9kZXMgPSAoY3k6Q3kuSW5zdGFuY2UsIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ncm91cHMpIHsgLy8gSW5pdCBtb2R1bGUgbm9kZXMKKyAgICAgICAgICAgICAgICBfLmVhY2goY29tcG9uZW50Lmdyb3VwcywgKGdyb3VwTW9kdWxlOk1vZGVscy5Nb2R1bGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IG1vZHVsZU5vZGUgPSB0aGlzLk5vZGVzRmFjdG9yeS5jcmVhdGVNb2R1bGVOb2RlKGdyb3VwTW9kdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tb25HcmFwaFV0aWxzLmFkZE5vZGVUb0dyYXBoKGN5LCBtb2R1bGVOb2RlKTsKKworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgXy5lYWNoKGNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMsIChpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSkgPT4geyAvLyBJbml0IGNvbXBvbmVudCBpbnN0YW5jZSBub2RlcworICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRJbnN0YW5jZU5vZGUgPSB0aGlzLk5vZGVzRmFjdG9yeS5jcmVhdGVOb2RlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZU5vZGUucGFyZW50ID0gdGhpcy5kZXBsb3ltZW50R3JhcGhHZW5lcmFsVXRpbHMuZmluZEluc3RhbmNlTW9kdWxlKGNvbXBvbmVudC5ncm91cHMsIGluc3RhbmNlLnVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50SW5zdGFuY2VOb2RlLnBhcmVudCkgeyAvLyB3ZSBhcmUgbm90IGRyYXdpbmcgaW5zdGFuY2VzIHRoYXQgYXJlIG5vdCBhIHBhcnQgb2YgYSBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1vbkdyYXBoVXRpbHMuYWRkQ29tcG9uZW50SW5zdGFuY2VOb2RlVG9HcmFwaChjeSwgY29tcG9uZW50SW5zdGFuY2VOb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgZnVuY3Rpb25hbGl0eSB0byBwYXNzIHRoZSBjeXRvc2NhcGUgZGVmYXVsdCBiZWhhdmlvciAtIHdlIGNhbid0IGNyZWF0ZSBQYXJlbnQgbW9kdWxlIG5vZGUgd2l0aG91dCBjaGlsZHJlbidzCisgICAgICAgICAgICAvLyBzbyB3ZSBtdXN0IGFkZCBhbiBlbXB0eSBkdW1teSBjaGlsZCBub2RlCisgICAgICAgICAgICBfLmVhY2godGhpcy5fY3kubm9kZXMoJ1s/aXNHcm91cF0nKSwgKG1vZHVsZU5vZGU6IEN5LkNvbGxlY3Rpb25GaXJzdE5vZGUpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZU5vZGUuaXNQYXJlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBsZXQgZHVtbXlJbnN0YW5jZSA9IHRoaXMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LmNyZWF0ZUVtcHR5Q29tcG9uZW50SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlTm9kZSA9IHRoaXMuTm9kZXNGYWN0b3J5LmNyZWF0ZU5vZGUoZHVtbXlJbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlTm9kZS5wYXJlbnQgPSBtb2R1bGVOb2RlLmlkKCk7CisgICAgICAgICAgICAgICAgICAgIGxldCBkdW1teU5vZGUgPSB0aGlzLmNvbW1vbkdyYXBoVXRpbHMuYWRkTm9kZVRvR3JhcGgoY3ksIGNvbXBvbmVudEluc3RhbmNlTm9kZSwgbW9kdWxlTm9kZS5wb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtbXlOb2RlLmFkZENsYXNzKCdkdW1teS1ub2RlJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHJlZ2lzdGVyR3JhcGhFdmVudHMoKSB7CisKKyAgICAgICAgICAgIHRoaXMuX2N5Lm9uKCdhZnRlckV4cGFuZCcsIChldmVudCkgPT4geworICAgICAgICAgICAgICAgIGV2ZW50LmN5VGFyZ2V0LnF0aXAoe30pOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHRoaXMuX2N5Lm9uKCdhZnRlckNvbGxhcHNlJywgKGV2ZW50KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5jb21tb25HcmFwaFV0aWxzLmluaXROb2RlVG9vbHRpcChldmVudC5jeVRhcmdldCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgbG9hZEdyYXBoID0gKHNjb3BlOklEZXBsb3ltZW50R3JhcGhTY29wZSwgZWw6SlF1ZXJ5KSA9PiB7CisKKyAgICAgICAgICAgIGxldCBncmFwaEVsID0gZWwuZmluZCgnLnNkYy1kZXBsb3ltZW50LWdyYXBoLXdyYXBwZXInKTsKKyAgICAgICAgICAgIHRoaXMuX2N5ID0gY3l0b3NjYXBlKHsKKyAgICAgICAgICAgICAgICBjb250YWluZXI6IGdyYXBoRWwsCisgICAgICAgICAgICAgICAgc3R5bGU6IFNkYy5HcmFwaC5VdGlscy5Db21wb25lbnRJbnRhbmNlTm9kZXNTdHlsZS5nZXRDb21wb3NpdGlvbkdyYXBoU3R5bGUoKS5jb25jYXQoU2RjLkdyYXBoLlV0aWxzLk1vZHVsZXNOb2Rlc1N0eWxlLmdldE1vZHVsZUdyYXBoU3R5bGUoKSksCisgICAgICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQ6IGZhbHNlLAorICAgICAgICAgICAgICAgIHNlbGVjdGlvblR5cGU6ICdzaW5nbGUnLAorCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy9hZGRpbmcgZXhwYW5kIGNvbGxhcHNlIGV4dGVuc2lvbiAKKyAgICAgICAgICAgIHRoaXMuX2N5LmV4cGFuZENvbGxhcHNlKHsKKyAgICAgICAgICAgICAgICBsYXlvdXRCeTogeworICAgICAgICAgICAgICAgICAgICBuYW1lOiAiZ3JpZCIsCisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGU6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIHJhbmRvbWl6ZTogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZpdDogdHJ1ZQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZmlzaGV5ZTogZmFsc2UsCisgICAgICAgICAgICAgICAgdW5kb2FibGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGV4cGFuZENvbGxhcHNlQ3VlU2l6ZTogMTgsCisgICAgICAgICAgICAgICAgZXhwYW5kQ3VlSW1hZ2U6IFNkYy5VdGlscy5Db25zdGFudHMuSU1BR0VfUEFUSCArICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy8nICsgJ2Nsb3NlTW9kdWxlLnBuZycsCisgICAgICAgICAgICAgICAgY29sbGFwc2VDdWVJbWFnZTogU2RjLlV0aWxzLkNvbnN0YW50cy5JTUFHRV9QQVRIICsgJy9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zLycgKyAnb3Blbk1vZHVsZS5wbmcnLAorICAgICAgICAgICAgICAgIGV4cGFuZENvbGxhcHNlQ3VlU2Vuc2l0aXZpdHk6IDIsCisgICAgICAgICAgICAgICAgY3VlT2Zmc2V0OiAtMjAKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLmluaXRHcmFwaE5vZGVzKHRoaXMuX2N5LCBzY29wZS5jb21wb25lbnQpOyAvL2NyZWF0aW5nIGluc3RhbmNlcyBub2RlcworICAgICAgICAgICAgdGhpcy5jb21tb25HcmFwaFV0aWxzLmluaXRHcmFwaExpbmtzKHRoaXMuX2N5LCBzY29wZS5jb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKTsKKyAgICAgICAgICAgIHRoaXMuX2N5LmNvbGxhcHNlQWxsKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKE5vZGVzRmFjdG9yeTpVdGlscy5Ob2Rlc0ZhY3RvcnksIENvbW1vbkdyYXBoVXRpbHM6R3JhcGguVXRpbHMuQ29tbW9uR3JhcGhVdGlscywgRGVwbG95bWVudEdyYXBoR2VuZXJhbFV0aWxzOkdyYXBoLlV0aWxzLkRlcGxveW1lbnRHcmFwaEdlbmVyYWxVdGlscywgQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5OiBVdGlscy5Db21wb25lbnRJbnN0YW5jZUZhY3RvcnkpID0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGVwbG95bWVudEdyYXBoKE5vZGVzRmFjdG9yeSwgQ29tbW9uR3JhcGhVdGlscywgRGVwbG95bWVudEdyYXBoR2VuZXJhbFV0aWxzLCBDb21wb25lbnRJbnN0YW5jZUZhY3RvcnkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZXBsb3ltZW50R3JhcGguZmFjdG9yeS4kaW5qZWN0ID0gWydOb2Rlc0ZhY3RvcnknLCAnQ29tbW9uR3JhcGhVdGlscycsICdEZXBsb3ltZW50R3JhcGhHZW5lcmFsVXRpbHMnLCAnQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5J107Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9kZXBsb3ltZW50LWdyYXBoL2RlcGxveW1lbnQtZ3JhcGguaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LWdyYXBoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMWMxMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LWdyYXBoLmh0bWwKQEAgLTAsMCArMSwyIEBACis8ZGl2ICBjbGFzcz0ic2RjLWRlcGxveW1lbnQtZ3JhcGgtd3JhcHBlciIgIG5nLWNsYXNzPSJ7J3ZpZXctb25seSc6aXNWaWV3T25seX0iPgorPC9kaXY+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9kZXBsb3ltZW50LWdyYXBoL2RlcGxveW1lbnQtZ3JhcGgubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LWdyYXBoLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4ZmM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LWdyYXBoLmxlc3MKQEAgLTAsMCArMSwxNCBAQAorZGVwbG95bWVudC1ncmFwaCB7CisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6MTAwJTsKKyAgd2lkdGg6IDEwMCU7CisKKyAgLnNkYy1kZXBsb3ltZW50LWdyYXBoLXdyYXBwZXIgeworICAgIGhlaWdodDoxMDAlOworICAgIHdpZHRoOiAxMDAlOworICB9CisKKyAgLnZpZXctb25seXsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOnJnYigyNDgsIDI0OCwgMjQ4KTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LXV0aWxzL2RlcGxveW1lbnQtZ3JhcGgtZ2VuZXJhbC11dGlscy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvZGVwbG95bWVudC1ncmFwaC9kZXBsb3ltZW50LXV0aWxzL2RlcGxveW1lbnQtZ3JhcGgtZ2VuZXJhbC11dGlscy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ5ZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9kZXBsb3ltZW50LWdyYXBoL2RlcGxveW1lbnQtdXRpbHMvZGVwbG95bWVudC1ncmFwaC1nZW5lcmFsLXV0aWxzLnRzCkBAIC0wLDAgKzEsMjQgQEAKKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMTIvMjEvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5HcmFwaC5VdGlscyB7CisKKyAgICBleHBvcnQgY2xhc3MgRGVwbG95bWVudEdyYXBoR2VuZXJhbFV0aWxzIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmRJbnN0YW5jZU1vZHVsZSA9IChncm91cHNBcnJheTpBcnJheTxNb2RlbHMuTW9kdWxlPiwgY29tcG9uZW50SW5zdGFuY2VJZDpzdHJpbmcpOnN0cmluZyA9PiB7CisgICAgICAgICAgICBsZXQgcGFyZW50R3JvdXA6U2RjLk1vZGVscy5Nb2R1bGUgPSBfLmZpbmQoZ3JvdXBzQXJyYXksIChncm91cDpTZGMuTW9kZWxzLk1vZHVsZSkgPT4geworICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbmQoZ3JvdXAubWVtYmVycywgKG1lbWJlcikgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyID09PSBjb21wb25lbnRJbnN0YW5jZUlkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50R3JvdXAgPyBwYXJlbnRHcm91cC51bmlxdWVJZCA6ICIiOworICAgICAgICB9OworICAgIH0KKworICAgIERlcGxveW1lbnRHcmFwaEdlbmVyYWxVdGlscy4kaW5qZWN0ID0gW107Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9pbWFnZS1jcmVhdG9yL2ltYWdlLWNyZWF0b3Iuc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvaW1hZ2UtY3JlYXRvci9pbWFnZS1jcmVhdG9yLnNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiMTdlMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvaW1hZ2UtY3JlYXRvci9pbWFnZS1jcmVhdG9yLnNlcnZpY2UudHMKQEAgLTAsMCArMSw0NiBAQAorbW9kdWxlIFNkYy5VdGlscyB7CisgICAgZXhwb3J0IGNsYXNzIEltYWdlQ3JlYXRvclNlcnZpY2UgeworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWyckcSddOworICAgICAgICBwcml2YXRlIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50OworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHE6IG5nLklRU2VydmljZSkgeworICAgICAgICAgICAgdGhpcy5fY2FudmFzID0gPEhUTUxDYW52YXNFbGVtZW50PiQoJzxjYW52YXM+JylbMF07CisgICAgICAgICAgICB0aGlzLl9jYW52YXMuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5Om5vbmUnKTsKKworICAgICAgICAgICAgbGV0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdOworICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgZ2V0SW1hZ2VCYXNlNjQoaW1hZ2VCYXNlVXJpOiBzdHJpbmcsIGltYWdlTGF5ZXJVcmk6IHN0cmluZyk6IG5nLklQcm9taXNlPHN0cmluZz4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IGltYWdlQmFzZSA9IG5ldyBJbWFnZSgpOworICAgICAgICAgICAgbGV0IGltYWdlTGF5ZXIgPSBuZXcgSW1hZ2UoKTsKKyAgICAgICAgICAgIGxldCBpbWFnZXNMb2FkZWQgPSAwOworICAgICAgICAgICAgbGV0IG9uSW1hZ2VMb2FkZWQgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgaW1hZ2VzTG9hZGVkKys7CisKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzTG9hZGVkIDwgMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgaW1hZ2VCYXNlLndpZHRoLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGltYWdlQmFzZS5oZWlnaHQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICBsZXQgY2FudmFzQ3R4ID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJyk7CisgICAgICAgICAgICAgICAgY2FudmFzQ3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLl9jYW52YXMud2lkdGgsIHRoaXMuX2NhbnZhcy5oZWlnaHQpOworCisgICAgICAgICAgICAgICAgY2FudmFzQ3R4LmRyYXdJbWFnZShpbWFnZUJhc2UsIDAsIDAsIGltYWdlQmFzZS53aWR0aCwgaW1hZ2VCYXNlLmhlaWdodCk7CisgICAgICAgICAgICAgICAgY2FudmFzQ3R4LmRyYXdJbWFnZShpbWFnZUxheWVyLCBpbWFnZUJhc2Uud2lkdGggLSBpbWFnZUxheWVyLndpZHRoLCAwLCBpbWFnZUxheWVyLndpZHRoLCBpbWFnZUxheWVyLmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBsZXQgYmFzZTY0SW1hZ2UgPSB0aGlzLl9jYW52YXMudG9EYXRhVVJMKCk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShiYXNlNjRJbWFnZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpbWFnZUJhc2Uub25sb2FkID0gb25JbWFnZUxvYWRlZDsKKyAgICAgICAgICAgIGltYWdlTGF5ZXIub25sb2FkID0gb25JbWFnZUxvYWRlZDsKKyAgICAgICAgICAgIGltYWdlQmFzZS5zcmMgPSBpbWFnZUJhc2VVcmk7CisgICAgICAgICAgICBpbWFnZUxheWVyLnNyYyA9IGltYWdlTGF5ZXJVcmk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvcGFsZXR0ZS9pbnRlcmZhY2VzL2ktZHJhZ2Ryb3AtZXZlbnQuZC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvcGFsZXR0ZS9pbnRlcmZhY2VzL2ktZHJhZ2Ryb3AtZXZlbnQuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmMwNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9wYWxldHRlL2ludGVyZmFjZXMvaS1kcmFnZHJvcC1ldmVudC5kLnRzCkBAIC0wLDAgKzEsNyBAQAoraW50ZXJmYWNlIElEcmFnRHJvcEV2ZW50IGV4dGVuZHMgSlF1ZXJ5RXZlbnRPYmplY3QgeworICAgIGRhdGFUcmFuc2ZlcjogYW55OworICAgIHRvRWxlbWVudDogeworICAgICAgICBuYXR1cmFsV2lkdGg6IG51bWJlcjsKKyAgICAgICAgbmF0dXJhbEhlaWdodDogbnVtYmVyOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3BhbGV0dGUvcGFsZXR0ZS5kaXJlY3RpdmUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3BhbGV0dGUvcGFsZXR0ZS5kaXJlY3RpdmUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwZGE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvcGFsZXR0ZS9wYWxldHRlLmRpcmVjdGl2ZS50cwpAQCAtMCwwICsxLDMyNyBAQAorLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgIGltcG9ydCBEaWN0aW9uYXJ5ID0gU2RjLlV0aWxzLkRpY3Rpb25hcnk7CisgICAgaW1wb3J0IEdSQVBIX0VWRU5UUyA9IFNkYy5VdGlscy5Db25zdGFudHMuR1JBUEhfRVZFTlRTOworICAgIGltcG9ydCBJbWFnZUNyZWF0b3JTZXJ2aWNlID0gU2RjLlV0aWxzLkltYWdlQ3JlYXRvclNlcnZpY2U7CisgICAgaW50ZXJmYWNlIElQYWxldHRlU2NvcGUgeworICAgICAgICBjb21wb25lbnRzOiBhbnk7CisgICAgICAgIGN1cnJlbnRDb21wb25lbnQ6IGFueTsKKyAgICAgICAgbW9kZWw6IGFueTsKKyAgICAgICAgZGlzcGxheVNvcnRlZENhdGVnb3JpZXM6IGFueTsKKyAgICAgICAgZXhwYW5kZWRTZWN0aW9uOiBzdHJpbmc7CisKKyAgICAgICAgcDJwVkw6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgbXAybXBWTDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICB2bFR5cGU6IHN0cmluZzsKKyAgICAgICAgZHJhZ0VsZW1lbnQ6IEpRdWVyeTsKKyAgICAgICAgZHJhZ2JsZU5vZGU6IHsKKyAgICAgICAgICAgIGV2ZW50OiBKUXVlcnlFdmVudE9iamVjdCwKKyAgICAgICAgICAgIGNvbXBvbmVudHM6IE1vZGVscy5EaXNwbGF5Q29tcG9uZW50LAorICAgICAgICAgICAgdWk6IGFueQorICAgICAgICB9CisKKyAgICAgICAgc2VjdGlvbkNsaWNrOiAoc2VjdGlvbjogc3RyaW5nKT0+dm9pZDsKKyAgICAgICAgc2VhcmNoQ29tcG9uZW50czogKHNlYXJjaFRleHQ6IHN0cmluZyk9PnZvaWQ7CisgICAgICAgIG9uTW91c2VPdmVyOiAoZGlzcGxheUNvbXBvbmVudDogTW9kZWxzLkRpc3BsYXlDb21wb25lbnQpPT52b2lkOworICAgICAgICBvbk1vdXNlT3V0OiAoZGlzcGxheUNvbXBvbmVudDogTW9kZWxzLkRpc3BsYXlDb21wb25lbnQpPT52b2lkOworICAgICAgICBkcmFnU3RhcnRDYWxsYmFjazogKGV2ZW50OiBKUXVlcnlFdmVudE9iamVjdCwgdWksIGRpc3BsYXlDb21wb25lbnQ6IE1vZGVscy5EaXNwbGF5Q29tcG9uZW50KT0+dm9pZDsKKyAgICAgICAgZHJhZ1N0b3BDYWxsYmFjazogKCk9PnZvaWQ7CisgICAgICAgIG9uRHJhZ0NhbGxiYWNrOiAoZXZlbnQ6SlF1ZXJ5RXZlbnRPYmplY3QpID0+IHZvaWQ7CisgICAgICAgIHNldEVsZW1lbnRUZW1wbGF0ZTogKGU6IEpRdWVyeUV2ZW50T2JqZWN0KT0+dm9pZDsKKworICAgICAgICBpc09uRHJhZzogYm9vbGVhbjsKKyAgICAgICAgaXNEcmFnYWJsZTogYm9vbGVhbjsKKyAgICAgICAgaXNMb2FkaW5nOiBib29sZWFuOworICAgICAgICBpc1ZpZXdPbmx5OiBib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBQYWxldHRlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJGxvZzogbmcuSUxvZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEluc3RhbmNlRmFjdG9yeTogVXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE5vZGVzRmFjdG9yeTogVXRpbHMuTm9kZXNGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvc2l0aW9uR3JhcGhHZW5lcmFsVXRpbHM6IEdyYXBoLlV0aWxzLkNvbXBvc2l0aW9uR3JhcGhHZW5lcmFsVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgRXZlbnRMaXN0ZW5lclNlcnZpY2U6IFNlcnZpY2VzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY01lbnU6IE1vZGVscy5JQXBwTWVudSkgeworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZldGNoaW5nQ29tcG9uZW50RnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlOworICAgICAgICBwcml2YXRlIG5vZGVIdG1sU3Vic3RpdHV0ZTogSlF1ZXJ5OworCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgY29tcG9uZW50czogJz0nLAorICAgICAgICAgICAgY3VycmVudENvbXBvbmVudDogJz0nLAorICAgICAgICAgICAgaXNWaWV3T25seTogJz0nLAorICAgICAgICAgICAgaXNMb2FkaW5nOiAnPScKKyAgICAgICAgfTsKKyAgICAgICAgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHRlbXBsYXRlVXJsID0gJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9wYWxldHRlL3BhbGV0dGUuaHRtbCc7CisKKyAgICAgICAgbGluayA9IChzY29wZTogSVBhbGV0dGVTY29wZSwgZWw6IEpRdWVyeSkgPT4geworICAgICAgICAgICAgdGhpcy5ub2RlSHRtbFN1YnN0aXR1dGUgPSAkKCc8ZGl2IGNsYXNzPSJub2RlLXN1YnN0aXR1dGUiPjxzcGFuPjwvc3Bhbj48aW1nIC8+PC9kaXY+Jyk7CisgICAgICAgICAgICBlbC5hcHBlbmQodGhpcy5ub2RlSHRtbFN1YnN0aXR1dGUpOworCisgICAgICAgICAgICB0aGlzLmluaXRDb21wb25lbnRzKHNjb3BlKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlVmxzKHNjb3BlKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cyhzY29wZSk7CisgICAgICAgICAgICB0aGlzLmluaXREcmFnRXZlbnRzKHNjb3BlKTsKKyAgICAgICAgICAgIHRoaXMuX2luaXRFeHBhbmRlZFNlY3Rpb24oc2NvcGUsICcnKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGxlZnRQYW5lbFJlc291cmNlRmlsdGVyKHJlc291cmNlc05vdEFic3RyYWN0OiBBcnJheTxNb2RlbHMuRGlzcGxheUNvbXBvbmVudD4sIHJlc291cmNlRmlsdGVyVHlwZXM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxNb2RlbHMuRGlzcGxheUNvbXBvbmVudD4geworICAgICAgICAgICAgbGV0IGZpbHRlclJlc291cmNlcyA9IF8uZmlsdGVyKHJlc291cmNlc05vdEFic3RyYWN0LCAoY29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlRmlsdGVyVHlwZXMuaW5kZXhPZihjb21wb25lbnQuZ2V0Q29tcG9uZW50U3ViVHlwZSgpKSA+IC0xOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyUmVzb3VyY2VzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0TGVmdFBhbmVsKGxlZnRQYW5lbENvbXBvbmVudHM6IEFycmF5PE1vZGVscy5EaXNwbGF5Q29tcG9uZW50PiwgcmVzb3VyY2VGaWx0ZXJUeXBlczogQXJyYXk8c3RyaW5nPik6IE1vZGVscy5MZWZ0UGFuZWxNb2RlbCB7CisgICAgICAgICAgICBsZXQgbGVmdFBhbmVsTW9kZWwgPSBuZXcgTW9kZWxzLkxlZnRQYW5lbE1vZGVsKCk7CisKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZUZpbHRlclR5cGVzICYmIHJlc291cmNlRmlsdGVyVHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbGVmdFBhbmVsQ29tcG9uZW50cyA9IHRoaXMubGVmdFBhbmVsUmVzb3VyY2VGaWx0ZXIobGVmdFBhbmVsQ29tcG9uZW50cywgcmVzb3VyY2VGaWx0ZXJUeXBlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZWZ0UGFuZWxNb2RlbC5udW1iZXJPZkVsZW1lbnRzID0gbGVmdFBhbmVsQ29tcG9uZW50cyAmJiBsZWZ0UGFuZWxDb21wb25lbnRzLmxlbmd0aCB8fCAwOworCisgICAgICAgICAgICBpZiAobGVmdFBhbmVsQ29tcG9uZW50cyAmJiBsZWZ0UGFuZWxDb21wb25lbnRzLmxlbmd0aCkgeworCisgICAgICAgICAgICAgICAgbGV0IGNhdGVnb3JpZXM6IGFueSA9IF8uZ3JvdXBCeShsZWZ0UGFuZWxDb21wb25lbnRzLCAnbWFpbkNhdGVnb3J5Jyk7CisgICAgICAgICAgICAgICAgZm9yIChsZXQgY2F0ZWdvcnkgaW4gY2F0ZWdvcmllcykKKyAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllc1tjYXRlZ29yeV0gPSBfLmdyb3VwQnkoY2F0ZWdvcmllc1tjYXRlZ29yeV0sICdzdWJDYXRlZ29yeScpOworCisgICAgICAgICAgICAgICAgbGVmdFBhbmVsTW9kZWwuc29ydGVkQ2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVmdFBhbmVsTW9kZWw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRTY29wZVZscyhzY29wZTogSVBhbGV0dGVTY29wZSk6IHZvaWQgeworICAgICAgICAgICAgbGV0IHZscyA9IHRoaXMuTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlLmdldEZ1bGxEYXRhQ29tcG9uZW50TGlzdChVdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZMKTsKKyAgICAgICAgICAgIHNjb3BlLnZsVHlwZSA9IG51bGw7CisgICAgICAgICAgICB2bHMuZm9yRWFjaCgoaXRlbSkgPT4geworICAgICAgICAgICAgICAgIGxldCBrZXkgPSBfLmZpbmQoT2JqZWN0LmtleXMoaXRlbS5jYXBhYmlsaXRpZXMpLCAoa2V5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmluY2x1ZGVzKGtleS50b0xvd2VyQ2FzZSgpLCAnbGlua2FibGUnKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBsZXQgbGlua2FibGUgPSBpdGVtLmNhcGFiaWxpdGllc1trZXldOworICAgICAgICAgICAgICAgIGlmIChsaW5rYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGlua2FibGVbMF0ubWF4T2NjdXJyZW5jZXMgPT0gJzInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5wMnBWTCA9IF8uZmluZCh2bHMsIChjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQudW5pcXVlSWQgPT09IGl0ZW0udW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugey8vYXNzdW1pbmcgdW5ib3VuZGVkIG9jY3VycmVuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tcDJtcFZMID0gXy5maW5kKHZscywgKGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC51bmlxdWVJZCA9PT0gaXRlbS51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0RXZlbnRzKHNjb3BlOiBJUGFsZXR0ZVNjb3BlKSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gc2VjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzY29wZS5zZWN0aW9uQ2xpY2sgPSAoc2VjdGlvbjogc3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24gPT09IHNjb3BlLmV4cGFuZGVkU2VjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBzY29wZS5leHBhbmRlZFNlY3Rpb24gPSAnJzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZS5leHBhbmRlZFNlY3Rpb24gPSBzZWN0aW9uOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUub25Nb3VzZU92ZXIgPSAoZGlzcGxheUNvbXBvbmVudDogTW9kZWxzLkRpc3BsYXlDb21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuaXNPbkRyYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZS5pc09uRHJhZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB0aGlzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLm5vdGlmeU9ic2VydmVycyhHUkFQSF9FVkVOVFMuT05fUEFMRVRURV9DT01QT05FTlRfSE9WRVJfSU4sIGRpc3BsYXlDb21wb25lbnQpOworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygncGFsZXR0ZTo6b25Nb3VzZU92ZXI6OiBmaXJlZCcpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscy5jb21wb25lbnRSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXNDYWNoaW5nLmNvbnRhaW5zS2V5KGRpc3BsYXlDb21wb25lbnQudW5pcXVlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZyhgcGFsZXR0ZTo6b25Nb3VzZU92ZXI6OiBjb21wb25lbnQgaWQgJHtkaXNwbGF5Q29tcG9uZW50LnVuaXF1ZUlkfSBmb3VuZCBpbiBjYWNoZWApOworICAgICAgICAgICAgICAgICAgICBsZXQgY2FjaGVDb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IHRoaXMuQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscy5jb21wb25lbnRSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXNDYWNoaW5nLmdldFZhbHVlKGRpc3BsYXlDb21wb25lbnQudW5pcXVlSWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogRGFubnk6IGZpcmUgZXZlbnQgdG8gaGlnaGxpZ2h0IG1hdGNoaW5nIG5vZGVzCisgICAgICAgICAgICAgICAgICAgIC8vc2hvd01hdGNoaW5nTm9kZXMoY2FjaGVDb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKGBwYWxldHRlOjpvbk1vdXNlT3Zlcjo6IGNvbXBvbmVudCBpZCAke2Rpc3BsYXlDb21wb25lbnQudW5pcXVlSWR9IG5vdCBmb3VuZCBpbiBjYWNoZSwgaW5pdGlhdGluZyBzZXJ2ZXIgZ2V0YCk7CisgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJyaW5nIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgc2VydmVyIGluY2x1ZGluZyByZXF1aXJlbWVudHMgYW5kIGNhcGFiaWxpdGllcworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgZG8gbm90IGZldGNoIG1hbnkgdGltZXMsIGJlY2F1c2Ugb25seSBpbiB0aGUgc3VjY2VzcyB3ZSBhZGQgdGhlIGNvbXBvbmVudCB0byBjb21wb25lbnRSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXNDYWNoaW5nCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmV0Y2hpbmdDb21wb25lbnRGcm9tU2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLmZldGNoaW5nQ29tcG9uZW50RnJvbVNlcnZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5Db21wb25lbnRGYWN0b3J5LmdldENvbXBvbmVudEZyb21TZXJ2ZXIoZGlzcGxheUNvbXBvbmVudC5jb21wb25lbnRTdWJUeXBlLCBkaXNwbGF5Q29tcG9uZW50LnVuaXF1ZUlkKQorICAgICAgICAgICAgICAgICAgICAudGhlbigoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZyhgcGFsZXR0ZTo6b25Nb3VzZU92ZXI6OiBjb21wb25lbnQgaWQgJHtkaXNwbGF5Q29tcG9uZW50LnVuaXF1ZUlkfSBmZXRjaCBzdWNjZXNzYCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxlZnRQYWxldHRlTG9hZGVyU2VydmljZS51cGRhdGVTcGVjaWZpY0NvbXBvbmVudExlZnRQYWxldHRlKGNvbXBvbmVudCwgc2NvcGUuY3VycmVudENvbXBvbmVudC5jb21wb25lbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ29tcG9zaXRpb25HcmFwaEdlbmVyYWxVdGlscy5jb21wb25lbnRSZXF1aXJlbWVudHNBbmRDYXBhYmlsaXRpZXNDYWNoaW5nLnNldFZhbHVlKGNvbXBvbmVudC51bmlxdWVJZCwgY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hpbmdDb21wb25lbnRGcm9tU2VydmVyID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogRGFubnk6IGZpcmUgZXZlbnQgdG8gaGlnaGxpZ2h0IG1hdGNoaW5nIG5vZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAvL3Nob3dNYXRjaGluZ05vZGVzKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoJ3BhbGV0dGU6Om9uTW91c2VPdmVyOjogY29tcG9uZW50IGlkIGZldGNoIGVycm9yJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoaW5nQ29tcG9uZW50RnJvbVNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9KTsKKworCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5vbk1vdXNlT3V0ID0gKCkgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmlzT25EcmFnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy5FdmVudExpc3RlbmVyU2VydmljZS5ub3RpZnlPYnNlcnZlcnMoR1JBUEhfRVZFTlRTLk9OX1BBTEVUVEVfQ09NUE9ORU5UX0hPVkVSX09VVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRDb21wb25lbnRzKHNjb3BlOiBJUGFsZXR0ZVNjb3BlKSB7CisgICAgICAgICAgICBzY29wZS5zZWFyY2hDb21wb25lbnRzID0gKHNlYXJjaFRleHQ6IGFueSk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BsYXlTb3J0ZWRDYXRlZ29yaWVzID0gdGhpcy5fc2VhcmNoQ29tcG9uZW50cyhzZWFyY2hUZXh0LCBzY29wZS5tb2RlbC5zb3J0ZWRDYXRlZ29yaWVzKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbml0RXhwYW5kZWRTZWN0aW9uKHNjb3BlLCBzZWFyY2hUZXh0KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmlzRHJhZ2FibGUgPSBzY29wZS5jdXJyZW50Q29tcG9uZW50LmlzQ29tcGxleCgpOworICAgICAgICAgICAgbGV0IGVudGl0eVR5cGU6IHN0cmluZyA9IHNjb3BlLmN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50VHlwZS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgbGV0IHJlc291cmNlRmlsdGVyVHlwZXM6IEFycmF5PHN0cmluZz4gPSB0aGlzLnNkY0NvbmZpZy5yZXNvdXJjZVR5cGVzRmlsdGVyW2VudGl0eVR5cGVdOworCisgICAgICAgICAgICBzY29wZS5jb21wb25lbnRzID0gdGhpcy5MZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UuZ2V0TGVmdFBhbmVsQ29tcG9uZW50c0ZvckRpc3BsYXkoc2NvcGUuY3VycmVudENvbXBvbmVudC5jb21wb25lbnRUeXBlKTsKKyAgICAgICAgICAgIHNjb3BlLm1vZGVsID0gdGhpcy5pbml0TGVmdFBhbmVsKHNjb3BlLmNvbXBvbmVudHMsIHJlc291cmNlRmlsdGVyVHlwZXMpOworICAgICAgICAgICAgc2NvcGUuZGlzcGxheVNvcnRlZENhdGVnb3JpZXMgPSBhbmd1bGFyLmNvcHkoc2NvcGUubW9kZWwuc29ydGVkQ2F0ZWdvcmllcyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIF9pbml0RXhwYW5kZWRTZWN0aW9uKHNjb3BlOiBJUGFsZXR0ZVNjb3BlLCBzZWFyY2hUZXh0OiBzdHJpbmcpOiB2b2lkIHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hUZXh0ID09ICcnKSB7CisgICAgICAgICAgICAgICAgbGV0IGlzQ29udGFpbmluZ0NhdGVnb3J5OiBib29sZWFuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbGV0IGNhdGVnb3J5VG9FeHBhbmQ6IHN0cmluZzsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY3VycmVudENvbXBvbmVudCAmJiBzY29wZS5jdXJyZW50Q29tcG9uZW50LmNhdGVnb3JpZXMgJiYgc2NvcGUuY3VycmVudENvbXBvbmVudC5jYXRlZ29yaWVzWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5VG9FeHBhbmQgPSB0aGlzLnNkY01lbnUuY2F0ZWdvcmllc0RpY3Rpb25hcnlbc2NvcGUuY3VycmVudENvbXBvbmVudC5jYXRlZ29yaWVzWzBdLm5hbWVdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjYXRlZ29yeSBpbiBzY29wZS5tb2RlbC5zb3J0ZWRDYXRlZ29yaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlUb0V4cGFuZCA9PSBjYXRlZ29yeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29udGFpbmluZ0NhdGVnb3J5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc0NvbnRhaW5pbmdDYXRlZ29yeSA/IHNjb3BlLmV4cGFuZGVkU2VjdGlvbiA9IGNhdGVnb3J5VG9FeHBhbmQgOiBzY29wZS5leHBhbmRlZFNlY3Rpb24gPSAnR2VuZXJpYyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY29wZS5leHBhbmRlZFNlY3Rpb24gPSBPYmplY3Qua2V5cyhzY29wZS5kaXNwbGF5U29ydGVkQ2F0ZWdvcmllcykuc29ydCgpWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdERyYWdFdmVudHMoc2NvcGU6IElQYWxldHRlU2NvcGUpIHsKKyAgICAgICAgICAgIHNjb3BlLmRyYWdTdGFydENhbGxiYWNrID0gKGV2ZW50OiBJRHJhZ0Ryb3BFdmVudCwgdWksIGRpc3BsYXlDb21wb25lbnQ6IE1vZGVscy5EaXNwbGF5Q29tcG9uZW50KTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmlzTG9hZGluZyB8fCAhc2NvcGUuaXNEcmFnYWJsZSB8fCBzY29wZS5pc1ZpZXdPbmx5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gXy5maW5kKHRoaXMuTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlLmdldEZ1bGxEYXRhQ29tcG9uZW50TGlzdFdpdGhWbHMoc2NvcGUuY3VycmVudENvbXBvbmVudC5jb21wb25lbnRUeXBlKSwgKGNvbXBvbmVudEZ1bGxEYXRhOiBNb2RlbHMuRGlzcGxheUNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzcGxheUNvbXBvbmVudC51bmlxdWVJZCA9PT0gY29tcG9uZW50RnVsbERhdGEudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgdGhpcy5FdmVudExpc3RlbmVyU2VydmljZS5ub3RpZnlPYnNlcnZlcnMoR1JBUEhfRVZFTlRTLk9OX1BBTEVUVEVfQ09NUE9ORU5UX0RSQUdfU1RBUlQsIHNjb3BlLmRyYWdFbGVtZW50LCBjb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgc2NvcGUuaXNPbkRyYWcgPSB0cnVlOworCisKKworICAgICAgICAgICAgICAgIC8vIHRoaXMuZ3JhcGhVdGlscy5zaG93TWF0Y2hpbmdOb2Rlcyhjb21wb25lbnQsIG15RGlhZ3JhbSwgc2NvcGUuc2RjQ29uZmlnLmltYWdlc1BhdGgpOworICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVPbkRvY3VtZW50KTsKKyAgICAgICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuY29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUuZHJhZ1N0b3BDYWxsYmFjayA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5pc09uRHJhZyA9IGZhbHNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUub25EcmFnQ2FsbGJhY2sgPSAoZXZlbnQ6SURyYWdEcm9wRXZlbnQpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLm5vdGlmeU9ic2VydmVycyhHUkFQSF9FVkVOVFMuT05fUEFMRVRURV9DT01QT05FTlRfRFJBR19BQ1RJT04sIGV2ZW50KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzY29wZS5zZXRFbGVtZW50VGVtcGxhdGUgPSAoZSkgPT4geworICAgICAgICAgICAgICAgIGxldCBkcmFnQ29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPSBfLmZpbmQodGhpcy5MZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UuZ2V0RnVsbERhdGFDb21wb25lbnRMaXN0V2l0aFZscyhzY29wZS5jdXJyZW50Q29tcG9uZW50LmNvbXBvbmVudFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAoZnVsbENvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxhbnk+YW5ndWxhci5lbGVtZW50KGUuY3VycmVudFRhcmdldCkuc2NvcGUoKSkuY29tcG9uZW50LnVuaXF1ZUlkID09PSBmdWxsQ29tcG9uZW50LnVuaXF1ZUlkOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2U6IE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wb25lbnRJbnN0YW5jZUZhY3RvcnkuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGcm9tQ29tcG9uZW50KGRyYWdDb21wb25lbnQpOworICAgICAgICAgICAgICAgIGxldCBub2RlOiBNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVCYXNlID0gdGhpcy5Ob2Rlc0ZhY3RvcnkuY3JlYXRlTm9kZShjb21wb25lbnRJbnN0YW5jZSk7CisKKyAgICAgICAgICAgICAgICAvLyBteURpYWdyYW0uZHJhZ0Zyb21QYWxldHRlID0gbm9kZTsKKyAgICAgICAgICAgICAgICB0aGlzLm5vZGVIdG1sU3Vic3RpdHV0ZS5maW5kKCJpbWciKS5hdHRyKCdzcmMnLCBub2RlLmltZyk7CisgICAgICAgICAgICAgICAgc2NvcGUuZHJhZ0VsZW1lbnQgPSB0aGlzLm5vZGVIdG1sU3Vic3RpdHV0ZS5jbG9uZSgpLnNob3coKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBzY29wZS5kcmFnRWxlbWVudDsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIF9zZWFyY2hDb21wb25lbnRzID0gKHNlYXJjaFRleHQ6IHN0cmluZywgY2F0ZWdvcmllczogYW55KTogdm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgZGlzcGxheVNvcnRlZENhdGVnb3JpZXMgPSBhbmd1bGFyLmNvcHkoY2F0ZWdvcmllcyk7CisgICAgICAgICAgICBpZiAoc2VhcmNoVGV4dCAhPSAnJykgeworICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChjYXRlZ29yaWVzLCBmdW5jdGlvbiAoY2F0ZWdvcnk6IGFueSwgY2F0ZWdvcnlLZXkpIHsKKworICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goY2F0ZWdvcnksIGZ1bmN0aW9uIChzdWJjYXRlZ29yeTogQXJyYXk8TW9kZWxzLkRpc3BsYXlDb21wb25lbnQ+LCBzdWJjYXRlZ29yeUtleSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkUmVzb3VyY2VzID0gW107CisgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goc3ViY2F0ZWdvcnksIGZ1bmN0aW9uIChjb21wb25lbnQ6IE1vZGVscy5EaXNwbGF5Q29tcG9uZW50KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzb3VyY2VGaWx0ZXJUZXJtOiBzdHJpbmcgPSBjb21wb25lbnQuc2VhcmNoRmlsdGVyVGVybXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlRmlsdGVyVGVybS5pbmRleE9mKHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFJlc291cmNlcy5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRSZXNvdXJjZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTb3J0ZWRDYXRlZ29yaWVzW2NhdGVnb3J5S2V5XVtzdWJjYXRlZ29yeUtleV0gPSBmaWx0ZXJlZFJlc291cmNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAgZGlzcGxheVNvcnRlZENhdGVnb3JpZXNbY2F0ZWdvcnlLZXldW3N1YmNhdGVnb3J5S2V5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKE9iamVjdC5rZXlzKGRpc3BsYXlTb3J0ZWRDYXRlZ29yaWVzW2NhdGVnb3J5S2V5XSkubGVuZ3RoID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAgZGlzcGxheVNvcnRlZENhdGVnb3JpZXNbY2F0ZWdvcnlLZXldOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkaXNwbGF5U29ydGVkQ2F0ZWdvcmllczsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnRQYWxldHRlTG9hZGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRJbnN0YW5jZUZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2Rlc0ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkdyYXBoR2VuZXJhbFV0aWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5lclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGNNZW51KSA9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhbGV0dGUoJGxvZywKKyAgICAgICAgICAgICAgICBMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgc2RjQ29uZmlnLAorICAgICAgICAgICAgICAgIENvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LAorICAgICAgICAgICAgICAgIE5vZGVzRmFjdG9yeSwKKyAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkdyYXBoR2VuZXJhbFV0aWxzLAorICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgIHNkY01lbnUpOworICAgICAgICB9OworICAgIH0KKworICAgIFBhbGV0dGUuZmFjdG9yeS4kaW5qZWN0ID0gWworICAgICAgICAnJGxvZycsCisgICAgICAgICdMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UnLAorICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgJ0NvbXBvbmVudEZhY3RvcnknLAorICAgICAgICAnQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5JywKKyAgICAgICAgJ05vZGVzRmFjdG9yeScsCisgICAgICAgICdDb21wb3NpdGlvbkdyYXBoR2VuZXJhbFV0aWxzJywKKyAgICAgICAgJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJywKKyAgICAgICAgJ3NkY01lbnUnCisgICAgXTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3BhbGV0dGUvcGFsZXR0ZS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9wYWxldHRlL3BhbGV0dGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGRkODI3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9wYWxldHRlL3BhbGV0dGUuaHRtbApAQCAtMCwwICsxLDU5IEBACis8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1sZWZ0YmFyIj4KKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1sZWZ0YmFyLXRpdGxlIj5FbGVtZW50cyA8c3BhbiBjbGFzcz0idy1zZGMtZGVzaWduZXItbGVmdGJhci10aXRsZS1jb3VudCI+e3ttb2RlbC5udW1iZXJPZkVsZW1lbnRzfX08L3NwYW4+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlYXJjaCI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0idy1zZGMtZGVzaWduZXItbGVmdGJhci1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2guLi4iCisgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJzZWFyY2hUZXh0IiBkYXRhLW5nLWNoYW5nZT0ic2VhcmNoQ29tcG9uZW50cyhzZWFyY2hUZXh0KSIKKyAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IiBkYXRhLXRlc3RzLWlkPSJzZWFyY2hBc3NldCIvPgorICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtc2VhcmNoLWljb24gbGVmdGJhciIgZGF0YS1uZy1jbGFzcz0ieydjYW5jZWwnOnNlYXJjaFRleHQsICdtYWduaWZpY2F0aW9uJzohc2VhcmNoVGV4dH0iCisgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9InNlYXJjaFRleHQ9Jyc7IHNlYXJjaENvbXBvbmVudHMoJycsY2F0ZWdvcmllcykiPjwvc3Bhbj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24iCisgICAgICAgICBkYXRhLW5nLXJlcGVhdD0iKGVudGl0eUNhdGVnb3J5LCBvYmpDYXRlZ29yeSkgaW4gZGlzcGxheVNvcnRlZENhdGVnb3JpZXMgdHJhY2sgYnkgJGluZGV4IgorICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydleHBhbmRlZCc6IGV4cGFuZGVkU2VjdGlvbi5pbmRleE9mKGVudGl0eUNhdGVnb3J5KSAhPT0gLTF9Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlIHBvaW50ZXIiIGRhdGEtbmctY2xpY2s9InNlY3Rpb25DbGljayhlbnRpdHlDYXRlZ29yeSkiCisgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ibGVmdGJhci1zZWN0aW9uLXRpdGxlLXt7ZW50aXR5Q2F0ZWdvcnl9fSI+CisgICAgICAgICAgICB7e2VudGl0eUNhdGVnb3J5fX0KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZS1pY29uIj48L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50IgorICAgICAgICAgICAgIGRhdGEtbmctcmVwZWF0PSIoc3ViQ2F0ZWdvcnksIGNvbXBvbmVudHMpIGluIG9iakNhdGVnb3J5IHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC1zdWJjYXQgaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAge3tzdWJDYXRlZ29yeX19CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iCisgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZGVmYXVsdC1wb2ludGVyJzogaXNWaWV3T25seX0iCisgICAgICAgICAgICAgICAgIGRhdGEtbmctbW91c2VvdmVyPSIhaXNWaWV3T25seSAmJiBvbk1vdXNlT3Zlcihjb21wb25lbnQpIgorICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vdXNlbGVhdmU9IiFpc1ZpZXdPbmx5ICYmIG9uTW91c2VPdXQoKSIKKyAgICAgICAgICAgICAgICAgZGF0YS1kcmFnPSJ7eyFpc1ZpZXdPbmx5fX0iCisgICAgICAgICAgICAgICAgIGRhdGEtanF5b3VpLW9wdGlvbnM9IntyZXZlcnQ6ICdpbnZhbGlkJywgaGVscGVyOnNldEVsZW1lbnRUZW1wbGF0ZSwgYXBwZW5kVG86J2JvZHknLCBjdXJzb3JBdDoge2xlZnQ6MzgsIHRvcDogMzh9LCBjdXJzb3I6J21vdmUnfSIKKyAgICAgICAgICAgICAgICAganF5b3VpLWRyYWdnYWJsZT0ie2luZGV4Ont7JGluZGV4fX0sYW5pbWF0ZTp0cnVlLG9uU3RhcnQ6J2RyYWdTdGFydENhbGxiYWNrKGNvbXBvbmVudCknLG9uU3RvcDonZHJhZ1N0b3BDYWxsYmFjaygpJywgb25EcmFnOidvbkRyYWdDYWxsYmFjaygpJ30iCisgICAgICAgICAgICAgICAgIGRhdGEtbmctcmVwZWF0PSJjb21wb25lbnQgaW4gY29tcG9uZW50cyB8IG9yZGVyQnk6ICdkaXNwbGF5TmFtZScgdHJhY2sgYnkgJGluZGV4IgorICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPXt7Y29tcG9uZW50LmRpc3BsYXlOYW1lfX0+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1pY29uLXBoIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVkaXVtIHt7Y29tcG9uZW50Lmljb25DbGFzc319IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0te3tjb21wb25lbnQuZGlzcGxheU5hbWV9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ7e2NvbXBvbmVudC5jZXJ0aWZpZWRJY29uQ2xhc3N9fSIgdWliLXRvb2x0aXA9Ik5vdCBjZXJ0aWZpZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtY2xhc3M9InVpYi1jdXN0b20tdG9vbHRpcCIgdG9vbHRpcC1wbGFjZW1lbnQ9ImJvdHRvbSIgdG9vbHRpcC1wb3B1cC1kZWxheT0iNzAwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWluZm8iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0taW5mby10aXRsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpYi10b29sdGlwPSJ7e2NvbXBvbmVudC5kaXNwbGF5TmFtZX19IiB0b29sdGlwLWNsYXNzPSJ1aWItY3VzdG9tLXRvb2x0aXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLXBsYWNlbWVudD0iYm90dG9tIiB0b29sdGlwLXBvcHVwLWRlbGF5PSI3MDAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcG9uZW50LmRpc3BsYXlOYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0taW5mby10ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIFYue3tjb21wb25lbnQudmVyc2lvbn19CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWluZm8tdGV4dCI+IFR5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBvbmVudC5jb21wb25lbnRTdWJUeXBlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGRhdGEtbmctY2xpY2s9Im9wZW5WaWV3ZXJNb2RhbChjb21wb25lbnQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0taW5mby10ZXh0LWxpbmsgaGFuZCI+TW9yZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3BhbGV0dGUvcGFsZXR0ZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9wYWxldHRlL3BhbGV0dGUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY1N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9wYWxldHRlL3BhbGV0dGUubGVzcwpAQCAtMCwwICsxLDkyIEBACisuZHJhZy1pY29uLWJvcmRlcnsKKyAgYm9yZGVyOiA3cHggc29saWQgcmVkOworICBib3JkZXItcmFkaXVzOiA1MDBweDsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1MDBweDsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiA1MDBweDsKKyAgd2lkdGg6IDUzcHg7CisgIGhlaWdodDogNTNweDsKK30KKworLmRyYWctaWNvbi1jaXJjbGV7CisgIHdpZHRoOiA2MHB4OworICBoZWlnaHQ6IDYwcHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNTAlOworICAtbW96LWJvcmRlci1yYWRpdXM6IDUwJTsKKyAgYm9yZGVyLXJhZGl1czogNTAlOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisKK30KKworCitAZ3JlZW4tc2hhZG93OiByZ2JhKDI5LCAxNTQsIDE0OSwgMC4zKTsKK0ByZWQtc2hhZG93OiByZ2JhKDIxOCwgMzEsIDYxLCAwLjMpOworLmRyYWctaWNvbi1jaXJjbGUgLnNwcml0ZS1yZXNvdXJjZS1pY29ucyB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiAxMHB4OworICBsZWZ0OiAxMHB4OworfQorCisuZHJhZy1pY29uLWNpcmNsZS5yZWQgeworICBiYWNrZ3JvdW5kOiBAcmVkLXNoYWRvdzsKK30KKworLmRyYWctaWNvbi1jaXJjbGUuZ3JlZW4geworICBiYWNrZ3JvdW5kOiBAZ3JlZW4tc2hhZG93OworfQorCisKKy5ub2RlLXN1YnN0aXR1dGUgeworICBkaXNwbGF5OiBub25lOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHotaW5kZXg6IDk5OTk7CisgIGhlaWdodDogODBweDsKKyAgd2lkdGg6IDgwcHg7CisgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworCisgIHNwYW4geworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIGhlaWdodDogMTAwJTsKKyAgfQorCisgIGltZyB7CisgICAgaGVpZ2h0OiA0MHB4OworICAgIHdpZHRoOiA0MHB4OworICAgIGJveC1zaGFkb3c6IDAgMCAwIDEwcHggQGdyZWVuLXNoYWRvdzsKKyAgICBib3JkZXItcmFkaXVzOiA1MCU7CisKKyAgICAtd2Via2l0LXVzZXItZHJhZzogbm9uZTsKKyAgICAtbW96LXVzZXItZHJhZzogbm9uZTsKKyAgICB1c2VyLWRyYWc6IG5vbmU7CisgIH0KKyAgJi5yZWQgaW1nIHsKKyAgICBib3gtc2hhZG93OiAwIDAgMCAxMHB4IEByZWQtc2hhZG93OworICB9CisgICYuYm91bmNlIGltZyB7CisgICAgLW1vei1hbmltYXRpb246Ym91bmNlT3V0IDAuM3MgbGluZWFyOworICAgIC13ZWJraXQtYW5pbWF0aW9uOmJvdW5jZU91dCAwLjNzIGxpbmVhcjsKKyAgICBhbmltYXRpb246Ym91bmNlT3V0IDAuM3MgbGluZWFyOworICB9Cit9CisKK0BrZXlmcmFtZXMgYm91bmNlT3V0IHsKKyAgMCV7IGJveC1zaGFkb3c6IDAgMCAwIDEwcHggQGdyZWVuLXNoYWRvdzsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsgfQorICA2MCV7IGJveC1zaGFkb3c6IDAgMCAwIDBweCBAZ3JlZW4tc2hhZG93OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4OyB9CisgIDg1JXsgYm94LXNoYWRvdzogMCAwIDAgMHB4IEBncmVlbi1zaGFkb3c7IHdpZHRoOiA3NXB4OyBoZWlnaHQ6IDc1cHg7IH0KKyAgMTAwJXsgYm94LXNoYWRvdzogMCAwIDAgMHB4IEBncmVlbi1zaGFkb3c7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7IH0KK30KKworQC1tb3ota2V5ZnJhbWVzIGJvdW5jZU91dCB7CisgIDAleyBib3gtc2hhZG93OiAwIDAgMCAxMHB4IEBncmVlbi1zaGFkb3c7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7IH0KKyAgNjAleyBib3gtc2hhZG93OiAwIDAgMCAwcHggQGdyZWVuLXNoYWRvdzsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgfQorICA4NSV7IGJveC1zaGFkb3c6IDAgMCAwIDBweCBAZ3JlZW4tc2hhZG93OyB3aWR0aDogNzVweDsgaGVpZ2h0OiA3NXB4OyB9CisgIDEwMCV7IGJveC1zaGFkb3c6IDAgMCAwIDBweCBAZ3JlZW4tc2hhZG93OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4OyB9Cit9CisKK0Atd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXQgeworICAwJXsgYm94LXNoYWRvdzogMCAwIDAgMTBweCBAZ3JlZW4tc2hhZG93OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4OyB9CisgIDYwJXsgYm94LXNoYWRvdzogMCAwIDAgMHB4IEBncmVlbi1zaGFkb3c7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7IH0KKyAgODUleyBib3gtc2hhZG93OiAwIDAgMCAwcHggQGdyZWVuLXNoYWRvdzsgd2lkdGg6IDc1cHg7IGhlaWdodDogNzVweDsgfQorICAxMDAleyBib3gtc2hhZG93OiAwIDAgMCAwcHggQGdyZWVuLXNoYWRvdzsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDsgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9yZWxhdGlvbi1tZW51L3JlbGF0aW9uLW1lbnUuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvcmVsYXRpb24tbWVudS9yZWxhdGlvbi1tZW51Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhOWU0YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvcmVsYXRpb24tbWVudS9yZWxhdGlvbi1tZW51Lmh0bWwKQEAgLTAsMCArMSw2MyBAQAorPGRpdiBjbGFzcz0ibGluay1tZW51LW9wZW4iIGRhdGEtdGVzdHMtaWQ9ImxpbmstbWVudS1vcGVuIiBkYXRhLW5nLXNob3c9ImlzTGlua01lbnVPcGVuIiBuZy1zdHlsZT0ie2xlZnQ6IHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5tZW51UG9zaXRpb24ueCwgdG9wOiByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubWVudVBvc2l0aW9uLnl9IiBjbGlja2VkLW91dHNpZGU9IntvbkNsaWNrZWRPdXRzaWRlOiAnaGlkZVJlbGF0aW9uTWF0Y2goKScsIGNsaWNrZWRPdXRzaWRlRW5hYmxlOiAnaXNMaW5rTWVudU9wZW4nfSIgPgorICAgIDxoNCBzZGMtc21hcnQtdG9vbHRpcD57e3JlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuY29tcG9uZW50SW5zdGFuY2UubmFtZSB8IHJlc291cmNlTmFtZX19PC9oND4KKyAgICA8aDQgc2RjLXNtYXJ0LXRvb2x0aXA+e3tyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5jb21wb25lbnRJbnN0YW5jZS5uYW1lIHwgcmVzb3VyY2VOYW1lfX08L2g0PgorCisgICAgPHA+U2VsZWN0IG9uZSBvZiB0aGUgb3B0aW9ucyBiZWxvdyB0byBjb25uZWN0PC9wPgorCisgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJpbm5lci10aXRsZSIgZGF0YS1uZy1zaG93PSJoYXNNYXRjaGVzVG9TaG93KHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsucmVxdWlyZW1lbnRzLCByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoKSI+UmVxdWlyZW1lbnRzPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImxpbmstaXRlbSIgZGF0YS10ZXN0cy1pZD0ibGluay1pdGVtLXJlcXVpcmVtZW50cyIgZGF0YS1uZy1yZXBlYXQ9IihyZXEgLG1hdGNoQXJyKSBpbiByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubGVmdFNpZGVMaW5rLnJlcXVpcmVtZW50cyIKKyAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubGVmdFNpZGVMaW5rLnNlbGVjdE1hdGNoQXJyKG1hdGNoQXJyKTsgdXBkYXRlU2VsZWN0aW9uVGV4dCgpIgorICAgICAgICAgICAgIGRhdGEtbmctc2hvdz0ic2hvd01hdGNoKHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5yaWdodFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2gsIG1hdGNoQXJyKSIKKyAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7ICdzZWxlY3RlZCc6IHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuc2VsZWN0ZWRNYXRjaCA9PT0gbWF0Y2hBcnJ9Ij4KKyAgICAgICAgICAgIDxkaXYgc2RjLXNtYXJ0LXRvb2x0aXA+e3ttYXRjaEFyclswXS5yZXF1aXJlbWVudC5nZXRGdWxsVGl0bGUoKX19PC9kaXY+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgY2xhc3M9ImlubmVyLXRpdGxlIiBkYXRhLW5nLXNob3c9Imhhc01hdGNoZXNUb1Nob3cocmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLmxlZnRTaWRlTGluay5jYXBhYmlsaXRpZXMsIHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5yaWdodFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2gpIj5DYXBhYmlsaXRpZXM8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibGluay1pdGVtIiBkYXRhLXRlc3RzLWlkPSJsaW5rLWl0ZW0tY2FwYWJpbGl0aWVzIiBkYXRhLW5nLXJlcGVhdD0iKGNhcCwgbWF0Y2hBcnIpIGluIHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuY2FwYWJpbGl0aWVzIgorICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9InJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuc2VsZWN0TWF0Y2hBcnIobWF0Y2hBcnIpOyB1cGRhdGVTZWxlY3Rpb25UZXh0KCkiCisgICAgICAgICAgICAgZGF0YS1uZy1zaG93PSJzaG93TWF0Y2gocmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnJpZ2h0U2lkZUxpbmsuc2VsZWN0ZWRNYXRjaCwgbWF0Y2hBcnIpIgorICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsgJ3NlbGVjdGVkJzogcmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLmxlZnRTaWRlTGluay5zZWxlY3RlZE1hdGNoID09PSBtYXRjaEFycn0iPgorICAgICAgICAgICAgPGRpdiBzZGMtc21hcnQtdG9vbHRpcD57e21hdGNoQXJyWzBdLmNhcGFiaWxpdHkuZ2V0RnVsbFRpdGxlKCl9fTwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorCisgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJpbm5lci10aXRsZSIgZGF0YS1uZy1zaG93PSJoYXNNYXRjaGVzVG9TaG93KHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5yaWdodFNpZGVMaW5rLnJlcXVpcmVtZW50cywgcmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLmxlZnRTaWRlTGluay5zZWxlY3RlZE1hdGNoKSI+UmVxdWlyZW1lbnRzPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImxpbmstaXRlbSIgZGF0YS10ZXN0cy1pZD0ibGluay1pdGVtLXJlcXVpcmVtZW50cyIgZGF0YS1uZy1yZXBlYXQ9IihyZXEsIG1hdGNoQXJyKSBpbiByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5yZXF1aXJlbWVudHMiCisgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0icmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnJpZ2h0U2lkZUxpbmsuc2VsZWN0TWF0Y2hBcnIobWF0Y2hBcnIpOyB1cGRhdGVTZWxlY3Rpb25UZXh0KCkiCisgICAgICAgICAgICAgZGF0YS1uZy1zaG93PSJzaG93TWF0Y2gocmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLmxlZnRTaWRlTGluay5zZWxlY3RlZE1hdGNoLCBtYXRjaEFycikiCisgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieyAnc2VsZWN0ZWQnOiByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoID09PSBtYXRjaEFycn0iPgorICAgICAgICAgICAgPGRpdiBzZGMtc21hcnQtdG9vbHRpcD57e21hdGNoQXJyWzBdLnNlY29uZFJlcXVpcmVtZW50ID8gbWF0Y2hBcnJbMF0uc2Vjb25kUmVxdWlyZW1lbnQuZ2V0RnVsbFRpdGxlKCkgOiBtYXRjaEFyclswXS5yZXF1aXJlbWVudC5nZXRGdWxsVGl0bGUoKX19PC9kaXY+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgY2xhc3M9ImlubmVyLXRpdGxlIiBkYXRhLW5nLXNob3c9Imhhc01hdGNoZXNUb1Nob3cocmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnJpZ2h0U2lkZUxpbmsuY2FwYWJpbGl0aWVzLCByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubGVmdFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2gpIj5DYXBhYmlsaXRpZXM8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibGluay1pdGVtIiAgZGF0YS10ZXN0cy1pZD0ibGluay1pdGVtLWNhcGFiaWxpdGllcyIgZGF0YS1uZy1yZXBlYXQ9IihjYXAsIG1hdGNoQXJyKSBpbiByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5jYXBhYmlsaXRpZXMiCisgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0icmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnJpZ2h0U2lkZUxpbmsuc2VsZWN0TWF0Y2hBcnIobWF0Y2hBcnIpOyB1cGRhdGVTZWxlY3Rpb25UZXh0KCkiCisgICAgICAgICAgICAgZGF0YS1uZy1zaG93PSJzaG93TWF0Y2gocmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLmxlZnRTaWRlTGluay5zZWxlY3RlZE1hdGNoLCBtYXRjaEFycikiCisgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieyAnc2VsZWN0ZWQnOiByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoID09PSBtYXRjaEFycn0iPgorICAgICAgICAgICAgPGRpdiBzZGMtc21hcnQtdG9vbHRpcD57e21hdGNoQXJyWzBdLmNhcGFiaWxpdHkuZ2V0RnVsbFRpdGxlKCl9fTwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorCisgICAgPGRpdiBjbGFzcz0idmwtdHlwZSIgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6ICFyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubGVmdFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2hbMF0uc2Vjb25kUmVxdWlyZW1lbnQgfHwgIXJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5yaWdodFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2hbMF0uc2Vjb25kUmVxdWlyZW1lbnR9Ij4KKyAgICAgICAgPHNkYy1yYWRpby1idXR0b24gc2RjLW1vZGVsPSJyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoudmxUeXBlIiB2YWx1ZT0icHRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD0iIXJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuc2VsZWN0ZWRNYXRjaFswXS5zZWNvbmRSZXF1aXJlbWVudCB8fCAhcmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnJpZ2h0U2lkZUxpbmsuc2VsZWN0ZWRNYXRjaFswXS5zZWNvbmRSZXF1aXJlbWVudCB8fCAhcmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnAycFZMIgorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJQb2ludCB0byBwb2ludCIgZWxlbS1pZD0icmFkaW9QVFAiIGVsZW0tbmFtZT0idmxUeXBlIj48L3NkYy1yYWRpby1idXR0b24+CisKKyAgICAgICAgPHNkYy1yYWRpby1idXR0b24gc2RjLW1vZGVsPSJyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoudmxUeXBlIiB2YWx1ZT0ibXB0bXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPSIhcmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLmxlZnRTaWRlTGluay5zZWxlY3RlZE1hdGNoWzBdLnNlY29uZFJlcXVpcmVtZW50IHx8ICFyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoWzBdLnNlY29uZFJlcXVpcmVtZW50IHx8ICFyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubXAybXBWTCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iTXVsdGkgcG9pbnQiIGVsZW0taWQ9InJhZGlvTVBUTVAiIGVsZW0tbmFtZT0idmxUeXBlIj48L3NkYy1yYWRpby1idXR0b24+CisKKyAgICAgICAgPHNwYW4gY2xhc3M9InNwcml0ZS1uZXcgaW5mby1pY29uIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9IllvdSBhcmUgcmVxdWlyZWQgdG8gY2hvb3NlIHRoZSB0eXBlIG9mIHRoZSBWaXJ0dWFsIExpbmsuIj48L3NwYW4+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJyZXN1bHQiIHNkYy1zbWFydC10b29sdGlwPiYjODIwMzt7e3JlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5zZWxlY3Rpb25UZXh0fX0KKworICAgIDwvZGl2PgorCisgICAgPGJ1dHRvbiBjbGFzcz0idGx2LWJ0biBncmV5IiBkYXRhLXRlc3RzLWlkPSJsaW5rLW1lbnUtYnV0dG9uLWNhbmNlbCIgZGF0YS1uZy1jbGljaz0iaGlkZVJlbGF0aW9uTWF0Y2goKSI+Q2FuY2VsPC9idXR0b24+CisgICAgPGJ1dHRvbiBjbGFzcz0idGx2LWJ0biBibHVlIiBkYXRhLXRlc3RzLWlkPSJsaW5rLW1lbnUtYnV0dG9uLWNvbm5lY3QiIGRhdGEtbmctZGlzYWJsZWQ9IiFyZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubGVmdFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2ggfHwgIXJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5yaWdodFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2ggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuc2VsZWN0ZWRNYXRjaFswXS5zZWNvbmRSZXF1aXJlbWVudCAmJiAhcmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnZsVHlwZSkiCisgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJzYXZlUmVsYXRpb24oKSI+Q29ubmVjdDwvYnV0dG9uPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3JlbGF0aW9uLW1lbnUvcmVsYXRpb24tbWVudS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9yZWxhdGlvbi1tZW51L3JlbGF0aW9uLW1lbnUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWE4MTRkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9yZWxhdGlvbi1tZW51L3JlbGF0aW9uLW1lbnUubGVzcwpAQCAtMCwwICsxLDExOCBAQAorLmxpbmstbWVudS1vcGVuIHsKKyAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OworICAgIGNvbG9yOiBAbWFpbl9jb2xvcl9tOworICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgei1pbmRleDogOTk5OTk7CisgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICAjZmZmZmZmOworICAgIGJveC1zaGFkb3c6IDBweCAwcHggNnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuNSk7CisgICAgd2lkdGg6IDQ2MHB4OworICAgIGhlaWdodDogNDE4cHg7CisKKyAgICBoNCB7CisgICAgICAgIHdpZHRoOiA1MCU7CisgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGx2X2NvbG9yX3U7CisgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAzNnB4OworICAgICAgICBtYXJnaW46IDA7CisgICAgICAgIHBhZGRpbmc6IDAgMTVweDsKKworICAgICAgICAmICsgaDQgeworICAgICAgICAgICAgYm9yZGVyLWxlZnQ6ICNkOGQ4ZDggMXB4IHNvbGlkOworICAgICAgICB9CisgICAgfQorICAgIHAgeworICAgICAgICBjbGVhcjogYm90aDsKKyAgICAgICAgdGV4dC1pbmRlbnQ6IDE1cHg7CisgICAgICAgIGJvcmRlci1ib3R0b206ICNkOGQ4ZDggMXB4IHNvbGlkOworICAgICAgICBsaW5lLWhlaWdodDogMzRweDsKKyAgICAgICAgbWFyZ2luOiAwOworICAgICAgICBjb2xvcjogQGZ1bmNfY29sb3JfczsKKyAgICB9CisKKyAgICAuc2Nyb2xsYmFyLWNvbnRhaW5lciB7CisgICAgICAgIGhlaWdodDogMjMycHg7CisgICAgICAgIHdpZHRoOiA1MCU7CisgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CisgICAgICAgIC5wZXJmZWN0LXNjcm9sbGJhcjsKKworICAgICAgICAmICsgLnNjcm9sbGJhci1jb250YWluZXIgeworICAgICAgICAgICAgYm9yZGVyLWxlZnQ6ICNkOGQ4ZDggMXB4IHNvbGlkOworICAgICAgICB9CisKKyAgICAgICAgLmlubmVyLXRpdGxlIHsKKyAgICAgICAgICAgIHdpZHRoOiAxODlweDsKKyAgICAgICAgICAgIG1hcmdpbjogNXB4IGF1dG8gM3B4IGF1dG87CisgICAgICAgICAgICAvL3RleHQtaW5kZW50OiAxMHB4OworICAgICAgICAgICAgY29sb3I6IEBmdW5jX2NvbG9yX3M7CisgICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisKKyAgICAgICAgICAgIC8vJjpub3QoOmZpcnN0LWNoaWxkKSB7CisgICAgICAgICAgICAvLyAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgICAgICAgICAgLy99CisgICAgICAgIH0KKworICAgICAgICAubGluay1pdGVtIHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDAgMTBweDsKKyAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyM3B4OworICAgICAgICAgICAgaGVpZ2h0OiAyM3B4OworICAgICAgICAgICAgdGV4dC1pbmRlbnQ6IDVweDsKKyAgICAgICAgICAgIC5oYW5kOworCisgICAgICAgICAgICAmLnNlbGVjdGVkIHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgQHRsdl9jb2xvcl92OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLnZsLXR5cGUgeworICAgICAgICBoZWlnaHQ6IDMzcHg7CisgICAgICAgIGJvcmRlci10b3A6ICNkOGQ4ZDggc29saWQgMXB4OworICAgICAgICBjbGVhcjogYm90aDsKKyAgICAgICAgcGFkZGluZzogMCAxMHB4OworICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKKyAgICAgICAgY29sb3I6IEBtYWluX2NvbG9yX207CisKKyAgICAgICAgJi5kaXNhYmxlZCB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOworICAgICAgICAgICAgY29sb3I6IEBjb2xvcl9tOworICAgICAgICB9CisgICAgICAgIC5pbmZvLWljb24geworICAgICAgICAgICAgZmxvYXQ6cmlnaHQ7CisgICAgICAgICAgICBtYXJnaW4tdG9wOiA5cHg7CisgICAgICAgIH0KKyAgICAgICAgLnRsdi1yYWRpbyB7CisgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAucmVzdWx0IHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW5fY29sb3JfbTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDI5cHg7CisgICAgICAgIGNvbG9yOiAgI2ZmZmZmZjsKKyAgICAgICAgcGFkZGluZzogMCAxNXB4OworICAgIH0KKworICAgIGJ1dHRvbiB7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgbWFyZ2luLXRvcDogOXB4OworICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgfQorfQorLmxpbmstbWVudS1pdGVtIHsKKyAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgbGluZS1oZWlnaHQ6IDI0cHg7CisgICAgcGFkZGluZzogMCAxMHB4OworICAgICY6aG92ZXIgeworICAgICAgICBjb2xvcjogQGNvbG9yX2E7CisgICAgfQorfQorLmxpbmstbWVudTo6YmVmb3JlIHsKKyAgICByaWdodDogaW5oZXJpdCAhaW1wb3J0YW50OworICAgIGxlZnQ6IDUwcHg7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9yZWxhdGlvbi1tZW51L3JlbGF0aW9uLW1lbnUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3JlbGF0aW9uLW1lbnUvcmVsYXRpb24tbWVudS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmEyZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9yZWxhdGlvbi1tZW51L3JlbGF0aW9uLW1lbnUudHMKQEAgLTAsMCArMSwxMTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworCisgICAgZXhwb3J0IGludGVyZmFjZSBJUmVsYXRpb25NZW51U2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICByZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmo6TW9kZWxzLlJlbGF0aW9uTWVudURpcmVjdGl2ZU9iajsKKyAgICAgICAgY3JlYXRlUmVsYXRpb246RnVuY3Rpb247CisgICAgICAgIGlzTGlua01lbnVPcGVuOmJvb2xlYW47CisgICAgICAgIGhpZGVSZWxhdGlvbk1hdGNoOkZ1bmN0aW9uOworICAgICAgICBjYW5jZWw6RnVuY3Rpb247CisKKyAgICAgICAgc2F2ZVJlbGF0aW9uKCk7CisgICAgICAgIHNob3dNYXRjaChhcnIxOkFycmF5PE1vZGVscy5NYXRjaEJhc2U+LCBhcnIyOkFycmF5PE1vZGVscy5NYXRjaEJhc2U+KTpib29sZWFuOworICAgICAgICBoYXNNYXRjaGVzVG9TaG93KG1hdGNoZXNPYmo6TW9kZWxzLk1hdGNoQmFzZSwgc2VsZWN0ZWRNYXRjaDpBcnJheTxNb2RlbHMuTWF0Y2hCYXNlPik7CisgICAgICAgIHVwZGF0ZVNlbGVjdGlvblRleHQoKTp2b2lkOworCisgICAgfQorCisKKyAgICBleHBvcnQgY2xhc3MgUmVsYXRpb25NZW51RGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZQorICAgICAgICApIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgcmVsYXRpb25NZW51RGlyZWN0aXZlT2JqOiAnPScsCisgICAgICAgICAgICBpc0xpbmtNZW51T3BlbjogJz0nLAorICAgICAgICAgICAgY3JlYXRlUmVsYXRpb246ICcmJywKKyAgICAgICAgICAgIGNhbmNlbDonJicKKyAgICAgICAgfTsKKworICAgICAgICByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3JlbGF0aW9uLW1lbnUvcmVsYXRpb24tbWVudS5odG1sJyk7CisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9IChzY29wZTpJUmVsYXRpb25NZW51U2NvcGUsIGVsZW1lbnQ6SlF1ZXJ5LCAkYXR0cjpuZy5JQXR0cmlidXRlcykgPT4geworCisgICAgICAgICAgICBzY29wZS5zYXZlUmVsYXRpb24gPSAoKTp2b2lkPT4geworICAgICAgICAgICAgICAgIGxldCBjaG9zZW5NYXRjaGVzOkFycmF5PGFueT4gPSBfLmludGVyc2VjdGlvbihzY29wZS5yZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoLCBzY29wZS5yZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubGVmdFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2gpOworICAgICAgICAgICAgICAgIGxldCBjaG9zZW5NYXRjaDpNb2RlbHMuTWF0Y2hCYXNlID0gY2hvc2VuTWF0Y2hlc1swXTsKKyAgICAgICAgICAgICAgICBsZXQgIGNob3NlblZMOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICBpZiAoIm1wdG1wIiA9PT0gc2NvcGUucmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnZsVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjaG9zZW5WTCA9IHNjb3BlLnJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5tcDJtcFZMOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNob3NlblZMID0gc2NvcGUucmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLnAycFZMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZS5jcmVhdGVSZWxhdGlvbigpKGNob3Nlbk1hdGNoLGNob3NlblZMKTsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgc2NvcGUuaGlkZVJlbGF0aW9uTWF0Y2ggPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUuaXNMaW5rTWVudU9wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzY29wZS5jYW5jZWwoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vdG8gc2hvdyBvcHRpb25zIGluIGxpbmsgbWVudQorICAgICAgICAgICAgc2NvcGUuc2hvd01hdGNoID0gKGFycjE6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4sIGFycjI6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4pOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiAhYXJyMSB8fCAhYXJyMiB8fCBfLmludGVyc2VjdGlvbihhcnIxLCBhcnIyKS5sZW5ndGggPiAwOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy90byBzaG93IHJlcXVpcmVtZW50cy9jYXBhYmlsaXRpZXMgdGl0bGUKKyAgICAgICAgICAgIHNjb3BlLmhhc01hdGNoZXNUb1Nob3cgPSAobWF0Y2hlc09iajpNb2RlbHMuTWF0Y2hCYXNlLCBzZWxlY3RlZE1hdGNoOkFycmF5PE1vZGVscy5NYXRjaEJhc2U+KTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OmJvb2xlYW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2gobWF0Y2hlc09iaiwgKG1hdGNoZXNBcnI6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNjb3BlLnNob3dNYXRjaChtYXRjaGVzQXJyLCBzZWxlY3RlZE1hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHNjb3BlLnVwZGF0ZVNlbGVjdGlvblRleHQgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbGVmdDpzdHJpbmcgPSBzY29wZS5yZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoubGVmdFNpZGVMaW5rLnNlbGVjdGVkTWF0Y2ggPyB0aGlzLiRmaWx0ZXIoJ3Jlc291cmNlTmFtZScpKHNjb3BlLnJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuc2VsZWN0ZWRNYXRjaFswXS5nZXREaXNwbGF5VGV4dCgnbGVmdCcpKSA6ICcnOworICAgICAgICAgICAgICAgIGxldCBib3RoOnN0cmluZyA9IHNjb3BlLnJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5sZWZ0U2lkZUxpbmsuc2VsZWN0ZWRNYXRjaCAmJiBzY29wZS5yZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoID8gJyAtICcgKworICAgICAgICAgICAgICAgIHRoaXMuJGZpbHRlcigncmVzb3VyY2VOYW1lJykoc2NvcGUucmVsYXRpb25NZW51RGlyZWN0aXZlT2JqLmxlZnRTaWRlTGluay5zZWxlY3RlZE1hdGNoWzBdLnJlcXVpcmVtZW50LnJlbGF0aW9uc2hpcCkgKyAnIC0gJyA6ICcnOworICAgICAgICAgICAgICAgIGxldCByaWdodDpzdHJpbmcgPSBzY29wZS5yZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoID8gdGhpcy4kZmlsdGVyKCdyZXNvdXJjZU5hbWUnKShzY29wZS5yZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmoucmlnaHRTaWRlTGluay5zZWxlY3RlZE1hdGNoWzBdLmdldERpc3BsYXlUZXh0KCdyaWdodCcpKSA6ICcnOworICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aW9uTWVudURpcmVjdGl2ZU9iai5zZWxlY3Rpb25UZXh0ID0gbGVmdCArIGJvdGggKyByaWdodDsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UgLCAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25NZW51RGlyZWN0aXZlKCR0ZW1wbGF0ZUNhY2hlLCAkZmlsdGVyKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBSZWxhdGlvbk1lbnVEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZScsICckZmlsdGVyJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvaW5mby10b29sdGlwL2luZm8tdG9vbHRpcC5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2luZm8tdG9vbHRpcC9pbmZvLXRvb2x0aXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzJiZGNmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2luZm8tdG9vbHRpcC9pbmZvLXRvb2x0aXAuaHRtbApAQCAtMCwwICsxLDEwIEBACis8ZGl2PgorICAgIDxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IGluZm8taWNvbiBoYW5kIiBkYXRhLW5nLWNsaWNrPSJzaG93TWVzc2FnZT0hc2hvd01lc3NhZ2UiPjwvc3Bhbj4KKyAgICA8ZGl2IGNsYXNzPSJpbmZvLXRvb2x0aXAiIGRhdGEtbmctc2hvdz0ic2hvd01lc3NhZ2UiPgorICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvLXRvb2x0aXAtYXJyb3ciPjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvLXRvb2x0aXAtY29udGVudCIgZGF0YS1uZy1jbGFzcz0iZGlyZWN0aW9uIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjbG9zZS10b29sdGlwIHNwcml0ZS1uZXcgY2xvc2UtaW5mby10b29sdGlwLWJ1dHRvbiIgZGF0YS1uZy1jbGljaz0ic2hvd01lc3NhZ2U9ZmFsc2UiPjwvc3Bhbj4KKyAgICAgICAgICAgIDxwIGNsYXNzPSJpbmZvLXRvb2x0aXAtbWVzc2FnZSIgdHJhbnNsYXRlPSJ7e2luZm9NZXNzYWdlVHJhbnNsYXRlfX0iPjwvcD4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9pbmZvLXRvb2x0aXAvaW5mby10b29sdGlwLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvaW5mby10b29sdGlwL2luZm8tdG9vbHRpcC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTFhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvaW5mby10b29sdGlwL2luZm8tdG9vbHRpcC5sZXNzCkBAIC0wLDAgKzEsMzkgQEAKKy5pbmZvLXRvb2x0aXAgeworICAgIHBvc2l0aW9uOiBmaXhlZDsKKyAgICB6LWluZGV4OiAxMDcwOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHdpZHRoOiAyNTBweDsKKyAgICAuaW5mby10b29sdGlwLWFycm93IHsKKyAgICAgICAgd2lkdGg6IDA7CisgICAgICAgIGhlaWdodDogMDsKKyAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKKyAgICAgICAgYm9yZGVyLXdpZHRoOiAwIDVweCA1cHggNXB4OworICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IEBtYWluX2NvbG9yX2EgdHJhbnNwYXJlbnQ7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgbGVmdDogMnB4OworICAgIH0KKyAgICAuaW5mby10b29sdGlwLWNvbnRlbnQgeworICAgICAgICBib3gtc2hhZG93OiAwcHggM3B4IDZweCAwcHggcmdiYSgwLCAwLCAwLCAwLjUpOworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAbWFpbl9jb2xvcl9vOworICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICAgIGJvcmRlci10b3A6IDNweCBzb2xpZCBAbWFpbl9jb2xvcl9hOworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOworICAgICAgICAmLnJpZ2h0eworICAgICAgICAgICAgbGVmdDogLTEzcHg7CisgICAgICAgIH0KKyAgICAgICAgJi5sZWZ0eworICAgICAgICAgICAgbGVmdDogLTIyM3B4OworICAgICAgICB9CisgICAgICAgIC5jbG9zZS10b29sdGlweworICAgICAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICAgICAgbWFyZ2luOiA1cHg7CisgICAgICAgIH0KKworICAgICAgICAuaW5mby10b29sdGlwLW1lc3NhZ2V7CisgICAgICAgICAgICBtYXJnaW46IDE1cHg7CisgICAgICAgICAgICB3b3JkLWJyZWFrOiBub3JtYWw7CisgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvaW5mby10b29sdGlwL2luZm8tdG9vbHRpcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9pbmZvLXRvb2x0aXAvaW5mby10b29sdGlwLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODFiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvaW5mby10b29sdGlwL2luZm8tdG9vbHRpcC50cwpAQCAtMCwwICsxLDYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IHJjb2hlbiBvbiA5LzI1LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJSW5mb1Rvb2x0aXBTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIGluZm9NZXNzYWdlVHJhbnNsYXRlOnN0cmluZzsKKyAgICAgICAgZGlyZWN0aW9uOnN0cmluZzsKKyAgICB9CisKKworICAgIGV4cG9ydCBjbGFzcyBJbmZvVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIGluZm9NZXNzYWdlVHJhbnNsYXRlOidAJywKKyAgICAgICAgICAgIGRpcmVjdGlvbjonQCcvL2dldCAncmlnaHQnIG9yICdsZWZ0JywgdGhlIGRlZmF1bHQgaXMgJ3JpZ2h0JworICAgICAgICB9OworCisgICAgICAgIHJlc3RyaWN0ID0gJ0UnOworICAgICAgICByZXBsYWNlID0gdHJ1ZTsKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9pbmZvLXRvb2x0aXAvaW5mby10b29sdGlwLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklJbmZvVG9vbHRpcFNjb3BlLCBlbGVtZW50OmFueSwgJGF0dHI6YW55KSA9PiB7CisgICAgICAgICAgICBzY29wZS5kaXJlY3Rpb24gPSBzY29wZS5kaXJlY3Rpb24gfHwgJ3JpZ2h0JzsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5mb1Rvb2x0aXBEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgSW5mb1Rvb2x0aXBEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2ludmFsaWQtY2hhcmFjdGVycy9pbnZhbGlkLWNoYXJhY3RlcnMudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvaW52YWxpZC1jaGFyYWN0ZXJzL2ludmFsaWQtY2hhcmFjdGVycy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI5OGIwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2ludmFsaWQtY2hhcmFjdGVycy9pbnZhbGlkLWNoYXJhY3RlcnMudHMKQEAgLTAsMCArMSw3MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIEludmFsaWRDaGFyYWN0ZXJzRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7fQorCisgICAgICAgIHJlcXVpcmUgPSAnbmdNb2RlbCc7CisKKyAgICAgICAgbGluayA9IChzY29wZSwgZWxlbSwgYXR0cnMsIG5nTW9kZWwpID0+IHsKKworICAgICAgICAgICAgbGV0IGludmFsaWRDaGFyYWN0ZXJzID0gW107CisKKyAgICAgICAgICAgIGF0dHJzLiRvYnNlcnZlKCdpbnZhbGlkQ2hhcmFjdGVycycsICh2YWw6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgaW52YWxpZENoYXJhY3RlcnMgPSB2YWwuc3BsaXQoJycpOworICAgICAgICAgICAgICAgIHZhbGlkYXRlKG5nTW9kZWwuJHZpZXdWYWx1ZSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbGV0IHZhbGlkYXRlOiBGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkgeworCisgICAgICAgICAgICAgICAgbGV0IHZhbGlkOmJvb2xlYW4gPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnZhbGlkQ2hhcmFjdGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoaW52YWxpZENoYXJhY3RlcnNbaV0pICE9IC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWYWxpZGl0eSgnaW52YWxpZENoYXJhY3RlcnMnLCB2YWxpZCk7CisgICAgICAgICAgICAgICAgaWYoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG5nTW9kZWwuJHNldFByaXN0aW5lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vRm9yIERPTSAtPiBtb2RlbCB2YWxpZGF0aW9uCisgICAgICAgICAgICBuZ01vZGVsLiRwYXJzZXJzLnVuc2hpZnQodmFsaWRhdGUpOworICAgICAgICAgICAgLy9Gb3IgbW9kZWwgLT4gRE9NIHZhbGlkYXRpb24KKyAgICAgICAgICAgIG5nTW9kZWwuJGZvcm1hdHRlcnMudW5zaGlmdCh2YWxpZGF0ZSk7CisKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZENoYXJhY3RlcnNEaXJlY3RpdmUoKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIEludmFsaWRDaGFyYWN0ZXJzRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFtdOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xheW91dC90b3AtbmF2L3RvcC1uYXYuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLW5hdi90b3AtbmF2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiMWU4NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLW5hdi90b3AtbmF2Lmh0bWwKQEAgLTAsMCArMSw1NCBAQAorPG5hdiBjbGFzcz0idG9wLW5hdiI+CisKKyAgICA8ZGl2IGNsYXNzPSJhc2RjLWFwcC10aXRsZS13cmFwcGVyIj4KKyAgICAgICAgPGEgY2xhc3M9ImFzZGMtYXBwLXRpdGxlIj5TREM8L2E+IDwhLS0gZGF0YS11aS1zcmVmPSJkYXNoYm9hcmQiIC0tPgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXZlcnNpb24iPiB2Lnt7dmVyc2lvbn19PC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8dWwgY2xhc3M9InRvcC1tZW51IiBkYXRhLW5nLXNob3c9IiFtZW51TW9kZWwiPgorICAgICAgICA8IS0tIG5vIGhpZXJhcmNoeSAmIGRyb3Bkb3ducyBtb2RlIC0tPgorICAgICAgICA8bGkgZGF0YS1uZy1yZXBlYXQ9Iml0ZW0gaW4gdG9wTHZsTWVudS5tZW51SXRlbXMiCisgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogJGluZGV4ID09IHRvcEx2bE1lbnUuc2VsZWN0ZWRJbmRleH0iPgorICAgICAgICAgICAgPGEgZGF0YS1uZy1jbGljaz0ibWVudUl0ZW1DbGljayh0b3BMdmxNZW51LCBpdGVtKSIKKyAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Im1haW4tbWVudS1idXR0b24te3tpdGVtLnRleHQgfCBsb3dlcmNhc2V9fSI+e3tpdGVtLnRleHR9fTwvYT4KKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgICAgPHVsIGNsYXNzPSJ0b3AtbWVudSIgZGF0YS1uZy1zaG93PSJtZW51TW9kZWwiPgorICAgICAgICA8IS0tIHdpdGggaGllcmFyY2h5ICYgZHJvcGRvd25zIG1vZGUgLS0+CisgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdC1zdGFydD0iZ3JvdXBJdGVtIGluIG1lbnVNb2RlbCIKKyAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiAkbGFzdCB9Ij4KKyAgICAgICAgICAgIDxhIGRhdGEtbmctY2xpY2s9Im1lbnVJdGVtQ2xpY2soZ3JvdXBJdGVtLCBncm91cEl0ZW0ubWVudUl0ZW1zW2dyb3VwSXRlbS5zZWxlY3RlZEluZGV4XSkiCisgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJicmVhZGNydW1icy1idXR0b24te3skaW5kZXh9fSI+CisgICAgICAgICAgICAgICAge3tncm91cEl0ZW0ubWVudUl0ZW1zW2dyb3VwSXRlbS5zZWxlY3RlZEluZGV4XS50ZXh0fX0KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpIGRhdGEtbmctcmVwZWF0LWVuZD0iIiBjbGFzcz0idHJpYW5nbGUtZHJvcGRvd24iCisgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2l0ZW0tY2xpY2snOiBncm91cEl0ZW0uaXRlbUNsaWNrfSIgZGF0YS1uZy1tb3VzZW92ZXI9Imdyb3VwSXRlbS5pdGVtQ2xpY2sgPSB0cnVlIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InRyaWFuZ2xlIj48c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyBhcnJvdy1yaWdodCI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjE1IiBpbmNsdWRlLXBhZGRpbmc9InRydWUiPgorICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtbmctcmVwZWF0PSJkZEl0ZW0gaW4gZ3JvdXBJdGVtLm1lbnVJdGVtcyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9Im1lbnVJdGVtQ2xpY2soZ3JvdXBJdGVtLCBkZEl0ZW0pIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZCc6ICRpbmRleCA9PSBncm91cEl0ZW0uc2VsZWN0ZWRJbmRleCwgJ2Rpc2FibGVkJzogZGRJdGVtLmlzRGlzYWJsZWR9IgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ic3ViLW1lbnUtYnV0dG9uLXt7ZGRJdGVtLnRleHQgfCBsb3dlcmNhc2V9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzZGMtc21hcnQtdG9vbHRpcD0iIj57e2RkSXRlbS50ZXh0fX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKworICAgIDxkaXYgY2xhc3M9InRvcC1zZWFyY2giIGRhdGEtbmctaGlkZT0iaGlkZVNlYXJjaCA9PT0gdHJ1ZSI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgY2xhc3M9InNlYXJjaC10ZXh0IgorICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlNlYXJjaCIKKyAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9InNlYXJjaEJpbmQiCisgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJtYWluLW1lbnUtaW5wdXQtc2VhcmNoIgorICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iIC8+CisgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1zZWFyY2gtaWNvbiBtYWduaWZpY2F0aW9uIj48L3NwYW4+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJub3RpZmljYXRpb24taWNvbiIgIGRhdGEtbmctZGlzYWJsZWQ9ICJwcm9ncmVzcyA+IDAiIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnIDogcHJvZ3Jlc3MgPiAwfSIgZGF0YS1uZy1pZj0idXNlci5yb2xlID09PSAnREVTSUdORVInICYmIG5vdGlmaWNhdGlvbkljb25DYWxsYmFjayIgZGF0YS1uZy1jbGljaz0ibm90aWZpY2F0aW9uSWNvbkNhbGxiYWNrKCkiIHRvb2x0aXBzIHRvb2x0aXAtc2lkZT0ibGVmdCIgdG9vbHRpcC1jb250ZW50PSJWZW5kb3IgU29mdHdhcmUgUHJvZHVjdCBSZXBvc2l0b3J5IiBkYXRhLXRlc3RzLWlkPSJyZXBvc2l0b3J5LWljb24iPjwvZGl2PgorCis8L25hdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLW5hdi90b3AtbmF2Lmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1uYXYvdG9wLW5hdi5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDIxYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1uYXYvdG9wLW5hdi5sZXNzCkBAIC0wLDAgKzEsMjE4IEBACisudG9wLW5hdiB7CisgICAgcG9zaXRpb246IGZpeGVkOworICAgIHRvcDogQGhlYWRlcl9oZWlnaHQ7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW5fY29sb3JfcDsKKyAgICAuYm94LXNoYWRvdygwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjMzKSk7CisgICAgd2lkdGg6IDEwMCU7CisgICAgaGVpZ2h0OiBAdG9wX25hdl9oZWlnaHQ7CisgICAgbGluZS1oZWlnaHQ6IEB0b3BfbmF2X2hlaWdodDsKKyAgICB6LWluZGV4OiAxMDsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKworICAgIC5hc2RjLWFwcC10aXRsZS13cmFwcGVyIHsKKyAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICBsaW5lLWhlaWdodDogMTZweDsKKyAgICAgICAgbWFyZ2luOiAwIDIwcHg7CisKKyAgICAgICAgYS5hc2RjLWFwcC10aXRsZSB7CisgICAgICAgICAgICAubV8xOF9yOworICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgICB9CisKKyAgICAgICAgLmFzZGMtdmVyc2lvbiB7CisgICAgICAgICAgICAubV8xMl9yOworICAgICAgICAgICAgLm9wYWNpdHkoMC44KTsKKyAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxNHB4OworICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICB9CisKKyAgICB9CisKKyAgICB1bC50b3AtbWVudSB7CisgICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKyAgICAgICAgbWFyZ2luOiAwIDAgMCAyMHB4OworICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICBmbGV4LWdyb3c6IDk5OTsKKworICAgICAgICAmID4gbGkgeworICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogNTBweDsKKyAgICAgICAgICAgIGhlaWdodDogNTBweDsKKyAgICAgICAgICAgIHBhZGRpbmc6IDAgMjBweDsKKworICAgICAgICAgICAgJi5zZWxlY3RlZCB7CisgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgNHB4IEBtYWluX2NvbG9yX2E7CisKKyAgICAgICAgICAgICAgICBhIHsKKyAgICAgICAgICAgICAgICAgICAgY29sb3I6IEBmdW5jX2NvbG9yX3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiY6aG92ZXIgeworICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDRweCBAbWFpbl9jb2xvcl9hOworICAgICAgICAgICAgfSovCisKKyAgICAgICAgICAgIGEgeworICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1tZWRpdW07CisgICAgICAgICAgICAgICAgY29sb3I6IEBtYWluX2NvbG9yX207CisgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4OworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICYudHJpYW5nbGUtZHJvcGRvd24geworICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgICAgICAgICAgICAgZGl2LnRyaWFuZ2xlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTdweDsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxOHB4OworCisgICAgICAgICAgICAgICAgICAgIC8vdGVtcCB1c2UgLSB1bnRpbCBuZXcgdHJpYW5nbGUgZ2V0cyBpbgorICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEwcHg7CisKKyAgICAgICAgICAgICAgICAgICAgJjpob3ZlciB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE1NiwgMTU2LCAxNTYsIDAuMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcnJvdy1yaWdodC1ob3ZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICsgbGkgYSB7CisgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAucHMtY29udGFpbmVyIHsKKyAgICAgICAgICAgICAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7CisgICAgICAgICAgICAgICAgICAgIHRvcDogNDBweDsKKyAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTsKKworICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0OiAwOworICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IG1heC1oZWlnaHQgMjAwbXMgZWFzZS1pbjsKKyAgICAgICAgICAgICAgICAgICAgLW1vei10cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDIwMG1zIGVhc2UtaW47CisgICAgICAgICAgICAgICAgICAgIC1vLXRyYW5zaXRpb246IG1heC1oZWlnaHQgMjAwbXMgZWFzZS1pbjsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAyMDBtcyBlYXNlLWluOworCisgICAgICAgICAgICAgICAgICAgIGRpdiB1bCB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAzNXB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUwcHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDM1cHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMCAxMHB4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJi5kaXNhYmxlZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYuc2VsZWN0ZWQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGx2X2NvbG9yX3Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IEBtYWluX2NvbG9yX2E7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDM1cHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMzBweDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAmLml0ZW0tY2xpY2s6aG92ZXIgLnBzLWNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAmLml0ZW0tY2xpY2s6YWN0aXZlIC5wcy1jb250YWluZXIgeworICAgICAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQGZ1bmNfY29sb3JfYjsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwcHggMnB4IDJweCAwcHggcmdiYSgyNCwgMjQsIDI1LCAwLjEpOworCisgICAgICAgICAgICAgICAgICAgIGRpdiB1bCB7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLnRvcC1zZWFyY2ggeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGZsZXgtZ3JvdzogMTsKKyAgICAgICAgcGFkZGluZzogMCAyMHB4OworCisgICAgICAgIGlucHV0LnNlYXJjaC10ZXh0IHsKKyAgICAgICAgICAgIC5ib3JkZXItcmFkaXVzKDJweCk7CisgICAgICAgICAgICB3aWR0aDogMjQ1cHg7CisgICAgICAgICAgICBoZWlnaHQ6IDMycHg7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBtYWluX2NvbG9yX287CisgICAgICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgICAgICAgdGV4dC1pbmRlbnQ6IDEwcHg7CisKKyAgICAgICAgICAgICY6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogU2FmYXJpLCBDaHJvbWUgYW5kIE9wZXJhICovCisgICAgICAgICAgICAmOi1tb3otcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRmlyZWZveCAxOC0gKi8KKyAgICAgICAgICAgICY6Oi1tb3otcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRmlyZWZveCAxOSsgKi8KKyAgICAgICAgICAgICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsgZm9udC1zdHlsZTogaXRhbGljOyB9IC8qIElFIDEwKyAqLworICAgICAgICAgICAgJjotbXMtaW5wdXQtcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRWRnZSAqLworICAgICAgICAgICAgIC8qICAgZm9udC1zdHlsZTogaXRhbGljOworICAgICAgICAgICAgfSovCisgICAgICAgICAgICAvKiBGaXJlZm94IDE4LSAqLworICAgICAgICAgICAgJjo6LW1vei1wbGFjZWhvbGRlciB7CisgICAgICAgICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRmlyZWZveCAxOSsgKi8KKyAgICAgICAgICAgICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKKyAgICAgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBJRSAxMCsgKi8KKyAgICAgICAgICAgICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKKyAgICAgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFZGdlICovCisgICAgICAgIH0KKworICAgICAgICAubWFnbmlmaWNhdGlvbiB7CisgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICB0b3A6IDE5cHg7CisgICAgICAgICAgICByaWdodDogMjZweDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLm5vdGlmaWNhdGlvbi1pY29uIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIG1hcmdpbjogMCAxMHB4IDZweCAwOworICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgLnZzcC1saXN0LWljb247CisKKyAgICAgICAgJjpob3ZlciB7CisgICAgICAgICAgICAudnNwLWxpc3QtaWNvbi1ob3ZlcjsKKyAgICAgICAgfQorCisgICAgICAgICY6YWN0aXZlIHsKKyAgICAgICAgICAgIC52c3AtbGlzdC1pY29uLWFjdGl2ZTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1uYXYvdG9wLW5hdi50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLW5hdi90b3AtbmF2LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NmU0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1uYXYvdG9wLW5hdi50cwpAQCAtMCwwICsxLDE1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJVG9wTmF2U2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICB0b3BMdmxTZWxlY3RlZEluZGV4OiBudW1iZXI7CisgICAgICAgIGhpZGVTZWFyY2g6IGJvb2xlYW47CisgICAgICAgIHNlYXJjaEJpbmQ6IGFueTsKKyAgICAgICAgbWVudU1vZGVsOiBBcnJheTxVdGlscy5NZW51SXRlbUdyb3VwPjsKKworICAgICAgICB0b3BMdmxNZW51OiBVdGlscy5NZW51SXRlbUdyb3VwOworICAgICAgICBnb1RvU3RhdGUoc3RhdGU6c3RyaW5nLCBwYXJhbXM6QXJyYXk8YW55Pik6bmcuSVByb21pc2U8Ym9vbGVhbj47CisgICAgICAgIG1lbnVJdGVtQ2xpY2s6IEZ1bmN0aW9uOworICAgICAgICB1c2VyOiBNb2RlbHMuSVVzZXJQcm9wZXJ0aWVzOworICAgICAgICB2ZXJzaW9uOnN0cmluZzsKKyAgICB9CisKKworICAgIGV4cG9ydCBjbGFzcyBUb3BOYXZEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRxOiBuZy5JUVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdXNlclJlc291cmNlU2VydmljZTogU2RjLlNlcnZpY2VzLklVc2VyUmVzb3VyY2VDbGFzcworICAgICAgICAgICAgKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHB1YmxpYyByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcHVibGljIHRyYW5zY2x1ZGUgPSBmYWxzZTsKKworCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgdG9wTHZsU2VsZWN0ZWRJbmRleDogJ0A/JywKKyAgICAgICAgICAgIGhpZGVTZWFyY2g6ICc9JywKKyAgICAgICAgICAgIHNlYXJjaEJpbmQ6ICc9JywKKyAgICAgICAgICAgIHZlcnNpb246ICdAJywKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkljb25DYWxsYmFjazogJz0nLAorICAgICAgICAgICAgbWVudU1vZGVsOiAnPT8nLAorICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1uYXYvdG9wLW5hdi5odG1sJyk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGxpbmsgPSAoc2NvcGU6SVRvcE5hdlNjb3BlLCAkZWxlbTpuZy5JQXVnbWVudGVkSlF1ZXJ5LCAkYXR0cnM6YW5ndWxhci5JQXR0cmlidXRlcykgPT4geworCisgICAgICAgICAgICBsZXQgZ2V0VG9wTHZsU2VsZWN0ZWRJbmRleEJ5U3RhdGUgPSAoKTpudW1iZXIgPT4geworICAgICAgICAgICAgICAgIGlmICghc2NvcGUudG9wTHZsTWVudS5tZW51SXRlbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IC0xOworCisgICAgICAgICAgICAgICAgLy9zZXQgcmVzdWx0IHRvIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgICAgICAgICBzY29wZS50b3BMdmxNZW51Lm1lbnVJdGVtcy5mb3JFYWNoKChpdGVtOlV0aWxzLk1lbnVJdGVtLCBpbmRleDpudW1iZXIpPT4geworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zdGF0ZSA9PT0gdGhpcy4kc3RhdGUuY3VycmVudC5uYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgLy9pZiBpdCdzIGEgZGlmZmVyZW50IHN0YXRlICwgY2hlY2tpbmcgcHJldmlvdXMgc3RhdGUgcGFyYW0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzY29wZS50b3BMdmxNZW51Lm1lbnVJdGVtcy5mb3JFYWNoKChpdGVtOlV0aWxzLk1lbnVJdGVtLCBpbmRleDpudW1iZXIpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc3RhdGUgPT09IHRoaXMuJHN0YXRlLnBhcmFtc1sncHJldmlvdXNTdGF0ZSddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLnVzZXIgPSB0aGlzLnVzZXJSZXNvdXJjZVNlcnZpY2UuZ2V0TG9nZ2VkaW5Vc2VyKCk7CisKKyAgICAgICAgICAgIGxldCB0bXBBcnJheTpBcnJheTxVdGlscy5NZW51SXRlbT4gPSBbCisgICAgICAgICAgICAgICAgbmV3IFV0aWxzLk1lbnVJdGVtKHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlRPUF9NRU5VX0hPTUVfQlVUVE9OIiksIG51bGwsICJkYXNoYm9hcmQiLCAiZ29Ub1N0YXRlIiwgbnVsbCwgbnVsbCksCisgICAgICAgICAgICAgICAgbmV3IFV0aWxzLk1lbnVJdGVtKHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlRPUF9NRU5VX0NBVEFMT0dfQlVUVE9OIiksIG51bGwsICJjYXRhbG9nIiwgImdvVG9TdGF0ZSIsIG51bGwsIG51bGwpCisgICAgICAgICAgICBdOworCisgICAgICAgICAgICAvLyBPbmx5IGRlc2lnbmVyIGNhbiBwZXJmb3JtIG9uYm9hcmRpbmcKKyAgICAgICAgICAgIGlmIChzY29wZS51c2VyICYmIHNjb3BlLnVzZXIucm9sZSA9PT0gJ0RFU0lHTkVSJyl7CisgICAgICAgICAgICAgICAgdG1wQXJyYXkucHVzaChuZXcgVXRpbHMuTWVudUl0ZW0odGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiVE9QX01FTlVfT05fQk9BUkRfQlVUVE9OIiksIG51bGwsICJvbmJvYXJkVmVuZG9yIiwgImdvVG9TdGF0ZSIsIG51bGwsIG51bGwpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2NvcGUudG9wTHZsTWVudSA9IG5ldyBVdGlscy5NZW51SXRlbUdyb3VwKDAsIHRtcEFycmF5ICwgdHJ1ZSApOworICAgICAgICAgICAgc2NvcGUudG9wTHZsTWVudS5zZWxlY3RlZEluZGV4ID0gaXNOYU4oc2NvcGUudG9wTHZsU2VsZWN0ZWRJbmRleCkgPyBnZXRUb3BMdmxTZWxlY3RlZEluZGV4QnlTdGF0ZSgpIDogc2NvcGUudG9wTHZsU2VsZWN0ZWRJbmRleDsKKworICAgICAgICAgICAgbGV0IGdlbmVyYXRlTWVudSA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUubWVudU1vZGVsICYmIHNjb3BlLm1lbnVNb2RlbFswXSAhPT0gc2NvcGUudG9wTHZsTWVudSkgeworICAgICAgICAgICAgICAgICAgICBzY29wZS5tZW51TW9kZWwudW5zaGlmdChzY29wZS50b3BMdmxNZW51KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdtZW51TW9kZWwnLCBnZW5lcmF0ZU1lbnUpOworCisgICAgICAgICAgICBnZW5lcmF0ZU1lbnUoKTsKKworICAgICAgICAgICAgLy8vLy9zY29wZSBmdW5jdGlvbnMvLy8vCisKKyAgICAgICAgICAgIHNjb3BlLmdvVG9TdGF0ZSA9IChzdGF0ZTpzdHJpbmcsIHBhcmFtczpBcnJheTxhbnk+KTpuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKHN0YXRlLCBwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA+IDAgPyBbMF0gOiB1bmRlZmluZWQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5tZW51SXRlbUNsaWNrID0gKGl0ZW1Hcm91cDpVdGlscy5NZW51SXRlbUdyb3VwLCBpdGVtOlV0aWxzLk1lbnVJdGVtKSA9PiB7CisKKyAgICAgICAgICAgICAgICBpdGVtR3JvdXAuaXRlbUNsaWNrID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1Hcm91cC5zZWxlY3RlZEluZGV4ID0gaXRlbUdyb3VwLm1lbnVJdGVtcy5pbmRleE9mKGl0ZW0pOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKCk6dm9pZCA9PiB7fTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIChpdGVtLmNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgaXRlbS5wYXJhbXMpKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlW2l0ZW0uYWN0aW9uXShpdGVtLnN0YXRlLCBpdGVtLnBhcmFtcykudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlLCAkcTogbmcuSVFTZXJ2aWNlLCB1c2VyUmVzb3VyY2VTZXJ2aWNlOiBTZGMuU2VydmljZXMuSVVzZXJSZXNvdXJjZUNsYXNzKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVG9wTmF2RGlyZWN0aXZlKCR0ZW1wbGF0ZUNhY2hlLCAkZmlsdGVyLCAkc3RhdGUsJHEsIHVzZXJSZXNvdXJjZVNlcnZpY2UpOworICAgICAgICB9OworCisgICAgfQorCisgICAgVG9wTmF2RGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCAnJGZpbHRlcicsICckc3RhdGUnLCckcScsICdTZGMuU2VydmljZXMuVXNlclJlc291cmNlU2VydmljZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xheW91dC90b3AtcHJvZ3Jlc3MvdG9wLXByb2dyZXNzLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1wcm9ncmVzcy90b3AtcHJvZ3Jlc3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjJjOGUzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xheW91dC90b3AtcHJvZ3Jlc3MvdG9wLXByb2dyZXNzLmh0bWwKQEAgLTAsMCArMSwyMiBAQAorPGRpdiBjbGFzcz0idG9wLXByb2dyZXNzIj4KKworICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUb3AgcHJvZ3Jlc3MgdmFyID09PT09PT09PT09PT09PT09PT09PT09LS0+CisgICAgPGRpdiBkYXRhLW5nLWlmPSJwcm9ncmVzc1ZhbHVlPjAgJiYgcHJvZ3Jlc3NWYWx1ZTwxMDAiPgorICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXByb2dyZXNzLXRpdGxlIj57e3Byb2dyZXNzTWVzc2FnZX19PHNwYW4gY2xhc3M9InByb2dyZXNzLXBlcmNlbnRhZ2UiPnt7cHJvZ3Jlc3NWYWx1ZX19Jm5ic3A7JTwvc3Bhbj48L3NwYW4+CisgICAgICAgIDxkaXYgY2xhc3M9InNkYy1wcm9ncmVzcyI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtYmFyLXN0cmlwZWQgYWN0aXZlIiByb2xlPSJwcm9ncmVzc2JhciIgYXJpYS12YWx1ZW5vdz0ie3twcm9ncmVzc1ZhbHVlfX0iIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9IjEwMCIgZGF0YS1uZy1zdHlsZT0ie3dpZHRoOiBwcm9ncmVzc1ZhbHVlKyclJ30iPjwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9InNkYy1wcm9ncmVzcy1zdWNjZXNzLXdyYXBwZXIiIGRhdGEtbmctaWY9InByb2dyZXNzVmFsdWU9PT0xMDAiPgorICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXByb2dyZXNzLXN1Y2Nlc3MiPjwvc3Bhbj4KKyAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1wcm9ncmVzcy1zdWNjZXNzLXRpdGxlIj57e3Byb2dyZXNzTWVzc2FnZX19PC9zcGFuPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0ic2RjLXByb2dyZXNzLWVycm9yLXdyYXBwZXIiIGRhdGEtbmctaWY9InByb2dyZXNzVmFsdWU9PT0tMSI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcHJvZ3Jlc3MtZXJyb3IiPjwvc3Bhbj4KKyAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1wcm9ncmVzcy1lcnJvci10aXRsZSI+e3twcm9ncmVzc01lc3NhZ2V9fTwvc3Bhbj4KKyAgICA8L2Rpdj4KKyAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVG9wIHByb2dyZXNzIHZhciA9PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLXByb2dyZXNzL3RvcC1wcm9ncmVzcy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xheW91dC90b3AtcHJvZ3Jlc3MvdG9wLXByb2dyZXNzLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjZTgyNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLXByb2dyZXNzL3RvcC1wcm9ncmVzcy5sZXNzCkBAIC0wLDAgKzEsNTggQEAKKy50b3AtcHJvZ3Jlc3MgeworICAgIHRleHQtYWxpZ246IGxlZnQ7CisKKyAgICAuc2RjLXByb2dyZXNzLXRpdGxlIHsKKyAgICAgICAgLm5fMTJfcjsKKworICAgICAgICAucHJvZ3Jlc3MtcGVyY2VudGFnZSB7CisgICAgICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuc2RjLXByb2dyZXNzIHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgaGVpZ2h0OiA2cHg7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluX2NvbG9yX287CisgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKKyAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjEpOworCisgICAgICAgIC5wcm9ncmVzcy1iYXIgeworICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW5fY29sb3JfYTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLnNkYy1wcm9ncmVzcy1zdWNjZXNzLXdyYXBwZXIgeworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CisKKyAgICAgICAgLnNkYy1wcm9ncmVzcy1zdWNjZXNzLXRpdGxlIHsKKyAgICAgICAgICAgIC5kXzEyX3I7CisgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICAgICAgfQorCisgICAgICAgIC5zZGMtcHJvZ3Jlc3Mtc3VjY2VzcyB7CisgICAgICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgICAgIC5zdWNjZXNzLWNpcmNsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC5zZGMtcHJvZ3Jlc3MtZXJyb3Itd3JhcHBlciB7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKKworICAgICAgICAuc2RjLXByb2dyZXNzLWVycm9yLXRpdGxlIHsKKyAgICAgICAgICAgIC5xXzEyX3I7CisgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICAgICAgfQorCisgICAgICAgIC5zZGMtcHJvZ3Jlc3MtZXJyb3IgeworICAgICAgICAgICAgLnNwcml0ZS1uZXc7CisgICAgICAgICAgICAuZXJyb3ItaWNvbjsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1wcm9ncmVzcy90b3AtcHJvZ3Jlc3MudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1wcm9ncmVzcy90b3AtcHJvZ3Jlc3MudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4YTI4OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLXByb2dyZXNzL3RvcC1wcm9ncmVzcy50cwpAQCAtMCwwICsxLDU3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElUb3BQcm9ncmVzc1Njb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgcHJvZ3Jlc3NWYWx1ZTpudW1iZXI7CisgICAgICAgIHByb2dyZXNzTWVzc2FnZTpzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFRvcFByb2dyZXNzRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpIHt9CisKKyAgICAgICAgcHVibGljIHJlcGxhY2UgPSB0cnVlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHB1YmxpYyB0cmFuc2NsdWRlID0gZmFsc2U7CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBwcm9ncmVzc1ZhbHVlOiAnPScsCisgICAgICAgICAgICBwcm9ncmVzc01lc3NhZ2U6ICc9JworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1wcm9ncmVzcy90b3AtcHJvZ3Jlc3MuaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBsaW5rID0gKHNjb3BlOklUb3BQcm9ncmVzc1Njb3BlLCAkZWxlbTpuZy5JQXVnbWVudGVkSlF1ZXJ5LCAkYXR0cnM6YW5ndWxhci5JQXR0cmlidXRlcykgPT4geworCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRvcFByb2dyZXNzRGlyZWN0aXZlKCR0ZW1wbGF0ZUNhY2hlKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIFRvcFByb2dyZXNzRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnXTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sb2FkZXIvbG9hZGVyLWRpcmVjdGl2ZS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xvYWRlci9sb2FkZXItZGlyZWN0aXZlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwYjA1OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sb2FkZXIvbG9hZGVyLWRpcmVjdGl2ZS5odG1sCkBAIC0wLDAgKzEsNCBAQAorPGRpdiBkYXRhLW5nLWlmPSJkaXNwbGF5IiBkYXRhLXRlc3RzLWlkPSJ0bHYtbG9hZGVyIj4KKyAgICA8ZGl2IGNsYXNzPSJ0bHYtbG9hZGVyLWJhY2sgIiBkYXRhLW5nLWNsYXNzPSJ7J3Rsdi1sb2FkZXItcmVsYXRpdmUnOnJlbGF0aXZlfSI+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0idGx2LWxvYWRlciB7e3NpemV9fSI+PC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sb2FkZXIvbG9hZGVyLWRpcmVjdGl2ZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xvYWRlci9sb2FkZXItZGlyZWN0aXZlLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwYjQxYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sb2FkZXIvbG9hZGVyLWRpcmVjdGl2ZS5sZXNzCkBAIC0wLDAgKzEsNzQgQEAKKy50bHYtbG9hZGVyLWJhY2sgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluX2NvbG9yX3A7CisgICAgcG9zaXRpb246IGZpeGVkOworICAgIHRvcDogNTBweDsKKyAgICBsZWZ0OiAwOworICAgIHJpZ2h0OiAwOworICAgIGJvdHRvbTogMDsKKyAgICB6LWluZGV4OiA5OTk5OworICAgIG9wYWNpdHk6IDAuNTsKK30KKworLnRsdi1sb2FkZXItcmVsYXRpdmUgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDt9CisKKy50bHYtbG9hZGVyIHsKKyAgICB6LWluZGV4OiAxMDAwMjsKK30KKworQGtleWZyYW1lcyBmYWRlaW4geworICAgIGZyb20geyBvcGFjaXR5OiAwOyB9CisgICAgdG8gICB7IG9wYWNpdHk6IDAuODsgfQorfQorCisvKiBGaXJlZm94IDwgMTYgKi8KK0AtbW96LWtleWZyYW1lcyBmYWRlaW4geworICAgIGZyb20geyBvcGFjaXR5OiAwOyB9CisgICAgdG8gICB7IG9wYWNpdHk6IDAuODsgfQorfQorCisvKiBTYWZhcmksIENocm9tZSBhbmQgT3BlcmEgPiAxMi4xICovCitALXdlYmtpdC1rZXlmcmFtZXMgZmFkZWluIHsKKyAgICBmcm9tIHsgb3BhY2l0eTogMDsgfQorICAgIHRvICAgeyBvcGFjaXR5OiAwLjg7IH0KK30KKworLyogSW50ZXJuZXQgRXhwbG9yZXIgKi8KK0AtbXMta2V5ZnJhbWVzIGZhZGVpbiB7CisgICAgZnJvbSB7IG9wYWNpdHk6IDA7IH0KKyAgICB0byAgIHsgb3BhY2l0eTogMC44OyB9Cit9CisKKy8qIE9wZXJhIDwgMTIuMSAqLworQC1vLWtleWZyYW1lcyBmYWRlaW4geworICAgIGZyb20geyBvcGFjaXR5OiAwOyB9CisgICAgdG8gICB7IG9wYWNpdHk6IDAuODsgfQorfQorCitAa2V5ZnJhbWVzIGZhZGVvdXQgeworICAgIGZyb20geyBvcGFjaXR5OiAwLjg7IH0KKyAgICB0byAgIHsgb3BhY2l0eTogMDsgfQorfQorCisvKiBGaXJlZm94IDwgMTYgKi8KK0AtbW96LWtleWZyYW1lcyBmYWRlb3V0IHsKKyAgICBmcm9tIHsgb3BhY2l0eTogMC44OyB9CisgICAgdG8gICB7IG9wYWNpdHk6IDA7IH0KK30KKworLyogU2FmYXJpLCBDaHJvbWUgYW5kIE9wZXJhID4gMTIuMSAqLworQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVvdXQgeworICAgIGZyb20geyBvcGFjaXR5OiAwLjg7IH0KKyAgICB0byAgIHsgb3BhY2l0eTogMDsgfQorfQorCisvKiBJbnRlcm5ldCBFeHBsb3JlciAqLworQC1tcy1rZXlmcmFtZXMgZmFkZW91dCB7CisgICAgZnJvbSB7IG9wYWNpdHk6IDAuODsgfQorICAgIHRvICAgeyBvcGFjaXR5OiAwOyB9Cit9CisKKy8qIE9wZXJhIDwgMTIuMSAqLworQC1vLWtleWZyYW1lcyBmYWRlb3V0IHsKKyAgICBmcm9tIHsgb3BhY2l0eTogMC44OyB9CisgICAgdG8gICB7IG9wYWNpdHk6IDA7IH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sb2FkZXIvbG9hZGVyLWRpcmVjdGl2ZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9sb2FkZXIvbG9hZGVyLWRpcmVjdGl2ZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M4OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xvYWRlci9sb2FkZXItZGlyZWN0aXZlLnRzCkBAIC0wLDAgKzEsMTU1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgZXhwb3J0IGludGVyZmFjZSBJTG9hZGVyU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBkaXNwbGF5OiBib29sZWFuOyAgICAgICAgLy8gVG9nZ2xlIHNob3cgfHwgaGlkZSBzY3JvbGwKKyAgICAgICAgc2l6ZTogc3RyaW5nOyAgICAgICAgICAgIC8vIHNtYWxsIHx8IG1lZGl1bSB8fCBsYXJnZQorICAgICAgICBlbGVtZW50U2VsZWN0b3I6IHN0cmluZzsgLy8gSnF1ZXJ5IHNlbGVjdG9yIHRvIGhpZGUgYW5kIHNjcm9sbCBpbnNpZGUKKyAgICAgICAgcmVsYXRpdmU6IGJvb2xlYW47ICAgICAgIC8vIFdpbGwgdXNlIHRoZSBwYXJlbnQgb2YgPGxvYWRlcj4gZWxlbWVudCBhbmQgaGlkZSBpdCBhbmQgc2Nyb2xsIGluc2lkZQorICAgICAgICBsb2FkZXJUeXBlOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIExvYWRlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6IG5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgcHJpdmF0ZSBFdmVudExpc3RlbmVyU2VydmljZTogU2VydmljZXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIHJlbGF0aXZlIGlzIHVzZWQgd2hlbiBpbnNlcnRpbmcgdGhlIEhUTUwgbG9hZGVyIGluc2lkZSBzb21lIGRpdiA8bG9hZGVyIGRhdGEtZGlzcGxheT0iaXNMb2FkaW5nIiByZWxhdGl2ZT0idHJ1ZSI+PC9sb2FkZXI+CisgICAgICAgICAqIGVsZW1lbnRTZWxlY3RvciB3aGVuIHdlIHdhbnQgdG8gcGFzcyB0aGUgSnF1ZXJ5IHNlbGVjdG9yIG9mIHRoZSBsb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIGRpc3BsYXk6ICc9JywKKyAgICAgICAgICAgIHNpemU6ICdAPycsCisgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdAPycsCisgICAgICAgICAgICByZWxhdGl2ZTogJz0/JywKKyAgICAgICAgICAgIGxvYWRlclR5cGU6ICdAPycKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHRlbXBsYXRlID0gKCk6IHN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL2xvYWRlci9sb2FkZXItZGlyZWN0aXZlLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOiBJTG9hZGVyU2NvcGUsIGVsZW1lbnQ6IGFueSkgPT4geworCisgICAgICAgICAgICBsZXQgaW50ZXJ2YWw7CisKKyAgICAgICAgICAgIHRoaXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlckNhbGxiYWNrKFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuU0hPV19MT0FERVJfRVZFTlQsIChsb2FkZXJUeXBlKT0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUubG9hZGVyVHlwZSAhPT0gbG9hZGVyVHlwZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BsYXkgPSB0cnVlOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0aGlzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayhVdGlscy5Db25zdGFudHMuRVZFTlRTLkhJREVfTE9BREVSX0VWRU5ULCAobG9hZGVyVHlwZSk9PiB7CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmxvYWRlclR5cGUgIT09IGxvYWRlclR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5ID0gZmFsc2U7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbGV0IGNhbGN1bGF0ZVNpemVzRm9yRml4UG9zaXRpb24gPSAocG9zaXRpb25TdHlsZTogc3RyaW5nKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9ibGVtYXRpYywgSSBkbyBub3Qgd2FudCB0byBjaGFuZ2UgdGhlIHBhcmVudCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGxvYWRlciBvbiBhbGwgdGhlIHNjcmVlbgorICAgICAgICAgICAgICAgIGxldCBwYXJlbnRQb3NpdGlvbiA9IGVsZW1lbnQucGFyZW50KCkucG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBsZXQgcGFyZW50V2lkdGggPSBlbGVtZW50LnBhcmVudCgpLndpZHRoKCk7CisgICAgICAgICAgICAgICAgbGV0IHBhcmVudEhlaWdodCA9IGVsZW1lbnQucGFyZW50KCkuaGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgZWxlbWVudC5jc3MoJ3Bvc2l0aW9uJywgcG9zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgZWxlbWVudC5jc3MoJ3RvcCcsIHBhcmVudFBvc2l0aW9uLnRvcCk7CisgICAgICAgICAgICAgICAgZWxlbWVudC5jc3MoJ2xlZnQnLCBwYXJlbnRQb3NpdGlvbi5sZWZ0KTsKKyAgICAgICAgICAgICAgICBlbGVtZW50LmNzcygnd2lkdGgnLCBwYXJlbnRXaWR0aCk7CisgICAgICAgICAgICAgICAgZWxlbWVudC5jc3MoJ2hlaWdodCcsIHBhcmVudEhlaWdodCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgc2V0U3R5bGUgPSAocG9zaXRpb25TdHlsZTogc3RyaW5nKTogdm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWJzb2x1dGUnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdmaXhlZCc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IHNpemUgaXMgbm90IHNldCB5ZXQsIHN0aWxsIGxvYWRpbmcsIHNvIG5lZWQgdG8gdXNlIGludGVydmFsIHRvIHVwZGF0ZSB0aGUgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gd2luZG93LnNldEludGVydmFsKCgpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVNpemVzRm9yRml4UG9zaXRpb24ocG9zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGNoYW5nZSB0aGUgcGFyZW50IHBvc2l0aW9uIHRvIHJlbGF0aXZlIHdpdGhvdXQgY2F1c2luZyBzdHlsZSBpc3N1ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudCgpLmNzcygncG9zaXRpb24nLCAncmVsYXRpdmUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBkb20gbG9hZGVkCisgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKTogdm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsICdub25lJyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZWxlbWVudFNlbGVjdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtUGFyZW50ID0gYW5ndWxhci5lbGVtZW50KHNjb3BlLmVsZW1lbnRTZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvblN0eWxlOiBzdHJpbmcgPSBlbGVtUGFyZW50LmNzcygncG9zaXRpb24nKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0U3R5bGUocG9zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnJlbGF0aXZlID09PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvblN0eWxlOiBzdHJpbmcgPSBlbGVtZW50LnBhcmVudCgpLmNzcygncG9zaXRpb24nKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0U3R5bGUocG9zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFzY29wZS5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLnNpemUgPSAnbGFyZ2UnOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSwgMCk7CisKKyAgICAgICAgICAgIGlmIChzY29wZS5lbGVtZW50U2VsZWN0b3IpIHsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgeworICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS4kd2F0Y2goImRpc3BsYXkiLCAobmV3VmFsLCBvbGRWYWwpID0+IHsKKyAgICAgICAgICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsICdub25lJyk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsICdibG9jaycpOworICAgICAgICAgICAgICAgICAgICB9LCA1MDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBjbGVhblVwKTsKKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTogbmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCBFdmVudExpc3RlbmVyU2VydmljZTogU2VydmljZXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2FkZXJEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUsIEV2ZW50TGlzdGVuZXJTZXJ2aWNlKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIExvYWRlckRpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJywgJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbW9kYWwvc2RjLW1vZGFsLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbW9kYWwvc2RjLW1vZGFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0MTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9tb2RhbC9zZGMtbW9kYWwuaHRtbApAQCAtMCwwICsxLDE4IEBACis8ZGl2IGRhdGEtbmctY2xhc3M9Insndy1zZGMtbW9kYWwnOiB0eXBlPT09dW5kZWZpbmVkLCAndy1zZGMtY2xhc3NpYy1tb2RhbCc6IHR5cGU9PT0nY2xhc3NpYyd9Ij4KKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1tb2RhbC1oZWFkIj4KKyAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0iaGVhZGVyIiBjbGFzcz0idy1zZGMtbW9kYWwtaGVhZC10ZXh0Ij57e2hlYWRlcn19PC9zcGFuPgorICAgICAgICA8c3BhbiBkYXRhLW5nLWlmPSJoZWFkZXJUcmFuc2xhdGUiIGNsYXNzPSJ3LXNkYy1tb2RhbC1oZWFkLXRleHQiIHRyYW5zbGF0ZT0ie3toZWFkZXJUcmFuc2xhdGV9fSIgdHJhbnNsYXRlLXZhbHVlcz0ie3toZWFkZXJUcmFuc2xhdGVWYWx1ZXN9fSI+PC9zcGFuPgorICAgICAgICA8ZGl2IGRhdGEtbmctaWY9InNob3dDbG9zZUJ1dHRvbj09PSd0cnVlJyIgY2xhc3M9Inctc2RjLW1vZGFsLWNsb3NlIiBkYXRhLW5nLWNsaWNrPSJjYW5jZWwoKSI+PC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtYm9keSIgZGF0YS1uZy1jbGFzcz0ieydjbGFzc2ljJzogdHlwZT09PSdjbGFzc2ljJ30iPgorICAgICAgICA8bmctdHJhbnNjbHVkZT48L25nLXRyYW5zY2x1ZGU+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtZm9vdGVyIiBkYXRhLW5nLWlmPSJ0eXBlPT09J2NsYXNzaWMnICYmIGJ1dHRvbnMhPT11bmRlZmluZWQiPgorICAgICAgICA8YnV0dG9uIGRhdGEtbmctcmVwZWF0PSJidXR0b24gaW4gYnV0dG9ucyIKKyAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ7e2J1dHRvbi5uYW1lfX0iCisgICAgICAgICAgICAgICAgY2xhc3M9InRsdi1idG4ge3tidXR0b24uY3NzfX0iCisgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGJ1dHRvbi5kaXNhYmxlZD09PXRydWV9IgorICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9ImJ1dHRvbi5kaXNhYmxlZD09PXRydWUiCisgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iYnV0dG9uLmNhbGxiYWNrKCkiPnt7YnV0dG9uLm5hbWV9fTwvYnV0dG9uPgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbW9kYWwvc2RjLW1vZGFsLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbW9kYWwvc2RjLW1vZGFsLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkZmRiYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9tb2RhbC9zZGMtbW9kYWwubGVzcwpAQCAtMCwwICsxLDEwIEBACisuZWxsaXBzaXMtZGlyZWN0aXZlLW1vcmUtbGVzcyB7CisgICAgLmFfOTsKKyAgICAuYm9sZDsKKyAgICAuaGFuZDsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luLXJpZ2h0OiAxN3B4OworICAgIGxpbmUtaGVpZ2h0OiAyM3B4OworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvbW9kYWwvc2RjLW1vZGFsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL21vZGFsL3NkYy1tb2RhbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzgwMzVjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL21vZGFsL3NkYy1tb2RhbC50cwpAQCAtMCwwICsxLDEwMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJU2RjTW9kYWxTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisgICAgICAgIGhpZGVCYWNrZ3JvdW5kOnN0cmluZzsKKyAgICAgICAgb2soKTp2b2lkOworICAgICAgICBjbG9zZShyZXN1bHQ6YW55KTp2b2lkOworICAgICAgICBjYW5jZWwocmVhc29uOmFueSk6dm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElTZGNNb2RhbEJ1dHRvbiB7CisgICAgICAgIG5hbWU6c3RyaW5nOworICAgICAgICBjc3M6c3RyaW5nOworICAgICAgICBkaXNhYmxlZD86Ym9vbGVhbjsKKyAgICAgICAgY2FsbGJhY2s6RnVuY3Rpb247CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFNkY01vZGFsRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IoCisgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOiBuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UKKyAgICAgICAgKSB7fQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgbW9kYWw6ICc9JywKKyAgICAgICAgICAgIHR5cGU6ICdAJywKKyAgICAgICAgICAgIGhlYWRlcjogJ0AnLAorICAgICAgICAgICAgaGVhZGVyVHJhbnNsYXRlOiAnQCcsCisgICAgICAgICAgICBoZWFkZXJUcmFuc2xhdGVWYWx1ZXM6ICdAJywKKyAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogJ0AnLAorICAgICAgICAgICAgaGlkZUJhY2tncm91bmQ6ICdAJywKKyAgICAgICAgICAgIGJ1dHRvbnM6ICc9JywKKyAgICAgICAgICAgIGdldENsb3NlTW9kYWxSZXNwb25zZTogJz0nCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHJlcGxhY2UgPSB0cnVlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHB1YmxpYyB0cmFuc2NsdWRlID0gdHJ1ZTsKKworICAgICAgICB0ZW1wbGF0ZSA9ICgpOiBzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9tb2RhbC9zZGMtbW9kYWwuaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SVNkY01vZGFsU2NvcGUsICRlbGVtOmFueSkgPT4geworCisgICAgICAgICAgICBpZiAoc2NvcGUuaGlkZUJhY2tncm91bmQ9PT0idHJ1ZSIpeworICAgICAgICAgICAgICAgICQoIi5tb2RhbC1iYWNrZHJvcCIpLmNzcygnb3BhY2l0eScsJzAnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2NvcGUuY2xvc2UgPSBmdW5jdGlvbiAocmVzdWx0OmFueSkgeworICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsLmNsb3NlKHJlc3VsdCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5vayA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICBzY29wZS5tb2RhbC5jbG9zZSgpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUuY2FuY2VsID0gZnVuY3Rpb24gKHJlYXNvbjphbnkpIHsKKyAgICAgICAgICAgICAgICBpZih0aGlzLmdldENsb3NlTW9kYWxSZXNwb25zZSkKKyAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsLmRpc21pc3ModGhpcy5nZXRDbG9zZU1vZGFsUmVzcG9uc2UoKSk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAoc2NvcGUubW9kYWwpIHsKKyAgICAgICAgICAgICAgICBzY29wZS5tb2RhbC5yZXN1bHQudGhlbihmdW5jdGlvbiAoc2VsZWN0ZWRJdGVtKSB7CisgICAgICAgICAgICAgICAgICAgIC8vJHNjb3BlLnNlbGVjdGVkID0gc2VsZWN0ZWRJdGVtOworICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmluZm8oJ01vZGFsIGRpc21pc3NlZCBhdDogJyArIG5ldyBEYXRlKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOiBuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZGNNb2RhbERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSk7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBTZGNNb2RhbERpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcGFnZS1zY3JvbGxlci9wYWdlLXNjcm9sbGVyLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcGFnZS1zY3JvbGxlci9wYWdlLXNjcm9sbGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1OTM4NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wYWdlLXNjcm9sbGVyL3BhZ2Utc2Nyb2xsZXIuaHRtbApAQCAtMCwwICsxLDIyIEBACis8ZGl2IGNsYXNzPSJzZGMtcGFnZS1zY3JvbGxlciI+CisKKyAgICA8bmF2IGRhdGEtbmctaWY9InNob3dOYXYhPT1mYWxzZSIgY2xhc3M9IndlbGNvbWUtbmF2Ij4KKyAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJzaG93Q2xvc2VCdXR0b249PT10cnVlIiBkYXRhLW5nLWNsaWNrPSJvbkNsb3NlQnV0dG9uQ2xpY2soKSIgY2xhc3M9ImFzZGMtd2VsY29tZS1jbG9zZSI+PC9kaXY+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdD0ic2xpZGUgaW4gc2xpZGVzRGF0YSB8IG9yZGVyQnk6Jytwb3NpdGlvbiciPjxhIGhyZWY9IiN7e3NsaWRlLmlkfX0iIGRhdGEtbmctY2xpY2s9Im9uTmF2QnV0dG9uQ2xpY2soc2xpZGUpIiBjbGFzcz0iIj48L2E+PC9saT4KKyAgICAgICAgPC91bD4KKyAgICA8L25hdj4KKworICAgIDxkaXYgY2xhc3M9Im5hdi1wcmV2aW91cy1uZXh0IiBkYXRhLW5nLWlmPSJzaG93UHJldmlvdXNOZXh0PT09dHJ1ZSI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJnby1wcmV2IiBkYXRhLW5nLWNsaWNrPSJnb1RvUHJldlNsaWRlKCkiPnByZXZpb3VzIHNsaWRlPC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0iZ28tbmV4dCIgZGF0YS1uZy1jbGljaz0iZ29Ub05leHRTbGlkZSgpIj5uZXh0IHNsaWRlPC9zcGFuPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0ic2xpZGVzLWNvbnRhaW5lciI+CisgICAgICAgIDxzZWN0aW9uIGRhdGEtbmctcmVwZWF0PSJzbGlkZSBpbiBzbGlkZXNEYXRhIHwgb3JkZXJCeTonK3Bvc2l0aW9uJyIgY2xhc3M9InNsaWRlIiBpZD0ie3tzbGlkZS5pZH19IiBvbi1sYXN0LXJlcGVhdD4KKyAgICAgICAgICAgIDxuZy1pbmNsdWRlIHNyYz0ic2xpZGUudXJsIj48L25nLWluY2x1ZGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L2Rpdj4KKworPC9kaXY+CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wYWdlLXNjcm9sbGVyL3BhZ2Utc2Nyb2xsZXIubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wYWdlLXNjcm9sbGVyL3BhZ2Utc2Nyb2xsZXIubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY4NTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3BhZ2Utc2Nyb2xsZXIvcGFnZS1zY3JvbGxlci5sZXNzCkBAIC0wLDAgKzEsOTggQEAKKy5zZGMtcGFnZS1zY3JvbGxlciB7CisKKyAgICAvKioqKioqKioqKioqKioqKioqIE5hdmlnYXRpb24gKioqKioqKioqKioqKioqLworICAgIG5hdiB7CisgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKKyAgICAgICAgdG9wOiAwOworICAgICAgICByaWdodDogMDsKKyAgICAgICAgei1pbmRleDogMTAwOworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICAgICAgICB3aWR0aDogMTAwcHg7CisgICAgICAgIGJvdHRvbTogMDsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgfQorCisgICAgbmF2IHVsIHsKKyAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICBtYXJnaW4tdG9wOiAwOworICAgICAgICBwYWRkaW5nOiAwOworICAgIH0KKworICAgIG5hdiB1bCBsaSB7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OworCisgICAgfQorCisgICAgbmF2IHVsIGxpOmxhc3QtY2hpbGQgeworCisgICAgfQorCisgICAgbmF2IGEgeworICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgaGVpZ2h0OiA2cHg7CisgICAgICAgIHdpZHRoOiA2cHg7CisgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzRhNGM0ZDsKKyAgICB9CisKKyAgICBuYXYgYS5hY3RpdmUgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgfQorCisgICAgbmF2IGEuYWN0aXZlOjphZnRlciB7CisgICAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjMDE5OGQxOworICAgICAgICB3aWR0aDogMTZweDsKKyAgICAgICAgaGVpZ2h0OiAxNnB4OworICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CisgICAgICAgIHRvcDogLTVweDsKKyAgICAgICAgbGVmdDogLTVweDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqIFByZXZpb3VzIE5leHQgbmF2aWdhdGlvbiAqKioqKioqKioqKioqKiovCisgICAgLmdvLXByZXYsIC5nby1uZXh0IHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgICAgfQorCisgICAgLnNsaWRlcy1jb250YWluZXIgeworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIGxlZnQ6IDA7CisgICAgICAgIHRvcDogMDsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuOworICAgICAgICB6LWluZGV4OiAxMDsKKyAgICB9CisKKyAgICAuc2xpZGUgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgfQorCisgICAgLnNsaWRlIC5jZW50ZXJlZCB7CisgICAgICAgIHdpZHRoOiA2MCU7CisgICAgICAgIG1hcmdpbjogMjAwcHggYXV0byAwOworICAgIH0KKworICAgIC5zbGlkZSAuY2VudGVyZWQgaDEgeworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgfQorCisgICAgLnNsaWRlIC5jZW50ZXJlZCBwIHsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OworICAgICAgICBmb250LXNpemU6IDIwcHg7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcGFnZS1zY3JvbGxlci9wYWdlLXNjcm9sbGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3BhZ2Utc2Nyb2xsZXIvcGFnZS1zY3JvbGxlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg5ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3BhZ2Utc2Nyb2xsZXIvcGFnZS1zY3JvbGxlci50cwpAQCAtMCwwICsxLDI0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBTbGlkZURhdGEgeworICAgICAgICB1cmw6IHN0cmluZzsKKyAgICAgICAgaWQ6IHN0cmluZzsKKyAgICAgICAgaW5kZXg6IG51bWJlcjsKKyAgICAgICAgY2FsbGJhY2s6IEZ1bmN0aW9uOworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVNkY1BhZ2VTY3JvbGxEaXJlY3RpdmVTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIHNsaWRlc0RhdGE6QXJyYXk8U2xpZGVEYXRhPjsKKyAgICAgICAgc2hvd05hdjogYm9vbGVhbjsKKyAgICAgICAgc2hvd1ByZXZpb3VzTmV4dDogYm9vbGVhbjsKKyAgICAgICAgY3VycmVudFNsaWRlOlNsaWRlRGF0YTsKKyAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOmJvb2xlYW47CisgICAgICAgIGNsb3NlQnV0dG9uQ2FsbGJhY2s6RnVuY3Rpb247CisgICAgICAgIHN0YXJ0U2xpZGVJbmRleDpudW1iZXI7CisKKyAgICAgICAgb25OYXZCdXR0b25DbGljayhzbGlkZU5hbWUpOnZvaWQ7CisgICAgICAgIG9uQ2xvc2VCdXR0b25DbGljaygpOnZvaWQ7CisgICAgICAgIGdvVG9QcmV2U2xpZGUoKTp2b2lkOworICAgICAgICBnb1RvTmV4dFNsaWRlKCk6dm9pZDsKKyAgICAgICAgZ29Ub1NsaWRlKHNsaWRlOlNsaWRlRGF0YSk6dm9pZDsKKyAgICAgICAgb25TbGlkZUNoYW5nZUVuZCgpOnZvaWQ7CisgICAgICAgIG9uTW91c2VXaGVlbChldmVudCk6dm9pZDsKKyAgICAgICAgb25LZXlEb3duKGV2ZW50KTp2b2lkOworICAgICAgICBvblJlc2l6ZShldmVudCk6dm9pZDsKKyAgICAgICAgZ290b1NsaWRlSW5kZXgoaW5kZXgpOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFNkY1BhZ2VTY3JvbGxEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSkgeworCisgICAgICAgIH0KKworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIHNsaWRlc0RhdGE6ICc9JywKKyAgICAgICAgICAgIHNob3dOYXY6ICc9JywKKyAgICAgICAgICAgIHNob3dQcmV2aW91c05leHQ6ICc9JywKKyAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogJz0nLAorICAgICAgICAgICAgY2xvc2VCdXR0b25DYWxsYmFjazogJz0nLAorICAgICAgICAgICAgc3RhcnRTbGlkZUluZGV4OiAnPT8nCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHJlcGxhY2UgPSB0cnVlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHByaXZhdGUgZGVsYXlFeGVjOmFueTsKKworICAgICAgICB0ZW1wbGF0ZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3BhZ2Utc2Nyb2xsZXIvcGFnZS1zY3JvbGxlci5odG1sJyk7CisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9ICgkc2NvcGU6SVNkY1BhZ2VTY3JvbGxEaXJlY3RpdmVTY29wZSwgJGVsZW06SlF1ZXJ5LCBhdHRyOmFueSkgPT4geworICAgICAgICAgICAgbGV0IGlzQW5pbWF0aW5nID0gZmFsc2U7IC8vQW5pbWF0aW5nIGZsYWcgLSBpcyBvdXIgYXBwIGFuaW1hdGluZworICAgICAgICAgICAgbGV0IHBhZ2VIZWlnaHQgPSAkKHdpbmRvdykuaW5uZXJIZWlnaHQoKTsgLy9UaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cKKyAgICAgICAgICAgIGxldCBzbGlkZXNDb250YWluZXI7CisgICAgICAgICAgICBsZXQgbmF2QnV0dG9uczsKKyAgICAgICAgICAgIGxldCBzbGlkZXM6YW55OyAvL09ubHkgZ3JhcGgtbGlua3MgdGhhdCBzdGFydHMgd2l0aAorCisgICAgICAgICAgICAvL0tleSBjb2RlcyBmb3IgdXAgYW5kIGRvd24gYXJyb3dzIG9uIGtleWJvYXJkLiBXZSdsbCBiZSB1c2luZyB0aGlzIHRvIG5hdmlnYXRlIGNoYW5nZSBzbGlkZXMgdXNpbmcgdGhlIGtleWJvYXJkCisgICAgICAgICAgICBsZXQga2V5Q29kZXMgPSB7CisgICAgICAgICAgICAgICAgVVAgIDogMzgsCisgICAgICAgICAgICAgICAgRE9XTjogNDAKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICRzY29wZS5vbkNsb3NlQnV0dG9uQ2xpY2sgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmNsb3NlQnV0dG9uQ2FsbGJhY2speworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY2xvc2VCdXR0b25DYWxsYmFjaygpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgZG9tIHRvIGxvYWQgKGFmdGVyIG5nUmVwZWF0KS4KKyAgICAgICAgICAgICRzY29wZS4kb24oJ29uUmVwZWF0TGFzdCcsIChzY29wZSwgZWxlbWVudCwgYXR0cnMpID0+IHsKKyAgICAgICAgICAgICAgICBzbGlkZXMgPSAkKCIuc2xpZGUiLCBzbGlkZXNDb250YWluZXIpOworICAgICAgICAgICAgICAgIHNsaWRlc0NvbnRhaW5lciA9ICQoIi5zbGlkZXMtY29udGFpbmVyIik7CisgICAgICAgICAgICAgICAgbmF2QnV0dG9ucyA9ICQoIm5hdiBhIikuZmlsdGVyKCJbaHJlZl49JyMnXSIpOworCisgICAgICAgICAgICAgICAgLy8gQWRkaW5nIGV2ZW50IGxpc3RlbmVycworICAgICAgICAgICAgICAgICQod2luZG93KS5vbigicmVzaXplIiwgKGUpID0+IHskc2NvcGUub25SZXNpemUoZSk7fSkucmVzaXplKCk7CisgICAgICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCJtb3VzZXdoZWVsIERPTU1vdXNlU2Nyb2xsIiwgKGUpID0+IHskc2NvcGUub25Nb3VzZVdoZWVsKGUpO30pOworICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCJrZXlkb3duIiwgKGUpID0+IHskc2NvcGUub25LZXlEb3duKGUpO30pOworCisgICAgICAgICAgICAgICAgLy9Hb2luZyB0byB0aGUgZmlyc3Qgc2xpZGUKKyAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnN0YXJ0U2xpZGVJbmRleCl7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5nb3RvU2xpZGVJbmRleCgkc2NvcGUuc3RhcnRTbGlkZUluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ290b1NsaWRlSW5kZXgoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJHNjb3BlLmdvdG9TbGlkZUluZGV4ID0gKGluZGV4KSA9PiB7CisgICAgICAgICAgICAgICAgJHNjb3BlLmdvVG9TbGlkZSgkc2NvcGUuc2xpZGVzRGF0YVtpbmRleF0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gV2hlbiBhIGJ1dHRvbiBpcyBjbGlja2VkIC0gZmlyc3QgZ2V0IHRoZSBidXR0b24gaHJlZiwgYW5kIHRoZW4gc2xpZGUgdG8gdGhlIGNvbnRhaW5lciwgaWYgdGhlcmUncyBzdWNoIGEgY29udGFpbmVyCisgICAgICAgICAgICAkc2NvcGUub25OYXZCdXR0b25DbGljayA9IChzbGlkZTpTbGlkZURhdGEpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICRzY29wZS5nb1RvU2xpZGUoc2xpZGUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHByZXZpb3VzIHNsaWRlLCBzbGlkZSB0byBpdAorICAgICAgICAgICAgJHNjb3BlLmdvVG9QcmV2U2xpZGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNTbGlkZSA9ICRzY29wZS5zbGlkZXNEYXRhWyRzY29wZS5jdXJyZW50U2xpZGUuaW5kZXgtMV07CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzU2xpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdvVG9TbGlkZShwcmV2aW91c1NsaWRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgbmV4dCBzbGlkZSwgc2xpZGUgdG8gaXQKKyAgICAgICAgICAgICRzY29wZS5nb1RvTmV4dFNsaWRlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5leHRTbGlkZSA9ICRzY29wZS5zbGlkZXNEYXRhWyRzY29wZS5jdXJyZW50U2xpZGUuaW5kZXgrMV07CisgICAgICAgICAgICAgICAgaWYgKG5leHRTbGlkZSkgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ29Ub1NsaWRlKG5leHRTbGlkZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gQWN0dWFsIHRyYW5zaXRpb24gYmV0d2VlbiBzbGlkZXMKKyAgICAgICAgICAgICRzY29wZS5nb1RvU2xpZGUgPSAoc2xpZGU6U2xpZGVEYXRhKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJzdGFydCBnb1RvU2xpZGUiKTsKKyAgICAgICAgICAgICAgICAvL0lmIHRoZSBzbGlkZXMgYXJlIG5vdCBjaGFuZ2luZyBhbmQgdGhlcmUncyBzdWNoIGEgc2xpZGUKKyAgICAgICAgICAgICAgICBpZighaXNBbmltYXRpbmcgJiYgc2xpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9zZXR0aW5nIGFuaW1hdGluZyBmbGFnIHRvIHRydWUKKyAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY3VycmVudFNsaWRlID0gc2xpZGU7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5jdXJyZW50U2xpZGUuY2FsbGJhY2soKTsKKworICAgICAgICAgICAgICAgICAgICAvL1NsaWRpbmcgdG8gY3VycmVudCBzbGlkZQorICAgICAgICAgICAgICAgICAgICBsZXQgY2FsY3VsYXRlZFkgPSBwYWdlSGVpZ2h0ICogKCRzY29wZS5jdXJyZW50U2xpZGUuaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCIkc2NvcGUuY3VycmVudFNsaWRlLmluZGV4OiAiICsgJHNjb3BlLmN1cnJlbnRTbGlkZS5pbmRleCArICIgfCBjYWxjdWxhdGVkWTogIiArIGNhbGN1bGF0ZWRZKTsKKworICAgICAgICAgICAgICAgICAgICAkKCcuc2xpZGVzLWNvbnRhaW5lcicpLmFuaW1hdGUoCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBjYWxjdWxhdGVkWSArICdweCcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbEVhc2luZzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogImxpbmVhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogImVhc2VJbk91dFF1YXJ0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUub25TbGlkZUNoYW5nZUVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICAgICAvL0FuaW1hdGluZyBtZW51IGl0ZW1zCisgICAgICAgICAgICAgICAgICAgICQoIi5zZGMtcGFnZS1zY3JvbGxlciBuYXYgYS5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7CisgICAgICAgICAgICAgICAgICAgICQoIi5zZGMtcGFnZS1zY3JvbGxlciBuYXYgW2hyZWY9JyMiICsgJHNjb3BlLmN1cnJlbnRTbGlkZS5pZCArICInXSIpLmFkZENsYXNzKCJhY3RpdmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBPbmNlIHRoZSBzbGlkaW5nIGlzIGZpbmlzaGVkLCB3ZSBuZWVkIHRvIHJlc3RvcmUgImlzQW5pbWF0aW5nIiBmbGFnLgorICAgICAgICAgICAgLy8gWW91IGNhbiBhbHNvIGRvIG90aGVyIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uLCBzdWNoIGFzIGNoYW5naW5nIHBhZ2UgdGl0bGUKKyAgICAgICAgICAgICRzY29wZS5vblNsaWRlQ2hhbmdlRW5kID0gKCk6dm9pZCA9PiB7CisKKworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlzQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXaGVuIHVzZXIgc2Nyb2xscyB3aXRoIHRoZSBtb3VzZSwgd2UgaGF2ZSB0byBjaGFuZ2Ugc2xpZGVzCisgICAgICAgICAgICAkc2NvcGUub25Nb3VzZVdoZWVsID0gKGV2ZW50KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZSBldmVudCB3aGVlbCBkZWx0YQorICAgICAgICAgICAgICAgIGxldCBkZWx0YSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQud2hlZWxEZWx0YSAvIDMwIHx8IC1ldmVudC5vcmlnaW5hbEV2ZW50LmRldGFpbDsKKworICAgICAgICAgICAgICAgIC8vSWYgdGhlIHVzZXIgc2Nyb2xsZWQgdXAsIGl0IGdvZXMgdG8gcHJldmlvdXMgc2xpZGUsIG90aGVyd2lzZSAtIHRvIG5leHQgc2xpZGUKKyAgICAgICAgICAgICAgICBpZihkZWx0YSA8IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlBY3Rpb24oJHNjb3BlLmdvVG9OZXh0U2xpZGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihkZWx0YSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxheUFjdGlvbigkc2NvcGUuZ29Ub1ByZXZTbGlkZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBwcmVzc2VkIGtleS4gT25seSBpZiBpdCdzIHVwIG9yIGRvd24gYXJyb3csIHdlIGdvIHRvIHByZXYgb3IgbmV4dCBzbGlkZSBhbmQgcHJldmVudCBkZWZhdWx0IGJlaGF2aW91cgorICAgICAgICAgICAgLy8gVGhpcyB3YXksIGlmIHRoZXJlJ3MgdGV4dCBpbnB1dCwgdGhlIHVzZXIgaXMgc3RpbGwgYWJsZSB0byBmaWxsIGl0CisgICAgICAgICAgICAkc2NvcGUub25LZXlEb3duID0gKGV2ZW50KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgUFJFU1NFRF9LRVkgPSBldmVudC5rZXlDb2RlOworCisgICAgICAgICAgICAgICAgaWYoUFJFU1NFRF9LRVkgPT0ga2V5Q29kZXMuVVApeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ29Ub1ByZXZTbGlkZSgpOworICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihQUkVTU0VEX0tFWSA9PSBrZXlDb2Rlcy5ET1dOKXsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdvVG9OZXh0U2xpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXaGVuIHVzZXIgcmVzaXplIGl0J3MgYnJvd3NlciB3ZSBuZWVkIHRvIGtub3cgdGhlIG5ldyBoZWlnaHQsIHNvIHdlIGNhbiBwcm9wZXJseSBhbGlnbiB0aGUgY3VycmVudCBzbGlkZQorICAgICAgICAgICAgJHNjb3BlLm9uUmVzaXplID0gKGV2ZW50KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAvL1RoaXMgd2lsbCBnaXZlIHVzIHRoZSBuZXcgaGVpZ2h0IG9mIHRoZSB3aW5kb3cKKyAgICAgICAgICAgICAgICBsZXQgbmV3UGFnZUhlaWdodCA9ICQod2luZG93KS5pbm5lckhlaWdodCgpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBoZWlnaHQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBoZWlnaHQgKCB0aGUgYnJvd3NlciBpcyByZXNpemVkIHZlcnRpY2FsbHkgKSwgdGhlIHNsaWRlcyBhcmUgcmVzaXplZAorICAgICAgICAgICAgICAgIGlmKHBhZ2VIZWlnaHQgIT09IG5ld1BhZ2VIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZUhlaWdodCA9IG5ld1BhZ2VIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRTbGlkZXMgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIC8vcGFnZUhlaWdodAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZGVsYXlBY3Rpb24gPSAoYWN0aW9uOkZ1bmN0aW9uKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5RXhlYyk7CisgICAgICAgICAgICB0aGlzLmRlbGF5RXhlYyA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIGFjdGlvbigpOworICAgICAgICAgICAgfSwgMTAwKTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2RjUGFnZVNjcm9sbERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSk7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBTZGNQYWdlU2Nyb2xsRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnXTsKKworfQorCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcGVyZmVjdC1zY3JvbGxiYXIvYW5ndWxhci1wZXJmZWN0LXNjcm9sbGJhci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wZXJmZWN0LXNjcm9sbGJhci9hbmd1bGFyLXBlcmZlY3Qtc2Nyb2xsYmFyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1M2EwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcGVyZmVjdC1zY3JvbGxiYXIvYW5ndWxhci1wZXJmZWN0LXNjcm9sbGJhci50cwpAQCAtMCwwICsxLDE1OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElQZXJmZWN0U2Nyb2xsZXJTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIC8vdXBkYXRlKGV2ZW50OnN0cmluZyk6IHZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFBlcmZlY3RTY3JvbGxlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgcHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTogbmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSAkcGFyc2U6YW55LAorICAgICAgICAgICAgcHJpdmF0ZSAkd2luZG93OmFueSkgeworCisgICAgICAgIH0KKworICAgICAgICByZXBsYWNlID0gdHJ1ZTsKKyAgICAgICAgcmVzdHJpY3QgPSAnRUEnOworICAgICAgICB0cmFuc2NsdWRlID0gdHJ1ZTsKKworICAgICAgICB0ZW1wbGF0ZSA9ICgpOiBzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuICc8ZGl2PjxkaXYgbmctdHJhbnNjbHVkZT48L2Rpdj48L2Rpdj4nOworICAgICAgICB9OworCisgICAgICAgIGxpbmsgPSAoJHNjb3BlOklQZXJmZWN0U2Nyb2xsZXJTY29wZSwgJGVsZW0sICRhdHRyKSA9PiB7CisgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHt9OworCisgICAgICAgICAgICBsZXQgcHNPcHRpb25zID0gWworICAgICAgICAgICAgICAgICd3aGVlbFNwZWVkJywgJ3doZWVsUHJvcGFnYXRpb24nLCAnbWluU2Nyb2xsYmFyTGVuZ3RoJywgJ3VzZUJvdGhXaGVlbEF4ZXMnLAorICAgICAgICAgICAgICAgICd1c2VLZXlib2FyZCcsICdzdXBwcmVzc1Njcm9sbFgnLCAnc3VwcHJlc3NTY3JvbGxZJywgJ3Njcm9sbFhNYXJnaW5PZmZzZXQnLAorICAgICAgICAgICAgICAgICdzY3JvbGxZTWFyZ2luT2Zmc2V0JywgJ2luY2x1ZGVQYWRkaW5nJy8vLCAnb25TY3JvbGwnLCAnc2Nyb2xsRG93bicKKyAgICAgICAgICAgIF07CisKKyAgICAgICAgICAgIGZvciAobGV0IGk9MCwgbD1wc09wdGlvbnMubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICAgICAgICAgIGxldCBvcHQgPSBwc09wdGlvbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKCRhdHRyW29wdF0gIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICBvcHRpb25zW29wdF0gPSBzZWxmLiRwYXJzZSgkYXR0cltvcHRdKSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgJGVsZW0ucGVyZmVjdFNjcm9sbGJhcihvcHRpb25zKTsKKyAgICAgICAgICAgICAgICBsZXQgb25TY3JvbGxIYW5kbGVyID0gc2VsZi4kcGFyc2UoJGF0dHIub25TY3JvbGwpCisgICAgICAgICAgICAgICAgJGVsZW0uc2Nyb2xsKGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgICAgIGxldCBzY3JvbGxUb3AgPSAkZWxlbS5zY3JvbGxUb3AoKQorICAgICAgICAgICAgICAgICAgICBsZXQgc2Nyb2xsSGVpZ2h0ID0gJGVsZW0ucHJvcCgnc2Nyb2xsSGVpZ2h0JykgLSAkZWxlbS5oZWlnaHQoKQorICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxIYW5kbGVyKCRzY29wZSwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodDogc2Nyb2xsSGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAkc2NvcGUudXBkYXRlID0gKGV2ZW50OnN0cmluZyk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICRzY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAvL2lmICgkYXR0ci5zY3JvbGxEb3duID09ICd0cnVlJyAmJiBldmVudCAhPSAnbW91c2VlbnRlcicpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ICE9ICdtb3VzZWVudGVyJykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgkZWxlbSkuc2Nyb2xsVG9wKCQoJGVsZW0pLnByb3AoInNjcm9sbEhlaWdodCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJGVsZW0ucGVyZmVjdFNjcm9sbGJhcigndXBkYXRlJyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiB5b3UgZG9uJ3Qgd2F0Y2ggYW55dGhpbmcgd2l0aCB0aGUgc2Nyb2xsYmFyCisgICAgICAgICAgICAkZWxlbS5iaW5kKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJtb3VzZWVudGVyIik7CisgICAgICAgICAgICAgICAgJGVsZW0ucGVyZmVjdFNjcm9sbGJhcigndXBkYXRlJyk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJGVsZW0uYmluZCgnbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygibW91c2VsZWF2ZSIpOworICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAkKHdpbmRvdykudHJpZ2dlcignbW91c2V1cCcpOworICAgICAgICAgICAgICAgICAgICAkZWxlbS5wZXJmZWN0U2Nyb2xsYmFyKCd1cGRhdGUnKTsKKyAgICAgICAgICAgICAgICB9LCAxMCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJGVsZW0uYmluZCgnY2xpY2snLCBmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIik7CisgICAgICAgICAgICAgICAgLy8gV2FpdCA1MDAgbWlsbGlzZWNvbmRzIHVudGlsIHRoZSBjb2xsYXBzZSBmaW5pc2ggY2xvc2luZyBhbmQgdXBkYXRlLgorICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAkZWxlbS5wZXJmZWN0U2Nyb2xsYmFyKCd1cGRhdGUnKTsKKyAgICAgICAgICAgICAgICB9LCA1MDApOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIHNjcm9sbGVyIHdhcyBjaGFuZ2VkLCBhbmQgaWYgY2hhbmdlZCB1cGRhdGUgdGhlIHNjcm9sbGVyLgorICAgICAgICAgICAgICogQmVjYXVzZSBET01TdWJ0cmVlTW9kaWZpZWQgZXZlbnQgaXMgZmlyZSBtYW55IHRpbWUgKHdoaWxlIGZpbGxpbmcgdGhlIGNvbnRlbnQpLCBJJ20gY2hlY2tpbmcgdGhhdAorICAgICAgICAgICAgICogdGhlcmUgaXMgYXQgbGVhc3QgMTAwIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIERPTVN1YnRyZWVNb2RpZmllZCBldmVudHMgdG8gdXBkYXRlIHRoZSBzY3JvbGxiYXIuCisgICAgICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGV0IGluc2lkZURPTVN1YnRyZWVNb2RpZmllZD1mYWxzZTsKKyAgICAgICAgICAgICRlbGVtLmJpbmQoJ0RPTVN1YnRyZWVNb2RpZmllZCcsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgaWYgKGluc2lkZURPTVN1YnRyZWVNb2RpZmllZD09ZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zaWRlRE9NU3VidHJlZU1vZGlmaWVkPXRydWU7CisgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlRE9NU3VidHJlZU1vZGlmaWVkPWZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0ucGVyZmVjdFNjcm9sbGJhcigndXBkYXRlJyk7CisgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIFBvc3NpYmxlIGZ1dHVyZSBpbXByb3ZlbWVudCAtIGNoZWNrIHRoZSB0eXBlIGhlcmUgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgd2F0Y2ggZm9yIG5vbi1hcnJheXMKKyAgICAgICAgICAgIGlmICgkYXR0ci5yZWZyZXNoT25DaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUuJHdhdGNoQ29sbGVjdGlvbigkYXR0ci5yZWZyZXNoT25DaGFuZ2UsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAkZWxlbS5wZXJmZWN0U2Nyb2xsYmFyKCd1cGRhdGUnKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgZnJvbSBhIHB1bGwgcmVxdWVzdCAtIEkgYW0gbm90IHRvdGFsbHkgc3VyZSB3aGF0IHRoZSBvcmlnaW5hbCBpc3N1ZSBpcyBidXQgc2VlbXMgaGFybWxlc3MKKyAgICAgICAgICAgIGlmICgkYXR0ci5yZWZyZXNoT25SZXNpemUpIHsKKyAgICAgICAgICAgICAgICBzZWxmLiR3aW5kb3cub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uKGUpeyRzY29wZS51cGRhdGUoZSl9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICRlbGVtLmJpbmQoJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgLy9zZWxmLiR3aW5kb3cub2ZmKCdyZXNpemUnLCBmdW5jdGlvbihlKXskc2NvcGUudXBkYXRlKGUpfSk7CisgICAgICAgICAgICAgICAgJGVsZW0ucGVyZmVjdFNjcm9sbGJhcignZGVzdHJveScpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6IG5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJHBhcnNlOmFueSwgJHdpbmRvdzphbnkpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJmZWN0U2Nyb2xsZXJEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUsICRwYXJzZSwgJHdpbmRvdyk7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBQZXJmZWN0U2Nyb2xsZXJEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZScsJyRwYXJzZScsJyR3aW5kb3cnXTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcmludC1ncmFwaC1zY3JlZW4vcHJpbnQtZ3JhcGgtc2NyZWVuLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3ByaW50LWdyYXBoLXNjcmVlbi9wcmludC1ncmFwaC1zY3JlZW4udHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwNDkyOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcmludC1ncmFwaC1zY3JlZW4vcHJpbnQtZ3JhcGgtc2NyZWVuLnRzCkBAIC0wLDAgKzEsMjExIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElQcmludEdyYXBoU2NyZWVuU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBlbnRpdHk6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgIH0KKworCisgICAgZXhwb3J0IGNsYXNzIFByaW50R3JhcGhTY3JlZW5EaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjogbmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICBwcml2YXRlICBzZGNNZW51Ok1vZGVscy5JQXBwTWVudSwKKyAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwKKyAgICAgICAgICAgIHByaXZhdGUgdXJsVG9CYXNlNjRTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5VcmxUb0Jhc2U2NFNlcnZpY2UKKyAgICAgICAgKSB7fQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgZW50aXR5OiAnPScKKyAgICAgICAgfTsKKyAgICAgICAgcmVzdHJpY3QgPSAnQSc7CisgICAgICAgIGxpbmsgPSAoc2NvcGU6SVByaW50R3JhcGhTY3JlZW5TY29wZSwgZWxlbWVudDphbnkpID0+IHsKKworCisgICAgICAgICAgICBlbGVtZW50LmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcHJpbnRTY3JlZW4oKTsKKyAgICAgICAgICAgIH0pOworCisKKyAgICAgICAgLy8gVE9ETyB3ZSBuZWVkIHRvIGltcGxlbWVudCBleHBvcnQgdG8gUERGIGluIGN5dG9zY2FwZSAKKyAgICAgICAgICAgIGxldCAgcHJpbnRTY3JlZW4gPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGxldCBwZGYgOmFueSA9IG5ldyBqc1BERignbGFuZHNjYXBlJywgJ21tJywgJ2E0Jyk7CisgICAgICAgICAgICAgICAgLy8gcGRmLnNldFByb3BlcnRpZXMoeworICAgICAgICAgICAgICAgIC8vICAgICB0aXRsZTogc2NvcGUuZW50aXR5Lm5hbWUsCisgICAgICAgICAgICAgICAgLy8gICAgIHN1YmplY3Q6ICdEZXNpZ24gU25hcHNob3QgZm9yICcgKyBzY29wZS5lbnRpdHkubmFtZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgYXV0aG9yOiBzY29wZS5lbnRpdHkuY3JlYXRvckZ1bGxOYW1lLAorICAgICAgICAgICAgICAgIC8vICAgICBrZXl3b3Jkczogc2NvcGUuZW50aXR5LnRhZ3Muam9pbignLCAnKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgY3JlYXRvcjogc2NvcGUuZW50aXR5LmNyZWF0b3JGdWxsTmFtZQorICAgICAgICAgICAgICAgIC8vIH0pOworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gLy8gQTQgbWVhc3VyZXMgaXMgMjEwIMOXIDI5NyBtaWxsaW1ldGVycworICAgICAgICAgICAgICAgIC8vIGxldCBwZGZXaWR0aCA6bnVtYmVyID0gMjk3LAorICAgICAgICAgICAgICAgIC8vICAgICBwZGZIZWlnaHQgOm51bWJlciA9IDIxMCwKKyAgICAgICAgICAgICAgICAvLyAgICAgbGVmdENvbHVtbldpZHRoIDpudW1iZXIgPSA4MDsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIC8vbGVmdCBiYXIgYmFja2dyb3VuZAorICAgICAgICAgICAgICAgIC8vIHBkZi5zZXREcmF3Q29sb3IoMCk7CisgICAgICAgICAgICAgICAgLy8gcGRmLnNldEZpbGxDb2xvcigyNDgsIDI0OSwgMjUxKTsKKyAgICAgICAgICAgICAgICAvLyBwZGYucmVjdCgwLCAwLCBsZWZ0Q29sdW1uV2lkdGgsIHBkZkhlaWdodCwgJ0YnKTsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIC8vZW50aXR5IG5hbWUKKyAgICAgICAgICAgICAgICAvLyBwZGYuc2V0Rm9udFNpemUoMTIpOworICAgICAgICAgICAgICAgIC8vIHBkZi5zZXRUZXh0Q29sb3IoMzgsIDYxLCA3Nyk7CisgICAgICAgICAgICAgICAgLy8gbGV0IHNwbGl0VGl0bGUgOmFueSA9IHBkZi5zcGxpdFRleHRUb1NpemUoc2NvcGUuZW50aXR5Lm5hbWUsIDUwKTsKKyAgICAgICAgICAgICAgICAvLyBwZGYudGV4dCgyMiwgMTUgLSAoc3BsaXRUaXRsZS5sZW5ndGggLSAxKSAqIDIsIHNwbGl0VGl0bGUpOworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gLy9saW5lCisgICAgICAgICAgICAgICAgLy8gcGRmLnNldExpbmVXaWR0aCgwLjIpOworICAgICAgICAgICAgICAgIC8vIHBkZi5zZXREcmF3Q29sb3IoMjA4LCAyMDksIDIxMyk7CisgICAgICAgICAgICAgICAgLy8gcGRmLmxpbmUoMCwgMjgsIGxlZnRDb2x1bW5XaWR0aCwgMjgpOworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBwZGYuc2V0Rm9udFNpemUoMTApOworICAgICAgICAgICAgICAgIC8vIGxldCBwcm9wZXJ0aWVzIDphbnkgPSBnZXRQZGZQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBsZXQgdG9wT2Zmc2V0IDpudW1iZXIgPSAzOSwgbGluZXM7CisgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcy5mb3JFYWNoKCAoaXRlbTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICAvLyAgICAgaWYgKCFpdGVtLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgLy8gICAgIH0KKyAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGl0ZW0udGl0bGUgPT09ICdEZXNjcmlwdGlvbjonKSB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICB0b3BPZmZzZXQgKz0gNTsKKyAgICAgICAgICAgICAgICAvLyAgICAgfQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgIHBkZi5zZXRUZXh0Q29sb3IoMzgsIDYxLCA3Nyk7CisgICAgICAgICAgICAgICAgLy8gICAgIHBkZi50ZXh0KDUsIHRvcE9mZnNldCwgaXRlbS50aXRsZSk7CisgICAgICAgICAgICAgICAgLy8gICAgIHBkZi5zZXRUZXh0Q29sb3IoMTAyLCAxMDIsIDEwMik7CisgICAgICAgICAgICAgICAgLy8gICAgIGxpbmVzID0gcGRmLnNwbGl0VGV4dFRvU2l6ZShpdGVtLnZhbHVlLCA0OSk7CisgICAgICAgICAgICAgICAgLy8gICAgIHBkZi50ZXh0KDUgKyBpdGVtLm9mZnNldCwgdG9wT2Zmc2V0LCBsaW5lc1swXSk7CisgICAgICAgICAgICAgICAgLy8gICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBsaW5lcyA9IHBkZi5zcGxpdFRleHRUb1NpemUoaXRlbS52YWx1ZS5zdWJzdHJpbmcobGluZXNbMF0ubGVuZ3RoICsgMSksIDY1KTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiA4KSB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbGluZXMgPSBsaW5lcy5zbGljZSgwLCA3KTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArPSAnLi4uJzsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIHBkZi50ZXh0KDUsIHRvcE9mZnNldCArIDQsIGxpbmVzKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRvcE9mZnNldCArPSA0ICogKGxpbmVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gICAgIH0KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICB0b3BPZmZzZXQgKz0gNjsKKyAgICAgICAgICAgICAgICAvLyB9KTsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gLy9hbm90aGVyIGJhY2tncm91bmQgaW4gY2FzZSB0aGUgdGV4dCB3YXMgdG9vIGxvbmcKKyAgICAgICAgICAgICAgICAvLyBsZXQgZGVjbGFyYXRpb25MaW5lT2Zmc2V0IDpudW1iZXIgPSAxNzY7CisgICAgICAgICAgICAgICAgLy8gcGRmLnNldERyYXdDb2xvcigwKTsKKyAgICAgICAgICAgICAgICAvLyBwZGYuc2V0RmlsbENvbG9yKDI0OCwgMjQ5LCAyNTEpOworICAgICAgICAgICAgICAgIC8vIHBkZi5yZWN0KDAsIGRlY2xhcmF0aW9uTGluZU9mZnNldCwgbGVmdENvbHVtbldpZHRoLCBwZGZIZWlnaHQgLSBkZWNsYXJhdGlvbkxpbmVPZmZzZXQsICdGJyk7CisgICAgICAgICAgICAgICAgLy8gLy9saW5lCisgICAgICAgICAgICAgICAgLy8gcGRmLnNldExpbmVXaWR0aCgwLjIpOworICAgICAgICAgICAgICAgIC8vIHBkZi5zZXREcmF3Q29sb3IoMjA4LCAyMDksIDIxMyk7CisgICAgICAgICAgICAgICAgLy8gcGRmLmxpbmUoMCwgZGVjbGFyYXRpb25MaW5lT2Zmc2V0LCBsZWZ0Q29sdW1uV2lkdGgsIGRlY2xhcmF0aW9uTGluZU9mZnNldCk7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAvL2RlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgLy8gcGRmLnNldEZvbnRTaXplKDEwLjUpOworICAgICAgICAgICAgICAgIC8vIHBkZi5zZXRUZXh0Q29sb3IoMzgsIDYxLCA3Nyk7CisgICAgICAgICAgICAgICAgLy8gcGRmLnRleHQoNSwgMTg1LCAnRGVjbGFyYXRpb24nKTsKKyAgICAgICAgICAgICAgICAvLyBwZGYuc2V0Rm9udFNpemUoOSk7CisgICAgICAgICAgICAgICAgLy8gcGRmLnNldFRleHRDb2xvcigxMDIsIDEwMiwgMTAyKTsKKyAgICAgICAgICAgICAgICAvLyBwZGYuc2V0Rm9udFR5cGUoJ2JvbGQnKTsKKyAgICAgICAgICAgICAgICAvLyBwZGYudGV4dCg1LCAxOTAsIHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoJ1BERl9GSUxFX0RFQ0xBUkFUSU9OX0JPTEQnKSk7CisgICAgICAgICAgICAgICAgLy8gcGRmLnNldEZvbnRUeXBlKCdub3JtYWwnKTsKKyAgICAgICAgICAgICAgICAvLyBwZGYudGV4dCg1LCAxOTQsIHBkZi5zcGxpdFRleHRUb1NpemUodGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgnUERGX0ZJTEVfREVDTEFSQVRJT04nKSwgNjUpKTsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIC8vZW50aXR5IGljb24KKyAgICAgICAgICAgICAgICAvLyBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICAgICAgLy8gbGV0IGFkZEVudGl0eUljb246RnVuY3Rpb24gPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgLy8gICAgIGxldCBpY29uUGF0aDpzdHJpbmcgPSBzZWxmLnNkY0NvbmZpZy5pbWFnZXNQYXRoICsgJy9zdHlsZXMvaW1hZ2VzLyc7CisgICAgICAgICAgICAgICAgLy8gICAgIGlmIChzY29wZS5lbnRpdHkuaXNTZXJ2aWNlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIGljb25QYXRoICs9ICdzZXJ2aWNlLWljb25zLycgKyBzY29wZS5lbnRpdHkuaWNvbiArICcucG5nJzsKKyAgICAgICAgICAgICAgICAvLyAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIGljb25QYXRoICs9ICdyZXNvdXJjZS1pY29ucy8nICsgc2NvcGUuZW50aXR5Lmljb24gKyAnLnBuZyc7CisgICAgICAgICAgICAgICAgLy8gICAgIH0KKyAgICAgICAgICAgICAgICAvLyAgICAgc2VsZi51cmxUb0Jhc2U2NFNlcnZpY2UuZG93bmxvYWRVcmwoaWNvblBhdGgsIChiYXNlNjRzdHJpbmc6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmIChiYXNlNjRzdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBwZGYuYWRkSW1hZ2UoYmFzZTY0c3RyaW5nLCAnSlBFRycsIDUsIDcsIDE1LCAxNSk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBwZGYuc2F2ZShzY29wZS5lbnRpdHkubmFtZSArICcucGRmJyk7CisgICAgICAgICAgICAgICAgLy8gICAgIH0pOworICAgICAgICAgICAgICAgIC8vIH07CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAvL2FjdHVhbCBzbmFwc2hvcCBvZiBjYW52YXMKKyAgICAgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgICAgICAvLyBsZXQgZGlhZ3JhbURpdiA6YW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215RGlhZ3JhbScpOworICAgICAgICAgICAgICAgIC8vIGxldCBkaWFncmFtIDphbnkgPSBudWxsOy8vICBTZGMuR3JhcGguRGlhZ3JhbS5mcm9tRGl2KGRpYWdyYW1EaXYpLCBjYW52YXNJbWcgPSBuZXcgSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICAvLyBkaWFncmFtLnN0YXJ0VHJhbnNhY3Rpb24oJ3ByaW50IHNjcmVlbicpOworICAgICAgICAgICAgICAgIC8vIGxldCBjYW52YXNJbWdCYXNlNjQ6YW55ID0gZGlhZ3JhbS5tYWtlSW1hZ2VEYXRhKHsKKyAgICAgICAgICAgICAgICAvLyAgICAgLy9zY2FsZTogMSwKKyAgICAgICAgICAgICAgICAvLyAgICAvLyBzaXplOiBuZXcgU2RjLkdyYXBoLlNpemUocGRmSGVpZ2h0ICogNSwgTmFOKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgYmFja2dyb3VuZDogJ3doaXRlJywKKyAgICAgICAgICAgICAgICAvLyAgICAgdHlwZTogJ2ltYWdlL2pwZWcnCisgICAgICAgICAgICAgICAgLy8gfSk7CisgICAgICAgICAgICAgICAgLy8gZGlhZ3JhbURpdi5maXJzdEVsZW1lbnRDaGlsZC50b0RhdGFVUkwoKTsKKyAgICAgICAgICAgICAgICAvLyBkaWFncmFtLmNvbW1pdFRyYW5zYWN0aW9uKCdwcmludCBzY3JlZW4nKTsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGNhbnZhc0ltZy5vbmxvYWQgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgLy8gICAgIGlmIChjYW52YXNJbWcuaGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgICAgIC8vICAgICAgICAgbGV0IGNhbnZhc0ltZ1JhdGlvOm51bWJlciA9IE1hdGgubWluKChwZGZXaWR0aCAtIGxlZnRDb2x1bW5XaWR0aCAtIDE1KSAvIGNhbnZhc0ltZy53aWR0aCwgcGRmSGVpZ2h0IC8gY2FudmFzSW1nLmhlaWdodCk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICBsZXQgY2FudmFzSW1nV2lkdGg6bnVtYmVyID0gY2FudmFzSW1nLndpZHRoICogY2FudmFzSW1nUmF0aW8sCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY2FudmFzSW1nSGVpZ2h0Om51bWJlciA9IGNhbnZhc0ltZy5oZWlnaHQgKiBjYW52YXNJbWdSYXRpbzsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIGxldCBjYW52YXNJbWdPZmZzZXQ6bnVtYmVyID0gKHBkZkhlaWdodCAtIGNhbnZhc0ltZ0hlaWdodCkgLyAyOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgcGRmLmFkZEltYWdlKGNhbnZhc0ltZywgJ0pQRUcnLCBsZWZ0Q29sdW1uV2lkdGgsIGNhbnZhc0ltZ09mZnNldCwgY2FudmFzSW1nV2lkdGgsIGNhbnZhc0ltZ0hlaWdodCk7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIGFkZEVudGl0eUljb24oKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgfQorICAgICAgICAgICAgICAgIC8vIH07CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBpZihjYW52YXNJbWcuc3JjID09PSAnZGF0YTosJykgeyAvL2VtcHR5IGNhbnZhcworICAgICAgICAgICAgICAgIC8vICAgICBhZGRFbnRpdHlJY29uKCk7CisgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyAgICAgY2FudmFzSW1nLnNyYyA9IGNhbnZhc0ltZ0Jhc2U2NDsKKyAgICAgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgZ2V0UGRmUHJvcGVydGllcyA9ICgpOkFycmF5PGFueT4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgICAgIHt0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgnR0VORVJBTF9MQUJFTF9UWVBFJyksIHZhbHVlOiBzY29wZS5lbnRpdHkuZ2V0Q29tcG9uZW50U3ViVHlwZSgpLCBvZmZzZXQ6IDEwfSwKKyAgICAgICAgICAgICAgICAgICAge3RpdGxlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdHRU5FUkFMX0xBQkVMX1ZFUlNJT04nKSwgdmFsdWU6IHNjb3BlLmVudGl0eS52ZXJzaW9uLCBvZmZzZXQ6IDE1fSwKKyAgICAgICAgICAgICAgICAgICAge3RpdGxlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdHRU5FUkFMX0xBQkVMX0NBVEVHT1JZJyksIHZhbHVlOiBzY29wZS5lbnRpdHkuY2F0ZWdvcmllcy5sZW5ndGggPyBzY29wZS5lbnRpdHkuY2F0ZWdvcmllc1swXS5uYW1lIDogJycsIG9mZnNldDogMTZ9LAorICAgICAgICAgICAgICAgICAgICB7dGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoJ0dFTkVSQUxfTEFCRUxfQ1JFQVRJT05fREFURScpLCB2YWx1ZTogdGhpcy4kZmlsdGVyKCdkYXRlJykoc2NvcGUuZW50aXR5LmNyZWF0aW9uRGF0ZSwgJ01NL2RkL3l5eXknKSwgb2Zmc2V0OiAyNH0sCisgICAgICAgICAgICAgICAgICAgIHt0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgnR0VORVJBTF9MQUJFTF9BVVRIT1InKSwgdmFsdWU6IHNjb3BlLmVudGl0eS5jcmVhdG9yRnVsbE5hbWUsIG9mZnNldDogMTN9LAorICAgICAgICAgICAgICAgICAgICB7dGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoJ0dFTkVSQUxfTEFCRUxfQ09OVEFDVF9JRCcpLCB2YWx1ZTogc2NvcGUuZW50aXR5LmNvbnRhY3RJZCwgb2Zmc2V0OiA0MX0sCisgICAgICAgICAgICAgICAgICAgIHt0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgnR0VORVJBTF9MQUJFTF9TVEFUVVMnKSwgdmFsdWU6ICg8YW55PnRoaXMuc2RjTWVudSkuTGlmZUN5Y2xlU3RhdHVzZXNbc2NvcGUuZW50aXR5LmxpZmVjeWNsZVN0YXRlXS50ZXh0LCBvZmZzZXQ6IDEzfSwKKyAgICAgICAgICAgICAgICAgICAge3RpdGxlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdHRU5FUkFMX0xBQkVMX1BST0pFQ1RfQ09ERScpLCB2YWx1ZTogc2NvcGUuZW50aXR5LnByb2plY3RDb2RlLCBvZmZzZXQ6IDE1fSwKKyAgICAgICAgICAgICAgICAgICAge3RpdGxlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdHRU5FUkFMX0xBQkVMX0RFU0NSSVBUSU9OJyksIHZhbHVlOiBzY29wZS5lbnRpdHkuZGVzY3JpcHRpb24sIG9mZnNldDogMjB9LAorICAgICAgICAgICAgICAgICAgICB7dGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoJ0dFTkVSQUxfTEFCRUxfVEFHUycpLCB2YWx1ZTogc2NvcGUuZW50aXR5LnRhZ3Muam9pbignLCAnKSwgb2Zmc2V0OiAxMH0KKyAgICAgICAgICAgICAgICBdOworICAgICAgICAgICAgfTsKKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLCBzZGNNZW51Ok1vZGVscy5JQXBwTWVudSwgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwgdXJsVG9CYXNlNjRTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5VcmxUb0Jhc2U2NFNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmludEdyYXBoU2NyZWVuRGlyZWN0aXZlKCRmaWx0ZXIsIHNkY01lbnUsIHNkY0NvbmZpZywgdXJsVG9CYXNlNjRTZXJ2aWNlKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIFByaW50R3JhcGhTY3JlZW5EaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckZmlsdGVyJywgJ3NkY01lbnUnLCAnc2RjQ29uZmlnJywgJ1NkYy5TZXJ2aWNlcy5VcmxUb0Jhc2U2NFNlcnZpY2UnXTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy9kYXRhLXR5cGUtZmllbGRzLXN0cnVjdHVyZS9kYXRhLXR5cGUtZmllbGRzLXN0cnVjdHVyZS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1ODNmZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy9kYXRhLXR5cGUtZmllbGRzLXN0cnVjdHVyZS9kYXRhLXR5cGUtZmllbGRzLXN0cnVjdHVyZS5odG1sCkBAIC0wLDAgKzEsODIgQEAKKzxkaXYgY2xhc3M9ImRhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlIj4KKyAgICA8ZGl2IGNsYXNzPSJvcGVuLWNsb3NlIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ib3Blbi1jbG9zZS1idXR0b24iIGRhdGEtbmctY2xhc3M9InsnZXhwYW5kJzpleHBhbmQsJ2NvbGxhcHNlJzohZXhwYW5kfSIgZGF0YS1uZy1jbGljaz0iZXhwYW5kQW5kQ29sbGFwc2UoKSI+PC9kaXY+CisgICAgICAgIDxzcGFuIGNsYXNzPSJkYXRhLXR5cGUtbmFtZSI+e3t0eXBlTmFtZS5yZXBsYWNlKCJvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LiIsIiIpfX08L3NwYW4+CisgICAgPC9kaXY+CisgICAgPGRpdiBkYXRhLW5nLXNob3c9ImV4cGFuZCIgZGF0YS1uZy1yZXBlYXQ9InByb3BlcnR5IGluIGRhdGFUeXBlUHJvcGVydGllcyIgY2xhc3M9InByb3BlcnR5Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIHByb3BlcnR5LW5hbWUiPgorICAgICAgICAgICAgPGRpdiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7cHJvcGVydHkubmFtZX19Ij4KKyAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ7e3Byb3BlcnR5Lm5hbWV9fSIvPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8IS0tPGRpdiBjbGFzcz0icHJvcGVydHktdmFsdWUiPi0tPgorICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJkYXRhVHlwZXNTZXJ2aWNlLmlzRGF0YVR5cGVGb3JEYXRhVHlwZVByb3BlcnR5VHlwZShwcm9wZXJ0eSx0eXBlcykiIGNsYXNzPSJpbm5lci1zdHJ1Y3R1cmUiPgorICAgICAgICAgICAgICAgIDxmaWVsZHMtc3RydWN0dXJlIHZhbHVlLW9iai1yZWY9Iih2YWx1ZU9ialJlZltwcm9wZXJ0eS5uYW1lXSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS1uYW1lPSJwcm9wZXJ0eS50eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC1mb3JtLW9iaj0icGFyZW50Rm9ybU9iaiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMtcHJlZml4LW5hbWU9ImZpZWxkc1ByZWZpeE5hbWUrcHJvcGVydHkubmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkLW9ubHk9InJlYWRPbmx5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQtdmFsdWU9Int7Y3VycmVudFR5cGVEZWZhdWx0VmFsdWVbcHJvcGVydHkubmFtZV19fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcz0idHlwZXMiPjwvZmllbGRzLXN0cnVjdHVyZT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSIhZGF0YVR5cGVzU2VydmljZS5pc0RhdGFUeXBlRm9yRGF0YVR5cGVQcm9wZXJ0eVR5cGUocHJvcGVydHksdHlwZXMpIiBuZy1zd2l0Y2g9InByb3BlcnR5LnR5cGUiPgorICAgICAgICAgICAgICAgIDxkaXYgbmctc3dpdGNoLXdoZW49Im1hcCI+CisgICAgICAgICAgICAgICAgICAgIDx0eXBlLW1hcCB2YWx1ZS1vYmotcmVmPSJ2YWx1ZU9ialJlZltwcm9wZXJ0eS5uYW1lXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEtcHJvcGVydHk9InByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtZm9ybS1vYmo9InBhcmVudEZvcm1PYmoiCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLXByZWZpeC1uYW1lPSJmaWVsZHNQcmVmaXhOYW1lK3Byb3BlcnR5Lm5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5PSJyZWFkT25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LXZhbHVlPSJ7e2N1cnJlbnRUeXBlRGVmYXVsdFZhbHVlW3Byb3BlcnR5Lm5hbWVdfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM9InR5cGVzIj48L3R5cGUtbWFwPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgbmctc3dpdGNoLXdoZW49Imxpc3QiPgorICAgICAgICAgICAgICAgICAgICA8dHlwZS1saXN0IHZhbHVlLW9iai1yZWY9InZhbHVlT2JqUmVmW3Byb3BlcnR5Lm5hbWVdIgorICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEtcHJvcGVydHk9InByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LWZvcm0tb2JqPSJwYXJlbnRGb3JtT2JqIgorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMtcHJlZml4LW5hbWU9ImZpZWxkc1ByZWZpeE5hbWUrcHJvcGVydHkubmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5PSJyZWFkT25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdC12YWx1ZT0ie3tjdXJyZW50VHlwZURlZmF1bHRWYWx1ZVtwcm9wZXJ0eS5uYW1lXX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcz0idHlwZXMiPjwvdHlwZS1saXN0PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgbmctc3dpdGNoLWRlZmF1bHQgY2xhc3M9InByaW1pdGl2ZS12YWx1ZS1maWVsZCI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihwYXJlbnRGb3JtT2JqW2ZpZWxkc1ByZWZpeE5hbWUrcHJvcGVydHkubmFtZV0uJGRpcnR5ICYmIHBhcmVudEZvcm1PYmpbZmllbGRzUHJlZml4TmFtZStwcm9wZXJ0eS5uYW1lXS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ7e2ZpZWxkc1ByZWZpeE5hbWUrcHJvcGVydHkubmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWlmPSIhKChwcm9wZXJ0eS5zaW1wbGVUeXBlfHxwcm9wZXJ0eS50eXBlKSA9PSAnYm9vbGVhbicpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0icmVhZE9ubHkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0idmFsdWVPYmpSZWZbcHJvcGVydHkubmFtZV0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ7e2ZpZWxkc1ByZWZpeE5hbWUrcHJvcGVydHkubmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0iZ2V0VmFsaWRhdGlvblBhdHRlcm4oKHByb3BlcnR5LnNpbXBsZVR5cGV8fHByb3BlcnR5LnR5cGUpKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSIhcGFyZW50Rm9ybU9ialtmaWVsZHNQcmVmaXhOYW1lK3Byb3BlcnR5Lm5hbWVdLiRlcnJvci5wYXR0ZXJuICYmICgnaW50ZWdlcic9PXByb3BlcnR5LnR5cGUgJiYgcGFyZW50Rm9ybU9ialtmaWVsZHNQcmVmaXhOYW1lK3Byb3BlcnR5Lm5hbWVdLiRzZXRWYWxpZGl0eSgncGF0dGVybicsIHZhbGlkYXRlSW50UmFuZ2UodmFsdWVPYmpSZWZbcHJvcGVydHkubmFtZV0pKSB8fCBvblZhbHVlQ2hhbmdlKHByb3BlcnR5Lm5hbWUsIChwcm9wZXJ0eS5zaW1wbGVUeXBlfHxwcm9wZXJ0eS50eXBlKSkpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cyAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iaS1zZGMtZm9ybS1zZWxlY3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7ZmllbGRzUHJlZml4TmFtZStwcm9wZXJ0eS5uYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWlmPSIocHJvcGVydHkuc2ltcGxlVHlwZXx8cHJvcGVydHkudHlwZSkgPT0gJ2Jvb2xlYW4nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJyZWFkT25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ie3tmaWVsZHNQcmVmaXhOYW1lK3Byb3BlcnR5Lm5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9Im9uVmFsdWVDaGFuZ2UocHJvcGVydHkubmFtZSwnYm9vbGVhbicpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJ2YWx1ZU9ialJlZltwcm9wZXJ0eS5uYW1lXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1vcHRpb25zPSJvcHRpb24udiBhcyBvcHRpb24ubiBmb3Igb3B0aW9uIGluIFt7IG46ICcnLCB2OiB1bmRlZmluZWQgfSwgeyBuOiAnZmFsc2UnLCB2OiBmYWxzZSB9LCB7IG46ICd0cnVlJywgdjogdHJ1ZSB9XSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0icGFyZW50Rm9ybU9ialtmaWVsZHNQcmVmaXhOYW1lK3Byb3BlcnR5Lm5hbWVdLiRkaXJ0eSAmJiBwYXJlbnRGb3JtT2JqW2ZpZWxkc1ByZWZpeE5hbWUrcHJvcGVydHkubmFtZV0uJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InBhcmVudEZvcm1PYmpbZmllbGRzUHJlZml4TmFtZStwcm9wZXJ0eS5uYW1lXS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMTAwJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyZW50Rm9ybU9ialtmaWVsZHNQcmVmaXhOYW1lK3Byb3BlcnR5Lm5hbWVdLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlBST1BFUlRZX0VESVRfUEFUVEVSTiI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InBhcmVudEZvcm1PYmpbZmllbGRzUHJlZml4TmFtZStwcm9wZXJ0eS5uYW1lXS4kZXJyb3IuY3VzdG9tVmFsaWRhdGlvbiIgdHJhbnNsYXRlPSJQUk9QRVJUWV9FRElUX01BUF9VTklRVUVfS0VZUyI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwhLS08L2Rpdj4tLT4KKworICAgIDwvZGl2PgorPC9kaXY+CisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvZGF0YS10eXBlLWZpZWxkcy1zdHJ1Y3R1cmUvZGF0YS10eXBlLWZpZWxkcy1zdHJ1Y3R1cmUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzY1ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlLmxlc3MKQEAgLTAsMCArMSw5MCBAQAorLmRhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJleworICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdjsKKyAgICBwYWRkaW5nOjEwcHg7CisgICAgZGlzcGxheTogdGFibGUtY2FwdGlvbjsKKyAgICAub3Blbi1jbG9zZXsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICAub3Blbi1jbG9zZS1idXR0b257CisgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICB0b3A6IDUwJTsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IC03cHg7CisgICAgICAgICAgICAmLmV4cGFuZHsKKyAgICAgICAgICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgICAgICAgICAuZXhwYW5kLWNvbGxhcHNlLW1pbnVzLWljb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICAmLmNvbGxhcHNleworICAgICAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtcGx1cy1pY29uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC5kYXRhLXR5cGUtbmFtZXsKKyAgICAgICAgLm1fMTZfbTsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDIycHg7CisgICAgfQorCisgICAgLmktc2RjLWZvcm0taW5wdXQ6ZGlzYWJsZWR7CisgICAgICAgICAgICAgLmRpc2FibGVkOworICAgICAgICAgfQorCisgICAgLnByb3BlcnR5eworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBtaW4td2lkdGg6IDM2NXB4OworICAgICAgICBtaW4taGVpZ2h0OiA0NnB4OworICAgICAgICBpbnB1dFt0eXBlPSJ0ZXh0Il0sc2VsZWN0eworICAgICAgICAgICAgd2lkdGg6IDE3MHB4OworICAgICAgICB9CisgICAgICAgIC5wcm9wZXJ0eS1uYW1leworICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CisgICAgICAgIH0KKyAgICAgICAgLnByaW1pdGl2ZS12YWx1ZS1maWVsZHsKKyAgICAgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDhweDsKKyAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OworICAgICAgICB9CisgICAgICAgIC5pbm5lci1zdHJ1Y3R1cmV7CisgICAgICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFtuZy1zd2l0Y2gtd2hlbj0ibWFwIl17CisgICAgICAgIG1hcmdpbi10b3A6IDhweDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgICAgICAgIC5tYXAtaXRlbXsKKyAgICAgICAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluX2NvbG9yX287CisgICAgICAgICAgICBtaW4td2lkdGg6IDQwMXB4OworICAgICAgICAgICAgbWluLWhlaWdodDogNjlweDsKKyAgICAgICAgICAgIGZsb2F0OiBub25lICFpbXBvcnRhbnQ7CisgICAgICAgIH0KKyAgICAgICAgLmFkZC1tYXAtaXRlbXsKKyAgICAgICAgICAgIHdpZHRoOiBhdXRvOworICAgICAgICAgICAgZmxvYXQ6IG5vbmU7CisgICAgICAgICAgICAmOm50aC1jaGlsZCgxKXsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgICAgICAgICAgdG9wOiA2cHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuYWRkLWJ0bnsKKyAgICAgICAgICAgICAgICBmbG9hdDogbm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgW25nLXN3aXRjaC13aGVuPSJsaXN0Il17CisgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OworICAgICAgICBtaW4td2lkdGg6IDI4MHB4OworICAgICAgICAuZHQtbGlzdC1pdGVtIHsKKyAgICAgICAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluX2NvbG9yX287CisgICAgICAgIH0KKyAgICAgICAgLmxpc3QtdmFsdWUtaXRlbXN7CisgICAgICAgICAgICB3aWR0aDoyODBweDsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTY3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvZGF0YS10eXBlLWZpZWxkcy1zdHJ1Y3R1cmUvZGF0YS10eXBlLWZpZWxkcy1zdHJ1Y3R1cmUudHMKQEAgLTAsMCArMSwxNjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDEvMjcvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElEYXRhVHlwZUZpZWxkc1N0cnVjdHVyZVNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgcGFyZW50Rm9ybU9iajpuZy5JRm9ybUNvbnRyb2xsZXI7CisgICAgICAgIGRhdGFUeXBlUHJvcGVydGllczpBcnJheTxNb2RlbHMuRGF0YVR5cGVQcm9wZXJ0eU1vZGVsPjsKKyAgICAgICAgdHlwZU5hbWU6c3RyaW5nOworICAgICAgICB2YWx1ZU9ialJlZjphbnk7CisgICAgICAgIHByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGZpZWxkc1ByZWZpeE5hbWU6c3RyaW5nOworICAgICAgICByZWFkT25seTpib29sZWFuOworICAgICAgICBjdXJyZW50VHlwZURlZmF1bHRWYWx1ZTphbnk7CisgICAgICAgIHR5cGVzOk1vZGVscy5EYXRhVHlwZXNNYXA7CisgICAgICAgIGV4cGFuZEJ5RGVmYXVsdDpib29sZWFuOworICAgICAgICBleHBhbmQ6Ym9vbGVhbjsKKyAgICAgICAgZXhwYW5kZWQ6Ym9vbGVhbjsKKyAgICAgICAgZGF0YVR5cGVzU2VydmljZTpTZGMuU2VydmljZXMuRGF0YVR5cGVzU2VydmljZTsKKworICAgICAgICBleHBhbmRBbmRDb2xsYXBzZSgpOnZvaWQ7CisgICAgICAgIGdldFZhbGlkYXRpb25QYXR0ZXJuKHR5cGU6c3RyaW5nKTpSZWdFeHA7CisgICAgICAgIHZhbGlkYXRlSW50UmFuZ2UodmFsdWU6c3RyaW5nKTpib29sZWFuOworICAgICAgICBvblZhbHVlQ2hhbmdlKHByb3BlcnR5TmFtZTpzdHJpbmcsIHR5cGU6c3RyaW5nKTp2b2lkCisgICAgfQorCisKKyAgICBleHBvcnQgY2xhc3MgRGF0YVR5cGVGaWVsZHNTdHJ1Y3R1cmVEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBEYXRhVHlwZXNTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5EYXRhVHlwZXNTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblV0aWxzOlNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMpIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgdmFsdWVPYmpSZWY6ICc9JywKKyAgICAgICAgICAgIHR5cGVOYW1lOiAnPScsCisgICAgICAgICAgICBwYXJlbnRGb3JtT2JqOiAnPScsCisgICAgICAgICAgICBmaWVsZHNQcmVmaXhOYW1lOiAnPScsCisgICAgICAgICAgICByZWFkT25seTogJz0nLAorICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnQCcsCisgICAgICAgICAgICB0eXBlczogJz0nLAorICAgICAgICAgICAgZXhwYW5kQnlEZWZhdWx0OiAnPScKKyAgICAgICAgfTsKKworICAgICAgICByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvZGF0YS10eXBlLWZpZWxkcy1zdHJ1Y3R1cmUvZGF0YS10eXBlLWZpZWxkcy1zdHJ1Y3R1cmUuaHRtbCcpOworICAgICAgICB9OworICAgICAgICBwdWJsaWMgdHlwZXM9VXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX0RBVEEuVFlQRVM7CisKKyAgICAgICAgLy9nZXQgZGF0YSB0eXBlIHByb3BlcnRpZXMgYXJyYXkgYW5kIHJldHVybiBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcyBhbmQgdGhlaXIgZGVmYXVsdCB2YWx1ZQorICAgICAgICAvLyhmb3IgZXhhbXBsZTogZ2V0OiBbe25hbWU6InByb3AxIixkZWZhdWx0VmFsdWU6MSAuLi59LHtuYW1lOiJwcm9wMiIsIGRlZmF1bHRWYWx1ZToiYmxhIGJsYSIgLi4ufV0KKyAgICAgICAgLy8gICAgICAgICAgICAgIHJldHVybjoge3Byb3AxOiAxLCBwcm9wMjogImJsYSBibGEifQorICAgICAgICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZSA9IChkYXRhVHlwZVByb3BlcnRpZXM6QXJyYXk8TW9kZWxzLkRhdGFUeXBlUHJvcGVydHlNb2RlbD4pOmFueSA9PiB7CisgICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0ge307CisgICAgICAgICAgICBmb3IobGV0IGk9MDsgaSA8IGRhdGFUeXBlUHJvcGVydGllcy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgaWYoZGF0YVR5cGVQcm9wZXJ0aWVzW2ldLnR5cGUhPSdzdHJpbmcnKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoZGF0YVR5cGVQcm9wZXJ0aWVzW2ldLmRlZmF1bHRWYWx1ZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVbZGF0YVR5cGVQcm9wZXJ0aWVzW2ldLm5hbWVdID0gSlNPTi5wYXJzZShkYXRhVHlwZVByb3BlcnRpZXNbaV0uZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVbZGF0YVR5cGVQcm9wZXJ0aWVzW2ldLm5hbWVdID0gZGF0YVR5cGVQcm9wZXJ0aWVzW2ldLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdERhdGFPblNjb3BlID0gKHNjb3BlOmFueSwgJGF0dHI6YW55KTp2b2lkID0+eworICAgICAgICAgICAgc2NvcGUuZGF0YVR5cGVzU2VydmljZSA9IHRoaXMuRGF0YVR5cGVzU2VydmljZTsKKyAgICAgICAgICAgIHNjb3BlLmRhdGFUeXBlUHJvcGVydGllcyA9IHRoaXMuRGF0YVR5cGVzU2VydmljZS5nZXRGaXJzTGV2ZWxPZkRhdGFUeXBlUHJvcGVydGllcyhzY29wZS50eXBlTmFtZSxzY29wZS50eXBlcyk7CisgICAgICAgICAgICBpZigkYXR0ci5kZWZhdWx0VmFsdWUpeworICAgICAgICAgICAgICAgIHNjb3BlLmN1cnJlbnRUeXBlRGVmYXVsdFZhbHVlID0gSlNPTi5wYXJzZSgkYXR0ci5kZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgc2NvcGUuY3VycmVudFR5cGVEZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZShzY29wZS5kYXRhVHlwZVByb3BlcnRpZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighc2NvcGUudmFsdWVPYmpSZWYpIHsKKyAgICAgICAgICAgICAgICBzY29wZS52YWx1ZU9ialJlZiA9IHt9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfLmZvckVhY2goc2NvcGUuY3VycmVudFR5cGVEZWZhdWx0VmFsdWUsICh2YWx1ZSwga2V5KT0+IHsKKyAgICAgICAgICAgICAgICBpZighc2NvcGUudmFsdWVPYmpSZWZba2V5XSl7CisgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBzY29wZS5jdXJyZW50VHlwZURlZmF1bHRWYWx1ZVtrZXldID09ICdvYmplY3QnKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuY29weShzY29wZS5jdXJyZW50VHlwZURlZmF1bHRWYWx1ZVtrZXldLCBzY29wZS52YWx1ZU9ialJlZltrZXldKTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS52YWx1ZU9ialJlZltrZXldID0gc2NvcGUuY3VycmVudFR5cGVEZWZhdWx0VmFsdWVba2V5XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgcmVyZW5kZXIgPSAoc2NvcGU6YW55KTp2b2lkID0+eworICAgICAgICAgICAgc2NvcGUuZXhwYW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHNjb3BlLmV4cGFuZCA9IGZhbHNlOworICAgICAgICAgICAgaWYoc2NvcGUuZXhwYW5kQnlEZWZhdWx0KXsKKyAgICAgICAgICAgICAgICBzY29wZS5leHBhbmRBbmRDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SURhdGFUeXBlRmllbGRzU3RydWN0dXJlU2NvcGUsIGVsZW1lbnQ6YW55LCAkYXR0cjphbnkpID0+IHsKKyAgICAgICAgICAgIHNjb3BlLnByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Qcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybjsKKworICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignW3R5cGVOYW1lLGZpZWxkc1ByZWZpeE5hbWVdJywgKG5ld0RhdGE6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlcmVuZGVyKHNjb3BlKTsKKyAgICAgICAgICAgIH0pOworCisKKyAgICAgICAgICAgIHNjb3BlLmV4cGFuZEFuZENvbGxhcHNlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYoIXNjb3BlLmV4cGFuZGVkKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RGF0YU9uU2NvcGUoc2NvcGUsJGF0dHIpOworICAgICAgICAgICAgICAgICAgICBzY29wZS5leHBhbmRlZD10cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZS5leHBhbmQ9IXNjb3BlLmV4cGFuZDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmdldFZhbGlkYXRpb25QYXR0ZXJuID0gKHR5cGU6c3RyaW5nKTpSZWdFeHAgPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZhbGlkYXRpb25VdGlscy5nZXRWYWxpZGF0aW9uUGF0dGVybih0eXBlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLnZhbGlkYXRlSW50UmFuZ2UgPSAodmFsdWU6c3RyaW5nKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIXZhbHVlIHx8IHRoaXMuVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSW50UmFuZ2UodmFsdWUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUub25WYWx1ZUNoYW5nZSA9IChwcm9wZXJ0eU5hbWU6c3RyaW5nLCB0eXBlOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUudmFsdWVPYmpSZWZbcHJvcGVydHlOYW1lXSA9ICFhbmd1bGFyLmlzVW5kZWZpbmVkKHNjb3BlLnZhbHVlT2JqUmVmW3Byb3BlcnR5TmFtZV0pID8gc2NvcGUudmFsdWVPYmpSZWZbcHJvcGVydHlOYW1lXSA6IHNjb3BlLmN1cnJlbnRUeXBlRGVmYXVsdFZhbHVlW3Byb3BlcnR5TmFtZV07CisgICAgICAgICAgICAgICAgaWYoc2NvcGUudmFsdWVPYmpSZWZbcHJvcGVydHlOYW1lXSAmJiB0eXBlICE9ICdzdHJpbmcnKXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUudmFsdWVPYmpSZWZbcHJvcGVydHlOYW1lXSA9IEpTT04ucGFyc2Uoc2NvcGUudmFsdWVPYmpSZWZbcHJvcGVydHlOYW1lXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGVzU2VydmljZTpTZGMuU2VydmljZXMuRGF0YVR5cGVzU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25VdGlsczpTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVR5cGVGaWVsZHNTdHJ1Y3R1cmVEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUsRGF0YVR5cGVzU2VydmljZSxQcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybixWYWxpZGF0aW9uVXRpbHMpOworICAgICAgICB9OworICAgIH0KKworICAgIERhdGFUeXBlRmllbGRzU3RydWN0dXJlRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCdTZGMuU2VydmljZXMuRGF0YVR5cGVzU2VydmljZScsJ1Byb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuJywnVmFsaWRhdGlvblV0aWxzJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1saXN0L3R5cGUtbGlzdC1kaXJlY3RpdmUuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy90eXBlLWxpc3QvdHlwZS1saXN0LWRpcmVjdGl2ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGEyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1saXN0L3R5cGUtbGlzdC1kaXJlY3RpdmUuaHRtbApAQCAtMCwwICsxLDU3IEBACis8ZGl2PgorICAgIDxkaXYgZGF0YS1uZy1pZj0iIWlzU2NoZW1hVHlwZURhdGFUeXBlIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIGxpc3QtbmV3LWl0ZW0iIGRhdGEtbmctY2xhc3M9IntlcnJvcjoocGFyZW50Rm9ybU9ialsnbGlzdE5ld0l0ZW0nK2ZpZWxkc1ByZWZpeE5hbWVdLiRkaXJ0eSAmJiBwYXJlbnRGb3JtT2JqWydsaXN0TmV3SXRlbScrZmllbGRzUHJlZml4TmFtZV0uJGludmFsaWQpfSI+CisgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ibGlzdE5ld0l0ZW17e2ZpZWxkc1ByZWZpeE5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICBuZy1pZj0iISgoc2NoZW1hUHJvcGVydHkuc2ltcGxlVHlwZXx8c2NoZW1hUHJvcGVydHkudHlwZSkgPT0gJ2Jvb2xlYW4nKSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJyZWFkT25seSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJsaXN0TmV3SXRlbS52YWx1ZSIKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgIG5hbWU9Imxpc3ROZXdJdGVte3tmaWVsZHNQcmVmaXhOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJnZXRWYWxpZGF0aW9uUGF0dGVybigoc2NoZW1hUHJvcGVydHkuc2ltcGxlVHlwZXx8c2NoZW1hUHJvcGVydHkudHlwZSkpIgorICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlR5cGUgYSB2YWx1ZSBhbmQgdGhlbiBjbGljayBBREQiCisgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9Im1heExlbmd0aCIKKyAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9Int7bWF4TGVuZ3RofX0iCisgICAgICAgICAgICAgICAgICAgc2RjLWtleWJvYXJkLWV2ZW50cz0iIiBrZXktZW50ZXI9InNjaGVtYVByb3BlcnR5LnR5cGUgJiYgIXBhcmVudEZvcm1PYmpbJ2xpc3ROZXdJdGVtJytmaWVsZHNQcmVmaXhOYW1lXS4kaW52YWxpZCAmJiBsaXN0TmV3SXRlbS52YWx1ZSAmJiBhZGRMaXN0SXRlbSIKKyAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXMgLz4KKyAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9Imktc2RjLWZvcm0tc2VsZWN0IgorICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJsaXN0TmV3SXRlbXt7ZmllbGRzUHJlZml4TmFtZX19IgorICAgICAgICAgICAgICAgICAgICBuZy1pZj0iKHNjaGVtYVByb3BlcnR5LnNpbXBsZVR5cGV8fHNjaGVtYVByb3BlcnR5LnR5cGUpID09ICdib29sZWFuJyIKKyAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0icmVhZE9ubHkiCisgICAgICAgICAgICAgICAgICAgIG5hbWU9Imxpc3ROZXdJdGVte3tmaWVsZHNQcmVmaXhOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9Imxpc3ROZXdJdGVtLnZhbHVlIj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0cnVlIj50cnVlPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZmFsc2UiPmZhbHNlPC9vcHRpb24+CisgICAgICAgICAgICA8L3NlbGVjdD4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InBhcmVudEZvcm1PYmpbJ2xpc3ROZXdJdGVtJytmaWVsZHNQcmVmaXhOYW1lXS4kZGlydHkgJiYgcGFyZW50Rm9ybU9ialsnbGlzdE5ld0l0ZW0nK2ZpZWxkc1ByZWZpeE5hbWVdLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJlbnRGb3JtT2JqWydsaXN0TmV3SXRlbScrZmllbGRzUHJlZml4TmFtZV0uJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iUFJPUEVSVFlfRURJVF9QQVRURVJOIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyZW50Rm9ybU9ialsnbGlzdE5ld0l0ZW0nK2ZpZWxkc1ByZWZpeE5hbWVdLiRlcnJvci5tYXhsZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21heCc6ICd7e21heExlbmd0aH19JyB9Ij48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImFkZC1idG4gYWRkLWxpc3QtaXRlbSIgZGF0YS10ZXN0cy1pZD0iYWRkLWxpc3QtaXRlbXt7ZmllbGRzUHJlZml4TmFtZX19IgorICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnOiByZWFkT25seSB8fCAhc2NoZW1hUHJvcGVydHkudHlwZSB8fCBwYXJlbnRGb3JtT2JqWydsaXN0TmV3SXRlbScrZmllbGRzUHJlZml4TmFtZV0uJGludmFsaWQgfHwgIWxpc3ROZXdJdGVtLnZhbHVlfSIgZGF0YS1uZy1jbGljaz0iYWRkTGlzdEl0ZW0oKSI+QWRkPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9Imxpc3QtdmFsdWUtaXRlbXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imxpc3QtdmFsdWUtaXRlbSIgZGF0YS1uZy1yZXBlYXQ9InZhbHVlIGluIHZhbHVlT2JqUmVmIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t2YWx1ZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlbGV0ZS1saXN0LWl0ZW0gc3ByaXRlLW5ldyBzbWFsbC14LWJ1dHRvbiIgZGF0YS1uZy1jbGljaz0iZGVsZXRlTGlzdEl0ZW0oJGluZGV4KSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGRhdGEtbmctaWY9ImlzU2NoZW1hVHlwZURhdGFUeXBlIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iZHQtbGlzdCI+CisgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0PSJ2YWx1ZSBpbiB2YWx1ZU9ialJlZiB0cmFjayBieSAkaW5kZXgiIGNsYXNzPSJkdC1saXN0LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWxldGUtZHQtbGlzdC1pdGVtIiBkYXRhLW5nLWNsaWNrPSJkZWxldGVMaXN0SXRlbSgkaW5kZXgpIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPGZpZWxkcy1zdHJ1Y3R1cmUgdmFsdWUtb2JqLXJlZj0idmFsdWVPYmpSZWZbJGluZGV4XSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLW5hbWU9InNjaGVtYVByb3BlcnR5LnR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LWZvcm0tb2JqPSJwYXJlbnRGb3JtT2JqIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy1wcmVmaXgtbmFtZT0iZmllbGRzUHJlZml4TmFtZSsnJyskaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5PSJyZWFkT25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcz0idHlwZXMiPjwvZmllbGRzLXN0cnVjdHVyZT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkLWJ0biBhZGQtbGlzdC1pdGVtIiBkYXRhLXRlc3RzLWlkPSJhZGQtbGlzdC1pdGVtIgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogcmVhZE9ubHl9IiBkYXRhLW5nLWNsaWNrPSJsaXN0TmV3SXRlbS52YWx1ZT0ne30nO2FkZExpc3RJdGVtKCk7Ij5BZGQ8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisKKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbGlzdC90eXBlLWxpc3QtZGlyZWN0aXZlLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1saXN0L3R5cGUtbGlzdC1kaXJlY3RpdmUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQyMTRlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbGlzdC90eXBlLWxpc3QtZGlyZWN0aXZlLmxlc3MKQEAgLTAsMCArMSw4NSBAQAorLmxpc3QtbmV3LWl0ZW17CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgd2lkdGg6IDUwJTsKKyAgICBtaW4td2lkdGg6IDIyMXB4OworICAgIG1hcmdpbi1yaWdodDogMTVweDsKKyAgICBpbnB1dHsKKyAgICAgICAgbWluLXdpZHRoOiAyMjFweDsKKyAgICB9Cit9CisKKy5saXN0LXZhbHVlLWl0ZW1zeworICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OworICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OworICAgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCBAbWFpbl9jb2xvcl9vOworICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OworICAgIG1pbi1oZWlnaHQ6IDEwMHB4OworICAgIGNsZWFyOiBib3RoOworICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOworICAgIC5saXN0LXZhbHVlLWl0ZW17CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRsdl9jb2xvcl92OworICAgICAgICBtYXJnaW46IDEwcHggMCAwIDEwcHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogOHB4OworICAgICAgICAuZGVsZXRlLWxpc3QtaXRlbXsKKyAgICAgICAgICAgIG1hcmdpbjogMCA2cHggMCAxMHB4OworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy5hZGQtYnRuIHsKKyAgICAuZi1jb2xvci5hOworICAgIC5mLXR5cGUuXzE0X207CisgICAgLmhhbmQ7CisKKyAgICAmLmFkZC1saXN0LWl0ZW0geworICAgICAgICBmbG9hdDogbGVmdDsKKyAgICAgICAgbWFyZ2luLXRvcDogNXB4OworICAgICAgICB3aWR0aDogNDRweDsKKyAgICB9CisKKyAgICAmOmJlZm9yZSB7CisgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAucGx1cy1pY29uOworICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKKyAgICAgICAgY29udGVudDogIiI7CisKKyAgICB9CisgICAgJjpob3ZlciB7CisgICAgICAgIC5mLWNvbG9yLmI7CisgICAgICAgICY6YmVmb3JlIHsKKyAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgLnBsdXMtaWNvbi1ob3ZlcjsKKyAgICAgICAgfQorICAgIH0KKworfQorCisuZHQtbGlzdHsKKyAgICBkaXNwbGF5OiB0YWJsZS1jYXB0aW9uOworICAgIC5kdC1saXN0LWl0ZW0geworICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdjsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAuZGVsZXRlLWR0LWxpc3QtaXRlbXsKKyAgICAgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgIHRvcDogNXB4OworICAgICAgICAgICAgcmlnaHQ6IDVweDsKKyAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgLmRlbGV0ZS1pY29uOworICAgICAgICAgICAgJjpob3ZlcnsKKyAgICAgICAgICAgICAgICAuZGVsZXRlLWljb24taG92ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLmRhdGEtdHlwZS1uYW1leworICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNnB4OworICAgICAgICB9CisgICAgfQorICAgICY+LmFkZC1saXN0LWl0ZW17CisgICAgICAgIGZsb2F0Om5vbmU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1saXN0L3R5cGUtbGlzdC1kaXJlY3RpdmUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1saXN0L3R5cGUtbGlzdC1kaXJlY3RpdmUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy90eXBlLWxpc3QvdHlwZS1saXN0LWRpcmVjdGl2ZS50cwpAQCAtMCwwICsxLDEzMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSByY29oZW4gb24gOS8xNS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgIC8vLyBpbXBvcnQgTW9kZWwgPSBnby5Nb2RlbDsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVR5cGVMaXN0U2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBwYXJlbnRGb3JtT2JqOm5nLklGb3JtQ29udHJvbGxlcjsKKyAgICAgICAgc2NoZW1hUHJvcGVydHk6TW9kZWxzLlNjaGVtYVByb3BlcnR5OworICAgICAgICBpc1NjaGVtYVR5cGVEYXRhVHlwZTpib29sZWFuOworICAgICAgICB2YWx1ZU9ialJlZjphbnk7CisgICAgICAgIHByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGZpZWxkc1ByZWZpeE5hbWU6c3RyaW5nOworICAgICAgICByZWFkT25seTpib29sZWFuOworICAgICAgICBsaXN0RGVmYXVsdFZhbHVlOmFueTsKKyAgICAgICAgdHlwZXM6TW9kZWxzLkRhdGFUeXBlc01hcDsKKyAgICAgICAgbGlzdE5ld0l0ZW06YW55OworICAgICAgICBtYXhMZW5ndGg6bnVtYmVyOworCisgICAgICAgIGdldFZhbGlkYXRpb25QYXR0ZXJuKHR5cGU6c3RyaW5nKTpSZWdFeHA7CisgICAgICAgIHZhbGlkYXRlSW50UmFuZ2UodmFsdWU6c3RyaW5nKTpib29sZWFuOworICAgICAgICBhZGRMaXN0SXRlbSgpOnZvaWQ7CisgICAgICAgIGRlbGV0ZUxpc3RJdGVtKGxpc3RJdGVtSW5kZXg6bnVtYmVyKTp2b2lkCisgICAgfQorCisKKyAgICBleHBvcnQgY2xhc3MgVHlwZUxpc3REaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBEYXRhVHlwZXNTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5EYXRhVHlwZXNTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblV0aWxzOlNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMpIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgdmFsdWVPYmpSZWY6ICc9JywvL3JlZiB0byBsaXN0IG9iamVjdCBpbiB0aGUgcGFyZW50IHZhbHVlIG9iamVjdAorICAgICAgICAgICAgc2NoZW1hUHJvcGVydHk6ICc9JywvL2dldCB0aGUgc2NoZW1hLnByb3BlcnR5IG9iamVjdAorICAgICAgICAgICAgcGFyZW50Rm9ybU9iajogJz0nLC8vcmVmIHRvIHBhcmVudCBmb3JtIChnZXQgYW5ndWxhciBmb3JtIG9iamVjdCkKKyAgICAgICAgICAgIGZpZWxkc1ByZWZpeE5hbWU6ICc9JywvL3ByZWZpeCBmb3IgZm9ybSBmaWVsZHMgbmFtZXMKKyAgICAgICAgICAgIHJlYWRPbmx5OiAnPScsLy9pcyBmb3JtIHJlYWQgb25seQorICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnQCcsLy90aGlzIGxpc3QgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgdHlwZXM6ICc9JywvL2RhdGEgdHlwZXMgbGlzdAorICAgICAgICAgICAgbWF4TGVuZ3RoOiAnPScKKyAgICAgICAgfTsKKworICAgICAgICByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1saXN0L3R5cGUtbGlzdC1kaXJlY3RpdmUuaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SVR5cGVMaXN0U2NvcGUsIGVsZW1lbnQ6YW55LCAkYXR0cjphbnkpID0+IHsKKyAgICAgICAgICAgIHNjb3BlLnByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Qcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybjsKKworICAgICAgICAgICAgLy9yZXNldCB2YWx1ZU9ialJlZiB3aGVuIHNjaGVtYSB0eXBlIGlzIGNoYW5nZWQKKyAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ3NjaGVtYVByb3BlcnR5LnR5cGUnLCAobmV3RGF0YTphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmlzU2NoZW1hVHlwZURhdGFUeXBlID0gdGhpcy5EYXRhVHlwZXNTZXJ2aWNlLmlzRGF0YVR5cGVGb3JTY2hlbWFUeXBlKHNjb3BlLnNjaGVtYVByb3BlcnR5LHNjb3BlLnR5cGVzKTsKKyAgICAgICAgICAgICAgICAvL2luc2VydCAxIGVtcHR5IGl0ZW0gZHQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgIGlmKHNjb3BlLmlzU2NoZW1hVHlwZURhdGFUeXBlICYmICghc2NvcGUudmFsdWVPYmpSZWZ8fCFzY29wZS52YWx1ZU9ialJlZi5sZW5ndGgpKXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUudmFsdWVPYmpSZWYgPSBzY29wZS52YWx1ZU9ialJlZiB8fFtdOworICAgICAgICAgICAgICAgICAgICBzY29wZS52YWx1ZU9ialJlZi5wdXNoKHt9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy93aGVuIHVzZXIgYnJvd3MgYmV0d2VlbiBwcm9wZXJ0aWVzIGluICJlZGl0IHByb3BlcnR5IGZvcm0iCisgICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmaWVsZHNQcmVmaXhOYW1lJywgKG5ld0RhdGE6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5saXN0TmV3SXRlbT17dmFsdWU6Jyd9OworCisgICAgICAgICAgICAgICAgaWYoJGF0dHIuZGVmYXVsdFZhbHVlKXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUubGlzdERlZmF1bHRWYWx1ZSA9IEpTT04ucGFyc2UoJGF0dHIuZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgc2NvcGUuZ2V0VmFsaWRhdGlvblBhdHRlcm4gPSAodHlwZTpzdHJpbmcpOlJlZ0V4cCA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVmFsaWRhdGlvblV0aWxzLmdldFZhbGlkYXRpb25QYXR0ZXJuKHR5cGUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUudmFsaWRhdGVJbnRSYW5nZSA9ICh2YWx1ZTpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiAhdmFsdWUgfHwgdGhpcy5WYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJbnRSYW5nZSh2YWx1ZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5hZGRMaXN0SXRlbSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlT2JqUmVmID0gc2NvcGUudmFsdWVPYmpSZWYgfHxbXTsKKyAgICAgICAgICAgICAgICBsZXQgbmV3VmFsID0gKChzY29wZS5zY2hlbWFQcm9wZXJ0eS5zaW1wbGVUeXBlfHxzY29wZS5zY2hlbWFQcm9wZXJ0eS50eXBlKT09VXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1RZUEVTLlNUUklORz9zY29wZS5saXN0TmV3SXRlbS52YWx1ZTpKU09OLnBhcnNlKHNjb3BlLmxpc3ROZXdJdGVtLnZhbHVlKSk7CisgICAgICAgICAgICAgICAgc2NvcGUudmFsdWVPYmpSZWYucHVzaChuZXdWYWwpOworICAgICAgICAgICAgICAgIHNjb3BlLmxpc3ROZXdJdGVtLnZhbHVlID0gIiI7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5kZWxldGVMaXN0SXRlbSA9IChsaXN0SXRlbUluZGV4Om51bWJlcik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUudmFsdWVPYmpSZWYuc3BsaWNlKGxpc3RJdGVtSW5kZXgsMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzY29wZS52YWx1ZU9ialJlZi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmxpc3REZWZhdWx0VmFsdWUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmNvcHkoc2NvcGUubGlzdERlZmF1bHRWYWx1ZSwgc2NvcGUudmFsdWVPYmpSZWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGVzU2VydmljZTpTZGMuU2VydmljZXMuRGF0YVR5cGVzU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25VdGlsczpTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZUxpc3REaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUsRGF0YVR5cGVzU2VydmljZSxQcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybixWYWxpZGF0aW9uVXRpbHMpOworICAgICAgICB9OworICAgIH0KKworICAgIFR5cGVMaXN0RGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCdTZGMuU2VydmljZXMuRGF0YVR5cGVzU2VydmljZScsJ1Byb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuJywnVmFsaWRhdGlvblV0aWxzJ107Cit9CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy90eXBlLW1hcC90eXBlLW1hcC1kaXJlY3RpdmUuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy90eXBlLW1hcC90eXBlLW1hcC1kaXJlY3RpdmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgyYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbWFwL3R5cGUtbWFwLWRpcmVjdGl2ZS5odG1sCkBAIC0wLDAgKzEsNzAgQEAKKzxkaXY+CisgICAgPGRpdiBkYXRhLW5nLXJlcGVhdD0iaSBpbiBnZXROdW1iZXIobWFwS2V5cy5sZW5ndGgpIHRyYWNrIGJ5ICRpbmRleCIgY2xhc3M9Im1hcC1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7J3ByaW1pdGl2ZS12YWx1ZS1tYXAnOiFpc1NjaGVtYVR5cGVEYXRhVHlwZX0iPgorICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0gbWFwLWl0ZW0tZmllbGQiIGRhdGEtbmctY2xhc3M9IntlcnJvcjoocGFyZW50Rm9ybU9ialsnbWFwS2V5JytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGRpcnR5ICYmIHBhcmVudEZvcm1PYmpbJ21hcEtleScrZmllbGRzUHJlZml4TmFtZSskaW5kZXhdLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5LZXk8L2xhYmVsPgorICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Im1hcEtleXt7ZmllbGRzUHJlZml4TmFtZX19e3skaW5kZXh9fSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJtYXBLZXlzWyRpbmRleF0iCisgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICBuYW1lPSJtYXBLZXl7e2ZpZWxkc1ByZWZpeE5hbWV9fXt7JGluZGV4fX0iCisgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJwcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJjaGFuZ2VLZXlPZk1hcChtYXBLZXlzWyRpbmRleF0sICRpbmRleCwnbWFwS2V5JytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJyZWFkT25seSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzLz4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InBhcmVudEZvcm1PYmpbJ21hcEtleScrZmllbGRzUHJlZml4TmFtZSskaW5kZXhdLiRkaXJ0eSAmJiBwYXJlbnRGb3JtT2JqWydtYXBLZXknK2ZpZWxkc1ByZWZpeE5hbWUrJGluZGV4XS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyZW50Rm9ybU9ialsnbWFwS2V5JytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGVycm9yLmtleUV4aXN0IiB0cmFuc2xhdGU9IlBST1BFUlRZX0VESVRfTUFQX1VOSVFVRV9LRVlTIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyZW50Rm9ybU9ialsnbWFwS2V5JytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnS2V5JyB9Ij48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0iIWlzU2NoZW1hVHlwZURhdGFUeXBlIiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIG1hcC1pdGVtLWZpZWxkIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KHBhcmVudEZvcm1PYmpbJ21hcFZhbHVlJytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGRpcnR5ICYmIHBhcmVudEZvcm1PYmpbJ21hcFZhbHVlJytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGludmFsaWQpfSI+CisgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPlZhbHVlPC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICBuZy1pZj0iISgoc2NoZW1hUHJvcGVydHkuc2ltcGxlVHlwZXx8c2NoZW1hUHJvcGVydHkudHlwZSkgPT0gJ2Jvb2xlYW4nKSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJyZWFkT25seSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJ2YWx1ZU9ialJlZlttYXBLZXlzWyRpbmRleF1dIgorICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgbmFtZT0ibWFwVmFsdWV7e2ZpZWxkc1ByZWZpeE5hbWV9fXt7JGluZGV4fX0iCisgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ibWFwVmFsdWV7e2ZpZWxkc1ByZWZpeE5hbWV9fXt7JGluZGV4fX0iCisgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJnZXRWYWxpZGF0aW9uUGF0dGVybigoc2NoZW1hUHJvcGVydHkuc2ltcGxlVHlwZXx8c2NoZW1hUHJvcGVydHkudHlwZSkpIgorICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSIhcGFyZW50Rm9ybU9ialsnbWFwVmFsdWUnK2ZpZWxkc1ByZWZpeE5hbWUrJGluZGV4XS4kZXJyb3IucGF0dGVybiAmJiBwYXJzZVRvQ29ycmVjdFR5cGUodmFsdWVPYmpSZWYsIGtleSwgKHNjaGVtYVByb3BlcnR5LnNpbXBsZVR5cGV8fHNjaGVtYVByb3BlcnR5LnR5cGUpKSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSJtYXhMZW5ndGgiCisgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSJ7e21heExlbmd0aH19IgorICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXMgLz4KKyAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9Imktc2RjLWZvcm0tc2VsZWN0IgorICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJtYXBWYWx1ZXt7ZmllbGRzUHJlZml4TmFtZX19e3skaW5kZXh9fSIKKyAgICAgICAgICAgICAgICAgICAgbmctaWY9IihzY2hlbWFQcm9wZXJ0eS5zaW1wbGVUeXBlfHxzY2hlbWFQcm9wZXJ0eS50eXBlKSA9PSAnYm9vbGVhbiciCisgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9InJlYWRPbmx5IgorICAgICAgICAgICAgICAgICAgICBuYW1lPSJtYXBWYWx1ZXt7ZmllbGRzUHJlZml4TmFtZX19e3skaW5kZXh9fSIKKyAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0idmFsdWVPYmpSZWZbbWFwS2V5c1skaW5kZXhdXSIKKyAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZD4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0cnVlIj50cnVlPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZmFsc2UiPmZhbHNlPC9vcHRpb24+CisgICAgICAgICAgICA8L3NlbGVjdD4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InBhcmVudEZvcm1PYmpbJ21hcFZhbHVlJytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGRpcnR5ICYmIHBhcmVudEZvcm1PYmpbJ21hcFZhbHVlJytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGludmFsaWQiPgorICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InBhcmVudEZvcm1PYmpbJ21hcFZhbHVlJytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnVmFsdWUnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJlbnRGb3JtT2JqWydtYXBWYWx1ZScrZmllbGRzUHJlZml4TmFtZSskaW5kZXhdLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlBST1BFUlRZX0VESVRfUEFUVEVSTiI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InBhcmVudEZvcm1PYmpbJ21hcFZhbHVlJytmaWVsZHNQcmVmaXhOYW1lKyRpbmRleF0uJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJ3t7bWF4TGVuZ3RofX0nIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJpc1NjaGVtYVR5cGVEYXRhVHlwZSIgY2xhc3M9Imktc2RjLWZvcm0taXRlbSBtYXAtaXRlbS1maWVsZCI+CisgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiPlZhbHVlPC9sYWJlbD4KKyAgICAgICAgICAgIDxmaWVsZHMtc3RydWN0dXJlIHZhbHVlLW9iai1yZWY9InZhbHVlT2JqUmVmW21hcEtleXNbJGluZGV4XV0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLW5hbWU9InNjaGVtYVByb3BlcnR5LnR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtZm9ybS1vYmo9InBhcmVudEZvcm1PYmoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMtcHJlZml4LW5hbWU9IidtYXBWYWx1ZScrZmllbGRzUHJlZml4TmFtZSsnJyskaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkLW9ubHk9InJlYWRPbmx5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM9InR5cGVzIgorICAgICAgICAgICAgPjwvZmllbGRzLXN0cnVjdHVyZT4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxzcGFuIG5nLWNsaWNrPSJkZWxldGVNYXBJdGVtKCRpbmRleCkiIGNsYXNzPSJkZWxldGUtbWFwLWl0ZW0iIGRhdGEtdGVzdHMtaWQ9ImRlbGV0ZS1tYXAtaXRlbXt7ZmllbGRzUHJlZml4TmFtZX19e3skaW5kZXh9fSIgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IHJlYWRPbmx5fSI+PC9zcGFuPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImFkZC1tYXAtaXRlbSIgZGF0YS1uZy1jbGFzcz0ieydzY2hlbWEtZGF0YS10eXBlJzppc1NjaGVtYVR5cGVEYXRhVHlwZX0iPgorICAgICAgICA8ZGl2IGNsYXNzPSJhZGQtYnRuIiBkYXRhLXRlc3RzLWlkPSJhZGQtbWFwLWl0ZW0iCisgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IHJlYWRPbmx5IHx8ICFzY2hlbWFQcm9wZXJ0eS50eXBlIHx8IG1hcEtleXMuaW5kZXhPZignJyk+LTF9IiBkYXRhLW5nLWNsaWNrPSJhZGRNYXBJdGVtRmllbGRzKCkiPkFkZDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy90eXBlLW1hcC90eXBlLW1hcC1kaXJlY3RpdmUubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wcm9wZXJ0eS10eXBlcy90eXBlLW1hcC90eXBlLW1hcC1kaXJlY3RpdmUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDgwYjYyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbWFwL3R5cGUtbWFwLWRpcmVjdGl2ZS5sZXNzCkBAIC0wLDAgKzEsODMgQEAKKy5hZGQtbWFwLWl0ZW17CisgICAgJjpudGgtY2hpbGQob2RkKXsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgIH0KKyAgICAmOm50aC1jaGlsZCgxKXsKKyAgICAgICAgZmxvYXQ6IG5vbmU7CisgICAgICAgIC5hZGQtYnRueworICAgICAgICAgICAgZmxvYXQ6IG5vbmU7CisgICAgICAgIH0KKyAgICB9CisgICAgd2lkdGg6IDQwMHB4OworICAgIC5hZGQtYnRueworICAgICAgICB3aWR0aDogNDRweDsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgIH0KKyAgICAmLnNjaGVtYS1kYXRhLXR5cGV7CisgICAgICAgIGZsb2F0Om5vbmU7CisgICAgICAgIC5hZGQtYnRueworICAgICAgICAgICAgZmxvYXQ6IG5vbmU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy5hZGQtYnRuIHsKKyAgICAuZi1jb2xvci5hOworICAgIC5mLXR5cGUuXzE0X207CisgICAgLmhhbmQ7CisKKyAgICAmOmJlZm9yZSB7CisgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAucGx1cy1pY29uOworICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKKyAgICAgICAgY29udGVudDogIiI7CisKKyAgICB9CisgICAgJjpob3ZlciB7CisgICAgICAgIC5mLWNvbG9yLmI7CisgICAgICAgICY6YmVmb3JlIHsKKyAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgLnBsdXMtaWNvbi1ob3ZlcjsKKyAgICAgICAgfQorICAgIH0KKworfQorCisubWFwLWl0ZW17CisgICAgbWluLXdpZHRoOiAzODlweDsKKyAgICBtaW4taGVpZ2h0OiA2NXB4OworICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdjsKKyAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgbWFyZ2luLWJvdHRvbTogOHB4OworICAgIGZsb2F0OiBsZWZ0OworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgJjpudGgtY2hpbGQoZXZlbikucHJpbWl0aXZlLXZhbHVlLW1hcHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgIH0KKyAgICAuZGVsZXRlLW1hcC1pdGVtIHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIHRvcDogNXB4OworICAgICAgICByaWdodDogNXB4OworICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgLmRlbGV0ZS1pY29uOworICAgICAgICAmOmhvdmVyeworICAgICAgICAgICAgLmRlbGV0ZS1pY29uLWhvdmVyOworICAgICAgICB9CisgICAgfQorICAgIC5tYXAtaXRlbS1maWVsZCB7CisgICAgICAgIG1hcmdpbjogN3B4IDEycHggIWltcG9ydGFudDsKKyAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgIG1pbi13aWR0aDogMTcwcHg7CisgICAgICAgIG1pbi1oZWlnaHQ6IDUwcHg7CisgICAgICAgIHNlbGVjdHsKKyAgICAgICAgICAgIHdpZHRoOjE3MXB4OworICAgICAgICB9CisgICAgICAgIGlucHV0W3R5cGU9InRleHQiXXsKKyAgICAgICAgICAgIHdpZHRoOiAxNzBweDsKKyAgICAgICAgfQorICAgICAgICAmPi5kYXRhLXR5cGUtZmllbGRzLXN0cnVjdHVyZXsKKyAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1tYXAvdHlwZS1tYXAtZGlyZWN0aXZlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbWFwL3R5cGUtbWFwLWRpcmVjdGl2ZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRjY2YzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbWFwL3R5cGUtbWFwLWRpcmVjdGl2ZS50cwpAQCAtMCwwICsxLDE1NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSByY29oZW4gb24gOS8xNS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVR5cGVNYXBTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIHBhcmVudEZvcm1PYmo6bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBzY2hlbWFQcm9wZXJ0eTpNb2RlbHMuU2NoZW1hUHJvcGVydHk7CisgICAgICAgIGlzU2NoZW1hVHlwZURhdGFUeXBlOmJvb2xlYW47CisgICAgICAgIHZhbHVlT2JqUmVmOmFueTsKKyAgICAgICAgbWFwS2V5czpBcnJheTxzdHJpbmc+Oy8vYXJyYXkgb2YgbWFwIGtleXMKKyAgICAgICAgcHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm46IFJlZ0V4cDsKKyAgICAgICAgZmllbGRzUHJlZml4TmFtZTpzdHJpbmc7CisgICAgICAgIHJlYWRPbmx5OmJvb2xlYW47CisgICAgICAgIG1hcERlZmF1bHRWYWx1ZTphbnk7CisgICAgICAgIHR5cGVzOk1vZGVscy5EYXRhVHlwZXNNYXA7CisgICAgICAgIG1heExlbmd0aDpudW1iZXI7CisKKyAgICAgICAgZ2V0VmFsaWRhdGlvblBhdHRlcm4odHlwZTpzdHJpbmcpOlJlZ0V4cDsKKyAgICAgICAgdmFsaWRhdGVJbnRSYW5nZSh2YWx1ZTpzdHJpbmcpOmJvb2xlYW47CisgICAgICAgIGNoYW5nZUtleU9mTWFwKG5ld0tleTpzdHJpbmcsIGluZGV4Om51bWJlciwgZmllbGROYW1lOnN0cmluZyk6dm9pZDsKKyAgICAgICAgZGVsZXRlTWFwSXRlbShpbmRleDpudW1iZXIpOnZvaWQ7CisgICAgICAgIGFkZE1hcEl0ZW1GaWVsZHMoKTp2b2lkOworICAgICAgICBwYXJzZVRvQ29ycmVjdFR5cGUob2JqZWN0T2ZWYWx1ZXM6YW55LCBsb2NhdGlvbkluT2JqOnN0cmluZywgdHlwZTpzdHJpbmcpOnZvaWQ7CisgICAgICAgIGdldE51bWJlcihudW06bnVtYmVyKTpBcnJheTxhbnk+OworICAgIH0KKworCisgICAgZXhwb3J0IGNsYXNzIFR5cGVNYXBEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBEYXRhVHlwZXNTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5EYXRhVHlwZXNTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblV0aWxzOlNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHRpbWVvdXQ6IG5nLklUaW1lb3V0U2VydmljZSkgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICB2YWx1ZU9ialJlZjogJz0nLC8vcmVmIHRvIG1hcCBvYmplY3QgaW4gdGhlIHBhcmVudCB2YWx1ZSBvYmplY3QKKyAgICAgICAgICAgIHNjaGVtYVByb3BlcnR5OiAnPScsLy9nZXQgdGhlIHNjaGVtYS5wcm9wZXJ0eSBvYmplY3QKKyAgICAgICAgICAgIHBhcmVudEZvcm1PYmo6ICc9JywvL3JlZiB0byBwYXJlbnQgZm9ybSAoZ2V0IGFuZ3VsYXIgZm9ybSBvYmplY3QpCisgICAgICAgICAgICBmaWVsZHNQcmVmaXhOYW1lOiAnPScsLy9wcmVmaXggZm9yIGZvcm0gZmllbGRzIG5hbWVzCisgICAgICAgICAgICByZWFkT25seTogJz0nLC8vaXMgZm9ybSByZWFkIG9ubHkKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ0AnLC8vdGhpcyBtYXAgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgdHlwZXM6ICc9JywvL2RhdGEgdHlwZXMgbGlzdAorICAgICAgICAgICAgbWF4TGVuZ3RoOiAnPScKKyAgICAgICAgfTsKKworICAgICAgICByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHJvcGVydHktdHlwZXMvdHlwZS1tYXAvdHlwZS1tYXAtZGlyZWN0aXZlLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklUeXBlTWFwU2NvcGUsIGVsZW1lbnQ6YW55LCAkYXR0cjphbnkpID0+IHsKKyAgICAgICAgICAgIHNjb3BlLnByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Qcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybjsKKworICAgICAgICAgICAgLy9yZXNldCB2YWx1ZU9ialJlZiBhbmQgbWFwS2V5cyB3aGVuIHNjaGVtYSB0eXBlIGlzIGNoYW5nZWQKKyAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ3NjaGVtYVByb3BlcnR5LnR5cGUnLCAobmV3RGF0YTphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmlzU2NoZW1hVHlwZURhdGFUeXBlID0gdGhpcy5EYXRhVHlwZXNTZXJ2aWNlLmlzRGF0YVR5cGVGb3JTY2hlbWFUeXBlKHNjb3BlLnNjaGVtYVByb3BlcnR5LHNjb3BlLnR5cGVzKTsKKyAgICAgICAgICAgICAgICBpZihzY29wZS52YWx1ZU9ialJlZil7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1hcEtleXMgPSBPYmplY3Qua2V5cyhzY29wZS52YWx1ZU9ialJlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vd2hlbiB1c2VyIGJyb3dzIGJldHdlZW4gcHJvcGVydGllcyBpbiAiZWRpdCBwcm9wZXJ0eSBmb3JtIgorICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignZmllbGRzUHJlZml4TmFtZScsIChuZXdEYXRhOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYoIXNjb3BlLnZhbHVlT2JqUmVmKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlT2JqUmVmPXt9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZS5tYXBLZXlzID0gT2JqZWN0LmtleXMoc2NvcGUudmFsdWVPYmpSZWYpOworCisgICAgICAgICAgICAgICAgaWYoJGF0dHIuZGVmYXVsdFZhbHVlKXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUubWFwRGVmYXVsdFZhbHVlID0gSlNPTi5wYXJzZSgkYXR0ci5kZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvL3JldHVybiBkdW1teSBhcnJheSBpbiBvcmRlciB0byBwcmV2ZW50IHJlbmRlcmluZyBtYXAta2V5cyBuZy1yZXBlYXQgYWdhaW4gd2hlbiBhIG1hcCBrZXkgaXMgY2hhbmdlZAorICAgICAgICAgICAgc2NvcGUuZ2V0TnVtYmVyID0gKG51bTpudW1iZXIpOkFycmF5PGFueT4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXkobnVtKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmdldFZhbGlkYXRpb25QYXR0ZXJuID0gKHR5cGU6c3RyaW5nKTpSZWdFeHAgPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZhbGlkYXRpb25VdGlscy5nZXRWYWxpZGF0aW9uUGF0dGVybih0eXBlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLnZhbGlkYXRlSW50UmFuZ2UgPSAodmFsdWU6c3RyaW5nKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIXZhbHVlIHx8IHRoaXMuVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSW50UmFuZ2UodmFsdWUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUuY2hhbmdlS2V5T2ZNYXAgPSAobmV3S2V5OnN0cmluZywgaW5kZXg6bnVtYmVyLCBmaWVsZE5hbWU6c3RyaW5nKSA6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCBvbGRLZXkgPSBPYmplY3Qua2V5cyhzY29wZS52YWx1ZU9ialJlZilbaW5kZXhdOworICAgICAgICAgICAgICAgIGlmKE9iamVjdC5rZXlzKHNjb3BlLnZhbHVlT2JqUmVmKS5pbmRleE9mKG5ld0tleSk+LTEpeworICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJlbnRGb3JtT2JqW2ZpZWxkTmFtZV0uJHNldFZhbGlkaXR5KCdrZXlFeGlzdCcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50Rm9ybU9ialtmaWVsZE5hbWVdLiRzZXRWYWxpZGl0eSgna2V5RXhpc3QnLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIXNjb3BlLnBhcmVudEZvcm1PYmpbZmllbGROYW1lXS4kaW52YWxpZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmNvcHkoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzY29wZS52YWx1ZU9ialJlZikucmVwbGFjZSgnIicrb2xkS2V5KyciOicsICciJytuZXdLZXkrJyI6JykpLHNjb3BlLnZhbHVlT2JqUmVmKTsvL3VwZGF0ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmRlbGV0ZU1hcEl0ZW09KGluZGV4Om51bWJlcik6dm9pZD0+eworICAgICAgICAgICAgICAgIGRlbGV0ZSBzY29wZS52YWx1ZU9ialJlZltzY29wZS5tYXBLZXlzW2luZGV4XV07CisgICAgICAgICAgICAgICAgc2NvcGUubWFwS2V5cy5zcGxpY2UoaW5kZXgsMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzY29wZS5tYXBLZXlzLmxlbmd0aCkgey8vb25seSB3aGVuIHVzZXIgcmVtb3ZlcyBhbGwgcGFpcnMgb2Yga2V5LXZhbHVlIGZpZWxkcyAtIHB1dCB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICBpZiAoIHNjb3BlLm1hcERlZmF1bHRWYWx1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuY29weShzY29wZS5tYXBEZWZhdWx0VmFsdWUsIHNjb3BlLnZhbHVlT2JqUmVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1hcEtleXMgPSBPYmplY3Qua2V5cyhzY29wZS52YWx1ZU9ialJlZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5hZGRNYXBJdGVtRmllbGRzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUudmFsdWVPYmpSZWZbJyddPSBudWxsOworICAgICAgICAgICAgICAgIHNjb3BlLm1hcEtleXMgPSBPYmplY3Qua2V5cyhzY29wZS52YWx1ZU9ialJlZik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5wYXJzZVRvQ29ycmVjdFR5cGUgPSAob2JqZWN0T2ZWYWx1ZXM6YW55LCBsb2NhdGlvbkluT2JqOnN0cmluZywgdHlwZTpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmKG9iamVjdE9mVmFsdWVzW2xvY2F0aW9uSW5PYmpdICYmIHR5cGUgIT0gVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1RZUEVTLlNUUklORyl7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdE9mVmFsdWVzW2xvY2F0aW9uSW5PYmpdID0gSlNPTi5wYXJzZShvYmplY3RPZlZhbHVlc1tsb2NhdGlvbkluT2JqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZXNTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5EYXRhVHlwZXNTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblV0aWxzOlNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGltZW91dDogbmcuSVRpbWVvdXRTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZU1hcERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSxEYXRhVHlwZXNTZXJ2aWNlLFByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuLFZhbGlkYXRpb25VdGlscywkdGltZW91dCk7CisgICAgICAgIH07CisgICAgfQorCisgICAgVHlwZU1hcERpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJywnU2RjLlNlcnZpY2VzLkRhdGFUeXBlc1NlcnZpY2UnLCdQcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybicsJ1ZhbGlkYXRpb25VdGlscycsJyR0aW1lb3V0J107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHVuY2gtb3V0L3B1bmNoLW91dC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9wdW5jaC1vdXQvcHVuY2gtb3V0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMGI3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvcHVuY2gtb3V0L3B1bmNoLW91dC50cwpAQCAtMCwwICsxLDk5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgZXhwb3J0IGludGVyZmFjZSBJUHVuY2hPdXRTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgICAgZGF0YTogYW55OworICAgICAgICB1c2VyOiBNb2RlbHMuSVVzZXJQcm9wZXJ0aWVzOworICAgICAgICBvbkV2ZW50OiBGdW5jdGlvbjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUHVuY2hPdXREaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOiBTZGMuTW9kZWxzLklBcHBDb25maWd1cnRhaW9uKSB7fQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgbmFtZTogJz0nLAorICAgICAgICAgICAgZGF0YTogJz0nLAorICAgICAgICAgICAgdXNlcjogJz0nLAorICAgICAgICAgICAgb25FdmVudDogJyYnCisgICAgICAgIH07CisKKyAgICAgICAgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICByZXN0cmljdCA9ICdFJzsKKworICAgICAgICBsaW5rID0gKHNjb3BlOiBJUHVuY2hPdXRTY29wZSwgZWxlbWVudDogbmcuSUF1Z21lbnRlZEpRdWVyeSk6dm9pZCA9PiB7CisgICAgICAgICAgICAvLyBnbG9iYWwgcmVnaXN0cnkgb2JqZWN0CisgICAgICAgICAgICBsZXQgUHVuY2hPdXRSZWdpc3RyeSA9IHdpbmRvd1snUHVuY2hPdXRSZWdpc3RyeSddOworCisgICAgICAgICAgICBsZXQgcmVuZGVyID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGNvb2tpZUNvbmZpZyA9IHRoaXMuc2RjQ29uZmlnLmNvb2tpZTsKKyAgICAgICAgICAgICAgICBsZXQgcHJvcHMgPSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWU6IHNjb3BlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHNjb3BlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBhcGlSb290OiB0aGlzLnNkY0NvbmZpZy5hcGkucm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaUhlYWRlcnM6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29va2llQ29uZmlnLnVzZXJJZFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNjb3BlLnVzZXIudXNlcklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRmlyc3ROYW1lOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvb2tpZUNvbmZpZy51c2VyRmlyc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2NvcGUudXNlci5maXJzdE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJMYXN0TmFtZTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb29raWVDb25maWcudXNlckxhc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2NvcGUudXNlci5sYXN0TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckVtYWlsOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvb2tpZUNvbmZpZy51c2VyRW1haWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzY29wZS51c2VyLmVtYWlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBvbkV2ZW50OiAoLi4uYXJncykgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5vbkV2ZW50KCkuYXBwbHkobnVsbCwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgUHVuY2hPdXRSZWdpc3RyeS5yZW5kZXIocHJvcHMsIGVsZW1lbnRbMF0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IHVubW91bnQgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBQdW5jaE91dFJlZ2lzdHJ5LnVubW91bnQoZWxlbWVudFswXSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS4kd2F0Y2goJ2RhdGEnLCByZW5kZXIpOworICAgICAgICAgICAgZWxlbWVudC5vbignJGRlc3Ryb3knLCB1bm1vdW50KTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoc2RjQ29uZmlnOiBTZGMuTW9kZWxzLklBcHBDb25maWd1cnRhaW9uKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFB1bmNoT3V0RGlyZWN0aXZlKHNkY0NvbmZpZyk7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBQdW5jaE91dERpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJ3NkY0NvbmZpZyddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3NkYy10YWJzL3NkYy1zaW5nbGUtdGFiL3NkYy1zaW5nbGUtdGFiLWRpcmVjdGl2ZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtc2luZ2xlLXRhYi9zZGMtc2luZ2xlLXRhYi1kaXJlY3RpdmUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzOTBhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtc2luZ2xlLXRhYi9zZGMtc2luZ2xlLXRhYi1kaXJlY3RpdmUudHMKQEAgLTAsMCArMSw2NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIFNkY1NpbmdsZVRhYkRpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJGNvbXBpbGU6bmcuSUNvbXBpbGVTZXJ2aWNlLCBwcml2YXRlICRwYXJzZTpuZy5JUGFyc2VTZXJ2aWNlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmVzdHJpY3QgPSAnRSc7CisKKyAgICAgICAgbGluayA9IChzY29wZSwgZWxlbTphbnksIGF0dHJzOmFueSwgY3RybDphbnkpID0+IHsKKyAgICAgICAgICAgIGlmKCFlbGVtLmF0dHIoJ2lubmVyLXNkYy1zaW5nbGUtdGFiJykpIHsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuJHBhcnNlKGVsZW0uYXR0cignY3RybCcpKShzY29wZSk7CisgICAgICAgICAgICAgICAgZWxlbSA9IGVsZW0ucmVtb3ZlQXR0cignY3RybCcpOworICAgICAgICAgICAgICAgIGVsZW0uYXR0cignaW5uZXItc2RjLXNpbmdsZS10YWInLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRjb21waWxlKGVsZW0pKHNjb3BlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJGNvbXBpbGU6bmcuSUNvbXBpbGVTZXJ2aWNlLCAkcGFyc2U6bmcuSVBhcnNlU2VydmljZSk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNkY1NpbmdsZVRhYkRpcmVjdGl2ZSgkY29tcGlsZSwgJHBhcnNlKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgSW5uZXJTZGNTaW5nbGVUYWJEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSkgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBzaW5nbGVUYWI6ICI9IiwKKyAgICAgICAgICAgIGlzVmlld09ubHk6ICI9IgorICAgICAgICB9OworCisgICAgICAgIHJlcGxhY2UgPSB0cnVlOworICAgICAgICByZXN0cmljdCA9ICdBJzsKKyAgICAgICAgY29udHJvbGxlciA9ICdAJzsKKyAgICAgICAgdGVtcGxhdGUgPSAnPGRpdiBuZy1pbmNsdWRlIHNyYz0ic2luZ2xlVGFiLnRlbXBsYXRlVXJsIj48L2Rpdj4nOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbm5lclNkY1NpbmdsZVRhYkRpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSk7CisgICAgICAgIH07CisgICAgfQorCisgICAgU2RjU2luZ2xlVGFiRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJGNvbXBpbGUnLCAnJHBhcnNlJ107CisgICAgSW5uZXJTZGNTaW5nbGVUYWJEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZSddOworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvc2RjLXRhYnMvc2RjLXNpbmdsZS10YWIvc2RjLXNpbmdsZS10YWIubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtc2luZ2xlLXRhYi9zZGMtc2luZ2xlLXRhYi5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvc2RjLXRhYnMvc2RjLXNpbmdsZS10YWIvc2RjLXNpbmdsZS10YWIubGVzcwpAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtdGFicy1kaXJlY3RpdmUtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3NkYy10YWJzL3NkYy10YWJzLWRpcmVjdGl2ZS12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxZDIyMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtdGFicy1kaXJlY3RpdmUtdmlldy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxkaXYgY2xhc3M9InNkYy10YWJzLWJvZHkiPgorICAgIDxkaXYgY2xhc3M9InNkYy10YWJzIiBuZy1jbGFzcz0ieydub3QtYWN0aXZlJzogIWlzQWN0aXZlfSI+CisgICAgICAgIDxkaXYgY2xhc3M9InNkYy10YWItYXJyb3ciIG5nLWNsaWNrPSJpc0FjdGl2ZSA9ICFpc0FjdGl2ZSI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyBjbG9zZS1vcGVuLWxlZnQtYXJyb3ciIG5nLWNsYXNzPSJ7J2Nsb3NlLW9wZW4tcmlnaHQtYXJyb3cnOiAhaXNBY3RpdmV9Ij48L3NwYW4+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IG5nLXJlcGVhdD0idGFiIGluIHRhYnMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy10YWIiIG5nLWNsaWNrPSJvblRhYlNlbGVjdGVkKHRhYikiIGRhdGEtdGVzdHMtaWQ9Int7dGFiLm5hbWV9fS10YWIiIG5nLW1vdXNlZW50ZXI9ImhvdmVyID0gdHJ1ZSIKKyAgICAgICAgICAgICAgICAgbmctbW91c2VsZWF2ZT0iaG92ZXIgPSBmYWxzZSIKKyAgICAgICAgICAgICAgICAgbmctY2xhc3M9InsnbGFzdC10YWInOiRsYXN0LCAnZmlyc3QtdGFiJzogJGZpcnN0LCAnc2VsZWN0ZWQnIDp0YWIubmFtZSA9PT0gc2VsZWN0ZWRUYWIubmFtZSB9Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtdGFiLWljb24gc3ByaXRlLW5ldyB7e3RhYi5pY29ufX0iICBuZy1jbGFzcz0ieydzZWxlY3RlZCcgOnRhYi5uYW1lID09PSBzZWxlY3RlZFRhYi5uYW1lLCAnaG92ZXInOiBob3Zlcn0iPjwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InNkYy1zaW5nbGUtdGFiLWNvbnRlbnQiIG5nLWlmPSJpc0FjdGl2ZSI+CisgICAgICAgIDxzZGMtc2luZ2xlLXRhYiBjbGFzcz0ic2RjLXNpbmdsZS10YWItY29udGVudC1ib2R5IiBuZy1pZj0ic2VsZWN0ZWRUYWIiIGN0cmw9InNlbGVjdGVkVGFiLmNvbnRyb2xsZXIiIGRhdGEtZGVzdHMtaWQ9InNlbGVjdGVkLXRhYiIgc2luZ2xlLXRhYj0ic2VsZWN0ZWRUYWIiIGlzLXZpZXctb25seT0iaXNWaWV3T25seSI+PC9zZGMtc2luZ2xlLXRhYj4KKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3NkYy10YWJzL3NkYy10YWJzLWRpcmVjdGl2ZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtdGFicy1kaXJlY3RpdmUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMTc0NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtdGFicy1kaXJlY3RpdmUudHMKQEAgLTAsMCArMSw2OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNy8yOC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVNkY1RhYnNEaXJlY3RpdmVTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIHRhYnM6QXJyYXk8TW9kZWxzLlRhYj47CisgICAgICAgIHNlbGVjdGVkVGFiOiBNb2RlbHMuVGFiOworICAgICAgICBpc0FjdGl2ZTogYm9vbGVhbjsKKyAgICAgICAgb25UYWJTZWxlY3RlZChzZWxlY3RlZFRhYjogTW9kZWxzLlRhYik7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFNkY1RhYnNEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSkgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICB0YWJzOiAiPSIsCisgICAgICAgICAgICBzZWxlY3RlZFRhYjogIj0/IiwKKyAgICAgICAgICAgIGlzVmlld09ubHk6ICI9IgorICAgICAgICB9OworCisgICAgICAgIHJlcGxhY2UgPSB0cnVlOworICAgICAgICByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtdGFicy1kaXJlY3RpdmUtdmlldy5odG1sJyk7CisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9IChzY29wZTpJU2RjVGFic0RpcmVjdGl2ZVNjb3BlKSA9PiB7CisgICAgICAgICAgICBzY29wZS5pc0FjdGl2ZSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmKCFzY29wZS5zZWxlY3RlZFRhYil7CisgICAgICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWRUYWIgPSBzY29wZS50YWJzWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5vblRhYlNlbGVjdGVkID0gKHNlbGVjdGVkVGFiOiBNb2RlbHMuVGFiKSA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWRUYWIgPSBzZWxlY3RlZFRhYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2RjVGFic0RpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSk7CisgICAgICAgIH07CisgICAgfQorCisgICAgU2RjVGFic0RpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvc2RjLXRhYnMvc2RjLXRhYnMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtdGFicy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzkwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvc2RjLXRhYnMvc2RjLXRhYnMubGVzcwpAQCAtMCwwICsxLDY4IEBACisuc2RjLXRhYnMtYm9keSB7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIHdpZHRoOiAzMzBweDsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgLnNkYy10YWJzIHsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICB3aWR0aDogNDBweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICB6LWluZGV4OiA5OTsKKyAgICAgICAgcmlnaHQ6IDMzMnB4OworICAgICAgICAuc2RjLXRhYi1hcnJvdyB7CisgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICAgICAgICB3aWR0aDogNDBweDsKKyAgICAgICAgICAgIGhlaWdodDogMjBweDsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdTsKKyAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTcpOworICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICAgICAgcGFkZGluZzogMXB4IDRweCAwcHggMHB4OworCisgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9vOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgLnNkYy10YWIgeworICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICAgICAgd2lkdGg6IDQwcHg7CisgICAgICAgICAgICBoZWlnaHQ6IDQzcHg7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGx2X2NvbG9yX3U7CisgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE3KTsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKworICAgICAgICAgICAgLnNkYy10YWItaWNvbiB7CisgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAuc2VsZWN0ZWQgeworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRsdl9jb2xvcl90OworICAgICAgICB9CisKKyAgICAgICAgLmxhc3QtdGFiIHsKKyAgICAgICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEycHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAubm90LWFjdGl2ZSB7CisgICAgICAgLy8gcG9zaXRpb246IGFic29sdXRlOworICAgICAgICByaWdodDogNDFweDsKKyAgICB9CisKKyAgICAuc2RjLXNpbmdsZS10YWItY29udGVudCB7CisgICAgICAgIHBhZGRpbmc6IDE1cHggMHB4IDBweCAwcHg7CisgICAgICAgIHdpZHRoOiAyOTBweDsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRsdl9jb2xvcl90OworICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgYm90dG9tOiAwOworICAgICAgICB0b3A6IDA7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgYm94LXNoYWRvdzogMC4zcHggMXB4IDNweCByZ2JhKDI0LCAyNCwgMjUsIDAuNDIpOworICAgICAgICByaWdodDogMzMxcHg7CisgICAgICAgIC5zZGMtc2luZ2xlLXRhYi1jb250ZW50LWJvZHkgeworICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zdHJ1Y3R1cmUtdHJlZS9zdHJ1Y3R1cmUtdHJlZS1kaXJlY3RpdmUuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zdHJ1Y3R1cmUtdHJlZS9zdHJ1Y3R1cmUtdHJlZS1kaXJlY3RpdmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhhODgzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3N0cnVjdHVyZS10cmVlL3N0cnVjdHVyZS10cmVlLWRpcmVjdGl2ZS5odG1sCkBAIC0wLDAgKzEsNTQgQEAKKzxkaXYgY2xhc3M9InN0cnVjdHVyZS10cmVlIj4KKyAgICA8ZGl2IGNsYXNzPSJjb21wb25lbnQtY29udGFpbmVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ie3tjb21wb25lbnQuaWNvblNwcml0ZX19IHNtYWxsIiBuZy1jbGFzcz0ic3RydWN0dXJlVHJlZS5zZXJ2aWNlUm9vdC5pY29uIj48L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iY29tcG9uZW50LWNvbnRhaW5lci10ZXh0IiB0b29sdGlwLWNsYXNzPSJ0b29sdGlwLWN1c3RvbSBicmVhay13b3JkLXRvb2x0aXAiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0iJiM4MjAzO3t7c3RydWN0dXJlVHJlZS5zZXJ2aWNlUm9vdC5uYW1lfX0iPiB7e3N0cnVjdHVyZVRyZWUuc2VydmljZVJvb3QubmFtZX19PC9kaXY+CisgICAgPC9kaXY+CisgICAgPHVsPgorICAgICAgICA8bGkgIGRhdGEtbmctcmVwZWF0PSJmaXJzdExldmVsUmVzb3VyY2VzSW5zdGFuY2VzIGluIHN0cnVjdHVyZVRyZWUuc2VydmljZVJvb3QucmVzb3VyY2VJbnN0YW5jZXNMaXN0Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbXBvbmVudC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNtYWxsIHt7Zmlyc3RMZXZlbFJlc291cmNlc0luc3RhbmNlcy5pY29ufX0iIG5nLWNsYXNzPSJ7J3Nwcml0ZS1yZXNvdXJjZS1pY29ucyc6ICFjb21wb25lbnQuaXNQcm9kdWN0KCksICdzcHJpdGUtc2VydmljZXMtaWNvbnMnOiBjb21wb25lbnQuaXNQcm9kdWN0KCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWNsYXNzPSJ7J25vbi1jZXJ0aWZpZWQnOiFmaXJzdExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLmNlcnRpZmllZH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1zaWRlPSJ0b3AiIHRvb2x0aXAtY29udGVudD0iTm90IGNlcnRpZmllZCI+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbXBvbmVudC1jb250YWluZXItdGV4dCIgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tmaXJzdExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLm5hbWV9fSIgPiAgIHt7Zmlyc3RMZXZlbFJlc291cmNlc0luc3RhbmNlcy5uYW1lfX0gPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGkgZGF0YS1uZy1yZXBlYXQ9InNlY29uZExldmVsUmVzb3VyY2VzSW5zdGFuY2VzIGluIGZpcnN0TGV2ZWxSZXNvdXJjZXNJbnN0YW5jZXMucmVzb3VyY2VJbnN0YW5jZXNMaXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29tcG9uZW50LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcHJpdGUtcmVzb3VyY2UtaWNvbnMgc21hbGwiIG5nLWNsYXNzPSJzZWNvbmRMZXZlbFJlc291cmNlc0luc3RhbmNlcy5pY29uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctY2xhc3M9Insnbm9uLWNlcnRpZmllZCc6IXNlY29uZExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLmNlcnRpZmllZH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLXNpZGU9InRvcCIgdG9vbHRpcC1jb250ZW50PSJOb3QgY2VydGlmaWVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29tcG9uZW50LWNvbnRhaW5lci10ZXh0IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7c2Vjb25kTGV2ZWxSZXNvdXJjZXNJbnN0YW5jZXMubmFtZX19Ij4gICB7e3NlY29uZExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLm5hbWV9fSA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdD0idGhpcmRMZXZlbFJlc291cmNlc0luc3RhbmNlcyBpbiBzZWNvbmRMZXZlbFJlc291cmNlc0luc3RhbmNlcy5yZXNvdXJjZUluc3RhbmNlc0xpc3QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbXBvbmVudC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcHJpdGUtcmVzb3VyY2UtaWNvbnMgc21hbGwiIG5nLWNsYXNzPSJ0aGlyZExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLmljb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWNsYXNzPSJ7J25vbi1jZXJ0aWZpZWQnOiF0aGlyZExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLmNlcnRpZmllZH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtc2lkZT0idG9wIiB0b29sdGlwLWNvbnRlbnQ9Ik5vdCBjZXJ0aWZpZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb21wb25lbnQtY29udGFpbmVyLXRleHQiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3t0aGlyZExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLm5hbWV9fSIgPiAgIHt7dGhpcmRMZXZlbFJlc291cmNlc0luc3RhbmNlcy5uYW1lfX0gPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1uZy1yZXBlYXQ9ImZvcnRoTGV2ZWxSZXNvdXJjZXNJbnN0YW5jZXMgaW4gdGhpcmRMZXZlbFJlc291cmNlc0luc3RhbmNlcy5yZXNvdXJjZUluc3RhbmNlc0xpc3QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29tcG9uZW50LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ByaXRlLXJlc291cmNlLWljb25zIHNtYWxsIiBuZy1jbGFzcz0iZm9ydGhMZXZlbFJlc291cmNlc0luc3RhbmNlcy5pY29uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWNsYXNzPSJ7J25vbi1jZXJ0aWZpZWQnOiFmb3J0aExldmVsUmVzb3VyY2VzSW5zdGFuY2VzLmNlcnRpZmllZH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1zaWRlPSJ0b3AiIHRvb2x0aXAtY29udGVudD0iTm90IGNlcnRpZmllZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbXBvbmVudC1jb250YWluZXItdGV4dCIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2ZvcnRoTGV2ZWxSZXNvdXJjZXNJbnN0YW5jZXMubmFtZX19Ij4gICB7e2ZvcnRoTGV2ZWxSZXNvdXJjZXNJbnN0YW5jZXMubmFtZX19IDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3N0cnVjdHVyZS10cmVlL3N0cnVjdHVyZS10cmVlLWRpcmVjdGl2ZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3N0cnVjdHVyZS10cmVlL3N0cnVjdHVyZS10cmVlLWRpcmVjdGl2ZS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGMzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvc3RydWN0dXJlLXRyZWUvc3RydWN0dXJlLXRyZWUtZGlyZWN0aXZlLmxlc3MKQEAgLTAsMCArMSw2OCBAQAorLnN0cnVjdHVyZS10cmVleworICAgIHBhZGRpbmc6IDlweCAwcHggMTBweCAzMHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB1bHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBsaXN0LXN0eWxlOiBub25lOworICAgICAgICBwYWRkaW5nLWxlZnQ6MjVweDsKKyAgICAgICAgOjpiZWZvcmV7CisgICAgICAgICAgICBjb250ZW50OiAiIjsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIGxlZnQ6IC0yN3B4OworICAgICAgICB9CisgICAgICAgIDo6YWZ0ZXJ7CisgICAgICAgICAgICBjb250ZW50OiAiIjsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIGxlZnQ6IC0yN3B4OworICAgICAgICB9CisgICAgICAgIGxpeworICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICAgICAgJjo6YmVmb3JleworICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjNjY2NjY2OworICAgICAgICAgICAgICAgIHRvcDogMjBweDsKKyAgICAgICAgICAgICAgICB3aWR0aDogMTBweDsKKyAgICAgICAgICAgICAgICBoZWlnaHQ6IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAmOjphZnRlcnsKKyAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICM2NjY2NjY7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgICAgICAgICAgIHdpZHRoOiAwcHg7CisgICAgICAgICAgICAgICAgdG9wOiAtMnB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgJjpsYXN0LWNoaWxkOjphZnRlcnsKKyAgICAgICAgICAgICAgICBoZWlnaHQ6IDIzcHgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAuY29tcG9uZW50LWNvbnRhaW5lcnsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBtYXJnaW46IDZweCAwcHggMHB4IC0xNnB4OworICAgIH0KKyAgICAuY29tcG9uZW50LWNvbnRhaW5lci1pY29ueworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgfQorICAgIC5jb21wb25lbnQtY29udGFpbmVyLXRleHR7CisgICAgICAgIHBhZGRpbmctbGVmdDogOHB4OworICAgICAgICBmbG9hdDogcmlnaHQ7CisKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIG1heC13aWR0aDoxMjBweDsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICBmb250LXNpemU6IDEzcHg7CisgICAgICAgIGNvbG9yOiAjNjY2NjY2OzsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CisgICAgICAgIGZsb2F0OiBub25lOworICAgIH0KKworICAgIC5ub24tY2VydGlmaWVkeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGxlZnQ6IDE4cHg7CisgICAgICAgIGJvdHRvbTogOHB4OworICAgICAgICAuc3ByaXRlOworICAgICAgICAucy1zZGMtc3RhdGUtbm9uLWNlcnRpZmllZDsKKyAgICAgICAgZGlzcGxheTpibG9jazsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy9zdHJ1Y3R1cmUtdHJlZS9zdHJ1Y3R1cmUtdHJlZS1kaXJlY3RpdmUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvc3RydWN0dXJlLXRyZWUvc3RydWN0dXJlLXRyZWUtZGlyZWN0aXZlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZGNlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvc3RydWN0dXJlLXRyZWUvc3RydWN0dXJlLXRyZWUtZGlyZWN0aXZlLnRzCkBAIC0wLDAgKzEsMTk3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVN0cnVjdHVyZVRyZWVTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisKKyAgICAgICAgY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ7CisgICAgICAgIHN0cnVjdHVyZVRyZWU6IFN0cnVjdHVyZVRyZWU7CisgICAgfQorCisgICAgY2xhc3MgU3RydWN0dXJlVHJlZSB7CisKKyAgICAgICAgc2VydmljZVJvb3Q6UmVzb3VyY2VJbnN0YW5jZU5vZGU7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSB1bmlxdWVJZDpzdHJpbmcsIHByaXZhdGUgcmVzb3VyY2VJbnN0YW5jZU5hbWU6c3RyaW5nLCBwcml2YXRlIHJlc291cmNlSW5zdGFuY2VJY29uOnN0cmluZywgcHJpdmF0ZSBjZXJ0aWZpZWQ6Ym9vbGVhbikgeworICAgICAgICAgICAgdGhpcy5zZXJ2aWNlUm9vdCA9IG5ldyBSZXNvdXJjZUluc3RhbmNlTm9kZSh1bmlxdWVJZCwgcmVzb3VyY2VJbnN0YW5jZU5hbWUsIHJlc291cmNlSW5zdGFuY2VJY29uLCBjZXJ0aWZpZWQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBjbGFzcyBSZXNvdXJjZUluc3RhbmNlTm9kZSB7CisgICAgICAgIGlkOnN0cmluZzsKKyAgICAgICAgaWNvbjpzdHJpbmc7CisgICAgICAgIG5hbWU6c3RyaW5nOworICAgICAgICByZXNvdXJjZUluc3RhbmNlc0xpc3Q6QXJyYXk8UmVzb3VyY2VJbnN0YW5jZU5vZGU+OworICAgICAgICBpc0FscmVhZHlJblRyZWU6Ym9vbGVhbjsKKyAgICAgICAgY2VydGlmaWVkOmJvb2xlYW47CisKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVuaXF1ZUlkOnN0cmluZywgcHJpdmF0ZSByZXNvdXJjZUluc3RhbmNlTmFtZTpzdHJpbmcsIHByaXZhdGUgcmVzb3VyY2VJbnN0YW5jZUljb246c3RyaW5nLCBjZXJ0aWZpZWQ6Ym9vbGVhbikgeworICAgICAgICAgICAgdGhpcy5pZCA9IHVuaXF1ZUlkOworICAgICAgICAgICAgdGhpcy5uYW1lID0gcmVzb3VyY2VJbnN0YW5jZU5hbWU7CisgICAgICAgICAgICB0aGlzLmljb24gPSByZXNvdXJjZUluc3RhbmNlSWNvbjsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VJbnN0YW5jZXNMaXN0ID0gW107CisgICAgICAgICAgICB0aGlzLmlzQWxyZWFkeUluVHJlZSA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5jZXJ0aWZpZWQgPSBjZXJ0aWZpZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU3RydWN0dXJlVHJlZURpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgY29tcG9uZW50OiAnPScsCisgICAgICAgIH07CisgICAgICAgIHJlc3RyaWN0ID0gJ0UnOworICAgICAgICB0ZW1wbGF0ZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3N0cnVjdHVyZS10cmVlL3N0cnVjdHVyZS10cmVlLWRpcmVjdGl2ZS5odG1sJyk7CisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9IChzY29wZTpJU3RydWN0dXJlVHJlZVNjb3BlLCAkZWxlbTphbnkpID0+IHsKKworICAgICAgICAgICAgbGV0IFJFU09VUkNFX0lOU1RBTkNFX0xJU1Q6c3RyaW5nID0gInJlc291cmNlSW5zdGFuY2VzQ2hpbGRlc0xpc3QiOworICAgICAgICAgICAgbGV0IHJlc291cmNlSW5zdGFuY2VNYXA6VXRpbHMuRGljdGlvbmFyeTxzdHJpbmcsIFJlc291cmNlSW5zdGFuY2VOb2RlPjsKKyAgICAgICAgICAgIGxldCByZWxhdGlvbnM6QXJyYXk8TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsPjsKKyAgICAgICAgICAgIC8vKioqKioqKioqKioqKiBTdGFydCBCdWlsZGluZyBUcmVlIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqLy8KKworICAgICAgICAgICAgLy9yZW1vdmUgdW5uZWNlc3NhcnkgaW5zdGFuY2VzCisgICAgICAgICAgICBsZXQgaW5pdFJlc291cmNlSW5zdGFuY2VNYXAgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIHJlc291cmNlSW5zdGFuY2VNYXAgPSBuZXcgVXRpbHMuRGljdGlvbmFyeTxzdHJpbmcsIFJlc291cmNlSW5zdGFuY2VOb2RlPigpOworCisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHNjb3BlLmNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMsIChyZXNvdXJjZUluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF8uc29tZShPYmplY3Qua2V5cyhyZXNvdXJjZUluc3RhbmNlLmNhcGFiaWxpdGllcyksIChrZXk6c3RyaW5nKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Rvc2NhLmNhcGFiaWxpdGllcy5jb250YWluZXInID09IGtleS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgXy5zb21lKE9iamVjdC5rZXlzKHJlc291cmNlSW5zdGFuY2UucmVxdWlyZW1lbnRzKSwoa2V5OnN0cmluZyk9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b3NjYS5jYXBhYmlsaXRpZXMuY29udGFpbmVyJyA9PSBrZXkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2VydGlmaWVkID0gMCA9PT0gKHBhcnNlRmxvYXQocmVzb3VyY2VJbnN0YW5jZS5jb21wb25lbnRWZXJzaW9uKSAlIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGU6UmVzb3VyY2VJbnN0YW5jZU5vZGUgPSBuZXcgUmVzb3VyY2VJbnN0YW5jZU5vZGUocmVzb3VyY2VJbnN0YW5jZS51bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUluc3RhbmNlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJbnN0YW5jZS5pY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2VydGlmaWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSW5zdGFuY2VNYXAuc2V0VmFsdWUocmVzb3VyY2VJbnN0YW5jZS51bmlxdWVJZCwgbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vcmVtb3ZlIHVubmVjZXNzYXJ5IHJlbGF0aW9ucworICAgICAgICAgICAgbGV0IGluaXRSZWxhdGlvbnMgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICByZWxhdGlvbnMgPSBfLmZpbHRlcihzY29wZS5jb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zLCAocmVsYXRpb246TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlSW5zdGFuY2VNYXAuY29udGFpbnNLZXkocmVsYXRpb24uZnJvbU5vZGUpICYmIHJlc291cmNlSW5zdGFuY2VNYXAuY29udGFpbnNLZXkocmVsYXRpb24udG9Ob2RlKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBidWlsZFRyZWUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLnN0cnVjdHVyZVRyZWUgPSBuZXcgU3RydWN0dXJlVHJlZShzY29wZS5jb21wb25lbnQudW5pcXVlSWQsIHNjb3BlLmNvbXBvbmVudC5uYW1lLCBzY29wZS5jb21wb25lbnQuaWNvbiwgJ0NFUlRJRklFRCcgPT09IHNjb3BlLmNvbXBvbmVudC5saWZlY3ljbGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGluaXRSZXNvdXJjZUluc3RhbmNlTWFwKCk7CisgICAgICAgICAgICAgICAgICAgIGluaXRSZWxhdGlvbnMoKTsKKworICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Tm9kZXNMaXN0ID0gXy5ncm91cEJ5KHJlbGF0aW9ucywgKG5vZGU6YW55KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmZyb21Ob2RlOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwYXJlbnQgaW4gcGFyZW50Tm9kZXNMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gocGFyZW50Tm9kZXNMaXN0W3BhcmVudF0sIChjaGlsZE5vZGUpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGVzTGlzdFtwYXJlbnRdW1JFU09VUkNFX0lOU1RBTkNFX0xJU1RdID0gW107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZXNMaXN0W3BhcmVudF1bUkVTT1VSQ0VfSU5TVEFOQ0VfTElTVF0ucHVzaChtZXJnZUFsbFN1YnRyZWVzKGNoaWxkTm9kZSwgcGFyZW50Tm9kZXNMaXN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vYWRkIHRoZSByZXNvdXJjZUluc3RhbmNlTGlzdCBmb3IgdGhlIHNlcnZpY2Ugcm9vdCBub2RlCisgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcmVudCBpbiBwYXJlbnROb2Rlc0xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNvdXJjZUluc3RhbmNlTm9kZTpSZXNvdXJjZUluc3RhbmNlTm9kZSA9IHJlc291cmNlSW5zdGFuY2VNYXAuZ2V0VmFsdWUocGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSW5zdGFuY2VOb2RlLnJlc291cmNlSW5zdGFuY2VzTGlzdCA9IHBhcmVudE5vZGVzTGlzdFtwYXJlbnRdOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJbnN0YW5jZU5vZGUucmVzb3VyY2VJbnN0YW5jZXNMaXN0ID0gcGFyZW50Tm9kZXNMaXN0W3BhcmVudF1bUkVTT1VSQ0VfSU5TVEFOQ0VfTElTVF07CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUluc3RhbmNlTm9kZS5pc0FscmVhZHlJblRyZWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuc3RydWN0dXJlVHJlZS5zZXJ2aWNlUm9vdC5yZXNvdXJjZUluc3RhbmNlc0xpc3QucHVzaChyZXNvdXJjZUluc3RhbmNlTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIG5vZGUgdGhhdCBoYXZlIG5vIGNvbm5lY3Rpb24gdG8gdGhlIHJvb3ROb2RlCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSW5zdGFuY2VNYXAuZm9yRWFjaCgoa2V5OnN0cmluZywgdmFsdWU6UmVzb3VyY2VJbnN0YW5jZU5vZGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaXNBbHJlYWR5SW5UcmVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuc3RydWN0dXJlVHJlZS5zZXJ2aWNlUm9vdC5yZXNvdXJjZUluc3RhbmNlc0xpc3QucHVzaCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vdGhpcyByZWN1cnNpb24gaXMgbWVyZ2luZyBhbGwgdGhlIHN1YnRyZWVzCisgICAgICAgICAgICBsZXQgbWVyZ2VBbGxTdWJ0cmVlcyA9IChjb25uZWN0aW9uRGF0YTphbnksIHBhcmVudE5vZGVzTGlzdDphbnkpOlJlc291cmNlSW5zdGFuY2VOb2RlID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcmVzb3VyY2VJbnN0YW5jZU5vZGU6UmVzb3VyY2VJbnN0YW5jZU5vZGUgPSByZXNvdXJjZUluc3RhbmNlTWFwLmdldFZhbHVlKGNvbm5lY3Rpb25EYXRhLnRvTm9kZSk7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VJbnN0YW5jZU5vZGUuaXNBbHJlYWR5SW5UcmVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZXNMaXN0W3Jlc291cmNlSW5zdGFuY2VOb2RlLmlkXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZXNMaXN0W3Jlc291cmNlSW5zdGFuY2VOb2RlLmlkXVtSRVNPVVJDRV9JTlNUQU5DRV9MSVNUXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJbnN0YW5jZU5vZGUucmVzb3VyY2VJbnN0YW5jZXNMaXN0ID0gcGFyZW50Tm9kZXNMaXN0W3Jlc291cmNlSW5zdGFuY2VOb2RlLmlkXVtSRVNPVVJDRV9JTlNUQU5DRV9MSVNUXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChwYXJlbnROb2Rlc0xpc3RbcmVzb3VyY2VJbnN0YW5jZU5vZGUuaWRdLCAoY2hpbGRyZW4pPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSW5zdGFuY2VOb2RlLnJlc291cmNlSW5zdGFuY2VzTGlzdC5wdXNoKG1lcmdlQWxsU3VidHJlZXMoY2hpbGRyZW4sIHBhcmVudE5vZGVzTGlzdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBhcmVudE5vZGVzTGlzdFtyZXNvdXJjZUluc3RhbmNlTm9kZS5pZF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUluc3RhbmNlTm9kZTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyoqKioqKioqKioqKiogRW5kIEJ1aWxkaW5nIFRyZWUgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKiovLworCisgICAgICAgICAgICAvLyoqKioqKioqKioqKiogU3RhcnQgV2F0Y2hlcnMgKioqKioqKioqKioqKioqKioqKi8vCisgICAgICAgICAgICBzY29wZS4kd2F0Y2goJ2NvbXBvbmVudC5uYW1lJywgKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnN0cnVjdHVyZVRyZWUpCisgICAgICAgICAgICAgICAgICAgIHNjb3BlLnN0cnVjdHVyZVRyZWUuc2VydmljZVJvb3QubmFtZSA9IHNjb3BlLmNvbXBvbmVudC5uYW1lOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgnY29tcG9uZW50Lmljb24nLCAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuc3RydWN0dXJlVHJlZSkKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuc3RydWN0dXJlVHJlZS5zZXJ2aWNlUm9vdC5pY29uID0gc2NvcGUuY29tcG9uZW50Lmljb247CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucycsICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGJ1aWxkVHJlZSgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2NvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMnLCAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBidWlsZFRyZWUoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyoqKioqKioqKioqKiogRW5kICBXYXRjaGVycyAqKioqKioqKioqKioqKioqKioqLy8KKworICAgICAgICAgICAgYnVpbGRUcmVlKCk7CisKKyAgICAgICAgfTsKKworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpID0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlVHJlZURpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSk7CisgICAgICAgIH07CisgICAgfQorCisgICAgU3RydWN0dXJlVHJlZURpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJ107CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90YWcvdGFnLWRpcmVjdGl2ZS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3RhZy90YWctZGlyZWN0aXZlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjMjJhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90YWcvdGFnLWRpcmVjdGl2ZS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxkaXYgY2xhc3M9InNkYy10YWciPgorICAgIDxkaXYgY2xhc3M9InRhZyIgZGF0YS10ZXN0cy1pZD0iaS1zZGMtdGFnLXRleHQiIHNkYy1zbWFydC10b29sdGlwIGRhdGEtbmctYmluZD0idGFnRGF0YS50YWciPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImNhdGVnb3J5IiBkYXRhLW5nLWhpZGU9ImhpZGVUb29sdGlwPT09dHJ1ZSI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJyZWxhdGlvbi1jYXRlZ290eS1pY29uIiBkYXRhLXRvb2x0aXBzIGRhdGEtdG9vbHRpcC1zaWRlPSJib3R0b20iIGRhdGEtdG9vbHRpcD0iJzxzcGFuIGNsYXNzPSd0YWctdG9vbHRpcC13cmFwJz57e3RhZ0RhdGEudG9vbHRpcH19PC9zcGFuPiciIGRhdGEtdG9vbHRpcC1lbmFibGU9ImZhbHNlIj48L3NwYW4+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJkZWxldGUiIGRhdGEtbmctaWY9IiFoaWRlRGVsZXRlICYmICFzZGNEaXNhYmxlIiBkYXRhLW5nLWNsaWNrPSJkZWxldGUoKSIgZGF0YS10ZXN0cy1pZD0iaS1zZGMtdGFnLWRlbGV0ZSI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJkZWxldGUtaWNvbiI+PC9zcGFuPgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdGFnL3RhZy1kaXJlY3RpdmUubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90YWcvdGFnLWRpcmVjdGl2ZS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MmUzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdGFnL3RhZy1kaXJlY3RpdmUubGVzcwpAQCAtMCwwICsxLDUxIEBACisuc2RjLXRhZ3sKKworICAgIGJhY2tncm91bmQtY29sb3I6I0YyRjJGMiA7CisgICAgLmJvcmRlci1yYWRpdXMoNHB4KTsKKyAgICBtaW4td2lkdGg6MTUwcHg7CisgICAgaGVpZ2h0OjMwcHg7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIHBhZGRpbmc6IDAgMTBweDsKKyAgICBtYXJnaW46IDJweDsKKworICAgIC50YWd7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB9CisKKyAgICAuY2F0ZWdvcnl7CisgICAgICAgIG1hcmdpbi1yaWdodDogNHB4OworICAgICAgICBtYXJnaW4tbGVmdDogMjVweDsKKyAgICAgICAgd2lkdGg6IDI1cHg7CisKKyAgICB9CisgICAgLnJlbGF0aW9uLWNhdGVnb3R5LWljb257CisgICAgICAgIC5zcHJpdGU7CisgICAgICAgIC5zcHJpdGUucmVsYXRpb24taWNvbjsKKyAgICAgICAgLmhhbmQ7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisKKyAgICB9CisKKyAgICAucmVsYXRpb24tY2F0ZWdvdHktaWNvbjpob3ZlcnsKKyAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgLnNwcml0ZS5yZWxhdGlvbi1pY29uLWhvdmVyOworICAgIH0KKworICAgIC5kZWxldGV7CisKKyAgICB9CisgICAgLmRlbGV0ZS1pY29ueworICAgICAgICAuc3ByaXRlOworICAgICAgICAuc3ByaXRlLngtYnRuLWJsYWNrOworICAgICAgICAuaGFuZDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICB9Cit9CisKKy50YWctdG9vbHRpcC13cmFwIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDgwLCA5OSwgMTEzLCAwLjkpOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgbWFyZ2luOiAtNXB4IC0xNHB4IDBweCAtMTRweDsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90YWcvdGFnLWRpcmVjdGl2ZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90YWcvdGFnLWRpcmVjdGl2ZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQyNDVlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3RhZy90YWctZGlyZWN0aXZlLnRzCkBAIC0wLDAgKzEsNzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBUYWdEYXRhIHsKKyAgICAgICAgdGFnOnN0cmluZzsKKyAgICAgICAgdG9vbHRpcDpzdHJpbmc7CisgICAgICAgIGlkOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJVGFnU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICB0YWdEYXRhOiBUYWdEYXRhOworICAgICAgICBvbkRlbGV0ZTogRnVuY3Rpb247CisgICAgICAgIGRlbGV0ZTpGdW5jdGlvbjsKKyAgICAgICAgaGlkZVRvb2x0aXA6Ym9vbGVhbjsKKyAgICAgICAgaGlkZURlbGV0ZTpib29sZWFuOworICAgICAgICBzZGNEaXNhYmxlOiBib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBUYWdEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSkgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICB0YWdEYXRhOiAnPScsCisgICAgICAgICAgICBvbkRlbGV0ZTogJyYnLAorICAgICAgICAgICAgaGlkZVRvb2x0aXA6ICc9JywKKyAgICAgICAgICAgIGhpZGVEZWxldGU6ICc9JywKKyAgICAgICAgICAgIHNkY0Rpc2FibGU6ICc9JworICAgICAgICB9OworCisgICAgICAgIHJlcGxhY2UgPSB0cnVlOworICAgICAgICByZXN0cmljdCA9ICdFQSc7CisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdGFnL3RhZy1kaXJlY3RpdmUuaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SVRhZ1Njb3BlKSA9PiB7CisgICAgICAgICAgICBzY29wZS5kZWxldGUgPSAoKT0+eworICAgICAgICAgICAgICAgIHNjb3BlLm9uRGVsZXRlKHsndW5pcXVlSWQnOnNjb3BlLnRhZ0RhdGEuaWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGFnRGlyZWN0aXZlKCR0ZW1wbGF0ZUNhY2hlKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIFRhZ0RpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvaW1hZ2UtdGVtcGxhdGUuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90dXRvcmlhbC9pbWFnZS10ZW1wbGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2Y3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvaW1hZ2UtdGVtcGxhdGUuaHRtbApAQCAtMCwwICsxLDcgQEAKKzxwZXJmZWN0LXNjcm9sbGJhciBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzZGMtdHV0b3JpYWwtY29udGFpbmVyLWNvbnRlbnQgc2RjLXR1dG9yaWFsLWltYWdlLXRlbXBsYXRlIj4KKyAgICA8ZGl2IGNsYXNzPSJ7e3BhZ2VPYmplY3QuZGF0YS5pbWFnZUNsYXNzfX0iPjwvZGl2PgorICAgIDxkaXYgY2xhc3M9InNkYy10dXRvcmlhbC1pbWFnZS10ZW1wbGF0ZS10ZXh0Ij4KKyAgICAgICAgPGgxIHRyYW5zbGF0ZT0ie3twYWdlT2JqZWN0LmRhdGEudGl0bGV9fSI+PC9oMT4KKyAgICAgICAgPHAgY2xhc3M9InNkYy13ZWxjb21lLXBhZ2UtZGVzY3JpcHRpb24yIiB0cmFuc2xhdGU9Int7cGFnZU9iamVjdC5kYXRhLmRlc2NyaXB0aW9ufX0iPjwvcD4KKyAgICA8L2Rpdj4KKzwvcGVyZmVjdC1zY3JvbGxiYXI+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvdGV4dC10ZW1wbGF0ZS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3R1dG9yaWFsL3RleHQtdGVtcGxhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzExNzNiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3R1dG9yaWFsL3RleHQtdGVtcGxhdGUuaHRtbApAQCAtMCwwICsxLDQgQEAKKzxwZXJmZWN0LXNjcm9sbGJhciBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzZGMtdHV0b3JpYWwtY29udGFpbmVyLWNvbnRlbnQgc2RjLXR1dG9yaWFsLXRleHQtdGVtcGxhdGUiPgorICAgIDxoMSB0cmFuc2xhdGU9Int7cGFnZU9iamVjdC5kYXRhLnRpdGxlfX0iPjwvaDE+CisgICAgPHAgY2xhc3M9InNkYy13ZWxjb21lLXBhZ2UtZGVzY3JpcHRpb24yIiB0cmFuc2xhdGU9Int7cGFnZU9iamVjdC5kYXRhLmRlc2NyaXB0aW9ufX0iPjwvcD4KKzwvcGVyZmVjdC1zY3JvbGxiYXI+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvdHV0b3JpYWwtZGlyZWN0aXZlLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvdHV0b3JpYWwtZGlyZWN0aXZlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxNzUyZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90dXRvcmlhbC90dXRvcmlhbC1kaXJlY3RpdmUuaHRtbApAQCAtMCwwICsxLDIyIEBACis8ZGl2IGNsYXNzPSJzZGMtdHV0b3JpYWwtcGFnZSIgZGF0YS1uZy1pZj0ic2hvd1R1dG9yaWFsIj4KKyAgICA8ZGl2IGNsYXNzPSJzZGMtdHV0b3JpYWwtY29udGFpbmVyLXdyYXBwZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtdHV0b3JpYWwtc2tpcCIgdHJhbnNsYXRlPSJ7e2lzRmlyc3RUaW1lPydUVVRSSUFMX0dFTkVSQUxfU0tJUF9CVVRUT04nOidUVVRSSUFMX0dFTkVSQUxfQ0xPU0VfQlVUVE9OJ319IiBkYXRhLW5nLWNsaWNrPSJjbG9zZVR1dG9yaWFsKCkiPjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtdHV0b3JpYWwtY29udGFpbmVyIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy10dXRvcmlhbC1jb250YWluZXItdGFicyI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXR1dG9yaWFsLWNvbnRhaW5lci10YWIiIGRhdGEtbmctcmVwZWF0PSJ0YWIgaW4gdGFicyIgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZCc6IHRhYi5pZD09PXBhZ2VPYmplY3QudGFifSI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT0ie3t0YWIubmFtZX19IiBkYXRhLW5nLWNsaWNrPSJpbml0UGFnZSh0YWIuZGVmYXVsdFBhZ2UpIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxuZy1pbmNsdWRlIHNyYz0idGVtcGxhdGVVcmwiPjwvbmctaW5jbHVkZT4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXR1dG9yaWFsLWZvb3RlciI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtdHV0b3JpYWwtZm9vdGVyLXByZXYtYnV0dG9uIj48c3BhbiBkYXRhLW5nLXNob3c9Imhhc1ByZXZpb3VzKCkiIHRyYW5zbGF0ZT0iVFVUUklBTF9HRU5FUkFMX1BSRVZJT1VTX0JVVFRPTiIgZGF0YS1uZy1jbGljaz0icHJldmlvdXMoKSI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXR1dG9yaWFsLWZvb3Rlci1wYWdlLWNvdW50ZXIiPjxzcGFuIGNsYXNzPSJzZWxlY3RlZCIgZGF0YS1uZy1iaW5kPSJjdXJyZW50UGFnZUluZGV4KzEiPjwvc3Bhbj4vPHNwYW4gY2xhc3M9InRvdGFsIiBkYXRhLW5nLWJpbmQ9InRvdGFsUGFnZXMiPjwvc3Bhbj48L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy10dXRvcmlhbC1mb290ZXItbmV4dC1idXR0b24iPgorICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctaWY9Imhhc05leHQoKSIgdHJhbnNsYXRlPSJUVVRSSUFMX0dFTkVSQUxfTkVYVF9CVVRUT04iIGRhdGEtbmctY2xpY2s9Im5leHQoKSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctaWY9IihjdXJyZW50UGFnZUluZGV4KzEpID09PSB0b3RhbFBhZ2VzIiB0cmFuc2xhdGU9IlRVVFJJQUxfR0VORVJBTF9ORVhUX0JVVFRPTl9FTkQiIGRhdGEtbmctY2xpY2s9ImNsb3NlQW5kU2hvd0xhc3RQYWdlKCkiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3R1dG9yaWFsL3R1dG9yaWFsLWRpcmVjdGl2ZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3R1dG9yaWFsL3R1dG9yaWFsLWRpcmVjdGl2ZS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvdHV0b3JpYWwtZGlyZWN0aXZlLmxlc3MKQEAgLTAsMCArMSwyMTMgQEAKKy5zZGMtdHV0b3JpYWwtcGFnZSB7CisKKyAgICB3aWR0aDogMTAwJTsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjgpOworCisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsKKyAgICB6LWluZGV4OiAzMDAwOworCisgICAgLnNkYy10dXRvcmlhbC1jb250YWluZXItd3JhcHBlciB7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgICAgfQorCisgICAgLnNkYy10dXRvcmlhbC1jb250YWluZXIgeworICAgICAgICAuYmdfYzsKKyAgICAgICAgd2lkdGg6IDgzMHB4OworICAgICAgICBoZWlnaHQ6IDQ2NnB4OworICAgICAgICBib3gtc2hhZG93OiAxcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKKyAgICB9CisKKyAgICAuc2RjLXR1dG9yaWFsLWNvbnRhaW5lci10YWJzIHsKKyAgICAgICAgaGVpZ2h0OiA1NnB4OworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OworICAgIH0KKworICAgIC5zZGMtdHV0b3JpYWwtY29udGFpbmVyLXRhYiB7CisgICAgICAgIC5hXzY7CisgICAgICAgIGZsZXgtZ3JvdzogMTsKKyAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGhlaWdodDogNTZweDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBvcGFjaXR5OiAwLjg7CisKKyAgICAgICAgc3BhbiB7CisgICAgICAgICAgICAuaGFuZDsKKyAgICAgICAgfQorCisgICAgICAgICY6OmFmdGVyIHsKKyAgICAgICAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCA7CisgICAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoNTksIDEyMywgMTU1LCAwLjMxKTsKKyAgICAgICAgICAgIGhlaWdodDogMjhweDsKKyAgICAgICAgICAgIHJpZ2h0OiAwOworICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgdG9wOiAxNHB4OyAvLyg1Ni0yOCkvMgorICAgICAgICAgICAgd2lkdGg6IDFweDsKKyAgICAgICAgfQorCisgICAgICAgICY6bGFzdC1jaGlsZDphZnRlciB7CisgICAgICAgICAgICBkaXNwbGF5OiBub25lOworICAgICAgICB9CisKKyAgICAgICAgJi5zZWxlY3RlZCB7CisgICAgICAgICAgICBvcGFjaXR5OiAxOworICAgICAgICAgICAgLmJvbGQ7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC5zZGMtdHV0b3JpYWwtY29udGFpbmVyLWNvbnRlbnQgeworICAgICAgICAuYmdfYTsKKyAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgICAgICBoZWlnaHQ6IDQxMHB4OworICAgIH0KKworICAgIC5zZGMtdHV0b3JpYWwtc2tpcCB7CisgICAgICAgIC5jXzE7CisgICAgICAgIC5oYW5kOworICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogOXB4OworICAgIH0KKworICAgIC5zZGMtdHV0b3JpYWwtZm9vdGVyIHsKKyAgICAgICAgLmNfNDsKKyAgICAgICAgbWFyZ2luLXRvcDogOXB4OworCisgICAgICAgIC5zZGMtdHV0b3JpYWwtZm9vdGVyLXByZXYtYnV0dG9uIHsKKyAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxNHB4OworICAgICAgICAgICAgLm5vc2VsZWN0OworCisgICAgICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgICAgICAuaGFuZDsKKyAgICAgICAgICAgICAgICAmOjpiZWZvcmUgeworICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAnPCc7CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7CisgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuc2RjLXR1dG9yaWFsLWZvb3Rlci1wYWdlLWNvdW50ZXIgeworICAgICAgICAgICAgLmVfMzsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIGxlZnQ6IDUwJTsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDJweDsKKyAgICAgICAgICAgIGN1cnNvcjogZGVmYXVsdDsKKyAgICAgICAgICAgIC5ub3NlbGVjdDsKKworICAgICAgICAgICAgLnNlbGVjdGVkIHsKKyAgICAgICAgICAgICAgICAuY18zOworICAgICAgICAgICAgICAgIC5ib2xkOworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMnB4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAudG90YWwgeworICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuc2RjLXR1dG9yaWFsLWZvb3Rlci1uZXh0LWJ1dHRvbiB7CisgICAgICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNHB4OworICAgICAgICAgICAgLm5vc2VsZWN0OworCisgICAgICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgICAgICAuaGFuZDsKKworICAgICAgICAgICAgICAgICY6OmFmdGVyIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudDogJz4nOworICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgICAgICAgICByaWdodDogMDsKKyAgICAgICAgICAgICAgICAgICAgdG9wOiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vIFRFWFQgVEVNUExBVEUKKy5zZGMtdHV0b3JpYWwtdGV4dC10ZW1wbGF0ZSB7CisKKyAgICBwYWRkaW5nOiAyMHB4IDY1cHg7CisKKyAgICBoMSB7CisgICAgICAgIC5jXzE1OworICAgICAgICBtYXJnaW4tdG9wOiAwOworICAgIH0KKworICAgIHAgeworICAgICAgICAuY18xMDsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vIElNQUdFIFRFTVBMQVRFCisuc2RjLXR1dG9yaWFsLWltYWdlLXRlbXBsYXRlIHsKKworICAgIC5zZGMtdHV0b3JpYWwtaW1hZ2UtdGVtcGxhdGUtdGV4dCB7CisgICAgICAgIHBhZGRpbmc6IDE2cHggMzhweDsKKyAgICAgICAgaGVpZ2h0OiAxMThweDsKKyAgICAgICAgaDEgeworICAgICAgICAgICAgLmNfMTE7CisgICAgICAgICAgICBtYXJnaW46IDAgMCA0cHggMDsKKyAgICAgICAgfQorCisgICAgICAgIHAgeworICAgICAgICAgICAgLmNfNDsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogMjFweDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTItaW1hZ2UgIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIucG5nJykgbm8tcmVwZWF0IDAgMDsgd2lkdGg6IDgzMHB4OyBoZWlnaHQ6IDI5MnB4O30KKyAgICAuc2RjLXR1dG9yaWFsLXBhZ2UtMy1pbWFnZSAgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoJy4uLy4uLy4uL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvMy5wbmcnKSBuby1yZXBlYXQgMCAwOyB3aWR0aDogODMwcHg7IGhlaWdodDogMjkycHg7fQorICAgIC5zZGMtdHV0b3JpYWwtcGFnZS00LWltYWdlICB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy90dXRvcmlhbC80LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTUtaW1hZ2UgIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzUucG5nJykgbm8tcmVwZWF0IDAgMDsgd2lkdGg6IDgzMHB4OyBoZWlnaHQ6IDI5MnB4O30KKyAgICAuc2RjLXR1dG9yaWFsLXBhZ2UtNi1pbWFnZSAgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoJy4uLy4uLy4uL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNi5wbmcnKSBuby1yZXBlYXQgMCAwOyB3aWR0aDogODMwcHg7IGhlaWdodDogMjkycHg7fQorICAgIC5zZGMtdHV0b3JpYWwtcGFnZS03LWltYWdlICB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy90dXRvcmlhbC83LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTgtaW1hZ2UgIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzgucG5nJykgbm8tcmVwZWF0IDAgMDsgd2lkdGg6IDgzMHB4OyBoZWlnaHQ6IDI5MnB4O30KKworICAgIC5zZGMtdHV0b3JpYWwtcGFnZS0xMC1pbWFnZSB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMC5wbmcnKSBuby1yZXBlYXQgMCAwOyB3aWR0aDogODMwcHg7IGhlaWdodDogMjkycHg7fQorICAgIC5zZGMtdHV0b3JpYWwtcGFnZS0xMS1pbWFnZSB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMS5wbmcnKSBuby1yZXBlYXQgMCAwOyB3aWR0aDogODMwcHg7IGhlaWdodDogMjkycHg7fQorCisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTEzLWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzEzLnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTE0LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE0LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTE1LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE1LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTE2LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE2LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTE3LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE3LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTE4LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE4LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTE5LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE5LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTIwLWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIwLnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTIxLWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIxLnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTIyLWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIyLnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTIzLWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIzLnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTI0LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI0LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTI1LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI1LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTI2LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI2LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTI3LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI3LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTI4LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI4LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTI5LWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI5LnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisgICAgLnNkYy10dXRvcmlhbC1wYWdlLTMwLWltYWdlIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzMwLnBuZycpIG5vLXJlcGVhdCAwIDA7IHdpZHRoOiA4MzBweDsgaGVpZ2h0OiAyOTJweDt9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90dXRvcmlhbC90dXRvcmlhbC1kaXJlY3RpdmUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvdHV0b3JpYWwtZGlyZWN0aXZlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjM1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvdHV0b3JpYWwtZGlyZWN0aXZlLnRzCkBAIC0wLDAgKzEsMTQ3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgZXhwb3J0IGludGVyZmFjZSBJVHV0b3JpYWxTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIHNob3dUdXRvcmlhbDpib29sZWFuOworICAgICAgICBpc0ZpcnN0VGltZTpib29sZWFuOworICAgICAgICB0ZW1wbGF0ZVVybDpzdHJpbmc7CisgICAgICAgIHRvdGFsUGFnZXM6IG51bWJlcjsKKyAgICAgICAgY3VycmVudFBhZ2VJbmRleDogbnVtYmVyOworICAgICAgICBwYWdlOm51bWJlcjsKKyAgICAgICAgdGFiczpBcnJheTxzdHJpbmc+OworICAgICAgICB0dXRvcmlhbERhdGE6YW55OworICAgICAgICBwYWdlT2JqZWN0OmFueTsKKworICAgICAgICBpbml0UGFnZTpGdW5jdGlvbjsKKyAgICAgICAgbmV4dDpGdW5jdGlvbjsKKyAgICAgICAgcHJldmlvdXM6RnVuY3Rpb247CisgICAgICAgIGhhc05leHQoKTpib29sZWFuOworICAgICAgICBoYXNQcmV2aW91cygpOmJvb2xlYW47CisgICAgICAgIGNsb3NlVHV0b3JpYWw6RnVuY3Rpb247CisgICAgICAgIGNsb3NlQW5kU2hvd0xhc3RQYWdlOkZ1bmN0aW9uOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBUdXRvcmlhbERpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgcHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlCisgICAgICAgICkgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBwYWdlOiAnPScsCisgICAgICAgICAgICBzaG93VHV0b3JpYWw6ICc9JywKKyAgICAgICAgICAgIGlzRmlyc3RUaW1lOiAnPScKKyAgICAgICAgfTsKKworICAgICAgICByZXBsYWNlID0gZmFsc2U7CisgICAgICAgIHJlc3RyaWN0ID0gJ0VBJzsKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy90dXRvcmlhbC90dXRvcmlhbC1kaXJlY3RpdmUuaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SVR1dG9yaWFsU2NvcGUsICRlbGVtOmFueSkgPT4geworCisgICAgICAgICAgICBsZXQgZmluZFBhZ2VJbmRleDpGdW5jdGlvbiA9IChwYWdlSWQ6bnVtYmVyKTpudW1iZXI9PiB7CisgICAgICAgICAgICAgICAgZm9yIChsZXQgaTpudW1iZXI9MDtpPHNjb3BlLnRvdGFsUGFnZXM7aSsrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnR1dG9yaWFsRGF0YS5wYWdlc1tpXS5pZD09PXBhZ2VJZCl7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBzaG93Q3VycmVudFBhZ2U6RnVuY3Rpb24gPSAoKTp2b2lkPT4geworICAgICAgICAgICAgICAgIHNjb3BlLnBhZ2VPYmplY3QgPSBzY29wZS50dXRvcmlhbERhdGEucGFnZXNbc2NvcGUuY3VycmVudFBhZ2VJbmRleF07CisgICAgICAgICAgICAgICAgc2NvcGUudGVtcGxhdGVVcmwgPSAnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvJyArIHNjb3BlLnBhZ2VPYmplY3QudGVtcGxhdGUgKyAnLmh0bWwnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS50dXRvcmlhbERhdGEgPSB0aGlzLnNkY0NvbmZpZy50dXRvcmlhbDsKKworICAgICAgICAgICAgc2NvcGUuY2xvc2VUdXRvcmlhbCA9ICgpPT4geworICAgICAgICAgICAgICAgIHNjb3BlLnNob3dUdXRvcmlhbCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmKHNjb3BlLmlzRmlyc3RUaW1lKXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuaXNGaXJzdFRpbWU9ZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5jbG9zZUFuZFNob3dMYXN0UGFnZSA9ICgpPT4geworICAgICAgICAgICAgICAgIGlmKHNjb3BlLmlzRmlyc3RUaW1lKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oJ2Rhc2hib2FyZC50dXRvcmlhbC1lbmQnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2NvcGUuY2xvc2VUdXRvcmlhbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgaW5pdDpGdW5jdGlvbiA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLnRhYnMgPSBzY29wZS50dXRvcmlhbERhdGEudGFiczsKKyAgICAgICAgICAgICAgICBzY29wZS50b3RhbFBhZ2VzID0gc2NvcGUudHV0b3JpYWxEYXRhLnBhZ2VzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBzY29wZS5pbml0UGFnZShzY29wZS5wYWdlKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5pbml0UGFnZSA9IChwYWdlSWQpID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5jdXJyZW50UGFnZUluZGV4ID0gZmluZFBhZ2VJbmRleChwYWdlSWQpOworICAgICAgICAgICAgICAgIHNob3dDdXJyZW50UGFnZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5uZXh0ID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmhhc05leHQoKSl7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmN1cnJlbnRQYWdlSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgc2hvd0N1cnJlbnRQYWdlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5wcmV2aW91cyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChzY29wZS5oYXNQcmV2aW91cygpKXsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuY3VycmVudFBhZ2VJbmRleC0tOworICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudFBhZ2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNjb3BlLmhhc05leHQgPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNjb3BlLmN1cnJlbnRQYWdlSW5kZXgrMSkgPCBzY29wZS50b3RhbFBhZ2VzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY29wZS5oYXNQcmV2aW91cyA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBzY29wZS5jdXJyZW50UGFnZUluZGV4PjA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBzY29wZS4kd2F0Y2goJ3Nob3dUdXRvcmlhbCcsIChzaG93VHV0b3JpYWw6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5pbml0UGFnZShzY29wZS5wYWdlKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwgJHN0YXRlOm5nLnVpLklTdGF0ZVNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXRvcmlhbERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSwgc2RjQ29uZmlnLCAkc3RhdGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgVHV0b3JpYWxEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZScsICdzZGNDb25maWcnLCAnJHN0YXRlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXNlci1oZWFkZXItZGV0YWlscy91c2VyLWhlYWRlci1kZXRhaWxzLWRpcmVjdGl2ZS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3VzZXItaGVhZGVyLWRldGFpbHMvdXNlci1oZWFkZXItZGV0YWlscy1kaXJlY3RpdmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzk5YTE4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3VzZXItaGVhZGVyLWRldGFpbHMvdXNlci1oZWFkZXItZGV0YWlscy1kaXJlY3RpdmUuaHRtbApAQCAtMCwwICsxLDkgQEAKKzxkaXYgY2xhc3M9Inctc2RjLWhlYWRlci11c2VyLWNvbnRhaW5lciIgZGF0YS10ZXN0cy1pZD0iZmZmZiI+CisgICAgPGRpdiBjbGFzcz0idy1zZGMtaGVhZGVyLXVzZXItaWNvbiI+PC9kaXY+CisgICAgPGRpdiBjbGFzcz0idy1zZGMtaGVhZGVyLXVzZXItZGV0YWlscyI+CisgICAgICAgIDxkaXYgc2RjLXNtYXJ0LXRvb2x0aXAgY2xhc3M9Inctc2RjLWhlYWRlci11c2VyLW5hbWUiIGRhdGEtbmctYmluZD0idXNlci5nZXROYW1lKCkiPjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1oZWFkZXItdXNlci1yb2xlIiBkYXRhLW5nLWJpbmQ9InVzZXIuZ2V0Um9sZVRvVmlldygpIj48L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtaGVhZGVyLXVzZXItbGFzdC1sb2dpbiIgZGF0YS1uZy1zaG93PSJ1c2VyLmdldExhc3RMb2dpbigpIT09JyciPkxhc3QgTG9naW46IHt7dXNlci5nZXRMYXN0TG9naW4oKSB8IGRhdGU6ICdNTU0gZGQgJm5ic3A7IGhoOm1tIGEnIDogJ1VUQyd9fSZuYnNwO1VUQzwvZGl2PgorICAgIDwvZGl2PgorICAgIDwhLS08ZGl2IGNsYXNzPSJ3LXNkYy1oZWFkZXItbG9nb3V0LWljb24iPjwvZGl2Pi0tPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXNlci1oZWFkZXItZGV0YWlscy91c2VyLWhlYWRlci1kZXRhaWxzLWRpcmVjdGl2ZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3VzZXItaGVhZGVyLWRldGFpbHMvdXNlci1oZWFkZXItZGV0YWlscy1kaXJlY3RpdmUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRkYjdjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3VzZXItaGVhZGVyLWRldGFpbHMvdXNlci1oZWFkZXItZGV0YWlscy1kaXJlY3RpdmUubGVzcwpAQCAtMCwwICsxLDYyIEBACisudy1zZGMtaGVhZGVyLXVzZXItY29udGFpbmVyIHsKKyAgICAuYl83OworICAgIHdpZHRoOiA0MDBweDsKKyAgICAuZmxleC1maXhlZCg0MDBweCk7CisgICAgcGFkZGluZzogMCAyM3B4OworICAgIGRpc3BsYXk6IGZsZXg7CisgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKK30KKworLnctc2RjLWhlYWRlci11c2VyLWljb24geworICAgIGJhY2tncm91bmQ6IG5vLXJlcGVhdCB1cmwoJy4uLy4uLy4uL3N0eWxlcy9pbWFnZXMvYW5vbnltb3VzLmpwZycpOworICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgICBoZWlnaHQ6IDQ3cHg7CisgICAgd2lkdGg6IDQ3cHg7CisgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKKyAgICBib3JkZXI6IHNvbGlkIDJweCBAY29sb3JfbTsKKyAgICAuZmxleC1maXhlZCg0N3B4KTsKK30KKworLnctc2RjLWhlYWRlci11c2VyLWRldGFpbHMgeworICAgIHBhZGRpbmc6IDRweCA0cHggNHB4IDE0cHg7CisgICAgLnZjZW50ZXI7Cit9CisKKy53LXNkYy1oZWFkZXItdXNlci1uYW1lIHsKKyAgICBtYXgtd2lkdGg6IDE2MHB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworCisgICAgLmJvbGQ7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworfQorCisudy1zZGMtaGVhZGVyLXVzZXItcm9sZSB7CisgICAgLmJvbGQ7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIG1hcmdpbi1sZWZ0OiA2cHg7CisKKyAgICAmOmJlZm9yZSB7CisgICAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAY29sb3JfbTsKKyAgICB9Cit9CisKKy53LXNkYy1oZWFkZXItdXNlci1sYXN0LWxvZ2luIHsKKyAgICAuZm9udC10eXBlLl8zOworICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisudy1zZGMtaGVhZGVyLWxvZ291dC1pY29uIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQklBQUFBVUNBWUFBQUNBbDIxS0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURFMElEYzVMakUxTmpjNU55d2dNakF4TkM4d09DOHlNQzB3T1RvMU16b3dNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UUWdLRmRwYm1SdmQzTXBJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPakU1UmpneE0wUXhNRGd6UVRFeFJUVkJRekEyT1RnNU9EbEZORFZCTlRaRElpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09qRTVSamd4TTBReU1EZ3pRVEV4UlRWQlF6QTJPVGc1T0RsRk5EVkJOVFpESWo0Z1BIaHRjRTFOT2tSbGNtbDJaV1JHY205dElITjBVbVZtT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk1UbEdPREV6UTBZd09ETkJNVEZGTlVGRE1EWTVPRGs0T1VVME5VRTFOa01pSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TVRsR09ERXpSREF3T0ROQk1URkZOVUZETURZNU9EazRPVVUwTlVFMU5rTWlMejRnUEM5eVpHWTZSR1Z6WTNKcGNIUnBiMjQrSUR3dmNtUm1PbEpFUmo0Z1BDOTRPbmh0Y0cxbGRHRStJRHcvZUhCaFkydGxkQ0JsYm1ROUluSWlQejZSaXExYkFBQUEyMGxFUVZSNDJtSjBDVXYrejBBYStBdkVlcnRYenJtR0xNZ0NwWmNEOFM0aURmb0R4SGZRQldFR25RTGFzSUNCQXNERVFDVXdjQWE1aHFlRUFIRUtOVnlrQjhTemdZWlZVR3BRUFJEUEFPSjJvR0hOWkJzRWpGMVF1c3NDNG1sQVhBTTByQU01K3RIRHdRSklWUkJoN20wZ0xnZXFsNlphckxIZ2NQNEpJQldBSitZWWdkUVVJUFlINGs2ZytncHlvcDhSR2o2Z2NHb0dHWUxUUlFSQUl4Qm5BSEVsMEpBT3ZGNGpBQzRCY1NyUWtEa0V3NGhBOUs4Wkdwa1c1alV6WUd3a2tGQ3dyUUo2OFJjMmd5S2htTmlpOWh3UW94UzFBQUVHQU81UFAvK0NsSURBQUFBQUFFbEZUa1N1UW1DQycpOworICAgIGhlaWdodDogMjBweDsKKyAgICB3aWR0aDogMThweDsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgcmlnaHQ6IDIwcHg7CisgICAgdG9wOiAyOXB4OworfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91c2VyLWhlYWRlci1kZXRhaWxzL3VzZXItaGVhZGVyLWRldGFpbHMtZGlyZWN0aXZlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3VzZXItaGVhZGVyLWRldGFpbHMvdXNlci1oZWFkZXItZGV0YWlscy1kaXJlY3RpdmUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjNDNhMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91c2VyLWhlYWRlci1kZXRhaWxzL3VzZXItaGVhZGVyLWRldGFpbHMtZGlyZWN0aXZlLnRzCkBAIC0wLDAgKzEsNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBleHBvcnQgaW50ZXJmYWNlIElVc2VySGVhZGVyRGV0YWlsc1Njb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgbmFtZTogc3RyaW5nOworICAgICAgICByb2xlOiBzdHJpbmc7CisgICAgICAgIGljb25Vcmw6IHN0cmluZzsKKyAgICAgICAgVXNlclJlc291cmNlQ2xhc3M6U2VydmljZXMuSVVzZXJSZXNvdXJjZUNsYXNzOworICAgICAgICB1c2VyOiBNb2RlbHMuSVVzZXI7CisgICAgICAgIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb247CisgICAgICAgIGluaXRVc2VyOkZ1bmN0aW9uOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBVc2VySGVhZGVyRGV0YWlsc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCBwcml2YXRlICRodHRwOm5nLklIdHRwU2VydmljZSwgcHJpdmF0ZSBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uLCBwcml2YXRlIFVzZXJSZXNvdXJjZUNsYXNzOlNlcnZpY2VzLklVc2VyUmVzb3VyY2VDbGFzcykgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBpY29uVXJsOiAnPT8nCisgICAgICAgIH07CisKKyAgICAgICAgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHJlc3RyaWN0ID0gJ0UnOworICAgICAgICB0ZW1wbGF0ZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3VzZXItaGVhZGVyLWRldGFpbHMvdXNlci1oZWFkZXItZGV0YWlscy1kaXJlY3RpdmUuaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIGxpbmsgPSAoc2NvcGU6SVVzZXJIZWFkZXJEZXRhaWxzU2NvcGUpID0+IHsKKworICAgICAgICAgICAgc2NvcGUuaW5pdFVzZXIgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZGVmYXVsdFVzZXJJZDpzdHJpbmc7CisgICAgICAgICAgICAgICAgbGV0IHVzZXI6U2VydmljZXMuSVVzZXJSZXNvdXJjZSA9IHRoaXMuVXNlclJlc291cmNlQ2xhc3MuZ2V0TG9nZ2VkaW5Vc2VyKCk7CisgICAgICAgICAgICAgICAgaWYgKCF1c2VyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVc2VySWQgPSB0aGlzLiRodHRwLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uW3RoaXMuc2RjQ29uZmlnLmNvb2tpZS51c2VySWRTdWZmaXhdOworICAgICAgICAgICAgICAgICAgICB1c2VyID0gdGhpcy5Vc2VyUmVzb3VyY2VDbGFzcy5nZXQoe2lkOiBkZWZhdWx0VXNlcklkfSwgKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS51c2VyID0gbmV3IE1vZGVscy5Vc2VyKHVzZXIpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY29wZS51c2VyID0gbmV3IE1vZGVscy5Vc2VyKHVzZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzY29wZS5pbml0VXNlcigpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRodHRwOm5nLklIdHRwU2VydmljZSwgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwgVXNlclJlc291cmNlQ2xhc3M6U2VydmljZXMuSVVzZXJSZXNvdXJjZUNsYXNzKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVXNlckhlYWRlckRldGFpbHNEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUsICRodHRwLCBzZGNDb25maWcsIFVzZXJSZXNvdXJjZUNsYXNzKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIFVzZXJIZWFkZXJEZXRhaWxzRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCAnJGh0dHAnLCAnc2RjQ29uZmlnJywgJ1NkYy5TZXJ2aWNlcy5Vc2VyUmVzb3VyY2VTZXJ2aWNlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94L2V4cGFuZC1jb2xsYXBzLW1lbnUtYm94LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL2V4cGFuZC1jb2xsYXBzZS1tZW51LWJveC9leHBhbmQtY29sbGFwcy1tZW51LWJveC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzU2ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL2V4cGFuZC1jb2xsYXBzZS1tZW51LWJveC9leHBhbmQtY29sbGFwcy1tZW51LWJveC50cwpAQCAtMCwwICsxLDY2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgZXhwb3J0IGludGVyZmFjZSBJRXhwYW5kQ29sbGFwc2VNZW51Qm94RGlyZWN0aXZlU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBtZW51SXRlbXNHcm91cDogVXRpbHMuTWVudUl0ZW1Hcm91cDsKKyAgICAgICAgbWVudVRpdGxlOiBzdHJpbmc7CisgICAgICAgIHBhcmVudFNjb3BlOiBuZy5JU2NvcGU7CisgICAgICAgIG9uTWVudUl0ZW1DbGljayhtZW51SXRlbTogVXRpbHMuTWVudUl0ZW0pOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEV4cGFuZENvbGxhcHNlTWVudUJveERpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIG1lbnVUaXRsZTogJ0AnLAorICAgICAgICAgICAgbWVudUl0ZW1zR3JvdXA6ICc9JywKKyAgICAgICAgICAgIHBhcmVudFNjb3BlOiAnPScKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnQUUnOworICAgICAgICBwdWJsaWMgdHJhbnNjbHVkZSA9IHRydWU7CisKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UtbWVudS1ib3gvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94Lmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklFeHBhbmRDb2xsYXBzZU1lbnVCb3hEaXJlY3RpdmVTY29wZSwgJGVsZW06YW55KSA9PiB7CisgICAgICAgICAgICBzY29wZS5vbk1lbnVJdGVtQ2xpY2sgPSAobWVudUl0ZW06IFV0aWxzLk1lbnVJdGVtKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1lbnVJdGVtc0dyb3VwLnNlbGVjdGVkSW5kZXggPSBzY29wZS5tZW51SXRlbXNHcm91cC5tZW51SXRlbXMuaW5kZXhPZihtZW51SXRlbSk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoKTp2b2lkID0+IHt9OworICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudFNjb3BlW21lbnVJdGVtLmFjdGlvbl0obWVudUl0ZW0uc3RhdGUpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4cGFuZENvbGxhcHNlTWVudUJveERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSk7CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBFeHBhbmRDb2xsYXBzZU1lbnVCb3hEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL2V4cGFuZC1jb2xsYXBzZS1tZW51LWJveC9leHBhbmQtY29sbGFwc2UtbWVudS1ib3guaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UtbWVudS1ib3gvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkN2U1OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UtbWVudS1ib3gvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94Lmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPGRpdiBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94Ij4KKyAgICA8ZXhwYW5kLWNvbGxhcHNlIGV4cGFuZGVkLXNlbGVjdG9yPSIudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQiIGNsYXNzPSJleHBhbmQtY29sbGFwc2UtbWVudS1ib3gtdGl0bGUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmQtY29sbGFwc2UtbWVudS1ib3gtdGl0bGUtaWNvbiI+PC9kaXY+CisgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtdGV4dCIgZGF0YS1uZy1iaW5kPSJtZW51VGl0bGUiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3ttZW51VGl0bGV9fSI+PC9zcGFuPgorICAgIDwvZXhwYW5kLWNvbGxhcHNlPgorCisgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQiID4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSBleHBhbmQtY29sbGFwc2UtbWVudS1ib3gtaXRlbSIKKyAgICAgICAgICAgICBuZy1jbGFzcz0ieydzZWxlY3RlZCc6ICRpbmRleCA9PSBtZW51SXRlbXNHcm91cC5zZWxlY3RlZEluZGV4fSIgbmctcmVwZWF0PSIoa2V5LCBtZW51SXRlbSkgaW4gbWVudUl0ZW1zR3JvdXAubWVudUl0ZW1zIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmQtY29sbGFwc2UtbWVudS1ib3gtaXRlbS10ZXh0IiBuZy1jbGljaz0ib25NZW51SXRlbUNsaWNrKG1lbnVJdGVtKSIgIG5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogbWVudUl0ZW0uaXNEaXNhYmxlZCB9IiBkYXRhLXRlc3RzLWlkPSJ7e21lbnVJdGVtLnRleHR9fXN0ZXAiID57e21lbnVJdGVtLnRleHR9fTwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworPC9kaXY+CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UtbWVudS1ib3gvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94Lmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94L2V4cGFuZC1jb2xsYXBzZS1tZW51LWJveC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Y2VlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94L2V4cGFuZC1jb2xsYXBzZS1tZW51LWJveC5sZXNzCkBAIC0wLDAgKzEsNTUgQEAKKy5leHBhbmQtY29sbGFwc2UtbWVudS1ib3ggeworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgIHBhZGRpbmc6IDEzcHggMHB4IDVweCAxMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6IEBmdW5jX2NvbG9yX3I7CisgICAgbWFyZ2luOiAzcHggM3B4IDVweCAwcHg7CisKKworICAgIC5leHBhbmQtY29sbGFwc2UtbWVudS1ib3gtdGl0bGUgeworICAgICAgICAuZi10eXBlLl8xOF9tOworICAgICAgICBjb2xvcjogQG1haW5fY29sb3JfbTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgIC5oYW5kOworICAgICAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlLXRleHR7CisgICAgICAgICAgICBtYXgtd2lkdGg6IDE4NXB4OworICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgfQorCisgICAgICAgICYuZXhwYW5kZWQgeworICAgICAgICAgICAgLmV4cGFuZC1jb2xsYXBzZS1tZW51LWJveC10aXRsZS1pY29uIHsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC5leHBhbmQtY29sbGFwc2UtbWVudS1ib3gtdGl0bGUtaWNvbiB7CisgICAgICAgIC5oYW5kOworICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgLmFycm93LXVwOworICAgICAgICBtYXJnaW4tcmlnaHQ6IDZweDsKKyAgICAgICAgdHJhbnNpdGlvbjogLjNzIGFsbDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgfQorICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudCB7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIHBhZGRpbmctdG9wOiAxM3B4OworICAgICAgICAuZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94LWl0ZW0geworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7CisgICAgICAgICAgICBtYXJnaW46IDBweCAwcHggMTBweCAxMHB4OworICAgICAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgICAgIGNvbG9yOiBAbWFpbl9jb2xvcl9tOworCisgICAgICAgICAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICAgICAgICAgICYuc2VsZWN0ZWQgeworICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIEBtYWluX2NvbG9yX2E7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlL2V4cGFuZC1jb2xsYXBzZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzU4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlL2V4cGFuZC1jb2xsYXBzZS5odG1sCkBAIC0wLDAgKzEgQEAKKzxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlL2V4cGFuZC1jb2xsYXBzZS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDhmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlL2V4cGFuZC1jb2xsYXBzZS5sZXNzCkBAIC0wLDAgKzEsMTAgQEAKKy5lbGxpcHNpcy1kaXJlY3RpdmUtbW9yZS1sZXNzIHsKKyAgICAuYV85OworICAgIC5ib2xkOworICAgIC5oYW5kOworICAgIGZsb2F0OiByaWdodDsKKyAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgbGluZS1oZWlnaHQ6IDIzcHg7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL2V4cGFuZC1jb2xsYXBzZS9leHBhbmQtY29sbGFwc2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5NGRhNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLnRzCkBAIC0wLDAgKzEsMTM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgZXhwb3J0IGludGVyZmFjZSBJRXhwYW5kQ29sbGFwc2VTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIHRvZ2dsZSgpOiB2b2lkOworICAgICAgICBjb2xsYXBzZWQ6IGJvb2xlYW47CisgICAgICAgIGV4cGFuZGVkU2VsZWN0b3I6IHN0cmluZzsKKyAgICAgICAgY29udGVudDpzdHJpbmc7CisgICAgICAgIGlzQ2xvc2VPbkluaXQ6Ym9vbGVhbjsKKyAgICAgICAgbG9hZERhdGFGdW5jdGlvbjogRnVuY3Rpb247CisgICAgICAgIGlzTG9hZGluZ0RhdGE6IGJvb2xlYW47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEV4cGFuZENvbGxhcHNlRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgZXhwYW5kZWRTZWxlY3RvcjogJ0AnLAorICAgICAgICAgICAgbG9hZERhdGFGdW5jdGlvbjogJyY/JywKKyAgICAgICAgICAgIGlzQ2xvc2VPbkluaXQ6ICc9PycKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnQUUnOworICAgICAgICBwdWJsaWMgdHJhbnNjbHVkZSA9IHRydWU7CisKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklFeHBhbmRDb2xsYXBzZVNjb3BlLCAkZWxlbTphbnkpID0+IHsKKyAgICAgICAgICAgIHNjb3BlLmNvbGxhcHNlZCA9IGZhbHNlOworICAgICAgICAgICAgc2NvcGUuaXNMb2FkaW5nRGF0YSA9IGZhbHNlOworICAgICAgICAgICAgJGVsZW0uYWRkQ2xhc3MoJ2V4cGFuZGVkJyk7CisKKworICAgICAgICAgICAgaWYoc2NvcGUuaXNDbG9zZU9uSW5pdCkgeworICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICB0b2dnbGUoKTsKKyAgICAgICAgICAgICAgICB9LDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkZWxlbS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIHRvZ2dsZSgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGxldCBleHBhbmQgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAkZWxlbS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKKyAgICAgICAgICAgICAgICBzY29wZS5jb2xsYXBzZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gJChzY29wZS5leHBhbmRlZFNlbGVjdG9yKVswXTsKKyAgICAgICAgICAgICAgICBsZXQgcHJldldpZHRoID0gZWxlbWVudC5zdHlsZS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7CisgICAgICAgICAgICAgICAgbGV0IGVuZFdpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBwcmV2V2lkdGg7CisgICAgICAgICAgICAgICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnQKKyAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSAnaGVpZ2h0IC4zcyBlYXNlLWluLW91dCc7CisgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDsKKyAgICAgICAgICAgICAgICBlbGVtZW50LmhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50Wydwcm9wZXJ0eU5hbWUnXSA9PSAnaGVpZ2h0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gJyc7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRyYW5zaXRpb25FbmQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIGZhbHNlKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IGNvbGxhcHNlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgJGVsZW0ucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJyk7CisgICAgICAgICAgICAgICAgc2NvcGUuY29sbGFwc2VkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gJChzY29wZS5leHBhbmRlZFNlbGVjdG9yKVswXTsKKyAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodDsKKyAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gJ2hlaWdodCAuNXMgZWFzZS1pbi1vdXQnOworICAgICAgICAgICAgICAgICBlbGVtZW50Lm9mZnNldEhlaWdodDsgLy8gZm9yY2UgcmVwYWludAorICAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwcHgnOworICAgICAgICAgICAgICAgIGVsZW1lbnQuaGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCB0b2dnbGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY29sbGFwc2VkID09PSB0cnVlKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoc2NvcGUubG9hZERhdGFGdW5jdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaXNMb2FkaW5nRGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmlzTG9hZGluZ0RhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDApOworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmxvYWREYXRhRnVuY3Rpb24oKS50aGVuKG9uU3VjY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2NvcGUuaXNMb2FkaW5nRGF0YSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoc2NvcGUuaXNMb2FkaW5nRGF0YSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhwYW5kQ29sbGFwc2VEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgRXhwYW5kQ29sbGFwc2VEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3BhZ2Utc2VsZWN0b3IvcGFnZS1zZWxlY3Rvci5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3BhZ2Utc2VsZWN0b3IvcGFnZS1zZWxlY3Rvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmVhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvcGFnZS1zZWxlY3Rvci9wYWdlLXNlbGVjdG9yLmh0bWwKQEAgLTAsMCArMSw5IEBACis8ZGl2IGNsYXNzPSJpLXNkYy1sZWZ0LXNpZGViYXItcGFnZS1uYXYiPgorICAgIDx1bCBkYXRhLW5nLWNsYXNzPSJ7J2V4cGFuZGVkJzogZXhwYW5kZWQ9PT10cnVlfSI+CisgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdD0iaXRlbSBpbiBsaXN0IHwgZmlsdGVyOmV4Y2VwdFNlbGVjdGVkQ29tcGFyYXRvciIKKyAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9ImV4cGFuZGVkPWZhbHNlIgorICAgICAgICAgICAgY2xhc3M9InNpZGViYXItcGFnZS1uYXYtaXRlbSIKKyAgICAgICAgICAgIHVpLXNyZWY9Int7aXRlbS51cmx9fSI+e3tpdGVtLm5hbWV9fTwvbGk+CisgICAgPC91bD4KKyAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXBhZ2UtbmF2LWl0ZW0tc2VsZWN0ZWQiIGRhdGEtbmctY2xpY2s9Im9wZW5Db2xsYXBzZSgpIj57e3NlbGVjdGVkfX08c3BhbiBkYXRhLW5nLWNsYXNzPSJ7J2V4cGFuZGVkJzogZXhwYW5kZWQ9PT10cnVlfSI+PC9zcGFuPjwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvcGFnZS1zZWxlY3Rvci9wYWdlLXNlbGVjdG9yLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvcGFnZS1zZWxlY3Rvci9wYWdlLXNlbGVjdG9yLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MDIxOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9wYWdlLXNlbGVjdG9yL3BhZ2Utc2VsZWN0b3IubGVzcwpAQCAtMCwwICsxLDUxIEBACisuaS1zZGMtbGVmdC1zaWRlYmFyLXBhZ2UtbmF2IHsKKworICAgIGhlaWdodDogNjRweDsKKyAgICAKKyAgICAuc2lkZWJhci1wYWdlLW5hdi1pdGVtLXNlbGVjdGVkLAorICAgIC5zaWRlYmFyLXBhZ2UtbmF2LWl0ZW0geworICAgICAgICAuaV8xMTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogICNlMGU1ZTk7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBoZWlnaHQ6IDY0cHg7CisgICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjY2NjY2NjOworICAgICAgICBsaW5lLWhlaWdodDogNjRweDsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CisgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIG1hcmdpbjogMDsKKyAgICB9CisKKyAgICAuc2lkZWJhci1wYWdlLW5hdi1pdGVtLXNlbGVjdGVkIHsKKyAgICAgICAgei1pbmRleDogMTAxMDsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDBweDsKKyAgICB9CisKKyAgICAuc2lkZWJhci1wYWdlLW5hdi1pdGVtLXNlbGVjdGVkIHNwYW4geworICAgICAgICAuc3ByaXRlOworICAgICAgICAuc3ByaXRlLnRhYmxlLWFycm93OworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMjhweDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisKKyAgICAgICAgJi5leHBhbmRlZCB7CisgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgLnNwcml0ZS50YWJsZS1hcnJvdy5vcGVuZWQ7CisgICAgICAgICAgICB0b3A6IDMwcHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1bCB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAwcHg7CisgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICB6LWluZGV4OiA5OTsKKyAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOyAvL05lZWQgdGhpcyBhbmQgbm90IGRpc3BsYXkgbm9uZSwgc28gSSBjYW4gdXNlIHRoZSBmdW5jdGlvbjogZ2V0Q29tcHV0ZWRTdHlsZQorICAgICAgICAuYm94LXNoYWRvdygwcHggNHB4IDJweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4zNikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3BhZ2Utc2VsZWN0b3IvcGFnZS1zZWxlY3Rvci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9wYWdlLXNlbGVjdG9yL3BhZ2Utc2VsZWN0b3IudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4NWZlMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9wYWdlLXNlbGVjdG9yL3BhZ2Utc2VsZWN0b3IudHMKQEAgLTAsMCArMSwxMDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGNsYXNzIExpc3RJdGVtIHsKKyAgICAgICAgbmFtZTsKKyAgICAgICAgdXJsOworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVBhZ2VTZWxlY3RvclNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgc2VsZWN0ZWQ6c3RyaW5nOworICAgICAgICBleHBhbmRlZDogYm9vbGVhbjsKKyAgICAgICAgbGlzdDpBcnJheTxMaXN0SXRlbT47CisgICAgICAgIGV4Y2VwdFNlbGVjdGVkQ29tcGFyYXRvcihhY3R1YWwsIGV4cGVjdGVkKTpib29sZWFuOworICAgICAgICBvcGVuQ29sbGFwc2UoKTsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUGFnZVNlbGVjdG9yRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgbGlzdDogJz0nLAorICAgICAgICAgICAgc2VsZWN0ZWQ6ICdAJywKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IHRydWU7CisgICAgICAgIHB1YmxpYyByZXN0cmljdCA9ICdFJzsKKyAgICAgICAgcHVibGljIHRyYW5zY2x1ZGUgPSBmYWxzZTsKKworICAgICAgICBwcml2YXRlIHVsRWxlbWVudDpIVE1MRWxlbWVudDsKKyAgICAgICAgcHJpdmF0ZSBpdGVtSGVpZ2h0Om51bWJlciA9IDY0OworCisgICAgICAgIHByaXZhdGUgZ2V0VWxIZWlnaHQgPSAoKTpudW1iZXIgPT4geworICAgICAgICAgICAgbGV0IHRtcDpzdHJpbmcgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMudWxFbGVtZW50KS5oZWlnaHQ7CisgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJ0bXA6ICIgKyB0bXApOworICAgICAgICAgICAgbGV0IHVsSGVpZ2h0Om51bWJlciA9IHBhcnNlSW50KHRtcC5zdWJzdHIoMCx0bXAubGVuZ3RoLTIpKTsKKyAgICAgICAgICAgIC8vY29uc29sZS5sb2coInVsSGVpZ2h0OiAiICsgdWxIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIHVsSGVpZ2h0OworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvcGFnZS1zZWxlY3Rvci9wYWdlLXNlbGVjdG9yLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklQYWdlU2VsZWN0b3JTY29wZSwgJGVsZW06YW55KSA9PiB7CisgICAgICAgICAgICBzY29wZS5leHBhbmRlZD1mYWxzZTsKKworICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMudWxFbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KCIuaS1zZGMtbGVmdC1zaWRlYmFyLXBhZ2UtbmF2IHVsIilbMF07CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coInRoaXMudWxFbGVtZW50OiAiICsgdGhpcy51bEVsZW1lbnQpOworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ0aGlzLml0ZW1IZWlnaHQ6ICIgKyB0aGlzLml0ZW1IZWlnaHQpOworICAgICAgICAgICAgICAgIHRoaXMudWxFbGVtZW50LnN0eWxlLnRvcCA9ICh0aGlzLml0ZW1IZWlnaHQgLSB0aGlzLmdldFVsSGVpZ2h0KCkgLSA1KSArICdweCc7CisgICAgICAgICAgICAgICAgdGhpcy51bEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKKyAgICAgICAgICAgIH0sMTApOworCisgICAgICAgICAgICB0aGlzLnVsRWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCgiLmktc2RjLWxlZnQtc2lkZWJhci1wYWdlLW5hdiB1bCIpWzBdOworCisgICAgICAgICAgICBzY29wZS5leGNlcHRTZWxlY3RlZENvbXBhcmF0b3IgPSAoYWN0dWFsKSA9PiB7CisgICAgICAgICAgICAgICAgaWYgKGFjdHVhbC5uYW1lPT09c2NvcGUuc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLm9wZW5Db2xsYXBzZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmV4cGFuZGVkPSFzY29wZS5leHBhbmRlZDsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXhwYW5kZWQ9PT10cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMudWxFbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSAndG9wIDAuNHMgZWFzZS1vdXQnOworICAgICAgICAgICAgICAgICAgICB0aGlzLnVsRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLml0ZW1IZWlnaHQgKyAncHgnOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMudWxFbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSAndG9wIDAuNHMgZWFzZS1pbic7CisgICAgICAgICAgICAgICAgICAgIHRoaXMudWxFbGVtZW50LnN0eWxlLnRvcCA9ICAodGhpcy5pdGVtSGVpZ2h0IC0gdGhpcy5nZXRVbEhlaWdodCgpIC0gNSkgKyAncHgnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZVNlbGVjdG9yRGlyZWN0aXZlKCR0ZW1wbGF0ZUNhY2hlKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIFBhZ2VTZWxlY3RvckRpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjLWtleWJvYXJkLWV2ZW50cy9zZGMta2V5Ym9hcmQtZXZlbnRzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkYy1rZXlib2FyZC1ldmVudHMvc2RjLWtleWJvYXJkLWV2ZW50cy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTYxY2FhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkYy1rZXlib2FyZC1ldmVudHMvc2RjLWtleWJvYXJkLWV2ZW50cy50cwpAQCAtMCwwICsxLDEwNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJU2RjS2V5Ym9hcmRFdmVudHNTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIGtleUVudGVyOkZ1bmN0aW9uOworICAgICAgICBrZXlTaGlmdDpGdW5jdGlvbjsKKyAgICAgICAga2V5Q3RybDpGdW5jdGlvbjsKKyAgICAgICAga2V5RXNjYXBlOkZ1bmN0aW9uOworICAgICAgICBrZXlTcGFjZTpGdW5jdGlvbjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU2RjS2V5Ym9hcmRFdmVudHNEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAga2V5RW50ZXI6ICc9JywKKyAgICAgICAgICAgIGtleVNoaWZ0OiAnPScsCisgICAgICAgICAgICBrZXlDdHJsOiAnPScsCisgICAgICAgICAgICBrZXlFc2NhcGU6ICc9JywKKyAgICAgICAgICAgIGtleVNwYWNlOiAnPScKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnQSc7CisgICAgICAgIHB1YmxpYyB0cmFuc2NsdWRlID0gZmFsc2U7CisKKyAgICAgICAgbGluayA9IChzY29wZTpJU2RjS2V5Ym9hcmRFdmVudHNTY29wZSwgZWxlbWVudDpuZy5JQXVnbWVudGVkSlF1ZXJ5LCBhdHRyczphbmd1bGFyLklBdHRyaWJ1dGVzKSA9PiB7CisKKyAgICAgICAgICAgIGVsZW1lbnQuYmluZCgia2V5ZG93biBrZXlwcmVzcyIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZXZlbnQud2hpY2gpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogLy8gZW50ZXIga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmtleUVudGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmtleUVudGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjogLy8gc2hpZnQga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmtleVNoaWZ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmtleVNoaWZ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzogLy8gY3RybCBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUua2V5Q3RybCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5rZXlDdHJsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzogLy8gZXNjYXBlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5rZXlFc2NhcGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUua2V5RXNjYXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjogLy8gc3BhY2Uga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmtleVNwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmtleVNwYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZGNLZXlib2FyZEV2ZW50c0RpcmVjdGl2ZSgpOworICAgICAgICB9OworCisgICAgfQorCisgICAgU2RjS2V5Ym9hcmRFdmVudHNEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gW107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjLXRhZ3Mvc2RjLXRhZ3MuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGMtdGFncy9zZGMtdGFncy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWFkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjLXRhZ3Mvc2RjLXRhZ3MuaHRtbApAQCAtMCwwICsxLDI3IEBACis8ZGl2IGNsYXNzPSJ0YWdzLWJveCIgPgorICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IgorICAgICAgICAgICBuYW1lPSJ7e2VsZW1lbnROYW1lfX0iCisgICAgICAgICAgIGNsYXNzPSJuZXctdGFnLWlucHV0IgorICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6c2RjRGlzYWJsZWR9IgorICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0idmFsaWRhdGVOYW1lKCkiCisgICAgICAgICAgIGRhdGEtbmctbW9kZWw9Im5ld1RhZyIKKyAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjUwIgorICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49InBhdHRlcm4iCisgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Imktc2RjLXRhZy1pbnB1dCIKKyAgICAgICAgICAgbWF4bGVuZ3RoPSI1MCIKKyAgICAgICAgICAgc2RjLWtleWJvYXJkLWV2ZW50cworICAgICAgICAgICBrZXktZW50ZXI9ImFkZFRhZyIKKworICAgICAgICAvPgorICAgIDxwZXJmZWN0LXNjcm9sbGJhciBjbGFzcz0icGVyZmVjdC1zY3JvbGxiYXIgdGFncy13cmFwcGVyIiAgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOnNkY0Rpc2FibGVkfSIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIj4KKyAgICAgICAgPGRpdiBkYXRhLXRlc3RzLWlkPSJpLXNkYy10YWdzLXdyYXBwZXIiID4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwLXRhZyIgZGF0YS1uZy1zaG93PSJzcGVjaWFsVGFnIj4KKyAgICAgICAgICAgICAgICA8c2RjLXRhZyBkYXRhLWhpZGUtdG9vbHRpcD0idHJ1ZSIgZGF0YS1oaWRlLWRlbGV0ZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRhZy1kYXRhPSJ7dGFnOiBzcGVjaWFsVGFnLCBpZDogc3BlY2lhbFRhZyB9Ij48L3NkYy10YWc+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwLXRhZyIgbmctcmVwZWF0PSJ0YWcgaW4gdGFncyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgIDxzZGMtdGFnIG5nLWlmPSJ0YWcgIT0gc3BlY2lhbFRhZyIgZGF0YS1vbi1kZWxldGU9ImRlbGV0ZVRhZyh0YWcpIiBzZGMtZGlzYWJsZT0ic2RjRGlzYWJsZWQiIGRhdGEtaGlkZS1kZWxldGU9InNkY0Rpc2FibGVkIiBkYXRhLWhpZGUtdG9vbHRpcD0idHJ1ZSIgZGF0YS10YWctZGF0YT0ie3RhZzogdGFnLCBpZDogdGFnIH0iPjwvc2RjLXRhZz4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjLXRhZ3Mvc2RjLXRhZ3MubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGMtdGFncy9zZGMtdGFncy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MjE5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjLXRhZ3Mvc2RjLXRhZ3MubGVzcwpAQCAtMCwwICsxLDYxIEBACisudGFncy1ib3ggeworCisgICAgaGVpZ2h0OiAyOTdweDsKKyAgICAuYmdfYzsKKworICAgIC5wZXJmZWN0LXNjcm9sbGJhciB7CisgICAgICAgIGhlaWdodDogMjY1cHg7CisgICAgfQorCisgICAgLm5ldy10YWctaW5wdXQgeworICAgICAgICBkaXNwbGF5OiBibG9jazsKKworICAgICAgICAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKKyAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDAgIWltcG9ydGFudDsKKyAgICAgICAgLWtodG1sLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKKyAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMCAhaW1wb3J0YW50OworCisgICAgICAgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAgIWltcG9ydGFudDsKKyAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiAwICFpbXBvcnRhbnQ7CisgICAgICAgIC1raHRtbC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OworICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OworCisgICAgICAgIGJvcmRlcjogc29saWQgMXB4ICNkOGQ4ZDg7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4OworICAgICAgICBwYWRkaW5nOiAycHggMTBweDsKKyAgICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisKKyAgICAudGFncy13cmFwcGVyIHsKKyAgICAgICAgcGFkZGluZzogMTBweDsKKyAgICAgICAgLmJvcmRlci1yYWRpdXMtYm90dG9tLWxlZnQoMnB4KTsKKyAgICAgICAgLmJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0KDJweCk7CisgICAgICAgIGJvcmRlcjogc29saWQgMXB4ICNkOGQ4ZDg7CisgICAgICAgIGJvcmRlci10b3A6IG5vbmU7CisKKyAgICAgICAgLmdyb3VwLXRhZyB7CisgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisKKyAgICAgICAgICAgIC5zZGMtdGFnIHsKKyAgICAgICAgICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbl9jb2xvcl9uOworICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluX2NvbG9yX3A7CisgICAgICAgICAgICAgICAgbWluLXdpZHRoOiBhdXRvOworICAgICAgICAgICAgICAgIC50YWcgeworICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICYudmlldy1tb2RlIC5ncm91cC10YWcgeworICAgICAgICAgICAgb3BhY2l0eTogMTsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4ZjggIWltcG9ydGFudDsKKyAgICAgICAgICAgIC5zZGMtdGFnIHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lOworICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogQG1haW5fY29sb3JfbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjLXRhZ3Mvc2RjLXRhZ3MudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjLXRhZ3Mvc2RjLXRhZ3MudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0MTQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGMtdGFncy9zZGMtdGFncy50cwpAQCAtMCwwICsxLDk3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5EaXJlY3RpdmVzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElTZGNUYWdzU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICB0YWdzOkFycmF5PHN0cmluZz47CisgICAgICAgIHNwZWNpYWxUYWc6c3RyaW5nOworICAgICAgICBuZXdUYWc6c3RyaW5nOworICAgICAgICBmb3JtRWxlbWVudDpuZy5JRm9ybUNvbnRyb2xsZXI7CisgICAgICAgIGVsZW1lbnROYW1lOnN0cmluZzsKKyAgICAgICAgcGF0dGVybjphbnk7CisgICAgICAgIHNkY0Rpc2FibGVkOmJvb2xlYW47CisgICAgICAgIG1heFRhZ3M6bnVtYmVyOworICAgICAgICBkZWxldGVUYWcodGFnOnN0cmluZyk6dm9pZDsKKyAgICAgICAgYWRkVGFnKHRhZzpzdHJpbmcpOnZvaWQ7CisgICAgICAgIHZhbGlkYXRlTmFtZSgpOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFNkY1RhZ3NEaXJlY3RpdmUgaW1wbGVtZW50cyBuZy5JRGlyZWN0aXZlIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSkgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICB0YWdzOiAnPScsCisgICAgICAgICAgICBzcGVjaWFsVGFnOiAnPScsCisgICAgICAgICAgICBwYXR0ZXJuOiAnPScsCisgICAgICAgICAgICBzZGNEaXNhYmxlZDogJz0nLAorICAgICAgICAgICAgZm9ybUVsZW1lbnQ6ICc9JywKKyAgICAgICAgICAgIGVsZW1lbnROYW1lOiAnQCcsCisgICAgICAgICAgICBtYXhUYWdzOiAnQCcKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHB1YmxpYyB0cmFuc2NsdWRlID0gZmFsc2U7CisKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGMtdGFncy9zZGMtdGFncy5odG1sJyk7CisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9IChzY29wZTpJU2RjVGFnc1Njb3BlLCBlbGVtZW50Om5nLklOZ01vZGVsQ29udHJvbGxlcikgPT4geworCisgICAgICAgICAgICAgICBzY29wZS5kZWxldGVUYWcgPSAodGFnOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUudGFncy5zcGxpY2Uoc2NvcGUudGFncy5pbmRleE9mKHRhZyksMSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzY29wZS5hZGRUYWcgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdmFsaWQgPSBzY29wZS5mb3JtRWxlbWVudFtzY29wZS5lbGVtZW50TmFtZV0uJHZhbGlkOworICAgICAgICAgICAgICAgIGlmICh2YWxpZCAmJgorICAgICAgICAgICAgICAgICAgICBzY29wZS50YWdzLmxlbmd0aDxzY29wZS5tYXhUYWdzICYmCisgICAgICAgICAgICAgICAgICAgIHNjb3BlLm5ld1RhZyAmJgorICAgICAgICAgICAgICAgICAgICBzY29wZS5uZXdUYWchPT0nJyAmJgorICAgICAgICAgICAgICAgICAgICBzY29wZS50YWdzLmluZGV4T2Yoc2NvcGUubmV3VGFnKT09PS0xICYmCisgICAgICAgICAgICAgICAgICAgIHNjb3BlLm5ld1RhZyE9PXNjb3BlLnNwZWNpYWxUYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnRhZ3MucHVzaChzY29wZS5uZXdUYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubmV3VGFnPScnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLnZhbGlkYXRlTmFtZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChzY29wZS50YWdzLmluZGV4T2Yoc2NvcGUubmV3VGFnKT4tMSkgeworICAgICAgICAgICAgICAgICAgICBzY29wZS5mb3JtRWxlbWVudFtzY29wZS5lbGVtZW50TmFtZV0uJHNldFZhbGlkaXR5KCduYW1lRXhpc3QnLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmZvcm1FbGVtZW50W3Njb3BlLmVsZW1lbnROYW1lXS4kc2V0VmFsaWRpdHkoJ25hbWVFeGlzdCcsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZGNUYWdzRGlyZWN0aXZlKCR0ZW1wbGF0ZUNhY2hlKTsKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIFNkY1RhZ3NEaXJlY3RpdmUuZmFjdG9yeS4kaW5qZWN0ID0gWyckdGVtcGxhdGVDYWNoZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkY19lcnJvcl90b29sdGlwL3NkY19lcnJvcl90b29sdGlwLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjX2Vycm9yX3Rvb2x0aXAvc2RjX2Vycm9yX3Rvb2x0aXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzYzODFiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkY19lcnJvcl90b29sdGlwL3NkY19lcnJvcl90b29sdGlwLmh0bWwKQEAgLTAsMCArMSw2IEBACis8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0tZXJyb3ItbWVzc2FnZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KKyAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtLWVycm9yLWljb24tb3BlbiI+PC9zcGFuPgorICAgIDxuZy10cmFuc2NsdWRlPgorCisgICAgPC9uZy10cmFuc2NsdWRlPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjX2Vycm9yX3Rvb2x0aXAvc2RjX2Vycm9yX3Rvb2x0aXAudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjX2Vycm9yX3Rvb2x0aXAvc2RjX2Vycm9yX3Rvb2x0aXAudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzMGVhNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfZXJyb3JfdG9vbHRpcC9zZGNfZXJyb3JfdG9vbHRpcC50cwpAQCAtMCwwICsxLDEwOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJU2RjRXJyb3JUb29sdGlwU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBhbGlnblRvU2VsZWN0b3I6IHN0cmluZzsKKyAgICAgICAgdG9wTWFyZ2luOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFNkY0Vycm9yVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIGFsaWduVG9TZWxlY3RvcjogJ0AnLCAvLyBKcXVlcnkgc2VsZWN0b3IgdG8gYWxpZ24gdG8KKyAgICAgICAgICAgIHRvcE1hcmdpbjogJ0AnICAgIC8vIFRoZSBtYXJnaW4gZnJvbSB0aGUgdG9wLCBpbiBjYXNlIHRoZXJlIGlzIGxhYmVsIG9yIG5vdCB0aGUgdG9wIG1hcmdpbiBpcyBkaWZmZXJlbnQuCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHJlcGxhY2UgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHJlc3RyaWN0ID0gJ0UnOworICAgICAgICBwdWJsaWMgdHJhbnNjbHVkZSA9IHRydWU7CisKKyAgICAgICAgdGVtcGxhdGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfZXJyb3JfdG9vbHRpcC9zZGNfZXJyb3JfdG9vbHRpcC5odG1sJyk7CisgICAgICAgIH07CisKKyAgICAgICAgbGluayA9IChzY29wZTpJU2RjRXJyb3JUb29sdGlwU2NvcGUsICRlbGVtOmFueSkgPT4geworICAgICAgICAgICAgbGV0IF9zZWxmID0gdGhpczsKKworICAgICAgICAgICAgJGVsZW0uYWRkQ2xhc3MoImktc2RjLWZvcm0taXRlbS1lcnJvci1pY29uIik7CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnRzIGFmdGVyIHRoZXkgbG9hZGVkIHRvIHRoZSBkb20uCisgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIF9zZWxmLmNhbGN1bGF0ZVBvc2l0aW9uKHNjb3BlLCAkZWxlbSk7CisgICAgICAgICAgICB9LDEwMCk7CisKKyAgICAgICAgICAgICRlbGVtLmJpbmQoJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgJCgiLmktc2RjLWZvcm0taXRlbS1lcnJvci1tZXNzYWdlIiwkZWxlbSkuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJGVsZW0uYmluZCgnbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgJCgiLmktc2RjLWZvcm0taXRlbS1lcnJvci1tZXNzYWdlIiwkZWxlbSkuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKHNjb3BlOklTZGNFcnJvclRvb2x0aXBTY29wZSwgJGVsZW06YW55KTp2b2lkIHsKKyAgICAgICAgICAgIGxldCBsZWZ0TWFyZ2luID0gMTM7CisgICAgICAgICAgICBsZXQgdG9wTWFyZ2luID0gc2NvcGUudG9wTWFyZ2luPyBwYXJzZUludChzY29wZS50b3BNYXJnaW4pIDogMTA7CisKKyAgICAgICAgICAgIGlmIChzY29wZS5hbGlnblRvU2VsZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlcnJvciwgaW4gY2FzZSB1c2VyIGFkZCBhbGlnbi10by1zZWxlY3RvciBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBsZXQgak9iaiA9ICQoc2NvcGUuYWxpZ25Ub1NlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoak9iai5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQxID0gak9iai5vdXRlckhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAkZWxlbS5jc3MoJ2xlZnQnLCBqT2JqLnBvc2l0aW9uKCkubGVmdCArIGpPYmoub3V0ZXJXaWR0aCgpICsgbGVmdE1hcmdpbik7CisgICAgICAgICAgICAgICAgICAgIC8vJGVsZW0uY3NzKCd0b3AnLCBqT2JqLnBvc2l0aW9uKCkudG9wICsgdG9wTWFyZ2luICsgKGhlaWdodDEgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgICRlbGVtLmNzcygndG9wJywgak9iai5wb3NpdGlvbigpLnRvcCArIChoZWlnaHQxIC8gMikgLSA1KTsgLy8gTGFiZWwgbWFyZ2luIGlzOiAyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlcnJvciwgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBlbGVtZW50LgorICAgICAgICAgICAgICAgIGxldCBpbnB1dEVsbSA9ICRlbGVtLnNpYmxpbmdzKCdpbnB1dCcpOworICAgICAgICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9ICRlbGVtLnNpYmxpbmdzKCd0ZXh0YXJlYScpOworICAgICAgICAgICAgICAgIGxldCBzZWxlY3RFbG0gPSAkZWxlbS5zaWJsaW5ncygnc2VsZWN0Jyk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0RWxtLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVsZW0uY3NzKCdsZWZ0JywgaW5wdXRFbG0ub3V0ZXJXaWR0aCgpICsgbGVmdE1hcmdpbik7CisgICAgICAgICAgICAgICAgICAgICRlbGVtLmNzcygndG9wJywgaW5wdXRFbG0ucG9zaXRpb24oKS50b3AgKyB0b3BNYXJnaW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dGFyZWFFbG0ubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAkZWxlbS5jc3MoJ2xlZnQnLCB0ZXh0YXJlYUVsbS5vdXRlcldpZHRoKCkgKyBsZWZ0TWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodDIgPSB0ZXh0YXJlYUVsbS5vdXRlckhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBsZXQgZWxtSGVpZ2h0MiA9ICRlbGVtLm91dGVySGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vbGV0IHRvcCA9IHRleHRhcmVhRWxtLnBvc2l0aW9uKCkudG9wOworICAgICAgICAgICAgICAgICAgICAkZWxlbS5jc3MoJ2JvdHRvbScsIChoZWlnaHQyIC0gKGVsbUhlaWdodDIgLyAyKSkgLyAyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdEVsbS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICRlbGVtLmNzcygnbGVmdCcsIHNlbGVjdEVsbS5vdXRlcldpZHRoKCkgKyBsZWZ0TWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgJGVsZW0uY3NzKCd0b3AnLCBzZWxlY3RFbG0ucG9zaXRpb24oKS50b3AgKyB0b3BNYXJnaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZGNFcnJvclRvb2x0aXBEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgU2RjRXJyb3JUb29sdGlwRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnXTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkY19tZXNzYWdlcy9zZGMtbWVzc2FnZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjLW1lc3NhZ2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxZWYxYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjLW1lc3NhZ2UudHMKQEAgLTAsMCArMSwxNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBleHBvcnQgaW50ZXJmYWNlIElTZGNNZXNzYWdlU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBzZGNUcmFuc2xhdGU6IHN0cmluZzsKKyAgICAgICAgc2RjVHJhbnNsYXRlVmFsdWVzOnN0cmluZzsKKyAgICAgICAgc2RjQWxpZ246c3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBTZGNNZXNzYWdlRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkYW5pbWF0ZTphbnksIHByaXZhdGUgJGZpbHRlcjphbnksIHByaXZhdGUgJHBhcnNlOmFueSkgeworICAgICAgICB9CisKKyAgICAgICAgc2NvcGUgPSB7CisgICAgICAgICAgICBmaWVsZDogJz0nLAorICAgICAgICAgICAgcmVxdWlyZWQ6ICdAJywKKyAgICAgICAgICAgIHBhdHRlcm46ICdAJywKKyAgICAgICAgICAgIHNkY1RyYW5zbGF0ZTogJ0AnLAorICAgICAgICAgICAgc2RjVHJhbnNsYXRlVmFsdWVzOiAnQCcsCisgICAgICAgICAgICBzZGNBbGlnbjogJ0AnCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHRlcm1pbmFsID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIHJlc3RyaWN0ID0gJ0EnOworICAgICAgICBwdWJsaWMgdHJhbnNjbHVkZSA9ICdlbGVtZW50JzsKKyAgICAgICAgcHVibGljIHJlcXVpcmUgPSAnXl5zZGNNZXNzYWdlcyc7CisKKyAgICAgICAgbGluayA9IChzY29wZTpJU2RjTWVzc2FnZVNjb3BlLCAkZWxlbWVudDphbnksICRhdHRyczphbnksc2RjTWVzc2FnZXNDdHJsOmFueSwgJHRyYW5zY2x1ZGU6YW55KSA9PiB7CisgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisKKyAgICAgICAgICAgIGxldCBjb21tZW50Tm9kZSA9ICRlbGVtZW50WzBdOworCisgICAgICAgICAgICBsZXQgcmVjb3JkczsKKyAgICAgICAgICAgIGxldCBzdGF0aWNFeHAgPSAkYXR0cnMuc2RjTWVzc2FnZSB8fCAkYXR0cnMud2hlbjsKKyAgICAgICAgICAgIGxldCBkeW5hbWljRXhwID0gJGF0dHJzLnNkY01lc3NhZ2VFeHAgfHwgJGF0dHJzLndoZW5FeHA7CisgICAgICAgICAgICBsZXQgYXNzaWduUmVjb3JkcyA9IGZ1bmN0aW9uKGl0ZW1zKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkcyA9IGl0ZW1zCisgICAgICAgICAgICAgICAgICAgID8gKGFuZ3VsYXIuaXNBcnJheShpdGVtcykKKyAgICAgICAgICAgICAgICAgICAgPyBpdGVtcworICAgICAgICAgICAgICAgICAgICA6IGl0ZW1zLnNwbGl0KC9bXHMsXSsvKSkKKyAgICAgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICAgICAgICAgIHNkY01lc3NhZ2VzQ3RybC5yZVJlbmRlcigpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKGR5bmFtaWNFeHApIHsKKyAgICAgICAgICAgICAgICBhc3NpZ25SZWNvcmRzKHNjb3BlLiRldmFsKGR5bmFtaWNFeHApKTsKKyAgICAgICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKGR5bmFtaWNFeHAsIGFzc2lnblJlY29yZHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NpZ25SZWNvcmRzKHN0YXRpY0V4cCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCwgbWVzc2FnZUN0cmw7CisgICAgICAgICAgICBzZGNNZXNzYWdlc0N0cmwucmVnaXN0ZXIoY29tbWVudE5vZGUsIG1lc3NhZ2VDdHJsID0geworICAgICAgICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uIChuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKHJlY29yZHMsIG5hbWUpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgYXR0YWNoOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICR0cmFuc2NsdWRlKHNjb3BlLCBmdW5jdGlvbiAoZWxtKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLiRhbmltYXRlLmVudGVyKGVsbSwgbnVsbCwgJGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZWxtOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLmFkZENsYXNzKCJpLXNkYy1mb3JtLWl0ZW0tZXJyb3ItbWVzc2FnZSIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kY29tcGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5zZGNUcmFuc2xhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNlbGYuJGZpbHRlcigndHJhbnNsYXRlJykoc2NvcGUuc2RjVHJhbnNsYXRlLCBzY29wZS5zZGNUcmFuc2xhdGVWYWx1ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogTmVlZCB0byBoYW5kbGUgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCB0ID0gZWxtLmh0bWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdCA9IGFuZ3VsYXIuZWxlbWVudCgiPHNwYW4+IiArIGVsbS5odG1sKCkgKyAiPC9zcGFuPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RleHQgPSBzZWxmLiRwYXJzZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Njb3BlLnNkY1RyYW5zbGF0ZVZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbS5odG1sKHRleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLnByZXBlbmQoIjxzcGFuIGNsYXNzPSdlcnJvcic+PC9zcGFuPiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIE9LIHRvIGNsb3NlIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgb2tFbG0gPSAkKCc8c3BhbiAvPicpLmF0dHIoJ2NsYXNzJywgJ29rJykuaHRtbCgnT0snKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL29rRWxtLmNsaWNrKGZ1bmN0aW9uKGUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG1lc3NhZ2VDdHJsLmRldGFjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbG0uYXBwZW5kKG9rRWxtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuc2RjQWxpZ24peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hvb3NlbkVsbSA9ICQoc2NvcGUuc2RjQWxpZ24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hvb3NlbkVsbS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0MSA9IGNob29zZW5FbG0ub3V0ZXJIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbG1IZWlnaHQxID0gZWxtLm91dGVySGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbG0uY3NzKCdsZWZ0JywgY2hvb3NlbkVsbS5vdXRlcldpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLmNzcygnYm90dG9tJywgKGhlaWdodDEgLSAoZWxtSGVpZ2h0MSAvIDIpKSAvIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZXJyb3IsIGFjY29yZGluZyB0byB0aGUgaW5wdXQgZWxlbWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RWxtID0gZWxtLnBhcmVudCgpLnNpYmxpbmdzKCdpbnB1dCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBlbG0ucGFyZW50KCkuc2libGluZ3MoJ3RleHRhcmVhJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RFbG0gPSBlbG0ucGFyZW50KCkuc2libGluZ3MoJ3NlbGVjdCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbG0ubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLmNzcygnbGVmdCcsIGlucHV0RWxtLm91dGVyV2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbG0uY3NzKCd0b3AnLCBpbnB1dEVsbS5wb3NpdGlvbigpLnRvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dGFyZWFFbG0ubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLmNzcygnbGVmdCcsIHRleHRhcmVhRWxtLm91dGVyV2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gdGV4dGFyZWFFbG0ub3V0ZXJIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbG1IZWlnaHQgPSBlbG0ub3V0ZXJIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHRvcCA9IHRleHRhcmVhRWxtLnBvc2l0aW9uKCkudG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLmNzcygnYm90dG9tJywgKGhlaWdodCAtIChlbG1IZWlnaHQgLyAyKSkgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RFbG0ubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLmNzcygnbGVmdCcsIHNlbGVjdEVsbS5vdXRlcldpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxtLmNzcygndG9wJywgc2VsZWN0RWxtLnBvc2l0aW9uKCkudG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggdGltZSB3ZSBhdHRhY2ggdGhpcyBub2RlIHRvIGEgbWVzc2FnZSB3ZSBnZXQgYSBuZXcgaWQgdGhhdCB3ZSBjYW4gbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHdlIGFyZSBkZXN0cm95aW5nIHRoZSBub2RlIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkJGF0dGFjaElkID0gY3VycmVudEVsZW1lbnQuJCRhdHRhY2hJZCA9IHNkY01lc3NhZ2VzQ3RybC5nZXRBdHRhY2hJZCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGV2ZW50IHRoYXQgdGhlIHBhcmVudCBlbGVtZW50IGlzIGRlc3Ryb3llZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGFueSBvdGhlciBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSB0aGVuIGl0J3MgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRlcmVnaXN0ZXIgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgY29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LiQkYXR0YWNoSWQgPT09ICQkYXR0YWNoSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkY01lc3NhZ2VzQ3RybC5kZXJlZ2lzdGVyKGNvbW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDdHJsLmRldGFjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZGV0YWNoOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsbSA9IGN1cnJlbnRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi4kYW5pbWF0ZS5sZWF2ZShlbG0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBjb250YWlucyA9IChjb2xsZWN0aW9uLCBrZXkpOmFueSA9PiB7CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmlzQXJyYXkoY29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgPyBjb2xsZWN0aW9uLmluZGV4T2Yoa2V5KSA+PSAwCisgICAgICAgICAgICAgICAgICAgIDogY29sbGVjdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCRhbmltYXRlOmFueSwgJGZpbHRlcjphbnksICRwYXJzZTphbnkpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZGNNZXNzYWdlRGlyZWN0aXZlKCRhbmltYXRlLCAkZmlsdGVyLCAkcGFyc2UpOworICAgICAgICB9OworCisgICAgfQorCisgICAgU2RjTWVzc2FnZURpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyRhbmltYXRlJywgJyRmaWx0ZXInLCAnJHBhcnNlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjX21lc3NhZ2VzL3NkYy1tZXNzYWdlcy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkY19tZXNzYWdlcy9zZGMtbWVzc2FnZXMubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRmZGJiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkY19tZXNzYWdlcy9zZGMtbWVzc2FnZXMubGVzcwpAQCAtMCwwICsxLDEwIEBACisuZWxsaXBzaXMtZGlyZWN0aXZlLW1vcmUtbGVzcyB7CisgICAgLmFfOTsKKyAgICAuYm9sZDsKKyAgICAuaGFuZDsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luLXJpZ2h0OiAxN3B4OworICAgIGxpbmUtaGVpZ2h0OiAyM3B4OworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjX21lc3NhZ2VzL3NkYy1tZXNzYWdlcy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjLW1lc3NhZ2VzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjQzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvc2RjX21lc3NhZ2VzL3NkYy1tZXNzYWdlcy50cwpAQCAtMCwwICsxLDI0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVNkY01lc3NhZ2VzU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBzZGNNZXNzYWdlczogYW55OworICAgICAgICBlZGl0Rm9ybTpuZy5JRm9ybUNvbnRyb2xsZXI7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFNkY01lc3NhZ2VzRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7fQorCisgICAgICAgIHNjb3BlID0geworICAgICAgICAgICAgc2RjTWVzc2FnZXM6ICc9JworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyByZXN0cmljdCA9ICdBRSc7CisgICAgICAgIHB1YmxpYyByZXF1aXJlID0gJ3NkY01lc3NhZ2VzJzsKKyAgICAgICAgcHVibGljIGNvbnRyb2xsZXIgPSBTZGNNZXNzYWdlc0NvbnRyb2xsZXI7CisKKyAgICAgICAgLyp0ZW1wbGF0ZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkYy1tZXNzYWdlcy9zZGMtbWVzc2FnZXMuaHRtbCcpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UpPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZGNNZXNzYWdlc0RpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSk7CisgICAgICAgIH07Ki8KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZhY3RvcnkgPSAoKT0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2RjTWVzc2FnZXNEaXJlY3RpdmUoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFNkY01lc3NhZ2VzQ29udHJvbGxlciB7CisKKyAgICAgICAgbWVzc2FnZXM6YW55OworICAgICAgICBnZXRBdHRhY2hJZDpGdW5jdGlvbjsKKyAgICAgICAgcmVuZGVyOmFueTsKKyAgICAgICAgcmVSZW5kZXI6RnVuY3Rpb247CisgICAgICAgIHJlZ2lzdGVyOkZ1bmN0aW9uOworICAgICAgICBkZXJlZ2lzdGVyOkZ1bmN0aW9uOworICAgICAgICBoZWFkOmFueTsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRlbGVtZW50JywKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRhdHRycycsCisgICAgICAgICAgICAnJGFuaW1hdGUnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkZWxlbWVudDpKUXVlcnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHNjb3BlOklTZGNNZXNzYWdlc1Njb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRhdHRyczpuZy5JQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkYW5pbWF0ZTphbnkKKyAgICAgICAgICAgICkgeworCisgICAgICAgICAgICB0aGlzLmluaXQoKTsKKworICAgICAgICB9CisKKyAgICAgICAgaW5pdD0oKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBzZWxmID0gdGhpczsKKworICAgICAgICAgICAgbGV0IEFDVElWRV9DTEFTUzpzdHJpbmcgPSAnbmctYWN0aXZlJzsKKyAgICAgICAgICAgIGxldCBJTkFDVElWRV9DTEFTUzpzdHJpbmcgPSAnbmctaW5hY3RpdmUnOworCisgICAgICAgICAgICBsZXQgY3RybCA9IHRoaXM7CisgICAgICAgICAgICBsZXQgbGF0ZXN0S2V5ID0gMDsKKyAgICAgICAgICAgIGxldCBuZXh0QXR0YWNoSWQgPSAwOworCisgICAgICAgICAgICB0aGlzLmdldEF0dGFjaElkID0gZnVuY3Rpb24gZ2V0QXR0YWNoSWQoKSB7IHJldHVybiBuZXh0QXR0YWNoSWQrKzsgfTsKKworICAgICAgICAgICAgbGV0IG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcyA9IHt9OworICAgICAgICAgICAgbGV0IHJlbmRlckxhdGVyLCBjYWNoZWRDb2xsZWN0aW9uOworCisgICAgICAgICAgICB0aGlzLnJlbmRlciA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gY29sbGVjdGlvbiB8fCB7fTsKKworICAgICAgICAgICAgICAgIHJlbmRlckxhdGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY2FjaGVkQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CisKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBlbXB0eSBvciBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRydXRoeQorICAgICAgICAgICAgICAgIGxldCBtdWx0aXBsZSA9ICBzZWxmLmlzQXR0clRydXRoeShzZWxmLiRzY29wZSwgc2VsZi4kYXR0cnNbJ3NkY01lc3NhZ2VzTXVsdGlwbGUnXSkgfHwgc2VsZi5pc0F0dHJUcnV0aHkoc2VsZi4kc2NvcGUsIHNlbGYuJGF0dHJzWydtdWx0aXBsZSddKTsKKworICAgICAgICAgICAgICAgIGxldCB1bm1hdGNoZWRNZXNzYWdlcyA9IFtdOworICAgICAgICAgICAgICAgIGxldCBtYXRjaGVkS2V5cyA9IHt9OworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlSXRlbSA9IGN0cmwuaGVhZDsKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbGV0IHRvdGFsTWVzc2FnZXMgPSAwOworCisgICAgICAgICAgICAgICAgLy8gd2UgdXNlICE9IGluc3RlYWQgb2YgIT09IHRvIGFsbG93IGZvciBib3RoIHVuZGVmaW5lZCBhbmQgbnVsbCB2YWx1ZXMKKyAgICAgICAgICAgICAgICB3aGlsZSAobWVzc2FnZUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0b3RhbE1lc3NhZ2VzKys7CisgICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQ3RybCA9IG1lc3NhZ2VJdGVtLm1lc3NhZ2U7CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VVc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZUZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfLmVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZVVzZWQgJiYgc2VsZi50cnV0aHkodmFsdWUpICYmIG1lc3NhZ2VDdHJsLnRlc3Qoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIHByZXZlbnQgdGhlIHNhbWUgZXJyb3IgbmFtZSBmcm9tIHNob3dpbmcgdXAgdHdpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRLZXlzW2tleV0pIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEtleXNba2V5XSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVVzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ3RybC5hdHRhY2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVXNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIHdlIHdhbnQgdG8gZGlzcGxheSBtdWx0aXBsZSBtZXNzYWdlcyB0aGVuIHdlIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGEgZmxhZyBoZXJlIHRvIGF2b2lkIGRpc3BsYXlpbmcgdGhlIG5leHQgbWVzc2FnZSBpbiB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUZvdW5kID0gIW11bHRpcGxlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXRjaGVkTWVzc2FnZXMucHVzaChtZXNzYWdlQ3RybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSXRlbSA9IG1lc3NhZ2VJdGVtLm5leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgXy5lYWNoKHVubWF0Y2hlZE1lc3NhZ2VzLCBmdW5jdGlvbihtZXNzYWdlQ3RybCkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ3RybC5kZXRhY2goKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIHVubWF0Y2hlZE1lc3NhZ2VzLmxlbmd0aCAhPT0gdG90YWxNZXNzYWdlcworICAgICAgICAgICAgICAgICAgICA/IGN0cmwuJGFuaW1hdGUuc2V0Q2xhc3Moc2VsZi4kZWxlbWVudCwgQUNUSVZFX0NMQVNTLCBJTkFDVElWRV9DTEFTUykKKyAgICAgICAgICAgICAgICAgICAgOiBjdHJsLiRhbmltYXRlLnNldENsYXNzKHNlbGYuJGVsZW1lbnQsIElOQUNUSVZFX0NMQVNTLCBBQ1RJVkVfQ0xBU1MpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2VsZi4kc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignc2RjTWVzc2FnZXMnIHx8IHNlbGYuJGF0dHJzWydmb3InXSwgZnVuY3Rpb24obmV3VmFsOmFueSwgb2xkVmFsOmFueSl7CisgICAgICAgICAgICAgICAgY3RybC5yZW5kZXIobmV3VmFsKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLnJlUmVuZGVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZW5kZXJMYXRlcikgeworICAgICAgICAgICAgICAgICAgICByZW5kZXJMYXRlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuJHNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVuZGVyTGF0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRDb2xsZWN0aW9uICYmIGN0cmwucmVuZGVyKGNhY2hlZENvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyID0gZnVuY3Rpb24oY29tbWVudCwgbWVzc2FnZUN0cmwpIHsKKyAgICAgICAgICAgICAgICBsZXQgbmV4dEtleSA9IGxhdGVzdEtleS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIG1lc3NhZ2VzW25leHRLZXldID0geworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlQ3RybAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaW5zZXJ0TWVzc2FnZU5vZGUoc2VsZi4kZWxlbWVudFswXSwgY29tbWVudCwgbmV4dEtleSk7CisgICAgICAgICAgICAgICAgY29tbWVudC4kJHNkY01lc3NhZ2VOb2RlID0gbmV4dEtleTsKKyAgICAgICAgICAgICAgICBsYXRlc3RLZXkrKzsKKworICAgICAgICAgICAgICAgIGN0cmwucmVSZW5kZXIoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuZGVyZWdpc3RlciA9IGZ1bmN0aW9uKGNvbW1lbnQpIHsKKyAgICAgICAgICAgICAgICBsZXQga2V5ID0gY29tbWVudC4kJHNkY01lc3NhZ2VOb2RlOworICAgICAgICAgICAgICAgIGRlbGV0ZSBjb21tZW50LiQkc2RjTWVzc2FnZU5vZGU7CisgICAgICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZU5vZGUoc2VsZi4kZWxlbWVudFswXSwgY29tbWVudCwga2V5KTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNba2V5XTsKKyAgICAgICAgICAgICAgICBjdHJsLnJlUmVuZGVyKCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmdW5jdGlvbiBmaW5kUHJldmlvdXNNZXNzYWdlKHBhcmVudCwgY29tbWVudCkgeworICAgICAgICAgICAgICAgIGxldCBwcmV2Tm9kZSA9IGNvbW1lbnQ7CisgICAgICAgICAgICAgICAgbGV0IHBhcmVudExvb2t1cCA9IFtdOworICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZSAhPT0gcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2S2V5ID0gcHJldk5vZGUuJCRzZGNNZXNzYWdlTm9kZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZLZXkgJiYgcHJldktleS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlc1twcmV2S2V5XTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGRpdmUgZGVlcGVyIGludG8gdGhlIERPTSBhbmQgZXhhbWluZSBpdHMgY2hpbGRyZW4gZm9yIGFueSBzZGNNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRzIHRoYXQgbWF5IGJlIGluIGFuIGVsZW1lbnQgdGhhdCBhcHBlYXJzIGRlZXBlciBpbiB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICBpZiAocHJldk5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYgcGFyZW50TG9va3VwLmluZGV4T2YocHJldk5vZGUpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMb29rdXAucHVzaChwcmV2Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Tm9kZSA9IHByZXZOb2RlLmNoaWxkTm9kZXNbcHJldk5vZGUuY2hpbGROb2Rlcy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZOb2RlID0gcHJldk5vZGUucHJldmlvdXNTaWJsaW5nIHx8IHByZXZOb2RlLnBhcmVudE5vZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGluc2VydE1lc3NhZ2VOb2RlKHBhcmVudCwgY29tbWVudCwga2V5KSB7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VOb2RlID0gbWVzc2FnZXNba2V5XTsKKyAgICAgICAgICAgICAgICBpZiAoIWN0cmwuaGVhZCkgeworICAgICAgICAgICAgICAgICAgICBjdHJsLmhlYWQgPSBtZXNzYWdlTm9kZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBmaW5kUHJldmlvdXNNZXNzYWdlKHBhcmVudCwgY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5vZGUubmV4dCA9IG1hdGNoLm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5uZXh0ID0gbWVzc2FnZU5vZGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTm9kZS5uZXh0ID0gY3RybC5oZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgY3RybC5oZWFkID0gbWVzc2FnZU5vZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZU1lc3NhZ2VOb2RlKHBhcmVudCwgY29tbWVudCwga2V5KSB7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VOb2RlID0gbWVzc2FnZXNba2V5XTsKKworICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IGZpbmRQcmV2aW91c01lc3NhZ2UocGFyZW50LCBjb21tZW50KTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2gubmV4dCA9IG1lc3NhZ2VOb2RlLm5leHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3RybC5oZWFkID0gbWVzc2FnZU5vZGUubmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpc0F0dHJUcnV0aHkgPSAoc2NvcGUsIGF0dHIpOmFueSA9PiB7CisgICAgICAgICAgICByZXR1cm4gKGFuZ3VsYXIuaXNTdHJpbmcoYXR0cikgJiYgYXR0ci5sZW5ndGggPT09IDApIHx8IC8vZW1wdHkgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgdGhpcy50cnV0aHkoc2NvcGUuJGV2YWwoYXR0cikpOworICAgICAgICB9CisKKyAgICAgICAgdHJ1dGh5ID0gKHZhbCk6YW55ID0+IHsKKyAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmlzU3RyaW5nKHZhbCkgPyB2YWwubGVuZ3RoIDogISF2YWw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIFNkY01lc3NhZ2VzRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCckYW5pbWF0ZSddOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NkY19tZXNzYWdlcy9zZGNfbWVzc2FnZXMuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjX21lc3NhZ2VzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliMWNhZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjX21lc3NhZ2VzLmh0bWwKQEAgLTAsMCArMSBAQAorPHNwYW4+YWFhPC9zcGFuPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3NtYXJ0LXRvb2x0aXAvc21hcnQtdG9vbHRpcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zbWFydC10b29sdGlwL3NtYXJ0LXRvb2x0aXAudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhNTcyNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zbWFydC10b29sdGlwL3NtYXJ0LXRvb2x0aXAudHMKQEAgLTAsMCArMSw4NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRGlyZWN0aXZlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJU21hcnRUb29sdGlwU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBzZGNTbWFydFRvb2xpcDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU21hcnRUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgbmcuSURpcmVjdGl2ZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGNvbXBpbGU6bmcuSUNvbXBpbGVTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnQSc7CisgICAgICAgIHB1YmxpYyB0cmFuc2NsdWRlID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIGxpbmsgPSAoc2NvcGU6SVNtYXJ0VG9vbHRpcFNjb3BlLCAkZWxlbTpuZy5JQXVnbWVudGVkSlF1ZXJ5LCAkYXR0cnM6YW5ndWxhci5JQXR0cmlidXRlcykgPT4geworCisgICAgICAgICAgICBpZiAoJGVsZW1bMF0uaGFzQXR0cmlidXRlKCdzdHlsZScpPT09ZmFsc2UpeworICAgICAgICAgICAgICAgICRlbGVtWzBdLnNldEF0dHJpYnV0ZSgic3R5bGUiLCAib3ZlcmZsb3c6IGhpZGRlbjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBzdHlsZXMgPSAkZWxlbS5hdHRyKCdzdHlsZScpOworICAgICAgICAgICAgICAgICRlbGVtWzBdLnNldEF0dHJpYnV0ZSgic3R5bGUiLCBzdHlsZXMgKyAiO292ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkZWxlbS5iaW5kKCdtb3VzZWVudGVyJywgKCkgPT4geworICAgICAgICAgICAgICAgIGlmKCRlbGVtWzBdLm9mZnNldFdpZHRoIDwgJGVsZW1bMF0uc2Nyb2xsV2lkdGggJiYgISRlbGVtLmF0dHIoJ3Rvb2x0aXBzJykpeworICAgICAgICAgICAgICAgICAgICAkYXR0cnMuJHNldCgndG9vbHRpcHMnLCAndG9vbHRpcHMnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRhdHRyc1snc2RjU21hcnRUb29sdGlwJ10gJiYgJGF0dHJzWydzZGNTbWFydFRvb2x0aXAnXS5sZW5ndGg+MCl7CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbS5hdHRyKCd0b29sdGlwLWNvbnRlbnQnLCAkYXR0cnNbJ3NkY1NtYXJ0VG9vbHRpcCddKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhdHRycy4kc2V0KCd0b29sdGlwLWNvbnRlbnQnLCAkZWxlbS50ZXh0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9PbmUgcG9zc2libGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGUgbmdJZiBpcyBwbGFjZWQgb24gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgdGVtcGxhdGUuCisgICAgICAgICAgICAgICAgICAgIC8vbmdJZiByZW1vdmVzIHRoZSBub2RlIGFuZCBwbGFjZXMgYSBjb21tZW50IGluIGl0J3MgcGxhY2UuIFRoZW4gaXQgd2F0Y2hlcyBvdmVyIHRoZSBleHByZXNzaW9uIGFuZCBhZGRzL3JlbW92ZXMgdGhlIGFjdHVhbCBIVE1MIGVsZW1lbnQgYXMgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgICAgICAvL1RoZSBwcm9ibGVtIHNlZW1zIHRvIGJlIHRoYXQgaWYgaXQgaXMgcGxhY2VkIG9uIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIHRlbXBsYXRlLCB0aGVuIGEgc2luZ2xlIGNvbW1lbnQgaXMgd2hhdCBpcyBsZWZ0IGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vd2hvbGUgdGVtcGxhdGUgKGV2ZW4gaWYgb25seSB0ZW1wb3JhcmlseSksIHdoaWNoIGdldHMgaWdub3JlZCAoSSBhbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGJyb3dzZXItc3BlY2lmaWMgYmVoYXZpb3VyKSwgcmVzdWx0aW5nIGluIGFuIGVtcHR5IHRlbXBsYXRlLgorCisgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBuZy1pZiBhdHRyaWJ1dGUgYW5kIGl0cyB2YWx1ZSAoaWYgd2UgcmVhY2ggaGVyZSwgd2UgcGFzcyBuZy1pZiAobmctaWY9PT10cnVlKSwgc28gd2UgY2FuIHJlbW92ZSBpdCkuCisgICAgICAgICAgICAgICAgICAgICRlbGVtLnJlbW92ZUF0dHIoJ25nLWlmJyk7CisgICAgICAgICAgICAgICAgICAgICRlbGVtLnJlbW92ZUF0dHIoJ2RhdGEtbmctaWYnKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbWUgKHRoZSBkaXJlY3RpdmUgZnJvbSB0aGUgZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlID0gJGVsZW1bMF0ub3V0ZXJIVE1MOworICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoJ3NkYy1zbWFydC10b29sdGlwPSIiJywnJyk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgnc2RjLXNtYXJ0LXRvb2x0aXA9IicgKyAkZWxlbS50ZXh0KCkgKyAnIicsJycpOworICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRlbXBsYXRlKTsKKworICAgICAgICAgICAgICAgICAgICBsZXQgZWwgPSB0aGlzLiRjb21waWxlKHRlbXBsYXRlKShzY29wZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVsKTsKKyAgICAgICAgICAgICAgICAgICAgJGVsZW0ucmVwbGFjZVdpdGgoZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeSA9ICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRjb21waWxlOm5nLklDb21waWxlU2VydmljZSk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNtYXJ0VG9vbHRpcERpcmVjdGl2ZSgkdGVtcGxhdGVDYWNoZSwgJGNvbXBpbGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgU21hcnRUb29sdGlwRGlyZWN0aXZlLmZhY3RvcnkuJGluamVjdCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCAnJGNvbXBpbGUnXTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy93aXphcmRfc3RlcHMvc2RjLXdpemFyZC1zdGVwcy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3dpemFyZF9zdGVwcy9zZGMtd2l6YXJkLXN0ZXBzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5Yjk3YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy93aXphcmRfc3RlcHMvc2RjLXdpemFyZC1zdGVwcy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzx1bCBjbGFzcz0ic2RjLXdpemFyZC1zdGVwIj4KKyAgICA8bGkgY2xhc3M9InN0ZXAiIGRhdGEtbmctcmVwZWF0PSJzdGVwIGluIHN0ZXBzIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtd3JhcHBlciI+CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdGVwLWluZGV4IgorICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iY29udHJvbGxlclN0ZXBDbGlja2VkKHN0ZXAubmFtZSkiCisgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogc3RlcC5zZWxlY3RlZD09PXRydWUsICd2YWxpZCc6IHN0ZXAudmFsaWQ9PT10cnVlLCAnZGlzYWJsZWQnOiAhc3RlcC5lbmFibGVkIHx8IHN0ZXAuZW5hYmxlZD09PWZhbHNlfSI+CisgICAgICAgICAgICAgICAgICB7eyRpbmRleCsxfX0KKyAgICAgICAgICAgIDwvYnV0dG9uPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtbmFtZSIKKyAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiBzdGVwLnNlbGVjdGVkPT09dHJ1ZSwgJ3ZhbGlkJzogc3RlcC52YWxpZD09PXRydWUsICdkaXNhYmxlZCc6ICFzdGVwLmVuYWJsZWQgfHwgc3RlcC5lbmFibGVkPT09ZmFsc2V9Ij57e3N0ZXAubmFtZX19CisgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLXNlcGVyYXRvciI+PC9kaXY+CisgICAgPC9saT4KKzwvdWw+CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy93aXphcmRfc3RlcHMvc2RjLXdpemFyZC1zdGVwcy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3dpemFyZF9zdGVwcy9zZGMtd2l6YXJkLXN0ZXBzLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3Nzc5MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy93aXphcmRfc3RlcHMvc2RjLXdpemFyZC1zdGVwcy5sZXNzCkBAIC0wLDAgKzEsNjkgQEAKK0BjaXJjbGUtcmFkaXVzOiAxOHB4OworQGdhcDogNzBweDsKK0BnYXAtd2lkdGg6IDJweDsKK0B2YWxpZC13aWR0aDogMnB4OworCit1bC5zZGMtd2l6YXJkLXN0ZXAgeworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwOworCisgICAgbGkuc3RlcCB7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKKworICAgICAgICAuc3RlcC13cmFwcGVyIHsKKyAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiBAY2lyY2xlLXJhZGl1cyoyOworICAgICAgICAgICAgaGVpZ2h0OiBAY2lyY2xlLXJhZGl1cyoyOworICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogQGdhcDsKKworICAgICAgICAgICAgYnV0dG9uLnN0ZXAtaW5kZXggeworICAgICAgICAgICAgICAgIC5fdy1zZGMtd2l6YXJkLXN0ZXAtYnRuKEBjaXJjbGUtcmFkaXVzKTsKKyAgICAgICAgICAgICAgICB6LWluZGV4OiA5OTsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisKKyAgICAgICAgICAgICAgICAmLnZhbGlkIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcGFuLnN0ZXAtbmFtZSB7CisgICAgICAgICAgICAgICAgLmJfNzsKKyAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogQGNpcmNsZS1yYWRpdXM7CisgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgICAgICAgICB3aWR0aDogY2FsYyh+IjEwMCUiIC0gQGNpcmNsZS1yYWRpdXMqMiArIDQpOworICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OworICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CisKKyAgICAgICAgICAgICAgICAmLnNlbGVjdGVkIHsKKyAgICAgICAgICAgICAgICAgICAgLmFfNzsKKyAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgJi5kaXNhYmxlZCB7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuc3RlcC1zZXBlcmF0b3IgeworICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiBAZ2FwLXdpZHRoIHNvbGlkIEBjb2xvcl9uOworICAgICAgICAgICAgaGVpZ2h0OiBAZ2FwICsgQGNpcmNsZS1yYWRpdXMqMjsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIHRvcDogQGNpcmNsZS1yYWRpdXMqMi1AY2lyY2xlLXJhZGl1czsKKyAgICAgICAgICAgIGxlZnQ6IEBjaXJjbGUtcmFkaXVzIC0gQGdhcC13aWR0aC8yOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBsaS5zdGVwOmxhc3QtY2hpbGQgeworICAgICAgICAuc3RlcC1zZXBlcmF0b3IgeworICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3dpemFyZF9zdGVwcy9zZGMtd2l6YXJkLXN0ZXBzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3dpemFyZF9zdGVwcy9zZGMtd2l6YXJkLXN0ZXBzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYWQzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvd2l6YXJkX3N0ZXBzL3NkYy13aXphcmQtc3RlcHMudHMKQEAgLTAsMCArMSwxMzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkRpcmVjdGl2ZXMgeworCisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJV2l6YXJkU3RlcCB7CisgICAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgICAgc2VsZWN0ZWQ/OiBib29sZWFuOworICAgICAgICB2YWxpZD86Ym9vbGVhbjsKKyAgICAgICAgZW5hYmxlZD86Ym9vbGVhbjsKKyAgICAgICAgY2FsbGJhY2s6IEZ1bmN0aW9uOworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVNkY1dpemFyZFN0ZXBTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIHN0ZXBzOkFycmF5PElXaXphcmRTdGVwPjsKKyAgICAgICAgY29udHJvbDphbnk7CisgICAgICAgIGludGVybmFsQ29udHJvbDphbnk7CisKKyAgICAgICAgc3RlcENsaWNrZWQoc3RlcE5hbWU6c3RyaW5nKTp2b2lkOworICAgICAgICBjb250cm9sbGVyU3RlcENsaWNrZWQoc3RlcE5hbWU6c3RyaW5nKTp2b2lkOworCisgICAgICAgIHNldFN0ZXBWYWxpZGl0eShzdGVwTmFtZTpzdHJpbmcsIHZhbGlkOmJvb2xlYW4pOnZvaWQ7CisgICAgICAgIGNvbnRyb2xsZXJTZXRTdGVwVmFsaWRpdHkoc3RlcDpJV2l6YXJkU3RlcCwgdmFsaWQ6Ym9vbGVhbik6dm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIFNkY1dpemFyZFN0ZXBNZXRob2RzIHsKKyAgICAgICAgdW5TZWxlY3RBbGxTdGVwcygpOnZvaWQ7CisgICAgICAgIHNlbGVjdFN0ZXAoc3RlcDpJV2l6YXJkU3RlcCk6dm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU2RjV2l6YXJkU3RlcERpcmVjdGl2ZSBpbXBsZW1lbnRzIG5nLklEaXJlY3RpdmUgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBzY29wZSA9IHsKKyAgICAgICAgICAgIHN0ZXBzOiAnPScsCisgICAgICAgICAgICBjb250cm9sOiAnPScKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgcmVzdHJpY3QgPSAnRSc7CisgICAgICAgIHB1YmxpYyB0cmFuc2NsdWRlID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIGNvbnRyb2xsZXIgPSBTZGNXaXphcmRTdGVwRGlyZWN0aXZlQ29udHJvbGxlcjsKKworICAgICAgICB0ZW1wbGF0ZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3dpemFyZF9zdGVwcy9zZGMtd2l6YXJkLXN0ZXBzLmh0bWwnKTsKKyAgICAgICAgfTsKKworICAgICAgICBsaW5rID0gKHNjb3BlOklTZGNXaXphcmRTdGVwU2NvcGUsICRlbGVtOkpRdWVyeSwgYXR0cjphbnksIGNvbnRyb2xsZXI6U2RjV2l6YXJkU3RlcERpcmVjdGl2ZUNvbnRyb2xsZXIpID0+IHsKKyAgICAgICAgICAgIHNjb3BlLmludGVybmFsQ29udHJvbCA9IHNjb3BlLmNvbnRyb2wgfHwge307CisgICAgICAgICAgICBzY29wZS5pbnRlcm5hbENvbnRyb2wuc3RlcENsaWNrZWQgPSAoc3RlcDpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLmNvbnRyb2xsZXJTdGVwQ2xpY2tlZChzdGVwKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmludGVybmFsQ29udHJvbC5zZXRTdGVwVmFsaWRpdHkgPSAoc3RlcDpJV2l6YXJkU3RlcCwgdmFsaWQ6Ym9vbGVhbik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc2NvcGUuY29udHJvbGxlclNldFN0ZXBWYWxpZGl0eShzdGVwLCB2YWxpZCk7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmYWN0b3J5ID0gKCR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSk9PiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNkY1dpemFyZFN0ZXBEaXJlY3RpdmUoJHRlbXBsYXRlQ2FjaGUpOworICAgICAgICB9OworCisgICAgfQorCisgICAgU2RjV2l6YXJkU3RlcERpcmVjdGl2ZS5mYWN0b3J5LiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJ107CisKKyAgICBleHBvcnQgY2xhc3MgU2RjV2l6YXJkU3RlcERpcmVjdGl2ZUNvbnRyb2xsZXIgeworICAgICAgICBzdGF0aWMgJGluamVjdCA9IFsnJGVsZW1lbnQnLCAnJHNjb3BlJ107CisKKyAgICAgICAgbWV0aG9kczpTZGNXaXphcmRTdGVwTWV0aG9kcyA9IDxTZGNXaXphcmRTdGVwTWV0aG9kcz57fTsKKworICAgICAgICBjb25zdHJ1Y3RvcihwdWJsaWMgJGVsZW1lbnQ6IEpRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljICRzY29wZTogSVNkY1dpemFyZFN0ZXBTY29wZSkgeworCisgICAgICAgICAgICB0aGlzLmluaXRNZXRob2RzKCk7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29udHJvbGxlclN0ZXBDbGlja2VkID0gKHN0ZXBOYW1lOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU3RlcDpJV2l6YXJkU3RlcCA9IDxJV2l6YXJkU3RlcD5fLmZpbmQodGhpcy4kc2NvcGUuc3RlcHMsIGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IHN0ZXBOYW1lOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU3RlcCAmJiBzZWxlY3RlZFN0ZXAuZW5hYmxlZD09PXRydWUpeworICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OmJvb2xlYW4gPSBzZWxlY3RlZFN0ZXAuY2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD09PXRydWUpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRob2RzLnVuU2VsZWN0QWxsU3RlcHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kcy5zZWxlY3RTdGVwKHNlbGVjdGVkU3RlcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb250cm9sbGVyU2V0U3RlcFZhbGlkaXR5ID0gKHN0ZXA6SVdpemFyZFN0ZXAsIHZhbGlkOmJvb2xlYW4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHN0ZXAudmFsaWQ9dmFsaWQ7CisgICAgICAgICAgICB9OworCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0TWV0aG9kcyA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLm1ldGhvZHMudW5TZWxlY3RBbGxTdGVwcyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnN0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0ZXApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RlcC5zZWxlY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLm1ldGhvZHMuc2VsZWN0U3RlcCA9IChzdGVwOklXaXphcmRTdGVwKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RlcC5lbmFibGVkPT09dHJ1ZSl7CisgICAgICAgICAgICAgICAgICAgIHN0ZXAuc2VsZWN0ZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9fY2F0ZWdvcnktbmFtZS1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvX2NhdGVnb3J5LW5hbWUtZmlsdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YmJmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvX2NhdGVnb3J5LW5hbWUtZmlsdGVyLnRzCkBAIC0wLDAgKzEsNDAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkZpbHRlcnMgeworCisgICAgZXhwb3J0IGNsYXNzIENhdGVnb3J5TmFtZUZpbHRlcnsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgICAgIGxldCBmaWx0ZXIgPSA8Q2F0ZWdvcnlOYW1lRmlsdGVyPiggKG5hbWU6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgaWYobmFtZSl7CisgICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lOnN0cmluZyA9ICBfLmxhc3QobmFtZS5zcGxpdCgnLycpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUpeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld05hbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9jYXBpdGFsaXplLWZpbHRlci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9jYXBpdGFsaXplLWZpbHRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjA0NjlhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2NhcGl0YWxpemUtZmlsdGVyLnRzCkBAIC0wLDAgKzEsNDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCittb2R1bGUgU2RjLkZpbHRlcnMgeworCisgICAgZXhwb3J0IGNsYXNzIENhcGl0YWxpemVGaWx0ZXJ7CisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICBsZXQgZmlsdGVyID0gPENhcGl0YWxpemVGaWx0ZXI+KCAoc2VudGVuY2U6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHNlbnRlbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1NlbnRlbmNlOnN0cmluZyA9ICIiOworICAgICAgICAgICAgICAgICAgICBsZXQgd29yZHMgPSBzZW50ZW5jZS5zcGxpdCgnICcpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSl7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZDpzdHJpbmcgPSB3b3Jkc1tpXS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VudGVuY2UgKz0gd29yZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK3dvcmQuc3Vic3RyaW5nKDEpICsgJyAnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdTZW50ZW5jZS50cmltKCk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW50ZW5jZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2NhdGFsb2ctc3RhdHVzLWZpbHRlci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9jYXRhbG9nLXN0YXR1cy1maWx0ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzODJmNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9jYXRhbG9nLXN0YXR1cy1maWx0ZXIudHMKQEAgLTAsMCArMSw0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMTkvMDgvMjAxNS4KKyAqLworbW9kdWxlIFNkYy5GaWx0ZXJzIHsKKworICAgIGV4cG9ydCBjbGFzcyBDYXRhbG9nU3RhdHVzRmlsdGVyeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxDYXRhbG9nU3RhdHVzRmlsdGVyPiggKHN0YXR1c2VzOmFueSkgPT4geworICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJlZCA9IFtdOworICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzdGF0dXNlcywgZnVuY3Rpb24oc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnB1c2goc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2NhdGVnb3J5LWljb24tZmlsdGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2NhdGVnb3J5LWljb24tZmlsdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTZhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvY2F0ZWdvcnktaWNvbi1maWx0ZXIudHMKQEAgLTAsMCArMSw1NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRmlsdGVycyB7CisKKyAgICBleHBvcnQgY2xhc3MgQ2F0ZWdvcnlJY29uRmlsdGVyeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxDYXRlZ29yeUljb25GaWx0ZXI+KCAoY2F0ZWdvcnk6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICBsZXQgbWFwID0geworICAgICAgICAgICAgICAgICAgICdBcHBsaWNhdGlvbiBMYXllciA0Ky9BcHBsaWNhdGlvbiBTZXJ2ZXJzJzogWydhcHBsaWNhdGlvblNlcnZlcicsICdzZXJ2ZXInXSwKKyAgICAgICAgICAgICAgICAgICAnQXBwbGljYXRpb24gTGF5ZXIgNCsvTWVkaWEgU2VydmVycyc6IFsnYXBwbGljYXRpb25TZXJ2ZXInLCAnc2VydmVyJ10sCisgICAgICAgICAgICAgICAgICAgJ0FwcGxpY2F0aW9uIExheWVyIDQrL1dlYiBTZXJ2ZXInOiBbJ2FwcGxpY2F0aW9uU2VydmVyJywgJ3NlcnZlciddLAorICAgICAgICAgICAgICAgICAgICdOZXR3b3JrIExheWVyIDQrL0NvbW1vbiBOZXR3b3JrIFJlc291cmNlcyc6IFsnbmV0d29yaycsICdsb2FkQmFsYW5jZXInXSwKKyAgICAgICAgICAgICAgICAgICAnR2VuZXJpYy9JbmZyYXN0cnVjdHVyZSc6IFsnb2JqZWN0U3RvcmFnZScsICdjb21wdXRlJ10sCisgICAgICAgICAgICAgICAgICAgJ0dlbmVyaWMvTmV0d29yayBFbGVtZW50cyc6IFsncG9ydCcsICduZXR3b3JrJywgJ3JvdXRlciddLAorICAgICAgICAgICAgICAgICAgICdBcHBsaWNhdGlvbiBMYXllciA0Ky9EYXRhYmFzZSc6IFsnZGF0YWJhc2UnXSwKKyAgICAgICAgICAgICAgICAgICAnR2VuZXJpYy9EYXRhYmFzZSc6IFsnZGF0YWJhc2UnXSwKKyAgICAgICAgICAgICAgICAgICAnTmV0d29yayBMYXllciAyLTMvUm91dGVyJzogWydyb3V0ZXInXSwKKyAgICAgICAgICAgICAgICAgICAnTmV0d29yayBMYXllciAyLTMvR2F0ZXdheSc6IFsnZ2F0ZXdheSddLAorICAgICAgICAgICAgICAgICAgICdOZXR3b3JrIExheWVyIDItMy9MQU4gQ29ubmVjdG9ycyc6IFsnY29ubmVjdG9yJ10sCisgICAgICAgICAgICAgICAgICAgJ05ldHdvcmsgTGF5ZXIgMi0zL1dBTiBDb25uZWN0b3JzJzogWydjb25uZWN0b3InXSwKKyAgICAgICAgICAgICAgICAgICAnQXBwbGljYXRpb24gTGF5ZXIgNCsvQm9yZGVyIEVsZW1lbnRzJzogWydib3JkZXJFbGVtZW50J10sCisgICAgICAgICAgICAgICAgICAgJ0FwcGxpY2F0aW9uIExheWVyIDQrL0xvYWQgQmFsYW5jZXInOiBbJ2xvYWRCYWxhbmNlciddLAorICAgICAgICAgICAgICAgICAgICdBcHBsaWNhdGlvbiBMYXllciA0Ky9DYWxsIENvbnRyb2wnOiBbJ2NhbGxfY29udHJvbGwnXSwKKyAgICAgICAgICAgICAgICAgICAnVm9JUCBDYWxsIENvbnRyb2wnOiBbJ2NhbGxfY29udHJvbGwnXSwKKyAgICAgICAgICAgICAgICAgICAnTW9iaWxpdHknOiBbJ21vYmlsaXR5J10sCisgICAgICAgICAgICAgICAgICAgJ05ldHdvcmsgTDEtMyc6IFsnbmV0d29ya19sXzEtMyddLAorICAgICAgICAgICAgICAgICAgICdOZXR3b3JrIEw0JzogWyduZXR3b3JrX2xfNCddCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcFtjYXRlZ29yeV07CisKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9jYXRlZ29yeS10eXBlLWZpbHRlci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9jYXRlZ29yeS10eXBlLWZpbHRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJlNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2NhdGVnb3J5LXR5cGUtZmlsdGVyLnRzCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkZpbHRlcnMgeworCisgICAgZXhwb3J0IGNsYXNzIENhdGVnb3J5VHlwZUZpbHRlciB7CisKKyAgICAgICAgc3RhdGljICRpbmplY3QgPSBbJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnXTsKKworICAgICAgICBjb25zdHJ1Y3RvcihjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlKSB7CisgICAgICAgICAgICBsZXQgZmlsdGVyID0gPENhdGVnb3J5VHlwZUZpbHRlcj4gKGNhdGVnb3JpZXM6YW55LCBzZWxlY3RlZFR5cGU6QXJyYXk8c3RyaW5nPikgPT4geworCisgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFR5cGUubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2F0ZWdvcmllczsKKworICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJlZENhdGVnb3JpZXM6YW55ID0gW107CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUeXBlLmZvckVhY2goKHR5cGU6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkQ2F0ZWdvcmllcyA9IGZpbHRlcmVkQ2F0ZWdvcmllcy5jb25jYXQoY2FjaGVTZXJ2aWNlLmdldCh0eXBlLnRvTG93ZXJDYXNlKCkgKyAnQ2F0ZWdvcmllcycpKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbHRlcihjYXRlZ29yaWVzLCBmdW5jdGlvbiAoY2F0ZWdvcnk6YW55KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZENhdGVnb3JpZXMuaW5kZXhPZihjYXRlZ29yeSkgIT0gLTE7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9jbGVhci13aGl0ZXNwYWNlcy1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvY2xlYXItd2hpdGVzcGFjZXMtZmlsdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTQ2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvY2xlYXItd2hpdGVzcGFjZXMtZmlsdGVyLnRzCkBAIC0wLDAgKzEsMzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkZpbHRlcnMgeworCisgICAgZXhwb3J0IGNsYXNzIENsZWFyV2hpdGVTcGFjZXNGaWx0ZXIgeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxDbGVhcldoaXRlU3BhY2VzRmlsdGVyPiggKHRleHQ6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgaWYgKCFhbmd1bGFyLmlzU3RyaW5nKHRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoLyAvZywnJyk7IC8vIHJlbW92ZSBhbHNvIHdoaXRlc3BhY2VzIGluc2lkZQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2VudGl0eS1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvZW50aXR5LWZpbHRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTYwZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2VudGl0eS1maWx0ZXIudHMKQEAgLTAsMCArMSwxMTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLkZpbHRlcnMgeworCisgICAgZXhwb3J0IGNsYXNzIEVudGl0eUZpbHRlcnsKKworICAgIGNvbnN0cnVjdG9yKCkgeworCisgICAgICAgIGxldCBmaWx0ZXIgPSA8RW50aXR5RmlsdGVyPiggKGNvbXBvbmVudHM6QXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiwgZmlsdGVyOmFueSkgPT4geworCisgICAgICAgICAgICBsZXQgZmlsdGVyZWRDb21wb25lbnRzOkFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPSBjb21wb25lbnRzOworCisgICAgICAgICAgICAvLyBmaWx0ZXIgYnkgdHlwZQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIGlmICgoZmlsdGVyLnNlbGVjdGVkQ29tcG9uZW50VHlwZXMgJiYgZmlsdGVyLnNlbGVjdGVkQ29tcG9uZW50VHlwZXMubGVuZ3RoPjApIHx8IChmaWx0ZXIuc2VsZWN0ZWRSZXNvdXJjZVN1YlR5cGVzICYmIGZpbHRlci5zZWxlY3RlZFJlc291cmNlU3ViVHlwZXMubGVuZ3RoPjApKSB7CisgICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkVHlwZXMgPSBbXTsKKyAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goY29tcG9uZW50cywgKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgYnkgY29tcG9uZW50IHR5cGUKKyAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGVMb3dlcjpzdHJpbmcgPSBjb21wb25lbnQuY29tcG9uZW50VHlwZS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZUZpcnN0Q2FwaXRhbDpzdHJpbmcgPSB0eXBlTG93ZXIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eXBlTG93ZXIuc2xpY2UoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuc2VsZWN0ZWRDb21wb25lbnRUeXBlcy5pbmRleE9mKHR5cGVGaXJzdENhcGl0YWwpICE9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlcy5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgYnkgcmVzb3VyY2Ugc3ViIHR5cGUsIG9ubHkgaW4gY2FzZSB0aGUgcmVzb3VyY2UgY2hlY2tib3ggd2FzIG5vdCBzZWxlY3RlZCAoYmVjYXVzZSBpbiB0aGlzIGNhc2Ugd2UgYWxyZWFkeSBhZGRlZCBhbGwgdGhlIGNvbXBvbmVudHMgaW4gYWJvdmUgc2VjdGlvbikuCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuaXNSZXNvdXJjZSgpICYmIGZpbHRlci5zZWxlY3RlZENvbXBvbmVudFR5cGVzLmluZGV4T2YoIlJlc291cmNlIikgPT09IC0xICYmIGZpbHRlci5zZWxlY3RlZFJlc291cmNlU3ViVHlwZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9maWx0ZXJlZENvbXBvbmVudHMucG9wKCk7IC8vIFJlbW92ZSB0aGUgbGFzdCBpbnNlcnRlZCBjb21wb25lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzb3VyY2U6U2RjLk1vZGVscy5Db21wb25lbnRzLlJlc291cmNlID0gPFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZT5jb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLnNlbGVjdGVkUmVzb3VyY2VTdWJUeXBlcy5pbmRleE9mKHJlc291cmNlLmdldENvbXBvbmVudFN1YlR5cGUoKSkgIT09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlcy5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZENvbXBvbmVudHMgPSBmaWx0ZXJlZFR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaWx0ZXIgYnkgY2F0ZWdvcmllcyAmIHN1YmNhdGVnb3JpZXMgJiBncm91cGluZ3MKKyAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBpZiAoZmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsICYmIGZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbC5sZW5ndGg+MCkgeworICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJlZENhdGVnb3JpZXMgPSBbXTsKKyAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZmlsdGVyZWRDb21wb25lbnRzLCAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuY2F0ZWdvcmllcyAmJiBmaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwuaW5kZXhPZihjb21wb25lbnQuY2F0ZWdvcmllc1swXS51bmlxdWVJZCkgIT09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZENhdGVnb3JpZXMucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC5jYXRlZ29yaWVzICYmIGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXMgJiYgZmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsLmluZGV4T2YoY29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS51bmlxdWVJZCkgIT09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZENhdGVnb3JpZXMucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC5jYXRlZ29yaWVzICYmIGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXMgJiYgY29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS5ncm91cGluZ3MgJiYgZmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsLmluZGV4T2YoY29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS5ncm91cGluZ3NbMF0udW5pcXVlSWQpICE9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRDYXRlZ29yaWVzLnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGZpbHRlcmVkQ29tcG9uZW50cyA9IGZpbHRlcmVkQ2F0ZWdvcmllczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZmlsdGVyIGJ5IHN0YXR1c2VzCisgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgaWYgKGZpbHRlci5zZWxlY3RlZFN0YXR1c2VzICYmIGZpbHRlci5zZWxlY3RlZFN0YXR1c2VzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAvL2NvbnZlcnQgYXJyYXkgb2YgYXJyYXkgdG8gc3RyaW5nIGFycmF5CisgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU3RhdHVzZXM6QXJyYXk8c3RyaW5nPiA9IFtdLmNvbmNhdC5hcHBseShbXSxmaWx0ZXIuc2VsZWN0ZWRTdGF0dXNlcyk7CisKKyAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRTdGF0dXNlcyA9IFtdOworICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChmaWx0ZXJlZENvbXBvbmVudHMsIChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU3RhdHVzZXMuaW5kZXhPZihjb21wb25lbnQubGlmZWN5Y2xlU3RhdGUpID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkU3RhdHVzZXMucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vaWYgc3RhdHVzIERJU1RSSUJVVEVEICYmIENFUlRJRklFRCBhcmUgc2VsZWN0ZWQgdGhlIGNvbXBvbmVudCB3aWxsIGFkZGVkIGluICBDRVJUSUZJRUQgc3RhdHVzICwgbm90IG5lZWQgdG8gYWRkIHR3aWNlCisgICAgICAgICAgICAgICAgICAgIGlmKHNlbGVjdGVkU3RhdHVzZXMuaW5kZXhPZignRElTVFJJQlVURUQnKSA+IC0xICYmICEoc2VsZWN0ZWRTdGF0dXNlcy5pbmRleE9mKCdDRVJUSUZJRUQnKSA+IC0xKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29tcG9uZW50LmRpc3RyaWJ1dGlvblN0YXR1cyAmJiBjb21wb25lbnQuZGlzdHJpYnV0aW9uU3RhdHVzLmluZGV4T2YoJ0RJU1RSSUJVVEVEJykgPiAtMSAmJiBjb21wb25lbnQubGlmZWN5Y2xlU3RhdGUuaW5kZXhPZignQ0VSVElGSUVEJykgPiAtMSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRTdGF0dXNlcy5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZENvbXBvbmVudHMgPSBmaWx0ZXJlZFN0YXR1c2VzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaWx0ZXIgYnkgc3RhdHVzZXMgYW5kIGRpc3RyaWJ1dGVkCisgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgaWYgKGZpbHRlci5kaXN0cmlidXRlZCAhPSB1bmRlZmluZWQgJiYgZmlsdGVyLmRpc3RyaWJ1dGVkLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBsZXQgZmlsdGVyRGlzdHJpYnV0ZWQ6IEFycmF5PGFueT4gPSBmaWx0ZXIuZGlzdHJpYnV0ZWQ7CisgICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkRGlzdHJpYnV0ZWQgPSBbXTsKKyAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZmlsdGVyZWRDb21wb25lbnRzLCAoZW50aXR5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlckRpc3RyaWJ1dGVkLmZvckVhY2goKGRpc3RyaWJ1dGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXN0cmlidXRlSXRlbSA9IGRpc3RyaWJ1dGUuc3BsaXQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVJdGVtLmZvckVhY2goKGl0ZW0pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkICYmIGVudGl0eS5kaXN0cmlidXRpb25TdGF0dXMgPT09IGl0ZW0peworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERpc3RyaWJ1dGVkLnB1c2goZW50aXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZENvbXBvbmVudHMgPSBmaWx0ZXJlZERpc3RyaWJ1dGVkOworICAgICAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmaWx0ZXJlZENvbXBvbmVudHM7CisgICAgICB9KTsKKworICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2dyYXBoLXJlc291cmNlLW5hbWUtZmlsdGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL2dyYXBoLXJlc291cmNlLW5hbWUtZmlsdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjBkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvZ3JhcGgtcmVzb3VyY2UtbmFtZS1maWx0ZXIudHMKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRmlsdGVycyB7CisKKyAgICBleHBvcnQgY2xhc3MgR3JhcGhSZXNvdXJjZU5hbWVGaWx0ZXIgeworCisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICBsZXQgZmlsdGVyID0gPEdyYXBoUmVzb3VyY2VOYW1lRmlsdGVyPiggKG5hbWU6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOworICAgICAgICAgICAgICAgIGNvbnRleHQuZm9udCA9ICIxM3B4IEFyaWFsIjsKKworICAgICAgICAgICAgICAgIGlmKDY3IDwgY29udGV4dC5tZWFzdXJlVGV4dChuYW1lKS53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TGVuID0gbmFtZS5sZW5ndGggLSAzOworICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5ld0xlbik7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDU5IDwgKGNvbnRleHQubWVhc3VyZVRleHQobmV3TmFtZSkud2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gbmV3TmFtZS5zdWJzdHJpbmcoMCwgKC0tbmV3TGVuKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld05hbWUgKyAnLi4uJzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3Byb2R1Y3QtY2F0ZWdvcnktbmFtZS1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcHJvZHVjdC1jYXRlZ29yeS1uYW1lLWZpbHRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU4YzdlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3Byb2R1Y3QtY2F0ZWdvcnktbmFtZS1maWx0ZXIudHMKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK21vZHVsZSBTZGMuRmlsdGVycyB7CisKKyAgICBleHBvcnQgY2xhc3MgUHJvZHVjdENhdGVnb3J5TmFtZUZpbHRlcnsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgICAgIGxldCBmaWx0ZXIgPSA8Q2F0ZWdvcnlOYW1lRmlsdGVyPiggKG5hbWU6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgaWYobmFtZSl7CisgICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lOnN0cmluZyA9ICBuYW1lLnNwbGl0KCcvJylbMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdOYW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gZmlsdGVyOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcHJvZHVjdC1zdWJjYXRlZ29yeS1uYW1lLWZpbHRlci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9wcm9kdWN0LXN1YmNhdGVnb3J5LW5hbWUtZmlsdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDdhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcHJvZHVjdC1zdWJjYXRlZ29yeS1uYW1lLWZpbHRlci50cwpAQCAtMCwwICsxLDM5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworbW9kdWxlIFNkYy5GaWx0ZXJzIHsKKworICAgIGV4cG9ydCBjbGFzcyBQcm9kdWN0U3ViQ2F0ZWdvcnlOYW1lRmlsdGVyeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxDYXRlZ29yeU5hbWVGaWx0ZXI+KCAobmFtZTpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgICAgICBpZihuYW1lKXsKKyAgICAgICAgICAgICAgICAgICAgbGV0IG5ld05hbWU6c3RyaW5nID0gIF8ubGFzdChuYW1lLnNwbGl0KCcvJykpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3TmFtZSl7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3TmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3JlbGF0aW9uLW5hbWUtZmxsdGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3JlbGF0aW9uLW5hbWUtZmxsdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTdlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcmVsYXRpb24tbmFtZS1mbGx0ZXIudHMKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRmlsdGVycyB7CisKKyAgICBleHBvcnQgY2xhc3MgUmVsYXRpb25OYW1lRmlsdGVyeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxSZWxhdGlvbk5hbWVGaWx0ZXI+KCAocmVsYXRpb25zaGlwVHlwZTpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgaWNvbnM6IEFycmF5PHN0cmluZz4gPSBbCisgICAgICAgICAgICAgICAgICAgICdBdHRhY2hlc1RvJywKKyAgICAgICAgICAgICAgICAgICAgJ0JpbmRzVG8nLAorICAgICAgICAgICAgICAgICAgICAnRGVwZW5kc09uJywKKyAgICAgICAgICAgICAgICAgICAgJ0hvc3RlZE9uJywKKyAgICAgICAgICAgICAgICAgICAgJ0xpbmtzVG8nLAorICAgICAgICAgICAgICAgICAgICAnUm91dGVzVG8nCisgICAgICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgICAgIGxldCByZXN1bHQ6c3RyaW5nID0gJ0Nvbm5lY3RlZFRvJzsKKworICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBhcnIgPSByZWxhdGlvbnNoaXBUeXBlLnNwbGl0KCcuJyk7IC8vIGxvb2tzIGxpa2UgdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcFR5cGUgPSBhcnJbYXJyLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgICAgICAgICBpZiAoaWNvbnMuaW5kZXhPZihyZWxhdGlvbnNoaXBUeXBlKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWxhdGlvbnNoaXBUeXBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gZmlsdGVyOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcmVzb3VyY2UtbmFtZS1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcmVzb3VyY2UtbmFtZS1maWx0ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmNjE2MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9yZXNvdXJjZS1uYW1lLWZpbHRlci50cwpAQCAtMCwwICsxLDQ1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5GaWx0ZXJzIHsKKworICBleHBvcnQgY2xhc3MgUmVzb3VyY2VOYW1lRmlsdGVyeworCisKKyAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgIGxldCBmaWx0ZXIgPSA8UmVzb3VyY2VOYW1lRmlsdGVyPiggKG5hbWU6c3RyaW5nKSA9PiB7CisgICAgICAgIGlmKG5hbWUpeworICAgICAgICAgIC8vbGV0IG5ld05hbWU6c3RyaW5nID0gIF8ubGFzdChuYW1lLnNwbGl0KCcuJykpOworICAgICAgICAgIGxldCBuZXdOYW1lID0KKyAgICAgICAgICAgICAgXy5sYXN0KF8ubGFzdChfLmxhc3QoXy5sYXN0KF8ubGFzdChfLmxhc3QoXy5sYXN0KF8ubGFzdChuYW1lLnNwbGl0KCd0b3NjYS5ub2Rlcy4nKSkKKyAgICAgICAgICAgICAgICAgIC5zcGxpdCgnbmV0d29yay4nKSkuc3BsaXQoJ3JlbGF0aW9uc2hpcHMuJykpLnNwbGl0KCdvcmcub3BlbmVjb21wLicpKS5zcGxpdCgncmVzb3VyY2UubmZ2LicpKQorICAgICAgICAgICAgICAgICAgLnNwbGl0KCdub2Rlcy5tb2R1bGUuJykpLnNwbGl0KCdjcC4nKSkuc3BsaXQoJ3ZsLicpKTsKKyAgICAgICAgICBpZiAobmV3TmFtZSl7CisgICAgICAgICAgICByZXR1cm4gbmV3TmFtZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICByZXR1cm4gZmlsdGVyOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcmVzb3VyY2UtdHlwZS1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvcmVzb3VyY2UtdHlwZS1maWx0ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNzlkYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9yZXNvdXJjZS10eXBlLWZpbHRlci50cwpAQCAtMCwwICsxLDM4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5GaWx0ZXJzIHsKKworICAgIGV4cG9ydCBjbGFzcyBSZXNvdXJjZVR5cGVGaWx0ZXJ7CisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnXTsKKyAgICAgICAgY29uc3RydWN0b3IoY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSkKKyAgICAgICAgeworICAgICAgICAgICAgIGxldCBmaWx0ZXIgPSA8UmVzb3VyY2VUeXBlRmlsdGVyPiAocmVzb3VyY2VUeXBlOnN0cmluZykgPT4geworICAgICAgICAgICAgICAgIGxldCB1aUNvbmZpZ3VyYXRpb246YW55ID0gY2FjaGVTZXJ2aWNlLmdldCgnVUlDb25maWd1cmF0aW9uJyk7CisKKyAgICAgICAgICAgICAgICBpZih1aUNvbmZpZ3VyYXRpb24ucmVzb3VyY2VUeXBlcyAmJiB1aUNvbmZpZ3VyYXRpb24ucmVzb3VyY2VUeXBlc1tyZXNvdXJjZVR5cGVdKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVpQ29uZmlndXJhdGlvbi5yZXNvdXJjZVR5cGVzW3Jlc291cmNlVHlwZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3N0cmluZy10by1kYXRlLWZpbHRlci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9zdHJpbmctdG8tZGF0ZS1maWx0ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0OTE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy9zdHJpbmctdG8tZGF0ZS1maWx0ZXIudHMKQEAgLTAsMCArMSwzNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuRmlsdGVycyB7CisKKyAgICBleHBvcnQgY2xhc3MgU3RyaW5nVG9EYXRlRmlsdGVyeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxTdHJpbmdUb0RhdGVGaWx0ZXI+KCAoZGF0ZTpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgICAgICBpZihkYXRlKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUucmVwbGFjZSgiIFVUQyIsICcnKS5yZXBsYWNlKCIgIiwgJ1QnKSArICcrMDA6MDAnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvdGVzdHMtaWQtZmlsdGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3Rlc3RzLWlkLWZpbHRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM1ZTZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3Rlc3RzLWlkLWZpbHRlci50cwpAQCAtMCwwICsxLDMzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworbW9kdWxlIFNkYy5GaWx0ZXJzIHsKKworICAgIGV4cG9ydCBjbGFzcyBUZXN0c0lkRmlsdGVyeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxUZXN0c0lkRmlsdGVyPiggKHRlc3RJZDpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdElkLnJlcGxhY2UoL1xzL2csICdfJykudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gZmlsdGVyOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvdHJpbS1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvdHJpbS1maWx0ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyMzFhYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy90cmltLWZpbHRlci50cwpAQCAtMCwwICsxLDM5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5GaWx0ZXJzIHsKKworICAgIGV4cG9ydCBjbGFzcyBUcmltRmlsdGVyIHsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgICAgIGxldCBmaWx0ZXIgPSA8VHJpbUZpbHRlcj4oICh0ZXh0OnN0cmluZykgPT4geworICAgICAgICAgICAgICAgIGlmICghYW5ndWxhci5pc1N0cmluZyh0ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOyAvLyB5b3UgY291bGQgdXNlIC50cmltLCBidXQgaXQncyBub3QgZ29pbmcgdG8gd29yayBpbiBJRTw5CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvdHJ1bmNhdGUtZmlsdGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3RydW5jYXRlLWZpbHRlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDcwZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9maWx0ZXJzL3RydW5jYXRlLWZpbHRlci50cwpAQCAtMCwwICsxLDQ4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworbW9kdWxlIFNkYy5GaWx0ZXJzIHsKKworICAgIGV4cG9ydCBjbGFzcyBUcnVuY2F0ZUZpbHRlciB7CisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxUcnVuY2F0ZUZpbHRlcj4gKHN0cjpzdHJpbmcsIGxlbmd0aDpudW1iZXIpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyLmxlbmd0aCA8PSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL2lmKHN0cltsZW5ndGggLSAxXSA9PT0gJyAnKXsKKyAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBsZW5ndGggLSAxKSArICcuLi4nOworICAgICAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICAgICAgbGV0IGNoYXI7CisgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHdoaWxlIChjaGFyICE9PSAnICcgJiYgaW5kZXggIT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciA9IHN0cltpbmRleF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4ID09PSAwKSA/IHN0ciA6IHN0ci5zdWJzdHJpbmcoMCwgbGVuZ3RoIC0gMykgKyAnLi4uJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbmRleCA9PT0gMCkgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArICcuLi4nOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvZmlsdGVycy91bmRlcnNjb3JlbGVzcy1maWx0ZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvdW5kZXJzY29yZWxlc3MtZmlsdGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDlhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL2ZpbHRlcnMvdW5kZXJzY29yZWxlc3MtZmlsdGVyLnRzCkBAIC0wLDAgKzEsMzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCittb2R1bGUgU2RjLkZpbHRlcnMgeworCisgICAgZXhwb3J0IGNsYXNzIFVuZGVyc2NvcmVMZXNzRmlsdGVyeworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgbGV0IGZpbHRlciA9IDxVbmRlcnNjb3JlTGVzc0ZpbHRlcj4oIChzZW50ZW5jZTpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VudGVuY2UucmVwbGFjZSgvXy9nLCAnICcpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2FjdGl2aXR5LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvYWN0aXZpdHkudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4NjQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2FjdGl2aXR5LnRzCkBAIC0wLDAgKzEsNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDE5LzExLzIwMTUuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICAvKnRoaXMgaXMgaW4gdXBwZXJjYXNlIGJlY2F1c2Ugb2YgdGhlIHNlcnZlciByZXNwb25zZSovCisgICAgZXhwb3J0IGNsYXNzIEFjdGl2aXR5eworICAgICAgICBUSU1FU1RBTVA6IHN0cmluZzsKKyAgICAgICAgQUNUSU9OOnN0cmluZzsKKyAgICAgICAgTU9ESUZJRVI6c3RyaW5nOworICAgICAgICBTVEFUVVM6c3RyaW5nOworICAgICAgICBERVNDOnN0cmluZzsKKyAgICAgICAgQ09NTUVOVDpzdHJpbmc7CisgICAgICAgIC8vY3VzdG9tIGRhdGEKKyAgICAgICAgcHVibGljICBkYXRlRm9ybWF0OnN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdG9KU09OID0gKCk6YW55ID0+IHsKKyAgICAgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9OworCisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2FkZGl0aW9uYWwtaW5mb3JtYXRpb24udHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hZGRpdGlvbmFsLWluZm9ybWF0aW9uLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYWMyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hZGRpdGlvbmFsLWluZm9ybWF0aW9uLnRzCkBAIC0wLDAgKzEsNDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElBZGRpdGlvbmFsSW5mb3JtYXRpb25Nb2RlbCB7CisgICAgICAgIHVuaXF1ZUlkOiBzdHJpbmc7CisgICAgICAgIGtleTogc3RyaW5nOworICAgICAgICB2YWx1ZTogc3RyaW5nOworICAgIH0KKworCisgICAgZXhwb3J0IGNsYXNzIEFkZGl0aW9uYWxJbmZvcm1hdGlvbk1vZGVsIGltcGxlbWVudHMgSUFkZGl0aW9uYWxJbmZvcm1hdGlvbk1vZGVsIHsKKyAgICAgICAgdW5pcXVlSWQ6c3RyaW5nOworICAgICAgICBrZXk6c3RyaW5nOworICAgICAgICB2YWx1ZTpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICB0aGlzLnVuaXF1ZUlkID0gJyc7CisgICAgICAgICAgICB0aGlzLmtleSA9ICcnOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICcnOworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hcHAtY29uZmlnLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvYXBwLWNvbmZpZy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGEzMTZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvYXBwLWNvbmZpZy50cwpAQCAtMCwwICsxLDIzMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBleHBvcnQgaW50ZXJmYWNlIElBcGkgeworICAgICAgICBiYXNlVXJsOnN0cmluZzsKKworICAgICAgICAvLyoqKioqIE5FVyBBUEkgKioqKioqKi8vCisgICAgICAgIEdFVF9jb21wb25lbnQ6IHN0cmluZzsKKyAgICAgICAgUFVUX2NvbXBvbmVudDogc3RyaW5nOworICAgICAgICBHRVRfY29tcG9uZW50X3ZhbGlkYXRlX25hbWU6IHN0cmluZzsKKyAgICAgICAgUE9TVF9jaGFuZ2VMaWZlY3ljbGVTdGF0ZTogc3RyaW5nOworICAgICAgICBjb21wb25lbnRfYXBpX3Jvb3Q6c3RyaW5nOworICAgICAgICB3ZWxjb21lX3BhZ2VfdmlkZW9fdXJsOnN0cmluZzsKKyAgICAgICAgLy8qKioqKioqKiovLworCisgICAgICAgIEdFVF91c2VyOiBzdHJpbmc7CisgICAgICAgIEdFVF91c2VyX2F1dGhvcml6ZTogc3RyaW5nOworICAgICAgICBHRVRfYWxsX3VzZXJzOiBzdHJpbmc7CisgICAgICAgIFBPU1RfY3JlYXRlX3VzZXI7CisgICAgICAgIERFTEVURV9kZWxldGVfdXNlcjsKKyAgICAgICAgUE9TVF9lZGl0X3VzZXJfcm9sZTsKKyAgICAgICAgR0VUX3Jlc291cmNlOiBzdHJpbmc7CisgICAgICAgIEdFVF9yZXNvdXJjZXNfbGF0ZXN0dmVyc2lvbl9ub3RhYnN0cmFjdDpzdHJpbmc7CisgICAgICAgIEdFVF9yZXNvdXJjZXNfY2VydGlmaWVkX25vdF9hYnN0cmFjdDogc3RyaW5nOworICAgICAgICBHRVRfcmVzb3VyY2VzX2NlcnRpZmllZF9hYnN0cmFjdDogc3RyaW5nOworICAgICAgICBQVVRfcmVzb3VyY2U6IHN0cmluZzsKKyAgICAgICAgR0VUX3Jlc291cmNlX3Byb3BlcnR5OiBzdHJpbmc7CisgICAgICAgIEdFVF9yZXNvdXJjZV9hcnRpZmFjdDpzdHJpbmc7CisgICAgICAgIEdFVF9kb3dubG9hZF9pbnN0YW5jZV9hcnRpZmFjdDpzdHJpbmc7CisgICAgICAgIFBPU1RfaW5zdGFuY2VfYXJ0aWZhY3Q6c3RyaW5nOworICAgICAgICBHRVRfcmVzb3VyY2VfYWRkaXRpb25hbF9pbmZvcm1hdGlvbjpzdHJpbmc7CisgICAgICAgIEdFVF9zZXJ2aWNlX2FydGlmYWN0OnN0cmluZzsKKyAgICAgICAgR0VUX3Jlc291cmNlX2ludGVyZmFjZV9hcnRpZmFjdDpzdHJpbmc7CisgICAgICAgIEdFVF9yZXNvdXJjZV9hcGlfYXJ0aWZhY3Q6c3RyaW5nOworICAgICAgICBHRVRfcmVzb3VyY2VfdmFsaWRhdGVfbmFtZTogc3RyaW5nOworICAgICAgICBHRVRfcmVzb3VyY2VfYXJ0aWZhY3RfdHlwZXM6IHN0cmluZzsKKyAgICAgICAgR0VUX2FjdGl2aXR5X2xvZzogc3RyaW5nOworICAgICAgICBHRVRfY29uZmlndXJhdGlvbl91aTogc3RyaW5nOworICAgICAgICBHRVRfc2VydmljZTogc3RyaW5nOworICAgICAgICBQVVRfcHJvZHVjdDogc3RyaW5nOworICAgICAgICBHRVRfcHJvZHVjdDogc3RyaW5nOworICAgICAgICBHRVRfZWNvbXBfbWVudV9pdGVtczogc3RyaW5nOworICAgICAgICBHRVRfcHJvZHVjdF92YWxpZGF0ZV9uYW1lOiBzdHJpbmc7CisgICAgICAgIEdFVF9zZXJ2aWNlX3ZhbGlkYXRlX25hbWU6IHN0cmluZzsKKyAgICAgICAgR0VUX3NlcnZpY2VfZGlzdHJpYnV0aW9uczogc3RyaW5nOworICAgICAgICBHRVRfc2VydmljZV9kaXN0cmlidXRpb25zX2NvbXBvbmVudHM6IHN0cmluZzsKKyAgICAgICAgUE9TVF9zZXJ2aWNlX2Rpc3RyaWJ1dGlvbl9kZXBsb3k6IHN0cmluZzsKKyAgICAgICAgR0VUX2VsZW1lbnQ6IHN0cmluZzsKKyAgICAgICAgR0VUX2NhdGFsb2c6IHN0cmluZzsKKyAgICAgICAgR0VUX3Jlc291cmNlX2NhdGVnb3J5OiBzdHJpbmc7CisgICAgICAgIEdFVF9zZXJ2aWNlX2NhdGVnb3J5OiBzdHJpbmc7CisgICAgICAgIHJlc291cmNlX2luc3RhbmNlOiBzdHJpbmc7CisgICAgICAgIEdFVF9yZXNvdXJjZV9pbnN0YW5jZV9wcm9wZXJ0eTogc3RyaW5nOworICAgICAgICBHRVRfcmVsYXRpb25zaGlwOnN0cmluZzsKKyAgICAgICAgR0VUX2xpZmVjeWNsZV9zdGF0ZV9yZXNvdXJjZTpzdHJpbmc7CisgICAgICAgIEdFVF9saWZlY3ljbGVfc3RhdGVfQ0hFQ0tJTjpzdHJpbmc7CisgICAgICAgIEdFVF9saWZlY3ljbGVfc3RhdGVfQ0VSVElGSUNBVElPTlJFUVVFU1Q6c3RyaW5nOworICAgICAgICBHRVRfbGlmZWN5Y2xlX3N0YXRlX1VORE9DSEVDS09VVDpzdHJpbmc7CisgICAgICAgIHJvb3Q6IHN0cmluZzsKKyAgICAgICAgUFVUX3NlcnZpY2U6IHN0cmluZzsKKyAgICAgICAgR0VUX2Rvd25sb2FkX2FydGlmYWN0OiBzdHJpbmc7CisgICAgICAgIEdFVF9TRENfVmVyc2lvbjogc3RyaW5nOworICAgICAgICBHRVRfY2F0ZWdvcmllczogc3RyaW5nOworICAgICAgICBQT1NUX2NhdGVnb3J5OiBzdHJpbmc7CisgICAgICAgIFBPU1Rfc3ViY2F0ZWdvcnk6IHN0cmluZzsKKyAgICAgICAgUE9TVF9jaGFuZ2VfaW5zdGFuY2VfdmVyc2lvbjogc3RyaW5nOworICAgICAgICBHRVRfcmVxdWlyZW1lbnRzX2NhcGFiaWxpdGllczogc3RyaW5nOworICAgICAgICBHRVRfb25ib2FyZGluZzogc3RyaW5nOworICAgICAgICBHRVRfY29tcG9uZW50X2Zyb21fY3Nhcl91dWlkOiBzdHJpbmc7CisgICAgICAgIGtpYmFuYTpzdHJpbmc7CisKKyAgICAgICAgLy9BZGRlZCBieSBJa3JhbSAtLSBzdGFydHMKKyAgICAgICAgR0VUX3Byb2R1Y3RfY2F0ZWdvcnk6IHN0cmluZzsKKyAgICAgICAgR0VUX3Byb2R1Y3RfY2F0ZWdvcnlfdGVtcDogc3RyaW5nOworICAgICAgICBHRVRfcHJvZHVjdF9zdWJfY2F0ZWdvcnk6IHN0cmluZzsKKyAgICAgICAgLy9BZGRlZCBieSBJa3JhbSAtLSBlbmRzCisKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElMb2dDb25maWcgeworICAgICAgICBtaW5Mb2dMZXZlbDogc3RyaW5nOworICAgICAgICBwcmVmaXg6IHN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDb29raWUgeworICAgICAgICBqdW5jdGlvbk5hbWU6IHN0cmluZzsKKyAgICAgICAgcHJlZml4OiBzdHJpbmc7CisgICAgICAgIHVzZXJJZFN1ZmZpeDogc3RyaW5nOworICAgICAgICB1c2VyRmlyc3ROYW1lOiBzdHJpbmc7CisgICAgICAgIHVzZXJMYXN0TmFtZTogc3RyaW5nOworICAgICAgICB1c2VyRW1haWw6IHN0cmluZzsKKyAgICB9CisgICAgZXhwb3J0IGludGVyZmFjZSBJVXNlclR5cGVzIHsKKyAgICAgICAgYWRtaW46IGFueTsKKyAgICAgICAgZGVzaWduZXI6IGFueTsKKyAgICAgICAgdGVzdGVyOiBhbnk7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnU3RhdHVzZXMgeworICAgICAgICBpbkRlc2lnbjogSUNvbmZpZ1N0YXR1czsKKyAgICAgICAgcmVhZHlGb3JDZXJ0aWZpY2F0aW9uOiBJQ29uZmlnU3RhdHVzOworICAgICAgICBpbkNlcnRpZmljYXRpb246IElDb25maWdTdGF0dXM7CisgICAgICAgIGNlcnRpZmllZDogSUNvbmZpZ1N0YXR1czsKKyAgICAgICAgZGlzdHJpYnV0ZWQ6IElDb25maWdTdGF0dXM7CisKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDb25maWdTdGF0dXMgeworICAgICAgICBuYW1lOiBzdHJpbmc7CisgICAgICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPjsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDb25maWdSb2xlcyB7CisgICAgICAgIEFETUlOOiBJQ29uZmlnUm9sZTsKKyAgICAgICAgREVTSUdORVI6IElDb25maWdSb2xlOworICAgICAgICBURVNURVI6IElDb25maWdSb2xlOworICAgICAgICBPUFM6IElDb25maWdSb2xlOworICAgICAgICBHT1ZFUk5PUjogSUNvbmZpZ1JvbGU7CisgICAgICAgIFBST0RVQ1RfTUFOQUdFUjogSUNvbmZpZ1JvbGU7CisgICAgICAgIFBST0RVQ1RfU1RSQVRFR0lTVDogSUNvbmZpZ1JvbGU7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnUm9sZSB7CisgICAgICAgIHBhZ2VzOiBBcnJheTxzdHJpbmc+OworICAgICAgICBzdGF0ZXM6IElDb25maWdTdGF0ZTsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDb25maWdTdGF0ZSB7CisgICAgICAgIE5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQ6IEFycmF5PElDb25maWdEaXN0cmlidXRpb24+OworICAgICAgICBOT1RfQ0VSVElGSUVEX0NIRUNLSU46IEFycmF5PElDb25maWdEaXN0cmlidXRpb24+OworICAgICAgICBSRUFEWV9GT1JfQ0VSVElGSUNBVElPTjogQXJyYXk8SUNvbmZpZ0Rpc3RyaWJ1dGlvbj47CisgICAgICAgIENFUlRJRklDQVRJT05fSU5fUFJPR1JFU1M6IEFycmF5PElDb25maWdEaXN0cmlidXRpb24+OworICAgICAgICBDRVJUSUZJRUQ6IEFycmF5PElDb25maWdEaXN0cmlidXRpb24+OworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpZ0Rpc3RyaWJ1dGlvbiB7CisgICAgICAgIERJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQ6IEFycmF5PENvbmZpZ01lbnVJdGVtPjsKKyAgICAgICAgRElTVFJJQlVUSU9OX0FQUFJPVkVEOiBBcnJheTxDb25maWdNZW51SXRlbT47CisgICAgICAgIERJU1RSSUJVVEVEOiBBcnJheTxDb25maWdNZW51SXRlbT47CisgICAgICAgIERJU1RSSUJVVElPTl9SRUpFQ1RFRDogQXJyYXk8Q29uZmlnTWVudUl0ZW0+OworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpcm1hdGlvbk1lc3NhZ2UgeworICAgICAgICBzaG93Q29tbWVudDogYm9vbGVhbjsKKyAgICAgICAgdGl0bGU6IHN0cmluZzsKKyAgICAgICAgbWVzc2FnZTogc3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpcm1hdGlvbk1lc3NhZ2VzIHsKKyAgICAgICAgY2hlY2tpbjogSUNvbmZpcm1hdGlvbk1lc3NhZ2U7CisgICAgICAgIGNoZWNrb3V0OiBJQ29uZmlybWF0aW9uTWVzc2FnZTsKKyAgICAgICAgY2VydGlmeTogSUNvbmZpcm1hdGlvbk1lc3NhZ2U7CisgICAgICAgIGZhaWxDZXJ0aWZpY2F0aW9uOiBJQ29uZmlybWF0aW9uTWVzc2FnZTsKKyAgICAgICAgY2VydGlmaWNhdGlvblJlcXVlc3Q6IElDb25maXJtYXRpb25NZXNzYWdlOworICAgICAgICBhcHByb3ZlOiBJQ29uZmlybWF0aW9uTWVzc2FnZTsKKyAgICAgICAgcmVqZWN0OiBJQ29uZmlybWF0aW9uTWVzc2FnZTsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElBbGVydE1lc3NhZ2UgeworICAgICAgICB0aXRsZTogc3RyaW5nOworICAgICAgICBtZXNzYWdlOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJQWxlcnRNZXNzYWdlcyB7CisgICAgICAgIGRlbGV0ZUluc3RhbmNlOiBJQWxlcnRNZXNzYWdlOworICAgICAgICBleGl0V2l0aG91dFNhdmluZzogSUNvbmZpcm1hdGlvbk1lc3NhZ2U7CisgICAgfQorCisgICAgY2xhc3MgQ29uZmlnTWVudUl0ZW0geworICAgICAgICB0ZXh0OnN0cmluZzsKKyAgICAgICAgYWN0aW9uOnN0cmluZzsKKyAgICAgICAgdXJsOnN0cmluZzsKKyAgICAgICAgZGlzYWJsZTpib29sZWFuID0gZmFsc2U7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJQXBwQ29uZmlndXJ0YWlvbiB7CisgICAgICAgIGVudmlyb25tZW50OnN0cmluZzsKKyAgICAgICAgYXBpOiBJQXBpOworICAgICAgICByZXNvdXJjZVR5cGVzRmlsdGVyOklSZXNvdXJjZVR5cGVzRmlsdGVyOworICAgICAgICBsb2dDb25maWc6IElMb2dDb25maWc7CisgICAgICAgIGNvb2tpZTogSUNvb2tpZTsKKyAgICAgICAgaW1hZ2VzUGF0aDogc3RyaW5nOworICAgICAgICB0b3NjYUZpbGVFeHRlbnNpb246c3RyaW5nOworICAgICAgICBjc2FyRmlsZUV4dGVuc2lvbjpzdHJpbmc7CisgICAgICAgIHRlc3RlcnM6IEFycmF5PElUZXN0ZXI+CisgICAgICAgIHR1dG9yaWFsOmFueTsKKyAgICAgICAgcm9sZXM6IEFycmF5PHN0cmluZz47CisgICAgICAgIGNwRW5kUG9pbnRJbnN0YW5jZXM6IEFycmF5PHN0cmluZz47CisgICAgICAgIG9wZW5Tb3VyY2U6Ym9vbGVhbjsKKyAgICB9CisgICAgZXhwb3J0IGludGVyZmFjZSBJUmVzb3VyY2VUeXBlc0ZpbHRlciB7CisgICAgICAgIHJlc291cmNlOiBBcnJheTxzdHJpbmc+OworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVRlc3RlciB7CisgICAgICAgIGVtYWlsOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJQXBwTWVudSB7CisgICAgICAgIHJvbGVzOiBJQ29uZmlnUm9sZXM7CisgICAgICAgIGNvbmZpcm1hdGlvbk1lc3NhZ2VzOiBJQ29uZmlybWF0aW9uTWVzc2FnZXM7CisgICAgICAgIGFsZXJ0TWVzc2FnZXM6IElBbGVydE1lc3NhZ2VzOworICAgICAgICBzdGF0dXNlczogSUNvbmZpZ1N0YXR1c2VzOworICAgICAgICBjYXRhbG9nTWVudUl0ZW06IGFueTsKKyAgICAgICAgY2F0ZWdvcmllc0RpY3Rpb25hcnk6YW55OworICAgICAgICBjYW52YXNfYnV0dG9uczpPYmplY3Q7CisgICAgICAgIGNvbXBvbmVudF93b3Jrc3BhY2VfbWVudV9vcHRpb246IGFueTsKKyAgICAgICAgTGlmZUN5Y2xlU3RhdHVzZXM6ICBhbnk7CisgICAgICAgIERpc3RyaWJ1dGlvblN0YXR1c2VzOiBhbnk7CisgICAgICAgIENoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9uOmFueTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hcnRpZmFjdHMudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hcnRpZmFjdHMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlOThkOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2FydGlmYWN0cy50cwpAQCAtMCwwICsxLDExNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICAvL3RoaXMgb2JqZWN0IGNvbnRhaW5zIGtleXMsIGVhY2gga2V5IGNvbnRhaW4gQXJ0aWZhY3RNb2RlbAorICAgIGV4cG9ydCBjbGFzcyBBcnRpZmFjdEdyb3VwTW9kZWx7CisgICAgICAgIGNvbnN0cnVjdG9yKGFydGlmYWN0cz86TW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbCkgeworICAgICAgICAgICAgXy5mb3JFYWNoKGFydGlmYWN0cywgKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsLCBrZXkpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBuZXcgTW9kZWxzLkFydGlmYWN0TW9kZWwoYXJ0aWZhY3QpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmlsdGVyZWRCeVR5cGUgKHR5cGU6c3RyaW5nKTogTW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbCB7CisgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShfLnBpY2sodGhpcywgKGFydGlmYWN0KT0+eyByZXR1cm4gYXJ0aWZhY3QuYXJ0aWZhY3RUeXBlID09IHR5cGV9KSkpOworICAgICAgICB9OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBcnRpZmFjdE1vZGVsIHsKKworICAgICAgICBhcnRpZmFjdERpc3BsYXlOYW1lOnN0cmluZzsKKyAgICAgICAgYXJ0aWZhY3RHcm91cFR5cGU6c3RyaW5nOworICAgICAgICB1bmlxdWVJZDpzdHJpbmc7CisgICAgICAgIGFydGlmYWN0TmFtZTpzdHJpbmc7CisgICAgICAgIGFydGlmYWN0TGFiZWw6c3RyaW5nOworICAgICAgICBhcnRpZmFjdFR5cGU6c3RyaW5nOworICAgICAgICBhcnRpZmFjdFVVSUQ6c3RyaW5nOworICAgICAgICBhcnRpZmFjdFZlcnNpb246c3RyaW5nOworICAgICAgICBjcmVhdG9yRnVsbE5hbWU6c3RyaW5nOworICAgICAgICBjcmVhdGlvbkRhdGU6bnVtYmVyOworICAgICAgICBsYXN0VXBkYXRlRGF0ZTpudW1iZXI7CisgICAgICAgIGRlc2NyaXB0aW9uOnN0cmluZzsKKyAgICAgICAgbWFuZGF0b3J5OmJvb2xlYW47CisgICAgICAgIHNlcnZpY2VBcGk6Ym9vbGVhbjsKKyAgICAgICAgcGF5bG9hZERhdGE6c3RyaW5nOworICAgICAgICB0aW1lb3V0Om51bWJlcjsKKyAgICAgICAgZXNJZDpzdHJpbmc7CisgICAgICAgICJDb250ZW50LU1ENSI6c3RyaW5nOworICAgICAgICBhcnRpZmFjdENoZWNrc3VtOnN0cmluZzsKKyAgICAgICAgYXBpVXJsOnN0cmluZzsKKyAgICAgICAgaGVhdFBhcmFtZXRlcnM6QXJyYXk8YW55PjsKKyAgICAgICAgZ2VuZXJhdGVkRnJvbUlkOnN0cmluZzsKKworICAgICAgICAvL2N1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIHNlbGVjdGVkOmJvb2xlYW47CisgICAgICAgIG9yaWdpbmFsRGVzY3JpcHRpb246c3RyaW5nOworCisgICAgICAgIGNvbnN0cnVjdG9yKGFydGlmYWN0PzpBcnRpZmFjdE1vZGVsKSB7CisgICAgICAgICAgICBpZihhcnRpZmFjdCkgeworICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3REaXNwbGF5TmFtZSA9IGFydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdEdyb3VwVHlwZSA9IGFydGlmYWN0LmFydGlmYWN0R3JvdXBUeXBlOworICAgICAgICAgICAgICAgIHRoaXMudW5pcXVlSWQgPSBhcnRpZmFjdC51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0TmFtZSA9IGFydGlmYWN0LmFydGlmYWN0TmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0TGFiZWwgPSBhcnRpZmFjdC5hcnRpZmFjdExhYmVsOworICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RUeXBlID0gYXJ0aWZhY3QuYXJ0aWZhY3RUeXBlOworICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RVVUlEID0gYXJ0aWZhY3QuYXJ0aWZhY3RVVUlEOworICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RWZXJzaW9uID0gYXJ0aWZhY3QuYXJ0aWZhY3RWZXJzaW9uOworICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRvckZ1bGxOYW1lID0gYXJ0aWZhY3QuY3JlYXRvckZ1bGxOYW1lOworICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpb25EYXRlID0gYXJ0aWZhY3QuY3JlYXRpb25EYXRlOworICAgICAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZURhdGUgPSBhcnRpZmFjdC5sYXN0VXBkYXRlRGF0ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gYXJ0aWZhY3QuZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgdGhpcy5tYW5kYXRvcnkgPSBhcnRpZmFjdC5tYW5kYXRvcnk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlQXBpID0gYXJ0aWZhY3Quc2VydmljZUFwaTsKKyAgICAgICAgICAgICAgICB0aGlzLnBheWxvYWREYXRhID0gYXJ0aWZhY3QucGF5bG9hZERhdGE7CisgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gYXJ0aWZhY3QudGltZW91dDsKKyAgICAgICAgICAgICAgICB0aGlzLmVzSWQgPSBhcnRpZmFjdC5lc0lkOworICAgICAgICAgICAgICAgIHRoaXNbIkNvbnRlbnQtTUQ1Il0gPSBhcnRpZmFjdFsiQ29udGVudC1NRDUiXTsKKyAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0Q2hlY2tzdW0gPSBhcnRpZmFjdC5hcnRpZmFjdENoZWNrc3VtOworICAgICAgICAgICAgICAgIHRoaXMuYXBpVXJsID0gYXJ0aWZhY3QuYXBpVXJsOworICAgICAgICAgICAgICAgIHRoaXMuaGVhdFBhcmFtZXRlcnMgPSBfLnNvcnRCeShhcnRpZmFjdC5oZWF0UGFyYW1ldGVycywgJ25hbWUnKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEZyb21JZCA9IGFydGlmYWN0LmdlbmVyYXRlZEZyb21JZDsKKyAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gYXJ0aWZhY3Quc2VsZWN0ZWQgPyBhcnRpZmFjdC5zZWxlY3RlZCA6IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxEZXNjcmlwdGlvbiA9IGFydGlmYWN0LmRlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGlzSEVBVCA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgcmV0dXJuIFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdFR5cGUuSEVBVCA9PT0gdGhpcy5hcnRpZmFjdFR5cGUuc3Vic3RyaW5nKDAsNCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gcHVibGljIGlzRWRpdGFibGVJbkluc3RhbmNlTGV2ZWwgPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgLy8gICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyB9OworCisgICAgICAgIHB1YmxpYyBpc1RoaXJkUGFydHkgPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgIHJldHVybiBfLmhhcyhVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRISVJEX1BBUlRZX1JFU0VSVkVEX1RZUEVTLCB0aGlzLmFydGlmYWN0VHlwZSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHRvSlNPTiA9ICgpOmFueSA9PiB7CisgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERlc2NyaXB0aW9uID0gdW5kZWZpbmVkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH07CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2FzY2hlbWEtcHJvcGVydHkudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hc2NoZW1hLXByb3BlcnR5LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2M4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hc2NoZW1hLXByb3BlcnR5LnRzCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb3NvbnNpbm8gb24gMTYvMDUvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBTY2hlbWFQcm9wZXJ0eUdyb3VwTW9kZWx7CisgICAgICAgIHByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eTsKKworICAgICAgICBjb25zdHJ1Y3RvcihzY2hlbWFQcm9wZXJ0eT86TW9kZWxzLlNjaGVtYVByb3BlcnR5KSB7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5ID0gc2NoZW1hUHJvcGVydHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU2NoZW1hUHJvcGVydHkgeworCisgICAgICAgIHR5cGU6IHN0cmluZzsKKyAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW47CisgICAgICAgIGRlZmluaXRpb246IGJvb2xlYW47CisgICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7CisgICAgICAgIHBhc3N3b3JkOiBib29sZWFuOworICAgICAgICAvL2N1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIHNpbXBsZVR5cGU6IHN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcihzY2hlbWFQcm9wZXJ0eT86U2NoZW1hUHJvcGVydHkpIHsKKyAgICAgICAgICAgIGlmKHNjaGVtYVByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gc2NoZW1hUHJvcGVydHkudHlwZTsKKyAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVkID0gc2NoZW1hUHJvcGVydHkucmVxdWlyZWQ7CisgICAgICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9uID0gc2NoZW1hUHJvcGVydHkuZGVmaW5pdGlvbjsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gc2NoZW1hUHJvcGVydHkuZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHNjaGVtYVByb3BlcnR5LnBhc3N3b3JkOworICAgICAgICAgICAgICAgIHRoaXMuc2ltcGxlVHlwZSA9IHNjaGVtYVByb3BlcnR5LnNpbXBsZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdG9KU09OID0gKCk6YW55ID0+IHsKKyAgICAgICAgICAgIHRoaXMuc2ltcGxlVHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9hdHRyaWJ1dGVzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvYXR0cmlidXRlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRjN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvYXR0cmlidXRlcy50cwpAQCAtMCwwICsxLDEzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgQXR0cmlidXRlc0dyb3VwIHsKKyAgICAgICAgY29uc3RydWN0b3IoYXR0cmlidXRlc09iaj86TW9kZWxzLkF0dHJpYnV0ZXNHcm91cCkgeworICAgICAgICAgICAgXy5mb3JFYWNoKGF0dHJpYnV0ZXNPYmosIChhdHRyaWJ1dGVzOkFycmF5PE1vZGVscy5BdHRyaWJ1dGVNb2RlbD4sIGluc3RhbmNlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpc1tpbnN0YW5jZV0gPSBbXTsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2goYXR0cmlidXRlcywgKGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkID0gaW5zdGFuY2U7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5yZWFkb25seSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXNbaW5zdGFuY2VdLnB1c2gobmV3IE1vZGVscy5BdHRyaWJ1dGVNb2RlbChhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJQXR0cmlidXRlTW9kZWwgeworCisgICAgICAgIC8vc2VydmVyIGRhdGEKKyAgICAgICAgdW5pcXVlSWQ6c3RyaW5nOworICAgICAgICBuYW1lOnN0cmluZzsKKyAgICAgICAgZGVmYXVsdFZhbHVlOnN0cmluZzsKKyAgICAgICAgZGVzY3JpcHRpb246c3RyaW5nOworICAgICAgICB0eXBlOnN0cmluZzsKKyAgICAgICAgc2NoZW1hOk1vZGVscy5TY2hlbWFBdHRyaWJ1dGVHcm91cE1vZGVsOworICAgICAgICBzdGF0dXM6c3RyaW5nOworICAgICAgICB2YWx1ZTpzdHJpbmc7CisgICAgICAgIGhpZGRlbjpib29sZWFuOworICAgICAgICBwYXJlbnRVbmlxdWVJZDpzdHJpbmc7CisgICAgICAgIC8vY3VzdG9tIGRhdGEKKyAgICAgICAgcmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkOnN0cmluZzsKKyAgICAgICAgcmVhZG9ubHk6Ym9vbGVhbjsKKyAgICAgICAgdmFsdWVVbmlxdWVVaWQ6c3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVNb2RlbCBpbXBsZW1lbnRzIElBdHRyaWJ1dGVNb2RlbCB7CisKKyAgICAgICAgLy9zZXJ2ZXIgZGF0YQorICAgICAgICB1bmlxdWVJZDpzdHJpbmc7CisgICAgICAgIG5hbWU6c3RyaW5nOworICAgICAgICBkZWZhdWx0VmFsdWU6c3RyaW5nOworICAgICAgICBkZXNjcmlwdGlvbjpzdHJpbmc7CisgICAgICAgIHR5cGU6c3RyaW5nOworICAgICAgICBzY2hlbWE6TW9kZWxzLlNjaGVtYUF0dHJpYnV0ZUdyb3VwTW9kZWw7CisgICAgICAgIHN0YXR1czpzdHJpbmc7CisgICAgICAgIHZhbHVlOnN0cmluZzsKKyAgICAgICAgaGlkZGVuOmJvb2xlYW47CisgICAgICAgIHBhcmVudFVuaXF1ZUlkOnN0cmluZzsKKyAgICAgICAgLy9jdXN0b20gZGF0YQorICAgICAgICByZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQ6c3RyaW5nOworICAgICAgICByZWFkb25seTpib29sZWFuOworICAgICAgICB2YWx1ZVVuaXF1ZVVpZDpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IoYXR0cmlidXRlPzpNb2RlbHMuQXR0cmlidXRlTW9kZWwpIHsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZUlkID0gYXR0cmlidXRlLnVuaXF1ZUlkOworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZS5uYW1lOworICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gYXR0cmlidXRlLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gYXR0cmlidXRlLmRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IGF0dHJpYnV0ZS50eXBlOworICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gYXR0cmlidXRlLnN0YXR1czsKKyAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYSA9IGF0dHJpYnV0ZS5zY2hlbWE7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGF0dHJpYnV0ZS52YWx1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IGF0dHJpYnV0ZS5oaWRkZW47CisgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRVbmlxdWVJZCA9IGF0dHJpYnV0ZS5wYXJlbnRVbmlxdWVJZDsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCA9IGF0dHJpYnV0ZS5yZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkb25seSA9IGF0dHJpYnV0ZS5yZWFkb25seTsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbHVlVW5pcXVlVWlkID0gYXR0cmlidXRlLnZhbHVlVW5pcXVlVWlkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hIHx8ICF0aGlzLnNjaGVtYS5wcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gbmV3IE1vZGVscy5TY2hlbWFQcm9wZXJ0eUdyb3VwTW9kZWwobmV3IE1vZGVscy5TY2hlbWFQcm9wZXJ0eSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9mb3JjaW5nIGNyZWF0aW5nIG5ldyBvYmplY3QsIHNvIGVkaXRpbmcgZGlmZmVyZW50IG9uZSB0aGFuIHRoZSBvYmplY3QgaW4gdGhlIHRhYmxlCisgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBuZXcgTW9kZWxzLlNjaGVtYUF0dHJpYnV0ZUdyb3VwTW9kZWwobmV3IE1vZGVscy5TY2hlbWFBdHRyaWJ1dGUodGhpcy5zY2hlbWEucHJvcGVydHkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5jb252ZXJ0VmFsdWVUb1ZpZXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjb252ZXJ0VG9TZXJ2ZXJPYmplY3Q6RnVuY3Rpb24gPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlICYmIHRoaXMudHlwZSA9PT0gJ21hcCcpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9ICd7JyArIHRoaXMuZGVmYXVsdFZhbHVlICsgJ30nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlICYmIHRoaXMudHlwZSA9PT0gJ2xpc3QnKSB7CisgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSAnWycgKyB0aGlzLmRlZmF1bHRWYWx1ZSArICddJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUgIT0gIiIgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT0gIltdIiAmJiB0aGlzLmRlZmF1bHRWYWx1ZSAhPSAie30iID8gdGhpcy5kZWZhdWx0VmFsdWUgOiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgY29udmVydFZhbHVlVG9WaWV3KCkgeworICAgICAgICAgICAgLy91bndyYXBwaW5nIHZhbHVlIHt9IG9yIFtdIGlmIHR5cGUgaXMgY29tcGxleAorICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlICYmICh0aGlzLnR5cGUgPT09ICdtYXAnIHx8IHRoaXMudHlwZSA9PT0gJ2xpc3QnKSAmJgorICAgICAgICAgICAgICAgIFsnWycsICd7J10uaW5kZXhPZih0aGlzLmRlZmF1bHRWYWx1ZS5jaGFyQXQoMCkpID4gLTEgJiYKKyAgICAgICAgICAgICAgICBbJ10nLCAnfSddLmluZGV4T2YodGhpcy5kZWZhdWx0VmFsdWUuc2xpY2UoLTEpKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZS5zbGljZSgxLCAtMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vYWxzbyBmb3IgdmFsdWUgLSBmb3IgdGhlIG1vZGFsIGluIGNhbnZhcworICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgJiYgKHRoaXMudHlwZSA9PT0gJ21hcCcgfHwgdGhpcy50eXBlID09PSAnbGlzdCcpICYmCisgICAgICAgICAgICAgICAgWydbJywgJ3snXS5pbmRleE9mKHRoaXMudmFsdWUuY2hhckF0KDApKSA+IC0xICYmCisgICAgICAgICAgICAgICAgWyddJywgJ30nXS5pbmRleE9mKHRoaXMudmFsdWUuc2xpY2UoLTEpKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoMSwgLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHRvSlNPTiA9ICgpOmFueSA9PiB7CisgICAgICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkKSB7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucmVhZG9ubHkgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NhcGFiaWxpdHkudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jYXBhYmlsaXR5LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNWJlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jYXBhYmlsaXR5LnRzCkBAIC0wLDAgKzEsMTE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA0LzIwLzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICAvL3RoaXMgaXMgYW4gb2JqZWN0IGNvbnRhaW5zIGtleXMsIHdoZW4gZWFjaCBrZXkgaGFzIG1hdGNoaW5nIGFycmF5LgorICAgIC8vIGZvciBleGFtcGxlOiBrZXkgPSB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZSBhbmQgdGhlIG1hdGNoIGFycmF5IGlzIGFycmF5IG9mIGNhcGFiaWxpdGllcyBvYmplY3RzCisgICAgZXhwb3J0IGNsYXNzIENhcGFiaWxpdGllc0dyb3VwIHsKKyAgICAgICAgY29uc3RydWN0b3IoY2FwYWJpbGl0eUdyb3VwT2JqPzpNb2RlbHMuQ2FwYWJpbGl0aWVzR3JvdXApIHsKKyAgICAgICAgICAgIF8uZm9yRWFjaChjYXBhYmlsaXR5R3JvdXBPYmosIChjYXBhYmlsaXRpZXNBcnJheU9iajpBcnJheTxNb2RlbHMuQ2FwYWJpbGl0eT4sIGluc3RhbmNlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpc1tpbnN0YW5jZV0gPSBbXTsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2goY2FwYWJpbGl0aWVzQXJyYXlPYmosIChjYXBhYmlsaXR5Ok1vZGVscy5DYXBhYmlsaXR5KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc1tpbnN0YW5jZV0ucHVzaChuZXcgTW9kZWxzLkNhcGFiaWxpdHkoY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluZFZhbHVlQnlLZXkoa2V5U3Vic3RyaW5nOnN0cmluZyk6QXJyYXk8TW9kZWxzLkNhcGFiaWxpdHk+IHsKKyAgICAgICAgICAgIGxldCBrZXk6c3RyaW5nID0gXy5maW5kKE9iamVjdC5rZXlzKHRoaXMpLCAoa2V5KT0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmNsdWRlcyhrZXkudG9Mb3dlckNhc2UoKSwga2V5U3Vic3RyaW5nKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHRoaXNba2V5XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBDYXBhYmlsaXR5IHsKKworICAgICAgICAvL3NlcnZlciBkYXRhCisgICAgICAgIG5hbWU6c3RyaW5nOworICAgICAgICBvd25lcklkOnN0cmluZzsKKyAgICAgICAgb3duZXJOYW1lOnN0cmluZzsKKyAgICAgICAgdHlwZTpzdHJpbmc7CisgICAgICAgIHVuaXF1ZUlkOnN0cmluZzsKKyAgICAgICAgY2FwYWJpbGl0eVNvdXJjZXM6QXJyYXk8U3RyaW5nPjsKKyAgICAgICAgbWluT2NjdXJyZW5jZXM6c3RyaW5nOworICAgICAgICBtYXhPY2N1cnJlbmNlczpzdHJpbmc7CisgICAgICAgIHByb3BlcnRpZXM6QXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+OworICAgICAgICBkZXNjcmlwdGlvbjpzdHJpbmc7CisgICAgICAgIHZhbGlkU291cmNlVHlwZXM6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgLy9jdXN0b20KKyAgICAgICAgc2VsZWN0ZWQ6Ym9vbGVhbjsKKyAgICAgICAgZmlsdGVyVGVybTpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IoY2FwYWJpbGl0eT86Q2FwYWJpbGl0eSkgeworCisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSkgeworICAgICAgICAgICAgICAgIC8vc2VydmVyIGRhdGEKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBjYXBhYmlsaXR5Lm5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5vd25lcklkID0gY2FwYWJpbGl0eS5vd25lcklkOworICAgICAgICAgICAgICAgIHRoaXMub3duZXJOYW1lID0gY2FwYWJpbGl0eS5vd25lck5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gY2FwYWJpbGl0eS50eXBlOworICAgICAgICAgICAgICAgIHRoaXMudW5pcXVlSWQgPSBjYXBhYmlsaXR5LnVuaXF1ZUlkOworICAgICAgICAgICAgICAgIHRoaXMuY2FwYWJpbGl0eVNvdXJjZXMgPSBjYXBhYmlsaXR5LmNhcGFiaWxpdHlTb3VyY2VzOworICAgICAgICAgICAgICAgIHRoaXMubWluT2NjdXJyZW5jZXMgPSBjYXBhYmlsaXR5Lm1pbk9jY3VycmVuY2VzOworICAgICAgICAgICAgICAgIHRoaXMubWF4T2NjdXJyZW5jZXMgPSBjYXBhYmlsaXR5Lm1heE9jY3VycmVuY2VzOworICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IGNhcGFiaWxpdHkucHJvcGVydGllczsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gY2FwYWJpbGl0eS5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbGlkU291cmNlVHlwZXMgPSBjYXBhYmlsaXR5LnZhbGlkU291cmNlVHlwZXM7CisgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGNhcGFiaWxpdHkuc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0RmlsdGVyVGVybSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0RnVsbFRpdGxlKCk6c3RyaW5nIHsKKyAgICAgICAgICAgIGxldCBtYXhPY2N1cnJlbmNlczpzdHJpbmcgPSB0aGlzLm1heE9jY3VycmVuY2VzID09PSAnVU5CT1VOREVEJyA/ICfiiJ4nIDogdGhpcy5tYXhPY2N1cnJlbmNlczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm93bmVyTmFtZSArICc6ICcgKyB0aGlzLm5hbWUgKyAnOiBbJyArIHRoaXMubWluT2NjdXJyZW5jZXMgKyAnLCAnICsgbWF4T2NjdXJyZW5jZXMgKyAnXSc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdG9KU09OID0gKCk6YW55ID0+IHsKKyAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLmZpbHRlclRlcm0gPSB1bmRlZmluZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRGaWx0ZXJUZXJtID0gKCk6dm9pZCA9PnsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSA9IHRoaXMubmFtZSArICIgIiArCisgICAgICAgICAgICAgICAgKHRoaXMudHlwZSA/ICh0aGlzLnR5cGUuc3Vic3RyaW5nKCJ0b3NjYS5jYXBhYmlsaXRpZXMuIi5sZW5ndGgpICsgIiAiICkgOiAiIikgKworICAgICAgICAgICAgICAgICh0aGlzLmRlc2NyaXB0aW9ufHwiIikgKyAiICIgKworICAgICAgICAgICAgICAgICh0aGlzLm93bmVyTmFtZXx8IiIpICsgIiAiICsKKyAgICAgICAgICAgICAgICAodGhpcy52YWxpZFNvdXJjZVR5cGVzID8gKHRoaXMudmFsaWRTb3VyY2VUeXBlcy5qb2luKCcsJykgKyAiICIpIDogIiIpICsKKyAgICAgICAgICAgICAgICB0aGlzLm1pbk9jY3VycmVuY2VzKyIsIit0aGlzLm1heE9jY3VycmVuY2VzOworICAgICAgICAgICAgaWYodGhpcy5wcm9wZXJ0aWVzICYmIHRoaXMucHJvcGVydGllcy5sZW5ndGgpeworICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnByb3BlcnRpZXMsKHByb3A6TW9kZWxzLlByb3BlcnR5TW9kZWwpPT57CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSArPSAiICIrIHByb3AubmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiICIgKyAocHJvcC5kZXNjcmlwdGlvbnx8IiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIiArIHByb3AudHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAocHJvcC5zY2hlbWEgJiYgcHJvcC5zY2hlbWEucHJvcGVydHk/KCIgIiArIHByb3Auc2NoZW1hLnByb3BlcnR5LnR5cGUpOiIiKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jYXRlZ29yeS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NhdGVnb3J5LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDQ2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jYXRlZ29yeS50cwpAQCAtMCwwICsxLDY3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBJQ2F0ZWdvcnlCYXNlIHsKKworICAgICAgICAvL3NlcnZlciBwcm9wZXJ0aWVzCisgICAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgICAgbm9ybWFsaXplZE5hbWU6IHN0cmluZzsKKyAgICAgICAgdW5pcXVlSWQ6c3RyaW5nOworICAgICAgICBpY29uczogQXJyYXk8c3RyaW5nPjsKKworICAgICAgICAvL2N1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIGZpbHRlclRlcm1zOiBzdHJpbmc7CisgICAgICAgIGlzRGlzYWJsZWQ6IGJvb2xlYW47CisgICAgICAgIGZpbHRlcmVkR3JvdXA6IEFycmF5PE1vZGVscy5JR3JvdXA+OworCisgICAgICAgIGNvbnN0cnVjdG9yKGNhdGVnb3J5PzogSUNhdGVnb3J5QmFzZSl7CisgICAgICAgICAgICBpZiAoY2F0ZWdvcnkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBjYXRlZ29yeS5uYW1lOworICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZE5hbWUgPSBjYXRlZ29yeS5ub3JtYWxpemVkTmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLmljb25zID0gY2F0ZWdvcnkuaWNvbnM7CisgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJUZXJtcyA9IGNhdGVnb3J5LmZpbHRlclRlcm1zOworICAgICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGNhdGVnb3J5LmlzRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwID0gY2F0ZWdvcnkuZmlsdGVyZWRHcm91cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBJTWFpbkNhdGVnb3J5IGV4dGVuZHMgSUNhdGVnb3J5QmFzZSB7CisgICAgICAgIHN1YmNhdGVnb3JpZXM6QXJyYXk8SVN1YkNhdGVnb3J5PjsKKyAgICAgICAgY29uc3RydWN0b3IoKTsKKyAgICAgICAgY29uc3RydWN0b3IoY2F0ZWdvcnk/OiBJTWFpbkNhdGVnb3J5KXsKKyAgICAgICAgICAgIHN1cGVyKGNhdGVnb3J5KTsKKyAgICAgICAgICAgIGlmIChjYXRlZ29yeSkgeworICAgICAgICAgICAgICAgIHRoaXMuc3ViY2F0ZWdvcmllcyA9IGNhdGVnb3J5LnN1YmNhdGVnb3JpZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgSVN1YkNhdGVnb3J5IGV4dGVuZHMgSUNhdGVnb3J5QmFzZSB7CisgICAgICAgIGdyb3VwaW5nczpBcnJheTxJQ2F0ZWdvcnlCYXNlPjsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElHcm91cCBleHRlbmRzIElDYXRlZ29yeUJhc2UgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tbWVudHMudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21tZW50cy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjc2NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tbWVudHMudHMKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgQXNkY0NvbW1lbnR7CisgICAgICAgIHB1YmxpYyB1c2VyUmVtYXJrczogIHN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHMvY29tcG9uZW50LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50cy9jb21wb25lbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYjNhOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHMvY29tcG9uZW50LnRzCkBAIC0wLDAgKzEsODI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiAyLzQvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMuQ29tcG9uZW50cyB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBVdGlsID0gamFzbWluZS5VdGlsOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50IHsKKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIENBTExTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisgICAgICAgIC8vQ29tcG9uZW50IEFQSQorICAgICAgICBnZXRDb21wb25lbnQoKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OworICAgICAgICB1cGRhdGVDb21wb25lbnQoKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OworICAgICAgICBjcmVhdGVDb21wb25lbnRPblNlcnZlcigpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD47CisgICAgICAgIGNoYW5nZUxpZmVjeWNsZVN0YXRlKHN0YXRlOnN0cmluZywgY29tbWVudE9iajpNb2RlbHMuQXNkY0NvbW1lbnQpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD47CisgICAgICAgIHZhbGlkYXRlTmFtZShuZXdOYW1lOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLklWYWxpZGF0ZT47CisgICAgICAgIHVwZGF0ZVJlcXVpcmVtZW50c0NhcGFiaWxpdGllcygpOm5nLklQcm9taXNlPGFueT47CisKKyAgICAgICAgLy9BcnRpZmFjdHMgQVBJCisgICAgICAgIGFkZE9yVXBkYXRlQXJ0aWZhY3QoYXJ0aWZhY3Q6QXJ0aWZhY3RNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkFydGlmYWN0TW9kZWw+OworICAgICAgICB1cGRhdGVNdWx0aXBsZUFydGlmYWN0cyhhcnRpZmFjdHM6QXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+KTpuZy5JUHJvbWlzZTxhbnk+OworICAgICAgICBkZWxldGVBcnRpZmFjdChhcnRpZmFjdElkOnN0cmluZywgYXJ0aWZhY3RMYWJlbDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgZG93bmxvYWRJbnN0YW5jZUFydGlmYWN0KGFydGlmYWN0SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSUZpbGVEb3dubG9hZD47CisgICAgICAgIGRvd25sb2FkQXJ0aWZhY3QoYXJ0aWZhY3RJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5JRmlsZURvd25sb2FkPjsKKworICAgICAgICAvL1Byb3BlcnR5IEFQSQorICAgICAgICBhZGRPclVwZGF0ZVByb3BlcnR5KHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuUHJvcGVydHlNb2RlbD47CisgICAgICAgIGRlbGV0ZVByb3BlcnR5KHByb3BlcnR5SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuUHJvcGVydHlNb2RlbD47CisgICAgICAgIHVwZGF0ZUluc3RhbmNlUHJvcGVydHkocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPjsKKworICAgICAgICAvL0F0dHJpYnV0ZSBBUEkKKyAgICAgICAgZGVsZXRlQXR0cmlidXRlKGF0dHJpYnV0ZUlkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZU1vZGVsPjsKKyAgICAgICAgYWRkT3JVcGRhdGVBdHRyaWJ1dGUoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZU1vZGVsPjsKKyAgICAgICAgdXBkYXRlSW5zdGFuY2VBdHRyaWJ1dGUoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZU1vZGVsPjsKKworCisKKworICAgICAgICAvL0NvbXBvbmVudCBJbnN0YW5jZSBBUEkKKyAgICAgICAgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPjsKKyAgICAgICAgZGVsZXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2VJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPjsKKyAgICAgICAgYWRkT3JVcGRhdGVJbnN0YW5jZUFydGlmYWN0KGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuQXJ0aWZhY3RNb2RlbD47CisgICAgICAgIGRlbGV0ZUluc3RhbmNlQXJ0aWZhY3QoYXJ0aWZhY3RJZDpzdHJpbmcsIGFydGlmYWN0TGFiZWw6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuQXJ0aWZhY3RNb2RlbD47CisgICAgICAgIHVwbG9hZEluc3RhbmNlRW52RmlsZShhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6IG5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgY2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uKGNvbXBvbmVudFVpZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD47CisgICAgICAgIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTogbmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+OworICAgICAgICB1cGRhdGVNdWx0aXBsZUNvbXBvbmVudEluc3RhbmNlcyhpbnN0YW5jZXM6IEFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPik6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+PjsKKworICAgICAgICAvL0lucHV0cyBBUEkKKyAgICAgICAgZ2V0Q29tcG9uZW50SW5zdGFuY2VJbnB1dFByb3BlcnRpZXMoY29tcG9uZW50SW5zdGFuY2VJZDogc3RyaW5nLCBpbnB1dElkOiBzdHJpbmcpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPj4KKyAgICAgICAgZ2V0Q29tcG9uZW50SW5wdXRzKGNvbXBvbmVudElkOiBzdHJpbmcpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPj47CisKKyAgICAgICAgY3JlYXRlUmVsYXRpb24obGluazpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbD47CisgICAgICAgIGRlbGV0ZVJlbGF0aW9uKGxpbms6TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWw+OworCisKKyAgICAgICAgLy9Nb2R1bGVzCisgICAgICAgIGdldE1vZHVsZUZvckRpc3BsYXkobW9kdWxlSWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuRGlzcGxheU1vZHVsZT47CisgICAgICAgIHVwZGF0ZUdyb3VwTWV0YWRhdGEoZ3JvdXA6TW9kZWxzLk1vZHVsZSk6bmcuSVByb21pc2U8TW9kZWxzLk1vZHVsZT47CisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIRUxQIEZVTkNUSU9OUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworICAgICAgICBnZXRDb21wb25lbnRTdWJUeXBlKCk6c3RyaW5nOworICAgICAgICBpc0FscmVhZHlDZXJ0aWZpZWQoKTpib29sZWFuOworICAgICAgICBpc1Byb2R1Y3QoKTpib29sZWFuOworICAgICAgICBpc1NlcnZpY2UoKTpib29sZWFuOworICAgICAgICBpc1Jlc291cmNlKCk6Ym9vbGVhbjsKKyAgICAgICAgaXNDb21wbGV4KCk6Ym9vbGVhbjsKKyAgICAgICAgZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uKCk6QXJyYXk8TW9kZWxzLkFkZGl0aW9uYWxJbmZvcm1hdGlvbk1vZGVsPjsKKyAgICAgICAgZ2V0QWxsVmVyc2lvbnNBc1NvcnRlZEFycmF5KCk6QXJyYXk8YW55PjsKKyAgICAgICAgZ2V0U3RhdHVzKHNkY01lbnU6TW9kZWxzLklBcHBNZW51KTpzdHJpbmc7CisgICAgfQorCisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9uZW50IGltcGxlbWVudHMgSUNvbXBvbmVudCB7CisKKyAgICAgICAgLy9zZXJ2ZXIgZGF0YQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Q6c3RyaW5nOworICAgICAgICBwdWJsaWMgdW5pcXVlSWQ6c3RyaW5nOworICAgICAgICBwdWJsaWMgdXVpZDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBpbnZhcmlhbnRVVUlEOnN0cmluZzsKKyAgICAgICAgcHVibGljIG5hbWU6c3RyaW5nOworICAgICAgICBwdWJsaWMgdmVyc2lvbjpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjcmVhdGlvbkRhdGU6bnVtYmVyOworICAgICAgICBwdWJsaWMgbGFzdFVwZGF0ZURhdGU6bnVtYmVyOworICAgICAgICBwdWJsaWMgZGVzY3JpcHRpb246c3RyaW5nOworICAgICAgICBwdWJsaWMgbGlmZWN5Y2xlU3RhdGU6c3RyaW5nOworICAgICAgICBwdWJsaWMgdGFnczpBcnJheTxzdHJpbmc+OworICAgICAgICBwdWJsaWMgaWNvbjpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjb250YWN0SWQ6c3RyaW5nOworICAgICAgICBwdWJsaWMgYWxsVmVyc2lvbnM6YW55OworICAgICAgICBwdWJsaWMgY3JlYXRvclVzZXJJZDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjcmVhdG9yRnVsbE5hbWU6c3RyaW5nOworICAgICAgICBwdWJsaWMgbGFzdFVwZGF0ZXJVc2VySWQ6c3RyaW5nOworICAgICAgICBwdWJsaWMgbGFzdFVwZGF0ZXJGdWxsTmFtZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjb21wb25lbnRUeXBlOnN0cmluZzsKKyAgICAgICAgcHVibGljIGRlcGxveW1lbnRBcnRpZmFjdHM6TW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbDsKKyAgICAgICAgcHVibGljIGFydGlmYWN0czpNb2RlbHMuQXJ0aWZhY3RHcm91cE1vZGVsOworICAgICAgICBwdWJsaWMgdG9zY2FBcnRpZmFjdHM6TW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbDsKKyAgICAgICAgcHVibGljIGRpc3RyaWJ1dGlvblN0YXR1czpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjYXRlZ29yaWVzOkFycmF5PE1vZGVscy5JTWFpbkNhdGVnb3J5PjsKKyAgICAgICAgcHVibGljIGNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXM6TW9kZWxzLlByb3BlcnRpZXNHcm91cDsKKyAgICAgICAgcHVibGljIGNvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXM6TW9kZWxzLkF0dHJpYnV0ZXNHcm91cDsKKyAgICAgICAgcHVibGljIGNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9uczpBcnJheTxNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWw+OworICAgICAgICBwdWJsaWMgY29tcG9uZW50SW5zdGFuY2VzOkFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPjsKKyAgICAgICAgcHVibGljIGlucHV0czpBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD47CisgICAgICAgIHB1YmxpYyBjYXBhYmlsaXRpZXM6TW9kZWxzLkNhcGFiaWxpdGllc0dyb3VwOworICAgICAgICBwdWJsaWMgcmVxdWlyZW1lbnRzOk1vZGVscy5SZXF1aXJlbWVudHNHcm91cDsKKyAgICAgICAgcHVibGljIGFkZGl0aW9uYWxJbmZvcm1hdGlvbjphbnk7CisgICAgICAgIHB1YmxpYyBwcm9wZXJ0aWVzOkFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPjsKKyAgICAgICAgcHVibGljIGF0dHJpYnV0ZXM6QXJyYXk8TW9kZWxzLkF0dHJpYnV0ZU1vZGVsPjsKKyAgICAgICAgcHVibGljIGhpZ2hlc3RWZXJzaW9uOmJvb2xlYW47CisgICAgICAgIHB1YmxpYyB2ZW5kb3JOYW1lOnN0cmluZzsKKyAgICAgICAgcHVibGljIHZlbmRvclJlbGVhc2U6c3RyaW5nOworICAgICAgICBwdWJsaWMgZGVyaXZlZExpc3Q6QXJyYXk8YW55PjsKKyAgICAgICAgcHVibGljIGludGVyZmFjZXM6YW55OworICAgICAgICBwdWJsaWMgbm9ybWFsaXplZE5hbWU6c3RyaW5nOworICAgICAgICBwdWJsaWMgc3lzdGVtTmFtZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBwcm9qZWN0Q29kZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBncm91cHM6QXJyYXk8TW9kZWxzLk1vZHVsZT47CisgICAgICAgIC8vY3VzdG9tIHByb3BlcnRpZXMKKyAgICAgICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6U2RjLlNlcnZpY2VzLkNvbXBvbmVudHMuSUNvbXBvbmVudFNlcnZpY2U7CisgICAgICAgIHB1YmxpYyBmaWx0ZXJUZXJtOnN0cmluZzsKKyAgICAgICAgcHVibGljIGljb25TcHJpdGU6c3RyaW5nOworICAgICAgICBwdWJsaWMgc2VsZWN0ZWRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZTsKKyAgICAgICAgcHVibGljIG1haW5DYXRlZ29yeTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBzdWJDYXRlZ29yeTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBzZWxlY3RlZENhdGVnb3J5OnN0cmluZzsKKyAgICAgICAgcHVibGljIHNob3dNZW51OmJvb2xlYW47CisKKworICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5Db21wb25lbnRzLklDb21wb25lbnRTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgJHE6bmcuSVFTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ/OkNvbXBvbmVudCkgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIHRoaXMuYWJzdHJhY3QgPSBjb21wb25lbnQuYWJzdHJhY3Q7CisgICAgICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IGNvbXBvbmVudC51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICB0aGlzLnV1aWQgPSBjb21wb25lbnQudXVpZDsKKyAgICAgICAgICAgICAgICB0aGlzLmludmFyaWFudFVVSUQgPSBjb21wb25lbnQuaW52YXJpYW50VVVJRDsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IGNvbXBvbmVudC5hZGRpdGlvbmFsSW5mb3JtYXRpb247CisgICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdHMgPSBuZXcgU2RjLk1vZGVscy5BcnRpZmFjdEdyb3VwTW9kZWwoY29tcG9uZW50LmFydGlmYWN0cyk7CisgICAgICAgICAgICAgICAgdGhpcy50b3NjYUFydGlmYWN0cyA9IG5ldyBTZGMuTW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbChjb21wb25lbnQudG9zY2FBcnRpZmFjdHMpOworICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdElkID0gY29tcG9uZW50LmNvbnRhY3RJZDsKKyAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSBjb21wb25lbnQuY2F0ZWdvcmllczsKKyAgICAgICAgICAgICAgICB0aGlzLmNyZWF0b3JVc2VySWQgPSBjb21wb25lbnQuY3JlYXRvclVzZXJJZDsKKyAgICAgICAgICAgICAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IGNvbXBvbmVudC5jcmVhdGlvbkRhdGU7CisgICAgICAgICAgICAgICAgdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSBjb21wb25lbnQuY3JlYXRvckZ1bGxOYW1lOworICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBjb21wb25lbnQuZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgdGhpcy5pY29uID0gY29tcG9uZW50Lmljb247CisgICAgICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlRGF0ZSA9IGNvbXBvbmVudC5sYXN0VXBkYXRlRGF0ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVyVXNlcklkID0gY29tcG9uZW50Lmxhc3RVcGRhdGVyVXNlcklkOworICAgICAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZXJGdWxsTmFtZSA9IGNvbXBvbmVudC5sYXN0VXBkYXRlckZ1bGxOYW1lOworICAgICAgICAgICAgICAgIHRoaXMubGlmZWN5Y2xlU3RhdGUgPSBjb21wb25lbnQubGlmZWN5Y2xlU3RhdGU7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50SW5zdGFuY2VSZWxhdGlvbnMoY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyk7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzID0gbmV3IE1vZGVscy5Qcm9wZXJ0aWVzR3JvdXAoY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMpOworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlcyA9IG5ldyBNb2RlbHMuQXR0cmlidXRlc0dyb3VwKGNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBjb21wb25lbnQubmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBjb21wb25lbnQudmVyc2lvbjsKKyAgICAgICAgICAgICAgICB0aGlzLnRhZ3MgPSBjb21wb25lbnQudGFnczsKKyAgICAgICAgICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IG5ldyBNb2RlbHMuQ2FwYWJpbGl0aWVzR3JvdXAoY29tcG9uZW50LmNhcGFiaWxpdGllcyk7CisgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlbWVudHMgPSBuZXcgTW9kZWxzLlJlcXVpcmVtZW50c0dyb3VwKGNvbXBvbmVudC5yZXF1aXJlbWVudHMpOworICAgICAgICAgICAgICAgIHRoaXMuYWxsVmVyc2lvbnMgPSBjb21wb25lbnQuYWxsVmVyc2lvbnM7CisgICAgICAgICAgICAgICAgdGhpcy5kZXBsb3ltZW50QXJ0aWZhY3RzID0gbmV3IFNkYy5Nb2RlbHMuQXJ0aWZhY3RHcm91cE1vZGVsKGNvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuY29tcG9uZW50VHlwZTsKKyAgICAgICAgICAgICAgICB0aGlzLmRpc3RyaWJ1dGlvblN0YXR1cyA9IGNvbXBvbmVudC5kaXN0cmlidXRpb25TdGF0dXM7CisgICAgICAgICAgICAgICAgdGhpcy5oaWdoZXN0VmVyc2lvbiA9IGNvbXBvbmVudC5oaWdoZXN0VmVyc2lvbjsKKyAgICAgICAgICAgICAgICB0aGlzLnZlbmRvck5hbWUgPSBjb21wb25lbnQudmVuZG9yTmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLnZlbmRvclJlbGVhc2UgPSBjb21wb25lbnQudmVuZG9yUmVsZWFzZTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlcml2ZWRMaXN0ID0gY29tcG9uZW50LmRlcml2ZWRMaXN0OworICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJmYWNlcyA9IGNvbXBvbmVudC5pbnRlcmZhY2VzOworICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZE5hbWUgPSBjb21wb25lbnQubm9ybWFsaXplZE5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5zeXN0ZW1OYW1lID0gY29tcG9uZW50LnN5c3RlbU5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0Q29kZSA9IGNvbXBvbmVudC5wcm9qZWN0Q29kZTsKKyAgICAgICAgICAgICAgICB0aGlzLmlucHV0cyA9IGNvbXBvbmVudC5pbnB1dHM7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZXMgPSBVdGlscy5Db21tb25VdGlscy5pbml0Q29tcG9uZW50SW5zdGFuY2VzKGNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMpOworICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IFV0aWxzLkNvbW1vblV0aWxzLmluaXRQcm9wZXJ0aWVzKGNvbXBvbmVudC5wcm9wZXJ0aWVzLCB0aGlzLnVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBVdGlscy5Db21tb25VdGlscy5pbml0QXR0cmlidXRlcyhjb21wb25lbnQuYXR0cmlidXRlcywgdGhpcy51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluc3RhbmNlID0gY29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2U7CisgICAgICAgICAgICAgICAgdGhpcy5pY29uU3ByaXRlID0gY29tcG9uZW50Lmljb25TcHJpdGU7CisgICAgICAgICAgICAgICAgdGhpcy5zaG93TWVudSA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBVdGlscy5Db21tb25VdGlscy5pbml0TW9kdWxlcyhjb21wb25lbnQuZ3JvdXBzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jdXN0b20gcHJvcGVydGllcworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlID0gY29tcG9uZW50U2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzZXRVbmlxdWVJZCA9ICh1bmlxdWVJZDpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzZXRTZWxlY3RlZEluc3RhbmNlID0gKGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbnN0YW5jZSA9IGNvbXBvbmVudEluc3RhbmNlOworICAgICAgICB9OworCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluaXQgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisgICAgICAgIHByaXZhdGUgaW5pdENvbXBvbmVudEluc3RhbmNlUmVsYXRpb25zID0gKGNvbXBvbmVudEluc3RhbmNlUmVsYXRpb25zT2JqOkFycmF5PE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbD4pOnZvaWQgPT4geworICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluc3RhbmNlUmVsYXRpb25zT2JqKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMgPSBbXTsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2goY29tcG9uZW50SW5zdGFuY2VSZWxhdGlvbnNPYmosIChpbnN0YW5jZVJlbGF0aW9uOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zLnB1c2gobmV3IE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbChpbnN0YW5jZVJlbGF0aW9uKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIENhbGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworICAgICAgICBwdWJsaWMgY2hhbmdlTGlmZWN5Y2xlU3RhdGUgPSAoc3RhdGU6c3RyaW5nLCBjb21tZW50T2JqOk1vZGVscy5Bc2RjQ29tbWVudCk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTZXJ2aWNlLmNoYW5nZUxpZmVjeWNsZVN0YXRlKHRoaXMsIHN0YXRlLCBKU09OLnN0cmluZ2lmeShjb21tZW50T2JqKSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldENvbXBvbmVudCA9ICgpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U2VydmljZS5nZXRDb21wb25lbnQodGhpcy51bmlxdWVJZCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudE9uU2VydmVyID0gKCk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICB0aGlzLmhhbmRsZVRhZ3MoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFNlcnZpY2UuY3JlYXRlQ29tcG9uZW50KHRoaXMpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVDb21wb25lbnQgPSAoKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+ID0+IHsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlVGFncygpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U2VydmljZS51cGRhdGVDb21wb25lbnQodGhpcyk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHZhbGlkYXRlTmFtZSA9IChuZXdOYW1lOnN0cmluZywgc3VidHlwZT86c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSVZhbGlkYXRlPiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTZXJ2aWNlLnZhbGlkYXRlTmFtZShuZXdOYW1lLCBzdWJ0eXBlKTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZG93bmxvYWRBcnRpZmFjdCA9IChhcnRpZmFjdElkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLklGaWxlRG93bmxvYWQ+ID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZG93bmxvYWRBcnRpZmFjdCh0aGlzLnVuaXF1ZUlkLCBhcnRpZmFjdElkKTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgYWRkT3JVcGRhdGVBcnRpZmFjdCA9IChhcnRpZmFjdDpBcnRpZmFjdE1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuQXJ0aWZhY3RNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChhcnRpZmFjdE9iajpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgIGxldCBuZXdBcnRpZmFjdCA9IG5ldyBNb2RlbHMuQXJ0aWZhY3RNb2RlbChhcnRpZmFjdE9iaik7CisgICAgICAgICAgICAgICAgbGV0IGFydGlmYWN0cyA9IHRoaXMuZ2V0QXJ0aWZhY3RzQnlUeXBlKGFydGlmYWN0T2JqLmFydGlmYWN0R3JvdXBUeXBlKTsKKyAgICAgICAgICAgICAgICBhcnRpZmFjdHNbYXJ0aWZhY3RPYmouYXJ0aWZhY3RMYWJlbF0gPSBuZXdBcnRpZmFjdDsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKG5ld0FydGlmYWN0KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25FcnJvciA9IChlcnJvcjphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmFkZE9yVXBkYXRlQXJ0aWZhY3QodGhpcy51bmlxdWVJZCwgYXJ0aWZhY3QpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVNdWx0aXBsZUFydGlmYWN0cyA9IChhcnRpZmFjdHM6QXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+KTpuZy5JUHJvbWlzZTxhbnk+PT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZTphbnkpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25FcnJvciA9IChlcnJvcjphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IHEgPSBuZXcgVXRpbHMuRnVuY3Rpb25zLlF1ZXVlVXRpbHModGhpcy4kcSk7CisKKyAgICAgICAgICAgIF8uZm9yRWFjaChhcnRpZmFjdHMsIChhcnRpZmFjdCk9PiB7CisgICAgICAgICAgICAgICAgcS5hZGRCbG9ja2luZ1VJQWN0aW9uKCgpPT4gdGhpcy5hZGRPclVwZGF0ZUFydGlmYWN0KGFydGlmYWN0KS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcikpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworCisgICAgICAgIHB1YmxpYyBkZWxldGVBcnRpZmFjdCA9IChhcnRpZmFjdElkOnN0cmluZywgYXJ0aWZhY3RMYWJlbDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGFydGlmYWN0T2JqOk1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5ld0FydGlmYWN0ID0gbmV3IE1vZGVscy5BcnRpZmFjdE1vZGVsKGFydGlmYWN0T2JqKTsKKyAgICAgICAgICAgICAgICBsZXQgYXJ0aWZhY3RzID0gdGhpcy5nZXRBcnRpZmFjdHNCeVR5cGUoYXJ0aWZhY3RPYmouYXJ0aWZhY3RHcm91cFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChuZXdBcnRpZmFjdC5tYW5kYXRvcnkgIHx8IG5ld0FydGlmYWN0LnNlcnZpY2VBcGkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzW25ld0FydGlmYWN0LmFydGlmYWN0TGFiZWxdID0gbmV3QXJ0aWZhY3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXJ0aWZhY3RzW2FydGlmYWN0TGFiZWxdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKG5ld0FydGlmYWN0KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZGVsZXRlQXJ0aWZhY3QodGhpcy51bmlxdWVJZCwgYXJ0aWZhY3RJZCwgYXJ0aWZhY3RMYWJlbCkudGhlbihvblN1Y2Nlc3MpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgYWRkT3JVcGRhdGVQcm9wZXJ0eSA9IChwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLlByb3BlcnR5TW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKworICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAoZXJyb3I6YW55KTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmICghcHJvcGVydHkudW5pcXVlSWQpIHsKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9wZXJ0eSA9IG5ldyBNb2RlbHMuUHJvcGVydHlNb2RlbChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcy5wdXNoKG5ld1Byb3BlcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShuZXdQcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuYWRkUHJvcGVydHkodGhpcy51bmlxdWVJZCwgcHJvcGVydHkpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAobmV3UHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBleGlzdCBpbnN0YW5jZSBwcm9wZXJ0eSBpbiBwYXJlbnQgY29tcG9uZW50IGZvciB1cGRhdGUgdGhlIG5ldyB2YWx1ZSAoIGZpbmQgYnUgdW5pcXVlSWQgKQorICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RQcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCA9IDxNb2RlbHMuUHJvcGVydHlNb2RlbD5fLmZpbmQodGhpcy5wcm9wZXJ0aWVzLCB7dW5pcXVlSWQ6IG5ld1Byb3BlcnR5LnVuaXF1ZUlkfSk7CisgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wZXJ0eUluZGV4ID0gdGhpcy5wcm9wZXJ0aWVzLmluZGV4T2YoZXhpc3RQcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5LnJlYWRvbmx5ID0gdGhpcy51bmlxdWVJZCAhPSBuZXdQcm9wZXJ0eS5wYXJlbnRVbmlxdWVJZDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzW3Byb3BlcnR5SW5kZXhdID0gbmV3UHJvcGVydHk7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobmV3UHJvcGVydHkpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLnVwZGF0ZVByb3BlcnR5KHRoaXMudW5pcXVlSWQsIHByb3BlcnR5KS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgYWRkT3JVcGRhdGVBdHRyaWJ1dGUgPSAoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZU1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisKKyAgICAgICAgICAgIGxldCBvbkVycm9yID0gKGVycm9yOmFueSk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZS51bmlxdWVJZCkgeworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgbmV3QXR0cmlidXRlID0gbmV3IE1vZGVscy5BdHRyaWJ1dGVNb2RlbChhdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChuZXdBdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKG5ld0F0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuYWRkQXR0cmlidXRlKHRoaXMudW5pcXVlSWQsIGF0dHJpYnV0ZSkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChuZXdBdHRyaWJ1dGU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsKTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBleGlzdEF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwgPSA8TW9kZWxzLkF0dHJpYnV0ZU1vZGVsPl8uZmluZCh0aGlzLmF0dHJpYnV0ZXMsIHt1bmlxdWVJZDogbmV3QXR0cmlidXRlLnVuaXF1ZUlkfSk7CisgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVJbmRleCA9IHRoaXMuYXR0cmlidXRlcy5pbmRleE9mKGV4aXN0QXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0cmlidXRlLnJlYWRvbmx5ID0gdGhpcy51bmlxdWVJZCAhPSBuZXdBdHRyaWJ1dGUucGFyZW50VW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleF0gPSBuZXdBdHRyaWJ1dGU7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobmV3QXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS51cGRhdGVBdHRyaWJ1dGUodGhpcy51bmlxdWVJZCwgYXR0cmlidXRlKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZGVsZXRlUHJvcGVydHkgPSAocHJvcGVydHlJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKCk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJQcm9wZXJ0eSBkZWxldGVkIik7CisgICAgICAgICAgICAgICAgZGVsZXRlIF8ucmVtb3ZlKHRoaXMucHJvcGVydGllcywge3VuaXF1ZUlkOiBwcm9wZXJ0eUlkfSlbMF07CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9ICgpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRmFpbGVkIHRvIGRlbGV0ZSBwcm9wZXJ0eSIpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCgpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWxldGVQcm9wZXJ0eSh0aGlzLnVuaXF1ZUlkLCBwcm9wZXJ0eUlkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGRlbGV0ZUF0dHJpYnV0ZSA9IChhdHRyaWJ1dGVJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9ICgpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQXR0cmlidXRlIGRlbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgXy5yZW1vdmUodGhpcy5hdHRyaWJ1dGVzLCB7dW5pcXVlSWQ6IGF0dHJpYnV0ZUlkfSlbMF07CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKCk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJGYWlsZWQgdG8gZGVsZXRlIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWxldGVBdHRyaWJ1dGUodGhpcy51bmlxdWVJZCwgYXR0cmlidXRlSWQpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgdXBkYXRlSW5zdGFuY2VQcm9wZXJ0eSA9IChwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLlByb3BlcnR5TW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAobmV3UHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vIGZpbmQgZXhpc3QgaW5zdGFuY2UgcHJvcGVydHkgaW4gcGFyZW50IGNvbXBvbmVudCBmb3IgdXBkYXRlIHRoZSBuZXcgdmFsdWUgKCBmaW5kIGJ1IHVuaXF1ZUlkICYgcGF0aCkKKyAgICAgICAgICAgICAgICBsZXQgZXhpc3RQcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCA9IDxNb2RlbHMuUHJvcGVydHlNb2RlbD5fLmZpbmQodGhpcy5jb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzW25ld1Byb3BlcnR5LnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZF0sIHt1bmlxdWVJZDogbmV3UHJvcGVydHkudW5pcXVlSWQscGF0aDogbmV3UHJvcGVydHkucGF0aH0pOworICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllc1tuZXdQcm9wZXJ0eS5yZXNvdXJjZUluc3RhbmNlVW5pcXVlSWRdLmluZGV4T2YoZXhpc3RQcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzW25ld1Byb3BlcnR5LnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZF1baW5kZXhdID0gbmV3UHJvcGVydHk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShuZXdQcm9wZXJ0eSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCB0byB1cGRhdGUgcHJvcGVydHkgdmFsdWUnKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS51cGRhdGVJbnN0YW5jZVByb3BlcnR5KHRoaXMudW5pcXVlSWQsIHByb3BlcnR5KS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZUluc3RhbmNlQXR0cmlidXRlID0gKGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChuZXdBdHRyaWJ1dGU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZXhpc3RBdHRyaWJ1dGU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsID0gPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD5fLmZpbmQodGhpcy5jb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzW25ld0F0dHJpYnV0ZS5yZXNvdXJjZUluc3RhbmNlVW5pcXVlSWRdLCB7dW5pcXVlSWQ6IG5ld0F0dHJpYnV0ZS51bmlxdWVJZH0pOworICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlc1tuZXdBdHRyaWJ1dGUucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkXS5pbmRleE9mKGV4aXN0QXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXNbbmV3QXR0cmlidXRlLnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZF1baW5kZXhdID0gbmV3QXR0cmlidXRlOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobmV3QXR0cmlidXRlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHVwZGF0ZSBhdHRyaWJ1dGUgdmFsdWUnKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS51cGRhdGVJbnN0YW5jZUF0dHJpYnV0ZSh0aGlzLnVuaXF1ZUlkLCBhdHRyaWJ1dGUpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZG93bmxvYWRJbnN0YW5jZUFydGlmYWN0ID0gKGFydGlmYWN0SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSUZpbGVEb3dubG9hZD4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U2VydmljZS5kb3dubG9hZEluc3RhbmNlQXJ0aWZhY3QodGhpcy51bmlxdWVJZCwgdGhpcy5zZWxlY3RlZEluc3RhbmNlLnVuaXF1ZUlkLCBhcnRpZmFjdElkKTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZGVsZXRlSW5zdGFuY2VBcnRpZmFjdCA9IChhcnRpZmFjdElkOnN0cmluZywgYXJ0aWZhY3RMYWJlbDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGFydGlmYWN0T2JqOk1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5ld0FydGlmYWN0ID0gbmV3IE1vZGVscy5BcnRpZmFjdE1vZGVsKGFydGlmYWN0T2JqKTsKKyAgICAgICAgICAgICAgICBsZXQgYXJ0aWZhY3RzID0gdGhpcy5zZWxlY3RlZEluc3RhbmNlLmRlcGxveW1lbnRBcnRpZmFjdHM7CisgICAgICAgICAgICAgICAgaWYgKG5ld0FydGlmYWN0Lm1hbmRhdG9yeSAgfHwgbmV3QXJ0aWZhY3Quc2VydmljZUFwaSkgey8vPz8/Pz8/Pz8/CisgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0c1tuZXdBcnRpZmFjdC5hcnRpZmFjdExhYmVsXSA9IG5ld0FydGlmYWN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFydGlmYWN0c1thcnRpZmFjdExhYmVsXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShuZXdBcnRpZmFjdCk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlbGV0ZUluc3RhbmNlQXJ0aWZhY3QodGhpcy51bmlxdWVJZCx0aGlzLnNlbGVjdGVkSW5zdGFuY2UudW5pcXVlSWQsIGFydGlmYWN0SWQsIGFydGlmYWN0TGFiZWwpLnRoZW4ob25TdWNjZXNzKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhZGRPclVwZGF0ZUluc3RhbmNlQXJ0aWZhY3QgPSAoYXJ0aWZhY3Q6QXJ0aWZhY3RNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkFydGlmYWN0TW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoYXJ0aWZhY3RPYmo6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5zdGFuY2UuZGVwbG95bWVudEFydGlmYWN0c1thcnRpZmFjdE9iai5hcnRpZmFjdExhYmVsXSA9IGFydGlmYWN0T2JqOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoYXJ0aWZhY3RPYmopOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkVycm9yID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZihhcnRpZmFjdC51bmlxdWVJZCl7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLnVwZGF0ZUluc3RhbmNlQXJ0aWZhY3QodGhpcy51bmlxdWVJZCwgdGhpcy5zZWxlY3RlZEluc3RhbmNlLnVuaXF1ZUlkLCBhcnRpZmFjdCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmFkZEluc3RhbmNlQXJ0aWZhY3QodGhpcy51bmlxdWVJZCwgdGhpcy5zZWxlY3RlZEluc3RhbmNlLnVuaXF1ZUlkLCBhcnRpZmFjdCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwbG9hZEluc3RhbmNlRW52RmlsZSA9IChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkFydGlmYWN0TW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoYXJ0aWZhY3RPYmo6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5zdGFuY2UuZGVwbG95bWVudEFydGlmYWN0c1thcnRpZmFjdE9iai5hcnRpZmFjdExhYmVsXSA9IGFydGlmYWN0T2JqOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoYXJ0aWZhY3RPYmopOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkVycm9yID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UudXBsb2FkSW5zdGFuY2VFbnZGaWxlKHRoaXMudW5pcXVlSWQsIHRoaXMuc2VsZWN0ZWRJbnN0YW5jZS51bmlxdWVJZCwgYXJ0aWZhY3QpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIC8vdGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSB0aGUgaW5zdGFuY2UgdmVyc2lvbiB0aGFuIHRoZSBmdW5jdGlvbiBjYWxsIGdldENvbXBvbmVudCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCByZXR1cm4gdGhlIG5ldyBpbnN0YW5jZSB2ZXJzaW9uCisgICAgICAgIHB1YmxpYyBjaGFuZ2VDb21wb25lbnRJbnN0YW5jZVZlcnNpb24gPSAoY29tcG9uZW50VWlkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoY29tcG9uZW50SW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldFNlbGVjdGVkSW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0aGlzLmdldENvbXBvbmVudCgpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmNoYW5nZVJlc291cmNlSW5zdGFuY2VWZXJzaW9uKHRoaXMudW5pcXVlSWQsIHRoaXMuc2VsZWN0ZWRJbnN0YW5jZS51bmlxdWVJZCwgY29tcG9uZW50VWlkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlID0gKGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlcyA9IFV0aWxzLkNvbW1vblV0aWxzLmluaXRDb21wb25lbnRJbnN0YW5jZXMoY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcyA9IG5ldyBNb2RlbHMuUHJvcGVydGllc0dyb3VwKGNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzID0gbmV3IE1vZGVscy5BdHRyaWJ1dGVzR3JvdXAoY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50KCkudGhlbihvblN1Y2Nlc3MpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMudW5pcXVlSWQsIGNvbXBvbmVudEluc3RhbmNlKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlID0gKGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9ICh1cGRhdGVkSW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UgPSBfLmZpbmQodGhpcy5jb21wb25lbnRJbnN0YW5jZXMsIChpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSkgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UudW5pcXVlSWQgPT09IHVwZGF0ZWRJbnN0YW5jZS51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY29tcG9uZW50SW5zdGFuY2VzLmluZGV4T2YoY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzW2luZGV4XSA9IGNvbXBvbmVudEluc3RhbmNlOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodXBkYXRlZEluc3RhbmNlKTsKKworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMudW5pcXVlSWQsIGNvbXBvbmVudEluc3RhbmNlKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZU11bHRpcGxlQ29tcG9uZW50SW5zdGFuY2VzID0gKGluc3RhbmNlczogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+KTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAodXBkYXRlZEluc3RhbmNlczpBcnJheTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4pOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHVwZGF0ZWRJbnN0YW5jZXMpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLnVwZGF0ZU11bHRpcGxlQ29tcG9uZW50SW5zdGFuY2VzKHRoaXMudW5pcXVlSWQsIGluc3RhbmNlcykudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBkZWxldGVDb21wb25lbnRJbnN0YW5jZSA9IChjb21wb25lbnRJbnN0YW5jZUlkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoKTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzID0gVXRpbHMuQ29tbW9uVXRpbHMuaW5pdENvbXBvbmVudEluc3RhbmNlcyhjb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzID0gbmV3IE1vZGVscy5Qcm9wZXJ0aWVzR3JvdXAoY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlc0F0dHJpYnV0ZXMgPSBuZXcgTW9kZWxzLkF0dHJpYnV0ZXNHcm91cChjb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudEluc3RhbmNlUmVsYXRpb25zKGNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMpOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0aGlzLmdldENvbXBvbmVudCgpLnRoZW4ob25TdWNjZXNzKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWxldGVDb21wb25lbnRJbnN0YW5jZSh0aGlzLnVuaXF1ZUlkLCBjb21wb25lbnRJbnN0YW5jZUlkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgIGNyZWF0ZVJlbGF0aW9uID0gKHJlbGF0aW9uOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHJlbGF0aW9uOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnTGluayBjcmVhdGVkIHN1Y2Nlc3NmdWxseScsIHJlbGF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zID0gW107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zLnB1c2gobmV3IE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbChyZWxhdGlvbikpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVsYXRpb24pOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnRmFpbGVkIHRvIGNyZWF0ZSByZWxhdGlvbicsIGVycm9yKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5jcmVhdGVSZWxhdGlvbih0aGlzLnVuaXF1ZUlkLCByZWxhdGlvbikudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyAgZGVsZXRlUmVsYXRpb24gPSAocmVsYXRpb246TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocmVzcG9uc2VSZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiTGluayBEZWxldGVkIEluIFNlcnZlciIpOworICAgICAgICAgICAgICAgIGxldCByZWxhdGlvblRvRGVsZXRlID0gXy5maW5kKHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zLCAoaXRlbSkgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5mcm9tTm9kZSA9PT0gcmVsYXRpb24uZnJvbU5vZGUgJiYgaXRlbS50b05vZGUgPT09IHJlbGF0aW9uLnRvTm9kZSAmJiBfLnNvbWUoaXRlbS5yZWxhdGlvbnNoaXBzLCAocmVsYXRpb25zaGlwKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5ndWxhci5lcXVhbHMocmVsYXRpb24ucmVsYXRpb25zaGlwc1swXSwgcmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zLmluZGV4T2YocmVsYXRpb25Ub0RlbGV0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uVG9EZWxldGUgIT0gdW5kZWZpbmVkICYmIGluZGV4ID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uVG9EZWxldGUucmVsYXRpb25zaGlwcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zW2luZGV4XS5yZWxhdGlvbnNoaXBzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLnJlamVjdCh0aGlzLmNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9uc1tpbmRleF0ucmVsYXRpb25zaGlwcywgcmVsYXRpb24ucmVsYXRpb25zaGlwc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciB3aGlsZSBkZWxldGluZyByZWxhdGlvbiAtIHRoZSByZXR1cm4gZGVsZXRlIHJlbGF0aW9uIGZyb20gc2VydmVyIHdhcyBub3QgZm91bmQgaW4gVUkiKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlbGF0aW9uKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgVG8gRGVsZXRlIExpbmsiKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWxldGVSZWxhdGlvbih0aGlzLnVuaXF1ZUlkLCByZWxhdGlvbikudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVSZXF1aXJlbWVudHNDYXBhYmlsaXRpZXMgPSAoKTpuZy5JUHJvbWlzZTxhbnk+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocmVzcG9uc2U6YW55KTp2b2lkICA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSByZXNwb25zZS5jYXBhYmlsaXRpZXM7CisgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlbWVudHMgPSByZXNwb25zZS5yZXF1aXJlbWVudHM7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZ2V0UmVxdWlyZW1lbnRzQ2FwYWJpbGl0aWVzKHRoaXMudW5pcXVlSWQpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZ2V0TW9kdWxlRm9yRGlzcGxheSA9IChtb2R1bGVJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5EaXNwbGF5TW9kdWxlPiA9PiB7CisKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocmVzcG9uc2U6TW9kZWxzLkRpc3BsYXlNb2R1bGUpOnZvaWQgID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5nZXRNb2R1bGVGb3JEaXNwbGF5KHRoaXMudW5pcXVlSWQsIG1vZHVsZUlkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBnZXQgYWxsIGluc3RhbmNlcyBmaWx0ZXJlZCBieSBpbnB1dHMgYW5kIHByb3BlcnRpZXMgKG9wdGlvbmFsKSAtIGlmIG5vIHNlYXJjaCBzdHJpbmcgaW5zZXJ0IC0gdGhpcyBmdW5jdGlvbiB3aWxsCisgICAgICAgIC8vIGdldCBhbGwgdGhlIGluc3RhbmNlcyBvZiB0aGUgY29tcG9uZW50IChpbiBzZXJ2aWNlIG9ubHkgVkYgaW5zdGFuY2VzKQorICAgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeUlucHV0c0FuZFByb3BlcnRpZXMgPSAoc2VhcmNoVGV4dD86c3RyaW5nKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4+ID0+IHsKKworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZTogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeUlucHV0c0FuZFByb3BlcnRpZXModGhpcy51bmlxdWVJZCwgc2VhcmNoVGV4dCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisKKyAgICAgICAgLy8gZ2V0IGlucHV0cyBmb3IgaW5zdGFuY2UgLSBQYWdpbmF0aW9uIGZ1bmN0aW9uCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRJbnB1dHMgPSAoKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4+ID0+IHsKKworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChpbnB1dHNSZXM6IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHNSZXM7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpbnB1dHNSZXMpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5nZXRDb21wb25lbnRJbnB1dHModGhpcy51bmlxdWVJZCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisKKyAgICAgICAgLy8gZ2V0IGlucHV0cyBpbnN0YW5jZSAtIFBhZ2luYXRpb24gZnVuY3Rpb24KKyAgICAgICAgcHVibGljIGdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzID0gKGNvbXBvbmVudEluc3RhbmNlSWQ6IHN0cmluZywgb3JpZ2luQ29tcG9uZW50VWlkOiBzdHJpbmcpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPj4gPT4geworCisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHJlc3BvbnNlOiBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZUlucHV0cyh0aGlzLnVuaXF1ZUlkLCBjb21wb25lbnRJbnN0YW5jZUlkLCBvcmlnaW5Db21wb25lbnRVaWQpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBnZXQgaW5wdXRzIGluYXRuY2UgLSBQYWdpbmF0aW9uIGZ1bmN0aW9uCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0UHJvcGVydGllcyA9IChjb21wb25lbnRJbnN0YW5jZUlkOiBzdHJpbmcsIGlucHV0SWQ6IHN0cmluZyk6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+PiA9PiB7CisKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocmVzcG9uc2U6IEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5nZXRDb21wb25lbnRJbnN0YW5jZUlucHV0UHJvcGVydGllcyh0aGlzLnVuaXF1ZUlkLCBjb21wb25lbnRJbnN0YW5jZUlkLCBpbnB1dElkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZUdyb3VwTWV0YWRhdGEgPSAobW9kdWxlOiBNb2RlbHMuTW9kdWxlKTpuZy5JUHJvbWlzZTxNb2RlbHMuTW9kdWxlPiA9PiB7CisKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9ICh1cGRhdGVkTW9kdWxlOk1vZGVscy5Nb2R1bGUpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCBncm91cEluZGV4OiBudW1iZXIgPSBfLmluZGV4T2YodGhpcy5ncm91cHMsIF8uZmluZCh0aGlzLmdyb3VwcywgKG1vZHVsZTogTW9kZWxzLk1vZHVsZSkgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlLnVuaXF1ZUlkID09PSB1cGRhdGVkTW9kdWxlLnVuaXF1ZUlkOworICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgICAgIGlmKGdyb3VwSW5kZXggIT09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzW2dyb3VwSW5kZXhdID0gdXBkYXRlZE1vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh1cGRhdGVkTW9kdWxlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLnVwZGF0ZUdyb3VwTWV0YWRhdGEodGhpcy51bmlxdWVJZCwgbW9kdWxlKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworCisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIZWxwIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworICAgICAgICBwdWJsaWMgaXNQcm9kdWN0ID0gKCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIFByb2R1Y3Q7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGlzU2VydmljZSA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBTZXJ2aWNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBpc1Jlc291cmNlID0gKCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIFJlc291cmNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdWJUeXBlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFR5cGU7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGlzQWxyZWFkeUNlcnRpZmllZCA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMudmVyc2lvbikgPj0gMTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgaXNDb21wbGV4ID0gKCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfTsKKworICAgICAgICAvL3NvcnQgc3RyaW5nIHZlcnNpb24gdmFsdWUgZnJvbSBoYXNoIHRvIHNvcnRlZCB2ZXJzaW9uIChpLmUgMS45IGJlZm9yZSAxLjExKQorICAgICAgICBwcml2YXRlIHNvcnRWZXJzaW9ucyA9ICh2MTpzdHJpbmcsIHYyOnN0cmluZyk6bnVtYmVyID0+IHsKKyAgICAgICAgICAgIGxldCB2ZXIxID0gdjEuc3BsaXQoJy4nKTsKKyAgICAgICAgICAgIGxldCB2ZXIyID0gdjIuc3BsaXQoJy4nKTsKKyAgICAgICAgICAgIGxldCBkaWZmID0gcGFyc2VJbnQoXy5maXJzdCh2ZXIxKSkgLSBwYXJzZUludChfLmZpcnN0KHZlcjIpKTsKKyAgICAgICAgICAgIGlmICghZGlmZil7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KF8ubGFzdCh2ZXIxKSkgLSBwYXJzZUludChfLmxhc3QodmVyMikpOworICAgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRBbGxWZXJzaW9uc0FzU29ydGVkQXJyYXkgPSAoKTpBcnJheTxhbnk+ID0+IHsKKyAgICAgICAgICAgIGxldCByZXMgPSBbXTsKKyAgICAgICAgICAgIGlmKHRoaXMuYWxsVmVyc2lvbnMpeworICAgICAgICAgICAgICAgIGxldCBrZXlzID0gIE9iamVjdC5rZXlzKHRoaXMuYWxsVmVyc2lvbnMpLnNvcnQodGhpcy5zb3J0VmVyc2lvbnMpOworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChrZXlzLCAoa2V5KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goeworICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbk51bWJlcjoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbklkOiB0aGlzLmFsbFZlcnNpb25zW2tleV0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGlzTGF0ZXN0VmVyc2lvbiA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgaWYgKHRoaXMuYWxsVmVyc2lvbnMpeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb24gPT09IF8ubGFzdChPYmplY3Qua2V5cyh0aGlzLmFsbFZlcnNpb25zKS5zb3J0KHRoaXMuc29ydFZlcnNpb25zKSk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24gPSAoKTpBcnJheTxNb2RlbHMuQWRkaXRpb25hbEluZm9ybWF0aW9uTW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBhZGRpdGlvbmFsSW5mb3JtYXRpb25PYmplY3Q6YW55ID0gXy5maW5kKHRoaXMuYWRkaXRpb25hbEluZm9ybWF0aW9uLCAob2JqOmFueSk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5wYXJlbnRVbmlxdWVJZCA9PSB0aGlzLnVuaXF1ZUlkOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoYWRkaXRpb25hbEluZm9ybWF0aW9uT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxJbmZvcm1hdGlvbk9iamVjdC5wYXJhbWV0ZXJzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFtdOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBoYW5kbGVUYWdzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgaXNDb250YWluVGFnID0gXy5maW5kKHRoaXMudGFncywgKHRhZyk9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhZyA9PT0gdGhpcy5uYW1lOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIWlzQ29udGFpblRhZykgeworICAgICAgICAgICAgICAgIHRoaXMudGFncy5wdXNoKHRoaXMubmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldEFydGlmYWN0c0J5VHlwZSA9IChhcnRpZmFjdEdyb3VwVHlwZTpzdHJpbmcpOk1vZGVscy5BcnRpZmFjdEdyb3VwTW9kZWwgPT4geworICAgICAgICAgICAgc3dpdGNoIChhcnRpZmFjdEdyb3VwVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkFydGlmYWN0R3JvdXBUeXBlLkRFUExPWU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcGxveW1lbnRBcnRpZmFjdHM7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RHcm91cFR5cGUuSU5GT1JNQVRJT046CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFydGlmYWN0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZ2V0U3RhdHVzID0oc2RjTWVudTpNb2RlbHMuSUFwcE1lbnUpOnN0cmluZyA9PnsKKyAgICAgICAgICAgIGxldCBzdGF0dXM6c3RyaW5nID0gc2RjTWVudS5MaWZlQ3ljbGVTdGF0dXNlc1t0aGlzLmxpZmVjeWNsZVN0YXRlXS50ZXh0OworICAgICAgICAgICAgaWYodGhpcy5saWZlY3ljbGVTdGF0ZSA9PSAiQ0VSVElGSUVEIiAmJiBzZGNNZW51LkRpc3RyaWJ1dGlvblN0YXR1c2VzW3RoaXMuZGlzdHJpYnV0aW9uU3RhdHVzXSkgeworICAgICAgICAgICAgICBzdGF0dXMgPSBzZGNNZW51LkRpc3RyaWJ1dGlvblN0YXR1c2VzW3RoaXMuZGlzdHJpYnV0aW9uU3RhdHVzXS50ZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgdG9KU09OID0gKCk6YW55ID0+IHsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuaWNvblNwcml0ZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMubWFpbkNhdGVnb3J5ID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5zdWJDYXRlZ29yeSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuc2hvd01lbnUgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLiRxID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5ID0gdW5kZWZpbmVkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH07CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzL2Rpc3BsYXlDb21wb25lbnQudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzL2Rpc3BsYXlDb21wb25lbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc4ZjM5MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHMvZGlzcGxheUNvbXBvbmVudC50cwpAQCAtMCwwICsxLDk4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA3LzUvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBEaXNwbGF5Q29tcG9uZW50IHsKKworICAgICAgICB1bmlxdWVJZDpzdHJpbmc7CisgICAgICAgIGRpc3BsYXlOYW1lOnN0cmluZzsKKyAgICAgICAgdmVyc2lvbjpzdHJpbmc7CisgICAgICAgIG1haW5DYXRlZ29yeTpzdHJpbmc7CisgICAgICAgIHN1YkNhdGVnb3J5OnN0cmluZzsKKyAgICAgICAgaWNvbkNsYXNzOnN0cmluZzsKKyAgICAgICAgY29tcG9uZW50U3ViVHlwZTpzdHJpbmc7CisgICAgICAgIHNlYXJjaEZpbHRlclRlcm1zOnN0cmluZzsKKyAgICAgICAgY2VydGlmaWVkSWNvbkNsYXNzOnN0cmluZzsKKyAgICAgICAgaWNvbjpzdHJpbmc7CisgICAgICAgIGlzUmVxdWlybWVudEFuZENhcGFiaWxpdGllc0xvYWRlZDpib29sZWFuOworCisgICAgICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSB7CisgICAgICAgICAgICB0aGlzLmljb24gPSBjb21wb25lbnQuaWNvbjsKKyAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IGNvbXBvbmVudC52ZXJzaW9uOworICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IGNvbXBvbmVudC51bmlxdWVJZDsKKyAgICAgICAgICAgIHRoaXMuaXNSZXF1aXJtZW50QW5kQ2FwYWJpbGl0aWVzTG9hZGVkID0gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQuY2F0ZWdvcmllcyAmJiBjb21wb25lbnQuY2F0ZWdvcmllc1swXSAmJiBjb21wb25lbnQuY2F0ZWdvcmllc1swXS5zdWJjYXRlZ29yaWVzICYmIGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXNbMF0pIHsKKyAgICAgICAgICAgICAgICB0aGlzLm1haW5DYXRlZ29yeSA9IGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLm5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5zdWJDYXRlZ29yeSA9IGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXNbMF0ubmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5tYWluQ2F0ZWdvcnkgPSAnR2VuZXJpYyc7CisgICAgICAgICAgICAgICAgdGhpcy5zdWJDYXRlZ29yeSA9ICdHZW5lcmljJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U3ViVHlwZSA9ICg8TW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+Y29tcG9uZW50KS5yZXNvdXJjZVR5cGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U3ViVHlwZSA9IGNvbXBvbmVudC5jb21wb25lbnRUeXBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmluaXREaXNwbGF5TmFtZShjb21wb25lbnQubmFtZSk7CisgICAgICAgICAgICB0aGlzLnNlYXJjaEZpbHRlclRlcm1zID0gKHRoaXMuZGlzcGxheU5hbWUgKyAnICcgKyBjb21wb25lbnQuZGVzY3JpcHRpb24gKyAnICcgKyBjb21wb25lbnQudGFncy5qb2luKCcgJykpLnRvTG93ZXJDYXNlKCkgKyAnICcgKyBjb21wb25lbnQudmVyc2lvbjsKKyAgICAgICAgICAgIHRoaXMuaW5pdEljb25TcHJpdGUoY29tcG9uZW50Lmljb24pOworICAgICAgICAgICAgdGhpcy5jZXJ0aWZpZWRJY29uQ2xhc3MgPSBjb21wb25lbnQubGlmZWN5Y2xlU3RhdGUgIT0gJ0NFUlRJRklFRCcgPyAnbm9uLWNlcnRpZmllZCcgOiAnJzsKKyAgICAgICAgICAgIGlmKGNvbXBvbmVudC5pY29uID09PSAndmwnIHx8IGNvbXBvbmVudC5pY29uID09PSAnY3AnKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jZXJ0aWZpZWRJY29uQ2xhc3MgPSB0aGlzLmNlcnRpZmllZEljb25DbGFzcyArICIgIiArICdzbWFsbGVyLWljb24nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGluaXREaXNwbGF5TmFtZSA9IChuYW1lOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgbmV3TmFtZSA9CisgICAgICAgICAgICAgICAgXy5sYXN0KF8ubGFzdChfLmxhc3QoXy5sYXN0KF8ubGFzdChfLmxhc3QoXy5sYXN0KF8ubGFzdChuYW1lLnNwbGl0KCd0b3NjYS5ub2Rlcy4nKSkKKyAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCduZXR3b3JrLicpKS5zcGxpdCgncmVsYXRpb25zaGlwcy4nKSkuc3BsaXQoJ29yZy5vcGVuZWNvbXAuJykpLnNwbGl0KCdyZXNvdXJjZS5uZnYuJykpCisgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnbm9kZXMubW9kdWxlLicpKS5zcGxpdCgnY3AuJykpLnNwbGl0KCd2bC4nKSk7CisgICAgICAgICAgICBpZiAobmV3TmFtZSl7CisgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9ICBuZXdOYW1lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgaW5pdEljb25TcHJpdGUgPSAoaWNvbjpzdHJpbmcgKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jb21wb25lbnRTdWJUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFOgorICAgICAgICAgICAgICAgICAgICB0aGlzLmljb25DbGFzcyA9ICJzcHJpdGUtc2VydmljZXMtaWNvbnMgIiArIGljb247CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUFJPRFVDVDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pY29uQ2xhc3MgPSAic3ByaXRlLXByb2R1Y3QtaWNvbnMgIiArIGljb247CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzID0gInNwcml0ZS1yZXNvdXJjZS1pY29ucyAiICsgaWNvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdWJUeXBlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFN1YlR5cGU7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50cy9wcm9kdWN0LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50cy9wcm9kdWN0LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTM0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzL3Byb2R1Y3QudHMKQEAgLTAsMCArMSwxMDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvNC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscy5Db21wb25lbnRzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgUHJvZHVjdCBleHRlbmRzIENvbXBvbmVudHsKKworICAgICAgICBwdWJsaWMgY29udGFjdHM6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFNlcnZpY2VzLkNvbXBvbmVudHMuSVByb2R1Y3RTZXJ2aWNlOworICAgICAgICBwdWJsaWMgZnVsbE5hbWU6IHN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRTZXJ2aWNlOiBTZXJ2aWNlcy5Db21wb25lbnRzLklQcm9kdWN0U2VydmljZSwgJHE6bmcuSVFTZXJ2aWNlLCBjb21wb25lbnQ/OlByb2R1Y3QpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UsICRxLCBjb21wb25lbnQpOworCisgICAgICAgICAgICBpZihjb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZ1bGxOYW1lID0gY29tcG9uZW50LmZ1bGxOYW1lOworICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSA9IHRoaXMubmFtZSArICcgJyArIHRoaXMuZGVzY3JpcHRpb24gKyAnICcgKyAodGhpcy50YWdzID8gdGhpcy50YWdzLnRvU3RyaW5nKCkgOiAnJykgKyAnICcgKyB0aGlzLnZlcnNpb247CisgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0cyA9IGNvbXBvbmVudC5jb250YWN0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZSA9IGNvbXBvbmVudFNlcnZpY2U7CisgICAgICAgICAgICB0aGlzLmljb25TcHJpdGUgPSAic3ByaXRlLXByb2R1Y3QtaWNvbnMiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGRlbGV0ZUdyb3VwID0gKHVuaXF1ZUlkOiBzdHJpbmcpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNhdGVnb3JpZXMsIChjYXRlZ29yeTogTW9kZWxzLklNYWluQ2F0ZWdvcnkpID0+IHsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2goY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcywgKHN1YmNhdGVnb3J5Ok1vZGVscy5JU3ViQ2F0ZWdvcnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzID0gXy5yZWplY3QgKHN1YmNhdGVnb3J5Lmdyb3VwaW5ncywgKGdyb3VwOk1vZGVscy5JR3JvdXApID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cC51bmlxdWVJZCA9PT0gdW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpZihzdWJjYXRlZ29yeS5ncm91cGluZ3MubGVuZ3RoID09IDApeyAvLyBpZiB0aGVyZSBpcyBubyBncm91cHMsIGRlbGV0ZSB0aGUgc3ViY2F0ZWdvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMgPSBfLnJlamVjdCAoY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcywgKHN1YmNhdGVnb3J5T2JqOk1vZGVscy5JU3ViQ2F0ZWdvcnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ViY2F0ZWdvcnlPYmoudW5pcXVlSWQgPT09IHN1YmNhdGVnb3J5LnVuaXF1ZUlkOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLmxlbmd0aCA9PSAwKXsgLy8gaWYgdGhlcmUgaXMgbm8gc3ViY2F0ZWdvcnksIGRlbGV0ZSB0aGUgY2F0ZWdvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSBfLnJlamVjdCAodGhpcy5jYXRlZ29yaWVzICwgKGNhdGVnb3J5T2JqOk1vZGVscy5JTWFpbkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXRlZ29yeU9iai51bmlxdWVJZCA9PT0gY2F0ZWdvcnkudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZ2V0Q2F0ZWdvcnlPYmplY3RCeUlkID0gKGNhdGVnb3JpZXNBcnJheTpBcnJheTxNb2RlbHMuSUNhdGVnb3J5QmFzZT4sIGNhdGVnb3J5VW5pcXVlSWQ6c3RyaW5nKTpNb2RlbHMuSUNhdGVnb3J5QmFzZSA9PiB7CisgICAgICAgICAgICBsZXQgY2F0ZWdvcnlTZWxlY3RlZCA9ICBfLmZpbmQoY2F0ZWdvcmllc0FycmF5LCAoY2F0ZWdvcnkpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2F0ZWdvcnkudW5pcXVlSWQgPT09IGNhdGVnb3J5VW5pcXVlSWQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBjYXRlZ29yeVNlbGVjdGVkOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhZGRHcm91cCA9IChjYXRlZ29yeTogTW9kZWxzLklNYWluQ2F0ZWdvcnksIHN1YmNhdGVnb3J5OiBNb2RlbHMuSVN1YkNhdGVnb3J5LCBncm91cDogTW9kZWxzLklHcm91cCk6IHZvaWQgPT4geworICAgICAgICAgICAgaWYoIXRoaXMuY2F0ZWdvcmllcyl7CisgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gbmV3IEFycmF5PE1vZGVscy5JTWFpbkNhdGVnb3J5PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IGV4aXN0aW5nQ2F0ZWdvcnk6TW9kZWxzLklNYWluQ2F0ZWdvcnkgPSA8TW9kZWxzLklNYWluQ2F0ZWdvcnk+dGhpcy5nZXRDYXRlZ29yeU9iamVjdEJ5SWQodGhpcy5jYXRlZ29yaWVzLCBjYXRlZ29yeS51bmlxdWVJZCk7CisgICAgICAgICAgICBsZXQgbmV3R3JvdXAgPSBhbmd1bGFyLmNvcHkoZ3JvdXApOworICAgICAgICAgICAgbmV3R3JvdXAuZmlsdGVyVGVybXMgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICBuZXdHcm91cC5pc0Rpc2FibGVkID0gdW5kZWZpbmVkOworICAgICAgICAgICAgaWYoIWV4aXN0aW5nQ2F0ZWdvcnkpeworICAgICAgICAgICAgICAgIGxldCBuZXdDYXRlZ29yeTogTW9kZWxzLklNYWluQ2F0ZWdvcnkgPSBhbmd1bGFyLmNvcHkoY2F0ZWdvcnkpOworICAgICAgICAgICAgICAgIG5ld0NhdGVnb3J5LmZpbHRlcmVkR3JvdXAgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICAgICAgbmV3Q2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyA9IFtdOworICAgICAgICAgICAgICAgIGxldCBuZXdTdWJjYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5ID0gYW5ndWxhci5jb3B5KHN1YmNhdGVnb3J5KTsKKyAgICAgICAgICAgICAgICBuZXdTdWJjYXRlZ29yeS5ncm91cGluZ3MgPSBbXTsKKyAgICAgICAgICAgICAgICBuZXdTdWJjYXRlZ29yeS5ncm91cGluZ3MucHVzaChuZXdHcm91cCk7CisgICAgICAgICAgICAgICAgbmV3Q2F0ZWdvcnkuc3ViY2F0ZWdvcmllcy5wdXNoKG5ld1N1YmNhdGVnb3J5KTsKKyAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMucHVzaChuZXdDYXRlZ29yeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ1N1YmNhdGVnb3J5Ok1vZGVscy5JU3ViQ2F0ZWdvcnkgPSA8TW9kZWxzLklTdWJDYXRlZ29yeT4gdGhpcy5nZXRDYXRlZ29yeU9iamVjdEJ5SWQoZXhpc3RpbmdDYXRlZ29yeS5zdWJjYXRlZ29yaWVzLCBzdWJjYXRlZ29yeS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgaWYoIWV4aXN0aW5nU3ViY2F0ZWdvcnkpeworICAgICAgICAgICAgICAgICAgICBsZXQgbmV3U3ViY2F0ZWdvcnk6TW9kZWxzLklTdWJDYXRlZ29yeSA9IGFuZ3VsYXIuY29weShzdWJjYXRlZ29yeSk7CisgICAgICAgICAgICAgICAgICAgIG5ld1N1YmNhdGVnb3J5Lmdyb3VwaW5ncyA9IFtdOworICAgICAgICAgICAgICAgICAgICBuZXdTdWJjYXRlZ29yeS5ncm91cGluZ3MucHVzaChuZXdHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ2F0ZWdvcnkuc3ViY2F0ZWdvcmllcy5wdXNoKG5ld1N1YmNhdGVnb3J5KTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ0dyb3VwOk1vZGVscy5JR3JvdXAgPSAgPE1vZGVscy5JR3JvdXA+IHRoaXMuZ2V0Q2F0ZWdvcnlPYmplY3RCeUlkKGV4aXN0aW5nU3ViY2F0ZWdvcnkuZ3JvdXBpbmdzLCBncm91cC51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmKCFleGlzdGluZ0dyb3VwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU3ViY2F0ZWdvcnkuZ3JvdXBpbmdzLnB1c2gobmV3R3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzL3Jlc291cmNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50cy9yZXNvdXJjZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNlZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50cy9yZXNvdXJjZS50cwpAQCAtMCwwICsxLDE4NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi8zLzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzLkNvbXBvbmVudHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBSZXNvdXJjZSBleHRlbmRzIENvbXBvbmVudCB7CisKKyAgICAgICAgcHVibGljIGludGVyZmFjZXM6IGFueTsKKyAgICAgICAgcHVibGljIGRlcml2ZWRGcm9tOkFycmF5PHN0cmluZz47CisgICAgICAgIHB1YmxpYyBjb21wb25lbnRTZXJ2aWNlOiBTZXJ2aWNlcy5Db21wb25lbnRzLklSZXNvdXJjZVNlcnZpY2U7CisgICAgICAgIHB1YmxpYyByZXNvdXJjZVR5cGU6c3RyaW5nOworICAgICAgICBwdWJsaWMgcGF5bG9hZERhdGE6c3RyaW5nOworICAgICAgICBwdWJsaWMgcGF5bG9hZE5hbWU6c3RyaW5nOworICAgICAgICBwdWJsaWMgaW1wb3J0ZWRGaWxlOiBTZGMuRGlyZWN0aXZlcy5GaWxlVXBsb2FkTW9kZWw7CisKKyAgICAgICAgLy8gT25ib2FyZGluZyBwYXJhbWV0ZXJzCisgICAgICAgIHB1YmxpYyBjc2FyVVVJRDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjc2FyVmVyc2lvbjpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjc2FyUGFja2FnZVR5cGU6c3RyaW5nOworICAgICAgICBwdWJsaWMgcGFja2FnZUlkOnN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRTZXJ2aWNlOiBTZXJ2aWNlcy5Db21wb25lbnRzLklSZXNvdXJjZVNlcnZpY2UsICRxOiBuZy5JUVNlcnZpY2UsIGNvbXBvbmVudD86UmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UsICRxLCBjb21wb25lbnQpOworICAgICAgICAgICAgaWYoY29tcG9uZW50KSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmludGVyZmFjZXMgPSBjb21wb25lbnQuaW50ZXJmYWNlczsKKyAgICAgICAgICAgICAgICB0aGlzLmRlcml2ZWRGcm9tID0gY29tcG9uZW50LmRlcml2ZWRGcm9tOworICAgICAgICAgICAgICAgIHRoaXMucGF5bG9hZERhdGEgPSBjb21wb25lbnQucGF5bG9hZERhdGEgPyBjb21wb25lbnQucGF5bG9hZERhdGEgOiB1bmRlZmluZWQ7CisgICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkTmFtZSA9IGNvbXBvbmVudC5wYXlsb2FkTmFtZSA/IGNvbXBvbmVudC5wYXlsb2FkTmFtZSA6IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZSA9IGNvbXBvbmVudC5yZXNvdXJjZVR5cGU7CisgICAgICAgICAgICAgICAgdGhpcy5jc2FyVVVJRCA9IGNvbXBvbmVudC5jc2FyVVVJRDsKKyAgICAgICAgICAgICAgICB0aGlzLmNzYXJWZXJzaW9uID0gY29tcG9uZW50LmNzYXJWZXJzaW9uOworICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSA9IHRoaXMubmFtZSArICcgJyArIHRoaXMuZGVzY3JpcHRpb24gKyAnICcgKyAodGhpcy50YWdzID8gdGhpcy50YWdzLnRvU3RyaW5nKCkgOiAnJykgKyAnICcgKyB0aGlzLnZlcnNpb24gKyAnICcgKyB0aGlzLnJlc291cmNlVHlwZTsKKworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuY2F0ZWdvcmllcyAmJiBjb21wb25lbnQuY2F0ZWdvcmllc1swXSAmJiBjb21wb25lbnQuY2F0ZWdvcmllc1swXS5zdWJjYXRlZ29yaWVzICYmIGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXNbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lm1haW5DYXRlZ29yeSA9IGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLm5hbWU7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zdWJDYXRlZ29yeSA9IGNvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXNbMF0ubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5ID0gIGNvbXBvbmVudC5tYWluQ2F0ZWdvcnkgKyAgIl8jXyIgKyBjb21wb25lbnQuc3ViQ2F0ZWdvcnk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0ZWRGaWxlID0gY29tcG9uZW50LmltcG9ydGVkRmlsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlID0gVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZS5WRjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlID0gY29tcG9uZW50U2VydmljZTsKKyAgICAgICAgICAgIHRoaXMuaWNvblNwcml0ZSA9ICJzcHJpdGUtcmVzb3VyY2UtaWNvbnMiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGdldENvbXBvbmVudFN1YlR5cGUgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBpc0NvbXBsZXggPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZSA9PT0gVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZS5WRjsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgaXNWbCA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgcmV0dXJuIFV0aWxzLkNvbnN0YW50cy5SZXNvdXJjZVR5cGUuVkwgPT0gdGhpcy5yZXNvdXJjZVR5cGU7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGlzQ3NhckNvbXBvbmVudCA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgIHJldHVybiAhIXRoaXMuY3NhclVVSUQ7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudE9uU2VydmVyID0gKCk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSk6dm9pZCAgPT4geworICAgICAgICAgICAgICAgIHRoaXMucGF5bG9hZERhdGEgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkTmFtZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGNvbXBvbmVudCk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy5oYW5kbGVUYWdzKCk7CisgICAgICAgICAgICBpZih0aGlzLmltcG9ydGVkRmlsZSl7CisgICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkRGF0YSA9IHRoaXMuaW1wb3J0ZWRGaWxlLmJhc2U2NDsKKyAgICAgICAgICAgICAgICB0aGlzLnBheWxvYWROYW1lID0gdGhpcy5pbXBvcnRlZEZpbGUuZmlsZW5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuY3JlYXRlQ29tcG9uZW50KHRoaXMpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIC8qIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB0byB2Zkluc3RhbmNlTmFtZSArIGlucHV0IG5hbWUgYmVmb3JlIHNlbmRpbmcgdG8gc2VydmVyIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgaW5wdXRzIG9uIHRoZSBzZXJ2aWNlCisgICAgICAgICAqICB3ZSBhbHNvIG5lZWQgdG8gcmVtb3ZlIGFscmVhZHkgc2VsZWN0ZWQgaW5wdXRzICh0aGUgaW5wdXRzIHRoYXQgYWxyZWFkeSBjcmVhdGUgb24gc2VydmVyLCBhbmQgZGlzYWJsZWQgaW4gdGhlIHZpZXcgLSBidXQgdGhleSBhcmUgc2VsZWN0ZWQgc28gdGhleSBhcmUgc3RpbGwgaW4gdGhlIHZpZXcgbW9kZWwKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjcmVhdGVJbnB1dHNGb3JtSW5zdGFuY2VzID0gKGluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcDpNb2RlbHMuSW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzTWFwRGF0YSk6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgbGV0IGluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcFRvQ3JlYXRlOiBNb2RlbHMuSW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzTWFwRGF0YSA9IG5ldyBNb2RlbHMuSW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzTWFwRGF0YSgpOworICAgICAgICAgICAgXy5mb3JFYWNoKGluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcCwgKHByb3BlcnRpZXM6QXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+LCBpbnN0YW5jZUlkOnN0cmluZykgPT4geworCisgICAgICAgICAgICAgICAgaWYocHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlID0gXy5maW5kKHRoaXMuY29tcG9uZW50SW5zdGFuY2VzLCAoaW5zdGFjZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhY2UudW5pcXVlSWQgPT09IGluc3RhbmNlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcFRvQ3JlYXRlW2luc3RhbmNlSWRdID0gbmV3IEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPigpOworICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gocHJvcGVydGllcywgKHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKSA9PiB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9wZXJ0eS5pc0FscmVhZHlTZWxlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdJbnB1dCA9IG5ldyBNb2RlbHMuUHJvcGVydHlNb2RlbChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5wdXQubmFtZSA9IGNvbXBvbmVudEluc3RhbmNlLm5vcm1hbGl6ZWROYW1lICsgJ18nICsgcHJvcGVydHkubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXS5wdXNoKG5ld0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXS5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYoT2JqZWN0LmtleXMoaW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzTWFwVG9DcmVhdGUpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChwcm9wZXJ0aWVzQ3JlYXRlZDogQXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dHMgPSBwcm9wZXJ0aWVzQ3JlYXRlZC5jb25jYXQodGhpcy5pbnB1dHMpOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHByb3BlcnRpZXNDcmVhdGVkKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5jcmVhdGVJbnB1dHNGcm9tSW5zdGFuY2VzSW5wdXRzUHJvcGVydGllcyh0aGlzLnVuaXF1ZUlkLCBuZXcgTW9kZWxzLkluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcChpbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBUb0NyZWF0ZSkpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB0byB2Zkluc3RhbmNlTmFtZSArIGlucHV0IG5hbWUgYmVmb3JlIHNlbmRpbmcgdG8gc2VydmVyIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgaW5wdXRzIG9uIHRoZSBzZXJ2aWNlCisgICAgICAgIHB1YmxpYyBnZXRSZXNvdXJjZUlucHV0SW5wdXRzID0gKGlucHV0SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoaW5wdXRJbnB1dHM6IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGlucHV0OiBNb2RlbHMuSW5wdXRNb2RlbCA9IF8uZmluZCh0aGlzLmlucHV0cywgKGlucHV0Ok1vZGVscy5JbnB1dE1vZGVsKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC51bmlxdWVJZCA9PT0gaW5wdXRJZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dHMgPSBpbnB1dElucHV0czsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGlucHV0SW5wdXRzKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZ2V0Q29tcG9uZW50SW5wdXRJbnB1dHModGhpcy51bmlxdWVJZCwgaW5wdXRJZCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB0b0pTT04gPSAoKTphbnkgPT4geworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5maWx0ZXJUZXJtID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5pY29uU3ByaXRlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5tYWluQ2F0ZWdvcnkgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLnN1YkNhdGVnb3J5ID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluc3RhbmNlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5zaG93TWVudSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuJHEgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLmltcG9ydGVkRmlsZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzL3NlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzL3NlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3MzBhYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHMvc2VydmljZS50cwpAQCAtMCwwICsxLDE0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi80LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzLkNvbXBvbmVudHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworCisgICAgZXhwb3J0IGNsYXNzIFNlcnZpY2UgZXh0ZW5kcyBDb21wb25lbnQgeworCisgICAgICAgIHB1YmxpYyBzZXJ2aWNlQXBpQXJ0aWZhY3RzOk1vZGVscy5BcnRpZmFjdEdyb3VwTW9kZWw7CisgICAgICAgIHB1YmxpYyBjb21wb25lbnRTZXJ2aWNlOlNlcnZpY2VzLkNvbXBvbmVudHMuSVNlcnZpY2VTZXJ2aWNlOworCisgICAgICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudFNlcnZpY2U6U2VydmljZXMuQ29tcG9uZW50cy5JU2VydmljZVNlcnZpY2UsICRxOm5nLklRU2VydmljZSwgY29tcG9uZW50PzpTZXJ2aWNlKSB7CisgICAgICAgICAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlLCAkcSwgY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VBcGlBcnRpZmFjdHMgPSBuZXcgTW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbChjb21wb25lbnQuc2VydmljZUFwaUFydGlmYWN0cyk7CisgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJUZXJtID0gdGhpcy5uYW1lICsgJyAnICsgdGhpcy5kZXNjcmlwdGlvbiArICcgJyArICh0aGlzLnRhZ3MgPyB0aGlzLnRhZ3MudG9TdHJpbmcoKSA6ICcnKSArICcgJyArIHRoaXMudmVyc2lvbjsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmNhdGVnb3JpZXMgJiYgY29tcG9uZW50LmNhdGVnb3JpZXNbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWluQ2F0ZWdvcnkgPSBjb21wb25lbnQuY2F0ZWdvcmllc1swXS5uYW1lOworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPSB0aGlzLm1haW5DYXRlZ29yeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UgPSBjb21wb25lbnRTZXJ2aWNlOworICAgICAgICAgICAgdGhpcy5pY29uU3ByaXRlID0gInNwcml0ZS1zZXJ2aWNlcy1pY29ucyI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0RGlzdHJpYnV0aW9uc0xpc3QgPSAoKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuRGlzdHJpYnV0aW9uPj4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U2VydmljZS5nZXREaXN0cmlidXRpb25zTGlzdCh0aGlzLnV1aWQpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXREaXN0cmlidXRpb25zQ29tcG9uZW50ID0gKGRpc3RyaWJ1dGlvbklkOnN0cmluZyk6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLkRpc3RyaWJ1dGlvbkNvbXBvbmVudD4+ID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZ2V0RGlzdHJpYnV0aW9uQ29tcG9uZW50cyhkaXN0cmlidXRpb25JZCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIG1hcmtBc0RlcGxveWVkID0gKGRpc3RyaWJ1dGlvbklkOnN0cmluZyk6bmcuSVByb21pc2U8YW55PiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTZXJ2aWNlLm1hcmtBc0RlcGxveWVkKHRoaXMudW5pcXVlSWQsIGRpc3RyaWJ1dGlvbklkKTsKKyAgICAgICAgfTsKKworICAgICAgICAvKiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgdG8gdmZJbnN0YW5jZU5hbWUgKyBpbnB1dCBuYW1lIGJlZm9yZSBzZW5kaW5nIHRvIHNlcnZlciBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGlucHV0cyBvbiB0aGUgc2VydmljZQorICAgICAgICAqICB3ZSBhbHNvIG5lZWQgdG8gcmVtb3ZlIGFscmVhZHkgc2VsZWN0ZWQgaW5wdXRzICh0aGUgaW5wdXRzIHRoYXQgYWxyZWFkeSBjcmVhdGUgb24gc2VydmVyLCBhbmQgZGlzYWJsZWQgaW4gdGhlIHZpZXcgLSBidXQgdGhleSBhcmUgc2VsZWN0ZWQgc28gdGhleSBhcmUgc3RpbGwgaW4gdGhlIHZpZXcgbW9kZWwKKyAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGNyZWF0ZUlucHV0c0Zvcm1JbnN0YW5jZXMgPSAoaW5zdGFuY2VzSW5wdXRzTWFwOk1vZGVscy5JbnN0YW5jZXNJbnB1dHNNYXBEYXRhKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKworICAgICAgICAgICAgIGxldCBpbnN0YW5jZXNJbnB1dHNNYXBUb0NyZWF0ZTogTW9kZWxzLkluc3RhbmNlc0lucHV0c01hcERhdGEgPSBuZXcgTW9kZWxzLkluc3RhbmNlc0lucHV0c01hcERhdGEoKTsKKyAgICAgICAgICAgIF8uZm9yRWFjaChpbnN0YW5jZXNJbnB1dHNNYXAsIChpbnB1dHM6QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+LCBpbnN0YW5jZUlkOnN0cmluZykgPT4geworCisgICAgICAgICAgICAgICAgaWYoaW5wdXRzICYmIGlucHV0cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSA9IF8uZmluZCh0aGlzLmNvbXBvbmVudEluc3RhbmNlcywgKGluc3RhY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhY2UudW5pcXVlSWQgPT09IGluc3RhbmNlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNJbnB1dHNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXSA9IG5ldyBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4oKTsKKyAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGlucHV0cywgKGlucHV0Ok1vZGVscy5JbnB1dE1vZGVsKSA9PiB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpbnB1dC5pc0FscmVhZHlTZWxlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdJbnB1dCA9IG5ldyBNb2RlbHMuSW5wdXRNb2RlbChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5wdXQubmFtZSA9IGNvbXBvbmVudEluc3RhbmNlLm5vcm1hbGl6ZWROYW1lICsgJ18nICsgaW5wdXQubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNJbnB1dHNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXS5wdXNoKG5ld0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZXNJbnB1dHNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXS5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbnN0YW5jZXNJbnB1dHNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbnN0YW5jZXNJbnB1dHNNYXBUb0NyZWF0ZVtpbnN0YW5jZUlkXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYoT2JqZWN0LmtleXMoaW5zdGFuY2VzSW5wdXRzTWFwVG9DcmVhdGUpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChpbnB1dHNDcmVhdGVkOiBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0cyA9IGlucHV0c0NyZWF0ZWQuY29uY2F0KHRoaXMuaW5wdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpbnB1dHNDcmVhdGVkKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmNyZWF0ZUlucHV0c0Zyb21JbnN0YW5jZXNJbnB1dHModGhpcy51bmlxdWVJZCwgbmV3IE1vZGVscy5JbnN0YW5jZXNJbnB1dHNNYXAoaW5zdGFuY2VzSW5wdXRzTWFwVG9DcmVhdGUpKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGlucHV0IHRvIHZmSW5zdGFuY2VOYW1lICsgaW5wdXQgbmFtZSBiZWZvcmUgc2VuZGluZyB0byBzZXJ2ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBpbnB1dHMgb24gdGhlIHNlcnZpY2UKKyAgICAgICAgcHVibGljIGdldFNlcnZpY2VJbnB1dElucHV0cyA9IChpbnB1dElkOnN0cmluZyk6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGlucHV0SW5wdXRzOiBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCBpbnB1dDogTW9kZWxzLklucHV0TW9kZWwgPSBfLmZpbmQodGhpcy5pbnB1dHMsIChpbnB1dDpNb2RlbHMuSW5wdXRNb2RlbCkgPT4geworICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC51bmlxdWVJZCA9PT0gaW5wdXRJZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpbnB1dC5pbnB1dHMgPSBpbnB1dElucHV0czsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGlucHV0SW5wdXRzKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5nZXRDb21wb25lbnRJbnB1dElucHV0cyh0aGlzLnVuaXF1ZUlkLCBpbnB1dElkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBkZWxldGVTZXJ2aWNlSW5wdXQgPSAoaW5wdXRJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5JbnB1dE1vZGVsPiA9PiB7CisgICAgICAgICAgICB2YXIgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBvblN1Y2Nlc3MgPSAoaW5wdXQ6IE1vZGVscy5JbnB1dE1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGlucHV0KQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIG9uRmFpbGVkID0gKGVycm9yOmFueSkgOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlbGV0ZUNvbXBvbmVudElucHV0KHRoaXMudW5pcXVlSWQsIGlucHV0SWQpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZ2V0QXJ0aWZhY3RzQnlUeXBlID0gKGFydGlmYWN0R3JvdXBUeXBlOnN0cmluZyk6TW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbCA9PiB7CisgICAgICAgICAgICBzd2l0Y2ggKGFydGlmYWN0R3JvdXBUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RHcm91cFR5cGUuREVQTE9ZTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVwbG95bWVudEFydGlmYWN0czsKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdEdyb3VwVHlwZS5JTkZPUk1BVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJ0aWZhY3RzOworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkFydGlmYWN0R3JvdXBUeXBlLlNFUlZJQ0VfQVBJOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlQXBpQXJ0aWZhY3RzOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50c0luc3RhbmNlcy9jb21wb25lbnRJbnN0YW5jZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHNJbnN0YW5jZXMvY29tcG9uZW50SW5zdGFuY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyZjMzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHNJbnN0YW5jZXMvY29tcG9uZW50SW5zdGFuY2UudHMKQEAgLTAsMCArMSwxMjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvNC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2V7CisKKyAgICAgICAgcHVibGljIGNvbXBvbmVudFVpZDogc3RyaW5nOworICAgICAgICBwdWJsaWMgY29tcG9uZW50TmFtZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBwb3NYOiBudW1iZXI7CisgICAgICAgIHB1YmxpYyBwb3NZOiBudW1iZXI7CisgICAgICAgIHB1YmxpYyBjb21wb25lbnRWZXJzaW9uOnN0cmluZzsKKyAgICAgICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBpY29uOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBub3JtYWxpemVkTmFtZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBvcmlnaW5UeXBlOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBkZXBsb3ltZW50QXJ0aWZhY3RzOiBNb2RlbHMuQXJ0aWZhY3RHcm91cE1vZGVsOworICAgICAgICBwdWJsaWMgcHJvcGVydHlWYWx1ZUNvdW50ZXI6IG51bWJlcjsKKyAgICAgICAgcHVibGljIHVuaXF1ZUlkOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjcmVhdGlvblRpbWU6IG51bWJlcjsKKyAgICAgICAgcHVibGljIG1vZGlmaWNhdGlvblRpbWU6IG51bWJlcjsKKyAgICAgICAgcHVibGljIGNhcGFiaWxpdGllczogTW9kZWxzLkNhcGFiaWxpdGllc0dyb3VwOworICAgICAgICBwdWJsaWMgcmVxdWlyZW1lbnRzOiBNb2RlbHMuUmVxdWlyZW1lbnRzR3JvdXA7CisKKyAgICAgICAgLy9jdXN0b20gcHJvcGVydGllcworICAgICAgICBwdWJsaWMgY2VydGlmaWVkOiBib29sZWFuOworICAgICAgICBwdWJsaWMgaWNvblNwcml0ZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBpbnB1dHM6IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPjsKKyAgICAgICAgcHVibGljIHByb3BlcnRpZXM6IEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPjsKKworICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRJbnN0YW5jZT86IENvbXBvbmVudEluc3RhbmNlKSB7CisKKyAgICAgICAgICAgIGlmKGNvbXBvbmVudEluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRVaWQgPSBjb21wb25lbnRJbnN0YW5jZS5jb21wb25lbnRVaWQ7CisgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50SW5zdGFuY2UuY29tcG9uZW50TmFtZTsKKworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50VmVyc2lvbiA9IGNvbXBvbmVudEluc3RhbmNlLmNvbXBvbmVudFZlcnNpb247CisgICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGNvbXBvbmVudEluc3RhbmNlLmRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIHRoaXMuaWNvbiA9IGNvbXBvbmVudEluc3RhbmNlLmljb247CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gY29tcG9uZW50SW5zdGFuY2UubmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWROYW1lID0gY29tcG9uZW50SW5zdGFuY2Uubm9ybWFsaXplZE5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5UeXBlID0gY29tcG9uZW50SW5zdGFuY2Uub3JpZ2luVHlwZTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlcGxveW1lbnRBcnRpZmFjdHMgPSBuZXcgTW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbChjb21wb25lbnRJbnN0YW5jZS5kZXBsb3ltZW50QXJ0aWZhY3RzKTsKKyAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZUlkID0gY29tcG9uZW50SW5zdGFuY2UudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGlvblRpbWUgPSBjb21wb25lbnRJbnN0YW5jZS5jcmVhdGlvblRpbWU7CisgICAgICAgICAgICAgICAgdGhpcy5tb2RpZmljYXRpb25UaW1lID0gY29tcG9uZW50SW5zdGFuY2UubW9kaWZpY2F0aW9uVGltZTsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWVDb3VudGVyID0gY29tcG9uZW50SW5zdGFuY2UucHJvcGVydHlWYWx1ZUNvdW50ZXI7CisgICAgICAgICAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBuZXcgTW9kZWxzLkNhcGFiaWxpdGllc0dyb3VwKGNvbXBvbmVudEluc3RhbmNlLmNhcGFiaWxpdGllcyk7CisgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlbWVudHMgPSBuZXcgTW9kZWxzLlJlcXVpcmVtZW50c0dyb3VwKGNvbXBvbmVudEluc3RhbmNlLnJlcXVpcmVtZW50cyk7CisgICAgICAgICAgICAgICAgdGhpcy5jZXJ0aWZpZWQgPSBjb21wb25lbnRJbnN0YW5jZS5jZXJ0aWZpZWQ7CisgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbihjb21wb25lbnRJbnN0YW5jZS5wb3NYLCBjb21wb25lbnRJbnN0YW5jZS5wb3NZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpc1VjcGUgPSAoKTpib29sZWFuID0+eworICAgICAgICAgICAgaWYodGhpcy5vcmlnaW5UeXBlID09PSAnVkYnICYmIHRoaXMuY2FwYWJpbGl0aWVzICYmIHRoaXMuY2FwYWJpbGl0aWVzWyd0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyJ10gJiYgdGhpcy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigndWNwZScpID4gLTEpeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBpc1ZsID0gKCk6Ym9vbGVhbiA9PnsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm9yaWdpblR5cGUgPT09ICdWTCc7CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgc2V0SW5zdGFuY2VSQyA9ICgpOnZvaWQ9PnsKKyAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnJlcXVpcmVtZW50cywgKHJlcXVpcmVtZW50VmFsdWU6QXJyYXk8YW55PiwgcmVxdWlyZW1lbnRLZXkpPT4geworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudFZhbHVlLCAocmVxdWlyZW1lbnQpPT4geworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmVtZW50Lm93bmVyTmFtZSl7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudFsnb3duZXJJZCddID0gdGhpcy51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50Wydvd25lck5hbWUnXSA9IHRoaXMubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBfLmZvckVhY2godGhpcy5jYXBhYmlsaXRpZXMsIChjYXBhYmlsaXR5VmFsdWU6QXJyYXk8YW55PiwgY2FwYWJpbGl0eUtleSk9PiB7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhcGFiaWxpdHlWYWx1ZSwgKGNhcGFiaWxpdHkpPT4geworICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcGFiaWxpdHkub3duZXJOYW1lKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ293bmVySWQnXSA9IHRoaXMudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5Wydvd25lck5hbWUnXSA9IHRoaXMubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZVBvc2l0aW9uIChwb3NYOm51bWJlciwgcG9zWTpudW1iZXIpIHsKKyAgICAgICAgICAgIHRoaXMucG9zWCA9IHBvc1g7CisgICAgICAgICAgICB0aGlzLnBvc1kgPSBwb3NZOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHRvSlNPTiA9ICgpOmFueSA9PiB7CisKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJJbnN0YW5jZSA9IGFuZ3VsYXIuY29weSh0aGlzKTsKKyAgICAgICAgICAgIHNlcnZlckluc3RhbmNlLmNlcnRpZmllZCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHNlcnZlckluc3RhbmNlLmljb25TcHJpdGUgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICBzZXJ2ZXJJbnN0YW5jZS5pbnB1dHMgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICBzZXJ2ZXJJbnN0YW5jZS5wcm9wZXJ0aWVzID0gdW5kZWZpbmVkOworICAgICAgICAgICAgc2VydmVySW5zdGFuY2UucmVxdWlyZW1lbnRzID0gdW5kZWZpbmVkOworICAgICAgICAgICAgc2VydmVySW5zdGFuY2UuY2FwYWJpbGl0aWVzID0gdW5kZWZpbmVkOworICAgICAgICAgICAgcmV0dXJuIHNlcnZlckluc3RhbmNlOworICAgICAgICB9OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50c0luc3RhbmNlcy9wcm9kdWN0SW5zdGFuY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzSW5zdGFuY2VzL3Byb2R1Y3RJbnN0YW5jZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVmOWJiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50c0luc3RhbmNlcy9wcm9kdWN0SW5zdGFuY2UudHMKQEAgLTAsMCArMSwzNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi80LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBQcm9kdWN0SW5zdGFuY2UgZXh0ZW5kcyBDb21wb25lbnRJbnN0YW5jZXsKKworICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRJbnN0YW5jZT86IFByb2R1Y3RJbnN0YW5jZSkgeworICAgICAgICAgICAgc3VwZXIoY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgdGhpcy5pY29uU3ByaXRlID0gInNwcml0ZS1wcm9kdWN0LWljb25zIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHNJbnN0YW5jZXMvcmVzb3VyY2VJbnN0YW5jZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NvbXBvbmVudHNJbnN0YW5jZXMvcmVzb3VyY2VJbnN0YW5jZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RmMDVkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50c0luc3RhbmNlcy9yZXNvdXJjZUluc3RhbmNlLnRzCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvNC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgUmVzb3VyY2VJbnN0YW5jZSBleHRlbmRzIENvbXBvbmVudEluc3RhbmNleworCisgICAgICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudEluc3RhbmNlPzogUmVzb3VyY2VJbnN0YW5jZSkgeworICAgICAgICAgICAgc3VwZXIoY29tcG9uZW50SW5zdGFuY2UpOworCisgICAgICAgICAgICB0aGlzLmljb25TcHJpdGUgPSAic3ByaXRlLXJlc291cmNlLWljb25zIjsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50c0luc3RhbmNlcy9zZXJ2aWNlSW5zdGFuY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9jb21wb25lbnRzSW5zdGFuY2VzL3NlcnZpY2VJbnN0YW5jZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc4ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY29tcG9uZW50c0luc3RhbmNlcy9zZXJ2aWNlSW5zdGFuY2UudHMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi80LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBTZXJ2aWNlSW5zdGFuY2UgZXh0ZW5kcyBDb21wb25lbnRJbnN0YW5jZXsKKworICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRJbnN0YW5jZT86IFNlcnZpY2VJbnN0YW5jZSkgeworICAgICAgICAgICAgc3VwZXIoY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgdGhpcy5pY29uU3ByaXRlID0gInNwcml0ZS1zZXJ2aWNlcy1pY29ucyI7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NzYXItY29tcG9uZW50LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvY3Nhci1jb21wb25lbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2NDljMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2NzYXItY29tcG9uZW50LnRzCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJQ3NhckNvbXBvbmVudCB7CisgICAgICAgIGRpc3BsYXlOYW1lOnN0cmluZzsKKyAgICAgICAgZGVzY3JpcHRpb246c3RyaW5nOworICAgICAgICB2c3BOYW1lOnN0cmluZzsKKyAgICAgICAgdmVyc2lvbjpzdHJpbmc7CisgICAgICAgIHBhY2thZ2VJZDpzdHJpbmc7CisgICAgICAgIGNhdGVnb3J5OnN0cmluZzsKKyAgICAgICAgc3ViQ2F0ZWdvcnk6c3RyaW5nCisgICAgICAgIHZlbmRvck5hbWU6c3RyaW5nOworICAgICAgICBwYWNrYWdlVHlwZTpzdHJpbmc7CisgICAgICAgIHZlbmRvclJlbGVhc2U6c3RyaW5nOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZGF0YS10eXBlLXByb3BlcnRpZXMudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9kYXRhLXR5cGUtcHJvcGVydGllcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzM5NzhkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZGF0YS10eXBlLXByb3BlcnRpZXMudHMKQEAgLTAsMCArMSw2NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSByY29oZW4gb24gOS8yNS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIERhdGFUeXBlUHJvcGVydHlNb2RlbCB7CisKKyAgICAgICAgLy9zZXJ2ZXIgZGF0YQorICAgICAgICB1bmlxdWVJZDpzdHJpbmc7CisgICAgICAgIHR5cGU6c3RyaW5nOworICAgICAgICByZXF1aXJlZDpib29sZWFuOworICAgICAgICBkZWZpbml0aW9uOmJvb2xlYW47CisgICAgICAgIGRlc2NyaXB0aW9uOnN0cmluZzsKKyAgICAgICAgcGFzc3dvcmQ6Ym9vbGVhbjsKKyAgICAgICAgbmFtZTpzdHJpbmc7CisgICAgICAgIHBhcmVudFVuaXF1ZUlkOnN0cmluZzsKKyAgICAgICAgZGVmYXVsdFZhbHVlOnN0cmluZzsKKyAgICAgICAgY29uc3RyYWludHM6QXJyYXk8YW55PjsKKyAgICAgICAgLy9jdXN0b20KKyAgICAgICAgc2ltcGxlVHlwZTpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IoZGF0YVR5cGVQcm9wZXJ0eTpEYXRhVHlwZVByb3BlcnR5TW9kZWwpIHsKKyAgICAgICAgICAgIGlmIChkYXRhVHlwZVByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IGRhdGFUeXBlUHJvcGVydHkudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gZGF0YVR5cGVQcm9wZXJ0eS50eXBlOworICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZWQgPSBkYXRhVHlwZVByb3BlcnR5LnJlcXVpcmVkOworICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRhdGFUeXBlUHJvcGVydHkuZGVmaW5pdGlvbjsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YVR5cGVQcm9wZXJ0eS5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gZGF0YVR5cGVQcm9wZXJ0eS5wYXNzd29yZDsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBkYXRhVHlwZVByb3BlcnR5Lm5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRVbmlxdWVJZCA9IGRhdGFUeXBlUHJvcGVydHkucGFyZW50VW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkYXRhVHlwZVByb3BlcnR5LmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnRzID0gZGF0YVR5cGVQcm9wZXJ0eS5jb25zdHJhaW50czsKKyAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZVR5cGUgPSBkYXRhVHlwZVByb3BlcnR5LnNpbXBsZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdG9KU09OID0gKCk6YW55ID0+IHsKKyAgICAgICAgICAgIHRoaXMuc2ltcGxlVHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZGF0YS10eXBlcy1tYXAudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9kYXRhLXR5cGVzLW1hcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJlZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZGF0YS10eXBlcy1tYXAudHMKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSByY29oZW4gb24gOS8yNS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIERhdGFUeXBlc01hcERhdGEgeworICAgICAgICBbZGF0YVR5cGVJZDpzdHJpbmddOiBBcnJheTxEYXRhVHlwZU1vZGVsPjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRGF0YVR5cGVzTWFwIHsKKyAgICAgICAgZGF0YVR5cGVzTWFwOkRhdGFUeXBlc01hcERhdGE7CisKKyAgICAgICAgY29uc3RydWN0b3IoZGF0YVR5cGVzTWFwOkRhdGFUeXBlc01hcERhdGEpIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YVR5cGVzTWFwID0gZGF0YVR5cGVzTWFwOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9kYXRhLXR5cGVzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZGF0YS10eXBlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RlMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZGF0YS10eXBlcy50cwpAQCAtMCwwICsxLDU1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IHJjb2hlbiBvbiA5LzI1LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgRGF0YVR5cGVNb2RlbCB7CisKKyAgICAgICAgLy9zZXJ2ZXIgZGF0YQorICAgICAgICBuYW1lOnN0cmluZzsKKyAgICAgICAgdW5pcXVlSWQ6c3RyaW5nOworICAgICAgICBkZXJpdmVkRnJvbU5hbWU6c3RyaW5nOworICAgICAgICBjcmVhdGlvblRpbWU6c3RyaW5nOworICAgICAgICBtb2RpZmljYXRpb25UaW1lOnN0cmluZzsKKyAgICAgICAgcHJvcGVydGllczpBcnJheTxNb2RlbHMuRGF0YVR5cGVQcm9wZXJ0eU1vZGVsPjsKKworICAgICAgICBjb25zdHJ1Y3RvcihkYXRhVHlwZTpEYXRhVHlwZU1vZGVsKSB7CisgICAgICAgICAgICBpZiAoZGF0YVR5cGUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZUlkID0gZGF0YVR5cGUudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gZGF0YVR5cGUubmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlcml2ZWRGcm9tTmFtZSA9IGRhdGFUeXBlLmRlcml2ZWRGcm9tTmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLmNyZWF0aW9uVGltZSA9IGRhdGFUeXBlLmNyZWF0aW9uVGltZTsKKyAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBkYXRhVHlwZS5tb2RpZmljYXRpb25UaW1lOworICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IGRhdGFUeXBlLnByb3BlcnRpZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdG9KU09OID0gKCk6YW55ID0+IHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH07CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2Rpc3RyaWJ1dGlvbi50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2Rpc3RyaWJ1dGlvbi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNhOTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZGlzdHJpYnV0aW9uLnRzCkBAIC0wLDAgKzEsNjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIERpc3RyaWJ1dGlvblN0YXR1c2VzeworICAgICAgICBwdWJsaWMgb21mQ29tcG9uZW50SUQ6IHN0cmluZzsKKyAgICAgICAgcHVibGljIHVybDogIHN0cmluZzsKKyAgICAgICAgcHVibGljIHRpbWVzdGFtcDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBzdGF0dXM6ICBzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGV4cG9ydCBjbGFzcyBEaXN0cmlidXRpb25Db21wb25lbnR7CisgICAgICAgIHB1YmxpYyBvbWZDb21wb25lbnRJRDogc3RyaW5nOworICAgICAgICBwdWJsaWMgdXJsOiAgc3RyaW5nOworICAgICAgICBwdWJsaWMgdGltZXN0YW1wOnN0cmluZzsKKyAgICAgICAgcHVibGljIHN0YXR1czogIHN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBEaXN0cmlidXRpb24geworICAgICAgICBwdWJsaWMgZGlzdHJpYnV0aW9uSUQ6c3RyaW5nOworICAgICAgICBwdWJsaWMgdGltZXN0YW1wOnN0cmluZzsKKyAgICAgICAgcHVibGljIHVzZXJJZDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBkZXBsb3llbWVudFN0YXR1czpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBkaXN0cmlidXRpb25Db21wb25lbnRzOkFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+OworICAgICAgICBwdWJsaWMgc3RhdHVzQ291bnQ6YW55OworICAgICAgICAvL2N1c3RvbSBkYXRhCisgICAgICAgIHB1YmxpYyAgZGF0ZUZvcm1hdDpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHRvSlNPTiA9ICgpOmFueSA9PiB7CisgICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfTsKKworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2ZpbGUtZG93bmxvYWQudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9maWxlLWRvd25sb2FkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzRlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9maWxlLWRvd25sb2FkLnRzCkBAIC0wLDAgKzEsMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnQgaW50ZXJmYWNlIElGaWxlRG93bmxvYWR7CisgICAgICBhcnRpZmFjdE5hbWU6IHN0cmluZzsKKyAgICAgIGJhc2U2NENvbnRlbnRzOnN0cmluZzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZDItbm9kZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2QyLW5vZGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkYWE1NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2QyLW5vZGUudHMKQEAgLTAsMCArMSwzMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KKworLy8gbW9kdWxlIFNkYy5Nb2RlbHMgeworLy8KKy8vICAgICBleHBvcnQgaW50ZXJmYWNlIEQyTm9kZSBleHRlbmRzIGdvLk5vZGUgeworLy8gICAgICAgICAvL1RPRE86c2hvdWxkIGJlIHR5cGVzYWZlIQorLy8gICAgICAgICByZXNvdXJjZTogYW55OworLy8gICAgICAgICBrZXk6c3RyaW5nOworLy8gICAgICAgICBkYXRhOmFueTsKKy8vICAgICAgICAgY2FudmFzUG9zaXRpb246IHt4Om51bWJlcjt5Om51bWJlcn07CisvLyAgICAgfQorLy8gfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tbW9uLWJhc2UtbGluay50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbW1vbi1iYXNlLWxpbmsudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyMWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbW1vbi1iYXNlLWxpbmsudHMKQEAgLTAsMCArMSw1MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNi8yOS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tbW9uTGlua0Jhc2UgeworCisgICAgICAgIGltZzpzdHJpbmc7CisgICAgICAgIGNvbG9yOnN0cmluZzsKKyAgICAgICAgY2xhc3Nlczogc3RyaW5nOworCisgICAgICAgIC8vdGhpcyBpcyBjeXRvc2NhcGVqcyBmaWVsZHMKKyAgICAgICAgcHVibGljIHNvdXJjZTogc3RyaW5nOworICAgICAgICBwdWJsaWMgdGFyZ2V0OiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyB0eXBlOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBpc1NkY0VsZW1lbnQ6IGJvb2xlYW47CisKKyAgICAgICAgY29uc3RydWN0b3IoKSB7CisgICAgICAgICAgICB0aGlzLmlzU2RjRWxlbWVudCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSAnc2RjLWxpbmsnOworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2V0SW1hZ2UgPSAoaW1nVXJsOiBzdHJpbmcpID0+IHsKKyAgICAgICAgICAgIHRoaXMuaW1nID0gaW1nVXJsOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzZXRDb2xvciA9IChjb2xvcjogc3RyaW5nKSA9PiB7CisgICAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21tb24tY2ktbGluay1iYXNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tbW9uLWNpLWxpbmstYmFzZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc0MTZhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tbW9uLWNpLWxpbmstYmFzZS50cwpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA2LzI5LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbW1vbkNpTGlua0Jhc2UgeworCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIENvbW1vbkNpTGlua0Jhc2UgZXh0ZW5kcyBDb21tb25MaW5rQmFzZSBpbXBsZW1lbnRzIElDb21tb25DaUxpbmtCYXNlIHsKKworICAgICAgICByZWxhdGlvbjpSZWxhdGlvbnNoaXBNb2RlbDsKKworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uPzpSZWxhdGlvbnNoaXBNb2RlbCwgc2luZ2xlUmVsYXRpb25zaGlwPzpNb2RlbHMuUmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgaWYgKHJlbGF0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYoc2luZ2xlUmVsYXRpb25zaGlwKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxhdGlvbiA9IG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwocmVsYXRpb24sIHNpbmdsZVJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb24gPSBuZXcgTW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKHJlbGF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSByZWxhdGlvbi5mcm9tTm9kZTsKKyAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHJlbGF0aW9uLnRvTm9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5yZWxhdGlvbiA9IG5ldyBSZWxhdGlvbnNoaXBNb2RlbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLWxpbmstYmFzZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLWxpbmstYmFzZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg3MTk4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktbGluay1iYXNlLnRzCkBAIC0wLDAgKzEsNDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDb21wb3NpdGlvbkNpTGlua0Jhc2UgZXh0ZW5kcyBJQ29tbW9uQ2lMaW5rQmFzZXsKKyAgICAgICAgdXBkYXRlTGlua0RpcmVjdGlvbigpOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uQ2lMaW5rQmFzZSBleHRlbmRzIENvbW1vbkNpTGlua0Jhc2UgaW1wbGVtZW50cyBJQ29tcG9zaXRpb25DaUxpbmtCYXNlIHsKKworICAgICAgICB0eXBlOnN0cmluZzsKKyAgICAgICAgdmlzaWJsZTpib29sZWFuOworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uPzpSZWxhdGlvbnNoaXBNb2RlbCwgc2luZ2xlUmVsYXRpb25zaGlwPzpNb2RlbHMuUmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICBzdXBlcihyZWxhdGlvbiwgc2luZ2xlUmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2V0UmVsYXRpb24gPSAocmVsYXRpb246IE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCkgPT4geworICAgICAgICAgICAgdGhpcy5yZWxhdGlvbiA9IHJlbGF0aW9uOworICAgICAgICB9OworCisgICAgICAgIHVwZGF0ZUxpbmtEaXJlY3Rpb24oKTp2b2lkeworICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnJlbGF0aW9uLmZyb21Ob2RlOworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnJlbGF0aW9uLnRvTm9kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXNpbXBsZS1saW5rLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktc2ltcGxlLWxpbmsudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkZWRkYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXNpbXBsZS1saW5rLnRzCkBAIC0wLDAgKzEsMzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25DaVNpbXBsZUxpbmsgZXh0ZW5kcyBDb21wb3NpdGlvbkNpTGlua0Jhc2UgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uPzpSZWxhdGlvbnNoaXBNb2RlbCwgc2luZ2xlUmVsYXRpb25zaGlwPzpNb2RlbHMuUmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICBzdXBlcihyZWxhdGlvbiwgc2luZ2xlUmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgIHRoaXMuY29sb3IgPSBVdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuQkFTRV9MSU5LOworICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gJ3NpbXBsZS1saW5rJzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXVjcGUtaG9zdC1saW5rLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktdWNwZS1ob3N0LWxpbmsudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzMGMyMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXVjcGUtaG9zdC1saW5rLnRzCkBAIC0wLDAgKzEsMzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDQvMjAvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgIGV4cG9ydCBjbGFzcyBMaW5rVWNwZUhvc3QgZXh0ZW5kcyBDb21wb3NpdGlvbkNpTGlua0Jhc2UgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uPzpSZWxhdGlvbnNoaXBNb2RlbCwgc2luZ2xlUmVsYXRpb25zaGlwPzpNb2RlbHMuUmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICBzdXBlcihyZWxhdGlvbiwgc2luZ2xlUmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gInVjcGUtaG9zdC1saW5rIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXVjcGUtbGluay50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXVjcGUtbGluay50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDAzNWNjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktdWNwZS1saW5rLnRzCkBAIC0wLDAgKzEsMzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25DaVVjcGVMaW5rIGV4dGVuZHMgQ29tcG9zaXRpb25DaUxpbmtCYXNlIHsKKworICAgICAgICBpc0Zyb21VY3BlOiBib29sZWFuOworICAgICAgICBjb25zdHJ1Y3RvcihyZWxhdGlvbj86UmVsYXRpb25zaGlwTW9kZWwsIGZyb20/OmJvb2xlYW4sIHNpbmdsZVJlbGF0aW9uPzpSZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgIHN1cGVyKHJlbGF0aW9uLCBzaW5nbGVSZWxhdGlvbik7CisgICAgICAgICAgICB0aGlzLmlzRnJvbVVjcGUgPSBmcm9tOworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSByZWxhdGlvbi50b05vZGU7CisgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNpbmdsZVJlbGF0aW9uLnJlcXVpcmVtZW50T3duZXJJZDsKKyAgICAgICAgICAgIHRoaXMucmVsYXRpb24ucmVsYXRpb25zaGlwcyA9IFtzaW5nbGVSZWxhdGlvbl07CisgICAgICAgICAgICB0aGlzLmNvbG9yID0gVXRpbHMuQ29uc3RhbnRzLkdyYXBoQ29sb3JzLkJBU0VfTElOSzsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZUxpbmtEaXJlY3Rpb24oKTp2b2lkIHt9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktdmwtbGluay50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXZsLWxpbmsudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0N2RiNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWdyYXBoLWxpbmtzL2NvbXBvc2l0aW9uLWNpLXZsLWxpbmsudHMKQEAgLTAsMCArMSwzNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKworICAgIGV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbkNpVkxpbmsgZXh0ZW5kcyBDb21wb3NpdGlvbkNpTGlua0Jhc2UgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uPzpSZWxhdGlvbnNoaXBNb2RlbCwgc2luZ2xlUmVsYXRpb25zaGlwPzpNb2RlbHMuUmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICBzdXBlcihyZWxhdGlvbiwgc2luZ2xlUmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgIHRoaXMuY29sb3IgPSBVdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuVkxfTElOSzsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9J3ZsLWxpbmsnOworICAgICAgICB9CisKKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktdmwtdWNwZS1saW5rLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tZ3JhcGgtbGlua3MvY29tcG9zaXRpb24tY2ktdmwtdWNwZS1saW5rLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmM3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1ncmFwaC1saW5rcy9jb21wb3NpdGlvbi1jaS12bC11Y3BlLWxpbmsudHMKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNC8yMC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25DaVZsVWNwZUxpbmsgZXh0ZW5kcyBDb21wb3NpdGlvbkNpVWNwZUxpbmsgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uPzpSZWxhdGlvbnNoaXBNb2RlbCwgZnJvbT86Ym9vbGVhbiwgc2luZ2xlUmVsYXRpb24/OlJlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgc3VwZXIocmVsYXRpb24sIGZyb20sIHNpbmdsZVJlbGF0aW9uKTsKKyAgICAgICAgICAgIHRoaXMuY29sb3IgPSBVdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuVkxfTElOSzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL2xpbmtzLWZhY3RvcnkudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9saW5rcy1mYWN0b3J5LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmNkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9saW5rcy1mYWN0b3J5LnRzCkBAIC0wLDAgKzEsODAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDUvMS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlV0aWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgTGlua3NGYWN0b3J5IHsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjcmVhdGVHcmFwaExpbmsgPSAoY3k6IEN5Lkluc3RhbmNlLCByZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwsICBzaW5nbGVSZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwKTpNb2RlbHMuQ29tcG9zaXRpb25DaUxpbmtCYXNlID0+IHsKKworICAgICAgICAgICAgbGV0IG5ld1JlbGF0aW9uOk1vZGVscy5Db21wb3NpdGlvbkNpTGlua0Jhc2U7CisKKyAgICAgICAgICAgIGxldCBmcm9tTm9kZTpNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVCYXNlID0gY3kuZ2V0RWxlbWVudEJ5SWQocmVsYXRpb24uZnJvbU5vZGUpLmRhdGEoKTsKKyAgICAgICAgICAgIGxldCB0b05vZGU6TW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlQmFzZSA9IGN5LmdldEVsZW1lbnRCeUlkKHJlbGF0aW9uLnRvTm9kZSkuZGF0YSgpIDsKKworICAgICAgICAgICAgaWYgKChyZWxhdGlvbi5mcm9tTm9kZSAmJiBmcm9tTm9kZS5pc1VjcGVQYXJ0KSB8fCAocmVsYXRpb24udG9Ob2RlICYmIHRvTm9kZS5pc1VjcGVQYXJ0ICkpIHsgLy9MaW5rIGZyb20gb3IgdG8gbm9kZSBpbnNpZGUgdWNwZQorCisgICAgICAgICAgICAgICAgaWYgKHNpbmdsZVJlbGF0aW9uICYmIHNpbmdsZVJlbGF0aW9uLnJlbGF0aW9uc2hpcC50eXBlICYmIHNpbmdsZVJlbGF0aW9uLnJlbGF0aW9uc2hpcC50eXBlID09ICd0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uJykgeworICAgICAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbiA9IG5ldyBNb2RlbHMuTGlua1VjcGVIb3N0KHJlbGF0aW9uLCBzaW5nbGVSZWxhdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaW5nbGVSZWxhdGlvbi5yZWxhdGlvbnNoaXAudHlwZSAmJiBfLmluY2x1ZGVzKHNpbmdsZVJlbGF0aW9uLnJlbGF0aW9uc2hpcC50eXBlLnRvTG93ZXJDYXNlKCksICdsaW5rJykpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb24gPSBuZXcgTW9kZWxzLkNvbXBvc2l0aW9uQ2lWbFVjcGVMaW5rKHJlbGF0aW9uLCBmcm9tTm9kZS5pc1VjcGVQYXJ0LCBzaW5nbGVSZWxhdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb24gPSBuZXcgTW9kZWxzLkNvbXBvc2l0aW9uQ2lVY3BlTGluayhyZWxhdGlvbiwgZnJvbU5vZGUuaXNVY3BlUGFydCwgc2luZ2xlUmVsYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2luZ2xlUmVsYXRpb24ucmVsYXRpb25zaGlwLnR5cGUgJiYgXy5pbmNsdWRlcyhzaW5nbGVSZWxhdGlvbi5yZWxhdGlvbnNoaXAudHlwZS50b0xvd2VyQ2FzZSgpLCAnbGluaycpKSB7CisgICAgICAgICAgICAgICAgbmV3UmVsYXRpb24gPSBuZXcgTW9kZWxzLkNvbXBvc2l0aW9uQ2lWTGluayhyZWxhdGlvbiwgc2luZ2xlUmVsYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbiA9IG5ldyBNb2RlbHMuQ29tcG9zaXRpb25DaVNpbXBsZUxpbmsocmVsYXRpb24sIHNpbmdsZVJlbGF0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld1JlbGF0aW9uOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjcmVhdGVVY3BlSG9zdExpbmsgPSAocmVsYXRpb246TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKTpNb2RlbHMuTGlua1VjcGVIb3N0ID0+IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxzLkxpbmtVY3BlSG9zdChyZWxhdGlvbik7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZVZMTGluayA9IChyZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwpOk1vZGVscy5Db21wb3NpdGlvbkNpVkxpbmsgPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbHMuQ29tcG9zaXRpb25DaVZMaW5rKHJlbGF0aW9uKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGNyZWF0ZU1vZHVsZUdyYXBoTGlua3M9IChyZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwsICBzaW5nbGVSZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwKTpNb2RlbHMuTW9kdWxlQ2lMaW5rQmFzZSA9PiB7CisKKyAgICAgICAgICAgIGxldCBuZXdSZWxhdGlvbjpNb2RlbHMuTW9kdWxlQ2lMaW5rQmFzZTsKKworICAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKHNpbmdsZVJlbGF0aW9uLnJlbGF0aW9uc2hpcC50eXBlLnRvTG93ZXJDYXNlKCksICdsaW5rJykpIHsKKyAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbiA9IG5ldyBNb2RlbHMuTW9kdWxlQ2lWbExpbmsocmVsYXRpb24sIHNpbmdsZVJlbGF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmV3UmVsYXRpb24gPSBuZXcgTW9kZWxzLk1vZHVsZUNpTGlua0Jhc2UocmVsYXRpb24sIHNpbmdsZVJlbGF0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld1JlbGF0aW9uOworICAgICAgICB9OworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvbW9kdWxlLWdyYXBoLWxpbmtzL21vZHVsZS1jaS1saW5rLWJhc2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ncmFwaC1saW5rcy9tb2R1bGUtZ3JhcGgtbGlua3MvbW9kdWxlLWNpLWxpbmstYmFzZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVlNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvbW9kdWxlLWdyYXBoLWxpbmtzL21vZHVsZS1jaS1saW5rLWJhc2UudHMKQEAgLTAsMCArMSwzOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNi8yOS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElNb2R1bGVDaUxpbmtCYXNlIGV4dGVuZHMgSUNvbW1vbkNpTGlua0Jhc2V7CisKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgTW9kdWxlQ2lMaW5rQmFzZSBleHRlbmRzIENvbW1vbkNpTGlua0Jhc2UgaW1wbGVtZW50cyBJTW9kdWxlQ2lMaW5rQmFzZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IocmVsYXRpb24/OlJlbGF0aW9uc2hpcE1vZGVsLCBzaW5nbGVSZWxhdGlvbnNoaXA/Ok1vZGVscy5SZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgIHN1cGVyKHJlbGF0aW9uLCBzaW5nbGVSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgdGhpcy5jb2xvciA9IFV0aWxzLkNvbnN0YW50cy5HcmFwaENvbG9ycy5CQVNFX0xJTks7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL21vZHVsZS1ncmFwaC1saW5rcy9tb2R1bGUtY2ktdmwtbGluay50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoLWxpbmtzL21vZHVsZS1ncmFwaC1saW5rcy9tb2R1bGUtY2ktdmwtbGluay50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDIxNjEwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGgtbGlua3MvbW9kdWxlLWdyYXBoLWxpbmtzL21vZHVsZS1jaS12bC1saW5rLnRzCkBAIC0wLDAgKzEsMzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDYvMjkvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworCisgICAgZXhwb3J0IGludGVyZmFjZSBJTW9kdWxlQ2lWbExpbmsgZXh0ZW5kcyBJQ29tbW9uQ2lMaW5rQmFzZXsKKworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBNb2R1bGVDaVZsTGluayBleHRlbmRzIENvbW1vbkNpTGlua0Jhc2UgaW1wbGVtZW50cyBJTW9kdWxlQ2lWbExpbmsgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uPzpSZWxhdGlvbnNoaXBNb2RlbCwgc2luZ2xlUmVsYXRpb25zaGlwPzpNb2RlbHMuUmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICBzdXBlcihyZWxhdGlvbiwgc2luZ2xlUmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgIHRoaXMuY29sb3IgPSBVdGlscy5Db25zdGFudHMuR3JhcGhDb2xvcnMuVkxfTElOSzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoVG9vbHRpcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL2dyYXBoVG9vbHRpcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE4NWUxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvZ3JhcGhUb29sdGlwLnRzCkBAIC0wLDAgKzEsMzggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICd1c2Ugc3RyaWN0JzsKKworICBleHBvcnQgY2xhc3MgR3JhcGhUb29sdGlweworICAgICAgcG9zaXRpb246IEN5LlBvc2l0aW9uOworICAgICAgaXNTaG93OmJvb2xlYW47CisgICAgICB0ZXh0OnN0cmluZzsKKworICAgICAgY29uc3RydWN0b3IoKTsKKyAgICAgIGNvbnN0cnVjdG9yKHBvc2l0aW9uOiBDeS5Qb3NpdGlvbiwgaXNTaG93OmJvb2xlYW4sIHRleHQ6IHN0cmluZyk7CisgICAgICBjb25zdHJ1Y3Rvcihwb3NpdGlvbj86IEN5LlBvc2l0aW9uLCBpc1Nob3c/OmJvb2xlYW4sIHRleHQ/OiBzdHJpbmcpIHsKKyAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgdGhpcy5pc1Nob3cgPSBpc1Nob3c7CisgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbGluay1tZW51LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbGluay1tZW51LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNmMzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9saW5rLW1lbnUudHMKQEAgLTAsMCArMSwzOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgTGlua01lbnUgeworICAgICAgICBwb3NpdGlvbjpTZGMuTW9kZWxzLkdyYXBoLlBvaW50OworICAgICAgICBpc1Nob3c6Ym9vbGVhbjsKKyAgICAgICAgbGluazpDeS5Db2xsZWN0aW9uRmlyc3RFZGdlOworCisgICAgICAgIGNvbnN0cnVjdG9yKCk7CisgICAgICAgIGNvbnN0cnVjdG9yKHBvaW50OlNkYy5Nb2RlbHMuR3JhcGguUG9pbnQsIGlzU2hvdzpib29sZWFuLCAgbGluazpDeS5Db2xsZWN0aW9uRmlyc3RFZGdlKTsKKyAgICAgICAgY29uc3RydWN0b3IocG9pbnQ/OlNkYy5Nb2RlbHMuR3JhcGguUG9pbnQsIGlzU2hvdz86Ym9vbGVhbiwgIGxpbms/OkN5LkNvbGxlY3Rpb25GaXJzdEVkZ2UpIHsKKyAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb2ludCA/IHBvaW50OiBuZXcgU2RjLk1vZGVscy5HcmFwaC5Qb2ludCgpOworICAgICAgICAgICAgdGhpcy5pc1Nob3cgPSBpc1Nob3cgPyBpc1Nob3cgOiBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMubGluayA9IGxpbmsgPyBsaW5rIDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbWF0Y2gtcmVsYXRpb24udHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9tYXRjaC1yZWxhdGlvbi50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDg2NGM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbWF0Y2gtcmVsYXRpb24udHMKQEAgLTAsMCArMSwxMDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIE1hdGNoQmFzZSB7CisgICAgICAgIHJlcXVpcmVtZW50Ok1vZGVscy5SZXF1aXJlbWVudDsKKyAgICAgICAgaXNGcm9tVG86Ym9vbGVhbjsKKyAgICAgICAgZnJvbU5vZGU6c3RyaW5nOworICAgICAgICB0b05vZGU6c3RyaW5nOworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlcXVpcmVtZW50Ok1vZGVscy5SZXF1aXJlbWVudCwgaXNGcm9tVG86Ym9vbGVhbiwgZnJvbU5vZGU6c3RyaW5nLCB0b05vZGU6c3RyaW5nKSB7CisgICAgICAgICAgICB0aGlzLnJlcXVpcmVtZW50ID0gcmVxdWlyZW1lbnQ7CisgICAgICAgICAgICB0aGlzLmlzRnJvbVRvID0gaXNGcm9tVG87CisgICAgICAgICAgICB0aGlzLmZyb21Ob2RlID0gZnJvbU5vZGU7CisgICAgICAgICAgICB0aGlzLnRvTm9kZSA9IHRvTm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBnZXREaXNwbGF5VGV4dCA9IChtZW51U2lkZTpzdHJpbmcpOnN0cmluZyA9PiB7cmV0dXJuICcnO307CisKKyAgICAgICAgcHVibGljIGlzT3duZXIgPSAoaWQ6c3RyaW5nKTpib29sZWFuID0+IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgTWF0Y2hSZXFUb1JlcSBleHRlbmRzIE1hdGNoQmFzZSB7CisKKyAgICAgICAgc2Vjb25kUmVxdWlyZW1lbnQ6TW9kZWxzLlJlcXVpcmVtZW50OworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlcXVpcmVtZW50Ok1vZGVscy5SZXF1aXJlbWVudCwgc2Vjb25kUmVxdWlyZW1lbnQ6TW9kZWxzLlJlcXVpcmVtZW50LCBpc0Zyb21Ubzpib29sZWFuLCBmcm9tTm9kZTpzdHJpbmcsIHRvTm9kZTpzdHJpbmcpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlcXVpcmVtZW50LCBpc0Zyb21UbywgZnJvbU5vZGUsIHRvTm9kZSk7CisgICAgICAgICAgICB0aGlzLnNlY29uZFJlcXVpcmVtZW50ID0gc2Vjb25kUmVxdWlyZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0RGlzcGxheVRleHQgPSAobWVudVNpZGU6c3RyaW5nKTpzdHJpbmcgPT4geworICAgICAgICAgICAgaWYgKCdsZWZ0JyA9PSBtZW51U2lkZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVtZW50LmdldEZ1bGxUaXRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kUmVxdWlyZW1lbnQuZ2V0RnVsbFRpdGxlKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGlzT3duZXIgPSAoaWQ6c3RyaW5nKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnNlY29uZFJlcXVpcmVtZW50Lm93bmVySWQgPT09IGlkIHx8IHRoaXMucmVxdWlyZW1lbnQub3duZXJJZCA9PT0gaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgTWF0Y2hSZXFUb0NhcGFiaWxpdHkgZXh0ZW5kcyBNYXRjaEJhc2UgeworCisgICAgICAgIGNhcGFiaWxpdHk6TW9kZWxzLkNhcGFiaWxpdHk7CisKKyAgICAgICAgY29uc3RydWN0b3IocmVxdWlyZW1lbnQ6TW9kZWxzLlJlcXVpcmVtZW50LCBjYXBhYmlsaXR5Ok1vZGVscy5DYXBhYmlsaXR5LCBpc0Zyb21Ubzpib29sZWFuLCBmcm9tTm9kZTpzdHJpbmcsIHRvTm9kZTpzdHJpbmcpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlcXVpcmVtZW50LCBpc0Zyb21UbywgZnJvbU5vZGUsIHRvTm9kZSk7CisgICAgICAgICAgICB0aGlzLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG1hdGNoVG9SZWxhdGlvbiA9ICgpOk1vZGVscy5SZWxhdGlvbnNoaXAgPT4geworICAgICAgICAgICAgbGV0IHJlbGF0aW9uc2hpcDpNb2RlbHMuUmVsYXRpb25zaGlwID0gbmV3IE1vZGVscy5SZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5jYXBhYmlsaXR5ID0gdGhpcy5jYXBhYmlsaXR5Lm5hbWU7CisgICAgICAgICAgICByZWxhdGlvbnNoaXAuY2FwYWJpbGl0eU93bmVySWQgPSB0aGlzLmNhcGFiaWxpdHkub3duZXJJZDsKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5jYXBhYmlsaXR5VWlkID0gdGhpcy5jYXBhYmlsaXR5LnVuaXF1ZUlkOworICAgICAgICAgICAgcmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcCA9IG5ldyBNb2RlbHMuUmVsYXRpb25UeXBlKHRoaXMuY2FwYWJpbGl0eS50eXBlKTsKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5yZXF1aXJlbWVudCA9IHRoaXMucmVxdWlyZW1lbnQubmFtZTsKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5yZXF1aXJlbWVudE93bmVySWQgPSB0aGlzLnJlcXVpcmVtZW50Lm93bmVySWQ7CisgICAgICAgICAgICByZWxhdGlvbnNoaXAucmVxdWlyZW1lbnRVaWQgPSB0aGlzLnJlcXVpcmVtZW50LnVuaXF1ZUlkOworICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcDsKKyAgICAgICAgfTsKKworCisgICAgICAgIHB1YmxpYyBnZXREaXNwbGF5VGV4dCA9IChtZW51U2lkZTpzdHJpbmcpOnN0cmluZyA9PiB7CisgICAgICAgICAgICBpZiAodGhpcy5pc0Zyb21UbyAmJiAnbGVmdCcgPT0gbWVudVNpZGUgfHwgIXRoaXMuaXNGcm9tVG8gJiYgJ3JpZ2h0JyA9PSBtZW51U2lkZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVtZW50LmdldEZ1bGxUaXRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FwYWJpbGl0eS5nZXRGdWxsVGl0bGUoKTsKKworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBpc093bmVyID0gKGlkOnN0cmluZyk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jYXBhYmlsaXR5Lm93bmVySWQgPT09IGlkIHx8IHRoaXMucmVxdWlyZW1lbnQub3duZXJJZCA9PT0gaWQ7CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgbWF0Y2hUb1JlbGF0aW9uTW9kZWwgPSAoKTpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwgPT4geworICAgICAgICAgICAgbGV0IHJlbGF0aW9uc2hpcE1vZGVsOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCA9IG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwoKTsKKyAgICAgICAgICAgIGxldCByZWxhdGlvbnNoaXA6TW9kZWxzLlJlbGF0aW9uc2hpcCA9IHRoaXMubWF0Y2hUb1JlbGF0aW9uKCk7CisgICAgICAgICAgICByZWxhdGlvbnNoaXBNb2RlbC5zZXRSZWxhdGlvbnNoaXBNb2RlbFBhcmFtcyh0aGlzLmZyb21Ob2RlLCB0aGlzLnRvTm9kZSwgW3JlbGF0aW9uc2hpcF0pOworICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcE1vZGVsOworICAgICAgICB9OworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2Jhc2UtY29tbW9uLW5vZGUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9iYXNlLWNvbW1vbi1ub2RlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTU3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9iYXNlLWNvbW1vbi1ub2RlLnRzCkBAIC0wLDAgKzEsNzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDYvMjkvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLk1vZGVscy5HcmFwaCB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1vbk5vZGVCYXNlIHsKKworICAgICAgICBwdWJsaWMgZGlzcGxheU5hbWU6c3RyaW5nOworICAgICAgICBwdWJsaWMgbmFtZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBpbWc6c3RyaW5nOworICAgICAgICBwdWJsaWMgY2VydGlmaWVkOmJvb2xlYW47CisgICAgICAgIHB1YmxpYyBpc0dyb3VwOmJvb2xlYW47CisgICAgICAgIHB1YmxpYyBpbWFnZXNQYXRoOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBpc0RyYWdnYWJsZTogYm9vbGVhbjsgLy93ZSBuZWVkIHRvIHRvIG1hbmFnZSBtYW51YWxseSB0aGUgZHJhZ2dpbmcgb24gdGhlIGdyYXBoIGluc2lkZSBncm91cHMgKHVjcGUtY3AgaXMgbm90IGRyYWdnYWJsZSkKKworICAgICAgICAvL2N5dG9zY2FwZSBmaWVsZHMKKyAgICAgICAgcHVibGljIGlkOnN0cmluZzsKKyAgICAgICAgcHVibGljIHR5cGU6c3RyaW5nOyAvL3R5cGUgaXMgZm9yIHRoZSBlZGdlIGVkaXRpb24gZXh0ZW5zaW9uLCBieSB0eXBlIHdlIHB1dCB0aGUgZ3JlZW4gcGx1cyBpY29uIGluIHBvc2l0aW9uCisgICAgICAgIHB1YmxpYyBpc1NkY0VsZW1lbnQ6Ym9vbGVhbjsgLy90aGlzIGZpZWxkcyBpcyBpbiBvcmRlciB0byBmaWx0ZXIgc2RjIGVsZW1lbnRzIGZyb20gYWxsIGV4dGVuc2lvbnMgZWxlbWVudHMKKyAgICAgICAgcHVibGljIGNsYXNzZXM6IHN0cmluZzsKKyAgICAgICAgcHVibGljIHBhcmVudDogc3RyaW5nOworICAgICAgICBwdWJsaWMgYWxsb3dDb25uZWN0aW9uOiBib29sZWFuOyAvL3RoaXMgaXMgZm9yIGVnZUVkaXRpb24gZXh0ZW5zaW9uIGluIG9yZGVyIHRvIGRlY2lkZSBpZiBjb25uZWN0aW9uIHRvIGEgbm9kZSBpcyBhdmFpbGFibGUKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKworICAgICAgICAgICAgdGhpcy5pbWFnZXNQYXRoID0gU2VydmljZXMuQW5ndWxhckpTQnJpZGdlLmdldEFuZ3VsYXJDb25maWcoKS5pbWFnZXNQYXRoOworICAgICAgICAgICAgdGhpcy50eXBlID0gImJhc2ljLW5vZGUiOworICAgICAgICAgICAgdGhpcy5pc1NkY0VsZW1lbnQgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5pc0RyYWdnYWJsZSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmFsbG93Q29ubmVjdGlvbiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdXBkYXRlTmFtZUZvckRpc3BsYXkgPSgpID0+IHsKKyAgICAgICAgICAgIGxldCBjb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTsKKyAgICAgICAgICAgIGNvbnRleHQuZm9udCA9ICIxM3B4IEFyaWFsIjsKKworICAgICAgICAgICAgaWYgKDYzIDwgY29udGV4dC5tZWFzdXJlVGV4dCh0aGlzLm5hbWUpLndpZHRoKSB7CisgICAgICAgICAgICAgICAgbGV0IG5ld0xlbiA9IHRoaXMubmFtZS5sZW5ndGggLSAzOworICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lID0gdGhpcy5uYW1lLnN1YnN0cmluZygwLCBuZXdMZW4pOworCisgICAgICAgICAgICAgICAgd2hpbGUgKDYwIDwgKGNvbnRleHQubWVhc3VyZVRleHQobmV3TmFtZSkud2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnN1YnN0cmluZygwLCAoLS1uZXdMZW4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9ICBuZXdOYW1lICsgJy4uLic7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gdGhpcy5uYW1lOworICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbW1vbi1jaS1ub2RlLWJhc2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21tb24tY2ktbm9kZS1iYXNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTc2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21tb24tY2ktbm9kZS1iYXNlLnRzCkBAIC0wLDAgKzEsNDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscy5HcmFwaCB7CisKKyAgICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbW9uQ0lOb2RlQmFzZSBleHRlbmRzIENvbW1vbk5vZGVCYXNlIHsKKworICAgICAgICBwdWJsaWMgY2VydGlmaWVkOmJvb2xlYW47CisgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZTpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZTsKKyAgICAgICAgcHVibGljIGdyb3VwOnN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcihpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLmNvbXBvbmVudEluc3RhbmNlLnVuaXF1ZUlkOworICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb21wb25lbnRJbnN0YW5jZS5uYW1lOworICAgICAgICAgICAgdGhpcy5pbWcgPSAnJzsKKyAgICAgICAgICAgIHRoaXMuY2VydGlmaWVkID0gdGhpcy5pc0NlcnRpZmllZCh0aGlzLmNvbXBvbmVudEluc3RhbmNlLmNvbXBvbmVudFZlcnNpb24pOworICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGluc3RhbmNlLm5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGlzQ2VydGlmaWVkKHZlcnNpb246c3RyaW5nKTpib29sZWFuIHsKKyAgICAgICAgICAgIHJldHVybiAwID09PSAocGFyc2VGbG9hdCh2ZXJzaW9uKSkgJSAxOworICAgICAgICB9CisKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtYmFzZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtYmFzZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjRjMGRmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS1iYXNlLnRzCkBAIC0wLDAgKzEsNzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+CisKK21vZHVsZSBTZGMuTW9kZWxzLkdyYXBoIHsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvc2l0aW9uQ2lOb2RlQmFzZSB7CisKKyAgICB9CisKKworICAgIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb3NpdGlvbkNpTm9kZUJhc2UgZXh0ZW5kcyBDb21tb25DSU5vZGVCYXNlIGltcGxlbWVudHMgSUNvbXBvc2l0aW9uQ2lOb2RlQmFzZSB7CisKKyAgICAgICAgcHVibGljIHRleHRQb3NpdGlvbjogc3RyaW5nOyAvL25lZWQgdG8gbW92ZSB0byBjcCBVQ1BFCisgICAgICAgIHB1YmxpYyBpc1VjcGU6IGJvb2xlYW47CisgICAgICAgIHB1YmxpYyBpc0luc2lkZUdyb3VwOiBib29sZWFuOworICAgICAgICBwdWJsaWMgaXNVY3BlUGFydDogYm9vbGVhbjsKKworICAgICAgICBjb25zdHJ1Y3RvcihpbnN0YW5jZTogTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbWFnZUNyZWF0b3I6IFV0aWxzLkltYWdlQ3JlYXRvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGluc3RhbmNlKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0KCkgeworCisgICAgICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gdGhpcy5nZXREaXNwbGF5TmFtZSgpOworICAgICAgICAgICAgdGhpcy5pc1VjcGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuaXNHcm91cCA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5pc1VjcGVQYXJ0ID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmlzSW5zaWRlR3JvdXAgPSBmYWxzZTsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGluaXRJbWFnZShub2RlOiBDeS5Db2xsZWN0aW9uKTogc3RyaW5nIHsKKworICAgICAgICAgICAgdGhpcy5pbWFnZUNyZWF0b3IuZ2V0SW1hZ2VCYXNlNjQodGhpcy5pbWFnZXNQYXRoICsgVXRpbHMuQ29uc3RhbnRzLkltYWdlc1VybC5SRVNPVVJDRV9JQ09OUyArIHRoaXMuY29tcG9uZW50SW5zdGFuY2UuaWNvbiArICcucG5nJywKKyAgICAgICAgICAgICAgICB0aGlzLmltYWdlc1BhdGggKyBVdGlscy5Db25zdGFudHMuSW1hZ2VzVXJsLlJFU09VUkNFX0lDT05TICsgJ3VuY2VydGlmaWVkLnBuZycpCisgICAgICAgICAgICAgICAgLnRoZW4oaW1hZ2VCYXNlNjQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLmltZyA9IGltYWdlQmFzZTY0OworICAgICAgICAgICAgICAgICAgICBub2RlLnN0eWxlKHsnYmFja2dyb3VuZC1pbWFnZSc6IHRoaXMuaW1nfSk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmltZzsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBnZXREaXNwbGF5TmFtZSgpOiBzdHJpbmcgeworCisgICAgICAgICAgICBsZXQgZ3JhcGhSZXNvdXJjZU5hbWUgPSBTZXJ2aWNlcy5Bbmd1bGFySlNCcmlkZ2UuZ2V0RmlsdGVyKCdncmFwaFJlc291cmNlTmFtZScpOworICAgICAgICAgICAgbGV0IHJlc291cmNlTmFtZSA9IFNlcnZpY2VzLkFuZ3VsYXJKU0JyaWRnZS5nZXRGaWx0ZXIoJ3Jlc291cmNlTmFtZScpOworICAgICAgICAgICAgcmV0dXJuIGdyYXBoUmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSh0aGlzLmNvbXBvbmVudEluc3RhbmNlLm5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS1jcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtY3AudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4NmM4MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtY3AudHMKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5Nb2RlbHMuR3JhcGggeworCisgICAgZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uQ2lOb2RlQ3AgZXh0ZW5kcyBDb21wb3NpdGlvbkNpTm9kZUJhc2UgeworCisgICAgICAgIGNvbnN0cnVjdG9yKGluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBpbWFnZUNyZWF0b3I6IFV0aWxzLkltYWdlQ3JlYXRvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGluc3RhbmNlLCBpbWFnZUNyZWF0b3IpOworICAgICAgICAgICAgdGhpcy5pbml0Q3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdENwKCk6dm9pZCB7CisgICAgICAgICAgICBsZXQgc2RjQ29uZmlnID0gU2VydmljZXMuQW5ndWxhckpTQnJpZGdlLmdldEFuZ3VsYXJDb25maWcoKTsKKyAgICAgICAgICAgIHRoaXMuaW1nID0gc2RjQ29uZmlnLmltYWdlc1BhdGggKyBVdGlscy5Db25zdGFudHMuSW1hZ2VzVXJsLlJFU09VUkNFX0lDT05TICsgdGhpcy5jb21wb25lbnRJbnN0YW5jZS5pY29uICsgJy5wbmcnOworICAgICAgICAgICAgdGhpcy50eXBlID0gImJhc2ljLXNtYWxsLW5vZGUiOworICAgICAgICAgICAgLy9pZiB0aGUgY3AgZnJvbSB0eXBlIGNwRW5kUG9pbnRJbnN0YW5jZXMgY3JlYXRlIHdpdGggYW5vdGhlciB0ZW1wbGF0ZQorICAgICAgICAgICAgaWYoc2RjQ29uZmlnLmNwRW5kUG9pbnRJbnN0YW5jZXMuaW5kZXhPZih0aGlzLmNvbXBvbmVudEluc3RhbmNlLmljb24pID4gLTEpeworICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9ICdjcC1lbmQtcG9pbnQtbm9kZSc7CisgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gJ2NwLW5vZGUnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIXRoaXMuY2VydGlmaWVkKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gdGhpcy5jbGFzc2VzICsgJyBub3QtY2VydGlmaWVkJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYmYwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXNlcnZpY2UudHMKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5Nb2RlbHMuR3JhcGggeworCisgICAgZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uQ2lOb2RlU2VydmljZSBleHRlbmRzIENvbXBvc2l0aW9uQ2lOb2RlQmFzZSB7CisKKyAgICAgICAgY29uc3RydWN0b3IoaW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIGltYWdlQ3JlYXRvcjogVXRpbHMuSW1hZ2VDcmVhdG9yU2VydmljZSkgeworICAgICAgICAgICAgc3VwZXIoaW5zdGFuY2UsIGltYWdlQ3JlYXRvcik7CisgICAgICAgICAgICB0aGlzLmluaXRTZXJ2aWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRTZXJ2aWNlKCk6dm9pZCB7CisKKyAgICAgICAgICAgIHRoaXMuaW1nID0gdGhpcy5pbWFnZXNQYXRoICsgVXRpbHMuQ29uc3RhbnRzLkltYWdlc1VybC5TRVJWSUNFX0lDT05TICsgdGhpcy5jb21wb25lbnRJbnN0YW5jZS5pY29uICsgJy5wbmcnOworICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gJ3NlcnZpY2Utbm9kZScKKyAgICAgICAgICAgIGlmKCF0aGlzLmNlcnRpZmllZCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY2xhc3NlcyArICcgbm90LWNlcnRpZmllZCc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtdWNwZS1jcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtdWNwZS1jcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTIzZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS11Y3BlLWNwLnRzCkBAIC0wLDAgKzEsMzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+CisKK21vZHVsZSBTZGMuTW9kZWxzLkdyYXBoIHsKKyAgICAKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25DaU5vZGVVY3BlQ3AgZXh0ZW5kcyBDb21wb3NpdGlvbkNpTm9kZUNwIHsKKworICAgICAgICBjb25zdHJ1Y3RvcihpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VDcmVhdG9yOiBVdGlscy5JbWFnZUNyZWF0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICBzdXBlcihpbnN0YW5jZSwgaW1hZ2VDcmVhdG9yKTsKKyAgICAgICAgICAgIHRoaXMuaXNVY3BlUGFydCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSAndWNwZS1jcCc7IC8vIHRoZSBjc3MgY2xhc3MgZm9yIHRoZSBub2RlCisgICAgICAgICAgICB0aGlzLnBhcmVudCA9IGluc3RhbmNlLnVuaXF1ZUlkOworICAgICAgICAgICAgdGhpcy50eXBlID0gJ3VjcGUtY3Atbm9kZSc7IC8vdGhlIHR5cGUgaXMgZm9yIHRoZSBoYW5kbGUgKHBsdXMgaWNvbikgZXh0ZW5zaW9uCisgICAgICAgICAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7CisgICAgICAgIH0KKworCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXVjcGUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXVjcGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5MWUwMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtdWNwZS50cwpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLk1vZGVscy5HcmFwaCB7CisKKyAgICBleHBvcnQgY2xhc3MgTm9kZVVjcGUgZXh0ZW5kcyBDb21wb3NpdGlvbkNpTm9kZUJhc2UgeworICAgICAgICBjb25zdHJ1Y3RvcihpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VDcmVhdG9yOlV0aWxzLkltYWdlQ3JlYXRvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGluc3RhbmNlLCBpbWFnZUNyZWF0b3IpOworICAgICAgICAgICAgdGhpcy5pbml0VWNwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0VWNwZSgpOnZvaWQgeworICAgICAgICAgICAgdGhpcy5pc1VjcGUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5pc0dyb3VwID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuaXNVY3BlUGFydCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSAndWNwZS1ub2RlJzsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9ICd1Y3BlLW5vZGUnOworICAgICAgICAgICAgdGhpcy5hbGxvd0Nvbm5lY3Rpb24gPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKCF0aGlzLmNlcnRpZmllZCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY2xhc3NlcyArICcgbm90LWNlcnRpZmllZC11Y3BlJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtdmYudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXZmLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTA5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXZmLnRzCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+CisKK21vZHVsZSBTZGMuTW9kZWxzLkdyYXBoIHsKKworICAgIGV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbkNpTm9kZVZmIGV4dGVuZHMgQ29tcG9zaXRpb25DaU5vZGVCYXNlIHsKKworICAgICAgICBjb25zdHJ1Y3RvcihpbnN0YW5jZTogTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIGltYWdlQ3JlYXRvcjogVXRpbHMuSW1hZ2VDcmVhdG9yU2VydmljZSkgeworICAgICAgICAgICAgc3VwZXIoaW5zdGFuY2UsIGltYWdlQ3JlYXRvcik7CisgICAgICAgICAgICB0aGlzLmluaXRWZigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0VmYoKTogdm9pZCB7CisgICAgICAgICAgICB0aGlzLmltZyA9IHRoaXMuaW1hZ2VzUGF0aCArIFV0aWxzLkNvbnN0YW50cy5JbWFnZXNVcmwuUkVTT1VSQ0VfSUNPTlMgKyB0aGlzLmNvbXBvbmVudEluc3RhbmNlLmljb24gKyAnLnBuZyc7CisgICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSAndmYtbm9kZSc7CisgICAgICAgICAgICBpZighdGhpcy5jZXJ0aWZpZWQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNsYXNzZXMgKyAnIG5vdC1jZXJ0aWZpZWQnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXZmYy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL2NvbXBvc2l0aW9uLWdyYXBoLW5vZGVzL2NvbXBvc2l0aW9uLWNpLW5vZGUtdmZjLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjQ1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXZmYy50cwpAQCAtMCwwICsxLDMzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLk1vZGVscy5HcmFwaCB7CisgICAgZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uQ2lOb2RlVmZjIGV4dGVuZHMgQ29tcG9zaXRpb25DaU5vZGVCYXNlIHsKKyAgICAgICAgY29uc3RydWN0b3IoaW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UsIGltYWdlQ3JlYXRvcjogVXRpbHMuSW1hZ2VDcmVhdG9yU2VydmljZSkgeworICAgICAgICAgICAgc3VwZXIoaW5zdGFuY2UsIGltYWdlQ3JlYXRvcik7CisgICAgICAgICAgICB0aGlzLmluaXRWZmMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFZmYygpOnZvaWQgeworICAgICAgICAgICAgdGhpcy5pbWcgPSB0aGlzLmltYWdlc1BhdGggKyBVdGlscy5Db25zdGFudHMuSW1hZ2VzVXJsLlJFU09VUkNFX0lDT05TKyB0aGlzLmNvbXBvbmVudEluc3RhbmNlLmljb24gKyAnLnBuZyc7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9jb21wb3NpdGlvbi1ncmFwaC1ub2Rlcy9jb21wb3NpdGlvbi1jaS1ub2RlLXZsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS12bC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlhMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvY29tcG9zaXRpb24tZ3JhcGgtbm9kZXMvY29tcG9zaXRpb24tY2ktbm9kZS12bC50cwpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLk1vZGVscy5HcmFwaCB7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25DaU5vZGVWbCBleHRlbmRzIENvbXBvc2l0aW9uQ2lOb2RlQmFzZSB7CisgICAgICAgIHByaXZhdGUgdG9vbFRpcFRleHQ6c3RyaW5nOworICAgICAgCisgICAgICAgIGNvbnN0cnVjdG9yKGluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlLCBpbWFnZUNyZWF0b3I6IFV0aWxzLkltYWdlQ3JlYXRvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGluc3RhbmNlLCBpbWFnZUNyZWF0b3IpOworICAgICAgICAgICAgdGhpcy5pbml0VmwoKTsKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0VmwoKTp2b2lkIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9ICJiYXNpYy1zbWFsbC1ub2RlIjsKKyAgICAgICAgICAgIHRoaXMudG9vbFRpcFRleHQgPSAnUG9pbnQgdG8gcG9pbnQnOworICAgICAgICAgICAgbGV0IGtleTpzdHJpbmcgPSBfLmZpbmQoT2JqZWN0LmtleXModGhpcy5jb21wb25lbnRJbnN0YW5jZS5jYXBhYmlsaXRpZXMpLCAoa2V5KT0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmNsdWRlcyhrZXkudG9Mb3dlckNhc2UoKSwgJ2xpbmthYmxlJyk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGxldCBsaW5rYWJsZSA9IHRoaXMuY29tcG9uZW50SW5zdGFuY2UuY2FwYWJpbGl0aWVzW2tleV07CisgICAgICAgICAgICBpZiAobGlua2FibGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoJ1VOQk9VTkRFRCcgPT0gbGlua2FibGVbMF0ubWF4T2NjdXJyZW5jZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sVGlwVGV4dCA9ICdNdWx0aSBwb2ludCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5pbWcgPSB0aGlzLmltYWdlc1BhdGggKyBVdGlscy5Db25zdGFudHMuSW1hZ2VzVXJsLlJFU09VUkNFX0lDT05TICsgJ3ZsLnBuZyc7CisKKyAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9ICd2bC1ub2RlJzsKKyAgICAgICAgICAgIGlmKCF0aGlzLmNlcnRpZmllZCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY2xhc3NlcyArICcgbm90LWNlcnRpZmllZCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL21vZHVsZXMtZ3JhcGgtbm9kZXMvbW9kdWxlLW5vZGUtYmFzZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL25vZGVzL21vZHVsZXMtZ3JhcGgtbm9kZXMvbW9kdWxlLW5vZGUtYmFzZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDZhYjNiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvbW9kdWxlcy1ncmFwaC1ub2Rlcy9tb2R1bGUtbm9kZS1iYXNlLnRzCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDYvMjkvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLk1vZGVscy5HcmFwaCB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJTW9kdWxlTm9kZUJhc2UgeworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBNb2R1bGVOb2RlQmFzZSBleHRlbmRzIENvbW1vbk5vZGVCYXNlIGltcGxlbWVudHMgSU1vZHVsZU5vZGVCYXNlIHsKKworICAgICAgICBtb2R1bGU6TW9kdWxlOworCisgICAgICAgIGNvbnN0cnVjdG9yKG1vZHVsZTpNb2R1bGUpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgICAgIHRoaXMuaW5pdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0KCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5tb2R1bGUudW5pcXVlSWQ7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm1vZHVsZS5uYW1lOworICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IHRoaXMubW9kdWxlLm5hbWU7CisgICAgICAgICAgICB0aGlzLmlzR3JvdXAgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5pbWcgPSBVdGlscy5Db25zdGFudHMuSU1BR0VfUEFUSCArIFV0aWxzLkNvbnN0YW50cy5JbWFnZXNVcmwuTU9EVUxFX0lDT047CisgICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSAibW9kdWxlLW5vZGUiOworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9ub2Rlcy9ub2Rlcy1mYWN0b3J5LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvbm9kZXMtZmFjdG9yeS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTliMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvbm9kZXMvbm9kZXMtZmFjdG9yeS50cwpAQCAtMCwwICsxLDYzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5VdGlscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIE5vZGVzRmFjdG9yeSB7CisKKyAgICAgICAgY29uc3RydWN0b3IoCisgICAgICAgICAgICBwcml2YXRlIGltYWdlQ3JlYXRvcjpJbWFnZUNyZWF0b3JTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY3JlYXRlTm9kZSA9IChpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6TW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlQmFzZSA9PiB7CisKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZS5pc1VjcGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxzLkdyYXBoLk5vZGVVY3BlKGluc3RhbmNlLCB0aGlzLmltYWdlQ3JlYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5zdGFuY2Uub3JpZ2luVHlwZSA9PT0gVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuU0VSVklDRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlU2VydmljZShpbnN0YW5jZSwgdGhpcy5pbWFnZUNyZWF0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluc3RhbmNlLm9yaWdpblR5cGUgPT09IFV0aWxzLkNvbnN0YW50cy5SZXNvdXJjZVR5cGUuQ1ApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZUNwKGluc3RhbmNlLCB0aGlzLmltYWdlQ3JlYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5zdGFuY2Uub3JpZ2luVHlwZSA9PT0gVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZS5WTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlVmwoaW5zdGFuY2UsIHRoaXMuaW1hZ2VDcmVhdG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVWZihpbnN0YW5jZSwgdGhpcy5pbWFnZUNyZWF0b3IpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjcmVhdGVNb2R1bGVOb2RlID0gKG1vZHVsZTpNb2RlbHMuTW9kdWxlKTpNb2RlbHMuR3JhcGguTW9kdWxlTm9kZUJhc2UgPT4geworCisgICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVscy5HcmFwaC5Nb2R1bGVOb2RlQmFzZShtb2R1bGUpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjcmVhdGVVY3BlQ3BOb2RlID0gKGluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTpNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVDcCA9PiB7CisKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVVY3BlQ3AoaW5zdGFuY2UsIHRoaXMuaW1hZ2VDcmVhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE5vZGVzRmFjdG9yeS4kaW5qZWN0ID0gWworICAgICAgICAnSW1hZ2VDcmVhdG9yU2VydmljZScKKyAgICBdOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvcG9pbnQudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9wb2ludC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWZkNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvcG9pbnQudHMKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiAxMS83LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5Nb2RlbHMuR3JhcGggeworCisKKyAgICBleHBvcnQgY2xhc3MgUG9pbnQgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR3by1hcmd1bWVudCBjb25zdHJ1Y3RvciBwcm9kdWNlcyB0aGUgUG9pbnQoeCwgeSkuCisgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4CisgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5CisgICAgICAgICAqLworICAgICAgICBjb25zdHJ1Y3Rvcih4PzpudW1iZXIsIHk/Om51bWJlcikgeworICAgICAgICAgICAgdGhpcy54ID0geCB8fCAwOworICAgICAgICAgICAgdGhpcy55ID0geSB8fCAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqR2V0cyBvciBzZXRzIHRoZSB4IHZhbHVlIG9mIHRoZSBQb2ludC4qLworICAgICAgICB4Om51bWJlcjsKKworICAgICAgICAvKipHZXRzIG9yIHNldHMgdGhlIHkgdmFsdWUgb2YgdGhlIFBvaW50LiovCisgICAgICAgIHk6bnVtYmVyOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9ncmFwaC9yZWxhdGlvbk1lbnVPYmplY3RzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvcmVsYXRpb25NZW51T2JqZWN0cy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjZlZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvcmVsYXRpb25NZW51T2JqZWN0cy50cwpAQCAtMCwwICsxLDEzOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKworICAgIGV4cG9ydCBjbGFzcyBSZWxhdGlvbk1lbnVEaXJlY3RpdmVPYmogeworCisgICAgICAgIGZyb21Ob2RlOk1vZGVscy5HcmFwaC5Db21wb3NpdGlvbkNpTm9kZUJhc2U7CisgICAgICAgIHRvTm9kZTpNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVCYXNlOworICAgICAgICAvLyAgbW9kZWxMaW5rczpBcnJheTxNb2RlbHMuQ29tcG9zaXRpb25DaUxpbmtCYXNlPjsKKyAgICAgICAgbXAybXBWTDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ7CisgICAgICAgIHAycFZMOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgbWVudVBvc2l0aW9uOiBDeS5Qb3NpdGlvbjsKKyAgICAgICAgcmlnaHRTaWRlTGluazpHcmFwaExpbmtNZW51U2lkZTsKKyAgICAgICAgbGVmdFNpZGVMaW5rOkdyYXBoTGlua01lbnVTaWRlOworICAgICAgICBzZWxlY3Rpb25UZXh0OnN0cmluZzsKKyAgICAgICAgdmxUeXBlOnN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3Rvcihmcm9tTm9kZTpNb2RlbHMuR3JhcGguQ29tcG9zaXRpb25DaU5vZGVCYXNlLCB0b05vZGU6TW9kZWxzLkdyYXBoLkNvbXBvc2l0aW9uQ2lOb2RlQmFzZSwgbXAybXBWTDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQsIHAycFZMOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgbWVudVBvc2l0aW9uOkN5LlBvc2l0aW9uLCBwb3NzaWJsZVJlbGF0aW9uczpBcnJheTxNb2RlbHMuTWF0Y2hCYXNlPikgeworICAgICAgICAgICAgdGhpcy5mcm9tTm9kZSA9IGZyb21Ob2RlOworICAgICAgICAgICAgdGhpcy50b05vZGUgPSB0b05vZGU7CisgICAgICAgICAgICAvLyB0aGlzLm1vZGVsTGlua3MgPSBtb2RlbExpbmtzOworICAgICAgICAgICAgdGhpcy5tcDJtcFZMID0gbXAybXBWTDsKKyAgICAgICAgICAgIHRoaXMucDJwVkwgPSBwMnBWTDsKKyAgICAgICAgICAgIHRoaXMubWVudVBvc2l0aW9uID0gbWVudVBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy5sZWZ0U2lkZUxpbmsgPSBuZXcgR3JhcGhMaW5rTWVudVNpZGUodGhpcy5mcm9tTm9kZS5jb21wb25lbnRJbnN0YW5jZSk7CisgICAgICAgICAgICB0aGlzLnJpZ2h0U2lkZUxpbmsgPSBuZXcgR3JhcGhMaW5rTWVudVNpZGUodGhpcy50b05vZGUuY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25UZXh0ID0gJyc7CisgICAgICAgICAgICB0aGlzLnZsVHlwZSA9IG51bGw7CisKKyAgICAgICAgICAgIHBvc3NpYmxlUmVsYXRpb25zLmZvckVhY2goKG1hdGNoOmFueSkgPT4geworCisgICAgICAgICAgICAgICAgbGV0IHJlcU9iaktleTogc3RyaW5nID0gbWF0Y2gucmVxdWlyZW1lbnQub3duZXJOYW1lICsgbWF0Y2gucmVxdWlyZW1lbnQudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgbGV0IGNhcE9iaktleTogc3RyaW5nID0gbWF0Y2guc2Vjb25kUmVxdWlyZW1lbnQgPyBtYXRjaC5zZWNvbmRSZXF1aXJlbWVudC5vd25lck5hbWUgKyBtYXRjaC5zZWNvbmRSZXF1aXJlbWVudC51bmlxdWVJZAorICAgICAgICAgICAgICAgICAgICA6IG1hdGNoLmNhcGFiaWxpdHkub3duZXJOYW1lICsgbWF0Y2guY2FwYWJpbGl0eS51bmlxdWVJZDsKKworICAgICAgICAgICAgICAgIGlmIChtYXRjaC5mcm9tTm9kZSA9PT0gdGhpcy5sZWZ0U2lkZUxpbmsuY29tcG9uZW50SW5zdGFuY2UudW5pcXVlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pbml0IHRoZSBsZWZ0IHNpZGUgcmVxdWlyZW1lbnRzIEFycmF5CisgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5sZWZ0U2lkZUxpbmsucmVxdWlyZW1lbnRzW3JlcU9iaktleV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdFNpZGVMaW5rLnJlcXVpcmVtZW50c1tyZXFPYmpLZXldID0gW107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9wdXNoIHRoZSBtYXRjaCB0byBmcm9tTm9kZSBvYmplY3QgKGZyb20gbm9kZSBpcyBhbHdheXMgdGhlIHJlcXVpcmVtZW50KQorICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnRTaWRlTGluay5yZXF1aXJlbWVudHNbcmVxT2JqS2V5XS5wdXNoKG1hdGNoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggaW5zdGFuY2VvZiAgTW9kZWxzLk1hdGNoUmVxVG9SZXEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaW5pdCB0aGUgcmlnaHQgc2lkZSByZXF1aXJlbWVudHMgQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yaWdodFNpZGVMaW5rLnJlcXVpcmVtZW50c1tjYXBPYmpLZXldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodFNpZGVMaW5rLnJlcXVpcmVtZW50c1tjYXBPYmpLZXldID0gW107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0U2lkZUxpbmsucmVxdWlyZW1lbnRzW2NhcE9iaktleV0ucHVzaChtYXRjaCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2luaXQgdGhlIHJpZ2h0IHNpZGUgY2FwYWJpbGl0aWVzIEFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmlnaHRTaWRlTGluay5jYXBhYmlsaXRpZXNbY2FwT2JqS2V5XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRTaWRlTGluay5jYXBhYmlsaXRpZXNbY2FwT2JqS2V5XSA9IFtdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGQgdG8gYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRTaWRlTGluay5jYXBhYmlsaXRpZXNbY2FwT2JqS2V5XS5wdXNoKG1hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJpZ2h0U2lkZUxpbmsucmVxdWlyZW1lbnRzW3JlcU9iaktleV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRTaWRlTGluay5yZXF1aXJlbWVudHNbcmVxT2JqS2V5XSA9IFtdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRTaWRlTGluay5yZXF1aXJlbWVudHNbcmVxT2JqS2V5XS5wdXNoKG1hdGNoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubGVmdFNpZGVMaW5rLmNhcGFiaWxpdGllc1tjYXBPYmpLZXldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnRTaWRlTGluay5jYXBhYmlsaXRpZXNbY2FwT2JqS2V5XSA9IFtdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdFNpZGVMaW5rLmNhcGFiaWxpdGllc1tjYXBPYmpLZXldLnB1c2gobWF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0KKyAgICB9CisKKworICAgIGV4cG9ydCBjbGFzcyBHcmFwaExpbmtNZW51U2lkZSB7CisgICAgICAgIHB1YmxpYyBjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZTsKKyAgICAgICAgcHVibGljIHNlbGVjdGVkTWF0Y2g6QXJyYXk8YW55PjsgICAgICAgIC8vbWF0Y2ggYXJyYXkgcmV0dXJuZWQgYnkgZnVuY3Rpb24gaW4gdXRpbHMKKyAgICAgICAgcHVibGljIHJlcXVpcmVtZW50czphbnk7ICAvL2FycmF5IG9mIG1hdGNoZXMgcmV0dXJuZWQgYnkgZnVuY3Rpb24gaW4gdXRpbHMKKyAgICAgICAgcHVibGljIGNhcGFiaWxpdGllczphbnk7ICAvL2FycmF5IG9mIG1hdGNoZXMgcmV0dXJuZWQgYnkgZnVuY3Rpb24gaW4gdXRpbHMKKworICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSkgeworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudEluc3RhbmNlOworICAgICAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB7fTsKKyAgICAgICAgICAgIHRoaXMucmVxdWlyZW1lbnRzID0ge307CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2VsZWN0TWF0Y2hBcnIobWF0Y2hBcnI6QXJyYXk8TW9kZWxzLk1hdGNoQmFzZT4pOnZvaWQgeworICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNYXRjaCA9PT0gbWF0Y2hBcnIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWF0Y2ggPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNYXRjaCA9IG1hdGNoQXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvL1RPRE8gbW92ZSB0byBtYXRjaCBvYmplY3QKKyAgICAgICAgcHVibGljIGdldFByZXZpZXdUZXh0KHNob3dSZXE6Ym9vbGVhbik6c3RyaW5nIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE1hdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICcnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgbWF0Y2g6YW55ID0gdGhpcy5zZWxlY3RlZE1hdGNoWzBdOworICAgICAgICAgICAgaWYgKHNob3dSZXEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2gucmVxdWlyZW1lbnQub3duZXJOYW1lICsgJzogJyArIG1hdGNoLnJlcXVpcmVtZW50Lm5hbWUgKworICAgICAgICAgICAgICAgICAgICAnOiBbJyArIG1hdGNoLnJlcXVpcmVtZW50Lm1pbk9jY3VycmVuY2VzICsgJywgJyArIG1hdGNoLnJlcXVpcmVtZW50Lm1heE9jY3VycmVuY2VzICsgJ10nOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5zZWNvbmRSZXF1aXJlbWVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaC5zZWNvbmRSZXF1aXJlbWVudC5vd25lck5hbWUgKyAnOiAnICsgbWF0Y2guc2Vjb25kUmVxdWlyZW1lbnQubmFtZSArCisgICAgICAgICAgICAgICAgICAgICc6IFsnICsgbWF0Y2guc2Vjb25kUmVxdWlyZW1lbnQubWluT2NjdXJyZW5jZXMgKyAnLCAnICsgbWF0Y2guc2Vjb25kUmVxdWlyZW1lbnQubWF4T2NjdXJyZW5jZXMgKyAnXSc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2guY2FwYWJpbGl0eS5vd25lck5hbWUgKyAnOiAnICsgbWF0Y2guY2FwYWJpbGl0eS5uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgJzogWycgKyBtYXRjaC5jYXBhYmlsaXR5Lm1pbk9jY3VycmVuY2VzICsgJywgJyArIG1hdGNoLmNhcGFiaWxpdHkubWF4T2NjdXJyZW5jZXMgKyAnXSc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL3JlbGF0aW9uc2hpcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2dyYXBoL3JlbGF0aW9uc2hpcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGRmYmJkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvZ3JhcGgvcmVsYXRpb25zaGlwLnRzCkBAIC0wLDAgKzEsMTA3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBSZWxhdGlvbnNoaXBNb2RlbCB7CisgICAgICAgIGZyb21Ob2RlOnN0cmluZzsKKyAgICAgICAgdG9Ob2RlOnN0cmluZzsKKyAgICAgICAgcmVsYXRpb25zaGlwczpBcnJheTxSZWxhdGlvbnNoaXA+OworCisgICAgICAgIGNvbnN0cnVjdG9yKHJlbGF0aW9uc2hpcE1vZGVsPzpSZWxhdGlvbnNoaXBNb2RlbCwgc2luZ2xlUmVsYXRpb25zaGlwPzpSZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgIGlmKHJlbGF0aW9uc2hpcE1vZGVsKXsKKyAgICAgICAgICAgICAgICB0aGlzLmZyb21Ob2RlID0gcmVsYXRpb25zaGlwTW9kZWwuZnJvbU5vZGU7CisgICAgICAgICAgICAgICAgdGhpcy50b05vZGUgPSAgcmVsYXRpb25zaGlwTW9kZWwudG9Ob2RlOworICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IFtdOworICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXBNb2RlbC5yZWxhdGlvbnNoaXBzICYmICFzaW5nbGVSZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHJlbGF0aW9uc2hpcE1vZGVsLnJlbGF0aW9uc2hpcHMsIChyZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwcy5wdXNoKG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwKHJlbGF0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH1lbHNlIGlmKHNpbmdsZVJlbGF0aW9uc2hpcCl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwcy5wdXNoKHNpbmdsZVJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHNldFJlbGF0aW9uc2hpcE1vZGVsUGFyYW1zIChmcm9tTm9kZTogc3RyaW5nLCB0b05vZGU6c3RyaW5nLCAgcmVsYXRpb25zaGlwczpBcnJheTxSZWxhdGlvbnNoaXA+KSB7CisgICAgICAgICAgICB0aGlzLmZyb21Ob2RlID0gZnJvbU5vZGU7CisgICAgICAgICAgICB0aGlzLnRvTm9kZSA9IHRvTm9kZTsKKyAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uc2hpcHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUmVsYXRpb25UeXBlIHsKKyAgICAgICAgdHlwZTpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IodHlwZT86c3RyaW5nKSB7CisgICAgICAgICAgICBpZih0eXBlKXsKKyAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFJlbGF0aW9uc2hpcCB7CisgICAgICAgIGNhcGFiaWxpdHk6c3RyaW5nOworICAgICAgICBjYXBhYmlsaXR5T3duZXJJZDpzdHJpbmc7CisgICAgICAgIGNhcGFiaWxpdHlVaWQ6c3RyaW5nOworICAgICAgICByZWxhdGlvbnNoaXA6UmVsYXRpb25UeXBlOworICAgICAgICByZXF1aXJlbWVudDpzdHJpbmc7CisgICAgICAgIHJlcXVpcmVtZW50T3duZXJJZDpzdHJpbmc7CisgICAgICAgIHJlcXVpcmVtZW50VWlkOnN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcihyZWxhdGlvbnNoaXA/Ok1vZGVscy5SZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgIGlmKHJlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2FwYWJpbGl0eSA9IHJlbGF0aW9uc2hpcC5jYXBhYmlsaXR5OworICAgICAgICAgICAgICAgIHRoaXMuY2FwYWJpbGl0eU93bmVySWQgPSByZWxhdGlvbnNoaXAuY2FwYWJpbGl0eU93bmVySWQ7CisgICAgICAgICAgICAgICAgdGhpcy5jYXBhYmlsaXR5VWlkID0gcmVsYXRpb25zaGlwLmNhcGFiaWxpdHlVaWQ7CisgICAgICAgICAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXAgPSBuZXcgUmVsYXRpb25UeXBlKHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXAudHlwZSk7CisgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlbWVudCA9IHJlbGF0aW9uc2hpcC5yZXF1aXJlbWVudDsKKyAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVtZW50T3duZXJJZCA9IHJlbGF0aW9uc2hpcC5yZXF1aXJlbWVudE93bmVySWQ7CisgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlbWVudFVpZCA9IHJlbGF0aW9uc2hpcC5yZXF1aXJlbWVudFVpZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcCA9IG5ldyBSZWxhdGlvblR5cGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy9wdWJsaWMgc2V0UmVsYXRpb25Qcm9wZXJ0aWVzID0gKGNhcGFiaWxpdHk6c3RyaW5nLCBjYXBhYmlsaXR5T3duZXJJZDpzdHJpbmcsIGNhcGFiaWxpdHlVaWQ6c3RyaW5nLCByZWxhdGlvbnNoaXA6UmVsYXRpb25UeXBlLCByZXF1aXJlbWVudDpzdHJpbmcsIHJlcXVpcmVtZW50T3duZXJJZDpzdHJpbmcsIHJlcXVpcmVtZW50VWlkOnN0cmluZyApPT57CisgICAgICAgIC8vICAgIHRoaXMuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7CisgICAgICAgIC8vICAgIHRoaXMuY2FwYWJpbGl0eU93bmVySWQgPSBjYXBhYmlsaXR5T3duZXJJZDsKKyAgICAgICAgLy8gICAgdGhpcy5jYXBhYmlsaXR5VWlkID0gY2FwYWJpbGl0eVVpZDsKKyAgICAgICAgLy8gICAgdGhpcy5yZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgIC8vICAgIHRoaXMucmVxdWlyZW1lbnQgPXJlcXVpcmVtZW50OworICAgICAgICAvLyAgICB0aGlzLnJlcXVpcmVtZW50T3duZXJJZCA9IHJlcXVpcmVtZW50T3duZXJJZDsKKyAgICAgICAgLy8gICAgdGhpcy5yZXF1aXJlbWVudFVpZCA9IHJlcXVpcmVtZW50VWlkOworICAgICAgICAvL30KKworCisgICAgICAgIHB1YmxpYyBzZXRSZWxhdGlvblByb3BlcnRpZXMgPSAoY2FwYWJpbGl0eTpNb2RlbHMuQ2FwYWJpbGl0eSwgcmVxdWlyZW1lbnQ6TW9kZWxzLlJlcXVpcmVtZW50KT0+eworICAgICAgICAgICAgdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eS5uYW1lOworICAgICAgICAgICAgdGhpcy5jYXBhYmlsaXR5T3duZXJJZCA9IGNhcGFiaWxpdHkub3duZXJJZDsKKyAgICAgICAgICAgIHRoaXMuY2FwYWJpbGl0eVVpZCA9IGNhcGFiaWxpdHkudW5pcXVlSWQ7CisgICAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcCA9IG5ldyBNb2RlbHMuUmVsYXRpb25UeXBlKGNhcGFiaWxpdHkudHlwZSk7CisgICAgICAgICAgICB0aGlzLnJlcXVpcmVtZW50ID0gcmVxdWlyZW1lbnQubmFtZTsKKyAgICAgICAgICAgIHRoaXMucmVxdWlyZW1lbnRPd25lcklkID0gcmVxdWlyZW1lbnQub3duZXJJZDsKKyAgICAgICAgICAgIHRoaXMucmVxdWlyZW1lbnRVaWQgPSByZXF1aXJlbWVudC51bmlxdWVJZDsKKyAgICAgICAgfTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2lucHV0cy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2lucHV0cy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUyNmUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvaW5wdXRzLnRzCkBAIC0wLDAgKzEsNzQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDgvMjQvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBJbnB1dE1vZGVsIHsKKworICAgICAgICAvL3NlcnZlciBkYXRhCisgICAgICAgIHVuaXF1ZUlkOnN0cmluZzsKKyAgICAgICAgbmFtZTpzdHJpbmc7CisgICAgICAgIHR5cGU6c3RyaW5nOworICAgICAgICBwYXNzd29yZDpib29sZWFuOworICAgICAgICByZXF1aXJlZDpib29sZWFuOworICAgICAgICBkZWZpbml0aW9uOmJvb2xlYW47CisgICAgICAgIHBhcmVudFVuaXF1ZUlkOnN0cmluZzsKKyAgICAgICAgZGVzY3JpcHRpb246c3RyaW5nOworICAgICAgICBjb21wb25lbnRJbnN0YW5jZU5hbWU6c3RyaW5nOworICAgICAgICBjb21wb25lbnRJbnN0YW5jZUlkOnN0cmluZzsKKworICAgICAgICAvL2Nvc3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIGlzTmV3OiBib29sZWFuOworICAgICAgICBwcm9wZXJ0aWVzOkFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPjsKKyAgICAgICAgaW5wdXRzOkFycmF5PE1vZGVscy5JbnB1dE1vZGVsPjsKKyAgICAgICAgaXNBbHJlYWR5U2VsZWN0ZWQ6IGJvb2xlYW47CisgICAgICAgIGZpbHRlclRlcm06IHN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcihpbnB1dDpJbnB1dE1vZGVsKSB7CisgICAgICAgICAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZUlkID0gaW5wdXQudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gaW5wdXQubmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBpbnB1dC50eXBlOworICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBpbnB1dC5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gaW5wdXQucGFzc3dvcmQ7CisgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlZCA9IGlucHV0LnJlcXVpcmVkOworICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGlucHV0LmRlZmluaXRpb247CisgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRVbmlxdWVJZCA9IGlucHV0LnBhcmVudFVuaXF1ZUlkOworICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBpbnB1dC5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlTmFtZSA9IGlucHV0LmNvbXBvbmVudEluc3RhbmNlTmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlSWQgPSBpbnB1dC5jb21wb25lbnRJbnN0YW5jZUlkOworICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSA9IHRoaXMubmFtZSArICcgJyArIHRoaXMuZGVzY3JpcHRpb24gKyAnICcgKyB0aGlzLnR5cGUgKyAnICcgKyB0aGlzLmNvbXBvbmVudEluc3RhbmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB0b0pTT04gPSAoKTphbnkgPT4geworICAgICAgICAgICAgdGhpcy5pc05ldyA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRzID0gdW5kZWZpbmVkOworICAgICAgICAgICAgdGhpcy5pc0FscmVhZHlTZWxlY3RlZCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2luc3RhbmNlLWlucHV0cy1wcm9wZXJ0aWVzLW1hcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2luc3RhbmNlLWlucHV0cy1wcm9wZXJ0aWVzLW1hcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY3ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvaW5zdGFuY2UtaW5wdXRzLXByb3BlcnRpZXMtbWFwLnRzCkBAIC0wLDAgKzEsMzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDkvMTIvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBJbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBEYXRhIHsKKyAgICAgICAgW2luc3RhbmNlSWQ6c3RyaW5nXTogQXJyYXk8UHJvcGVydHlNb2RlbD47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcCB7CisgICAgICAgIGNvbXBvbmVudEluc3RhbmNlSW5wdXRzUHJvcGVydGllczpJbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBEYXRhOworCisgICAgICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudEluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcERhdGE6SW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzTWFwRGF0YSkgeworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZUlucHV0c1Byb3BlcnRpZXMgPSBjb21wb25lbnRJbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBEYXRhOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9pbnN0YW5jZXMtaW5wdXRzLW1hcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL2luc3RhbmNlcy1pbnB1dHMtbWFwLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDNhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9pbnN0YW5jZXMtaW5wdXRzLW1hcC50cwpAQCAtMCwwICsxLDM5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA5LzEyLzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgSW5zdGFuY2VzSW5wdXRzTWFwRGF0YSB7CisgICAgICAgIFtpbnN0YW5jZUlkOnN0cmluZ106IEFycmF5PElucHV0TW9kZWw+OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBJbnN0YW5jZXNJbnB1dHNNYXAgeworICAgICAgICBjb21wb25lbnRJbnN0YW5jZUlucHV0c01hcDpJbnN0YW5jZXNJbnB1dHNNYXBEYXRhOworCisgICAgICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudEluc3RhbmNlSW5wdXRzTWFwRGF0YTpJbnN0YW5jZXNJbnB1dHNNYXBEYXRhKSB7CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlSW5wdXRzTWFwID0gY29tcG9uZW50SW5zdGFuY2VJbnB1dHNNYXBEYXRhOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9sZWZ0LXBhbmVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvbGVmdC1wYW5lbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDcxNzBjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvbGVmdC1wYW5lbC50cwpAQCAtMCwwICsxLDMzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgZXhwb3J0ICBjbGFzcyBMZWZ0UGFuZWxNb2RlbCB7CisgICAgICAgIG51bWJlck9mRWxlbWVudHM6bnVtYmVyOworICAgICAgICBzb3J0ZWRDYXRlZ29yaWVzOmFueTsKKworICAgICAgICBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZFbGVtZW50cyA9IDA7CisgICAgICAgICAgICB0aGlzLnNvcnRlZENhdGVnb3JpZXMgPSB7fTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL21lbWJlci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL21lbWJlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRjOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvbWVtYmVyLnRzCkBAIC0wLDAgKzEsMzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDgvMi8yMDE2LgorICovCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgTWVtYmVycyB7CisKKyAgICAgICAgW2luZGV4OiBzdHJpbmddOiBzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IobWVtYmVycz86TWVtYmVycykgeworICAgICAgICAgICAgXy5mb3JFYWNoKG1lbWJlcnMsIChtZW1iZXJJZDpzdHJpbmcsIGluZGV4KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpc1tpbmRleF0gPSBtZW1iZXJJZDsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy9tb2R1bGVzL2Jhc2UtbW9kdWxlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvbW9kdWxlcy9iYXNlLW1vZHVsZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGY1MmNjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvbW9kdWxlcy9iYXNlLW1vZHVsZS50cwpAQCAtMCwwICsxLDEwOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiAyLzQvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBNb2R1bGUgeworCisgICAgICAgIHB1YmxpYyBuYW1lOnN0cmluZzsKKyAgICAgICAgcHVibGljIGdyb3VwVVVJRDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyBpbnZhcmlhbnRVVUlEOnN0cmluZzsKKyAgICAgICAgcHVibGljIHByb3BlcnR5VmFsdWVDb3VudGVyOm51bWJlcjsKKyAgICAgICAgcHVibGljIHR5cGU6c3RyaW5nOworICAgICAgICBwdWJsaWMgdHlwZVVpZDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyB1bmlxdWVJZDpzdHJpbmc7CisgICAgICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBhcnRpZmFjdHM6IEFycmF5PHN0cmluZz4gfCBBcnJheTxNb2RlbHMuQXJ0aWZhY3RNb2RlbD47CisgICAgICAgIHB1YmxpYyBhcnRpZmFjdHNVdWlkOiBBcnJheTxzdHJpbmc+OworICAgICAgICBwdWJsaWMgcHJvcGVydGllczogQXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+OworICAgICAgICBwdWJsaWMgbWVtYmVyczogQXJyYXk8c3RyaW5nPjsKKworCisgICAgICAgIGNvbnN0cnVjdG9yKG1vZHVsZT86IE1vZHVsZSkgeworICAgICAgICAgICAgaWYobW9kdWxlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbW9kdWxlLm5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy5ncm91cFVVSUQgPSBtb2R1bGUuZ3JvdXBVVUlEOworICAgICAgICAgICAgICAgIHRoaXMuaW52YXJpYW50VVVJRCA9IG1vZHVsZS5pbnZhcmlhbnRVVUlEOworICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZUNvdW50ZXIgPSBtb2R1bGUucHJvcGVydHlWYWx1ZUNvdW50ZXI7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gbW9kdWxlLnR5cGU7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlVWlkID0gbW9kdWxlLnR5cGVVaWQ7CisgICAgICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IG1vZHVsZS51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBtb2R1bGUudmVyc2lvbjsKKyAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0cyA9IG1vZHVsZS5hcnRpZmFjdHM7CisgICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdHNVdWlkID0gbW9kdWxlLmFydGlmYWN0c1V1aWQ7CisgICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gVXRpbHMuQ29tbW9uVXRpbHMuaW5pdFByb3BlcnRpZXMobW9kdWxlLnByb3BlcnRpZXMpOworICAgICAgICAgICAgICAgIHRoaXMubWVtYmVycyA9IG1vZHVsZS5tZW1iZXJzOworCisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lLnJlcGxhY2UoLzovZywgJy4uJyk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBEaXNwbGF5TW9kdWxlIGV4dGVuZHMgTW9kdWxlIHsKKworICAgICAgICBpc0Jhc2U6IHN0cmluZzsKKyAgICAgICAgYXJ0aWZhY3RzOkFycmF5PE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKworICAgICAgICAvL2N1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIHB1YmxpYyB2Zkluc3RhbmNlTmFtZTogc3RyaW5nOworICAgICAgICBwdWJsaWMgaGVhdE5hbWU6IHN0cmluZzsKKyAgICAgICAgcHVibGljIG1vZHVsZU5hbWU6IHN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcihkaXNwbGF5TW9kdWxlPzpNb2RlbHMuRGlzcGxheU1vZHVsZSkgeworICAgICAgICAgICAgc3VwZXIoZGlzcGxheU1vZHVsZSk7CisKKyAgICAgICAgICAgIHRoaXMuaXNCYXNlID0gZGlzcGxheU1vZHVsZS5pc0Jhc2U7CisgICAgICAgICAgICB0aGlzLmluaXRBcnRpZmFjdHNGb3JEaXNwbGF5KGRpc3BsYXlNb2R1bGUuYXJ0aWZhY3RzKTsKKworICAgICAgICAgICAgLy9zcGxpdHRpbmcgbW9kdWxlIG5hbWUgZm9yIGRpc3BsYXkgYW5kIGVkaXQKKyAgICAgICAgICAgIGxldCBzcGxpdE5hbWU6QXJyYXk8c3RyaW5nPiA9IHRoaXMubmFtZS5zcGxpdCgnLi4nKTsKKyAgICAgICAgICAgIHRoaXMudmZJbnN0YW5jZU5hbWUgPSBzcGxpdE5hbWVbMF07CisgICAgICAgICAgICB0aGlzLmhlYXROYW1lID0gc3BsaXROYW1lWzFdOworICAgICAgICAgICAgdGhpcy5tb2R1bGVOYW1lID0gc3BsaXROYW1lWzJdOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0QXJ0aWZhY3RzRm9yRGlzcGxheSA9IChhcnRpZmFjdHM6QXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+KTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzID0gbmV3IEFycmF5PE1vZGVscy5BcnRpZmFjdE1vZGVsPigpOworICAgICAgICAgICAgXy5mb3JFYWNoKGFydGlmYWN0cywgKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdHMucHVzaChuZXcgTW9kZWxzLkFydGlmYWN0TW9kZWwoYXJ0aWZhY3QpKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVOYW1lID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnZmSW5zdGFuY2VOYW1lICsgJy4uJyArIHRoaXMuaGVhdE5hbWUgKyAnLi4nICsgdGhpcy5tb2R1bGVOYW1lOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB0b0pTT04gPSAoKTphbnkgPT4geworICAgICAgICAgICAgdGhpcy52Zkluc3RhbmNlTmFtZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuaGVhdE5hbWUgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLm1vZHVsZU5hbWUgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLmlzQmFzZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzID0gdW5kZWZpbmVkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvcHJvcGVydGllcy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3Byb3BlcnRpZXMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5Y2EwMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3Byb3BlcnRpZXMudHMKQEAgLTAsMCArMSwxNzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIFByb3BlcnRpZXNHcm91cCB7CisgICAgICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXNPYmo/Ok1vZGVscy5Qcm9wZXJ0aWVzR3JvdXApeworICAgICAgICAgICAgXy5mb3JFYWNoKHByb3BlcnRpZXNPYmosIChwcm9wZXJ0aWVzOkFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPiwgaW5zdGFuY2UpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzW2luc3RhbmNlXSA9IFtdOworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChwcm9wZXJ0aWVzLCAocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5yZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQgPSBpbnN0YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucmVhZG9ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzW2luc3RhbmNlXS5wdXNoKG5ldyBNb2RlbHMuUHJvcGVydHlNb2RlbChwcm9wZXJ0eSkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElQcm9wZXJ0eU1vZGVsIHsKKworICAgICAgICAvL3NlcnZlciBkYXRhCisgICAgICAgIHVuaXF1ZUlkOiBzdHJpbmc7CisgICAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgICAgY29uc3RyYWludHM6IEFycmF5PE9iamVjdD47CisgICAgICAgIGRlZmF1bHRWYWx1ZTogc3RyaW5nOworICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nOworICAgICAgICBwYXNzd29yZDogYm9vbGVhbjsKKyAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW47CisgICAgICAgIHR5cGU6IHN0cmluZzsKKyAgICAgICAgc291cmNlOiBzdHJpbmc7CisgICAgICAgIHBhcmVudFVuaXF1ZUlkOiBzdHJpbmc7CisgICAgICAgIHNjaGVtYTogTW9kZWxzLlNjaGVtYVByb3BlcnR5R3JvdXBNb2RlbDsKKworICAgICAgICAvL2luc3RhbmNlIHByb3BlcnRpZXMKKyAgICAgICAgdmFsdWU6c3RyaW5nOworICAgICAgICB2YWx1ZVVuaXF1ZVVpZDpzdHJpbmc7CisgICAgICAgIHBhdGg6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgcnVsZXM6QXJyYXk8T2JqZWN0PjsKKworICAgICAgICAvL2N1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIHJlc291cmNlSW5zdGFuY2VVbmlxdWVJZDogc3RyaW5nOworICAgICAgICByZWFkb25seTogYm9vbGVhbjsKKyAgICAgICAgc2ltcGxlVHlwZTogc3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBQcm9wZXJ0eU1vZGVsIGltcGxlbWVudHMgSVByb3BlcnR5TW9kZWx7CisKKyAgICAgICAgLy9zZXJ2ZXIgZGF0YQorICAgICAgICB1bmlxdWVJZDpzdHJpbmc7CisgICAgICAgIG5hbWU6c3RyaW5nOworICAgICAgICBjb25zdHJhaW50czpBcnJheTxPYmplY3Q+OworICAgICAgICBkZWZhdWx0VmFsdWU6c3RyaW5nOworICAgICAgICBkZXNjcmlwdGlvbjpzdHJpbmc7CisgICAgICAgIHBhc3N3b3JkOmJvb2xlYW47CisgICAgICAgIHJlcXVpcmVkOmJvb2xlYW47CisgICAgICAgIHR5cGU6c3RyaW5nOworICAgICAgICBzb3VyY2U6c3RyaW5nOworICAgICAgICBwYXJlbnRVbmlxdWVJZDpzdHJpbmc7CisgICAgICAgIHNjaGVtYTogTW9kZWxzLlNjaGVtYVByb3BlcnR5R3JvdXBNb2RlbDsKKworICAgICAgICAvL2luc3RhbmNlIHByb3BlcnRpZXMKKyAgICAgICAgdmFsdWU6c3RyaW5nOworICAgICAgICB2YWx1ZVVuaXF1ZVVpZDpzdHJpbmc7CisgICAgICAgIHBhdGg6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgcnVsZXM6QXJyYXk8T2JqZWN0PjsKKworICAgICAgICAvL2N1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIHJlc291cmNlSW5zdGFuY2VVbmlxdWVJZDpzdHJpbmc7CisgICAgICAgIHJlYWRvbmx5OmJvb2xlYW47CisgICAgICAgIHNpbXBsZVR5cGU6IHN0cmluZzsKKyAgICAgICAgZmlsdGVyVGVybTogc3RyaW5nOworICAgICAgICBpc0FscmVhZHlTZWxlY3RlZDogYm9vbGVhbjsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eT86TW9kZWxzLlByb3BlcnR5TW9kZWwpIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgIHRoaXMudW5pcXVlSWQgPSBwcm9wZXJ0eS51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBwcm9wZXJ0eS5uYW1lOworICAgICAgICAgICAgICAgIHRoaXMuY29uc3RyYWludHMgPSBwcm9wZXJ0eS5jb25zdHJhaW50czsKKyAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5LmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcGVydHkuZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHByb3BlcnR5LnBhc3N3b3JkOworICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZWQgPSBwcm9wZXJ0eS5yZXF1aXJlZDsKKyAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBwcm9wZXJ0eS50eXBlOworICAgICAgICAgICAgICAgIHRoaXMuc291cmNlID0gcHJvcGVydHkuc291cmNlOworICAgICAgICAgICAgICAgIHRoaXMucGFyZW50VW5pcXVlSWQgPSBwcm9wZXJ0eS5wYXJlbnRVbmlxdWVJZDsKKyAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYSA9IHByb3BlcnR5LnNjaGVtYTsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcHJvcGVydHkudmFsdWU/cHJvcGVydHkudmFsdWU6cHJvcGVydHkuZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIHRoaXMudmFsdWVVbmlxdWVVaWQgPSBwcm9wZXJ0eS52YWx1ZVVuaXF1ZVVpZDsKKyAgICAgICAgICAgICAgICB0aGlzLnBhdGggPSBwcm9wZXJ0eS5wYXRoOworICAgICAgICAgICAgICAgIHRoaXMucnVsZXMgPSBwcm9wZXJ0eS5ydWxlczsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCA9IHByb3BlcnR5LnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZDsKKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRvbmx5ID0gcHJvcGVydHkucmVhZG9ubHk7CisgICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVUeXBlID0gcHJvcGVydHkuc2ltcGxlVHlwZTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCF0aGlzLnNjaGVtYSB8fCAhdGhpcy5zY2hlbWEucHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYSA9IG5ldyBNb2RlbHMuU2NoZW1hUHJvcGVydHlHcm91cE1vZGVsKG5ldyBNb2RlbHMuU2NoZW1hUHJvcGVydHkoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vZm9yY2luZyBjcmVhdGluZyBuZXcgb2JqZWN0LCBzbyBlZGl0aW5nIGRpZmZlcmVudCBvbmUgdGhhbiB0aGUgb2JqZWN0IGluIHRoZSB0YWJsZQorICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gbmV3IE1vZGVscy5TY2hlbWFQcm9wZXJ0eUdyb3VwTW9kZWwobmV3IE1vZGVscy5TY2hlbWFQcm9wZXJ0eSh0aGlzLnNjaGVtYS5wcm9wZXJ0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclRlcm0gPSB0aGlzLm5hbWUgKyAiICIgKyAodGhpcy5kZXNjcmlwdGlvbnx8IiIpICsiICIgKyB0aGlzLnR5cGU7CisgICAgICAgICAgICAgICAgaWYodGhpcy5zY2hlbWEucHJvcGVydHkgJiYgdGhpcy5zY2hlbWEucHJvcGVydHkudHlwZSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclRlcm0gKz0gIiAiICt0aGlzLnNjaGVtYS5wcm9wZXJ0eS50eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjb252ZXJ0VG9TZXJ2ZXJPYmplY3Q6RnVuY3Rpb24gPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgbGV0IHNlcnZlck9iamVjdCA9IHt9OworICAgICAgICAgICAgbGV0IG1hcERhdGEgPSB7CisgICAgICAgICAgICAgICAgInR5cGUiOiB0aGlzLnR5cGUsCisgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogdGhpcy5yZXF1aXJlZCB8fCBmYWxzZSwKKyAgICAgICAgICAgICAgICAiZGVmYXVsdFZhbHVlIjogdGhpcy5kZWZhdWx0VmFsdWUgIT0gIiIgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT0gIltdIiAmJiB0aGlzLmRlZmF1bHRWYWx1ZSAhPSAie30iID8gdGhpcy5kZWZhdWx0VmFsdWUgOm51bGwsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogdGhpcy5kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAiY29uc3RyYWludHMiOiB0aGlzLmNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICJpc1Bhc3N3b3JkIjogdGhpcy5wYXNzd29yZCB8fCBmYWxzZSwKKyAgICAgICAgICAgICAgICAic2NoZW1hIjogdGhpcy5zY2hlbWEsCisgICAgICAgICAgICAgICAgIm5hbWUiOiB0aGlzLm5hbWUKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzZXJ2ZXJPYmplY3RbdGhpcy5uYW1lXSA9IG1hcERhdGE7CisKKyAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzZXJ2ZXJPYmplY3QpOworICAgICAgICB9OworCisKKyAgICAgICAgLy8gcHVibGljIGNvbnZlcnRWYWx1ZVRvVmlldyAoKSB7CisgICAgICAgIC8vICAgICAvL3Vud3JhcHBpbmcgdmFsdWUge30gb3IgW10gaWYgdHlwZSBpcyBjb21wbGV4CisgICAgICAgIC8vICAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgJiYgKHRoaXMudHlwZSA9PT0gJ21hcCcgfHwgdGhpcy50eXBlID09PSAnbGlzdCcpICYmCisgICAgICAgIC8vICAgICAgICAgWydbJywneyddLmluZGV4T2YodGhpcy5kZWZhdWx0VmFsdWUuY2hhckF0KDApKSA+IC0xICYmCisgICAgICAgIC8vICAgICAgICAgWyddJywnfSddLmluZGV4T2YodGhpcy5kZWZhdWx0VmFsdWUuc2xpY2UoLTEpKSA+IC0xKSB7CisgICAgICAgIC8vICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZS5zbGljZSgxLCAtMSk7CisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAvL2Fsc28gZm9yIHZhbHVlIC0gZm9yIHRoZSBtb2RhbCBpbiBjYW52YXMKKyAgICAgICAgLy8gICAgIGlmICh0aGlzLnZhbHVlICYmICh0aGlzLnR5cGUgPT09ICdtYXAnIHx8IHRoaXMudHlwZSA9PT0gJ2xpc3QnKSAmJgorICAgICAgICAvLyAgICAgICAgIFsnWycsJ3snXS5pbmRleE9mKHRoaXMudmFsdWUuY2hhckF0KDApKSA+IC0xICYmCisgICAgICAgIC8vICAgICAgICAgWyddJywnfSddLmluZGV4T2YodGhpcy52YWx1ZS5zbGljZSgtMSkpID4gLTEpIHsKKyAgICAgICAgLy8gICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5zbGljZSgxLCAtMSk7CisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vIH0KKworICAgICAgICBwdWJsaWMgdG9KU09OID0gKCk6YW55ID0+IHsKKyAgICAgICAgICAgIGlmKCF0aGlzLnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCl7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucmVhZG9ubHkgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMuc2ltcGxlVHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlID09PSAie30iIHx8IHRoaXMudmFsdWUgPT09ICJbXSIgPyB1bmRlZmluZWQ6IHRoaXMudmFsdWU7CisgICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID09PSAie30iIHx8IHRoaXMuZGVmYXVsdFZhbHVlID09PSAiW10iID8gdW5kZWZpbmVkOiB0aGlzLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3JlcXVpcmVtZW50LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvcmVxdWlyZW1lbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxYmZjMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3JlcXVpcmVtZW50LnRzCkBAIC0wLDAgKzEsOTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisgLyoKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDQvMjAvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5Nb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICAvL3RoaXMgaXMgYW4gb2JqZWN0IGNvbnRhaW5zIGtleXMsIHdoZW4gZWFjaCBrZXkgaGFzIG1hdGNoaW5nIGFycmF5LgorICAgIC8vIGZvciBleGFtcGxlOiBrZXkgPSB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay4gYW5kIHRoZSBtYXRjaCBhcnJheSBpcyBhcnJheSBvZiByZXF1aXJlbWVudHMgb2JqZWN0cworICAgIGV4cG9ydCBjbGFzcyBSZXF1aXJlbWVudHNHcm91cHsKKyAgICAgICAgY29uc3RydWN0b3IocmVxdWlyZW1lbnRHcm91cE9iaj86TW9kZWxzLlJlcXVpcmVtZW50c0dyb3VwKXsKKyAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudEdyb3VwT2JqLCAocmVxdWlyZW1lbnRzQXJyYXlPYmo6QXJyYXk8TW9kZWxzLlJlcXVpcmVtZW50PiwgaW5zdGFuY2UpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzW2luc3RhbmNlXSA9IFtdOworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXF1aXJlbWVudHNBcnJheU9iaiwgKHJlcXVpcmVtZW50Ok1vZGVscy5SZXF1aXJlbWVudCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXNbaW5zdGFuY2VdLnB1c2gobmV3IE1vZGVscy5SZXF1aXJlbWVudChyZXF1aXJlbWVudCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUmVxdWlyZW1lbnQgeworCisgICAgICAgIC8vc2VydmVyIGRhdGEKKyAgICAgICAgY2FwYWJpbGl0eTpzdHJpbmc7CisgICAgICAgIG5hbWU6IHN0cmluZzsKKyAgICAgICAgb3duZXJJZDogc3RyaW5nOworICAgICAgICBvd25lck5hbWU6c3RyaW5nOworICAgICAgICBub2RlOnN0cmluZzsKKyAgICAgICAgdW5pcXVlSWQ6c3RyaW5nOworICAgICAgICByZWxhdGlvbnNoaXA6IHN0cmluZzsKKyAgICAgICAgbWluT2NjdXJyZW5jZXM6IHN0cmluZzsKKyAgICAgICAgbWF4T2NjdXJyZW5jZXM6IHN0cmluZzsKKyAgICAgICAgLy9jdXN0b20KKyAgICAgICAgZmlsdGVyVGVybTpzdHJpbmc7CisgICAgICAgIGNvbnN0cnVjdG9yKHJlcXVpcmVtZW50PzpSZXF1aXJlbWVudCkgeworCisgICAgICAgICAgICBpZihyZXF1aXJlbWVudCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2FwYWJpbGl0eSA9IHJlcXVpcmVtZW50LmNhcGFiaWxpdHk7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gcmVxdWlyZW1lbnQubmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLm93bmVySWQgPSByZXF1aXJlbWVudC5vd25lcklkOworICAgICAgICAgICAgICAgIHRoaXMub3duZXJOYW1lID0gcmVxdWlyZW1lbnQub3duZXJOYW1lOworICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHJlcXVpcmVtZW50Lm5vZGU7CisgICAgICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IHJlcXVpcmVtZW50LnVuaXF1ZUlkOworICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwID0gcmVxdWlyZW1lbnQucmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgIHRoaXMubWluT2NjdXJyZW5jZXMgPSByZXF1aXJlbWVudC5taW5PY2N1cnJlbmNlczsKKyAgICAgICAgICAgICAgICB0aGlzLm1heE9jY3VycmVuY2VzID0gcmVxdWlyZW1lbnQubWF4T2NjdXJyZW5jZXM7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0RmlsdGVyVGVybSgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0RnVsbFRpdGxlKCk6c3RyaW5nIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm93bmVyTmFtZSArICc6ICcgKyB0aGlzLm5hbWUgKworICAgICAgICAgICAgICAgICc6IFsnICsgdGhpcy5taW5PY2N1cnJlbmNlcyArICcsICcgKyB0aGlzLm1heE9jY3VycmVuY2VzICsgJ10nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHRvSlNPTiA9ICgpOmFueSA9PiB7CisgICAgICAgICAgICB0aGlzLmZpbHRlclRlcm0gPSB1bmRlZmluZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRGaWx0ZXJUZXJtID0gKCk6dm9pZCA9PnsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyVGVybSA9ICh0aGlzLm5hbWUgKyAiICIpICsKKyAgICAgICAgICAgICAgICAodGhpcy5vd25lck5hbWUgKyAiICIgKSArCisgICAgICAgICAgICAgICAgKHRoaXMuY2FwYWJpbGl0eSA/ICh0aGlzLmNhcGFiaWxpdHkuc3Vic3RyaW5nKCJ0b3NjYS5jYXBhYmlsaXRpZXMuIi5sZW5ndGgpICsgIiAiICkgOiAiIikgKworICAgICAgICAgICAgICAgICh0aGlzLm5vZGU/ICh0aGlzLm5vZGUuc3Vic3RyaW5nKCJ0b3NjYS5ub2Rlcy4iLmxlbmd0aCkgKyIgIikgOiAiIikgKworICAgICAgICAgICAgICAgICh0aGlzLnJlbGF0aW9uc2hpcD8gKHRoaXMucmVsYXRpb25zaGlwLnN1YnN0cmluZygidG9zY2EucmVsYXRpb25zaGlwcy4iLmxlbmd0aCkgKyIgIikgOiAiIikgKworICAgICAgICAgICAgICAgIHRoaXMubWluT2NjdXJyZW5jZXMrIiwiK3RoaXMubWF4T2NjdXJyZW5jZXM7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvc2NoZW1hLWF0dHJpYnV0ZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3NjaGVtYS1hdHRyaWJ1dGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1YTc1OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3NjaGVtYS1hdHRyaWJ1dGUudHMKQEAgLTAsMCArMSwzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgU2NoZW1hQXR0cmlidXRlR3JvdXBNb2RlbHsKKyAgICAgICAgcHJvcGVydHk6IFNjaGVtYUF0dHJpYnV0ZTsKKworICAgICAgICBjb25zdHJ1Y3RvcihzY2hlbWFBdHRyaWJ1dGU/Ok1vZGVscy5TY2hlbWFBdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHkgPSBzY2hlbWFBdHRyaWJ1dGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU2NoZW1hQXR0cmlidXRlIGV4dGVuZHMgU2NoZW1hUHJvcGVydHl7CisKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvdGFiLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvdGFiLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDJkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy90YWIudHMKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNy8zMS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIFRhYiB7CisKKyAgICAgICAgcHVibGljIHRlbXBsYXRlVXJsOnN0cmluZzsKKyAgICAgICAgcHVibGljIGNvbnRyb2xsZXI6c3RyaW5nOworICAgICAgICBwdWJsaWMgZGF0YTphbnk7CisgICAgICAgIHB1YmxpYyBpY29uOnN0cmluZzsKKyAgICAgICAgcHVibGljIG5hbWU6c3RyaW5nOworCisgICAgICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlVXJsOnN0cmluZywgY29udHJvbGxlcjpzdHJpbmcsIG5hbWU6c3RyaW5nLCAgZGF0YT86YW55LCBpY29uPzpzdHJpbmcpIHsKKworICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsOworICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgICAgICAgICAgIHRoaXMuaWNvbiA9IGljb247CisgICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3Rvb2x0aXAtZGF0YS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kZWxzL3Rvb2x0aXAtZGF0YS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc5MDRiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvdG9vbHRpcC1kYXRhLnRzCkBAIC0wLDAgKzEsMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLk1vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIFRvb2x0aXBEYXRheworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy91c2VyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvdXNlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzYwNjZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvdXNlci50cwpAQCAtMCwwICsxLDExNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgZW51bSBVc2VyUm9sZSB7CisgICAgICAgIEFETUlOLAorICAgICAgICBERVNJR05FUiwKKyAgICAgICAgVEVTVEVSLAorICAgICAgICBHT1ZFUk5PUiwKKyAgICAgICAgT1BTLAorICAgICAgICBQUk9EVUNUX01BTkFHRVIsCisgICAgICAgIFBST0RVQ1RfU1RSQVRFR0lTVAorICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVVzZXJNYW5hZ2VyIHsKKyAgICAgICAgaXNJbkVkaXRNb2RlOiBib29sZWFuOworICAgICAgICBmaWx0ZXJUZXJtOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJVXNlclByb3BlcnRpZXMgZXh0ZW5kcyBJVXNlck1hbmFnZXJ7CisgICAgICAgIGZpcnN0TmFtZTogc3RyaW5nOworICAgICAgICBsYXN0TmFtZTogc3RyaW5nOworICAgICAgICB1c2VySWQ6IHN0cmluZzsKKyAgICAgICAgZW1haWw6IHN0cmluZzsKKyAgICAgICAgcm9sZTogc3RyaW5nOworICAgICAgICB0ZW1wUm9sZTpzdHJpbmc7CisgICAgICAgIGxhc3RMb2dpblRpbWU6IHN0cmluZzsKKyAgICAgICAgc3RhdHVzOnN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElVc2VyIHsKKyAgICAgICAgcmVzb3VyY2U6IFNlcnZpY2VzLklVc2VyUmVzb3VyY2U7CisgICAgICAgIGdldFJvbGUoKTogVXNlclJvbGU7CisgICAgICAgIGdldFJvbGVUb1ZpZXcoKTogc3RyaW5nOworICAgICAgICBnZXROYW1lKCk6IHN0cmluZzsKKyAgICAgICAgZ2V0Rmlyc3ROYW1lKCk6IHN0cmluZzsKKyAgICAgICAgZ2V0TGFzdE5hbWUoKTogc3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBVc2VyIGltcGxlbWVudHMgSVVzZXIgeworCisgICAgICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXNvdXJjZTpTZXJ2aWNlcy5JVXNlclJlc291cmNlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0TGFzdE5hbWUgPSAoKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5sYXN0TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBnZXRGaXJzdE5hbWUgPSAoKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5maXJzdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0TmFtZSA9ICgpID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlLmZpcnN0TmFtZSArICcgJyArIHRoaXMucmVzb3VyY2UubGFzdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0TGFzdExvZ2luID0gKCkgPT4geworICAgICAgICAgICAgaWYgKCF0aGlzLnJlc291cmNlLmxhc3RMb2dpblRpbWUgfHwgdGhpcy5yZXNvdXJjZS5sYXN0TG9naW5UaW1lID09PSAiMCIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlLmxhc3RMb2dpblRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0Um9sZSA9ICgpOlVzZXJSb2xlID0+IHsKKyAgICAgICAgICAgIGxldCByb2xlOlVzZXJSb2xlOworICAgICAgICAgICAgc3dpdGNoIChVc2VyUm9sZVt0aGlzLnJlc291cmNlLnJvbGUudG9VcHBlckNhc2UoKV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVzZXJSb2xlLkFETUlOOgorICAgICAgICAgICAgICAgICAgICByb2xlID0gVXNlclJvbGUuQURNSU47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVXNlclJvbGUuREVTSUdORVI6CisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBVc2VyUm9sZS5ERVNJR05FUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVc2VyUm9sZS5URVNURVI6CisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBVc2VyUm9sZS5URVNURVI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVXNlclJvbGUuR09WRVJOT1I6CisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBVc2VyUm9sZS5HT1ZFUk5PUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVc2VyUm9sZS5PUFM6CisgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBVc2VyUm9sZS5PUFM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVXNlclJvbGUuUFJPRFVDVF9NQU5BR0VSOgorICAgICAgICAgICAgICAgICAgICByb2xlID0gVXNlclJvbGUuUFJPRFVDVF9NQU5BR0VSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVzZXJSb2xlLlBST0RVQ1RfU1RSQVRFR0lTVDoKKyAgICAgICAgICAgICAgICAgICAgcm9sZSA9IFVzZXJSb2xlLlBST0RVQ1RfU1RSQVRFR0lTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcm9sZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBnZXRSb2xlVG9WaWV3ID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIGxldCByb2xlOnN0cmluZyA9IHRoaXMucmVzb3VyY2Uucm9sZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ2dvdmVybm9yJywnZ292ZXJuYW5jZV9SZXAnKTsKKyAgICAgICAgICAgIHJldHVybiByb2xlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcm9sZS5zbGljZSgxKS5yZXBsYWNlKCdfJywnICcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvdmFsaWRhdGUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZGVscy92YWxpZGF0ZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTU0MGQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2RlbHMvdmFsaWRhdGUudHMKQEAgLTAsMCArMSwyOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuTW9kZWxzIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRleworICAgIGlzVmFsaWQgOiBib29sZWFuOworICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2R1bGVzL2RpcmVjdGl2ZS1tb2R1bGUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZHVsZXMvZGlyZWN0aXZlLW1vZHVsZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGExNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2R1bGVzL2RpcmVjdGl2ZS1tb2R1bGUudHMKQEAgLTAsMCArMSwxMDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjIHsKKyAgICBsZXQgbW9kdWxlTmFtZTpzdHJpbmcgPSAnU2RjLkRpcmVjdGl2ZXMnOworICAgIGxldCBkaXJlY3RpdmVNb2R1bGU6bmcuSU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKG1vZHVsZU5hbWUsIFtdKTsKKworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2NsaWNrZWRPdXRzaWRlJywgRGlyZWN0aXZlcy5DbGlja2VkT3V0c2lkZURpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdsb2FkZXInLCBEaXJlY3RpdmVzLkxvYWRlckRpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCd1c2VySGVhZGVyRGV0YWlscycsIERpcmVjdGl2ZXMuVXNlckhlYWRlckRldGFpbHNEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnZWxsaXBzaXMnLCBEaXJlY3RpdmVzLkVsbGlwc2lzRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2Rvd25sb2FkQXJ0aWZhY3QnLCBEaXJlY3RpdmVzLkRvd25sb2FkQXJ0aWZhY3REaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnZmlsZVR5cGUnLCBEaXJlY3RpdmVzLkZpbGVUeXBlRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2ludmFsaWRDaGFyYWN0ZXJzJywgRGlyZWN0aXZlcy5JbnZhbGlkQ2hhcmFjdGVyc0RpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCd0dXRvcmlhbCcsIERpcmVjdGl2ZXMuVHV0b3JpYWxEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgncGVyZmVjdFNjcm9sbGJhcicsIERpcmVjdGl2ZXMuUGVyZmVjdFNjcm9sbGVyRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2V4cGFuZENvbGxhcHNlJywgRGlyZWN0aXZlcy5FeHBhbmRDb2xsYXBzZURpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdzZGNNb2RhbCcsIERpcmVjdGl2ZXMuU2RjTW9kYWxEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnc2RjTWVzc2FnZXMnLCBEaXJlY3RpdmVzLlNkY01lc3NhZ2VzRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ3NkY01lc3NhZ2UnLCBEaXJlY3RpdmVzLlNkY01lc3NhZ2VEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnc2RjRXJyb3JUb29sdGlwJywgRGlyZWN0aXZlcy5TZGNFcnJvclRvb2x0aXBEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnZmlsZU9wZW5lcicsIERpcmVjdGl2ZXMuRmlsZU9wZW5lckRpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdmaWxlVXBsb2FkJywgRGlyZWN0aXZlcy5GaWxlVXBsb2FkRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ3N0cnVjdHVyZVRyZWUnLCBEaXJlY3RpdmVzLlN0cnVjdHVyZVRyZWVEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnc2RjV2l6YXJkU3RlcCcsIERpcmVjdGl2ZXMuU2RjV2l6YXJkU3RlcERpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdzZGNQYWdlU2VsZWN0b3InLCBEaXJlY3RpdmVzLlBhZ2VTZWxlY3RvckRpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdzZGNTbWFydFRvb2x0aXAnLCBEaXJlY3RpdmVzLlNtYXJ0VG9vbHRpcERpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdwcmludEdyYXBoU2NyZWVuJywgRGlyZWN0aXZlcy5QcmludEdyYXBoU2NyZWVuRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ3NkY1RhZycsIERpcmVjdGl2ZXMuVGFnRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ3NkY1RhZ3MnLCBEaXJlY3RpdmVzLlNkY1RhZ3NEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnc2RjS2V5Ym9hcmRFdmVudHMnLCBEaXJlY3RpdmVzLlNkY0tleWJvYXJkRXZlbnRzRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2V4cGFuZENvbGxhcHNlTWVudUJveCcsIERpcmVjdGl2ZXMuRXhwYW5kQ29sbGFwc2VNZW51Qm94RGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ3NkY1BhZ2VTY3JvbGwnLCBEaXJlY3RpdmVzLlNkY1BhZ2VTY3JvbGxEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgncHVuY2hPdXQnLCBEaXJlY3RpdmVzLlB1bmNoT3V0RGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ3JlbGF0aW9uTWVudScsIERpcmVjdGl2ZXMuUmVsYXRpb25NZW51RGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2N1c3RvbVZhbGlkYXRpb24nLCBEaXJlY3RpdmVzLkN1c3RvbVZhbGlkYXRpb25EaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnZWNvbXBIZWFkZXInLCBEaXJlY3RpdmVzLkVjb21wSGVhZGVyRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2VkaXROYW1lUG9wb3ZlcicsIERpcmVjdGl2ZXMuRWRpdE5hbWVQb3BvdmVyRGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ2ZpZWxkc1N0cnVjdHVyZScsIERpcmVjdGl2ZXMuRGF0YVR5cGVGaWVsZHNTdHJ1Y3R1cmVEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgndHlwZU1hcCcsIERpcmVjdGl2ZXMuVHlwZU1hcERpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCd0eXBlTGlzdCcsIERpcmVjdGl2ZXMuVHlwZUxpc3REaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnaW5mb1Rvb2x0aXAnLCBEaXJlY3RpdmVzLkluZm9Ub29sdGlwRGlyZWN0aXZlLmZhY3RvcnkpOworCisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnc2RjVGFicycsIERpcmVjdGl2ZXMuU2RjVGFic0RpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdzZGNTaW5nbGVUYWInLCBEaXJlY3RpdmVzLlNkY1NpbmdsZVRhYkRpcmVjdGl2ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdpbm5lclNkY1NpbmdsZVRhYicsIERpcmVjdGl2ZXMuSW5uZXJTZGNTaW5nbGVUYWJEaXJlY3RpdmUuZmFjdG9yeSk7CisKKyAgICAvL2NvbXBvc2l0aW9uCisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgncGFsZXR0ZScsIERpcmVjdGl2ZXMuUGFsZXR0ZS5mYWN0b3J5KTsKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdjb21wb3NpdGlvbkdyYXBoJywgRGlyZWN0aXZlcy5Db21wb3NpdGlvbkdyYXBoLmZhY3RvcnkpOworCisgICAgLy9kZXBsb3ltZW50CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgnZGVwbG95bWVudEdyYXBoJywgRGlyZWN0aXZlcy5EZXBsb3ltZW50R3JhcGguZmFjdG9yeSk7CisKKyAgICAvLyBMYXlvdXRzCisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgndG9wTmF2JywgRGlyZWN0aXZlcy5Ub3BOYXZEaXJlY3RpdmUuZmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLmRpcmVjdGl2ZSgndG9wUHJvZ3Jlc3MnLCBEaXJlY3RpdmVzLlRvcFByb2dyZXNzRGlyZWN0aXZlLmZhY3RvcnkpOworCisgICAgLy8gRWxlbWVudHMKKyAgICBkaXJlY3RpdmVNb2R1bGUuZGlyZWN0aXZlKCdzZGNDaGVja2JveCcsIERpcmVjdGl2ZXMuQ2hlY2tib3hFbGVtZW50RGlyZWN0aXZlLmZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ3NkY1JhZGlvQnV0dG9uJywgRGlyZWN0aXZlcy5SYWRpb2J1dHRvbkVsZW1lbnREaXJlY3RpdmUuZmFjdG9yeSk7CisKKyAgICAvL0dyYXBoIFV0aWxzIC0gQ29tbW9uIAorICAgIGRpcmVjdGl2ZU1vZHVsZS5zZXJ2aWNlKCdDb21tb25HcmFwaFV0aWxzJywgU2RjLkdyYXBoLlV0aWxzLkNvbW1vbkdyYXBoVXRpbHMpOworCisgICAgLy9Db21wb3NpdGlvbiBHcmFwaCBVdGlscyAKKyAgICBkaXJlY3RpdmVNb2R1bGUuc2VydmljZSgnQ29tcG9zaXRpb25HcmFwaE5vZGVzVXRpbHMnLCBTZGMuR3JhcGguVXRpbHMuQ29tcG9zaXRpb25HcmFwaE5vZGVzVXRpbHMpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5zZXJ2aWNlKCdDb21wb3NpdGlvbkdyYXBoR2VuZXJhbFV0aWxzJywgU2RjLkdyYXBoLlV0aWxzLkNvbXBvc2l0aW9uR3JhcGhHZW5lcmFsVXRpbHMpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5zZXJ2aWNlKCdDb21wb3NpdGlvbkdyYXBoTGlua1V0aWxzJywgU2RjLkdyYXBoLlV0aWxzLkNvbXBvc2l0aW9uR3JhcGhMaW5rVXRpbHMpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5zZXJ2aWNlKCdNYXRjaENhcGFiaWxpdGllc1JlcXVpcmVtZW50c1V0aWxzJywgU2RjLkdyYXBoLlV0aWxzLk1hdGNoQ2FwYWJpbGl0aWVzUmVxdWlyZW1lbnRzVXRpbHMpOworCisgICAgLy9Db21wb3NpdGlvbiBHcmFwaCBVdGlscworICAgIGRpcmVjdGl2ZU1vZHVsZS5zZXJ2aWNlKCdEZXBsb3ltZW50R3JhcGhHZW5lcmFsVXRpbHMnLCBTZGMuR3JhcGguVXRpbHMuRGVwbG95bWVudEdyYXBoR2VuZXJhbFV0aWxzKTsKKyAgICAKKyAgICAvL1V0aWwgc2VydmljZSBmb3IgZ3JhcGgKKyAgICBkaXJlY3RpdmVNb2R1bGUuc2VydmljZSgnTm9kZXNGYWN0b3J5JywgU2RjLlV0aWxzLk5vZGVzRmFjdG9yeSk7CisgICAgZGlyZWN0aXZlTW9kdWxlLnNlcnZpY2UoJ0xpbmtzRmFjdG9yeScsIFNkYy5VdGlscy5MaW5rc0ZhY3RvcnkpOworICAgIGRpcmVjdGl2ZU1vZHVsZS5zZXJ2aWNlKCdJbWFnZUNyZWF0b3JTZXJ2aWNlJywgU2RjLlV0aWxzLkltYWdlQ3JlYXRvclNlcnZpY2UpOworCisgICAgLy9kaXJlY3RpdmVNb2R1bGUuc2VydmljZSgnR3JhcGhVdGlsc1NlcnZlclVwZGF0ZVF1ZXVlJywgU2RjLkRpcmVjdGl2ZXMuR3JhcGhVdGlsc1NlcnZlclVwZGF0ZVF1ZXVlKTsKKworICAgIC8vY29udHJvbGxlciBmb3IgZ28uanMKKyAgICBkaXJlY3RpdmVNb2R1bGUuY29udHJvbGxlcignU2RjV2l6YXJkU3RlcERpcmVjdGl2ZUNvbnRyb2xsZXInLCBEaXJlY3RpdmVzLlNkY1dpemFyZFN0ZXBEaXJlY3RpdmVDb250cm9sbGVyKTsKKworICAgIC8vIEV2ZW50cworICAgIGRpcmVjdGl2ZU1vZHVsZS5kaXJlY3RpdmUoJ29uTGFzdFJlcGVhdCcsIERpcmVjdGl2ZXMuT25MYXN0UmVwZWF0RGlyZWN0aXZlLmZhY3RvcnkpOworfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kdWxlcy9maWx0ZXJzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2R1bGVzL2ZpbHRlcnMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmMzE1MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kdWxlcy9maWx0ZXJzLnRzCkBAIC0wLDAgKzEsNDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjIHsKKworICBsZXQgbW9kdWxlTmFtZTogc3RyaW5nID0gJ1NkYy5GaWx0ZXJzJzsKKyAgbGV0IGZpbHRlck1vZHVsZTogbmcuSU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKG1vZHVsZU5hbWUsIFtdKTsKKyAgZmlsdGVyTW9kdWxlLmZpbHRlcigicmVzb3VyY2VOYW1lIiwgU2RjLkZpbHRlcnMuUmVzb3VyY2VOYW1lRmlsdGVyKTsKKyAgZmlsdGVyTW9kdWxlLmZpbHRlcigiZ3JhcGhSZXNvdXJjZU5hbWUiLCBTZGMuRmlsdGVycy5HcmFwaFJlc291cmNlTmFtZUZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoImNhdGVnb3J5TmFtZUZpbHRlciIsIFNkYy5GaWx0ZXJzLkNhdGVnb3J5TmFtZUZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoImVudGl0eUZpbHRlciIsIFNkYy5GaWx0ZXJzLkVudGl0eUZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoInRydW5jYXRlIiwgU2RjLkZpbHRlcnMuVHJ1bmNhdGVGaWx0ZXIpOworICBmaWx0ZXJNb2R1bGUuZmlsdGVyKCJjYXRhbG9nU3RhdHVzRmlsdGVyIiwgU2RjLkZpbHRlcnMuQ2F0YWxvZ1N0YXR1c0ZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoImNhdGVnb3J5VHlwZUZpbHRlciIsIFNkYy5GaWx0ZXJzLkNhdGVnb3J5VHlwZUZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoInN0cmluZ1RvRGF0ZUZpbHRlciIsIFNkYy5GaWx0ZXJzLlN0cmluZ1RvRGF0ZUZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoImNhdGVnb3J5SWNvbiIsIFNkYy5GaWx0ZXJzLkNhdGVnb3J5SWNvbkZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoImNhcGl0YWxpemVGaWx0ZXIiLCBTZGMuRmlsdGVycy5DYXBpdGFsaXplRmlsdGVyKTsKKyAgZmlsdGVyTW9kdWxlLmZpbHRlcigidW5kZXJzY29yZUxlc3NGaWx0ZXIiLCBTZGMuRmlsdGVycy5VbmRlcnNjb3JlTGVzc0ZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoInJlc291cmNlVHlwZU5hbWUiLCBTZGMuRmlsdGVycy5SZXNvdXJjZVR5cGVGaWx0ZXIpOworICBmaWx0ZXJNb2R1bGUuZmlsdGVyKCJyZWxhdGlvbk5hbWUiLCBTZGMuRmlsdGVycy5SZWxhdGlvbk5hbWVGaWx0ZXIpOworICBmaWx0ZXJNb2R1bGUuZmlsdGVyKCJ0cmltIiwgU2RjLkZpbHRlcnMuVHJpbUZpbHRlcik7CisgIGZpbHRlck1vZHVsZS5maWx0ZXIoImNsZWFyV2hpdGVTcGFjZXMiLCBTZGMuRmlsdGVycy5DbGVhcldoaXRlU3BhY2VzRmlsdGVyKTsKKyAgZmlsdGVyTW9kdWxlLmZpbHRlcigndGVzdHNJZCcsIFNkYy5GaWx0ZXJzLlRlc3RzSWRGaWx0ZXIpOworCisgIC8vQWRkZWQgYnkgSWtyYW0KKyAgZmlsdGVyTW9kdWxlLmZpbHRlcigicHJvZHVjdENhdGVnb3J5TmFtZUZpbHRlciIsIFNkYy5GaWx0ZXJzLlByb2R1Y3RDYXRlZ29yeU5hbWVGaWx0ZXIpOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2R1bGVzL3NlcnZpY2UtbW9kdWxlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2R1bGVzL3NlcnZpY2UtbW9kdWxlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2U4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZHVsZXMvc2VydmljZS1tb2R1bGUudHMKQEAgLTAsMCArMSw2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMgeworICAgIGxldCBtb2R1bGVOYW1lOnN0cmluZyA9ICdTZGMuU2VydmljZXMnOworICAgIGxldCBzZXJ2aWNlTW9kdWxlOm5nLklNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShtb2R1bGVOYW1lLCBbXSk7CisKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5Db25maWd1cmF0aW9uVWlTZXJ2aWNlJywgU2VydmljZXMuQ29uZmlndXJhdGlvblVpU2VydmljZSk7CisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdTZGMuU2VydmljZXMuQ29va2llU2VydmljZScsIFNlcnZpY2VzLkNvb2tpZVNlcnZpY2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnU2RjLlNlcnZpY2VzLkVudGl0eVNlcnZpY2UnLCBTZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5BdmFpbGFibGVJY29uc1NlcnZpY2UnLCBTZXJ2aWNlcy5BdmFpbGFibGVJY29uc1NlcnZpY2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnU2RjLlNlcnZpY2VzLlJlbGF0aW9uSWNvbnNTZXJ2aWNlJywgU2VydmljZXMuUmVsYXRpb25JY29uc1NlcnZpY2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnU2RjLlNlcnZpY2VzLlVybFRvQmFzZTY0U2VydmljZScsIFNlcnZpY2VzLlVybFRvQmFzZTY0U2VydmljZSk7CisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJywgU2VydmljZXMuQ2FjaGVTZXJ2aWNlKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5IZWFkZXJJbnRlcmNlcHRvcicsIFNlcnZpY2VzLkhlYWRlckludGVyY2VwdG9yKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5IdHRwRXJyb3JJbnRlcmNlcHRvcicsIFNlcnZpY2VzLkh0dHBFcnJvckludGVyY2VwdG9yKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZScsIFNlcnZpY2VzLlNoYXJpbmdTZXJ2aWNlKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5TZGNWZXJzaW9uU2VydmljZScsIFNlcnZpY2VzLlNkY1ZlcnNpb25TZXJ2aWNlKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5BY3Rpdml0eUxvZ1NlcnZpY2UnLCBTZXJ2aWNlcy5BY3Rpdml0eUxvZ1NlcnZpY2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnU2RjLlNlcnZpY2VzLk9uYm9hcmRpbmdTZXJ2aWNlJywgU2VydmljZXMuT25ib2FyZGluZ1NlcnZpY2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnU2RjLlNlcnZpY2VzLkVjb21wSGVhZGVyU2VydmljZScsIFNlcnZpY2VzLkVjb21wSGVhZGVyU2VydmljZSk7CisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdTZGMuU2VydmljZXMuRGF0YVR5cGVzU2VydmljZScsIFNlcnZpY2VzLkRhdGFUeXBlc1NlcnZpY2UpOworCisgICAgLy9Db21wb25lbnRzIFNlcnZpY2VzCisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdTZGMuU2VydmljZXMuQ29tcG9uZW50cy5Db21wb25lbnRTZXJ2aWNlJywgU2VydmljZXMuQ29tcG9uZW50cy5Db21wb25lbnRTZXJ2aWNlKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ1NkYy5TZXJ2aWNlcy5Db21wb25lbnRzLlNlcnZpY2VTZXJ2aWNlJywgU2VydmljZXMuQ29tcG9uZW50cy5TZXJ2aWNlU2VydmljZSk7CisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdTZGMuU2VydmljZXMuQ29tcG9uZW50cy5SZXNvdXJjZVNlcnZpY2UnLCBTZXJ2aWNlcy5Db21wb25lbnRzLlJlc291cmNlU2VydmljZSk7CisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdTZGMuU2VydmljZXMuQ29tcG9uZW50cy5Qcm9kdWN0U2VydmljZScsIFNlcnZpY2VzLkNvbXBvbmVudHMuUHJvZHVjdFNlcnZpY2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlJywgU2VydmljZXMuQ29tcG9uZW50cy5MZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnRXZlbnRMaXN0ZW5lclNlcnZpY2UnLCBTZXJ2aWNlcy5FdmVudExpc3RlbmVyU2VydmljZSk7CisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdTZGMuU2VydmljZXMuUHJvZ3Jlc3NTZXJ2aWNlJywgU2VydmljZXMuUHJvZ3Jlc3NTZXJ2aWNlKTsKKworICAgIC8vVXRpbHMKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ0FydGlmYWN0c1V0aWxzJywgU2RjLlV0aWxzLkFydGlmYWN0c1V0aWxzKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ0ZpbGVVdGlscycsIFNkYy5VdGlscy5GaWxlVXRpbHMpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnVmFsaWRhdGlvblV0aWxzJywgU2RjLlV0aWxzLlZhbGlkYXRpb25VdGlscyk7CisKKworCisKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ0FuZ3VsYXJKU0JyaWRnZScsIFNkYy5TZXJ2aWNlcy5Bbmd1bGFySlNCcmlkZ2UpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnTG9hZGVyU2VydmljZScsIFNkYy5TZXJ2aWNlcy5Mb2FkZXJTZXJ2aWNlKTsKKworICAgIHNlcnZpY2VNb2R1bGUuZmFjdG9yeSgnU2RjLlNlcnZpY2VzLlVzZXJSZXNvdXJjZVNlcnZpY2UnLCBTZXJ2aWNlcy5Vc2VyUmVzb3VyY2VTZXJ2aWNlLmdldFJlc291cmNlKTsKKyAgICBzZXJ2aWNlTW9kdWxlLmZhY3RvcnkoJ1NkYy5TZXJ2aWNlcy5DYXRlZ29yeVJlc291cmNlU2VydmljZScsIFNlcnZpY2VzLkNhdGVnb3J5UmVzb3VyY2VTZXJ2aWNlLmdldFJlc291cmNlKTsKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2R1bGVzL3V0aWxzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9tb2R1bGVzL3V0aWxzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNWVhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZHVsZXMvdXRpbHMudHMKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi8xMS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjIHsKKyAgICBsZXQgbW9kdWxlTmFtZTpzdHJpbmcgPSAnU2RjLlV0aWxzJzsKKyAgICBsZXQgc2VydmljZU1vZHVsZTpuZy5JTW9kdWxlID0gYW5ndWxhci5tb2R1bGUobW9kdWxlTmFtZSwgW10pOworCisKKworICAgIC8vVXRpbHMKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ0NvbXBvbmVudEZhY3RvcnknLCBTZGMuVXRpbHMuQ29tcG9uZW50RmFjdG9yeSk7CisgICAgc2VydmljZU1vZHVsZS5zZXJ2aWNlKCdDb21wb25lbnRJbnN0YW5jZUZhY3RvcnknLCBTZGMuVXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5KTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ0NoYW5nZUxpZmVjeWNsZVN0YXRlSGFuZGxlcicsIFNkYy5VdGlscy5DaGFuZ2VMaWZlY3ljbGVTdGF0ZUhhbmRsZXIpOworICAgIHNlcnZpY2VNb2R1bGUuc2VydmljZSgnTW9kYWxzSGFuZGxlcicsIFNkYy5VdGlscy5Nb2RhbHNIYW5kbGVyKTsKKyAgICBzZXJ2aWNlTW9kdWxlLnNlcnZpY2UoJ01lbnVIYW5kbGVyJywgU2RjLlV0aWxzLk1lbnVIYW5kbGVyKTsKKworIAorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZHVsZXMvdmlldy1tb2RlbC1tb2R1bGUudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL21vZHVsZXMvdmlldy1tb2RlbC1tb2R1bGUudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljZjViNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvbW9kdWxlcy92aWV3LW1vZGVsLW1vZHVsZS50cwpAQCAtMCwwICsxLDk2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYyB7CisgIGxldCBtb2R1bGVOYW1lOiBzdHJpbmcgPSAnU2RjLlZpZXdNb2RlbHMnOworICBsZXQgdmlld01vZGVsTW9kdWxlOiBuZy5JTW9kdWxlID0gYW5ndWxhci5tb2R1bGUobW9kdWxlTmFtZSwgW10pOworCisgIHZpZXdNb2RlbE1vZHVsZQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5EYXNoYm9hcmRWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLkRhc2hib2FyZFZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuQ29tcG9zaXRpb25WaWV3TW9kZWwnLCBWaWV3TW9kZWxzLkNvbXBvc2l0aW9uVmlld01vZGVsKQorCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkRldGFpbHNWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLkRldGFpbHNWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLlJlc291cmNlQXJ0aWZhY3RzVmlld01vZGVsJywgVmlld01vZGVscy5SZXNvdXJjZUFydGlmYWN0c1ZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuUHJvcGVydHlGb3JtVmlld01vZGVsJywgVmlld01vZGVscy5Qcm9wZXJ0eUZvcm1WaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkFydGlmYWN0UmVzb3VyY2VGb3JtVmlld01vZGVsJywgVmlld01vZGVscy5BcnRpZmFjdFJlc291cmNlRm9ybVZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuQXR0cmlidXRlRm9ybVZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuQXR0cmlidXRlRm9ybVZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuUmVzb3VyY2VQcm9wZXJ0aWVzVmlld01vZGVsJywgVmlld01vZGVscy5SZXNvdXJjZVByb3BlcnRpZXNWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkNhdGFsb2dWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLkNhdGFsb2dWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLk9uYm9hcmRWZW5kb3JWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLk9uYm9hcmRWZW5kb3JWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkRpc3RyaWJ1dGlvblZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuRGlzdHJpYnV0aW9uVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5TdXBwb3J0Vmlld01vZGVsJywgVmlld01vZGVscy5TdXBwb3J0Vmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5Db25maXJtYXRpb25Nb2RhbFZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuQ29uZmlybWF0aW9uTW9kYWxWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkVtYWlsTW9kYWxWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLkVtYWlsTW9kYWxWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLk1lc3NhZ2VNb2RhbFZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuTWVzc2FnZU1vZGFsVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5TZXJ2ZXJNZXNzYWdlTW9kYWxWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLlNlcnZlck1lc3NhZ2VNb2RhbFZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuQ2xpZW50TWVzc2FnZU1vZGFsVmlld01vZGVsJywgVmlld01vZGVscy5DbGllbnRNZXNzYWdlTW9kYWxWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkVycm9yVmlld01vZGVsJywgVmlld01vZGVscy5FcnJvclZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuQ29tcG9uZW50Vmlld2VyVmlld01vZGVsJywgVmlld01vZGVscy5Db21wb25lbnRWaWV3ZXJWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLlJlbGF0aW9uc1ZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuUmVsYXRpb25zVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5SZXNvdXJjZUluc3RhbmNlTmFtZVZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuUmVzb3VyY2VJbnN0YW5jZU5hbWVWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLldlbGNvbWVWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLldlbGNvbWVWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLlByZUxvYWRpbmdWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLlByZUxvYWRpbmdWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLlR1dG9yaWFsRW5kVmlld01vZGVsJywgVmlld01vZGVscy5UdXRvcmlhbEVuZFZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuQWRtaW5EYXNoYm9hcmRWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLkFkbWluRGFzaGJvYXJkVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5FbnZQYXJhbWV0ZXJzRm9ybVZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuRW52UGFyYW1ldGVyc0Zvcm1WaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLlN0cnVjdHVyZVZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuU3RydWN0dXJlVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5BZGRDYXRlZ29yeU1vZGFsVmlld01vZGVsJywgVmlld01vZGVscy5BZGRDYXRlZ29yeU1vZGFsVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5EYXNoYm9hcmRDb3ZlclZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuRGFzaGJvYXJkQ292ZXJWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLlVzZXJNYW5hZ2VtZW50Vmlld01vZGVsJywgVmlld01vZGVscy5Vc2VyTWFuYWdlbWVudFZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuQ2F0ZWdvcnlNYW5hZ2VtZW50Vmlld01vZGVsJywgVmlld01vZGVscy5DYXRlZ29yeU1hbmFnZW1lbnRWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLldlbGNvbWVTdGVwc0NvbnRyb2xsZXJWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLldlbGNvbWVTdGVwc0NvbnRyb2xsZXJWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLk9uYm9hcmRpbmdNb2RhbFZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuT25ib2FyZGluZ01vZGFsVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5EaXN0cmlidXRpb25TdGF0dXNNb2RhbFZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuRGlzdHJpYnV0aW9uU3RhdHVzTW9kYWxWaWV3TW9kZWwpCisKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuV2l6YXJkLkVkaXRXaXphcmRWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLldpemFyZC5FZGl0V2l6YXJkVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5XaXphcmQuQ3JlYXRlV2l6YXJkVmlld01vZGVsJywgVmlld01vZGVscy5XaXphcmQuQ3JlYXRlV2l6YXJkVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5XaXphcmQuSW1wb3J0V2l6YXJkVmlld01vZGVsJywgVmlld01vZGVscy5XaXphcmQuSW1wb3J0V2l6YXJkVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5XaXphcmQuR2VuZXJhbFN0ZXBWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLldpemFyZC5HZW5lcmFsU3RlcFZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuV2l6YXJkLkljb25zU3RlcFZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuV2l6YXJkLkljb25zU3RlcFZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuV2l6YXJkLkFydGlmYWN0SW5mb3JtYXRpb25TdGVwVmlld01vZGVsJywgVmlld01vZGVscy5XaXphcmQuQXJ0aWZhY3RJbmZvcm1hdGlvblN0ZXBWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLldpemFyZC5BcnRpZmFjdERlcGxveW1lbnRTdGVwVmlld01vZGVsJywgVmlld01vZGVscy5XaXphcmQuQXJ0aWZhY3REZXBsb3ltZW50U3RlcFZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuV2l6YXJkLlByb3BlcnRpZXNTdGVwVmlld01vZGVsJywgVmlld01vZGVscy5XaXphcmQuUHJvcGVydGllc1N0ZXBWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLldpemFyZC5BcnRpZmFjdFJlc291cmNlRm9ybVN0ZXBWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLldpemFyZC5BcnRpZmFjdFJlc291cmNlRm9ybVN0ZXBWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLldpemFyZC5Qcm9wZXJ0eUZvcm1WaWV3TW9kZWwnLCBWaWV3TW9kZWxzLldpemFyZC5Qcm9wZXJ0eUZvcm1WaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLldpemFyZC5IaWVyYXJjaHlTdGVwVmlld01vZGVsJyxWaWV3TW9kZWxzLldpemFyZC5IaWVyYXJjaHlTdGVwVmlld01vZGVsKQorCisgICAgIC8vTkVXCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLldvcmtzcGFjZVZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuV29ya3NwYWNlVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5HZW5lcmFsVmlld01vZGVsJywgVmlld01vZGVscy5HZW5lcmFsVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5JY29uc1ZpZXdNb2RlbCcsIFZpZXdNb2RlbHMuSWNvbnNWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkRlcGxveW1lbnRBcnRpZmFjdHNWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLkRlcGxveW1lbnRBcnRpZmFjdHNWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkluZm9ybWF0aW9uQXJ0aWZhY3RzVmlld01vZGVsJywgVmlld01vZGVscy5JbmZvcm1hdGlvbkFydGlmYWN0c1ZpZXdNb2RlbCkKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuVG9zY2FBcnRpZmFjdHNWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLlRvc2NhQXJ0aWZhY3RzVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5Qcm9wZXJ0aWVzVmlld01vZGVsJywgVmlld01vZGVscy5Qcm9wZXJ0aWVzVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5BdHRyaWJ1dGVzVmlld01vZGVsJywgVmlld01vZGVscy5BdHRyaWJ1dGVzVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5Qcm9kdWN0SGllcmFyY2h5Vmlld01vZGVsJyxWaWV3TW9kZWxzLlByb2R1Y3RIaWVyYXJjaHlWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLkFjdGl2aXR5TG9nVmlld01vZGVsJyxWaWV3TW9kZWxzLkFjdGl2aXR5TG9nVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5NYW5hZ2VtZW50V29ya2Zsb3dWaWV3TW9kZWwnLFZpZXdNb2RlbHMuTWFuYWdlbWVudFdvcmtmbG93Vmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5OZXR3b3JrQ2FsbEZsb3dWaWV3TW9kZWwnLFZpZXdNb2RlbHMuTmV0d29ya0NhbGxGbG93Vmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5EZXBsb3ltZW50Vmlld01vZGVsJyxWaWV3TW9kZWxzLkRlcGxveW1lbnRWaWV3TW9kZWwpCisgICAgLmNvbnRyb2xsZXIobW9kdWxlTmFtZSsnLlJlc291cmNlSW5wdXRzVmlld01vZGVsJyxWaWV3TW9kZWxzLlJlc291cmNlSW5wdXRzVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5TZXJ2aWNlSW5wdXRzVmlld01vZGVsJywgVmlld01vZGVscy5TZXJ2aWNlSW5wdXRzVmlld01vZGVsKQorICAgIC5jb250cm9sbGVyKG1vZHVsZU5hbWUrJy5SZXFBbmRDYXBhYmlsaXRpZXNWaWV3TW9kZWwnLCBWaWV3TW9kZWxzLlJlcUFuZENhcGFiaWxpdGllc1ZpZXdNb2RlbCkKKworCisKKyAgICAvL1RBQlMKKyAgICAuY29udHJvbGxlcihtb2R1bGVOYW1lKycuSGllcmFyY2h5Vmlld01vZGVsJyxWaWV3TW9kZWxzLkhpZXJhcmNoeVZpZXdNb2RlbCkKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvYWN0aXZpdHktbG9nLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2FjdGl2aXR5LWxvZy1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2FjdGl2aXR5LWxvZy1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlNlcnZpY2VzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICAvLyBEZWZpbmUgYW4gaW50ZXJmYWNlIG9mIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gdXNlLCBwcm92aWRpbmcgaXQncyBwcm9wZXJ0aWVzCisgICAgZXhwb3J0IGludGVyZmFjZSBJQWN0aXZpdHlMb2dTZXJ2aWNleworICAgICAgICBnZXRBY3Rpdml0eUxvZ1NlcnZpY2UodHlwZSA6c3RyaW5nLCBpZDogc3RyaW5nKTogbmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLkFjdGl2aXR5Pj47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEFjdGl2aXR5TG9nU2VydmljZSBpbXBsZW1lbnRzICBJQWN0aXZpdHlMb2dTZXJ2aWNleworCisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsnJGh0dHAnLCAnJHEnLCdzZGNDb25maWcnXTsKKyAgICAgICAgcHJpdmF0ZSBhcGk6IE1vZGVscy5JQXBpOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJGh0dHA6IG5nLklIdHRwU2VydmljZSwgcHJpdmF0ZSAkcTogbmcuSVFTZXJ2aWNlLCBzZGNDb25maWc6IE1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbil7CisgICAgICAgICAgICB0aGlzLmFwaSA9IHNkY0NvbmZpZy5hcGk7CisgICAgICAgIH0KKworICAgICAgICBnZXRBY3Rpdml0eUxvZ1NlcnZpY2UgPSAodHlwZTpzdHJpbmcsIGlkOnN0cmluZyk6IG5nLklQcm9taXNlPEFycmF5PE1vZGVscy5BY3Rpdml0eT4+ID0+eworICAgICAgICAgICAgbGV0IGRlZmVyID0gdGhpcy4kcS5kZWZlcjxhbnk+KCk7CisgICAgICAgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLmFwaS5yb290ICsgdGhpcy5hcGkuR0VUX2FjdGl2aXR5X2xvZy5yZXBsYWNlKCc6dHlwZScsIHR5cGUpLnJlcGxhY2UoJzppZCcsIGlkKSkKKyAgICAgICAgICAgICAgICAuc3VjY2VzcygoYWN0aXZpdHlMb2c6IGFueSkgPT4geworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKGFjdGl2aXR5TG9nKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9hbmd1bGFyLWpzLWJyaWRnZS1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9hbmd1bGFyLWpzLWJyaWRnZS1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGZiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2FuZ3VsYXItanMtYnJpZGdlLXNlcnZpY2UudHMKQEAgLTAsMCArMSwyMiBAQAorbW9kdWxlIFNkYy5TZXJ2aWNlcyB7CisgICAgZXhwb3J0IGNsYXNzIEFuZ3VsYXJKU0JyaWRnZXsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgXyRmaWx0ZXI6IG5nLklGaWx0ZXJTZXJ2aWNlOworICAgICAgICBwcml2YXRlIHN0YXRpYyBfc2RjQ29uZmlnOiBNb2RlbHMuSUFwcENvbmZpZ3VydGFpb247CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBnZXRGaWx0ZXIoZmlsdGVyTmFtZTogc3RyaW5nKXsKKyAgICAgICAgICAgIHJldHVybiBBbmd1bGFySlNCcmlkZ2UuXyRmaWx0ZXIoZmlsdGVyTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGdldEFuZ3VsYXJDb25maWcoKXsKKyAgICAgICAgICAgIHJldHVybiBBbmd1bGFySlNCcmlkZ2UuX3NkY0NvbmZpZzsKKyAgICAgICAgfQorCisKKyAgICAgICAgY29uc3RydWN0b3IoJGZpbHRlcjogbmcuSUZpbHRlclNlcnZpY2UsIHNkY0NvbmZpZzogTW9kZWxzLklBcHBDb25maWd1cnRhaW9uKXsKKyAgICAgICAgICAgIEFuZ3VsYXJKU0JyaWRnZS5fJGZpbHRlciA9ICRmaWx0ZXI7CisgICAgICAgICAgICBBbmd1bGFySlNCcmlkZ2UuX3NkY0NvbmZpZyA9IHNkY0NvbmZpZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFuZ3VsYXJKU0JyaWRnZS4kaW5qZWN0ID0gWyckZmlsdGVyJywgJ3NkY0NvbmZpZyddCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9hdmFpbGFibGUtaWNvbnMtc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvYXZhaWxhYmxlLWljb25zLXNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyMGFmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvYXZhaWxhYmxlLWljb25zLXNlcnZpY2UudHMKQEAgLTAsMCArMSwxMDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvMjMvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElBdmFpbGFibGVJY29uc1NlcnZpY2UgeworICAgICAgICBnZXRJY29ucyhjb21wb25lbnRUeXBlOiBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZSk6QXJyYXk8c3RyaW5nPjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgQXZhaWxhYmxlSWNvbnNTZXJ2aWNlIGltcGxlbWVudHMgSUF2YWlsYWJsZUljb25zU2VydmljZSB7CisgICAgICAgIGNvbnN0cnVjdG9yKCkge30KKyAgICAgICAgcHVibGljIGdldEljb25zID0gKGNvbXBvbmVudFR5cGU6IHN0cmluZyk6IEFycmF5PHN0cmluZz4gPT4geworICAgICAgICAgICAgbGV0IGljb25zOiBzdHJpbmdbXTsKKyAgICAgICAgICAgIHN3aXRjaCAoY29tcG9uZW50VHlwZSl7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFOgorICAgICAgICAgICAgICAgICAgICBpY29ucyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICdjYWxsX2NvbnRyb2xsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdtb2JpbGl0eScsCisgICAgICAgICAgICAgICAgICAgICAgICAnbmV0d29ya19sXzEtMycsCisgICAgICAgICAgICAgICAgICAgICAgICAnbmV0d29ya19sXzQnCisgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgaWNvbnM9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICdyb3V0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGFiYXNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICduZXR3b3JrJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3RTdG9yYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdjb25uZWN0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2Jyb2NhZGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2Npc2NvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdlcmljc3NvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAndHJvcG8nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcnRpbmV0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdhdHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2Jyb2Fkc29mdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnYWxjYXRlbEx1Y2VudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnbWV0YXN3aXRjaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnYXJpY2VudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnbXlTcWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ29yYWNsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAnbm9raWFfc2llbWVucycsCisgICAgICAgICAgICAgICAgICAgICAgICAnanVuaXBlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAnY2FsbF9jb250cm9sbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyRWxlbWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb25TZXJ2ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NlcnZlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAncG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnbG9hZEJhbGFuY2VyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdjb21wdXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdnYXRld2F5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdjcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndmwnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3ZmdycsCisgICAgICAgICAgICAgICAgICAgICAgICAnZmlyZXdhbGwnCisgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5QUk9EVUNUOgorICAgICAgICAgICAgICAgICAgICBpY29ucyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICd2ZncnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ25ldHdvcmsnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NlY3VyaXR5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdjbG91ZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAnb3JwaGFuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd3YW54JywKKyAgICAgICAgICAgICAgICAgICAgICAgICd2cm91dGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd1Y3BlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdtb2JpbGl0eScKKworICAgICAgICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGljb25zOworICAgICAgICB9CisKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NhY2hlLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NhY2hlLXNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1ZTU0OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvY2FjaGUtc2VydmljZS50cwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcyB7CisKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSUNhY2hlU2VydmljZSB7CisgICAgICAgIGdldChrZXk6c3RyaW5nKTphbnk7CisgICAgICAgIHNldChrZXk6c3RyaW5nLCB2YWx1ZTphbnkpOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIENhY2hlU2VydmljZSBpbXBsZW1lbnRzIElDYWNoZVNlcnZpY2UgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJ3NkY0NvbmZpZycsICckZG9jdW1lbnQnXTsKKyAgICAgICAgcHJpdmF0ZSBzdG9yYWdlOlV0aWxzLkRpY3Rpb25hcnk8c3RyaW5nLCBhbnk+OworCisgICAgICAgIGNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgdGhpcy5zdG9yYWdlID0gbmV3IFV0aWxzLkRpY3Rpb25hcnk8c3RyaW5nLCBhbnk+KCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldCA9IChrZXk6c3RyaW5nKTphbnkgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRWYWx1ZShrZXkpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzZXQgPSAoa2V5OnN0cmluZywgdmFsdWU6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRWYWx1ZShrZXksIHZhbHVlKTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgcmVtb3ZlID0gKGtleTpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmFnZS5jb250YWluc0tleShrZXkpKXsKKyAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNvbnRhaW5zID0gKGtleTpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5jb250YWluc0tleShrZXkpOworICAgICAgICB9OworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jYXRlZ29yeS1yZXNvdXJjZS1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jYXRlZ29yeS1yZXNvdXJjZS1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjFiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NhdGVnb3J5LXJlc291cmNlLXNlcnZpY2UudHMKQEAgLTAsMCArMSw4MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworICAgIGltcG9ydCBJTWFpbkNhdGVnb3J5ID0gU2RjLk1vZGVscy5JTWFpbkNhdGVnb3J5OworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIC8vIERlZmluZSBhbiBpbnRlcmZhY2Ugb2YgdGhlIG9iamVjdCB5b3Ugd2FudCB0byB1c2UsIHByb3ZpZGluZyBpdCdzIHByb3BlcnRpZXMKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDYXRlZ29yeVJlc291cmNlIGV4dGVuZHMgTW9kZWxzLklVc2VyUHJvcGVydGllcyxuZy5yZXNvdXJjZS5JUmVzb3VyY2U8SUNhdGVnb3J5UmVzb3VyY2U+eworICAgICAgICBuYW1lOnN0cmluZzsKKyAgICAgICAgdW5pcXVlSWQ6c3RyaW5nOworICAgICAgICBzdWJjYXRlZ29yaWVzOkFycmF5PElDYXRlZ29yeVJlc291cmNlPjsKKworICAgICAgICBnZXRBbGxDYXRlZ29yaWVzKHBhcmFtcz86IE9iamVjdCwgc3VjY2Vzcz86IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogQXJyYXk8SU1haW5DYXRlZ29yeT47CisgICAgICAgICRzYXZlU3ViQ2F0ZWdvcnkocGFyYW1zPzogT2JqZWN0LCBzdWNjZXNzPzogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBhbnk7CisgICAgICAgICRkZWxldGVTdWJDYXRlZ29yeShwYXJhbXM/OiBPYmplY3QsIHN1Y2Nlc3M/OiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IGFueTsKKyAgICB9CisKKyAgICAvLyBEZWZpbmUgeW91ciByZXNvdXJjZSwgYWRkaW5nIHRoZSBzaWduYXR1cmUgb2YgdGhlIGN1c3RvbSBhY3Rpb25zCisgICAgZXhwb3J0IGludGVyZmFjZSBJQ2F0ZWdvcnlSZXNvdXJjZUNsYXNzIGV4dGVuZHMgbmcucmVzb3VyY2UuSVJlc291cmNlQ2xhc3M8SUNhdGVnb3J5UmVzb3VyY2U+eworICAgICAgICBnZXRBbGxDYXRlZ29yaWVzKHBhcmFtcz86IE9iamVjdCwgc3VjY2Vzcz86IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogQXJyYXk8SU1haW5DYXRlZ29yeT47CisgICAgICAgIHNhdmVTdWJDYXRlZ29yeShwYXJhbXM/OiBPYmplY3QsIHN1Y2Nlc3M/OiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IGFueTsKKyAgICAgICAgZGVsZXRlU3ViQ2F0ZWdvcnkocGFyYW1zPzogT2JqZWN0LCBzdWNjZXNzPzogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBhbnk7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIENhdGVnb3J5UmVzb3VyY2VTZXJ2aWNleworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVzb3VyY2UgPSAoCisgICAgICAgICAgICAkcmVzb3VyY2U6IG5nLnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2UsCisgICAgICAgICAgICBzZGNDb25maWc6IE1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbgorICAgICAgICApOiBJQ2F0ZWdvcnlSZXNvdXJjZUNsYXNzID0+IHsKKworICAgICAgICAgICAgLy8gRGVmaW5lIHlvdXIgY3VzdG9tIGFjdGlvbnMgaGVyZSBhcyBJQWN0aW9uRGVzY3JpcHRvcgorICAgICAgICAgICAgbGV0IGdldEFsbENhdGVnb3JpZXNBY3Rpb24gOiBuZy5yZXNvdXJjZS5JQWN0aW9uRGVzY3JpcHRvciA9IHsKKyAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAorICAgICAgICAgICAgICAgIGlzQXJyYXk6IHRydWUsCisgICAgICAgICAgICAgICAgdXJsOiBzZGNDb25maWcuYXBpLnJvb3QgKyBzZGNDb25maWcuYXBpLkdFVF9jYXRlZ29yaWVzCisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IHNhdmVTdWJDYXRlZ29yeSA6IG5nLnJlc291cmNlLklBY3Rpb25EZXNjcmlwdG9yID0geworICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAorICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLAorICAgICAgICAgICAgICAgIHVybDogc2RjQ29uZmlnLmFwaS5yb290ICsgc2RjQ29uZmlnLmFwaS5QT1NUX3N1YmNhdGVnb3J5CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IGRlbGV0ZVN1YkNhdGVnb3J5OiBuZy5yZXNvdXJjZS5JQWN0aW9uRGVzY3JpcHRvciA9IHsKKyAgICAgICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLAorICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLAorICAgICAgICAgICAgICAgIHVybDogc2RjQ29uZmlnLmFwaS5yb290ICsgc2RjQ29uZmlnLmFwaS5QT1NUX3N1YmNhdGVnb3J5CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZyA9IHNkY0NvbmZpZy5hcGkucm9vdCArIHNkY0NvbmZpZy5hcGkuUE9TVF9jYXRlZ29yeTsKKyAgICAgICAgICAgIGxldCBjYXRlZ29yeVJlc291cmNlOiBJQ2F0ZWdvcnlSZXNvdXJjZUNsYXNzID0gPElDYXRlZ29yeVJlc291cmNlQ2xhc3M+JHJlc291cmNlKAorICAgICAgICAgICAgICAgIHVybCwKKyAgICAgICAgICAgICAgICB7IHR5cGVzOiAnQHR5cGVzJywgY2F0ZWdvcnlJZDogJ0BjYXRlZ29yeUlkJyB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QWxsQ2F0ZWdvcmllczogZ2V0QWxsQ2F0ZWdvcmllc0FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc2F2ZVN1YkNhdGVnb3J5OiBzYXZlU3ViQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVN1YkNhdGVnb3J5OiBkZWxldGVTdWJDYXRlZ29yeQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHJldHVybiBjYXRlZ29yeVJlc291cmNlOworICAgICAgICB9CisgICAgfQorICAgIENhdGVnb3J5UmVzb3VyY2VTZXJ2aWNlLmdldFJlc291cmNlLiRpbmplY3QgPSBbJyRyZXNvdXJjZScsICdzZGNDb25maWcnXTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvY29tcG9uZW50cy9jb21wb25lbnQtc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvY29tcG9uZW50cy9jb21wb25lbnQtc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNlYTcxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb21wb25lbnRzL2NvbXBvbmVudC1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsNjk4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcy5Db21wb25lbnRzIHsKKworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGRlY2xhcmUgbGV0IENyeXB0b0pTOmFueTsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFNlcnZpY2UgeworCisgICAgICAgIGdldENvbXBvbmVudChpZDpzdHJpbmcpOworICAgICAgICB1cGRhdGVDb21wb25lbnQoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PjsKKyAgICAgICAgY2hhbmdlTGlmZWN5Y2xlU3RhdGUoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwgc3RhdGU6c3RyaW5nLCB1c2VyUmVtYXJrczphbnkpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gOworICAgICAgICB2YWxpZGF0ZU5hbWUobmV3TmFtZTpzdHJpbmcsIHN1YnR5cGU/OnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLklWYWxpZGF0ZT47CisgICAgICAgIGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OworICAgICAgICBhZGRPclVwZGF0ZUFydGlmYWN0KGNvbXBvbmVudElkOnN0cmluZywgYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgZGVsZXRlQXJ0aWZhY3QoY29tcG9uZW50SWQ6c3RyaW5nLCBhcnRpZmFjdDpzdHJpbmcsIGFydGlmYWN0TGFiZWwpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgYWRkUHJvcGVydHkoY29tcG9uZW50SWQ6c3RyaW5nLCBwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLlByb3BlcnR5TW9kZWw+OworICAgICAgICB1cGRhdGVQcm9wZXJ0eShjb21wb25lbnRJZDpzdHJpbmcsIHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuUHJvcGVydHlNb2RlbD47CisgICAgICAgIGFkZEF0dHJpYnV0ZShjb21wb25lbnRJZDpzdHJpbmcsIGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD47CisgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZShjb21wb25lbnRJZDpzdHJpbmcsIGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD47CisgICAgICAgIGRlbGV0ZVByb3BlcnR5KGNvbXBvbmVudElkOnN0cmluZywgcHJvcGVydHlJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPjsKKyAgICAgICAgZGVsZXRlQXR0cmlidXRlKGNvbXBvbmVudElkOnN0cmluZywgYXR0cmlidXRlSWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlTW9kZWw+OworICAgICAgICBjaGFuZ2VSZXNvdXJjZUluc3RhbmNlVmVyc2lvbihjb21wb25lbnRJZDpzdHJpbmcsIGNvbXBvbmVudEluc3RhbmNlSWQ6c3RyaW5nLCBjb21wb25lbnRVaWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT47CisgICAgICAgIHVwZGF0ZUluc3RhbmNlQXJ0aWZhY3QoY29tcG9uZW50SWQ6c3RyaW5nLCBpbnN0YW5jZUlkOnN0cmluZywgYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgYWRkSW5zdGFuY2VBcnRpZmFjdChjb21wb25lbnRJZDogc3RyaW5nLCBpbnN0YW5jZUlkOiBzdHJpbmcsIGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuQXJ0aWZhY3RNb2RlbD47CisgICAgICAgIGRlbGV0ZUluc3RhbmNlQXJ0aWZhY3QoY29tcG9uZW50SWQ6IHN0cmluZywgaW5zdGFuY2VJZDogc3RyaW5nLCBhcnRpZmFjdDpzdHJpbmcsIGFydGlmYWN0TGFiZWwpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SWQ6c3RyaW5nLCBjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+OworICAgICAgICB1cGRhdGVDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnRJZDpzdHJpbmcsIGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT47CisgICAgICAgIHVwZGF0ZU11bHRpcGxlQ29tcG9uZW50SW5zdGFuY2VzKGNvbXBvbmVudElkOnN0cmluZywgaW5zdGFuY2VzOkFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPik6bmcuSVByb21pc2U8IEFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPj47CisgICAgICAgIGRvd25sb2FkQXJ0aWZhY3QoY29tcG9uZW50SWQ6c3RyaW5nLCBhcnRpZmFjdElkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLklGaWxlRG93bmxvYWQ+OworICAgICAgICB1cGxvYWRJbnN0YW5jZUVudkZpbGUoY29tcG9uZW50SWQ6c3RyaW5nLCBpbnN0YW5jZUlkOnN0cmluZywgYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgZG93bmxvYWRJbnN0YW5jZUFydGlmYWN0KGNvbXBvbmVudElkOnN0cmluZywgaW5zdGFuY2VJZDpzdHJpbmcsIGFydGlmYWN0SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSUZpbGVEb3dubG9hZD47CisgICAgICAgIGRlbGV0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudElkOnN0cmluZywgY29tcG9uZW50SW5zdGFuY2VJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPjsKKyAgICAgICAgY3JlYXRlUmVsYXRpb24oY29tcG9uZW50SWQ6c3RyaW5nLCBsaW5rOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsPjsKKyAgICAgICAgZGVsZXRlUmVsYXRpb24oY29tcG9uZW50SWQ6c3RyaW5nLCBsaW5rOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsPjsKKyAgICAgICAgZ2V0UmVxdWlyZW1lbnRzQ2FwYWJpbGl0aWVzKGNvbXBvbmVudElkOnN0cmluZyk6bmcuSVByb21pc2U8YW55PjsKKyAgICAgICAgdXBkYXRlSW5zdGFuY2VQcm9wZXJ0eShjb21wb25lbnRJZDpzdHJpbmcsIHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuUHJvcGVydHlNb2RlbD47CisgICAgICAgIHVwZGF0ZUluc3RhbmNlQXR0cmlidXRlKGNvbXBvbmVudElkOnN0cmluZywgYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZU1vZGVsPjsKKyAgICAgICAgZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeUlucHV0c0FuZFByb3BlcnRpZXMoY29tcG9uZW50SWQ6c3RyaW5nLCBzZWFyY2hUZXh0OnN0cmluZyk6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+PgorICAgICAgICBnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0cyhjb21wb25lbnRJZDpzdHJpbmcsIGluc3RhbmNlSWQ6c3RyaW5nLCBvcmlnaW5Db21wb25lbnRVaWQpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPj47CisgICAgICAgIGdldENvbXBvbmVudElucHV0cyhjb21wb25lbnRJZDpzdHJpbmcpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPj47CisgICAgICAgIGdldENvbXBvbmVudEluc3RhbmNlSW5wdXRQcm9wZXJ0aWVzKGNvbXBvbmVudElkOnN0cmluZywgaW5zdGFuY2VJZDpzdHJpbmcsIGlucHV0SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuUHJvcGVydHlNb2RlbD4+OworICAgICAgICBnZXRNb2R1bGVGb3JEaXNwbGF5KGNvbXBvbmVudElkOnN0cmluZywgbW9kdWxlSWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuRGlzcGxheU1vZHVsZT47CisgICAgICAgIHVwZGF0ZUdyb3VwTWV0YWRhdGEoY29tcG9uZW50SWQ6c3RyaW5nLCBncm91cDpNb2RlbHMuTW9kdWxlKTpuZy5JUHJvbWlzZTxNb2RlbHMuTW9kdWxlPjsKKyAgICAgICAgZ2V0Q29tcG9uZW50SW5wdXRJbnB1dHMoc2VydmljZUlkOnN0cmluZywgaW5wdXQ6c3RyaW5nKTogbmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+PjsKKyAgICAgICAgY3JlYXRlSW5wdXRzRnJvbUluc3RhbmNlc0lucHV0cyhzZXJ2aWNlSWQ6c3RyaW5nLCBpbnN0YW5jZXNJbnB1dHNNYXA6TW9kZWxzLkluc3RhbmNlc0lucHV0c01hcCk6IG5nLklQcm9taXNlPEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPj47CisgICAgICAgIGNyZWF0ZUlucHV0c0Zyb21JbnN0YW5jZXNJbnB1dHNQcm9wZXJ0aWVzKHJlc291cmNlSWQ6c3RyaW5nLCBpbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXA6TW9kZWxzLkluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcCk6IG5nLklQcm9taXNlPEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPj47CisgICAgICAgIGRlbGV0ZUNvbXBvbmVudElucHV0KHNlcnZpY2VJZDpzdHJpbmcsIGlucHV0SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSW5wdXRNb2RlbD47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFNlcnZpY2UgaW1wbGVtZW50cyBJQ29tcG9uZW50U2VydmljZSB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckbG9nJywKKyAgICAgICAgICAgICdSZXN0YW5ndWxhcicsCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuU2hhcmluZ1NlcnZpY2UnLAorICAgICAgICAgICAgJyRxJywKKyAgICAgICAgICAgICckaW50ZXJ2YWwnLAorICAgICAgICAgICAgJyRiYXNlNjQnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEluc3RhbmNlRmFjdG9yeScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgJGxvZzogbmcuSUxvZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZXN0YW5ndWxhcjpyZXN0YW5ndWxhci5JRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzaGFyaW5nU2VydmljZTpTZGMuU2VydmljZXMuU2hhcmluZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCAkcTpuZy5JUVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCAkaW50ZXJ2YWw6YW55LAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgJGJhc2U2NDphbnksCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBDb21wb25lbnRJbnN0YW5jZUZhY3Rvcnk6VXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5KSB7CisKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIuc2V0QmFzZVVybChzZGNDb25maWcuYXBpLnJvb3QgKyBzZGNDb25maWcuYXBpLmNvbXBvbmVudF9hcGlfcm9vdCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLnNldFJlcXVlc3RJbnRlcmNlcHRvcihmdW5jdGlvbiAoZWxlbSwgb3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gInJlbW92ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbGVtOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAvLyAgICB0aGlzLnJlc3Rhbmd1bGFyLnNldERlZmF1bHRIZWFkZXJzKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgnfSk7CisgICAgICAgIH0KKworICAgICAgICAvL3RoaXMgZnVuY3Rpb24gaXMgb3ZlcnJpZGUgYnkgZWFjaCBzZXJ2aWNlLCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGlzIG1ldGhvZCB0byBhYnN0cmFjdCB3aGVuIHVwZHRhaW5nIHR5cGVzY3JpcHQgdmVyc2lvbgorICAgICAgICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50T2JqZWN0ID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9PiB7CisgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnQgPSAoaWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGlkKS5nZXQoKS50aGVuKChyZXNwb25zZTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50T2JqZWN0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAvL3RoaXMuJGxvZy5kZWJ1ZygiQ29tcG9uZW50IExvYWRlZCBzdWNjZXNzZnVsbHkgOiAiLCBjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0sIChlcnIpPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IHdpdGggSUQ6ICIgKyBpZCk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVDb21wb25lbnQgPSAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHJlc291cmNlCisgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2RjLk1vZGVscy5Db21wb25lbnRzLlJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgbGV0IHJlc291cmNlOlNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSA9IDxTZGMuTW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+Y29tcG9uZW50OworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5pbXBvcnRlZEZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHJlc291cmNlIHdpdGggcGF5bG9hZCBkYXRhLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSZXNvdXJjZVdpdGhQYXlsb2FkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmNzYXJVVUlEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcmVzb3VyY2Ugd2l0aG91dCBwYXlsb2FkIGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSZXNvdXJjZShjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHJlc291cmNlIHdpdGhvdXQgcGF5bG9hZCBkYXRhIChtZXRhZGF0YSkuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSZXNvdXJjZU1ldGFkYXRhKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNlcnZpY2UoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHVwZGF0ZVNlcnZpY2UgPSAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnQudW5pcXVlSWQpLm9uZSgibWV0YWRhdGEiKS5jdXN0b21QVVQoSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50KSkudGhlbigocmVzcG9uc2U6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudE9iamVjdChyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShjb21wb25lbnQpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdXBkYXRlUmVzb3VyY2UgPSAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnQudW5pcXVlSWQpLmN1c3RvbVBVVChKU09OLnN0cmluZ2lmeShjb21wb25lbnQpKS50aGVuKChyZXNwb25zZTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50T2JqZWN0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGNvbXBvbmVudCk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSB1cGRhdGVSZXNvdXJjZU1ldGFkYXRhID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50LnVuaXF1ZUlkKS5vbmUoJ21ldGFkYXRhJykuY3VzdG9tUFVUKEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudCkpLnRoZW4oKHJlc3BvbnNlOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRPYmplY3QocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0sIChlcnIpPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25seSByZXNvdXJjZSBjYW4gYmUgdXBkYXRlZCB3aXRoIHBheWxvYWQgZGF0YQorICAgICAgICAgKiBAcGFyYW0gY29tcG9uZW50CisgICAgICAgICAqIEByZXR1cm5zIHtJUHJvbWlzZTxUPn0KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdXBkYXRlUmVzb3VyY2VXaXRoUGF5bG9hZCA9IChyZXNvdXJjZTpTZGMuTW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2UpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworCisgICAgICAgICAgICByZXNvdXJjZS5wYXlsb2FkRGF0YSA9IHJlc291cmNlLmltcG9ydGVkRmlsZS5iYXNlNjQ7CisgICAgICAgICAgICByZXNvdXJjZS5wYXlsb2FkTmFtZSA9IHJlc291cmNlLmltcG9ydGVkRmlsZS5maWxlbmFtZTsKKyAgICAgICAgICAgIGxldCBoZWFkZXJPYmogPSB0aGlzLmdldEhlYWRlck1kNShyZXNvdXJjZSk7CisKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKHJlc291cmNlLnVuaXF1ZUlkKS5jdXN0b21QVVQoSlNPTi5zdHJpbmdpZnkocmVzb3VyY2UpLCAnJywge30sIGhlYWRlck9iaikudGhlbigocmVzcG9uc2U6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudFJlc3VsdDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudE9iamVjdChyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShjb21wb25lbnRSZXN1bHQpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudCA9IChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBoZWFkZXJPYmogPSB0aGlzLmdldEhlYWRlck1kNShjb21wb25lbnQpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5jdXN0b21QT1NUKEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudCksICcnLCB7fSwgaGVhZGVyT2JqKS50aGVuKChyZXNwb25zZTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50T2JqZWN0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGNvbXBvbmVudCk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHZhbGlkYXRlTmFtZSA9IChuZXdOYW1lOnN0cmluZywgc3VidHlwZT86c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSVZhbGlkYXRlPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZSgidmFsaWRhdGUtbmFtZSIpLm9uZShuZXdOYW1lKS5nZXQoeydzdWJ0eXBlJzogc3VidHlwZX0pLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UucGxhaW4oKSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNoYW5nZUxpZmVjeWNsZVN0YXRlID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQsIHN0YXRlOnN0cmluZywgdXNlclJlbWFya3M6YW55KTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudC51bmlxdWVJZCkub25lKHN0YXRlKS5jdXN0b21QT1NUKHVzZXJSZW1hcmtzKS50aGVuKChyZXNwb25zZTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnNoYXJpbmdTZXJ2aWNlLmFkZFV1aWRWYWx1ZShyZXNwb25zZS51bmlxdWVJZCwgcmVzcG9uc2UudXVpZCk7CisgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudE9iamVjdChyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShjb21wb25lbnQpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBcnRpZmFjdHMgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKyAgICAgICAgcHVibGljIGFkZE9yVXBkYXRlQXJ0aWZhY3QgPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6bmcuSVByb21pc2U8TW9kZWxzLkFydGlmYWN0TW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBoZWFkZXJPYmogPSB7fTsKKyAgICAgICAgICAgIGlmIChhcnRpZmFjdC5wYXlsb2FkRGF0YSkgeworICAgICAgICAgICAgICAgIGhlYWRlck9iaiA9IHRoaXMuZ2V0SGVhZGVyTWQ1KGFydGlmYWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoImFydGlmYWN0cyIpLmN1c3RvbVBPU1QoSlNPTi5zdHJpbmdpZnkoYXJ0aWZhY3QpLCBhcnRpZmFjdC51bmlxdWVJZCwge30sIGhlYWRlck9iaikudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZS5wbGFpbigpKTsKKyAgICAgICAgICAgIH0sIChlcnIpPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZG93bmxvYWRBcnRpZmFjdCA9IChjb21wb25lbnRJZDpzdHJpbmcsIGFydGlmYWN0SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSUZpbGVEb3dubG9hZD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgiYXJ0aWZhY3RzIikub25lKGFydGlmYWN0SWQpLmdldCgpLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UucGxhaW4oKSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGRlbGV0ZUFydGlmYWN0ID0gKGNvbXBvbmVudElkOnN0cmluZywgYXJ0aWZhY3RJZDpzdHJpbmcsIGFydGlmYWN0TGFiZWw6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuQXJ0aWZhY3RNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgiYXJ0aWZhY3RzIikub25lKGFydGlmYWN0SWQpLnJlbW92ZSh7J29wZXJhdGlvbic6IGFydGlmYWN0TGFiZWx9KS50aGVuKChyZXNwb25zZTpNb2RlbHMuQXJ0aWZhY3RNb2RlbCkgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKyAgICAgICAgcHVibGljIGFkZFByb3BlcnR5ID0gKGNvbXBvbmVudElkOnN0cmluZywgcHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJwcm9wZXJ0aWVzIikuY3VzdG9tUE9TVChwcm9wZXJ0eS5jb252ZXJ0VG9TZXJ2ZXJPYmplY3QoKSkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsID0gbmV3IE1vZGVscy5Qcm9wZXJ0eU1vZGVsKHJlc3BvbnNlW09iamVjdC5rZXlzKHJlc3BvbnNlKVswXV0pOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocHJvcGVydHkpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVQcm9wZXJ0eSA9IChjb21wb25lbnRJZDpzdHJpbmcsIHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuUHJvcGVydHlNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgicHJvcGVydGllcyIpLm9uZShwcm9wZXJ0eS51bmlxdWVJZCkuY3VzdG9tUFVUKHByb3BlcnR5LmNvbnZlcnRUb1NlcnZlck9iamVjdCgpKS50aGVuKChyZXNwb25zZTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwgPSBuZXcgTW9kZWxzLlByb3BlcnR5TW9kZWwocmVzcG9uc2VbT2JqZWN0LmtleXMocmVzcG9uc2UpWzBdXSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwcm9wZXJ0eSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGRlbGV0ZVByb3BlcnR5ID0gKGNvbXBvbmVudElkOnN0cmluZywgcHJvcGVydHlJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJwcm9wZXJ0aWVzIikub25lKHByb3BlcnR5SWQpLnJlbW92ZSgpLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisgICAgICAgIHB1YmxpYyBhZGRBdHRyaWJ1dGUgPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBhdHRyaWJ1dGU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlTW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoImF0dHJpYnV0ZXMiKS5jdXN0b21QT1NUKGF0dHJpYnV0ZS5jb252ZXJ0VG9TZXJ2ZXJPYmplY3QoKSkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwgPSBuZXcgTW9kZWxzLkF0dHJpYnV0ZU1vZGVsKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZUF0dHJpYnV0ZSA9IChjb21wb25lbnRJZDpzdHJpbmcsIGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgiYXR0cmlidXRlcyIpLm9uZShhdHRyaWJ1dGUudW5pcXVlSWQpLmN1c3RvbVBVVChhdHRyaWJ1dGUuY29udmVydFRvU2VydmVyT2JqZWN0KCkpLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsID0gbmV3IE1vZGVscy5BdHRyaWJ1dGVNb2RlbChyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShhdHRyaWJ1dGUpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBkZWxldGVBdHRyaWJ1dGUgPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBhdHRyaWJ1dGVJZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgiYXR0cmlidXRlcyIpLm9uZShhdHRyaWJ1dGVJZCkucmVtb3ZlKCkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbXBvbmVudCBJbnN0YW5jZXMgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworICAgICAgICBwdWJsaWMgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UgPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoInJlc291cmNlSW5zdGFuY2UiKS5jdXN0b21QT1NUKEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudEluc3RhbmNlKSkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlID0gVXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkNvbXBvbmVudCBJbnN0YW5jZSBjcmVhdGVkIiwgY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJGYWlsZWQgdG8gY3JlYXRlIGNvbXBvbmVudEluc3RhbmNlLiBXaXRoIE5hbWU6ICIgKyBjb21wb25lbnRJbnN0YW5jZS5uYW1lKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlID0gKGNvbXBvbmVudElkOnN0cmluZywgY29tcG9uZW50SW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJyZXNvdXJjZUluc3RhbmNlIikub25lKGNvbXBvbmVudEluc3RhbmNlLnVuaXF1ZUlkKS5jdXN0b21QT1NUKEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudEluc3RhbmNlKSkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlID0gVXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkNvbXBvbmVudCBJbnN0YW5jZSB3YXMgdXBkYXRlZCIsIGNvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGNvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgIH0sIChlcnIpPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiRmFpbGVkIHRvIHVwZGF0ZSBjb21wb25lbnRJbnN0YW5jZS4gV2l0aCBJRDogIiArIGNvbXBvbmVudEluc3RhbmNlLnVuaXF1ZUlkICsgIk5hbWU6ICIgKyBjb21wb25lbnRJbnN0YW5jZS5uYW1lKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZU11bHRpcGxlQ29tcG9uZW50SW5zdGFuY2VzID0gKGNvbXBvbmVudElkOnN0cmluZywgaW5zdGFuY2VzOkFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPik6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJyZXNvdXJjZUluc3RhbmNlL211bHRpcGxlQ29tcG9uZW50SW5zdGFuY2UiKS5jdXN0b21QT1NUKEpTT04uc3RyaW5naWZ5KGluc3RhbmNlcykpLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiTXVsdGlwbGUgQ29tcG9uZW50IEluc3RhbmNlcyB3YXMgdXBkYXRlZCIsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBsZXQgdXBkYXRlSW5zdGFuY2VzOkFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPiA9IG5ldyBBcnJheTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4oKTsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2gocmVzcG9uc2UsIChjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZENvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlID0gVXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW5zdGFuY2VzLnB1c2godXBkYXRlZENvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHVwZGF0ZUluc3RhbmNlcyk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgTXVsdGlwbGUgY29tcG9uZW50SW5zdGFuY2UuIik7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBkZWxldGVDb21wb25lbnRJbnN0YW5jZSA9IChjb21wb25lbnRJZDpzdHJpbmcsIGNvbXBvbmVudEluc3RhbmNlSWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgicmVzb3VyY2VJbnN0YW5jZSIpLm9uZShjb21wb25lbnRJbnN0YW5jZUlkKS5yZW1vdmUoKS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkNvbXBvbmVudCBJbnN0YW5jZSB3YXMgZGVsZXRlZCIpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTsKKyAgICAgICAgICAgIH0sIChlcnIpPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGRlbGV0ZSBjb21wb25lbnRJbnN0YW5jZS4gV2l0aCBJRDogIiArIGNvbXBvbmVudEluc3RhbmNlSWQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgY2hhbmdlUmVzb3VyY2VJbnN0YW5jZVZlcnNpb24gPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBjb21wb25lbnRJbnN0YW5jZUlkOnN0cmluZywgY29tcG9uZW50VWlkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoInJlc291cmNlSW5zdGFuY2UiKS5vbmUoY29tcG9uZW50SW5zdGFuY2VJZCkub25lKCJjaGFuZ2VWZXJzaW9uIikuY3VzdG9tUE9TVCh7J2NvbXBvbmVudFVpZCc6IGNvbXBvbmVudFVpZH0pLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSA9IFV0aWxzLkNvbXBvbmVudEluc3RhbmNlRmFjdG9yeS5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShjb21wb25lbnRJbnN0YW5jZSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGRvd25sb2FkSW5zdGFuY2VBcnRpZmFjdCA9IChjb21wb25lbnRJZDpzdHJpbmcsIGluc3RhbmNlSWQ6c3RyaW5nLCBhcnRpZmFjdElkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLklGaWxlRG93bmxvYWQ+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoInJlc291cmNlSW5zdGFuY2VzIikub25lKGluc3RhbmNlSWQpLm9uZSgiYXJ0aWZhY3RzIikub25lKGFydGlmYWN0SWQpLmdldCgpLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UucGxhaW4oKSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHVwZGF0ZUluc3RhbmNlQXJ0aWZhY3QgPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBpbnN0YW5jZUlkOnN0cmluZywgYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgaGVhZGVyT2JqID0ge307CisgICAgICAgICAgICBpZihhcnRpZmFjdC5wYXlsb2FkRGF0YSl7CisgICAgICAgICAgICAgICAgaGVhZGVyT2JqID0gdGhpcy5nZXRIZWFkZXJNZDUoYXJ0aWZhY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgicmVzb3VyY2VJbnN0YW5jZSIpLm9uZShpbnN0YW5jZUlkKS5vbmUoImFydGlmYWN0cyIpLmN1c3RvbVBPU1QoSlNPTi5zdHJpbmdpZnkoYXJ0aWZhY3QpLCBhcnRpZmFjdC51bmlxdWVJZCAsIHt9LCBoZWFkZXJPYmopLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbmV3QXJ0aWZhY3QgPSBuZXcgTW9kZWxzLkFydGlmYWN0TW9kZWwocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobmV3QXJ0aWZhY3QpOworICAgICAgICAgICAgfSwgKGVycik9PnsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGFkZEluc3RhbmNlQXJ0aWZhY3QgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgaW5zdGFuY2VJZDogc3RyaW5nLCBhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6IG5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgaGVhZGVyT2JqID0ge307CisgICAgICAgICAgICBpZihhcnRpZmFjdC5wYXlsb2FkRGF0YSl7CisgICAgICAgICAgICAgICAgaGVhZGVyT2JqID0gdGhpcy5nZXRIZWFkZXJNZDUoYXJ0aWZhY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgicmVzb3VyY2VJbnN0YW5jZSIpLm9uZShpbnN0YW5jZUlkKS5vbmUoImFydGlmYWN0cyIpLmN1c3RvbVBPU1QoSlNPTi5zdHJpbmdpZnkoYXJ0aWZhY3QpLCBhcnRpZmFjdC51bmlxdWVJZCAsIHt9LCBoZWFkZXJPYmopLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwgPSBuZXcgTW9kZWxzLkFydGlmYWN0TW9kZWwocmVzcG9uc2UucGxhaW4oKSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShhcnRpZmFjdCk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGRlbGV0ZUluc3RhbmNlQXJ0aWZhY3QgPSAoY29tcG9uZW50SWQ6IHN0cmluZyAsIGluc3RhbmNlSWQ6IHN0cmluZywgYXJ0aWZhY3RJZDpzdHJpbmcsIGFydGlmYWN0TGFiZWw6IHN0cmluZyk6IG5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJyZXNvdXJjZUluc3RhbmNlIikub25lKGluc3RhbmNlSWQpLm9uZSgiYXJ0aWZhY3RzIikub25lKGFydGlmYWN0SWQpLnJlbW92ZSh7J29wZXJhdGlvbic6IGFydGlmYWN0TGFiZWx9KS50aGVuKChyZXNwb25zZTogTW9kZWxzLkFydGlmYWN0TW9kZWwpID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0sIChlcnIpPT57CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGxvYWRJbnN0YW5jZUVudkZpbGUgPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBpbnN0YW5jZUlkOnN0cmluZywgYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BcnRpZmFjdE1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgaGVhZGVyT2JqID0ge307CisgICAgICAgICAgICBpZiAoYXJ0aWZhY3QucGF5bG9hZERhdGEpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJPYmogPSB0aGlzLmdldEhlYWRlck1kNShhcnRpZmFjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJyZXNvdXJjZUluc3RhbmNlIikub25lKGluc3RhbmNlSWQpLm9uZSgiYXJ0aWZhY3RzIikuY3VzdG9tUE9TVChKU09OLnN0cmluZ2lmeShhcnRpZmFjdCksIGFydGlmYWN0LnVuaXF1ZUlkLCB7fSwgaGVhZGVyT2JqKS50aGVuKChyZXNwb25zZTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbmV3QXJ0aWZhY3QgPSBuZXcgTW9kZWxzLkFydGlmYWN0TW9kZWwocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobmV3QXJ0aWZhY3QpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVJbnN0YW5jZVByb3BlcnR5ID0gKGNvbXBvbmVudElkOnN0cmluZywgcHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgaW5zdGFuY2VJZCA9IHByb3BlcnR5LnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZDsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoInJlc291cmNlSW5zdGFuY2UiKS5vbmUoaW5zdGFuY2VJZCkub25lKCJwcm9wZXJ0eSIpLmN1c3RvbVBPU1QoSlNPTi5zdHJpbmdpZnkocHJvcGVydHkpKS50aGVuKChyZXNwb25zZTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydHkgPSBuZXcgTW9kZWxzLlByb3BlcnR5TW9kZWwocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5LnJlYWRvbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eS5yZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQgPSBpbnN0YW5jZUlkOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobmV3UHJvcGVydHkpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVJbnN0YW5jZUF0dHJpYnV0ZSA9IChjb21wb25lbnRJZDpzdHJpbmcsIGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IGluc3RhbmNlSWQgPSBhdHRyaWJ1dGUucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgicmVzb3VyY2VJbnN0YW5jZSIpLm9uZShpbnN0YW5jZUlkKS5vbmUoImF0dHJpYnV0ZSIpLmN1c3RvbVBPU1QoSlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlKSkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5ld0F0dHJpYnV0ZSA9IG5ldyBNb2RlbHMuQXR0cmlidXRlTW9kZWwocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIG5ld0F0dHJpYnV0ZS5yZWFkb25seSA9IHRydWU7CisgICAgICAgICAgICAgICAgbmV3QXR0cmlidXRlLnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCA9IGluc3RhbmNlSWQ7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShuZXdBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjcmVhdGVSZWxhdGlvbiA9IChjb21wb25lbnRJZDpzdHJpbmcsIGxpbms6TW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKTpuZy5JUHJvbWlzZTxNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWw+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoInJlc291cmNlSW5zdGFuY2UiKS5vbmUoImFzc29jaWF0ZSIpLmN1c3RvbVBPU1QoSlNPTi5zdHJpbmdpZnkobGluaykpLnRoZW4oKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgIGxldCByZWxhdGlvbjpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwgPSBuZXcgTW9kZWxzLlJlbGF0aW9uc2hpcE1vZGVsKHJlc3BvbnNlLnBsYWluKCkpOworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiTGluayBjcmVhdGVkIHN1Y2Nlc3NmdWxseSAiLCByZWxhdGlvbik7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZWxhdGlvbik7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkZhaWxlZCB0byBjcmVhdGUgTGluayBGcm9tOiAiICsgbGluay5mcm9tTm9kZSArICJUbzogIiArIGxpbmsudG9Ob2RlKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGRlbGV0ZVJlbGF0aW9uID0gKGNvbXBvbmVudElkOnN0cmluZywgbGluazpNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwpOm5nLklQcm9taXNlPE1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgicmVzb3VyY2VJbnN0YW5jZSIpLm9uZSgiZGlzc29jaWF0ZSIpLmN1c3RvbVBVVChKU09OLnN0cmluZ2lmeShsaW5rKSkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHJlbGF0aW9uOk1vZGVscy5SZWxhdGlvbnNoaXBNb2RlbCA9IG5ldyBNb2RlbHMuUmVsYXRpb25zaGlwTW9kZWwocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiTGluayBkZWxldGVkIHN1Y2Nlc3NmdWxseSAiLCByZWxhdGlvbik7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZWxhdGlvbik7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkZhaWxlZCB0byBkZWxldGUgTGluayBGcm9tOiAiICsgbGluay5mcm9tTm9kZSArICJUbzogIiArIGxpbmsudG9Ob2RlKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldFJlcXVpcmVtZW50c0NhcGFiaWxpdGllcyA9IChjb21wb25lbnRJZDpzdHJpbmcpOm5nLklQcm9taXNlPGFueT4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgicmVxdWlybWVudHNDYXBhYmlsaXRpZXMiKS5nZXQoKS50aGVuKChyZXNwb25zZTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkNvbXBvbmVudCByZXF1aXJlbWVudCBjYXBhYmlsaXRpZXMgcmVjaXZlZDogIiwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHJlcXVpcmVtZW50cyAmIGNhcGFiaWxpdGllcyIpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZ2V0TW9kdWxlRm9yRGlzcGxheSA9IChjb21wb25lbnRJZDpzdHJpbmcsIG1vZHVsZUlkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLkRpc3BsYXlNb2R1bGU+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoImdyb3VwcyIpLm9uZShtb2R1bGVJZCkuZ2V0KCkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJtb2R1bGUgbG9hZGVkIHN1Y2Nlc3NmdWxseTogIiwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGxldCBtb2R1bGU6TW9kZWxzLkRpc3BsYXlNb2R1bGUgPSBuZXcgTW9kZWxzLkRpc3BsYXlNb2R1bGUocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobW9kdWxlKTsKKyAgICAgICAgICAgIH0sIChlcnIpPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBtb2R1bGUgd2l0aCBpZDogIiwgbW9kdWxlSWQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeUlucHV0c0FuZFByb3BlcnRpZXMgPSAoY29tcG9uZW50SWQ6c3RyaW5nLCBzZWFyY2hUZXh0PzpzdHJpbmcpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPj4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgiY29tcG9uZW50SW5zdGFuY2VzIikuZ2V0KHsnc2VhcmNoVGV4dCc6IHNlYXJjaFRleHR9KS50aGVuKChyZXNwb25zZTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoImNvbXBvbmVudCBpbnN0YW5jZXMgcmV0dXJuIHN1Y2Nlc3NmdWxseTogIiwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRJbnN0YW5jZXM6QXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U+ID0gVXRpbHMuQ29tbW9uVXRpbHMuaW5pdENvbXBvbmVudEluc3RhbmNlcyhyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShjb21wb25lbnRJbnN0YW5jZXMpOworICAgICAgICAgICAgfSwgKGVycikgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBjb21wb25lbnQgaW5zdGFuY2VzIG9mIGNvbXBvbmVudCB3aXRoIGlkOiAiICsgY29tcG9uZW50SWQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0cyA9IChjb21wb25lbnRJZDpzdHJpbmcsIGluc3RhbmNlSWQ6c3RyaW5nLCBvcmlnaW5Db21wb25lbnRVaWQpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPj4gPT4geworCisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJjb21wb25lbnRJbnN0YW5jZXMiKS5vbmUoaW5zdGFuY2VJZCkub25lKG9yaWdpbkNvbXBvbmVudFVpZCkub25lKCJpbnB1dHMiKS5nZXQoKS50aGVuKChyZXNwb25zZTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoImNvbXBvbmVudCBpbnN0YW5jZSBpbnB1dCByZXR1cm4gc3VjY2Vzc2Z1bGx5OiAiLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgbGV0IGlucHV0c0FycmF5OkFycmF5PE1vZGVscy5JbnB1dE1vZGVsPiA9IG5ldyBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4oKTsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2gocmVzcG9uc2UsIChpbnB1dE9iajpNb2RlbHMuSW5wdXRNb2RlbCkgPT4geworICAgICAgICAgICAgICAgICAgICBpbnB1dHNBcnJheS5wdXNoKG5ldyBNb2RlbHMuSW5wdXRNb2RlbChpbnB1dE9iaikpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoaW5wdXRzQXJyYXkpOworICAgICAgICAgICAgfSwgKGVycikgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBjb21wb25lbnQgaW5zdGFuY2UgaW5wdXQgd2l0aCBpZDogIiArIGluc3RhbmNlSWQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRJbnB1dHMgPSAoY29tcG9uZW50SWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4+ID0+IHsKKworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoY29tcG9uZW50SWQpLm9uZSgiaW5wdXRzIikuZ2V0KCkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJjb21wb25lbnQgaW5wdXRzIHJldHVybiBzdWNjZXNzZnVsbHk6ICIsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBsZXQgaW5wdXRzQXJyYXk6QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+ID0gbmV3IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPigpOworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXNwb25zZSwgKGlucHV0T2JqOk1vZGVscy5JbnB1dE1vZGVsKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0c0FycmF5LnB1c2gobmV3IE1vZGVscy5JbnB1dE1vZGVsKGlucHV0T2JqKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpbnB1dHNBcnJheSk7CisgICAgICAgICAgICB9LCAoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IGNvbXBvbmVudCBpbnB1dHMgZm9yIGNvbXBvbmVudCB3aXRoIGlkOiAiICsgY29tcG9uZW50SWQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRJbnN0YW5jZUlucHV0UHJvcGVydGllcyA9IChjb21wb25lbnRJZDpzdHJpbmcsIGluc3RhbmNlSWQ6c3RyaW5nLCBpbnB1dElkOnN0cmluZyk6bmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+PiA9PiB7CisKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKGNvbXBvbmVudElkKS5vbmUoImNvbXBvbmVudEluc3RhbmNlcyIpLm9uZShpbnN0YW5jZUlkKS5vbmUoaW5wdXRJZCkub25lKCJwcm9wZXJ0aWVzIikuZ2V0KCkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJjb21wb25lbnQgaW5zdGFuY2UgaW5wdXQgcHJvcGVydGllcyByZXR1cm4gc3VjY2Vzc2Z1bGx5OiAiLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXNBcnJheTpBcnJheTxNb2RlbHMuUHJvcGVydHlNb2RlbD4gPSBuZXcgQXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+KCk7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHJlc3BvbnNlLCAocHJvcGVydHlPYmo6TW9kZWxzLlByb3BlcnR5TW9kZWwpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc0FycmF5LnB1c2gobmV3IE1vZGVscy5Qcm9wZXJ0eU1vZGVsKHByb3BlcnR5T2JqKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwcm9wZXJ0aWVzQXJyYXkpOworICAgICAgICAgICAgfSwgKGVycikgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiRmFpbGVkIHRvIGdldCBjb21wb25lbnQgaW5zdGFuY2UgaW5wdXQgcHJvcGVydGllcyB3aXRoIGluc3RhbmNlSWQ6ICIgKyBpbnN0YW5jZUlkICsgImFuZCBpbnB1dCBpZDogIiArIGlucHV0SWQpOworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVHcm91cE1ldGFkYXRhID0gKGNvbXBvbmVudElkOnN0cmluZywgZ3JvdXA6TW9kZWxzLk1vZHVsZSk6bmcuSVByb21pc2U8TW9kZWxzLk1vZHVsZT4gPT4geworCisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZShjb21wb25lbnRJZCkub25lKCJncm91cHMiKS5vbmUoZ3JvdXAudW5pcXVlSWQpLm9uZSgibWV0YWRhdGEiKS5jdXN0b21QVVQoSlNPTi5zdHJpbmdpZnkoZ3JvdXApKS50aGVuKChyZXNwb25zZTpNb2RlbHMuTW9kdWxlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJncm91cCBtZXRhZGF0YSB1cGRhdGVkIHN1Y2Nlc3NmdWxseTogIiwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkR3JvdXA6TW9kZWxzLk1vZHVsZSA9IG5ldyBNb2RlbHMuTW9kdWxlKHJlc3BvbnNlKTsKKworICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodXBkYXRlZEdyb3VwKTsKKyAgICAgICAgICAgIH0sIChlcnIpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoIkZhaWxlZCB0byB1cGRhdGUgZ3JvdXAgbWV0YWRhdGEgZm9yIGNvbXBvbmVudDogIiArIGNvbXBvbmVudElkICsgIiBmb3IgZ3JvdXAgd2l0aCBpZDogIiArIGdyb3VwLnVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5wdXRJbnB1dHMgPSAoc2VydmljZUlkOnN0cmluZywgaW5wdXRJZDpzdHJpbmcpOiBuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4+ICA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPGFueT4oKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKHNlcnZpY2VJZCkub25lKCJpbnB1dHMiKS5vbmUoaW5wdXRJZCkub25lKCJpbnB1dHMiKS5nZXQoKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGlucHV0c0FycmF5OkFycmF5PE1vZGVscy5JbnB1dE1vZGVsPiA9IG5ldyBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4oKTsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2gocmVzcG9uc2UsIChpbnB1dE9iajpNb2RlbHMuSW5wdXRNb2RlbCkgPT4geworICAgICAgICAgICAgICAgICAgICBpbnB1dHNBcnJheS5wdXNoKG5ldyBNb2RlbHMuSW5wdXRNb2RlbChpbnB1dE9iaikpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGRlZmVyLnJlc29sdmUoaW5wdXRzQXJyYXkpOworICAgICAgICAgICAgfSwgKGVycik9PnsKKyAgICAgICAgICAgICAgICB0aGlzLiRsb2cuZGVidWcoImZhaWxlZCB0byBnZXQgaW5wdXRzIG9mIGlucHV0IDogIiwgZXJyKTsKKyAgICAgICAgICAgICAgICBkZWZlci5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgY3JlYXRlSW5wdXRzRnJvbUluc3RhbmNlc0lucHV0c1Byb3BlcnRpZXMgPSAocmVzb3VyY2VJZDpzdHJpbmcsIGluc3RhbmNlUHJvcGVydHlNYXA6TW9kZWxzLkluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcCk6IG5nLklQcm9taXNlPEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPj4gID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlciA9IHRoaXMuJHEuZGVmZXI8YW55PigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUocmVzb3VyY2VJZCkub25lKCJjcmVhdGUvcHJvcGVydGllcyIpLmN1c3RvbVBPU1QoaW5zdGFuY2VQcm9wZXJ0eU1hcCkudGhlbigocmVzcG9uc2U6IGFueSkgPT4geworICAgICAgICAgICAgICAgIGxldCBpbnB1dHNBcnJheTpBcnJheTxNb2RlbHMuUHJvcGVydHlNb2RlbD4gPSBuZXcgQXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+KCk7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHJlc3BvbnNlLCAoaW5wdXRPYmo6TW9kZWxzLlByb3BlcnR5TW9kZWwpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRzQXJyYXkucHVzaChuZXcgTW9kZWxzLlByb3BlcnR5TW9kZWwoaW5wdXRPYmopKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKGlucHV0c0FycmF5KTsKKyAgICAgICAgICAgIH0sIChlcnIpPT57CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJmYWlsZWQgdG8gY3JlYXRlIHNlcnZpY2UgaW5wdXRzIGZyb20gVkYgaW5zdGFuY2VzIGlucHV0cyA6ICIsIGVycik7CisgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIGNyZWF0ZUlucHV0c0Zyb21JbnN0YW5jZXNJbnB1dHMgPSAoc2VydmljZUlkOnN0cmluZywgaW5zdGFuY2VzTWFwOk1vZGVscy5JbnN0YW5jZXNJbnB1dHNNYXApOiBuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4+ICA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPGFueT4oKTsKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIub25lKHNlcnZpY2VJZCkub25lKCJjcmVhdGUvaW5wdXRzIikuY3VzdG9tUE9TVChpbnN0YW5jZXNNYXApLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgaW5wdXRzQXJyYXk6QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+ID0gbmV3IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPigpOworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXNwb25zZSwgKGlucHV0T2JqOk1vZGVscy5JbnB1dE1vZGVsKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0c0FycmF5LnB1c2gobmV3IE1vZGVscy5JbnB1dE1vZGVsKGlucHV0T2JqKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2ZShpbnB1dHNBcnJheSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+eworICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSBzZXJ2aWNlIGlucHV0cyBmcm9tIFZGIGluc3RhbmNlcyBpbnB1dHMgOiAiLCBlcnIpOworICAgICAgICAgICAgICAgIGRlZmVyLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXIucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBkZWxldGVDb21wb25lbnRJbnB1dCA9IChzZXJ2aWNlSWQ6c3RyaW5nLCBpbnB1dElkOnN0cmluZykgOiBuZy5JUHJvbWlzZTxNb2RlbHMuSW5wdXRNb2RlbD4gPT4geworICAgICAgICAgICAgdmFyIGRlZmVyID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoc2VydmljZUlkKS5vbmUoImRlbGV0ZSIpLm9uZShpbnB1dElkKS5vbmUoImlucHV0IikucmVtb3ZlKCkudGhlbigocmVzcG9uc2U6IGFueSkgPT4geworICAgICAgICAgICAgICAgIHZhciBpbnB1dFRvRGVsZXRlID0gbmV3IE1vZGVscy5JbnB1dE1vZGVsKHJlc3BvbnNlKTsKKworICAgICAgICAgICAgICAgIGRlZmVyLnJlc29sdmUoaW5wdXRUb0RlbGV0ZSk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiZmFpbGVkIHRvIGRlbGV0ZSBpbnB1dCBmcm9tIHNlcnZpY2U6ICIsIGVycik7CisgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZ2V0SGVhZGVyTWQ1ID0gKG9iamVjdDphbnkpOmFueSA9PiB7CisgICAgICAgICAgICBsZXQgaGVhZGVyT2JqPXt9OworICAgICAgICAgICAgLy8gVGhpcyBpcyB1Z2x5IHdvcmthcm91bmQhISEKKyAgICAgICAgICAgIC8vIFRoZSBtZDUgcmVzdWx0IGlzIG5vdCBjb3JyZWN0IGlmIHdlIGRvIG5vdCBhZGQgdGhlIGxpbmUgSlNPTi5zdHJpbmdpZnkocmVzb3VyY2UpOyB0d2ljZS4KKyAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9iamVjdCk7CisgICAgICAgICAgICBsZXQgY29tcG9uZW50U3RyaW5nOnN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9iamVjdCk7CisgICAgICAgICAgICBsZXQgbWQ1UmVzdWx0ID0gbWQ1KGNvbXBvbmVudFN0cmluZykudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIGhlYWRlck9iaiA9IHsnQ29udGVudC1NRDUnOiB0aGlzLiRiYXNlNjQuZW5jb2RlKG1kNVJlc3VsdCl9OworICAgICAgICAgICAgcmV0dXJuIGhlYWRlck9iajsKKyAgICAgICAgfTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvY29tcG9uZW50cy9wcm9kdWN0LXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvcHJvZHVjdC1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTcxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvcHJvZHVjdC1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvOC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlNlcnZpY2VzLkNvbXBvbmVudHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVByb2R1Y3RTZXJ2aWNlIGV4dGVuZHMgSUNvbXBvbmVudFNlcnZpY2UgeworCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFByb2R1Y3RTZXJ2aWNlIGV4dGVuZHMgQ29tcG9uZW50U2VydmljZSBpbXBsZW1lbnRzIElQcm9kdWN0U2VydmljZSB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckbG9nJywKKyAgICAgICAgICAgICdSZXN0YW5ndWxhcicsCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuU2hhcmluZ1NlcnZpY2UnLAorICAgICAgICAgICAgJyRxJywKKyAgICAgICAgICAgICckaW50ZXJ2YWwnLAorICAgICAgICAgICAgJyRiYXNlNjQnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEluc3RhbmNlRmFjdG9yeScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgJGxvZzogbmcuSUxvZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZXN0YW5ndWxhcjogcmVzdGFuZ3VsYXIuSUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzZGNDb25maWc6IE1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHNoYXJpbmdTZXJ2aWNlOiBTZGMuU2VydmljZXMuU2hhcmluZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCAkcTogbmcuSVFTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgJGludGVydmFsOiBhbnksCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCAkYmFzZTY0OiBhbnksCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBDb21wb25lbnRJbnN0YW5jZUZhY3Rvcnk6IFV0aWxzLkNvbXBvbmVudEluc3RhbmNlRmFjdG9yeSkgeworICAgICAgICAgICAgc3VwZXIoJGxvZywgcmVzdGFuZ3VsYXIsIHNkY0NvbmZpZywgc2hhcmluZ1NlcnZpY2UsICRxLCAkaW50ZXJ2YWwsICRiYXNlNjQsIENvbXBvbmVudEluc3RhbmNlRmFjdG9yeSk7CisKKyAgICAgICAgICAgIHRoaXMucmVzdGFuZ3VsYXIgPSByZXN0YW5ndWxhci5vbmUoInByb2R1Y3RzIik7CisgICAgICAgIH0KKworICAgICAgICBjcmVhdGVDb21wb25lbnRPYmplY3QgPSAoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0KHRoaXMsIHRoaXMuJHEsIDxNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0PmNvbXBvbmVudCk7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb21wb25lbnRzL3Jlc291cmNlLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvcmVzb3VyY2Utc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc4MWRhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb21wb25lbnRzL3Jlc291cmNlLXNlcnZpY2UudHMKQEAgLTAsMCArMSw2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi80LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMuQ29tcG9uZW50cyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJUmVzb3VyY2VTZXJ2aWNlIGV4dGVuZHMgSUNvbXBvbmVudFNlcnZpY2UgeworCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFJlc291cmNlU2VydmljZSBleHRlbmRzIENvbXBvbmVudFNlcnZpY2UgaW1wbGVtZW50cyBJUmVzb3VyY2VTZXJ2aWNlIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRsb2cnLAorICAgICAgICAgICAgJ1Jlc3Rhbmd1bGFyJywKKyAgICAgICAgICAgICdzZGNDb25maWcnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZScsCisgICAgICAgICAgICAnJHEnLAorICAgICAgICAgICAgJyRpbnRlcnZhbCcsCisgICAgICAgICAgICAnJGJhc2U2NCcsCisgICAgICAgICAgICAnQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5JworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCAkbG9nOiBuZy5JTG9nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlc3Rhbmd1bGFyOiByZXN0YW5ndWxhci5JRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHNkY0NvbmZpZzogTW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc2hhcmluZ1NlcnZpY2U6IFNkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkICRxOiBuZy5JUVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCAkaW50ZXJ2YWw6IGFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkICRiYXNlNjQ6IGFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlRmFjdG9yeTogVXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5KSB7CisgICAgICAgICAgICBzdXBlcigkbG9nLCByZXN0YW5ndWxhciwgc2RjQ29uZmlnLCBzaGFyaW5nU2VydmljZSwgJHEsICRpbnRlcnZhbCwgJGJhc2U2NCwgQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5KTsKKworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhciA9IHJlc3Rhbmd1bGFyLm9uZSgicmVzb3VyY2VzIik7CisgICAgICAgIH0KKworICAgICAgICBjcmVhdGVDb21wb25lbnRPYmplY3QgPSAoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSh0aGlzLCB0aGlzLiRxLCA8TW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+Y29tcG9uZW50KTsKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvc2VydmljZS1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb21wb25lbnRzL3NlcnZpY2Utc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWYwYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb21wb25lbnRzL3NlcnZpY2Utc2VydmljZS50cwpAQCAtMCwwICsxLDk3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiAyLzQvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcy5Db21wb25lbnRzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVNlcnZpY2VTZXJ2aWNlIGV4dGVuZHMgSUNvbXBvbmVudFNlcnZpY2UgeworICAgICAgICBnZXREaXN0cmlidXRpb25zTGlzdCh1dWlkOiBzdHJpbmcpOiBuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuRGlzdHJpYnV0aW9uPj47CisgICAgICAgIGdldERpc3RyaWJ1dGlvbkNvbXBvbmVudHMoZGlzdHJpYnV0aW9uSWQ6IHN0cmluZyk6IG5nLklQcm9taXNlPEFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+PjsKKyAgICAgICAgbWFya0FzRGVwbG95ZWQoc2VydmljZUlkOiBzdHJpbmcsIGRpc3RyaWJ1dGlvbklkOiBzdHJpbmcpOiBuZy5JUHJvbWlzZTxhbnk+OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBTZXJ2aWNlU2VydmljZSBleHRlbmRzIENvbXBvbmVudFNlcnZpY2UgaW1wbGVtZW50cyBJU2VydmljZVNlcnZpY2UgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJGxvZycsCisgICAgICAgICAgICAnUmVzdGFuZ3VsYXInLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLlNoYXJpbmdTZXJ2aWNlJywKKyAgICAgICAgICAgICckcScsCisgICAgICAgICAgICAnJGludGVydmFsJywKKyAgICAgICAgICAgICckYmFzZTY0JywKKyAgICAgICAgICAgICdDb21wb25lbnRJbnN0YW5jZUZhY3RvcnknCisgICAgICAgIF07CisKKyAgICAgICAgcHVibGljIGRpc3RyaWJ1dGlvbjogc3RyaW5nID0gImRpc3RyaWJ1dGlvbiI7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJvdGVjdGVkICRsb2c6IG5nLklMb2dTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgcmVzdGFuZ3VsYXI6IHJlc3Rhbmd1bGFyLklFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc2RjQ29uZmlnOiBNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzaGFyaW5nU2VydmljZTogU2RjLlNlcnZpY2VzLlNoYXJpbmdTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgJHE6IG5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkICRpbnRlcnZhbDogYW55LAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgJGJhc2U2NDogYW55LAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5OiBVdGlscy5Db21wb25lbnRJbnN0YW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKCRsb2csIHJlc3Rhbmd1bGFyLCBzZGNDb25maWcsIHNoYXJpbmdTZXJ2aWNlLCAkcSwgJGludGVydmFsLCAkYmFzZTY0LCBDb21wb25lbnRJbnN0YW5jZUZhY3RvcnkpOworCisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyID0gcmVzdGFuZ3VsYXIub25lKCJzZXJ2aWNlcyIpOworICAgICAgICB9CisKKyAgICAgICAgZ2V0RGlzdHJpYnV0aW9uc0xpc3QgPSAodXVpZDogc3RyaW5nKTogbmcuSVByb21pc2U8QXJyYXk8TW9kZWxzLkRpc3RyaWJ1dGlvbj4+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlciA9IHRoaXMuJHEuZGVmZXI8QXJyYXk8TW9kZWxzLkRpc3RyaWJ1dGlvbj4+KCk7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZSh1dWlkKS5vbmUoImRpc3RyaWJ1dGlvbiIpLmdldCgpLnRoZW4oKGRpc3RyaWJ1dGlvbnM6IGFueSkgPT4geworICAgICAgICAgICAgICAgIGRlZmVyLnJlc29sdmUoPEFycmF5PE1vZGVscy5EaXN0cmlidXRpb24+PiBkaXN0cmlidXRpb25zLmRpc3RyaWJ1dGlvblN0YXR1c09mU2VydmljZUxpc3QpOworICAgICAgICAgICAgfSwgKGVycik9PiB7CisgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KGVycik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIGdldERpc3RyaWJ1dGlvbkNvbXBvbmVudHMgPSAoZGlzdHJpYnV0aW9uSWQ6IHN0cmluZyk6IG5nLklQcm9taXNlPEFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPEFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+PigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoImRpc3RyaWJ1dGlvbiIpLm9uZShkaXN0cmlidXRpb25JZCkuZ2V0KCkudGhlbigoZGlzdHJpYnV0aW9uczogYW55KSA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2ZSg8QXJyYXk8TW9kZWxzLkRpc3RyaWJ1dGlvbkNvbXBvbmVudD4+IGRpc3RyaWJ1dGlvbnMuZGlzdHJpYnV0aW9uU3RhdHVzTGlzdCk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKyAgICAgICAgICAgICAgICBkZWZlci5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgbWFya0FzRGVwbG95ZWQgPSAoc2VydmljZUlkOiBzdHJpbmcsIGRpc3RyaWJ1dGlvbklkOiBzdHJpbmcpOiBuZy5JUHJvbWlzZTxhbnk+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlciA9IHRoaXMuJHEuZGVmZXI8YW55PigpOworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUoc2VydmljZUlkKS5vbmUoImRpc3RyaWJ1dGlvbiIpLm9uZShkaXN0cmlidXRpb25JZCkub25lKCJtYXJrRGVwbG95ZWQiKS5jdXN0b21QT1NUKCkudGhlbigocmVzdWx0OiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKHJlc3VsdCk7CisgICAgICAgICAgICB9LCAoZXJyKT0+IHsKKworICAgICAgICAgICAgICAgIGRlZmVyLnJlamVjdChlcnIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXIucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBjcmVhdGVDb21wb25lbnRPYmplY3QgPSAoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlKHRoaXMsIHRoaXMuJHEsIDxNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlPmNvbXBvbmVudCk7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb21wb25lbnRzL3V0aWxzL2NvbXBvc2l0aW9uLWxlZnQtcGFsZXR0ZS1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb21wb25lbnRzL3V0aWxzL2NvbXBvc2l0aW9uLWxlZnQtcGFsZXR0ZS1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWMxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NvbXBvbmVudHMvdXRpbHMvY29tcG9zaXRpb24tbGVmdC1wYWxldHRlLXNlcnZpY2UudHMKQEAgLTAsMCArMSwyNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDMvMTMvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcy5Db21wb25lbnRzIHsKKworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBMZWZ0UGFuZWxMYXRlc3RWZXJzaW9uIHsKKyAgICAgICAgdWlkOiBzdHJpbmc7CisgICAgICAgIHZlcnNpb246IHN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgTGVmdFBhbGV0dGVEYXRhT2JqZWN0IHsKKyAgICAgICAgY3VycmVudFVwZGF0aW5nSWRzTGlzdDogQXJyYXk8c3RyaW5nPjsKKyAgICAgICAgbGF0ZXN0VmVyc2lvbkFuZElkc0xpc3Q6IEFycmF5PExlZnRQYW5lbExhdGVzdFZlcnNpb24+OworICAgICAgICBmdWxsRGF0YUxlZnRQYWxldHRlQ29tcG9uZW50czogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PjsKKyAgICAgICAgZGlzcGxheUxlZnRQYW5lbENvbXBvbmVudHM6IEFycmF5PE1vZGVscy5EaXNwbGF5Q29tcG9uZW50PjsKKyAgICAgICAgb25GaW5pc2hMb2FkaW5nRXZlbnQ6IHN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3RvcihvbkZpbmlzaEV2ZW50TGlzdGVuZXI6IHN0cmluZykgeworCisgICAgICAgICAgICB0aGlzLmZ1bGxEYXRhTGVmdFBhbGV0dGVDb21wb25lbnRzID0gbmV3IEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4oKTsKKyAgICAgICAgICAgIHRoaXMuZGlzcGxheUxlZnRQYW5lbENvbXBvbmVudHMgPSBuZXcgQXJyYXk8TW9kZWxzLkRpc3BsYXlDb21wb25lbnQ+KCk7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRVcGRhdGluZ0lkc0xpc3QgPSBuZXcgQXJyYXk8c3RyaW5nPigpOworICAgICAgICAgICAgdGhpcy5sYXRlc3RWZXJzaW9uQW5kSWRzTGlzdCA9IG5ldyBBcnJheTxMZWZ0UGFuZWxMYXRlc3RWZXJzaW9uPigpOworICAgICAgICAgICAgdGhpcy5vbkZpbmlzaExvYWRpbmdFdmVudCA9IG9uRmluaXNoRXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnUmVzdGFuZ3VsYXInLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICAgICAnJHEnLAorICAgICAgICAgICAgJyRiYXNlNjQnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEZhY3RvcnknLAorICAgICAgICAgICAgJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJworCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlc3Rhbmd1bGFyOiByZXN0YW5ndWxhci5JRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHNkY0NvbmZpZzogTW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgJHE6IG5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkICRiYXNlNjQ6IGFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIENvbXBvbmVudEZhY3Rvcnk6IFV0aWxzLkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBFdmVudExpc3RlbmVyU2VydmljZTogU2VydmljZXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UpIHsKKworICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5zZXRCYXNlVXJsKHNkY0NvbmZpZy5hcGkucm9vdCArIHNkY0NvbmZpZy5hcGkuY29tcG9uZW50X2FwaV9yb290KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc2VydmljZUxlZnRQYWxldHRlRGF0YTogTGVmdFBhbGV0dGVEYXRhT2JqZWN0OworICAgICAgICBwcml2YXRlIHJlc291cmNlTGVmdFBhbGV0dGVEYXRhOiBMZWZ0UGFsZXR0ZURhdGFPYmplY3Q7CisgICAgICAgIHByaXZhdGUgcHJvZHVjdExlZnRQYWxldHRlRGF0YTogTGVmdFBhbGV0dGVEYXRhT2JqZWN0OworICAgICAgICBwcml2YXRlIHZsRGF0YTogTGVmdFBhbGV0dGVEYXRhT2JqZWN0OworCisgICAgICAgIHB1YmxpYyBsb2FkTGVmdFBhbmVsID0gKCk6IHZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLnNlcnZpY2VMZWZ0UGFsZXR0ZURhdGEgPSBuZXcgTGVmdFBhbGV0dGVEYXRhT2JqZWN0KFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuU0VSVklDRV9MRUZUX1BBTEVUVEVfVVBEQVRFX0VWRU5UKTsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VMZWZ0UGFsZXR0ZURhdGEgPSBuZXcgTGVmdFBhbGV0dGVEYXRhT2JqZWN0KFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuUkVTT1VSQ0VfTEVGVF9QQUxFVFRFX1VQREFURV9FVkVOVCk7CisgICAgICAgICAgICB0aGlzLnByb2R1Y3RMZWZ0UGFsZXR0ZURhdGEgPSBuZXcgTGVmdFBhbGV0dGVEYXRhT2JqZWN0KFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuUFJPRFVDVF9MRUZUX1BBTEVUVEVfVVBEQVRFX0VWRU5UKTsKKyAgICAgICAgICAgIHRoaXMudmxEYXRhID0gbmV3IExlZnRQYWxldHRlRGF0YU9iamVjdChVdGlscy5Db25zdGFudHMuRVZFTlRTLlZMX0xFRlRfUEFMRVRURV9VUERBVEVfRVZFTlQpOworCisgICAgICAgICAgICAvL2luaXRpYXRpbmcgc2VydmljZSBwYWxldHRlCisgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudExlZnRQYWxldHRlKFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0UpOworCisgICAgICAgICAgICAvL2luaXRpYXRpbmcgcmVzb3VyY2UgcGFsZXR0ZQorICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRMZWZ0UGFsZXR0ZShVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRSk7CisKKyAgICAgICAgICAgIC8vaW5pdGlhdGluZyBwcm9kdWN0IHBhbGV0dGUKKyAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50TGVmdFBhbGV0dGUoVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUFJPRFVDVCk7CisKKyAgICAgICAgICAgIC8vaW5pdGlhdGluZyB2bAorICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRMZWZ0UGFsZXR0ZShVdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZMKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHVwZGF0ZURhdGEgPSAobGF0ZXN0VmVyc2lvbkNvbXBvbmVudHM6IEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4sIGxlZnRQYWxldHRlRGF0YU9iajogTGVmdFBhbGV0dGVEYXRhT2JqZWN0KSA9PiB7CisKKyAgICAgICAgICAgIGxldCBmdWxsRGF0YUNvbXBvbmVudHNBcnJheTogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9IG5ldyBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+KCk7CisgICAgICAgICAgICBsZXQgZGlzcGxheUNvbXBvbmVudHNBcnJheTogQXJyYXk8TW9kZWxzLkRpc3BsYXlDb21wb25lbnQ+ID0gbmV3IEFycmF5PE1vZGVscy5EaXNwbGF5Q29tcG9uZW50PigpOworCisgICAgICAgICAgICBfLmZvckVhY2gobGF0ZXN0VmVyc2lvbkNvbXBvbmVudHMsIChjb21wb25lbnRPYmo6IGFueSkgPT4geworICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50T2JqKTsKKyAgICAgICAgICAgICAgICBmdWxsRGF0YUNvbXBvbmVudHNBcnJheS5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgZGlzcGxheUNvbXBvbmVudHNBcnJheS5wdXNoKG5ldyBNb2RlbHMuRGlzcGxheUNvbXBvbmVudChjb21wb25lbnQpKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBsZWZ0UGFsZXR0ZURhdGFPYmouZnVsbERhdGFMZWZ0UGFsZXR0ZUNvbXBvbmVudHMgPSBsZWZ0UGFsZXR0ZURhdGFPYmouZnVsbERhdGFMZWZ0UGFsZXR0ZUNvbXBvbmVudHMuY29uY2F0KGZ1bGxEYXRhQ29tcG9uZW50c0FycmF5KTsKKyAgICAgICAgICAgIGxlZnRQYWxldHRlRGF0YU9iai5kaXNwbGF5TGVmdFBhbmVsQ29tcG9uZW50cyA9IGxlZnRQYWxldHRlRGF0YU9iai5kaXNwbGF5TGVmdFBhbmVsQ29tcG9uZW50cy5jb25jYXQoZGlzcGxheUNvbXBvbmVudHNBcnJheSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBnZXRUeXBlVXJsID0gKGNvbXBvbmVudFR5cGU6IHN0cmluZyk6IHN0cmluZyA9PiB7CisgICAgICAgICAgICByZXR1cm4gVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUFJPRFVDVCA9PT0gY29tcG9uZW50VHlwZSA/ICJzZXJ2aWNlcyIgOiAicmVzb3VyY2VzIjsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIG9uRmluaXNoTG9hZGluZyA9IChjb21wb25lbnRUeXBlOiBzdHJpbmcsIGxlZnRQYWxldHRlRGF0YTogTGVmdFBhbGV0dGVEYXRhT2JqZWN0KTogdm9pZCA9PiB7CisgICAgICAgICAgICBsZWZ0UGFsZXR0ZURhdGEuY3VycmVudFVwZGF0aW5nSWRzTGlzdCA9IFtdOworICAgICAgICAgICAgdGhpcy5FdmVudExpc3RlbmVyU2VydmljZS5ub3RpZnlPYnNlcnZlcnMobGVmdFBhbGV0dGVEYXRhLm9uRmluaXNoTG9hZGluZ0V2ZW50KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGdldFBhcnRpYWxMYXN0VmVyc2lvbkZ1bGxDb21wb25lbnRzID0gKGNvbXBvbmVudFR5cGU6IHN0cmluZywgY29tcG9uZW50SW50ZXJuYWxUeXBlOiBzdHJpbmcsIGxlZnRQYWxldHRlRGF0YTogTGVmdFBhbGV0dGVEYXRhT2JqZWN0KTogdm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLnJlc3Rhbmd1bGFyLm9uZSh0aGlzLmdldFR5cGVVcmwoY29tcG9uZW50VHlwZSkpLm9uZSgnL2xhdGVzdHZlcnNpb24vbm90YWJzdHJhY3QnKS5jdXN0b21QT1NUKGxlZnRQYWxldHRlRGF0YS5jdXJyZW50VXBkYXRpbmdJZHNMaXN0LCAnJywgeydpbnRlcm5hbENvbXBvbmVudFR5cGUnOiBjb21wb25lbnRJbnRlcm5hbFR5cGV9KS50aGVuKChjb21wb25lbnRzQXJyYXk6IGFueSkgPT4geworICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YShjb21wb25lbnRzQXJyYXksIGxlZnRQYWxldHRlRGF0YSk7CisgICAgICAgICAgICAgICAgdGhpcy5vbkZpbmlzaExvYWRpbmcoY29tcG9uZW50VHlwZSwgbGVmdFBhbGV0dGVEYXRhKTsgLy93aGVuIGZpbmlzaCBsb2FkaW5nIHVwZGF0ZSB2aWV3CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHJlbW92ZU5vdFVwZGF0ZWRDb21wb25lbnRzID0gKGxlZnRQYWxldHRlT2JqZWN0OiBMZWZ0UGFsZXR0ZURhdGFPYmplY3QpID0+IHsKKworICAgICAgICAgICAgbGVmdFBhbGV0dGVPYmplY3QuZnVsbERhdGFMZWZ0UGFsZXR0ZUNvbXBvbmVudHMgPSBfLmZpbHRlcihsZWZ0UGFsZXR0ZU9iamVjdC5mdWxsRGF0YUxlZnRQYWxldHRlQ29tcG9uZW50cywgKGNvbXBvbmVudCk9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRQYWxldHRlT2JqZWN0LmN1cnJlbnRVcGRhdGluZ0lkc0xpc3QuaW5kZXhPZihjb21wb25lbnQudW5pcXVlSWQpICE9IC0xOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBsZWZ0UGFsZXR0ZU9iamVjdC5kaXNwbGF5TGVmdFBhbmVsQ29tcG9uZW50cyA9IF8uZmlsdGVyKGxlZnRQYWxldHRlT2JqZWN0LmRpc3BsYXlMZWZ0UGFuZWxDb21wb25lbnRzLCAoY29tcG9uZW50KT0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFBhbGV0dGVPYmplY3QuY3VycmVudFVwZGF0aW5nSWRzTGlzdC5pbmRleE9mKGNvbXBvbmVudC51bmlxdWVJZCkgIT0gLTE7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGZpbmRJZHNUb1VwZGF0ZSA9IChsZWZ0UGFsZXR0ZU9iajogTGVmdFBhbGV0dGVEYXRhT2JqZWN0KTogQXJyYXk8c3RyaW5nPiA9PiB7CisgICAgICAgICAgICBsZXQgaWRzVG9VcGRhdGUgPSA8c3RyaW5nW10+Xy5kaWZmZXJlbmNlKGxlZnRQYWxldHRlT2JqLmN1cnJlbnRVcGRhdGluZ0lkc0xpc3QsIF8ubWFwKGxlZnRQYWxldHRlT2JqLmZ1bGxEYXRhTGVmdFBhbGV0dGVDb21wb25lbnRzLCAndW5pcXVlSWQnKSk7CisgICAgICAgICAgICBsZXQgbmVlZGVkVXBkYXRlID0gXy5maWx0ZXIobGVmdFBhbGV0dGVPYmouZnVsbERhdGFMZWZ0UGFsZXR0ZUNvbXBvbmVudHMsIChjb21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZCA9IF8uZmluZChsZWZ0UGFsZXR0ZU9iai5sYXRlc3RWZXJzaW9uQW5kSWRzTGlzdCwgKHZlcnNpb25BbmRJZDogTGVmdFBhbmVsTGF0ZXN0VmVyc2lvbikgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbkFuZElkLnVpZCA9PT0gY29tcG9uZW50LnVuaXF1ZUlkICYmIHZlcnNpb25BbmRJZC52ZXJzaW9uICE9IGNvbXBvbmVudC52ZXJzaW9uCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWQgIT0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAobmVlZGVkVXBkYXRlICYmIG5lZWRlZFVwZGF0ZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgbGV0IG5lZWRlZFVwZGF0ZUlkcyA9IDxzdHJpbmdbXT5fLm1hcChuZWVkZWRVcGRhdGUsICd1aWQnKTsKKyAgICAgICAgICAgICAgICBpZHNUb1VwZGF0ZS5jb25jYXQobmVlZGVkVXBkYXRlSWRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpZHNUb1VwZGF0ZTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHVwZGF0ZUN1cnJlbnRJZHNMaXN0ID0gKGNvbXBvbmVudFR5cGU6IHN0cmluZywgbGVmdFBhbGV0dGVPYmo6IExlZnRQYWxldHRlRGF0YU9iamVjdCk6IHZvaWQ9PiB7CisgICAgICAgICAgICB0aGlzLnJlbW92ZU5vdFVwZGF0ZWRDb21wb25lbnRzKGxlZnRQYWxldHRlT2JqKTsKKyAgICAgICAgICAgIGxlZnRQYWxldHRlT2JqLmN1cnJlbnRVcGRhdGluZ0lkc0xpc3QgPSB0aGlzLmZpbmRJZHNUb1VwZGF0ZShsZWZ0UGFsZXR0ZU9iaik7CisgICAgICAgICAgICAvL3JlbW92ZSBhbGwgY29tcG9uZW50cyB0aGF0IG5lZWRlZCB1cGRhdGUgZnJvbSBjdXJyZW50IGxpc3RzCisgICAgICAgICAgICBpZiAobGVmdFBhbGV0dGVPYmouY3VycmVudFVwZGF0aW5nSWRzTGlzdC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgbGVmdFBhbGV0dGVPYmouZGlzcGxheUxlZnRQYW5lbENvbXBvbmVudHMgPSBfLmZpbHRlcihsZWZ0UGFsZXR0ZU9iai5kaXNwbGF5TGVmdFBhbmVsQ29tcG9uZW50cywgKGNvbXBvbmVudCk9PiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0UGFsZXR0ZU9iai5jdXJyZW50VXBkYXRpbmdJZHNMaXN0LmluZGV4T2YoY29tcG9uZW50LnVuaXF1ZUlkKSA9PT0gLTE7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbGVmdFBhbGV0dGVPYmouZnVsbERhdGFMZWZ0UGFsZXR0ZUNvbXBvbmVudHMgPSBfLmZpbHRlcihsZWZ0UGFsZXR0ZU9iai5mdWxsRGF0YUxlZnRQYWxldHRlQ29tcG9uZW50cywgKGNvbXBvbmVudCk9PiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0UGFsZXR0ZU9iai5jdXJyZW50VXBkYXRpbmdJZHNMaXN0LmluZGV4T2YoY29tcG9uZW50LnVuaXF1ZUlkKSA9PT0gLTE7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSB1cGRhdGVMZWZ0UGFsZXR0ZSA9IChjb21wb25lbnRUeXBlLCBjb21wb25lbnRJbnRlcm5hbFR5cGU6IHN0cmluZywgbGVmdFBhbGV0dGVEYXRhOiBMZWZ0UGFsZXR0ZURhdGFPYmplY3QpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIGlmIChsZWZ0UGFsZXR0ZURhdGEuY3VycmVudFVwZGF0aW5nSWRzTGlzdC5sZW5ndGggPiAwKSByZXR1cm47IC8vdGhpcyBtZWFucyB0aGUgc2VydmljZSBpcyBzdGlsbCBwZXJmb3JtaW5nIHVwZGF0ZQorICAgICAgICAgICAgdGhpcy5yZXN0YW5ndWxhci5vbmUodGhpcy5nZXRUeXBlVXJsKGNvbXBvbmVudFR5cGUpKS5vbmUoJy9sYXRlc3R2ZXJzaW9uL25vdGFic3RyYWN0L3VpZG9ubHknKS5nZXQoeydpbnRlcm5hbENvbXBvbmVudFR5cGUnOiBjb21wb25lbnRJbnRlcm5hbFR5cGV9KS50aGVuKChsYXRlc3RWZXJzaW9uVW5pcXVlSWRzOiBBcnJheTxMZWZ0UGFuZWxMYXRlc3RWZXJzaW9uPikgPT4geworICAgICAgICAgICAgICAgIGxlZnRQYWxldHRlRGF0YS5sYXRlc3RWZXJzaW9uQW5kSWRzTGlzdCA9IGxhdGVzdFZlcnNpb25VbmlxdWVJZHM7CisgICAgICAgICAgICAgICAgbGVmdFBhbGV0dGVEYXRhLmN1cnJlbnRVcGRhdGluZ0lkc0xpc3QgPSA8c3RyaW5nW10+Xy5tYXAobGF0ZXN0VmVyc2lvblVuaXF1ZUlkcywgJ3VpZCcpCisKKyAgICAgICAgICAgICAgICBpZiAobGVmdFBhbGV0dGVEYXRhLmZ1bGxEYXRhTGVmdFBhbGV0dGVDb21wb25lbnRzLmxlbmd0aCA9PT0gMCkgeyAvL3RoaXMgaXMgd2hlbiBmaXJzdCBsb2FkaW5nIHByb2R1Y3Qgb3IgcmVzb3VyY2UgbGVmdCBwYWxldHRlCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbExhc3RWZXJzaW9uRnVsbENvbXBvbmVudHMoY29tcG9uZW50VHlwZSwgY29tcG9uZW50SW50ZXJuYWxUeXBlLCBsZWZ0UGFsZXR0ZURhdGEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudElkc0xpc3QoY29tcG9uZW50VHlwZSwgbGVmdFBhbGV0dGVEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnRQYWxldHRlRGF0YS5jdXJyZW50VXBkYXRpbmdJZHNMaXN0Lmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbmlzaExvYWRpbmcoY29tcG9uZW50VHlwZSwgbGVmdFBhbGV0dGVEYXRhKTsgLy93aGVuIGZpbmlzaCBsb2FkaW5nIHVwZGF0ZSB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsTGFzdFZlcnNpb25GdWxsQ29tcG9uZW50cyhjb21wb25lbnRUeXBlLCBjb21wb25lbnRJbnRlcm5hbFR5cGUsIGxlZnRQYWxldHRlRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldExlZnRQYW5lbENvbXBvbmVudHNGb3JEaXNwbGF5ID0gKGNvbXBvbmVudFR5cGU6IHN0cmluZyk6IEFycmF5PE1vZGVscy5EaXNwbGF5Q29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VMZWZ0UGFsZXR0ZURhdGEuZGlzcGxheUxlZnRQYW5lbENvbXBvbmVudHM7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5QUk9EVUNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0TGVmdFBhbGV0dGVEYXRhLmRpc3BsYXlMZWZ0UGFuZWxDb21wb25lbnRzOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTGVmdFBhbGV0dGVEYXRhLmRpc3BsYXlMZWZ0UGFuZWxDb21wb25lbnRzOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRGdWxsRGF0YUNvbXBvbmVudExpc3QgPSAoY29tcG9uZW50VHlwZTogc3RyaW5nKTogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9PiB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5SZXNvdXJjZVR5cGUuVkw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZsRGF0YS5mdWxsRGF0YUxlZnRQYWxldHRlQ29tcG9uZW50czsKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VMZWZ0UGFsZXR0ZURhdGEuZnVsbERhdGFMZWZ0UGFsZXR0ZUNvbXBvbmVudHM7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5QUk9EVUNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0TGVmdFBhbGV0dGVEYXRhLmZ1bGxEYXRhTGVmdFBhbGV0dGVDb21wb25lbnRzOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUxlZnRQYWxldHRlRGF0YS5mdWxsRGF0YUxlZnRQYWxldHRlQ29tcG9uZW50czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgZ2V0RnVsbERhdGFDb21wb25lbnRMaXN0V2l0aFZscyA9IChjb21wb25lbnRUeXBlOiBzdHJpbmcpOiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+ID0+IHsKKyAgICAgICAgICAgIGxldCBsaXN0UGFydDE6IEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD47CisgICAgICAgICAgICBsZXQgbGlzdFBhcnQyOiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OworICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT09IFV0aWxzLkNvbnN0YW50cy5SZXNvdXJjZVR5cGUuVkwpIHsKKyAgICAgICAgICAgICAgICBsaXN0UGFydDEgPSBbXTsKKyAgICAgICAgICAgICAgICBsaXN0UGFydDIgPSB0aGlzLmdldEZ1bGxEYXRhQ29tcG9uZW50TGlzdChVdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGlzdFBhcnQxID0gdGhpcy5nZXRGdWxsRGF0YUNvbXBvbmVudExpc3QoY29tcG9uZW50VHlwZSk7CisgICAgICAgICAgICAgICAgbGlzdFBhcnQyID0gdGhpcy5nZXRGdWxsRGF0YUNvbXBvbmVudExpc3QoVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZS5WTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGlzdFBhcnQxLmNvbmNhdChsaXN0UGFydDIpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyB1cGRhdGVTcGVjaWZpY0NvbXBvbmVudExlZnRQYWxldHRlID0gKGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50LCBjb21wb25lbnRUeXBlOiBzdHJpbmcpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBsaXN0Q29tcG9uZW50czogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiA9IHRoaXMuZ2V0RnVsbERhdGFDb21wb25lbnRMaXN0KGNvbXBvbmVudFR5cGUpOworICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBsaXN0Q29tcG9uZW50cykgeworICAgICAgICAgICAgICAgIGlmIChsaXN0Q29tcG9uZW50c1tpXS51bmlxdWVJZCA9PT0gY29tcG9uZW50LnVuaXF1ZUlkKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RDb21wb25lbnRzW2ldID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgdXBkYXRlQ29tcG9uZW50TGVmdFBhbGV0dGUgPSAoY29tcG9uZW50VHlwZSk6IHZvaWQgPT4geworICAgICAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZMOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxlZnRQYWxldHRlKFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlJFU09VUkNFLCBVdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZMLCB0aGlzLnZsRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuU0VSVklDRToKKyAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMZWZ0UGFsZXR0ZShVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFLCBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFLCB0aGlzLnNlcnZpY2VMZWZ0UGFsZXR0ZURhdGEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlBST0RVQ1Q6CisgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTGVmdFBhbGV0dGUoVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUFJPRFVDVCwgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuU0VSVklDRSwgdGhpcy5wcm9kdWN0TGVmdFBhbGV0dGVEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMZWZ0UGFsZXR0ZShVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRSwgVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZS5WRiwgdGhpcy5yZXNvdXJjZUxlZnRQYWxldHRlRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb25maWd1cmF0aW9uLXVpLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2NvbmZpZ3VyYXRpb24tdWktc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWViM2RjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9jb25maWd1cmF0aW9uLXVpLXNlcnZpY2UudHMKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworCisgICd1c2Ugc3RyaWN0JworCisgIGludGVyZmFjZSBJQ29uZmlndXJhdGlvblVpU2VydmljZSB7CisgICAgZ2V0Q29uZmlndXJhdGlvblVpKCk6IG5nLklQcm9taXNlPGFueT47CisgIH0KKworICBleHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvblVpU2VydmljZSBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uVWlTZXJ2aWNleworCisgICAgc3RhdGljICckaW5qZWN0JyA9IFsnJGh0dHAnLCAnJHEnLCdzZGNDb25maWcnXTsKKyAgICBwcml2YXRlIGFwaTogTW9kZWxzLklBcGk7CisKKyAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRodHRwOiBuZy5JSHR0cFNlcnZpY2UsIHByaXZhdGUgJHE6IG5nLklRU2VydmljZSwgc2RjQ29uZmlnOiBNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24peworICAgICAgdGhpcy5hcGkgPSBzZGNDb25maWcuYXBpOworICAgIH0KKworICAgICAgZ2V0Q29uZmlndXJhdGlvblVpID0gKCk6IG5nLklQcm9taXNlPGFueT4gPT57CisgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPGFueT4oKTsKKyAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMuYXBpLnJvb3QrdGhpcy5hcGkuR0VUX2NvbmZpZ3VyYXRpb25fdWkpCisgICAgICAuc3VjY2VzcygocmVzdWx0OiBhbnkpID0+IHsKKyAgICAgICAgICBkZWZlci5yZXNvbHZlKHJlc3VsdCk7CisgICAgICB9KTsKKyAgICAgIHJldHVybiBkZWZlci5wcm9taXNlOworICAgIH0KKyAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvY29va2llLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2Nvb2tpZS1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyM2E3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2Nvb2tpZS1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsOTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlNlcnZpY2VzIHsKKworICAndXNlIHN0cmljdCc7CisKKyAgaW50ZXJmYWNlIElDb29raWVTZXJ2aWNlIHsKKyAgICAgIGdldFVzZXJJZCgpOiBzdHJpbmc7CisgICAgICBnZXRGaXJzdE5hbWUoKTogc3RyaW5nOworICAgICAgZ2V0TGFzdE5hbWUoKTogc3RyaW5nOworICAgICAgZ2V0RW1haWwoKTogc3RyaW5nOworICAgICAgZ2V0VXNlcklkU3VmZml4KCk6IHN0cmluZzsKKyAgfQorCisgIGV4cG9ydCBjbGFzcyBDb29raWVTZXJ2aWNlIGltcGxlbWVudHMgSUNvb2tpZVNlcnZpY2UgeworCisgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWydzZGNDb25maWcnLCAnJGRvY3VtZW50J107CisgICAgICBwcml2YXRlIGNvb2tpZTogU2RjLk1vZGVscy5JQ29va2llOworICAgICAgcHJpdmF0ZSBjb29raWVQcmVmaXg6IHN0cmluZzsKKworCisgICAgICBjb25zdHJ1Y3RvcihzZGNDb25maWc6IE1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwgcHJpdmF0ZSAkZG9jdW1lbnQpIHsKKyAgICAgICAgdGhpcy5jb29raWUgPSBzZGNDb25maWcuY29va2llOworCisgICAgICAgIHRoaXMuY29va2llUHJlZml4ID0gJyc7CisgICAgICAgIGxldCBqdW5jdGlvbk5hbWU6IHN0cmluZyA9IHRoaXMuZ2V0Q29va2llQnlOYW1lKHRoaXMuY29va2llLmp1bmN0aW9uTmFtZSk7CisgICAgICAgIGlmICgoanVuY3Rpb25OYW1lICE9PSBudWxsKSAmJiAoanVuY3Rpb25OYW1lICE9PSAnJykpeworICAgICAgICAgIHRoaXMuY29va2llUHJlZml4ID0gdGhpcy5jb29raWUucHJlZml4K2p1bmN0aW9uTmFtZSsnISc7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBnZXRDb29raWVCeU5hbWUgPSAoY29va2llTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHsKKyAgICAgICAgY29va2llTmFtZSArPSAnPSc7CisgICAgICAgIGxldCBjb29raWVzOiBBcnJheTxzdHJpbmc+ID0gdGhpcy4kZG9jdW1lbnRbMF0uY29va2llLnNwbGl0KCc7Jyk7CisgICAgICAgIGxldCBjb29raWVWYWw6IHN0cmluZyA9ICcnOworICAgICAgICBjb29raWVzLmZvckVhY2goKGNvb2tpZTogc3RyaW5nKSA9PiB7CisgICAgICAgICAgd2hpbGUoY29va2llLmNoYXJBdCgwKSA9PT0gJyAnKXsKKyAgICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKGNvb2tpZS5pbmRleE9mKGNvb2tpZU5hbWUpID09PSAwKXsKKyAgICAgICAgICAgIGNvb2tpZVZhbCA9IGNvb2tpZS5zdWJzdHJpbmcoY29va2llTmFtZS5sZW5ndGgsIGNvb2tpZS5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBjb29raWVWYWw7CisgICAgICB9OworCisgICAgICBwdWJsaWMgZ2V0VXNlcklkU3VmZml4ID0gKCk6IHN0cmluZyA9PiB7CisgICAgICAgIHJldHVybiB0aGlzLmNvb2tpZS51c2VySWRTdWZmaXg7CisgICAgICB9OworCisgICAgICBwdWJsaWMgZ2V0VXNlcklkID0gKCk6IHN0cmluZyA9PiB7CisgICAgICAgIGxldCB1c2VySWRDb29raWVOYW1lOiBzdHJpbmcgPSB0aGlzLmNvb2tpZVByZWZpeCt0aGlzLmNvb2tpZS51c2VySWRTdWZmaXg7CisgICAgICAgIGxldCB1c2VySWQ6IHN0cmluZyA9IHRoaXMuZ2V0Q29va2llQnlOYW1lKHVzZXJJZENvb2tpZU5hbWUpOworICAgICAgICByZXR1cm4gdXNlcklkOworICAgICAgfTsKKworICAgICAgcHVibGljIGdldEZpcnN0TmFtZSA9ICgpOiBzdHJpbmcgPT4geworICAgICAgICBsZXQgZmlyc3ROYW1lQ29va2llTmFtZTogc3RyaW5nID0gdGhpcy5jb29raWVQcmVmaXgrdGhpcy5jb29raWUudXNlckZpcnN0TmFtZTsKKyAgICAgICAgbGV0IGZpcnN0TmFtZTogc3RyaW5nID0gdGhpcy5nZXRDb29raWVCeU5hbWUoZmlyc3ROYW1lQ29va2llTmFtZSk7CisgICAgICAgIHJldHVybiBmaXJzdE5hbWU7CisgICAgICB9OworCisgICAgICBwdWJsaWMgZ2V0TGFzdE5hbWUgPSAoKTogc3RyaW5nID0+IHsKKyAgICAgICAgbGV0IGxhc3ROYW1lQ29va2llTmFtZTogc3RyaW5nID0gdGhpcy5jb29raWVQcmVmaXgrdGhpcy5jb29raWUudXNlckxhc3ROYW1lOworICAgICAgICBsZXQgbGFzdE5hbWU6IHN0cmluZyA9IHRoaXMuZ2V0Q29va2llQnlOYW1lKGxhc3ROYW1lQ29va2llTmFtZSk7CisgICAgICAgIHJldHVybiBsYXN0TmFtZTsKKyAgICAgIH07CisKKyAgICAgIHB1YmxpYyBnZXRFbWFpbCA9ICgpOiBzdHJpbmcgPT4geworICAgICAgICBsZXQgZW1haWxDb29raWVOYW1lOiBzdHJpbmcgPSB0aGlzLmNvb2tpZVByZWZpeCt0aGlzLmNvb2tpZS51c2VyRW1haWw7CisgICAgICAgIGxldCBlbWFpbDogc3RyaW5nID0gdGhpcy5nZXRDb29raWVCeU5hbWUoZW1haWxDb29raWVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGVtYWlsOworICAgICAgfTsKKworICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2RhdGEtdHlwZXMtc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvZGF0YS10eXBlcy1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNWZjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2RhdGEtdHlwZXMtc2VydmljZS50cwpAQCAtMCwwICsxLDEyOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworCisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJRGF0YVR5cGVzU2VydmljZSB7CisgICAgICAgIC8vZGVjbGFyZSBtZXRob2RzCisgICAgICAgIGdldEFsbERhdGFUeXBlcygpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPjsKKyAgICAgICAgZ2V0Rmlyc0xldmVsT2ZEYXRhVHlwZVByb3BlcnRpZXMoZGF0YVR5cGVOYW1lOnN0cmluZywgZGF0YVR5cGVzOk1vZGVscy5EYXRhVHlwZXNNYXApOkFycmF5PE1vZGVscy5EYXRhVHlwZVByb3BlcnR5TW9kZWw+OworICAgICAgICBpc0RhdGFUeXBlRm9yU2NoZW1hVHlwZShwcm9wZXJ0eTpNb2RlbHMuU2NoZW1hUHJvcGVydHksIHR5cGVzOk1vZGVscy5EYXRhVHlwZXNNYXApOmJvb2xlYW47CisgICAgICAgIGlzRGF0YVR5cGVGb3JQcm9wZXJ0eVR5cGUocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwsIHR5cGVzOk1vZGVscy5EYXRhVHlwZXNNYXApOmJvb2xlYW47CisgICAgICAgIGlzRGF0YVR5cGVGb3JEYXRhVHlwZVByb3BlcnR5VHlwZShwcm9wZXJ0eTpNb2RlbHMuRGF0YVR5cGVQcm9wZXJ0eU1vZGVsLCB0eXBlczpNb2RlbHMuRGF0YVR5cGVzTWFwKTpib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBEYXRhVHlwZXNTZXJ2aWNlIGltcGxlbWVudHMgSURhdGFUeXBlc1NlcnZpY2UgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICckcScsCisgICAgICAgICAgICAnJGh0dHAnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRxOm5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkaHR0cDpuZy5JSHR0cFNlcnZpY2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vaWYgdGhlIGR0IGRlcml2ZWQgZnJvbSBzaW1wbGUtIHJldHVybiB0aGUgZmlyc3QgcGFyZW50IHR5cGUsIGVsc2UtIHJldHVybiBudWxsCisgICAgICAgIHByaXZhdGUgZ2V0VHlwZUZvckRhdGFUeXBlRGVyaXZlZEZyb21TaW1wbGUgPSAoZGF0YVR5cGVOYW1lOnN0cmluZywgZGF0YVR5cGVzOk1vZGVscy5EYXRhVHlwZXNNYXApOnN0cmluZyA9PiB7CisgICAgICAgICAgICAvLy8vLy8vLy90ZW1wb3JhcnkgaGFjayBmb3IgdG9zY2EgcHJpbWl0aXZlcy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICBpZighZGF0YVR5cGVzW2RhdGFUeXBlTmFtZV0peworICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIGlmKGRhdGFUeXBlc1tkYXRhVHlwZU5hbWVdLmRlcml2ZWRGcm9tTmFtZSA9PSAidG9zY2EuZGF0YXR5cGVzLlJvb3QiIHx8IGRhdGFUeXBlc1tkYXRhVHlwZU5hbWVdLnByb3BlcnRpZXMpeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX0RBVEEuU0lNUExFX1RZUEVTLmluZGV4T2YoZGF0YVR5cGVzW2RhdGFUeXBlTmFtZV0uZGVyaXZlZEZyb21OYW1lKSA+IC0xICl7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFUeXBlc1tkYXRhVHlwZU5hbWVdLmRlcml2ZWRGcm9tTmFtZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZUZvckRhdGFUeXBlRGVyaXZlZEZyb21TaW1wbGUoZGF0YVR5cGVzW2RhdGFUeXBlTmFtZV0uZGVyaXZlZEZyb21OYW1lLGRhdGFUeXBlcyk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldEFsbERhdGFUeXBlcyA9ICgpOm5nLklQcm9taXNlPE1vZGVscy5Qcm9wZXJ0eU1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICB0aGlzLiRodHRwKHsKKyAgICAgICAgICAgICAgICB1cmw6IHRoaXMuc2RjQ29uZmlnLmFwaS5yb290ICsgdGhpcy5zZGNDb25maWcuYXBpLmNvbXBvbmVudF9hcGlfcm9vdCArICJkYXRhVHlwZXMiLAorICAgICAgICAgICAgICAgIG1ldGhvZDogImdldCIKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuc3VjY2VzcygocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7CisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmVycm9yKChlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgLy9yZXR1cm4gbGlzdCBvZiBkYXRhIHR5cGUgcHJvcGVydGllcyBhbmQgYWxsIGl0cyBwYXJlbnRzIHByb3BlcnRpZXMKKyAgICAgICAgLy8obm90IGluY2x1ZGUgdGhlIHByb3BlcnRpZXMgb2YgaXRzIHByb3BlcnRpZXMsIGluIGNhc2UgdGhpcyBkYXRhIHR5cGUgaGFzIG5vdCBwcmltaXRpdmUgcHJvcGVydGllcykKKyAgICAgICAgcHVibGljIGdldEZpcnNMZXZlbE9mRGF0YVR5cGVQcm9wZXJ0aWVzID0gKGRhdGFUeXBlTmFtZTpzdHJpbmcsIGRhdGFUeXBlczpNb2RlbHMuRGF0YVR5cGVzTWFwKTpBcnJheTxNb2RlbHMuRGF0YVR5cGVQcm9wZXJ0eU1vZGVsPiA9PiB7CisgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IGRhdGFUeXBlc1tkYXRhVHlwZU5hbWVdLnByb3BlcnRpZXMgfHwgW107CisgICAgICAgICAgICBpZihkYXRhVHlwZXNbZGF0YVR5cGVOYW1lXS5kZXJpdmVkRnJvbU5hbWUgIT0gInRvc2NhLmRhdGF0eXBlcy5Sb290IiApeworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpcnNMZXZlbE9mRGF0YVR5cGVQcm9wZXJ0aWVzKGRhdGFUeXBlc1tkYXRhVHlwZU5hbWVdLmRlcml2ZWRGcm9tTmFtZSxkYXRhVHlwZXMpLmNvbmNhdChwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgICAgICB9OworCisgICAgICAgIC8vcmV0dXJuIGZhbHNlIHdoZW4gdHlwZT0gZGF0YSB0eXBlICg9bm90IHNpbXBsZSB0eXBlKSB0aGF0IG5vdCBkZXJpdmVkIGZyb20gc2ltcGxlIHR5cGUKKyAgICAgICAgcHVibGljIGlzRGF0YVR5cGVGb3JTY2hlbWFUeXBlID0gKHByb3BlcnR5Ok1vZGVscy5TY2hlbWFQcm9wZXJ0eSwgdHlwZXM6TW9kZWxzLkRhdGFUeXBlc01hcCk6Ym9vbGVhbj0+eworICAgICAgICAgICAgcHJvcGVydHkuc2ltcGxlVHlwZT0iIjsKKyAgICAgICAgICAgIGlmKHByb3BlcnR5LnR5cGUgJiYgVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX0RBVEEuVFlQRVMuaW5kZXhPZihwcm9wZXJ0eS50eXBlKSA+IC0xKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXQgc2ltcGxlVHlwZSA9IHRoaXMuZ2V0VHlwZUZvckRhdGFUeXBlRGVyaXZlZEZyb21TaW1wbGUocHJvcGVydHkudHlwZSwgdHlwZXMpOworICAgICAgICAgICAgaWYoc2ltcGxlVHlwZSl7CisgICAgICAgICAgICAgICAgcHJvcGVydHkuc2ltcGxlVHlwZT1zaW1wbGVUeXBlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBpc0RhdGFUeXBlRm9yUHJvcGVydHlUeXBlID0gKHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsLCB0eXBlczpNb2RlbHMuRGF0YVR5cGVzTWFwKTpib29sZWFuPT57CisgICAgICAgICAgICBwcm9wZXJ0eS5zaW1wbGVUeXBlPSIiOworICAgICAgICAgICAgaWYocHJvcGVydHkudHlwZSAmJiBVdGlscy5Db25zdGFudHMuUFJPUEVSVFlfREFUQS5UWVBFUy5pbmRleE9mKHByb3BlcnR5LnR5cGUpID4gLTEpeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBzaW1wbGVUeXBlID0gdGhpcy5nZXRUeXBlRm9yRGF0YVR5cGVEZXJpdmVkRnJvbVNpbXBsZShwcm9wZXJ0eS50eXBlLCB0eXBlcyk7CisgICAgICAgICAgICBpZihzaW1wbGVUeXBlKXsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eS5zaW1wbGVUeXBlPXNpbXBsZVR5cGU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGlzRGF0YVR5cGVGb3JEYXRhVHlwZVByb3BlcnR5VHlwZSA9IChwcm9wZXJ0eTpNb2RlbHMuRGF0YVR5cGVQcm9wZXJ0eU1vZGVsLCB0eXBlczpNb2RlbHMuRGF0YVR5cGVzTWFwKTpib29sZWFuPT57CisgICAgICAgICAgICBwcm9wZXJ0eS5zaW1wbGVUeXBlPSIiOworICAgICAgICAgICAgaWYocHJvcGVydHkudHlwZSAmJiBVdGlscy5Db25zdGFudHMuUFJPUEVSVFlfREFUQS5UWVBFUy5pbmRleE9mKHByb3BlcnR5LnR5cGUpID4gLTEpeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBzaW1wbGVUeXBlID0gdGhpcy5nZXRUeXBlRm9yRGF0YVR5cGVEZXJpdmVkRnJvbVNpbXBsZShwcm9wZXJ0eS50eXBlLCB0eXBlcyk7CisgICAgICAgICAgICBpZihzaW1wbGVUeXBlKXsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eS5zaW1wbGVUeXBlPXNpbXBsZVR5cGU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2Vjb21wLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2Vjb21wLXNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5MTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvZWNvbXAtc2VydmljZS50cwpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcyB7CisKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSUVjb21wSGVhZGVyU2VydmljZSB7CisgICAgICAgIGdldE1lbnVJdGVtcyh1c2VySWQpOiBuZy5JUHJvbWlzZTxBcnJheTxhbnk+PjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRWNvbXBIZWFkZXJTZXJ2aWNlIGltcGxlbWVudHMgSUVjb21wSGVhZGVyU2VydmljZSB7CisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJyRodHRwJywgJyRxJywgJ3NkY0NvbmZpZyddOworICAgICAgICBwcml2YXRlIGFwaTpNb2RlbHMuSUFwaTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRodHRwOm5nLklIdHRwU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkcTpuZy5JUVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbikgeworICAgICAgICAgICAgdGhpcy5hcGkgPSBzZGNDb25maWcuYXBpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBnZXRNZW51SXRlbXMgPSAodXNlcklkKTpuZy5JUHJvbWlzZTxBcnJheTxhbnk+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPEFycmF5PGFueT4+KCk7CisgICAgICAgICAgICAvL2RlZmVyLnJlc29sdmUodGhpcy5tb2NrRGF0YSk7CisgICAgICAgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLmFwaS5yb290ICsgdGhpcy5hcGkuR0VUX2Vjb21wX21lbnVfaXRlbXMucmVwbGFjZSgnOnVzZXJJZCcsIHVzZXJJZCkpCisgICAgICAgICAgICAgICAgLnN1Y2Nlc3MoKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5lcnJvcigocmVzcG9uc2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQ1YTQyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS50cwpAQCAtMCwwICsxLDExNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworCisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElFbnRpdHlTZXJ2aWNlIHsKKyAgICAgICAgZ2V0QWxsQ29tcG9uZW50cygpOiBuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUNvbXBvbmVudHNBcnJheSB7CisgICAgICAgIHNlcnZpY2VzOkFycmF5PE1vZGVscy5Db21wb25lbnRzLlNlcnZpY2U+OworICAgICAgICByZXNvdXJjZXM6QXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+OworICAgICAgICBwcm9kdWN0czpBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0PjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRW50aXR5U2VydmljZSBpbXBsZW1lbnRzIElFbnRpdHlTZXJ2aWNlIHsKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsnJGh0dHAnLCAnJHEnLCAnc2RjQ29uZmlnJywgJ1NkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZScsJ0NvbXBvbmVudEZhY3RvcnknLCdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJ107CisgICAgICAgIHByaXZhdGUgYXBpOk1vZGVscy5JQXBpOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJGh0dHA6bmcuSUh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRxOm5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNoYXJpbmdTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb21wb25lbnRGYWN0b3J5OiBTZGMuVXRpbHMuQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZQorICAgICAgICApIHsKKyAgICAgICAgICAgIHRoaXMuYXBpID0gc2RjQ29uZmlnLmFwaTsKKyAgICAgICAgfQorCisgICAgICAgIGdldENhdGFsb2cgPSAoKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4+KCk7CisgICAgICAgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLmFwaS5yb290ICsgdGhpcy5hcGkuR0VUX2NhdGFsb2cpCisgICAgICAgICAgICAgICAgLnN1Y2Nlc3MoKGZvbGxvd2VkUmVzcG9uc2U6SUNvbXBvbmVudHNBcnJheSkgPT4geworCisgICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRzTGlzdDpBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+ID0gbmV3IEFycmF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWRSZXNwb25zZS5zZXJ2aWNlcy5mb3JFYWNoKChzZXJ2aWNlUmVzcG9uc2U6IE1vZGVscy5Db21wb25lbnRzLlNlcnZpY2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuU2VydmljZSA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VSZXNwb25zZSk7IC8vIG5ldyBNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlKHNlcnZpY2VSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzTGlzdC5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJpbmdTZXJ2aWNlLmFkZFV1aWRWYWx1ZShjb21wb25lbnQudW5pcXVlSWQsIGNvbXBvbmVudC51dWlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWRSZXNwb25zZS5yZXNvdXJjZXMuZm9yRWFjaCgocmVzb3VyY2VSZXNwb25zZTpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZVJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNMaXN0LnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcmluZ1NlcnZpY2UuYWRkVXVpZFZhbHVlKGNvbXBvbmVudC51bmlxdWVJZCwgY29tcG9uZW50LnV1aWQpOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWRSZXNwb25zZS5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0UmVzcG9uc2U6TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdCkgPT4geworCisgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0ID0gIHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVQcm9kdWN0KHByb2R1Y3RSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c0xpc3QucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcmluZ1NlcnZpY2UuYWRkVXVpZFZhbHVlKGNvbXBvbmVudC51bmlxdWVJZCwgY29tcG9uZW50LnV1aWQpOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ2JyZWFkY3J1bWJzQ29tcG9uZW50cycsY29tcG9uZW50c0xpc3QpOworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKGNvbXBvbmVudHNMaXN0KTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5lcnJvcigocmVzcG9uY2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KHJlc3BvbmNlKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIGdldEFsbENvbXBvbmVudHMgPSAoKTpuZy5JUHJvbWlzZTxBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4+KCk7CisgICAgICAgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLmFwaS5yb290ICsgdGhpcy5hcGkuR0VUX2VsZW1lbnQpCisgICAgICAgICAgICAgICAgLnN1Y2Nlc3MoKGNvbXBvbmVudFJlc3BvbnNlOklDb21wb25lbnRzQXJyYXkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudHNMaXN0OkFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPSBbXTsKKworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZXNwb25zZS5zZXJ2aWNlcyAmJiBjb21wb25lbnRSZXNwb25zZS5zZXJ2aWNlcy5mb3JFYWNoKChzZXJ2aWNlUmVzcG9uc2U6TW9kZWxzLkNvbXBvbmVudHMuU2VydmljZSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuU2VydmljZSA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c0xpc3QucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJpbmdTZXJ2aWNlLmFkZFV1aWRWYWx1ZShjb21wb25lbnQudW5pcXVlSWQsIGNvbXBvbmVudC51dWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlc3BvbnNlLnJlc291cmNlcyAmJiBjb21wb25lbnRSZXNwb25zZS5yZXNvdXJjZXMuZm9yRWFjaCgocmVzb3VyY2VSZXNwb25zZTpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZVJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNMaXN0LnB1c2goY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcmluZ1NlcnZpY2UuYWRkVXVpZFZhbHVlKGNvbXBvbmVudC51bmlxdWVJZCwgY29tcG9uZW50LnV1aWQpOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZXNwb25zZS5wcm9kdWN0cyAmJiBjb21wb25lbnRSZXNwb25zZS5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0c1Jlc3BvbnNlOk1vZGVscy5Db21wb25lbnRzLlByb2R1Y3QpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdCA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVQcm9kdWN0KHByb2R1Y3RzUmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c0xpc3QucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFyaW5nU2VydmljZS5hZGRVdWlkVmFsdWUoY29tcG9uZW50LnVuaXF1ZUlkLCBjb21wb25lbnQudXVpZCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ2JyZWFkY3J1bWJzQ29tcG9uZW50cycsY29tcG9uZW50c0xpc3QpOworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKGNvbXBvbmVudHNMaXN0KTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9ldmVudC1saXN0ZW5lci1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9ldmVudC1saXN0ZW5lci1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWZkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2V2ZW50LWxpc3RlbmVyLXNlcnZpY2UudHMKQEAgLTAsMCArMSw3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNy80LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworCisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElFdmVudExpc3RlbmVyU2VydmljZSB7CisKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUNhbGxiYWNrRGF0YSB7CisgICAgICAgIGNhbGxiYWNrOkZ1bmN0aW9uOworICAgICAgICBhcmdzOmFueVtdOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyU2VydmljZSBpbXBsZW1lbnRzIElFdmVudExpc3RlbmVyU2VydmljZSB7CisKKyAgICAgICAgcHVibGljIG9ic2VydmVyQ2FsbGJhY2tzOlV0aWxzLkRpY3Rpb25hcnk8c3RyaW5nLCBJQ2FsbGJhY2tEYXRhW10+ID0gbmV3IFV0aWxzLkRpY3Rpb25hcnk8c3RyaW5nLCBBcnJheTxJQ2FsbGJhY2tEYXRhPj4oKTsKKworICAgICAgICAvL3JlZ2lzdGVyIGFuIG9ic2VydmVyICsgY2FsbGJhY2sKKyAgICAgICAgcHVibGljIHJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayA9IChldmVudE5hbWU6c3RyaW5nLCBjYWxsYmFjazpGdW5jdGlvbiwgLi4uYXJncykgPT4geworICAgICAgICAgICAgbGV0IGNhbGxiYWNrRGF0YSA9IHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgYXJnczogYXJncworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlckNhbGxiYWNrcy5jb250YWluc0tleShldmVudE5hbWUpKSB7CisgICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrcyA9IHRoaXMub2JzZXJ2ZXJDYWxsYmFja3MuZ2V0VmFsdWUoZXZlbnROYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIE9ubHkgaW5zZXJ0IHRoZSBjYWxsYmFjayBpZiB0aGUgY2FsbGJhY2sgaXMgZGlmZmVyZW50IGZyb20gZXhpc3RpbmcgY2FsbGJhY2tzLgorICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3NbaV0udG9TdHJpbmcoKSA9PT0gY2FsbGJhY2sudG9TdHJpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBEbyBub3QgYWRkIHRoaXMgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFja0RhdGEpOworICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJDYWxsYmFja3Muc2V0VmFsdWUoZXZlbnROYW1lLCBjYWxsYmFja3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyQ2FsbGJhY2tzLnNldFZhbHVlKGV2ZW50TmFtZSwgW2NhbGxiYWNrRGF0YV0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vdW5yZWdpc3RlciBhbiBvYnNlcnZlcgorICAgICAgICBwdWJsaWMgdW5SZWdpc3Rlck9ic2VydmVyID0gKGV2ZW50TmFtZTpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgIGlmICh0aGlzLm9ic2VydmVyQ2FsbGJhY2tzLmNvbnRhaW5zS2V5KGV2ZW50TmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyQ2FsbGJhY2tzLnJlbW92ZShldmVudE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBub3RpZnlPYnNlcnZlcnMgPSBmdW5jdGlvbiAoZXZlbnROYW1lOnN0cmluZywgLi4uYXJncykgeworICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMub2JzZXJ2ZXJDYWxsYmFja3MuZ2V0VmFsdWUoZXZlbnROYW1lKSwgKGNhbGxiYWNrRGF0YTpJQ2FsbGJhY2tEYXRhKSA9PiB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhLmNhbGxiYWNrKC4uLmFyZ3MpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9oZWFkZXItaW50ZXJjZXB0b3IudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2hlYWRlci1pbnRlcmNlcHRvci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM2MmQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9oZWFkZXItaW50ZXJjZXB0b3IudHMKQEAgLTAsMCArMSw5MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIC8vTWV0aG9kIG5hbWUgc2hvdWxkIGJlIGV4YWN0bHkgInJlc3BvbnNlIiAtIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nL3NlcnZpY2UvJGh0dHAKKyAgICBleHBvcnQgaW50ZXJmYWNlIElJbnRlcmNlcHRvciB7CisgICAgICAgIHJlcXVlc3Q6IEZ1bmN0aW9uOworCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEhlYWRlckludGVyY2VwdG9yIGltcGxlbWVudHMgSUludGVyY2VwdG9yIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyAkaW5qZWN0ID0gWworICAgICAgICAgICAgJyRsb2cnLAorICAgICAgICAgICAgJyRpbmplY3RvcicsCisgICAgICAgICAgICAnJHEnLAorICAgICAgICAgICAgJ3V1aWQ0JywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuU2hhcmluZ1NlcnZpY2UnLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICAgICAnJGxvY2F0aW9uJworCisKKyAgICAgICAgXTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnkoJGxvZzogbmcuSUxvZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5qZWN0b3I6IG5nLmF1dG8uSUluamVjdG9yU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRxOiBuZy5JUVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkNDogYW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZ1NlcnZpY2U6IFNkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkY0NvbmZpZzogTW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uOiBuZy5JTG9jYXRpb25TZXJ2aWNlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRlckludGVyY2VwdG9yKCRsb2csICRpbmplY3RvciwgJHEsIHV1aWQ0LCBzaGFyaW5nU2VydmljZSwgc2RjQ29uZmlnLCAkbG9jYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkbG9nOiBuZy5JTG9nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkaW5qZWN0b3I6IG5nLmF1dG8uSUluamVjdG9yU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkcTogbmcuSVFTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHV1aWQ0OiBhbnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2hhcmluZ1NlcnZpY2U6IFNkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNDb25maWc6IE1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbG9jYXRpb246IG5nLklMb2NhdGlvblNlcnZpY2UpIHsKKyAgICAgICAgICAgIHRoaXMuJGxvZy5kZWJ1ZygnaW5pdGlhbGl6aW5nIEF1dGhlbnRpY2F0aW9uSW50ZXJjZXB0b3InKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyByZXF1ZXN0ID0gKHJlcXVlc3RTdWNjZXNzKTogbmcuSVByb21pc2U8YW55PiA9PiB7CisgICAgICAgICAgICByZXF1ZXN0U3VjY2Vzcy5oZWFkZXJzWydYLUVDT01QLVJlcXVlc3RJRCddID0gdGhpcy51dWlkNC5nZW5lcmF0ZSgpOworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBGb3IgZXZlcnkgcmVxdWVzdCB0byB0aGUgc2VydmVyLCB0aGF0IHRoZSBzZXJ2aWNlIGlkLCBvciByZXNvdXJjZSBpZCBpcyBzZW50IGluIHRoZSBVUkwsIG5lZWQgdG8gcGFzcyBVVUlEIGluIHRoZSBoZWFkZXIuCisgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGUgdW5pcXVlIGlkIGV4aXN0cyBpbiB1dWlkTWFwLCBhbmQgaWYgc28gZ2V0IHRoZSBVVUlEIGFuZCBhZGQgaXQgdG8gdGhlIGhlYWRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbGV0IG1hcDogVXRpbHMuRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gPSB0aGlzLnNoYXJpbmdTZXJ2aWNlLmdldFV1aWRNYXAoKTsKKyAgICAgICAgICAgIGlmIChtYXAgJiYgcmVxdWVzdFN1Y2Nlc3MudXJsLmluZGV4T2YodGhpcy5zZGNDb25maWcuYXBpLnJvb3QpID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCJ1cmw6ICIgKyByZXF1ZXN0U3VjY2Vzcy51cmwpOworICAgICAgICAgICAgICAgIG1hcC5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4geworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFN1Y2Nlc3MudXJsLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdWNjZXNzLmhlYWRlcnNbJ1gtRUNPTVAtU2VydmljZUlEJ10gPSB0aGlzLnNoYXJpbmdTZXJ2aWNlLmdldFV1aWRWYWx1ZShrZXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFN1Y2Nlc3M7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHJlc3BvbnNlID0gKHJlc3BvbnNlU3VjY2Vzcyk6IG5nLklQcm9taXNlPGFueT4gPT4geworICAgICAgICAgICAgbGV0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlU3VjY2Vzcy5kYXRhOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YSkgeworICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2VEYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiAoZGF0YS5pbmRleE9mKCJHbG9iYWwgTG9nb246IExvZ2luIikgPiAwKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRsb2NhdGlvbi5wYXRoKCdkYXNoYm9hcmQvd2VsY29tZScpOworICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlU3VjY2VzczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvaHR0cC1lcnJvci1pbnRlcmNlcHRvci50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvaHR0cC1lcnJvci1pbnRlcmNlcHRvci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ2NTlkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9odHRwLWVycm9yLWludGVyY2VwdG9yLnRzCkBAIC0wLDAgKzEsMTE4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIEh0dHBFcnJvckludGVyY2VwdG9yIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyAkaW5qZWN0ID0gWyckaW5qZWN0b3InLCAnJHEnXTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnkoJGluamVjdG9yOiBuZy5hdXRvLklJbmplY3RvclNlcnZpY2UsICRxOiBhbmd1bGFyLklRU2VydmljZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwRXJyb3JJbnRlcmNlcHRvcigkaW5qZWN0b3IsICRxKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJGluamVjdG9yOiBuZy5hdXRvLklJbmplY3RvclNlcnZpY2UsIHByaXZhdGUgJHE6IGFuZ3VsYXIuSVFTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZm9ybWF0TWVzc2FnZUFycmF5cyA9IChtZXNzYWdlOiBzdHJpbmcsIHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPik9PiB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cWyUoXGQrKVxdL2csIGZ1bmN0aW9uIChfLCBtKSB7CisgICAgICAgICAgICAgICAgbGV0IHRtcCA9IFtdOworICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gdmFyaWFibGVzWy0tbV0uc3BsaXQoIjsiKTsKKyAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wLnB1c2goIjxsaT4iICsgaXRlbSArICI8L2xpPiIpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiAiPHVsPiIgKyB0bXAuam9pbigiIikgKyAiPC91bD4iOworICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHJlc3BvbnNlRXJyb3IgPSAocmVqZWN0aW9uOiBhbnkpPT4geworCisgICAgICAgICAgICBsZXQgdGV4dDogc3RyaW5nOworICAgICAgICAgICAgbGV0IHZhcmlhYmxlczsKKyAgICAgICAgICAgIGxldCBtZXNzYWdlSWQ6IHN0cmluZyA9ICIiOworICAgICAgICAgICAgbGV0IGlzS25vd25FeGNlcHRpb24gPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHJlamVjdGlvbi5kYXRhICYmIHJlamVjdGlvbi5kYXRhLnNlcnZpY2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gcmVqZWN0aW9uLmRhdGEuc2VydmljZUV4Y2VwdGlvbi50ZXh0OworICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IHJlamVjdGlvbi5kYXRhLnNlcnZpY2VFeGNlcHRpb24udmFyaWFibGVzOworICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCA9IHJlamVjdGlvbi5kYXRhLnNlcnZpY2VFeGNlcHRpb24ubWVzc2FnZUlkOworICAgICAgICAgICAgICAgIGlzS25vd25FeGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3Rpb24uZGF0YSAmJiByZWplY3Rpb24uZGF0YS5yZXF1ZXN0RXJyb3IgJiYgcmVqZWN0aW9uLmRhdGEucmVxdWVzdEVycm9yLnNlcnZpY2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gcmVqZWN0aW9uLmRhdGEucmVxdWVzdEVycm9yLnNlcnZpY2VFeGNlcHRpb24udGV4dDsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSByZWplY3Rpb24uZGF0YS5yZXF1ZXN0RXJyb3Iuc2VydmljZUV4Y2VwdGlvbi52YXJpYWJsZXM7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gcmVqZWN0aW9uLmRhdGEucmVxdWVzdEVycm9yLnNlcnZpY2VFeGNlcHRpb24ubWVzc2FnZUlkOworICAgICAgICAgICAgICAgIGlzS25vd25FeGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3Rpb24uZGF0YSAmJiByZWplY3Rpb24uZGF0YS5yZXF1ZXN0RXJyb3IgJiYgcmVqZWN0aW9uLmRhdGEucmVxdWVzdEVycm9yLnBvbGljeUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRleHQgPSByZWplY3Rpb24uZGF0YS5yZXF1ZXN0RXJyb3IucG9saWN5RXhjZXB0aW9uLnRleHQ7CisgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gcmVqZWN0aW9uLmRhdGEucmVxdWVzdEVycm9yLnBvbGljeUV4Y2VwdGlvbi52YXJpYWJsZXM7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gcmVqZWN0aW9uLmRhdGEucmVxdWVzdEVycm9yLnBvbGljeUV4Y2VwdGlvbi5tZXNzYWdlSWQ7CisgICAgICAgICAgICAgICAgaXNLbm93bkV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5kYXRhKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9ICdXcm9uZyBlcnJvciBmb3JtYXQgZnJvbSBzZXJ2ZXInOworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGV4dCk7CisgICAgICAgICAgICAgICAgaXNLbm93bkV4Y2VwdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgZGF0YTogU2RjLlZpZXdNb2RlbHMuSVNlcnZlck1lc3NhZ2VNb2RhbE1vZGVsOworICAgICAgICAgICAgaWYgKGlzS25vd25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlICJFcnJvcjogIiB0ZXh0IGF0IHRoZSBiZWdpbmluZworICAgICAgICAgICAgICAgIGlmICh0ZXh0LnRyaW0oKS5pbmRleE9mKCJFcnJvcjoiKSA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCJFcnJvcjoiLCAiIikudHJpbSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vbXNoaXRyaXQgREUxOTk4OTUgYnVnIGZpeAorICAgICAgICAgICAgICAgIGxldCBjb3VudDogbnVtYmVyID0gMDsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNbY291bnRdID0gaXRlbSA/IGl0ZW0ucmVwbGFjZSgnPCcsICcmbHQnKS5yZXBsYWNlKCc+JywgJyZndCcpIDogJyc7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAvLyBGb3JtYXQgdGhlIG1lc3NhZ2UgaW4gY2FzZSBoYXMgYXJyYXkgdG8gPHVsPjxsaT4KKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGhpcy5mb3JtYXRNZXNzYWdlQXJyYXlzKHRleHQsIHZhcmlhYmxlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBGb3JtYXQgdGhlIG1lc3NhZ2UgJTEgJTIKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5mb3JtYXQodmFyaWFibGVzKTsKKworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gaW5qZWN0IHRoZSBNZXNzYWdlU2VydmljZSBtYW51YWxseSB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY2llcyAoYmVjYXVzZSBNZXNzYWdlU2VydmljZSB1c2UgJHRlbXBsYXRlQ2FjaGUgdGhhdCB1c2UgJGh0dHApLgorICAgICAgICAgICAgICAgIGRhdGEgPSB7CisgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IG1lc3NhZ2VJZCwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZWplY3Rpb24uc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogVXRpbHMuQ29uc3RhbnRzLlNFVkVSSVRZLkVSUk9SCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBpbmplY3QgdGhlIE1lc3NhZ2VTZXJ2aWNlIG1hbnVhbGx5IHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIChiZWNhdXNlIE1lc3NhZ2VTZXJ2aWNlIHVzZSAkdGVtcGxhdGVDYWNoZSB0aGF0IHVzZSAkaHR0cCkuCisgICAgICAgICAgICAgICAgZGF0YSA9IHsKKyAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlamVjdGlvbi5zdGF0dXMgIT09IC0xID8gcmVqZWN0aW9uLnN0YXR1c1RleHQgOiAiRXJyb3IgZ2V0dGluZyByZXNwb25zZSBmcm9tIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogbWVzc2FnZUlkLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlamVjdGlvbi5zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiBVdGlscy5Db25zdGFudHMuU0VWRVJJVFkuRVJST1IKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgbW9kYWxzSGFuZGxlciA9IHRoaXMuJGluamVjdG9yLmdldCgnTW9kYWxzSGFuZGxlcicpOworICAgICAgICAgICAgbW9kYWxzSGFuZGxlci5vcGVuU2VydmVyTWVzc2FnZU1vZGFsKGRhdGEpOworCisgICAgICAgICAgICByZXR1cm4gdGhpcy4kcS5yZWplY3QocmVqZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvbG9hZGVyLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2xvYWRlci1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMWExZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL2xvYWRlci1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMy8xMy8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlNlcnZpY2VzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgTG9hZGVyU2VydmljZSB7CisKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV2ZW50TGlzdGVuZXJTZXJ2aWNlOiBTZXJ2aWNlcy5FdmVudExpc3RlbmVyU2VydmljZSkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc2hvd0xvYWRlciguLi5hcmdzKSB7CisgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLm5vdGlmeU9ic2VydmVycyhVdGlscy5Db25zdGFudHMuRVZFTlRTLlNIT1dfTE9BREVSX0VWRU5ULCAuLi5hcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBoaWRlTG9hZGVyKC4uLmFyZ3MpIHsKKyAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuSElERV9MT0FERVJfRVZFTlQsIC4uLmFyZ3MpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBMb2FkZXJTZXJ2aWNlLiRpbmplY3QgPSBbJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJ107Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL29uYm9hcmRpbmctc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvb25ib2FyZGluZy1zZXJ2aWNlLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTg3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL29uYm9hcmRpbmctc2VydmljZS50cwpAQCAtMCwwICsxLDEwMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworCisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElPbmJvYXJkaW5nU2VydmljZSB7CisgICAgICAgIGdldE9uYm9hcmRpbmdDb21wb25lbnRzKCk6IG5nLklQcm9taXNlPEFycmF5PE1vZGVscy5Db21wb25lbnRzLklDb21wb25lbnQ+PjsKKyAgICAgICAgZ2V0Q29tcG9uZW50RnJvbUNzYXJVdWlkKGNzYXJVdWlkOnN0cmluZyk6IG5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD47CisgICAgICAgIGRvd25sb2FkT25ib2FyZGluZ0NzYXIocGFja2FnZUlkOnN0cmluZyk6bmcuSVByb21pc2U8TW9kZWxzLklGaWxlRG93bmxvYWQ+OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBPbmJvYXJkaW5nU2VydmljZSBpbXBsZW1lbnRzIElPbmJvYXJkaW5nU2VydmljZSB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsnJGh0dHAnLCAnJHEnLCAnc2RjQ29uZmlnJywgJ0NvbXBvbmVudEZhY3RvcnknXTsKKyAgICAgICAgcHJpdmF0ZSBhcGk6TW9kZWxzLklBcGk7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkaHR0cDpuZy5JSHR0cFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHE6bmcuSVFTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tcG9uZW50RmFjdG9yeTogU2RjLlV0aWxzLkNvbXBvbmVudEZhY3RvcnkKKyAgICAgICAgKSB7CisgICAgICAgICAgICB0aGlzLmFwaSA9IHNkY0NvbmZpZy5hcGk7CisgICAgICAgIH0KKworICAgICAgICBnZXRPbmJvYXJkaW5nQ29tcG9uZW50cyA9ICgpOm5nLklQcm9taXNlPEFycmF5PE1vZGVscy5Db21wb25lbnRzLklDb21wb25lbnQ+PiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXIgPSB0aGlzLiRxLmRlZmVyPEFycmF5PE1vZGVscy5Db21wb25lbnRzLklDb21wb25lbnQ+PigpOworICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy5hcGkuR0VUX29uYm9hcmRpbmcpCisgICAgICAgICAgICAgICAgLnN1Y2Nlc3MoKHJlc3BvbnNlOmFueSkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgb25ib2FyZGluZ0NvbXBvbmVudHM6QXJyYXk8TW9kZWxzLklDc2FyQ29tcG9uZW50PiA9IHJlc3BvbnNlLnJlc3VsdHM7CisgICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRzTGlzdDpBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5JQ29tcG9uZW50PiA9IG5ldyBBcnJheSgpOworCisgICAgICAgICAgICAgICAgICAgIG9uYm9hcmRpbmdDb21wb25lbnRzLmZvckVhY2goKG9iYzogTW9kZWxzLklDc2FyQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVGcm9tQ3NhckNvbXBvbmVudChvYmMpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c0xpc3QucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKGNvbXBvbmVudHNMaXN0KTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5lcnJvcigocmVzcG9uc2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7CisgICAgICAgIH07CisKKyAgICAgICAgZG93bmxvYWRPbmJvYXJkaW5nQ3NhciA9IChwYWNrYWdlSWQ6c3RyaW5nKTpuZy5JUHJvbWlzZTxNb2RlbHMuSUZpbGVEb3dubG9hZD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVyID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgdGhpcy4kaHR0cCh7CisgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy5hcGkuR0VUX29uYm9hcmRpbmcgKyAiLyIgKyBwYWNrYWdlSWQsCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogImdldCIsCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImJsb2IiCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuc3VjY2VzcygocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVyLnJlc29sdmUocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmVycm9yKChlcnIpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVqZWN0KGVycik7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZlci5wcm9taXNlOworICAgICAgICB9OworCisgICAgICAgIGdldENvbXBvbmVudEZyb21Dc2FyVXVpZCA9IChjc2FyVXVpZDpzdHJpbmcpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPT4geworICAgICAgICAgICAgbGV0IGRlZmVyID0gdGhpcy4kcS5kZWZlcjxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+KCk7CisgICAgICAgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLmFwaS5yb290ICsgdGhpcy5hcGkuR0VUX2NvbXBvbmVudF9mcm9tX2NzYXJfdXVpZC5yZXBsYWNlKCc6Y3Nhcl91dWlkJywgY3NhclV1aWQpKQorICAgICAgICAgICAgICAgIC5zdWNjZXNzKChyZXNwb25zZTphbnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBpcyA0MDAsIHRoaXMgbWVhbnMgdGhhdCB0aGUgY29tcG9uZW50IG5vdCBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSSBkbyBub3Qgd2FudCB0byByZXR1cm4gZXJyb3IgZnJvbSBzZXJ2ZXIsIGJlY2F1c2UgYSBwb3B1cCB3aWxsIGFwcGVhciBpbiBjbGllbnQgd2l0aCB0aGUgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgIC8vIFNvIHJldHVybmluZyBzdWNjZXNzICgyMDApIHdpdGggc3RhdHVzIDQwMC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyE9PTQwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gbmV3IE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlKG51bGwsIHRoaXMuJHEsIDxNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZT5yZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmZXIucmVzb2x2ZShjb21wb25lbnQpOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmVycm9yKChyZXNwb25zZSkgPT4geworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZWplY3QocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gZGVmZXIucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvcHJvZ3Jlc3Mtc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvcHJvZ3Jlc3Mtc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWE0NjNmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9wcm9ncmVzcy1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsMTEyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA3LzcvMjAxNi4KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA3LzQvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcyB7CisKKyAgICAndXNlIHN0cmljdCc7CisgICBpbXBvcnQgSUludGVydmFsU2VydmljZSA9IGFuZ3VsYXIuSUludGVydmFsU2VydmljZTsKKworICAgIGV4cG9ydCBjbGFzcyBQcm9ncmVzc1NlcnZpY2UgeworCisgICAgICAgIHB1YmxpYyBwcm9ncmVzc2VzOmFueSA9IHt9OworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJyRpbnRlcnZhbCddOworCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgcHJvdGVjdGVkICRpbnRlcnZhbDphbnkKKyAgICAgICAgKSB7fQorCisgICAgICAgIHByaXZhdGUgdG90YWxQcm9ncmVzczpudW1iZXIgPSA5MDsKKyAgICAgICAgcHJpdmF0ZSBzdGFydFByb2dyZXNzOm51bWJlciA9IDEwOworICAgICAgICBwcml2YXRlIG9uZVBlcmNlbnRJbnRlcnZhbFNlY29uZHM6bnVtYmVyID0gNTsKKyAgICAgICAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRJbnRlcnZhbDsKKworICAgICAgICBwdWJsaWMgc2V0UHJvZ3Jlc3NWYWx1ZShuYW1lOnN0cmluZywgdmFsdWU6bnVtYmVyKTp2b2lkIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5wcm9ncmVzc2VzW25hbWVdKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc2VzW25hbWVdPXt9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5wcm9ncmVzc2VzW25hbWVdLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0UHJvZ3Jlc3NWYWx1ZShuYW1lOnN0cmluZyk6bnVtYmVyeworICAgICAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3Nlc1tuYW1lXSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3Nlc1tuYW1lXS52YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGRlbGV0ZVByb2dyZXNzVmFsdWUobmFtZTpzdHJpbmcpOnZvaWR7CisgICAgICAgICAgICB0aGlzLnN0b3BDcmVhdGVDb21wb25lbnRJbnRlcnZhbCgpOworICAgICAgICAgICAgZGVsZXRlIHRoaXMucHJvZ3Jlc3Nlc1tuYW1lXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBzdG9wQ3JlYXRlQ29tcG9uZW50SW50ZXJ2YWwgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgdGhpcy4kaW50ZXJ2YWwuY2FuY2VsKHRoaXMuY3JlYXRlQ29tcG9uZW50SW50ZXJ2YWwpOworICAgICAgICB9OworCisKKworICAgICAgICBwdWJsaWMgaW5pdENyZWF0ZUNvbXBvbmVudFByb2dyZXNzID0gKGNvbXBvbmVudElkOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICB2YXIgcHJvZ3Jlc3NWYWx1ZTpudW1iZXIgPSB0aGlzLnN0YXJ0UHJvZ3Jlc3M7CisgICAgICAgICAgICAgaWYoIXRoaXMuZ2V0UHJvZ3Jlc3NWYWx1ZShjb21wb25lbnRJZCkpeworICAgICAgICAgICAgICAgICB0aGlzLnN0b3BDcmVhdGVDb21wb25lbnRJbnRlcnZhbCgpOworICAgICAgICAgICAgICAgICB0aGlzLnNldFByb2dyZXNzVmFsdWUoY29tcG9uZW50SWQsIHRoaXMuc3RhcnRQcm9ncmVzcyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29tcG9uZW50SW50ZXJ2YWwgPSB0aGlzLiRpbnRlcnZhbCgoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyByZXBsYWNlIGdldFByb2dyZXNzTW9ja0RhdGEgdG8gcmVhbCBkYXRhIGFmdGVyIEJFIHByb3ZpZGUgdGhlIEFQSQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzVmFsdWUgPSB0aGlzLmdldFByb2dyZXNzTW9ja0RhdGEoY29tcG9uZW50SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzVmFsdWU8PXRoaXMudG90YWxQcm9ncmVzcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFByb2dyZXNzVmFsdWUoY29tcG9uZW50SWQsIHByb2dyZXNzVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDdXJyZW50bHkgdGhlIHByb2dyZXNzIGlzIG5vdCByZWFsbHkgY2hlY2tpbmcgYWdhaW5zdCB0aGUgQkUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU28gdGhlIHByb2dyZXNzIGNhbiBwYXNzIDEwMC4gU28gdGhlIHdvcmthcm91bmQgZm9yIG5vdywgaW4gY2FzZSB3ZSBwYXNzIDkwICh0b3RhbFByb2dyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0b3AgdGhlIGludGVydmFsLCBzbyB0aGUgcHJvZ3Jlc3Mgd2lsbCBiZSBrZXB0IGF0IDkwIHVudGlsIHRoZSBwcm9taXNlIHdpbGwgcmV0dXJuIHZhbHVlIGFuZCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcHJvZ3Jlc3MgdG8gMTAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUHJvZ3Jlc3NWYWx1ZShjb21wb25lbnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMub25lUGVyY2VudEludGVydmFsU2Vjb25kcyoxMDAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworCisgICAgICAgIHByaXZhdGUgZ2V0UHJvZ3Jlc3NNb2NrRGF0YSA9KGlkOnN0cmluZyk6bnVtYmVyID0+eworICAgICAgICAgICB2YXIgcHJvZ3Jlc3NWYWx1ZSA9IHRoaXMuZ2V0UHJvZ3Jlc3NWYWx1ZShpZCk7CisgICAgICAgICAgICBpZihwcm9ncmVzc1ZhbHVlPjApeworICAgICAgICAgICAgICAgIHByb2dyZXNzVmFsdWUgPSBwcm9ncmVzc1ZhbHVlICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vaWYgbm90IGZpbmlzaCBhbHdheXMgc3RheSBvbiA5MCUKKyAgICAgICAgICAgIGlmIChwcm9ncmVzc1ZhbHVlPjkwKXsKKyAgICAgICAgICAgICAgICBwcm9ncmVzc1ZhbHVlID05MDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzVmFsdWU7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvcmVsYXRpb24taWNvbnMtc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvcmVsYXRpb24taWNvbnMtc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNiNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9yZWxhdGlvbi1pY29ucy1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlNlcnZpY2VzIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIGV4cG9ydCBpbnRlcmZhY2UgSVJlbGF0aW9uSWNvbnNTZXJ2aWNlIHsKKyAgICAgIGdldEljb25QYXRoKGljb25OYW1lOnN0cmluZyk6c3RyaW5nOworICB9CisKKyAgZXhwb3J0IGNsYXNzIFJlbGF0aW9uSWNvbnNTZXJ2aWNlIGltcGxlbWVudHMgSVJlbGF0aW9uSWNvbnNTZXJ2aWNlIHsKKyAgICAgIGNvbnN0cnVjdG9yKCkge30KKyAgICAgIHByaXZhdGUgaWNvbnM6IEFycmF5PHN0cmluZz4gPSBbCisgICAgICAgICAgJ0F0dGFjaGVzVG8nLAorICAgICAgICAgICdCaW5kc1RvJywKKyAgICAgICAgICAnRGVwZW5kc09uJywKKyAgICAgICAgICAnSG9zdGVkT24nLAorICAgICAgICAgICdMaW5rc1RvJywKKyAgICAgICAgICAnUm91dGVzVG8nCisgICAgICBdOworCisgICAgICBwdWJsaWMgZ2V0SWNvblBhdGggPSAocmVsYXRpb25zaGlwVHlwZTpzdHJpbmcpOiBzdHJpbmcgPT4geworICAgICAgICBsZXQgcmVzdWx0OnN0cmluZyA9ICdDb25uZWN0ZWRUbyc7CisgICAgICAgIGxldCBiYXNlVXJsOnN0cmluZyA9ICAnL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zLyc7CisKKyAgICAgICAgICBpZiAocmVsYXRpb25zaGlwVHlwZSkgeworICAgICAgICAgICAgICBsZXQgYXJyID0gcmVsYXRpb25zaGlwVHlwZS5zcGxpdCgnLicpOyAvLyBsb29rcyBsaWtlIHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlID0gYXJyW2Fyci5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgICAgaWYgKHRoaXMuaWNvbnMuaW5kZXhPZihyZWxhdGlvbnNoaXBUeXBlKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWxhdGlvbnNoaXBUeXBlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmKCdMaW5rc1RvJz09cmVzdWx0KXsKKyAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmFzZVVybCArIHJlc3VsdCArICcuc3ZnJzsKKyAgICAgIH0KKworICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL3NkYy12ZXJzaW9uLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL3NkYy12ZXJzaW9uLXNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0NDM4MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvc2RjLXZlcnNpb24tc2VydmljZS50cwpAQCAtMCwwICsxLDQ4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5TZXJ2aWNlcyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJU2RjVmVyc2lvblNlcnZpY2UgeworICAgICAgICBnZXRWZXJzaW9uKCk6bmcuSVByb21pc2U8YW55PjsKKyAgICB9CisgICAgZXhwb3J0IGNsYXNzIFNkY1ZlcnNpb25TZXJ2aWNlIGltcGxlbWVudHMgSVNkY1ZlcnNpb25TZXJ2aWNleworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJyRodHRwJywgJyRxJywnc2RjQ29uZmlnJ107CisgICAgICAgIHByaXZhdGUgYXBpOiBNb2RlbHMuSUFwaTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRodHRwOiBuZy5JSHR0cFNlcnZpY2UsIHByaXZhdGUgJHE6IG5nLklRU2VydmljZSwgc2RjQ29uZmlnOiBNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24peworICAgICAgICAgICAgdGhpcy5hcGkgPSBzZGNDb25maWcuYXBpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGdldFZlcnNpb24oKTpuZy5JUHJvbWlzZTxhbnk+eworICAgICAgICAgICAgbGV0IGRlZmVyID0gdGhpcy4kcS5kZWZlcjxBcnJheTxNb2RlbHMuRGlzdHJpYnV0aW9uPj4oKTsKKyAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmFwaS5yb290ICsgdGhpcy5hcGkuR0VUX1NEQ19WZXJzaW9uOworICAgICAgICAgICAgY29uc29sZS5sb2coIj09PT09PT09PT09PT09PT09PT09PT0+IiArIHVybCk7CisgICAgICAgICAgICB0aGlzLiRodHRwLmdldCh1cmwpCisgICAgICAgICAgICAgICAgLnN1Y2Nlc3MoKHZlcnNpb246IGFueSkgPT4geworICAgICAgICAgICAgICAgICAgICBkZWZlci5yZXNvbHZlKHZlcnNpb24pOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvc2hhcmluZy1zZXJ2aWNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy9zaGFyaW5nLXNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjMzE1OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvc2hhcmluZy1zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlNlcnZpY2VzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgU2hhcmluZ1NlcnZpY2UgeworCisgICAgICAgIHByaXZhdGUgdXVpZE1hcDogVXRpbHMuRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gPSBuZXcgVXRpbHMuRGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPigpOworCisgICAgICAgIHB1YmxpYyBnZXRVdWlkVmFsdWUgPSAodW5pcXVlSWQ6c3RyaW5nKTpzdHJpbmcgPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMudXVpZE1hcC5nZXRWYWx1ZSh1bmlxdWVJZCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGFkZFV1aWRWYWx1ZSA9ICh1bmlxdWVJZDpzdHJpbmcsIHV1aWQ6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMudXVpZE1hcC5zZXRWYWx1ZSh1bmlxdWVJZCwgdXVpZCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldFV1aWRNYXAgPSAoKTpVdGlscy5EaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiA9PiB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy51dWlkTWFwOworICAgICAgICB9OworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy91cmwtdG9iYXNlNjQtc2VydmljZS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvdXJsLXRvYmFzZTY0LXNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2OTgwZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvc2VydmljZXMvdXJsLXRvYmFzZTY0LXNlcnZpY2UudHMKQEAgLTAsMCArMSw1MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuU2VydmljZXMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVVybFRvQmFzZTY0U2VydmljZSB7CisgICAgICAgIGRvd25sb2FkVXJsKHVybDpzdHJpbmcsIGNhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBVcmxUb0Jhc2U2NFNlcnZpY2UgaW1wbGVtZW50cyBJVXJsVG9CYXNlNjRTZXJ2aWNlIHsKKyAgICAgICAgY29uc3RydWN0b3IoKSB7fQorCisgICAgICAgIHB1YmxpYyBkb3dubG9hZFVybCA9ICh1cmw6c3RyaW5nLCBjYWxsYmFjazpGdW5jdGlvbik6IHZvaWQgPT4geworICAgICAgICAgICAgbGV0IHhociA6YW55ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcmVhZGVyICA9IG5ldyBGaWxlUmVhZGVyKCk7CisgICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZWFkZXIucmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh4aHIucmVzcG9uc2UpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpOworICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJzsKKyAgICAgICAgICAgIHhoci5zZW5kKCk7CisgICAgICAgIH0KKworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy91c2VyLXJlc291cmNlLXNlcnZpY2UudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3NlcnZpY2VzL3VzZXItcmVzb3VyY2Utc2VydmljZS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDE0ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy9zZXJ2aWNlcy91c2VyLXJlc291cmNlLXNlcnZpY2UudHMKQEAgLTAsMCArMSwxMjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlNlcnZpY2VzIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8vIERlZmluZSBhbiBpbnRlcmZhY2Ugb2YgdGhlIG9iamVjdCB5b3Ugd2FudCB0byB1c2UsIHByb3ZpZGluZyBpdCdzIHByb3BlcnRpZXMKKyAgZXhwb3J0IGludGVyZmFjZSBJVXNlclJlc291cmNlIGV4dGVuZHMgTW9kZWxzLklVc2VyUHJvcGVydGllcyxuZy5yZXNvdXJjZS5JUmVzb3VyY2U8SVVzZXJSZXNvdXJjZT57CisKKyAgfQorCisgIC8vIERlZmluZSB5b3VyIHJlc291cmNlLCBhZGRpbmcgdGhlIHNpZ25hdHVyZSBvZiB0aGUgY3VzdG9tIGFjdGlvbnMKKyAgZXhwb3J0IGludGVyZmFjZSBJVXNlclJlc291cmNlQ2xhc3MgZXh0ZW5kcyBuZy5yZXNvdXJjZS5JUmVzb3VyY2VDbGFzczxJVXNlclJlc291cmNlPnsKKyAgICBhdXRob3JpemUoKTogSVVzZXJSZXNvdXJjZTsKKyAgICBnZXRMb2dnZWRpblVzZXIoKTogSVVzZXJSZXNvdXJjZTsKKyAgICBzZXRMb2dnZWRpblVzZXIodXNlcjogSVVzZXJSZXNvdXJjZSk6IHZvaWQ7CisgICAgZ2V0QWxsVXNlcnMoc3VjY2Vzcz86IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogQXJyYXk8SVVzZXJSZXNvdXJjZT47CisgICAgY3JlYXRlVXNlcihJUmVzb3VyY2VSZXNvdXJjZSwgc3VjY2Vzcz86IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogdm9pZDsKKyAgICBlZGl0VXNlclJvbGUoSVJlc291cmNlUmVzb3VyY2UsIHN1Y2Nlc3M/OiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IHZvaWQ7CisgICAgZGVsZXRlVXNlcihJUmVzb3VyY2VSZXNvdXJjZSwgc3VjY2Vzcz86IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogdm9pZDsKKyAgfQorCisgIGV4cG9ydCBjbGFzcyBVc2VyUmVzb3VyY2VTZXJ2aWNleworCisgICAgcHVibGljIHN0YXRpYyBnZXRSZXNvdXJjZSA9ICgKKyAgICAgICRyZXNvdXJjZTogbmcucmVzb3VyY2UuSVJlc291cmNlU2VydmljZSwKKyAgICAgIHNkY0NvbmZpZzogTW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgY29va2llU2VydmljZTogU2VydmljZXMuQ29va2llU2VydmljZQorICAgICk6IElVc2VyUmVzb3VyY2VDbGFzcyA9PiB7CisKKyAgICAgIGxldCB1cmw6IHN0cmluZyA9IHNkY0NvbmZpZy5hcGkucm9vdCtzZGNDb25maWcuYXBpLkdFVF91c2VyOworICAgICAgbGV0IGF1dGhvcml6ZVVybDogc3RyaW5nID0gc2RjQ29uZmlnLmFwaS5yb290K3NkY0NvbmZpZy5hcGkuR0VUX3VzZXJfYXV0aG9yaXplOworICAgICAgbGV0IGF1dGhvcml6ZUFjdGlvbkhlYWRlcnM6IGFueSA9IHt9OworICAgICAgbGV0IGNvb2tpZTogTW9kZWxzLklDb29raWUgPSBzZGNDb25maWcuY29va2llOworICAgICAgYXV0aG9yaXplQWN0aW9uSGVhZGVyc1tjb29raWUudXNlckZpcnN0TmFtZV0gPSBjb29raWVTZXJ2aWNlLmdldEZpcnN0TmFtZSgpOworICAgICAgYXV0aG9yaXplQWN0aW9uSGVhZGVyc1tjb29raWUudXNlckxhc3ROYW1lXSA9IGNvb2tpZVNlcnZpY2UuZ2V0TGFzdE5hbWUoKTsKKyAgICAgIGF1dGhvcml6ZUFjdGlvbkhlYWRlcnNbY29va2llLnVzZXJFbWFpbF0gPSBjb29raWVTZXJ2aWNlLmdldEVtYWlsKCk7CisgICAgICBhdXRob3JpemVBY3Rpb25IZWFkZXJzW2Nvb2tpZS51c2VySWRTdWZmaXhdID0gY29va2llU2VydmljZS5nZXRVc2VySWQoKTsKKworICAgICAgLy8gRGVmaW5lIHlvdXIgY3VzdG9tIGFjdGlvbnMgaGVyZSBhcyBJQWN0aW9uRGVzY3JpcHRvcgorICAgICAgbGV0IGF1dGhvcml6ZUFjdGlvbiA6IG5nLnJlc291cmNlLklBY3Rpb25EZXNjcmlwdG9yID0geworICAgICAgICAgbWV0aG9kOiAnR0VUJywKKyAgICAgICAgIGlzQXJyYXk6IGZhbHNlLAorICAgICAgICAgdXJsOiBhdXRob3JpemVVcmwsCisgICAgICAgICBoZWFkZXJzOiBhdXRob3JpemVBY3Rpb25IZWFkZXJzCisgICAgICB9OworCisgICAgICAgIGxldCBnZXRBbGxVc2VycyA6IG5nLnJlc291cmNlLklBY3Rpb25EZXNjcmlwdG9yID0geworICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKKyAgICAgICAgICAgIGlzQXJyYXk6IHRydWUsCisgICAgICAgICAgICB1cmw6IHNkY0NvbmZpZy5hcGkucm9vdCArIHNkY0NvbmZpZy5hcGkuR0VUX2FsbF91c2VycworICAgICAgICB9OworCisgICAgICAgIGxldCBlZGl0VXNlclJvbGUgOiBuZy5yZXNvdXJjZS5JQWN0aW9uRGVzY3JpcHRvciA9IHsKKyAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAorICAgICAgICAgICAgaXNBcnJheTogZmFsc2UsCisgICAgICAgICAgICB1cmw6IHNkY0NvbmZpZy5hcGkucm9vdCArIHNkY0NvbmZpZy5hcGkuUE9TVF9lZGl0X3VzZXJfcm9sZSwKKyAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IChkYXRhLCBoZWFkZXJzKT0+eworICAgICAgICAgICAgICAgIGRhdGEucGF5bG9hZERhdGEgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkTmFtZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGRlbGV0ZVVzZXIgOiBuZy5yZXNvdXJjZS5JQWN0aW9uRGVzY3JpcHRvciA9IHsKKyAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsCisgICAgICAgICAgICBpc0FycmF5OiBmYWxzZSwKKyAgICAgICAgICAgIHVybDogc2RjQ29uZmlnLmFwaS5yb290ICsgc2RjQ29uZmlnLmFwaS5ERUxFVEVfZGVsZXRlX3VzZXIKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgY3JlYXRlVXNlciA6IG5nLnJlc291cmNlLklBY3Rpb25EZXNjcmlwdG9yID0geworICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgICAgICAgICBpc0FycmF5OiBmYWxzZSwKKyAgICAgICAgICAgIHVybDogc2RjQ29uZmlnLmFwaS5yb290ICsgc2RjQ29uZmlnLmFwaS5QT1NUX2NyZWF0ZV91c2VyLAorICAgICAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogKGRhdGEsIGhlYWRlcnMpPT57CisgICAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkRGF0YSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBkYXRhLnBheWxvYWROYW1lID0gdW5kZWZpbmVkOworICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIGxldCB1c2VyUmVzb3VyY2U6IElVc2VyUmVzb3VyY2VDbGFzcyA9IDxJVXNlclJlc291cmNlQ2xhc3M+JHJlc291cmNlKAorICAgICAgICB1cmwsCisgICAgICAgIHsgaWQ6ICdAaWQnfSwKKyAgICAgICAgeworICAgICAgICAgYXV0aG9yaXplOiBhdXRob3JpemVBY3Rpb24sCisgICAgICAgICBnZXRBbGxVc2VyczogZ2V0QWxsVXNlcnMsCisgICAgICAgICBjcmVhdGVVc2VyOiBjcmVhdGVVc2VyLAorICAgICAgICAgZWRpdFVzZXJSb2xlOmVkaXRVc2VyUm9sZSwKKyAgICAgICAgIGRlbGV0ZVVzZXI6ZGVsZXRlVXNlcn0KKyAgICAgICk7CisKKyAgICAgIGxldCBfbG9nZ2VkaW5Vc2VyOiBJVXNlclJlc291cmNlOworCisgICAgICB1c2VyUmVzb3VyY2UuZ2V0TG9nZ2VkaW5Vc2VyID0gKCkgPT4geworICAgICAgICByZXR1cm4gX2xvZ2dlZGluVXNlcjsKKyAgICAgIH07CisKKyAgICAgIHVzZXJSZXNvdXJjZS5zZXRMb2dnZWRpblVzZXIgPSAobG9nZ2VkaW5Vc2VyOiBJVXNlclJlc291cmNlKSA9PiB7CisgICAgICAgIF9sb2dnZWRpblVzZXIgPSBsb2dnZWRpblVzZXI7CisgICAgICB9OworCisgICAgICByZXR1cm4gdXNlclJlc291cmNlOworICAgIH0KKyAgfQorICBVc2VyUmVzb3VyY2VTZXJ2aWNlLmdldFJlc291cmNlLiRpbmplY3QgPSBbJyRyZXNvdXJjZScsICdzZGNDb25maWcnLCAnU2RjLlNlcnZpY2VzLkNvb2tpZVNlcnZpY2UnXTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvYXJ0aWZhY3RzLXV0aWxzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9hcnRpZmFjdHMtdXRpbHMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5YTBlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvYXJ0aWZhY3RzLXV0aWxzLnRzCkBAIC0wLDAgKzEsMTIxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5VdGlscyB7CisgICAgZXhwb3J0IGNsYXNzIEFydGlmYWN0c1V0aWxzIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICckbW9kYWwnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UpIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGdldEFydGlmYWN0VHlwZUJ5U3RhdGUoY3VycmVudFN0YXRlOnN0cmluZyk6c3RyaW5nIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAid29ya3NwYWNlLmNvbXBvc2l0aW9uLmxpZmVjeWNsZSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW50ZXJmYWNlIjsKKyAgICAgICAgICAgICAgICBjYXNlICJ3b3Jrc3BhY2UuY29tcG9zaXRpb24uYXBpIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJhcGkiOworICAgICAgICAgICAgICAgIGNhc2UgIndvcmtzcGFjZS5jb21wb3NpdGlvbi5kZXBsb3ltZW50IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJkZXBsb3ltZW50IjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5vcm1hbCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZ2V0VGl0bGUoYXJ0aWZhY3RUeXBlOnN0cmluZywgc2VsZWN0ZWRDb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTpzdHJpbmcgeworICAgICAgICAgICAgc3dpdGNoIChhcnRpZmFjdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlICJpbnRlcmZhY2UiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkxpZmVjeWNsZSBNYW5hZ2VtZW50IjsKKyAgICAgICAgICAgICAgICBjYXNlICJhcGkiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkFQSSBBcnRpZmFjdHMiOworICAgICAgICAgICAgICAgIGNhc2UgImRlcGxveW1lbnQiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRlcGxveW1lbnQgQXJ0aWZhY3RzIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZmlsdGVyKCJyZXNvdXJjZU5hbWUiKShzZWxlY3RlZENvbXBvbmVudC5uYW1lKSArICcgQXJ0aWZhY3RzJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHNldEFydGlmYWN0VHlwZSA9IChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCwgYXJ0aWZhY3RUeXBlOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICBzd2l0Y2ggKGFydGlmYWN0VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgImFwaSI6CisgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LmFydGlmYWN0R3JvdXBUeXBlID0gJ1NFUlZJQ0VfQVBJJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiZGVwbG95bWVudCI6CisgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LmFydGlmYWN0R3JvdXBUeXBlID0gJ0RFUExPWU1FTlQnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdC5hcnRpZmFjdEdyb3VwVHlwZSA9ICdJTkZPUk1BVElPTkFMJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGlzTGljZW5zZVR5cGUgPSAoYXJ0aWZhY3RUeXBlOnN0cmluZykgOmJvb2xlYW4gPT4geworICAgICAgICAgICAgbGV0IGlzTGljZW5zZTpib29sZWFuID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmKFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdFR5cGUuVkVORE9SX0xJQ0VOU0UgPT09IGFydGlmYWN0VHlwZSB8fCBVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlZGX0xJQ0VOU0UgPT09IGFydGlmYWN0VHlwZSkgeworICAgICAgICAgICAgICAgIGlzTGljZW5zZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpc0xpY2Vuc2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHJlbW92ZUFydGlmYWN0ID0gKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsLCBhcnRpZmFjdHNBcnI6QXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+KTp2b2lkID0+IHsKKworICAgICAgICAgICAgaWYgKCFhcnRpZmFjdC5tYW5kYXRvcnkgJiYgKFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdEdyb3VwVHlwZS5JTkZPUk1BVElPTiA9PSBhcnRpZmFjdC5hcnRpZmFjdEdyb3VwVHlwZSB8fAorICAgICAgICAgICAgICAgIFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdEdyb3VwVHlwZS5ERVBMT1lNRU5UID09IGFydGlmYWN0LmFydGlmYWN0R3JvdXBUeXBlKSkgeworICAgICAgICAgICAgICAgIF8ucmVtb3ZlKGFydGlmYWN0c0Fyciwge3VuaXF1ZUlkOiBhcnRpZmFjdC51bmlxdWVJZH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IGFydGlmYWN0VG9EZWxldGUgPSBfLmZpbmQoYXJ0aWZhY3RzQXJyLCB7dW5pcXVlSWQ6IGFydGlmYWN0LnVuaXF1ZUlkfSk7CisKKyAgICAgICAgICAgICAgICBkZWxldGUgYXJ0aWZhY3RUb0RlbGV0ZS5lc0lkOworICAgICAgICAgICAgICAgIGRlbGV0ZSBhcnRpZmFjdFRvRGVsZXRlLmRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlbGV0ZSBhcnRpZmFjdFRvRGVsZXRlLmFydGlmYWN0TmFtZTsKKyAgICAgICAgICAgICAgICBkZWxldGUgYXJ0aWZhY3RUb0RlbGV0ZS5hcGlVcmw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGFkZEFub3RoZXJBZnRlclNhdmUoc2NvcGU6U2RjLlZpZXdNb2RlbHMuSUFydGlmYWN0UmVzb3VyY2VGb3JtVmlld01vZGVsU2NvcGUpIHsKKyAgICAgICAgICAgIGxldCBuZXdBcnRpZmFjdCA9IG5ldyBNb2RlbHMuQXJ0aWZhY3RNb2RlbCgpOworICAgICAgICAgICAgdGhpcy5zZXRBcnRpZmFjdFR5cGUobmV3QXJ0aWZhY3QsIHNjb3BlLmFydGlmYWN0VHlwZSk7CisgICAgICAgICAgICBzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UgPSBuZXdBcnRpZmFjdDsKKworICAgICAgICAgICAgc2NvcGUuZm9ybXMuZWRpdEZvcm1bJ2Rlc2NyaXB0aW9uJ10uJHNldFByaXN0aW5lKCk7CisgICAgICAgICAgICBpZihzY29wZS5mb3Jtcy5lZGl0Rm9ybVsnYXJ0aWZhY3RMYWJlbCddKXsKKyAgICAgICAgICAgICAgICBzY29wZS5mb3Jtcy5lZGl0Rm9ybVsnYXJ0aWZhY3RMYWJlbCddLiRzZXRQcmlzdGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoc2NvcGUuZm9ybXMuZWRpdEZvcm1bJ3R5cGUnXSl7CisgICAgICAgICAgICAgICAgc2NvcGUuZm9ybXMuZWRpdEZvcm1bJ3R5cGUnXS4kc2V0UHJpc3RpbmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9jaGFuZ2UtbGlmZWN5Y2xlLXN0YXRlLWhhbmRsZXIudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2NoYW5nZS1saWZlY3ljbGUtc3RhdGUtaGFuZGxlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzIyYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9jaGFuZ2UtbGlmZWN5Y2xlLXN0YXRlLWhhbmRsZXIudHMKQEAgLTAsMCArMSwxNTEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvMTEvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5VdGlscyB7CisKKyAgICBleHBvcnQgY2xhc3MgQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICAgICAnc2RjTWVudScsCisgICAgICAgICAgICAnQ29tcG9uZW50RmFjdG9yeScsCisgICAgICAgICAgICAnJHRlbXBsYXRlQ2FjaGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJyRtb2RhbCcsCisgICAgICAgICAgICAnTW9kYWxzSGFuZGxlcicKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY01lbnU6TW9kZWxzLklBcHBNZW51LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEZhY3Rvcnk6IFNkYy5VdGlscy5Db21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRtb2RhbDpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNb2RhbHNIYW5kbGVyOiBVdGlscy5Nb2RhbHNIYW5kbGVyCisKKyAgICAgICAgKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIGNoYW5nZUxpZmVjeWNsZVN0YXRlICA9IChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50LCBkYXRhOmFueSwgc2NvcGU6YW55LCBvblN1Y2Nlc3NDYWxsYmFjaz86IEZ1bmN0aW9uLCBvbkVycm9yQ2FsbGJhY2s/OiBGdW5jdGlvbik6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIGxldCBzZWxmID0gdGhpczsKKworICAgICAgICAgICAgbGV0IGdldENvbnRhY3RzID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnN0cmluZyA9PnsKKyAgICAgICAgICAgICAgICBsZXQgdGVzdGVycyA9IHRoaXMuc2RjQ29uZmlnLnRlc3RlcnM7CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdDpzdHJpbmcgPSB0ZXN0ZXJzW2NvbXBvbmVudC5jb21wb25lbnRUeXBlXVtjb21wb25lbnQuY2F0ZWdvcmllc1swXS5uYW1lXT8KKyAgICAgICAgICAgICAgICAgICAgdGVzdGVyc1tjb21wb25lbnQuY29tcG9uZW50VHlwZV1bY29tcG9uZW50LmNhdGVnb3JpZXNbMF0ubmFtZV06CisgICAgICAgICAgICAgICAgICAgIHRlc3RlcnNbY29tcG9uZW50LmNvbXBvbmVudFR5cGVdWydkZWZhdWx0J107CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAobmV3Q29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgLy9zY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oY29tcG9uZW50LmNvbXBvbmVudFR5cGUudG9Mb3dlckNhc2UgKyAnIGNoYW5nZSBzdGF0ZSAnICwgbmV3Q29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZihvblN1Y2Nlc3NDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3NDYWxsYmFjayhzZWxmLkNvbXBvbmVudEZhY3RvcnkuY3JlYXRlQ29tcG9uZW50KG5ld0NvbXBvbmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBvbkVycm9yID0gKGVycm9yKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ0ZhaWxlZCB0byBjaGFuZ2VMaWZlY3ljbGVTdGF0ZSB0byAnLCBkYXRhLnVybCk7CisgICAgICAgICAgICAgICAgaWYob25FcnJvckNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIG9uRXJyb3JDYWxsYmFjayhlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IGNvbW1lbnQ6TW9kZWxzLkFzZGNDb21tZW50ID0gbmV3IE1vZGVscy5Bc2RjQ29tbWVudCgpOworICAgICAgICAgICAgaWYgKGRhdGEuYWxlcnRNb2RhbCkgeworICAgICAgICAgICAgICAgIC8vIFNob3cgYWxlcnQgZGlhbG9nIGlmIGRlZmluZWQgaW4gbWVudS5qc29uCisgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoY29uZmlybWF0aW9uVGV4dCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQudXNlclJlbWFya3MgPSBjb25maXJtYXRpb25UZXh0OworICAgICAgICAgICAgICAgICAgICBzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2hhbmdlTGlmZWN5Y2xlU3RhdGUoZGF0YS51cmwsIGNvbW1lbnQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uQ2FuY2VsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnQ2FuY2VsIHByZXNzZWQnKTsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBtb2RhbFRpdGxlID0gdGhpcy5zZGNNZW51LmFsZXJ0TWVzc2FnZXNbZGF0YS5hbGVydE1vZGFsXS50aXRsZTsKKyAgICAgICAgICAgICAgICBsZXQgbW9kYWxNZXNzYWdlID0gdGhpcy5zZGNNZW51LmFsZXJ0TWVzc2FnZXNbZGF0YS5hbGVydE1vZGFsXS5tZXNzYWdlLmZvcm1hdChbY29tcG9uZW50LmNvbXBvbmVudFR5cGUudG9Mb3dlckNhc2UoKV0pOworICAgICAgICAgICAgICAgIHRoaXMuTW9kYWxzSGFuZGxlci5vcGVuQWxlcnRNb2RhbChtb2RhbFRpdGxlLCBtb2RhbE1lc3NhZ2UpLnRoZW4ob25Paywgb25DYW5jZWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNvbmZpcm1hdGlvbk1vZGFsKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdyBjb25maXJtYXRpb24gZGlhbG9nIGlmIGRlZmluZWQgaW4gbWVudS5qc29uCisgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoY29uZmlybWF0aW9uVGV4dCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQudXNlclJlbWFya3MgPSBjb25maXJtYXRpb25UZXh0OworICAgICAgICAgICAgICAgICAgICBzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2hhbmdlTGlmZWN5Y2xlU3RhdGUoZGF0YS51cmwsIGNvbW1lbnQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uQ2FuY2VsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnQ2FuY2VsIHByZXNzZWQnKTsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBtb2RhbFRpdGxlID0gdGhpcy5zZGNNZW51LmNvbmZpcm1hdGlvbk1lc3NhZ2VzW2RhdGEuY29uZmlybWF0aW9uTW9kYWxdLnRpdGxlOworICAgICAgICAgICAgICAgIGxldCBtb2RhbE1lc3NhZ2UgPSB0aGlzLnNkY01lbnUuY29uZmlybWF0aW9uTWVzc2FnZXNbZGF0YS5jb25maXJtYXRpb25Nb2RhbF0ubWVzc2FnZS5mb3JtYXQoW2NvbXBvbmVudC5jb21wb25lbnRUeXBlLnRvTG93ZXJDYXNlKCldKTsKKyAgICAgICAgICAgICAgICBsZXQgbW9kYWxTaG93Q29tbWVudCA9IHRoaXMuc2RjTWVudS5jb25maXJtYXRpb25NZXNzYWdlc1tkYXRhLmNvbmZpcm1hdGlvbk1vZGFsXS5zaG93Q29tbWVudDsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKG1vZGFsVGl0bGUsIG1vZGFsTWVzc2FnZSwgbW9kYWxTaG93Q29tbWVudCkudGhlbihvbk9rLCBvbkNhbmNlbCk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5lbWFpbE1vZGFsKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdyBlbWFpbCBkaWFsb2cgaWYgZGVmaW5lZCBpbiBtZW51Lmpzb24KKyAgICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICBsZXQgb25PayA9IChyZXNvdXJjZSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcigiRXJyb3IgY2hhbmdpbmcgbGlmZSBjeWNsZSBzdGF0ZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBvbkNhbmNlbCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IGVtYWlsTW9kZWw6IFZpZXdNb2RlbHMuSUVtYWlsTW9kYWxNb2RlbCA9ICA8Vmlld01vZGVscy5JRW1haWxNb2RhbE1vZGVsPnt9OworICAgICAgICAgICAgICAgIGVtYWlsTW9kZWwuZW1haWwgPSAgPFZpZXdNb2RlbHMuSUVtYWlsTW9kYWxNb2RlbF9FbWFpbD57fTsKKyAgICAgICAgICAgICAgICBlbWFpbE1vZGVsLmRhdGEgPSAgPFZpZXdNb2RlbHMuSUVtYWlsTW9kYWxNb2RlbF9EYXRhPnt9OworICAgICAgICAgICAgICAgIGVtYWlsTW9kZWwudGl0bGUgPSB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJFTUFJTF9NT0RBTF9USVRMRSIpOworICAgICAgICAgICAgICAgIGVtYWlsTW9kZWwuZW1haWwudG8gPSBnZXRDb250YWN0cyhjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGVtYWlsTW9kZWwuZW1haWwuc3ViamVjdCA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkVNQUlMX01PREFMX1NVQkpFQ1QiLCAieydlbnRpdHlOYW1lJzogJyIgKyB0aGlzLiRmaWx0ZXIoJ3Jlc291cmNlTmFtZScpKGNvbXBvbmVudC5uYW1lKSArICInLCdlbnRpdHlWZXJzaW9uJzogJyIgKyBjb21wb25lbnQudmVyc2lvbiArICInfSIpOworICAgICAgICAgICAgICAgIGVtYWlsTW9kZWwuZW1haWwubWVzc2FnZSA9ICcnOworICAgICAgICAgICAgICAgIGVtYWlsTW9kZWwuZGF0YS5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgZW1haWxNb2RlbC5kYXRhLnN0YXRlVXJsID0gZGF0YS51cmw7CisKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkVtYWlsTW9kYWwoZW1haWxNb2RlbCkudGhlbihvbk9rLCBvbkNhbmNlbCk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU3VibWl0IHRvIHNlcnZlciBvbmx5IChubyBtb2RhbCBpcyBzaG93bikuCisgICAgICAgICAgICAgICAgc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnQuY2hhbmdlTGlmZWN5Y2xlU3RhdGUoZGF0YS51cmwsIGNvbW1lbnQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9jb21tb24tdXRpbHMudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2NvbW1vbi11dGlscy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY2Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9jb21tb24tdXRpbHMudHMKQEAgLTAsMCArMSw4MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNi8zMC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzLnRzIi8+Cittb2R1bGUgU2RjLlV0aWxzIHsKKworICAgIGV4cG9ydCBjbGFzcyBDb21tb25VdGlscyB7CisKKyAgICAgICAgc3RhdGljIGluaXRQcm9wZXJ0aWVzKHByb3BlcnRpZXNPYmo6QXJyYXk8U2RjLk1vZGVscy5Qcm9wZXJ0eU1vZGVsPiwgdW5pcXVlSWQ/OnN0cmluZyk6QXJyYXk8U2RjLk1vZGVscy5Qcm9wZXJ0eU1vZGVsPiB7CisKKyAgICAgICAgICAgIGxldCBwcm9wZXJ0aWVzID0gbmV3IEFycmF5PFNkYy5Nb2RlbHMuUHJvcGVydHlNb2RlbD4oKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzT2JqKSB7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHByb3BlcnRpZXNPYmosIChwcm9wZXJ0eTpTZGMuTW9kZWxzLlByb3BlcnR5TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LnJlYWRvbmx5ID0gcHJvcGVydHkucGFyZW50VW5pcXVlSWQgIT0gdW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKG5ldyBTZGMuTW9kZWxzLlByb3BlcnR5TW9kZWwocHJvcGVydHkpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBpbml0QXR0cmlidXRlcyhhdHRyaWJ1dGVzT2JqOkFycmF5PFNkYy5Nb2RlbHMuQXR0cmlidXRlTW9kZWw+LCB1bmlxdWVJZD86c3RyaW5nKTpBcnJheTxTZGMuTW9kZWxzLkF0dHJpYnV0ZU1vZGVsPiB7CisKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5PFNkYy5Nb2RlbHMuQXR0cmlidXRlTW9kZWw+KCk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlc09iaikgeworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChhdHRyaWJ1dGVzT2JqLCAoYXR0cmlidXRlOlNkYy5Nb2RlbHMuQXR0cmlidXRlTW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5yZWFkb25seSA9IGF0dHJpYnV0ZS5wYXJlbnRVbmlxdWVJZCAhPSB1bmlxdWVJZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2gobmV3IFNkYy5Nb2RlbHMuQXR0cmlidXRlTW9kZWwoYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgaW5pdENvbXBvbmVudEluc3RhbmNlcyhjb21wb25lbnRJbnN0YW5jZU9iajpBcnJheTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5SZXNvdXJjZUluc3RhbmNlPik6QXJyYXk8TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuUmVzb3VyY2VJbnN0YW5jZT4geworCisgICAgICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2VzID0gbmV3IEFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLlJlc291cmNlSW5zdGFuY2U+KCk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50SW5zdGFuY2VPYmopIHsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2goY29tcG9uZW50SW5zdGFuY2VPYmosIChpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5SZXNvdXJjZUluc3RhbmNlKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2VzLnB1c2goVXRpbHMuQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGluc3RhbmNlKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SW5zdGFuY2VzOworICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBpbml0TW9kdWxlcyhtb2R1bGVBcnJheU9iajpBcnJheTxNb2RlbHMuTW9kdWxlPik6QXJyYXk8TW9kZWxzLk1vZHVsZT4geworCisgICAgICAgICAgICBsZXQgbW9kdWxlcyA9IG5ldyBBcnJheTxNb2RlbHMuTW9kdWxlPigpOworCisgICAgICAgICAgICBpZiAobW9kdWxlQXJyYXlPYmopIHsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2gobW9kdWxlQXJyYXlPYmosIChtb2R1bGU6TW9kZWxzLk1vZHVsZSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmKG1vZHVsZS50eXBlID09PSAib3JnLm9wZW5lY29tcC5ncm91cHMuVmZNb2R1bGUiKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXMucHVzaChuZXcgTW9kZWxzLk1vZHVsZShtb2R1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZXM7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9jb21wb25lbnQtZmFjdG9yeS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvY29tcG9uZW50LWZhY3RvcnkudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiMTM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvY29tcG9uZW50LWZhY3RvcnkudHMKQEAgLTAsMCArMSwxODEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvOC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlV0aWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgaW1wb3J0IFJlc291cmNlID0gU2RjLk1vZGVscy5Db21wb25lbnRzLlJlc291cmNlOworCisgICAgZXhwb3J0IGNsYXNzIENvbXBvbmVudEZhY3RvcnkgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNvbXBvbmVudHMuUmVzb3VyY2VTZXJ2aWNlJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuQ29tcG9uZW50cy5TZXJ2aWNlU2VydmljZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNvbXBvbmVudHMuUHJvZHVjdFNlcnZpY2UnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnLAorICAgICAgICAgICAgJyRxJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFJlc291cmNlU2VydmljZTpTZXJ2aWNlcy5Db21wb25lbnRzLlJlc291cmNlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBTZXJ2aWNlU2VydmljZTpTZXJ2aWNlcy5Db21wb25lbnRzLlNlcnZpY2VTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFByb2R1Y3RTZXJ2aWNlOlNlcnZpY2VzLkNvbXBvbmVudHMuUHJvZHVjdFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkcTogbmcuSVFTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY3JlYXRlQ29tcG9uZW50ID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9PiB7CisgICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgICAgIHN3aXRjaCAoY29tcG9uZW50LmNvbXBvbmVudFR5cGUpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1NFUlZJQ0UnOgorICAgICAgICAgICAgICAgICAgICBuZXdDb21wb25lbnQgPSBuZXcgTW9kZWxzLkNvbXBvbmVudHMuU2VydmljZSh0aGlzLlNlcnZpY2VTZXJ2aWNlLCB0aGlzLiRxLCA8TW9kZWxzLkNvbXBvbmVudHMuU2VydmljZT4gY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdSRVNPVVJDRSc6CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvbmVudCA9IG5ldyBNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSh0aGlzLlJlc291cmNlU2VydmljZSwgdGhpcy4kcSwgPE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlPiBjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1BST0RVQ1QnOgorICAgICAgICAgICAgICAgICAgICBuZXdDb21wb25lbnQgPSBuZXcgTW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdCh0aGlzLlByb2R1Y3RTZXJ2aWNlLCB0aGlzLiRxLCA8TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdD4gY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50OworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjcmVhdGVQcm9kdWN0ID0gKHByb2R1Y3Q6TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdCk6TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdCA9PiB7CisgICAgICAgICAgICBsZXQgbmV3UHJvZHVjdDpNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0ID0gbmV3IE1vZGVscy5Db21wb25lbnRzLlByb2R1Y3QodGhpcy5Qcm9kdWN0U2VydmljZSwgdGhpcy4kcSwgPE1vZGVscy5Db21wb25lbnRzLlByb2R1Y3Q+IHByb2R1Y3QpOworICAgICAgICAgICAgcmV0dXJuIG5ld1Byb2R1Y3Q7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZVNlcnZpY2UgPSAoc2VydmljZTpNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlKTpNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlID0+IHsKKyAgICAgICAgICAgIGxldCBuZXdTZXJ2aWNlOk1vZGVscy5Db21wb25lbnRzLlNlcnZpY2UgPSBuZXcgTW9kZWxzLkNvbXBvbmVudHMuU2VydmljZSh0aGlzLlNlcnZpY2VTZXJ2aWNlLCB0aGlzLiRxLCA8TW9kZWxzLkNvbXBvbmVudHMuU2VydmljZT4gc2VydmljZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3U2VydmljZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgY3JlYXRlUmVzb3VyY2UgPSAocmVzb3VyY2U6TW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2UpOk1vZGVscy5Db21wb25lbnRzLlJlc291cmNlID0+IHsKKyAgICAgICAgICAgIGxldCBuZXdSZXNvdXJjZTpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSA9IG5ldyBNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSh0aGlzLlJlc291cmNlU2VydmljZSwgdGhpcy4kcSwgPE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlPiByZXNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3UmVzb3VyY2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZUZyb21Dc2FyQ29tcG9uZW50ID0gKGNzYXI6TW9kZWxzLklDc2FyQ29tcG9uZW50KTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgbGV0IG5ld1Jlc291cmNlOlNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSA9IDxTZGMuTW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+dGhpcy5jcmVhdGVFbXB0eUNvbXBvbmVudChTZGMuVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUkVTT1VSQ0UpOworICAgICAgICAgICAgbmV3UmVzb3VyY2UubmFtZSA9IGNzYXIudnNwTmFtZTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBPbmJvYXJkaW5nIENTQVIgY29udGFpbnMgY2F0ZWdvcnkgYW5kIHN1YiBjYXRlZ29yeSB0aGF0IGFyZSB1bmlxdWVJZC4KKyAgICAgICAgICAgICAqIE5lZWQgdG8gZmluZCB0aGUgY2F0ZWdvcnkgYW5kIHN1YiBjYXRlZ29yeSBhbmQgZXh0cmFjdCB0aGUgbmFtZSBmcm9tIHRoZW0uCisgICAgICAgICAgICAgKiBGaXJzdCBjb25jYXQgYWxsIHN1YiBjYXRlZ29yaWVzIHRvIG9uZSBhcnJheS4KKyAgICAgICAgICAgICAqIFRoZW4gZmluZCB0aGUgc2VsZWN0ZWQgc3ViIGNhdGVnb3J5IGFuZCBjYXRlZ29yeS4KKyAgICAgICAgICAgICAqIEB0eXBlIHthbnl9CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxldCBhdmFpbGFibGVDYXRlZ29yaWVzID0gYW5ndWxhci5jb3B5KHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgncmVzb3VyY2VDYXRlZ29yaWVzJykpOworICAgICAgICAgICAgbGV0IGFsbFN1YnMgPSBbXTsKKyAgICAgICAgICAgIF8uZWFjaChhdmFpbGFibGVDYXRlZ29yaWVzLCAobWFpbjpNb2RlbHMuSU1haW5DYXRlZ29yeSk9PnsKKyAgICAgICAgICAgICAgICBpZiAobWFpbi5zdWJjYXRlZ29yaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbFN1YnMgPSBhbGxTdWJzLmNvbmNhdChtYWluLnN1YmNhdGVnb3JpZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBsZXQgc2VsZWN0ZWRDYXRlZ29yeTpNb2RlbHMuSU1haW5DYXRlZ29yeSA9IF8uZmluZChhdmFpbGFibGVDYXRlZ29yaWVzLCBmdW5jdGlvbihtYWluOk1vZGVscy5JTWFpbkNhdGVnb3J5KXsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFpbi51bmlxdWVJZCA9PT0gY3Nhci5jYXRlZ29yeTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTdWJDYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5ID0gXy5maW5kKGFsbFN1YnMsKHN1YjpNb2RlbHMuSVN1YkNhdGVnb3J5KT0+eworICAgICAgICAgICAgICAgIHJldHVybiBzdWIudW5pcXVlSWQgPT09IGNzYXIuc3ViQ2F0ZWdvcnk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGNhdGVnb3JpZXMgYW5kIHN1YiBjYXRlZ29yaWVzIGFycmF5IChzYW1lIGZvcm1hdCBhcyBjb21wb25lbnQgY2F0ZWdvcnkpCisgICAgICAgICAgICBsZXQgY2F0ZWdvcmllczpBcnJheTxNb2RlbHMuSU1haW5DYXRlZ29yeT4gPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgICAgIGxldCBzdWJjYXRlZ29yaWVzOkFycmF5PE1vZGVscy5JU3ViQ2F0ZWdvcnk+ID0gbmV3IEFycmF5KCk7CisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDYXRlZ29yeSAmJiBzZWxlY3RlZFN1YkNhdGVnb3J5KSB7CisgICAgICAgICAgICAgICAgc3ViY2F0ZWdvcmllcy5wdXNoKHNlbGVjdGVkU3ViQ2F0ZWdvcnkpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyA9IHN1YmNhdGVnb3JpZXM7CisgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKHNlbGVjdGVkQ2F0ZWdvcnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaWxsIHRoZSBjb21wb25lbnQgd2l0aCBkZXRhaWxzIGZyb20gQ1NBUgorICAgICAgICAgICAgbmV3UmVzb3VyY2Uuc2VsZWN0ZWRDYXRlZ29yeSA9IHNlbGVjdGVkQ2F0ZWdvcnkgJiYgc2VsZWN0ZWRTdWJDYXRlZ29yeSA/IHNlbGVjdGVkQ2F0ZWdvcnkubmFtZSArICJfI18iICsgc2VsZWN0ZWRTdWJDYXRlZ29yeS5uYW1lIDogJyc7CisgICAgICAgICAgICBuZXdSZXNvdXJjZS5jYXRlZ29yaWVzID0gY2F0ZWdvcmllczsKKyAgICAgICAgICAgIG5ld1Jlc291cmNlLnZlbmRvck5hbWUgPSBjc2FyLnZlbmRvck5hbWU7CisgICAgICAgICAgICBuZXdSZXNvdXJjZS52ZW5kb3JSZWxlYXNlID0gY3Nhci52ZW5kb3JSZWxlYXNlOworICAgICAgICAgICAgbmV3UmVzb3VyY2UuY3NhclVVSUQgPSBjc2FyLnBhY2thZ2VJZDsKKyAgICAgICAgICAgIG5ld1Jlc291cmNlLmNzYXJQYWNrYWdlVHlwZSA9IGNzYXIucGFja2FnZVR5cGU7CisgICAgICAgICAgICBuZXdSZXNvdXJjZS5jc2FyVmVyc2lvbiA9IGNzYXIudmVyc2lvbjsKKyAgICAgICAgICAgIG5ld1Jlc291cmNlLnBhY2thZ2VJZCA9IGNzYXIucGFja2FnZUlkOworICAgICAgICAgICAgbmV3UmVzb3VyY2UuZGVzY3JpcHRpb24gPSBjc2FyLmRlc2NyaXB0aW9uOworICAgICAgICAgICAgcmV0dXJuIG5ld1Jlc291cmNlOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBjcmVhdGVFbXB0eUNvbXBvbmVudCA9IChjb21wb25lbnRUeXBlOiBzdHJpbmcpOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9PiB7CisgICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKworICAgICAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvbmVudCA9IG5ldyBNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlKHRoaXMuU2VydmljZVNlcnZpY2UsIHRoaXMuJHEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUkVTT1VSQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZGOgorICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZS5WTDoKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5SZXNvdXJjZVR5cGUuVkZDOgorICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZS5DUDoKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9uZW50ID0gbmV3IE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlKHRoaXMuUmVzb3VyY2VTZXJ2aWNlLCB0aGlzLiRxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlBST0RVQ1Q6CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvbmVudCA9IG5ldyBNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0KHRoaXMuUHJvZHVjdFNlcnZpY2UsIHRoaXMuJHEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld0NvbXBvbmVudC5jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKKyAgICAgICAgICAgIG5ld0NvbXBvbmVudC50YWdzID0gW107CisgICAgICAgICAgICBuZXdDb21wb25lbnQuaWNvbiA9IFV0aWxzLkNvbnN0YW50cy5ERUZBVUxUX0lDT047CisgICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50OworICAgICAgICB9OworCisKKyAgICAgICAgcHVibGljIGdldFNlcnZpY2VGcm9tU2VydmVyID0gKGNvbXBvbmVudElkOiBzdHJpbmcpOiBuZy5JUHJvbWlzZTxNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlPiA9PiB7CisgICAgICAgICAgICBsZXQgc2VydmljZTogTW9kZWxzLkNvbXBvbmVudHMuU2VydmljZSA9IDxNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlPnRoaXMuY3JlYXRlRW1wdHlDb21wb25lbnQoVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuU0VSVklDRSk7CisgICAgICAgICAgICBzZXJ2aWNlLnNldFVuaXF1ZUlkKGNvbXBvbmVudElkKTsKKyAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldENvbXBvbmVudCgpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRSZXNvdXJjZUZyb21TZXJ2ZXIgPSAoY29tcG9uZW50SWQ6IHN0cmluZyk6IG5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlPiA9PiB7CisgICAgICAgICAgICBsZXQgcmVzb3VyY2U6IE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlID0gPE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlPnRoaXMuY3JlYXRlRW1wdHlDb21wb25lbnQoVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUkVTT1VSQ0UpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0VW5pcXVlSWQoY29tcG9uZW50SWQpOworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldENvbXBvbmVudCgpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRGcm9tU2VydmVyID0gKGNvbXBvbmVudFR5cGU6IHN0cmluZywgY29tcG9uZW50SWQ6IHN0cmluZyk6IG5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPT4geworICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVFbXB0eUNvbXBvbmVudChjb21wb25lbnRUeXBlKTsKKyAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zZXRVbmlxdWVJZChjb21wb25lbnRJZCk7CisgICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50LmdldENvbXBvbmVudCgpOworICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudE9uU2VydmVyID0gKGNvbXBvbmVudE9iamVjdDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOm5nLklQcm9taXNlPE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4gPT4geworICAgICAgICAgICAgbGV0IGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50T2JqZWN0KTsKKyAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuY3JlYXRlQ29tcG9uZW50T25TZXJ2ZXIoKTsKKworICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvY29tcG9uZW50LWluc3RhbmNlLWZhY3RvcnkudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2NvbXBvbmVudC1pbnN0YW5jZS1mYWN0b3J5LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjk4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2NvbXBvbmVudC1pbnN0YW5jZS1mYWN0b3J5LnRzCkBAIC0wLDAgKzEsODUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDMvNy8yMDE2LgorICovCisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDIvOC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlV0aWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5IHsKKworICAgICAgICBzdGF0aWMgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlIHsKKyAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnRJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZTsKKyAgICAgICAgICAgIHN3aXRjaCAoY29tcG9uZW50SW5zdGFuY2Uub3JpZ2luVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ1NFUlZJQ0UnOgorICAgICAgICAgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZSA9IG5ldyBNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5TZXJ2aWNlSW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1BST0RVQ1QnOgorICAgICAgICAgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZSA9IG5ldyBNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Qcm9kdWN0SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZSA9IG5ldyBNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5SZXNvdXJjZUluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50SW5zdGFuY2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZUVtcHR5Q29tcG9uZW50SW5zdGFuY2UgPSAoY29tcG9uZW50SW5zdGFuY2VUeXBlPzogc3RyaW5nKTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSA9PiB7CisgICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50SW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2U7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudEluc3RhbmNlVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ1NFUlZJQ0UnOgorICAgICAgICAgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZSA9IG5ldyBNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5TZXJ2aWNlSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdQUk9EVUNUJzoKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9uZW50SW5zdGFuY2UgPSBuZXcgTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuUHJvZHVjdEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvbmVudEluc3RhbmNlID0gbmV3IE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLlJlc291cmNlSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50SW5zdGFuY2U7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRnJvbUNvbXBvbmVudCA9IChjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UgPT4geworICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudEluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlID0gdGhpcy5jcmVhdGVFbXB0eUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudC5jb21wb25lbnRUeXBlKTsKKyAgICAgICAgICAgIG5ld0NvbXBvbmVudEluc3RhbmNlLnVuaXF1ZUlkID0gY29tcG9uZW50LnVuaXF1ZUlkICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKyAgICAgICAgICAgIG5ld0NvbXBvbmVudEluc3RhbmNlLnBvc1ggPSAwOworICAgICAgICAgICAgbmV3Q29tcG9uZW50SW5zdGFuY2UucG9zWSA9IDA7CisgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZS5uYW1lID0gY29tcG9uZW50Lm5hbWU7CisgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZS5jb21wb25lbnRWZXJzaW9uID0gY29tcG9uZW50LnZlcnNpb247CisgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZS5vcmlnaW5UeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFN1YlR5cGUoKTsKKyAgICAgICAgICAgIC8vbmV3IGNvbXBvbmVudCBpbnN0YW5jZSAtPiByZXEuICYgY2FwLiBhcmUgYWRkZWQgb24gc3VjY2Vzc2Z1bCBpbnN0YW5jZSBjcmVhdGlvbgorICAgICAgICAgICAgbmV3Q29tcG9uZW50SW5zdGFuY2UucmVxdWlyZW1lbnRzID0gY29tcG9uZW50LnJlcXVpcmVtZW50czsKKyAgICAgICAgICAgIG5ld0NvbXBvbmVudEluc3RhbmNlLmNhcGFiaWxpdGllcyA9IGNvbXBvbmVudC5jYXBhYmlsaXRpZXM7CisgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZS5pY29uID0gY29tcG9uZW50Lmljb247CisgICAgICAgICAgICBuZXdDb21wb25lbnRJbnN0YW5jZS5jb21wb25lbnRVaWQgPSBjb21wb25lbnQudW5pcXVlSWQ7CisgICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50SW5zdGFuY2U7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2NvbnN0YW50cy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvY29uc3RhbnRzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjFlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2NvbnN0YW50cy50cwpAQCAtMCwwICsxLDI0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi8xOC8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlV0aWxzLkNvbnN0YW50cyB7CisKKyAgICBpbXBvcnQgU3VpdGVPclNwZWMgPSBqYXNtaW5lLlN1aXRlT3JTcGVjOworICAgIGV4cG9ydCBsZXQgREVGQVVMVF9JQ09OID0gJ2RlZmF1bHRpY29uJzsKKyAgICBleHBvcnQgbGV0IENQX0VORF9QT0lOVCA9ICdDcEVuZFBvaW50JzsKKyAgICBleHBvcnQgbGV0IENIQU5HRV9DT01QT05FTlRfQ1NBUl9WRVJTSU9OX0ZMQUcgPSAnY2hhbmdlQ29tcG9uZW50Q3NhclZlcnNpb24nOworICAgIGV4cG9ydCBsZXQgSU1BR0VfUEFUSCA9ICcnOworCisgICAgZXhwb3J0IGNsYXNzIENvbXBvbmVudFR5cGUgeworICAgICAgICBzdGF0aWMgU0VSVklDRSA9ICdTRVJWSUNFJzsKKyAgICAgICAgc3RhdGljIFJFU09VUkNFID0gJ1JFU09VUkNFJzsKKyAgICAgICAgc3RhdGljIFBST0RVQ1QgPSAnUFJPRFVDVCc7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFJlc291cmNlVHlwZSB7CisgICAgICAgIHN0YXRpYyBWRiA9ICdWRic7CisgICAgICAgIHN0YXRpYyBWTCA9ICdWTCc7CisgICAgICAgIHN0YXRpYyBDUCA9ICdDUCc7CisgICAgICAgIHN0YXRpYyBWRkMgPSAnVkZDJzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9uZW50U3RhdGUgeworICAgICAgICBzdGF0aWMgQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyA9ICdDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTJzsKKyAgICAgICAgc3RhdGljIENFUlRJRklFRCA9ICdDRVJUSUZJRUQnOworICAgICAgICBzdGF0aWMgTk9UX0NFUlRJRklFRF9DSEVDS09VVCA9ICdOT1RfQ0VSVElGSUVEX0NIRUNLT1VUJzsKKyAgICAgICAgc3RhdGljIE5PVF9DRVJUSUZJRURfQ0hFQ0tJTiA9ICdOT1RfQ0VSVElGSUVEX0NIRUNLSU4nOworICAgICAgICBzdGF0aWMgUkVBRFlfRk9SX0NFUlRJRklDQVRJT04gPSAnUkVBRFlfRk9SX0NFUlRJRklDQVRJT04nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBEaXN0cmlidXRpb25TdGF0dXMgeworICAgICAgICBESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEID0gJ0RJU1RSSUJVVElPTl9OT1RfQVBQUk9WRUQnOworICAgICAgICBESVNUUklCVVRJT05fQVBQUk9WRUQgPSAnRElTVFJJQlVUSU9OX0FQUFJPVkVEJzsKKyAgICAgICAgRElTVFJJQlVURUQgPSAnRElTVFJJQlVURUQnOworICAgICAgICBESVNUUklCVVRJT05fUkVKRUNURUQgPSAnRElTVFJJQlVUSU9OX1JFSkVDVEVEJzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgQXJ0aWZhY3RHcm91cFR5cGUgeworICAgICAgICBzdGF0aWMgREVQTE9ZTUVOVCA9ICJERVBMT1lNRU5UIjsKKyAgICAgICAgc3RhdGljIElORk9STUFUSU9OID0gIklORk9STUFUSU9OQUwiOworICAgICAgICBzdGF0aWMgU0VSVklDRV9BUEkgPSAiU0VSVklDRV9BUEkiOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBcnRpZmFjdFR5cGUgeworICAgICAgICBzdGF0aWMgSEVBVCA9ICJIRUFUIjsKKyAgICAgICAgc3RhdGljIFZGX0xJQ0VOU0UgPSAiVkZfTElDRU5TRSI7CisgICAgICAgIHN0YXRpYyBWRU5ET1JfTElDRU5TRSA9ICJWRU5ET1JfTElDRU5TRSI7CisgICAgICAgIHN0YXRpYyBUSElSRF9QQVJUWV9SRVNFUlZFRF9UWVBFUyA9IHsgICBXT1JLRkxPVzoiV09SS0ZMT1ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUV09SS19DQUxMX0ZMT1c6Ik5FVFdPUktfQ0FMTF9GTE9XIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBSV9TRVJWSUNFX01PREVMOiJBQUlfU0VSVklDRV9NT0RFTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUlfVkZfTU9ERUw6IkFBSV9WRl9NT0RFTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUlfVkZfTU9EVUxFX01PREVMOiJBQUlfVkZfTU9EVUxFX01PREVMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBSV9WRl9JTlNUQU5DRV9NT0RFTDoiQUFJX1ZGX0lOU1RBTkNFX01PREVMIn07CisgICAgICAgIHN0YXRpYyBUT1NDQSA9IHsgVE9TQ0FfVEVNUExBVEU6IlRPU0NBX1RFTVBMQVRFIiwgVE9TQ0FfQ1NBUjoiVE9TQ0FfQ1NBUiJ9OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBTRVZFUklUWSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgREVCVUcgPSAnREVCVUcnOworICAgICAgICBwdWJsaWMgc3RhdGljIElORk8gPSAnSU5GTyc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV0FSTklORyA9ICdXQVJOSU5HJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBFUlJPUiA9ICdFUlJPUic7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFBST1BFUlRZX1RZUEVTIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTVFJJTkcgPSAnc3RyaW5nJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBJTlRFR0VSID0gJ2ludGVnZXInOworICAgICAgICBwdWJsaWMgc3RhdGljIEZMT0FUID0gJ2Zsb2F0JzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBCT09MRUFOID0gJ2Jvb2xlYW4nOworICAgICAgICBwdWJsaWMgc3RhdGljIEpTT04gPSAnanNvbic7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTUFQID0gJ21hcCc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTElTVCA9ICdsaXN0JzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU09VUkNFUyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQV9BTkRfQUkgPSAnQSZBSSc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgT1JERVIgPSAnT3JkZXInOworICAgICAgICBwdWJsaWMgc3RhdGljIFJVTlRJTUUgPSAnUnVudGltZSc7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFBST1BFUlRZX0RBVEEgeworICAgICAgICBwdWJsaWMgc3RhdGljIFRZUEVTID0gW1BST1BFUlRZX1RZUEVTLlNUUklORywgUFJPUEVSVFlfVFlQRVMuSU5URUdFUiwgUFJPUEVSVFlfVFlQRVMuRkxPQVQsIFBST1BFUlRZX1RZUEVTLkJPT0xFQU4sIFBST1BFUlRZX1RZUEVTLkpTT04sIFBST1BFUlRZX1RZUEVTLkxJU1QsIFBST1BFUlRZX1RZUEVTLk1BUF07CisgICAgICAgIHB1YmxpYyBzdGF0aWMgU0lNUExFX1RZUEVTID0gW1BST1BFUlRZX1RZUEVTLlNUUklORywgUFJPUEVSVFlfVFlQRVMuSU5URUdFUiwgUFJPUEVSVFlfVFlQRVMuRkxPQVQsIFBST1BFUlRZX1RZUEVTLkJPT0xFQU4sIFBST1BFUlRZX1RZUEVTLkpTT05dOworICAgICAgICBwdWJsaWMgc3RhdGljIFNPVVJDRVMgPSBbU09VUkNFUy5BX0FORF9BSSwgU09VUkNFUy5PUkRFUiwgU09VUkNFUy5SVU5USU1FXTsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUFJPUEVSVFlfVkFMVUVfQ09OU1RSQUlOVFMgeworICAgICAgICBwdWJsaWMgc3RhdGljIE1BWF9MRU5HVEggPSAxMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSlNPTl9NQVhfTEVOR1RIID0gNDA5NjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUm9sZSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQURNSU4gPSAnQURNSU4nOworICAgICAgICBwdWJsaWMgc3RhdGljIERFU0lHTkVSID0gJ0RFU0lHTkVSJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBQUk9EVUNUX1NUUkFURUdJU1QgPSAnUFJPRFVDVF9TVFJBVEVHSVNUJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBQUk9EVUNUX01BTkFHRVIgPSAnUFJPRFVDVF9NQU5BR0VSJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBURVNURVIgPSAnVEVTVEVSJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBPUFMgPSAnT1BTJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBHT1ZFUk5PUiA9ICdHT1ZFUk5PUic7CisgICAgfQorCisgICAgZXhwb3J0IGVudW0gRm9ybVN0YXRleworICAgICAgICBDUkVBVEUsCisgICAgICAgIFVQREFURSwKKyAgICAgICAgSU1QT1JULAorICAgICAgICBWSUVXCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFdvcmtzcGFjZU1vZGUgeworICAgICAgICBwdWJsaWMgc3RhdGljIENSRUFURSA9ICdjcmVhdGUnOworICAgICAgICBwdWJsaWMgc3RhdGljIEVESVQgPSAnZWRpdCc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU1QT1JUID0gJ2ltcG9ydCc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgVklFVyA9ICd2aWV3JzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgSW1hZ2VzVXJsIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBSRVNPVVJDRV9JQ09OUyA9ICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy8nOworICAgICAgICBwdWJsaWMgc3RhdGljIFNFUlZJQ0VfSUNPTlMgPSAnL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy8nOworICAgICAgICBwdWJsaWMgc3RhdGljIFNFTEVDVEVEX1VDUEVfSU5TVEFOQ0UgPSAnL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvc2VsZWN0ZWRVY3BlSW5zdGFuY2UucG5nJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTRUxFQ1RFRF9DUF9JTlNUQU5DRSA9ICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZENQSW5zdGFuY2UucG5nJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTRUxFQ1RFRF9WTF9JTlNUQU5DRSA9ICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZFZMSW5zdGFuY2UucG5nJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBDQU5WQVNfUExVU19JQ09OID0gJy9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2NhbnZhc1BsdXNJY29uLnBuZyc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTU9EVUxFX0lDT04gPSAnL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvbW9kdWxlLnBuZyc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgT1BFTl9NT0RVTEVfSUNPTiA9ICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vcGVuTW9kdWxlLnBuZyc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgT1BFTl9NT0RVTEVfSE9WRVJfSUNPTiA9ICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vcGVuTW9kdWxlSG92ZXIucG5nJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBDTE9TRV9NT0RVTEVfSUNPTiA9ICcvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jbG9zZU1vZHVsZS5wbmcnOworICAgICAgICBwdWJsaWMgc3RhdGljIENMT1NFX01PRFVMRV9IT1ZFUl9JQ09OID0gJy9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2Nsb3NlTW9kdWxlSG92ZXIucG5nJzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgTW9kYWxUeXBlIHsKKyAgICAgICAgc3RhdGljIFNUQU5EQVJEID0gJ3N0YW5kYXJkJzsKKyAgICAgICAgc3RhdGljIEVSUk9SID0gJ2Vycm9yJzsKKyAgICAgICAgc3RhdGljIEFMRVJUID0gJ2FsZXJ0JzsKKyAgICAgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEdyYXBoQ29sb3JzIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBOT1RfQ0VSVElGSUVEX0xJTksgPSAncmdiKDIxOCwzMSw2MSknOworICAgICAgICBwdWJsaWMgc3RhdGljIFZMX0xJTksgPSAncmdiKDIxNiwyMTYsMjE2KSc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQUNUSVZFX0xJTksgPSAnIzMwYmRmMic7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQkFTRV9MSU5LID0gJ3JnYig1NSw1NSw1NSknOworICAgICAgICBwdWJsaWMgc3RhdGljIE5PREVfQkFDS0dST1VORF9DT0xPUiA9ICdyZ2JhKDQ2LCAxNjIsIDE1NywgMC4yNCknOworICAgICAgICBwdWJsaWMgc3RhdGljIE5PREVfU0hBRE9XX0NPTE9SID0gJ3JnYmEoMTk4LCAyMzAsIDIyOCwgMC43KSc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTk9ERV9PVkVSTEFQUElOR19CQUNLR1JPVU5EX0NPTE9SID0gJ3JnYmEoMTc5LCAxMCwgNjAsIDAuMjQpJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBOT0RFX09WRVJMQVBQSU5HX1NIQURPV19DT0xPUiA9ICdyZ2JhKDIzNiwgMTk0LCAyMDYsIDAuNyknOworICAgICAgICBwdWJsaWMgc3RhdGljIE5PREVfVUNQRV9DUCA9ICcjOTA2M2NkJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBOT0RFX1VDUEUgPSAnI2ZiZmJmYic7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTk9ERV9TRUxFQ1RFRF9CT1JERVJfQ09MT1IgPSAnIzMwYmRmMic7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEdyYXBoVHJhbnNhY3Rpb25Mb2dUZXh0IHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBSRU1PVkVfVEVNUF9MSU5LID0gInJlbW92ZSB0ZW1wTGluayI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgREVMRVRFX0xJTksgPSAiZGVsZXRlIGxpbmsiOworICAgICAgICBwdWJsaWMgc3RhdGljIEFERF9MSU5LID0gImRlbGV0ZSBsaW5rIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBBRERfTk9ERSA9ICJhZGRpbmcgbm9kZSI7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEdyYXBoVUlPYmplY3RzIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBMSU5LX01FTlVfSEVJR0hUID0gNDIwOworICAgICAgICBwdWJsaWMgc3RhdGljIFRPUF9IRUFERVJfSEVJR0hUID0gMjAwOworICAgICAgICBwdWJsaWMgc3RhdGljIFRPT0xUSVBfT0ZGU0VUX1ggPSA1MDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBUT09MVElQX09GRlNFVF9ZID0gMTQ1OworICAgICAgICBwdWJsaWMgc3RhdGljIFRPT0xUSVBfTElOS19PRkZTRVRfWCA9IDM1OworICAgICAgICBwdWJsaWMgc3RhdGljIFRPT0xUSVBfTElOS19PRkZTRVRfWSA9IDc1OworICAgICAgICBwdWJsaWMgc3RhdGljIE1FTlVfTElOS19WTF9IRUlHSFRfT0ZGU0VUID0gMjUwOworICAgICAgICBwdWJsaWMgc3RhdGljIE1FTlVfTElOS19WTF9XSURUSF9PRkZTRVQgPSAyMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgTUVOVV9MSU5LX1NJTVBMRV9IRUlHSFRfT0ZGU0VUID0gMTgwOworICAgICAgICBwdWJsaWMgc3RhdGljIE1FTlVfTElOS19TSU1QTEVfV0lEVEhfT0ZGU0VUID0gMTMwOworICAgICAgICBwdWJsaWMgc3RhdGljIERJQUdSQU1fUklHSFRfV0lEVEhfT0ZGU0VUID0gMjQ4OworICAgICAgICBwdWJsaWMgc3RhdGljIERJQUdSQU1fSEVBREVSX09GRlNFVCA9IDEwMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBESUFHUkFNX1BBTEVUVEVfV0lEVEhfT0ZGU0VUID0gMjQ3OworCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFN0YXRlcyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV09SS1NQQUNFX0dFTkVSQUwgPSAnd29ya3NwYWNlLmdlbmVyYWwnOworICAgICAgICBwdWJsaWMgc3RhdGljIFdPUktTUEFDRV9JQ09OUyA9ICd3b3Jrc3BhY2UuaWNvbnMnOworICAgICAgICBwdWJsaWMgc3RhdGljIFdPUktTUEFDRV9BQ1RJVklUWV9MT0cgPSAgJ3dvcmtzcGFjZS5hY3Rpdml0eV9sb2cnOworICAgICAgICBwdWJsaWMgc3RhdGljIFdPUktTUEFDRV9ERVBMT1lNRU5UX0FSVElGQUNUUyA9ICd3b3Jrc3BhY2UuZGVwbG95bWVudF9hcnRpZmFjdHMnOworICAgICAgICBwdWJsaWMgc3RhdGljIFdPUktTUEFDRV9QUk9QRVJUSUVTID0gJ3dvcmtzcGFjZS5wcm9wZXJ0aWVzJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXT1JLU1BBQ0VfU0VSVklDRV9JTlBVVFMgPSAnd29ya3NwYWNlLnNlcnZpY2VfaW5wdXRzJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXT1JLU1BBQ0VfUkVTT1VSQ0VfSU5QVVRTID0gJ3dvcmtzcGFjZS5yZXNvdXJjZV9pbnB1dHMnOworICAgICAgICBwdWJsaWMgc3RhdGljIFdPUktTUEFDRV9BVFRSSUJVVEVTID0gJ3dvcmtzcGFjZS5hdHRyaWJ1dGVzJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXT1JLU1BBQ0VfSElFUkFSQ0hZID0gJ3dvcmtzcGFjZS5oaWVyYXJjaHknOworICAgICAgICBwdWJsaWMgc3RhdGljIFdPUktTUEFDRV9JTkZPUk1BVElPTl9BUlRJRkFDVFMgPSAnd29ya3NwYWNlLmluZm9ybWF0aW9uX2FydGlmYWN0cyc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV09SS1NQQUNFX1RPU0NBX0FSVElGQUNUUyA9ICd3b3Jrc3BhY2UudG9zY2FfYXJ0aWZhY3RzJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXT1JLU1BBQ0VfQ09NUE9TSVRJT04gPSAnd29ya3NwYWNlLmNvbXBvc2l0aW9uJzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXT1JLU1BBQ0VfTkVUV09SS19DQUxMX0ZMT1cgPSAnd29ya3NwYWNlLm5ldHdvcmtfY2FsbF9mbG93JzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBXT1JLU1BBQ0VfTUFOQUdFTUVOVF9XT1JLRkxPVyA9ICd3b3Jrc3BhY2UubWFuYWdlbWVudF93b3JrZmxvdyc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV09SS1NQQUNFX0RFUExPWU1FTlQgPSAnd29ya3NwYWNlLmRlcGxveW1lbnQnOworICAgICAgICBwdWJsaWMgc3RhdGljIFdPUktTUEFDRV9ESVNUUklCVVRJT04gPSAnd29ya3NwYWNlLmRpc3RyaWJ1dGlvbic7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgV09SS1NQQUNFX1JFUVVJUkVNRU5UU19BTkRfQ0FQQUJJTElUSUVTID0gJ3dvcmtzcGFjZS5yZXFBbmRDYXAnOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBFVkVOVFMgeworICAgICAgICBzdGF0aWMgUkVTT1VSQ0VfTEVGVF9QQUxFVFRFX1VQREFURV9FVkVOVCA9ICJyZXNvdXJjZUxlZnRQYW5lbFVwZGF0ZUV2ZW50IjsKKyAgICAgICAgc3RhdGljIFNFUlZJQ0VfTEVGVF9QQUxFVFRFX1VQREFURV9FVkVOVCA9ICJzZXJ2aWNlTGVmdFBhbmVsVXBkYXRlRXZlbnQiOworICAgICAgICBzdGF0aWMgUFJPRFVDVF9MRUZUX1BBTEVUVEVfVVBEQVRFX0VWRU5UID0gInByb2R1Y3RMZWZ0UGFuZWxVZGF0ZUV2ZW50IjsKKyAgICAgICAgc3RhdGljIFZMX0xFRlRfUEFMRVRURV9VUERBVEVfRVZFTlQgPSAidmxMZWZ0UGFuZWxVZGF0ZUV2ZW50IjsKKyAgICAgICAgc3RhdGljIE9OX0NTQVJfTE9BRElORyA9ICJvbkNzYXJMb2FkaW5nIjsKKyAgICAgICAgc3RhdGljIERPV05MT0FEX0FSVElGQUNUX0ZJTklTSF9FVkVOVCA9ICJkb3dubG9hZEFydGlmYWN0RmluaXNoRXZlbnQiOworICAgICAgICBzdGF0aWMgT05fV09SS1NQQUNFX1NBVkVfQlVUVE9OX0NMSUNLID0gIm9uV29ya3NwYWNlU2F2ZUJ1dHRvbkNsaWNrIjsKKyAgICAgICAgc3RhdGljIE9OX1dPUktTUEFDRV9TQVZFX0JVVFRPTl9TVUNDRVNTID0gIm9uV29ya3NwYWNlU2F2ZUJ1dHRvblN1Y2Nlc3MiOworICAgICAgICBzdGF0aWMgT05fV09SS1NQQUNFX1NBVkVfQlVUVE9OX0VSUk9SID0gIm9uV29ya3NwYWNlU2F2ZUJ1dHRvbkVycm9yIjsKKworICAgICAgICAvL0xvYWRlciBldmVudHMKKyAgICAgICAgc3RhdGljIFNIT1dfTE9BREVSX0VWRU5UID0gInNob3dMb2FkZXJFdmVudCI7CisgICAgICAgIHN0YXRpYyBISURFX0xPQURFUl9FVkVOVCA9ICJoaWRlTG9hZGVyRXZlbnQiOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBHUkFQSF9FVkVOVFMgeworICAgICAgICBzdGF0aWMgT05fTk9ERV9TRUxFQ1RFRCA9ICJvbk5vZGVTZWxlY3RlZCI7CisgICAgICAgIHN0YXRpYyBPTl9HUkFQSF9CQUNLR1JPVU5EX0NMSUNLRUQgPSAib25HcmFwaEJhY2tncm91bmRDbGlja2VkIjsKKyAgICAgICAgc3RhdGljIE9OX1BBTEVUVEVfQ09NUE9ORU5UX0hPVkVSX0lOID0gJ29uUGFsZXR0ZUNvbXBvbmVudEhvdmVySW4nOworICAgICAgICBzdGF0aWMgT05fUEFMRVRURV9DT01QT05FTlRfSE9WRVJfT1VUID0gJ29uUGFsZXR0ZUNvbXBvbmVudEhvdmVyT3V0JzsKKyAgICAgICAgc3RhdGljIE9OX1BBTEVUVEVfQ09NUE9ORU5UX0RSQUdfU1RBUlQgPSAnb25QYWxldHRlQ29tcG9uZW50RHJhZ1N0YXJ0JzsKKyAgICAgICAgc3RhdGljIE9OX1BBTEVUVEVfQ09NUE9ORU5UX0RSQUdfQUNUSU9OID0gJ29uUGFsZXR0ZUNvbXBvbmVudERyYWdBY3Rpb24nOworICAgICAgICBzdGF0aWMgT05fQ09NUE9ORU5UX0lOU1RBTkNFX05BTUVfQ0hBTkdFRCA9ICdvbkNvbXBvbmVudEluc3RhbmNlTmFtZUNoYW5nZWQnOworICAgICAgICBzdGF0aWMgT05fREVMRVRFX0NPTVBPTkVOVF9JTlNUQU5DRSA9ICdvbkRlbGV0ZUNvbXBvbmVudEluc3RhbmNlJzsKKyAgICAgICAgc3RhdGljIE9OX0RFTEVURV9NVUxUSVBMRV9DT01QT05FTlRTID0gJ29uRGVsZXRlTXVsdGlwbGVDb21wb25lbnRzJzsKKyAgICAgICAgc3RhdGljIE9OX0RFTEVURV9FREdFID0gJ29uRGVsZXRlRWRnZSc7CisgICAgICAgIHN0YXRpYyBPTl9JTlNFUlRfTk9ERV9UT19VQ1BFID0gJ29uSW5zZXJ0Tm9kZVRvVUNQRSc7CisgICAgICAgIHN0YXRpYyBPTl9SRU1PVkVfTk9ERV9GUk9NX1VDUEUgPSAnb25SZW1vdmVOb2RlRnJvbVVDUEUnOworICAgICAgICBzdGF0aWMgT05fVkVSU0lPTl9DSEFOR0VEID0gJ29uVmVyc2lvbkNoYW5nZWQnOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9kaWN0aW9uYXJ5L2RpY3Rpb25hcnkudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2RpY3Rpb25hcnkvZGljdGlvbmFyeS50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjlhMWJjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9kaWN0aW9uYXJ5L2RpY3Rpb25hcnkudHMKQEAgLTAsMCArMSwyNTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKioKKworIFRoaXMgY29kZSB3YXMgY29weSBmcm9tIGNvbGxlY3Rpb25zLnRzIGxpYgorIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXNhcmF0L3R5cGVzY3JpcHQtY29sbGVjdGlvbnMKKyoqLworCittb2R1bGUgU2RjLlV0aWxzeworICAndXNlIHN0cmljdCc7CisKKyAgLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IGRpY3Rpb25hcnkKKyAgaW50ZXJmYWNlIElEaWN0aW9uYXJ5UGFpcjxLLCBWPnsKKyAgICAgIGtleTogSzsKKyAgICAgIHZhbHVlOiBWOworICB9CisKKyAgZXhwb3J0IGNsYXNzIERpY3Rpb25hcnk8SywgVj57CisKKyAgICAgIC8qKgorICAgICAgICogT2JqZWN0IGhvbGRpbmcgdGhlIGtleS12YWx1ZSBwYWlycy4KKyAgICAgICAqIEB0eXBlIHtPYmplY3R9CisgICAgICAgKiBAcHJpdmF0ZQorICAgICAgICovCisgICAgICBwcml2YXRlIHRhYmxlOiB7IFtrZXk6IHN0cmluZ106IElEaWN0aW9uYXJ5UGFpcjxLLCBWPiB9OworICAgICAgLy86IFtrZXk6IEtdIHdpbGwgbm90IHdvcmsgc2luY2UgaW5kaWNlcyBjYW4gb25seSBieSBzdHJpbmdzIGluIGphdmFzY3JpcHQgYW5kIHR5cGVzY3JpcHQgZW5mb3JjZXMgdGhpcy4KKworICAgICAgLyoqCisgICAgICAgKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgICAgKiBAdHlwZSB7bnVtYmVyfQorICAgICAgICogQHByaXZhdGUKKyAgICAgICAqLworICAgICAgcHJpdmF0ZSBuRWxlbWVudHM6IG51bWJlcjsKKworICAgICAgLyoqCisgICAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGNvbnZlcnQga2V5cyB0byBzdHJpbmdzLgorICAgICAgICogQHR5cGUge2Z1bmN0aW9uKE9iamVjdCk6c3RyaW5nfQorICAgICAgICogQHByaXZhdGUKKyAgICAgICAqLworICAgICAgcHJpdmF0ZSB0b1N0cjogKGtleTogSykgPT4gc3RyaW5nOworCisKKyAgICAgIC8qKgorICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBkaWN0aW9uYXJ5LgorICAgICAgICogQGNsYXNzIDxwPkRpY3Rpb25hcmllcyBtYXAga2V5cyB0byB2YWx1ZXM7IGVhY2gga2V5IGNhbiBtYXAgdG8gYXQgbW9zdCBvbmUgdmFsdWUuCisgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFjY2VwdHMgYW55IGtpbmQgb2Ygb2JqZWN0cyBhcyBrZXlzLjwvcD4KKyAgICAgICAqCisgICAgICAgKiA8cD5JZiB0aGUga2V5cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBrZXlzIHRvIHVuaXF1ZQorICAgICAgICogc3RyaW5ncyBtdXN0IGJlIHByb3ZpZGVkLiBFeGFtcGxlOjwvcD4KKyAgICAgICAqIDxwcmU+CisgICAgICAgKiBmdW5jdGlvbiBwZXRUb1N0cmluZyhwZXQpIHsKKyAgICAgICAqICByZXR1cm4gcGV0Lm5hbWU7CisgICAgICAgKiB9CisgICAgICAgKiA8L3ByZT4KKyAgICAgICAqIEBjb25zdHJ1Y3RvcgorICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOnN0cmluZz19IHRvU3RyRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZAorICAgICAgICogdG8gY29udmVydCBrZXlzIHRvIHN0cmluZ3MuIElmIHRoZSBrZXlzIGFyZW4idCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKCkKKyAgICAgICAqIGlzIG5vdCBhcHByb3ByaWF0ZSwgYSBjdXN0b20gZnVuY3Rpb24gd2hpY2ggcmVjZWl2ZXMgYSBrZXkgYW5kIHJldHVybnMgYQorICAgICAgICogdW5pcXVlIHN0cmluZyBtdXN0IGJlIHByb3ZpZGVkLgorICAgICAgICovCisgICAgICBjb25zdHJ1Y3Rvcih0b1N0ckZ1bmN0aW9uPzogKGtleTogSykgPT4gc3RyaW5nKSB7CisgICAgICAgICAgdGhpcy50YWJsZSA9IHt9OworICAgICAgICAgIHRoaXMubkVsZW1lbnRzID0gMDsKKyAgICAgICAgICB0aGlzLnRvU3RyID0gdG9TdHJGdW5jdGlvbiB8fCB0aGlzLmRlZmF1bHRUb1N0cmluZzsKKyAgICAgIH0KKworCisgICAgICAvKioKKyAgICAgICBjb3B5IGZyb20gYW5ndWxhci5qcyAgaXNVbmRlZmluZWQKKyAgICAgICAqLworICAgICAgcHJpdmF0ZSBpc1VuZGVmaW5lZCA9ICh2YWx1ZTogYW55KTpib29sZWFuID0+IHsKKyAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHRUb1N0cmluZyA9IChpdGVtOiBhbnkpOiBzdHJpbmcgPT4geworICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LgorICAgICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LgorICAgICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC4KKyAgICAgICAqIEByZXR1cm4geyp9IHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIGRpY3Rpb25hcnkgbWFwcyB0aGUgc3BlY2lmaWVkIGtleSBvcgorICAgICAgICogdW5kZWZpbmVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuCisgICAgICAgKi8KKyAgICAgIGdldFZhbHVlID0gKGtleTogSyk6IFYgPT4geworICAgICAgICAgIGxldCBwYWlyOiBJRGljdGlvbmFyeVBhaXI8SywgVj4gPSB0aGlzLnRhYmxlW3RoaXMudG9TdHIoa2V5KV07CisgICAgICAgICAgaWYgKHRoaXMuaXNVbmRlZmluZWQocGFpcikpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHBhaXIudmFsdWU7CisgICAgICB9CisKKworICAgICAgLyoqCisgICAgICAgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIGRpY3Rpb25hcnkuCisgICAgICAgKiBJZiB0aGUgZGljdGlvbmFyeSBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoaXMga2V5LCB0aGUgb2xkCisgICAgICAgKiB2YWx1ZSBpcyByZXBsYWNlZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlCisgICAgICAgKiBhc3NvY2lhdGVkLgorICAgICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgICAqIEByZXR1cm4geyp9IHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IgdW5kZWZpbmVkIGlmCisgICAgICAgKiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3IgdGhlIGtleSBvciBpZiB0aGUga2V5L3ZhbHVlIGFyZSB1bmRlZmluZWQuCisgICAgICAgKi8KKyAgICAgIHNldFZhbHVlID0gKGtleTogSywgdmFsdWU6IFYpOiBWID0+IHsKKworICAgICAgICAgIGlmICh0aGlzLmlzVW5kZWZpbmVkKGtleSkgfHwgdGhpcy5pc1VuZGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsZXQgcmV0OiBWOworICAgICAgICAgIGxldCBrID0gdGhpcy50b1N0cihrZXkpOworICAgICAgICAgIGxldCBwcmV2aW91c0VsZW1lbnQ6IElEaWN0aW9uYXJ5UGFpcjxLLCBWPiA9IHRoaXMudGFibGVba107CisgICAgICAgICAgaWYgKHRoaXMuaXNVbmRlZmluZWQocHJldmlvdXNFbGVtZW50KSkgeworICAgICAgICAgICAgICB0aGlzLm5FbGVtZW50cysrOworICAgICAgICAgICAgICByZXQgPSB1bmRlZmluZWQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0ID0gcHJldmlvdXNFbGVtZW50LnZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLnRhYmxlW2tdID0geworICAgICAgICAgICAgICBrZXk6IGtleSwKKyAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlCisgICAgICAgICAgfTsKKyAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgZm9yIHRoaXMga2V5IGZyb20gdGhpcyBkaWN0aW9uYXJ5IGlmIGl0IGlzIHByZXNlbnQuCisgICAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBtYXBwaW5nIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAqIGRpY3Rpb25hcnkuCisgICAgICAgKiBAcmV0dXJuIHsqfSBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgdW5kZWZpbmVkIGlmCisgICAgICAgKiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LgorICAgICAgICovCisgICAgICByZW1vdmUgPSAoa2V5OiBLKTogViA9PiB7CisgICAgICAgICAgbGV0IGsgPSB0aGlzLnRvU3RyKGtleSk7CisgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudDogSURpY3Rpb25hcnlQYWlyPEssIFY+ID0gdGhpcy50YWJsZVtrXTsKKyAgICAgICAgICBpZiAoIXRoaXMuaXNVbmRlZmluZWQocHJldmlvdXNFbGVtZW50KSkgeworICAgICAgICAgICAgICBkZWxldGUgdGhpcy50YWJsZVtrXTsKKyAgICAgICAgICAgICAgdGhpcy5uRWxlbWVudHMtLTsKKyAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzRWxlbWVudC52YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBrZXlzIGluIHRoaXMgZGljdGlvbmFyeS4KKyAgICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuCisgICAgICAgKi8KKyAgICAgIGtleXMgPSAoKTogS1tdID0+IHsKKyAgICAgICAgICBsZXQgYXJyYXk6IEtbXSA9IFtdOworICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy50YWJsZSkgeworICAgICAgICAgICAgICBpZiAodGhpcy50YWJsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgeworICAgICAgICAgICAgICAgICAgbGV0IHBhaXI6IElEaWN0aW9uYXJ5UGFpcjxLLCBWPiA9IHRoaXMudGFibGVbbmFtZV07CisgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHBhaXIua2V5KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgdmFsdWVzIGluIHRoaXMgZGljdGlvbmFyeS4KKyAgICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgdmFsdWVzIGluIHRoaXMgZGljdGlvbmFyeS4KKyAgICAgICAqLworICAgICAgdmFsdWVzID0gKCk6IFZbXSA9PiB7CisgICAgICAgICAgbGV0IGFycmF5OiBWW10gPSBbXTsKKyAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMudGFibGUpIHsKKyAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgIGxldCBwYWlyOiBJRGljdGlvbmFyeVBhaXI8SywgVj4gPSB0aGlzLnRhYmxlW25hbWVdOworICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChwYWlyLnZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBrZXktdmFsdWUgcGFpcgorICAgICAgKiBwcmVzZW50IGluIHRoaXMgZGljdGlvbmFyeS4KKyAgICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpcworICAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czoga2V5IGFuZCB2YWx1ZS4gVG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuCisgICAgICAqIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLgorICAgICAgKi8KKyAgICAgIGZvckVhY2ggPSAoY2FsbGJhY2s6IChrZXk6IEssIHZhbHVlOiBWKSA9PiBhbnkpOiB2b2lkID0+IHsKKyAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMudGFibGUpIHsKKyAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgIGxldCBwYWlyOiBJRGljdGlvbmFyeVBhaXI8SywgVj4gPSB0aGlzLnRhYmxlW25hbWVdOworICAgICAgICAgICAgICAgICAgbGV0IHJldCA9IGNhbGxiYWNrKHBhaXIua2V5LCBwYWlyLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBrZXkga2V5IHdob3NlIHByZXNlbmNlIGluIHRoaXMgZGljdGlvbmFyeSBpcyB0byBiZQorICAgICAgICogdGVzdGVkLgorICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUKKyAgICAgICAqIHNwZWNpZmllZCBrZXkuCisgICAgICAgKi8KKyAgICAgIGNvbnRhaW5zS2V5ID0gKGtleTogSyk6IGJvb2xlYW4gPT4geworICAgICAgICAgIHJldHVybiAhdGhpcy5pc1VuZGVmaW5lZCh0aGlzLmdldFZhbHVlKGtleSkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIGRpY3Rpb25hcnkuCisgICAgICAqIEB0aGlzIHtEaWN0aW9uYXJ5fQorICAgICAgKi8KKyAgICAgIGNsZWFyID0gKCkgPT4geworCisgICAgICAgICAgdGhpcy50YWJsZSA9IHt9OworICAgICAgICAgIHRoaXMubkVsZW1lbnRzID0gMDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuCisgICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgZGljdGlvbmFyeS4KKyAgICAgICAqLworICAgICAgc2l6ZSA9ICgpOiBudW1iZXIgPT4geworICAgICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50czsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIG5vIG1hcHBpbmdzLgorICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZ3MuCisgICAgICAgKi8KKyAgICAgIGlzRW1wdHkgPSAoKTogYm9vbGVhbiA9PiB7CisgICAgICAgICAgcmV0dXJuIHRoaXMubkVsZW1lbnRzIDw9IDA7CisgICAgICB9CisKKyAgICAgIHRvU3RyaW5nID0gKCk6IHN0cmluZyA9PiB7CisgICAgICAgICAgbGV0IHRvcmV0ID0gInsiOworICAgICAgICAgIHRoaXMuZm9yRWFjaCgoaywgdikgPT4geworICAgICAgICAgICAgICB0b3JldCA9IHRvcmV0ICsgIlxuXHQiICsgay50b1N0cmluZygpICsgIiA6ICIgKyB2LnRvU3RyaW5nKCk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgcmV0dXJuIHRvcmV0ICsgIlxufSI7CisgICAgICB9CisgIH0gLy8gRW5kIG9mIGRpY3Rpb25hcnkKKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9maWxlLXV0aWxzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9maWxlLXV0aWxzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjI1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2ZpbGUtdXRpbHMudHMKQEAgLTAsMCArMSw3MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVXRpbHMgeworICAgIGV4cG9ydCBjbGFzcyBGaWxlVXRpbHMgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHdpbmRvdycKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR3aW5kb3c6IGFueSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVDaGFyYWN0ZXJzVG9CbG9iID0gKGJ5dGVDaGFyYWN0ZXJzLCBjb250ZW50VHlwZSk6IGFueSA9PiB7CisgICAgICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICcnOworICAgICAgICAgICAgbGV0IHNsaWNlU2l6ZSA9IDEwMjQ7CisgICAgICAgICAgICBsZXQgYnl0ZXNMZW5ndGggPSBieXRlQ2hhcmFjdGVycy5sZW5ndGg7CisgICAgICAgICAgICBsZXQgc2xpY2VzQ291bnQgPSBNYXRoLmNlaWwoYnl0ZXNMZW5ndGggLyBzbGljZVNpemUpOworICAgICAgICAgICAgbGV0IGJ5dGVBcnJheXMgPSBuZXcgQXJyYXkoc2xpY2VzQ291bnQpOworCisgICAgICAgICAgICBmb3IgKGxldCBzbGljZUluZGV4ID0gMDsgc2xpY2VJbmRleCA8IHNsaWNlc0NvdW50OyArK3NsaWNlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBsZXQgYmVnaW4gPSBzbGljZUluZGV4ICogc2xpY2VTaXplOworICAgICAgICAgICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihiZWdpbiArIHNsaWNlU2l6ZSwgYnl0ZXNMZW5ndGgpOworCisgICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gbmV3IEFycmF5KGVuZCAtIGJlZ2luKTsKKyAgICAgICAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSBiZWdpbiwgaSA9IDA7IG9mZnNldCA8IGVuZDsgKytpLCArK29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBieXRlc1tpXSA9IGJ5dGVDaGFyYWN0ZXJzW29mZnNldF0uY2hhckNvZGVBdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnl0ZUFycmF5c1tzbGljZUluZGV4XSA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihieXRlQXJyYXlzLCB7dHlwZTogY29udGVudFR5cGV9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgYmFzZTY0dG9CbG9iID0gKGJhc2U2NERhdGEsIGNvbnRlbnRUeXBlKTogYW55ID0+IHsKKyAgICAgICAgICAgIGxldCBieXRlQ2hhcmFjdGVycyA9IGF0b2IoYmFzZTY0RGF0YSk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5ieXRlQ2hhcmFjdGVyc1RvQmxvYihieXRlQ2hhcmFjdGVycywgY29udGVudFR5cGUpOworICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBkb3dubG9hZEZpbGUgPSAoYmxvYiwgZmlsZU5hbWUpOiB2b2lkPT4geworICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuJHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOworICAgICAgICAgICAgbGV0IGRvd25sb2FkTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKworICAgICAgICAgICAgZG93bmxvYWRMaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7CisgICAgICAgICAgICBkb3dubG9hZExpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRMaW5rKTsKKyAgICAgICAgICAgIGRvd25sb2FkTGluay5jbGljaygpOworCisgICAgICAgICAgICAvL3RpbWUgb3V0IGZvciBmaXJlZm94CisgICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT4geworICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG93bmxvYWRMaW5rKTsKKyAgICAgICAgICAgICAgICB0aGlzLiR3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOworICAgICAgICAgICAgfSwgMTAwKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9mdW5jdGlvbnMudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL2Z1bmN0aW9ucy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJjOTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9mdW5jdGlvbnMudHMKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVXRpbHMuRnVuY3Rpb25zIHsKKworICAgIGV4cG9ydCBjbGFzcyBRdWV1ZVV0aWxzIHsKKworICAgICAgICBwcml2YXRlIGV4ZWN1dGlvblF1ZXVlIDogYW55OworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHE6bmcuSVFTZXJ2aWNlKXsKKyAgICAgICAgICAgIHRoaXMuZXhlY3V0aW9uUXVldWUgPSB0aGlzLmdldER1bW15UHJvbWlzZSgpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGdldER1bW15UHJvbWlzZSA9ICgpOiBuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgOiBuZy5JRGVmZXJyZWQ8Ym9vbGVhbj49IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworCisgICAgICAgIHByaXZhdGUgYWRkTWV0aG9kVG9RdWV1ZSA9IChydW5NZTpGdW5jdGlvbikgOiB2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuZXhlY3V0aW9uUXVldWUgPSB0aGlzLmV4ZWN1dGlvblF1ZXVlLnRoZW4ocnVuTWUsIHJ1bk1lKTsKKyAgICAgICAgfTsKKworICAgICAgICBhZGROb25CbG9ja2luZ1VJQWN0aW9uID0gKHVwZGF0ZTpGdW5jdGlvbiAsIHJlbGVhc2VVSWNhbGxCYWNrOkZ1bmN0aW9uKSA6IHZvaWQgPT4geworICAgICAgICAgICAgcmVsZWFzZVVJY2FsbEJhY2soKTsKKyAgICAgICAgICAgIHRoaXMuYWRkTWV0aG9kVG9RdWV1ZSh1cGRhdGUpOworICAgICAgICB9OworCisgICAgICAgIC8vIFRoZSBNZXRob2QgY2FsbCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBVSQorICAgICAgICBhZGRCbG9ja2luZ1VJQWN0aW9uID0gKCBibG9ja2luZ1NlcnZlclJlcXVlc3QgOiBGdW5jdGlvbiApOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy5hZGRNZXRob2RUb1F1ZXVlKGJsb2NraW5nU2VydmVyUmVxdWVzdCk7CisgICAgICAgIH07CisKKyAgICAgICAgYWRkQmxvY2tpbmdVSUFjdGlvbldpdGhSZWxlYXNlQ2FsbGJhY2sgPSAoIGJsb2NraW5nU2VydmVyUmVxdWVzdCA6IEZ1bmN0aW9uLCByZWxlYXNlVUljYWxsQmFjazpGdW5jdGlvbik6dm9pZD0+eworICAgICAgICAgICAgdGhpcy5hZGRNZXRob2RUb1F1ZXVlKGJsb2NraW5nU2VydmVyUmVxdWVzdCk7CisgICAgICAgICAgICB0aGlzLmFkZE1ldGhvZFRvUXVldWUocmVsZWFzZVVJY2FsbEJhY2spOworICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvbWVudS1oYW5kbGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9tZW51LWhhbmRsZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyYjdkZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvbWVudS1oYW5kbGVyLnRzCkBAIC0wLDAgKzEsMTQ1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcy50cyIvPgorbW9kdWxlIFNkYy5VdGlscyB7CisKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgTWVudUl0ZW0geworICAgICAgICB0ZXh0OiBzdHJpbmc7CisgICAgICAgIGNhbGxiYWNrOiAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gbmcuSVByb21pc2U8Ym9vbGVhbj47CisgICAgICAgIHN0YXRlOiBzdHJpbmc7CisgICAgICAgIGFjdGlvbjogc3RyaW5nOworICAgICAgICBwYXJhbXM6IEFycmF5PGFueT47CisgICAgICAgIGlzRGlzYWJsZWQ6IGJvb2xlYW47CisgICAgICAgIGRpc2FibGVkUm9sZXM6IEFycmF5PHN0cmluZz47CisgICAgICAgIGJsb2NrZWRGb3JUeXBlczpBcnJheTxzdHJpbmc+OyAgLy8gVGhpcyBpdGVtIHdpbGwgbm90IGJlIHNob3duIGZvciBzcGVjaWZpYyBjb21wb25lbnRzIHR5cGVzLgorCisgICAgICAgIC8vVE9ETyBjaGVjayBpZiBuZWVkZWQKKyAgICAgICAgY29uZmlybWF0aW9uTW9kYWw6c3RyaW5nOyAgICAgICAvLyBPcGVuIGNvbmZpcm1hdGlvbiBtb2RhbCAodXNlciBzaG91bGQgc2VsZWN0ICJPSyIgb3IgIkNhbmNlbCIpLCBhbmQgY29udGludWUgd2l0aCB0aGUgYWN0aW9uLgorICAgICAgICBlbWFpbE1vZGFsOnN0cmluZzsgICAgICAgICAgICAgIC8vIE9wZW4gZW1haWwgbW9kYWwgKHVzZXIgc2hvdWxkIGZpbGwgZW1haWwgZGV0YWlscyksIGFuZCBjb250aW51ZSB3aXRoIHRoZSBhY3Rpb24uCisgICAgICAgIHVybDpzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBhZGRlZCB0byBtZW51IGl0ZW0sIGluIGNhc2UgdGhlIGZ1bmN0aW9uIG5lZWQgdG8gdXNlIGl0LCBleGFtcGxlOiBmb3IgZnVuY3Rpb24gImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgSSBuZWVkIHRvIHBhc3MgYWxzbyB0aGUgc3RhdGUgIkNIRUNLT1VUIiB0aGF0IEkgd2FudCB0aGUgc3RhdGUgdG8gY2hhbmdlIHRvLgorCisKKyAgICAgICAgY29uc3RydWN0b3IodGV4dDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IEFycmF5PGFueT4pID0+IG5nLklQcm9taXNlPGJvb2xlYW4+LCBzdGF0ZTpzdHJpbmcsIGFjdGlvbjpzdHJpbmcsIHBhcmFtcz86IEFycmF5PGFueT4sIGJsb2NrZWRGb3JUeXBlcz86QXJyYXk8c3RyaW5nPikgeworICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisgICAgICAgICAgICB0aGlzLmJsb2NrZWRGb3JUeXBlcyA9IGJsb2NrZWRGb3JUeXBlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBNZW51SXRlbUdyb3VwIHsKKyAgICAgICAgc2VsZWN0ZWRJbmRleDogbnVtYmVyOworICAgICAgICBtZW51SXRlbXM6IEFycmF5PE1lbnVJdGVtPjsKKyAgICAgICAgaXRlbUNsaWNrOiBib29sZWFuOworCisgICAgICAgIGNvbnN0cnVjdG9yKHNlbGVjdGVkSW5kZXg/Om51bWJlciwgbWVudUl0ZW1zPzogQXJyYXk8TWVudUl0ZW0+LCBpdGVtQ2xpY2s/OiBib29sZWFuKSB7CisgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEluZGV4OworICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBtZW51SXRlbXM7CisgICAgICAgICAgICB0aGlzLml0ZW1DbGljayA9IGl0ZW1DbGljazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB1cGRhdGVTZWxlY3RlZE1lbnVJdGVtVGV4dCAobmV3VGV4dDogc3RyaW5nKSB7CisgICAgICAgICAgICB0aGlzLm1lbnVJdGVtc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnRleHQgPSBuZXdUZXh0OworICAgICAgICB9CisgICAgfQorCisKKyAgICBleHBvcnQgY2xhc3MgTWVudUhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICdzZGNNZW51JywKKyAgICAgICAgICAgICdDb21wb25lbnRGYWN0b3J5JywKKyAgICAgICAgICAgICckdGVtcGxhdGVDYWNoZScsCisgICAgICAgICAgICAnJGZpbHRlcicsCisgICAgICAgICAgICAnJG1vZGFsJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJyRxJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgcHJpdmF0ZSBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgcHJpdmF0ZSBzZGNNZW51Ok1vZGVscy5JQXBwTWVudSwKKyAgICAgICAgICAgIHByaXZhdGUgQ29tcG9uZW50RmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgIHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UsCisgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IE1vZGFsc0hhbmRsZXIsCisgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSAkcTpuZy5JUVNlcnZpY2UKKyAgICAgICAgKSB7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgZ2VuZXJhdGVCcmVhZGNydW1ic01vZGVsRnJvbUNvbXBvbmVudHMgPSAoY29tcG9uZW50czogQXJyYXk8U2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4sIHNlbGVjdGVkOlNkYy5Nb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOk1lbnVJdGVtR3JvdXAgPT4geworICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBNZW51SXRlbUdyb3VwKDAsIFtdLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50cykgeworCisgICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRoZSBjb21wb25lbnQgaW4gYWxsIGNvbXBvbmVudHMgYnkgdXVpZCAoYW5kIG5vdCB1bmlxdWVpZCwgZ2l2ZXMgYWNjZXNzIHRvIGFuIGFzc2V0cydzIG1pbm9yIHZlcnNpb25zKS4KKyAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRJdGVtID0gXy5maW5kKGNvbXBvbmVudHMsIChpdGVtOlNkYy5Nb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udXVpZCA9PT0gc2VsZWN0ZWQudXVpZDsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCBzZWFyY2ggYnkgaW52YXJpYW50VVVJRAorICAgICAgICAgICAgICAgIGlmKHVuZGVmaW5lZCA9PSBzZWxlY3RlZEl0ZW0peworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBfLmZpbmQoY29tcG9uZW50cywgKGl0ZW06U2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnZhcmlhbnRVVUlEICYmIENlcnRpZmllZCBTdGF0ZSBtYXRjaGVzIGJldHdlZW4gbWFqb3IgdmVyc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmludmFyaWFudFVVSUQgPT09IHNlbGVjdGVkLmludmFyaWFudFVVSUQgJiYgaXRlbS5saWZlY3ljbGVTdGF0ZSA9PT0gVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLkNFUlRJRklFRDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgbm90IGZvdW5kIHNlYXJjaCBieSBuYW1lIChuYW1lIGlzIHVuaXF1ZSkuCisgICAgICAgICAgICAgICAgaWYodW5kZWZpbmVkID09IHNlbGVjdGVkSXRlbSl7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IF8uZmluZChjb21wb25lbnRzLCAoaXRlbTpTZGMuTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lID09PSBzZWxlY3RlZC5uYW1lOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXN1bHQuc2VsZWN0ZWRJbmRleCA9IGNvbXBvbmVudHMuaW5kZXhPZihzZWxlY3RlZEl0ZW0pOworICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbcmVzdWx0LnNlbGVjdGVkSW5kZXhdICA9IHNlbGVjdGVkOworICAgICAgICAgICAgICAgIGxldCBjbGlja0l0ZW1DYWxsYmFjayA9IChjb21wb25lbnQ6IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOiBuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKCd3b3Jrc3BhY2UuZ2VuZXJhbCcsIHtpZDogY29tcG9uZW50LnVuaXF1ZUlkLCB0eXBlOmNvbXBvbmVudC5jb21wb25lbnRUeXBlLnRvTG93ZXJDYXNlKCksIG1vZGU6IFV0aWxzLkNvbnN0YW50cy5Xb3Jrc3BhY2VNb2RlLlZJRVd9KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHEud2hlbih0cnVlKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQ6U2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0oCisgICAgICAgICAgICAgICAgICAgICAgLy8gIGNvbXBvbmVudC5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENvbXBvbmVudFN1YlR5cGUoKSArICc6ICcgKyB0aGlzLiRmaWx0ZXIoJ3Jlc291cmNlTmFtZScpKGNvbXBvbmVudC5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrSXRlbUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50XQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgLy8gIG1lbnVJdGVtLnRleHQgPSBjb21wb25lbnQubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1lbnVJdGVtcy5wdXNoKG1lbnVJdGVtKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL21vZGFscy1oYW5kbGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9tb2RhbHMtaGFuZGxlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U4MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9tb2RhbHMtaGFuZGxlci50cwpAQCAtMCwwICsxLDI3NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMi8xMS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlV0aWxzIHsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSU1vZGFsc0hhbmRsZXIgeworCisgICAgICAgIG9wZW5WaWV3ZXJNb2RhbChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTp2b2lkOworICAgICAgICBvcGVuRGlzdHJpYnV0aW9uU3RhdHVzTW9kYWwoZGlzdHJpYnV0aW9uOiBNb2RlbHMuRGlzdHJpYnV0aW9uLHN0YXR1czpzdHJpbmcpOnZvaWQ7CisgICAgICAgIG9wZW5Db25maXJtYXRpb25Nb2RhbCAodGl0bGU6c3RyaW5nLCBtZXNzYWdlOnN0cmluZywgc2hvd0NvbW1lbnQ6Ym9vbGVhbiwgc2l6ZT86IHN0cmluZyk6bmcuSVByb21pc2U8YW55PjsKKyAgICAgICAgb3BlbkFsZXJ0TW9kYWwgKHRpdGxlOnN0cmluZywgbWVzc2FnZTpzdHJpbmcsIHNpemU/OiBzdHJpbmcpOm5nLklQcm9taXNlPGFueT47CisgICAgICAgIG9wZW5TdGFuZGFyZE1vZGFsICh0aXRsZTpzdHJpbmcsIG1lc3NhZ2U6c3RyaW5nLCBzaXplPzogc3RyaW5nKTpuZy5JUHJvbWlzZTxhbnk+OworICAgICAgICBvcGVuRXJyb3JNb2RhbCAodGl0bGU6c3RyaW5nLCBtZXNzYWdlOnN0cmluZywgc2l6ZT86IHN0cmluZyk6bmcuSVByb21pc2U8YW55PjsKKyAgICAgICAgb3BlbkVtYWlsTW9kYWwoZW1haWxNb2RlbDpWaWV3TW9kZWxzLklFbWFpbE1vZGFsTW9kZWwpIDpuZy5JUHJvbWlzZTxhbnk+OworICAgICAgICBvcGVuU2VydmVyTWVzc2FnZU1vZGFsKGRhdGE6U2RjLlZpZXdNb2RlbHMuSVNlcnZlck1lc3NhZ2VNb2RhbE1vZGVsKTogbmcuSVByb21pc2U8YW55PjsKKyAgICAgICAgb3BlbkNsaWVudE1lc3NhZ2VNb2RhbChkYXRhOlNkYy5WaWV3TW9kZWxzLklDbGllbnRNZXNzYWdlTW9kYWxNb2RlbCk6ICBuZy5JUHJvbWlzZTxuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlPjsKKyAgICAgICAgb3BlbldpemFyZEFydGlmYWN0TW9kYWwoYXJ0aWZhY3Q6IE1vZGVscy5BcnRpZmFjdE1vZGVsLCBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTogbmcuSVByb21pc2U8YW55PjsKKyAgICAgICAgb3BlbldpemFyZChjb21wb25lbnRUeXBlOiBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZSwgIGNvbXBvbmVudD86TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50LCBpbXBvcnRlZEZpbGU/OiBhbnkpOiBuZy5JUHJvbWlzZTxhbnk+OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBNb2RhbHNIYW5kbGVyIGltcGxlbWVudHMgSU1vZGFsc0hhbmRsZXJ7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckdGVtcGxhdGVDYWNoZScsCisgICAgICAgICAgICAnJG1vZGFsJywKKyAgICAgICAgICAgICckcScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHE6bmcuSVFTZXJ2aWNlKSB7CisgICAgICAgIH0KKworICAgICAgICBvcGVuVmlld2VyTW9kYWwgPSAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvY29tcG9uZW50LXZpZXdlci5odG1sJyksCisgICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1NkYy5WaWV3TW9kZWxzLkNvbXBvbmVudFZpZXdlclZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogJ2xnJywKKyAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy4kbW9kYWwub3Blbihtb2RhbE9wdGlvbnMpOworICAgICAgICB9OworCisKKyAgICAgICAgb3BlbkRpc3RyaWJ1dGlvblN0YXR1c01vZGFsID0gKGRpc3RyaWJ1dGlvbjogTW9kZWxzLkRpc3RyaWJ1dGlvbixzdGF0dXM6c3RyaW5nKTogbmcuSVByb21pc2U8YW55PiAgPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG1vZGFsT3B0aW9uczpuZy51aS5ib290c3RyYXAuSU1vZGFsU2V0dGluZ3MgPSB7CisgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwtdmlldy5odG1sJyksCisgICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1NkYy5WaWV3TW9kZWxzLkRpc3RyaWJ1dGlvblN0YXR1c01vZGFsVmlld01vZGVsJywKKyAgICAgICAgICAgICAgICBzaXplOiAnc2RjLXhsJywKKyAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICBkYXRhOiAoKTphbnkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzdHJpYnV0aW9uJzogZGlzdHJpYnV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSA9IHRoaXMuJG1vZGFsLm9wZW4obW9kYWxPcHRpb25zKTsKKyAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobW9kYWxJbnN0YW5jZS5yZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgIH07CisKKworCisgICAgICAgIG9wZW5BbGVydE1vZGFsID0gKHRpdGxlOnN0cmluZywgbWVzc2FnZTpzdHJpbmcsIHNpemU/OiBzdHJpbmcpOm5nLklQcm9taXNlPGFueT4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNvbmZpcm1hdGlvbk1vZGFsQmFzZSh0aXRsZSwgbWVzc2FnZSwgZmFsc2UsIFV0aWxzLkNvbnN0YW50cy5Nb2RhbFR5cGUuQUxFUlQsIHNpemUpOworICAgICAgICB9OworCisgICAgICAgIG9wZW5TdGFuZGFyZE1vZGFsID0gKHRpdGxlOnN0cmluZywgbWVzc2FnZTpzdHJpbmcsIHNpemU/OiBzdHJpbmcpOm5nLklQcm9taXNlPGFueT4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNvbmZpcm1hdGlvbk1vZGFsQmFzZSh0aXRsZSwgbWVzc2FnZSwgZmFsc2UsIFV0aWxzLkNvbnN0YW50cy5Nb2RhbFR5cGUuU1RBTkRBUkQsIHNpemUpOworICAgICAgICB9OworCisgICAgICAgIG9wZW5FcnJvck1vZGFsID0gKHRpdGxlOnN0cmluZywgbWVzc2FnZTpzdHJpbmcsIHNpemU/OiBzdHJpbmcpOm5nLklQcm9taXNlPGFueT4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNvbmZpcm1hdGlvbk1vZGFsQmFzZSh0aXRsZSwgbWVzc2FnZSwgZmFsc2UsIFV0aWxzLkNvbnN0YW50cy5Nb2RhbFR5cGUuRVJST1IsIHNpemUpOworICAgICAgICB9OworCisgICAgICAgIG9wZW5Db25maXJtYXRpb25Nb2RhbCA9ICh0aXRsZTpzdHJpbmcsIG1lc3NhZ2U6c3RyaW5nLCBzaG93Q29tbWVudDpib29sZWFuLCBzaXplPzogc3RyaW5nKTpuZy5JUHJvbWlzZTxhbnk+ID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5Db25maXJtYXRpb25Nb2RhbEJhc2UodGl0bGUsIG1lc3NhZ2UsIHNob3dDb21tZW50LCBVdGlscy5Db25zdGFudHMuTW9kYWxUeXBlLlNUQU5EQVJELCBzaXplKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIG9wZW5Db25maXJtYXRpb25Nb2RhbEJhc2UgPSAodGl0bGU6c3RyaW5nLCBtZXNzYWdlOnN0cmluZywgc2hvd0NvbW1lbnQ6Ym9vbGVhbiwgdHlwZTpVdGlscy5Db25zdGFudHMuTW9kYWxUeXBlLCBzaXplPzogc3RyaW5nKTpuZy5JUHJvbWlzZTxhbnk+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9jb25maXJtYXRpb24tbW9kYWwvY29uZmlybWF0aW9uLW1vZGFsLXZpZXcuaHRtbCcpLAorICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5Db25maXJtYXRpb25Nb2RhbFZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogc2l6ZT8gc2l6ZTonc2RjLXNtJywKKyAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25Nb2RhbE1vZGVsOiAoKTpTZGMuVmlld01vZGVscy5JQ29uZmlybWF0aW9uTW9kYWxNb2RlbCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kZWw6U2RjLlZpZXdNb2RlbHMuSUNvbmZpcm1hdGlvbk1vZGFsTW9kZWwgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbW1lbnQ6IHNob3dDb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlID0gdGhpcy4kbW9kYWwub3Blbihtb2RhbE9wdGlvbnMpOworICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShtb2RhbEluc3RhbmNlLnJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBvcGVuRW1haWxNb2RhbCA9IChlbWFpbE1vZGVsOlZpZXdNb2RlbHMuSUVtYWlsTW9kYWxNb2RlbCk6bmcuSVByb21pc2U8YW55PiA9PiB7CisKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9lbWFpbC1tb2RhbC9lbWFpbC1tb2RhbC12aWV3Lmh0bWwnKSwKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnU2RjLlZpZXdNb2RlbHMuRW1haWxNb2RhbFZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogJ3NkYy1zbScsCisgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAorICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgZW1haWxNb2RhbE1vZGVsOiAoKTpWaWV3TW9kZWxzLklFbWFpbE1vZGFsTW9kZWwgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsTW9kZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSA9IHRoaXMuJG1vZGFsLm9wZW4obW9kYWxPcHRpb25zKTsKKyAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobW9kYWxJbnN0YW5jZS5yZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisKKyAgICAgICAgfTsKKworICAgICAgICBvcGVuU2VydmVyTWVzc2FnZU1vZGFsID0gKGRhdGE6U2RjLlZpZXdNb2RlbHMuSVNlcnZlck1lc3NhZ2VNb2RhbE1vZGVsKTpuZy5JUHJvbWlzZTxhbnk+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2Utc2VydmVyLW1vZGFsL3NlcnZlci1tZXNzYWdlLW1vZGFsLXZpZXcuaHRtbCcpLAorICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5TZXJ2ZXJNZXNzYWdlTW9kYWxWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgIHNpemU6ICdzZGMtc20nLAorICAgICAgICAgICAgICAgIGJhY2tkcm9wOiAnc3RhdGljJywKKyAgICAgICAgICAgICAgICByZXNvbHZlOiB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlck1lc3NhZ2VNb2RhbE1vZGVsOiAoKTpTZGMuVmlld01vZGVscy5JU2VydmVyTWVzc2FnZU1vZGFsTW9kZWwgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlID0gdGhpcy4kbW9kYWwub3Blbihtb2RhbE9wdGlvbnMpOworICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShtb2RhbEluc3RhbmNlLnJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBvcGVuQ2xpZW50TWVzc2FnZU1vZGFsID0gKGRhdGE6U2RjLlZpZXdNb2RlbHMuSUNsaWVudE1lc3NhZ2VNb2RhbE1vZGVsKTpuZy5JUHJvbWlzZTxhbnk+ID0+IHsKKyAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2UtY2xpZW50LW1vZGFsL2NsaWVudC1tZXNzYWdlLW1vZGFsLXZpZXcuaHRtbCcpLAorICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5DbGllbnRNZXNzYWdlTW9kYWxWaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgIHNpemU6ICdzZGMtc20nLAorICAgICAgICAgICAgICAgIGJhY2tkcm9wOiAnc3RhdGljJywKKyAgICAgICAgICAgICAgICByZXNvbHZlOiB7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudE1lc3NhZ2VNb2RhbE1vZGVsOiAoKTpTZGMuVmlld01vZGVscy5JQ2xpZW50TWVzc2FnZU1vZGFsTW9kZWwgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSA9IHRoaXMuJG1vZGFsLm9wZW4obW9kYWxPcHRpb25zKTsKKyAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUobW9kYWxJbnN0YW5jZSk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBvcGVuT25ib2FkcmRpbmdNb2RhbCA9IChva0J1dHRvblRleHQ6c3RyaW5nLGN1cnJlbnRDc2FyVVVJRD86c3RyaW5nKTogbmcuSVByb21pc2U8YW55PiAgPT4geworICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgbGV0IG1vZGFsT3B0aW9uczpuZy51aS5ib290c3RyYXAuSU1vZGFsU2V0dGluZ3MgPSB7CisgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL29uYm9hcmRpbmctbW9kYWwvb25ib2FyZGluZy1tb2RhbC12aWV3Lmh0bWwnKSwKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnU2RjLlZpZXdNb2RlbHMuT25ib2FyZGluZ01vZGFsVmlld01vZGVsJywKKyAgICAgICAgICAgICAgICBzaXplOiAnc2RjLXhsJywKKyAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICBva0J1dHRvblRleHQ6KCk6c3RyaW5nPT57CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2tCdXR0b25UZXh0OworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3NhclVVSUQ6KCk6c3RyaW5nPT57CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENzYXJVVUlEfHxudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxldCBtb2RhbEluc3RhbmNlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UgPSB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKG1vZGFsSW5zdGFuY2UucmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisKKyAgICAgICAgb3BlbldpemFyZCA9IChjb21wb25lbnRUeXBlOiBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZSwgIGNvbXBvbmVudD86TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50LCBpbXBvcnRlZEZpbGU/OiBhbnkpOiBuZy5JUHJvbWlzZTxhbnk+ICA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgdGVtcGxhdGUgPSB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtY3JlYXRpb24tYmFzZS5odG1sJyk7CisKKyAgICAgICAgICAgIGxldCBjb250cm9sbGVyOnN0cmluZzsKKyAgICAgICAgICAgIGlmKGNvbXBvbmVudCl7CisgICAgICAgICAgICAgICAgY29udHJvbGxlciA9ICdTZGMuVmlld01vZGVscy5XaXphcmQuRWRpdFdpemFyZFZpZXdNb2RlbCc7IC8vRWRpdCBtb2RlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZEZpbGUpeworICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyID0gJ1NkYy5WaWV3TW9kZWxzLldpemFyZC5JbXBvcnRXaXphcmRWaWV3TW9kZWwnOyAgLy8gSW1wb3J0IE1vZGUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyID0gJ1NkYy5WaWV3TW9kZWxzLldpemFyZC5DcmVhdGVXaXphcmRWaWV3TW9kZWwnOyAvLyBDcmVhdGUgTW9kZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgIHNpemU6ICAgJ3NkYy14bCcsCisgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAorICAgICAgICAgICAgICAgIGtleWJvYXJkOiBmYWxzZSwKKyAgICAgICAgICAgICAgICByZXNvbHZlOiB7CisgICAgICAgICAgICAgICAgICAgIGRhdGE6ICgpOmFueSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wb25lbnRUeXBlJzogY29tcG9uZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcG9uZW50JzogY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnRGaWxlJzppbXBvcnRlZEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlID0gdGhpcy4kbW9kYWwub3Blbihtb2RhbE9wdGlvbnMpOworICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShtb2RhbEluc3RhbmNlLnJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgfTsKKworICAgICAgICBvcGVuV2l6YXJkQXJ0aWZhY3RNb2RhbCA9IChhcnRpZmFjdDogTW9kZWxzLkFydGlmYWN0TW9kZWwsIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOiBuZy5JUHJvbWlzZTxhbnk+ICA9PiB7CisgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICBsZXQgdmlld01vZGVsc0h0bWxCYXNlUGF0aDpzdHJpbmcgPSAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzLyc7CisgICAgICAgICAgICBsZXQgbW9kYWxPcHRpb25zOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXR0aW5ncyA9IHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICd3aXphcmQvYXJ0aWZhY3QtZm9ybS1zdGVwL2FydGlmYWN0LWZvcm0tc3RlcC12aWV3Lmh0bWwnKSwKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnU2RjLlZpZXdNb2RlbHMuV2l6YXJkLkFydGlmYWN0UmVzb3VyY2VGb3JtU3RlcFZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogJ3NkYy1tZCcsCisgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAorICAgICAgICAgICAgICAgIGtleWJvYXJkOiBmYWxzZSwKKyAgICAgICAgICAgICAgICByZXNvbHZlOiB7CisgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0OiAoKTpNb2RlbHMuQXJ0aWZhY3RNb2RlbCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJ0aWZhY3Q7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCk6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBtb2RhbEluc3RhbmNlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UgPSB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKG1vZGFsSW5zdGFuY2UucmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICB9OworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9wcm90b3R5cGVzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy9wcm90b3R5cGVzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTYxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3V0aWxzL3Byb3RvdHlwZXMudHMKQEAgLTAsMCArMSwxNTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitpbnRlcmZhY2UgU3RyaW5nIHsKKyAgICBmb3JtYXQodmFyaWFibGVzOkFycmF5PHN0cmluZz4pOnN0cmluZworfQorCitpbnRlcmZhY2UgQXJyYXk8VD4geworICAgIGNsZWFuKG86IFQpOiBBcnJheTxUPjsKK30KKworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXBsYWNlIHRoZSAlPG51bWJlcj4gd2l0aCBzdHJpbmdzIChmcm9tIGFycmF5KS4KKyAqIEV4YW1wbGU6ICJSZXF1ZXN0ZWQgJyUxJyByZXNvdXJjZSB3YXMgbm90IGZvdW5kLiIuZm9ybWF0KFsiTXlSZXNvdXJjZSJdKTsKKyAqIE5vdGU6IGluIGNhc2UgdGhlIGFycmF5IGNvbnRhaW5zIGVtcHR5IHN0cmluZyB0aGUgZnVuY3Rpb24gd2lsbCBhbHNvIHJlbW92ZSB0aGUgJycgb3IgdGhlICIiLgorICovCitpZiAoIVN0cmluZy5oYXNPd25Qcm9wZXJ0eSgiZm9ybWF0IikpIHsKKyAgICBTdHJpbmcucHJvdG90eXBlWyJmb3JtYXQiXSA9IGZ1bmN0aW9uICh2YXJpYWJsZXM6QXJyYXk8c3RyaW5nPikgOiBzdHJpbmcgeworCisgICAgICAgIGlmICh2YXJpYWJsZXM9PT1udWxsIHx8IHZhcmlhYmxlcz09PXVuZGVmaW5lZCB8fCB2YXJpYWJsZXMubGVuZ3RoPT09MCl7CisgICAgICAgICAgICB2YXJpYWJsZXM9WycnXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAobGV0IGk9MDtpPHZhcmlhYmxlcy5sZW5ndGg7aSsrKXsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZXNbaV09PT0nJyB8fCB2YXJpYWJsZXNbaV09PT1udWxsKXsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZXNbaV09Jy0tREVMRVRFLS0nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGV0IHJlcyA9IHRoaXMucmVwbGFjZSgvJShcZCspL2csIGZ1bmN0aW9uKF8sbSkgeworICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlc1stLW1dOworICAgICAgICB9KTsKKworICAgICAgICByZXMgPSByZXMucmVwbGFjZSgiICctLURFTEVURS0tJyAiLCIgIik7CisgICAgICAgIHJlcyA9IHJlcy5yZXBsYWNlKCIgXCItLURFTEVURS0tXCIgIiwiICIpOworICAgICAgICByZXMgPSByZXMucmVwbGFjZSgiJy0tREVMRVRFLS0nIiwiIik7CisgICAgICAgIHJlcyA9IHJlcy5yZXBsYWNlKCJcIi0tREVMRVRFLS1cIiIsIiIpOworICAgICAgICByZXMgPSByZXMucmVwbGFjZSgiLS1ERUxFVEUtLSIsIiIpOworCisgICAgICAgIHJldHVybiByZXM7CisgICAgfTsKK30KKworaWYgKCFTdHJpbmcuaGFzT3duUHJvcGVydHkoImNhcGl0YWxpemVGaXJzdExldHRlciIpKSB7CisgICAgU3RyaW5nLnByb3RvdHlwZVsiY2FwaXRhbGl6ZUZpcnN0TGV0dGVyIl0gPSBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnNsaWNlKDEpOworICAgIH07Cit9CisKK2lmICghU3RyaW5nLmhhc093blByb3BlcnR5KCJyZXBsYWNlQWxsIikpIHsKKyAgICBTdHJpbmcucHJvdG90eXBlWyJyZXBsYWNlQWxsIl0gPSBmdW5jdGlvbiAoZmluZDpzdHJpbmcsIHJlcGxhY2U6c3RyaW5nKSA6IHN0cmluZyB7CisgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UobmV3IFJlZ0V4cChmaW5kLCAnZycpLCByZXBsYWNlKTsKKyAgICB9OworfQorCitpZiAoIUFycmF5Lmhhc093blByb3BlcnR5KCJjbGVhbiIpKSB7CisgICAgQXJyYXkucHJvdG90eXBlLmNsZWFuID0gZnVuY3Rpb24gKGRlbGV0ZVZhbHVlKSB7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT0gZGVsZXRlVmFsdWUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNwbGljZShpLCAxKTsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfTsKK30KKworaWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7CisgICAgQXJyYXkucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7CisKKyAgICAgICAgbGV0IFQsIEEsIGs7CisKKyAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiIHRoaXMgaXMgbnVsbCBvciBub3QgZGVmaW5lZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gMS4gTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvT2JqZWN0IHBhc3NpbmcgdGhlIHx0aGlzfCB2YWx1ZSBhcyB0aGUgYXJndW1lbnQuCisgICAgICAgIGxldCBPID0gT2JqZWN0KHRoaXMpOworCisgICAgICAgIC8vIDIuIExldCBsZW5WYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEdldCBpbnRlcm5hbCBtZXRob2Qgb2YgTyB3aXRoIHRoZSBhcmd1bWVudCAibGVuZ3RoIi4KKyAgICAgICAgLy8gMy4gTGV0IGxlbiBiZSBUb1VpbnQzMihsZW5WYWx1ZSkuCisgICAgICAgIGxldCBsZW4gPSBPLmxlbmd0aCA+Pj4gMDsKKworICAgICAgICAvLyA0LiBJZiBJc0NhbGxhYmxlKGNhbGxiYWNrKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgorICAgICAgICAvLyBTZWU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuMTEKKyAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjYWxsYmFjayArICIgaXMgbm90IGEgZnVuY3Rpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDUuIElmIHRoaXNBcmcgd2FzIHN1cHBsaWVkLCBsZXQgVCBiZSB0aGlzQXJnOyBlbHNlIGxldCBUIGJlIHVuZGVmaW5lZC4KKyAgICAgICAgaWYgKHRoaXNBcmcpIHsKKyAgICAgICAgICAgIFQgPSB0aGlzQXJnOworICAgICAgICB9CisKKyAgICAgICAgLy8gNi4gTGV0IEEgYmUgYSBuZXcgYXJyYXkgY3JlYXRlZCBhcyBpZiBieSB0aGUgZXhwcmVzc2lvbiBuZXcgQXJyYXkobGVuKSB3aGVyZSBBcnJheSBpcworICAgICAgICAvLyB0aGUgc3RhbmRhcmQgYnVpbHQtaW4gY29uc3RydWN0b3Igd2l0aCB0aGF0IG5hbWUgYW5kIGxlbiBpcyB0aGUgdmFsdWUgb2YgbGVuLgorICAgICAgICBBID0gbmV3IEFycmF5KGxlbik7CisKKyAgICAgICAgLy8gNy4gTGV0IGsgYmUgMAorICAgICAgICBrID0gMDsKKworICAgICAgICAvLyA4LiBSZXBlYXQsIHdoaWxlIGsgPCBsZW4KKyAgICAgICAgd2hpbGUoayA8IGxlbikgeworCisgICAgICAgICAgICBsZXQga1ZhbHVlLCBtYXBwZWRWYWx1ZTsKKworICAgICAgICAgICAgLy8gYS4gTGV0IFBrIGJlIFRvU3RyaW5nKGspLgorICAgICAgICAgICAgLy8gICBUaGlzIGlzIGltcGxpY2l0IGZvciBMSFMgb3BlcmFuZHMgb2YgdGhlIGluIG9wZXJhdG9yCisgICAgICAgICAgICAvLyBiLiBMZXQga1ByZXNlbnQgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBIYXNQcm9wZXJ0eSBpbnRlcm5hbCBtZXRob2Qgb2YgTyB3aXRoIGFyZ3VtZW50IFBrLgorICAgICAgICAgICAgLy8gICBUaGlzIHN0ZXAgY2FuIGJlIGNvbWJpbmVkIHdpdGggYworICAgICAgICAgICAgLy8gYy4gSWYga1ByZXNlbnQgaXMgdHJ1ZSwgdGhlbgorICAgICAgICAgICAgaWYgKGsgaW4gTykgeworCisgICAgICAgICAgICAgICAgLy8gaS4gTGV0IGtWYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEdldCBpbnRlcm5hbCBtZXRob2Qgb2YgTyB3aXRoIGFyZ3VtZW50IFBrLgorICAgICAgICAgICAgICAgIGtWYWx1ZSA9IE9bIGsgXTsKKworICAgICAgICAgICAgICAgIC8vIGlpLiBMZXQgbWFwcGVkVmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBDYWxsIGludGVybmFsIG1ldGhvZCBvZiBjYWxsYmFjaworICAgICAgICAgICAgICAgIC8vIHdpdGggVCBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYXJndW1lbnQgbGlzdCBjb250YWluaW5nIGtWYWx1ZSwgaywgYW5kIE8uCisgICAgICAgICAgICAgICAgbWFwcGVkVmFsdWUgPSBjYWxsYmFjay5jYWxsKFQsIGtWYWx1ZSwgaywgTyk7CisKKyAgICAgICAgICAgICAgICAvLyBpaWkuIENhbGwgdGhlIERlZmluZU93blByb3BlcnR5IGludGVybmFsIG1ldGhvZCBvZiBBIHdpdGggYXJndW1lbnRzCisgICAgICAgICAgICAgICAgLy8gUGssIFByb3BlcnR5IERlc2NyaXB0b3Ige1ZhbHVlOiBtYXBwZWRWYWx1ZSwgOiB0cnVlLCBFbnVtZXJhYmxlOiB0cnVlLCBDb25maWd1cmFibGU6IHRydWV9LAorICAgICAgICAgICAgICAgIC8vIGFuZCBmYWxzZS4KKworICAgICAgICAgICAgICAgIC8vIEluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBPYmplY3QuZGVmaW5lUHJvcGVydHksIHVzZSB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCBQaywgeyB2YWx1ZTogbWFwcGVkVmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgYmVzdCBicm93c2VyIHN1cHBvcnQsIHVzZSB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIEFbIGsgXSA9IG1hcHBlZFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZC4gSW5jcmVhc2UgayBieSAxLgorICAgICAgICAgICAgaysrOworICAgICAgICB9CisKKyAgICAgICAgLy8gOS4gcmV0dXJuIEEKKyAgICAgICAgcmV0dXJuIEE7CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvdmFsaWRhdGlvbi11dGlscy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdXRpbHMvdmFsaWRhdGlvbi11dGlscy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE4ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy91dGlscy92YWxpZGF0aW9uLXV0aWxzLnRzCkBAIC0wLDAgKzEsMTczIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLlV0aWxzIHsKKyAgICBjbGFzcyBiYXNlUGF0dGVybnsKKyAgICAgICAgcGF0dGVybjpSZWdFeHA7CisgICAgICAgIGJhc2U6bnVtYmVyOworICAgICAgICBjb25zdHJ1Y3RvcihwYXR0ZXJuOlJlZ0V4cCwgYmFzZTpudW1iZXIpeworICAgICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElNYXBSZWdleHsKKyAgICAgICAgaW50ZWdlcjogUmVnRXhwOworICAgICAgICBib29sZWFuOiBSZWdFeHA7CisgICAgICAgIGZsb2F0OiBSZWdFeHA7CisgICAgICAgIHN0cmluZzogUmVnRXhwOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uVXRpbHMgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnSW50ZWdlck5vTGVhZGluZ1plcm9WYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnRmxvYXRWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdCb29sZWFuVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ051bWJlclZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdMYWJlbFZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgXTsKKyAgICAgICAgcHJpdmF0ZSB0cnVlUmVnZXggOiBzdHJpbmcgPSAnW3RdW3JdW3VdW2VdfFt0XXxbb11bbl18W3ldfFt5XVtlXVtzXXxbMV0nOworICAgICAgICBwcml2YXRlIGZhbHNlUmVnZXggOiBzdHJpbmcgPSAnW2ZdW2FdW2xdW3NdW2VdfFtmXXxbb11bZl1bZl18W25dfFtuXVtvXXxbMF0nOworICAgICAgICBwcml2YXRlIGhlYXRCb29sZWFuVmFsaWRhdGlvblBhdHRlcm4gOiBSZWdFeHAgPSBuZXcgUmVnRXhwKCAnXignK3RoaXMudHJ1ZVJlZ2V4Kyd8Jyt0aGlzLmZhbHNlUmVnZXgrJykkJyk7CisKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIEludGVnZXJOb0xlYWRpbmdaZXJvVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIEZsb2F0VmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQm9vbGVhblZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBOdW1iZXJWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTGFiZWxWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHApIHt9CisKKyAgICAgICAgcHVibGljIHN0cmlwQW5kU2FuaXRpemUodGV4dDpzdHJpbmcpOnN0cmluZ3sKKyAgICAgICAgICAgIGlmKCF0ZXh0KXsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xzKy9nLCAnICcpLnJlcGxhY2UoLyVbQS1GYS1mMC05XXsyfS9nLCAnJykudHJpbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGdldFZhbGlkYXRpb25QYXR0ZXJuID0gKHZhbGlkYXRpb25UeXBlOnN0cmluZyAsIHBhcmFtZXRlclR5cGU/OnN0cmluZykgOiBSZWdFeHAgPT4geworICAgICAgICAgICAgc3dpdGNoICh2YWxpZGF0aW9uVHlwZSl7CisgICAgICAgICAgICAgICAgY2FzZSAnaW50ZWdlcic6CisgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5JbnRlZ2VyTm9MZWFkaW5nWmVyb1ZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5GbG9hdFZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk51bWJlclZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzoKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvL0J1ZyBGaXggREUxOTc0MzcgW1BhdGNoXU1pc21hdGNoIGJldHdlZW4gQkUgdG8gRkUgcmVnYXJkaW5nIHN1cHBvcnRlZCBjaGFyYWN0ZXJzIGluIEJvb2xlYW4gZmlsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGFyYW1ldGVyVHlwZSAmJiBwYXJhbWV0ZXJUeXBlID09PSAnaGVhdCcpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhdEJvb2xlYW5WYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQm9vbGVhblZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSAnbGFiZWwnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5MYWJlbFZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ2NhdGVnb3J5JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTGFiZWxWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBnZXRQcm9wZXJ0eUxpc3RQYXR0ZXJucygpOklNYXBSZWdleCB7CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgIGludGVnZXI6IC9eKDB8Wy0rXT9bMS05XVswLTldKnxbLStdPzB4WzAtOWEtZkEtRl0rfFstK10/MG9bMC03XSspKCw/KDB8Wy0rXT9bMS05XVswLTldKnxbLStdPzB4WzAtOWEtZkEtRl0rfFstK10/MG9bMC03XSspKSokLywKKyAgICAgICAgICAgICAgICBzdHJpbmc6IC9eIltcdTAwMDAtXHUwMDIxXHUwMDIzLVx1MDBCRl0rIihccyosP1xzKiJbXHUwMDAwLVx1MDAyMVx1MDAyMy1cdTAwQkZdKyIpKiQvLAorICAgICAgICAgICAgICAgIGJvb2xlYW46IC9eKFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pKCw/KFtUdF1bUnJdW1V1XVtFZV18W0ZmXVtBYV1bTGxdW1NzXVtFZV0pKSokLywKKyAgICAgICAgICAgICAgICBmbG9hdDogL15bLStdP1swLTldKlwuP1swLTldKyhbZUVdWy0rXT9bMC05XSspPygsP1stK10/WzAtOV0qXC4/WzAtOV0rKFtlRV1bLStdP1swLTldKyk/Zj8pKiQvCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBnZXRQcm9wZXJ0eU1hcFBhdHRlcm5zKCk6SU1hcFJlZ2V4IHsKKyAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgaW50ZWdlcjogL14iXHcrIlxzKjpccz8oMHxbLStdP1sxLTldWzAtOV0qfFstK10/MHhbMC05YS1mQS1GXSt8Wy0rXT8wb1swLTddKykrKFxzKiw/XHMqIlx3KyJccz86XHM/KDB8Wy0rXT9bMS05XVswLTldKnxbLStdPzB4WzAtOWEtZkEtRl0rfFstK10/MG9bMC03XSspKykqJC8sCisgICAgICAgICAgICAgICAgc3RyaW5nOiAvXiJcdysiXHM/OlxzPyJbXHUwMDAwLVx1MDAyMVx1MDAyMy1cdTAwQkZdKiIoXHMqLD9ccyoiXHcrIlxzPzpccz8iW1x1MDAwMC1cdTAwMjFcdTAwMjMtXHUwMEJGXSoiKSokLywKKyAgICAgICAgICAgICAgICBib29sZWFuOiAvXiJcdysiXHM/OlxzPyhbVHRdW1JyXVtVdV1bRWVdfFtGZl1bQWFdW0xsXVtTc11bRWVdKShccyosP1xzKiJcdysiXHM/OlxzPyhbVHRdW1JyXVtVdV1bRWVdfFtGZl1bQWFdW0xsXVtTc11bRWVdKSkqJC8sCisgICAgICAgICAgICAgICAgZmxvYXQ6IC9eIlx3KyJccz86XHM/Wy0rXT9bMC05XSpcLj9bMC05XSsoW2VFXVstK10/WzAtOV0rKT9mPyhccyosP1xzKiJcdysiXHM/OlxzP1stK10/WzAtOV0qXC4/WzAtOV0rKFtlRV1bLStdP1swLTldKyk/Zj8pKiQvCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2YWxpZGF0ZVVuaXF1ZUtleXModmlld1ZhbHVlOnN0cmluZyk6Ym9vbGVhbiB7CisgICAgICAgICAgICBpZighdmlld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vYWxsb3cgZW1wdHkgdmFsdWUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGpzb246c3RyaW5nID0gInsiICsgdmlld1ZhbHVlLnJlcGxhY2UoL1xzXHMrL2csICcgJykgKyAifSI7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgbGV0IG9iajphbnkgPSBKU09OLnBhcnNlKGpzb24pOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgLy9NZXRob2QgIzEgOiBjaGVjayBqc29uIHN0cmluZyBsZW5ndGggYmVmb3JlICYgYWZ0ZXIgcGFyc2luZworICAgICAgICAgICAgICAgIGxldCBuZXdKc29uOnN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9iaik7CisgICAgICAgICAgICAgICAgaWYgKG5ld0pzb24ubGVuZ3RoIDwganNvbi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0qLworCisgICAgICAgICAgICAgICAgLy9NZXRob2QgIzIgOiBjaGVjayBob3cgbWFueSB0aW1lcyB3ZSBjYW4gZmluZCAiS0VZIjogaW4ganNvbiBzdHJpbmcKKyAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OmJvb2xlYW4gPSB0cnVlOworICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoa2V5OnN0cmluZykgPT4geworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYganNvbi5zcGxpdCgnIicgKyBrZXkgKyAnIjonKS5sZW5ndGggPT09IDI7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICAgICAgfWNhdGNoKGUpeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy9ub3QgYSB2YWxpZCBKU09OCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmFsaWRhdGVKc29uID0gKGpzb246c3RyaW5nKTpib29sZWFuID0+IHsKKyAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgIEpTT04ucGFyc2UoanNvbik7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH1jYXRjaChlcnIpeworICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaW52YWxpZCBqc29uJyk7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHZhbGlkYXRlSW50UmFuZ2UgPSAodmFsdWU6c3RyaW5nKTpib29sZWFuID0+IHsKKworICAgICAgICAgICAgbGV0IGJhc2U4ID0gIG5ldyBiYXNlUGF0dGVybigvXihbLStdPzBvWzAtN10rKSQvLCA4KTsKKyAgICAgICAgICAgIGxldCBiYXNlMTAgPSBuZXcgYmFzZVBhdHRlcm4oL14oMHxbLStdP1sxLTldWzAtOV0qKSQvLCAxMCk7CisgICAgICAgICAgICBsZXQgYmFzZTE2ID0gbmV3IGJhc2VQYXR0ZXJuKC9eKFstK10/MHhbMC05YS1mQS1GXSspJC8sIDE2KTsKKworICAgICAgICAgICAgbGV0IG1pbjpudW1iZXIgPSAtMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIGxldCBtYXg6bnVtYmVyID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgIGxldCBpbnRQYXR0ZXJuczpBcnJheTxiYXNlUGF0dGVybj4gPSBbYmFzZTgsIGJhc2UxMCwgYmFzZTE2XTsKKyAgICAgICAgICAgIGxldCBtYXRjaGVkQmFzZSA9IF8uZmluZChpbnRQYXR0ZXJucywgKGl0ZW0pPT4geworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnBhdHRlcm4udGVzdCh2YWx1ZSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbGV0IHBhcnNlZDpudW1iZXIgPSBwYXJzZUludCh2YWx1ZS5yZXBsYWNlKCdvJywnJyksIG1hdGNoZWRCYXNlLmJhc2UpOworICAgICAgICAgICAgaWYocGFyc2VkKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWluIDw9IHBhcnNlZCAmJiBtYXggPj0gcGFyc2VkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRkLWNhdGVnb3J5LW1vZGFsL2FkZC1jYXRlZ29yeS1tb2RhbC12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRkLWNhdGVnb3J5LW1vZGFsL2FkZC1jYXRlZ29yeS1tb2RhbC12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzFkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9hZGQtY2F0ZWdvcnktbW9kYWwvYWRkLWNhdGVnb3J5LW1vZGFsLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSw5NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElBZGRDYXRlZ29yeU1vZGFsVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBjYXRlZ29yeTpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2U7CisgICAgICAgIG1vZGVsVHlwZTpzdHJpbmc7CisgICAgICAgIGZvb3RlckJ1dHRvbnM6IEFycmF5PGFueT47CisgICAgICAgIGZvcm1zOmFueTsKKworICAgICAgICBzYXZlKCk6dm9pZDsKKyAgICAgICAgY2xvc2UoKTp2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBZGRDYXRlZ29yeU1vZGFsVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhdGVnb3J5UmVzb3VyY2VTZXJ2aWNlJywKKyAgICAgICAgICAgICckbW9kYWxJbnN0YW5jZScsCisgICAgICAgICAgICAncGFyZW50Q2F0ZWdvcnknLAorICAgICAgICAgICAgJ3R5cGUnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IoCisgICAgICAgICAgICBwcml2YXRlICRzY29wZTpJQWRkQ2F0ZWdvcnlNb2RhbFZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVJlc291cmNlU2VydmljZTpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2VDbGFzcywKKyAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSwKKyAgICAgICAgICAgIHByaXZhdGUgcGFyZW50Q2F0ZWdvcnk6U2RjLlNlcnZpY2VzLklDYXRlZ29yeVJlc291cmNlLAorICAgICAgICAgICAgcHJpdmF0ZSB0eXBlOnN0cmluZworICAgICAgICApeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5mb3JtcyA9IHt9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kZWxUeXBlID0gdGhpcy5wYXJlbnRDYXRlZ29yeSA/ICdzdWIgY2F0ZWdvcnknIDogJ2NhdGVnb3J5JzsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNhdGVnb3J5ID0gbmV3IHRoaXMuY2F0ZWdvcnlSZXNvdXJjZVNlcnZpY2UoKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2xvc2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmRpc21pc3MoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNhdmUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBvbk9rID0gKG5ld0NhdGVnb3J5IDpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmNsb3NlKG5ld0NhdGVnb3J5KTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uQ2FuY2VsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIC8vZXJyb3IKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgaWYoIXRoaXMucGFyZW50Q2F0ZWdvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2F0ZWdvcnkuJHNhdmUoe3R5cGVzOiB0aGlzLnR5cGUrInMifSwgb25Paywgb25DYW5jZWwpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jYXRlZ29yeS4kc2F2ZVN1YkNhdGVnb3J5KHt0eXBlczogdGhpcy50eXBlKyJzIiwgY2F0ZWdvcnlJZDogdGhpcy5wYXJlbnRDYXRlZ29yeS51bmlxdWVJZH0sIG9uT2ssIG9uQ2FuY2VsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvb3RlckJ1dHRvbnMgPSBbCisgICAgICAgICAgICAgICAgeyduYW1lJzogJ09LJywgJ2Nzcyc6ICdibHVlJywgJ2NhbGxiYWNrJzogdGhpcy4kc2NvcGUuc2F2ZSwgJ2Rpc2FibGVkJzogdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyduYW1lJzogJ0NhbmNlbCcsICdjc3MnOiAnZ3JleScsICdjYWxsYmFjayc6IHRoaXMuJHNjb3BlLmNsb3NlfQorICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHdhdGNoKCJmb3Jtcy5lZGl0Rm9ybS4kaW52YWxpZCIsIChuZXdWYWwsIG9sZFZhbCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvb3RlckJ1dHRvbnNbMF0uZGlzYWJsZWQgPSB0aGlzLiRzY29wZS5mb3Jtcy5lZGl0Rm9ybS4kaW52YWxpZDsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRkLWNhdGVnb3J5LW1vZGFsL2FkZC1jYXRlZ29yeS1tb2RhbC12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9hZGQtY2F0ZWdvcnktbW9kYWwvYWRkLWNhdGVnb3J5LW1vZGFsLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzE4OTgyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRkLWNhdGVnb3J5LW1vZGFsL2FkZC1jYXRlZ29yeS1tb2RhbC12aWV3Lmh0bWwKQEAgLTAsMCArMSw0MSBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZSIKKyAgICAgICAgICAgdHlwZT0iY2xhc3NpYyIKKyAgICAgICAgICAgY2xhc3M9Imktc2RjLWFkbWluLWFkZC1jYXRlZ29yeS1tb2RhbCBtb2RhbC10eXBlLWNvbmZpcm1hdGlvbiIKKyAgICAgICAgICAgaGVhZGVyLXRyYW5zbGF0ZT0iQ1JFQVRFX0NBVEVHT1JZX01PREFMX0hFQURFUiIKKyAgICAgICAgICAgYnV0dG9ucz0iZm9vdGVyQnV0dG9ucyIKKyAgICAgICAgICAgaGVhZGVyLXRyYW5zbGF0ZS12YWx1ZXM9InsnbW9kZWxUeXBlJzogJ3t7bW9kZWxUeXBlfX0nIH0iCisgICAgICAgICAgIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIgorICAgICAgICAgICBoaWRlLWJhY2tncm91bmQ9ImZhbHNlIgorPgorCisgICAgPGZvcm0gbm92YWxpZGF0ZSBjbGFzcz0idy1zZGMtZm9ybSIgbmFtZT0iZm9ybXMuZWRpdEZvcm0iPgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIgorICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihlZGl0Rm9ybS5jYXRlZ29yeU5hbWUuJGRpcnR5ICYmIGVkaXRGb3JtLmNhdGVnb3J5TmFtZS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIiB0cmFuc2xhdGU9IkNSRUFURV9DQVRFR09SWV9NT0RBTF9DQVRFR09SWV9OQU1FIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlLXZhbHVlcz0ieydtb2RlbFR5cGUnOiAne3ttb2RlbFR5cGV9fScgfSI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iY2F0ZWdvcnkubmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY2F0ZWdvcnlOYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9InJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1taW5sZW5ndGg9IjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49Im5hbWVQYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cyAvPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImVkaXRGb3JtLmNhdGVnb3J5TmFtZS4kZGlydHkgJiYgZWRpdEZvcm0uY2F0ZWdvcnlOYW1lLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNhdGVnb3J5TmFtZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iQ1JFQVRFX0NBVEVHT1JZX01PREFMX1JFUVVJUkVEIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21vZGVsVHlwZSc6ICd7e21vZGVsVHlwZX19JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jYXRlZ29yeU5hbWUuJGVycm9yLm1pbmxlbmd0aCIgdHJhbnNsYXRlPSJDUkVBVEVfQ0FURUdPUllfTU9EQUxfTUlOTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21pbmxlbmd0aCc6ICc0JywgJ21vZGVsVHlwZSc6ICd7e21vZGVsVHlwZX19JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jYXRlZ29yeU5hbWUuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iQ1JFQVRFX0NBVEVHT1JZX01PREFMX1BBVFRFUk4iIHRyYW5zbGF0ZS12YWx1ZXM9InsnbW9kZWxUeXBlJzogJ3t7bW9kZWxUeXBlfX0nIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9mb3JtPgorCis8L3NkYy1tb2RhbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2FkZC1jYXRlZ29yeS1tb2RhbC9hZGQtY2F0ZWdvcnktbW9kYWwtdmlldy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRkLWNhdGVnb3J5LW1vZGFsL2FkZC1jYXRlZ29yeS1tb2RhbC12aWV3Lmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkODRhYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2FkZC1jYXRlZ29yeS1tb2RhbC9hZGQtY2F0ZWdvcnktbW9kYWwtdmlldy5sZXNzCkBAIC0wLDAgKzEsMyBAQAorLmktc2RjLWFkbWluLWFkZC1jYXRlZ29yeS1tb2RhbCB7CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2FkbWluLWRhc2hib2FyZC12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRtaW4tZGFzaGJvYXJkLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjYmJjYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2FkbWluLWRhc2hib2FyZC12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsODIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworCisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElBZG1pbkRhc2hib2FyZFZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgdmVyc2lvbjpzdHJpbmc7CisgICAgICAgIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb247CisgICAgICAgIGlzTG9hZGluZzogYm9vbGVhbjsKKyAgICAgICAgY3VycmVudFRhYjogc3RyaW5nOworICAgICAgICB0ZW1wbGF0ZVVybDpzdHJpbmc7CisgICAgICAgIG1vbml0b3JVcmw6c3RyaW5nOworICAgICAgICBtb3ZlVG9UYWIodGFiOnN0cmluZyk6dm9pZDsKKyAgICAgICAgaXNTZWxlY3RlZCh0YWI6c3RyaW5nKTpib29sZWFuOworICAgIH0KKworCisgICAgZXhwb3J0IGNsYXNzIEFkbWluRGFzaGJvYXJkVmlld01vZGVsIHsKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJQWRtaW5EYXNoYm9hcmRWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24pIHsKKworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmVyc2lvbiA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgndmVyc2lvbicpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2RjQ29uZmlnID0gdGhpcy5zZGNDb25maWc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb25pdG9yVXJsID0gdGhpcy4kc2NvcGUuc2RjQ29uZmlnLmFwaS5raWJhbmE7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1NlbGVjdGVkPSh0YWI6c3RyaW5nKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFiPT09dGhpcy4kc2NvcGUuY3VycmVudFRhYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW92ZVRvVGFiPSh0YWI6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodGFiPT09dGhpcy4kc2NvcGUuY3VycmVudFRhYil7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZih0YWIgPT09ICdVU0VSX01BTkFHRU1FTlQnKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudGVtcGxhdGVVcmwgPSAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LXZpZXcuaHRtbCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYodGFiID09PSdDQVRFR09SWV9NQU5BR0VNRU5UJyl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRlbXBsYXRlVXJsID0gJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvY2F0ZWdvcnktbWFuYWdlbWVudC9jYXRlZ29yeS1tYW5hZ2VtZW50LXZpZXcuaHRtbCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgLyogZWxzZSBpZih0YWIgPT09J0VDT01QJyl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRlbXBsYXRlVXJsID0gJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvZWNvbXAvZWNvbXAtdmlldy5odG1sJzsKKyAgICAgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50VGFiID0gdGFiOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW92ZVRvVGFiKCdVU0VSX01BTkFHRU1FTlQnKTsKKworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9hZG1pbi1kYXNoYm9hcmQtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRtaW4tZGFzaGJvYXJkLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM1MjVhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRtaW4tZGFzaGJvYXJkLXZpZXcuaHRtbApAQCAtMCwwICsxLDI0IEBACis8ZGl2IGNsYXNzPSJzZGMtYWRtaW4tY29udGFpbmVyIj4KKworICAgIDwhLS08ZWNvbXAtaGVhZGVyIG1lbnUtZGF0YT0ibWVudUl0ZW1zIiB2ZXJzaW9uPSJ7e3ZlcnNpb259fSIgY2xpY2thYmxlLWxvZ289ImZhbHNlIj48L2Vjb21wLWhlYWRlcj4tLT4KKworICAgIDxuYXYgY2xhc3M9InNkYy1hZG1pbi10b3AtYmFyLW1lbnUiPgorICAgICAgICA8YnV0dG9uIGNsYXNzPSJzZGMtYWRtaW4tdG9wLWJhci1tZW51LXRhYiIgZGF0YS10ZXN0cy1pZD0idXNlcm1hbmFnbWVudHRhYiIKKyAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogaXNTZWxlY3RlZCgnVVNFUl9NQU5BR0VNRU5UJyl9IgorICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9Im1vdmVUb1RhYignVVNFUl9NQU5BR0VNRU5UJykiCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlPSJVU0VSX01BTkFHRU1FTlQiPgorICAgICAgICA8L2J1dHRvbj4KKyAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic2RjLWFkbWluLXRvcC1iYXItbWVudS10YWIiIGRhdGEtdGVzdHMtaWQ9ImNhdGVnb3J5bWFuYWdtZW50dGFiIgorICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiBpc1NlbGVjdGVkKCdDQVRFR09SWV9NQU5BR0VNRU5UJyl9IgorICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9Im1vdmVUb1RhYignQ0FURUdPUllfTUFOQUdFTUVOVCcpIgorICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT0iQ0FURUdPUllfTUFOQUdFTUVOVCI+CisgICAgICAgIDwvYnV0dG9uPgorICAgICAgICA8YSBocmVmPXt7bW9uaXRvclVybH19IHRhcmdldD0iX2JsYW5rIiBuZy1zaG93PSJtb25pdG9yVXJsIT0nJyIgPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic2RjLWFkbWluLXRvcC1iYXItbWVudS1tb25pdG9yLWJ0biIgdHJhbnNsYXRlPSJNT05JVE9SIiBkYXRhLXRlc3RzLWlkPSJtb25pdG9yIj48L2J1dHRvbj4KKyAgICAgICAgPC9hPgorICAgIDwvbmF2PgorCisgICAgPGRpdiBjbGFzcz0ic2RjLWFkbWluLWJvZHkiPgorICAgICAgICA8bmctaW5jbHVkZSBzcmM9InRlbXBsYXRlVXJsIiAgbmctaWY9InRydWUiPjwvbmctaW5jbHVkZT4KKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRtaW4tZGFzaGJvYXJkLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9hZG1pbi1kYXNoYm9hcmQubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzRhMDJjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRtaW4tZGFzaGJvYXJkLmxlc3MKQEAgLTAsMCArMSw0OSBAQAorLnNkYy1hZG1pbi1jb250YWluZXJ7CisgICAgaGVpZ2h0OiAxMDAlOworCisgICAgLnNkYy1hZG1pbi10b3AtYmFyLW1lbnV7CisgICAgICAgIC5iZ19rOworICAgICAgICBoZWlnaHQ6IEB0b3BfbmF2X2FkbWluX2hlaWdodDsKKyAgICAgICAgcGFkZGluZy1sZWZ0OjI2MHB4OworICAgICAgICAuYm94LXNoYWRvdygtMXB4IDBweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4zMykpOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogQGhlYWRlcl9oZWlnaHQ7CisgICAgICAgIGxlZnQ6IDA7CisgICAgICAgIHJpZ2h0OiAwOworICAgICAgICB6LWluZGV4OiAyOworCisgICAgICAgIC5zZGMtYWRtaW4tdG9wLWJhci1tZW51LXRhYnsKKyAgICAgICAgICAgIC5iXzE3OworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICBoZWlnaHQ6IDQ0cHg7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDBweCAxMHB4IDBweCAxMHB4OworICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKKyAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTVweDsKKyAgICAgICAgICAgICYuc2VsZWN0ZWQgeworICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgNHB4IEBjb2xvcl90OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC5zZGMtYWRtaW4tdG9wLWJhci1tZW51LW1vbml0b3ItYnRueworICAgICAgICAgICAgICAgIC5iZ19hOworICAgICAgICAgICAgICAgIC5jXzY7CisgICAgICAgICAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgICAgICBwYWRkaW5nOiAxMXB4IDI0cHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuc2RjLWFkbWluLWJvZHl7CisgICAgICAgIC5iZ19uOworICAgICAgICBwYWRkaW5nOiA0MHB4IDI2MHB4IDYwcHggMjYwcHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiBAdG9wX25hdl9hZG1pbl9oZWlnaHQ7CisgICAgICAgIGxlZnQ6IDA7CisgICAgICAgIHJpZ2h0OiAwOworICAgICAgICBib3R0b206IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvY2F0ZWdvcnktbWFuYWdlbWVudC9jYXRlZ29yeS1tYW5hZ2VtZW50LXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9jYXRlZ29yeS1tYW5hZ2VtZW50L2NhdGVnb3J5LW1hbmFnZW1lbnQtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FkN2EyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvY2F0ZWdvcnktbWFuYWdlbWVudC9jYXRlZ29yeS1tYW5hZ2VtZW50LXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwxOTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGludGVyZmFjZSBJQ2F0ZWdvcnlNYW5hZ2VtZW50Vmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBTRVJWSUNFOnN0cmluZzsKKyAgICAgICAgUkVTT1VSQ0U6c3RyaW5nOworICAgICAgICBjYXRlZ29yaWVzVG9TaG93OiBBcnJheTxTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2U+OworICAgICAgICBzZXJ2aWNlQ2F0ZWdvcmllczogQXJyYXk8U2RjLlNlcnZpY2VzLklDYXRlZ29yeVJlc291cmNlPjsKKyAgICAgICAgcmVzb3VyY2VDYXRlZ29yaWVzOiBBcnJheTxTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2U+OworICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2U7CisgICAgICAgIHNlbGVjdGVkU3ViQ2F0ZWdvcnk6IFNkYy5TZXJ2aWNlcy5JQ2F0ZWdvcnlSZXNvdXJjZTsKKyAgICAgICAgbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlOworICAgICAgICBpc0xvYWRpbmc6Ym9vbGVhbjsKKyAgICAgICAgdHlwZTpzdHJpbmc7CisgICAgICAgIG5hbWVQYXR0ZXJuOlJlZ0V4cDsKKworICAgICAgICBzZWxlY3RDYXRlZ29yeShjYXRlZ29yeTpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UpIDp2b2lkOworICAgICAgICBzZWxlY3RTdWJDYXRlZ29yeShzdWJjYXRlZ29yeTpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UpIDp2b2lkOworICAgICAgICBzZWxlY3RUeXBlKHR5cGU6c3RyaW5nKSA6dm9pZDsKKyAgICAgICAgZGVsZXRlQ2F0ZWdvcnkoY2F0ZWdvcnk6U2RjLlNlcnZpY2VzLklDYXRlZ29yeVJlc291cmNlLCBzdWJDYXRlZ29yeTpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UpIDp2b2lkOworICAgICAgICBjcmVhdGVDYXRlZ29yeU1vZGFsKHBhcmVudENhdGVnb3J5OlNkYy5TZXJ2aWNlcy5JQ2F0ZWdvcnlSZXNvdXJjZSkgOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIENhdGVnb3J5TWFuYWdlbWVudFZpZXdNb2RlbCB7CisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICdzZGNDb25maWcnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25VdGlscycsCisgICAgICAgICAgICAnTW9kYWxzSGFuZGxlcicKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJQ2F0ZWdvcnlNYW5hZ2VtZW50Vmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBWYWxpZGF0aW9uVXRpbHM6IFNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTW9kYWxzSGFuZGxlcjogVXRpbHMuTW9kYWxzSGFuZGxlcgorICAgICAgICApIHsKKworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlbGVjdFR5cGUoU2RjLlV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0UudG9Mb2NhbGVMb3dlckNhc2UoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgc2NvcGU6SUNhdGVnb3J5TWFuYWdlbWVudFZpZXdNb2RlbFNjb3BlID0gdGhpcy4kc2NvcGU7CisgICAgICAgICAgICBzY29wZS5TRVJWSUNFID0gU2RjLlV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0UudG9Mb2NhbGVMb3dlckNhc2UoKTsKKyAgICAgICAgICAgIHNjb3BlLlJFU09VUkNFID0gU2RjLlV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlJFU09VUkNFLnRvTG9jYWxlTG93ZXJDYXNlKCk7CisKKyAgICAgICAgICAgIHNjb3BlLm5hbWVQYXR0ZXJuID0gdGhpcy5WYWxpZGF0aW9uVXRpbHMuZ2V0VmFsaWRhdGlvblBhdHRlcm4oJ2Nzc0NsYXNzZXMnKTsKKworICAgICAgICAgICAgc2NvcGUuc2VsZWN0Q2F0ZWdvcnkgPSAoY2F0ZWdvcnkgOlNkYy5TZXJ2aWNlcy5JQ2F0ZWdvcnlSZXNvdXJjZSkgPT4geworICAgICAgICAgICAgICAgIGlmKHNjb3BlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IGNhdGVnb3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLnNlbGVjdGVkU3ViQ2F0ZWdvcnkgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZS5zZWxlY3RlZENhdGVnb3J5ID0gY2F0ZWdvcnk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc2NvcGUuc2VsZWN0U3ViQ2F0ZWdvcnkgPSAoc3ViY2F0ZWdvcnkgOlNkYy5TZXJ2aWNlcy5JQ2F0ZWdvcnlSZXNvdXJjZSkgPT4geworICAgICAgICAgICAgICAgIHNjb3BlLnNlbGVjdGVkU3ViQ2F0ZWdvcnkgPSBzdWJjYXRlZ29yeTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzY29wZS5zZWxlY3RUeXBlID0gKHR5cGU6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUudHlwZSAhPT0gdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBzY29wZS5zZWxlY3RlZENhdGVnb3J5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWRTdWJDYXRlZ29yeSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2NvcGUudHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgc2NvcGUuY2F0ZWdvcmllc1RvU2hvdyA9IHNjb3BlW3R5cGUgKyAnQ2F0ZWdvcmllcyddOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUuY3JlYXRlQ2F0ZWdvcnlNb2RhbCA9IChwYXJlbnRDYXRlZ29yeTpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vY2FuJ3QgY3JlYXRlIGEgc3ViIGNhdGVnb3J5IGZvciBzZXJ2aWNlCisgICAgICAgICAgICAgICAgaWYocGFyZW50Q2F0ZWdvcnkgJiYgc2NvcGUudHlwZSA9PT0gU2RjLlV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0UudG9Mb3dlckNhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGV0IHR5cGU6c3RyaW5nID0gc2NvcGUudHlwZTsKKworICAgICAgICAgICAgICAgIGxldCBvbk9rID0gKG5ld0NhdGVnb3J5IDpTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBpZighcGFyZW50Q2F0ZWdvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlW3R5cGUgKyAnQ2F0ZWdvcmllcyddLnB1c2gobmV3Q2F0ZWdvcnkpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwYXJlbnRDYXRlZ29yeS5zdWJjYXRlZ29yaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyA9IFtdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnkuc3ViY2F0ZWdvcmllcy5wdXNoKG5ld0NhdGVnb3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25DYW5jZWwgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgbW9kYWxPcHRpb25zOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXR0aW5ncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KCcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2FkZC1jYXRlZ29yeS1tb2RhbC9hZGQtY2F0ZWdvcnktbW9kYWwtdmlldy5odG1sJyksCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5BZGRDYXRlZ29yeU1vZGFsVmlld01vZGVsJywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NkYy14c20nLAorICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAgICAgIHNjb3BlOiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnk6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50Q2F0ZWdvcnk7CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsSW5zdGFuY2UgPSB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgc2NvcGUubW9kYWxJbnN0YW5jZS5yZXN1bHQudGhlbihvbk9rLCBvbkNhbmNlbCk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNjb3BlLmRlbGV0ZUNhdGVnb3J5ID0gKGNhdGVnb3J5OiBTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UsIHN1YkNhdGVnb3J5OiBTZGMuU2VydmljZXMuSUNhdGVnb3J5UmVzb3VyY2UpOiB2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBvbk9rID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGU6c3RyaW5nID0gc2NvcGUudHlwZTsKKworICAgICAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9IChyZXNwb25zZSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnb25GYWlsZCcsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHJlc3BvbnNlOiBhbnkpIDp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnI6QXJyYXk8U2RjLlNlcnZpY2VzLklDYXRlZ29yeVJlc291cmNlPjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXN1YkNhdGVnb3J5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gdGhpcy4kc2NvcGVbdHlwZSArICdDYXRlZ29yaWVzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShhcnIuaW5kZXhPZihjYXRlZ29yeSksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5ID09PSBzY29wZS5zZWxlY3RlZENhdGVnb3J5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnNlbGVjdGVkQ2F0ZWdvcnkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5zZWxlY3RlZFN1YkNhdGVnb3J5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyciA9IGNhdGVnb3J5LnN1YmNhdGVnb3JpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShhcnIuaW5kZXhPZihzdWJDYXRlZ29yeSksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZighc3ViQ2F0ZWdvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LiRkZWxldGUoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczogdHlwZSsicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SWQ6IGNhdGVnb3J5LnVuaXF1ZUlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgb25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LiRkZWxldGVTdWJDYXRlZ29yeSh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOiB0eXBlKyJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogY2F0ZWdvcnkudW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkNhdGVnb3J5SWQ6IHN1YkNhdGVnb3J5LnVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxldCBtb2RlbFR5cGU6c3RyaW5nID0gc3ViQ2F0ZWdvcnkgPyAnc3ViIGNhdGVnb3J5JyA6ICdjc3NDbGFzc2VzJzsKKyAgICAgICAgICAgICAgICBsZXQgdGl0bGU6c3RyaW5nID0gdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiREVMRVRFX0NBVEVHT1JZX01PREFMX0hFQURFUiIsICJ7J21vZGVsVHlwZSc6ICciICsgbW9kZWxUeXBlICsiJyB9Iik7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U6c3RyaW5nID0gdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiREVMRVRFX0NBVEVHT1JZX01PREFMX0NBVEVHT1JZX05BTUUiLCAieydtb2RlbFR5cGUnOiAnIiArIG1vZGVsVHlwZSArIicgfSIpOworCisgICAgICAgICAgICAgICAgdGhpcy5Nb2RhbHNIYW5kbGVyLm9wZW5Db25maXJtYXRpb25Nb2RhbCh0aXRsZSwgbWVzc2FnZSwgZmFsc2UsICdzZGMteHNtJykudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlcnZpY2VDYXRlZ29yaWVzID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdzZXJ2aWNlQ2F0ZWdvcmllcycpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVzb3VyY2VDYXRlZ29yaWVzID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdyZXNvdXJjZUNhdGVnb3JpZXMnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2NhdGVnb3J5LW1hbmFnZW1lbnQvY2F0ZWdvcnktbWFuYWdlbWVudC12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9jYXRlZ29yeS1tYW5hZ2VtZW50L2NhdGVnb3J5LW1hbmFnZW1lbnQtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTAwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9jYXRlZ29yeS1tYW5hZ2VtZW50L2NhdGVnb3J5LW1hbmFnZW1lbnQtdmlldy5odG1sCkBAIC0wLDAgKzEsNTMgQEAKKzxkaXYgZGF0YS1uZy1jb250cm9sbGVyPSJTZGMuVmlld01vZGVscy5DYXRlZ29yeU1hbmFnZW1lbnRWaWV3TW9kZWwiIGNsYXNzPSJjYXRlZ29yeS1tYW5hZ2VtZW50Ij4KKworICAgIDxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciPjwvbG9hZGVyPgorCisgICAgPGRpdiBjbGFzcz0icm93Ij4KKworICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiI+CisKKyAgICAgICAgICAgIDxoND4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGFuZCBzZWxlY3RlZCIgZGF0YS1uZy1jbGljaz0ic2VsZWN0VHlwZShTRVJWSUNFKSIgZGF0YS10ZXN0cy1pZD0ic2VydmljZWNhdGVnb3J5aGVhZGVyIgorICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiB0eXBlID09PSBTRVJWSUNFfSIgdHJhbnNsYXRlPSJTRVJWSUNFX0NBVEVHT1JZX0hFQURFUiI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoYW5kIiBkYXRhLW5nLWNsaWNrPSJzZWxlY3RUeXBlKFJFU09VUkNFKSIgZGF0YS10ZXN0cy1pZD0icmVzb3VyY2VjYXRlZ29yeWhlYWRlciIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogdHlwZSA9PT0gUkVTT1VSQ0V9IiB0cmFuc2xhdGU9IlJFU09VUkNFX0NBVEVHT1JZX0hFQURFUiI+PC9zcGFuPgorICAgICAgICAgICAgPC9oND4KKyAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctY2xpY2s9ImNyZWF0ZUNhdGVnb3J5TW9kYWwobnVsbCkiIHRyYW5zbGF0ZT0iQUREX0NBVEVHT1JZIiBkYXRhLXRlc3RzLWlkPSJuZXdjYXRlZ29yeSI+PC9zcGFuPgorCisgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgY2xhc3M9InBlcmZlY3Qtc2Nyb2xsYmFyIj4KKyAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdD0iY2F0ZWdvcnkgaW4gY2F0ZWdvcmllc1RvU2hvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiBzZWxlY3RlZENhdGVnb3J5ID09PSBjYXRlZ29yeSwgJ2dyYXknOiBzZWxlY3RlZFN1YkNhdGVnb3J5fSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9InNlbGVjdENhdGVnb3J5KGNhdGVnb3J5KSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7IHR5cGUgPT09IFNFUlZJQ0UgPyAnc2VydmljZWNhdGVnb3J5JyA6ICdyZXNvdXJjZWNhdGVnb3J5JyB9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICB7e2NhdGVnb3J5Lm5hbWV9fQorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGJ1dHRvbiBjbGFzcz0ic3ByaXRlIGUtc2RjLXNtYWxsLWljb25zLWRlbGV0ZSIgZGF0YS1uZy1jbGljaz0iZGVsZXRlQ2F0ZWdvcnkoY2F0ZWdvcnksIG51bGwpIiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWJ1dHRvbiBjbGFzcz0ic3ByaXRlIGUtc2RjLXNtYWxsLWljb25zLXBhZCIgZGF0YS1uZy1jbGljaz0iIiB0eXBlPSJidXR0b24iPjwvYnV0dG9uLS0+CisgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02Ij4KKworICAgICAgICAgICAgPGg0PjxzcGFuIHRyYW5zbGF0ZT0iU1VCQ0FURUdPUllfSEVBREVSIiBkYXRhLXRlc3RzLWlkPSJzdWJjYXRlZ29yeWhlYWRlciI+PC9zcGFuPjwvaDQ+CisgICAgICAgICAgICA8c3BhbiBkYXRhLW5nLWlmPSJ0eXBlID09PSBSRVNPVVJDRSAmJiBzZWxlY3RlZENhdGVnb3J5IiBkYXRhLW5nLWNsaWNrPSJzZWxlY3RlZENhdGVnb3J5ID8gY3JlYXRlQ2F0ZWdvcnlNb2RhbChzZWxlY3RlZENhdGVnb3J5KSA6ICcnIiB0cmFuc2xhdGU9IkFERF9TVUJDQVRFR09SWSIgZGF0YS10ZXN0cy1pZD0ibmV3c3ViY2F0ZWdvcnkiPjwvc3Bhbj4KKworICAgICAgICAgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIGNsYXNzPSJwZXJmZWN0LXNjcm9sbGJhciI+CisgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1uZy1yZXBlYXQ9InN1YmNhdGVnb3J5IGluIHNlbGVjdGVkQ2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiBzZWxlY3RlZFN1YkNhdGVnb3J5ID09PSBzdWJjYXRlZ29yeX0iCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJzZWxlY3RTdWJDYXRlZ29yeShzdWJjYXRlZ29yeSkiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJzdWJjYXRlZ29yeSI+CisgICAgICAgICAgICAgICAgICAgICAgICB7e3N1YmNhdGVnb3J5Lm5hbWV9fQorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGJ1dHRvbiBjbGFzcz0ic3ByaXRlIGUtc2RjLXNtYWxsLWljb25zLWRlbGV0ZSIgZGF0YS1uZy1jbGljaz0iZGVsZXRlQ2F0ZWdvcnkoc2VsZWN0ZWRDYXRlZ29yeSwgc3ViY2F0ZWdvcnkpIiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWJ1dHRvbiBjbGFzcz0ic3ByaXRlIGUtc2RjLXNtYWxsLWljb24tcGFkIiBkYXRhLW5nLWNsaWNrPSIiIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24tLT4KKyAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgPC9kaXY+CisKKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvY2F0ZWdvcnktbWFuYWdlbWVudC9jYXRlZ29yeS1tYW5hZ2VtZW50Lmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC9jYXRlZ29yeS1tYW5hZ2VtZW50L2NhdGVnb3J5LW1hbmFnZW1lbnQubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTExMjJjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvY2F0ZWdvcnktbWFuYWdlbWVudC9jYXRlZ29yeS1tYW5hZ2VtZW50Lmxlc3MKQEAgLTAsMCArMSwxMTggQEAKKworLmNhdGVnb3J5LW1hbmFnZW1lbnQgeworCisgICAgLnJvdyB7CisgICAgICAgIGRpc3BsYXk6IHRhYmxlOworICAgICAgICB3aWR0aDogNzAlOworICAgICAgICBtaW4td2lkdGg6IDgwMHB4OworICAgICAgICBtYXJnaW46IGF1dG87CisKKyAgICAgICAgW2NsYXNzKj0iY29sLSJdIHsKKyAgICAgICAgICAgIGZsb2F0OiBub25lOworICAgICAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKKyAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMWMxYzE7CisgICAgICAgICAgICBwYWRkaW5nOiAwOworCisgICAgICAgICAgICAmOm5vdCg6bGFzdC1jaGlsZCkgeworICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaDQgeworICAgICAgICAgICAgICAgIGZsb2F0OmxlZnQ7CisgICAgICAgICAgICAgICAgY29sb3I6d2hpdGU7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1NSwxNjgsMTc2KTsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDA7CisgICAgICAgICAgICAgICAgcGFkZGluZzogMHB4IDBweCAwcHggMTZweDsKKyAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgICAgICBoZWlnaHQ6IDMxcHg7CisgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4OworCisgICAgICAgICAgICAgICAgc3BhbnsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMzBweDsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAgN3B4OworCisgICAgICAgICAgICAgICAgICAgICYuc2VsZWN0ZWQgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4ICMwNjdhYjQgc29saWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoNCtzcGFueworICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgIGZsb2F0OnJpZ2h0OworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNTksMTI0LDE1Nik7CisgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICAgICAgICAgIHBhZGRpbmc6IDUuNXB4IDBweDsKKyAgICAgICAgICAgICAgICB3aWR0aDogNjBweDsKKyAgICAgICAgICAgICAgICBjb2xvcjogd2hpdGU7CisgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgICAgIHRvcDogMDsKKyAgICAgICAgICAgICAgICByaWdodDogMDsKKyAgICAgICAgICAgICAgICB6LWluZGV4OiAxOworICAgICAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAucGVyZmVjdC1zY3JvbGxiYXIgeworICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgICAgICAgIGhlaWdodDogNTAwcHg7CisgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogNDBweDsKKyAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1bCB7CisgICAgICAgICAgICAgICAgY2xlYXI6IGJvdGg7CisgICAgICAgICAgICAgICAgbWFyZ2luOiA1cHggMCAxMHB4IDA7CisgICAgICAgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgICAgICAgICAgICAgbGl7CisgICAgICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDhweDsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC1pbmRlbnQ6IDlweDsKKyAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4OworICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMjVweDsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgd2hpdGU7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNXB4OworCisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNXB4IDNweDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWU2ZWM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzNiN2I5YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2Q5ZTZlYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJi5zZWxlY3RlZCB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjE5LDIzMCwyMzYpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICMzYjdiOWI7CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoNTksIDEyMywgMTU1LCAwLjQyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgJi5ncmF5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgcmdiYSgxNTUsIDE2OCwgMTc2LCAwLjA5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHdoaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2Vjb21wL2Vjb21wLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL2Vjb21wL2Vjb21wLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg5YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvZWNvbXAvZWNvbXAtdmlldy5odG1sCkBAIC0wLDAgKzEgQEAKKzxkaXY+PC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyMWQwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL3VzZXItbWFuYWdlbWVudC91c2VyLW1hbmFnZW1lbnQtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDIyMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisKKyAgICBpbXBvcnQgSVVzZXJQcm9wZXJ0aWVzID0gU2RjLk1vZGVscy5JVXNlclByb3BlcnRpZXM7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElVc2VyTWFuYWdlbWVudFZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbjsKKyAgICAgICAgdXNlcnNMaXN0OiBBcnJheTxNb2RlbHMuSVVzZXJQcm9wZXJ0aWVzPjsKKyAgICAgICAgaXNMb2FkaW5nOiBib29sZWFuOworICAgICAgICBpc05ld1VzZXI6IGJvb2xlYW47CisgICAgICAgIHNvcnRCeTpzdHJpbmc7CisgICAgICAgIHJldmVyc2U6Ym9vbGVhbjsKKyAgICAgICAgdGFibGVIZWFkZXJzTGlzdDphbnk7CisgICAgICAgIHJvbGVzOkFycmF5PHN0cmluZz47CisgICAgICAgIG5ld1VzZXI6IE1vZGVscy5JVXNlcjsKKyAgICAgICAgY3VycmVudFVzZXI6IFNkYy5TZXJ2aWNlcy5JVXNlclJlc291cmNlOworICAgICAgICB1c2VySWRWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBlZGl0Rm9ybTpuZy5JRm9ybUNvbnRyb2xsZXI7CisgICAgICAgIGdldEFsbFVzZXJzKCk6dm9pZDsKKyAgICAgICAgZWRpdFVzZXJSb2xlKHVzZXI6SVVzZXJQcm9wZXJ0aWVzKTsKKyAgICAgICAgc29ydChzb3J0Qnk6c3RyaW5nKTogdm9pZDsKKyAgICAgICAgY3JlYXRlVXNlcigpOiB2b2lkOworICAgICAgICBkZWxldGVVc2VyKHVzZXJJZDpzdHJpbmcpIDogdm9pZDsKKyAgICAgICAgb25FZGl0VXNlclByZXNzZWQodXNlcjpJVXNlclByb3BlcnRpZXMpOiB2b2lkOworICAgICAgICBzYXZlVXNlckNoYW5nZXModXNlcjpJVXNlclByb3BlcnRpZXMpIDp2b2lkOworICAgICAgICBnZXRUaXRsZShyb2xlOnN0cmluZyk6IHN0cmluZzsKKyAgICAgICAgY2xlYXJGb3JtKCk6dm9pZDsKKworICAgIH0KKworCisgICAgZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VtZW50Vmlld01vZGVsIHsKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLlVzZXJSZXNvdXJjZVNlcnZpY2UnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJ1VzZXJJZFZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJworICAgICAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJVXNlck1hbmFnZW1lbnRWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHVzZXJSZXNvdXJjZVNlcnZpY2U6U2RjLlNlcnZpY2VzLklVc2VyUmVzb3VyY2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFVzZXJJZFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFV0aWxzLk1vZGFsc0hhbmRsZXIKKyAgICAgICAgICAgICAgICkgeworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworCisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBnZXRBbGxVc2VycyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAocmVzcG9uc2UpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRmFpbGQnLCByZXNwb25zZSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZTogQXJyYXk8TW9kZWxzLklVc2VyUHJvcGVydGllcz4pID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS51c2Vyc0xpc3QgID0gcmVzcG9uc2U7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuJHNjb3BlLnVzZXJzTGlzdCwodXNlcjphbnksaTpudW1iZXIpPT57CisgICAgICAgICAgICAgICAgICAgIHVzZXIuaW5kZXggPSBpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMudXNlclJlc291cmNlU2VydmljZS5nZXRBbGxVc2VycyhvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdXBkYXRlVXNlckZpbHRlclRlcm0gPSAodXNlcjogSVVzZXJQcm9wZXJ0aWVzKTogdm9pZCA9PnsKKyAgICAgICAgICAgIHVzZXIuZmlsdGVyVGVybSA9IHVzZXIuZmlyc3ROYW1lICsgJyAnICsgdXNlci5sYXN0TmFtZSArICcgJyArIHVzZXIudXNlcklkICsgJyAnICsgdXNlci5lbWFpbCArICcgJyArIHVzZXIucm9sZSArICcgJyArICB0aGlzLiRmaWx0ZXIoJ2RhdGUnKSh1c2VyLmxhc3RMb2dpblRpbWUsICJNTS9kZC95eXl5Iik7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBzZWxmPXRoaXM7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOiAiRmlyc3QgTmFtZSIsIHByb3BlcnR5OiAnZmlyc3ROYW1lJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAiTGFzdCBOYW1lIiwgcHJvcGVydHk6ICdsYXN0TmFtZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiVVNFUl9NQU5BR0VNRU5UX1RBQkxFX0hFQURFUl9VU0VSX0lEIiksIHByb3BlcnR5OiAndXNlcklkJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAiRW1haWwiLCBwcm9wZXJ0eTogJ2VtYWlsJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAiUm9sZSIsIHByb3BlcnR5OiAncm9sZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogIkxhc3QgQWN0aXZlIiwgcHJvcGVydHk6ICdsYXN0TG9naW5UaW1lJ30KKyAgICAgICAgICAgIF07CisgICAgICAgICAgICB0aGlzLiRzY29wZS51c2VySWRWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuVXNlcklkVmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSAnbGFzdExvZ2luVGltZSc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5yb2xlcyA9IHRoaXMuc2RjQ29uZmlnLnJvbGVzOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNOZXdVc2VyID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50VXNlciA9IHRoaXMudXNlclJlc291cmNlU2VydmljZS5nZXRMb2dnZWRpblVzZXIoKTsKKyAgICAgICAgICAgIHRoaXMuZ2V0QWxsVXNlcnMoKTsKKworICAgICAgICAgICAgbGV0IHJlc291cmNlIDogU2VydmljZXMuSVVzZXJSZXNvdXJjZSA9IDxTZXJ2aWNlcy5JVXNlclJlc291cmNlPnt9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUubmV3VXNlciA9IG5ldyBTZGMuTW9kZWxzLlVzZXIocmVzb3VyY2UpOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0ID0gKHNvcnRCeTpzdHJpbmcpOnZvaWQgPT4gey8vZGVmYXVsdCBzb3J0IGJ5IGRlc2NlbmRpbmcgbGFzdCB1cGRhdGUuIGRlZmF1bHQgZm9yIGFscGhhYmV0aWNhbCA9IGFzY2VuZGluZworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTmV3VXNlciA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJldmVyc2UgPSAodGhpcy4kc2NvcGUuc29ydEJ5ID09PSBzb3J0QnkpID8gICggIXRoaXMuJHNjb3BlLnJldmVyc2UpIDogdGhpcy4kc2NvcGUucmV2ZXJzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnRCeSA9IHNvcnRCeTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNyZWF0ZVVzZXIgPSAoKSA6IHZvaWQgPT4geworCisgICAgICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAocmVzcG9uc2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnb25GYWlsZCcsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZTogTW9kZWxzLklVc2VyUHJvcGVydGllcykgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5uZXdVc2VyLnJlc291cmNlWydpbmRleCddID0gdGhpcy4kc2NvcGUudXNlcnNMaXN0Lmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubmV3VXNlci5yZXNvdXJjZS5sYXN0TG9naW5UaW1lID0gIjAiOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5uZXdVc2VyLnJlc291cmNlLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVVc2VyRmlsdGVyVGVybSh0aGlzLiRzY29wZS5uZXdVc2VyLnJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudXNlcnNMaXN0LnVuc2hpZnQodGhpcy4kc2NvcGUubmV3VXNlci5yZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTmV3VXNlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnRCeSA9ICdpbmRleCc7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJldmVyc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubmV3VXNlciA9IG5ldyBTZGMuTW9kZWxzLlVzZXIobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRGb3JtLiRzZXRQcmlzdGluZSgpOworICAgICAgICAgICAgICAgICAgICBsZXQgX3NlbGYgPSB0aGlzOworICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLiRzY29wZS5pc05ld1VzZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSwgNzAwMCk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0aGlzLnVzZXJSZXNvdXJjZVNlcnZpY2UuY3JlYXRlVXNlcih7IHVzZXJJZDogdGhpcy4kc2NvcGUubmV3VXNlci5yZXNvdXJjZS51c2VySWQsIHJvbGU6IHRoaXMuJHNjb3BlLm5ld1VzZXIucmVzb3VyY2Uucm9sZX0sIG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uRWRpdFVzZXJQcmVzc2VkID0gKHVzZXI6SVVzZXJQcm9wZXJ0aWVzKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdXNlci5pc0luRWRpdE1vZGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHVzZXIudGVtcFJvbGUgPSB1c2VyLnJvbGU7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0VXNlclJvbGUgPSAodXNlcjpJVXNlclByb3BlcnRpZXMpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgIHJvbGVCZWZvcmVVcGRhdGU6IHN0cmluZyA9IHVzZXIucm9sZTsKKyAgICAgICAgICAgICAgICB1c2VyLnJvbGU9IHVzZXIudGVtcFJvbGU7CisKKyAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9IChyZXNwb25zZSkgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdXNlci5yb2xlID0gcm9sZUJlZm9yZVVwZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvbkZhaWxkJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZTogYW55KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB1c2VyLnRlbXBSb2xlID0gdXNlci5yb2xlOworICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJGaWx0ZXJUZXJtKHVzZXIpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB0aGlzLnVzZXJSZXNvdXJjZVNlcnZpY2UuZWRpdFVzZXJSb2xlKHsgaWQ6IHVzZXIudXNlcklkLCByb2xlOiB1c2VyLnJvbGV9LCBvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2F2ZVVzZXJDaGFuZ2VzID0gKHVzZXI6SVVzZXJQcm9wZXJ0aWVzKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYodXNlci50ZW1wUm9sZSAhPSB1c2VyLnJvbGUpeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0VXNlclJvbGUodXNlcikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXNlci5pc0luRWRpdE1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlbGV0ZVVzZXIgPSAodXNlcklkOnN0cmluZyk6IHZvaWQgPT4geworCisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9IChyZXNwb25zZSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnb25GYWlsZCcsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHJlc3BvbnNlOiBhbnkpIDp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF8ucmVtb3ZlKHRoaXMuJHNjb3BlLnVzZXJzTGlzdCwge3VzZXJJZDogIHVzZXJJZCB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJSZXNvdXJjZVNlcnZpY2UuZGVsZXRlVXNlcih7IGlkOiB1c2VySWR9LCBvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgdGl0bGU6c3RyaW5nID0gIHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlVTRVJfTUFOQUdFTUVOVF9WSUVXX0RFTEVURV9NT0RBTF9USVRMRSIpOworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlVTRVJfTUFOQUdFTUVOVF9WSUVXX0RFTEVURV9NT0RBTF9URVhUIik7CisgICAgICAgICAgICAgICAgdGhpcy5Nb2RhbHNIYW5kbGVyLm9wZW5Db25maXJtYXRpb25Nb2RhbCh0aXRsZSwgbWVzc2FnZSwgZmFsc2UpLnRoZW4ob25Payk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRUaXRsZSA9IChyb2xlOnN0cmluZyk6c3RyaW5nID0+eworICAgICAgICAgICAgICAgIHJldHVybiByb2xlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnZ292ZXJub3InLCdnb3Zlcm5hbmNlX1JlcCcpLnJlcGxhY2UoJ18nLCcgJyk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jbGVhckZvcm0gPSgpOnZvaWQgPT57CisgICAgICAgICAgICAgICAgaWYoIXRoaXMuJHNjb3BlLmVkaXRGb3JtWydjb250YWN0SWQnXS4kdmlld1ZhbHVlICYmICF0aGlzLiRzY29wZS5lZGl0Rm9ybVsncm9sZSddLiR2aWV3VmFsdWUpeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0Rm9ybS4kc2V0UHJpc3RpbmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvdXNlci1tYW5hZ2VtZW50L3VzZXItbWFuYWdlbWVudC12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2FkbWluLWRhc2hib2FyZC91c2VyLW1hbmFnZW1lbnQvdXNlci1tYW5hZ2VtZW50LXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmU3MjBiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvdXNlci1tYW5hZ2VtZW50L3VzZXItbWFuYWdlbWVudC12aWV3Lmh0bWwKQEAgLTAsMCArMSwxMDIgQEAKKzxkaXYgbmctY29udHJvbGxlcj0iU2RjLlZpZXdNb2RlbHMuVXNlck1hbmFnZW1lbnRWaWV3TW9kZWwiPgorICAgIDxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciPjwvbG9hZGVyPgorICAgIDxkaXYgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdG9wLWJhciI+CisgICAgICAgIDxkaXYgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdG9wLWJhci1zZWFyY2gtY29udGFpbmVyIj4KKyAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyLXNlYXJjaC10ZXh0Ij5TZWFyY2ggVXNlcjwvbGFiZWw+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdG9wLWJhci1mb3JtLWlucHV0IiBwbGFjZWhvbGRlcj0ie3sgVVNFUl9NQU5BR0VNRU5UX1NFQVJDSF9MQUJFTCB8IHRyYW5zbGF0ZSB9fSIgZGF0YS1uZy1tb2RlbD0ic2VhcmNoLmZpbHRlclRlcm0iIG5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IiBkYXRhLXRlc3RzLWlkPSJzZWFyY2hib3giIC8+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtc2VhcmNoLWljb24iIGRhdGEtbmctY2xhc3M9InsnY2FuY2VsJzpzZWFyY2guZmlsdGVyVGVybSwgJ21hZ25pZmljYXRpb24nOiFzZWFyY2guZmlsdGVyVGVybX0iIGRhdGEtbmctY2xpY2s9InNlYXJjaC5maWx0ZXJUZXJtPScnIiA+PC9zcGFuPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiAgY2xhc3M9InZlcnRpY2FsLWJvcmRlci1jb250YWluZXIiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwtYm9yZGVyIj48L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxmb3JtIGNsYXNzPSJzZGMtdXNlci1tYW5hZ2VtZW50LXRvcC1iYXItY3JlYXRlLXVzZXItY29udGFpbmVyIHctc2RjLWZvcm0iIG5hbWU9ImVkaXRGb3JtIj4KKyAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyLXRpdGxlIj5DcmVhdGUgTmV3IFVzZXI8L2xhYmVsPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyLXdyYXBwZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSBzZGMtdXNlci1tYW5hZ2VtZW50LXRvcC1iYXItZm9ybS1jb250YWluZXIiIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZWRpdEZvcm0uY29udGFjdElkLiRkaXJ0eSAmJiBlZGl0Rm9ybS5jb250YWN0SWQuJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuZy1mb2N1cz0ic2VhcmNoLmZpbHRlclRlcm09JyciIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJuZXdVc2VyLnJlc291cmNlLnVzZXJJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9Int7IFVTRVJfTUFOQUdFTUVOVF9TRUFSQ0hfVEVYVCB8IHRyYW5zbGF0ZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IHVwZGF0ZU9uOiAnZGVmYXVsdCBibHVyJywgZGVib3VuY2U6IHsgJ2RlZmF1bHQnOiA3NTAsICdibHVyJzogMCB9IH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb250YWN0SWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49InVzZXJJZFZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9ImNsZWFyRm9ybSgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1ibHVyPSJjbGVhckZvcm0oKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Im5ld3VzZXJpZCIgLz4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJlZGl0Rm9ybS5jb250YWN0SWQuJGRpcnR5ICYmIGVkaXRGb3JtLmNvbnRhY3RJZC4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb250YWN0SWQuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9Ik5FV19VU0VSX0VSUk9SX1VTRVJfSURfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNvbnRhY3RJZC4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJORVdfVVNFUl9FUlJPUl9VU0VSX0lEX05PVF9WQUxJRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0gc2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyLWZvcm0tY29udGFpbmVyIiAgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihlZGl0Rm9ybS5yb2xlLiRkaXJ0eSAmJiBlZGl0Rm9ybS5yb2xlLiRpbnZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBlZGl0Rm9ybS5jb250YWN0SWQuJHZpZXdWYWx1ZSl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iaS1zZGMtZm9ybS1zZWxlY3QgY2FwaXRhbGl6ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icm9sZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJzZWxlY3Ryb2xlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwgPSAibmV3VXNlci5yZXNvdXJjZS5yb2xlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctb3B0aW9ucz0icm9sZSBhcyAoZ2V0VGl0bGUocm9sZSkpIGZvciByb2xlIGluIHJvbGVzIHwgb3JkZXJCeToncm9sZSciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctZm9jdXM9InNlYXJjaC5maWx0ZXJUZXJtPScnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+U2VsZWN0IFJvbGU8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImVkaXRGb3JtLnJvbGUuJGRpcnR5ICYmIGVkaXRGb3JtLnJvbGUuJGludmFsaWQgJiYgZWRpdEZvcm0uY29udGFjdElkLiR2aWV3VmFsdWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0ucm9sZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iTkVXX1VTRVJfRVJST1JfUk9MRV9SRVFVSVJFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdHMtaWQ9ImNyZWF0ZWdyZWVuIiBkYXRhLW5nLWRpc2FibGVkPSJlZGl0Rm9ybS4kaW52YWxpZCIgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdG9wLWJhci1jcmVhdGUtYnRuIiBuZy1jbGljaz0ic2VhcmNoLmZpbHRlclRlcm0gPSAnJyA7IGNyZWF0ZVVzZXIoKSI+Q3JlYXRlPC9idXR0b24+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9mb3JtPgorICAgIDwvZGl2PgorCisKKyAgICA8ZGl2ICBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1jb250YWluZXItZmxleCI+CisKKyAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkIHNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtaGVhZGVyIGhlYWQtcm93IGhhbmQgc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW0iIGRhdGEtdGVzdHMtaWQ9InRoe3toZWFkZXIudGl0bGV9fSIgbmctcmVwZWF0PSJoZWFkZXIgaW4gdGFibGVIZWFkZXJzTGlzdCIgbmctY2xpY2s9InNvcnQoaGVhZGVyLnByb3BlcnR5KSI+e3toZWFkZXIudGl0bGV9fQorICAgICAgICAgICAgICAgICAgICA8c3BhbiAgbmctaWY9InNvcnRCeSA9PT0gaGVhZGVyLnByb3BlcnR5IiBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1oZWFkZXItc29ydC1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydkb3duJzogcmV2ZXJzZSwgJ3VwJzohcmV2ZXJzZX0iPiA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtbm8tdGV4dC1oZWFkZXIgaGVhZC1yb3cgc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW0iPjwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtbm8tdGV4dC1oZWFkZXIgaGVhZC1yb3cgc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW0iPjwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1pbml0PSJ1c2VyLmZpbHRlclRlcm0gPSB1c2VyLmZpcnN0TmFtZSArICcgJyArIHVzZXIubGFzdE5hbWUgKyAnICcgKyB1c2VyLnVzZXJJZCArICcgJyArIHVzZXIuZW1haWwgKyAnICcgKyB1c2VyLnJvbGUgKyAnICcgKyAodXNlci5sYXN0TG9naW5UaW1lIHwgZGF0ZTogJ01NL2RkL3l5eXknKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZy1yZXBlYXQ9InVzZXIgaW4gdXNlcnNMaXN0IHwgZmlsdGVyOiBzZWFyY2ggfCBvcmRlckJ5OnNvcnRCeTpyZXZlcnNlIgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1uZXctdXNlci1yb3cnOiAoaXNOZXdVc2VyICYmICRmaXJzdCksICdzZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLXJvdy1lZGl0LW1vZGUnOiB1c2VyLmlzSW5FZGl0TW9kZX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1jb250YWluZXIgZGF0YS1yb3ciIGRhdGEtdGVzdHMtaWQ9InRkUm93Ij4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzZGMtc21hcnQtdG9vbHRpcCBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1jb2wtZ2VuZXJhbCBzZGMtdXNlci1tYW5hZ2VtZW50LWZsZXgtaXRlbSIgZGF0YS10ZXN0cy1pZD0idGR7e3RhYmxlSGVhZGVyc0xpc3RbMF0udGl0bGV9fSI+e3t1c2VyLmZpcnN0TmFtZSB8fCAnLS0tJ319PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHNkYy1zbWFydC10b29sdGlwIGNsYXNzPSJzZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLWNvbC1nZW5lcmFsIHNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1pdGVtIiBkYXRhLXRlc3RzLWlkPSJ0ZHt7dGFibGVIZWFkZXJzTGlzdFsxXS50aXRsZX19Ij57e3VzZXIubGFzdE5hbWUgfHwgJy0tLScgfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtY29sLXVzZXJpZCBzZGMtdXNlci1tYW5hZ2VtZW50LWZsZXgtaXRlbSIgZGF0YS10ZXN0cy1pZD0idGR7e3RhYmxlSGVhZGVyc0xpc3RbMl0udGl0bGV9fSI+e3t1c2VyLnVzZXJJZCB8fCAnLS0tJ319PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHNkYy1zbWFydC10b29sdGlwIGNsYXNzPSJzZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLWNvbC1nZW5lcmFsIHNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1pdGVtIiBkYXRhLXRlc3RzLWlkPSJ0ZHt7dGFibGVIZWFkZXJzTGlzdFszXS50aXRsZX19Ij57e3VzZXIuZW1haWwgfHwgJy0tLSd9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1jb2wtZ2VuZXJhbCBzZGMtdXNlci1tYW5hZ2VtZW50LWZsZXgtaXRlbSIgZGF0YS10ZXN0cy1pZD0idGR7e3RhYmxlSGVhZGVyc0xpc3RbNF0udGl0bGV9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1yb2xlLXNlbGVjdCBjYXBpdGFsaXplIHNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtcm9sZS1sYWJlbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaWY9IiF1c2VyLmlzSW5FZGl0TW9kZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmluZD0iZ2V0VGl0bGUodXNlci5yb2xlKSI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1yb2xlLXNlbGVjdCBjYXBpdGFsaXplIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0idGRzZWxlY3Ryb2xlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0idXNlci5pc0luRWRpdE1vZGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJ1c2VyLnRlbXBSb2xlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1vcHRpb25zPSJyb2xlIGFzIChnZXRUaXRsZShyb2xlKSkgZm9yIHJvbGUgaW4gcm9sZXMgfCBvcmRlckJ5Oidyb2xlJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtY29sLWdlbmVyYWwgc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW0iIGRhdGEtdGVzdHMtaWQ9InRke3t0YWJsZUhlYWRlcnNMaXN0WzVdLnRpdGxlfX0iPnt7dXNlci5sYXN0TG9naW5UaW1lID09IDAgPyAnV2FpdGluZycgOiAgKHVzZXIubGFzdExvZ2luVGltZSB8IGRhdGU6J01NL2RkL3l5eXknKX19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLWJ0bi1jb2wgc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1uZy1kaXNhYmxlZD0idXNlci5pc0luRWRpdE1vZGUiIGRhdGEtbmctaGlkZT0idXNlci5pc0luRWRpdE1vZGUgfHwgY3VycmVudFVzZXIudXNlcklkID09PSB1c2VyLnVzZXJJZCIgIGNsYXNzPSJzZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLWVkaXQtYnRuIiBuZy1jbGljaz0ib25FZGl0VXNlclByZXNzZWQodXNlcikiIGRhdGEtdGVzdHMtaWQ9InVwZGF0ZXVzZXJ7e3VzZXIudXNlcklkfX0iPiA8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtbmctc2hvdz0idXNlci5pc0luRWRpdE1vZGUiIGNsYXNzPSJzZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLXNhdmUtYnRuIiBuZy1jbGljaz0ic2F2ZVVzZXJDaGFuZ2VzKHVzZXIpIiBkYXRhLXRlc3RzLWlkPSJ0ZHNhdmUiPiA8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1idG4tY29sIHNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1pdGVtIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtbmctaGlkZT0iY3VycmVudFVzZXIudXNlcklkID09PSB1c2VyLnVzZXJJZCIgIGNsYXNzPSJzZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLWRlbGV0ZS1idG4iIG5nLWNsaWNrPSJkZWxldGVVc2VyKHVzZXIudXNlcklkKSIgZGF0YS10ZXN0cy1pZD0iZGVsZXRle3t1c2VyLnVzZXJJZH19Ij4gPC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL3VzZXItbWFuYWdlbWVudC91c2VyLW1hbmFnZW1lbnQubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvYWRtaW4tZGFzaGJvYXJkL3VzZXItbWFuYWdlbWVudC91c2VyLW1hbmFnZW1lbnQubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzRmYWFiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvdXNlci1tYW5hZ2VtZW50L3VzZXItbWFuYWdlbWVudC5sZXNzCkBAIC0wLDAgKzEsMjUxIEBACisuc2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIHdpZHRoOiAxMDAlOworICAgIGxhYmVsIHsKKyAgICAgICAgLmlfMTc7CisgICAgfQorICAgIC5zZGMtdXNlci1tYW5hZ2VtZW50LXRvcC1iYXItZm9ybS1pbnB1dCwKKyAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyLWZvcm0tc2VsZWN0IHsKKyAgICAgICAgLmJfOTsKKyAgICAgICAgY29sb3I6IEBjb2xvcl9iOworICAgICAgICBoZWlnaHQ6IDI4cHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Y7CisgICAgfQorCisgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtdG9wLWJhci1zZWFyY2gtY29udGFpbmVyIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICB3aWR0aDogNDAwcHg7CisKKyAgICAgICAgbGFiZWwgeworICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgICAgICAgfQorCisgICAgICAgIC53LXNkYy1zZWFyY2gtaWNvbiB7CisgICAgICAgICAgICByaWdodDogMTFweDsKKyAgICAgICAgICAgIHRvcDogNDlweDsKKyAgICAgICAgfQorICAgIH0KKyAgICAudmVydGljYWwtYm9yZGVyLWNvbnRhaW5lciB7CisgICAgICAgIG1pbi13aWR0aDogNTBweDsKKyAgICAgICAgbWFyZ2luOiAwcHggYXV0bzsKKworICAgICAgICAudmVydGljYWwtYm9yZGVyIHsKKworICAgICAgICAgICAgd2lkdGg6IDFweDsKKyAgICAgICAgICAgIGhlaWdodDogNzBweDsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBjb2xvcl9lOworICAgICAgICAgICAgZGlzcGxheTogdGFibGU7CisgICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC5zZGMtdXNlci1tYW5hZ2VtZW50LXRvcC1iYXItd3JhcHBlciB7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgfQorCisgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtdG9wLWJhci10aXRsZSB7CisgICAgICAgIC5pXzE3OworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICB9CisKKyAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyLWNyZWF0ZS11c2VyLWNvbnRhaW5lciB7CisKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIHBhZGRpbmctdG9wOiAwcHg7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgIHdpZHRoOiA2NTBweDsKKworICAgICAgICBsYWJlbCB7CisgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OworICAgICAgICB9CisKKyAgICAgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtdG9wLWJhci1mb3JtLWNvbnRhaW5lciB7CisgICAgICAgICAgICB3aWR0aDogMjMzcHg7CisgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDM1cHg7CisgICAgICAgIH0KKworICAgICAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10b3AtYmFyLWNyZWF0ZS1idG4geworICAgICAgICAgICAgLnctc2RjLWJ0bi1saWdodC1ncmVlbjsKKyAgICAgICAgICAgIGhlaWdodDogMzBweDsKKyAgICAgICAgICAgIHdpZHRoOiAxMDBweDsKKyAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAwcHg7CisgICAgICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OworICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwcHg7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLnNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtY29udGFpbmVyLWZsZXggeworICAgIGhlaWdodDogNjUwcHg7CisgICAgbWFyZ2luLXRvcDogMzVweDsKKyAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10YWJsZSB7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAY29sb3JfbTsKKyAgICAgICAgLmhlYWQgeworICAgICAgICAgICAgLmJnX207CisgICAgICAgICAgICAuaGVhZC1yb3cgeworICAgICAgICAgICAgICAgIC5jXzE4OworICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworCisgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcl9kOworCisgICAgICAgICAgICAgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtaGVhZGVyLXNvcnQtYXJyb3cgeworICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICAgICAgICAgIC5jXzk7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDA7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA4cHggOHB4IDBweCAwcHg7CisgICAgICAgICAgICAgICAgICAgICYudXAgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogNXB4IHNvbGlkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICYuZG93biB7CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOiA1cHggc29saWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1oZWFkZXI6aG92ZXIgeworICAgICAgICAgICAgICAgIC5iZ19qOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgLmJvZHkgeworICAgICAgICAgICAgLnNjcm9sbGJhci1jb250YWluZXIgeworICAgICAgICAgICAgICAgIG1heC1oZWlnaHQ6IDQyMXB4OworICAgICAgICAgICAgICAgIC5wZXJmZWN0LXNjcm9sbGJhcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5iXzk7CisKKyAgICAgICAgICAgIC5kYXRhLXJvdyB7CisgICAgICAgICAgICAgICAgJjpudGgtb2YtdHlwZShvZGQpIHsKKyAgICAgICAgICAgICAgICAgICAgLmJnX2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICYuc2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1uZXctdXNlci1yb3cgeworCisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogY2hhbmdlIDdzIHN0ZXAtZW5kIGJvdGg7CisKKyAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBjaGFuZ2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IEBjb2xvcl96CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0byB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IEBjb2xvcl9iCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJi5zZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLXJvdy1lZGl0LW1vZGUgeworICAgICAgICAgICAgICAgICAgICAuYmdfajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGl2IHsKKworICAgICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Q7CisKKyAgICAgICAgICAgICAgICAgICAgJjpsYXN0LWNoaWxkIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC5zZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLXJvbGUtc2VsZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1yb2xlLWxhYmVsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjRweDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICAuZGF0YS1yb3c6aG92ZXIgeworICAgICAgICAgICAgICAgIC5iZ19qOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1idG4tY29sIHsKKworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDBweDsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgICAgIC5zZGMtdXNlci1tYW5hZ2VtZW50LXRhYmxlLWRlbGV0ZS1idG4geworICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgICAgIC5zcHJpdGUuZS1zZGMtc21hbGwtaWNvbi1kZWxldGU7CisgICAgICAgICAgICAgICAgb3BhY2l0eTogMC43OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtdGFibGUtZWRpdC1idG4geworICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgICAgIC5lLXNkYy1zbWFsbC1pY29uLXBlbmNpbDsKKyAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuc2RjLXVzZXItbWFuYWdlbWVudC10YWJsZS1zYXZlLWJ0biB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgICAgIC5zcHJpdGU7CisgICAgICAgICAgICAgICAgLnNwcml0ZS5lLXNkYy1ncmVlbi1zYXZlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAuc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWNvbnRhaW5lciB7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgfQorCisgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1pdGVtIHsKKyAgICAgICAgd2lkdGg6MTBweDsKKyAgICAgICAgcGFkZGluZzogNXB4OworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgfQorCisgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1pdGVtOm50aC1jaGlsZCgxKSB7CisgICAgICAgIGZsZXgtZ3JvdzogNTsKKyAgICB9CisKKyAgICAuc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW06bnRoLWNoaWxkKDIpIHsKKyAgICAgICAgZmxleC1ncm93OiA3OworICAgIH0KKworICAgIC5zZGMtdXNlci1tYW5hZ2VtZW50LWZsZXgtaXRlbTpudGgtY2hpbGQoMykgeworICAgICAgICBmbGV4LWdyb3c6IDQ7CisgICAgfQorCisgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1pdGVtOm50aC1jaGlsZCg0KSB7CisgICAgICAgIGZsZXgtZ3JvdzogODsKKyAgICB9CisKKyAgICAuc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW06bnRoLWNoaWxkKDUpIHsKKyAgICAgICAgZmxleC1ncm93OiA4OworICAgIH0KKworICAgIC5zZGMtdXNlci1tYW5hZ2VtZW50LWZsZXgtaXRlbTpudGgtY2hpbGQoNikgeworICAgICAgICBmbGV4LWdyb3c6IDg7CisgICAgfQorCisgICAgLnNkYy11c2VyLW1hbmFnZW1lbnQtZmxleC1pdGVtOm50aC1jaGlsZCg3KSB7CisgICAgICAgIGZsZXgtZ3JvdzogMTsKKyAgICB9CisKKyAgICAuc2RjLXVzZXItbWFuYWdlbWVudC1mbGV4LWl0ZW06bnRoLWNoaWxkKDgpIHsKKyAgICAgICAgZmxleC1ncm93OiAxOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NhdGFsb2cvY2F0YWxvZy12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jYXRhbG9nL2NhdGFsb2ctdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjM3ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jYXRhbG9nL2NhdGFsb2ctdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDMxMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgQ2hlY2tib3hlcyB7CisgICAgICAgIGNvbXBvbmVudFR5cGVzOkFycmF5PHN0cmluZz47CisgICAgICAgIHJlc291cmNlU3ViVHlwZXM6QXJyYXk8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ2hlY2tib3hlc0ZpbHRlciB7CisgICAgICAgIC8vIFR5cGVzCisgICAgICAgIHNlbGVjdGVkQ29tcG9uZW50VHlwZXM6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZVN1YlR5cGVzOkFycmF5PHN0cmluZz47CisgICAgICAgIC8vIENhdGVnb3JpZXMKKyAgICAgICAgc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWw6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgLy8gU3RhdHVzZXMKKyAgICAgICAgc2VsZWN0ZWRTdGF0dXNlczpBcnJheTxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBHdWkgeworICAgICAgICBpc0xvYWRpbmc6IGJvb2xlYW47CisgICAgICAgIG9uUmVzb3VyY2VTdWJUeXBlc0NsaWNrOkZ1bmN0aW9uOworICAgICAgICBvbkNvbXBvbmVudFR5cGVDbGljazpGdW5jdGlvbjsKKyAgICAgICAgb25DYXRlZ29yeUNsaWNrOkZ1bmN0aW9uOworICAgICAgICBvblN1YmNhdGVnb3J5Q2xpY2s6RnVuY3Rpb247CisgICAgICAgIG9uR3JvdXBDbGljazpGdW5jdGlvbjsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDYXRhbG9nVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBjaGVja2JveGVzOkNoZWNrYm94ZXM7CisgICAgICAgIGNoZWNrYm94ZXNGaWx0ZXI6Q2hlY2tib3hlc0ZpbHRlcjsKKyAgICAgICAgZ3VpOkd1aTsKKworICAgICAgICBjYXRlZ29yaWVzOiBBcnJheTxNb2RlbHMuSU1haW5DYXRlZ29yeT47CisgICAgICAgIGNvbmZTdGF0dXM6IE1vZGVscy5JQ29uZmlnU3RhdHVzZXM7CisgICAgICAgIHNkY01lbnU6TW9kZWxzLklBcHBNZW51OworICAgICAgICBjYXRhbG9nRmlsdGVyZEl0ZW1zOiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OworICAgICAgICBleHBhbmRlZFNlY3Rpb246IEFycmF5PHN0cmluZz47CisgICAgICAgIGFjdGlvblN0cmF0ZWd5OiBhbnk7CisgICAgICAgIHVzZXI6IE1vZGVscy5JVXNlclByb3BlcnRpZXM7CisgICAgICAgIGNhdGFsb2dNZW51SXRlbTogYW55OworICAgICAgICB2ZXJzaW9uOnN0cmluZzsKKyAgICAgICAgc29ydEJ5OnN0cmluZzsKKyAgICAgICAgcmV2ZXJzZTpib29sZWFuOworCisgICAgICAgIC8vdGhpcyBpcyBmb3IgVUkgcGFnaW5nCisgICAgICAgIG51bWJlck9mSXRlbVRvRGlzcGxheTpudW1iZXI7CisgICAgICAgIGlzQWxsSXRlbURpc3BsYXk6IGJvb2xlYW47CisKKyAgICAgICAgb3BlblZpZXdlck1vZGFsKGlzUmVzb3VyY2U6IGJvb2xlYW4sIHVuaXF1ZUlkOiBzdHJpbmcpOiB2b2lkOworICAgICAgICBjaGFuZ2VMaWZlY3ljbGVTdGF0ZShlbnRpdHk6YW55LHN0YXRlOnN0cmluZyk6IHZvaWQ7CisgICAgICAgIHNlY3Rpb25DbGljayAoc2VjdGlvbjpzdHJpbmcpOnZvaWQ7CisgICAgICAgIG9yZGVyKHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgICAgICBnZXROdW1PZkVsZW1lbnRzKG51bTpudW1iZXIpOiBzdHJpbmc7CisgICAgICAgIGdvVG9Db21wb25lbnQoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZDsKKyAgICAgICAgcmFpc2VOdW1iZXJPZkVsZW1lbnRUb0Rpc3BsYXkoKTp2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBDYXRhbG9nVmlld01vZGVsIHsKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlJywKKyAgICAgICAgICAgICdzZGNDb25maWcnLAorICAgICAgICAgICAgJ3NkY01lbnUnLAorICAgICAgICAgICAgJyRzdGF0ZScsCisgICAgICAgICAgICAnJHEnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5Vc2VyUmVzb3VyY2VTZXJ2aWNlJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJywKKyAgICAgICAgICAgICdDb21wb25lbnRGYWN0b3J5JywKKyAgICAgICAgICAgICdDaGFuZ2VMaWZlY3ljbGVTdGF0ZUhhbmRsZXInLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInLAorICAgICAgICAgICAgJ01lbnVIYW5kbGVyJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklDYXRhbG9nVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBFbnRpdHlTZXJ2aWNlOlNlcnZpY2VzLkVudGl0eVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNNZW51Ok1vZGVscy5JQXBwTWVudSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGU6YW55LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRxOmFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB1c2VyUmVzb3VyY2VTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5JVXNlclJlc291cmNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEZhY3Rvcnk6IFNkYy5VdGlscy5Db21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENoYW5nZUxpZmVjeWNsZVN0YXRlSGFuZGxlcjogU2RjLlV0aWxzLkNoYW5nZUxpZmVjeWNsZVN0YXRlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBPcGVuVmlld01vZGFsSGFuZGxlcjogVXRpbHMuTW9kYWxzSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNZW51SGFuZGxlcjogVXRpbHMuTWVudUhhbmRsZXIKKyAgICAgICAgICAgICkgeworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZU1lbWJlcnMoKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdENhdGFsb2dEYXRhKCk7IC8vIEFzeW5jIHRhc2sgdG8gZ2V0IGNhdGFsb2cgZnJvbSBzZXJ2ZXIuCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZU1ldGhvZHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdENhdGFsb2dEYXRhID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGZvbGxvd2VkUmVzcG9uc2U6QXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50Pik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2F0YWxvZ0ZpbHRlcmRJdGVtcyA9IGZvbGxvd2VkUmVzcG9uc2U7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNBbGxJdGVtRGlzcGxheSA9IHRoaXMuJHNjb3BlLm51bWJlck9mSXRlbVRvRGlzcGxheSA+PSB0aGlzLiRzY29wZS5jYXRhbG9nRmlsdGVyZEl0ZW1zLmxlbmd0aDsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jYXRlZ29yaWVzID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdzZXJ2aWNlQ2F0ZWdvcmllcycpLmNvbmNhdCh0aGlzLmNhY2hlU2VydmljZS5nZXQoJ3Jlc291cmNlQ2F0ZWdvcmllcycpKS5jb25jYXQodGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdwcm9kdWN0Q2F0ZWdvcmllcycpKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5ndWkuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgb25FcnJvciA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnRmFpbGVkIHRvIGxvYWQgY2F0YWxvZyBDYXRhbG9nVmlld01vZGVsOjppbml0Q2F0YWxvZycpOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmd1aS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLkVudGl0eVNlcnZpY2UuZ2V0Q2F0YWxvZygpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgfTsKKworCisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGVNZW1iZXJzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAvLyBHdWkgaW5pdAorICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ3VpID0gPEd1aT57fTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmd1aS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUubnVtYmVyT2ZJdGVtVG9EaXNwbGF5ID0gMDsKKyAgICAgICAgICAgIC8vdGhpcy4kc2NvcGUuY2F0ZWdvcmllcyA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnY2F0ZWdvcmllc01hcCcpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2RjTWVudSA9IHRoaXMuc2RjTWVudTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbmZTdGF0dXMgPSB0aGlzLnNkY01lbnUuc3RhdHVzZXM7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5leHBhbmRlZFNlY3Rpb24gPSBbInR5cGUiLCAiY3NzQ2xhc3NlcyIsICJwcm9kdWN0LWNhdGVnb3J5IiwgInN0YXR1cyJdOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXNlciA9IHRoaXMudXNlclJlc291cmNlU2VydmljZS5nZXRMb2dnZWRpblVzZXIoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNhdGFsb2dNZW51SXRlbSA9IHRoaXMuc2RjTWVudS5jYXRhbG9nTWVudUl0ZW07CisgICAgICAgICAgICB0aGlzLiRzY29wZS52ZXJzaW9uID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCd2ZXJzaW9uJyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSAnbGFzdFVwZGF0ZURhdGUnOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJzZSA9IHRydWU7CisKKworICAgICAgICAgICAgLy8gQ2hlY2tsaXN0IGluaXQKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXMgPSA8Q2hlY2tib3hlcz57fTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXMuY29tcG9uZW50VHlwZXMgPSBbJ1Jlc291cmNlJywgJ1NlcnZpY2UnLCAnUHJvZHVjdCddOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlcy5yZXNvdXJjZVN1YlR5cGVzID0gWydWRicsICdWRkMnLCAnQ1AnLCAnVkwnXTsKKworICAgICAgICAgICAgLy8gQ2hlY2tib3hlcyBmaWx0ZXIgaW5pdAorICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlciA9IDxDaGVja2JveGVzRmlsdGVyPnt9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENvbXBvbmVudFR5cGVzID0gW107CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkUmVzb3VyY2VTdWJUeXBlcyA9IFtdOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCA9IFtdOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZFN0YXR1c2VzID0gW107CisKKyAgICAgIC8vICAgICAgdGhpcy4kc2NvcGUuaXNBbGxJdGVtRGlzcGxheSA9IHRoaXMuJHNjb3BlLm51bWJlck9mSXRlbVRvRGlzcGxheSA+PSB0aGlzLiRzY29wZS5jYXRhbG9nRmlsdGVyZEl0ZW1zLmxlbmd0aDsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZU1ldGhvZHMgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlY3Rpb25DbGljayA9IChzZWN0aW9uOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGluZGV4Om51bWJlciA9IHRoaXMuJHNjb3BlLmV4cGFuZGVkU2VjdGlvbi5pbmRleE9mKHNlY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChpbmRleCE9PS0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmV4cGFuZGVkU2VjdGlvbi5zcGxpY2UoaW5kZXgsMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZXhwYW5kZWRTZWN0aW9uLnB1c2goc2VjdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vcmRlciA9IChzb3J0Qnk6c3RyaW5nKTp2b2lkID0+IHsvL2RlZmF1bHQgc29ydCBieSBkZXNjZW5kaW5nIGxhc3QgdXBkYXRlLiBkZWZhdWx0IGZvciBhbHBoYWJldGljYWwgPSBhc2NlbmRpbmcKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gKHRoaXMuJHNjb3BlLnNvcnRCeSA9PT0gc29ydEJ5KSA/ICF0aGlzLiRzY29wZS5yZXZlcnNlIDogKHNvcnRCeSA9PT0gJ2xhc3RVcGRhdGVEYXRlJykgPyB0cnVlOiBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSBzb3J0Qnk7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdvVG9Db21wb25lbnQgPSAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ3VpLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oJ3dvcmtzcGFjZS5nZW5lcmFsJywge2lkOiBjb21wb25lbnQudW5pcXVlSWQsIHR5cGU6Y29tcG9uZW50LmNvbXBvbmVudFR5cGUudG9Mb3dlckNhc2UoKX0pOworICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICAvLyBXaWxsIHByaW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm91bmQgaW4gY2F0YWxvZworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0TnVtT2ZFbGVtZW50cyA9IChudW06bnVtYmVyKSA6IHN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgaWYgKCFudW0gfHwgbnVtPT09MCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTm8gRWxlbWVudHMgZm91bmQiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtPT09MSl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiMSBFbGVtZW50IGZvdW5kIjsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAiIEVsZW1lbnRzIGZvdW5kIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNlbGVjdCB8IHVuc2VsZWN0IHN1YiByZXNvdXJjZSB3aGVuIHJlc291cmNlIGlzIGNsaWNrZWQgfCB1bmNsaWNrZWQuCisgICAgICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLiRzY29wZS5ndWkub25Db21wb25lbnRUeXBlQ2xpY2sgPSAodHlwZTpzdHJpbmcpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZT09PSdSZXNvdXJjZScpeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENvbXBvbmVudFR5cGVzLmluZGV4T2YoJ1Jlc291cmNlJyk9PT0tMSl7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzb3VyY2Ugd2FzIG5vdCBzZWxlY3RlZCwgdW5zZWxlY3QgYWxsIGNoaWxkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRSZXNvdXJjZVN1YlR5cGVzID0gW107CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzb3VyY2Ugd2FzIHNlbGVjdGVkLCBzZWxlY3QgYWxsIGNoaWxkcworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZFJlc291cmNlU3ViVHlwZXMgPSBhbmd1bGFyLmNvcHkodGhpcy4kc2NvcGUuY2hlY2tib3hlcy5yZXNvdXJjZVN1YlR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2VsZWN0aW5nIHwgdW5zZWxlY3QgcmVzb3VyY2VzIHdoZW4gc3ViIHJlc291cmNlIGlzIGNsaWNrZWQgfCB1bmNsaWNrZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmd1aS5vblJlc291cmNlU3ViVHlwZXNDbGljayA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkUmVzb3VyY2VTdWJUeXBlcyAmJiB0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkUmVzb3VyY2VTdWJUeXBlcy5sZW5ndGg9PT10aGlzLiRzY29wZS5jaGVja2JveGVzLnJlc291cmNlU3ViVHlwZXMubGVuZ3RoKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENvbXBvbmVudFR5cGVzLnB1c2goJ1Jlc291cmNlJyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENvbXBvbmVudFR5cGVzID0gXy53aXRob3V0KHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDb21wb25lbnRUeXBlcywnUmVzb3VyY2UnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5ndWkub25DYXRlZ29yeUNsaWNrID0gKGNhdGVnb3J5Ok1vZGVscy5JTWFpbkNhdGVnb3J5KTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHwgVW5zZWxlY3QgYWxsIGNoaWxkcworICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2F0ZWdvcnlTZWxlY3RlZChjYXRlZ29yeS51bmlxdWVJZCkpeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsID0gdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbC5jb25jYXQoYW5ndWxhci5jb3B5KF8ubWFwKGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMsIChpdGVtKSA9PiB7IHJldHVybiBpdGVtLnVuaXF1ZUlkOyB9KSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcy5mb3JFYWNoKChzdWI6TW9kZWxzLklTdWJDYXRlZ29yeSk9PiB7IC8vIExvb3Agb24gYWxsIHNlbGVjdGVkIHN1YmNhdGVnb3JpZXMgYW5kIG1hcmsgdGhlIGNoaWxkcmVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwgPSB0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsLmNvbmNhdChhbmd1bGFyLmNvcHkoXy5tYXAoc3ViLmdyb3VwaW5ncywgKGl0ZW0pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCA9IF8uZGlmZmVyZW5jZSh0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsLCBfLm1hcChjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLCAoaXRlbSkgPT4geyByZXR1cm4gaXRlbS51bmlxdWVJZDsgfSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcy5mb3JFYWNoKChzdWI6TW9kZWxzLklTdWJDYXRlZ29yeSk9PiB7IC8vIExvb3Agb24gYWxsIHNlbGVjdGVkIHN1YmNhdGVnb3JpZXMgYW5kIHVuIG1hcmsgdGhlIGNoaWxkcmVucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwgPSBfLmRpZmZlcmVuY2UodGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCwgXy5tYXAoc3ViLmdyb3VwaW5ncywgKGl0ZW0pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5ndWkub25TdWJjYXRlZ29yeUNsaWNrID0gKGNhdGVnb3J5Ok1vZGVscy5JTWFpbkNhdGVnb3J5LCBzdWJDYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KSA6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB8IFVuc2VsZWN0IGFsbCBjaGlsZHMKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NhdGVnb3J5U2VsZWN0ZWQoc3ViQ2F0ZWdvcnkudW5pcXVlSWQpKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCA9IHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwuY29uY2F0KGFuZ3VsYXIuY29weShfLm1hcChzdWJDYXRlZ29yeS5ncm91cGluZ3MsIChpdGVtKSA9PiB7IHJldHVybiBpdGVtLnVuaXF1ZUlkOyB9KSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwgPSBfLmRpZmZlcmVuY2UodGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCwgXy5tYXAoc3ViQ2F0ZWdvcnkuZ3JvdXBpbmdzLCAoaXRlbSkgPT4geyByZXR1cm4gaXRlbS51bmlxdWVJZDsgfSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1hcmsgfCBVbiBtYXJrIHRoZSBwYXJlbnQgd2hlbiBhbGwgY2hpbGRzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgIGlmICh0aGlzLmFyZUFsbENhdGVnb3J5Q2hpbGRzU2VsZWN0ZWQoY2F0ZWdvcnkpKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjYXRlZ29yeSB0byBjaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwucHVzaChjYXRlZ29yeS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCA9IF8ud2l0aG91dCh0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsLCBjYXRlZ29yeS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5yYWlzZU51bWJlck9mRWxlbWVudFRvRGlzcGxheSA9ICgpIDogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubnVtYmVyT2ZJdGVtVG9EaXNwbGF5ID0gdGhpcy4kc2NvcGUubnVtYmVyT2ZJdGVtVG9EaXNwbGF5ICszNTsKKyAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5jYXRhbG9nRmlsdGVyZEl0ZW1zKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzQWxsSXRlbURpc3BsYXkgPSB0aGlzLiRzY29wZS5udW1iZXJPZkl0ZW1Ub0Rpc3BsYXkgPj0gdGhpcy4kc2NvcGUuY2F0YWxvZ0ZpbHRlcmRJdGVtcy5sZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ3VpLm9uR3JvdXBDbGljayA9IChzdWJDYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KSA6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vIE1hcmsgfCBVbiBtYXJrIHRoZSBwYXJlbnQgd2hlbiBhbGwgY2hpbGRzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgIGlmICh0aGlzLmFyZUFsbFN1YkNhdGVnb3J5Q2hpbGRzU2VsZWN0ZWQoc3ViQ2F0ZWdvcnkpKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjYXRlZ29yeSB0byBjaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwucHVzaChzdWJDYXRlZ29yeS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCA9IF8ud2l0aG91dCh0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsLCBzdWJDYXRlZ29yeS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBhcmVBbGxDYXRlZ29yeUNoaWxkc1NlbGVjdGVkID0gKGNhdGVnb3J5Ok1vZGVscy5JTWFpbkNhdGVnb3J5KTpib29sZWFuID0+IHsKKyAgICAgICAgICAgIGlmICghY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyl7cmV0dXJuIGZhbHNlO30KKyAgICAgICAgICAgIGxldCBhbGxJZHMgPSBfLm1hcChjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLCAoc3ViOk1vZGVscy5JU3ViQ2F0ZWdvcnkpPT57cmV0dXJuIHN1Yi51bmlxdWVJZDt9KTsKKyAgICAgICAgICAgIGxldCB0b3RhbCA9IF8uaW50ZXJzZWN0aW9uKHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwsIGFsbElkcyk7CisgICAgICAgICAgICByZXR1cm4gdG90YWwubGVuZ3RoID09PSBjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLmxlbmd0aD90cnVlOmZhbHNlOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYXJlQWxsU3ViQ2F0ZWdvcnlDaGlsZHNTZWxlY3RlZCA9IChzdWJDYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KTpib29sZWFuID0+IHsKKyAgICAgICAgICAgIGlmICghc3ViQ2F0ZWdvcnkuZ3JvdXBpbmdzKXtyZXR1cm4gZmFsc2U7fQorICAgICAgICAgICAgbGV0IGFsbElkcyA9IF8ubWFwKHN1YkNhdGVnb3J5Lmdyb3VwaW5ncywgKGdyb3VwOk1vZGVscy5JR3JvdXApPT57cmV0dXJuIGdyb3VwLnVuaXF1ZUlkO30pOworICAgICAgICAgICAgbGV0IHRvdGFsID0gXy5pbnRlcnNlY3Rpb24odGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbCwgYWxsSWRzKTsKKyAgICAgICAgICAgIHJldHVybiB0b3RhbC5sZW5ndGggPT09IHN1YkNhdGVnb3J5Lmdyb3VwaW5ncy5sZW5ndGg/dHJ1ZTpmYWxzZTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGlzQ2F0ZWdvcnlTZWxlY3RlZCA9ICh1bmlxdWVJZDpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwuaW5kZXhPZih1bmlxdWVJZCkhPT0tMSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NhdGFsb2cvY2F0YWxvZy12aWV3LXRlc3RzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jYXRhbG9nL2NhdGFsb2ctdmlldy10ZXN0cy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTIxODM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jYXRhbG9nL2NhdGFsb2ctdmlldy10ZXN0cy50cwpAQCAtMCwwICsxLDMwOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK2Rlc2NyaWJlKCJ0ZXN0IGNhdGFsb2ctdmlldyIsICgpID0+IHsKKworICAgIGxldCAkY29udHJvbGxlck1vY2s6bmcuSUNvbnRyb2xsZXJTZXJ2aWNlOworICAgIGxldCAkcU1vY2s6bmcuSVFTZXJ2aWNlOworICAgIGxldCAkaHR0cEJhY2tlbmRNb2NrOm5nLklIdHRwQmFja2VuZFNlcnZpY2U7CisgICAgbGV0ICRzY29wZU1vY2s6U2RjLlZpZXdNb2RlbHMuSUNhdGFsb2dWaWV3TW9kZWxTY29wZTsKKyAgICBsZXQgJHN0YXRlTW9jazpuZy51aS5JU3RhdGVTZXJ2aWNlOworICAgIGxldCAkc3RhdGVQYXJhbXM6YW55OworICAgIGxldCBlbnRpdHlTZXJ2aWNlTW9jazsKKyAgICBsZXQgY2FjaGVTZXJ2aWNlTW9jazsKKworICAgIGJlZm9yZUVhY2goYW5ndWxhci5tb2NrLm1vZHVsZSgnc2RjQXBwJykpOworCisgICAgbGV0IGdldEFsbEVudGl0aWVzUmVzcG9uc2VNb2NrICA9ICBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICI4NTVhY2RjNy03OTc2LTQ5MTMtOWZhNi0yNTIyMGJkNWEwNjkiLAorICAgICAgICAgICAgInV1aWQiOiAiOGJjNTRmOTQtMDgyYy00MmZhLTkwNDktODQ3NjdkZjNmZjA1IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAicWExMjM0IiwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJWb0lQIENhbGwgQ29udHJvbCIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQ0NzIzNDcxMjM5OCwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZGRkZCIsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlLAorICAgICAgICAgICAgImljb24iOiAibW9iaWxpdHkiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQ0NzIzNDcxMjM5OCwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRpc3RyaWJ1dGlvblN0YXR1cyI6ICJESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEIiwKKyAgICAgICAgICAgICJwcm9qZWN0Q29kZSI6ICIyMzMyMzMiLAorICAgICAgICAgICAgIm5hbWUiOiAibWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWEiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJ0eXBlIjogMCwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYSIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAic3lzdGVtTmFtZSI6ICJNYXNNYXNNYXNNYXNNYXNNYXNNYXNNYXNNYXNNYXNNYXNNYXNNYSIsCisgICAgICAgICAgICAidm5mIjogdHJ1ZSwKKyAgICAgICAgICAgICIkJGhhc2hLZXkiOiAib2JqZWN0OjMwIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAiNGJiNTc3Y2UtY2IyYy00Y2I3LWJiMzktNTg2NDRiNWU3M2NiIiwKKyAgICAgICAgICAgICJ1dWlkIjogImUyN2Y0NzIzLWM5ZWMtNDE2MC04OWRhLWRiZjg0ZDE5YTdlMyIsCisgICAgICAgICAgICAiY29udGFjdElkIjogInFhMTExMSIsCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiTW9iaWxpdHkiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0NDcyMzg1MDMxODEsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiYXFhIiwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUsCisgICAgICAgICAgICAiaWNvbiI6ICJjYWxsX2NvbnRyb2xsIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0NDcyNDg5OTEzODgsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiam0wMDA3IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkpvbmkgTWl0Y2hlbGwiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIkNFUlRJRklFRCIsCisgICAgICAgICAgICAiZGlzdHJpYnV0aW9uU3RhdHVzIjogIkRJU1RSSUJVVElPTl9SRUpFQ1RFRCIsCisgICAgICAgICAgICAicHJvamVjdENvZGUiOiAiMTExMTExIiwKKyAgICAgICAgICAgICJuYW1lIjogIm1hcnRpbjE4IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAidHlwZSI6IDAsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAibWFydGluMTgiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInN5c3RlbU5hbWUiOiAiTWFydGluMTgiLAorICAgICAgICAgICAgInZuZiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogImYxOTJmNGE2LTdmYmYtNDJlNC1hNTQ2LTM3NTA5ZGYyOGRjMSIsCisgICAgICAgICAgICAidXVpZCI6ICIwYjc3ZGMwZC0yMjJlLTRkMTAtODVjZC1lNDIwYzk0ODE0MTciLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJmZDEyMTIiLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkFwcGxpY2F0aW9uIExheWVyIDQrL1dlYiBTZXJ2ZXIiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0NDcyMzM2Nzk3NzgsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZ2VlZnciLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJpY29uIjogImRhdGFiYXNlIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0NDcyMzM2ODE1ODIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJuYW1lIjogImdlciIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgInR5cGUiOiAxLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImdlciIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJmZXd3ZmUiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAiZmV3ZXciLAorICAgICAgICAgICAgInN5c3RlbU5hbWUiOiAiR2VyIiwKKyAgICAgICAgICAgICIkJGhhc2hLZXkiOiAib2JqZWN0OjMxIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAiNzgzOTJkMDgtMTg1OS00N2MyLWIxZjItMWEzNWI3ZjhjMzBlIiwKKyAgICAgICAgICAgICJ1dWlkIjogIjhjZGQ2M2IyLTZhNjItNDM3Ni05MDEyLTYyNGY0MjRmNzFkNCIsCisgICAgICAgICAgICAiY29udGFjdElkIjogInF3MTIzNCIsCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQXBwbGljYXRpb24gTGF5ZXIgNCsvQXBwbGljYXRpb24gU2VydmVycyIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQ0NzIzNDA0NjExNCwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJ0ZXN0IiwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUsCisgICAgICAgICAgICAiaWNvbiI6ICJyb3V0ZXIiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQ0NzIzNDA1MDU0NSwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgIm5hbWUiOiAidGVzdCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgInR5cGUiOiAxLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgInRlc3QiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAidGVzdCIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJ0ZXN0IiwKKyAgICAgICAgICAgICJzeXN0ZW1OYW1lIjogIlRlc3QiLAorICAgICAgICAgICAgIiQkaGFzaEtleSI6ICJvYmplY3Q6MzIiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICI5MzllMTUzZC0yMjM2LTQxMGYtYjRhOS0zYjRiZjhjNzljOWUiLAorICAgICAgICAgICAgInV1aWQiOiAiODQ4NjI1NDctNGY1Ni00MDU4LWI3OGUtNDBkZjVmMzc0ZDdlIiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAicXcxMjM0IiwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJBcHBsaWNhdGlvbiBMYXllciA0Ky9BcHBsaWNhdGlvbiBTZXJ2ZXJzIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDQ3MjM1MjQyNTYwLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImpsayIsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlLAorICAgICAgICAgICAgImljb24iOiAiZGF0YWJhc2UiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQ0NzIzNTMyODA2MiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiIsCisgICAgICAgICAgICAibmFtZSI6ICJuZXciLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJ0eXBlIjogMSwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJuZXciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiZSIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJlIiwKKyAgICAgICAgICAgICJzeXN0ZW1OYW1lIjogIk5ldyIsCisgICAgICAgICAgICAiJCRoYXNoS2V5IjogIm9iamVjdDozMyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogImVjZTgxOGUwLWZkNTktNDc3YS1iYWY2LWUyNzQ2MWE3Y2UyMyIsCisgICAgICAgICAgICAidXVpZCI6ICI4ZGI4MjNjMi02YTljLTQ2MzYtODY3Ni1mNWU3MTMyNzBkZDciLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJ1ZjIzNDUiLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIk5ldHdvcmsgTGF5ZXIgMi0zL1JvdXRlciIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQ0NzIzNTM1MjQyOSwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJ1IiwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0NDcyMzUzNzAwNjQsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJuYW1lIjogInUiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJ0eXBlIjogMSwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJ1IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ2ZW5kb3JOYW1lIjogInUiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAidSIsCisgICAgICAgICAgICAic3lzdGVtTmFtZSI6ICJVIiwKKyAgICAgICAgICAgICIkJGhhc2hLZXkiOiAib2JqZWN0OjM0IgorICAgICAgICB9CisgICAgXTsKKworICAgIGxldCByZXNvdXJjZUNhdGVnb3JpZXNSZXNwb25zZU1vY2sgPSBbeyJuYW1lIjoiTmV0d29yayBMMi0zIiwibm9ybWFsaXplZE5hbWUiOiJuZXR3b3JrIGwyLTMiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkubmV0d29yayBsMi0zIiwic3ViY2F0ZWdvcmllcyI6W3sibmFtZSI6IkdhdGV3YXkiLCJub3JtYWxpemVkTmFtZSI6ImdhdGV3YXkiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkubmV0d29yayBsMi0zLmdhdGV3YXkiLCJpY29ucyI6WyJnYXRld2F5Il19LHsibmFtZSI6IkluZnJhc3RydWN0dXJlIiwibm9ybWFsaXplZE5hbWUiOiJpbmZyYXN0cnVjdHVyZSIsInVuaXF1ZUlkIjoicmVzb3VyY2VOZXdDYXRlZ29yeS5uZXR3b3JrIGwyLTMuaW5mcmFzdHJ1Y3R1cmUiLCJpY29ucyI6WyJ1Y3BlIl19LHsibmFtZSI6IldBTiBDb25uZWN0b3JzIiwibm9ybWFsaXplZE5hbWUiOiJ3YW4gY29ubmVjdG9ycyIsInVuaXF1ZUlkIjoicmVzb3VyY2VOZXdDYXRlZ29yeS5uZXR3b3JrIGwyLTMud2FuIGNvbm5lY3RvcnMiLCJpY29ucyI6WyJuZXR3b3JrIiwiY29ubmVjdG9yIiwicG9ydCJdfSx7Im5hbWUiOiJMQU4gQ29ubmVjdG9ycyIsIm5vcm1hbGl6ZWROYW1lIjoibGFuIGNvbm5lY3RvcnMiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkubmV0d29yayBsMi0zLmxhbiBjb25uZWN0b3JzIiwiaWNvbnMiOlsibmV0d29yayIsImNvbm5lY3RvciIsInBvcnQiXX0seyJuYW1lIjoiUm91dGVyIiwibm9ybWFsaXplZE5hbWUiOiJyb3V0ZXIiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkubmV0d29yayBsMi0zLnJvdXRlciIsImljb25zIjpbInJvdXRlciIsInZSb3V0ZXIiXX1dfSx7Im5hbWUiOiJOZXR3b3JrIEw0KyIsIm5vcm1hbGl6ZWROYW1lIjoibmV0d29yayBsNCsiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkubmV0d29yayBsNCsiLCJzdWJjYXRlZ29yaWVzIjpbeyJuYW1lIjoiQ29tbW9uIE5ldHdvcmsgUmVzb3VyY2VzIiwibm9ybWFsaXplZE5hbWUiOiJjb21tb24gbmV0d29yayByZXNvdXJjZXMiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkubmV0d29yayBsNCsuY29tbW9uIG5ldHdvcmsgcmVzb3VyY2VzIiwiaWNvbnMiOlsibmV0d29yayJdfV19LHsibmFtZSI6IkFwcGxpY2F0aW9uIEw0KyIsIm5vcm1hbGl6ZWROYW1lIjoiYXBwbGljYXRpb24gbDQrIiwidW5pcXVlSWQiOiJyZXNvdXJjZU5ld0NhdGVnb3J5LmFwcGxpY2F0aW9uIGw0KyIsInN1YmNhdGVnb3JpZXMiOlt7Im5hbWUiOiJMb2FkIEJhbGFuY2VyIiwibm9ybWFsaXplZE5hbWUiOiJsb2FkIGJhbGFuY2VyIiwidW5pcXVlSWQiOiJyZXNvdXJjZU5ld0NhdGVnb3J5LmFwcGxpY2F0aW9uIGw0Ky5sb2FkIGJhbGFuY2VyIiwiaWNvbnMiOlsibG9hZEJhbGFuY2VyIl19LHsibmFtZSI6Ik1lZGlhIFNlcnZlcnMiLCJub3JtYWxpemVkTmFtZSI6Im1lZGlhIHNlcnZlcnMiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkuYXBwbGljYXRpb24gbDQrLm1lZGlhIHNlcnZlcnMiLCJpY29ucyI6WyJhcHBsaWNhdGlvblNlcnZlciJdfSx7Im5hbWUiOiJBcHBsaWNhdGlvbiBTZXJ2ZXIiLCJub3JtYWxpemVkTmFtZSI6ImFwcGxpY2F0aW9uIHNlcnZlciIsInVuaXF1ZUlkIjoicmVzb3VyY2VOZXdDYXRlZ29yeS5hcHBsaWNhdGlvbiBsNCsuYXBwbGljYXRpb24gc2VydmVyIiwiaWNvbnMiOlsiYXBwbGljYXRpb25TZXJ2ZXIiXX0seyJuYW1lIjoiRGF0YWJhc2UiLCJub3JtYWxpemVkTmFtZSI6ImRhdGFiYXNlIiwidW5pcXVlSWQiOiJyZXNvdXJjZU5ld0NhdGVnb3J5LmFwcGxpY2F0aW9uIGw0Ky5kYXRhYmFzZSIsImljb25zIjpbImRhdGFiYXNlIl19LHsibmFtZSI6IkNhbGwgQ29udHJvbCIsIm5vcm1hbGl6ZWROYW1lIjoiY2FsbCBjb250cm9sIiwidW5pcXVlSWQiOiJyZXNvdXJjZU5ld0NhdGVnb3J5LmFwcGxpY2F0aW9uIGw0Ky5jYWxsIGNvbnRyb2wiLCJpY29ucyI6WyJjYWxsX2NvbnRyb2xsIl19LHsibmFtZSI6IkJvcmRlciBFbGVtZW50Iiwibm9ybWFsaXplZE5hbWUiOiJib3JkZXIgZWxlbWVudCIsInVuaXF1ZUlkIjoicmVzb3VyY2VOZXdDYXRlZ29yeS5hcHBsaWNhdGlvbiBsNCsuYm9yZGVyIGVsZW1lbnQiLCJpY29ucyI6WyJib3JkZXJFbGVtZW50Il19LHsibmFtZSI6IldlYiBTZXJ2ZXIiLCJub3JtYWxpemVkTmFtZSI6IndlYiBzZXJ2ZXIiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkuYXBwbGljYXRpb24gbDQrLndlYiBzZXJ2ZXIiLCJpY29ucyI6WyJhcHBsaWNhdGlvblNlcnZlciJdfSx7Im5hbWUiOiJGaXJld2FsbCIsIm5vcm1hbGl6ZWROYW1lIjoiZmlyZXdhbGwiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkuYXBwbGljYXRpb24gbDQrLmZpcmV3YWxsIiwiaWNvbnMiOlsiZmlyZXdhbGwiXX1dfSx7Im5hbWUiOiJHZW5lcmljIiwibm9ybWFsaXplZE5hbWUiOiJnZW5lcmljIiwidW5pcXVlSWQiOiJyZXNvdXJjZU5ld0NhdGVnb3J5LmdlbmVyaWMiLCJzdWJjYXRlZ29yaWVzIjpbeyJuYW1lIjoiRGF0YWJhc2UiLCJub3JtYWxpemVkTmFtZSI6ImRhdGFiYXNlIiwidW5pcXVlSWQiOiJyZXNvdXJjZU5ld0NhdGVnb3J5LmdlbmVyaWMuZGF0YWJhc2UiLCJpY29ucyI6WyJkYXRhYmFzZSJdfSx7Im5hbWUiOiJBYnN0cmFjdCIsIm5vcm1hbGl6ZWROYW1lIjoiYWJzdHJhY3QiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkuZ2VuZXJpYy5hYnN0cmFjdCIsImljb25zIjpbIm9iamVjdFN0b3JhZ2UiLCJjb21wdXRlIl19LHsibmFtZSI6Ik5ldHdvcmsgRWxlbWVudHMiLCJub3JtYWxpemVkTmFtZSI6Im5ldHdvcmsgZWxlbWVudHMiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkuZ2VuZXJpYy5uZXR3b3JrIGVsZW1lbnRzIiwiaWNvbnMiOlsibmV0d29yayIsImNvbm5lY3RvciJdfSx7Im5hbWUiOiJJbmZyYXN0cnVjdHVyZSIsIm5vcm1hbGl6ZWROYW1lIjoiaW5mcmFzdHJ1Y3R1cmUiLCJ1bmlxdWVJZCI6InJlc291cmNlTmV3Q2F0ZWdvcnkuZ2VuZXJpYy5pbmZyYXN0cnVjdHVyZSIsImljb25zIjpbImNvbm5lY3RvciJdfV19LHsibmFtZSI6Ik5ld0NhdGVnb3J5Iiwibm9ybWFsaXplZE5hbWUiOiJuZXdjYXRlZ29yeSIsInVuaXF1ZUlkIjoicmVzb3VyY2VOZXdDYXRlZ29yeS5uZXdjYXRlZ29yeSIsInN1YmNhdGVnb3JpZXMiOlt7Im5hbWUiOiJNeU5ld1N1YkNhdGVnb3J5Iiwibm9ybWFsaXplZE5hbWUiOiJteW5ld3N1YmNhdGVnb3J5IiwidW5pcXVlSWQiOiJyZXNvdXJjZU5ld0NhdGVnb3J5Lm5ld2NhdGVnb3J5Lm15bmV3c3ViY2F0ZWdvcnkifV19XTsKKworICAgIGxldCBnZXRBbGxFbnRpdGllc0RlZmVyZWQ6bmcuSURlZmVycmVkPGFueT4gPSBudWxsOworCisgICAgYmVmb3JlRWFjaChhbmd1bGFyLm1vY2suaW5qZWN0KChfJGNvbnRyb2xsZXJfOm5nLklDb250cm9sbGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8kaHR0cEJhY2tlbmRfOm5nLklIdHRwQmFja2VuZFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfJHJvb3RTY29wZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfJHFfOm5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8kc3RhdGVfOm5nLnVpLklTdGF0ZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfJHN0YXRlUGFyYW1zXzphbnkpID0+IHsKKworICAgICAgICAkY29udHJvbGxlck1vY2sgID0gXyRjb250cm9sbGVyXzsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jayA9IF8kaHR0cEJhY2tlbmRfCisgICAgICAgICRzY29wZU1vY2sgICAgICAgPSBfJHJvb3RTY29wZV8uJG5ldygpOworICAgICAgICAkcU1vY2sgICAgICAgICAgID0gXyRxXzsKKyAgICAgICAgJHN0YXRlTW9jayAgICAgICA9IF8kc3RhdGVfOworICAgICAgICAkc3RhdGVQYXJhbXMgPSBfJHN0YXRlUGFyYW1zXzsKKworCisgICAgICAgIC8vaGFuZGxlIGFsbCBodHRwIHJlcXVlc3QgdGhldCBub3QgcmVsZXZhbnQgdG8gdGhlIHRlc3RzCisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKmxhbmd1YWdlc1wvZW5fVVMuanNvbi4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKnJlc3RcL3ZlcnNpb24uKi8pLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrLmV4cGVjdEdFVCgvLipjb25maWd1cmF0aW9uXC91aS4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKnVzZXJcL2F1dGhvcml6ZS4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKmNhdGVnb3JpZXNcL3NlcnZpY2VzLiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qY2F0ZWdvcmllc1wvcmVzb3VyY2VzLiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qY2F0ZWdvcmllc1wvcHJvZHVjdHMuKi8pLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrLmV4cGVjdEdFVCgnaHR0cDovL2ZlSG9zdDo4MTgxL3NkYzEvZmVQcm94eS9yZXN0L3ZlcnNpb24nKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTW9jayB0aGUgc2VydmljZQorICAgICAgICAgKiBAdHlwZSB7YW55fQorICAgICAgICAgKi8KKyAgICAgICAgZ2V0QWxsRW50aXRpZXNEZWZlcmVkID0gJHFNb2NrLmRlZmVyKCk7CisgICAgICAgIGdldEFsbEVudGl0aWVzRGVmZXJlZC5yZXNvbHZlKGdldEFsbEVudGl0aWVzUmVzcG9uc2VNb2NrKTsKKworICAgICAgICBjYWNoZVNlcnZpY2VNb2NrID0gamFzbWluZS5jcmVhdGVTcHlPYmooJ2NhY2hlU2VydmljZU1vY2snLCBbJ2dldCddKTsKKyAgICAgICAgY2FjaGVTZXJ2aWNlTW9jay5nZXQuYW5kLmNhbGxGYWtlKGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIHJlc291cmNlQ2F0ZWdvcmllc1Jlc3BvbnNlTW9jazt9KTsKKyAgICAgICAgLyoKKyAgICAgICAgY2FjaGVTZXJ2aWNlTW9jay5nZXQuYW5kLmNhbGxGYWtlKGZ1bmN0aW9uKHZhbHVlOnN0cmluZyl7CisgICAgICAgICAgICBzd2l0Y2godmFsdWUpeworICAgICAgICAgICAgICAgIGNhc2UgJ3NlcnZpY2VDYXRlZ29yaWVzJzoKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlcnZpY2VDYXRlZ29yaWVzJyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3Jlc291cmNlQ2F0ZWdvcmllcyc6CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXNvdXJjZUNhdGVnb3JpZXMnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncHJvZHVjdENhdGVnb3JpZXMnOgorICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJvZHVjdENhdGVnb3JpZXMnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkZWZhdWx0Jyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgKi8KKworICAgICAgICBlbnRpdHlTZXJ2aWNlTW9jayA9IGphc21pbmUuY3JlYXRlU3B5T2JqKCdlbnRpdHlTZXJ2aWNlTW9jaycsIFsnZ2V0Q2F0YWxvZyddKTsKKyAgICAgICAgZW50aXR5U2VydmljZU1vY2suZ2V0Q2F0YWxvZy5hbmQucmV0dXJuVmFsdWUoZ2V0QWxsRW50aXRpZXNEZWZlcmVkLnByb21pc2UpOworCisgICAgICAgIC8vICRzdGF0ZVBhcmFtc1snc2hvdyddID0gJyc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5lZWQgdG8gaW5qZWN0IGludG8gdGhlIGNvbnRyb2xsZXIgb25seSB0aGUgb2JqZWN0cyB0aGF0IHdlIHdhbnQgdG8gTU9DSworICAgICAgICAgKiB0aG9zZSB0aGF0IHdlIG5lZWQgdG8gY2hhbmdlIHRoZWlycyBiZWhhdmlvcnMKKyAgICAgICAgICovCisgICAgICAgICRjb250cm9sbGVyTW9jayhTZGMuVmlld01vZGVscy5DYXRhbG9nVmlld01vZGVsLCB7CisgICAgICAgICAgICAnJHNjb3BlJzogJHNjb3BlTW9jaywKKyAgICAgICAgICAgICckc3RhdGVQYXJhbXMnOiAkc3RhdGVQYXJhbXMsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkVudGl0eVNlcnZpY2UnOiBlbnRpdHlTZXJ2aWNlTW9jaywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJzogY2FjaGVTZXJ2aWNlTW9jaworICAgICAgICB9KTsKKworICAgIH0pKTsKKworCisgICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkgeworICAgICAgICB9KTsKKworICAgICAgICBkZXNjcmliZSgidGVzdCBHVUkgZXZlbnRzIG9uIGNoZWNrYm94IHR5cGUgcmVzb3VyY2UgY2xpY2siLCBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGZ1bmN0aW9uIGNoZWNrcyBvbmx5IGZvciByZXNvdXJjZSB0eXBlLgorICAgICAgICAgICAgICogU2VsZWN0IHRoZSBSZXNvdXJjZSBhbmQgdmVyaWZ5IHRoYXQgdGhlIHN1YiByZXNvdXJjZXMgYXJlIHNlbGVjdGVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaXQoJ3Rlc3Qgb25Db21wb25lbnRUeXBlQ2xpY2sgKGNoZWNrIHNlbGVjdCBjaGVja2JveCBvZiBSZXNvdXJjZSB0eXBlKScsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGVNb2NrLiRhcHBseSgpOworICAgICAgICAgICAgICAgICRzY29wZU1vY2suY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENvbXBvbmVudFR5cGVzID0gWydSZXNvdXJjZSddOworICAgICAgICAgICAgICAgICRzY29wZU1vY2suZ3VpLm9uQ29tcG9uZW50VHlwZUNsaWNrKCdSZXNvdXJjZScpOworICAgICAgICAgICAgICAgIGV4cGVjdCgkc2NvcGVNb2NrLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRSZXNvdXJjZVN1YlR5cGVzLmxlbmd0aCA9PT0gNCkudG9CZVRydXRoeSgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGZ1bmN0aW9uIGNoZWNrcyBvbmx5IGZvciByZXNvdXJjZSB0eXBlLgorICAgICAgICAgICAgICogVW4gc2VsZWN0IHRoZSBSZXNvdXJjZSBhbmQgdmVyaWZ5IHRoYXQgdGhlIHN1YiByZXNvdXJjZXMgYXJlIHNlbGVjdGVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaXQoJ3Rlc3Qgb25Db21wb25lbnRUeXBlQ2xpY2sgKGNoZWNrIHVuIHNlbGVjdCBjaGVja2JveCBvZiBSZXNvdXJjZSB0eXBlKScsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGVNb2NrLiRhcHBseSgpOworICAgICAgICAgICAgICAgICRzY29wZU1vY2suZ3VpLm9uQ29tcG9uZW50VHlwZUNsaWNrKCdSZXNvdXJjZScpOworICAgICAgICAgICAgICAgIGV4cGVjdCgkc2NvcGVNb2NrLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRSZXNvdXJjZVN1YlR5cGVzLmxlbmd0aCA9PT0gMCkudG9CZVRydXRoeSgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfSk7CisKKyAgICAgICAgZGVzY3JpYmUoInRlc3QgR1VJIGV2ZW50cyBvbiBjaGVja2JveCBtYWluIGNhdGVnb3J5IGNsaWNrIC0+IHN1YiBjYXRlZ29yaWVzIGFyZSBzZWxlY3RlZCIsIGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIHRoYXQgYWZ0ZXIgc2VsZWN0aW5nIDIgbWFpbiBjYXRlZ29yaWVzLCB0aGUgc3ViY2F0ZWdvcmllcyBhcmUgc2VsZWN0ZWQgYWxzby4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGl0KCd0ZXN0IG9uQ29tcG9uZW50VHlwZUNsaWNrIChjaGVjayBzZWxlY3QgY2hlY2tib3ggb2YgUmVzb3VyY2UgdHlwZSknLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgbGV0IGNhdGVnb3J5MSA9IHJlc291cmNlQ2F0ZWdvcmllc1Jlc3BvbnNlTW9ja1swXTsKKyAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnkyID0gcmVzb3VyY2VDYXRlZ29yaWVzUmVzcG9uc2VNb2NrWzFdOworCisgICAgICAgICAgICAgICAgJHNjb3BlTW9jay4kYXBwbHkoKTsKKyAgICAgICAgICAgICAgICAkc2NvcGVNb2NrLmNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwgPSBbY2F0ZWdvcnkxLnVuaXF1ZUlkLCBjYXRlZ29yeTIudW5pcXVlSWRdOworICAgICAgICAgICAgICAgICRzY29wZU1vY2suZ3VpLm9uQ2F0ZWdvcnlDbGljayhjYXRlZ29yeTEpOworICAgICAgICAgICAgICAgICRzY29wZU1vY2suZ3VpLm9uQ2F0ZWdvcnlDbGljayhjYXRlZ29yeTIpOworCisgICAgICAgICAgICAgICAgZXhwZWN0KCRzY29wZU1vY2suY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZENhdGVnb3JpZXNNb2RlbC5sZW5ndGg9PT04KS50b0JlVHJ1dGh5KCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9KTsKKworCit9KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY2F0YWxvZy9jYXRhbG9nLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY2F0YWxvZy9jYXRhbG9nLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ2ZGMyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jYXRhbG9nL2NhdGFsb2ctdmlldy5odG1sCkBAIC0wLDAgKzEsMTkwIEBACis8ZGl2IGNsYXNzPSJzZGMtY2F0YWxvZy1jb250YWluZXIiPgorCisgICAgPGxvYWRlciBkYXRhLWRpc3BsYXk9Imd1aS5pc0xvYWRpbmciPjwvbG9hZGVyPgorPCEtLQorICAgIDxlY29tcC1oZWFkZXIgbWVudS1kYXRhPSJtZW51SXRlbXMiIHZlcnNpb249Int7dmVyc2lvbn19Ij48L2Vjb21wLWhlYWRlcj4KKy0tPgorCisgICAgPGRpdiBjbGFzcz0idy1zZGMtbWFpbi1jb250YWluZXIiPgorCisgICAgICAgIDwhLS0gTEVGVCBTSURFIC0tPgorICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc2Nyb2xsLXktbWFyZ2luLW9mZnNldD0iMCIgY2xhc3M9InNkYy1jYXRhbG9nLWJvZHktY29udGFpbmVyIHctc2RjLWxlZnQtc2lkZWJhciIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1jYXRhbG9nLWxlZnRiYXItY29udGFpbmVyIj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1jYXRhbG9nLXR5cGUtZmlsdGVyLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUgcG9pbnRlciIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9InNlY3Rpb25DbGljaygndHlwZScpIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydleHBhbmRlZCc6IGV4cGFuZGVkU2VjdGlvbi5pbmRleE9mKCd0eXBlJykgIT09IC0xfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlLWljb24iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUtdGV4dCIgZGF0YS10ZXN0cy1pZD0idHlwZUZpbHRlclRpdGxlIj5UeXBlPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIGktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LXVsIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LXVsLWxpIiBkYXRhLW5nLXJlcGVhdD0idHlwZSBpbiBjaGVja2JveGVzLmNvbXBvbmVudFR5cGVzIj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94IGVsZW0taWQ9ImNoZWNrYm94LXt7dHlwZSB8IGxvd2VyY2FzZSB8IGNsZWFyV2hpdGVTcGFjZXN9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGMtY2hlY2tsaXN0LW1vZGVsPSJjaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ29tcG9uZW50VHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RjLWNoZWNrbGlzdC12YWx1ZT0idHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJndWkub25Db21wb25lbnRUeXBlQ2xpY2sodHlwZSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0ie3t0eXBlfX0iPjwvc2RjLWNoZWNrYm94PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibGlzdC11bnN0eWxlZCBpLXNkYy1jYXRhbG9nLXN1YmNhdGVnb3JpZXMtY2hlY2tib3giIGRhdGEtbmctaWY9InR5cGU9PT0nUmVzb3VyY2UnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdD0ic3ViVHlwZSBpbiBjaGVja2JveGVzLnJlc291cmNlU3ViVHlwZXMiPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveCBlbGVtLWlkPSJjaGVja2JveC17e3N1YlR5cGUgfCBsb3dlcmNhc2UgfCBjbGVhcldoaXRlU3BhY2VzfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGMtY2hlY2tsaXN0LW1vZGVsPSJjaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkUmVzb3VyY2VTdWJUeXBlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtdmFsdWU9InN1YlR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJndWkub25SZXNvdXJjZVN1YlR5cGVzQ2xpY2soKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Int7c3ViVHlwZX19Ij48L3NkYy1jaGVja2JveD4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtY2F0YWxvZy1jYXRlZ29yaWVzLWZpbHRlci1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlIHBvaW50ZXIiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJzZWN0aW9uQ2xpY2soJ2NhdGVnb3J5JykiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2V4cGFuZGVkJzogZXhwYW5kZWRTZWN0aW9uLmluZGV4T2YoJ2NhdGVnb3J5JykgIT09IC0xfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlLWljb24iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUtdGV4dCIgZGF0YS10ZXN0cy1pZD0iY2F0ZWdvcmllc0ZpbHRlclRpdGxlIj5DYXRlZ29yaWVzPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQiPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBVEVHT1JZIENIRUNLQk9YIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIGktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LXVsIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LXVsLWxpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcGVhdD0iY2F0ZWdvcnkgaW4gY2F0ZWdvcmllcyB0cmFjayBieSBjYXRlZ29yeS51bmlxdWVJZCB8IGNhdGVnb3J5VHlwZUZpbHRlcjpjaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ29tcG9uZW50VHlwZXMgfCBvcmRlckJ5OiBjYXRlZ29yeSI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveCBlbGVtLWlkPSJjaGVja2JveC17e2NhdGVnb3J5LnVuaXF1ZUlkIHwgbG93ZXJjYXNlIHwgY2xlYXJXaGl0ZVNwYWNlc319IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtbW9kZWw9ImNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RjLWNoZWNrbGlzdC12YWx1ZT0iY2F0ZWdvcnkudW5pcXVlSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3tjYXRlZ29yeS51bmlxdWVJZH19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9Imd1aS5vbkNhdGVnb3J5Q2xpY2soY2F0ZWdvcnkpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Int7Y2F0ZWdvcnkubmFtZX19Ij48L3NkYy1jaGVja2JveD4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNVQiBDQVRFR09SWSBDSEVDS0JPWCAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIGktc2RjLWNhdGFsb2ctc3ViY2F0ZWdvcmllcy1jaGVja2JveCIgZGF0YS1uZy1pZj0iY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyAmJiBjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLmxlbmd0aD4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9InN1YmNhdGVnb3J5IGluIGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMgdHJhY2sgYnkgc3ViY2F0ZWdvcnkudW5pcXVlSWQgfCBvcmRlckJ5OiduYW1lJyI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94IGVsZW0taWQ9ImNoZWNrYm94LXt7c3ViY2F0ZWdvcnkudW5pcXVlSWQgfCBsb3dlcmNhc2UgfCBjbGVhcldoaXRlU3BhY2VzfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGMtY2hlY2tsaXN0LW1vZGVsPSJjaGVja2JveGVzRmlsdGVyLnNlbGVjdGVkQ2F0ZWdvcmllc01vZGVsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RjLWNoZWNrbGlzdC12YWx1ZT0ic3ViY2F0ZWdvcnkudW5pcXVlSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ7e3N1YmNhdGVnb3J5LnVuaXF1ZUlkfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJndWkub25TdWJjYXRlZ29yeUNsaWNrKCRwYXJlbnQuY2F0ZWdvcnksIHN1YmNhdGVnb3J5KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Int7c3ViY2F0ZWdvcnkubmFtZX19Ij48L3NkYy1jaGVja2JveD4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gR1JPVVBJTkcgQ0hFQ0tCT1ggLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSIgbGlzdC11bnN0eWxlZCBpLXNkYy1jYXRhbG9nLWdyb3VwaW5nLWNoZWNrYm94IiBkYXRhLW5nLWlmPSJzdWJjYXRlZ29yeS5ncm91cGluZ3MgJiYgc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzLmxlbmd0aD4wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0iZ3JvdXBpbmcgaW4gc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzIHRyYWNrIGJ5IGdyb3VwaW5nLnVuaXF1ZUlkIHwgb3JkZXJCeTonbmFtZSciPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94IGVsZW0taWQ9ImNoZWNrYm94LXt7Z3JvdXBpbmcudW5pcXVlSWQgfCBsb3dlcmNhc2UgfCBjbGVhcldoaXRlU3BhY2VzfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtbW9kZWw9ImNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRDYXRlZ29yaWVzTW9kZWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtdmFsdWU9Imdyb3VwaW5nLnVuaXF1ZUlkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJndWkub25Hcm91cENsaWNrKCRwYXJlbnQuc3ViY2F0ZWdvcnkpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJ7e2dyb3VwaW5nLm5hbWV9fSI+PC9zZGMtY2hlY2tib3g+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48IS0tIENsb3NlIHN1YmNhdGVnb3J5IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPjwhLS0gQ2xvc2Ugc3ViY2F0ZWdvcmllcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjwhLS0gQ2xvc2UgbWFpbiBjYXRlZ29yeSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+PCEtLSBDbG9zZSBtYWluIGNhdGVnb3JpZXMgLS0+CisKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8IS0tIFNUQVRVUyAtLT4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtY2F0YWxvZy1zdGF0dXMtZmlsdGVyLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUgcG9pbnRlciIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9InNlY3Rpb25DbGljaygnc3RhdHVzJykiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2V4cGFuZGVkJzogZXhwYW5kZWRTZWN0aW9uLmluZGV4T2YoJ3N0YXR1cycpICE9PSAtMX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZS1pY29uIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlLXRleHQiIGRhdGEtdGVzdHMtaWQ9InN0YXR1c0ZpbHRlclRpdGxlIj5TdGF0dXM8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibGlzdC11bnN0eWxlZCBpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC11bCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWxpIGRhdGEtbmctcmVwZWF0PSIoa2V5LCB2YWx1ZSkgaW4gY29uZlN0YXR1cyIgLS0+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LXVsLWxpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcGVhdD0iKGtleSwgc3RhdGUpIGluIGNvbmZTdGF0dXMgfCBjYXRhbG9nU3RhdHVzRmlsdGVyIj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94IGVsZW0taWQ9ImNoZWNrYm94LXt7a2V5IHwgbG93ZXJjYXNlIHwgY2xlYXJXaGl0ZVNwYWNlc319IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtbW9kZWw9ImNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRTdGF0dXNlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGMtY2hlY2tsaXN0LXZhbHVlPSJzdGF0ZS52YWx1ZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0ie3tzdGF0ZS5uYW1lfX0iPjwvc2RjLWNoZWNrYm94PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWNhdGVnb3JpZXMtbGlzdC1pdGVtLWljb24iPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisKKyAgICAgICAgPCEtLSBSSUdIVCBTSURFIC0tPgorICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgaWQ9ImNhdGFsb2ctbWFpbi1zY3JvbGwiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9Inctc2RjLW1haW4tcmlnaHQtY29udGFpbmVyIHctc2RjLWNhdGFsb2ctbWFpbiI+CisKKyAgICAgICAgICAgIDwhLS0gSEVBREVSIC0tPgorICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2F0YWxvZy1oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICB7e2dldE51bU9mRWxlbWVudHMoKGNhdGFsb2dGaWx0ZXJkSXRlbXMgfCBlbnRpdHlGaWx0ZXI6Y2hlY2tib3hlc0ZpbHRlciB8IGZpbHRlcjpzZWFyY2gpLmxlbmd0aCl9fQorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXRhbG9nLWhlYWRlci1yaWdodCI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2F0YWxvZy1oZWFkZXItb3JkZXIiIHRyYW5zbGF0ZT0iU09SVF9DQVBUSU9OIj48L3NwYW4+Jm5ic3A7Jm5ic3A7CisgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2F0YWxvZy1zb3J0IiBkYXRhLXRlc3RzLWlkPSJzb3J0LWJ5LWxhc3QtdXBkYXRlIiBkYXRhLW5nLWNsYXNzPSJ7J2JsdWUnIDogc29ydEJ5PT09J2xhc3RVcGRhdGVEYXRlJ30iCisgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJvcmRlcignbGFzdFVwZGF0ZURhdGUnKSIgdHJhbnNsYXRlPSJTT1JUX0JZX1VQREFURV9EQVRFIj48L2E+Jm5ic3A7CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctc2hvdz0ic29ydEJ5ID09PSAnbGFzdFVwZGF0ZURhdGUnIiBjbGFzcz0idy1zZGMtY2F0YWxvZy1zb3J0LWFycm93IiBkYXRhLW5nLWNsYXNzPSJ7J2Rvd24nOiByZXZlcnNlLCAndXAnOiFyZXZlcnNlfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAmbmJzcDt8Jm5ic3A7CisgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2F0YWxvZy1zb3J0IiBkYXRhLXRlc3RzLWlkPSJzb3J0LWJ5LWFscGhhYmV0aWNhbCIgZGF0YS1uZy1jbGFzcz0ieydibHVlJyA6IHNvcnRCeSE9PSdsYXN0VXBkYXRlRGF0ZSd9IgorICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0ib3JkZXIoJ25hbWUgfCByZXNvdXJjZU5hbWUnKSIgdHJhbnNsYXRlPSJTT1JUX0FMUEhBQkVUSUNBTCI+PC9hPiZuYnNwOworICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW5nLXNob3c9InNvcnRCeSAhPT0gJ2xhc3RVcGRhdGVEYXRlJyIgY2xhc3M9Inctc2RjLWNhdGFsb2ctc29ydC1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydkb3duJzogcmV2ZXJzZSwgJ3VwJzohcmV2ZXJzZX0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGluZmluaXRlLXNjcm9sbC1kaXNhYmxlZD0naXNBbGxJdGVtRGlzcGxheScgIGluZmluaXRlLXNjcm9sbD0icmFpc2VOdW1iZXJPZkVsZW1lbnRUb0Rpc3BsYXkoKSIgaW5maW5pdGUtc2Nyb2xsLWNvbnRhaW5lcj0iJyNjYXRhbG9nLW1haW4tc2Nyb2xsJyIgaW5maW5pdGUtc2Nyb2xsLXBhcmVudD4KKyAgICAgICAgICAgIDwhLS0gQ0FSRFMgLS0+CisgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWNsYXNzPSJ7J3NkYy1oaWRlLXBvcG92ZXInOiBoaWRlUG9wb3Zlcn0iCisgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9ImNvbXBvbmVudC5maWx0ZXJUZXJtID0gY29tcG9uZW50Lm5hbWUgKyAgJyAnICArIGNvbXBvbmVudC5kZXNjcmlwdGlvbiArICcgJyArIGNvbXBvbmVudC50YWdzLnRvU3RyaW5nKCkgKyAnICcgKyBjb21wb25lbnQudmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZCIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcmVwZWF0PSJjb21wb25lbnQgaW4gY2F0YWxvZ0ZpbHRlcmRJdGVtcyB8IGVudGl0eUZpbHRlcjpjaGVja2JveGVzRmlsdGVyIHwgZmlsdGVyOnNlYXJjaCB8IG9yZGVyQnk6c29ydEJ5OnJldmVyc2UgfCBsaW1pdFRvOm51bWJlck9mSXRlbVRvRGlzcGxheSIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsncmVzb3VyY2UnIDogY29tcG9uZW50LmlzUmVzb3VyY2UoKSwgJ3NlcnZpY2UnIDogY29tcG9uZW50LmlzU2VydmljZSgpLCAncHJvZHVjdCcgOiBjb21wb25lbnQuaXNQcm9kdWN0KCl9Ij4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1ib2R5IiBkYXRhLW5nLWNsaWNrPSJndWkuaXNMb2FkaW5nIHx8IGdvVG9Db21wb25lbnQoY29tcG9uZW50KSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1hdmF0YXIiPjxzcGFuIGRhdGEtdGVzdHMtaWQ9ImFzc2V0LXR5cGUiIGNsYXNzPSJ7e2NvbXBvbmVudC5nZXRDb21wb25lbnRTdWJUeXBlKCl9fSI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQgIiBkYXRhLW5nLWNsYXNzPSJjb21wb25lbnQubGlmZWN5Y2xlU3RhdGUiIGRhdGEtdGVzdHMtaWQ9ImFzc2V0bGlmZWN5Y2xlU3RhdGUge3tnZXRTdGF0dXMoKX19Ij48L2Rpdj4tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLXNjaGVtYS1pbWFnZSB7e2NvbXBvbmVudC5pY29ufX0iIGRhdGEtdGVzdHMtaWQ9Int7Y29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS51bmlxdWVJZH19IiBkYXRhLW5nLWNsYXNzPSJ7J3Nwcml0ZS1yZXNvdXJjZS1pY29ucyc6Y29tcG9uZW50LmlzUmVzb3VyY2UoKSwgJ3Nwcml0ZS1zZXJ2aWNlcy1pY29ucyc6Y29tcG9uZW50LmlzU2VydmljZSgpLCAnc3ByaXRlLXByb2R1Y3QtaWNvbnMnOmNvbXBvbmVudC5pc1Byb2R1Y3QoKX0iPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLWRlc2NyaXB0aW9uIj57e2NvbXBvbmVudC5kZXNjcmlwdGlvbn19PC9kaXY+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1pbmZvLW5hbWUtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1uYW1lIiB0b29sdGlwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtY29udGVudD0ie3tjb21wb25lbnQubmFtZSB8IHJlc291cmNlTmFtZX19Ij4ge3tjb21wb25lbnQubmFtZSB8IHJlc291cmNlTmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLWZvb3RlciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1pbmZvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1pbmZvLWxpZmVjeWNsZVN0YXRlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1saWZlY3ljbGVTdGF0ZSIgdG9vbHRpcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLWNvbnRlbnQ9Int7Y29tcG9uZW50LmdldFN0YXR1cyhzZGNNZW51KX19Ij4ge3tjb21wb25lbnQuZ2V0U3RhdHVzKHNkY01lbnUpfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby11c2VyIj5WIHt7Y29tcG9uZW50LnZlcnNpb259fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1saWZlY3ljbGVTdGF0ZS1pY29uIHNwcml0ZS1uZXcge3tzZGNNZW51LkxpZmVDeWNsZVN0YXR1c2VzW2NvbXBvbmVudC5saWZlY3ljbGVTdGF0ZV0uaWNvbn19Ij48L2Rpdj4tLT4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKworICAgIDwvZGl2PgorCisgICAgPHRvcC1uYXYgdG9wLWx2bC1zZWxlY3RlZC1pbmRleD0iMSIgc2VhcmNoLWJpbmQ9InNlYXJjaC5maWx0ZXJUZXJtIiB2ZXJzaW9uPSJ7e3ZlcnNpb259fSI+PC90b3AtbmF2PgorCis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY2F0YWxvZy9jYXRhbG9nLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NhdGFsb2cvY2F0YWxvZy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTkwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NhdGFsb2cvY2F0YWxvZy5sZXNzCkBAIC0wLDAgKzEsMzA0IEBACisuc2RjLWNhdGFsb2ctY29udGFpbmVyIHsKKworICAgIC5pLXNkYy1jYXRlZ29yaWVzLWxpc3QtaXRlbSB7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgfQorCisgICAgLy8gQ2hlY2tib3hlcworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC11bCB7CisgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIG1hcmdpbjogMDsKKworICAgICAgICAuaS1zZGMtY2F0YWxvZy1zdWJjYXRlZ29yaWVzLWNoZWNrYm94IHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDAgMCAwIDIwcHg7CisgICAgICAgICAgICBtYXJnaW46IDA7CisKKyAgICAgICAgICAgIC5pLXNkYy1jYXRhbG9nLWdyb3VwaW5nLWNoZWNrYm94IHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OworICAgICAgICAgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQtbGkgeworICAgICAgICAmOmxhc3QtY2hpbGQgeworICAgICAgICAgICAgLmktc2RjLWNhdGVnb3JpZXMtbGlzdC1pdGVtIHsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0geworICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgLy9tYXJnaW4tYm90dG9tOiA1cHg7CisgICAgICAgIC8vcGFkZGluZy1sZWZ0OiAxNXB4OworICAgICAgICAvL3RleHQtaW5kZW50OiAtMjRweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgfQorCisgICAgLmktc2RjLXN1YmNhdGVnb3JpZXMtbGlzdC1pdGVtIHsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIC8vcGFkZGluZy1sZWZ0OiAyMHB4OworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgICAgICBtYXJnaW46IDA7CisgICAgICAgIC8vdGV4dC1pbmRlbnQ6IC0xMHB4OworICAgIH0KKworICAgIC8qQWRkZWQgYnkgLSBJa3JhbSAqLworICAgICAuaS1zZGMtcHJvZHVjdC1pbnB1dCwKKyAgICAuaS1zZGMtcHJvZHVjdC1zZWxlY3QgeworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Y7CisgICAgICAgIG1pbi1oZWlnaHQ6IDMwcHg7CisgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBtYXJnaW46IDFweCAwOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjJGMkYyOworICAgICAgICBvdXRsaW5lOiBub25lOworCisgICAgICAgICY6ZGlzYWJsZWQgeworICAgICAgICAgICAgLmRpc2FibGVkOworICAgICAgICB9CisgICAgICAgIG9wdGdyb3VweworICAgICAgICAgICAgY29sb3I6IEBjb2xvcl91OworICAgICAgICAgICAgb3B0aW9ueworICAgICAgICAgICAgICAgIGNvbG9yOiBAY29sb3JfYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC5pLXNkYy1jYXRlZ29yaWVzLWxpc3QtaXRlbS1pY29uIHsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgcmlnaHQ6IC04cHg7CisgICAgICAgIHRvcDogNnB4OworICAgIH0KKworICAgIC5pLXNkYy1jYXRlZ29yaWVzLWxpc3QtaXRlbSB7CisgICAgICAgIG1hcmdpbi10b3A6IDdweDsKKyAgICAgICAgJi5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULAorICAgICAgICAmLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiB7CisgICAgICAgICAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0taWNvbiB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLWdsb2JhbC1vbGQucG5nJykgbm8tcmVwZWF0IC01M3B4IC0yODg5cHg7CisgICAgICAgICAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxNHB4OworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAmLkNFUlRJRklFRCB7CisgICAgICAgICAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0taWNvbiB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLWdsb2JhbC1vbGQucG5nJykgbm8tcmVwZWF0IC01M3B4IC0zMDM0cHg7CisgICAgICAgICAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxNnB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJi5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTiB7CisgICAgICAgICAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0taWNvbiB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLWdsb2JhbC1vbGQucG5nJykgbm8tcmVwZWF0IC01M3B4IC0yOTg1cHg7CisgICAgICAgICAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxNnB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJi5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIHsKKyAgICAgICAgICAgIC5pLXNkYy1jYXRlZ29yaWVzLWxpc3QtaXRlbS1pY29uIHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB1cmwoJy4uLy4uLy4uL3N0eWxlcy9pbWFnZXMvc3ByaXRlcy9zcHJpdGUtZ2xvYmFsLW9sZC5wbmcnKSBuby1yZXBlYXQgLTUzcHggLTI5MzRweDsKKyAgICAgICAgICAgICAgICB3aWR0aDogMTRweDsKKyAgICAgICAgICAgICAgICBoZWlnaHQ6IDE2cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAmLkRJU1RSSUJVVEVELAorICAgICAgICAmLlRCRCB7CisgICAgICAgICAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0taWNvbiB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLWdsb2JhbC1vbGQucG5nJykgbm8tcmVwZWF0IC00M3B4IC0zMDg3cHg7CisgICAgICAgICAgICAgICAgd2lkdGg6IDI0cHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxNHB4OworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWlucHV0IHsKKyAgICAgICAgbWFyZ2luOiA4cHg7CisKKyAgICB9CisKKyAgICAuaS1zZGMtc3ViY2F0ZWdvcmllcy1saXN0LWlucHV0IHsKKworICAgICAgICBtYXJnaW46IDhweDsKKyAgICB9CisgICAgLmktc2RjLXN1YmNhdGVnb3JpZXMtbGlzdC1pbnB1dC1jb250YWluZXIgeworICAgICAgICBtYXJnaW46IDBweCAwcHggMHB4IDIwcHg7CisgICAgICAgIHBhZGRpbmc6IDJweDsKKyAgICB9CisKKyAgICAudy1zZGMtaGVhZGVyLWNhdGFsb2ctc2VhcmNoLWNvbnRhaW5lciB7CisgICAgICAgIGRpc3BsYXk6IHRhYmxlOworICAgICAgICBwYWRkaW5nOiAyMXB4IDA7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKworICAgICAgICAudy1zZGMtZGVzaWduZXItbGVmdGJhci1zZWFyY2gtaW5wdXQgeworICAgICAgICAgICAgY29sb3I6ICMwMDA7CisgICAgICAgICAgICB3aWR0aDogMzAwcHg7CisgICAgICAgIH0KKworICAgICAgIC8vIC5tYWduaWZpY2F0aW9uIHsKKyAgICAgIC8vICAgICAgLnNwcml0ZTsKKyAgICAgIC8vICAgICAgLnNwcml0ZS5tYWduaWZpY2F0aW9uLWdsYXNzOworICAgICAgLy8gICAgICAuaGFuZDsKKyAgICAgIC8vICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgLy8gICAgICB0b3A6IDQwcHg7CisgICAgIC8vICAgICAgIHJpZ2h0OiA0MnB4OworICAgICAgLy8gIH0KKyAgICB9CisKKyAgICAudy1zZGMtY2F0YWxvZy1tYWluIHsKKyAgICAgICAgcGFkZGluZzogMTBweCAxMnB4OworICAgIH0KKyAgICAudy1zZGMtZGFzaGJvYXJkLWNhdGFsb2ctaGVhZGVyIHsKKyAgICAgICAgLmJfOTsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgfQorCisgICAgLnctc2RjLWRhc2hib2FyZC1jYXRhbG9nLWhlYWRlci1vcmRlciB7CisgICAgICAgIC5iXzk7CisgICAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7CisgICAgfQorCisgICAgLnctc2RjLWRhc2hib2FyZC1jYXRhbG9nLXNvcnQgeworICAgICAgICAuYl85OworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgd2hpdGUtc3BhY2U6cHJlOworICAgICAgICAmOmhvdmVyeworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgICAgICAgICAuYV85OworICAgICAgICB9CisgICAgICAgICYuYmx1ZSB7CisgICAgICAgICAgICAuYV85OworICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLWNhdGFsb2ctc29ydC1hcnJvd3sKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAmLnVweworICAgICAgICAgICAgLmJfOTsKKyAgICAgICAgICAgIHdpZHRoOiAwOworICAgICAgICAgICAgaGVpZ2h0OiAwOworICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogNXB4IHNvbGlkIDsKKyAgICAgICAgfQorICAgICAgICAmLmRvd257CisgICAgICAgICAgICAuYl85OworICAgICAgICAgICAgd2lkdGg6IDA7CisgICAgICAgICAgICBoZWlnaHQ6IDA7CisgICAgICAgICAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICBib3JkZXItdG9wOiA1cHggc29saWQ7CisgICAgICAgIH0KKyAgICB9CisKKworCisKKyAgICAudy1zZGMtZGFzaGJvYXJkLWNhdGFsb2ctaGVhZGVyLXJpZ2h0eworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgcGFkZGluZy1yaWdodDozNHB4OworICAgIH0KKworICAgIC53LXNkYy1oZWFkZXItY2F0YWxvZy1zZWFyY2gtaW5wdXQgeworICAgICAgICB3aWR0aDogNDIwcHg7CisgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CisgICAgICAgIHBhZGRpbmc6IDAgMjVweCAxcHggMTBweDsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JjYmNiYzsKKyAgICAgICAgLmJvcmRlci1yYWRpdXMoMTBweCk7CisgICAgICAgIGhlaWdodDogMzBweDsKKyAgICAgICAgbWFyZ2luOiAxMHB4IDMwcHg7CisgICAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgfQorCisgICAgLnNkYy1jYXRhbG9nLXR5cGUtZmlsdGVyLWNvbnRhaW5lciB7CisgICAgICAgIG1hcmdpbi10b3A6IC0xcHg7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZSB7CisgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgICAgICAgIC5sXzE0X207CisgICAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4OworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUtaWNvbiB7CisgICAgICAgIC5oYW5kOworICAgICAgICAudGx2LXNwcml0ZTsKKyAgICAgICAgLmZvb3Rlci1jbG9zZTsKKyAgICAgICAgdHJhbnNpdGlvbjogLjNzIGFsbDsKKyAgICAgICAgbWFyZ2luLXRvcDogLTRweDsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlLXRleHQgeworICAgICAgICBtYXJnaW4tbGVmdDogMjBweDsKKyAgICB9CisKKyAgICAuc2VwZXJhdG9yLWxlZnQsCisgICAgLnNlcGVyYXRvci1yaWdodCB7CisgICAgICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBjb2xvcl9tOworICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOworICAgICAgICB3aWR0aDogMnB4OworICAgIH0KKworICAgIC8vIFJvdGF0ZSBjYXRhbG9nIGxlZnQgc2lkZSBhcnJvd3MKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlLmV4cGFuZGVkIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUtaWNvbiB7CisgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CisgICAgfQorCisgICAgLy8gVHJhbnNmb3JtIGNhdGFsb2cgbGVmdCBzaWRlIHNlY3Rpb25zCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZSArIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudCB7CisgICAgICAgIG1heC1oZWlnaHQ6IDBweDsKKyAgICAgICAgbWFyZ2luOiAwIGF1dG87CisgICAgICAgIHRyYW5zaXRpb246IGFsbCAuM3M7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIHBhZGRpbmc6IDAgMTBweCAwIDE4cHg7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZS5leHBhbmRlZCArIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudCB7CisgICAgICAgIG1heC1oZWlnaHQ6IDk5OTlweDsKKyAgICAgICAgbWFyZ2luOiAwIGF1dG8gMXB4OworICAgICAgICB0cmFuc2l0aW9uOiBhbGwgLjNzOworICAgICAgICBwYWRkaW5nOiAxMHB4IDE4cHggMTBweCAxOHB4OworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIH0KKworfQorCisudy1zZGMtc2VhcmNoLWljb257CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiA0MHB4OworICAgIHRvcDogNDBweDsKKyAgICAmLmxlZnRiYXJ7CisgICAgICAgIHRvcDogMTlweDsKKyAgICAgICAgcmlnaHQ6IDE4cHg7CisgICAgfQorICAgICYubWFnbmlmaWNhdGlvbiB7CisgICAgICAgIC5zcHJpdGU7CisgICAgICAgIC5zcHJpdGUubWFnbmlmaWNhdGlvbi1nbGFzczsKKyAgICAgICAgLmhhbmQ7CisgICAgfQorCisgICAgJi5jYW5jZWwgeworICAgICAgICAuc3ByaXRlOworICAgICAgICAuc3ByaXRlLmNsZWFyLXRleHQ7CisgICAgICAgIC5oYW5kOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzUxZTkwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL2FjdGl2aXR5LWxvZy9hY3Rpdml0eS1sb2ctdmlldy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxkaXYgbmctcmVwZWF0PSJhY3Rpdml0eURhdGUgaW4gIGFjdGl2aXR5RGF0ZUFycmF5ICIgY2xhc3M9Inctc2RjLWNvbXBvbmVudC12aWV3ZXItcmlnaHQtYWN0aXZpdHktbG9nIiA+CisgICA8ZGl2IGNsYXNzPSJ3LXNkYy1jb21wb25lbnQtdmlld2VyLXJpZ2h0LWFjdGl2aXR5LWxvZy1kYXRlIiA+e3thY3Rpdml0eURhdGUgfCBkYXRlOiAnbG9uZ0RhdGUnfX08L2Rpdj4KKyAgICA8ZGl2IG5nLXJlcGVhdD0iYWN0aXZpdHkgaW4gYWN0aXZpdHlMb2dbYWN0aXZpdHlEYXRlXSB8IG9yZGVyQnk6ICctVElNRVNUQU1QJyI+CisgICAgICAgPGRpdiAgY2xhc3M9Inctc2RjLWNvbXBvbmVudC12aWV3ZXItcmlnaHQtYWN0aXZpdHktbG9nLXRpbWUiPnt7YWN0aXZpdHkuVElNRVNUQU1QLnJlcGxhY2UoIiBVVEMiLCAnJykgfCBzdHJpbmdUb0RhdGVGaWx0ZXIgfCBkYXRlOiAnbWVkaXVtVGltZSc6J1VUQyd9fTwvZGl2PgorICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWNvbXBvbmVudC12aWV3ZXItcmlnaHQtYWN0aXZpdHktbG9nLWNvbnRlbnQiPnt7IkFjdGlvbjogIiArIHBhcnNlQWN0aW9uKGFjdGl2aXR5LkFDVElPTikgKyAiIFBlcmZvcm1lZCBieTogIiArIGFjdGl2aXR5Lk1PRElGSUVSICsgIiBTdGF0dXM6ICIgKyBhY3Rpdml0eS5TVEFUVVN9fTwvZGl2PgorICAgIDwvZGl2PgorICAgPC9kaXY+Cis8L2Rpdj4KKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvYWN0aXZpdHktbG9nL2FjdGl2aXR5LWxvZy12aWV3Lmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvYWN0aXZpdHktbG9nL2FjdGl2aXR5LWxvZy12aWV3Lmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3Njc2YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLXZpZXcubGVzcwpAQCAtMCwwICsxLDE4IEBACisudy1zZGMtY29tcG9uZW50LXZpZXdlci1yaWdodC1hY3Rpdml0eS1sb2d7CisKKyAgICAudy1zZGMtY29tcG9uZW50LXZpZXdlci1yaWdodC1hY3Rpdml0eS1sb2ctZGF0ZXsKKyAgICAgICAgLmJhY2tncm91bmRDb2xvci5uOworICAgICAgICAuZm9udC1jb2xvci5nOworICAgICAgICBwYWRkaW5nOiA0cHggMTFweAorICAgIH0KKyAgICAudy1zZGMtY29tcG9uZW50LXZpZXdlci1yaWdodC1hY3Rpdml0eS1sb2ctdGltZXsKKyAgICAgICAgLmdfMzsKKyAgICAgICAgcGFkZGluZzogMTJweCAwcHggMHB4IDExcHg7CisgICAgfQorCisgICAgLnctc2RjLWNvbXBvbmVudC12aWV3ZXItcmlnaHQtYWN0aXZpdHktbG9nLWNvbnRlbnR7CisgICAgICAgIC5nXzE7CisgICAgICAgIHBhZGRpbmc6IDBweCAwcHggMTJweCAxMXB4OworICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE3KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvY29tcG9uZW50LXZpZXdlci12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL2NvbXBvbmVudC12aWV3ZXItdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU4YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL2NvbXBvbmVudC12aWV3ZXItdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDIxMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSUNvbXBvbmVudFZpZXdlclZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ7CisgICAgICAgIGFkZGl0aW9uYWxJbmZvcm1hdGlvbnM6IEFycmF5PE1vZGVscy5BZGRpdGlvbmFsSW5mb3JtYXRpb25Nb2RlbD47CisgICAgICAgIGFjdGl2aXR5TG9nOiBhbnk7CisgICAgICAgIGFjdGl2aXR5RGF0ZUFycmF5OiBBcnJheTxhbnk+OyAvL3RoaXMgaXMgaW4gb3JkZXIgdG8gc29ydCB0aGUgZGF0ZXMKKyAgICAgICAgaW5wdXRzOiBBcnJheTxhbnk+OworICAgICAgICBpc0xvYWRpbmc6IGJvb2xlYW47CisgICAgICAgIHRlbXBsYXRlVXJsOiBzdHJpbmc7CisgICAgICAgIGN1cnJlbnRUYWI6c3RyaW5nOworICAgICAgICBwcmVWZXJzaW9uOnN0cmluZzsKKyAgICAgICAgc2RjTWVudTpNb2RlbHMuSUFwcE1lbnU7CisgICAgICAgIHZlcnNpb25zTGlzdDpBcnJheTxhbnk+OworICAgICAgICBjbG9zZSgpOiB2b2lkOworICAgICAgICBoYXNJdGVtcyhvYmo6YW55KTogYm9vbGVhbjsKKyAgICAgICAgb25WZXJzaW9uQ2hhbmdlZCh2ZXJzaW9uOmFueSkgOiB2b2lkOworICAgICAgICBtb3ZlVG9UYWIodGFiOnN0cmluZyk6dm9pZDsKKyAgICAgICAgaXNTZWxlY3RlZCh0YWI6c3RyaW5nKTpib29sZWFuOworICAgICAgICBnZXRBY3Rpdml0eUxvZyh1bmlxdWVJZDpzdHJpbmcpOnZvaWQ7CisgICAgICAgIHBhcnNlQWN0aW9uKGFjdGlvbjpzdHJpbmcpOnN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgQ29tcG9uZW50Vmlld2VyVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJG1vZGFsSW5zdGFuY2UnLAorICAgICAgICAgICAgJ2NvbXBvbmVudCcsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkFjdGl2aXR5TG9nU2VydmljZScsCisgICAgICAgICAgICAnc2RjTWVudScsCisgICAgICAgICAgICAnQ29tcG9uZW50RmFjdG9yeScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJQ29tcG9uZW50Vmlld2VyVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGFjdGl2aXR5TG9nU2VydmljZTpTZXJ2aWNlcy5BY3Rpdml0eUxvZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2RjTWVudTpNb2RlbHMuSUFwcE1lbnUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tcG9uZW50RmFjdG9yeTogVXRpbHMuQ29tcG9uZW50RmFjdG9yeSkgeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoY29tcG9uZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vY3JlYXRpbmcgb2JqZWN0cyBmb3IgdmVyc2lvbnMKKyAgICAgICAgcHJpdmF0ZSBpbml0VmVyc2lvbk9iamVjdDpGdW5jdGlvbiA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmVyc2lvbnNMaXN0ID0gW107CisgICAgICAgICAgICBmb3IgKGxldCB2ZXJzaW9uIGluIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5hbGxWZXJzaW9ucykgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZlcnNpb25zTGlzdC5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbk51bWJlcjogdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmluZzogdGhpcy52ZXJzaW9uaW5nKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uSWQ6IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5hbGxWZXJzaW9uc1t2ZXJzaW9uXQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSB2ZXJzaW9uaW5nOkZ1bmN0aW9uID0gKHZlcnNpb25OdW1iZXI6c3RyaW5nKTpzdHJpbmcgPT4geworICAgICAgICAgICAgbGV0IHZlcnNpb246QXJyYXk8c3RyaW5nPiA9IHZlcnNpb25OdW1iZXIuc3BsaXQoJy4nKTsKKyAgICAgICAgICAgIHJldHVybiAnMDAwMDAwMDAnLnNsaWNlKHZlcnNpb25bMF0ubGVuZ3RoKSArIHZlcnNpb25bMF0gKyAnLicgKyAnMDAwMDAwMDAnLnNsaWNlKHZlcnNpb25bMV0ubGVuZ3RoKSArIHZlcnNpb25bMV07CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzaG93Q29tcG9uZW50SW5mb3JtYXRpb25WaWV3OkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRlbXBsYXRlVXJsID0gJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL3Byb3BlcnRpZXMvcmVzb3VyY2UtcHJvcGVydGllcy12aWV3Lmh0bWwnOworICAgICAgICAgICAgfSBlbHNlIGlmKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1NlcnZpY2UoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRlbXBsYXRlVXJsID0gJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL3Byb3BlcnRpZXMvc2VydmljZS1wcm9wZXJ0aWVzLXZpZXcuaHRtbCc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRlbXBsYXRlVXJsID0gJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL3Byb3BlcnRpZXMvcHJvZHVjdC1wcm9wZXJ0aWVzLXZpZXcuaHRtbCc7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzaG93QWN0aXZpdHlMb2dWaWV3OkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS50ZW1wbGF0ZVVybCA9ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLXZpZXcuaHRtbCc7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0Q29tcG9uZW50ID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWRkaXRpb25hbEluZm9ybWF0aW9ucyA9IGNvbXBvbmVudC5nZXRBZGRpdGlvbmFsSW5mb3JtYXRpb24oKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFZlcnNpb25PYmplY3QoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmluaXRDb21wb25lbnQoY29tcG9uZW50KTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmN1cnJlbnRUYWIgPSAnUFJPUEVSVElFUyc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5wcmVWZXJzaW9uID0gY29tcG9uZW50LnZlcnNpb247CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZGNNZW51ID0gdGhpcy5zZGNNZW51OworICAgICAgICAgICAgdGhpcy5zaG93Q29tcG9uZW50SW5mb3JtYXRpb25WaWV3KCk7CisgICAgICAgICAgICAvL3NlcnZpY2UgaW5wdXRzCisgICAgICAgICAgICBpZiAoY29tcG9uZW50LmlzU2VydmljZSgpKSB7CisgICAgICAgICAgICAgICAgbGV0IGlucHV0czpBcnJheTxhbnk+ID0gW107CisKKyAgICAgICAgICAgICAgICBmb3IgKGxldCBncm91cCBpbiBjb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXNbZ3JvdXBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllc1tncm91cF0uZm9yRWFjaCgocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHkudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkudmFsdWUgPSBwcm9wZXJ0eS5kZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cy5wdXNoKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcHJvcGVydHkubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwcm9wZXJ0eS50eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pbnB1dHMgPSBpbnB1dHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmhhc0l0ZW1zID0gKG9iajphbnkpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDA7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jbG9zZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuZGlzbWlzcygpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25WZXJzaW9uQ2hhbmdlZCA9ICh2ZXJzaW9uOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24udmVyc2lvbk51bWJlciAhPSB0aGlzLiRzY29wZS5jb21wb25lbnQudmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLkNvbXBvbmVudEZhY3RvcnkuZ2V0Q29tcG9uZW50RnJvbVNlcnZlcih0aGlzLmNvbXBvbmVudC5jb21wb25lbnRUeXBlLCB2ZXJzaW9uLnZlcnNpb25JZCkudGhlbigoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY3VycmVudFRhYiA9PT0gJ0FDVElWSVRZX0xPRycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldEFjdGl2aXR5TG9nKHZlcnNpb24udmVyc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0QWN0aXZpdHlMb2cgPSAodW5pcXVlSWQ6YW55KTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRmFpbGQnLCByZXNwb25zZSk7CisKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocmVzcG9uc2U6QXJyYXk8TW9kZWxzLkFjdGl2aXR5PikgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hY3Rpdml0eUxvZyA9IF8uZ3JvdXBCeShyZXNwb25zZSwgZnVuY3Rpb24gKGFjdGl2aXR5Ok1vZGVscy5BY3Rpdml0eSkgeyAgLy9ncm91cCBieSBkYXRlIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlVGltZTpEYXRlID0gbmV3IERhdGUoYWN0aXZpdHkuVElNRVNUQU1QLnJlcGxhY2UoIiBVVEMiLCAnJykucmVwbGFjZSgiICIsICdUJykpOworICAgICAgICAgICAgICAgICAgICAgIC8vICBsZXQgZGF0ZTpEYXRlID0gbmV3IERhdGUoZGF0ZVRpbWUuZ2V0RnVsbFllYXIoKSwgZGF0ZVRpbWUuZ2V0TW9udGgoKSwgZGF0ZVRpbWUuZ2V0RGF0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlVGltZS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAvKnRoaXMgaXMgaW4gb3JkZXIgdG8gc29ydCB0aGUganNvbk9iamVjdCBieSBkYXRlKi8KKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWN0aXZpdHlEYXRlQXJyYXkgPSBPYmplY3Qua2V5cyh0aGlzLiRzY29wZS5hY3Rpdml0eUxvZyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFjdGl2aXR5RGF0ZUFycmF5LnNvcnQoKS5yZXZlcnNlKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZpdHlMb2dTZXJ2aWNlLmdldEFjdGl2aXR5TG9nU2VydmljZSgncmVzb3VyY2VzJywgdW5pcXVlSWQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1NlcnZpY2UoKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2aXR5TG9nU2VydmljZS5nZXRBY3Rpdml0eUxvZ1NlcnZpY2UoJ3NlcnZpY2VzJywgdW5pcXVlSWQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vdmVUb1RhYiA9ICh0YWI6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodGFiID09PSB0aGlzLiRzY29wZS5jdXJyZW50VGFiKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhYiA9PT0gJ1BST1BFUlRJRVMnKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NvbXBvbmVudEluZm9ybWF0aW9uVmlldygpOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcmVWZXJzaW9uID0gdGhpcy4kc2NvcGUuY29tcG9uZW50LnZlcnNpb247CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWIgPT09ICdBQ1RJVklUWV9MT0cnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy4kc2NvcGUuYWN0aXZpdHlMb2cgfHwgdGhpcy4kc2NvcGUucHJlVmVyc2lvbiAhPSB0aGlzLiRzY29wZS5jb21wb25lbnQudmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWN0aXZpdHlMb2cgPSB0aGlzLiRzY29wZS5nZXRBY3Rpdml0eUxvZyh0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FjdGl2aXR5TG9nVmlldygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRhYiAiICsgdGFiICsgIiBub3QgZm91bmQhIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY3VycmVudFRhYiA9IHRhYjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzU2VsZWN0ZWQgPSAodGFiOnN0cmluZyk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhYiA9PT0gdGhpcy4kc2NvcGUuY3VycmVudFRhYjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnBhcnNlQWN0aW9uID0gKGFjdGlvbjpzdHJpbmcpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uID8gYWN0aW9uLnNwbGl0KC8oPz1bQS1aXSkvKS5qb2luKCcgJykgOiAnJzsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9jb21wb25lbnQtdmlld2VyLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvY29tcG9uZW50LXZpZXdlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjQ0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvY29tcG9uZW50LXZpZXdlci5odG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxkaXYgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlciI+CisgICAgPGxvYWRlciBkYXRhLWRpc3BsYXk9ImlzTG9hZGluZyI+PC9sb2FkZXI+CisgICAgPGRpdiBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLW1vZGFsLWNsb3NlIHNwcml0ZSB4LWJ0bi1ibGFjayIgZGF0YS1uZy1jbGljaz0iY2xvc2UoKSI+WDwvZGl2PgorICAgIDxkaXYgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1jb250ZW50IiBkYXRhLW5nLWlmPSJjb21wb25lbnQiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdCI+CisgICAgICAgICAgICA8aDMgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1sZWZ0LXRpdGxlIGNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdC10aXRsZS1pY29uIGktc2RjLWZvcm0taXRlbS1zdWdnZXN0ZWQtaWNvbiAgYm9yZGVyRWxlbWVudCBsYXJnZSB7e2NvbXBvbmVudC5pY29uU3ByaXRlfX0ge3tjb21wb25lbnQuaWNvbn19Ij48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1sZWZ0LXRpdGxlLW5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tjb21wb25lbnQubmFtZSB8IHJlc291cmNlTmFtZX19Ij57e2NvbXBvbmVudC5uYW1lIHwgcmVzb3VyY2VOYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgPGJyLz4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLWxlZnQtdGl0bGUtdmVyc2lvbiI+dnt7Y29tcG9uZW50LnZlcnNpb259fTwvc3Bhbj4KKyAgICAgICAgICAgIDwvaDM+CisgICAgICAgICAgICA8cCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLWxlZnQtdGl0bGUtdXVpZCI+CisgICAgICAgICAgICAgICAgVVVJRDoge3tjb21wb25lbnQudXVpZH19CisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdGJhci1zZWN0aW9uIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlIj5WZXJzaW9uIEhpc3Rvcnk8L2Rpdj4KKyAgICAgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci12ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtcmVzb3VyY2Utdmlld2VyLXZlcnNpb24tY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQ9InZlcnNpb24gaW4gdmVyc2lvbnNMaXN0IHwgb3JkZXJCeTogJy12ZXJzaW9uaW5nJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1yZXNvdXJjZS12aWV3ZXItdmVyc2lvbi1pdGVtIiAgZGF0YS1uZy1jbGFzcz0ieydhY3RpdmUnOiB2ZXJzaW9uLnZlcnNpb25OdW1iZXIgPT0gY29tcG9uZW50LnZlcnNpb259IiBkYXRhLW5nLWNsaWNrPSJvblZlcnNpb25DaGFuZ2VkKHZlcnNpb24pIj57eyB2ZXJzaW9uLnZlcnNpb25OdW1iZXIgfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdGJhci1zZWN0aW9uIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlIj5Db21wb3NpdGlvbjwvZGl2PgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLWxlZnRiYXItc2VjdGlvbi1zdHJ1Y3R1cmUiIG5nLXNob3c9ImNvbXBvbmVudC5pc0NvbXBsZXgoKSI+CisgICAgICAgICAgICAgICAgICAgIDxzdHJ1Y3R1cmUtdHJlZSBjb21wb25lbnQ9ImNvbXBvbmVudCI+PC9zdHJ1Y3R1cmUtdHJlZT4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodCI+CisgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWIiCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZCc6IGlzU2VsZWN0ZWQoJ1BST1BFUlRJRVMnKX0iCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0ibW92ZVRvVGFiKCdQUk9QRVJUSUVTJykiCisgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPSJFTlRJVFlfVklFV0VSX1BST1BFUlRJRVNfVEFCIj4KKyAgICAgICAgICAgICAgPC9idXR0b24+CisKKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWIiCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iY29tcG9uZW50LmlzUmVzb3VyY2UoKSB8fCBjb21wb25lbnQuaXNTZXJ2aWNlKCkiCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZCc6IGlzU2VsZWN0ZWQoJ0FDVElWSVRZX0xPRycpfSIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJtb3ZlVG9UYWIoJ0FDVElWSVRZX0xPRycpIgorICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT0iRU5USVRZX1ZJRVdFUl9BQ1RJVklUWV9MT0dfVEFCIj4KKyAgICAgICAgICAgICAgPC9idXR0b24+CisKKyAgICAgICAgICAgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICAgPG5nLWluY2x1ZGUgc3JjPSJ0ZW1wbGF0ZVVybCIgIG5nLWlmPSJ0cnVlIj48L25nLWluY2x1ZGU+CisgICAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImNsZWFyOmJvdGg7Ij48L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9jb21wb25lbnQtdmlld2VyLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvY29tcG9uZW50LXZpZXdlci5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTU2NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvY29tcG9uZW50LXZpZXdlci5sZXNzCkBAIC0wLDAgKzEsMTQ4IEBACitodG1sIC5tb2RhbC1jb21wb25lbnQtdmlld2VyeworICAgIHdpZHRoOiAxMDg0cHg7Cit9CisKKy53LXNkYy1yZXNvdXJjZS12aWV3ZXIgeworICAgIC5iXzc7CisgICAgLnctc2RjLXJlc291cmNlLXZpZXdlci1tb2RhbC1jbG9zZXsKKyAgICAgICAgei1pbmRleDogMjsKKyAgICAgICAgdGV4dC1pbmRlbnQ6IC0xMDBweDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdG9wOiAxOXB4OworICAgIH0KKyAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLWNvbnRlbnQgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisKKyAgICAgICAgLnctc2RjLXJlc291cmNlLXZpZXdlci1sZWZ0IHsKKworICAgICAgICAgICAgLmJnX2o7CisgICAgICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOworICAgICAgICAgICAgd2lkdGg6IDI4MnB4OworCisgICAgICAgICAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLWxlZnQtdGl0bGUgeworICAgICAgICAgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMHB4OworICAgICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHggMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnctc2RjLXJlc291cmNlLXZpZXdlci1sZWZ0LXRpdGxlLWljb24geworICAgICAgICAgICAgICAgIG1hcmdpbjogMCAxNXB4OworICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC53LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdC10aXRsZS1uYW1lIHsKKyAgICAgICAgICAgICAgICAuZ183OworICAgICAgICAgICAgICAgIG1heC13aWR0aDogMTYwcHg7CisgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMjNweDsKKyAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLWxlZnQtdGl0bGUtdmVyc2lvbiB7CisgICAgICAgICAgICAgICAgLmdfMTM7CisgICAgICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC53LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdC10aXRsZS11dWlkIHsKKyAgICAgICAgICAgICAgICAuZ18xNDsKKyAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMTIwLCAxMzYsIDE0OCwgMC4yNik7CisgICAgICAgICAgICAgICAgd2lkdGg6IDk1JTsKKyAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87CisgICAgICAgICAgICAgICAgcGFkZGluZzogN3B4IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC53LXNkYy1yZXNvdXJjZS12aWV3ZXItbGVmdGJhci1zZWN0aW9uIHsKKyAgICAgICAgICAgICAgICBmb250LWZhbWlseTogb21uZXMtbWVkaXVtLCBzYW5zLXNlcmlmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLWxlZnRiYXItc2VjdGlvbi10aXRsZSB7CisgICAgICAgICAgICAgICAgLmJnX287CisgICAgICAgICAgICAgICAgY29sb3I6ICNmZmY7CisgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4OworICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggMjBweDsKKyAgICAgICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLWxlZnRiYXItc2VjdGlvbi1zdHJ1Y3R1cmV7CisgICAgICAgICAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgICAgICAgICAgICAgIG1heC1oZWlnaHQ6IDUyNXB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLnctc2RjLXJlc291cmNlLXZpZXdlci12ZXJzaW9uIHsKKyAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgICAgICAgICAucGVyZmVjdC1zY3JvbGxiYXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5pLXNkYy1yZXNvdXJjZS12aWV3ZXItdmVyc2lvbi1jb250YWluZXIgeworICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEzcHggMHB4IDEzcHggMTNweDsKKyAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0OiAyMThweDsKKworICAgICAgICAgICAgICAgIC5pLXNkYy1yZXNvdXJjZS12aWV3ZXItdmVyc2lvbi1pdGVtIHsKKworICAgICAgICAgICAgICAgICAgICAmLmFjdGl2ZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAuYV83OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0IHsKKyAgICAgICAgICAgIC5iZ19jOworICAgICAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKKyAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgICAgICAgICBwYWRkaW5nOiAwOyAvLyBmb3IgdGhlIHNjcm9sbGVyIHRvIGJlIG9uIGFsbCB3aWR0aAorICAgICAgICAgICAgd2lkdGg6IDcxNnB4OworICAgICAgICAgICAgcGFkZGluZzogMjVweCAwcHggMHB4IDM1cHg7CisKKyAgICAgICAgICAgIC53LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudCB7CisgICAgICAgICAgICAgICAgcGFkZGluZzogMCA1MnB4IDAgMHB4OworICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiA3MDBweDsKKyAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYiB7CisgICAgICAgICAgICAgICAgLmJfNjsKKworICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNTAwOworICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4OworICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGNvbG9yX2M7CisgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiAwcHggMzBweCAyMHB4IDBweDsKKworCisgICAgICAgICAgICAgICAgJjpmb2N1cywKKyAgICAgICAgICAgICAgICAmOmFjdGl2ZSB7CisgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJi5zZWxlY3RlZCB7CisgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CisgICAgICAgICAgICAgICAgICAgIC5mb250LWNvbG9yLmE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL3Byb3BlcnRpZXMvcHJvZHVjdC1wcm9wZXJ0aWVzLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9wcm9wZXJ0aWVzL3Byb2R1Y3QtcHJvcGVydGllcy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlZGE2MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9wcm9wZXJ0aWVzL3Byb2R1Y3QtcHJvcGVydGllcy12aWV3Lmh0bWwKQEAgLTAsMCArMSw3NiBAQAorPGRpdiBjbGFzcz0idy1zZGMtY29tcG9uZW50LXZpZXdlci1yaWdodC1wcm9wZXJ0aWVzIj4KKworICAgIDxoNCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRpdGxlIj5HZW5lcmFsIEluZm9ybWF0aW9uPC9oND4KKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIj4KKyAgICAgICAgPGRpdiBjbGFzcz0nc2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1jb2x1bW4tMSc+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9UWVBFIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1BST0RVQ1QiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxhYmVsIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfVkVSU0lPTiI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIGRhdGEtbmctYmluZD0iY29tcG9uZW50LnZlcnNpb24iPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxhYmVsIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfQ0FURUdPUlkiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Y29tcG9uZW50LmNhdGVnb3J5fX0iIGRhdGEtbmctYmluZD0iY29tcG9uZW50LmNhdGVnb3J5Ij48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX0NSRUFUSU9OX0RBVEUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9ImNvbXBvbmVudC5jcmVhdGlvbkRhdGUgfCBkYXRlOiAnTU0vZGQveXl5eSciPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxhYmVsIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfQVVUSE9SIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuY3JlYXRvckZ1bGxOYW1lIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX0NPTlRBQ1RfSUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9ImNvbXBvbmVudC5jb250YWN0c1swXSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9QUk9KRUNUX0NPREUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9ImNvbXBvbmVudC5wcm9qZWN0Q29kZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPkxpZmUgQ3ljbGUgU3RhdHVzOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIj4KKyAgICAgICAgICAgICAgICAgICAge3tzZGNNZW51LkxpZmVDeWNsZVN0YXR1c2VzW2NvbXBvbmVudC5saWZlY3ljbGVTdGF0ZV0udGV4dH19CisgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPkRpc3RyaWJ1dGlvbiBTdGF0dXM6PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiPgorICAgICAgICAgICAgICAgICAgICB7e3NkY01lbnUuRGlzdHJpYnV0aW9uU3RhdHVzZXNbY29tcG9uZW50LmRpc3RyaWJ1dGlvblN0YXR1c10udGV4dH19CisgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSdzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0yJz4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSBkZXNjcmlwdGlvbiI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX0RFU0NSSVBUSU9OIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuZGVzY3JpcHRpb24iPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIiA+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1RBR1MiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2NvbXBvbmVudC50YWdzLmpvaW4oJywgJyl9fSIgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtdGFncyIgZGF0YS1uZy1yZXBlYXQ9Iih0YWcsIHRhZ05hbWUpIGluIGNvbXBvbmVudC50YWdzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIHt7dGFnTmFtZX19e3skbGFzdCA/ICcnIDogJywnfX0KKyAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgIDxoNCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRpdGxlIj5BZGRpdGlvbmFsIEluZm9ybWF0aW9uPC9oND4KKworICAgIDxkaXYgY2xhc3M9InNkYy1wcm9wZXJ0aWVzLWNvbnRhaW5lciB3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIj4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUiIGRhdGEtbmctc2hvdz0iYWRkaXRpb25hbEluZm9ybWF0aW9ucy5sZW5ndGgiPgorICAgICAgICAgICAgPHRoZWFkIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZCI+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMiI+S2V5PC90aD4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0yIj5WYWx1ZTwvdGg+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyIGRhdGEtbmctcmVwZWF0PSJhZGRpdGlvbmFsSW5mb3JtYXRpb24gaW4gYWRkaXRpb25hbEluZm9ybWF0aW9ucyI+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJlbGxpcHNpcy1jb2xzMiIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FkZGl0aW9uYWxJbmZvcm1hdGlvbi5rZXl9fSI+e3thZGRpdGlvbmFsSW5mb3JtYXRpb24ua2V5fX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMyIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YWRkaXRpb25hbEluZm9ybWF0aW9uLnZhbHVlfX0iPnt7YWRkaXRpb25hbEluZm9ybWF0aW9uLnZhbHVlfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3RhYmxlPgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvcHJvcGVydGllcy9wcm9wZXJ0aWVzLXZpZXcubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMtdmlldy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmVlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvcHJvcGVydGllcy9wcm9wZXJ0aWVzLXZpZXcubGVzcwpAQCAtMCwwICsxLDEyOCBAQAorLnctc2RjLWNvbXBvbmVudC12aWV3ZXItcmlnaHQtcHJvcGVydGllcyB7CisgICAgLnctc2RjLXJlc291cmNlLXZpZXdlci10YWJzIHsKKyAgICAgICAgaGVpZ2h0OiA0MnB4OworICAgIH0KKworICAgIC53LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIHsKKyAgICAgICAgbWFyZ2luOiAwIDAgMjBweCAxNnB4OworICAgIH0KKworICAgIC5zZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0xLAorICAgIC5zZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0yIHsKKyAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKKyAgICAgICAgd2lkdGg6IDUwJTsKKyAgICB9CisgICAgLnNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSB7CisgICAgICAgIC5iXzc7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIHdpZHRoOiAzMDVweDsKKyAgICB9CisgICAgLnNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCB7CisgICAgICAgIC5ib2xkOworICAgICAgICAuZ185OworICAgIH0KKyAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0IC5zZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0xIHsKKyAgICAgICAgLnNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSB7CisgICAgICAgICAgICB3aWR0aDogMzkwcHg7CisgICAgICAgIH0KKyAgICB9CisgICAgLnNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS5kZXNjcmlwdGlvbiB7CisgICAgICAgIG1hcmdpbjogMDsKKworICAgICAgICAuc2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIHsKKyAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CisgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKworICAgICAgICB9CisgICAgICAgIC5zZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LXRhZ3MgeworICAgICAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgbWF4LXdpZHRoOiAxNjdweDsKKworICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10aXRsZSB7CisgICAgICAgIC5nXzE7CisgICAgICAgIC5iZ19uOworICAgICAgICBwYWRkaW5nOiA3cHggMTVweDsKKyAgICAgICAgbWFyZ2luOiAwcHggMCAyNXB4OworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICB9CisKKyAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCB7CisgICAgICAgIC5nXzk7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgfQorCisgICAgLmNvbHMtMSB7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgIH0KKyAgICAuY29scy0yIHsKKyAgICAgICAgd2lkdGg6IDUwJTsKKyAgICB9CisgICAgLmNvbHMtMyB7CisgICAgICAgIHdpZHRoOiAzMyU7CisgICAgfQorCisgICAgLnNkYy1wcm9wZXJ0aWVzLWNvbnRhaW5lciB0YWJsZSB0Ym9keSB0ZC5sYWJlbCB7CisgICAgICAgIC5ib2xkOworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudCwKKyAgICAudy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlIHsKKyAgICAgICAgZGlzcGxheTogdGFibGU7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAuYl85OworICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CisKKyAgICAgICAgdGJvZHkgdGQgeworICAgICAgICAgICAgcGFkZGluZzogNHB4IDIwcHggMCAwOworCisgICAgICAgICAgICAuZWxsaXBzaXMtZGlyZWN0aXZlLW1vcmUtbGVzcyB7CisgICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmVsbGlwc2lzLWNvbHMyIHsKKyAgICAgICAgICAgICAgICAuc2RjLWVsbGlwc2lzOworICAgICAgICAgICAgICAgIG1heC13aWR0aDogMzQwcHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuZWxsaXBzaXMtY29sczMgeworICAgICAgICAgICAgICAgIC5zZGMtZWxsaXBzaXM7CisgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0xIHsKKyAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKKyAgICAgICAgd2lkdGg6IDUwJTsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtY29sdW1uLTIgeworICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOworICAgICAgICB3aWR0aDogNTAlOworICAgIH0KKworICAgIC5pLXNkYy1yZXNvdXJjZS12aWV3ZXItYXJ0aWZhY3RzLWl0ZW0tYWN0aW9uLAorICAgIC5zZGMtaW5mb3JtYXRpb24tYXJ0aWZhY3RzLWljb24geworICAgICAgICAuc3ByaXRlOworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIHdpZHRoOiAyMHB4OworICAgICAgICBoZWlnaHQ6IDIwcHg7CisgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgJi5kb3dubG9hZCB7CisgICAgICAgICAgICAuc3ByaXRlLmUtc2RjLXNtYWxsLWRvd25sb2FkOworICAgICAgICB9CisgICAgICAgICYucHJldmlldyB7CisgICAgICAgICAgICAuZS1zZGMtc21hbGwtaWNvbi1leWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvcHJvcGVydGllcy9yZXNvdXJjZS1wcm9wZXJ0aWVzLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9wcm9wZXJ0aWVzL3Jlc291cmNlLXByb3BlcnRpZXMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmU3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvcHJvcGVydGllcy9yZXNvdXJjZS1wcm9wZXJ0aWVzLXZpZXcuaHRtbApAQCAtMCwwICsxLDE2OSBAQAorPGRpdiBjbGFzcz0idy1zZGMtY29tcG9uZW50LXZpZXdlci1yaWdodC1wcm9wZXJ0aWVzIj4KKworICAgIDxoNCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRpdGxlIj5HZW5lcmFsIEluZm9ybWF0aW9uPC9oND4KKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIj4KKyAgICAgICAgPGRpdiBjbGFzcz0nc2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1jb2x1bW4tMSc+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9UWVBFIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgPlJlc291cmNlPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9SRVNPVVJDRV9UWVBFIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQucmVzb3VyY2VUeXBlIHwgcmVzb3VyY2VUeXBlTmFtZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9WRVJTSU9OIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQudmVyc2lvbiI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9DQVRFR09SWSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tjb21wb25lbnQuY2F0ZWdvcmllc1swXS5uYW1lfX0iIGRhdGEtbmctYmluZD0iY29tcG9uZW50LmNhdGVnb3JpZXNbMF0ubmFtZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9TVUJfQ0FURUdPUlkiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Y29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS5uYW1lfX0iIGRhdGEtbmctYmluZD0iY29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS5uYW1lIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX0NSRUFUSU9OX0RBVEUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9ImNvbXBvbmVudC5jcmVhdGlvbkRhdGUgfCBkYXRlOiAnTU0vZGQveXl5eSciPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxhYmVsIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfQVVUSE9SIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuY3JlYXRvckZ1bGxOYW1lIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1ZFTkRPUl9OQU1FIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQudmVuZG9yTmFtZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9WRU5ET1JfUkVMRUFTRSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIGRhdGEtbmctYmluZD0iY29tcG9uZW50LnZlbmRvclJlbGVhc2UiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxhYmVsIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfQ09OVEFDVF9JRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIGRhdGEtbmctYmluZD0iY29tcG9uZW50LmNvbnRhY3RJZCI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPkxpZmUgQ3ljbGUgU3RhdHVzOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIj4KKyAgICAgICAgICAgICAgICAgICAge3tzZGNNZW51LkxpZmVDeWNsZVN0YXR1c2VzW2NvbXBvbmVudC5saWZlY3ljbGVTdGF0ZV0udGV4dH19CisgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPlN5c3RlbSBOYW1lOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Y29tcG9uZW50LnN5c3RlbU5hbWV9fSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuc3lzdGVtTmFtZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9MSUNFTlNFX1RZUEUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9ImNvbXBvbmVudC5saWNlbnNlVHlwZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSdzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0yJz4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSBkZXNjcmlwdGlvbiI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX0RFU0NSSVBUSU9OIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuZGVzY3JpcHRpb24iPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxhYmVsIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfVEFHUyI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LXRhZ3MiIGRhdGEtbmctcmVwZWF0PSIodGFnLCB0YWdOYW1lKSBpbiBjb21wb25lbnQudGFncyIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2NvbXBvbmVudC50YWdzLmpvaW4oJywgJyl9fSI+e3t0YWdOYW1lfX17eyRsYXN0ID8gJycgOiAnLCd9fTwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxoNCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRpdGxlIj5BZGRpdGlvbmFsIEluZm9ybWF0aW9uPC9oND4KKworICAgIDxkaXYgY2xhc3M9InNkYy1wcm9wZXJ0aWVzLWNvbnRhaW5lciB3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIj4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUiIGRhdGEtbmctc2hvdz0iYWRkaXRpb25hbEluZm9ybWF0aW9ucy5sZW5ndGgiPgorICAgICAgICAgICAgPHRoZWFkIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZCI+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMiI+S2V5PC90aD4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0yIj5WYWx1ZTwvdGg+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyIGRhdGEtbmctcmVwZWF0PSJhZGRpdGlvbmFsSW5mb3JtYXRpb24gaW4gYWRkaXRpb25hbEluZm9ybWF0aW9ucyI+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJlbGxpcHNpcy1jb2xzMiIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FkZGl0aW9uYWxJbmZvcm1hdGlvbi5rZXl9fSI+e3thZGRpdGlvbmFsSW5mb3JtYXRpb24ua2V5fX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMyIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YWRkaXRpb25hbEluZm9ybWF0aW9uLnZhbHVlfX0iPnt7YWRkaXRpb25hbEluZm9ybWF0aW9uLnZhbHVlfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3RhYmxlPgorICAgIDwvZGl2PgorCisgICAgPGg0IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGl0bGUiPlByb3BlcnRpZXM8L2g0PgorICAgIDxkaXYgY2xhc3M9InNkYy1wcm9wZXJ0aWVzLWNvbnRhaW5lciB3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIj4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUiIGRhdGEtbmctc2hvdz0iY29tcG9uZW50LnByb3BlcnRpZXMubGVuZ3RoIj4KKyAgICAgICAgICAgIDx0aGVhZCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQiPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTIiPk5hbWU8L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPlR5cGUgKENvbnN0cmFpbnRzKTwvdGg+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMyI+RGVmYXVsdCBWYWx1ZTwvdGg+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyIGRhdGEtbmctcmVwZWF0PSJwcm9wZXJ0eSBpbiBjb21wb25lbnQucHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJlbGxpcHNpcy1jb2xzMiIgZGF0YS10ZXN0cy1pZD0ie3twcm9wZXJ0eS5uYW1lfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5uYW1lfX0iPnt7cHJvcGVydHkubmFtZX19PC9zcGFuPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGRhdGEtdGVzdHMtaWQ9Int7cHJvcGVydHkudHlwZX19Ij57e3Byb3BlcnR5LnR5cGV9fTwvc3Bhbj48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0iZWxsaXBzaXMtY29sczMiIGRhdGEtdGVzdHMtaWQ9Int7cHJvcGVydHkuZGVmYXVsdFZhbHVlfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5kZWZhdWx0VmFsdWV9fSI+e3twcm9wZXJ0eS5kZWZhdWx0VmFsdWV9fTwvc3Bhbj48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisKKyAgICA8aDQgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10aXRsZSI+UmVxdWlyZW1lbnRzPC9oND4KKyAgICA8ZGl2IGNsYXNzPSJzZGMtcmVxdWlyZW1lbnRzLWNvbnRhaW5lciB3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIiA+CisgICAgICAgIDx0YWJsZSBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlIiBkYXRhLW5nLXNob3c9Imhhc0l0ZW1zKGNvbXBvbmVudC5yZXF1aXJlbWVudHMpIj4KKyAgICAgICAgICAgIDx0aGVhZCAgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkIj4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0xIj5UeXBlPC90aD4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHIgZGF0YS1uZy1yZXBlYXQ9IihrZXksIHZhbHVlKSBpbiBjb21wb25lbnQucmVxdWlyZW1lbnRzIj4KKyAgICAgICAgICAgICAgICA8dGQ+e3t2YWx1ZVswXS5uYW1lfX08L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisKKworICAgIDxoNCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRpdGxlIj5EZXBsb3ltZW50IEFydGlmYWN0czwvaDQ+CisKKyAgICA8ZGl2IGNsYXNzPSJzZGMtaW5mb3JtYXRpb24tY29udGFpbmVyIHctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC1jb250ZW50LXNlY3Rpb24iID4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUiIGRhdGEtbmctc2hvdz0iaGFzSXRlbXMoY29tcG9uZW50LmRlcGxveW1lbnRBcnRpZmFjdHMpIj4KKyAgICAgICAgICAgIDx0aGVhZCAgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkIj4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0yIj5OYW1lPC90aD4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0zIj5GaWxlPC90aD4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0zIj5WZXJzaW9uPC90aD4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0zIj48L3RoPgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0ciBkYXRhLW5nLXJlcGVhdD0iKGFydGlmYWN0TG9naWNOYW1lLCBhcnRpZmFjdCkgaW4gY29tcG9uZW50LmRlcGxveW1lbnRBcnRpZmFjdHMiPgorICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0iZWxsaXBzaXMtY29sczIiIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19Ij57e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fTwvc3Bhbj48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0iZWxsaXBzaXMtY29sczMiICBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0TmFtZX19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX0iPnt7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMzIiAgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdFZlcnNpb259fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0VmVyc2lvbn19IiBkYXRhLW5nLWlmPSJhcnRpZmFjdC5lc0lkIj57e2FydGlmYWN0LmFydGlmYWN0VmVyc2lvbn19PC9zcGFuPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xzLTMiPgorICAgICAgICAgICAgICAgICAgICA8ZG93bmxvYWQtYXJ0aWZhY3QgY2xhc3M9InNkYy1pbmZvcm1hdGlvbi1hcnRpZmFjdHMtaWNvbiBkb3dubG9hZCIgZGF0YS1uZy1pZj0iYXJ0aWZhY3QuYXJ0aWZhY3ROYW1lIiBjb21wb25lbnQ9ImNvbXBvbmVudCIgYXJ0aWZhY3Q9ImFydGlmYWN0Ij48L2Rvd25sb2FkLWFydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICA8IS0tc3BhbiBjbGFzcz0ic2RjLWluZm9ybWF0aW9uLWFydGlmYWN0cy1pY29uIHByZXZpZXciPjwvc3Bhbi0tPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L2Rpdj4KKworICAgIDxoNCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRpdGxlIj5JbmZvcm1hdGlvbiBBcnRpZmFjdHM8L2g0PgorICAgIDxkaXYgY2xhc3M9InNkYy1pbmZvcm1hdGlvbi1jb250YWluZXIgdy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LWNvbnRlbnQtc2VjdGlvbiIgPgorICAgICAgICA8dGFibGUgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZSIgZGF0YS1uZy1zaG93PSJoYXNJdGVtcyhjb21wb25lbnQuYXJ0aWZhY3RzKSI+CisgICAgICAgICAgICA8dGhlYWQgIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZCI+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMiI+TmFtZTwvdGg+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMyI+RmlsZTwvdGg+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMyI+VmVyc2lvbjwvdGg+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMyI+PC90aD4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHIgZGF0YS1uZy1yZXBlYXQ9IihhcnRpZmFjdExvZ2ljTmFtZSwgYXJ0aWZhY3QpIGluIGNvbXBvbmVudC5hcnRpZmFjdHMiPgorICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0iZWxsaXBzaXMtY29sczIiICBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSI+e3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMzIiAgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdE5hbWV9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0TmFtZX19Ij57e2FydGlmYWN0LmFydGlmYWN0TmFtZX19PC9zcGFuPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJlbGxpcHNpcy1jb2xzMyIgIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3RWZXJzaW9ufX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3thcnRpZmFjdC5hcnRpZmFjdFZlcnNpb259fSIgZGF0YS1uZy1pZj0iYXJ0aWZhY3QuZXNJZCI+e3thcnRpZmFjdC5hcnRpZmFjdFZlcnNpb259fTwvc3Bhbj48L3RkPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29scy0zIj4KKyAgICAgICAgICAgICAgICAgICAgPGRvd25sb2FkLWFydGlmYWN0IGNsYXNzPSJzZGMtaW5mb3JtYXRpb24tYXJ0aWZhY3RzLWljb24gZG93bmxvYWQiIGRhdGEtbmctaWY9ImFydGlmYWN0LmFydGlmYWN0TmFtZSIgY29tcG9uZW50PSJjb21wb25lbnQiIGFydGlmYWN0PSJhcnRpZmFjdCI+PC9kb3dubG9hZC1hcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgPCEtLXNwYW4gY2xhc3M9InNkYy1pbmZvcm1hdGlvbi1hcnRpZmFjdHMtaWNvbiBwcmV2aWV3Ij48L3NwYW4tLT4KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9wcm9wZXJ0aWVzL3NlcnZpY2UtcHJvcGVydGllcy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvcHJvcGVydGllcy9zZXJ2aWNlLXByb3BlcnRpZXMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjg3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2NvbXBvbmVudC12aWV3ZXIvcHJvcGVydGllcy9zZXJ2aWNlLXByb3BlcnRpZXMtdmlldy5odG1sCkBAIC0wLDAgKzEsMTY3IEBACis8ZGl2IGNsYXNzPSJ3LXNkYy1jb21wb25lbnQtdmlld2VyLXJpZ2h0LXByb3BlcnRpZXMiPgorCisgICAgPGg0IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGl0bGUiPkdlbmVyYWwgSW5mb3JtYXRpb248L2g0PgorICAgIDxkaXYgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC1jb250ZW50LXNlY3Rpb24iPgorICAgICAgICA8ZGl2IGNsYXNzPSdzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0xJz4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1RZUEUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfU0VSVklDRSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9WRVJTSU9OIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQudmVyc2lvbiI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9DQVRFR09SWSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tjb21wb25lbnQuY2F0ZWdvcmllc1swXS5uYW1lfX0iIGRhdGEtbmctYmluZD0iY29tcG9uZW50LmNhdGVnb3JpZXNbMF0ubmFtZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9DUkVBVElPTl9EQVRFIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuY3JlYXRpb25EYXRlIHwgZGF0ZTogJ01NL2RkL3l5eXknIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX0FVVEhPUiI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIGRhdGEtbmctYmluZD0iY29tcG9uZW50LmNyZWF0b3JGdWxsTmFtZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9DT05UQUNUX0lEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuY29udGFjdElkIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1BST0pFQ1RfQ09ERSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIGRhdGEtbmctYmluZD0iY29tcG9uZW50LnByb2plY3RDb2RlIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+TGlmZSBDeWNsZSBTdGF0dXM6PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiPiB7e3NkY01lbnUuTGlmZUN5Y2xlU3RhdHVzZXNbY29tcG9uZW50LmxpZmVjeWNsZVN0YXRlXS50ZXh0fX08L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+RGlzdHJpYnV0aW9uIFN0YXR1czo8L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSI+e3tzZGNNZW51LkRpc3RyaWJ1dGlvblN0YXR1c2VzW2NvbXBvbmVudC5kaXN0cmlidXRpb25TdGF0dXNdLnRleHR9fTwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPlN5c3RlbSBOYW1lOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Y29tcG9uZW50LnN5c3RlbU5hbWV9fSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuc3lzdGVtTmFtZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSdzZGMtcmVzb3VyY2Utdmlld2VyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWNvbHVtbi0yJz4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSBkZXNjcmlwdGlvbiI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX0RFU0NSSVBUSU9OIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJjb21wb25lbnQuZGVzY3JpcHRpb24iPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIiA+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNkYy1yZXNvdXJjZS12aWV3ZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1RBR1MiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Y29tcG9uZW50LnRhZ3Muam9pbignLCAnKX19IiBjbGFzcz0ic2RjLXJlc291cmNlLXZpZXdlci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC10YWdzIiBkYXRhLW5nLXJlcGVhdD0iKHRhZywgdGFnTmFtZSkgaW4gY29tcG9uZW50LnRhZ3MiPnt7dGFnTmFtZX19e3skbGFzdCA/ICcnIDogJywnfX08L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgICAgPGg0IGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGl0bGUiPkFkZGl0aW9uYWwgSW5mb3JtYXRpb248L2g0PgorCisgICAgPGRpdiBjbGFzcz0ic2RjLXByb3BlcnRpZXMtY29udGFpbmVyIHctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC1jb250ZW50LXNlY3Rpb24iPgorICAgICAgICA8dGFibGUgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZSIgZGF0YS1uZy1zaG93PSJhZGRpdGlvbmFsSW5mb3JtYXRpb25zLmxlbmd0aCI+CisgICAgICAgICAgICA8dGhlYWQgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkIj4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0yIj5LZXk8L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTIiPlZhbHVlPC90aD4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHIgZGF0YS1uZy1yZXBlYXQ9ImFkZGl0aW9uYWxJbmZvcm1hdGlvbiBpbiBhZGRpdGlvbmFsSW5mb3JtYXRpb25zIj4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMyIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YWRkaXRpb25hbEluZm9ybWF0aW9uLmtleX19Ij57e2FkZGl0aW9uYWxJbmZvcm1hdGlvbi5rZXl9fTwvc3Bhbj48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0iZWxsaXBzaXMtY29sczIiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3thZGRpdGlvbmFsSW5mb3JtYXRpb24udmFsdWV9fSI+e3thZGRpdGlvbmFsSW5mb3JtYXRpb24udmFsdWV9fTwvc3Bhbj48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisKKyAgICA8aDQgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10aXRsZSI+SW5wdXRzPC9oND4KKworICAgIDxkaXYgY2xhc3M9InNkYy1wcm9wZXJ0aWVzLWNvbnRhaW5lciB3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIj4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUiIGRhdGEtbmctc2hvdz0iaW5wdXRzLmxlbmd0aCI+CisgICAgICAgICAgICA8dGhlYWQgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkIj4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0yIj5OYW1lPC90aD4KKyAgICAgICAgICAgICAgICA8dGggY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZS1oZWFkLWNlbGwgY29scy0zIj5UeXBlIChDb25zdHJhaW50cyk8L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPkRlZmF1bHQgVmFsdWU8L3RoPgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0ciBkYXRhLW5nLXJlcGVhdD0iaW5wdXQgaW4gaW5wdXRzIj4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMyIiBkYXRhLXRlc3RzLWlkPSJ7e2lucHV0Lm5hbWV9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2lucHV0Lm5hbWV9fSI+e3tpbnB1dC5uYW1lfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+e3tpbnB1dC50eXBlfX08L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0iZWxsaXBzaXMtY29sczMiIGRhdGEtdGVzdHMtaWQ9Int7aW5wdXQudmFsdWV9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2lucHV0LnZhbHVlfX0iPnt7aW5wdXQudmFsdWV9fTwvc3Bhbj48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisKKyAgICA8aDQgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10aXRsZSI+QVBJIEFydGlmYWN0czwvaDQ+CisKKyAgICA8ZGl2IGNsYXNzPSJzZGMtcmVxdWlyZW1lbnRzLWNvbnRhaW5lciB3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtY29udGVudC1zZWN0aW9uIj4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUiIGRhdGEtbmctc2hvdz0iaGFzSXRlbXMoY29tcG9uZW50LnNlcnZpY2VBcGlBcnRpZmFjdHMpIj4KKyAgICAgICAgICAgIDx0aGVhZCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQiPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTIiPk5hbWU8L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPkZpbGU8L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPlZlcnNpb248L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPjwvdGg+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyIGRhdGEtbmctcmVwZWF0PSIoYXJ0aWZhY3RMb2dpY05hbWUsIGFydGlmYWN0KSBpbiBjb21wb25lbnQuc2VydmljZUFwaUFydGlmYWN0cyI+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJlbGxpcHNpcy1jb2xzMiIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0iPnt7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19PC9zcGFuPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJlbGxpcHNpcy1jb2xzMyIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdE5hbWV9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0TmFtZX19Ij57e2FydGlmYWN0LmFydGlmYWN0TmFtZX19PC9zcGFuPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJlbGxpcHNpcy1jb2xzMyIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdFZlcnNpb259fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0VmVyc2lvbn19IiBkYXRhLW5nLWlmPSJhcnRpZmFjdC5lc0lkIj57e2FydGlmYWN0LmFydGlmYWN0VmVyc2lvbn19PC9zcGFuPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xzLTMiPgorICAgICAgICAgICAgICAgICAgICA8ZG93bmxvYWQtYXJ0aWZhY3QgY2xhc3M9InNkYy1pbmZvcm1hdGlvbi1hcnRpZmFjdHMtaWNvbiBkb3dubG9hZCIgZGF0YS1uZy1pZj0iYXJ0aWZhY3QuYXJ0aWZhY3ROYW1lIiBjb21wb25lbnQ9ImNvbXBvbmVudCIgYXJ0aWZhY3Q9ImFydGlmYWN0Ij48L2Rvd25sb2FkLWFydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICA8IS0tc3BhbiBjbGFzcz0ic2RjLWluZm9ybWF0aW9uLWFydGlmYWN0cy1pY29uIHByZXZpZXciPjwvc3Bhbi0tPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L2Rpdj4KKworICAgIDxoNCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRpdGxlIj5EZXBsb3ltZW50IEFydGlmYWN0czwvaDQ+CisKKyAgICA8ZGl2IGNsYXNzPSJzZGMtaW5mb3JtYXRpb24tY29udGFpbmVyIHctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC1jb250ZW50LXNlY3Rpb24iPgorICAgICAgICA8dGFibGUgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10YWJsZSIgZGF0YS1uZy1zaG93PSJoYXNJdGVtcyhjb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cykiPgorICAgICAgICAgICAgPHRoZWFkIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZCI+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMiI+TmFtZTwvdGg+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMyI+RmlsZTwvdGg+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMyI+VmVyc2lvbjwvdGg+CisgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJ3LXNkYy1yZXNvdXJjZS12aWV3ZXItcmlnaHQtdGFibGUtaGVhZC1jZWxsIGNvbHMtMyI+PC90aD4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHIgZGF0YS1uZy1yZXBlYXQ9IihhcnRpZmFjdExvZ2ljTmFtZSwgYXJ0aWZhY3QpIGluIGNvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzIj4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMyIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSI+e3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMzIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0TmFtZX19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX0iPnt7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMzIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0VmVyc2lvbn19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3RWZXJzaW9ufX0iIGRhdGEtbmctaWY9ImFydGlmYWN0LmVzSWQiPnt7YXJ0aWZhY3QuYXJ0aWZhY3RWZXJzaW9ufX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbHMtMyI+CisgICAgICAgICAgICAgICAgICAgIDxkb3dubG9hZC1hcnRpZmFjdCBjbGFzcz0ic2RjLWluZm9ybWF0aW9uLWFydGlmYWN0cy1pY29uIGRvd25sb2FkIiBkYXRhLW5nLWlmPSJhcnRpZmFjdC5hcnRpZmFjdE5hbWUiIGNvbXBvbmVudD0iY29tcG9uZW50IiBhcnRpZmFjdD0iYXJ0aWZhY3QiPjwvZG93bmxvYWQtYXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgIDwhLS1zcGFuIGNsYXNzPSJzZGMtaW5mb3JtYXRpb24tYXJ0aWZhY3RzLWljb24gcHJldmlldyI+PC9zcGFuLS0+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3RhYmxlPgorICAgIDwvZGl2PgorCisKKyAgICA8aDQgY2xhc3M9Inctc2RjLXJlc291cmNlLXZpZXdlci1yaWdodC10aXRsZSI+SW5mb3JtYXRpb24gQXJ0aWZhY3RzPC9oND4KKworICAgIDxkaXYgY2xhc3M9InNkYy1pbmZvcm1hdGlvbi1jb250YWluZXIgdy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LWNvbnRlbnQtc2VjdGlvbiI+CisgICAgICAgIDx0YWJsZSBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlIiBkYXRhLW5nLXNob3c9Imhhc0l0ZW1zKGNvbXBvbmVudC5hcnRpZmFjdHMpIj4KKyAgICAgICAgICAgIDx0aGVhZCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQiPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTIiPk5hbWU8L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPkZpbGU8L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPlZlcnNpb248L3RoPgorICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0idy1zZGMtcmVzb3VyY2Utdmlld2VyLXJpZ2h0LXRhYmxlLWhlYWQtY2VsbCBjb2xzLTMiPjwvdGg+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyIGRhdGEtbmctcmVwZWF0PSIoYXJ0aWZhY3RMb2dpY05hbWUsIGFydGlmYWN0KSBpbiBjb21wb25lbnQuYXJ0aWZhY3RzIj4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMyIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSI+e3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMzIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0TmFtZX19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX0iPnt7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImVsbGlwc2lzLWNvbHMzIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0VmVyc2lvbn19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3RWZXJzaW9ufX0iIGRhdGEtbmctaWY9ImFydGlmYWN0LmVzSWQiPnt7YXJ0aWZhY3QuYXJ0aWZhY3RWZXJzaW9ufX08L3NwYW4+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbHMtMyI+CisgICAgICAgICAgICAgICAgICAgIDxkb3dubG9hZC1hcnRpZmFjdCBjbGFzcz0ic2RjLWluZm9ybWF0aW9uLWFydGlmYWN0cy1pY29uIGRvd25sb2FkIiBkYXRhLW5nLWlmPSJhcnRpZmFjdC5hcnRpZmFjdE5hbWUiIGNvbXBvbmVudD0iY29tcG9uZW50IiBhcnRpZmFjdD0iYXJ0aWZhY3QiPjwvZG93bmxvYWQtYXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgIDwhLS1zcGFuIGNsYXNzPSJzZGMtaW5mb3JtYXRpb24tYXJ0aWZhY3RzLWljb24gcHJldmlldyI+PC9zcGFuLS0+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3RhYmxlPgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Rhc2hib2FyZC9jb3Zlci9kYXNoYm9hcmQtY292ZXItdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2NvdmVyL2Rhc2hib2FyZC1jb3Zlci12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzliNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Rhc2hib2FyZC9jb3Zlci9kYXNoYm9hcmQtY292ZXItdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDkxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSURhc2hib2FyZENvdmVyVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBzaG93VHV0b3JpYWw6Ym9vbGVhbjsKKyAgICAgICAgdmVyc2lvbjpzdHJpbmc7CisgICAgICAgIG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZTsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRGFzaGJvYXJkQ292ZXJWaWV3TW9kZWwgeworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJHN0YXRlUGFyYW1zJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJywKKyAgICAgICAgICAgICckdGVtcGxhdGVDYWNoZScsCisgICAgICAgICAgICAnJHN0YXRlJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJRGFzaGJvYXJkQ292ZXJWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGVQYXJhbXM6YW55LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNhY2hlU2VydmljZTpTZXJ2aWNlcy5DYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTphbnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24pIHsKKworICAgICAgICAgICAgLy8gU2hvdyB0aGUgdHV0b3JpYWwgaWYgbmVlZGVkIHdoZW4gdGhlIGRhc2hib2FyZCBwYWdlIGlzIG9wZW5lZC48c2NyaXB0IHNyYz0iYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLWZpbHRlci9kaXN0L2FuZ3VsYXItZmlsdGVyLm1pbi5qcyI+PC9zY3JpcHQ+CisgICAgICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSB3ZWxjb21lIHBhZ2UuCisgICAgICAgICAgICBpZiAodGhpcy4kc3RhdGVQYXJhbXMuc2hvdyA9PT0gJ3R1dG9yaWFsJykgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNob3dUdXRvcmlhbCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuJHN0YXRlUGFyYW1zLnNob3cgPT09ICd3aGF0c25ldycpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS52ZXJzaW9uID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCd2ZXJzaW9uJyk7CisgICAgICAgICAgICAgICAgdGhpcy5vcGVuV2hhdHNOZXdNb2RhbCh0aGlzLiRzY29wZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOnZvaWQgPT4geworCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBvcGVuV2hhdHNOZXdNb2RhbCA9IChzY29wZTpJRGFzaGJvYXJkQ292ZXJWaWV3TW9kZWxTY29wZSk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIGxldCBvbk9rID0gKCk6dm9pZCA9PiB7fTsKKworICAgICAgICAgICAgbGV0IG9uQ2FuY2VsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oJ2Rhc2hib2FyZC53ZWxjb21lJywge3Nob3c6ICcnfSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgbW9kYWxPcHRpb25zOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXR0aW5ncyA9IHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aGF0cy1uZXcvd2hhdHMtbmV3LXZpZXcuaHRtbCcpLAorICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5XaGF0c05ld1ZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogJ3NkYy1sJywKKyAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAgc2NvcGU6IHNjb3BlLAorICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiBzY29wZS52ZXJzaW9uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUubW9kYWxJbnN0YW5jZSA9IHRoaXMuJG1vZGFsLm9wZW4obW9kYWxPcHRpb25zKTsKKyAgICAgICAgICAgIHNjb3BlLm1vZGFsSW5zdGFuY2UucmVzdWx0LnRoZW4ob25Paywgb25DYW5jZWwpOworICAgICAgICB9OworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Rhc2hib2FyZC9jb3Zlci9kYXNoYm9hcmQtY292ZXItdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9kYXNoYm9hcmQvY292ZXIvZGFzaGJvYXJkLWNvdmVyLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODY1N2NiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9kYXNoYm9hcmQvY292ZXIvZGFzaGJvYXJkLWNvdmVyLXZpZXcuaHRtbApAQCAtMCwwICsxIEBACis8ZGl2IGNsYXNzPSJzZGMtd2VsY29tZS1wYWdlIj48L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2Rhc2hib2FyZC12aWV3LW1vZGVsLXRlc3RzLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9kYXNoYm9hcmQvZGFzaGJvYXJkLXZpZXctbW9kZWwtdGVzdHMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3ZDliYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2Rhc2hib2FyZC12aWV3LW1vZGVsLXRlc3RzLnRzCkBAIC0wLDAgKzEsMjc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorCitkZXNjcmliZSgiZGFzaGJvYXJkIFZpZXcgTW9kZWwgIiwgKCkgPT4geworCisgICAgbGV0ICRjb250cm9sbGVyTW9jazpuZy5JQ29udHJvbGxlclNlcnZpY2U7CisgICAgbGV0ICRxTW9jazpuZy5JUVNlcnZpY2U7CisgICAgbGV0ICRodHRwQmFja2VuZE1vY2s6bmcuSUh0dHBCYWNrZW5kU2VydmljZTsKKyAgICBsZXQgJHNjb3BlTW9jazpTZGMuVmlld01vZGVscy5JRGFzaGJvYXJkVmlld01vZGVsU2NvcGU7CisgICAgbGV0ICRzdGF0ZU1vY2s6bmcudWkuSVN0YXRlU2VydmljZTsKKyAgICBsZXQgJHN0YXRlUGFyYW1zOmFueTsKKyAgICBsZXQgZW50aXR5U2VydmljZU1vY2s7CisKKworICAgIGxldCBnZXRBbGxFbnRpdGllc1Jlc3BvbnNlTW9jayAgPSAgWworICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAiODU1YWNkYzctNzk3Ni00OTEzLTlmYTYtMjUyMjBiZDVhMDY5IiwKKyAgICAgICAgICAgICJ1dWlkIjogIjhiYzU0Zjk0LTA4MmMtNDJmYS05MDQ5LTg0NzY3ZGYzZmYwNSIsCisgICAgICAgICAgICAiY29udGFjdElkIjogInFhMTIzNCIsCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiVm9JUCBDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0NDcyMzQ3MTIzOTgsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGRkZGQiLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJpY29uIjogIm1vYmlsaXR5IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0NDcyMzQ3MTIzOTgsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkaXN0cmlidXRpb25TdGF0dXMiOiAiRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCIsCisgICAgICAgICAgICAicHJvamVjdENvZGUiOiAiMjMzMjMzIiwKKyAgICAgICAgICAgICJuYW1lIjogIm1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hIiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAidHlwZSI6IDAsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAibWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWFzIG1hcyBtYXMgbWEiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInN5c3RlbU5hbWUiOiAiTWFzTWFzTWFzTWFzTWFzTWFzTWFzTWFzTWFzTWFzTWFzTWFzTWEiLAorICAgICAgICAgICAgInZuZiI6IHRydWUsCisgICAgICAgICAgICAiJCRoYXNoS2V5IjogIm9iamVjdDozMCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogIjRiYjU3N2NlLWNiMmMtNGNiNy1iYjM5LTU4NjQ0YjVlNzNjYiIsCisgICAgICAgICAgICAidXVpZCI6ICJlMjdmNDcyMy1jOWVjLTQxNjAtODlkYS1kYmY4NGQxOWE3ZTMiLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJxYTExMTEiLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIk1vYmlsaXR5IiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDQ3MjM4NTAzMTgxLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImFxYSIsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlLAorICAgICAgICAgICAgImljb24iOiAiY2FsbF9jb250cm9sbCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDQ3MjQ4OTkxMzg4LAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImptMDAwNyIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKb25pIE1pdGNoZWxsIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJDRVJUSUZJRUQiLAorICAgICAgICAgICAgImRpc3RyaWJ1dGlvblN0YXR1cyI6ICJESVNUUklCVVRJT05fUkVKRUNURUQiLAorICAgICAgICAgICAgInByb2plY3RDb2RlIjogIjExMTExMSIsCisgICAgICAgICAgICAibmFtZSI6ICJtYXJ0aW4xOCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiLAorICAgICAgICAgICAgInR5cGUiOiAwLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgIm1hcnRpbjE4IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzeXN0ZW1OYW1lIjogIk1hcnRpbjE4IiwKKyAgICAgICAgICAgICJ2bmYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJmMTkyZjRhNi03ZmJmLTQyZTQtYTU0Ni0zNzUwOWRmMjhkYzEiLAorICAgICAgICAgICAgInV1aWQiOiAiMGI3N2RjMGQtMjIyZS00ZDEwLTg1Y2QtZTQyMGM5NDgxNDE3IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiZmQxMjEyIiwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJBcHBsaWNhdGlvbiBMYXllciA0Ky9XZWIgU2VydmVyIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDQ3MjMzNjc5Nzc4LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImdlZWZ3IiwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUsCisgICAgICAgICAgICAiaWNvbiI6ICJkYXRhYmFzZSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDQ3MjMzNjgxNTgyLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAibmFtZSI6ICJnZXIiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJ0eXBlIjogMSwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJnZXIiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiZmV3d2ZlIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogImZld2V3IiwKKyAgICAgICAgICAgICJzeXN0ZW1OYW1lIjogIkdlciIsCisgICAgICAgICAgICAiJCRoYXNoS2V5IjogIm9iamVjdDozMSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogIjc4MzkyZDA4LTE4NTktNDdjMi1iMWYyLTFhMzViN2Y4YzMwZSIsCisgICAgICAgICAgICAidXVpZCI6ICI4Y2RkNjNiMi02YTYyLTQzNzYtOTAxMi02MjRmNDI0ZjcxZDQiLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJxdzEyMzQiLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkFwcGxpY2F0aW9uIExheWVyIDQrL0FwcGxpY2F0aW9uIFNlcnZlcnMiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0NDcyMzQwNDYxMTQsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAidGVzdCIsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlLAorICAgICAgICAgICAgImljb24iOiAicm91dGVyIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0NDcyMzQwNTA1NDUsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJuYW1lIjogInRlc3QiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJ0eXBlIjogMSwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJ0ZXN0IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ2ZW5kb3JOYW1lIjogInRlc3QiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAidGVzdCIsCisgICAgICAgICAgICAic3lzdGVtTmFtZSI6ICJUZXN0IiwKKyAgICAgICAgICAgICIkJGhhc2hLZXkiOiAib2JqZWN0OjMyIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAiOTM5ZTE1M2QtMjIzNi00MTBmLWI0YTktM2I0YmY4Yzc5YzllIiwKKyAgICAgICAgICAgICJ1dWlkIjogIjg0ODYyNTQ3LTRmNTYtNDA1OC1iNzhlLTQwZGY1ZjM3NGQ3ZSIsCisgICAgICAgICAgICAiY29udGFjdElkIjogInF3MTIzNCIsCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQXBwbGljYXRpb24gTGF5ZXIgNCsvQXBwbGljYXRpb24gU2VydmVycyIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQ0NzIzNTI0MjU2MCwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJqbGsiLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJpY29uIjogImRhdGFiYXNlIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0NDcyMzUzMjgwNjIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iLAorICAgICAgICAgICAgIm5hbWUiOiAibmV3IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAidHlwZSI6IDEsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAibmV3IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ2ZW5kb3JOYW1lIjogImUiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAiZSIsCisgICAgICAgICAgICAic3lzdGVtTmFtZSI6ICJOZXciLAorICAgICAgICAgICAgIiQkaGFzaEtleSI6ICJvYmplY3Q6MzMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJlY2U4MThlMC1mZDU5LTQ3N2EtYmFmNi1lMjc0NjFhN2NlMjMiLAorICAgICAgICAgICAgInV1aWQiOiAiOGRiODIzYzItNmE5Yy00NjM2LTg2NzYtZjVlNzEzMjcwZGQ3IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAidWYyMzQ1IiwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJOZXR3b3JrIExheWVyIDItMy9Sb3V0ZXIiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0NDcyMzUzNTI0MjksCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAidSIsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlLAorICAgICAgICAgICAgImljb24iOiAibmV0d29yayIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDQ3MjM1MzcwMDY0LAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAibmFtZSI6ICJ1IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAidHlwZSI6IDEsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAidSIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJ1IiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogInUiLAorICAgICAgICAgICAgInN5c3RlbU5hbWUiOiAiVSIsCisgICAgICAgICAgICAiJCRoYXNoS2V5IjogIm9iamVjdDozNCIKKyAgICAgICAgfQorICAgIF07CisgICAgbGV0IGdldEFsbEVudGl0aWVzRGVmZXJlZDpuZy5JRGVmZXJyZWQ8YW55PiA9IG51bGw7CisKKyAgICBiZWZvcmVFYWNoKGFuZ3VsYXIubW9jay5tb2R1bGUoJ3NkY0FwcCcpKTsKKworICAgIGJlZm9yZUVhY2goYW5ndWxhci5tb2NrLmluamVjdCgoXyRjb250cm9sbGVyXzpuZy5JQ29udHJvbGxlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfJGh0dHBCYWNrZW5kXzpuZy5JSHR0cEJhY2tlbmRTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyRyb290U2NvcGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyRxXzpuZy5JUVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfJHN0YXRlXzpuZy51aS5JU3RhdGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyRzdGF0ZVBhcmFtc186YW55KSA9PiB7CisKKyAgICAgICAgJGNvbnRyb2xsZXJNb2NrICA9IF8kY29udHJvbGxlcl87CisgICAgICAgICRodHRwQmFja2VuZE1vY2sgPSBfJGh0dHBCYWNrZW5kXworICAgICAgICAkc2NvcGVNb2NrICAgICAgID0gXyRyb290U2NvcGVfLiRuZXcoKTsKKyAgICAgICAgJHFNb2NrICAgICAgICAgICA9IF8kcV87CisgICAgICAgICRzdGF0ZU1vY2sgICAgICAgPSBfJHN0YXRlXzsKKyAgICAgICAgJHN0YXRlUGFyYW1zID0gXyRzdGF0ZVBhcmFtc187CisKKworICAgICAgICAvL2hhbmRsZSBhbGwgaHR0cCByZXF1ZXN0IHRoZXQgbm90IHJlbGV2YW50IHRvIHRoZSB0ZXN0cworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrLmV4cGVjdEdFVCgvLipsYW5ndWFnZXNcL2VuX1VTLmpzb24uKi8pLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworICAgICAgIC8vICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKnJlc291cmNlc1wvY2VydGlmaWVkXC9hYnN0cmFjdC4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKnJlc3RcL3ZlcnNpb24uKi8pLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrLmV4cGVjdEdFVCgvLipjb25maWd1cmF0aW9uXC91aS4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKnVzZXJcL2F1dGhvcml6ZS4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKmNhdGVnb3JpZXNcL3NlcnZpY2VzLiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qY2F0ZWdvcmllc1wvcmVzb3VyY2VzLiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qY2F0ZWdvcmllc1wvcHJvZHVjdHMuKi8pLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrLmV4cGVjdEdFVCgnaHR0cDovL2ZlSG9zdDo4MTgxL3NkYzEvZmVQcm94eS9yZXN0L3ZlcnNpb24nKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTW9jayB0aGUgc2VydmljZQorICAgICAgICAgKiBAdHlwZSB7YW55fQorICAgICAgICAgKi8KKyAgICAgICAgZ2V0QWxsRW50aXRpZXNEZWZlcmVkID0gJHFNb2NrLmRlZmVyKCk7CisgICAgICAgIGdldEFsbEVudGl0aWVzRGVmZXJlZC5yZXNvbHZlKGdldEFsbEVudGl0aWVzUmVzcG9uc2VNb2NrKTsKKyAgICAgICAgZW50aXR5U2VydmljZU1vY2sgPSBqYXNtaW5lLmNyZWF0ZVNweU9iaignZW50aXR5U2VydmljZU1vY2snLCBbJ2dldEFsbENvbXBvbmVudHMnXSk7CisgICAgICAgIGVudGl0eVNlcnZpY2VNb2NrLmdldEFsbENvbXBvbmVudHMuYW5kLnJldHVyblZhbHVlKGdldEFsbEVudGl0aWVzRGVmZXJlZC5wcm9taXNlKTsKKworICAgICAgICAvLyAkc3RhdGVQYXJhbXNbJ3Nob3cnXSA9ICcnOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOZWVkIHRvIGluamVjdCBpbnRvIHRoZSBjb250cm9sbGVyIG9ubHkgdGhlIG9iamVjdHMgdGhhdCB3ZSB3YW50IHRvIE1PQ0sKKyAgICAgICAgICogdGhvc2UgdGhhdCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGVpcnMgYmVoYXZpb3JzCisgICAgICAgICAqLworICAgICAgICAkY29udHJvbGxlck1vY2soU2RjLlZpZXdNb2RlbHMuRGFzaGJvYXJkVmlld01vZGVsLCB7CisgICAgICAgICAgICAnJHNjb3BlJzogJHNjb3BlTW9jaywKKyAgICAgICAgICAgICckc3RhdGVQYXJhbXMnOiAkc3RhdGVQYXJhbXMsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkVudGl0eVNlcnZpY2UnOiBlbnRpdHlTZXJ2aWNlTW9jaywKKyAgICAgICAgfSk7CisKKyAgICB9KSk7CisKKworICAgIGRlc2NyaWJlKCJ3aGVuIENvbnRyb2xsZXIgJ0Rhc2hib2FyZFZpZXdNb2RlbCcgY3JlYXRlZCIsICgpID0+IHsKKworICAgICAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGFsbCBlbnRpdGllcycsICgpID0+IHsKKyAgICAgICAgICAgICRzY29wZU1vY2suJGFwcGx5KCk7CisgICAgICAgICAgICBleHBlY3QoJHNjb3BlTW9jay5jb21wb25lbnRzLmxlbmd0aCkudG9CZShnZXRBbGxFbnRpdGllc1Jlc3BvbnNlTW9jay5sZW5ndGgpOworICAgICAgICB9KTsKKworCisgICAgICAgIGl0KCdzaG91bGQgc2hvdyB0dXRvcmlhbCBwYWdlICcsICgpID0+IHsKKyAgICAgICAgICAgICRzdGF0ZVBhcmFtcy5zaG93ID0gJ3R1dG9yaWFsJzsKKworICAgICAgICAgICAgJGNvbnRyb2xsZXJNb2NrKFNkYy5WaWV3TW9kZWxzLkRhc2hib2FyZFZpZXdNb2RlbCwgeworICAgICAgICAgICAgICAgICckc2NvcGUnOiAkc2NvcGVNb2NrLAorICAgICAgICAgICAgICAgICckc3RhdGVQYXJhbXMnOiAkc3RhdGVQYXJhbXMsCisgICAgICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlJzogZW50aXR5U2VydmljZU1vY2ssCisgICAgICAgICAgICAgICAgLy90byBjb21wbGV0ZSBpbmplY3RzCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJHNjb3BlTW9jay4kYXBwbHkoKTsKKyAgICAgICAgICAgIGV4cGVjdCgkc2NvcGVNb2NrLmlzRmlyc3RUaW1lKS50b0JlVHJ1dGh5KCk7CisgICAgICAgICAgICBleHBlY3QoJHNjb3BlTW9jay5zaG93VHV0b3JpYWwpLnRvQmVUcnV0aHkoKTsKKyAgICAgICAgfSk7CisKKyAgICB9KTsKKworCisgICAgZGVzY3JpYmUoIndoZW4gZnVuY3Rpb24gJ2VudGl0aWVzQ291bnQnIGludm9rZWQiLCAoKSA9PiB7CisKKyAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7CisgICAgICAgICAgICAkY29udHJvbGxlck1vY2soU2RjLlZpZXdNb2RlbHMuRGFzaGJvYXJkVmlld01vZGVsLCB7CisgICAgICAgICAgICAgICAgJyRzY29wZSc6ICRzY29wZU1vY2ssCisgICAgICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlJzogZW50aXR5U2VydmljZU1vY2ssCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICRzY29wZU1vY2suJGFwcGx5KCk7CisgICAgICAgIH0pOworCisgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGVudGl0aWVzIGNvdW50IHBlciBmb2xkZXInLCAoKSA9PiB7CisKKyAgICAgICAgfSk7CisKKworICAgIH0pOworfSk7CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Rhc2hib2FyZC9kYXNoYm9hcmQtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2Rhc2hib2FyZC12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjVhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Rhc2hib2FyZC9kYXNoYm9hcmQtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDQxNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisKKyAgICAndXNlIHN0cmljdCc7CisgICAgaW1wb3J0IFJlc291cmNlVHlwZSA9IFNkYy5VdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJRGFzaGJvYXJkVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworCisgICAgICAgIGlzTG9hZGluZzogYm9vbGVhbjsKKyAgICAgICAgY29tcG9uZW50czogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PjsKKyAgICAgICAgZm9sZGVyczogRm9sZGVyc01lbnU7CisgICAgICAgIHJvbGVzOiBNb2RlbHMuSUNvbmZpZ1JvbGVzOworICAgICAgICB1c2VyOiBNb2RlbHMuSVVzZXJQcm9wZXJ0aWVzOworICAgICAgICBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uOworICAgICAgICBzZGNNZW51Ok1vZGVscy5JQXBwTWVudTsKKyAgICAgICAgc2hhcmluZ1NlcnZpY2U6U2RjLlNlcnZpY2VzLlNoYXJpbmdTZXJ2aWNlOworICAgICAgICBzaG93VHV0b3JpYWw6Ym9vbGVhbjsKKyAgICAgICAgaXNGaXJzdFRpbWU6Ym9vbGVhbjsKKyAgICAgICAgdmVyc2lvbjpzdHJpbmc7CisgICAgICAgIGNoZWNrYm94ZXNGaWx0ZXI6Q2hlY2tib3hlc0ZpbHRlcjsKKworICAgICAgICBvbkltcG9ydFZmYyhmaWxlOmFueSk6dm9pZDsKKyAgICAgICAgb25JbXBvcnRWZihmaWxlOmFueSk6dm9pZDsKKyAgICAgICAgb3BlbkNyZWF0ZU1vZGFsKGNvbXBvbmVudFR5cGU6IFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLCBpbXBvcnRlZEZpbGU6YW55KTogdm9pZDsKKyAgICAgICAgb3BlbldoYXRzTmV3TW9kYWwodmVyc2lvbjpzdHJpbmcpOnZvaWQ7CisgICAgICAgIG9wZW5EZXNpZ25lck1vZGFsKGlzUmVzb3VyY2U6Ym9vbGVhbiwgdW5pcXVlSWQ6c3RyaW5nKTogdm9pZDsKKyAgICAgICAgb3BlblZpZXdlck1vZGFsKGVudGl0eTphbnkpIDogdm9pZDsKKyAgICAgICAgc2V0U2VsZWN0ZWRGb2xkZXIoZm9sZGVySXRlbTogRm9sZGVyc0l0ZW1zTWVudSk6IHZvaWQ7CisgICAgICAgIGVudGl0aWVzQ291bnQoZm9sZGVySXRlbTogRm9sZGVyc0l0ZW1zTWVudSk6IG51bWJlcjsKKyAgICAgICAgZ2V0Q3VycmVudEZvbGRlckRpc3RyaWJ1dGVkKCk6IEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD47CisgICAgICAgIGNoYW5nZUxpZmVjeWNsZVN0YXRlKGVudGl0eTphbnksIGRhdGE6YW55KTogdm9pZDsKKyAgICAgICAgZ29Ub0NvbXBvbmVudChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTp2b2lkOworICAgICAgICB3aXphcmREZWJ1Z0VkaXQ6RnVuY3Rpb247CisgICAgICAgIG5vdGlmaWNhdGlvbkljb25DYWxsYmFjazpGdW5jdGlvbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ2hlY2tib3hlc0ZpbHRlciB7CisgICAgICAgIC8vIFN0YXR1c2VzCisgICAgICAgIHNlbGVjdGVkU3RhdHVzZXM6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgLy8gZGlzdHJpYnV0ZWQKKyAgICAgICAgZGlzdHJpYnV0ZWQ6QXJyYXk8c3RyaW5nPjsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElJdGVtTWVudSB7CisKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbVByb3BlcnRpZXMgeworICAgICAgICB0ZXh0OiBzdHJpbmc7CisgICAgICAgIGdyb3VwOiBzdHJpbmc7CisgICAgICAgIHN0YXRlOiBzdHJpbmc7CisgICAgICAgIGRpc3Q6ICBzdHJpbmc7CisgICAgICAgIGdyb3VwbmFtZTogc3RyaW5nOworICAgICAgICBzdGF0ZXM6IEFycmF5PGFueT47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEZvbGRlcnNNZW51IHsKKworICAgICAgICBwcml2YXRlIF9mb2xkZXJzOiBBcnJheTxGb2xkZXJzSXRlbXNNZW51PiA9IFtdOworCisgICAgICAgIGNvbnN0cnVjdG9yKGZvbGRlcnM6IEFycmF5PElNZW51SXRlbVByb3BlcnRpZXM+KSB7CisgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICBmb2xkZXJzLmZvckVhY2goZnVuY3Rpb24oZm9sZGVyOiBJTWVudUl0ZW1Qcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5ncm91cG5hbWUpeworICAgICAgICAgICAgICAgICAgICBzZWxmLl9mb2xkZXJzLnB1c2gobmV3IEZvbGRlcnNJdGVtc01lbnVHcm91cChmb2xkZXIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxmLl9mb2xkZXJzLnB1c2gobmV3IEZvbGRlcnNJdGVtc01lbnUoZm9sZGVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZWxmLl9mb2xkZXJzWzBdLnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGdldEZvbGRlcnMgPSAoKTogQXJyYXk8Rm9sZGVyc0l0ZW1zTWVudT4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbGRlcnM7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGdldEN1cnJlbnRGb2xkZXIgPSAoKTogRm9sZGVyc0l0ZW1zTWVudSA9PiB7CisgICAgICAgICAgICBsZXQgbWVudUl0ZW06IEZvbGRlcnNJdGVtc01lbnUgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB0aGlzLmdldEZvbGRlcnMoKS5mb3JFYWNoKGZ1bmN0aW9uKHRtcEZvbGRlcjogRm9sZGVyc0l0ZW1zTWVudSkgeworICAgICAgICAgICAgICAgIGlmICh0bXBGb2xkZXIuaXNTZWxlY3RlZCgpKXsKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0gPSB0bXBGb2xkZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gbWVudUl0ZW07CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHNldFNlbGVjdGVkID0gKGZvbGRlcjogRm9sZGVyc0l0ZW1zTWVudSk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLmdldEZvbGRlcnMoKS5mb3JFYWNoKGZ1bmN0aW9uKHRtcEZvbGRlcjogRm9sZGVyc0l0ZW1zTWVudSkgeworICAgICAgICAgICAgICAgIHRtcEZvbGRlci5zZXRTZWxlY3RlZChmYWxzZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGZvbGRlci5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEZvbGRlcnNJdGVtc01lbnUgaW1wbGVtZW50cyBJSXRlbU1lbnUgeworCisgICAgICAgIHB1YmxpYyB0ZXh0OnN0cmluZzsKKyAgICAgICAgcHVibGljIGdyb3VwOiBzdHJpbmc7CisgICAgICAgIHB1YmxpYyBzdGF0ZTogc3RyaW5nOworICAgICAgICBwdWJsaWMgZGlzdDogIHN0cmluZzsKKyAgICAgICAgcHVibGljIHN0YXRlczogQXJyYXk8YW55PjsKKworICAgICAgICBwcml2YXRlIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7CisKKyAgICAgICAgY29uc3RydWN0b3IobWVudVByb3BlcnRpZXM6IElNZW51SXRlbVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHRoaXMudGV4dCA9IG1lbnVQcm9wZXJ0aWVzLnRleHQ7CisgICAgICAgICAgICB0aGlzLmdyb3VwID0gbWVudVByb3BlcnRpZXMuZ3JvdXA7CisgICAgICAgICAgICB0aGlzLnN0YXRlID0gbWVudVByb3BlcnRpZXMuc3RhdGU7CisgICAgICAgICAgICB0aGlzLnN0YXRlcyA9IG1lbnVQcm9wZXJ0aWVzLnN0YXRlczsKKyAgICAgICAgICAgIHRoaXMuZGlzdCA9IG1lbnVQcm9wZXJ0aWVzLmRpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaXNTZWxlY3RlZCA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHNldFNlbGVjdGVkID0gKHZhbHVlOiBib29sZWFuKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgaXNHcm91cCA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRm9sZGVyc0l0ZW1zTWVudUdyb3VwIGV4dGVuZHMgRm9sZGVyc0l0ZW1zTWVudSB7CisKKyAgICAgICAgcHVibGljIGdyb3VwbmFtZTpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IobWVudVByb3BlcnRpZXM6IElNZW51SXRlbVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lbnVQcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHRoaXMuZ3JvdXBuYW1lID0gbWVudVByb3BlcnRpZXMuZ3JvdXBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGlzR3JvdXAgPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRGFzaGJvYXJkVmlld01vZGVsIHsKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlJywKKyAgICAgICAgICAgICckaHR0cCcsCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICdzZGNNZW51JywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJyRzdGF0ZVBhcmFtcycsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLlVzZXJSZXNvdXJjZVNlcnZpY2UnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnJHEnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEZhY3RvcnknLAorICAgICAgICAgICAgJ0NoYW5nZUxpZmVjeWNsZVN0YXRlSGFuZGxlcicsCisgICAgICAgICAgICAnTW9kYWxzSGFuZGxlcicsCisgICAgICAgICAgICAnTWVudUhhbmRsZXInCisgICAgICAgIF07CisKKyAgICAgICAgcHJpdmF0ZSBjb21wb25lbnRzOiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklEYXNoYm9hcmRWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGVudGl0eVNlcnZpY2U6U2VydmljZXMuRW50aXR5U2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkaHR0cDpuZy5JSHR0cFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOk1vZGVscy5JQXBwQ29uZmlndXJ0YWlvbiwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNNZW51Ok1vZGVscy5JQXBwTWVudSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTphbnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHN0YXRlUGFyYW1zOmFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB1c2VyUmVzb3VyY2VTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5JVXNlclJlc291cmNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2hhcmluZ1NlcnZpY2U6U2VydmljZXMuU2hhcmluZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkcTpuZy5JUVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tcG9uZW50RmFjdG9yeTogU2RjLlV0aWxzLkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyOiBTZGMuVXRpbHMuQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFNkYy5VdGlscy5Nb2RhbHNIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1lbnVIYW5kbGVyOiBVdGlscy5NZW51SGFuZGxlcgorICAgICAgICApIHsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLmluaXRGb2xkZXJzKCk7CisgICAgICAgICAgICB0aGlzLmluaXRFbnRpdGllcyh0cnVlKTsKKworICAgICAgICAgICAgaWYgKHRoaXMuJHN0YXRlUGFyYW1zKXsKKworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzdGF0ZS5wYXJhbXMuZm9sZGVyKXsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzOworICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyTmFtZSA9IHRoaXMuJHN0YXRlLnBhcmFtcy5mb2xkZXIucmVwbGFjZUFsbCgiXyIsIiAiKTsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5mb2xkZXJzLmdldEZvbGRlcnMoKS5mb3JFYWNoKGZ1bmN0aW9uKHRtcEZvbGRlcjogRm9sZGVyc0l0ZW1zTWVudSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcEZvbGRlci50ZXh0ID09PSBmb2xkZXJOYW1lKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLiRzY29wZS5zZXRTZWxlY3RlZEZvbGRlcih0bXBGb2xkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0dXRvcmlhbCBpZiBuZWVkZWQgd2hlbiB0aGUgZGFzaGJvYXJkIHBhZ2UgaXMgb3BlbmVkLjxzY3JpcHQgc3JjPSJib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItZmlsdGVyL2Rpc3QvYW5ndWxhci1maWx0ZXIubWluLmpzIj48L3NjcmlwdD4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSB3ZWxjb21lIHBhZ2UuCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy4kc3RhdGVQYXJhbXMuc2hvdz09PSd0dXRvcmlhbCcpeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zaG93VHV0b3JpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0ZpcnN0VGltZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0Rm9sZGVycyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLnVzZXIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5mb2xkZXJzID0gbmV3IEZvbGRlcnNNZW51KHRoaXMuJHNjb3BlLnJvbGVzW3RoaXMuJHNjb3BlLnVzZXIucm9sZV0uZm9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52ZXJzaW9uID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCd2ZXJzaW9uJyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zaGFyaW5nU2VydmljZSA9IHRoaXMuc2hhcmluZ1NlcnZpY2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNkY0NvbmZpZyA9IHRoaXMuc2RjQ29uZmlnOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2RjTWVudSA9IHRoaXMuc2RjTWVudTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVzZXIgPSB0aGlzLnVzZXJSZXNvdXJjZVNlcnZpY2UuZ2V0TG9nZ2VkaW5Vc2VyKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5yb2xlcyA9IHRoaXMuc2RjTWVudS5yb2xlczsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNob3dUdXRvcmlhbCA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNGaXJzdFRpbWUgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gT3BlbiBvbmJvYXJkaW5nIG1vZGFsCisgICAgICAgICAgICB0aGlzLiRzY29wZS5ub3RpZmljYXRpb25JY29uQ2FsbGJhY2sgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3Blbk9uYm9hZHJkaW5nTW9kYWwoJ0ltcG9ydCcpLnRoZW4oKCk9PnsKKyAgICAgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgICAgICB9LCAoKT0+eworICAgICAgICAgICAgICAgICAgICAvLyBFUlJPUgorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gQ2hlY2tib3hlcyBmaWx0ZXIgaW5pdAorICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlciA9IDxDaGVja2JveGVzRmlsdGVyPnt9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hlY2tib3hlc0ZpbHRlci5zZWxlY3RlZFN0YXR1c2VzID0gW107CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jaGVja2JveGVzRmlsdGVyLmRpc3RyaWJ1dGVkID0gW107CisKKyAgICAgICAgICAgIGxldCBhcHBlbmRUZW1wbGF0ZUFuZENvbnRyb2xsZXJGb3JQcm9kdWN0OkZ1bmN0aW9uID0gKG1vZGFsT3B0aW9uczpuZy51aS5ib290c3RyYXAuSU1vZGFsU2V0dGluZ3MsIGlzVmlld2VyOmJvb2xlYW4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoOnN0cmluZyA9ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaXNWaWV3ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsT3B0aW9ucy50ZW1wbGF0ZSA9IHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnZW50aXR5LXZpZXdlci9wcm9kdWN0LXZpZXdlci12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsT3B0aW9ucy5jb250cm9sbGVyID0gJ1NkYy5WaWV3TW9kZWxzLlJlc291cmNlVmlld2VyVmlld01vZGVsJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsT3B0aW9ucy50ZW1wbGF0ZSA9IHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnZW50aXR5LWhhbmRsZXIvcHJvZHVjdC1mb3JtL3Byb2R1Y3QtZm9ybS12aWV3Lmh0bWwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsT3B0aW9ucy5jb250cm9sbGVyID0gJ1NkYy5WaWV3TW9kZWxzLlByb2R1Y3RGb3JtVmlld01vZGVsJzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vbkltcG9ydFZmID0gKGZpbGU6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZihmaWxlICYmIGZpbGUuZmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZmlsZSBoYXMgdmFsaWQgZXh0ZW5zaW9uLgorICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZUV4dGVuc2lvbjpzdHJpbmcgID0gZmlsZS5maWxlbmFtZS5zcGxpdCgiLiIpLnBvcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZGNDb25maWcuY3NhckZpbGVFeHRlbnNpb24uaW5kZXhPZihmaWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpICE9PSAtMSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbygnd29ya3NwYWNlLmdlbmVyYWwnLCB7dHlwZTpVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRS50b0xvd2VyQ2FzZSgpLCBpbXBvcnRlZEZpbGU6IGZpbGUsIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlLlZGfSk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhOlNkYy5WaWV3TW9kZWxzLklDbGllbnRNZXNzYWdlTW9kYWxNb2RlbCA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogc2VsZi4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfVkFMSURfQ1NBUl9FWFRFTlNJT05TX1RJVExFIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIHNlbGYuJGZpbHRlcigndHJhbnNsYXRlJykoIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1ZBTElEX0NTQVJfRVhURU5TSU9OUyIsICJ7J2V4dGVuc2lvbnMnOiAnIiArIHRoaXMuc2RjQ29uZmlnLmNzYXJGaWxlRXh0ZW5zaW9uICsgIid9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6IFV0aWxzLkNvbnN0YW50cy5TRVZFUklUWS5FUlJPUgorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTW9kYWxzSGFuZGxlci5vcGVuQ2xpZW50TWVzc2FnZU1vZGFsKGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25JbXBvcnRWZmMgPSAoZmlsZTphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmKGZpbGUgJiYgZmlsZS5maWxlbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBmaWxlIGhhcyB2YWxpZCBleHRlbnNpb24uCisgICAgICAgICAgICAgICAgICAgIGxldCBmaWxlRXh0ZW5zaW9uOnN0cmluZyAgPSBmaWxlLmZpbGVuYW1lLnNwbGl0KCIuIikucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNkY0NvbmZpZy50b3NjYUZpbGVFeHRlbnNpb24uaW5kZXhPZihmaWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpICE9PSAtMSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbygnd29ya3NwYWNlLmdlbmVyYWwnLCB7dHlwZTpVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRS50b0xvd2VyQ2FzZSgpLCBpbXBvcnRlZEZpbGU6IGZpbGUsIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlLlZGQ30pOworICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YTpTZGMuVmlld01vZGVscy5JQ2xpZW50TWVzc2FnZU1vZGFsTW9kZWwgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHNlbGYuJGZpbHRlcigndHJhbnNsYXRlJykoIk5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1ZBTElEX1RPU0NBX0VYVEVOU0lPTlNfVElUTEUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAgc2VsZi4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfVkFMSURfVE9TQ0FfRVhURU5TSU9OUyIsICJ7J2V4dGVuc2lvbnMnOiAnIiArIHRoaXMuc2RjQ29uZmlnLnRvc2NhRmlsZUV4dGVuc2lvbiArICInfSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiBVdGlscy5Db25zdGFudHMuU0VWRVJJVFkuRVJST1IKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNsaWVudE1lc3NhZ2VNb2RhbChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9wZW5DcmVhdGVNb2RhbCA9IChjb21wb25lbnRUeXBlOiBzdHJpbmcsIGltcG9ydGVkRmlsZTphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZEZpbGUpeworICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRFbnRpdGllcyh0cnVlKTsgLy8gUmV0dXJuIGZyb20gaW1wb3J0CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oJ3dvcmtzcGFjZS5nZW5lcmFsJywge3R5cGU6Y29tcG9uZW50VHlwZS50b0xvd2VyQ2FzZSgpfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5lbnRpdGllc0NvdW50ID0gKGZvbGRlckl0ZW06IEZvbGRlcnNJdGVtc01lbnUpOiBhbnkgPT4geworICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpczsKKyAgICAgICAgICAgICAgICBsZXQgdG90YWw6IG51bWJlciA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGZvbGRlckl0ZW0uaXNHcm91cCgpKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9sZGVycy5nZXRGb2xkZXJzKCkuZm9yRWFjaChmdW5jdGlvbih0bXBGb2xkZXI6IEZvbGRlcnNJdGVtc01lbnUpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcEZvbGRlci5ncm91cCAmJiB0bXBGb2xkZXIuZ3JvdXA9PT0oPEZvbGRlcnNJdGVtc01lbnVHcm91cD5mb2xkZXJJdGVtKS5ncm91cG5hbWUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBzZWxmLl9nZXRUb3RhbENvdW50cyh0bXBGb2xkZXIsIHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgc2VsZi5fZ2V0VG90YWxDb3VudHMoZm9sZGVySXRlbSwgc2VsZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldEN1cnJlbnRGb2xkZXJEaXN0cmlidXRlZCA9ICgpOiBBcnJheTxhbnk+ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICAgICAgbGV0IHN0YXRlcyA9IFtdOworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5mb2xkZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXJJdGVtOkZvbGRlcnNJdGVtc01lbnUgPSB0aGlzLiRzY29wZS5mb2xkZXJzLmdldEN1cnJlbnRGb2xkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlckl0ZW0uaXNHcm91cCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5mb2xkZXJzLmdldEZvbGRlcnMoKS5mb3JFYWNoKGZ1bmN0aW9uICh0bXBGb2xkZXI6Rm9sZGVyc0l0ZW1zTWVudSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBGb2xkZXIuZ3JvdXAgJiYgdG1wRm9sZGVyLmdyb3VwID09PSAoPEZvbGRlcnNJdGVtc01lbnVHcm91cD5mb2xkZXJJdGVtKS5ncm91cG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2V0U3RhdGVzKHRtcEZvbGRlciwgc3RhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NldFN0YXRlcyhmb2xkZXJJdGVtLCBzdGF0ZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZXM7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRTZWxlY3RlZEZvbGRlciA9IChmb2xkZXJJdGVtOiBGb2xkZXJzSXRlbXNNZW51KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5mb2xkZXJzLnNldFNlbGVjdGVkKGZvbGRlckl0ZW0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ29Ub0NvbXBvbmVudCA9IChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmc9dHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbygnd29ya3NwYWNlLmdlbmVyYWwnLCB7aWQ6IGNvbXBvbmVudC51bmlxdWVJZCwgdHlwZTpjb21wb25lbnQuY29tcG9uZW50VHlwZS50b0xvd2VyQ2FzZSgpIH0pOworICAgICAgICAgICAgfTsKKworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgX2dldFRvdGFsQ291bnRzKHRtcEZvbGRlciwgc2VsZik6IG51bWJlciB7CisgICAgICAgICAgICBsZXQgdG90YWw6IG51bWJlciA9IDA7CisgICAgICAgICAgICBpZiAodG1wRm9sZGVyLmRpc3QgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgIGxldCBkaXN0cmlidXRpb25zID0gdG1wRm9sZGVyLmRpc3Quc3BsaXQoJywnKTsKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zLmZvckVhY2goKGl0ZW06YW55KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBzZWxmLmdldEVudGl0aWVzQnlTdGF0ZURpc3QodG1wRm9sZGVyLnN0YXRlLCBpdGVtKS5sZW5ndGg7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgc2VsZi5nZXRFbnRpdGllc0J5U3RhdGVEaXN0KHRtcEZvbGRlci5zdGF0ZSwgdG1wRm9sZGVyLmRpc3QpLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgX3NldFN0YXRlcyh0bXBGb2xkZXIsIHN0YXRlcykgeworICAgICAgICAgICAgaWYgKHRtcEZvbGRlci5zdGF0ZXMgIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgIHRtcEZvbGRlci5zdGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbTphbnkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzLnB1c2goeyJzdGF0ZSI6IGl0ZW0uc3RhdGUsICJkaXN0IjogaXRlbS5kaXN0fSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXRlcy5wdXNoKHsic3RhdGUiOiB0bXBGb2xkZXIuc3RhdGUsICJkaXN0IjogdG1wRm9sZGVyLmRpc3R9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdEVudGl0aWVzID0gKHJlbG9hZDpib29sZWFuKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHJlbG9hZDsKKyAgICAgICAgICAgIHRoaXMuZW50aXR5U2VydmljZS5nZXRBbGxDb21wb25lbnRzKCkudGhlbigKKyAgICAgICAgICAgICAgICAoY29tcG9uZW50czogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PikgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnRzID0gY29tcG9uZW50czsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBnZXRFbnRpdGllc0J5U3RhdGVEaXN0ID0gKHN0YXRlOiBzdHJpbmcsIGRpc3Q6IHN0cmluZykgOiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+ID0+IHsKKyAgICAgICAgICAgIGxldCBnT2JqOkFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD47CisgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzICYmIChzdGF0ZSB8fCBkaXN0KSkgeworICAgICAgICAgICAgICAgIGdPYmogPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGZ1bmN0aW9uIChvYmo6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0ICE9PSB1bmRlZmluZWQgJiYgb2JqLmRpc3RyaWJ1dGlvblN0YXR1cyA9PT0gZGlzdCAmJiBvYmoubGlmZWN5Y2xlU3RhdGUgPT09IHN0YXRlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3QgPT09IHVuZGVmaW5lZCAmJiBvYmoubGlmZWN5Y2xlU3RhdGUgPT09IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdPYmogPSBbXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnT2JqOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9kYXNoYm9hcmQvZGFzaGJvYXJkLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2Rhc2hib2FyZC12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlZjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2Rhc2hib2FyZC12aWV3Lmh0bWwKQEAgLTAsMCArMSwxMDYgQEAKKzxkaXYgY2xhc3M9InNkYy1jYXRhbG9nLWNvbnRhaW5lciI+CisgICAgPGxvYWRlciBkYXRhLWRpc3BsYXk9ImlzTG9hZGluZyI+PC9sb2FkZXI+CisKKyAgICA8IS0tIEhFQURFUiAtLT4KKzwhLS0KKyAgICA8ZWNvbXAtaGVhZGVyIG1lbnUtZGF0YT0ibWVudUl0ZW1zIiB2ZXJzaW9uPSJ7e3ZlcnNpb259fSI+PC9lY29tcC1oZWFkZXI+CistLT4KKworICAgIDxkaXYgY2xhc3M9Inctc2RjLW1haW4tY29udGFpbmVyIj4KKworICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0idy1zZGMtbWFpbi1yaWdodC1jb250YWluZXIiPgorCisgICAgICAgICAgICA8IS0tIEFERCBDb21wb25lbnQgLS0+CisgICAgICAgICAgICA8ZGl2IG5nLWlmPSJ1c2VyLnJvbGUgPT09ICdERVNJR05FUicgfHwgdXNlci5yb2xlID09PSAnUFJPRFVDVF9NQU5BR0VSJyIgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLW5ldyIKKyAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb3VzZWxlYXZlPSJkaXNwbGF5QWN0aW9ucyA9IGZhbHNlIgorICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vdXNlb3Zlcj0iZGlzcGxheUFjdGlvbnMgPSB0cnVlIgorICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9ImRpc3BsYXlBY3Rpb25zID0gZmFsc2UiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLW5ldy1jb250ZW50IiBkYXRhLXRlc3RzLWlkPSJBZGRCdXR0b25zQXJlYSI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLW5ldy1jb250ZW50LXBsdXMiIGRhdGEtbmctc2hvdz0iIWRpc3BsYXlBY3Rpb25zIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLWRhc2hib2FyZC1jcmVhdGUtZWxlbWVudC1jb250YWluZXIiIGRhdGEtbmctc2hvdz0iZGlzcGxheUFjdGlvbnMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLW5nLWlmPSJyb2xlc1t1c2VyLnJvbGVdLmRhc2hib2FyZC5zaG93Q3JlYXRlTmV3UHJvZHVjdCIgY2xhc3M9InRsdi1idG4gb3V0bGluZSBibHVlIiBkYXRhLW5nLWNsaWNrPSJvcGVuQ3JlYXRlTW9kYWwoJ1BST0RVQ1QnKSI+Q3JlYXRlIFByb2R1Y3Q8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1uZy1pZj0icm9sZXNbdXNlci5yb2xlXS5kYXNoYm9hcmQuc2hvd0NyZWF0ZU5ldyIgZGF0YS10ZXN0cy1pZD0iY3JlYXRlUmVzb3VyY2VCdXR0b24iIGNsYXNzPSJ0bHYtYnRuIG91dGxpbmUgYmx1ZSIgZGF0YS1uZy1jbGljaz0ib3BlbkNyZWF0ZU1vZGFsKCdSRVNPVVJDRScpIj5BZGQgVkY8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1uZy1pZj0icm9sZXNbdXNlci5yb2xlXS5kYXNoYm9hcmQuc2hvd0NyZWF0ZU5ldyIgZGF0YS10ZXN0cy1pZD0iY3JlYXRlU2VydmljZUJ1dHRvbiIgY2xhc3M9InRsdi1idG4gb3V0bGluZSBibHVlIiBkYXRhLW5nLWNsaWNrPSJvcGVuQ3JlYXRlTW9kYWwoJ1NFUlZJQ0UnKSI+QWRkIFNlcnZpY2U8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPCEtLSBJbXBvcnQgQ29tcG9uZW50IC0tPgorICAgICAgICAgICAgPGRpdiBuZy1pZj0idXNlci5yb2xlID09PSAnREVTSUdORVInIiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtbmV3IgorICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vdXNlbGVhdmU9ImRpc3BsYXlBY3Rpb25zID0gZmFsc2UiCisgICAgICAgICAgICAgICAgIGRhdGEtbmctbW91c2VvdmVyPSJkaXNwbGF5QWN0aW9ucyA9IHRydWUiCisgICAgICAgICAgICAgICAgIGRhdGEtbmctaW5pdD0iZGlzcGxheUFjdGlvbnMgPSBmYWxzZSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtbmV3LWNvbnRlbnQiIGRhdGEtdGVzdHMtaWQ9ImltcG9ydEJ1dHRvbnNBcmVhIiAgPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1pbXBvcnQtY29udGVudC1wbHVzIiBkYXRhLW5nLXNob3c9IiFkaXNwbGF5QWN0aW9ucyI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNkYy1kYXNoYm9hcmQtaW1wb3J0LWVsZW1lbnQtY29udGFpbmVyIiBkYXRhLW5nLXNob3c9ImRpc3BsYXlBY3Rpb25zIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0icm9sZXNbdXNlci5yb2xlXS5kYXNoYm9hcmQuc2hvd0NyZWF0ZU5ldyIgY2xhc3M9InRsdi1idG4gb3V0bGluZSBibHVlIj5JbXBvcnQgVkZDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGUtb3BlbmVyIG9uLWZpbGUtdXBsb2FkPSJvbkltcG9ydFZmYyhmaWxlKSIgZGF0YS10ZXN0cy1pZD0iaW1wb3J0VkZDYnV0dG9uIiBleHRlbnNpb25zPSJ7e3NkY0NvbmZpZy50b3NjYUZpbGVFeHRlbnNpb259fSIgZGF0YS1uZy1jbGljaz0iZGlzcGxheUFjdGlvbnM9ZmFsc2UiPjwvZmlsZS1vcGVuZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0icm9sZXNbdXNlci5yb2xlXS5kYXNoYm9hcmQuc2hvd0NyZWF0ZU5ldyIgY2xhc3M9InRsdi1idG4gb3V0bGluZSBibHVlIiBkYXRhLW5nLWNsaWNrPSJub3RpZmljYXRpb25JY29uQ2FsbGJhY2soKSI+SW1wb3J0IFZTUDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJyb2xlc1t1c2VyLnJvbGVdLmRhc2hib2FyZC5zaG93Q3JlYXRlTmV3IiBjbGFzcz0idGx2LWJ0biBvdXRsaW5lIGJsdWUgaW1wb3J0LWRjYWUiPkltcG9ydCBEQ0FFIGFzc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGUtb3BlbmVyIG9uLWZpbGUtdXBsb2FkPSJvbkltcG9ydFZmKGZpbGUpIiBkYXRhLXRlc3RzLWlkPSJpbXBvcnRWRmJ1dHRvbiIgZXh0ZW5zaW9ucz0ie3tzZGNDb25maWcuY3NhckZpbGVFeHRlbnNpb259fSIgZGF0YS1uZy1jbGljaz0iZGlzcGxheUFjdGlvbnM9ZmFsc2UiPjwvZmlsZS1vcGVuZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGRpdgorICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc2RjLWhpZGUtcG9wb3Zlcic6IGhpZGVQb3BvdmVyLCdyZXNvdXJjZScgOiBjb21wb25lbnQuaXNSZXNvdXJjZSgpLCdzZXJ2aWNlJyA6IGNvbXBvbmVudC5pc1NlcnZpY2UoKX0iCisgICAgICAgICAgICAgICAgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkIgorICAgICAgICAgICAgICAgIGRhdGEtbmctcmVwZWF0PSJjb21wb25lbnQgaW4gY29tcG9uZW50cyB8IGVudGl0eUZpbHRlcjpjaGVja2JveGVzRmlsdGVyIHwgZmlsdGVyOnNlYXJjaCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtYm9keSIgZGF0YS10ZXN0cy1pZD0iZGFzaGJvYXJkLUVsZW1lbnRzIiBkYXRhLW5nLWNsaWNrPSJnb1RvQ29tcG9uZW50KGNvbXBvbmVudCkiPgorICAgICAgICAgICAgICAgICAgICA8IS0tPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtZGVzY3JpcHRpb24iPnt7ZW50aXR5LmRlc2NyaXB0aW9ufX08L2Rpdj4tLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtYXZhdGFyIj48c3BhbiBkYXRhLXRlc3RzLWlkPSJhc3NldC10eXBlIiBjbGFzcz0ie3tjb21wb25lbnQuZ2V0Q29tcG9uZW50U3ViVHlwZSgpfX0iPjwvc3Bhbj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLTxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQiIGRhdGEtbmctY2xhc3M9ImNvbXBvbmVudC5saWZlY3ljbGVTdGF0ZSIgZGF0YS10ZXN0cy1pZD0ie3tjb21wb25lbnQubGlmZWN5Y2xlU3RhdGV9fSI+PC9kaXY+LS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLXNjaGVtYS1pbWFnZSB7e2NvbXBvbmVudC5pY29uU3ByaXRlfX0ge3tjb21wb25lbnQuaWNvbn19IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insnc3ByaXRlLXJlc291cmNlLWljb25zJzogY29tcG9uZW50LmlzUmVzb3VyY2UoKSwgJ3Nwcml0ZS1zZXJ2aWNlcy1pY29ucyc6IGNvbXBvbmVudC5pc1NlcnZpY2UoKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3tjb21wb25lbnQubmFtZX19Ij48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1uYW1lLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLWluZm8tbmFtZSIgdG9vbHRpcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLWNvbnRlbnQ9Int7Y29tcG9uZW50Lm5hbWUgfCByZXNvdXJjZU5hbWV9fSI+IHt7Y29tcG9uZW50Lm5hbWUgfCByZXNvdXJjZU5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtZm9vdGVyIj4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1pbmZvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRhc2hib2FyZC1jYXJkLWluZm8tbGlmZWN5Y2xlU3RhdGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1pbmZvLWxpZmVjeWNsZVN0YXRlIiB0b29sdGlwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtY29udGVudD0ie3tjb21wb25lbnQuZ2V0U3RhdHVzKHNkY01lbnUpfX0iPiB7e2NvbXBvbmVudC5nZXRTdGF0dXMoc2RjTWVudSl9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby11c2VyImRhdGEtdGVzdHMtaWQ9Int7Y29tcG9uZW50Lm5hbWV9fVZlcnNpb24iPlYge3tjb21wb25lbnQudmVyc2lvbn19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8IS0tPGRpdiBjbGFzcz0idy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1saWZlY3ljbGVTdGF0ZS1pY29uIHNwcml0ZS1uZXcge3tzZGNNZW51LkxpZmVDeWNsZVN0YXR1c2VzW2NvbXBvbmVudC5saWZlY3ljbGVTdGF0ZV0uaWNvbn19Ij48L2Rpdj4tLT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisKKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtbGVmdC1zaWRlYmFyIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWxlZnQtc2lkZWJhci1pdGVtICIKKyAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXBlYXQ9ImZvbGRlciBpbiBmb2xkZXJzLmdldEZvbGRlcnMoKSIKKyAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydjYXRlZ29yeS10aXRsZSc6IGZvbGRlci5pc0dyb3VwKCksICdzZWxlY3RlZExpbmsnOiBmb2xkZXIuaXNTZWxlY3RlZCgpfSIKKyAgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctaWY9ImZvbGRlci5pc0dyb3VwKCkiPnt7Zm9sZGVyLnRleHR9fTwvc3Bhbj4KKworICAgICAgICAgICAgICAgIDxzZGMtY2hlY2tib3ggZGF0YS1uZy1pZj0iIWZvbGRlci5pc0dyb3VwKCkgJiYgIWZvbGRlci5kaXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS1pZD0iY2hlY2tib3gte3tmb2xkZXIudGV4dCB8IGxvd2VyY2FzZSB8IGNsZWFyV2hpdGVTcGFjZXN9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtbW9kZWw9ImNoZWNrYm94ZXNGaWx0ZXIuc2VsZWN0ZWRTdGF0dXNlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtdmFsdWU9ImZvbGRlci5zdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Int7Zm9sZGVyLnRleHR9fSI+PC9zZGMtY2hlY2tib3g+CisKKyAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94IGRhdGEtbmctaWY9IiFmb2xkZXIuaXNHcm91cCgpICYmIGZvbGRlci5kaXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS1pZD0iY2hlY2tib3gte3tmb2xkZXIudGV4dCB8IGxvd2VyY2FzZSB8IGNsZWFyV2hpdGVTcGFjZXN9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtbW9kZWw9ImNoZWNrYm94ZXNGaWx0ZXIuZGlzdHJpYnV0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGMtY2hlY2tsaXN0LXZhbHVlPSJmb2xkZXIuZGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Int7Zm9sZGVyLnRleHR9fSI+PC9zZGMtY2hlY2tib3g+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWxlZnQtc2lkZWJhci1pdGVtLXN0YXRlLWNvdW50Ij57e2VudGl0aWVzQ291bnQoZm9sZGVyKX19PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorCisgICAgPC9kaXY+CisKKyAgICA8dG9wLW5hdiB0b3AtbHZsLXNlbGVjdGVkLWluZGV4PSIwIiB2ZXJzaW9uPSJ7e3ZlcnNpb259fSIgc2VhcmNoLWJpbmQ9InNlYXJjaC5maWx0ZXJUZXJtIiBub3RpZmljYXRpb24taWNvbi1jYWxsYmFjaz0ibm90aWZpY2F0aW9uSWNvbkNhbGxiYWNrIiB2ZXJzaW9uPSJ7e3ZlcnNpb259fSI+PC90b3AtbmF2PgorCis8L2Rpdj4KKzxkaXYgZGF0YS11aS12aWV3PSIiPjwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9kYXNoYm9hcmQvZGFzaGJvYXJkLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Rhc2hib2FyZC9kYXNoYm9hcmQubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI1MjIxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9kYXNoYm9hcmQvZGFzaGJvYXJkLmxlc3MKQEAgLTAsMCArMSw0MjAgQEAKKy5zZGMtZGFzaGJvYXJkLWNvbnRhaW5lciB7CisgICAgLnRsdi1sb2FkZXIgeworICAgICAgICB0b3A6IC0xMTBweDsKKyAgICAgICAgbGVmdDogODBweDsKKyAgICB9CisgICAgLnNkYy1oaWRlLXBvcG92ZXIgeworICAgICAgICAucG9wb3ZlciB7CisgICAgICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy53LXNkYy1sZWZ0LXNpZGViYXItbmF2IHsKKyAgICBtYXJnaW4tdG9wOiA0NnB4OworfQorCisudy1zZGMtbWFpbi1yaWdodC1jb250YWluZXItZWxlbWVudCB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgaGVpZ2h0OiAyMTdweDsKKyAgICB3aWR0aDogMjE3cHg7CisgICAgbWFyZ2luOiAxMHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworLnctc2RjLW1haW4tcmlnaHQtY29udGFpbmVyLWVsZW1lbnQtZGV0YWlscy1jb250YWluZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDE2NXB4OworICAgIGxlZnQ6IDUwcHg7Cit9CisKKy53LXNkYy1tYWluLXJpZ2h0LWNvbnRhaW5lci1lbGVtZW50LW5hbWUgeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisudy1zZGMtbWFpbi1yaWdodC1jb250YWluZXItZWxlbWVudC1vd25lciB7CisKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vQ2FyZHMvLy8vLy8vLy8vLy8vLy8vLy8vLworLnctc2RjLWRhc2hib2FyZC1jYXJkLW5ldyB7CisgICAgYm9yZGVyOiAycHggZGFzaGVkIEBjb2xvcl9tOworICAgIC5ib3JkZXItcmFkaXVzKDJweCk7CisgICAgY3Vyc29yOiBwb2ludGVyOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBoZWlnaHQ6IDIwMHB4OworICAgIG1hcmdpbjogOXB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIHdpZHRoOiAyMDRweDsKK30KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLW5ldy1jb250ZW50IHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgICBoZWlnaHQ6IDEwMCU7Cit9CisKKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1uZXctY29udGVudC1wbHVzIHsKKyAgICAuc3ByaXRlLW5ldzsKKyAgICAuYWRkLWljb247CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CisKKyAgICAmOmFmdGVyIHsKKyAgICAgICAgLm5fMTRfbTsKKyAgICAgICAgY29udGVudDogJ0FERCc7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAyNXB4OworICAgICAgICBsZWZ0OiAtM3B4OworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogLTUwJTsKKyAgICB9Cit9CisKKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1pbXBvcnQtY29udGVudC1wbHVzIHsKKyAgICAuc3ByaXRlLW5ldzsKKyAgICAuaW1wb3J0LWljb247CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CisKKyAgICAmOmFmdGVyIHsKKyAgICAgICAgLm5fMTRfbTsKKyAgICAgICAgY29udGVudDogJ0lNUE9SVCc7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAyNXB4OworICAgICAgICBsZWZ0OiAtMTZweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IC01MCU7CisgICAgfQorfQorCisuc2RjLWRhc2hib2FyZC1jcmVhdGUtZWxlbWVudC1jb250YWluZXIsCisuc2RjLWRhc2hib2FyZC1pbXBvcnQtZWxlbWVudC1jb250YWluZXIgeworCisgICAgd2lkdGg6IDE0MHB4OworCisgICAgLnRsdi1idG4uaW1wb3J0LWRjYWUgeworICAgICAgICBwYWRkaW5nOiAwOworICAgIH0KKworICAgIC50bHYtYnRuIHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKworICAgICAgICAmOmxhc3QtY2hpbGQgeworICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlucHV0W3R5cGU9ImZpbGUiXSB7CisgICAgICAgIGN1cnNvcjogaW5oZXJpdDsKKyAgICAgICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTApOworICAgICAgICBvcGFjaXR5OiAwOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMDsKKyAgICAgICAgbGVmdDogMDsKKyAgICAgICAgd2lkdGg6IDEzOHB4OworICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgfQorfQorCisudy1zZGMtZGFzaGJvYXJkLWNhcmQgeworICAgIHdpZHRoOiAyMDRweDsKKyAgICBoZWlnaHQ6IDIwMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICBAbWFpbl9jb2xvcl9wOworICAgIC5ib3JkZXItcmFkaXVzKDJweCk7CisgICAgLmJveC1zaGFkb3coMHB4IDJweCAycHggMHB4IHJnYmEoMjQsIDI0LCAyNSwgMC4wNSkpOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBtYXJnaW46IDEwcHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW5fY29sb3JfcDsKKworICAgICY6aG92ZXIgeworICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbl9jb2xvcl9vOworICAgICAgICAuYm94LXNoYWRvdygzcHggM3B4IDJweCAwcHggcmdiYSgyNCwgMjQsIDI1LCAwLjA1KSk7CisgICAgfQorCisgICAgJjphY3RpdmUgeworICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbl9jb2xvcl9jOworICAgICAgICAuYm94LXNoYWRvdygzcHggM3B4IDJweCAwcHggcmdiYSgyNCwgMjQsIDI1LCAwLjA1KSk7CisgICAgfQorfQorCisudy1zZGMtZGFzaGJvYXJkLWNhcmQtYm9keSB7CisgICAgLmhhbmQ7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBjb2xvcl9qOworICAgIGhlaWdodDogMTU1cHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLWRlc2NyaXB0aW9uIHsKKyAgICAuY18zOworICAgIC5oYW5kOworICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTcsIDczLCA4NCwgMC45KTsKKyAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDsKKyAgICBib3R0b206IDA7CisgICAgbGVmdDogMDsKKyAgICBvcGFjaXR5OiAwOworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAwOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgdG9wOiAwOworICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICB6LWluZGV4OiA0OworICAgIG1pbi1oZWlnaHQ6IDEwMHB4OworICAgIG92ZXJmbG93OiBoaWRkZW47Cit9CisKKworLnctc2RjLWRhc2hib2FyZC1jYXJkLXNjaGVtYSB7CisgICAgbWFyZ2luLXRvcDogMzBweDsKK30KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQgeworICAgIC5oYW5kOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICByaWdodDogMTNweDsKKyAgICB0b3A6IDE1cHg7CisgICAgei1pbmRleDogMjsKK30KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLWZvb3RlciB7CisgICAgcGFkZGluZzogM3B4IDEycHggMTBweCAxMnB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLWF2YXRhciB7CisgICAgLnVwcGVyY2FzZTsKKyAgICBib3JkZXItcmFkaXVzOiA1MCU7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBsZWZ0OiAtNnB4OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICB0b3A6IC02cHg7CisKKyAgICBzcGFuIHsKKworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9wOworICAgICAgICAuYm9yZGVyLXJhZGl1cygxNXB4KTsKKyAgICAgICAgY29sb3I6IEBjb2xvcl9jOworICAgICAgICBjb250ZW50OiAnJzsKKyAgICAgICAgaGVpZ2h0OiAzMHB4OworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICBib3JkZXI6IHNvbGlkIDJweCAjRUNFRkYzOworICAgICAgICBwYWRkaW5nOiAzcHggMTBweCAycHggMTBweDsKKworICAgICAgICAmLlZGIHsKKyAgICAgICAgICAgIC5qXzE0X207CisgICAgICAgICAgICAmOjpiZWZvcmUgeworICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdWRic7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAmLlZGQyB7CisgICAgICAgICAgICAual8xNF9tOworICAgICAgICAgICAgJjo6YmVmb3JlIHsKKyAgICAgICAgICAgICAgICBjb250ZW50OiAnVkZDJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICYuQ1AgeworICAgICAgICAgICAgLmpfMTRfbTsKKyAgICAgICAgICAgICY6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgY29udGVudDogJ0NQJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICYuVkwgeworICAgICAgICAgICAgLmpfMTRfbTsKKyAgICAgICAgICAgICY6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgY29udGVudDogJ1ZMJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICYuU0VSVklDRSB7CisgICAgICAgICAgICAuY18xNF9tOworICAgICAgICAgICAgJjo6YmVmb3JlIHsKKyAgICAgICAgICAgICAgICBjb250ZW50OiAnUyc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAmLlBST0RVQ1QgeworICAgICAgICAgICAgLmJfMTRfbTsKKyAgICAgICAgICAgICY6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgY29udGVudDogJ1AnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJi5ncmVlbiB7CisgICAgICAgICAgICAuZF8xMjsKKyAgICAgICAgICAgICY6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgY29udGVudDogJ1InOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICYucmVkIHsKKyAgICAgICAgICAgIC5yXzEyOworICAgICAgICAgICAgJjo6YmVmb3JlIHsKKyAgICAgICAgICAgICAgICBjb250ZW50OiAnUyc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJi5kYmxhY2sgeworICAgICAgICAgICAgLnNfMTI7CisgICAgICAgICAgICAmOjpiZWZvcmUgeworICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdQJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLWluZm8geworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIG1heC13aWR0aDogMTY1cHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisudy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1uYW1lLWNvbnRhaW5lcnsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgYm90dG9tOiAwOworICAgIGxlZnQ6IDA7CisgICAgbWFyZ2luOiAwIDAgMnB4IDEwcHg7Cit9Cisudy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1uYW1lIHsKKyAgICAubV8xNF9tOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIG1heC13aWR0aDogMTY1cHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisudy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1saWZlY3ljbGVTdGF0ZSB7CisgICAgLm1fMTNfbTsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICBtYXgtd2lkdGg6IDE2NXB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLWluZm8tdXNlciB7CisgICAgLm5fMTNfcjsKKyAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgd2lkdGg6IDEwMCU7Cit9CisKKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1tZW51LWJ1dHRvbiB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHBhZGRpbmc6IDEycHggMCAwIDEwcHg7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAxMnB4OworICAgIHRvcDogOHB4OworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggQGNvbG9yX2s7CisgICAgaGVpZ2h0OiA0MnB4OworCisgICAgJjpob3ZlciB7CisgICAgICAgIC53LXNkYy1kYXNoYm9hcmQtY2FyZC1tZW51IHsKKyAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICB9CisgICAgfQorfQorCisudy1zZGMtZGFzaGJvYXJkLWNhcmQtbWVudSB7CisgICAgLmJnX2M7CisgICAgYm9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7CisgICAgYm9yZGVyLXRvcDogM3B4IHNvbGlkIEBjb2xvcl9hOworICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpOworICAgIGNvbG9yOiBAY29sb3JfczsKKyAgICBkaXNwbGF5OiBub25lOworICAgIG1pbi1oZWlnaHQ6IDMwcHg7CisgICAgcGFkZGluZzogOXB4IDA7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAtMjdweDsKKyAgICB3aWR0aDogMjA4cHg7CisgICAgei1pbmRleDogOTsKKyAgICBtYXgtaGVpZ2h0OiAxNjRweDsKKworICAgICY6OmJlZm9yZSB7CisgICAgICAgIC8vVE9ETzogTWlzc2luZyBpbWFnZSBmb3Igc21hbGwgYmx1ZSB0cmlhbmdsZS4KKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUZDQVlBQUFCNGthMVZBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1ERTBJRGM1TGpFMU5qYzVOeXdnTWpBeE5DOHdPQzh5TUMwd09UbzFNem93TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFFnS0ZkcGJtUnZkM01wSWlCNGJYQk5UVHBKYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tFMU9USXpOREkxTUVORlFqRXhSVFU0T0RSRVJUSTFNRE0yUkVaQ09VWXpJaUI0YlhCTlRUcEViMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa0UxT1RJek5ESTJNRU5GUWpFeFJUVTRPRFJFUlRJMU1ETTJSRVpDT1VZeklqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRVFU1TWpNME1qTXdRMFZDTVRGRk5UZzRORVJGTWpVd016WkVSa0k1UmpNaUlITjBVbVZtT21SdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlFUVTVNak0wTWpRd1EwVkNNVEZGTlRnNE5FUkZNalV3TXpaRVJrSTVSak1pTHo0Z1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0lEd3ZjbVJtT2xKRVJqNGdQQzk0T25odGNHMWxkR0UrSUR3L2VIQmhZMnRsZENCbGJtUTlJbklpUHo0Z0JYVGxBQUFBT0VsRVFWUjQybUswcnA3TmdBU01nWmdGaUUvQ0JKalFKUGNBOFU0Z05rZFhBSk1VQUdKK1pFVk1hSkl3QUZmRWhFVVNSUkZBZ0FFQVZ0Z0p5aUxBUFdBQUFBQUFTVVZPUks1Q1lJST0nKTsKKyAgICAgICAgY29udGVudDogJyc7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICBoZWlnaHQ6IDIxcHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgcmlnaHQ6IDI0cHg7CisgICAgICAgIHRvcDogLTI0cHg7CisgICAgICAgIHdpZHRoOiAxODRweDsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTc1cHggMTZweDsKKyAgICB9Cit9CisKKy5pLXNkYy1kYXNoYm9hcmQtY2FyZC1tZW51LWl0ZW0geworICAgIC5oYW5kOworICAgIGxpbmUtaGVpZ2h0OiAyNHB4OworICAgIHBhZGRpbmc6IDAgMTBweDsKKyAgICAmOmhvdmVyIHsgLmFfNzsgfQorfQorCisudy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1saWZlY3ljbGVTdGF0ZS1pY29ueworICAgIHBvc2l0aW9uOmFic29sdXRlOworICAgIGJvdHRvbToxOHB4OworICAgIHJpZ2h0OjEwcHg7Cit9CisKKy8vIFNhbWUgZm9yIGRhc2hib2FyZCBhbmQgY2F0YWxvZyB2aWV3LgorLnctc2RjLWRhc2hib2FyZC1jYXJkLXNjaGVtYS1pbWFnZSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNDElOworCisgICAgLy9UT0RPOiBJc3JhZWwgLSByZW1vdmUgdGhpcyBhZnRlciBnZXR0aW5nIHRoZSBzZXJ2aWNlcyBzcHJpdGUuCisgICAgaGVpZ2h0OiA0NXB4OworICAgIHdpZHRoOiA1M3B4OworICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisKKyAgICAvLyBDZW50ZXIgdGhlIGljb24gdmVydGljYWwgYW5kIGhvcml6b250YWwuCisgICAgbWFyZ2luOiBhdXRvOworICAgIGxlZnQ6IDA7CisgICAgcmlnaHQ6IDA7CisgICAgdG9wOiAtMTBweDsKKyAgICBib3R0b206IDA7Cit9CisKKy8qIGRhc2hib2FyZCBjYXJkIG1haW4gaWNvbnMgKi8KKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1zY2hlbWEtaW1hZ2Uuc2VydmljZSAgICAgIHsgLnMtc2RjLXNlcnZpY2UgfQorLnctc2RjLWRhc2hib2FyZC1jYXJkLXNjaGVtYS1pbWFnZS5yZXNvdXJjZSAgICAgeyAucy1zZGMtcmVzb3VyY2UgfQorCisvKiBkYXNoYm9hcmQgY2FyZCBzdGF0dXNlcyBpY29ucyAqLworLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuTk9UX0NFUlRJRklFRF9DSEVDS0lOICAgICAgICB7IC5zcHJpdGU7IC5zLXNkYy1zdGF0ZS5OT1RfQ0VSVElGSUVEX0NIRUNLSU47IH0KKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1lZGl0Lk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQgICAgICAgeyAuc3ByaXRlOyAucy1zZGMtc3RhdGUuTk9UX0NFUlRJRklFRF9DSEVDS09VVDsgfQorLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuQ0VSVElGSUVEICAgICAgICAgICAgICAgICAgICB7IC5zcHJpdGU7IC5zLXNkYy1zdGF0ZS5DRVJUSUZJRUQ7IH0KKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1lZGl0LlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OICAgICAgeyAuc3ByaXRlOyAucy1zZGMtc3RhdGUuUkVBRFlfRk9SX0NFUlRJRklDQVRJT047IH0KKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1lZGl0LkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MgICAgeyAuc3ByaXRlOyAucy1zZGMtc3RhdGUuQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUzsgfQorLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuRElTVFJJQlVURUQgICAgICAgICAgICAgICAgICB7IC5zcHJpdGU7IC5zLXNkYy1zdGF0ZS5ESVNUUklCVVRFRDsgfQorCisudy1zZGMtZGFzaGJvYXJkLWNhcmQtYXZhdGFyLmdyZWVuICsgLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuTk9UX0NFUlRJRklFRF9DSEVDS0lOICAgeyAuc3ByaXRlOyAucy1zZGMtc3RhdGUuTk9UX0NFUlRJRklFRF9DSEVDS0lOLmdyZWVuOyB9Cisudy1zZGMtZGFzaGJvYXJkLWNhcmQtYXZhdGFyLmdyZWVuICsgLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuTk9UX0NFUlRJRklFRF9DSEVDS09VVCAgeyAuc3ByaXRlOyAucy1zZGMtc3RhdGUuTk9UX0NFUlRJRklFRF9DSEVDS09VVC5ncmVlbjsgfQorLnctc2RjLWRhc2hib2FyZC1jYXJkLWF2YXRhci5ncmVlbiArIC53LXNkYy1kYXNoYm9hcmQtY2FyZC1lZGl0LkNFUlRJRklFRCAgICAgICAgICAgICAgIHsgLnNwcml0ZTsgLnMtc2RjLXN0YXRlLkNFUlRJRklFRC5ncmVlbjsgfQorLnctc2RjLWRhc2hib2FyZC1jYXJkLWF2YXRhci5ncmVlbiArIC53LXNkYy1kYXNoYm9hcmQtY2FyZC1lZGl0LlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIHsgLnNwcml0ZTsgLnMtc2RjLXN0YXRlLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OLmdyZWVuOyB9Cisudy1zZGMtZGFzaGJvYXJkLWNhcmQtYXZhdGFyLmdyZWVuICsgLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyB7IC5zcHJpdGU7IC5zLXNkYy1zdGF0ZS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTLmdyZWVuOyB9Cisudy1zZGMtZGFzaGJvYXJkLWNhcmQtYXZhdGFyLmdyZWVuICsgLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuRElTVFJJQlVURUQgICAgICAgICAgICAgeyAuc3ByaXRlOyAucy1zZGMtc3RhdGUuRElTVFJJQlVURUQuZ3JlZW47IH0KKworLnctc2RjLWRhc2hib2FyZC1jYXJkLWF2YXRhci5yZWQgKyAudy1zZGMtZGFzaGJvYXJkLWNhcmQtZWRpdC5OT1RfQ0VSVElGSUVEX0NIRUNLSU4gICAgIHsgLnNwcml0ZTsgLnMtc2RjLXN0YXRlLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTi5yZWQ7IH0KKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1hdmF0YXIucmVkICsgLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuTk9UX0NFUlRJRklFRF9DSEVDS09VVCAgICB7IC5zcHJpdGU7IC5zLXNkYy1zdGF0ZS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULnJlZDsgfQorLnctc2RjLWRhc2hib2FyZC1jYXJkLWF2YXRhci5yZWQgKyAudy1zZGMtZGFzaGJvYXJkLWNhcmQtZWRpdC5DRVJUSUZJRUQgICAgICAgICAgICAgICAgIHsgLnNwcml0ZTsgLnMtc2RjLXN0YXRlLkNFUlRJRklFRC5yZWQ7IH0KKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1hdmF0YXIucmVkICsgLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuUkVBRFlfRk9SX0NFUlRJRklDQVRJT04gICB7IC5zcHJpdGU7IC5zLXNkYy1zdGF0ZS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTi5yZWQ7IH0KKy53LXNkYy1kYXNoYm9hcmQtY2FyZC1hdmF0YXIucmVkICsgLnctc2RjLWRhc2hib2FyZC1jYXJkLWVkaXQuQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyB7IC5zcHJpdGU7IC5zLXNkYy1zdGF0ZS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTLnJlZDsgfQorLnctc2RjLWRhc2hib2FyZC1jYXJkLWF2YXRhci5yZWQgKyAudy1zZGMtZGFzaGJvYXJkLWNhcmQtZWRpdC5ESVNUUklCVVRFRCAgICAgICAgICAgICAgIHsgLnNwcml0ZTsgLnMtc2RjLXN0YXRlLkRJU1RSSUJVVEVELnJlZDsgfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9hcnRpZmFjdC1mb3JtL2FydGlmYWN0LWZvcm0tdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvYXJ0aWZhY3QtZm9ybS9hcnRpZmFjdC1mb3JtLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvYXJ0aWZhY3QtZm9ybS9hcnRpZmFjdC1mb3JtLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwzNTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+CisKK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBSZXNvdXJjZSA9IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZTsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVkaXRBcnRpZmFjdE1vZGVsIHsKKyAgICAgICAgYXJ0aWZhY3RSZXNvdXJjZTogTW9kZWxzLkFydGlmYWN0TW9kZWw7CisgICAgICAgIGFydGlmYWN0VHlwZXM6IEFycmF5PHN0cmluZz47CisgICAgICAgIGFydGlmYWN0RmlsZTogYW55OworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUFydGlmYWN0UmVzb3VyY2VGb3JtVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBmb3Jtczphbnk7CisgICAgICAgICQkY2hpbGRUYWlsOiBhbnk7CisgICAgICAgIGlzTmV3OiBib29sZWFuOworICAgICAgICBpc0xvYWRpbmc6IGJvb2xlYW47CisgICAgICAgIHZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIHVybFZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGxhYmVsVmFsaWRhdGlvblBhdHRlcm46IFJlZ0V4cDsKKyAgICAgICAgaW50ZWdlclZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBhcnRpZmFjdFR5cGU6IHN0cmluZzsKKyAgICAgICAgZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbDogSUVkaXRBcnRpZmFjdE1vZGVsOworICAgICAgICBkZWZhdWx0SGVhdFRpbWVvdXQ6IG51bWJlcjsKKyAgICAgICAgdmFsaWRFeHRlbnNpb25zOiBhbnk7CisgICAgICAgIG9yaWdpbmFsQXJ0aWZhY3ROYW1lOiBzdHJpbmc7CisgICAgICAgIGVkaXRGb3JtOiBuZy5JRm9ybUNvbnRyb2xsZXI7CisgICAgICAgIGZvb3RlckJ1dHRvbnM6IEFycmF5PGFueT47CisgICAgICAgIG1vZGFsSW5zdGFuY2VBcnRpZmFjdDpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlOworCisgICAgICAgIGZpbGVFeHRlbnNpb25zKCk6c3RyaW5nOworICAgICAgICBzYXZlKGRvTm90Q2xvc2VNb2RhbD86Ym9vbGVhbik6IHZvaWQ7CisgICAgICAgIHNhdmVBbmRBbm90aGVyKCk6IHZvaWQ7CisgICAgICAgIGNsb3NlKCk6IHZvaWQ7CisgICAgICAgIGdldE9wdGlvbnMoKTogQXJyYXk8c3RyaW5nPjsKKyAgICAgICAgaXNEZXBsb3ltZW50SGVhdCgpOiBib29sZWFuOworICAgICAgICBvbkZpbGVDaGFuZ2UoKTogdm9pZDsKKyAgICAgICAgc2V0RGVmYXVsdFRpbWVvdXQoKTogdm9pZDsKKyAgICAgICAgb3BlbkVkaXRFbnZQYXJhbWV0ZXJzTW9kYWwoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQ7CisgICAgICAgIGdldEZvcm1UaXRsZSgpOnN0cmluZzsKKyAgICAgICAgZmlsZVVwbG9hZFJlcXVpcmVkKCk6c3RyaW5nOworICAgICAgICBpc0FydGlmYWN0T3duZXIoKTpib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBcnRpZmFjdFJlc291cmNlRm9ybVZpZXdNb2RlbCB7CisKKyAgICAgICAgcHJpdmF0ZSBhcnRpZmFjdEFycjpBcnJheTxNb2RlbHMuQXJ0aWZhY3RNb2RlbD47CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRtb2RhbEluc3RhbmNlJywKKyAgICAgICAgICAgICdhcnRpZmFjdCcsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ1VybFZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdMYWJlbFZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdJbnRlZ2VyVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ0NvbW1lbnRWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnVmFsaWRhdGlvblV0aWxzJywKKyAgICAgICAgICAgICckYmFzZTY0JywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJ0FydGlmYWN0c1V0aWxzJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICdjb21wb25lbnQnCisgICAgICAgIF07CisKKyAgICAgICAgcHJpdmF0ZSBmb3JtU3RhdGU6VXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZTsKKyAgICAgICAgcHJpdmF0ZSBlbnRpdHlJZDpzdHJpbmc7CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUFydGlmYWN0UmVzb3VyY2VGb3JtVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBVcmxWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTGFiZWxWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgSW50ZWdlclZhbGlkYXRpb25QYXR0ZXJuIDogUmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25VdGlsczogU2RjLlV0aWxzLlZhbGlkYXRpb25VdGlscywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkYmFzZTY0OmFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGU6YW55LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGFydGlmYWN0c1V0aWxzOlNkYy5VdGlscy5BcnRpZmFjdHNVdGlscywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpIHsKKworCisgICAgICAgICAgICB0aGlzLmVudGl0eUlkID0gdGhpcy5jb21wb25lbnQudW5pcXVlSWQ7CisgICAgICAgICAgICB0aGlzLmFydGlmYWN0QXJyID0gW107CisgICAgICAgICAgICB0aGlzLmZvcm1TdGF0ZSA9IGFuZ3VsYXIuaXNEZWZpbmVkKGFydGlmYWN0LmFydGlmYWN0TGFiZWwpID8gVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZS5VUERBVEUgOiBVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlLkNSRUFURTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRFbnRpdHkgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZSA9IHRoaXMuYXJ0aWZhY3Q7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5vcmlnaW5hbEFydGlmYWN0TmFtZSA9IHRoaXMuYXJ0aWZhY3QuYXJ0aWZhY3ROYW1lOworICAgICAgICB9OworCisKKyAgICAgICAgcHJpdmF0ZSBpbml0Rm9vdGVyQnV0dG9ucyA9ICgpOnZvaWQgPT57CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvb3RlckJ1dHRvbnMgPSBbCisgICAgICAgICAgICAgICAgeyduYW1lJzogJ0RvbmUnLCAnY3NzJzogJ2JsdWUnLCAnY2FsbGJhY2snOiB0aGlzLiRzY29wZS5zYXZlfQorICAgICAgICAgICAgXTsKKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5pc05ldyl7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9ucy5wdXNoKCB7J25hbWUnOiAnQWRkIEFub3RoZXInLCAnY3NzJzogJ2dyZXknLCAnZGlzYWJsZWQnOiAhdGhpcy4kc2NvcGUuaXNOZXcgJiYgJ2RlcGxveW1lbnQnID09PSB0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUsICdjYWxsYmFjayc6IHRoaXMuJHNjb3BlLnNhdmVBbmRBbm90aGVyfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworCisgICAgICAgIHByaXZhdGUgaW5pdEFydGlmYWN0VHlwZXMgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgbGV0IGFydGlmYWN0VHlwZXM6YW55ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdVSUNvbmZpZ3VyYXRpb24nKTsKKworICAgICAgICAgICAgaWYoJ2RlcGxveW1lbnQnID09PSB0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUpIHsKKworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9ucyA9ICgnSEVBVF9FTlYnID09IHRoaXMuYXJ0aWZhY3QuYXJ0aWZhY3RUeXBlfHx0aGlzLmNvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlKT8vL3RvIHJlbW92ZSB0aGUgZmlyc3QgY29uZGl0aW9uPworICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdFR5cGVzLmFydGlmYWN0cy5kZXBsb3ltZW50LnJlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzCisgICAgICAgICAgICAgICAgICAgIDogdGhpcy5jb21wb25lbnQuaXNSZXNvdXJjZSgpID8gYXJ0aWZhY3RUeXBlcy5hcnRpZmFjdHMuZGVwbG95bWVudC5yZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMKKyAgICAgICAgICAgICAgICAgICAgOiBhcnRpZmFjdFR5cGVzLmFydGlmYWN0cy5kZXBsb3ltZW50LnNlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3RzOworCisgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUudmFsaWRFeHRlbnNpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RUeXBlcyA9IE9iamVjdC5rZXlzKHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9ucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlZmF1bHRIZWF0VGltZW91dCA9IGFydGlmYWN0VHlwZXMuZGVmYXVsdEhlYXRUaW1lb3V0OworICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmlzTmV3KSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBpc0hlYXQ9J0hFQVRfRU5WJyA9PSB0aGlzLmFydGlmYWN0LmFydGlmYWN0VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgXy5yZW1vdmUodGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFR5cGVzLCAoaXRlbTpzdHJpbmcpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdIRUFUJyA9PSBpdGVtLnN1YnN0cmluZygwLDQpfHwoIWlzSGVhdCAmJiBpdGVtID09ICJWRl9NT0RVTEVTX01FVEFEQVRBIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmhhcyhVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRISVJEX1BBUlRZX1JFU0VSVkVEX1RZUEVTLCBpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9aWYgKHRoaXMuJHNjb3BlLmFydGlmYWN0VHlwZSA9PT0gJ25vcm1hbCcpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0VHlwZXMgPSBhcnRpZmFjdFR5cGVzLmFydGlmYWN0cy5vdGhlci5tYXAoKGVsZW1lbnQ6YW55KT0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQubmFtZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBfLnJlbW92ZSh0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0VHlwZXMsIChpdGVtOnN0cmluZyk9PiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmhhcyhVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRISVJEX1BBUlRZX1JFU0VSVkVEX1RZUEVTLCBpdGVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5oYXMoVXRpbHMuQ29uc3RhbnRzLkFydGlmYWN0VHlwZS5UT1NDQSwgaXRlbSk7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodGhpcy5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmICAgKDxSZXNvdXJjZT50aGlzLmNvbXBvbmVudCkuaXNDc2FyQ29tcG9uZW50KCkpIHsKKyAgICAgICAgICAgICAgICBfLnJlbW92ZSh0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0VHlwZXMsIChpdGVtOnN0cmluZykgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcnRpZmFjdHNVdGlscy5pc0xpY2Vuc2VUeXBlKGl0ZW0pOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRFZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsID0geworICAgICAgICAgICAgICAgIGFydGlmYWN0UmVzb3VyY2U6IG51bGwsCisgICAgICAgICAgICAgICAgYXJ0aWZhY3RUeXBlczogbnVsbCwKKyAgICAgICAgICAgICAgICBhcnRpZmFjdEZpbGU6e30KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuaW5pdEVudGl0eSgpOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5WYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVybFZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5VcmxWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxhYmVsVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLkxhYmVsVmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pbnRlZ2VyVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLkludGVnZXJWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc05ldyA9ICh0aGlzLmZvcm1TdGF0ZSA9PT0gVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZS5DUkVBVEUpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RUeXBlID0gdGhpcy5hcnRpZmFjdHNVdGlscy5nZXRBcnRpZmFjdFR5cGVCeVN0YXRlKHRoaXMuJHN0YXRlLmN1cnJlbnQubmFtZSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RhbEluc3RhbmNlQXJ0aWZhY3QgPSB0aGlzLiRtb2RhbEluc3RhbmNlOworCisgICAgICAgICAgICB0aGlzLmluaXRFZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsKCk7CisgICAgICAgICAgICB0aGlzLmluaXRBcnRpZmFjdFR5cGVzKCk7CisKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgZWRpdCwgc2hvdyB0aGUgZmlsZSBuYW1lIGluIGJyb3dzZS4KKyAgICAgICAgICAgIGlmICh0aGlzLmFydGlmYWN0LmFydGlmYWN0TmFtZSE9PSIiICYmICdIRUFUX0VOVichPT10aGlzLmFydGlmYWN0LmFydGlmYWN0VHlwZSl7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdEZpbGUgPSB7fTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZS5maWxlbmFtZSA9IHRoaXMuYXJ0aWZhY3QuYXJ0aWZhY3ROYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3Njb3BlIG1ldGhvZHMKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzRGVwbG95bWVudEhlYXQgPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuJHNjb3BlLmlzTmV3ICYmIHRoaXMuJHNjb3BlLmFydGlmYWN0VHlwZSA9PT0gJ2RlcGxveW1lbnQnICYmCisgICAgICAgICAgICAgICAgICAgICdIRUFUJyA9PT0gdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0VHlwZS5zdWJzdHJpbmcoMCw0KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLiRzY29wZS5vbkZpbGVDaGFuZ2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZSAmJiB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZS5maWxlbmFtZSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuYXJ0aWZhY3ROYW1lID0gdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdEZpbGUuZmlsZW5hbWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0TmFtZSA9IHRoaXMuJHNjb3BlLm9yaWdpbmFsQXJ0aWZhY3ROYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXREZWZhdWx0VGltZW91dCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmlzRGVwbG95bWVudEhlYXQoKSAmJiAhdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLnRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLnRpbWVvdXQgPSB0aGlzLiRzY29wZS5kZWZhdWx0SGVhdFRpbWVvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZmlsZUV4dGVuc2lvbnMgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgIGxldCB0eXBlOnN0cmluZyA9IHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdFR5cGU7CisgICAgICAgICAgICAgICAgcmV0dXJuICB0eXBlICYmIHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9ucyAmJiB0aGlzLiRzY29wZS52YWxpZEV4dGVuc2lvbnNbdHlwZV0uYWNjZXB0ZWRUeXBlcyA/CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9uc1t0eXBlXS5hY2NlcHRlZFR5cGVzLmpvaW4oJywnKSA6ICIiOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2F2ZSA9IChkb05vdENsb3NlTW9kYWw/OmJvb2xlYW4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmRlc2NyaXB0aW9uID0gdGhpcy5WYWxpZGF0aW9uVXRpbHMuc3RyaXBBbmRTYW5pdGl6ZSh0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuZGVzY3JpcHRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRzY29wZS5pc0RlcGxveW1lbnRIZWF0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLnRpbWVvdXQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UucGF5bG9hZERhdGEgPSB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZS5iYXNlNjQ7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdE5hbWUgPSB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZS5maWxlbmFtZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsZXQgb25GYWlsZCA9IChyZXNwb25zZSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRmFpbGQnLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoYXJ0aWZhY3RSZXNvdXJjZTpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5vcmlnaW5hbEFydGlmYWN0TmFtZSA9ICIiOworCisgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmlzRGVwbG95bWVudEhlYXQoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihhcnRpZmFjdFJlc291cmNlLmhlYXRQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUub3BlbkVkaXRFbnZQYXJhbWV0ZXJzTW9kYWwoYXJ0aWZhY3RSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWRvTm90Q2xvc2VNb2RhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWxJbnN0YW5jZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmFydGlmYWN0QXJyID0gW107CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZSA9ICBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KCJpbnB1dFt0eXBlPSdmaWxlJ10iKS52YWwobnVsbCk7IC8vICBmb3Igc3VwcG9ydCBjaHJvbWUgd2hlbiB1cGxvYWQgdGhlIHNhbWUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdHNVdGlscy5hZGRBbm90aGVyQWZ0ZXJTYXZlKHRoaXMuJHNjb3BlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGlmKCdIRUFUX0VOVicgPT0gdGhpcy5hcnRpZmFjdC5hcnRpZmFjdFR5cGUpeworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC51cGxvYWRJbnN0YW5jZUVudkZpbGUodGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZCk7CisgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy4kc2NvcGUuaXNBcnRpZmFjdE93bmVyKCkpeworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5hZGRPclVwZGF0ZUluc3RhbmNlQXJ0aWZhY3QodGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZCk7CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5hZGRPclVwZGF0ZUFydGlmYWN0KHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzQXJ0aWZhY3RPd25lciA9ICgpOmJvb2xlYW49PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmlzU2VydmljZSgpICYmICEhdGhpcy5jb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNhdmVBbmRBbm90aGVyID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2F2ZSh0cnVlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNsb3NlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdEFyciA9IFtdOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZmlsZVVwbG9hZFJlcXVpcmVkID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdEZpbGUuZmlsZW5hbWUpeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGVkaXQgbW9kZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhbHNlJzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RydWUnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldEZvcm1UaXRsZSA9KCk6IHN0cmluZyA9PnsKKyAgICAgICAgICAgICAgICBpZignSEVBVF9FTlYnID09IHRoaXMuYXJ0aWZhY3QuYXJ0aWZhY3RUeXBlKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdVcGRhdGUgSEVBVCBFTlYnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5pc0RlcGxveW1lbnRIZWF0KCkpeworICAgICAgICAgICAgICAgICAgICBpZighdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0Q2hlY2tzdW0peworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdBZGQgSEVBVCBUZW1wbGF0ZSc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdVcGRhdGUgSEVBVCBUZW1wbGF0ZSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmlzTmV3KXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdBZGQgQXJ0aWZhY3QnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gJ1VwZGF0ZSBBcnRpZmFjdCc7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vcGVuRWRpdEVudlBhcmFtZXRlcnNNb2RhbCA9IChhcnRpZmFjdFJlc291cmNlOk1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQoJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9lbnYtcGFyYW1ldGVycy1mb3JtL2Vudi1wYXJhbWV0ZXJzLWZvcm0uaHRtbCcpLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnU2RjLlZpZXdNb2RlbHMuRW52UGFyYW1ldGVyc0Zvcm1WaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgICAgICBzaXplOiAnc2RjLW1kJywKKyAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAorICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdDogKCk6TW9kZWxzLkFydGlmYWN0TW9kZWwgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnRpZmFjdFJlc291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCk6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIHRoaXMuY29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBtb2RhbEluc3RhbmNlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UgPSB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgbW9kYWxJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAucmVzdWx0CisgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvcm1zID0ge307CisKKyAgICAgICAgICAgIHRoaXMuaW5pdEZvb3RlckJ1dHRvbnMoKTsKKworCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2goImZvcm1zLmVkaXRGb3JtLiRpbnZhbGlkIiwgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9uc1swXS5kaXNhYmxlZCA9IHRoaXMuJHNjb3BlLmZvcm1zLmVkaXRGb3JtLiRpbnZhbGlkOworICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmlzTmV3KXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9uc1sxXS5kaXNhYmxlZCA9IHRoaXMuJHNjb3BlLmZvcm1zLmVkaXRGb3JtLiRpbnZhbGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvYXJ0aWZhY3QtZm9ybS9hcnRpZmFjdC1mb3JtLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvYXJ0aWZhY3QtZm9ybS9hcnRpZmFjdC1mb3JtLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGExOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9hcnRpZmFjdC1mb3JtL2FydGlmYWN0LWZvcm0tdmlldy5odG1sCkBAIC0wLDAgKzEsMTY5IEBACis8c2RjLW1vZGFsIG1vZGFsPSJtb2RhbEluc3RhbmNlQXJ0aWZhY3QiIHR5cGU9ImNsYXNzaWMiIGNsYXNzPSJzZGMtYWRkLWFydGlmYWN0IiBidXR0b25zPSJmb290ZXJCdXR0b25zIiBoZWFkZXI9Int7Z2V0Rm9ybVRpdGxlKCl9fSIgc2hvdy1jbG9zZS1idXR0b249InRydWUiIGdldC1jbG9zZS1tb2RhbC1yZXNwb25zZT0iY2xvc2UiPgorCisgICAgPGxvYWRlciBkYXRhLWRpc3BsYXk9ImlzTG9hZGluZyI+PC9sb2FkZXI+CisKKyAgICA8ZGl2IGNsYXNzPSJzZGMtZWRpdC1hcnRpZmFjdC1mb3JtLWNvbnRhaW5lciIKKyAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnbWFuZGF0b3J5LWFydGlmYWN0JzogKGVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5tYW5kYXRvcnkgJiYgYXJ0aWZhY3RUeXBlICE9PSdkZXBsb3ltZW50JykgfHwgYXJ0aWZhY3RUeXBlID09PSAnYXBpJ30iPgorICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIGNsYXNzPSJ3LXNkYy1mb3JtIiBuYW1lPSJmb3Jtcy5lZGl0Rm9ybSI+CisKKyAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFSVElGQUNUIEZJTEUgU1RBUlQtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSI+CisgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJyZXF1aXJlZCI+VXBsb2FkIEZpbGU8L2xhYmVsPgorICAgICAgICAgICAgICAgIDxmaWxlLXVwbG9hZCBpZD0iZmlsZVVwbG9hZEVsZW1lbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0tZWxlbWVudD0iZm9ybXMuZWRpdEZvcm0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtcmVxdWlyZWQ9Int7OjpmaWxlVXBsb2FkUmVxdWlyZWQoKX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LW5hbWU9Im15QXJ0aWZhY3RGaWxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLW1vZGVsPSJlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucz0ie3tmaWxlRXh0ZW5zaW9ucygpfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtZGlzYWJsZWQ9Int7IWVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdFR5cGV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IGZvcm1zLmVkaXRGb3JtLm15QXJ0aWZhY3RGaWxlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kaW52YWxpZH0iPjwvZmlsZS11cGxvYWQ+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvci1maWxlLXVwbG9hZCIgZGF0YS1uZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0ubXlBcnRpZmFjdEZpbGUuJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kZXJyb3IucmVxdWlyZWQgICYmICFmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kZXJyb3IuZW1wdHlGaWxlIiB0cmFuc2xhdGU9IkFERF9BUlRJRkFDVF9FUlJPUl9GSUxFX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLm15QXJ0aWZhY3RGaWxlLiRlcnJvci5tYXhzaXplIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0ZJTEVfU0laRSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1pZj0iYXJ0aWZhY3RUeXBlID09PSAnZGVwbG95bWVudCciIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLm15QXJ0aWZhY3RGaWxlLiRlcnJvci5maWxldHlwZSIgdHJhbnNsYXRlPSJBRERfQVJUSUZBQ1RfRVJST1JfVkFMSURfRVhURU5TSU9OUyIgdHJhbnNsYXRlLXZhbHVlcz0ieydleHRlbnNpb25zJzogJ3t7ZmlsZUV4dGVuc2lvbnMoKX19JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLm15QXJ0aWZhY3RGaWxlLiRlcnJvci5lbXB0eUZpbGUiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9FTVBUWV9GSUxFIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFSVElGQUNUIEZJTEUgRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbnMtd3JhcHBlciI+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiIgZGF0YS1uZy1pZj0iYXJ0aWZhY3RUeXBlID09PSAnZGVwbG95bWVudCcgfHwgKCFlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UubWFuZGF0b3J5ICYmIGFydGlmYWN0VHlwZSAhPT0gJ2FwaScpIj4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS5hcnRpZmFjdExhYmVsLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5hcnRpZmFjdExhYmVsLiRpbnZhbGlkKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iIWlzRGVwbG95bWVudEhlYXQoKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPkFydGlmYWN0IExhYmVsPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0TGFiZWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJhcnRpZmFjdExhYmVsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0ibGFiZWxWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9IiFpc05ldyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJhcnRpZmFjdC1sYWJlbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXMvPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5hcnRpZmFjdExhYmVsLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5hcnRpZmFjdExhYmVsLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5hcnRpZmFjdExhYmVsLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJBRERfQVJUSUZBQ1RfRVJST1JfTEFCRUxfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5hcnRpZmFjdExhYmVsLiRlcnJvci5tYXhsZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21heCc6ICcyNScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmFydGlmYWN0TGFiZWwuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0udHlwZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udHlwZS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+VHlwZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSIhaXNOZXciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJzZXREZWZhdWx0VGltZW91dCgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuYXJ0aWZhY3RUeXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW9wdGlvbnM9InR5cGUgYXMgdHlwZSBmb3IgdHlwZSBpbiBlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0VHlwZXMgdHJhY2sgYnkgdHlwZSB8IHVwcGVyY2FzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iYXJ0aWZhY3R0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPkNob29zZSBUeXBlPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udHlwZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udHlwZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udHlwZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX1RZUEVfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS50aW1lb3V0LiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS50aW1lb3V0LiRpbnZhbGlkKX0iIGRhdGEtbmctaWY9ImlzRGVwbG95bWVudEhlYXQoKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiPkRlcGxveW1lbnQgVGltZW91dCAobWludXRlcyk8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UudGltZW91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0idGltZW91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4PSIyMTQ3NDgzNjQ3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9IidIRUFUX0VOVic9PWVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdFR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49ImludGVnZXJWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9InNldERlZmF1bHRUaW1lb3V0KCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9InNldERlZmF1bHRUaW1lb3V0KCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ0aW1lb3V0IiAvPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS50aW1lb3V0LiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS50aW1lb3V0LiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS50aW1lb3V0LiRlcnJvci5tYXhsZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21heCc6ICcyNScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnRpbWVvdXQuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX1RJTUVPVVRfUEFUVEVSTiI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnRpbWVvdXQuJGVycm9yLm1pbiIgdHJhbnNsYXRlPSJBRERfQVJUSUZBQ1RfRVJST1JfVElNRU9VVF9NSU4iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgPC9kaXY+PCEtLSB3LXNkYy1mb3JtLWNvbHVtbiAtLT4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIGktc2RjLWZvcm0tdXJsIiBkYXRhLW5nLWlmPSJhcnRpZmFjdFR5cGU9PT0nYXBpJyI+CisKKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0uYXBpVXJsLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5hcGlVcmwuJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPlVSTDwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjEwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuYXBpVXJsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idXJsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImFwaVVybCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctcGF0dGVybj0idXJsVmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZC1jaGFyYWN0ZXJzPScsIz8mQCQ8Pn5eYFxbXXt9fCIpKCohKz07JScgLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uYXBpVXJsLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5hcGlVcmwuJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmFwaVVybC4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX0FQSVVSTF9SRVFVSVJFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmFwaVVybC4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMTAwJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uYXBpVXJsLiRlcnJvci51cmwgfHwgZm9ybXMuZWRpdEZvcm0uYXBpVXJsLiRlcnJvci5wYXR0ZXJuIHx8IGZvcm1zLmVkaXRGb3JtLmFwaVVybC4kZXJyb3IuaW52YWxpZENoYXJhY3RlcnMiIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX0FQSVVSTF9VUkwiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgPC9kaXY+PCEtLSB3LXNkYy1mb3JtLWNvbHVtbiAtLT4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIj4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPkRlc2NyaXB0aW9uPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iaS1zZGMtZm9ybS10ZXh0YXJlYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49ImNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJkZXNjcmlwdGlvbiI+PC90ZXh0YXJlYT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX0RFU0NSSVBUSU9OX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzI1NicgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IkFERF9BUlRJRkFDVF9FUlJPUl9ERVNDUklQVElPTl9QQVRURVJOIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW4gYXJ0aWZhY3QtaW5mbyIgZGF0YS1uZy1zaG93PSIhaXNOZXcgJiYgZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmVzSWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQgPHNwYW4gZGF0YS1uZy1iaW5kPSJlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuYXJ0aWZhY3RVVUlEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiA8c3BhbiBkYXRhLW5nLWJpbmQ9ImVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdFZlcnNpb24iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gdy1zZGMtZm9ybS1jb2x1bW4gLS0+CisKKyAgICAgICAgICAgIDwvZGl2PjwhLS0gdy1zZGMtZm9ybS1jb2x1bW5zLXdyYXBwZXIgLS0+CisKKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1mb3JtLW5vdGUiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uJGludmFsaWQgJiYgZmFsc2UiIHRyYW5zbGF0ZT0iTEFCRUxfQUxMX0ZJRUxEU19BUkVfTUFOREFUT1JZIj48L3NwYW4+CisKKyAgICAgICAgPC9mb3JtPgorICAgIDwvZGl2PgorPC9zZGMtbW9kYWw+CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvYXJ0aWZhY3QtZm9ybS9hcnRpZmFjdC1mb3JtLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2FydGlmYWN0LWZvcm0vYXJ0aWZhY3QtZm9ybS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzc5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2FydGlmYWN0LWZvcm0vYXJ0aWZhY3QtZm9ybS5sZXNzCkBAIC0wLDAgKzEsNDQgQEAKKy5zZGMtZWRpdC1hcnRpZmFjdC1mb3JtLWNvbnRhaW5lciB7CisKKyAgICAudy1zZGMtZm9ybS1ub3RlIHsKKyAgICAgICAgLmhfOTsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiAxM3B4OworICAgIH0KKworICAgIC5pLXNkYy1mb3JtLXRleHRhcmVheworICAgICAgICBtaW4taGVpZ2h0OiA5NXB4OworICAgIH0KKworICAgIC5pLXNkYy1mb3JtLXVybCB7CisgICAgICAgIHBhZGRpbmctYm90dG9tOiAwcHg7CisgICAgfQorCisgICAgJi5tYW5kYXRvcnktYXJ0aWZhY3QgeworICAgICAgICAudy1zZGMtZm9ybS1jb2x1bW4geworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICAgICAgbWluLWhlaWdodDogaW5pdGlhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAudy1zZGMtZm9ybSAuaS1zZGMtZm9ybS1pdGVtLnVwbG9hZCBpbnB1dFt0eXBlPSJmaWxlIl0geworICAgICAgICBkaXNwbGF5OiBub25lCisgICAgfQorCisgICAgLmFydGlmYWN0LWluZm8geworICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICBjb2xvcjogIHJnYigxNDAsIDE0MCwgMTQwKTsKKyAgICAgICAgZm9udC1zaXplOiAxM3B4OworICAgICAgICBtYXJnaW4tdG9wOiAtMTBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgbWluLWhlaWdodDogaW5pdGlhbDsKKworICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgIGNvbG9yOiAgIzY2NjY2NjsKKyAgICAgICAgICAgIHBhZGRpbmctbGVmdDogNHB4OworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2F0dHJpYnV0ZS1mb3JtL2F0dHJpYnV0ZS1mb3JtLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvYXR0cmlidXRlLWZvcm0vYXR0cmlidXRlLWZvcm0tdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMmIzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2F0dHJpYnV0ZS1mb3JtL2F0dHJpYnV0ZS1mb3JtLXZpZXcuaHRtbApAQCAtMCwwICsxLDE1MyBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZUF0dHJpYnV0ZSIgdHlwZT0iY2xhc3NpYyIgY2xhc3M9InNkYy1lZGl0LWF0dHJpYnV0ZS1jb250YWluZXIiIGJ1dHRvbnM9ImZvb3RlckJ1dHRvbnMiICBoZWFkZXI9Int7aXNOZXcgPyAnQWRkJyA6ICdVcGRhdGUnIH19IEF0dHJpYnV0ZSIgc2hvdy1jbG9zZS1idXR0b249InRydWUiPgorCisgICAgPGRpdiBjbGFzcz0ic2RjLWVkaXQtYXR0cmlidXRlLWZvcm0tY29udGFpbmVyIiA+CisgICAgICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9Inctc2RjLWZvcm0gdHdvLWNvbHVtbnMiIG5hbWU9ImZvcm1zLmVkaXRGb3JtIiA+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1ucy13cmFwcGVyIj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIj4KKworICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS5hdHRyaWJ1dGVOYW1lLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5hdHRyaWJ1dGVOYW1lLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5OYW1lPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImF0dHJpYnV0ZU5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iNTAiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSIhaXNOZXciCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjUwIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS5uYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImF0dHJpYnV0ZU5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49InByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJ2YWxpZGF0ZU5hbWUoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cyAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uYXR0cmlidXRlTmFtZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0uYXR0cmlidXRlTmFtZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uYXR0cmlidXRlTmFtZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdBdHRyaWJ1dGUgbmFtZScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmF0dHJpYnV0ZU5hbWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzEyOCcgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmF0dHJpYnV0ZU5hbWUuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uYXR0cmlidXRlTmFtZS4kZXJyb3IubmFtZUV4aXN0IiB0cmFuc2xhdGU9Ik5FV19BVFRSSUJVVEVfRVJST1JfTkFNRV9FWElTVFMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8IS0tIERlc2NyaXB0aW9uIC0tPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIj5EZXNjcmlwdGlvbjwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgIGNsYXNzPSJpLXNkYy1mb3JtLXRleHRhcmVhIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjI1NiIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9ImVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUucmVhZG9ubHkiCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1NiIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0iY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLmRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlc2NyaXB0aW9uIj48L3RleHRhcmVhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjU2JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnRGVzY3JpcHRpb24nIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworCisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gVHlwZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLnR5cGUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnR5cGUuJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPlR5cGU8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iaS1zZGMtZm9ybS1zZWxlY3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InR5cGUtZmllbGQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS5yZWFkb25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0idHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9Im9uVHlwZUNoYW5nZSgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLnR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctb3B0aW9ucz0idHlwZSBmb3IgdHlwZSBpbiBlZGl0QXR0cmlidXRlTW9kZWwudHlwZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+Q2hvb3NlIFR5cGU8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udHlwZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udHlwZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udHlwZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdUeXBlJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLSBzY2hlbWEgLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS5zY2hlbWEuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnNjaGVtYS4kaW52YWxpZCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaWY9InNob3dTY2hlbWEoKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPkVudHJ5IFNjaGVtYTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIgbmctaWY9ImlzU2NoZW1hRWRpdGFibGUoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNjaGVtYSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9ImVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUucmVhZG9ubHkiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0ib25UeXBlQ2hhbmdlKGZhbHNlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUuc2NoZW1hLnByb3BlcnR5LnR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW9wdGlvbnM9InR5cGUgZm9yIHR5cGUgaW4gZWRpdEF0dHJpYnV0ZU1vZGVsLnNpbXBsZVR5cGVzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+Q2hvb3NlIFNjaGVtYSBUeXBlPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1pZj0iIWlzU2NoZW1hRWRpdGFibGUoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJzY2hlbWEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLnNjaGVtYS5wcm9wZXJ0eS50eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2NoZW1hIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5zY2hlbWEuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnNjaGVtYS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uc2NoZW1hLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1JFUVVJUkVEIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J2ZpZWxkJzogJ0VudHJ5IHNjaGVtYScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLnZhbHVlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCI+RGVmYXVsdCBWYWx1ZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZGVmYXVsdHZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWlmPSIhKGVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUudHlwZSA9PSAnYm9vbGVhbicpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS5yZWFkb25seSAmJiAhaXNBdHRyaWJ1dGVWYWx1ZU93bmVyKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZVtpc0F0dHJpYnV0ZVZhbHVlT3duZXIoKT8ndmFsdWUnOidkZWZhdWx0VmFsdWUnXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3VzdG9tLXZhbGlkYXRpb249IiIgZGF0YS12YWxpZGF0aW9uLWZ1bmM9InZhbGlkYXRlVW5pcXVlS2V5cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJkZWZhdWx0dmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJ2YWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSIhZm9ybXMuZWRpdEZvcm0udmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgKCdpbnRlZ2VyJz09ZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS50eXBlICYmIGZvcm1zLmVkaXRGb3JtLnZhbHVlLiRzZXRWYWxpZGl0eSgncGF0dGVybicsIHZhbGlkYXRlSW50UmFuZ2UoZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS52YWx1ZSkpIHx8IG9uVmFsdWVDaGFuZ2UoKSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iYm9vbGVhbnR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWlmPSJlZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLnR5cGUgPT0gJ2Jvb2xlYW4nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJlZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLnJlYWRvbmx5ICYmICFpc0F0dHJpYnV0ZVZhbHVlT3duZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJvblZhbHVlQ2hhbmdlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGVbaXNBdHRyaWJ1dGVWYWx1ZU93bmVyKCk/J3ZhbHVlJzonZGVmYXVsdFZhbHVlJ10iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InRydWUiPnRydWU8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJmYWxzZSI+ZmFsc2U8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udmFsdWUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnZhbHVlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdEZWZhdWx0IHZhbHVlJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udmFsdWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzEwMCcgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnZhbHVlLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9Int7Z2V0VmFsaWRhdGlvblRyYW5zbGF0ZSgpfX0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kZXJyb3IuY3VzdG9tVmFsaWRhdGlvbiIgdHJhbnNsYXRlPSJBVFRSSUJVVEVfRURJVF9NQVBfVU5JUVVFX0tFWVMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8IS0tIGhpZGRlbiAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWlmPSJpc0F0dHJpYnV0ZVZhbHVlT3duZXIoKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiPkhpZGRlbjwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJoaWRkZW4iCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJlZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLnJlYWRvbmx5ICYmICFpc0F0dHJpYnV0ZVZhbHVlT3duZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUuaGlkZGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJoaWRkZW4iLz4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgIDwvZm9ybT4KKyAgICA8L2Rpdj4KKworPC9zZGMtbW9kYWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2F0dHJpYnV0ZS1mb3JtL2F0dHJpYnV0ZS1mcm9tLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2F0dHJpYnV0ZS1mb3JtL2F0dHJpYnV0ZS1mcm9tLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2OWNmYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvYXR0cmlidXRlLWZvcm0vYXR0cmlidXRlLWZyb20tdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDI1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElFZGl0QXR0cmlidXRlTW9kZWwgeworICAgICAgICBhdHRyaWJ1dGU6IE1vZGVscy5BdHRyaWJ1dGVNb2RlbDsKKyAgICAgICAgdHlwZXM6IEFycmF5PHN0cmluZz47CisgICAgICAgIHNpbXBsZVR5cGVzOiBBcnJheTxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBJQXR0cmlidXRlRm9ybVZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgJCRjaGlsZFRhaWw6IGFueTsKKyAgICAgICAgZm9ybXM6YW55OworICAgICAgICBlZGl0Rm9ybTpuZy5JRm9ybUNvbnRyb2xsZXI7CisgICAgICAgIGZvb3RlckJ1dHRvbnM6IEFycmF5PGFueT47CisgICAgICAgIGlzU2VydmljZTogYm9vbGVhbjsKKyAgICAgICAgZWRpdEF0dHJpYnV0ZU1vZGVsOiBJRWRpdEF0dHJpYnV0ZU1vZGVsOworICAgICAgICBtb2RhbEluc3RhbmNlQXR0cmlidXRlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisgICAgICAgIGlzTmV3OiBib29sZWFuOworICAgICAgICBsaXN0UmVnZXg6IFNkYy5VdGlscy5JTWFwUmVnZXg7CisgICAgICAgIG1hcFJlZ2V4OiBTZGMuVXRpbHMuSU1hcFJlZ2V4OworICAgICAgICBwcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBjb21tZW50VmFsaWRhdGlvblBhdHRlcm46IFJlZ0V4cDsKKyAgICAgICAgaXNMb2FkaW5nOiBib29sZWFuOworICAgICAgICB2YWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworCisgICAgICAgIHNhdmUoKTp2b2lkOworICAgICAgICBjbG9zZSgpOiB2b2lkOworICAgICAgICBvblR5cGVDaGFuZ2UoKTp2b2lkOworICAgICAgICBvblZhbHVlQ2hhbmdlKCk6IHZvaWQ7CisgICAgICAgIGlzQXR0cmlidXRlVmFsdWVPd25lcigpOmJvb2xlYW47CisgICAgICAgIHZhbGlkYXRlSW50UmFuZ2UodmFsdWU6c3RyaW5nKTpib29sZWFuOworICAgICAgICB2YWxpZGF0ZVVuaXF1ZUtleXModmlld1ZhbHVlOnN0cmluZyk6Ym9vbGVhbjsKKyAgICAgICAgZ2V0VmFsaWRhdGlvblRyYW5zbGF0ZSgpOiBzdHJpbmc7CisgICAgICAgIHNob3dTY2hlbWEoKTogYm9vbGVhbjsKKyAgICAgICAgaXNTY2hlbWFFZGl0YWJsZSgpOiBib29sZWFuOworICAgICAgICB2YWxpZGF0ZU5hbWUoKTp2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVGb3JtVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJG1vZGFsSW5zdGFuY2UnLAorICAgICAgICAgICAgJ2F0dHJpYnV0ZScsCisgICAgICAgICAgICAnVmFsaWRhdGlvblV0aWxzJywKKyAgICAgICAgICAgICdDb21tZW50VmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ1Byb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdjb21wb25lbnQnCisgICAgICAgIF07CisKKyAgICAgICAgcHJpdmF0ZSBmb3JtU3RhdGU6IFNkYy5VdGlscy5Db25zdGFudHMuRm9ybVN0YXRlOworCisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUF0dHJpYnV0ZUZvcm1WaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGF0dHJpYnV0ZTogTW9kZWxzLkF0dHJpYnV0ZU1vZGVsLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25VdGlsczpTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgUHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm46IFJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgeworICAgICAgICAgICAgdGhpcy5mb3JtU3RhdGUgPSBhbmd1bGFyLmlzRGVmaW5lZChhdHRyaWJ1dGUubmFtZSkgPyAgVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZS5VUERBVEUgOiAgVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZS5DUkVBVEU7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0UmVzb3VyY2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUgPSBuZXcgU2RjLk1vZGVscy5BdHRyaWJ1dGVNb2RlbCh0aGlzLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLnR5cGVzLmluZGV4T2YodGhpcy5hdHRyaWJ1dGUudHlwZSkgPT09IC0xKSB7Ly9hdHRyaWJ1dGUgZGVmYXVsdGUgdHlwZSBpcyBzdHJpbmcgdG9vPworICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlLnR5cGUgPSAic3RyaW5nIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRFZGl0QXR0cmlidXRlTW9kZWwgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbCA9IHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6IG51bGwsCisgICAgICAgICAgICAgICAgdHlwZXM6IFsnaW50ZWdlcicsICdzdHJpbmcnLCAnZmxvYXQnLCAnYm9vbGVhbicsICdsaXN0JywgJ21hcCddLAorICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVzOiBbJ2ludGVnZXInLCAnc3RyaW5nJywgJ2Zsb2F0JywgJ2Jvb2xlYW4nXQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy5pbml0UmVzb3VyY2UoKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICAvL3Njb3BlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvcm1zID0ge307CisgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuUHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21tZW50VmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLkNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kYWxJbnN0YW5jZUF0dHJpYnV0ZSA9IHRoaXMuJG1vZGFsSW5zdGFuY2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5saXN0UmVnZXggPSB0aGlzLlZhbGlkYXRpb25VdGlscy5nZXRQcm9wZXJ0eUxpc3RQYXR0ZXJucygpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUubWFwUmVnZXggPSB0aGlzLlZhbGlkYXRpb25VdGlscy5nZXRQcm9wZXJ0eU1hcFBhdHRlcm5zKCk7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTmV3ID0gKHRoaXMuZm9ybVN0YXRlID09PSBVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlLkNSRUFURSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgdGhpcy5pbml0RWRpdEF0dHJpYnV0ZU1vZGVsKCk7CisgICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25QYXR0ZXJuKCk7CisKKyAgICAgICAgICAgIC8vc2NvcGUgbWV0aG9kcworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2F2ZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmKCF0aGlzLiRzY29wZS5mb3Jtcy5lZGl0Rm9ybS4kaW52YWxpZCl7CisgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsID0gdGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS5kZXNjcmlwdGlvbiA9IHRoaXMuVmFsaWRhdGlvblV0aWxzLnN0cmlwQW5kU2FuaXRpemUodGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS5kZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIC8vLy9pZiByZWFkIG9ubHkgLSBqdXN0IGNsb3NlcyB0aGUgbW9kYWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUucmVhZG9ubHkgJiYgIXRoaXMuJHNjb3BlLmlzQXR0cmlidXRlVmFsdWVPd25lcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IG9uQXR0cmlidXRlRmFpbGQgPSAocmVzcG9uc2UpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvbkZhaWxkJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IG9uQXR0cmlidXRlU3VjY2VzcyA9IChhdHRyaWJ1dGVGcm9tQkU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnb25BdHRyaWJ1dGVSZXNvdXJjZVN1Y2Nlc3MgOiAnLCBhdHRyaWJ1dGVGcm9tQkUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgLy9pbiBjYXNlIHdlIGhhdmUgdW5pcXVlSWQgd2UgY2FsbCB1cGRhdGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5pc0F0dHJpYnV0ZVZhbHVlT3duZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlSW5zdGFuY2VBdHRyaWJ1dGUoYXR0cmlidXRlKS50aGVuKG9uQXR0cmlidXRlU3VjY2Vzcywgb25BdHRyaWJ1dGVGYWlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5hZGRPclVwZGF0ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpLnRoZW4ob25BdHRyaWJ1dGVTdWNjZXNzLCBvbkF0dHJpYnV0ZUZhaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNsb3NlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWxJbnN0YW5jZS5jbG9zZSgpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGVOYW1lID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGV4aXN0c0F0dHI6IE1vZGVscy5BdHRyaWJ1dGVNb2RlbCA9IF8uZmluZCh0aGlzLmNvbXBvbmVudC5hdHRyaWJ1dGVzLCAoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCkgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLm5hbWUgPT09IHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUubmFtZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpZihleGlzdHNBdHRyKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9ybXMuZWRpdEZvcm1bImF0dHJpYnV0ZU5hbWUiXS4kc2V0VmFsaWRpdHkoJ25hbWVFeGlzdCcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9ybXMuZWRpdEZvcm1bImF0dHJpYnV0ZU5hbWUiXS4kc2V0VmFsaWRpdHkoJ25hbWVFeGlzdCcsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25UeXBlQ2hhbmdlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS52YWx1ZSA9ICcnOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUuZGVmYXVsdFZhbHVlID0gJyc7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uUGF0dGVybigpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNBdHRyaWJ1dGVWYWx1ZU93bmVyID0gKCk6Ym9vbGVhbj0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuaXNTZXJ2aWNlKCkgfHwgISF0aGlzLmNvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25WYWx1ZUNoYW5nZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmICghdGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuaXNBdHRyaWJ1dGVWYWx1ZU93bmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUudmFsdWUgPSB0aGlzLiRzY29wZS5lZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGVVbmlxdWVLZXlzID0gKHZpZXdWYWx1ZTpzdHJpbmcpIDogYm9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS50eXBlID09PSAnbWFwJykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5WYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVbmlxdWVLZXlzKHZpZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy9hbHdheXMgdmFsaWQgaWYgbm90IGEgbWFwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGVJbnRSYW5nZSA9ICh2YWx1ZTpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiAhdmFsdWUgfHwgdGhpcy5WYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJbnRSYW5nZSh2YWx1ZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1NjaGVtYUVkaXRhYmxlID0gKCkgOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIGxldCBzY2hlbWFUeXBlPXRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUuc2NoZW1hLnByb3BlcnR5LnR5cGU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5zaW1wbGVUeXBlcy5pbmRleE9mKHNjaGVtYVR5cGUpID4gLTF8fCFzY2hlbWFUeXBlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd1NjaGVtYSA9ICgpIDpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWydsaXN0JywgJ21hcCddLmluZGV4T2YodGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS50eXBlKSA+IC0xOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0VmFsaWRhdGlvblRyYW5zbGF0ZSA9ICgpIDogc3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gIkFUVFJJQlVURV9FRElUX1BBVFRFUk4iOworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5zaG93U2NoZW1hKCkpIHsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiQVRUUklCVVRFX0VESVRfIiArIHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUudHlwZS50b1VwcGVyQ2FzZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUuc2NoZW1hLnByb3BlcnR5LnR5cGUgPT09IFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9UWVBFUy5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiX1NUUklORyI7CisgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuJHNjb3BlLmVkaXRBdHRyaWJ1dGVNb2RlbC5hdHRyaWJ1dGUuc2NoZW1hLnByb3BlcnR5LnR5cGUgPT09IFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9UWVBFUy5CT09MRUFOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIl9CT09MRUFOIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiX0dFTkVSSUMiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgZG9uZSBidXR0b24gYXQgdGhlIGZvb3Rlci4KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvb3RlckJ1dHRvbnMgPSBbCisgICAgICAgICAgICAgICAgeyduYW1lJzogJ0RvbmUnLCAnY3NzJzonYmx1ZScsICdjYWxsYmFjayc6IHRoaXMuJHNjb3BlLnNhdmV9LAorICAgICAgICAgICAgICAgIHsnbmFtZSc6J0NhbmNlbCcsICdjc3MnOidncmV5JywgJ2NhbGxiYWNrJzogdGhpcy4kc2NvcGUuY2xvc2V9CisgICAgICAgICAgICBdOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCJmb3Jtcy5lZGl0Rm9ybS4kaW52YWxpZCIsIChuZXdWYWwsIG9sZFZhbCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvb3RlckJ1dHRvbnNbMF0uZGlzYWJsZWQgPSB0aGlzLiRzY29wZS5mb3Jtcy5lZGl0Rm9ybS4kaW52YWxpZDsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvblBhdHRlcm4gPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS50eXBlID09PSAnbGlzdCcpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuJHNjb3BlLmxpc3RSZWdleFt0aGlzLiRzY29wZS5lZGl0QXR0cmlidXRlTW9kZWwuYXR0cmlidXRlLnNjaGVtYS5wcm9wZXJ0eS50eXBlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYodGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS50eXBlID09PSAnbWFwJykgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy4kc2NvcGUubWFwUmVnZXhbdGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS5zY2hlbWEucHJvcGVydHkudHlwZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5WYWxpZGF0aW9uVXRpbHMuZ2V0VmFsaWRhdGlvblBhdHRlcm4odGhpcy4kc2NvcGUuZWRpdEF0dHJpYnV0ZU1vZGVsLmF0dHJpYnV0ZS50eXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2Vudi1wYXJhbWV0ZXJzLWZvcm0vZW52LXBhcmFtZXRlcnMtZm9ybS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9lbnYtcGFyYW1ldGVycy1mb3JtL2Vudi1wYXJhbWV0ZXJzLWZvcm0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM2N2RjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9lbnYtcGFyYW1ldGVycy1mb3JtL2Vudi1wYXJhbWV0ZXJzLWZvcm0uaHRtbApAQCAtMCwwICsxLDM5IEBACis8c2RjLW1vZGFsIG1vZGFsPSJlbnZQYXJhbWV0ZXJzTW9kYWwiIHR5cGU9ImNsYXNzaWMiIGNsYXNzPSJzZGMtZW52LWZvcm0tY29udGFpbmVyIiBidXR0b25zPSJzYXZlQnV0dG9uIiBoZWFkZXI9Int7aXNJbnN0YW5jZSgpPydIRUFUIFRlbXBsYXRlJzonVXBkYXRlIFBhcmFtZXRlcnMnfX0iIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIj4KKyAgICA8ZGl2IGNsYXNzPSJzZGMtZW52LWZvcm0tY29udGFpbmVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtYm9keSI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtbW9kYWwtYm9keS1jb250ZW50IiBkYXRhLW5nLWlmPSIhaXNJbnN0YW5jZSgpIiB0cmFuc2xhdGU9IlVQREFURV9QQVJBTUVURVJTX1RFWFQiPjwvc3Bhbj4KKyAgICAgICAgICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9IiIgbmFtZT0iZWRpdEZvcm0iPgorICAgICAgICAgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIGNsYXNzPSJwZXJmZWN0LXNjcm9sbGJhciB3LXNkYy1mb3JtIHctc2RjLWVudi1mb3JtLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctcmVwZWF0PSJwYXJhbWV0ZXIgaW4gaGVhdFBhcmFtZXRlcnMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWZ0LWNvbHVtbi1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctZm9ybSBuYW1lPSJlZGl0Rm9ybSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWVudi1mb3JtLWxhYmVsIiBkYXRhLW5nLWNsYXNzPSJ7cmVxdWlyZWQ6cGFyYW1ldGVyLmRlZmF1bHRWYWx1ZX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJwYXJhbWV0ZXIubmFtZSArJyAoJyArIHBhcmFtZXRlci50eXBlICsgJyknIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7cGFyYW1ldGVyLm5hbWUgKycgKCcgKyBwYXJhbWV0ZXIudHlwZSArICcpJ319Ij48L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGVkaXRGb3JtLmN1cnJlbnRWYWx1ZS4kaW52YWxpZCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9InBhcmFtZXRlci5jdXJyZW50VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY3VycmVudFZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJnZXRWYWxpZGF0aW9uUGF0dGVybihwYXJhbWV0ZXIudHlwZSwgJ2hlYXQnKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcmVxdWlyZWQ9InBhcmFtZXRlci5kZWZhdWx0VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0iJ2pzb24nPT1wYXJhbWV0ZXIudHlwZSAmJiBlZGl0Rm9ybS5jdXJyZW50VmFsdWUuJHNldFZhbGlkaXR5KCdwYXR0ZXJuJywgdmFsaWRhdGVKc29uKHBhcmFtZXRlci5jdXJyZW50VmFsdWUpKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmx1cj0iKGVkaXRGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucmVxdWlyZWQgJiYgKHBhcmFtZXRlci5jdXJyZW50VmFsdWU9cGFyYW1ldGVyLmRlZmF1bHRWYWx1ZSkpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZWRpdEZvcm0uY3VycmVudFZhbHVlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnVmFsdWUnfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucGF0dGVybiAmJiBwYXJhbWV0ZXIudHlwZT09PSdzdHJpbmcnIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucGF0dGVybiAmJiAhKHBhcmFtZXRlci50eXBlPT09J3N0cmluZycpIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfVFlQRSIgdHJhbnNsYXRlLXZhbHVlcz0ieyd0eXBlJzogJ3t7cGFyYW1ldGVyLnR5cGV9fSd9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1mb3JtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWVudi1mb3JtLWxhYmVsLWRlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1lbnYtZm9ybS1sYWJlbCIgZGF0YS1uZy1iaW5kPSJwYXJhbWV0ZXIuZGVzY3JpcHRpb24iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twYXJhbWV0ZXIuZGVzY3JpcHRpb259fSI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVudi1maWxlLWdlbmVyYXRpb24tbGFiZWwiIGRhdGEtbmctaWY9ImlzSW5zdGFuY2UoKSIgdHJhbnNsYXRlPSJFTlZfRklMRV9HRU5FUkFUSU9OIj48L2Rpdj4KKyAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9zZGMtbW9kYWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2Vudi1wYXJhbWV0ZXJzLWZvcm0vZW52LXBhcmFtZXRlcnMtZm9ybS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9lbnYtcGFyYW1ldGVycy1mb3JtL2Vudi1wYXJhbWV0ZXJzLWZvcm0ubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNThjOTRhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9lbnYtcGFyYW1ldGVycy1mb3JtL2Vudi1wYXJhbWV0ZXJzLWZvcm0ubGVzcwpAQCAtMCwwICsxLDc0IEBACisKKy5zZGMtZW52LWZvcm0tY29udGFpbmVyeworICAgIC53LXNkYy1tb2RhbC1ib2R5eworICAgICAgICBwYWRkaW5nOiAyMHB4IDEwcHggMnB4IDEwcHg7CisgICAgfQorICAgIC53LXNkYy1tb2RhbC1ib2R5LWNvbnRlbnR7CisgICAgICAgIC5iXzY7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgIH0KKworICAgIC5lbnYtZmlsZS1nZW5lcmF0aW9uLWxhYmVseworICAgICAgICAucF85OworICAgICAgICAuYm9sZDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgICB9Cit9CisKKy53LXNkYy1lbnYtZm9ybS1jb250YWluZXIgeworICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2RjZGNkOworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2RjZGNkOworICAgIGhlaWdodDogMzU2cHg7CisgICAgbWFyZ2luOiAzNXB4IDAgMTBweCAwOworCisgICAgLnctc2RjLWZvcm0geworICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIH0KKyAgICAuaS1zZGMtZm9ybS1pdGVteworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIC5kZXNjcmlwdGlvbnsKKyAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDJweDsKKyAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDMycHggMCAwIDA7CisgICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKKyAgICAgICAgICAgIC5iXzE7CisgICAgICAgIH0KKyAgICB9CisgICAgLmxlZnQtY29sdW1uLWNvbnRhaW5lcnsKKyAgICAgICAgd2lkdGg6IDI1MHB4OworICAgICAgICBmbG9hdDogbGVmdDsKKyAgICAgICAgLmktc2RjLWVudi1mb3JtLWxhYmVsIHsKKyAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisKKyAgICAgICAgICAgICYucmVxdWlyZWQ6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgY29sb3I6ICNmMzM7CisgICAgICAgICAgICAgICAgY29udGVudDogJyonOworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC5pLXNkYy1lbnYtZm9ybS1sYWJlbC1kZXNjcmlwdGlvbiB7CisgICAgICAgIGZsb2F0OiByaWdodDsKKworICAgICAgICAuaS1zZGMtZW52LWZvcm0tbGFiZWwgeworICAgICAgICAgICAgLnBfOTsKKyAgICAgICAgICAgIC8vIGhlaWdodDogMjBweDsKKyAgICAgICAgICAgIG1hcmdpbjogMzBweCAwcHggMHB4IDMwcHg7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgbWF4LXdpZHRoOiAyNDVweDsKKyAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKworICAgICAgICAgICAgJi5yZXF1aXJlZDo6YmVmb3JlIHsKKyAgICAgICAgICAgICAgICBjb2xvcjogI2YzMzsKKyAgICAgICAgICAgICAgICBjb250ZW50OiAnKic7CisgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2Vudi1wYXJhbWV0ZXJzLWZvcm0vZW52LXBhcmFtZXRlcnMtZm9ybS50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvZW52LXBhcmFtZXRlcnMtZm9ybS9lbnYtcGFyYW1ldGVycy1mb3JtLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmFlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2Vudi1wYXJhbWV0ZXJzLWZvcm0vZW52LXBhcmFtZXRlcnMtZm9ybS50cwpAQCAtMCwwICsxLDE0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVudlBhcmFtZXRlcnNGb3JtVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICAgIGlzTG9hZGluZzogYm9vbGVhbjsKKyAgICAgICAgICB0eXBlOnN0cmluZzsKKyAgICAgICAgICBoZWF0UGFyYW1ldGVyczphbnk7CisgICAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICAgIGFydGlmYWN0UmVzb3VyY2U6TW9kZWxzLkFydGlmYWN0TW9kZWw7CisgICAgICAgICAgc2F2ZUJ1dHRvbjogQXJyYXk8YW55PjsKKyAgICAgICAgICBlbnZQYXJhbWV0ZXJzTW9kYWw6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisKKyAgICAgICAgICBnZXRWYWxpZGF0aW9uUGF0dGVybih0eXBlOnN0cmluZyk6UmVnRXhwOworICAgICAgICAgIGlzSW5zdGFuY2UoKTpib29sZWFuOworICAgICAgICAgIHZhbGlkYXRlSnNvbihqc29uOnN0cmluZyk6Ym9vbGVhbjsKKyAgICAgICAgICBjbG9zZSgpOiB2b2lkOworICAgICAgICAgIHNhdmUoKTp2b2lkOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGNsYXNzIEVudlBhcmFtZXRlcnNGb3JtVmlld01vZGVsIHsKKworCisgICAgICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgICAgICckbW9kYWxJbnN0YW5jZScsCisgICAgICAgICAgICAgICAgJ2FydGlmYWN0JywKKyAgICAgICAgICAgICAgIC8vICdBcnRpZmFjdHNVdGlscycsCisgICAgICAgICAgICAgICAgJ1ZhbGlkYXRpb25VdGlscycsCisgICAgICAgICAgICAgICAgJ2NvbXBvbmVudCcKKyAgICAgICAgICAgIF07CisKKworICAgICAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUVudlBhcmFtZXRlcnNGb3JtVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTphbnksCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRtb2RhbEluc3RhbmNlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAvLyBwcml2YXRlIGFydGlmYWN0c1V0aWxzOlNkYy5VdGlscy5BcnRpZmFjdHNVdGlscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblV0aWxzOiBTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSB7CisKKworICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdXBkYXRlSW5zdGFuY2VIZWF0ID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHN1Y2Nlc3MgPShyZXNwb25zZUFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBlcnJvciA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdGYWlsZWQgdG8gbG9hZCBzYXZlIGFydGlmYWN0Jyk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LmFkZE9yVXBkYXRlSW5zdGFuY2VBcnRpZmFjdCh0aGlzLiRzY29wZS5hcnRpZmFjdFJlc291cmNlKS50aGVuKHN1Y2Nlc3MsIGVycm9yKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lbnZQYXJhbWV0ZXJzTW9kYWwgPSB0aGlzLiRtb2RhbEluc3RhbmNlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFydGlmYWN0UmVzb3VyY2U9IHRoaXMuYXJ0aWZhY3Q7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaGVhdFBhcmFtZXRlcnMgPSBhbmd1bGFyLmNvcHkodGhpcy5hcnRpZmFjdC5oZWF0UGFyYW1ldGVycyk7CisKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRWYWxpZGF0aW9uUGF0dGVybiA9ICh2YWxpZGF0aW9uVHlwZTpzdHJpbmcgLCBwYXJhbWV0ZXJUeXBlPzpzdHJpbmcpOlJlZ0V4cCA9PiB7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVmFsaWRhdGlvblV0aWxzLmdldFZhbGlkYXRpb25QYXR0ZXJuKHZhbGlkYXRpb25UeXBlLCBwYXJhbWV0ZXJUeXBlKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGVKc29uID0gKGpzb246c3RyaW5nKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIWpzb24peworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSnNvbihqc29uKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNJbnN0YW5jZSA9KCk6IGJvb2xlYW4gPT57CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRoaXMuY29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2U7CisgICAgICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2F2ZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0LmhlYXRQYXJhbWV0ZXJzID0gdGhpcy4kc2NvcGUuaGVhdFBhcmFtZXRlcnM7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAoIiIgPT09IHBhcmFtZXRlci5jdXJyZW50VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuY3VycmVudFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZighcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSAmJiBwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSA9IHBhcmFtZXRlci5kZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmlzSW5zdGFuY2UoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUluc3RhbmNlSGVhdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IHN1Y2Nlc3MgPShyZXNwb25zZUFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ0ZhaWxlZCB0byBsb2FkIHNhdmUgYXJ0aWZhY3QnKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5hZGRPclVwZGF0ZUFydGlmYWN0KHRoaXMuJHNjb3BlLmFydGlmYWN0UmVzb3VyY2UpLnRoZW4oc3VjY2VzcywgZXJyb3IpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zYXZlQnV0dG9uID0gWworICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnU2F2ZScsICdjc3MnOiAnYmx1ZScsICdjYWxsYmFjayc6IHRoaXMuJHNjb3BlLnNhdmV9CisgICAgICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNsb3NlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5hcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXI6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgaWYgKCFwYXJhbWV0ZXIuY3VycmVudFZhbHVlICYmIHBhcmFtZXRlci5kZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHBhcmFtZXRlci5jdXJyZW50VmFsdWUgPSBwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vfSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuZGlzbWlzcygpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzMyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMzMwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVkaXRQcm9wZXJ0eU1vZGVsIHsKKyAgICAgICAgcHJvcGVydHk6IE1vZGVscy5Qcm9wZXJ0eU1vZGVsOworICAgICAgICB0eXBlczogQXJyYXk8c3RyaW5nPjsKKyAgICAgICAgc2ltcGxlVHlwZXM6IEFycmF5PHN0cmluZz47CisgICAgICAgIHNvdXJjZXM6IEFycmF5PHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIElQcm9wZXJ0eUZvcm1WaWV3TW9kZWxTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIGZvcm1zOmFueTsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBmb290ZXJCdXR0b25zOiBBcnJheTxhbnk+OworICAgICAgICBpc05ldzogYm9vbGVhbjsKKyAgICAgICAgaXNMb2FkaW5nOiBib29sZWFuOworICAgICAgICBpc1NlcnZpY2U6IGJvb2xlYW47CisgICAgICAgIHZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIHByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBlZGl0UHJvcGVydHlNb2RlbDogSUVkaXRQcm9wZXJ0eU1vZGVsOworICAgICAgICBtb2RhbEluc3RhbmNlUHJvcGVydHk6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZTsKKyAgICAgICAgY3VycmVudFByb3BlcnR5SW5kZXg6bnVtYmVyOworICAgICAgICBpc0xhc3RQcm9wZXJ0eTpib29sZWFuOworICAgICAgICBteVZhbHVlOmFueTsKKyAgICAgICAgbm9uUHJpbWl0aXZlVHlwZXM6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgZGF0YVR5cGVzOk1vZGVscy5EYXRhVHlwZXNNYXA7CisgICAgICAgIGlzVHlwZURhdGFUeXBlOmJvb2xlYW47CisgICAgICAgIG1heExlbmd0aDpudW1iZXI7CisKKyAgICAgICAgc2F2ZShkb05vdENsb3NlTW9kYWw/OmJvb2xlYW4pOiB2b2lkOworICAgICAgICBnZXRWYWxpZGF0aW9uUGF0dGVybih0eXBlOnN0cmluZyk6IFJlZ0V4cDsKKyAgICAgICAgdmFsaWRhdGVJbnRSYW5nZSh2YWx1ZTpzdHJpbmcpOmJvb2xlYW47CisgICAgICAgIGNsb3NlKCk6IHZvaWQ7CisgICAgICAgIG9uVmFsdWVDaGFuZ2UoKTogdm9pZDsKKyAgICAgICAgb25TY2hlbWFUeXBlQ2hhbmdlKCk6dm9pZDsKKyAgICAgICAgb25UeXBlQ2hhbmdlKHJlc2V0U2NoZW1hOmJvb2xlYW4pOiB2b2lkOworICAgICAgICBpc1Byb3BlcnR5VmFsdWVPd25lcigpOmJvb2xlYW47CisgICAgICAgIHNob3dTY2hlbWEoKTogYm9vbGVhbjsKKyAgICAgICAgZGVsZXRlKHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTogdm9pZDsKKyAgICAgICAgZ2V0UHJldigpOiB2b2lkOworICAgICAgICBnZXROZXh0KCk6IHZvaWQ7CisgICAgICAgIGlzU2ltcGxlVHlwZSh0eXBlTmFtZTpzdHJpbmcpOmJvb2xlYW47CisgICAgICAgIGdldERlZmF1bHRWYWx1ZSgpOmFueTsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUHJvcGVydHlGb3JtVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkRhdGFUeXBlc1NlcnZpY2UnLAorICAgICAgICAgICAgJyRtb2RhbEluc3RhbmNlJywKKyAgICAgICAgICAgICdwcm9wZXJ0eScsCisgICAgICAgICAgICAnVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ1Byb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdDb21tZW50VmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25VdGlscycsCisgICAgICAgICAgICAnY29tcG9uZW50JywKKyAgICAgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJywKKyAgICAgICAgICAgICdmaWx0ZXJlZFByb3BlcnRpZXMnLAorICAgICAgICAgICAgJyR0aW1lb3V0JworICAgICAgICBdOworCisgICAgICAgIHByaXZhdGUgZm9ybVN0YXRlOiBTZGMuVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJUHJvcGVydHlGb3JtVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgRGF0YVR5cGVzU2VydmljZTpTZGMuU2VydmljZXMuRGF0YVR5cGVzU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHByb3BlcnR5OiBNb2RlbHMuUHJvcGVydHlNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgUHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm46IFJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb21tZW50VmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25VdGlsczpTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTW9kYWxzSGFuZGxlcjpVdGlscy5Nb2RhbHNIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGZpbHRlcmVkUHJvcGVydGllczogQXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0aW1lb3V0OiBuZy5JVGltZW91dFNlcnZpY2UpIHsKKworICAgICAgICAgICAgdGhpcy5mb3JtU3RhdGUgPSBhbmd1bGFyLmlzRGVmaW5lZChwcm9wZXJ0eS5uYW1lKSA/ICBVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlLlVQREFURSA6ICBVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlLkNSRUFURTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRSZXNvdXJjZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkgPSBuZXcgU2RjLk1vZGVscy5Qcm9wZXJ0eU1vZGVsKHRoaXMucHJvcGVydHkpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSA9IHRoaXMucHJvcGVydHkudHlwZT8gdGhpcy5wcm9wZXJ0eS50eXBlOiBudWxsOworICAgICAgICAgICAgdGhpcy5zZXRNYXhMZW5ndGgoKTsKKyAgICAgICAgICAgIC8vIGlmICh0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC50eXBlcy5pbmRleE9mKHRoaXMucHJvcGVydHkudHlwZSkgPT09IC0xICYmICF0aGlzLiRzY29wZS5pc05ldykgeworICAgICAgICAgICAgLy8gICAgIHRoaXMucHJvcGVydHkudHlwZSA9ICJzdHJpbmciOworICAgICAgICAgICAgLy8gfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdEVkaXRQcm9wZXJ0eU1vZGVsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbCA9IHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eTogbnVsbCwKKyAgICAgICAgICAgICAgICB0eXBlczogVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX0RBVEEuVFlQRVMsCisgICAgICAgICAgICAgICAgc2ltcGxlVHlwZXM6IFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9EQVRBLlNJTVBMRV9UWVBFUywKKyAgICAgICAgICAgICAgICBzb3VyY2VzOiBVdGlscy5Db25zdGFudHMuUFJPUEVSVFlfREFUQS5TT1VSQ0VTCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLmluaXRSZXNvdXJjZSgpOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdEZvck5vdFNpbXBsZVR5cGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBwcm9wZXJ0eSA9IHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNUeXBlRGF0YVR5cGU9dGhpcy5EYXRhVHlwZXNTZXJ2aWNlLmlzRGF0YVR5cGVGb3JQcm9wZXJ0eVR5cGUodGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHksdGhpcy4kc2NvcGUuZGF0YVR5cGVzKTsKKyAgICAgICAgICAgIGlmKHByb3BlcnR5LnR5cGUgJiYgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwuc2ltcGxlVHlwZXMuaW5kZXhPZihwcm9wZXJ0eS50eXBlKT09LTEpeworICAgICAgICAgICAgICAgIGlmKCEocHJvcGVydHkudmFsdWV8fHByb3BlcnR5LmRlZmF1bHRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS50eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9UWVBFUy5NQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubXlWYWx1ZSA9IHsnJzpudWxsfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1RZUEVTLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubXlWYWx1ZSA9IFtdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5teVZhbHVlID0ge307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubXlWYWx1ZSA9IEpTT04ucGFyc2UocHJvcGVydHkudmFsdWV8fHByb3BlcnR5LmRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc2V0TWF4TGVuZ3RoID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9UWVBFUy5NQVA6CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuUFJPUEVSVFlfVFlQRVMuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubWF4TGVuZ3RoID0gdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGUgPT0gVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1RZUEVTLkpTT04/CisgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5Db25zdGFudHMuUFJPUEVSVFlfVkFMVUVfQ09OU1RSQUlOVFMuSlNPTl9NQVhfTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1ZBTFVFX0NPTlNUUkFJTlRTLk1BWF9MRU5HVEg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1RZUEVTLkpTT046CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1heExlbmd0aCA9IFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9WQUxVRV9DT05TVFJBSU5UUy5KU09OX01BWF9MRU5HVEg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1heExlbmd0aCA9IFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9WQUxVRV9DT05TVFJBSU5UUy5NQVhfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgLy9zY29wZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICB0aGlzLiRzY29wZS5mb3JtcyA9IHt9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLlZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLlByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Db21tZW50VmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTmV3ID0gKHRoaXMuZm9ybVN0YXRlID09PSBVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlLkNSRUFURSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1NlcnZpY2UgPSB0aGlzLmNvbXBvbmVudC5pc1NlcnZpY2UoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsSW5zdGFuY2VQcm9wZXJ0eSA9IHRoaXMuJG1vZGFsSW5zdGFuY2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50UHJvcGVydHlJbmRleCA9IF8uZmluZEluZGV4KHRoaXMuZmlsdGVyZWRQcm9wZXJ0aWVzLCBpPT4gaS5uYW1lID09IHRoaXMucHJvcGVydHkubmFtZSApOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMYXN0UHJvcGVydHk9IHRoaXMuJHNjb3BlLmN1cnJlbnRQcm9wZXJ0eUluZGV4PT0odGhpcy5maWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoLTEpOworCisgICAgICAgICAgICB0aGlzLmluaXRFZGl0UHJvcGVydHlNb2RlbCgpOworCisgICAgICAgICAgICB0aGlzLkRhdGFUeXBlc1NlcnZpY2UuZ2V0QWxsRGF0YVR5cGVzKCkudGhlbigocmVzcG9uc2U6YW55KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGF0YVR5cGVzID0gcmVzcG9uc2U7CisgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlWyd0b3NjYS5kYXRhdHlwZXMuUm9vdCddOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm5vblByaW1pdGl2ZVR5cGVzID1fLmZpbHRlcihPYmplY3Qua2V5cyhyZXNwb25zZSksKHR5cGU6c3RyaW5nKT0+eworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwudHlwZXMuaW5kZXhPZih0eXBlKT09LTE7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0Rm9yTm90U2ltcGxlVHlwZSgpOworICAgICAgICAgICAgfSwgKGVycik9PiB7fSk7CisKKworCisKKworICAgICAgICAgICAgLy9zY29wZSBtZXRob2RzCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zYXZlID0gKGRvTm90Q2xvc2VNb2RhbD86Ym9vbGVhbik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsID0gdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkuZGVzY3JpcHRpb24gPSB0aGlzLlZhbGlkYXRpb25VdGlscy5zdHJpcEFuZFNhbml0aXplKHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAvLy8vaWYgcmVhZCBvbmx5IC0ganVzdCBjbG9zZXMgdGhlIG1vZGFsCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnJlYWRvbmx5ICYmICF0aGlzLiRzY29wZS5pc1Byb3BlcnR5VmFsdWVPd25lcigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBsZXQgb25Qcm9wZXJ0eUZhaWxkID0gKHJlc3BvbnNlKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvbkZhaWxkJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uUHJvcGVydHlTdWNjZXNzID0gKHByb3BlcnR5RnJvbUJFOk1vZGVscy5Qcm9wZXJ0eU1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvblByb3BlcnR5UmVzb3VyY2VTdWNjZXNzIDogJywgcHJvcGVydHlGcm9tQkUpOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWRvTm90Q2xvc2VNb2RhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWxJbnN0YW5jZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9ybXMuZWRpdEZvcm0uJHNldFByaXN0aW5lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eSA9IG5ldyBNb2RlbHMuUHJvcGVydHlNb2RlbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIC8vaW4gY2FzZSB3ZSBoYXZlIHVuaXF1ZUlkIHdlIGNhbGwgdXBkYXRlIG1ldGhvZAorICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5pc1Byb3BlcnR5VmFsdWVPd25lcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5zaW1wbGVUeXBlICYmICF0aGlzLiRzY29wZS5pc1NpbXBsZVR5cGUocHJvcGVydHkudHlwZSkpeworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG15VmFsdWVTdHJpbmc6c3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy4kc2NvcGUubXlWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS52YWx1ZSA9IG15VmFsdWVTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlSW5zdGFuY2VQcm9wZXJ0eShwcm9wZXJ0eSkudGhlbihvblByb3BlcnR5U3VjY2Vzcywgb25Qcm9wZXJ0eUZhaWxkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZighdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkuc2ltcGxlVHlwZSAmJiAhdGhpcy4kc2NvcGUuaXNTaW1wbGVUeXBlKHByb3BlcnR5LnR5cGUpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBteVZhbHVlU3RyaW5nOnN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuJHNjb3BlLm15VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVmYXVsdFZhbHVlID0gbXlWYWx1ZVN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWUgPSB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5hZGRPclVwZGF0ZVByb3BlcnR5KHByb3BlcnR5KS50aGVuKG9uUHJvcGVydHlTdWNjZXNzLCBvblByb3BlcnR5RmFpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNQcm9wZXJ0eVZhbHVlT3duZXIgPSAoKTpib29sZWFuPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5pc1NlcnZpY2UoKSB8fCAhIXRoaXMuY29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRQcmV2ID0gKCk6dm9pZD0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5ID0gdGhpcy5maWx0ZXJlZFByb3BlcnRpZXNbLS10aGlzLiRzY29wZS5jdXJyZW50UHJvcGVydHlJbmRleF07CisgICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzb3VyY2UoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmluaXRGb3JOb3RTaW1wbGVUeXBlKCk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMYXN0UHJvcGVydHk9ZmFsc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXROZXh0ID0gKCk6dm9pZD0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5ID0gdGhpcy5maWx0ZXJlZFByb3BlcnRpZXNbKyt0aGlzLiRzY29wZS5jdXJyZW50UHJvcGVydHlJbmRleF07CisgICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzb3VyY2UoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmluaXRGb3JOb3RTaW1wbGVUeXBlKCk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMYXN0UHJvcGVydHk9IHRoaXMuJHNjb3BlLmN1cnJlbnRQcm9wZXJ0eUluZGV4PT0odGhpcy5maWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoLTEpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNTaW1wbGVUeXBlID0gKHR5cGVOYW1lOnN0cmluZyk6Ym9vbGVhbj0+eworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTmFtZSAmJiB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5zaW1wbGVUeXBlcy5pbmRleE9mKHR5cGVOYW1lKSE9LTE7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zaG93U2NoZW1hID0gKCkgOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBbVXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1RZUEVTLkxJU1QsIFV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9UWVBFUy5NQVBdLmluZGV4T2YodGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSkgPiAtMTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFZhbGlkYXRpb25QYXR0ZXJuID0gKHR5cGU6c3RyaW5nKTpSZWdFeHAgPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZhbGlkYXRpb25VdGlscy5nZXRWYWxpZGF0aW9uUGF0dGVybih0eXBlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRlSW50UmFuZ2UgPSAodmFsdWU6c3RyaW5nKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIXZhbHVlIHx8IHRoaXMuVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSW50UmFuZ2UodmFsdWUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2xvc2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBwdXQgZGVmYXVsdCB2YWx1ZSB3aGVuIGluc3RhbmNlIHZhbHVlIGlzIGVtcHR5CisgICAgICAgICAgICB0aGlzLiRzY29wZS5vblZhbHVlQ2hhbmdlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudmFsdWUgPSB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBBZGQgdGhlIGRvbmUgYnV0dG9uIGF0IHRoZSBmb290ZXIuCisgICAgICAgICAgICB0aGlzLiRzY29wZS5mb290ZXJCdXR0b25zID0gWworICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdTYXZlJywgJ2Nzcyc6ICdibHVlJywgJ2NhbGxiYWNrJzogdGhpcy4kc2NvcGUuc2F2ZSB9LAorICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdDYW5jZWwnLCAnY3NzJzogJ2dyZXknLCAnY2FsbGJhY2snOnRoaXMuJHNjb3BlLmNsb3NlIH0KKyAgICAgICAgICAgIF07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLiR3YXRjaCgiZm9ybXMuZWRpdEZvcm0uJGludmFsaWQiLCAobmV3VmFsLCBvbGRWYWwpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5mb290ZXJCdXR0b25zWzBdLmRpc2FibGVkID0gdGhpcy4kc2NvcGUuZm9ybXMuZWRpdEZvcm0uJGludmFsaWQ7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0RGVmYXVsdFZhbHVlID0gKCk6YW55ID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSA/IHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlZmF1bHRWYWx1ZSA6IG51bGw7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vblR5cGVDaGFuZ2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS52YWx1ZSA9ICcnOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlZmF1bHRWYWx1ZSA9ICcnOworICAgICAgICAgICAgICAgIHRoaXMuc2V0TWF4TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0Rm9yTm90U2ltcGxlVHlwZSgpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25TY2hlbWFUeXBlQ2hhbmdlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZT09VXRpbHMuQ29uc3RhbnRzLlBST1BFUlRZX1RZUEVTLk1BUCl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm15VmFsdWU9eycnOm51bGx9OworICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnR5cGU9PVV0aWxzLkNvbnN0YW50cy5QUk9QRVJUWV9UWVBFUy5MSVNUKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubXlWYWx1ZT1bXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5zZXRNYXhMZW5ndGgoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlbGV0ZSA9IChwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuZGVsZXRlUHJvcGVydHkocHJvcGVydHkudW5pcXVlSWQpLnRoZW4oCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jbG9zZQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGV0IHRpdGxlOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlBST1BFUlRZX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIik7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U6c3RyaW5nID0gdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiUFJPUEVSVFlfVklFV19ERUxFVEVfTU9EQUxfVEVYVCIsICJ7J25hbWUnOiAnIiArIHByb3BlcnR5Lm5hbWUgKyAiJ30iKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBtZXNzYWdlLCBmYWxzZSkudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5M2Q0NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLXZpZXcuaHRtbApAQCAtMCwwICsxLDIxOSBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZVByb3BlcnR5IiB0eXBlPSJjbGFzc2ljIiBjbGFzcz0ic2RjLWVkaXQtcHJvcGVydHktY29udGFpbmVyIiBidXR0b25zPSJmb290ZXJCdXR0b25zIiBoZWFkZXI9Int7aXNOZXcgPyAnQWRkJyA6ICdVcGRhdGUnIH19IFByb3BlcnR5IiBzaG93LWNsb3NlLWJ1dHRvbj0idHJ1ZSIgZGF0YS10ZXN0cy1pZD0ic2RjLWVkaXQtcHJvcGVydHktY29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJzZGMtbW9kYWwtdG9wLWJhciIgZGF0YS1uZy1pZj0iIWlzTmV3Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0ic2RjLW1vZGFsLXRvcC1iYXItYnV0dG9ucyI+CisgICAgICAgICAgICA8c3BhbiBuZy1jbGljaz0iZGVsZXRlKGVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5KSIgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCcgOiBpc1Byb3BlcnR5VmFsdWVPd25lcigpfHxlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seX0iIGNsYXNzPSJzcHJpdGUtbmV3IGRlbGV0ZS1idG4iIGRhdGEtdGVzdHMtaWQ9ImRlbGV0ZV9wcm9wZXJ0eSIgIHNkYy1zbWFydC10b29sdGlwPSIiPkRlbGV0ZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWxpbWl0ZXIiPjwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctY2xpY2s9ImdldFByZXYoKSIgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCcgOiAhY3VycmVudFByb3BlcnR5SW5kZXggfSIgY2xhc3M9InNwcml0ZS1uZXcgbGVmdC1hcnJvdyIgZGF0YS10ZXN0cy1pZD0iZ2V0LXByZXYiIHNkYy1zbWFydC10b29sdGlwPSIiPlByZXZpb3VzPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1jbGljaz0iZ2V0TmV4dCgpIiBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJyA6IGlzTGFzdFByb3BlcnR5IH0iIGNsYXNzPSJzcHJpdGUtbmV3IHJpZ2h0LWFycm93IiBkYXRhLXRlc3RzLWlkPSJnZXQtbmV4dCIgc2RjLXNtYXJ0LXRvb2x0aXA9IiI+TmV4dDwvc3Bhbj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJzZGMtZWRpdC1wcm9wZXJ0eS1mb3JtLWNvbnRhaW5lciIgPgorICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc2Nyb2xsLXktbWFyZ2luLW9mZnNldD0iMCIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisgICAgICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIGNsYXNzPSJ3LXNkYy1mb3JtIHR3by1jb2x1bW5zIiBuYW1lPSJmb3Jtcy5lZGl0Rm9ybSIgPgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW5zLXdyYXBwZXIiPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLnByb3BlcnR5TmFtZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0ucHJvcGVydHlOYW1lLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCIgbmctY2xhc3M9InsncmVxdWlyZWQnOiAhaXNTZXJ2aWNlfSI+TmFtZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJwcm9wZXJ0eU5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSI1MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iIWlzTmV3IHx8IGVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnJlYWRvbmx5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjUwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5uYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9wZXJ0eU5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0icHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5wcm9wZXJ0eU5hbWUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnByb3BlcnR5TmFtZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnByb3BlcnR5TmFtZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdQcm9wZXJ0eSBuYW1lJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnByb3BlcnR5TmFtZS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMTI4JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnByb3BlcnR5TmFtZS4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgc291cmNlIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLnNvdXJjZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0uc291cmNlLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+SW5wdXQgU291cmNlPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1vcHRpb25zPSJzb3VyY2UgZm9yIHNvdXJjZSBpbiBlZGl0UHJvcGVydHlNb2RlbC5zb3VyY2VzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIiA+Q2hvb3NlIElucHV0IFNvdXJjZTwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtZXJyb3ItdG9vbHRpcCBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnNvdXJjZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0uc291cmNlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uc291cmNlLiRlcnJvci5yZXF1aXJlZCI+c291cmNlICBpcyByZXF1aXJlZC48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZGMtZXJyb3ItdG9vbHRpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2LS0+CisKKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbnMtd3JhcHBlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFR5cGUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0udHlwZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udHlwZS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCIgbmctY2xhc3M9InsncmVxdWlyZWQnOiAhaXNTZXJ2aWNlfSI+VHlwZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0icHJvcGVydHlUeXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9ImlzUHJvcGVydHlWYWx1ZU93bmVyKCkgfHwgZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkucmVhZG9ubHkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJvblR5cGVDaGFuZ2UoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5DaG9vc2UgVHlwZTwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1uZy1yZXBlYXQ9InR5cGUgaW4gZWRpdFByb3BlcnR5TW9kZWwudHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ie3t0eXBlfX0iPnt7dHlwZX19PC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkYXRhLW5nLXJlcGVhdD0idHlwZSBpbiBub25QcmltaXRpdmVUeXBlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ7e3R5cGV9fSI+e3t0eXBlLnJlcGxhY2UoIm9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuIiwiIil9fTwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnR5cGUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnR5cGUuJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnR5cGUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnVHlwZScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIiBkYXRhLW5nLWlmPSJzaG93U2NoZW1hKCkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVudHJ5IFNjaGVtYSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLnNjaGVtYVR5cGUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnNjaGVtYVR5cGUuJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPkVudHJ5IFNjaGVtYTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJzY2hlbWEtdHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSB8fCBlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2NoZW1hVHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9Im9uU2NoZW1hVHlwZUNoYW5nZSgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5zY2hlbWEucHJvcGVydHkudHlwZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5DaG9vc2UgU2NoZW1hIFR5cGU8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtbmctcmVwZWF0PSJ0eXBlIGluIGVkaXRQcm9wZXJ0eU1vZGVsLnNpbXBsZVR5cGVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Int7dHlwZX19Ij57e3R5cGV9fTwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1uZy1yZXBlYXQ9InR5cGUgaW4gbm9uUHJpbWl0aXZlVHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ie3t0eXBlfX0iPnt7dHlwZS5yZXBsYWNlKCJvcmcub3BlbmVjb21wLmRhdGF0eXBlcy5oZWF0LiIsIiIpfX08L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5zY2hlbWFUeXBlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5zY2hlbWFUeXBlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5zY2hlbWFUeXBlLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1JFUVVJUkVEIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J2ZpZWxkJzogJ0VudHJ5IHNjaGVtYScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29uc3RyYWludHMgYnkgdHlwZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1pZj0iZmFsc2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+Q29uc3RyYWludHMgYnkgdHlwZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIGNvbnN0cmFpbnRzIGJ5IHR5cGUoVEJEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8IS0tIERlc2NyaXB0aW9uIC0tPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCI+RGVzY3JpcHRpb248L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSAgY2xhc3M9Imktc2RjLWZvcm0tdGV4dGFyZWEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSB8fCBlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJjb21tZW50VmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjU2JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1JFUVVJUkVEIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J2ZpZWxkJzogJ0Rlc2NyaXB0aW9uJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwhLS0gRGVmYXVsdCB2YWx1ZSAtLT4KKworICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0iZGF0YVR5cGVzIiBjbGFzcz0iZGVmYXVsdC12YWx1ZS1zZWN0aW9uIGktc2RjLWZvcm0taXRlbSI+CisgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCI+RGVmYXVsdCBWYWx1ZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0iaXNUeXBlRGF0YVR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkcy1zdHJ1Y3R1cmUgdmFsdWUtb2JqLXJlZj0ibXlWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtbmFtZT0iZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC1mb3JtLW9iaj0iZm9ybXMuZWRpdEZvcm0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMtcHJlZml4LW5hbWU9ImN1cnJlbnRQcm9wZXJ0eUluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5PSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seSAmJiAhaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQtdmFsdWU9Int7Z2V0RGVmYXVsdFZhbHVlKCl9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzPSJkYXRhVHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQtYnktZGVmYXVsdD0idHJ1ZSI+PC9maWVsZHMtc3RydWN0dXJlPgorCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctaWY9IiFpc1R5cGVEYXRhVHlwZSIgbmctc3dpdGNoPSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS50eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctc3dpdGNoLXdoZW49Im1hcCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGUtbWFwIHZhbHVlLW9iai1yZWY9Im15VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEtcHJvcGVydHk9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC1mb3JtLW9iaj0iZm9ybXMuZWRpdEZvcm0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMtcHJlZml4LW5hbWU9ImN1cnJlbnRQcm9wZXJ0eUluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5PSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seSAmJiAhaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQtdmFsdWU9Int7Z2V0RGVmYXVsdFZhbHVlKCl9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzPSJkYXRhVHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgtbGVuZ3RoPSJtYXhMZW5ndGgiPjwvdHlwZS1tYXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctc3dpdGNoLXdoZW49Imxpc3QiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlLWxpc3QgdmFsdWUtb2JqLXJlZj0ibXlWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEtcHJvcGVydHk9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtZm9ybS1vYmo9ImZvcm1zLmVkaXRGb3JtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy1wcmVmaXgtbmFtZT0iY3VycmVudFByb3BlcnR5SW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZC1vbmx5PSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seSAmJiAhaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LXZhbHVlPSJ7e2dldERlZmF1bHRWYWx1ZSgpfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM9ImRhdGFUeXBlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgtbGVuZ3RoPSJtYXhMZW5ndGgiPjwvdHlwZS1saXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLXN3aXRjaC1kZWZhdWx0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udmFsdWUuJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlZmF1bHR2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWlmPSIhKChlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5zaW1wbGVUeXBlfHxlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS50eXBlKSA9PSAnYm9vbGVhbicpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9Im1heExlbmd0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnJlYWRvbmx5ICYmICFpc1Byb3BlcnR5VmFsdWVPd25lcigpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSJ7e21heExlbmd0aH19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49ImdldFZhbGlkYXRpb25QYXR0ZXJuKChlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5zaW1wbGVUeXBlfHxlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS50eXBlKSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9IiFmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kZXJyb3IucGF0dGVybiAmJiAoJ2ludGVnZXInPT1lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS50eXBlICYmIGZvcm1zLmVkaXRGb3JtLnZhbHVlLiRzZXRWYWxpZGl0eSgncGF0dGVybicsIHZhbGlkYXRlSW50UmFuZ2UoZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudmFsdWUpKSB8fCBvblZhbHVlQ2hhbmdlKCkpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9Imktc2RjLWZvcm0tc2VsZWN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImJvb2xlYW50eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWlmPSIoZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkuc2ltcGxlVHlwZXx8ZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSkgPT0gJ2Jvb2xlYW4nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnJlYWRvbmx5ICYmICFpc1Byb3BlcnR5VmFsdWVPd25lcigpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJvblZhbHVlQ2hhbmdlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudmFsdWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idHJ1ZSI+dHJ1ZTwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZmFsc2UiPmZhbHNlPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnZhbHVlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdQcm9wZXJ0eScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udmFsdWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJ3t7bWF4TGVuZ3RofX0nIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnZhbHVlLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlBST1BFUlRZX0VESVRfUEFUVEVSTiI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udmFsdWUuJGVycm9yLmN1c3RvbVZhbGlkYXRpb24iIHRyYW5zbGF0ZT0iUFJPUEVSVFlfRURJVF9NQVBfVU5JUVVFX0tFWVMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPHNwYW4gIGNsYXNzPSJ3LXNkYy1mb3JtLW5vdGUiICBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLiRpbnZhbGlkICYmIGZhbHNlIiB0cmFuc2xhdGU9IkxBQkVMX0FMTF9GSUVMRFNfQVJFX01BTkRBVE9SWSI+PC9zcGFuPgorICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgIDwvZGl2PgorCis8L3NkYy1tb2RhbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTMwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS5sZXNzCkBAIC0wLDAgKzEsNjMgQEAKKy5zZGMtZWRpdC1wcm9wZXJ0eS1jb250YWluZXIgeworICAgIC5zY3JvbGxiYXItY29udGFpbmVyeworICAgICAgICBoZWlnaHQ6IDQxNXB4OworICAgICAgICB3aWR0aDogODMwcHg7CisgICAgICAgIC5wZXJmZWN0LXNjcm9sbGJhcjsKKyAgICB9CisKKyAgICBmb3JteworICAgICAgICB3aWR0aDogODEzcHg7CisgICAgICAgIFtuYW1lPSJkZXNjcmlwdGlvbiJdeworICAgICAgICAgICAgbWluLWhlaWdodDo1MHB4OworICAgICAgICB9CisgICAgfQorCisgICAgLnNkYy1tb2RhbC10b3AtYmFyeworICAgICAgICBoZWlnaHQ6IDQwcHg7CisgICAgICAgIC5zZGMtbW9kYWwtdG9wLWJhci1idXR0b25zIHsKKyAgICAgICAgICAgIGZsb2F0OiByaWdodDsKKworICAgICAgICAgICAgPiBzcGFuOm5vdCguZGVsaW1pdGVyKXsKKyAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgICAgICAgICAgICAgIC5oYW5kOworCisgICAgICAgICAgICAgICAgJi5zcHJpdGUtbmV3IHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC1pbmRlbnQ6IDEwMCU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICYuZGlzYWJsZWQsICY6aG92ZXIuZGlzYWJsZWQgeworICAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5kZWxldGUtYnRueworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNnB4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAubGVmdC1hcnJvd3sKKyAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmRlbGltaXRlciB7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAyMHB4OworICAgICAgICAgICAgICAgIHdpZHRoOiAxcHg7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk1OTU5NTsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAudy1zZGMtZm9ybS1ub3RlIHsKKyAgICAgICAgLmhfOTsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiAxM3B4OworICAgIH0KKworICAgIC5kZWZhdWx0LXZhbHVlLXNlY3Rpb257CisgICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCBAbWFpbl9jb2xvcl9hOworICAgICAgICBwYWRkaW5nLXRvcDogMTVweDsKKyAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Jlc291cmNlLWluc3RhbmNlLW5hbWUtZm9ybS9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjliZjRhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS1tb2RlbC50cwpAQCAtMCwwICsxLDEwNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSVJlc291cmNlSW5zdGFuY2VWaWV3TW9kZWxTY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisKKyAgICAgICAgY29tcG9uZW50SW5zdGFuY2VNb2RlbDogU2RjLk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlOworICAgICAgICB2YWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBvbGROYW1lOnN0cmluZzsKKyAgICAgICAgaXNBbHJlYWR5UHJlc3NlZDpib29sZWFuOworICAgICAgICBmb290ZXJCdXR0b25zOiBBcnJheTxhbnk+OworICAgICAgICBmb3Jtczphbnk7CisgICAgICAgIG1vZGFsSW5zdGFuY2VOYW1lOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisKKyAgICAgICAgc2F2ZSgpOiB2b2lkOworICAgICAgICBjbG9zZSgpOiB2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBSZXNvdXJjZUluc3RhbmNlTmFtZVZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICckbW9kYWxJbnN0YW5jZScsCisgICAgICAgICAgICAnQ29tcG9uZW50SW5zdGFuY2VGYWN0b3J5JywKKyAgICAgICAgICAgICdjb21wb25lbnQnCisgICAgICAgIF07CisKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJUmVzb3VyY2VJbnN0YW5jZVZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEluc3RhbmNlRmFjdG9yeTpVdGlscy5Db21wb25lbnRJbnN0YW5jZUZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgeworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9ybXMgPSB7fTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5WYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudEluc3RhbmNlTW9kZWwgPSBVdGlscy5Db21wb25lbnRJbnN0YW5jZUZhY3RvcnkuY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UodGhpcy5jb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5vbGROYW1lID0gdGhpcy5jb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS5uYW1lOworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kYWxJbnN0YW5jZU5hbWUgPSB0aGlzLiRtb2RhbEluc3RhbmNlOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0FscmVhZHlQcmVzc2VkID0gZmFsc2U7CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2xvc2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmRpc21pc3MoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNhdmUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNBbHJlYWR5UHJlc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoY29tcG9uZW50SW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWxJbnN0YW5jZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0FscmVhZHlQcmVzc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudEluc3RhbmNlTW9kZWwgPSBjb21wb25lbnRJbnN0YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgLy90aGlzLmNvbXBvbmVudC5uYW1lID0gY29tcG9uZW50SW5zdGFuY2UubmFtZTsvL0RFMjE5MTI0CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2UubmFtZSA9IGNvbXBvbmVudEluc3RhbmNlLm5hbWU7CisKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNBbHJlYWR5UHJlc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLm9sZE5hbWUgIT0gdGhpcy4kc2NvcGUuY29tcG9uZW50SW5zdGFuY2VNb2RlbC5uYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMuJHNjb3BlLmNvbXBvbmVudEluc3RhbmNlTW9kZWwpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9ucyA9IFsKKyAgICAgICAgICAgICAgICB7J25hbWUnOiAnT0snLCAnY3NzJzogJ2JsdWUnLCAnY2FsbGJhY2snOiB0aGlzLiRzY29wZS5zYXZlLCAnZGlzYWJsZWQnOiAoIXRoaXMuJHNjb3BlLmNvbXBvbmVudEluc3RhbmNlTW9kZWwubmFtZSB8fCB0aGlzLiRzY29wZS5jb21wb25lbnRJbnN0YW5jZU1vZGVsLm5hbWUgPT09IHRoaXMuJHNjb3BlLm9sZE5hbWUpIHx8IHRoaXMuJHNjb3BlLmlzQWxyZWFkeVByZXNzZWR9LAorICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdDYW5jZWwnLCAnY3NzJzogJ2dyZXknLCAnY2FsbGJhY2snOiB0aGlzLiRzY29wZS5jbG9zZX0KKyAgICAgICAgICAgIF07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLiR3YXRjaCgiZm9ybXMuZWRpdE5hbWVGb3JtLiRpbnZhbGlkIiwgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9uc1swXS5kaXNhYmxlZCA9IHRoaXMuJHNjb3BlLmZvcm1zLmVkaXROYW1lRm9ybS4kaW52YWxpZDsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Jlc291cmNlLWluc3RhbmNlLW5hbWUtZm9ybS9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQzNDNhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS12aWV3Lmh0bWwKQEAgLTAsMCArMSw3MiBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZU5hbWUiIHR5cGU9ImNsYXNzaWMiIGNsYXNzPSJ3LXNkYy1tb2RhbC1yZXNvdXJjZS1pbnN0YW5jZS1uYW1lIG1vZGFsLXR5cGUtY29uZmlybWF0aW9uIiBidXR0b25zPSJmb290ZXJCdXR0b25zIiBoZWFkZXI9Ikluc3RhbmNlIE5hbWUiIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIj4KKworICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9Inctc2RjLWZvcm0iIG5hbWU9ImZvcm1zLmVkaXROYW1lRm9ybSI+CisgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihlZGl0TmFtZUZvcm0uY29tcG9uZW50SW5zdGFuY2VOYW1lLiRkaXJ0eSAmJiBlZGl0TmFtZUZvcm0ucmVzb3VyY2VJbnN0YW5jZU5hbWUuJGludmFsaWQpfSI+CisgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPkluc3RhbmNlIE5hbWU8L2xhYmVsPgorICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJ3LXNkYy1tb2RhbC1yZXNvdXJjZS1pbnN0YW5jZS1pbnB1dCBpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbXBvbmVudEluc3RhbmNlTmFtZSIKKyAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iNTAiCisgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iY29tcG9uZW50SW5zdGFuY2VNb2RlbC5uYW1lIgorICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSI1MCIKKyAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXMKKyAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iRW50ZXIgaW5zdGFuY2UgbmFtZS4uLiIKKyAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJpbnN0YW5jZU5hbWUiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdE5hbWVGb3JtLmNvbXBvbmVudEluc3RhbmNlTmFtZS4kZGlydHkgJiYgZm9ybXMuZWRpdE5hbWVGb3JtLmNvbXBvbmVudEluc3RhbmNlTmFtZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdE5hbWVGb3JtLmNvbXBvbmVudEluc3RhbmNlTmFtZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdSZXNvdXJjZSBuYW1lJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdE5hbWVGb3JtLmNvbXBvbmVudEluc3RhbmNlTmFtZS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnNTAnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0TmFtZUZvcm0uY29tcG9uZW50SW5zdGFuY2VOYW1lLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9mb3JtPgorCis8L3NkYy1tb2RhbD4KKworCisKKzwhLS0KKworPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwgdy1zZGMtbW9kYWwtcmVzb3VyY2UtaW5zdGFuY2UtbmFtZSI+CisgICAgPGhlYWRlcj4KKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtaGVhZCI+CisgICAgICAgICAgICBJbnN0YW5jZSBOYW1lCisgICAgICAgIDwvZGl2PgorICAgIDwvaGVhZGVyPgorICAgIDxkaXY+CisgICAgICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9Inctc2RjLW1vZGFsLWJvZHkgdy1zZGMtZm9ybSIgbmFtZT0iZWRpdE5hbWVGb3JtIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihlZGl0TmFtZUZvcm0uY29tcG9uZW50SW5zdGFuY2VOYW1lLiRkaXJ0eSAmJiBlZGl0TmFtZUZvcm0ucmVzb3VyY2VJbnN0YW5jZU5hbWUuJGludmFsaWQpfSI+CisgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5JbnN0YW5jZSBOYW1lPC9sYWJlbD4KKyAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Inctc2RjLW1vZGFsLXJlc291cmNlLWluc3RhbmNlLWlucHV0IGktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbXBvbmVudEluc3RhbmNlTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjUwIgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJjb21wb25lbnRJbnN0YW5jZU1vZGVsLm5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJ2YWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSI1MCIKKyAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzCisgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJFbnRlciBpbnN0YW5jZSBuYW1lLi4uIgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJpbnN0YW5jZU5hbWUiCisgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJlZGl0TmFtZUZvcm0uY29tcG9uZW50SW5zdGFuY2VOYW1lLiRkaXJ0eSAmJiBlZGl0TmFtZUZvcm0uY29tcG9uZW50SW5zdGFuY2VOYW1lLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdE5hbWVGb3JtLmNvbXBvbmVudEluc3RhbmNlTmFtZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdSZXNvdXJjZSBuYW1lJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXROYW1lRm9ybS5jb21wb25lbnRJbnN0YW5jZU5hbWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzUwJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXROYW1lRm9ybS5jb21wb25lbnRJbnN0YW5jZU5hbWUuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Zvcm0+CisKKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtYWN0aW9uIj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Inctc2RjLWJ0bi1ibHVlIiBkYXRhLW5nLWNsaWNrPSJzYXZlKCkiIHR5cGU9ImJ1dHRvbiIgZGF0YS1uZy1kaXNhYmxlZD0iKCFjb21wb25lbnRJbnN0YW5jZU1vZGVsLm5hbWUgfHwgY29tcG9uZW50SW5zdGFuY2VNb2RlbC5uYW1lID09PSBvbGROYW1lKSB8fCBpc0FscmVhZHlQcmVzc2VkIj5PazwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idy1zZGMtYnRuLWRhcmstZ3JheSIgZGF0YS1uZy1jbGljaz0iY2xvc2UoKSIgdHlwZT0iYnV0dG9uIj5DYW5jZWw8L2J1dHRvbj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KKy0tPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Njk4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL3Jlc291cmNlLWluc3RhbmNlLW5hbWUtZm9ybS9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLmxlc3MKQEAgLTAsMCArMSwyOSBAQAorLnctc2RjLW1vZGFsLXJlc291cmNlLWluc3RhbmNlLW5hbWUgeworCisgICAgLnctc2RjLW1vZGFsLWJvZHkgeworICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgICB9CisKKyAgICAudy1zZGMtbW9kYWwtYWN0aW9uIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgfQorCisgICAgLnctc2RjLW1vZGFsLXJlc291cmNlLWluc3RhbmNlLWlucHV0IHsKKyAgICAgICAgLnBfMTsKKyAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggQGNvbG9yX3A7CisgICAgICAgIGhlaWdodDogNDVweDsKKyAgICAgICAgcGFkZGluZzogMCAyMHB4OworICAgICAgICBtYXJnaW46IDAgYXV0byAwIGF1dG87CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgIH0KKyAgICAudy1zZGMtbW9kYWwtYm9keSB7CisgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgfQorCisgICAgLnctc2RjLWZvcm0gLmktc2RjLWZvcm0taXRlbS5lcnJvcjo6YWZ0ZXIgeworICAgICAgICB0b3A6IDEzcHg7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9jb25maXJtYXRpb24tbW9kYWwvY29uZmlybWF0aW9uLW1vZGFsLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9jb25maXJtYXRpb24tbW9kYWwvY29uZmlybWF0aW9uLW1vZGFsLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwNjU5MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDk2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDb25maXJtYXRpb25Nb2RhbE1vZGVsIHsKKyAgICAgICAgdGl0bGU6IHN0cmluZzsKKyAgICAgICAgbWVzc2FnZTogc3RyaW5nOworICAgICAgICBzaG93Q29tbWVudDogYm9vbGVhbjsKKyAgICAgICAgdHlwZTogVXRpbHMuQ29uc3RhbnRzLk1vZGFsVHlwZTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUNvbmZpcm1hdGlvbk1vZGFsVmlld01vZGVsU2NvcGUgeworICAgICAgICBtb2RhbEluc3RhbmNlQ29uZmlybWF0aW9uOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisgICAgICAgIGNvbmZpcm1hdGlvbk1vZGFsTW9kZWw6IElDb25maXJtYXRpb25Nb2RhbE1vZGVsOworICAgICAgICBjb21tZW50OiBhbnk7CisgICAgICAgIGNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHA7CisgICAgICAgIGVkaXRGb3JtOm5nLklGb3JtQ29udHJvbGxlcjsKKyAgICAgICAgb2tCdXR0b25Db2xvcjogc3RyaW5nOworICAgICAgICBoaWRlQ2FuY2VsQnV0dG9uOiBib29sZWFuOworICAgICAgICBvaygpOiBhbnk7CisgICAgICAgIGNhbmNlbCgpOiB2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBDb25maXJtYXRpb25Nb2RhbFZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsnJHNjb3BlJywgJyRtb2RhbEluc3RhbmNlJywgJ2NvbmZpcm1hdGlvbk1vZGFsTW9kZWwnLCAnQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuJywgJ1ZhbGlkYXRpb25VdGlscycsICckdGVtcGxhdGVDYWNoZScsICckbW9kYWwnXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJQ29uZmlybWF0aW9uTW9kYWxWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25Nb2RhbE1vZGVsOklDb25maXJtYXRpb25Nb2RhbE1vZGVsLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25VdGlsczogU2RjLlV0aWxzLlZhbGlkYXRpb25VdGlscywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlKSB7CisKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKGNvbmZpcm1hdGlvbk1vZGFsTW9kZWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoY29uZmlybWF0aW9uTW9kYWxNb2RlbDpJQ29uZmlybWF0aW9uTW9kYWxNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5oaWRlQ2FuY2VsQnV0dG9uID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RhbEluc3RhbmNlQ29uZmlybWF0aW9uID0gdGhpcy4kbW9kYWxJbnN0YW5jZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbmZpcm1hdGlvbk1vZGFsTW9kZWwgPSBjb25maXJtYXRpb25Nb2RhbE1vZGVsOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tbWVudCA9IHsidGV4dCI6ICcnfTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vayA9ICgpOmFueSA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi4kbW9kYWxJbnN0YW5jZS5jbG9zZSh0aGlzLlZhbGlkYXRpb25VdGlscy5zdHJpcEFuZFNhbml0aXplKHNlbGYuJHNjb3BlLmNvbW1lbnQudGV4dCkpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2FuY2VsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdDYW5jZWwgcHJlc3NlZCBvbjogJyArIHRoaXMuJHNjb3BlLmNvbmZpcm1hdGlvbk1vZGFsTW9kZWwudGl0bGUpOworICAgICAgICAgICAgICAgIHNlbGYuJG1vZGFsSW5zdGFuY2UuZGlzbWlzcygpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gU2V0IHRoZSBPSyBidXR0b24gY29sb3IgYWNjb3JkaW5nIHRvIG1vZGFsIHR5cGUgKHN0YW5kYXJkLCBlcnJvciwgYWxlcnQpCisgICAgICAgICAgICBsZXQgX29rQnV0dG9uQ29sb3IgPSAnYmx1ZSc7IC8vIERlZmF1bHQKKyAgICAgICAgICAgIHN3aXRjaCAoY29uZmlybWF0aW9uTW9kYWxNb2RlbC50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZGMuVXRpbHMuQ29uc3RhbnRzLk1vZGFsVHlwZS5TVEFOREFSRDoKKyAgICAgICAgICAgICAgICAgICAgX29rQnV0dG9uQ29sb3I9J2JsdWUnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNkYy5VdGlscy5Db25zdGFudHMuTW9kYWxUeXBlLkVSUk9SOgorICAgICAgICAgICAgICAgICAgICBfb2tCdXR0b25Db2xvcj0ncmVkJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZGMuVXRpbHMuQ29uc3RhbnRzLk1vZGFsVHlwZS5BTEVSVDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaGlkZUNhbmNlbEJ1dHRvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIF9va0J1dHRvbkNvbG9yPSdncmV5JzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgX29rQnV0dG9uQ29sb3I9J2JsdWUnOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9rQnV0dG9uQ29sb3IgPSBfb2tCdXR0b25Db2xvcjsKKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvY29uZmlybWF0aW9uLW1vZGFsL2NvbmZpcm1hdGlvbi1tb2RhbC12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9jb25maXJtYXRpb24tbW9kYWwvY29uZmlybWF0aW9uLW1vZGFsLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWMyN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvY29uZmlybWF0aW9uLW1vZGFsL2NvbmZpcm1hdGlvbi1tb2RhbC12aWV3Lmh0bWwKQEAgLTAsMCArMSwyOSBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZUNvbmZpcm1hdGlvbiIgdHlwZT0iY2xhc3NpYyIgY2xhc3M9Inctc2RjLW1vZGFsLWNvbmZpcm1hdGlvbiBtb2RhbC10eXBlLXt7Y29uZmlybWF0aW9uTW9kYWxNb2RlbC50eXBlfX0iIGhlYWRlcj0ie3tjb25maXJtYXRpb25Nb2RhbE1vZGVsLnRpdGxlfX0iIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIj4KKyAgICA8Zm9ybSBub3ZhbGlkYXRlIGNsYXNzPSJ3LXNkYy1mb3JtIiBuYW1lPSJlZGl0Rm9ybSI+CisgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCB3LXNkYy1tb2RhbC1sYWJlbCIgZGF0YS1uZy1iaW5kLWh0bWw9ImNvbmZpcm1hdGlvbk1vZGFsTW9kZWwubWVzc2FnZSI+PC9sYWJlbD4KKworICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iPgorICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJ3LXNkYy1tb2RhbC1ib2R5LWNvbW1lbnQiCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iY2hlY2tpbmRpYWxvZyIKKyAgICAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXM9ImF1dG9mb2N1cyIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXNob3c9ImNvbmZpcm1hdGlvbk1vZGFsTW9kZWwuc2hvd0NvbW1lbnQ9PT10cnVlIgorICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImNvbW1lbnQudGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iQ29tbWVudC4uLiIKKyAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1NiIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29tbWVudDEiCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJjb21tZW50VmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjI1NiI+PC90ZXh0YXJlYT4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZWRpdEZvcm0uY29tbWVudDEuJGRpcnR5ICYmIGVkaXRGb3JtLmNvbW1lbnQxLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb21tZW50MS4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb21tZW50MS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdDb21tZW50JyB9Ij48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9mb3JtPgorICAgIDxkaXYgY2xhc3M9Inctc2RjLW1vZGFsLWZvb3RlciBjbGFzc2ljIj4KKyAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGx2LWJ0biB7e29rQnV0dG9uQ29sb3J9fSIgZGF0YS10ZXN0cy1pZD0iT0siIGRhdGEtbmctY2xpY2s9Im9rKCkiIGRhdGEtbmctZGlzYWJsZWQ9ImNvbmZpcm1hdGlvbk1vZGFsTW9kZWwuc2hvd0NvbW1lbnQ9PT10cnVlICYmICghY29tbWVudC50ZXh0IHx8IGNvbW1lbnQudGV4dCAmJiBjb21tZW50LnRleHQubGVuZ3RoPT09MCkiPk9LPC9idXR0b24+CisgICAgICAgIDxidXR0b24gY2xhc3M9InRsdi1idG4gZ3JleSIgZGF0YS1uZy1pZj0iaGlkZUNhbmNlbEJ1dHRvbj09PWZhbHNlIiBkYXRhLXRlc3RzLWlkPSJDYW5jZWwiIGRhdGEtbmctY2xpY2s9ImNhbmNlbCgpIiA+Q2FuY2VsPC9idXR0b24+CisgICAgICAgIDxidXR0b24gY2xhc3M9InRsdi1idG4gYmx1ZSBhZGQtcHJvcGVydHktYWRkLWFub3RoZXIiIGRhdGEtbmctaWY9ImlzTmV3IiBkYXRhLW5nLWNsaWNrPSJzYXZlQW5kQW5vdGhlcigpIiB0eXBlPSJyZXNldCIgZGF0YS1uZy1kaXNhYmxlZD0iZWRpdEZvcm0uJGludmFsaWQiPkFkZCBBbm90aGVyPC9idXR0b24+CisgICAgPC9kaXY+Cis8L3NkYy1tb2RhbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZjNDFkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvY29uZmlybWF0aW9uLW1vZGFsL2NvbmZpcm1hdGlvbi1tb2RhbC5sZXNzCkBAIC0wLDAgKzEsMzAgQEAKKy53LXNkYy1tb2RhbC1jb25maXJtYXRpb24geworICAgIGZvcm0udy1zZGMtZm9ybXsKKyAgICAgICAgcGFkZGluZzogMDsKKyAgICB9CisKKyAgICAudy1zZGMtbW9kYWwtYm9keS1jb250ZW50IHsKKyAgICAgICAgLmJfNjsKKyAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDsKKworICAgIH0KKyAgICAudy1zZGMtbW9kYWwtYm9keSB7CisgICAgICAgIGhlaWdodDogYXV0bzsKKyAgICAgICAgLyogcGFkZGluZzogNDdweCA2MHB4IDIwcHggNjBweDsgKi8KKyAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICB9CisgICAgLnctc2RjLW1vZGFsLWJvZHktY29udGVudCB7CisgICAgICAgIHBhZGRpbmc6IDA7CisgICAgfQorICAgIC53LXNkYy1tb2RhbC1ib2R5LWNvbW1lbnQgeworICAgICAgICB3aWR0aDogNDMwcHg7CisgICAgICAgIGhlaWdodDogMTI3cHg7CisgICAgICAgIGJvcmRlcjogc29saWQgMXB4IEBjb2xvcl9lOworICAgICAgICBtYXJnaW46IDIwcHggMCAwIDA7CisgICAgICAgIHBhZGRpbmc6IDE1cHg7CisgICAgfQorICAgIC53LXNkYy1tb2RhbC1sYWJlbCB7CisgICAgICAgIC5tXzE0X3I7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZW1haWwtbW9kYWwvZW1haWwtbW9kYWwtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2VtYWlsLW1vZGFsL2VtYWlsLW1vZGFsLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzMGE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2VtYWlsLW1vZGFsL2VtYWlsLW1vZGFsLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwxMTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVtYWlsTW9kYWxNb2RlbF9FbWFpbCB7CisgICAgICAgIHRvOiBzdHJpbmc7CisgICAgICAgIHN1YmplY3Q6IHN0cmluZzsKKyAgICAgICAgbWVzc2FnZTogc3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVtYWlsTW9kYWxNb2RlbF9EYXRhIHsKKyAgICAgICAgY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ7CisgICAgICAgIHN0YXRlVXJsOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJRW1haWxNb2RhbE1vZGVsIHsKKyAgICAgICAgdGl0bGU6IHN0cmluZzsKKyAgICAgICAgZW1haWw6IElFbWFpbE1vZGFsTW9kZWxfRW1haWw7CisgICAgICAgIGRhdGE6IElFbWFpbE1vZGFsTW9kZWxfRGF0YTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUVtYWlsTW9kYWxWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIG1vZGFsSW5zdGFuY2VFbWFpbDpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlOworICAgICAgICBlbWFpbE1vZGFsTW9kZWw6IElFbWFpbE1vZGFsTW9kZWw7CisgICAgICAgIHN1Ym1pdEluUHJvZ3Jlc3M6Ym9vbGVhbjsKKyAgICAgICAgY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cDsKKyAgICAgICAgaXNMb2FkaW5nOmJvb2xlYW47CisgICAgICAgIHN1Ym1pdCgpOiBhbnk7CisgICAgICAgIGNhbmNlbCgpOiB2b2lkOworICAgICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkOmFueSk6Ym9vbGVhbjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRW1haWxNb2RhbFZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsnJHNjb3BlJywgJyRmaWx0ZXInLCAnc2RjQ29uZmlnJywgJyRtb2RhbEluc3RhbmNlJywgJ2VtYWlsTW9kYWxNb2RlbCcsICdWYWxpZGF0aW9uVXRpbHMnLCAnQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuJ107CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUVtYWlsTW9kYWxWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBlbWFpbE1vZGFsTW9kZWw6SUVtYWlsTW9kYWxNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBWYWxpZGF0aW9uVXRpbHM6IFNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHApIHsKKworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoZW1haWxNb2RhbE1vZGVsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKGVtYWlsTW9kYWxNb2RlbDpJRW1haWxNb2RhbE1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVtYWlsTW9kYWxNb2RlbCA9IGVtYWlsTW9kYWxNb2RlbDsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnN1Ym1pdEluUHJvZ3Jlc3M9ZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21tZW50VmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLkNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsSW5zdGFuY2VFbWFpbCA9IHRoaXMuJG1vZGFsSW5zdGFuY2U7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnN1Ym1pdCA9ICgpOmFueSA9PiB7CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnN1Ym1pdEluUHJvZ3Jlc3M9ZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rOnN0cmluZyA9IGVuY29kZVVSSSh0aGlzLnNkY0NvbmZpZy5hcGkuYmFzZVVybCArICI/Zm9sZGVyPVJlYWR5X0Zvcl9UZXN0aW5nIik7CisgICAgICAgICAgICAgICAgICAgIGxldCBvdXRsb29rOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkVNQUlMX09VVExPT0tfTUVTU0FHRSIsICJ7J3RvJzogJyIgKyBlbWFpbE1vZGFsTW9kZWwuZW1haWwudG8gKyAiJywnc3ViamVjdCc6ICciICsgZW1haWxNb2RhbE1vZGVsLmVtYWlsLnN1YmplY3QgKyAiJywnbWVzc2FnZSc6ICciICsgZW1haWxNb2RhbE1vZGVsLmVtYWlsLm1lc3NhZ2UgKyAiJywgJ2VudGl0eU5hbWVBbmRWZXJzaW9uJzogJyIgKyBlbWFpbE1vZGFsTW9kZWwuZW1haWwuc3ViamVjdCArICInLCdsaW5rJzogJyIgKyBsaW5rICsgIid9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLnNkY0NvbmZpZy5vcGVuU291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZj1vdXRsb29rOyAvLyBPcGVuIG91dGxvb2sgd2l0aCB0aGUgZW1haWwgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoY29tcG9uZW50KTsgLy8gQ2xvc2UgdGhlIGRpYWxvZworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnN1Ym1pdEluUHJvZ3Jlc3M9ZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAvLyBTdWJtaXQgdG8gc2VydmVyCisgICAgICAgICAgICAgICAgLy8gUHJldmVudCBmcm9tIHVzZXIgcHJlc3NpbmcgbXVsdGlwbGUgdGltZXMgb24gc3VibWl0LgorICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5zdWJtaXRJblByb2dyZXNzPT09ZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc3VibWl0SW5Qcm9ncmVzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50Ok1vZGVscy5Bc2RjQ29tbWVudCA9IG5ldyBNb2RlbHMuQXNkY0NvbW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudC51c2VyUmVtYXJrcyA9IGVtYWlsTW9kYWxNb2RlbC5lbWFpbC5tZXNzYWdlOworICAgICAgICAgICAgICAgICAgICBlbWFpbE1vZGFsTW9kZWwuZGF0YS5jb21wb25lbnQuY2hhbmdlTGlmZWN5Y2xlU3RhdGUoZW1haWxNb2RhbE1vZGVsLmRhdGEuc3RhdGVVcmwsIGNvbW1lbnQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jYW5jZWwgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmRpc21pc3MoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRlRmllbGQgPSAoZmllbGQ6YW55KTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuJGRpcnR5ICYmIGZpZWxkLiRpbnZhbGlkKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZW1haWwtbW9kYWwvZW1haWwtbW9kYWwtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZW1haWwtbW9kYWwvZW1haWwtbW9kYWwtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjkzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9lbWFpbC1tb2RhbC9lbWFpbC1tb2RhbC12aWV3Lmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZUVtYWlsIiB0eXBlPSJjbGFzc2ljIiBjbGFzcz0idy1zZGMtbW9kYWwtZW1haWwgbW9kYWwtdHlwZS1zdGFuZGFyZCIgaGVhZGVyPSJ7e2VtYWlsTW9kYWxNb2RlbC50aXRsZX19IiBzaG93LWNsb3NlLWJ1dHRvbj0idHJ1ZSI+CisgICAgPGxvYWRlciBkYXRhLWRpc3BsYXk9ImlzTG9hZGluZyI+PC9sb2FkZXI+CisgICAgPGZvcm0gbm92YWxpZGF0ZSBjbGFzcz0idy1zZGMtZm9ybSIgbmFtZT0iZWRpdEZvcm0iPgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1tb2RhbC1ib2R5Ij4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogdmFsaWRhdGVGaWVsZChlZGl0Rm9ybS50byl9Ij4KKyAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgY29sLXNtLTIiPlRvPC9sYWJlbD4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tMTAiPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlbWFpbE1vZGFsTW9kZWwuZW1haWwudG8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjI1NSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InRvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InRvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJ2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLnRvKSIgYWxpZ25Ub1NlbGVjdG9yPSIjdG8iPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS50by4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdUbycgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS50by4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjU1JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLnRvLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogdmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5zdWJqZWN0KX0iPgorICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCBjb2wtc20tMiI+U3ViamVjdDwvbGFiZWw+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTEwIj4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IiB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZW1haWxNb2RhbE1vZGVsLmVtYWlsLnN1YmplY3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjI1NSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InN1YmplY3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0uc3ViamVjdCkiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5zdWJqZWN0LiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1JFUVVJUkVEIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J2ZpZWxkJzogJ1N1YmplY3QnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uc3ViamVjdC4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjU1JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLnN1YmplY3QuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLm1lc3NhZ2UpfSI+CisgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIGNvbC1zbS0yIj5NZXNzYWdlPC9sYWJlbD4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tMTAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJ3LXNkYy1tb2RhbC1ib2R5LWVtYWlsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVtYWlsTW9kYWxNb2RlbC5lbWFpbC5tZXNzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJ7eydFTUFJTF9NT0RBTF9NRVNTQUdFJyB8IHRyYW5zbGF0ZSB9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49ImNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1NSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJjaGFuZ2VMaWZlQ3ljbGVNZXNzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIyNTUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJ2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLm1lc3NhZ2UpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLm1lc3NhZ2UuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnTWVzc2FnZScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0ubWVzc2FnZS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjU1JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5tZXNzYWdlLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9mb3JtPgorCisgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtZm9vdGVyIGNsYXNzaWMiPgorICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0bHYtYnRuIGJsdWUiIGRhdGEtdGVzdHMtaWQ9Ik9LIiBkYXRhLW5nLWNsaWNrPSJzdWJtaXQoKSIgZGF0YS1uZy1kaXNhYmxlZD0iZWRpdEZvcm0uJGludmFsaWQiPk9LPC9idXR0b24+CisgICAgICAgIDxidXR0b24gY2xhc3M9InRsdi1idG4gZ3JleSIgZGF0YS10ZXN0cy1pZD0iQ2FuY2VsIiBkYXRhLW5nLWNsaWNrPSJjYW5jZWwoKSIgPkNhbmNlbDwvYnV0dG9uPgorICAgIDwvZGl2PgorPC9zZGMtbW9kYWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9lbWFpbC1tb2RhbC9lbWFpbC1tb2RhbC5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZW1haWwtbW9kYWwvZW1haWwtbW9kYWwubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQ2YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZW1haWwtbW9kYWwvZW1haWwtbW9kYWwubGVzcwpAQCAtMCwwICsxLDU2IEBACisudy1zZGMtbW9kYWwtZW1haWwgeworCisgICAgLnctc2RjLW1vZGFsLWJvZHkgeworICAgICAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIH0KKworICAgIGZvcm0udy1zZGMtZm9ybXsKKyAgICAgICAgcGFkZGluZzogMDsKKworICAgICAgICAuaS1zZGMtZm9ybS1pdGVtIHsKKyAgICAgICAgICAgIGNsZWFyOiBib3RoOworICAgICAgICAgICAgbGFiZWwgeworICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDMwcHg7CisgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6IDRweDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmNvbC1zbS0xMCB7CisgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLnctc2RjLW1vZGFsLWJvZHktZW1haWwgeworICAgICAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKKyAgICAgICAgICAgIGJvcmRlci13aWR0aDogMXB4OworICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAgQGNvbG9yX2U7CisgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICBoZWlnaHQ6IDEyN3B4OworICAgICAgICB9CisKKyAgICAgICAgbGFiZWwgey5tXzE0X207IHRleHQtYWxpZ246IGxlZnQ7fQorICAgICAgICBpbnB1dCB7Lm1fMTRfcjt9CisgICAgICAgIHRleHRhcmVhIHsubV8xNF9yO30KKyAgICAgICAgLyogSSBtYWRlIHRoZSBzdWJqZWN0IGFuZCB0byBmaWVsZHMgYXMgaW5wdXQgKGZvciBmdXR1cmUgdXNlKSwgYnV0IGZvciBub3cgdGhleSBsb29rIGxpa2UgbGFiZWxzOiAqLworICAgICAgICBpbnB1dDpkaXNhYmxlZCB7CisgICAgICAgICAgICAuYmdfYzsKKyAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC53LXNkYy1tb2RhbC1hY3Rpb24geworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9wOworICAgICAgICBwYWRkaW5nOiAwIDEzcHggMCAwOworICAgICAgICBoZWlnaHQ6IDkwcHg7CisgICAgICAgIGxpbmUtaGVpZ2h0OiA2NXB4OworCisgICAgICAgIGJ1dHRvbiB7d2lkdGg6IDE3NHB4O30KKyAgICB9CisKKyAgICAudy1zZGMtZm9ybSAuaS1zZGMtZm9ybS1pdGVtIGxhYmVsLnJlcXVpcmVkOjpiZWZvcmUgeworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIGxlZnQ6IC0xM3B4OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZXJyb3ItbW9kYWwvZXJyb3ItNDAzLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2Vycm9yLW1vZGFsL2Vycm9yLTQwMy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1ZmNjZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2Vycm9yLW1vZGFsL2Vycm9yLTQwMy12aWV3Lmh0bWwKQEAgLTAsMCArMSw0IEBACis8ZGl2IGNsYXNzPSJzZGMtZXJyb3ItNDAzLWNvbnRhaW5lciIgPgorICA8ZGl2ICBjbGFzcz0ic2RjLWVycm9yLTQwMy1jb250YWluZXItdGl0bGUiIHRyYW5zbGF0ZT0iR0VORVJBTF9FUlJPUl80MDNfVElUTEUiPjwvZGl2PgorICA8ZGl2IGNsYXNzPSJ3LXNkYy1lcnJvci00MDMtdGV4dCB3LXNkYy1mb3JtIiB0cmFuc2xhdGU9IkdFTkVSQUxfRVJST1JfNDAzX0RFU0NSSVBUSU9OIiB0cmFuc2xhdGUtdmFsdWVzPSJ7eyBtYWlsdG9Kc29uIH19Ij48L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZXJyb3ItbW9kYWwvZXJyb3Itdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2Vycm9yLW1vZGFsL2Vycm9yLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiMmJmYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2Vycm9yLW1vZGFsL2Vycm9yLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSw0MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElFcnJvclZpZXdNb2RlbFNjb3BleworICAgICAgICBtYWlsdG9Kc29uOiBhbnk7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEVycm9yVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWyckc2NvcGUnLCAnU2RjLlNlcnZpY2VzLkNvb2tpZVNlcnZpY2UnLCAnJHdpbmRvdycsICckZmlsdGVyJ107CisKKyAgICAgICAgY29uc3RydWN0b3IoJHNjb3BlOklFcnJvclZpZXdNb2RlbFNjb3BlLCBjb29raWVTZXJ2aWNlOlNlcnZpY2VzLkNvb2tpZVNlcnZpY2UsICR3aW5kb3csICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UpeworICAgICAgICAgICAgbGV0IGFkbWluRW1haWw6c3RyaW5nID0gJGZpbHRlcigndHJhbnNsYXRlJykoJ0FETUlOX0VNQUlMJyk7CisgICAgICAgICAgICBsZXQgc3ViamVjdFByZWZpeDpzdHJpbmcgPSAkZmlsdGVyKCd0cmFuc2xhdGUnKSgnRU1BSUxfU1VCSkVDVF9QUkVGSVgnKTsKKyAgICAgICAgICAgIGxldCB1c2VyRGV0YWlscyA9IGNvb2tpZVNlcnZpY2UuZ2V0Rmlyc3ROYW1lKCkgKyAnICcrY29va2llU2VydmljZS5nZXRMYXN0TmFtZSgpICsgJyAoJytjb29raWVTZXJ2aWNlLmdldFVzZXJJZCgpICsgJyknOworICAgICAgICAgICAgbGV0IGxpbmUgPSBhZG1pbkVtYWlsKyc/c3ViamVjdD0nKyR3aW5kb3cuZW5jb2RlVVJJQ29tcG9uZW50KHN1YmplY3RQcmVmaXgrJyAnK3VzZXJEZXRhaWxzKTsKKyAgICAgICAgICAgICRzY29wZS5tYWlsdG9Kc29uID0geworICAgICAgICAgICAgICAgICJtYWlsdG8iOiBsaW5lCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9lcnJvci1tb2RhbC9lcnJvci5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZXJyb3ItbW9kYWwvZXJyb3IubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk3YjUwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvZXJyb3ItbW9kYWwvZXJyb3IubGVzcwpAQCAtMCwwICsxLDEzIEBACisuc2RjLWVycm9yLTQwMy1jb250YWluZXIgeworICAgIC5iZ19uOworICAgIHdpZHRoOiA3MDBweDsKKyAgICBoZWlnaHQ6IDQwMHB4OworICAgIG1hcmdpbjogYXV0bzsKKyAgICBtYXJnaW4tdG9wOiAxOTZweDsKKworICAgIC53LXNkYy1lcnJvci00MDMtdGV4dCB7CisgICAgICAgIC5xXzExOworICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLWJhc2UtbW9kYWwtbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2UtYmFzZS1tb2RhbC1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmRmNzgwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLWJhc2UtbW9kYWwtbW9kZWwudHMKQEAgLTAsMCArMSw2NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJTWVzc2FnZU1vZGFsTW9kZWwgeworICAgICAgICB0aXRsZTogc3RyaW5nOworICAgICAgICBtZXNzYWdlOiBzdHJpbmc7CisgICAgICAgIHNldmVyaXR5OiBVdGlscy5Db25zdGFudHMuU0VWRVJJVFk7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJTWVzc2FnZU1vZGFsVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBmb290ZXJCdXR0b25zOiBBcnJheTxhbnk+OworICAgICAgICBtZXNzYWdlTW9kYWxNb2RlbDogSU1lc3NhZ2VNb2RhbE1vZGVsOworICAgICAgICBtb2RhbEluc3RhbmNlRXJyb3I6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZTsKKyAgICAgICAgb2soKTogdm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgTWVzc2FnZU1vZGFsVmlld01vZGVsIHsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRiYXNlU2NvcGU6SU1lc3NhZ2VNb2RhbFZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRiYXNlTW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGJhc2VNZXNzYWdlTW9kYWxNb2RlbDpJTWVzc2FnZU1vZGFsTW9kZWwpIHsKKworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoYmFzZU1lc3NhZ2VNb2RhbE1vZGVsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKG1lc3NhZ2VNb2RhbFZpZXdNb2RlbDpJTWVzc2FnZU1vZGFsTW9kZWwpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLiRiYXNlU2NvcGUubWVzc2FnZU1vZGFsTW9kZWwgPSBtZXNzYWdlTW9kYWxWaWV3TW9kZWw7CisgICAgICAgICAgICB0aGlzLiRiYXNlU2NvcGUubW9kYWxJbnN0YW5jZUVycm9yID0gdGhpcy4kYmFzZU1vZGFsSW5zdGFuY2U7CisKKyAgICAgICAgICAgIHRoaXMuJGJhc2VTY29wZS5vayA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJGJhc2VNb2RhbEluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRiYXNlU2NvcGUuZm9vdGVyQnV0dG9ucyA9IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ09LJywKKyAgICAgICAgICAgICAgICAgICAgJ2Nzcyc6ICdncmV5JywKKyAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrJzogdGhpcy4kYmFzZVNjb3BlLm9rCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1jbGllbnQtbW9kYWwvY2xpZW50LW1lc3NhZ2UtbW9kYWwtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1jbGllbnQtbW9kYWwvY2xpZW50LW1lc3NhZ2UtbW9kYWwtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFmZTExCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLWNsaWVudC1tb2RhbC9jbGllbnQtbWVzc2FnZS1tb2RhbC12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsNDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUNsaWVudE1lc3NhZ2VNb2RhbE1vZGVsIGV4dGVuZHMgSU1lc3NhZ2VNb2RhbE1vZGVsIHsKKyAgICB9CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElDbGllbnRNZXNzYWdlTW9kYWxWaWV3TW9kZWxTY29wZSBleHRlbmRzIElNZXNzYWdlTW9kYWxWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIGNsaWVudE1lc3NhZ2VNb2RhbE1vZGVsOiBJQ2xpZW50TWVzc2FnZU1vZGFsTW9kZWw7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIENsaWVudE1lc3NhZ2VNb2RhbFZpZXdNb2RlbCBleHRlbmRzIE1lc3NhZ2VNb2RhbFZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsnJHNjb3BlJywgJyRtb2RhbEluc3RhbmNlJywgJ2NsaWVudE1lc3NhZ2VNb2RhbE1vZGVsJ107CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUNsaWVudE1lc3NhZ2VNb2RhbFZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRtb2RhbEluc3RhbmNlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY2xpZW50TWVzc2FnZU1vZGFsTW9kZWw6SUNsaWVudE1lc3NhZ2VNb2RhbE1vZGVsKSB7CisKKyAgICAgICAgICAgIHN1cGVyKCRzY29wZSwgJG1vZGFsSW5zdGFuY2UsIGNsaWVudE1lc3NhZ2VNb2RhbE1vZGVsKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLWNsaWVudC1tb2RhbC9jbGllbnQtbWVzc2FnZS1tb2RhbC12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2UtY2xpZW50LW1vZGFsL2NsaWVudC1tZXNzYWdlLW1vZGFsLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmIwYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLWNsaWVudC1tb2RhbC9jbGllbnQtbWVzc2FnZS1tb2RhbC12aWV3Lmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZUVycm9yIgorICAgICAgICAgICB0eXBlPSJjbGFzc2ljIgorICAgICAgICAgICBjbGFzcz0idy1zZGMtbW9kYWwgbW9kYWwtdHlwZS1hbGVydCIKKyAgICAgICAgICAgaGVhZGVyPSJ7e21lc3NhZ2VNb2RhbE1vZGVsLnRpdGxlfX0iCisgICAgICAgICAgIGJ1dHRvbnM9ImZvb3RlckJ1dHRvbnMiCisgICAgICAgICAgIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIj4KKworICAgIDxwZXJmZWN0LXNjcm9sbGJhciBpbmNsdWRlLXBhZGRpbmc9InRydWUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1tb2RhbC1pY29uIHctc2RjLW1vZGFsLWljb24te3ttZXNzYWdlTW9kYWxNb2RlbC5zZXZlcml0eX19Ij48L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtY2FwdGlvbiI+CisgICAgICAgICAgICA8ZGl2IG5nLWJpbmQtaHRtbD0ibWVzc2FnZU1vZGFsTW9kZWwubWVzc2FnZSIgZGF0YS10ZXN0cy1pZD0ibWVzc2FnZSI+PC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8IS0tPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtYm9keS1jb250ZW50IiBkYXRhLW5nLWJpbmQtaHRtbD0ibWVzc2FnZU1vZGFsTW9kZWwubWVzc2FnZSI+PC9kaXY+LS0+CisgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKworPC9zZGMtbW9kYWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2UtY2xpZW50LW1vZGFsL2NsaWVudC1tZXNzYWdlLW1vZGFsLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2UtY2xpZW50LW1vZGFsL2NsaWVudC1tZXNzYWdlLW1vZGFsLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1jbGllbnQtbW9kYWwvY2xpZW50LW1lc3NhZ2UtbW9kYWwubGVzcwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLXNlcnZlci1tb2RhbC9zZXJ2ZXItbWVzc2FnZS1tb2RhbC12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLXNlcnZlci1tb2RhbC9zZXJ2ZXItbWVzc2FnZS1tb2RhbC12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTBkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9tZXNzYWdlLW1vZGFsL21lc3NhZ2Utc2VydmVyLW1vZGFsL3NlcnZlci1tZXNzYWdlLW1vZGFsLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSw0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJU2VydmVyTWVzc2FnZU1vZGFsTW9kZWwgZXh0ZW5kcyBJTWVzc2FnZU1vZGFsTW9kZWwgeworICAgICAgICBzdGF0dXM6IHN0cmluZzsKKyAgICAgICAgbWVzc2FnZUlkOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJU2VydmVyTWVzc2FnZU1vZGFsVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJTWVzc2FnZU1vZGFsVmlld01vZGVsU2NvcGUgeworICAgICAgICBzZXJ2ZXJNZXNzYWdlTW9kYWxNb2RlbDogSVNlcnZlck1lc3NhZ2VNb2RhbE1vZGVsOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBTZXJ2ZXJNZXNzYWdlTW9kYWxWaWV3TW9kZWwgZXh0ZW5kcyBNZXNzYWdlTW9kYWxWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJyRzY29wZScsICckbW9kYWxJbnN0YW5jZScsICdzZXJ2ZXJNZXNzYWdlTW9kYWxNb2RlbCddOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklTZXJ2ZXJNZXNzYWdlTW9kYWxWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNlcnZlck1lc3NhZ2VNb2RhbE1vZGVsOklTZXJ2ZXJNZXNzYWdlTW9kYWxNb2RlbCkgeworCisgICAgICAgICAgICBzdXBlcigkc2NvcGUsICRtb2RhbEluc3RhbmNlLCBzZXJ2ZXJNZXNzYWdlTW9kYWxNb2RlbCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1zZXJ2ZXItbW9kYWwvc2VydmVyLW1lc3NhZ2UtbW9kYWwtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLXNlcnZlci1tb2RhbC9zZXJ2ZXItbWVzc2FnZS1tb2RhbC12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0ZGM3NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1zZXJ2ZXItbW9kYWwvc2VydmVyLW1lc3NhZ2UtbW9kYWwtdmlldy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxzZGMtbW9kYWwgbW9kYWw9Im1vZGFsSW5zdGFuY2VFcnJvciIKKyAgICAgICAgICAgdHlwZT0iY2xhc3NpYyIKKyAgICAgICAgICAgY2xhc3M9Inctc2RjLW1vZGFsIG1vZGFsLXR5cGUtZXJyb3IiCisgICAgICAgICAgIGhlYWRlcj0ie3ttZXNzYWdlTW9kYWxNb2RlbC50aXRsZX19IgorICAgICAgICAgICBidXR0b25zPSJmb290ZXJCdXR0b25zIgorICAgICAgICAgICBzaG93LWNsb3NlLWJ1dHRvbj0idHJ1ZSI+CisKKyAgICA8cGVyZmVjdC1zY3JvbGxiYXIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIj4KKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtbW9kYWwtaWNvbiB3LXNkYy1tb2RhbC1pY29uLXt7bWVzc2FnZU1vZGFsTW9kZWwuc2V2ZXJpdHl9fSI+PC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLW1vZGFsLWNhcHRpb24iPgorICAgICAgICAgICAgPGRpdj5FcnJvciBjb2RlOiB7e21lc3NhZ2VNb2RhbE1vZGVsLm1lc3NhZ2VJZH19PC9kaXY+CisgICAgICAgICAgICA8ZGl2PlN0YXR1cyBjb2RlOiB7e21lc3NhZ2VNb2RhbE1vZGVsLnN0YXR1c319PC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1tb2RhbC1ib2R5LWNvbnRlbnQiIGRhdGEtbmctYmluZC1odG1sPSJtZXNzYWdlTW9kYWxNb2RlbC5tZXNzYWdlIiBkYXRhLXRlc3RzLWlkPSJtZXNzYWdlIj48L2Rpdj4KKyAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorCis8L3NkYy1tb2RhbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1zZXJ2ZXItbW9kYWwvc2VydmVyLW1lc3NhZ2UtbW9kYWwubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1zZXJ2ZXItbW9kYWwvc2VydmVyLW1lc3NhZ2UtbW9kYWwubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLXNlcnZlci1tb2RhbC9zZXJ2ZXItbWVzc2FnZS1tb2RhbC5sZXNzCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9vbmJvYXJkaW5nLW1vZGFsL29uYm9hcmRpbmctbW9kYWwtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL29uYm9hcmRpbmctbW9kYWwvb25ib2FyZGluZy1tb2RhbC12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTg1YzRhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvb25ib2FyZGluZy1tb2RhbC9vbmJvYXJkaW5nLW1vZGFsLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwyNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBpbXBvcnQgUmVzb3VyY2UgPSBTZGMuTW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U7CisgICAgaW1wb3J0IENvbXBvbmVudEZhY3RvcnkgPSBTZGMuVXRpbHMuQ29tcG9uZW50RmFjdG9yeTsKKworICAgIGludGVyZmFjZSBJT25ib2FyZGluZ01vZGFsVmlld01vZGVsU2NvcGUgeworICAgICAgICBtb2RhbE9uYm9hcmRpbmc6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisgICAgICAgIGNvbXBvbmVudHNMaXN0OiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5JQ29tcG9uZW50PjsKKyAgICAgICAgdGFibGVIZWFkZXJzTGlzdDogQXJyYXk8YW55PjsKKyAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgY29tcG9uZW50RnJvbVNlcnZlcjogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICByZXZlcnNlOiBib29sZWFuOworICAgICAgICBzb3J0Qnk6IHN0cmluZzsKKyAgICAgICAgc2VhcmNoQmluZDogc3RyaW5nOworICAgICAgICBva0J1dHRvblRleHQ6IHN0cmluZzsKKyAgICAgICAgaXNDc2FyQ29tcG9uZW50RXhpc3RzOiBib29sZWFuOworICAgICAgICB1c2VyOiBNb2RlbHMuSVVzZXI7CisgICAgICAgIGlzTG9hZGluZzogYm9vbGVhbjsKKworICAgICAgICBkb1NlbGVjdENvbXBvbmVudChjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6IHZvaWQ7CisgICAgICAgIGRvVXBkYXRlQ3NhcigpOiB2b2lkOworICAgICAgICBkb0ltcG9ydENzYXIoKTogdm9pZDsKKyAgICAgICAgc29ydChzb3J0Qnk6IHN0cmluZyk6IHZvaWQ7CisgICAgICAgIGRvd25sb2FkQ3NhcihwYWNrYWdlSWQ6IHN0cmluZyk6IHZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIE9uYm9hcmRpbmdNb2RhbFZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJyRzdGF0ZScsCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICckbW9kYWxJbnN0YW5jZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLk9uYm9hcmRpbmdTZXJ2aWNlJywKKyAgICAgICAgICAgICdva0J1dHRvblRleHQnLAorICAgICAgICAgICAgJ2N1cnJlbnRDc2FyVVVJRCcsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnRmlsZVV0aWxzJywKKyAgICAgICAgICAgICdDb21wb25lbnRGYWN0b3J5JywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOiBJT25ib2FyZGluZ01vZGFsVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjogbmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHN0YXRlOiBhbnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOiBNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsSW5zdGFuY2U6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgb25Cb2FyZGluZ1NlcnZpY2U6IFNkYy5TZXJ2aWNlcy5PbmJvYXJkaW5nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBva0J1dHRvblRleHQ6IHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjdXJyZW50Q3NhclVVSUQ6IHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6IFNlcnZpY2VzLkNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBmaWxlVXRpbHM6IFNkYy5VdGlscy5GaWxlVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeTogVXRpbHMuQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBtb2RhbHNIYW5kbGVyOiBTZGMuVXRpbHMuTW9kYWxzSGFuZGxlcikgeworCisgICAgICAgICAgICB0aGlzLmluaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgZnJvbSBjb250cm9sbGVyIGNvbnN0cnVjdG9yLCB0aGlzIHdpbGwgY2FsbCBvbmJvYXJkaW5nIHNlcnZpY2UgdG8gZ2V0IGxpc3QKKyAgICAgICAgICogb2YgIm1pbmkiIGNvbXBvbmVudHMgKGVtcHR5IGNvbXBvbmVudHMgY3JlYXRlZCBmcm9tIENTQVIpLgorICAgICAgICAgKiBUaGUgbGlzdCBpcyBpbnNlcnRlZCB0byBjb21wb25lbnRzTGlzdCBvbiAkc2NvcGUuCisgICAgICAgICAqIEFuZCB0aGVuIGNhbGwgaW5pdFNjb3BlIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW5pdCA9ICgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuaW5pdE9uYm9hcmRpbmdDb21wb25lbnRzTGlzdCgpOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6IHZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLmluaXRTb3J0ZWRUYWJsZVNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLmluaXRNb2RhbFNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSAibmFtZSI7IC8vIERlZmF1bHQgc29ydCBieQorICAgICAgICAgICAgdGhpcy4kc2NvcGUudXNlciA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgndXNlcicpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUub2tCdXR0b25UZXh0ID0gdGhpcy5va0J1dHRvblRleHQ7CisKKyAgICAgICAgICAgIC8vIERpc21pc3MgdGhlIG1vZGFsIGFuZCBwYXNzIHRoZSAibWluaSIgY29tcG9uZW50IHRvIHdvcmtzcGFjZSBnZW5lcmFsIHBhZ2UKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRvSW1wb3J0Q3NhciA9ICgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbygnd29ya3NwYWNlLmdlbmVyYWwnLCB7CisgICAgICAgICAgICAgICAgICAgIHR5cGU6IFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlJFU09VUkNFLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudENzYXI6IHRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5kb1VwZGF0ZUNzYXIgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB1c2VyIHNlbGVjdCBvbiB1cGRhdGUgdGhlIGNoZWNraW4gYW5kIHN1Ym1pdCBmb3IgdGVzdGluZyBidXR0b25zIChpbiBnZW5lcmFsIHBhZ2UpIHNob3VsZCBiZSBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAvLyB0byBkbyB0aGF0IHdlIG5lZWQgdG8gcGFzcyB0byB3b3Jrc3BhY2UuZ2VuZXJhbCBzdGF0ZSBwYXJhbWV0ZXIgdG8ga25vdyB0byBkaXNhYmxlIHRoZSBidXR0b25zLgorICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGNvbXBvbmVudCB2ZXJzaW9uIHRvIHRoZSBDU0FSIHZlcnNpb24gd2Ugd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgLyooPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudEZyb21TZXJ2ZXIpLmNzYXJWZXJzaW9uID0gKDxSZXNvdXJjZT50aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCkuY3NhclZlcnNpb247CisgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudCh0aGlzLiRzY29wZS5jb21wb25lbnRGcm9tU2VydmVyKTsKKyAgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oJ3dvcmtzcGFjZS5nZW5lcmFsJywge3ZzcENvbXBvbmVudDogY29tcG9uZW50LCBkaXNhYmxlQnV0dG9uczogdHJ1ZSB9KTsqLworICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLnNldChVdGlscy5Db25zdGFudHMuQ0hBTkdFX0NPTVBPTkVOVF9DU0FSX1ZFUlNJT05fRkxBRywgKDxSZXNvdXJjZT50aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCkuY3NhclZlcnNpb24pOworICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKCd3b3Jrc3BhY2UuZ2VuZXJhbCcsIHsKKyAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuJHNjb3BlLmNvbXBvbmVudEZyb21TZXJ2ZXIudW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuJHNjb3BlLmNvbXBvbmVudEZyb21TZXJ2ZXIuY29tcG9uZW50VHlwZS50b0xvd2VyQ2FzZSgpLAorICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQnV0dG9uczogdHJ1ZQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZG93bmxvYWRDc2FyID0gKHBhY2thZ2VJZDogc3RyaW5nKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5vbkJvYXJkaW5nU2VydmljZS5kb3dubG9hZE9uYm9hcmRpbmdDc2FyKHBhY2thZ2VJZCkudGhlbigKKyAgICAgICAgICAgICAgICAgICAgKGZpbGU6IGFueSk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVdGlscy5kb3dubG9hZEZpbGUoZmlsZSwgcGFja2FnZUlkICsgJy56aXAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwgKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGE6IFNkYy5WaWV3TW9kZWxzLklTZXJ2ZXJNZXNzYWdlTW9kYWxNb2RlbCA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0Rvd25sb2FkIGVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiRXJyb3IgZG93bmxvYWRpbmcgZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6IFV0aWxzLkNvbnN0YW50cy5TRVZFUklUWS5FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogIiIKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGFsc0hhbmRsZXIub3BlblNlcnZlck1lc3NhZ2VNb2RhbChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXaGVuIHRoZSB1c2VyIHNlbGVjdCBhIHJvdywgc2V0IHRoZSBjb21wb25lbnQgYXMgc2VsZWN0ZWRDb21wb25lbnQKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRvU2VsZWN0Q29tcG9uZW50ID0gKGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTogdm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuc2VsZWN0ZWRDb21wb25lbnQgPT09IGNvbXBvbmVudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBDb2xsYXBzZSB0aGUgaXRlbQorICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50RnJvbVNlcnZlciA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCA9IGNvbXBvbmVudDsKKworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoY29tcG9uZW50RnJvbVNlcnZlcjogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50RnJvbVNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50RnJvbVNlcnZlciA9IGNvbXBvbmVudEZyb21TZXJ2ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0NzYXJDb21wb25lbnRFeGlzdHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50RnJvbVNlcnZlciA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzQ3NhckNvbXBvbmVudEV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBvbkVycm9yID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50RnJvbVNlcnZlciA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNDc2FyQ29tcG9uZW50RXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHRoaXMub25Cb2FyZGluZ1NlcnZpY2UuZ2V0Q29tcG9uZW50RnJvbUNzYXJVdWlkKCg8UmVzb3VyY2U+Y29tcG9uZW50KS5jc2FyVVVJRCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgfTsKKworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNvcnRlZFRhYmxlU2NvcGUgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS50YWJsZUhlYWRlcnNMaXN0ID0gWworICAgICAgICAgICAgICAgIHt0aXRsZTogJ05hbWUnLCBwcm9wZXJ0eTogJ25hbWUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdWZW5kb3InLCBwcm9wZXJ0eTogJ3ZlbmRvck5hbWUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdDYXRlZ29yeScsIHByb3BlcnR5OiAnY2F0ZWdvcmllcyd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ1ZlcnNpb24nLCBwcm9wZXJ0eTogJ2NzYXJWZXJzaW9uJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnIycsIHByb3BlcnR5OiAnaW1wb3J0QW5kVXBkYXRlJ30KKyAgICAgICAgICAgICAgICAvL3t0aXRsZTogJ0RhdGUnLCBwcm9wZXJ0eTogJ2NvbXBvbmVudERhdGUnfQorICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydCA9IChzb3J0Qnk6IHN0cmluZyk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJldmVyc2UgPSAodGhpcy4kc2NvcGUuc29ydEJ5ID09PSBzb3J0QnkpID8gIXRoaXMuJHNjb3BlLnJldmVyc2UgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSBzb3J0Qnk7CisgICAgICAgICAgICB9OworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdE1vZGFsU2NvcGUgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAvLyBFbmFibGUgdGhlIG1vZGFsIGRpcmVjdGl2ZSB0byBjbG9zZQorICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kYWxPbmJvYXJkaW5nID0gdGhpcy4kbW9kYWxJbnN0YW5jZTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRPbmJvYXJkaW5nQ29tcG9uZW50c0xpc3QgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKG9uYm9hcmRpbmdSZXNwb25zZTogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuSUNvbXBvbmVudD4pOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpbml0TWF4VmVyc2lvbk9mSXRlbXNJbkxpc3Qob25ib2FyZGluZ1Jlc3BvbnNlKTsKKworICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDc2FyVVVJRCkgeworICAgICAgICAgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmNvbXBvbmVudHNMaXN0ID0gdGhpcy4kZmlsdGVyKCdmaWx0ZXInKSh0aGlzLiRzY29wZS5jb21wb25lbnRzTGlzdCwge2NzYXJVVUlEOiB0aGlzLmN1cnJlbnRDc2FyVVVJRH0pOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnRzTGlzdCA9IHRoaXMuJGZpbHRlcignZmlsdGVyJykodGhpcy4kc2NvcGUuY29tcG9uZW50c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpOiBib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuY3NhclVVSUQgPT09IHRoaXMuY3VycmVudENzYXJVVUlEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVycm9yIGdldHRpbmcgb25ib2FyZGluZyBsaXN0Iik7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBpbml0TWF4VmVyc2lvbk9mSXRlbXNJbkxpc3QgPSAob25ib2FyZGluZ1Jlc3BvbnNlOiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5JQ29tcG9uZW50Pik6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIGl0ZW0KKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnRzTGlzdCA9IFtdOworCisgICAgICAgICAgICAgICAgLy8gR2V0IGFsbCB1bmlxdWUgaXRlbXMgZnJvbSB0aGUgbGlzdAorICAgICAgICAgICAgICAgIGxldCB1bmlxdWVJdGVtcyA9IF8udW5pcUJ5KG9uYm9hcmRpbmdSZXNwb25zZSwgJ3BhY2thZ2VJZCcpOworCisgICAgICAgICAgICAgICAgLy8gTG9vcCBvbiBhbGwgdGhlIGl0ZW1zIHdpdGggdW5pcXVlIHBhY2thZ2VJZAorICAgICAgICAgICAgICAgIF8uZWFjaCh1bmlxdWVJdGVtcywgKGl0ZW06IGFueSk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCB0aGUgaXRlbXMgdGhhdCBoYXMgc2FtZSBwYWNrYWdlSWQKKyAgICAgICAgICAgICAgICAgICAgbGV0IEl0ZW1zRm91bmQ6IEFycmF5PE1vZGVscy5Db21wb25lbnRzLklDb21wb25lbnQ+ID0gXy5maWx0ZXIob25ib2FyZGluZ1Jlc3BvbnNlLCAoaW5MaXN0SXRlbTogYW55KTogYW55ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbkxpc3RJdGVtLnBhY2thZ2VJZCA9PT0gaXRlbS5wYWNrYWdlSWQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb24gYWxsIHRoZSBpdGVtcyB3aXRoIHNhbWUgcGFja2FnZUlkIGFuZCBmaW5kIHRoZSBtYXggdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgbGV0IG1heEl0ZW06IGFueTsKKyAgICAgICAgICAgICAgICAgICAgXy5lYWNoKEl0ZW1zRm91bmQsIChJdGVtRm91bmQ6IGFueSk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXhJdGVtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SXRlbSA9IEl0ZW1Gb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4SXRlbSAmJiBwYXJzZUludChtYXhJdGVtLmNzYXJWZXJzaW9uKSA8IHBhcnNlSW50KEl0ZW1Gb3VuZC5jc2FyVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhJdGVtID0gSXRlbUZvdW5kOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50c0xpc3QucHVzaChtYXhJdGVtKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMub25Cb2FyZGluZ1NlcnZpY2UuZ2V0T25ib2FyZGluZ0NvbXBvbmVudHMoKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9vbmJvYXJkaW5nLW1vZGFsL29uYm9hcmRpbmctbW9kYWwtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvb25ib2FyZGluZy1tb2RhbC9vbmJvYXJkaW5nLW1vZGFsLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY5MTUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvb25ib2FyZGluZy1tb2RhbC9vbmJvYXJkaW5nLW1vZGFsLXZpZXcuaHRtbApAQCAtMCwwICsxLDE0MiBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxPbmJvYXJkaW5nIiBjbGFzcz0idy1zZGMtbW9kYWwtb25ib2FyZGluZyB3LXNkYy1jbGFzc2ljLXRvcC1saW5lLW1vZGFsIiBidXR0b25zPSJmb290ZXJCdXR0b25zIiBoZWFkZXI9IkltcG9ydCBWRiIgc2hvdy1jbG9zZS1idXR0b249InRydWUiPgorICAgIDxpbmZvLXRvb2x0aXAgY2xhc3M9ImdlbmVyYWwtaW5mby1idXR0b24iIGluZm8tbWVzc2FnZS10cmFuc2xhdGU9Ik9OX0JPQVJESU5HX0dFTkVSQUxfSU5GTyAiPjwvaW5mby10b29sdGlwPgorICAgIDxkaXYgY2xhc3M9InRpdGxlLXdyYXBwZXIiPgorICAgICAgICA8ZGl2PgorICAgICAgICAgICAgPHAgY2xhc3M9InN1Yi10aXRsZSI+U2VsZWN0IG9uZSBvZiB0aGUgc29mdHdhcmUgcHJvZHVjdCBjb21wb25lbnQgYmVsb3c6PC9wPgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJ0b3Atc2VhcmNoIj4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzZWFyY2gtdGV4dCIKKyAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VhcmNoIgorICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9InNlYXJjaEJpbmQiCisgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ib25ib2FyZGluZy1zZWFyY2giCisgICAgICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iIC8+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtc2VhcmNoLWljb24gbWFnbmlmaWNhdGlvbiI+PC9zcGFuPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbnRhaW5lci1mbGV4Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUiIGRhdGEtbmctY2xhc3M9Insndmlldy1tb2RlJzogaXNWaWV3TW9kZSgpfSI+CisKKyAgICAgICAgICAgIDwhLS0gVGFibGUgaGVhZGVycyAtLT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWQgZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciBoZWFkLXJvdyBoYW5kIGZsZXgtaXRlbSIgbmctcmVwZWF0PSJoZWFkZXIgaW4gdGFibGVIZWFkZXJzTGlzdCB0cmFjayBieSAkaW5kZXgiIGRhdGEtbmctY2xpY2s9InNvcnQoaGVhZGVyLnByb3BlcnR5KSIgZGF0YS10ZXN0cy1pZD0ie3toZWFkZXIudGl0bGV9fSI+e3toZWFkZXIudGl0bGV9fQorICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW5nLXNob3c9InNvcnRCeSA9PT0gaGVhZGVyLnByb3BlcnR5IiBjbGFzcz0idGFibGUtaGVhZGVyLXNvcnQtYXJyb3ciIGRhdGEtbmctY2xhc3M9InsnZG93bic6IHJldmVyc2UsICd1cCc6IXJldmVyc2V9Ij4gPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDwhLS0gVGFibGUgYm9keSAtLT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzdXBwcmVzcy1zY3JvbGwteD0idHJ1ZSIgc2Nyb2xsLXktbWFyZ2luLW9mZnNldD0iMCIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLSBJbiBjYXNlIHRoZSBjb21wb25lbnQgbGlzdCBpcyBlbXB0eSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSIhY29tcG9uZW50c0xpc3QgfHwgY29tcG9uZW50c0xpc3QubGVuZ3RoPT09MCIgY2xhc3M9Im5vLXJvdy10ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBubyBzb2Z0d2FyZSBwcm9kdWN0IGNvbXBvbmVudCB0byBkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9vcCBvbiBjb21wb25lbnRzIGxpc3QgLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQtc3RhcnQ9ImNvbXBvbmVudCBpbiBjb21wb25lbnRzTGlzdCB8IGZpbHRlcjogc2VhcmNoQmluZCB8IG9yZGVyQnk6c29ydEJ5OnJldmVyc2UgdHJhY2sgYnkgJGluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogY29tcG9uZW50ID09PSBzZWxlY3RlZENvbXBvbmVudH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iZG9TZWxlY3RDb21wb25lbnQoY29tcG9uZW50KTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iY3Nhci1yb3ciCisgICAgICAgICAgICAgICAgICAgICAgICAgPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iICBzZGMtc21hcnQtdG9vbHRpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlIHRhYmxlLWFycm93IiBkYXRhLW5nLWNsYXNzPSJ7J29wZW5lZCc6IGNvbXBvbmVudCA9PT0gc2VsZWN0ZWRDb21wb25lbnR9IiBkYXRhLXRlc3RzLWlkPSJ7e2NvbXBvbmVudC5uYW1lfX0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBvbmVudC5uYW1lfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZlbmRvciAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSIgZGF0YS10ZXN0cy1pZD0ie3tjb21wb25lbnQudmVuZG9yTmFtZX19IiBzZGMtc21hcnQtdG9vbHRpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBvbmVudC52ZW5kb3JOYW1lfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhdGVnb3J5IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiAgc2RjLXNtYXJ0LXRvb2x0aXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wb25lbnQuY2F0ZWdvcmllc1swXS5uYW1lfX0mbmJzcDt7e2NvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXNbMF0ubmFtZX19CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWZXJzaW9uIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiAgc2RjLXNtYXJ0LXRvb2x0aXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wb25lbnQuY3NhclZlcnNpb259fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW1wb3J0IEFuZCBVcGRhdGUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iICBzZGMtc21hcnQtdG9vbHRpcD48L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBkYXRhLW5nLWlmPSJjb21wb25lbnQ9PT1zZWxlY3RlZENvbXBvbmVudCIgY2xhc3M9Iml0ZW0tb3BlbmVkIj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1vcGVuZWQtZGVzY3JpcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tb3BlbmVkLWRlc2NyaXB0aW9uLXRpdGxlIj5WU1AgRGVzY3JpcHRpb246PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wb25lbnQuZGVzY3JpcHRpb259fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tb3BlbmVkLW1ldGFkYXRhMSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJpc0NzYXJDb21wb25lbnRFeGlzdHM9PT10cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1vcGVuZWQtbWV0YWRhdGEtdGl0bGUiPlZGJ1MgTWV0YSBEYXRhOjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJ0aCI+TmFtZTo8L3NwYW4+IHt7Y29tcG9uZW50RnJvbVNlcnZlci5uYW1lfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBjbGFzcz0idGgiPkxpZmVjeWNsZTo8L3NwYW4+IHt7Y29tcG9uZW50RnJvbVNlcnZlci5saWZlY3ljbGVTdGF0ZX19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gY2xhc3M9InRoIj5DcmVhdG9yOjwvc3Bhbj4ge3tjb21wb25lbnRGcm9tU2VydmVyLmNyZWF0b3JGdWxsTmFtZX19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1vcGVuZWQtbWV0YWRhdGEyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctaWY9ImlzQ3NhckNvbXBvbmVudEV4aXN0cz09PXRydWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpdGVtLW9wZW5lZC1tZXRhZGF0YS10aXRsZSI+Jm5ic3A7PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gY2xhc3M9InRoIj5VVUlEOjwvc3Bhbj4ge3tjb21wb25lbnRGcm9tU2VydmVyLnV1aWR9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJ0aCI+VmVyc2lvbjo8L3NwYW4+IHt7Y29tcG9uZW50RnJvbVNlcnZlci52ZXJzaW9ufX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBjbGFzcz0idGgiPk1vZGlmaWVyOjwvc3Bhbj4ge3tjb21wb25lbnRGcm9tU2VydmVyLmxhc3RVcGRhdGVyRnVsbE5hbWV9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctaWY9ImNvbXBvbmVudEZyb21TZXJ2ZXIubGlmZWN5Y2xlU3RhdGU9PT0nTk9UX0NFUlRJRklFRF9DSEVDS09VVCcgJiYgY29tcG9uZW50RnJvbVNlcnZlci5sYXN0VXBkYXRlclVzZXJJZCAhPT0gdXNlci51c2VySWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5vdGUiPkRlc2lnbmVycyBjYW5ub3QgdXBkYXRlIGEgVlNQIGlmIHRoZSBWRiBpcyBjaGVja2VkIG91dCBieSBhbm90aGVyIHVzZXIuPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJjb21wb25lbnRGcm9tU2VydmVyLmxpZmVjeWNsZVN0YXRlPT09J1JFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibm90ZSI+RGVzaWduZXJzIGNhbm5vdCB1cGRhdGUgYSBWU1AgaWYgdGhlIFZGIGlzIGluIFJlYWR5IGZvciB0ZXN0aW5nIHN0YXRlLjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1vcGVuZWQtbWV0YWRhdGEzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5mby10b29sdGlwIGNsYXNzPSJpbmZvLWJ1dHRvbiIgaW5mby1tZXNzYWdlLXRyYW5zbGF0ZT0ie3tpc0NzYXJDb21wb25lbnRFeGlzdHM/J09OX0JPQVJESU5HX1VQREFURV9JTkZPJzonT05fQk9BUkRJTkdfSU1QT1JUX0lORk8nfX0iIGRpcmVjdGlvbj0ibGVmdCI+PC9pbmZvLXRvb2x0aXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1vcGVuZWQtaWNvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0iaXNDc2FyQ29tcG9uZW50RXhpc3RzIT09dHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzcHJpdGUtbmV3IGltcG9ydC1maWxlLWJ0biIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9ImRvSW1wb3J0Q3NhcigpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWliLXRvb2x0aXA9IkltcG9ydCBWU1AiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLWNsYXNzPSJ1aWItY3VzdG9tLXRvb2x0aXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLXBsYWNlbWVudD0iYm90dG9tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iaW1wb3J0LWNzYXIiPjwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctaWY9ImlzQ3NhckNvbXBvbmVudEV4aXN0cz09PXRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic3ByaXRlLW5ldyByZWZyZXNoLWZpbGUtYnRuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWliLXRvb2x0aXA9IlVwZGF0ZSBWU1AiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLWNsYXNzPSJ1aWItY3VzdG9tLXRvb2x0aXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLXBsYWNlbWVudD0iYm90dG9tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IChjb21wb25lbnRGcm9tU2VydmVyLmxpZmVjeWNsZVN0YXRlPT09J05PVF9DRVJUSUZJRURfQ0hFQ0tPVVQnICYmIGNvbXBvbmVudEZyb21TZXJ2ZXIubGFzdFVwZGF0ZXJVc2VySWQhPT11c2VyLnVzZXJJZCkgfHwgY29tcG9uZW50RnJvbVNlcnZlci5saWZlY3ljbGVTdGF0ZT09PSdSRUFEWV9GT1JfQ0VSVElGSUNBVElPTid9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iZG9VcGRhdGVDc2FyKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ1cGRhdGUtY3NhciI+PC9zcGFuPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1jbGljaz0iZG93bmxvYWRDc2FyKGNvbXBvbmVudC5wYWNrYWdlSWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNwcml0ZS1uZXcgZG93bmxvYWQtZmlsZS1idG4gaGFuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpYi10b29sdGlwPSJEb3dubG9hZCBWU1AiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLWNsYXNzPSJ1aWItY3VzdG9tLXRvb2x0aXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLXBsYWNlbWVudD0iYm90dG9tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZG93bmxvYWQtY3NhciI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9hZGVyIGRhdGEtZGlzcGxheT0iaXNMb2FkaW5nIiByZWxhdGl2ZT0idHJ1ZSIgc2l6ZT0ic21hbGwiPjwvbG9hZGVyPgorCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgICAgIDwvZGl2PjwhLS0gRW5kIHRhYmxlIGJvZHkgLS0+CisgICAgICAgIDwvZGl2PjwhLS0gRW5kIHRhYmxlIC0tPgorICAgIDwvZGl2PjwhLS0gRW5kIHRhYmxlLWNvbnRhaW5lci1mbGV4IC0tPgorICAgIDxkaXYgY2xhc3M9Inctc2RjLW1vZGFsLWZvb3RlciBjbGFzc2ljIj48L2Rpdj4KKworPC9zZGMtbW9kYWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9vbmJvYXJkaW5nLW1vZGFsL29uYm9hcmRpbmctbW9kYWwubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL29uYm9hcmRpbmctbW9kYWwvb25ib2FyZGluZy1tb2RhbC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDVhODYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9vbmJvYXJkaW5nLW1vZGFsL29uYm9hcmRpbmctbW9kYWwubGVzcwpAQCAtMCwwICsxLDE0OCBAQAorLnctc2RjLW1vZGFsLW9uYm9hcmRpbmcgeworCisgICAgd2lkdGg6IDEwMCU7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworCisgICAgLmdlbmVyYWwtaW5mby1idXR0b257CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiAtNDBweDsKKyAgICAgICAgbGVmdDogODZweDsKKyAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgfQorCisgICAgLnRpdGxlLXdyYXBwZXIgeworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisgICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKKworICAgICAgICAuc3ViLXRpdGxlIHsKKyAgICAgICAgICAgIC5tXzE0X3I7CisgICAgICAgICAgICBmbG9hdDpsZWZ0OworICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLWNsYXNzaWMtYnRuIHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIH0KKworICAgIC50YWJsZXsKKyAgICAgICAgaGVpZ2h0OiA0NzJweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICB9CisKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggeworICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OworCisgICAgICAgIC50YWJsZSB7CisgICAgICAgICAgICAuYm9keSB7CisgICAgICAgICAgICAgICAgLmRhdGEtcm93ICsgZGl2Lml0ZW0tb3BlbmVkIHsKKyAgICAgICAgICAgICAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOworICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMDsKKworICAgICAgICAgICAgICAgICAgICAuaXRlbS1vcGVuZWQtZGVzY3JpcHRpb24tdGl0bGUsCisgICAgICAgICAgICAgICAgICAgIC5pdGVtLW9wZW5lZC1tZXRhZGF0YS10aXRsZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAubV8xNF9tOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLml0ZW0tb3BlbmVkLWRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAuaXRlbS1vcGVuZWQtbWV0YWRhdGExLAorICAgICAgICAgICAgICAgICAgICAuaXRlbS1vcGVuZWQtbWV0YWRhdGEyLAorICAgICAgICAgICAgICAgICAgICAuaXRlbS1vcGVuZWQtbWV0YWRhdGEzIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC50aCB7IC5tXzE0X207IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZXgtYmFzaXM6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogNXB4IDE1cHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAuaXRlbS1vcGVuZWQtZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgIC5pdGVtLW9wZW5lZC1tZXRhZGF0YTMgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQG1haW5fY29sb3JfbzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC5pdGVtLW9wZW5lZC1tZXRhZGF0YTIgeworICAgICAgICAgICAgICAgICAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ub3RlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogQGZ1bmNfY29sb3JfcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC5pdGVtLW9wZW5lZC1pY29uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZXgtYmFzaXM6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogNXB4IDE1cHg7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAuaXRlbS1vcGVuZWQtZGVzY3JpcHRpb24ge2ZsZXgtZ3JvdzogMjU7fQorICAgICAgICAgICAgICAgICAgICAuaXRlbS1vcGVuZWQtbWV0YWRhdGExIHtmbGV4LWdyb3c6IDI1O30KKyAgICAgICAgICAgICAgICAgICAgLml0ZW0tb3BlbmVkLW1ldGFkYXRhMiB7ZmxleC1ncm93OiAzMDt9CisgICAgICAgICAgICAgICAgICAgIC5pdGVtLW9wZW5lZC1tZXRhZGF0YTMgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbmZvLWJ1dHRvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLml0ZW0tb3BlbmVkLWljb24ge2ZsZXgtZ3JvdzogMTA7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDEpIHsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogMjU7CisgICAgICAgICAgICAuaGFuZDsKKyAgICAgICAgICAgIHNwYW4udGFibGUtYXJyb3cgeworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogN3B4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMikge2ZsZXgtZ3JvdzogMjU7fQorICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgzKSB7ZmxleC1ncm93OiAzMDt9CisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDQpIHtmbGV4LWdyb3c6IDEwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNSkge2ZsZXgtZ3JvdzogMTA7IH0KKworICAgIH0KKworICAgIC5kb3dubG9hZC1maWxlLWJ0biB7CisgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDRweDsKKyAgICB9CisKKyAgICAucmVmcmVzaC1maWxlLWJ0biwKKyAgICAuaW1wb3J0LWZpbGUtYnRuIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICBtYXJnaW4tbGVmdDogMjBweDsKKyAgICB9CisKKyAgICAudG9wLXNlYXJjaCB7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgICAgIGlucHV0LnNlYXJjaC10ZXh0IHsKKyAgICAgICAgICAgIC5ib3JkZXItcmFkaXVzKDJweCk7CisgICAgICAgICAgICB3aWR0aDogMjQ1cHg7CisgICAgICAgICAgICBoZWlnaHQ6IDMycHg7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBtYWluX2NvbG9yX287CisgICAgICAgICAgICBtYXJnaW46IDA7CisgICAgICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgICAgICAgdGV4dC1pbmRlbnQ6IDEwcHg7CisKKyAgICAgICAgICAgICY6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogU2FmYXJpLCBDaHJvbWUgYW5kIE9wZXJhICovCisgICAgICAgICAgICAmOi1tb3otcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRmlyZWZveCAxOC0gKi8KKyAgICAgICAgICAgICY6Oi1tb3otcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRmlyZWZveCAxOSsgKi8KKyAgICAgICAgICAgICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsgZm9udC1zdHlsZTogaXRhbGljOyB9IC8qIElFIDEwKyAqLworICAgICAgICAgICAgJjotbXMtaW5wdXQtcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRWRnZSAqLworICAgICAgICB9CisKKyAgICAgICAgLm1hZ25pZmljYXRpb24geworICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgdG9wOiAxMHB4OworICAgICAgICAgICAgcmlnaHQ6IDEwcHg7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9vbmJvYXJkLXZlbmRvci9vbmJvYXJkLXZlbmRvci12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9vbmJvYXJkLXZlbmRvci9vbmJvYXJkLXZlbmRvci12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmUyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL29uYm9hcmQtdmVuZG9yL29uYm9hcmQtdmVuZG9yLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwxNDggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi9yZWZlcmVuY2VzLnRzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBjbGFzcyBCcmVhZGNydW1ic01lbnVJdGVtIHsKKyAgICAgICAga2V5OiBzdHJpbmc7CisgICAgICAgIGRpc3BsYXlUZXh0OiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzTWVudSB7CisgICAgICAgIHNlbGVjdGVkS2V5OiBzdHJpbmc7CisgICAgICAgIG1lbnVJdGVtczogQXJyYXk8QnJlYWRjcnVtYnNNZW51SXRlbT47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzUGF0aCB7CisgICAgICAgIHNlbGVjdGVkS2V5czogQXJyYXk8c3RyaW5nPjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgVmVuZG9yRGF0YSB7CisgICAgICAgIGJyZWFkY3J1bWJzOiBCcmVhZGNydW1ic1BhdGg7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJT25ib2FyZFZlbmRvclZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgdmVuZG9yRGF0YTogVmVuZG9yRGF0YTsKKyAgICAgICAgb25WZW5kb3JFdmVudDogRnVuY3Rpb247CisgICAgICAgIHRvcE5hdk1lbnVNb2RlbDogQXJyYXk8VXRpbHMuTWVudUl0ZW1Hcm91cD47CisgICAgICAgIHRvcE5hdlJvb3RNZW51OiBVdGlscy5NZW51SXRlbUdyb3VwOworICAgICAgICB1c2VyOk1vZGVscy5JVXNlclByb3BlcnRpZXM7CisgICAgICAgIHZlcnNpb246c3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBPbmJvYXJkVmVuZG9yVmlld01vZGVsIHsKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRxJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlJworICAgICAgICBdOworCisgICAgICAgIHByaXZhdGUgZmlyc3RDb250cm9sbGVkVG9wTmF2TWVudTogVXRpbHMuTWVudUl0ZW1Hcm91cDsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgIHByaXZhdGUgJHNjb3BlOiBJT25ib2FyZFZlbmRvclZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgcHJpdmF0ZSAkcTogbmcuSVFTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlCisgICAgICAgICkgeworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52ZW5kb3JEYXRhID0geworICAgICAgICAgICAgICAgIGJyZWFkY3J1bWJzOiB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkS2V5czogW10KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52ZXJzaW9uID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCd2ZXJzaW9uJyk7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uVmVuZG9yRXZlbnQgPSAoZXZlbnROYW1lOnN0cmluZywgZGF0YTphbnkpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50TmFtZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdicmVhZGNydW1ic3VwZGF0ZWQnOgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVCcmVhZGNydW1ic1VwZGF0ZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRvcE5hdk1lbnVNb2RlbCA9IFtdOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS51c2VyID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCd1c2VyJyk7CisgICAgICAgIH0KKworICAgICAgICB1cGRhdGVCcmVhZGNydW1ic1BhdGggPSAoc2VsZWN0ZWRLZXlzOiBBcnJheTxzdHJpbmc+KTogbmcuSVByb21pc2U8Ym9vbGVhbj4gPT4geworICAgICAgICAgICAgbGV0IHRvcE5hdk1lbnVNb2RlbCA9IHRoaXMuJHNjb3BlLnRvcE5hdk1lbnVNb2RlbDsKKyAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gdG9wTmF2TWVudU1vZGVsLmluZGV4T2YodGhpcy5maXJzdENvbnRyb2xsZWRUb3BOYXZNZW51KTsKKyAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0b3BOYXZNZW51TW9kZWwubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9wTmF2TWVudU1vZGVsLnNwbGljZShzdGFydEluZGV4ICsgc2VsZWN0ZWRLZXlzLmxlbmd0aCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS52ZW5kb3JEYXRhID0geworICAgICAgICAgICAgICAgIGJyZWFkY3J1bWJzOiB7IHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLiRxLndoZW4odHJ1ZSk7CisgICAgICAgIH07CisKKyAgICAgICAgaGFuZGxlQnJlYWRjcnVtYnNVcGRhdGUoYnJlYWRjcnVtYnNNZW51czogQXJyYXk8QnJlYWRjcnVtYnNNZW51Pik6IHZvaWQgeworICAgICAgICAgICAgbGV0IHNlbGVjdGVkS2V5cyA9IFtdOworICAgICAgICAgICAgbGV0IHRvcE5hdk1lbnVzID0gYnJlYWRjcnVtYnNNZW51cy5tYXAoKGJyZWFkY3J1bWJNZW51LCBicmVhZGNydW1iSW5kZXgpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdG9wTmF2TWVudSA9IG5ldyBVdGlscy5NZW51SXRlbUdyb3VwKCk7CisgICAgICAgICAgICAgICAgdG9wTmF2TWVudS5tZW51SXRlbXMgPSBicmVhZGNydW1iTWVudS5tZW51SXRlbXMubWFwKG1lbnVJdGVtID0+CisgICAgICAgICAgICAgICAgICAgIG5ldyBVdGlscy5NZW51SXRlbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtLmRpc3BsYXlUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCcmVhZGNydW1ic1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXMuY29uY2F0KFttZW51SXRlbS5rZXldKV0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgdG9wTmF2TWVudS5zZWxlY3RlZEluZGV4ID0gXy5maW5kSW5kZXgoCisgICAgICAgICAgICAgICAgICAgIGJyZWFkY3J1bWJNZW51Lm1lbnVJdGVtcywKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0gPT4gbWVudUl0ZW0ua2V5ID09PSBicmVhZGNydW1iTWVudS5zZWxlY3RlZEtleQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRLZXlzLnB1c2goYnJlYWRjcnVtYk1lbnUuc2VsZWN0ZWRLZXkpOworICAgICAgICAgICAgICAgIHJldHVybiB0b3BOYXZNZW51OworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGxldCB0b3BOYXZNZW51TW9kZWwgPSB0aGlzLiRzY29wZS50b3BOYXZNZW51TW9kZWw7CisgICAgICAgICAgICBsZXQgbGVuID0gdG9wTmF2TWVudU1vZGVsLmxlbmd0aDsKKyAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gdG9wTmF2TWVudU1vZGVsLmluZGV4T2YodGhpcy5maXJzdENvbnRyb2xsZWRUb3BOYXZNZW51KTsKKyAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3BOYXZNZW51TW9kZWwuc3BsaWNlKHN0YXJ0SW5kZXgsIGxlbiAtIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgdG9wTmF2TWVudU1vZGVsLnB1c2guYXBwbHkodG9wTmF2TWVudU1vZGVsLCB0b3BOYXZNZW51cyk7CisgICAgICAgICAgICB0aGlzLmZpcnN0Q29udHJvbGxlZFRvcE5hdk1lbnUgPSB0b3BOYXZNZW51c1swXTsKKworICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IDEgJiYgdGhpcy4kc2NvcGUudG9wTmF2Um9vdE1lbnUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxldCB0b3BOYXZSb290TWVudSA9IHRvcE5hdk1lbnVNb2RlbFswXTsKKyAgICAgICAgICAgICAgICBsZXQgb25ib2FyZEl0ZW0gPSB0b3BOYXZSb290TWVudS5tZW51SXRlbXNbdG9wTmF2Um9vdE1lbnUuc2VsZWN0ZWRJbmRleF07CisgICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsQ2FsbGJhY2sgPSBvbmJvYXJkSXRlbS5jYWxsYmFjazsKKyAgICAgICAgICAgICAgICBvbmJvYXJkSXRlbS5jYWxsYmFjayA9ICguLi5hcmdzKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLnVwZGF0ZUJyZWFkY3J1bWJzUGF0aChbXSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbENhbGxiYWNrICYmIG9yaWdpbmFsQ2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKSB8fCByZXQ7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS50b3BOYXZSb290TWVudSA9IHRvcE5hdlJvb3RNZW51OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnVwZGF0ZUJyZWFkY3J1bWJzUGF0aChzZWxlY3RlZEtleXMpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvb25ib2FyZC12ZW5kb3Ivb25ib2FyZC12ZW5kb3Itdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9vbmJvYXJkLXZlbmRvci9vbmJvYXJkLXZlbmRvci12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZTJkMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvb25ib2FyZC12ZW5kb3Ivb25ib2FyZC12ZW5kb3Itdmlldy5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxkaXYgY2xhc3M9InNkYy1jYXRhbG9nLWNvbnRhaW5lciI+CisKKyAgICA8bG9hZGVyIGRhdGEtZGlzcGxheT0iZ3VpLmlzTG9hZGluZyI+PC9sb2FkZXI+Cis8IS0tCisgICAgPGVjb21wLWhlYWRlciBtZW51LWRhdGE9Im1lbnVJdGVtcyIgdmVyc2lvbj0ie3t2ZXJzaW9ufX0iPjwvZWNvbXAtaGVhZGVyPgorLS0+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1tYWluLWNvbnRhaW5lciI+CisgICAgICAgIDxwdW5jaC1vdXQgbmFtZT0iJ29uYm9hcmRpbmcvdmVuZG9yJyIgZGF0YT0idmVuZG9yRGF0YSIgIHVzZXI9InVzZXIiIG9uLWV2ZW50PSJvblZlbmRvckV2ZW50Ij48L3B1bmNoLW91dD4KKyAgICA8L2Rpdj4KKworICAgIDx0b3AtbmF2IHRvcC1sdmwtc2VsZWN0ZWQtaW5kZXg9IjIiIHNlYXJjaC1iaW5kPSJzZWFyY2guZmlsdGVyVGVybSIgbWVudS1tb2RlbD0idG9wTmF2TWVudU1vZGVsIiB2ZXJzaW9uPSJ7e3ZlcnNpb259fSIgaGlkZS1zZWFyY2g9InRydWUiPjwvdG9wLW5hdj4KKworPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL29uYm9hcmQtdmVuZG9yL29uYm9hcmQtdmVuZG9yLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL29uYm9hcmQtdmVuZG9yL29uYm9hcmQtdmVuZG9yLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0M2JiYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvb25ib2FyZC12ZW5kb3Ivb25ib2FyZC12ZW5kb3IubGVzcwpAQCAtMCwwICsxLDMwMyBAQAorLnNkYy1jYXRhbG9nLWNvbnRhaW5lciB7CisKKyAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0geworICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIH0KKworICAgIC8vIENoZWNrYm94ZXMKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQtdWwgeworICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICBtYXJnaW46IDA7CisKKyAgICAgICAgLmktc2RjLWNhdGFsb2ctc3ViY2F0ZWdvcmllcy1jaGVja2JveCB7CisgICAgICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OworICAgICAgICAgICAgbWFyZ2luOiAwOworCisgICAgICAgICAgICAuaS1zZGMtY2F0YWxvZy1ncm91cGluZy1jaGVja2JveCB7CisgICAgICAgICAgICAgICAgcGFkZGluZzogMCAwIDAgMjBweDsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWxpIHsKKyAgICAgICAgJjpsYXN0LWNoaWxkIHsKKyAgICAgICAgICAgIC5pLXNkYy1jYXRlZ29yaWVzLWxpc3QtaXRlbSB7CisgICAgICAgICAgICAgICAgbWFyZ2luOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLmktc2RjLWNhdGVnb3JpZXMtbGlzdC1pdGVtIHsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIC8vbWFyZ2luLWJvdHRvbTogNXB4OworICAgICAgICAvL3BhZGRpbmctbGVmdDogMTVweDsKKyAgICAgICAgLy90ZXh0LWluZGVudDogLTI0cHg7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIH0KKworICAgIC5pLXNkYy1zdWJjYXRlZ29yaWVzLWxpc3QtaXRlbSB7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICAvL3BhZGRpbmctbGVmdDogMjBweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICAgICAgbWFyZ2luOiAwOworICAgICAgICAvL3RleHQtaW5kZW50OiAtMTBweDsKKyAgICB9CisKKyAgICAvKkFkZGVkIGJ5IC0gSWtyYW0gKi8KKyAgICAgLmktc2RjLXByb2R1Y3QtaW5wdXQsCisgICAgLmktc2RjLXByb2R1Y3Qtc2VsZWN0IHsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcl9mOworICAgICAgICBtaW4taGVpZ2h0OiAzMHB4OworICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgbWFyZ2luOiAxcHggMDsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0YyRjJGMjsKKyAgICAgICAgb3V0bGluZTogbm9uZTsKKworICAgICAgICAmOmRpc2FibGVkIHsKKyAgICAgICAgICAgIC5kaXNhYmxlZDsKKyAgICAgICAgfQorICAgICAgICBvcHRncm91cHsKKyAgICAgICAgICAgIGNvbG9yOiBAY29sb3JfdTsKKyAgICAgICAgICAgIG9wdGlvbnsKKyAgICAgICAgICAgICAgICBjb2xvcjogQGNvbG9yX2I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0taWNvbiB7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIHJpZ2h0OiAtOHB4OworICAgICAgICB0b3A6IDZweDsKKyAgICB9CisKKyAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0geworICAgICAgICBtYXJnaW4tdG9wOiA3cHg7CisgICAgICAgICYuTk9UX0NFUlRJRklFRF9DSEVDS09VVCwKKyAgICAgICAgJi5OT1RfQ0VSVElGSUVEX0NIRUNLSU4geworICAgICAgICAgICAgLmktc2RjLWNhdGVnb3JpZXMtbGlzdC1pdGVtLWljb24geworICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwtb2xkLnBuZycpIG5vLXJlcGVhdCAtNTNweCAtMjg4OXB4OworICAgICAgICAgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICAgICAgICAgIGhlaWdodDogMTRweDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJi5DRVJUSUZJRUQgeworICAgICAgICAgICAgLmktc2RjLWNhdGVnb3JpZXMtbGlzdC1pdGVtLWljb24geworICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwtb2xkLnBuZycpIG5vLXJlcGVhdCAtNTNweCAtMzAzNHB4OworICAgICAgICAgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICAgICAgICAgIGhlaWdodDogMTZweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICYuUkVBRFlfRk9SX0NFUlRJRklDQVRJT04geworICAgICAgICAgICAgLmktc2RjLWNhdGVnb3JpZXMtbGlzdC1pdGVtLWljb24geworICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwtb2xkLnBuZycpIG5vLXJlcGVhdCAtNTNweCAtMjk4NXB4OworICAgICAgICAgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICAgICAgICAgIGhlaWdodDogMTZweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICYuQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyB7CisgICAgICAgICAgICAuaS1zZGMtY2F0ZWdvcmllcy1saXN0LWl0ZW0taWNvbiB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi8uLi9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLWdsb2JhbC1vbGQucG5nJykgbm8tcmVwZWF0IC01M3B4IC0yOTM0cHg7CisgICAgICAgICAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxNnB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJi5ESVNUUklCVVRFRCwKKyAgICAgICAgJi5UQkQgeworICAgICAgICAgICAgLmktc2RjLWNhdGVnb3JpZXMtbGlzdC1pdGVtLWljb24geworICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwtb2xkLnBuZycpIG5vLXJlcGVhdCAtNDNweCAtMzA4N3B4OworICAgICAgICAgICAgICAgIHdpZHRoOiAyNHB4OworICAgICAgICAgICAgICAgIGhlaWdodDogMTRweDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLmktc2RjLWNhdGVnb3JpZXMtbGlzdC1pbnB1dCB7CisgICAgICAgIG1hcmdpbjogOHB4OworCisgICAgfQorCisgICAgLmktc2RjLXN1YmNhdGVnb3JpZXMtbGlzdC1pbnB1dCB7CisKKyAgICAgICAgbWFyZ2luOiA4cHg7CisgICAgfQorICAgIC5pLXNkYy1zdWJjYXRlZ29yaWVzLWxpc3QtaW5wdXQtY29udGFpbmVyIHsKKyAgICAgICAgbWFyZ2luOiAwcHggMHB4IDBweCAyMHB4OworICAgICAgICBwYWRkaW5nOiAycHg7CisgICAgfQorCisgICAgLnctc2RjLWhlYWRlci1jYXRhbG9nLXNlYXJjaC1jb250YWluZXIgeworICAgICAgICBkaXNwbGF5OiB0YWJsZTsKKyAgICAgICAgcGFkZGluZzogMjFweCAwOworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisKKyAgICAgICAgLnctc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VhcmNoLWlucHV0IHsKKyAgICAgICAgICAgIGNvbG9yOiAjMDAwOworICAgICAgICAgICAgd2lkdGg6IDMwMHB4OworICAgICAgICB9CisKKyAgICAgICAvLyAubWFnbmlmaWNhdGlvbiB7CisgICAgICAvLyAgICAgIC5zcHJpdGU7CisgICAgICAvLyAgICAgIC5zcHJpdGUubWFnbmlmaWNhdGlvbi1nbGFzczsKKyAgICAgIC8vICAgICAgLmhhbmQ7CisgICAgICAvLyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIC8vICAgICAgdG9wOiA0MHB4OworICAgICAvLyAgICAgICByaWdodDogNDJweDsKKyAgICAgIC8vICB9CisgICAgfQorCisgICAgLnctc2RjLWNhdGFsb2ctbWFpbiB7CisgICAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsKKyAgICB9CisgICAgLnctc2RjLWRhc2hib2FyZC1jYXRhbG9nLWhlYWRlciB7CisgICAgICAgIC5iXzk7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OworICAgIH0KKworICAgIC53LXNkYy1kYXNoYm9hcmQtY2F0YWxvZy1oZWFkZXItb3JkZXIgeworICAgICAgICAuYl85OworICAgICAgICBmb250LXdlaWdodDogODAwOworICAgIH0KKworICAgIC53LXNkYy1kYXNoYm9hcmQtY2F0YWxvZy1zb3J0IHsKKyAgICAgICAgLmJfOTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgIHdoaXRlLXNwYWNlOnByZTsKKyAgICAgICAgJjpob3ZlcnsKKyAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgICAgICAgLmFfOTsKKyAgICAgICAgfQorICAgICAgICAmLmJsdWUgeworICAgICAgICAgICAgLmFfOTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC53LXNkYy1jYXRhbG9nLXNvcnQtYXJyb3d7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgJi51cHsKKyAgICAgICAgICAgIC5iXzk7CisgICAgICAgICAgICB3aWR0aDogMDsKKyAgICAgICAgICAgIGhlaWdodDogMDsKKyAgICAgICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDVweCBzb2xpZCA7CisgICAgICAgIH0KKyAgICAgICAgJi5kb3dueworICAgICAgICAgICAgLmJfOTsKKyAgICAgICAgICAgIHdpZHRoOiAwOworICAgICAgICAgICAgaGVpZ2h0OiAwOworICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgICAgICAgYm9yZGVyLXRvcDogNXB4IHNvbGlkOworICAgICAgICB9CisgICAgfQorCisKKworCisgICAgLnctc2RjLWRhc2hib2FyZC1jYXRhbG9nLWhlYWRlci1yaWdodHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIHBhZGRpbmctcmlnaHQ6MzRweDsKKyAgICB9CisKKyAgICAudy1zZGMtaGVhZGVyLWNhdGFsb2ctc2VhcmNoLWlucHV0IHsKKyAgICAgICAgd2lkdGg6IDQyMHB4OworICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOworICAgICAgICBwYWRkaW5nOiAwIDI1cHggMXB4IDEwcHg7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiY2JjYmM7CisgICAgICAgIC5ib3JkZXItcmFkaXVzKDEwcHgpOworICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICAgIG1hcmdpbjogMTBweCAzMHB4OworICAgICAgICBvdXRsaW5lOiBub25lOworICAgIH0KKworICAgIC5zZGMtY2F0YWxvZy10eXBlLWZpbHRlci1jb250YWluZXIgeworICAgICAgICBtYXJnaW4tdG9wOiAtMXB4OworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUgeworICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgICAgICAubF8xNF9tOworICAgICAgICBsaW5lLWhlaWdodDogMzBweDsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlLWljb24geworICAgICAgICAuaGFuZDsKKyAgICAgICAgLnRsdi1zcHJpdGU7CisgICAgICAgIC5mb290ZXItY2xvc2U7CisgICAgICAgIHRyYW5zaXRpb246IC4zcyBhbGw7CisgICAgICAgIG1hcmdpbi10b3A6IC00cHg7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZS10ZXh0IHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CisgICAgfQorCisgICAgLnNlcGVyYXRvci1sZWZ0LAorICAgIC5zZXBlcmF0b3ItcmlnaHQgeworICAgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCBAY29sb3JfbTsKKyAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKKyAgICAgICAgd2lkdGg6IDJweDsKKyAgICB9CisKKyAgICAvLyBSb3RhdGUgY2F0YWxvZyBsZWZ0IHNpZGUgYXJyb3dzCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZS5leHBhbmRlZCAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLXRpdGxlLWljb24geworICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOworICAgIH0KKworICAgIC8vIFRyYW5zZm9ybSBjYXRhbG9nIGxlZnQgc2lkZSBzZWN0aW9ucworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUgKyAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQgeworICAgICAgICBtYXgtaGVpZ2h0OiAwcHg7CisgICAgICAgIG1hcmdpbjogMCBhdXRvOworICAgICAgICB0cmFuc2l0aW9uOiBhbGwgLjNzOworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICBwYWRkaW5nOiAwIDEwcHggMCAxOHB4OworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUuZXhwYW5kZWQgKyAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQgeworICAgICAgICBtYXgtaGVpZ2h0OiA5OTk5cHg7CisgICAgICAgIG1hcmdpbjogMCBhdXRvIDFweDsKKyAgICAgICAgdHJhbnNpdGlvbjogYWxsIC4zczsKKyAgICAgICAgcGFkZGluZzogMTBweCAxOHB4IDEwcHggMThweDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICB9CisKK30KKworLnctc2RjLXNlYXJjaC1pY29ueworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICByaWdodDogNDBweDsKKyAgICB0b3A6IDQwcHg7CisgICAgJi5sZWZ0YmFyeworICAgICAgICB0b3A6IDE5cHg7CisgICAgICAgIHJpZ2h0OiAxOHB4OworICAgIH0KKyAgICAmLm1hZ25pZmljYXRpb24geworICAgICAgICAuc3ByaXRlOworICAgICAgICAuc3ByaXRlLm1hZ25pZmljYXRpb24tZ2xhc3M7CisgICAgICAgIC5oYW5kOworICAgIH0KKyAgICAmLmNhbmNlbCB7CisgICAgICAgIC5zcHJpdGU7CisgICAgICAgIC5zcHJpdGUuY2xlYXItdGV4dDsKKyAgICAgICAgLmhhbmQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9wcmVsb2FkaW5nL3ByZWxvYWRpbmctdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9wcmVsb2FkaW5nL3ByZWxvYWRpbmctdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTEyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3ByZWxvYWRpbmcvcHJlbG9hZGluZy12aWV3Lmh0bWwKQEAgLTAsMCArMSw5IEBACis8ZGl2IGNsYXNzPSJzZGMtbG9hZGluZy1wYWdlIj4KKyAgICA8aDEgY2xhc3M9ImNhcHRpb24xIiB0cmFuc2xhdGU9IlNJR05fSU5fQ0FQVElPTiI+PC9oMT4KKyAgICA8cCBjbGFzcz0iY2FwdGlvbjIiIHRyYW5zbGF0ZT0iU0lHTl9JTl9ERVNDUklQVElPTiI+PC9wPgorCisgICAgPGRpdiBjbGFzcz0ibG9hZC1jb250YWluZXItd3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9ImxvYWQtY29udGFpbmVyIGxvYWQyIGFuaW1hdGVkIGZhZGVJbiI+PGRpdiBjbGFzcz0ibG9hZGVyIj5Mb2FkaW5nLi4uPC9kaXY+PC9kaXY+CisgICAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9wcmVsb2FkaW5nL3ByZWxvYWRpbmctdmlldy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9wcmVsb2FkaW5nL3ByZWxvYWRpbmctdmlldy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMmVhNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3ByZWxvYWRpbmcvcHJlbG9hZGluZy12aWV3Lmxlc3MKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisuc2RjLWxvYWRpbmctcGFnZSB7CisKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9sOworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworCisgICAgaDEgeworICAgICAgICAuY181OworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgfQorCisgICAgcCB7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICAuZV80OworICAgIH0KKworICAgIC5jYXB0aW9uMSwgLmNhcHRpb24yIHsKKyAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOworICAgIH0KKworICAgIC5sb2FkLWNvbnRhaW5lci13cmFwcGVyIHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgICAgIC5sb2FkLWNvbnRhaW5lciB7CisKKyAgICAgICAgICAgIEBiYWNrZ3JvdW5kX2NvbG9yOiAjMDAwMDAwOworCisgICAgICAgICAgICAubG9hZGVyLAorICAgICAgICAgICAgLmxvYWRlcjpiZWZvcmUsCisgICAgICAgICAgICAubG9hZGVyOmFmdGVyIHsKKyAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAubG9hZGVyOmJlZm9yZSwKKyAgICAgICAgICAgIC5sb2FkZXI6YWZ0ZXIgeworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgICAgICBjb250ZW50OiAnJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5sb2FkZXI6YmVmb3JlIHsKKyAgICAgICAgICAgICAgICB3aWR0aDogNS4yZW07CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMC4yZW07CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogQGJhY2tncm91bmRfY29sb3I7CisgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTAuMmVtIDAgMCAxMC4yZW07CisgICAgICAgICAgICAgICAgdG9wOiAtMC4xZW07CisgICAgICAgICAgICAgICAgbGVmdDogLTAuMWVtOworICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNS4yZW0gNS4xZW07CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogNS4yZW0gNS4xZW07CisgICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGxvYWQyIDJzIGluZmluaXRlIGVhc2UgMS41czsKKyAgICAgICAgICAgICAgICBhbmltYXRpb246IGxvYWQyIDJzIGluZmluaXRlIGVhc2UgMS41czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5sb2FkZXIgeworICAgICAgICAgICAgICAgIGNvbG9yOiAjZmZmZmZmOworICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICAgICAgICAgICAgICB0ZXh0LWluZGVudDogLTk5OTk5ZW07CisgICAgICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CisgICAgICAgICAgICAgICAgLyEqbWFyZ2luOiA1NXB4IGF1dG87KiEvCisgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICAgICAgICAgIHdpZHRoOiAxMGVtOworICAgICAgICAgICAgICAgIGhlaWdodDogMTBlbTsKKyAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxZW07CisgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CisgICAgICAgICAgICAgICAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAubG9hZGVyOmFmdGVyIHsKKyAgICAgICAgICAgICAgICB3aWR0aDogNS4yZW07CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMC4yZW07CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogQGJhY2tncm91bmRfY29sb3I7CisgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAxMC4yZW0gMTAuMmVtIDA7CisgICAgICAgICAgICAgICAgdG9wOiAtMC4xZW07CisgICAgICAgICAgICAgICAgbGVmdDogNS4xZW07CisgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAwcHggNS4xZW07CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDUuMWVtOworICAgICAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBsb2FkMiAycyBpbmZpbml0ZSBlYXNlOworICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogbG9hZDIgMnMgaW5maW5pdGUgZWFzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsb2FkMiB7CisgICAgICAgICAgICAgICAgMCUgeworICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgMTAwJSB7CisgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAa2V5ZnJhbWVzIGxvYWQyIHsKKyAgICAgICAgICAgICAgICAwJSB7CisgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAxMDAlIHsKKyAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CisqLwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9wcmVsb2FkaW5nL3ByZWxvYWRpbmctdmlldy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvcHJlbG9hZGluZy9wcmVsb2FkaW5nLXZpZXcudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyN2I3MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvcHJlbG9hZGluZy9wcmVsb2FkaW5nLXZpZXcudHMKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElQcmVMb2FkaW5nVmlld1Njb3BlIHsKKyAgICAgICAgc3RhcnRab29tSW46IGJvb2xlYW47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFByZUxvYWRpbmdWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJyRzY29wZSddOworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJUHJlTG9hZGluZ1ZpZXdTY29wZSl7CisgICAgICAgICAgICB0aGlzLmluaXQoJHNjb3BlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdCA9ICgkc2NvcGU6SVByZUxvYWRpbmdWaWV3U2NvcGUpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJy5jYXB0aW9uMScpLCdmYWRlSW5VcCcsNDAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcuY2FwdGlvbjInKSwnZmFkZUluVXAnLDgwMCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBhbmltYXRlID0gKGVsZW1lbnQ6YW55LCBhbmltYXRpb246c3RyaW5nLCB3aGVuOm51bWJlcik6dm9pZCA9PiB7CisgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKT0+eworICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoImFuaW1hdGVkICIgKyBhbmltYXRpb24pOworICAgICAgICAgICAgICAgIGVsZW1lbnRbMF0uc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IjsKKyAgICAgICAgICAgIH0sd2hlbik7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3N1cHBvcnQvc3VwcG9ydC12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9zdXBwb3J0L3N1cHBvcnQtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQyY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9zdXBwb3J0L3N1cHBvcnQtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDM4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAndXNlIHN0cmljdCc7CisKKyAgaW50ZXJmYWNlIElTdXBwb3J0Vmlld01vZGVsU2NvcGUgeworICAgICAgdmVyc2lvbjpzdHJpbmc7CisgIH0KKworICBleHBvcnQgY2xhc3MgU3VwcG9ydFZpZXdNb2RlbHsKKworICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJyRzY29wZScsJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnXTsKKyAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJU3VwcG9ydFZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSl7CisgICAgICAgIHRoaXMuJHNjb3BlLnZlcnNpb24gPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ3ZlcnNpb24nKTsKKyAgICB9CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9zdXBwb3J0L3N1cHBvcnQtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9zdXBwb3J0L3N1cHBvcnQtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3N1cHBvcnQvc3VwcG9ydC12aWV3Lmh0bWwKQEAgLTAsMCArMSwzMyBAQAorPGRpdiBjbGFzcz0iZnVsbC1oZWlnaHQiID4KKyAgPGxvYWRlciBkYXRhLWRpc3BsYXk9ImlzTG9hZGluZyI+PC9sb2FkZXI+CisgIDxkaXYgY2xhc3M9Inctc2RjLWhlYWRlciI+CisgICAgPGRpdiBjbGFzcz0idy1zZGMtaGVhZGVyLWxvZ28iPgorICAgICAgPGRpdiBjbGFzcz0idy1zZGMtaGVhZGVyLWxvZ28taWNvbiBzcHJpdGUgbG9nbyI+PC9kaXY+CisgICAgICA8YSBjbGFzcz0idy1zZGMtaGVhZGVyLWxvZ28tbGluayIgZGF0YS11aS1zcmVmPSJkYXNoYm9hcmQiPkFTREM8L2E+CisgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1oZWFkZXItdmVyc2lvbiI+IHYue3t2ZXJzaW9ufX08L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJpLXNkYy1oZWFkZXItY2FwdGlvbiI+U3VwcG9ydDwvZGl2PgorICAgIDx1c2VyLWhlYWRlci1kZXRhaWxzID48L3VzZXItaGVhZGVyLWRldGFpbHM+CisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJ3LXNkYy1tYWluLWNvbnRhaW5lciI+CisgICAgPGRpdiAgY2xhc3M9Inctc2RjLWxlZnQtc2lkZWJhciI+CisgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1sZWZ0LXNpZGViYXItaW4tcHJvZ3Jlc3MiID4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtbGVmdC1zaWRlYmFyLWl0ZW0gY2F0ZWdvcnktdGl0bGUiIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWRMaW5rJzpzZWxlY3RlZExlZnRCYXJHcm91cExpbmsgPT09IGluUHJvZ3Jlc3NFbnVtVmFsfSIgIGRhdGEtbmctY2xpY2s9InNldFNlbGVjdGVkRW50aXRpZXNCeUVudGl0eUdyb3VwKGluUHJvZ3Jlc3NFbnVtVmFsKSIgPkluIERlc2lnbiAoe3tudW1PZkNoZWNrT3V0RW50aXRpZXMrbnVtT2ZDaGVja0luRW50aXRpZXN9fSk8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtbGVmdC1zaWRlYmFyLWl0ZW0iIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWRMaW5rJzpzZWxlY3RlZExlZnRCYXJTdGF0ZUxpbms9PT1ub3RDZXJ0aWZpZWRDaGVja091dEVudW1WYWx9IiAgZGF0YS1uZy1jbGljaz0ic2V0U2VsZWN0ZWRFbnRpdGllc0J5RW50aXR5R3JvdXBBbmRFbnRpdHlTdGF0ZShpblByb2dyZXNzRW51bVZhbCwgbm90Q2VydGlmaWVkQ2hlY2tPdXRFbnVtVmFsKSIgPkNoZWNrZWQgT3V0ICh7e251bU9mQ2hlY2tPdXRFbnRpdGllc319KTwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1sZWZ0LXNpZGViYXItaXRlbSIgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZExpbmsnOnNlbGVjdGVkTGVmdEJhclN0YXRlTGluaz09PW5vdENlcnRpZmllZENoZWNrSW5FbnVtVmFsfSIgZGF0YS1uZy1jbGljaz0ic2V0U2VsZWN0ZWRFbnRpdGllc0J5RW50aXR5R3JvdXBBbmRFbnRpdHlTdGF0ZShpblByb2dyZXNzRW51bVZhbCwgbm90Q2VydGlmaWVkQ2hlY2tJbkVudW1WYWwpIiA+Q2hlY2tlZCBJbiAoe3tudW1PZkNoZWNrSW5FbnRpdGllc319KTwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1sZWZ0LXNpZGViYXItZm9sbG93aW5nIiA+CisgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWxlZnQtc2lkZWJhci1pdGVtIGNhdGVnb3J5LXRpdGxlIiBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkTGluayc6c2VsZWN0ZWRMZWZ0QmFyR3JvdXBMaW5rPT09Zm9sbG93aW5nRW51bVZhbH0iICBkYXRhLW5nLWNsaWNrPSJzZXRTZWxlY3RlZEVudGl0aWVzQnlFbnRpdHlHcm91cChmb2xsb3dpbmdFbnVtVmFsKSIgPkNvbXBsZXRlZCBEZXNpZ24gKHt7bnVtT2ZSZWFkeUZvckNlcnRpZmljYXRpb25FbnRpdGllcytudW1PZkNlcnRpZmljYXRpb25JblByb2dyZXNzRW50aXRpZXMrbnVtT2ZDZXJ0aWZpZWRFbnRpdGllc319KTwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1sZWZ0LXNpZGViYXItaXRlbSIgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZExpbmsnOnNlbGVjdGVkTGVmdEJhclN0YXRlTGluaz09PXJlYWR5Rm9yQ2VydGlmaWNhdGlvbkVudW1WYWx9IiBkYXRhLW5nLWNsaWNrPSJzZXRTZWxlY3RlZEVudGl0aWVzQnlFbnRpdHlHcm91cEFuZEVudGl0eVN0YXRlKGZvbGxvd2luZ0VudW1WYWwsIHJlYWR5Rm9yQ2VydGlmaWNhdGlvbkVudW1WYWwpIiA+UmVhZHkgRm9yIENlcnRpZmljYXRpb24gKHt7bnVtT2ZSZWFkeUZvckNlcnRpZmljYXRpb25FbnRpdGllc319KTwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1sZWZ0LXNpZGViYXItaXRlbSIgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZExpbmsnOnNlbGVjdGVkTGVmdEJhclN0YXRlTGluaz09PWNlcnRpZmljYXRpb25JblByb2dyZXNzRW51bVZhbH0iICBkYXRhLW5nLWNsaWNrPSJzZXRTZWxlY3RlZEVudGl0aWVzQnlFbnRpdHlHcm91cEFuZEVudGl0eVN0YXRlKGZvbGxvd2luZ0VudW1WYWwsIGNlcnRpZmljYXRpb25JblByb2dyZXNzRW51bVZhbCkiID5DZXJ0aWZpY2F0aW9uIEluIFByb2dyZXNzICh7e251bU9mQ2VydGlmaWNhdGlvbkluUHJvZ3Jlc3NFbnRpdGllc319KTwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1sZWZ0LXNpZGViYXItaXRlbSIgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZExpbmsnOnNlbGVjdGVkTGVmdEJhclN0YXRlTGluaz09PWNlcnRpZmllZEVudW1WYWx9IiAgZGF0YS1uZy1jbGljaz0ic2V0U2VsZWN0ZWRFbnRpdGllc0J5RW50aXR5R3JvdXBBbmRFbnRpdHlTdGF0ZShmb2xsb3dpbmdFbnVtVmFsLCBjZXJ0aWZpZWRFbnVtVmFsKSIgPkNlcnRpZmllZCAoe3tudW1PZkNlcnRpZmllZEVudGl0aWVzfX0pPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXYgIGNsYXNzPSJ3LXNkYy1sZWZ0LXNpZGViYXItbmF2Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtbGVmdC1zaWRlYmFyLW5hdi1pdGVtIGNhdGFsb2ciIGRhdGEtdWktc3JlZj0iY2F0YWxvZyI+Q2F0YWxvZzwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1sZWZ0LXNpZGViYXItbmF2LWl0ZW0gc3VwcG9ydCIgIGRhdGEtdWktc3JlZj0ic3VwcG9ydCI+U3VwcG9ydDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKworICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy9zdXBwb3J0L3N1cHBvcnQubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvc3VwcG9ydC9zdXBwb3J0Lmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1OWUzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvc3VwcG9ydC9zdXBwb3J0Lmxlc3MKQEAgLTAsMCArMSw4IEBACisudy1zZGMtbGVmdC1zaWRlYmFyLWluLXByb2dyZXNzLAorLnctc2RjLWxlZnQtc2lkZWJhci1mb2xsb3dpbmcgeworICAgIC5iXzc7Cit9CisKKy53LXNkYy1sZWZ0LXNpZGViYXItZm9sbG93aW5nIHsKKyAgICBwYWRkaW5nOiAxM3B4IDA7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3RhYnMvZ2VuZXJhbC10YWIubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvdGFicy9nZW5lcmFsLXRhYi5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YjRmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3RhYnMvZ2VuZXJhbC10YWIubGVzcwpAQCAtMCwwICsxLDEzMSBAQAorLnNkYy1nZW5lcmFsLXRhYiB7CisKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIG1pbi1oZWlnaHQ6IDEwMCU7CisgICAgZmxleC1mbG93OiBjb2x1bW47CisKKyAgICAuc2RjLWVkaXQtaWNvbiB7CisgICAgICAgIC5zcHJpdGU7CisgICAgICAgIC5lLXNkYy1zbWFsbC1pY29uLXBlbmNpbDsKKyAgICB9CisgICAgLnNkYy1nZW5lcmFsLXRhYi10aXRsZSB7CisKKyAgICAgICAgLmYtY29sb3IuYTsKKyAgICAgICAgLmYtdHlwZS5fMTRfbTsKKyAgICAgICAgcGFkZGluZzogMHB4IDBweCAxNXB4IDBweDsKKyAgICAgICAgbWFyZ2luOiAwcHggMjBweCAwcHggMjBweDsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBtYWluX2NvbG9yX287CisgICAgfQorCisgICAgLnNkYy1nZW5lcmFsLXRhYi1zdWItdGl0bGUgeworCisgICAgICAgIC5mLWNvbG9yLmE7CisgICAgICAgIC5mLXR5cGUuXzE0X207CisgICAgICAgIHBhZGRpbmc6IDE1cHggMjBweCAxNXB4IDIwcHg7CisKKyAgICB9CisKKyAgICAvL3Njcm9sbGJhcgorICAgIC5nZW5lcmFsLXRhYi1zY3JvbGxiYXItY29udGFpbmVyIHsKKworICAgICAgICAucGVyZmVjdC1zY3JvbGxiYXI7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgIH0KKworICAgIC8vcGx1cyBtaW51cyBleHBhbmQgY29sbGFwc2UKKyAgICAuZ2VuZXJhbC10YWItZXhwYW5kLWNvbGxhcHNlIHsKKworICAgICAgICAmLmV4cGFuZGVkIHsKKyAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtdGl0bGUgeworICAgICAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtdGl0bGUtaWNvbiB7CisgICAgICAgICAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtbWludXMtaWNvbjsKKworICAgICAgICAgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtbWludXMtaWNvbi5ob3ZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC5leHBhbmQtY29sbGFwc2UtdGl0bGUgeworCisgICAgICAgICAgICBwYWRkaW5nOiA4cHggMjBweCA0cHggMjBweDsKKyAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluX2NvbG9yX287CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtdGl0bGUtaWNvbiB7CisgICAgICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICAgICAgLnNwcml0ZS1uZXc7CisgICAgICAgICAgICAgICAgLmV4cGFuZC1jb2xsYXBzZS1wbHVzLWljb247CisgICAgICAgICAgICAgICAgJjpob3ZlciB7CisgICAgICAgICAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtcGx1cy1pY29uLmhvdmVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgLmV4cGFuZC1jb2xsYXBzZS10aXRsZS10ZXh0IHsKKyAgICAgICAgICAgICAgICBtYXgtd2lkdGg6IDIyNXB4OworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OworICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxNXB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC5zZWxlY3RlZCB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9hOworICAgICAgICAgICAgLmYtY29sb3IucDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLmV4cGFuZC1jb2xsYXBzZS1zdWItdGl0bGUgeworICAgICAgICBtYXgtd2lkdGg6IDE5MHB4OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICBwYWRkaW5nLWxlZnQ6IDQzcHg7CisKKyAgICB9CisKKyAgICAvL3Jlc2l6YWJsZSB2aWV3CisgICAgLnJlc2l6YWJsZS1jb250YWluZXIgeworCisgICAgICAgIGZsZXg6IDEgMSBhdXRvOworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICAgICAgICBoZWlnaHQ6IDkwJTsKKworICAgICAgICAucmVzaXphYmxlLXNlY3Rpb24geworICAgICAgICAgICAgbWluLWhlaWdodDogNTBweDsKKyAgICAgICAgICAgIGZsZXg6IDE7CisgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICAgICAgZmxleC1mbG93OiBjb2x1bW47CisgICAgICAgICAgICAmLnJlc2l6YWJsZSB7CisgICAgICAgICAgICAgICAgZmxleDogMCAwIDMwMHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy90aGlzIGlzIHRoZSByZXNpemFibGUgaWNvbiBjdXN0b20gZGVzaWduIGZvciB0aGUgYW5ndWxhciByZXNpemFibGUgZGlyZWN0aXZlCisgICAgICAgIC5yZy10b3AgeworICAgICAgICAgICAgc3BhbiB7CisgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogLTVweDsKKyAgICAgICAgICAgICAgICAmOmJlZm9yZSB7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBkb3R0ZWQgQG1haW5fY29sb3JfbTsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudDogJyc7CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDM5cHg7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNnB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBkb3R0ZWQgQG1haW5fY29sb3JfbTsKKyAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkIEBtYWluX2NvbG9yX207CisgICAgICAgICAgICAgICAgd2lkdGg6IDM5cHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiA0cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3RhYnMvaGllcmFyY2h5L2hpZXJhcmNoeS12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHktdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU5MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHktdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDk5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA3LzI4LzIwMTYuCisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNC80LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBNb2R1bGUgPSBTZGMuTW9kZWxzLk1vZHVsZTsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUhpZXJhcmNoeVNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgc2VsZWN0ZWRJbmRleDogbnVtYmVyOworICAgICAgICBzZWxlY3RlZE1vZHVsZTpNb2RlbHMuRGlzcGxheU1vZHVsZTsKKyAgICAgICAgc2luZ2xlVGFiOk1vZGVscy5UYWI7CisgICAgICAgIHRlbXBsYXRlVXJsOnN0cmluZzsKKyAgICAgICAgaXNMb2FkaW5nOmJvb2xlYW47CisKKyAgICAgICAgb25Nb2R1bGVTZWxlY3RlZChtb2R1bGVJZDpzdHJpbmcsIHNlbGVjdGVkSW5kZXg6IG51bWJlcik6dm9pZDsKKyAgICAgICAgb25Nb2R1bGVOYW1lQ2hhbmdlZChtb2R1bGU6TW9kZWxzLkRpc3BsYXlNb2R1bGUpOnZvaWQ7CisgICAgICAgIHVwZGF0ZUhlYXROYW1lKCk6dm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgSGllcmFyY2h5Vmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJSGllcmFyY2h5U2NvcGUpIHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudCA9IHRoaXMuJHNjb3BlLnNpbmdsZVRhYi5kYXRhOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZU1ldGhvZHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlTWV0aG9kcygpOnZvaWQgeworCisgICAgICAgICAgICB0aGlzLiRzY29wZS50ZW1wbGF0ZVVybCA9ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvdGFicy9oaWVyYXJjaHkvZWRpdC1tb2R1bGUtbmFtZS1wb3BvdmVyLmh0bWwnOworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25Nb2R1bGVTZWxlY3RlZCA9IChtb2R1bGVJZDpzdHJpbmcsIHNlbGVjdGVkSW5kZXg6IG51bWJlcik6dm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKG1vZHVsZTpNb2RlbHMuRGlzcGxheU1vZHVsZSkgPT4geworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiTW9kdWxlIExvYWRlZDogIiwgbW9kdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRNb2R1bGUgPSBtb2R1bGU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRleDsKKyAgICAgICAgICAgICAgICBpZiggIXRoaXMuJHNjb3BlLnNlbGVjdGVkTW9kdWxlIHx8ICh0aGlzLiRzY29wZS5zZWxlY3RlZE1vZHVsZSAmJiB0aGlzLiRzY29wZS5zZWxlY3RlZE1vZHVsZS51bmlxdWVJZCAhPSBtb2R1bGVJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmdldE1vZHVsZUZvckRpc3BsYXkobW9kdWxlSWQpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlSGVhdE5hbWUgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbE5hbWU6c3RyaW5nID0gdGhpcy4kc2NvcGUuc2VsZWN0ZWRNb2R1bGUubmFtZTsKKworICAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKG1vZHVsZTpNb2RlbHMuTW9kdWxlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJNb2R1bGUgbmFtZSB1cGRhdGVkOiIsIG1vZHVsZS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRNb2R1bGUubmFtZSA9IG1vZHVsZS5uYW1lOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKCkgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRNb2R1bGUubmFtZSA9IG9yaWdpbmFsTmFtZTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRNb2R1bGUudXBkYXRlTmFtZSgpOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC51cGRhdGVHcm91cE1ldGFkYXRhKG5ldyBNb2RlbHMuRGlzcGxheU1vZHVsZSh0aGlzLiRzY29wZS5zZWxlY3RlZE1vZHVsZSkpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHktdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHktdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTEwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3RhYnMvaGllcmFyY2h5L2hpZXJhcmNoeS12aWV3Lmh0bWwKQEAgLTAsMCArMSw1NyBAQAorPGRpdiBjbGFzcz0ic2RjLWdlbmVyYWwtdGFiIGhpZXJhcmNoeS10YWIiIG5nLWNsYXNzPSIiPgorICAgIDxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciIHJlbGF0aXZlPSJ0cnVlIiBzaXplPSJtZWRpdW0iPjwvbG9hZGVyPgorICAgIDxkaXYgY2xhc3M9InNkYy1nZW5lcmFsLXRhYi10aXRsZSIgZGF0YS10ZXN0cy1pZD0idGFiLWhlYWRlciIgdHJhbnNsYXRlPSJISUVSQVJDSFlfVEFCX1RJVExFIj48L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJzZGMtZ2VuZXJhbC10YWItc3ViLXRpdGxlIiBkYXRhLXRlc3RzLWlkPSJ0YWItc3ViLWhlYWRlciI+e3tjb21wb25lbnQubmFtZX19PC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJyZXNpemFibGUtY29udGFpbmVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icmVzaXphYmxlLXNlY3Rpb24iPgorICAgICAgICAgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZ2VuZXJhbC10YWItc2Nyb2xsYmFyLWNvbnRhaW5lciI+CisKKyAgICAgICAgICAgICAgICA8ZXhwYW5kLWNvbGxhcHNlIGV4cGFuZGVkLXNlbGVjdG9yPSIuaGllcmFyY2h5LW1vZHVsZS1tZW1iZXItbGlzdC57eyRpbmRleH19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImdlbmVyYWwtdGFiLWV4cGFuZC1jb2xsYXBzZSIgaXMtY2xvc2Utb24taW5pdD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImhpZXJhcmNoeS1tb2R1bGUte3skaW5kZXh9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcmVwZWF0LXN0YXJ0PSJtb2R1bGUgaW4gY29tcG9uZW50Lmdyb3VwcyI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS10aXRsZSIgZGF0YS10ZXN0cy1pZD0iaGllcmFyY2h5LW1vZHVsZS17eyRpbmRleH19LXRpdGxlIiBuZy1jbGFzcz0ieydzZWxlY3RlZCc6IHNlbGVjdGVkSW5kZXggPT09ICRpbmRleH0iIGRhdGEtbmctY2xpY2s9Im9uTW9kdWxlU2VsZWN0ZWQobW9kdWxlLnVuaXF1ZUlkLCAkaW5kZXgpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS10aXRsZS1pY29uIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJleHBhbmQtY29sbGFwc2UtdGl0bGUtdGV4dCIgZGF0YS1uZy1iaW5kPSJtb2R1bGUubmFtZSIgdG9vbHRpcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtY29udGVudD0ie3ttb2R1bGUubmFtZX19Ij48L3NwYW4+CisKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9leHBhbmQtY29sbGFwc2U+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBjbGFzcz0iaGllcmFyY2h5LW1vZHVsZS1tZW1iZXItbGlzdCB7eyRpbmRleH19Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9IihtZW1iZXJOYW1lLCB2YWx1ZSkgaW4gOjptb2R1bGUubWVtYmVycyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLXN1Yi10aXRsZSIgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3ttZW1iZXJOYW1lfX0iPnt7bWVtYmVyTmFtZX19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPGRpdiAgcmVzaXphYmxlIHItZGlyZWN0aW9ucz0iWyd0b3AnXSIgci1mbGV4PSJ0cnVlIiBuZy1pZj0ic2VsZWN0ZWRNb2R1bGUiIGNsYXNzPSJyZXNpemFibGUtc2VjdGlvbiBtb2R1bGUtZGF0YS1jb250YWluZXIiIGRhdGEtdGVzdHMtaWQ9InNlbGVjdGVkLW1vZHVsZS1kYXRhIj4KKyAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImdlbmVyYWwtdGFiLXNjcm9sbGJhci1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZHVsZS1kYXRhIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZHVsZS1uYW1lIG1vZHVsZS10ZXh0LW92ZXJmbG93IiBkYXRhLXRlc3RzLWlkPSJzZWxlY3RlZC1tb2R1bGUtbmFtZSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3NlbGVjdGVkTW9kdWxlLm5hbWV9fSI+e3tzZWxlY3RlZE1vZHVsZS5uYW1lfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXQtbmFtZS1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZGl0LW5hbWUtcG9wb3ZlciBoZWFkZXI9IkVkaXQgTW9kdWxlIE5hbWUiIGRpcmVjdGlvbj0iYXV0byB0b3AiIG1vZHVsZT0ic2VsZWN0ZWRNb2R1bGUiIG9uLXNhdmU9InVwZGF0ZUhlYXROYW1lKCkiIG5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogaXNWaWV3T25seX0iIGNsYXNzPSJzZGMtZWRpdC1pY29uIiBkYXRhLXRlc3RzLWlkPSJlZGl0LW5hbWUtcG9wb3Zlci1pY29uIj48L2VkaXQtbmFtZS1wb3BvdmVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2R1bGUtdGV4dC1vdmVyZmxvdyIgZGF0YS10ZXN0cy1pZD0ic2VsZWN0ZWQtbW9kdWxlLWdyb3VwLXV1aWQiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tzZWxlY3RlZE1vZHVsZS5ncm91cFVVSUR9fSI+IE1vZHVsZSBJRDoge3tzZWxlY3RlZE1vZHVsZS5ncm91cFVVSUR9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2R1bGUtdGV4dC1vdmVyZmxvdyIgIGRhdGEtdGVzdHMtaWQ9InNlbGVjdGVkLW1vZHVsZS1pcy1iYXNlIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7c2VsZWN0ZWRNb2R1bGUuaW52YXJpYW50VVVJRH19Ij5JbnZhcmlhbnQgVVVJRDoge3tzZWxlY3RlZE1vZHVsZS5pbnZhcmlhbnRVVUlEfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RzLWlkPSJzZWxlY3RlZC1tb2R1bGUtdmVyc2lvbiI+VmVyc2lvbjoge3tzZWxlY3RlZE1vZHVsZS52ZXJzaW9ufX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RzLWlkPSJzZWxlY3RlZC1tb2R1bGUtaXMtYmFzZSI+SXNCYXNlOiB7e3NlbGVjdGVkTW9kdWxlLmlzQmFzZX19PC9kaXY+CisKKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iYXJ0aWZhY3QgaW4gc2VsZWN0ZWRNb2R1bGUuYXJ0aWZhY3RzIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFydGlmYWN0LWRhdGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXJ0aWZhY3QtbmFtZSAgbW9kdWxlLXRleHQtb3ZlcmZsb3ciIGRhdGEtdGVzdHMtaWQ9InNlbGVjdGVkLW1vZHVsZS1hcnRpZmFjdC1uYW1lIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX0iPnt7YXJ0aWZhY3QuYXJ0aWZhY3ROYW1lfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZHVsZS10ZXh0LW92ZXJmbG93IiB0b29sdGlwcyBkYXRhLXRlc3RzLWlkPSJzZWxlY3RlZC1tb2R1bGUtYXJ0aWZhY3QtdXVpZCIgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0VVVJRH19Ij4gVVVJRDoge3thcnRpZmFjdC5hcnRpZmFjdFVVSUR9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RzLWlkPSJzZWxlY3RlZC1tb2R1bGUtYXJ0aWZhY3QtdmVyc2lvbiI+VmVyc2lvbjoge3thcnRpZmFjdC5hcnRpZmFjdFZlcnNpb259fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3RhYnMvaGllcmFyY2h5L2hpZXJhcmNoeS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHkubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg1NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHkubGVzcwpAQCAtMCwwICsxLDcxIEBACisuaGllcmFyY2h5LXRhYnsKKworICAgIC5oaWVyYXJjaHktbW9kdWxlLWxpc3QtY29udGFpbmVyeworICAgICAgICBwYWRkaW5nOiAwcHggMjBweCAwcHggMjBweDsKKyAgICB9CisgICAgLm1vZHVsZS1kYXRhLWNvbnRhaW5lcnsKKworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZmNmZiOworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDA5ZmRiOworICAgICAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzAwOWZkYjsKKyAgICAgICAgYm94LXNoYWRvdzogMC4zcHggMXB4IDJweCByZ2JhKDI0LCAyNCwgMjUsIDAuMzIpOworCisgICAgICAgIC5tb2R1bGUtZGF0YSB7CisKKyAgICAgICAgICAgIC5zZWxlY3RhYmxlOworICAgICAgICAgICAgLm1vZHVsZS1uYW1lIHsKKyAgICAgICAgICAgICAgICAuZi10eXBlLl8xNF9tOworICAgICAgICAgICAgICAgIHdpZHRoOiA4NyU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuZi10eXBlLl8xNF9yOworICAgICAgICAgICAgLmYtY29sb3IuYTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMHB4IDEwcHggMHB4OworICAgICAgICAgICAgbWFyZ2luOiAwcHggMjBweCAwcHggMjBweDsKKyAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDE1OSwgMjE5LCAwLjYpOworICAgICAgICB9CisKKyAgICAgICAgLmFydGlmYWN0LWRhdGF7CisgICAgICAgICAgICAuc2VsZWN0YWJsZTsKKyAgICAgICAgICAgIC5mLXR5cGUuXzEyX3I7CisgICAgICAgICAgICAuZi1jb2xvci5tOworCisgICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDBweCAxMHB4IDBweDsKKyAgICAgICAgICAgIG1hcmdpbjogMHB4IDIwcHggMHB4IDIwcHg7CisgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAxNTksIDIxOSwgMC42KTsKKyAgICAgICAgICAgIC5hcnRpZmFjdC1uYW1lIHsKKyAgICAgICAgICAgICAgICAuZi10eXBlLl8xNF9yOworICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLm1vZHVsZS10ZXh0LW92ZXJmbG93IHsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjQwcHg7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICB9CisgICAgfQorCisKKyAgICAuaGllcmFyY2h5LW1vZHVsZS1tZW1iZXItbGlzdCB7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgfQorCisgICAgLmVkaXQtbmFtZS1jb250YWluZXIgeworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzVjYzFlNzsKKyAgICAgICAgaGVpZ2h0OiAyMHB4OworICAgICAgICB3aWR0aDogMTIlOworCisgICAgICAgIC5zZGMtZWRpdC1pY29uIHsKKyAgICAgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgIHRvcDogNHB4OworICAgICAgICAgICAgcmlnaHQ6IDVweDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvdHV0b3JpYWwtZW5kL3R1dG9yaWFsLWVuZC5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90dXRvcmlhbC1lbmQvdHV0b3JpYWwtZW5kLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0NzhmYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvdHV0b3JpYWwtZW5kL3R1dG9yaWFsLWVuZC5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxkaXYgY2xhc3M9InNkYy10dXRvcmlhbC1lbmQtcGFnZSI+CisgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNkYy10dXRvcmlhbC1lbmQtcGFnZS1tYWluIj4KKyAgICAgICAgPGgyIHRyYW5zbGF0ZT0iVFVUT1JJQUxfTEFTVF9QQUdFX1RJVExFIj48L2gyPgorICAgICAgICA8cCBjbGFzcz0ic2RjLXR1dG9yaWFsLWVuZC1wYWdlLWRlc2NyaXB0aW9uMSIgdHJhbnNsYXRlPSJUVVRPUklBTF9MQVNUX1BBR0VfVEVYVCI+PC9wPgorICAgICAgICA8ZGl2PgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idy1zZGMtYnRuLWJsdWUiIGRhdGEtdWktc3JlZj0iZGFzaGJvYXJkIiB0eXBlPSJidXR0b24iIHRyYW5zbGF0ZT0iVFVUT1JJQUxfTEFTVF9QQUdFX0JUTl9BQ1RJT05fTVlfREFTSEJPQVJEIj48L2J1dHRvbj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Inctc2RjLWJ0bi1ibHVlIiBkYXRhLXVpLXNyZWY9ImNhdGFsb2ciIHR5cGU9ImJ1dHRvbiIgdHJhbnNsYXRlPSJXRUxDT01FX0JUTl9BQ1RJT05fQ0FUQUxPRyI+PC9idXR0b24+CisgICAgICAgIDwvZGl2PgorICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvdHV0b3JpYWwtZW5kL3R1dG9yaWFsLWVuZC5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90dXRvcmlhbC1lbmQvdHV0b3JpYWwtZW5kLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2NDhhNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvdHV0b3JpYWwtZW5kL3R1dG9yaWFsLWVuZC5sZXNzCkBAIC0wLDAgKzEsNDEgQEAKKy5zZGMtdHV0b3JpYWwtZW5kLXBhZ2UgeworCisgICAgLmJnX3M7CisgICAgd2lkdGg6IDEwMCU7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsKKyAgICB6LWluZGV4OiA5OTk7CisgICAgLm9wYWNpdHkoMC44KTsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uLy4uLy4uL3N0eWxlcy9pbWFnZXMvd2VsY29tZS5wbmcnKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworICAgIGJhY2tncm91bmQtcG9zaXRpb246IGJvdHRvbSBsZWZ0OworCisgICAgLnNkYy10dXRvcmlhbC1lbmQtcGFnZS1tYWluIHsKKyAgICAgICAgd2lkdGg6IDYwMHB4OworICAgICAgICBoZWlnaHQ6IDQwMHB4OworICAgICAgICBtYXJnaW46IDEwMHB4IGF1dG8gMTAwcHggYXV0bzsKKyAgICAgICAgcGFkZGluZzogODBweDsKKyAgICB9CisKKyAgICBoMiB7CisgICAgICAgIC50XzE1OworICAgICAgICBtYXJnaW46IDA7CisgICAgfQorCisgICAgLnNkYy10dXRvcmlhbC1lbmQtcGFnZS1kZXNjcmlwdGlvbjEgeworICAgICAgICAuY18yOworICAgICAgICAub3BhY2l0eSgwLjgpOworICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgICAgICBsaW5lLWhlaWdodDogMjJweDsKKyAgICB9CisKKyAgICAudy1zZGMtYnRuLWJsdWUgeworICAgICAgICBtYXJnaW46IDQwcHggMTBweCAwIDA7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3R1dG9yaWFsLWVuZC90dXRvcmlhbC1lbmQudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3R1dG9yaWFsLWVuZC90dXRvcmlhbC1lbmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExZDNmOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvdHV0b3JpYWwtZW5kL3R1dG9yaWFsLWVuZC50cwpAQCAtMCwwICsxLDQyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSVR1dG9yaWFsRW5kVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUge30KKworICAgIGV4cG9ydCBjbGFzcyBUdXRvcmlhbEVuZFZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnCisgICAgICAgIF07CisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgcHJpdmF0ZSAkc2NvcGU6SVR1dG9yaWFsRW5kVmlld01vZGVsU2NvcGUKKyAgICAgICAgKXsKKyAgICAgICAgICAgIHRoaXMuaW5pdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0ID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlMC5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZDM3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvc2xpZGUwLmh0bWwKQEAgLTAsMCArMSw1MCBAQAorPGRpdiBjbGFzcz0ic2xpZGUiIGlkPSJzbGlkZS0wIiBkYXRhLW5nLWNvbnRyb2xsZXI9IlNkYy5WaWV3TW9kZWxzLldlbGNvbWVTdGVwc0NvbnRyb2xsZXJWaWV3TW9kZWwiPgorICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1mcmFtZSBmcmFtZS0wIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLWhlYWRlciI+CisgICAgICAgICAgICA8YSBjbGFzcz0ic3ByaXRlLXdlbGNvbWUgbG9nbyIgY2xhc3M9IndlbGNvbWUtbG9nbyIgdWktc3JlZj0iZGFzaGJvYXJkIj48L2E+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1jb3ZlciI+PC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2hhdHMtbmV3Ij4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy1pdGVtcy1yb3ciPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtaXRlbS13cmFwcGVyIGJnLTEiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLXRpdGxlIiB0cmFuc2xhdGU9IldIQVRTX05FV18xX1RJVExFIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy1ib2R5IiB0cmFuc2xhdGU9IldIQVRTX05FV18xX0JPRFkiPjwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtaXRlbS13cmFwcGVyIGJnLTIiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLXRpdGxlIiB0cmFuc2xhdGU9IldIQVRTX05FV18yX1RJVExFIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy1ib2R5IiB0cmFuc2xhdGU9IldIQVRTX05FV18yX0JPRFkiPjwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtaXRlbS13cmFwcGVyIGJnLTMiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLXRpdGxlIiB0cmFuc2xhdGU9IldIQVRTX05FV18zX1RJVExFIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy1ib2R5IiB0cmFuc2xhdGU9IldIQVRTX05FV18zX0JPRFkiPjwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtaXRlbS13cmFwcGVyIGJnLTQiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLXRpdGxlIiB0cmFuc2xhdGU9IldIQVRTX05FV180X1RJVExFIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy1ib2R5IiB0cmFuc2xhdGU9IldIQVRTX05FV180X0JPRFkiPjwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtaXRlbXMtcm93Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLWl0ZW0td3JhcHBlciBiZy01Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy10aXRsZSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfNV9USVRMRSI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtYm9keSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfNV9CT0RZIj48L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLWl0ZW0td3JhcHBlciBiZy02Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy10aXRsZSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfNl9USVRMRSI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtYm9keSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfNl9CT0RZIj48L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLWl0ZW0td3JhcHBlciBiZy03Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy10aXRsZSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfN19USVRMRSI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtYm9keSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfN19CT0RZIj48L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuZXdzLWl0ZW0td3JhcHBlciBiZy04Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmV3cy10aXRsZSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfOF9USVRMRSI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5ld3MtYm9keSIgdHJhbnNsYXRlPSJXSEFUU19ORVdfOF9CT0RZIj48L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvc2xpZGUxLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvc2xpZGUxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1MjAyNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2VsY29tZS9zbGlkZTEuaHRtbApAQCAtMCwwICsxLDM0IEBACis8ZGl2IGNsYXNzPSJzbGlkZSIgaWQ9InNsaWRlLTEiIGRhdGEtbmctY29udHJvbGxlcj0iU2RjLlZpZXdNb2RlbHMuV2VsY29tZVN0ZXBzQ29udHJvbGxlclZpZXdNb2RlbCI+CisgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLWZyYW1lIGZyYW1lLTAxIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLWhlYWRlciI+CisgICAgICAgICAgICA8IS0tPGEgY2xhc3M9InNwcml0ZS13ZWxjb21lIGxvZ28iIGNsYXNzPSJ3ZWxjb21lLWxvZ28iIHVpLXNyZWY9ImRhc2hib2FyZCI+PC9hPi0tPgorICAgICAgICAgICAgPCEtLTxhIGNsYXNzPSJ3aGF0cy1uZXciIGRhdGEtbmctY2xpY2s9ImdvdG9TbGlkZUluZGV4KDApIj5XaGF0YHMgTmV3PC9hPi0tPgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8IS0tPHZpZGVvIGlkPSJhc2RjLXdlbGNvbWUtdmlkZW8iIGNsYXNzPSJhc2RjLXdlbGNvbWUtdmlkZW8iPiZsdDshJm5kYXNoOyBhdXRvcGxheSBsb29wIG11dGVkICZuZGFzaDsmZ3Q7CisgICAgICAgICAgICA8c291cmNlIG5nLXNyYz0ie3t2aWRlb19tcDR9fSIgdHlwZT0idmlkZW8vbXA0IiAvPgorICAgICAgICAgICAgPHNvdXJjZSBuZy1zcmM9Int7dmlkZW9fb2dnfX0iIHR5cGU9J3ZpZGVvL29nZycgLz4KKyAgICAgICAgPC92aWRlbz4tLT4KKworICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtY292ZXIiPjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtbWFpbiI+CisKKyAgICAgICAgICAgIDwhLS08ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtbWFpbi10aXRsZSI+SU5OT1ZBVElWRS4gUkFQSUQuIFJFTElBQkxFPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtbWFpbi1tZXNzYWdlIj4KKyAgICAgICAgICAgICAgICBBVCZUcyBsZWFkaW5nIGNvbGxhYm9yYXRpdmUgbmV0d29yayBzb2x1dGlvbiBkZXNpZ24gcGxhdGZvcm0KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtbWFpbi1iYWNrLWJ0bi1waCI+CisgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImFzZGMtd2VsY29tZS1tYWluLWJhY2stYnRuIiB1aS1zcmVmPSJkYXNoYm9hcmQiPkhvbWU8L2E+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLXZpZGVvLWljb24iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS12aWRlby1pY29uLXBsYXkgc3ByaXRlLXdlbGNvbWUgcGxheSIgZGF0YS1uZy1jbGljaz0ib25QbGF5VmlkZW8oKSI+PC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLWlubmVyLWNpcmNsZSI+PC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4tLT4KKworICAgICAgICAgICAgPGgxPldlbGNvbWUgdG8gU0RDPC9oMT4KKworICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlMi5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjliZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvc2xpZGUyLmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPGRpdiBjbGFzcz0ic2xpZGUiIGlkPSJzbGlkZS0yIj4KKyAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtZnJhbWUgZnJhbWUtMDIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3giPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LXRpdGxlIj4KKyAgICAgICAgICAgICAgICBJbm5vdmF0ZSA8YnI+CisgICAgICAgICAgICAgICAgbmV0d29yay0gZGVzaWduIDxicj4KKyAgICAgICAgICAgICAgICBwbGF0Zm9ybSA8YnI+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1zbGlkZS10ZXh0LWJveC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgQWRhcHQgc3dpZnRseSB0byB0aGUgY29uc3RhbnQgZGVtYW5kcyBwbGFjZWQgb24gPGJyPiBuZXR3b3JrcyBieSBvbmdvaW5nIHRlY2hub2xvZ2ljYWwgYWR2YW5jZXMuCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBVc2luZyBBU0RD4oCZcyBpbm5vdmF0aXZlIG5ldHdvcmstZGVzaWduIHBsYXRmb3JtLDxicj4gcXVpY2tseSBhbmQgZWFzaWx5IGNyZWF0ZSBhbmQgc2hhcmUgc29mdHdhcmUKKyAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLXNsaWRlLWltYWdlLWJveCI+CisgICAgICAgICAgICA8aW1nIHNyYz0ic3R5bGVzL2ltYWdlcy93ZWxjb21lL3NzLTAxLnBuZyIgYWx0PSIwMSIgY2xhc3M9ImFzZGMtd2VsY29tZS1zbGlkZS1pbWFnZSI+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtZnJhbWUtc2hhcGUiPjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtZnJhbWUtY29ubmVjdGlvbiI+PC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2VsY29tZS9zbGlkZTMuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2VsY29tZS9zbGlkZTMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDU0NDhiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlMy5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzxkaXYgY2xhc3M9InNsaWRlIiBpZD0ic2xpZGUtMyI+CisgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLWZyYW1lIGZyYW1lLTAzIj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3giPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LXRpdGxlIj4KKyAgICAgICAgICAgICAgICBFbmhhbmNlIDxicj4KKyAgICAgICAgICAgICAgICBhbmQgZXh0ZW5kCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1zbGlkZS10ZXh0LWJveC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgQmxlbmQsIGJ1aWxkIGFuZCBhcnJhbmdlIHJlc291cmNlcyBhbmQgc2VydmljZXMgaW4gdGhlIDxicj4gZGVzaWduZXIgd29ya3NwYWNlLgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgTGV0IHlvdXIgY3JlYXRpdml0eSBsZWFkIHRoZSB3YXkgdG8gYW55IG51bWJlciBvZiA8YnI+IG5ldHdvcmsgc29sdXRpb25zLgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgVGhlbiBzaW1wbHkgY2xpY2sgb24gZWxlbWVudHMgdG8gY3VzdG9taXplIGFuZCByZWZpbmUgPGJyPiB0aGVpciBzcGVjaWZpYyBwcm9wZXJ0aWVzIHRvIG1hdGNoIHlvdXIgbmVlZHMuCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtc2xpZGUtaW1hZ2UtYm94Ij4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJzdHlsZXMvaW1hZ2VzL3dlbGNvbWUvc3MtMDIucG5nIiBhbHQ9IjAyIiBjbGFzcz0iYXNkYy13ZWxjb21lLXNsaWRlLWltYWdlIj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1mcmFtZS1zaGFwZSI+PC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1mcmFtZS1jb25uZWN0aW9uIj48L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlNC5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlNC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjhjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvc2xpZGU0Lmh0bWwKQEAgLTAsMCArMSwyOSBAQAorPGRpdiBjbGFzcz0ic2xpZGUiIGlkPSJzbGlkZS00Ij4KKyAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtZnJhbWUgZnJhbWUtMDQiPgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3giPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LXRpdGxlIj4KKyAgICAgICAgICAgICAgICBTaGFyZSA8YnI+CisgICAgICAgICAgICAgICAgYW5kIENvbGxhYm9yYXRlCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1zbGlkZS10ZXh0LWJveC1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgR3JhcGhpY2FsbHkgYXJyYW5nZWQsIHRoZSBDYXRhbG9nIGlzIGFuIGVhc2lseSA8YnI+IHNlYXJjaGFibGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMsIHNlcnZpY2VzIGFuZAorICAgICAgICAgICAgICAgICAgICA8YnI+IHByb2R1Y3RzIHRoYXQgcHJvdmlkZXMgeW91IHdpdGggYSB2YXJpZXR5IG9mIDxicj4gbmV0d29yayBlbGVtZW50cy4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIEJlbmVmaXQgZnJvbSB0aGVzZSBhc3NldHMgYnkgdXNpbmcgdGhlbSBhcyA8YnI+IGJ1aWxkaW5nIGJsb2NrcyB0byBmb3JtIGFueSBudW1iZXIgb2YgbmV0d29yaworICAgICAgICAgICAgICAgICAgICA8YnI+IHNvbHV0aW9ucy4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIEFmdGVyIGJlaW5nIGNlcnRpZmllZCBmb3IgcmVsZWFzZSwgc2hhcmUgYW5kIDxicj4gY29sbGFib3JhdGUgd2l0aCBvdGhlcnMgYXMgeW91ciBzb2x1dGlvbiBpcworICAgICAgICAgICAgICAgICAgICA8YnI+IGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlIGNhdGFsb2cuCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtc2xpZGUtaW1hZ2UtYm94Ij4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJzdHlsZXMvaW1hZ2VzL3dlbGNvbWUvc3MtMDMucG5nIiBhbHQ9IjAzIiBjbGFzcz0iYXNkYy13ZWxjb21lLXNsaWRlLWltYWdlIj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1mcmFtZS1zaGFwZSI+PC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1mcmFtZS1jb25uZWN0aW9uIj48L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlNS5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlNS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMzU3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvc2xpZGU1Lmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPGRpdiBjbGFzcz0ic2xpZGUiIGlkPSJzbGlkZS01Ij4KKyAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtZnJhbWUgZnJhbWUtMDUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3giPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LXRpdGxlIj4KKyAgICAgICAgICAgICAgICBGYXN0LCBlZmZpY2llbnQgPGJyPgorICAgICAgICAgICAgICAgIGFuZCByZWxpYWJsZQorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3gtY29udGVudCI+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIEFTREMgaXMgYSBwbGF0Zm9ybSBidWlsdCBhcm91bmQgYSBzaW1wbGUgZXJyb3ItZnJlZQorICAgICAgICAgICAgICAgICAgICA8YnI+cHJvY2VzcyBmb3IgcmVzb3VyY2UgYW5kIHNlcnZpY2UgZGVzaWduIGFuZCBkaXN0cmlidXRpb24uCisgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgPGJyPkFuIGludGVncmF0ZWQgY2VydGlmaWNhdGlvbiBwcm9jZXNzIG1ha2VzIEFTREMgYSBzYWZlCisgICAgICAgICAgICAgICAgICAgIDxicj5hbmQgcmVsaWFibGUgZW52aXJvbm1lbnQgdG8gZXhwZXJpbWVudCwgcmV2aWV3IGFuZCB0ZXN0CisgICAgICAgICAgICAgICAgICAgIDxicj55b3VyIHdvcmsuCisgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgPGJyPk9uY2UgYXBwcm92ZWQgeW91ciBzb2x1dGlvbiBpcyByZWFkeSB0byBiZSB1c2VkIGluCisgICAgICAgICAgICAgICAgICAgIDxicj50aGUgcmVhbC13b3JsZC4KKyAgICAgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtZnJhbWUtc2hhcGUiPjwvZGl2PgorCisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2VsY29tZS9zbGlkZTYuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2VsY29tZS9zbGlkZTYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjAwNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3NsaWRlNi5odG1sCkBAIC0wLDAgKzEsMjYgQEAKKzxkaXYgY2xhc3M9InNsaWRlIiBpZD0ic2xpZGUtNiI+CisgICAgPGRpdiBjbGFzcz0iYXNkYy13ZWxjb21lLWZyYW1lIGZyYW1lLTA2Ij4KKworICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtY292ZXIiPjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtbWFpbiI+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1tYWluLXRpdGxlIj5BU0RDPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtbWFpbi1tZXNzYWdlIj4KKyAgICAgICAgICAgICAgICBqdW1wIHN0YXJ0aW5nIHlvdXIgbmV0d29yayBzb2x1dGlvbnMuCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS1tYWluLWJhY2stYnRuLXBoIj4KKyAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYXNkYy13ZWxjb21lLW1haW4tYmFjay1idG4iIHVpLXNyZWY9ImRhc2hib2FyZCI+SG9tZTwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJhc2RjLXdlbGNvbWUtZm9vdGVyIj4KKyAgICAgICAgICAgIMKpIDIwMTYgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuwqkgMjAxNiBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gbGluay4gVGhpcyBsaW5rIHdpbGwgb3BlbiBhIG5ldworICAgICAgICAgICAgd2luZG93IFRoaXMgbGluayB3aWxsIG9wZW4gYSBuZXcgd2luZG93IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgICAgICAgICA8YnIvPgorICAgICAgICAgICAgQVQmVCwgR2xvYmUgbG9nbywgTW9iaWxpemluZyBZb3VyIFdvcmxkIGFuZCBESVJFQ1RWIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgQVQmVCBJbnRlbGxlY3R1YWwKKyAgICAgICAgICAgIFByb3BlcnR5IGFuZC9vciBBVCZUIGFmZmlsaWF0ZWQgY29tcGFuaWVzLiBBbGwgb3RoZXIgbWFya3MgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKworICAgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvd2VsY29tZS1zdGVwcy1jb250cm9sbGVyLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3dlbGNvbWUtc3RlcHMtY29udHJvbGxlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZhZmNmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93ZWxjb21lL3dlbGNvbWUtc3RlcHMtY29udHJvbGxlci50cwpAQCAtMCwwICsxLDc0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElXZWxjb21lU3RlcHNDb250cm9sbGVyIHsKKyAgICAgICAgdmlkZW9fbXA0OiBzdHJpbmc7CisgICAgICAgIHZpZGVvX29nZzogc3RyaW5nOworICAgICAgICBvblBsYXlWaWRlbzogRnVuY3Rpb247CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFdlbGNvbWVTdGVwc0NvbnRyb2xsZXJWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICckc2NlJywKKyAgICAgICAgICAgICdzZGNDb25maWcnLAorICAgICAgICAgICAgJyRzdGF0ZScsCisgICAgICAgICAgICAnJGZpbHRlcicKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgIHByaXZhdGUgJHNjb3BlOklXZWxjb21lU3RlcHNDb250cm9sbGVyLAorICAgICAgICAgICAgcHJpdmF0ZSAkc2NlOmFueSwKKyAgICAgICAgICAgIHByaXZhdGUgc2RjQ29uZmlnOiBNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlCisgICAgICAgICl7CisgICAgICAgICAgICB0aGlzLmluaXQoKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXQgPSAoKTp2b2lkID0+IHsKKworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uUGxheVZpZGVvID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygib25QbGF5VmlkZW8iKTsKKyAgICAgICAgICAgICAgICAkKCIjc2RjLXBhZ2Utc2Nyb2xsZXIiKS5yZW1vdmVDbGFzcygiYW5pbWF0ZWQgZmFkZUluIik7CisgICAgICAgICAgICAgICAgJCgiI3NkYy1wYWdlLXNjcm9sbGVyIikuYWRkQ2xhc3MoImFuaW1hdGVkIGZhZGVPdXQiKTsKKyAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKT0+eyQoIiNzZGMtcGFnZS1zY3JvbGxlciIpLmNzcygiZGlzcGxheSIsIm5vbmUiKTt9LDUwMCk7CisKKyAgICAgICAgICAgICAgICAkKCIjc2RjLXdlbGNvbWUtdmlkZW8td3JhcHBlciIpLnJlbW92ZUNsYXNzKCJhbmltYXRlZCBmYWRlT3V0Iik7CisgICAgICAgICAgICAgICAgJCgiI3NkYy13ZWxjb21lLXZpZGVvLXdyYXBwZXIiKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZUluIik7CisgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk9PnskKCIjc2RjLXdlbGNvbWUtdmlkZW8td3JhcHBlciIpLmNzcygiZGlzcGxheSIsImJsb2NrIik7fSwwKTsKKworICAgICAgICAgICAgICAgIGxldCB2aWRlb0VsZW1lbnQ6YW55ID0gJCgiI2FzZGMtd2VsY29tZS12aWRlbyIpWzBdOworICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wbGF5KCk7CisgICAgICAgICAgICB9OworCisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvd2VsY29tZS12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvd2VsY29tZS12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0MWU4OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2VsY29tZS93ZWxjb21lLXZpZXcuaHRtbApAQCAtMCwwICsxLDIyIEBACis8ZGl2IGNsYXNzPSJzZGMtd2VsY29tZS1uZXctcGFnZSI+CisKKyAgICA8IS0tPGRpdiBpZD0ic2RjLXdlbGNvbWUtdmlkZW8td3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9ImFzZGMtd2VsY29tZS12aWRlby1jbG9zZSBzcHJpdGUtd2VsY29tZSBjbG9zZSIgZGF0YS1uZy1jbGljaz0ib25DbG9zZVZpZGVvQnV0dG9uKCkiPjwvZGl2PgorICAgICAgICA8dmlkZW8gaWQ9ImFzZGMtd2VsY29tZS12aWRlbyIgY2xhc3M9ImFzZGMtd2VsY29tZS12aWRlbyI+CisgICAgICAgICAgICA8c291cmNlIG5nLXNyYz0ie3t2aWRlb19tcDR9fSIgdHlwZT0idmlkZW8vbXA0IiAvPgorICAgICAgICAgICAgPHNvdXJjZSBuZy1zcmM9Int7dmlkZW9fb2dnfX0iIHR5cGU9J3ZpZGVvL29nZycgLz4KKyAgICAgICAgPC92aWRlbz4KKyAgICA8L2Rpdj4tLT4KKworICAgIDxkaXYgY2xhc3M9Im9zLXdlbGNvbWUiPldlbGNvbWUgdG8gU0RDPC9kaXY+CisKKyAgICA8IS0tPHNkYy1wYWdlLXNjcm9sbCBpZD0ic2RjLXBhZ2Utc2Nyb2xsZXIiCisgICAgICAgICAgICAgICAgICAgICBzdGFydC1zbGlkZS1pbmRleD0iMSIKKyAgICAgICAgICAgICAgICAgICAgIHNsaWRlcy1kYXRhPSJzbGlkZXMiCisgICAgICAgICAgICAgICAgICAgICBzaG93LW5hdj0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgY2xvc2UtYnV0dG9uLWNhbGxiYWNrPSJvbkNsb3NlQnV0dG9uIj4KKworICAgIDwvc2RjLXBhZ2Utc2Nyb2xsPgorLS0+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2VsY29tZS93ZWxjb21lLXZpZXcudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvd2VsY29tZS12aWV3LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGM5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dlbGNvbWUvd2VsY29tZS12aWV3LnRzCkBAIC0wLDAgKzEsMjY3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElXZWxjb21lVmlld01vZGUgeworICAgICAgICBzbGlkZXM6QXJyYXk8U2RjLkRpcmVjdGl2ZXMuU2xpZGVEYXRhPjsKKyAgICAgICAgb25DbG9zZUJ1dHRvbigpOnZvaWQ7CisgICAgICAgIG9uQ2xvc2VWaWRlb0J1dHRvbigpOnZvaWQ7CisKKyAgICAgICAgdmlkZW9fbXA0OiBzdHJpbmc7CisgICAgICAgIHZpZGVvX29nZzogc3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBXZWxjb21lVmlld01vZGVsIHsKKworICAgICAgICBmaXJzdExvYWQ6Ym9vbGVhbiA9IHRydWU7CisgICAgICAgIGFscmVhZHlBbmltYXRlZDpBcnJheTxudW1iZXI+ID0gW107CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRzY2UnLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICAgICAnJHN0YXRlJywKKyAgICAgICAgICAgICckZmlsdGVyJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgcHJpdmF0ZSAkc2NvcGU6SVdlbGNvbWVWaWV3TW9kZSwKKyAgICAgICAgICAgIHByaXZhdGUgJHNjZTphbnksCisgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzogTW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGU6bmcudWkuSVN0YXRlU2VydmljZSwKKyAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZQorICAgICAgICApeworICAgICAgICAgICAgLyp0aGlzLmluaXQoKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmxvYWRJbWFnZXMoKCk6dm9pZD0+IHsKKyAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk6dm9pZCA9PnsKKyAgICAgICAgICAgICAgICAgICAgICAgICQoIi5zZGMtd2VsY29tZS1uZXctcGFnZSIpLmFkZENsYXNzKCJhbmltYXRlZCBmYWRlSW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZUdlbmVyYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZTEoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwxMDAwKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0sMCk7Ki8KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uQ2xvc2VCdXR0b24gPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJvbkNsb3NlQnV0dG9uIik7CisgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oImRhc2hib2FyZCIsIHt9KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uQ2xvc2VWaWRlb0J1dHRvbiA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIm9uQ2xvc2VWaWRlb0J1dHRvbiIpOworICAgICAgICAgICAgICAgICQoIiNzZGMtcGFnZS1zY3JvbGxlciIpLnJlbW92ZUNsYXNzKCJhbmltYXRlZCBmYWRlT3V0Iik7CisgICAgICAgICAgICAgICAgJCgiI3NkYy1wYWdlLXNjcm9sbGVyIikuYWRkQ2xhc3MoImFuaW1hdGVkIGZhZGVJbiIpOworICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpPT57JCgiI3NkYy1wYWdlLXNjcm9sbGVyIikuY3NzKCJkaXNwbGF5IiwiYmxvY2siKTt9LDApOworCisgICAgICAgICAgICAgICAgJCgiI3NkYy13ZWxjb21lLXZpZGVvLXdyYXBwZXIiKS5yZW1vdmVDbGFzcygiYW5pbWF0ZWQgZmFkZUluIik7CisgICAgICAgICAgICAgICAgJCgiI3NkYy13ZWxjb21lLXZpZGVvLXdyYXBwZXIiKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZU91dCIpOworICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpPT57JCgiI3NkYy13ZWxjb21lLXZpZGVvLXdyYXBwZXIiKS5jc3MoImRpc3BsYXkiLCJub25lIik7fSw1MDApOworCisgICAgICAgICAgICAgICAgbGV0IHZpZGVvRWxlbWVudDphbnkgPSAkKCIjYXNkYy13ZWxjb21lLXZpZGVvIilbMF07CisgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLnNkY0NvbmZpZy5hcGkud2VsY29tZV9wYWdlX3ZpZGVvX3VybDsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmlkZW9fbXA0ID0gdGhpcy4kc2NlLnRydXN0QXNSZXNvdXJjZVVybCh1cmwgKyAiLm1wNCIpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmlkZW9fb2dnID0gdGhpcy4kc2NlLnRydXN0QXNSZXNvdXJjZVVybCh1cmwgKyAiLm9nZyIpOworCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0ID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgdmlld01vZGVsc0h0bWxCYXNlUGF0aDpzdHJpbmcgPSAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzLyc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zbGlkZXMgPSBbCisgICAgICAgICAgICAgICAgeyJ1cmwiOiB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dlbGNvbWUvc2xpZGUwLmh0bWwnLCAiaWQiOiAic2xpZGUtMCIsICJpbmRleCI6IDAsICJjYWxsYmFjayI6ICgpID0+IHt0aGlzLmFuaW1hdGUwKCk7fX0sCisgICAgICAgICAgICAgICAgeyJ1cmwiOiB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ3dlbGNvbWUvc2xpZGUxLmh0bWwnLCAiaWQiOiAic2xpZGUtMSIsICJpbmRleCI6IDEsICJjYWxsYmFjayI6ICgpID0+IHt9fSwKKyAgICAgICAgICAgICAgICB7InVybCI6IHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd2VsY29tZS9zbGlkZTIuaHRtbCcsICJpZCI6ICJzbGlkZS0yIiwgImluZGV4IjogMiwgImNhbGxiYWNrIjogKCkgPT4ge3RoaXMuYW5pbWF0ZTIoKTt9fSwKKyAgICAgICAgICAgICAgICB7InVybCI6IHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd2VsY29tZS9zbGlkZTMuaHRtbCcsICJpZCI6ICJzbGlkZS0zIiwgImluZGV4IjogMywgImNhbGxiYWNrIjogKCkgPT4ge3RoaXMuYW5pbWF0ZTMoKTt9fSwKKyAgICAgICAgICAgICAgICB7InVybCI6IHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd2VsY29tZS9zbGlkZTQuaHRtbCcsICJpZCI6ICJzbGlkZS00IiwgImluZGV4IjogNCwgImNhbGxiYWNrIjogKCkgPT4ge3RoaXMuYW5pbWF0ZTQoKTt9fSwKKyAgICAgICAgICAgICAgICB7InVybCI6IHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd2VsY29tZS9zbGlkZTUuaHRtbCcsICJpZCI6ICJzbGlkZS01IiwgImluZGV4IjogNSwgImNhbGxiYWNrIjogKCkgPT4ge3RoaXMuYW5pbWF0ZTUoKTt9fSwKKyAgICAgICAgICAgICAgICB7InVybCI6IHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnd2VsY29tZS9zbGlkZTYuaHRtbCcsICJpZCI6ICJzbGlkZS02IiwgImluZGV4IjogNiwgImNhbGxiYWNrIjogKCkgPT4ge3RoaXMuYW5pbWF0ZTYoKTt9fQorICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgJCgnYm9keScpLmtleXVwKChlKTp2b2lkPT4geworICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMjcpIHsgLy8gZXNjYXBlIGtleSBtYXBzIHRvIGtleWNvZGUgYDI3YAorICAgICAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbygnZGFzaGJvYXJkJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBhbmltYXRlR2VuZXJhbCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiYW5pbWF0ZUdlbmVyYWwiKTsKKworICAgICAgICAgICAgLyovLyBBbmltYXRlIHRoZSByaWdodCBuYXZpZ2F0aW9uCisgICAgICAgICAgICBpZiAodGhpcy5maXJzdExvYWQ9PT10cnVlKSB7CisgICAgICAgICAgICAgICAgLy9UT0RPOiBJc3JhZWwKKyAgICAgICAgICAgICAgICAvL1R3ZWVuTGl0ZS5mcm9tKCcucGFnZS1uYXYnLCAyLCB7eDogIjEwMHB4IiwgZGVsYXk6IDJ9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHRoaXMuZmlyc3RMb2FkID0gZmFsc2U7CisgICAgICAgIH07CisKKyAgICAgICAgLypwcml2YXRlIGxvYWRJbWFnZXMgPSAoY2FsbGJhY2s6IEZ1bmN0aW9uKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBzcmMgPSAkKCcjc2xpZGUtMSAuYXNkYy13ZWxjb21lLWZyYW1lJykuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJyk7CisgICAgICAgICAgICBsZXQgdXJsID0gc3JjLm1hdGNoKC9cKCguKj8pXCkvKVsxXS5yZXBsYWNlKC8oJ3wiKS9nLCcnKTsKKworICAgICAgICAgICAgbGV0IGltZyA9IG5ldyBJbWFnZSgpOworICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgLy9hbGVydCgnaW1hZ2UgbG9hZGVkJyk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaW1nLnNyYyA9IHVybDsKKyAgICAgICAgICAgIC8hKmlmIChpbWcuY29tcGxldGUpeworICAgICAgICAgICAgICAgIGNhbGxiYWNrOworICAgICAgICAgICAgfSohLworICAgICAgICB9OyovCisKKyAgICAgICAgcHJpdmF0ZSBhbmltYXRlID0gKGVsZW1lbnQ6YW55LCBhbmltYXRpb246c3RyaW5nLCB3aGVuOm51bWJlcik6dm9pZCA9PiB7CisgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKT0+eworICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoImFuaW1hdGVkICIgKyBhbmltYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50WzBdKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbMF0uc3R5bGUgPSAidmlzaWJpbGl0eTogdmlzaWJsZTsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sd2hlbik7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBoaWRlID0gKGVsZW1lbnQ6YW55LCBhbmltYXRpb246c3RyaW5nLCBhbmltYXRpb25Ub0hpZGU6c3RyaW5nLCB3aGVuOm51bWJlcik6dm9pZCA9PiB7CisgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCJhbmltYXRlZCAiICsgYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIGVsZW1lbnRbMF0uc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYW5pbWF0ZTAgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlBbmltYXRlZC5pbmRleE9mKDApIT09LTEpeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5QW5pbWF0ZWQucHVzaCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vY29uc29sZS5sb2coInNsaWRlIDAgLSBhbmltYXRlIik7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTAgLmJnLTEnKSwnZmFkZUluRG93bicsNTAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtMCAuYmctMicpLCdmYWRlSW5Eb3duJywxMDAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtMCAuYmctMycpLCdmYWRlSW5Eb3duJywxNTAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtMCAuYmctNCcpLCdmYWRlSW5Eb3duJywyMDAwKTsKKworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0wIC5iZy01JyksJ2ZhZGVJbkRvd24nLDI1MDApOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0wIC5iZy02JyksJ2ZhZGVJbkRvd24nLDMwMDApOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0wIC5iZy03JyksJ2ZhZGVJbkRvd24nLDM1MDApOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0wIC5iZy04JyksJ2ZhZGVJbkRvd24nLDQwMDApOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYW5pbWF0ZTEgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlBbmltYXRlZC5pbmRleE9mKDEpIT09LTEpeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5QW5pbWF0ZWQucHVzaCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vY29uc29sZS5sb2coInNsaWRlIDEgLSBhbmltYXRlIik7CisKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtMSAuYXNkYy13ZWxjb21lLW1haW4tdGl0bGUnKSwnZmFkZUluVXAnLDEwMDApOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0xIC5hc2RjLXdlbGNvbWUtbWFpbi1tZXNzYWdlJyksJ2ZhZGVJblVwJywyMDAwKTsKKworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0xIC5hc2RjLXdlbGNvbWUtbWFpbi1iYWNrLWJ0bicpLCdmYWRlSW4nLDMwMDApOworCisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTEgLmFzZGMtd2VsY29tZS12aWRlby1pY29uJyksJ3pvb21JbicsMzAwMCk7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTEgLmFzZGMtd2VsY29tZS1pbm5lci1jaXJjbGUnKSwnem9vbUluJywzMDAwKTsKKworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJy53ZWxjb21lLW5hdicpLCdzbGlkZUluUmlnaHQnLDIwMDApOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYW5pbWF0ZTIgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlBbmltYXRlZC5pbmRleE9mKDIpIT09LTEpeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5QW5pbWF0ZWQucHVzaCgyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vY29uc29sZS5sb2coInNsaWRlIDIgLSBhbmltYXRlIik7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTIgLmFzZGMtd2VsY29tZS1mcmFtZS1zaGFwZScpLCd6b29tSW4nLDUwMCk7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTIgLmFzZGMtd2VsY29tZS1zbGlkZS10ZXh0LWJveC1jb250ZW50JyksJ2ZhZGVJblVwJywyMDAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtMiAuYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LXRpdGxlJyksJ2ZhZGVJblVwJywxMDAwKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGFuaW1hdGUzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBpZiAodGhpcy5hbHJlYWR5QW5pbWF0ZWQuaW5kZXhPZigzKSE9PS0xKXsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuYWxyZWFkeUFuaW1hdGVkLnB1c2goMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJzbGlkZSAzIC0gYW5pbWF0ZSIpOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0zIC5hc2RjLXdlbGNvbWUtZnJhbWUtc2hhcGUnKSwnem9vbUluJyw1MDApOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS0zIC5hc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3gtY29udGVudCcpLCdmYWRlSW5VcCcsMjAwMCk7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTMgLmFzZGMtd2VsY29tZS1zbGlkZS10ZXh0LWJveC10aXRsZScpLCdmYWRlSW5VcCcsMTAwMCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBhbmltYXRlNCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgaWYgKHRoaXMuYWxyZWFkeUFuaW1hdGVkLmluZGV4T2YoNCkhPT0tMSl7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlBbmltYXRlZC5wdXNoKDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9jb25zb2xlLmxvZygic2xpZGUgNCAtIGFuaW1hdGUiKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtNCAuYXNkYy13ZWxjb21lLWZyYW1lLXNoYXBlJyksJ3pvb21JbicsNTAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtNCAuYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LWNvbnRlbnQnKSwnZmFkZUluVXAnLDIwMDApOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS00IC5hc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3gtdGl0bGUnKSwnZmFkZUluVXAnLDEwMDApOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYW5pbWF0ZTUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlBbmltYXRlZC5pbmRleE9mKDUpIT09LTEpeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5QW5pbWF0ZWQucHVzaCg1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vY29uc29sZS5sb2coInNsaWRlIDUgLSBhbmltYXRlIik7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTUgLmFzZGMtd2VsY29tZS1mcmFtZS1zaGFwZScpLCd6b29tSW4nLDUwMCk7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGUoJCgnI3NsaWRlLTUgLmFzZGMtd2VsY29tZS1zbGlkZS10ZXh0LWJveC1jb250ZW50JyksJ2ZhZGVJblVwJywyMDAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtNSAuYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LXRpdGxlJyksJ2ZhZGVJblVwJywxMDAwKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGFuaW1hdGU2ID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBpZiAodGhpcy5hbHJlYWR5QW5pbWF0ZWQuaW5kZXhPZig2KSE9PS0xKXsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuYWxyZWFkeUFuaW1hdGVkLnB1c2goNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJzbGlkZSA2IC0gYW5pbWF0ZSIpOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS02IC5hc2RjLXdlbGNvbWUtbWFpbi1tZXNzYWdlJyksJ2ZhZGVJblVwJywyMDAwKTsKKyAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSgkKCcjc2xpZGUtNiAuYXNkYy13ZWxjb21lLW1haW4tdGl0bGUnKSwnZmFkZUluVXAnLDEwMDApOworICAgICAgICAgICAgdGhpcy5hbmltYXRlKCQoJyNzbGlkZS02IC5hc2RjLXdlbGNvbWUtbWFpbi1iYWNrLWJ0bicpLCdmYWRlSW5VcCcsMzAwMCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBhbmltYXRlQ3NzID0gKGVsZW1lbnQ6SlF1ZXJ5LCBhbmltYXRpb25OYW1lOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgYW5pbWF0aW9uRW5kID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCBtb3pBbmltYXRpb25FbmQgTVNBbmltYXRpb25FbmQgb2FuaW1hdGlvbmVuZCBhbmltYXRpb25lbmQnOworICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnYW5pbWF0ZWQgJyArIGFuaW1hdGlvbk5hbWUpLm9uZShhbmltYXRpb25FbmQsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2FuaW1hdGVkICcgKyBhbmltYXRpb25OYW1lKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdW5BbmltYXRlQ3NzID0gKGVsZW1lbnQ6SlF1ZXJ5LCBhbmltYXRpb25OYW1lOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgYW5pbWF0aW9uRW5kID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCBtb3pBbmltYXRpb25FbmQgTVNBbmltYXRpb25FbmQgb2FuaW1hdGlvbmVuZCBhbmltYXRpb25lbmQnOworICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnYW5pbWF0ZWQgJyArIGFuaW1hdGlvbk5hbWUpLm9uZShhbmltYXRpb25FbmQsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2FuaW1hdGVkICcgKyBhbmltYXRpb25OYW1lKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvUmVhZE1lLnR4dCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL1JlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1Y2ZiOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL1JlYWRNZS50eHQKQEAgLTAsMCArMSw1NCBAQAoraW1wb3J0LWFzc2V0IHdpemFyZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2hhdCBzaG91bGQgYmUgZG9uZSBpbiBlYWNoIHdpemFyZCBzdGVwOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxLglFYWNoIHN0ZXAgc2NvcGUgc2hvdWxkIGV4dGVuZCBJQXNzZXRDcmVhdGlvblN0ZXBTY29wZSAodGhpcyB3YXkgeW91IGNhbiBjYWxsIG1ldGhvZHMgb24gdGhlIHdpemFyZCBzY29wZSkuCisgICAgRXhhbXBsZToKKyAgICBleHBvcnQgaW50ZXJmYWNlIElHZW5lcmFsU3RlcFNjb3BlIGV4dGVuZHMgSUFzc2V0Q3JlYXRpb25TdGVwU2NvcGUgeworCisgICAgfQorCisyLglFYWNoIHN0ZXAgY2xhc3Mgc2hvdWxkIGltcGxlbWVudHMgSUFzc2V0Q3JlYXRpb25TdGVwCisgICAgRXhhbXBsZTogZXhwb3J0IGNsYXNzIEdlbmVyYWxTdGVwVmlld01vZGVsIGltcGxlbWVudHMgSUFzc2V0Q3JlYXRpb25TdGVwIHsKKworICAgIH0KKworMy4JQWRkIHRoZSBtZXRob2Q6IHB1YmxpYyBzYXZlID0gKGNhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkID0+IHt9CisgICAgVGhlIG1ldGhvZCBzaG91bGQgcGVyZm9ybSB0aGUgc2F2ZSBhbmQgY2FsbDogY2FsbGJhY2sodHJ1ZSk7IGluIGNhc2Ugb2Ygc3VjY2Vzcywgb3IgY2FsbGJhY2soZmFsc2UpOyBpbiBjYXNlIG9mIGVycm9yLgorICAgIEV4YW1wbGU6CisgICAgdmFyIG9uU3VjY2VzczpGdW5jdGlvbiA9IChyZXNvdXJjZVByb3BlcnRpZXM6U2VydmljZXMuSVJlc291cmNlUmVzb3VyY2UpID0+IHsKKyAgICAgICAgdGhpcy4kc2NvcGUuc2V0QW5ndWxhclJlc291cmNlT2ZSZXNvdXJjZShyZXNvdXJjZVByb3BlcnRpZXMpOworICAgICAgICB2YXIgcmVzb3VyY2VPYmogPSBuZXcgU2RjLk1vZGVscy5SZXNvdXJjZShyZXNvdXJjZVByb3BlcnRpZXMpOworICAgICAgICB0aGlzLiRzY29wZS5zZXRFbnRpdHkocmVzb3VyY2VPYmopOworICAgICAgICB0aGlzLiRzY29wZS5sYXRlc3RFbnRpdHlOYW1lID0gKHJlc291cmNlUHJvcGVydGllcy5yZXNvdXJjZU5hbWUpOworICAgICAgICBjYWxsYmFjayh0cnVlKTsKKyAgICB9OworCis0LglBZGQgdGhlIGZpcnN0IGxpbmUgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yOiB0aGlzLiRzY29wZS5yZWdpc3RlckNoaWxkKHRoaXMpOworICAgIFRoaXMgd2lsbCByZWdpc3RlciB0aGUgY3VycmVudCBzdGVwIHJlZmVyZW5jZSBpbiB0aGUgd2l6YXJkLgorCis1LglFYWNoIHN0ZXAgY2FuIGdldCBhbmQgc2V0IGFuZ3VsYXIgJHJlc291cmNlIG9mIHJlc291cmNlIGZyb20gdGhlIHdpemFyZC4KKyAgICAvLyBXaWxsIGJlIGNhbGxlZCBmcm9tIGVhY2ggc3RlcCB0byBnZXQgY3VycmVudCBlbnRpdHkuCisgICAgdGhpcy4kc2NvcGUuZ2V0QW5ndWxhclJlc291cmNlT2ZSZXNvdXJjZSA9ICgpOlNlcnZpY2VzLklSZXNvdXJjZVJlc291cmNlID0+IHsKKyAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVByb3BlcnRpZXM7CisgICAgfTsKKworICAgIC8vIFdpbGwgYmUgY2FsbGVkIGZyb20gZWFjaCBzdGVwIGFmdGVyIHNhdmUgdG8gdXBkYXRlIHRoZSByZXNvdXJjZS4KKyAgICB0aGlzLiRzY29wZS5zZXRBbmd1bGFyUmVzb3VyY2VPZlJlc291cmNlID0gKHJlc291cmNlUHJvcGVydGllczpTZXJ2aWNlcy5JUmVzb3VyY2VSZXNvdXJjZSk6dm9pZCA9PiB7CisgICAgICAgdGhpcy5yZXNvdXJjZVByb3BlcnRpZXMgPSByZXNvdXJjZVByb3BlcnRpZXM7CisgICAgICAgdGhpcy5maWxsQXNzZXROYW1lQW5kVHlwZSgpOworICAgIH07CisKKyAgICBOb3RlOiBhZnRlciBzdWNjZXNzIHNhdmUsIHNldCBzZXRBbmd1bGFyUmVzb3VyY2VPZlJlc291cmNlIGluIHRoZSB3aXphcmQgKHNlZSBleGFtcGxlIGluIHN0ZXAgMykuCisKKzYuCVRoZSB3aXphcmQgbmVlZHMgdG8ga25vdyBpZiB0aGUgc3RlcCBpcyB2YWxpZCAodG8ga25vdyBpZiB0byBzaG93IG5leHQgYnV0dG9uKSwgSSB1c2VkIHRoZSBmb2xsb3dpbmcgdG8gdXBkYXRlIHRoZSB3aXphcmQ6CisgICAgdGhpcy4kc2NvcGUuJHdhdGNoKCJlZGl0Rm9ybS4kdmFsaWQiLCBmdW5jdGlvbihuZXdWYWwsIG9sZFZhbCl7CisgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUobmV3VmFsKTsKKyAgICB9KTsKKworICAgIE5vdGU6IGluIGNhc2UgdGhlcmUgaXMgbm8gc2F2ZSBmb3IgdGhlIHN0ZXAsIGFuZCB0aGUgc3RlcCBpcyBhbHdheXMgdmFsaWQsIGNhbGw6IHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisKKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4MTdkNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAuaHRtbApAQCAtMCwwICsxLDEzNyBAQAorPGRpdiBjbGFzcz0iYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwIiBkYXRhLW5nLWNvbnRyb2xsZXI9IlNkYy5WaWV3TW9kZWxzLldpemFyZC5BcnRpZmFjdERlcGxveW1lbnRTdGVwVmlld01vZGVsIj4KKworICAgIDxkaXYgZGF0YS10ZXN0cy1pZD0iYWRkLWRlcGxveW1lbnQtYXJ0aWZhY3QtYnV0dG9uIiBkYXRhLXRlc3RzLWlkPSJhZGRHcmV5IiBjbGFzcz0idy1zZGMtY2xhc3NpYy1idG4gZ3JheSIgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoe30pIj5BZGQ8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbnRhaW5lci1mbGV4Ij4KKworICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSI+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWQgZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciBoZWFkLXJvdyBoYW5kIGZsZXgtaXRlbSIgZGF0YS1uZy1yZXBlYXQ9ImhlYWRlciBpbiB0YWJsZUhlYWRlcnNMaXN0IHRyYWNrIGJ5ICRpbmRleCIgZGF0YS1uZy1jbGljaz0ic29ydChoZWFkZXIucHJvcGVydHkpIj57e2hlYWRlci50aXRsZX19CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctaWY9InNvcnRCeSA9PT0gaGVhZGVyLnByb3BlcnR5IiBjbGFzcz0idGFibGUtaGVhZGVyLXNvcnQtYXJyb3ciIGRhdGEtbmctY2xhc3M9InsnZG93bic6IHJldmVyc2UsICd1cCc6IXJldmVyc2V9Ij4gPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLW5vLXRleHQtaGVhZGVyIGhlYWQtcm93IGZsZXgtaXRlbSI+PC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGZvcm0gY2xhc3M9ImJvZHkiIG5hbWU9ImVkaXRGb3JtIj4KKworICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKworICAgICAgICAgICAgICAgICAgICA8IS0tIEFydGlmYWN0IHJvdyAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1pZj0ibm9BcnRpZmFjdHNUb1Nob3coKSIgY2xhc3M9Im5vLXJvdy10ZXh0IiB0cmFuc2xhdGU9IkRFUExPWU1FTlRfQVJUSUZBQ1RfTk9fQVJUSUZBQ1RTX1RPX0RJU1BMQVkiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LXN0YXJ0PSJhcnRpZmFjdCBpbiBhcnRpZmFjdHMgfCBvcmRlckJ5OnNvcnRCeTpyZXZlcnNlIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZmxleC1jb250YWluZXIgZGF0YS1yb3ciCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZCc6IGFydGlmYWN0LnNlbGVjdGVkIHx8IHVuZGVmaW5lZD09YXJ0aWZhY3Quc2VsZWN0ZWQgJiYgdXBkYXRlSW5Qcm9ncmVzc30iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iYXJ0aWZhY3QuZXNJZCI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSIgIGRhdGEtbmctY2xpY2s9InVwZGF0ZShhcnRpZmFjdCkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciPjwvbG9hZGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcHJpdGUgdGFibGUtYXJyb3ciIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19IiBkYXRhLW5nLWNsYXNzPSJ7J29wZW5lZCc6IGFydGlmYWN0LnNlbGVjdGVkIHx8IHVuZGVmaW5lZD09YXJ0aWZhY3Quc2VsZWN0ZWQgJiYgdXBkYXRlSW5Qcm9ncmVzc30iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdFR5cGV9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcnRpZmFjdC5hcnRpZmFjdFR5cGV9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QudGltZW91dH19Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FydGlmYWN0LnRpbWVvdXQ/IGFydGlmYWN0LnRpbWVvdXQ6Jyd9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWJ0bi1jb2wgZmxleC1pdGVtIiAgc2RjLWtleWJvYXJkLWV2ZW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWJsZS1lZGl0LWJ0biIgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoYXJ0aWZhY3QpIj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWJsZS1kZWxldGUtYnRuIiBkYXRhLW5nLWNsaWNrPSJkZWxldGUoYXJ0aWZhY3QpIj4gPC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQtZW5kPSIiIGRhdGEtbmctaWY9ImFydGlmYWN0LnNlbGVjdGVkIHx8IHVuZGVmaW5lZD09YXJ0aWZhY3Quc2VsZWN0ZWQgJiYgdXBkYXRlSW5Qcm9ncmVzcyIgY2xhc3M9Inctc2RjLWZvcm0gaXRlbS1vcGVuZWQiPgorICAgICAgICAgICAgICAgICAgICA8IS0tIEFydGlmYWN0IHBhbmVsIG9wZW5lZCAtLT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZXNjcmlwdGlvbiBmaWVsZCAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0taXRlbSIgbmctZm9ybT0iZGVzY3JpcHRpb25Gb3JtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGRlc2NyaXB0aW9uRm9ybS4kZGlydHkgJiYgZGVzY3JpcHRpb25Gb3JtLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZW52LWZvcm0tbGFiZWwgcmVxdWlyZWQiPkRlc2NyaXB0aW9uPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJpLXNkYy1mb3JtLXRleHRhcmVhIHt7JGluZGV4fX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjI1NiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1NiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcXVpcmVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImFydGlmYWN0LmRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJnZXRWYWxpZGF0aW9uUGF0dGVybignc3RyaW5nJykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZGVzY3JpcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZGVzY3JpcHRpb25Gb3JtLiRkaXJ0eSAmJiBkZXNjcmlwdGlvbkZvcm0uJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJkZXNjcmlwdGlvbkZvcm0uJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IkFERF9BUlRJRkFDVF9FUlJPUl9ERVNDUklQVElPTl9SRVFVSVJFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJkZXNjcmlwdGlvbkZvcm0uJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzI1NicgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJkZXNjcmlwdGlvbkZvcm0uJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhcmFtZXRlcnMgaW4gMiBjb2x1bW5zIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW5zLXdyYXBwZXIiIGRhdGEtbmctaWY9ImFydGlmYWN0LmhlYXRQYXJhbWV0ZXJzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExlZnQgY29sdW1uIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBuZy1mb3JtPSJwYXJhbWV0ZXJGb3JtIiBkYXRhLW5nLXJlcGVhdD0icGFyYW1ldGVyIGluIGFydGlmYWN0LmhlYXRQYXJhbWV0ZXJzLnNsaWNlKDAsIGFydGlmYWN0LmhlYXRQYXJhbWV0ZXJzLmxlbmd0aCUyK2FydGlmYWN0LmhlYXRQYXJhbWV0ZXJzLmxlbmd0aC8yKSB8IG9yZGVyQnk6ICduYW1lJyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1lbnYtZm9ybS1sYWJlbCIgZGF0YS1uZy1jbGFzcz0ie3JlcXVpcmVkOnBhcmFtZXRlci5kZWZhdWx0VmFsdWV9IiB0b29sdGlwLXNpZGU9InRvcCIgc2RjLXNtYXJ0LXRvb2x0aXA+e3twYXJhbWV0ZXIubmFtZSArJyAoJyArIHBhcmFtZXRlci50eXBlICsgJyknfX08L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBhcmFtZXRlci1kZXNjcmlwdGlvbiIgdG9vbHRpcHMgdG9vbHRpcC1zaWRlPSJ0b3AiIHRvb2x0aXAtY29udGVudD0ie3twYXJhbWV0ZXIuZGVzY3JpcHRpb259fSI+Pzwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kaW52YWxpZCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0icGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImN1cnJlbnRWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49ImdldFZhbGlkYXRpb25QYXR0ZXJuKHBhcmFtZXRlci50eXBlLCAnaGVhdCcpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcmVxdWlyZWQ9InBhcmFtZXRlci5kZWZhdWx0VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9Iidqc29uJz09cGFyYW1ldGVyLnR5cGUgJiYgcGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJHNldFZhbGlkaXR5KCdwYXR0ZXJuJywgdmFsaWRhdGVKc29uKHBhcmFtZXRlci5jdXJyZW50VmFsdWUpKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJsdXI9IiFwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucGF0dGVybiAmJiByZXNldFZhbHVlKHBhcmFtZXRlcikiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnVmFsdWUnfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRlcnJvci5wYXR0ZXJuICYmIHBhcmFtZXRlci50eXBlPT09J3N0cmluZyciIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgIShwYXJhbWV0ZXIudHlwZT09PSdzdHJpbmcnKSIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1RZUEUiIHRyYW5zbGF0ZS12YWx1ZXM9InsndHlwZSc6ICd7e3BhcmFtZXRlci50eXBlfX0nfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSaWdodCBjb2x1bW4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIG5nLWZvcm09InBhcmFtZXRlckZvcm0iIGRhdGEtbmctcmVwZWF0PSJwYXJhbWV0ZXIgaW4gYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMuc2xpY2UoYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMubGVuZ3RoJTIrYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMubGVuZ3RoLzIpIHwgb3JkZXJCeTogJ25hbWUnIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWVudi1mb3JtLWxhYmVsIiBkYXRhLW5nLWNsYXNzPSJ7cmVxdWlyZWQ6cGFyYW1ldGVyLmRlZmF1bHRWYWx1ZX0iIHRvb2x0aXAtc2lkZT0idG9wIiBzZGMtc21hcnQtdG9vbHRpcD57e3BhcmFtZXRlci5uYW1lICsnICgnICsgcGFyYW1ldGVyLnR5cGUgKyAnKSd9fTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGFyYW1ldGVyLWRlc2NyaXB0aW9uIiB0b29sdGlwcyB0b29sdGlwLXNpZGU9InRvcCIgdG9vbHRpcC1jb250ZW50PSJ7e3BhcmFtZXRlci5kZXNjcmlwdGlvbn19Ij4/PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KHBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRpbnZhbGlkKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJwYXJhbWV0ZXIuY3VycmVudFZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY3VycmVudFZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0iZ2V0VmFsaWRhdGlvblBhdHRlcm4ocGFyYW1ldGVyLnR5cGUsICdoZWF0JykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXF1aXJlZD0icGFyYW1ldGVyLmRlZmF1bHRWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0iJ2pzb24nPT1wYXJhbWV0ZXIudHlwZSAmJiBwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kc2V0VmFsaWRpdHkoJ3BhdHRlcm4nLCB2YWxpZGF0ZUpzb24ocGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSkpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmx1cj0iIXBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRlcnJvci5wYXR0ZXJuICYmIHJlc2V0VmFsdWUocGFyYW1ldGVyKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdWYWx1ZSd9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgcGFyYW1ldGVyLnR5cGU9PT0nc3RyaW5nJyIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucGF0dGVybiAmJiAhKHBhcmFtZXRlci50eXBlPT09J3N0cmluZycpIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfVFlQRSIgdHJhbnNsYXRlLXZhbHVlcz0ieyd0eXBlJzogJ3t7cGFyYW1ldGVyLnR5cGV9fSd9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gQ2xvc2U6IFBhcmFtZXRlcnMgaW4gMiBjb2x1bW5zIC0tPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj48IS0tIENsb3NlOiBBcnRpZmFjdCBwYW5lbCBvcGVuZWQgLS0+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgYXJ0aWZhY3RzIGJ1dHRvbnMgLS0+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFkZC1idXR0b24iIGRhdGEtbmctcmVwZWF0PSJhcnRpZmFjdCBpbiBhcnRpZmFjdHMgdHJhY2sgYnkgJGluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctc2hvdz0iIWFydGlmYWN0LmVzSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPSJERVBMT1lNRU5UX0FSVElGQUNUX0JVVFRPTl9BRERfSEVBVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUtdmFsdWVzPSJ7J25hbWUnOiAne3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0nfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZShhcnRpZmFjdCkiPjwvYnV0dG9uPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gVG9wIGFkZCBidXR0b24gLS0+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFkZC1idXR0b24iIHRyYW5zbGF0ZT0iREVQTE9ZTUVOVF9BUlRJRkFDVF9CVVRUT05fQUREX09USEVSIiBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZSh7fSkiPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzZmJhMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAubGVzcwpAQCAtMCwwICsxLDEwNyBAQAorLmFydGlmYWN0LWRlcGxveW1lbnQtc3RlcCB7CisKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggLnRhYmxlIC5ib2R5IC5kYXRhLXJvdyArIGRpdi5pdGVtLW9wZW5lZCB7CisgICAgICAgIHBhZGRpbmc6IDEwcHggNDBweCAxMHB4IDMwcHg7CisgICAgfQorCisgICAgLnctc2RjLWNsYXNzaWMtYnRuIHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIH0KKworICAgIC50YWJsZSB7CisgICAgICAgIGhlaWdodDo0MTJweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICB9CisKKyAgICAucGFyYW1ldGVyLWRlc2NyaXB0aW9uIHsKKyAgICAgICAgLmNpcmNsZSgxOHB4LCBAY29sb3JfcCk7CisgICAgICAgIGNvbnRlbnQ6ICc/JzsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHg7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CisgICAgICAgIGN1cnNvcjogZGVmYXVsdDsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMTZweDsKKyAgICB9CisKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggeworCisgICAgICAgIG1hcmdpbi10b3A6IDBweDsKKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgxKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE1OworICAgICAgICAgICAgcGFkZGluZzogNXB4IDRweDsKKyAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgc3Bhbi50YWJsZS1hcnJvdyB7CisgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiA3cHg7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDIpIHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDVweCA0cHg7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgzKSB7CisgICAgICAgICAgICBwYWRkaW5nOiA1cHggNHB4OworICAgICAgICAgICAgZmxleC1ncm93OiA5OworICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNCkgeworICAgICAgICAgICAgcGFkZGluZzogNXB4IDRweDsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogMzsKKyAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgICAgICB9CisgICAgfQorICAgIC53LXNkYy1mb3JteworICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworCisgICAgICAgIC53LXNkYy1lbnYtcGFyYW1zeworICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjZGNkY2Q7CisgICAgICAgICAgICBtYXJnaW46IDI1cHggMCAxMHB4IDA7CisgICAgICAgIH0KKworICAgICAgICAuaS1zZGMtZm9ybS10ZXh0YXJlYSB7CisgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAY29sb3JfZTsKKyAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDYwcHg7CisgICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDEzcHg7CisgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgIHJlc2l6ZTogbm9uZTsKKworICAgICAgICAgICAgJjpkaXNhYmxlZCB7CisgICAgICAgICAgICAgICAgLmRpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLnctc2RjLWZvcm0taXRlbSB7CisgICAgICAgICAgICAmLmVycm9yIHsKKyAgICAgICAgICAgICAgICAuaS1zZGMtZm9ybS1pbnB1dCwKKyAgICAgICAgICAgICAgICAuaS1zZGMtZm9ybS1zZWxlY3QsCisgICAgICAgICAgICAgICAgLmktc2RjLWZvcm0tdGV4dGFyZWEgeworICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IEBjb2xvcl9oOworICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC5pLXNkYy1lbnYtZm9ybS1sYWJlbHsKKyAgICAgICAgICAgIC5wXzk7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgbWF4LXdpZHRoOiAyNDVweDsKKyAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDE0cHg7CisKKyAgICAgICAgICAgICYucmVxdWlyZWQ6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgY29sb3I6ICNmMzM7CisgICAgICAgICAgICAgICAgY29udGVudDogJyonOworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmMTQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAudHMKQEAgLTAsMCArMSwyMjggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMuV2l6YXJkIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgaW1wb3J0IEFydGlmYWN0TW9kZWwgPSBTZGMuTW9kZWxzLkFydGlmYWN0TW9kZWw7CisKKyAgICBpbnRlcmZhY2UgSUFydGlmYWN0RGVwbG95bWVudFN0ZXBWaWV3TW9kZWxTY29wZSBleHRlbmRzIElXaXphcmRDcmVhdGlvblN0ZXBTY29wZSB7CisgICAgICAgIHRhYmxlSGVhZGVyc0xpc3Q6IEFycmF5PGFueT47CisgICAgICAgIHJldmVyc2U6IGJvb2xlYW47CisgICAgICAgIHNvcnRCeTpzdHJpbmc7CisgICAgICAgIGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBhcnRpZmFjdHM6IEFycmF5PE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBpc0xvYWRpbmc6Ym9vbGVhbjsKKyAgICAgICAgYXJ0aWZhY3REZXNjcmlwdGlvbnM6YW55OworICAgICAgICB1cGRhdGVJblByb2dyZXNzOmJvb2xlYW47CisKKyAgICAgICAgYWRkT3JVcGRhdGUoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICB1cGRhdGUoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICBkZWxldGUoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICBzb3J0KHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgICAgICBub0FydGlmYWN0c1RvU2hvdygpOmJvb2xlYW47CisgICAgICAgIGdldFZhbGlkYXRpb25QYXR0ZXJuKHZhbGlkYXRpb25UeXBlOnN0cmluZywgcGFyYW1ldGVyVHlwZT86c3RyaW5nKTpSZWdFeHA7CisgICAgICAgIHZhbGlkYXRlSnNvbihqc29uOnN0cmluZyk6Ym9vbGVhbjsKKyAgICAgICAgcmVzZXRWYWx1ZShwYXJhbWV0ZXI6YW55KTp2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBcnRpZmFjdERlcGxveW1lbnRTdGVwVmlld01vZGVsIGltcGxlbWVudHMgSVdpemFyZENyZWF0aW9uU3RlcCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJyRtb2RhbCcsCisgICAgICAgICAgICAnJHRlbXBsYXRlQ2FjaGUnLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25VdGlscycsCisgICAgICAgICAgICAnTW9kYWxzSGFuZGxlcicKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgIHByaXZhdGUgJHNjb3BlOklBcnRpZmFjdERlcGxveW1lbnRTdGVwVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICBwcml2YXRlICRtb2RhbDpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZSwKKyAgICAgICAgICAgIHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSB2YWxpZGF0aW9uVXRpbHM6IFNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMsCisgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFV0aWxzLk1vZGFsc0hhbmRsZXIKKyAgICAgICAgKXsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJlZ2lzdGVyQ2hpbGQodGhpcyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdERlc2NyaXB0aW9ucyA9ICgpOnZvaWQgPT57CisgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdERlc2NyaXB0aW9ucyA9IHt9OworICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzLChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3REZXNjcmlwdGlvbnNbYXJ0aWZhY3QuYXJ0aWZhY3RMYWJlbF0gPSBhcnRpZmFjdC5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisKKyAgICAgICAgcHJpdmF0ZSBzZXRBcnRpZmFjdCA9IChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PnsKKyAgICAgICAgICAgIGlmKGFydGlmYWN0LmhlYXRQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSAmJiBwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuY3VycmVudFZhbHVlID0gcGFyYW1ldGVyLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiIiA9PT0gcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFhcnRpZmFjdC5kZXNjcmlwdGlvbiB8fCAhdGhpcy4kc2NvcGUuZ2V0VmFsaWRhdGlvblBhdHRlcm4oJ3N0cmluZycpLnRlc3QoYXJ0aWZhY3QuZGVzY3JpcHRpb24pKXsKKyAgICAgICAgICAgICAgICBhcnRpZmFjdC5kZXNjcmlwdGlvbiA9IHRoaXMuJHNjb3BlLmFydGlmYWN0RGVzY3JpcHRpb25zW2FydGlmYWN0LmFydGlmYWN0TGFiZWxdOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdXBkYXRlQWxsID0gKCk6dm9pZCA9PnsKKyAgICAgICAgICAgIGxldCBhcnRpZmFjdHM6QXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+PSBbXTsKKyAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLiRzY29wZS5jb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cywoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZihhcnRpZmFjdC5zZWxlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFydGlmYWN0KGFydGlmYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzLnB1c2goYXJ0aWZhY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LnVwZGF0ZU11bHRpcGxlQXJ0aWZhY3RzKGFydGlmYWN0cyk7CisgICAgICAgIH07CisKKworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVJblByb2dyZXNzID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQgPSB0aGlzLiRzY29wZS5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdERlc2NyaXB0aW9ucygpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cyk7CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudGFibGVIZWFkZXJzTGlzdCA9IFsKKyAgICAgICAgICAgICAgICB7dGl0bGU6J05hbWUnLCBwcm9wZXJ0eTogJ2FydGlmYWN0RGlzcGxheU5hbWUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6J1R5cGUnLCBwcm9wZXJ0eTogJ2FydGlmYWN0VHlwZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTonRGVwbG95bWVudCB0aW1lb3V0JywgcHJvcGVydHk6ICd0aW1lb3V0J30KKyAgICAgICAgICAgIF07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnQgPSAoc29ydEJ5OnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJzZSA9ICh0aGlzLiRzY29wZS5zb3J0QnkgPT09IHNvcnRCeSkgPyAhdGhpcy4kc2NvcGUucmV2ZXJzZSA6IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnRCeSA9IHNvcnRCeTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFZhbGlkYXRpb25QYXR0ZXJuID0gKHZhbGlkYXRpb25UeXBlOnN0cmluZywgcGFyYW1ldGVyVHlwZT86c3RyaW5nKTpSZWdFeHAgPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25VdGlscy5nZXRWYWxpZGF0aW9uUGF0dGVybih2YWxpZGF0aW9uVHlwZSwgcGFyYW1ldGVyVHlwZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0ZUpzb24gPSAoanNvbjpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIGlmKCFqc29uKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUpzb24oanNvbik7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFkZE9yVXBkYXRlID0gKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgYXJ0aWZhY3QuYXJ0aWZhY3RHcm91cFR5cGUgPSAnREVQTE9ZTUVOVCc7CisgICAgICAgICAgICAgICAgbGV0IGFydGlmYWN0Q29weSA9IG5ldyBNb2RlbHMuQXJ0aWZhY3RNb2RlbChhcnRpZmFjdCk7CisgICAgICAgICAgICAgICAgdGhpcy5Nb2RhbHNIYW5kbGVyLm9wZW5XaXphcmRBcnRpZmFjdE1vZGFsKGFydGlmYWN0Q29weSwgdGhpcy4kc2NvcGUuY29tcG9uZW50KS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3REZXNjcmlwdGlvbnNbYXJ0aWZhY3RDb3B5LmFydGlmYWN0TGFiZWxdPSBhcnRpZmFjdENvcHkuZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFydGlmYWN0cyA9IDxBcnRpZmFjdE1vZGVsW10+Xy52YWx1ZXModGhpcy4kc2NvcGUuY29tcG9uZW50LmRlcGxveW1lbnRBcnRpZmFjdHMpOworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5ub0FydGlmYWN0c1RvU2hvdyA9ICgpOmJvb2xlYW4gPT57CisgICAgICAgICAgICAgICAgcmV0dXJuICFfLnNvbWUodGhpcy4kc2NvcGUuYXJ0aWZhY3RzLCAnZXNJZCcpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVzZXRWYWx1ZSA9IChwYXJhbWV0ZXI6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZighcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSAmJiBwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlKXsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSA9IHBhcmFtZXRlci5kZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoJ2Jvb2xlYW4nPT1wYXJhbWV0ZXIudHlwZSl7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5jdXJyZW50VmFsdWUgPSBwYXJhbWV0ZXIuY3VycmVudFZhbHVlLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2goJ2VkaXRGb3JtLiR2YWxpZCcsICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmVkaXRGb3JtKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodGhpcy4kc2NvcGUuZWRpdEZvcm0uJHZhbGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlID0gKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkID0+eworICAgICAgICAgICAgICAgIGlmKGZhbHNlID09IHRoaXMuJHNjb3BlLmlzTG9hZGluZykgeworICAgICAgICAgICAgICAgICAgICBpZihhcnRpZmFjdC5zZWxlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZUFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdERlc2NyaXB0aW9uc1tyZXNwb25zZUFydGlmYWN0LmFydGlmYWN0TGFiZWxdID0gcmVzcG9uc2VBcnRpZmFjdC5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdHMgPSA8QXJ0aWZhY3RNb2RlbFtdPl8udmFsdWVzKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVJblByb2dyZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2VsZWN0ZWQgPSAhYXJ0aWZhY3Quc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoZXJyb3I6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGFydGlmYWN0IHJldHVybmVkIGVycm9yOicsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVJblByb2dyZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2VsZWN0ZWQgPSAhYXJ0aWZhY3Quc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFydGlmYWN0KGFydGlmYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5hZGRPclVwZGF0ZUFydGlmYWN0KGFydGlmYWN0KS50aGVuKG9uU3VjY2Vzcywgb25GYWlsZWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2VsZWN0ZWQgPSAhYXJ0aWZhY3Quc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5kZWxldGUgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCBvbk9rID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cyk7CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgYXJ0aWZhY3QgcmV0dXJuZWQgZXJyb3I6JywgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZWxldGVBcnRpZmFjdChhcnRpZmFjdC51bmlxdWVJZCwgYXJ0aWZhY3QuYXJ0aWZhY3RMYWJlbCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IHRpdGxlOnN0cmluZyA9IHNlbGYuJGZpbHRlcigndHJhbnNsYXRlJykoIkFSVElGQUNUX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIik7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U6c3RyaW5nID0gc2VsZi4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiQVJUSUZBQ1RfVklFV19ERUxFVEVfTU9EQUxfVEVYVCIsICJ7J25hbWUnOiAnIiArIGFydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWUgKyAiJ30iKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBtZXNzYWdlLCBmYWxzZSkudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHNhdmUgPSAoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy51cGRhdGVBbGwoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldENvbXBvbmVudCh0aGlzLiRzY29wZS5jb21wb25lbnQpOworICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGJhY2sgPSAoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50KHRoaXMuJHNjb3BlLmNvbXBvbmVudCk7CisgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWZvcm0tc3RlcC9hcnRpZmFjdC1mb3JtLXN0ZXAtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWZvcm0tc3RlcC9hcnRpZmFjdC1mb3JtLXN0ZXAtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk3MjljCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtZm9ybS1zdGVwL2FydGlmYWN0LWZvcm0tc3RlcC12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMzA0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzLldpemFyZCB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBSZXNvdXJjZSA9IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZTsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVkaXRBcnRpZmFjdFN0ZXBNb2RlbCB7CisgICAgICAgIGFydGlmYWN0UmVzb3VyY2U6IE1vZGVscy5BcnRpZmFjdE1vZGVsOworICAgICAgICBhcnRpZmFjdFR5cGVzOiBBcnJheTxzdHJpbmc+OworICAgICAgICBhcnRpZmFjdHNGb3JtTGlzdDogYW55OworICAgICAgICBhcnRpZmFjdEZpbGU6YW55OworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUFydGlmYWN0UmVzb3VyY2VGb3JtU3RlcFZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBmb3Jtczphbnk7CisgICAgICAgIGZvb3RlckJ1dHRvbnM6IEFycmF5PGFueT47CisgICAgICAgIGlzTmV3OiBib29sZWFuOworICAgICAgICBpc1BsYWNlSG9sZGVyQXJ0aWZhY3Q6Ym9vbGVhbjsKKyAgICAgICAgaXNMb2FkaW5nOiBib29sZWFuOworICAgICAgICB2YWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICB1cmxWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBsYWJlbFZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGludGVnZXJWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBjb21tZW50VmFsaWRhdGlvblBhdHRlcm46IFJlZ0V4cDsKKyAgICAgICAgYXJ0aWZhY3RUeXBlOiBzdHJpbmc7CisgICAgICAgIGFydGlmYWN0R3JvdXBUeXBlOnN0cmluZzsKKyAgICAgICAgZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbDogSUVkaXRBcnRpZmFjdFN0ZXBNb2RlbDsKKyAgICAgICAgZGVmYXVsdEhlYXRUaW1lb3V0OiBudW1iZXI7CisgICAgICAgIHZhbGlkRXh0ZW5zaW9uczogYW55OworICAgICAgICBvcmlnaW5hbEFydGlmYWN0TmFtZTogc3RyaW5nOworICAgICAgICBtb2RhbEluc3RhbmNlQXJ0aWZhY3Q6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZTsKKyAgICAgICAgc2VsZWN0ZWRBcnRpZmFjdDpzdHJpbmc7CisKKyAgICAgICAgZmlsZUV4dGVuc2lvbnMoKTpzdHJpbmc7CisgICAgICAgIHNhdmUoKTogdm9pZDsKKyAgICAgICAgY2xvc2UoKTogdm9pZDsKKyAgICAgICAgY2hhbmdlQXJ0aWZhY3Qoc2VsZWN0ZWRBcnRpZmFjdDpzdHJpbmcpOnZvaWQ7CisgICAgICAgIGdldE9wdGlvbnMoKTogQXJyYXk8c3RyaW5nPjsKKyAgICAgICAgcmVtb3ZlSW5wdXRMYWJlbCgpOiB2b2lkOworICAgICAgICBmaWxlVXBsb2FkUmVxdWlyZWQoKTpzdHJpbmc7CisgICAgICAgIGlzRGVwbG95bWVudEhlYXQoKTpib29sZWFuOworICAgICAgICBzZXREZWZhdWx0VGltZW91dCgpOnZvaWQ7CisgICAgICAgIGdldEZvcm1UaXRsZSgpOnN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgQXJ0aWZhY3RSZXNvdXJjZUZvcm1TdGVwVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJG1vZGFsSW5zdGFuY2UnLAorICAgICAgICAgICAgJ2FydGlmYWN0JywKKyAgICAgICAgICAgICdjb21wb25lbnQnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdVcmxWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnTGFiZWxWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnSW50ZWdlclZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdDb21tZW50VmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25VdGlscycsCisgICAgICAgICAgICAnQXJ0aWZhY3RzVXRpbHMnLAorICAgICAgICAgICAgJyRzdGF0ZScsCisgICAgICAgICAgICAnJG1vZGFsJywKKyAgICAgICAgICAgICckdGVtcGxhdGVDYWNoZScKKyAgICAgICAgXTsKKworICAgICAgICBwcml2YXRlIGZvcm1TdGF0ZTpVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlOworICAgICAgICBwcml2YXRlIGVudGl0eUlkOnN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJQXJ0aWZhY3RSZXNvdXJjZUZvcm1TdGVwVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNhY2hlU2VydmljZTpTZXJ2aWNlcy5DYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFVybFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBMYWJlbFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblV0aWxzOlNkYy5VdGlscy5WYWxpZGF0aW9uVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQXJ0aWZhY3RzVXRpbHM6U2RjLlV0aWxzLkFydGlmYWN0c1V0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTphbnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSkgeworCisKKyAgICAgICAgICAgIHRoaXMuZW50aXR5SWQgPSB0aGlzLmNvbXBvbmVudC51bmlxdWVJZDsKKyAgICAgICAgICAgIHRoaXMuZm9ybVN0YXRlID0gYW5ndWxhci5pc0RlZmluZWQoYXJ0aWZhY3QuYXJ0aWZhY3RMYWJlbCkgPyBVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlLlVQREFURSA6IFV0aWxzLkNvbnN0YW50cy5Gb3JtU3RhdGUuQ1JFQVRFOworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy5pbml0RWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbCgpOworICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7CisgICAgICAgICAgICB0aGlzLmluaXRBcnRpZmFjdFR5cGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRFZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsID0geworICAgICAgICAgICAgICAgIGFydGlmYWN0UmVzb3VyY2U6IG51bGwsCisgICAgICAgICAgICAgICAgYXJ0aWZhY3RUeXBlczogbnVsbCwKKyAgICAgICAgICAgICAgICBhcnRpZmFjdHNGb3JtTGlzdDoge30sCisgICAgICAgICAgICAgICAgYXJ0aWZhY3RGaWxlOiB7fQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdENvbXBvbmVudCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlID0gdGhpcy5hcnRpZmFjdDsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9yaWdpbmFsQXJ0aWZhY3ROYW1lID0gdGhpcy5hcnRpZmFjdC5hcnRpZmFjdE5hbWU7CisgICAgICAgICAgICBsZXQgYXJ0aWZhY3RzOmFueSA9IFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdEdyb3VwVHlwZS5JTkZPUk1BVElPTiA9PT0gdGhpcy5hcnRpZmFjdC5hcnRpZmFjdEdyb3VwVHlwZT8KKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5hcnRpZmFjdHMgOiB0aGlzLmNvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdHNGb3JtTGlzdCA9IF8ucGljayhhcnRpZmFjdHMsIChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFydGlmYWN0LmFydGlmYWN0TGFiZWwgJiYgIWFydGlmYWN0LmVzSWQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RGaWxlLmZpbGVuYW1lPSB0aGlzLmFydGlmYWN0LmFydGlmYWN0TmFtZT90aGlzLmFydGlmYWN0LmFydGlmYWN0TmFtZTonJzsKKworICAgICAgICAgICAgaWYodGhpcy5hcnRpZmFjdC5hcnRpZmFjdExhYmVsKXsvL3RoaXMgaXMgZWRpdCBtb2RlCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdHNGb3JtTGlzdFt0aGlzLmFydGlmYWN0LmFydGlmYWN0TGFiZWxdPSB0aGlzLmFydGlmYWN0OworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlbGVjdGVkQXJ0aWZhY3QgPSB0aGlzLmFydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0QXJ0aWZhY3RUeXBlcyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgbGV0IGFydGlmYWN0VHlwZXM6YW55ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdVSUNvbmZpZ3VyYXRpb24nKTsKKworICAgICAgICAgICAgaWYgKFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdEdyb3VwVHlwZS5JTkZPUk1BVElPTiA9PT0gdGhpcy5hcnRpZmFjdC5hcnRpZmFjdEdyb3VwVHlwZSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RUeXBlcyA9IGFydGlmYWN0VHlwZXMuYXJ0aWZhY3RzLm90aGVyLm1hcCgoZWxlbWVudDphbnkpPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5uYW1lOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIF8ucmVtb3ZlKHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RUeXBlcywgKGl0ZW06c3RyaW5nKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uaGFzKFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdFR5cGUuVEhJUkRfUEFSVFlfUkVTRVJWRURfVFlQRVMsIGl0ZW0pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmhhcyhVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRPU0NBLCBpdGVtKTsKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfWVsc2UgaWYoVXRpbHMuQ29uc3RhbnRzLkFydGlmYWN0R3JvdXBUeXBlLkRFUExPWU1FTlQgPT09IHRoaXMuYXJ0aWZhY3QuYXJ0aWZhY3RHcm91cFR5cGUpIHsKKworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9ucyA9IGFydGlmYWN0VHlwZXMuYXJ0aWZhY3RzLmRlcGxveW1lbnQucmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzOworICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0VHlwZXMgPSBPYmplY3Qua2V5cyh0aGlzLiRzY29wZS52YWxpZEV4dGVuc2lvbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5kZWZhdWx0SGVhdFRpbWVvdXQgPSBhcnRpZmFjdFR5cGVzLmRlZmF1bHRIZWF0VGltZW91dDsKKworICAgICAgICAgICAgICAgIGlmKCF0aGlzLiRzY29wZS5pc1BsYWNlSG9sZGVyQXJ0aWZhY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgXy5yZW1vdmUodGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFR5cGVzLCAoaXRlbTpzdHJpbmcpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLkNvbnN0YW50cy5BcnRpZmFjdFR5cGUuSEVBVCA9PSBpdGVtLnN1YnN0cmluZygwLDQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5oYXMoVXRpbHMuQ29uc3RhbnRzLkFydGlmYWN0VHlwZS5USElSRF9QQVJUWV9SRVNFUlZFRF9UWVBFUywgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYodGhpcy5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmICg8UmVzb3VyY2U+dGhpcy5jb21wb25lbnQpLmlzQ3NhckNvbXBvbmVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIF8ucmVtb3ZlKHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RUeXBlcywgKGl0ZW06c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5BcnRpZmFjdHNVdGlscy5pc0xpY2Vuc2VUeXBlKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RhbEluc3RhbmNlQXJ0aWZhY3QgPSB0aGlzLiRtb2RhbEluc3RhbmNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLlZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXJsVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLlVybFZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUubGFiZWxWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuTGFiZWxWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmludGVnZXJWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuSW50ZWdlclZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Db21tZW50VmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzUGxhY2VIb2xkZXJBcnRpZmFjdCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc05ldyA9ICh0aGlzLmZvcm1TdGF0ZSA9PT0gVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZS5DUkVBVEUpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RHcm91cFR5cGUgPSB0aGlzLmFydGlmYWN0LmFydGlmYWN0R3JvdXBUeXBlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRBcnRpZmFjdCA9ICc/JzsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZmlsZUV4dGVuc2lvbnMgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgIGxldCB0eXBlOnN0cmluZyA9IHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdFR5cGU7CisgICAgICAgICAgICAgICAgcmV0dXJuICB0eXBlICYmIHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9ucyAmJiB0aGlzLiRzY29wZS52YWxpZEV4dGVuc2lvbnNbdHlwZV0uYWNjZXB0ZWRUeXBlcyA/CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkRXh0ZW5zaW9uc1t0eXBlXS5hY2NlcHRlZFR5cGVzLmpvaW4oJywnKSA6ICIiOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVtb3ZlSW5wdXRMYWJlbCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzUGxhY2VIb2xkZXJBcnRpZmFjdCA9IHRydWU7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5maWxlVXBsb2FkUmVxdWlyZWQgPSAoKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5pc05ldz09PWZhbHNlKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmYWxzZSc7IC8vIFRoaXMgaXMgZWRpdCBtb2RlCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cnVlJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0RlcGxveW1lbnRIZWF0ID0gKCk6Ym9vbGVhbiA9PnsKKyAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuQ29uc3RhbnRzLkFydGlmYWN0R3JvdXBUeXBlLkRFUExPWU1FTlQgPT09IHRoaXMuYXJ0aWZhY3QuYXJ0aWZhY3RHcm91cFR5cGUKKyAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdFR5cGUKKyAgICAgICAgICAgICAgICAgICAgJiYgVXRpbHMuQ29uc3RhbnRzLkFydGlmYWN0VHlwZS5IRUFUID09PSB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuYXJ0aWZhY3RUeXBlLnN1YnN0cmluZygwLDQpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0Rm9ybVRpdGxlID0oKTogc3RyaW5nID0+eworICAgICAgICAgICAgICAgIGxldCB0aXRsZTpzdHJpbmcgPSB0aGlzLmFydGlmYWN0LmVzSWQ/ICdVcGRhdGUnOidBZGQnOworICAgICAgICAgICAgICAgIGlmIChVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RHcm91cFR5cGUuREVQTE9ZTUVOVCA9PT0gdGhpcy5hcnRpZmFjdC5hcnRpZmFjdEdyb3VwVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgKz0gJyBEZXBsb3ltZW50JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGl0bGUgKz0gJyBBcnRpZmFjdCc7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0RGVmYXVsdFRpbWVvdXQgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZighdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLnRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLnRpbWVvdXQgPSB0aGlzLiRzY29wZS5kZWZhdWx0SGVhdFRpbWVvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hhbmdlQXJ0aWZhY3QgPSAoc2VsZWN0ZWRBcnRpZmFjdDpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCB0ZW1wQXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwgPSB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2U7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEFydGlmYWN0ICYmIHNlbGVjdGVkQXJ0aWZhY3QgIT0gJycgJiYgc2VsZWN0ZWRBcnRpZmFjdCAhPSAnPycpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGFydGlmYWN0UmVzb3VyY2UgPSA8TW9kZWxzLkFydGlmYWN0TW9kZWw+Xy5maW5kKHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RzRm9ybUxpc3QseydhcnRpZmFjdERpc3BsYXlOYW1lJzpzZWxlY3RlZEFydGlmYWN0fSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZSA9IG5ldyBTZGMuTW9kZWxzLkFydGlmYWN0TW9kZWwoYXJ0aWZhY3RSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9yaWdpbmFsQXJ0aWZhY3ROYW1lID0gdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0TmFtZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNQbGFjZUhvbGRlckFydGlmYWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuaXNEZXBsb3ltZW50SGVhdCgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldERlZmF1bHRUaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQXJ0aWZhY3QgPT09ICIiKSB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdEZpbGUgPSB7fTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlID0gPE1vZGVscy5BcnRpZmFjdE1vZGVsPnt9OworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuYXJ0aWZhY3RHcm91cFR5cGUgPSB0aGlzLiRzY29wZS5hcnRpZmFjdEdyb3VwVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNQbGFjZUhvbGRlckFydGlmYWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKF8uc2l6ZSh0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZSkgJiYgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5hcnRpZmFjdE5hbWUgPSB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0RmlsZS5maWxlbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYodGVtcEFydGlmYWN0ICYmIHRlbXBBcnRpZmFjdC5kZXNjcmlwdGlvbiAhPSAnJyl7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5kZXNjcmlwdGlvbiA9IHRlbXBBcnRpZmFjdC5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLmluaXRBcnRpZmFjdFR5cGVzKCk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNOZXcgPSB0cnVlOworCisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNhdmUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5kZXNjcmlwdGlvbiA9CisgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGF0aW9uVXRpbHMuc3RyaXBBbmRTYW5pdGl6ZSh0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuZGVzY3JpcHRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5wYXlsb2FkRGF0YSA9IHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RGaWxlLmJhc2U2NDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0TmFtZSA9IHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RGaWxlLmZpbGVuYW1lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChyZXNwb25zZSkgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvbkZhaWxkJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0UmVzb3VyY2UuZXNJZCA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9yaWdpbmFsQXJ0aWZhY3ROYW1lID0gIiI7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5hZGRPclVwZGF0ZUFydGlmYWN0KHRoaXMuJHNjb3BlLmVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2xvc2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmRpc21pc3MoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vbmV3IGZvcm0gbGF5b3V0IGZvciBpbXBvcnQgYXNzZXQKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZvcm1zID0ge307CisgICAgICAgICAgICB0aGlzLiRzY29wZS5mb290ZXJCdXR0b25zID0gWworICAgICAgICAgICAgICAgIHsnbmFtZSc6IHRoaXMuYXJ0aWZhY3QuZXNJZCA/ICdVcGRhdGUnIDogJ0FkZCcsICdjc3MnOiAnYmx1ZScsICdjYWxsYmFjayc6IHRoaXMuJHNjb3BlLnNhdmV9LAorICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdDYW5jZWwnLCAnY3NzJzogJ2dyZXknLCAnY2FsbGJhY2snOiB0aGlzLiRzY29wZS5jbG9zZX0KKyAgICAgICAgICAgIF07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLiR3YXRjaCgiZm9ybXMuZWRpdEZvcm0uJGludmFsaWQiLCAobmV3VmFsLCBvbGRWYWwpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5mb290ZXJCdXR0b25zWzBdLmRpc2FibGVkID0gdGhpcy4kc2NvcGUuZm9ybXMuZWRpdEZvcm0uJGludmFsaWQ7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1mb3JtLXN0ZXAvYXJ0aWZhY3QtZm9ybS1zdGVwLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWZvcm0tc3RlcC9hcnRpZmFjdC1mb3JtLXN0ZXAtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDNiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1mb3JtLXN0ZXAvYXJ0aWZhY3QtZm9ybS1zdGVwLXZpZXcuaHRtbApAQCAtMCwwICsxLDE0NyBAQAorPHNkYy1tb2RhbCBtb2RhbD0ibW9kYWxJbnN0YW5jZUFydGlmYWN0IiB0eXBlPSJjbGFzc2ljIiBjbGFzcz0ic2RjLWFkZC1hcnRpZmFjdCIgYnV0dG9ucz0iZm9vdGVyQnV0dG9ucyIgaGVhZGVyPSJ7e2dldEZvcm1UaXRsZSgpfX0iIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIj4KKworICAgIDxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciPjwvbG9hZGVyPgorCisgICAgPGZvcm0gbm92YWxpZGF0ZSBjbGFzcz0idy1zZGMtZm9ybSB0d28tY29sdW1ucyIgbmFtZT0iZm9ybXMuZWRpdEZvcm0iPgorCisgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFSVElGQUNUIEZJTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSI+CisgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InJlcXVpcmVkIj5VcGxvYWQgRmlsZTwvbGFiZWw+CisgICAgICAgICAgICA8ZmlsZS11cGxvYWQgaWQ9ImZpbGVVcGxvYWRFbGVtZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0tZWxlbWVudD0iZm9ybXMuZWRpdEZvcm0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC1yZXF1aXJlZD0ie3tmaWxlVXBsb2FkUmVxdWlyZWQoKX19IgorICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtbmFtZT0ibXlBcnRpZmFjdEZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS1tb2RlbD0iZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdEZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucz0ie3tmaWxlRXh0ZW5zaW9ucygpfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IGZvcm1zLmVkaXRGb3JtLm15QXJ0aWZhY3RGaWxlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kaW52YWxpZH0iPjwvZmlsZS11cGxvYWQ+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yLWZpbGUtdXBsb2FkIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLm15QXJ0aWZhY3RGaWxlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0ubXlBcnRpZmFjdEZpbGUuJGVycm9yLnJlcXVpcmVkICYmICFmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kZXJyb3IuZW1wdHlGaWxlIiB0cmFuc2xhdGU9IkFERF9BUlRJRkFDVF9FUlJPUl9GSUxFX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0ubXlBcnRpZmFjdEZpbGUuJGVycm9yLm1heHNpemUiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfRklMRV9TSVpFIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gbmctaWY9IidERVBMT1lNRU5UJyA9PT0gYXJ0aWZhY3RHcm91cFR5cGUiIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLm15QXJ0aWZhY3RGaWxlLiRlcnJvci5maWxldHlwZSIgdHJhbnNsYXRlPSJBRERfQVJUSUZBQ1RfRVJST1JfVkFMSURfRVhURU5TSU9OUyIgdHJhbnNsYXRlLXZhbHVlcz0ieydleHRlbnNpb25zJzogJ3t7ZmlsZUV4dGVuc2lvbnMoKX19J30iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5teUFydGlmYWN0RmlsZS4kZXJyb3IuZW1wdHlGaWxlIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfRU1QVFlfRklMRSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBUlRJRkFDVCBGSUxFIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1ucy13cmFwcGVyIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIj4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLnBsYWNlSG9sZGVyLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5wbGFjZUhvbGRlci4kaW52YWxpZCl9IiBkYXRhLW5nLXNob3c9ImlzUGxhY2VIb2xkZXJBcnRpZmFjdCI+CisgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5BcnRpZmFjdDwvbGFiZWw+CisgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iaS1zZGMtZm9ybS1zZWxlY3QiCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwbGFjZUhvbGRlciIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9IiFpc05ldyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9InNlbGVjdGVkQXJ0aWZhY3QiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0iY2hhbmdlQXJ0aWZhY3Qoc2VsZWN0ZWRBcnRpZmFjdCkiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJzZWxlY3RBcnRpZmFjdCI+CisgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGlzYWJsZWQgdmFsdWU9Ij8iPlNlbGVjdCBBcnRpZmFjdDwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtbmctcmVwZWF0PSIoa2V5LHZhbHVlKSBpbiBlZGl0QXJ0aWZhY3RSZXNvdXJjZU1vZGVsLmFydGlmYWN0c0Zvcm1MaXN0Ij57e3ZhbHVlLmFydGlmYWN0RGlzcGxheU5hbWV9fTwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPkNyZWF0ZSBOZXcgQXJ0aWZhY3Q8L29wdGlvbj4KKworICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0ucGxhY2VIb2xkZXIuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnBsYWNlSG9sZGVyLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0ucGxhY2VIb2xkZXIuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IkFERF9BUlRJRkFDVF9FUlJPUl9UWVBFX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLmFydGlmYWN0TGFiZWwuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLmFydGlmYWN0TGFiZWwuJGludmFsaWQpfSIgZGF0YS1uZy1zaG93PSIhaXNQbGFjZUhvbGRlckFydGlmYWN0Ij4KKyAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPkFydGlmYWN0IExhYmVsPC9sYWJlbD4KKyAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0TGFiZWwiCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImFydGlmYWN0TGFiZWwiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiAyMDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJsYWJlbFZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1IgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSIhaXNOZXcgfHwgZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLm1hbmRhdG9yeSIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iYXJ0aWZhY3RMYWJlbCIKKyAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzLz4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtaWNvbi1jYW5jZWwiIGRhdGEtbmctY2xpY2s9InNlbGVjdGVkQXJ0aWZhY3Q9Jz8nOyByZW1vdmVJbnB1dExhYmVsKCkiPjwvc3Bhbj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmFydGlmYWN0TGFiZWwuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLmFydGlmYWN0TGFiZWwuJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5hcnRpZmFjdExhYmVsLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJBRERfQVJUSUZBQ1RfRVJST1JfTEFCRUxfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uYXJ0aWZhY3RMYWJlbC4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjUnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uYXJ0aWZhY3RMYWJlbC4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0udGltZW91dC4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udGltZW91dC4kaW52YWxpZCl9IgorICAgICAgICAgICAgICAgICBkYXRhLW5nLWlmPSJpc0RlcGxveW1lbnRIZWF0KCkiPgorICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCI+RGVwbG95bWVudCBUaW1lb3V0IChtaW51dGVzKTwvbGFiZWw+CisgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjUiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS50aW1lb3V0IgorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InRpbWVvdXQiCisgICAgICAgICAgICAgICAgICAgICAgIG1pbj0iMSIKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4PSIyMTQ3NDgzNjQ3IgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49ImludGVnZXJWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pbml0PSJzZXREZWZhdWx0VGltZW91dCgpIgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0ic2V0RGVmYXVsdFRpbWVvdXQoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0idGltZW91dCIvPgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udGltZW91dC4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udGltZW91dC4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnRpbWVvdXQuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzI1JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnRpbWVvdXQuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX1RJTUVPVVRfUEFUVEVSTiI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS50aW1lb3V0LiRlcnJvci5taW4iIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX1RJTUVPVVRfTUlOIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS50eXBlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS50eXBlLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+VHlwZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iaS1zZGMtZm9ybS1zZWxlY3QiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iIWlzTmV3IHx8IGVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5tYW5kYXRvcnkgfHwgJz8nPT1zZWxlY3RlZEFydGlmYWN0IgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iZWRpdEFydGlmYWN0UmVzb3VyY2VNb2RlbC5hcnRpZmFjdFJlc291cmNlLmFydGlmYWN0VHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctb3B0aW9ucz0idHlwZSBhcyB0eXBlIGZvciB0eXBlIGluIGVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RUeXBlcyB0cmFjayBieSB0eXBlIHwgdXBwZXJjYXNlIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iYXJ0aWZhY3R0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5DaG9vc2UgVHlwZTwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udHlwZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udHlwZS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnR5cGUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IkFERF9BUlRJRkFDVF9FUlJPUl9UWVBFX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKworICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW4iPgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iCisgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRpbnZhbGlkKX0iPgorICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+RGVzY3JpcHRpb248L2xhYmVsPgorICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJpLXNkYy1mb3JtLXRleHRhcmVhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIyNTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIyNTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRBcnRpZmFjdFJlc291cmNlTW9kZWwuYXJ0aWZhY3RSZXNvdXJjZS5kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0iY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJBRERfQVJUSUZBQ1RfRVJST1JfREVTQ1JJUFRJT05fUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzI1NicgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtZm9ybS1ub3RlIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLiRpbnZhbGlkICYmIGZhbHNlIiB0cmFuc2xhdGU9IkxBQkVMX0FMTF9GSUVMRFNfQVJFX01BTkRBVE9SWSI+PC9zcGFuPgorCisgICAgPC9mb3JtPgorCis8L3NkYy1tb2RhbD4KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1mb3JtLXN0ZXAvYXJ0aWZhY3QtZm9ybS1zdGVwLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1mb3JtLXN0ZXAvYXJ0aWZhY3QtZm9ybS1zdGVwLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4OWMxMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWZvcm0tc3RlcC9hcnRpZmFjdC1mb3JtLXN0ZXAubGVzcwpAQCAtMCwwICsxLDQ1IEBACisuc2RjLWFkZC1hcnRpZmFjdCB7CisKKyAgICAudy1zZGMtZm9ybS1ub3RlIHsKKyAgICAgICAgLmhfOTsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiAxM3B4OworICAgIH0KKworICAgIC53LXNkYy1mb3JtIHsKKworICAgICAgICAuaS1zZGMtZm9ybS10ZXh0YXJlYXsKKyAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDk1cHg7CisgICAgICAgIH0KKworICAgICAgICAuaS1zZGMtZm9ybS1pdGVtLnVwbG9hZCBpbnB1dFt0eXBlPSJmaWxlIl0geworICAgICAgICAgICAgZGlzcGxheTogbm9uZQorICAgICAgICB9CisKKyAgICAgICAgLnctc2RjLWljb24tY2FuY2VsIHsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIHJpZ2h0OiA3cHg7CisgICAgICAgICAgICB0b3A6IDMzcHg7CisgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgLnNwcml0ZS5zbWFsbC14LWJ0bi1ibGFjazsKKyAgICAgICAgICAgIC5oYW5kOworICAgICAgICB9CisgICAgfQorCisgICAgLmFydGlmYWN0LWluZm8geworICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICBjb2xvcjogIHJnYigxNDAsIDE0MCwgMTQwKTsKKyAgICAgICAgZm9udC1zaXplOiAxM3B4OworICAgICAgICBtYXJnaW4tdG9wOiAtNDBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OworICAgICAgICB3aWR0aDogNjAwcHg7CisgICAgICAgIG1pbi1oZWlnaHQ6IGluaXRpYWw7CisKKyAgICAgICAgc3BhbiB7CisgICAgICAgICAgICBjb2xvcjogICM2NjY2NjY7CisgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ1NjY1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwLmh0bWwKQEAgLTAsMCArMSw0OCBAQAorPGRpdiBjbGFzcz0iYXJ0aWZhY3Qtc3RlcCIgZGF0YS1uZy1jb250cm9sbGVyPSJTZGMuVmlld01vZGVscy5XaXphcmQuQXJ0aWZhY3RJbmZvcm1hdGlvblN0ZXBWaWV3TW9kZWwiPgorICAgIDxkaXYgZGF0YS10ZXN0cy1pZD0iYWRkLWluZm9ybWF0aW9uLWFydGlmYWN0LWJ1dHRvbiIgZGF0YS10ZXN0cy1pZD0iYWRkR3JleSIgY2xhc3M9Inctc2RjLWNsYXNzaWMtYnRuIGdyYXkiIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlKHt9KSIgdHlwZT0iYnV0dG9uIj5BZGQgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0idGFibGUtY29udGFpbmVyLWZsZXgiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkIGZsZXgtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgaGVhZC1yb3cgaGFuZCBmbGV4LWl0ZW0iIG5nLXJlcGVhdD0iaGVhZGVyIGluIHRhYmxlSGVhZGVyc0xpc3QgdHJhY2sgYnkgJGluZGV4IiBkYXRhLW5nLWNsaWNrPSJzb3J0KGhlYWRlci5wcm9wZXJ0eSkiPnt7aGVhZGVyLnRpdGxlfX0KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1zaG93PSJzb3J0QnkgPT09IGhlYWRlci5wcm9wZXJ0eSIgY2xhc3M9InRhYmxlLWhlYWRlci1zb3J0LWFycm93IiBkYXRhLW5nLWNsYXNzPSJ7J2Rvd24nOiByZXZlcnNlLCAndXAnOiFyZXZlcnNlfSI+IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1uby10ZXh0LWhlYWRlciBoZWFkLXJvdyBmbGV4LWl0ZW0iPjwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc3VwcHJlc3Mtc2Nyb2xsLXg9InRydWUiIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctaWY9InNob3dOb0FydGlmYWN0TWVzc2FnZSgpIiBjbGFzcz0ibm8tcm93LXRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIG5vIGluZm9ybWF0aW9uIGFydGlmYWN0cyB0byBkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LXN0YXJ0PSJhcnRpZmFjdCBpbiBhcnRpZmFjdHN8IG9yZGVyQnk6c29ydEJ5OnJldmVyc2UgdHJhY2sgYnkgJGluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogYXJ0aWZhY3Quc2VsZWN0ZWR9IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaWY9ImFydGlmYWN0LmVzSWQiPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iICBkYXRhLW5nLWNsaWNrPSJhcnRpZmFjdC5zZWxlY3RlZCA9ICFhcnRpZmFjdC5zZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNwcml0ZSB0YWJsZS1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydvcGVuZWQnOiBhcnRpZmFjdC5zZWxlY3RlZH0iIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iICBkYXRhLW5nLWNsaWNrPSJhcnRpZmFjdC5zZWxlY3RlZCA9ICFhcnRpZmFjdC5zZWxlY3RlZCIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdFR5cGV9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcnRpZmFjdC5hcnRpZmFjdFR5cGV9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWJ0bi1jb2wgZmxleC1pdGVtIiAgc2RjLWtleWJvYXJkLWV2ZW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWJsZS1lZGl0LWJ0biIgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoYXJ0aWZhY3QpIj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWJsZS1kZWxldGUtYnRuIiBkYXRhLW5nLWNsaWNrPSJkZWxldGUoYXJ0aWZhY3QpIj4gPC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQtZW5kPSIiIGRhdGEtbmctaWY9ImFydGlmYWN0LnNlbGVjdGVkIiBjbGFzcz0iaXRlbS1vcGVuZWQiIGRhdGEtbmctYmluZD0iYXJ0aWZhY3QuZGVzY3JpcHRpb24iPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhZGQtYnV0dG9uIiBkYXRhLW5nLXJlcGVhdD0iYXJ0aWZhY3QgaW4gYXJ0aWZhY3RzIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXNob3c9IiFhcnRpZmFjdC5lc0lkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT0iREVQTE9ZTUVOVF9BUlRJRkFDVF9CVVRUT05fQUREX0hFQVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlLXZhbHVlcz0ieyduYW1lJzogJ3t7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19J30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoYXJ0aWZhY3QpIj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWRkLWJ1dHRvbiIgdHJhbnNsYXRlPSJERVBMT1lNRU5UX0FSVElGQUNUX0JVVFRPTl9BRERfT1RIRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoe30pIj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjAwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAubGVzcwpAQCAtMCwwICsxLDUwIEBACisuYXJ0aWZhY3Qtc3RlcCB7CisKKyAgICAudy1zZGMtY2xhc3NpYy1idG4geworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgfQorCisgICAgLnRhYmxleworICAgICAgICBoZWlnaHQ6IDQxMnB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgIG1hcmdpbi10b3A6IDBweDsKKworICAgICAgICAuaXRlbS1vcGVuZWR7CisgICAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CisgICAgICAgIH0KKworCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDEpIHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDVweCA0cHg7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE1OworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICBzcGFuLnRhYmxlLWFycm93IHsKKyAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDdweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDIpIHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDVweCA0cHg7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgzKSB7CisgICAgICAgICAgICBwYWRkaW5nOiA1cHggNHB4OworICAgICAgICAgICAgZmxleC1ncm93OiAzOworICAgICAgICAgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCg0KSB7CisgICAgICAgICAgICBwYWRkaW5nOiA1cHggNHB4OworICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICB9CisKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMjVhNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC50cwpAQCAtMCwwICsxLDE2OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscy5XaXphcmQgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBpbXBvcnQgQXJ0aWZhY3RNb2RlbCA9IFNkYy5Nb2RlbHMuQXJ0aWZhY3RNb2RlbDsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUFydGlmYWN0SW5mb3JtYXRpb25TdGVwU2NvcGUgZXh0ZW5kcyBJV2l6YXJkQ3JlYXRpb25TY29wZSB7CisgICAgICAgIGFydGlmYWN0czogQXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+OworICAgICAgICB0YWJsZUhlYWRlcnNMaXN0OiBBcnJheTxhbnk+OworICAgICAgICBhcnRpZmFjdFR5cGU6IHN0cmluZzsKKyAgICAgICAgaXNSZXNvdXJjZUluc3RhbmNlOmJvb2xlYW47CisgICAgICAgIGRvd25sb2FkRmlsZTpNb2RlbHMuSUZpbGVEb3dubG9hZDsKKyAgICAgICAgaXNMb2FkaW5nOmJvb2xlYW47CisgICAgICAgIHNvcnRCeTpzdHJpbmc7CisgICAgICAgIHJldmVyc2U6Ym9vbGVhbjsKKyAgICAgICAgY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKworICAgICAgICBnZXRUaXRsZSgpOiBzdHJpbmc7CisgICAgICAgIGFkZE9yVXBkYXRlKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZDsKKyAgICAgICAgZGVsZXRlKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZDsKKyAgICAgICAgZG93bmxvYWQoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICBjbGlja0FydGlmYWN0TmFtZShhcnRpZmFjdDphbnkpOnZvaWQ7CisgICAgICAgIG9wZW5FZGl0RW52UGFyYW1ldGVyc01vZGFsKGFydGlmYWN0UmVzb3VyY2U6IE1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkOworICAgICAgICBzb3J0KHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgICAgICBzaG93Tm9BcnRpZmFjdE1lc3NhZ2UoKTpib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBcnRpZmFjdEluZm9ybWF0aW9uU3RlcFZpZXdNb2RlbCBpbXBsZW1lbnRzIElXaXphcmRDcmVhdGlvblN0ZXAgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuU2hhcmluZ1NlcnZpY2UnLAorICAgICAgICAgICAgJyRzdGF0ZScsCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklBcnRpZmFjdEluZm9ybWF0aW9uU3RlcFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzaGFyaW5nU2VydmljZTpTZGMuU2VydmljZXMuU2hhcmluZ1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHN0YXRlOmFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNDb25maWc6TW9kZWxzLklBcHBDb25maWd1cnRhaW9uLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFV0aWxzLk1vZGFsc0hhbmRsZXIpIHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJlZ2lzdGVyQ2hpbGQodGhpcyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBnZXRNYXBwZWRPYmplY3RzKCk6YW55IHsKKyAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgbm9ybWFsOiB0aGlzLiRzY29wZS5jb21wb25lbnQuYXJ0aWZhY3RzCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBzZWxmID0gdGhpczsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydEJ5ID0gJ2FydGlmYWN0RGlzcGxheU5hbWUnOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJzZSA9IGZhbHNlOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUgPSAnbm9ybWFsJzsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFRpdGxlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZmlsdGVyKCJyZXNvdXJjZU5hbWUiKSh0aGlzLiRzY29wZS5jb21wb25lbnQubmFtZSkgKyAnIEFydGlmYWN0cyc7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOiAnTmFtZScsIHByb3BlcnR5OiAnYXJ0aWZhY3REaXNwbGF5TmFtZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ1R5cGUnLCBwcm9wZXJ0eTogJ2FydGlmYWN0VHlwZSd9CisgICAgICAgICAgICBdOworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudCA9IHRoaXMuJHNjb3BlLmdldENvbXBvbmVudCgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuYXJ0aWZhY3RzKTsKKworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0ID0gKHNvcnRCeTpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJldmVyc2UgPSAodGhpcy4kc2NvcGUuc29ydEJ5ID09PSBzb3J0QnkpID8gIXRoaXMuJHNjb3BlLnJldmVyc2UgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSBzb3J0Qnk7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFkZE9yVXBkYXRlID0gKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBhcnRpZmFjdC5hcnRpZmFjdEdyb3VwVHlwZSA9ICdJTkZPUk1BVElPTkFMJzsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbldpemFyZEFydGlmYWN0TW9kYWwoYXJ0aWZhY3QsIHRoaXMuJHNjb3BlLmdldENvbXBvbmVudCgpKS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuYXJ0aWZhY3RzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNob3dOb0FydGlmYWN0TWVzc2FnZSA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIGxldCBhcnRpZmFjdHM6YW55ID0gW107CisgICAgICAgICAgICAgICAgYXJ0aWZhY3RzID0gXy5maWx0ZXIodGhpcy4kc2NvcGUuYXJ0aWZhY3RzLCAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJ0aWZhY3QuZXNJZDsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGlmIChhcnRpZmFjdHMubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlbGV0ZSA9IChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBsZXQgb25PayA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFydGlmYWN0cyA9IDxBcnRpZmFjdE1vZGVsW10+Xy52YWx1ZXModGhpcy4kc2NvcGUuY29tcG9uZW50LmFydGlmYWN0cyk7CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGFydGlmYWN0IHJldHVybmVkIGVycm9yOicsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZWxldGVBcnRpZmFjdChhcnRpZmFjdC51bmlxdWVJZCwgYXJ0aWZhY3QuYXJ0aWZhY3RMYWJlbCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IHRpdGxlOnN0cmluZyA9ICB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJBUlRJRkFDVF9WSUVXX0RFTEVURV9NT0RBTF9USVRMRSIpOworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkFSVElGQUNUX1ZJRVdfREVMRVRFX01PREFMX1RFWFQiLCAieyduYW1lJzogJyIgKyBhcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lICsgIid9Iik7CisgICAgICAgICAgICAgICAgdGhpcy5Nb2RhbHNIYW5kbGVyLm9wZW5Db25maXJtYXRpb25Nb2RhbCh0aXRsZSwgbWVzc2FnZSwgZmFsc2UpLnRoZW4ob25Payk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jbGlja0FydGlmYWN0TmFtZSA9IChhcnRpZmFjdDphbnkpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoJ2RlcGxveW1lbnQnICE9PSB0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUgfHwgJ0hFQVQnICE9PSBhcnRpZmFjdC5hcnRpZmFjdFR5cGUgfHwgIWFydGlmYWN0LmVzSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWRkT3JVcGRhdGUoYXJ0aWZhY3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHNhdmUgPSAoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50KHRoaXMuJHNjb3BlLmNvbXBvbmVudCk7CisgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBiYWNrID0gKGNhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk3NWNhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvZ2VuZXJhbC1zdGVwL2dlbmVyYWwtc3RlcC5odG1sCkBAIC0wLDAgKzEsMjcwIEBACis8ZGl2IGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNkYy13aXphcmQtZ2VuZXJhbC1zdGVwIj4KKyAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IlNkYy5WaWV3TW9kZWxzLldpemFyZC5HZW5lcmFsU3RlcFZpZXdNb2RlbCI+CisgICAgICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9Inctc2RjLWZvcm0iIG5hbWU9ImVkaXRGb3JtIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tc2VjdGlvbi1jb250YWluZXIiPgorCisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU1QT1JUIFRPU0NBIEZJTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgPGZpbGUtdXBsb2FkIGlkPSJmaWxlVXBsb2FkRWxlbWVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctaWY9IiFpc0NyZWF0ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC1uYW1lPSJmaWxlRWxlbWVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC1kaXNhYmxlZD0ie3shaXNOZXd9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS1lbGVtZW50PSJlZGl0Rm9ybSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS1tb2RlbD0ibW9kZWwudG9zY2EiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM9Int7dG9zY2FGaWxlRXh0ZW5zaW9uc319IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogIWVkaXRGb3JtLmZpbGVFbGVtZW50LiR2YWxpZCB8fCAhbW9kZWwudG9zY2EuZmlsZW5hbWV9Ij48L2ZpbGUtdXBsb2FkPgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3ItZmlsZS11cGxvYWQiIGRhdGEtbmctc2hvdz0iIWlzQ3JlYXRlICYmICghZWRpdEZvcm0uZmlsZUVsZW1lbnQuJHZhbGlkIHx8ICFtb2RlbC50b3NjYS5maWxlbmFtZSkiPgorICAgICAgICAgICAgICAgICAgICA8IS0tIGVkaXRGb3JtLmZpbGVFbGVtZW50LiRlcnJvci5yZXF1aXJlZCA8PT0gQ2FuIG5vdCB1c2UgdGhpcywgYmVjYXVzZSB0aGUgYnJvd3NlIGlzIGRvbmUgZnJvbSBvdXRzaWRlIGZvciB0aGUgZmlyc3QgdGltZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iIW1vZGVsLnRvc2NhLmZpbGVuYW1lICYmICFlZGl0Rm9ybS5maWxlRWxlbWVudC4kZXJyb3IuZW1wdHlGaWxlIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1RPU0NBX0ZJTEVfUkVRVUlSRUQiPjwvc3Bhbj48IS0tIFJlcXVpcmVkIC0tPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5maWxlRWxlbWVudC4kZXJyb3IuZW1wdHlGaWxlIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfRU1QVFlfRklMRSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5maWxlRWxlbWVudC4kZXJyb3IuZmlsZXR5cGUiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfVkFMSURfVE9TQ0FfRVhURU5TSU9OUyIgdHJhbnNsYXRlLXZhbHVlcz0ieydleHRlbnNpb25zJzogJ3t7dG9zY2FGaWxlRXh0ZW5zaW9uc319JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU1QT1JUIFRPU0NBIEZJTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbnMtd3JhcHBlciI+CisKKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW4iPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IHZhbGlkYXRlRmllbGQoZWRpdEZvcm0uY29tcG9uZW50TmFtZSl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+TmFtZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29tcG9uZW50TmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9ImlzTmV3ICYmIHZhbGlkYXRlTmFtZSh0cnVlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0idmFsaWRhdGVOYW1lKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9Int7Y29tcG9uZW50LmlzUHJvZHVjdCgpPycyNSc6JzUwJ319IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0ie3tjb21wb25lbnQuaXNQcm9kdWN0KCk/JzI1JzonNTAnfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1taW5sZW5ndGg9Int7Y29tcG9uZW50LmlzUHJvZHVjdCgpPyc0JzonMCd9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5sZW5ndGg9Int7Y29tcG9uZW50LmlzUHJvZHVjdCgpPyc0JzonMCd9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJtb2RlbC5uYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJ2YWxpZGF0aW9uLnZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9Im1vZGVsLmlzQWxyZWFkeUNlcnRpZmllZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0uY29tcG9uZW50TmFtZSkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNvbXBvbmVudE5hbWUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1JFU09VUkNFX05BTUVfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb21wb25lbnROYW1lLiRlcnJvci5tYXhsZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21heCc6ICc1MCcgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNvbXBvbmVudE5hbWUuJGVycm9yLm1pbmxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01JTl9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWluJzogJzQnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb21wb25lbnROYW1lLiRlcnJvci5uYW1lRXhpc3QiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfTkFNRV9FWElTVFMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb21wb25lbnROYW1lLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOQU1FIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZVTEwgTkFNRSAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1pZj0iY29tcG9uZW50LmlzUHJvZHVjdCgpIiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogdmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5mdWxsTmFtZSl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+RnVsbCBOYW1lPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJmdWxsTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0idmFsaWRhdGVOYW1lKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjEwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjEwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1pbmxlbmd0aD0iNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5sZW5ndGg9IjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0ibW9kZWwuZnVsbE5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiA1MDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49InZhbGlkYXRpb24udmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZnVsbE5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0idmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5mdWxsTmFtZSkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmZ1bGxOYW1lLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9SRVNPVVJDRV9OQU1FX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uZnVsbE5hbWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzUwJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uZnVsbE5hbWUuJGVycm9yLm1pbmxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01JTl9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWluJzogJzQnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5mdWxsTmFtZS4kZXJyb3IubmFtZUV4aXN0IiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX05BTUVfRVhJU1RTIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uZnVsbE5hbWUuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gREVTQ1JJUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogdmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5kZXNjcmlwdGlvbil9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+RGVzY3JpcHRpb248L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJpLXNkYy1mb3JtLXRleHRhcmVhIGRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIxMDI0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJtb2RlbC5kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi5jb21tZW50VmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIxMDI0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlc2NyaXB0aW9uIj48L3RleHRhcmVhPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBwbGFjZWhvbGRlcj0iRGVzY3JpcHRpb24gaGVyZS4uLiIgLS0+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0uZGVzY3JpcHRpb24pIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfUkVTT1VSQ0VfREVTQ1JJUFRJT05fUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMTAyNCcgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmRlc2NyaXB0aW9uLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVNDUklQVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDQVRFR09SSUVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IHZhbGlkYXRlRmllbGQoZWRpdEZvcm0uY2F0ZWdvcnkpfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWlmPSJjYXRlZ29yaWVzICYmIGNhdGVnb3JpZXMubGVuZ3RoICYmICFjb21wb25lbnQuaXNQcm9kdWN0KCkiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5DYXRlZ29yeTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjYXRlZ29yeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9InNldEljb25Ub0RlZmF1bHQoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0ibW9kZWwuaXNBbHJlYWR5Q2VydGlmaWVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJtb2RlbC5jYXRlZ29yeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ic2VsZWN0R2VuZXJhbENhdGVnb3J5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPlNlbGVjdCBjYXRlZ29yeTwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBuZy1pZj0iY29tcG9uZW50LmlzUmVzb3VyY2UoKSIgZGF0YS1uZy1yZXBlYXQ9Im1haW5DYXRlZ29yeSBpbiBjYXRlZ29yaWVzICB8IG9yZGVyQnk6WyduYW1lJ10iIGxhYmVsPSJ7e21haW5DYXRlZ29yeS5uYW1lfX0iIGRhdGEtdGVzdHMtaWQ9Int7bWFpbkNhdGVnb3J5Lm5hbWV9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1uZy1yZXBlYXQ9InN1YkNhdGVnb3J5IGluIG1haW5DYXRlZ29yeS5zdWJjYXRlZ29yaWVzIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXNlbGVjdGVkPSJtb2RlbC5jYXRlZ29yeT09PWNhbGN1bGF0ZVVuaXF1ZShtYWluQ2F0ZWdvcnkubmFtZSxzdWJDYXRlZ29yeS5uYW1lKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ7e3N1YkNhdGVnb3J5Lm5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ie3tjYWxjdWxhdGVVbmlxdWUobWFpbkNhdGVnb3J5Lm5hbWUsc3ViQ2F0ZWdvcnkubmFtZSl9fSI+e3tzdWJDYXRlZ29yeS5uYW1lfX0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gbmctaWY9ImNvbXBvbmVudC5pc1NlcnZpY2UoKSIgZGF0YS1uZy1yZXBlYXQ9Im1haW5DYXRlZ29yeSBpbiBjYXRlZ29yaWVzIHwgb3JkZXJCeTpbJ25hbWUnXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctc2VsZWN0ZWQ9Im1vZGVsLmNhdGVnb3J5PT09bWFpbkNhdGVnb3J5Lm5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ie3ttYWluQ2F0ZWdvcnkubmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3ttYWluQ2F0ZWdvcnkubmFtZX19Ij57e21haW5DYXRlZ29yeS5uYW1lfX08L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJ2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLmNhdGVnb3J5KSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uY2F0ZWdvcnkuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX0NBVEVHT1JZX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENBVEVHT1JJRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkVORE9SIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctaWY9ImNvbXBvbmVudC5pc1Jlc291cmNlKCkiIGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLnZlbmRvck5hbWUpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPlZlbmRvcjwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0ibW9kZWwudmVuZG9yTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xpY2s9Im9sZFZhbHVlID0gbW9kZWwudmVuZG9yTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ2ZW5kb3JOYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJvblZlbmRvck5hbWVDaGFuZ2Uob2xkVmFsdWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi52ZW5kb3JWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9Im1vZGVsLmlzQWxyZWFkeUNlcnRpZmllZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ2ZW5kb3JOYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0udmVuZG9yTmFtZSkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLnZlbmRvck5hbWUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1ZFTkRPUl9OQU1FX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0udmVuZG9yTmFtZS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjUnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS52ZW5kb3JOYW1lLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkVORE9SIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkVORE9SIFJFTEVBU0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctaWY9ImNvbXBvbmVudC5pc1Jlc291cmNlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLnZlbmRvclJlbGVhc2UpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPlZlbmRvciBSZWxlYXNlPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJtb2RlbC52ZW5kb3JSZWxlYXNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjI1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ2ZW5kb3JSZWxlYXNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi52ZW5kb3JWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjI1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InZlbmRvclJlbGVhc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0idmFsaWRhdGVGaWVsZChlZGl0Rm9ybS52ZW5kb3JSZWxlYXNlKSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0udmVuZG9yUmVsZWFzZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfVkVORE9SX1JFTEVBU0VfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS52ZW5kb3JSZWxlYXNlLiRlcnJvci5tYXhsZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21heCc6ICcxMjgnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS52ZW5kb3JSZWxlYXNlLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWRU5ET1IgUkVMRUFTRSAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworCisKKyAgICAgICAgICAgICAgICA8L2Rpdj48IS0tIENsb3NlIHctc2RjLWZvcm0tY29sdW1uIC0tPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tY29sdW1uIj4KKworICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRVNPVVJDRSBUQUdTIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLnRhZ3MpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiPlRhZ3M8L2xhYmVsPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhZ3MgZm9ybS1lbGVtZW50PSJlZGl0Rm9ybSIgZWxlbWVudC1uYW1lPSJ0YWdzIiBtYXgtdGFncz0iMjAiIGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0tdGFncyIgdGFncz0ibW9kZWwudGFncyIgcGF0dGVybj0idmFsaWRhdGlvbi50YWdWYWxpZGF0aW9uUGF0dGVybiIgc3BlY2lhbC10YWc9Im1vZGVsLm5hbWUiPjwvc2RjLXRhZ3M+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0udGFncykiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLnRhZ3MuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJFU09VUkNFIFRBR1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09OVEFDVCBJRCAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogdmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5jb250YWN0SWQpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9DT05UQUNUX0lEIj48L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IGRpc2FibGVkIiB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9Im1vZGVsLnVzZXJJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29udGFjdElkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi5jb250YWN0SWRWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InVzZXJJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjUwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0uY29udGFjdElkKSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uY29udGFjdElkLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9DT05UQUNUX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uY29udGFjdElkLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX0NPTlRBQ1RfTk9UX1ZBTElEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTlRBQ1QgSUQgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJPSkVDVCBDT0RFIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iICBkYXRhLW5nLWlmPSIhY29tcG9uZW50LmlzUmVzb3VyY2UoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogdmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5wcm9qZWN0Q29kZSl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1BST0pFQ1RfQ09ERSI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJtb2RlbC5wcm9qZWN0Q29kZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIxMjgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb2plY3RDb2RlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi5wcm9qZWN0Q29kZVZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iNTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0icHJvamVjdENvZGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0idmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5wcm9qZWN0Q29kZSkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLnByb2plY3RDb2RlLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9QUk9KRUNUX0NPREVfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5wcm9qZWN0Q29kZS4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9QUk9KRUNUX0NPREVfTk9UX1ZBTElEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZFTkRPUiBSRUxFQVNFIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+PCEtLSBDbG9zZSB3LXNkYy1mb3JtLWNvbHVtbiAtLT4KKworICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gQ2xvc2Ugdy1zZGMtZm9ybS1jb2x1bW4gLS0+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLW1lc3NhZ2VzLXdyYXBwZXIiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtZm9ybS1tZXNzYWdlcy1tc2ciIGRhdGEtbmctc2hvdz0iaXNTYXZlZCI+PHNwYW4gY2xhc3M9Inctc2RjLWZvcm0tbWVzc2FnZXMtbXNnLXYiPjwvc3Bhbj5Zb3VyIHJlc291cmNlIGhhcyBiZWVuIHNhdmVkPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8L2Rpdj48IS0tIENsb3NlIHctc2RjLWZvcm0tc2VjdGlvbi1jb250YWluZXIgLS0+CisKKyAgICAgICAgPC9mb3JtPgorCisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDA5OTdhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvZ2VuZXJhbC1zdGVwL2dlbmVyYWwtc3RlcC5sZXNzCkBAIC0wLDAgKzEsMzQgQEAKKy5zZGMtd2l6YXJkLWdlbmVyYWwtc3RlcCB7CisKKyAgICAudy1zZGMtZm9ybSB7CisgICAgICAgIHBhZGRpbmc6IDA7CisKKyAgICAgICAgLnctc2RjLWZvcm0tc2VjdGlvbi1jb250YWluZXIgeworICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICB9CisKKyAgICAgICAgLmktc2RjLWZvcm0taXRlbSB7CisgICAgICAgICAgICAmLnVwbG9hZCB7CisgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMDsKKyAgICAgICAgICAgICAgICB3aWR0aDogYXV0bzsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiAxMHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLnRlbXBsYXRlLWRlc2MgeworICAgICAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkIEBib3JkZXJfY29sb3JfZjsKKyAgICAgICAgICAgIGhlaWdodDogMTMwcHg7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgcGFkZGluZzogMTBweCA2cHggNnB4IDZweDsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CisgICAgICAgIH0KKworICAgICAgICAuc2RjLXRhZyAudGFnIHsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjI1cHg7CisgICAgICAgIH0KKworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9nZW5lcmFsLXN0ZXAvZ2VuZXJhbC1zdGVwLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9nZW5lcmFsLXN0ZXAvZ2VuZXJhbC1zdGVwLnRzCkBAIC0wLDAgKzEsMzgxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzLldpemFyZCB7CisgICAgaW1wb3J0IElTdWJDYXRlZ29yeSA9IFNkYy5Nb2RlbHMuSVN1YkNhdGVnb3J5OworICAgIGltcG9ydCBJTWFpbkNhdGVnb3J5ID0gU2RjLk1vZGVscy5JTWFpbkNhdGVnb3J5OworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIC8qCisgICAgKiBUT0RPOiBUaGUgdGVtcGxhdGUgKGRlcml2ZWQgZnJvbSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUpLgorICAgICogTmVlZCB0byBkZWxldGUgaXQgZnJvbSBhbGwgcmVtYXJrcy4KKyAgICAqICovCisKKyAgICBleHBvcnQgY2xhc3MgVUlNb2RlbCB7CisgICAgICAgIHRvc2NhOlNkYy5EaXJlY3RpdmVzLkZpbGVVcGxvYWRNb2RlbDsKKyAgICAgICAgbmFtZTpzdHJpbmc7CisgICAgICAgIGRlc2NyaXB0aW9uOnN0cmluZzsKKyAgICAgICAgdmVuZG9yTmFtZTpzdHJpbmc7CisgICAgICAgIHZlbmRvclJlbGVhc2U6c3RyaW5nOworICAgICAgICBjYXRlZ29yeTpzdHJpbmc7CisgICAgICAgIHRhZ3M6QXJyYXk8c3RyaW5nPjsKKyAgICAgICAgdXNlcklkOnN0cmluZzsKKyAgICAgICAgaWNvbjpzdHJpbmc7CisgICAgICAgIHByb2plY3RDb2RlOnN0cmluZzsKKyAgICAgICAgZnVsbE5hbWU6c3RyaW5nOworICAgICAgICBpc0FscmVhZHlDZXJ0aWZpZWQ6Ym9vbGVhbjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgVmFsaWRhdGlvbiB7CisgICAgICAgIHZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGNvbnRhY3RJZFZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIHRhZ1ZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIHZlbmRvclZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBwcm9qZWN0Q29kZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJR2VuZXJhbFN0ZXBTY29wZSBleHRlbmRzIElXaXphcmRDcmVhdGlvblN0ZXBTY29wZSB7CisgICAgICAgIG1vZGVsOlVJTW9kZWw7CisgICAgICAgIHZhbGlkYXRpb246VmFsaWRhdGlvbjsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgY2F0ZWdvcmllczogQXJyYXk8SU1haW5DYXRlZ29yeT47CisgICAgICAgIGxhdGVzdENvbXBvbmVudE5hbWU6c3RyaW5nOworICAgICAgICBsYXRlc3RDYXRlZ29yeUlkOiBzdHJpbmc7CisgICAgICAgIGxhdGVzdFZlbmRvck5hbWU6IHN0cmluZzsKKyAgICAgICAgaXNOZXc6Ym9vbGVhbjsKKyAgICAgICAgdG9zY2FGaWxlRXh0ZW5zaW9uczphbnk7CisgICAgICAgIGlzQ3JlYXRlOmJvb2xlYW47CisKKyAgICAgICAgb25Ub3NjYUZpbGVDaGFuZ2UoKTp2b2lkCisgICAgICAgIHZhbGlkYXRlRmllbGQoZmllbGQ6YW55KTpib29sZWFuOworICAgICAgICB2YWxpZGF0ZU5hbWUoaXNJbml0OmJvb2xlYW4pOiB2b2lkOworICAgICAgICBjYWxjdWxhdGVVbmlxdWUobWFpbkNhdGVnb3J5OnN0cmluZywgc3ViQ2F0ZWdvcnk6c3RyaW5nKTpzdHJpbmc7IC8vIEJ1aWxkIHVuaXF1ZSBzdHJpbmcgZnJvbSBtYWluIGFuZCBzdWIgY2F0ZWdvcnkKKyAgICAgICAgY2FsY3VsYXRlZFRhZ3NNYXhMZW5ndGgoKTpudW1iZXI7CisgICAgICAgIHNldEljb25Ub0RlZmF1bHQoKTp2b2lkOworICAgICAgICBvblZlbmRvck5hbWVDaGFuZ2Uob2xkVmVuZG9yTmFtZTogc3RyaW5nKTogdm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgR2VuZXJhbFN0ZXBWaWV3TW9kZWwgaW1wbGVtZW50cyBJV2l6YXJkQ3JlYXRpb25TdGVwIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ0NvbnRhY3RJZFZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdUYWdWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnVmVuZG9yVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ0NvbW1lbnRWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnVmFsaWRhdGlvblV0aWxzJywKKyAgICAgICAgICAgICdzZGNDb25maWcnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEZhY3RvcnknLAorICAgICAgICAgICAgJ1Byb2plY3RDb2RlVmFsaWRhdGlvblBhdHRlcm4nCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUdlbmVyYWxTdGVwU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29udGFjdElkVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFRhZ1ZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBWZW5kb3JWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblV0aWxzOiBTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tcG9uZW50RmFjdG9yeTogU2RjLlV0aWxzLkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgUHJvamVjdENvZGVWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAKKyAgICAgICAgICAgICkgeworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5yZWdpc3RlckNoaWxkKHRoaXMpOworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGVWYWxpZGF0aW9uKCk7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZU1ldGhvZHMoKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0NyZWF0ZSA9IHRoaXMuJHNjb3BlLmRhdGEuaW1wb3J0RmlsZSA9PT0gdW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGVWYWxpZGF0aW9uID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGlvbiA9IG5ldyBWYWxpZGF0aW9uKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0aW9uLnZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5WYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb24uY29udGFjdElkVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLkNvbnRhY3RJZFZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGlvbi50YWdWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuVGFnVmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0aW9uLnZlbmRvclZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5WZW5kb3JWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb24uY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Db21tZW50VmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0aW9uLnByb2plY3RDb2RlVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLlByb2plY3RDb2RlVmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgLy8gSW5pdCBVSU1vZGVsCisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RlbCA9IG5ldyBVSU1vZGVsKCk7CisKKyAgICAgICAgICAgIC8vIEluaXQgY2F0ZWdvcmllcworICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuZGF0YS5jb21wb25lbnRUeXBlID09PSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRSl7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2F0ZWdvcmllcyA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgncmVzb3VyY2VDYXRlZ29yaWVzJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuZGF0YS5jb21wb25lbnRUeXBlID09PSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFKSB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2F0ZWdvcmllcyA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnc2VydmljZUNhdGVnb3JpZXMnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kZWwuY2F0ZWdvcnk9Jyc7CisKKyAgICAgICAgICAgIC8vaW5pdCBmaWxlIGV4dGVuc3Rpb25zCisgICAgICAgICAgICB0aGlzLiRzY29wZS50b3NjYUZpbGVFeHRlbnNpb25zID0gdGhpcy5zZGNDb25maWcudG9zY2FGaWxlRXh0ZW5zaW9uOworCisgICAgICAgICAgICAvLyBJbml0IFRvc2NhIGltcG9ydCBmaWxlCisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuZGF0YS5pbXBvcnRGaWxlKSB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kZWwudG9zY2EgPSB0aGlzLiRzY29wZS5kYXRhLmltcG9ydEZpbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENhc2UgaW5zZXJ0IG9yIHVwZGF0ZQorICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50ID0gdGhpcy4kc2NvcGUuZ2V0Q29tcG9uZW50KCk7CisgICAgICAgICAgICBpZiAoIHRoaXMuJHNjb3BlLmNvbXBvbmVudCE9PXVuZGVmaW5lZCl7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG1vZGUKKworICAgICAgICAgICAgICAgIC8vdGhpcy4kc2NvcGUubGF0ZXN0Q2F0ZWdvcnlJZCA9IHRoaXMuJHNjb3BlLmNvbXBvbmVudFswXS51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmxhdGVzdFZlbmRvck5hbWUgPSB0aGlzLiRzY29wZS5jb21wb25lbnQudmVuZG9yTmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5sYXRlc3RDb21wb25lbnROYW1lID0gdGhpcy4kc2NvcGUuY29tcG9uZW50Lm5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNOZXc9ZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZTJNb2RlbFVpKHRoaXMuJHNjb3BlLmNvbXBvbmVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBtb2RlCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNOZXc9dHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RlbC50YWdzPVtdOyAvLyBJbml0IHRhZ3MKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RlbC51c2VySWQgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoInVzZXIiKS51c2VySWQ7IC8vIEZpbGwgdXNlciBJRCBmcm9tIGxvZ2dlZCBpbiB1c2VyCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kZWwuaWNvbiA9IFV0aWxzLkNvbnN0YW50cy5ERUZBVUxUX0lDT047IC8vIFNldCB0aGUgZGVmYXVsdCBpY29uCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50ID0gIHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVFbXB0eUNvbXBvbmVudCh0aGlzLiRzY29wZS5kYXRhLmNvbXBvbmVudFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlTWV0aG9kcyA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0ZUZpZWxkID0gKGZpZWxkOmFueSk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLiRkaXJ0eSAmJiBmaWVsZC4kaW52YWxpZCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0ZU5hbWUgPSAoaXNJbml0OmJvb2xlYW4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChpc0luaXQ9PT11bmRlZmluZWQpe2lzSW5pdD1mYWxzZTt9CisKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuJHNjb3BlLm1vZGVsLm5hbWU7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lIHx8IG5hbWU9PT0iIil7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5lZGl0Rm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy4kc2NvcGUuZWRpdEZvcm1bImNvbXBvbmVudE5hbWUiXQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy4kc2NvcGUuZWRpdEZvcm1bImNvbXBvbmVudE5hbWUiXS4kZXJyb3IpeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgZXJyb3IgbmFtZSBhbHJlYWR5IGV4aXN0cworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEZvcm1bImNvbXBvbmVudE5hbWUiXS4kc2V0VmFsaWRpdHkoJ25hbWVFeGlzdCcsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZXQgc3VidHlwZTpzdHJpbmcgPSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRSA9PSB0aGlzLiRzY29wZS5kYXRhLmNvbXBvbmVudFR5cGU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGF0YS5pbXBvcnRGaWxlPyAnVkZDJzonVkYnIDogdW5kZWZpbmVkOworCisgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKHJlc3BvbnNlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5pbmZvKCdvbkZhaWxkJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHZhbGlkYXRpb246TW9kZWxzLklWYWxpZGF0ZSkgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0Rm9ybVsiY29tcG9uZW50TmFtZSJdLiRzZXRWYWxpZGl0eSgnbmFtZUV4aXN0JywgdmFsaWRhdGlvbi5pc1ZhbGlkKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgaWYgKGlzSW5pdCl7CisgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gcGFnZSBpcyBpbml0IGFmdGVyIHVwZGF0ZQorICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUubW9kZWwubmFtZSAhPT0gdGhpcy4kc2NvcGUubGF0ZXN0Q29tcG9uZW50TmFtZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUHJvZHVjdCgpKSB7Ly9UT0RPIHJlbW92ZSB3aGVuIGJhY2tlbmQgaXMgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudmFsaWRhdGVOYW1lKG5hbWUsIHN1YnR5cGUpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZGF0aW5nIG9uIGNoYW5nZSAoaGFzIGRlYm91bmNlKQorICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuZWRpdEZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuJHNjb3BlLmVkaXRGb3JtWyJjb21wb25lbnROYW1lIl0KKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuJHNjb3BlLmVkaXRGb3JtWyJjb21wb25lbnROYW1lIl0uJGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdGhpcy4kc2NvcGUuZWRpdEZvcm1bImNvbXBvbmVudE5hbWUiXS4kZXJyb3IucGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy4kc2NvcGUubW9kZWwubmFtZSAhPT0gdGhpcy4kc2NvcGUubGF0ZXN0Q29tcG9uZW50TmFtZQorICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLiRzY29wZS5jb21wb25lbnQuaXNQcm9kdWN0KCkpIHsgLy9UT0RPIHJlbW92ZSB3aGVuIGJhY2tlbmQgaXMgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudmFsaWRhdGVOYW1lKG5hbWUsIHN1YnR5cGUpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy4kc2NvcGUubW9kZWwubmFtZSA9PT0gdGhpcy4kc2NvcGUubGF0ZXN0Q29tcG9uZW50TmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0Rm9ybVsiY29tcG9uZW50TmFtZSJdLiRzZXRWYWxpZGl0eSgnbmFtZUV4aXN0JywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jYWxjdWxhdGVVbmlxdWUgPSAobWFpbkNhdGVnb3J5OnN0cmluZywgc3ViQ2F0ZWdvcnk6c3RyaW5nKTpzdHJpbmcgPT4geworICAgICAgICAgICAgICAgIGxldCB1bmlxdWVJZDogc3RyaW5nID0gbWFpbkNhdGVnb3J5OworICAgICAgICAgICAgICAgIGlmKHN1YkNhdGVnb3J5KSB7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkICs9ICJfI18iICsgc3ViQ2F0ZWdvcnk7IC8vIFNldCB0aGUgc2VsZWN0IGNhdGVnb3J5IGNvbWJvYm94IHRvIHNob3cgdGhlIHNlbGVjdGVkIGNhdGVnb3J5LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIHBhcmVudCBpZiB0aGlzIHN0ZXAgdmFsaWQgb3Igbm90LgorICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHdhdGNoKCJlZGl0Rm9ybS4kdmFsaWQiLCAobmV3VmFsLCBvbGRWYWwpID0+IHsKKyAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJlZGl0Rm9ybSB2YWxpZGF0aW9uOiAiICsgbmV3VmFsKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKG5ld1ZhbCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0SWNvblRvRGVmYXVsdCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGVsLmljb24gPSBVdGlscy5Db25zdGFudHMuREVGQVVMVF9JQ09OOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25WZW5kb3JOYW1lQ2hhbmdlID0gKG9sZFZlbmRvck5hbWU6IHN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuY29tcG9uZW50Lmljb24gPT09IG9sZFZlbmRvck5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0SWNvblRvRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHNhdmUgPSAoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy5tb2RlbFVpMlJlc291cmNlKCk7CisKKyAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChyZXNwb25zZSkgPT4geworICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRDb21wb25lbnQodGhpcy4kc2NvcGUuY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5sYXRlc3RDb21wb25lbnROYW1lID0gKGNvbXBvbmVudC5uYW1lKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy9TZW5kIHRoZSBmb3JtIHdpdGggYXR0YWNoZWQgdG9zY2EgZmlsZS4KKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuaXNOZXc9PT10cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVDb21wb25lbnRPblNlcnZlcih0aGlzLiRzY29wZS5jb21wb25lbnQpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LnVwZGF0ZUNvbXBvbmVudCgpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWNhdGNoKGUpeworICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIkVSUk9SOiBFcnJvciBpbiB1cGRhdGluZy9jcmVhdGluZyBjb21wb25lbnQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgYmFjayA9IChjYWxsYmFjazpGdW5jdGlvbik6dm9pZCA9PiB7CisgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgdGhlIHJlc291cmNlIHByb3BlcnRpZXMgb2JqZWN0IHdpdGggZGF0YSBmcm9tIFVJTW9kZWwKKyAgICAgICAgcHJpdmF0ZSBtb2RlbFVpMlJlc291cmNlID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5uYW1lID0gdGhpcy4kc2NvcGUubW9kZWwubmFtZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZXNjcmlwdGlvbiA9IHRoaXMuVmFsaWRhdGlvblV0aWxzLnN0cmlwQW5kU2FuaXRpemUodGhpcy4kc2NvcGUubW9kZWwuZGVzY3JpcHRpb24pOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LnZlbmRvck5hbWUgPSB0aGlzLiRzY29wZS5tb2RlbC52ZW5kb3JOYW1lOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LnZlbmRvclJlbGVhc2UgPSB0aGlzLiRzY29wZS5tb2RlbC52ZW5kb3JSZWxlYXNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LnRhZ3MgPSBhbmd1bGFyLmNvcHkodGhpcy4kc2NvcGUubW9kZWwudGFncyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudGFncy5wdXNoKHRoaXMuJHNjb3BlLm1vZGVsLm5hbWUpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmNvbnRhY3RJZCA9IHRoaXMuJHNjb3BlLm1vZGVsLnVzZXJJZDsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pY29uID0gdGhpcy4kc2NvcGUubW9kZWwuaWNvbjsKKworICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSkgeworICAgICAgICAgICAgICAgICg8TW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5yZXNvdXJjZVR5cGUgPSAiVkYiOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSB0b3NjYSBmaWxlCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLm1vZGVsLnRvc2NhICYmIHRoaXMuJHNjb3BlLmlzTmV3KSAgeworICAgICAgICAgICAgICAgICAgICAoPE1vZGVscy5Db21wb25lbnRzLlJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkucGF5bG9hZERhdGEgPSB0aGlzLiRzY29wZS5tb2RlbC50b3NjYS5iYXNlNjQ7CisgICAgICAgICAgICAgICAgICAgICg8TW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5wYXlsb2FkTmFtZSA9IHRoaXMuJHNjb3BlLm1vZGVsLnRvc2NhLmZpbGVuYW1lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jYXRlZ29yaWVzID0gdGhpcy5jb252ZXJ0Q2F0ZWdvcnlTdHJpbmdUb09uZUFycmF5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Byb2R1Y3QoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5wcm9qZWN0Q29kZSA9IHRoaXMuJHNjb3BlLm1vZGVsLnByb2plY3RDb2RlOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgdG9zY2EgZmlsZQorICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jYXRlZ29yaWVzID0gdW5kZWZpbmVkOworICAgICAgICAgICAgICAgICg8TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdD50aGlzLiRzY29wZS5jb21wb25lbnQpLmNvbnRhY3RzID0gbmV3IEFycmF5PHN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAoPE1vZGVscy5Db21wb25lbnRzLlByb2R1Y3Q+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5jb250YWN0cy5wdXNoKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jb250YWN0SWQpOworICAgICAgICAgICAgICAgICg8TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdD50aGlzLiRzY29wZS5jb21wb25lbnQpLmZ1bGxOYW1lID0gdGhpcy4kc2NvcGUubW9kZWwuZnVsbE5hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1NlcnZpY2UoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5wcm9qZWN0Q29kZSA9IHRoaXMuJHNjb3BlLm1vZGVsLnByb2plY3RDb2RlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jYXRlZ29yaWVzID0gdGhpcy5jb252ZXJ0Q2F0ZWdvcnlTdHJpbmdUb09uZUFycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gRmlsbCB0aGUgVUlNb2RlbCBmcm9tIGRhdGEgZnJvbSByZXNvdXJjZSBwcm9wZXJ0aWVzCisgICAgICAgIHByaXZhdGUgcmVzb3VyY2UyTW9kZWxVaSA9IChjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RlbC5uYW1lID0gY29tcG9uZW50Lm5hbWU7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RlbC5kZXNjcmlwdGlvbiA9IGNvbXBvbmVudC5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGVsLnZlbmRvck5hbWUgPSBjb21wb25lbnQudmVuZG9yTmFtZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGVsLnZlbmRvclJlbGVhc2UgPSBjb21wb25lbnQudmVuZG9yUmVsZWFzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGVsLnRhZ3MgPSBfLnJlamVjdChjb21wb25lbnQudGFncywgKGl0ZW0pPT57cmV0dXJuIGl0ZW09PT1jb21wb25lbnQubmFtZX0pOworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kZWwudXNlcklkID0gY29tcG9uZW50LmNvbnRhY3RJZDsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGVsLmljb24gPSBjb21wb25lbnQuaWNvbjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGVsLnByb2plY3RDb2RlID0gY29tcG9uZW50LnByb2plY3RDb2RlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kZWwuaXNBbHJlYWR5Q2VydGlmaWVkID0gY29tcG9uZW50LmlzQWxyZWFkeUNlcnRpZmllZCgpOworCisgICAgICAgICAgICBpZighdGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUHJvZHVjdCgpKSB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kZWwuY2F0ZWdvcnkgPSB0aGlzLmNvbnZlcnRDYXRlZ29yeU9uZUFycmF5VG9TdHJpbmcoY29tcG9uZW50LmNhdGVnb3JpZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihjb21wb25lbnQuaXNQcm9kdWN0KCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RlbC5mdWxsTmFtZSA9ICg8TW9kZWxzLkNvbXBvbmVudHMuUHJvZHVjdD5jb21wb25lbnQpLmZ1bGxOYW1lOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgICAgICAvLyBDb252ZXJ0IGNhdGVnb3J5IHN0cmluZyBNYWluQ2F0ZWdvcnlfI19TdWJDYXRlZ29yeSB0byBBcnJheSB3aXRoIG9uZSBpdGVtIChsaWtlIHRoZSBzZXJ2ZXIgZXhjZXB0KQorICAgICAgICBwcml2YXRlIGNvbnZlcnRDYXRlZ29yeVN0cmluZ1RvT25lQXJyYXkgPSAoKTpBcnJheTxNb2RlbHMuSU1haW5DYXRlZ29yeT4gPT4geworICAgICAgICAgICAgbGV0IHRtcCA9IHRoaXMuJHNjb3BlLm1vZGVsLmNhdGVnb3J5LnNwbGl0KCJfI18iKTsKKyAgICAgICAgICAgIGxldCBtYWluQ2F0ZWdvcnkgPSB0bXBbMF07CisgICAgICAgICAgICBsZXQgc3ViQ2F0ZWdvcnkgPSB0bXBbMV07CisKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIGNhdGVnb3J5IGFuZCBhZGQgdGhlIHJlbGV2YW50IHN1YiBjYXRlZ29yeS4KKyAgICAgICAgICAgIGxldCBzZWxlY3RlZE1haW5DYXRlZ29yeTpJTWFpbkNhdGVnb3J5ID0gPE1vZGVscy5JTWFpbkNhdGVnb3J5Pl8uZmluZCh0aGlzLiRzY29wZS5jYXRlZ29yaWVzLCBmdW5jdGlvbiAoaXRlbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtWyJuYW1lIl0gPT09IG1haW5DYXRlZ29yeQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBsZXQgbWFpbkNhdGVnb3J5Q2xvbmUgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBzZWxlY3RlZE1haW5DYXRlZ29yeSk7CisgICAgICAgICAgICBpZihzdWJDYXRlZ29yeSkgeworICAgICAgICAgICAgICAgIG1haW5DYXRlZ29yeUNsb25lWydzdWJjYXRlZ29yaWVzJ10gPSBbeworICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHN1YkNhdGVnb3J5CisgICAgICAgICAgICAgICAgfV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXQgdG1wU2VsZWN0ZWQgPSA8TW9kZWxzLklNYWluQ2F0ZWdvcnk+IG1haW5DYXRlZ29yeUNsb25lOworCisgICAgICAgICAgICBsZXQgcmVzdWx0OkFycmF5PE1vZGVscy5JTWFpbkNhdGVnb3J5PiA9IFtdOworICAgICAgICAgICAgcmVzdWx0LnB1c2godG1wU2VsZWN0ZWQpOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgY29udmVydENhdGVnb3J5T25lQXJyYXlUb1N0cmluZyA9IChjYXRlZ29yaWVzOkFycmF5PE1vZGVscy5JTWFpbkNhdGVnb3J5Pik6c3RyaW5nID0+IHsKKyAgICAgICAgICAgIGxldCBtYWluQ2F0ZWdvcnk6c3RyaW5nID0gY2F0ZWdvcmllc1swXS5uYW1lOworICAgICAgICAgICAgbGV0IHN1YkNhdGVnb3J5OnN0cmluZyA9ICcnOworICAgICAgICAgICAgaWYoY2F0ZWdvcmllc1swXS5zdWJjYXRlZ29yaWVzKSB7CisgICAgICAgICAgICAgICAgc3ViQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXNbMF0ubmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5jYWxjdWxhdGVVbmlxdWUobWFpbkNhdGVnb3J5LCBzdWJDYXRlZ29yeSk7CisgICAgICAgIH07CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2hpZXJhcmNoeS1zdGVwL2hpZXJhcmNoeS1zdGVwLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzNlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC5odG1sCkBAIC0wLDAgKzEsNDAgQEAKKzxkaXYgY2xhc3M9ImhpZXJhcmNoeS1zdGVwIiBkYXRhLW5nLWNvbnRyb2xsZXI9IlNkYy5WaWV3TW9kZWxzLldpemFyZC5IaWVyYXJjaHlTdGVwVmlld01vZGVsIj4KKyAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1jb250YWluZXIiIGNsaWNrZWQtb3V0c2lkZT0ie29uQ2xpY2tlZE91dHNpZGU6ICdjbGlja091dHNpZGUoKScsIGNsaWNrZWRPdXRzaWRlRW5hYmxlOiAndHJ1ZSd9IiA+CisgICAgICAgIDxpbnB1dCBwbGFjZWhvbGRlcj0iQWRkIEdyb3VwIiBkYXRhLW5nLWNsaWNrPSJvbklucHV0VGV4dENsaWNrZWQoKSIgY2xhc3M9ImRyb3Bkb3duLWlucHV0LXRleHQiICBkYXRhLW5nLW1vZGVsPSJzZWFyY2guZmlsdGVyVGVybXMiICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9IntkZWJvdW5jZTogMjAwfSIvPgorICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWNsYXNzPSJ7J3Nob3cnOiBzaG93RHJvcERvd259IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgPgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9ImZhbHNlIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJjYXRlZ29yeSBpbiBjYXRlZ29yaWVzT3B0aW9ucyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9InN1YmNhdGVnb3J5IGluIGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1vcHRpb24iIG5nLXNob3c9IiFjYXRlZ29yeS5maWx0ZXJlZEdyb3VwIHx8IGNhdGVnb3J5LmZpbHRlcmVkR3JvdXAubGVuZ3RoID4gMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3J5LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3J5Ij57e2NhdGVnb3J5Lm5hbWV9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJjYXRlZ29yeSI+e3tzdWJjYXRlZ29yeS5uYW1lfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwaW5ncy1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1pbml0PSJncm91cC5maWx0ZXJUZXJtcyA9IGdyb3VwLm5hbWUgKyAnICcgKyBjYXRlZ29yeS5uYW1lICsgJyAnICsgc3ViY2F0ZWdvcnkubmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1yZXBlYXQ9Imdyb3VwIGluIChjYXRlZ29yeS5maWx0ZXJlZEdyb3VwID0gKHN1YmNhdGVnb3J5Lmdyb3VwaW5ncyAgfCBmaWx0ZXI6c2VhcmNoICkpIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAiIGRhdGEtbmctZGlzYWJsZWQ9Imdyb3VwLmlzRGlzYWJsZWQiIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQtZ3JvdXAnOiBncm91cC5pc0Rpc2FibGVkfSIgbmctY2xpY2s9Im9uR3JvdXBTZWxlY3RlZChjYXRlZ29yeSwgc3ViY2F0ZWdvcnksIGdyb3VwKSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuID57e2dyb3VwLm5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJoaWVyYXJjaHktZ3JvdXBzLWNvbnRhaW5lciI+CisgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKyAgICAgICAgICAgIDxkaXYgbmctaWY9IiFwcm9kdWN0LmNhdGVnb3JpZXMubGVuZ3RoIHx8ICBwcm9kdWN0LmNhdGVnb3JpZXMubGVuZ3RoID09PSAwIiBjbGFzcz0ibm8tZ3JvdXBzLXRleHQiIHRyYW5zbGF0ZT0iTkVXX1BST0RVQ1RfTk9fQ0FURUdPUklFU19UT19ESVNQTEFZIj48L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJjYXRlZ29yeSBpbiBwcm9kdWN0LmNhdGVnb3JpZXMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0ic3ViY2F0ZWdvcnkgaW4gY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncm91cC10YWciIG5nLXJlcGVhdD0iZ3JvdXAgaW4gc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaW5pdD0idG9vbHRpcCA9ICc8Yj4nICsgY2F0ZWdvcnkubmFtZSArICc8L2I+PGJyIC8+JyArIHN1YmNhdGVnb3J5Lm5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFnIGRhdGEtb24tZGVsZXRlPSJkZWxldGVHcm91cCh1bmlxdWVJZCkiIGRhdGEtdGFnLWRhdGE9Int0YWc6IGdyb3VwLm5hbWUsIHRvb2x0aXA6IHRvb2x0aXAsIGlkOiBncm91cC51bmlxdWVJZCB9Ij48L3NkYy10YWc+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2hpZXJhcmNoeS1zdGVwL2hpZXJhcmNoeS1zdGVwLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Nzg2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC5sZXNzCkBAIC0wLDAgKzEsMTI1IEBACisuaGllcmFyY2h5LXN0ZXAgeworICAgIG1hcmdpbi10b3A6IDM1cHg7CisKKyAgICAuc2Nyb2xsYmFyLWNvbnRhaW5lcnsKKyAgICAgICAgbWF4LWhlaWdodDo0MDBweDsKKyAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgIH0KKworICAgIC5kcm9wZG93bi1jb250YWluZXIgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisKKyAgICAgICAgJjphZnRlcnsKKyAgICAgICAgICAgIHRvcDogNDclOworICAgICAgICAgICAgcmlnaHQ6IDElOworICAgICAgICAgICAgYm9yZGVyOiBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRlbnQ6ICIgIjsKKyAgICAgICAgICAgIGhlaWdodDogMDsKKyAgICAgICAgICAgIHdpZHRoOiAwOworICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CisgICAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiBibGFjazsKKyAgICAgICAgICAgIGJvcmRlci13aWR0aDogNHB4OworICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC00cHg7CisgICAgICAgIH0KKworICAgICAgICAuZHJvcGRvd24taW5wdXQtdGV4dCB7CisgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDRweCAxMHB4OworICAgICAgICB9CisKKyAgICAgICAgLmRyb3Bkb3duLWNvbnRlbnQgeworICAgICAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CisgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICAuYmdfYzsKKyAgICAgICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OworICAgICAgICAgICAgei1pbmRleDogOTk5OTk5OworCisgICAgICAgICAgICAuZHJvcGRvd24tb3B0aW9uIHsKKyAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5jYXRlZ29yeS1jb250YWluZXJ7CisgICAgICAgICAgICAgICAgd2lkdGg6IDI1MHB4OworICAgICAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogNXB4OworCisgICAgICAgICAgICAgICAgLmNhdGVnb3J5IHsKKyAgICAgICAgICAgICAgICAgICAgLmJvbGQ7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDNweCAzcHggMnB4IDNweDsKKyAgICAgICAgICAgICAgICAgICAgJjphZnRlcnsKKyAgICAgICAgICAgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgICAgICAgICAgIC5hcnJvdy1sZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJyc7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogNXB4OworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAuc3ViY2F0ZWdvcnkgeworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5ncm91cGluZ3MtY29udGFpbmVyeworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgICAgICB3aWR0aDogNDI0cHg7CisgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZDhkOGQ4OworICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDU1cHg7CisgICAgICAgICAgICAgICAgLmdyb3VweworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAzcHggM3B4IDNweCAxMHB4OworICAgICAgICAgICAgICAgICAgICAmOmhvdmVyeworICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAuYmdfbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAmLmRpc2FibGVkLWdyb3VwIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICY6aG92ZXJ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBhdXRvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iZ19jOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuc2VwZXJhdG9yIHsKKyAgICAgICAgICAgICAgICBoZWlnaHQ6IDFweDsKKyAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgICAgICAuYmdfajsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDVweCAwcHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLnNob3cgeworICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaGllcmFyY2h5LWdyb3Vwcy1jb250YWluZXJ7CisgICAgICAgIC5iXzk7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDhkOGQ4OworICAgICAgICBoZWlnaHQ6IDQyNXB4OworICAgICAgICBwYWRkaW5nOiAxNXB4OworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisKKyAgICAgICAgLm5vLWdyb3VwLXRleHR7CisgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgICAgICBtYXJnaW4tdG9wOjI1cHg7CisgICAgICAgICAgICBhIHsKKyAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLmdyb3VwLXRhZ3sKKyAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaGllcmFyY2h5LXN0ZXAvaGllcmFyY2h5LXN0ZXAudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTc0YzBhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaGllcmFyY2h5LXN0ZXAvaGllcmFyY2h5LXN0ZXAudHMKQEAgLTAsMCArMSwxNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMuV2l6YXJkIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElIaWVyYXJjaHlTdGVwU2NvcGUgZXh0ZW5kcyBJV2l6YXJkQ3JlYXRpb25TY29wZSB7CisKKyAgICAgICAgY2F0ZWdvcmllc09wdGlvbnM6IEFycmF5PE1vZGVscy5JTWFpbkNhdGVnb3J5PjsKKyAgICAgICAgcHJvZHVjdDpNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0OworICAgICAgICBpc0xvYWRpbmc6Ym9vbGVhbjsKKyAgICAgICAgc2hvd0Ryb3BEb3duOmJvb2xlYW47CisKKyAgICAgICAgb25JbnB1dFRleHRDbGlja2VkKCk6dm9pZDsKKyAgICAgICAgb25Hcm91cFNlbGVjdGVkKGNhdGVnb3J5OiBNb2RlbHMuSU1haW5DYXRlZ29yeSwgc3ViY2F0ZWdvcnk6IE1vZGVscy5JU3ViQ2F0ZWdvcnksIGdyb3VwOiBNb2RlbHMuSUdyb3VwKTp2b2lkOworICAgICAgICBjbGlja091dHNpZGUoKTp2b2lkOworICAgICAgICBkZWxldGVHcm91cCh1bmlxdWVJZDpzdHJpbmcpOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEhpZXJhcmNoeVN0ZXBWaWV3TW9kZWwgaW1wbGVtZW50cyBJV2l6YXJkQ3JlYXRpb25TdGVwIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnQ29tcG9uZW50RmFjdG9yeScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJSGllcmFyY2h5U3RlcFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNhY2hlU2VydmljZTpTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEZhY3Rvcnk6IFNkYy5VdGlscy5Db21wb25lbnRGYWN0b3J5KSB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJlZ2lzdGVyQ2hpbGQodGhpcyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucHJvZHVjdCA9IDxNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0PnRoaXMuJHNjb3BlLmdldENvbXBvbmVudCgpOworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdENhdGVnb3JpZXMgPSAoKSA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jYXRlZ29yaWVzT3B0aW9ucyA9IGFuZ3VsYXIuY29weSh0aGlzLmNhY2hlU2VydmljZS5nZXQoJ3Byb2R1Y3RDYXRlZ29yaWVzJykpOworICAgICAgICAgICAgbGV0IHNlbGVjdGVkR3JvdXA6QXJyYXk8TW9kZWxzLklHcm91cD4gID0gW107CisgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUucHJvZHVjdC5jYXRlZ29yaWVzLCAoY2F0ZWdvcnk6IE1vZGVscy5JTWFpbkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMsIChzdWJjYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cCA9IHNlbGVjdGVkR3JvdXAuY29uY2F0KHN1YmNhdGVnb3J5Lmdyb3VwaW5ncyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLiRzY29wZS5jYXRlZ29yaWVzT3B0aW9ucywgKGNhdGVnb3J5OiBNb2RlbHMuSU1haW5DYXRlZ29yeSkgPT4geworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLCAoc3ViY2F0ZWdvcnk6TW9kZWxzLklTdWJDYXRlZ29yeSkgPT4geworICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzLCAoZ3JvdXA6TW9kZWxzLklTdWJDYXRlZ29yeSkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudEdyb3VwOk1vZGVscy5JR3JvdXAgPSBfLmZpbmQoc2VsZWN0ZWRHcm91cCwgKGNvbXBvbmVudEdyb3VwT2JqKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEdyb3VwT2JqLnVuaXF1ZUlkID09IGdyb3VwLnVuaXF1ZUlkOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjb21wb25lbnRHcm91cCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuaXNEaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzZXRGb3JtVmFsaWRhdGlvbiA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgaWYoIXRoaXMuJHNjb3BlLnByb2R1Y3QuY2F0ZWdvcmllcyB8fCB0aGlzLiRzY29wZS5wcm9kdWN0LmNhdGVnb3JpZXMubGVuZ3RoID09PSAwKXsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmc9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd0Ryb3BEb3duID1mYWxzZTsKKyAgICAgICAgICAgIHRoaXMuaW5pdENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgIHRoaXMuc2V0Rm9ybVZhbGlkYXRpb24oKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25Hcm91cFNlbGVjdGVkID0gKGNhdGVnb3J5OiBNb2RlbHMuSU1haW5DYXRlZ29yeSwgc3ViY2F0ZWdvcnk6IE1vZGVscy5JU3ViQ2F0ZWdvcnksIGdyb3VwOiBNb2RlbHMuSUdyb3VwKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zaG93RHJvcERvd24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9kdWN0LmFkZEdyb3VwKGNhdGVnb3J5LCBzdWJjYXRlZ29yeSwgZ3JvdXApOworICAgICAgICAgICAgICAgIGdyb3VwLmlzRGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uSW5wdXRUZXh0Q2xpY2tlZCA9ICgpOnZvaWQgPT4gey8vanVzdCBlZGl0IHRoZSBjb21wb25lbnQgaW4gcGxhY2UsIG5vIHBvcCB1cCBub3Igc2VydmVyIHVwZGF0ZSA/CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd0Ryb3BEb3duID0gIXRoaXMuJHNjb3BlLnNob3dEcm9wRG93bjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNsaWNrT3V0c2lkZSA9ICgpOiBhbnkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNob3dEcm9wRG93biA9IGZhbHNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGVsZXRlR3JvdXAgPSAodW5pcXVlSWQ6c3RyaW5nKSA6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vZGVsZXRlIGdyb3VwIGZyb20gY29tcG9uZW50CisgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9kdWN0LmRlbGV0ZUdyb3VwKHVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgICAgICAvL2VuYWJsZWQgZ3JvdXAKKyAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuY2F0ZWdvcmllc09wdGlvbnMsIChjYXRlZ29yeTogTW9kZWxzLklNYWluQ2F0ZWdvcnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMsIChzdWJjYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBPYmo6TW9kZWxzLklHcm91cCA9IF8uZmluZCAoc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzLCAoZ3JvdXApID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAudW5pcXVlSWQgPT09IHVuaXF1ZUlkOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihncm91cE9iail7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBPYmouaXNEaXNhYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgc2F2ZSA9IChjYWxsYmFjazpGdW5jdGlvbik6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAocmVzcG9uc2UpID0+IHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUucHJvZHVjdCA9IDxNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0PiB0aGlzLkNvbXBvbmVudEZhY3RvcnkuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50KHRoaXMuJHNjb3BlLnByb2R1Y3QpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9kdWN0LnVwZGF0ZUNvbXBvbmVudCgpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICB9Y2F0Y2goZSl7CisgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiRVJST1I6IEVycm9yIGluIHVwZGF0aW5nL2NyZWF0aW5nIGNvbXBvbmVudDogIiArIGUpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgYmFjayA9IChjYWxsYmFjazpGdW5jdGlvbik6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLnNhdmUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaWNvbnMtc3RlcC9pY29ucy1zdGVwLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9pY29ucy1zdGVwL2ljb25zLXN0ZXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWUzODYyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaWNvbnMtc3RlcC9pY29ucy1zdGVwLmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPGRpdiBjbGFzcz0iaWNvbnMtc3RlcCIgZGF0YS1uZy1jb250cm9sbGVyPSJTZGMuVmlld01vZGVscy5XaXphcmQuSWNvbnNTdGVwVmlld01vZGVsIj4KKworICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9Inctc2RjLWZvcm0iIG5hbWU9Imljb25Gb3JtIj4KKyAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIGljb25zLWxhYmVsIHJlcXVpcmVkIj5JY29uczwvbGFiZWw+CisgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdGVkLWljb24tY29udGFpbmVyIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbS1zdWdnZXN0ZWQtaWNvbiBtZWRpdW0gc2VsZWN0ZWQtaWNvbiB7e2ljb25TcHJpdGV9fSB7e2NvbXBvbmVudC5pY29ufX0iCisgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJjb21wb25lbnQuaWNvbiIKKyAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSd7e2NvbXBvbmVudC5pY29uIHwgdHJhbnNsYXRlfX0nCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCBpY29ucy1sYWJlbCByZXF1aXJlZCI+U2VsZWN0IG9uZSBvZiB0aGUgaWNvbnMgYmVsb3cgZm9yIHRoZSBhc3NldDwvbGFiZWw+CisgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSBzdWdnZXN0ZWQtaWNvbnMtY29udGFpbmVyIj4KKyAgICAgICAgICA8ZGl2IGNsYXNzID0ic3VnZ2VzdGVkLWljb24td3JhcHBlciIgbmctY2xhc3M9ImNvbXBvbmVudC5pY29uPT09J3t7aWNvblNyY319JyA/ICdzZWxlY3RlZCcgOiAnJyAiICBkYXRhLW5nLXJlcGVhdD0iaWNvblNyYyBpbiBpY29ucyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0tc3VnZ2VzdGVkLWljb24gIG1lZGl1bSB7e2ljb25TcHJpdGV9fSB7e2ljb25TcmN9fSIgZGF0YS1uZy1jbGFzcz0iY29tcG9uZW50LmlzQWxyZWFkeUNlcnRpZmllZCgpPyAnZGlzYWJsZSc6J2hhbmQnIgorICAgICAgICAgICAgICAgICBuZy1tb2RlbD0iY29tcG9uZW50Lmljb24iCisgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7aWNvblNyY319IGljb25Cb3giCisgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9IiFjb21wb25lbnQuaXNBbHJlYWR5Q2VydGlmaWVkKCkgJiYgc2V0Q29tcG9uZW50SWNvbihpY29uU3JjKSIKKyAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSd7e2ljb25TcmMgfCB0cmFuc2xhdGV9fScKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9mb3JtPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9pY29ucy1zdGVwL2ljb25zLXN0ZXAubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwM2M5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9pY29ucy1zdGVwL2ljb25zLXN0ZXAubGVzcwpAQCAtMCwwICsxLDU1IEBACisuaWNvbnMtc3RlcCB7CisKKyAgICAudy1zZGMtZm9ybSB7CisgICAgICAgIHBhZGRpbmctdG9wOiAwcHg7CisgICAgICAgIHBhZGRpbmctYm90dG9tOiAgMHB4OworICAgICAgICAuc2VsZWN0ZWQtaWNvbi1jb250YWluZXIgeworICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZmNmY2Y7CisgICAgICAgICAgICBjbGVhcjogYm90aDsKKyAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CisgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAzcHg7CisgICAgICAgICAgICAuc2VsZWN0ZWQtaWNvbiB7CisgICAgICAgICAgICAgICAgbWFyZ2luOiA4cHggNXB4IDBweCA2cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuc3VnZ2VzdGVkLWljb25zLWNvbnRhaW5lciB7CisgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NmY2ZjZjsKKyAgICAgICAgICAgIGNsZWFyOiBib3RoOworICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CisgICAgICAgICAgICBoZWlnaHQ6IDM0MHB4OworICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMHB4OworCisgICAgICAgICAgICAuc3VnZ2VzdGVkLWljb24td3JhcHBlciB7CisgICAgICAgICAgICAgICAgbWFyZ2luOiA4cHggNXB4IDBweCA2cHg7CisgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworCisgICAgICAgICAgICAgICAgJi5zZWxlY3RlZCB7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBjb2xvcl9wOworICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAyNXB4OworICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMnB4ICM4ODg7CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDBweDsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMnB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgLnN1Z2dlc3RlZC1pY29uIHsKKyAgICAgICAgICAgICAgICAvLyBtYXJnaW46IDhweCA1cHggMHB4IDZweDsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgJi5kaXNhYmxleworICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgICAgIC5pY29ucy1sYWJlbCB7CisgICAgICAgICAgICBmbG9hdDogbGVmdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM1ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaWNvbnMtc3RlcC9pY29ucy1zdGVwLnRzCkBAIC0wLDAgKzEsMTUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzLldpemFyZCB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJSWNvbnNTdGVwU2NvcGUgZXh0ZW5kcyBJV2l6YXJkQ3JlYXRpb25TdGVwU2NvcGV7CisgICAgICAgIGljb25zIDogQXJyYXk8c3RyaW5nPjsKKyAgICAgICAgY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ7CisgICAgICAgIGljb25TcHJpdGU6IHN0cmluZzsKKyAgICAgICAgc2V0Q29tcG9uZW50SWNvbihpY29uU3JjOnN0cmluZyk6IHZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEljb25zU3RlcFZpZXdNb2RlbCBpbXBsZW1lbnRzIElXaXphcmRDcmVhdGlvblN0ZXAgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuQXZhaWxhYmxlSWNvbnNTZXJ2aWNlJywKKyAgICAgICAgICAgICdDb21wb25lbnRGYWN0b3J5JworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklJY29uc1N0ZXBTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhdmFpbGFibGVJY29uc1NlcnZpY2U6U2VydmljZXMuQXZhaWxhYmxlSWNvbnNTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEZhY3Rvcnk6IFNkYy5VdGlscy5Db21wb25lbnRGYWN0b3J5KSB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJlZ2lzdGVyQ2hpbGQodGhpcyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQgPSB0aGlzLiRzY29wZS5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmljb25TcHJpdGUgPSB0aGlzLiRzY29wZS5jb21wb25lbnQuaWNvblNwcml0ZTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLmluaXRJY29ucygpOworCisgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0VmVuZG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZXJlIGlzIG9uZSBpY29ucyBzZWxlY3QgaXQuCisgICAgICAgICAgICBpZiggdGhpcy4kc2NvcGUuaWNvbnMubGVuZ3RoID09IDEgJiYgIXRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc0FscmVhZHlDZXJ0aWZpZWQoKSl7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50SWNvbih0aGlzLiRzY29wZS5pY29uc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRJY29ucyA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICAvLyBGb3Igc3ViY2F0ZWdvcmllcyB0aGF0IHdoZXJlIGNyZWF0ZWQgYnkgYWRtaW4sIHRoZXJlIGlzIG5vIGljb25zCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pY29ucyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7CisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50LmNhdGVnb3JpZXMgJiYgdGhpcy4kc2NvcGUuY29tcG9uZW50LmNhdGVnb3JpZXMubGVuZ3RoID4gMCkgeworCisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jYXRlZ29yaWVzLCAoY2F0ZWdvcnk6TW9kZWxzLklNYWluQ2F0ZWdvcnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuaWNvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmljb25zID0gdGhpcy4kc2NvcGUuaWNvbnMuY29uY2F0KGNhdGVnb3J5Lmljb25zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMsIChzdWJjYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViY2F0ZWdvcnkuaWNvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaWNvbnMgPSB0aGlzLiRzY29wZS5pY29ucy5jb25jYXQoc3ViY2F0ZWdvcnkuaWNvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpKSB7CisgICAgICAgICAgICAgICAgbGV0IHJlc291cmNlVHlwZTpzdHJpbmcgPSB0aGlzLiRzY29wZS5jb21wb25lbnQuZ2V0Q29tcG9uZW50U3ViVHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgPT09ICdWTCcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaWNvbnMgPSBbJ3ZsJ107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgPT09ICdDUCcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaWNvbnMgPSBbJ2NwJ107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuaWNvbnMubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaWNvbnMgPSB0aGlzLmF2YWlsYWJsZUljb25zU2VydmljZS5nZXRJY29ucyh0aGlzLiRzY29wZS5jb21wb25lbnQuY29tcG9uZW50VHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRWZW5kb3IgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCB2ZW5kb3JzOkFycmF5PHN0cmluZz4gPSB0aGlzLmF2YWlsYWJsZUljb25zU2VydmljZS5nZXRJY29ucyh0aGlzLiRzY29wZS5jb21wb25lbnQuY29tcG9uZW50VHlwZSkuc2xpY2UoNSwgMTkpOworICAgICAgICAgICAgbGV0IHZlbmRvck5hbWUgPSB0aGlzLiRzY29wZS5jb21wb25lbnQudmVuZG9yTmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgaWYgKCdhdCZ0JyA9PT0gdmVuZG9yTmFtZSl7CisgICAgICAgICAgICAgICAgdmVuZG9yTmFtZSA9ICdhdHQnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCdub2tpYScgPT09IHZlbmRvck5hbWUpeworICAgICAgICAgICAgICAgIHZlbmRvck5hbWUgPSAnbm9raWFzaWVtZW5zJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IHZlbmRvcjpzdHJpbmcgPSBfLmZpbmQodmVuZG9ycywgKHZlbmRvcjpzdHJpbmcpPT57CisgICAgICAgICAgICAgICAgcmV0dXJuIHZlbmRvci5yZXBsYWNlKC9bX10vZywgJycpLnRvTG93ZXJDYXNlKCkgPT09IHZlbmRvck5hbWU7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYodmVuZG9yICYmIHRoaXMuJHNjb3BlLmljb25zLmluZGV4T2YodmVuZG9yKT09PS0xKSB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaWNvbnMucHVzaCh2ZW5kb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlKCk6dm9pZCB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pY29ucyA9IFtdOworCisgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5jb21wb25lbnQuaWNvbiA9PT0gVXRpbHMuQ29uc3RhbnRzLkRFRkFVTFRfSUNPTil7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZShmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldENvbXBvbmVudEljb24gPSAoaWNvblNyYzpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pY29uID0gaWNvblNyYzsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2F2ZShjYWxsYmFjazpGdW5jdGlvbik6dm9pZCB7CisgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldENvbXBvbmVudCh0aGlzLiRzY29wZS5jb21wb25lbnQpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudXBkYXRlQ29tcG9uZW50KCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIH1jYXRjaChlKXsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYmFjayA9IChjYWxsYmFjazpGdW5jdGlvbik6dm9pZCA9PiB7CisgICAgICAgICAgICAgdGhpcy5zYXZlKGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0aWVzLXN0ZXAvcHJvcGVydGllcy1zdGVwLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0aWVzLXN0ZXAvcHJvcGVydGllcy1zdGVwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyOTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnRpZXMtc3RlcC9wcm9wZXJ0aWVzLXN0ZXAuaHRtbApAQCAtMCwwICsxLDU3IEBACis8ZGl2IGNsYXNzPSJwcm9wZXJ0aWVzLXN0ZXAiIGRhdGEtbmctY29udHJvbGxlcj0iU2RjLlZpZXdNb2RlbHMuV2l6YXJkLlByb3BlcnRpZXNTdGVwVmlld01vZGVsIj4KKworICAgIDxkaXYgY2xhc3M9Inctc2RjLWNsYXNzaWMtYnRuIGdyYXkiIGRhdGEtdGVzdHMtaWQ9ImFkZEdyZXkiIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlUHJvcGVydHkoKSI+QWRkPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb250YWluZXItZmxleCI+CisKKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZCBmbGV4LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIGhlYWQtcm93IGhhbmQgZmxleC1pdGVtIiBkYXRhLW5nLXJlcGVhdD0iaGVhZGVyIGluIHRhYmxlSGVhZGVyc0xpc3QgdHJhY2sgYnkgJGluZGV4IiBkYXRhLW5nLWNsaWNrPSJzb3J0KGhlYWRlci5wcm9wZXJ0eSkiPnt7aGVhZGVyLnRpdGxlfX0KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0ic29ydEJ5ID09PSBoZWFkZXIucHJvcGVydHkiIGNsYXNzPSJ0YWJsZS1oZWFkZXItc29ydC1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydkb3duJzogcmV2ZXJzZSwgJ3VwJzohcmV2ZXJzZX0iPiA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbm8tdGV4dC1oZWFkZXIgaGVhZC1yb3cgZmxleC1pdGVtIj48L2Rpdj4KKyAgICAgICAgICAgICAgICA8IS0tZGl2IGNsYXNzPSJ0YWJsZS1uby10ZXh0LWhlYWRlciBoZWFkLXJvdyBmbGV4LWl0ZW0iPjwvZGl2LS0+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctaWY9ImNvbXBvbmVudC5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCAiIGNsYXNzPSJuby1yb3ctdGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgbm8gcHJvcGVydGllcyB0byBkaXNwbGF5IDxicj4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrIDxhIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlUHJvcGVydHkoKSI+aGVyZTwvYT4gdG8gYWRkIG9uZQorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1zdGFydD0icHJvcGVydHkgaW4gY29tcG9uZW50LnByb3BlcnRpZXMgfCBvcmRlckJ5OnNvcnRCeTpyZXZlcnNlIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZmxleC1jb250YWluZXIgZGF0YS1yb3ciIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiBwcm9wZXJ0eS5zZWxlY3RlZH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0icHJvcGVydHkuc2VsZWN0ZWQgPSAhcHJvcGVydHkuc2VsZWN0ZWQiPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0gdGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNwcml0ZSB0YWJsZS1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydvcGVuZWQnOiBwcm9wZXJ0eS5zZWxlY3RlZH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS10ZXN0cy1pZD0ie3twcm9wZXJ0eS5uYW1lfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5uYW1lfX0iPnt7cHJvcGVydHkubmFtZX19PC9zcGFuPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiIGRhdGEtdGVzdHMtaWQ9Int7cHJvcGVydHkudHlwZX19IiBkYXRhLW5nLWJpbmQ9InByb3BlcnR5LnR5cGUiPjwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0gdGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5kZWZhdWx0VmFsdWV9fSIgZGF0YS10ZXN0cy1pZD0ie3twcm9wZXJ0eS5kZWZhdWx0VmFsdWV9fSIgZGF0YS1uZy1iaW5kPSJwcm9wZXJ0eS5kZWZhdWx0VmFsdWUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1idG4tY29sIGZsZXgtaXRlbSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFibGUtZWRpdC1idG4iIGRhdGEtbmctc2hvdz0icHJvcGVydHkucGFyZW50VW5pcXVlSWQ9PWNvbXBvbmVudC51bmlxdWVJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlUHJvcGVydHkocHJvcGVydHkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ij4gPC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFibGUtZGVsZXRlLWJ0biIgZGF0YS1uZy1zaG93PSJwcm9wZXJ0eS5wYXJlbnRVbmlxdWVJZD09Y29tcG9uZW50LnVuaXF1ZUlkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iZGVsZXRlKHByb3BlcnR5KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyI+IDwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1kaXYgY2xhc3M9InRhYmxlLWJ0bi1jb2wgZmxleC1pdGVtIj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXYtLT4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQtZW5kPSIiIGRhdGEtbmctaWY9InByb3BlcnR5LnNlbGVjdGVkICYmIHByb3BlcnR5LmRlc2NyaXB0aW9uIiBjbGFzcz0iaXRlbS1vcGVuZWQiIGRhdGEtbmctYmluZD0icHJvcGVydHkuZGVzY3JpcHRpb24iPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvcHJvcGVydGllcy1zdGVwL3Byb3BlcnRpZXMtc3RlcC5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvcHJvcGVydGllcy1zdGVwL3Byb3BlcnRpZXMtc3RlcC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2RhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0aWVzLXN0ZXAvcHJvcGVydGllcy1zdGVwLmxlc3MKQEAgLTAsMCArMSw1NSBAQAorLnByb3BlcnRpZXMtc3RlcCB7CisKKyAgICAudy1zZGMtY2xhc3NpYy1idG4geworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgfQorCisgICAgLnRhYmxleworICAgICAgICBoZWlnaHQ6IDQxMnB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgIG1hcmdpbi10b3A6IDBweDsKKworICAgICAgICAudGV4dHsKKyAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgICAgICBwYWRkaW5nOiA1cHggNHB4OworCisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgxKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE1OworCisgICAgICAgICAgICAuaGFuZDsKKyAgICAgICAgICAgIHNwYW4udGFibGUtYXJyb3cgeworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogN3B4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMikgeworICAgICAgICAgICAgZmxleC1ncm93OiA2OworICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMykgeworICAgICAgICAgICAgZmxleC1ncm93OiA5OworICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNCkgeworICAgICAgICAgICAgZmxleC1ncm93OiAzOworICAgICAgICAgICAgLy9wYWRkaW5nLXRvcDogMTBweDsKKyAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggNHB4OworCisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCg1KSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvcHJvcGVydGllcy1zdGVwL3Byb3BlcnRpZXMtc3RlcC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnRpZXMtc3RlcC9wcm9wZXJ0aWVzLXN0ZXAudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkZmI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnRpZXMtc3RlcC9wcm9wZXJ0aWVzLXN0ZXAudHMKQEAgLTAsMCArMSwxMjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMuV2l6YXJkIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSVByb3BlcnRpZXNTdGVwVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJV2l6YXJkQ3JlYXRpb25TdGVwU2NvcGUgeworICAgICAgICBjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgdGFibGVIZWFkZXJzTGlzdDogQXJyYXk8YW55PjsKKyAgICAgICAgcmV2ZXJzZTogYm9vbGVhbjsKKyAgICAgICAgc29ydEJ5OnN0cmluZzsKKworICAgICAgICBhZGRPclVwZGF0ZVByb3BlcnR5KCk6IHZvaWQ7CisgICAgICAgIGRlbGV0ZShwcm9wZXJ0eTogTW9kZWxzLlByb3BlcnR5TW9kZWwpOiB2b2lkOworICAgICAgICBzb3J0KHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBQcm9wZXJ0aWVzU3RlcFZpZXdNb2RlbCBpbXBsZW1lbnRzIElXaXphcmRDcmVhdGlvblN0ZXAgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJworICAgICAgICBdOworCisKKyAgICAgICAgY29uc3RydWN0b3IoCisgICAgICAgICAgICBwcml2YXRlICRzY29wZTpJUHJvcGVydGllc1N0ZXBWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSwKKyAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgcHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFV0aWxzLk1vZGFsc0hhbmRsZXIKKyAgICAgICAgKXsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVnaXN0ZXJDaGlsZCh0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHNhdmUgPSAoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50KHRoaXMuJHNjb3BlLmNvbXBvbmVudCk7CisgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgYmFjayA9IChjYWxsYmFjazpGdW5jdGlvbik6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRDb21wb25lbnQodGhpcy4kc2NvcGUuY29tcG9uZW50KTsKKyAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIG9wZW5FZGl0UHJvcGVydHlNb2RhbCA9IChwcm9wZXJ0eTogTW9kZWxzLlByb3BlcnR5TW9kZWwpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoOiBzdHJpbmcgPSAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzLyc7CisKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXR0aW5ncyA9IHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCsnd2l6YXJkL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS5odG1sJyksCisgICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1NkYy5WaWV3TW9kZWxzLldpemFyZC5Qcm9wZXJ0eUZvcm1WaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgIHNpemU6ICdzZGMtbWQnLAorICAgICAgICAgICAgICAgIGJhY2tkcm9wOiAnc3RhdGljJywKKyAgICAgICAgICAgICAgICBrZXlib2FyZDogZmFsc2UsCisgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogKCk6IE1vZGVscy5Qcm9wZXJ0eU1vZGVsID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKTogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiB0aGlzLiRzY29wZS5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAgdGhpcy4kbW9kYWwub3Blbihtb2RhbE9wdGlvbnMpOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6IHZvaWQgPT4geworCisgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQgPSAgdGhpcy4kc2NvcGUuZ2V0Q29tcG9uZW50KCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSAnbmFtZSc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gZmFsc2U7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOidOYW1lJywgcHJvcGVydHk6ICduYW1lJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOidUeXBlJywgcHJvcGVydHk6ICd0eXBlJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOidEZWZhdWx0IFZhbHVlJywgcHJvcGVydHk6ICdkZWZhdWx0VmFsdWUnfQorICAgICAgICAgICAgXTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnQgPSAoc29ydEJ5OnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJzZSA9ICh0aGlzLiRzY29wZS5zb3J0QnkgPT09IHNvcnRCeSkgPyAgIXRoaXMuJHNjb3BlLnJldmVyc2UgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSBzb3J0Qnk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5hZGRPclVwZGF0ZVByb3BlcnR5ID0gKHByb3BlcnR5PzogTW9kZWxzLlByb3BlcnR5TW9kZWwpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLm9wZW5FZGl0UHJvcGVydHlNb2RhbChwcm9wZXJ0eSA/IHByb3BlcnR5IDogbmV3IE1vZGVscy5Qcm9wZXJ0eU1vZGVsKCkpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGVsZXRlID0gKHByb3BlcnR5OiBNb2RlbHMuUHJvcGVydHlNb2RlbCk6IHZvaWQgPT4geworCisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZWxldGVQcm9wZXJ0eShwcm9wZXJ0eS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBsZXQgdGl0bGU6c3RyaW5nID0gIHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlBST1BFUlRZX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIik7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U6c3RyaW5nID0gdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiUFJPUEVSVFlfVklFV19ERUxFVEVfTU9EQUxfVEVYVCIsICJ7J25hbWUnOiAnIiArIHByb3BlcnR5Lm5hbWUgKyAiJ30iKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBtZXNzYWdlLCBmYWxzZSkudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0eS1mb3JtL3Byb3BlcnR5LWZvcm0tdmlldy1tb2RlbC10ZXN0cy50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3LW1vZGVsLXRlc3RzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzkwODQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0eS1mb3JtL3Byb3BlcnR5LWZvcm0tdmlldy1tb2RlbC10ZXN0cy50cwpAQCAtMCwwICsxLDE2MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KKworZGVzY3JpYmUoInByb3BlcnR5IGZvcm0gVmlldyBNb2RlbCAiLCAoKSA9PiB7CisKKyAgICBsZXQgJGNvbnRyb2xsZXJNb2NrOm5nLklDb250cm9sbGVyU2VydmljZTsKKyAgICBsZXQgJHFNb2NrOm5nLklRU2VydmljZTsKKyAgICBsZXQgJGh0dHBCYWNrZW5kTW9jazpuZy5JSHR0cEJhY2tlbmRTZXJ2aWNlOworICAgIGxldCAkc2NvcGVNb2NrOlNkYy5WaWV3TW9kZWxzLldpemFyZC5JUHJvcGVydHlGb3JtVmlld01vZGVsU2NvcGU7CisgICAgbGV0ICRzdGF0ZU1vY2s6bmcudWkuSVN0YXRlU2VydmljZTsKKyAgICBsZXQgJHN0YXRlUGFyYW1zOmFueTsKKyAgICBsZXQgY29tcG9uZW50ID0geworICAgICAgICAidW5pcXVlSWQiOiAiZWNlODE4ZTAtZmQ1OS00NzdhLWJhZjYtZTI3NDYxYTdjZTIzIiwKKyAgICAgICAgInV1aWQiOiAiOGRiODIzYzItNmE5Yy00NjM2LTg2NzYtZjVlNzEzMjcwZGQ3IiwKKyAgICAgICAgImNvbnRhY3RJZCI6ICJ1ZjIzNDUiLAorICAgICAgICAiY2F0ZWdvcnkiOiAiTmV0d29yayBMYXllciAyLTMvUm91dGVyIiwKKyAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0NDcyMzUzNTI0MjksCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJ1IiwKKyAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZSwKKyAgICAgICAgImljb24iOiAibmV0d29yayIsCisgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0NDcyMzUzNzAwNjQsCisgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgIm5hbWUiOiAidSIsCisgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICJ0eXBlIjogMSwKKyAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAidSIKKyAgICAgICAgXSwKKyAgICAgICAgInZlbmRvck5hbWUiOiAidSIsCisgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogInUiLAorICAgICAgICAic3lzdGVtTmFtZSI6ICJVIiwKKyAgICAgICAgIiQkaGFzaEtleSI6ICJvYmplY3Q6MzQiCisgICAgfTsKKworCisgICAgYmVmb3JlRWFjaChhbmd1bGFyLm1vY2subW9kdWxlKCdzZGNBcHAnKSk7CisKKyAgICBiZWZvcmVFYWNoKGFuZ3VsYXIubW9jay5pbmplY3QoKF8kY29udHJvbGxlcl86bmcuSUNvbnRyb2xsZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyRodHRwQmFja2VuZF86bmcuSUh0dHBCYWNrZW5kU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8kcm9vdFNjb3BlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8kcV86bmcuSVFTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyRzdGF0ZV86bmcudWkuSVN0YXRlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8kc3RhdGVQYXJhbXNfOmFueSkgPT4geworCisgICAgICAgICRjb250cm9sbGVyTW9jayAgPSBfJGNvbnRyb2xsZXJfOworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrID0gXyRodHRwQmFja2VuZF8KKyAgICAgICAgJHNjb3BlTW9jayAgICAgICA9IF8kcm9vdFNjb3BlXy4kbmV3KCk7CisgICAgICAgICRxTW9jayAgICAgICAgICAgPSBfJHFfOworICAgICAgICAkc3RhdGVNb2NrICAgICAgID0gXyRzdGF0ZV87CisgICAgICAgICRzdGF0ZVBhcmFtcyA9IF8kc3RhdGVQYXJhbXNfOworCisKKyAgICAgICAgLy9oYW5kbGUgYWxsIGh0dHAgcmVxdWVzdCB0aGV0IG5vdCByZWxldmFudCB0byB0aGUgdGVzdHMKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qbGFuZ3VhZ2VzXC9lbl9VUy5qc29uLiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgLy8gJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qcmVzb3VyY2VzXC9jZXJ0aWZpZWRcL2Fic3RyYWN0LiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qcmVzdFwvdmVyc2lvbi4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKC8uKmNvbmZpZ3VyYXRpb25cL3VpLiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qdXNlclwvYXV0aG9yaXplLiovKS5yZXNwb25kKDIwMCwgSlNPTi5zdHJpbmdpZnkoe30pKTsKKyAgICAgICAgJGh0dHBCYWNrZW5kTW9jay5leHBlY3RHRVQoLy4qY2F0ZWdvcmllc1wvc2VydmljZXMuKi8pLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrLmV4cGVjdEdFVCgvLipjYXRlZ29yaWVzXC9yZXNvdXJjZXMuKi8pLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworICAgICAgICAkaHR0cEJhY2tlbmRNb2NrLmV4cGVjdEdFVCgvLipjYXRlZ29yaWVzXC9wcm9kdWN0cy4qLykucmVzcG9uZCgyMDAsIEpTT04uc3RyaW5naWZ5KHt9KSk7CisgICAgICAgICRodHRwQmFja2VuZE1vY2suZXhwZWN0R0VUKCdodHRwOi8vZmVIb3N0OjgxODEvc2RjMS9mZVByb3h5L3Jlc3QvdmVyc2lvbicpLnJlc3BvbmQoMjAwLCBKU09OLnN0cmluZ2lmeSh7fSkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNb2NrIHRoZSBzZXJ2aWNlCisgICAgICAgICAqIEB0eXBlIHthbnl9CisgICAgICAgICAqLworICAgICAgICAvL2dldEFsbEVudGl0aWVzRGVmZXJlZCA9ICRxTW9jay5kZWZlcigpOworICAgICAgICAvL2dldEFsbEVudGl0aWVzRGVmZXJlZC5yZXNvbHZlKGdldEFsbEVudGl0aWVzUmVzcG9uc2VNb2NrKTsKKyAgICAgICAgLy9lbnRpdHlTZXJ2aWNlTW9jayA9IGphc21pbmUuY3JlYXRlU3B5T2JqKCdlbnRpdHlTZXJ2aWNlTW9jaycsIFsnZ2V0QWxsQ29tcG9uZW50cyddKTsKKyAgICAgICAgLy9lbnRpdHlTZXJ2aWNlTW9jay5nZXRBbGxDb21wb25lbnRzLmFuZC5yZXR1cm5WYWx1ZShnZXRBbGxFbnRpdGllc0RlZmVyZWQucHJvbWlzZSk7CisKKyAgICAgICAgLy8gJHN0YXRlUGFyYW1zWydzaG93J10gPSAnJzsKKworICAgICAgICAvKioKKyAgICAgICAgICogTmVlZCB0byBpbmplY3QgaW50byB0aGUgY29udHJvbGxlciBvbmx5IHRoZSBvYmplY3RzIHRoYXQgd2Ugd2FudCB0byBNT0NLCisgICAgICAgICAqIHRob3NlIHRoYXQgd2UgbmVlZCB0byBjaGFuZ2UgdGhlaXJzIGJlaGF2aW9ycworICAgICAgICAgKi8KKyAgICAgICAgJGNvbnRyb2xsZXJNb2NrKFNkYy5WaWV3TW9kZWxzLldpemFyZC5Qcm9wZXJ0eUZvcm1WaWV3TW9kZWwsIHsKKyAgICAgICAgICAgICckc2NvcGUnOiAkc2NvcGVNb2NrLAorICAgICAgICAgICAgJ3Byb3BlcnR5JzogbmV3IFNkYy5Nb2RlbHMuUHJvcGVydHlNb2RlbCgpLAorICAgICAgICAgICAgJ2NvbXBvbmVudCc6IGNvbXBvbmVudCwKKyAgICAgICAgfSk7CisKKyAgICB9KSk7CisKKyAgICBkZXNjcmliZSgid2hlbiBDb250cm9sbGVyICdQcm9wZXJ0eUZvcm1WaWV3TW9kZWwnIGNyZWF0ZWQiLCAoKSA9PiB7CisKKyAgICAgICAgaXQoJ3Nob3VsZCBoYXZlIGEgcmVnZXhwIHBlciBlYWNoIHR5cGUnLCAoKSA9PiB7CisgICAgICAgICAgICAkc2NvcGVNb2NrLiRhcHBseSgpOworICAgICAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKCRzY29wZU1vY2subGlzdFJlZ2V4KS5sZW5ndGgpLnRvQmUoJHNjb3BlTW9jay5lZGl0UHJvcGVydHlNb2RlbFsic2ltcGxlVHlwZXMiXS5sZW5ndGgpOworICAgICAgICB9KTsKKworICAgICAgICBpdCgnc2hvdWxkIGhhdmUgZXF1YWwgcmVnZXhwcyBmb3IgbWFwIGFuZCBsaXN0JywgKCkgPT4geworICAgICAgICAgICAgJHNjb3BlTW9jay4kYXBwbHkoKTsKKyAgICAgICAgICAgIGV4cGVjdChPYmplY3Qua2V5cygkc2NvcGVNb2NrLmxpc3RSZWdleCkubGVuZ3RoKS50b0JlKE9iamVjdC5rZXlzKCRzY29wZU1vY2subWFwUmVnZXgpLmxlbmd0aCk7CisgICAgICAgIH0pOworCisgICAgfSk7CisKKyAgICAvKmRlc2NyaWJlKCJ3aGVuIENvbnRyb2xsZXIgJ0Rhc2hib2FyZFZpZXdNb2RlbCcgY3JlYXRlZCIsICgpID0+IHsKKworICAgICAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGFsbCBlbnRpdGllcycsICgpID0+IHsKKyAgICAgICAgICAgICRzY29wZU1vY2suJGFwcGx5KCk7CisgICAgICAgICAgICBleHBlY3QoJHNjb3BlTW9jay5jb21wb25lbnRzLmxlbmd0aCkudG9CZShnZXRBbGxFbnRpdGllc1Jlc3BvbnNlTW9jay5sZW5ndGgpOworICAgICAgICB9KTsKKworCisgICAgICAgIGl0KCdzaG91bGQgc2hvdyB0dXRvcmlhbCBwYWdlICcsICgpID0+IHsKKyAgICAgICAgICAgICRzdGF0ZVBhcmFtcy5zaG93ID0gJ3R1dG9yaWFsJzsKKworICAgICAgICAgICAgJGNvbnRyb2xsZXJNb2NrKFNkYy5WaWV3TW9kZWxzLkRhc2hib2FyZFZpZXdNb2RlbCwgeworICAgICAgICAgICAgICAgICckc2NvcGUnOiAkc2NvcGVNb2NrLAorICAgICAgICAgICAgICAgICckc3RhdGVQYXJhbXMnOiAkc3RhdGVQYXJhbXMsCisgICAgICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlJzogZW50aXR5U2VydmljZU1vY2ssCisgICAgICAgICAgICAgICAgLy90byBjb21wbGV0ZSBpbmplY3RzCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJHNjb3BlTW9jay4kYXBwbHkoKTsKKyAgICAgICAgICAgIGV4cGVjdCgkc2NvcGVNb2NrLmlzRmlyc3RUaW1lKS50b0JlVHJ1dGh5KCk7CisgICAgICAgICAgICBleHBlY3QoJHNjb3BlTW9jay5zaG93VHV0b3JpYWwpLnRvQmVUcnV0aHkoKTsKKyAgICAgICAgfSk7CisKKyAgICB9KTsKKworCisgICAgZGVzY3JpYmUoIndoZW4gZnVuY3Rpb24gJ2VudGl0aWVzQ291bnQnIGludm9rZWQiLCAoKSA9PiB7CisKKyAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7CisgICAgICAgICAgICAkY29udHJvbGxlck1vY2soU2RjLlZpZXdNb2RlbHMuRGFzaGJvYXJkVmlld01vZGVsLCB7CisgICAgICAgICAgICAgICAgJyRzY29wZSc6ICRzY29wZU1vY2ssCisgICAgICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlJzogZW50aXR5U2VydmljZU1vY2ssCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICRzY29wZU1vY2suJGFwcGx5KCk7CisgICAgICAgIH0pOworCisgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGVudGl0aWVzIGNvdW50IHBlciBmb2xkZXInLCAoKSA9PiB7CisKKyAgICAgICAgfSk7CisKKworICAgIH0pOyovCit9KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiMGVmMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMjUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorCittb2R1bGUgU2RjLlZpZXdNb2RlbHMuV2l6YXJkIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElFZGl0UHJvcGVydHlNb2RlbHsKKyAgICAgICAgcHJvcGVydHk6IE1vZGVscy5Qcm9wZXJ0eU1vZGVsOworICAgICAgICB0eXBlczogQXJyYXk8c3RyaW5nPjsKKyAgICAgICAgc2ltcGxlVHlwZXM6IEFycmF5PHN0cmluZz47CisgICAgICAgIHNvdXJjZXM6IEFycmF5PHN0cmluZz47CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJUHJvcGVydHlGb3JtVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGV7CisKKyAgICAgICAgJCRjaGlsZFRhaWw6IGFueTsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBmb3Jtczphbnk7CisgICAgICAgIGZvb3RlckJ1dHRvbnM6IEFycmF5PGFueT47CisgICAgICAgIGlzTmV3OiBib29sZWFuOworICAgICAgICBpc0xvYWRpbmc6IGJvb2xlYW47CisgICAgICAgIHZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIHByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGludGVnZXJWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBmbG9hdFZhbGlkYXRpb25QYXR0ZXJuOiBSZWdFeHA7CisgICAgICAgIGNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwOworICAgICAgICBsaXN0UmVnZXg6IFNkYy5VdGlscy5JTWFwUmVnZXg7CisgICAgICAgIG1hcFJlZ2V4OiBTZGMuVXRpbHMuSU1hcFJlZ2V4OworICAgICAgICBlZGl0UHJvcGVydHlNb2RlbDogSUVkaXRQcm9wZXJ0eU1vZGVsOworICAgICAgICBtb2RhbEluc3RhbmNlUHJvcGVydHk6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisgICAgICAgIHNhdmUoZG9Ob3RDbG9zZU1vZGFsPzogYm9vbGVhbik6IHZvaWQ7CisgICAgICAgIHNhdmVBbmRBbm90aGVyKCk6IHZvaWQ7CisgICAgICAgIGdldFZhbGlkYXRpb24oKTogUmVnRXhwOworICAgICAgICB2YWxpZGF0ZUludFJhbmdlKHZhbHVlOnN0cmluZyk6Ym9vbGVhbjsKKyAgICAgICAgY2xvc2UoKTogdm9pZDsKKyAgICAgICAgb25WYWx1ZUNoYW5nZSgpOiB2b2lkOworICAgICAgICBvblR5cGVDaGFuZ2UocmVzZXRTY2hlbWE6Ym9vbGVhbik6IHZvaWQ7CisgICAgICAgIHNob3dTY2hlbWEoKTogYm9vbGVhbjsKKyAgICAgICAgZ2V0VmFsaWRhdGlvblRyYW5zbGF0ZSgpOnN0cmluZzsKKyAgICAgICAgdmFsaWRhdGVVbmlxdWVLZXlzKHZpZXdWYWx1ZTpzdHJpbmcpOmJvb2xlYW47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFByb3BlcnR5Rm9ybVZpZXdNb2RlbHsKKworICAgICAgICBwcml2YXRlIG9yaWdpbmFsVmFsdWU6IHN0cmluZzsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJG1vZGFsSW5zdGFuY2UnLAorICAgICAgICAgICAgJ3Byb3BlcnR5JywKKyAgICAgICAgICAgICdWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnUHJvcGVydHlOYW1lVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ0ludGVnZXJOb0xlYWRpbmdaZXJvVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ0Zsb2F0VmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ0NvbW1lbnRWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnVmFsaWRhdGlvblV0aWxzJywKKyAgICAgICAgICAgICdjb21wb25lbnQnCisgICAgICAgIF07CisKKyAgICAgICAgcHJpdmF0ZSBmb3JtU3RhdGU6IFV0aWxzLkNvbnN0YW50cy5Gb3JtU3RhdGU7CisgICAgICAgIHByaXZhdGUgZW50aXR5SWQ6IHN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSByZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQ6IHN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seTogYm9vbGVhbjsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgIHByaXZhdGUgJHNjb3BlOklQcm9wZXJ0eUZvcm1WaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsSW5zdGFuY2U6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UsCisgICAgICAgICAgICBwcml2YXRlIHByb3BlcnR5IDogTW9kZWxzLlByb3BlcnR5TW9kZWwsCisgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25QYXR0ZXJuIDogUmVnRXhwLAorICAgICAgICAgICAgcHJpdmF0ZSBQcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybjogUmVnRXhwLAorICAgICAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyTm9MZWFkaW5nWmVyb1ZhbGlkYXRpb25QYXR0ZXJuIDogUmVnRXhwLAorICAgICAgICAgICAgcHJpdmF0ZSBGbG9hdFZhbGlkYXRpb25QYXR0ZXJuIDogUmVnRXhwLAorICAgICAgICAgICAgcHJpdmF0ZSBDb21tZW50VmFsaWRhdGlvblBhdHRlcm46IFJlZ0V4cCwKKyAgICAgICAgICAgIHByaXZhdGUgVmFsaWRhdGlvblV0aWxzOiBTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzLAorICAgICAgICAgICAgcHJpdmF0ZSBjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50CisgICAgICAgICl7CisgICAgICAgICAgICB0aGlzLmVudGl0eUlkID0gdGhpcy5jb21wb25lbnQudW5pcXVlSWQ7CisgICAgICAgICAgICB0aGlzLmZvcm1TdGF0ZSA9IGFuZ3VsYXIuaXNEZWZpbmVkKHByb3BlcnR5Lm5hbWUpID8gVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZS5VUERBVEUgOiBVdGlscy5Db25zdGFudHMuRm9ybVN0YXRlLkNSRUFURTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgaW5pdFJlc291cmNlID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkgPSBuZXcgU2RjLk1vZGVscy5Qcm9wZXJ0eU1vZGVsKHRoaXMucHJvcGVydHkpOworICAgICAgICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlID0gdGhpcy5wcm9wZXJ0eS5kZWZhdWx0VmFsdWU7CisgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC50eXBlcy5pbmRleE9mKHRoaXMucHJvcGVydHkudHlwZSkgPT09IC0xICYmICF0aGlzLiRzY29wZS5pc05ldyl7CisgICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eS50eXBlID0gInN0cmluZyI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0RWRpdFByb3BlcnR5TW9kZWwgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbCA9IHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eTogbnVsbCwKKyAgICAgICAgICAgICAgICB0eXBlczogWydpbnRlZ2VyJywgJ3N0cmluZycsICdmbG9hdCcsICdib29sZWFuJywgJ2xpc3QnLCAnbWFwJ10sCisgICAgICAgICAgICAgICAgc2ltcGxlVHlwZXM6IFsnaW50ZWdlcicsICdzdHJpbmcnLCAnZmxvYXQnLCAnYm9vbGVhbiddLAorICAgICAgICAgICAgICAgIHNvdXJjZXM6IFsnQSZBSScsICdPcmRlcicsICdSdW50aW1lJ10KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuaW5pdFJlc291cmNlKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTogdm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsSW5zdGFuY2VQcm9wZXJ0eSA9IHRoaXMuJG1vZGFsSW5zdGFuY2U7CisgICAgICAgICAgICAvL3Njb3BlIHByb3BlcnRpZXMKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5WYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnByb3BlcnR5TmFtZVZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Qcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmludGVnZXJWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuSW50ZWdlck5vTGVhZGluZ1plcm9WYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmZsb2F0VmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLkZsb2F0VmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21tZW50VmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLkNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjsKKworICAgICAgICAgICAgLy9tYXAgJiBsaXN0IHZhbGlkYXRpb24gcGF0dGVybnMKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxpc3RSZWdleCA9IHRoaXMuVmFsaWRhdGlvblV0aWxzLmdldFByb3BlcnR5TGlzdFBhdHRlcm5zKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5tYXBSZWdleCA9IHRoaXMuVmFsaWRhdGlvblV0aWxzLmdldFByb3BlcnR5TWFwUGF0dGVybnMoKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc05ldyA9ICh0aGlzLmZvcm1TdGF0ZSA9PT0gVXRpbHMuQ29uc3RhbnRzLkZvcm1TdGF0ZS5DUkVBVEUpOworICAgICAgICAgICAgdGhpcy5pbml0RWRpdFByb3BlcnR5TW9kZWwoKTsKKworICAgICAgICAgICAgLy9zY29wZSBtZXRob2RzCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zYXZlID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlc2NyaXB0aW9uID0gdGhpcy5WYWxpZGF0aW9uVXRpbHMuc3RyaXBBbmRTYW5pdGl6ZSh0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChyZXNwb25zZSkgPT4geworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRmFpbGQnLHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkID0gdGhpcy5yZXNvdXJjZUluc3RhbmNlVW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocHJvcGVydHk6IE1vZGVscy5Qcm9wZXJ0eU1vZGVsKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygncHJvcGVydHkgYWRkZWQgOiAnLHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LnJlc291cmNlSW5zdGFuY2VVbmlxdWVJZCA9IHRoaXMucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkOworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5yZWFkb25seSA9IChwcm9wZXJ0eS5wYXJlbnRVbmlxdWVJZCAhPT0gdGhpcy5jb21wb25lbnQudW5pcXVlSWQpIC8qfHwgdGhpcy5jb21wb25lbnQuaXNTZXJ2aWNlKCkqLzsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkID0gdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkucmVzb3VyY2VJbnN0YW5jZVVuaXF1ZUlkOworICAgICAgICAgICAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWUgPSB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWUgPyB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWU6bnVsbDsKKworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LmFkZE9yVXBkYXRlUHJvcGVydHkodGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zYXZlQW5kQW5vdGhlciA9ICgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zYXZlKCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zaG93U2NoZW1hID0gKCkgOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBbJ2xpc3QnLCAnbWFwJ10uaW5kZXhPZih0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS50eXBlKSA+IC0xOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0VmFsaWRhdGlvblRyYW5zbGF0ZSA9ICgpIDogc3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gIlBST1BFUlRZX0VESVRfUEFUVEVSTiI7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLnNob3dTY2hlbWEoKSkgeworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJQUk9QRVJUWV9FRElUXyIgKyB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS50eXBlLnRvVXBwZXJDYXNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGUgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIl9TVFJJTkciOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJfR0VORVJJQyI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0VmFsaWRhdGlvbiA9ICgpIDogUmVnRXhwID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnR5cGU7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKXsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW50ZWdlcic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuaW50ZWdlclZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgICAgICAgICBjYXNlICdmbG9hdCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuZmxvYXRWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGlzdCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUubGlzdFJlZ2V4W3RoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eS50eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5tYXBSZWdleFt0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5zY2hlbWEucHJvcGVydHkudHlwZV07CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGVVbmlxdWVLZXlzID0gKHZpZXdWYWx1ZTpzdHJpbmcpIDogYm9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSA9PT0gJ21hcCcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVW5pcXVlS2V5cyh2aWV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vYWx3YXlzIHZhbGlkIGlmIG5vdCBhIG1hcAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGVJbnRSYW5nZSA9ICh2YWx1ZTpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiAhdmFsdWUgfHwgdGhpcy5WYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJbnRSYW5nZSh2YWx1ZSk7CisgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNsb3NlID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uVmFsdWVDaGFuZ2UgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYoIXRoaXMuJHNjb3BlLmVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlZmF1bHRWYWx1ZSAmJiB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZXF1aXJlZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWUgPSB0aGlzLm9yaWdpbmFsVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25UeXBlQ2hhbmdlID0gKHJlc2V0U2NoZW1hOmJvb2xlYW4pOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWUgPSAnJzsKKyAgICAgICAgICAgICAgICBpZiAocmVzZXRTY2hlbWEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGUgPSAnJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvL25ldyBmb3JtIGxheW91dCBmb3IgaW1wb3J0IGFzc2V0CisgICAgICAgICAgICB0aGlzLiRzY29wZS5mb3JtcyA9IHt9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9ucyA9IFsKKyAgICAgICAgICAgICAgICB7J25hbWUnOiB0aGlzLiRzY29wZS5pc05ldyA/ICdBZGQnIDogJ1VwZGF0ZScsICdjc3MnOidibHVlJywgJ2NhbGxiYWNrJzogdGhpcy4kc2NvcGUuc2F2ZX0sCisgICAgICAgICAgICAgICAgeyduYW1lJzonQ2FuY2VsJywgJ2Nzcyc6J2dyZXknLCAnY2FsbGJhY2snOiB0aGlzLiRzY29wZS5jbG9zZX0KKyAgICAgICAgICAgIF07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLiR3YXRjaCgnZm9ybXMuZWRpdEZvcm0uJGludmFsaWQnLCAoKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9uc1swXS5kaXNhYmxlZCA9IHRoaXMuJHNjb3BlLmZvcm1zLmVkaXRGb3JtLiRpbnZhbGlkOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0eS1mb3JtL3Byb3BlcnR5LWZvcm0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIzNzExCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLmh0bWwKQEAgLTAsMCArMSwxMzMgQEAKKzxzZGMtbW9kYWwgbW9kYWw9Im1vZGFsSW5zdGFuY2VQcm9wZXJ0eSIgdHlwZT0iY2xhc3NpYyIgY2xhc3M9InNkYy1hZGQtcHJvcGVydHkiIGJ1dHRvbnM9ImZvb3RlckJ1dHRvbnMiIGhlYWRlcj0ie3tpc05ldyA/ICdBZGQnIDogJ1VwZGF0ZScgfX0gUHJvcGVydHkiIHNob3ctY2xvc2UtYnV0dG9uPSJ0cnVlIj4KKworICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9Inctc2RjLWZvcm0gdHdvLWNvbHVtbnMiIG5hbWU9ImZvcm1zLmVkaXRGb3JtIiA+CisKKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW5zLXdyYXBwZXIiPgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihmb3Jtcy5lZGl0Rm9ybS5wcm9wZXJ0eU5hbWUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnByb3BlcnR5TmFtZS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiIG5nLWNsYXNzPSJ7J3JlcXVpcmVkJzogIWlzU2VydmljZX0iPk5hbWU8L2xhYmVsPgorICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjUwIgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSIhaXNOZXcgfHwgZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkucmVhZG9ubHkiCisgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iNTAiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5Lm5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByb3BlcnR5TmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJwcm9wZXJ0eU5hbWVWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJwcm9wZXJ0eU5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgIGF1dG9mb2N1cyAvPgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0ucHJvcGVydHlOYW1lLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5wcm9wZXJ0eU5hbWUuJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5wcm9wZXJ0eU5hbWUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnUHJvcGVydHkgbmFtZScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5wcm9wZXJ0eU5hbWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzEyOCcgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5wcm9wZXJ0eU5hbWUuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0uc2NoZW1hVHlwZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0uc2NoZW1hVHlwZS4kaW52YWxpZCl9IgorICAgICAgICAgICAgICAgIGRhdGEtbmctaWY9InNob3dTY2hlbWEoKSI+CisgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5FbnRyeSBTY2hlbWE8L2xhYmVsPgorICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9Imktc2RjLWZvcm0tc2VsZWN0IgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2NoZW1hVHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InNjaGVtYVR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0ib25UeXBlQ2hhbmdlKGZhbHNlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eS50eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1vcHRpb25zPSJ0eXBlIGZvciB0eXBlIGluIGVkaXRQcm9wZXJ0eU1vZGVsLnNpbXBsZVR5cGVzIj4KKyAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5DaG9vc2UgU2NoZW1hIFR5cGU8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8L3NlbGVjdD4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnNjaGVtYVR5cGUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnNjaGVtYVR5cGUuJGludmFsaWQiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS5zY2hlbWFUeXBlLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1JFUVVJUkVEIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J2ZpZWxkJzogJ0VudHJ5IHNjaGVtYScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisKKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLnZhbHVlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiPkRlZmF1bHQgVmFsdWU8L2xhYmVsPgorICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iaS1zZGMtZm9ybS1pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgbmctaWY9IiEoZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSA9PSAnYm9vbGVhbicpIgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMTAwIgorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkZGRkZGRkPSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seSAmJiAhaXNTZXJ2aWNlICAmJiAhaXNQcm9wZXJ0eVZhbHVlT3duZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlZmF1bHRWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3VzdG9tLXZhbGlkYXRpb249IiIgZGF0YS12YWxpZGF0aW9uLWZ1bmM9InZhbGlkYXRlVW5pcXVlS2V5cyIKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJnZXRWYWxpZGF0aW9uKCkiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSIhZm9ybXMuZWRpdEZvcm0udmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgKCdpbnRlZ2VyJz09ZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSAmJiBmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kc2V0VmFsaWRpdHkoJ3BhdHRlcm4nLCB2YWxpZGF0ZUludFJhbmdlKGVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlZmF1bHRWYWx1ZSkpIHx8IG9uVmFsdWVDaGFuZ2UoKSkiCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlZmF1bHRWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzIC8+CisgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iaS1zZGMtZm9ybS1zZWxlY3QiCisgICAgICAgICAgICAgICAgICAgICAgICBuZy1pZj0iZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkudHlwZSA9PSAnYm9vbGVhbiciCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5yZWFkb25seSAgJiYgIWlzUHJvcGVydHlWYWx1ZU93bmVyKCkiCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJvblZhbHVlQ2hhbmdlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJlZGl0UHJvcGVydHlNb2RlbC5wcm9wZXJ0eS5kZWZhdWx0VmFsdWUiPgorICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPjwvb3B0aW9uPgorICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0cnVlIj50cnVlPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImZhbHNlIj5mYWxzZTwvb3B0aW9uPgorICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udmFsdWUuJGRpcnR5ICYmIGZvcm1zLmVkaXRGb3JtLnZhbHVlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udmFsdWUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfUkVRVUlSRUQiIHRyYW5zbGF0ZS12YWx1ZXM9InsnZmllbGQnOiAnUHJvcGVydHknIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udmFsdWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzEwMCcgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS52YWx1ZS4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJ7e2dldFZhbGlkYXRpb25UcmFuc2xhdGUoKX19Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLnZhbHVlLiRlcnJvci5jdXN0b21WYWxpZGF0aW9uIiB0cmFuc2xhdGU9IlBST1BFUlRZX0VESVRfTUFQX1VOSVFVRV9LRVlTIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgIGRhdGEtbmctY2xhc3M9IntlcnJvcjooZm9ybXMuZWRpdEZvcm0udHlwZS4kZGlydHkgJiYgZm9ybXMuZWRpdEZvcm0udHlwZS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiIG5nLWNsYXNzPSJ7J3JlcXVpcmVkJzogIWlzU2VydmljZX0iPlR5cGU8L2xhYmVsPgorICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9Imktc2RjLWZvcm0tc2VsZWN0IgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZGRkZGRkZD0iZWRpdFByb3BlcnR5TW9kZWwucHJvcGVydHkucmVhZG9ubHkiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJwcm9wZXJ0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ0eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9Im9uVHlwZUNoYW5nZSh0cnVlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW9wdGlvbnM9InR5cGUgZm9yIHR5cGUgaW4gZWRpdFByb3BlcnR5TW9kZWwudHlwZXMiPgorICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPkNob29zZSBUeXBlPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJmb3Jtcy5lZGl0Rm9ybS50eXBlLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS50eXBlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0udHlwZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdUeXBlJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7ZXJyb3I6KGZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwiPkRlc2NyaXB0aW9uPC9sYWJlbD4KKyAgICAgICAgICAgICAgPHRleHRhcmVhICBjbGFzcz0iaS1zZGMtZm9ybS10ZXh0YXJlYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWRkZGRkZGQ9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LnJlYWRvbmx5IgorICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0iY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImVkaXRQcm9wZXJ0eU1vZGVsLnByb3BlcnR5LmRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRkaXJ0eSAmJiBmb3Jtcy5lZGl0Rm9ybS5kZXNjcmlwdGlvbi4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRlcnJvci5tYXhsZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21heCc6ICcyNTYnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZm9ybXMuZWRpdEZvcm0uZGVzY3JpcHRpb24uJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImZvcm1zLmVkaXRGb3JtLmRlc2NyaXB0aW9uLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1JFUVVJUkVEIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J2ZpZWxkJzogJ0Rlc2NyaXB0aW9uJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9mb3JtPgorCis8L3NkYy1tb2RhbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiODU2NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS5sZXNzCkBAIC0wLDAgKzEsNyBAQAorLnNkYy1hZGQtcHJvcGVydHl7CisKKyAgICAudy1zZGMtZm9ybSB7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1jcmVhdGlvbi1iYXNlLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtY3JlYXRpb24tYmFzZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTkzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtY3JlYXRpb24tYmFzZS5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciPjwvbG9hZGVyPgorPGRpdiBjbGFzcz0ic2RjLXdpemFyZC1uYW1lLXR5cGUtbGFiZWwiIGRhdGEtbmctaWY9ImFzc2V0TmFtZSE9PXVuZGVmaW5lZCI+PHNwYW4gY2xhc3M9InNwcml0ZSBzcHJpdGUtZ3JlZW4tdGljayBhbmltYXRlZCBmbGFzaCI+PC9zcGFuPjxzcGFuIGNsYXNzPSJuYW1lIj57e2Fzc2V0TmFtZX19PC9zcGFuPiZuYnNwO3wmbmJzcDs8c3BhbiBjbGFzcz0idHlwZSI+e3thc3NldFR5cGV9fTwvc3Bhbj48L2Rpdj4KKzxzZGMtbW9kYWwgbW9kYWw9Im1vZGFsSW5zdGFuY2UiIHR5cGU9ImNsYXNzaWMiIGdldC1jbG9zZS1tb2RhbC1yZXNwb25zZT0iZ2V0Q29tcG9uZW50IiBidXR0b25zPSJmb290ZXJCdXR0b25zIiBjbGFzcz0ic2RjLXdpemFyZCIgaGVhZGVyPSJ7e21vZGFsVGl0bGV9fSIgc2hvdy1jbG9zZS1idXR0b249InRydWUiPgorICAgIDxkaXYgY2xhc3M9InNkYy13aXphcmQtd3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9InNkYy13aXphcmQtbGVmdC1jb250ZW50Ij4KKyAgICAgICAgICAgIDxzZGMtd2l6YXJkLXN0ZXAgc3RlcHM9ImRpcmVjdGl2ZVN0ZXBzIiBjb250cm9sPSJhc3NldENyZWF0aW9uQ29udHJvbCIgY2xhc3M9IndpemFyZC1zdGVwcy1saW5lIj48L3NkYy13aXphcmQtc3RlcD4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9InNkYy13aXphcmQtcmlnaHQtY29udGVudCI+CisgICAgICAgICAgICA8bmctaW5jbHVkZSBzcmM9InRlbXBsYXRlVXJsIiBjbGFzcz0ic2RjLXdpemFyZC1yaWdodC1pbmNsdWRlIj48L25nLWluY2x1ZGU+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9zZGMtbW9kYWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtY3JlYXRpb24tYmFzZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvd2l6YXJkLWNyZWF0aW9uLWJhc2UubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTExODY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvd2l6YXJkLWNyZWF0aW9uLWJhc2UubGVzcwpAQCAtMCwwICsxLDYwIEBACisuc2RjLXdpemFyZC13cmFwcGVyIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIHBhZGRpbmc6IDgwcHggMDsKKyAgICBoZWlnaHQ6IDYyMHB4OworICAgIC8vIFNvIGlucHV0IHZhbGlkYXRpb24gZXJyb3Igd2lsbCBiZSBzaG93biBvdXRzaWRlIHRoZSBtb2RhbCAobG9uZyBtZXNzYWdlcykuCisgICAgLy8gb3ZlcmZsb3c6IGhpZGRlbjsKKworICAgIC5zZGMtd2l6YXJkLWxlZnQtY29udGVudCB7CisgICAgICAgIHdpZHRoOiA0MDBweDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKworICAgICAgICAud2l6YXJkLXN0ZXBzLWxpbmUgeworICAgICAgICAgICAgcGFkZGluZzogMCA4MHB4IDAgMDsKKyAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAuc2RjLXdpemFyZC1yaWdodC1jb250ZW50IHsKKyAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMDBweDsKKyAgICAgICAgLyogYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsgKi8KKyAgICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgICAgICAgLy8uYW5pbWF0aW9uLWR1cmF0aW9uKDJzKTsKKworICAgICAgICAuc2RjLXdpemFyZC1yaWdodC1pbmNsdWRlIHsKKworICAgICAgICB9CisgICAgfQorCit9CisKKy5zcHJpdGUtZ3JlZW4tdGljay5hbmltYXRlZCB7CisgICAgLmFuaW1hdGlvbi1kdXJhdGlvbigzcyk7Cit9CisKKy5zZGMtd2l6YXJkLW5hbWUtdHlwZS1sYWJlbCB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNjRweDsKKyAgICByaWdodDogNDBweDsKKworICAgIHNwYW4geworICAgICAgICAuYl83OworICAgICAgICAmLm5hbWUgey5ib2xkO30KKyAgICAgICAgJi5zcHJpdGUtZ3JlZW4tdGljayB7CisgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICBsZWZ0OiAtMjJweDsKKyAgICAgICAgICAgIHRvcDogNXB4OworICAgICAgICB9CisgICAgfQorCit9CisKKy53LXdpemFyZC1mb290ZXIgeworICAgIGJ1dHRvbi5jYW5jZWwgeworICAgICAgICBtYXJnaW4tcmlnaHQ6IDEyMHB4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1jcmVhdGlvbi1iYXNlLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvd2l6YXJkLWNyZWF0aW9uLWJhc2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1ZDNhZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1jcmVhdGlvbi1iYXNlLnRzCkBAIC0wLDAgKzEsMzk5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzLldpemFyZCB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIFN0ZXBOYW1lcyB7CisgICAgICAgIHN0YXRpYyBnZW5lcmFsID0gIkdlbmVyYWwiOworICAgICAgICBzdGF0aWMgaWNvbiA9ICJJY29uIjsKKyAgICAgICAgc3RhdGljIGRlcGxveW1lbnRBcnRpZmFjdCA9ICJEZXBsb3ltZW50IEFydGlmYWN0IjsKKyAgICAgICAgc3RhdGljIGluZm9ybWF0aW9uQXJ0aWZhY3QgPSAiSW5mb3JtYXRpb24gQXJ0aWZhY3QiOworICAgICAgICBzdGF0aWMgcHJvcGVydGllcyA9ICJQcm9wZXJ0aWVzIjsKKyAgICAgICAgc3RhdGljIGhpZXJhcmNoeSA9ICJIaWVyYXJjaHkiOworICAgIH0KKworICAgIGNsYXNzIEZvb3RlckJ1dHRvbnMgeworICAgICAgICBzdGF0aWMgY2FuY2VsID0gIkNhbmNlbCI7CisgICAgICAgIHN0YXRpYyBiYWNrID0gIkJhY2siOworICAgICAgICBzdGF0aWMgbmV4dCA9ICJOZXh0IjsKKyAgICAgICAgc3RhdGljIGZpbmlzaCA9ICJGaW5pc2giOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBXaXphcmRDcmVhdGlvblR5cGVzIHsKKyAgICAgICAgc3RhdGljIGltcG9ydEFzc2V0ID0gImltcG9ydEFzc2V0IjsKKyAgICAgICAgc3RhdGljIGNyZWF0ZSA9ICJjcmVhdGUiOworICAgICAgICBzdGF0aWMgZWRpdCA9ICJlZGl0IjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgX0NyZWF0aW9uU3RlcCB7CisgICAgICAgIG5hbWU6c3RyaW5nOworICAgICAgICB1cmw6c3RyaW5nOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBDdXJyZW50U3RlcCB7CisgICAgICAgIGFzc2V0Q3JlYXRpb25TdGVwOl9DcmVhdGlvblN0ZXA7CisgICAgICAgIHJlZmVyZW5jZTpJV2l6YXJkQ3JlYXRpb25TdGVwOworICAgICAgICBpbmRleDpudW1iZXI7CisgICAgICAgIHZhbGlkOiBib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVdpemFyZENyZWF0aW9uU3RlcCB7CisgICAgICAgIHNhdmUoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQ7CisgICAgICAgIGJhY2soY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJV2l6YXJkQ3JlYXRpb25TdGVwU2NvcGUgZXh0ZW5kcyBuZy5JU2NvcGUgeworICAgICAgICBkYXRhOmFueTsKKyAgICAgICAgZ2V0Q29tcG9uZW50KCk6U2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgc2V0Q29tcG9uZW50KGNvbXBvbmVudDogU2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZDsKKyAgICAgICAgcmVnaXN0ZXJDaGlsZChjaGlsZDpJV2l6YXJkQ3JlYXRpb25TdGVwKTp2b2lkOyAvLyBDYWxsZWQgZnJvbSB0aGUgc3RlcAorICAgICAgICBzZXRWYWxpZFN0YXRlKHZhbGlkOmJvb2xlYW4pOnZvaWQ7IC8vIENhbGxlZCBmcm9tIHRoZSBzdGVwCisgICAgfQorCisgICAgZXhwb3J0IGludGVyZmFjZSBJV2l6YXJkQ3JlYXRpb25TY29wZSBleHRlbmRzIG5nLklTY29wZSB7CisgICAgICAgIGlzTG9hZGluZzogYm9vbGVhbjsKKyAgICAgICAgZGF0YTphbnk7IC8vIGRhdGEgcGFzc2VkIGZyb20gZGFzaGJvYXJkIChvcGVuZXIpLCBuZWVkIGl0IG9uIHRoZSBzY29wZSwgYmVjYXVzZSBnZW5lcmFsIHN0ZXAgd2lsbCB1c2UgdGhpcyAoZXh0ZW5kcyB0aGUgc2NvcGUpCisgICAgICAgIGRpcmVjdGl2ZVN0ZXBzOiBBcnJheTxTZGMuRGlyZWN0aXZlcy5JV2l6YXJkU3RlcD47IC8vIFN0ZXBzIGZvciB0aGUgZGlyZWN0aXZlLCBvbiB0aGUgc2NvcGUgKG9uIHRoZSBzY29wZSBiZWNhdXNlIG5lZWQgdG8gcGFzcyB0byBkaXJlY3RpdmUgdmlhIEhUTUwpCisgICAgICAgIHRlbXBsYXRlVXJsOiBzdHJpbmc7IC8vIE9uIHRoZSBzY29wZSBiZWNhdXNlIG5lZWQgdG8gcGFzcyB0byA8bmctaW5jbHVkZT4gdmlhIEhUTUwKKyAgICAgICAgZm9vdGVyQnV0dG9uczogQXJyYXk8U2RjLkRpcmVjdGl2ZXMuSVNkY01vZGFsQnV0dG9uPjsgLy8gV2l6YXJkIGZvb3RlciBidXR0b25zIChvbiB0aGUgc2NvcGUgYmVjYXVzZSBuZWVkIHRvIHBhc3MgdG8gZGlyZWN0aXZlIHZpYSBIVE1MKQorICAgICAgICBhc3NldENyZWF0aW9uQ29udHJvbDphbnk7IC8vIExpbmsgdG8gd2l6YXJkIGRpcmVjdGl2ZSBmdW5jdGlvbnMuCisgICAgICAgIG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZTsgLy8gUmVmZXJlbmNlIHRvIHRoZSBtb2RhbCwgc28gd2UgY2FuIGNsb3NlIGl0IChvbiB0aGUgc2NvcGUgYmVjYXVzZSBuZWVkIHRvIHBhc3MgdG8gZGlyZWN0aXZlIHZpYSBIVE1MKQorICAgICAgICBhc3NldE5hbWU6c3RyaW5nOworICAgICAgICBhc3NldFR5cGU6c3RyaW5nOworICAgICAgICBtb2RhbFRpdGxlOnN0cmluZzsKKyAgICAgICAgZ2V0Q29tcG9uZW50KCk6U2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgc2V0Q29tcG9uZW50KGNvbXBvbmVudDogU2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6dm9pZDsKKyAgICAgICAgcmVnaXN0ZXJDaGlsZChjaGlsZDpJV2l6YXJkQ3JlYXRpb25TdGVwKTp2b2lkOyAvLyBDYWxsZWQgZnJvbSB0aGUgc3RlcAorICAgICAgICBzZXRWYWxpZFN0YXRlKHZhbGlkOmJvb2xlYW4pOnZvaWQ7IC8vIENhbGxlZCBmcm9tIHRoZSBzdGVwCisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFdpemFyZENyZWF0aW9uQmFzZVZpZXdNb2RlbCB7CisKKyAgICAgICAgY29tcG9uZW50OiBTZGMuTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBwcm90ZWN0ZWQgYXNzZXRDcmVhdGlvblN0ZXBzOiBBcnJheTxfQ3JlYXRpb25TdGVwPjsgLy8gQ29udGFpbnMgVVJMIGFuZCBuYW1lIHNvIHdlIGNhbiByZXBsYWNlIHRoZW0KKyAgICAgICAgY3VycmVudFN0ZXA6Q3VycmVudFN0ZXA7CisgICAgICAgIHByb3RlY3RlZCB0eXBlOnN0cmluZzsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgJHNjb3BlOklXaXphcmRDcmVhdGlvblNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZGF0YTphbnksCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBDb21wb25lbnRGYWN0b3J5OiBVdGlscy5Db21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgJG1vZGFsSW5zdGFuY2U6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UKKyAgICAgICAgICApIHsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0gbmV3IEN1cnJlbnRTdGVwKCk7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwLnZhbGlkPWZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kYWxJbnN0YW5jZSA9IHRoaXMuJG1vZGFsSW5zdGFuY2U7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy5ub0JhY2tzcGFjZU5hdigpOworCisgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBtb2RhbCB3YXMgb3BlbmVkIHdpdGggZmlsbGVkIHJlc291cmNlIChlZGl0IG1vZGUpLgorICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50KXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50KGRhdGEuY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRUeXBlID0gdGhpcy4kc2NvcGUuZ2V0Q29tcG9uZW50KCkuY29tcG9uZW50VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCk9PnsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2FmZUFwcGx5KHRoaXMuc2V0Q3VycmVudFN0ZXBCeUluZGV4KDAsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0sMTAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBzdGVwIHRvIHN0YXJ0IHdpdGgKKyAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKT0+eworICAgICAgICAgICAgICAgICAgICB0aGlzLnNhZmVBcHBseSh0aGlzLnNldEN1cnJlbnRTdGVwQnlJbmRleCgwLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIH0sMTAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzYWZlQXBwbHkgPSAoZm46YW55KSA9PiB7CisgICAgICAgICAgICBsZXQgcGhhc2UgPSB0aGlzLiRzY29wZS4kcm9vdC4kJHBoYXNlOworICAgICAgICAgICAgaWYgKHBoYXNlID09ICckYXBwbHknIHx8IHBoYXNlID09ICckZGlnZXN0JykgeworICAgICAgICAgICAgICAgIGlmIChmbiAmJiAodHlwZW9mKGZuKSA9PT0gJ2Z1bmN0aW9uJykpIHsKKyAgICAgICAgICAgICAgICAgICAgZm4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLiRhcHBseShmbik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgLy8gQ29udHJvbCB0byBjYWxsIGZ1bmN0aW9ucyBvbiB3aXphcmQgc3RlcCBkaXJlY3RpdmUKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFzc2V0Q3JlYXRpb25Db250cm9sID0ge307CisKKyAgICAgICAgICAgIC8vIEZvb3RlciBidXR0b25zIGRlZmluaXRpb25zIGZvciB0aGUgbW9kYWwgZGlyZWN0aXZlLgorICAgICAgICAgICAgdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9ucyA9IFsKKyAgICAgICAgICAgICAgICB7Im5hbWUiOkZvb3RlckJ1dHRvbnMuY2FuY2VsLCAgICJjc3MiOid3aGl0ZSBjYW5jZWwnLCJjYWxsYmFjayI6ICgpPT57dGhpcy5idG5DYW5jZWxDbGlja2VkKCk7fX0sCisgICAgICAgICAgICAgICAgeyJuYW1lIjpGb290ZXJCdXR0b25zLmJhY2ssICAgICAiZGlzYWJsZWQiOnRydWUsICJjc3MiOid3aGl0ZSBiYWNrJywiY2FsbGJhY2siOiAoKT0+e3RoaXMuYnRuQmFja0NsaWNrZWQoKTt9fSwKKyAgICAgICAgICAgICAgICB7Im5hbWUiOkZvb3RlckJ1dHRvbnMubmV4dCwgICAgICJkaXNhYmxlZCI6dHJ1ZSwgImNzcyI6J2JsdWUgbmV4dCcsImNhbGxiYWNrIjogKCk9Pnt0aGlzLmJ0bk5leHRDbGlja2VkKCk7fX0sCisgICAgICAgICAgICAgICAgeyJuYW1lIjpGb290ZXJCdXR0b25zLmZpbmlzaCwgICAiZGlzYWJsZWQiOnRydWUsICJjc3MiOid3aGl0ZSBmaW5pc2gnLCJjYWxsYmFjayI6ICgpPT57dGhpcy5idG5GaW5pc2hlZENsaWNrZWQoKTt9fQorICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgLy8gV2lsbCBiZSBjYWxsZWQgZnJvbSBzdGVwIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyIGhpbS4KKyAgICAgICAgICAgIC8vIFNvIHRoZSBjdXJyZW50IHN0ZXAgd2lsbCBiZSB0aGUgcmVmZXJlbmNlLgorICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVnaXN0ZXJDaGlsZD0oY2hpbGQ6SVdpemFyZENyZWF0aW9uU3RlcCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC5yZWZlcmVuY2U9Y2hpbGQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXaWxsIGJlIGNhbGxlZCBmcm9tIGVhY2ggc3RlcCB0byBub3RpZnkgaWYgdGhlIHN0ZXAgaXMgdmFsaWQKKyAgICAgICAgICAgIC8vIFRoZSB3aXphcmQgd2lsbCBzZXQgdGhlICJOZXh0IiwgIkZpbmlzaCIgYnV0dG9ucyBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUgPSAodmFsaWQ6Ym9vbGVhbik6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC52YWxpZD12YWxpZDsKKyAgICAgICAgICAgICAgICBsZXQgY3VycmVudERpcmVjdGl2ZVN0ZXA6U2RjLkRpcmVjdGl2ZXMuSVdpemFyZFN0ZXAgPSB0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwc1t0aGlzLmN1cnJlbnRTdGVwLmluZGV4XTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hc3NldENyZWF0aW9uQ29udHJvbC5zZXRTdGVwVmFsaWRpdHkoY3VycmVudERpcmVjdGl2ZVN0ZXAsIHZhbGlkKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZvb3RlckJ1dHRvbnNTdGF0ZU1hY2hpbmUoKTsKKyAgICAgICAgICAgICAgICB0aGlzLndpemFyZEJ1dHRvbnNJY29uc1N0YXRlTWFjaGluZSgpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBXaWxsIGJlIGNhbGxlZCBmcm9tIGVhY2ggc3RlcCB0byBnZXQgY3VycmVudCBlbnRpdHkuCisgICAgICAgICAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIGNvcHkgb2YgdGhlIGVudGl0eSAobm90IHJlZmVyZW5jZSksIGJlY2F1c2UgSSBkbyBub3Qgd2FudCB0aGF0IHRoZSBzdGVwIHdpbGwgY2hhbmdlIGVudGl0eSBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICogSWYgdGhlIHN0ZXAgbmVlZCB0byB1cGRhdGUgdGhlIGVudGl0eSBpdCBjYW4gY2FsbCBzZXRDb21wb25lbnQgZnVuY3Rpb24uCisgICAgICAgICAgICAgKiBAcmV0dXJucyB7U2RjLk1vZGVscy5JRW50aXR5fQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRDb21wb25lbnQgPSAoKTpTZGMuTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXaWxsIGJlIGNhbGxlZCBmcm9tIGVhY2ggc3RlcCBhZnRlciBzYXZlIHRvIHVwZGF0ZSB0aGUgcmVzb3VyY2UuCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRDb21wb25lbnQgPSAoY29tcG9uZW50OlNkYy5Nb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgICAgICAgfTsKKworICAgICAgICB9OworCisgICAgICAgIHByb3RlY3RlZCBzZXRDdXJyZW50U3RlcEJ5TmFtZSA9IChzdGVwTmFtZTpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgbGV0IHN0ZXBJbmRleDpudW1iZXIgPSB0aGlzLmdldFN0ZXBJbmRleChzdGVwTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5SW5kZXgoc3RlcEluZGV4KTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBTZXQgdGhlIGN1cnJlbnQgc3RlcCwgY2hhbmdlIHRoZSBVUkwgaW4gbmctaW5jbHVkZS4KKyAgICAgICAgcHJvdGVjdGVkIHNldEN1cnJlbnRTdGVwQnlJbmRleCA9IChpbmRleDpudW1iZXIsIGRvU2F2ZTpib29sZWFuPXRydWUpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgbGV0IHJlc3VsdDpib29sZWFuID0gZmFsc2U7CisgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcC5pbmRleCE9PWluZGV4KSB7IC8vIENoZWNrIHRoYXQgbm90IHByZXNzaW5nIG9uIHNhbWUgc3RlcCwgYWxzbyB0aGUgZmlyc3QgdGltZSBjdXJyZW50U3RlcEluZGV4PXVuZGVmaW5lZAorICAgICAgICAgICAgICAgIGlmIChkb1NhdmU9PT10cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFN0ZXBTYXZlKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2VjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgaWYgc3VjY2VzcyBzYXZlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgY3VycmVudCBzdGVwIGluIHRoZSBsZWZ0IHdpemFyZCBkaXJlY3RpdmUgPSB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnREaXJlY3RpdmVTdGVwOlNkYy5EaXJlY3RpdmVzLklXaXphcmRTdGVwID0gdGhpcy4kc2NvcGUuZGlyZWN0aXZlU3RlcHNbdGhpcy5jdXJyZW50U3RlcC5pbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hc3NldENyZWF0aW9uQ29udHJvbC5zZXRTdGVwVmFsaWRpdHkoY3VycmVudERpcmVjdGl2ZVN0ZXAsIHRydWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIG5leHQgc3RlcAorICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXA6X0NyZWF0aW9uU3RlcCA9IHRoaXMuYXNzZXRDcmVhdGlvblN0ZXBzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAuYXNzZXRDcmVhdGlvblN0ZXAgPSBzdGVwOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudGVtcGxhdGVVcmwgPSBzdGVwLnVybDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBuZXh0L2JhY2sgYnV0dG9ucyBhbmQgc3RlcHMgYnV0dG9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyQnV0dG9uc1N0YXRlTWFjaGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53aXphcmRCdXR0b25zSWNvbnNTdGF0ZU1hY2hpbmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIG5vdCBwZXJmb3JtIHN0ZXAgY2xpY2sgd2l0aG91dCBlbmFibGluZyB0aGUgc3RlcAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGlyZWN0aXZlU3RlcHNbaW5kZXhdLmVuYWJsZWQgPSB0cnVlOyAvLyBOZWVkIHRvIHNldCB0aGUgc3RlcCBlbmFibGVkLCBiZWZvcmUgY2xpY2tpbmcgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hc3NldENyZWF0aW9uQ29udHJvbC5zdGVwQ2xpY2tlZChzdGVwLm5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBzYXZpbmcgdGhlIGFzc2V0IG5hbWUgYW5kIHR5cGUgd2lsbCBiZSBzaG93biBpbiB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBzY3JlZW4uCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGxBc3NldE5hbWVBbmRUeXBlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD10cnVlOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXA6X0NyZWF0aW9uU3RlcCA9IHRoaXMuYXNzZXRDcmVhdGlvblN0ZXBzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcC5pbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwLmFzc2V0Q3JlYXRpb25TdGVwPXN0ZXA7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRlbXBsYXRlVXJsID0gc3RlcC51cmw7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRpcmVjdGl2ZVN0ZXBzW2luZGV4XS5lbmFibGVkID0gdHJ1ZTsgLy8gTmVlZCB0byBzZXQgdGhlIHN0ZXAgZW5hYmxlZCwgYmVmb3JlIGNsaWNraW5nIGl0LgorICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hc3NldENyZWF0aW9uQ29udHJvbC5zdGVwQ2xpY2tlZChzdGVwLm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3RoaXMudXBkYXRlRm9vdGVyQnV0dG9uc1N0YXRlcygpOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdD10cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHN0ZXAKKyAgICAgICAgcHJpdmF0ZSBjYWxsU3RlcFNhdmUgPSAoc3VjY2Vzc0NhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwLnJlZmVyZW5jZS5zYXZlKChyZXN1bHQ6Ym9vbGVhbik9PnsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0PT09dHJ1ZSl7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV4dCBhbmQgZmluaXNoIGJ1dHRvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAvL3RoaXMudXBkYXRlRm9vdGVyQnV0dG9uc1N0YXRlcyh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHN0ZXAKKyAgICAgICAgcHJpdmF0ZSBjYWxsU3RlcEJhY2sgPSAoc3VjY2Vzc0NhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwLnJlZmVyZW5jZS5iYWNrKChyZXN1bHQ6Ym9vbGVhbik9PnsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0PT09dHJ1ZSl7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV4dCBhbmQgZmluaXNoIGJ1dHRvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAvL3RoaXMudXBkYXRlRm9vdGVyQnV0dG9uc1N0YXRlcyh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGdldFN0ZXBJbmRleCA9IChzdGVwTmFtZTpzdHJpbmcpOm51bWJlciA9PiB7CisgICAgICAgICAgICBsZXQgaW5kZXg6bnVtYmVyPS0xOworICAgICAgICAgICAgbGV0IHRtcCA9IF8uZmluZCh0aGlzLmFzc2V0Q3JlYXRpb25TdGVwcywgZnVuY3Rpb24gKGl0ZW0sIGluZHgpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZHg7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gc3RlcE5hbWU7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGJ0bk5leHRDbGlja2VkID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBpZiAodGhpcy5oYXNOZXh0KCk9PT10cnVlKSB7CisgICAgICAgICAgICAgICAgbGV0IHRtcCA9IHRoaXMuY3VycmVudFN0ZXAuaW5kZXgrMTsKKyAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRTdGVwQnlJbmRleCh0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYnRuQmFja0NsaWNrZWQgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmhhc0JhY2soKT09PXRydWUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNhbGxTdGVwQmFjaygoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCB0bXAgPSB0aGlzLmN1cnJlbnRTdGVwLmluZGV4LTE7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudFN0ZXBCeUluZGV4KHRtcCwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYnRuQ2FuY2VsQ2xpY2tlZCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kbW9kYWxJbnN0YW5jZS5kaXNtaXNzKHRoaXMuJHNjb3BlLmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGJ0bkZpbmlzaGVkQ2xpY2tlZCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy5jYWxsU3RlcFNhdmUoKCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsSW5zdGFuY2UuY2xvc2UodGhpcy4kc2NvcGUuZ2V0Q29tcG9uZW50KCkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIG1vdmUgbmV4dAorICAgICAgICBwcml2YXRlIGhhc05leHQgPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmFzc2V0Q3JlYXRpb25TdGVwcy5sZW5ndGgtMT50aGlzLmN1cnJlbnRTdGVwLmluZGV4KXsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBtb3ZlIGJhY2sKKyAgICAgICAgcHJpdmF0ZSBoYXNCYWNrID0gKCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcC5pbmRleD09PTApeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBmaWxsQXNzZXROYW1lQW5kVHlwZT0oKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFzc2V0TmFtZSA9IHRoaXMuJHNjb3BlLmdldENvbXBvbmVudCgpLm5hbWU7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5hc3NldFR5cGUgPSB0aGlzLiRzY29wZS5nZXRDb21wb25lbnQoKS5nZXRDb21wb25lbnRTdWJUeXBlKCk7CisKKyAgICAgICAgfTsKKworICAgICAgICBwcm90ZWN0ZWQgZW5hYmxlQWxsV2l6YXJkU3RlcHM9KCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwcy5mb3JFYWNoKChzdGVwOlNkYy5EaXJlY3RpdmVzLklXaXphcmRTdGVwKSA9PiB7CisgICAgICAgICAgICAgICAgc3RlcC5lbmFibGVkPXRydWU7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcm90ZWN0ZWQgZGlzYWJsZUFsbFdpemFyZFN0ZXBzPSgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGlyZWN0aXZlU3RlcHMuZm9yRWFjaCgoc3RlcDpTZGMuRGlyZWN0aXZlcy5JV2l6YXJkU3RlcCkgPT4geworICAgICAgICAgICAgICAgIHN0ZXAuZW5hYmxlZD1mYWxzZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZm9vdGVyQnV0dG9uc1N0YXRlTWFjaGluZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiZm9vdGVyQnV0dG9uc1N0YXRlTWFjaGluZSwgY3VycmVudCBzdGVwIHZhbGlkaXR5OiAiICsgdGhpcy5jdXJyZW50U3RlcC52YWxpZCk7CisgICAgICAgICAgICBsZXQgc3RlcEluZGV4Om51bWJlciA9IHRoaXMuY3VycmVudFN0ZXAuaW5kZXg7CisgICAgICAgICAgICBsZXQgY2FuY2VsQnV0dG9uID0gdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9uc1swXTsKKyAgICAgICAgICAgIGxldCBiYWNrQnV0dG9uID0gdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9uc1sxXTsKKyAgICAgICAgICAgIGxldCBuZXh0QnV0dG9uID0gdGhpcy4kc2NvcGUuZm9vdGVyQnV0dG9uc1syXTsKKyAgICAgICAgICAgIGxldCBmaW5pc2hCdXR0b24gPSB0aGlzLiRzY29wZS5mb290ZXJCdXR0b25zWzNdOworCisgICAgICAgICAgICAvLyBORVhUIGJ1dHRvbgorICAgICAgICAgICAgLy8gRGlzYWJsZSBuZXh0IGJ1dHRvbiBpZiBpdCBpcyB0aGUgbGFzdCBzdGVwLCBhbmQgaWYgbm90IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc3RlcC4KKyAgICAgICAgICAgIGlmICh0aGlzLmhhc05leHQoKSl7CisgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbi5kaXNhYmxlZCA9ICF0aGlzLmN1cnJlbnRTdGVwLnZhbGlkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXh0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQkFDSyBidXR0b24KKyAgICAgICAgICAgIGJhY2tCdXR0b24uZGlzYWJsZWQgPSAhdGhpcy5oYXNCYWNrKCk7CisKKyAgICAgICAgICAgIC8vIEZJTklTSCBidXR0b24KKyAgICAgICAgICAgIC8vIElmIHN0ZXAgMiBpcyB2YWxpZCBzaG93IHRoZSBmaW5pc2ggYnV0dG9uLgorICAgICAgICAgICAgaWYgKHN0ZXBJbmRleD49MSAmJiB0aGlzLmN1cnJlbnRTdGVwLnZhbGlkPT09dHJ1ZSkgeworICAgICAgICAgICAgICAgIGZpbmlzaEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAudmFsaWQ9PT1mYWxzZSl7CisgICAgICAgICAgICAgICAgZmluaXNoQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRURJVAorICAgICAgICAgICAgaWYgKHRoaXMudHlwZT09PVdpemFyZENyZWF0aW9uVHlwZXMuZWRpdCAmJiB0aGlzLmN1cnJlbnRTdGVwLnZhbGlkPT09dHJ1ZSl7CisgICAgICAgICAgICAgICAgZmluaXNoQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKworCisKKyAgICAgICAgcHJpdmF0ZSB3aXphcmRCdXR0b25zSWNvbnNTdGF0ZU1hY2hpbmUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgLy8gRW5hYmxlIG9yIGRpc2FibGUgd2l6YXJkIGRpcmVjdGl2ZSBuZXh0IHN0ZXAsIGluIGNhc2UgdGhlIGN1cnJlbnQgc3RlcCBmb3JtIGlzIHZhbGlkIG9yIG5vdC4KKyAgICAgICAgICAgIGxldCBzdGVwSW5kZXg6bnVtYmVyID0gdGhpcy5jdXJyZW50U3RlcC5pbmRleDsKKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwc1tzdGVwSW5kZXggKyAxXSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRpcmVjdGl2ZVN0ZXBzW3N0ZXBJbmRleCArIDFdLmVuYWJsZWQgPSB0aGlzLmN1cnJlbnRTdGVwLnZhbGlkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbiBjYXNlIHN0ZXAgMSBhbmQgMiBhcmUgdmFsaWQsIHdlIGNhbiBvcGVuIGFsbCBvdGhlciBzdGVwcy4KKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwc1swXS52YWxpZD09PXRydWUgJiYgdGhpcy4kc2NvcGUuZGlyZWN0aXZlU3RlcHNbMV0udmFsaWQ9PT10cnVlKXsKKyAgICAgICAgICAgICAgICAvLyBFbmFibGUgYWxsIHdpemFyZCBkaXJlY3RpdmUgc3RlcHMKKyAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUFsbFdpemFyZFN0ZXBzKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFN0ZXAudmFsaWQ9PT1mYWxzZSkgeworICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYWxsIHN0ZXBzCisgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQWxsV2l6YXJkU3RlcHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIG5vQmFja3NwYWNlTmF2OkZ1bmN0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS4kb24oJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgKGV2ZW50LCBuZXdVcmwsIG9sZFVybCk6dm9pZCA9PnsKKyAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgfSkKKyAgICAgICAgfTsKKworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtc3RhdGUvY3JlYXRlLXdpemFyZC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1zdGF0ZS9jcmVhdGUtd2l6YXJkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTBjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtc3RhdGUvY3JlYXRlLXdpemFyZC50cwpAQCAtMCwwICsxLDExNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMy8xNS8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMuV2l6YXJkIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgY2xhc3MgQ3JlYXRlV2l6YXJkVmlld01vZGVsIGV4dGVuZHMgV2l6YXJkQ3JlYXRpb25CYXNlVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnZGF0YScsCisgICAgICAgICAgICAnQ29tcG9uZW50RmFjdG9yeScsCisgICAgICAgICAgICAnJG1vZGFsSW5zdGFuY2UnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHVibGljICRzY29wZTpJV2l6YXJkQ3JlYXRpb25TY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGRhdGE6YW55LAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50RmFjdG9yeTogU2RjLlV0aWxzLkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAkbW9kYWxJbnN0YW5jZTogbmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSkgeworCisgICAgICAgICAgICBzdXBlcigkc2NvcGUsIGRhdGEsIENvbXBvbmVudEZhY3RvcnksICRtb2RhbEluc3RhbmNlKTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IFdpemFyZENyZWF0aW9uVHlwZXMuY3JlYXRlOworICAgICAgICAgICAgdGhpcy5pbml0KCk7CisgICAgICAgICAgICB0aGlzLmluaXRDcmVhdGVBc3NldFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXQgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRhdGEuY29tcG9uZW50VHlwZSl7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRTogeworICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2V0Q3JlYXRpb25TdGVwcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5nZW5lcmFsLCAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvZ2VuZXJhbC1zdGVwL2dlbmVyYWwtc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaWNvbiwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuZGVwbG95bWVudEFydGlmYWN0LCAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMucHJvcGVydGllcywgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnRpZXMtc3RlcC9wcm9wZXJ0aWVzLXN0ZXAuaHRtbCd9CisgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuU0VSVklDRTogeworICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2V0Q3JlYXRpb25TdGVwcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5nZW5lcmFsLCAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvZ2VuZXJhbC1zdGVwL2dlbmVyYWwtc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaWNvbiwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC5odG1sJ30KKyAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5QUk9EVUNUOiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXRDcmVhdGlvblN0ZXBzID0gWworICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmdlbmVyYWwsICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9nZW5lcmFsLXN0ZXAvZ2VuZXJhbC1zdGVwLmh0bWwnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5oaWVyYXJjaHksICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaWNvbiwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC5odG1sJ30KKyAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdENyZWF0ZUFzc2V0U2NvcGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXRhLmNvbXBvbmVudFR5cGUpeworICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUkVTT1VSQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGlyZWN0aXZlU3RlcHMgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuZ2VuZXJhbCwgImVuYWJsZWQiOiB0cnVlLCAiY2FsbGJhY2siOiAoKT0+IHtyZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMuZ2VuZXJhbCk7fX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaWNvbiwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmljb24pO319LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmRlcGxveW1lbnRBcnRpZmFjdCwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmRlcGxveW1lbnRBcnRpZmFjdCk7fX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmluZm9ybWF0aW9uQXJ0aWZhY3QpO319LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLnByb3BlcnRpZXMsICJlbmFibGVkIjogZmFsc2UsICJjYWxsYmFjayI6ICgpPT4ge3JldHVybiB0aGlzLnNldEN1cnJlbnRTdGVwQnlOYW1lKFN0ZXBOYW1lcy5wcm9wZXJ0aWVzKTt9fQorICAgICAgICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RhbFRpdGxlID0gIkNyZWF0ZSBWRiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlNFUlZJQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGlyZWN0aXZlU3RlcHMgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuZ2VuZXJhbCwgImVuYWJsZWQiOiB0cnVlLCAiY2FsbGJhY2siOiAoKT0+IHtyZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMuZ2VuZXJhbCk7fX0sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaWNvbiwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmljb24pO319LAorCisgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsVGl0bGUgPSAiQ3JlYXRlIFNlcnZpY2UiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5QUk9EVUNUOiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRpcmVjdGl2ZVN0ZXBzID0gWworICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmdlbmVyYWwsICJlbmFibGVkIjogdHJ1ZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmdlbmVyYWwpO319LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmhpZXJhcmNoeSwgImVuYWJsZWQiOmZhbHNlLCAiY2FsbGJhY2siOiAoKT0+IHtyZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMuaGllcmFyY2h5KTt9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5pY29uLCAiZW5hYmxlZCI6IGZhbHNlLCAiY2FsbGJhY2siOiAoKT0+IHtyZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMuaWNvbik7fX0KKyAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubW9kYWxUaXRsZSA9ICJDcmVhdGUgUHJvZHVjdCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1zdGF0ZS9lZGl0LXdpemFyZC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1zdGF0ZS9lZGl0LXdpemFyZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNjNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvd2l6YXJkLXN0YXRlL2VkaXQtd2l6YXJkLnRzCkBAIC0wLDAgKzEsMTY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzLldpemFyZCB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIEVkaXRXaXphcmRWaWV3TW9kZWwgZXh0ZW5kcyBXaXphcmRDcmVhdGlvbkJhc2VWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICdkYXRhJywKKyAgICAgICAgICAgICdDb21wb25lbnRGYWN0b3J5JywKKyAgICAgICAgICAgICckbW9kYWxJbnN0YW5jZScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3RvcihwdWJsaWMgJHNjb3BlOklXaXphcmRDcmVhdGlvblNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgZGF0YTphbnksCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb21wb25lbnRGYWN0b3J5OiBTZGMuVXRpbHMuQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljICRtb2RhbEluc3RhbmNlOiBuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlKSB7CisKKyAgICAgICAgICAgIHN1cGVyKCRzY29wZSwgZGF0YSwgQ29tcG9uZW50RmFjdG9yeSwgJG1vZGFsSW5zdGFuY2UpOworICAgICAgICAgICAgdGhpcy50eXBlID0gV2l6YXJkQ3JlYXRpb25UeXBlcy5lZGl0OworICAgICAgICAgICAgdGhpcy5pbml0KCk7CisgICAgICAgICAgICB0aGlzLmluaXRDcmVhdGVBc3NldFNjb3BlKCk7CisKKyAgICAgICAgICAgIC8vIEVuYWJsZSBhbGwgd2l6YXJkIGRpcmVjdGl2ZSBzdGVwcworICAgICAgICAgICAgdGhpcy5lbmFibGVBbGxXaXphcmRTdGVwcygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0ID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF0YS5jb21wb25lbnQuY29tcG9uZW50VHlwZSl7CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRTogeworICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuY29tcG9uZW50LmlzQ29tcGxleCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2V0Q3JlYXRpb25TdGVwcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogU3RlcE5hbWVzLmdlbmVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9nZW5lcmFsLXN0ZXAvZ2VuZXJhbC1zdGVwLmh0bWwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogU3RlcE5hbWVzLmljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9pY29ucy1zdGVwL2ljb25zLXN0ZXAuaHRtbCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBTdGVwTmFtZXMuZGVwbG95bWVudEFydGlmYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwL2FydGlmYWN0LWRlcGxveW1lbnQtc3RlcC5odG1sJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IFN0ZXBOYW1lcy5pbmZvcm1hdGlvbkFydGlmYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC9hcnRpZmFjdC1pbmZvcm1hdGlvbi1zdGVwLmh0bWwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogU3RlcE5hbWVzLnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0aWVzLXN0ZXAvcHJvcGVydGllcy1zdGVwLmh0bWwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2V0Q3JlYXRpb25TdGVwcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuZ2VuZXJhbCwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAuaHRtbCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5pY29uLCAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaWNvbnMtc3RlcC9pY29ucy1zdGVwLmh0bWwnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLnByb3BlcnRpZXMsICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0aWVzLXN0ZXAvcHJvcGVydGllcy1zdGVwLmh0bWwnfQorICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFOiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXRDcmVhdGlvblN0ZXBzID0gWworICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmdlbmVyYWwsICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9nZW5lcmFsLXN0ZXAvZ2VuZXJhbC1zdGVwLmh0bWwnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5pY29uLCAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaWNvbnMtc3RlcC9pY29ucy1zdGVwLmh0bWwnfQorICAgICAgICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5QUk9EVUNUOiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXRDcmVhdGlvblN0ZXBzID0gWworICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmdlbmVyYWwsICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9nZW5lcmFsLXN0ZXAvZ2VuZXJhbC1zdGVwLmh0bWwnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5oaWVyYXJjaHksICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaWNvbiwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC5odG1sJ30KKyAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdENyZWF0ZUFzc2V0U2NvcGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF0YS5jb21wb25lbnQuY29tcG9uZW50VHlwZSl7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUkVTT1VSQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5jb21wb25lbnQuaXNDb21wbGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBTdGVwTmFtZXMuZ2VuZXJhbCwgImVuYWJsZWQiOiB0cnVlLCAiY2FsbGJhY2siOiAoKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldEN1cnJlbnRTdGVwQnlOYW1lKFN0ZXBOYW1lcy5nZW5lcmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IFN0ZXBOYW1lcy5pY29uLCAiZW5hYmxlZCI6IGZhbHNlLCAiY2FsbGJhY2siOiAoKT0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldEN1cnJlbnRTdGVwQnlOYW1lKFN0ZXBOYW1lcy5pY29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IFN0ZXBOYW1lcy5kZXBsb3ltZW50QXJ0aWZhY3QsICJlbmFibGVkIjogZmFsc2UsICJjYWxsYmFjayI6ICgpPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmRlcGxveW1lbnRBcnRpZmFjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBTdGVwTmFtZXMucHJvcGVydGllcywgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMucHJvcGVydGllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmdlbmVyYWwsICJlbmFibGVkIjogdHJ1ZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmdlbmVyYWwpO319LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaWNvbiwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmljb24pO319LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmluZm9ybWF0aW9uQXJ0aWZhY3QpO319LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMucHJvcGVydGllcywgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLnByb3BlcnRpZXMpO319CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsVGl0bGUgPSAiRWRpdCAiICsgdGhpcy5kYXRhLmNvbXBvbmVudC5yZXNvdXJjZVR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFOiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuZ2VuZXJhbCwgImVuYWJsZWQiOiB0cnVlLCAiY2FsbGJhY2siOiAoKT0+IHtyZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMuZ2VuZXJhbCk7fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmljb24sICJlbmFibGVkIjogZmFsc2UsICJjYWxsYmFjayI6ICgpPT4ge3JldHVybiB0aGlzLnNldEN1cnJlbnRTdGVwQnlOYW1lKFN0ZXBOYW1lcy5pY29uKTt9fQorICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsVGl0bGUgPSAiRWRpdCBTZXJ2aWNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUFJPRFVDVDogeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGlyZWN0aXZlU3RlcHMgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmdlbmVyYWwsICJlbmFibGVkIjogdHJ1ZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmdlbmVyYWwpO319LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5oaWVyYXJjaHksICJlbmFibGVkIjpmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmhpZXJhcmNoeSk7fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmljb24sICJlbmFibGVkIjogZmFsc2UsICJjYWxsYmFjayI6ICgpPT4ge3JldHVybiB0aGlzLnNldEN1cnJlbnRTdGVwQnlOYW1lKFN0ZXBOYW1lcy5pY29uKTt9fQorICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsVGl0bGUgPSAiRWRpdCBQcm9kdWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtc3RhdGUvaW1wb3J0LXdpemFyZC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3dpemFyZC1zdGF0ZS9pbXBvcnQtd2l6YXJkLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTFiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtc3RhdGUvaW1wb3J0LXdpemFyZC50cwpAQCAtMCwwICsxLDY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzLldpemFyZCB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGNsYXNzIEltcG9ydFdpemFyZFZpZXdNb2RlbCBleHRlbmRzIFdpemFyZENyZWF0aW9uQmFzZVZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ2RhdGEnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEZhY3RvcnknLAorICAgICAgICAgICAgJyRtb2RhbEluc3RhbmNlJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHB1YmxpYyAkc2NvcGU6SVdpemFyZENyZWF0aW9uU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBkYXRhOmFueSwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIENvbXBvbmVudEZhY3Rvcnk6IFNkYy5VdGlscy5Db21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgJG1vZGFsSW5zdGFuY2U6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UpIHsKKworICAgICAgICAgICAgc3VwZXIoJHNjb3BlLCBkYXRhLCBDb21wb25lbnRGYWN0b3J5LCAkbW9kYWxJbnN0YW5jZSApOworICAgICAgICAgICAgdGhpcy50eXBlID0gV2l6YXJkQ3JlYXRpb25UeXBlcy5pbXBvcnRBc3NldDsKKyAgICAgICAgICAgIHRoaXMuaW5pdCgpOworICAgICAgICAgICAgdGhpcy5pbml0SW1wb3J0QXNzZXRTY29wZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0ID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLmFzc2V0Q3JlYXRpb25TdGVwcyA9IFsKKyAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuZ2VuZXJhbCwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAuaHRtbCd9LAorICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5pY29uLCAidXJsIjogJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvaWNvbnMtc3RlcC9pY29ucy1zdGVwLmh0bWwnfSwKKyAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCwgInVybCI6ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC5odG1sJ30sCisgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLnByb3BlcnRpZXMsICJ1cmwiOiAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0aWVzLXN0ZXAvcHJvcGVydGllcy1zdGVwLmh0bWwnfQorICAgICAgICAgICAgXTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRJbXBvcnRBc3NldFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXJlY3RpdmVTdGVwcyA9IFsKKyAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuZ2VuZXJhbCwgImVuYWJsZWQiOiB0cnVlLCAiY2FsbGJhY2siOiAoKT0+IHtyZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMuZ2VuZXJhbCk7fX0sCisgICAgICAgICAgICAgICAgeyJuYW1lIjogU3RlcE5hbWVzLmljb24sICJlbmFibGVkIjogZmFsc2UsICJjYWxsYmFjayI6ICgpPT4ge3JldHVybiB0aGlzLnNldEN1cnJlbnRTdGVwQnlOYW1lKFN0ZXBOYW1lcy5pY29uKTt9fSwKKyAgICAgICAgICAgICAgICB7Im5hbWUiOiBTdGVwTmFtZXMuaW5mb3JtYXRpb25BcnRpZmFjdCwgImVuYWJsZWQiOiBmYWxzZSwgImNhbGxiYWNrIjogKCk9PiB7cmV0dXJuIHRoaXMuc2V0Q3VycmVudFN0ZXBCeU5hbWUoU3RlcE5hbWVzLmluZm9ybWF0aW9uQXJ0aWZhY3QpO319LAorICAgICAgICAgICAgICAgIHsibmFtZSI6IFN0ZXBOYW1lcy5wcm9wZXJ0aWVzLCAiZW5hYmxlZCI6IGZhbHNlLCAiY2FsbGJhY2siOiAoKT0+IHtyZXR1cm4gdGhpcy5zZXRDdXJyZW50U3RlcEJ5TmFtZShTdGVwTmFtZXMucHJvcGVydGllcyk7fX0KKyAgICAgICAgICAgIF07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsVGl0bGUgPSAiSW1wb3J0IEFzc2V0IjsKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2FjdGl2aXR5LWxvZy9hY3Rpdml0eS1sb2cuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvYWN0aXZpdHktbG9nL2FjdGl2aXR5LWxvZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzA4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2FjdGl2aXR5LWxvZy9hY3Rpdml0eS1sb2cuaHRtbApAQCAtMCwwICsxLDg1IEBACis8ZGl2IGNsYXNzPSJhY3Rpdml0eS1sb2ciPgorCisgICAgPGRpdiBjbGFzcz0idGl0bGUtd3JhcHBlciI+CisgICAgICAgIDxkaXYgY2xhc3M9InRvcC1zZWFyY2giPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgY2xhc3M9InNlYXJjaC10ZXh0IgorICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJTZWFyY2giCisgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0ic2VhcmNoQmluZCIKKyAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJtYWluLW1lbnUtaW5wdXQtc2VhcmNoIgorICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IiAvPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Inctc2RjLXNlYXJjaC1pY29uIG1hZ25pZmljYXRpb24iPjwvc3Bhbj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb250YWluZXItZmxleCI+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlIiBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iPgorCisgICAgICAgICAgICA8IS0tIFRhYmxlIGhlYWRlcnMgLS0+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkIGZsZXgtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgaGVhZC1yb3cgaGFuZCBmbGV4LWl0ZW0iIG5nLXJlcGVhdD0iaGVhZGVyIGluIHRhYmxlSGVhZGVyc0xpc3QgdHJhY2sgYnkgJGluZGV4IiBkYXRhLW5nLWNsaWNrPSJzb3J0KGhlYWRlci5wcm9wZXJ0eSkiPnt7aGVhZGVyLnRpdGxlfX0KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1zaG93PSJzb3J0QnkgPT09IGhlYWRlci5wcm9wZXJ0eSIgY2xhc3M9InRhYmxlLWhlYWRlci1zb3J0LWFycm93IiBkYXRhLW5nLWNsYXNzPSJ7J2Rvd24nOiByZXZlcnNlLCAndXAnOiFyZXZlcnNlfSI+IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8IS0tIFRhYmxlIGJvZHkgLS0+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc3VwcHJlc3Mtc2Nyb2xsLXg9InRydWUiIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gSW4gY2FzZSB0aGUgbG9ncyBhcmUgZW1wdHkgLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0iIWFjdGl2aXR5TG9nIHx8IGFjdGl2aXR5TG9nLmxlbmd0aD09PTAiIGNsYXNzPSJuby1yb3ctdGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgbm8gbG9ncyB0byBkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9vcCBvbiBsb2dzIGxpc3QgLS0+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQ9Iml0ZW0gaW4gYWN0aXZpdHlMb2cgfCBmaWx0ZXI6IHNlYXJjaEJpbmQgfCBvcmRlckJ5OnNvcnRCeTpyZXZlcnNlIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9Iml0ZW0uZGF0ZUZvcm1hdCA9ICggaXRlbS5USU1FU1RBTVAucmVwbGFjZSgnIFVUQycsICcnKSB8IHN0cmluZ1RvRGF0ZUZpbHRlciB8IGRhdGU6ICdNTS9kZC95eXl5JzonVVRDJykrJyB8ICcrKGl0ZW0uVElNRVNUQU1QLnJlcGxhY2UoJyBVVEMnLCAnJykgfCBzdHJpbmdUb0RhdGVGaWx0ZXIgfCBkYXRlOiAnc2hvcnRUaW1lJzonVVRDJyApIgorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogY29tcG9uZW50ID09PSBzZWxlY3RlZENvbXBvbmVudH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iZG9TZWxlY3RDb21wb25lbnQoY29tcG9uZW50KTsiCisgICAgICAgICAgICAgICAgICAgICAgICA+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSIgc2RjLXNtYXJ0LXRvb2x0aXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLmRhdGVGb3JtYXR9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWN0aW9uIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiBzZGMtc21hcnQtdG9vbHRpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uQUNUSU9OfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbW1lbnQgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iIHNkYy1zbWFydC10b29sdGlwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5DT01NRU5UfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVzZXJuYW1lIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiBzZGMtc21hcnQtdG9vbHRpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uTU9ESUZJRVJ9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3RhdHVzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiBzZGMtc21hcnQtdG9vbHRpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uU1RBVFVTfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW5nLWNsYXNzPSJ7J3N1Y2Nlc3MnOiBpdGVtLlNUQVRVUz49JzIwMCcgJiYgaXRlbS5TVEFUVVM8PScyMDQnLCdlcnJvcic6IGl0ZW0uU1RBVFVTPCcyMDAnIHx8IGl0ZW0uU1RBVFVTPj0nMzAwJ30iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgICAgIDwvZGl2PjwhLS0gRW5kIHRhYmxlIGJvZHkgLS0+CisgICAgICAgIDwvZGl2PjwhLS0gRW5kIHRhYmxlIC0tPgorICAgIDwvZGl2PjwhLS0gRW5kIHRhYmxlLWNvbnRhaW5lci1mbGV4IC0tPgorCis8L2Rpdj4KKworCisKKzwhLS08ZGl2IG5nLXJlcGVhdD0iYWN0aXZpdHlEYXRlIGluICBhY3Rpdml0eURhdGVBcnJheSAiIGNsYXNzPSJ3LXNkYy1jb21wb25lbnQtdmlld2VyLXJpZ2h0LWFjdGl2aXR5LWxvZyIgPgorICAgIDxkaXYgY2xhc3M9Inctc2RjLWNvbXBvbmVudC12aWV3ZXItcmlnaHQtYWN0aXZpdHktbG9nLWRhdGUiID57e2FjdGl2aXR5RGF0ZSB8IGRhdGU6ICdsb25nRGF0ZSd9fTwvZGl2PgorICAgIDxkaXYgbmctcmVwZWF0PSJhY3Rpdml0eSBpbiBhY3Rpdml0eUxvZ1thY3Rpdml0eURhdGVdIHwgb3JkZXJCeTogJy1USU1FU1RBTVAnIj4KKyAgICAgICAgPGRpdiAgY2xhc3M9Inctc2RjLWNvbXBvbmVudC12aWV3ZXItcmlnaHQtYWN0aXZpdHktbG9nLXRpbWUiPnt7YWN0aXZpdHkuVElNRVNUQU1QLnJlcGxhY2UoIiBVVEMiLCAnJykgfCBzdHJpbmdUb0RhdGVGaWx0ZXIgfCBkYXRlOiAnbWVkaXVtVGltZSc6J1VUQyd9fTwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1jb21wb25lbnQtdmlld2VyLXJpZ2h0LWFjdGl2aXR5LWxvZy1jb250ZW50Ij57eyJBY3Rpb246ICIgKyBwYXJzZUFjdGlvbihhY3Rpdml0eS5BQ1RJT04pICsgIiBQZXJmb3JtZWQgYnk6ICIgKyBhY3Rpdml0eS5NT0RJRklFUiArICIgU3RhdHVzOiAiICsgYWN0aXZpdHkuU1RBVFVTfX08L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2Pi0tPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2FjdGl2aXR5LWxvZy9hY3Rpdml0eS1sb2cubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWJiM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLmxlc3MKQEAgLTAsMCArMSw4MyBAQAorLmFjdGl2aXR5LWxvZyB7CisKKyAgICBtYXJnaW4tdG9wOiAzMHB4OworCisgICAgLnRpdGxlLXdyYXBwZXIgeworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCAudGFibGUgLmJvZHkgLnNjcm9sbGJhci1jb250YWluZXIgeworICAgICAgICBtYXgtaGVpZ2h0OiA0NDhweDsKKyAgICB9CisgICAgCisgICAgLnZpZXctbW9kZSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluX2NvbG9yX3A7CisgICAgfQorCisgICAgLnRhYmxleworICAgICAgICBoZWlnaHQ6IDQ5MHB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMSkgeyB3aWR0aDogMjAwcHg7IH0KKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMikgeyBmbGV4LWdyb3c6IDIwOyB9CisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDMpIHsgZmxleC1ncm93OiAzMDsgfQorICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCg0KSB7IGZsZXgtZ3JvdzogMjA7IH0KKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNSkgeyB3aWR0aDogODBweDsgfQorCisgICAgICAgIC5zdWNjZXNzIHsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIHRvcDogMTFweDsKKyAgICAgICAgICAgIHJpZ2h0OiAyMHB4OworICAgICAgICAgICAgLnNwcml0ZS1uZXc7CisgICAgICAgICAgICAuc2RjLXN1Y2Nlc3M7CisgICAgICAgIH0KKworICAgICAgICAuZXJyb3IgeworICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgdG9wOiAxMXB4OworICAgICAgICAgICAgcmlnaHQ6IDIwcHg7CisgICAgICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgICAgIC5zZGMtZXJyb3I7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC5kYXRhLXJvdyB7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB9CisKKyAgICAudG9wLXNlYXJjaCB7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgICAgIGlucHV0LnNlYXJjaC10ZXh0IHsKKyAgICAgICAgICAgIC5ib3JkZXItcmFkaXVzKDJweCk7CisgICAgICAgICAgICB3aWR0aDogMjQ1cHg7CisgICAgICAgICAgICBoZWlnaHQ6IDMycHg7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBtYWluX2NvbG9yX287CisgICAgICAgICAgICBtYXJnaW46IDA7CisgICAgICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgICAgICAgdGV4dC1pbmRlbnQ6IDEwcHg7CisKKyAgICAgICAgICAgICY6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogU2FmYXJpLCBDaHJvbWUgYW5kIE9wZXJhICovCisgICAgICAgICAgICAmOi1tb3otcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRmlyZWZveCAxOC0gKi8KKyAgICAgICAgICAgICY6Oi1tb3otcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRmlyZWZveCAxOSsgKi8KKyAgICAgICAgICAgICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsgZm9udC1zdHlsZTogaXRhbGljOyB9IC8qIElFIDEwKyAqLworICAgICAgICAgICAgJjotbXMtaW5wdXQtcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogRWRnZSAqLworICAgICAgICB9CisKKyAgICAgICAgLm1hZ25pZmljYXRpb24geworICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgdG9wOiAxMHB4OworICAgICAgICAgICAgcmlnaHQ6IDEwcHg7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9hY3Rpdml0eS1sb2cvYWN0aXZpdHktbG9nLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NWQwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2FjdGl2aXR5LWxvZy9hY3Rpdml0eS1sb2cudHMKQEAgLTAsMCArMSwxMjIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUFjdGl2aXR5TG9nVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJV29ya3NwYWNlVmlld01vZGVsU2NvcGUgeworICAgICAgICBhY3Rpdml0eURhdGVBcnJheTogQXJyYXk8YW55PjsgLy90aGlzIGlzIGluIG9yZGVyIHRvIHNvcnQgdGhlIGRhdGVzCisgICAgICAgIGFjdGl2aXR5TG9nOiBBcnJheTxNb2RlbHMuQWN0aXZpdHk+OworICAgICAgICBwcmVWZXJzaW9uOnN0cmluZzsKKworICAgICAgICB0YWJsZUhlYWRlcnNMaXN0OiBBcnJheTxhbnk+OworICAgICAgICByZXZlcnNlOiBib29sZWFuOworICAgICAgICBzb3J0Qnk6c3RyaW5nOworICAgICAgICBzZWFyY2hCaW5kOnN0cmluZzsKKworICAgICAgICBnZXRBY3Rpdml0eUxvZyh1bmlxdWVJZDpzdHJpbmcpOnZvaWQ7CisgICAgICAgIG9uVmVyc2lvbkNoYW5nZWQodmVyc2lvbjphbnkpIDogdm9pZDsKKyAgICAgICAgcGFyc2VBY3Rpb24oYWN0aW9uOnN0cmluZyk6c3RyaW5nOworICAgICAgICBzb3J0KHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBBY3Rpdml0eUxvZ1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRzdGF0ZScsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkFjdGl2aXR5TG9nU2VydmljZScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJQWN0aXZpdHlMb2dWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGU6bmcudWkuSVN0YXRlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhY3Rpdml0eUxvZ1NlcnZpY2U6U2VydmljZXMuQWN0aXZpdHlMb2dTZXJ2aWNlCisgICAgICAgICAgICApIHsKKworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmluaXRTb3J0ZWRUYWJsZVNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVTZWxlY3RlZE1lbnVJdGVtKCk7CisKKyAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0IHNvcnRpbmcKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnRCeSA9ICdsb2dEYXRlJzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlKCk6dm9pZCB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnByZVZlcnNpb24gPSB0aGlzLiRzY29wZS5jb21wb25lbnQudmVyc2lvbjsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25WZXJzaW9uQ2hhbmdlZCA9ICh2ZXJzaW9uOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24udmVyc2lvbk51bWJlciAhPSB0aGlzLiRzY29wZS5jb21wb25lbnQudmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRBY3Rpdml0eUxvZyh2ZXJzaW9uLnZlcnNpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0QWN0aXZpdHlMb2cgPSAodW5pcXVlSWQ6YW55KTp2b2lkID0+IHsKKworICAgICAgICAgICAgICAgIGxldCBvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRmFpbGQnLCByZXNwb25zZSk7CisKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChyZXNwb25zZTpBcnJheTxNb2RlbHMuQWN0aXZpdHk+KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFjdGl2aXR5TG9nID0gXy5zb3J0QnkocmVzcG9uc2UsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uVElNRVNUQU1QOyB9KTsgLy9yZXNwb25zZTsgLy8KKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Jlc291cmNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpdml0eUxvZ1NlcnZpY2UuZ2V0QWN0aXZpdHlMb2dTZXJ2aWNlKCdyZXNvdXJjZXMnLCB1bmlxdWVJZCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50LmlzU2VydmljZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZpdHlMb2dTZXJ2aWNlLmdldEFjdGl2aXR5TG9nU2VydmljZSgnc2VydmljZXMnLCB1bmlxdWVJZCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKCF0aGlzLiRzY29wZS5hY3Rpdml0eUxvZyB8fCB0aGlzLiRzY29wZS5wcmVWZXJzaW9uICE9IHRoaXMuJHNjb3BlLmNvbXBvbmVudC52ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0QWN0aXZpdHlMb2codGhpcy4kc2NvcGUuY29tcG9uZW50LnVuaXF1ZUlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy4kc2NvcGUucGFyc2VBY3Rpb24gPSAoYWN0aW9uOnN0cmluZykgPT4geworICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb24gPyBhY3Rpb24uc3BsaXQoLyg/PVtBLVpdKS8pLmpvaW4oJyAnKSA6ICcnOworICAgICAgICAgICAgfTsKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U29ydGVkVGFibGVTY29wZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUudGFibGVIZWFkZXJzTGlzdCA9IFsKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdEYXRlJywgcHJvcGVydHk6ICdsb2dEYXRlJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnQWN0aW9uJywgcHJvcGVydHk6ICdsb2dBY3Rpb24nfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdDb21tZW50JywgcHJvcGVydHk6ICdsb2dDb21tZW50J30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnVXNlcm5hbWUnLCBwcm9wZXJ0eTogJ2xvZ1VzZXJuYW1lJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnU3RhdHVzJywgcHJvcGVydHk6ICdsb2dTdGF0dXMnfQorICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydCA9IChzb3J0Qnk6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gKHRoaXMuJHNjb3BlLnNvcnRCeSA9PT0gc29ydEJ5KSA/ICF0aGlzLiRzY29wZS5yZXZlcnNlIDogZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydEJ5ID0gc29ydEJ5OworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvYXR0cmlidXRlcy9hdHRyaWJ1dGVzLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2F0dHJpYnV0ZXMvYXR0cmlidXRlcy12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWRhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2F0dHJpYnV0ZXMvYXR0cmlidXRlcy12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMTA3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSUF0dHJpYnV0ZXNWaWV3TW9kZWxTY29wZSBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIHRhYmxlSGVhZGVyc0xpc3Q6IEFycmF5PGFueT47CisgICAgICAgIHJldmVyc2U6IGJvb2xlYW47CisgICAgICAgIHNvcnRCeTpzdHJpbmc7CisKKyAgICAgICAgYWRkT3JVcGRhdGVBdHRyaWJ1dGUoYXR0cmlidXRlPzpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOiB2b2lkOworICAgICAgICBkZWxldGUoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6IHZvaWQ7CisgICAgICAgIHNvcnQoc29ydEJ5OnN0cmluZyk6IHZvaWQ7CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZXNWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJworICAgICAgICBdOworCisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUF0dHJpYnV0ZXNWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRtb2RhbDpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTW9kYWxzSGFuZGxlcjpVdGlscy5Nb2RhbHNIYW5kbGVyKSB7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlU2VsZWN0ZWRNZW51SXRlbSgpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIG9wZW5FZGl0QXR0cmlidXRlTW9kYWwgPSAoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgdmlld01vZGVsc0h0bWxCYXNlUGF0aDpzdHJpbmcgPSAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzLyc7CisKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ2Zvcm1zL2F0dHJpYnV0ZS1mb3JtL2F0dHJpYnV0ZS1mb3JtLXZpZXcuaHRtbCcpLAorICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5BdHRyaWJ1dGVGb3JtVmlld01vZGVsJywKKyAgICAgICAgICAgICAgICBzaXplOiAnc2RjLW1kJywKKyAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAga2V5Ym9hcmQ6IGZhbHNlLAorICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlOiAoKTpNb2RlbHMuQXR0cmlidXRlTW9kZWwgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+IHRoaXMuJHNjb3BlLmNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgLy9sZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSAnbmFtZSc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudGFibGVIZWFkZXJzTGlzdCA9IFsKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdOYW1lJywgcHJvcGVydHk6ICduYW1lJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnVHlwZScsIHByb3BlcnR5OiAndHlwZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ0RlZmF1bHQgVmFsdWUnLCBwcm9wZXJ0eTogJ2RlZmF1bHRWYWx1ZSd9CisgICAgICAgICAgICBdOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydCA9IChzb3J0Qnk6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gKHRoaXMuJHNjb3BlLnNvcnRCeSA9PT0gc29ydEJ5KSA/ICF0aGlzLiRzY29wZS5yZXZlcnNlIDogZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydEJ5ID0gc29ydEJ5OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWRkT3JVcGRhdGVBdHRyaWJ1dGUgPSAoYXR0cmlidXRlPzpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMub3BlbkVkaXRBdHRyaWJ1dGVNb2RhbChhdHRyaWJ1dGUgPyBhdHRyaWJ1dGUgOiBuZXcgTW9kZWxzLkF0dHJpYnV0ZU1vZGVsKCkpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGVsZXRlID0gKGF0dHJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOnZvaWQgPT4geworCisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmRlbGV0ZUF0dHJpYnV0ZShhdHRyaWJ1dGUudW5pcXVlSWQpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGV0IHRpdGxlOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkFUVFJJQlVURV9WSUVXX0RFTEVURV9NT0RBTF9USVRMRSIpOworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkFUVFJJQlVURV9WSUVXX0RFTEVURV9NT0RBTF9URVhUIiwgInsnbmFtZSc6ICciICsgYXR0cmlidXRlLm5hbWUgKyAiJ30iKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBtZXNzYWdlLCBmYWxzZSkudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2F0dHJpYnV0ZXMvYXR0cmlidXRlcy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2F0dHJpYnV0ZXMvYXR0cmlidXRlcy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliYTkzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvYXR0cmlidXRlcy9hdHRyaWJ1dGVzLXZpZXcuaHRtbApAQCAtMCwwICsxLDUyIEBACis8ZGl2IGNsYXNzPSJ3b3Jrc3BhY2UtYXR0cmlidXRlcyI+CisgICAgPGRpdiBjbGFzcz0iYWRkLWJ0biIgZGF0YS10ZXN0cy1pZD0iYWRkLWF0dHJpYnV0ZS1idXR0b24iIG5nLWlmPSIhaXNWaWV3TW9kZSgpIgorICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzRGlzYWJsZU1vZGUoKX0iIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlQXR0cmlidXRlKCkiIGRhdGEtdGVzdHMtaWQ9ImFkZC1hdHRyaWJ1dGUtYnV0dG9uIj5BZGQ8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb250YWluZXItZmxleCI+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlIiBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZCBmbGV4LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIGhlYWQtcm93IGhhbmQgZmxleC1pdGVtIiBkYXRhLW5nLXJlcGVhdD0iaGVhZGVyIGluIHRhYmxlSGVhZGVyc0xpc3QgdHJhY2sgYnkgJGluZGV4IiBkYXRhLW5nLWNsaWNrPSJzb3J0KGhlYWRlci5wcm9wZXJ0eSkiPnt7aGVhZGVyLnRpdGxlfX0KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0ic29ydEJ5ID09PSBoZWFkZXIucHJvcGVydHkiIGNsYXNzPSJ0YWJsZS1oZWFkZXItc29ydC1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydkb3duJzogcmV2ZXJzZSwgJ3VwJzohcmV2ZXJzZX0iPiA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbm8tdGV4dC1oZWFkZXIgaGVhZC1yb3cgZmxleC1pdGVtIiBuZy1pZj0iIWlzVmlld01vZGUoKSI+PC9kaXY+CisgICAgICAgICAgICAgICAgPCEtLWRpdiBjbGFzcz0idGFibGUtbm8tdGV4dC1oZWFkZXIgaGVhZC1yb3cgZmxleC1pdGVtIj48L2Rpdi0tPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJjb21wb25lbnQuYXR0cmlidXRlcy5sZW5ndGggPT09IDAiIGNsYXNzPSJuby1yb3ctdGV4dCIgIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnOiBpc0Rpc2FibGVNb2RlKCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzIHRvIGRpc3BsYXkgPGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctaWY9IiFpc1ZpZXdNb2RlKCkiPiBjbGljayA8YSBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZUF0dHJpYnV0ZSgpIj5oZXJlPC9hPiB0byBhZGQgb25lIDwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1zdGFydD0iYXR0cmlidXRlIGluIGNvbXBvbmVudC5hdHRyaWJ1dGVzIHwgb3JkZXJCeTpzb3J0Qnk6cmV2ZXJzZSB0cmFjayBieSAkaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImZsZXgtY29udGFpbmVyIGRhdGEtcm93IiBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogYXR0cmlidXRlLnNlbGVjdGVkfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJhdHRyaWJ1dGUuc2VsZWN0ZWQgPSAhYXR0cmlidXRlLnNlbGVjdGVkIiBkYXRhLXRlc3RzLWlkPSJhdHRyaWJ1dGVzLXRhYmxlLXJvdyI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlIHRhYmxlLWFycm93IiBkYXRhLW5nLWNsYXNzPSJ7J29wZW5lZCc6IGF0dHJpYnV0ZS5zZWxlY3RlZH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS10ZXN0cy1pZD0ie3thdHRyaWJ1dGUubmFtZX19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXR0cmlidXRlLm5hbWV9fSI+e3thdHRyaWJ1dGUubmFtZX19PC9zcGFuPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiIGRhdGEtdGVzdHMtaWQ9Int7YXR0cmlidXRlLnR5cGV9fSIgZGF0YS1uZy1iaW5kPSJhdHRyaWJ1dGUudHlwZSI+PC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXR0cmlidXRlLmRlZmF1bHRWYWx1ZX19IiBkYXRhLXRlc3RzLWlkPSJ7e2F0dHJpYnV0ZS5kZWZhdWx0VmFsdWV9fSIgZGF0YS1uZy1iaW5kPSJhdHRyaWJ1dGUuZGVmYXVsdFZhbHVlIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtYnRuLWNvbCBmbGV4LWl0ZW0iIG5nLWlmPSIhaXNWaWV3TW9kZSgpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWJsZS1lZGl0LWJ0biIgZGF0YS10ZXN0cy1pZD0iZWRpdF97e2F0dHJpYnV0ZS5uYW1lfX0iIGRhdGEtbmctc2hvdz0iYXR0cmlidXRlLnBhcmVudFVuaXF1ZUlkPT1jb21wb25lbnQudW5pcXVlSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IiAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzVmlld01vZGUoKX0iPiA8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWJsZS1kZWxldGUtYnRuIiBkYXRhLXRlc3RzLWlkPSJkZWxldGVfe3thdHRyaWJ1dGUubmFtZX19IiAgZGF0YS1uZy1zaG93PSJhdHRyaWJ1dGUucGFyZW50VW5pcXVlSWQ9PWNvbXBvbmVudC51bmlxdWVJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9ImRlbGV0ZShhdHRyaWJ1dGUpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IiAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzVmlld01vZGUoKX0iPiA8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1lbmQ9IiIgZGF0YS1uZy1pZj0iYXR0cmlidXRlLnNlbGVjdGVkICYmIGF0dHJpYnV0ZS5kZXNjcmlwdGlvbiIgY2xhc3M9Iml0ZW0tb3BlbmVkIiBkYXRhLW5nLWJpbmQ9ImF0dHJpYnV0ZS5kZXNjcmlwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2F0dHJpYnV0ZXMvYXR0cmlidXRlcy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9hdHRyaWJ1dGVzL2F0dHJpYnV0ZXMubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQyOGFmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9hdHRyaWJ1dGVzL2F0dHJpYnV0ZXMubGVzcwpAQCAtMCwwICsxLDU0IEBACisud29ya3NwYWNlLWF0dHJpYnV0ZXMgeworCisgICAgd2lkdGg6IDkzJTsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgLnctc2RjLWNsYXNzaWMtYnRuIHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIH0KKworICAgIC50YWJsZXsKKyAgICAgICAgaGVpZ2h0OjQ5MHB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgIG1hcmdpbi10b3A6IDI3cHg7CisKKyAgICAgICAgLnRleHR7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMSkgeworICAgICAgICAgICAgZmxleC1ncm93OiAxNTsKKworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICBzcGFuLnRhYmxlLWFycm93IHsKKyAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDdweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDIpIHsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogNjsKKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDMpIHsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogOTsKKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDQpIHsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogMzsKKyAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNSkgeworICAgICAgICAgICAgZmxleC1ncm93OiAxOworCisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi9jb21wb3NpdGlvbi12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi9jb21wb3NpdGlvbi12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWVhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL2NvbXBvc2l0aW9uLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwyMzIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJQ29tcG9zaXRpb25WaWV3TW9kZWxTY29wZSBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSB7CisKKyAgICAgICAgY3VycmVudENvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBzZWxlY3RlZENvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBpc0xvYWRpbmc6IGJvb2xlYW47CisgICAgICAgIGdyYXBoQXBpOmFueTsKKyAgICAgICAgc2hhcmluZ1NlcnZpY2U6U2RjLlNlcnZpY2VzLlNoYXJpbmdTZXJ2aWNlOworICAgICAgICBzZGNNZW51Ok1vZGVscy5JQXBwTWVudTsKKyAgICAgICAgdmVyc2lvbjpzdHJpbmc7CisgICAgICAgIGlzVmlld09ubHk6Ym9vbGVhbjsKKyAgICAgICAgaXNMb2FkaW5nUmlnaHRQYW5lbDpib29sZWFuOworICAgICAgICBzZXRDb21wb25lbnQoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOworICAgICAgICBpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKTpib29sZWFuOworICAgICAgICB1cGRhdGVTZWxlY3RlZENvbXBvbmVudCgpOiB2b2lkCisgICAgICAgIG9wZW5VcGRhdGVNb2RhbCgpOworICAgICAgICBkZWxldGVTZWxlY3RlZENvbXBvbmVudEluc3RhbmNlKCk6dm9pZDsKKyAgICAgICAgb25CYWNrZ3JvdW5kQ2xpY2soKTp2b2lkOworICAgICAgICBzZXRTZWxlY3RlZEluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlOiBNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6IHZvaWQ7CisgICAgICAgIHByaW50U2NyZWVuKCk6dm9pZDsKKworICAgICAgICBjYWNoZUNvbXBvbmVudHNJbnN0YW5jZXNGdWxsRGF0YTogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRsb2cnLAorICAgICAgICAgICAgJ3NkY01lbnUnLAorICAgICAgICAgICAgJ01lbnVIYW5kbGVyJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZScsCisgICAgICAgICAgICAnJGZpbHRlcicsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnQ29tcG9uZW50RmFjdG9yeScsCisgICAgICAgICAgICAnQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyJywKKyAgICAgICAgICAgICdMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInLAorICAgICAgICAgICAgJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklDb21wb3NpdGlvblZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRsb2c6IG5nLklMb2dTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY01lbnU6TW9kZWxzLklBcHBNZW51LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1lbnVIYW5kbGVyOiBVdGlscy5NZW51SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNoYXJpbmdTZXJ2aWNlOlNlcnZpY2VzLlNoYXJpbmdTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb21wb25lbnRGYWN0b3J5OiBVdGlscy5Db21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENoYW5nZUxpZmVjeWNsZVN0YXRlSGFuZGxlcjogU2RjLlV0aWxzLkNoYW5nZUxpZmVjeWNsZVN0YXRlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2U6IFNlcnZpY2VzLkNvbXBvbmVudHMuTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFNkYy5VdGlscy5Nb2RhbHNIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGV2ZW50TGlzdGVuZXJTZXJ2aWNlOlNlcnZpY2VzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlKSB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlU2VsZWN0ZWRNZW51SXRlbSgpOworICAgICAgICAgICAgdGhpcy5yZWdpc3RlckdyYXBoRXZlbnRzKHRoaXMuJHNjb3BlKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNhY2hlQ29tcG9uZW50c0luc3RhbmNlc0Z1bGxEYXRhOiBBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OworCisgICAgICAgIHByaXZhdGUgaW5pdENvbXBvbmVudCA9ICgpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50ID0gdGhpcy4kc2NvcGUuY29tcG9uZW50OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50OworICAgICAgICAgICAgdGhpcy51cGRhdGVVdWlkTWFwKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1ZpZXdPbmx5ID0gdGhpcy4kc2NvcGUuaXNWaWV3TW9kZSgpOworICAgICAgICB9OworICAgICAgICBwcml2YXRlIHJlZ2lzdGVyR3JhcGhFdmVudHMgPSAoc2NvcGU6SUNvbXBvc2l0aW9uVmlld01vZGVsU2NvcGUpOnZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJTZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayhVdGlscy5Db25zdGFudHMuR1JBUEhfRVZFTlRTLk9OX05PREVfU0VMRUNURUQsIHNjb3BlLnNldFNlbGVjdGVkSW5zdGFuY2UpOworICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5yZWdpc3Rlck9ic2VydmVyQ2FsbGJhY2soVXRpbHMuQ29uc3RhbnRzLkdSQVBIX0VWRU5UUy5PTl9HUkFQSF9CQUNLR1JPVU5EX0NMSUNLRUQsIHNjb3BlLm9uQmFja2dyb3VuZENsaWNrKTsKKworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgb3BlblVwZGF0ZUNvbXBvbmVudEluc3RhbmNlTmFtZU1vZGFsID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIGxldCB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoOnN0cmluZyA9ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvJzsKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ2Zvcm1zL3Jlc291cmNlLWluc3RhbmNlLW5hbWUtZm9ybS9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLXZpZXcuaHRtbCcpLAorICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5SZXNvdXJjZUluc3RhbmNlTmFtZVZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogJ3NkYy1zbScsCisgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAorICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQ7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBtb2RhbEluc3RhbmNlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UgPSB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgICAgICBtb2RhbEluc3RhbmNlLnJlc3VsdC50aGVuKCgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFV0aWxzLkNvbnN0YW50cy5HUkFQSF9FVkVOVFMuT05fQ09NUE9ORU5UX0lOU1RBTkNFX05BTUVfQ0hBTkdFRCwgdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmdyYXBoQXBpLnVwZGF0ZU5vZGVOYW1lKHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHJlbW92ZVNlbGVjdGVkQ29tcG9uZW50SW5zdGFuY2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFV0aWxzLkNvbnN0YW50cy5HUkFQSF9FVkVOVFMuT05fREVMRVRFX01VTFRJUExFX0NPTVBPTkVOVFMpOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdXBkYXRlVXVpZE1hcCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJbiBjYXNlIHVzZXIgcHJlc3MgRjUsIHRoZSBwYWdlIGlzIHJlZnJlc2hlZCBhbmQgdGhpcy5zaGFyaW5nU2VydmljZS5jdXJyZW50RW50aXR5IHdpbGwgYmUgdW5kZWZpbmVkLAorICAgICAgICAgICAgICogYnV0IGFmdGVyIGxvYWRTZXJ2aWNlIG9yIGxvYWRSZXNvdXJjZSB0aGlzLnNoYXJpbmdTZXJ2aWNlLmN1cnJlbnRFbnRpdHkgd2lsbCBiZSBkZWZpbmVkLgorICAgICAgICAgICAgICogTmVlZCB0byB1cGRhdGUgdGhlIHV1aWRNYXAgd2l0aCB0aGUgbmV3IHJlc291cmNlIG9yIHNlcnZpY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICB0aGlzLnNoYXJpbmdTZXJ2aWNlLmFkZFV1aWRWYWx1ZSh0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnVuaXF1ZUlkLHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQudXVpZCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hhcmluZ1NlcnZpY2UgPSB0aGlzLnNoYXJpbmdTZXJ2aWNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2RjTWVudSA9IHRoaXMuc2RjTWVudTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nUmlnaHRQYW5lbCA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ3JhcGhBcGkgPSB7fTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZlcnNpb24gPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ3ZlcnNpb24nKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpOworCisgICAgICAgICAgICB0aGlzLmNhY2hlQ29tcG9uZW50c0luc3RhbmNlc0Z1bGxEYXRhID0gbmV3IEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4oKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkID0gKCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50ICYmIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZSAgIT0gdW5kZWZpbmVkICYmIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZSAhPSBudWxsOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlU2VsZWN0ZWRDb21wb25lbnQgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlKXsKKworICAgICAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50UGFyZW50ID0gXy5maW5kKHRoaXMuY2FjaGVDb21wb25lbnRzSW5zdGFuY2VzRnVsbERhdGEsIChjb21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC51bmlxdWVJZCA9PT0gIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS5jb21wb25lbnRVaWQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpZihjb21wb25lbnRQYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50ID0gY29tcG9uZW50UGFyZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nUmlnaHRQYW5lbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZUNvbXBvbmVudHNJbnN0YW5jZXNGdWxsRGF0YS5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9IChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJFcnJvciB1cGRhdGluZyBzZWxlY3RlZCBjb21wb25lbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nUmlnaHRQYW5lbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Db21wb25lbnRGYWN0b3J5LmdldENvbXBvbmVudEZyb21TZXJ2ZXIodGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlLm9yaWdpblR5cGUsIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS5jb21wb25lbnRVaWQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVycm9yIHVwZGF0aW5nIHNlbGVjdGVkIGNvbXBvbmVudCIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZ1JpZ2h0UGFuZWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFNlbGVjdGVkSW5zdGFuY2UgPSAoc2VsZWN0ZWRDb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOnZvaWQgPT4geworCisgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmRlYnVnKCdjb21wb3NpdGlvbi12aWV3LW1vZGVsOjpvbk5vZGVTZWxlY3RlZDo6IHdpdGggaWQ6ICcrIHNlbGVjdGVkQ29tcG9uZW50LnVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnNldFNlbGVjdGVkSW5zdGFuY2Uoc2VsZWN0ZWRDb21wb25lbnQpOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZVNlbGVjdGVkQ29tcG9uZW50KCk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc3RhdGUuY3VycmVudC5uYW1lID09PSAnd29ya3NwYWNlLmNvbXBvc2l0aW9uLmFwaScpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oJ3dvcmtzcGFjZS5jb21wb3NpdGlvbi5kZXRhaWxzJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzdGF0ZS5jdXJyZW50Lm5hbWUgPT09ICd3b3Jrc3BhY2UuY29tcG9zaXRpb24ucmVsYXRpb25zJyAmJiB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LmlzUHJvZHVjdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKCd3b3Jrc3BhY2UuY29tcG9zaXRpb24uZGV0YWlscycpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uQmFja2dyb3VuZENsaWNrID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCA9IHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc3RhdGUuY3VycmVudC5uYW1lID09PSAnd29ya3NwYWNlLmNvbXBvc2l0aW9uLmFwaScpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28oJ3dvcmtzcGFjZS5jb21wb3NpdGlvbi5kZXRhaWxzJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub3BlblVwZGF0ZU1vZGFsID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5vcGVuVXBkYXRlQ29tcG9uZW50SW5zdGFuY2VOYW1lTW9kYWwoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlbGV0ZVNlbGVjdGVkQ29tcG9uZW50SW5zdGFuY2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSAiZGVsZXRlSW5zdGFuY2UiOworICAgICAgICAgICAgICAgIGxldCBvbk9rID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRDb21wb25lbnRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmdyYXBoQXBpLmRlbGV0ZVNlbGVjdGVkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxldCB0aXRsZTpzdHJpbmcgPSAgdGhpcy4kc2NvcGUuc2RjTWVudS5hbGVydE1lc3NhZ2VzW3N0YXRlXS50aXRsZTsKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTpzdHJpbmcgPSAgdGhpcy4kc2NvcGUuc2RjTWVudS5hbGVydE1lc3NhZ2VzW3N0YXRlXS5tZXNzYWdlLmZvcm1hdChbdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlLm5hbWVdKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkFsZXJ0TW9kYWwodGl0bGUsIG1lc3NhZ2UpLnRoZW4ob25Payk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRDb21wb25lbnQgPSAoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL2NvbXBvc2l0aW9uLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vY29tcG9zaXRpb24tdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZmM3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL2NvbXBvc2l0aW9uLXZpZXcuaHRtbApAQCAtMCwwICsxLDk5IEBACis8ZGl2IGNsYXNzPSJ3b3Jrc3BhY2UtY29tcG9zaXRpb24iPgorICAgIDxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciPjwvbG9hZGVyPgorICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLWNhbnZhcyIgZGF0YS1uZy1jbGFzcz0ie3NpZGViYXJhY3RpdmU6IGRpc3BsYXlEZXNpZ25lclJpZ2h0U2lkZWJhcn0iID4KKyAgICAgICAgPHBhbGV0dGUgY29tcG9uZW50cz0ibGVmdFBhbmVsQ29tcG9uZW50cyIKKyAgICAgICAgICAgICAgICAgY3VycmVudC1jb21wb25lbnQ9ImN1cnJlbnRDb21wb25lbnQiCisgICAgICAgICAgICAgICAgIGlzLXZpZXctb25seT0iaXNWaWV3T25seSIKKyAgICAgICAgICAgICAgICAgaXMtbG9hZGluZz0iaXNMb2FkaW5nIj48L3BhbGV0dGU+CisKKyAgICAgICAgPGNvbXBvc2l0aW9uLWdyYXBoIGNvbXBvbmVudD0iY3VycmVudENvbXBvbmVudCIgaXMtdmlldy1vbmx5PSJpc1ZpZXdPbmx5Ij48L2NvbXBvc2l0aW9uLWdyYXBoPgorICAgICAgICA8IS0tPGdyYXBoLWNyZWF0b3IgbGVmdC1wYW5lbC1jb21wb25lbnRzPSJsZWZ0UGFuZWxDb21wb25lbnRzIi0tPgorICAgICAgICA8IS0tZGF0YS10ZXN0cy1pZD0iY2FudmFzIi0tPgorICAgICAgICA8IS0tb24taW5zdGFuY2Utc2VsZWN0ZWQ9InNldFNlbGVjdGVkSW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2UpIi0tPgorICAgICAgICA8IS0tb24tYmFja2dyb3VuZC1jbGljaz0ib25CYWNrZ3JvdW5kQ2xpY2soKSIgY3VycmVudC1jb21wb25lbnQ9ImN1cnJlbnRDb21wb25lbnQiLS0+CisgICAgICAgIDwhLS1hcGk9ImdyYXBoQXBpIiBpcy12aWV3LW9ubHk9ImlzVmlld09ubHkiIGlzLWxvYWRpbmc9ImlzTG9hZGluZyI+PC9ncmFwaC1jcmVhdG9yPi0tPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci10b2dnbGUiIGRhdGEtbmctY2xhc3M9InsnYWN0aXZlJzogZGlzcGxheURlc2lnbmVyUmlnaHRTaWRlYmFyfSIKKyAgICAgICAgIGRhdGEtbmctaW5pdD0iZGlzcGxheURlc2lnbmVyUmlnaHRTaWRlYmFyID0gdHJ1ZSIKKyAgICAgICAgIGRhdGEtbmctY2xpY2s9ImRpc3BsYXlEZXNpZ25lclJpZ2h0U2lkZWJhciA9ICFkaXNwbGF5RGVzaWduZXJSaWdodFNpZGViYXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXRvZ2dsZS1pY29uIHNwcml0ZS1uZXcgcG9pbnRlciBtZW51LW9wZW4tbGVmdCI+PC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyIiBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6aXNWaWV3T25seX0iPgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItaGVhZCIgZGF0YS10ZXN0cy1pZD0idy1zZGMtZGVzaWduZXItc2lkZWJhci1oZWFkIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItbG9nby1waCI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFyZ2Uge3tzZWxlY3RlZENvbXBvbmVudC5pY29uU3ByaXRlfX0ge3tzZWxlY3RlZENvbXBvbmVudC5pY29ufX0iPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWlmPSJpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J25vbi1jZXJ0aWZpZWQnOidDRVJUSUZJRUQnICE9PSBzZWxlY3RlZENvbXBvbmVudC5saWZlY3ljbGVTdGF0ZSwgJ3NtYWxsZXItaWNvbic6IHNlbGVjdGVkQ29tcG9uZW50Lmljb249PT0ndmwnIHx8IHNlbGVjdGVkQ29tcG9uZW50Lmljb249PT0nY3AnfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLXNpZGU9InRvcCIgdG9vbHRpcC1jb250ZW50PSJOb3QgY2VydGlmaWVkIj48L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLWxvZ28iPgorICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1sb2dvLXRpdGxlIiBkYXRhLXRlc3RzLWlkPSJzZWxlY3RlZENvbXBUaXRsZSIgdG9vbHRpcHMKKyAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC1jbGFzcz0idG9vbHRpcC1jdXN0b20gYnJlYWstd29yZC10b29sdGlwIgorICAgICAgICAgICAgICAgICAgICB0b29sdGlwLWNvbnRlbnQ9IiYjODIwMzt7e2lzQ29tcG9uZW50SW5zdGFuY2VTZWxlY3RlZCgpID8gY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlLm5hbWUgOiBjdXJyZW50Q29tcG9uZW50Lm5hbWUgfCByZXNvdXJjZU5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSA/IGN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS5uYW1lIDogY3VycmVudENvbXBvbmVudC5uYW1lIHwgcmVzb3VyY2VOYW1lIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwcml0ZSBlLXNkYy1zbWFsbC1pY29uLXBlbmNpbCB3LXNkYy1kZXNpZ25lci11cGRhdGUtcmVzb3VyY2UtaWNvbiIKKyAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iIWlzVmlld09ubHkgJiYgaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCkiCisgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9Im9wZW5VcGRhdGVNb2RhbCgpIiBpZD0iZWRpdFBlbmNpbCI+PC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwcml0ZSBlLXNkYy1zbWFsbC1pY29uLWRlbGV0ZSB3LXNkYy1kZXNpZ25lci1kZWxldGUtcmVzb3VyY2UtaWNvbiIKKyAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZS1zZGMtc21hbGwtaWNvbi1kZWxldGUiCisgICAgICAgICAgICAgICAgIGRhdGEtbmctaWY9IiFpc1ZpZXdPbmx5ICYmIGlzQ29tcG9uZW50SW5zdGFuY2VTZWxlY3RlZCgpIgorICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSIhaXNMb2FkaW5nICYmIGRlbGV0ZVNlbGVjdGVkQ29tcG9uZW50SW5zdGFuY2UoKSIgdGl0bGU9IkRlbGV0ZSBSZXNvdXJjZSBJbnN0YW5jZSI+PC9kaXY+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItdGFicyI+CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYiIgZGF0YS11aS1zcmVmLWFjdGl2ZT0iYWN0aXZlIgorICAgICAgICAgICAgICAgICAgICBkYXRhLXVpLXNyZWY9IndvcmtzcGFjZS5jb21wb3NpdGlvbi5kZXRhaWxzIgorICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNsYXNzPSJ0b29sdGlwLWN1c3RvbSB0YWItdG9vbHRpcCIgdG9vbHRpcC1jb250ZW50PSJJbmZvcm1hdGlvbiI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWItaWNvbiBzcHJpdGUtbmV3IGluZm8iPjwvZGl2PgorICAgICAgICAgICAgPC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYiIgZGF0YS11aS1zcmVmLWFjdGl2ZT0iYWN0aXZlIgorICAgICAgICAgICAgICAgICAgICB1aS1zcmVmPSJ3b3Jrc3BhY2UuY29tcG9zaXRpb24uc3RydWN0dXJlIgorICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNsYXNzPSJ0b29sdGlwLWN1c3RvbSB0YWItdG9vbHRpcCIgdG9vbHRpcC1jb250ZW50PSJDb21wb3NpdGlvbiI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWItaWNvbiBzcHJpdGUtbmV3IHN0cnVjdHVyZSI+PC9kaXY+CisgICAgICAgICAgICA8L2J1dHRvbj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiIiBkYXRhLXVpLXNyZWYtYWN0aXZlPSJhY3RpdmUiCisgICAgICAgICAgICAgICAgICAgIGRhdGEtdWktc3JlZj0id29ya3NwYWNlLmNvbXBvc2l0aW9uLmRlcGxveW1lbnQiCisgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY2xhc3M9InRvb2x0aXAtY3VzdG9tIHRhYi10b29sdGlwIiB0b29sdGlwLWNvbnRlbnQ9IkRlcGxveW1lbnQgQXJ0aWZhY3RzIgorICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJkZXBsb3ltZW50LWFydGlmYWN0LXRhYiI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWItaWNvbiBzcHJpdGUtbmV3IGRlcGxveW1lbnQtYXJ0aWZhY3RzIj48L2Rpdj4KKyAgICAgICAgICAgIDwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiB0b29sdGlwcyB0b29sdGlwLWNsYXNzPSJ0b29sdGlwLWN1c3RvbSB0YWItdG9vbHRpcCIKKyAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC1jb250ZW50PSJ7e3NlbGVjdGVkQ29tcG9uZW50LmlzUmVzb3VyY2UoKSA/ICdQcm9wZXJ0aWVzIGFuZCBBdHRyaWJ1dGVzJzogJ0lucHV0cyd9fSIKKyAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiIiBkYXRhLXVpLXNyZWYtYWN0aXZlPSJhY3RpdmUiCisgICAgICAgICAgICAgICAgICAgIGRhdGEtdWktc3JlZj0id29ya3NwYWNlLmNvbXBvc2l0aW9uLnByb3BlcnRpZXMiCisgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InByb3BlcnRpZXMtYW5kLWF0dHJpYnV0ZXMtdGFiIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYi1pY29uIHNwcml0ZS1uZXciCisgICAgICAgICAgICAgICAgICAgICBuZy1jbGFzcz0ic2VsZWN0ZWRDb21wb25lbnQuaXNSZXNvdXJjZSgpID8gJ3Byb3BlcnRpZXMnOiAnaW5wdXRzJyI+PC9kaXY+CisgICAgICAgICAgICA8L2J1dHRvbj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiIiBkYXRhLXVpLXNyZWYtYWN0aXZlPSJhY3RpdmUiCisgICAgICAgICAgICAgICAgICAgIGRhdGEtdWktc3JlZj0id29ya3NwYWNlLmNvbXBvc2l0aW9uLmFydGlmYWN0cyIKKyAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jbGFzcz0idG9vbHRpcC1jdXN0b20gdGFiLXRvb2x0aXAiIHRvb2x0aXAtY29udGVudD0iSW5mb3JtYXRpb24gQXJ0aWZhY3RzIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYi1pY29uIHNwcml0ZS1uZXcgaW5mb3JtYXRpb24tYXJ0aWZhY3RzIj48L2Rpdj4KKyAgICAgICAgICAgIDwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLW5nLXNob3c9IiFzZWxlY3RlZENvbXBvbmVudC5pc1NlcnZpY2UoKSIgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiIgorICAgICAgICAgICAgICAgICAgICBkYXRhLXVpLXNyZWYtYWN0aXZlPSJhY3RpdmUiIHVpLXNyZWY9IndvcmtzcGFjZS5jb21wb3NpdGlvbi5yZWxhdGlvbnMiCisgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY2xhc3M9InRvb2x0aXAtY3VzdG9tIHRhYi10b29sdGlwICB0b29sdGlwLXJpZ2h0c2lkZSIKKyAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC1jb250ZW50PSJSZXF1aXJlbWVudHMgYW5kIENhcGFiaWxpdGllcyI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWItaWNvbiBzcHJpdGUtbmV3IHJlbGF0aW9ucyI+PC9kaXY+CisgICAgICAgICAgICA8L2J1dHRvbj4KKyAgICAgICAgICAgIDxidXR0b24gZGF0YS1uZy1zaG93PSJzZWxlY3RlZENvbXBvbmVudC5pc1NlcnZpY2UoKSIgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiIgorICAgICAgICAgICAgICAgICAgICBkYXRhLXVpLXNyZWYtYWN0aXZlPSJhY3RpdmUiIHVpLXNyZWY9IndvcmtzcGFjZS5jb21wb3NpdGlvbi5hcGkiIGRhdGEtdGVzdHMtaWQ9InRhYi1hcGkiCisgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY2xhc3M9InRvb2x0aXAtY3VzdG9tIHRhYi10b29sdGlwIHRvb2x0aXAtcmlnaHRzaWRlIiB0b29sdGlwLWNvbnRlbnQ9IkFQSSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWItaWNvbiBzcHJpdGUtbmV3IGFwaSI+PC9kaXY+CisgICAgICAgICAgICA8L2J1dHRvbj4KKworICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGRhdGEtdWktdmlldz0iIiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci10YWItY29udGVudC12aWV3Ij48L2Rpdj4KKworICAgICAgICA8bG9hZGVyIGRhdGEtZGlzcGxheT0iaXNMb2FkaW5nUmlnaHRQYW5lbCIgcmVsYXRpdmU9InRydWUiIHNpemU9Im1lZGl1bSI+PC9sb2FkZXI+CisKKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi9jb21wb3NpdGlvbi5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi9jb21wb3NpdGlvbi5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGMwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL2NvbXBvc2l0aW9uLmxlc3MKQEAgLTAsMCArMSw4NjQgQEAKKworLmNvbXBvc2l0aW9ueworICAgIC5zZGMtd29ya3NwYWNlLWNvbnRhaW5lcnsKKyAgICAgICAgICAgIC53LXNkYy1tYWluLWNvbnRhaW5lcnsKKyAgICAgICAgICAgICAgICAudy1zZGMtbWFpbi1yaWdodC1jb250YWluZXJ7CisgICAgICAgICAgICAgICAgICAgIGxlZnQ6MDsKKyAgICAgICAgICAgICAgICAgICAgLnNkYy13b3Jrc3BhY2UtdG9wLWJhciB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDI5NXB4OworICAgICAgICAgICAgICAgICAgICAgICAgLm5vdC1sYXRlc3R7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMjcwcHg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLnctc2RjLW1haW4tY29udGFpbmVyLWJvZHktY29udGVudHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAgMCAwIDI0N3B4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgPiBkaXY6Zmlyc3QtY2hpbGR7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KK30KKworLndvcmtzcGFjZS1jb21wb3NpdGlvbiB7CisgICAgaGVpZ2h0OjEwMCU7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBhbGlnbi1pdGVtczogbGVmdDsKKyAgICBwYWRkaW5nOiAwOworCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFNpZGViYXIKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci10b2dnbGUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9wOworICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBtYWluX2NvbG9yX287CisgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAbWFpbl9jb2xvcl9vOworICAgICAgICBoZWlnaHQ6IDIxcHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgcmlnaHQ6IDA7CisgICAgICAgIHRvcDogNTNweDsKKyAgICAgICAgd2lkdGg6IDE3cHg7CisgICAgICAgIHRyYW5zaXRpb246IHJpZ2h0IDAuMnM7CisgICAgICAgIHotaW5kZXg6IDEwOworICAgICAgICAuYm94LXNoYWRvdygtMXB4IDFweCAzcHggMCAgQG1haW5fY29sb3Jfbik7CisKKyAgICAgICAgJi5hY3RpdmUgeworICAgICAgICAgICAgcmlnaHQ6IDMwMnB4OworICAgICAgICAgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItdG9nZ2xlLWljb257CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItdG9nZ2xlLWljb24geworICAgICAgICBtYXJnaW4tbGVmdDogNnB4OworICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXIgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOkBtYWluX2NvbG9yX3AgOworICAgICAgICAubm9zZWxlY3Q7CisgICAgICAgIGJvdHRvbTogMDsKKyAgICAgICAgcG9zaXRpb246IGZpeGVkOworICAgICAgICByaWdodDogLTMwMnB4OworICAgICAgICB3aWR0aDogMzAycHg7CisgICAgICAgIHRvcDogMTAycHg7CisgICAgICAgIHRyYW5zaXRpb246IHJpZ2h0IDAuMnM7CisgICAgICAgIHotaW5kZXg6IDk7CisgICAgICAgIC5ib3gtc2hhZG93KC03cHggLTNweCA2cHggLThweCBAbWFpbl9jb2xvcl9uKTsKKworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXRvZ2dsZS5hY3RpdmUgKyAudy1zZGMtZGVzaWduZXItc2lkZWJhciB7CisgICAgICAgIHJpZ2h0OiAwOworCisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItaGVhZCB7CisgICAgICAgIHBhZGRpbmc6IDM2cHggMzBweCAzMHB4IDMwcHg7CisgICAgICAgIGhlaWdodDogMTIwcHg7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItbG9nby1waCB7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CisgICAgICAgIGhlaWdodDogNDhweDsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1sb2dvIHsKKyAgICAgICAgLmdfNjsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1sb2dvLXRpdGxlIHsKKyAgICAgICAgLnNfMTZfcjsKKyAgICAgICAgLnNlbGVjdGFibGU7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICBtYXgtd2lkdGg6IDE2N3B4OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXVwZGF0ZS1yZXNvdXJjZS1pY29uIHsKKyAgICAgICAgLmhhbmQ7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgcmlnaHQ6IDIwcHg7CisgICAgICAgIHRvcDogMTBweDsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItZGVsZXRlLXJlc291cmNlLWljb24geworICAgICAgICAuaGFuZDsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICByaWdodDogNDBweDsKKyAgICAgICAgdG9wOiAxMHB4OworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYnMgeworICAgICAgICAuYmdfZTsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci10YWJzOjphZnRlciB7CisgICAgICAgIGNsZWFyOiBib3RoOworICAgICAgICBjb250ZW50OiAnJzsKKyAgICAgICAgZGlzcGxheTogdGFibGU7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW5fY29sb3JfcDsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQHRsdl9jb2xvcl91OzsKKyAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgIGhlaWdodDogMzZweDsKKyAgICAgICAgcGFkZGluZy10b3A6IDlweDsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICB3aWR0aDogNTBweDsKKyAgICAgICAgLmhhbmQ7CisKKyAgICAgICAgJjpmb2N1cyB7CisgICAgICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgICB9CisgICAgICAgICYudGFiLWRpc2FibGVkIHsKKyAgICAgICAgICAgIC8qIC5kaXNhYmxlZDsgKi8KKyAgICAgICAgfQorICAgICAgICAmLmFjdGl2ZSwgJjpob3ZlcjplbmFibGVkIHsKKyAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGx2X2NvbG9yX3U7CisgICAgICAgICAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWItaWNvbiB7CisgICAgICAgICAgICAgICAgb3BhY2l0eTogMTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGRpdiYgeworICAgICAgICAgICAgcGFkZGluZy10b3A6IDA7CisgICAgICAgIH0KKyAgICAgICAgLypmb3IgdG9vbHRpcCBvbiBkaXNhYmxlZCBidXR0b25zKi8KKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWItaWNvbiB7CisgICAgICAgIG1hcmdpbi10b3A6IDVweCA7CisgICAgICAvLyAgb3BhY2l0eTogLjQ7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiLWNvbnRlbnQgeworICAgICAgICAucGVyZmVjdC1zY3JvbGxiYXI7CisgICAgICAgIGhlaWdodDogMTAwJTsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci10YWItY29udGVudC12aWV3IHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDE1NnB4OworICAgICAgICBib3R0b206IDBweDsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uIHsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlIHsKKyAgICAgICAgLm1fMTRfbTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRsdl9jb2xvcl91OworICAgICAgICAuaGFuZDsKKyAgICAgICAgY2xlYXI6IGJvdGg7CisgICAgICAgIGhlaWdodDogMzJweDsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CisgICAgICAgIG1hcmdpbi10b3A6IDFweDsKKyAgICAgICAgcGFkZGluZzogMCA0MHB4IDAgMjBweDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworCisgICAgICAgICYuZXhwYW5kZWQgeworICAgICAgICAgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZS1pY29uIHsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZS10ZXh0IHsKKyAgICAgICAgbWF4LXdpZHRoOiAyNDBweDsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtaWNvbiB7CisgICAgICAgIC5oYW5kOworICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgLmFycm93LXVwOworICAgICAgICByaWdodDogMTZweDsKKyAgICAgICAgdG9wOiAxMHB4OworICAgICAgICB0cmFuc2l0aW9uOiAuM3MgYWxsOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50IHsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZSArIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudCB7CisgICAgICAgIG1hcmdpbjogMCBhdXRvOworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUuZXhwYW5kZWQgKyAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQgeworICAgICAgICBtYXJnaW46IDAgYXV0byAxcHg7CisKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSB7CisgICAgICAgIC5iXzc7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICAvL21heC13aWR0aDogMjUwcHg7CisKKyAgICAgICAgJi5kZXNjcmlwdGlvbiB7CisgICAgICAgICAgICBtYXJnaW4tdG9wOiAyOHB4OworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKKyAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXRhZyB7CisgICAgICAgIC5nXzc7CisgICAgICAgIC5iZ19jOworICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDI1cHg7CisgICAgICAgIG1hcmdpbjogMCA0cHggNnB4IDA7CisgICAgICAgIG1pbi13aWR0aDogNTBweDsKKyAgICAgICAgcGFkZGluZzogMCA5cHg7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgbWF4LXdpZHRoOiAyODBweDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1mb290ZXIgeworICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgIH0KKworCisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWZvb3Rlci1hY3Rpb24geworICAgICAgICB3aWR0aDogMTgwcHg7CisgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1JlbGF0aW9uc2hpcAorICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tcmVxdWlyZW1lbnRzIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBjb2xvcl9lOworICAgICAgICBtYXJnaW46IDAgMTNweCAyMHB4IDEzcHg7CisgICAgICAgIHBhZGRpbmc6IDE1cHggMCAwOworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tcmVxdWlyZW1lbnRzLWl0ZW0geworICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tcmVxdWlyZW1lbnRzLWxhYmVsIHsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgd2lkdGg6IDEwMnB4OworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tcmVxdWlyZW1lbnRzLXNlbGVjdCB7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBjb2xvcl9lOworICAgICAgICBtaW4taGVpZ2h0OiAzMHB4OworICAgICAgICBwYWRkaW5nOiA0cHggMTNweDsKKyAgICAgICAgd2lkdGg6IDE2OHB4OworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9Qcm9wZXJ0aWVzCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcHJvcGVydHktYW5kLWF0dHJpYnV0ZSB7CisgICAgICAgIC5iXzc7CisgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAY29sb3JfZTsKKyAgICAgICAgbWluLWhlaWdodDogNzJweDsKKyAgICAgICAgcGFkZGluZzogMTVweCAxMHB4IDEwcHggMThweDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgICAgICY6Zmlyc3QtY2hpbGQgeworICAgICAgICAgICAgLy9tYXJnaW4tdG9wOiAtMThweDsKKyAgICAgICAgfQorCisgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgLy8gLmJnX2NfaG92ZXI7CisgICAgICAgICAgICAuYmdfYzsKKyAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAuM3M7CisKKyAgICAgICAgICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWJ1dHRvbiB7CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1wcm9wZXJ0eS1hbmQtYXR0cmlidXRlLWxhYmVsIHsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIG1heC13aWR0aDogMjAwcHg7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgJjpob3ZlciB7CisgICAgICAgICAgICAuYV83OworICAgICAgICB9CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcHJvcGVydHktdmFsdWUgeworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworCisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcHJvcGVydHktbGFiZWwtdmFsdWUgeworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWJ1dHRvbiB7CisgICAgICAgIGRpc3BsYXk6IG5vbmU7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAyNXB4OworCisgICAgICAgICYudXBkYXRlIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgYm9yZGVyOiAwOworICAgICAgICAgICAgcmlnaHQ6IDYwcHg7CisgICAgICAgIH0KKworICAgICAgICAmLmRlbGV0ZSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGJvcmRlcjogMDsKKyAgICAgICAgICAgIHJpZ2h0OiAxM3B4OworICAgICAgICB9CisKKyAgICAgICAgJi5kb3dubG9hZCB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGJvcmRlcjogMDsKKyAgICAgICAgICAgIHJpZ2h0OiAzNXB4OworICAgICAgICB9CisKKyAgICAgICAgJi5kb3dubG9hZC1lbnYgeworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICBib3JkZXI6IDA7CisgICAgICAgICAgICByaWdodDogMzVweDsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDY1cHg7CisgICAgICAgIH0KKworICAgICAgICAmLmF0dGFjaCB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGJvcmRlcjogMDsKKyAgICAgICAgICAgIHJpZ2h0OiAxNXB4OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ2FudmFzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLnctc2RjLWRlc2lnbmVyLWNhbnZhcyB7CisgICAgICAgIGhlaWdodDoxMDAlOworICAgICAgICAubm9zZWxlY3Q7CisgICAgICAgIC5iZ19jOworICAgICAgICBib3R0b206IDA7CisgICAgICAgIC8vIHBvc2l0aW9uOiBmaXhlZDsKKyAgICAgICAgLy9yaWdodDogMDsKKyAgICAgICAgLy9sZWZ0OiAyNDBweDsKKyAgICAgICAgLy90b3A6IDk0cHg7CisgICAgICAgIC52aWV3LW1vZGV7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OworICAgICAgICAgICAgYm9yZGVyOjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItY2FudmFzLnNpZGViYXJhY3RpdmUgeworICAgICAgICAvL3JpZ2h0OiAzMDBweDsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItZWxlbWVudCB7CisgICAgICAgIC5oYW5kOworICAgICAgICB3aWR0aDogMjAwcHg7CisgICAgICAgIGhlaWdodDogMTAwcHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICB0b3A6IDUwJTsKKyAgICAgICAgbWFyZ2luLXRvcDogLTIwMHB4OworICAgICAgICBsZWZ0OiA1MCU7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAtNTBweDsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItcmVzb3VyY2UtbGFiZWwgeworICAgICAgICAucV83OworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1yZXNvdXJjZS1sYWJlbC1pbmRpY2F0b3IgeworICAgICAgICAuYmdfcTsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIGhlaWdodDogMTBweDsKKyAgICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgIHdpZHRoOiAxMHB4OworCisgICAgICAgICYudmFsaWQgeworICAgICAgICAgICAgLmJnX2w7CisgICAgICAgIH0KKworICAgICAgICAmLmludmFsaWQgeworICAgICAgICAgICAgLmJnX2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBMZWZ0YmFyCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLnctc2RjLWRlc2lnbmVyLWxlZnRiYXIgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgQG1haW5fY29sb3JfcDsKKyAgICAgICAgYm90dG9tOiAwOworICAgICAgICBsZWZ0OiAwOworICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CisgICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDA7CisgICAgICAgIHdpZHRoOiAyNDRweDsKKyAgICAgICAgLmJveC1zaGFkb3coN3B4IC0zcHggNnB4IC04cHggQG1haW5fY29sb3Jfbik7CisKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItbGVmdGJhci10aXRsZSB7CisKKyAgICAgICAgLnBfMTZfbTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIEBtYWluX2NvbG9yX247CisgICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OworICAgICAgICBwYWRkaW5nOiAwIDE3cHg7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLWxlZnRiYXItdGl0bGUtY291bnQgeworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgfQorCisgICAgLnctc2NkLWRpYWdyYW0tY29udGFpbmVyIHsKKyAgICAgICAvLyBsZWZ0OiAyNDBweDsKKyAgICAgICAgLy9yaWdodDogMzAwcHg7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VhcmNoIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIEB0bHZfY29sb3JfdTsKKyAgICAgICAgcGFkZGluZzogMTBweDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlYXJjaC1pbnB1dCB7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBjb2xvcl9lOworICAgICAgICAuYm9yZGVyLXJhZGl1cyg0cHgpOworICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgcGFkZGluZzogMHB4IDI4cHggM3B4IDEwcHg7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiA0cHg7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VhcmNoLWZpbHRlciB7CisKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uIHsKKyAgICAgICAgLmhhbmQ7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZSB7CisgICAgICAgIC5tXzE0X207CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICBAdGx2X2NvbG9yX3U7CisgICAgICAgIC5oYW5kOworICAgICAgICBjbGVhcjogYm90aDsKKyAgICAgICAgaGVpZ2h0OiA0MHB4OworICAgICAgICBsaW5lLWhlaWdodDogNDBweDsKKyAgICAgICAgbWFyZ2luLXRvcDogMXB4OworICAgICAgICBwYWRkaW5nOiAwIDEwcHg7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZS1pY29uIHsKKyAgICAgICAgLmhhbmQ7CisgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAuYXJyb3ctdXA7CisgICAgICAgIHdpZHRoOiAxNXB4OworICAgICAgICBoZWlnaHQ6IDlweDsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICByaWdodDogMTNweDsKKyAgICAgICAgdG9wOiAxOHB4OworICAgICAgICB0cmFuc2l0aW9uOiAuM3MgYWxsOworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24uZXhwYW5kZWQgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi10aXRsZS1pY29uIHsKKyAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKKyAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50IHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIEBtYWluX2NvbG9yX287CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0geworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgQG1haW5fY29sb3JfcDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKworICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICBAbWFpbl9jb2xvcl9wOworICAgICAgICB9CisKKyAgICAgICAgLmNweworICAgICAgICAgICAgbWFyZ2luOiA2cHg7CisgICAgICAgIH0KKworICAgICAgICAudmx7CisgICAgICAgICAgICBtYXJnaW46IDZweDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC1zdWJjYXQgeworICAgICAgICAubV8xNF9tOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgQHRsdl9jb2xvcl90OworICAgICAgICBsaW5lLWhlaWdodDogMzVweDsKKyAgICAgICAgcGFkZGluZzogMCAxMHB4OworICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CisKKworICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICBAZnVuY19jb2xvcl9yOworICAgICAgICB9CisKKworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24gLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50IC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC1pdGVtIHsKKyAgICAgICAgbWF4LWhlaWdodDogMHB4OworICAgICAgICBtYXJnaW46IDAgYXV0bzsKKyAgICAgICAgdHJhbnNpdGlvbjogYWxsIC4zczsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLmV4cGFuZGVkIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudCAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSB7CisgICAgICAgIG1heC1oZWlnaHQ6IDY0cHg7CisgICAgICAgIG1hcmdpbjogMCBhdXRvIDFweCBhdXRvOworICAgICAgICAvLyAgcGFkZGluZzogNHB4IDEzcHg7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi5leHBhbmRlZCAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LXN1YmNhdCB7CisgICAgICAgIG1hcmdpbjogMDsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1pY29uLXBoIHsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBtYXJnaW46IDEycHggMCAxMnB4IDEwcHg7CisgICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOworCisgICAgICAgIC5ub24tY2VydGlmaWVkIHsKKyAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgIGxlZnQ6IDI3cHg7CisgICAgICAgICAgICBib3R0b206IDZweDsKKyAgICAgICAgICAgIC5zcHJpdGU7CisgICAgICAgICAgICAucy1zZGMtc3RhdGUtbm9uLWNlcnRpZmllZDsKKyAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworCisgICAgICAgICAgICAmLnNtYWxsZXItaWNvbiB7CisgICAgICAgICAgICAgICAgYm90dG9tOiA2cHg7CisgICAgICAgICAgICAgICAgbGVmdDogMTNweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgIH0KKworICAgIC5ub24tY2VydGlmaWVkIHsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBsZWZ0OiA0M3B4OworICAgICAgICBib3R0b206IDNweDsKKyAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgLnMtc2RjLXN0YXRlLW5vbi1jZXJ0aWZpZWQ7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworCisgICAgICAgICYuc21hbGxlci1pY29uIHsKKyAgICAgICAgICAgIGxlZnQ6IDM1cHg7CisgICAgICAgICAgICBib3R0b206IC0xNHB4OworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgLmktc2RjLWNvbXBvc2l0aW9uLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0taWNvbiB7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vLi4vLi4vc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kZWZhdWx0LnBuZycpOworICAgICAgICAvLyBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHJpZ2h0OiAyMHB4OworICAgICAgICB0b3A6IDEwcHg7CisgICAgICAgIGhlaWdodDogNDBweDsKKyAgICAgICAgd2lkdGg6IDQwcHg7CisgICAgICAgIGJhY2tncm91bmQtc2l6ZTogNDBweDsKKyAgICB9CisgICAgKi8KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWluZm8geworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIC8vIG1hcmdpbi1sZWZ0OiAxMHB4OworICAgICAgICAvL292ZXJmbG93OiBoaWRkZW47CisgICAgICAgIC8vIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgIHdpZHRoOiAxNjBweDsKKyAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItbGVmdGJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1pbmZvLXRpdGxlIHsKKyAgICAgICAgLm1fMTRfbTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE0cHg7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworICAgICAgICBtYXgtd2lkdGg6IDEyMHB4OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLWxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0taW5mby10ZXh0IHsKKyAgICAgICAgLnBfMzsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE1cHg7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICAvL21hcmdpbjogLTFweCAwIDJweCAwOworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWluZm8tdGV4dC1saW5rIHsKKyAgICAgICAgY29sb3I6IEBjb2xvcl9zOworICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHJpZ2h0OiAxN3B4OworICAgICAgICAvLyBib3R0b206IDVweDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBGb3JtIGFjdGlvbnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAudy1zZGMtZm9ybS1hY3Rpb25zLWNvbnRhaW5lci5hZGQtcHJvcGVydHkgeworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBtYXJnaW4tdG9wOiAycHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CisKKyAgICAgICAgLnctc2RjLWZvcm0tYWN0aW9uIHsKKyAgICAgICAgICAgIHdpZHRoOiAyNDVweDsKKyAgICAgICAgfQorICAgICAgICAudy1zZGMtZm9ybS1hY3Rpb24uYWRkLXByb3BlcnR5LWFkZC1hbm90aGVyIHsKKyAgICAgICAgICAgIC5iZ19hOworICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDM1cHg7CisgICAgICAgIH0KKyAgICAgICAgLnctc2RjLWZvcm0tYWN0aW9uLmFkZC1wcm9wZXJ0eS1kb25lIHsKKyAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAzMTJweDsKKyAgICAgICAgfQorICAgICAgICAudy1zZGMtZm9ybS1hY3Rpb24uc2F2ZSB7CisgICAgICAgICAgICBtYXJnaW4tbGVmdDogMzI3cHg7CisgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAzMHB4OworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBUb3AgbWVudQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC53LXNkYy1oZWFkZXItbWVudSB7CisgICAgICAgIHBhZGRpbmc6IDI1cHggMDsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgIH0KKworICAgIC5pLXNkYy1oZWFkZXItbWVudS1pdGVtIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIGhlaWdodDogNDNweDsKKyAgICAgICAgbWluLXdpZHRoOiA5M3B4OworICAgICAgICBwYWRkaW5nOiAwIDM4cHg7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKworICAgICAgICAmOjphZnRlciB7CisgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAY29sb3JfbTsKKyAgICAgICAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICBoZWlnaHQ6IDQzcHg7CisgICAgICAgICAgICByaWdodDogMDsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIHRvcDogMDsKKyAgICAgICAgICAgIHdpZHRoOiAycHg7CisgICAgICAgIH0KKworICAgICAgICAmOmZpcnN0LWNoaWxkIHsKKyAgICAgICAgICAgICY6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQGNvbG9yX207CisgICAgICAgICAgICAgICAgY29udGVudDogJyc7CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiA0M3B4OworICAgICAgICAgICAgICAgIGxlZnQ6IDA7CisgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgICAgIHRvcDogMDsKKyAgICAgICAgICAgICAgICB3aWR0aDogMnB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLmktc2RjLWhlYWRlci1tZW51LWl0ZW0taWNvbiB7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgaGVpZ2h0OiAyMHB4OworICAgICAgICB3aWR0aDogMjhweDsKKyAgICB9CisKKyAgICAuaS1zZGMtaGVhZGVyLW1lbnUtaXRlbS1sYWJlbCB7CisgICAgICAgIC5nXzE7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxOHB4OworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENhbnZhcyBpbmxpbmUgbWVudQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC53LXNkYy1jYW52YXMtbWVudSB7CisgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKKyAgICAgICAgei1pbmRleDogMTAwOworCisgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgICAgIGJvcmRlci13aWR0aDogMXB4OworICAgICAgICBib3JkZXItY29sb3I6ICNkOGQ4ZDg7CisgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgICAgIGJveC1zaGFkb3c6IDBweCAycHggMnB4IDBweCByZ2JhKDI0LCAyNCwgMjUsIDAuMSk7CisgICAgICAgIHdpZHRoOiA5MXB4OworCisvKiAgICAgICAgJi52bC10eXBlLXNlbGVjdHsKKyAgICAgICAgICAgIHdpZHRoOiAxNzNweDsKKyAgICAgICAgfQorKi8KKworICAgICAgICBoMyB7CisgICAgICAgICAgICBjb2xvcjogQGZ1bmNfY29sb3JfczsKKyAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgICAgbWFyZ2luOiAwOworICAgICAgICAgICAgcGFkZGluZzogN3B4IDExcHg7CisgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTsKKyAgICAgICAgfQorCisgICAgICAgIC53LXNkYy1jYW52YXMtbWVudS1jb250ZW50IHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDVweCA1cHg7CisKKyAgICAgICAgICAgICYudmwtc2VsZWN0eworICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206ICNkOGQ4ZDggc29saWQgMXB4OworICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxNXB4OworCisgICAgICAgICAgICAgICAgLnRsdi1yYWRpbyB7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDNweCAwcHg7CisKKyAgICAgICAgICAgICAgICAgICAgLnRsdi1yYWRpby1sYWJlbCB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAzcHggMHB4OworCisgICAgICAgICAgICAgICAgICAgICAgICAmOjpiZWZvcmUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnctc2RjLWNhbnZhcy1tZW51LWNvbnRlbnQtdXBkYXRlLWJ1dHRvbiB7CisgICAgICAgICAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgICAgICAgICAuc3ByaXRlLmUtc2RjLXNtYWxsLWljb24tZGVsZXRlOworICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgICAgICB0b3A6IDE1cHg7CisgICAgICAgICAgICAgICAgcmlnaHQ6IDEwcHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAudy1zZGMtY2FudmFzLW1lbnUtY29udGVudC1kZWxldGUtYnV0dG9uIHsKKyAgICAgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgICAgIC5zcHJpdGUuZS1zZGMtc21hbGwtaWNvbi1kZWxldGU7CisgICAgICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICAgICAgbWFyZ2luOiAwIDhweCAwIDZweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC53LXNkYy1jYW52YXMtbWVudS1hcnJvdyB7CisgICAgICAgICAgICAvL1RPRE86IE1pc3NpbmcgaW1hZ2UgZm9yIHNtYWxsIGJsdWUgdHJpYW5nbGUuCisgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBRkNBWUFBQUI0a2ExVkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURFMElEYzVMakUxTmpjNU55d2dNakF4TkM4d09DOHlNQzB3T1RvMU16b3dNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UUWdLRmRwYm1SdmQzTXBJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa0UxT1RJek5ESTFNRU5GUWpFeFJUVTRPRFJFUlRJMU1ETTJSRVpDT1VZeklpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rRTFPVEl6TkRJMk1FTkZRakV4UlRVNE9EUkVSVEkxTURNMlJFWkNPVVl6SWo0Z1BIaHRjRTFOT2tSbGNtbDJaV1JHY205dElITjBVbVZtT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlFUVTVNak0wTWpNd1EwVkNNVEZGTlRnNE5FUkZNalV3TXpaRVJrSTVSak1pSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UVRVNU1qTTBNalF3UTBWQ01URkZOVGc0TkVSRk1qVXdNelpFUmtJNVJqTWlMejRnUEM5eVpHWTZSR1Z6WTNKcGNIUnBiMjQrSUR3dmNtUm1PbEpFUmo0Z1BDOTRPbmh0Y0cxbGRHRStJRHcvZUhCaFkydGxkQ0JsYm1ROUluSWlQejRnQlhUbEFBQUFPRWxFUVZSNDJtSzBycDdOZ0FTTWdaZ0ZpRS9DQkpqUUpQY0E4VTRnTmtkWEFKTVVBR0orWkVWTWFKSXdBRmZFaEVVU1JSRkFnQUVBVnRnSnlpTEFQV0FBQUFBQVNVVk9SSzVDWUlJPScpOworICAgICAgICAgICAgY29udGVudDogJyc7CisgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgICAgIGhlaWdodDogMjFweDsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIHJpZ2h0OiAxMnB4OworICAgICAgICAgICAgdG9wOiAtMjRweDsKKyAgICAgICAgICAgIHdpZHRoOiAxODRweDsKKyAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxNzVweCAxNnB4OworICAgICAgICB9CisKKyAgICB9Cit9CisvKi5yaWdodC10YWItbG9hZGVyIHsKKyAgICBib3JkZXI6IDE2cHggc29saWQgI2YzZjNmMzsgISogTGlnaHQgZ3JleSAqIQorICAgIGJvcmRlci10b3A6IDE2cHggc29saWQgIzM0OThkYjsgISogQmx1ZSAqIQorICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgICB3aWR0aDogMTIwcHg7CisgICAgaGVpZ2h0OiAxMjBweDsKKyAgICBhbmltYXRpb246IHNwaW4gMnMgbGluZWFyIGluZmluaXRlOworfSovCisKK0BrZXlmcmFtZXMgc3BpbiB7CisgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQorICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvYXJ0aWZhY3RzL2FydGlmYWN0cy12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2FydGlmYWN0cy9hcnRpZmFjdHMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI1ZDJjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2FydGlmYWN0cy9hcnRpZmFjdHMtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDI1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBSZXNvdXJjZSA9IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZTsKKworICAgZXhwb3J0IGludGVyZmFjZSBJQXJ0aWZhY3RzVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJQ29tcG9zaXRpb25WaWV3TW9kZWxTY29wZSB7CisgICAgICAgIGFydGlmYWN0czogQXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+OworICAgICAgICBhcnRpZmFjdFR5cGU6IHN0cmluZzsKKyAgICAgICAgZG93bmxvYWRGaWxlOk1vZGVscy5JRmlsZURvd25sb2FkOworICAgICAgICBpc0xvYWRpbmc6Ym9vbGVhbjsKKworICAgICAgICBnZXRUaXRsZSgpOiBzdHJpbmc7CisgICAgICAgIGFkZE9yVXBkYXRlKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZDsKKyAgICAgICAgZGVsZXRlKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZDsKKyAgICAgICAgZG93bmxvYWQoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICBvcGVuRWRpdEVudlBhcmFtZXRlcnNNb2RhbChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZDsKKyAgICAgICAgZ2V0RW52QXJ0aWZhY3QoaGVhdEFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTphbnk7CisgICAgICAgIGdldEVudkFydGlmYWN0TmFtZShhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6c3RyaW5nOworICAgICAgICBpc0xpY2Vuc2VBcnRpZmFjdChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6Ym9vbGVhbjsKKyAgICAgICAgaXNWRmlBcnRpZmFjdChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6Ym9vbGVhbjsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUmVzb3VyY2VBcnRpZmFjdHNWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJ3NkY0NvbmZpZycsCisgICAgICAgICAgICAnQXJ0aWZhY3RzVXRpbHMnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUFydGlmYWN0c1ZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGU6YW55LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgYXJ0aWZhY3RzVXRpbHM6U2RjLlV0aWxzLkFydGlmYWN0c1V0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFV0aWxzLk1vZGFsc0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOlNlcnZpY2VzLkNhY2hlU2VydmljZSkgeworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGluaXRBcnRpZmFjdEFyciA9IChhcnRpZmFjdFR5cGU6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBhcnRpZmFjdHM6QXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+ID0gW107CisKKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIGlmICgnaW50ZXJmYWNlJyA9PSBhcnRpZmFjdFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyZmFjZXMgPSB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudC5pbnRlcmZhY2VzOworICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlcyAmJiBpbnRlcmZhY2VzLnN0YW5kYXJkICYmIGludGVyZmFjZXMuc3RhbmRhcmQub3BlcmF0aW9ucykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goaW50ZXJmYWNlcy5zdGFuZGFyZC5vcGVyYXRpb25zLCAob3BlcmF0aW9uOmFueSwgaW50ZXJmYWNlTmFtZTpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtOlNkYy5Nb2RlbHMuQXJ0aWZhY3RNb2RlbCA9IDxTZGMuTW9kZWxzLkFydGlmYWN0TW9kZWw+e307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5pbXBsZW1lbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gPFNkYy5Nb2RlbHMuQXJ0aWZhY3RNb2RlbD4gb3BlcmF0aW9uLmltcGxlbWVudGF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFydGlmYWN0RGlzcGxheU5hbWUgPSBpbnRlcmZhY2VOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXJ0aWZhY3RMYWJlbCA9IGludGVyZmFjZU5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tYW5kYXRvcnkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMucHVzaChpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICAvL2luaXQgbm9ybWFsIGFydGlmYWN0cywgZGVwbG95bWVudCBvciBhcGkgYXJ0aWZhY3RzCisgICAgICAgICAgICAgICAgICAgIGxldCBhcnRpZmFjdHNPYmo6TW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbDsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcnRpZmFjdFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImFwaSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzT2JqID0gKDxNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlPnRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50KS5zZXJ2aWNlQXBpQXJ0aWZhY3RzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGVwbG95bWVudCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRzY29wZS5pc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHNPYmogPSB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0c09iaiA9IHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS5kZXBsb3ltZW50QXJ0aWZhY3RzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzT2JqID0gdGhpcy4kc2NvcGUuc2VsZWN0ZWRDb21wb25lbnQuYXJ0aWZhY3RzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChhcnRpZmFjdHNPYmosIChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCwga2V5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMucHVzaChhcnRpZmFjdCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFydGlmYWN0cyA9IGFydGlmYWN0czsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIG9wZW5FZGl0QXJ0aWZhY3RNb2RhbCA9IChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgdmlld01vZGVsc0h0bWxCYXNlUGF0aDpzdHJpbmcgPSAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzLyc7CisKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ2Zvcm1zL2FydGlmYWN0LWZvcm0vYXJ0aWZhY3QtZm9ybS12aWV3Lmh0bWwnKSwKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnU2RjLlZpZXdNb2RlbHMuQXJ0aWZhY3RSZXNvdXJjZUZvcm1WaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgIHNpemU6ICdzZGMtbWQnLAorICAgICAgICAgICAgICAgIGJhY2tkcm9wOiAnc3RhdGljJywKKyAgICAgICAgICAgICAgICBrZXlib2FyZDogZmFsc2UsCisgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdDogKCk6TW9kZWxzLkFydGlmYWN0TW9kZWwgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFydGlmYWN0OworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpOiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSA9IHRoaXMuJG1vZGFsLm9wZW4obW9kYWxPcHRpb25zKTsKKyAgICAgICAgICAgIG1vZGFsSW5zdGFuY2UKKyAgICAgICAgICAgICAgICAucmVzdWx0CisgICAgICAgICAgICAgICAgLnRoZW4oKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEFydGlmYWN0QXJyKHRoaXMuJHNjb3BlLmFydGlmYWN0VHlwZSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBzZWxmID0gdGhpczsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZz0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUgPSB0aGlzLmFydGlmYWN0c1V0aWxzLmdldEFydGlmYWN0VHlwZUJ5U3RhdGUodGhpcy4kc3RhdGUuY3VycmVudC5uYW1lKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdEFydGlmYWN0QXJyKHRoaXMuJHNjb3BlLmFydGlmYWN0VHlwZSk7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFRpdGxlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcnRpZmFjdHNVdGlscy5nZXRUaXRsZSh0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUsIHRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCB2ZmlBcnRpZmFjdFR5cGVzOmFueSA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnVUlDb25maWd1cmF0aW9uJykuYXJ0aWZhY3RzLmRlcGxveW1lbnQucmVzb3VyY2VJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdHM7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzVkZpQXJ0aWZhY3Q9KGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTpib29sZWFuPT57CisgICAgICAgICAgICAgICAgcmV0dXJuIHZmaUFydGlmYWN0VHlwZXNbYXJ0aWZhY3QuYXJ0aWZhY3RUeXBlXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHdhdGNoKCdzZWxlY3RlZENvbXBvbmVudCcsIChuZXdSZXNvdXJjZTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChuZXdSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRBcnRpZmFjdEFycih0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLiR3YXRjaCgnY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlJywgKG5ld0luc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAobmV3SW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0QXJ0aWZhY3RBcnIodGhpcy4kc2NvcGUuYXJ0aWZhY3RUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWRkT3JVcGRhdGUgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzVXRpbHMuc2V0QXJ0aWZhY3RUeXBlKGFydGlmYWN0LCB0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUpOworICAgICAgICAgICAgICAgIGxldCBhcnRpZmFjdENvcHkgPSBuZXcgTW9kZWxzLkFydGlmYWN0TW9kZWwoYXJ0aWZhY3QpOworICAgICAgICAgICAgICAgIHRoaXMub3BlbkVkaXRBcnRpZmFjdE1vZGFsKGFydGlmYWN0Q29weSk7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlbGV0ZSA9IChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBsZXQgb25PayA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmc9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzVXRpbHMucmVtb3ZlQXJ0aWZhY3QoYXJ0aWZhY3QsIHRoaXMuJHNjb3BlLmFydGlmYWN0cyk7CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSAocmVzcG9uc2VBcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRBcnRpZmFjdEFycih0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPShlcnJvcjphbnkpOnZvaWQgPT57CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGFydGlmYWN0IHJldHVybmVkIGVycm9yOicsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEFydGlmYWN0QXJyKHRoaXMuJHNjb3BlLmFydGlmYWN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmc9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5pc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LmRlbGV0ZUluc3RhbmNlQXJ0aWZhY3QoYXJ0aWZhY3QudW5pcXVlSWQsIGFydGlmYWN0LmFydGlmYWN0TGFiZWwpLnRoZW4oc3VjY2VzcywgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuZGVsZXRlQXJ0aWZhY3QoYXJ0aWZhY3QudW5pcXVlSWQsIGFydGlmYWN0LmFydGlmYWN0TGFiZWwpLnRoZW4oc3VjY2VzcywgZXJyb3IpOy8vVE9ETyBzaW11bGF0ZSBlcnJvciAobWFrZSBzdXJlIGVycm9yIHJldHVybnMpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxldCB0aXRsZTogc3RyaW5nID0gdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiQVJUSUZBQ1RfVklFV19ERUxFVEVfTU9EQUxfVElUTEUiKTsKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTogc3RyaW5nID0gdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiQVJUSUZBQ1RfVklFV19ERUxFVEVfTU9EQUxfVEVYVCIsICJ7J25hbWUnOiAnIiArIGFydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWUgKyAiJ30iKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBtZXNzYWdlLCBmYWxzZSkudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0RW52QXJ0aWZhY3QgPSAoaGVhdEFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTphbnk9PnsKKyAgICAgICAgICAgICAgICByZXR1cm4gXy5maW5kKHRoaXMuJHNjb3BlLmFydGlmYWN0cywgKGl0ZW06TW9kZWxzLkFydGlmYWN0TW9kZWwpPT57CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmdlbmVyYXRlZEZyb21JZCA9PT0gaGVhdEFydGlmYWN0LnVuaXF1ZUlkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0RW52QXJ0aWZhY3ROYW1lID0gKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTpzdHJpbmcgPT57CisgICAgICAgICAgICAgICAgbGV0IGVudkFydGlmYWN0ID0gdGhpcy4kc2NvcGUuZ2V0RW52QXJ0aWZhY3QoYXJ0aWZhY3QpOworICAgICAgICAgICAgICAgIGlmKGVudkFydGlmYWN0KXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudkFydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMaWNlbnNlQXJ0aWZhY3QgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpIDpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgaXNMaWNlbnNlOmJvb2xlYW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5pc0NzYXJDb21wb25lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpc0xpY2Vuc2UgPSB0aGlzLmFydGlmYWN0c1V0aWxzLmlzTGljZW5zZVR5cGUoYXJ0aWZhY3QuYXJ0aWZhY3RUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNMaWNlbnNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub3BlbkVkaXRFbnZQYXJhbWV0ZXJzTW9kYWwgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworCisgICAgICAgICAgICAgICAgbGV0IG1vZGFsT3B0aW9uczpuZy51aS5ib290c3RyYXAuSU1vZGFsU2V0dGluZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCgnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2Vudi1wYXJhbWV0ZXJzLWZvcm0vZW52LXBhcmFtZXRlcnMtZm9ybS5odG1sJyksCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5FbnZQYXJhbWV0ZXJzRm9ybVZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgICAgIHNpemU6ICdzZGMtbWQnLAorICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0OiAoKTpNb2RlbHMuQXJ0aWZhY3RNb2RlbCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFydGlmYWN0OworICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCk6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBtb2RhbEluc3RhbmNlOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2UgPSB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgbW9kYWxJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAucmVzdWx0CisgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0QXJ0aWZhY3RBcnIodGhpcy4kc2NvcGUuYXJ0aWZhY3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9OworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvYXJ0aWZhY3RzL2FydGlmYWN0cy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvYXJ0aWZhY3RzL2FydGlmYWN0cy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwMTM4OQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9hcnRpZmFjdHMvYXJ0aWZhY3RzLXZpZXcuaHRtbApAQCAtMCwwICsxLDU1IEBACis8cGVyZmVjdC1zY3JvbGxiYXIgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiLWNvbnRlbnQgYXJ0aWZhY3RzIj4KKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24iPgorICAgICAgICA8ZXhwYW5kLWNvbGxhcHNlCisgICAgICAgICAgICBleHBhbmRlZC1zZWxlY3Rvcj0iLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50IiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtdGV4dCIgZGF0YS1uZy1iaW5kPSJnZXRUaXRsZSgpIiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Z2V0VGl0bGUoKX19Ij48L3NwYW4+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtaWNvbiI+PC9kaXY+CisgICAgICAgIDwvZXhwYW5kLWNvbGxhcHNlPgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50IiBkYXRhLW5nLWhpZGU9IidkZXBsb3ltZW50JyA9PSBhcnRpZmFjdFR5cGUgJiYgIXNlbGVjdGVkQ29tcG9uZW50LmlzQ29tcGxleCgpIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYXJ0aWZhY3QiCisgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcGVhdD0iYXJ0aWZhY3QgaW4gYXJ0aWZhY3RzIHwgb3JkZXJCeTogWyctbWFuZGF0b3J5JywgJ2FydGlmYWN0RGlzcGxheU5hbWUnXSB0cmFjayBieSAkaW5kZXgiIGRhdGEtbmctaWY9IiFpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSB8fCAoaXNWRmlBcnRpZmFjdChhcnRpZmFjdCl8fCBhcnRpZmFjdC5lc0lkKSAmJiAnSEVBVF9FTlYnICE9PSBhcnRpZmFjdC5hcnRpZmFjdFR5cGUiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW5nLWlmPSJpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSAmJiBhcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5sZW5ndGgiIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWZpbGUtbGluayI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWFydGlmYWN0LWRldGFpbHMiIGRhdGEtbmctY2xhc3M9InsnaGVhdCc6YXJ0aWZhY3QuaXNIRUFUKCkgJiYgYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMubGVuZ3RofSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWFydGlmYWN0LWZpbGVuYW1lIiBkYXRhLXRlc3RzLWlkPSJhcnRpZmFjdE5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnaGFuZCBlbmFibGVkJzohaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCkgJiYgYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMubGVuZ3RoICYmICFpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9ImFydGlmYWN0LmFydGlmYWN0TmFtZSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0TmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSIhaXNWaWV3TW9kZSgpICYmICFpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSAmJiBhcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5sZW5ndGggJiYgb3BlbkVkaXRFbnZQYXJhbWV0ZXJzTW9kYWwoYXJ0aWZhY3QpIiBkYXRhLW5nLWlmPSJhcnRpZmFjdC5hcnRpZmFjdE5hbWUiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1hcnRpZmFjdC1kZXRhaWxzLW5hbWUiIGRhdGEtdGVzdHMtaWQ9ImFydGlmYWN0X0Rpc3BsYXlfTmFtZS17e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2hhbmQgZW5hYmxlZCc6ICghaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCl8fGlzVkZpQXJ0aWZhY3QoYXJ0aWZhY3QpKSAmJiAhaXNWaWV3TW9kZSgpICYmICFhcnRpZmFjdC5pc0hFQVQoKSAmJiAhYXJ0aWZhY3QuaXNUaGlyZFBhcnR5KCkgJiYgIWlzTGljZW5zZUFydGlmYWN0KGFydGlmYWN0KX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJhcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lIiBkYXRhLW5nLWNsaWNrPSIhaXNWaWV3TW9kZSgpICYmICFpc0xvYWRpbmcgJiYgKCFpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKXx8aXNWRmlBcnRpZmFjdChhcnRpZmFjdCkpICYmICFhcnRpZmFjdC5pc0hFQVQoKSAmJiAhYXJ0aWZhY3QuaXNUaGlyZFBhcnR5KCkgJiYgIWlzTGljZW5zZUFydGlmYWN0KGFydGlmYWN0KSAmJiBhZGRPclVwZGF0ZShhcnRpZmFjdCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYXJ0aWZhY3QtaGVhdC1lbnYiIG5nLWlmPSJpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSAmJiBhcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5sZW5ndGgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW5hYmxlZCIgZGF0YS1uZy1iaW5kPSJnZXRFbnZBcnRpZmFjdE5hbWUoYXJ0aWZhY3QpIiBkYXRhLW5nLWNsaWNrPSIhaXNWaWV3TW9kZSgpICYmIGFkZE9yVXBkYXRlKGdldEVudkFydGlmYWN0KGFydGlmYWN0KSkiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvd25sb2FkLWFydGlmYWN0IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWJ1dHRvbiBkb3dubG9hZC1lbnYgc3ByaXRlIGUtc2RjLXNtYWxsLWRvd25sb2FkIGhhbmQiIGFydGlmYWN0PSJnZXRFbnZBcnRpZmFjdChhcnRpZmFjdCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ9ImN1cnJlbnRDb21wb25lbnQiIGluc3RhbmNlPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZG93bmxvYWQiPjwvZG93bmxvYWQtYXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1hcnRpZmFjdC1kZXRhaWxzLWRlc2MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWFydGlmYWN0LWRldGFpbHMtZGVzYy1sYWJlbCIgZGF0YS1uZy1zaG93PSJhcnRpZmFjdC5kZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9zcGFuPnt7YXJ0aWZhY3QuZGVzY3JpcHRpb259fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLWlmPSIhaXNWaWV3TW9kZSgpICYmIGFydGlmYWN0LmVzSWQgJiYgKCFpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKXx8aXNWRmlBcnRpZmFjdChhcnRpZmFjdCkpICYmICFhcnRpZmFjdC5pc0hFQVQoKSAmJiAhYXJ0aWZhY3QuaXNUaGlyZFBhcnR5KCkgJiYgIWlzTGljZW5zZUFydGlmYWN0KGFydGlmYWN0KSIgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYnV0dG9uIGRlbGV0ZSBzcHJpdGUgZS1zZGMtc21hbGwtaWNvbi1kZWxldGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZGVsZXRlIiBkYXRhLW5nLWNsaWNrPSJkZWxldGUoYXJ0aWZhY3QpIiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLWlmPSIhaXNWaWV3TW9kZSgpICYmIGlzQ29tcG9uZW50SW5zdGFuY2VTZWxlY3RlZCgpICYmIChnZXRFbnZBcnRpZmFjdChhcnRpZmFjdCkpLmhlYXRQYXJhbWV0ZXJzLmxlbmd0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1idXR0b24gYXR0YWNoIHNwcml0ZSBlLXNkYy1zbWFsbC1pY29uLXBhZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJvcGVuRWRpdEVudlBhcmFtZXRlcnNNb2RhbChnZXRFbnZBcnRpZmFjdChhcnRpZmFjdCkpIiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8ZG93bmxvYWQtYXJ0aWZhY3QgbmctaWY9ImFydGlmYWN0LmVzSWQgJiYgJ2RlcGxveW1lbnQnICE9IGFydGlmYWN0VHlwZSIgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYnV0dG9uIGRvd25sb2FkIHNwcml0ZSBlLXNkYy1zbWFsbC1kb3dubG9hZCBoYW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3Q9ImFydGlmYWN0IiBjb21wb25lbnQ9InNlbGVjdGVkQ29tcG9uZW50IiBkYXRhLXRlc3RzLWlkPSJkb3dubG9hZCI+PC9kb3dubG9hZC1hcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgPGRvd25sb2FkLWFydGlmYWN0IG5nLWlmPSJhcnRpZmFjdC5lc0lkICYmICdkZXBsb3ltZW50JyA9PSBhcnRpZmFjdFR5cGUiIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWJ1dHRvbiBkb3dubG9hZCBzcHJpdGUgZS1zZGMtc21hbGwtZG93bmxvYWQgaGFuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0PSJhcnRpZmFjdCIgY29tcG9uZW50PSJjdXJyZW50Q29tcG9uZW50IiBpbnN0YW5jZT0iaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCkiIGRhdGEtdGVzdHMtaWQ9ImRvd25sb2FkIj48L2Rvd25sb2FkLWFydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLWlmPSIhaXNWaWV3TW9kZSgpICYmICFhcnRpZmFjdC5lc0lkICYmIGFydGlmYWN0VHlwZT09PSdkZXBsb3ltZW50JyAmJiAhaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCkgJiYgIWFydGlmYWN0LmlzVGhpcmRQYXJ0eSgpIiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1idXR0b24gYXR0YWNoIHNwcml0ZSBlLXNkYy1zbWFsbC1pY29uLXVwbG9hZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZShhcnRpZmFjdCkiIHR5cGU9ImJ1dHRvbiIgZGF0YS10ZXN0cy1pZD0iYWRkX0FydGlmYWN0Ij48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tZm9vdGVyIiBkYXRhLW5nLWlmPSIhaXNWaWV3TW9kZSgpICYmIGFydGlmYWN0VHlwZSE9PSdhcGknICYmICghaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCl8fHNlbGVjdGVkQ29tcG9uZW50LnJlc291cmNlVHlwZT09J1ZGJykgJiYgIWN1cnJlbnRDb21wb25lbnQuaXNQcm9kdWN0KCkgJiYgKCdkZXBsb3ltZW50JyAhPSBhcnRpZmFjdFR5cGUgfHwgc2VsZWN0ZWRDb21wb25lbnQuaXNDb21wbGV4KCkpIj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1mb290ZXItYWN0aW9uIHRsdi1idG4gYmx1ZSIgZGF0YS10ZXN0cy1pZD0iYWRkX0FydGlmYWN0X0J1dHRvbiIgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoe30pIiB0eXBlPSJidXR0b24iPkFkZCBBcnRpZmFjdDwvYnV0dG9uPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvcGVyZmVjdC1zY3JvbGxiYXI+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvYXJ0aWZhY3RzL2FydGlmYWN0cy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2FydGlmYWN0cy9hcnRpZmFjdHMubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI2Y2E2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2FydGlmYWN0cy9hcnRpZmFjdHMubGVzcwpAQCAtMCwwICsxLDE3MiBAQAorLnctc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiLWNvbnRlbnQuYXJ0aWZhY3RzIHsKKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWFydGlmYWN0LmhhbmQgeworICAgICAgICAuaGFuZDsKKyAgICB9CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQgeworICAgICAgICBwYWRkaW5nOiAwOworICAgIH0KKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlIHsKKyAgICAgICAgJi5leHBhbmRlZCB7CisgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYXJ0aWZhY3QtZGV0YWlscyB7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgICAgd2lkdGg6IDE4MHB4OworICAgICAgICAmLmhlYXQgeworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHg7CisgICAgICAgICAgICB3aWR0aDogMjUwcHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1hcnRpZmFjdC1kZXRhaWxzLW5hbWUgeworICAgICAgICAuZ183OworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgbWF4LXdpZHRoOjIyMHB4OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIC8vdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7CisgICAgICAgICYuZW5hYmxlZCB7CisgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAuYV83OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1hcnRpZmFjdC1oZWF0LWVudiB7CisgICAgICAgIC5nXzc7CisgICAgICAgIG1hcmdpbi10b3A6IDZweDsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDQycHg7CisgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjYzhjZGQxOworICAgICAgICAuZW5hYmxlZCB7CisgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAuaGFuZDsKKyAgICAgICAgICAgICAgICAuYV83OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYXJ0aWZhY3QtZmlsZW5hbWUgeworICAgICAgICAuZ183OworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgbWF4LXdpZHRoOiAyMjVweDsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAuYm9sZDsKKyAgICAgICAgJi5lbmFibGVkIHsKKyAgICAgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgICAgIC5hXzc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWZpbGUtbGlua3sKKyAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCAjODQ4NTg2IHNvbGlkOworICAgICAgICBoZWlnaHQ6IDU4cHg7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAtMTFweDsKKyAgICAgICAgbWFyZ2luLXRvcDogMTFweDsKKyAgICAgICAgYm9yZGVyLXRvcDogMXB4ICM4NDg1ODYgc29saWQ7CisgICAgICAgIGJvcmRlci1ib3R0b206IDFweCAjODQ4NTg2IHNvbGlkOworICAgICAgICB3aWR0aDogMTJweDsKKyAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYXJ0aWZhY3QtZGV0YWlscy1kZXNjIHsKKyAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE2cHg7CisgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1hcnRpZmFjdC1kZXRhaWxzLWRlc2MtbGFiZWwgeworICAgICAgICAuYl8zOworICAgIH0KKworCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYXJ0aWZhY3QgeworICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2M4Y2RkMTsKKyAgICAgICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDE4cHg7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAvLyBsaW5lLWhlaWdodDogMzZweDsKKyAgICAgICAgbWluLWhlaWdodDogNjFweDsKKyAgICAgICAgY3Vyc29yOiBkZWZhdWx0OworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOworCisKKyAgICAgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYnV0dG9uIHsKKyAgICAgICAgICAgIHRvcDogMjBweDsKKyAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxMHB4OworICAgICAgICB9CisKKyAgICAgICAgJjpob3ZlciB7CisgICAgICAgICAgICAvL2JhY2tncm91bmQtY29sb3I6IEBjb2xvcl9jOworICAgICAgICAgICAgLmJnX2M7CisgICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgLjNzOworCisgICAgICAgICAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1idXR0b24geworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vTGlmZWN5Y2xlIE1hbmFnZW1lbnQKKy5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxtIHsKKyAgICAuYl83OworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAY29sb3JfZTsKKyAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgaGVpZ2h0OiA2NXB4OworICAgIHBhZGRpbmc6IDIycHggMDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisKKyAgICAmOmhvdmVyIHsKKyAgICAgICAgLmJnX2NfaG92ZXI7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAtMTBweDsKKyAgICAgICAgbWFyZ2luLXJpZ2h0OiAtMTBweDsKKyAgICAgICAgcGFkZGluZzogMjJweCAxMHB4OworCisgICAgICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxtLWljb24geworICAgICAgICAgICAgcmlnaHQ6IDE2cHg7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxtOmZpcnN0LWNoaWxkIHsKKyAgICBtYXJnaW4tdG9wOiAtMThweDsKK30KKworLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbG0taWNvbiB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiA2cHg7CisKKyAgICAvL1RPRE86IFJlcGxhY2UgdGhlIGljb25zLgorICAgICYuaWNvbi12aWV3IHsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUE0QUFBQUpDQVlBQUFBQ1RSMXBBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1ERTBJRGM1TGpFMU5qYzVOeXdnTWpBeE5DOHdPQzh5TUMwd09UbzFNem93TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFFnS0ZkcGJtUnZkM01wSWlCNGJYQk5UVHBKYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pkR01ETkJSVUpETURreE5qRXhSVFZDTWpSQk9FSTVRek14UVRsQlFqWTRJaUI0YlhCTlRUcEViMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPamRHTUROQlJVSkVNRGt4TmpFeFJUVkNNalJCT0VJNVF6TXhRVGxCUWpZNElqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZOMFl3TTBGRlFrRXdPVEUyTVRGRk5VSXlORUU0UWpsRE16RkJPVUZDTmpnaUlITjBVbVZtT21SdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk4wWXdNMEZGUWtJd09URTJNVEZGTlVJeU5FRTRRamxETXpGQk9VRkNOamdpTHo0Z1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0lEd3ZjbVJtT2xKRVJqNGdQQzk0T25odGNHMWxkR0UrSUR3L2VIQmhZMnRsZENCbGJtUTlJbklpUHo0VTJkZWNBQUFCUlVsRVFWUjQycHlSUFV2RFVCU0czOXQyVXl5YUJndldRWk1xS29GcTRsQkgwVTBVcVhTeEtQYVBpZUNvV1BBUEtJZ2RqRzFvaGFnaE9yU1IxaWFMS01YcG1uTWhRVmZQY0xtYzh6eHdQaGpuSEZFNHJ4M2VNTy93NHJyNCt2d1F1WkhSTWN3cUNsYU1WZVJucGxuRXNrZzhPNy9nOTZZSlNaTGdCejUrUjBiS0lBZ0M2SWFCdmRLdWtCUDBISitjY3R1MmNWQ3RRc3JJVUZVVmxjcCtMRTZFSXRXSUlWYUlWOWMzL1BuUlJxbGN4a0plWVYydmkrL2hFTy85UVN4NmI1Nm9FVU1zT2FsNi9UYWNRY1hpbkNwYUdFK24wUW5sanVmRkl1VW9pQWxaVGs2aVdGeUQ2enBvV2kzUnd2cm1CbExKWkN6Um4zSVV4QkJMamxnTzllMDZUOWphM3NHeXJxUFg2Nk50V1FMV0NnVmtzNU93bWcxYzFtcFE4dk00T3F5d1AxczF3MVBrcG5KWTBqVElzaXp5L3NESFE3c0ZtdDBJVHhKdGxmMzNqajhDREFEaEI1MnRFWDZpZkFBQUFBQkpSVTVFcmtKZ2dnPT0nKTsKKyAgICAgICAgaGVpZ2h0OiA5cHg7CisgICAgICAgIHRvcDogMjlweDsKKyAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgfQorCisgICAgLy9UT0RPOiBSZXBsYWNlIHRoZSBpY29ucy4KKyAgICAmLmljb24tYWxlcnQgeworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQThBQUFBTkNBWUFBQUIySGpSQkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURFMElEYzVMakUxTmpjNU55d2dNakF4TkM4d09DOHlNQzB3T1RvMU16b3dNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UUWdLRmRwYm1SdmQzTXBJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPamhCTTBZeFFUQkNNRGt5TURFeFJUVkJOemxDUVVZeE5FWXdNRFV3T1RRNUlpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09qaEJNMFl4UVRCRE1Ea3lNREV4UlRWQk56bENRVVl4TkVZd01EVXdPVFE1SWo0Z1BIaHRjRTFOT2tSbGNtbDJaV1JHY205dElITjBVbVZtT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9FRXpSakZCTURrd09USXdNVEZGTlVFM09VSkJSakUwUmpBd05UQTVORGtpSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0VFelJqRkJNRUV3T1RJd01URkZOVUUzT1VKQlJqRTBSakF3TlRBNU5Ea2lMejRnUEM5eVpHWTZSR1Z6WTNKcGNIUnBiMjQrSUR3dmNtUm1PbEpFUmo0Z1BDOTRPbmh0Y0cxbGRHRStJRHcvZUhCaFkydGxkQ0JsYm1ROUluSWlQejdleGdjZUFBQUI1a2xFUVZSNDJveVN5MnRUUVJUR2Z6TjNjcHZicEZUYVVselVqZUN1VkZ5SmY0RHVDbDM0d0wvQ3JicFV1bkxud3BVdUZGeTQ4SUZpd1lXaHBZdVcrZ0NMcmJXS0JRdW1hUkliYTV1YjNNY2NKNVdFQ0NWNDRNRE1tZTg3My9sbUJoR2huWnVsY24vMy9zZnJPN0ovNDVSMDE3cFQweFVTMmJDOTN2eTJMQU9MdDVEZkNlVW4xNFJENGgveXNiSFJEaWkvOHB5bzdEbUZpUDdWWjRSYnU5S1QzSTdpK3FKa2xwN2liUXQySjZIZU5PaFhWL2d2OHREY2JhTHRYWUxKS2VUY1pmeHFTUFB6dkd1NklEM0oxUTh6MG55L2hJa001c3dGOHFlblVGVWZ3aXhIQ3RkN0t3ZXowNGpPZ0VtYytocTZ0dVo4TjlFNnhHNVUrUG4ya1J4S0xzN2VFN3RSYzBYbFRvUk0yc0QrMnNHbURpWStrV3NTRkc1MjhLcjFYZ2ZqZm4wbjV1RWx2RnJyelZxVkRIcWtpVEtqeENzVjlMQngwOFFrZ2NZL2VaSCs4OU9xbyt4OWV1bWt3UWFRYW9QRUtXcHNISE44QXJJdGdMdDVVZGlHNjczNm1GTHhpeHlRdCtidmlpazhRUHVhTkZSSWtqcVFSWjJZSkRvNlFXeWRqVFJ0T2NHUFBkSktnbmx4RmZOOWZWbUdOaGVjUjRVM21Mckw2blBUUlRRSFhaTzUrNGp5eUk0SXFzOTlHSnZnQmlLamN5U2xqMzg5N3k2L2ticmVJNHcwUVM3QVN4cnNhNC9jWGt4a0l6SzVQS21OcVJNdzdOZmRlY3pBK0ZuMVI0QUJBUG5NQWVDamtnZjVBQUFBQUVsRlRrU3VRbUNDJyk7CisgICAgICAgIGhlaWdodDogMTNweDsKKyAgICAgICAgdG9wOiAyN3B4OworICAgICAgICB3aWR0aDogMTVweDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9kZXRhaWxzL2RldGFpbHMtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9kZXRhaWxzL2RldGFpbHMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjhkZThkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2RldGFpbHMvZGV0YWlscy12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMTMyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUVkaXRSZXNvdXJjZVZlcnNpb24geworICAgICAgICBhbGxWZXJzaW9uczogYW55OworICAgICAgICBjaGFuZ2VWZXJzaW9uOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElEZXRhaWxzVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJQ29tcG9zaXRpb25WaWV3TW9kZWxTY29wZSB7CisgICAgICAgIGlzTG9hZGluZzogYm9vbGVhbjsKKyAgICAgICAgJHBhcmVudDogSUNvbXBvc2l0aW9uVmlld01vZGVsU2NvcGU7CisgICAgICAgIGV4cGFuZGVkU2VjdGlvbjogQXJyYXk8c3RyaW5nPjsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBlZGl0UmVzb3VyY2VWZXJzaW9uOiBJRWRpdFJlc291cmNlVmVyc2lvbjsKKworICAgICAgICBjaGFuZ2VSZXNvdXJjZVZlcnNpb24oKTogdm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRGV0YWlsc1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ0xlZnRQYWxldHRlTG9hZGVyU2VydmljZScsCisgICAgICAgICAgICAnRXZlbnRMaXN0ZW5lclNlcnZpY2UnCisKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJRGV0YWlsc1ZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIExlZnRQYWxldHRlTG9hZGVyU2VydmljZTpTZXJ2aWNlcy5Db21wb25lbnRzLkxlZnRQYWxldHRlTG9hZGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBldmVudExpc3RlbmVyU2VydmljZTpTZXJ2aWNlcy5FdmVudExpc3RlbmVyU2VydmljZSkgeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xlYXJTZWxlY3RlZFZlcnNpb24gPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRSZXNvdXJjZVZlcnNpb24gPSB7CisgICAgICAgICAgICAgICAgYWxsVmVyc2lvbnM6IHt9LAorICAgICAgICAgICAgICAgIGNoYW5nZVZlcnNpb246IG51bGwKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSB2ZXJzaW9uaW5nOkZ1bmN0aW9uID0gKHZlcnNpb25OdW1iZXI6c3RyaW5nKTpzdHJpbmcgPT4geworICAgICAgICAgICAgbGV0IHZlcnNpb246QXJyYXk8c3RyaW5nPiA9IHZlcnNpb25OdW1iZXIuc3BsaXQoJy4nKTsKKyAgICAgICAgICAgIHJldHVybiAnMDAwMDAwMDAnLnNsaWNlKHZlcnNpb25bMF0ubGVuZ3RoKSArIHZlcnNpb25bMF0gKyAnLicgKyAnMDAwMDAwMDAnLnNsaWNlKHZlcnNpb25bMV0ubGVuZ3RoKSArIHZlcnNpb25bMV07CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0RWRpdFJlc291cmNlVmVyc2lvbiA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkVmVyc2lvbigpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFJlc291cmNlVmVyc2lvbi5hbGxWZXJzaW9uc1t0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2UuY29tcG9uZW50VmVyc2lvbl0gPSB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2UuY29tcG9uZW50VWlkOworICAgICAgICAgICAgXy5tZXJnZSh0aGlzLiRzY29wZS5lZGl0UmVzb3VyY2VWZXJzaW9uLmFsbFZlcnNpb25zLCBhbmd1bGFyLmNvcHkodGhpcy4kc2NvcGUuc2VsZWN0ZWRDb21wb25lbnQuYWxsVmVyc2lvbnMpKTsKKyAgICAgICAgICAgIGxldCBzb3J0ZWQ6YW55PSBfLnNvcnRCeShfLnRvUGFpcnModGhpcy4kc2NvcGUuZWRpdFJlc291cmNlVmVyc2lvbi5hbGxWZXJzaW9ucyksIChpdGVtKT0+eworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb25pbmcoaXRlbVswXSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZFZlcnNpb24oKTsKKyAgICAgICAgICAgIF8uZm9yRWFjaChzb3J0ZWQsIChpdGVtKT0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0UmVzb3VyY2VWZXJzaW9uLmFsbFZlcnNpb25zW2l0ZW1bMF1dPSBpdGVtWzFdOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGxldCBoaWdoZXN0VmVyc2lvbiA9IF8ubGFzdChPYmplY3Qua2V5cyh0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudC5hbGxWZXJzaW9ucykpOworCisgICAgICAgICAgICAvL1RPRE8gLSBhc2sgcm9ubnkgLSB3aGF0IGhhcHBlbmQgaWYgdGhlIHBhcmVudCBpcyBub3QgaW4gdGhlIGxlZnRQYWxldHRlICAoaW5zdGFuY2Ugb2YgY3NhciBmb3IgZXhhbXBsZSkKKyAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KGhpZ2hlc3RWZXJzaW9uKSAlIDEpIHsgLy9pZiBoaWdoZXN0IGlzIG1pbm9yLCBtYWtlIHN1cmUgaXQgaXMgdGhlIGxhdGVzdCBjaGVja2VkIGluIC0KKyAgICAgICAgICAgICAgICBsZXQgbGF0ZXN0VmVyc2lvbkNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPSBfLmZpbmQodGhpcy5MZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UuZ2V0RnVsbERhdGFDb21wb25lbnRMaXN0V2l0aFZscyh0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LmNvbXBvbmVudFR5cGUpLCAoY29tcG9uZW50Ok1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCkgPT4geyAvL2xhdGVzdCBjaGVja2VkIGluCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29tcG9uZW50LnN5c3RlbU5hbWUgPT09IHRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50LnN5c3RlbU5hbWUKKyAgICAgICAgICAgICAgICAgICAgfHwgY29tcG9uZW50LnV1aWQgPT09IHRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50LnV1aWQpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGxldCBsYXRlc3RWZXJzaW9uOnN0cmluZyA9IGxhdGVzdFZlcnNpb25Db21wb25lbnQgPyBsYXRlc3RWZXJzaW9uQ29tcG9uZW50LnZlcnNpb24gOiBoaWdoZXN0VmVyc2lvbjsKKworICAgICAgICAgICAgICAgIGlmIChoaWdoZXN0VmVyc2lvbiAhPSBsYXRlc3RWZXJzaW9uKSB7IC8vaGlnaGVzdCBpcyBjaGVja2VkIG91dCAtIHJlbW92ZSBmcm9tIG9wdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFJlc291cmNlVmVyc2lvbi5hbGxWZXJzaW9ucyA9IF8ub21pdCh0aGlzLiRzY29wZS5lZGl0UmVzb3VyY2VWZXJzaW9uLmFsbFZlcnNpb25zLCBoaWdoZXN0VmVyc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdFJlc291cmNlVmVyc2lvbi5jaGFuZ2VWZXJzaW9uID0gdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5zZWxlY3RlZEluc3RhbmNlLmNvbXBvbmVudFZlcnNpb247CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHBhcmVudC5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmV4cGFuZGVkU2VjdGlvbiA9IFsnZ2VuZXJhbCcsICd0YWdzJ107CisgICAgICAgICAgICAvL3RoaXMuY2xlYXJTZWxlY3RlZFZlcnNpb24oKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHdhdGNoKCdzZWxlY3RlZENvbXBvbmVudCcsIChjb21wb25lbnQ6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmlzQ29tcG9uZW50SW5zdGFuY2VTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEVkaXRSZXNvdXJjZVZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hhbmdlUmVzb3VyY2VWZXJzaW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS4kcGFyZW50LmlzTG9hZGluZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHBhcmVudC5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50KGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZVNlbGVjdGVkQ29tcG9uZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyU2VydmljZS5ub3RpZnlPYnNlcnZlcnMoU2RjLlV0aWxzLkNvbnN0YW50cy5HUkFQSF9FVkVOVFMuT05fVkVSU0lPTl9DSEFOR0VELCB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS4kcGFyZW50LmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRVaWQ6c3RyaW5nID0gdGhpcy4kc2NvcGUuZWRpdFJlc291cmNlVmVyc2lvbi5hbGxWZXJzaW9uc1t0aGlzLiRzY29wZS5lZGl0UmVzb3VyY2VWZXJzaW9uLmNoYW5nZVZlcnNpb25dOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuY2hhbmdlQ29tcG9uZW50SW5zdGFuY2VWZXJzaW9uKGNvbXBvbmVudFVpZCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvZGV0YWlscy9kZXRhaWxzLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9kZXRhaWxzL2RldGFpbHMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTQ2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvZGV0YWlscy9kZXRhaWxzLXZpZXcuaHRtbApAQCAtMCwwICsxLDEyOSBAQAorPHBlcmZlY3Qtc2Nyb2xsYmFyIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItdGFiLWNvbnRlbnQgZGV0YWlscyI+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24iPgorICAgICAgICA8bG9hZGVyIGRhdGEtZGlzcGxheT0iaXNMb2FkaW5nIj48L2xvYWRlcj4KKyAgICAgICAgPGV4cGFuZC1jb2xsYXBzZSBleHBhbmRlZC1zZWxlY3Rvcj0iLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LmdlbmVyYWwiIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUiPgorCisgICAgICAgICAgICBHZW5lcmFsIEluZm8KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZS1pY29uIj48L2Rpdj4KKyAgICAgICAgPC9leHBhbmQtY29sbGFwc2U+CisKKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQgZ2VuZXJhbCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+VHlwZTo8L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiICBkYXRhLXRlc3RzLWlkPSJyaWdodFRhYl9jb21wb25lbnRUeXBlIiBkYXRhLW5nLWJpbmQ9InNlbGVjdGVkQ29tcG9uZW50LmNvbXBvbmVudFR5cGUiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSIgZGF0YS1uZy1pZj0ic2VsZWN0ZWRDb21wb25lbnQuaXNSZXNvdXJjZSgpIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+UmVzb3VyY2UgVHlwZTo8L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIGRhdGEtbmctaWY9InNlbGVjdGVkQ29tcG9uZW50LmlzUmVzb3VyY2UoKSIgZGF0YS1uZy1iaW5kPSJzZWxlY3RlZENvbXBvbmVudC5yZXNvdXJjZVR5cGUiCisgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSImIzgyMDM7e3tzZWxlY3RlZENvbXBvbmVudC5yZXNvdXJjZVR5cGUgfCByZXNvdXJjZVR5cGVOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0icmlnaHRUYWJfcmVzb3VyY2VUeXBlIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorCisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPlZlcnNpb246PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaWY9IiFpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSB8fCBzZWxlY3RlZENvbXBvbmVudC5pc1ZsKCkiICBkYXRhLXRlc3RzLWlkPSJyaWdodFRhYl92ZXJzaW9uIiBkYXRhLW5nLWJpbmQ9InNlbGVjdGVkQ29tcG9uZW50LnZlcnNpb24iPjwvc3Bhbj4KKworICAgICAgICAgICAgICAgIDxuZy1mb3JtIG5hbWU9ImVkaXRGb3JtIiBkYXRhLW5nLWlmPSJpc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSAmJiAhc2VsZWN0ZWRDb21wb25lbnQuaXNWbCgpIj4KKyAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBkYXRhLW5nLW1vZGVsPSJlZGl0UmVzb3VyY2VWZXJzaW9uLmNoYW5nZVZlcnNpb24iIG5hbWU9ImNoYW5nZVZlcnNpb24iIGRhdGEtbmctZGlzYWJsZWQ9IiRwYXJlbnQuaXNWaWV3T25seSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSBpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J21pbm9yJzogKGVkaXRSZXNvdXJjZVZlcnNpb24uY2hhbmdlVmVyc2lvbiklMX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jaGFuZ2U9ImNoYW5nZVJlc291cmNlVmVyc2lvbigpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gY2xhc3M9InNlbGVjdC1pbnN0YW5jZS12ZXJzaW9uIiBkYXRhLW5nLWNsYXNzPSJ7J21pbm9yJzoga2V5JTF9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1yZXBlYXQ9IihrZXksIHZhbHVlKSBpbiBlZGl0UmVzb3VyY2VWZXJzaW9uLmFsbFZlcnNpb25zIj57e2tleX19PC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PjwvbmctZm9ybT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSIgZGF0YS1uZy1pZj0ic2VsZWN0ZWRDb21wb25lbnQuY2F0ZWdvcmllcyAmJiBzZWxlY3RlZENvbXBvbmVudC5jYXRlZ29yaWVzWzBdIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+Q2F0ZWdvcnk6PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9InNlbGVjdGVkQ29tcG9uZW50LmNhdGVnb3JpZXNbMF0ubmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0iJiM4MjAzO3t7c2VsZWN0ZWRDb21wb25lbnQuY2F0ZWdvcmllc1swXS5uYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJyaWdodFRhYl9jYXRlZ29yeSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIiBkYXRhLW5nLWlmPSJzZWxlY3RlZENvbXBvbmVudC5jYXRlZ29yaWVzICYmIHNlbGVjdGVkQ29tcG9uZW50LmNhdGVnb3JpZXNbMF0gJiYgc2VsZWN0ZWRDb21wb25lbnQuY2F0ZWdvcmllc1swXS5zdWJjYXRlZ29yaWVzIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+U3ViIENhdGVnb3J5Ojwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJzZWxlY3RlZENvbXBvbmVudC5jYXRlZ29yaWVzWzBdLnN1YmNhdGVnb3JpZXNbMF0ubmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9IiYjODIwMzt7e3NlbGVjdGVkQ29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS5uYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0icmlnaHRUYWJfc3ViQ2F0ZWdvcnkiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPkNyZWF0aW9uIERhdGU6PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9InNlbGVjdGVkQ29tcG9uZW50LmNyZWF0aW9uRGF0ZSB8IGRhdGU6ICdNTS9kZC95eXl5JyIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJyaWdodFRhYl9jcmVhdGlvbkRhdGUiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPkF1dGhvcjo8L3NwYW4+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tdmFsdWUiIGRhdGEtbmctYmluZD0ic2VsZWN0ZWRDb21wb25lbnQuY3JlYXRvckZ1bGxOYW1lIgorICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0iJiM4MjAzO3t7c2VsZWN0ZWRDb21wb25lbnQuY3JlYXRvckZ1bGxOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0icmlnaHRUYWJfYXV0aG9yIj4KKyAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iIGRhdGEtbmctaWY9InNlbGVjdGVkQ29tcG9uZW50LmlzU2VydmljZSgpIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1BST0pFQ1RfQ09ERSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InJpZ2h0VGFiX3Byb2plY3RDb2RlIiBkYXRhLW5nLWJpbmQ9InNlbGVjdGVkQ29tcG9uZW50LnByb2plY3RDb2RlIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iIGRhdGEtbmctaWY9InNlbGVjdGVkQ29tcG9uZW50LmlzUmVzb3VyY2UoKSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPlZlbmRvciBOYW1lOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSIgZGF0YS1uZy1iaW5kPSJzZWxlY3RlZENvbXBvbmVudC52ZW5kb3JOYW1lIgorICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0iJiM4MjAzO3t7c2VsZWN0ZWRDb21wb25lbnQudmVuZG9yTmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InJpZ2h0VGFiX3ZlbmRvck5hbWUiPgorICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSIgZGF0YS1uZy1pZj0ic2VsZWN0ZWRDb21wb25lbnQuaXNSZXNvdXJjZSgpIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+VmVuZG9yIFJlbGVhc2U6PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9InNlbGVjdGVkQ29tcG9uZW50LnZlbmRvclJlbGVhc2UiCisgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jbGFzcz0idG9vbHRpcC1jdXN0b20gYnJlYWstd29yZC10b29sdGlwIiB0b29sdGlwLWNvbnRlbnQ9IiYjODIwMzt7e3NlbGVjdGVkQ29tcG9uZW50LnZlbmRvclJlbGVhc2V9fSIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJyaWdodFRhYl92ZW5kb3JSZWxlYXNlIj4KKyAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0iPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWxhYmVsIiB0cmFuc2xhdGU9IkdFTkVSQUxfTEFCRUxfQ09OVEFDVF9JRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIiBkYXRhLW5nLWJpbmQ9InNlbGVjdGVkQ29tcG9uZW50LmNvbnRhY3RJZCIKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJyaWdodFRhYl91c2VySWQiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSBkZXNjcmlwdGlvbiI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwiPkRlc2NyaXB0aW9uOgorCisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1kZXNjcmlwdGlvbi1pdGVtLXZhbHVlIiBlbGxpcHNpcz0ic2VsZWN0ZWRDb21wb25lbnQuZGVzY3JpcHRpb24iIG1heC1jaGFycz0iNTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InJpZ2h0VGFiX2Rlc2NyaXB0aW9uIj48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24gYWRkaXRpb25hbEluZm9ybWF0aW9uIj4KKyAgICAgICAgPGV4cGFuZC1jb2xsYXBzZSBleHBhbmRlZC1zZWxlY3Rvcj0iLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LmFkZGl0aW9uYWxJbmZvcm1hdGlvbiIgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZSI+CisgICAgICAgICAgICBBZGRpdGlvbmFsIEluZm9ybWF0aW9uCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtaWNvbiI+PC9kaXY+CisgICAgICAgIDwvZXhwYW5kLWNvbGxhcHNlPgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50IGFkZGl0aW9uYWxJbmZvcm1hdGlvbiI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIiBkYXRhLW5nLXJlcGVhdD0iYWRkaXRpb25hbEluZm9ybWF0aW9uIGluIHNlbGVjdGVkQ29tcG9uZW50LmdldEFkZGl0aW9uYWxJbmZvcm1hdGlvbigpIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwgYWRkaXRpb25hbC1pbmZvcm1hdGlvbiIgZGF0YS1uZy1iaW5kPSJhZGRpdGlvbmFsSW5mb3JtYXRpb24ua2V5IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YWRkaXRpb25hbEluZm9ybWF0aW9uLmtleX19Ij48L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1sYWJlbCI+Ojwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS12YWx1ZSBhZGRpdGlvbmFsLWluZm9ybWF0aW9uIiBkYXRhLW5nLWJpbmQ9ImFkZGl0aW9uYWxJbmZvcm1hdGlvbi52YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNsYXNzPSJ0b29sdGlwLWN1c3RvbSBicmVhay13b3JkLXRvb2x0aXAiIHRvb2x0aXAtY29udGVudD0ie3thZGRpdGlvbmFsSW5mb3JtYXRpb24udmFsdWV9fSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24gdGFncyI+CisgICAgICAgIDxleHBhbmQtY29sbGFwc2UgZXhwYW5kZWQtc2VsZWN0b3I9Ii53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC50YWdzIiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlIj4KKyAgICAgICAgICAgIFRhZ3MKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZS1pY29uIj48L2Rpdj4KKyAgICAgICAgPC9leHBhbmQtY29sbGFwc2U+CisKKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQgdGFncyI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS10YWciIGRhdGEtbmctcmVwZWF0PSJ0YWcgaW4gc2VsZWN0ZWRDb21wb25lbnQudGFncyB0cmFjayBieSAkaW5kZXgiIGRhdGEtbmctYmluZD0idGFnIgorICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InJpZ2h0VGFiX3RhZyIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3RhZ319Ij48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKzwvcGVyZmVjdC1zY3JvbGxiYXI+CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9kZXRhaWxzL2RldGFpbHMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9kZXRhaWxzL2RldGFpbHMubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhlMTMwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2RldGFpbHMvZGV0YWlscy5sZXNzCkBAIC0wLDAgKzEsNjggQEAKKy53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYi1jb250ZW50LmRldGFpbHMgeworCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZSArIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudCB7CisgICAgICAgIHBhZGRpbmc6IDAgMTBweCAwIDE4cHg7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZS5leHBhbmRlZCArIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudCB7CisgICAgICAgIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDE4cHg7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tbGFiZWwgeworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgJi5hZGRpdGlvbmFsLWluZm9ybWF0aW9ueworICAgICAgICAgICAgbWF4LXdpZHRoOjEwMHB4OworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXZhbHVlIHsKKyAgICAgICAvLyAuaHlwaGVuYXRlOworICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIG1heC13aWR0aDogMTYwcHg7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOmJvdHRvbTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICAgICAgJi5hZGRpdGlvbmFsLWluZm9ybWF0aW9ueworICAgICAgICAgICAgbWF4LXdpZHRoOjE2MHB4OworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICB9CisgICAgICAgICYuaS1zZGMtZm9ybS1zZWxlY3QgeworICAgICAgICAgICAgLmJfMTsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZjsKKyAgICAgICAgICAgIHdpZHRoOiAyMTBweDsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjEwcHg7CisgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDsKKworICAgICAgICAgICAgLnNlbGVjdC1pbnN0YW5jZS12ZXJzaW9uIHsKKyAgICAgICAgICAgICAgICAuYl8xOworICAgICAgICAgICAgICAgICYubWlub3IgeworICAgICAgICAgICAgICAgICAgICAuaF8xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAmLm1pbm9yIHsKKyAgICAgICAgICAgIC5oXzE7CisgICAgICAgIH0KKyAgICB9CisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWRlc2NyaXB0aW9uLWl0ZW0tdmFsdWV7CisgICAgICAgIG1heC13aWR0aDogbm9uZTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24udGFncyB7CisgICAgICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIHsKKyAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYyNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3Byb3BlcnRpZXMtYW5kLWF0dHJpYnV0ZXMvcHJvcGVydGllcy12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMjI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSVJlc291cmNlUHJvcGVydGllc0FuZEF0dHJpYnV0ZXNWaWV3TW9kZWxTY29wZSBleHRlbmRzIElDb21wb3NpdGlvblZpZXdNb2RlbFNjb3BlIHsKKyAgICAgICAgcHJvcGVydGllczogTW9kZWxzLlByb3BlcnRpZXNHcm91cDsKKyAgICAgICAgYXR0cmlidXRlczogTW9kZWxzLkF0dHJpYnV0ZXNHcm91cDsKKyAgICAgICAgcHJvcGVydGllc01lc3NhZ2U6IHN0cmluZzsKKyAgICAgICAgYWRkUHJvcGVydHkoKTogdm9pZDsKKyAgICAgICAgdXBkYXRlUHJvcGVydHkocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOiB2b2lkOworICAgICAgICBkZWxldGVQcm9wZXJ0eShwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6IHZvaWQ7CisgICAgICAgIHZpZXdBdHRyaWJ1dGUoYXR0cmlidXRlOk1vZGVscy5BdHRyaWJ1dGVNb2RlbCk6IHZvaWQ7CisgICAgICAgIGdyb3VwTmFtZUJ5S2V5KGtleTpzdHJpbmcpOiBzdHJpbmc7CisgICAgICAgIGlzUHJvcGVydHlPd25lcigpOmJvb2xlYW47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFJlc291cmNlUHJvcGVydGllc1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJyRtb2RhbCcsCisgICAgICAgICAgICAnJHRlbXBsYXRlQ2FjaGUnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInCisgICAgICAgIF07CisKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJUmVzb3VyY2VQcm9wZXJ0aWVzQW5kQXR0cmlidXRlc1ZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNb2RhbHNIYW5kbGVyOiBVdGlscy5Nb2RhbHNIYW5kbGVyKSB7CisKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRDb21wb25lbnRQcm9wZXJ0aWVzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgcmVzdWx0Ok1vZGVscy5Qcm9wZXJ0aWVzR3JvdXAgPSB7fTsKKworICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuc2VsZWN0ZWRDb21wb25lbnQpeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnByb3BlcnRpZXNNZXNzYWdlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmlzQ29tcG9uZW50SW5zdGFuY2VTZWxlY3RlZCgpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS5vcmlnaW5UeXBlPT09J1ZGJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYWxseSBmaXggdG8gaGlkZSBwcm9wZXJ0aWVzIGZvciBWRiAoVUkgc3RhY2sgd2hlbiB0aGVyZSBhcmUgbWFueSBwcm9wZXJ0aWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUucHJvcGVydGllc01lc3NhZ2UgPSAiTm90ZTogcHJvcGVydGllcyBmb3IgVkYgYXJlIGRpc2FibGVkIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2UudW5pcXVlSWRdID0gdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzW3RoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS51bmlxdWVJZF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LmlzU2VydmljZSgpKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYWxseSBmaXggdG8gaGlkZSBwcm9wZXJ0aWVzIGZvciBzZXJ2aWNlIChVSSBzdGFjayB3aGVuIHRoZXJlIGFyZSBtYW55IHByb3BlcnRpZXMpCisgICAgICAgICAgICAgICAgICAgIC8vcmVzdWx0ID0gdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNQcm9wZXJ0aWVzOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9wZXJ0aWVzTWVzc2FnZSA9ICJOb3RlOiBwcm9wZXJ0aWVzIGZvciBzZXJ2aWNlIGFyZSBkaXNhYmxlZCI7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudC51bmlxdWVJZDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV09IEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPigpOworICAgICAgICAgICAgICAgICAgICBsZXQgZGVyaXZlZCA9IEFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPigpOworICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuc2VsZWN0ZWRDb21wb25lbnQucHJvcGVydGllcywgKHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihrZXkgPT0gcHJvcGVydHkucGFyZW50VW5pcXVlSWQpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2gocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucmVhZG9ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQucHVzaChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBpZihkZXJpdmVkLmxlbmd0aCl7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2Rlcml2ZWQnXT0gZGVyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9wZXJ0aWVzID0gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisKKyAgICAgICAgcHJpdmF0ZSBpbml0Q29tcG9uZW50QXR0cmlidXRlcyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgbGV0IHJlc3VsdDpNb2RlbHMuQXR0cmlidXRlc0dyb3VwID0ge307CisKKyAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50KXsKKyAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5pc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSl7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2UudW5pcXVlSWRdID0gdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzW3RoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS51bmlxdWVJZF07CisgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5pc1NlcnZpY2UoKSl7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzQXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXR0cmlidXRlcyA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIG9wZW5FZGl0UHJvcGVydHlNb2RhbCA9IChwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgdmlld01vZGVsc0h0bWxCYXNlUGF0aDpzdHJpbmcgPSAnL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzLyc7CisKKyAgICAgICAgICAgIGxldCBtb2RhbE9wdGlvbnM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLiR0ZW1wbGF0ZUNhY2hlLmdldCh2aWV3TW9kZWxzSHRtbEJhc2VQYXRoICsgJ2Zvcm1zL3Byb3BlcnR5LWZvcm0vcHJvcGVydHktZm9ybS12aWV3Lmh0bWwnKSwKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnU2RjLlZpZXdNb2RlbHMuUHJvcGVydHlGb3JtVmlld01vZGVsJywKKyAgICAgICAgICAgICAgICBzaXplOiAnc2RjLWwnLAorICAgICAgICAgICAgICAgIGJhY2tkcm9wOiAnc3RhdGljJywKKyAgICAgICAgICAgICAgICBrZXlib2FyZDogZmFsc2UsCisgICAgICAgICAgICAgICAgcmVzb2x2ZTogeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogKCk6TW9kZWxzLlByb3BlcnR5TW9kZWwgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICgpOk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRQcm9wZXJ0aWVzOiAoKTpBcnJheTxNb2RlbHMuUHJvcGVydHlNb2RlbD4gPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLnNlbGVjdGVkQ29tcG9uZW50LnByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgbGV0IG1vZGFsSW5zdGFuY2U6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZSA9IHRoaXMuJG1vZGFsLm9wZW4obW9kYWxPcHRpb25zKTsKKyAgICAgICAgICAgIG1vZGFsSW5zdGFuY2UKKyAgICAgICAgICAgICAgICAucmVzdWx0CisgICAgICAgICAgICAgICAgLnRoZW4oKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAvLyAgdGhpcy5pbml0Q29tcG9uZW50UHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgb3BlbkF0dHJpYnV0ZU1vZGFsID0gKGF0cnJpYnV0ZTpNb2RlbHMuQXR0cmlidXRlTW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgbGV0IHZpZXdNb2RlbHNIdG1sQmFzZVBhdGg6c3RyaW5nID0gJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy8nOworCisgICAgICAgICAgICBsZXQgbW9kYWxPcHRpb25zOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXR0aW5ncyA9IHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICdmb3Jtcy9hdHRyaWJ1dGUtZm9ybS9hdHRyaWJ1dGUtZm9ybS12aWV3Lmh0bWwnKSwKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnU2RjLlZpZXdNb2RlbHMuQXR0cmlidXRlRm9ybVZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogJ3NkYy1tZCcsCisgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAorICAgICAgICAgICAgICAgIGtleWJvYXJkOiBmYWxzZSwKKyAgICAgICAgICAgICAgICByZXNvbHZlOiB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogKCk6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHJyaWJ1dGU7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCk6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuJG1vZGFsLm9wZW4obW9kYWxPcHRpb25zKTsKKyAgICAgICAgfTsKKworCisKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50UHJvcGVydGllcygpOworICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50QXR0cmlidXRlcygpOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdjdXJyZW50Q29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1Byb3BlcnRpZXMnLCAobmV3RGF0YTphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdjdXJyZW50Q29tcG9uZW50LnByb3BlcnRpZXMnLCAobmV3RGF0YTphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2goJ2N1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZScsIChuZXdJbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5ld0luc3RhbmNlKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb21wb25lbnRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignY3VycmVudENvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNBdHRyaWJ1dGVzJywgKG5ld0RhdGE6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmluaXRDb21wb25lbnRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNQcm9wZXJ0eU93bmVyID0gKCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQgJiYgdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5pc1Jlc291cmNlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIXRoaXMuJHNjb3BlLmlzQ29tcG9uZW50SW5zdGFuY2VTZWxlY3RlZCgpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWRkUHJvcGVydHkgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHkgPSBuZXcgTW9kZWxzLlByb3BlcnR5TW9kZWwoKTsKKyAgICAgICAgICAgICAgICB0aGlzLm9wZW5FZGl0UHJvcGVydHlNb2RhbChwcm9wZXJ0eSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVQcm9wZXJ0eSA9IChwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5vcGVuRWRpdFByb3BlcnR5TW9kYWwocHJvcGVydHkpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGVsZXRlUHJvcGVydHkgPSAocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpOnZvaWQgPT4geworCisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY3VycmVudENvbXBvbmVudC5kZWxldGVQcm9wZXJ0eShwcm9wZXJ0eS51bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCB0aXRsZTpzdHJpbmcgPSAgdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiUFJPUEVSVFlfVklFV19ERUxFVEVfTU9EQUxfVElUTEUiKTsKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTpzdHJpbmcgPSB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJQUk9QRVJUWV9WSUVXX0RFTEVURV9NT0RBTF9URVhUIiwgInsnbmFtZSc6ICciICsgcHJvcGVydHkubmFtZSArICInfSIpOworICAgICAgICAgICAgICAgIHRoaXMuTW9kYWxzSGFuZGxlci5vcGVuQ29uZmlybWF0aW9uTW9kYWwodGl0bGUsIG1lc3NhZ2UsIGZhbHNlKS50aGVuKG9uT2spOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmlld0F0dHJpYnV0ZSA9IChhdHRyaWJ1dGU6TW9kZWxzLkF0dHJpYnV0ZU1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLm9wZW5BdHRyaWJ1dGVNb2RhbChhdHRyaWJ1dGUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ3JvdXBOYW1lQnlLZXkgPSAoa2V5OnN0cmluZyk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleSl7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rlcml2ZWQnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEZXJpdmVkIjsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQudW5pcXVlSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZmlsdGVyKCJyZXNvdXJjZU5hbWUiKSh0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50Lm5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZmlsdGVyKCJyZXNvdXJjZU5hbWUiKSgoXy5maW5kKHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLCB7dW5pcXVlSWQ6a2V5fSkpLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3Byb3BlcnRpZXMtYW5kLWF0dHJpYnV0ZXMvcHJvcGVydGllcy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyMmVlNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMtdmlldy5odG1sCkBAIC0wLDAgKzEsODEgQEAKKzxwZXJmZWN0LXNjcm9sbGJhciBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci10YWItY29udGVudCBwcm9wZXJ0aWVzIj4KKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24iPgorCisgICAgICAgIDwhLS1leHBhbmQtY29sbGFwc2UgZGF0YS1uZy1pZj0iaXNQcm9wZXJ0eU93bmVyKCkgJiYgIWN1cnJlbnRDb21wb25lbnQucHJvcGVydGllcy5sZW5ndGgiIGV4cGFuZGVkLXNlbGVjdG9yPSIudy1zZGMtY29tcG9zaXRpb24tc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQue3tjdXJyZW50Q29tcG9uZW50Lm5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0idy1zZGMtY29tcG9zaXRpb24tc2lkZWJhci1zZWN0aW9uLXRpdGxlIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1jb21wb3NpdGlvbi1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtdGV4dCIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2N1cnJlbnRDb21wb25lbnQubmFtZSB8IHJlc291cmNlTmFtZX19Jm5ic3A7UHJvcGVydGllcyIKKyAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9IihjdXJyZW50Q29tcG9uZW50Lm5hbWUgfCByZXNvdXJjZU5hbWUpKyAnIFByb3BlcnRpZXMnIj48L3NwYW4+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1jb21wb3NpdGlvbi1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtaWNvbiI+PC9kaXY+CisgICAgICAgIDwvZXhwYW5kLWNvbGxhcHNlLS0+CisKKworICAgICAgICA8IS0tcHJvcGVydGllcy0tPgorICAgICAgICA8ZXhwYW5kLWNvbGxhcHNlIGRhdGEtbmctcmVwZWF0LXN0YXJ0PSIoa2V5LCBncm91cCkgaW4gcHJvcGVydGllcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZC1zZWxlY3Rvcj0iLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LnByb3BlcnRpZXMue3skaW5kZXh9fSIgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZSI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlLXRleHQiIGRhdGEtbmctYmluZD0iZ3JvdXBOYW1lQnlLZXkoa2V5KSArICcgUHJvcGVydGllcyciCisgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Z3JvdXBOYW1lQnlLZXkoa2V5KX19Jm5ic3A7UHJvcGVydGllcyI+PC9zcGFuPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlLWljb24iPjwvZGl2PgorICAgICAgICA8L2V4cGFuZC1jb2xsYXBzZT4KKworICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQgcHJvcGVydGllcyB7eyRpbmRleH19Ij4gPCEtLWRhdGEtbmctc2hvdz0iaXNTaG93RGV0YWlsc1NlY3Rpb24iIC0tPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1wcm9wZXJ0eS1hbmQtYXR0cmlidXRlIiBkYXRhLXRlc3RzLWlkPSJwcm9wZXJ0eVJvdyIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcmVwZWF0PSJwcm9wZXJ0eSBpbiBncm91cCB8IG9yZGVyQnk6ICduYW1lJyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcHJvcGVydHktYW5kLWF0dHJpYnV0ZS1sYWJlbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnaGFuZCBlbmFibGVkJzogISRwYXJlbnQuaXNWaWV3T25seX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7cHJvcGVydHkubmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iISRwYXJlbnQuaXNWaWV3T25seSAmJiB1cGRhdGVQcm9wZXJ0eShwcm9wZXJ0eSkiPnt7cHJvcGVydHkubmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXByb3BlcnR5LXZhbHVlIiBkYXRhLW5nLWlmPSJpc1Byb3BlcnR5T3duZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5kZWZhdWx0VmFsdWV9fSI+e3twcm9wZXJ0eS5kZWZhdWx0VmFsdWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXByb3BlcnR5LXZhbHVlIiBkYXRhLW5nLWlmPSIhaXNQcm9wZXJ0eU93bmVyKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7cHJvcGVydHkudmFsdWV9fSI+e3twcm9wZXJ0eS52YWx1ZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1idXR0b24gZGVsZXRlIHNwcml0ZSBlLXNkYy1zbWFsbC1pY29uLWRlbGV0ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWlmPSIhJHBhcmVudC5pc1ZpZXdPbmx5JiYoaXNQcm9wZXJ0eU93bmVyKCkgJiYgIXByb3BlcnR5LnJlYWRvbmx5KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJkZWxldGVQcm9wZXJ0eShwcm9wZXJ0eSkiIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWZvb3RlciI+CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tZm9vdGVyLWFjdGlvbiB0bHYtYnRuIGJsdWUiIGRhdGEtbmctY2xpY2s9ImFkZFByb3BlcnR5KCkiIHR5cGU9ImJ1dHRvbiIgZGF0YS1uZy1pZj0iISRwYXJlbnQuaXNWaWV3T25seSAmJiBpc1Byb3BlcnR5T3duZXIoKSI+CisgICAgICAgICAgICAgICAgQWRkIFByb3BlcnR5CisgICAgICAgICAgICA8L2J1dHRvbj4KKyAgICAgICAgPC9kaXY+CisKKworICAgICAgICA8IS0tYXR0cmlidXRlcy0tPgorICAgICAgICA8ZXhwYW5kLWNvbGxhcHNlIGRhdGEtbmctcmVwZWF0LXN0YXJ0PSIoa2V5LCBncm91cCkgaW4gYXR0cmlidXRlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZC1zZWxlY3Rvcj0iLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LmF0dHJpYnV0ZXMue3skaW5kZXh9fSIgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZSI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlLXRleHQiIGRhdGEtbmctYmluZD0iZ3JvdXBOYW1lQnlLZXkoa2V5KSArICcgQXR0cmlidXRlcyciCisgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Z3JvdXBOYW1lQnlLZXkoa2V5KX19Jm5ic3A7QXR0cmlidXRlcyI+PC9zcGFuPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXRpdGxlLWljb24iPjwvZGl2PgorICAgICAgICA8L2V4cGFuZC1jb2xsYXBzZT4KKworICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQgYXR0cmlidXRlcyB7eyRpbmRleH19Ij4gPCEtLWRhdGEtbmctc2hvdz0iaXNTaG93RGV0YWlsc1NlY3Rpb24iIC0tPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1wcm9wZXJ0eS1hbmQtYXR0cmlidXRlIgorICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXBlYXQ9ImF0dHJpYnV0ZSBpbiBncm91cCB8IG9yZGVyQnk6ICduYW1lJyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcHJvcGVydHktYW5kLWF0dHJpYnV0ZS1sYWJlbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnaGFuZCBlbmFibGVkJzogISRwYXJlbnQuaXNWaWV3T25seX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXR0cmlidXRlLm5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9IiEkcGFyZW50LmlzVmlld09ubHkgJiYgdmlld0F0dHJpYnV0ZShhdHRyaWJ1dGUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3thdHRyaWJ1dGUubmFtZX19LWF0dHIiPnt7YXR0cmlidXRlLm5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1wcm9wZXJ0eS12YWx1ZSIgZGF0YS1uZy1pZj0iaXNQcm9wZXJ0eU93bmVyKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXR0cmlidXRlLmRlZmF1bHRWYWx1ZX19Ij57e2F0dHJpYnV0ZS5kZWZhdWx0VmFsdWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXByb3BlcnR5LXZhbHVlIiBkYXRhLW5nLWlmPSIhaXNQcm9wZXJ0eU93bmVyKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7YXR0cmlidXRlLnZhbHVlfX0iIGRhdGEtdGVzdHMtaWQ9InZhbHVlLW9mLXt7YXR0cmlidXRlLm5hbWV9fSI+e3thdHRyaWJ1dGUudmFsdWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorPC9wZXJmZWN0LXNjcm9sbGJhcj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ4N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3Byb3BlcnRpZXMtYW5kLWF0dHJpYnV0ZXMvcHJvcGVydGllcy5sZXNzCkBAIC0wLDAgKzEsMTYgQEAKKy53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYi1jb250ZW50LnByb3BlcnRpZXMgeworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXByb3BlcnR5LWFuZC1hdHRyaWJ1dGUtbGFiZWx7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIH0KKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1idXR0b24udXBkYXRleworICAgICAgICByaWdodDogMTdweDsKKyAgICB9CisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYnV0dG9uLmRlbGV0ZXsKKyAgICAgICAgcmlnaHQ6IDM1cHg7CisgICAgfQorCisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItcHJvcGVydGllcy1kaXNhYmxlZCB7CisgICAgICAgIC5zXzE0X207CisgICAgICAgIHBhZGRpbmc6IDIwcHggMjBweDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvcmVsYXRpb25zL3JlbGF0aW9ucy12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3JlbGF0aW9ucy9yZWxhdGlvbnMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTlhNTlkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3JlbGF0aW9ucy9yZWxhdGlvbnMtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDgxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPj4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElSZWxhdGlvbnNWaWV3TW9kZWxTY29wZSBleHRlbmRzIElDb21wb3NpdGlvblZpZXdNb2RlbFNjb3BlIHsKKyAgICAgICAgaXNMb2FkaW5nOiBib29sZWFuOworICAgICAgICAkcGFyZW50OiBJQ29tcG9zaXRpb25WaWV3TW9kZWxTY29wZTsKKyAgICAgICAgZ2V0UmVsYXRpb24ocmVxdWlyZW1lbnQ6YW55KTogYW55OworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBSZWxhdGlvbnNWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICckZmlsdGVyJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklSZWxhdGlvbnNWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlKSB7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHVwZGF0ZVJDID0gKCk6dm9pZCA9PnsKKyAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnVwZGF0ZVJlcXVpcmVtZW50c0NhcGFiaWxpdGllcygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRoaXMuJHNjb3BlLiRwYXJlbnQuaXNMb2FkaW5nOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRSZWxhdGlvbiA9IChyZXF1aXJlbWVudDphbnkpOmFueSA9PiB7CisKKyAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5pc0NvbXBvbmVudEluc3RhbmNlU2VsZWN0ZWQoKSAmJiB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyApIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGF0aW9uSXRlbSA9IF8uZmlsdGVyKHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zLCAocmVsYXRpb246YW55KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpb24uZnJvbU5vZGUgPT09IHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQuc2VsZWN0ZWRJbnN0YW5jZS51bmlxdWVJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLnNvbWUocmVsYXRpb24ucmVsYXRpb25zaGlwcywgeydyZXF1aXJlbWVudCc6IHJlcXVpcmVtZW50Lm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50T3duZXJJZCc6IHJlcXVpcmVtZW50Lm93bmVySWR9KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uSXRlbSAmJiByZWxhdGlvbkl0ZW0ubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHJlcXVpcmVtZW50LnJlbGF0aW9uc2hpcC5zcGxpdCgnLicpLnBvcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50TmFtZTogdGhpcy4kZmlsdGVyKCdyZXNvdXJjZU5hbWUnKSh0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlc1tfLm1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcywgInVuaXF1ZUlkIikuaW5kZXhPZihyZWxhdGlvbkl0ZW1bMF0udG9Ob2RlKV0ubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZighdGhpcy4kc2NvcGUuaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2goJ2N1cnJlbnRDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzICsgY3VycmVudENvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMnLCAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSQygpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3JlbGF0aW9ucy9yZWxhdGlvbnMtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3JlbGF0aW9ucy9yZWxhdGlvbnMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWFhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvcmVsYXRpb25zL3JlbGF0aW9ucy12aWV3Lmh0bWwKQEAgLTAsMCArMSw1NyBAQAorPHBlcmZlY3Qtc2Nyb2xsYmFyIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYi1jb250ZW50IHJlbGF0aW9ucyI+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24gdy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXJlbGF0aW9ucyI+CisgICAgICAgIDxleHBhbmQtY29sbGFwc2UgZXhwYW5kZWQtc2VsZWN0b3I9Ii53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC5jYXBhYmlsaXRpZXMiIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUiPgorICAgICAgICAgICAgQ2FwYWJpbGl0aWVzCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtaWNvbiI+PC9kaXY+CisgICAgICAgIDwvZXhwYW5kLWNvbGxhcHNlPgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50IGNhcGFiaWxpdGllcyI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1ncm91cCIgZGF0YS1uZy1yZXBlYXQ9IihrZXksIHZhbHVlKSBpbiAoaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCkgPyBjdXJyZW50Q29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2UuY2FwYWJpbGl0aWVzIDogc2VsZWN0ZWRDb21wb25lbnQuY2FwYWJpbGl0aWVzKSB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucyIgZGF0YS1uZy1yZXBlYXQ9ImNhcGFiaWxpdHkgaW4gdmFsdWUgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtZGV0YWlscyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1kZXRhaWxzLW5hbWUiPnt7Y2FwYWJpbGl0eS5uYW1lfX0mbmJzcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLWlmPSJzZWxlY3RlZENvbXBvbmVudC5pc0NvbXBsZXgoKSAmJiBjYXBhYmlsaXR5Lm93bmVyTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1kZXRhaWxzLW93bmVyTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY2xhc3M9InRvb2x0aXAtY3VzdG9tIGJyZWFrLXdvcmQtdG9vbHRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtY29udGVudD0ie3tjYXBhYmlsaXR5Lm93bmVyTmFtZSB8IHJlc291cmNlTmFtZX19Ij4mbmJzcDsmbmJzcDt7e2NhcGFiaWxpdHkub3duZXJOYW1lIHwgcmVzb3VyY2VOYW1lfX08L3NwYW4+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1kZXRhaWxzLWRlc2MiPnt7Y2FwYWJpbGl0eS50eXBlfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24gdy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLXJlbGF0aW9ucyI+CisgICAgICAgIDxleHBhbmQtY29sbGFwc2UgZXhwYW5kZWQtc2VsZWN0b3I9Ii53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC5yZXF1aXJlbWVudHMiIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUiPgorICAgICAgICAgICAgUmVxdWlyZW1lbnRzCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUtaWNvbiI+PC9kaXY+CisgICAgICAgIDwvZXhwYW5kLWNvbGxhcHNlPgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50IHJlcXVpcmVtZW50cyI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1ncm91cCIgZGF0YS1uZy1yZXBlYXQ9IihrZXksIHZhbHVlKSBpbiAoaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCkgPyBjdXJyZW50Q29tcG9uZW50LnNlbGVjdGVkSW5zdGFuY2UucmVxdWlyZW1lbnRzIDogc2VsZWN0ZWRDb21wb25lbnQucmVxdWlyZW1lbnRzKSB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucyIgZGF0YS1uZy1yZXBlYXQ9InJlcXVpcmVtZW50IGluIHZhbHVlIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcmVsYXRpb25zLWRldGFpbHMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtZGV0YWlscy1uYW1lIj57e3JlcXVpcmVtZW50Lm5hbWV9fSZuYnNwOworICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLWlmPSJzZWxlY3RlZENvbXBvbmVudC5pc0NvbXBsZXgoKSAmJiByZXF1aXJlbWVudC5vd25lck5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcmVsYXRpb25zLWRldGFpbHMtb3duZXJOYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY2xhc3M9InRvb2x0aXAtY3VzdG9tIGJyZWFrLXdvcmQtdG9vbHRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwLWNvbnRlbnQ9Int7cmVxdWlyZW1lbnQub3duZXJOYW1lIHwgcmVzb3VyY2VOYW1lfX0iPiZuYnNwOyZuYnNwO3t7cmVxdWlyZW1lbnQub3duZXJOYW1lIHwgcmVzb3VyY2VOYW1lfX08L3NwYW4+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1kZXRhaWxzLWRlc2MiPnt7cmVxdWlyZW1lbnQubm9kZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJnZXRSZWxhdGlvbihyZXF1aXJlbWVudCkgIT0gbnVsbCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcmVsYXRpb25zLWRldGFpbHMtaW5kZW50LWJveCI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcmVsYXRpb25zLWRldGFpbHMtY2hpbGQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcmVsYXRpb25zLWRldGFpbHMtZGVzYyI+e3tnZXRSZWxhdGlvbihyZXF1aXJlbWVudCkudHlwZX19IDxici8+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcmVsYXRpb25zLWRldGFpbHMtbmFtZSI+e3tnZXRSZWxhdGlvbihyZXF1aXJlbWVudCkucmVxdWlyZW1lbnROYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PjwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCis8L3BlcmZlY3Qtc2Nyb2xsYmFyPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3JlbGF0aW9ucy9yZWxhdGlvbnMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9yZWxhdGlvbnMvcmVsYXRpb25zLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyYjk3OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9yZWxhdGlvbnMvcmVsYXRpb25zLmxlc3MKQEAgLTAsMCArMSwxMTYgQEAKKy53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXRhYi1jb250ZW50LnJlbGF0aW9ucyB7CisKKyAgICAudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQgeworICAgICAgICBwYWRkaW5nOiAwOworICAgIH0KKworICAgIC53LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUgeworICAgICAgICAmLmV4cGFuZGVkIHsKKyAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMgeworICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGNvbG9yX2U7CisgICAgICAgIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDE4cHg7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgY3Vyc29yOiBkZWZhdWx0OworCisgICAgICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWJ1dHRvbiB7CisgICAgICAgICAgICB0b3A6IDE1cHg7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogMTBweDsKKyAgICAgICAgfQorCisgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2M7CisKKyAgICAgICAgICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWJ1dHRvbiB7CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisgICAgLnctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1yZWxhdGlvbnM6bm90KDpsYXN0LWNoaWxkKSAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtZ3JvdXA6bGFzdC1jaGlsZCAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnM6bGFzdC1jaGlsZCB7CisgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgfQorCisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMuaGFuZCB7CisgICAgICAgIC5oYW5kOworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1ncm91cCB7CisgICAgICAgIC8vYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBjb2xvcl9lOworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1kZXRhaWxzIHsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBtYXJnaW4tbGVmdDogNXB4OworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIH0KKworICAgIC5pLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLXJlbGF0aW9ucy1kZXRhaWxzLW5hbWUgeworICAgICAgICAuYl8xOworICAgICAgICAuYm9sZDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIC8vd2lkdGg6IDEwMCU7CisgICAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOworICAgICAgICBtYXgtd2lkdGg6IDI0MHB4OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgfQorCisgICAgLmktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcmVsYXRpb25zLWRldGFpbHMtb3duZXJOYW1lIHsKKyAgICAgICAgLmJfMTM7CisgICAgICAgIGZvbnQtd2VpZ2h0OjQwMDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisKKyAgICAgICAmOmJlZm9yZXsKKyAgICAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgICAgLmFycm93LWxlZnQ7CisgICAgICAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtZGV0YWlscy1kZXNjIHsKKyAgICAgICAgLnBfMTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE0cHg7CisgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKKworICAgICAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtZGV0YWlscy1pbmRlbnQtYm94eworICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCAjODQ4NTg2IHNvbGlkOworICAgICAgICAgICAgaGVpZ2h0OiA0MHB4OworICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDsKKyAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCAjODQ4NTg2IHNvbGlkOworICAgICAgICAgICAgd2lkdGg6IDI1cHg7CisgICAgICAgICAgICBmbG9hdDogbGVmdDsKKyAgICAgICAgfQorICAgICAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtZGV0YWlscy1jaGlsZHsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDMwcHg7CisgICAgICAgICAgICBmbG9hdDogbGVmdDsKKyAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjMwcHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtZGV0YWlscy1kZXNjLWxhYmVsIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IG9tbmVzLW1lZGl1bSwgc2Fucy1zZXJpZjsKKyAgICB9CisKKyAgICAuaS1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQtaXRlbS1yZWxhdGlvbnMtdmlldyB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgcmlnaHQ6IDA7CisgICAgICAgIHRvcDogMjJweDsKKyAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvc3RydWN0dXJlL3N0cnVjdHVyZS12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvc3RydWN0dXJlL3N0cnVjdHVyZS12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3MDA0MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9zdHJ1Y3R1cmUvc3RydWN0dXJlLXZpZXcuaHRtbApAQCAtMCwwICsxLDEzIEBACis8cGVyZmVjdC1zY3JvbGxiYXIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci10YWItY29udGVudCI+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24iPgorICAgICAgICA8ZXhwYW5kLWNvbGxhcHNlIGV4cGFuZGVkLXNlbGVjdG9yPSIudy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQiIGNsYXNzPSJ3LXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tdGl0bGUiPgorICAgICAgICAgICAgQ29tcG9zaXRpb24KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi10aXRsZS1pY29uIj48L2Rpdj4KKyAgICAgICAgPC9leHBhbmQtY29sbGFwc2U+CisKKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGVzaWduZXItc2lkZWJhci1zZWN0aW9uLWNvbnRlbnQiIG5nLXNob3c9InNlbGVjdGVkQ29tcG9uZW50LmlzQ29tcGxleCgpIj4KKyAgICAgICAgICAgIDxzdHJ1Y3R1cmUtdHJlZSBjb21wb25lbnQ9InNlbGVjdGVkQ29tcG9uZW50Ij48L3N0cnVjdHVyZS10cmVlPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvcGVyZmVjdC1zY3JvbGxiYXI+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvc3RydWN0dXJlL3N0cnVjdHVyZS12aWV3LnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3N0cnVjdHVyZS9zdHJ1Y3R1cmUtdmlldy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVhYjdmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL3N0cnVjdHVyZS9zdHJ1Y3R1cmUtdmlldy50cwpAQCAtMCwwICsxLDM0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSVN0cnVjdHVyZVZpZXdNb2RlbCBleHRlbmRzIElDb21wb3NpdGlvblZpZXdNb2RlbFNjb3BlIHt9CisKKyAgICBleHBvcnQgY2xhc3MgU3RydWN0dXJlVmlld01vZGVsIHsKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SVN0cnVjdHVyZVZpZXdNb2RlbCkgeworICAgICAgICB9CisgICAgfQorIH0KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC1hcnRpZmFjdHMvZGVwbG95bWVudC1hcnRpZmFjdHMtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC1hcnRpZmFjdHMvZGVwbG95bWVudC1hcnRpZmFjdHMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzUxMWUyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kZXBsb3ltZW50LWFydGlmYWN0cy9kZXBsb3ltZW50LWFydGlmYWN0cy12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMjUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisgICAgaW1wb3J0IFJlc291cmNlID0gU2RjLk1vZGVscy5Db21wb25lbnRzLlJlc291cmNlOworICAgIGltcG9ydCBBcnRpZmFjdE1vZGVsID0gU2RjLk1vZGVscy5BcnRpZmFjdE1vZGVsOworCisgICAgaW50ZXJmYWNlIElEZXBsb3ltZW50QXJ0aWZhY3RzVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJV29ya3NwYWNlVmlld01vZGVsU2NvcGUgeworICAgICAgICB0YWJsZUhlYWRlcnNMaXN0OiBBcnJheTxhbnk+OworICAgICAgICByZXZlcnNlOiBib29sZWFuOworICAgICAgICBzb3J0Qnk6c3RyaW5nOworICAgICAgICBhcnRpZmFjdHM6IEFycmF5PE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBpc0xvYWRpbmc6Ym9vbGVhbjsKKyAgICAgICAgYXJ0aWZhY3REZXNjcmlwdGlvbnM6YW55OworICAgICAgICB1cGRhdGVJblByb2dyZXNzOmJvb2xlYW47CisKKyAgICAgICAgYWRkT3JVcGRhdGUoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICB1cGRhdGUoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICBkZWxldGUoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICBzb3J0KHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgICAgICBub0FydGlmYWN0c1RvU2hvdygpOmJvb2xlYW47CisgICAgICAgIGdldFZhbGlkYXRpb25QYXR0ZXJuKHZhbGlkYXRpb25UeXBlOnN0cmluZywgcGFyYW1ldGVyVHlwZT86c3RyaW5nKTpSZWdFeHA7CisgICAgICAgIHZhbGlkYXRlSnNvbihqc29uOnN0cmluZyk6Ym9vbGVhbjsKKyAgICAgICAgcmVzZXRWYWx1ZShwYXJhbWV0ZXI6YW55KTp2b2lkOworICAgICAgICB2aWV3TW9kZU9yQ3NhckNvbXBvbmVudCgpOmJvb2xlYW47CisgICAgICAgIGlzTGljZW5zZUFydGlmYWN0KGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogYm9vbGVhbjsKKworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBEZXBsb3ltZW50QXJ0aWZhY3RzVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJGZpbHRlcicsCisgICAgICAgICAgICAnJG1vZGFsJywKKyAgICAgICAgICAgICckdGVtcGxhdGVDYWNoZScsCisgICAgICAgICAgICAnVmFsaWRhdGlvblV0aWxzJywKKyAgICAgICAgICAgICdBcnRpZmFjdHNVdGlscycsCisgICAgICAgICAgICAnTW9kYWxzSGFuZGxlcicKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJRGVwbG95bWVudEFydGlmYWN0c1ZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2YWxpZGF0aW9uVXRpbHM6U2RjLlV0aWxzLlZhbGlkYXRpb25VdGlscywKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhcnRpZmFjdHNVdGlsczpTZGMuVXRpbHMuQXJ0aWZhY3RzVXRpbHMsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTW9kYWxzSGFuZGxlcjpVdGlscy5Nb2RhbHNIYW5kbGVyKSB7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlU2VsZWN0ZWRNZW51SXRlbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbml0RGVzY3JpcHRpb25zID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdERlc2NyaXB0aW9ucyA9IHt9OworICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzLCAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFydGlmYWN0RGVzY3JpcHRpb25zW2FydGlmYWN0LmFydGlmYWN0TGFiZWxdID0gYXJ0aWZhY3QuZGVzY3JpcHRpb247CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworCisgICAgICAgIHByaXZhdGUgc2V0QXJ0aWZhY3QgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgaWYgKGFydGlmYWN0LmhlYXRQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSAmJiBwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuY3VycmVudFZhbHVlID0gcGFyYW1ldGVyLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiIiA9PT0gcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXJ0aWZhY3QuZGVzY3JpcHRpb24gfHwgIXRoaXMuJHNjb3BlLmdldFZhbGlkYXRpb25QYXR0ZXJuKCdzdHJpbmcnKS50ZXN0KGFydGlmYWN0LmRlc2NyaXB0aW9uKSkgeworICAgICAgICAgICAgICAgIGFydGlmYWN0LmRlc2NyaXB0aW9uID0gdGhpcy4kc2NvcGUuYXJ0aWZhY3REZXNjcmlwdGlvbnNbYXJ0aWZhY3QuYXJ0aWZhY3RMYWJlbF07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSB1cGRhdGVBbGwgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBhcnRpZmFjdHM6QXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+ID0gW107CisgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuY29tcG9uZW50LmRlcGxveW1lbnRBcnRpZmFjdHMsIChhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKGFydGlmYWN0LnNlbGVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXJ0aWZhY3QoYXJ0aWZhY3QpOworICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMucHVzaChhcnRpZmFjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudXBkYXRlTXVsdGlwbGVBcnRpZmFjdHMoYXJ0aWZhY3RzKTsKKyAgICAgICAgfTsKKworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuaW5pdERlc2NyaXB0aW9ucygpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS50YWJsZUhlYWRlcnNMaXN0ID0gWworICAgICAgICAgICAgICAgIHt0aXRsZTogJ05hbWUnLCBwcm9wZXJ0eTogJ2FydGlmYWN0RGlzcGxheU5hbWUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdUeXBlJywgcHJvcGVydHk6ICdhcnRpZmFjdFR5cGUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdEZXBsb3ltZW50IHRpbWVvdXQnLCBwcm9wZXJ0eTogJ3RpbWVvdXQnfQorICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMaWNlbnNlQXJ0aWZhY3QgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpIDpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgaXNMaWNlbnNlOmJvb2xlYW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5pc0NzYXJDb21wb25lbnQoKSkgeworCisgICAgICAgICAgICAgICAgICAgaXNMaWNlbnNlID0gdGhpcy5hcnRpZmFjdHNVdGlscy5pc0xpY2Vuc2VUeXBlKGFydGlmYWN0LmFydGlmYWN0VHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzTGljZW5zZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnQgPSAoc29ydEJ5OnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJzZSA9ICh0aGlzLiRzY29wZS5zb3J0QnkgPT09IHNvcnRCeSkgPyAhdGhpcy4kc2NvcGUucmV2ZXJzZSA6IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnRCeSA9IHNvcnRCeTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFZhbGlkYXRpb25QYXR0ZXJuID0gKHZhbGlkYXRpb25UeXBlOnN0cmluZywgcGFyYW1ldGVyVHlwZT86c3RyaW5nKTpSZWdFeHAgPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25VdGlscy5nZXRWYWxpZGF0aW9uUGF0dGVybih2YWxpZGF0aW9uVHlwZSwgcGFyYW1ldGVyVHlwZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0ZUpzb24gPSAoanNvbjpzdHJpbmcpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIGlmKCFqc29uKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUpzb24oanNvbik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52aWV3TW9kZU9yQ3NhckNvbXBvbmVudCA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuaXNWaWV3TW9kZSgpIHx8ICh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5pc0NzYXJDb21wb25lbnQoKSk7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmFkZE9yVXBkYXRlID0gKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBhcnRpZmFjdC5hcnRpZmFjdEdyb3VwVHlwZSA9ICdERVBMT1lNRU5UJzsKKyAgICAgICAgICAgICAgICBsZXQgYXJ0aWZhY3RDb3B5ID0gbmV3IE1vZGVscy5BcnRpZmFjdE1vZGVsKGFydGlmYWN0KTsKKworICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzID0gKHJlc3BvbnNlOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuJHNjb3BlLmFydGlmYWN0RGVzY3JpcHRpb25zW2FydGlmYWN0Q29weS5hcnRpZmFjdExhYmVsXSA9IGFydGlmYWN0Q29weS5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyhzZWxmLiRzY29wZS5jb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cyk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IChlcnI6YW55KTp2b2lkID0+eworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpOworICAgICAgICAgICAgICAgICAgICBzZWxmLiRzY29wZS5hcnRpZmFjdHMgPSA8QXJ0aWZhY3RNb2RlbFtdPl8udmFsdWVzKHNlbGYuJHNjb3BlLmNvbXBvbmVudC5kZXBsb3ltZW50QXJ0aWZhY3RzKTsKKyAgICAgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbldpemFyZEFydGlmYWN0TW9kYWwoYXJ0aWZhY3RDb3B5LCBzZWxmLiRzY29wZS5jb21wb25lbnQpLnRoZW4oc3VjY2VzcywgZXJyb3IpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUubm9BcnRpZmFjdHNUb1Nob3cgPSAoKTpib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIV8uc29tZSh0aGlzLiRzY29wZS5hcnRpZmFjdHMsICdlc0lkJyk7CisgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJlc2V0VmFsdWUgPSAocGFyYW1ldGVyOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXIuY3VycmVudFZhbHVlICYmIHBhcmFtZXRlci5kZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZSA9IHBhcmFtZXRlci5kZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdib29sZWFuJyA9PSBwYXJhbWV0ZXIudHlwZSkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuY3VycmVudFZhbHVlID0gcGFyYW1ldGVyLmN1cnJlbnRWYWx1ZS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuJHdhdGNoKCdlZGl0Rm9ybS4kdmFsaWQnLCAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuZWRpdEZvcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0aGlzLiRzY29wZS5lZGl0Rm9ybS4kdmFsaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGUgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PSB0aGlzLiRzY29wZS5pc0xvYWRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFydGlmYWN0LnNlbGVjdGVkICYmICF0aGlzLiRzY29wZS5pc1ZpZXdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVJblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocmVzcG9uc2VBcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3REZXNjcmlwdGlvbnNbcmVzcG9uc2VBcnRpZmFjdC5hcnRpZmFjdExhYmVsXSA9IHJlc3BvbnNlQXJ0aWZhY3QuZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2VsZWN0ZWQgPSAhYXJ0aWZhY3Quc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBhcnRpZmFjdCByZXR1cm5lZCBlcnJvcjonLCBlcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2VsZWN0ZWQgPSAhYXJ0aWZhY3Quc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcnRpZmFjdChhcnRpZmFjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQuYWRkT3JVcGRhdGVBcnRpZmFjdChhcnRpZmFjdCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LnNlbGVjdGVkID0gIWFydGlmYWN0LnNlbGVjdGVkOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5kZWxldGUgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCBvbk9rID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuZGVwbG95bWVudEFydGlmYWN0cyk7CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKGVycm9yOmFueSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgYXJ0aWZhY3QgcmV0dXJuZWQgZXJyb3I6JywgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kZWxldGVBcnRpZmFjdChhcnRpZmFjdC51bmlxdWVJZCwgYXJ0aWZhY3QuYXJ0aWZhY3RMYWJlbCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IHRpdGxlOnN0cmluZyA9IHNlbGYuJGZpbHRlcigndHJhbnNsYXRlJykoIkFSVElGQUNUX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIik7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U6c3RyaW5nID0gc2VsZi4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiQVJUSUZBQ1RfVklFV19ERUxFVEVfTU9EQUxfVEVYVCIsICJ7J25hbWUnOiAnIiArIGFydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWUgKyAiJ30iKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBtZXNzYWdlLCBmYWxzZSkudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHNhdmUgPSAoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy51cGRhdGVBbGwoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldENvbXBvbmVudCh0aGlzLiRzY29wZS5jb21wb25lbnQpOworICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIGJhY2sgPSAoY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWQgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50KHRoaXMuJHNjb3BlLmNvbXBvbmVudCk7CisgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC1hcnRpZmFjdHMvZGVwbG95bWVudC1hcnRpZmFjdHMtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kZXBsb3ltZW50LWFydGlmYWN0cy9kZXBsb3ltZW50LWFydGlmYWN0cy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0NzYxOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC1hcnRpZmFjdHMvZGVwbG95bWVudC1hcnRpZmFjdHMtdmlldy5odG1sCkBAIC0wLDAgKzEsMTQ5IEBACis8ZGl2IGNsYXNzPSJ3b3Jrc3BhY2UtZGVwbG95bWVudC1hcnRpZmFjdCI+CisKKyAgICA8ZGl2IGRhdGEtdGVzdHMtaWQ9ImFkZC1kZXBsb3ltZW50LWFydGlmYWN0LWJ1dHRvbiIgbmctaWY9IiFpc1ZpZXdNb2RlKCkiIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnOiBpc0Rpc2FibGVNb2RlKCl9IiBkYXRhLXRlc3RzLWlkPSJhZGQtcHJvcGVydHktYnV0dG9uIiBjbGFzcz0iYWRkLWJ0biIgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoe30pIj5BZGQ8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbnRhaW5lci1mbGV4Ij4KKworICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSIgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9Ij4KKyAgICAgICAgICAgIDxsb2FkZXIgZGF0YS1kaXNwbGF5PSJpc0xvYWRpbmciPjwvbG9hZGVyPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZCBmbGV4LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIGhlYWQtcm93IGhhbmQgZmxleC1pdGVtIiBkYXRhLW5nLXJlcGVhdD0iaGVhZGVyIGluIHRhYmxlSGVhZGVyc0xpc3QgdHJhY2sgYnkgJGluZGV4IiBkYXRhLW5nLWNsaWNrPSJzb3J0KGhlYWRlci5wcm9wZXJ0eSkiPnt7aGVhZGVyLnRpdGxlfX0KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0ic29ydEJ5ID09PSBoZWFkZXIucHJvcGVydHkiIGNsYXNzPSJ0YWJsZS1oZWFkZXItc29ydC1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydkb3duJzogcmV2ZXJzZSwgJ3VwJzohcmV2ZXJzZX0iPiA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbm8tdGV4dC1oZWFkZXIgaGVhZC1yb3cgZmxleC1pdGVtIj48L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8Zm9ybSBjbGFzcz0iYm9keSIgbmFtZT0iZWRpdEZvcm0iPgorCisgICAgICAgICAgICAgICAgPHBlcmZlY3Qtc2Nyb2xsYmFyIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gQXJ0aWZhY3Qgcm93IC0tPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWlmPSJub0FydGlmYWN0c1RvU2hvdygpIiBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogaXNEaXNhYmxlTW9kZSgpfSIgY2xhc3M9Im5vLXJvdy10ZXh0IiB0cmFuc2xhdGU9IkRFUExPWU1FTlRfQVJUSUZBQ1RfTk9fQVJUSUZBQ1RTX1RPX0RJU1BMQVkiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LXN0YXJ0PSJhcnRpZmFjdCBpbiBhcnRpZmFjdHMgfCBvcmRlckJ5OnNvcnRCeTpyZXZlcnNlIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZmxleC1jb250YWluZXIgZGF0YS1yb3ciCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZCc6IGFydGlmYWN0LnNlbGVjdGVkIHx8IHVuZGVmaW5lZD09YXJ0aWZhY3Quc2VsZWN0ZWQgJiYgdXBkYXRlSW5Qcm9ncmVzc30iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iYXJ0aWZhY3QuZXNJZCI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSIgIGRhdGEtbmctY2xpY2s9InVwZGF0ZShhcnRpZmFjdCkiPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNwcml0ZSB0YWJsZS1hcnJvdyIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0iIGRhdGEtbmctY2xhc3M9Insnb3BlbmVkJzogYXJ0aWZhY3Quc2VsZWN0ZWQgfHwgdW5kZWZpbmVkPT1hcnRpZmFjdC5zZWxlY3RlZCAmJiB1cGRhdGVJblByb2dyZXNzfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0VHlwZX19Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FydGlmYWN0LmFydGlmYWN0VHlwZX19CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC50aW1lb3V0fX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXJ0aWZhY3QudGltZW91dD8gYXJ0aWZhY3QudGltZW91dDonJ319CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtYnRuLWNvbCBmbGV4LWl0ZW0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRhYmxlLWVkaXQtYnRuIiBkYXRhLXRlc3RzLWlkPSJlZGl0X3t7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iIWlzVmlld01vZGUoKSAmJiAhYXJ0aWZhY3QuaXNIRUFUKCkgJiYgIWFydGlmYWN0LmlzVGhpcmRQYXJ0eSgpICYmICFpc0xpY2Vuc2VBcnRpZmFjdChhcnRpZmFjdCkiIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlKGFydGlmYWN0KSI+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFibGUtZGVsZXRlLWJ0biIgZGF0YS10ZXN0cy1pZD0iZGVsZXRlX3t7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iIWlzVmlld01vZGUoKSAmJiAhYXJ0aWZhY3QuaXNIRUFUKCkgJiYgIWFydGlmYWN0LmlzVGhpcmRQYXJ0eSgpICYmICFpc0xpY2Vuc2VBcnRpZmFjdChhcnRpZmFjdCkiIGRhdGEtbmctY2xpY2s9ImRlbGV0ZShhcnRpZmFjdCkiPiA8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFibGUtZG93bmxvYWQtYnRuIiBkb3dubG9hZC1hcnRpZmFjdCAgZGF0YS10ZXN0cy1pZD0iZG93bmxvYWRfe3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iYXJ0aWZhY3QuYXJ0aWZhY3ROYW1lIiBjb21wb25lbnQ9ImNvbXBvbmVudCIgYXJ0aWZhY3Q9ImFydGlmYWN0Ij48L2J1dHRvbj4KKworCisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQtZW5kPSIiIGRhdGEtbmctaWY9ImFydGlmYWN0LnNlbGVjdGVkIHx8IHVuZGVmaW5lZD09YXJ0aWZhY3Quc2VsZWN0ZWQgJiYgdXBkYXRlSW5Qcm9ncmVzcyIgY2xhc3M9Inctc2RjLWZvcm0gaXRlbS1vcGVuZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBcnRpZmFjdCBwYW5lbCBvcGVuZWQgLS0+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVzY3JpcHRpb24gZmllbGQgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWl0ZW0iIG5nLWZvcm09ImRlc2NyaXB0aW9uRm9ybSIgZGF0YS1uZy1jbGFzcz0ie2Vycm9yOihkZXNjcmlwdGlvbkZvcm0uJGRpcnR5ICYmIGRlc2NyaXB0aW9uRm9ybS4kaW52YWxpZCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWVudi1mb3JtLWxhYmVsIHJlcXVpcmVkIj5EZXNjcmlwdGlvbjwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iaS1zZGMtZm9ybS10ZXh0YXJlYSB7eyRpbmRleH19IiBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIyNTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcXVpcmVkPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJhcnRpZmFjdC5kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogMjAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49ImdldFZhbGlkYXRpb25QYXR0ZXJuKCdzdHJpbmcnKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXJlYWRvbmx5PSJpc1ZpZXdNb2RlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJkZXNjcmlwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJkZXNjcmlwdGlvbkZvcm0uJGRpcnR5ICYmIGRlc2NyaXB0aW9uRm9ybS4kaW52YWxpZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImRlc2NyaXB0aW9uRm9ybS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iQUREX0FSVElGQUNUX0VSUk9SX0RFU0NSSVBUSU9OX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImRlc2NyaXB0aW9uRm9ybS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMjU2JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImRlc2NyaXB0aW9uRm9ybS4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGFyYW1ldGVycyBpbiAyIGNvbHVtbnMgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbnMtd3JhcHBlciIgZGF0YS1uZy1pZj0iYXJ0aWZhY3QuaGVhdFBhcmFtZXRlcnMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGVmdCBjb2x1bW4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZm9ybS1jb2x1bW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIG5nLWZvcm09InBhcmFtZXRlckZvcm0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXBlYXQ9InBhcmFtZXRlciBpbiBhcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5zbGljZSgwLCBhcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5sZW5ndGglMithcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5sZW5ndGgvMikgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZW52LWZvcm0tbGFiZWwiIGRhdGEtbmctY2xhc3M9IntyZXF1aXJlZDpwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlfSIgdG9vbHRpcC1zaWRlPSJ0b3AiIHNkYy1zbWFydC10b29sdGlwPnt7cGFyYW1ldGVyLm5hbWUgKycgKCcgKyBwYXJhbWV0ZXIudHlwZSArICcpJ319PC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYXJhbWV0ZXItZGVzY3JpcHRpb24iIHRvb2x0aXBzIHRvb2x0aXAtc2lkZT0idG9wIiB0b29sdGlwLWNvbnRlbnQ9Int7cGFyYW1ldGVyLmRlc2NyaXB0aW9ufX0iPj88L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiIGRhdGEtbmctY2xhc3M9IntlcnJvcjoocGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGludmFsaWQpLCd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCkgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9InBhcmFtZXRlci5jdXJyZW50VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjdXJyZW50VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJnZXRWYWxpZGF0aW9uUGF0dGVybihwYXJhbWV0ZXIudHlwZSwgJ2hlYXQnKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcXVpcmVkPSJwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSInanNvbic9PXBhcmFtZXRlci50eXBlICYmIHBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRzZXRWYWxpZGl0eSgncGF0dGVybicsIHZhbGlkYXRlSnNvbihwYXJhbWV0ZXIuY3VycmVudFZhbHVlKSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1ibHVyPSIhcGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgcmVzZXRWYWx1ZShwYXJhbWV0ZXIpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdWYWx1ZSd9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgcGFyYW1ldGVyLnR5cGU9PT0nc3RyaW5nJyIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucGF0dGVybiAmJiAhKHBhcmFtZXRlci50eXBlPT09J3N0cmluZycpIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfVFlQRSIgdHJhbnNsYXRlLXZhbHVlcz0ieyd0eXBlJzogJ3t7cGFyYW1ldGVyLnR5cGV9fSd9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0IGNvbHVtbiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgbmctZm9ybT0icGFyYW1ldGVyRm9ybSIgZGF0YS1uZy1yZXBlYXQ9InBhcmFtZXRlciBpbiBhcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5zbGljZShhcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5sZW5ndGglMithcnRpZmFjdC5oZWF0UGFyYW1ldGVycy5sZW5ndGgvMikgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZW52LWZvcm0tbGFiZWwiIGRhdGEtbmctY2xhc3M9IntyZXF1aXJlZDpwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlfSIgdG9vbHRpcC1zaWRlPSJ0b3AiIHNkYy1zbWFydC10b29sdGlwPnt7cGFyYW1ldGVyLm5hbWUgKycgKCcgKyBwYXJhbWV0ZXIudHlwZSArICcpJ319PC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYXJhbWV0ZXItZGVzY3JpcHRpb24iIHRvb2x0aXBzIHRvb2x0aXAtc2lkZT0idG9wIiB0b29sdGlwLWNvbnRlbnQ9Int7cGFyYW1ldGVyLmRlc2NyaXB0aW9ufX0iPj88L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiIGRhdGEtbmctY2xhc3M9IntlcnJvcjoocGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGludmFsaWQpLCAndmlldy1tb2RlJzogaXNWaWV3TW9kZSgpfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDIwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9InBhcmFtZXRlci5jdXJyZW50VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjdXJyZW50VmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJnZXRWYWxpZGF0aW9uUGF0dGVybihwYXJhbWV0ZXIudHlwZSwgJ2hlYXQnKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcXVpcmVkPSJwYXJhbWV0ZXIuZGVmYXVsdFZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSInanNvbic9PXBhcmFtZXRlci50eXBlICYmIHBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRzZXRWYWxpZGl0eSgncGF0dGVybicsIHZhbGlkYXRlSnNvbihwYXJhbWV0ZXIuY3VycmVudFZhbHVlKSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1ibHVyPSIhcGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgcmVzZXRWYWx1ZShwYXJhbWV0ZXIpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InBhcmFtZXRlckZvcm0uY3VycmVudFZhbHVlLiRpbnZhbGlkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9SRVFVSVJFRCIgdHJhbnNsYXRlLXZhbHVlcz0ieydmaWVsZCc6ICdWYWx1ZSd9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0icGFyYW1ldGVyRm9ybS5jdXJyZW50VmFsdWUuJGVycm9yLnBhdHRlcm4gJiYgcGFyYW1ldGVyLnR5cGU9PT0nc3RyaW5nJyIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJwYXJhbWV0ZXJGb3JtLmN1cnJlbnRWYWx1ZS4kZXJyb3IucGF0dGVybiAmJiAhKHBhcmFtZXRlci50eXBlPT09J3N0cmluZycpIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfVFlQRSIgdHJhbnNsYXRlLXZhbHVlcz0ieyd0eXBlJzogJ3t7cGFyYW1ldGVyLnR5cGV9fSd9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKworICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PCEtLSBDbG9zZTogUGFyYW1ldGVycyBpbiAyIGNvbHVtbnMgLS0+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gQ2xvc2U6IEFydGlmYWN0IHBhbmVsIG9wZW5lZCAtLT4KKworICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBhcnRpZmFjdHMgYnV0dG9ucyAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWRkLWJ1dHRvbiIgZGF0YS1uZy1yZXBlYXQ9ImFydGlmYWN0IGluIGFydGlmYWN0cyB0cmFjayBieSAkaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iYnV0dG9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctc2hvdz0iIWFydGlmYWN0LmVzSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pZj0iIXZpZXdNb2RlT3JDc2FyQ29tcG9uZW50KCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzRGlzYWJsZU1vZGUoKSB8fCBjb21wb25lbnQuaXNDc2FyQ29tcG9uZW50KCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19IGRlcGxveW1lbnRfYXJ0aWZhY3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPSJERVBMT1lNRU5UX0FSVElGQUNUX0JVVFRPTl9BRERfSEVBVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUtdmFsdWVzPSJ7J25hbWUnOiAne3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0nfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZShhcnRpZmFjdCkiPjwvYnV0dG9uPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gVG9wIGFkZCBidXR0b24gLS0+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFkZC1idXR0b24iIHR5cGU9ImJ1dHRvbiIgZGF0YS1uZy1pZj0iIWlzVmlld01vZGUoKSIgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzRGlzYWJsZU1vZGUoKX0iIHRyYW5zbGF0ZT0iREVQTE9ZTUVOVF9BUlRJRkFDVF9CVVRUT05fQUREX09USEVSIiBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZSh7fSkiPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQtYXJ0aWZhY3RzL2RlcGxveW1lbnQtYXJ0aWZhY3RzLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQtYXJ0aWZhY3RzL2RlcGxveW1lbnQtYXJ0aWZhY3RzLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5MGE0NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC1hcnRpZmFjdHMvZGVwbG95bWVudC1hcnRpZmFjdHMubGVzcwpAQCAtMCwwICsxLDEwMiBAQAorLndvcmtzcGFjZS1kZXBsb3ltZW50LWFydGlmYWN0IHsKKyAgICB3aWR0aDogOTMlOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggLnRhYmxlIC5ib2R5IC5kYXRhLXJvdyArIGRpdi5pdGVtLW9wZW5lZCB7CisgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgIHBhZGRpbmc6IDEwcHggNDBweCAxMHB4IDMwcHg7CisgICAgfQorCisgICAgLnctc2RjLWNsYXNzaWMtYnRuIHsKKyAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIH0KKworICAgIC50YWJsZSB7CisgICAgICAgIGhlaWdodDo0OTBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICB9CisKKyAgICAucGFyYW1ldGVyLWRlc2NyaXB0aW9uIHsKKyAgICAgICAgLmNpcmNsZSgxOHB4LCBAY29sb3JfcCk7CisgICAgICAgIGNvbnRlbnQ6ICc/JzsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHg7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CisgICAgICAgIGN1cnNvcjogZGVmYXVsdDsKKyAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMTZweDsKKyAgICB9CisKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggeworCisgICAgICAgIG1hcmdpbi10b3A6IDI3cHg7CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMSkgeworICAgICAgICAgICAgZmxleC1ncm93OiAxNTsKKyAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgc3Bhbi50YWJsZS1hcnJvdyB7CisgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiA3cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgyKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgzKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDk7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCg0KSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDM7CisgICAgICAgICAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICAgICAgfQorICAgIH0KKyAgICAudy1zZGMtZm9ybXsKKyAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKworICAgICAgICAudy1zZGMtZW52LXBhcmFtc3sKKyAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2RjZGNkOworICAgICAgICAgICAgbWFyZ2luOiAyNXB4IDAgMTBweCAwOworICAgICAgICB9CisKKyAgICAgICAgLmktc2RjLWZvcm0tdGV4dGFyZWEgeworICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQGNvbG9yX2U7CisgICAgICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OworICAgICAgICAgICAgcGFkZGluZzogMTBweCAxM3B4OworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICByZXNpemU6IG5vbmU7CisKKyAgICAgICAgfQorCisgICAgICAgIC53LXNkYy1mb3JtLWl0ZW0geworICAgICAgICAgICAgJi5lcnJvciB7CisgICAgICAgICAgICAgICAgLmktc2RjLWZvcm0taW5wdXQsCisgICAgICAgICAgICAgICAgLmktc2RjLWZvcm0tc2VsZWN0LAorICAgICAgICAgICAgICAgIC5pLXNkYy1mb3JtLXRleHRhcmVhIHsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiBAY29sb3JfaDsKKyAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKKyAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuaS1zZGMtZW52LWZvcm0tbGFiZWx7CisgICAgICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtbWVkaXVtOworICAgICAgICAgICAgY29sb3I6IEBtYWluX2NvbG9yX207CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgbWF4LXdpZHRoOiA0NTBweDsKKyAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDE0cHg7CisKKyAgICAgICAgICAgICYucmVxdWlyZWQ6OmJlZm9yZSB7CisgICAgICAgICAgICAgICAgY29sb3I6ICNmMzM7CisgICAgICAgICAgICAgICAgY29udGVudDogJyonOworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kZXBsb3ltZW50L2RlcGxveW1lbnQtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC9kZXBsb3ltZW50LXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhZmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC9kZXBsb3ltZW50LXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwxMjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSURlcGxveW1lbnRWaWV3TW9kZWxTY29wZSBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSB7CisKKyAgICAgICAgY3VycmVudENvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBzZWxlY3RlZENvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBpc0xvYWRpbmc6IGJvb2xlYW47CisgICAgICAgIHNoYXJpbmdTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZTsKKyAgICAgICAgc2RjTWVudTpNb2RlbHMuSUFwcE1lbnU7CisgICAgICAgIHZlcnNpb246c3RyaW5nOworICAgICAgICBpc1ZpZXdPbmx5OmJvb2xlYW47CisgICAgICAgIHRhYnM6QXJyYXk8TW9kZWxzLlRhYj47CisKKyAgICAgICAgc2V0Q29tcG9uZW50KGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTsKKyAgICAgICAgaXNDb21wb25lbnRJbnN0YW5jZVNlbGVjdGVkKCk6Ym9vbGVhbjsKKyAgICAgICAgdXBkYXRlU2VsZWN0ZWRDb21wb25lbnQoKTogdm9pZAorICAgICAgICBvcGVuVXBkYXRlTW9kYWwoKTsKKyAgICAgICAgZGVsZXRlU2VsZWN0ZWRDb21wb25lbnRJbnN0YW5jZSgpOnZvaWQ7CisgICAgICAgIG9uQmFja2dyb3VuZENsaWNrKCk6dm9pZDsKKyAgICAgICAgc2V0U2VsZWN0ZWRJbnN0YW5jZShjb21wb25lbnRJbnN0YW5jZTogTW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOiB2b2lkOworICAgICAgICBwcmludFNjcmVlbigpOnZvaWQ7CisKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRGVwbG95bWVudFZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ3NkY01lbnUnLAorICAgICAgICAgICAgJ01lbnVIYW5kbGVyJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZScsCisgICAgICAgICAgICAnJGZpbHRlcicsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnQ29tcG9uZW50RmFjdG9yeScsCisgICAgICAgICAgICAnQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyJywKKyAgICAgICAgICAgICdMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SURlcGxveW1lbnRWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNNZW51Ok1vZGVscy5JQXBwTWVudSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNZW51SGFuZGxlcjogVXRpbHMuTWVudUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGU6bmcudWkuSVN0YXRlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzaGFyaW5nU2VydmljZTpTZXJ2aWNlcy5TaGFyaW5nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkZmlsdGVyOm5nLklGaWx0ZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNhY2hlU2VydmljZTpTZXJ2aWNlcy5DYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ29tcG9uZW50RmFjdG9yeTogVXRpbHMuQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDaGFuZ2VMaWZlY3ljbGVTdGF0ZUhhbmRsZXI6IFNkYy5VdGlscy5DaGFuZ2VMaWZlY3ljbGVTdGF0ZUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTGVmdFBhbGV0dGVMb2FkZXJTZXJ2aWNlOiBTZXJ2aWNlcy5Db21wb25lbnRzLkxlZnRQYWxldHRlTG9hZGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNb2RhbHNIYW5kbGVyOiBTZGMuVXRpbHMuTW9kYWxzSGFuZGxlcikgeworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZVNlbGVjdGVkTWVudUl0ZW0oKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBpbml0Q29tcG9uZW50ID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQgPSB0aGlzLiRzY29wZS5jb21wb25lbnQ7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZENvbXBvbmVudCA9IHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQ7CisgICAgICAgICAgICB0aGlzLnVwZGF0ZVV1aWRNYXAoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzVmlld09ubHkgPSB0aGlzLiRzY29wZS5pc1ZpZXdNb2RlKCk7CisgICAgICAgIH07CisKKworICAgICAgICBwcml2YXRlIHVwZGF0ZVV1aWRNYXAgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogSW4gY2FzZSB1c2VyIHByZXNzIEY1LCB0aGUgcGFnZSBpcyByZWZyZXNoZWQgYW5kIHRoaXMuc2hhcmluZ1NlcnZpY2UuY3VycmVudEVudGl0eSB3aWxsIGJlIHVuZGVmaW5lZCwKKyAgICAgICAgICAgICAqIGJ1dCBhZnRlciBsb2FkU2VydmljZSBvciBsb2FkUmVzb3VyY2UgdGhpcy5zaGFyaW5nU2VydmljZS5jdXJyZW50RW50aXR5IHdpbGwgYmUgZGVmaW5lZC4KKyAgICAgICAgICAgICAqIE5lZWQgdG8gdXBkYXRlIHRoZSB1dWlkTWFwIHdpdGggdGhlIG5ldyByZXNvdXJjZSBvciBzZXJ2aWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLnNoYXJpbmdTZXJ2aWNlLmFkZFV1aWRWYWx1ZSh0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LnVuaXF1ZUlkLHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQudXVpZCk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0UmlnaHRUYWJzID0gKCk9PiB7CisgICAgICAgICAgICBpZih0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50Lmdyb3Vwcyl7CisKKyAgICAgICAgICAgICAgICBsZXQgaGllcmFyY2h5VGFiID0gbmV3IE1vZGVscy5UYWIoJy9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHktdmlldy5odG1sJywgJ1NkYy5WaWV3TW9kZWxzLkhpZXJhcmNoeVZpZXdNb2RlbCcsICdoaWVyYXJjaHknLCB0aGlzLiRzY29wZS5jdXJyZW50Q29tcG9uZW50LCAnaGllcmFyY2h5Jyk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudGFicyA9IEFycmF5PE1vZGVscy5UYWI+KCk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUudGFicy5wdXNoKGhpZXJhcmNoeVRhYikKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNoYXJpbmdTZXJ2aWNlID0gdGhpcy5zaGFyaW5nU2VydmljZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNkY01lbnUgPSB0aGlzLnNkY01lbnU7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmVyc2lvbiA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgndmVyc2lvbicpOworICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldENvbXBvbmVudCA9IChjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLlByb2R1Y3QpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmN1cnJlbnRDb21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRoaXMuaW5pdFJpZ2h0VGFicygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kZXBsb3ltZW50L2RlcGxveW1lbnQtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kZXBsb3ltZW50L2RlcGxveW1lbnQtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjY2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQvZGVwbG95bWVudC12aWV3Lmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGRpdiBjbGFzcz0iZGVwbG95bWVudC12aWV3Ij4KKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXBsb3ltZW50LWNhbnZhcyIgZGF0YS1uZy1jbGFzcz0ie3NpZGViYXJhY3RpdmU6IGRpc3BsYXlEZXNpZ25lclJpZ2h0U2lkZWJhcn0iPgorICAgICAgICA8IS0tPG1vZHVsZS1ncmFwaCBkYXRhLXRlc3RzLWlkPSJjYW52YXMiIGN1cnJlbnQtY29tcG9uZW50PSJjdXJyZW50Q29tcG9uZW50IiBpcy12aWV3LW9ubHk9ImlzVmlld09ubHkiIGlzLWxvYWRpbmc9ImlzTG9hZGluZyI+PC9tb2R1bGUtZ3JhcGg+LS0+CisgICAgICAgIDxkZXBsb3ltZW50LWdyYXBoIGNvbXBvbmVudD0iY3VycmVudENvbXBvbmVudCIgaXMtdmlldy1vbmx5PSJpc1ZpZXdPbmx5Ij48L2RlcGxveW1lbnQtZ3JhcGg+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kZXBsb3ltZW50LXJpZ2h0LWJhciI+CisgICAgICAgIDxzZGMtdGFicyB0YWJzPSJ0YWJzIiBpcy12aWV3LW9ubHk9ImlzVmlld09ubHkiPjwvc2RjLXRhYnM+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC9kZXBsb3ltZW50Lmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQvZGVwbG95bWVudC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzljY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQvZGVwbG95bWVudC5sZXNzCkBAIC0wLDAgKzEsMzMgQEAKKy5kZXBsb3ltZW50LXZpZXd7CisKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBhbGlnbi1pdGVtczogbGVmdDsKKyAgICBwYWRkaW5nOiAwOworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKworICAgIC53LXNkYy1kZXBsb3ltZW50LWNhbnZhcyB7CisgICAgICAgIC5ub3NlbGVjdDsKKyAgICAgICAgLmJnX2M7CisgICAgICAgIGJvdHRvbTogMDsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIGhlaWdodDogMTAwJTsKKworICAgICAgICAudmlldy1tb2RleworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsKKyAgICAgICAgICAgIGJvcmRlcjowOworICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLWRlcGxveW1lbnQtcmlnaHQtYmFyIHsKKworICAgICAgICAubm9zZWxlY3Q7CisgICAgICAgIGJvdHRvbTogMDsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICByaWdodDogMHB4OworICAgICAgICB0cmFuc2l0aW9uOiByaWdodCAwLjJzOworICAgICAgICB6LWluZGV4OiAxMDAwMDsKKyAgICAgICAgdG9wOiAgQGFjdGlvbl9uYXZfaGVpZ2h0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ2YWJhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kaXN0cmlidXRpb24vZGlzcmlidXRpb24tc3RhdHVzLW1vZGFsL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsNjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKworICAgIGludGVyZmFjZSBJRGlzdHJpYnV0aW9uU3RhdHVzTW9kYWxWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIGRpc3RyaWJ1dGlvbjpNb2RlbHMuRGlzdHJpYnV0aW9uOworICAgICAgICBzdGF0dXM6c3RyaW5nOworICAgICAgICBnZXRTdGF0dXNDb3VudChkaXN0cmlidXRpb25Db21wb25lbnQ6QXJyYXk8TW9kZWxzLkRpc3RyaWJ1dGlvbkNvbXBvbmVudD4pOmFueTsKKyAgICAgICAgZ2V0VXJsTmFtZSh1cmw6c3RyaW5nKTpzdHJpbmc7CisgICAgICAgIG1vZGFsRGl0cmlidXRpb25TdGF0dXM6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZTsKKyAgICAgICAgZm9vdGVyQnV0dG9uczogQXJyYXk8YW55PjsKKyAgICAgICAgY2xvc2UoKTogdm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgRGlzdHJpYnV0aW9uU3RhdHVzTW9kYWxWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbJyRzY29wZScsJyRtb2RhbEluc3RhbmNlJywgJ2RhdGEnXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJRGlzdHJpYnV0aW9uU3RhdHVzTW9kYWxWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWxJbnN0YW5jZTpuZy51aS5ib290c3RyYXAuSU1vZGFsU2VydmljZUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGE6YW55CisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXN0cmlidXRpb24gPSB0aGlzLmRhdGEuZGlzdHJpYnV0aW9uOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc3RhdHVzID0gdGhpcy5kYXRhLnN0YXR1czsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGFsRGl0cmlidXRpb25TdGF0dXMgPSB0aGlzLiRtb2RhbEluc3RhbmNlOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRVcmxOYW1lID0gKHVybDpzdHJpbmcpOnN0cmluZyA9PnsKKyAgICAgICAgICAgICAgICBsZXQgdXJsTmFtZTpzdHJpbmcgPSBfLmxhc3QodXJsLnNwbGl0KCcvJykpOworICAgICAgICAgICAgICAgIHJldHVybiB1cmxOYW1lOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2xvc2UgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbEluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5mb290ZXJCdXR0b25zID0gWworICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdDbG9zZScsICdjc3MnOiAnYmx1ZScsICdjYWxsYmFjayc6IHRoaXMuJHNjb3BlLmNsb3NlIH0KKyAgICAgICAgICAgIF07CisKKyAgICAgICAgfTsKKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kaXN0cmlidXRpb24vZGlzcmlidXRpb24tc3RhdHVzLW1vZGFsL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwvZGlzcmlidXRpb24tc3RhdHVzLW1vZGFsLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzM5M2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kaXN0cmlidXRpb24vZGlzcmlidXRpb24tc3RhdHVzLW1vZGFsL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC12aWV3Lmh0bWwKQEAgLTAsMCArMSwxMjYgQEAKKzxzZGMtbW9kYWwgbW9kYWw9Im1vZGFsRGl0cmlidXRpb25TdGF0dXMiICB0eXBlPSJjbGFzc2ljIiBjbGFzcz0idy1zZGMtY2xhc3NpYy10b3AtbGluZS1tb2RhbCIgYnV0dG9ucz0iZm9vdGVyQnV0dG9ucyIgaGVhZGVyPSJEaXN0cmlidXRpb24gYnkgU3RhdHVzIiBzaG93LWNsb3NlLWJ1dHRvbj0idHJ1ZSI+CisKKyAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRpb24tdmlldyI+CisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGlvbi12aWV3LWhlYWRlciI+CisKKyAgICAgICAgPC9kaXY+CisKKworICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0aW9uLXZpZXctY29udGVudCI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRpb24tdmlldy1jb250ZW50LXNlY3Rpb24gdy1zZGMtZGlzdHJpYnV0ZS1wYXJlbnQtYmxvY2siPgorICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgPGxpICBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1wYXJlbnQtYmxvY2siID4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtcm93IHctc2RjLWRpc3RyaWJ1dGUtcm93LWV4dGVuZHMgZXh0ZW5kcyI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLXJvdy1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlLXNlY3Rpb24gaXRlbS0xIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+RGlzdHJpYnV0aW9uIElEPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWJpbmQ9ImRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25JRCI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlLXNlY3Rpb24gaXRlbS0yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSIgdHJhbnNsYXRlPSJESVNUUklCVVRJT05fVklFV19USVRMRV9VU0VSX0lEIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctYmluZD0iZGlzdHJpYnV0aW9uLnVzZXJJZCI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlLXNlY3Rpb24gaXRlbS0zIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+VGltZVtVVENdOjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJkaXN0cmlidXRpb24udGltZXN0YW1wIHwgc3RyaW5nVG9EYXRlRmlsdGVyIHwgZGF0ZTogJ01NL2RkL3l5eXkgaDptbWEnOidVVEMnIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUtc2VjdGlvbiBpdGVtLTQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IHN0YXR1cy1pY29uIiBkYXRhLW5nLWNsYXNzPSJkaXN0cmlidXRpb24uZGVwbG95ZW1lbnRTdGF0dXMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyIgZGF0YS1uZy1iaW5kPSJkaXN0cmlidXRpb24uZGVwbG95ZW1lbnRTdGF0dXMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1zdGF0dXMtYmxvY2siIGRhdGEtbmctc2hvdz0iZGlzdHJpYnV0aW9uLnN0YXR1c0NvdW50Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1pdGVtLTEiPlN0YXR1czoge3tzdGF0dXN9fSA8c3BhbiBkYXRhLW5nLWJpbmQ9IihkaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQ29tcG9uZW50cyB8IGZpbHRlcjpzdGF0dXM6dHJ1ZSkubGVuZ3RoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJibHVlLWZvbnQiPjwvc3Bhbj48L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtY29tcG9uZW50cy1ibG9jayBkaXNhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1uZy1yZXBlYXQ9IihvbWZDb21wb25lbnRJRCxvbWZDb21wb25lbnRMaXN0KSBpbiBkaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQ29tcG9uZW50cyB8IG9yZGVyQnk6ICctdGltZXN0YW1wJyB8IGZpbHRlcjpzdGF0dXM6dHJ1ZSB8IGdyb3VwQnk6J29tZkNvbXBvbmVudElEJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLXJvdyBvbWYtY29tcG9uZW50LXJvdyB3LXNkYy1kaXN0cmlidXRlLXJvdy1leHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2V4dGVuZHMnOiBvbWZDb21wb25lbnRMaXN0RXh0ZW5kc30iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0aW9uLWFycm93LWJ0biIgZGF0YS1uZy1jbGljaz0ib21mQ29tcG9uZW50TGlzdEV4dGVuZHM9IW9tZkNvbXBvbmVudExpc3RFeHRlbmRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGFzcz0ieydleHRlbmRzJzogb21mQ29tcG9uZW50TGlzdEV4dGVuZHN9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9Im9tZkNvbXBvbmVudExpc3RFeHRlbmRzPWZhbHNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLXN0YXR1cy1ibG9jayI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdHVzLWl0ZW0tMSI+e3tvbWZDb21wb25lbnRJRH19IDxzcGFuIGNsYXNzPSJibHVlLWZvbnQiPnt7b21mQ29tcG9uZW50TGlzdC5sZW5ndGh9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXNob3c9Im9tZkNvbXBvbmVudExpc3RFeHRlbmRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLW9tZkNvbXBvbmVudC1ibG9jayBkaXNhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtcm93LWV4dGVuZHMgZGlzYWJsZS1ob3ZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlzYWJsZS1ob3ZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtcm93IG9tZkNvbXBvbmVudC10YWJsZS1oZWFkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIGl0ZW0tMSI+Q29tcG9uZW50IElEPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSBpdGVtLTIiPkFydGlmYWN0IE5hbWU8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIGl0ZW0tMyI+VVJMPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSBpdGVtLTQiPlRpbWUoVVRDKTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUgaXRlbS01Ij5TdGF0dXM8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1yb3cgb21mQ29tcG9uZW50LXRhYmxlLXJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcGVhdC1zdGFydD0iKHVybCx1cmxMaXN0KSBpbiBvbWZDb21wb25lbnRMaXN0IHwgb3JkZXJCeTogJy10aW1lc3RhbXAnIHwgIGdyb3VwQnk6J3VybCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0idXJsTGlzdEV4dGVuZHM/J2V4dGVuZHMgcm93LXt7JGluZGV4fX0nOidyb3cte3skaW5kZXh9fSciID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtY2VsbCBpdGVtLTEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGlvbi1hcnJvdy1idG4iIGRhdGEtbmctY2xpY2s9InVybExpc3RFeHRlbmRzPSF1cmxMaXN0RXh0ZW5kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZXh0ZW5kcyc6IHVybExpc3RFeHRlbmRzfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaW5pdD0idXJsTGlzdExpc3RFeHRlbmRzPWZhbHNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dXJsTGlzdFswXS5vbWZDb21wb25lbnRJRH19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtY2VsbCBpdGVtLTIiIHNkYy1zbWFydC10b29sdGlwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0VXJsTmFtZSh1cmxMaXN0WzBdLnVybCl9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLWNlbGwgaXRlbS0zIGRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc2RjLXNtYXJ0LXRvb2x0aXAgY2xhc3M9ImRpc3RyaWJ1dGlvbi11cmwiPnt7dXJsTGlzdFswXS51cmx9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc2RjLXNtYXJ0LXRvb2x0aXAgdGl0bGU9IkNvcHkgdXJsIiBjbGlwYm9hcmQgdGV4dD0idXJsTGlzdFswXS51cmwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic3ByaXRlLW5ldyBsaW5rLWJ0biBjb3B5LWxpbmsgZGlzYWJsZS1ob3ZlciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtY2VsbCBpdGVtLTQiPjxzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJ1cmxMaXN0WzBdLnRpbWVzdGFtcCAgfCBkYXRlOiAnTU0vZGQveXl5eSBoOm1tYSc6J1VUQyciPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1jZWxsIGl0ZW0tNSI+e3t1cmxMaXN0WzBdLnN0YXR1c319PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1lbmQgZGF0YS1uZy1zaG93PSJ1cmxMaXN0RXh0ZW5kcyIgY2xhc3M9ImRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1yb3cgZXh0ZW5kcyBkaXNhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgZGF0YS1uZy1zaG93PSJ1cmxMaXN0RXh0ZW5kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtdXJsLWJsb2NrIGRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1uZy1yZXBlYXQ9ImRpc3RyaWJ1dGlvbkNvbXBvbmVudCBpbiB1cmxMaXN0IHwgb3JkZXJCeTogJy10aW1lc3RhbXAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJkaXN0cmlidXRpb25Db21wb25lbnQudGltZXN0YW1wIHwgZGF0ZTogJ01NL2RkL3l5eXkgaDptbWEnOidVVEMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2FibGUtaG92ZXIiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNhYmxlLWhvdmVyIj57e2Rpc3RyaWJ1dGlvbkNvbXBvbmVudC5zdGF0dXN9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNhYmxlLWhvdmVyIHJlYXNvbiIgZGF0YS1uZy1zaG93PSJkaXN0cmlidXRpb25Db21wb25lbnQuc3RhdHVzID09ICdOT1RfTk9USUZJRUQnIj5SZWFzb246IENvbXBvbmVudCBoYXMgZGV0ZXJtaW5lZCBhcnRpZmFjdCBpcyBub3QgbmVlZGVkLjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZGlzYWJsZS1ob3ZlciByZWFzb24iIGRhdGEtbmctc2hvdz0iZGlzdHJpYnV0aW9uQ29tcG9uZW50LmVycm9yUmVhc29uIj5SZWFzb246IHt7ZGlzdHJpYnV0aW9uQ29tcG9uZW50LmVycm9yUmVhc29ufX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICA8L2Rpdj4KKworCis8L3NkYy1tb2RhbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjMyMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kaXN0cmlidXRpb24vZGlzcmlidXRpb24tc3RhdHVzLW1vZGFsL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC5sZXNzCkBAIC0wLDAgKzEsMzMgQEAKKy53LXNkYy1jbGFzc2ljLXRvcC1saW5lLW1vZGFsIHsKKworICAgIC53LXNkYy1tb2RhbC1oZWFkIHsKKyAgICAgLy8gICBib3JkZXItYm90dG9tOiBub25lOworICAgIH0KKyAgICAudy1zZGMtZGlzdHJpYnV0aW9uLXZpZXcgeworCisgICAgICAgIC53LXNkYy1kaXN0cmlidXRpb24tdmlldy1jb250ZW50IHsKKyAgICAgICAgICAgIGhlaWdodDogNTAwcHg7CisgICAgICAgIH0KKworICAgICAgICAudy1zZGMtZGlzdHJpYnV0aW9uLXZpZXctY29udGVudC1zZWN0aW9uIHsKKworICAgICAgICAgICAgLnctc2RjLWRpc3RyaWJ1dGUtcGFyZW50LWJsb2NrIHsKKyAgICAgICAgICAgICAgICAudy1zZGMtZGlzdHJpYnV0ZS1jb21wb25lbnRzLWJsb2NrIHsKKworICAgICAgICAgICAgICAgICAgICAub21mLWNvbXBvbmVudC1yb3cgeworICAgICAgICAgICAgICAgICAgICAgICAgLnctc2RjLWRpc3RyaWJ1dGUtc3RhdHVzLWJsb2NrIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRpdiB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXN0cmlidXRpb24tdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3RyaWJ1dGlvbi12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTU4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXN0cmlidXRpb24tdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDEzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KKworbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBpbnRlcmZhY2UgSURpc3RyaWJ1dGlvblZpZXdNb2RlbCBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZXsKKyAgICAgICAgbW9kYWxEaXN0cmlidXRpb246bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2VJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZTogTW9kZWxzLkNvbXBvbmVudHMuU2VydmljZTsKKyAgICAgICAgZGlzdHJpYnV0aW9ucyA6IEFycmF5PE1vZGVscy5EaXN0cmlidXRpb24+OworICAgICAgICBzaG93Q29tcG9uZW50cyhkaXN0cmlidXRpb246TW9kZWxzLkRpc3RyaWJ1dGlvbik6IHZvaWQ7CisgICAgICAgIG1hcmtBc0RlcGxveWVkKGRpc3RyaWJ1dGlvbjpNb2RlbHMuRGlzdHJpYnV0aW9uKTogdm9pZDsKKyAgICAgICAgZ2V0U3RhdHVzQ291bnQoZGlzdHJpYnV0aW9uQ29tcG9uZW50OkFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+KTphbnk7CisgICAgICAgIGluaXREaXN0cmlidXRpb25zKCk6dm9pZDsKKyAgICAgICAgZ2V0VXJsTmFtZSh1cmw6c3RyaW5nKTpzdHJpbmc7CisgICAgICAgIGNsb3NlKCk6IHZvaWQ7CisgICAgICAgIG9wZW5EaXNyaWJ1dGlvblN0YXR1c01vZGFsOkZ1bmN0aW9uOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBEaXN0cmlidXRpb25WaWV3TW9kZWx7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInCisKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3RvcigKKyAgICAgICAgICAgIHByaXZhdGUgJHNjb3BlOklEaXN0cmlidXRpb25WaWV3TW9kZWwsCisgICAgICAgICAgICAgcHJpdmF0ZSBNb2RhbHNIYW5kbGVyOiBTZGMuVXRpbHMuTW9kYWxzSGFuZGxlcgorICAgICAgICApeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVTZWxlY3RlZE1lbnVJdGVtKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlcnZpY2UgPSA8TW9kZWxzLkNvbXBvbmVudHMuU2VydmljZT50aGlzLiRzY29wZS5jb21wb25lbnQ7CisKKworICAgICAgICAgICAgLy8gT3BlbiBEaXN0cmlidXRpb24gc3RhdHVzIG1vZGFsCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vcGVuRGlzcmlidXRpb25TdGF0dXNNb2RhbCA9IChkaXN0cmlidXRpb246IE1vZGVscy5EaXN0cmlidXRpb24sc3RhdHVzOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5Nb2RhbHNIYW5kbGVyLm9wZW5EaXN0cmlidXRpb25TdGF0dXNNb2RhbChkaXN0cmlidXRpb24sc3RhdHVzKS50aGVuKCgpPT57CisgICAgICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICAgICAgfSwgKCk9PnsKKyAgICAgICAgICAgICAgICAgICAgLy8gRVJST1IKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd0NvbXBvbmVudHMgPSAoZGlzdHJpYnV0aW9uOiBNb2RlbHMuRGlzdHJpYnV0aW9uKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAocmVzcG9uc2UpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdvbkVycm9yIHNob3dDb21wb25lbnRzJyxyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGRpc3RyaWJ1dGlvbkNvbXBvbmVudHM6IEFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Db21wb25lbnRzID0gZGlzdHJpYnV0aW9uQ29tcG9uZW50czsKKyAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uLnN0YXR1c0NvdW50ID0gdGhpcy4kc2NvcGUuZ2V0U3RhdHVzQ291bnQoZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbkNvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgIC8vIGRpc3RyaWJ1dGlvbi5jb21wb25lbnRzID0gdGhpcy5hZ2dyZWdhdGVEaXN0cmlidXRpb25Db21wb25lbnQoZGlzdHJpYnV0aW9uQ29tcG9uZW50cyk7OworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VydmljZS5nZXREaXN0cmlidXRpb25zQ29tcG9uZW50KGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25JRCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0U3RhdHVzQ291bnQgPSAoZGlzdHJpYnV0aW9uQ29tcG9uZW50OkFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+KTphbnkgPT4geworICAgICAgICAgICAgICAgIHJldHVybiBfLmNvdW50QnkoZGlzdHJpYnV0aW9uQ29tcG9uZW50LCAnc3RhdHVzJykKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFVybE5hbWUgPSAodXJsOnN0cmluZyk6c3RyaW5nID0+eworICAgICAgICAgICAgICAgIGxldCB1cmxOYW1lOnN0cmluZyA9IF8ubGFzdCh1cmwuc3BsaXQoJy8nKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVybE5hbWU7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5tYXJrQXNEZXBsb3llZCA9IChkaXN0cmlidXRpb246IE1vZGVscy5EaXN0cmlidXRpb24pOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9IChyZXNwb25zZSkgPT4geworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ29uRXJyb3IgbWFya0FzRGVwbG95ZWQnLHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocmVzdWx0OiBhbnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uLmRlcGxveWVtZW50U3RhdHVzID0gJ0RlcGxveWVkJzsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlcnZpY2UubWFya0FzRGVwbG95ZWQoZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklEKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmluaXREaXN0cmlidXRpb25zID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIGxldCBvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnb25FcnJvciBpbml0RGlzdHJpYnV0aW9ucycscmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChkaXN0cmlidXRpb25zOiBBcnJheTxNb2RlbHMuRGlzdHJpYnV0aW9uPikgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXN0cmlidXRpb25zID0gZGlzdHJpYnV0aW9uczsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlcnZpY2UuZ2V0RGlzdHJpYnV0aW9uc0xpc3QoKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pbml0RGlzdHJpYnV0aW9ucygpOworCisgICAgICAgIH07CisKKworICAgICAgICBwcml2YXRlIGFnZ3JlZ2F0ZURpc3RyaWJ1dGlvbkNvbXBvbmVudCA9IChkaXN0cmlidXRpb25Db21wb25lbnRzOkFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+KTphbnkgPT57CisgICAgICAgICAgICBsZXQgYWdncmVnYXRlRGlzdHJpYnV0aW9uczpVdGlscy5EaWN0aW9uYXJ5PHN0cmluZyxVdGlscy5EaWN0aW9uYXJ5PHN0cmluZyxBcnJheTxNb2RlbHMuRGlzdHJpYnV0aW9uQ29tcG9uZW50Pj4+ID0gbmV3IFV0aWxzLkRpY3Rpb25hcnk8c3RyaW5nLFV0aWxzLkRpY3Rpb25hcnk8c3RyaW5nLEFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+Pj4oKTsKKyAgICAgICAgICAgIGxldCB0ZW1wQWdncmVnYXRlRGlzdHJpYnV0aW9uczphbnk9IF8uZ3JvdXBCeShkaXN0cmlidXRpb25Db21wb25lbnRzLCdvbWZDb21wb25lbnRJRCcpOworICAgICAgICAgICAgbGV0IGFhID0gbmV3IFV0aWxzLkRpY3Rpb25hcnk8c3RyaW5nLEFycmF5PE1vZGVscy5EaXN0cmlidXRpb25Db21wb25lbnQ+PigpOworCisgICAgICAgICAgICBsZXQgdGVtcEFnZ3JlZ2F0ZTphbnk7CisgICAgICAgICAgICBfLmZvckVhY2godGVtcEFnZ3JlZ2F0ZURpc3RyaWJ1dGlvbnMsKGRpc3RyaWJ1dGlvbkNvbXBvbmVudHM6QXJyYXk8TW9kZWxzLkRpc3RyaWJ1dGlvbkNvbXBvbmVudD4sb21mQ29tcG9uZW50SUQ6c3RyaW5nKT0+eworCisgICAgICAgICAgICAgICBsZXQgdXJsczphbnkgPSBfLmdyb3VwQnkoZGlzdHJpYnV0aW9uQ29tcG9uZW50cywndXJsJyk7CisgICAgICAgICAgICAgICAgYWdncmVnYXRlRGlzdHJpYnV0aW9ucy5zZXRWYWx1ZShvbWZDb21wb25lbnRJRCx1cmxzKTsKKyAgICAgICAgICAgICAgIC8vIGFnZ3JlZ2F0ZURpc3RyaWJ1dGlvbnNbb21mQ29tcG9uZW50SURdID0gOworCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGFnZ3JlZ2F0ZURpc3RyaWJ1dGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZURpc3RyaWJ1dGlvbnM7CisgICAgICAgIH07CisKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3RyaWJ1dGlvbi12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXN0cmlidXRpb24tdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjBmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXN0cmlidXRpb24tdmlldy5odG1sCkBAIC0wLDAgKzEsMTcxIEBACis8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRpb24tdmlldyI+CisgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0aW9uLXZpZXctaGVhZGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0aW9uLXZpZXctdGl0bGUiPkRJU1RSSUJVVElPTiA8c3BhbiBkYXRhLW5nLWJpbmQ9IidbJyArIGRpc3RyaWJ1dGlvbnMubGVuZ3RoICsnXSciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImJsdWUtZm9udCI+PC9zcGFuPjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItc3BhY2VyIj48L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0idG9wLXNlYXJjaCI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2VhcmNoLXRleHQiCisgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ic2VhcmNoVGV4dGJveCIKKyAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VhcmNoIgorICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9InNlYXJjaEJpbmQiCisgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ibWFpbi1tZW51LWlucHV0LXNlYXJjaCIKKyAgICAgICAgICAgICAgICAgICBuZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiA1MDAgfSIvPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Inctc2RjLXNlYXJjaC1pY29uIG1hZ25pZmljYXRpb24iPjwvc3Bhbj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9InNwcml0ZS1uZXcgcmVmcmVzaC1idG4iIGRhdGEtdGVzdHMtaWQ9InJlZnJlc2hCdXR0b24iIGRhdGEtbmctY2xpY2s9ImluaXREaXN0cmlidXRpb25zKCkiIHNkYy1zbWFydC10b29sdGlwPSIiCisgICAgICAgICAgICAgdGl0bGU9IlJlZnJlc2giPjwvZGl2PgorICAgIDwvZGl2PgorCisKKyAgICA8cGVyZmVjdC1zY3JvbGxiYXIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0aW9uLXZpZXctY29udGVudCI+CisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGlvbi12aWV3LWNvbnRlbnQtc2VjdGlvbiIgZGF0YS10ZXN0cy1pZD0iZGl0cmlidXRpb25UYWJsZSI+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpIGRhdGEtbmctcmVwZWF0PSJpdGVtIGluIGRpc3RyaWJ1dGlvbnMgfCBvcmRlckJ5OiAnLXRpbWVzdGFtcCcgfCBmaWx0ZXI6c2VhcmNoQmluZCIKKyAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pbml0PSJpdGVtLmRhdGVGb3JtYXQgPSAoIGl0ZW0udGltZXN0YW1wIHwgc3RyaW5nVG9EYXRlRmlsdGVyIHwgZGF0ZTogJ01NL2RkL3l5eXkgaDptbWEnOidVVEMnICkiCisgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLXBhcmVudC1ibG9jayIgZGF0YS10ZXN0cy1pZD0icmVjb3JkX3t7JGluZGV4fX0iIGRhdGEtbmctY2xhc3M9InsnZXh0ZW5kcyc6IGl0ZW0uc2hvd0RldGFpbHN9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1yb3cgdy1zZGMtZGlzdHJpYnV0ZS1yb3ctZXh0ZW5kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2V4dGVuZHMnOiBpdGVtLnNob3dEZXRhaWxzICAmJiBpdGVtLmRpc3RyaWJ1dGlvbkNvbXBvbmVudHMubGVuZ3RofSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRpb24tYXJyb3ctYnRuIiBkYXRhLXRlc3RzLWlkPSJTaG93UmVjb3JkQnV0dG9uX3t7JGluZGV4fX0iIGRhdGEtbmctY2xpY2s9InNob3dDb21wb25lbnRzKGl0ZW0pOyBpdGVtLnNob3dEZXRhaWxzPSFpdGVtLnNob3dEZXRhaWxzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2V4dGVuZHMnOiBpdGVtLnNob3dEZXRhaWxzfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1yb3ctY29udGVudCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1jb250ZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUtc2VjdGlvbiBpdGVtLTEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPkRpc3RyaWJ1dGlvbiBJRDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWJpbmQ9Iml0ZW0uZGlzdHJpYnV0aW9uSUQiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUtc2VjdGlvbiBpdGVtLTIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiIHRyYW5zbGF0ZT0iRElTVFJJQlVUSU9OX1ZJRVdfVElUTEVfVVNFUl9JRCI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctYmluZD0iaXRlbS51c2VySWQiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUtc2VjdGlvbiBpdGVtLTMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPlRpbWVbVVRDXTo8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9Iml0ZW0uZGF0ZUZvcm1hdCI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZS1zZWN0aW9uIGl0ZW0tNCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyBzdGF0dXMtaWNvbiIgZGF0YS1uZy1jbGFzcz0iaXRlbS5kZXBsb3llbWVudFN0YXR1cyI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNwcml0ZS1uZXciIGRhdGEtbmctYmluZD0iaXRlbS5kZXBsb3llbWVudFN0YXR1cyI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwcml0ZS1uZXcgZGlzdHJpYnV0aW9uLWJ0aCBpdGVtLTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZSc6aXRlbS5kZXBsb3llbWVudFN0YXR1cz09PSdEZXBsb3llZCd9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSIoaXRlbS5kZXBsb3llbWVudFN0YXR1cz09PSdEZXBsb3llZCcpIHx8IG1hcmtBc0RlcGxveWVkKGl0ZW0pIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1zdGF0dXMtYmxvY2siIGRhdGEtbmctc2hvdz0iaXRlbS5zdGF0dXNDb3VudCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1pdGVtLTEiPlRvdGFsIEFydGlmYWN0czo8c3BhbiBkYXRhLW5nLWJpbmQ9IihpdGVtLnN0YXR1c0NvdW50Lk5PVF9OT1RJRklFRCB8fCAwKSArIChpdGVtLnN0YXR1c0NvdW50Lk5PVElGSUVEIHx8IDApICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImJsdWUtZm9udCIgZGF0YS10ZXN0cy1pZD0idG90YWxBcnRpZmFjdHNfe3skaW5kZXh9fSI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtaXRlbS0yICIgPjxzYXBuIGNsYXNzPSJsaW5rIiBkYXRhLW5nLWNsaWNrPSJvcGVuRGlzcmlidXRpb25TdGF0dXNNb2RhbChpdGVtLCdOT1RJRklFRCcpIj5Ob3RpZmllZDo8L3NhcG4+PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmluZD0iaXRlbS5zdGF0dXNDb3VudC5OT1RJRklFRCB8fCAwIiBjbGFzcz0iYmx1ZS1mb250IiBkYXRhLXRlc3RzLWlkPSJub3RpZmllZF97eyRpbmRleH19Ij48L3NwYW4+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1pdGVtLTMgbGluayIgPjxzYXBuIGNsYXNzPSJsaW5rIiBkYXRhLW5nLWNsaWNrPSJvcGVuRGlzcmlidXRpb25TdGF0dXNNb2RhbChpdGVtLCdET1dOTE9BRF9PSycpIj5Eb3dubG9hZGVkOjwvc2Fwbj48c3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJpdGVtLnN0YXR1c0NvdW50LkRPV05MT0FEX09LIHx8IDAiIGNsYXNzPSJibHVlLWZvbnQiIGRhdGEtdGVzdHMtaWQ9ImRvd25sb2FkZWRfe3skaW5kZXh9fSI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtaXRlbS00IGxpbmsiPjxzYXBuIGNsYXNzPSJsaW5rIiBkYXRhLW5nLWNsaWNrPSJvcGVuRGlzcmlidXRpb25TdGF0dXNNb2RhbChpdGVtLCdERVBMT1lfT0snKSI+RGVwbG95ZWQ6PC9zYXBuPjxzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9Iml0ZW0uc3RhdHVzQ291bnQuREVQTE9ZX09LIHx8IDAiIGNsYXNzPSJibHVlLWZvbnQiIGRhdGEtdGVzdHMtaWQ9ImRlcGxveWVkX3t7JGluZGV4fX0iID48L3NwYW4+PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZGVwbG95ZWQnOihpdGVtLnN0YXR1c0NvdW50LkRFUExPWV9PSyA+IDApfSI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtaXRlbS01IGxpbmsiID48c2FwbiBjbGFzcz0ibGluayIgZGF0YS1uZy1jbGljaz0ib3BlbkRpc3JpYnV0aW9uU3RhdHVzTW9kYWwoaXRlbSwnTk9UX05PVElGSUVEJykiPk5vdCBOb3RpZmllZDo8L3NhcG4+PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmluZD0iaXRlbS5zdGF0dXNDb3VudC5OT1RfTk9USUZJRUQgfHwgMCIgY2xhc3M9ImJsdWUtZm9udCIgZGF0YS10ZXN0cy1pZD0iTm90Tm90aWZpZWRfe3skaW5kZXh9fSI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtaXRlbS02Ij48c2FwbiBjbGFzcz0ibGluayIgZGF0YS1uZy1jbGljaz0ib3BlbkRpc3JpYnV0aW9uU3RhdHVzTW9kYWwoaXRlbSwnRE9XTkxPQURfRVJST1InKSIgPkVycm9yczo8L3NhcG4+PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmluZD0iaXRlbS5zdGF0dXNDb3VudC5ET1dOTE9BRF9FUlJPUiB8fCAwIiBjbGFzcz0icmVkLWZvbnQgIj48L3NwYW4+PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOihpdGVtLnN0YXR1c0NvdW50LkRPV05MT0FEX0VSUk9SID4gMCl9IiBkYXRhLXRlc3RzLWlkPSJlcnJvcnNfe3skaW5kZXh9fSI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDx1bCBkYXRhLW5nLXNob3c9Iml0ZW0uc2hvd0RldGFpbHMgJiYgaXRlbS5kaXN0cmlidXRpb25Db21wb25lbnRzLmxlbmd0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLWNvbXBvbmVudHMtYmxvY2sgZGlzYWJsZS1ob3ZlciI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdD0iKG9tZkNvbXBvbmVudElELG9tZkNvbXBvbmVudExpc3QpIGluIGl0ZW0uZGlzdHJpYnV0aW9uQ29tcG9uZW50cyB8IG9yZGVyQnk6ICctdGltZXN0YW1wJyB8IGZpbHRlcjpzZWFyY2hCaW5kIHwgZ3JvdXBCeTonb21mQ29tcG9uZW50SUQnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZGlzYWJsZS1ob3ZlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9InN0YXR1c0NvdW50ID0gZ2V0U3RhdHVzQ291bnQob21mQ29tcG9uZW50TGlzdCk7Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLXJvdyBvbWYtY29tcG9uZW50LXJvdyB3LXNkYy1kaXN0cmlidXRlLXJvdy1leHRlbmRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydleHRlbmRzJzogb21mQ29tcG9uZW50TGlzdEV4dGVuZHN9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0aW9uLWFycm93LWJ0biIgZGF0YS1uZy1jbGljaz0ib21mQ29tcG9uZW50TGlzdEV4dGVuZHM9IW9tZkNvbXBvbmVudExpc3RFeHRlbmRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsYXNzPSJ7J2V4dGVuZHMnOiBvbWZDb21wb25lbnRMaXN0RXh0ZW5kc30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1pbml0PSJvbWZDb21wb25lbnRMaXN0RXh0ZW5kcz1mYWxzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtc3RhdHVzLWJsb2NrIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1pdGVtLTEiPnt7b21mQ29tcG9uZW50SUR9fSA8c3BhbiBjbGFzcz0iYmx1ZS1mb250Ij57eyhzdGF0dXNDb3VudC5OT1RfTk9USUZJRUQgfHwgMCkgKyAoc3RhdHVzQ291bnQuTk9USUZJRUQgfHwgMCkgfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1pdGVtLTIiPk5vdGlmaWVkOjxzcGFuIGRhdGEtbmctYmluZD0ic3RhdHVzQ291bnQuTk9USUZJRUQgfHwgMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJibHVlLWZvbnQiPjwvc3Bhbj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1pdGVtLTMiPkRvd25sb2FkZWQ6PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9InN0YXR1c0NvdW50LkRPV05MT0FEX09LIHx8IDAiIGNsYXNzPSJibHVlLWZvbnQiPjwvc3Bhbj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1pdGVtLTQiPkRlcGxveWVkOjxzcGFuIGRhdGEtbmctYmluZD0ic3RhdHVzQ291bnQuREVQTE9ZX09LIHx8IDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iYmx1ZS1mb250Ij48L3NwYW4+PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2RlcGxveWVkJzooc3RhdHVzQ291bnQuREVQTE9ZX09LID4gMCl9Ij48L3NwYW4+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtaXRlbS01Ij5Ob3QgTm90aWZpZWQ6PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9InN0YXR1c0NvdW50Lk5PVF9OT1RJRklFRCB8fCAwIiBjbGFzcz0iYmx1ZS1mb250Ij48L3NwYW4+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtaXRlbS02Ij5FcnJvcnM6PHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9InN0YXR1c0NvdW50LkRPV05MT0FEX0VSUk9SIHx8IDAiIGNsYXNzPSJyZWQtZm9udCI+PC9zcGFuPjxzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6KHN0YXR1c0NvdW50LkRPV05MT0FEX0VSUk9SID4gMCl9Ij48L3NwYW4+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1zaG93PSJvbWZDb21wb25lbnRMaXN0RXh0ZW5kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLW9tZkNvbXBvbmVudC1ibG9jayBkaXNhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idy1zZGMtZGlzdHJpYnV0ZS1yb3ctZXh0ZW5kcyBkaXNhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtcm93IG9tZkNvbXBvbmVudC10YWJsZS1oZWFkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUgaXRlbS0xIj5Db21wb25lbnQgSUQ8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUgaXRlbS0yIj5BcnRpZmFjdCBOYW1lPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIGl0ZW0tMyI+VVJMPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIGl0ZW0tNCI+VGltZShVVEMpPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIGl0ZW0tNSI+U3RhdHVzPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLXJvdyBvbWZDb21wb25lbnQtdGFibGUtcm93IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXBlYXQtc3RhcnQ9Iih1cmwsdXJsTGlzdCkgaW4gb21mQ29tcG9uZW50TGlzdCB8IG9yZGVyQnk6ICctdGltZXN0YW1wJyB8ICBncm91cEJ5Oid1cmwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0idXJsTGlzdEV4dGVuZHM/J2V4dGVuZHMgcm93LXt7JGluZGV4fX0nOidyb3cte3skaW5kZXh9fSciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLWNlbGwgaXRlbS0xIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGlvbi1hcnJvdy1idG4iIGRhdGEtbmctY2xpY2s9InVybExpc3RFeHRlbmRzPSF1cmxMaXN0RXh0ZW5kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydleHRlbmRzJzogdXJsTGlzdEV4dGVuZHN9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9InVybExpc3RMaXN0RXh0ZW5kcz1mYWxzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t1cmxMaXN0WzBdLm9tZkNvbXBvbmVudElEfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtY2VsbCBpdGVtLTIiIHNkYy1zbWFydC10b29sdGlwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRVcmxOYW1lKHVybExpc3RbMF0udXJsKX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLWNlbGwgaXRlbS0zIGRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzZGMtc21hcnQtdG9vbHRpcCBjbGFzcz0iZGlzdHJpYnV0aW9uLXVybCI+e3t1cmxMaXN0WzBdLnVybH19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHNkYy1zbWFydC10b29sdGlwIHRpdGxlPSJDb3B5IHVybCIgY2xpcGJvYXJkIHRleHQ9InVybExpc3RbMF0udXJsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic3ByaXRlLW5ldyBsaW5rLWJ0biBjb3B5LWxpbmsgZGlzYWJsZS1ob3ZlciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLWNlbGwgaXRlbS00Ij48c3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJ1cmxMaXN0WzBdLnRpbWVzdGFtcCAgfCBkYXRlOiAnTU0vZGQveXl5eSBoOm1tYSc6J1VUQyciPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtY2VsbCBpdGVtLTUiPnt7dXJsTGlzdFswXS5zdGF0dXN9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZCBkYXRhLW5nLXNob3c9InVybExpc3RFeHRlbmRzIiBjbGFzcz0iZGlzYWJsZS1ob3ZlciIgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1kaXN0cmlidXRlLXJvdyBleHRlbmRzIGRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGRhdGEtbmctc2hvdz0idXJsTGlzdEV4dGVuZHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Inctc2RjLWRpc3RyaWJ1dGUtdXJsLWJsb2NrIGRpc2FibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLW5nLXJlcGVhdD0iZGlzdHJpYnV0aW9uQ29tcG9uZW50IGluIHVybExpc3QgfCBvcmRlckJ5OiAnLXRpbWVzdGFtcCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmluZD0iZGlzdHJpYnV0aW9uQ29tcG9uZW50LnRpbWVzdGFtcCB8IGRhdGU6ICdNTS9kZC95eXl5IGg6bW1hJzonVVRDJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNhYmxlLWhvdmVyIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZGlzYWJsZS1ob3ZlciI+e3tkaXN0cmlidXRpb25Db21wb25lbnQuc3RhdHVzfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZGlzYWJsZS1ob3ZlciByZWFzb24iIGRhdGEtbmctc2hvdz0iZGlzdHJpYnV0aW9uQ29tcG9uZW50LnN0YXR1cyA9PSAnTk9UX05PVElGSUVEJyI+UmVhc29uOiBDb21wb25lbnQgaGFzIGRldGVybWluZWQgYXJ0aWZhY3QgaXMgbm90IG5lZWRlZC48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2FibGUtaG92ZXIgcmVhc29uIiBkYXRhLW5nLXNob3c9ImRpc3RyaWJ1dGlvbkNvbXBvbmVudC5lcnJvclJlYXNvbiI+UmVhc29uOiB7e2Rpc3RyaWJ1dGlvbkNvbXBvbmVudC5lcnJvclJlYXNvbn19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvZGl2PgorCisgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kaXN0cmlidXRpb24vZGlzdHJpYnV0aW9uLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXN0cmlidXRpb24ubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQ4YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9kaXN0cmlidXRpb24vZGlzdHJpYnV0aW9uLmxlc3MKQEAgLTAsMCArMSwzNjEgQEAKKworLnctc2RjLWRpc3RyaWJ1dGlvbi12aWV3IHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworCisgICAgLmdfMTsKKyAgICBtaW4taGVpZ2h0OiA1MDBweDsKKworICAgIC53LXNkYy1kaXN0cmlidXRpb24tdmlldy1kaXN0cmlidXRlZC1ncmVlbi10ZXh0IHsKKyAgICAgICAgLmxfOTsKKyAgICAgICAgLmJvbGQ7CisgICAgfQorICAgIC53LXNkYy1kaXN0cmlidXRpb24tdmlldy1kaXN0cmlidXRlZC1lcnJvci1yZWQtdGV4dCB7CisgICAgICAgIC5oXzk7CisgICAgICAgIC5ib2xkOworICAgIH0KKworICAgIC5iZ19jOworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgcGFkZGluZzogMzBweCAxMHB4OworICAgIHdpZHRoOiAxMDAlOworCisgICAgLnctc2RjLWRpc3RyaWJ1dGlvbi12aWV3LWhlYWRlciB7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOworICAgICAgICBtYXJnaW46IDAgMjVweCA1cHggNDBweDsKKworICAgICAgICAuaGVhZGVyLXNwYWNlciB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAudG9wLXNlYXJjaCB7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgaW5wdXQgeworICAgICAgICAgICAgJi5zZWFyY2gtdGV4dCB7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAyNnB4OworICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyNnB4OworICAgICAgICAgICAgICAgIG1hcmdpbjogMCAxOHB4IDRweCAyMHB4OworICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDI1cHg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAubWFnbmlmaWNhdGlvbiB7CisgICAgICAgICAgICB0b3A6IDhweDsKKyAgICAgICAgICAgIHJpZ2h0OiAyNXB4OworICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLWRpc3RyaWJ1dGlvbi12aWV3LWNvbnRlbnQgeworICAgICAgICAucGVyZmVjdC1zY3JvbGxiYXI7CisgICAgICAgIHBhZGRpbmc6IDAgMjVweCAwIDBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMjVweDsKKyAgICAgICAgaGVpZ2h0OiA3MDBweDsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworCisgICAgfQorCisgICAgLnctc2RjLWRpc3RyaWJ1dGlvbi12aWV3LXRpdGxlIHsKKyAgICAgICAgLnNfMTRfcjsKKworICAgICAgICBsaW5lLWhlaWdodDogMzBweDsKKworICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgIHBhZGRpbmctbGVmdDogNXB4OworICAgICAgICB9CisgICAgfQorCisgICAgLmJsdWUtZm9udCB7CisgICAgICAgIC5hXzE0X207CisKKyAgICB9CisKKyAgICAucmVkLWZvbnQgeworICAgICAgICAucV8xNF9tOworICAgIH0KKworICAgIC53LXNkYy1kaXN0cmlidXRpb24tdmlldy1ibG9jayB7CisgICAgICAgIGRpdiB7CisgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAudy1zZGMtZGlzdHJpYnV0aW9uLXZpZXctY29udGVudC1zZWN0aW9uIHsKKyAgICAgICAgdWwgeworICAgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICAgICAgICB9CisKKyAgICAgICAgLmRpc3RyaWJ1dGlvbi1idGggeworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICAmLmRpc2FibGVkIHsKKyAgICAgICAgICAgICAgICBjdXJzb3I6IG5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuY29weS1saW5rIHsKKyAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE5cHg7CisgICAgICAgICAgICBtYXJnaW4tbGVmdDogOHB4OworICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOworCisgICAgICAgIH0KKworICAgICAgICAudy1zZGMtZGlzdHJpYnV0ZS1yb3ctZXh0ZW5kcyB7CisgICAgICAgICAgICBib3JkZXItTGVmdDogc29saWQgNHB4IHRyYW5zcGFyZW50OworICAgICAgICAgICAgJi5leHRlbmRzIHsKKyAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogc29saWQgNHB4IEBtYWluX2NvbG9yX2M7CisgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZjsKKyAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC53LXNkYy1kaXN0cmlidXRlLXBhcmVudC1ibG9jayB7CisgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAbWFpbl9jb2xvcl9vOzsKKyAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4OworCisgICAgICAgICAgICAuc3RhdHVzLWljb24geworICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAmLmV4dGVuZHMgeworICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgOm5vdCguZGlzYWJsZS1ob3Zlcik6aG92ZXIgeworICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnRpdGxlLXNlY3Rpb24geworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgICAgICAgICAgICAgZmxleC1iYXNpczogMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnRpdGxlIHsKKyAgICAgICAgICAgICAgICAubF8xMl9tOworICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLnctc2RjLWRpc3RyaWJ1dGUtY29udGVudCB7CisgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnctc2RjLWRpc3RyaWJ1dGlvbi1hcnJvdy1idG4geworICAgICAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgICAgIC5hcnJvdy11cC1zbWFsbDsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDAgNnB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLmV4dGVuZHMudy1zZGMtZGlzdHJpYnV0aW9uLWFycm93LWJ0biB7CisgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOworICAgICAgICAgICAgICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC53LXNkYy1kaXN0cmlidXRlLXJvdyB7CisgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKworICAgICAgICAgICAgICAgIC53LXNkYy1kaXN0cmlidXRlLXJvdy1jb250ZW50IHsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAxNXB4IDMxcHggMTBweCAwOworICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgICAgICAgICAgLnctc2RjLWRpc3RyaWJ1dGUtc3RhdHVzLWJsb2NrIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCBAbWFpbl9jb2xvcl9vOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC5pdGVtLTEgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC5pdGVtLTIgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC5pdGVtLTMgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC5pdGVtLTQgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC5pdGVtLTUgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAudy1zZGMtZGlzdHJpYnV0ZS1zdGF0dXMtYmxvY2sgeworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisgICAgICAgICAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDVweDsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHggNXB4IDAgNXB4OzsKKyAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgICAgICBkaXYgeworICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBtYWluX2NvbG9yX287CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAgMTJweDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAubGluayB7CisgICAgICAgICAgICAgICAgICAgIC5hXzE0X207CisgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgJjpob3ZlcnsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgLmJfMTRfbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwYW4geworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAycHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLmRlcGxveWVkIHsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgICAgICAgICAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgICAgICAgICAuc3VjY2Vzcy1jaXJjbGUtc21hbGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLmVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAgLnFfMTRfbTsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgICAgICAgICAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgICAgICAgICAuZXJyb3ItaWNvbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAuc3RhdHVzLWl0ZW0tMSB7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC5zdGF0dXMtaXRlbS02IHsKKyAgICAgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAudy1zZGMtZGlzdHJpYnV0ZS1jb21wb25lbnRzLWJsb2NrIHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiA1cHg7CisgICAgICAgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworCisgICAgICAgICAgICAgICAgbGkgeworICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDVweCAycHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLm9tZi1jb21wb25lbnQtcm93IHsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcl9mOworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMCAzMHB4OworICAgICAgICAgICAgICAgICAgICAmLmV4dGVuZHMgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAwOworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLUxlZnQ6IHNvbGlkIDRweCBAbWFpbl9jb2xvcl9jOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAudy1zZGMtZGlzdHJpYnV0ZS1zdGF0dXMtYmxvY2sgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA1cHg7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAuYmx1ZS1mb250IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hXzE2X207CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRsdl9jb2xvcl91OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnctc2RjLWRpc3RyaWJ1dGUtb21mQ29tcG9uZW50LWJsb2NrIHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDAgMzBweDsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiA4cHggMTBweDsKKyAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Y7CisKKyAgICAgICAgICAgICAgICAub21mQ29tcG9uZW50LXRhYmxlLWhlYWQgeworICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdTsKKyAgICAgICAgICAgICAgICAgICAgLnRpdGxlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDZweCAxMHB4OworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Y7CisgICAgICAgICAgICAgICAgICAgICAgICAmOmZpcnN0LWNoaWxkIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAub21mQ29tcG9uZW50LXRhYmxlLXJvdyB7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Y7CisgICAgICAgICAgICAgICAgICAgICYucm93LTAgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAudy1zZGMtZGlzdHJpYnV0ZS1jZWxsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICY6bGFzdC1jaGlsZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcl9mOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgJi5pdGVtLTUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tXzE0X207CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAuZGlzdHJpYnV0aW9uLXVybCB7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAudy1zZGMtZGlzdHJpYnV0ZS1yb3cuZXh0ZW5kcyB7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlci1MZWZ0OiBzb2xpZCA0cHggQG1haW5fY29sb3JfYzsKKyAgICAgICAgICAgICAgICAgICAgLml0ZW0tMSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC5pdGVtLTEgeworICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAuaXRlbS0yIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwJTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAuaXRlbS0zIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI0JTsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAuaXRlbS00IHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE4JTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAuaXRlbS01IHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE4JTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC53LXNkYy1kaXN0cmlidXRlLXVybC1ibG9jayB7CisKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CisgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZjsKKyAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcl9mOworICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgICAgICAgIGxpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDMwcHg7CisgICAgICAgICAgICAgICAgICAgICAgICAubV8xMl9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9nZW5lcmFsL2dlbmVyYWwtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZ2VuZXJhbC9nZW5lcmFsLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMzY0OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZ2VuZXJhbC9nZW5lcmFsLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwzNzkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworCisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBSZXNvdXJjZSA9IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZTsKKyAgICBpbXBvcnQgSVN1YkNhdGVnb3J5ID0gU2RjLk1vZGVscy5JU3ViQ2F0ZWdvcnk7CisgICAgaW1wb3J0IElNYWluQ2F0ZWdvcnkgPSBTZGMuTW9kZWxzLklNYWluQ2F0ZWdvcnk7CisgICAgaW1wb3J0IFJlc291cmNlVHlwZSA9IFNkYy5VdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlOworCisgICAgZXhwb3J0IGNsYXNzIFZhbGlkYXRpb24geworICAgICAgICB2YWxpZGF0aW9uUGF0dGVybjpSZWdFeHA7CisgICAgICAgIGNvbnRhY3RJZFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cDsKKyAgICAgICAgdGFnVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwOworICAgICAgICB2ZW5kb3JWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHA7CisgICAgICAgIGNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHA7CisgICAgICAgIHByb2plY3RDb2RlVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwOworICAgIH0KKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUdlbmVyYWxTY29wZSBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIHZhbGlkYXRpb246VmFsaWRhdGlvbjsKKyAgICAgICAgZWRpdEZvcm06bmcuSUZvcm1Db250cm9sbGVyOworICAgICAgICBjYXRlZ29yaWVzOiBBcnJheTxJTWFpbkNhdGVnb3J5PjsKKyAgICAgICAgbGF0ZXN0Q2F0ZWdvcnlJZDogc3RyaW5nOworICAgICAgICBsYXRlc3RWZW5kb3JOYW1lOiBzdHJpbmc7CisgICAgICAgIGltcG9ydGVkRmlsZUV4dGVuc2lvbjphbnk7CisgICAgICAgIGlzQ3JlYXRlOmJvb2xlYW47CisgICAgICAgIGlzU2hvd0ZpbGVCcm93c2U6Ym9vbGVhbjsKKyAgICAgICAgaXNTaG93T25ib2FyZGluZ1NlbGVjdGlvbkJyb3dzZTpib29sZWFuOworICAgICAgICBpbXBvcnRlZFRvc2NhQnJvd3NlRmlsZVRleHQ6c3RyaW5nOworICAgICAgICBpbXBvcnRDc2FyUHJvZ3Jlc3NLZXk6c3RyaW5nOworICAgICAgICBicm93c2VGaWxlTGFiZWw6c3RyaW5nOworCisKKyAgICAgICAgb25Ub3NjYUZpbGVDaGFuZ2UoKTp2b2lkCisgICAgICAgIHZhbGlkYXRlRmllbGQoZmllbGQ6YW55KTpib29sZWFuOworICAgICAgICB2YWxpZGF0ZU5hbWUoaXNJbml0OmJvb2xlYW4pOiB2b2lkOworICAgICAgICBjYWxjdWxhdGVVbmlxdWUobWFpbkNhdGVnb3J5OnN0cmluZywgc3ViQ2F0ZWdvcnk6c3RyaW5nKTpzdHJpbmc7IC8vIEJ1aWxkIHVuaXF1ZSBzdHJpbmcgZnJvbSBtYWluIGFuZCBzdWIgY2F0ZWdvcnkKKyAgICAgICAgb25WZW5kb3JOYW1lQ2hhbmdlKG9sZFZlbmRvck5hbWU6c3RyaW5nKTogdm9pZDsKKyAgICAgICAgY29udmVydENhdGVnb3J5U3RyaW5nVG9PbmVBcnJheShjYXRlZ29yeTpzdHJpbmcsIHN1YmNhdGVnb3J5OnN0cmluZyk6QXJyYXk8TW9kZWxzLklNYWluQ2F0ZWdvcnk+OworICAgICAgICBvbkNhdGVnb3J5Q2hhbmdlKCk6dm9pZDsKKyAgICAgICAgb3Blbk9uQm9hcmRpbmdNb2RhbCgpOnZvaWQ7CisgICAgICAgIGluaXRDYXRlZ29yZWlzKCk6dm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgR2VuZXJhbFZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdDb250YWN0SWRWYWxpZGF0aW9uUGF0dGVybicsCisgICAgICAgICAgICAnVGFnVmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ1ZlbmRvclZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICdDb21tZW50VmFsaWRhdGlvblBhdHRlcm4nLAorICAgICAgICAgICAgJ1ZhbGlkYXRpb25VdGlscycsCisgICAgICAgICAgICAnc2RjQ29uZmlnJywKKyAgICAgICAgICAgICdQcm9qZWN0Q29kZVZhbGlkYXRpb25QYXR0ZXJuJywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInLAorICAgICAgICAgICAgJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJywKKyAgICAgICAgICAgICdOb3RpZmljYXRpb24nLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5Qcm9ncmVzc1NlcnZpY2UnLAorICAgICAgICAgICAgJyRpbnRlcnZhbCcsCisgICAgICAgICAgICAnJGZpbHRlcicsCisgICAgICAgICAgICAnJHRpbWVvdXQnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUdlbmVyYWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6U2VydmljZXMuQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb250YWN0SWRWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVGFnVmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZlbmRvclZhbGlkYXRpb25QYXR0ZXJuOlJlZ0V4cCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb21tZW50VmFsaWRhdGlvblBhdHRlcm46UmVnRXhwLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIFZhbGlkYXRpb25VdGlsczpTZGMuVXRpbHMuVmFsaWRhdGlvblV0aWxzLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgUHJvamVjdENvZGVWYWxpZGF0aW9uUGF0dGVybjpSZWdFeHAsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHN0YXRlOm5nLnVpLklTdGF0ZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTW9kYWxzSGFuZGxlcjogU2RjLlV0aWxzLk1vZGFsc0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgRXZlbnRMaXN0ZW5lclNlcnZpY2U6U2VydmljZXMuRXZlbnRMaXN0ZW5lclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTm90aWZpY2F0aW9uOmFueSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBwcm9ncmVzc1NlcnZpY2U6U2RjLlNlcnZpY2VzLlByb2dyZXNzU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkICRpbnRlcnZhbDphbnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkdGltZW91dDpuZy5JVGltZW91dFNlcnZpY2UKKyAgICAgICAgICAgICl7CisKKyAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJUb1N1Y2Nlc3NTYXZlRXZlbnQoKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlVmFsaWRhdGlvbigpOworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGVNZXRob2RzKCk7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlU2VsZWN0ZWRNZW51SXRlbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWdpc3RlclRvU3VjY2Vzc1NhdmVFdmVudCA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdG8gc2F2ZSBzdWNjZXNzIHRvIHNob3cgbm90aWZpY2F0aW9uIHRvIHVzZXIuCisgICAgICAgICAgICB0aGlzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXJDYWxsYmFjayhVdGlscy5Db25zdGFudHMuRVZFTlRTLk9OX1dPUktTUEFDRV9TQVZFX0JVVFRPTl9TVUNDRVNTLCB0aGlzLnNob3dTdWNjZXNzTm90aWZpY2F0aW9uTWVzc2FnZSk7CisKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHNob3dTdWNjZXNzTm90aWZpY2F0aW9uTWVzc2FnZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBpbXBvcnQgQ1NBUi4gTm90aWZ5IHVzZXIgd2hlbiBpbXBvcnQgVkYgd2FzIGZpbmlzaGVkLgorICAgICAgICAgICAgdGhpcy5Ob3RpZmljYXRpb24uc3VjY2Vzcyh7CisgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiSU1QT1JUX1ZGX01FU1NBR0VfQ1JFQVRFX0ZJTklTSEVEX0RFU0NSSVBUSU9OIiksCisgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIklNUE9SVF9WRl9NRVNTQUdFX0NSRUFURV9GSU5JU0hFRF9USVRMRSIpCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy9zZXQgdGhlIGZvcm0gUHJpc3RpbmUgYWZ0ZXIgc2F2ZSB0byByZXNldCB0aGUgdW5zYXZlZCBjaGFuZ2VzICh3aGl0IGZvciBkb20gIHJlbG9hZCkKKyAgICAgICAgICAgIHRoaXMuJHRpbWVvdXQoKCk9PiB7CisgICAgICAgICAgICAgICAgaWYodGhpcy4kc2NvcGUuZWRpdEZvcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZWRpdEZvcm0uJHNldFByaXN0aW5lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgNTAwKTsKKworICAgICAgICB9OworCisKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZVZhbGlkYXRpb24gPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb24gPSBuZXcgVmFsaWRhdGlvbigpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGlvbi52YWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuVmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0aW9uLmNvbnRhY3RJZFZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Db250YWN0SWRWYWxpZGF0aW9uUGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZhbGlkYXRpb24udGFnVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLlRhZ1ZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGlvbi52ZW5kb3JWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuVmVuZG9yVmFsaWRhdGlvblBhdHRlcm47CisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0aW9uLmNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybiA9IHRoaXMuQ29tbWVudFZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmFsaWRhdGlvbi5wcm9qZWN0Q29kZVZhbGlkYXRpb25QYXR0ZXJuID0gdGhpcy5Qcm9qZWN0Q29kZVZhbGlkYXRpb25QYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIHRvIGNoYW5nZSB0aGUgY3NhciB2ZXJzaW9uCisgICAgICAgICAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0KFV0aWxzLkNvbnN0YW50cy5DSEFOR0VfQ09NUE9ORU5UX0NTQVJfVkVSU0lPTl9GTEFHKSkgeworICAgICAgICAgICAgICAgICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5jc2FyVmVyc2lvbiA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldChVdGlscy5Db25zdGFudHMuQ0hBTkdFX0NPTVBPTkVOVF9DU0FSX1ZFUlNJT05fRkxBRyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmltcG9ydGVkVG9zY2FCcm93c2VGaWxlVGV4dCA9IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5uYW1lICsgIiAoIiArICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5jc2FyVmVyc2lvbiArICIpIjsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmltcG9ydENzYXJQcm9ncmVzc0tleSA9ICJpbXBvcnRDc2FyUHJvZ3Jlc3NLZXkiOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYnJvd3NlRmlsZUxhYmVsID0gdGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSAmJiAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkucmVzb3VyY2VUeXBlPT09UmVzb3VyY2VUeXBlLlZGPyAiVXBsb2FkIGZpbGUiIDogIlVwbG9hZCBWRkMiOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucHJvZ3Jlc3NTZXJ2aWNlID0gdGhpcy5wcm9ncmVzc1NlcnZpY2U7CisKKyAgICAgICAgICAgIC8vIFdvcmthcm91bmQgdG8gc2hvcnQgdmVuZG9yIG5hbWUgdG8gMjUgY2hhcnMKKyAgICAgICAgICAgIC8vIG9uYm9hcmRpbmcgc2VuZCAyNyBjaGFycywgYW5kIHRoZSB2YWxpZGF0aW9uIHBhdHRlcm4gaXMgMjUgY2hhcnMuCisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50LnZlbmRvck5hbWUpeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC52ZW5kb3JOYW1lID0gdGhpcy4kc2NvcGUuY29tcG9uZW50LnZlbmRvck5hbWUuc3Vic3RyKDAsIDI1KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5pdCBVSU1vZGVsCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudGFncyA9IF8ud2l0aG91dCh0aGlzLiRzY29wZS5jb21wb25lbnQudGFncywgdGhpcy4kc2NvcGUuY29tcG9uZW50Lm5hbWUpOworCisgICAgICAgICAgICAvLyBJbml0IGNhdGVnb3JpZXMKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmluaXRDYXRlZ29yZWlzKCk7CisKKyAgICAgICAgICAgIC8vIEluaXQgdGhlIGRlY2lzaW9uIGlmIHRvIHNob3cgZmlsZSBicm93c2UuCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1Nob3dGaWxlQnJvd3NlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSl7CisgICAgICAgICAgICAgICAgbGV0IHJlc291cmNlOlNkYy5Nb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZSA9IDxTZGMuTW9kZWxzLkNvbXBvbmVudHMuUmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50OworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc291cmNlLm5hbWUgKyAiOiAiICsgcmVzb3VyY2UuY3NhclVVSUQpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5pbXBvcnRlZEZpbGUpeyAvLyBDb21wb25lbnQgaGFzIGltcG9ydGVkIGZpbGUuCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzU2hvd0ZpbGVCcm93c2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuaXNFZGl0TW9kZSgpICYmIHJlc291cmNlLnJlc291cmNlVHlwZT09IFJlc291cmNlVHlwZS5WRiAmJiAhcmVzb3VyY2UuY3NhclVVSUQpeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1Nob3dGaWxlQnJvd3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBJbml0IHRoZSBkZWNpc2lvbiBpZiB0byBzaG93IG9uYm9hcmRpbmcKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzU2hvd09uYm9hcmRpbmdTZWxlY3Rpb25Ccm93c2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNFZGl0TW9kZSgpICYmCisgICAgICAgICAgICAgICAgKDxSZXNvdXJjZT50aGlzLiRzY29wZS5jb21wb25lbnQpLnJlc291cmNlVHlwZT09IFJlc291cmNlVHlwZS5WRiAmJgorICAgICAgICAgICAgICAgICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5jc2FyVVVJRCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1Nob3dPbmJvYXJkaW5nU2VsZWN0aW9uQnJvd3NlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9pbml0IGZpbGUgZXh0ZW5zaW9ucyBiYXNlZCBvbiB0aGUgZmlsZSB0aGF0IHdhcyBpbXBvcnRlZC4KKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5pbXBvcnRlZEZpbGUpeworICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZTpzdHJpbmcgPSAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuaW1wb3J0ZWRGaWxlLmZpbGVuYW1lOworICAgICAgICAgICAgICAgIGxldCBmaWxlRXh0ZW5zaW9uOnN0cmluZyAgPSBmaWxlTmFtZS5zcGxpdCgiLiIpLnBvcCgpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnNkY0NvbmZpZy5jc2FyRmlsZUV4dGVuc2lvbi5pbmRleE9mKGZpbGVFeHRlbnNpb24udG9Mb3dlckNhc2UoKSkgIT09IC0xKXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaW1wb3J0ZWRGaWxlRXh0ZW5zaW9uID0gdGhpcy5zZGNDb25maWcuY3NhckZpbGVFeHRlbnNpb247CisgICAgICAgICAgICAgICAgICAgICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5pbXBvcnRlZEZpbGUuZmlsZXR5cGU9ImNzYXIiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZGNDb25maWcudG9zY2FGaWxlRXh0ZW5zaW9uLmluZGV4T2YoZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpeworICAgICAgICAgICAgICAgICAgICAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuaW1wb3J0ZWRGaWxlLmZpbGV0eXBlPSJ5YW1sIjsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaW1wb3J0ZWRGaWxlRXh0ZW5zaW9uID0gdGhpcy5zZGNDb25maWcudG9zY2FGaWxlRXh0ZW5zaW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuJHNjb3BlLmlzRWRpdE1vZGUoKSYmICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5yZXNvdXJjZVR5cGUgPT09IFJlc291cmNlVHlwZS5WRil7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaW1wb3J0ZWRGaWxlRXh0ZW5zaW9uID0gdGhpcy5zZGNDb25maWcuY3NhckZpbGVFeHRlbnNpb247CisgICAgICAgICAgICAgICAgLy8oPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuaW1wb3J0ZWRGaWxlLmZpbGV0eXBlPSJjc2FyIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0cnVlKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2FsY3VsYXRlVW5pcXVlID0gKG1haW5DYXRlZ29yeTpzdHJpbmcsIHN1YkNhdGVnb3J5OnN0cmluZyk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdW5pcXVlSWQ6c3RyaW5nID0gbWFpbkNhdGVnb3J5OworICAgICAgICAgICAgICAgIGlmIChzdWJDYXRlZ29yeSkgeworICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZCArPSAiXyNfIiArIHN1YkNhdGVnb3J5OyAvLyBTZXQgdGhlIHNlbGVjdCBjYXRlZ29yeSBjb21ib2JveCB0byBzaG93IHRoZSBzZWxlY3RlZCBjYXRlZ29yeS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZUlkOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy9UT0RPIHJlbW92ZSB0aGlzIGFmdGVyIGhhbmRsaW5nIGNvbnRhY3QgaW4gVUkKKyAgICAgICAgICAgIGlmKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Byb2R1Y3QoKSAmJiB0aGlzLiRzY29wZS5pc0NyZWF0ZU1vZGUoKSl7CisgICAgICAgICAgICAgICAgKDxNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0PnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuY29udGFjdHMgPSBbXTsKKyAgICAgICAgICAgICAgICAoPE1vZGVscy5Db21wb25lbnRzLlByb2R1Y3Q+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5jb250YWN0cy5wdXNoKHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgidXNlciIpLnVzZXJJZCk7CisgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLiRzY29wZS5pc0NyZWF0ZU1vZGUoKSl7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmNvbnRhY3RJZCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgidXNlciIpLnVzZXJJZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisgICAgICAgIC8vIENvbnZlcnQgY2F0ZWdvcnkgc3RyaW5nIE1haW5DYXRlZ29yeV8jX1N1YkNhdGVnb3J5IHRvIEFycmF5IHdpdGggb25lIGl0ZW0gKGxpa2UgdGhlIHNlcnZlciBleGNlcHQpCisgICAgICAgIHByaXZhdGUgY29udmVydENhdGVnb3J5U3RyaW5nVG9PbmVBcnJheSA9ICgpOkFycmF5PE1vZGVscy5JTWFpbkNhdGVnb3J5PiA9PiB7CisgICAgICAgICAgICBsZXQgdG1wID0gdGhpcy4kc2NvcGUuY29tcG9uZW50LnNlbGVjdGVkQ2F0ZWdvcnkuc3BsaXQoIl8jXyIpOworICAgICAgICAgICAgbGV0IG1haW5DYXRlZ29yeSA9IHRtcFswXTsKKyAgICAgICAgICAgIGxldCBzdWJDYXRlZ29yeSA9IHRtcFsxXTsKKworICAgICAgICAgICAgLy8gRmluZCB0aGUgc2VsZWN0ZWQgY2F0ZWdvcnkgYW5kIGFkZCB0aGUgcmVsZXZhbnQgc3ViIGNhdGVnb3J5LgorICAgICAgICAgICAgbGV0IHNlbGVjdGVkTWFpbkNhdGVnb3J5OklNYWluQ2F0ZWdvcnkgPSA8TW9kZWxzLklNYWluQ2F0ZWdvcnk+Xy5maW5kKHRoaXMuJHNjb3BlLmNhdGVnb3JpZXMsIGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bIm5hbWUiXSA9PT0gbWFpbkNhdGVnb3J5OworCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbGV0IG1haW5DYXRlZ29yeUNsb25lID0gYW5ndWxhci5jb3B5KHNlbGVjdGVkTWFpbkNhdGVnb3J5KTsKKyAgICAgICAgICAgIGlmIChzdWJDYXRlZ29yeSkgeworICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFN1YmNhdGVnb3J5ID0gPE1vZGVscy5JU3ViQ2F0ZWdvcnk+Xy5maW5kKHNlbGVjdGVkTWFpbkNhdGVnb3J5LnN1YmNhdGVnb3JpZXMsIGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtWyJuYW1lIl0gPT09IHN1YkNhdGVnb3J5OworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1haW5DYXRlZ29yeUNsb25lWydzdWJjYXRlZ29yaWVzJ10gPSBbYW5ndWxhci5jb3B5KHNlbGVjdGVkU3ViY2F0ZWdvcnkpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCB0bXBTZWxlY3RlZCA9IDxNb2RlbHMuSU1haW5DYXRlZ29yeT4gbWFpbkNhdGVnb3J5Q2xvbmU7CisKKyAgICAgICAgICAgIGxldCByZXN1bHQ6QXJyYXk8TW9kZWxzLklNYWluQ2F0ZWdvcnk+ID0gW107CisgICAgICAgICAgICByZXN1bHQucHVzaCh0bXBTZWxlY3RlZCk7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSB1cGRhdGVDb21wb25lbnROYW1lSW5CcmVhZGNydW1icyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgLy91cGRhdGUgYnJlYWRjcnVtIGFmdGVyIGNoYW5naW5nIG5hbWUKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmJyZWFkY3J1bWJzTW9kZWxbMV0udXBkYXRlU2VsZWN0ZWRNZW51SXRlbVRleHQodGhpcy4kc2NvcGUuY29tcG9uZW50LmdldENvbXBvbmVudFN1YlR5cGUoKSArICc6ICcgKyB0aGlzLiRzY29wZS5jb21wb25lbnQubmFtZSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVNZW51Q29tcG9uZW50TmFtZSh0aGlzLiRzY29wZS5jb21wb25lbnQubmFtZSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGVNZXRob2RzID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmluaXRDYXRlZ29yZWlzID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmNvbXBvbmVudFR5cGUgPT09IFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlJFU09VUkNFKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNhdGVnb3JpZXMgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ3Jlc291cmNlQ2F0ZWdvcmllcycpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnRUeXBlID09PSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5TRVJWSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNhdGVnb3JpZXMgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ3NlcnZpY2VDYXRlZ29yaWVzJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0ZUZpZWxkID0gKGZpZWxkOmFueSk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLiRkaXJ0eSAmJiBmaWVsZC4kaW52YWxpZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub3Blbk9uQm9hcmRpbmdNb2RhbD0oKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgY3NhclVVSUQgPSAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuY3NhclVVSUQ7CisgICAgICAgICAgICAgICAgdGhpcy5Nb2RhbHNIYW5kbGVyLm9wZW5PbmJvYWRyZGluZ01vZGFsKCdVcGRhdGUnLCBjc2FyVVVJRCkudGhlbigoKT0+eworICAgICAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS51cGxvYWRGaWxlQ2hhbmdlZEluR2VuZXJhbFRhYigpOworICAgICAgICAgICAgICAgIH0sICgpPT57CisgICAgICAgICAgICAgICAgICAgIC8vIEVSUk9SCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0ZU5hbWUgPSAoaXNJbml0OmJvb2xlYW4pOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChpc0luaXQgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICBpc0luaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5uYW1lOworICAgICAgICAgICAgICAgIGlmICghbmFtZSB8fCBuYW1lID09PSAiIikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuZWRpdEZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuJHNjb3BlLmVkaXRGb3JtWyJjb21wb25lbnROYW1lIl0KKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuJHNjb3BlLmVkaXRGb3JtWyJjb21wb25lbnROYW1lIl0uJGVycm9yKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBlcnJvciBuYW1lIGFscmVhZHkgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0Rm9ybVsiY29tcG9uZW50TmFtZSJdLiRzZXRWYWxpZGl0eSgnbmFtZUV4aXN0JywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PworICAgICAgICAgICAgICAgIGxldCBzdWJ0eXBlOnN0cmluZyA9IFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRUeXBlLlJFU09VUkNFID09IHRoaXMuJHNjb3BlLmNvbXBvbmVudFR5cGUgPyB0aGlzLiRzY29wZS5jb21wb25lbnQuZ2V0Q29tcG9uZW50U3ViVHlwZSgpIDogdW5kZWZpbmVkOworCisgICAgICAgICAgICAgICAgbGV0IG9uRmFpbGVkID0gKHJlc3BvbnNlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5pbmZvKCdvbkZhaWxkJywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKHZhbGlkYXRpb246TW9kZWxzLklWYWxpZGF0ZSkgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5lZGl0Rm9ybVsiY29tcG9uZW50TmFtZSJdLiRzZXRWYWxpZGl0eSgnbmFtZUV4aXN0JywgdmFsaWRhdGlvbi5pc1ZhbGlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvbi5pc1ZhbGlkKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIGJyZWFkY3J1bWIgYWZ0ZXIgY2hhbmdpbmcgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnROYW1lSW5CcmVhZGNydW1icygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGlmIChpc0luaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBwYWdlIGlzIGluaXQgYWZ0ZXIgdXBkYXRlCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQubmFtZSAhPT0gdGhpcy4kc2NvcGUub3JpZ2luQ29tcG9uZW50Lm5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuJHNjb3BlLmNvbXBvbmVudFR5cGU9PT1VdGlscy5Db25zdGFudHMuQ29tcG9uZW50VHlwZS5SRVNPVVJDRSAmJiAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuY3NhclVVSUQhPT11bmRlZmluZWQpCisgICAgICAgICAgICAgICAgICAgICAgICApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC52YWxpZGF0ZU5hbWUobmFtZSwgc3VidHlwZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpbmcgb24gY2hhbmdlIChoYXMgZGVib3VuY2UpCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5lZGl0Rm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy4kc2NvcGUuZWRpdEZvcm1bImNvbXBvbmVudE5hbWUiXQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy4kc2NvcGUuZWRpdEZvcm1bImNvbXBvbmVudE5hbWUiXS4kZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICF0aGlzLiRzY29wZS5lZGl0Rm9ybVsiY29tcG9uZW50TmFtZSJdLiRlcnJvci5wYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLiRzY29wZS5jb21wb25lbnQubmFtZSAhPT0gdGhpcy4kc2NvcGUub3JpZ2luQ29tcG9uZW50Lm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLiRzY29wZS5jb21wb25lbnRUeXBlPT09VXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFR5cGUuUkVTT1VSQ0UgJiYgKDxSZXNvdXJjZT50aGlzLiRzY29wZS5jb21wb25lbnQpLmNzYXJVVUlEIT09dW5kZWZpbmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudmFsaWRhdGVOYW1lKG5hbWUsIHN1YnR5cGUpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50Lm5hbWUgPT09IHRoaXMuJHNjb3BlLm9yaWdpbkNvbXBvbmVudC5uYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmVkaXRGb3JtWyJjb21wb25lbnROYW1lIl0uJHNldFZhbGlkaXR5KCduYW1lRXhpc3QnLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2NvbXBvbmVudC5uYW1lJywgKG5ld0RhdGE6YW55KTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS52YWxpZGF0ZU5hbWUoZmFsc2UpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUgcGFyZW50IGlmIHRoaXMgc3RlcCB2YWxpZCBvciBub3QuCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2goImVkaXRGb3JtLiR2YWxpZCIsIChuZXdWYWwsIG9sZFZhbCkgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUobmV3VmFsKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS4kd2F0Y2goImVkaXRGb3JtLiRkaXJ0eSIsIChuZXdWYWwsIG9sZFZhbCkgPT4geworICAgICAgICAgICAgICAgIGlmIChuZXdWYWwhPT1vbGRWYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuY3VycmVudC5kYXRhLnVuc2F2ZWRDaGFuZ2VzID0gbmV3VmFsICYmICF0aGlzLiRzY29wZS5pc0NyZWF0ZU1vZGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25DYXRlZ29yeUNoYW5nZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jYXRlZ29yaWVzID0gdGhpcy5jb252ZXJ0Q2F0ZWdvcnlTdHJpbmdUb09uZUFycmF5KCk7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50Lmljb24gPSBVdGlscy5Db25zdGFudHMuREVGQVVMVF9JQ09OOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25WZW5kb3JOYW1lQ2hhbmdlID0gKG9sZFZlbmRvck5hbWU6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50Lmljb24gPT09IG9sZFZlbmRvck5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50Lmljb24gPSBVdGlscy5Db25zdGFudHMuREVGQVVMVF9JQ09OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9nZW5lcmFsL2dlbmVyYWwtdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9nZW5lcmFsL2dlbmVyYWwtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWQ0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2dlbmVyYWwvZ2VuZXJhbC12aWV3Lmh0bWwKQEAgLTAsMCArMSwzMDcgQEAKKzxkaXYgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0ic2RjLXdvcmtzcGFjZS1nZW5lcmFsLXN0ZXAiPgorCisgICAgPGZvcm0gbm92YWxpZGF0ZSBjbGFzcz0idy1zZGMtZm9ybSIgbmFtZT0iZWRpdEZvcm0iPgorCisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWZvcm0tc2VjdGlvbi1jb250YWluZXIiPgorCisgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTVBPUlQgVE9TQ0EgRklMRSBVU0lORyBCUk9XU0UgKEFMU08gVkZDKSAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgbmctaWY9ImlzU2hvd0ZpbGVCcm93c2UiPgorICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+e3ticm93c2VGaWxlTGFiZWx9fTwvbGFiZWw+CisgICAgICAgICAgICAgICAgPGZpbGUtdXBsb2FkIGlkPSJmaWxlVXBsb2FkRWxlbWVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtbmFtZT0iZmlsZUVsZW1lbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtZGlzYWJsZWQ9Int7IWlzQ3JlYXRlTW9kZSgpJiYhKGlzRWRpdE1vZGUoKSYmY29tcG9uZW50LnJlc291cmNlVHlwZT09J1ZGJyl9fSB8fCB7e2lzVmlld01vZGUoKX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLWVsZW1lbnQ9ImVkaXRGb3JtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLW1vZGVsPSJjb21wb25lbnQuaW1wb3J0ZWRGaWxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbi1maWxlLWNoYW5nZWQtaW4tZGlyZWN0aXZlPSJ1cGxvYWRGaWxlQ2hhbmdlZEluR2VuZXJhbFRhYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucz0ie3tpbXBvcnRlZEZpbGVFeHRlbnNpb259fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdC10ZXh0PSInQnJvd3NlIHRvIHNlbGVjdCBmaWxlJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IShpc0VkaXRNb2RlKCkmJmNvbXBvbmVudC5yZXNvdXJjZVR5cGU9PSdWRicpICYmICghZWRpdEZvcm0uZmlsZUVsZW1lbnQuJHZhbGlkIHx8ICFjb21wb25lbnQuaW1wb3J0ZWRGaWxlLmZpbGVuYW1lKX0iPjwvZmlsZS11cGxvYWQ+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU1QT1JUIFRPU0NBIEZJTEUgVVNJTkcgT05CT0FSRElORyAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgbmctaWY9ImlzU2hvd09uYm9hcmRpbmdTZWxlY3Rpb25Ccm93c2UiPgorICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+U2VsZWN0IFZTUDwvbGFiZWw+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1maWxlLXVwbG9hZCBpLXNkYy1mb3JtLWlucHV0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imktc2RjLWZvcm0tZmlsZS1uYW1lIiBkYXRhLXRlc3RzLWlkPSJmaWxlbmFtZSI+e3soZmlsZU1vZGVsICYmIGZpbGVNb2RlbC5maWxlbmFtZSkgfHwgaW1wb3J0ZWRUb3NjYUJyb3dzZUZpbGVUZXh0fX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0tZmlsZS11cGxvYWQteC1idG4iIG5nLWNsaWNrPSJjYW5jZWwoKSIgZGF0YS1uZy1zaG93PSJmaWxlTW9kZWwuZmlsZW5hbWUgJiYgZmlsZU1vZGVsLmZpbGVuYW1lIT09JycgJiYgZWxlbWVudERpc2FibGVkIT09J3RydWUnIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgbmFtZT0iZmlsZUVsZW1lbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS11cGxvYWQtYnJvd3NlLWJ0biIgZGF0YS1uZy1jbGljaz0ib3Blbk9uQm9hcmRpbmdNb2RhbCgpIiBkYXRhLXRlc3RzLWlkPSJicm93c2VCdXR0b24iPkJyb3dzZTwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yLWZpbGUtdXBsb2FkIiBkYXRhLW5nLXNob3c9ImNvbXBvbmVudC5pbXBvcnRlZEZpbGUgJiYgKCFlZGl0Rm9ybS5maWxlRWxlbWVudC4kdmFsaWQgfHwgIWNvbXBvbmVudC5pbXBvcnRlZEZpbGUuZmlsZW5hbWUpIj4KKyAgICAgICAgICAgICAgICA8IS0tIGVkaXRGb3JtLmZpbGVFbGVtZW50LiRlcnJvci5yZXF1aXJlZCA8PT0gQ2FuIG5vdCB1c2UgdGhpcywgYmVjYXVzZSB0aGUgYnJvd3NlIGlzIGRvbmUgZnJvbSBvdXRzaWRlIGZvciB0aGUgZmlyc3QgdGltZSAtLT4KKyAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSIhKGlzRWRpdE1vZGUoKSYmY29tcG9uZW50LnJlc291cmNlVHlwZT09J1ZGJykmJiFjb21wb25lbnQuaW1wb3J0ZWRGaWxlLmZpbGVuYW1lIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1RPU0NBX0ZJTEVfUkVRVUlSRUQiPjwvc3Bhbj48IS0tIFJlcXVpcmVkIC0tPgorICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmZpbGVFbGVtZW50LiRlcnJvci5tYXhzaXplIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0ZJTEVfU0laRSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmZpbGVFbGVtZW50LiRlcnJvci5maWxldHlwZSIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9WQUxJRF9UT1NDQV9FWFRFTlNJT05TIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J2V4dGVuc2lvbnMnOiAne3tpbXBvcnRlZEZpbGVFeHRlbnNpb259fScgfSI+PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmZpbGVFbGVtZW50LiRlcnJvci5lbXB0eUZpbGUiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9FTVBUWV9GSUxFIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElNUE9SVCBUT1NDQSBGSUxFIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbnMtd3JhcHBlciI+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisKKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOQU1FIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IHZhbGlkYXRlRmllbGQoZWRpdEZvcm0uY29tcG9uZW50TmFtZSl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5OYW1lPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29tcG9uZW50TmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaW5pdD0iaXNDcmVhdGVNb2RlKCkgJiYgdmFsaWRhdGVOYW1lKHRydWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9Int7Y29tcG9uZW50LmlzUHJvZHVjdCgpPycyNSc6JzUwJ319IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSJ7e2NvbXBvbmVudC5pc1Byb2R1Y3QoKT8nMjUnOic1MCd9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWlubGVuZ3RoPSJ7e2NvbXBvbmVudC5pc1Byb2R1Y3QoKT8nNCc6JzAnfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5sZW5ndGg9Int7Y29tcG9uZW50LmlzUHJvZHVjdCgpPyc0JzonMCd9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWw9ImNvbXBvbmVudC5uYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49InZhbGlkYXRpb24udmFsaWRhdGlvblBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJjb21wb25lbnQuaXNBbHJlYWR5Q2VydGlmaWVkKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1yZWFkb25seT0iaXNWaWV3TW9kZSgpIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJ2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLmNvbXBvbmVudE5hbWUpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNvbXBvbmVudE5hbWUuJGVycm9yLnJlcXVpcmVkIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX1JFU09VUkNFX05BTUVfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNvbXBvbmVudE5hbWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzUwJyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb21wb25lbnROYW1lLiRlcnJvci5taW5sZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NSU5fTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21pbic6ICc0JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5jb21wb25lbnROYW1lLiRlcnJvci5uYW1lRXhpc3QiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfTkFNRV9FWElTVFMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNvbXBvbmVudE5hbWUuJGVycm9yLnBhdHRlcm4iIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9TUEVDSUFMX0NIQVJTX05PVF9BTExPV0VEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGVUxMIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgPGRpdiBuZy1pZj0iY29tcG9uZW50LmlzUHJvZHVjdCgpIiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIiBkYXRhLW5nLWNsYXNzPSJ7J2Vycm9yJzogdmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5mdWxsTmFtZSl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5GdWxsIE5hbWU8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJmdWxsTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9Insndmlldy1tb2RlJzogaXNWaWV3TW9kZSgpfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJ2YWxpZGF0ZU5hbWUoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIxMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjEwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWlubGVuZ3RoPSI0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlubGVuZ3RoPSI0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iY29tcG9uZW50LmZ1bGxOYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXBhdHRlcm49InZhbGlkYXRpb24uY29tbWVudFZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0iZnVsbE5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXJlYWRvbmx5PSJpc1ZpZXdNb2RlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0uZnVsbE5hbWUpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmZ1bGxOYW1lLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9SRVNPVVJDRV9OQU1FX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5mdWxsTmFtZS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnNTAnIH0iPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmZ1bGxOYW1lLiRlcnJvci5taW5sZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NSU5fTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21pbic6ICc0JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5mdWxsTmFtZS4kZXJyb3IubmFtZUV4aXN0IiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX05BTUVfRVhJU1RTIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5mdWxsTmFtZS4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gTkFNRSAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERFU0NSSVBUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLmRlc2NyaXB0aW9uKX0iPgorICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Imktc2RjLWZvcm0tbGFiZWwgcmVxdWlyZWQiPkRlc2NyaXB0aW9uPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tYXhsZW5ndGg9IjEwMjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJjb21wb25lbnQuZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDUwMCB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJ2YWxpZGF0aW9uLmNvbW1lbnRWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iMTAyNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlc2NyaXB0aW9uIj48L3RleHRhcmVhPgorICAgICAgICAgICAgICAgICAgICA8IS0tIHBsYWNlaG9sZGVyPSJEZXNjcmlwdGlvbiBoZXJlLi4uIiAtLT4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJ2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLmRlc2NyaXB0aW9uKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfUkVTT1VSQ0VfREVTQ1JJUFRJT05fUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmRlc2NyaXB0aW9uLiRlcnJvci5tYXhsZW5ndGgiIHRyYW5zbGF0ZT0iVkFMSURBVElPTl9FUlJPUl9NQVhfTEVOR1RIIiB0cmFuc2xhdGUtdmFsdWVzPSJ7J21heCc6ICcxMDI0JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5kZXNjcmlwdGlvbi4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gREVTQ1JJUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDQVRFR09SSUVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLmNhdGVnb3J5KX0iCisgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWlmPSIhY29tcG9uZW50LmlzUHJvZHVjdCgpIj4KKyAgICAgICAgICAgICAgICAgICAgPGxvYWRlciBkYXRhLWRpc3BsYXk9IiFjYXRlZ29yaWVzICYmICFpbml0Q2F0ZWdvcmVpcygpIiByZWxhdGl2ZT0idHJ1ZSI+PC9sb2FkZXI+CisgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+Q2F0ZWdvcnk8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJpLXNkYy1mb3JtLXNlbGVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY2F0ZWdvcnkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2hhbmdlPSJvbkNhdGVnb3J5Q2hhbmdlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1kaXNhYmxlZD0iY29tcG9uZW50LmlzQWxyZWFkeUNlcnRpZmllZCgpIHx8IChjb21wb25lbnQuaXNDc2FyQ29tcG9uZW50KCkgJiYgY29tcG9uZW50LnNlbGVjdGVkQ2F0ZWdvcnkgJiYgY29tcG9uZW50LnNlbGVjdGVkQ2F0ZWdvcnkhPT0nJykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iY29tcG9uZW50LnNlbGVjdGVkQ2F0ZWdvcnkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ic2VsZWN0R2VuZXJhbENhdGVnb3J5IgorICAgICAgICAgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3QgY2F0ZWdvcnk8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBuZy1pZj0iY29tcG9uZW50LmlzUmVzb3VyY2UoKSIgZGF0YS1uZy1yZXBlYXQ9Im1haW5DYXRlZ29yeSBpbiBjYXRlZ29yaWVzIHwgb3JkZXJCeTpbJ25hbWUnXSIgbGFiZWw9Int7bWFpbkNhdGVnb3J5Lm5hbWV9fSIgZGF0YS10ZXN0cy1pZD0ie3ttYWluQ2F0ZWdvcnkubmFtZX19Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtbmctcmVwZWF0PSJzdWJDYXRlZ29yeSBpbiBtYWluQ2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyB0cmFjayBieSAkaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXNlbGVjdGVkPSJjb21wb25lbnQuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gY2FsY3VsYXRlVW5pcXVlKG1haW5DYXRlZ29yeS5uYW1lLHN1YkNhdGVnb3J5Lm5hbWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3tzdWJDYXRlZ29yeS5uYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ie3tjYWxjdWxhdGVVbmlxdWUobWFpbkNhdGVnb3J5Lm5hbWUsIHN1YkNhdGVnb3J5Lm5hbWUpfX0iPnt7c3ViQ2F0ZWdvcnkubmFtZX19CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIG5nLWlmPSJjb21wb25lbnQuaXNTZXJ2aWNlKCkiIGRhdGEtbmctcmVwZWF0PSJtYWluQ2F0ZWdvcnkgaW4gY2F0ZWdvcmllcyB8IG9yZGVyQnk6WyduYW1lJ10iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctc2VsZWN0ZWQ9ImNvbXBvbmVudC5zZWxlY3RlZENhdGVnb3J5PT09bWFpbkNhdGVnb3J5Lm5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ7e21haW5DYXRlZ29yeS5uYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7bWFpbkNhdGVnb3J5Lm5hbWV9fSI+e3ttYWluQ2F0ZWdvcnkubmFtZX19PC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0uY2F0ZWdvcnkpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNhdGVnb3J5LiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9DQVRFR09SWV9SRVFVSVJFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDQVRFR09SSUVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJPSkVDVCBDT0RFIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgIGRhdGEtbmctaWY9IiFjb21wb25lbnQuaXNSZXNvdXJjZSgpIgorICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IHZhbGlkYXRlRmllbGQoZWRpdEZvcm0ucHJvamVjdENvZGUpfSI+CisgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCIgdHJhbnNsYXRlPSJHRU5FUkFMX0xBQkVMX1BST0pFQ1RfQ09ERSI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IiB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbD0iY29tcG9uZW50LnByb2plY3RDb2RlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiA1MDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbWF4bGVuZ3RoPSIxMjgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwcm9qZWN0Q29kZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi5wcm9qZWN0Q29kZVZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSI1MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InByb2plY3RDb2RlIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1lcnJvciIgZGF0YS1uZy1zaG93PSJ2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLnByb2plY3RDb2RlKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5wcm9qZWN0Q29kZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfUFJPSkVDVF9DT0RFX1JFUVVJUkVEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS5wcm9qZWN0Q29kZS4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9QUk9KRUNUX0NPREVfTk9UX1ZBTElEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkVORE9SIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgPGRpdiBuZy1pZj0iY29tcG9uZW50LmlzUmVzb3VyY2UoKSIgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IHZhbGlkYXRlRmllbGQoZWRpdEZvcm0udmVuZG9yTmFtZSl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIHJlcXVpcmVkIj5WZW5kb3I8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJjb21wb25lbnQudmVuZG9yTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0ib2xkVmFsdWUgPSBjb21wb25lbnQudmVuZG9yTmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InZlbmRvck5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNoYW5nZT0ib25WZW5kb3JOYW1lQ2hhbmdlKG9sZFZhbHVlKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi52ZW5kb3JWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iMjUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJjb21wb25lbnQuaXNBbHJlYWR5Q2VydGlmaWVkKCkgfHwgKGNvbXBvbmVudC5pc0NzYXJDb21wb25lbnQoKSAmJiBjb21wb25lbnQudmVuZG9yTmFtZSAmJiBjb21wb25lbnQudmVuZG9yTmFtZSE9PScnKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InZlbmRvck5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0udmVuZG9yTmFtZSkiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0udmVuZG9yTmFtZS4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfVkVORE9SX05BTUVfUkVRVUlSRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLnZlbmRvck5hbWUuJGVycm9yLm1heGxlbmd0aCIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX01BWF9MRU5HVEgiIHRyYW5zbGF0ZS12YWx1ZXM9InsnbWF4JzogJzI1JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS52ZW5kb3JOYW1lLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkVORE9SIE5BTUUgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWRU5ET1IgUkVMRUFTRSAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICAgICAgICAgICAgICA8ZGl2IG5nLWlmPSJjb21wb25lbnQuaXNSZXNvdXJjZSgpIgorICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLnZlbmRvclJlbGVhc2UpfSI+CisgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaS1zZGMtZm9ybS1sYWJlbCByZXF1aXJlZCI+VmVuZG9yIFJlbGVhc2U8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiIHR5cGU9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJjb21wb25lbnQudmVuZG9yUmVsZWFzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1heGxlbmd0aD0iMjUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ2ZW5kb3JSZWxlYXNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJ2YWxpZGF0aW9uLnZlbmRvclZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctZGlzYWJsZWQ9ImNvbXBvbmVudC5pc0NzYXJDb21wb25lbnQoKSAmJiBjb21wb25lbnQudmVuZG9yUmVsZWFzZSAmJiBjb21wb25lbnQudmVuZG9yUmVsZWFzZSE9PScnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0idmVuZG9yUmVsZWFzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0idmFsaWRhdGVGaWVsZChlZGl0Rm9ybS52ZW5kb3JSZWxlYXNlKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS52ZW5kb3JSZWxlYXNlLiRlcnJvci5yZXF1aXJlZCIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9WRU5ET1JfUkVMRUFTRV9SRVFVSVJFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0udmVuZG9yUmVsZWFzZS4kZXJyb3IubWF4bGVuZ3RoIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfTUFYX0xFTkdUSCIgdHJhbnNsYXRlLXZhbHVlcz0ieydtYXgnOiAnMTI4JyB9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJlZGl0Rm9ybS52ZW5kb3JSZWxlYXNlLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9IlZBTElEQVRJT05fRVJST1JfU1BFQ0lBTF9DSEFSU19OT1RfQUxMT1dFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWRU5ET1IgUkVMRUFTRSAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworCisKKyAgICAgICAgICAgIDwvZGl2PjwhLS0gQ2xvc2Ugdy1zZGMtZm9ybS1jb2x1bW4gLS0+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1mb3JtLWNvbHVtbiI+CisKKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRVNPVVJDRSBUQUdTIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWZvcm0taXRlbSIgZGF0YS1uZy1jbGFzcz0ieydlcnJvcic6IHZhbGlkYXRlRmllbGQoZWRpdEZvcm0udGFncyl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIj5UYWdzPC9sYWJlbD4KKworICAgICAgICAgICAgICAgICAgICA8c2RjLXRhZ3MgZm9ybS1lbGVtZW50PSJlZGl0Rm9ybSIgZWxlbWVudC1uYW1lPSJ0YWdzIiBtYXgtdGFncz0iMjAiIGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0tdGFncyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1kaXNhYmxlZD0iaXNWaWV3TW9kZSgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFncz0iY29tcG9uZW50LnRhZ3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJ2YWxpZGF0aW9uLnRhZ1ZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbC10YWc9ImNvbXBvbmVudC5uYW1lIj48L3NkYy10YWdzPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWVycm9yIiBkYXRhLW5nLXNob3c9InZhbGlkYXRlRmllbGQoZWRpdEZvcm0udGFncykiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0udGFncy4kZXJyb3IucGF0dGVybiIgdHJhbnNsYXRlPSJWQUxJREFUSU9OX0VSUk9SX1NQRUNJQUxfQ0hBUlNfTk9UX0FMTE9XRUQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLnRhZ3MuJGVycm9yLm5hbWVFeGlzdCIgdHJhbnNsYXRlPSJORVdfU0VSVklDRV9SRVNPVVJDRV9FUlJPUl9UQUdfTkFNRV9FWElTVCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRVNPVVJDRSBUQUdTIC0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09OVEFDVCBJRCAtLS0tLS0tLS0tLS0tLS0tLS0tLT4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0iIGRhdGEtbmctY2xhc3M9InsnZXJyb3InOiB2YWxpZGF0ZUZpZWxkKGVkaXRGb3JtLmNvbnRhY3RJZCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsICIgZGF0YS1uZy1jbGFzcz0ieydyZXF1aXJlZCc6IWNvbXBvbmVudC5pc1Byb2R1Y3QoKX0iIHRyYW5zbGF0ZT0iR0VORVJBTF9MQUJFTF9DT05UQUNUX0lEIj48L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9Imktc2RjLWZvcm0taW5wdXQiIHR5cGU9InRleHQiIGRhdGEtbmctaWY9IiFjb21wb25lbnQuaXNQcm9kdWN0KCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJjb21wb25lbnQuY29udGFjdElkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXF1aXJlZD0iIWNvbXBvbmVudC5pc1Byb2R1Y3QoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImNvbnRhY3RJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcGF0dGVybj0idmFsaWRhdGlvbi5jb250YWN0SWRWYWxpZGF0aW9uUGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ieyBkZWJvdW5jZTogNTAwIH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ1c2VySWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9IjUwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpLXNkYy1mb3JtLWlucHV0IiB0eXBlPSJ0ZXh0IiBkYXRhLW5nLWlmPSJjb21wb25lbnQuaXNQcm9kdWN0KCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLW1vZGVsPSJjb21wb25lbnQuY29udGFjdHNbMF0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcXVpcmVkPSIhY29tcG9uZW50LmlzUHJvZHVjdCgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iY29udGFjdElkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1wYXR0ZXJuPSJ2YWxpZGF0aW9uLmNvbnRhY3RJZFZhbGlkYXRpb25QYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7IGRlYm91bmNlOiA1MDAgfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9InVzZXJJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD0iNTAiCisgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZXJyb3IiIGRhdGEtbmctc2hvdz0idmFsaWRhdGVGaWVsZChlZGl0Rm9ybS5jb250YWN0SWQpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImVkaXRGb3JtLmNvbnRhY3RJZC4kZXJyb3IucmVxdWlyZWQiIHRyYW5zbGF0ZT0iTkVXX1NFUlZJQ0VfUkVTT1VSQ0VfRVJST1JfQ09OVEFDVF9SRVFVSVJFRCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iZWRpdEZvcm0uY29udGFjdElkLiRlcnJvci5wYXR0ZXJuIiB0cmFuc2xhdGU9Ik5FV19TRVJWSUNFX1JFU09VUkNFX0VSUk9SX0NPTlRBQ1RfTk9UX1ZBTElEIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTlRBQ1QgSUQgLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKworICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gQ2xvc2Ugdy1zZGMtZm9ybS1jb2x1bW4gLS0+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICA8L2Rpdj48IS0tIENsb3NlIHctc2RjLWZvcm0tc2VjdGlvbi1jb250YWluZXIgLS0+CisKKyAgICA8L2Zvcm0+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9nZW5lcmFsL2dlbmVyYWwubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZ2VuZXJhbC9nZW5lcmFsLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2MWQwMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZ2VuZXJhbC9nZW5lcmFsLmxlc3MKQEAgLTAsMCArMSw2NCBAQAorLnNkYy13b3Jrc3BhY2UtZ2VuZXJhbC1zdGVwIHsKKworICAgIC53LXNkYy1mb3JtIHsKKyAgICAgICAgcGFkZGluZzogMDsKKworICAgICAgICAuaS1zZGMtZm9ybS1maWxlLXVwbG9hZHsKKyAgICAgICAgICAgIGlucHV0W3R5cGU9ImJ1dHRvbiJdIHsKKyAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICAgICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTApOworICAgICAgICAgICAgICAgIHdpZHRoOiAxMDBweDsKKyAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICAgICAgICAgICAgb3BhY2l0eTogMDsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICAgICAgcmlnaHQ6IDA7CisgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgICAgICAgICAgICAgdG9wOiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuZmlsZS11cGxvYWQtYnJvd3NlLWJ0biB7CisgICAgICAgICAgICAgICAgLm5vc2VsZWN0OworICAgICAgICAgICAgICAgIC5iZ19uOworICAgICAgICAgICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CisgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICAgICAgICAgIHotaW5kZXg6IDk5OTsKKyAgICAgICAgICAgICAgICB3aWR0aDogMTAwcHg7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAyOHB4OworICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKworICAgICAgICAgICAgICAgICYuZGlzYWJsZWQgeworICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLnctc2RjLWZvcm0tc2VjdGlvbi1jb250YWluZXIgeworICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICB9CisKKyAgICAgICAgLmktc2RjLWZvcm0taXRlbSB7CisgICAgICAgICAgICAmLnVwbG9hZCB7CisgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMDsKKyAgICAgICAgICAgICAgICB3aWR0aDogYXV0bzsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiAxMHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLnRlbXBsYXRlLWRlc2MgeworICAgICAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkIEBib3JkZXJfY29sb3JfZjsKKyAgICAgICAgICAgIGhlaWdodDogMTMwcHg7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgcGFkZGluZzogMTBweCA2cHggNnB4IDZweDsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CisgICAgICAgIH0KKworICAgICAgICAuc2RjLXRhZyAudGFnIHsKKyAgICAgICAgICAgIG1heC13aWR0aDogMjI1cHg7CisgICAgICAgIH0KKworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaWNvbnMvaWNvbnMtdmlldy1tb2RlbC50cyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaWNvbnMvaWNvbnMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTkxNjQxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pY29ucy9pY29ucy12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMTMxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiA0LzQvMjAxNi4KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElJY29uc1Njb3BlIGV4dGVuZHMgSVdvcmtzcGFjZVZpZXdNb2RlbFNjb3BlIHsKKyAgICAgICAgaWNvbnMgOiBBcnJheTxzdHJpbmc+OworICAgICAgICBpY29uU3ByaXRlOiBzdHJpbmc7CisgICAgICAgIHNldENvbXBvbmVudEljb24oaWNvblNyYzpzdHJpbmcpOiB2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBJY29uc1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5BdmFpbGFibGVJY29uc1NlcnZpY2UnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEZhY3RvcnknLAorICAgICAgICAgICAgJyRzdGF0ZScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJSWNvbnNTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhdmFpbGFibGVJY29uc1NlcnZpY2U6U2VydmljZXMuQXZhaWxhYmxlSWNvbnNTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEZhY3Rvcnk6U2RjLlV0aWxzLkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHN0YXRlOm5nLnVpLklTdGF0ZVNlcnZpY2UpIHsKKworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy5pbml0SWNvbnMoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZVNlbGVjdGVkTWVudUl0ZW0oKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmljb25TcHJpdGUgPSB0aGlzLiRzY29wZS5jb21wb25lbnQuaWNvblNwcml0ZTsKKworICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Jlc291cmNlKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmluaXRWZW5kb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdGlhbEljb246c3RyaW5nID0gdGhpcy4kc2NvcGUuY29tcG9uZW50Lmljb247CisgICAgICAgIHByaXZhdGUgaW5pdEljb25zID0gKCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgIC8vIEZvciBzdWJjYXRlZ29yaWVzIHRoYXQgd2hlcmUgY3JlYXRlZCBieSBhZG1pbiwgdGhlcmUgaXMgbm8gaWNvbnMKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmljb25zID0gbmV3IEFycmF5PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQuY2F0ZWdvcmllcyAmJiB0aGlzLiRzY29wZS5jb21wb25lbnQuY2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7CisKKyAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuY29tcG9uZW50LmNhdGVnb3JpZXMsIChjYXRlZ29yeTpNb2RlbHMuSU1haW5DYXRlZ29yeSk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeS5pY29ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaWNvbnMgPSB0aGlzLiRzY29wZS5pY29ucy5jb25jYXQoY2F0ZWdvcnkuaWNvbnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeS5zdWJjYXRlZ29yaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcywgKHN1YmNhdGVnb3J5Ok1vZGVscy5JU3ViQ2F0ZWdvcnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJjYXRlZ29yeS5pY29ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pY29ucyA9IHRoaXMuJHNjb3BlLmljb25zLmNvbmNhdChzdWJjYXRlZ29yeS5pY29ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Jlc291cmNlKCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgcmVzb3VyY2VUeXBlOnN0cmluZyA9IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRDb21wb25lbnRTdWJUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZSA9PT0gJ1ZMJykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pY29ucyA9IFsndmwnXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZSA9PT0gJ0NQJykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pY29ucyA9IFsnY3AnXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5pY29ucy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pY29ucyA9IHRoaXMuYXZhaWxhYmxlSWNvbnNTZXJ2aWNlLmdldEljb25zKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jb21wb25lbnRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vd2UgYWx3YXlzIGFkZCB0aGUgZGVmdWFsIGljb24gdG8gdGhlIGxpc3QKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmljb25zLnB1c2goJ2RlZmF1bHRpY29uJyk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0VmVuZG9yID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgdmVuZG9yczpBcnJheTxzdHJpbmc+ID0gdGhpcy5hdmFpbGFibGVJY29uc1NlcnZpY2UuZ2V0SWNvbnModGhpcy4kc2NvcGUuY29tcG9uZW50LmNvbXBvbmVudFR5cGUpLnNsaWNlKDUsIDE5KTsKKyAgICAgICAgICAgIGxldCB2ZW5kb3JOYW1lID0gdGhpcy4kc2NvcGUuY29tcG9uZW50LnZlbmRvck5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIGlmICgnYXQmdCcgPT09IHZlbmRvck5hbWUpIHsKKyAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lID0gJ2F0dCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJ25va2lhJyA9PT0gdmVuZG9yTmFtZSkgeworICAgICAgICAgICAgICAgIHZlbmRvck5hbWUgPSAnbm9raWFzaWVtZW5zJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IHZlbmRvcjpzdHJpbmcgPSBfLmZpbmQodmVuZG9ycywgKHZlbmRvcjpzdHJpbmcpPT4geworICAgICAgICAgICAgICAgIHJldHVybiB2ZW5kb3IucmVwbGFjZSgvW19dL2csICcnKS50b0xvd2VyQ2FzZSgpID09PSB2ZW5kb3JOYW1lOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICh2ZW5kb3IgJiYgdGhpcy4kc2NvcGUuaWNvbnMuaW5kZXhPZih2ZW5kb3IpID09PSAtMSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmljb25zLnB1c2godmVuZG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSgpOnZvaWQgeworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaWNvbnMgPSBbXTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICAvL2lmKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pY29uID09PSBVdGlscy5Db25zdGFudHMuREVGQVVMVF9JQ09OKXsKKyAgICAgICAgICAgIC8vICAgIC8vdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZShmYWxzZSk7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0Q29tcG9uZW50SWNvbiA9IChpY29uU3JjOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuY3VycmVudC5kYXRhLnVuc2F2ZWRDaGFuZ2VzID0gIXRoaXMuJHNjb3BlLmlzVmlld01vZGUoKSAmJiAoaWNvblNyYyAhPSB0aGlzLmluaXRpYWxJY29uKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQuaWNvbiA9IGljb25TcmM7CisgICAgICAgICAgICAgICAgLy8gdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pY29ucy9pY29ucy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2ljb25zL2ljb25zLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWMxNGUwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pY29ucy9pY29ucy12aWV3Lmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPGRpdiBjbGFzcz0id29ya3NwYWNlLWljb25zIj4KKworICAgIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9Inctc2RjLWZvcm0iIG5hbWU9Imljb25Gb3JtIj4KKyAgICAgICAgPGxhYmVsIGNsYXNzPSJpLXNkYy1mb3JtLWxhYmVsIGljb25zLWxhYmVsIHJlcXVpcmVkIj5JY29uczwvbGFiZWw+CisgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdGVkLWljb24tY29udGFpbmVyIiBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtLXN1Z2dlc3RlZC1pY29uIGxhcmdlIHNlbGVjdGVkLWljb24ge3tpY29uU3ByaXRlfX0ge3tjb21wb25lbnQuaWNvbn19IgorICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7ICdkaXNhYmxlJzogaXNWaWV3TW9kZSgpIH0iCisgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJjb21wb25lbnQuaWNvbiIKKyAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSd7e2NvbXBvbmVudC5pY29uIHwgdHJhbnNsYXRlfX0nCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGRhdGEtbmctY2xhc3M9Insndmlldy1tb2RlJzogaXNWaWV3TW9kZSgpfSIgY2xhc3M9Imljb25zLXRleHQiPlNlbGVjdCBvbmUgb2YgdGhlIGljb25zIGJlbG93IGZvciB0aGUgYXNzZXQ8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iaS1zZGMtZm9ybS1pdGVtIHN1Z2dlc3RlZC1pY29ucy1jb250YWluZXIiIGRhdGEtbmctY2xhc3M9Insndmlldy1tb2RlIG5vLXBvaW50ZXItZXZlbnRzJyA6IGlzVmlld01vZGUoKX0iPgorICAgICAgICAgICAgPGRpdiBjbGFzcyA9InN1Z2dlc3RlZC1pY29uLXdyYXBwZXIiIG5nLWNsYXNzPSJjb21wb25lbnQuaWNvbj09PSd7e2ljb25TcmN9fScgPyAnc2VsZWN0ZWQnIDogJycgIiAgZGF0YS1uZy1yZXBlYXQ9Imljb25TcmMgaW4gaWNvbnMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpLXNkYy1mb3JtLWl0ZW0tc3VnZ2VzdGVkLWljb24gbGFyZ2Uge3tpY29uU3ByaXRlfX0ge3tpY29uU3JjfX0iIGRhdGEtbmctY2xhc3M9ImNvbXBvbmVudC5pc0FscmVhZHlDZXJ0aWZpZWQoKSB8fCAgaXNWaWV3TW9kZSgpID8gJ2Rpc2FibGUnOidoYW5kJyIKKyAgICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJjb21wb25lbnQuaWNvbiIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7aWNvblNyY319IGljb25Cb3giCisgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSIhY29tcG9uZW50LmlzQWxyZWFkeUNlcnRpZmllZCgpICYmIHNldENvbXBvbmVudEljb24oaWNvblNyYykiCisgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9J3t7aWNvblNyYyB8IHRyYW5zbGF0ZX19JworICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9mb3JtPgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2ljb25zL2ljb25zLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2ljb25zL2ljb25zLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmOTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaWNvbnMvaWNvbnMubGVzcwpAQCAtMCwwICsxLDY1IEBACisud29ya3NwYWNlLWljb25zIHsKKworICAgIHdpZHRoOiA4OSU7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworCisgICAgLnctc2RjLWZvcm0geworICAgICAgICBwYWRkaW5nLXRvcDogMHB4OworICAgICAgICBwYWRkaW5nLWJvdHRvbTogIDBweDsKKyAgICAgICAgLnNlbGVjdGVkLWljb24tY29udGFpbmVyIHsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2ZjZmNmOworICAgICAgICAgICAgY2xlYXI6IGJvdGg7CisgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAzMHB4OworICAgICAgICAgICAgcGFkZGluZzogMnB4IDBweCA1cHggNXB4OworICAgICAgICAgICAgLnNlbGVjdGVkLWljb24geworICAgICAgICAgICAgICAgIG1hcmdpbjogOHB4IDVweCAwcHggNnB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLnN1Z2dlc3RlZC1pY29ucy1jb250YWluZXIgeworICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZmNmY2Y7CisgICAgICAgICAgICBjbGVhcjogYm90aDsKKyAgICAgICAgICAgIHBhZGRpbmc6IDJweCAwcHggNXB4IDVweDsKKyAgICAgICAgICAgIGhlaWdodDogMzQwcHg7CisgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwcHg7CisKKyAgICAgICAgICAgIC5zdWdnZXN0ZWQtaWNvbi13cmFwcGVyIHsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDhweCA1cHggMHB4IDZweDsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisKKyAgICAgICAgICAgICAgICAmLnNlbGVjdGVkIHsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgQG1haW5fY29sb3JfYTsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMzVweDsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMHB4OworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAzcHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICAuc3VnZ2VzdGVkLWljb24geworICAgICAgICAgICAgICAgIC8vIG1hcmdpbjogOHB4IDVweCAwcHggNnB4OworICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgICAgICAmLmRpc2FibGV7CisgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuaWNvbnMtbGFiZWwgeworICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgIH0KKworICAgICAgICAuaWNvbnMtdGV4dCB7CisgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CisgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZmNmY2Y7CisgICAgICAgICAgICBib3JkZXItYm90dG9tOiBub25lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMvaW5mb3JtYXRpb24tYXJ0aWZhY3RzLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2luZm9ybWF0aW9uLWFydGlmYWN0cy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA0OGMxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMvaW5mb3JtYXRpb24tYXJ0aWZhY3RzLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwxNTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBpbXBvcnQgQXJ0aWZhY3RNb2RlbCA9IFNkYy5Nb2RlbHMuQXJ0aWZhY3RNb2RlbDsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSUluZm9ybWF0aW9uQXJ0aWZhY3RzU2NvcGUgZXh0ZW5kcyBJV29ya3NwYWNlVmlld01vZGVsU2NvcGUgeworICAgICAgICBhcnRpZmFjdHM6IEFycmF5PE1vZGVscy5BcnRpZmFjdE1vZGVsPjsKKyAgICAgICAgdGFibGVIZWFkZXJzTGlzdDogQXJyYXk8YW55PjsKKyAgICAgICAgYXJ0aWZhY3RUeXBlOiBzdHJpbmc7CisgICAgICAgIGlzUmVzb3VyY2VJbnN0YW5jZTpib29sZWFuOworICAgICAgICBkb3dubG9hZEZpbGU6TW9kZWxzLklGaWxlRG93bmxvYWQ7CisgICAgICAgIGlzTG9hZGluZzpib29sZWFuOworICAgICAgICBzb3J0Qnk6c3RyaW5nOworICAgICAgICByZXZlcnNlOmJvb2xlYW47CisKKyAgICAgICAgZ2V0VGl0bGUoKTogc3RyaW5nOworICAgICAgICBhZGRPclVwZGF0ZShhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6IHZvaWQ7CisgICAgICAgIGRlbGV0ZShhcnRpZmFjdDpNb2RlbHMuQXJ0aWZhY3RNb2RlbCk6IHZvaWQ7CisgICAgICAgIGRvd25sb2FkKGFydGlmYWN0Ok1vZGVscy5BcnRpZmFjdE1vZGVsKTogdm9pZDsKKyAgICAgICAgY2xpY2tBcnRpZmFjdE5hbWUoYXJ0aWZhY3Q6YW55KTp2b2lkOworICAgICAgICBvcGVuRWRpdEVudlBhcmFtZXRlcnNNb2RhbChhcnRpZmFjdFJlc291cmNlOk1vZGVscy5BcnRpZmFjdE1vZGVsKTp2b2lkOworICAgICAgICBzb3J0KHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgICAgICBzaG93Tm9BcnRpZmFjdE1lc3NhZ2UoKTpib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBJbmZvcm1hdGlvbkFydGlmYWN0c1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJyRtb2RhbCcsCisgICAgICAgICAgICAnJHRlbXBsYXRlQ2FjaGUnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZScsCisgICAgICAgICAgICAnJHN0YXRlJywKKyAgICAgICAgICAgICdzZGNDb25maWcnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUluZm9ybWF0aW9uQXJ0aWZhY3RzU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkbW9kYWw6bmcudWkuYm9vdHN0cmFwLklNb2RhbFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNoYXJpbmdTZXJ2aWNlOlNkYy5TZXJ2aWNlcy5TaGFyaW5nU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAkc3RhdGU6YW55LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNkY0NvbmZpZzpNb2RlbHMuSUFwcENvbmZpZ3VydGFpb24sCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgTW9kYWxzSGFuZGxlcjpVdGlscy5Nb2RhbHNIYW5kbGVyKSB7CisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlU2VsZWN0ZWRNZW51SXRlbSgpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGdldE1hcHBlZE9iamVjdHMoKTphbnkgeworICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICBub3JtYWw6IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5hcnRpZmFjdHMKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSAnYXJ0aWZhY3REaXNwbGF5TmFtZSc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RUeXBlID0gJ25vcm1hbCc7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRUaXRsZSA9ICgpOnN0cmluZyA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGZpbHRlcigicmVzb3VyY2VOYW1lIikodGhpcy4kc2NvcGUuY29tcG9uZW50Lm5hbWUpICsgJyBBcnRpZmFjdHMnOworCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS50YWJsZUhlYWRlcnNMaXN0ID0gWworICAgICAgICAgICAgICAgIHt0aXRsZTogJ05hbWUnLCBwcm9wZXJ0eTogJ2FydGlmYWN0RGlzcGxheU5hbWUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdUeXBlJywgcHJvcGVydHk6ICdhcnRpZmFjdFR5cGUnfQorICAgICAgICAgICAgXTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuYXJ0aWZhY3RzKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnQgPSAoc29ydEJ5OnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJzZSA9ICh0aGlzLiRzY29wZS5zb3J0QnkgPT09IHNvcnRCeSkgPyAhdGhpcy4kc2NvcGUucmV2ZXJzZSA6IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnRCeSA9IHNvcnRCeTsKKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWRkT3JVcGRhdGUgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIGFydGlmYWN0LmFydGlmYWN0R3JvdXBUeXBlID0gJ0lORk9STUFUSU9OQUwnOworICAgICAgICAgICAgICAgIHRoaXMuTW9kYWxzSGFuZGxlci5vcGVuV2l6YXJkQXJ0aWZhY3RNb2RhbChhcnRpZmFjdCwgdGhpcy4kc2NvcGUuY29tcG9uZW50KS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYXJ0aWZhY3RzID0gPEFydGlmYWN0TW9kZWxbXT5fLnZhbHVlcyh0aGlzLiRzY29wZS5jb21wb25lbnQuYXJ0aWZhY3RzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNob3dOb0FydGlmYWN0TWVzc2FnZSA9ICgpOmJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIGxldCBhcnRpZmFjdHM6YW55ID0gW107CisgICAgICAgICAgICAgICAgYXJ0aWZhY3RzID0gXy5maWx0ZXIodGhpcy4kc2NvcGUuYXJ0aWZhY3RzLCAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJ0aWZhY3QuZXNJZDsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGlmIChhcnRpZmFjdHMubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5kZWxldGUgPSAoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOnZvaWQgPT4geworCisgICAgICAgICAgICAgICAgbGV0IG9uT2sgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdHMgPSA8QXJ0aWZhY3RNb2RlbFtdPl8udmFsdWVzKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5hcnRpZmFjdHMpOworICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGxldCBvbkZhaWxlZCA9IChlcnJvcjphbnkpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBhcnRpZmFjdCByZXR1cm5lZCBlcnJvcjonLCBlcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQuZGVsZXRlQXJ0aWZhY3QoYXJ0aWZhY3QudW5pcXVlSWQsIGFydGlmYWN0LmFydGlmYWN0TGFiZWwpLnRoZW4ob25TdWNjZXNzLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCB0aXRsZTpzdHJpbmcgPSB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJBUlRJRkFDVF9WSUVXX0RFTEVURV9NT0RBTF9USVRMRSIpOworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkFSVElGQUNUX1ZJRVdfREVMRVRFX01PREFMX1RFWFQiLCAieyduYW1lJzogJyIgKyBhcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lICsgIid9Iik7CisgICAgICAgICAgICAgICAgdGhpcy5Nb2RhbHNIYW5kbGVyLm9wZW5Db25maXJtYXRpb25Nb2RhbCh0aXRsZSwgbWVzc2FnZSwgZmFsc2UpLnRoZW4ob25Payk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jbGlja0FydGlmYWN0TmFtZSA9IChhcnRpZmFjdDphbnkpID0+IHsKKyAgICAgICAgICAgICAgICBpZiAoIWFydGlmYWN0LmVzSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuYWRkT3JVcGRhdGUoYXJ0aWZhY3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5mb3JtYXRpb24tYXJ0aWZhY3RzL2luZm9ybWF0aW9uLWFydGlmYWN0cy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2luZm9ybWF0aW9uLWFydGlmYWN0cy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDExN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2luZm9ybWF0aW9uLWFydGlmYWN0cy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMtdmlldy5odG1sCkBAIC0wLDAgKzEsNTcgQEAKKzxkaXYgY2xhc3M9IndvcmtzcGFjZS1pbmZvcm1hdGlvbi1hcnRpZmFjdCI+CisgICAgPGRpdiBkYXRhLXRlc3RzLWlkPSJhZGQtaW5mb3JtYXRpb24tYXJ0aWZhY3QtYnV0dG9uIiAgbmctaWY9IiFpc1ZpZXdNb2RlKCkiCisgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogaXNEaXNhYmxlTW9kZSgpfSIKKyAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImFkZEdyZXkiIGNsYXNzPSJhZGQtYnRuIiBkYXRhLW5nLWNsaWNrPSJhZGRPclVwZGF0ZSh7fSkiIHR5cGU9ImJ1dHRvbiI+QWRkIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbnRhaW5lci1mbGV4Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUiIGRhdGEtbmctY2xhc3M9Insndmlldy1tb2RlJzogaXNWaWV3TW9kZSgpfSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkIGZsZXgtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgaGVhZC1yb3cgaGFuZCBmbGV4LWl0ZW0iIG5nLXJlcGVhdD0iaGVhZGVyIGluIHRhYmxlSGVhZGVyc0xpc3QgdHJhY2sgYnkgJGluZGV4IiBkYXRhLW5nLWNsaWNrPSJzb3J0KGhlYWRlci5wcm9wZXJ0eSkiPnt7aGVhZGVyLnRpdGxlfX0KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1zaG93PSJzb3J0QnkgPT09IGhlYWRlci5wcm9wZXJ0eSIgY2xhc3M9InRhYmxlLWhlYWRlci1zb3J0LWFycm93IiBkYXRhLW5nLWNsYXNzPSJ7J2Rvd24nOiByZXZlcnNlLCAndXAnOiFyZXZlcnNlfSI+IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1uby10ZXh0LWhlYWRlciBoZWFkLXJvdyBmbGV4LWl0ZW0iPjwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc3VwcHJlc3Mtc2Nyb2xsLXg9InRydWUiIHNjcm9sbC15LW1hcmdpbi1vZmZzZXQ9IjAiIGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctaWY9InNob3dOb0FydGlmYWN0TWVzc2FnZSgpIiBjbGFzcz0ibm8tcm93LXRleHQiIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnOiBpc0Rpc2FibGVNb2RlKCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBubyBpbmZvcm1hdGlvbiBhcnRpZmFjdHMgdG8gZGlzcGxheQorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1zdGFydD0iYXJ0aWZhY3QgaW4gYXJ0aWZhY3RzfCBvcmRlckJ5OnNvcnRCeTpyZXZlcnNlIHRyYWNrIGJ5ICRpbmRleCIgZGF0YS10ZXN0cy1pZD0iSW5mb3JtYXRpb25hbEFydGlmYWN0Um93IgorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogYXJ0aWZhY3Quc2VsZWN0ZWR9IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctaWY9ImFydGlmYWN0LmVzSWQiPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iICBkYXRhLW5nLWNsaWNrPSJhcnRpZmFjdC5zZWxlY3RlZCA9ICFhcnRpZmFjdC5zZWxlY3RlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNwcml0ZSB0YWJsZS1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydvcGVuZWQnOiBhcnRpZmFjdC5zZWxlY3RlZH0iIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0iICBkYXRhLW5nLWNsaWNrPSJhcnRpZmFjdC5zZWxlY3RlZCA9ICFhcnRpZmFjdC5zZWxlY3RlZCIgZGF0YS10ZXN0cy1pZD0ie3thcnRpZmFjdC5hcnRpZmFjdFR5cGV9fSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcnRpZmFjdC5hcnRpZmFjdFR5cGV9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWJ0bi1jb2wgZmxleC1pdGVtIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0YWJsZS1lZGl0LWJ0biIgZGF0YS10ZXN0cy1pZD0iZWRpdF97e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSIgIGRhdGEtbmctaWY9IiFpc1ZpZXdNb2RlKCkgJiYgIWFydGlmYWN0LmlzVGhpcmRQYXJ0eSgpIiAgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoYXJ0aWZhY3QpIiBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogaXNEaXNhYmxlTW9kZSgpfSI+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFibGUtZGVsZXRlLWJ0biIgZGF0YS10ZXN0cy1pZD0iZGVsZXRlX3t7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19IiBkYXRhLW5nLWlmPSIhaXNWaWV3TW9kZSgpICYmICFhcnRpZmFjdC5pc1RoaXJkUGFydHkoKSIgIGRhdGEtbmctY2xpY2s9ImRlbGV0ZShhcnRpZmFjdCkiIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnOiBpc0Rpc2FibGVNb2RlKCl9Ij4gPC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFibGUtZG93bmxvYWQtYnRuIiBkb3dubG9hZC1hcnRpZmFjdCAgZGF0YS10ZXN0cy1pZD0iZG93bmxvYWRfe3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWlmPSJhcnRpZmFjdC5hcnRpZmFjdE5hbWUiIGNvbXBvbmVudD0iY29tcG9uZW50IiBhcnRpZmFjdD0iYXJ0aWZhY3QiPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBkYXRhLW5nLWlmPSJhcnRpZmFjdC5zZWxlY3RlZCIgY2xhc3M9Iml0ZW0tb3BlbmVkIiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fURlc2NyaXB0aW9uIiBkYXRhLW5nLWJpbmQ9ImFydGlmYWN0LmRlc2NyaXB0aW9uIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWRkLWJ1dHRvbiIgZGF0YS1uZy1yZXBlYXQ9ImFydGlmYWN0IGluIGFydGlmYWN0cyB0cmFjayBieSAkaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1zaG93PSIhYXJ0aWZhY3QuZXNJZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1pZj0iIWlzVmlld01vZGUoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogaXNEaXNhYmxlTW9kZSgpfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU9IkRFUExPWU1FTlRfQVJUSUZBQ1RfQlVUVE9OX0FERF9IRUFUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZS12YWx1ZXM9InsnbmFtZSc6ICd7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSd9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlKGFydGlmYWN0KSI+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFkZC1idXR0b24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctaWY9IiFpc1ZpZXdNb2RlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzRGlzYWJsZU1vZGUoKX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPSJERVBMT1lNRU5UX0FSVElGQUNUX0JVVFRPTl9BRERfT1RIRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGUoe30pIj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2luZm9ybWF0aW9uLWFydGlmYWN0cy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5mb3JtYXRpb24tYXJ0aWZhY3RzL2luZm9ybWF0aW9uLWFydGlmYWN0cy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZmUxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2luZm9ybWF0aW9uLWFydGlmYWN0cy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMubGVzcwpAQCAtMCwwICsxLDQ3IEBACisud29ya3NwYWNlLWluZm9ybWF0aW9uLWFydGlmYWN0IHsKKyAgICB3aWR0aDogOTMlOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAudy1zZGMtY2xhc3NpYy1idG4geworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgfQorCisgICAgLnRhYmxleworICAgICAgICBoZWlnaHQ6IDQ5MHB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgIG1hcmdpbi10b3A6IDI3cHg7CisKKyAgICAgICAgLml0ZW0tb3BlbmVkeworICAgICAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOworICAgICAgICB9CisKKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgxKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE1OworICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICBzcGFuLnRhYmxlLWFycm93IHsKKyAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDdweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDIpIHsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogNjsKKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDMpIHsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogMzsKKyAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgICAgICB9CisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNCkgeworICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICB9CisKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9pbnB1dHMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5wdXRzL2lucHV0cy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTgyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9pbnB1dHMubGVzcwpAQCAtMCwwICsxLDI4NiBAQAorLndvcmtzcGFjZS1pbnB1dHMgeworCisgICAgLnNkYy13b3Jrc3BhY2UtY29udGFpbmVyIC53LXNkYy1tYWluLXJpZ2h0LWNvbnRhaW5lciAudy1zZGMtbWFpbi1jb250YWluZXItYm9keS1jb250ZW50IHsKKyAgICAgICAgcGFkZGluZzogMjVweCA4JSAwcHggOCU7CisgICAgfQorCisgICAgd2lkdGg6IDEwMCU7CisgICAgZGlzcGxheTogZmxleDsKKworICAgIC50ZXh0IHsKKyAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIHBhZGRpbmctbGVmdDogMTVweDsKKyAgICB9CisKKyAgICAudGl0bGUtdGV4dCB7CisgICAgICAgIGNvbG9yOiBAbWFpbl9jb2xvcl9tOworICAgICAgICAuZi10eXBlLl8xM19tOworICAgICAgICAuYm9sZDsKKyAgICB9CisKKyAgICAudGl0bGUtYmx1ZS10ZXh0IHsKKyAgICAgICAgY29sb3I6IEBtYWluX2NvbG9yX2E7CisgICAgICAgIC5mLXR5cGUuXzEzX207CisKKyAgICAgICAgJi5wcm9wZXJ0eS1uYW1lLXRleHQgeworICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMTNweDsKKyAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYmEoMTIwLCAxMzYsIDE0OCwgMC4yNik7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaW5zdGFuY2UtbmFtZS10ZXh0IHsKKyAgICAgICAgZmxleC1ncm93OiAxOworICAgIH0KKworICAgIG5nLWluY2x1ZGUgeworICAgICAgICB3aWR0aDogNDUlOworICAgIH0KKworICAgIC53LXNkYy1pbnB1dHMtc2VhcmNoIHsKKyAgICAgICAgcGFkZGluZzogMTBweCAyMHB4IDIwcHggMDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICB3aWR0aDogNjAlOworICAgICAgICBoZWlnaHQ6IDY0cHg7CisKKyAgICAgICAgLmlucHV0cy1zZWFyY2gtaWNvbiB7CisgICAgICAgICAgICB0b3A6IDlweDsKKyAgICAgICAgICAgIHJpZ2h0OiAxMXB4OworICAgICAgICB9CisKKyAgICAgICAgLm1hZ25pZmljYXRpb24td2hpdGUgeworICAgICAgICAgICAgLnNwcml0ZS1uZXc7CisgICAgICAgICAgICAuc2VhcmNoLXdoaXRlLWljb247CisgICAgICAgICAgICAuaGFuZDsKKyAgICAgICAgfQorCisgICAgICAgIC5zZWFyY2gtaWNvbi1jb250YWluZXIgeworICAgICAgICAgICAgd2lkdGg6IDM1cHg7CisgICAgICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9hOworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgIGJvdHRvbTogMzFweDsKKyAgICAgICAgICAgIHJpZ2h0OiAxcHg7CisgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwcHggNHB4IDRweCAwcHg7CisgICAgICAgICAgICAuaGFuZAorICAgICAgICB9CisgICAgfQorCisgICAgLnRvdGFsLWlucHV0cy1jb3VudCB7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICB9CisKKyAgICAubmV3LWlucHV0LWJ1dHRvbiB7CisgICAgICAgIG1hcmdpbjogOXB4IDAgMCAwOworICAgIH0KKworICAgIC53LXNkYy1pbnB1dHMtc2VhcmNoLWlucHV0IHsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQGNvbG9yX2U7CisgICAgICAgIC5ib3JkZXItcmFkaXVzKDRweCk7CisgICAgICAgIGhlaWdodDogMzJweDsKKyAgICAgICAgbWFyZ2luOiAwOworICAgICAgICBwYWRkaW5nOiAwcHggMjhweCAzcHggMTBweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IDRweDsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICB9CisKKyAgICAudy1zZGMtY2xhc3NpYy1idG4geworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgfQorCisgICAgLnByb3AtdG8taW5wdXQtYnV0dG9uIHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDUwJTsKKyAgICAgICAgbWFyZ2luLXJpZ2h0OiAtMjBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogLTEwcHg7CisKKyAgICB9CisKKyAgICAucHJvcGVydHktcm93IHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZDsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OworICAgICAgICAucHJvcGVydHktbmFtZS1jb250YWluZXIgeworICAgICAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogNDsKKyAgICAgICAgfQorCisgICAgICAgIC50eXBlLXNjaGVtYS1jb250YWluZXIgeworICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Q7CisgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDMwcHg7CisgICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKKyAgICAgICAgICAgIHdpZHRoOiAxMHB4OworICAgICAgICB9CisKKyAgICB9CisKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggeworCisgICAgICAgIC5mbGV4LWl0ZW0geworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDIycHg7CisgICAgICAgIH0KKyAgICAgICAgLmV4cGFuZC1jb2xsYXBzZS10YWJsZS1yb3cgeworCisgICAgICAgICAgICAmLmV4cGFuZGVkIHsKKyAgICAgICAgICAgICAgICAuZmxleC1jb250YWluZXIgeworICAgICAgICAgICAgICAgICAgICAuZXhwYW5kLWNvbGxhcHNlLWlucHV0cy10YWJsZS1pY29uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwcHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5kYXRhLXJvdyB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogQHRsdl9jb2xvcl91OworICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgICAgICAgICAgcGFkZGluZzogMCAxMnB4OworICAgICAgICAgICAgICAgIG1hcmdpbjogMXB4IDBweCAxcHggMHB4OworICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5kYXRhLXJvdzpob3ZlciB7CisgICAgICAgICAgICAgICAgLmJnX2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5pbnB1dC1yb3cgeworICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogNDVweDsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBAdGx2X2NvbG9yX3Q7CisgICAgICAgICAgICAgICAgYm9yZGVyOiBAbWFpbl9jb2xvcl9vIHNvbGlkIDFweDsKKyAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgIG1hcmdpbjogMXB4IDBweCAxcHggMHB4OworCisgICAgICAgICAgICAgICAgJi5zZXJ2aWNlLWlucHV0LXJvdyB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IEB0bHZfY29sb3JfdTsKKyAgICAgICAgICAgICAgICAgICAgJi5uZXctaW5wdXQgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogQHRsdl9jb2xvcl92OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICYuc2VsZWN0ZWQgeworICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGx2X2NvbG9yX3Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC5mbGV4LWl0ZW0geworICAgICAgICAgICAgICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwIDE1cHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC5pbnB1dC1jaGVjay1ib3ggeworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiA5cHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICY+LnRpdGxlLXRleHR7CisgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IHN0YXJ0OworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA0cHggMCAwIDM1cHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLmV4cGFuZC1jb2xsYXBzZS1pbnB1dHMtdGFibGUtaWNvbnsKKyAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmlucHV0LXJvdzpob3ZlciB7CisgICAgICAgICAgICAgICAgLmJnX2o7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorCisgICAgLnRhYmxlIHsKKyAgICAgICAgaGVpZ2h0OiA2NDBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICAgICAgY2xlYXI6IGJvdGg7CisKKyAgICAgICAgLmVtcHR5LXJvdyB7CisgICAgICAgICAgICBwYWRkaW5nOiAzcHg7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtIHsKKyAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMnB4OworICAgICAgICB9CisKKyAgICAgICAgLnRhYmxlLWhlYWRlciB7CisKKyAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxNHB4OworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW5fY29sb3JfYTsKKyAgICAgICAgICAgIGNvbG9yOiBAbWFpbl9jb2xvcl9wOworICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICAgICAgICAgIHBhZGRpbmc6IDdweCA1cHggN3B4IDEwcHg7CisgICAgICAgICAgICAuZi10eXBlLl8xNF9tOworICAgICAgICB9CisgICAgICAgIC5oZWFkIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNmU2ZTY7CisgICAgICAgIH0KKworICAgICAgICAucHJvcGVydHktcm93OmhvdmVyeworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZ1bmNfY29sb3JfcjsKKyAgICAgICAgfQorCisgICAgICAgIC5ib2R5IHsKKyAgICAgICAgICAgIC5zY3JvbGxiYXItY29udGFpbmVyIHsKKyAgICAgICAgICAgICAgICAucGVyZmVjdC1zY3JvbGxiYXI7CisgICAgICAgICAgICAgICAgbWF4LWhlaWdodDogNjEwcHg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5leHBhbmQtY29sbGFwc2UtaW5wdXRzLXRhYmxlLWljb24geworICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgICAgIC5hcnJvdy11cDsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAuM3MgYWxsOworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgICAgICBsZWZ0OiA4cHg7CisgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CisgICAgICAgICAgICAgICAgcGFkZGluZzogMHB4IDEwcHggMHB4IDEwcHg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC50YWJsZS1jb2wtdGV4dCB7CisgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDE0cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaW5wdXRzLWhlYWRlciB7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGJvdHRvbTogMzFweDsKKyAgICB9CisKKyAgICAuaW5wdXRzLXRhYmxlcy1jb250YWluZXIgeworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgbWluLXdpZHRoOiAxMDAlOworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgIH0KKworICAgIC5pbnB1dHMtYnV0dG9uLWNvbnRhaW5lciB7CisgICAgICAgIHdpZHRoOiA4JTsKKyAgICAgICAgbWluLXdpZHRoOiA4JTsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKworICAgICAgICAucmlnaHQtYXJyb3ctYnRuIHsKKyAgICAgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAgICAgLmJsdWUtcmlnaHQtYXJyb3ctY2lyY2xlOworICAgICAgICAgICAgbWFyZ2luOiBhdXRvOworICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLnRhYmxlLWNvbnRhaW5lci1mbGV4IHsKKyAgICAgICAgbWFyZ2luLXRvcDogMjdweDsKKyAgICAgICAgd2lkdGg6IDQ2JTsKKyAgICAgICAgbWluLXdpZHRoOiA0NiU7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbnB1dHMvcmVzb3VyY2UtaW5wdXQvcmVzb3VyY2UtaW5wdXRzLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9yZXNvdXJjZS1pbnB1dC9yZXNvdXJjZS1pbnB1dHMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMxYjFkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbnB1dHMvcmVzb3VyY2UtaW5wdXQvcmVzb3VyY2UtaW5wdXRzLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSwxNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBpbXBvcnQgRGljdGlvbmFyeSA9IFNkYy5VdGlscy5EaWN0aW9uYXJ5OworICAgIGltcG9ydCBJbnB1dE1vZGVsID0gU2RjLk1vZGVscy5JbnB1dE1vZGVsOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJSW5wdXRzVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJV29ya3NwYWNlVmlld01vZGVsU2NvcGUgeworICAgICAgICBJbnN0YW5jZUlucHV0c1Byb3BlcnRpZXM6TW9kZWxzLkluc3RhbmNlSW5wdXRzUHJvcGVydGllc01hcERhdGE7IC8vdGhpcyBpcyB0aGEgbWFwIG9iamVjdCB0aGF0IGhvbGQgdGhlIHNlbGVjdGVkIGlucHV0cyBhbmQgdGhlIGlucHV0cyB3ZSBhbHJlYWR5IHVzZWQKKyAgICAgICAgdmZJbnN0YW5jZXNMaXN0OiBBcnJheTxNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZT47CisgICAgICAgIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5SZXNvdXJjZTsKKworICAgICAgICBvbkFycm93UHJlc3NlZCgpOnZvaWQ7CisgICAgICAgIGdldElucHV0UHJvcGVydGllc0Zvckluc3RhbmNlKGluc3RhbmNlSWQ6c3RyaW5nLCBpbnN0YW5jZTpNb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZSk6IG5nLklQcm9taXNlPGJvb2xlYW4+IDsKKyAgICAgICAgbG9hZElucHV0UHJvcGVydGllc0Zvckluc3RhbmNlKGluc3RhbmNlSWQ6c3RyaW5nLCBpbnB1dDpNb2RlbHMuSW5wdXRNb2RlbCk6IG5nLklQcm9taXNlPGJvb2xlYW4+IDsKKyAgICAgICAgbG9hZElucHV0SW5wdXRzKGlucHV0Ok1vZGVscy5JbnB1dE1vZGVsKTogbmcuSVByb21pc2U8Ym9vbGVhbj47CisgICAgfQorCisgICAgZXhwb3J0IGNsYXNzIFJlc291cmNlSW5wdXRzVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnJHEnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SUlucHV0c1ZpZXdNb2RlbFNjb3BlLCBwcml2YXRlICRxOiBuZy5JUVNlcnZpY2UpIHsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSA9ICgpOiB2b2lkID0+IHsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuSW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzID0gbmV3IE1vZGVscy5JbnN0YW5jZUlucHV0c1Byb3BlcnRpZXNNYXBEYXRhKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS52Zkluc3RhbmNlc0xpc3QgPSB0aGlzLiRzY29wZS5jb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzOworCisgICAgICAgICAgICAvLyBOZWVkIHRvIGNhc3QgYWxsIGlucHV0cyB0byBJbnB1dE1vZGVsIGZvciB0aGUgc2VhcmNoIHRvIHdvcmsKKyAgICAgICAgICAgIGxldCB0bXBJbnB1dHM6QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+ID0gbmV3IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPigpOworICAgICAgICAgICAgXy5lYWNoKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pbnB1dHMsIChpbnB1dCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdG1wSW5wdXRzLnB1c2gobmV3IE1vZGVscy5JbnB1dE1vZGVsKGlucHV0KSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pbnB1dHMgPSB0bXBJbnB1dHM7CisgICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlc291cmNlCisgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRDb21wb25lbnRJbnB1dHMoKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdoZW4gY2xpY2tpbmcgb24gaW5zdGFuY2UgaW5wdXQgaW4gdGhlIGxlZnQgb3IgcmlnaHQgdGFibGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBpbnB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nZXRJbnB1dFByb3BlcnRpZXNGb3JJbnN0YW5jZSA9IChpbnN0YW5jZUlkOnN0cmluZywgaW5zdGFuY2U6TW9kZWxzLkNvbXBvbmVudHNJbnN0YW5jZXMuQ29tcG9uZW50SW5zdGFuY2UpOiBuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLnByb3BlcnRpZXMgPSB0aGlzLiRzY29wZS5jb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzUHJvcGVydGllc1tpbnN0YW5jZUlkXTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdoZW4gY2xpY2tpbmcgb24gaW5wdXQgaW4gdGhlIHJpZ2h0IHRhYmxlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCBhbGwgaW5wdXRzIG9mIHRoZSBzZWxlY3RlZCBpbnB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLiRzY29wZS5sb2FkSW5wdXRJbnB1dHMgPSAoaW5wdXQ6TW9kZWxzLklucHV0TW9kZWwpOiBuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworCisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9ICgpID0+IHsgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTsgfTsKKyAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9ICgpID0+IHsgZGVmZXJyZWQucmVzb2x2ZShmYWxzZSk7IH07CisKKyAgICAgICAgICAgICAgICBpZighaW5wdXQuaW5wdXRzKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRSZXNvdXJjZUlucHV0SW5wdXRzKGlucHV0LnVuaXF1ZUlkKS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2hlbiBjbGlja2luZyBvbiBpbnN0YW5jZSBpbnB1dCBpbiB0aGUgbGVmdCBvciByaWdodCB0YWJsZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkIGlucHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxvYWRJbnB1dFByb3BlcnRpZXNGb3JJbnN0YW5jZSA9IChpbnN0YW5jZUlkOnN0cmluZywgaW5wdXQ6TW9kZWxzLklucHV0TW9kZWwpOiBuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworCisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChwcm9wZXJ0aWVzOkFycmF5PE1vZGVscy5Qcm9wZXJ0eU1vZGVsPikgPT4geworICAgICAgICAgICAgICAgICAgICBpbnB1dC5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZmFsc2UpCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGlmKCFpbnB1dC5wcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRDb21wb25lbnRJbnN0YW5jZUlucHV0UHJvcGVydGllcyhpbnN0YW5jZUlkLCBpbnB1dC51bmlxdWVJZCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdoZW4gcHJlc3NpbmcgdGhlIGFycm93LCB3ZSBjcmVhdGUgc2VydmljZSBpbnB1dHMgZnJvbSB0aGUgaW5wdXRzIHNlbGVjdGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uQXJyb3dQcmVzc2VkID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChpbnB1dHNDcmVhdGVkOiBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4pID0+IHsKKworICAgICAgICAgICAgICAgICAgICAvL2Rpc2FibGVkICBhbGwgdGhlIGlucHV0cyBpbiB0aGUgbGVmdCB0YWJsZQorICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuSW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzLCAocHJvcGVydGllczpBcnJheTxNb2RlbHMuUHJvcGVydHlNb2RlbD4pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChwcm9wZXJ0aWVzLCAocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pc0FscmVhZHlTZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIGNvbG9yIHRvIHRoZSBuZXcgaW5wdXRzIChyaWdodCB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGlucHV0c0NyZWF0ZWQsIChpbnB1dCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuaXNOZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyBjb2xvciB0byB0aGUgbmV3IGlucHV0cyAocmlnaHQgdGFibGUpCisgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGlucHV0c0NyZWF0ZWQsIChpbnB1dCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmlzTmV3ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLiRhcHBseSgpOworICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmNyZWF0ZUlucHV0c0Zvcm1JbnN0YW5jZXModGhpcy4kc2NvcGUuSW5zdGFuY2VJbnB1dHNQcm9wZXJ0aWVzKS50aGVuKG9uU3VjY2Vzcyk7CisgICAgICAgICAgICB9OworCisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5wdXRzL3Jlc291cmNlLWlucHV0L3Jlc291cmNlLWlucHV0cy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9yZXNvdXJjZS1pbnB1dC9yZXNvdXJjZS1pbnB1dHMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGY1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9yZXNvdXJjZS1pbnB1dC9yZXNvdXJjZS1pbnB1dHMtdmlldy5odG1sCkBAIC0wLDAgKzEsMTM2IEBACis8ZGl2IGNsYXNzPSJ3b3Jrc3BhY2UtaW5wdXRzIj4KKyAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb250YWluZXItZmxleCI+CisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWlucHV0cy1zZWFyY2ggcHVsbC1sZWZ0IGhpZGVtZSI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Inctc2RjLWlucHV0cy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giLz4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1pY29uLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Inctc2RjLXNlYXJjaC1pY29uIGlucHV0cy1zZWFyY2gtaWNvbiBtYWduaWZpY2F0aW9uLXdoaXRlIj48L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciI+VkZDIGluc3RhbmNlcyBpbnB1dHM8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWxvYWRlciIgbmctY2xhc3M9InsndGx2LWxvYWRlciBsYXJnZSBsb2FkZXInOiBpc0xvYWRpbmd9Ij48L2Rpdj4KKyAgICAgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc2Nyb2xsLXktbWFyZ2luLW9mZnNldD0iMCIgY2xhc3M9InNjcm9sbGJhci1jb250YWluZXIiPgorCisgICAgICAgICAgICAgICAgICAgIDxleHBhbmQtY29sbGFwc2UgZXhwYW5kZWQtc2VsZWN0b3I9Ii52Zi1pbnN0YW5jZS1saXN0Lnt7JGluZGV4fX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS10YWJsZS1yb3ciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC1kYXRhLWZ1bmN0aW9uPSJnZXRJbnB1dFByb3BlcnRpZXNGb3JJbnN0YW5jZShpbnN0YW5jZS51bmlxdWVJZCwgaW5zdGFuY2UpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLWNsb3NlLW9uLWluaXQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXBlYXQtc3RhcnQ9Imluc3RhbmNlIGluIHZmSW5zdGFuY2VzTGlzdCB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1jb250YWluZXIgZGF0YS1yb3ciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1pbnB1dHMtdGFibGUtaWNvbiI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtdGV4dCI+e3tpbnN0YW5jZS5uYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8L2V4cGFuZC1jb2xsYXBzZT4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBjbGFzcz0idmYtaW5zdGFuY2UtbGlzdCB7eyRpbmRleH19Ij4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktcm93IiBuZy1pZj0iaW5zdGFuY2UucHJvcGVydGllcy5sZW5ndGg9PT0wIj5ObyBwcm9wZXJ0aWVzIHRvIGRpc3BsYXk8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9InByb3BlcnR5IGluIGluc3RhbmNlLnByb3BlcnRpZXMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9wZXJ0eS1yb3cgZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWl0ZW0gdGV4dCBwcm9wZXJ0eS1uYW1lLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtYmx1ZS10ZXh0IHByb3BlcnR5LW5hbWUtdGV4dCI+e3twcm9wZXJ0eS5uYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCBpbnN0YW5jZS1uYW1lLXRleHQiPnt7cHJvcGVydHkubmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idHlwZS1zY2hlbWEtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cHJvcGVydHkudHlwZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0eXBlLXNjaGVtYS1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3twcm9wZXJ0eS5zY2hlbWEucHJvcGVydHkudHlwZX19IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxzZGMtY2hlY2tib3gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0eXBlLXNjaGVtYS1jb250YWluZXIgaW5wdXQtY2hlY2stYm94IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgPSJwcm9wZXJ0eS5pc0FscmVhZHlTZWxlY3RlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtbW9kZWw9Ikluc3RhbmNlSW5wdXRzUHJvcGVydGllc1tpbnN0YW5jZS51bmlxdWVJZF0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGMtY2hlY2tsaXN0LXZhbHVlPSJwcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKSI+PC9zZGMtY2hlY2tib3g+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJpbnB1dHMtYnV0dG9uLWNvbnRhaW5lciBwdWxsLWxlZnQiPgorICAgICAgICA8IS0tPGRpdiBuZy1jbGljaz0ib25BcnJvd1ByZXNzZWQoKSIgY2xhc3M9InJpZ2h0LWFycm93LWJ0biI+PC9kaXY+LS0+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb250YWluZXItZmxleCI+CisgICAgICAgIDxkaXYgY2xhc3M9Inctc2RjLWlucHV0cy1zZWFyY2ggcHVsbC1sZWZ0Ij4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0idy1zZGMtaW5wdXRzLXNlYXJjaC1pbnB1dCIgZGF0YS1uZy1tb2RlbD0ic2VhcmNoLmZpbHRlclRlcm0iIHBsYWNlaG9sZGVyPSJTZWFyY2giIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ie2RlYm91bmNlOiAyMDB9Ii8+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWFyY2gtaWNvbi1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1zZWFyY2gtaWNvbiBpbnB1dHMtc2VhcmNoLWljb24gbWFnbmlmaWNhdGlvbi13aGl0ZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIiPlJlc291cmNlIGluc3RhbmNlIGlucHV0czwvZGl2PgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGV4cGFuZC1jb2xsYXBzZSBleHBhbmRlZC1zZWxlY3Rvcj0iLnJlc291cmNlLWlucHV0cy57eyRpbmRleH19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJleHBhbmQtY29sbGFwc2UtdGFibGUtcm93IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQtZGF0YS1mdW5jdGlvbj0ibG9hZElucHV0UHJvcGVydGllc0Zvckluc3RhbmNlKHJlc291cmNlSW5wdXQudW5pcXVlSWQsIHJlc291cmNlSW5wdXQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLWNsb3NlLW9uLWluaXQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXBlYXQtc3RhcnQ9InJlc291cmNlSW5wdXQgaW4gY29tcG9uZW50LmlucHV0cyB8IGZpbHRlcjpzZWFyY2ggdHJhY2sgYnkgJGluZGV4ICI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1yb3cgc2VydmljZS1pbnB1dC1yb3ciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlLXRleHQiPnt7cmVzb3VyY2VJbnB1dC5uYW1lfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRhaW5lciIgbmctY2xhc3M9InJlc291cmNlSW5wdXQuaXNOZXcgPyAnbmV3LWlucHV0JzogJ3NlcnZpY2UtaW5wdXQtcm93JyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1pbnB1dHMtdGFibGUtaWNvbiI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtaXRlbSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0aXRsZS10ZXh0Ij5EZXNjcmlwdGlvbjo8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tyZXNvdXJjZUlucHV0LmRlc2NyaXB0aW9ufX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtaXRlbSAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlLXRleHQiPlZGIEluc3RhbmNlOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3Jlc291cmNlSW5wdXQubmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtdGV4dCI+VHlwZTo8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tyZXNvdXJjZUlucHV0LnR5cGV9fSA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9leHBhbmQtY29sbGFwc2U+CisKKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1lbmQ9IiIgY2xhc3M9ImlucHV0LWlucHV0cy1saXN0IHJlc291cmNlLWlucHV0cyB7eyRpbmRleH19Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXJvdyIgbmctaWY9InJlc291cmNlSW5wdXQucHJvcGVydGllcy5sZW5ndGg9PT0wIj5ObyBwcm9wZXJ0aWVzIHRvIGRpc3BsYXk8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJwcm9wZXJ0eSBpbiByZXNvdXJjZUlucHV0LnByb3BlcnRpZXMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9wZXJ0eS1yb3cgZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWl0ZW0gdGV4dCBwcm9wZXJ0eS1uYW1lLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0idGl0bGUtYmx1ZS10ZXh0IHByb3BlcnR5LW5hbWUtdGV4dCI+e3twcm9wZXJ0eS5uYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCBpbnN0YW5jZS1uYW1lLXRleHQiPnt7cHJvcGVydHkubmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idHlwZS1zY2hlbWEtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cHJvcGVydHkudHlwZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0eXBlLXNjaGVtYS1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3twcm9wZXJ0eS5zY2hlbWEucHJvcGVydHkudHlwZX19IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5wdXRzL3Jlc291cmNlLWlucHV0L3Jlc291cmNlLWlucHV0cy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbnB1dHMvcmVzb3VyY2UtaW5wdXQvcmVzb3VyY2UtaW5wdXRzLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiMzJmYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5wdXRzL3Jlc291cmNlLWlucHV0L3Jlc291cmNlLWlucHV0cy5sZXNzCkBAIC0wLDAgKzEsOSBAQAorLndvcmtzcGFjZS1pbnB1dHMgeworCisgICAgLnByb3BlcnR5LXJvdyB7CisgICAgICAgIC5pbnB1dC1jaGVjay1ib3ggeworICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9zZXJ2aWNlLWlucHV0L3NlcnZpY2UtaW5wdXRzLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9zZXJ2aWNlLWlucHV0L3NlcnZpY2UtaW5wdXRzLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MzkxNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5wdXRzL3NlcnZpY2UtaW5wdXQvc2VydmljZS1pbnB1dHMtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDI0NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBJQW5ndWxhckV2ZW50ID0gYW5ndWxhci5JQW5ndWxhckV2ZW50OworICAgIGltcG9ydCBDb21wb25lbnRJbnN0YW5jZSA9IFNkYy5Nb2RlbHMuQ29tcG9uZW50c0luc3RhbmNlcy5Db21wb25lbnRJbnN0YW5jZTsKKworCisgICAgaW50ZXJmYWNlIElTZXJ2aWNlSW5wdXRzVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJV29ya3NwYWNlVmlld01vZGVsU2NvcGUgeworCisgICAgICAgIHZmSW5zdGFuY2VzTGlzdDogQXJyYXk8Q29tcG9uZW50SW5zdGFuY2U+OworICAgICAgICBzZWxlY3RlZElucHV0czpBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD47CisgICAgICAgIGluc3RhbmNlSW5wdXRzTWFwOk1vZGVscy5JbnN0YW5jZXNJbnB1dHNNYXBEYXRhOyAvL3RoaXMgaXMgdGhhIG1hcCBvYmplY3QgdGhhdCBob2xkIHRoZSBzZWxlY3RlZCBpbnB1dHMgYW5kIHRoZSBpbnB1dHMgd2UgYWxyZWFkeSB1c2VkCisgICAgICAgIGNvbXBvbmVudDpNb2RlbHMuQ29tcG9uZW50cy5TZXJ2aWNlOworICAgICAgICBzZGNNZW51Ok1vZGVscy5JQXBwTWVudTsKKworICAgICAgICBvbkFycm93UHJlc3NlZCgpOnZvaWQ7CisgICAgICAgIGxvYWRDb21wb25lbnRJbnB1dHMoKTogdm9pZDsKKyAgICAgICAgbG9hZEluc3RhbmNlSW5wdXRzKGluc3RhbmNlOkNvbXBvbmVudEluc3RhbmNlKTogbmcuSVByb21pc2U8Ym9vbGVhbj4gOworICAgICAgICBsb2FkSW5wdXRQcm9wZXJ0aWVzRm9ySW5zdGFuY2UoaW5zdGFuY2VJZDpzdHJpbmcsIGlucHV0Ok1vZGVscy5JbnB1dE1vZGVsKTogbmcuSVByb21pc2U8Ym9vbGVhbj4gOworICAgICAgICBsb2FkSW5wdXRJbnB1dHMoaW5wdXQ6TW9kZWxzLklucHV0TW9kZWwpOiBuZy5JUHJvbWlzZTxib29sZWFuPjsKKyAgICAgICAgZGVsZXRlSW5wdXQoaW5wdXQ6TW9kZWxzLklucHV0TW9kZWwpOnZvaWQKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgU2VydmljZUlucHV0c1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRxJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJworICAgICAgICBdOworCisgICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgJHNjb3BlOklTZXJ2aWNlSW5wdXRzVmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHE6IG5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNb2RhbHNIYW5kbGVyOiBTZGMuVXRpbHMuTW9kYWxzSGFuZGxlcikgeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gbG9hZGluZyB0aGUgc2NyZWVuIGFnYWluLCB3ZSBuZWVkIHRvIGRpc2FibGVkIHRoZSBpbnB1dHMgdGhhdCBhbHJlYWR5IGNyZWF0ZWQgb24gdGhlIHNlcnZpY2UsCisgICAgICAgICAqIHdlIGRvIHRoYXQgYnkgY29tcGFyaW5nIHRoZSBzZXJ2aWNlIGlucHV0IG5hbWUsIHRvIHRoZSBpbnN0YW5jZSBuYW1lICsgJ18nICsgdGhlIHJlc291cmNlIGluc3RhbmNlIGlucHV0IG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGRpc2FibGVFbmFibGVTZWxlY3RlZElucHV0cyA9IChpbnN0YW5jZTogQ29tcG9uZW50SW5zdGFuY2UpOiB2b2lkID0+IHsKKworICAgICAgICAgICAgbGV0IGFscmVhZHlTZWxlY3RlZElucHV0ID0gbmV3IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPigpOworICAgICAgICAgICAgXy5mb3JFYWNoKGluc3RhbmNlLmlucHV0cywgKGlucHV0Ok1vZGVscy5JbnB1dE1vZGVsKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkU2VydmljZUlucHV0TmFtZSA9ICBpbnN0YW5jZS5ub3JtYWxpemVkTmFtZSArICdfJyArIGlucHV0Lm5hbWU7CisgICAgICAgICAgICAgICAgbGV0IGlucHV0QWxyZWFkeUluU2VydmljZTogTW9kZWxzLklucHV0TW9kZWwgPSBfLmZpbmQodGhpcy4kc2NvcGUuY29tcG9uZW50LmlucHV0cywgKHNlcnZpY2VJbnB1dDogTW9kZWxzLklucHV0TW9kZWwpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VJbnB1dC5uYW1lID09PSBleHBlY3RlZFNlcnZpY2VJbnB1dE5hbWU7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgaWYoaW5wdXRBbHJlYWR5SW5TZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0LmlzQWxyZWFkeVNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYWxyZWFkeVNlbGVjdGVkSW5wdXQucHVzaChpbnB1dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuaXNBbHJlYWR5U2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmluc3RhbmNlSW5wdXRzTWFwW2luc3RhbmNlLnVuaXF1ZUlkXSA9IGFscmVhZHlTZWxlY3RlZElucHV0OworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6IHZvaWQgPT4geworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pbnN0YW5jZUlucHV0c01hcCA9IG5ldyBNb2RlbHMuSW5zdGFuY2VzSW5wdXRzTWFwRGF0YSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlbGVjdGVkSW5wdXRzID0gbmV3IEFycmF5PE1vZGVscy5JbnB1dE1vZGVsPigpOworCisgICAgICAgICAgICAvLyBXaHkgZG8gd2UgbmVlZCB0aGlzPyB3ZSBjYWxsIHRoaXMgbGF0ZXIuCisgICAgICAgICAgICAvL3RoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRDb21wb25lbnRJbnB1dHMoKTsKKworICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChjb21wb25lbnRJbnN0YW5jZXM6QXJyYXk8Q29tcG9uZW50SW5zdGFuY2U+KSA9PiB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coImNvbXBvbmVudCBpbnN0YW5jZXMgbG9hZGVkOiAiLCBjb21wb25lbnRJbnN0YW5jZXMpOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZmSW5zdGFuY2VzTGlzdCA9IGNvbXBvbmVudEluc3RhbmNlczsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vVGhpcyBmdW5jdGlvbiB3aWxsIGdldCBhbCBjb21wb25lbnQgaW5zdGFuY2UgZm9yIHRoZSBsZWZ0IHRhYmxlIC0gaW4gZnV0dXJlIHRoZSBpbnN0YW5jZXMgd2lsbCBiZSBmaWx0ZXIgYWNjb3JkaW5nIHRvIHNlYXJjaCB0ZXh0CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VzRmlsdGVyZWRCeUlucHV0c0FuZFByb3BlcnRpZXMoKS50aGVuKG9uU3VjY2Vzcyk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIHNlcnZpY2UgaW5wdXRzIGZvciB0aGUgcmlnaHQgdGFibGUKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRDb21wb25lbnRJbnB1dHMoKTsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2hlbiBjbGlja2luZyBvbiBpbnN0YW5jZSBpbiB0aGUgbGVmdCB0YWJsZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgYWxsIGluc3RhbmNlIGlucHV0cworICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLiRzY29wZS5sb2FkSW5zdGFuY2VJbnB1dHMgPSAoaW5zdGFuY2U6Q29tcG9uZW50SW5zdGFuY2UpOiBuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGRlZmVycmVkID0gdGhpcy4kcS5kZWZlcigpOworCisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChpbnB1dHM6QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmlucHV0cyA9IGlucHV0czsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlRW5hYmxlU2VsZWN0ZWRJbnB1dHMoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRydWUpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25FcnJvciA9ICgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGlmKCFpbnN0YW5jZS5pbnB1dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmdldENvbXBvbmVudEluc3RhbmNlSW5wdXRzKGluc3RhbmNlLnVuaXF1ZUlkLCBpbnN0YW5jZS5jb21wb25lbnRVaWQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlRW5hYmxlU2VsZWN0ZWRJbnB1dHMoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdoZW4gY2xpY2tpbmcgb24gaW5zdGFuY2UgaW5wdXQgaW4gdGhlIGxlZnQgb3IgcmlnaHQgdGFibGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBpbnB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aGlzLiRzY29wZS5sb2FkSW5wdXRQcm9wZXJ0aWVzRm9ySW5zdGFuY2UgPSAoaW5zdGFuY2VJZDpzdHJpbmcsIGlucHV0Ok1vZGVscy5JbnB1dE1vZGVsKTogbmcuSVByb21pc2U8Ym9vbGVhbj4gPT4geworICAgICAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAocHJvcGVydGllczpBcnJheTxNb2RlbHMuUHJvcGVydHlNb2RlbD4pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBvbkVycm9yID0gKCkgPT4geworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGZhbHNlKQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBpZighaW5wdXQucHJvcGVydGllcykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQuZ2V0Q29tcG9uZW50SW5zdGFuY2VJbnB1dFByb3BlcnRpZXMoaW5zdGFuY2VJZCwgaW5wdXQudW5pcXVlSWQpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXaGVuIGNsaWNraW5nIG9uIGlucHV0IGluIHRoZSByaWdodCB0YWJsZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgYWxsIGlucHV0cyBvZiB0aGUgc2VsZWN0ZWQgaW5wdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGhpcy4kc2NvcGUubG9hZElucHV0SW5wdXRzID0gKGlucHV0Ok1vZGVscy5JbnB1dE1vZGVsKTogbmcuSVByb21pc2U8Ym9vbGVhbj4gPT4geworICAgICAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3MgPSAoKSA9PiB7IGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7IH07CisgICAgICAgICAgICAgICAgbGV0IG9uRXJyb3IgPSAoKSA9PiB7IGRlZmVycmVkLnJlc29sdmUoZmFsc2UpOyB9OworCisgICAgICAgICAgICAgICAgaWYoIWlucHV0LmlucHV0cykgeyAvLyBDYWNoaW5nLCBpZiBleGlzdHMgZG8gbm90IGdldCBpdC4KKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmdldFNlcnZpY2VJbnB1dElucHV0cyhpbnB1dC51bmlxdWVJZCkudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdoZW4gcHJlc3NpbmcgdGhlIGFycm93LCB3ZSBjcmVhdGUgc2VydmljZSBpbnB1dHMgZnJvbSB0aGUgaW5wdXRzIHNlbGVjdGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9uQXJyb3dQcmVzc2VkID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChpbnB1dHNDcmVhdGVkOiBBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4pID0+IHsKKworICAgICAgICAgICAgICAgICAgICAvL2Rpc2FibGVkIGFsbCB0aGUgaW5wdXRzIGluIHRoZSBsZWZ0IHRhYmxlCisgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLiRzY29wZS5pbnN0YW5jZUlucHV0c01hcCwgKGlucHV0czpBcnJheTxNb2RlbHMuSW5wdXRNb2RlbD4sIGluc3RhbmNlSWQ6c3RyaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goaW5wdXRzLCAoaW5wdXQ6TW9kZWxzLklucHV0TW9kZWwpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pc0FscmVhZHlTZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb2xvclRvSXRlbXMoaW5wdXRzQ3JlYXRlZCk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmNyZWF0ZUlucHV0c0Zvcm1JbnN0YW5jZXModGhpcy4kc2NvcGUuaW5zdGFuY2VJbnB1dHNNYXApLnRoZW4ob25TdWNjZXNzKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlbGV0ZUlucHV0ID0gKGlucHV0OiBNb2RlbHMuSW5wdXRNb2RlbCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICB2YXIgb25EZWxldGUgPSAoKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9uU3VjY2VzcyA9IChkZWxldGVkSW5wdXQ6IE1vZGVscy5JbnB1dE1vZGVsLCBjb21wb25lbnRJbnN0YW5jZUlkOnN0cmluZyk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBjb21wb25lbnQuaW5wdXRzIHRoZSBkZWxldGVkIGlucHV0IChzZXJ2aWNlIGlucHV0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1haW5pbmdTZXJ2aWNlSW5wdXRzOkFycmF5PE1vZGVscy5JbnB1dE1vZGVsPiA9IF8uZmlsdGVyKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pbnB1dHMsIChpbnB1dDpNb2RlbHMuSW5wdXRNb2RlbCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LnVuaXF1ZUlkICE9PSBkZWxldGVkSW5wdXQudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pbnB1dHMgPSByZW1haW5pbmdTZXJ2aWNlSW5wdXRzOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBkZWxldGVkIGlucHV0LCBhbmQgc2V0IGRpc2FibGV8ZW5hYmxlIHRoZSBkZWxldGVkIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZElucHV0Q29tcG9uZW50SW5zdGFuY2U6Q29tcG9uZW50SW5zdGFuY2UgPSBfLmZpbmQodGhpcy4kc2NvcGUudmZJbnN0YW5jZXNMaXN0LCAoaW5zdGFuY2VXaXRoQ2hpbGRUb0RlbGV0ZTpDb21wb25lbnRJbnN0YW5jZSk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlV2l0aENoaWxkVG9EZWxldGUudW5pcXVlSWQgPT09IGNvbXBvbmVudEluc3RhbmNlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUVuYWJsZVNlbGVjdGVkSW5wdXRzKGRlbGV0ZWRJbnB1dENvbXBvbmVudEluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgb25GYWlsZWQgPSAoZXJyb3I6YW55KSA6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkVycm9yIGRlbGV0aW5nIGlucHV0Iik7CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb2xvclRvSXRlbXMoW2lucHV0XSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHNlcnZpY2UgaW5wdXRzIG9mIGlucHV0IChzbyBhZnRlciBkZWxldGUgd2Ugd2lsbCBrbm93IHRoZSBjb21wb25lbnQgaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxvYWRJbnB1dElucHV0cyhpbnB1dCkudGhlbigocmVzdWx0OmJvb2xlYW4pOnZvaWQ9PnsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgaW5wdXQuaW5wdXRzLmxlbmd0aD4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudEluc3RhbmNlSWQ6c3RyaW5nID0gaW5wdXQuaW5wdXRzWzBdLmNvbXBvbmVudEluc3RhbmNlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmRlbGV0ZVNlcnZpY2VJbnB1dChpbnB1dC51bmlxdWVJZCkudGhlbigoZGVsZXRlZElucHV0OiBNb2RlbHMuSW5wdXRNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzcyhkZWxldGVkSW5wdXQsIGNvbXBvbmVudEluc3RhbmNlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uRmFpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIC8vIEdldCBjb25maXJtYXRpb24gbW9kYWwgdGV4dCBmcm9tIG1lbnUuanNvbgorICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9ICJkZWxldGVJbnB1dCI7CisgICAgICAgICAgICAgICAgdmFyIHRpdGxlOnN0cmluZyA9IHRoaXMuJHNjb3BlLnNkY01lbnUuYWxlcnRNZXNzYWdlc1tzdGF0ZV0udGl0bGU7CisgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2U6c3RyaW5nID0gdGhpcy4kc2NvcGUuc2RjTWVudS5hbGVydE1lc3NhZ2VzW3N0YXRlXS5tZXNzYWdlLmZvcm1hdChbaW5wdXQubmFtZV0pOworCisgICAgICAgICAgICAgICAgLy8gT3BlbiBjb25maXJtYXRpb24gbW9kYWwKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkFsZXJ0TW9kYWwodGl0bGUsIG1lc3NhZ2UpLnRoZW4ob25EZWxldGUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgYWRkQ29sb3JUb0l0ZW1zID0gKGlucHV0c0NyZWF0ZWQ6QXJyYXk8TW9kZWxzLklucHV0TW9kZWw+KTp2b2lkID0+IHsKKworICAgICAgICAgICAgLy8gQWRkaW5nIGNvbG9yIHRvIHRoZSBuZXcgaW5wdXRzIChyaWdodCB0YWJsZSkKKyAgICAgICAgICAgIF8uZm9yRWFjaChpbnB1dHNDcmVhdGVkLCAoaW5wdXQpID0+IHsKKyAgICAgICAgICAgICAgICBpbnB1dC5pc05ldyA9IHRydWU7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gUmVtb3ZpbmcgY29sb3IgdG8gdGhlIG5ldyBpbnB1dHMgKHJpZ2h0IHRhYmxlKQorICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGlucHV0c0NyZWF0ZWQsIChpbnB1dCkgPT4geworICAgICAgICAgICAgICAgICAgICBpbnB1dC5pc05ldyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLiRhcHBseSgpOworICAgICAgICAgICAgfSwgMzAwMCk7CisgICAgICAgIH07CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9zZXJ2aWNlLWlucHV0L3NlcnZpY2UtaW5wdXRzLXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaW5wdXRzL3NlcnZpY2UtaW5wdXQvc2VydmljZS1pbnB1dHMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9zZXJ2aWNlLWlucHV0L3NlcnZpY2UtaW5wdXRzLXZpZXcuaHRtbApAQCAtMCwwICsxLDIwNSBAQAorPGRpdiBjbGFzcz0id29ya3NwYWNlLWlucHV0cyI+CisgICAgPGRpdiBjbGFzcz0idGFibGUtY29udGFpbmVyLWZsZXgiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1pbnB1dHMtc2VhcmNoIHB1bGwtbGVmdCBoaWRlbWUiPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJ3LXNkYy1pbnB1dHMtc2VhcmNoLWlucHV0IiBwbGFjZWhvbGRlcj0iU2VhcmNoIi8+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWFyY2gtaWNvbi1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3LXNkYy1zZWFyY2gtaWNvbiBpbnB1dHMtc2VhcmNoLWljb24gbWFnbmlmaWNhdGlvbi13aGl0ZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIiPlJlc291cmNlIGluc3RhbmNlIGlucHV0czwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbG9hZGVyIiBuZy1jbGFzcz0ieyd0bHYtbG9hZGVyIGxhcmdlIGxvYWRlcic6IGlzTG9hZGluZ30iPjwvZGl2PgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisKKyAgICAgICAgICAgICAgICAgICAgPGV4cGFuZC1jb2xsYXBzZSBleHBhbmRlZC1zZWxlY3Rvcj0iLnZmLWluc3RhbmNlLWxpc3Que3skaW5kZXh9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLXRhYmxlLXJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLWRhdGEtZnVuY3Rpb249ImxvYWRJbnN0YW5jZUlucHV0cyhpbnN0YW5jZSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMtY2xvc2Utb24taW5pdD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcGVhdC1zdGFydD0iaW5zdGFuY2UgaW4gdmZJbnN0YW5jZXNMaXN0IHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLWlucHV0cy10YWJsZS1pY29uIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0gdGV4dCIgZGF0YS10ZXN0cy1pZD0iaW5wdXRzLXZmLWluc3RhbmNlLXt7JGluZGV4fX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtdGV4dCI+e3tpbnN0YW5jZS5uYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICA8L2V4cGFuZC1jb2xsYXBzZT4KKworICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBjbGFzcz0idmYtaW5zdGFuY2UtbGlzdCB7eyRpbmRleH19Ij4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGV4cGFuZC1jb2xsYXBzZSBleHBhbmRlZC1zZWxlY3Rvcj0iLmlucHV0LWxpc3Que3skcGFyZW50LiRpbmRleH19LXt7JGluZGV4fX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJleHBhbmQtY29sbGFwc2UtdGFibGUtcm93IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLWRhdGEtZnVuY3Rpb249ImxvYWRJbnB1dFByb3BlcnRpZXNGb3JJbnN0YW5jZShpbnN0YW5jZS51bmlxdWVJZCwgaW5wdXQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy1jbG9zZS1vbi1pbml0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXJlcGVhdC1zdGFydD0iaW5wdXQgaW4gaW5zdGFuY2UuaW5wdXRzIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtcm93IiBuZy1jbGFzcz0ieydzZWxlY3RlZCc6IHNlbGVjdGVkSW5wdXQudW5pcXVlSWQgPT09IGlucHV0LnVuaXF1ZUlkfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlLXRleHQiPnt7aW5wdXQubmFtZX19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1pbnB1dHMtdGFibGUtaWNvbiI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWl0ZW0iPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlLXRleHQiPkRlc2NyaXB0aW9uOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2lucHV0LmRlc2NyaXB0aW9ufX0iPnt7aW5wdXQuZGVzY3JpcHRpb259fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1pdGVtICI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0aXRsZS10ZXh0Ij5WRiBJbnN0YW5jZTo8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tpbnN0YW5jZS5uYW1lfX0iPnt7aW5zdGFuY2UubmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtdGV4dCI+VHlwZTo8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tpbnB1dC50eXBlfX0iPnt7aW5wdXQudHlwZX19IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJpbnB1dC1jaGVjay1ib3giCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgPSJpbnB1dC5pc0FscmVhZHlTZWxlY3RlZCB8fCBpc1ZpZXdNb2RlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RjLWNoZWNrbGlzdC1tb2RlbD0iaW5zdGFuY2VJbnB1dHNNYXBbaW5zdGFuY2UudW5pcXVlSWRdIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkYy1jaGVja2xpc3QtdmFsdWU9ImlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImlucHV0cy1jaGVja2JveC17eyRpbmRleH19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xpY2s9IiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkiPjwvc2RjLWNoZWNrYm94PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworCisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4cGFuZC1jb2xsYXBzZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1lbmQ9IiIgY2xhc3M9ImlucHV0LWxpc3Qge3skcGFyZW50LiRpbmRleH19LXt7JGluZGV4fX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXJvdyIgbmctaWY9ImlucHV0LnByb3BlcnRpZXMubGVuZ3RoPT09MCI+Tm8gcHJvcGVydGllcyB0byBkaXNwbGF5PC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0icHJvcGVydHkgaW4gaW5wdXQucHJvcGVydGllcyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9wZXJ0eS1yb3cgZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1pdGVtIHRleHQgcHJvcGVydHktbmFtZS1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0aXRsZS1ibHVlLXRleHQgcHJvcGVydHktbmFtZS10ZXh0IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7cHJvcGVydHkubmFtZX19Ij57e3Byb3BlcnR5Lm5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCBpbnN0YW5jZS1uYW1lLXRleHQiIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5uYW1lfX0iPnt7cHJvcGVydHkubmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0eXBlLXNjaGVtYS1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7cHJvcGVydHkudHlwZX19Ij57e3Byb3BlcnR5LnR5cGV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idHlwZS1zY2hlbWEtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3Byb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eS50eXBlfX0iPnt7cHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGV9fSA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9ImlucHV0cy1idXR0b24tY29udGFpbmVyIHB1bGwtbGVmdCI+CisgICAgICAgIDxkaXYgbmctY2xpY2s9Im9uQXJyb3dQcmVzc2VkKCkiIGNsYXNzPSJyaWdodC1hcnJvdy1idG4iIGRhdGEtdGVzdHMtaWQ9ImFkZC1pbnB1dHMtdG8tc2VydmljZS1idXR0b24iPjwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0idGFibGUtY29udGFpbmVyLWZsZXgiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1pbnB1dHMtc2VhcmNoIHB1bGwtbGVmdCI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Inctc2RjLWlucHV0cy1zZWFyY2gtaW5wdXQiIGRhdGEtbmctbW9kZWw9InNlYXJjaC5maWx0ZXJUZXJtIiBwbGFjZWhvbGRlcj0iU2VhcmNoIiBkYXRhLW5nLW1vZGVsLW9wdGlvbnM9IntkZWJvdW5jZTogMjAwfSIvPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoLWljb24tY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idy1zZGMtc2VhcmNoLWljb24gaW5wdXRzLXNlYXJjaC1pY29uIG1hZ25pZmljYXRpb24td2hpdGUiPjwvc3Bhbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIj5TZXJ2aWNlIElucHV0czwvZGl2PgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGV4cGFuZC1jb2xsYXBzZSBleHBhbmRlZC1zZWxlY3Rvcj0iLnNlcnZpY2UtaW5wdXRzLnt7JGluZGV4fX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS10YWJsZS1yb3ciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC1kYXRhLWZ1bmN0aW9uPSJsb2FkSW5wdXRJbnB1dHMoc2VydmljZUlucHV0KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy1jbG9zZS1vbi1pbml0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctcmVwZWF0LXN0YXJ0PSJzZXJ2aWNlSW5wdXQgaW4gY29tcG9uZW50LmlucHV0cyB8IGZpbHRlcjpzZWFyY2ggdHJhY2sgYnkgJGluZGV4ICI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1yb3cgc2VydmljZS1pbnB1dC1yb3cgIiBkYXRhLXRlc3RzLWlkPSJzZXJ2aWNlLWlucHV0LXt7JGluZGV4fX0iIG5nLWNsYXNzPSJzZXJ2aWNlSW5wdXQuaXNOZXcgPyAnbmV3LWlucHV0JzogJyciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlLXRleHQiPnt7c2VydmljZUlucHV0Lm5hbWV9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLWlucHV0cy10YWJsZS1pY29uIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1pdGVtIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlLXRleHQiPkRlc2NyaXB0aW9uOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7c2VydmljZUlucHV0LmRlc2NyaXB0aW9ufX0iPnt7c2VydmljZUlucHV0LmRlc2NyaXB0aW9ufX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtaXRlbSAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlLXRleHQiPlZGIEluc3RhbmNlOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7c2VydmljZUlucHV0Lm5hbWV9fSI+e3tzZXJ2aWNlSW5wdXQubmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtdGV4dCI+VHlwZTo8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3NlcnZpY2VJbnB1dC50eXBlfX0iPnt7c2VydmljZUlucHV0LnR5cGV9fSA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlbGV0ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyBkZWxldGUtaWNvbiByZW1vdmUtaW5wdXQtaWNvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnOiBpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iZGVsZXRlSW5wdXQoc2VydmljZUlucHV0KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9ImRlbGV0ZS1pbnB1dC17eyRpbmRleH19Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZXhwYW5kLWNvbGxhcHNlPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQtZW5kPSIiIGNsYXNzPSJzZXJ2aWNlLWlucHV0cyB7eyRpbmRleH19Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleHBhbmQtY29sbGFwc2UgZXhwYW5kZWQtc2VsZWN0b3I9Ii5pbnB1dC1pbnB1dHMtbGlzdC57eyRwYXJlbnQuJGluZGV4fX0te3skaW5kZXh9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS10YWJsZS1yb3ciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQtZGF0YS1mdW5jdGlvbj0ibG9hZElucHV0UHJvcGVydGllc0Zvckluc3RhbmNlKGlucHV0LmNvbXBvbmVudEluc3RhbmNlSWQsIGlucHV0KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMtY2xvc2Utb24taW5pdD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1yZXBlYXQtc3RhcnQ9ImlucHV0IGluIHNlcnZpY2VJbnB1dC5pbnB1dHMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1yb3ciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZS10ZXh0Ij57e2lucHV0Lm5hbWV9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmQtY29sbGFwc2UtaW5wdXRzLXRhYmxlLWljb24iPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1pdGVtIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtdGV4dCI+RGVzY3JpcHRpb246PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7aW5wdXQuZGVzY3JpcHRpb259fSI+e3tpbnB1dC5kZXNjcmlwdGlvbn19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWl0ZW0gIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlLXRleHQiPlZGIEluc3RhbmNlOjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e2luc3RhbmNlLmNvbXBvbmVudEluc3RhbmNlTmFtZX19Ij57e2luc3RhbmNlLmNvbXBvbmVudEluc3RhbmNlTmFtZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGl0bGUtdGV4dCI+VHlwZTo8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tpbnB1dC50eXBlfX0iPnt7aW5wdXQudHlwZX19IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhwYW5kLWNvbGxhcHNlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBjbGFzcz0iaW5wdXQtaW5wdXRzLWxpc3Qge3skcGFyZW50LiRpbmRleH19LXt7JGluZGV4fX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXJvdyIgbmctaWY9ImlucHV0LnByb3BlcnRpZXMubGVuZ3RoPT09MCI+Tm8gcHJvcGVydGllcyB0byBkaXNwbGF5PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9InByb3BlcnR5IGluIGlucHV0LnByb3BlcnRpZXMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvcGVydHktcm93IGZsZXgtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtaXRlbSB0ZXh0IHByb3BlcnR5LW5hbWUtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRpdGxlLWJsdWUtdGV4dCBwcm9wZXJ0eS1uYW1lLXRleHQiIHRvb2x0aXBzIHRvb2x0aXBzLWNvbnRlbnQ9Int7cHJvcGVydHkubmFtZX19Ij57e3Byb3BlcnR5Lm5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCBpbnN0YW5jZS1uYW1lLXRleHQiIHRvb2x0aXBzIHRvb2x0aXBzLWNvbnRlbnQ9Int7cHJvcGVydHkubmFtZX19Ij57e3Byb3BlcnR5Lm5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idHlwZS1zY2hlbWEtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcHMtY29udGVudD0ie3twcm9wZXJ0eS50eXBlfX0iPnt7cHJvcGVydHkudHlwZX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0eXBlLXNjaGVtYS1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0b29sdGlwcyB0b29sdGlwcy1jb250ZW50PSJ7e3Byb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eS50eXBlfX0iPnt7cHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGV9fSA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9wZXJmZWN0LXNjcm9sbGJhcj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbnB1dHMvc2VydmljZS1pbnB1dC9zZXJ2aWNlLWlucHV0cy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9pbnB1dHMvc2VydmljZS1pbnB1dC9zZXJ2aWNlLWlucHV0cy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTYxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9zZXJ2aWNlLWlucHV0L3NlcnZpY2UtaW5wdXRzLmxlc3MKQEAgLTAsMCArMSw1NCBAQAorLndvcmtzcGFjZS1pbnB1dHMgeworCisgICAgLnNlcnZpY2UtaW5wdXRzLXZpZXcgeworCisgICAgICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgICAgICB3aWR0aDoxMDAlICFpbXBvcnRhbnQ7CisgICAgICAgIH0KKworICAgICAgICAudGFibGUtbG9hZGVyIHsKKyAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgIHRvcDoyMTVweDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLmluZmluaXRlLXNjcm9sbCB7CisKKyAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOworICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CisgICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OworICAgIH0KKworICAgIC5jbGFzc193aXRoX2Nzc19wcm9wc19sZWFkaW5nX3RvX2Ffc2Nyb2xsIHsKKyAgICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgICBvdmVyZmxvdy15OiBhdXRvOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgIC5leHBhbmQtY29sbGFwc2UtdGFibGUtcm93IHsKKyAgICAgICAgICAgIC5zZXJ2aWNlLWlucHV0LXJvdyB7CisgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxNXB4OworICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiByZ2JhKDEyMCwgMTM2LCAxNDgsIDAuMjYpIHNvbGlkIDFweDsKKworICAgICAgICAgICAgICAgLmRlbGV0ZSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA1MHB4OworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLnJlbW92ZS1pbnB1dC1pY29uIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgICAgICAgICB0b3A6IDEycHg7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAxOHB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC5yZW1vdmUtaW5wdXQtaWNvbjpob3ZlciB7CisgICAgICAgICAgICAgICAgICAgIC5kZWxldGUtaWNvbi1ob3ZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvbWFuYWdlbWVudC13b3JrZmxvdy9tYW5hZ2VtZW50LXdvcmtmbG93LXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL21hbmFnZW1lbnQtd29ya2Zsb3cvbWFuYWdlbWVudC13b3JrZmxvdy12aWV3LW1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWIxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL21hbmFnZW1lbnQtd29ya2Zsb3cvbWFuYWdlbWVudC13b3JrZmxvdy12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsMTI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElNYW5hZ2VtZW50V29ya2Zsb3dWaWV3TW9kZWxTY29wZSBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIHZlbmRvck1vZGVsOlZlbmRvck1vZGVsOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBWZW5kb3JNb2RlbCB7CisgICAgICAgIGFydGlmYWN0czogTW9kZWxzLkFydGlmYWN0R3JvdXBNb2RlbDsKKyAgICAgICAgc2VydmljZUlEOiBzdHJpbmc7CisgICAgICAgIHJlYWRvbmx5OiBib29sZWFuOworICAgICAgICBzZXNzaW9uSUQ6IHN0cmluZzsKKyAgICAgICAgcmVxdWVzdElEOiBzdHJpbmc7CisgICAgICAgIGRpYWdyYW1UeXBlOiBzdHJpbmc7CisgICAgICAgIHBhcnRpY2lwYW50czpBcnJheTxwYXJ0aWNpcGFudD47CisKKyAgICAgICAgY29uc3RydWN0b3IoYXJ0aWZhY3RzOiBNb2RlbHMuQXJ0aWZhY3RHcm91cE1vZGVsLCBzZXJ2aWNlSUQ6c3RyaW5nLCByZWFkb25seTpib29sZWFuLCBzZXNzaW9uSUQ6c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SUQ6c3RyaW5nLCBkaWFncmFtVHlwZTpzdHJpbmcsIHBhcnRpY2lwYW50czpBcnJheTxwYXJ0aWNpcGFudD4peworICAgICAgICAgICAgdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7CisgICAgICAgICAgICB0aGlzLnNlcnZpY2VJRCA9IHNlcnZpY2VJRDsKKyAgICAgICAgICAgIHRoaXMucmVhZG9ubHkgPSByZWFkb25seTsKKyAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklEID0gc2Vzc2lvbklEOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SUQgPSByZXF1ZXN0SUQ7CisgICAgICAgICAgICB0aGlzLmRpYWdyYW1UeXBlID0gZGlhZ3JhbVR5cGU7CisgICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50cyA9IHBhcnRpY2lwYW50czsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBNYW5hZ2VtZW50V29ya2Zsb3dWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICd1dWlkNCcKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJTWFuYWdlbWVudFdvcmtmbG93Vmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdXVpZDQ6YW55KSB7CisKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVTZWxlY3RlZE1lbnVJdGVtKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGdldFBhcnRpY2lwYW50cygpOkFycmF5PHBhcnRpY2lwYW50PiB7CisgICAgICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjogIjEiLAorICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJDdXN0b21lciJ9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjogIjIiLAorICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJDQ0QiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6ICIzIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6ICI0IiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTVNPIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOiAiNSIsCisgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlNETi1DIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOiAiNiIsCisgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkEmQUkiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6ICI3IiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQVBQLUMiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6ICI4IiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ2xvdWQiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6ICI5IiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRENBRSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjogIjEwIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQUxUUyIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjogIjExIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiVkYiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGluaXRTY29wZSgpOnZvaWQgeworICAgICAgICAgICAgdGhpcy4kc2NvcGUudmVuZG9yTW9kZWwgPSBuZXcgVmVuZG9yTW9kZWwoCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmFydGlmYWN0cy5maWx0ZXJlZEJ5VHlwZShVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRISVJEX1BBUlRZX1JFU0VSVkVEX1RZUEVTLldPUktGTE9XKSwKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWQsCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNWaWV3TW9kZSgpLAorICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVzZXIudXNlcklkLAorICAgICAgICAgICAgICAgIHRoaXMudXVpZDQuZ2VuZXJhdGUoKSwKKyAgICAgICAgICAgICAgICBVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRISVJEX1BBUlRZX1JFU0VSVkVEX1RZUEVTLldPUktGTE9XLAorICAgICAgICAgICAgICAgIE1hbmFnZW1lbnRXb3JrZmxvd1ZpZXdNb2RlbC5nZXRQYXJ0aWNpcGFudHMoKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudGhpcmRQYXJ0eSA9IHRydWU7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKHRydWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9tYW5hZ2VtZW50LXdvcmtmbG93L21hbmFnZW1lbnQtd29ya2Zsb3ctdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9tYW5hZ2VtZW50LXdvcmtmbG93L21hbmFnZW1lbnQtd29ya2Zsb3ctdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTk2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL21hbmFnZW1lbnQtd29ya2Zsb3cvbWFuYWdlbWVudC13b3JrZmxvdy12aWV3Lmh0bWwKQEAgLTAsMCArMSwzIEBACis8ZGl2IGNsYXNzPSJ3b3Jrc3BhY2UtbWFuYWdlbWVudC13b3JrZmxvdyI+CisgICAgPHB1bmNoLW91dCBuYW1lPSInc2VxdWVuY2UtZGlhZ3JhbSciIGRhdGE9InZlbmRvck1vZGVsIiAgdXNlcj0idXNlciIgb24tZXZlbnQ9Im9uVmVuZG9yRXZlbnQiPjwvcHVuY2gtb3V0PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL25ldHdvcmstY2FsbC1mbG93L25ldHdvcmstY2FsbC1mbG93LXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL25ldHdvcmstY2FsbC1mbG93L25ldHdvcmstY2FsbC1mbG93LXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0ZjFjNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvbmV0d29yay1jYWxsLWZsb3cvbmV0d29yay1jYWxsLWZsb3ctdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vLi4vLi4vLi4vcmVmZXJlbmNlcyIvPgorbW9kdWxlIFNkYy5WaWV3TW9kZWxzIHsKKyAgICAndXNlIHN0cmljdCc7CisKKyAgICBleHBvcnQgaW50ZXJmYWNlIElOZXR3b3JrQ2FsbEZsb3dWaWV3TW9kZWxTY29wZSBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIHZlbmRvck1lc3NhZ2VNb2RlbDpWZW5kb3JNb2RlbDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgcGFydGljaXBhbnQgeworICAgICAgICBuYW1lOnN0cmluZzsKKyAgICAgICAgaWQ6c3RyaW5nOworCisgICAgICAgIGNvbnN0cnVjdG9yKGluc3RhbmNlOk1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlKXsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IGluc3RhbmNlLm5hbWU7CisgICAgICAgICAgICB0aGlzLmlkID0gaW5zdGFuY2UudW5pcXVlSWQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGV4cG9ydCBjbGFzcyBOZXR3b3JrQ2FsbEZsb3dWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICAndXVpZDQnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SU5ldHdvcmtDYWxsRmxvd1ZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHV1aWQ0OmFueSkgeworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlU2VsZWN0ZWRNZW51SXRlbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBnZXRWRlBhcnRpY2lwYW50c0Zyb21JbnN0YW5jZXMoaW5zdGFuY2VzOkFycmF5PE1vZGVscy5Db21wb25lbnRzSW5zdGFuY2VzLkNvbXBvbmVudEluc3RhbmNlPik6QXJyYXk8cGFydGljaXBhbnQ+IHsKKyAgICAgICAgICAgIGxldCBwYXJ0aWNpcGFudHMgPSBbXTsKKyAgICAgICAgICAgIF8uZm9yRWFjaChpbnN0YW5jZXMsKGluc3RhbmNlKT0+IHsKKyAgICAgICAgICAgICAgICBpZihVdGlscy5Db25zdGFudHMuUmVzb3VyY2VUeXBlLlZGID09IGluc3RhbmNlLm9yaWdpblR5cGUpeworICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudHMucHVzaChuZXcgcGFydGljaXBhbnQoaW5zdGFuY2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBwYXJ0aWNpcGFudHM7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlKCk6dm9pZCB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS52ZW5kb3JNZXNzYWdlTW9kZWwgPSBuZXcgVmVuZG9yTW9kZWwoCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LmFydGlmYWN0cy5maWx0ZXJlZEJ5VHlwZShVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRISVJEX1BBUlRZX1JFU0VSVkVEX1RZUEVTLk5FVFdPUktfQ0FMTF9GTE9XKSwKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWQsCisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNWaWV3TW9kZSgpLAorICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVzZXIudXNlcklkLAorICAgICAgICAgICAgICAgIHRoaXMudXVpZDQuZ2VuZXJhdGUoKSwKKyAgICAgICAgICAgICAgICBVdGlscy5Db25zdGFudHMuQXJ0aWZhY3RUeXBlLlRISVJEX1BBUlRZX1JFU0VSVkVEX1RZUEVTLk5FVFdPUktfQ0FMTF9GTE9XLAorICAgICAgICAgICAgICAgIHRoaXMuZ2V0VkZQYXJ0aWNpcGFudHNGcm9tSW5zdGFuY2VzKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS50aGlyZFBhcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvbmV0d29yay1jYWxsLWZsb3cvbmV0d29yay1jYWxsLWZsb3ctdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9uZXR3b3JrLWNhbGwtZmxvdy9uZXR3b3JrLWNhbGwtZmxvdy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlM2U4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvbmV0d29yay1jYWxsLWZsb3cvbmV0d29yay1jYWxsLWZsb3ctdmlldy5odG1sCkBAIC0wLDAgKzEsMyBAQAorPGRpdiBjbGFzcz0id29ya3NwYWNlLW5ldHdvcmstY2FsbC1mbG93Ij4KKyAgICA8cHVuY2gtb3V0IG5hbWU9IidzZXF1ZW5jZS1kaWFncmFtJyIgZGF0YT0idmVuZG9yTWVzc2FnZU1vZGVsIiAgdXNlcj0idXNlciIgb24tZXZlbnQ9Im9uVmVuZG9yRXZlbnQiPjwvcHVuY2gtb3V0PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Byb2R1Y3QtaGllcmFyY2h5L3Byb2R1Y3QtaGllcmFyY2h5LXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Byb2R1Y3QtaGllcmFyY2h5L3Byb2R1Y3QtaGllcmFyY2h5LXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmNzdhNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvZHVjdC1oaWVyYXJjaHkvcHJvZHVjdC1oaWVyYXJjaHktdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDEzNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gNC83LzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJUHJvZHVjdEhpZXJhcmNoeVNjb3BlIGV4dGVuZHMgSVdvcmtzcGFjZVZpZXdNb2RlbFNjb3BlIHsKKworICAgICAgICBjYXRlZ29yaWVzT3B0aW9uczogQXJyYXk8TW9kZWxzLklNYWluQ2F0ZWdvcnk+OworICAgICAgICBwcm9kdWN0Ok1vZGVscy5Db21wb25lbnRzLlByb2R1Y3Q7CisgICAgICAgIGlzTG9hZGluZzpib29sZWFuOworICAgICAgICBzaG93RHJvcERvd246Ym9vbGVhbjsKKworICAgICAgICBvbklucHV0VGV4dENsaWNrZWQoKTp2b2lkOworICAgICAgICBvbkdyb3VwU2VsZWN0ZWQoY2F0ZWdvcnk6IE1vZGVscy5JTWFpbkNhdGVnb3J5LCBzdWJjYXRlZ29yeTogTW9kZWxzLklTdWJDYXRlZ29yeSwgZ3JvdXA6IE1vZGVscy5JR3JvdXApOnZvaWQ7CisgICAgICAgIGNsaWNrT3V0c2lkZSgpOnZvaWQ7CisgICAgICAgIGRlbGV0ZUdyb3VwKHVuaXF1ZUlkOnN0cmluZyk6dm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUHJvZHVjdEhpZXJhcmNoeVZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5DYWNoZVNlcnZpY2UnLAorICAgICAgICAgICAgJ0NvbXBvbmVudEZhY3RvcnknLAorICAgICAgICAgICAgJyRzdGF0ZScKKyAgICAgICAgXTsKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJUHJvZHVjdEhpZXJhcmNoeVNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNhY2hlU2VydmljZTpTZGMuU2VydmljZXMuQ2FjaGVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIENvbXBvbmVudEZhY3Rvcnk6IFNkYy5VdGlscy5Db21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTpuZy51aS5JU3RhdGVTZXJ2aWNlKSB7CisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUucHJvZHVjdCA9IDxNb2RlbHMuQ29tcG9uZW50cy5Qcm9kdWN0PnRoaXMuJHNjb3BlLmdldENvbXBvbmVudCgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVTZWxlY3RlZE1lbnVJdGVtKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGluaXRDYXRlZ29yaWVzID0gKCkgPT4geworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2F0ZWdvcmllc09wdGlvbnMgPSBhbmd1bGFyLmNvcHkodGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdwcm9kdWN0Q2F0ZWdvcmllcycpKTsKKyAgICAgICAgICAgIGxldCBzZWxlY3RlZEdyb3VwOkFycmF5PE1vZGVscy5JR3JvdXA+ICA9IFtdOworICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuJHNjb3BlLnByb2R1Y3QuY2F0ZWdvcmllcywgKGNhdGVnb3J5OiBNb2RlbHMuSU1haW5DYXRlZ29yeSkgPT4geworICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjYXRlZ29yeS5zdWJjYXRlZ29yaWVzLCAoc3ViY2F0ZWdvcnk6TW9kZWxzLklTdWJDYXRlZ29yeSkgPT4geworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwID0gc2VsZWN0ZWRHcm91cC5jb25jYXQoc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuJHNjb3BlLmNhdGVnb3JpZXNPcHRpb25zLCAoY2F0ZWdvcnk6IE1vZGVscy5JTWFpbkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMsIChzdWJjYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChzdWJjYXRlZ29yeS5ncm91cGluZ3MsIChncm91cDpNb2RlbHMuSVN1YkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50R3JvdXA6TW9kZWxzLklHcm91cCA9IF8uZmluZChzZWxlY3RlZEdyb3VwLCAoY29tcG9uZW50R3JvdXBPYmopID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50R3JvdXBPYmoudW5pcXVlSWQgPT0gZ3JvdXAudW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbXBvbmVudEdyb3VwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5pc0Rpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHNldEZvcm1WYWxpZGF0aW9uID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICAvL2lmKCF0aGlzLiRzY29wZS5wcm9kdWN0LmNhdGVnb3JpZXMgfHwgdGhpcy4kc2NvcGUucHJvZHVjdC5jYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCl7CisgICAgICAgICAgICAvLyAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlKGZhbHNlKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNleworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgIC8vIH0KKworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmc9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd0Ryb3BEb3duID1mYWxzZTsKKyAgICAgICAgICAgIHRoaXMuaW5pdENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgIHRoaXMuc2V0Rm9ybVZhbGlkYXRpb24oKTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25Hcm91cFNlbGVjdGVkID0gKGNhdGVnb3J5OiBNb2RlbHMuSU1haW5DYXRlZ29yeSwgc3ViY2F0ZWdvcnk6IE1vZGVscy5JU3ViQ2F0ZWdvcnksIGdyb3VwOiBNb2RlbHMuSUdyb3VwKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9kdWN0LmFkZEdyb3VwKGNhdGVnb3J5LCBzdWJjYXRlZ29yeSwgZ3JvdXApOworICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmN1cnJlbnQuZGF0YS51bnNhdmVkQ2hhbmdlcyA9ICF0aGlzLiRzY29wZS5pc1ZpZXdNb2RlKCk7CisgICAgICAgICAgICAgICAgZ3JvdXAuaXNEaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd0Ryb3BEb3duID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtVmFsaWRhdGlvbigpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUub25JbnB1dFRleHRDbGlja2VkID0gKCk6dm9pZCA9PiB7Ly9qdXN0IGVkaXQgdGhlIGNvbXBvbmVudCBpbiBwbGFjZSwgbm8gcG9wIHVwIG5vciBzZXJ2ZXIgdXBkYXRlID8KKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zaG93RHJvcERvd24gPSAhdGhpcy4kc2NvcGUuc2hvd0Ryb3BEb3duOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2xpY2tPdXRzaWRlID0gKCk6IGFueSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd0Ryb3BEb3duID0gZmFsc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5kZWxldGVHcm91cCA9ICh1bmlxdWVJZDpzdHJpbmcpIDogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgLy9kZWxldGUgZ3JvdXAgZnJvbSBjb21wb25lbnQKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9kdWN0LmRlbGV0ZUdyb3VwKHVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5jdXJyZW50LmRhdGEudW5zYXZlZENoYW5nZXMgPSAhdGhpcy4kc2NvcGUuaXNWaWV3TW9kZSgpOworICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgICAgICAvL2VuYWJsZWQgZ3JvdXAKKyAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuY2F0ZWdvcmllc09wdGlvbnMsIChjYXRlZ29yeTogTW9kZWxzLklNYWluQ2F0ZWdvcnkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGNhdGVnb3J5LnN1YmNhdGVnb3JpZXMsIChzdWJjYXRlZ29yeTpNb2RlbHMuSVN1YkNhdGVnb3J5KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBPYmo6TW9kZWxzLklHcm91cCA9IF8uZmluZCAoc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzLCAoZ3JvdXApID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAudW5pcXVlSWQgPT09IHVuaXF1ZUlkOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihncm91cE9iail7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBPYmouaXNEaXNhYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Byb2R1Y3QtaGllcmFyY2h5L3Byb2R1Y3QtaGllcmFyY2h5LXZpZXcuaHRtbCBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvZHVjdC1oaWVyYXJjaHkvcHJvZHVjdC1oaWVyYXJjaHktdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMzVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Byb2R1Y3QtaGllcmFyY2h5L3Byb2R1Y3QtaGllcmFyY2h5LXZpZXcuaHRtbApAQCAtMCwwICsxLDQwIEBACis8ZGl2IGNsYXNzPSJ3b3Jrc3BhY2UtaGllcmFyY2h5Ij4KKyAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1jb250YWluZXIiICBjbGlja2VkLW91dHNpZGU9IntvbkNsaWNrZWRPdXRzaWRlOiAnY2xpY2tPdXRzaWRlKCknLCBjbGlja2VkT3V0c2lkZUVuYWJsZTogJ3RydWUnfSIgPgorICAgICAgICA8aW5wdXQgcGxhY2Vob2xkZXI9IkFkZCBHcm91cCIgZGF0YS1uZy1jbGljaz0ib25JbnB1dFRleHRDbGlja2VkKCkiIGNsYXNzPSJkcm9wZG93bi1pbnB1dC10ZXh0IiAgZGF0YS1uZy1tb2RlbD0ic2VhcmNoLmZpbHRlclRlcm1zIiBkYXRhLW5nLWRpc2FibGVkPSJpc1ZpZXdNb2RlKCkiICBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ie2RlYm91bmNlOiAyMDB9Ii8+CisgICAgICAgIDxkaXYgZGF0YS1uZy1jbGFzcz0ieydzaG93Jzogc2hvd0Ryb3BEb3dufSIgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiID4KKyAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9ImZhbHNlIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9ImNhdGVnb3J5IGluIGNhdGVnb3JpZXNPcHRpb25zIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJzdWJjYXRlZ29yeSBpbiBjYXRlZ29yeS5zdWJjYXRlZ29yaWVzIHRyYWNrIGJ5ICRpbmRleCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1vcHRpb24iIG5nLXNob3c9IiFjYXRlZ29yeS5maWx0ZXJlZEdyb3VwIHx8IGNhdGVnb3J5LmZpbHRlcmVkR3JvdXAubGVuZ3RoID4gMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcnktY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcnkiPnt7Y2F0ZWdvcnkubmFtZX19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YmNhdGVnb3J5Ij57e3N1YmNhdGVnb3J5Lm5hbWV9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwaW5ncy1jb250YWluZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWluaXQ9Imdyb3VwLmZpbHRlclRlcm1zID0gZ3JvdXAubmFtZSArICcgJyArIGNhdGVnb3J5Lm5hbWUgKyAnICcgKyBzdWJjYXRlZ29yeS5uYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXJlcGVhdD0iZ3JvdXAgaW4gKGNhdGVnb3J5LmZpbHRlcmVkR3JvdXAgPSAoc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzICB8IGZpbHRlcjpzZWFyY2ggKSkgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwIiBkYXRhLW5nLWRpc2FibGVkPSJncm91cC5pc0Rpc2FibGVkIiBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkLWdyb3VwJzogZ3JvdXAuaXNEaXNhYmxlZH0iIG5nLWNsaWNrPSJvbkdyb3VwU2VsZWN0ZWQoY2F0ZWdvcnksIHN1YmNhdGVnb3J5LCBncm91cCkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuID57e2dyb3VwLm5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImhpZXJhcmNoeS1ncm91cHMtY29udGFpbmVyIG5vLWJvcmRlci10b3AiIGRhdGEtbmctY2xhc3M9Insndmlldy1tb2RlJzogaXNWaWV3TW9kZSgpfSI+CisgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKyAgICAgICAgICAgIDxkaXYgbmctaWY9IiFwcm9kdWN0LmNhdGVnb3JpZXMubGVuZ3RoIHx8ICBwcm9kdWN0LmNhdGVnb3JpZXMubGVuZ3RoID09PSAwIiBjbGFzcz0ibm8tZ3JvdXBzLXRleHQiIHRyYW5zbGF0ZT0iTkVXX1BST0RVQ1RfTk9fQ0FURUdPUklFU19UT19ESVNQTEFZIj48L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJjYXRlZ29yeSBpbiBwcm9kdWN0LmNhdGVnb3JpZXMgdHJhY2sgYnkgJGluZGV4Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0ic3ViY2F0ZWdvcnkgaW4gY2F0ZWdvcnkuc3ViY2F0ZWdvcmllcyB0cmFjayBieSAkaW5kZXgiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJncm91cC10YWciIG5nLXJlcGVhdD0iZ3JvdXAgaW4gc3ViY2F0ZWdvcnkuZ3JvdXBpbmdzIHRyYWNrIGJ5ICRpbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWluaXQ9InRvb2x0aXAgPSAnPGI+JyArIGNhdGVnb3J5Lm5hbWUgKyAnPC9iPjxiciAvPicgKyBzdWJjYXRlZ29yeS5uYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFnIHNkYy1kaXNhYmxlPSJpc1ZpZXdNb2RlKCkiIGRhdGEtb24tZGVsZXRlPSJkZWxldGVHcm91cCh1bmlxdWVJZCkiIGRhdGEtdGFnLWRhdGE9Int0YWc6IGdyb3VwLm5hbWUsIHRvb2x0aXA6IHRvb2x0aXAsIGlkOiBncm91cC51bmlxdWVJZCB9Ij48L3NkYy10YWc+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvcGVyZmVjdC1zY3JvbGxiYXI+CisgICAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvZHVjdC1oaWVyYXJjaHkvcHJvZHVjdC1oaWVyYXJjaHkubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvZHVjdC1oaWVyYXJjaHkvcHJvZHVjdC1oaWVyYXJjaHkubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTkyNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9wcm9kdWN0LWhpZXJhcmNoeS9wcm9kdWN0LWhpZXJhcmNoeS5sZXNzCkBAIC0wLDAgKzEsMTMwIEBACisud29ya3NwYWNlLWhpZXJhcmNoeSB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHdpZHRoOiA5MyU7CisKKyAgICAuc2Nyb2xsYmFyLWNvbnRhaW5lcnsKKyAgICAgICAgbWF4LWhlaWdodDo0MDBweDsKKyAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgIH0KKworICAgIC5kcm9wZG93bi1jb250YWluZXIgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisKKyAgICAgICAgJjphZnRlcnsKKyAgICAgICAgICAgIHRvcDogNDclOworICAgICAgICAgICAgcmlnaHQ6IDElOworICAgICAgICAgICAgYm9yZGVyOiBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRlbnQ6ICIgIjsKKyAgICAgICAgICAgIGhlaWdodDogMDsKKyAgICAgICAgICAgIHdpZHRoOiAwOworICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CisgICAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiBibGFjazsKKyAgICAgICAgICAgIGJvcmRlci13aWR0aDogNHB4OworICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC00cHg7CisgICAgICAgIH0KKworICAgICAgICAuZHJvcGRvd24taW5wdXQtdGV4dCB7CisgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAgIHBhZGRpbmc6IDRweCAxMHB4OworICAgICAgICB9CisKKyAgICAgICAgLmRyb3Bkb3duLWNvbnRlbnQgeworICAgICAgICAgICAgLnBlcmZlY3Qtc2Nyb2xsYmFyOworICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CisgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICAuYmdfYzsKKyAgICAgICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OworICAgICAgICAgICAgei1pbmRleDogOTk5OTk5OworCisgICAgICAgICAgICAuZHJvcGRvd24tb3B0aW9uIHsKKyAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5jYXRlZ29yeS1jb250YWluZXJ7CisgICAgICAgICAgICAgICAgd2lkdGg6IDI1MHB4OworICAgICAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogNXB4OworCisgICAgICAgICAgICAgICAgLmNhdGVnb3J5IHsKKyAgICAgICAgICAgICAgICAgICAgLmJvbGQ7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDNweCAzcHggMnB4IDNweDsKKyAgICAgICAgICAgICAgICAgICAgJjphZnRlcnsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zcHJpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAuYXJyb3ctbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLnN1YmNhdGVnb3J5IHsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuZ3JvdXBpbmdzLWNvbnRhaW5lcnsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgd2lkdGg6IDQyNHB4OworICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgICAgICAgICBtaW4taGVpZ2h0OiA1NXB4OworICAgICAgICAgICAgICAgIC5ncm91cHsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogM3B4IDNweCAzcHggMTBweDsKKyAgICAgICAgICAgICAgICAgICAgJjpob3ZlcnsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgLmJnX247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJi5kaXNhYmxlZC1ncm91cCB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjU7CisgICAgICAgICAgICAgICAgICAgICAgICAmOmhvdmVyeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogYXV0bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmdfYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLnNlcGVyYXRvciB7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7CisgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICAgICAgLmJnX2o7CisgICAgICAgICAgICAgICAgbWFyZ2luOiA1cHggMHB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC5zaG93IHsKKyAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICB9CisgICAgfQorCisgICAgLmhpZXJhcmNoeS1ncm91cHMtY29udGFpbmVyeworICAgICAgICAuYl85OworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgaGVpZ2h0OiA0MjVweDsKKyAgICAgICAgcGFkZGluZzogMTVweDsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworCisgICAgICAgIC5zY3JvbGxiYXItY29udGFpbmVyIHsKKyAgICAgICAgICAgIHotaW5kZXg6IDA7CisgICAgICAgIH0KKworICAgICAgICAubm8tZ3JvdXAtdGV4dHsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgICAgIG1hcmdpbi10b3A6MjVweDsKKyAgICAgICAgICAgIGEgeworICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAuZ3JvdXAtdGFneworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Byb3BlcnRpZXMvcHJvcGVydGllcy12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjgyNGJmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDExNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworCisgICAgaW50ZXJmYWNlIElQcm9wZXJ0aWVzVmlld01vZGVsU2NvcGUgZXh0ZW5kcyBJV29ya3NwYWNlVmlld01vZGVsU2NvcGUgeworICAgICAgICB0YWJsZUhlYWRlcnNMaXN0OiBBcnJheTxhbnk+OworICAgICAgICByZXZlcnNlOiBib29sZWFuOworICAgICAgICBzb3J0Qnk6c3RyaW5nOworICAgICAgICBmaWx0ZXJlZFByb3BlcnRpZXM6YW55OworCisgICAgICAgIGFkZE9yVXBkYXRlUHJvcGVydHkocHJvcGVydHk/Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTogdm9pZDsKKyAgICAgICAgZGVsZXRlKHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTogdm9pZDsKKyAgICAgICAgc29ydChzb3J0Qnk6c3RyaW5nKTogdm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgUHJvcGVydGllc1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJyRtb2RhbCcsCisgICAgICAgICAgICAnJHRlbXBsYXRlQ2FjaGUnLAorICAgICAgICAgICAgJ01vZGFsc0hhbmRsZXInCisgICAgICAgIF07CisKKworICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlICRzY29wZTpJUHJvcGVydGllc1ZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNb2RhbHNIYW5kbGVyOlV0aWxzLk1vZGFsc0hhbmRsZXIpIHsKKyAgICAgICAgICAgIHRoaXMuaW5pdFNjb3BlKCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVTZWxlY3RlZE1lbnVJdGVtKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgb3BlbkVkaXRQcm9wZXJ0eU1vZGFsID0gKHByb3BlcnR5Ok1vZGVscy5Qcm9wZXJ0eU1vZGVsKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoOnN0cmluZyA9ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvJzsKKworICAgICAgICAgICAgbGV0IG1vZGFsT3B0aW9uczpuZy51aS5ib290c3RyYXAuSU1vZGFsU2V0dGluZ3MgPSB7CisgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuJHRlbXBsYXRlQ2FjaGUuZ2V0KHZpZXdNb2RlbHNIdG1sQmFzZVBhdGggKyAnZm9ybXMvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLXZpZXcuaHRtbCcpLAorICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6ICdTZGMuVmlld01vZGVscy5Qcm9wZXJ0eUZvcm1WaWV3TW9kZWwnLAorICAgICAgICAgICAgICAgIHNpemU6ICdzZGMtbCcsCisgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLAorICAgICAgICAgICAgICAgIGtleWJvYXJkOiBmYWxzZSwKKyAgICAgICAgICAgICAgICByZXNvbHZlOiB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAoKTpNb2RlbHMuUHJvcGVydHlNb2RlbCA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogKCk6TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PiB0aGlzLiRzY29wZS5jb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUHJvcGVydGllczogKCk6QXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5maWx0ZXJlZFByb3BlcnRpZXMucHJvcGVydGllczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgLy9sZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5maWx0ZXJlZFByb3BlcnRpZXM9e3Byb3BlcnRpZXM6W119OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydEJ5ID0gJ25hbWUnOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJzZSA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOiAnTmFtZScsIHByb3BlcnR5OiAnbmFtZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ1R5cGUnLCBwcm9wZXJ0eTogJ3R5cGUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdTY2hlbWEnLCBwcm9wZXJ0eTogJ3NjaGVtYS5wcm9wZXJ0eS50eXBlJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnRGVzY3JpcHRpb24nLCBwcm9wZXJ0eTogJ2Rlc2NyaXB0aW9uJ30sCisgICAgICAgICAgICBdOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydCA9IChzb3J0Qnk6c3RyaW5nKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5yZXZlcnNlID0gKHRoaXMuJHNjb3BlLnNvcnRCeSA9PT0gc29ydEJ5KSA/ICF0aGlzLiRzY29wZS5yZXZlcnNlIDogZmFsc2U7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydEJ5ID0gc29ydEJ5OworICAgICAgICAgICAgfTsKKworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5hZGRPclVwZGF0ZVByb3BlcnR5ID0gKHByb3BlcnR5PzpNb2RlbHMuUHJvcGVydHlNb2RlbCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5vcGVuRWRpdFByb3BlcnR5TW9kYWwocHJvcGVydHkgPyBwcm9wZXJ0eSA6IG5ldyBNb2RlbHMuUHJvcGVydHlNb2RlbCgpKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRlbGV0ZSA9IChwcm9wZXJ0eTpNb2RlbHMuUHJvcGVydHlNb2RlbCk6dm9pZCA9PiB7CisKKyAgICAgICAgICAgICAgICBsZXQgb25PayA9ICgpOnZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQuZGVsZXRlUHJvcGVydHkocHJvcGVydHkudW5pcXVlSWQpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGV0IHRpdGxlOnN0cmluZyA9IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlBST1BFUlRZX1ZJRVdfREVMRVRFX01PREFMX1RJVExFIik7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U6c3RyaW5nID0gdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiUFJPUEVSVFlfVklFV19ERUxFVEVfTU9EQUxfVEVYVCIsICJ7J25hbWUnOiAnIiArIHByb3BlcnR5Lm5hbWUgKyAiJ30iKTsKKyAgICAgICAgICAgICAgICB0aGlzLk1vZGFsc0hhbmRsZXIub3BlbkNvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBtZXNzYWdlLCBmYWxzZSkudGhlbihvbk9rKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Byb3BlcnRpZXMvcHJvcGVydGllcy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Byb3BlcnRpZXMvcHJvcGVydGllcy12aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhNGMzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvcGVydGllcy9wcm9wZXJ0aWVzLXZpZXcuaHRtbApAQCAtMCwwICsxLDYyIEBACis8ZGl2IGNsYXNzPSJ3b3Jrc3BhY2UtcHJvcGVydGllcyI+CisgICAgPGRpdiBpZD0ibGVmdC10b3AtYmFyIj4KKyAgICAgICAgPHNwYW4gaWQ9InByb3BlcnRpZXMtY291bnQiPlRvdGFsIFByb3BlcnRpZXM6IHt7Y29tcG9uZW50LnByb3BlcnRpZXMubGVuZ3RofX08L3NwYW4+CisgICAgICAgIDxpbnB1dCBpZD0ic2VhcmNoLWJ5LW5hbWUiIHR5cGU9InNlYXJjaCIgcGxhY2Vob2xkZXI9IlNlYXJjaCIgIGRhdGEtbmctbW9kZWwtb3B0aW9ucz0ie2RlYm91bmNlOiAyMDB9IiBkYXRhLW5nLW1vZGVsPSJmaWx0ZXJUZXJtcyIvPgorICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlIG1hZ25pZmljYXRpb24tZ2xhc3Mgc2VhcmNoLWJ1dHRvbiI+PC9zcGFuPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImFkZC1idG4iIGRhdGEtdGVzdHMtaWQ9ImFkZEdyZXkiIG5nLWlmPSIhaXNWaWV3TW9kZSgpIgorICAgICAgICAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzRGlzYWJsZU1vZGUoKX0iIGRhdGEtbmctY2xpY2s9ImFkZE9yVXBkYXRlUHJvcGVydHkoKSI+QWRkIFByb3BlcnR5PC9kaXY+CisgICAgPGRpdiBjbGFzcz0idGFibGUtY29udGFpbmVyLWZsZXgiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSIgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWQgZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciBoZWFkLXJvdyBoYW5kIGZsZXgtaXRlbSIgZGF0YS1uZy1yZXBlYXQ9ImhlYWRlciBpbiB0YWJsZUhlYWRlcnNMaXN0IHRyYWNrIGJ5ICRpbmRleCIgZGF0YS1uZy1jbGljaz0ic29ydChoZWFkZXIucHJvcGVydHkpIj57e2hlYWRlci50aXRsZX19CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctaWY9InNvcnRCeSA9PT0gaGVhZGVyLnByb3BlcnR5IiBjbGFzcz0idGFibGUtaGVhZGVyLXNvcnQtYXJyb3ciIGRhdGEtbmctY2xhc3M9InsnZG93bic6IHJldmVyc2UsICd1cCc6IXJldmVyc2V9Ij4gPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLW5vLXRleHQtaGVhZGVyIGhlYWQtcm93IGZsZXgtaXRlbSIgbmctaWY9IiFpc1ZpZXdNb2RlKCkiPjxzcGFuIGNsYXNzPSJkZWxldGUtY29sLWhlYWRlciI+PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgIDwhLS1kaXYgY2xhc3M9InRhYmxlLW5vLXRleHQtaGVhZGVyIGhlYWQtcm93IGZsZXgtaXRlbSI+PC9kaXYtLT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc2Nyb2xsLXktbWFyZ2luLW9mZnNldD0iMCIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0iY29tcG9uZW50LnByb3BlcnRpZXMubGVuZ3RoID09PSAwIiBjbGFzcz0ibm8tcm93LXRleHQiICBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogaXNEaXNhYmxlTW9kZSgpfSI+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgbm8gcHJvcGVydGllcyB0byBkaXNwbGF5IDxicj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLWlmPSIhaXNWaWV3TW9kZSgpIj4gY2xpY2sgPGEgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGVQcm9wZXJ0eSgpIj5oZXJlPC9hPiB0byBhZGQgb25lIDwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdD0icHJvcGVydHkgaW4gZmlsdGVyZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXM9KGNvbXBvbmVudC5wcm9wZXJ0aWVzIHwgb3JkZXJCeTpzb3J0Qnk6cmV2ZXJzZSB8IGZpbHRlcjoge2ZpbHRlclRlcm06ZmlsdGVyVGVybXN9KSB0cmFjayBieSAkaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0icHJvcGVydHlSb3ciIGRhdGEtbmctY2xhc3M9Insnc2VsZWN0ZWQnOiBwcm9wZXJ0eS5zZWxlY3RlZH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImZsZXgtY29udGFpbmVyIGRhdGEtcm93Ij4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhICBkYXRhLXRlc3RzLWlkPSJ7e3Byb3BlcnR5Lm5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3Byb3BlcnR5Lm5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iYWRkT3JVcGRhdGVQcm9wZXJ0eShwcm9wZXJ0eSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnOiBpc1ZpZXdNb2RlKCl9Ij57e3Byb3BlcnR5Lm5hbWV9fTwvYT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJ7e3Byb3BlcnR5LnR5cGV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3Byb3BlcnR5LnR5cGV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1iaW5kPSJwcm9wZXJ0eS50eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7cHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3Byb3BlcnR5LnNjaGVtYS5wcm9wZXJ0eS50eXBlfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmluZD0icHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0gdGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3Byb3BlcnR5LmRlc2NyaXB0aW9ufX0iIGRhdGEtdGVzdHMtaWQ9Int7cHJvcGVydHkuZGVzY3JpcHRpb259fSIgZGF0YS1uZy1iaW5kPSJwcm9wZXJ0eS5kZXNjcmlwdGlvbiI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1idG4tY29sIGZsZXgtaXRlbSIgbmctaWY9IiFpc1ZpZXdNb2RlKCkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRhYmxlLWRlbGV0ZS1idG4iIGRhdGEtdGVzdHMtaWQ9ImRlbGV0ZV97e3Byb3BlcnR5Lm5hbWV9fSIgIGRhdGEtbmctaWY9InByb3BlcnR5LnBhcmVudFVuaXF1ZUlkPT1jb21wb25lbnQudW5pcXVlSWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsaWNrPSJkZWxldGUocHJvcGVydHkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IiAgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzVmlld01vZGUoKX0iPiA8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4ZDZjMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmxlc3MKQEAgLTAsMCArMSwxMTUgQEAKKy53b3Jrc3BhY2UtcHJvcGVydGllcyB7CisKKyAgICB3aWR0aDogOTMlOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKworICAgICNsZWZ0LXRvcC1iYXJ7CisgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICB3aWR0aDogMTU1cHg7CisgICAgICAgIDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7CisgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgIH0KKyAgICAgICAgOi1tb3otcGxhY2Vob2xkZXIgeworICAgICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgICAgICB9CisgICAgICAgIDo6LW1vei1wbGFjZWhvbGRlciB7CisgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgIH0KKyAgICAgICAgOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7CisgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgIH0KKworICAgICAgICAjcHJvcGVydGllcy1jb3VudHsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgIH0KKworICAgICAgICAjc2VhcmNoLWJ5LW5hbWV7CisgICAgICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDsKKyAgICAgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OworICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgICAgICAgICAgd2lkdGg6IDI0NXB4OworICAgICAgICAgICAgaGVpZ2h0OiAzMnB4OworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CisgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAbWFpbl9jb2xvcl9vOworICAgICAgICAgICAgdGV4dC1pbmRlbnQ6IDEwcHg7CisgICAgICAgIH0KKworICAgICAgICAuc2VhcmNoLWJ1dHRvbnsKKyAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICAgICAgZmxvYXQ6IHJpZ2h0OworICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICAgICAgdG9wOiAtMjJweDsKKyAgICAgICAgICAgIHJpZ2h0OiAtODBweDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC5hZGQtYnRuIHsKKyAgICAgICAgbWFyZ2luOiAzNnB4IDAgMCAwOworICAgIH0KKworICAgIC5kZWxldGUtY29sLWhlYWRlcnsKKyAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgLnNwcml0ZS5lLXNkYy1zbWFsbC1pY29uLWRlbGV0ZTsKKyAgICB9CisKKyAgICAudy1zZGMtY2xhc3NpYy1idG4geworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgfQorCisgICAgLnRhYmxleworICAgICAgICBoZWlnaHQ6NDkwcHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgfQorCisgICAgLmRhdGEtcm93eworICAgICAgICAudGFibGUtZGVsZXRlLWJ0bnsKKyAgICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKKyAgICAgICAgfQorICAgICAgICAmOmhvdmVyeworICAgICAgICAgICAgLnRhYmxlLWRlbGV0ZS1idG57CisgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggeworICAgICAgICBtYXJnaW4tdG9wOiAyN3B4OworCisgICAgICAgIC50ZXh0eworICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgfQorCisgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDEpIHsKKyAgICAgICAgICAgIGZsZXgtZ3JvdzogMTU7CisgICAgICAgICAgICBheworICAgICAgICAgICAgICAgIC5oYW5kCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgyKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgzKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCg0KSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDIwOworCisgICAgICAgIH0KKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNSkgeworICAgICAgICAgICAgZmxleC1ncm93OiAzOworICAgICAgICAgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgICAgIH0KKworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3JlcS1hbmQtY2FwYWJpbGl0aWVzL3JlcS1hbmQtY2FwYWJpbGl0aWVzLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3JlcS1hbmQtY2FwYWJpbGl0aWVzL3JlcS1hbmQtY2FwYWJpbGl0aWVzLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhMTE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcmVxLWFuZC1jYXBhYmlsaXRpZXMvcmVxLWFuZC1jYXBhYmlsaXRpZXMtdmlldy1tb2RlbC50cwpAQCAtMCwwICsxLDE2NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qKgorICogQ3JlYXRlZCBieSByY29oZW4gb24gOS8yMi8yMDE2LgorICovCisvLy8gPHJlZmVyZW5jZSBwYXRoPSIuLi8uLi8uLi8uLi9yZWZlcmVuY2VzIi8+Cittb2R1bGUgU2RjLlZpZXdNb2RlbHMgeworICAgICd1c2Ugc3RyaWN0JzsKKyAgICBpbXBvcnQgdHJlZSA9IGQzLmxheW91dC50cmVlOworCisgICAgZXhwb3J0IGNsYXNzIFNvcnRUYWJsZURlZmluZWQgeworICAgICAgICByZXZlcnNlOmJvb2xlYW47CisgICAgICAgIHNvcnRCeUZpZWxkOnN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSVJlcUFuZENhcGFiaWxpdGllc1ZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgSVdvcmtzcGFjZVZpZXdNb2RlbFNjb3BlIHsKKyAgICAgICAgcmVxdWlyZW1lbnRzVGFibGVIZWFkZXJzTGlzdDogQXJyYXk8YW55PjsKKyAgICAgICAgY2FwYWJpbGl0aWVzVGFibGVIZWFkZXJzTGlzdDogQXJyYXk8YW55PjsKKyAgICAgICAgY2FwYWJpbGl0eVByb3BlcnRpZXNUYWJsZUhlYWRlcnNMaXN0OiBBcnJheTxhbnk+OworICAgICAgICByZXF1aXJlbWVudHNTb3J0VGFibGVEZWZpbmVkOiBTb3J0VGFibGVEZWZpbmVkOworICAgICAgICBjYXBhYmlsaXRpZXNTb3J0VGFibGVEZWZpbmVkOiBTb3J0VGFibGVEZWZpbmVkOworICAgICAgICBwcm9wZXJ0aWVzU29ydFRhYmxlRGVmaW5lZDogU29ydFRhYmxlRGVmaW5lZDsKKyAgICAgICAgcmVxdWlyZW1lbnRzOkFycmF5PE1vZGVscy5SZXF1aXJlbWVudD47CisgICAgICAgIGNhcGFiaWxpdGllczpBcnJheTxNb2RlbHMuQ2FwYWJpbGl0eT47CisgICAgICAgIG1vZGU6c3RyaW5nOworICAgICAgICBmaWx0ZXJlZFByb3BlcnRpZXM6QXJyYXk8QXJyYXk8TW9kZWxzLlByb3BlcnR5TW9kZWw+PjsKKyAgICAgICAgc2VhcmNoVGV4dDpzdHJpbmc7CisKKyAgICAgICAgc29ydChzb3J0Qnk6c3RyaW5nLCBzb3J0QnlUYWJsZURlZmluZWQ6U29ydFRhYmxlRGVmaW5lZCk6dm9pZDsKKyAgICAgICAgdXBkYXRlUHJvcGVydHkocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwsIGluZGV4SW5GaWx0ZXJlZFByb3BlcnRpZXM6bnVtYmVyKTp2b2lkOworICAgICAgICBhbGxDYXBhYmlsaXRpZXNTZWxlY3RlZChzZWxlY3RlZDpib29sZWFuKTp2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBSZXFBbmRDYXBhYmlsaXRpZXNWaWV3TW9kZWwgeworCisgICAgICAgIHN0YXRpYyAnJGluamVjdCcgPSBbCisgICAgICAgICAgICAnJHNjb3BlJywKKyAgICAgICAgICAgICckZmlsdGVyJywKKyAgICAgICAgICAgICckbW9kYWwnLAorICAgICAgICAgICAgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJworICAgICAgICBdOworCisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SVJlcUFuZENhcGFiaWxpdGllc1ZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRmaWx0ZXI6bmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJG1vZGFsOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSkgeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZVNlbGVjdGVkTWVudUl0ZW0oKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBvcGVuRWRpdFByb3BlcnR5TW9kYWwgPSAocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwsIGluZGV4SW5GaWx0ZXJlZFByb3BlcnRpZXM6bnVtYmVyKTp2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCB2aWV3TW9kZWxzSHRtbEJhc2VQYXRoOnN0cmluZyA9ICcvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvJzsKKyAgICAgICAgICAgIC8vLi4uYmVjYXVzZSB0aGVyZSBpcyBub3QgYmUgYXBpCisgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuZmlsdGVyZWRQcm9wZXJ0aWVzW2luZGV4SW5GaWx0ZXJlZFByb3BlcnRpZXNdLChwcm9wOk1vZGVscy5Qcm9wZXJ0eU1vZGVsKT0+eworICAgICAgICAgICAgICAgIHByb3AucmVhZG9ubHkgPSB0cnVlOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBsZXQgbW9kYWxPcHRpb25zOm5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXR0aW5ncyA9IHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy4kdGVtcGxhdGVDYWNoZS5nZXQodmlld01vZGVsc0h0bWxCYXNlUGF0aCArICdmb3Jtcy9wcm9wZXJ0eS1mb3JtL3Byb3BlcnR5LWZvcm0tdmlldy5odG1sJyksCisgICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ1NkYy5WaWV3TW9kZWxzLlByb3BlcnR5Rm9ybVZpZXdNb2RlbCcsCisgICAgICAgICAgICAgICAgc2l6ZTogJ3NkYy1sJywKKyAgICAgICAgICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYycsCisgICAgICAgICAgICAgICAga2V5Ym9hcmQ6IGZhbHNlLAorICAgICAgICAgICAgICAgIHJlc29sdmU6IHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICgpOk1vZGVscy5Qcm9wZXJ0eU1vZGVsID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoKTpNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+IHRoaXMuJHNjb3BlLmNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRQcm9wZXJ0aWVzOiAoKTpBcnJheTxNb2RlbHMuUHJvcGVydHlNb2RlbD4gPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLmZpbHRlcmVkUHJvcGVydGllc1tpbmRleEluRmlsdGVyZWRQcm9wZXJ0aWVzXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLiRtb2RhbC5vcGVuKG1vZGFsT3B0aW9ucyk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTp2b2lkID0+IHsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVxdWlyZW1lbnRzU29ydFRhYmxlRGVmaW5lZCA9IHsKKyAgICAgICAgICAgICAgICByZXZlcnNlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBzb3J0QnlGaWVsZDogJ25hbWUnCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2FwYWJpbGl0aWVzU29ydFRhYmxlRGVmaW5lZCA9IHsKKyAgICAgICAgICAgICAgICByZXZlcnNlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBzb3J0QnlGaWVsZDogJ25hbWUnCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy4kc2NvcGUucHJvcGVydGllc1NvcnRUYWJsZURlZmluZWQgPSB7CisgICAgICAgICAgICAgICAgcmV2ZXJzZTogZmFsc2UsCisgICAgICAgICAgICAgICAgc29ydEJ5RmllbGQ6ICduYW1lJworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJlcXVpcmVtZW50c1RhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOiAnTmFtZScsIHByb3BlcnR5OiAnbmFtZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ0NhcGFiaWxpdHknLCBwcm9wZXJ0eTogJ2NhcGFiaWxpdHknfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdOb2RlJywgcHJvcGVydHk6ICdub2RlJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnUmVsYXRpb25zaGlwJywgcHJvcGVydHk6ICdyZWxhdGlvbnNoaXAnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdDb25uZWN0ZWQgVG8nLCBwcm9wZXJ0eTogJyd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ09jY3VycmVuY2VzJywgcHJvcGVydHk6ICcnfQorICAgICAgICAgICAgXTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNhcGFiaWxpdGllc1RhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOiAnTmFtZScsIHByb3BlcnR5OiAnbmFtZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ1R5cGUnLCBwcm9wZXJ0eTogJ3R5cGUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdEZXNjcmlwdGlvbicsIHByb3BlcnR5OiAnJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnVmFsaWQgU291cmNlJywgcHJvcGVydHk6ICcnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdPY2N1cnJlbmNlcycsIHByb3BlcnR5OiAnJ30KKyAgICAgICAgICAgIF07CisgICAgICAgICAgICB0aGlzLiRzY29wZS5jYXBhYmlsaXR5UHJvcGVydGllc1RhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOiAnTmFtZScsIHByb3BlcnR5OiAnbmFtZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ1R5cGUnLCBwcm9wZXJ0eTogJ3R5cGUnfSwKKyAgICAgICAgICAgICAgICB7dGl0bGU6ICdTY2hlbWEnLCBwcm9wZXJ0eTogJ3NjaGVtYS5wcm9wZXJ0eS50eXBlJ30sCisgICAgICAgICAgICAgICAge3RpdGxlOiAnRGVzY3JpcHRpb24nLCBwcm9wZXJ0eTogJ2Rlc2NyaXB0aW9uJ30sCisgICAgICAgICAgICBdOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZmlsdGVyZWRQcm9wZXJ0aWVzPVtdOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5tb2RlPSdyZXF1aXJlbWVudHMnOworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVxdWlyZW1lbnRzPVtdOworICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5yZXF1aXJlbWVudHMsKHJlcTpBcnJheTxNb2RlbHMuUmVxdWlyZW1lbnQ+LGNhcE5hbWUpPT57CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUucmVxdWlyZW1lbnRzPXRoaXMuJHNjb3BlLnJlcXVpcmVtZW50cy5jb25jYXQocmVxKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5jYXBhYmlsaXRpZXM9W107CisgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuY29tcG9uZW50LmNhcGFiaWxpdGllcywoY2FwOkFycmF5PE1vZGVscy5DYXBhYmlsaXR5PixjYXBOYW1lKT0+eworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNhcGFiaWxpdGllcz10aGlzLiRzY29wZS5jYXBhYmlsaXRpZXMuY29uY2F0KGNhcCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc29ydCA9IChzb3J0Qnk6c3RyaW5nLCBzb3J0QnlUYWJsZURlZmluZWQ6U29ydFRhYmxlRGVmaW5lZCk6dm9pZCA9PiB7CisgICAgICAgICAgICAgICAgc29ydEJ5VGFibGVEZWZpbmVkLnJldmVyc2UgPSAoc29ydEJ5VGFibGVEZWZpbmVkLnNvcnRCeUZpZWxkID09PSBzb3J0QnkpID8gIXNvcnRCeVRhYmxlRGVmaW5lZC5yZXZlcnNlIDogZmFsc2U7CisgICAgICAgICAgICAgICAgc29ydEJ5VGFibGVEZWZpbmVkLnNvcnRCeUZpZWxkID0gc29ydEJ5OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUudXBkYXRlUHJvcGVydHkgPSAocHJvcGVydHk6TW9kZWxzLlByb3BlcnR5TW9kZWwsIGluZGV4SW5GaWx0ZXJlZFByb3BlcnRpZXM6bnVtYmVyKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLm9wZW5FZGl0UHJvcGVydHlNb2RhbChwcm9wZXJ0eSwgaW5kZXhJbkZpbHRlcmVkUHJvcGVydGllcyk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5hbGxDYXBhYmlsaXRpZXNTZWxlY3RlZCA9IChzZWxlY3RlZDpib29sZWFuKTp2b2lkID0+IHsKKyAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy4kc2NvcGUuY2FwYWJpbGl0aWVzLChjYXA6TW9kZWxzLkNhcGFiaWxpdHkpPT57CisgICAgICAgICAgICAgICAgICAgIGNhcC5zZWxlY3RlZCA9IHNlbGVjdGVkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9yZXEtYW5kLWNhcGFiaWxpdGllcy9yZXEtYW5kLWNhcGFiaWxpdGllcy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3JlcS1hbmQtY2FwYWJpbGl0aWVzL3JlcS1hbmQtY2FwYWJpbGl0aWVzLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDc3Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9yZXEtYW5kLWNhcGFiaWxpdGllcy9yZXEtYW5kLWNhcGFiaWxpdGllcy12aWV3Lmh0bWwKQEAgLTAsMCArMSwxNDQgQEAKKzxkaXYgY2xhc3M9IndvcmtzcGFjZS1yZXEtYW5kLWNhcCI+CisgICAgPGRpdiBjbGFzcz0idGFicyI+CisgICAgICAgIDxidXR0b24gZGF0YS10ZXN0cy1pZD0icmVxLXRhYiIgZGF0YS1uZy1jbGljaz0ibW9kZT0ncmVxdWlyZW1lbnRzJztmaWx0ZXJUZXJtcz0nJzsiIGNsYXNzPSJ0bHYtYnRuIiBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzptb2RlPT0ncmVxdWlyZW1lbnRzJ30iPlJlcXVpcmVtZW50cyh7e3JlcXVpcmVtZW50cy5sZW5ndGh8fCcwJ319KTwvYnV0dG9uPgorICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdHMtaWQ9ImNhcC10YWIiIGRhdGEtbmctY2xpY2s9Im1vZGU9J2NhcGFiaWxpdGllcyc7ZmlsdGVyVGVybXM9Jyc7IiBjbGFzcz0idGx2LWJ0biIgZGF0YS1uZy1jbGFzcz0ieydzZWxlY3RlZCc6bW9kZT09J2NhcGFiaWxpdGllcyd9Ij5DYXBhYmlsaXRpZXMoe3tjYXBhYmlsaXRpZXMubGVuZ3RofHwnMCd9fSk8L2J1dHRvbj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJleHBhbmQtY29sbGFwc2UtYnV0dG9ucyIgZGF0YS1uZy1pZj0ibW9kZT09J2NhcGFiaWxpdGllcyciPgorICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyBleHBhbmQtYWxsIiBkYXRhLW5nLWNsaWNrPSJhbGxDYXBhYmlsaXRpZXNTZWxlY3RlZCh0cnVlKSI+PC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyBjb2xsYXBzZS1hbGwiIGRhdGEtbmctY2xpY2s9ImFsbENhcGFiaWxpdGllc1NlbGVjdGVkKGZhbHNlKSI+PC9zcGFuPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InNlYXJjaCI+CisgICAgICAgIDxpbnB1dCBpZD0ic2VhcmNoLWJveCIgZGF0YS10ZXN0cy1pZD0ic2VhcmNoLWJveCIgIHR5cGU9InNlYXJjaCIgcGxhY2Vob2xkZXI9IlNlYXJjaCIgZGF0YS1uZy1tb2RlbC1vcHRpb25zPSJ7ZGVib3VuY2U6IDIwMH0iIGRhdGEtbmctbW9kZWw9ImZpbHRlclRlcm1zIi8+CisgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1pY29uLWNvbnRhaW5lciI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VhcmNoLWljb24gc3ByaXRlLW5ldyBzZWFyY2gtd2hpdGUtaWNvbiI+PC9zcGFuPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb250YWluZXItZmxleCByZXF1aXJlbWVudHMtdGFibGUiIGRhdGEtbmctaWY9Im1vZGU9PSdyZXF1aXJlbWVudHMnIj4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUiIGRhdGEtbmctY2xhc3M9Insndmlldy1tb2RlJzogaXNWaWV3TW9kZSgpfSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkIGZsZXgtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgaGVhZC1yb3cgaGFuZCBmbGV4LWl0ZW0iIGRhdGEtbmctcmVwZWF0PSJoZWFkZXIgaW4gcmVxdWlyZW1lbnRzVGFibGVIZWFkZXJzTGlzdCB0cmFjayBieSAkaW5kZXgiIGRhdGEtbmctY2xpY2s9InNvcnQoaGVhZGVyLnByb3BlcnR5LCByZXF1aXJlbWVudHNTb3J0VGFibGVEZWZpbmVkKSI+e3toZWFkZXIudGl0bGV9fQorICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW5nLWlmPSJyZXF1aXJlbWVudHNTb3J0VGFibGVEZWZpbmVkLnNvcnRCeUZpZWxkID09PSBoZWFkZXIucHJvcGVydHkiIGNsYXNzPSJ0YWJsZS1oZWFkZXItc29ydC1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydkb3duJzogcmVxdWlyZW1lbnRzU29ydFRhYmxlRGVmaW5lZC5yZXZlcnNlLCAndXAnOiFyZXF1aXJlbWVudHNTb3J0VGFibGVEZWZpbmVkLnJldmVyc2V9Ij4gPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzY3JvbGwteS1tYXJnaW4tb2Zmc2V0PSIwIiBpbmNsdWRlLXBhZGRpbmc9InRydWUiIGNsYXNzPSJzY3JvbGxiYXItY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJyZXF1aXJlbWVudHMubGVuZ3RoID09PSAwIiBjbGFzcz0ibm8tcm93LXRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIG5vIHJlcXVpcmVtZW50cyB0byBkaXNwbGF5CisKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1yZXBlYXQ9InJlcSBpbiByZXF1aXJlbWVudHMgfCBvcmRlckJ5OnJlcXVpcmVtZW50c1NvcnRUYWJsZURlZmluZWQuc29ydEJ5RmllbGQ6cmVxdWlyZW1lbnRzU29ydFRhYmxlRGVmaW5lZC5yZXZlcnNlIHwgZmlsdGVyOiB7ZmlsdGVyVGVybTpmaWx0ZXJUZXJtc30gdHJhY2sgYnkgJGluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyIgZGF0YS10ZXN0cy1pZD0icmVxUm93Ij4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICBkYXRhLXRlc3RzLWlkPSJ7e3JlcS5uYW1lfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tyZXEubmFtZX19Ij57e3JlcS5uYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS10ZXN0cy1pZD0ie3tyZXEuY2FwYWJpbGl0eX19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7cmVxLmNhcGFiaWxpdHl9fSI+e3tyZXEuY2FwYWJpbGl0eS5zdWJzdHJpbmcoInRvc2NhLmNhcGFiaWxpdGllcy4iLmxlbmd0aCl9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICBkYXRhLXRlc3RzLWlkPSJ7e3JlcS5ub2RlfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tyZXEubm9kZX19Ij57e3JlcS5ub2RlLnN1YnN0cmluZygidG9zY2Eubm9kZXMuIi5sZW5ndGgpfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS10ZXN0cy1pZD0ie3tyZXEucmVsYXRpb25zaGlwfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tyZXEucmVsYXRpb25zaGlwfX0iPnt7cmVxLnJlbGF0aW9uc2hpcC5zdWJzdHJpbmcoInRvc2NhLnJlbGF0aW9uc2hpcHMuIi5sZW5ndGgpfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0IiBkYXRhLXRlc3RzLWlkPSJ7e319IiBkYXRhLW5nLWJpbmQ9IiI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb2wtZ2VuZXJhbCBmbGV4LWl0ZW0gdGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gIGRhdGEtdGVzdHMtaWQ9Int7cmVxLm1pbk9jY3VycmVuY2VzfX0se3tyZXEubWF4T2NjdXJyZW5jZXN9fSIgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3JlcS5taW5PY2N1cnJlbmNlc319LHt7cmVxLm1heE9jY3VycmVuY2VzfX0iPnt7cmVxLm1pbk9jY3VycmVuY2VzfX0se3tyZXEubWF4T2NjdXJyZW5jZXN9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0idGFibGUtY29udGFpbmVyLWZsZXggY2FwYWJpbGl0aWVzLXRhYmxlIiBkYXRhLW5nLWlmPSJtb2RlPT0nY2FwYWJpbGl0aWVzJyI+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlIiBkYXRhLW5nLWNsYXNzPSJ7J3ZpZXctbW9kZSc6IGlzVmlld01vZGUoKX0iPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZCBmbGV4LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIGhlYWQtcm93IGhhbmQgZmxleC1pdGVtIiBkYXRhLW5nLXJlcGVhdD0iaGVhZGVyIGluIGNhcGFiaWxpdGllc1RhYmxlSGVhZGVyc0xpc3QgdHJhY2sgYnkgJGluZGV4IiBkYXRhLW5nLWNsaWNrPSJzb3J0KGhlYWRlci5wcm9wZXJ0eSwgY2FwYWJpbGl0aWVzU29ydFRhYmxlRGVmaW5lZCkiPnt7aGVhZGVyLnRpdGxlfX0KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0iY2FwYWJpbGl0aWVzU29ydFRhYmxlRGVmaW5lZC5zb3J0QnlGaWVsZCA9PT0gaGVhZGVyLnByb3BlcnR5IiBjbGFzcz0idGFibGUtaGVhZGVyLXNvcnQtYXJyb3ciIGRhdGEtbmctY2xhc3M9InsnZG93bic6IGNhcGFiaWxpdGllc1NvcnRUYWJsZURlZmluZWQucmV2ZXJzZSwgJ3VwJzohY2FwYWJpbGl0aWVzU29ydFRhYmxlRGVmaW5lZC5yZXZlcnNlfSI+IDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KKyAgICAgICAgICAgICAgICA8cGVyZmVjdC1zY3JvbGxiYXIgc2Nyb2xsLXktbWFyZ2luLW9mZnNldD0iMCIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0iY2FwYWJpbGl0aWVzLmxlbmd0aCA9PT0gMCIgY2xhc3M9Im5vLXJvdy10ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBubyBjYXBhYmlsaXRpZXMgdG8gZGlzcGxheQorCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LXN0YXJ0PSJjYXBhYmlsaXR5IGluIGNhcGFiaWxpdGllcyB8IG9yZGVyQnk6Y2FwYWJpbGl0aWVzU29ydFRhYmxlRGVmaW5lZC5zb3J0QnlGaWVsZDpjYXBhYmlsaXRpZXNTb3J0VGFibGVEZWZpbmVkLnJldmVyc2UgfCBmaWx0ZXI6IHtmaWx0ZXJUZXJtOmZpbHRlclRlcm1zfSB0cmFjayBieSAkaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImZsZXgtY29udGFpbmVyIGRhdGEtcm93IiBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogY2FwYWJpbGl0eS5zZWxlY3RlZH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0iY2FwYWJpbGl0eS5zZWxlY3RlZCA9ICFjYXBhYmlsaXR5LnNlbGVjdGVkIiBkYXRhLXRlc3RzLWlkPSJjYXBhYmlsaXRpZXMtdGFibGUtcm93Ij4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IGFycm93LXVwLXNtYWxsIiBkYXRhLW5nLWNsYXNzPSJ7J29wZW5lZCc6IGNhcGFiaWxpdHkuc2VsZWN0ZWR9Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gIGRhdGEtdGVzdHMtaWQ9Int7Y2FwYWJpbGl0eS5uYW1lfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tjYXBhYmlsaXR5Lm5hbWV9fSI+e3tjYXBhYmlsaXR5Lm5hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICBkYXRhLXRlc3RzLWlkPSJ7e2NhcGFiaWxpdHkudHlwZX19IiB0b29sdGlwcyB0b29sdGlwLWNvbnRlbnQ9Int7Y2FwYWJpbGl0eS50eXBlfX0iPnt7Y2FwYWJpbGl0eS50eXBlLnN1YnN0cmluZygidG9zY2EuY2FwYWJpbGl0aWVzLiIubGVuZ3RoKX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS10ZXN0cy1pZD0ie3tjYXBhYmlsaXR5LmRlc2NyaXB0aW9ufX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tjYXBhYmlsaXR5LmRlc2NyaXB0aW9ufX0iPnt7Y2FwYWJpbGl0eS5kZXNjcmlwdGlvbn19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS10ZXN0cy1pZD0ie3tjYXBhYmlsaXR5LnZhbGlkU291cmNlVHlwZXMuam9pbignLCcpfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tjYXBhYmlsaXR5LnZhbGlkU291cmNlVHlwZXMuam9pbignLCcpfX0iPnt7Y2FwYWJpbGl0eS52YWxpZFNvdXJjZVR5cGVzLmpvaW4oJywnKX19PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNvbC1nZW5lcmFsIGZsZXgtaXRlbSB0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS10ZXN0cy1pZD0ie3tjYXBhYmlsaXR5Lm1pbk9jY3VycmVuY2VzfX0se3tjYXBhYmlsaXR5Lm1heE9jY3VycmVuY2VzfX0iIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3tjYXBhYmlsaXR5Lm1pbk9jY3VycmVuY2VzfX0se3tjYXBhYmlsaXR5Lm1heE9jY3VycmVuY2VzfX0iPnt7Y2FwYWJpbGl0eS5taW5PY2N1cnJlbmNlc319LHt7Y2FwYWJpbGl0eS5tYXhPY2N1cnJlbmNlc319PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LWVuZD0iIiBkYXRhLW5nLWlmPSJjYXBhYmlsaXR5LnNlbGVjdGVkIiBjbGFzcz0iaXRlbS1vcGVuZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InByb3BlcnRpZXMtdGl0bGUiPlByb3BlcnRpZXM8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jb250YWluZXItZmxleCBwcm9wZXJ0aWVzLXRhYmxlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSIgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZCBmbGV4LWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgaGVhZC1yb3cgaGFuZCBmbGV4LWl0ZW0iIGRhdGEtbmctcmVwZWF0PSJoZWFkZXIgaW4gY2FwYWJpbGl0eVByb3BlcnRpZXNUYWJsZUhlYWRlcnNMaXN0IHRyYWNrIGJ5ICRpbmRleCIgZGF0YS1uZy1jbGljaz0ic29ydChoZWFkZXIucHJvcGVydHksIHByb3BlcnRpZXNTb3J0VGFibGVEZWZpbmVkKSI+e3toZWFkZXIudGl0bGV9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtbmctaWY9InByb3BlcnRpZXNTb3J0VGFibGVEZWZpbmVkLnNvcnRCeUZpZWxkID09PSBoZWFkZXIucHJvcGVydHkiIGNsYXNzPSJ0YWJsZS1oZWFkZXItc29ydC1hcnJvdyIgZGF0YS1uZy1jbGFzcz0ieydkb3duJzogcHJvcGVydGllc1NvcnRUYWJsZURlZmluZWQucmV2ZXJzZSwgJ3VwJzohcHJvcGVydGllc1NvcnRUYWJsZURlZmluZWQucmV2ZXJzZX0iPiA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm9keSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLWlmPSJjYXBhYmlsaXR5LnByb3BlcnRpZXMubGVuZ3RoID09PSAwIiBjbGFzcz0ibm8tcm93LXRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgbm8gcHJvcGVydGllcyB0byBkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdD0icHJvcGVydHkgaW4gZmlsdGVyZWRQcm9wZXJ0aWVzWyRwYXJlbnQuJGluZGV4XT0oY2FwYWJpbGl0eS5wcm9wZXJ0aWVzIHwgb3JkZXJCeTpwcm9wZXJ0aWVzU29ydFRhYmxlRGVmaW5lZC5zb3J0QnlGaWVsZDpwcm9wZXJ0aWVzU29ydFRhYmxlRGVmaW5lZC5yZXZlcnNlKSB0cmFjayBieSAkaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJwcm9wZXJ0eVJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgIGRhdGEtdGVzdHMtaWQ9Int7cHJvcGVydHkubmFtZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5uYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1jbGljaz0idXBkYXRlUHJvcGVydHkocHJvcGVydHksICRwYXJlbnQuJGluZGV4KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJzogaXNWaWV3TW9kZSgpfSI+e3twcm9wZXJ0eS5uYW1lfX08L2E+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3twcm9wZXJ0eS50eXBlfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3Byb3BlcnR5LnR5cGV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWJpbmQ9InByb3BlcnR5LnR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0cy1pZD0ie3twcm9wZXJ0eS5zY2hlbWEucHJvcGVydHkudHlwZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzIHRvb2x0aXAtY29udGVudD0ie3twcm9wZXJ0eS5zY2hlbWEucHJvcGVydHkudHlwZX19IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctYmluZD0icHJvcGVydHkuc2NoZW1hLnByb3BlcnR5LnR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIHRleHQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdG9vbHRpcHMgdG9vbHRpcC1jb250ZW50PSJ7e3Byb3BlcnR5LmRlc2NyaXB0aW9ufX0iIGRhdGEtdGVzdHMtaWQ9Int7cHJvcGVydHkuZGVzY3JpcHRpb259fSIgZGF0YS1uZy1iaW5kPSJwcm9wZXJ0eS5kZXNjcmlwdGlvbiI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9yZXEtYW5kLWNhcGFiaWxpdGllcy9yZXEtYW5kLWNhcGFiaWxpdGllcy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9yZXEtYW5kLWNhcGFiaWxpdGllcy9yZXEtYW5kLWNhcGFiaWxpdGllcy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTJmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3JlcS1hbmQtY2FwYWJpbGl0aWVzL3JlcS1hbmQtY2FwYWJpbGl0aWVzLmxlc3MKQEAgLTAsMCArMSwxOTYgQEAKKy53b3Jrc3BhY2UtcmVxLWFuZC1jYXAgeworCisgICAgd2lkdGg6IDkzJTsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisKKyAgICAudGFic3sKKyAgICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiA2cHg7CisgICAgICAgIGJ1dHRvbnsKKyAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICAgICAgd2lkdGg6IDIzM3B4OworICAgICAgICAgICAgaGVpZ2h0OiAzOHB4OworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRsdl9jb2xvcl90OworICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQG1haW5fY29sb3JfbzsKKyAgICAgICAgICAgIGNvbG9yOiBibGFjazsKKyAgICAgICAgICAgICY6bnRoLWNoaWxkKDEpeworICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMCAwIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAmOm50aC1jaGlsZCgyKXsKKyAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDEwcHggMCAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJi5zZWxlY3RlZHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9hOworICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBtYWluX2NvbG9yX2E7CisgICAgICAgICAgICAgICAgY29sb3I6IHdoaXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC5zZWFyY2h7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKKyAgICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgfQorICAgICAgICA6LW1vei1wbGFjZWhvbGRlciB7CisgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgIH0KKyAgICAgICAgOjotbW96LXBsYWNlaG9sZGVyIHsKKyAgICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgfQorICAgICAgICA6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKKyAgICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgfQorICAgICAgICAjc2VhcmNoLWJveHsKKyAgICAgICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweCAwIDAgMnB4OworICAgICAgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4IDAgMCAycHg7CisgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4IDAgMCAycHg7CisgICAgICAgICAgICAgd2lkdGg6IDIxM3B4OworICAgICAgICAgICAgIGhlaWdodDogMzJweDsKKyAgICAgICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKKyAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAbWFpbl9jb2xvcl9vOworICAgICAgICAgICAgIHRleHQtaW5kZW50OiAxMHB4OworICAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICB9CisgICAgICAgIC5zZWFyY2gtaWNvbi1jb250YWluZXJ7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9hOworICAgICAgICAgICAgaGVpZ2h0OiAzMnB4OworICAgICAgICAgICAgd2lkdGg6IDMycHg7CisgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDsKKyAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICAgICAgLnNlYXJjaC1pY29ueworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICAgICAgICB0b3A6IDlweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAuZXhwYW5kLWNvbGxhcHNlLWJ1dHRvbnN7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgd2lkdGg6IDQ0cHg7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAxMXB4OworICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgICAgICBzcGFueworICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKyAgICAgICAgICAgIC5oYW5kOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC50YWJsZXsKKyAgICAgICAgaGVpZ2h0OjQ5MHB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIH0KKworICAgIC5hcnJvdy11cC1zbWFsbHsKKyAgICAgICAgJi5vcGVuZWR7CisgICAgICAgICAgICAuYXJyb3ctdXAtc21hbGwtaG92ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaXRlbS1vcGVuZWR7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdDsKKyAgICB9CisKKyAgICAucHJvcGVydGllcy10aXRsZXsKKyAgICAgICAgbWFyZ2luOjA7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIH0KKworICAgIC50YWJsZS1jb250YWluZXItZmxleCB7CisgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CisKKyAgICAgICAgLnRleHR7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICB9CisKKyAgICAgICAgJi5yZXF1aXJlbWVudHMtdGFibGV7CisgICAgICAgICAgICBib3JkZXItdG9wOiA0cHggc29saWQgQG1haW5fY29sb3JfYTsKKyAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDEpIHsKKyAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDIwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgyKSB7CisgICAgICAgICAgICAgICAgZmxleC1ncm93OiAyMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMykgeworICAgICAgICAgICAgICAgIGZsZXgtZ3JvdzogMjA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDQpIHsKKyAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDIwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCg1KSB7CisgICAgICAgICAgICAgICAgZmxleC1ncm93OiAyMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoNikgeworICAgICAgICAgICAgICAgIGZsZXgtZ3JvdzogMjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAmLmNhcGFiaWxpdGllcy10YWJsZXsKKyAgICAgICAgICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCBAbWFpbl9jb2xvcl9hOworICAgICAgICAgICAgLnNlbGVjdGVkeworICAgICAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCBAbWFpbl9jb2xvcl9hOworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxMXB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDEpIHsKKyAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDEwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgyKSB7CisgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMykgeworICAgICAgICAgICAgICAgIGZsZXgtZ3JvdzogMTA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDQpIHsKKyAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDEwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCg1KSB7CisgICAgICAgICAgICAgICAgZmxleC1ncm93OiAxMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgJi5wcm9wZXJ0aWVzLXRhYmxleworICAgICAgICAgICAgLnRhYmxleworICAgICAgICAgICAgICAgIGhlaWdodDogYXV0bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMSkgeworICAgICAgICAgICAgICAgIGZsZXgtZ3JvdzogMTU7CisgICAgICAgICAgICAgICAgYXsKKyAgICAgICAgICAgICAgICAgICAgLmhhbmQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDIpIHsKKyAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDMpIHsKKyAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC5mbGV4LWl0ZW06bnRoLWNoaWxkKDQpIHsKKyAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDIwOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy90b3NjYS1hcnRpZmFjdHMvdG9zY2EtYXJ0aWZhY3RzLXZpZXctbW9kZWwudHMgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Rvc2NhLWFydGlmYWN0cy90b3NjYS1hcnRpZmFjdHMtdmlldy1tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZiYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy90b3NjYS1hcnRpZmFjdHMvdG9zY2EtYXJ0aWZhY3RzLXZpZXctbW9kZWwudHMKQEAgLTAsMCArMSw4NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisgICAgJ3VzZSBzdHJpY3QnOworICAgIGltcG9ydCBBcnRpZmFjdE1vZGVsID0gU2RjLk1vZGVscy5BcnRpZmFjdE1vZGVsOworCisgICAgZXhwb3J0IGludGVyZmFjZSBJVG9zY2FBcnRpZmFjdHNTY29wZSBleHRlbmRzIElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSB7CisgICAgICAgIGFydGlmYWN0czogQXJyYXk8TW9kZWxzLkFydGlmYWN0TW9kZWw+OworICAgICAgICB0YWJsZUhlYWRlcnNMaXN0OiBBcnJheTxhbnk+OworICAgICAgICBhcnRpZmFjdFR5cGU6IHN0cmluZzsKKyAgICAgICAgZG93bmxvYWRGaWxlOk1vZGVscy5JRmlsZURvd25sb2FkOworICAgICAgICBpc0xvYWRpbmc6Ym9vbGVhbjsKKyAgICAgICAgc29ydEJ5OnN0cmluZzsKKyAgICAgICAgcmV2ZXJzZTpib29sZWFuOworCisgICAgICAgIGdldFRpdGxlKCk6IHN0cmluZzsKKyAgICAgICAgZG93bmxvYWQoYXJ0aWZhY3Q6TW9kZWxzLkFydGlmYWN0TW9kZWwpOiB2b2lkOworICAgICAgICBzb3J0KHNvcnRCeTpzdHJpbmcpOiB2b2lkOworICAgICAgICBzaG93Tm9BcnRpZmFjdE1lc3NhZ2UoKTpib29sZWFuOworICAgIH0KKworICAgIGV4cG9ydCBjbGFzcyBUb3NjYUFydGlmYWN0c1ZpZXdNb2RlbCB7CisKKyAgICAgICAgc3RhdGljICckaW5qZWN0JyA9IFsKKyAgICAgICAgICAgICckc2NvcGUnLAorICAgICAgICAgICAgJyRmaWx0ZXInCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6SVRvc2NhQXJ0aWZhY3RzU2NvcGUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjpuZy5JRmlsdGVyU2VydmljZSkgeworICAgICAgICAgICAgdGhpcy5pbml0U2NvcGUoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZVNlbGVjdGVkTWVudUl0ZW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW5pdFNjb3BlID0gKCk6dm9pZCA9PiB7CisgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNvcnRCeSA9ICdhcnRpZmFjdERpc3BsYXlOYW1lJzsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJldmVyc2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldFZhbGlkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdFR5cGUgPSAnbm9ybWFsJzsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFRpdGxlID0gKCk6c3RyaW5nID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZmlsdGVyKCJyZXNvdXJjZU5hbWUiKSh0aGlzLiRzY29wZS5jb21wb25lbnQubmFtZSkgKyAnIEFydGlmYWN0cyc7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnRhYmxlSGVhZGVyc0xpc3QgPSBbCisgICAgICAgICAgICAgICAge3RpdGxlOiAnTmFtZScsIHByb3BlcnR5OiAnYXJ0aWZhY3REaXNwbGF5TmFtZSd9LAorICAgICAgICAgICAgICAgIHt0aXRsZTogJ1R5cGUnLCBwcm9wZXJ0eTogJ2FydGlmYWN0VHlwZSd9CisgICAgICAgICAgICBdOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5hcnRpZmFjdHMgPSA8QXJ0aWZhY3RNb2RlbFtdPl8udmFsdWVzKHRoaXMuJHNjb3BlLmNvbXBvbmVudC50b3NjYUFydGlmYWN0cyk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0ID0gKHNvcnRCeTpzdHJpbmcpOnZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJldmVyc2UgPSAodGhpcy4kc2NvcGUuc29ydEJ5ID09PSBzb3J0QnkpID8gIXRoaXMuJHNjb3BlLnJldmVyc2UgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5zb3J0QnkgPSBzb3J0Qnk7CisgICAgICAgICAgICB9OworCisKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd05vQXJ0aWZhY3RNZXNzYWdlID0gKCk6Ym9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmFydGlmYWN0cy5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvdG9zY2EtYXJ0aWZhY3RzL3Rvc2NhLWFydGlmYWN0cy12aWV3Lmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Rvc2NhLWFydGlmYWN0cy90b3NjYS1hcnRpZmFjdHMtdmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0N2IzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Rvc2NhLWFydGlmYWN0cy90b3NjYS1hcnRpZmFjdHMtdmlldy5odG1sCkBAIC0wLDAgKzEsNDUgQEAKKzxkaXYgY2xhc3M9IndvcmtzcGFjZS10b3NjYS1hcnRpZmFjdCI+CisgICAgPGRpdiBjbGFzcz0idGFibGUtY29udGFpbmVyLWZsZXgiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZSIgZGF0YS1uZy1jbGFzcz0ieyd2aWV3LW1vZGUnOiBpc1ZpZXdNb2RlKCl9Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWQgZmxleC1jb250YWluZXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciBoZWFkLXJvdyBoYW5kIGZsZXgtaXRlbSIgbmctcmVwZWF0PSJoZWFkZXIgaW4gdGFibGVIZWFkZXJzTGlzdCB0cmFjayBieSAkaW5kZXgiIGRhdGEtbmctY2xpY2s9InNvcnQoaGVhZGVyLnByb3BlcnR5KSI+e3toZWFkZXIudGl0bGV9fQorICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLW5nLXNob3c9InNvcnRCeSA9PT0gaGVhZGVyLnByb3BlcnR5IiBjbGFzcz0idGFibGUtaGVhZGVyLXNvcnQtYXJyb3ciIGRhdGEtbmctY2xhc3M9InsnZG93bic6IHJldmVyc2UsICd1cCc6IXJldmVyc2V9Ij4gPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLW5vLXRleHQtaGVhZGVyIGhlYWQtcm93IGZsZXgtaXRlbSI+PC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICAgICAgICAgICAgICAgIDxwZXJmZWN0LXNjcm9sbGJhciBzdXBwcmVzcy1zY3JvbGwteD0idHJ1ZSIgc2Nyb2xsLXktbWFyZ2luLW9mZnNldD0iMCIgaW5jbHVkZS1wYWRkaW5nPSJ0cnVlIiBjbGFzcz0ic2Nyb2xsYmFyLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0ic2hvd05vQXJ0aWZhY3RNZXNzYWdlKCkiIGNsYXNzPSJuby1yb3ctdGV4dCIgZGF0YS1uZy1jbGFzcz0ieydkaXNhYmxlZCc6IGlzRGlzYWJsZU1vZGUoKX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIG5vIFRPU0NBIGFydGlmYWN0cyB0byBkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbmctcmVwZWF0LXN0YXJ0PSJhcnRpZmFjdCBpbiBhcnRpZmFjdHN8IG9yZGVyQnk6c29ydEJ5OnJldmVyc2UgdHJhY2sgYnkgJGluZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmbGV4LWNvbnRhaW5lciBkYXRhLXJvdyIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J3NlbGVjdGVkJzogYXJ0aWZhY3Quc2VsZWN0ZWR9Ij4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiAgZGF0YS1uZy1jbGljaz0iYXJ0aWZhY3Quc2VsZWN0ZWQgPSAhYXJ0aWZhY3Quc2VsZWN0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcHJpdGUgdGFibGUtYXJyb3ciIGRhdGEtbmctY2xhc3M9Insnb3BlbmVkJzogYXJ0aWZhY3Quc2VsZWN0ZWR9IiBkYXRhLXRlc3RzLWlkPSJ7e2FydGlmYWN0LmFydGlmYWN0RGlzcGxheU5hbWV9fSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXJ0aWZhY3QuYXJ0aWZhY3REaXNwbGF5TmFtZX19CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY29sLWdlbmVyYWwgZmxleC1pdGVtIiAgZGF0YS1uZy1jbGljaz0iYXJ0aWZhY3Quc2VsZWN0ZWQgPSAhYXJ0aWZhY3Quc2VsZWN0ZWQiIGRhdGEtdGVzdHMtaWQ9Int7YXJ0aWZhY3QuYXJ0aWZhY3RUeXBlfX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXJ0aWZhY3QuYXJ0aWZhY3RUeXBlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1idG4tY29sIGZsZXgtaXRlbSBkb3dubG9hZC1pY29uLWNvbnRhaW5lciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFibGUtZG93bmxvYWQtYnRuIHRvc2NhIiBkb3dubG9hZC1hcnRpZmFjdCAgZGF0YS10ZXN0cy1pZD0iZG93bmxvYWRfe3thcnRpZmFjdC5hcnRpZmFjdERpc3BsYXlOYW1lfX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWlmPSJhcnRpZmFjdC5hcnRpZmFjdE5hbWUiIGNvbXBvbmVudD0iY29tcG9uZW50IiBhcnRpZmFjdD0iYXJ0aWZhY3QiIHNob3ctbG9hZGVyPSJ0cnVlIj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW5nLXJlcGVhdC1lbmQ9IiIgZGF0YS1uZy1pZj0iYXJ0aWZhY3Quc2VsZWN0ZWQiIGNsYXNzPSJpdGVtLW9wZW5lZCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJkZXRhaWxzLXRpdGxlIj5MYWJlbDo8L3NwYW4+IHt7YXJ0aWZhY3QuYXJ0aWZhY3RMYWJlbH19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJkZXRhaWxzLXRpdGxlIj5VVUlEOjwvc3Bhbj4ge3thcnRpZmFjdC51bmlxdWVJZH19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJkZXRhaWxzLXRpdGxlIj5EZXNjcmlwdGlvbjo8L3NwYW4+IHt7YXJ0aWZhY3QuZGVzY3JpcHRpb259fTwvZGl2PgorCisKKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8L3BlcmZlY3Qtc2Nyb2xsYmFyPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Rvc2NhLWFydGlmYWN0cy90b3NjYS1hcnRpZmFjdHMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvdG9zY2EtYXJ0aWZhY3RzL3Rvc2NhLWFydGlmYWN0cy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTJiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL3Rvc2NhLWFydGlmYWN0cy90b3NjYS1hcnRpZmFjdHMubGVzcwpAQCAtMCwwICsxLDc0IEBACisud29ya3NwYWNlLXRvc2NhLWFydGlmYWN0IHsKKyAgICB3aWR0aDogOTMlOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAudy1zZGMtY2xhc3NpYy1idG4geworICAgICAgICBmbG9hdDogcmlnaHQ7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgfQorCisgICAgLmRldGFpbHMtdGl0bGV7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKKyAgICB9CisKKyAgICAudGFibGV7CisgICAgICAgIGhlaWdodDogNDkwcHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgfQorCisKKyAgICAudGFibGUtY29udGFpbmVyLWZsZXggeworICAgICAgICBtYXJnaW4tdG9wOiAyN3B4OworCisgICAgICAgIC5pdGVtLW9wZW5lZHsKKyAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLmZsZXgtaXRlbTpudGgtY2hpbGQoMSkgeworICAgICAgICAgICAgZmxleC1ncm93OiAxNTsKKyAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgc3Bhbi50YWJsZS1hcnJvdyB7CisgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiA3cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgyKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDY7CisgICAgICAgIH0KKworICAgICAgICAuZmxleC1pdGVtOm50aC1jaGlsZCgzKSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIH0KKworCisKKworICAgICAgICAudGFibGUtZG93bmxvYWQtYnRueworICAgICAgICAgICAgJi50b3NjYXsKKyAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMDsKKyAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAuZG93bmxvYWQtaWNvbi1jb250YWluZXJ7CisgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisKKyAgICAgICAgICAgIC5sb2FkZXJ7CisgICAgICAgICAgICAgICAgbGVmdDogNjAlOworICAgICAgICAgICAgICAgIHRvcDogNDVweDsKKyAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICAgICAgaGVpZ2h0OiAwcHg7CisgICAgICAgICAgICAgICAgd2lkdGg6IDYzcHg7CisgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3dvcmtzcGFjZS12aWV3LW1vZGVsLnRzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2Uvd29ya3NwYWNlLXZpZXctbW9kZWwudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MjNmMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3dvcmtzcGFjZS12aWV3LW1vZGVsLnRzCkBAIC0wLDAgKzEsNzAzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqCisgKiBDcmVhdGVkIGJ5IG9iYXJkYSBvbiAzLzMwLzIwMTYuCisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uL3JlZmVyZW5jZXMiLz4KK21vZHVsZSBTZGMuVmlld01vZGVscyB7CisKKyAgICAndXNlIHN0cmljdCc7CisgICAgaW1wb3J0IFJlc291cmNlID0gU2RjLk1vZGVscy5Db21wb25lbnRzLlJlc291cmNlOworICAgIGltcG9ydCBSZXNvdXJjZVR5cGUgPSBTZGMuVXRpbHMuQ29uc3RhbnRzLlJlc291cmNlVHlwZTsKKworICAgIGV4cG9ydCBpbnRlcmZhY2UgSVdvcmtzcGFjZVZpZXdNb2RlbFNjb3BlIGV4dGVuZHMgbmcuSVNjb3BlIHsKKworICAgICAgICBpc0xvYWRpbmc6IGJvb2xlYW47CisgICAgICAgIGlzQ3JlYXRlUHJvZ3Jlc3M6IGJvb2xlYW47CisgICAgICAgIGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBvcmlnaW5Db21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudDsKKyAgICAgICAgY29tcG9uZW50VHlwZTogc3RyaW5nOworICAgICAgICBpbXBvcnRGaWxlOiBhbnk7CisgICAgICAgIGxlZnRCYXJUYWJzOiBVdGlscy5NZW51SXRlbUdyb3VwOworICAgICAgICBpc05ldzogYm9vbGVhbjsKKyAgICAgICAgaXNGcm9tSW1wb3J0OiBib29sZWFuOworICAgICAgICBpc1ZhbGlkRm9ybTogYm9vbGVhbjsKKyAgICAgICAgbW9kZTogVXRpbHMuQ29uc3RhbnRzLldvcmtzcGFjZU1vZGU7CisgICAgICAgIGJyZWFkY3J1bWJzTW9kZWw6IEFycmF5PFV0aWxzLk1lbnVJdGVtR3JvdXA+OworICAgICAgICBzZGNNZW51OiBNb2RlbHMuSUFwcE1lbnU7CisgICAgICAgIGNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9uczogYW55OworICAgICAgICB2ZXJzaW9uOiBzdHJpbmc7CisgICAgICAgIHZlcnNpb25zTGlzdDogQXJyYXk8YW55PjsKKyAgICAgICAgY2hhbmdlVmVyc2lvbjogYW55OworICAgICAgICBpc0NvbXBvc2l0aW9uOiBib29sZWFuOworICAgICAgICBpc0RlcGxveW1lbnQ6IGJvb2xlYW47CisgICAgICAgICRzdGF0ZTogbmcudWkuSVN0YXRlU2VydmljZTsKKyAgICAgICAgdXNlcjogTW9kZWxzLklVc2VyUHJvcGVydGllczsKKyAgICAgICAgdGhpcmRQYXJ0eTogYm9vbGVhbjsKKyAgICAgICAgZGlzYWJsZWRCdXR0b25zOiBib29sZWFuOworICAgICAgICBtZW51Q29tcG9uZW50VGl0bGU6IHN0cmluZzsKKyAgICAgICAgcHJvZ3Jlc3NTZXJ2aWNlOiBTZGMuU2VydmljZXMuUHJvZ3Jlc3NTZXJ2aWNlOworICAgICAgICBwcm9ncmVzc01lc3NhZ2U6IHN0cmluZzsKKyAgICAgICAgLy8gbGVmdFBhbmVsQ29tcG9uZW50czpBcnJheTxNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQ+OyAvL3RoaXMgaXMgaW4gb3JkZXIgdG8gbG9hZCB0aGUgbGVmdCBwYW5lbCBvbmNlLCBhbmQgbm90IHdhaXQgbG9uZyB0aW1lIHdoZW4gbW92aW5nIHRvIGNvbXBvc2l0aW9uCisKKyAgICAgICAgc2hvd0NoYW5nZVN0YXRlQnV0dG9uKCk6IGJvb2xlYW47CisgICAgICAgIGdldENvbXBvbmVudCgpOiBTZGMuTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50OworICAgICAgICBzZXRDb21wb25lbnQoY29tcG9uZW50OiBTZGMuTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KTogdm9pZDsKKyAgICAgICAgb25NZW51SXRlbVByZXNzZWQoc3RhdGU6IHN0cmluZyk6IG5nLklQcm9taXNlPGJvb2xlYW4+OworICAgICAgICBzYXZlKCk6IG5nLklQcm9taXNlPGJvb2xlYW4+OworICAgICAgICBzZXRWYWxpZFN0YXRlKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkOworICAgICAgICByZXZlcnQoKTogdm9pZDsKKyAgICAgICAgY2hhbmdlTGlmZWN5Y2xlU3RhdGUoc3RhdGU6IHN0cmluZyk6IHZvaWQ7CisgICAgICAgIGVuYWJsZWRUYWJzKCk6IHZvaWQKKyAgICAgICAgaXNEZXNpZ25lcigpOiBib29sZWFuOworICAgICAgICBpc1ZpZXdNb2RlKCk6IGJvb2xlYW47CisgICAgICAgIGlzRWRpdE1vZGUoKTogYm9vbGVhbjsKKyAgICAgICAgaXNDcmVhdGVNb2RlKCk6IGJvb2xlYW47CisgICAgICAgIGlzRGlzYWJsZU1vZGUoKTogYm9vbGVhbjsKKyAgICAgICAgc2hvd0Z1bGxJY29ucygpOiBib29sZWFuOworICAgICAgICBnb1RvQnJlYWRjcnVtYkhvbWUoKTogdm9pZDsKKyAgICAgICAgb25WZXJzaW9uQ2hhbmdlZChzZWxlY3RlZElkOiBzdHJpbmcpOiB2b2lkOworICAgICAgICBnZXRMYXRlc3RWZXJzaW9uKCk6IHZvaWQ7CisgICAgICAgIGdldFN0YXR1cygpOiBzdHJpbmc7CisgICAgICAgIHNob3dMaWZlY3ljbGVJY29uKCk6IGJvb2xlYW47CisgICAgICAgIHVwZGF0ZVNlbGVjdGVkTWVudUl0ZW0oKTogdm9pZDsKKyAgICAgICAgdXBsb2FkRmlsZUNoYW5nZWRJbkdlbmVyYWxUYWIoKTogdm9pZDsKKyAgICAgICAgdXBkYXRlTWVudUNvbXBvbmVudE5hbWUoQ29tcG9uZW50TmFtZTogc3RyaW5nKTogdm9pZDsKKyAgICB9CisKKyAgICBleHBvcnQgY2xhc3MgV29ya3NwYWNlVmlld01vZGVsIHsKKworICAgICAgICBzdGF0aWMgJyRpbmplY3QnID0gWworICAgICAgICAgICAgJyRzY29wZScsCisgICAgICAgICAgICAnaW5qZWN0Q29tcG9uZW50JywKKyAgICAgICAgICAgICdDb21wb25lbnRGYWN0b3J5JywKKyAgICAgICAgICAgICckc3RhdGUnLAorICAgICAgICAgICAgJ3NkY01lbnUnLAorICAgICAgICAgICAgJyRxJywKKyAgICAgICAgICAgICdNZW51SGFuZGxlcicsCisgICAgICAgICAgICAnU2RjLlNlcnZpY2VzLkNhY2hlU2VydmljZScsCisgICAgICAgICAgICAnQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyJywKKyAgICAgICAgICAgICdNb2RhbHNIYW5kbGVyJywKKyAgICAgICAgICAgICdMZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UnLAorICAgICAgICAgICAgJyRmaWx0ZXInLAorICAgICAgICAgICAgJ0V2ZW50TGlzdGVuZXJTZXJ2aWNlJywKKyAgICAgICAgICAgICdTZGMuU2VydmljZXMuRW50aXR5U2VydmljZScsCisgICAgICAgICAgICAnTm90aWZpY2F0aW9uJywKKyAgICAgICAgICAgICckc3RhdGVQYXJhbXMnLAorICAgICAgICAgICAgJ1NkYy5TZXJ2aWNlcy5Qcm9ncmVzc1NlcnZpY2UnCisgICAgICAgIF07CisKKyAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSAkc2NvcGU6IElXb3Jrc3BhY2VWaWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RDb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBDb21wb25lbnRGYWN0b3J5OiBVdGlscy5Db21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZTogbmcudWkuSVN0YXRlU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZGNNZW51OiBNb2RlbHMuSUFwcE1lbnUsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJHE6IG5nLklRU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBNZW51SGFuZGxlcjogVXRpbHMuTWVudUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBTZXJ2aWNlcy5DYWNoZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyOiBTZGMuVXRpbHMuQ2hhbmdlTGlmZWN5Y2xlU3RhdGVIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE1vZGFsc0hhbmRsZXI6IFNkYy5VdGlscy5Nb2RhbHNIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIExlZnRQYWxldHRlTG9hZGVyU2VydmljZTogU2VydmljZXMuQ29tcG9uZW50cy5MZWZ0UGFsZXR0ZUxvYWRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgJGZpbHRlcjogbmcuSUZpbHRlclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgRXZlbnRMaXN0ZW5lclNlcnZpY2U6IFNlcnZpY2VzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIEVudGl0eVNlcnZpY2U6IFNkYy5TZXJ2aWNlcy5FbnRpdHlTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIE5vdGlmaWNhdGlvbjogYW55LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlICRzdGF0ZVBhcmFtczogYW55LAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHByb2dyZXNzU2VydmljZTogU2RjLlNlcnZpY2VzLlByb2dyZXNzU2VydmljZSkgeworCisgICAgICAgICAgICB0aGlzLmluaXRTY29wZSgpOworICAgICAgICAgICAgdGhpcy5pbml0QWZ0ZXJTY29wZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByb2xlOiBzdHJpbmc7CisgICAgICAgIHByaXZhdGUgY29tcG9uZW50czogQXJyYXk8TW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50PjsKKworICAgICAgICBwcml2YXRlIGluaXRWaWV3TW9kZSA9ICgpOiBVdGlscy5Db25zdGFudHMuV29ya3NwYWNlTW9kZSA9PiB7CisgICAgICAgICAgICBsZXQgbW9kZSA9IFV0aWxzLkNvbnN0YW50cy5Xb3Jrc3BhY2VNb2RlLlZJRVc7CisKKyAgICAgICAgICAgIGlmICghdGhpcy4kc3RhdGUucGFyYW1zWydpZCddKSB7ICAgLy8mJiAhdGhpcy4kc3RhdGUucGFyYW1zWyd2c3BDb21wb25lbnQnXQorICAgICAgICAgICAgICAgIG1vZGUgPSBVdGlscy5Db25zdGFudHMuV29ya3NwYWNlTW9kZS5DUkVBVEU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQubGlmZWN5Y2xlU3RhdGUgPT09IFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRTdGF0ZS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUICYmCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5sYXN0VXBkYXRlclVzZXJJZCA9PT0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCJ1c2VyIikudXNlcklkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNQcm9kdWN0KCkgJiYgdGhpcy5yb2xlID09IFV0aWxzLkNvbnN0YW50cy5Sb2xlLlBST0RVQ1RfTUFOQUdFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFV0aWxzLkNvbnN0YW50cy5Xb3Jrc3BhY2VNb2RlLkVESVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNTZXJ2aWNlKCkgfHwgdGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSkgJiYgdGhpcy5yb2xlID09IFV0aWxzLkNvbnN0YW50cy5Sb2xlLkRFU0lHTkVSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gVXRpbHMuQ29uc3RhbnRzLldvcmtzcGFjZU1vZGUuRURJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2RlOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdENoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucyA9ICgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1NlcnZpY2UoKSAmJiAoVXRpbHMuQ29uc3RhbnRzLlJvbGUuT1BTID09IHRoaXMucm9sZSB8fCBVdGlscy5Db25zdGFudHMuUm9sZS5HT1ZFUk5PUiA9PSB0aGlzLnJvbGUpID8gdGhpcy4kc2NvcGUuY29tcG9uZW50LmRpc3RyaWJ1dGlvblN0YXR1cyA6IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5saWZlY3ljbGVTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucyA9IHRoaXMuc2RjTWVudS5yb2xlc1t0aGlzLnJvbGVdLmNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9uc1tzdGF0ZV07CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpc05lZWRTYXZlID0gKCk6IGJvb2xlYW4gPT4geworICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmlzRWRpdE1vZGUoKSAmJiAvL3RoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBvbmJvYXJkaW5nIC0gd2UgbmVlZCB0byBnZXQgdGhlIGFydGlmYWN0IGluIG9yZGVyIHRvIGF2b2lkIHNhdmluZyB0aGUgdmYgd2hlbiBtb3ZpbmcgZnJvbSB0aGVpciB0YWJzCisgICAgICAgICAgICAgICAgKHRoaXMuJHN0YXRlLmN1cnJlbnQubmFtZSA9PT0gVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfTUFOQUdFTUVOVF9XT1JLRkxPVyB8fCB0aGlzLiRzdGF0ZS5jdXJyZW50Lm5hbWUgPT09IFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX05FVFdPUktfQ0FMTF9GTE9XKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLmlzRWRpdE1vZGUoKSAmJgorICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmN1cnJlbnQuZGF0YSAmJiB0aGlzLiRzdGF0ZS5jdXJyZW50LmRhdGEudW5zYXZlZENoYW5nZXM7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0U2NvcGUgPSAoKTogdm9pZCA9PiB7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudCA9IHRoaXMuaW5qZWN0Q29tcG9uZW50OworICAgICAgICAgICAgdGhpcy4kc2NvcGUubWVudUNvbXBvbmVudFRpdGxlID0gdGhpcy4kc2NvcGUuY29tcG9uZW50Lm5hbWU7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5kaXNhYmxlZEJ1dHRvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9yaWdpbkNvbXBvbmVudCA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVDb21wb25lbnQodGhpcy4kc2NvcGUuY29tcG9uZW50KTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudFR5cGUgPSB0aGlzLiRzY29wZS5jb21wb25lbnQuY29tcG9uZW50VHlwZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZlcnNpb24gPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ3ZlcnNpb24nKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVzZXIgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoInVzZXIiKTsKKyAgICAgICAgICAgIHRoaXMucm9sZSA9IHRoaXMuJHNjb3BlLnVzZXIucm9sZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLm1vZGUgPSB0aGlzLmluaXRWaWV3TW9kZSgpOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNWYWxpZEZvcm0gPSB0cnVlOworICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlTGlmZWN5Y2xlU3RhdGVCdXR0b25zKCk7CisgICAgICAgICAgICB0aGlzLmluaXRWZXJzaW9uT2JqZWN0KCk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS4kc3RhdGUgPSB0aGlzLiRzdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNDb21wb3NpdGlvbiA9ICh0aGlzLiRzdGF0ZS5jdXJyZW50Lm5hbWUuaW5kZXhPZihVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9DT01QT1NJVElPTikgPiAtMSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0RlcGxveW1lbnQgPSAodGhpcy4kc3RhdGUuY3VycmVudC5uYW1lLmluZGV4T2YoVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfREVQTE9ZTUVOVCkgPiAtMSk7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5wcm9ncmVzc1NlcnZpY2UgPSB0aGlzLnByb2dyZXNzU2VydmljZTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZ2V0Q29tcG9uZW50ID0gKCk6IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQgPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5jb21wb25lbnQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGRhdGVNZW51Q29tcG9uZW50TmFtZSA9IChDb21wb25lbnROYW1lOiBzdHJpbmcpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5tZW51Q29tcG9uZW50VGl0bGUgPSBDb21wb25lbnROYW1lOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2RjTWVudSA9IHRoaXMuc2RjTWVudTsKKyAgICAgICAgICAgIC8vIFdpbGwgYmUgY2FsbGVkIGZyb20gZWFjaCBzdGVwIGFmdGVyIHNhdmUgdG8gdXBkYXRlIHRoZSByZXNvdXJjZS4KKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNldENvbXBvbmVudCA9IChjb21wb25lbnQ6IFNkYy5Nb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS51cGxvYWRGaWxlQ2hhbmdlZEluR2VuZXJhbFRhYiA9ICgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHVzZXIgc2VsZWN0IGJyb3dzZSBmaWxlLCBhbmQgaW4gdXBkYXRlIG1vZGUsIG5lZWQgdG8gZGlzYWJsZSBzdWJtaXQgZm9yIHRlc3RpbmcgYW5kIGNoZWNraW4gYnV0dG9ucy4KKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuaXNFZGl0TW9kZSgpICYmIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Jlc291cmNlKCkgJiYgKDxSZXNvdXJjZT50aGlzLiRzY29wZS5jb21wb25lbnQpLnJlc291cmNlVHlwZSA9PSBSZXNvdXJjZVR5cGUuVkYpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGlzYWJsZWRCdXR0b25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vbk1lbnVJdGVtUHJlc3NlZCA9IChzdGF0ZTogc3RyaW5nKTogbmcuSVByb21pc2U8Ym9vbGVhbj4gPT4geworICAgICAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5pc05lZWRTYXZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmlzVmFsaWRGb3JtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKHN0YXRlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5jb21wb25lbnRUeXBlLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2F2ZSgpLnRoZW4ob25TdWNjZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmb3JtIGlzIG5vdCB2YWxpZCcpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKHN0YXRlLCB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy4kc2NvcGUuY29tcG9uZW50LnVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy4kc2NvcGUuY29tcG9uZW50LmNvbXBvbmVudFR5cGUudG9Mb3dlckNhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zZXRWYWxpZFN0YXRlID0gKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc1ZhbGlkRm9ybSA9IGlzVmFsaWQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5vblZlcnNpb25DaGFuZ2VkID0gKHNlbGVjdGVkSWQ6IHN0cmluZyk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHN0YXRlLmN1cnJlbnQuZGF0YSAmJiB0aGlzLiRzdGF0ZS5jdXJyZW50LmRhdGEudW5zYXZlZENoYW5nZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hhbmdlVmVyc2lvbi5zZWxlY3RlZFZlcnNpb24gPSBfLmZpbmQodGhpcy4kc2NvcGUudmVyc2lvbnNMaXN0LCB7dmVyc2lvbklkOiB0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWR9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28odGhpcy4kc3RhdGUuY3VycmVudC5uYW1lLCB7CisgICAgICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZElkLAorICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLiRzY29wZS5jb21wb25lbnRUeXBlLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAgIG1vZGU6IFV0aWxzLkNvbnN0YW50cy5Xb3Jrc3BhY2VNb2RlLlZJRVcsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHRoaXMuJHN0YXRlLnBhcmFtc1snY29tcG9uZW50cyddCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldExhdGVzdFZlcnNpb24gPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUub25WZXJzaW9uQ2hhbmdlZChfLmZpcnN0KHRoaXMuJHNjb3BlLnZlcnNpb25zTGlzdCkudmVyc2lvbklkKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNhdmUgPSAoc3RhdGU/OiBzdHJpbmcpOiBuZy5JUHJvbWlzZTxib29sZWFuPiA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5FdmVudExpc3RlbmVyU2VydmljZS5ub3RpZnlPYnNlcnZlcnMoVXRpbHMuQ29uc3RhbnRzLkVWRU5UUy5PTl9XT1JLU1BBQ0VfU0FWRV9CVVRUT05fQ0xJQ0spOworCisgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1NlcnZpY2UuaW5pdENyZWF0ZUNvbXBvbmVudFByb2dyZXNzKHRoaXMuJHNjb3BlLmNvbXBvbmVudC51bmlxdWVJZCk7CisKKyAgICAgICAgICAgICAgICBsZXQgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7CisgICAgICAgICAgICAgICAgbGV0IG1vZGFsSW5zdGFuY2U6IG5nLnVpLmJvb3RzdHJhcC5JTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisKKyAgICAgICAgICAgICAgICBsZXQgb25GYWlsZWQgPSAoKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuT05fV09SS1NQQUNFX1NBVkVfQlVUVE9OX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1NlcnZpY2UuZGVsZXRlUHJvZ3Jlc3NWYWx1ZSh0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWQpOworICAgICAgICAgICAgICAgICAgICBtb2RhbEluc3RhbmNlICYmIG1vZGFsSW5zdGFuY2UuY2xvc2UoKTsgIC8vIENsb3NlIHRoZSBtb2RhbCBpbiBjYXNlIGl0IGlzIG9wZW5lZC4KKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNDcmVhdGVQcm9ncmVzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0xvYWRpbmcgPSBmYWxzZTsgLy8gc3RvcCB0aGUgcHJvZ3Jlc3MuCisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2V0VmFsaWRTdGF0ZSh0cnVlKTsgIC8vIFNldCB0aGUgZm9ybSB2YWxpZCAoaWYgc2VudCBmb3JtIGlzIHZhbGlkLCB0aGUgZXJyb3IgZnJvbSBzZXJ2ZXIpLgorICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuJHNjb3BlLmlzQ3JlYXRlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQgPSB0aGlzLiRzY29wZS5vcmlnaW5Db21wb25lbnQ7IC8vIFNldCB0aGUgY29tcG9uZW50IGJhY2sgdG8gdGhlIG9yaWdpbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVNZW51SXRlbXMoKTsgIC8vIEVuYWJsZSB0aGUgbWVudSBpdGVtcyAobGVmdCB0YWJzKSwgc28gdXNlciBjYW4gcHJlc3Mgb24gdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmRpc2FibGVkQnV0dG9ucyA9IGZhbHNlOyAgLy8gRW5hYmxlICJzdWJtaXQgZm9yIHRlc3RpbmciICYgY2hlY2tpbmcgYnV0dG9ucy4KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChmYWxzZSk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGxldCBvblN1Y2Nlc3NDcmVhdGUgPSAoY29tcG9uZW50OiBNb2RlbHMuQ29tcG9uZW50cy5Db21wb25lbnQpID0+IHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLkV2ZW50TGlzdGVuZXJTZXJ2aWNlLm5vdGlmeU9ic2VydmVycyhVdGlscy5Db25zdGFudHMuRVZFTlRTLk9OX1dPUktTUEFDRV9TQVZFX0JVVFRPTl9TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1NlcnZpY2UuZGVsZXRlUHJvZ3Jlc3NWYWx1ZSh0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWQpOworICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBjb21wb25lbnRzIGZvciBicmVhZGNydW1icworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMudW5zaGlmdChjb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbyhVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9HRU5FUkFMLCB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZDogY29tcG9uZW50LnVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY29tcG9uZW50LmNvbXBvbmVudFR5cGUudG9Mb3dlckNhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRydWUpOworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzVXBkYXRlID0gKGNvbXBvbmVudDogTW9kZWxzLkNvbXBvbmVudHMuQ29tcG9uZW50KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzQ3JlYXRlUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZGlzYWJsZWRCdXR0b25zID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRMaXN0ZW5lclNlcnZpY2Uubm90aWZ5T2JzZXJ2ZXJzKFV0aWxzLkNvbnN0YW50cy5FVkVOVFMuT05fV09SS1NQQUNFX1NBVkVfQlVUVE9OX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzU2VydmljZS5kZWxldGVQcm9ncmVzc1ZhbHVlKHRoaXMuJHNjb3BlLmNvbXBvbmVudC51bmlxdWVJZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgY2lyY2xlIGxvYWRlci4KKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnRhZ3MgPSBfLnJlamVjdChjb21wb25lbnQudGFncywgKGl0ZW0pPT4geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT09IGNvbXBvbmVudC5uYW1lCisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9yaWdpbkNvbXBvbmVudCA9IHRoaXMuQ29tcG9uZW50RmFjdG9yeS5jcmVhdGVDb21wb25lbnQodGhpcy4kc2NvcGUuY29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBjb21wb25lbnRzIGZvciBicmVhZGNydW1icworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMudW5zaGlmdChjb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBsZWZ0IHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuZW5hYmxlZFRhYnMoKTsKKworCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzdGF0ZS5jdXJyZW50LmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmN1cnJlbnQuZGF0YS51bnNhdmVkQ2hhbmdlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmlzQ3JlYXRlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnByb2dyZXNzTWVzc2FnZSA9ICJDcmVhdGluZyBBc3NldC4uLiI7CisgICAgICAgICAgICAgICAgICAgIC8vIENSRUFURSBNT0RFCisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzQ3JlYXRlUHJvZ3Jlc3MgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGNyZWF0aW5nIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5Db21wb25lbnRGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudE9uU2VydmVyKHRoaXMuJHNjb3BlLmNvbXBvbmVudCkudGhlbihvblN1Y2Nlc3NDcmVhdGUsIG9uRmFpbGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGltcG9ydCBDU0FSLiBOb3RpZnkgdXNlciB0aGF0IGltcG9ydCBWRiB3aWxsIHRha2UgbG9uZyB0aW1lICh0aGUgY3JlYXRlIGlzIHBlcmZvcm1lZCBpbiB0aGUgYmFja2dyb3VuZCkuCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5jb21wb25lbnQuaXNSZXNvdXJjZSgpICYmICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5jc2FyVVVJRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ob3RpZmljYXRpb24uaW5mbyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiSU1QT1JUX1ZGX01FU1NBR0VfQ1JFQVRFX1RBS0VTX0xPTkdfVElNRV9ERVNDUklQVElPTiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJJTVBPUlRfVkZfTUVTU0FHRV9DUkVBVEVfVEFLRVNfTE9OR19USU1FX1RJVExFIikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVVBEQVRFIE1PREUKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNDcmVhdGVQcm9ncmVzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnByb2dyZXNzTWVzc2FnZSA9ICJVcGRhdGluZyBBc3NldC4uLiI7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU1lbnVJdGVtcygpOworCisKKyAgICAgICAgICAgICAgICAgICAgLy8gV29yayBhcm91bmQgdG8gY2hhbmdlIHRoZSBjc2FyIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGVTZXJ2aWNlLmdldChVdGlscy5Db25zdGFudHMuQ0hBTkdFX0NPTVBPTkVOVF9DU0FSX1ZFUlNJT05fRkxBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICg8UmVzb3VyY2U+dGhpcy4kc2NvcGUuY29tcG9uZW50KS5jc2FyVmVyc2lvbiA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldChVdGlscy5Db25zdGFudHMuQ0hBTkdFX0NPTVBPTkVOVF9DU0FSX1ZFUlNJT05fRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5yZW1vdmUoVXRpbHMuQ29uc3RhbnRzLkNIQU5HRV9DT01QT05FTlRfQ1NBUl9WRVJTSU9OX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50LnVwZGF0ZUNvbXBvbmVudCgpLnRoZW4ob25TdWNjZXNzVXBkYXRlLCBvbkZhaWxlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUucmV2ZXJ0ID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIC8vaW4gc3RhdGUgb2YgaW1wb3J0IGZpbGUgbGVhdmUgdGhlIGZpbGUgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBpZiAodGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSAmJiAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuaW1wb3J0ZWRGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wRmlsZTogU2RjLkRpcmVjdGl2ZXMuRmlsZVVwbG9hZE1vZGVsID0gKDxSZXNvdXJjZT50aGlzLiRzY29wZS5jb21wb25lbnQpLmltcG9ydGVkRmlsZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50ID0gdGhpcy5Db21wb25lbnRGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudCh0aGlzLiRzY29wZS5vcmlnaW5Db21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuaW1wb3J0ZWRGaWxlID0gdGVtcEZpbGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuY29tcG9uZW50ID0gdGhpcy5Db21wb25lbnRGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudCh0aGlzLiRzY29wZS5vcmlnaW5Db21wb25lbnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuY2hhbmdlTGlmZWN5Y2xlU3RhdGUgPSAoc3RhdGU6IHN0cmluZyk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTmVlZFNhdmUoKSAmJiBzdGF0ZSAhPT0gJ2RlbGV0ZVZlcnNpb24nKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNhdmUoKS50aGVuKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUxpZmVjeWNsZVN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VMaWZlY3ljbGVTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGV0IGRlZmF1bHRBY3Rpb25BZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzdGF0ZS5jdXJyZW50LmRhdGEgJiYgdGhpcy4kc3RhdGUuY3VycmVudC5kYXRhLnVuc2F2ZWRDaGFuZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmN1cnJlbnQuZGF0YS51bnNhdmVkQ2hhbmdlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbygnZGFzaGJvYXJkJyk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBsZXQgY2hhbmdlTGlmZWN5Y2xlU3RhdGUgPSAoc3RhdGU6IHN0cmluZykgPT4geworICAgICAgICAgICAgICAgIGlmICgnbW9uaXRvcicgPT09IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKCd3b3Jrc3BhY2UuZGlzdHJpYnV0aW9uJyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMuJHNjb3BlLmNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9uc1tzdGF0ZV07CisgICAgICAgICAgICAgICAgbGV0IG9uU3VjY2VzcyA9IChjb21wb25lbnQ6IE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgICAgICAvL1VwZGF0aW5nIHRoZSBjb21wb25lbnQgZnJvbSBzZXJ2ZXIgcmVzcG9uc2UKKworICAgICAgICAgICAgICAgICAgICAvL3RoZSBzZXJ2ZXIgcmV0dXJucyBvbmx5IG1ldGFEYXRhIChzbWFsbCBjb21wb25lbnQpIGV4Y2VwdCBjaGVja291dCAoRnVsbCBjb21wb25lbnQpICAsc28gd2UgdXBkYXRlIG9ubHkgdGhlIHN0YXR1c2VzIG9mIGRpc3RyaWJ1dGlvbiAmIGxpZmVjeWNsZQorICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQubGlmZWN5Y2xlU3RhdGUgPSBjb21wb25lbnQubGlmZWN5Y2xlU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5kaXN0cmlidXRpb25TdGF0dXMgPSBjb21wb25lbnQuZGlzdHJpYnV0aW9uU3RhdHVzOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS51cmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpZmVjeWNsZVN0YXRlL0NIRUNLT1VUJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNoZWNrT3V0IGdldCB0aGUgZnVsbCBjb21wb25lbnQgZnJvbSBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29yayBhcm91bmQgdG8gY2hhbmdlIHRoZSBjc2FyIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0KFV0aWxzLkNvbnN0YW50cy5DSEFOR0VfQ09NUE9ORU5UX0NTQVJfVkVSU0lPTl9GTEFHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPFJlc291cmNlPnRoaXMuJHNjb3BlLmNvbXBvbmVudCkuY3NhclZlcnNpb24gPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoVXRpbHMuQ29uc3RhbnRzLkNIQU5HRV9DT01QT05FTlRfQ1NBUl9WRVJTSU9OX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2hlbiBjaGVja2luZyBvdXQgYSBtaW5vciB2ZXJzaW9uIHV1aWQgcmVtYWlucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiY0NvbXBvbmVudDogU2RjLk1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudCA9IF8uZmluZCh0aGlzLmNvbXBvbmVudHMsIChpdGVtKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnV1aWQgPT09IGNvbXBvbmVudC51dWlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY0NvbXBvbmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbdGhpcy5jb21wb25lbnRzLmluZGV4T2YoYmNDb21wb25lbnQpXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3doZW4gY2hlY2tpbmcgb3V0IGEgbWFqb3IoY2VydGlmaWVkKSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy51bnNoaWZ0KGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc3RhdGUuZ28odGhpcy4kc3RhdGUuY3VycmVudC5uYW1lLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQudW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGNvbXBvbmVudC5jb21wb25lbnRUeXBlLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTm90aWZpY2F0aW9uLnN1Y2Nlc3MoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJDSEVDS09VVF9TVUNDRVNTX01FU1NBR0VfVEVYVCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiQ0hFQ0tPVVRfU1VDQ0VTU19NRVNTQUdFX1RJVExFIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpZmVjeWNsZVN0YXRlL0NIRUNLSU4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBY3Rpb25BZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ob3RpZmljYXRpb24uc3VjY2Vzcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkNIRUNLSU5fU1VDQ0VTU19NRVNTQUdFX1RFWFQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkNIRUNLSU5fU1VDQ0VTU19NRVNTQUdFX1RJVExFIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpZmVjeWNsZVN0YXRlL1VORE9DSEVDS09VVCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbkFmdGVyQ2hhbmdlTGlmZWN5Y2xlU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5vdGlmaWNhdGlvbi5zdWNjZXNzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiREVMRVRFX1NVQ0NFU1NfTUVTU0FHRV9URVhUIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJERUxFVEVfU1VDQ0VTU19NRVNTQUdFX1RJVExFIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpZmVjeWNsZVN0YXRlL2NlcnRpZmljYXRpb25SZXF1ZXN0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QWN0aW9uQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTm90aWZpY2F0aW9uLnN1Y2Nlc3MoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJTVUJNSVRfRk9SX1RFU1RJTkdfU1VDQ0VTU19NRVNTQUdFX1RFWFQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlNVQk1JVF9GT1JfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVElUTEUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgLy9UZXN0ZXIgUm9sZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGlmZWN5Y2xlU3RhdGUvZmFpbENlcnRpZmljYXRpb24nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBY3Rpb25BZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ob3RpZmljYXRpb24uc3VjY2Vzcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlJFSkVDVF9TVUNDRVNTX01FU1NBR0VfVEVYVCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiUkVKRUNUX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsaWZlY3ljbGVTdGF0ZS9jZXJ0aWZ5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QWN0aW9uQWZ0ZXJDaGFuZ2VMaWZlY3ljbGVTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTm90aWZpY2F0aW9uLnN1Y2Nlc3MoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJBQ0NFUFRfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVEVYVCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiQUNDRVBUX1RFU1RJTkdfU1VDQ0VTU19NRVNTQUdFX1RJVExFIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vREUyMDM1MDQgQnVnIEZpeCBTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGlmZWN5Y2xlU3RhdGUvc3RhcnRDZXJ0aWZpY2F0aW9uJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VMaWZlY3ljbGVTdGF0ZUJ1dHRvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5vdGlmaWNhdGlvbi5zdWNjZXNzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiU1RBUlRfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVEVYVCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiU1RBUlRfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVElUTEUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgJ2xpZmVjeWNsZVN0YXRlL2NhbmNlbENlcnRpZmljYXRpb24nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTm90aWZpY2F0aW9uLnN1Y2Nlc3MoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJDQU5DRUxfVEVTVElOR19TVUNDRVNTX01FU1NBR0VfVEVYVCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy4kZmlsdGVyKCd0cmFuc2xhdGUnKSgiQ0FOQ0VMX1RFU1RJTkdfU1VDQ0VTU19NRVNTQUdFX1RJVExFIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vT3BzIFJvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgICdkaXN0cmlidXRpb24vUFJPRC9hY3RpdmF0ZSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlTGlmZWN5Y2xlU3RhdGVCdXR0b25zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ob3RpZmljYXRpb24uc3VjY2Vzcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkRJU1RSSUJVVEVfU1VDQ0VTU19NRVNTQUdFX1RFWFQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIkRJU1RSSUJVVEVfU1VDQ0VTU19NRVNTQUdFX1RJVExFIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vR292ZXJub3IgUm9sZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgJ2Rpc3RyaWJ1dGlvbi1zdGF0ZS9yZWplY3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTm90aWZpY2F0aW9uLnN1Y2Nlc3MoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJSRUpFQ1RfU1VDQ0VTU19NRVNTQUdFX1RFWFQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuJGZpbHRlcigndHJhbnNsYXRlJykoIlJFSkVDVF9TVUNDRVNTX01FU1NBR0VfVElUTEUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAgJ2Rpc3RyaWJ1dGlvbi1zdGF0ZS9hcHByb3ZlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VMaWZlY3ljbGVTdGF0ZUJ1dHRvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRzdGF0ZS5nbygnY2F0YWxvZycpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTm90aWZpY2F0aW9uLnN1Y2Nlc3MoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJBUFBST1ZFX1NVQ0NFU1NfTUVTU0FHRV9URVhUIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLiRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCJBUFBST1ZFX1NVQ0NFU1NfTUVTU0FHRV9USVRMRSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0RFMjAzNTA0IEJ1ZyBGaXggRW5kCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBY3Rpb25BZnRlckNoYW5nZUxpZmVjeWNsZVN0YXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS51cmwgIT0gJ2xpZmVjeWNsZVN0YXRlL0NIRUNLT1VUJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIC8vdGhpcy4kc2NvcGUuaXNMb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLkNoYW5nZUxpZmVjeWNsZVN0YXRlSGFuZGxlci5jaGFuZ2VMaWZlY3ljbGVTdGF0ZSh0aGlzLiRzY29wZS5jb21wb25lbnQsIGRhdGEsIHRoaXMuJHNjb3BlLCBvblN1Y2Nlc3MpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuZW5hYmxlZFRhYnMgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUubGVmdEJhclRhYnMubWVudUl0ZW1zLmZvckVhY2goKGl0ZW06IFV0aWxzLk1lbnVJdGVtKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uaXNEaXNhYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNWaWV3TW9kZSA9ICgpOiBib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUubW9kZSA9PT0gVXRpbHMuQ29uc3RhbnRzLldvcmtzcGFjZU1vZGUuVklFVzsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzRGVzaWduZXIgPSAoKTogYm9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9sZSA9PSBVdGlscy5Db25zdGFudHMuUm9sZS5ERVNJR05FUjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzRGlzYWJsZU1vZGUgPSAoKTogYm9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLm1vZGUgPT09IFV0aWxzLkNvbnN0YW50cy5Xb3Jrc3BhY2VNb2RlLlZJRVcgJiYgdGhpcy4kc2NvcGUuY29tcG9uZW50LmxpZmVjeWNsZVN0YXRlID09PSBVdGlscy5Db25zdGFudHMuQ29tcG9uZW50U3RhdGUuTk9UX0NFUlRJRklFRF9DSEVDS0lOOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2hvd0Z1bGxJY29ucyA9ICgpOiBib29sZWFuID0+IHsKKyAgICAgICAgICAgICAgICAvL3dlIHNob3cgcmV2ZXJ0IGFuZCBzYXZlIGljb25zIG9ubHkgaW4gZ2VuZXJhbFxpY29uIHZpZXcKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc3RhdGUuY3VycmVudC5uYW1lID09PSBVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9HRU5FUkFMIHx8CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmN1cnJlbnQubmFtZSA9PT0gVXRpbHMuQ29uc3RhbnRzLlN0YXRlcy5XT1JLU1BBQ0VfSUNPTlM7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5pc0NyZWF0ZU1vZGUgPSAoKTogYm9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLm1vZGUgPT09IFV0aWxzLkNvbnN0YW50cy5Xb3Jrc3BhY2VNb2RlLkNSRUFURTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzRWRpdE1vZGUgPSAoKTogYm9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLm1vZGUgPT09IFV0aWxzLkNvbnN0YW50cy5Xb3Jrc3BhY2VNb2RlLkVESVQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5nb1RvQnJlYWRjcnVtYkhvbWUgPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGJjSG9tZTogU2RjLlV0aWxzLk1lbnVJdGVtR3JvdXAgPSB0aGlzLiRzY29wZS5icmVhZGNydW1ic01vZGVsWzBdOworICAgICAgICAgICAgICAgIHRoaXMuJHN0YXRlLmdvKGJjSG9tZS5tZW51SXRlbXNbYmNIb21lLnNlbGVjdGVkSW5kZXhdLnN0YXRlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNob3dMaWZlY3ljbGVJY29uID0gKCk6IGJvb2xlYW4gPT4geworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJvbGUgPT0gVXRpbHMuQ29uc3RhbnRzLlJvbGUuREVTSUdORVIgfHwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xlID09IFV0aWxzLkNvbnN0YW50cy5Sb2xlLlBST0RVQ1RfTUFOQUdFUjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdldFN0YXR1cyA9ICgpOiBzdHJpbmcgPT4geworICAgICAgICAgICAgICAgIGlmICh0aGlzLiRzY29wZS5pc0NyZWF0ZU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0lOIERFU0lHTic7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRTdGF0dXModGhpcy5zZGNNZW51KTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuaW5pdE1lbnVJdGVtcygpOworCisgICAgICAgICAgICB0aGlzLiRzY29wZS5zaG93Q2hhbmdlU3RhdGVCdXR0b24gPSAoKTogYm9vbGVhbiA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRzY29wZS5jb21wb25lbnQuaXNMYXRlc3RWZXJzaW9uKCkgJiYgVXRpbHMuQ29uc3RhbnRzLlJvbGUuT1BTICE9IHRoaXMucm9sZSAmJiBVdGlscy5Db25zdGFudHMuUm9sZS5HT1ZFUk5PUiAhPSB0aGlzLnJvbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGUgPT09IFV0aWxzLkNvbnN0YW50cy5Sb2xlLlBST0RVQ1RfTUFOQUdFUiAmJiAhdGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUHJvZHVjdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMucm9sZSA9PT0gVXRpbHMuQ29uc3RhbnRzLlJvbGUuREVTSUdORVIgfHwgdGhpcy5yb2xlID09PSBVdGlscy5Db25zdGFudHMuUm9sZS5URVNURVIpCisgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Byb2R1Y3QoKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFV0aWxzLkNvbnN0YW50cy5Db21wb25lbnRTdGF0ZS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUID09PSB0aGlzLiRzY29wZS5jb21wb25lbnQubGlmZWN5Y2xlU3RhdGUgJiYgdGhpcy4kc2NvcGUuaXNWaWV3TW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVXRpbHMuQ29uc3RhbnRzLkNvbXBvbmVudFN0YXRlLkNFUlRJRklFRCAhPSB0aGlzLiRzY29wZS5jb21wb25lbnQubGlmZWN5Y2xlU3RhdGUgJiYKKyAgICAgICAgICAgICAgICAgICAgKFV0aWxzLkNvbnN0YW50cy5Sb2xlLk9QUyA9PSB0aGlzLnJvbGUgfHwgVXRpbHMuQ29uc3RhbnRzLlJvbGUuR09WRVJOT1IgPT0gdGhpcy5yb2xlKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwZGF0ZVNlbGVjdGVkTWVudUl0ZW0gPSAoKTogdm9pZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkSXRlbTogU2RjLlV0aWxzLk1lbnVJdGVtID0gXy5maW5kKHRoaXMuJHNjb3BlLmxlZnRCYXJUYWJzLm1lbnVJdGVtcywgKGl0ZW06IFNkYy5VdGlscy5NZW51SXRlbSkgPT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5zdGF0ZSA9PT0gdGhpcy4kc3RhdGUuY3VycmVudC5uYW1lOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxlZnRCYXJUYWJzLnNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEl0ZW0gPyB0aGlzLiRzY29wZS5sZWZ0QmFyVGFicy5tZW51SXRlbXMuaW5kZXhPZihzZWxlY3RlZEl0ZW0pIDogMDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLiR3YXRjaCgnJHN0YXRlLmN1cnJlbnQubmFtZScsIChuZXdWYWw6IHN0cmluZyk6IHZvaWQgPT4geworICAgICAgICAgICAgICAgIGlmIChuZXdWYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2NvcGUuaXNDb21wb3NpdGlvbiA9IChuZXdWYWwuaW5kZXhPZihVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9DT01QT1NJVElPTikgPiAtMSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLmlzRGVwbG95bWVudCA9IChuZXdWYWwuaW5kZXhPZihVdGlscy5Db25zdGFudHMuU3RhdGVzLldPUktTUEFDRV9ERVBMT1lNRU5UKSA+IC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRBZnRlclNjb3BlID0gKCk6IHZvaWQgPT4geworICAgICAgICAgICAgLy8gSW4gY2FzZSB1c2VyIHNlbGVjdCBjc2FyIGZyb20gdGhlIG9uYm9hcmRpbmcgbW9kYWwsIG5lZWQgdG8gZGlzYWJsZSBjaGVja291dCBhbmQgc3VibWl0IGZvciB0ZXN0aW5nLgorICAgICAgICAgICAgaWYgKHRoaXMuJHN0YXRlLnBhcmFtc1snZGlzYWJsZUJ1dHRvbnMnXSA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIHRoaXMuJHNjb3BlLnVwbG9hZEZpbGVDaGFuZ2VkSW5HZW5lcmFsVGFiKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBpbml0VmVyc2lvbk9iamVjdCA9ICgpOiB2b2lkID0+IHsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLnZlcnNpb25zTGlzdCA9ICh0aGlzLiRzY29wZS5jb21wb25lbnQuZ2V0QWxsVmVyc2lvbnNBc1NvcnRlZEFycmF5KCkpLnJldmVyc2UoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmNoYW5nZVZlcnNpb24gPSB7c2VsZWN0ZWRWZXJzaW9uOiBfLmZpbmQodGhpcy4kc2NvcGUudmVyc2lvbnNMaXN0LCB7dmVyc2lvbklkOiB0aGlzLiRzY29wZS5jb21wb25lbnQudW5pcXVlSWR9KX07CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBnZXROZXdDb21wb25lbnRCcmVhZGNydW1iSXRlbSA9ICgpOiBVdGlscy5NZW51SXRlbSA9PiB7CisgICAgICAgICAgICBsZXQgdGV4dCA9ICIiOworICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmNvbXBvbmVudC5pc1Jlc291cmNlKCkgJiYgKDxSZXNvdXJjZT50aGlzLiRzY29wZS5jb21wb25lbnQpLmlzQ3NhckNvbXBvbmVudCgpKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IHRoaXMuJHNjb3BlLmNvbXBvbmVudC5nZXRDb21wb25lbnRTdWJUeXBlKCkgKyAnOiAnICsgdGhpcy4kc2NvcGUuY29tcG9uZW50Lm5hbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHQgPSAnQ3JlYXRlIG5ldyAnICsgdGhpcy4kc3RhdGUucGFyYW1zWyd0eXBlJ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFV0aWxzLk1lbnVJdGVtKHRleHQsIG51bGwsIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0dFTkVSQUwsICdnb1RvU3RhdGUnLCBbdGhpcy4kc3RhdGUucGFyYW1zXSk7CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSB1cGRhdGVNZW51SXRlbUJ5Um9sZSA9IChtZW51SXRlbXM6IEFycmF5PFV0aWxzLk1lbnVJdGVtPiwgcm9sZTogc3RyaW5nKSA9PiB7CisgICAgICAgICAgICBsZXQgdGVtcE1lbnVJdGVtczogQXJyYXk8VXRpbHMuTWVudUl0ZW0+ID0gbmV3IEFycmF5PFV0aWxzLk1lbnVJdGVtPigpOworICAgICAgICAgICAgbWVudUl0ZW1zLmZvckVhY2goKGl0ZW06IFV0aWxzLk1lbnVJdGVtKSA9PiB7CisgICAgICAgICAgICAgICAgLy9yZW1vdmUgaXRlbSBpZiByb2xlIGlzIGRpc2FibGVkCisgICAgICAgICAgICAgICAgaWYgKCEoaXRlbS5kaXNhYmxlZFJvbGVzICYmIGl0ZW0uZGlzYWJsZWRSb2xlcy5pbmRleE9mKHJvbGUpID4gLTEpKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBNZW51SXRlbXMucHVzaChpdGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiB0ZW1wTWVudUl0ZW1zOworICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgaW5pdEJyZWFkY3J1bWJzID0gKCkgPT4geworICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdicmVhZGNydW1ic0NvbXBvbmVudHMnKTsKKyAgICAgICAgICAgIGxldCBicmVhZGNydW1ic0NvbXBvbmVudHNMdmwgPSB0aGlzLk1lbnVIYW5kbGVyLmdlbmVyYXRlQnJlYWRjcnVtYnNNb2RlbEZyb21Db21wb25lbnRzKHRoaXMuY29tcG9uZW50cywgdGhpcy4kc2NvcGUuY29tcG9uZW50KTsKKworICAgICAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmlzQ3JlYXRlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZUl0ZW0gPSB0aGlzLmdldE5ld0NvbXBvbmVudEJyZWFkY3J1bWJJdGVtKCk7CisgICAgICAgICAgICAgICAgaWYgKCFicmVhZGNydW1ic0NvbXBvbmVudHNMdmwubWVudUl0ZW1zKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFkY3J1bWJzQ29tcG9uZW50c0x2bC5tZW51SXRlbXMgPSBbXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWRjcnVtYnNDb21wb25lbnRzTHZsLm1lbnVJdGVtcy51bnNoaWZ0KGNyZWF0ZUl0ZW0pOworICAgICAgICAgICAgICAgIGJyZWFkY3J1bWJzQ29tcG9uZW50c0x2bC5zZWxlY3RlZEluZGV4ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy4kc2NvcGUuYnJlYWRjcnVtYnNNb2RlbCA9IFticmVhZGNydW1ic0NvbXBvbmVudHNMdmwsIHRoaXMuJHNjb3BlLmxlZnRCYXJUYWJzXTsKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGluaXRNZW51SXRlbXMoKSB7CisKKyAgICAgICAgICAgIGxldCBpbkNyZWF0ZU1vZGUgPSB0aGlzLiRzY29wZS5pc0NyZWF0ZU1vZGUoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxlZnRCYXJUYWJzID0gbmV3IFV0aWxzLk1lbnVJdGVtR3JvdXAoKTsKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxlZnRCYXJUYWJzLm1lbnVJdGVtcyA9IHRoaXMudXBkYXRlTWVudUl0ZW1CeVJvbGUodGhpcy5zZGNNZW51LmNvbXBvbmVudF93b3Jrc3BhY2VfbWVudV9vcHRpb25bdGhpcy4kc2NvcGUuY29tcG9uZW50LmdldENvbXBvbmVudFN1YlR5cGUoKV0sIHRoaXMucm9sZSk7CisKKyAgICAgICAgICAgIHRoaXMuJHNjb3BlLmxlZnRCYXJUYWJzLm1lbnVJdGVtcy5mb3JFYWNoKChpdGVtOiBVdGlscy5NZW51SXRlbSkgPT4geworICAgICAgICAgICAgICAgIGl0ZW0ucGFyYW1zID0gW2l0ZW0uc3RhdGVdOworICAgICAgICAgICAgICAgIGl0ZW0uY2FsbGJhY2sgPSB0aGlzLiRzY29wZS5vbk1lbnVJdGVtUHJlc3NlZDsKKyAgICAgICAgICAgICAgICBpdGVtLmlzRGlzYWJsZWQgPSAoaW5DcmVhdGVNb2RlICYmIFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0dFTkVSQUwgIT0gaXRlbS5zdGF0ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0RFUExPWU1FTlQgPT09IGl0ZW0uc3RhdGUgJiYgdGhpcy4kc2NvcGUuY29tcG9uZW50Lmdyb3Vwcy5sZW5ndGggPT09IDAgJiYgdGhpcy4kc2NvcGUuY29tcG9uZW50LmlzUmVzb3VyY2UoKSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnYnJlYWRjcnVtYnNDb21wb25lbnRzJykpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmluaXRCcmVhZGNydW1icygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgb25TdWNjZXNzID0gKGNvbXBvbmVudHM6IEFycmF5PE1vZGVscy5Db21wb25lbnRzLkNvbXBvbmVudD4pID0+IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0KCdicmVhZGNydW1ic0NvbXBvbmVudHMnLCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0QnJlYWRjcnVtYnMoKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuRW50aXR5U2VydmljZS5nZXRDYXRhbG9nKCkudGhlbihvblN1Y2Nlc3MpOyAvL2dldEFsbENvbXBvbmVudHMoKSBkb2VzbnQgcmV0dXJuIGNvbXBvbmVudHMgZnJvbSBjYXRhbG9nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRpc2FibGVNZW51SXRlbXMoKSB7CisgICAgICAgICAgICB0aGlzLiRzY29wZS5sZWZ0QmFyVGFicy5tZW51SXRlbXMuZm9yRWFjaCgoaXRlbTogVXRpbHMuTWVudUl0ZW0pID0+IHsKKyAgICAgICAgICAgICAgICBpdGVtLnBhcmFtcyA9IFtpdGVtLnN0YXRlXTsKKyAgICAgICAgICAgICAgICBpdGVtLmNhbGxiYWNrID0gdGhpcy4kc2NvcGUub25NZW51SXRlbVByZXNzZWQ7CisgICAgICAgICAgICAgICAgaXRlbS5pc0Rpc2FibGVkID0gKFV0aWxzLkNvbnN0YW50cy5TdGF0ZXMuV09SS1NQQUNFX0dFTkVSQUwgIT0gaXRlbS5zdGF0ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW5hYmxlTWVudUl0ZW1zKCkgeworICAgICAgICAgICAgdGhpcy4kc2NvcGUubGVmdEJhclRhYnMubWVudUl0ZW1zLmZvckVhY2goKGl0ZW06IFV0aWxzLk1lbnVJdGVtKSA9PiB7CisgICAgICAgICAgICAgICAgaXRlbS5wYXJhbXMgPSBbaXRlbS5zdGF0ZV07CisgICAgICAgICAgICAgICAgaXRlbS5jYWxsYmFjayA9IHRoaXMuJHNjb3BlLm9uTWVudUl0ZW1QcmVzc2VkOworICAgICAgICAgICAgICAgIGl0ZW0uaXNEaXNhYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS93b3Jrc3BhY2Utdmlldy5odG1sIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2Uvd29ya3NwYWNlLXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThmNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2Uvd29ya3NwYWNlLXZpZXcuaHRtbApAQCAtMCwwICsxLDg2IEBACis8ZGl2IGNsYXNzPSJzZGMtd29ya3NwYWNlLWNvbnRhaW5lciI+CisgICAgPGxvYWRlciBkYXRhLWRpc3BsYXk9ImlzTG9hZGluZyI+PC9sb2FkZXI+CisKKyAgICA8IS0tIEhFQURFUiAtLT4KKzwhLS0KKyAgICA8ZWNvbXAtaGVhZGVyIG1lbnUtZGF0YT0ibWVudUl0ZW1zIiB2ZXJzaW9uPSJ7e3ZlcnNpb259fSI+PC9lY29tcC1oZWFkZXI+CistLT4KKworICAgIDxkaXYgY2xhc3M9Inctc2RjLW1haW4tY29udGFpbmVyIj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1sZWZ0LXNpZGViYXIiIGRhdGEtbmctaWY9IiFpc0NvbXBvc2l0aW9uIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9Imktc2RjLWxlZnQtc2lkZWJhci1pdGVtIj4KKyAgICAgICAgICAgICAgICA8ZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94IG1lbnUtaXRlbXMtZ3JvdXA9ImxlZnRCYXJUYWJzIiBtZW51LXRpdGxlPSJ7e21lbnVDb21wb25lbnRUaXRsZX19IiBwYXJlbnQtc2NvcGU9InRoaXMiPiA8L2V4cGFuZC1jb2xsYXBzZS1tZW51LWJveD4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGluY2x1ZGUtcGFkZGluZz0idHJ1ZSIgY2xhc3M9Inctc2RjLW1haW4tcmlnaHQtY29udGFpbmVyIiBkYXRhLW5nLWNsYXNzPSJ7J2NvbXBvc2l0aW9uJzppc0NvbXBvc2l0aW9ufSI+CisKKyAgICAgICAgPCEtLTxkaXYgY2xhc3M9Inctc2RjLW1haW4tcmlnaHQtY29udGFpbmVyIiBkYXRhLW5nLWNsYXNzPSJ7J2NvbXBvc2l0aW9uJzppc0NvbXBvc2l0aW9ufSI+LS0+CisgICAgICAgICAgICA8bG9hZGVyIGRhdGEtZGlzcGxheT0iaXNDcmVhdGVQcm9ncmVzcyIgcmVsYXRpdmU9InRydWUiPjwvbG9hZGVyPgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZGMtd29ya3NwYWNlLXRvcC1iYXIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZlcnNpb24tY29udGFpbmVyIj4KKworCisgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0iIWlzQ3JlYXRlTW9kZSgpICYmICFjb21wb25lbnQuaXNMYXRlc3RWZXJzaW9uKCkiIGNsYXNzPSJub3QtbGF0ZXN0Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0idmVyc2lvbi1zZWxlY3RvciIgZGF0YS1uZy1pZj0iIWlzQ3JlYXRlTW9kZSgpIiBkYXRhLXRlc3RzLWlkPSJ2ZXJzaW9uSGVhZGVyIiBkYXRhLW5nLW1vZGVsPSJjaGFuZ2VWZXJzaW9uLnNlbGVjdGVkVmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIG5nLW9wdGlvbnM9IidWJyt2ZXJzaW9uLnZlcnNpb25OdW1iZXIgZm9yIHZlcnNpb24gaW4gdmVyc2lvbnNMaXN0IiBkYXRhLW5nLWNoYW5nZT0ib25WZXJzaW9uQ2hhbmdlZChjaGFuZ2VWZXJzaW9uLnNlbGVjdGVkVmVyc2lvbi52ZXJzaW9uSWQpIj4KKyAgICAgICAgICAgICAgICA8L3NlbGVjdD4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpZmVjeWNsZS1zdGF0ZSI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1zaG93PSJzaG93TGlmZWN5Y2xlSWNvbigpIiBjbGFzcz0ibGlmZWN5Y2xlLXN0YXRlLWljb24iIGRhdGEtbmctY2xhc3M9InsnaW4tZGVzaWduLXN0YXR1cy1pY29uJzogaXNDcmVhdGVNb2RlKCksICd7e3NkY01lbnUuTGlmZUN5Y2xlU3RhdHVzZXNbY29tcG9uZW50LmxpZmVjeWNsZVN0YXRlXS5pY29ufX0nOiAhaXNDcmVhdGVNb2RlKCl9Ij48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZmVjeWNsZS1zdGF0ZS10ZXh0IiBkYXRhLXRlc3RzLWlkPSJmb3JtbGlmZWN5Y2xlc3RhdGUiPnt7Z2V0U3RhdHVzKCl9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtY29udGFpbmVyIiA+CisgICAgICAgICAgICAgICAgICAgIDx0b3AtcHJvZ3Jlc3MgY2xhc3M9ImdlbmVyYWwtdmlldy10b3AtcHJvZ3Jlc3MiIHByb2dyZXNzLXZhbHVlPSJwcm9ncmVzc1NlcnZpY2UuZ2V0UHJvZ3Jlc3NWYWx1ZShjb21wb25lbnQudW5pcXVlSWQpIiBwcm9ncmVzcy1tZXNzYWdlPSJwcm9ncmVzc01lc3NhZ2UiPjwvdG9wLXByb2dyZXNzPgorICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2RjLXdvcmtzcGFjZS10b3AtYmFyLWJ1dHRvbnMiPgorCisgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLWlmPSIhaXNDcmVhdGVNb2RlKCkgJiYgIWNvbXBvbmVudC5pc0xhdGVzdFZlcnNpb24oKSAmJiAhc2hvd0NoYW5nZVN0YXRlQnV0dG9uKCkiPlN3aXRjaCB0byB0aGUmbmJzcDs8YSBuZy1jbGljaz0iZ2V0TGF0ZXN0VmVyc2lvbigpIj5sYXRlc3QgdmVyc2lvbjwvYT48L3NwYW4+CisKKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1pZj0iaXNEZXNpZ25lcigpICYmICFpc0NyZWF0ZU1vZGUoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJyA6IWlzVmFsaWRGb3JtIHx8IGlzRGlzYWJsZU1vZGUoKSB8fCBpc1ZpZXdNb2RlKCl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSJzYXZlKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRsdi1idG4gYmx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RzLWlkPSJjcmVhdGUvc2F2ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLXNob3c9InNob3dGdWxsSWNvbnMoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGMtc21hcnQtdG9vbHRpcD0iIj5VcGRhdGU8L2J1dHRvbj4KKworICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nLXJlcGVhdD0iKGtleSxidXR0b24pIGluIGNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0iY2hhbmdlTGlmZWN5Y2xlU3RhdGUoa2V5KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1pZj0ic2hvd0NoYW5nZVN0YXRlQnV0dG9uKCkgJiYga2V5ICE9ICdkZWxldGVWZXJzaW9uJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5nLWRpc2FibGVkPSJpc0NyZWF0ZU1vZGUoKSB8fCBidXR0b24uZGlzYWJsZWQgfHwgZGlzYWJsZWRCdXR0b25zIHx8ICFpc1ZhbGlkRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY2hhbmdlLWxpZmVjeWNsZS1zdGF0ZS1idG4gdGx2LWJ0biIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGFzcz0iJGZpcnN0ID8gJ291dGxpbmUgZ3JlZW4nIDogJ2dyZXknIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdHMtaWQ9Int7YnV0dG9uLnRleHQgIHwgdGVzdHNJZH19Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2J1dHRvbi50ZXh0fX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgorCisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmctaWY9IiFpc1ZpZXdNb2RlKCkgJiYgaXNDcmVhdGVNb2RlKCkiIGRhdGEtbmctZGlzYWJsZWQ9IiFpc1ZhbGlkRm9ybSB8fCBpc0Rpc2FibGVNb2RlKCkgfHwgaXNMb2FkaW5nIiBuZy1jbGljaz0ic2F2ZSgpIiBjbGFzcz0idGx2LWJ0biBvdXRsaW5lIGdyZWVuIiBkYXRhLXRlc3RzLWlkPSJjcmVhdGUvc2F2ZSI+Q3JlYXRlPC9idXR0b24+CisKKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0iaXNEZXNpZ25lcigpICYmICFpc0NyZWF0ZU1vZGUoKSAmJiBjb21wb25lbnQubGlmZWN5Y2xlU3RhdGUgPT09ICdOT1RfQ0VSVElGSUVEX0NIRUNLT1VUJyIgc2RjLXNtYXJ0LXRvb2x0aXA9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmctY2xhc3M9InsnZGlzYWJsZWQnIDogIWlzVmFsaWRGb3JtIHx8IGlzRGlzYWJsZU1vZGUoKSB8fCBpc1ZpZXdNb2RlKCl9IiBuZy1jbGljaz0iY2hhbmdlTGlmZWN5Y2xlU3RhdGUoJ2RlbGV0ZVZlcnNpb24nKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzcHJpdGUtbmV3IGRlbGV0ZS1idG4iIGRhdGEtdGVzdHMtaWQ9ImRlbGV0ZV92ZXJzaW9uIiBzZGMtc21hcnQtdG9vbHRpcD0iIj5EZWxldGU8L3NwYW4+CisKKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1uZy1pZj0iaXNEZXNpZ25lcigpIiBkYXRhLW5nLWNsYXNzPSJ7J2Rpc2FibGVkJyA6aXNEaXNhYmxlTW9kZSgpIHx8IGlzVmlld01vZGUoKX0iICBuZy1jbGljaz0icmV2ZXJ0KCkiIGNsYXNzPSJzcHJpdGUtbmV3IHJldmVydC1idG4iIGRhdGEtdGVzdHMtaWQ9InJldmVydCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uZy1zaG93PSJzaG93RnVsbEljb25zKCkiIHNkYy1zbWFydC10b29sdGlwPSIiPlJldmVydDwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgICA8c3BhbiAgZGF0YS1uZy1pZj0iaXNDb21wb3NpdGlvbiAmJiAhY29tcG9uZW50LmlzUHJvZHVjdCgpIiBjbGFzcz0ic3ByaXRlLW5ldyBwcmludC1zY3JlZW4tYnRuIiBlbnRpdHk9ImNvbXBvbmVudCIgcHJpbnQtZ3JhcGgtc2NyZWVuIGRhdGEtdGVzdHMtaWQ9InByaW50U2NyZWVuIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWxpbWl0ZXIiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNwcml0ZS1uZXcgeC1idG4iIGRhdGEtbmctY2xpY2s9ImdvVG9CcmVhZGNydW1iSG9tZSgpIiBzZGMtc21hcnQtdG9vbHRpcD0iIj5DbG9zZTwvc3Bhbj4KKworICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgZGF0YS1uZy1pZj0iY29tcG9uZW50LmNyZWF0aW9uRGF0ZSAmJiAoIWlzQ29tcG9zaXRpb24gJiYgIWlzRGVwbG95bWVudCkiIGNsYXNzPSJzZGMtYXNzZXQtY3JlYXRpb24taW5mbyI+PGI+Q3JlYXRlZDo8L2I+Jm5ic3A7e3tjb21wb25lbnQuY3JlYXRpb25EYXRlIHwgZGF0ZTonTU0vZGQveXl5eSd9fSwmbmJzcDt7e2NvbXBvbmVudC5jcmVhdG9yRnVsbE5hbWV9fSZuYnNwO3wmbmJzcDs8Yj5Nb2RpZmVkOjwvYj4mbmJzcDt7e2NvbXBvbmVudC5sYXN0VXBkYXRlRGF0ZSB8IGRhdGU6J01NL2RkL3l5eXknfX0mbmJzcDt8Jm5ic3A7PGI+VVVJRDo8L2I+Jm5ic3A7e3tjb21wb25lbnQudXVpZH19PGI+Jm5ic3A7SW52YXJpYW50IFVVSUQ6PC9iPiZuYnNwO3t7Y29tcG9uZW50LmludmFyaWFudFVVSUR9fTwvZGl2PgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3LXNkYy1tYWluLWNvbnRhaW5lci1ib2R5LWNvbnRlbnQiIGRhdGEtbmctY2xhc3M9InsndGhpcmQtcGFydHknOnRoaXJkUGFydHl9IiBkYXRhLXVpLXZpZXc+PC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgIDx0b3AtbmF2IHNlYXJjaC1iaW5kPSJzZWFyY2guZmlsdGVyVGVybSIgaGlkZS1zZWFyY2g9InRydWUiIG1lbnUtbW9kZWw9ImJyZWFkY3J1bWJzTW9kZWwiIHZlcnNpb249Int7dmVyc2lvbn19Ij48L3RvcC1uYXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3dvcmtzcGFjZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2Uvd29ya3NwYWNlLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiZmYxYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3dvcmtzcGFjZS5sZXNzCkBAIC0wLDAgKzEsMTQ0IEBACisuc2RjLXdvcmtzcGFjZS1jb250YWluZXIgeworICAuYmdfcDsKKworICAuYWRkLWJ0biB7CisgICAgLmYtY29sb3IuYTsKKyAgICAuZi10eXBlLl8xMl9tOworICAgIC5oYW5kOworICAgIGZsb2F0OiByaWdodDsKKyAgICBtYXJnaW4tYm90dG9tOiAxNXB4OworCisgICAgJjpiZWZvcmUgeworICAgICAgLnNwcml0ZS1uZXc7CisgICAgICAucGx1cy1pY29uOworICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgICAgICBjb250ZW50OiAiIjsKKworICAgIH0KKyAgICAmOmhvdmVyIHsKKyAgICAgIC5mLWNvbG9yLmI7CisgICAgICAmOmJlZm9yZSB7CisgICAgICAgIC5zcHJpdGUtbmV3OworICAgICAgICAucGx1cy1pY29uLWhvdmVyOworICAgICAgfQorICAgIH0KKworICB9CisgIC53LXNkYy1sZWZ0LXNpZGViYXIgeworICAgIHBhZGRpbmc6IDNweCAzcHggMHB4IDBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9wOworICAgIGJveC1zaGFkb3c6IDdweCAtM3B4IDZweCAtOHB4IEBtYWluX2NvbG9yX247CisgICAgei1pbmRleDogMjsKKyAgfQorCisgIC5zZGMtYXNzZXQtY3JlYXRpb24taW5mbyB7CisgICAgLm5fMTJfcjsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luOiA4cHggMjBweCAwIDA7CisgIH0KKworICAudy1zZGMtbWFpbi1yaWdodC1jb250YWluZXIgeworCisgICAgcGFkZGluZzogMHB4IDBweCAwcHggMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluX2NvbG9yX3A7CisgICAgei1pbmRleDogMTsKKworICAgIC5zZGMtd29ya3NwYWNlLXRvcC1iYXIgeworICAgICAgaGVpZ2h0OiBAYWN0aW9uX25hdl9oZWlnaHQ7CisgICAgICBwYWRkaW5nOiAxMnB4IDEwcHggMHB4IDUwcHg7CisgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQG1haW5fY29sb3JfbzsKKyAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisKKyAgICAgIC52ZXJzaW9uLWNvbnRhaW5lciB7CisKKyAgICAgIH0KKworICAgICAgLnByb2dyZXNzLWNvbnRhaW5lciB7CisgICAgICAgIGZsZXgtZ3JvdzogNDsKKyAgICAgICAgei1pbmRleDogMTAwMDAwMDA7CisKKyAgICAgICAgLmdlbmVyYWwtdmlldy10b3AtcHJvZ3Jlc3MgeworICAgICAgICAgIHdpZHRoOiAzMCU7CisgICAgICAgICAgbWFyZ2luOiAwIGF1dG87CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLm5vdC1sYXRlc3QgeworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIGxlZnQ6IDI0cHg7CisgICAgICAgIHRvcDogMjBweDsKKyAgICAgICAgLnNwcml0ZS1uZXc7CisgICAgICAgIC5hc2RjLXdhcm5pbmc7CisgICAgICB9CisKKyAgICAgIC5zZGMtd29ya3NwYWNlLXRvcC1iYXItYnV0dG9ucyB7CisKKyAgICAgICAgPiBidXR0b24sID4gc3Bhbjpub3QoLmRlbGltaXRlcikgeworICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgICAgICAgIC5oYW5kOworCisgICAgICAgICAgJi5zcHJpdGUtbmV3IHsKKyAgICAgICAgICAgIHRleHQtaW5kZW50OiAxMDAlOworICAgICAgICAgIH0KKyAgICAgICAgICAmLmRpc2FibGVkLCAmOmhvdmVyLmRpc2FibGVkIHsKKyAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAuZGVsaW1pdGVyIHsKKyAgICAgICAgICBoZWlnaHQ6IDMycHg7CisgICAgICAgICAgd2lkdGg6IDFweDsKKyAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTU5NTk1OworICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIC5saWZlY3ljbGUtc3RhdGUgeworICAgICAgICBwYWRkaW5nOiA3cHggMCAwIDEwcHg7CisgICAgICAgIG1hcmdpbjogMnB4IDAgN3B4IDEwcHg7CisgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQG1haW5fY29sb3JfbzsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDE1cHg7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1tZWRpdW07CisgICAgICAgIGNvbG9yOiBAbWFpbl9jb2xvcl9tOworCisgICAgICAgIC5saWZlY3ljbGUtc3RhdGUtaWNvbiB7CisgICAgICAgICAgLnNwcml0ZS1uZXc7CisgICAgICAgIH0KKyAgICAgICAgLmxpZmVjeWNsZS1zdGF0ZS10ZXh0IHsKKworICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgICBwYWRkaW5nOiAzcHg7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLnZlcnNpb24tc2VsZWN0b3IgeworICAgICAgICAvLyBmbG9hdDpsZWZ0OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CisgICAgICB9CisgICAgfQorICAgIC53LXNkYy1tYWluLWNvbnRhaW5lci1ib2R5LWNvbnRlbnQgeworICAgICAgaGVpZ2h0OjEwMCU7CisKKyAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICBwYWRkaW5nOiA0MHB4IDE0JSAyMHB4IDE0JTsKKyAgICAgICYudGhpcmQtcGFydHkgeworICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICBwYWRkaW5nOiAwOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogQGFjdGlvbl9uYXZfaGVpZ2h0OworICAgICAgICBsZWZ0OiAwOworICAgICAgICByaWdodDogMDsKKyAgICAgICAgYm90dG9tOiAwOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2FuaW1hdGlvbi5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2FuaW1hdGlvbi5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGIzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvYW5pbWF0aW9uLmxlc3MKQEAgLTAsMCArMSw1MSBAQAorLmFuaW1hdGlvbl9mbGV4IChAdmFsdWUpeworICAgIC13ZWJraXQtYW5pbWF0aW9uOiBAdmFsdWU7CisgICAgLW1vei1hbmltYXRpb246ICAgIEB2YWx1ZTsKKyAgICAtby1hbmltYXRpb246ICAgICAgQHZhbHVlOworICAgIC1tcy10cmFuc2l0aW9uOiAgICBAdmFsdWU7CisgICAgYW5pbWF0aW9uOiAgICAgICAgIEB2YWx1ZTsKK30KKworLmFuaW1hdGlvbiAoQG5hbWUsIEBkdXJhdGlvbjogMzAwbXMsIEBkZWxheTogMCwgQGVhc2U6IGVhc2UpIHsKKyAgICAtd2Via2l0LWFuaW1hdGlvbjogIEBuYW1lIEBkdXJhdGlvbiBAZGVsYXkgQGVhc2U7CisgICAgLW1vei1hbmltYXRpb246ICAgICBAbmFtZSBAZHVyYXRpb24gQGRlbGF5IEBlYXNlOworICAgIC1vLWFuaW1hdGlvbjogICAgICAgQG5hbWUgQGR1cmF0aW9uIEBkZWxheSBAZWFzZTsKKyAgICAtbXMtYW5pbWF0aW9uOiAgICAgIEBuYW1lIEBkdXJhdGlvbiBAZGVsYXkgQGVhc2U7CisgICAgYW5pbWF0aW9uOiAgICAgICAgICBAbmFtZSBAZHVyYXRpb24gQGRlbGF5IEBlYXNlOworfQorCisvKiA9PT09PT09PT09PT0gZmxhc2ggPT09PT09PT09PT09ICovCisuZmxhc2gtZnJhbWVzICgpIHsKKyAgICAwJSB7IG9wYWNpdHk6IDE7IH0KKyAgICAyMCUgeyBvcGFjaXR5OiAxOyB9CisgICAgNTAlIHsgb3BhY2l0eTogMDsgfQorICAgIDgwJSB7IG9wYWNpdHk6IDE7IH0KKyAgICAxMDAlIHsgb3BhY2l0eTogMTsgfQorfQorQC13ZWJraXQta2V5ZnJhbWVzIGZsYXNoIHsuZmxhc2gtZnJhbWVzO30gICAgIC8qIFNhZmFyaSwgQ2hyb21lIGFuZCBPcGVyYSA+IDEyLjEgKi8KK0AtbW96LWtleWZyYW1lcyBmbGFzaCB7LmZsYXNoLWZyYW1lczt9ICAgICAgICAvKiBGaXJlZm94IDwgMTYgKi8KK0Atby1rZXlmcmFtZXMgZmxhc2ggey5mbGFzaC1mcmFtZXM7fSAgICAgICAgICAvKiBPcGVyYSA8IDEyLjEgKi8KK0AtbXMta2V5ZnJhbWVzIGZsYXNoIHsuZmxhc2gtZnJhbWVzO30gICAgICAgICAvKiBJbnRlcm5ldCBFeHBsb3JlciAqLworQGtleWZyYW1lcyBmbGFzaCB7LmZsYXNoLWZyYW1lczt9CisKKy8qID09PT09PT09PT09PSBmYWRlaW4gPT09PT09PT09PT09ICovCisuZmFkZWluLWZyYW1lcyAoKSB7CisgICAgZnJvbSB7IG9wYWNpdHk6IDA7IH0KKyAgICB0byAgIHsgb3BhY2l0eTogMTsgfQorfQorQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVpbiB7LmZhZGVpbi1mcmFtZXM7fSAgICAgLyogU2FmYXJpLCBDaHJvbWUgYW5kIE9wZXJhID4gMTIuMSAqLworQC1tb3ota2V5ZnJhbWVzIGZhZGVpbiB7LmZhZGVpbi1mcmFtZXM7fSAgICAgICAgLyogRmlyZWZveCA8IDE2ICovCitALW8ta2V5ZnJhbWVzIGZhZGVpbiB7LmZhZGVpbi1mcmFtZXM7fSAgICAgICAgICAvKiBPcGVyYSA8IDEyLjEgKi8KK0AtbXMta2V5ZnJhbWVzIGZhZGVpbiB7LmZhZGVpbi1mcmFtZXM7fSAgICAgICAgIC8qIEludGVybmV0IEV4cGxvcmVyICovCitAa2V5ZnJhbWVzIGZhZGVpbiB7LmZhZGVpbi1mcmFtZXM7fQorCisvKiA9PT09PT09PT09PT0gZmFkZW91dCA9PT09PT09PT09PT0gKi8KKy5mYWRlb3V0LWZyYW1lcyAoKSB7CisgICAgZnJvbSB7IG9wYWNpdHk6IDE7IH0KKyAgICB0byAgIHsgb3BhY2l0eTogMDsgfQorfQorQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVvdXQgey5mYWRlb3V0LWZyYW1lczt9ICAgICAvKiBTYWZhcmksIENocm9tZSBhbmQgT3BlcmEgPiAxMi4xICovCitALW1vei1rZXlmcmFtZXMgZmFkZW91dCB7LmZhZGVvdXQtZnJhbWVzO30gICAgICAgIC8qIEZpcmVmb3ggPCAxNiAqLworQC1vLWtleWZyYW1lcyBmYWRlb3V0IHsuZmFkZW91dC1mcmFtZXM7fSAgICAgICAgICAvKiBPcGVyYSA8IDEyLjEgKi8KK0AtbXMta2V5ZnJhbWVzIGZhZGVvdXQgey5mYWRlb3V0LWZyYW1lczt9ICAgICAgICAgLyogSW50ZXJuZXQgRXhwbG9yZXIgKi8KK0BrZXlmcmFtZXMgZmFkZW91dCB7LmZhZGVvdXQtZnJhbWVzO30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9hcHAubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9hcHAubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM1Yjg2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2FwcC5sZXNzCkBAIC0wLDAgKzEsMTIyIEBACisuc2RjLW1haW4tY29udGFpbmVyeworICB3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiAxMDAlOworfQorCisvLyBpbmplY3RvcjpsZXNzCitAaW1wb3J0ICdhbmltYXRpb24ubGVzcyc7CitAaW1wb3J0ICdidXR0b25zLmxlc3MnOworQGltcG9ydCAnZGFyay1oZWFkZXIubGVzcyc7CitAaW1wb3J0ICdmb250cy5sZXNzJzsKK0BpbXBvcnQgJ2Zvcm0tZWxlbWVudHMubGVzcyc7CitAaW1wb3J0ICdnbG9iYWwubGVzcyc7CitAaW1wb3J0ICdsYXlvdXQvaGVhZGVyLmxlc3MnOworQGltcG9ydCAnbGF5b3V0L21haW4ubGVzcyc7CitAaW1wb3J0ICdsYXlvdXQvc2lkZWJhci5sZXNzJzsKK0BpbXBvcnQgJ21peGlucy5sZXNzJzsKK0BpbXBvcnQgJ21peGluc19vbGQubGVzcyc7CitAaW1wb3J0ICdtb2RhbC5sZXNzJzsKK0BpbXBvcnQgJ3Njcm9sbGVyLmxlc3MnOworQGltcG9ydCAnc3ByaXRlLW9sZC5sZXNzJzsKK0BpbXBvcnQgJ3Nwcml0ZS1wcm9kdWN0LWljb25zLmxlc3MnOworQGltcG9ydCAnc3ByaXRlLXJlc291cmNlLWljb25zLmxlc3MnOworQGltcG9ydCAnc3ByaXRlLXNlcnZpY2VzLWljb25zLmxlc3MnOworQGltcG9ydCAnc3ByaXRlLmxlc3MnOworQGltcG9ydCAndGFibGUtZmxleC5sZXNzJzsKK0BpbXBvcnQgJ3Rsdi1idXR0b25zLmxlc3MnOworQGltcG9ydCAndGx2LWNoZWNrYm94Lmxlc3MnOworQGltcG9ydCAndGx2LWxvYWRlci5sZXNzJzsKK0BpbXBvcnQgJ3Rsdi1zcHJpdGUubGVzcyc7CitAaW1wb3J0ICd0b29sdGlwcy5sZXNzJzsKK0BpbXBvcnQgJ3ZhcmlhYmxlcy1vbGQubGVzcyc7CitAaW1wb3J0ICd2YXJpYWJsZXMubGVzcyc7CitAaW1wb3J0ICd3ZWxjb21lLXNwcml0ZS5sZXNzJzsKK0BpbXBvcnQgJ3dlbGNvbWUtc3R5bGUubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvZWNvbXAtaGVhZGVyL2Vjb21wLWhlYWRlci5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9lZGl0LW5hbWUtcG9wb3Zlci9lZGl0LW5hbWUtcG9wb3Zlci5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9jaGVja2JveC9jaGVja2JveC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGVtZW50cy9yYWRpb2J1dHRvbi9yYWRpb2J1dHRvbi5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9lbGxpcHNpcy9lbGxpcHNpcy1kaXJlY3RpdmUubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvZmlsZS11cGxvYWQvZmlsZS11cGxvYWQubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL2NvbXBvc2l0aW9uLWdyYXBoL2NvbXBvc2l0aW9uLWdyYXBoLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL2dyYXBocy12Mi9kZXBsb3ltZW50LWdyYXBoL2RlcGxveW1lbnQtZ3JhcGgubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvZ3JhcGhzLXYyL3BhbGV0dGUvcGFsZXR0ZS5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9ncmFwaHMtdjIvcmVsYXRpb24tbWVudS9yZWxhdGlvbi1tZW51Lmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL2luZm8tdG9vbHRpcC9pbmZvLXRvb2x0aXAubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvbGF5b3V0L3RvcC1uYXYvdG9wLW5hdi5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9sYXlvdXQvdG9wLXByb2dyZXNzL3RvcC1wcm9ncmVzcy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9sb2FkZXIvbG9hZGVyLWRpcmVjdGl2ZS5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9tb2RhbC9zZGMtbW9kYWwubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvcGFnZS1zY3JvbGxlci9wYWdlLXNjcm9sbGVyLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlL2RhdGEtdHlwZS1maWVsZHMtc3RydWN0dXJlLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbGlzdC90eXBlLWxpc3QtZGlyZWN0aXZlLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL3Byb3BlcnR5LXR5cGVzL3R5cGUtbWFwL3R5cGUtbWFwLWRpcmVjdGl2ZS5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtc2luZ2xlLXRhYi9zZGMtc2luZ2xlLXRhYi5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9zZGMtdGFicy9zZGMtdGFicy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy9zdHJ1Y3R1cmUtdHJlZS9zdHJ1Y3R1cmUtdHJlZS1kaXJlY3RpdmUubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvdGFnL3RhZy1kaXJlY3RpdmUubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvdHV0b3JpYWwvdHV0b3JpYWwtZGlyZWN0aXZlLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL3VzZXItaGVhZGVyLWRldGFpbHMvdXNlci1oZWFkZXItZGV0YWlscy1kaXJlY3RpdmUubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL2RpcmVjdGl2ZXMvdXRpbHMvZXhwYW5kLWNvbGxhcHNlLW1lbnUtYm94L2V4cGFuZC1jb2xsYXBzZS1tZW51LWJveC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9leHBhbmQtY29sbGFwc2UvZXhwYW5kLWNvbGxhcHNlLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3BhZ2Utc2VsZWN0b3IvcGFnZS1zZWxlY3Rvci5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGMtdGFncy9zZGMtdGFncy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvZGlyZWN0aXZlcy91dGlscy9zZGNfbWVzc2FnZXMvc2RjLW1lc3NhZ2VzLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy9kaXJlY3RpdmVzL3V0aWxzL3dpemFyZF9zdGVwcy9zZGMtd2l6YXJkLXN0ZXBzLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRkLWNhdGVnb3J5LW1vZGFsL2FkZC1jYXRlZ29yeS1tb2RhbC12aWV3Lmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvYWRtaW4tZGFzaGJvYXJkLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvY2F0ZWdvcnktbWFuYWdlbWVudC9jYXRlZ29yeS1tYW5hZ2VtZW50Lmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9hZG1pbi1kYXNoYm9hcmQvdXNlci1tYW5hZ2VtZW50L3VzZXItbWFuYWdlbWVudC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvY2F0YWxvZy9jYXRhbG9nLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL2FjdGl2aXR5LWxvZy9hY3Rpdml0eS1sb2ctdmlldy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvY29tcG9uZW50LXZpZXdlci9jb21wb25lbnQtdmlld2VyLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9jb21wb25lbnQtdmlld2VyL3Byb3BlcnRpZXMvcHJvcGVydGllcy12aWV3Lmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9kYXNoYm9hcmQvZGFzaGJvYXJkLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9hcnRpZmFjdC1mb3JtL2FydGlmYWN0LWZvcm0ubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL2Zvcm1zL2Vudi1wYXJhbWV0ZXJzLWZvcm0vZW52LXBhcmFtZXRlcnMtZm9ybS5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvZm9ybXMvcHJvcGVydHktZm9ybS9wcm9wZXJ0eS1mb3JtLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9mb3Jtcy9yZXNvdXJjZS1pbnN0YW5jZS1uYW1lLWZvcm0vcmVzb3VyY2UtaW5zdGFuY2UtbmFtZS5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9lbWFpbC1tb2RhbC9lbWFpbC1tb2RhbC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL2Vycm9yLW1vZGFsL2Vycm9yLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9tb2RhbHMvbWVzc2FnZS1tb2RhbC9tZXNzYWdlLWNsaWVudC1tb2RhbC9jbGllbnQtbWVzc2FnZS1tb2RhbC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvbW9kYWxzL21lc3NhZ2UtbW9kYWwvbWVzc2FnZS1zZXJ2ZXItbW9kYWwvc2VydmVyLW1lc3NhZ2UtbW9kYWwubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL21vZGFscy9vbmJvYXJkaW5nLW1vZGFsL29uYm9hcmRpbmctbW9kYWwubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL29uYm9hcmQtdmVuZG9yL29uYm9hcmQtdmVuZG9yLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy9wcmVsb2FkaW5nL3ByZWxvYWRpbmctdmlldy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvc3VwcG9ydC9zdXBwb3J0Lmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2dlbmVyYWwtdGFiLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy90YWJzL2hpZXJhcmNoeS9oaWVyYXJjaHkubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3R1dG9yaWFsLWVuZC90dXRvcmlhbC1lbmQubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9hcnRpZmFjdC1kZXBsb3ltZW50LXN0ZXAvYXJ0aWZhY3QtZGVwbG95bWVudC1zdGVwLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy93aXphcmQvYXJ0aWZhY3QtZm9ybS1zdGVwL2FydGlmYWN0LWZvcm0tc3RlcC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2FydGlmYWN0LWluZm9ybWF0aW9uLXN0ZXAvYXJ0aWZhY3QtaW5mb3JtYXRpb24tc3RlcC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2dlbmVyYWwtc3RlcC9nZW5lcmFsLXN0ZXAubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9oaWVyYXJjaHktc3RlcC9oaWVyYXJjaHktc3RlcC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL2ljb25zLXN0ZXAvaWNvbnMtc3RlcC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd2l6YXJkL3Byb3BlcnRpZXMtc3RlcC9wcm9wZXJ0aWVzLXN0ZXAubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC9wcm9wZXJ0eS1mb3JtL3Byb3BlcnR5LWZvcm0ubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dpemFyZC93aXphcmQtY3JlYXRpb24tYmFzZS5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvYWN0aXZpdHktbG9nL2FjdGl2aXR5LWxvZy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvYXR0cmlidXRlcy9hdHRyaWJ1dGVzLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi9jb21wb3NpdGlvbi5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9hcnRpZmFjdHMvYXJ0aWZhY3RzLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9jb21wb3NpdGlvbi90YWJzL2RldGFpbHMvZGV0YWlscy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvY29tcG9zaXRpb24vdGFicy9wcm9wZXJ0aWVzLWFuZC1hdHRyaWJ1dGVzL3Byb3BlcnRpZXMubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2NvbXBvc2l0aW9uL3RhYnMvcmVsYXRpb25zL3JlbGF0aW9ucy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGVwbG95bWVudC1hcnRpZmFjdHMvZGVwbG95bWVudC1hcnRpZmFjdHMubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2RlcGxveW1lbnQvZGVwbG95bWVudC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvZGlzdHJpYnV0aW9uL2Rpc3JpYnV0aW9uLXN0YXR1cy1tb2RhbC9kaXNyaWJ1dGlvbi1zdGF0dXMtbW9kYWwubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2Rpc3RyaWJ1dGlvbi9kaXN0cmlidXRpb24ubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2dlbmVyYWwvZ2VuZXJhbC5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvaWNvbnMvaWNvbnMubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2luZm9ybWF0aW9uLWFydGlmYWN0cy9pbmZvcm1hdGlvbi1hcnRpZmFjdHMubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9pbnB1dHMubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9yZXNvdXJjZS1pbnB1dC9yZXNvdXJjZS1pbnB1dHMubGVzcyc7CitAaW1wb3J0ICcuLi9zY3JpcHRzL3ZpZXctbW9kZWxzL3dvcmtzcGFjZS90YWJzL2lucHV0cy9zZXJ2aWNlLWlucHV0L3NlcnZpY2UtaW5wdXRzLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9wcm9kdWN0LWhpZXJhcmNoeS9wcm9kdWN0LWhpZXJhcmNoeS5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmxlc3MnOworQGltcG9ydCAnLi4vc2NyaXB0cy92aWV3LW1vZGVscy93b3Jrc3BhY2UvdGFicy9yZXEtYW5kLWNhcGFiaWxpdGllcy9yZXEtYW5kLWNhcGFiaWxpdGllcy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3RhYnMvdG9zY2EtYXJ0aWZhY3RzL3Rvc2NhLWFydGlmYWN0cy5sZXNzJzsKK0BpbXBvcnQgJy4uL3NjcmlwdHMvdmlldy1tb2RlbHMvd29ya3NwYWNlL3dvcmtzcGFjZS5sZXNzJzsKKy8vIGVuZGluamVjdG9yOmxlc3MKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9idXR0b25zLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvYnV0dG9ucy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTVkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvYnV0dG9ucy5sZXNzCkBAIC0wLDAgKzEsMjc0IEBACisudy1zZGMtYnRuIHsKKyAgICAuY180OworICAgIC5oYW5kOworICAgIC5ib3JkZXItcmFkaXVzKDVweCk7CisgICAgYm9yZGVyOiAwOworICAgIGhlaWdodDogMzhweDsKKyAgICBsaW5lLWhlaWdodDogMzhweDsKKyAgICB3aWR0aDogMTk1cHg7CisgICAgbWFyZ2luOiAwIDZweDsKKyAgICBwYWRkaW5nOiAwOworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgb3V0bGluZTogbm9uZTsKKyAgICAmOmRpc2FibGVkIHsgLmJnX2U7IH0KK30KKworLnctc2RjLWJ0bi1zbWFsbCB7CisgICAgLmNfOTsKKyAgICAuaGFuZDsKKyAgICAuYm9yZGVyLXJhZGl1cyg1cHgpOworICAgIGJvcmRlcjogMDsKKyAgICBoZWlnaHQ6IDMwcHg7CisgICAgbGluZS1oZWlnaHQ6IDMwcHg7CisgICAgd2lkdGg6IDcxcHg7CisgICAgbWFyZ2luOiAwIDZweDsKKyAgICBwYWRkaW5nOiAwOworICAgIG91dGxpbmU6IG5vbmU7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgJjpkaXNhYmxlZCB7IC5iZ19lOyB9Cit9CisKKworCisudy1zZGMtYnRuLXJlZC1zbWFsbHsKKworICAgIC53LXNkYy1idG4tc21hbGw7CisgICAgLmJnX2g7CisgICAgJjpob3ZlcjplbmFibGVkIHsgLmJnX2hfaG92ZXI7IH0KKyAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7CisKKyAgICBzcGFuIHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDdweDsKKyAgICAgICAgbGVmdDogMTBweDsKKyAgICB9Cit9CisKKy53LXNkYy1idG4tZ3JlZW4tc21hbGx7CisgICAgLnctc2RjLWJ0bi1zbWFsbDsKKyAgICAuYmdfejsKKyAgICAmOmhvdmVyOmVuYWJsZWQgeyAuYmdfel9ob3ZlcjsgfQorCit9CisKKworLnctc2RjLWJ0bi1saWdodC1ncmVlbiB7CisgICAgLnctc2RjLWJ0bjsKKyAgICAuYmdfejsKKyAgICAmOmhvdmVyOmVuYWJsZWQgeyAuYmdfel9ob3ZlcjsgfQorfQorCisudy1zZGMtYnRuLWdyZWVuIHsKKyAgICAudy1zZGMtYnRuOworICAgIC5iZ19kOworICAgICY6aG92ZXI6ZW5hYmxlZCB7IC5iZ19kX2hvdmVyOyB9Cit9CisKKy53LXNkYy1idG4tYmx1ZSB7CisgICAgLnctc2RjLWJ0bjsKKyAgICAuYmdfYTsKKyAgICAmOmhvdmVyOmVuYWJsZWQgeyAuYmdfYV9ob3ZlcjsgfQorfQorCisudy1zZGMtYnRuLWRhcmstZ3JheSB7CisgICAgLnctc2RjLWJ0bjsKKyAgICAuYmdfaTsKKyAgICAmOmhvdmVyOmVuYWJsZWQgeyAuYmdfaV9ob3ZlcjsgfQorfQorCisudy1zZGMtZm9ybS1hY3Rpb24geworICAgIC5jXzY7CisgICAgLy8uYmdfZDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjhiZDZlOyAvL1RPIERPOiBhZGQgdG8gdmFyaWFibGVzCisgICAgLmJvcmRlci1yYWRpdXMoNXB4KTsKKyAgICAuaGFuZDsKKyAgICBib3JkZXI6IDA7CisgICAgaGVpZ2h0OiAzOHB4OworICAgIGxpbmUtaGVpZ2h0OiAzOHB4OworICAgIHdpZHRoOiAyNjRweDsKKworICAgICY6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjNhYTYzOyB9IC8vVE8gRE86IGFkZCB0byB2YXJpYWJsZXMKKyAgICAmOmRpc2FibGVkIHsgYmFja2dyb3VuZC1jb2xvcjogIzkzZGViNjsgfSAvL1RPIERPOiBhZGQgdG8gdmFyaWFibGVzCit9CisKKy8qCitDTEFTU0lDIEJVVFRPTgorRXhhbXBsZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis8YnV0dG9uIGNsYXNzPSJ3LXNkYy1jbGFzc2ljLWJ0biBibHVlIj5UZXh0IDE8L2J1dHRvbj4KKzxidXR0b24gY2xhc3M9Inctc2RjLWNsYXNzaWMtYnRuIGdyZWVuIj5UZXh0IDE8L2J1dHRvbj4KKzxidXR0b24gY2xhc3M9Inctc2RjLWNsYXNzaWMtYnRuIGdyYXkiPlRleHQgMTwvYnV0dG9uPgorPGJ1dHRvbiBjbGFzcz0idy1zZGMtY2xhc3NpYy1idG4gd2hpdGUiPlRleHQgMTwvYnV0dG9uPgorPGJ1dHRvbiBjbGFzcz0idy1zZGMtY2xhc3NpYy1idG4gYmx1ZSBkaXNhYmxlZCI+VGV4dCA1PC9idXR0b24+CisqLworLnctc2RjLWNsYXNzaWMtYnRuIHsKKyAgICAucF8xNF9tOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAuYm9yZGVyLXJhZGl1cygycHgpOworICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgYm9yZGVyLXdpZHRoOiAxcHg7CisgICAgd2lkdGg6IDk0cHg7CisgICAgaGVpZ2h0OiAzMHB4OworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgbGluZS1oZWlnaHQ6IDMwcHg7CisgICAgY3Vyc29yOiBwb2ludGVyOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIC5ub3NlbGVjdDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisKKyAgICAmOmZvY3VzLAorICAgICY6YWN0aXZlOmZvY3VzIHsKKyAgICAgICAgb3V0bGluZTogMCBub25lOworICAgIH0KKworICAgICYucHJpbWFyeSB7CisgICAgICAgIGJvcmRlci1jb2xvcjogQG1haW5fY29sb3JfYjsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIEBtYWluX2NvbG9yX2E7CisgICAgICAgIGNvbG9yOiBAbWFpbl9jb2xvcl9wOworCisgICAgICAgICY6aG92ZXIgICAgIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICAjMWVjMmZmOworICAgICAgICB9CisgICAgfQorCisgICAgJi53aGl0ZSB7CisKKyAgICB9CisKKyAgICAmLmdyZXkgeworCisgICAgfQorCisgICAgJi5wb3NpdGl2ZSB7CisKKyAgICB9CisKKyAgICAmLm5lZ2F0aXZlIHsKKworICAgIH0KKworICAgICYuYmx1ZSB7CisgICAgICAgIC5jXzc7CisgICAgICAgIC5fdy1zZGMtY2xhc3NpYy1idG4tY29uZmlndXJhdGlvbigjMDM2Njk4LCAjM2I3YjliLCAjMDIzYzU5KTsgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsCisgICAgICAgICY6aG92ZXIgICAgIHsgLl93LXNkYy1jbGFzc2ljLWJ0bi1jb25maWd1cmF0aW9uKCMwMzY2OTgsICM0NThlYjIsICMwMjNjNTkpOyB9ICAgLy8gSG92ZXIKKyAgICAgICAgJjphY3RpdmUgICAgeyAuX3ctc2RjLWNsYXNzaWMtYnRuLWNvbmZpZ3VyYXRpb24oIzAzNjY5OCwgIzMzNmM4OCwgIzAyM2M1OSk7IH0gICAvLyBQcmVzc2VkCisgICAgICAgICY6Zm9jdXMgICAgIHsgJjpiZWZvcmUgeyAuX3ctc2RjLWNsYXNzaWMtYnRuLWZvY3VzKCNmZmZmZmYsIDBweCk7IH0gfSAgICAgICAgICAgICAgICAvLyBGb2N1cworICAgICAgICAmOmRpc2FibGVkLAorICAgICAgICAmLmRpc2FibGVkIHsKKyAgICAgICAgICAgIC5jXzc7CisgICAgICAgICAgICBvcGFjaXR5OiAwLjM7CisgICAgICAgICAgICAuX3ctc2RjLWNsYXNzaWMtYnRuLWNvbmZpZ3VyYXRpb24oIzAzNjY5OCwgIzNiN2I5YiwgIzAyM2M1OSk7ICAgICAgICAgICAgICAgIC8vIERpc2FibGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAmLmdyZWVuIHsKKyAgICAgICAgLmNfNzsKKyAgICAgICAgLl93LXNkYy1jbGFzc2ljLWJ0bi1jb25maWd1cmF0aW9uKCMyNWE3NjIsICMyOGJkNmUsICMyMzU2MDApOyAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWwKKyAgICAgICAgJjpob3ZlciAgICAgeyAuX3ctc2RjLWNsYXNzaWMtYnRuLWNvbmZpZ3VyYXRpb24oIzI1YTc2MiwgIzJiY2Q3NywgIzIzNTYwMCk7IH0gICAvLyBIb3ZlcgorICAgICAgICAmOmFjdGl2ZSAgICB7IC5fdy1zZGMtY2xhc3NpYy1idG4tY29uZmlndXJhdGlvbigjNDVhMDA2LCAjMjRhODYyLCAjMjM1NjAwKTsgfSAgIC8vIFByZXNzZWQKKyAgICAgICAgJjpmb2N1cyAgICAgeyAmOmJlZm9yZSB7IC5fdy1zZGMtY2xhc3NpYy1idG4tZm9jdXMoI2ZmZmZmZiwgMHB4KTsgfSB9ICAgICAgICAgICAgICAgIC8vIEZvY3VzCisgICAgICAgICY6ZGlzYWJsZWQsCisgICAgICAgICYuZGlzYWJsZWQgeworICAgICAgICAgICAgLmNfNzsKKyAgICAgICAgICAgIG9wYWNpdHk6IDAuMzsKKyAgICAgICAgICAgIC5fdy1zZGMtY2xhc3NpYy1idG4tY29uZmlndXJhdGlvbigjNDVhMDA2LCAjMjhiZDZlLCAjMjM1NjAwKTsgICAgICAgICAgICAgICAgLy8gRGlzYWJsZWQKKyAgICAgICAgfQorICAgIH0KKworICAgICYuZ3JheSB7CisgICAgICAgIC5iXzc7CisgICAgICAgIC5fdy1zZGMtY2xhc3NpYy1idG4tY29uZmlndXJhdGlvbigjZDhkOGQ4LCAjZjZmNmY2LCAjYWFhYWFhKTsgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsCisgICAgICAgICY6aG92ZXIgICAgIHsgLl93LXNkYy1jbGFzc2ljLWJ0bi1jb25maWd1cmF0aW9uKCNkOGQ4ZDgsICNlY2VjZWMsICNhYWFhYWEpOyB9ICAgLy8gSG92ZXIKKyAgICAgICAgJjphY3RpdmUgICAgeyAuX3ctc2RjLWNsYXNzaWMtYnRuLWNvbmZpZ3VyYXRpb24oI2Q4ZDhkOCwgI2Q3ZDdkNywgI2FhYWFhYSk7IH0gICAvLyBQcmVzc2VkCisgICAgICAgICY6Zm9jdXMgICAgIHsgJjpiZWZvcmUgeyAuX3ctc2RjLWNsYXNzaWMtYnRuLWZvY3VzKCM2NjY2NjYsIC0xcHgpOyB9IH0gICAgICAgICAgLy8gRm9jdXMKKyAgICAgICAgJjpkaXNhYmxlZCwKKyAgICAgICAgJi5kaXNhYmxlZCB7CisgICAgICAgICAgICAuYl83OworICAgICAgICAgICAgb3BhY2l0eTogMC4zOworICAgICAgICAgICAgLl93LXNkYy1jbGFzc2ljLWJ0bi1jb25maWd1cmF0aW9uKCNkOGQ4ZDgsICNmNmY2ZjYsICNhYWFhYWEpOyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlZAorICAgICAgICB9CisgICAgfQorCisgICAgJi53aGl0ZSB7CisgICAgICAgIC5iXzc7CisgICAgICAgIC5fdy1zZGMtY2xhc3NpYy1idG4tY29uZmlndXJhdGlvbigjZDhkOGQ4LCAjZmZmZmZmLCAjYWFhYWFhKTsgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsCisgICAgICAgICY6aG92ZXIgICAgIHsgLl93LXNkYy1jbGFzc2ljLWJ0bi1jb25maWd1cmF0aW9uKCNkOGQ4ZDgsICNmNmY2ZjYsICNhYWFhYWEpOyB9ICAgLy8gSG92ZXIKKyAgICAgICAgJjphY3RpdmUgICAgeyAuX3ctc2RjLWNsYXNzaWMtYnRuLWNvbmZpZ3VyYXRpb24oI2Q4ZDhkOCwgI2VjZWNlYywgI2FhYWFhYSk7IH0gICAvLyBQcmVzc2VkCisgICAgICAgICY6Zm9jdXMgICAgIHsgJjpiZWZvcmUgeyAuX3ctc2RjLWNsYXNzaWMtYnRuLWZvY3VzKCM2NjY2NjYsIC0xcHgpOyB9IH0gICAgICAgICAgICAgICAgLy8gRm9jdXMKKyAgICAgICAgJjpkaXNhYmxlZCwKKyAgICAgICAgJi5kaXNhYmxlZCB7CisgICAgICAgICAgICAuYl83OworICAgICAgICAgICAgb3BhY2l0eTogMC4zOworICAgICAgICAgICAgLl93LXNkYy1jbGFzc2ljLWJ0bi1jb25maWd1cmF0aW9uKCNkOGQ4ZDgsICNmZmZmZmYsICNhYWFhYWEpOyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlZAorICAgICAgICB9CisgICAgfQorfQorCisuX3ctc2RjLWNsYXNzaWMtYnRuLWNvbmZpZ3VyYXRpb24oQGJvcmRlci1jb2xvcjsgQGJhY2tncm91bmQtY29sb3I7IEBzaGFkb3ctY29sb3IpIHsKKyAgICBib3JkZXItY29sb3I6ICBAYm9yZGVyLWNvbG9yOworICAgIGJhY2tncm91bmQtY29sb3I6ICBAYmFja2dyb3VuZC1jb2xvcjsKKyAgICAuYm94LXNoYWRvdygwcHggMXB4IDAuOTlweCAwLjAxcHggQHNoYWRvdy1jb2xvcik7Cit9CisKKy5fdy1zZGMtY2xhc3NpYy1idG4tZm9jdXMoQGJvcmRlci1jb2xvciwgQHBvc2l0aW9uKSB7CisgICAgY29udGVudDogIiAiOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IEBwb3NpdGlvbjsKKyAgICBsZWZ0OiBAcG9zaXRpb247CisgICAgcmlnaHQ6IEBwb3NpdGlvbjsKKyAgICBib3R0b206IC0xcHggKyBAcG9zaXRpb247CisgICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlci1jb2xvcjsKKyAgICB6LWluZGV4OiAxOworICAgIC5ib3JkZXItcmFkaXVzKDJweCk7Cit9CisKKy8qCitXSVpBUkQgU1RFUCBDSVJDTEUgQlVUVE9OCitFeGFtcGxlczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzxidXR0b24gY2xhc3M9Inctc2RjLXdpemFyZC1zdGVwLWJ0biI+MTwvYnV0dG9uPgorPGJ1dHRvbiBjbGFzcz0idy1zZGMtd2l6YXJkLXN0ZXAtYnRuIHNlbGVjdGVkIj4yPC9idXR0b24+Cis8YnV0dG9uIGNsYXNzPSJ3LXNkYy13aXphcmQtc3RlcC1idG4gdmFsaWQiPjM8L2J1dHRvbj4KKzxidXR0b24gY2xhc3M9Inctc2RjLXdpemFyZC1zdGVwLWJ0biI+NDwvYnV0dG9uPgorPGJ1dHRvbiBjbGFzcz0idy1zZGMtd2l6YXJkLXN0ZXAtYnRuIGRpc2FibGVkIj41PC9idXR0b24+CisqLworLnctc2RjLXdpemFyZC1zdGVwLWJ0biB7CisgICAgLl93LXNkYy13aXphcmQtc3RlcC1idG4oMThweCk7Cit9CisuX3ctc2RjLXdpemFyZC1zdGVwLWJ0bihAY2lyY2xlLXJhZGl1cykgeworICAgIC8vIEknbSBub3QgdXNpbmcgYm9yZGVyLCBzbyB0aGUgdGV4dCBpbnNpZGUgd2lsbCBiZSB2ZXJ0aWNhbCBhbGlnbmVkLgorICAgIC5jaXJjbGUoQGNpcmNsZS1yYWRpdXMgKiAyLCAjZjZmNmY2KTsKKyAgICAubm9zZWxlY3Q7CisgICAgb3V0bGluZTogMCBub25lOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIGJvcmRlcjogbm9uZTsKKyAgICAuYm94LXNoYWRvdyhpbnNldCAwcHggMHB4IDBweCAxcHggI2Q4ZDhkOCk7CisgICAgLmJfMTc7CisKKyAgICAmOmFjdGl2ZSAgICB7IC5ib3gtc2hhZG93KG5vbmUpOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZWFlYWVhO30gICAgLy8gUHJlc3NlZAorICAgICYuZGlzYWJsZWQgIHsgY29sb3I6ICNhOGIzYjk7IGN1cnNvcjogZGVmYXVsdDsgfQorICAgICYuZGlzYWJsZWQ6YWN0aXZlIHsgLmJveC1zaGFkb3coaW5zZXQgMHB4IDBweCAwcHggMXB4ICNkOGQ4ZDgpOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjZmNmY2OyB9CisgICAgJi52YWxpZCB7CisgICAgICAgIC5jaXJjbGUoQGNpcmNsZS1yYWRpdXMgKiAyLCAjZmZmZmZmKTsKKyAgICAgICAgLmJveC1zaGFkb3coaW5zZXQgMHB4IDBweCAwcHggMnB4ICMyOGJkNmUpOworICAgICAgICAuYl8xNzsKKyAgICB9CisgICAgJi5zZWxlY3RlZCAgeworICAgICAgICAuY18xNzsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNiN2I5YjsKKyAgICAgICAgLmJveC1zaGFkb3cobm9uZSk7CisgICAgICAgICY6YWN0aXZlICAgIHtiYWNrZ3JvdW5kLWNvbG9yOiAjMzM2Yzg4O30gICAgLy8gUHJlc3NlZAorICAgIH0KK30KKworCisKKworCisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9kYXJrLWhlYWRlci5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2RhcmstaGVhZGVyLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiNDE3NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9kYXJrLWhlYWRlci5sZXNzCkBAIC0wLDAgKzEsNTEgQEAKKy53LXNkYy1kYXJrLWhlYWRlciB7CisgICAgLmNfMTE7CisgICAgLmJnX2k7CisgICAgaGVpZ2h0OiA5NHB4OworICAgIHdpZHRoOiAxMDAlOworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKworICAgIC53LXNkYy1kYXJrLWhlYWRlci1sb2dvIHsKKyAgICAgICAgLmhhbmQ7CisgICAgICAgIGhlaWdodDogOTJweDsKKyAgICAgICAgd2lkdGg6IDI0MHB4OworICAgICAgICBwYWRkaW5nOiAyOHB4IDI4cHggMjhweCA2MHB4OworICAgICAgICAuZmxleC1maXhlZCgyNDBweCk7CisKKyAgICAgICAgLnctc2RjLWRhcmstaGVhZGVyLWxvZ28taWNvbiB7CisgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKKyAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiAtNnB4OworICAgICAgICB9CisgICAgICAgIGEudy1zZGMtZGFyay1oZWFkZXItbG9nby1saW5rIHsKKyAgICAgICAgICAgIC5jXzU7CisgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgICAgIH0KKyAgICAgICAgLnctc2RjLWRhcmstaGVhZGVyLXZlcnNpb257CisgICAgICAgICAgICAuY18xNjsKKyAgICAgICAgICAgIC5vcGFjaXR5KDAuNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuaS1zZGMtZGFyay1oZWFkZXItY2FwdGlvbiB7CisgICAgICAgIG1pbi13aWR0aDogMTc1cHg7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgIGN1cnNvcjogZGVmYXVsdDsKKyAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgICAgIGZsZXgtZ3JvdzogMTA7CisgICAgICAgIHBhZGRpbmctbGVmdDogMjdweDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKworICAgICAgICAuaS1zZGMtZGFyay1oZWFkZXItY2FwdGlvbi10ZXh0IHsKKworICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CisgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLWhlYWRlci11c2VyLWNvbnRhaW5lciB7CisgICAgICAgIC5jXzc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJmNDFmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzLmxlc3MKQEAgLTAsMCArMSw3MiBAQAorLy9PbW5lc19BVFQgVzAyIEl0YWxpYworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiBvbW5lcy1pdGFsaWM7CisgIHNyYzogdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJJdGFsaWMuZW90Jyk7CisgIHNyYzogdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJJdGFsaWMuZW90PyNpZWZpeCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwKKyAgdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJJdGFsaWMudHRmJyk7Cit9CisKKy8vT21uZXNfQVRUIFcwMiBMaWdodAorQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiBvbW5lcy1saWdodDsKKyAgc3JjOiB1cmwoJ2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkxpZ2h0LmVvdCcpOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHQuZW90PyNpZWZpeCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwKKyAgdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodC50dGYnKTsKK30KKworLy9PbW5lc19BVFQgVzAyIExpZ2h0IEl0YWxpYworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiBvbW5lcy1saWdodC1pdGFsaWM7CisgIHNyYzogdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodEl0YWxpYy5lb3QnKTsKKyAgc3JjOiB1cmwoJ2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkxpZ2h0SXRhbGljLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksCisgIHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHRJdGFsaWMudHRmJyk7Cit9CisKKy8vT21uZXNfQVRUIFcwMiBNZWRpdW0KK0Bmb250LWZhY2UgeworICBmb250LWZhbWlseTogb21uZXMtbWVkaXVtOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtLmVvdCcpOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksCisgIHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtLnR0ZicpOworfQorCisvL09tbmVzX0FUVCBXMDIgTWVkaXVtIEl0YWxpYworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiBvbW5lcy1tZWRpdW0taXRhbGljOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtSXRhbGljLmVvdCcpOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtSXRhbGljLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksCisgIHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtSXRhbGljLnR0ZicpOworfQorCisvL09tbmVzX0FUVCBXMDIgUmVndWxhcgorQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiBvbW5lcy1yZWd1bGFyOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyLmVvdCcpOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksCisgIHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyLnR0ZicpOworfQorCisvL09tbmVzX0FUVCBXMDIgQm9sZAorQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiBvbW5lcy1ib2xkOworICBzcmM6IHVybCgnZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyQm9sZC5lb3QnKTsKKyAgc3JjOiB1cmwoJ2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkJvbGQuZW90PyNpZWZpeCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwKKyAgdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJCb2xkLnR0ZicpOworfQorCisvL09tbmVzX0FUVCBXMDIgQm9sZCBJdGFsaWMKK0Bmb250LWZhY2UgeworICBmb250LWZhbWlseTogb21uZXMtYm9sZC1pdGFsaWM7CisgIHNyYzogdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMuZW90Jyk7CisgIHNyYzogdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMuZW90PyNpZWZpeCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSwKKyAgdXJsKCdmb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMudHRmJyk7Cit9CisKKworLy9DbGVhcnZpZXdBVFQgQm9vaworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiBjbGVhcnZpZXctYm9vazsKKyAgc3JjOiB1cmwoJ2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmsuZW90Jyk7CisgIHNyYzogdXJsKCdmb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrLmVvdD8jaWVmaXgnKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksCisgIHVybCgnZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Cay50dGYnKTsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkLmVvdCBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkLmVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzA3NGZiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmQuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkLnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjRmNzUwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmQuc3ZnCkBAIC0wLDAgKzEsNDI0IEBACivvu788P3htbCAgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIiA+Cis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgPgorPG1ldGFkYXRhPgorPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorPGlkPjwhW0NEQVRBW0NsZWFydmlld0FUVCBCZF1dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0NvcHlyaWdodCAoYykgVGVybWluYWwgRGVzaWduLCBJbmMsIDIwMDUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXV0+PC9jb3B5cmlnaHQ+Cis8dHJhZGVtYXJrPjwhW0NEQVRBW0NsZWFydmlldyBpcyBhIHRyYWRlbWFyayBvZiBUZXJtaW5hbCBEZXNpZ24sIEluYy5dXT48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjU0NCIgaWQ9IkNsZWFydmlld0FUVC1CZCI+Cis8Zm9udC1mYWNlIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgQmQiIHBhbm9zZS0xPSIyIDExIDUgNiAzIDUgMCAyIDAgNCIgYXNjZW50PSI3NTAiIGRlc2NlbnQ9Ii0yNTAiIHVuaXRzLXBlci1lbT0iMTAwMCIgYWxwaGFiZXRpYz0iMCI+Cis8L2ZvbnQtZmFjZT4KKzxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSI0ODQiIGQ9Ik00OTIgNjY3VjBILThWNjY3SDQ5MlpNMzEgNjA2VjY1TDIxNyAzMzZMMzEgNjA2Wk00NTMgNjdWNjA1TDI2OCAzMzZMNDUzIDY3Wk02MSAzNUg0MjRMMjQyIDI5OUw2MSAzNVpNMjQyIDM3M0w0MTkgNjMwSDY1TDI0MiAzNzNaIiAgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGhvcml6LWFkdi14PSIzMDAiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjI5OSIgZD0iTTIyOCA2NjdRMjIzIDU0NyAyMTcgNDI5VDIwOCAxOTFIOTJRODkgMzExIDg0IDQyOVQ3MyA2NjdIMjI4Wk0yNDIgNjFRMjQyIDI5IDIxNiA5VDE1MCAtMTJRMTEwIC0xMiA4NCA4VDU3IDYxUTU3IDkxIDgzIDExMVQxNDkgMTMyUTE4OSAxMzIgMjE1IDExMlQyNDIgNjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik00MDUgNDQ4SDMxMkwyODggNzAwSDQzNUw0MDUgNDQ4Wk0xNjUgNDQ4SDcxTDQ3IDcwMEgxOTRMMTY1IDQ0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MzMgNDU2SDUzMkw1MTMgMzM1SDYyMUw2MDcgMjMxSDQ5N0w0ODIgMTEzSDM2OUwzODcgMjMxSDI2N0wyNDkgMTEzSDE0MkwxNTkgMjMxSDQ5TDYyIDMzNUgxNzNMMTg5IDQ1Nkg3OEw5MiA1NThIMjA0TDIyMCA2NjdIMzI5TDMxMyA1NThINDM5TDQ1NSA2NjdINTY0TDU0NyA1NThINjQ5TDYzMyA0NTZaTTI5NyA0NTZMMjgxIDMzNUg0MDVMNDIyIDQ1NkgyOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIkIiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTUxIDIwOVE1NTEgMTgyIDU0MSAxNTNUNTEwIDEwMFQ0NTUgNThUMzczIDM1Vi00NkgyNDFWMzZRMTU3IDQyIDYxIDEwMUwxMjAgMTk4UTE3MiAxNjQgMjE2IDE0OVQzMDYgMTM0UTQxOCAxMzQgNDE4IDIwMFE0MTggMjI2IDQwMiAyNDBUMzUwIDI2OUwyMDcgMzE5UTE0MCAzNDMgMTA4IDM4MlQ3NiA0ODBRNzYgNTEwIDg2IDUzOFQxMTYgNTg4VDE2OCA2MjVUMjQyIDY0NVY3MjJIMzc0VjY0NFE0MTIgNjQxIDQ0NyA2MzFUNTIzIDYwMEw0NzIgNDk2UTQzNCA1MTggMzk0IDUyOVQzMDkgNTQxUTI2MyA1NDEgMjM4IDUyOFQyMTIgNDg4UTIxMiA0NjUgMjI4IDQ1MlQyOTMgNDIyTDQwNyAzODNRNDgzIDM1NiA1MTcgMzE1VDU1MSAyMDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIlIiBob3Jpei1hZHYteD0iNzk0IiBkPSJNMzMwIDUzMFEzMzAgNDk1IDMyMyA0NjVUMzAwIDQxMVQyNTUgMzc1VDE4NSAzNjFRMTQzIDM2MSAxMTUgMzc0VDcxIDQxMVQ0NyA0NjRUNDAgNTMwUTQwIDU2NSA0NyA1OTZUNzAgNjUwVDExNSA2ODZUMTg1IDcwMFEyMjcgNzAwIDI1NSA2ODdUMjk5IDY1MFQzMjMgNTk2VDMzMCA1MzBaTTI0MSA1MzJRMjQxIDU1MiAyMzkgNTcwVDIzMSA2MDFUMjE0IDYyMVQxODUgNjI5UTE2NiA2MjkgMTU1IDYyMlQxMzggNjAxVDEzMCA1NzBUMTI4IDUzMVExMjggNDgzIDEzOSA0NTdUMTg1IDQzMVEyMjAgNDMxIDIzMCA0NThUMjQxIDUzMlpNMjAzIDBIMTI2TDU4OCA3MDBINjY0TDIwMyAwWk03NTQgMTYzUTc1NCAxMjggNzQ3IDk4VDcyMyA0NFQ2NzkgOFQ2MDkgLTZRNTY3IC02IDUzOSA3VDQ5NSA0NFQ0NzEgOTdUNDY0IDE2M1E0NjQgMTk4IDQ3MSAyMjlUNDk0IDI4M1Q1MzkgMzE5VDYwOSAzMzNRNjUxIDMzMyA2NzggMzIwVDcyMyAyODNUNzQ3IDIyOVQ3NTQgMTYzWk02NjUgMTY1UTY2NSAxODUgNjYzIDIwM1Q2NTUgMjM0VDYzOCAyNTRUNjA5IDI2MlE1OTAgMjYyIDU3OSAyNTVUNTYyIDIzNFQ1NTQgMjAzVDU1MiAxNjRRNTUyIDExNiA1NjMgOTBUNjA5IDY0UTY0NCA2NCA2NTQgOTFUNjY1IDE2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBob3Jpei1hZHYteD0iNjY3IiBkPSJNMzA5IC0xMFEyNTMgLTEwIDIwNyAyVDEyNyA0MFQ3NiAxMDNUNTcgMTkzUTU3IDIyNyA2NyAyNTVUOTYgMzA3VDEzOCAzNDhUMTkwIDM4MVExNjEgNDA5IDE0MSA0NDVUMTIwIDUyM1ExMjAgNTUzIDEzMiA1ODFUMTY4IDYzMVQyMjggNjY2VDMxMyA2ODBRMzYyIDY4MCAzOTYgNjY3VDQ1MSA2MzNUNDgxIDU4NVQ0OTEgNTMwUTQ5MSA0NzQgNDU0IDQzN1QzNTcgMzY3TDQ4MiAyMDFRNDg0IDIxMCA0ODQgMjI1VDQ4NSAyNTRRNDg1IDI3OCA0ODMgMzA0VDQ3NyAzNDdINjAzUTYwOCAzMjUgNjEwIDI5N1Q2MTMgMjQ1UTYxMyAyMTAgNjA0IDE3M1Q1NjkgMTA4TDY1MCAwSDUwMUw0NzQgMzRRNDQyIDE0IDQwMSAyVDMwOSAtMTBaTTMxMiA5OFEzMzggOTggMzU5IDEwNFQzOTUgMTIwTDI1MyAzMDNRMjMwIDI4NSAyMTUgMjYwVDE5OSAyMDNRMTk5IDE1OCAyMjcgMTI4VDMxMiA5OFpNMzA1IDQzMVEzNDAgNDU3IDM1OCA0NzhUMzc2IDUyOVEzNzYgNTU0IDM2MyA1NzJUMzE1IDU5MFEyODQgNTkwIDI2NyA1NzRUMjUwIDUyOFEyNTAgNTA1IDI2NyA0NzhUMzA1IDQzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgaG9yaXotYWR2LXg9IjI0MSIgZD0iTTE2NSA0NDhINzFMNDcgNzAwSDE5NEwxNjUgNDQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjMzNyIgZD0iTTE3OCAtMTM5UTExNiAtMzggNzcgNzNUMzggMzE4UTM4IDM4NSA0OCA0NDNUNzYgNTU3VDEyMCA2NjVUMTc4IDc3NUwyNzggNzQ5UTIyOSA2NTkgMTk5IDU1M1QxNjkgMzE4UTE2OSAxOTAgMTk5IDg2VDI3OCAtMTEyTDE3OCAtMTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKSIgaG9yaXotYWR2LXg9IjMzNyIgZD0iTTM4IC0xMTJRODcgLTE4IDExNyA4NlQxNDcgMzE4UTE0NyA0NDcgMTE4IDU1M1QzOCA3NDlMMTM4IDc3NVExNjkgNzE5IDE5NSA2NjZUMjM5IDU1N1QyNjggNDQ0VDI3OCAzMThRMjc4IDE4NCAyMzkgNzNUMTM4IC0xMzlMMzggLTExMloiICAvPgorPGdseXBoIHVuaWNvZGU9IioiIGhvcml6LWFkdi14PSIzNzUiIGQ9Ik0yNDMgNTMxVjUyOUwzMTkgNDU4TDIzMiAzOTlMMTg1IDQ5MEgxODNMMTM1IDM5OUw0OSA0NThMMTI0IDUyOVY1MzFMMTYgNTQzTDUwIDYzOUwxNDYgNTkzVjU5NEwxMjcgNjk0SDI0MEwyMjIgNTk1VjU5NEwzMTcgNjM5TDM1MSA1NDRMMjQzIDUzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IisiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik0zNjggMjExVjVIMjQ3VjIxMUg0NVYzMjlIMjQ3VjUzMkgzNjhWMzI5SDU2OFYyMTFIMzY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MmM7IiBob3Jpei1hZHYteD0iMjU5IiBkPSJNMTE2IC0xMzJIMjBMNzAgMTIwSDIyMUwxMTYgLTEzMloiICAvPgorPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSIzODMiIGQ9Ik00OCAxOTVWMzI3SDMzNVYxOTVINDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBob3Jpei1hZHYteD0iMjU5IiBkPSJNMjIyIDYxUTIyMiAyOSAxOTUgOVQxMjkgLTEyUTg5IC0xMiA2MyA4VDM2IDYxUTM2IDkxIDYzIDExMVQxMjkgMTMyUTE2OCAxMzIgMTk1IDExMlQyMjIgNjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iNTczIiBkPSJNMTQ5IC0xMTVIMjJMNDE4IDcwMEg1NDZMMTQ5IC0xMTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIwIiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTY4IDMzM1E1NjggMjU1IDU1NiAxOTJUNTE1IDgzVDQzNSAxMlQzMDcgLTEzUTIzMCAtMTMgMTgwIDEyVDk5IDgyVDU3IDE5MVQ0NSAzMzNRNDUgNDExIDU3IDQ3NFQ5OSA1ODNUMTc5IDY1M1QzMDcgNjc4UTM4NCA2NzggNDM0IDY1M1Q1MTQgNTgzVDU1NiA0NzVUNTY4IDMzM1pNNDI1IDMzM1E0MjUgMzgzIDQyMiA0MjVUNDA4IDQ5N1QzNzMgNTQ0VDMwNyA1NjFRMjY1IDU2MSAyNDEgNTQ1VDIwNiA0OThUMTkxIDQyNlQxODggMzMzUTE4OCAyODUgMTkxIDI0M1QyMDUgMTcxVDI0MSAxMjJUMzA3IDEwNFEzNDkgMTA0IDM3MiAxMjFUNDA3IDE2OVQ0MjIgMjQyVDQyNSAzMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIxIiBob3Jpei1hZHYteD0iNjEzIiBkPSJNMjU1IDExOVY1MTFIMjUyTDEyMSA0MzBMNjUgNTM2TDI4MSA2NjhIMzkzVjExOUg1NDhWMEg5NlYxMTlIMjU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMiIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTgyIDBMNjEgMTE4UTEzOSAxODIgMjAxIDIzMFQzMDcgMzE4VDM3NCAzOTRUMzk3IDQ3MFEzOTcgNTA1IDM3NSA1MzFUMzEwIDU1OFEyNjQgNTU4IDIyMyA1MzdUMTQwIDQ3MUw2NSA1NzFROTYgNjAxIDEyNSA2MjFUMTg1IDY1NFQyNDcgNjcyVDMxNyA2NzhRNDIwIDY3OCA0NzkgNjI4VDUzOSA0ODRRNTM5IDQ0MiA1MjUgNDAwVDQ3NyAzMTNUMzg0IDIyMVQyMzUgMTE5SDU1MlYwSDgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTU1NSAyMDJRNTU1IDE1NSA1NDAgMTE2VDQ5MiA0OFQ0MDkgM1QyOTEgLTEzUTIyNiAtMTMgMTY3IDdUNTcgNjdMMTE5IDE2OFExNTkgMTM4IDIwMiAxMjBUMjg1IDEwMlEzNDIgMTAyIDM3NyAxMjZUNDEzIDE5OVE0MTMgMjUwIDM4NyAyNjhUMzEwIDI4N0gyMTJWNDAwSDI2MFEzMjEgNDAwIDM1NyA0MThUMzkzIDQ3OVEzOTMgNDkzIDM4OSA1MDdUMzczIDUzM1QzNDIgNTUyVDI5MSA1NTlRMjQ4IDU1OSAyMDggNTQxVDEzMCA0ODlMNjcgNTkzUTk4IDYxNiAxMjYgNjMyVDE4MyA2NTlUMjQxIDY3M1QzMDcgNjc4UTM1NiA2NzggMzk4IDY2NlQ0NzAgNjMwVDUxOCA1NzBUNTM1IDQ4NVE1MzUgNDM3IDUxOCA0MDVUNDYxIDM1MlYzNTBRNTA2IDMzNyA1MzAgMjk5VDU1NSAyMDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI0IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNDgwIDEzM1YwSDM0MlYxMzNINzNMNDAgMjM5TDMzNSA2NjZINDgwVjI1Mkg1NzJWMTMzSDQ4MFpNMzQyIDUwM0wxODggMjUySDM0NlY1MDNIMzQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNSIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTU1MiAyMzBRNTUyIDExNCA0ODUgNTFUMjgyIC0xM1EyMTYgLTEzIDE2NCAyVDYxIDU1TDExOCAxNjJRMTU1IDEzNSAxOTcgMTE5VDI4MyAxMDJRMzUzIDEwMiAzODMgMTM0VDQxNCAyMzBRNDE0IDI5MiAzODMgMzIwVDI4OSAzNDhRMjQ5IDM0OCAyMjAgMzMzVDE2NCAyOTRMNjIgMzYyTDExOCA2NjdINTE0VjU0N0gyMjhMMTk3IDQxN0wyMDEgNDE1UTIzMiA0MzkgMjYzIDQ0OVQzMzIgNDYwUTQzNSA0NjAgNDkzIDQwNVQ1NTIgMjMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNiIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTU2NCAyMjZRNTY0IDE3MCA1NDYgMTI2VDQ5NSA1MVQ0MTYgNFQzMTMgLTEzUTE3OSAtMTMgMTE0IDcwVDQ4IDMxMlE0OCAzODggNjEgNDU1VDEwOCA1NzFUMTk4IDY0OVQzMzkgNjc4UTM5MyA2NzggNDM4IDY2NlQ1MzAgNjI0TDQ2NyA1MTlRNDM1IDU0MCA0MDYgNTQ5VDM0MCA1NThRMjYyIDU1OCAyMjQgNTE3VDE4NCAzODVIMTg4UTIxMiA0MTcgMjQ5IDQzM1QzMzUgNDQ5UTM4NyA0NDkgNDI5IDQzNFQ1MDIgMzg5VDU0OCAzMThUNTY0IDIyNlpNNDIzIDIyM1E0MjMgMjgwIDM5NiAzMDZUMzE0IDMzMlEyNjAgMzMyIDIyOCAzMDVUMTk2IDIyMFExOTYgMTYxIDIyNyAxMzNUMzEzIDEwNFE0MjMgMTA0IDQyMyAyMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTUzIDU1OFE0ODYgNTA0IDQ0NiA0NTVUMzgzIDM0OFQzNTQgMjIwVDM0NyA1MFYwSDIwMFYzM1EyMDAgOTIgMjA1IDE2MlQyMjkgMzAyVDI4MCA0MzVUMzcxIDU0NFY1NDhINTlWNjY3SDUzMEw1NTMgNTU4SDU1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01NjIgMjAwUTU2MiAxNTYgNTUxIDExOFQ1MTAgNTBUNDMyIDRUMzA4IC0xM1EyMzMgLTEzIDE4MyA0VDEwNCA1MFQ2MiAxMTdUNTAgMjAwUTUwIDI1OSA3NCAyOTVUMTU0IDM1M1YzNTdRMTA2IDM4MCA4NyA0MTNUNjggNDk2UTY4IDU4MyAxMjQgNjMwVDMwNiA2NzhRNTQ0IDY3OCA1NDQgNDk2UTU0NCA0NDcgNTI1IDQxNFQ0NTggMzU3VjM1M1E1MTIgMzMzIDUzNyAyOTZUNTYyIDIwMFpNNDA3IDQ4NFE0MDcgNTI2IDM4MyA1NDVUMzA2IDU2NFEyNTMgNTY0IDIyOSA1NDVUMjA1IDQ4NFEyMDUgNDAxIDMwNiA0MDFRNDA3IDQwMSA0MDcgNDg0Wk00MjMgMTk4UTQyMyAyNTIgMzk2IDI3NFQzMDYgMjk3UTI0OCAyOTcgMjE3IDI3NlQxODYgMTk3UTE4NiAxNDEgMjE2IDEyMFQzMDYgOThRMzY1IDk4IDM5NCAxMTlUNDIzIDE5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjkiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01NjQgMzQ1UTU2NCAxNzUgNDk2IDgyVDI3OSAtMTFRMjE5IC0xMSAxNzIgNVQ4MSA1OEwxNTIgMTUwUTE3MCAxMzYgMTg1IDEyN1QyMTQgMTEzVDI0NCAxMDVUMjc5IDEwMlEzNTIgMTAyIDM4OCAxNDNUNDI3IDI4N0g0MjNRMzk1IDI1MiAzNjEgMjM1VDI3NyAyMThRMjI3IDIxOCAxODYgMjMyVDExMyAyNzVUNjUgMzQ1VDQ4IDQ0MVE0OCA0OTYgNjYgNTM5VDExNyA2MTRUMTk2IDY2MVQyOTkgNjc4UTQyNyA2NzggNDk1IDU5OFQ1NjQgMzQ1Wk00MTMgNDQ3UTQxMyA0OTkgMzg4IDUzMFQzMDEgNTYxUTI0NCA1NjEgMjE3IDUzMFQxODkgNDQ0UTE4OSAzOTYgMjE2IDM2NlQzMDAgMzM2UTMzMiAzMzYgMzUzIDM0NFQzODggMzY3VDQwNyA0MDJUNDEzIDQ0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjoiIGhvcml6LWFkdi14PSIyNTkiIGQ9Ik0yMjAgNDA3UTIyMCAzNzYgMTk0IDM1NVQxMzAgMzM0UTkyIDMzNCA2NiAzNTVUNDAgNDA3UTQwIDQzOCA2NiA0NThUMTMwIDQ3OFExNjggNDc4IDE5NCA0NThUMjIwIDQwN1pNMjIwIDYxUTIyMCAyOSAxOTQgOVQxMzAgLTEyUTkyIC0xMiA2NiA4VDQwIDYxUTQwIDkxIDY2IDExMVQxMzAgMTMyUTE2OCAxMzIgMTk0IDExMlQyMjAgNjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBob3Jpei1hZHYteD0iMjU5IiBkPSJNMTE2IC0xMzJIMjBMNjkgMTIwSDIyMEwxMTYgLTEzMlpNMjI5IDQwN1EyMjkgMzc2IDIwNCAzNTVUMTQwIDMzNFExMDIgMzM0IDc2IDM1NVQ1MCA0MDdRNTAgNDM4IDc2IDQ1OFQxNDAgNDc4UTE3OCA0NzggMjAzIDQ1OFQyMjkgNDA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmx0OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTQ1IDIxMFYzMjlMNTY4IDU0NFY0MTlMMTgzIDI3MUw1NjggMTI3VjVMNDUgMjEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTQ1IDMzM1Y0NTBINTY4VjMzM0g0NVpNNDUgMTAxVjIxOEg1NjhWMTAxSDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmd0OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTQ1IDVWMTI3TDQzMCAyNzFMNDUgNDE5VjU0NEw1NjggMzI5VjIxMEw0NSA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPyIgaG9yaXotYWR2LXg9IjU0NSIgZD0iTTQ5NiA0OTNRNDk2IDQzMSA0NjggMzg4VDM3NiAzMTRMMzM2IDI5NVEzMjQgMjg5IDMxNyAyODVUMzA3IDI3NVQzMDMgMjYwVDMwMiAyMzVWMTk1SDE2NlYyNjZRMTY2IDI4OCAxNjggMzAzVDE3OCAzMzBUMTk5IDM1MFQyMzMgMzY5TDI3NiAzODlRMjk3IDM5OSAzMTMgNDA4VDMzOSA0MjdUMzU1IDQ1MFQzNjAgNDgyUTM2MCA1MjAgMzMyIDU0MFQyNTUgNTYxUTE2NiA1NjEgMTA1IDUwNEwzNyA2MDVRNjcgNjI1IDk0IDYzOVQxNTAgNjYyVDIwOCA2NzVUMjc0IDY3OVEzODYgNjc5IDQ0MSA2MzBUNDk2IDQ5M1pNMzIzIDYwUTMyMyAyOSAyOTcgOVQyMzEgLTEyUTE5MiAtMTIgMTY2IDhUMTM5IDYwUTEzOSA5MCAxNjUgMTEwVDIzMCAxMzFRMjcwIDEzMSAyOTYgMTExVDMyMyA2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI4MjMiIGQ9Ik03NjYgMjk5UTc2NiAyMzYgNzUwIDE4OVQ3MDcgMTEyVDY0NiA2NlQ1NzYgNTFRNTQ3IDUxIDUyMSA2NlQ0ODggMTE0SDQ4N1E0NjcgODQgNDM0IDY5VDM2NCA1NFEzMDQgNTQgMjcwIDk1VDIzNiAyMDlRMjM2IDI0NCAyNDUgMjgxVDI3NSAzNDlUMzI4IDQwMFQ0MDggNDIwUTQzNyA0MjAgNDU3IDQxMVQ0OTQgMzgwSDQ5NUw0OTkgNDEwSDYwM0w1NjcgMTQxUTU2NSAxMzAgNTc0IDEyMlQ2MDAgMTEzUTYxNiAxMTMgNjM1IDEyM1Q2NzAgMTU1VDY5NyAyMTRUNzA4IDMwNFE3MDggMzU4IDY4OSA0MDBUNjM1IDQ3MFQ1NTIgNTEzVDQ0NiA1MjhRMzc4IDUyOCAzMTkgNTEwVDIxNyA0NTRUMTUwIDM2MVQxMjUgMjMwUTEyNSA5NiAxOTggMjJUNDEzIC01M1E1NDAgLTUzIDYyMyA5TDY1NiAtMzhRNTk5IC03OCA1MzcgLTkzVDQwMiAtMTA4UTMzMSAtMTA4IDI2OCAtODZUMTU4IC0yMVQ4NCA4NVQ1NyAyMzNRNTcgMzE1IDg2IDM4MFQxNjcgNDkxVDI4OSA1NjFUNDQyIDU4NlE1MTQgNTg2IDU3NCA1NjdUNjc2IDUxMFQ3NDIgNDIwVDc2NiAyOTlaTTQ4MiAyNzlRNDg1IDMwNyA0NzUgMzI0VDQyNyAzNDFRMzgyIDM0MSAzNjEgMzA3VDMzOSAxOTlRMzM5IDEzMiAzOTkgMTMyUTQzNCAxMzIgNDUxIDE1MlQ0NzQgMjEyTDQ4MiAyNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJBIiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMzIDBMNDgwIDE0MEgyMTdMMTYzIDBIMTJMMjY5IDY3MEg0MjVMNjg5IDBINTMzWk0zNDggNTI1SDM0NEwyNTEgMjU4SDQ0M0wzNDggNTI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9IjY2NiIgZD0iTTYxNSAxODFRNjE1IDEzMCA1OTggOTZUNTUxIDQwVDQ3NyAxMFQzNzkgMEg3M1Y2NjJRMTMzIDY2OSAxOTUgNjcyVDMxNyA2NzVRMzY2IDY3NSA0MTUgNjY5VDUwMyA2NDNUNTY2IDU4OFQ1OTEgNDk1UTU5MSA0MzMgNTYyIDQwMVQ0ODIgMzUzVjM0OVE1NDUgMzM2IDU4MCAyOTZUNjE1IDE4MVpNNDQ4IDQ4MFE0NDggNTIzIDQyMSA1NDNUMzIwIDU2M1EzMDkgNTYzIDI5NSA1NjNUMjY2IDU2MVQyNDAgNTYwVDIxOSA1NThWMzk0UTI0MiAzOTIgMjY1IDM5MlQzMjQgMzkyUTM4OCAzOTIgNDE4IDQwOVQ0NDggNDgwWk00NjggMTk2UTQ2OCAyMzAgNDU1IDI0OVQ0MjAgMjc4VDM3NSAyOTBUMzI4IDI5MlEzMDAgMjkyIDI3MSAyOTJUMjE4IDI5MFYxMDZRMjQ2IDEwNCAyNjkgMTA0VDMyNyAxMDRRMzU4IDEwNCAzODMgMTA2VDQyOCAxMThUNDU3IDE0NlQ0NjggMTk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTY0MCA5NlE1ODIgNDEgNTIwIDE1VDM4NSAtMTFRMjk5IC0xMSAyMzcgMTRUMTM1IDg1VDc2IDE5NVQ1NiAzMzhRNTYgNDE0IDc3IDQ3N1QxNDAgNTg0VDI0MiA2NTNUMzgxIDY3OFE0NTYgNjc4IDUxNyA2NTJUNjM2IDU2N0w1NDcgNDc0UTUwOSA1MTYgNDcxIDUzNVQzODcgNTU1UTMwMCA1NTUgMjU0IDUwM1QyMDggMzM3UTIwOCAyMzIgMjUwIDE3MVQzODYgMTEwUTQzNCAxMTAgNDc2IDEzMFQ1NjEgMTkzTDY0MCA5Nkg2NDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJEIiBob3Jpei1hZHYteD0iNzA0IiBkPSJNNjQ4IDMzN1E2NDggMjUwIDYyNCAxODdUNTU2IDgyVDQ0NyAyMFQzMDMgMEg3M1Y2NjJRMTIyIDY2NyAxODIgNjcxVDMwNSA2NzVRMzgwIDY3NSA0NDMgNjU2VDU1MSA1OTVUNjIyIDQ5MFQ2NDggMzM3Wk00OTYgMzQwUTQ5NiAzODAgNDg5IDQxOVQ0NjIgNDkwVDQwNiA1NDFUMzA5IDU2MVEyODggNTYxIDI2NSA1NjBUMjE5IDU1N1YxMTdRMjQyIDExNiAyNTcgMTE2VDI5MSAxMTZRMzM5IDExNiAzNzcgMTI1VDQ0MSAxNjBUNDgyIDIyOVQ0OTYgMzQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRSIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTczIDBWNjY3SDUyOFY1NDVIMjE5VjQwNEg0OTlWMjgwSDIxOVYxMTlINTM4VjBINzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJGIiBob3Jpei1hZHYteD0iNTU1IiBkPSJNMjE5IDU0NVYzOThINDkwVjI3NUgyMTlWMEg3M1Y2NjdINTE5VjU0NUgyMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJHIiBob3Jpei1hZHYteD0iNzMyIiBkPSJNMzg4IDEwMFE0NTYgMTAwIDQ5NyAxMzJUNTM5IDIzNlYyNThIMzgxVjM3NUg2NzZWMzAzUTY3NiAyMjggNjYwIDE3MFQ2MDggNzFUNTE3IDExVDM4MyAtMTBRMzE1IC0xMCAyNTUgMTBUMTUxIDczVDgyIDE4MFQ1NiAzMzJRNTYgNDIxIDgyIDQ4NlQxNTMgNTk0VDI1NyA2NTdUMzgyIDY3OFE0MjkgNjc4IDQ2NyA2NjhUNTM1IDY0M1Q1ODkgNjEwVDYyOSA1NzVMNTQxIDQ4MlE1MDMgNTIwIDQ2NiA1MzdUMzg4IDU1NVEyOTMgNTU1IDI1MSA0OTlUMjA4IDMzM1EyMDggMjc5IDIxNyAyMzZUMjQ4IDE2M1QzMDQgMTE3VDM4OCAxMDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNDc1IDBWMjgzSDIxOVYwSDczVjY2N0gyMTlWNDIwSDQ3NVY2NjdINjIxVjBINDc1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSSIgaG9yaXotYWR2LXg9IjI5MiIgZD0iTTczIDBWNjY3SDIxOVYwSDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSiIgaG9yaXotYWR2LXg9IjQ5MCIgZD0iTTQxNyAyMjhRNDE3IDE3NiA0MTAgMTMyVDM4MCA1NlQzMjAgNVQyMTggLTEzUTE2MSAtMTMgMTE4IDJUMzEgNTNMOTYgMTYwUTEyNiAxMzEgMTUwIDEyMVQyMDQgMTExUTIzNiAxMTEgMjUzIDEzMFQyNzEgMTk3VjY2N0g0MTdWMjI4SDQxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI2NDQiIGQ9Ik00NTEgMEwyNzAgMjc5TDIxOSAyMjNWMEg3M1Y2NjdIMjE5VjM4OUgyMjNMNDI4IDY2N0g2MTJMMzgwIDM3Nkw2MzcgMEg0NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJMIiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzMgMFY2NjdIMjE5VjEyM0g1MDJWMEg3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI3OTkiIGQ9Ik01ODUgMFY0MjdINTgxTDM5OSAxNjlMMjE4IDQyNUgyMTRWMEg3M1Y2NjdIMjAwTDM5OSAzODNMNTk4IDY2N0g3MjZWMEg1ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iNzMxIiBkPSJNNTMyIDBMMjE5IDQyNUgyMTVWMEg3M1Y2NjdIMjA4TDUxMiAyNDlINTE3VjY2N0g2NThWMEg1MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJPIiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzE2IDMzNFE3MTYgMjQ1IDY5MiAxODBUNjI1IDczVDUyMSAxMVQzODYgLTEwUTMxMiAtMTAgMjUyIDEwVDE0OCA3M1Q4MCAxODBUNTYgMzM0UTU2IDQyMiA3OSA0ODdUMTQ2IDU5NFQyNTEgNjU3VDM4NiA2NzhRNDYxIDY3OCA1MjEgNjU4VDYyNSA1OTVUNjkyIDQ4N1Q3MTYgMzM0Wk01NjQgMzM0UTU2NCAzODggNTU2IDQzMFQ1MjYgNTAxVDQ3MSA1NDVUMzg2IDU2MFEzMzUgNTYwIDMwMSA1NDVUMjQ2IDUwMlQyMTcgNDMxVDIwOCAzMzRRMjA4IDI4MCAyMTYgMjM4VDI0NiAxNjdUMzAxIDEyM1QzODYgMTA4UTQzNyAxMDggNDcxIDEyM1Q1MjYgMTY3VDU1NSAyMzhUNTY0IDMzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik01OTIgNDYxUTU5MiA0MTEgNTc5IDM3MFQ1MzggMzAwVDQ2NCAyNTRUMzU0IDIzN0gyMTlWMEg3M1Y2NjJRMTE2IDY2NyAxODEgNjcxVDMxMSA2NzVRMzY2IDY3NSA0MTcgNjY2VDUwNyA2MzJUNTY5IDU2NlQ1OTIgNDYxWk00NDkgNDU3UTQ0OSA1MTQgNDE3IDUzNlQzMTIgNTU4UTI5MSA1NTggMjY5IDU1N1QyMTkgNTU0VjM1MUgzMjNRMzQ4IDM1MSAzNzEgMzUzVDQxMSAzNjZUNDM4IDM5OFQ0NDkgNDU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUSIgaG9yaXotYWR2LXg9Ijc3MiIgZD0iTTcxNiAzMzRRNzE2IDI1MSA2OTEgMTc5VDYwMCA1NFY1M1E2MjAgNDggNjMyIDQwVDY1NyAyNFQ2ODYgOVQ3MzAgLTJMNjgyIC0xMDNRNjQyIC0xMDIgNjA5IC04N1Q1NDYgLTU1VDQ5MSAtMjRUNDQxIC05UTQyOSAtOSA0MTkgLTEwVDM5NyAtMTJRMjI4IC0xMiAxNDIgNzZUNTYgMzM0UTU2IDQ5NyAxMzggNTg3VDM4NiA2NzhRNTUxIDY3OCA2MzMgNTg4VDcxNiAzMzRaTTU2NCAzMzRRNTY0IDM4MyA1NTcgNDI0VDUzMSA0OTZUNDc2IDU0MlQzODYgNTU5UTMzMCA1NTkgMjk2IDU0M1QyNDIgNDk2VDIxNSA0MjVUMjA4IDMzNFEyMDggMjg1IDIxNSAyNDRUMjQyIDE3MlQyOTcgMTI1VDM4NiAxMDhRNDQxIDEwOCA0NzUgMTI1VDUyOSAxNzJUNTU2IDI0M1Q1NjQgMzM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgaG9yaXotYWR2LXg9IjY0NSIgZD0iTTQ1OCAwTDM2NCAyMjhRMzU4IDI0MyAzNTEgMjQ4VDMyOCAyNTNIMjE5VjBINzNWNjYzUTE4NyA2NzUgMzA0IDY3NVEzNTUgNjc1IDQwNiA2NjdUNDk3IDYzN1Q1NjMgNTc1VDU4OCA0NzFRNTg4IDQwOCA1NjMgMzYyVDQ3NSAyODlWMjg4UTQ4NCAyODUgNDkwIDI3NVQ1MDAgMjU1TDYxMSAwSDQ1OFpNNDQ2IDQ2M1E0NDYgNDk1IDQzNSA1MTRUNDA0IDU0NFQzNjEgNTU4VDMxMCA1NjFRMjg2IDU2MSAyNjQgNTYwVDIxOSA1NTZWMzY3SDMyN1EzNTMgMzY3IDM3NSAzNzFUNDEyIDM4NVQ0MzcgNDE0VDQ0NiA0NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNTUzIDE5NVE1NTMgMTM4IDUzMyA5OVQ0NzkgMzVUMzk5IDFUMzAyIC0xMFEyMjQgLTEwIDE2MSA4VDMzIDcxTDk3IDE3NVExNDMgMTQ1IDE5MSAxMjVUMjk1IDEwNFEzMTUgMTA0IDMzNSAxMDdUMzcyIDExOFQzOTkgMTQyVDQxMCAxODJRNDEwIDIwNyAzOTQgMjIzVDM1MyAyNTFUMjk0IDI3MlQyMjYgMjk0UTE5MyAzMDUgMTYyIDMyMFQxMDcgMzU3VDY4IDQxMlQ1MyA0ODlRNTMgNTQzIDc0IDU3OFQxMzAgNjM2VDIwOSA2NjdUMjk5IDY3NlEzNjIgNjc2IDQxOCA2NjFUNTMwIDYxN0w0NzggNTA1UTQ0MCA1MjggMzk2IDU0M1QzMDkgNTU5UTI4NyA1NTkgMjY4IDU1N1QyMzMgNTQ3VDIwOSA1MjdUMjAwIDQ5NFEyMDAgNDczIDIxMSA0NTlUMjQxIDQzNVQyODcgNDE3VDM0NCA0MDFRMzgwIDM5MSA0MTcgMzc4VDQ4NSAzNDFUNTM0IDI4MlQ1NTMgMTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVCIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTM0NyA1NDNWMEgyMDFWNTQzSDE0VjY2N0g1MzVWNTQzSDM0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MjggMjY4UTYyOCAyMDIgNjE0IDE1MFQ1NjYgNjJUNDgwIDhUMzUwIC0xMVEyNzMgLTExIDIyMCA3VDEzNSA2MlQ4OCAxNTBUNzMgMjY4VjY2N0gyMTlWMjkwUTIxOSAyNTIgMjIyIDIyMFQyMzkgMTYzVDI3OCAxMjZUMzUwIDExMlEzOTYgMTEyIDQyMiAxMjVUNDYxIDE2M1Q0NzggMjE5VDQ4MiAyOTBWNjY3SDYyOFYyNjhINjI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iViIgaG9yaXotYWR2LXg9IjYzNiIgZD0iTTM5MyAwSDI0M0wxNSA2NjdIMTY5TDMxOCAxNzBIMzIyTDQ2OSA2NjdINjIxTDM5MyAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9IjEwMDUiIGQ9Ik03ODggMEg2MzJMNTAzIDQ3M0g0OThMMzY3IDBIMjA0TDIxIDY2N0gxODJMMjkxIDE3N0gyOTVMNDMxIDY2N0g1NzlMNzA4IDE3N0g3MTJMODI5IDY2N0g5ODRMNzg4IDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNNDY5IDBMMzI1IDIyNkgzMjFMMTgwIDBIMTBMMjQwIDM0N0wzNiA2NjdIMjA4TDMyNyA0NTdIMzMxTDQ1NiA2NjdINjI2TDQxNiAzMzhMNjM5IDBINDY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWSIgaG9yaXotYWR2LXg9IjY0NiIgZD0iTTM5NyAyNjJWMEgyNTFWMjU5TDIgNjY3SDE3MEwzMjUgMzkwTDQ4MyA2NjdINjQ0TDM5NyAyNjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJaIiBob3Jpei1hZHYteD0iNjA3IiBkPSJNNDMgMFYxMDdMMzY3IDU0M0g1OVY2NjdINTQ4VjU2MEwyMjAgMTE5SDU2NFYwSDQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTcxIC0xMjVWNzgzSDMxMVY3MDJIMTk0Vi00NUgzMTFWLTEyNUg3MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlwiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik00MDkgLTExNUwyOCA2NjdIMTU2TDUzNiAtMTE1SDQwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSIzNzAiIGQ9Ik01OSAtMTI1Vi00NUgxNzZWNzAySDU5Vjc4M0gyOTlWLTEyNUg1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI0MzMiIGQ9Ik0zNjYgNTIyTDIxMyA2MDFMNTcgNTIyTC00IDU5NEwyMTEgNzA1TDQyOSA1OTRMMzY2IDUyMloiICAvPgorPGdseXBoIHVuaWNvZGU9Il8iIGhvcml6LWFkdi14PSI0ODQiIGQ9Ik0tOCAtMTcxVi04NEg0OTJWLTE3MUgtOFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0yMTggNTY1TDIyIDY4M0wxNjMgNzQxTDMwMiA2MTBMMjE4IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImEiIGhvcml6LWFkdi14PSI1NjIiIGQ9Ik00NDYgLTEzUTQyMCAtNiA0MDAgN1QzNjggNDdIMzY2UTMyOSAxOCAyODkgM1QyMDAgLTEyUTE2NCAtMTIgMTM0IC0yVDgzIDI3VDQ5IDc0VDM2IDE0MVEzNiAyMDMgNjcgMjM5VDE0NiAyOTRUMjQ4IDMxOFQzNTAgMzIzVjM1NFEzNDkgMzg2IDMzMCAzOThUMjc1IDQxMVEyMjYgNDExIDE3OSAzOTdUOTIgMzU5TDQ4IDQ1M1ExMDcgNDgyIDE2NCA0OTdUMjg5IDUxM1EzNDQgNTEzIDM4MiA1MDJUNDQ1IDQ2N1Q0ODAgNDA0VDQ5MSAzMTFWMTM1UTQ5MSAxMTAgNTAzIDk3VDUzNSA3M0w0NDYgLTEzWk0zNTMgMjQ1UTMyOCAyNDUgMjk3IDI0M1QyMzkgMjMyVDE5MiAyMDRUMTczIDE1MVExNzMgMTE5IDE5MiAxMDFUMjQzIDgyUTI3NSA4MiAzMDEgOTJUMzUzIDEyMVYyNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTQ4IDI1NlE1NDggMjA1IDUzNyAxNTdUNTAwIDcyVDQzNSAxMlQzMzggLTExUTI4OCAtMTEgMjQ5IDhUMTkyIDc1SDE4OEwxNjcgMEg2M1Y3MDBIMjA0VjQ0N0gyMDhRMjI4IDQ4NiAyNjIgNDk5VDMzOCA1MTNRMzk0IDUxMyA0MzQgNDkyVDQ5OSA0MzZUNTM2IDM1NFQ1NDggMjU2Wk00MDUgMjU0UTQwNSAyODMgNDAyIDMxMFQzODggMzU5VDM1NiAzOTJUMzAwIDQwNVEyNTUgNDA1IDIyOSAzODVUMjAyIDMxNlYyMDZRMjAyIDE4MCAyMDYgMTU5VDIyMiAxMjNUMjUxIDEwMFQyOTggOTJRMzM0IDkyIDM1NSAxMDZUMzg3IDE0NFQ0MDEgMTk2VDQwNSAyNTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iNTE5IiBkPSJNNDM3IDM1MFE0MTAgMzc4IDM4MCAzOTFUMzEwIDQwNFEyNzUgNDA0IDI1MiAzOTJUMjEzIDM2MFQxOTIgMzEyVDE4NSAyNTNRMTg1IDIyMSAxOTEgMTkzVDIxMyAxNDNUMjUxIDExMFQzMTAgOTdRMzUwIDk3IDM4MyAxMDdUNDUxIDE0N0w0OTYgNTRRNDUxIDIyIDQwNSA1VDMwMSAtMTJRMTgwIC0xMiAxMTEgNTZUNDIgMjQ2UTQyIDMwOCA2MCAzNTdUMTEyIDQ0MVQxOTQgNDk0VDMwNSA1MTNRMzU2IDUxMyA0MDYgNDk0VDQ5OCA0NDFMNDM3IDM1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik00MTEgMEw0MDIgNjdIMzk4UTM3NiAyNiAzMzcgOFQyNTIgLTExUTE5NSAtMTEgMTU1IDExVDkwIDcxVDU0IDE1NlQ0MiAyNTZRNDIgMzA3IDUzIDM1M1Q5MCA0MzVUMTU1IDQ5MlQyNTIgNTEzUTI5MSA1MTMgMzI0IDUwMVQzODIgNDU1SDM4NlY3MDBINTI3VjBINDExWk0zODggMzE2UTM4OCAzNjQgMzYyIDM4NFQyOTAgNDA1UTI1NCA0MDUgMjM0IDM5M1QyMDIgMzU5VDE4OCAzMTFUMTg1IDI1NFExODUgMjI1IDE4OCAxOTdUMjAzIDE0NVQyMzUgMTA3VDI5MiA5MlEzNDggOTIgMzY4IDEyM1QzODggMjA2VjMxNloiICAvPgorPGdseXBoIHVuaWNvZGU9ImUiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01MzIgMjQ3UTUzMiAyNDIgNTMyIDIzMFQ1MzAgMjA2SDE4MVExODEgMTUyIDIxMyAxMjRUMzExIDk1UTM1MiA5NSAzODYgMTA1VDQ2MCAxMzdMNTA1IDQzUTQ1NiAxNCA0MDggMlQzMDQgLTExUTIzOSAtMTEgMTkwIDdUMTA4IDYwVDU5IDE0M1Q0MiAyNTBRNDIgMzIyIDY0IDM3MlQxMjEgNDU0VDIwMiA1MDBUMjk0IDUxNFEzNTAgNTE0IDM5NCA0OTVUNDY5IDQ0MVQ1MTYgMzU3VDUzMiAyNDdaTTQwNCAyOTVRNDA0IDM0NiAzNzggMzgwVDI5NiA0MTRRMjY2IDQxNCAyNDUgNDA1VDIwOSAzNzlUMTg5IDM0MVQxODIgMjk1SDQwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImYiIGhvcml6LWFkdi14PSIzNjUiIGQ9Ik0zNTYgNTk4UTM0MyA2MDAgMzMxIDYwMVQzMDEgNjAyUTI1OSA2MDIgMjQ3IDU5MFQyMzUgNTQ2VjUwMkgzNDZWMzkxSDI0MFYwSDk3VjM4OUgyMFY1MDJIOTdWNTYzUTk3IDYwMSAxMDQgNjI4VDEzMiA2NzJUMTg3IDY5N1QyNzYgNzA1UTI5NCA3MDUgMzE0IDcwNFQzNTYgNzAwVjU5OEgzNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTI3IDhRNTI3IC02NCA1MTIgLTExMFQ0NjYgLTE4MVQzOTQgLTIxNlQyOTcgLTIyNlEyMzQgLTIyNiAxODEgLTIxM1Q3NCAtMTcwTDExNSAtNjZRMTU5IC05MiAyMDAgLTEwNVQyOTMgLTExOVEzNDMgLTExOSAzNjUgLTEwMVQzODcgLTI5VjcxSDM4M1EzNTcgMzIgMzI5IDE4VDI1NSAzUTE5OSAzIDE1OSAyM1Q5MiA3N1Q1NCAxNTdUNDIgMjU2UTQyIDMwNyA1MyAzNTRUOTAgNDM2VDE1NSA0OTJUMjUyIDUxM1EzMDAgNTEzIDMzNiA0OThUMzk5IDQ0MUg0MDFMNDA4IDUwMkg1MjdWOFpNMzg4IDMxMlEzODggMzYxIDM2MyAzODNUMjkwIDQwNVEyNTcgNDA1IDIzNyAzOTNUMjA1IDM2MFQxODkgMzE0VDE4NSAyNjBRMTg1IDIzMiAxODkgMjA1VDIwNSAxNTdUMjM3IDEyMlQyOTAgMTA5UTMxOSAxMDkgMzM4IDExN1QzNjggMTQxVDM4MyAxNzdUMzg4IDIyNVYzMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBWMjgxUTM4OSAzMDYgMzg3IDMyN1QzNzUgMzYzVDM0OSAzODZUMzAzIDM5NVEyMDQgMzk1IDIwNCAzMDBWMEg2M1Y3MDBIMjA0VjQ1M0gyMDVRMjMwIDQ4NyAyNjYgNTAwVDM0NyA1MTNRMzk4IDUxMyA0MzMgNDk5VDQ4OSA0NTdUNTIwIDM5MFQ1MzAgMzAzVjBIMzg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaSIgaG9yaXotYWR2LXg9IjI2NyIgZD0iTTYzIDBWNTAySDIwNFYwSDYzWk0yMTggNjMzUTIxOCA2MDEgMTk1IDU4M1QxMzMgNTY0UTk1IDU2NCA3MiA1ODJUNDkgNjMzUTQ5IDY2NSA3MiA2ODRUMTMzIDcwM1ExNzEgNzAzIDE5NCA2ODRUMjE4IDYzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSIyNzQiIGQ9Ik0yMjQgNjMzUTIyNCA2MTUgMjE3IDYwMlQxOTggNTgxVDE3MSA1NjhUMTM5IDU2NFExMjMgNTY0IDEwOCA1NjhUODEgNTgwVDYyIDYwMlQ1NSA2MzNRNTUgNjUxIDYyIDY2NFQ4MSA2ODZUMTA4IDY5OVQxMzkgNzAzUTE1NSA3MDMgMTcwIDY5OVQxOTggNjg3VDIxNyA2NjVUMjI0IDYzM1pNMjExIC0xN1EyMTEgLTEyMyAxNjEgLTE3NFQ1IC0yMjZRLTE3IC0yMjYgLTM3IC0yMjVULTc4IC0yMjFWLTEwM1EtNDUgLTEwNiAtMTIgLTEwNlExNyAtMTA2IDMzIC0xMDBUNTggLTgwVDY4IC00N1Q3MCAwVjUwMkgyMTFWLTE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iayIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTM4MCAwTDI1MiAyMTRMMjA0IDE2MlYwSDYzVjcwMEgyMDRWMzE0SDIwOEwzNjMgNTAySDUzOEwzNTQgMzAxTDU1MSAwSDM4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImwiIGhvcml6LWFkdi14PSIzMTYiIGQ9Ik0yODggMFEyNTAgLTYgMTg2IC02UTExNiAtNiA5MCAyMFQ2MyAxMDlWNzAwSDIwNFYxNDJRMjA0IDExOSAyMTEgMTE0VDIzOSAxMDlIMjg4VjBIMjg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgaG9yaXotYWR2LXg9Ijg3NiIgZD0iTTY3MiAwVjI4N1E2NzIgMzEyIDY2OSAzMzJUNjU4IDM2NlQ2MzQgMzg3VDU5NiAzOTVRNTYxIDM5NSA1MzUgMzc3VDUwOCAzMTNWMEgzNjdWMjg4UTM2NyAzMTMgMzY0IDMzM1QzNTMgMzY2VDMzMCAzODdUMjkwIDM5NVEyNTUgMzk1IDIzMCAzNzRUMjA0IDMxMlYwSDYzVjUwMkgxODhMMTk4IDQ0MUgyMDBRMjEzIDQ2OCAyNDMgNDkwVDMzMCA1MTNRMzc4IDUxMyA0MTIgNDk2VDQ2NiA0MzlRNDk1IDQ4MSA1MzEgNDk3VDYxOSA1MTNRNzE4IDUxMyA3NjUgNDYwVDgxMyAzMDJWMEg2NzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJuIiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBWMjgxUTM4OSAzMDYgMzg2IDMyN1QzNzQgMzYzVDM0OCAzODZUMzAyIDM5NVEyMDQgMzk1IDIwNCAzMDBWMEg2M1Y1MDJIMTg1TDE5NCA0NDJIMTk2UTIyNCA0ODIgMjYwIDQ5N1QzNDYgNTEzUTM5OCA1MTMgNDMzIDQ5OVQ0ODkgNDU3VDUyMCAzOTBUNTMwIDMwM1YwSDM4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9Im8iIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik00MiAyNTFRNDIgMzA2IDU2IDM1M1QxMDIgNDM2VDE4MiA0OTJUMzAwIDUxM1E0MjggNTEzIDQ5MyA0NDRUNTU5IDI1MVE1NTkgMTkzIDU0MyAxNDVUNDk1IDYyVDQxNSA4VDMwMCAtMTFRMjM1IC0xMSAxODcgOFQxMDYgNjFUNTggMTQ0VDQyIDI1MVpNMTg1IDI1MVExODUgMTc2IDIxMCAxMzZUMzAxIDk1UTM2NSA5NSAzOTAgMTM1VDQxNiAyNTFRNDE2IDMyNSAzOTEgMzY0VDMwMSA0MDNRMjM2IDQwMyAyMTEgMzY0VDE4NSAyNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJwIiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTQ4IDI1NlE1NDggMjAyIDUzNyAxNTRUNDk5IDY5VDQzMiAxMVQzMzEgLTExUTMwOCAtMTEgMjkwIC04VDI1OCAyVDIzMSAyMlQyMDYgNTNMMjA0IDU0Vi0yMjBINjNWNTAySDE4MUwxOTAgNDQySDE5MlEyMTkgNDgxIDI1MyA0OTdUMzM2IDUxM1EzOTQgNTEzIDQzNCA0OTJUNDk5IDQzNlQ1MzYgMzU0VDU0OCAyNTZaTTQwNSAyNTRRNDA1IDI4NCA0MDIgMzExVDM4OCAzNTlUMzU2IDM5MlQyOTkgNDA1UTI1NCA0MDUgMjI4IDM4NVQyMDIgMzE2VjIwNlEyMDIgMTgwIDIwNiAxNTlUMjIyIDEyM1QyNTEgMTAwVDI5NyA5MlEzMzMgOTIgMzU0IDEwNlQzODYgMTQ0VDQwMSAxOTZUNDA1IDI1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9InEiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik00ODYgLTIzOFE0NTggLTIyOCA0MzkgLTIxNVQ0MDkgLTE4NFQzOTIgLTE0M1QzODcgLTg4VjU0SDM4NFEzNjEgMTYgMzI5IDNUMjU0IC0xMVExOTYgLTExIDE1NiAxMVQ5MCA3MVQ1NCAxNTZUNDIgMjU2UTQyIDMwNyA1MyAzNTRUOTAgNDM2VDE1NSA0OTJUMjUyIDUxM1EyOTYgNTEzIDMzNSA0OTlUMzk4IDQ0Mkg0MDBMNDA4IDUwMkg1MjdWLTY3UTUyNyAtOTcgNTM2IC0xMTNUNTczIC0xNDRMNDg2IC0yMzhaTTM4OCAzMTZRMzg4IDM2NCAzNjMgMzg0VDI5MCA0MDVRMjU0IDQwNSAyMzMgMzkzVDIwMiAzNTlUMTg4IDMxMVQxODUgMjUzUTE4NSAyMjQgMTg4IDE5NlQyMDMgMTQ0VDIzNiAxMDdUMjkyIDkyUTM0OCA5MiAzNjggMTIzVDM4OCAyMDZWMzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iciIgaG9yaXotYWR2LXg9IjQwNCIgZD0iTTM0NSAzODhRMzE0IDM4OCAyODggMzg1VDI0NCAzNzJUMjE1IDM0MVQyMDQgMjg3VjBINjNWNTAySDE4NEwxOTUgNDM1SDE5OVEyMjAgNDczIDI1MiA0OTJUMzQzIDUxMkgzNzhWMzg4SDM0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9InMiIGhvcml6LWFkdi14PSI0OTIiIGQ9Ik00NTcgMTUxUTQ1NyA2NyA0MDMgMjhUMjUwIC0xMVExMzEgLTExIDI2IDUwTDc1IDE0NlExMTcgMTIzIDE2MSAxMDhUMjQ5IDkyUTI4NSA5MiAzMDUgMTA0VDMyNSAxNDVRMzI1IDE2MCAzMTcgMTY4VDI5NSAxODNUMjYyIDE5MlQyMjIgMjAxUTE4OSAyMDggMTU3IDIxOFQ5OSAyNDdUNTkgMjk0VDQzIDM2NFE0MyAzOTUgNTUgNDIyVDkzIDQ2OVQxNTggNTAxVDI1MCA1MTNRMjk5IDUxMyAzNDYgNTAzVDQzOSA0NzBMNDAyIDM3MFEzNzAgMzg3IDMzMiAzOTdUMjYxIDQwOFEyMjUgNDA4IDIwMCAzOThUMTc1IDM2MlExNzUgMzQ4IDE4NCAzNDBUMjA5IDMyNlQyNDYgMzE2VDI5MCAzMDdRMzIwIDMwMSAzNDkgMjkxVDQwMyAyNjRUNDQyIDIyMFQ0NTcgMTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idCIgaG9yaXotYWR2LXg9IjM5MSIgZD0iTTM1MyAtMlEzMjQgLTYgMzA1IC03VDI2NiAtOVEyMTUgLTkgMTgyIC0xVDEzMCAyNVQxMDMgNzJUOTYgMTQ1TDk3IDM4OUgxNVY1MDJIOThWNjM1SDIzN1Y1MDJIMzUzVjM4OUgyMzdWMTY0UTIzNyAxNDYgMjM5IDEzNVQyNDkgMTE3VDI3NiAxMDlUMzI3IDEwN1EzMzUgMTA3IDMzOSAxMDdUMzUzIDEwOFYtMkgzNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ1IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBIMzk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idiIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTM1MiAwSDE5MkwxMSA1MDJIMTYxTDI3MiAxMzBIMjc3TDM4NyA1MDJINTMyTDM1MiAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9Ijc5NiIgZD0iTTYyNyAwSDQ5M0wzOTggMjk4SDM5NEwzMDMgMEgxNjZMMTYgNTAySDE2M0wyNDIgMTUwSDI0NkwzNDIgNTAySDQ1Mkw1NTEgMTQ5SDU1NUw2MzggNTAySDc4MEw2MjcgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IngiIGhvcml6LWFkdi14PSI1NDIiIGQ9Ik0zNzMgMEwyNzEgMTc0SDI2N0wxNjggMEg2TDE4NSAyNjRMMjcgNTAySDE4NkwyNzUgMzQ4SDI3OUwzNjkgNTAySDUxNkwzNTYgMjY3TDUzNiAwSDM3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0zMzUgLTIxUTMxMCAtODMgMjkwIC0xMjNUMjQ3IC0xODZUMTkyIC0yMTdUMTE1IC0yMjZRMTAxIC0yMjYgODMgLTIyNVQ0MCAtMjIxVi0xMDRRNDcgLTEwNiA2MCAtMTA2VDk2IC0xMDdRMTE2IC0xMDcgMTI4IC0xMDRUMTUwIC05NFQxNjUgLTc2VDE3OSAtNDdMMjAzIDExTDcgNTAySDE2MEwyNzQgMTU0SDI3OEwzOTEgNTAySDU0MkwzMzUgLTIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieiIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTM0IDBWOTVMMjY3IDM4OUgzN1Y1MDJINDM5VjQwMUwyMTAgMTEySDQ0OFYwSDM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieyIgaG9yaXotYWR2LXg9IjQxMyIgZD0iTTI3MCAtMTI1UTIzMCAtMTI1IDIwMiAtMTE5VDE1NiAtOTZUMTMwIC01M1QxMjEgMTVWMTkwUTEyMSAyMjIgMTEyIDI0NFQ2NyAyNzVWMzY5UTEwMiAzNzYgMTExIDM5OVQxMjEgNDU0VjY0NlExMjEgNjg2IDEyOSA3MTNUMTU2IDc1NlQyMDIgNzc5VDI2OSA3ODZIMzQ0VjcwMkgzMDlRMjg0IDcwMiAyNzEgNjk4VDI1MiA2ODNUMjQ2IDY1N1QyNDUgNjE4VjQzMFEyNDUgMzkxIDIzMCAzNjlUMTgzIDMyMlExOTkgMzEwIDIxMSAyOTlUMjMwIDI3NlQyNDEgMjQ5VDI0NSAyMTRWNDJRMjQ1IDE4IDI0NiAyVDI1MyAtMjRUMjcyIC0zOFQzMDkgLTQySDM0NFYtMTI1SDI3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9InwiIGhvcml6LWFkdi14PSIyODciIGQ9Ik05MiAtMjIwVjc0MEgxOTVWLTIyMEg5MloiICAvPgorPGdseXBoIHVuaWNvZGU9In0iIGhvcml6LWFkdi14PSI0MTMiIGQ9Ik0zNDYgMjc1UTMxMCAyNjcgMzAxIDI0NVQyOTIgMTkwVjE1UTI5MiAtMjYgMjg0IC01MlQyNTcgLTk1VDIxMSAtMTE4VDE0NCAtMTI1SDY5Vi00MkgxMDVRMTI5IC00MiAxNDIgLTM4VDE2MSAtMjRUMTY4IDJUMTY5IDQyVjIxNFExNjkgMjM0IDE3MiAyNDlUMTgzIDI3NlQyMDEgMjk5VDIyOSAzMjJRMTk3IDM0NyAxODMgMzY5VDE2OSA0MzBWNjE4UTE2OSA2NDEgMTY4IDY1N1QxNjEgNjgzVDE0MiA2OTdUMTA1IDcwMkg2OVY3ODZIMTQ0UTE4MyA3ODYgMjExIDc3OVQyNTcgNzU2VDI4MyA3MTNUMjkyIDY0NlY0NTRRMjkyIDQyMiAzMDEgMzk5VDM0NiAzNjlWMjc1SDM0NloiICAvPgorPGdseXBoIHVuaWNvZGU9In4iIGhvcml6LWFkdi14PSI0NzgiIGQ9Ik00NzEgNjIzUTQ1MiA1NzggNDE3IDU1NlQzMzYgNTM0UTMwOSA1MzQgMjg1IDU0MFQyMzkgNTU1VDE5NCA1NzBUMTUwIDU3N1ExMjggNTc3IDExMyA1NjlUODMgNTMzTDIgNTY5UTE1IDU5NCAyOCA2MTBUNTcgNjM3VDkxIDY1MlQxMzMgNjU3UTE1OSA2NTcgMTgzIDY1MFQyMzAgNjM1VDI3NiA2MjBUMzE5IDYxM1EzNDAgNjEzIDM1NiA2MjJUMzg0IDY1Nkw0NzEgNjIzSDQ3MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEwOyIgaG9yaXotYWR2LXg9IjMyMCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMTsiIGhvcml6LWFkdi14PSIyOTkiIGQ9Ik03MSAtMTY0UTc2IC00NCA4MiA3NFQ5MSAzMTJIMjA3UTIxMCAxOTIgMjE1IDc0VDIyNiAtMTY0SDcxWk01NyA0NDJRNTcgNDc0IDgzIDQ5NFQxNDkgNTE1UTE4OSA1MTUgMjE1IDQ5NVQyNDIgNDQyUTI0MiA0MTIgMjE2IDM5MlQxNTAgMzcxUTExMCAzNzEgODQgMzkxVDU3IDQ0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEyOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTUzOCAxNTlRNTA1IDEyNyA0NzEgMTA3VDM5NiA3OVYwSDI2NVY3OFEyMTkgODcgMTg0IDEwOVQxMjQgMTY1VDg4IDI0MlQ3NSAzMzdRNzUgNDM5IDEyMyA1MDVUMjY1IDU5MFY2NjdIMzk2VjU5MFE0MzEgNTg0IDQ2NCA1NjlUNTMxIDUyN0w0NzAgNDMzUTQzOCA0NjIgNDA5IDQ3NFQzNDIgNDg3UTI3NyA0ODcgMjQ3IDQ0OFQyMTcgMzQzUTIxNyAyNjggMjQ2IDIyNVQzNDEgMTgxUTM1NiAxODEgMzcxIDE4M1Q0MDIgMTkxVDQzNyAyMTBUNDc3IDI0M0w1MzggMTU5SDUzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEzOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTU1OCAwSDU1VjEwOUg4M1ExMjcgMTA5IDE0OSAxMzZUMTcyIDIxNFExNzIgMjM0IDE3MCAyNTdUMTY0IDMwMkg2NVY0MTFIMTUxUTE0NCA0NDIgMTM5IDQ2OFQxMzQgNTIzUTEzNCA2MDEgMTg3IDYzOVQzNDAgNjc4UTQ0OSA2NzggNTQwIDYzNEw1MTQgNTEzUTQ4MyA1MzMgNDQ5IDU0NlQzNjYgNTYwUTMxMyA1NjAgMjk0IDU0MlQyNzQgNDg5UTI3NCA0NzUgMjc3IDQ1N1QyODUgNDExSDQ0M1YzMDJIMzA1UTMxNyAyNDYgMzE3IDIwOFEzMTcgMTUzIDI4OSAxMjJWMTE5SDU1OFYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNODcgMzQ5UTg4IDM3OCA5NyA0MDVUMTIxIDQ1NUw0MSA1MzVMMTEzIDYwN0wxOTUgNTI1UTIyMCA1MzkgMjQ3IDU0NlQzMDQgNTU0UTMzNCA1NTQgMzYyIDU0NlQ0MTUgNTIzTDQ5OSA2MDdMNTcxIDUzNUw0ODkgNDUyUTUyMiA0MDIgNTIyIDM0MVE1MjIgMzEwIDUxNCAyODJUNDkwIDIzMEw1NzEgMTQ5TDQ5OSA3Nkw0MTcgMTU4UTM5MiAxNDMgMzY0IDEzNVQzMDQgMTI2UTI3NCAxMjYgMjQ2IDEzNFQxOTMgMTU3TDExMyA3N0w0MSAxNDlMMTE5IDIyOFExMDQgMjUxIDk2IDI4MFQ4NyAzNDFWMzQ5Wk0yMDYgMzQxUTIwNiAzMjEgMjEzIDMwM1QyMzQgMjcyVDI2NiAyNTBUMzA1IDI0MlEzMjYgMjQyIDM0NCAyNTBUMzc1IDI3MVQzOTYgMzAzVDQwNCAzNDFRNDA0IDM4MyAzNzYgNDEyVDMwNSA0NDFRMjYzIDQ0MSAyMzUgNDEyVDIwNiAzNDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik00NjQgMzk4SDU3MlYzMTBINDEwTDM4MyAyNjZWMjA2SDU3MlYxMThIMzgzVjBIMjQwVjExOEg0NFYyMDZIMjQwVjI1OUwyMDggMzEwSDQ0VjM5OEgxNTJMMTQgNjY3SDE4MkwzMTMgMzg1TDQ0MiA2NjdINTk5TDQ2NCAzOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNjsiIGhvcml6LWFkdi14PSIyODciIGQ9Ik05MiAzNjBWNzQwSDE5NVYzNjBIOTJaTTkyIC0yMjBWMTYwSDE5NVYtMjIwSDkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTc7IiBob3Jpei1hZHYteD0iNDk2IiBkPSJNNDU4IDMyMlE0NTggMjczIDQzMCAyNDNUMzM4IDIwMVYxOThRMzkyIDE4NSA0MjMgMTUwVDQ1NCA2NFE0NTQgMzcgNDQ0IDExVDQwOSAtMzdUMzQ0IC03MVQyNDUgLTg0UTE4MiAtODQgMTMzIC03MFQyOSAtMjNMNzcgNzVRMTczIDE4IDI0NCAxOFEyODAgMTggMjk1IDI5VDMxMSA2MVEzMTEgNzcgMzAwIDg4VDI1NSAxMTJRMjE4IDEyNCAxODQgMTM3VDEyNSAxNjNRNzcgMTg3IDU2IDIxNFQzNCAyODNRMzQgMzM2IDY4IDM2NFQxNjIgNDAxVjQwNFExMDYgNDIwIDc0IDQ1M1Q0MSA1MzJRNDEgNTYzIDUzIDU5MFQ5MSA2MzZUMTU0IDY2N1QyNDMgNjc4UTI5OSA2NzggMzQ1IDY2OFQ0MzkgNjM3TDQwMCA1MzBRMzYyIDU1MiAzMjggNTYyVDI1NiA1NzNRMjI0IDU3MyAyMDQgNTY2VDE4MyA1MzZRMTgzIDUyMSAxOTUgNTEwVDI0NSA0ODVRMjk1IDQ2OSAzMjUgNDU4VDM4MiA0MzRRNDE5IDQxNSA0MzggMzg5VDQ1OCAzMjJaTTMzMyAyOTFRMzMzIDMxNCAzMTQgMzI4VDI0NiAzNDNRMjA2IDM0MyAxODIgMzMzVDE1OCAyOTFRMTU4IDI3MSAxNzYgMjU1VDI0NiAyMzlRMzMzIDIzOSAzMzMgMjkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTg7IiBob3Jpei1hZHYteD0iMzQ4IiBkPSJNMzU1IDYzOVEzNTUgNjEwIDMzNSA1OTBUMjg2IDU2OVEyNTcgNTY5IDIzNyA1ODlUMjE2IDYzOVEyMTYgNjY4IDIzNiA2ODhUMjg2IDcwOFEzMTUgNzA4IDMzNSA2ODhUMzU1IDYzOVpNMTMyIDYzOVExMzIgNjEwIDExMiA1OTBUNjMgNTY5UTM0IDU2OSAxNCA1ODlULTYgNjM5US02IDY2OCAxNCA2ODhUNjMgNzA4UTkyIDcwOCAxMTIgNjg4VDEzMiA2MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBOTsiIGhvcml6LWFkdi14PSI3OTUiIGQ9Ik03NDMgMzM0UTc0MyAyNjIgNzE2IDIwMFQ2NDIgOTBUNTMzIDE2VDM5OCAtMTFRMzI2IC0xMSAyNjMgMTZUMTUzIDkwVDc5IDE5OVQ1MiAzMzRRNTIgNDA2IDc5IDQ2OFQxNTMgNTc4VDI2MyA2NTJUMzk4IDY3OVE0NzAgNjc5IDUzMiA2NTJUNjQyIDU3OFQ3MTYgNDY5VDc0MyAzMzRaTTY5OCAzMzVRNjk4IDM5NyA2NzUgNDUxVDYxMSA1NDdUNTE2IDYxMVQzOTggNjM1UTMzNiA2MzUgMjgyIDYxMlQxODcgNTQ3VDEyMyA0NTJUOTkgMzM1UTk5IDI3MyAxMjIgMjE5VDE4NyAxMjVUMjgyIDYxVDM5OCAzN1E0NjAgMzcgNTE0IDYwVDYxMCAxMjRUNjc0IDIxOVQ2OTggMzM1Wk01NzIgMTg3UTUzNyAxNTQgNDk4IDEzN1Q0MTEgMTE5UTM1NSAxMTkgMzE1IDEzNlQyNTAgMTgzVDIxNCAyNTJUMjAyIDMzN1EyMDIgNDM1IDI1NSA0OTJUNDA5IDU0OVE0NTcgNTQ5IDQ5NiA1MzJUNTcxIDQ3OUw1MTUgNDE4UTQ3MCA0NzEgNDEzIDQ3MVEzNTEgNDcxIDMyNCA0MzZUMjk3IDMzN1EyOTcgMjcwIDMyNCAyMzRUNDEyIDE5OFE0NDQgMTk4IDQ3MCAyMTFUNTIzIDI1MEw1NzIgMTg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUE7IiBob3Jpei1hZHYteD0iNDE1IiBkPSJNMzAwIDM3MVEyNjMgMzc4IDI1MiA0MDZIMjUwUTIwNiAzNzEgMTUxIDM3MVExMDUgMzcxIDc5IDM5NVQ1MiA0NjRRNTIgNTI0IDEwMSA1NDlUMjQxIDU3NFY1ODJRMjQxIDYwMSAyMzUgNjEwVDE5NyA2MTlRMTc2IDYxOSAxNDcgNjEzVDg2IDU5MEw1OCA2NTBROTYgNjY5IDEzMSA2NzdUMjA1IDY4NlEyNDIgNjg2IDI2NSA2NzlUMzAyIDY1NlQzMjEgNjE2VDMyNyA1NTlWNDYzUTMyNyA0NDkgMzMyIDQ0MlQzNTUgNDI0TDMwMCAzNzFaTTI0MSA1MjRRMTgyIDUyNCAxNjAgNTEwVDEzNyA0NjdRMTM3IDQ0OSAxNDcgNDM4VDE3NiA0MjdRMTkxIDQyNyAyMDUgNDMyVDI0MSA0NTJWNTI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUI7IiBob3Jpei1hZHYteD0iNDk5IiBkPSJNMzY4IDk3TDI0NCAzMDBMMzY4IDUwMkw0NjMgNDU1TDM2MyAyOTlMNDYzIDE0NEwzNjggOTdaTTE0NiA4NUwxNCAzMDBMMTQ0IDUxM0wyMzkgNDY2TDEzMyAyOTlMMjQxIDEzM0wxNDYgODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQzsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik00NTEgMjExSDQ1VjMyOUg1NjhWMzRINDUxVjIxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFFOyIgaG9yaXotYWR2LXg9IjQ1MSIgZD0iTTIyNSAzNjJRMTg5IDM2MiAxNTggMzc1VDEwMyA0MTFUNjYgNDY1VDUyIDUzMVE1MiA1NjYgNjUgNTk3VDEwMiA2NTFUMTU3IDY4N1QyMjUgNzAwUTI2MSA3MDAgMjkyIDY4N1QzNDggNjUxVDM4NSA1OTdUMzk5IDUzMVEzOTkgNDk2IDM4NiA0NjVUMzQ4IDQxMVQyOTMgMzc1VDIyNSAzNjJaTTIyNiA2NzdRMTk1IDY3NyAxNjggNjY2VDEyMSA2MzRUODkgNTg4VDc3IDUzMlE3NyA1MDIgODggNDc2VDEyMCA0MzBUMTY4IDM5OVQyMjYgMzg3UTI1NiAzODcgMjgzIDM5OFQzMzEgNDI5VDM2MyA0NzVUMzc1IDUzMlEzNzUgNTYyIDM2MyA1ODhUMzMxIDYzNFQyODQgNjY1VDIyNiA2NzdaTTE1NCA2MjdRMTcyIDYyOSAxOTAgNjI5VDIyNSA2MjlRMjQwIDYyOSAyNTUgNjI3VDI4MiA2MThUMzAxIDU5OVQzMDggNTY4UTMwOCA1MzUgMjc5IDUxOUwzMTMgNDM5SDI1OUwyMzQgNTAzUTIzMiA1MDUgMjMyIDUwNlQyMjggNTA3SDIwM1Y0MzlIMTU0VjYyN1pNMjI1IDU5MlEyMTggNTkyIDIxMiA1OTJUMjAyIDU5MVY1NDJIMjI5UTI0NiA1NDIgMjUyIDU0OFQyNTkgNTY2UTI1OSA1NzkgMjUyIDU4NVQyMjUgNTkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUY7IiBob3Jpei1hZHYteD0iMzQ4IiBkPSJNMTIgNTg3VjY3NEgzMzVWNTg3SDEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjA7IiBob3Jpei1hZHYteD0iNDEzIiBkPSJNMzYxIDUzMlEzNjEgNTAwIDM0OSA0NzJUMzE2IDQyMlQyNjcgMzg5VDIwNyAzNzdRMTc1IDM3NyAxNDcgMzg5VDk4IDQyMlQ2NSA0NzFUNTIgNTMyUTUyIDU2NCA2NCA1OTJUOTggNjQxVDE0NyA2NzRUMjA3IDY4NlEyMzkgNjg2IDI2NyA2NzRUMzE2IDY0MVQzNDkgNTkyVDM2MSA1MzJaTTMxNyA1MzJRMzE3IDU1NCAzMDkgNTc0VDI4NSA2MDlUMjUwIDYzMlQyMDcgNjQxUTE4NCA2NDEgMTY0IDYzM1QxMjkgNjA5VDEwNiA1NzRUOTcgNTMyUTk3IDUwOSAxMDUgNDg5VDEyOSA0NTRUMTY0IDQzMVQyMDcgNDIyUTIzMCA0MjIgMjUwIDQzMFQyODUgNDU0VDMwOCA0ODlUMzE3IDUzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIxOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTM2OCAzMjNWMTU3SDI0N1YzMjNINDVWNDQwSDI0N1Y2MjNIMzY4VjQ0MEg1NjhWMzIzSDM2OFpNNDUgMFYxMTJINTY4VjBINDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMjsiIGhvcml6LWFkdi14PSIzMjYiIGQ9Ik0zOCAzNjZMMjUgNDM5UTY0IDQ2NyA5NSA0ODhUMTQ5IDUyNlQxODQgNTU4VDE5NyA1OTBRMTk3IDYwNCAxODggNjE0VDE1OSA2MjVRMTM0IDYyNSAxMTYgNjE3VDc4IDU4N0wyOCA2NDNRNjMgNjc0IDk1IDY4N1QxNjggNzAwUTIyNSA3MDAgMjU2IDY3NFQyODggNjAxUTI4OCA1ODEgMjgxIDU2MlQyNTYgNTI0VDIwOCA0ODNUMTMyIDQzOEgyOTJWMzY2SDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjM7IiBob3Jpei1hZHYteD0iMzE5IiBkPSJNMjg1IDQ2M1EyODUgNDEyIDI1MyAzODdUMTUzIDM2MVExMTggMzYxIDg1IDM3MFQyMCA0MDRMNTcgNDY0UTgyIDQ0NCAxMDIgNDM3VDE0MyA0MjlRMTcxIDQyOSAxODUgNDQwVDE5OSA0NjhRMTk5IDQ4OCAxODcgNDk1VDE1NSA1MDJIMTAyVjU2MkgxMzZRMTU5IDU2MiAxNzMgNTcxVDE4OCA1OThRMTg4IDYxMSAxNzkgNjIwVDE0OSA2MzBRMTI2IDYzMCAxMDQgNjIxVDY1IDU5NUwyNCA2NTRRNTkgNjgwIDg5IDY5MFQxNTkgNzAwUTIxMyA3MDAgMjQ0IDY3N1QyNzYgNjAyUTI3NiA1ODEgMjY0IDU2NVQyMzUgNTQwVjUzOVEyNTkgNTMyIDI3MiA1MTJUMjg1IDQ2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTEzMCA1NjVMNDYgNjEwTDE4NSA3NDJMMzI2IDY4M0wxMzAgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjU7IiBob3Jpei1hZHYteD0iNjA0IiBkPSJNNDA0IDBMMzk1IDU4SDM5MlEzODEgNDEgMzcwIDI4VDM0NiA2VDMxNCAtN1QyNjkgLTEyUTI2NCAtMTIgMjU0IC0xMVQyMzMgLTdUMjExIDNUMTk0IDIxVi0yMjBINjlWNTAySDIxMVYyMzlRMjExIDIxMCAyMTIgMTg2VDIyMCAxNDRUMjQ1IDExNlQyOTQgMTA2UTMyMiAxMDYgMzQwIDExM1QzNjggMTMyVDM4MSAxNjRUMzg1IDIwN1Y1MDJINTI3VjBINDA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjY7IiBob3Jpei1hZHYteD0iNTM2IiBkPSJNMzM1IDBRMjYzIDAgMjA4IDE5VDExNiA3M1Q2MSAxNTNUNDIgMjUyUTQyIDMwNCA2MCAzNDlUMTE2IDQyOVQyMDggNDgyVDMzNSA1MDJINDYzVjBIMzM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjc7IiBob3Jpei1hZHYteD0iMjU5IiBkPSJNMjIxIDI0MlEyMjEgMjExIDE5NCAxOTFUMTI4IDE3MFE4OCAxNzAgNjIgMTkwVDM1IDI0MlEzNSAyNzIgNjIgMjkyVDEyOCAzMTNRMTY3IDMxMyAxOTQgMjkzVDIyMSAyNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCODsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0yODMgLTEyM1EyODMgLTE2MSAyNTUgLTE4N1QxNzAgLTIxM1ExNDQgLTIxMyAxMjIgLTIwNVQ4MiAtMTg4TDk4IC0xNDBRMTE4IC0xNTAgMTMyIC0xNTRUMTY0IC0xNTlRMTgyIC0xNTkgMTk2IC0xNTNUMjExIC0xMjZRMjExIC05MiAxNjggLTkyUTE0NCAtOTIgMTI4IC0xMDBMMTAxIC04NkwxNDMgMEgyMDdMMTgxIC00N0wxODIgLTQ4UTE4NyAtNDcgMTkzIC00N1QyMDYgLTQ2UTI0MSAtNDYgMjYyIC02NlQyODMgLTEyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI5OyIgaG9yaXotYWR2LXg9IjMwMSIgZD0iTTExMSA0MzhWNjAySDEwOEw0MyA1NzNMMTYgNjM5TDEzMSA2OTRIMjAyVjQzOEgyNzlWMzY3SDMwVjQzOEgxMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQTsiIGhvcml6LWFkdi14PSI0MTUiIGQ9Ik0zNjMgNTI5UTM2MyA0NTYgMzI0IDQxNFQyMDcgMzcxUTEzMCAzNzEgOTEgNDEzVDUyIDUyOVE1MiA1NjMgNjEgNTkyVDg5IDY0MlQxMzcgNjc0VDIwNyA2ODZRMjgyIDY4NiAzMjIgNjQ1VDM2MyA1MjlaTTI3NSA1MjlRMjc1IDU3NCAyNjAgNTk0VDIwNyA2MTVRMTY5IDYxNSAxNTUgNTk1VDE0MCA1MjlRMTQwIDQ3OCAxNTYgNDU5VDIwOCA0MzlRMjQzIDQzOSAyNTkgNDU4VDI3NSA1MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQjsiIGhvcml6LWFkdi14PSI0OTkiIGQ9Ik0zNTMgODVMMjU4IDEzM0wzNjUgMjk5TDI1NyA0NjdMMzUzIDUxNEw0ODUgMzAwTDM1MyA4NVpNMTMwIDk3TDM1IDE0NEwxMzYgMjk5TDM1IDQ1NUwxMzAgNTAyTDI1NSAzMDBMMTMwIDk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkM7IiBob3Jpei1hZHYteD0iNzk4IiBkPSJNMTQ4IDQzOFY2MDJIMTQ1TDgwIDU3M0w1MyA2MzlMMTY4IDY5NEgyMzlWNDM4SDMxNlYzNjdINjdWNDM4SDE0OFpNMjE0IDBIMTM4TDY1OCA3MDBINzM0TDIxNCAwWk03MTkgNjJWMEg2MjlWNjJINDkzTDQ3MyAxMjZMNjMwIDMyN0g3MTlWMTM0SDc3MFY2Mkg3MTlaTTU1MiAxMjdINjMzVjI0NEw1NTIgMTI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkQ7IiBob3Jpei1hZHYteD0iNzcxIiBkPSJNMTQ2IDQzOFY2MDJIMTQzTDc4IDU3M0w1MSA2MzlMMTY2IDY5NEgyMzdWNDM4SDMxNFYzNjdINjVWNDM4SDE0NlpNMTgyIDBIMTA2TDYyNiA3MDBINzAyTDE4MiAwWk00ODYgMEw0NzMgNzNRNTEyIDEwMSA1NDMgMTIyVDU5NyAxNTlUNjMyIDE5MVQ2NDUgMjIzUTY0NSAyMzcgNjM2IDI0N1Q2MDcgMjU4UTU4MiAyNTggNTY0IDI1MFQ1MjYgMjIwTDQ3NiAyNzZRNTExIDMwNyA1NDMgMzIwVDYxNiAzMzNRNjczIDMzMyA3MDQgMzA3VDczNiAyMzRRNzM2IDIxNCA3MjkgMTk2VDcwNCAxNThUNjU2IDExN1Q1ODAgNzJINzQwVjBINDg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBob3Jpei1hZHYteD0iNzUyIiBkPSJNMzIzIDQ2M1EzMjMgNDEyIDI5MSAzODdUMTkxIDM2MVExNTYgMzYxIDEyMyAzNzBUNTggNDA0TDk1IDQ2NFExMjAgNDQ0IDE0MCA0MzdUMTgxIDQyOVEyMDkgNDI5IDIyMyA0NDBUMjM3IDQ2OFEyMzcgNDg4IDIyNSA0OTVUMTkzIDUwMkgxNDBWNTYySDE3NFExOTcgNTYyIDIxMSA1NzFUMjI2IDU5OFEyMjYgNjExIDIxNyA2MjBUMTg3IDYzMFExNjQgNjMwIDE0MiA2MjFUMTAzIDU5NUw2MiA2NTRROTcgNjgwIDEyNyA2OTBUMTk3IDcwMFEyNTEgNzAwIDI4MiA2NzdUMzE0IDYwMlEzMTQgNTgxIDMwMiA1NjVUMjczIDU0MFY1MzlRMjk3IDUzMiAzMTAgNTEyVDMyMyA0NjNaTTE5NiAwSDEyMEw2NDAgNzAwSDcxNkwxOTYgMFpNNjgyIDYyVjBINTkyVjYySDQ1Nkw0MzYgMTI2TDU5MyAzMjdINjgyVjEzNEg3MzNWNjJINjgyWk01MTUgMTI3SDU5NlYyNDRMNTE1IDEyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJGOyIgaG9yaXotYWR2LXg9IjU0NSIgZD0iTTU0IDEwUTU0IDcyIDgyIDExNVQxNzQgMTg5TDIxNCAyMDhRMjI2IDIxNCAyMzMgMjE4VDI0MyAyMjhUMjQ3IDI0M1QyNDggMjY4VjMwOEgzODRWMjM3UTM4NCAyMTUgMzgyIDIwMFQzNzIgMTczVDM1MSAxNTNUMzE3IDEzNEwyNzQgMTE0UTIzMSA5NCAyMTEgNzZUMTkwIDIxUTE5MCAtMTcgMjE4IC0zN1QyOTUgLTU4UTM4NCAtNTggNDQ1IC0xTDUxMyAtMTAyUTQ4MyAtMTIyIDQ1NiAtMTM2VDQwMCAtMTU5VDM0MiAtMTcyVDI3NiAtMTc2UTE2NCAtMTc2IDEwOSAtMTI3VDU0IDEwWk0yMjcgNDQzUTIyNyA0NzQgMjUzIDQ5NFQzMTkgNTE1UTM1OCA1MTUgMzg0IDQ5NVQ0MTEgNDQzUTQxMSA0MTMgMzg1IDM5M1QzMjAgMzcyUTI4MCAzNzIgMjU0IDM5MlQyMjcgNDQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzA7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMzIDBMNDgwIDE0MEgyMTdMMTYzIDBIMTJMMjY5IDY3MEg0MjVMNjg5IDBINTMzWk0zNDggNTI1SDM0NEwyNTEgMjU4SDQ0M0wzNDggNTI1Wk0zNDYgNzA1TDE1MCA4MjNMMjkxIDg4MUw0MzAgNzUwTDM0NiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzMgMEw0ODAgMTQwSDIxN0wxNjMgMEgxMkwyNjkgNjcwSDQyNUw2ODkgMEg1MzNaTTM0OCA1MjVIMzQ0TDI1MSAyNThINDQzTDM0OCA1MjVaTTM0NiA3MDVMMjYyIDc1MEw0MDEgODgyTDU0MiA4MjNMMzQ2IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMyAwTDQ4MCAxNDBIMjE3TDE2MyAwSDEyTDI2OSA2NzBINDI1TDY4OSAwSDUzM1pNMzQ4IDUyNUgzNDRMMjUxIDI1OEg0NDNMMzQ4IDUyNVpNNDcxIDcwMUwzNDYgNzc1TDIxOSA3MDFMMTYzIDc4MEwzNDQgODc4TDUyOCA3ODBMNDcxIDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMzOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMyAwTDQ4MCAxNDBIMjE3TDE2MyAwSDEyTDI2OSA2NzBINDI1TDY4OSAwSDUzM1pNMzQ4IDUyNUgzNDRMMjUxIDI1OEg0NDNMMzQ4IDUyNVpNNTM1IDc5NVE1MjEgNzUwIDQ4OSA3MjlUNDIyIDcwN1EzOTkgNzA3IDM4MSA3MTNUMzQ2IDcyOFQzMTUgNzQzVDI4NSA3NTBRMjY4IDc1MCAyNTIgNzQxVDIyNCA3MDZMMTU5IDc1OVExODAgODA5IDIwNyA4MjdUMjcxIDg0NlEyOTIgODQ2IDMxMCA4MzlUMzQ1IDgyNFQzNzcgODA5VDQwOSA4MDJRNDI2IDgwMiA0NDIgODExVDQ2OCA4NDZMNTM1IDc5NUg1MzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNDsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzMgMEw0ODAgMTQwSDIxN0wxNjMgMEgxMkwyNjkgNjcwSDQyNUw2ODkgMEg1MzNaTTM0OCA1MjVIMzQ0TDI1MSAyNThINDQzTDM0OCA1MjVaTTUyNyA3NzlRNTI3IDc1MCA1MDcgNzMwVDQ1OCA3MDlRNDI5IDcwOSA0MDkgNzI5VDM4OCA3NzlRMzg4IDgwOCA0MDggODI4VDQ1OCA4NDhRNDg3IDg0OCA1MDcgODI4VDUyNyA3NzlaTTMwNCA3NzlRMzA0IDc1MCAyODQgNzMwVDIzNSA3MDlRMjA2IDcwOSAxODYgNzI5VDE2NiA3NzlRMTY2IDgwOCAxODYgODI4VDIzNSA4NDhRMjY0IDg0OCAyODQgODI4VDMwNCA3NzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik00OTUgNzE4UTQ5NSA2ODYgNDgyIDY1OVQ0NDcgNjE0TDY4OSAwSDUzM0w0ODAgMTQwSDIxN0wxNjMgMEgxMkwyNDcgNjEzUTIyNCA2MzEgMjExIDY1OFQxOTcgNzE4UTE5NyA3NDkgMjA4IDc3NVQyNDAgODIxVDI4OCA4NTBUMzQ2IDg2MVEzNzcgODYxIDQwNCA4NTFUNDUxIDgyMVQ0ODMgNzc2VDQ5NSA3MThaTTM0NyA1MjZIMzQ1TDI1MSAyNThINDQzTDM0NyA1MjZaTTQxMiA3MThRNDEyIDc0OCAzOTQgNzY3VDM0NyA3ODZRMzE4IDc4NiAyOTkgNzY3VDI4MCA3MThRMjgwIDY4OCAyOTkgNjY5VDM0NyA2NTBRMzc1IDY1MCAzOTMgNjY5VDQxMiA3MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNjsiIGhvcml6LWFkdi14PSI5MzkiIGQ9Ik00NTQgMFYxNTFIMjM0TDE2NSAwSDE0TDM1NSA2NjdIODkyVjU0OEg1OTdWNDA2SDg2M1YyODNINTk3VjExOUg5MDJWMEg0NTRaTTQ1NCA1NDdINDMxTDI5MCAyNzNINDU0VjU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM3OyIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTQ3OSAtMTI2UTQ3OSAtMTY0IDQ1MSAtMTg5VDM2NyAtMjE1UTM0MSAtMjE1IDMxOCAtMjA4VDI3OCAtMTkwTDI5NCAtMTQyUTMxMyAtMTUyIDMyOCAtMTU3VDM2MSAtMTYyUTM3OCAtMTYyIDM5MiAtMTU1VDQwNyAtMTI4UTQwNyAtOTQgMzY0IC05NFEzNTIgLTk0IDM0MyAtOTZUMzI0IC0xMDJMMjk3IC04OEwzMzYgLTlRMjY0IC0yIDIxMSAyNlQxMjQgOTlUNzMgMjA1VDU2IDMzOFE1NiA0MTQgNzcgNDc3VDE0MCA1ODRUMjQyIDY1M1QzODEgNjc4UTQ1NiA2NzggNTE3IDY1MlQ2MzYgNTY3TDU0NyA0NzRRNTA5IDUxNiA0NzEgNTM1VDM4NyA1NTVRMzAwIDU1NSAyNTQgNTAzVDIwOCAzMzdRMjA4IDIzMiAyNTAgMTcxVDM4NiAxMTBRNDM0IDExMCA0NzYgMTMwVDU2MSAxOTNMNjQwIDk2UTU4NCA0MyA1MjYgMTdUMzk4IC0xMUwzNzcgLTUwTDM3OCAtNTFRMzgzIC01MCAzODkgLTUwVDQwMiAtNDlRNDM3IC00OSA0NTggLTY4VDQ3OSAtMTI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzg7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMFY2NjdINTI4VjU0NUgyMTlWNDA0SDQ5OVYyODBIMjE5VjExOUg1MzhWMEg3M1pNMzMyIDcwNUwxMzYgODIzTDI3NyA4ODFMNDE2IDc1MEwzMzIgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzk7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMFY2NjdINTI4VjU0NUgyMTlWNDA0SDQ5OVYyODBIMjE5VjExOUg1MzhWMEg3M1pNMjk3IDcwNUwyMTMgNzUwTDM1MiA4ODJMNDkzIDgyM0wyOTcgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0E7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMFY2NjdINTI4VjU0NUgyMTlWNDA0SDQ5OVYyODBIMjE5VjExOUg1MzhWMEg3M1pNNDI1IDcwMUwzMDAgNzc1TDE3MyA3MDFMMTE3IDc4MEwyOTggODc4TDQ4MiA3ODBMNDI1IDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTczIDBWNjY3SDUyOFY1NDVIMjE5VjQwNEg0OTlWMjgwSDIxOVYxMTlINTM4VjBINzNaTTQ4MSA3NzlRNDgxIDc1MCA0NjEgNzMwVDQxMiA3MDlRMzgzIDcwOSAzNjMgNzI5VDM0MiA3NzlRMzQyIDgwOCAzNjIgODI4VDQxMiA4NDhRNDQxIDg0OCA0NjEgODI4VDQ4MSA3NzlaTTI1OCA3NzlRMjU4IDc1MCAyMzggNzMwVDE4OSA3MDlRMTYwIDcwOSAxNDAgNzI5VDEyMCA3NzlRMTIwIDgwOCAxNDAgODI4VDE4OSA4NDhRMjE4IDg0OCAyMzggODI4VDI1OCA3NzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQzsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwVjY2N0gyMTlWMEg3M1pNMTQ1IDcwNUwtNTEgODIzTDkwIDg4MUwyMjkgNzUwTDE0NSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRDsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwVjY2N0gyMTlWMEg3M1pNMTUwIDcwNUw2NiA3NTBMMjA1IDg4MkwzNDYgODIzTDE1MCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRTsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwVjY2N0gyMTlWMEg3M1pNMjc4IDcwMUwxNTMgNzc1TDI2IDcwMUwtMzAgNzgwTDE1MSA4NzhMMzM1IDc4MEwyNzggNzAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Y7IiBob3Jpei1hZHYteD0iMjkyIiBkPSJNNzMgMFY2NjdIMjE5VjBINzNaTTMyOCA3NzlRMzI4IDc1MCAzMDggNzMwVDI1OSA3MDlRMjMwIDcwOSAyMTAgNzI5VDE4OSA3NzlRMTg5IDgwOCAyMDkgODI4VDI1OSA4NDhRMjg4IDg0OCAzMDggODI4VDMyOCA3NzlaTTEwNSA3NzlRMTA1IDc1MCA4NSA3MzBUMzYgNzA5UTcgNzA5IC0xMyA3MjlULTMzIDc3OVEtMzMgODA4IC0xMyA4MjhUMzYgODQ4UTY1IDg0OCA4NSA4MjhUMTA1IDc3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQwOyIgaG9yaXotYWR2LXg9IjcwNCIgZD0iTTY0OCAzMzhRNjQ4IDI1MSA2MjQgMTg4VDU1NSA4M1Q0NDMgMjFUMjkyIDBINzVWMjg5SDVWNDA4SDc1VjY2MlExMzIgNjY3IDE5MCA2NzBUMzA1IDY3NFE0NjcgNjc0IDU1NyA1ODlUNjQ4IDMzOFpNNDk5IDM0MFE0OTkgMzg2IDQ5MCA0MjZUNDYwIDQ5NlQ0MDIgNTQzVDMxMCA1NjBRMjg3IDU2MCAyNjQgNTU5VDIxOSA1NTZWNDA4SDM3M1YyODlIMjE5VjExN1EyMzcgMTE2IDI1NSAxMTZUMjkxIDExNlEzNDkgMTE2IDM4OCAxMjlUNDUyIDE2OVQ0ODggMjM5VDQ5OSAzNDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMTsiIGhvcml6LWFkdi14PSI3MzEiIGQ9Ik01MzIgMEwyMTkgNDI1SDIxNVYwSDczVjY2N0gyMDhMNTEyIDI0OUg1MTdWNjY3SDY1OFYwSDUzMlpNNTUzIDc5NVE1MzkgNzUwIDUwNyA3MjlUNDQwIDcwN1E0MTcgNzA3IDM5OSA3MTNUMzY0IDcyOFQzMzMgNzQzVDMwMyA3NTBRMjg2IDc1MCAyNzAgNzQxVDI0MiA3MDZMMTc3IDc1OVExOTggODA5IDIyNSA4MjdUMjg5IDg0NlEzMTAgODQ2IDMyOCA4MzlUMzYzIDgyNFQzOTUgODA5VDQyNyA4MDJRNDQ0IDgwMiA0NjAgODExVDQ4NiA4NDZMNTUzIDc5NUg1NTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMjsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03MTYgMzM0UTcxNiAyNDUgNjkyIDE4MFQ2MjUgNzNUNTIxIDExVDM4NiAtMTBRMzEyIC0xMCAyNTIgMTBUMTQ4IDczVDgwIDE4MFQ1NiAzMzRRNTYgNDIyIDc5IDQ4N1QxNDYgNTk0VDI1MSA2NTdUMzg2IDY3OFE0NjEgNjc4IDUyMSA2NThUNjI1IDU5NVQ2OTIgNDg3VDcxNiAzMzRaTTU2NCAzMzRRNTY0IDM4OCA1NTYgNDMwVDUyNiA1MDFUNDcxIDU0NVQzODYgNTYwUTMzNSA1NjAgMzAxIDU0NVQyNDYgNTAyVDIxNyA0MzFUMjA4IDMzNFEyMDggMjgwIDIxNiAyMzhUMjQ2IDE2N1QzMDEgMTIzVDM4NiAxMDhRNDM3IDEwOCA0NzEgMTIzVDUyNiAxNjdUNTU1IDIzOFQ1NjQgMzM0Wk00MjMgNzA5TDIyNyA4MjdMMzY4IDg4NUw1MDcgNzU0TDQyMyA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMzsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03MTYgMzM0UTcxNiAyNDUgNjkyIDE4MFQ2MjUgNzNUNTIxIDExVDM4NiAtMTBRMzEyIC0xMCAyNTIgMTBUMTQ4IDczVDgwIDE4MFQ1NiAzMzRRNTYgNDIyIDc5IDQ4N1QxNDYgNTk0VDI1MSA2NTdUMzg2IDY3OFE0NjEgNjc4IDUyMSA2NThUNjI1IDU5NVQ2OTIgNDg3VDcxNiAzMzRaTTU2NCAzMzRRNTY0IDM4OCA1NTYgNDMwVDUyNiA1MDFUNDcxIDU0NVQzODYgNTYwUTMzNSA1NjAgMzAxIDU0NVQyNDYgNTAyVDIxNyA0MzFUMjA4IDMzNFEyMDggMjgwIDIxNiAyMzhUMjQ2IDE2N1QzMDEgMTIzVDM4NiAxMDhRNDM3IDEwOCA0NzEgMTIzVDUyNiAxNjdUNTU1IDIzOFQ1NjQgMzM0Wk0zODYgNzA5TDMwMiA3NTRMNDQxIDg4Nkw1ODIgODI3TDM4NiA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENDsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03MTYgMzM0UTcxNiAyNDUgNjkyIDE4MFQ2MjUgNzNUNTIxIDExVDM4NiAtMTBRMzEyIC0xMCAyNTIgMTBUMTQ4IDczVDgwIDE4MFQ1NiAzMzRRNTYgNDIyIDc5IDQ4N1QxNDYgNTk0VDI1MSA2NTdUMzg2IDY3OFE0NjEgNjc4IDUyMSA2NThUNjI1IDU5NVQ2OTIgNDg3VDcxNiAzMzRaTTU2NCAzMzRRNTY0IDM4OCA1NTYgNDMwVDUyNiA1MDFUNDcxIDU0NVQzODYgNTYwUTMzNSA1NjAgMzAxIDU0NVQyNDYgNTAyVDIxNyA0MzFUMjA4IDMzNFEyMDggMjgwIDIxNiAyMzhUMjQ2IDE2N1QzMDEgMTIzVDM4NiAxMDhRNDM3IDEwOCA0NzEgMTIzVDUyNiAxNjdUNTU1IDIzOFQ1NjQgMzM0Wk01MTggNzAxTDM5MyA3NzVMMjY2IDcwMUwyMTAgNzgwTDM5MSA4NzhMNTc1IDc4MEw1MTggNzAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzE2IDMzNFE3MTYgMjQ1IDY5MiAxODBUNjI1IDczVDUyMSAxMVQzODYgLTEwUTMxMiAtMTAgMjUyIDEwVDE0OCA3M1Q4MCAxODBUNTYgMzM0UTU2IDQyMiA3OSA0ODdUMTQ2IDU5NFQyNTEgNjU3VDM4NiA2NzhRNDYxIDY3OCA1MjEgNjU4VDYyNSA1OTVUNjkyIDQ4N1Q3MTYgMzM0Wk01NjQgMzM0UTU2NCAzODggNTU2IDQzMFQ1MjYgNTAxVDQ3MSA1NDVUMzg2IDU2MFEzMzUgNTYwIDMwMSA1NDVUMjQ2IDUwMlQyMTcgNDMxVDIwOCAzMzRRMjA4IDI4MCAyMTYgMjM4VDI0NiAxNjdUMzAxIDEyM1QzODYgMTA4UTQzNyAxMDggNDcxIDEyM1Q1MjYgMTY3VDU1NSAyMzhUNTY0IDMzNFpNNTY5IDc5OVE1NTUgNzU0IDUyMyA3MzNUNDU2IDcxMVE0MzMgNzExIDQxNSA3MTdUMzgwIDczMlQzNDkgNzQ3VDMxOSA3NTRRMzAyIDc1NCAyODYgNzQ1VDI1OCA3MTBMMTkzIDc2M1EyMTQgODEzIDI0MSA4MzFUMzA1IDg1MFEzMjYgODUwIDM0NCA4NDNUMzc5IDgyOFQ0MTEgODEzVDQ0MyA4MDZRNDYwIDgwNiA0NzYgODE1VDUwMiA4NTBMNTY5IDc5OUg1NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENjsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03MTYgMzM0UTcxNiAyNDUgNjkyIDE4MFQ2MjUgNzNUNTIxIDExVDM4NiAtMTBRMzEyIC0xMCAyNTIgMTBUMTQ4IDczVDgwIDE4MFQ1NiAzMzRRNTYgNDIyIDc5IDQ4N1QxNDYgNTk0VDI1MSA2NTdUMzg2IDY3OFE0NjEgNjc4IDUyMSA2NThUNjI1IDU5NVQ2OTIgNDg3VDcxNiAzMzRaTTU2NCAzMzRRNTY0IDM4OCA1NTYgNDMwVDUyNiA1MDFUNDcxIDU0NVQzODYgNTYwUTMzNSA1NjAgMzAxIDU0NVQyNDYgNTAyVDIxNyA0MzFUMjA4IDMzNFEyMDggMjgwIDIxNiAyMzhUMjQ2IDE2N1QzMDEgMTIzVDM4NiAxMDhRNDM3IDEwOCA0NzEgMTIzVDUyNiAxNjdUNTU1IDIzOFQ1NjQgMzM0Wk01NjkgNzc5UTU2OSA3NTAgNTQ5IDczMFQ1MDAgNzA5UTQ3MSA3MDkgNDUxIDcyOVQ0MzAgNzc5UTQzMCA4MDggNDUwIDgyOFQ1MDAgODQ4UTUyOSA4NDggNTQ5IDgyOFQ1NjkgNzc5Wk0zNDYgNzc5UTM0NiA3NTAgMzI2IDczMFQyNzcgNzA5UTI0OCA3MDkgMjI4IDcyOVQyMDggNzc5UTIwOCA4MDggMjI4IDgyOFQyNzcgODQ4UTMwNiA4NDggMzI2IDgyOFQzNDYgNzc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDc7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTUxIDQzMEwzODkgMjY5TDU1MiAxMDZMNDcwIDIzTDMwNyAxODZMMTQzIDIzTDYwIDEwNkwyMjQgMjY5TDYyIDQzMEwxNDUgNTEzTDMwNyAzNTFMNDY5IDUxM0w1NTEgNDMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDg7IiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzE2IDMzNFE3MTYgMjQ1IDY5MiAxODBUNjI1IDczVDUyMSAxMVQzODYgLTEwUTI3MCAtMTAgMTkyIDM4TDEzMSAtMjZMNTYgNTlMMTExIDExN1E1NiAxOTkgNTYgMzM0UTU2IDQyMiA3OSA0ODdUMTQ2IDU5NFQyNTEgNjU3VDM4NiA2NzhRNDQ2IDY3OCA0OTcgNjY1VDU5MCA2MjNMNjUzIDY5MEw3MzMgNjEyTDY2NyA1NDJRNjkwIDUwMiA3MDMgNDUxVDcxNiAzMzRaTTIwOCAzMzRRMjA4IDI3MyAyMTggMjMwTDQ5OSA1MjhRNDU4IDU2MCAzODYgNTYwUTMzNSA1NjAgMzAxIDU0NVQyNDYgNTAyVDIxNyA0MzFUMjA4IDMzNFpNNTY0IDMzNFE1NjQgMzYwIDU2MyAzODJUNTU2IDQyNUwyODEgMTMzUTMyMiAxMDggMzg2IDEwOFE0MzcgMTA4IDQ3MSAxMjNUNTI2IDE2N1Q1NTUgMjM4VDU2NCAzMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MjggMjY4UTYyOCAyMDIgNjE0IDE1MFQ1NjYgNjJUNDgwIDhUMzUwIC0xMVEyNzMgLTExIDIyMCA3VDEzNSA2MlQ4OCAxNTBUNzMgMjY4VjY2N0gyMTlWMjkwUTIxOSAyNTIgMjIyIDIyMFQyMzkgMTYzVDI3OCAxMjZUMzUwIDExMlEzOTYgMTEyIDQyMiAxMjVUNDYxIDE2M1Q0NzggMjE5VDQ4MiAyOTBWNjY3SDYyOFYyNjhINjI4Wk0zNDkgNzA1TDE1MyA4MjNMMjk0IDg4MUw0MzMgNzUwTDM0OSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MjggMjY4UTYyOCAyMDIgNjE0IDE1MFQ1NjYgNjJUNDgwIDhUMzUwIC0xMVEyNzMgLTExIDIyMCA3VDEzNSA2MlQ4OCAxNTBUNzMgMjY4VjY2N0gyMTlWMjkwUTIxOSAyNTIgMjIyIDIyMFQyMzkgMTYzVDI3OCAxMjZUMzUwIDExMlEzOTYgMTEyIDQyMiAxMjVUNDYxIDE2M1Q0NzggMjE5VDQ4MiAyOTBWNjY3SDYyOFYyNjhINjI4Wk0zNDkgNzA1TDI2NSA3NTBMNDA0IDg4Mkw1NDUgODIzTDM0OSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQjsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MjggMjY4UTYyOCAyMDIgNjE0IDE1MFQ1NjYgNjJUNDgwIDhUMzUwIC0xMVEyNzMgLTExIDIyMCA3VDEzNSA2MlQ4OCAxNTBUNzMgMjY4VjY2N0gyMTlWMjkwUTIxOSAyNTIgMjIyIDIyMFQyMzkgMTYzVDI3OCAxMjZUMzUwIDExMlEzOTYgMTEyIDQyMiAxMjVUNDYxIDE2M1Q0NzggMjE5VDQ4MiAyOTBWNjY3SDYyOFYyNjhINjI4Wk00NzcgNzAxTDM1MiA3NzVMMjI1IDcwMUwxNjkgNzgwTDM1MCA4NzhMNTM0IDc4MEw0NzcgNzAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REM7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjI4IDI2OFE2MjggMjAyIDYxNCAxNTBUNTY2IDYyVDQ4MCA4VDM1MCAtMTFRMjczIC0xMSAyMjAgN1QxMzUgNjJUODggMTUwVDczIDI2OFY2NjdIMjE5VjI5MFEyMTkgMjUyIDIyMiAyMjBUMjM5IDE2M1QyNzggMTI2VDM1MCAxMTJRMzk2IDExMiA0MjIgMTI1VDQ2MSAxNjNUNDc4IDIxOVQ0ODIgMjkwVjY2N0g2MjhWMjY4SDYyOFpNNTMxIDc3OVE1MzEgNzUwIDUxMSA3MzBUNDYyIDcwOVE0MzMgNzA5IDQxMyA3MjlUMzkyIDc3OVEzOTIgODA4IDQxMiA4MjhUNDYyIDg0OFE0OTEgODQ4IDUxMSA4MjhUNTMxIDc3OVpNMzA4IDc3OVEzMDggNzUwIDI4OCA3MzBUMjM5IDcwOVEyMTAgNzA5IDE5MCA3MjlUMTcwIDc3OVExNzAgODA4IDE5MCA4MjhUMjM5IDg0OFEyNjggODQ4IDI4OCA4MjhUMzA4IDc3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEREOyIgaG9yaXotYWR2LXg9IjY0NiIgZD0iTTM5NyAyNjJWMEgyNTFWMjU5TDIgNjY3SDE3MEwzMjUgMzkwTDQ4MyA2NjdINjQ0TDM5NyAyNjJaTTM0NyA2ODlMMjYzIDczNEw0MDIgODY2TDU0MyA4MDdMMzQ3IDY4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgaG9yaXotYWR2LXg9IjYzMiIgZD0iTTU5MCAzMzVRNTkwIDI4OSA1NzcgMjQ5VDUzNSAxODBUNDYxIDEzM1QzNTEgMTE2SDIxNlYwSDczVjY2N0gyMTVWNTUwUTI2NCA1NTMgMzA4IDU1M1EzNjUgNTUzIDQxNiA1NDRUNTA1IDUwOVQ1NjcgNDQyVDU5MCAzMzVaTTQ0NiAzMzZRNDQ2IDM5MyA0MTUgNDE1VDMwOSA0MzdRMjg4IDQzNyAyNjYgNDM2VDIxNiA0MzNWMjMwSDMyNlEzNTAgMjMwIDM3MiAyMzNUNDEwIDI0NlQ0MzYgMjc4VDQ0NiAzMzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERjsiIGhvcml6LWFkdi14PSI1ODkiIGQ9Ik01NTQgMTgzUTU1NCAxMjkgNTM2IDkyVDQ5MCAzMlQ0MjggLTJUMzU5IC0xM1EzMjEgLTEzIDI5MyAtOVQyNTAgMUwyNjkgOTlRMjgwIDk2IDI5NSA5NFQzMjEgOTJRMzM5IDkyIDM1NSA5NlQzODMgMTExVDQwMyAxMzlUNDExIDE4MlE0MTEgMjAwIDQwNSAyMTlUMzg0IDI1NVQzNDEgMjg3VDI3MiAzMTBMMjU2IDM5M1EzMDggNDI5IDMzNCA0NjNUMzYwIDUzM1EzNjAgNTY1IDM0MiA1ODVUMjgwIDYwNlEyMzUgNjA2IDIxOCA1ODVUMjAxIDUyMlYwSDYzVjUyNFE2MyA1NjMgNzEgNTk2VDEwMyA2NTNUMTY5IDY5MVQyNzggNzA1UTM4MCA3MDUgNDMyIDY2MVQ0ODQgNTQ1UTQ4NCA1MDIgNDY2IDQ2MVQ0MDIgMzg3VjM4NlE0MzIgMzc0IDQ1OSAzNTVUNTA4IDMxMVQ1NDEgMjUzVDU1NCAxODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMDsiIGhvcml6LWFkdi14PSI1NjIiIGQ9Ik00NDYgLTEzUTQyMCAtNiA0MDAgN1QzNjggNDdIMzY2UTMyOSAxOCAyODkgM1QyMDAgLTEyUTE2NCAtMTIgMTM0IC0yVDgzIDI3VDQ5IDc0VDM2IDE0MVEzNiAyMDMgNjcgMjM5VDE0NiAyOTRUMjQ4IDMxOFQzNTAgMzIzVjM1NFEzNDkgMzg2IDMzMCAzOThUMjc1IDQxMVEyMjYgNDExIDE3OSAzOTdUOTIgMzU5TDQ4IDQ1M1ExMDcgNDgyIDE2NCA0OTdUMjg5IDUxM1EzNDQgNTEzIDM4MiA1MDJUNDQ1IDQ2N1Q0ODAgNDA0VDQ5MSAzMTFWMTM1UTQ5MSAxMTAgNTAzIDk3VDUzNSA3M0w0NDYgLTEzWk0zNTMgMjQ1UTMyOCAyNDUgMjk3IDI0M1QyMzkgMjMyVDE5MiAyMDRUMTczIDE1MVExNzMgMTE5IDE5MiAxMDFUMjQzIDgyUTI3NSA4MiAzMDEgOTJUMzUzIDEyMVYyNDVaTTI4MyA1NjVMODcgNjgzTDIyOCA3NDFMMzY3IDYxMEwyODMgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBob3Jpei1hZHYteD0iNTYyIiBkPSJNNDQ2IC0xM1E0MjAgLTYgNDAwIDdUMzY4IDQ3SDM2NlEzMjkgMTggMjg5IDNUMjAwIC0xMlExNjQgLTEyIDEzNCAtMlQ4MyAyN1Q0OSA3NFQzNiAxNDFRMzYgMjAzIDY3IDIzOVQxNDYgMjk0VDI0OCAzMThUMzUwIDMyM1YzNTRRMzQ5IDM4NiAzMzAgMzk4VDI3NSA0MTFRMjI2IDQxMSAxNzkgMzk3VDkyIDM1OUw0OCA0NTNRMTA3IDQ4MiAxNjQgNDk3VDI4OSA1MTNRMzQ0IDUxMyAzODIgNTAyVDQ0NSA0NjdUNDgwIDQwNFQ0OTEgMzExVjEzNVE0OTEgMTEwIDUwMyA5N1Q1MzUgNzNMNDQ2IC0xM1pNMzUzIDI0NVEzMjggMjQ1IDI5NyAyNDNUMjM5IDIzMlQxOTIgMjA0VDE3MyAxNTFRMTczIDExOSAxOTIgMTAxVDI0MyA4MlEyNzUgODIgMzAxIDkyVDM1MyAxMjFWMjQ1Wk0yNjUgNTY1TDE4MSA2MTBMMzIwIDc0Mkw0NjEgNjgzTDI2NSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMjsiIGhvcml6LWFkdi14PSI1NjIiIGQ9Ik00NDYgLTEzUTQyMCAtNiA0MDAgN1QzNjggNDdIMzY2UTMyOSAxOCAyODkgM1QyMDAgLTEyUTE2NCAtMTIgMTM0IC0yVDgzIDI3VDQ5IDc0VDM2IDE0MVEzNiAyMDMgNjcgMjM5VDE0NiAyOTRUMjQ4IDMxOFQzNTAgMzIzVjM1NFEzNDkgMzg2IDMzMCAzOThUMjc1IDQxMVEyMjYgNDExIDE3OSAzOTdUOTIgMzU5TDQ4IDQ1M1ExMDcgNDgyIDE2NCA0OTdUMjg5IDUxM1EzNDQgNTEzIDM4MiA1MDJUNDQ1IDQ2N1Q0ODAgNDA0VDQ5MSAzMTFWMTM1UTQ5MSAxMTAgNTAzIDk3VDUzNSA3M0w0NDYgLTEzWk0zNTMgMjQ1UTMyOCAyNDUgMjk3IDI0M1QyMzkgMjMyVDE5MiAyMDRUMTczIDE1MVExNzMgMTE5IDE5MiAxMDFUMjQzIDgyUTI3NSA4MiAzMDEgOTJUMzUzIDEyMVYyNDVaTTQwMiA1NTlMMjc3IDYzM0wxNTAgNTU5TDk0IDYzOEwyNzUgNzM2TDQ1OSA2MzhMNDAyIDU1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUzOyIgaG9yaXotYWR2LXg9IjU2MiIgZD0iTTQ0NiAtMTNRNDIwIC02IDQwMCA3VDM2OCA0N0gzNjZRMzI5IDE4IDI4OSAzVDIwMCAtMTJRMTY0IC0xMiAxMzQgLTJUODMgMjdUNDkgNzRUMzYgMTQxUTM2IDIwMyA2NyAyMzlUMTQ2IDI5NFQyNDggMzE4VDM1MCAzMjNWMzU0UTM0OSAzODYgMzMwIDM5OFQyNzUgNDExUTIyNiA0MTEgMTc5IDM5N1Q5MiAzNTlMNDggNDUzUTEwNyA0ODIgMTY0IDQ5N1QyODkgNTEzUTM0NCA1MTMgMzgyIDUwMlQ0NDUgNDY3VDQ4MCA0MDRUNDkxIDMxMVYxMzVRNDkxIDExMCA1MDMgOTdUNTM1IDczTDQ0NiAtMTNaTTM1MyAyNDVRMzI4IDI0NSAyOTcgMjQzVDIzOSAyMzJUMTkyIDIwNFQxNzMgMTUxUTE3MyAxMTkgMTkyIDEwMVQyNDMgODJRMjc1IDgyIDMwMSA5MlQzNTMgMTIxVjI0NVpNNDU3IDY1NVE0NDMgNjEwIDQxMSA1ODlUMzQ0IDU2N1EzMjEgNTY3IDMwMyA1NzNUMjY4IDU4OFQyMzcgNjAzVDIwNyA2MTBRMTkwIDYxMCAxNzQgNjAxVDE0NiA1NjZMODEgNjE5UTEwMiA2NjkgMTI5IDY4N1QxOTMgNzA2UTIxNCA3MDYgMjMyIDY5OVQyNjcgNjg0VDI5OSA2NjlUMzMxIDY2MlEzNDggNjYyIDM2NCA2NzFUMzkwIDcwNkw0NTcgNjU1SDQ1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU0OyIgaG9yaXotYWR2LXg9IjU2MiIgZD0iTTQ0NiAtMTNRNDIwIC02IDQwMCA3VDM2OCA0N0gzNjZRMzI5IDE4IDI4OSAzVDIwMCAtMTJRMTY0IC0xMiAxMzQgLTJUODMgMjdUNDkgNzRUMzYgMTQxUTM2IDIwMyA2NyAyMzlUMTQ2IDI5NFQyNDggMzE4VDM1MCAzMjNWMzU0UTM0OSAzODYgMzMwIDM5OFQyNzUgNDExUTIyNiA0MTEgMTc5IDM5N1Q5MiAzNTlMNDggNDUzUTEwNyA0ODIgMTY0IDQ5N1QyODkgNTEzUTM0NCA1MTMgMzgyIDUwMlQ0NDUgNDY3VDQ4MCA0MDRUNDkxIDMxMVYxMzVRNDkxIDExMCA1MDMgOTdUNTM1IDczTDQ0NiAtMTNaTTM1MyAyNDVRMzI4IDI0NSAyOTcgMjQzVDIzOSAyMzJUMTkyIDIwNFQxNzMgMTUxUTE3MyAxMTkgMTkyIDEwMVQyNDMgODJRMjc1IDgyIDMwMSA5MlQzNTMgMTIxVjI0NVpNNDU0IDYzOVE0NTQgNjEwIDQzNCA1OTBUMzg1IDU2OVEzNTYgNTY5IDMzNiA1ODlUMzE1IDYzOVEzMTUgNjY4IDMzNSA2ODhUMzg1IDcwOFE0MTQgNzA4IDQzNCA2ODhUNDU0IDYzOVpNMjMxIDYzOVEyMzEgNjEwIDIxMSA1OTBUMTYyIDU2OVExMzMgNTY5IDExMyA1ODlUOTMgNjM5UTkzIDY2OCAxMTMgNjg4VDE2MiA3MDhRMTkxIDcwOCAyMTEgNjg4VDIzMSA2MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNTsiIGhvcml6LWFkdi14PSI1NjIiIGQ9Ik00NDYgLTEzUTQyMCAtNiA0MDAgN1QzNjggNDdIMzY2UTMyOSAxOCAyODkgM1QyMDAgLTEyUTE2NCAtMTIgMTM0IC0yVDgzIDI3VDQ5IDc0VDM2IDE0MVEzNiAyMDMgNjcgMjM5VDE0NiAyOTRUMjQ4IDMxOFQzNTAgMzIzVjM1NFEzNDkgMzg2IDMzMCAzOThUMjc1IDQxMVEyMjYgNDExIDE3OSAzOTdUOTIgMzU5TDQ4IDQ1M1ExMDcgNDgyIDE2NCA0OTdUMjg5IDUxM1EzNDQgNTEzIDM4MiA1MDJUNDQ1IDQ2N1Q0ODAgNDA0VDQ5MSAzMTFWMTM1UTQ5MSAxMTAgNTAzIDk3VDUzNSA3M0w0NDYgLTEzWk0zNTMgMjQ1UTMyOCAyNDUgMjk3IDI0M1QyMzkgMjMyVDE5MiAyMDRUMTczIDE1MVExNzMgMTE5IDE5MiAxMDFUMjQzIDgyUTI3NSA4MiAzMDEgOTJUMzUzIDEyMVYyNDVaTTM4OSA2NjZRMzg5IDY0MyAzODEgNjI0VDM1NyA1OTBUMzIyIDU2OFQyNzcgNTYwUTI1NCA1NjAgMjM0IDU2OFQxOTkgNTkwVDE3NSA2MjNUMTY2IDY2NlExNjYgNzE0IDE5OCA3NDNUMjc3IDc3M1EzMjUgNzczIDM1NyA3NDRUMzg5IDY2NlpNMzI4IDY2NlEzMjggNjg5IDMxNCA3MDNUMjc4IDcxOFEyNTUgNzE4IDI0MSA3MDRUMjI3IDY2NlEyMjcgNjQzIDI0MSA2MjlUMjc4IDYxNFEzMDAgNjE0IDMxNCA2MjhUMzI4IDY2NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU2OyIgaG9yaXotYWR2LXg9Ijg5MSIgZD0iTTg1MCAyNDRRODUwIDIzNyA4NTAgMjI5VDg0OCAyMDNINDkzUTQ5NiAxNTIgNTI5IDEyNVQ2MjIgOTdRNjYwIDk3IDY5NiAxMDZUNzcxIDEzOEw4MTcgNDNRNzY5IDE1IDcyMCAyVDYxNyAtMTFRNTQ5IC0xMSA0OTkgMTBUNDE0IDY5UTM3NiAzNyAzMjQgMTNUMjAwIC0xMlExMjQgLTEyIDgwIDI4VDM2IDE0MVEzNiAxOTAgNTcgMjI0VDExOCAyODFUMjE3IDMxM1QzNTAgMzIzVjM0MFEzNTAgMzU2IDM0OCAzNjhUMzM5IDM4OVQzMTYgNDAxVDI3NiA0MDZRMjQwIDQwNiAxOTEgMzk0VDk0IDM1NUw0OCA0NTNRMTA5IDQ4NCAxNjYgNDk4VDI4OCA1MTNRMzQxIDUxMyAzODEgNTAwVDQ0NCA0NTdRNDc3IDQ4NyA1MTkgNTAwVDYwNiA1MTRRNjYxIDUxNCA3MDYgNDk2VDc4MyA0NDJUODMyIDM1N1Q4NTAgMjQ0Wk03MjIgMjk1UTcxNyAzNDggNjkxIDM3OVQ2MDggNDExUTU1NSA0MTEgNTI0IDM4MVQ0OTIgMjk1SDcyMlpNMzcxIDEzNFEzNjAgMTUzIDM1NiAxNzZUMzUxIDIyNlYyNDJRMjUzIDI0MiAyMTMgMjE5VDE3MyAxNDlRMTczIDExNyAxOTIgOTdUMjQzIDc3UTI2OSA3NyAzMDIgOTJUMzcxIDEzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU3OyIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTM5NiAtMTI4UTM5NiAtMTY2IDM2OCAtMTkxVDI4NCAtMjE3UTI1OCAtMjE3IDIzNSAtMjEwVDE5NSAtMTkzTDIxMSAtMTQ0UTIzMCAtMTU1IDI0NSAtMTU5VDI3OCAtMTY0UTI5NSAtMTY0IDMwOSAtMTU3VDMyNCAtMTMwUTMyNCAtOTYgMjgyIC05NlEyNTggLTk2IDI0MiAtMTA1TDIxNCAtOTBMMjU0IC04UTE1MyAzIDk4IDcwVDQyIDI0NlE0MiAzMDggNjAgMzU3VDExMiA0NDFUMTk0IDQ5NFQzMDUgNTEzUTM1NiA1MTMgNDA2IDQ5NFQ0OTggNDQxTDQzNyAzNTBRNDEwIDM3OCAzODAgMzkxVDMxMCA0MDRRMjc1IDQwNCAyNTEgMzkyVDIxMiAzNjBUMTkxIDMxMlQxODQgMjUzUTE4NCAyMjEgMTkwIDE5M1QyMTIgMTQzVDI1MSAxMTBUMzEwIDk3UTM1MCA5NyAzODMgMTA3VDQ1MSAxNDdMNDk2IDU0UTQ1MyAyMyA0MTEgN1QzMTYgLTEyTDI5NCAtNTJMMjk1IC01M1EzMDAgLTUyIDMwNiAtNTJUMzE4IC01MVEzNTQgLTUxIDM3NSAtNzBUMzk2IC0xMjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFODsiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01MzIgMjQ3UTUzMiAyNDIgNTMyIDIzMFQ1MzAgMjA2SDE4MVExODEgMTUyIDIxMyAxMjRUMzExIDk1UTM1MiA5NSAzODYgMTA1VDQ2MCAxMzdMNTA1IDQzUTQ1NiAxNCA0MDggMlQzMDQgLTExUTIzOSAtMTEgMTkwIDdUMTA4IDYwVDU5IDE0M1Q0MiAyNTBRNDIgMzIyIDY0IDM3MlQxMjEgNDU0VDIwMiA1MDBUMjk0IDUxNFEzNTAgNTE0IDM5NCA0OTVUNDY5IDQ0MVQ1MTYgMzU3VDUzMiAyNDdaTTQwNCAyOTVRNDA0IDM0NiAzNzggMzgwVDI5NiA0MTRRMjY2IDQxNCAyNDUgNDA1VDIwOSAzNzlUMTg5IDM0MVQxODIgMjk1SDQwNFpNMzA2IDU2NUwxMTAgNjgzTDI1MSA3NDFMMzkwIDYxMEwzMDYgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTk7IiBob3Jpei1hZHYteD0iNTczIiBkPSJNNTMyIDI0N1E1MzIgMjQyIDUzMiAyMzBUNTMwIDIwNkgxODFRMTgxIDE1MiAyMTMgMTI0VDMxMSA5NVEzNTIgOTUgMzg2IDEwNVQ0NjAgMTM3TDUwNSA0M1E0NTYgMTQgNDA4IDJUMzA0IC0xMVEyMzkgLTExIDE5MCA3VDEwOCA2MFQ1OSAxNDNUNDIgMjUwUTQyIDMyMiA2NCAzNzJUMTIxIDQ1NFQyMDIgNTAwVDI5NCA1MTRRMzUwIDUxNCAzOTQgNDk1VDQ2OSA0NDFUNTE2IDM1N1Q1MzIgMjQ3Wk00MDQgMjk1UTQwNCAzNDYgMzc4IDM4MFQyOTYgNDE0UTI2NiA0MTQgMjQ1IDQwNVQyMDkgMzc5VDE4OSAzNDFUMTgyIDI5NUg0MDRaTTI5NCA1NjVMMjEwIDYxMEwzNDkgNzQyTDQ5MCA2ODNMMjk0IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVBOyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTUzMiAyNDdRNTMyIDI0MiA1MzIgMjMwVDUzMCAyMDZIMTgxUTE4MSAxNTIgMjEzIDEyNFQzMTEgOTVRMzUyIDk1IDM4NiAxMDVUNDYwIDEzN0w1MDUgNDNRNDU2IDE0IDQwOCAyVDMwNCAtMTFRMjM5IC0xMSAxOTAgN1QxMDggNjBUNTkgMTQzVDQyIDI1MFE0MiAzMjIgNjQgMzcyVDEyMSA0NTRUMjAyIDUwMFQyOTQgNTE0UTM1MCA1MTQgMzk0IDQ5NVQ0NjkgNDQxVDUxNiAzNTdUNTMyIDI0N1pNNDA0IDI5NVE0MDQgMzQ2IDM3OCAzODBUMjk2IDQxNFEyNjYgNDE0IDI0NSA0MDVUMjA5IDM3OVQxODkgMzQxVDE4MiAyOTVINDA0Wk00MjAgNTYxTDI5NSA2MzVMMTY4IDU2MUwxMTIgNjQwTDI5MyA3MzhMNDc3IDY0MEw0MjAgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUI7IiBob3Jpei1hZHYteD0iNTczIiBkPSJNNTMyIDI0N1E1MzIgMjQyIDUzMiAyMzBUNTMwIDIwNkgxODFRMTgxIDE1MiAyMTMgMTI0VDMxMSA5NVEzNTIgOTUgMzg2IDEwNVQ0NjAgMTM3TDUwNSA0M1E0NTYgMTQgNDA4IDJUMzA0IC0xMVEyMzkgLTExIDE5MCA3VDEwOCA2MFQ1OSAxNDNUNDIgMjUwUTQyIDMyMiA2NCAzNzJUMTIxIDQ1NFQyMDIgNTAwVDI5NCA1MTRRMzUwIDUxNCAzOTQgNDk1VDQ2OSA0NDFUNTE2IDM1N1Q1MzIgMjQ3Wk00MDQgMjk1UTQwNCAzNDYgMzc4IDM4MFQyOTYgNDE0UTI2NiA0MTQgMjQ1IDQwNVQyMDkgMzc5VDE4OSAzNDFUMTgyIDI5NUg0MDRaTTQ4MCA2MzlRNDgwIDYxMCA0NjAgNTkwVDQxMSA1NjlRMzgyIDU2OSAzNjIgNTg5VDM0MSA2MzlRMzQxIDY2OCAzNjEgNjg4VDQxMSA3MDhRNDQwIDcwOCA0NjAgNjg4VDQ4MCA2MzlaTTI1NyA2MzlRMjU3IDYxMCAyMzcgNTkwVDE4OCA1NjlRMTU5IDU2OSAxMzkgNTg5VDExOSA2MzlRMTE5IDY2OCAxMzkgNjg4VDE4OCA3MDhRMjE3IDcwOCAyMzcgNjg4VDI1NyA2MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQzsiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik02MyAwVjUwMkgyMDRWMEg2M1pNMTM0IDU2NUwtNjIgNjgzTDc5IDc0MUwyMTggNjEwTDEzNCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRDsiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik02MyAwVjUwMkgyMDRWMEg2M1pNMTM0IDU2NUw1MCA2MTBMMTg5IDc0MkwzMzAgNjgzTDEzNCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRTsiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik02MyAwVjUwMkgyMDRWMEg2M1pNMjYxIDU2MUwxMzYgNjM1TDkgNTYxTC00NyA2NDBMMTM0IDczOEwzMTggNjQwTDI2MSA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRjsiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik02MyAwVjUwMkgyMDRWMEg2M1pNMzE1IDYzOVEzMTUgNjEwIDI5NSA1OTBUMjQ2IDU2OVEyMTcgNTY5IDE5NyA1ODlUMTc2IDYzOVExNzYgNjY4IDE5NiA2ODhUMjQ2IDcwOFEyNzUgNzA4IDI5NSA2ODhUMzE1IDYzOVpNOTIgNjM5UTkyIDYxMCA3MiA1OTBUMjMgNTY5US02IDU2OSAtMjYgNTg5VC00NiA2MzlRLTQ2IDY2OCAtMjYgNjg4VDIzIDcwOFE1MiA3MDggNzIgNjg4VDkyIDYzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYwOyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTQ1NiA2MTFRNDc2IDU3NSA0OTEgNTM0VDUxNSA0NTBUNTI5IDM2OFQ1MzQgMjk3UTUzNCAxNDggNDcxIDcwVDI3NyAtMTBRMjI0IC0xMCAxODEgN1QxMDcgNTZUNTkgMTM2VDQyIDI0M1E0MiAzNTYgOTYgNDE3VDI1NCA0NzhRMzAwIDQ3OCAzMjggNDY4VDM3NiA0MzNIMzgwUTM3OCA0NjIgMzY4IDQ5NlQzMzkgNTYyTDIyOCA1MTdMMTk1IDU4OEwyOTYgNjI5UTI4NCA2NDYgMjcxIDY2MFQyMzcgNjkxTDM2MyA3MjVRMzY3IDcyMSAzNzMgNzE1VDM4NyA3MDFUNDAwIDY4OFQ0MDkgNjc3TDQ4MSA3MTBMNTE2IDYzOUw0NTYgNjExWk0zOTQgMjQwUTM5NCAyNzUgMzkwIDMwMlQzNzMgMzQ3VDM0MCAzNzVUMjg3IDM4NVEyNTUgMzg1IDIzNSAzNzZUMjAzIDM0OFQxODcgMzAzVDE4MiAyNDNRMTgyIDE2NSAyMDUgMTMwVDI4OSA5NVEzNDkgOTUgMzcxIDEzMVQzOTQgMjQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjE7IiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBWMjgxUTM4OSAzMDYgMzg2IDMyN1QzNzQgMzYzVDM0OCAzODZUMzAyIDM5NVEyMDQgMzk1IDIwNCAzMDBWMEg2M1Y1MDJIMTg1TDE5NCA0NDJIMTk2UTIyNCA0ODIgMjYwIDQ5N1QzNDYgNTEzUTM5OCA1MTMgNDMzIDQ5OVQ0ODkgNDU3VDUyMCAzOTBUNTMwIDMwM1YwSDM4OVpNNDg5IDY1NVE0NzUgNjEwIDQ0MyA1ODlUMzc2IDU2N1EzNTMgNTY3IDMzNSA1NzNUMzAwIDU4OFQyNjkgNjAzVDIzOSA2MTBRMjIyIDYxMCAyMDYgNjAxVDE3OCA1NjZMMTEzIDYxOVExMzQgNjY5IDE2MSA2ODdUMjI1IDcwNlEyNDYgNzA2IDI2NCA2OTlUMjk5IDY4NFQzMzEgNjY5VDM2MyA2NjJRMzgwIDY2MiAzOTYgNjcxVDQyMiA3MDZMNDg5IDY1NUg0ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMjsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik00MiAyNTFRNDIgMzA2IDU2IDM1M1QxMDIgNDM2VDE4MiA0OTJUMzAwIDUxM1E0MjggNTEzIDQ5MyA0NDRUNTU5IDI1MVE1NTkgMTkzIDU0MyAxNDVUNDk1IDYyVDQxNSA4VDMwMCAtMTFRMjM1IC0xMSAxODcgOFQxMDYgNjFUNTggMTQ0VDQyIDI1MVpNMTg1IDI1MVExODUgMTc2IDIxMCAxMzZUMzAxIDk1UTM2NSA5NSAzOTAgMTM1VDQxNiAyNTFRNDE2IDMyNSAzOTEgMzY0VDMwMSA0MDNRMjM2IDQwMyAyMTEgMzY0VDE4NSAyNTFaTTMxMyA1NjVMMTE3IDY4M0wyNTggNzQxTDM5NyA2MTBMMzEzIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYzOyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTQyIDI1MVE0MiAzMDYgNTYgMzUzVDEwMiA0MzZUMTgyIDQ5MlQzMDAgNTEzUTQyOCA1MTMgNDkzIDQ0NFQ1NTkgMjUxUTU1OSAxOTMgNTQzIDE0NVQ0OTUgNjJUNDE1IDhUMzAwIC0xMVEyMzUgLTExIDE4NyA4VDEwNiA2MVQ1OCAxNDRUNDIgMjUxWk0xODUgMjUxUTE4NSAxNzYgMjEwIDEzNlQzMDEgOTVRMzY1IDk1IDM5MCAxMzVUNDE2IDI1MVE0MTYgMzI1IDM5MSAzNjRUMzAxIDQwM1EyMzYgNDAzIDIxMSAzNjRUMTg1IDI1MVpNMzA0IDU2NUwyMjAgNjEwTDM1OSA3NDJMNTAwIDY4M0wzMDQgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjQ7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNDIgMjUxUTQyIDMwNiA1NiAzNTNUMTAyIDQzNlQxODIgNDkyVDMwMCA1MTNRNDI4IDUxMyA0OTMgNDQ0VDU1OSAyNTFRNTU5IDE5MyA1NDMgMTQ1VDQ5NSA2MlQ0MTUgOFQzMDAgLTExUTIzNSAtMTEgMTg3IDhUMTA2IDYxVDU4IDE0NFQ0MiAyNTFaTTE4NSAyNTFRMTg1IDE3NiAyMTAgMTM2VDMwMSA5NVEzNjUgOTUgMzkwIDEzNVQ0MTYgMjUxUTQxNiAzMjUgMzkxIDM2NFQzMDEgNDAzUTIzNiA0MDMgMjExIDM2NFQxODUgMjUxWk00MjggNTYxTDMwMyA2MzVMMTc2IDU2MUwxMjAgNjQwTDMwMSA3MzhMNDg1IDY0MEw0MjggNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjU7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNDIgMjUxUTQyIDMwNiA1NiAzNTNUMTAyIDQzNlQxODIgNDkyVDMwMCA1MTNRNDI4IDUxMyA0OTMgNDQ0VDU1OSAyNTFRNTU5IDE5MyA1NDMgMTQ1VDQ5NSA2MlQ0MTUgOFQzMDAgLTExUTIzNSAtMTEgMTg3IDhUMTA2IDYxVDU4IDE0NFQ0MiAyNTFaTTE4NSAyNTFRMTg1IDE3NiAyMTAgMTM2VDMwMSA5NVEzNjUgOTUgMzkwIDEzNVQ0MTYgMjUxUTQxNiAzMjUgMzkxIDM2NFQzMDEgNDAzUTIzNiA0MDMgMjExIDM2NFQxODUgMjUxWk00OTAgNjU1UTQ3NiA2MTAgNDQ0IDU4OVQzNzcgNTY3UTM1NCA1NjcgMzM2IDU3M1QzMDEgNTg4VDI3MCA2MDNUMjQwIDYxMFEyMjMgNjEwIDIwNyA2MDFUMTc5IDU2NkwxMTQgNjE5UTEzNSA2NjkgMTYyIDY4N1QyMjYgNzA2UTI0NyA3MDYgMjY1IDY5OVQzMDAgNjg0VDMzMiA2NjlUMzY0IDY2MlEzODEgNjYyIDM5NyA2NzFUNDIzIDcwNkw0OTAgNjU1SDQ5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY2OyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTQyIDI1MVE0MiAzMDYgNTYgMzUzVDEwMiA0MzZUMTgyIDQ5MlQzMDAgNTEzUTQyOCA1MTMgNDkzIDQ0NFQ1NTkgMjUxUTU1OSAxOTMgNTQzIDE0NVQ0OTUgNjJUNDE1IDhUMzAwIC0xMVEyMzUgLTExIDE4NyA4VDEwNiA2MVQ1OCAxNDRUNDIgMjUxWk0xODUgMjUxUTE4NSAxNzYgMjEwIDEzNlQzMDEgOTVRMzY1IDk1IDM5MCAxMzVUNDE2IDI1MVE0MTYgMzI1IDM5MSAzNjRUMzAxIDQwM1EyMzYgNDAzIDIxMSAzNjRUMTg1IDI1MVpNNDgwIDYzOVE0ODAgNjEwIDQ2MCA1OTBUNDExIDU2OVEzODIgNTY5IDM2MiA1ODlUMzQxIDYzOVEzNDEgNjY4IDM2MSA2ODhUNDExIDcwOFE0NDAgNzA4IDQ2MCA2ODhUNDgwIDYzOVpNMjU3IDYzOVEyNTcgNjEwIDIzNyA1OTBUMTg4IDU2OVExNTkgNTY5IDEzOSA1ODlUMTE5IDYzOVExMTkgNjY4IDEzOSA2ODhUMTg4IDcwOFEyMTcgNzA4IDIzNyA2ODhUMjU3IDYzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY3OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTQ1IDIxMVYzMjlINTY4VjIxMUg0NVpNMjI0IDcwUTIyNCAxMDQgMjQ3IDEyOFQzMDYgMTUyUTM0MCAxNTIgMzY0IDEyOFQzODggNzBRMzg4IDM1IDM2NCAxMVQzMDYgLTEzUTI3MSAtMTMgMjQ4IDExVDIyNCA3MFpNMjI0IDQ3N1EyMjQgNTExIDI0NyA1MzVUMzA2IDU1OVEzNDAgNTU5IDM2NCA1MzVUMzg4IDQ3N1EzODggNDQyIDM2NCA0MThUMzA2IDM5NFEyNzEgMzk0IDI0OCA0MThUMjI0IDQ3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY4OyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTUxMCA0MjRRNTM2IDM5MCA1NDcgMzQ2VDU1OSAyNTFRNTU5IDE5MyA1NDQgMTQ1VDQ5NiA2MlQ0MTYgOFQzMDEgLTExUTIwNSAtMTEgMTQzIDMzTDkxIC0yM0wzMSA0MUw4MCA5NVE2MCAxMjcgNTEgMTY2VDQyIDI1MVE0MiAzMDYgNTYgMzUzVDEwMiA0MzZUMTgzIDQ5MlQzMDEgNTEzUTM4NCA1MTMgNDQxIDQ4Mkw0OTggNTM5TDU2MyA0ODBMNTEwIDQyNFpNMzYwIDM3OVEzNDkgMzkwIDMzNCAzOTVUMzAxIDQwMFEyMzYgNDAwIDIxMSAzNjJUMTg1IDI1MVExODUgMjQwIDE4NiAyMjJUMTkxIDE5M0wzNjAgMzc5Wk00MTYgMjUxUTQxNiAyNjggNDE0IDI4OVQ0MDYgMzI0TDIyNCAxMjlRMjM1IDExNCAyNTcgMTA2VDMwMiA5OFEzNjUgOTggMzkwIDEzNlQ0MTYgMjUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjk7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBIMzk4Wk0yOTQgNTY1TDk4IDY4M0wyMzkgNzQxTDM3OCA2MTBMMjk0IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZBOyIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTM5OCAwTDM5MCA1OEgzODZRMzY0IDI1IDMyOSA3VDI0MiAtMTJRMjAwIC0xMiAxNjcgLTNUMTEwIDI5VDc1IDkwVDYzIDE4OFY1MDJIMjA0VjIzNFEyMDQgMjA1IDIwNiAxODFUMjE2IDE0MVQyNDEgMTE1VDI4OCAxMDZRMzQ1IDEwNiAzNjIgMTMyVDM4MCAyMDdWNTAySDUyMVYwSDM5OFpNMjg0IDU2NUwyMDAgNjEwTDMzOSA3NDJMNDgwIDY4M0wyODQgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkI7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBIMzk4Wk00MjEgNTYxTDI5NiA2MzVMMTY5IDU2MUwxMTMgNjQwTDI5NCA3MzhMNDc4IDY0MEw0MjEgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkM7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBIMzk4Wk00NzQgNjM5UTQ3NCA2MTAgNDU0IDU5MFQ0MDUgNTY5UTM3NiA1NjkgMzU2IDU4OVQzMzUgNjM5UTMzNSA2NjggMzU1IDY4OFQ0MDUgNzA4UTQzNCA3MDggNDU0IDY4OFQ0NzQgNjM5Wk0yNTEgNjM5UTI1MSA2MTAgMjMxIDU5MFQxODIgNTY5UTE1MyA1NjkgMTMzIDU4OVQxMTMgNjM5UTExMyA2NjggMTMzIDY4OFQxODIgNzA4UTIxMSA3MDggMjMxIDY4OFQyNTEgNjM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkQ7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMzM1IC0yMVEzMTAgLTgzIDI5MCAtMTIzVDI0NyAtMTg2VDE5MiAtMjE3VDExNSAtMjI2UTEwMSAtMjI2IDgzIC0yMjVUNDAgLTIyMVYtMTA0UTQ3IC0xMDYgNjAgLTEwNlQ5NiAtMTA3UTExNiAtMTA3IDEyOCAtMTA0VDE1MCAtOTRUMTY1IC03NlQxNzkgLTQ3TDIwMyAxMUw3IDUwMkgxNjBMMjc0IDE1NEgyNzhMMzkxIDUwMkg1NDJMMzM1IC0yMVpNMjc1IDU2NUwxOTEgNjEwTDMzMCA3NDJMNDcxIDY4M0wyNzUgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTQ4IDI1NlE1NDggMTk3IDUzMyAxNDhUNDkwIDY0VDQyMCA5VDMyNiAtMTFRMjg0IC0xMSAyNTggM1QyMDggNDZIMjA0Vi0yMjBINjNWNzAwSDE5NFY0NTBIMTk4UTIyNSA0ODQgMjU4IDQ5OFQzMzYgNTEzUTM4OCA1MTMgNDI4IDQ5NVQ0OTQgNDQyVDUzNCAzNjFUNTQ4IDI1NlpNNDA1IDI1NVE0MDUgMzMxIDM4NCAzNjlUMjk5IDQwN1EyNDkgNDA3IDIyNyAzODZUMjA0IDMxOFYyMDlRMjA0IDE0OSAyMjUgMTIyVDI5NyA5NVEzNTcgOTUgMzgxIDEzNlQ0MDUgMjU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkY7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMzM1IC0yMVEzMTAgLTgzIDI5MCAtMTIzVDI0NyAtMTg2VDE5MiAtMjE3VDExNSAtMjI2UTEwMSAtMjI2IDgzIC0yMjVUNDAgLTIyMVYtMTA0UTQ3IC0xMDYgNjAgLTEwNlQ5NiAtMTA3UTExNiAtMTA3IDEyOCAtMTA0VDE1MCAtOTRUMTY1IC03NlQxNzkgLTQ3TDIwMyAxMUw3IDUwMkgxNjBMMjc0IDE1NEgyNzhMMzkxIDUwMkg1NDJMMzM1IC0yMVpNNDYwIDYzOVE0NjAgNjEwIDQ0MCA1OTBUMzkxIDU2OVEzNjIgNTY5IDM0MiA1ODlUMzIxIDYzOVEzMjEgNjY4IDM0MSA2ODhUMzkxIDcwOFE0MjAgNzA4IDQ0MCA2ODhUNDYwIDYzOVpNMjM3IDYzOVEyMzcgNjEwIDIxNyA1OTBUMTY4IDU2OVExMzkgNTY5IDExOSA1ODlUOTkgNjM5UTk5IDY2OCAxMTkgNjg4VDE2OCA3MDhRMTk3IDcwOCAyMTcgNjg4VDIzNyA2MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDA7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMzIDBMNDgwIDE0MEgyMTdMMTYzIDBIMTJMMjY5IDY3MEg0MjVMNjg5IDBINTMzWk0zNDggNTI1SDM0NEwyNTEgMjU4SDQ0M0wzNDggNTI1Wk0xODUgNzI3VjgxNEg1MDhWNzI3SDE4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMTsiIGhvcml6LWFkdi14PSI1NjIiIGQ9Ik00NDYgLTEzUTQyMCAtNiA0MDAgN1QzNjggNDdIMzY2UTMyOSAxOCAyODkgM1QyMDAgLTEyUTE2NCAtMTIgMTM0IC0yVDgzIDI3VDQ5IDc0VDM2IDE0MVEzNiAyMDMgNjcgMjM5VDE0NiAyOTRUMjQ4IDMxOFQzNTAgMzIzVjM1NFEzNDkgMzg2IDMzMCAzOThUMjc1IDQxMVEyMjYgNDExIDE3OSAzOTdUOTIgMzU5TDQ4IDQ1M1ExMDcgNDgyIDE2NCA0OTdUMjg5IDUxM1EzNDQgNTEzIDM4MiA1MDJUNDQ1IDQ2N1Q0ODAgNDA0VDQ5MSAzMTFWMTM1UTQ5MSAxMTAgNTAzIDk3VDUzNSA3M0w0NDYgLTEzWk0zNTMgMjQ1UTMyOCAyNDUgMjk3IDI0M1QyMzkgMjMyVDE5MiAyMDRUMTczIDE1MVExNzMgMTE5IDE5MiAxMDFUMjQzIDgyUTI3NSA4MiAzMDEgOTJUMzUzIDEyMVYyNDVaTTExMSA1ODdWNjc0SDQzNFY1ODdIMTExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAyOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMyAwTDQ4MCAxNDBIMjE3TDE2MyAwSDEyTDI2OSA2NzBINDI1TDY4OSAwSDUzM1pNMzQ4IDUyNUgzNDRMMjUxIDI1OEg0NDNMMzQ4IDUyNVpNNTE5IDg0NlE1MTQgODAxIDQ5NSA3NzRUNDUxIDczMVQzOTcgNzEwVDM0NCA3MDVRMzIwIDcwNSAyOTIgNzEwVDI0MCA3MzBUMTk3IDc3M1QxNzMgODQ2SDI3MFEyNzMgODIwIDI5MCA3OTlUMzQ1IDc3OFEzODEgNzc4IDQwMCA3OTlUNDIxIDg0Nkg1MTlINTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAzOyIgaG9yaXotYWR2LXg9IjU2MiIgZD0iTTQ0NiAtMTNRNDIwIC02IDQwMCA3VDM2OCA0N0gzNjZRMzI5IDE4IDI4OSAzVDIwMCAtMTJRMTY0IC0xMiAxMzQgLTJUODMgMjdUNDkgNzRUMzYgMTQxUTM2IDIwMyA2NyAyMzlUMTQ2IDI5NFQyNDggMzE4VDM1MCAzMjNWMzU0UTM0OSAzODYgMzMwIDM5OFQyNzUgNDExUTIyNiA0MTEgMTc5IDM5N1Q5MiAzNTlMNDggNDUzUTEwNyA0ODIgMTY0IDQ5N1QyODkgNTEzUTM0NCA1MTMgMzgyIDUwMlQ0NDUgNDY3VDQ4MCA0MDRUNDkxIDMxMVYxMzVRNDkxIDExMCA1MDMgOTdUNTM1IDczTDQ0NiAtMTNaTTM1MyAyNDVRMzI4IDI0NSAyOTcgMjQzVDIzOSAyMzJUMTkyIDIwNFQxNzMgMTUxUTE3MyAxMTkgMTkyIDEwMVQyNDMgODJRMjc1IDgyIDMwMSA5MlQzNTMgMTIxVjI0NVpNNDQxIDcwNlE0MzYgNjYxIDQxNyA2MzRUMzczIDU5MVQzMTkgNTcwVDI2NiA1NjVRMjQyIDU2NSAyMTQgNTcwVDE2MiA1OTBUMTE5IDYzM1Q5NSA3MDZIMTkyUTE5NSA2ODAgMjEyIDY1OVQyNjcgNjM4UTMwMyA2MzggMzIyIDY1OVQzNDMgNzA2SDQ0MUg0NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDQ7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjExIDBRNTY2IC0zMyA1NTEgLTU5VDUzNiAtMTA2UTUzNiAtMTMyIDU1MCAtMTQ0VDU4NCAtMTU2UTYwNCAtMTU2IDYxNSAtMTUxVDYzNiAtMTQxTDY1OSAtMjE5UTY1MiAtMjIyIDY0MSAtMjI2VDYxNiAtMjMzVDU4NyAtMjM5VDU1OSAtMjQxUTQ5OSAtMjQxIDQ2OSAtMjEyVDQzOCAtMTMyUTQzOCAtOTEgNDY1IC01N1Q1MzIgMUw0ODAgMTQwSDIxN0wxNjMgMEgxMkwyNjkgNjcwSDQyNUw2ODkgMEg2MTFaTTM0NyA1MjVIMzQ1TDI1MSAyNThINDQzTDM0NyA1MjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDU7IiBob3Jpei1hZHYteD0iNTYyIiBkPSJNNDQ1IC0xM1E0MTAgLTQyIDM5OCAtNjRUMzg2IC0xMDZRMzg2IC0xMzEgNDAwIC0xNDNUNDMzIC0xNTZRNDUzIC0xNTYgNDY1IC0xNTFUNDg2IC0xNDFMNTA5IC0yMTlRNDk1IC0yMjYgNDY2IC0yMzNUNDA4IC0yNDFRMzQ4IC0yNDEgMzE4IC0yMTFUMjg4IC0xMzFRMjg4IC04NyAzMTkgLTUxVDM5NCA5UTM3OCAyMSAzNjggNDdIMzY2UTMyOSAxOCAyODkgM1QyMDAgLTEyUTE2NCAtMTIgMTM0IC0yVDgzIDI3VDQ5IDc0VDM2IDE0MVEzNiAyMDMgNjcgMjM5VDE0NiAyOTRUMjQ4IDMxOFQzNTAgMzIzVjM1NFEzNDkgMzg2IDMzMCAzOThUMjc1IDQxMVEyMjYgNDExIDE3OSAzOTdUOTIgMzU5TDQ4IDQ1M1ExMDcgNDgyIDE2NCA0OTdUMjg5IDUxM1EzNDQgNTEzIDM4MiA1MDJUNDQ1IDQ2N1Q0ODAgNDA0VDQ5MSAzMTFWMTM1UTQ5MSAxMDkgNTAzIDk2VDUzNiA3MUw0NDUgLTEzWk0zNTMgMjQ1UTMyOCAyNDUgMjk3IDI0M1QyMzkgMjMyVDE5MiAyMDRUMTczIDE1MVExNzMgMTE5IDE5MiAxMDFUMjQzIDgyUTI3NSA4MiAzMDEgOTJUMzUzIDEyMVYyNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDY7IiBob3Jpei1hZHYteD0iNjY1IiBkPSJNNjQwIDk2UTU4MiA0MSA1MjAgMTVUMzg1IC0xMVEyOTkgLTExIDIzNyAxNFQxMzUgODVUNzYgMTk1VDU2IDMzOFE1NiA0MTQgNzcgNDc3VDE0MCA1ODRUMjQyIDY1M1QzODEgNjc4UTQ1NiA2NzggNTE3IDY1MlQ2MzYgNTY3TDU0NyA0NzRRNTA5IDUxNiA0NzEgNTM1VDM4NyA1NTVRMzAwIDU1NSAyNTQgNTAzVDIwOCAzMzdRMjA4IDIzMiAyNTAgMTcxVDM4NiAxMTBRNDM0IDExMCA0NzYgMTMwVDU2MSAxOTNMNjQwIDk2SDY0MFpNMzYyIDcxMEwyNzggNzU1TDQxNyA4ODdMNTU4IDgyOEwzNjIgNzEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA3OyIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTQzNyAzNTBRNDEwIDM3OCAzODAgMzkxVDMxMCA0MDRRMjc1IDQwNCAyNTIgMzkyVDIxMyAzNjBUMTkyIDMxMlQxODUgMjUzUTE4NSAyMjEgMTkxIDE5M1QyMTMgMTQzVDI1MSAxMTBUMzEwIDk3UTM1MCA5NyAzODMgMTA3VDQ1MSAxNDdMNDk2IDU0UTQ1MSAyMiA0MDUgNVQzMDEgLTEyUTE4MCAtMTIgMTExIDU2VDQyIDI0NlE0MiAzMDggNjAgMzU3VDExMiA0NDFUMTk0IDQ5NFQzMDUgNTEzUTM1NiA1MTMgNDA2IDQ5NFQ0OTggNDQxTDQzNyAzNTBaTTI5MCA1NjVMMjA2IDYxMEwzNDUgNzQyTDQ4NiA2ODNMMjkwIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik02NDAgOTZRNTgyIDQxIDUyMCAxNVQzODUgLTExUTI5OSAtMTEgMjM3IDE0VDEzNSA4NVQ3NiAxOTVUNTYgMzM4UTU2IDQxNCA3NyA0NzdUMTQwIDU4NFQyNDIgNjUzVDM4MSA2NzhRNDU2IDY3OCA1MTcgNjUyVDYzNiA1NjdMNTQ3IDQ3NFE1MDkgNTE2IDQ3MSA1MzVUMzg3IDU1NVEzMDAgNTU1IDI1NCA1MDNUMjA4IDMzN1EyMDggMjMyIDI1MCAxNzFUMzg2IDExMFE0MzQgMTEwIDQ3NiAxMzBUNTYxIDE5M0w2NDAgOTZINjQwWk01MDcgNzA0TDM4MiA3NzhMMjU1IDcwNEwxOTkgNzgzTDM4MCA4ODFMNTY0IDc4M0w1MDcgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA5OyIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTQzNyAzNTBRNDEwIDM3OCAzODAgMzkxVDMxMCA0MDRRMjc1IDQwNCAyNTIgMzkyVDIxMyAzNjBUMTkyIDMxMlQxODUgMjUzUTE4NSAyMjEgMTkxIDE5M1QyMTMgMTQzVDI1MSAxMTBUMzEwIDk3UTM1MCA5NyAzODMgMTA3VDQ1MSAxNDdMNDk2IDU0UTQ1MSAyMiA0MDUgNVQzMDEgLTEyUTE4MCAtMTIgMTExIDU2VDQyIDI0NlE0MiAzMDggNjAgMzU3VDExMiA0NDFUMTk0IDQ5NFQzMDUgNTEzUTM1NiA1MTMgNDA2IDQ5NFQ0OTggNDQxTDQzNyAzNTBaTTQxOCA1NjFMMjkzIDYzNUwxNjYgNTYxTDExMCA2NDBMMjkxIDczOEw0NzUgNjQwTDQxOCA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEE7IiBob3Jpei1hZHYteD0iNjY1IiBkPSJNNjQwIDk2UTU4MiA0MSA1MjAgMTVUMzg1IC0xMVEyOTkgLTExIDIzNyAxNFQxMzUgODVUNzYgMTk1VDU2IDMzOFE1NiA0MTQgNzcgNDc3VDE0MCA1ODRUMjQyIDY1M1QzODEgNjc4UTQ1NiA2NzggNTE3IDY1MlQ2MzYgNTY3TDU0NyA0NzRRNTA5IDUxNiA0NzEgNTM1VDM4NyA1NTVRMzAwIDU1NSAyNTQgNTAzVDIwOCAzMzdRMjA4IDIzMiAyNTAgMTcxVDM4NiAxMTBRNDM0IDExMCA0NzYgMTMwVDU2MSAxOTNMNjQwIDk2SDY0MFpNNDYxIDc4NlE0NjEgNzU0IDQzOSA3MzVUMzc4IDcxNlEzNDAgNzE2IDMxNyA3MzVUMjk0IDc4NlEyOTQgODE4IDMxNyA4MzZUMzc4IDg1NVE0MTYgODU1IDQzOCA4MzdUNDYxIDc4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQjsiIGhvcml6LWFkdi14PSI1MTkiIGQ9Ik00MzcgMzUwUTQxMCAzNzggMzgwIDM5MVQzMTAgNDA0UTI3NSA0MDQgMjUyIDM5MlQyMTMgMzYwVDE5MiAzMTJUMTg1IDI1M1ExODUgMjIxIDE5MSAxOTNUMjEzIDE0M1QyNTEgMTEwVDMxMCA5N1EzNTAgOTcgMzgzIDEwN1Q0NTEgMTQ3TDQ5NiA1NFE0NTEgMjIgNDA1IDVUMzAxIC0xMlExODAgLTEyIDExMSA1NlQ0MiAyNDZRNDIgMzA4IDYwIDM1N1QxMTIgNDQxVDE5NCA0OTRUMzA1IDUxM1EzNTYgNTEzIDQwNiA0OTRUNDk4IDQ0MUw0MzcgMzUwWk0zNzcgNjM5UTM3NyA2MDcgMzU1IDU4OFQyOTQgNTY5UTI1NiA1NjkgMjMzIDU4OFQyMTAgNjM5UTIxMCA2NzEgMjMzIDY4OVQyOTQgNzA4UTMzMiA3MDggMzU0IDY5MFQzNzcgNjM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBDOyIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTY0MCA5NlE1ODIgNDEgNTIwIDE1VDM4NSAtMTFRMjk5IC0xMSAyMzcgMTRUMTM1IDg1VDc2IDE5NVQ1NiAzMzhRNTYgNDE0IDc3IDQ3N1QxNDAgNTg0VDI0MiA2NTNUMzgxIDY3OFE0NTYgNjc4IDUxNyA2NTJUNjM2IDU2N0w1NDcgNDc0UTUwOSA1MTYgNDcxIDUzNVQzODcgNTU1UTMwMCA1NTUgMjU0IDUwM1QyMDggMzM3UTIwOCAyMzIgMjUwIDE3MVQzODYgMTEwUTQzNCAxMTAgNDc2IDEzMFQ1NjEgMTkzTDY0MCA5Nkg2NDBaTTU0NiA4MDhMMzc4IDcxMUwyMDggODA4TDI2MSA4ODNMMzc2IDgxNEw0OTMgODgzTDU0NiA4MDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEQ7IiBob3Jpei1hZHYteD0iNTE5IiBkPSJNNDM3IDM1MFE0MTAgMzc4IDM4MCAzOTFUMzEwIDQwNFEyNzUgNDA0IDI1MiAzOTJUMjEzIDM2MFQxOTIgMzEyVDE4NSAyNTNRMTg1IDIyMSAxOTEgMTkzVDIxMyAxNDNUMjUxIDExMFQzMTAgOTdRMzUwIDk3IDM4MyAxMDdUNDUxIDE0N0w0OTYgNTRRNDUxIDIyIDQwNSA1VDMwMSAtMTJRMTgwIC0xMiAxMTEgNTZUNDIgMjQ2UTQyIDMwOCA2MCAzNTdUMTEyIDQ0MVQxOTQgNDk0VDMwNSA1MTNRMzU2IDUxMyA0MDYgNDk0VDQ5OCA0NDFMNDM3IDM1MFpNNDY5IDY2MkwzMDEgNTY1TDEzMSA2NjJMMTg0IDczN0wyOTkgNjY4TDQxNiA3MzdMNDY5IDY2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRTsiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik02NDggMzM3UTY0OCAyNTAgNjI0IDE4N1Q1NTYgODJUNDQ3IDIwVDMwMyAwSDczVjY2MlExMjIgNjY3IDE4MiA2NzFUMzA1IDY3NVEzODAgNjc1IDQ0MyA2NTZUNTUxIDU5NVQ2MjIgNDkwVDY0OCAzMzdaTTQ5NiAzNDBRNDk2IDM4MCA0ODkgNDE5VDQ2MiA0OTBUNDA2IDU0MVQzMDkgNTYxUTI4OCA1NjEgMjY1IDU2MFQyMTkgNTU3VjExN1EyNDIgMTE2IDI1NyAxMTZUMjkxIDExNlEzMzkgMTE2IDM3NyAxMjVUNDQxIDE2MFQ0ODIgMjI5VDQ5NiAzNDBaTTQ3NCA4MDJMMzA2IDcwNUwxMzYgODAyTDE4OSA4NzdMMzA0IDgwOEw0MjEgODc3TDQ3NCA4MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEY7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNDExIDBMNDAyIDY3SDM5OFEzNzYgMjYgMzM3IDhUMjUyIC0xMVExOTUgLTExIDE1NSAxMVQ5MCA3MVQ1NCAxNTZUNDIgMjU2UTQyIDMwNyA1MyAzNTNUOTAgNDM1VDE1NSA0OTJUMjUyIDUxM1EyOTEgNTEzIDMyNCA1MDFUMzgyIDQ1NUgzODZWNzAwSDUyN1YwSDQxMVpNMzg4IDMxNlEzODggMzY0IDM2MiAzODRUMjkwIDQwNVEyNTQgNDA1IDIzNCAzOTNUMjAyIDM1OVQxODggMzExVDE4NSAyNTRRMTg1IDIyNSAxODggMTk3VDIwMyAxNDVUMjM1IDEwN1QyOTIgOTJRMzQ4IDkyIDM2OCAxMjNUMzg4IDIwNlYzMTZaTTY2NSA1MThINTcxTDYwOCA3MDBINzQ2TDY2NSA1MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTA7IiBob3Jpei1hZHYteD0iNzA0IiBkPSJNNjQ4IDMzOFE2NDggMjUxIDYyNCAxODhUNTU1IDgzVDQ0MyAyMVQyOTIgMEg3NVYyODlINVY0MDhINzVWNjYyUTEzMiA2NjcgMTkwIDY3MFQzMDUgNjc0UTQ2NyA2NzQgNTU3IDU4OVQ2NDggMzM4Wk00OTkgMzQwUTQ5OSAzODYgNDkwIDQyNlQ0NjAgNDk2VDQwMiA1NDNUMzEwIDU2MFEyODcgNTYwIDI2NCA1NTlUMjE5IDU1NlY0MDhIMzczVjI4OUgyMTlWMTE3UTIzNyAxMTYgMjU1IDExNlQyOTEgMTE2UTM0OSAxMTYgMzg4IDEyOVQ0NTIgMTY5VDQ4OCAyMzlUNDk5IDM0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMTsiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik00MTEgMEw0MDIgNjdIMzk4UTM3NiAyNiAzMzcgOFQyNTIgLTExUTE5NSAtMTEgMTU1IDEwVDkwIDY3VDU0IDE1MFQ0MiAyNDlRNDIgMzAwIDUzIDM0NFQ5MCA0MjNUMTU1IDQ3NlQyNTIgNDk2UTI5MSA0OTYgMzI0IDQ4NFQzODIgNDM3SDM4NlY1NDVIMjQ3VjYzN0gzODZWNzAwSDUyN1Y2MzdINTg5VjU0NUg1MjdWMEg0MTFaTTM4OCAyOTlRMzg4IDM0NyAzNjIgMzY3VDI5MCAzODhRMjU0IDM4OCAyMzQgMzc3VDIwMiAzNDdUMTg4IDMwMVQxODUgMjQ2UTE4NSAyMTcgMTg4IDE5MFQyMDMgMTQxVDIzNSAxMDZUMjkyIDkyUTM0OCA5MiAzNjggMTIzVDM4OCAyMDZWMjk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTczIDBWNjY3SDUyOFY1NDVIMjE5VjQwNEg0OTlWMjgwSDIxOVYxMTlINTM4VjBINzNaTTEzOSA3MjdWODE0SDQ2MlY3MjdIMTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEzOyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTUzMiAyNDdRNTMyIDI0MiA1MzIgMjMwVDUzMCAyMDZIMTgxUTE4MSAxNTIgMjEzIDEyNFQzMTEgOTVRMzUyIDk1IDM4NiAxMDVUNDYwIDEzN0w1MDUgNDNRNDU2IDE0IDQwOCAyVDMwNCAtMTFRMjM5IC0xMSAxOTAgN1QxMDggNjBUNTkgMTQzVDQyIDI1MFE0MiAzMjIgNjQgMzcyVDEyMSA0NTRUMjAyIDUwMFQyOTQgNTE0UTM1MCA1MTQgMzk0IDQ5NVQ0NjkgNDQxVDUxNiAzNTdUNTMyIDI0N1pNNDA0IDI5NVE0MDQgMzQ2IDM3OCAzODBUMjk2IDQxNFEyNjYgNDE0IDI0NSA0MDVUMjA5IDM3OVQxODkgMzQxVDE4MiAyOTVINDA0Wk0xMzUgNTg3VjY3NEg0NThWNTg3SDEzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNDsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik03MyAwVjY2N0g1MjhWNTQ1SDIxOVY0MDRINDk5VjI4MEgyMTlWMTE5SDUzOFYwSDczWk00NzAgODQ2UTQ2NSA4MDEgNDQ2IDc3NFQ0MDIgNzMxVDM0OCA3MTBUMjk1IDcwNVEyNzEgNzA1IDI0MyA3MTBUMTkxIDczMFQxNDggNzczVDEyNCA4NDZIMjIxUTIyNCA4MjAgMjQxIDc5OVQyOTYgNzc4UTMzMiA3NzggMzUxIDc5OVQzNzIgODQ2SDQ3MEg0NzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTU7IiBob3Jpei1hZHYteD0iNTczIiBkPSJNNTMyIDI0N1E1MzIgMjQyIDUzMiAyMzBUNTMwIDIwNkgxODFRMTgxIDE1MiAyMTMgMTI0VDMxMSA5NVEzNTIgOTUgMzg2IDEwNVQ0NjAgMTM3TDUwNSA0M1E0NTYgMTQgNDA4IDJUMzA0IC0xMVEyMzkgLTExIDE5MCA3VDEwOCA2MFQ1OSAxNDNUNDIgMjUwUTQyIDMyMiA2NCAzNzJUMTIxIDQ1NFQyMDIgNTAwVDI5NCA1MTRRMzUwIDUxNCAzOTQgNDk1VDQ2OSA0NDFUNTE2IDM1N1Q1MzIgMjQ3Wk00MDQgMjk1UTQwNCAzNDYgMzc4IDM4MFQyOTYgNDE0UTI2NiA0MTQgMjQ1IDQwNVQyMDkgMzc5VDE4OSAzNDFUMTgyIDI5NUg0MDRaTTQ3MCA3MDZRNDY1IDY2MSA0NDYgNjM0VDQwMiA1OTFUMzQ4IDU3MFQyOTUgNTY1UTI3MSA1NjUgMjQzIDU3MFQxOTEgNTkwVDE0OCA2MzNUMTI0IDcwNkgyMjFRMjI0IDY4MCAyNDEgNjU5VDI5NiA2MzhRMzMyIDYzOCAzNTEgNjU5VDM3MiA3MDZINDcwSDQ3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNjsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik03MyAwVjY2N0g1MjhWNTQ1SDIxOVY0MDRINDk5VjI4MEgyMTlWMTE5SDUzOFYwSDczWk0zOTkgNzgyUTM5OSA3NTAgMzc3IDczMVQzMTYgNzEyUTI3OCA3MTIgMjU1IDczMVQyMzIgNzgyUTIzMiA4MTQgMjU1IDgzMlQzMTYgODUxUTM1NCA4NTEgMzc2IDgzM1QzOTkgNzgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE3OyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTUzMiAyNDdRNTMyIDI0MiA1MzIgMjMwVDUzMCAyMDZIMTgxUTE4MSAxNTIgMjEzIDEyNFQzMTEgOTVRMzUyIDk1IDM4NiAxMDVUNDYwIDEzN0w1MDUgNDNRNDU2IDE0IDQwOCAyVDMwNCAtMTFRMjM5IC0xMSAxOTAgN1QxMDggNjBUNTkgMTQzVDQyIDI1MFE0MiAzMjIgNjQgMzcyVDEyMSA0NTRUMjAyIDUwMFQyOTQgNTE0UTM1MCA1MTQgMzk0IDQ5NVQ0NjkgNDQxVDUxNiAzNTdUNTMyIDI0N1pNNDA0IDI5NVE0MDQgMzQ2IDM3OCAzODBUMjk2IDQxNFEyNjYgNDE0IDI0NSA0MDVUMjA5IDM3OVQxODkgMzQxVDE4MiAyOTVINDA0Wk0zNzkgNjM5UTM3OSA2MDcgMzU3IDU4OFQyOTYgNTY5UTI1OCA1NjkgMjM1IDU4OFQyMTIgNjM5UTIxMiA2NzEgMjM1IDY4OVQyOTYgNzA4UTMzNCA3MDggMzU2IDY5MFQzNzkgNjM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE4OyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTQ4MSAwUTQzNyAtMzMgNDIyIC01OFQ0MDcgLTEwNlE0MDcgLTEzMSA0MjEgLTE0M1Q0NTQgLTE1NlE0NzQgLTE1NiA0ODYgLTE1MVQ1MDcgLTE0MUw1MzAgLTIxOVE1MTYgLTIyNiA0ODcgLTIzM1Q0MjkgLTI0MVEzNjkgLTI0MSAzMzkgLTIxMlQzMDkgLTEzM1EzMDkgLTg4IDMzNCAtNTZUNDAwIDBINzNWNjY3SDUyOFY1NDVIMjE5VjQwNEg0OTlWMjgwSDIxOVYxMTlINTM4VjBINDgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE5OyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTUzMiAyNDdRNTMyIDI0MiA1MzIgMjMwVDUzMCAyMDZIMTgxUTE4MSAxNTIgMjEzIDEyNFQzMTEgOTVRMzUyIDk1IDM4NiAxMDVUNDYwIDEzN0w1MDUgNDNRNDg4IDMzIDQ3MiAyNVQ0NDEgOVE0MTggLTQgNDA0IC0xNlQzODMgLTQxVDM3MyAtNjVUMzcwIC04N1EzNzAgLTExMiAzODQgLTEyNlQ0MTcgLTE0MVE0MzcgLTE0MSA0NDggLTEzNlQ0NzAgLTEyNUw0OTMgLTIwNFE0ODYgLTIwNyA0NzUgLTIxMFQ0NTAgLTIxN1Q0MjEgLTIyM1QzOTIgLTIyNVEzMzIgLTIyNSAzMDIgLTE5NVQyNzIgLTExNlEyNzIgLTg3IDI4OSAtNjBUMzI5IC0xMEwzMjggLTlRMzIzIC0xMCAzMTUgLTEwVDMwMCAtMTFRMjM1IC0xMSAxODcgN1QxMDYgNjBUNTggMTQzVDQyIDI1MFE0MiAzMjIgNjQgMzcyVDEyMSA0NTRUMjAyIDUwMFQyOTQgNTE0UTM1MCA1MTQgMzk0IDQ5NVQ0NjkgNDQxVDUxNiAzNTdUNTMyIDI0N1pNNDA1IDI5MlE0MDUgMzQzIDM3OCAzNzdUMjk2IDQxMVEyNjYgNDExIDI0NSA0MDJUMjA5IDM3NlQxODggMzM4VDE4MSAyOTJINDA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFBOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTczIDBWNjY3SDUyOFY1NDVIMjE5VjQwNEg0OTlWMjgwSDIxOVYxMTlINTM4VjBINzNaTTQ2OSA4MDJMMzAxIDcwNUwxMzEgODAyTDE4NCA4NzdMMjk5IDgwOEw0MTYgODc3TDQ2OSA4MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBob3Jpei1hZHYteD0iNTczIiBkPSJNNTMyIDI0N1E1MzIgMjQyIDUzMiAyMzBUNTMwIDIwNkgxODFRMTgxIDE1MiAyMTMgMTI0VDMxMSA5NVEzNTIgOTUgMzg2IDEwNVQ0NjAgMTM3TDUwNSA0M1E0NTYgMTQgNDA4IDJUMzA0IC0xMVEyMzkgLTExIDE5MCA3VDEwOCA2MFQ1OSAxNDNUNDIgMjUwUTQyIDMyMiA2NCAzNzJUMTIxIDQ1NFQyMDIgNTAwVDI5NCA1MTRRMzUwIDUxNCAzOTQgNDk1VDQ2OSA0NDFUNTE2IDM1N1Q1MzIgMjQ3Wk00MDQgMjk1UTQwNCAzNDYgMzc4IDM4MFQyOTYgNDE0UTI2NiA0MTQgMjQ1IDQwNVQyMDkgMzc5VDE4OSAzNDFUMTgyIDI5NUg0MDRaTTQ2NiA2NjJMMjk4IDU2NUwxMjggNjYyTDE4MSA3MzdMMjk2IDY2OEw0MTMgNzM3TDQ2NiA2NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUM7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNMzg4IDEwMFE0NTYgMTAwIDQ5NyAxMzJUNTM5IDIzNlYyNThIMzgxVjM3NUg2NzZWMzAzUTY3NiAyMjggNjYwIDE3MFQ2MDggNzFUNTE3IDExVDM4MyAtMTBRMzE1IC0xMCAyNTUgMTBUMTUxIDczVDgyIDE4MFQ1NiAzMzJRNTYgNDIxIDgyIDQ4NlQxNTMgNTk0VDI1NyA2NTdUMzgyIDY3OFE0MjkgNjc4IDQ2NyA2NjhUNTM1IDY0M1Q1ODkgNjEwVDYyOSA1NzVMNTQxIDQ4MlE1MDMgNTIwIDQ2NiA1MzdUMzg4IDU1NVEyOTMgNTU1IDI1MSA0OTlUMjA4IDMzM1EyMDggMjc5IDIxNyAyMzZUMjQ4IDE2M1QzMDQgMTE3VDM4OCAxMDBaTTQ5NCA3MDFMMzY5IDc3NUwyNDIgNzAxTDE4NiA3ODBMMzY3IDg3OEw1NTEgNzgwTDQ5NCA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUQ7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTI3IDhRNTI3IC02NCA1MTIgLTExMFQ0NjYgLTE4MVQzOTQgLTIxNlQyOTcgLTIyNlEyMzQgLTIyNiAxODEgLTIxM1Q3NCAtMTcwTDExNSAtNjZRMTU5IC05MiAyMDAgLTEwNVQyOTMgLTExOVEzNDMgLTExOSAzNjUgLTEwMVQzODcgLTI5VjcxSDM4M1EzNTcgMzIgMzI5IDE4VDI1NSAzUTE5OSAzIDE1OSAyM1Q5MiA3N1Q1NCAxNTdUNDIgMjU2UTQyIDMwNyA1MyAzNTRUOTAgNDM2VDE1NSA0OTJUMjUyIDUxM1EzMDAgNTEzIDMzNiA0OThUMzk5IDQ0MUg0MDFMNDA4IDUwMkg1MjdWOFpNMzg4IDMxMlEzODggMzYxIDM2MyAzODNUMjkwIDQwNVEyNTcgNDA1IDIzNyAzOTNUMjA1IDM2MFQxODkgMzE0VDE4NSAyNjBRMTg1IDIzMiAxODkgMjA1VDIwNSAxNTdUMjM3IDEyMlQyOTAgMTA5UTMxOSAxMDkgMzM4IDExN1QzNjggMTQxVDM4MyAxNzdUMzg4IDIyNVYzMTJaTTQxOCA1NjFMMjkzIDYzNUwxNjYgNTYxTDExMCA2NDBMMjkxIDczOEw0NzUgNjQwTDQxOCA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNMzg4IDEwMFE0NTYgMTAwIDQ5NyAxMzJUNTM5IDIzNlYyNThIMzgxVjM3NUg2NzZWMzAzUTY3NiAyMjggNjYwIDE3MFQ2MDggNzFUNTE3IDExVDM4MyAtMTBRMzE1IC0xMCAyNTUgMTBUMTUxIDczVDgyIDE4MFQ1NiAzMzJRNTYgNDIxIDgyIDQ4NlQxNTMgNTk0VDI1NyA2NTdUMzgyIDY3OFE0MjkgNjc4IDQ2NyA2NjhUNTM1IDY0M1Q1ODkgNjEwVDYyOSA1NzVMNTQxIDQ4MlE1MDMgNTIwIDQ2NiA1MzdUMzg4IDU1NVEyOTMgNTU1IDI1MSA0OTlUMjA4IDMzM1EyMDggMjc5IDIxNyAyMzZUMjQ4IDE2M1QzMDQgMTE3VDM4OCAxMDBaTTU1NCA4NTVRNTQ5IDgxMCA1MzAgNzgzVDQ4NiA3NDBUNDMyIDcxOVQzNzkgNzE0UTM1NSA3MTQgMzI3IDcxOVQyNzUgNzM5VDIzMiA3ODJUMjA4IDg1NUgzMDVRMzA4IDgyOSAzMjUgODA4VDM4MCA3ODdRNDE2IDc4NyA0MzUgODA4VDQ1NiA4NTVINTU0SDU1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRjsiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik01MjcgOFE1MjcgLTY0IDUxMiAtMTEwVDQ2NiAtMTgxVDM5NCAtMjE2VDI5NyAtMjI2UTIzNCAtMjI2IDE4MSAtMjEzVDc0IC0xNzBMMTE1IC02NlExNTkgLTkyIDIwMCAtMTA1VDI5MyAtMTE5UTM0MyAtMTE5IDM2NSAtMTAxVDM4NyAtMjlWNzFIMzgzUTM1NyAzMiAzMjkgMThUMjU1IDNRMTk5IDMgMTU5IDIzVDkyIDc3VDU0IDE1N1Q0MiAyNTZRNDIgMzA3IDUzIDM1NFQ5MCA0MzZUMTU1IDQ5MlQyNTIgNTEzUTMwMCA1MTMgMzM2IDQ5OFQzOTkgNDQxSDQwMUw0MDggNTAySDUyN1Y4Wk0zODggMzEyUTM4OCAzNjEgMzYzIDM4M1QyOTAgNDA1UTI1NyA0MDUgMjM3IDM5M1QyMDUgMzYwVDE4OSAzMTRUMTg1IDI2MFExODUgMjMyIDE4OSAyMDVUMjA1IDE1N1QyMzcgMTIyVDI5MCAxMDlRMzE5IDEwOSAzMzggMTE3VDM2OCAxNDFUMzgzIDE3N1QzODggMjI1VjMxMlpNNDczIDcwNlE0NjggNjYxIDQ0OSA2MzRUNDA1IDU5MVQzNTEgNTcwVDI5OCA1NjVRMjc0IDU2NSAyNDYgNTcwVDE5NCA1OTBUMTUxIDYzM1QxMjcgNzA2SDIyNFEyMjcgNjgwIDI0NCA2NTlUMjk5IDYzOFEzMzUgNjM4IDM1NCA2NTlUMzc1IDcwNkg0NzNINDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIwOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTM4OCAxMDBRNDU2IDEwMCA0OTcgMTMyVDUzOSAyMzZWMjU4SDM4MVYzNzVINjc2VjMwM1E2NzYgMjI4IDY2MCAxNzBUNjA4IDcxVDUxNyAxMVQzODMgLTEwUTMxNSAtMTAgMjU1IDEwVDE1MSA3M1Q4MiAxODBUNTYgMzMyUTU2IDQyMSA4MiA0ODZUMTUzIDU5NFQyNTcgNjU3VDM4MiA2NzhRNDI5IDY3OCA0NjcgNjY4VDUzNSA2NDNUNTg5IDYxMFQ2MjkgNTc1TDU0MSA0ODJRNTAzIDUyMCA0NjYgNTM3VDM4OCA1NTVRMjkzIDU1NSAyNTEgNDk5VDIwOCAzMzNRMjA4IDI3OSAyMTcgMjM2VDI0OCAxNjNUMzA0IDExN1QzODggMTAwWk00NjIgNzg2UTQ2MiA3NTQgNDQwIDczNVQzNzkgNzE2UTM0MSA3MTYgMzE4IDczNVQyOTUgNzg2UTI5NSA4MTggMzE4IDgzNlQzNzkgODU1UTQxNyA4NTUgNDM5IDgzN1Q0NjIgNzg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIxOyIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTUyNyA4UTUyNyAtNjQgNTEyIC0xMTBUNDY2IC0xODFUMzk0IC0yMTZUMjk3IC0yMjZRMjM0IC0yMjYgMTgxIC0yMTNUNzQgLTE3MEwxMTUgLTY2UTE1OSAtOTIgMjAwIC0xMDVUMjkzIC0xMTlRMzQzIC0xMTkgMzY1IC0xMDFUMzg3IC0yOVY3MUgzODNRMzU3IDMyIDMyOSAxOFQyNTUgM1ExOTkgMyAxNTkgMjNUOTIgNzdUNTQgMTU3VDQyIDI1NlE0MiAzMDcgNTMgMzU0VDkwIDQzNlQxNTUgNDkyVDI1MiA1MTNRMzAwIDUxMyAzMzYgNDk4VDM5OSA0NDFINDAxTDQwOCA1MDJINTI3VjhaTTM4OCAzMTJRMzg4IDM2MSAzNjMgMzgzVDI5MCA0MDVRMjU3IDQwNSAyMzcgMzkzVDIwNSAzNjBUMTg5IDMxNFQxODUgMjYwUTE4NSAyMzIgMTg5IDIwNVQyMDUgMTU3VDIzNyAxMjJUMjkwIDEwOVEzMTkgMTA5IDMzOCAxMTdUMzY4IDE0MVQzODMgMTc3VDM4OCAyMjVWMzEyWk0zODAgNjM5UTM4MCA2MDcgMzU4IDU4OFQyOTcgNTY5UTI1OSA1NjkgMjM2IDU4OFQyMTMgNjM5UTIxMyA2NzEgMjM2IDY4OVQyOTcgNzA4UTMzNSA3MDggMzU3IDY5MFQzODAgNjM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIyOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTM4OCAxMDBRNDU2IDEwMCA0OTcgMTMyVDUzOSAyMzZWMjU4SDM4MVYzNzVINjc2VjMwM1E2NzYgMjI4IDY2MCAxNzBUNjA4IDcxVDUxNyAxMVQzODMgLTEwUTMxNSAtMTAgMjU1IDEwVDE1MSA3M1Q4MiAxODBUNTYgMzMyUTU2IDQyMSA4MiA0ODZUMTUzIDU5NFQyNTcgNjU3VDM4MiA2NzhRNDI5IDY3OCA0NjcgNjY4VDUzNSA2NDNUNTg5IDYxMFQ2MjkgNTc1TDU0MSA0ODJRNTAzIDUyMCA0NjYgNTM3VDM4OCA1NTVRMjkzIDU1NSAyNTEgNDk5VDIwOCAzMzNRMjA4IDI3OSAyMTcgMjM2VDI0OCAxNjNUMzA0IDExN1QzODggMTAwWk0zODUgLTIyNkgyODlMMzIyIC01NUg0NzFMMzg1IC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjM7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTI3IDhRNTI3IC02NCA1MTIgLTExMFQ0NjYgLTE4MVQzOTQgLTIxNlQyOTcgLTIyNlEyMzQgLTIyNiAxODEgLTIxM1Q3NCAtMTcwTDExNSAtNjZRMTU5IC05MiAyMDAgLTEwNVQyOTMgLTExOVEzNDMgLTExOSAzNjUgLTEwMVQzODcgLTI5VjcxSDM4M1EzNTcgMzIgMzI5IDE4VDI1NSAzUTE5OSAzIDE1OSAyM1Q5MiA3N1Q1NCAxNTdUNDIgMjU2UTQyIDMwNyA1MyAzNTRUOTAgNDM2VDE1NSA0OTJUMjUyIDUxM1EzMDAgNTEzIDMzNiA0OThUMzk5IDQ0MUg0MDFMNDA4IDUwMkg1MjdWOFpNMzg4IDMxMlEzODggMzYxIDM2MyAzODNUMjkwIDQwNVEyNTcgNDA1IDIzNyAzOTNUMjA1IDM2MFQxODkgMzE0VDE4NSAyNjBRMTg1IDIzMiAxODkgMjA1VDIwNSAxNTdUMjM3IDEyMlQyOTAgMTA5UTMxOSAxMDkgMzM4IDExN1QzNjggMTQxVDM4MyAxNzdUMzg4IDIyNVYzMTJaTTMxMSA3MzBINDAwTDM2OSA1NjhIMjIyTDMxMSA3MzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjQ7IiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNDc1IDBWMjgzSDIxOVYwSDczVjY2N0gyMTlWNDIwSDQ3NVY2NjdINjIxVjBINDc1Wk00ODAgNzAxTDM1NSA3NzVMMjI4IDcwMUwxNzIgNzgwTDM1MyA4NzhMNTM3IDc4MEw0ODAgNzAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI1OyIgaG9yaXotYWR2LXg9IjU5MyIgZD0iTTM4OSAwVjI4MVEzODkgMzA2IDM4NyAzMjdUMzc1IDM2M1QzNDkgMzg2VDMwMyAzOTVRMjA0IDM5NSAyMDQgMzAwVjBINjNWNzAwSDIwNFY0NTNIMjA1UTIzMCA0ODcgMjY2IDUwMFQzNDcgNTEzUTM5OCA1MTMgNDMzIDQ5OVQ0ODkgNDU3VDUyMCAzOTBUNTMwIDMwM1YwSDM4OVpNMjYxIDcwOUwxMzYgNzgzTDkgNzA5TC00NyA3ODhMMTM0IDg4NkwzMTggNzg4TDI2MSA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjY7IiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNDc1IDBWMjgzSDIxOVYwSDczVjQ3NkgtOVY1ODVINzNWNjY3SDIxOVY1ODVINDc1VjY2N0g2MjFWNTg1SDcwM1Y0NzZINjIxVjBINDc1Wk00NzUgNDAxVjQ3NkgyMTlWNDAxSDQ3NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNzsiIGhvcml6LWFkdi14PSI1OTMiIGQ9Ik0yMDQgNTQ3VjQzMkgyMDhRMjMzIDQ2NiAyNjcgNDc5VDM0NyA0OTNRMzk4IDQ5MyA0MzMgNDc4VDQ4OSA0MzZUNTIwIDM2OVQ1MzAgMjgyVjBIMzg4VjI2MFEzODggMjg1IDM4NiAzMDZUMzc1IDM0MlQzNDkgMzY1VDMwMyAzNzRRMjA0IDM3NCAyMDQgMjgwVjBINjNWNTQ3SDFWNjM3SDYzVjcwMEgyMDRWNjM3SDM2NFY1NDdIMjA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI4OyIgaG9yaXotYWR2LXg9IjI5MiIgZD0iTTczIDBWNjY3SDIxOVYwSDczWk0zMzIgNzk1UTMxOCA3NTAgMjg2IDcyOVQyMTkgNzA3UTE5NiA3MDcgMTc4IDcxM1QxNDMgNzI4VDExMiA3NDNUODIgNzUwUTY1IDc1MCA0OSA3NDFUMjEgNzA2TC00NCA3NTlRLTIzIDgwOSA0IDgyN1Q2OCA4NDZRODkgODQ2IDEwNyA4MzlUMTQyIDgyNFQxNzQgODA5VDIwNiA4MDJRMjIzIDgwMiAyMzkgODExVDI2NSA4NDZMMzMyIDc5NUgzMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjk7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNNjMgMFY1MDJIMjA0VjBINjNaTTMyMSA2NTVRMzA3IDYxMCAyNzUgNTg5VDIwOCA1NjdRMTg1IDU2NyAxNjcgNTczVDEzMiA1ODhUMTAxIDYwM1Q3MSA2MTBRNTQgNjEwIDM4IDYwMVQxMCA1NjZMLTU1IDYxOVEtMzQgNjY5IC03IDY4N1Q1NyA3MDZRNzggNzA2IDk2IDY5OVQxMzEgNjg0VDE2MyA2NjlUMTk1IDY2MlEyMTIgNjYyIDIyOCA2NzFUMjU0IDcwNkwzMjEgNjU1SDMyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQTsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwVjY2N0gyMTlWMEg3M1pNLTE1IDcyN1Y4MTRIMzA4VjcyN0gtMTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkI7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNNjMgMFY1MDJIMjA0VjBINjNaTS0zMCA1ODdWNjc0SDI5M1Y1ODdILTMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJDOyIgaG9yaXotYWR2LXg9IjI5MiIgZD0iTTczIDBWNjY3SDIxOVYwSDczWk0zMTggODQ2UTMxMyA4MDEgMjk0IDc3NFQyNTAgNzMxVDE5NiA3MTBUMTQzIDcwNVExMTkgNzA1IDkxIDcxMFQzOSA3MzBULTQgNzczVC0yOCA4NDZINjlRNzIgODIwIDg5IDc5OVQxNDQgNzc4UTE4MCA3NzggMTk5IDc5OVQyMjAgODQ2SDMxOEgzMThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkQ7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNNjMgMFY1MDJIMjA0VjBINjNaTTMwOCA3MDZRMzAzIDY2MSAyODQgNjM0VDI0MCA1OTFUMTg2IDU3MFQxMzMgNTY1UTEwOSA1NjUgODEgNTcwVDI5IDU5MFQtMTQgNjMzVC0zOCA3MDZINTlRNjIgNjgwIDc5IDY1OVQxMzQgNjM4UTE3MCA2MzggMTg5IDY1OVQyMTAgNzA2SDMwOEgzMDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkU7IiBob3Jpei1hZHYteD0iMjkyIiBkPSJNMTgyIDBRMTM4IC0zMyAxMjMgLTU4VDEwNyAtMTA2UTEwNyAtMTMxIDEyMSAtMTQzVDE1NSAtMTU2UTE3NSAtMTU2IDE4NiAtMTUxVDIwNyAtMTQxTDIzMCAtMjE5UTIyMyAtMjIyIDIxMSAtMjI2VDE4NSAtMjMzVDE1NSAtMjM5VDEyNiAtMjQxUTY2IC0yNDEgMzggLTIxMVQ5IC0xMzFROSAtODYgMzcgLTU1VDEwNCAwSDczVjY2N0gyMTlWMEgxODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkY7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNMTcyIDBRMTI4IC0zMyAxMTMgLTU4VDk3IC0xMDZROTcgLTEzMSAxMTEgLTE0M1QxNDUgLTE1NlExNjUgLTE1NiAxNzYgLTE1MVQxOTcgLTE0MUwyMjAgLTIxOVEyMDYgLTIyNiAxNzcgLTIzM1QxMjAgLTI0MVE1OSAtMjQxIDI5IC0yMTFULTEgLTEzMVEtMSAtOTEgMjYgLTU3VDkzIDBINjNWNTAySDIwNFYwSDE3MlpNMjE4IDYzM1EyMTggNjAxIDE5NSA1ODNUMTM0IDU2NFE5NiA1NjQgNzMgNTgyVDUwIDYzM1E1MCA2NjUgNzMgNjg0VDEzNCA3MDNRMTcyIDcwMyAxOTUgNjg0VDIxOCA2MzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzA7IiBob3Jpei1hZHYteD0iMjkyIiBkPSJNNzMgMFY2NjdIMjE5VjBINzNaTTIzMSA3ODZRMjMxIDc1NCAyMDkgNzM1VDE0OCA3MTZRMTEwIDcxNiA4NyA3MzVUNjQgNzg2UTY0IDgxOCA4NyA4MzZUMTQ4IDg1NVExODYgODU1IDIwOCA4MzdUMjMxIDc4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMTsiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik02MyAwVjUwMkgyMDRWMEg2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMjsiIGhvcml6LWFkdi14PSI3MzEiIGQ9Ik03MyAwVjY2N0gyMTlWMEg3M1pNNjU4IDIyOFE2NTggMTc2IDY1MSAxMzJUNjIxIDU2VDU2MSA1VDQ1OSAtMTNRNDAyIC0xMyAzNTkgMlQyNzIgNTNMMzM3IDE2MFEzNjcgMTMxIDM5MSAxMjFUNDQ1IDExMVE0NzcgMTExIDQ5NCAxMzBUNTEyIDE5N1Y2NjdINjU4VjIyOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMzsiIGhvcml6LWFkdi14PSI1MzgiIGQ9Ik02NSAwVjUwMkgyMDZWMEg2NVpNMjIwIDYzM1EyMjAgNjAxIDE5NyA1ODNUMTM1IDU2NFE5NyA1NjQgNzQgNTgyVDUxIDYzM1E1MSA2NjUgNzQgNjg0VDEzNSA3MDNRMTczIDcwMyAxOTYgNjg0VDIyMCA2MzNaTTQ4OCA2MzNRNDg4IDYxNSA0ODEgNjAyVDQ2MiA1ODFUNDM1IDU2OFQ0MDMgNTY0UTM4NyA1NjQgMzcyIDU2OFQzNDUgNTgwVDMyNiA2MDJUMzE5IDYzM1EzMTkgNjUxIDMyNiA2NjRUMzQ1IDY4NlQzNzIgNjk5VDQwMyA3MDNRNDE5IDcwMyA0MzQgNjk5VDQ2MiA2ODdUNDgxIDY2NVQ0ODggNjMzWk00NzUgLTE3UTQ3NSAtMTIzIDQyNSAtMTc0VDI2OSAtMjI2UTI0NyAtMjI2IDIyNyAtMjI1VDE4NiAtMjIxVi0xMDNRMjE5IC0xMDYgMjUyIC0xMDZRMjgxIC0xMDYgMjk3IC0xMDBUMzIyIC04MFQzMzIgLTQ3VDMzNCAwVjUwMkg0NzVWLTE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgaG9yaXotYWR2LXg9IjQ5MCIgZD0iTTQxNyAyMjhRNDE3IDE3NiA0MTAgMTMyVDM4MCA1NlQzMjAgNVQyMTggLTEzUTE2MSAtMTMgMTE4IDJUMzEgNTNMOTYgMTYwUTEyNiAxMzEgMTUwIDEyMVQyMDQgMTExUTIzNiAxMTEgMjUzIDEzMFQyNzEgMTk3VjY2N0g0MTdWMjI4SDQxN1pNNDY5IDcwMUwzNDQgNzc1TDIxNyA3MDFMMTYxIDc4MEwzNDIgODc4TDUyNiA3ODBMNDY5IDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGhvcml6LWFkdi14PSIyNzQiIGQ9Ik0yMTEgLTE3UTIxMSAtMjI2IDUgLTIyNlEtMTcgLTIyNiAtMzcgLTIyNVQtNzggLTIyMVYtMTAzUS00NSAtMTA2IC0xMiAtMTA2UTE3IC0xMDYgMzMgLTEwMFQ1OCAtODBUNjggLTQ3VDcwIDBWNTAySDIxMVYtMTdaTTI2OSA1NjFMMTQ0IDYzNUwxNyA1NjFMLTM5IDY0MEwxNDIgNzM4TDMyNiA2NDBMMjY5IDU2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNjsiIGhvcml6LWFkdi14PSI2NDQiIGQ9Ik00NTEgMEwyNzAgMjc5TDIxOSAyMjNWMEg3M1Y2NjdIMjE5VjM4OUgyMjNMNDI4IDY2N0g2MTJMMzgwIDM3Nkw2MzcgMEg0NTFaTTMyMyAtMjI2SDIyN0wyNjAgLTU1SDQwOUwzMjMgLTIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNzsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik0zODAgMEwyNTIgMjE0TDIwNCAxNjJWMEg2M1Y3MDBIMjA0VjMxNEgyMDhMMzYzIDUwMkg1MzhMMzU0IDMwMUw1NTEgMEgzODBaTTI4MyAtMjI2SDE4N0wyMjAgLTU1SDM2OUwyODMgLTIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzOTsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik03MyAwVjY2N0gyMTlWMTIzSDUwMlYwSDczWk0xNTAgNzA1TDY2IDc1MEwyMDUgODgyTDM0NiA4MjNMMTUwIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQTsiIGhvcml6LWFkdi14PSIzMTYiIGQ9Ik0yODggMFEyNTAgLTYgMTg2IC02UTExNiAtNiA5MCAyMFQ2MyAxMDlWNzAwSDIwNFYxNDJRMjA0IDExOSAyMTEgMTE0VDIzOSAxMDlIMjg4VjBIMjg4Wk0xNDcgNzM1TDYzIDc4MEwyMDIgOTEyTDM0MyA4NTNMMTQ3IDczNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQjsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik03MyAwVjY2N0gyMTlWMTIzSDUwMlYwSDczWk0yNzEgLTIyNkgxNzVMMjA4IC01NUgzNTdMMjcxIC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0M7IiBob3Jpei1hZHYteD0iMzE2IiBkPSJNMjg4IDBRMjUwIC02IDE4NiAtNlExMTYgLTYgOTAgMjBUNjMgMTA5VjcwMEgyMDRWMTQyUTIwNCAxMTkgMjExIDExNFQyMzkgMTA5SDI4OFYwSDI4OFpNMTc2IC0yMjZIODBMMTEzIC01NUgyNjJMMTc2IC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Q7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzMgMFY2NjdIMjE5VjEyM0g1MDJWMEg3M1pNNDYyIDUxOEgzNjhMNDA1IDcwMEg1NDNMNDYyIDUxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRTsiIGhvcml6LWFkdi14PSIzMTYiIGQ9Ik0yODggMFEyNTAgLTYgMTg2IC02UTExNiAtNiA5MCAyMFQ2MyAxMDlWNzAwSDIwNFYxNDJRMjA0IDExOSAyMTEgMTE0VDIzOSAxMDlIMjg4VjBaTTM1MiA1MThIMjU4TDI5NSA3MDBINDMzTDM1MiA1MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzMgMFY2NjdIMjE5VjEyM0g1MDJWMEg3M1pNNTI2IDMyM1E1MjYgMjkyIDQ5OSAyNzJUNDMzIDI1MVEzOTMgMjUxIDM2NyAyNzFUMzQwIDMyM1EzNDAgMzUzIDM2NyAzNzNUNDMzIDM5NFE0NzIgMzk0IDQ5OSAzNzRUNTI2IDMyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MDsiIGhvcml6LWFkdi14PSI0NDMiIGQ9Ik0yODggMFEyNTAgLTYgMTg2IC02UTExNiAtNiA5MCAyMFQ2MyAxMDlWNzAwSDIwNFYxNDJRMjA0IDExOSAyMTEgMTE0VDIzOSAxMDlIMjg4VjBaTTQ1MSAyNDJRNDUxIDIxMSA0MjQgMTkxVDM1OCAxNzBRMzE4IDE3MCAyOTIgMTkwVDI2NSAyNDJRMjY1IDI3MiAyOTIgMjkyVDM1OCAzMTNRMzk3IDMxMyA0MjQgMjkzVDQ1MSAyNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDE7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzMgMFYyNjlMNyAyMjhWMzQxTDczIDM4M1Y2NjdIMjE5VjQ3NEwzOTUgNTg1VjQ2NkwyMTkgMzU0VjEyM0g1MDJWMEg3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MjsiIGhvcml6LWFkdi14PSIzMTYiIGQ9Ik0yNjEgMzY2VjE0MlEyNjEgMTE5IDI2OCAxMTRUMjk2IDEwOUgzNDVWLTJRMzI1IC01IDMwMiAtN1QyNDMgLTlRMjA4IC05IDE4NCAtM1QxNDYgMThUMTI2IDU1VDEyMCAxMDlWMjgyTDYzIDI0NFYzNTdMMTIwIDM5NlY3MDBIMjYxVjQ3NUwzNTYgNTM3VjQyOEwyNjEgMzY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgaG9yaXotYWR2LXg9IjczMSIgZD0iTTUzMiAwTDIxOSA0MjVIMjE1VjBINzNWNjY3SDIwOEw1MTIgMjQ5SDUxN1Y2NjdINjU4VjBINTMyWk0zNzEgNzA1TDI4NyA3NTBMNDI2IDg4Mkw1NjcgODIzTDM3MSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDQ7IiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBWMjgxUTM4OSAzMDYgMzg2IDMyN1QzNzQgMzYzVDM0OCAzODZUMzAyIDM5NVEyMDQgMzk1IDIwNCAzMDBWMEg2M1Y1MDJIMTg1TDE5NCA0NDJIMTk2UTIyNCA0ODIgMjYwIDQ5N1QzNDYgNTEzUTM5OCA1MTMgNDMzIDQ5OVQ0ODkgNDU3VDUyMCAzOTBUNTMwIDMwM1YwSDM4OVpNMzA3IDU2NUwyMjMgNjEwTDM2MiA3NDJMNTAzIDY4M0wzMDcgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ1OyIgaG9yaXotYWR2LXg9IjczMSIgZD0iTTUzMiAwTDIxOSA0MjVIMjE1VjBINzNWNjY3SDIwOEw1MTIgMjQ5SDUxN1Y2NjdINjU4VjBINTMyWk0zNTggLTIyNkgyNjJMMjk1IC01NUg0NDRMMzU4IC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDY7IiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBWMjgxUTM4OSAzMDYgMzg2IDMyN1QzNzQgMzYzVDM0OCAzODZUMzAyIDM5NVEyMDQgMzk1IDIwNCAzMDBWMEg2M1Y1MDJIMTg1TDE5NCA0NDJIMTk2UTIyNCA0ODIgMjYwIDQ5N1QzNDYgNTEzUTM5OCA1MTMgNDMzIDQ5OVQ0ODkgNDU3VDUyMCAzOTBUNTMwIDMwM1YwSDM4OVpNMjkzIC0yMjZIMTk3TDIzMCAtNTVIMzc5TDI5MyAtMjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ3OyIgaG9yaXotYWR2LXg9IjczMSIgZD0iTTUzMiAwTDIxOSA0MjVIMjE1VjBINzNWNjY3SDIwOEw1MTIgMjQ5SDUxN1Y2NjdINjU4VjBINTMyWk01NDAgODAyTDM3MiA3MDVMMjAyIDgwMkwyNTUgODc3TDM3MCA4MDhMNDg3IDg3N0w1NDAgODAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ4OyIgaG9yaXotYWR2LXg9IjU5MyIgZD0iTTM4OSAwVjI4MVEzODkgMzA2IDM4NiAzMjdUMzc0IDM2M1QzNDggMzg2VDMwMiAzOTVRMjA0IDM5NSAyMDQgMzAwVjBINjNWNTAySDE4NUwxOTQgNDQySDE5NlEyMjQgNDgyIDI2MCA0OTdUMzQ2IDUxM1EzOTggNTEzIDQzMyA0OTlUNDg5IDQ1N1Q1MjAgMzkwVDUzMCAzMDNWMEgzODlaTTQ3MyA2NjJMMzA1IDU2NUwxMzUgNjYyTDE4OCA3MzdMMzAzIDY2OEw0MjAgNzM3TDQ3MyA2NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEE7IiBob3Jpei1hZHYteD0iNzMxIiBkPSJNNDIyIC0xMjFINDM2UTQ3NCAtMTIxIDQ5NiAtMTAwVDUxOCAtMzNWOUwyMTkgNDMwSDIxNVYwSDczVjY2N0gyMDhMNTEyIDI0Mkg1MTdWNjY3SDY1OFYtMjlRNjU4IC0xMzYgNjA4IC0xOTFUNDU1IC0yNDZINDIyVi0xMjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEI7IiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMTg1IDUwMkwxOTQgNDQySDE5NlEyMjQgNDgyIDI2MCA0OTdUMzQ2IDUxM1EzOTggNTEzIDQzMyA0OTlUNDg5IDQ1N1Q1MjAgMzkwVDUzMCAzMDNWLTE3UTUzMCAtMTI3IDQ4MCAtMTgyVDMyMyAtMjM4SDI4OVYtMTA4SDMwM1EzODggLTEwOCAzODggLTE2VjI4MVEzODggMzA2IDM4NiAzMjdUMzc0IDM2M1QzNDggMzg2VDMwMiAzOTVRMjA0IDM5NSAyMDQgMzAwVjBINjNWNTAySDE4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QzsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03MTYgMzM0UTcxNiAyNDUgNjkyIDE4MFQ2MjUgNzNUNTIxIDExVDM4NiAtMTBRMzEyIC0xMCAyNTIgMTBUMTQ4IDczVDgwIDE4MFQ1NiAzMzRRNTYgNDIyIDc5IDQ4N1QxNDYgNTk0VDI1MSA2NTdUMzg2IDY3OFE0NjEgNjc4IDUyMSA2NThUNjI1IDU5NVQ2OTIgNDg3VDcxNiAzMzRaTTU2NCAzMzRRNTY0IDM4OCA1NTYgNDMwVDUyNiA1MDFUNDcxIDU0NVQzODYgNTYwUTMzNSA1NjAgMzAxIDU0NVQyNDYgNTAyVDIxNyA0MzFUMjA4IDMzNFEyMDggMjgwIDIxNiAyMzhUMjQ2IDE2N1QzMDEgMTIzVDM4NiAxMDhRNDM3IDEwOCA0NzEgMTIzVDUyNiAxNjdUNTU1IDIzOFQ1NjQgMzM0Wk0yMjkgNzI3VjgxNEg1NTJWNzI3SDIyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RDsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik00MiAyNTFRNDIgMzA2IDU2IDM1M1QxMDIgNDM2VDE4MiA0OTJUMzAwIDUxM1E0MjggNTEzIDQ5MyA0NDRUNTU5IDI1MVE1NTkgMTkzIDU0MyAxNDVUNDk1IDYyVDQxNSA4VDMwMCAtMTFRMjM1IC0xMSAxODcgOFQxMDYgNjFUNTggMTQ0VDQyIDI1MVpNMTg1IDI1MVExODUgMTc2IDIxMCAxMzZUMzAxIDk1UTM2NSA5NSAzOTAgMTM1VDQxNiAyNTFRNDE2IDMyNSAzOTEgMzY0VDMwMSA0MDNRMjM2IDQwMyAyMTEgMzY0VDE4NSAyNTFaTTE0MCA1ODdWNjc0SDQ2M1Y1ODdIMTQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRFOyIgaG9yaXotYWR2LXg9Ijc3MiIgZD0iTTcxNiAzMzRRNzE2IDI0NSA2OTIgMTgwVDYyNSA3M1Q1MjEgMTFUMzg2IC0xMFEzMTIgLTEwIDI1MiAxMFQxNDggNzNUODAgMTgwVDU2IDMzNFE1NiA0MjIgNzkgNDg3VDE0NiA1OTRUMjUxIDY1N1QzODYgNjc4UTQ2MSA2NzggNTIxIDY1OFQ2MjUgNTk1VDY5MiA0ODdUNzE2IDMzNFpNNTY0IDMzNFE1NjQgMzg4IDU1NiA0MzBUNTI2IDUwMVQ0NzEgNTQ1VDM4NiA1NjBRMzM1IDU2MCAzMDEgNTQ1VDI0NiA1MDJUMjE3IDQzMVQyMDggMzM0UTIwOCAyODAgMjE2IDIzOFQyNDYgMTY3VDMwMSAxMjNUMzg2IDEwOFE0MzcgMTA4IDQ3MSAxMjNUNTI2IDE2N1Q1NTUgMjM4VDU2NCAzMzRaTTU2MiA4NTVRNTU3IDgxMCA1MzggNzgzVDQ5NCA3NDBUNDQwIDcxOVQzODcgNzE0UTM2MyA3MTQgMzM1IDcxOVQyODMgNzM5VDI0MCA3ODJUMjE2IDg1NUgzMTNRMzE2IDgyOSAzMzMgODA4VDM4OCA3ODdRNDI0IDc4NyA0NDMgODA4VDQ2NCA4NTVINTYySDU2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RjsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik00MiAyNTFRNDIgMzA2IDU2IDM1M1QxMDIgNDM2VDE4MiA0OTJUMzAwIDUxM1E0MjggNTEzIDQ5MyA0NDRUNTU5IDI1MVE1NTkgMTkzIDU0MyAxNDVUNDk1IDYyVDQxNSA4VDMwMCAtMTFRMjM1IC0xMSAxODcgOFQxMDYgNjFUNTggMTQ0VDQyIDI1MVpNMTg1IDI1MVExODUgMTc2IDIxMCAxMzZUMzAxIDk1UTM2NSA5NSAzOTAgMTM1VDQxNiAyNTFRNDE2IDMyNSAzOTEgMzY0VDMwMSA0MDNRMjM2IDQwMyAyMTEgMzY0VDE4NSAyNTFaTTQ3NSA3MDZRNDcwIDY2MSA0NTEgNjM0VDQwNyA1OTFUMzUzIDU3MFQzMDAgNTY1UTI3NiA1NjUgMjQ4IDU3MFQxOTYgNTkwVDE1MyA2MzNUMTI5IDcwNkgyMjZRMjI5IDY4MCAyNDYgNjU5VDMwMSA2MzhRMzM3IDYzOCAzNTYgNjU5VDM3NyA3MDZINDc1SDQ3NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MDsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03MTYgMzM0UTcxNiAyNDUgNjkyIDE4MFQ2MjUgNzNUNTIxIDExVDM4NiAtMTBRMzEyIC0xMCAyNTIgMTBUMTQ4IDczVDgwIDE4MFQ1NiAzMzRRNTYgNDIyIDc5IDQ4N1QxNDYgNTk0VDI1MSA2NTdUMzg2IDY3OFE0NjEgNjc4IDUyMSA2NThUNjI1IDU5NVQ2OTIgNDg3VDcxNiAzMzRaTTU2NCAzMzRRNTY0IDM4OCA1NTYgNDMwVDUyNiA1MDFUNDcxIDU0NVQzODYgNTYwUTMzNSA1NjAgMzAxIDU0NVQyNDYgNTAyVDIxNyA0MzFUMjA4IDMzNFEyMDggMjgwIDIxNiAyMzhUMjQ2IDE2N1QzMDEgMTIzVDM4NiAxMDhRNDM3IDEwOCA0NzEgMTIzVDUyNiAxNjdUNTU1IDIzOFQ1NjQgMzM0Wk01NDQgNzAyTDQ3MiA3NDZMNjE5IDg3N0w3NDAgODIwTDU0NCA3MDJaTTI3NiA3MDJMMjA1IDc0NkwzNTIgODc3TDQ3MyA4MjBMMjc2IDcwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MTsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik00MiAyNTFRNDIgMzA2IDU2IDM1M1QxMDIgNDM2VDE4MiA0OTJUMzAwIDUxM1E0MjggNTEzIDQ5MyA0NDRUNTU5IDI1MVE1NTkgMTkzIDU0MyAxNDVUNDk1IDYyVDQxNSA4VDMwMCAtMTFRMjM1IC0xMSAxODcgOFQxMDYgNjFUNTggMTQ0VDQyIDI1MVpNMTg1IDI1MVExODUgMTc2IDIxMCAxMzZUMzAxIDk1UTM2NSA5NSAzOTAgMTM1VDQxNiAyNTFRNDE2IDMyNSAzOTEgMzY0VDMwMSA0MDNRMjM2IDQwMyAyMTEgMzY0VDE4NSAyNTFaTTQ2NCA1NTVMMzkyIDU5OUw1MzkgNzMwTDY2MCA2NzNMNDY0IDU1NVpNMTk2IDU1NUwxMjUgNTk5TDI3MiA3MzBMMzkzIDY3M0wxOTYgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUyOyIgaG9yaXotYWR2LXg9Ijk1NyIgZD0iTTQ5MSAwUTQ2NiAtNSA0MzYgLTdUMzc4IC0xMFEzMDQgLTEwIDI0NSAxMFQxNDMgNzNUNzkgMTgwVDU2IDMzNFE1NiA0MjIgNzggNDg3VDE0MyA1OTRUMjQ0IDY1N1QzNzggNjc4UTQwNyA2NzggNDM2IDY3NVQ0OTEgNjY3SDkxMFY1NDVINjM3VjQwNEg4ODFWMjgwSDYzN1YxMTlIOTIwVjBINDkxWk0zODQgMTA4UTQxOSAxMDggNDQ1IDExM1Q0OTEgMTI2VjU0MFE0NzIgNTQ5IDQ0NiA1NTRUMzg0IDU2MFEzMzMgNTYwIDI5OSA1NDVUMjQ1IDUwMlQyMTcgNDMxVDIwOCAzMzRRMjA4IDI4MCAyMTYgMjM4VDI0NSAxNjdUMjk5IDEyM1QzODQgMTA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUzOyIgaG9yaXotYWR2LXg9Ijk1NiIgZD0iTTkxNSAyNDRROTE1IDIzNyA5MTUgMjI5VDkxNCAyMDRINTU4UTU2NCA5NyA2ODggOTdRNzYzIDk3IDgzNiAxMzhMODgyIDQzUTgzNCAxNiA3ODYgM1Q2ODIgLTExUTYxOSAtMTEgNTczIDlUNDkyIDY1UTQyNyAtMTEgMzAxIC0xMVExNzMgLTExIDEwOCA1OFQ0MiAyNTFRNDIgMzA4IDU3IDM1NlQxMDQgNDM5VDE4NCA0OTNUMzAxIDUxM1EzNjIgNTEzIDQwOSA0OTVUNDg5IDQzOFE1MjQgNDc3IDU3MiA0OTVUNjcyIDUxNFE3MjcgNTE0IDc3MiA0OTVUODQ5IDQ0MVQ4OTggMzU2VDkxNSAyNDRaTTc4OCAyOTVRNzgzIDM0NSA3NTcgMzc4VDY3NCA0MTFRNjIwIDQxMSA1OTAgMzgxVDU1OCAyOTVINzg4Wk00MTUgMjUxUTQxNSAzMjYgMzkwIDM2M1QzMDEgNDAwUTIzNiA0MDAgMjExIDM2M1QxODUgMjUxUTE4NSAxNjcgMjEzIDEzM1QzMDEgOThRMzYwIDk4IDM4NyAxMzJUNDE1IDI1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NDsiIGhvcml6LWFkdi14PSI2NDUiIGQ9Ik00NTggMEwzNjQgMjI4UTM1OCAyNDMgMzUxIDI0OFQzMjggMjUzSDIxOVYwSDczVjY2M1ExODcgNjc1IDMwNCA2NzVRMzU1IDY3NSA0MDYgNjY3VDQ5NyA2MzdUNTYzIDU3NVQ1ODggNDcxUTU4OCA0MDggNTYzIDM2MlQ0NzUgMjg5VjI4OFE0ODQgMjg1IDQ5MCAyNzVUNTAwIDI1NUw2MTEgMEg0NThaTTQ0NiA0NjNRNDQ2IDQ5NSA0MzUgNTE0VDQwNCA1NDRUMzYxIDU1OFQzMTAgNTYxUTI4NiA1NjEgMjY0IDU2MFQyMTkgNTU2VjM2N0gzMjdRMzUzIDM2NyAzNzUgMzcxVDQxMiAzODVUNDM3IDQxNFQ0NDYgNDYzWk0yODkgNzA4TDIwNSA3NTNMMzQ0IDg4NUw0ODUgODI2TDI4OSA3MDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTU7IiBob3Jpei1hZHYteD0iNDA0IiBkPSJNMzQ1IDM4OFEzMTQgMzg4IDI4OCAzODVUMjQ0IDM3MlQyMTUgMzQxVDIwNCAyODdWMEg2M1Y1MDJIMTg0TDE5NSA0MzVIMTk5UTIyMCA0NzMgMjUyIDQ5MlQzNDMgNTEySDM3OFYzODhIMzQ1Wk0yMTQgNTY1TDEzMCA2MTBMMjY5IDc0Mkw0MTAgNjgzTDIxNCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTY7IiBob3Jpei1hZHYteD0iNjQ1IiBkPSJNNDU4IDBMMzY0IDIyOFEzNTggMjQzIDM1MSAyNDhUMzI4IDI1M0gyMTlWMEg3M1Y2NjNRMTg3IDY3NSAzMDQgNjc1UTM1NSA2NzUgNDA2IDY2N1Q0OTcgNjM3VDU2MyA1NzVUNTg4IDQ3MVE1ODggNDA4IDU2MyAzNjJUNDc1IDI4OVYyODhRNDg0IDI4NSA0OTAgMjc1VDUwMCAyNTVMNjExIDBINDU4Wk00NDYgNDYzUTQ0NiA0OTUgNDM1IDUxNFQ0MDQgNTQ0VDM2MSA1NThUMzEwIDU2MVEyODYgNTYxIDI2NCA1NjBUMjE5IDU1NlYzNjdIMzI3UTM1MyAzNjcgMzc1IDM3MVQ0MTIgMzg1VDQzNyA0MTRUNDQ2IDQ2M1pNMzE4IC0yMjZIMjIyTDI1NSAtNTVINDA0TDMxOCAtMjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU3OyIgaG9yaXotYWR2LXg9IjQwNCIgZD0iTTM0NSAzODhRMzE0IDM4OCAyODggMzg1VDI0NCAzNzJUMjE1IDM0MVQyMDQgMjg3VjBINjNWNTAySDE4NEwxOTUgNDM1SDE5OVEyMjAgNDczIDI1MiA0OTJUMzQzIDUxMkgzNzhWMzg4SDM0NVpNMTIxIC0yMjZIMjVMNTggLTU1SDIwN0wxMjEgLTIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1ODsiIGhvcml6LWFkdi14PSI2NDUiIGQ9Ik00NTggMEwzNjQgMjI4UTM1OCAyNDMgMzUxIDI0OFQzMjggMjUzSDIxOVYwSDczVjY2M1ExODcgNjc1IDMwNCA2NzVRMzU1IDY3NSA0MDYgNjY3VDQ5NyA2MzdUNTYzIDU3NVQ1ODggNDcxUTU4OCA0MDggNTYzIDM2MlQ0NzUgMjg5VjI4OFE0ODQgMjg1IDQ5MCAyNzVUNTAwIDI1NUw2MTEgMEg0NThaTTQ0NiA0NjNRNDQ2IDQ5NSA0MzUgNTE0VDQwNCA1NDRUMzYxIDU1OFQzMTAgNTYxUTI4NiA1NjEgMjY0IDU2MFQyMTkgNTU2VjM2N0gzMjdRMzUzIDM2NyAzNzUgMzcxVDQxMiAzODVUNDM3IDQxNFQ0NDYgNDYzWk00NzggODAyTDMxMCA3MDVMMTQwIDgwMkwxOTMgODc3TDMwOCA4MDhMNDI1IDg3N0w0NzggODAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU5OyIgaG9yaXotYWR2LXg9IjQwNCIgZD0iTTM0NSAzODhRMzE0IDM4OCAyODggMzg1VDI0NCAzNzJUMjE1IDM0MVQyMDQgMjg3VjBINjNWNTAySDE4NEwxOTUgNDM1SDE5OVEyMjAgNDczIDI1MiA0OTJUMzQzIDUxMkgzNzhWMzg4SDM0NVpNMzgxIDY2MkwyMTMgNTY1TDQzIDY2Mkw5NiA3MzdMMjExIDY2OEwzMjggNzM3TDM4MSA2NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUE7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNTUzIDE5NVE1NTMgMTM4IDUzMyA5OVQ0NzkgMzVUMzk5IDFUMzAyIC0xMFEyMjQgLTEwIDE2MSA4VDMzIDcxTDk3IDE3NVExNDMgMTQ1IDE5MSAxMjVUMjk1IDEwNFEzMTUgMTA0IDMzNSAxMDdUMzcyIDExOFQzOTkgMTQyVDQxMCAxODJRNDEwIDIwNyAzOTQgMjIzVDM1MyAyNTFUMjk0IDI3MlQyMjYgMjk0UTE5MyAzMDUgMTYyIDMyMFQxMDcgMzU3VDY4IDQxMlQ1MyA0ODlRNTMgNTQzIDc0IDU3OFQxMzAgNjM2VDIwOSA2NjdUMjk5IDY3NlEzNjIgNjc2IDQxOCA2NjFUNTMwIDYxN0w0NzggNTA1UTQ0MCA1MjggMzk2IDU0M1QzMDkgNTU5UTI4NyA1NTkgMjY4IDU1N1QyMzMgNTQ3VDIwOSA1MjdUMjAwIDQ5NFEyMDAgNDczIDIxMSA0NTlUMjQxIDQzNVQyODcgNDE3VDM0NCA0MDFRMzgwIDM5MSA0MTcgMzc4VDQ4NSAzNDFUNTM0IDI4MlQ1NTMgMTk1Wk0yOTYgNzA5TDIxMiA3NTRMMzUxIDg4Nkw0OTIgODI3TDI5NiA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUI7IiBob3Jpei1hZHYteD0iNDkyIiBkPSJNNDU3IDE1MVE0NTcgNjcgNDAzIDI4VDI1MCAtMTFRMTMxIC0xMSAyNiA1MEw3NSAxNDZRMTE3IDEyMyAxNjEgMTA4VDI0OSA5MlEyODUgOTIgMzA1IDEwNFQzMjUgMTQ1UTMyNSAxNjAgMzE3IDE2OFQyOTUgMTgzVDI2MiAxOTJUMjIyIDIwMVExODkgMjA4IDE1NyAyMThUOTkgMjQ3VDU5IDI5NFQ0MyAzNjRRNDMgMzk1IDU1IDQyMlQ5MyA0NjlUMTU4IDUwMVQyNTAgNTEzUTI5OSA1MTMgMzQ2IDUwM1Q0MzkgNDcwTDQwMiAzNzBRMzcwIDM4NyAzMzIgMzk3VDI2MSA0MDhRMjI1IDQwOCAyMDAgMzk4VDE3NSAzNjJRMTc1IDM0OCAxODQgMzQwVDIwOSAzMjZUMjQ2IDMxNlQyOTAgMzA3UTMyMCAzMDEgMzQ5IDI5MVQ0MDMgMjY0VDQ0MiAyMjBUNDU3IDE1MVpNMjU0IDU2NUwxNzAgNjEwTDMwOSA3NDJMNDUwIDY4M0wyNTQgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVDOyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTU1MyAxOTVRNTUzIDEzOCA1MzMgOTlUNDc5IDM1VDM5OSAxVDMwMiAtMTBRMjI0IC0xMCAxNjEgOFQzMyA3MUw5NyAxNzVRMTQzIDE0NSAxOTEgMTI1VDI5NSAxMDRRMzE1IDEwNCAzMzUgMTA3VDM3MiAxMThUMzk5IDE0MlQ0MTAgMTgyUTQxMCAyMDcgMzk0IDIyM1QzNTMgMjUxVDI5NCAyNzJUMjI2IDI5NFExOTMgMzA1IDE2MiAzMjBUMTA3IDM1N1Q2OCA0MTJUNTMgNDg5UTUzIDU0MyA3NCA1NzhUMTMwIDYzNlQyMDkgNjY3VDI5OSA2NzZRMzYyIDY3NiA0MTggNjYxVDUzMCA2MTdMNDc4IDUwNVE0NDAgNTI4IDM5NiA1NDNUMzA5IDU1OVEyODcgNTU5IDI2OCA1NTdUMjMzIDU0N1QyMDkgNTI3VDIwMCA0OTRRMjAwIDQ3MyAyMTEgNDU5VDI0MSA0MzVUMjg3IDQxN1QzNDQgNDAxUTM4MCAzOTEgNDE3IDM3OFQ0ODUgMzQxVDUzNCAyODJUNTUzIDE5NVpNNDMyIDcwMUwzMDcgNzc1TDE4MCA3MDFMMTI0IDc4MEwzMDUgODc4TDQ4OSA3ODBMNDMyIDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RDsiIGhvcml6LWFkdi14PSI0OTIiIGQ9Ik00NTcgMTUxUTQ1NyA2NyA0MDMgMjhUMjUwIC0xMVExMzEgLTExIDI2IDUwTDc1IDE0NlExMTcgMTIzIDE2MSAxMDhUMjQ5IDkyUTI4NSA5MiAzMDUgMTA0VDMyNSAxNDVRMzI1IDE2MCAzMTcgMTY4VDI5NSAxODNUMjYyIDE5MlQyMjIgMjAxUTE4OSAyMDggMTU3IDIxOFQ5OSAyNDdUNTkgMjk0VDQzIDM2NFE0MyAzOTUgNTUgNDIyVDkzIDQ2OVQxNTggNTAxVDI1MCA1MTNRMjk5IDUxMyAzNDYgNTAzVDQzOSA0NzBMNDAyIDM3MFEzNzAgMzg3IDMzMiAzOTdUMjYxIDQwOFEyMjUgNDA4IDIwMCAzOThUMTc1IDM2MlExNzUgMzQ4IDE4NCAzNDBUMjA5IDMyNlQyNDYgMzE2VDI5MCAzMDdRMzIwIDMwMSAzNDkgMjkxVDQwMyAyNjRUNDQyIDIyMFQ0NTcgMTUxWk0zODkgNTYxTDI2NCA2MzVMMTM3IDU2MUw4MSA2NDBMMjYyIDczOEw0NDYgNjQwTDM4OSA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUU7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNDExIC0xMjNRNDExIC0xNjEgMzgzIC0xODdUMjk4IC0yMTNRMjcyIC0yMTMgMjUwIC0yMDVUMjEwIC0xODhMMjI2IC0xNDBRMjQ2IC0xNTAgMjYwIC0xNTRUMjkyIC0xNTlRMzEwIC0xNTkgMzI0IC0xNTNUMzM5IC0xMjZRMzM5IC05MiAyOTYgLTkyUTI3MiAtOTIgMjU2IC0xMDBMMjI5IC04NkwyNjYgLTlRMjAwIC01IDE0NiAxNFQzMyA3MUw5NyAxNzVRMTQzIDE0NSAxOTEgMTI1VDI5NSAxMDRRMzE1IDEwNCAzMzUgMTA3VDM3MiAxMThUMzk5IDE0MlQ0MTAgMTgyUTQxMCAyMDcgMzk0IDIyM1QzNTMgMjUxVDI5NCAyNzJUMjI2IDI5NFExOTMgMzA1IDE2MiAzMjBUMTA3IDM1N1Q2OCA0MTJUNTMgNDg5UTUzIDU0MyA3NCA1NzhUMTMwIDYzNlQyMDkgNjY3VDI5OSA2NzZRMzYyIDY3NiA0MTggNjYxVDUzMCA2MTdMNDc4IDUwNVE0NDAgNTI4IDM5NiA1NDNUMzA5IDU1OVEyODcgNTU5IDI2OCA1NTdUMjMzIDU0N1QyMDkgNTI3VDIwMCA0OTRRMjAwIDQ3MyAyMTEgNDU5VDI0MSA0MzVUMjg3IDQxN1QzNDQgNDAxUTM4MCAzOTEgNDE3IDM3OFQ0ODUgMzQxVDUzNCAyODJUNTUzIDE5NVE1NTMgMTQxIDUzNiAxMDRUNDg4IDQyVDQxNyA2VDMzMCAtOUwzMDkgLTQ3TDMxMCAtNDhRMzE1IC00NyAzMjEgLTQ3VDMzNCAtNDZRMzY5IC00NiAzOTAgLTY2VDQxMSAtMTIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVGOyIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTM1NCAtMTI2UTM1NCAtMTY0IDMyNSAtMTkwVDI0MSAtMjE2UTIxNSAtMjE2IDE5MiAtMjA5VDE1MiAtMTkxTDE2OCAtMTQzUTE4NyAtMTUzIDIwMiAtMTU4VDIzNSAtMTYzUTI1MiAtMTYzIDI2NiAtMTU2VDI4MSAtMTI5UTI4MSAtOTUgMjM5IC05NVEyMjYgLTk1IDIxNyAtOTdUMTk5IC0xMDNMMTcxIC04OUwyMTAgLTlRMTYxIC00IDExNSAxMFQyNiA1MEw3NSAxNDZRMTE3IDEyMyAxNjEgMTA4VDI0OSA5MlEyODUgOTIgMzA1IDEwNFQzMjYgMTQ1UTMyNiAxNTggMzE4IDE2N1QyOTYgMTgyVDI2MiAxOTRUMjIyIDIwNFExODkgMjExIDE1NyAyMjFUOTkgMjQ5VDU5IDI5NFQ0MyAzNjRRNDMgMzk1IDU1IDQyMlQ5MyA0NjlUMTU4IDUwMVQyNTAgNTEzUTI5OSA1MTMgMzQ2IDUwM1Q0MzkgNDcwTDQwMiAzNzZRMzcwIDM5NCAzMzIgNDA0VDI2MSA0MTRRMjI1IDQxNCAyMDEgNDA0VDE3NiAzNjhRMTc2IDM1NCAxODUgMzQ2VDIwOSAzMzFUMjQ2IDMyMFQyOTAgMzEwUTMyMCAzMDQgMzQ5IDI5NFQ0MDMgMjY2VDQ0MiAyMjFUNDU3IDE1MVE0NTcgNzIgNDA5IDM0VDI3MyAtMTBMMjUxIC01MUwyNTIgLTUyUTI1NyAtNTEgMjYzIC01MVQyNzUgLTUwUTMxMSAtNTAgMzMyIC02OVQzNTQgLTEyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik01NTMgMTk1UTU1MyAxMzggNTMzIDk5VDQ3OSAzNVQzOTkgMVQzMDIgLTEwUTIyNCAtMTAgMTYxIDhUMzMgNzFMOTcgMTc1UTE0MyAxNDUgMTkxIDEyNVQyOTUgMTA0UTMxNSAxMDQgMzM1IDEwN1QzNzIgMTE4VDM5OSAxNDJUNDEwIDE4MlE0MTAgMjA3IDM5NCAyMjNUMzUzIDI1MVQyOTQgMjcyVDIyNiAyOTRRMTkzIDMwNSAxNjIgMzIwVDEwNyAzNTdUNjggNDEyVDUzIDQ4OVE1MyA1NDMgNzQgNTc4VDEzMCA2MzZUMjA5IDY2N1QyOTkgNjc2UTM2MiA2NzYgNDE4IDY2MVQ1MzAgNjE3TDQ3OCA1MDVRNDQwIDUyOCAzOTYgNTQzVDMwOSA1NTlRMjg3IDU1OSAyNjggNTU3VDIzMyA1NDdUMjA5IDUyN1QyMDAgNDk0UTIwMCA0NzMgMjExIDQ1OVQyNDEgNDM1VDI4NyA0MTdUMzQ0IDQwMVEzODAgMzkxIDQxNyAzNzhUNDg1IDM0MVQ1MzQgMjgyVDU1MyAxOTVaTTQ3NCA4MDJMMzA2IDcwNUwxMzYgODAyTDE4OSA4NzdMMzA0IDgwOEw0MjEgODc3TDQ3NCA4MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjE7IiBob3Jpei1hZHYteD0iNDkyIiBkPSJNNDU3IDE1MVE0NTcgNjcgNDAzIDI4VDI1MCAtMTFRMTMxIC0xMSAyNiA1MEw3NSAxNDZRMTE3IDEyMyAxNjEgMTA4VDI0OSA5MlEyODUgOTIgMzA1IDEwNFQzMjUgMTQ1UTMyNSAxNjAgMzE3IDE2OFQyOTUgMTgzVDI2MiAxOTJUMjIyIDIwMVExODkgMjA4IDE1NyAyMThUOTkgMjQ3VDU5IDI5NFQ0MyAzNjRRNDMgMzk1IDU1IDQyMlQ5MyA0NjlUMTU4IDUwMVQyNTAgNTEzUTI5OSA1MTMgMzQ2IDUwM1Q0MzkgNDcwTDQwMiAzNzBRMzcwIDM4NyAzMzIgMzk3VDI2MSA0MDhRMjI1IDQwOCAyMDAgMzk4VDE3NSAzNjJRMTc1IDM0OCAxODQgMzQwVDIwOSAzMjZUMjQ2IDMxNlQyOTAgMzA3UTMyMCAzMDEgMzQ5IDI5MVQ0MDMgMjY0VDQ0MiAyMjBUNDU3IDE1MVpNNDMwIDY2MkwyNjIgNTY1TDkyIDY2MkwxNDUgNzM3TDI2MCA2NjhMMzc3IDczN0w0MzAgNjYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYyOyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTM0NyA1NDNWMEgyMDFWNTQzSDE0VjY2N0g1MzVWNTQzSDM0N1pNMjU0IC0yMjhIMTU4TDE5MSAtNTdIMzQwTDI1NCAtMjI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYzOyIgaG9yaXotYWR2LXg9IjM5MSIgZD0iTTM1MyAtMlEzMjQgLTYgMzA1IC03VDI2NiAtOVEyMTUgLTkgMTgyIC0xVDEzMCAyNVQxMDMgNzJUOTYgMTQ1TDk3IDM4OUgxNVY1MDJIOThWNjM1SDIzN1Y1MDJIMzUzVjM4OUgyMzdWMTY0UTIzNyAxNDYgMjM5IDEzNVQyNDkgMTE3VDI3NiAxMDlUMzI3IDEwN1EzMzUgMTA3IDMzOSAxMDdUMzUzIDEwOFYtMkgzNTNaTTIyMSAtMjI2SDEyNUwxNTggLTU1SDMwN0wyMjEgLTIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0zNDcgNTQzVjBIMjAxVjU0M0gxNFY2NjdINTM1VjU0M0gzNDdaTTQ0NiA4MDJMMjc4IDcwNUwxMDggODAyTDE2MSA4NzdMMjc2IDgwOEwzOTMgODc3TDQ0NiA4MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjU7IiBob3Jpei1hZHYteD0iMzkxIiBkPSJNMzUzIC0yUTMyNCAtNiAzMDUgLTdUMjY2IC05UTIxNSAtOSAxODIgLTFUMTMwIDI1VDEwMyA3MlQ5NiAxNDVMOTcgMzg5SDE1VjUwMkg5OFY2MzVIMjM3VjUwMkgzNTNWMzg5SDIzN1YxNjRRMjM3IDE0NiAyMzkgMTM1VDI0OSAxMTdUMjc2IDEwOVQzMjcgMTA3UTMzNSAxMDcgMzM5IDEwN1QzNTMgMTA4Vi0yWk00MTMgNTE4SDMxOUwzNTYgNzAwSDQ5NEw0MTMgNTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY2OyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTM0NyAyODlWMEgyMDFWMjg5SDQzVjQwMkgyMDFWNTQzSDE0VjY2N0g1MzVWNTQzSDM0N1Y0MDJINTA1VjI4OUgzNDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjc7IiBob3Jpei1hZHYteD0iMzkxIiBkPSJNMjM3IDIxN1YxNjRRMjM3IDE0NiAyMzkgMTM1VDI0OSAxMTdUMjc2IDEwOVQzMjcgMTA3SDM1M1YtMlEzMjQgLTYgMzA1IC03VDI2NiAtOVEyMTUgLTkgMTgyIC0xVDEzMCAyNVQxMDQgNzJUOTYgMTQ1VjIxN0gxNVYzMjNIOTdWMzg5SDE1VjUwMkg5OFY2MzVIMjM3VjUwMkgzNTNWMzg5SDIzN1YzMjNIMzUzVjIxN0gyMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjg7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjI4IDI2OFE2MjggMjAyIDYxNCAxNTBUNTY2IDYyVDQ4MCA4VDM1MCAtMTFRMjczIC0xMSAyMjAgN1QxMzUgNjJUODggMTUwVDczIDI2OFY2NjdIMjE5VjI5MFEyMTkgMjUyIDIyMiAyMjBUMjM5IDE2M1QyNzggMTI2VDM1MCAxMTJRMzk2IDExMiA0MjIgMTI1VDQ2MSAxNjNUNDc4IDIxOVQ0ODIgMjkwVjY2N0g2MjhWMjY4SDYyOFpNNTM2IDc5NVE1MjIgNzUwIDQ5MCA3MjlUNDIzIDcwN1E0MDAgNzA3IDM4MiA3MTNUMzQ3IDcyOFQzMTYgNzQzVDI4NiA3NTBRMjY5IDc1MCAyNTMgNzQxVDIyNSA3MDZMMTYwIDc1OVExODEgODA5IDIwOCA4MjdUMjcyIDg0NlEyOTMgODQ2IDMxMSA4MzlUMzQ2IDgyNFQzNzggODA5VDQxMCA4MDJRNDI3IDgwMiA0NDMgODExVDQ2OSA4NDZMNTM2IDc5NUg1MzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjk7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBIMzk4Wk00NzkgNjU1UTQ2NSA2MTAgNDMzIDU4OVQzNjYgNTY3UTM0MyA1NjcgMzI1IDU3M1QyOTAgNTg4VDI1OSA2MDNUMjI5IDYxMFEyMTIgNjEwIDE5NiA2MDFUMTY4IDU2NkwxMDMgNjE5UTEyNCA2NjkgMTUxIDY4N1QyMTUgNzA2UTIzNiA3MDYgMjU0IDY5OVQyODkgNjg0VDMyMSA2NjlUMzUzIDY2MlEzNzAgNjYyIDM4NiA2NzFUNDEyIDcwNkw0NzkgNjU1SDQ3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MjggMjY4UTYyOCAyMDIgNjE0IDE1MFQ1NjYgNjJUNDgwIDhUMzUwIC0xMVEyNzMgLTExIDIyMCA3VDEzNSA2MlQ4OCAxNTBUNzMgMjY4VjY2N0gyMTlWMjkwUTIxOSAyNTIgMjIyIDIyMFQyMzkgMTYzVDI3OCAxMjZUMzUwIDExMlEzOTYgMTEyIDQyMiAxMjVUNDYxIDE2M1Q0NzggMjE5VDQ4MiAyOTBWNjY3SDYyOFYyNjhINjI4Wk0xOTAgNzI3VjgxNEg1MTNWNzI3SDE5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QjsiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0zOTggMEwzOTAgNThIMzg2UTM2NCAyNSAzMjkgN1QyNDIgLTEyUTIwMCAtMTIgMTY3IC0zVDExMCAyOVQ3NSA5MFQ2MyAxODhWNTAySDIwNFYyMzRRMjA0IDIwNSAyMDYgMTgxVDIxNiAxNDFUMjQxIDExNVQyODggMTA2UTM0NSAxMDYgMzYyIDEzMlQzODAgMjA3VjUwMkg1MjFWMEgzOThaTTEyOSA1ODdWNjc0SDQ1MlY1ODdIMTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTYyOCAyNjhRNjI4IDIwMiA2MTQgMTUwVDU2NiA2MlQ0ODAgOFQzNTAgLTExUTI3MyAtMTEgMjIwIDdUMTM1IDYyVDg4IDE1MFQ3MyAyNjhWNjY3SDIxOVYyOTBRMjE5IDI1MiAyMjIgMjIwVDIzOSAxNjNUMjc4IDEyNlQzNTAgMTEyUTM5NiAxMTIgNDIyIDEyNVQ0NjEgMTYzVDQ3OCAyMTlUNDgyIDI5MFY2NjdINjI4VjI2OEg2MjhaTTUyNSA4NDZRNTIwIDgwMSA1MDEgNzc0VDQ1NyA3MzFUNDAzIDcxMFQzNTAgNzA1UTMyNiA3MDUgMjk4IDcxMFQyNDYgNzMwVDIwMyA3NzNUMTc5IDg0NkgyNzZRMjc5IDgyMCAyOTYgNzk5VDM1MSA3NzhRMzg3IDc3OCA0MDYgNzk5VDQyNyA4NDZINTI1SDUyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RDsiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0zOTggMEwzOTAgNThIMzg2UTM2NCAyNSAzMjkgN1QyNDIgLTEyUTIwMCAtMTIgMTY3IC0zVDExMCAyOVQ3NSA5MFQ2MyAxODhWNTAySDIwNFYyMzRRMjA0IDIwNSAyMDYgMTgxVDIxNiAxNDFUMjQxIDExNVQyODggMTA2UTM0NSAxMDYgMzYyIDEzMlQzODAgMjA3VjUwMkg1MjFWMEgzOThaTTQ2NyA3MDZRNDYyIDY2MSA0NDMgNjM0VDM5OSA1OTFUMzQ1IDU3MFQyOTIgNTY1UTI2OCA1NjUgMjQwIDU3MFQxODggNTkwVDE0NSA2MzNUMTIxIDcwNkgyMThRMjIxIDY4MCAyMzggNjU5VDI5MyA2MzhRMzI5IDYzOCAzNDggNjU5VDM2OSA3MDZINDY3SDQ2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MjggMjY4UTYyOCAyMDIgNjE0IDE1MFQ1NjYgNjJUNDgwIDhUMzUwIC0xMVEyNzMgLTExIDIyMCA3VDEzNSA2MlQ4OCAxNTBUNzMgMjY4VjY2N0gyMTlWMjkwUTIxOSAyNTIgMjIyIDIyMFQyMzkgMTYzVDI3OCAxMjZUMzUwIDExMlEzOTYgMTEyIDQyMiAxMjVUNDYxIDE2M1Q0NzggMjE5VDQ4MiAyOTBWNjY3SDYyOFYyNjhINjI4Wk00NjMgNzk2UTQ2MyA3NzMgNDU1IDc1NFQ0MzEgNzIwVDM5NiA2OThUMzUxIDY5MFEzMjggNjkwIDMwOCA2OThUMjczIDcyMFQyNDkgNzUzVDI0MCA3OTZRMjQwIDg0NCAyNzIgODczVDM1MSA5MDNRMzk5IDkwMyA0MzEgODc0VDQ2MyA3OTZaTTQwMiA3OTZRNDAyIDgxOSAzODggODMzVDM1MiA4NDhRMzI5IDg0OCAzMTUgODM0VDMwMSA3OTZRMzAxIDc3MyAzMTUgNzU5VDM1MiA3NDRRMzc0IDc0NCAzODggNzU4VDQwMiA3OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkY7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBIMzk4Wk00MDQgNjY4UTQwNCA2NDUgMzk2IDYyNlQzNzIgNTkyVDMzNyA1NzBUMjkyIDU2MlEyNjkgNTYyIDI0OSA1NzBUMjE0IDU5MlQxOTAgNjI1VDE4MSA2NjhRMTgxIDcxNiAyMTMgNzQ1VDI5MiA3NzVRMzQwIDc3NSAzNzIgNzQ2VDQwNCA2NjhaTTM0MyA2NjhRMzQzIDY5MSAzMjkgNzA1VDI5MyA3MjBRMjcwIDcyMCAyNTYgNzA2VDI0MiA2NjhRMjQyIDY0NSAyNTYgNjMxVDI5MyA2MTZRMzE1IDYxNiAzMjkgNjMwVDM0MyA2NjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjI4IDI2OFE2MjggMjAyIDYxNCAxNTBUNTY2IDYyVDQ4MCA4VDM1MCAtMTFRMjczIC0xMSAyMjAgN1QxMzUgNjJUODggMTUwVDczIDI2OFY2NjdIMjE5VjI5MFEyMTkgMjUyIDIyMiAyMjBUMjM5IDE2M1QyNzggMTI2VDM1MCAxMTJRMzk2IDExMiA0MjIgMTI1VDQ2MSAxNjNUNDc4IDIxOVQ0ODIgMjkwVjY2N0g2MjhWMjY4SDYyOFpNNDk5IDcwNkw0MjcgNzUwTDU3NCA4ODFMNjk1IDgyNEw0OTkgNzA2Wk0yMzEgNzA2TDE2MCA3NTBMMzA3IDg4MUw0MjggODI0TDIzMSA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzE7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBIMzk4Wk00NDQgNTY2TDM3MiA2MTBMNTE5IDc0MUw2NDAgNjg0TDQ0NCA1NjZaTTE3NiA1NjZMMTA1IDYxMEwyNTIgNzQxTDM3MyA2ODRMMTc2IDU2NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MjsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02MjggMjY4UTYyOCAxNjggNTk0IDEwMlQ0NzkgOFE0MzUgLTI1IDQyMSAtNTBUNDA2IC05N1E0MDYgLTEyMyA0MjAgLTEzNVQ0NTQgLTE0OFE0NzQgLTE0OCA0ODUgLTE0M1Q1MDYgLTEzM0w1MjkgLTIxMVE1MTUgLTIxNyA0ODYgLTIyNFQ0MjkgLTIzMlEzNjggLTIzMiAzMzggLTIwMlQzMDggLTEyM1EzMDggLTkwIDMyNiAtNjFUMzc0IC0xMFEzNjcgLTExIDM2MiAtMTFUMzUwIC0xMVEyNzMgLTExIDIyMCA3VDEzNSA2MlQ4OCAxNTBUNzMgMjY4VjY2N0gyMTlWMjkwUTIxOSAyNTIgMjIyIDIyMFQyMzkgMTYzVDI3OCAxMjZUMzUwIDExMlEzOTYgMTEyIDQyMiAxMjVUNDYxIDE2M1Q0NzggMjE5VDQ4MiAyOTBWNjY3SDYyOFYyNjhINjI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTQ4MCAwUTQzOSAtMjkgNDIyIC01NlQ0MDUgLTEwNVE0MDUgLTEzMSA0MTkgLTE0M1Q0NTMgLTE1NlE0NzMgLTE1NiA0ODQgLTE1MVQ1MDUgLTE0MUw1MjggLTIxOVE1MTQgLTIyNiA0ODUgLTIzM1Q0MjggLTI0MVEzNjggLTI0MSAzMzggLTIxMVQzMDcgLTEzMFEzMDcgLTg5IDMzMyAtNTZUMzk4IDBMMzkwIDU4SDM4NlEzNjQgMjUgMzI5IDdUMjQyIC0xMlEyMDAgLTEyIDE2NyAtM1QxMTAgMjlUNzUgOTBUNjMgMTg4VjUwMkgyMDRWMjM0UTIwNCAyMDUgMjA2IDE4MVQyMTYgMTQxVDI0MSAxMTVUMjg4IDEwNlEzNDUgMTA2IDM2MiAxMzJUMzgwIDIwN1Y1MDJINTIxVjBINDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc0OyIgaG9yaXotYWR2LXg9IjEwMDUiIGQ9Ik03ODggMEg2MzJMNTAzIDQ3M0g0OThMMzY3IDBIMjA0TDIxIDY2N0gxODJMMjkxIDE3N0gyOTVMNDMxIDY2N0g1NzlMNzA4IDE3N0g3MTJMODI5IDY2N0g5ODRMNzg4IDBaTTYyOCA3MDFMNTAzIDc3NUwzNzYgNzAxTDMyMCA3ODBMNTAxIDg3OEw2ODUgNzgwTDYyOCA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzU7IiBob3Jpei1hZHYteD0iNzk2IiBkPSJNNjI3IDBINDkzTDM5OCAyOThIMzk0TDMwMyAwSDE2NkwxNiA1MDJIMTYzTDI0MiAxNTBIMjQ2TDM0MiA1MDJINDUyTDU1MSAxNDlINTU1TDYzOCA1MDJINzgwTDYyNyAwWk01MjMgNTYxTDM5OCA2MzVMMjcxIDU2MUwyMTUgNjQwTDM5NiA3MzhMNTgwIDY0MEw1MjMgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc2OyIgaG9yaXotYWR2LXg9IjY0NiIgZD0iTTM5NyAyNjJWMEgyNTFWMjU5TDIgNjY3SDE3MEwzMjUgMzkwTDQ4MyA2NjdINjQ0TDM5NyAyNjJaTTQ1MyA3MDFMMzI4IDc3NUwyMDEgNzAxTDE0NSA3ODBMMzI2IDg3OEw1MTAgNzgwTDQ1MyA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzc7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMzM1IC0yMVEzMTAgLTgzIDI5MCAtMTIzVDI0NyAtMTg2VDE5MiAtMjE3VDExNSAtMjI2UTEwMSAtMjI2IDgzIC0yMjVUNDAgLTIyMVYtMTA0UTQ3IC0xMDYgNjAgLTEwNlQ5NiAtMTA3UTExNiAtMTA3IDEyOCAtMTA0VDE1MCAtOTRUMTY1IC03NlQxNzkgLTQ3TDIwMyAxMUw3IDUwMkgxNjBMMjc0IDE1NEgyNzhMMzkxIDUwMkg1NDJMMzM1IC0yMVpNNDA0IDU2MUwyNzkgNjM1TDE1MiA1NjFMOTYgNjQwTDI3NyA3MzhMNDYxIDY0MEw0MDQgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc4OyIgaG9yaXotYWR2LXg9IjY0NiIgZD0iTTM5NyAyNjJWMEgyNTFWMjU5TDIgNjY3SDE3MEwzMjUgMzkwTDQ4MyA2NjdINjQ0TDM5NyAyNjJaTTUwNyA3NzlRNTA3IDc1MCA0ODcgNzMwVDQzOCA3MDlRNDA5IDcwOSAzODkgNzI5VDM2OCA3NzlRMzY4IDgwOCAzODggODI4VDQzOCA4NDhRNDY3IDg0OCA0ODcgODI4VDUwNyA3NzlaTTI4NCA3NzlRMjg0IDc1MCAyNjQgNzMwVDIxNSA3MDlRMTg2IDcwOSAxNjYgNzI5VDE0NiA3NzlRMTQ2IDgwOCAxNjYgODI4VDIxNSA4NDhRMjQ0IDg0OCAyNjQgODI4VDI4NCA3NzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzk7IiBob3Jpei1hZHYteD0iNjA3IiBkPSJNNDMgMFYxMDdMMzY3IDU0M0g1OVY2NjdINTQ4VjU2MEwyMjAgMTE5SDU2NFYwSDQzWk0yOTggNzA1TDIxNCA3NTBMMzUzIDg4Mkw0OTQgODIzTDI5OCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0E7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNMzQgMFY5NUwyNjcgMzg5SDM3VjUwMkg0MzlWNDAxTDIxMCAxMTJINDQ4VjBIMzRaTTIzMiA1NjVMMTQ4IDYxMEwyODcgNzQyTDQyOCA2ODNMMjMyIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QjsiIGhvcml6LWFkdi14PSI2MDciIGQ9Ik00MyAwVjEwN0wzNjcgNTQzSDU5VjY2N0g1NDhWNTYwTDIyMCAxMTlINTY0VjBINDNaTTM5NyA3ODZRMzk3IDc1NCAzNzUgNzM1VDMxNCA3MTZRMjc2IDcxNiAyNTMgNzM1VDIzMCA3ODZRMjMwIDgxOCAyNTMgODM2VDMxNCA4NTVRMzUyIDg1NSAzNzQgODM3VDM5NyA3ODZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0M7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNMzQgMFY5NUwyNjcgMzg5SDM3VjUwMkg0MzlWNDAxTDIxMCAxMTJINDQ4VjBIMzRaTTMzNSA2MzlRMzM1IDYwNyAzMTMgNTg4VDI1MiA1NjlRMjE0IDU2OSAxOTEgNTg4VDE2OCA2MzlRMTY4IDY3MSAxOTEgNjg5VDI1MiA3MDhRMjkwIDcwOCAzMTIgNjkwVDMzNSA2MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0Q7IiBob3Jpei1hZHYteD0iNjA3IiBkPSJNNDMgMFYxMDdMMzY3IDU0M0g1OVY2NjdINTQ4VjU2MEwyMjAgMTE5SDU2NFYwSDQzWk00ODAgODAyTDMxMiA3MDVMMTQyIDgwMkwxOTUgODc3TDMxMCA4MDhMNDI3IDg3N0w0ODAgODAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdFOyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTM0IDBWOTVMMjY3IDM4OUgzN1Y1MDJINDM5VjQwMUwyMTAgMTEySDQ0OFYwSDM0Wk00MjQgNjYyTDI1NiA1NjVMODYgNjYyTDEzOSA3MzdMMjU0IDY2OEwzNzEgNzM3TDQyNCA2NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxOTI7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTUzIDU5MVE1NDEgNTkyIDUzNCA1OTNUNTExIDU5NFE0NjcgNTk0IDQ1MCA1NzlUNDI4IDUzNUw0MTAgNDQ4SDUxOEw0OTggMzM0SDM5MkwzMjUgLTdRMzA2IC0xMDAgMjYyIC0xNDdUMTMxIC0xOTVRMTA4IC0xOTUgODUgLTE5MlQ0MiAtMTgyTDYwIC04MFE3NCAtODQgODYgLTg1VDExOSAtODZRMTU2IC04NiAxNzIgLTUxVDE5OCA0M0wyNTEgMzM0SDE3NEwxOTQgNDQ4SDI3MUwyOTAgNTUzUTI5NyA1OTQgMzExIDYyMVQzNTAgNjY0VDQxMyA2ODhUNTA3IDY5NVE1MjQgNjk1IDUzNyA2OTVUNTcxIDY5NEw1NTMgNTkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZDOyIgaG9yaXotYWR2LXg9IjkzOSIgZD0iTTQ1NCAwVjE1MUgyMzRMMTY1IDBIMTRMMzU1IDY2N0g4OTJWNTQ4SDU5N1Y0MDZIODYzVjI4M0g1OTdWMTE5SDkwMlYwSDQ1NFpNNDU0IDU0N0g0MzFMMjkwIDI3M0g0NTRWNTQ3Wk02MDYgNzA1TDUyMiA3NTBMNjYxIDg4Mkw4MDIgODIzTDYwNiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkQ7IiBob3Jpei1hZHYteD0iODkxIiBkPSJNODUwIDI0NFE4NTAgMjM3IDg1MCAyMjlUODQ4IDIwM0g0OTNRNDk2IDE1MiA1MjkgMTI1VDYyMiA5N1E2NjAgOTcgNjk2IDEwNlQ3NzEgMTM4TDgxNyA0M1E3NjkgMTUgNzIwIDJUNjE3IC0xMVE1NDkgLTExIDQ5OSAxMFQ0MTQgNjlRMzc2IDM3IDMyNCAxM1QyMDAgLTEyUTEyNCAtMTIgODAgMjhUMzYgMTQxUTM2IDE5MCA1NyAyMjRUMTE4IDI4MVQyMTcgMzEzVDM1MCAzMjNWMzQwUTM1MCAzNTYgMzQ4IDM2OFQzMzkgMzg5VDMxNiA0MDFUMjc2IDQwNlEyNDAgNDA2IDE5MSAzOTRUOTQgMzU1TDQ4IDQ1M1ExMDkgNDg0IDE2NiA0OThUMjg4IDUxM1EzNDEgNTEzIDM4MSA1MDBUNDQ0IDQ1N1E0NzcgNDg3IDUxOSA1MDBUNjA2IDUxNFE2NjEgNTE0IDcwNiA0OTZUNzgzIDQ0MlQ4MzIgMzU3VDg1MCAyNDRaTTcyMiAyOTVRNzE3IDM0OCA2OTEgMzc5VDYwOCA0MTFRNTU1IDQxMSA1MjQgMzgxVDQ5MiAyOTVINzIyWk0zNzEgMTM0UTM2MCAxNTMgMzU2IDE3NlQzNTEgMjI2VjI0MlEyNTMgMjQyIDIxMyAyMTlUMTczIDE0OVExNzMgMTE3IDE5MiA5N1QyNDMgNzdRMjY5IDc3IDMwMiA5MlQzNzEgMTM0Wk00NjYgNTY1TDM4MiA2MTBMNTIxIDc0Mkw2NjIgNjgzTDQ2NiA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkU7IiBob3Jpei1hZHYteD0iNzg1IiBkPSJNNzI5IDMzNFE3MjkgMjQ0IDcwNCAxNzlUNjM0IDcyVDUyOCAxMFQzOTMgLTEwUTMzOCAtMTAgMjg3IDFUMTkyIDQwTDEzMSAtMjZMNTYgNTlMMTEyIDExOFE1NiAyMDAgNTYgMzM0UTU2IDQyNCA4MSA0ODlUMTUxIDU5NlQyNTggNjU4VDM5MyA2NzhRNDUwIDY3OCA1MDEgNjY2VDU5NCA2MjhMNjUzIDY5MEw3MzMgNjEyTDY3MyA1NDlRNzAyIDUwOCA3MTUgNDU0VDcyOSAzMzRaTTU3NyAzMzRRNTc3IDM2MiA1NzIgMzkxVDU1NiA0NDNMMjg3IDEzNFEzMzIgMTA4IDM5MyAxMDhRNDkzIDEwOCA1MzUgMTY3VDU3NyAzMzRaTTIwOCAzMzRRMjA4IDMwNCAyMTIgMjc2VDIyNiAyMjVMNTAwIDUzNFE0ODAgNTQ2IDQ1NCA1NTNUMzkzIDU2MFEzNDMgNTYwIDMwOCA1NDVUMjUwIDUwMlQyMTggNDMxVDIwOCAzMzRaTTM3MyA3MDlMMjg5IDc1NEw0MjggODg2TDU2OSA4MjdMMzczIDcwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFGRjsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik01MTAgNDI0UTUzNiAzOTAgNTQ3IDM0NlQ1NTkgMjUxUTU1OSAxOTMgNTQ0IDE0NVQ0OTYgNjJUNDE2IDhUMzAxIC0xMVEyMDUgLTExIDE0MyAzM0w5MSAtMjNMMzEgNDFMODAgOTVRNjAgMTI3IDUxIDE2NlQ0MiAyNTFRNDIgMzA2IDU2IDM1M1QxMDIgNDM2VDE4MyA0OTJUMzAxIDUxM1EzODQgNTEzIDQ0MSA0ODJMNDk4IDUzOUw1NjMgNDgwTDUxMCA0MjRaTTM2MCAzNzlRMzQ5IDM5MCAzMzQgMzk1VDMwMSA0MDBRMjM2IDQwMCAyMTEgMzYyVDE4NSAyNTFRMTg1IDI0MCAxODYgMjIyVDE5MSAxOTNMMzYwIDM3OVpNNDE2IDI1MVE0MTYgMjY4IDQxNCAyODlUNDA2IDMyNEwyMjQgMTI5UTIzNSAxMTQgMjU3IDEwNlQzMDIgOThRMzY1IDk4IDM5MCAxMzZUNDE2IDI1MVpNMjk5IDU2NUwyMTUgNjEwTDM1NCA3NDJMNDk1IDY4M0wyOTkgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE4OyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTU1MyAxOTVRNTUzIDEzOCA1MzMgOTlUNDc5IDM1VDM5OSAxVDMwMiAtMTBRMjI0IC0xMCAxNjEgOFQzMyA3MUw5NyAxNzVRMTQzIDE0NSAxOTEgMTI1VDI5NSAxMDRRMzE1IDEwNCAzMzUgMTA3VDM3MiAxMThUMzk5IDE0MlQ0MTAgMTgyUTQxMCAyMDcgMzk0IDIyM1QzNTMgMjUxVDI5NCAyNzJUMjI2IDI5NFExOTMgMzA1IDE2MiAzMjBUMTA3IDM1N1Q2OCA0MTJUNTMgNDg5UTUzIDU0MyA3NCA1NzhUMTMwIDYzNlQyMDkgNjY3VDI5OSA2NzZRMzYyIDY3NiA0MTggNjYxVDUzMCA2MTdMNDc4IDUwNVE0NDAgNTI4IDM5NiA1NDNUMzA5IDU1OVEyODcgNTU5IDI2OCA1NTdUMjMzIDU0N1QyMDkgNTI3VDIwMCA0OTRRMjAwIDQ3MyAyMTEgNDU5VDI0MSA0MzVUMjg3IDQxN1QzNDQgNDAxUTM4MCAzOTEgNDE3IDM3OFQ0ODUgMzQxVDUzNCAyODJUNTUzIDE5NVpNMjg5IC0yMjZIMTkzTDIyNiAtNTVIMzc1TDI4OSAtMjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE5OyIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTQ1NyAxNTFRNDU3IDY3IDQwMyAyOFQyNTAgLTExUTEzMSAtMTEgMjYgNTBMNzUgMTQ2UTExNyAxMjMgMTYxIDEwOFQyNDkgOTJRMjg1IDkyIDMwNSAxMDRUMzI1IDE0NVEzMjUgMTYwIDMxNyAxNjhUMjk1IDE4M1QyNjIgMTkyVDIyMiAyMDFRMTg5IDIwOCAxNTcgMjE4VDk5IDI0N1Q1OSAyOTRUNDMgMzY0UTQzIDM5NSA1NSA0MjJUOTMgNDY5VDE1OCA1MDFUMjUwIDUxM1EyOTkgNTEzIDM0NiA1MDNUNDM5IDQ3MEw0MDIgMzcwUTM3MCAzODcgMzMyIDM5N1QyNjEgNDA4UTIyNSA0MDggMjAwIDM5OFQxNzUgMzYyUTE3NSAzNDggMTg0IDM0MFQyMDkgMzI2VDI0NiAzMTZUMjkwIDMwN1EzMjAgMzAxIDM0OSAyOTFUNDAzIDI2NFQ0NDIgMjIwVDQ1NyAxNTFaTTIzOSAtMjI2SDE0M0wxNzYgLTU1SDMyNUwyMzkgLTIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIzNzsiIGhvcml6LWFkdi14PSIyNzQiIGQ9Ik0yMTEgLTE3UTIxMSAtMjI2IDUgLTIyNlEtMTcgLTIyNiAtMzcgLTIyNVQtNzggLTIyMVYtMTAzUS00NSAtMTA2IC0xMiAtMTA2UTE3IC0xMDYgMzMgLTEwMFQ1OCAtODBUNjggLTQ3VDcwIDBWNTAySDIxMVYtMTdIMjExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM2OyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTMwMCA1NjFMMTc1IDYzNUw0OCA1NjFMLTggNjQwTDE3MyA3MzhMMzU3IDY0MEwzMDAgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM3OyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTM0MyA2NjJMMTc1IDU2NUw1IDY2Mkw1OCA3MzdMMTczIDY2OEwyOTAgNzM3TDM0MyA2NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyRDg7IiBob3Jpei1hZHYteD0iMzQ4IiBkPSJNMzQ3IDcwNlEzNDIgNjYxIDMyMyA2MzRUMjc5IDU5MVQyMjUgNTcwVDE3MiA1NjVRMTQ4IDU2NSAxMjAgNTcwVDY4IDU5MFQyNSA2MzNUMSA3MDZIOThRMTAxIDY4MCAxMTggNjU5VDE3MyA2MzhRMjA5IDYzOCAyMjggNjU5VDI0OSA3MDZIMzQ3SDM0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEOTsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0yNTcgNjM5UTI1NyA2MDcgMjM1IDU4OFQxNzQgNTY5UTEzNiA1NjkgMTEzIDU4OFQ5MCA2MzlROTAgNjcxIDExMyA2ODlUMTc0IDcwOFEyMTIgNzA4IDIzNCA2OTBUMjU3IDYzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQTsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0yODUgNjY4UTI4NSA2NDUgMjc3IDYyNlQyNTMgNTkyVDIxOCA1NzBUMTczIDU2MlExNTAgNTYyIDEzMCA1NzBUOTUgNTkyVDcxIDYyNVQ2MiA2NjhRNjIgNzE2IDk0IDc0NVQxNzMgNzc1UTIyMSA3NzUgMjUzIDc0NlQyODUgNjY4Wk0yMjQgNjY4UTIyNCA2OTEgMjEwIDcwNVQxNzQgNzIwUTE1MSA3MjAgMTM3IDcwNlQxMjMgNjY4UTEyMyA2NDUgMTM3IDYzMVQxNzQgNjE2UTE5NiA2MTYgMjEwIDYzMFQyMjQgNjY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRCOyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTIwNCAtMjRRMTg2IC00MCAxNzMgLTYyVDE1OSAtMTA1UTE1OSAtMTMxIDE3MyAtMTQzVDIwNyAtMTU2UTIyNyAtMTU2IDIzOCAtMTUxVDI1OSAtMTQxTDI4MiAtMjE5UTI2OCAtMjI2IDIzOSAtMjMzVDE4MiAtMjQxUTEyMiAtMjQxIDkyIC0yMTFUNjEgLTEzMFE2MSAtMTA0IDczIC04MVQxMDQgLTM4VDE0NyAtM1QxOTggMjJMMjM1IDFMMjA0IC0yNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQzsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0zNjIgNjU1UTM0OCA2MTAgMzE2IDU4OVQyNDkgNTY3UTIyNiA1NjcgMjA4IDU3M1QxNzMgNTg4VDE0MiA2MDNUMTEyIDYxMFE5NSA2MTAgNzkgNjAxVDUxIDU2NkwtMTQgNjE5UTcgNjY5IDM0IDY4N1Q5OCA3MDZRMTE5IDcwNiAxMzcgNjk5VDE3MiA2ODRUMjA0IDY2OVQyMzYgNjYyUTI1MyA2NjIgMjY5IDY3MVQyOTUgNzA2TDM2MiA2NTVIMzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkREOyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTI2MSA1NjZMMTg5IDYxMEwzMzYgNzQxTDQ1NyA2ODRMMjYxIDU2NlpNLTcgNTY2TC03OCA2MTBMNjkgNzQxTDE5MCA2ODRMLTcgNTY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4MDsiIGhvcml6LWFkdi14PSIxMDA1IiBkPSJNNzg4IDBINjMyTDUwMyA0NzNINDk4TDM2NyAwSDIwNEwyMSA2NjdIMTgyTDI5MSAxNzdIMjk1TDQzMSA2NjdINTc5TDcwOCAxNzdINzEyTDgyOSA2NjdIOTg0TDc4OCAwWk01MDUgNzA1TDMwOSA4MjNMNDUwIDg4MUw1ODkgNzUwTDUwNSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgxOyIgaG9yaXotYWR2LXg9Ijc5NiIgZD0iTTYyNyAwSDQ5M0wzOTggMjk4SDM5NEwzMDMgMEgxNjZMMTYgNTAySDE2M0wyNDIgMTUwSDI0NkwzNDIgNTAySDQ1Mkw1NTEgMTQ5SDU1NUw2MzggNTAySDc4MEw2MjcgMFpNNDAwIDU2NUwyMDQgNjgzTDM0NSA3NDFMNDg0IDYxMEw0MDAgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4MjsiIGhvcml6LWFkdi14PSIxMDA1IiBkPSJNNzg4IDBINjMyTDUwMyA0NzNINDk4TDM2NyAwSDIwNEwyMSA2NjdIMTgyTDI5MSAxNzdIMjk1TDQzMSA2NjdINTc5TDcwOCAxNzdINzEyTDgyOSA2NjdIOTg0TDc4OCAwWk01MDkgNzA1TDQyNSA3NTBMNTY0IDg4Mkw3MDUgODIzTDUwOSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgzOyIgaG9yaXotYWR2LXg9Ijc5NiIgZD0iTTYyNyAwSDQ5M0wzOTggMjk4SDM5NEwzMDMgMEgxNjZMMTYgNTAySDE2M0wyNDIgMTUwSDI0NkwzNDIgNTAySDQ1Mkw1NTEgMTQ5SDU1NUw2MzggNTAySDc4MEw2MjcgMFpNMzk4IDU2NUwzMTQgNjEwTDQ1MyA3NDJMNTk0IDY4M0wzOTggNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NDsiIGhvcml6LWFkdi14PSIxMDA1IiBkPSJNNzg4IDBINjMyTDUwMyA0NzNINDk4TDM2NyAwSDIwNEwyMSA2NjdIMTgyTDI5MSAxNzdIMjk1TDQzMSA2NjdINTc5TDcwOCAxNzdINzEyTDgyOSA2NjdIOTg0TDc4OCAwWk02ODIgNzc5UTY4MiA3NTAgNjYyIDczMFQ2MTMgNzA5UTU4NCA3MDkgNTY0IDcyOVQ1NDMgNzc5UTU0MyA4MDggNTYzIDgyOFQ2MTMgODQ4UTY0MiA4NDggNjYyIDgyOFQ2ODIgNzc5Wk00NTkgNzc5UTQ1OSA3NTAgNDM5IDczMFQzOTAgNzA5UTM2MSA3MDkgMzQxIDcyOVQzMjEgNzc5UTMyMSA4MDggMzQxIDgyOFQzOTAgODQ4UTQxOSA4NDggNDM5IDgyOFQ0NTkgNzc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NTsiIGhvcml6LWFkdi14PSI3OTYiIGQ9Ik02MjcgMEg0OTNMMzk4IDI5OEgzOTRMMzAzIDBIMTY2TDE2IDUwMkgxNjNMMjQyIDE1MEgyNDZMMzQyIDUwMkg0NTJMNTUxIDE0OUg1NTVMNjM4IDUwMkg3ODBMNjI3IDBaTTU3NyA2MzlRNTc3IDYxMCA1NTcgNTkwVDUwOCA1NjlRNDc5IDU2OSA0NTkgNTg5VDQzOCA2MzlRNDM4IDY2OCA0NTggNjg4VDUwOCA3MDhRNTM3IDcwOCA1NTcgNjg4VDU3NyA2MzlaTTM1NCA2MzlRMzU0IDYxMCAzMzQgNTkwVDI4NSA1NjlRMjU2IDU2OSAyMzYgNTg5VDIxNiA2MzlRMjE2IDY2OCAyMzYgNjg4VDI4NSA3MDhRMzE0IDcwOCAzMzQgNjg4VDM1NCA2MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRUYyOyIgaG9yaXotYWR2LXg9IjY0NiIgZD0iTTM5NyAyNjJWMEgyNTFWMjU5TDIgNjY3SDE3MEwzMjUgMzkwTDQ4MyA2NjdINjQ0TDM5NyAyNjJaTTMyMiA3MDVMMTI2IDgyM0wyNjcgODgxTDQwNiA3NTBMMzIyIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFRjM7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMzM1IC0yMVEzMTAgLTgzIDI5MCAtMTIzVDI0NyAtMTg2VDE5MiAtMjE3VDExNSAtMjI2UTEwMSAtMjI2IDgzIC0yMjVUNDAgLTIyMVYtMTA0UTQ3IC0xMDYgNjAgLTEwNlQ5NiAtMTA3UTExNiAtMTA3IDEyOCAtMTA0VDE1MCAtOTRUMTY1IC03NlQxNzkgLTQ3TDIwMyAxMUw3IDUwMkgxNjBMMjc0IDE1NEgyNzhMMzkxIDUwMkg1NDJMMzM1IC0yMVpNMjgxIDU2NUw4NSA2ODNMMjI2IDc0MUwzNjUgNjEwTDI4MSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDEzOyIgaG9yaXotYWR2LXg9IjU4OCIgZD0iTTQ0IDIwOFYzMTVINTQ0VjIwOEg0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTQ7IiBob3Jpei1hZHYteD0iODY2IiBkPSJNNDQgMjEwVjMxM0g4MjJWMjEwSDQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0xNzIgNDU1SDE0TDEyNSA3MDBIMjI1TDE3MiA0NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE5OyIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTE0NyA0NTVINDdMMTAwIDcwMEgyNThMMTQ3IDQ1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBob3Jpei1hZHYteD0iMjcyIiBkPSJNMTQ3IC0xNzhINDdMMTAwIDY3SDI1OEwxNDcgLTE3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUM7IiBob3Jpei1hZHYteD0iNTE2IiBkPSJNNDE2IDQ1NUgyNThMMzY5IDcwMEg0NjlMNDE2IDQ1NVpNMTcyIDQ1NUgxNEwxMjUgNzAwSDIyNUwxNzIgNDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRDsiIGhvcml6LWFkdi14PSI1MTYiIGQ9Ik0zOTAgNDU1SDI5MEwzNDMgNzAwSDUwMkwzOTAgNDU1Wk0xNDcgNDU1SDQ3TDEwMCA3MDBIMjU4TDE0NyA0NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFFOyIgaG9yaXotYWR2LXg9IjUxNiIgZD0iTTM5MCAtMTc5SDI5MEwzNDMgNjdINTAyTDM5MCAtMTc5Wk0xNDcgLTE3OUg0N0wxMDAgNjdIMjU4TDE0NyAtMTc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMDsiIGhvcml6LWFkdi14PSIzODUiIGQ9Ik0yNjIgNDQ5VjE4OEgxMjRWNDQ5SDMyVjU2MUgxMjRWNjkySDI2MlY1NjFIMzUzVjQ0OUgyNjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIxOyIgaG9yaXotYWR2LXg9IjM4NSIgZD0iTTI2MSAyNTBWMTIwSDEyNFYyNTBIMzNWMzYySDEyNFY0NjFIMzJWNTc0SDEyNFY2OTJIMjYxVjU3NEgzNTNWNDYxSDI2MVYzNjJIMzUzVjI1MEgyNjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIyOyIgaG9yaXotYWR2LXg9IjUxNyIgZD0iTTQyNSAzMjlRNDI1IDI5NCA0MTIgMjY0VDM3NyAyMTJUMzI0IDE3NlQyNTggMTYzUTIyMyAxNjMgMTkzIDE3NlQxNDEgMjExVDEwNSAyNjRUOTIgMzI5UTkyIDM2MyAxMDUgMzkzVDE0MCA0NDZUMTkzIDQ4MlQyNTggNDk1UTI5MyA0OTUgMzIzIDQ4MlQzNzYgNDQ3VDQxMiAzOTRUNDI1IDMyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjY7IiBob3Jpei1hZHYteD0iODM3IiBkPSJNMjE2IDU2UTIxNiAyNyAxOTIgOFQxMzIgLTExUTk1IC0xMSA3MSA4VDQ3IDU2UTQ3IDg0IDcxIDEwMlQxMzEgMTIxUTE2OCAxMjEgMTkyIDEwM1QyMTYgNTZaTTUwMyA1NlE1MDMgMjcgNDc5IDhUNDE5IC0xMVEzODIgLTExIDM1OCA4VDMzMyA1NlEzMzMgODQgMzU4IDEwMlQ0MTggMTIxUTQ1NCAxMjEgNDc4IDEwM1Q1MDMgNTZaTTc5MCA1NlE3OTAgMjcgNzY2IDhUNzA2IC0xMVE2NzAgLTExIDY0NiA4VDYyMSA1NlE2MjEgODQgNjQ1IDEwMlQ3MDUgMTIxUTc0MiAxMjEgNzY2IDEwM1Q3OTAgNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDMwOyIgaG9yaXotYWR2LXg9IjEwNTgiIGQ9Ik0zMDEgNTQ3UTMwMSA1MTYgMjk1IDQ4OVQyNzMgNDQwVDIzMyA0MDdUMTcwIDM5NVExMzIgMzk1IDEwNyA0MDdUNjcgNDM5VDQ2IDQ4N1Q0MCA1NDdRNDAgNTc5IDQ2IDYwN1Q2NyA2NTVUMTA3IDY4OFQxNzAgNzAwUTIwOCA3MDAgMjMzIDY4OFQyNzMgNjU1VDI5NCA2MDZUMzAxIDU0N1pNMjIxIDU0OVEyMjEgNTg1IDIxMiA2MTBUMTcwIDYzNlExMzcgNjM2IDEyOSA2MTFUMTIwIDU0OFExMjAgNTA2IDEyOSA0ODJUMTcwIDQ1OFEyMDIgNDU4IDIxMSA0ODJUMjIxIDU0OVpNMjAzIDBIMTI2TDU4OCA3MDBINjY0TDIwMyAwWk02ODYgMTQ3UTY4NiAxMTUgNjgwIDg4VDY1OCA0MFQ2MTggN1Q1NTUgLTVRNTE3IC01IDQ5MiA3VDQ1MiAzOVQ0MzEgODdUNDI1IDE0N1E0MjUgMTc5IDQzMSAyMDdUNDUyIDI1NVQ0OTIgMjg4VDU1NSAzMDBRNTkyIDMwMCA2MTcgMjg4VDY1OCAyNTVUNjc5IDIwNlQ2ODYgMTQ3Wk02MDYgMTQ4UTYwNiAxODUgNTk3IDIxMFQ1NTUgMjM2UTUyMiAyMzYgNTEzIDIxMVQ1MDQgMTQ4UTUwNCAxMDUgNTE0IDgxVDU1NSA1N1E1ODcgNTcgNTk2IDgxVDYwNiAxNDhaTTEwMTggMTQ3UTEwMTggMTE1IDEwMTIgODhUOTkwIDQwVDk1MCA3VDg4NyAtNVE4NDkgLTUgODI0IDdUNzg0IDM5VDc2MyA4N1Q3NTYgMTQ3UTc1NiAxNzkgNzYyIDIwN1Q3ODQgMjU1VDgyNCAyODhUODg3IDMwMFE5MjQgMzAwIDk0OSAyODhUOTkwIDI1NVQxMDExIDIwNlQxMDE4IDE0N1pNOTM3IDE0OFE5MzcgMTg1IDkyOSAyMTBUODg3IDIzNlE4NTQgMjM2IDg0NSAyMTFUODM2IDE0OFE4MzYgMTA1IDg0NSA4MVQ4ODcgNTdROTE4IDU3IDkyNyA4MVQ5MzcgMTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGhvcml6LWFkdi14PSIyNzAiIGQ9Ik0xMzkgOTdMMTQgMzAwTDEzOSA1MDJMMjM0IDQ1NUwxMzMgMjk5TDIzNCAxNDRMMTM5IDk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzQTsiIGhvcml6LWFkdi14PSIyNzAiIGQ9Ik0xMzEgOTdMMzYgMTQ0TDEzNyAyOTlMMzYgNDU1TDEzMSA1MDJMMjU2IDMwMEwxMzEgOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgaG9yaXotYWR2LXg9IjEzMSIgZD0iTS0xNTYgMEgtMjMyTDI4OCA3MDBIMzY0TC0xNTYgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzA7IiBob3Jpei1hZHYteD0iMzY4IiBkPSJNMzI5IDUzMFEzMjkgNDk1IDMyMiA0NjVUMjk5IDQxMVQyNTQgMzc1VDE4NCAzNjFRMTQyIDM2MSAxMTQgMzc0VDcwIDQxMVQ0NiA0NjRUMzkgNTMwUTM5IDU2NSA0NiA1OTZUNjkgNjUwVDExNCA2ODZUMTg0IDcwMFEyMjYgNzAwIDI1NCA2ODdUMjk4IDY1MFQzMjIgNTk2VDMyOSA1MzBaTTI0MCA1MzJRMjQwIDU1MiAyMzggNTcwVDIzMCA2MDFUMjEzIDYyMVQxODQgNjI5UTE2NiA2MjkgMTU1IDYyMlQxMzcgNjAxVDEyOSA1NzBUMTI3IDUzMVExMjcgNDgzIDEzOCA0NTdUMTg0IDQzMVEyMTkgNDMxIDIyOSA0NThUMjQwIDUzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzQ7IiBob3Jpei1hZHYteD0iMzQ3IiBkPSJNMjY0IDQyOVYzNjdIMTc0VjQyOUgzOEwxOCA0OTNMMTc1IDY5NEgyNjRWNTAxSDMxNVY0MjlIMjY0Wk05NyA0OTRIMTc4VjYxMUw5NyA0OTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc1OyIgaG9yaXotYWR2LXg9IjMyOSIgZD0iTTI5NSA0ODBRMjk1IDQ1NiAyODcgNDM1VDI2MiAzOTdUMjE3IDM3MVQxNTIgMzYxUTExNiAzNjEgODggMzY5VDMwIDM5OEw3MiA0NThROTAgNDQzIDExMCA0MzVUMTQ3IDQyN1ExNzggNDI3IDE5MiA0NDFUMjA3IDQ3OVEyMDcgNTAyIDE5NSA1MTRUMTUxIDUyNlExMzMgNTI2IDExOSA1MjFUOTQgNTAzTDMzIDU0MUw2MyA2OTRIMjc2VjYyMkgxMjZMMTE1IDU2NUgxMTZRMTMyIDU3NSAxNDcgNTc5VDE4NCA1ODRRMjM4IDU4NCAyNjYgNTU5VDI5NSA0ODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc2OyIgaG9yaXotYWR2LXg9IjM0MSIgZD0iTTMwNyA0NzlRMzA3IDQyNiAyNzIgMzk0VDE3NyAzNjFRMTA5IDM2MSA3NCA0MDFUMzkgNTIyUTM5IDU1NyA0NiA1ODlUNzAgNjQ2VDExNyA2ODVUMTkxIDcwMFEyMjMgNzAwIDI0NiA2OTRUMjk1IDY3MEwyNTggNjEyUTI0NCA2MjIgMjI5IDYyOFQxOTIgNjM0UTE1NyA2MzQgMTQ0IDYxMlQxMjkgNTU3SDEzMFExNDEgNTY4IDE1NyA1NzRUMTk2IDU4MVEyNDYgNTgxIDI3NiA1NThUMzA3IDQ3OVpNMjI0IDQ3NlEyMjQgNDk3IDIxMiA1MTBUMTc2IDUyM1ExNTQgNTIzIDE0MiA1MTBUMTI5IDQ3NlExMjkgNDU2IDE0MCA0NDNUMTc3IDQyOVEyMDAgNDI5IDIxMiA0NDJUMjI0IDQ3NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzc7IiBob3Jpei1hZHYteD0iMzA3IiBkPSJNMjg0IDYyN1EyNDggNTk3IDIyNyA1NzNUMTk1IDUyM1QxODEgNDY1VDE3OCAzODZWMzY3SDgzVjM4NVE4MyA0MDkgODYgNDQwVDEwMCA1MDNUMTI4IDU2NlQxNzQgNjIxVjYyM0gxNVY2OTRIMjY5TDI4NCA2MjdIMjg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3ODsiIGhvcml6LWFkdi14PSIzMzciIGQ9Ik0zMDMgNDY0UTMwMyA0NDQgMjk4IDQyNlQyNzggMzkzVDIzNyAzNzBUMTY5IDM2MVExMjcgMzYxIDEwMSAzNjlUNjAgMzkyVDQwIDQyNVQzNCA0NjRRMzQgNDkyIDQ4IDUxMFQ4OCA1MzlWNTQxUTY0IDU1MiA1NCA1NjlUNDMgNjEwUTQzIDY5OSAxNjggNjk5UTIzMyA2OTkgMjYzIDY3OFQyOTQgNjEwUTI5NCA1NjEgMjQ5IDU0MVY1MzlRMjc0IDUyOCAyODggNTEwVDMwMyA0NjRaTTIxMSA2MDJRMjExIDYxOCAyMDEgNjI5VDE2OCA2NDBRMTQ3IDY0MCAxMzcgNjI5VDEyNyA2MDJRMTI3IDU4NiAxMzcgNTc2VDE2OCA1NjVRMTg5IDU2NSAyMDAgNTc1VDIxMSA2MDJaTTIxNyA0NjdRMjE3IDQ4NCAyMDYgNDk2VDE2OCA1MDlRMTQ1IDUwOSAxMzMgNDk4VDEyMCA0NjdRMTIwIDQ0OSAxMzEgNDM2VDE2OCA0MjJRMTkyIDQyMiAyMDQgNDM1VDIxNyA0NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc5OyIgaG9yaXotYWR2LXg9IjM0MCIgZD0iTTMwMSA1MzRRMzAxIDQ5OCAyOTQgNDY3VDI2OSA0MTFUMjIyIDM3NFQxNTAgMzYwUTExOCAzNjAgOTUgMzY3VDQ0IDM5MUw4MiA0NDhROTYgNDM4IDExMSA0MzJUMTUwIDQyNlExODYgNDI2IDE5OSA0NDhUMjEzIDUwNUgyMTFRMjAxIDQ5NCAxODQgNDg3VDE0NSA0NzlROTUgNDc5IDY1IDUwMlQzNCA1ODJRMzQgNjM1IDY5IDY2N1QxNjQgNjk5UTIzMSA2OTkgMjY2IDY1OVQzMDEgNTM0Wk0yMTIgNTg2UTIxMiA2MDcgMjAxIDYyMFQxNjQgNjM0UTE0MSA2MzQgMTI5IDYyMVQxMTcgNTg3UTExNyA1NjYgMTI5IDU1M1QxNjQgNTQwUTE4NiA1NDAgMTk5IDU1MlQyMTIgNTg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MDsiIGhvcml6LWFkdi14PSIzNjgiIGQ9Ik0zMjkgNDhRMzI5IDEzIDMyMiAtMTdUMjk5IC03MVQyNTQgLTEwN1QxODQgLTEyMVExNDIgLTEyMSAxMTQgLTEwOFQ3MCAtNzFUNDYgLTE4VDM5IDQ4UTM5IDgzIDQ2IDExNFQ2OSAxNjhUMTE0IDIwNFQxODQgMjE4UTIyNiAyMTggMjU0IDIwNVQyOTggMTY4VDMyMiAxMTRUMzI5IDQ4Wk0yNDAgNTBRMjQwIDcwIDIzOCA4OFQyMzAgMTE5VDIxMyAxMzlUMTg0IDE0N1ExNjYgMTQ3IDE1NSAxNDBUMTM3IDExOVQxMjkgODhUMTI3IDQ5UTEyNyAxIDEzOCAtMjVUMTg0IC01MVEyMTkgLTUxIDIyOSAtMjRUMjQwIDUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MTsiIGhvcml6LWFkdi14PSIzMDEiIGQ9Ik0xMTEgLTQ0VjEyMEgxMDhMNDMgOTFMMTYgMTU3TDEzMSAyMTJIMjAyVi00NEgyNzlWLTExNUgzMFYtNDRIMTExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MjsiIGhvcml6LWFkdi14PSIzMjYiIGQ9Ik0zOCAtMTE1TDI1IC00MlE2NCAtMTQgOTUgN1QxNDkgNDRUMTg0IDc2VDE5NyAxMDhRMTk3IDEyMiAxODggMTMyVDE1OSAxNDNRMTM0IDE0MyAxMTYgMTM1VDc4IDEwNUwyOCAxNjFRNjMgMTkyIDk1IDIwNVQxNjggMjE4UTIyNSAyMTggMjU2IDE5MlQyODggMTE5UTI4OCA5OSAyODEgODFUMjU2IDQzVDIwOCAyVDEzMiAtNDNIMjkyVi0xMTVIMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgzOyIgaG9yaXotYWR2LXg9IjMxOSIgZD0iTTI4NSAtMTlRMjg1IC03MCAyNTMgLTk1VDE1MyAtMTIxUTExOCAtMTIxIDg1IC0xMTJUMjAgLTc4TDU3IC0xOFE4MiAtMzggMTAyIC00NVQxNDMgLTUzUTE3MSAtNTMgMTg1IC00MlQxOTkgLTE0UTE5OSA2IDE4NyAxM1QxNTUgMjBIMTAyVjgwSDEzNlExNTkgODAgMTczIDg5VDE4OCAxMTZRMTg4IDEyOSAxNzkgMTM4VDE0OSAxNDhRMTI2IDE0OCAxMDQgMTM5VDY1IDExM0wyNCAxNzJRNTkgMTk4IDg5IDIwOFQxNTkgMjE4UTIxMyAyMTggMjQ0IDE5NVQyNzYgMTIwUTI3NiA5OSAyNjQgODNUMjM1IDU4VjU3UTI1OSA1MCAyNzIgMzBUMjg1IC0xOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODQ7IiBob3Jpei1hZHYteD0iMzQ3IiBkPSJNMjY0IC01M1YtMTE1SDE3NFYtNTNIMzhMMTggMTFMMTc1IDIxMkgyNjRWMTlIMzE1Vi01M0gyNjRaTTk3IDEySDE3OFYxMjlMOTcgMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg1OyIgaG9yaXotYWR2LXg9IjMyOSIgZD0iTTI5NSAtMlEyOTUgLTI2IDI4NyAtNDdUMjYyIC04NVQyMTcgLTExMVQxNTIgLTEyMVExMTYgLTEyMSA4OCAtMTEzVDMwIC04NEw3MiAtMjRROTAgLTM5IDExMCAtNDdUMTQ3IC01NVExNzggLTU1IDE5MiAtNDFUMjA3IC0zUTIwNyAyMCAxOTUgMzJUMTUxIDQ0UTEzMyA0NCAxMTkgMzlUOTQgMjFMMzMgNTlMNjMgMjEySDI3NlYxNDBIMTI2TDExNSA4M0gxMTZRMTMyIDkzIDE0NyA5N1QxODQgMTAyUTIzOCAxMDIgMjY2IDc3VDI5NSAtMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODY7IiBob3Jpei1hZHYteD0iMzQxIiBkPSJNMzA3IC0zUTMwNyAtNTYgMjcyIC04OFQxNzcgLTEyMVExMDkgLTEyMSA3NCAtODFUMzkgNDBRMzkgNzUgNDYgMTA3VDcwIDE2NFQxMTcgMjAzVDE5MSAyMThRMjIzIDIxOCAyNDYgMjEyVDI5NSAxODhMMjU4IDEzMFEyNDQgMTQwIDIyOSAxNDZUMTkyIDE1MlExNTcgMTUyIDE0NCAxMzBUMTI5IDc1SDEzMFExNDEgODYgMTU3IDkyVDE5NiA5OVEyNDYgOTkgMjc2IDc2VDMwNyAtM1pNMjI0IC02UTIyNCAxNSAyMTIgMjhUMTc2IDQxUTE1NCA0MSAxNDIgMjhUMTI5IC02UTEyOSAtMjYgMTQwIC0zOVQxNzcgLTUzUTIwMCAtNTMgMjEyIC00MFQyMjQgLTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg3OyIgaG9yaXotYWR2LXg9IjMwNyIgZD0iTTI4NCAxNDVRMjQ4IDExNSAyMjcgOTFUMTk1IDQxVDE4MSAtMTdUMTc4IC05NlYtMTE1SDgzVi05N1E4MyAtNzMgODYgLTQyVDEwMCAyMVQxMjggODRUMTc0IDEzOVYxNDFIMTVWMjEySDI2OUwyODQgMTQ1SDI4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODg7IiBob3Jpei1hZHYteD0iMzM3IiBkPSJNMzAzIC0xOFEzMDMgLTM4IDI5OCAtNTZUMjc4IC04OVQyMzcgLTExMlQxNjkgLTEyMVExMjcgLTEyMSAxMDEgLTExM1Q2MCAtOTBUNDAgLTU3VDM0IC0xOFEzNCAxMCA0OCAyOFQ4OCA1N1Y1OVE2NCA3MCA1NCA4N1Q0MyAxMjhRNDMgMjE3IDE2OCAyMTdRMjMzIDIxNyAyNjMgMTk2VDI5NCAxMjhRMjk0IDc5IDI0OSA1OVY1N1EyNzQgNDYgMjg4IDI4VDMwMyAtMThaTTIxMSAxMjBRMjExIDEzNiAyMDEgMTQ3VDE2OCAxNThRMTQ3IDE1OCAxMzcgMTQ3VDEyNyAxMjBRMTI3IDEwNCAxMzcgOTRUMTY4IDgzUTE4OSA4MyAyMDAgOTNUMjExIDEyMFpNMjE3IC0xNVEyMTcgMiAyMDYgMTRUMTY4IDI3UTE0NSAyNyAxMzMgMTZUMTIwIC0xNVExMjAgLTMzIDEzMSAtNDZUMTY4IC02MFExOTIgLTYwIDIwNCAtNDdUMjE3IC0xNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODk7IiBob3Jpei1hZHYteD0iMzQwIiBkPSJNMzAxIDUzUTMwMSAxNyAyOTQgLTE1VDI2OSAtNzBUMjIyIC0xMDdUMTUwIC0xMjFRMTE4IC0xMjEgOTUgLTExNFQ0NCAtOTBMODIgLTMzUTk2IC00MyAxMTEgLTQ5VDE1MCAtNTVRMTg2IC01NSAxOTkgLTMzVDIxMyAyNEgyMTFRMjAxIDEzIDE4NCA2VDE0NSAtMlE5NSAtMiA2NSAyMVQzNCAxMDFRMzQgMTU0IDY5IDE4NlQxNjQgMjE4UTIzMSAyMTggMjY2IDE3OFQzMDEgNTNaTTIxMiAxMDVRMjEyIDEyNSAyMDEgMTM5VDE2NCAxNTNRMTQxIDE1MyAxMjkgMTQwVDExNyAxMDZRMTE3IDg1IDEyOSA3MlQxNjQgNTlRMTg2IDU5IDE5OSA3MVQyMTIgMTA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjBBQzsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik05NCA0NDNRMTAyIDQ5OCAxMTkgNTQxVDE2NiA2MTVUMjQwIDY2MlQzNDkgNjc4UTM4NiA2NzggNDE3IDY3MlQ0NzUgNjUzVDUyOSA2MjFUNTgzIDU3NUw1MDMgNDg5UTQ2OCA1MzAgNDM0IDU0NVQzNTcgNTYxUTI5NCA1NjEgMjY4IDUzM1QyMzIgNDQzSDQ2MFYzNjdIMjI4VjMzN1EyMjggMzI2IDIyOCAzMTdUMjI5IDI5N0g0NjBWMjIwSDIzNFEyMzggMTk3IDI0NCAxNzdUMjY0IDE0MFQzMDAgMTE0VDM1OCAxMDRRNDA2IDEwNCA0NDQgMTI1VDUxOSAxOTBMNTk0IDk4UTU0MCA0MiA0ODIgMTVUMzUzIC0xM1EyODUgLTEzIDI0MCAzVDE2NiA0OVQxMjEgMTIzVDk0IDIyMEgxNUwxNiAyOTdIODZRODUgMzA3IDg1IDMxN1Q4NSAzMzhRODUgMzQ2IDg1IDM1MlQ4NiAzNjdIMTVMMTYgNDQzSDk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyMjsiIGhvcml6LWFkdi14PSI3MDgiIGQ9Ik01NzEgNDM3TDU3MiA1NzdMNDkyIDQ2N0w0MDkgNTc3TDQxMCA0MzdIMzQxVjcwMEg0MDJMNDkyIDU3NEw1NzkgNzAwSDY0MVY0MzdINTcxWk0yMDEgNjQwVjQzN0gxMjlWNjQwSDQyVjcwMEgyODdWNjQwSDIwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNTM7IiBob3Jpei1hZHYteD0iNzcxIiBkPSJNMTQ2IDQzOFY2MDJIMTQzTDc4IDU3M0w1MSA2MzlMMTY2IDY5NEgyMzdWNDM4SDMxNFYzNjdINjVWNDM4SDE0NlpNMTgyIDBIMTA2TDYyNiA3MDBINzAyTDE4MiAwWk03NDAgOTZRNzQwIDQ1IDcwOCAyMFQ2MDggLTZRNTczIC02IDU0MCAzVDQ3NSAzN0w1MTIgOTdRNTM3IDc3IDU1NyA3MFQ1OTggNjJRNjI2IDYyIDY0MCA3M1Q2NTQgMTAxUTY1NCAxMjEgNjQyIDEyOFQ2MTAgMTM1SDU1N1YxOTVINTkxUTYxNCAxOTUgNjI4IDIwNFQ2NDMgMjMxUTY0MyAyNDQgNjM0IDI1M1Q2MDQgMjYzUTU4MSAyNjMgNTU5IDI1NFQ1MjAgMjI4TDQ3OSAyODdRNTE0IDMxMyA1NDQgMzIzVDYxNCAzMzNRNjY4IDMzMyA2OTkgMzEwVDczMSAyMzVRNzMxIDIxNCA3MTkgMTk4VDY5MCAxNzNWMTcyUTcxNCAxNjUgNzI3IDE0NVQ3NDAgOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTU0OyIgaG9yaXotYWR2LXg9Ijc3MSIgZD0iTTU3IDM2Nkw0NCA0MzlRODMgNDY3IDExNCA0ODhUMTY4IDUyNlQyMDMgNTU4VDIxNiA1OTBRMjE2IDYwNCAyMDcgNjE0VDE3OCA2MjVRMTUzIDYyNSAxMzUgNjE3VDk3IDU4N0w0NyA2NDNRODIgNjc0IDExNCA2ODdUMTg3IDcwMFEyNDQgNzAwIDI3NSA2NzRUMzA3IDYwMVEzMDcgNTgxIDMwMCA1NjJUMjc1IDUyNFQyMjcgNDgzVDE1MSA0MzhIMzExVjM2Nkg1N1pNMTgyIDBIMTA2TDYyNiA3MDBINzAyTDE4MiAwWk03NDAgOTZRNzQwIDQ1IDcwOCAyMFQ2MDggLTZRNTczIC02IDU0MCAzVDQ3NSAzN0w1MTIgOTdRNTM3IDc3IDU1NyA3MFQ1OTggNjJRNjI2IDYyIDY0MCA3M1Q2NTQgMTAxUTY1NCAxMjEgNjQyIDEyOFQ2MTAgMTM1SDU1N1YxOTVINTkxUTYxNCAxOTUgNjI4IDIwNFQ2NDMgMjMxUTY0MyAyNDQgNjM0IDI1M1Q2MDQgMjYzUTU4MSAyNjMgNTU5IDI1NFQ1MjAgMjI4TDQ3OSAyODdRNTE0IDMxMyA1NDQgMzIzVDYxNCAzMzNRNjY4IDMzMyA2OTkgMzEwVDczMSAyMzVRNzMxIDIxNCA3MTkgMTk4VDY5MCAxNzNWMTcyUTcxNCAxNjUgNzI3IDE0NVQ3NDAgOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTVCOyIgaG9yaXotYWR2LXg9Ijc3MSIgZD0iTTE0NiA0MzhWNjAySDE0M0w3OCA1NzNMNTEgNjM5TDE2NiA2OTRIMjM3VjQzOEgzMTRWMzY3SDY1VjQzOEgxNDZaTTE4MiAwSDEwNkw2MjYgNzAwSDcwMkwxODIgMFpNNzQ2IDk3UTc0NiA3NyA3NDEgNTlUNzIxIDI2VDY4MCAzVDYxMiAtNlE1NzAgLTYgNTQ0IDJUNTAzIDI1VDQ4MyA1OFQ0NzcgOTdRNDc3IDEyNSA0OTEgMTQzVDUzMSAxNzJWMTc0UTUwNyAxODUgNDk3IDIwMlQ0ODYgMjQzUTQ4NiAzMzIgNjExIDMzMlE2NzYgMzMyIDcwNiAzMTFUNzM3IDI0M1E3MzcgMTk0IDY5MiAxNzRWMTcyUTcxNyAxNjEgNzMxIDE0M1Q3NDYgOTdaTTY1NCAyMzVRNjU0IDI1MSA2NDQgMjYyVDYxMSAyNzNRNTkwIDI3MyA1ODAgMjYyVDU3MCAyMzVRNTcwIDIxOSA1ODAgMjA5VDYxMSAxOThRNjMyIDE5OCA2NDMgMjA4VDY1NCAyMzVaTTY2MCAxMDBRNjYwIDExNyA2NDkgMTI5VDYxMSAxNDJRNTg4IDE0MiA1NzYgMTMxVDU2MyAxMDBRNTYzIDgyIDU3NCA2OVQ2MTEgNTVRNjM1IDU1IDY0NyA2OFQ2NjAgMTAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1QzsiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zMTUgNDYzUTMxNSA0MTIgMjgzIDM4N1QxODMgMzYxUTE0OCAzNjEgMTE1IDM3MFQ1MCA0MDRMODcgNDY0UTExMiA0NDQgMTMyIDQzN1QxNzMgNDI5UTIwMSA0MjkgMjE1IDQ0MFQyMjkgNDY4UTIyOSA0ODggMjE3IDQ5NVQxODUgNTAySDEzMlY1NjJIMTY2UTE4OSA1NjIgMjAzIDU3MVQyMTggNTk4UTIxOCA2MTEgMjA5IDYyMFQxNzkgNjMwUTE1NiA2MzAgMTM0IDYyMVQ5NSA1OTVMNTQgNjU0UTg5IDY4MCAxMTkgNjkwVDE4OSA3MDBRMjQzIDcwMCAyNzQgNjc3VDMwNiA2MDJRMzA2IDU4MSAyOTQgNTY1VDI2NSA1NDBWNTM5UTI4OSA1MzIgMzAyIDUxMlQzMTUgNDYzWk0xODIgMEgxMDZMNjI2IDcwMEg3MDJMMTgyIDBaTTc0NiA5N1E3NDYgNzcgNzQxIDU5VDcyMSAyNlQ2ODAgM1Q2MTIgLTZRNTcwIC02IDU0NCAyVDUwMyAyNVQ0ODMgNThUNDc3IDk3UTQ3NyAxMjUgNDkxIDE0M1Q1MzEgMTcyVjE3NFE1MDcgMTg1IDQ5NyAyMDJUNDg2IDI0M1E0ODYgMzMyIDYxMSAzMzJRNjc2IDMzMiA3MDYgMzExVDczNyAyNDNRNzM3IDE5NCA2OTIgMTc0VjE3MlE3MTcgMTYxIDczMSAxNDNUNzQ2IDk3Wk02NTQgMjM1UTY1NCAyNTEgNjQ0IDI2MlQ2MTEgMjczUTU5MCAyNzMgNTgwIDI2MlQ1NzAgMjM1UTU3MCAyMTkgNTgwIDIwOVQ2MTEgMTk4UTYzMiAxOTggNjQzIDIwOFQ2NTQgMjM1Wk02NjAgMTAwUTY2MCAxMTcgNjQ5IDEyOVQ2MTEgMTQyUTU4OCAxNDIgNTc2IDEzMVQ1NjMgMTAwUTU2MyA4MiA1NzQgNjlUNjExIDU1UTYzNSA1NSA2NDcgNjhUNjYwIDEwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNUQ7IiBob3Jpei1hZHYteD0iNzcxIiBkPSJNMzI1IDQ4MFEzMjUgNDU2IDMxNyA0MzVUMjkyIDM5N1QyNDcgMzcxVDE4MiAzNjFRMTQ2IDM2MSAxMTggMzY5VDYwIDM5OEwxMDIgNDU4UTEyMCA0NDMgMTQwIDQzNVQxNzcgNDI3UTIwOCA0MjcgMjIyIDQ0MVQyMzcgNDc5UTIzNyA1MDIgMjI1IDUxNFQxODEgNTI2UTE2MyA1MjYgMTQ5IDUyMVQxMjQgNTAzTDYzIDU0MUw5MyA2OTRIMzA2VjYyMkgxNTZMMTQ1IDU2NUgxNDZRMTYyIDU3NSAxNzcgNTc5VDIxNCA1ODRRMjY4IDU4NCAyOTYgNTU5VDMyNSA0ODBaTTE4MiAwSDEwNkw2MjYgNzAwSDcwMkwxODIgMFpNNzQ2IDk3UTc0NiA3NyA3NDEgNTlUNzIxIDI2VDY4MCAzVDYxMiAtNlE1NzAgLTYgNTQ0IDJUNTAzIDI1VDQ4MyA1OFQ0NzcgOTdRNDc3IDEyNSA0OTEgMTQzVDUzMSAxNzJWMTc0UTUwNyAxODUgNDk3IDIwMlQ0ODYgMjQzUTQ4NiAzMzIgNjExIDMzMlE2NzYgMzMyIDcwNiAzMTFUNzM3IDI0M1E3MzcgMTk0IDY5MiAxNzRWMTcyUTcxNyAxNjEgNzMxIDE0M1Q3NDYgOTdaTTY1NCAyMzVRNjU0IDI1MSA2NDQgMjYyVDYxMSAyNzNRNTkwIDI3MyA1ODAgMjYyVDU3MCAyMzVRNTcwIDIxOSA1ODAgMjA5VDYxMSAxOThRNjMyIDE5OCA2NDMgMjA4VDY1NCAyMzVaTTY2MCAxMDBRNjYwIDExNyA2NDkgMTI5VDYxMSAxNDJRNTg4IDE0MiA1NzYgMTMxVDU2MyAxMDBRNTYzIDgyIDU3NCA2OVQ2MTEgNTVRNjM1IDU1IDY0NyA2OFQ2NjAgMTAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1RTsiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zNDkgNjI3UTMxMyA1OTcgMjkyIDU3M1QyNjAgNTIzVDI0NiA0NjVUMjQzIDM4NlYzNjdIMTQ4VjM4NVExNDggNDA5IDE1MSA0NDBUMTY1IDUwM1QxOTMgNTY2VDIzOSA2MjFWNjIzSDgwVjY5NEgzMzRMMzQ5IDYyN1pNMTgyIDBIMTA2TDYyNiA3MDBINzAyTDE4MiAwWk03NDYgOTdRNzQ2IDc3IDc0MSA1OVQ3MjEgMjZUNjgwIDNUNjEyIC02UTU3MCAtNiA1NDQgMlQ1MDMgMjVUNDgzIDU4VDQ3NyA5N1E0NzcgMTI1IDQ5MSAxNDNUNTMxIDE3MlYxNzRRNTA3IDE4NSA0OTcgMjAyVDQ4NiAyNDNRNDg2IDMzMiA2MTEgMzMyUTY3NiAzMzIgNzA2IDMxMVQ3MzcgMjQzUTczNyAxOTQgNjkyIDE3NFYxNzJRNzE3IDE2MSA3MzEgMTQzVDc0NiA5N1pNNjU0IDIzNVE2NTQgMjUxIDY0NCAyNjJUNjExIDI3M1E1OTAgMjczIDU4MCAyNjJUNTcwIDIzNVE1NzAgMjE5IDU4MCAyMDlUNjExIDE5OFE2MzIgMTk4IDY0MyAyMDhUNjU0IDIzNVpNNjYwIDEwMFE2NjAgMTE3IDY0OSAxMjlUNjExIDE0MlE1ODggMTQyIDU3NiAxMzFUNTYzIDEwMFE1NjMgODIgNTc0IDY5VDYxMSA1NVE2MzUgNTUgNjQ3IDY4VDY2MCAxMDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjEyOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTQ1IDIxMVYzMjlINTY4VjIxMUg0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjA7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNDIxIDMzM0wzMzIgMjE4SDU2OFYxMDFIMjQ5TDE2MCAtMTdMNzEgNDZMMTE0IDEwMUg0NVYyMThIMTk4TDI4NiAzMzNINDVWNDUwSDM3MEw0NjQgNTc1TDU1MyA1MTNMNTA0IDQ1MEg1NjhWMzMzSDQyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjQ7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNDUgMzE0VjQzNEw1NjggNjE2VjQ5MEwxOTIgMzc1TDU2OCAyNjZWMTQzTDQ1IDMxNFpNNDUgMFYxMTJINTY4VjBINDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTQ1IDE0M1YyNjZMNDIxIDM3NUw0NSA0OTBWNjE2TDU2OCA0MzRWMzE0TDQ1IDE0M1pNNDUgMFYxMTJINTY4VjBINDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyNERGOyIgaG9yaXotYWR2LXg9Ijc5NSIgZD0iTTc0MyAzMzRRNzQzIDI2MiA3MTYgMjAwVDY0MiA5MFQ1MzMgMTZUMzk4IC0xMVEzMjYgLTExIDI2MyAxNlQxNTMgOTBUNzkgMTk5VDUyIDMzNFE1MiA0MDYgNzkgNDY4VDE1MyA1NzhUMjYzIDY1MlQzOTggNjc5UTQ3MCA2NzkgNTMyIDY1MlQ2NDIgNTc4VDcxNiA0NjlUNzQzIDMzNFpNNjk4IDMzNVE2OTggMzk3IDY3NSA0NTFUNjExIDU0N1Q1MTYgNjExVDM5OCA2MzVRMzM2IDYzNSAyODIgNjEyVDE4NyA1NDdUMTIzIDQ1MlQ5OSAzMzVROTkgMjczIDEyMiAyMTlUMTg3IDEyNVQyODIgNjFUMzk4IDM3UTQ2MCAzNyA1MTQgNjBUNjEwIDEyNFQ2NzQgMjE5VDY5OCAzMzVaTTU5OCA0MDNRNTk4IDM0MSA1NjEgMzAzVDQzNyAyNjRIMzYyVjExOUgyNTZWNTMxUTI4NSA1MzQgMzI1IDUzNlQ0MTAgNTM5UTUwMCA1MzkgNTQ5IDUwN1Q1OTggNDAzWk00OTQgMzk5UTQ5NCA0MzEgNDc3IDQ0NVQ0MTQgNDYwUTQwMSA0NjAgMzkwIDQ2MFQzNjIgNDU4VjMzN0g0MTNRNDU1IDMzNyA0NzQgMzQ5VDQ5NCAzOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNkMzOyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTE4NyAtMjI2SDkxTDEyNCAtNTVIMjczTDE4NyAtMjI2WiIgIC8+CisKKworPC9mb250PgorPC9kZWZzPgorPHRleHQgeD0iNDAiIHk9IjQwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEJkIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQcOBw4DDgsOEw4XDg8OGIEPDhyBEw5AgRcOJw4jDisOLIEkgw40gw4wgw44gw48gTsORPC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjgwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEJkIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+T8OTw5LDlMOWw5XDmMWSIFPFoCBVw5rDmcObw5wgWcOdxbggWsW9IMOeIGHDocOgw6LDpMOlw6PDpiBjw6cgZMOwIGXDqcOow6rDqyBpIMSxIMOtIMOsIMOuIMOvIG7DsSBvw7PDssO0w7bDtcO4xZMgc8Whw58gdcO6w7nDu8O8IHnDvcO/IHrFvjwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxMjAiIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgQmQiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7DviAxMjM0NTY3ODkwIMK9IMK8IMK+ICUg4oCwICTCosKjwqXGkuKCrMKkIOKAoCDigKEgwqcgwrYgIyBefsK1ICvDl8KxICZsdDsgPSAmZ3Q7IMO3wqwgIcKhP8K/ICZxdW90OyAmYW1wOyAmYXBvczsgKiDCsCAuICwgOiA7ICgpIFsgXCBdIHt9IC8gfDwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxNjAiIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgQmQiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7CpiBfIOKAmiDigJ4g4oCmIOKAueKAuiDCq8K7IOKAmCDigJkg4oCcIOKAnSDigKIgwq0gLSDigJMg4oCUIEAgwqkgwq4g4oSiIMKqwrogwrnCssKzIMK0IGAgy4Ygy5wgwqggwq8gwrcgwrg8L3RleHQ+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkLnR0ZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkLnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZiOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkLndvZmYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1CZC53b2ZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjAwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1CZC53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQuZW90IGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmRJdC5lb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2NDYyMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQuc3ZnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmRJdC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5NmJiNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQuc3ZnCkBAIC0wLDAgKzEsNDI1IEBACivvu788P3htbCAgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIiA+Cis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgPgorPG1ldGFkYXRhPgorPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorPGlkPjwhW0NEQVRBW0NsZWFydmlld0FUVCBCZEl0XV0+PC9pZD4KKzx2ZW5kb3I+TW9ub3R5cGUgSW1hZ2luZyBJbmMuPC92ZW5kb3I+Cis8Y3JlZGl0cz4KKzxuYW1lPkZvbnRzLmNvbSBXZWJGb250czwvbmFtZT4KKzxVUkw+aHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbTwvVVJMPgorPHJvbGU+SG9tZSBvZiB0aGUgV2ViIGZvbnRzPC9yb2xlPgorPC9jcmVkaXRzPgorPGxpY2Vuc2U+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb20vTGVnYWw8L1VSTD4KKzwvbGljZW5zZT4KKzxjb3B5cmlnaHQ+PCFbQ0RBVEFbQ29weXJpZ2h0IChjKSBUZXJtaW5hbCBEZXNpZ24sIEluYywgMjAwNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5dXT48L2NvcHlyaWdodD4KKzx0cmFkZW1hcms+PCFbQ0RBVEFbQ2xlYXJ2aWV3IGlzIGEgdHJhZGVtYXJrIG9mIFRlcm1pbmFsIERlc2lnbiwgSW5jLl1dPjwvdHJhZGVtYXJrPgorPGxpY2Vuc2VlPgorPG5hbWU+PC9uYW1lPgorPC9saWNlbnNlZT4KKzwvbWV0YWRhdGE+Cis8ZGVmcyA+Cis8Zm9udCBob3Jpei1hZHYteD0iNTQ1IiBpZD0iQ2xlYXJ2aWV3QVRULUJkSXQiPgorPGZvbnQtZmFjZSBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEJkSXQiIHBhbm9zZS0xPSIyIDExIDUgNiAzIDUgMCAyIDAgNCIgYXNjZW50PSI3NTAiIGRlc2NlbnQ9Ii0yNTAiIHVuaXRzLXBlci1lbT0iMTAwMCIgYWxwaGFiZXRpYz0iMCI+Cis8L2ZvbnQtZmFjZT4KKzxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSI0ODQiIGQ9Ik01ODUgNjY3TDQ5MiAwSC04TDg1IDY2N0g1ODVaTTExNiA2MDZMNDAgNjVMMjY0IDMzNkwxMTYgNjA2Wk00NjIgNjdMNTM4IDYwNUwzMTUgMzM2TDQ2MiA2N1pNNjUgMzVINDI4TDI4NCAyOTlMNjUgMzVaTTI5NCAzNzNMNTA3IDYzMEgxNTNMMjk0IDM3M1oiICAvPgorCis8Z2x5cGggdW5pY29kZT0iJiN4QTsiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDsiIC8+Cis8Z2x5cGggdW5pY29kZT0iICIgaG9yaXotYWR2LXg9IjMwMCIgLz4KKzxnbHlwaCB1bmljb2RlPSIhIiBob3Jpei1hZHYteD0iMjk5IiBkPSJNMzIxIDY2N1EyOTkgNTQ3IDI3NyA0MjlUMjM0IDE5MUgxMThRMTMyIDMxMCAxNDMgNDI4VDE2NiA2NjdIMzIxWk0yNTEgNzBRMjUxIDUwIDI0MiAzNVQyMTcgMTBUMTg0IC02VDE0OCAtMTJRMTMzIC0xMiAxMTggLTlUOTEgM1Q3MiAyM1Q2NCA1MlE2NCA3MSA3NCA4NlQ5OSAxMTFUMTMyIDEyN1QxNjcgMTMyUTE4MSAxMzIgMTk2IDEyOVQyMjMgMTE4VDI0MyA5OFQyNTEgNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik00NjcgNDQ4SDM3NEwzODYgNzAwSDUzM0w0NjcgNDQ4Wk0yMjcgNDQ4SDEzM0wxNDUgNzAwSDI5MkwyMjcgNDQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTY5NyA0NTZINTk2TDU2MCAzMzVINjY4TDYzOSAyMzFINTI5TDQ5NyAxMTNIMzg0TDQxOSAyMzFIMjk5TDI2NCAxMTNIMTU3TDE5MSAyMzFIODFMMTA5IDMzNUgyMjBMMjUzIDQ1NkgxNDJMMTcwIDU1OEgyODJMMzEzIDY2N0g0MjJMMzkxIDU1OEg1MTdMNTQ4IDY2N0g2NTdMNjI1IDU1OEg3MjdMNjk3IDQ1NlpNMzYxIDQ1NkwzMjggMzM1SDQ1Mkw0ODYgNDU2SDM2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiQiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01ODIgMjM0UTU4MiAxOTAgNTY2IDE1NVQ1MjEgOTVUNDU2IDU1VDM3NyAzNUwzNjYgLTQ2SDIzNEwyNDYgMzZRMTk4IDM5IDE1NiA1N1Q3NSAxMDFMMTQ3IDE5OFExODcgMTY5IDIzMCAxNTJUMzI0IDEzNFEzNDIgMTM0IDM2MyAxMzZUNDAzIDE0N1Q0MzQgMTcwVDQ0NyAyMDlRNDQ3IDIzNCA0MjUgMjUwVDM2OCAyNzlUMjk0IDMwNFQyMjAgMzM2VDE2NCAzODRUMTQxIDQ1OFExNDEgNTAwIDE1NiA1MzNUMTk3IDU4OVQyNTcgNjI3VDMzMiA2NDVMMzQzIDcyMkg0NzVMNDY0IDY0NFE1MDIgNjQxIDUzNyA2MjlUNjA3IDYwMEw1NDEgNDk2UTUwNiA1MTggNDY3IDUyOVQzODUgNTQxUTM3MCA1NDEgMzUyIDUzOVQzMTcgNTMxVDI5MCA1MTJUMjc5IDQ3OVEyNzkgNDU4IDMwMSA0NDRUMzU3IDQxOFQ0MzAgMzkzVDUwMyAzNjBUNTU5IDMwOVQ1ODIgMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJSIgaG9yaXotYWR2LXg9Ijc5NCIgZD0iTTQwNyA1NzRRNDA3IDUzMiAzOTggNDk0VDM2OCA0MjZUMzE1IDM3OVQyMzUgMzYxUTExMSAzNjEgMTExIDQ4NlExMTEgNTI4IDEyMCA1NjZUMTQ5IDYzNVQyMDMgNjgyVDI4MyA3MDBRMzQ2IDcwMCAzNzYgNjY4VDQwNyA1NzRaTTI0NSA0MzFRMjY5IDQzMSAyODMgNDQ2VDMwNiA0ODRUMzE2IDUzMVQzMTkgNTc0UTMxOSA1OTggMzA5IDYxM1QyNzMgNjI5UTI0OSA2MjkgMjM0IDYxNFQyMTEgNTc3VDIwMSA1MzFUMTk4IDQ4OFExOTggNDYzIDIwNyA0NDdUMjQ1IDQzMVpNMjAzIDBIMTI2TDY4NiA3MDBINzYyTDIwMyAwWk03NzkgMjA3UTc3OSAxNjYgNzcwIDEyOFQ3NDAgNjBUNjg3IDEyVDYwOCAtNlE0ODMgLTYgNDgzIDEyMFE0ODMgMTYyIDQ5MiAyMDBUNTIyIDI2OFQ1NzUgMzE1VDY1NSAzMzNRNzE4IDMzMyA3NDggMzAxVDc3OSAyMDdaTTYxNyA2NFE2NDEgNjQgNjU1IDc5VDY3OCAxMTZUNjg4IDE2MlQ2OTEgMjA1UTY5MSAyMjkgNjgyIDI0NVQ2NDUgMjYyUTYyMCAyNjIgNjA2IDI0N1Q1ODQgMjA5VDU3NCAxNjNUNTcxIDEyMFE1NzEgOTUgNTgwIDgwVDYxNyA2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBob3Jpei1hZHYteD0iNjY3IiBkPSJNMzAzIC0xMFEyNjIgLTEwIDIyMiAtMlQxNTEgMjVUMTAwIDc2VDgxIDE1N1E4MSAxOTcgOTMgMjMwVDEyOCAyOTFUMTgwIDM0MFQyNDYgMzc4UTIyMyA0MDMgMjA3IDQzNVQxOTEgNTAxUTE5MSA1NDUgMjA5IDU3OFQyNTggNjM0VDMyNiA2NjhUNDAzIDY4MFE0MzQgNjgwIDQ2MyA2NzRUNTE2IDY1MlQ1NTMgNjEzVDU2NyA1NTNRNTY3IDUxNyA1NTMgNDg5VDUxNyA0MzhUNDY2IDM5OVQ0MDggMzY3TDUxMiAxOTZRNTIyIDIyMiA1MjUgMjU2VDUyOCAzMjlWMzQ3SDY1MVE2NTIgMzQwIDY1MiAzMzRUNjUyIDMyMVE2NTIgMjU3IDYzOCAyMDVUNTgyIDExMUw2NTAgMEg1MDFMNDc2IDM3UTQzNyAxNCAzOTcgMlQzMDMgLTEwWk0zMjUgOTVRMzQ4IDk1IDM2OSAxMDJUNDExIDEyMEwyOTMgMzA3UTI2MSAyODggMjQzIDI1NlQyMjUgMTkxUTIyNSAxNzMgMjMwIDE1NlQyNDcgMTI1VDI3OCAxMDNUMzI1IDk1Wk0zNjUgNDMxUTM4MCA0NDEgMzk1IDQ1MlQ0MjMgNDc2VDQ0MyA1MDVUNDUxIDU0MVE0NTEgNTY3IDQzNyA1NzhUMzk3IDU5MFEzNjUgNTkwIDM0NCA1NzFUMzIzIDUxOVEzMjMgNDk2IDMzNiA0NzJUMzY1IDQzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgaG9yaXotYWR2LXg9IjI0MSIgZD0iTTIyNyA0NDhIMTMzTDE0NSA3MDBIMjkyTDIyNyA0NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIoIiBob3Jpei1hZHYteD0iMzM3IiBkPSJNMTU4IC0xMzlRMTIwIC01OSA5NyAyNlQ3NCAyMDlRNzQgMjg3IDg4IDM2MFQxMzAgNTAzVDE5NyA2NDBUMjg2IDc3NUwzODMgNzQ5UTMwMCA2MjcgMjUyIDQ4NlQyMDQgMTkyUTIwNCAxMDYgMjIwIDMyVDI2MiAtMTEyTDE1OCAtMTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKSIgaG9yaXotYWR2LXg9IjMzNyIgZD0iTTIyIC0xMTJRMTA3IDE0IDE1NCAxNTRUMjAxIDQ1MVEyMDEgNTM2IDE4NiA2MDlUMTQzIDc0OUwyNDYgNzc1UTI2NSA3MzEgMjgwIDY4OVQzMDcgNjA0VDMyNCA1MTdUMzMwIDQyNVEzMzAgMjcxIDI3NCAxMzFUMTE4IC0xMzlMMjIgLTExMloiICAvPgorPGdseXBoIHVuaWNvZGU9IioiIGhvcml6LWFkdi14PSIzNzUiIGQ9Ik0zMTcgNTMxTDM4MyA0NThMMjg4IDM5OUwyNTEgNDkwTDE5MSAzOTlMMTEzIDQ1OEwxOTggNTMxTDkyIDU0M0wxMzkgNjM5TDIyOSA1OTRMMjI0IDY5NEgzMzdMMzA1IDU5NUw0MDYgNjM5TDQyNyA1NDRMMzE3IDUzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IisiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik0zOTcgMjExTDM2OCA1SDI0N0wyNzYgMjExSDc0TDkxIDMyOUgyOTNMMzIxIDUzMkg0NDJMNDE0IDMyOUg2MTRMNTk3IDIxMUgzOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyYzsiIGhvcml6LWFkdi14PSIyNTkiIGQ9Ik05NyAtMTMySDFMODYgMTIwSDIzN0w5NyAtMTMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgaG9yaXotYWR2LXg9IjM4MyIgZD0iTTc1IDE5NUw5MyAzMjdIMzgwTDM2MiAxOTVINzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBob3Jpei1hZHYteD0iMjU5IiBkPSJNMjMxIDY5UTIzMSA0OSAyMjEgMzRUMTk2IDlUMTYzIC02VDEyNyAtMTJRMTEyIC0xMiA5NyAtOVQ3MCAzVDUxIDIzVDQzIDUyUTQzIDcxIDUzIDg2VDc4IDExMVQxMTEgMTI3VDE0NyAxMzJRMTYxIDEzMiAxNzYgMTI5VDIwMyAxMTdUMjIzIDk3VDIzMSA2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ii8iIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik0xMzIgLTExNUg1TDUxNiA3MDBINjQ0TDEzMiAtMTE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTYxNCAzMzNRNjAzIDI1NSA1ODIgMTkyVDUyNSA4M1Q0MzYgMTJUMzA1IC0xM1EyNDMgLTEzIDIwMCAzVDEzMSA1MFQ5NCAxMjVUODIgMjIzUTgyIDI0OSA4NCAyNzZUOTEgMzMzUTEwMiA0MTEgMTIzIDQ3NFQxODAgNTgzVDI3MSA2NTNUNDAyIDY3OFE0NjQgNjc4IDUwNiA2NjJUNTc0IDYxNVQ2MTEgNTQyVDYyMyA0NDVRNjIzIDM5MyA2MTQgMzMzWk00NzEgMzMzUTQ3NiAzNjUgNDc5IDM5M1Q0ODIgNDQ3UTQ4MiA0OTkgNDYyIDUzMFQzODUgNTYxUTM0MyA1NjEgMzE3IDU0NVQyNzUgNDk4VDI1MCA0MjZUMjM0IDMzM1EyMjkgMzAyIDIyNyAyNzRUMjI0IDIyMVEyMjQgMTY4IDI0NCAxMzZUMzIxIDEwNFEzNjMgMTA0IDM4OSAxMjFUNDMxIDE2OVQ0NTUgMjQyVDQ3MSAzMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIxIiBob3Jpei1hZHYteD0iNjEzIiBkPSJNMjcxIDExOUwzMjYgNTExSDMyMUwxODEgNDMwTDE0MCA1MzZMMzc0IDY2OEg0ODZMNDA5IDExOUg1NjRMNTQ4IDBIOTZMMTEyIDExOUgyNzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIyIiBob3Jpei1hZHYteD0iNjEzIiBkPSJNODIgMEw3NyAxMThRMTYzIDE4MCAyMzQgMjI4VDM1NyAzMTlUNDM2IDQwMVQ0NjQgNDg0UTQ2NCA1MTQgNDQ1IDUzNlQzODggNTU4UTM0MiA1NTggMjk4IDUzN1QyMDYgNDcxTDE0NSA1NzFRMTgxIDYwMSAyMTMgNjIxVDI3OCA2NTRUMzQ0IDY3MlQ0MTYgNjc4UTUxMyA2NzggNTYxIDYzM1Q2MDkgNTEwUTYwOSA0NDQgNTc2IDM4OFQ0OTAgMjgzVDM3NSAxOTRUMjUxIDExOUg1NjhMNTUyIDBIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTg1IDIzNFE1ODUgMTc0IDU2MyAxMjhUNTAzIDUxVDQxMiAzVDI5OCAtMTNRMjMwIC0xMyAxNzEgN1Q2NiA2N0wxNDIgMTY4UTE3NyAxMzggMjE4IDEyMFQyOTkgMTAyUTMyNiAxMDIgMzUxIDEwOFQzOTcgMTI4VDQzMCAxNjVUNDQyIDIyMVE0NDIgMjU5IDQxOSAyNzNUMzUwIDI4N0gyNTJMMjY4IDQwMEgzMTZRMzQ2IDQwMCAzNzIgNDA0VDQxOCA0MjBUNDQ5IDQ0OFQ0NjEgNDkyUTQ2MSA1MDUgNDU3IDUxN1Q0NDMgNTM4VDQxNCA1NTNUMzY5IDU1OVEzMjYgNTU5IDI4NCA1NDFUMTk4IDQ4OUwxNTAgNTkzUTE4NSA2MTYgMjE1IDYzMlQyNzUgNjU5VDMzNSA2NzNUNDAyIDY3OFE0NDcgNjc4IDQ4NCA2NjhUNTQ4IDYzOFQ1OTAgNTg4VDYwNSA1MTdRNjA1IDQ2NSA1ODMgNDIyVDUxMCAzNTJWMzQ4UTU4NSAzMjUgNTg1IDIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjQiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik00OTggMTMzTDQ4MCAwSDM0MkwzNjAgMTMzSDkxTDczIDIzOUw0MjggNjY2SDU3M0w1MTUgMjUySDYwN0w1OTAgMTMzSDQ5OFpNNDEyIDUwM0wyMjMgMjUySDM4MUw0MTYgNTAzSDQxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IjUiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01ODggMjgzUTU4OCAyMTYgNTY5IDE2MlQ1MTEgNjhUNDE2IDhUMjg4IC0xM1EyMjIgLTEzIDE2OCAyVDY4IDU1TDE0MCAxNjJRMTczIDEzNSAyMTUgMTE5VDMwMiAxMDJRMzczIDEwMiA0MTAgMTQyVDQ0OCAyNTZRNDQ4IDM0OCAzMzcgMzQ4UTI5NyAzNDggMjY2IDMzM1QyMDUgMjk0TDExMiAzNjJMMjExIDY2N0g2MDdMNTkwIDU0N0gzMDRMMjU1IDQxN0wyNTkgNDE1UTI5MSA0MzggMzI4IDQ0OVQ0MDQgNDYwUTQ0MCA0NjAgNDczIDQ1MVQ1MzEgNDIwVDU3MiAzNjVUNTg4IDI4M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01OTggMjY2UTU5OCAyMDMgNTc2IDE1MlQ1MTYgNjRUNDI1IDdUMzExIC0xM1ExOTQgLTEzIDE0MCA1MFQ4NSAyMjdRODUgMjcwIDkxIDMxMlExMDEgMzg4IDEyMyA0NTRUMTg1IDU3MFQyODQgNjQ5VDQyOCA2NzhRNDgwIDY3OCA1MjcgNjY2VDYxNyA2MjRMNTM5IDUxOVE1MTAgNTQwIDQ4MiA1NDlUNDE4IDU1OFEzNzUgNTU4IDM0NCA1NDZUMjkyIDUxMlQyNTcgNDU3VDIzOCAzODVIMjQyUTI3MiA0MTkgMzEyIDQzNFQzOTggNDQ5UTQ0MSA0NDkgNDc4IDQzOFQ1NDEgNDAzVDU4MyAzNDZUNTk4IDI2NlpNMzI3IDEwNFEzNjAgMTA0IDM4NCAxMTVUNDI0IDE0NVQ0NDggMTkxVDQ1NiAyNDlRNDU2IDI5NiA0MzAgMzE0VDM2MCAzMzJRMjk2IDMzMiAyNjAgMjk2VDIyNCAxOTVRMjI0IDE0NyAyNTMgMTI2VDMyNyAxMDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI3IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNjMxIDU1OFE1NTYgNTA0IDUwOSA0NTVUNDMxIDM0OFQzODQgMjIwVDM1NCA1MEwzNDcgMEgyMDBMMjA0IDMzUTIxMiA5MiAyMjcgMTYyVDI3MCAzMDJUMzQxIDQzNVQ0NDcgNTQ0TDQ0OCA1NDhIMTM2TDE1MiA2NjdINjIzTDYzMSA1NThINjMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOCIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTU5MiAyMzJRNTkyIDE2NyA1NzAgMTIxVDUwOSA0NVQ0MTggMVQzMDYgLTEzUTI2MiAtMTMgMjIwIC02VDE0NiAyMVQ5NSA3M1Q3NSAxNTdRNzUgMjMwIDEwNCAyNzhUMjAzIDM1M0wyMDQgMzU3UTE3MCAzNzUgMTUzIDQwMVQxMzUgNDY2UTEzNSA1MjYgMTU3IDU2NlQyMTUgNjMxVDMwMCA2NjdUNDAxIDY3OFE0MzkgNjc4IDQ3NyA2NzNUNTQ2IDY1MVQ1OTYgNjA1VDYxNSA1MzBRNjE1IDQ2NyA1OTAgNDI2VDUwOCAzNTdMNTA3IDM1M1E1NDkgMzM2IDU3MCAzMDdUNTkyIDIzMlpNMzYyIDQwMVE0MTEgNDAxIDQ0MyA0MjRUNDc2IDUwMFE0NzYgNTIwIDQ2OCA1MzJUNDQ4IDU1MlQ0MTkgNTYxVDM4NSA1NjRRMzM0IDU2NCAzMDMgNTQzVDI3MiA0NjdRMjcyIDQ0NyAyNzkgNDM0VDI5OSA0MTRUMzI4IDQwNFQzNjIgNDAxWk0zMTkgOThRMzg0IDk4IDQxOCAxMjZUNDUyIDIyMlE0NTIgMjQ2IDQ0MyAyNjFUNDIwIDI4NFQzODYgMjk0VDM0NyAyOTdRMjg0IDI5NyAyNDggMjcwVDIxMSAxNzVRMjExIDE1MCAyMjAgMTM1VDI0NCAxMTJUMjc4IDEwMVQzMTkgOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI5IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNjE5IDQzN1E2MTkgNDE0IDYxNyAzOTFUNjEyIDM0NVE2MDEgMjcxIDU4MCAyMDZUNTIwIDkzVDQyNSAxN1QyODQgLTExUTIyOCAtMTEgMTc5IDRUODkgNThMMTczIDE1MFEyMDMgMTI0IDIyOCAxMTNUMjkzIDEwMlEzMzggMTAyIDM2OCAxMTZUNDE4IDE1NFQ0NDkgMjEzVDQ2NyAyODdINDYzUTQzMCAyNTIgMzkzIDIzNVQzMDcgMjE4UTI2NCAyMTggMjI3IDIyOVQxNjMgMjY0VDEyMSAzMjFUMTA2IDQwMVExMDYgNDYzIDEyOCA1MTRUMTg5IDYwMVQyODAgNjU4VDM5NCA2NzhRNTEyIDY3OCA1NjUgNjE1VDYxOSA0MzdaTTM0NyAzMzZRNDE0IDMzNiA0NDUgMzczVDQ3NyA0NzVRNDc3IDUyMyA0NTEgNTQyVDM3OSA1NjFRMzE3IDU2MSAyODMgNTIyVDI0OSA0MjNRMjQ5IDM3NyAyNzYgMzU3VDM0NyAzMzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iMjU5IiBkPSJNMjc3IDQxNVEyNzcgMzk2IDI2OCAzODFUMjQ0IDM1NlQyMTEgMzQwVDE3NiAzMzRRMTYyIDMzNCAxNDggMzM4VDEyMiAzNTBUMTAzIDM3MFQ5NiAzOThROTYgNDE3IDEwNSA0MzJUMTI5IDQ1N1QxNjIgNDczVDE5NyA0NzhRMjExIDQ3OCAyMjUgNDc1VDI1MSA0NjNUMjcwIDQ0M1QyNzcgNDE1Wk0yMjkgNzBRMjI5IDUwIDIyMCAzNVQxOTYgMTBUMTYzIC02VDEyOCAtMTJRMTE0IC0xMiAxMDAgLThUNzQgNFQ1NSAyNFQ0NyA1MlE0NyA3MSA1NiA4NlQ4MCAxMTFUMTEzIDEyNlQxNDggMTMyUTE2MiAxMzIgMTc2IDEyOVQyMDIgMTE4VDIyMSA5OFQyMjkgNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBob3Jpei1hZHYteD0iMjU5IiBkPSJNOTcgLTEzMkgxTDg1IDEyMEgyMzZMOTcgLTEzMlpNMjg2IDQxNVEyODYgMzk2IDI3NyAzODFUMjUzIDM1NlQyMjEgMzQwVDE4NiAzMzRRMTcyIDMzNCAxNTggMzM4VDEzMiAzNTBUMTEzIDM3MFQxMDYgMzk4UTEwNiA0MTcgMTE1IDQzMlQxMzkgNDU3VDE3MiA0NzNUMjA3IDQ3OFEyMjEgNDc4IDIzNSA0NzVUMjYwIDQ2M1QyNzkgNDQzVDI4NiA0MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImbHQ7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNzQgMjEwTDkxIDMyOUw2NDQgNTQ0TDYyNiA0MTlMMjIxIDI3MUw1ODUgMTI3TDU2OCA1TDc0IDIxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij0iIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik05MSAzMzNMMTA4IDQ1MEg2MzFMNjE0IDMzM0g5MVpNNTkgMTAxTDc1IDIxOEg1OThMNTgyIDEwMUg1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZndDsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik00NSA1TDYyIDEyN0w0NjggMjcxTDEwMyA0MTlMMTIxIDU0NEw2MTQgMzI5TDU5NyAyMTBMNDUgNVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij8iIGQ9Ik01NjcgNTE5UTU2NyA0NzAgNTUzIDQzNlQ1MTQgMzc2VDQ1NCAzMzJUMzc3IDI5NVEzNjUgMjkwIDM1OCAyODZUMzQ2IDI3NVQzNDAgMjYwVDMzNSAyMzVMMzI5IDE5NUgxOTNMMjAzIDI2NlEyMDYgMjg5IDIxMSAzMDRUMjI2IDMzMVQyNDkgMzUxVDI4NCAzNjlRMzA2IDM3OSAzMzEgMzg4VDM3NyA0MTJUNDEzIDQ0NVQ0MjggNDk0UTQyOCA1MTMgNDIwIDUyNlQzOTcgNTQ3VDM2NiA1NThUMzMzIDU2MVEyNDYgNTYxIDE3NSA1MDRMMTIyIDYwNVExNTMgNjI0IDE4MSA2MzhUMjM5IDY2MVQzMDEgNjc0VDM2OSA2NzlRNDA5IDY3OSA0NDUgNjcxVDUwOCA2NDNUNTUxIDU5NFQ1NjcgNTE5Wk0zMzIgNjlRMzMyIDQ5IDMyMiAzNFQyOTcgOVQyNjQgLTZUMjI5IC0xMlEyMTUgLTEyIDIwMCAtOVQxNzMgM1QxNTQgMjJUMTQ2IDUxUTE0NiA3MCAxNTUgODVUMTgwIDExMFQyMTMgMTI1VDI0OCAxMzFRMjYyIDEzMSAyNzcgMTI4VDMwNCAxMTdUMzI0IDk3VDMzMiA2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI4MjMiIGQ9Ik04MTEgMzQ2UTgxMSAyOTcgNzk3IDI0NVQ3NTQgMTQ5VDY4MiA3OVQ1ODMgNTFRNTU0IDUxIDUzMSA2NlQ1MDcgMTE0SDUwM1E0NzkgODUgNDQ0IDcwVDM3MSA1NFEzMTYgNTQgMjg5IDg3VDI2MiAxNzNRMjYyIDIxNiAyNzYgMjYwVDMxNiAzNDBUMzgxIDM5N1Q0NjcgNDIwUTQ5MyA0MjAgNTEyIDQxMlQ1NDcgMzgwSDU0OEw1NTYgNDEwSDY2MFE2NTggNDAzIDY1MiAzODFUNjM4IDMzMFQ2MjAgMjY3VDYwMyAyMDVUNTkwIDE1N1Q1ODUgMTM1UTU4NSAxMjMgNTk1IDExOFQ2MTUgMTEzUTY1MCAxMTMgNjc2IDEzOFQ3MTkgMjAwVDc0NCAyNzZUNzUzIDM0MlE3NTMgMzkzIDczNCA0MjhUNjgyIDQ4NlQ2MDcgNTE4VDUyMCA1MjhRNDM5IDUyOCAzNzIgNTA0VDI1NiA0MzNUMTgwIDMyMVQxNTMgMTczUTE1MyAxMTQgMTcxIDcyVDIyMyAxVDMwMyAtNDBUNDA1IC01M1E0NjMgLTUzIDUxOSAtMzhUNjI0IDlMNjUwIC0zOFE1ODkgLTc3IDUyNCAtOTJUMzg2IC0xMDhRMzIxIC0xMDggMjY2IC05MFQxNzAgLTM3VDEwOCA1MVQ4NSAxNzJRODUgMjY2IDExOSAzNDJUMjEzIDQ3M1QzNTMgNTU2VDUyNCA1ODZRNTgxIDU4NiA2MzMgNTczVDcyNCA1MzBUNzg3IDQ1NVQ4MTEgMzQ2Wk00MTcgMTMyUTQ1NSAxMzIgNDc0IDE1NFQ1MDMgMjEyUTUwOSAyMzMgNTE2IDI1N1Q1MjQgMzA0UTUyNCAzMjcgNTA5IDMzNFQ0NzQgMzQxUTQ0NCAzNDEgNDI0IDMyNlQzOTAgMjg3VDM3MSAyMzZUMzY1IDE4M1EzNjUgMTMyIDQxNyAxMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJBIiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMzIDBMNDk5IDE0MEgyMzZMMTYzIDBIMTJMMzYzIDY3MEg1MTlMNjg5IDBINTMzWk00MjEgNTI1SDQxN0wyODcgMjU4SDQ3OUw0MjEgNTI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQiIgaG9yaXotYWR2LXg9IjY2NiIgZD0iTTY0MyAyMTdRNjQzIDE2MCA2MjQgMTE5VDU3MSA1MVQ0ODggMTNUMzc5IDBINzNMMTY2IDY2MlEyMjYgNjY5IDI4OSA2NzJUNDExIDY3NVE0NTcgNjc1IDUwMiA2NzBUNTgyIDY0OFQ2NDAgNjAzVDY2MiA1MjZRNjYyIDQ1NCA2MjkgNDE0VDUzMSAzNTNWMzQ5UTU4NSAzMzggNjE0IDMwNlQ2NDMgMjE3Wk0zODYgMzkyUTQxMiAzOTIgNDM1IDM5NlQ0NzcgNDExVDUwNSA0NDNUNTE2IDQ5OFE1MTYgNTMyIDQ5MSA1NDdUMzk5IDU2M1EzODggNTYzIDM3NCA1NjNUMzQ1IDU2MVQzMTggNTYwVDI5NyA1NThMMjc0IDM5NFEyOTcgMzkyIDMyMyAzOTJUMzg2IDM5MlpNMzQ4IDEwNFEzNzYgMTA0IDQwMiAxMDdUNDUwIDEyMlQ0ODMgMTU1VDQ5NiAyMTVRNDk2IDI0MyA0ODQgMjU4VDQ1MyAyODFUNDEyIDI5MFQzNjkgMjkyUTM0MSAyOTIgMzExIDI5MlQyNTggMjkwTDIzMiAxMDZRMjYwIDEwNCAyODcgMTA0VDM0OCAxMDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJDIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNNjUzIDk2UTU5MyA0NiA1MjcgMThUMzgzIC0xMVEyNDkgLTExIDE3MyA1NlQ5NyAyNjFROTcgMzQ3IDEyMiA0MjNUMTk1IDU1NVQzMTQgNjQ1VDQ3NiA2NzhRNTUxIDY3OCA2MDkgNjUxVDcxNSA1NjdMNjEzIDQ3NFE1ODQgNTEyIDU0OSA1MzNUNDY1IDU1NVE0MDUgNTU1IDM2NCA1MzFUMjk4IDQ2N1QyNjEgMzc3VDI1MCAyNzRRMjUwIDE5OCAyODUgMTU0VDQwMSAxMTBRNDU1IDExMCA1MDEgMTM0VDU4OCAxOTNMNjUzIDk2SDY1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik03MDAgNDA4UTcwMCAzMTQgNjc0IDIzOVQ1OTYgMTEwVDQ3MSAyOVQzMDMgMEg3M0wxNjYgNjYyUTIyNCA2NjcgMjgyIDY3MVQzOTkgNjc1UTQ2NSA2NzUgNTIwIDY2MFQ2MTYgNjEzVDY3OCA1MzBUNzAwIDQwOFpNMzA3IDExNlEzNjUgMTE2IDQwNiAxMzBUNDc1IDE3MlQ1MTkgMjQyVDU0MyAzNDBRNTQ1IDM1NiA1NDYgMzcxVDU0OCA0MDJRNTQ4IDU2MSAzODcgNTYxUTM2NCA1NjEgMzQyIDU2MFQyOTcgNTU3TDIzNSAxMTdRMjUzIDExNiAyNzEgMTE2VDMwNyAxMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJFIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMEwxNjYgNjY3SDYyMUw2MDQgNTQ1SDI5NUwyNzUgNDA0SDU1NUw1MzggMjgwSDI1OEwyMzUgMTE5SDU1NEw1MzggMEg3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IkYiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik0yOTUgNTQ1TDI3NCAzOThINTQ1TDUyOCAyNzVIMjU3TDIxOSAwSDczTDE2NiA2NjdINjEyTDU5NSA1NDVIMjk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQwMiAxMDBRNDgzIDEwMCA1MjUgMTM5VDU3NSAyNThINDE3TDQzMyAzNzVINzI4TDcxOCAzMDNRNzA3IDIyOCA2ODMgMTcwVDYxOCA3MlQ1MTkgMTFUMzgxIC0xMFEzMTYgLTEwIDI2NCA4VDE3NSA2MFQxMTcgMTQ2VDk3IDI2M1E5NyAzNDggMTIzIDQyNFQxOTggNTU2VDMxNyA2NDVUNDc3IDY3OFE1NDggNjc4IDYwNSA2NTRUNzA5IDU3NUw2MDggNDgyUTU4MCA1MTQgNTQ2IDUzNFQ0NjYgNTU1UTQwNCA1NTUgMzYyIDUzMFQyOTUgNDY1VDI2MCAzNzJUMjQ5IDI2NlEyNDkgMTg4IDI4NCAxNDRUNDAyIDEwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkgiIGhvcml6LWFkdi14PSI2OTQiIGQ9Ik00NzUgMEw1MTQgMjgzSDI1OEwyMTkgMEg3M0wxNjYgNjY3SDMxMkwyNzggNDIwSDUzNEw1NjggNjY3SDcxNEw2MjEgMEg0NzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJJIiBob3Jpei1hZHYteD0iMjkyIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMTkgMEg3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI0OTAiIGQ9Ik00NDkgMjI4UTQ0MSAxNzYgNDI4IDEzMlQzODggNTZUMzIwIDVUMjE2IC0xM1ExNTkgLTEzIDExOCAyVDM4IDUzTDExOCAxNjBRMTQ0IDEzMSAxNjYgMTIxVDIxOSAxMTFRMjUxIDExMSAyNzEgMTMwVDI5OCAxOTdMMzY0IDY2N0g1MTBMNDQ5IDIyOEg0NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJLIiBob3Jpei1hZHYteD0iNjQ0IiBkPSJNNDUxIDBMMzA5IDI3OUwyNTAgMjIzTDIxOSAwSDczTDE2NiA2NjdIMzEyTDI3MyAzODlIMjc3TDUyMSA2NjdINzA1TDQzMiAzNzZMNjM3IDBINDUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTCIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTczIDBMMTY2IDY2N0gzMTJMMjM2IDEyM0g1MTlMNTAyIDBINzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJNIiBob3Jpei1hZHYteD0iNzk5IiBkPSJNNTg1IDBMNjQ1IDQyN0g2NDFMNDIyIDE2OUwyNzcgNDI1SDI3M0wyMTQgMEg3M0wxNjYgNjY3SDI5M0w0NTIgMzgzTDY5MSA2NjdIODE5TDcyNiAwSDU4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ik4iIGhvcml6LWFkdi14PSI3MzEiIGQ9Ik01MzIgMEwyNzggNDI1SDI3NEwyMTUgMEg3M0wxNjYgNjY3SDMwMUw1NDYgMjQ5SDU1MUw2MTAgNjY3SDc1MUw2NTggMEg1MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJPIiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzY4IDQxMVE3NjggMzIxIDc0NCAyNDRUNjcxIDExMFQ1NTAgMjJUMzg0IC0xMFEzMTggLTEwIDI2NSA2VDE3NCA1NVQxMTYgMTM5VDk2IDI1OVE5NiAzNDkgMTIxIDQyNVQxOTUgNTU4VDMxNiA2NDZUNDgxIDY3OFE1NDcgNjc4IDYwMCA2NjJUNjkwIDYxM1Q3NDggNTMwVDc2OCA0MTFaTTQwMSAxMDhRNDU2IDEwOCA0OTMgMTI1VDU1MyAxNzJUNTkwIDI0NFQ2MTAgMzM0UTYxNiAzNzAgNjE2IDQwN1E2MTYgNDg1IDU4MCA1MjJUNDY0IDU2MFE0MDkgNTYwIDM3MiA1NDNUMzExIDQ5NlQyNzQgNDI1VDI1NCAzMzRRMjQ4IDI5OCAyNDggMjYzUTI0OCAxODQgMjg0IDE0NlQ0MDEgMTA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUCIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTY1OSA1MDBRNjU5IDM3NiA1OTAgMzA3VDM5MyAyMzdIMjUyTDIxOSAwSDczTDE2NiA2NjJRMTg3IDY2NCAyMTUgNjY2VDI3NCA2NzFUMzM5IDY3NFQ0MDUgNjc1UTQ1NiA2NzUgNTAyIDY2N1Q1ODMgNjM5VDYzOCA1ODVUNjU5IDUwMFpNMzc4IDM1MVE0MTAgMzUxIDQzNSAzNTdUNDc4IDM3OVQ1MDUgNDE4VDUxNSA0ODBRNTE1IDUyNCA0ODYgNTQxVDM5MCA1NThRMzY5IDU1OCAzNDcgNTU3VDI5NiA1NTRMMjY4IDM1MUgzNzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJRIiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzY4IDQxMVE3NjggMzYwIDc1OSAzMTBUNzMxIDIxM1Q2ODEgMTI3VDYwNyA1N1Y1M1E2MjYgNDggNjM3IDQwVDY2MCAyNFQ2ODcgOFQ3MjkgLTJMNjY3IC0xMDNRNjI4IC0xMDIgNTk2IC04N1Q1MzcgLTU1VDQ4NyAtMjRUNDM5IC05UTQzMSAtOSA0MTkgLTEwVDM5NSAtMTJRMzI3IC0xMiAyNzIgM1QxNzggNTJUMTE4IDEzNlQ5NiAyNTlROTYgMzQ5IDEyMSA0MjZUMTk0IDU1OVQzMTUgNjQ2VDQ4MSA2NzhRNTQ3IDY3OCA2MDAgNjYyVDY5MCA2MTNUNzQ4IDUzMFQ3NjggNDExWk00MDEgMTA4UTQ1NiAxMDggNDkzIDEyNVQ1NTQgMTcyVDU5MCAyNDRUNjEwIDMzNFE2MTYgMzczIDYxNiA0MTFRNjE2IDQ4OSA1NzkgNTI0VDQ2NCA1NTlRNDA4IDU1OSAzNzEgNTQzVDMxMCA0OTZUMjc0IDQyNVQyNTQgMzM0UTI1MiAzMTcgMjUwIDI5OVQyNDggMjYzUTI0OCAxODUgMjg0IDE0N1Q0MDEgMTA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgaG9yaXotYWR2LXg9IjY0NSIgZD0iTTQ1OCAwTDM5NiAyMjhRMzkxIDI0MyAzODUgMjQ4VDM2MyAyNTNIMjU0TDIxOSAwSDczTDE2NiA2NjNRMjgxIDY3NSAzOTggNjc1UTQ0NiA2NzUgNDkyIDY2OVQ1NzUgNjQ0VDYzNCA1OTJUNjU3IDUwN1E2NTcgNDcyIDY0OSA0MzhUNjIzIDM3NlQ1NzggMzI1VDUxNSAyOTJWMjg4UTUyMyAyODQgNTI3IDI3NFQ1MzUgMjU1TDYxMSAwSDQ1OFpNMzgzIDM2N1E0MTAgMzY3IDQzMyAzNzJUNDc0IDM5MVQ1MDIgNDI3VDUxMiA0ODJRNTEyIDUwNyA1MDIgNTIzVDQ3NCA1NDdUNDM1IDU1OFQzODggNTYxUTM2NCA1NjEgMzQyIDU2MFQyOTcgNTU2TDI3MCAzNjdIMzgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTU4MiAyMTZRNTgyIDE1MyA1NjAgMTEwVDQ5OSA0MVQ0MTEgMlQzMDUgLTEwUTIzMCAtMTAgMTY3IDhUNDIgNzFMMTIxIDE3NVExNjMgMTQ0IDIwOSAxMjRUMzA5IDEwNFEzMzAgMTA0IDM1MiAxMDZUMzkzIDExN1Q0MjQgMTQxVDQzNiAxODFRNDM2IDIxMCA0MTMgMjI4VDM1NCAyNjBUMjc4IDI5MFQyMDEgMzI3VDE0MyAzODFUMTE5IDQ2NVExMTkgNTI0IDE0MiA1NjRUMjAzIDYyOVQyODkgNjY1VDM5MCA2NzZRNTEwIDY3NiA2MTYgNjE3TDU0OCA1MDVRNTEzIDUyOCA0NzIgNTQzVDM4NyA1NTlRMzY4IDU1OSAzNDcgNTU3VDMwOSA1NDdUMjgwIDUyN1QyNjggNDkyUTI2OCA0NjQgMjkxIDQ0N1QzNDkgNDE3VDQyNSAzOTFUNTAwIDM1NlQ1NTggMzAyVDU4MiAyMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJUIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNNDIzIDU0M0wzNDcgMEgyMDFMMjc3IDU0M0g5MEwxMDcgNjY3SDYyOEw2MTEgNTQzSDQyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02NjUgMjY4UTY1NiAyMDIgNjM0IDE1MFQ1NzQgNjJUNDgxIDhUMzQ4IC0xMVEyODIgLTExIDIzNiAzVDE2MSA0M1QxMTggMTA4VDEwNSAxOTdRMTA1IDIxNCAxMDYgMjMxVDExMCAyNjhMMTY2IDY2N0gzMTJMMjU5IDI5MFEyNTMgMjUxIDI1MyAyMTdRMjUzIDE5MyAyNTggMTc0VDI3NSAxNDFUMzA5IDEyMFQzNjUgMTEyUTQxMSAxMTIgNDM5IDEyNVQ0ODQgMTYzVDUwOSAyMTlUNTIyIDI5MEw1NzUgNjY3SDcyMUw2NjUgMjY4SDY2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI2MzYiIGQ9Ik0zOTMgMEgyNDNMMTA4IDY2N0gyNjJMMzQxIDE3MEgzNDVMNTYyIDY2N0g3MTRMMzkzIDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJXIiBob3Jpei1hZHYteD0iMTAwNSIgZD0iTTc4OCAwSDYzMkw1NjkgNDczSDU2NEwzNjcgMEgyMDRMMTE0IDY2N0gyNzVMMzE1IDE3N0gzMTlMNTI0IDY2N0g2NzJMNzMyIDE3N0g3MzZMOTIyIDY2N0gxMDc3TDc4OCAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWCIgaG9yaXotYWR2LXg9IjY0OSIgZD0iTTQ2OSAwTDM1NiAyMjZIMzUyTDE4MCAwSDEwTDI4OCAzNDdMMTI5IDY2N0gzMDFMMzkxIDQ1N0gzOTVMNTQ5IDY2N0g3MTlMNDYzIDMzOEw2MzkgMEg0NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJZIiBob3Jpei1hZHYteD0iNjQ2IiBkPSJNNDMzIDI2MkwzOTcgMEgyNTFMMjg3IDI1OUw5NSA2NjdIMjYzTDM3OSAzOTBMNTc2IDY2N0g3MzdMNDMzIDI2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IloiIGhvcml6LWFkdi14PSI2MDciIGQ9Ik00MyAwTDU4IDEwN0w0NDMgNTQzSDEzNUwxNTIgNjY3SDY0MUw2MjYgNTYwTDIzNiAxMTlINTgwTDU2NCAwSDQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTUzIC0xMjVMMTgxIDc4M0g0MjFMNDA5IDcwMkgyOTJMMTg3IC00NUgzMDRMMjkzIC0xMjVINTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJcIiBob3Jpei1hZHYteD0iNTczIiBkPSJNMzkyIC0xMTVMMTIxIDY2N0gyNDlMNTE5IC0xMTVIMzkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXSIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTQxIC0xMjVMNTIgLTQ1SDE2OUwyNzQgNzAySDE1N0wxNjkgNzgzSDQwOUwyODEgLTEyNUg0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSI0MzMiIGQ9Ik00MzkgNTIyTDI5NyA2MDFMMTMwIDUyMkw3OSA1OTRMMzEwIDcwNUw1MTIgNTk0TDQzOSA1MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iNDg0IiBkPSJNLTMyIC0xNzFMLTE5IC04NEg0ODBMNDY3IC0xNzFILTMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTI5NyA1NjVMMTE3IDY4M0wyNjcgNzQxTDM4NyA2MTBMMjk3IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImEiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik00MTEgMFY2N0g0MDdRMzc5IDI2IDMzOCA4VDI1MCAtMTFRMjAxIC0xMSAxNjggNVQxMTMgNDlUODMgMTE0VDczIDE5NFE3MyAyNDcgODYgMzAzVDEzMCA0MDZUMjA4IDQ4M1QzMjQgNTEzUTM3OCA1MTMgNDA3IDQ5N1Q0NTQgNDQ2SDQ1OEw0NzQgNTAySDU5N0w1MjcgMEg0MTFaTTQzMiAzMTZRNDM5IDM2NCA0MTUgMzg0VDM0NiA0MDVRMzA0IDQwNSAyNzkgMzg2VDIzOSAzMzZUMjIxIDI2OFQyMTYgMTk2UTIxNiAxNzUgMjIwIDE1NlQyMzMgMTIzVDI2MCAxMDFUMzA0IDkyUTM2MCA5MiAzODQgMTIzVDQxNiAyMDZMNDMyIDMxNloiICAvPgorPGdseXBoIHVuaWNvZGU9ImIiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik01ODggMzE2UTU4OCAyNjEgNTc0IDIwM1Q1MjggOThUNDUwIDIwVDMzNiAtMTFRMjg2IC0xMSAyNTAgOFQyMDIgNzVIMTk4TDE2NyAwSDYzTDE2MSA3MDBIMzAyTDI2NiA0NDdIMjcwUTI5NiA0ODYgMzMyIDQ5OVQ0MTAgNTEzUTQ1OCA1MTMgNDkxIDQ5OFQ1NDYgNDU2VDU3OCAzOTNUNTg4IDMxNlpNMzEwIDkyUTM1MCA5MiAzNzYgMTEzVDQxOCAxNjdUNDM5IDIzN1Q0NDUgMzEwUTQ0NSAzMzAgNDQxIDM0N1Q0MjcgMzc3VDQwMCAzOTdUMzU2IDQwNVEzMTEgNDA1IDI4MiAzODVUMjQ2IDMxNkwyMzAgMjA2UTIyOCAxOTggMjI4IDE5MFQyMjggMTc0UTIyOCAxMzYgMjQ1IDExNFQzMTAgOTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iNTE5IiBkPSJNNDg2IDM1MFE0NjIgMzc5IDQzMyAzOTFUMzY2IDQwNFEzMjYgNDA0IDI5OCAzODdUMjUxIDM0M1QyMjUgMjgyVDIxNyAyMTNRMjE3IDE2MCAyNDIgMTI5VDMyMyA5N1EzNjcgOTcgNDAxIDEwOVQ0NzEgMTQ3TDUwMyA1NFE0NTUgMjMgNDA2IDZUMjk5IC0xMlEyNDkgLTEyIDIwNyAxVDEzNSAzOVQ4OSAxMDRUNzIgMTk2UTcyIDI2NCA5MyAzMjJUMTU1IDQyMlQyNTEgNDg5VDM3NyA1MTNRNDI4IDUxMyA0NzUgNDk0VDU1OSA0NDFMNDg2IDM1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik00MTEgMFY2N0g0MDdRMzc5IDI2IDMzOCA4VDI1MCAtMTFRMjAxIC0xMSAxNjggNVQxMTMgNDlUODMgMTE0VDczIDE5NFE3MyAyNDcgODYgMzAzVDEzMCA0MDZUMjA4IDQ4M1QzMjQgNTEzUTM2MyA1MTMgMzk0IDUwMVQ0NDUgNDU1SDQ0OUw0ODQgNzAwSDYyNUw1MjcgMEg0MTFaTTQzMiAzMTZRNDM5IDM2NCA0MTUgMzg0VDM0NiA0MDVRMzA0IDQwNSAyNzkgMzg2VDIzOSAzMzZUMjIxIDI2OFQyMTYgMTk2UTIxNiAxNzUgMjIwIDE1NlQyMzMgMTIzVDI2MCAxMDFUMzA0IDkyUTM2MCA5MiAzODQgMTIzVDQxNiAyMDZMNDMyIDMxNloiICAvPgorPGdseXBoIHVuaWNvZGU9ImUiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01NzAgMzAzUTU3MCAyNTQgNTU4IDIwNkgyMDlRMjA4IDIwMSAyMDggMTk2VDIwNyAxODRRMjA3IDE1OCAyMTYgMTQxVDI0MiAxMTNUMjgwIDk5VDMyNCA5NVEzNjcgOTUgNDA0IDEwNlQ0NzkgMTM3TDUxMSA0M1E0NjAgMTYgNDEwIDNUMzAyIC0xMVEyNTEgLTExIDIwOSAxVDEzNyA0MFQ5MCAxMDVUNzMgMTk4UTczIDI2NCA5MyAzMjFUMTUxIDQyMlQyNDMgNDg5VDM2NiA1MTRRNDY0IDUxNCA1MTcgNDU3VDU3MCAzMDNaTTQ0NSAyOTVRNDQ2IDMwMSA0NDYgMzA3VDQ0NyAzMjFRNDQ3IDM2NiA0MjMgMzkwVDM1NCA0MTRRMjk4IDQxNCAyNjUgMzgyVDIyMyAyOTVINDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjM2NSIgZD0iTTQ0MCA1OThRNDMwIDYwMCA0MTYgNjAxVDM4NSA2MDJRMzY0IDYwMiAzNTEgNjAwVDMyOSA1OTFUMzE3IDU3M1QzMTEgNTQ2TDMwNSA1MDJINDE2TDQwMCAzOTFIMjk0TDI0MCAwSDk3TDE1MSAzODlINzRMOTAgNTAySDE2N0wxNzYgNTYzUTE4MSA2MDEgMTkyIDYyOFQyMjYgNjcyVDI4NSA2OTdUMzc1IDcwNVEzOTMgNzA1IDQxMyA3MDRUNDU0IDcwMEw0NDAgNTk4SDQ0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImciIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik01MjUgLTEzUTUxNSAtODQgNDkzIC0xMjZUNDM5IC0xOTBUMzY3IC0yMTlUMjc5IC0yMjZRMjA1IC0yMjYgMTUyIC0yMTNUNTAgLTE3MEwxMDUgLTY2UTE0NSAtOTIgMTg1IC0xMDVUMjc2IC0xMTlRMzI2IC0xMTkgMzUwIC0xMDFUMzgyIC0yOUwzOTYgNzFIMzkyUTM3NiA1MSAzNjEgMzhUMzMwIDE4VDI5NiA3VDI1NSAzUTIwNyAzIDE3MyAxOFQxMTYgNTlUODQgMTIxVDczIDIwMFE3MyAyNTIgODcgMzA3VDEzMSA0MDlUMjA5IDQ4NFQzMjQgNTEzUTM3MiA1MTMgNDAzIDUwMFQ0NTUgNDQ0SDQ1OUw0NzUgNTAySDU5N0w1MjUgLTEzWk00MzEgMzEyUTQzOCAzNjEgNDE2IDM4M1QzNDYgNDA1UTMwOCA0MDUgMjg0IDM4OFQyNDUgMzQzVDIyNCAyODJUMjE4IDIxNVEyMTggMTkzIDIyMiAxNzRUMjM2IDE0MVQyNjIgMTE4VDMwNSAxMDlRMzM0IDEwOSAzNTQgMTE3VDM4NyAxNDFUNDA4IDE3N1Q0MTkgMjI1TDQzMSAzMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJoIiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBMNDI4IDI4MVE0MzAgMjk0IDQzMSAzMDVUNDMyIDMyN1E0MzIgMzU5IDQxNyAzNzdUMzU4IDM5NVEyNTkgMzk1IDI0NiAzMDBMMjA0IDBINjNMMTYxIDcwMEgzMDJMMjY3IDQ1M0gyNzFRMzAwIDQ4NyAzMzcgNTAwVDQxOSA1MTNRNTA1IDUxMyA1NDAgNDczVDU3NiAzNjFRNTc2IDM0NyA1NzUgMzMzVDU3MiAzMDNMNTMwIDBIMzg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaSIgaG9yaXotYWR2LXg9IjI2NyIgZD0iTTYzIDBMMTMzIDUwMkgyNzRMMjA0IDBINjNaTTMwNyA2NDNRMzA3IDYyMyAyOTkgNjA5VDI3OCA1ODRUMjQ3IDU2OVQyMTIgNTY0UTE4MyA1NjQgMTYwIDU3OFQxMzYgNjI0UTEzNiA2NDMgMTQ0IDY1OFQxNjUgNjgzVDE5NiA2OThUMjMxIDcwM1EyNTkgNzAzIDI4MyA2ODlUMzA3IDY0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSIyNzQiIGQ9Ik0zMTMgNjQ0UTMxMyA2MjQgMzA1IDYwOVQyODQgNTg0VDI1NCA1NjlUMjE4IDU2NFEyMDQgNTY0IDE5MSA1NjdUMTY2IDU3OFQxNDkgNTk2VDE0MiA2MjNRMTQyIDY0MyAxNTAgNjU4VDE3MSA2ODNUMjAyIDY5OFQyMzcgNzAzUTI2NSA3MDMgMjg5IDY5MFQzMTMgNjQ0Wk0yMDggLTE3UTE5NCAtMTIwIDEzNyAtMTczVC0yNiAtMjI2US00NyAtMjI2IC02NyAtMjI1VC0xMDkgLTIyMUwtOTIgLTEwM1EtNTkgLTEwNiAtMjYgLTEwNlEzIC0xMDYgMjAgLTk5VDQ4IC03OVQ2MiAtNDZUNzAgMEwxNDAgNTAySDI4MUwyMDggLTE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iayIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTM4MCAwTDI4MiAyMTRMMjI2IDE2MkwyMDQgMEg2M0wxNjEgNzAwSDMwMkwyNDggMzE0SDI1Mkw0MzMgNTAySDYwOEwzOTYgMzAxTDU1MSAwSDM4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImwiIGhvcml6LWFkdi14PSIzMTYiIGQ9Ik0yODggMFEyNDkgLTYgMTg1IC02UTEyNSAtNiAxMDAgMTJUNzUgNzVRNzUgODkgNzggMTA5TDE2MSA3MDBIMzAyTDIyMyAxNDJRMjIwIDExOSAyMjcgMTE0VDI1NCAxMDlIMzAzTDI4OCAwSDI4OFoiICAvPgorPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4NzYiIGQ9Ik02NzIgMEw3MTIgMjg3UTcxNSAzMDggNzE1IDMyNlE3MTUgMzU4IDcwMiAzNzZUNjUxIDM5NVE2MTYgMzk1IDU4NyAzNzdUNTUxIDMxM0w1MDggMEgzNjdMNDA3IDI4OFE0MTAgMzEwIDQxMCAzMjlRNDEwIDM2MSAzOTcgMzc4VDM0NSAzOTVRMzI4IDM5NSAzMTIgMzkwVDI4MiAzNzRUMjU5IDM0OFQyNDcgMzEyTDIwNCAwSDYzTDEzMyA1MDJIMjU3TDI1OSA0NDFIMjYzUTI4MCA0NjggMzEzIDQ5MFQ0MDIgNTEzUTQ1MCA1MTMgNDgxIDQ5NlQ1MjcgNDM5UTU2MiA0ODEgNjAxIDQ5N1Q2OTEgNTEzUTc3NyA1MTMgODE4IDQ3M1Q4NTkgMzU0UTg1OSAzNDIgODU4IDMyOVQ4NTUgMzAyTDgxMyAwSDY3MloiICAvPgorPGdseXBoIHVuaWNvZGU9Im4iIGhvcml6LWFkdi14PSI1OTMiIGQ9Ik0zODkgMEw0MjggMjgxUTQzMCAyOTMgNDMxIDMwM1Q0MzIgMzI0UTQzMiAzNTYgNDE3IDM3NVQzNTcgMzk1UTI1OSAzOTUgMjQ2IDMwMEwyMDQgMEg2M0wxMzMgNTAySDI1NEwyNTYgNDQySDI2MFEyOTMgNDgyIDMzMCA0OTdUNDE4IDUxM1E1MDUgNTEzIDU0MCA0NzNUNTc2IDM2MVE1NzYgMzQ3IDU3NSAzMzNUNTcyIDMwM0w1MzAgMEgzODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJvIiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNzMgMTk3UTczIDI2NiA5MyAzMjRUMTUxIDQyNFQyNDUgNDg5VDM3MiA1MTNRNDIzIDUxMyA0NjQgNTAxVDUzNiA0NjNUNTgyIDM5OFQ1OTggMzA1UTU5OCAyMzYgNTc4IDE3OFQ1MTkgNzhUNDI1IDEzVDI5OCAtMTFRMTk2IC0xMSAxMzUgNDBUNzMgMTk3Wk0zNTcgNDAzUTMxNCA0MDMgMjg3IDM4NVQyNDQgMzM3VDIyMiAyNzJUMjE2IDIwMFEyMTYgMTQ5IDIzOCAxMjJUMzE0IDk1UTM1NiA5NSAzODMgMTE0VDQyNiAxNjJUNDQ4IDIyOFQ0NTUgMzAwUTQ1NSAzNTEgNDMyIDM3N1QzNTcgNDAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTU4OCAzMThRNTg4IDI2MyA1NzQgMjA1VDUzMCA5OFQ0NTAgMjBUMzI5IC0xMVEyODIgLTExIDI1NiA0VDIxNSA1NEgyMTFMMTczIC0yMjBIMzJMMTMzIDUwMkgyNTBMMjUyIDQ0MkgyNTZRMjg4IDQ4MSAzMjQgNDk3VDQwOCA1MTNRNDU3IDUxMyA0OTEgNDk4VDU0NiA0NTdUNTc4IDM5NVQ1ODggMzE4Wk0zMDkgOTJRMzUxIDkyIDM3NyAxMTNUNDE5IDE2N1Q0MzkgMjM4VDQ0NSAzMTFRNDQ1IDMzMSA0NDEgMzQ4VDQyNyAzNzhUMzk5IDM5OFQzNTUgNDA1UTMxMCA0MDUgMjgyIDM4NVQyNDYgMzE2TDIzMCAyMDZRMjI4IDE5NyAyMjggMTg5VDIyOCAxNzNRMjI4IDEzNSAyNDUgMTE0VDMwOSA5MloiICAvPgorPGdseXBoIHVuaWNvZGU9InEiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik00NTIgLTIzOFE0MDggLTIyMSAzOTAgLTE5NlQzNzEgLTEyOFEzNzEgLTEwOSAzNzQgLTg4TDM5NCA1NEgzOTBRMzYyIDE2IDMyOSAzVDI1MiAtMTFRMjAzIC0xMSAxNjkgNVQxMTQgNDlUODMgMTE0VDczIDE5NFE3MyAyNDcgODYgMzAzVDEzMCA0MDZUMjA4IDQ4M1QzMjQgNTEzUTM2OCA1MTMgNDA0IDQ5OVQ0NTggNDQySDQ2Mkw0NzggNTAySDU5N0w1MTcgLTY3UTUxMiAtOTcgNTE5IC0xMTNUNTUyIC0xNDRMNDUyIC0yMzhaTTQzMiAzMTZRNDM5IDM2NCA0MTYgMzg0VDM0NiA0MDVRMzA0IDQwNSAyNzggMzg1VDIzOCAzMzVUMjIwIDI2OFQyMTUgMTk3UTIxNSAxNzYgMjE5IDE1N1QyMzMgMTIzVDI2MCAxMDFUMzA0IDkyUTM2MCA5MiAzODQgMTIzVDQxNiAyMDZMNDMyIDMxNloiICAvPgorPGdseXBoIHVuaWNvZGU9InIiIGhvcml6LWFkdi14PSI0MDQiIGQ9Ik0zOTkgMzg4UTM2OCAzODggMzQyIDM4NVQyOTYgMzcyVDI2MiAzNDFUMjQ0IDI4N0wyMDQgMEg2M0wxMzMgNTAySDI1M0wyNTYgNDM1SDI2MFEyODYgNDczIDMyMCA0OTJUNDE0IDUxMkg0NDlMNDMyIDM4OEgzOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJzIiBob3Jpei1hZHYteD0iNDkyIiBkPSJNNDgwIDE2N1E0ODAgMTE2IDQ2MSA4MlQ0MTEgMjdUMzM4IC0yVDI1MiAtMTFRMTk1IC0xMSAxMzggNFQzMyA1MEw5NSAxNDZRMTMzIDEyMyAxNzQgMTA4VDI2MSA5MlEyNzUgOTIgMjkwIDk0VDMxNyAxMDFUMzM3IDExN1QzNDUgMTQ2UTM0NSAxNjQgMzI3IDE3NFQyODAgMTkzVDIxOSAyMTFUMTU4IDIzN1QxMTEgMjc5VDkyIDM0N1E5MiAzOTMgMTExIDQyNVQxNjIgNDc2VDIzNCA1MDRUMzE3IDUxM1EzNjUgNTEzIDQxNCA1MDNUNTA1IDQ3MEw0NTQgMzcwUTQyNSAzODcgMzg5IDM5N1QzMTggNDA4UTMwNiA0MDggMjkwIDQwN1QyNTkgNDAyVDIzNSAzODhUMjI1IDM2MlEyMjUgMzQ0IDI0NCAzMzVUMjkxIDMxN1QzNTIgMzAwVDQxNCAyNzZUNDYxIDIzNFQ0ODAgMTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idCIgaG9yaXotYWR2LXg9IjM5MSIgZD0iTTM1MiAtMlEzMjMgLTYgMzAzIC03VDI2NCAtOVEyMjIgLTkgMTkzIC00VDE0NiAxNFQxMjAgNDZUMTEyIDk0UTExMiAxMDUgMTEzIDExOFQxMTYgMTQ1TDE1MSAzODlINjlMODUgNTAySDE2OEwxODcgNjM1SDMyNkwzMDcgNTAySDQyM0w0MDcgMzg5SDI5MUwyNjAgMTY0UTI1NyAxNDYgMjU3IDEzNVQyNjYgMTE3VDI5MSAxMDlUMzQyIDEwN1EzNTAgMTA3IDM1NCAxMDdUMzY4IDEwOEwzNTIgLTJIMzUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idSIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTM5OCAwVjU4SDM5NFEzNjcgMjUgMzMwIDdUMjQwIC0xMlEyMDQgLTEyIDE3NSAtNlQxMjYgMTdUOTYgNjFUODUgMTMwUTg1IDE0MyA4NiAxNTdUODkgMTg4TDEzMyA1MDJIMjc0TDIzNiAyMzRRMjM0IDIxNyAyMzIgMjAyVDIzMCAxNzRRMjMwIDE0MiAyNDQgMTI0VDMwMiAxMDZRMzMwIDEwNiAzNDkgMTEzVDM4MSAxMzJUMzk5IDE2NFQ0MDkgMjA3TDQ1MCA1MDJINTkxTDUyMSAwSDM5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik0zNTIgMEgxOTJMODEgNTAySDIzMUwyOTAgMTMwSDI5NUw0NTcgNTAySDYwMkwzNTIgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InciIGhvcml6LWFkdi14PSI3OTYiIGQ9Ik02MjcgMEg0OTNMNDM5IDI5OEg0MzVMMzAzIDBIMTY2TDg2IDUwMkgyMzNMMjYzIDE1MEgyNjdMNDEyIDUwMkg1MjJMNTcxIDE0OUg1NzVMNzA4IDUwMkg4NTBMNjI3IDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iNTQyIiBkPSJNMzczIDBMMjk1IDE3NEgyOTFMMTY4IDBINkwyMjIgMjY0TDk3IDUwMkgyNTZMMzIzIDM0OEgzMjdMNDM5IDUwMkg1ODZMMzkzIDI2N0w1MzYgMEgzNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ5IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMzMyIC0yMVEyOTkgLTgzIDI3MyAtMTIzVDIyMCAtMTg2VDE2MSAtMjE3VDgzIC0yMjZRNjkgLTIyNiA1MSAtMjI1VDggLTIyMUwyNSAtMTA0UTMyIC0xMDYgNDQgLTEwNlQ4MCAtMTA3UTEwMCAtMTA3IDExMyAtMTA0VDEzNiAtOTRUMTU0IC03NlQxNzIgLTQ3TDIwNCAxMUw3NyA1MDJIMjMwTDI5NSAxNTRIMjk5TDQ2MSA1MDJINjEyTDMzMiAtMjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ6IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNMzQgMEw0NyA5NUwzMjEgMzg5SDkxTDEwNyA1MDJINTA5TDQ5NSA0MDFMMjI1IDExMkg0NjNMNDQ4IDBIMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ7IiBob3Jpei1hZHYteD0iNDEzIiBkPSJNMjUyIC0xMjVRMTg0IC0xMjUgMTUyIC0xMDRUMTIwIC0yN1ExMjAgLTggMTIzIDE1TDE0NyAxOTBRMTUwIDIwNiAxNTAgMjIwUTE1MCAyNDEgMTQxIDI1NVQxMDUgMjc1TDExOCAzNjlRMTU0IDM3NiAxNjYgMzk5VDE4NCA0NTRMMjExIDY0NlEyMTcgNjg2IDIyOSA3MTNUMjYxIDc1NlQzMTEgNzc5VDM3OSA3ODZINDU0TDQ0MiA3MDJINDA3UTM4MiA3MDIgMzY5IDY5OFQzNDggNjgzVDMzNyA2NTdUMzMxIDYxOEwzMDUgNDMwUTMwMCAzOTEgMjgyIDM2OVQyMjggMzIyUTI1NyAyOTggMjY4IDI3NlQyNzUgMjE0TDI1MCA0MlEyNDggMjggMjQ3IDE4VDI0NiAtMlEyNDYgLTI0IDI1NyAtMzNUMzAzIC00MkgzMzhMMzI2IC0xMjVIMjUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifCIgaG9yaXotYWR2LXg9IjI4NyIgZD0iTTU4IC0yMDBMMTkwIDc0MEgyOTNMMTYxIC0yMDBINThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ9IiBob3Jpei1hZHYteD0iNDEzIiBkPSJNMzg0IDI3NVEzNDcgMjY3IDMzNSAyNDVUMzE4IDE5MEwyOTQgMTVRMjg4IC0yNiAyNzYgLTUyVDI0NCAtOTVUMTk0IC0xMThUMTI2IC0xMjVINTFMNjMgLTQySDk5UTEyMyAtNDIgMTM2IC0zOFQxNTYgLTI0VDE2NyAyVDE3NCA0MkwxOTkgMjE0UTIwMiAyMzQgMjA3IDI0OVQyMjEgMjc2VDI0MyAyOTlUMjc0IDMyMlEyNDUgMzQ3IDIzNSAzNjlUMjI5IDQzMEwyNTUgNjE4UTI1NyA2MzIgMjU4IDY0M1QyNjAgNjY0UTI2MCA2ODQgMjQ5IDY5M1QyMDMgNzAySDE2N0wxNzkgNzg2SDI1NFEzMjIgNzg2IDM1MyA3NjVUMzg1IDY4NlEzODUgNjY4IDM4MiA2NDZMMzU1IDQ1NFEzNTAgNDIyIDM1NyAzOTlUMzk3IDM2OUwzODQgMjc1SDM4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9In4iIGhvcml6LWFkdi14PSI0NzgiIGQ9Ik01NTggNjIzUTUzMyA1NzggNDk1IDU1NlQ0MTEgNTM0UTM4NCA1MzQgMzYxIDU0MFQzMTcgNTU1VDI3NCA1NzBUMjMxIDU3N1EyMDkgNTc3IDE5MiA1NjlUMTU3IDUzM0w4MSA1NjlROTggNTk0IDExNCA2MTBUMTQ3IDYzN1QxODMgNjUyVDIyNSA2NTdRMjUxIDY1NyAyNzQgNjUwVDMxOSA2MzVUMzYyIDYyMFQ0MDUgNjEzUTQyNiA2MTMgNDQzIDYyMlQ0NzYgNjU2TDU1OCA2MjNINTU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTA7IiBob3Jpei1hZHYteD0iMzIwIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEExOyIgaG9yaXotYWR2LXg9IjI5OSIgZD0iTTY0IC0xNjRRODYgLTQ0IDEwOCA3NFQxNTEgMzEySDI2N1EyNTMgMTkzIDI0MiA3NVQyMTkgLTE2NEg2NFpNMTM0IDQzM1ExMzQgNDUzIDE0MyA0NjhUMTY4IDQ5M1QyMDEgNTA5VDIzNyA1MTVRMjUyIDUxNSAyNjcgNTEyVDI5NCA1MDBUMzEzIDQ4MFQzMjEgNDUxUTMyMSA0MzEgMzExIDQxN1QyODYgMzkyVDI1MyAzNzZUMjE4IDM3MVEyMDQgMzcxIDE4OSAzNzRUMTYyIDM4NVQxNDIgNDA1VDEzNCA0MzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMjsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01NjAgMTU5UTUyNyAxMzAgNDg5IDEwOVQ0MDcgNzlMMzk2IDBIMjY1TDI3NSA3OFExOTQgOTQgMTU2IDE1MFQxMTggMjg1UTExOCAzNDAgMTMyIDM5MFQxNzYgNDgyVDI0NyA1NTFUMzQ3IDU5MEwzNTggNjY3SDQ4OUw0NzggNTkwUTUxNCA1ODQgNTQ1IDU2N1Q2MDUgNTI3TDUzMCA0MzNRNTA0IDQ2MSA0NzYgNDc0VDQxMCA0ODdRMzY5IDQ4NyAzNDEgNDcxVDI5NSA0MjlUMjcwIDM2OVQyNjIgMjk4UTI2MiAyNDUgMjg2IDIxM1QzNjYgMTgxUTQxMSAxODEgNDQ0IDE5N1Q1MTEgMjQzTDU2MCAxNTlINTYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTM7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTU4IDBINTVMNzAgMTA5SDk4UTEzNiAxMDkgMTU3IDEyNlQxOTAgMTcyVDIwMyAyMzRUMjA2IDMwMkgxMDdMMTIyIDQxMUgyMDhRMjA2IDQzMCAyMDUgNDQ2VDIwNCA0ODBRMjA0IDU4MiAyNjQgNjMwVDQzNSA2NzhRNTQ0IDY3OCA2MjkgNjM0TDU4NiA1MTNRNTU3IDUzMyA1MjUgNTQ2VDQ0NCA1NjBRMzg3IDU2MCAzNjQgNTM3VDM0MCA0NTZRMzQwIDQ0NiAzNDAgNDM2VDM0MiA0MTFINTAwTDQ4NSAzMDJIMzQ3UTM0OCAyODkgMzQ4IDI3OFQzNDkgMjU1UTM0OSAyMjAgMzQxIDE4NVQzMDYgMTIyTDMwNSAxMTlINTc0TDU1OCAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNMTMyIDMxMlExMzIgMzUxIDE0NiAzODdUMTg0IDQ1NUwxMTYgNTM1TDE5OCA2MDdMMjY4IDUyNVEyOTQgNTM5IDMyMiA1NDZUMzgxIDU1NFE0MzggNTU0IDQ4OCA1MjNMNTg0IDYwN0w2NDYgNTM1TDU1MiA0NTJRNTcxIDQxNSA1NzEgMzcxUTU3MSAzMzIgNTU4IDI5N1Q1MjIgMjMwTDU5MSAxNDlMNTA5IDc2TDQzOSAxNThRNDEyIDE0MyAzODIgMTM1VDMyMSAxMjZRMjY1IDEyNiAyMTUgMTU3TDEyMyA3N0w2MSAxNDlMMTUxIDIyOFExMzIgMjY2IDEzMiAzMTJaTTM2NiA0NDFRMzQ0IDQ0MSAzMjQgNDMyVDI4NyA0MDdUMjYyIDM3MVQyNTIgMzI4UTI1MiAyOTEgMjc3IDI2N1QzMzkgMjQyUTM2MSAyNDIgMzgxIDI1MVQ0MTggMjc2VDQ0MyAzMTJUNDUyIDM1NVE0NTIgMzkzIDQyOCA0MTdUMzY2IDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE1OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTUxOSAzOThINjI3TDYxNSAzMTBINDUzTDQyMCAyNjZMNDExIDIwNkg2MDBMNTg4IDExOEgzOTlMMzgzIDBIMjQwTDI1NiAxMThINjBMNzIgMjA2SDI2OEwyNzYgMjU5TDI1MSAzMTBIODdMOTkgMzk4SDIwN0wxMDcgNjY3SDI3NUwzNjcgMzg1TDUzNSA2NjdINjkyTDUxOSAzOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNjsiIGhvcml6LWFkdi14PSIyODciIGQ9Ik0xMzUgMzYwTDE4OSA3NDBIMjkyTDIzOCAzNjBIMTM1Wk01OCAtMjAwTDExMSAxODBIMjE0TDE2MSAtMjAwSDU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTc7IiBob3Jpei1hZHYteD0iNDk2IiBkPSJNNDk2IDM0MVE0OTYgMzA5IDQ4NiAyODVUNDU3IDI0NFQ0MTMgMjE3VDM1OCAyMDFMMzU3IDE5OFEzOTkgMTg3IDQyNyAxNTlUNDU2IDg1UTQ1NiAzOCA0MzUgNlQzODEgLTQ3VDMwNiAtNzVUMjI1IC04NFExNjQgLTg0IDExNiAtNzFUMTcgLTIzTDc5IDc1UTExNCA1MiAxNTQgMzVUMjM4IDE4UTI1MSAxOCAyNjQgMjBUMjg3IDI3VDMwNCA0MlQzMTEgNjdRMzExIDgzIDI5MyA5NVQyNDcgMTE4VDE4OCAxNDBUMTI4IDE2OVQ4MyAyMDlUNjQgMjY1UTY0IDI5NyA3NiAzMjFUMTA4IDM2MVQxNTQgMzg3VDIxMCA0MDFWNDA1UTE5MCA0MTEgMTcxIDQyMFQxMzggNDQ0VDExNSA0NzZUMTA2IDUxN1ExMDYgNTYxIDEyNyA1OTFUMTgxIDY0MVQyNTMgNjY5VDMzMCA2NzhRMzgxIDY3OCA0MjcgNjY5VDUyMCA2MzdMNDY2IDUzMFE0MzQgNTUwIDQwMSA1NjFUMzI4IDU3M1EzMTcgNTczIDMwNCA1NzJUMjc4IDU2N1QyNTggNTU0VDI1MCA1MzBRMjUwIDUxMyAyNjggNTAyVDMxMyA0ODJUMzczIDQ2MlQ0MzIgNDM2VDQ3OCAzOThUNDk2IDM0MVpNMjcxIDIzOVEyODYgMjM5IDMwMyAyNDFUMzM0IDI1MFQzNTcgMjY4VDM2NiAzMDBRMzY2IDMxNSAzNTggMzIzVDMzNyAzMzZUMzExIDM0MlQyODYgMzQzUTI3MSAzNDMgMjU1IDM0MVQyMjQgMzMzVDIwMCAzMTZUMTkwIDI4NVExOTAgMjcwIDE5OCAyNjFUMjE5IDI0N1QyNDYgMjQxVDI3MSAyMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBODsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik00NDUgNjQ5UTQ0NSA2MzMgNDM5IDYxOVQ0MjEgNTkzVDM5NiA1NzZUMzY1IDU2OVEzMzkgNTY5IDMyMiA1ODZUMzA0IDYzMFEzMDQgNjQ2IDMxMSA2NjBUMzI5IDY4NFQzNTUgNzAxVDM4NSA3MDhRNDEwIDcwOCA0MjcgNjkyVDQ0NSA2NDlaTTIyMiA2NDlRMjIyIDYzMyAyMTYgNjE5VDE5OCA1OTNUMTczIDU3NlQxNDIgNTY5UTExNiA1NjkgOTkgNTg2VDgyIDYyOVE4MiA2NDUgODggNjU5VDEwNiA2ODRUMTMyIDcwMVQxNjIgNzA4UTE4NyA3MDggMjA0IDY5MlQyMjIgNjQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTk7IiBob3Jpei1hZHYteD0iNzk1IiBkPSJNNzQzIDMzNFE3NDMgMjYyIDcxNiAyMDBUNjQyIDkwVDUzMyAxNlQzOTggLTExUTMyNiAtMTEgMjYzIDE2VDE1MyA5MFQ3OSAxOTlUNTIgMzM0UTUyIDQwNiA3OSA0NjhUMTUzIDU3OFQyNjMgNjUyVDM5OCA2NzlRNDcwIDY3OSA1MzIgNjUyVDY0MiA1NzhUNzE2IDQ2OVQ3NDMgMzM0Wk02OTggMzM1UTY5OCAzOTcgNjc1IDQ1MVQ2MTEgNTQ3VDUxNiA2MTFUMzk4IDYzNVEzMzYgNjM1IDI4MiA2MTJUMTg3IDU0N1QxMjMgNDUyVDk5IDMzNVE5OSAyNzMgMTIyIDIxOVQxODcgMTI1VDI4MiA2MVQzOTggMzdRNDYwIDM3IDUxNCA2MFQ2MTAgMTI0VDY3NCAyMTlUNjk4IDMzNVpNNTcyIDE4N1E1MzcgMTU0IDQ5OCAxMzdUNDExIDExOVEzNTUgMTE5IDMxNSAxMzZUMjUwIDE4M1QyMTQgMjUyVDIwMiAzMzdRMjAyIDQzNSAyNTUgNDkyVDQwOSA1NDlRNDU3IDU0OSA0OTYgNTMyVDU3MSA0NzlMNTE1IDQxOFE0NzAgNDcxIDQxMyA0NzFRMzUxIDQ3MSAzMjQgNDM2VDI5NyAzMzdRMjk3IDI3MCAzMjQgMjM0VDQxMiAxOThRNDQ0IDE5OCA0NzAgMjExVDUyMyAyNTBMNTcyIDE4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFBOyIgaG9yaXotYWR2LXg9IjQxNSIgZD0iTTM1MiAzNzFRMzM3IDM3NCAzMjUgMzgyVDMwOSA0MDZIMzA1UTI4MiAzOTAgMjU3IDM4MVQyMDMgMzcxUTE2NyAzNzEgMTQyIDM4OFQxMTYgNDQ2UTExNiA0ODggMTM2IDUxM1QxODYgNTUxVDI1MiA1NjlUMzIxIDU3NFEzMjIgNTgwIDMyMyA1ODZUMzI0IDU5N1EzMjQgNjEwIDMxNCA2MTVUMjg3IDYyMFEyNDYgNjIwIDIxNCA2MDlUMTY4IDU5MEwxNDkgNjUwUTE4NiA2NjcgMjIzIDY3NlQzMDEgNjg2UTMyNSA2ODYgMzQ0IDY4M1QzNzggNjcxVDQwMCA2NDVUNDA4IDYwMVE0MDggNTgyIDQwNiA1NjJUNDAwIDUyMVQzOTQgNDg0VDM5MSA0NTNRMzkxIDQ0MiAzOTggNDM2VDQxNCA0MjRMMzUyIDM3MVpNMzE0IDUyNFEyOTcgNTI0IDI3OCA1MjNUMjQyIDUxNVQyMTQgNDk1VDIwMiA0NjBRMjAyIDQyNyAyMzYgNDI3UTI1NSA0MjcgMjcxIDQzNFQzMDQgNDUyTDMxNCA1MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQjsiIGhvcml6LWFkdi14PSI0OTkiIGQ9Ik0zODEgOTdMMjg2IDMwMEw0MzggNTAyTDUyNiA0NTVMNDA1IDI5OUw0ODMgMTQ0TDM4MSA5N1pNMTU3IDg1TDU2IDMwMEwyMTYgNTEzTDMwNCA0NjZMMTc1IDI5OUwyNTkgMTMzTDE1NyA4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFDOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTQ4MCAyMTFINzRMOTEgMzI5SDYxNEw1NzIgMzRINDU1TDQ4MCAyMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRDsiIGhvcml6LWFkdi14PSIzODMiIGQ9Ik03NSAxOTVMOTMgMzI3SDM4MEwzNjIgMTk1SDc1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUU7IiBob3Jpei1hZHYteD0iNDUxIiBkPSJNMjk1IDM2MlEyNTkgMzYyIDIyOCAzNzVUMTczIDQxMVQxMzYgNDY1VDEyMiA1MzFRMTIyIDU2NiAxMzUgNTk3VDE3MiA2NTFUMjI3IDY4N1QyOTUgNzAwUTMzMSA3MDAgMzYyIDY4N1Q0MTggNjUxVDQ1NSA1OTdUNDY5IDUzMVE0NjkgNDk2IDQ1NiA0NjVUNDE4IDQxMVQzNjMgMzc1VDI5NSAzNjJaTTI5NiA2NzdRMjY1IDY3NyAyMzggNjY2VDE5MSA2MzRUMTU5IDU4OFQxNDcgNTMyUTE0NyA1MDIgMTU4IDQ3NlQxOTAgNDMwVDIzOCAzOTlUMjk2IDM4N1EzMjYgMzg3IDM1MyAzOThUNDAxIDQyOVQ0MzMgNDc1VDQ0NSA1MzJRNDQ1IDU2MiA0MzMgNTg4VDQwMSA2MzRUMzU0IDY2NVQyOTYgNjc3Wk0yMjQgNjI3UTI0MiA2MjkgMjYwIDYyOVQyOTUgNjI5UTMxMCA2MjkgMzI1IDYyN1QzNTIgNjE4VDM3MSA1OTlUMzc4IDU2OFEzNzggNTM1IDM0OSA1MTlMMzgzIDQzOUgzMjlMMzA0IDUwM1EzMDIgNTA1IDMwMiA1MDZUMjk4IDUwN0gyNzNWNDM5SDIyNFY2MjdaTTI5NSA1OTJRMjg4IDU5MiAyODIgNTkyVDI3MiA1OTFWNTQySDI5OVEzMTYgNTQyIDMyMiA1NDhUMzI5IDU2NlEzMjkgNTc5IDMyMiA1ODVUMjk1IDU5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFGOyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTk0IDU4N0wxMDYgNjc0SDQyOUw0MTcgNTg3SDk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjA7IiBob3Jpei1hZHYteD0iNDEzIiBkPSJNNDM3IDU1MVE0MzcgNTEzIDQyNCA0ODJUMzg3IDQyOFQzMzEgMzkzVDI2MiAzODBRMjAyIDM4MCAxNjMgNDE2VDEyNCA1MTNRMTI0IDU1MyAxMzcgNTg1VDE3NSA2MzhUMjMxIDY3MVQzMDAgNjgzUTM2MCA2ODMgMzk4IDY0OFQ0MzcgNTUxWk0yNjYgNDIyUTMyMCA0MjIgMzU0IDQ1NlQzODkgNTQ4UTM4OSA1OTMgMzY1IDYxN1QyOTcgNjQxUTI0MCA2NDEgMjA3IDYwOFQxNzMgNTE3UTE3MyA0NzIgMTk3IDQ0N1QyNjYgNDIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjE7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNDEzIDMyM0wzOTAgMTU3SDI2OUwyOTIgMzIzSDkwTDEwNiA0NDBIMzA4TDMzNCA2MjNINDU1TDQyOSA0NDBINjI5TDYxMyAzMjNINDEzWk00NSAwTDYwIDExMkg1ODNMNTY4IDBINDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMjsiIGhvcml6LWFkdi14PSIzMjYiIGQ9Ik04OSAzNjZMODYgNDM5UTEyOSA0NjcgMTY0IDQ4OFQyMjUgNTI2VDI2NSA1NjBUMjgwIDU5NlEyODAgNjA4IDI3MiA2MTZUMjQ2IDYyNVEyMjEgNjI1IDIwMiA2MTdUMTYwIDU4N0wxMTggNjQzUTE1OCA2NzQgMTkyIDY4N1QyNjYgNzAwUTMxOCA3MDAgMzQ1IDY3OVQzNzMgNjE4UTM3MyA1ODQgMzU2IDU1N1QzMTMgNTA5VDI1NSA0NzBUMTkzIDQzOEgzNTNMMzQzIDM2Nkg4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIzOyIgaG9yaXotYWR2LXg9IjMxOSIgZD0iTTM1MSA0NzhRMzUxIDQ0NiAzMzkgNDI0VDMwNyAzODdUMjYwIDM2N1QyMDMgMzYxUTE2OCAzNjEgMTM2IDM3MFQ3NiA0MDRMMTIyIDQ2NFExNDQgNDQ0IDE2NCA0MzdUMjA1IDQyOVEyMTUgNDI5IDIyNSA0MzFUMjQ1IDQzOVQyNTkgNDU0VDI2NSA0NzVRMjY1IDQ5MSAyNTQgNDk2VDIyNSA1MDJIMTcyTDE4MCA1NjJIMjE0UTIzNyA1NjIgMjU0IDU3MlQyNzIgNjAyUTI3MiA2MTMgMjY0IDYyMVQyMzcgNjMwUTIxNCA2MzAgMTkxIDYyMVQxNDggNTk1TDExNSA2NTRRMTUzIDY4MCAxODUgNjkwVDI1NyA3MDBRMzA1IDcwMCAzMzMgNjgxVDM2MSA2MjFRMzYxIDU5MiAzNDkgNTc1VDMxMCA1NDNWNTM5UTM1MSA1MjcgMzUxIDQ3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTIwOSA1NjVMMTMxIDYxMEwyODkgNzQyTDQyMSA2ODNMMjA5IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI1OyIgaG9yaXotYWR2LXg9IjYwNCIgZD0iTTQwNSAwTDQwMyA1OEgzOThRMzg0IDQxIDM3MiAyOFQzNDUgNlQzMTIgLTdUMjY3IC0xMlEyNjIgLTEyIDI1MiAtMTFUMjMxIC03VDIxMSAzVDE5NiAyMUwxNjMgLTIyMEgzOEwxMzkgNTAySDI4MUwyNDQgMjM5UTI0MSAyMTkgMjM5IDIwM1QyMzcgMTcxUTIzNyAxNDEgMjUxIDEyNFQzMDggMTA2UTMzNiAxMDYgMzU1IDExM1QzODYgMTMyVDQwNCAxNjRUNDE0IDIwN0w0NTUgNTAySDU5N0w1MjcgMEg0MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGhvcml6LWFkdi14PSI1MzYiIGQ9Ik0zMzMgMFEyODIgMCAyMzUgMTFUMTUyIDQ4VDk0IDExNFQ3MiAyMTJRNzIgMjgyIDk5IDMzNlQxNzIgNDI3VDI3NyA0ODNUNDAzIDUwMkg1MzFMNDYxIDBIMzMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjc7IiBob3Jpei1hZHYteD0iMjU5IiBkPSJNMjU1IDI0OVEyNTUgMjMwIDI0NSAyMTVUMjIwIDE5MFQxODYgMTc1VDE1MSAxNzBRMTM3IDE3MCAxMjIgMTczVDk1IDE4NVQ3NiAyMDRUNjggMjMzUTY4IDI1MiA3NyAyNjdUMTAyIDI5MlQxMzUgMzA4VDE3MSAzMTNRMTg1IDMxMyAyMDAgMzA5VDIyNyAyOThUMjQ3IDI3OFQyNTUgMjQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjg7IiBob3Jpei1hZHYteD0iMzQ4IiBkPSJNMjY2IC0xMDhRMjY2IC0xMzUgMjU3IC0xNTRUMjMxIC0xODdUMTkyIC0yMDZUMTQ2IC0yMTNRMTIzIC0yMTMgOTkgLTIwNlQ1NSAtMTg4TDc4IC0xNDBROTQgLTE0OCAxMDggLTE1M1QxNDEgLTE1OVExNjEgLTE1OSAxNzcgLTE1MVQxOTMgLTEyMFExOTMgLTEwMyAxODEgLTk4VDE1NSAtOTJRMTMwIC05MiAxMTMgLTEwMEw4OCAtODZMMTQzIDBIMjA3TDE3MCAtNTNRMTg4IC00NyAyMDQgLTQ3UTIzMCAtNDcgMjQ4IC02MlQyNjYgLTEwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI5OyIgaG9yaXotYWR2LXg9IjMwMSIgZD0iTTE3MiA0MzhMMTk1IDYwMkgxOTFMMTIzIDU3M0wxMDUgNjM5TDIyOCA2OTRIMjk5TDI2MyA0MzhIMzQwTDMzMCAzNjdIODFMOTEgNDM4SDE3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJBOyIgaG9yaXotYWR2LXg9IjQxNSIgZD0iTTQzOSA1NjFRNDM5IDUxOSA0MjcgNDg1VDM5MiA0MjVUMzM2IDM4NVQyNTkgMzcxUTE5NyAzNzEgMTYxIDQwMVQxMjQgNDk2UTEyNCA1MzggMTM2IDU3MlQxNzAgNjMyVDIyNiA2NzJUMzAzIDY4NlEzNjUgNjg2IDQwMiA2NTZUNDM5IDU2MVpNMjY5IDQzOVEyOTQgNDM5IDMxMCA0NDlUMzM1IDQ3N1QzNDcgNTE1VDM1MSA1NTdRMzUxIDU4OCAzMzcgNjAxVDI5MyA2MTVRMjY4IDYxNSAyNTIgNjA1VDIyNyA1NzhUMjE1IDU0MFQyMTEgNDk4UTIxMSA0MzkgMjY5IDQzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJCOyIgaG9yaXotYWR2LXg9IjQ5OSIgZD0iTTM2NCA4NUwyNzYgMTMzTDQwNyAyOTlMMzIyIDQ2N0w0MjUgNTE0TDUyNyAzMDBMMzY0IDg1Wk0xNDMgOTdMNTUgMTQ0TDE3OCAyOTlMOTggNDU1TDIwMCA1MDJMMjk3IDMwMEwxNDMgOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGhvcml6LWFkdi14PSI3OTgiIGQ9Ik0yMDkgNDM4TDIzMiA2MDJIMjI4TDE2MCA1NzNMMTQyIDYzOUwyNjUgNjk0SDMzNkwzMDAgNDM4SDM3N0wzNjcgMzY3SDExOEwxMjggNDM4SDIwOVpNMjE0IDBIMTM4TDc1NiA3MDBIODMyTDIxNCAwWk03MjcgNjJMNzE5IDBINjI5TDYzNyA2Mkg1MDFMNDkwIDEyNkw2NzUgMzI3SDc2NEw3MzcgMTM0SDc4OEw3NzggNjJINzI3Wk01NjkgMTI3SDY1MEw2NjcgMjQ0TDU2OSAxMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRDsiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0yMDcgNDM4TDIzMCA2MDJIMjI2TDE1OCA1NzNMMTQwIDYzOUwyNjMgNjk0SDMzNEwyOTggNDM4SDM3NUwzNjUgMzY3SDExNkwxMjYgNDM4SDIwN1pNMTgyIDBIMTA2TDcyNCA3MDBIODAwTDE4MiAwWk00ODUgLTFMNDgyIDcyUTUyNSAxMDAgNTYwIDEyMVQ2MjEgMTU5VDY2MSAxOTNUNjc2IDIyOVE2NzYgMjQxIDY2OCAyNDlUNjQyIDI1OFE2MTcgMjU4IDU5OCAyNTBUNTU2IDIyMEw1MTQgMjc2UTU1NCAzMDcgNTg4IDMyMFQ2NjIgMzMzUTcxNCAzMzMgNzQxIDMxMlQ3NjkgMjUxUTc2OSAyMTcgNzUyIDE5MFQ3MDkgMTQyVDY1MSAxMDNUNTg5IDcxSDc0OUw3MzkgLTFINDg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBob3Jpei1hZHYteD0iNzUyIiBkPSJNMzg5IDQ3OFEzODkgNDQ2IDM3NyA0MjRUMzQ1IDM4N1QyOTggMzY3VDI0MSAzNjFRMjA2IDM2MSAxNzQgMzcwVDExNCA0MDRMMTYwIDQ2NFExODIgNDQ0IDIwMiA0MzdUMjQzIDQyOVEyNTMgNDI5IDI2MyA0MzFUMjgzIDQzOVQyOTcgNDU0VDMwMyA0NzVRMzAzIDQ5MSAyOTIgNDk2VDI2MyA1MDJIMjEwTDIxOCA1NjJIMjUyUTI3NSA1NjIgMjkyIDU3MlQzMTAgNjAyUTMxMCA2MTMgMzAyIDYyMVQyNzUgNjMwUTI1MiA2MzAgMjI5IDYyMVQxODYgNTk1TDE1MyA2NTRRMTkxIDY4MCAyMjMgNjkwVDI5NSA3MDBRMzQzIDcwMCAzNzEgNjgxVDM5OSA2MjFRMzk5IDU5MiAzODcgNTc1VDM0OCA1NDNWNTM5UTM4OSA1MjcgMzg5IDQ3OFpNMTk2IDBIMTIwTDczOCA3MDBIODE0TDE5NiAwWk02OTAgNjJMNjgyIDBINTkyTDYwMCA2Mkg0NjRMNDUzIDEyNkw2MzggMzI3SDcyN0w3MDAgMTM0SDc1MUw3NDEgNjJINjkwWk01MzIgMTI3SDYxM0w2MzAgMjQ0TDUzMiAxMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRjsiIGQ9Ik04MiAtMTZRODIgMzMgOTYgNjdUMTM1IDEyN1QxOTUgMTcxVDI3MiAyMDhRMjg0IDIxMyAyOTEgMjE3VDMwMyAyMjhUMzA5IDI0M1QzMTQgMjY4TDMyMCAzMDhINDU2TDQ0NiAyMzdRNDQzIDIxNCA0MzggMTk5VDQyMyAxNzJUNDAwIDE1MlQzNjUgMTM0UTM0MyAxMjQgMzE4IDExNVQyNzIgOTFUMjM2IDU4VDIyMSA5UTIyMSAtMTEgMjI5IC0yM1QyNTIgLTQ0VDI4MiAtNTVUMzE2IC01OFE0MDMgLTU4IDQ3NCAtMUw1MjcgLTEwMlE0OTYgLTEyMSA0NjggLTEzNVQ0MTAgLTE1OFQzNDggLTE3MVQyODAgLTE3NlEyNDAgLTE3NiAyMDQgLTE2OFQxNDEgLTE0MFQ5OCAtOTFUODIgLTE2Wk0zMTcgNDM0UTMxNyA0NTMgMzI3IDQ2OFQzNTIgNDk0VDM4NSA1MDlUNDIwIDUxNVE0MzQgNTE1IDQ0OSA1MTJUNDc2IDUwMFQ0OTUgNDgwVDUwMyA0NTJRNTAzIDQzMyA0OTQgNDE4VDQ2OSAzOTNUNDM2IDM3OFQ0MDEgMzcyUTM4NyAzNzIgMzcyIDM3NVQzNDUgMzg2VDMyNSA0MDZUMzE3IDQzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMwOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMyAwTDQ5OSAxNDBIMjM2TDE2MyAwSDEyTDM2MyA2NzBINTE5TDY4OSAwSDUzM1pNNDIxIDUyNUg0MTdMMjg3IDI1OEg0NzlMNDIxIDUyNVpNNDQ0IDcwNUwyNjQgODIzTDQxNCA4ODFMNTM0IDc1MEw0NDQgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzE7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMzIDBMNDk5IDE0MEgyMzZMMTYzIDBIMTJMMzYzIDY3MEg1MTlMNjg5IDBINTMzWk00MjEgNTI1SDQxN0wyODcgMjU4SDQ3OUw0MjEgNTI1Wk00NDQgNzA1TDM2NiA3NTBMNTI0IDg4Mkw2NTYgODIzTDQ0NCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMjsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzMgMEw0OTkgMTQwSDIzNkwxNjMgMEgxMkwzNjMgNjcwSDUxOUw2ODkgMEg1MzNaTTQyMSA1MjVINDE3TDI4NyAyNThINDc5TDQyMSA1MjVaTTU2OCA3MDFMNDU0IDc3NUwzMTYgNzAxTDI3MSA3ODBMNDY2IDg3OEw2MzYgNzgwTDU2OCA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMzsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzMgMEw0OTkgMTQwSDIzNkwxNjMgMEgxMkwzNjMgNjcwSDUxOUw2ODkgMEg1MzNaTTQyMSA1MjVINDE3TDI4NyAyNThINDc5TDQyMSA1MjVaTTY0NiA3OTVRNjI1IDc1MCA1OTAgNzI5VDUyMCA3MDdRNDk3IDcwNyA0ODAgNzEzVDQ0NyA3MjhUNDE4IDc0M1QzODkgNzUwUTM3MiA3NTAgMzU0IDc0MVQzMjIgNzA2TDI2NCA3NTlRMjkzIDgwOSAzMjMgODI3VDM4OSA4NDZRNDEwIDg0NiA0MjcgODM5VDQ2MCA4MjRUNDkwIDgwOVQ1MjEgODAyUTUzOCA4MDIgNTU1IDgxMVQ1ODYgODQ2TDY0NiA3OTVINjQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzQ7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMzIDBMNDk5IDE0MEgyMzZMMTYzIDBIMTJMMzYzIDY3MEg1MTlMNjg5IDBINTMzWk00MjEgNTI1SDQxN0wyODcgMjU4SDQ3OUw0MjEgNTI1Wk02MzYgNzg5UTYzNiA3NzMgNjMwIDc1OVQ2MTIgNzMzVDU4NyA3MTZUNTU2IDcwOVE1MzAgNzA5IDUxMyA3MjZUNDk1IDc3MFE0OTUgNzg2IDUwMiA4MDBUNTIwIDgyNFQ1NDYgODQxVDU3NiA4NDhRNjAxIDg0OCA2MTggODMyVDYzNiA3ODlaTTQxMyA3ODlRNDEzIDc3MyA0MDcgNzU5VDM4OSA3MzNUMzY0IDcxNlQzMzMgNzA5UTMwNyA3MDkgMjkwIDcyNlQyNzMgNzY5UTI3MyA3ODUgMjc5IDc5OVQyOTcgODI0VDMyMyA4NDFUMzUzIDg0OFEzNzggODQ4IDM5NSA4MzJUNDEzIDc4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM1OyIgaG9yaXotYWR2LXg9IjcwMCIgZD0iTTU5NyA3MzdRNTk3IDcwMCA1ODAgNjY4VDUzMyA2MTRMNjg5IDBINTMzTDQ5OSAxNDBIMjM2TDE2MyAwSDEyTDMzMyA2MTNRMzE0IDYyOSAzMDUgNjUzVDI5NiA3MDNRMjk2IDczNyAzMDkgNzY2VDM0NCA4MTVUMzk3IDg0NlQ0NjAgODU4UTQ4NyA4NTggNTEyIDg1MVQ1NTUgODI4VDU4NSA3OTBUNTk3IDczN1pNNDIxIDUyNkg0MTdMMjg3IDI1OEg0NzlMNDIxIDUyNlpNNDQwIDY1MFE0NzMgNjUwIDQ5MyA2NzJUNTEzIDczMFE1MTMgNzU3IDQ5NiA3NzFUNDU0IDc4NlE0MTkgNzg2IDM5OSA3NjVUMzc5IDcwOFEzNzkgNjgyIDM5NiA2NjZUNDQwIDY1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM2OyIgaG9yaXotYWR2LXg9IjkzOSIgZD0iTTQ1NCAwTDQ3NSAxNTFIMjU1TDE2NSAwSDE0TDQ0OCA2NjdIOTg1TDk2OSA1NDhINjc0TDY1NCA0MDZIOTIwTDkwMiAyODNINjM2TDYxMyAxMTlIOTE4TDkwMiAwSDQ1NFpNNTMwIDU0N0g1MDdMMzI4IDI3M0g0OTJMNTMwIDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM3OyIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTQ2MiAtMTEwUTQ2MiAtMTM3IDQ1MyAtMTU2VDQyNyAtMTg5VDM4OCAtMjA4VDM0MiAtMjE1UTMxOSAtMjE1IDI5NSAtMjA4VDI1MSAtMTkwTDI3NCAtMTQyUTI5MCAtMTUwIDMwNCAtMTU1VDMzNyAtMTYxUTM1NyAtMTYxIDM3MyAtMTUzVDM4OSAtMTIyUTM4OSAtMTA1IDM3NyAtMTAwVDM1MSAtOTRRMzI2IC05NCAzMDkgLTEwMkwyODQgLTg4TDMzNCAtOVEyMjIgMiAxNjAgNjhUOTcgMjYxUTk3IDM0NyAxMjIgNDIzVDE5NSA1NTVUMzE0IDY0NVQ0NzYgNjc4UTU1MSA2NzggNjA5IDY1MVQ3MTUgNTY3TDYxMyA0NzRRNTg0IDUxMiA1NDkgNTMzVDQ2NSA1NTVRNDA1IDU1NSAzNjQgNTMxVDI5OCA0NjdUMjYxIDM3N1QyNTAgMjc0UTI1MCAxOTggMjg1IDE1NFQ0MDEgMTEwUTQ1NSAxMTAgNTAxIDEzNFQ1ODggMTkzTDY1MyA5NlE1OTYgNDggNTM0IDIwVDM5NyAtMTFMMzY2IC01NVEzODQgLTQ5IDQwMCAtNDlRNDI2IC00OSA0NDQgLTY0VDQ2MiAtMTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzg7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMEwxNjYgNjY3SDYyMUw2MDQgNTQ1SDI5NUwyNzUgNDA0SDU1NUw1MzggMjgwSDI1OEwyMzUgMTE5SDU1NEw1MzggMEg3M1pNNDMwIDcwNUwyNTAgODIzTDQwMCA4ODFMNTIwIDc1MEw0MzAgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzk7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMEwxNjYgNjY3SDYyMUw2MDQgNTQ1SDI5NUwyNzUgNDA0SDU1NUw1MzggMjgwSDI1OEwyMzUgMTE5SDU1NEw1MzggMEg3M1pNMzk1IDcwNUwzMTcgNzUwTDQ3NSA4ODJMNjA3IDgyM0wzOTUgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0E7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMEwxNjYgNjY3SDYyMUw2MDQgNTQ1SDI5NUwyNzUgNDA0SDU1NUw1MzggMjgwSDI1OEwyMzUgMTE5SDU1NEw1MzggMEg3M1pNNTIyIDcwMUw0MDggNzc1TDI3MCA3MDFMMjI1IDc4MEw0MjAgODc4TDU5MCA3ODBMNTIyIDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTczIDBMMTY2IDY2N0g2MjFMNjA0IDU0NUgyOTVMMjc1IDQwNEg1NTVMNTM4IDI4MEgyNThMMjM1IDExOUg1NTRMNTM4IDBINzNaTTU5MCA3ODlRNTkwIDc3MyA1ODQgNzU5VDU2NiA3MzNUNTQxIDcxNlQ1MTAgNzA5UTQ4NCA3MDkgNDY3IDcyNlQ0NDkgNzcwUTQ0OSA3ODYgNDU2IDgwMFQ0NzQgODI0VDUwMCA4NDFUNTMwIDg0OFE1NTUgODQ4IDU3MiA4MzJUNTkwIDc4OVpNMzY3IDc4OVEzNjcgNzczIDM2MSA3NTlUMzQzIDczM1QzMTggNzE2VDI4NyA3MDlRMjYxIDcwOSAyNDQgNzI2VDIyNyA3NjlRMjI3IDc4NSAyMzMgNzk5VDI1MSA4MjRUMjc3IDg0MVQzMDcgODQ4UTMzMiA4NDggMzQ5IDgzMlQzNjcgNzg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0M7IiBob3Jpei1hZHYteD0iMjkyIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMTkgMEg3M1pNMjQ0IDcwNUw2NCA4MjNMMjE0IDg4MUwzMzQgNzUwTDI0NCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRDsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwTDE2NiA2NjdIMzEyTDIxOSAwSDczWk0yNDggNzA1TDE3MCA3NTBMMzI4IDg4Mkw0NjAgODIzTDI0OCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRTsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwTDE2NiA2NjdIMzEyTDIxOSAwSDczWk0zNzYgNzAxTDI2MiA3NzVMMTI0IDcwMUw3OSA3ODBMMjc0IDg3OEw0NDQgNzgwTDM3NiA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRjsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwTDE2NiA2NjdIMzEyTDIxOSAwSDczWk00MzggNzg5UTQzOCA3NzMgNDMyIDc1OVQ0MTQgNzMzVDM4OSA3MTZUMzU4IDcwOVEzMzIgNzA5IDMxNSA3MjZUMjk3IDc3MFEyOTcgNzg2IDMwNCA4MDBUMzIyIDgyNFQzNDggODQxVDM3OCA4NDhRNDAzIDg0OCA0MjAgODMyVDQzOCA3ODlaTTIxNSA3ODlRMjE1IDc3MyAyMDkgNzU5VDE5MSA3MzNUMTY2IDcxNlQxMzUgNzA5UTEwOSA3MDkgOTIgNzI2VDc1IDc2OVE3NSA3ODUgODEgNzk5VDk5IDgyNFQxMjUgODQxVDE1NSA4NDhRMTgwIDg0OCAxOTcgODMyVDIxNSA3ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMDsiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik03MDAgNDA3UTcwMCAzMTAgNjcyIDIzNVQ1OTIgMTA3VDQ2NCAyOFQyOTIgMEg3NUwxMTUgMjg5SDQ1TDYyIDQwOEgxMzJMMTY4IDY2MlEyMjYgNjY3IDI4MyA2NzBUMzk5IDY3NFE0NjUgNjc0IDUyMCA2NTlUNjE1IDYxMVQ2NzcgNTI4VDcwMCA0MDdaTTMwNyAxMTZRMzY3IDExNiA0MDggMTMwVDQ3OCAxNzFUNTIyIDI0MVQ1NDYgMzQwUTU0OCAzNTUgNTQ5IDM3MFQ1NTEgNDAwUTU1MSA1NjAgMzg4IDU2MFEzNjUgNTYwIDM0MyA1NTlUMjk3IDU1NkwyNzYgNDA4SDQzMEw0MTMgMjg5SDI1OUwyMzUgMTE3UTI1MyAxMTYgMjcxIDExNlQzMDcgMTE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDE7IiBob3Jpei1hZHYteD0iNzMxIiBkPSJNNTMyIDBMMjc4IDQyNUgyNzRMMjE1IDBINzNMMTY2IDY2N0gzMDFMNTQ2IDI0OUg1NTFMNjEwIDY2N0g3NTFMNjU4IDBINTMyWk02NjQgNzk1UTY0MyA3NTAgNjA4IDcyOVQ1MzggNzA3UTUxNSA3MDcgNDk4IDcxM1Q0NjUgNzI4VDQzNiA3NDNUNDA3IDc1MFEzOTAgNzUwIDM3MiA3NDFUMzQwIDcwNkwyODIgNzU5UTMxMSA4MDkgMzQxIDgyN1Q0MDcgODQ2UTQyOCA4NDYgNDQ1IDgzOVQ0NzggODI0VDUwOCA4MDlUNTM5IDgwMlE1NTYgODAyIDU3MyA4MTFUNjA0IDg0Nkw2NjQgNzk1SDY2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQyOyIgaG9yaXotYWR2LXg9Ijc3MiIgZD0iTTc2OCA0MTFRNzY4IDMyMSA3NDQgMjQ0VDY3MSAxMTBUNTUwIDIyVDM4NCAtMTBRMzE4IC0xMCAyNjUgNlQxNzQgNTVUMTE2IDEzOVQ5NiAyNTlROTYgMzQ5IDEyMSA0MjVUMTk1IDU1OFQzMTYgNjQ2VDQ4MSA2NzhRNTQ3IDY3OCA2MDAgNjYyVDY5MCA2MTNUNzQ4IDUzMFQ3NjggNDExWk00MDEgMTA4UTQ1NiAxMDggNDkzIDEyNVQ1NTMgMTcyVDU5MCAyNDRUNjEwIDMzNFE2MTYgMzcwIDYxNiA0MDdRNjE2IDQ4NSA1ODAgNTIyVDQ2NCA1NjBRNDA5IDU2MCAzNzIgNTQzVDMxMSA0OTZUMjc0IDQyNVQyNTQgMzM0UTI0OCAyOTggMjQ4IDI2M1EyNDggMTg0IDI4NCAxNDZUNDAxIDEwOFpNNTIyIDcwOUwzNDIgODI3TDQ5MiA4ODVMNjEyIDc1NEw1MjIgNzA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDM7IiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzY4IDQxMVE3NjggMzIxIDc0NCAyNDRUNjcxIDExMFQ1NTAgMjJUMzg0IC0xMFEzMTggLTEwIDI2NSA2VDE3NCA1NVQxMTYgMTM5VDk2IDI1OVE5NiAzNDkgMTIxIDQyNVQxOTUgNTU4VDMxNiA2NDZUNDgxIDY3OFE1NDcgNjc4IDYwMCA2NjJUNjkwIDYxM1Q3NDggNTMwVDc2OCA0MTFaTTQwMSAxMDhRNDU2IDEwOCA0OTMgMTI1VDU1MyAxNzJUNTkwIDI0NFQ2MTAgMzM0UTYxNiAzNzAgNjE2IDQwN1E2MTYgNDg1IDU4MCA1MjJUNDY0IDU2MFE0MDkgNTYwIDM3MiA1NDNUMzExIDQ5NlQyNzQgNDI1VDI1NCAzMzRRMjQ4IDI5OCAyNDggMjYzUTI0OCAxODQgMjg0IDE0NlQ0MDEgMTA4Wk00ODUgNzA5TDQwNyA3NTRMNTY1IDg4Nkw2OTcgODI3TDQ4NSA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENDsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03NjggNDExUTc2OCAzMjEgNzQ0IDI0NFQ2NzEgMTEwVDU1MCAyMlQzODQgLTEwUTMxOCAtMTAgMjY1IDZUMTc0IDU1VDExNiAxMzlUOTYgMjU5UTk2IDM0OSAxMjEgNDI1VDE5NSA1NThUMzE2IDY0NlQ0ODEgNjc4UTU0NyA2NzggNjAwIDY2MlQ2OTAgNjEzVDc0OCA1MzBUNzY4IDQxMVpNNDAxIDEwOFE0NTYgMTA4IDQ5MyAxMjVUNTUzIDE3MlQ1OTAgMjQ0VDYxMCAzMzRRNjE2IDM3MCA2MTYgNDA3UTYxNiA0ODUgNTgwIDUyMlQ0NjQgNTYwUTQwOSA1NjAgMzcyIDU0M1QzMTEgNDk2VDI3NCA0MjVUMjU0IDMzNFEyNDggMjk4IDI0OCAyNjNRMjQ4IDE4NCAyODQgMTQ2VDQwMSAxMDhaTTYxNSA3MDFMNTAxIDc3NUwzNjMgNzAxTDMxOCA3ODBMNTEzIDg3OEw2ODMgNzgwTDYxNSA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENTsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03NjggNDExUTc2OCAzMjEgNzQ0IDI0NFQ2NzEgMTEwVDU1MCAyMlQzODQgLTEwUTMxOCAtMTAgMjY1IDZUMTc0IDU1VDExNiAxMzlUOTYgMjU5UTk2IDM0OSAxMjEgNDI1VDE5NSA1NThUMzE2IDY0NlQ0ODEgNjc4UTU0NyA2NzggNjAwIDY2MlQ2OTAgNjEzVDc0OCA1MzBUNzY4IDQxMVpNNDAxIDEwOFE0NTYgMTA4IDQ5MyAxMjVUNTUzIDE3MlQ1OTAgMjQ0VDYxMCAzMzRRNjE2IDM3MCA2MTYgNDA3UTYxNiA0ODUgNTgwIDUyMlQ0NjQgNTYwUTQwOSA1NjAgMzcyIDU0M1QzMTEgNDk2VDI3NCA0MjVUMjU0IDMzNFEyNDggMjk4IDI0OCAyNjNRMjQ4IDE4NCAyODQgMTQ2VDQwMSAxMDhaTTY4MSA3OTlRNjYwIDc1NCA2MjUgNzMzVDU1NSA3MTFRNTMyIDcxMSA1MTUgNzE3VDQ4MiA3MzJUNDUzIDc0N1Q0MjQgNzU0UTQwNyA3NTQgMzg5IDc0NVQzNTcgNzEwTDI5OSA3NjNRMzI4IDgxMyAzNTggODMxVDQyNCA4NTBRNDQ1IDg1MCA0NjIgODQzVDQ5NSA4MjhUNTI1IDgxM1Q1NTYgODA2UTU3MyA4MDYgNTkwIDgxNVQ2MjEgODUwTDY4MSA3OTlINjgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDY7IiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzY4IDQxMVE3NjggMzIxIDc0NCAyNDRUNjcxIDExMFQ1NTAgMjJUMzg0IC0xMFEzMTggLTEwIDI2NSA2VDE3NCA1NVQxMTYgMTM5VDk2IDI1OVE5NiAzNDkgMTIxIDQyNVQxOTUgNTU4VDMxNiA2NDZUNDgxIDY3OFE1NDcgNjc4IDYwMCA2NjJUNjkwIDYxM1Q3NDggNTMwVDc2OCA0MTFaTTQwMSAxMDhRNDU2IDEwOCA0OTMgMTI1VDU1MyAxNzJUNTkwIDI0NFQ2MTAgMzM0UTYxNiAzNzAgNjE2IDQwN1E2MTYgNDg1IDU4MCA1MjJUNDY0IDU2MFE0MDkgNTYwIDM3MiA1NDNUMzExIDQ5NlQyNzQgNDI1VDI1NCAzMzRRMjQ4IDI5OCAyNDggMjYzUTI0OCAxODQgMjg0IDE0NlQ0MDEgMTA4Wk02NzggNzg5UTY3OCA3NzMgNjcyIDc1OVQ2NTQgNzMzVDYyOSA3MTZUNTk4IDcwOVE1NzIgNzA5IDU1NSA3MjZUNTM3IDc3MFE1MzcgNzg2IDU0NCA4MDBUNTYyIDgyNFQ1ODggODQxVDYxOCA4NDhRNjQzIDg0OCA2NjAgODMyVDY3OCA3ODlaTTQ1NSA3ODlRNDU1IDc3MyA0NDkgNzU5VDQzMSA3MzNUNDA2IDcxNlQzNzUgNzA5UTM0OSA3MDkgMzMyIDcyNlQzMTUgNzY5UTMxNSA3ODUgMzIxIDc5OVQzMzkgODI0VDM2NSA4NDFUMzk1IDg0OFE0MjAgODQ4IDQzNyA4MzJUNDU1IDc4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ3OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTYxMSA0MzBMNDI2IDI2OUw1NjYgMTA2TDQ3MyAyM0wzMzMgMTg2TDE0NiAyM0w3NCAxMDZMMjYxIDI2OUwxMjIgNDMwTDIxNyA1MTNMMzU2IDM1MUw1NDEgNTEzTDYxMSA0MzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEODsiIGhvcml6LWFkdi14PSI3NzIiIGQ9Ik03NjggNDExUTc2OCAzMjEgNzQ0IDI0NFQ2NzEgMTEwVDU1MCAyMlQzODQgLTEwUTMyNyAtMTAgMjgwIDFUMTk2IDM4TDEyNyAtMjZMNjQgNTlMMTI2IDExN1E5NiAxNzQgOTYgMjU5UTk2IDM0OSAxMjEgNDI1VDE5NSA1NThUMzE2IDY0NlQ0ODEgNjc4UTU0MSA2NzggNTkwIDY2NVQ2NzcgNjIzTDc0OSA2OTBMODE5IDYxMkw3NDMgNTQxUTc2OCA0ODUgNzY4IDQxMVpNMjQ4IDI2M1EyNDggMjU0IDI0OCAyNDZUMjQ5IDIzMEw1NzMgNTI4UTUzNSA1NjAgNDY0IDU2MFE0MDkgNTYwIDM3MiA1NDNUMzExIDQ5NlQyNzQgNDI1VDI1NCAzMzRRMjQ4IDI5OCAyNDggMjYzWk00MDEgMTA4UTQ1NiAxMDggNDkzIDEyNVQ1NTMgMTcyVDU5MCAyNDRUNjEwIDMzNFE2MTYgMzcwIDYxNiA0MDdRNjE2IDQxMiA2MTYgNDE1VDYxNSA0MjRMMzAwIDEzM1EzMzUgMTA4IDQwMSAxMDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02NjUgMjY4UTY1NiAyMDIgNjM0IDE1MFQ1NzQgNjJUNDgxIDhUMzQ4IC0xMVEyODIgLTExIDIzNiAzVDE2MSA0M1QxMTggMTA4VDEwNSAxOTdRMTA1IDIxNCAxMDYgMjMxVDExMCAyNjhMMTY2IDY2N0gzMTJMMjU5IDI5MFEyNTMgMjUxIDI1MyAyMTdRMjUzIDE5MyAyNTggMTc0VDI3NSAxNDFUMzA5IDEyMFQzNjUgMTEyUTQxMSAxMTIgNDM5IDEyNVQ0ODQgMTYzVDUwOSAyMTlUNTIyIDI5MEw1NzUgNjY3SDcyMUw2NjUgMjY4SDY2NVpNNDQ3IDcwNUwyNjcgODIzTDQxNyA4ODFMNTM3IDc1MEw0NDcgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REE7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjY1IDI2OFE2NTYgMjAyIDYzNCAxNTBUNTc0IDYyVDQ4MSA4VDM0OCAtMTFRMjgyIC0xMSAyMzYgM1QxNjEgNDNUMTE4IDEwOFQxMDUgMTk3UTEwNSAyMTQgMTA2IDIzMVQxMTAgMjY4TDE2NiA2NjdIMzEyTDI1OSAyOTBRMjUzIDI1MSAyNTMgMjE3UTI1MyAxOTMgMjU4IDE3NFQyNzUgMTQxVDMwOSAxMjBUMzY1IDExMlE0MTEgMTEyIDQzOSAxMjVUNDg0IDE2M1Q1MDkgMjE5VDUyMiAyOTBMNTc1IDY2N0g3MjFMNjY1IDI2OEg2NjVaTTQ0NyA3MDVMMzY5IDc1MEw1MjcgODgyTDY1OSA4MjNMNDQ3IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERCOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTY2NSAyNjhRNjU2IDIwMiA2MzQgMTUwVDU3NCA2MlQ0ODEgOFQzNDggLTExUTI4MiAtMTEgMjM2IDNUMTYxIDQzVDExOCAxMDhUMTA1IDE5N1ExMDUgMjE0IDEwNiAyMzFUMTEwIDI2OEwxNjYgNjY3SDMxMkwyNTkgMjkwUTI1MyAyNTEgMjUzIDIxN1EyNTMgMTkzIDI1OCAxNzRUMjc1IDE0MVQzMDkgMTIwVDM2NSAxMTJRNDExIDExMiA0MzkgMTI1VDQ4NCAxNjNUNTA5IDIxOVQ1MjIgMjkwTDU3NSA2NjdINzIxTDY2NSAyNjhINjY1Wk01NzQgNzAxTDQ2MCA3NzVMMzIyIDcwMUwyNzcgNzgwTDQ3MiA4NzhMNjQyIDc4MEw1NzQgNzAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REM7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjY1IDI2OFE2NTYgMjAyIDYzNCAxNTBUNTc0IDYyVDQ4MSA4VDM0OCAtMTFRMjgyIC0xMSAyMzYgM1QxNjEgNDNUMTE4IDEwOFQxMDUgMTk3UTEwNSAyMTQgMTA2IDIzMVQxMTAgMjY4TDE2NiA2NjdIMzEyTDI1OSAyOTBRMjUzIDI1MSAyNTMgMjE3UTI1MyAxOTMgMjU4IDE3NFQyNzUgMTQxVDMwOSAxMjBUMzY1IDExMlE0MTEgMTEyIDQzOSAxMjVUNDg0IDE2M1Q1MDkgMjE5VDUyMiAyOTBMNTc1IDY2N0g3MjFMNjY1IDI2OEg2NjVaTTY0MCA3ODlRNjQwIDc3MyA2MzQgNzU5VDYxNiA3MzNUNTkxIDcxNlQ1NjAgNzA5UTUzNCA3MDkgNTE3IDcyNlQ0OTkgNzcwUTQ5OSA3ODYgNTA2IDgwMFQ1MjQgODI0VDU1MCA4NDFUNTgwIDg0OFE2MDUgODQ4IDYyMiA4MzJUNjQwIDc4OVpNNDE3IDc4OVE0MTcgNzczIDQxMSA3NTlUMzkzIDczM1QzNjggNzE2VDMzNyA3MDlRMzExIDcwOSAyOTQgNzI2VDI3NyA3NjlRMjc3IDc4NSAyODMgNzk5VDMwMSA4MjRUMzI3IDg0MVQzNTcgODQ4UTM4MiA4NDggMzk5IDgzMlQ0MTcgNzg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REQ7IiBob3Jpei1hZHYteD0iNjQ2IiBkPSJNNDMzIDI2MkwzOTcgMEgyNTFMMjg3IDI1OUw5NSA2NjdIMjYzTDM3OSAzOTBMNTc2IDY2N0g3MzdMNDMzIDI2MlpNNDQzIDY4OUwzNjUgNzM0TDUyMyA4NjZMNjU1IDgwN0w0NDMgNjg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REU7IiBob3Jpei1hZHYteD0iNjMyIiBkPSJNNjQwIDM3NlE2NDAgMzE3IDYyMiAyNzBUNTY4IDE4OFQ0ODQgMTM1VDM3MSAxMTZIMjMyTDIxNiAwSDczTDE2NiA2NjdIMzA4TDI5MiA1NTBRMzQxIDU1MyAzODUgNTUzUTQzNyA1NTMgNDgzIDU0NVQ1NjQgNTE3VDYxOSA0NjNUNjQwIDM3NlpNMzYyIDIzMFE0MjYgMjMwIDQ2MCAyNTlUNDk1IDM1OVE0OTUgNDAzIDQ2NiA0MjBUMzcwIDQzN1EzNDkgNDM3IDMyNyA0MzZUMjc2IDQzM0wyNDggMjMwSDM2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERGOyIgaG9yaXotYWR2LXg9IjU4OSIgZD0iTTU4MSAyMDBRNTgxIDE0NyA1NjIgMTA3VDUxMSA0MVQ0MzcgMVQzNDcgLTEzUTMwMCAtMTMgMjUwIDFMMjgyIDk5UTI5NCA5NiAzMDcgOTRUMzMzIDkyUTM4MiA5MiA0MDkgMTIxVDQzNyAyMDBRNDM3IDIyNiA0MjYgMjQ0VDM5OCAyNzZUMzU5IDI5N1QzMTUgMzEwTDMxMSAzOTNRMzMxIDQwNiAzNTMgNDIyVDM5MyA0NTdUNDIzIDQ5OVQ0MzUgNTQ4UTQzNSA1ODEgNDE1IDU5M1QzNjUgNjA2UTMyMSA2MDYgMzAxIDU4NVQyNzQgNTIyTDIwMSAwSDYzTDEzNiA1MjRRMTQzIDU3NyAxNjMgNjEyVDIxMyA2NjdUMjg1IDY5NlQzNzcgNzA1UTQxNCA3MDUgNDQ3IDY5OFQ1MDYgNjczVDU0NyA2MjlUNTYyIDU2MlE1NjIgNTA1IDUzMiA0NjJUNDU2IDM4N1YzODNRNTEwIDM1OSA1NDUgMzExVDU4MSAyMDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMDsiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik00MTEgMFY2N0g0MDdRMzc5IDI2IDMzOCA4VDI1MCAtMTFRMjAxIC0xMSAxNjggNVQxMTMgNDlUODMgMTE0VDczIDE5NFE3MyAyNDcgODYgMzAzVDEzMCA0MDZUMjA4IDQ4M1QzMjQgNTEzUTM3OCA1MTMgNDA3IDQ5N1Q0NTQgNDQ2SDQ1OEw0NzQgNTAySDU5N0w1MjcgMEg0MTFaTTQzMiAzMTZRNDM5IDM2NCA0MTUgMzg0VDM0NiA0MDVRMzA0IDQwNSAyNzkgMzg2VDIzOSAzMzZUMjIxIDI2OFQyMTYgMTk2UTIxNiAxNzUgMjIwIDE1NlQyMzMgMTIzVDI2MCAxMDFUMzA0IDkyUTM2MCA5MiAzODQgMTIzVDQxNiAyMDZMNDMyIDMxNlpNMzYyIDU2NUwxODIgNjgzTDMzMiA3NDFMNDUyIDYxMEwzNjIgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNDExIDBWNjdINDA3UTM3OSAyNiAzMzggOFQyNTAgLTExUTIwMSAtMTEgMTY4IDVUMTEzIDQ5VDgzIDExNFQ3MyAxOTRRNzMgMjQ3IDg2IDMwM1QxMzAgNDA2VDIwOCA0ODNUMzI0IDUxM1EzNzggNTEzIDQwNyA0OTdUNDU0IDQ0Nkg0NThMNDc0IDUwMkg1OTdMNTI3IDBINDExWk00MzIgMzE2UTQzOSAzNjQgNDE1IDM4NFQzNDYgNDA1UTMwNCA0MDUgMjc5IDM4NlQyMzkgMzM2VDIyMSAyNjhUMjE2IDE5NlEyMTYgMTc1IDIyMCAxNTZUMjMzIDEyM1QyNjAgMTAxVDMwNCA5MlEzNjAgOTIgMzg0IDEyM1Q0MTYgMjA2TDQzMiAzMTZaTTM0NCA1NjVMMjY2IDYxMEw0MjQgNzQyTDU1NiA2ODNMMzQ0IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTQxMSAwVjY3SDQwN1EzNzkgMjYgMzM4IDhUMjUwIC0xMVEyMDEgLTExIDE2OCA1VDExMyA0OVQ4MyAxMTRUNzMgMTk0UTczIDI0NyA4NiAzMDNUMTMwIDQwNlQyMDggNDgzVDMyNCA1MTNRMzc4IDUxMyA0MDcgNDk3VDQ1NCA0NDZINDU4TDQ3NCA1MDJINTk3TDUyNyAwSDQxMVpNNDMyIDMxNlE0MzkgMzY0IDQxNSAzODRUMzQ2IDQwNVEzMDQgNDA1IDI3OSAzODZUMjM5IDMzNlQyMjEgMjY4VDIxNiAxOTZRMjE2IDE3NSAyMjAgMTU2VDIzMyAxMjNUMjYwIDEwMVQzMDQgOTJRMzYwIDkyIDM4NCAxMjNUNDE2IDIwNkw0MzIgMzE2Wk00NzkgNTU5TDM2NSA2MzNMMjI3IDU1OUwxODIgNjM4TDM3NyA3MzZMNTQ3IDYzOEw0NzkgNTU5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTM7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNDExIDBWNjdINDA3UTM3OSAyNiAzMzggOFQyNTAgLTExUTIwMSAtMTEgMTY4IDVUMTEzIDQ5VDgzIDExNFQ3MyAxOTRRNzMgMjQ3IDg2IDMwM1QxMzAgNDA2VDIwOCA0ODNUMzI0IDUxM1EzNzggNTEzIDQwNyA0OTdUNDU0IDQ0Nkg0NThMNDc0IDUwMkg1OTdMNTI3IDBINDExWk00MzIgMzE2UTQzOSAzNjQgNDE1IDM4NFQzNDYgNDA1UTMwNCA0MDUgMjc5IDM4NlQyMzkgMzM2VDIyMSAyNjhUMjE2IDE5NlEyMTYgMTc1IDIyMCAxNTZUMjMzIDEyM1QyNjAgMTAxVDMwNCA5MlEzNjAgOTIgMzg0IDEyM1Q0MTYgMjA2TDQzMiAzMTZaTTU0OSA2NTVRNTI4IDYxMCA0OTMgNTg5VDQyMyA1NjdRNDAwIDU2NyAzODMgNTczVDM1MCA1ODhUMzIxIDYwM1QyOTIgNjEwUTI3NSA2MTAgMjU3IDYwMVQyMjUgNTY2TDE2NyA2MTlRMTk2IDY2OSAyMjYgNjg3VDI5MiA3MDZRMzEzIDcwNiAzMzAgNjk5VDM2MyA2ODRUMzkzIDY2OVQ0MjQgNjYyUTQ0MSA2NjIgNDU4IDY3MVQ0ODkgNzA2TDU0OSA2NTVINTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTQ7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNDExIDBWNjdINDA3UTM3OSAyNiAzMzggOFQyNTAgLTExUTIwMSAtMTEgMTY4IDVUMTEzIDQ5VDgzIDExNFQ3MyAxOTRRNzMgMjQ3IDg2IDMwM1QxMzAgNDA2VDIwOCA0ODNUMzI0IDUxM1EzNzggNTEzIDQwNyA0OTdUNDU0IDQ0Nkg0NThMNDc0IDUwMkg1OTdMNTI3IDBINDExWk00MzIgMzE2UTQzOSAzNjQgNDE1IDM4NFQzNDYgNDA1UTMwNCA0MDUgMjc5IDM4NlQyMzkgMzM2VDIyMSAyNjhUMjE2IDE5NlEyMTYgMTc1IDIyMCAxNTZUMjMzIDEyM1QyNjAgMTAxVDMwNCA5MlEzNjAgOTIgMzg0IDEyM1Q0MTYgMjA2TDQzMiAzMTZaTTU0NCA2NDlRNTQ0IDYzMyA1MzggNjE5VDUyMCA1OTNUNDk1IDU3NlQ0NjQgNTY5UTQzOCA1NjkgNDIxIDU4NlQ0MDMgNjMwUTQwMyA2NDYgNDEwIDY2MFQ0MjggNjg0VDQ1NCA3MDFUNDg0IDcwOFE1MDkgNzA4IDUyNiA2OTJUNTQ0IDY0OVpNMzIxIDY0OVEzMjEgNjMzIDMxNSA2MTlUMjk3IDU5M1QyNzIgNTc2VDI0MSA1NjlRMjE1IDU2OSAxOTggNTg2VDE4MSA2MjlRMTgxIDY0NSAxODcgNjU5VDIwNSA2ODRUMjMxIDcwMVQyNjEgNzA4UTI4NiA3MDggMzAzIDY5MlQzMjEgNjQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTU7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNDExIDBWNjdINDA3UTM3OSAyNiAzMzggOFQyNTAgLTExUTIwMSAtMTEgMTY4IDVUMTEzIDQ5VDgzIDExNFQ3MyAxOTRRNzMgMjQ3IDg2IDMwM1QxMzAgNDA2VDIwOCA0ODNUMzI0IDUxM1EzNzggNTEzIDQwNyA0OTdUNDU0IDQ0Nkg0NThMNDc0IDUwMkg1OTdMNTI3IDBINDExWk00MzIgMzE2UTQzOSAzNjQgNDE1IDM4NFQzNDYgNDA1UTMwNCA0MDUgMjc5IDM4NlQyMzkgMzM2VDIyMSAyNjhUMjE2IDE5NlEyMTYgMTc1IDIyMCAxNTZUMjMzIDEyM1QyNjAgMTAxVDMwNCA5MlEzNjAgOTIgMzg0IDEyM1Q0MTYgMjA2TDQzMiAzMTZaTTQ4MiA2ODJRNDgyIDY1NiA0NzIgNjM0VDQ0NiA1OTdUNDA2IDU3MlQzNTggNTYzUTMxNyA1NjMgMjg3IDU4NlQyNTcgNjUyUTI1NyA2NzcgMjY3IDY5OVQyOTMgNzM2VDMzMiA3NjFUMzgwIDc3MFE0MDAgNzcwIDQxOCA3NjVUNDUxIDc0OFQ0NzMgNzIwVDQ4MiA2ODJaTTM2NyA2MTRRMzkzIDYxNCA0MDcgNjMyVDQyMSA2NzZRNDIxIDY5NiA0MDkgNzA3VDM3NCA3MThRMzQ5IDcxOCAzMzQgNzAxVDMxOCA2NThRMzE4IDYzOCAzMzEgNjI2VDM2NyA2MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNjsiIGhvcml6LWFkdi14PSI4OTEiIGQ9Ik04ODggMjk4UTg4OCAyNzQgODg1IDI1MFQ4NzYgMjAzSDUyMUw1MjAgMTkwUTUyMCAxNjQgNTI5IDE0N1Q1NTQgMTE4VDU5MSAxMDJUNjM1IDk3UTY3NyA5NyA3MTUgMTA3VDc5MCAxMzhMODIzIDQzUTc3MyAxNyA3MjIgM1Q2MTUgLTExUTU2MSAtMTEgNTEzIDVUNDMxIDU5UTQxNSA0NSAzOTAgMzJUMzM2IDlUMjczIC03VDIwOSAtMTNRMTc4IC0xMyAxNTAgLTdUMTAwIDE1VDY2IDU0VDUzIDExNFE1MyAxODMgODYgMjI0VDE3MSAyODdUMjgyIDMxNlQzOTUgMzIzUTM5NyAzMzQgMzk4IDM0NFQzOTkgMzY1UTM5OSAzODAgMzkzIDM4OFQzNzggNDAwVDM1NyA0MDVUMzMzIDQwNlEyODYgNDA2IDIzNiAzOTJUMTQzIDM1NUwxMTEgNDUzUTE3MiA0ODIgMjMyIDQ5N1QzNjAgNTEzUTM3OSA1MTMgNDAwIDUxMVQ0NDIgNTAzVDQ3OSA0ODZUNTA4IDQ1N1E1NDQgNDg2IDU4OCA1MDBUNjc4IDUxNFE3NzkgNTE0IDgzMyA0NTZUODg4IDI5OFpNNzYzIDI5NVE3NjMgNDExIDY2NSA0MTFRNjEwIDQxMSA1NzYgMzgwVDUzMyAyOTVINzYzWk0zOTAgMTMwUTM4NSAxNDQgMzgzIDE2MFQzODAgMTkwUTM4MCAyMDMgMzgxIDIxNlQzODUgMjQyUTM1OCAyNDIgMzI0IDI0MFQyNjEgMjI3VDIxMiAxOTVUMTkyIDEzN1ExOTIgMTA5IDIwOSA5M1QyNTMgNzdRMjk2IDc3IDMzMCA5M1QzOTAgMTMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTc7IiBob3Jpei1hZHYteD0iNTE5IiBkPSJNMzc4IC0xMTNRMzc4IC0xNDAgMzY5IC0xNTlUMzQzIC0xOTJUMzA0IC0yMTFUMjU4IC0yMThRMjM1IC0yMTggMjExIC0yMTFUMTY3IC0xOTNMMTkwIC0xNDVRMjA2IC0xNTMgMjIwIC0xNThUMjUzIC0xNjRRMjczIC0xNjQgMjg5IC0xNTZUMzA1IC0xMjVRMzA1IC0xMDggMjkzIC0xMDNUMjY3IC05N1EyNDIgLTk3IDIyNSAtMTA1TDIwMCAtOTFMMjUyIC05UTE3MSAyIDEyMiA1MlQ3MiAxOTZRNzIgMjY0IDkzIDMyMlQxNTUgNDIyVDI1MSA0ODlUMzc3IDUxM1E0MjggNTEzIDQ3NSA0OTRUNTU5IDQ0MUw0ODYgMzUwUTQ2MiAzNzkgNDMzIDM5MVQzNjYgNDA0UTMyNiA0MDQgMjk4IDM4N1QyNTEgMzQzVDIyNSAyODJUMjE3IDIxM1EyMTcgMTYwIDI0MiAxMjlUMzIzIDk3UTM2NyA5NyA0MDEgMTA5VDQ3MSAxNDdMNTAzIDU0UTQ1OCAyNSA0MTMgOFQzMTQgLTEyTDI4MiAtNThRMzAwIC01MiAzMTYgLTUyUTM0MiAtNTIgMzYwIC02N1QzNzggLTExM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU4OyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTU3MCAzMDNRNTcwIDI1NCA1NTggMjA2SDIwOVEyMDggMjAxIDIwOCAxOTZUMjA3IDE4NFEyMDcgMTU4IDIxNiAxNDFUMjQyIDExM1QyODAgOTlUMzI0IDk1UTM2NyA5NSA0MDQgMTA2VDQ3OSAxMzdMNTExIDQzUTQ2MCAxNiA0MTAgM1QzMDIgLTExUTI1MSAtMTEgMjA5IDFUMTM3IDQwVDkwIDEwNVQ3MyAxOThRNzMgMjY0IDkzIDMyMVQxNTEgNDIyVDI0MyA0ODlUMzY2IDUxNFE0NjQgNTE0IDUxNyA0NTdUNTcwIDMwM1pNNDQ1IDI5NVE0NDYgMzAxIDQ0NiAzMDdUNDQ3IDMyMVE0NDcgMzY2IDQyMyAzOTBUMzU0IDQxNFEyOTggNDE0IDI2NSAzODJUMjIzIDI5NUg0NDVaTTM4NSA1NjVMMjA1IDY4M0wzNTUgNzQxTDQ3NSA2MTBMMzg1IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU5OyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTU3MCAzMDNRNTcwIDI1NCA1NTggMjA2SDIwOVEyMDggMjAxIDIwOCAxOTZUMjA3IDE4NFEyMDcgMTU4IDIxNiAxNDFUMjQyIDExM1QyODAgOTlUMzI0IDk1UTM2NyA5NSA0MDQgMTA2VDQ3OSAxMzdMNTExIDQzUTQ2MCAxNiA0MTAgM1QzMDIgLTExUTI1MSAtMTEgMjA5IDFUMTM3IDQwVDkwIDEwNVQ3MyAxOThRNzMgMjY0IDkzIDMyMVQxNTEgNDIyVDI0MyA0ODlUMzY2IDUxNFE0NjQgNTE0IDUxNyA0NTdUNTcwIDMwM1pNNDQ1IDI5NVE0NDYgMzAxIDQ0NiAzMDdUNDQ3IDMyMVE0NDcgMzY2IDQyMyAzOTBUMzU0IDQxNFEyOTggNDE0IDI2NSAzODJUMjIzIDI5NUg0NDVaTTM3MyA1NjVMMjk1IDYxMEw0NTMgNzQyTDU4NSA2ODNMMzczIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVBOyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTU3MCAzMDNRNTcwIDI1NCA1NTggMjA2SDIwOVEyMDggMjAxIDIwOCAxOTZUMjA3IDE4NFEyMDcgMTU4IDIxNiAxNDFUMjQyIDExM1QyODAgOTlUMzI0IDk1UTM2NyA5NSA0MDQgMTA2VDQ3OSAxMzdMNTExIDQzUTQ2MCAxNiA0MTAgM1QzMDIgLTExUTI1MSAtMTEgMjA5IDFUMTM3IDQwVDkwIDEwNVQ3MyAxOThRNzMgMjY0IDkzIDMyMVQxNTEgNDIyVDI0MyA0ODlUMzY2IDUxNFE0NjQgNTE0IDUxNyA0NTdUNTcwIDMwM1pNNDQ1IDI5NVE0NDYgMzAxIDQ0NiAzMDdUNDQ3IDMyMVE0NDcgMzY2IDQyMyAzOTBUMzU0IDQxNFEyOTggNDE0IDI2NSAzODJUMjIzIDI5NUg0NDVaTTQ5OCA1NjFMMzg0IDYzNUwyNDYgNTYxTDIwMSA2NDBMMzk2IDczOEw1NjYgNjQwTDQ5OCA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01NzAgMzAzUTU3MCAyNTQgNTU4IDIwNkgyMDlRMjA4IDIwMSAyMDggMTk2VDIwNyAxODRRMjA3IDE1OCAyMTYgMTQxVDI0MiAxMTNUMjgwIDk5VDMyNCA5NVEzNjcgOTUgNDA0IDEwNlQ0NzkgMTM3TDUxMSA0M1E0NjAgMTYgNDEwIDNUMzAyIC0xMVEyNTEgLTExIDIwOSAxVDEzNyA0MFQ5MCAxMDVUNzMgMTk4UTczIDI2NCA5MyAzMjFUMTUxIDQyMlQyNDMgNDg5VDM2NiA1MTRRNDY0IDUxNCA1MTcgNDU3VDU3MCAzMDNaTTQ0NSAyOTVRNDQ2IDMwMSA0NDYgMzA3VDQ0NyAzMjFRNDQ3IDM2NiA0MjMgMzkwVDM1NCA0MTRRMjk4IDQxNCAyNjUgMzgyVDIyMyAyOTVINDQ1Wk01NzAgNjQ5UTU3MCA2MzMgNTY0IDYxOVQ1NDYgNTkzVDUyMSA1NzZUNDkwIDU2OVE0NjQgNTY5IDQ0NyA1ODZUNDI5IDYzMFE0MjkgNjQ2IDQzNiA2NjBUNDU0IDY4NFQ0ODAgNzAxVDUxMCA3MDhRNTM1IDcwOCA1NTIgNjkyVDU3MCA2NDlaTTM0NyA2NDlRMzQ3IDYzMyAzNDEgNjE5VDMyMyA1OTNUMjk4IDU3NlQyNjcgNTY5UTI0MSA1NjkgMjI0IDU4NlQyMDcgNjI5UTIwNyA2NDUgMjEzIDY1OVQyMzEgNjg0VDI1NyA3MDFUMjg3IDcwOFEzMTIgNzA4IDMyOSA2OTJUMzQ3IDY0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVDOyIgaG9yaXotYWR2LXg9IjI2NyIgZD0iTTYzIDBMMTMzIDUwMkgyNzRMMjA0IDBINjNaTTIxMyA1NjVMMzMgNjgzTDE4MyA3NDFMMzAzIDYxMEwyMTMgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUQ7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNNjMgMEwxMzMgNTAySDI3NEwyMDQgMEg2M1pNMjEzIDU2NUwxMzUgNjEwTDI5MyA3NDJMNDI1IDY4M0wyMTMgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUU7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNNjMgMEwxMzMgNTAySDI3NEwyMDQgMEg2M1pNMzM5IDU2MUwyMjUgNjM1TDg3IDU2MUw0MiA2NDBMMjM3IDczOEw0MDcgNjQwTDMzOSA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRjsiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik02MyAwTDEzMyA1MDJIMjc0TDIwNCAwSDYzWk00MDUgNjQ5UTQwNSA2MzMgMzk5IDYxOVQzODEgNTkzVDM1NiA1NzZUMzI1IDU2OVEyOTkgNTY5IDI4MiA1ODZUMjY0IDYzMFEyNjQgNjQ2IDI3MSA2NjBUMjg5IDY4NFQzMTUgNzAxVDM0NSA3MDhRMzcwIDcwOCAzODcgNjkyVDQwNSA2NDlaTTE4MiA2NDlRMTgyIDYzMyAxNzYgNjE5VDE1OCA1OTNUMTMzIDU3NlQxMDIgNTY5UTc2IDU2OSA1OSA1ODZUNDIgNjI5UTQyIDY0NSA0OCA2NTlUNjYgNjg0VDkyIDcwMVQxMjIgNzA4UTE0NyA3MDggMTY0IDY5MlQxODIgNjQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjA7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNNTQzIDYwNlE1NjYgNTU1IDU3MyA0OThUNTgxIDM4NFE1ODEgMzEwIDU2NSAyMzlUNTEzIDExM1Q0MTkgMjRUMjc1IC0xMFExODAgLTEwIDEyNiA0M1Q3MiAxOTJRNzIgMjUwIDg3IDMwMlQxMzQgMzkzVDIxMiA0NTVUMzIxIDQ3OFEzMzcgNDc4IDM1MyA0NzdUMzg1IDQ3MVQ0MTMgNDU3VDQzNiA0MzNINDQxVjQ0OVE0NDEgNDc4IDQzNSA1MDdUNDE3IDU2MkwzMDAgNTE3TDI3NyA1ODhMMzg0IDYyOVEzNzMgNjQ3IDM2MiA2NjJUMzM0IDY5MUw0NjQgNzI1UTQ3NSA3MTQgNDg1IDcwMlQ1MDQgNjc3TDU4MCA3MTBMNjA3IDYzNEw1NDMgNjA2Wk0zMDIgOTVRMzQzIDk1IDM2OCAxMTNUNDA3IDE2MFQ0MjYgMjI0VDQzMSAyOTNRNDMxIDM0MSA0MTAgMzYzVDM0MSAzODVRMzAwIDM4NSAyNzUgMzY3VDIzNSAzMjFUMjE3IDI1OFQyMTIgMTg5UTIxMiAxNDEgMjMyIDExOFQzMDIgOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMTsiIGhvcml6LWFkdi14PSI1OTMiIGQ9Ik0zODkgMEw0MjggMjgxUTQzMCAyOTMgNDMxIDMwM1Q0MzIgMzI0UTQzMiAzNTYgNDE3IDM3NVQzNTcgMzk1UTI1OSAzOTUgMjQ2IDMwMEwyMDQgMEg2M0wxMzMgNTAySDI1NEwyNTYgNDQySDI2MFEyOTMgNDgyIDMzMCA0OTdUNDE4IDUxM1E1MDUgNTEzIDU0MCA0NzNUNTc2IDM2MVE1NzYgMzQ3IDU3NSAzMzNUNTcyIDMwM0w1MzAgMEgzODlaTTU4MSA2NTVRNTYwIDYxMCA1MjUgNTg5VDQ1NSA1NjdRNDMyIDU2NyA0MTUgNTczVDM4MiA1ODhUMzUzIDYwM1QzMjQgNjEwUTMwNyA2MTAgMjg5IDYwMVQyNTcgNTY2TDE5OSA2MTlRMjI4IDY2OSAyNTggNjg3VDMyNCA3MDZRMzQ1IDcwNiAzNjIgNjk5VDM5NSA2ODRUNDI1IDY2OVQ0NTYgNjYyUTQ3MyA2NjIgNDkwIDY3MVQ1MjEgNzA2TDU4MSA2NTVINTgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjI7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNzMgMTk3UTczIDI2NiA5MyAzMjRUMTUxIDQyNFQyNDUgNDg5VDM3MiA1MTNRNDIzIDUxMyA0NjQgNTAxVDUzNiA0NjNUNTgyIDM5OFQ1OTggMzA1UTU5OCAyMzYgNTc4IDE3OFQ1MTkgNzhUNDI1IDEzVDI5OCAtMTFRMTk2IC0xMSAxMzUgNDBUNzMgMTk3Wk0zNTcgNDAzUTMxNCA0MDMgMjg3IDM4NVQyNDQgMzM3VDIyMiAyNzJUMjE2IDIwMFEyMTYgMTQ5IDIzOCAxMjJUMzE0IDk1UTM1NiA5NSAzODMgMTE0VDQyNiAxNjJUNDQ4IDIyOFQ0NTUgMzAwUTQ1NSAzNTEgNDMyIDM3N1QzNTcgNDAzWk0zOTIgNTY1TDIxMiA2ODNMMzYyIDc0MUw0ODIgNjEwTDM5MiA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMzsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik03MyAxOTdRNzMgMjY2IDkzIDMyNFQxNTEgNDI0VDI0NSA0ODlUMzcyIDUxM1E0MjMgNTEzIDQ2NCA1MDFUNTM2IDQ2M1Q1ODIgMzk4VDU5OCAzMDVRNTk4IDIzNiA1NzggMTc4VDUxOSA3OFQ0MjUgMTNUMjk4IC0xMVExOTYgLTExIDEzNSA0MFQ3MyAxOTdaTTM1NyA0MDNRMzE0IDQwMyAyODcgMzg1VDI0NCAzMzdUMjIyIDI3MlQyMTYgMjAwUTIxNiAxNDkgMjM4IDEyMlQzMTQgOTVRMzU2IDk1IDM4MyAxMTRUNDI2IDE2MlQ0NDggMjI4VDQ1NSAzMDBRNDU1IDM1MSA0MzIgMzc3VDM1NyA0MDNaTTM4MyA1NjVMMzA1IDYxMEw0NjMgNzQyTDU5NSA2ODNMMzgzIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY0OyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTczIDE5N1E3MyAyNjYgOTMgMzI0VDE1MSA0MjRUMjQ1IDQ4OVQzNzIgNTEzUTQyMyA1MTMgNDY0IDUwMVQ1MzYgNDYzVDU4MiAzOThUNTk4IDMwNVE1OTggMjM2IDU3OCAxNzhUNTE5IDc4VDQyNSAxM1QyOTggLTExUTE5NiAtMTEgMTM1IDQwVDczIDE5N1pNMzU3IDQwM1EzMTQgNDAzIDI4NyAzODVUMjQ0IDMzN1QyMjIgMjcyVDIxNiAyMDBRMjE2IDE0OSAyMzggMTIyVDMxNCA5NVEzNTYgOTUgMzgzIDExNFQ0MjYgMTYyVDQ0OCAyMjhUNDU1IDMwMFE0NTUgMzUxIDQzMiAzNzdUMzU3IDQwM1pNNTA2IDU2MUwzOTIgNjM1TDI1NCA1NjFMMjA5IDY0MEw0MDQgNzM4TDU3NCA2NDBMNTA2IDU2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY1OyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTczIDE5N1E3MyAyNjYgOTMgMzI0VDE1MSA0MjRUMjQ1IDQ4OVQzNzIgNTEzUTQyMyA1MTMgNDY0IDUwMVQ1MzYgNDYzVDU4MiAzOThUNTk4IDMwNVE1OTggMjM2IDU3OCAxNzhUNTE5IDc4VDQyNSAxM1QyOTggLTExUTE5NiAtMTEgMTM1IDQwVDczIDE5N1pNMzU3IDQwM1EzMTQgNDAzIDI4NyAzODVUMjQ0IDMzN1QyMjIgMjcyVDIxNiAyMDBRMjE2IDE0OSAyMzggMTIyVDMxNCA5NVEzNTYgOTUgMzgzIDExNFQ0MjYgMTYyVDQ0OCAyMjhUNDU1IDMwMFE0NTUgMzUxIDQzMiAzNzdUMzU3IDQwM1pNNTgyIDY1NVE1NjEgNjEwIDUyNiA1ODlUNDU2IDU2N1E0MzMgNTY3IDQxNiA1NzNUMzgzIDU4OFQzNTQgNjAzVDMyNSA2MTBRMzA4IDYxMCAyOTAgNjAxVDI1OCA1NjZMMjAwIDYxOVEyMjkgNjY5IDI1OSA2ODdUMzI1IDcwNlEzNDYgNzA2IDM2MyA2OTlUMzk2IDY4NFQ0MjYgNjY5VDQ1NyA2NjJRNDc0IDY2MiA0OTEgNjcxVDUyMiA3MDZMNTgyIDY1NUg1ODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNjsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik03MyAxOTdRNzMgMjY2IDkzIDMyNFQxNTEgNDI0VDI0NSA0ODlUMzcyIDUxM1E0MjMgNTEzIDQ2NCA1MDFUNTM2IDQ2M1Q1ODIgMzk4VDU5OCAzMDVRNTk4IDIzNiA1NzggMTc4VDUxOSA3OFQ0MjUgMTNUMjk4IC0xMVExOTYgLTExIDEzNSA0MFQ3MyAxOTdaTTM1NyA0MDNRMzE0IDQwMyAyODcgMzg1VDI0NCAzMzdUMjIyIDI3MlQyMTYgMjAwUTIxNiAxNDkgMjM4IDEyMlQzMTQgOTVRMzU2IDk1IDM4MyAxMTRUNDI2IDE2MlQ0NDggMjI4VDQ1NSAzMDBRNDU1IDM1MSA0MzIgMzc3VDM1NyA0MDNaTTU3MCA2NDlRNTcwIDYzMyA1NjQgNjE5VDU0NiA1OTNUNTIxIDU3NlQ0OTAgNTY5UTQ2NCA1NjkgNDQ3IDU4NlQ0MjkgNjMwUTQyOSA2NDYgNDM2IDY2MFQ0NTQgNjg0VDQ4MCA3MDFUNTEwIDcwOFE1MzUgNzA4IDU1MiA2OTJUNTcwIDY0OVpNMzQ3IDY0OVEzNDcgNjMzIDM0MSA2MTlUMzIzIDU5M1QyOTggNTc2VDI2NyA1NjlRMjQxIDU2OSAyMjQgNTg2VDIwNyA2MjlRMjA3IDY0NSAyMTMgNjU5VDIzMSA2ODRUMjU3IDcwMVQyODcgNzA4UTMxMiA3MDggMzI5IDY5MlQzNDcgNjQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjc7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNzQgMjExTDkxIDMyOUg2MTRMNTk3IDIxMUg3NFpNMjMyIDU5UTIzMiA3NyAyNDAgOTRUMjYxIDEyNFQyOTEgMTQ0VDMyNyAxNTJRMzU3IDE1MiAzNzcgMTMyVDM5OCA4MlEzOTggNjMgMzkxIDQ2VDM3MCAxNlQzNDAgLTVUMzA0IC0xM1EyNzMgLTEzIDI1MyA3VDIzMiA1OVpNMjkwIDQ2NFEyOTAgNDgzIDI5NyA1MDBUMzE4IDUzMVQzNDggNTUxVDM4NCA1NTlRNDE0IDU1OSA0MzUgNTM5VDQ1NiA0ODhRNDU2IDQ3MCA0NDggNDUzVDQyNyA0MjNUMzk3IDQwMlQzNjEgMzk0UTMzMCAzOTQgMzEwIDQxM1QyOTAgNDY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjg7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNTY5IDQyNFE1ODYgMzk4IDU5MiAzNjhUNTk4IDMwNlE1OTggMjM3IDU3OCAxNzlUNTIwIDc5VDQyNiAxM1QyOTkgLTExUTI1OSAtMTEgMjE5IC0yVDE0NyAzM0w4NyAtMjNMMzYgNDFMOTMgOTVRODIgMTE4IDc3IDE0M1Q3MiAxOTVRNzIgMjY0IDkyIDMyMlQxNTEgNDIzVDI0NiA0ODlUMzczIDUxM1E0MDggNTEzIDQ0MyA1MDdUNTA4IDQ4Mkw1NzMgNTM5TDYzMCA0ODBMNTY5IDQyNFpNNDEzIDM3OVE0MDIgMzkwIDM4NyAzOTVUMzU3IDQwMFEzMTYgNDAwIDI4OSAzODRUMjQ2IDM0MFQyMjMgMjc5VDIxNiAyMDlRMjE2IDIwMyAyMTggMTkzTDQxMyAzNzlaTTMxNSA5OFEzNTYgOTggMzgzIDExNVQ0MjUgMTYxVDQ0NyAyMjRUNDU0IDI5NFE0NTQgMzA5IDQ1MSAzMjRMMjQyIDEyOVEyNTIgMTEyIDI3NCAxMDVUMzE1IDk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjk7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBWNThIMzk0UTM2NyAyNSAzMzAgN1QyNDAgLTEyUTIwNCAtMTIgMTc1IC02VDEyNiAxN1Q5NiA2MVQ4NSAxMzBRODUgMTQzIDg2IDE1N1Q4OSAxODhMMTMzIDUwMkgyNzRMMjM2IDIzNFEyMzQgMjE3IDIzMiAyMDJUMjMwIDE3NFEyMzAgMTQyIDI0NCAxMjRUMzAyIDEwNlEzMzAgMTA2IDM0OSAxMTNUMzgxIDEzMlQzOTkgMTY0VDQwOSAyMDdMNDUwIDUwMkg1OTFMNTIxIDBIMzk4Wk0zNzMgNTY1TDE5MyA2ODNMMzQzIDc0MUw0NjMgNjEwTDM3MyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQTsiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0zOTggMFY1OEgzOTRRMzY3IDI1IDMzMCA3VDI0MCAtMTJRMjA0IC0xMiAxNzUgLTZUMTI2IDE3VDk2IDYxVDg1IDEzMFE4NSAxNDMgODYgMTU3VDg5IDE4OEwxMzMgNTAySDI3NEwyMzYgMjM0UTIzNCAyMTcgMjMyIDIwMlQyMzAgMTc0UTIzMCAxNDIgMjQ0IDEyNFQzMDIgMTA2UTMzMCAxMDYgMzQ5IDExM1QzODEgMTMyVDM5OSAxNjRUNDA5IDIwN0w0NTAgNTAySDU5MUw1MjEgMEgzOThaTTM2MyA1NjVMMjg1IDYxMEw0NDMgNzQyTDU3NSA2ODNMMzYzIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCOyIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTM5OCAwVjU4SDM5NFEzNjcgMjUgMzMwIDdUMjQwIC0xMlEyMDQgLTEyIDE3NSAtNlQxMjYgMTdUOTYgNjFUODUgMTMwUTg1IDE0MyA4NiAxNTdUODkgMTg4TDEzMyA1MDJIMjc0TDIzNiAyMzRRMjM0IDIxNyAyMzIgMjAyVDIzMCAxNzRRMjMwIDE0MiAyNDQgMTI0VDMwMiAxMDZRMzMwIDEwNiAzNDkgMTEzVDM4MSAxMzJUMzk5IDE2NFQ0MDkgMjA3TDQ1MCA1MDJINTkxTDUyMSAwSDM5OFpNNDk5IDU2MUwzODUgNjM1TDI0NyA1NjFMMjAyIDY0MEwzOTcgNzM4TDU2NyA2NDBMNDk5IDU2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZDOyIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTM5OCAwVjU4SDM5NFEzNjcgMjUgMzMwIDdUMjQwIC0xMlEyMDQgLTEyIDE3NSAtNlQxMjYgMTdUOTYgNjFUODUgMTMwUTg1IDE0MyA4NiAxNTdUODkgMTg4TDEzMyA1MDJIMjc0TDIzNiAyMzRRMjM0IDIxNyAyMzIgMjAyVDIzMCAxNzRRMjMwIDE0MiAyNDQgMTI0VDMwMiAxMDZRMzMwIDEwNiAzNDkgMTEzVDM4MSAxMzJUMzk5IDE2NFQ0MDkgMjA3TDQ1MCA1MDJINTkxTDUyMSAwSDM5OFpNNTY0IDY0OVE1NjQgNjMzIDU1OCA2MTlUNTQwIDU5M1Q1MTUgNTc2VDQ4NCA1NjlRNDU4IDU2OSA0NDEgNTg2VDQyMyA2MzBRNDIzIDY0NiA0MzAgNjYwVDQ0OCA2ODRUNDc0IDcwMVQ1MDQgNzA4UTUyOSA3MDggNTQ2IDY5MlQ1NjQgNjQ5Wk0zNDEgNjQ5UTM0MSA2MzMgMzM1IDYxOVQzMTcgNTkzVDI5MiA1NzZUMjYxIDU2OVEyMzUgNTY5IDIxOCA1ODZUMjAxIDYyOVEyMDEgNjQ1IDIwNyA2NTlUMjI1IDY4NFQyNTEgNzAxVDI4MSA3MDhRMzA2IDcwOCAzMjMgNjkyVDM0MSA2NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRDsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0zMzIgLTIxUTI5OSAtODMgMjczIC0xMjNUMjIwIC0xODZUMTYxIC0yMTdUODMgLTIyNlE2OSAtMjI2IDUxIC0yMjVUOCAtMjIxTDI1IC0xMDRRMzIgLTEwNiA0NCAtMTA2VDgwIC0xMDdRMTAwIC0xMDcgMTEzIC0xMDRUMTM2IC05NFQxNTQgLTc2VDE3MiAtNDdMMjA0IDExTDc3IDUwMkgyMzBMMjk1IDE1NEgyOTlMNDYxIDUwMkg2MTJMMzMyIC0yMVpNMzU0IDU2NUwyNzYgNjEwTDQzNCA3NDJMNTY2IDY4M0wzNTQgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTg4IDMxN1E1ODggMjYwIDU3MiAyMDJUNTIzIDk2VDQ0MSAxOVQzMjQgLTExUTI4MiAtMTEgMjU4IDNUMjE0IDQ2SDIxMEwxNzMgLTIyMEgzMkwxNjEgNzAwSDI5MkwyNTcgNDUwSDI2MVEyOTMgNDg0IDMyOCA0OThUNDA4IDUxM1E0OTkgNTEzIDU0MyA0NjFUNTg4IDMxN1pNMzEwIDk1UTM1MSA5NSAzNzcgMTE2VDQxOCAxNzBUNDM5IDI0MFQ0NDUgMzE0UTQ0NSAzNjEgNDI2IDM4NFQzNTYgNDA3UTMwNiA0MDcgMjgxIDM4NlQyNDggMzE4TDIzMyAyMDlRMjMwIDE4OSAyMzAgMTczUTIzMCAxMzIgMjQ5IDExNFQzMTAgOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRjsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0zMzIgLTIxUTI5OSAtODMgMjczIC0xMjNUMjIwIC0xODZUMTYxIC0yMTdUODMgLTIyNlE2OSAtMjI2IDUxIC0yMjVUOCAtMjIxTDI1IC0xMDRRMzIgLTEwNiA0NCAtMTA2VDgwIC0xMDdRMTAwIC0xMDcgMTEzIC0xMDRUMTM2IC05NFQxNTQgLTc2VDE3MiAtNDdMMjA0IDExTDc3IDUwMkgyMzBMMjk1IDE1NEgyOTlMNDYxIDUwMkg2MTJMMzMyIC0yMVpNNTUwIDY0OVE1NTAgNjMzIDU0NCA2MTlUNTI2IDU5M1Q1MDEgNTc2VDQ3MCA1NjlRNDQ0IDU2OSA0MjcgNTg2VDQwOSA2MzBRNDA5IDY0NiA0MTYgNjYwVDQzNCA2ODRUNDYwIDcwMVQ0OTAgNzA4UTUxNSA3MDggNTMyIDY5MlQ1NTAgNjQ5Wk0zMjcgNjQ5UTMyNyA2MzMgMzIxIDYxOVQzMDMgNTkzVDI3OCA1NzZUMjQ3IDU2OVEyMjEgNTY5IDIwNCA1ODZUMTg3IDYyOVExODcgNjQ1IDE5MyA2NTlUMjExIDY4NFQyMzcgNzAxVDI2NyA3MDhRMjkyIDcwOCAzMDkgNjkyVDMyNyA2NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDA7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMzIDBMNDk5IDE0MEgyMzZMMTYzIDBIMTJMMzYzIDY3MEg1MTlMNjg5IDBINTMzWk00MjEgNTI1SDQxN0wyODcgMjU4SDQ3OUw0MjEgNTI1Wk0yODYgNzI3TDI5OCA4MTRINjIxTDYwOSA3MjdIMjg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAxOyIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTQxMSAwVjY3SDQwN1EzNzkgMjYgMzM4IDhUMjUwIC0xMVEyMDEgLTExIDE2OCA1VDExMyA0OVQ4MyAxMTRUNzMgMTk0UTczIDI0NyA4NiAzMDNUMTMwIDQwNlQyMDggNDgzVDMyNCA1MTNRMzc4IDUxMyA0MDcgNDk3VDQ1NCA0NDZINDU4TDQ3NCA1MDJINTk3TDUyNyAwSDQxMVpNNDMyIDMxNlE0MzkgMzY0IDQxNSAzODRUMzQ2IDQwNVEzMDQgNDA1IDI3OSAzODZUMjM5IDMzNlQyMjEgMjY4VDIxNiAxOTZRMjE2IDE3NSAyMjAgMTU2VDIzMyAxMjNUMjYwIDEwMVQzMDQgOTJRMzYwIDkyIDM4NCAxMjNUNDE2IDIwNkw0MzIgMzE2Wk0xOTMgNTg3TDIwNSA2NzRINTI4TDUxNiA1ODdIMTkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAyOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMyAwTDQ5OSAxNDBIMjM2TDE2MyAwSDEyTDM2MyA2NzBINTE5TDY4OSAwSDUzM1pNNDIxIDUyNUg0MTdMMjg3IDI1OEg0NzlMNDIxIDUyNVpNNjM3IDg0NlE2MjYgODAxIDYwMyA3NzRUNTUyIDczMVQ0OTUgNzEwVDQ0MiA3MDVRNDE4IDcwNSAzOTEgNzEwVDM0MSA3MzBUMzA0IDc3M1QyOTEgODQ2SDM4OFEzODcgODIwIDQwMSA3OTlUNDUzIDc3OFE0ODkgNzc4IDUxMSA3OTlUNTM5IDg0Nkg2MzdINjM3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAzOyIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTQxMSAwVjY3SDQwN1EzNzkgMjYgMzM4IDhUMjUwIC0xMVEyMDEgLTExIDE2OCA1VDExMyA0OVQ4MyAxMTRUNzMgMTk0UTczIDI0NyA4NiAzMDNUMTMwIDQwNlQyMDggNDgzVDMyNCA1MTNRMzc4IDUxMyA0MDcgNDk3VDQ1NCA0NDZINDU4TDQ3NCA1MDJINTk3TDUyNyAwSDQxMVpNNDMyIDMxNlE0MzkgMzY0IDQxNSAzODRUMzQ2IDQwNVEzMDQgNDA1IDI3OSAzODZUMjM5IDMzNlQyMjEgMjY4VDIxNiAxOTZRMjE2IDE3NSAyMjAgMTU2VDIzMyAxMjNUMjYwIDEwMVQzMDQgOTJRMzYwIDkyIDM4NCAxMjNUNDE2IDIwNkw0MzIgMzE2Wk01NDAgNzA2UTUyOSA2NjEgNTA2IDYzNFQ0NTUgNTkxVDM5OCA1NzBUMzQ1IDU2NVEzMjEgNTY1IDI5NCA1NzBUMjQ0IDU5MFQyMDcgNjMzVDE5NCA3MDZIMjkxUTI5MCA2ODAgMzA0IDY1OVQzNTYgNjM4UTM5MiA2MzggNDE0IDY1OVQ0NDIgNzA2SDU0MEg1NDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDQ7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjExIDBRNTk3IC05IDU4MSAtMjFUNTUyIC00OFQ1MjkgLTgwVDUyMCAtMTE2UTUyMCAtMTM2IDUzMSAtMTQ2VDU2MiAtMTU2UTU3OSAtMTU2IDU5MCAtMTUyVDYxNiAtMTQxTDYyOCAtMjE5UTYwNyAtMjI4IDU3OCAtMjM0VDUyNSAtMjQxUTQ4MSAtMjQxIDQ1MCAtMjIxVDQxOCAtMTUxUTQxOCAtMTI1IDQyOCAtMTAzVDQ1NCAtNjFUNDkwIC0yNlQ1MzIgMUw0OTkgMTQwSDIzNkwxNjMgMEgxMkwzNjMgNjcwSDUxOUw2ODkgMEg2MTFaTTQyMSA1MjVINDE3TDI4NyAyNThINDc5TDQyMSA1MjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDU7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNDg5IDBRNDc1IC0xMCA0NjAgLTIyVDQzMSAtNDhUNDA4IC03OVQzOTkgLTExNVEzOTkgLTEzNCA0MTAgLTE0NVQ0NDEgLTE1NlE0NTggLTE1NiA0NjkgLTE1MlQ0OTUgLTE0MUw1MDcgLTIxOVE0ODUgLTIyOCA0NTYgLTIzNFQ0MDQgLTI0MVEzNTkgLTI0MSAzMjggLTIyMFQyOTcgLTE1MFEyOTcgLTEyNSAzMDYgLTEwM1QzMzIgLTYxVDM2OCAtMjdUNDExIDFWNjdINDA3UTM3OSAyNiAzMzggOFQyNTAgLTExUTIwMSAtMTEgMTY4IDVUMTEzIDQ5VDgzIDExNFQ3MyAxOTRRNzMgMjQ3IDg2IDMwM1QxMzAgNDA2VDIwOCA0ODNUMzI0IDUxM1EzNzggNTEzIDQwNyA0OTdUNDU0IDQ0Nkg0NThMNDc0IDUwMkg1OTdMNTI3IDBINDg5Wk00MzIgMzE2UTQzOSAzNjQgNDE1IDM4NFQzNDYgNDA1UTMwNCA0MDUgMjc5IDM4NlQyMzkgMzM2VDIyMSAyNjhUMjE2IDE5NlEyMTYgMTc1IDIyMCAxNTZUMjMzIDEyM1QyNjAgMTAxVDMwNCA5MlEzNjAgOTIgMzg0IDEyM1Q0MTYgMjA2TDQzMiAzMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDY7IiBob3Jpei1hZHYteD0iNjY1IiBkPSJNNjUzIDk2UTU5MyA0NiA1MjcgMThUMzgzIC0xMVEyNDkgLTExIDE3MyA1NlQ5NyAyNjFROTcgMzQ3IDEyMiA0MjNUMTk1IDU1NVQzMTQgNjQ1VDQ3NiA2NzhRNTUxIDY3OCA2MDkgNjUxVDcxNSA1NjdMNjEzIDQ3NFE1ODQgNTEyIDU0OSA1MzNUNDY1IDU1NVE0MDUgNTU1IDM2NCA1MzFUMjk4IDQ2N1QyNjEgMzc3VDI1MCAyNzRRMjUwIDE5OCAyODUgMTU0VDQwMSAxMTBRNDU1IDExMCA1MDEgMTM0VDU4OCAxOTNMNjUzIDk2SDY1M1pNNDYxIDcxMEwzODMgNzU1TDU0MSA4ODdMNjczIDgyOEw0NjEgNzEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA3OyIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTQ4NiAzNTBRNDYyIDM3OSA0MzMgMzkxVDM2NiA0MDRRMzI2IDQwNCAyOTggMzg3VDI1MSAzNDNUMjI1IDI4MlQyMTcgMjEzUTIxNyAxNjAgMjQyIDEyOVQzMjMgOTdRMzY3IDk3IDQwMSAxMDlUNDcxIDE0N0w1MDMgNTRRNDU1IDIzIDQwNiA2VDI5OSAtMTJRMjQ5IC0xMiAyMDcgMVQxMzUgMzlUODkgMTA0VDcyIDE5NlE3MiAyNjQgOTMgMzIyVDE1NSA0MjJUMjUxIDQ4OVQzNzcgNTEzUTQyOCA1MTMgNDc1IDQ5NFQ1NTkgNDQxTDQ4NiAzNTBaTTM2OSA1NjVMMjkxIDYxMEw0NDkgNzQyTDU4MSA2ODNMMzY5IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik02NTMgOTZRNTkzIDQ2IDUyNyAxOFQzODMgLTExUTI0OSAtMTEgMTczIDU2VDk3IDI2MVE5NyAzNDcgMTIyIDQyM1QxOTUgNTU1VDMxNCA2NDVUNDc2IDY3OFE1NTEgNjc4IDYwOSA2NTFUNzE1IDU2N0w2MTMgNDc0UTU4NCA1MTIgNTQ5IDUzM1Q0NjUgNTU1UTQwNSA1NTUgMzY0IDUzMVQyOTggNDY3VDI2MSAzNzdUMjUwIDI3NFEyNTAgMTk4IDI4NSAxNTRUNDAxIDExMFE0NTUgMTEwIDUwMSAxMzRUNTg4IDE5M0w2NTMgOTZINjUzWk02MDUgNzA0TDQ5MSA3NzhMMzUzIDcwNEwzMDggNzgzTDUwMyA4ODFMNjczIDc4M0w2MDUgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA5OyIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTQ4NiAzNTBRNDYyIDM3OSA0MzMgMzkxVDM2NiA0MDRRMzI2IDQwNCAyOTggMzg3VDI1MSAzNDNUMjI1IDI4MlQyMTcgMjEzUTIxNyAxNjAgMjQyIDEyOVQzMjMgOTdRMzY3IDk3IDQwMSAxMDlUNDcxIDE0N0w1MDMgNTRRNDU1IDIzIDQwNiA2VDI5OSAtMTJRMjQ5IC0xMiAyMDcgMVQxMzUgMzlUODkgMTA0VDcyIDE5NlE3MiAyNjQgOTMgMzIyVDE1NSA0MjJUMjUxIDQ4OVQzNzcgNTEzUTQyOCA1MTMgNDc1IDQ5NFQ1NTkgNDQxTDQ4NiAzNTBaTTQ5NiA1NjFMMzgyIDYzNUwyNDQgNTYxTDE5OSA2NDBMMzk0IDczOEw1NjQgNjQwTDQ5NiA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEE7IiBob3Jpei1hZHYteD0iNjY1IiBkPSJNNjUzIDk2UTU5MyA0NiA1MjcgMThUMzgzIC0xMVEyNDkgLTExIDE3MyA1NlQ5NyAyNjFROTcgMzQ3IDEyMiA0MjNUMTk1IDU1NVQzMTQgNjQ1VDQ3NiA2NzhRNTUxIDY3OCA2MDkgNjUxVDcxNSA1NjdMNjEzIDQ3NFE1ODQgNTEyIDU0OSA1MzNUNDY1IDU1NVE0MDUgNTU1IDM2NCA1MzFUMjk4IDQ2N1QyNjEgMzc3VDI1MCAyNzRRMjUwIDE5OCAyODUgMTU0VDQwMSAxMTBRNDU1IDExMCA1MDEgMTM0VDU4OCAxOTNMNjUzIDk2SDY1M1pNNTcxIDc5N1E1NzEgNzU4IDU0MiA3MzdUNDc3IDcxNlE0NjMgNzE2IDQ1MCA3MTlUNDI2IDczMFQ0MDkgNzQ4VDQwMiA3NzVRNDAyIDc5NSA0MTAgODEwVDQzMSA4MzVUNDYyIDg1MFQ0OTcgODU1UTUyNSA4NTUgNTQ4IDg0MlQ1NzEgNzk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBCOyIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTQ4NiAzNTBRNDYyIDM3OSA0MzMgMzkxVDM2NiA0MDRRMzI2IDQwNCAyOTggMzg3VDI1MSAzNDNUMjI1IDI4MlQyMTcgMjEzUTIxNyAxNjAgMjQyIDEyOVQzMjMgOTdRMzY3IDk3IDQwMSAxMDlUNDcxIDE0N0w1MDMgNTRRNDU1IDIzIDQwNiA2VDI5OSAtMTJRMjQ5IC0xMiAyMDcgMVQxMzUgMzlUODkgMTA0VDcyIDE5NlE3MiAyNjQgOTMgMzIyVDE1NSA0MjJUMjUxIDQ4OVQzNzcgNTEzUTQyOCA1MTMgNDc1IDQ5NFQ1NTkgNDQxTDQ4NiAzNTBaTTQ2NyA2NTBRNDY3IDYxMSA0MzggNTkwVDM3MyA1NjlRMzU5IDU2OSAzNDYgNTcyVDMyMiA1ODNUMzA1IDYwMVQyOTggNjI4UTI5OCA2NDggMzA2IDY2M1QzMjcgNjg4VDM1OCA3MDNUMzkzIDcwOFE0MjEgNzA4IDQ0NCA2OTVUNDY3IDY1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik02NTMgOTZRNTkzIDQ2IDUyNyAxOFQzODMgLTExUTI0OSAtMTEgMTczIDU2VDk3IDI2MVE5NyAzNDcgMTIyIDQyM1QxOTUgNTU1VDMxNCA2NDVUNDc2IDY3OFE1NTEgNjc4IDYwOSA2NTFUNzE1IDU2N0w2MTMgNDc0UTU4NCA1MTIgNTQ5IDUzM1Q0NjUgNTU1UTQwNSA1NTUgMzY0IDUzMVQyOTggNDY3VDI2MSAzNzdUMjUwIDI3NFEyNTAgMTk4IDI4NSAxNTRUNDAxIDExMFE0NTUgMTEwIDUwMSAxMzRUNTg4IDE5M0w2NTMgOTZINjUzWk02NTkgODA4TDQ3NyA3MTFMMzIxIDgwOEwzODQgODgzTDQ4OSA4MTRMNjE2IDg4M0w2NTkgODA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBEOyIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTQ4NiAzNTBRNDYyIDM3OSA0MzMgMzkxVDM2NiA0MDRRMzI2IDQwNCAyOTggMzg3VDI1MSAzNDNUMjI1IDI4MlQyMTcgMjEzUTIxNyAxNjAgMjQyIDEyOVQzMjMgOTdRMzY3IDk3IDQwMSAxMDlUNDcxIDE0N0w1MDMgNTRRNDU1IDIzIDQwNiA2VDI5OSAtMTJRMjQ5IC0xMiAyMDcgMVQxMzUgMzlUODkgMTA0VDcyIDE5NlE3MiAyNjQgOTMgMzIyVDE1NSA0MjJUMjUxIDQ4OVQzNzcgNTEzUTQyOCA1MTMgNDc1IDQ5NFQ1NTkgNDQxTDQ4NiAzNTBaTTU2MiA2NjJMMzgwIDU2NUwyMjQgNjYyTDI4NyA3MzdMMzkyIDY2OEw1MTkgNzM3TDU2MiA2NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEU7IiBob3Jpei1hZHYteD0iNzA0IiBkPSJNNzAwIDQwOFE3MDAgMzE0IDY3NCAyMzlUNTk2IDExMFQ0NzEgMjlUMzAzIDBINzNMMTY2IDY2MlEyMjQgNjY3IDI4MiA2NzFUMzk5IDY3NVE0NjUgNjc1IDUyMCA2NjBUNjE2IDYxM1Q2NzggNTMwVDcwMCA0MDhaTTMwNyAxMTZRMzY1IDExNiA0MDYgMTMwVDQ3NSAxNzJUNTE5IDI0MlQ1NDMgMzQwUTU0NSAzNTYgNTQ2IDM3MVQ1NDggNDAyUTU0OCA1NjEgMzg3IDU2MVEzNjQgNTYxIDM0MiA1NjBUMjk3IDU1N0wyMzUgMTE3UTI1MyAxMTYgMjcxIDExNlQzMDcgMTE2Wk01ODYgODAyTDQwNCA3MDVMMjQ4IDgwMkwzMTEgODc3TDQxNiA4MDhMNTQzIDg3N0w1ODYgODAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBGOyIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTQxMSAwVjY3SDQwN1EzNzkgMjYgMzM4IDhUMjUwIC0xMVEyMDEgLTExIDE2OCA1VDExMyA0OVQ4MyAxMTRUNzMgMTk0UTczIDI0NyA4NiAzMDNUMTMwIDQwNlQyMDggNDgzVDMyNCA1MTNRMzYzIDUxMyAzOTQgNTAxVDQ0NSA0NTVINDQ5TDQ4NCA3MDBINjI1TDUyNyAwSDQxMVpNNDMyIDMxNlE0MzkgMzY0IDQxNSAzODRUMzQ2IDQwNVEzMDQgNDA1IDI3OSAzODZUMjM5IDMzNlQyMjEgMjY4VDIxNiAxOTZRMjE2IDE3NSAyMjAgMTU2VDIzMyAxMjNUMjYwIDEwMVQzMDQgOTJRMzYwIDkyIDM4NCAxMjNUNDE2IDIwNkw0MzIgMzE2Wk03MzcgNTE4SDY0M0w3MDYgNzAwSDg0NEw3MzcgNTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEwOyIgaG9yaXotYWR2LXg9IjcwNCIgZD0iTTcwMCA0MDdRNzAwIDMxMCA2NzIgMjM1VDU5MiAxMDdUNDY0IDI4VDI5MiAwSDc1TDExNSAyODlINDVMNjIgNDA4SDEzMkwxNjggNjYyUTIyNiA2NjcgMjgzIDY3MFQzOTkgNjc0UTQ2NSA2NzQgNTIwIDY1OVQ2MTUgNjExVDY3NyA1MjhUNzAwIDQwN1pNMzA3IDExNlEzNzMgMTE2IDQxOSAxMzZUNDk1IDE5NFQ1MzggMjgzVDU1MSA0MDBRNTUxIDU2MCAzODggNTYwUTM2NSA1NjAgMzQzIDU1OVQyOTcgNTU2TDI3NiA0MDhINDMwTDQxMyAyODlIMjU5TDIzNSAxMTdRMjUzIDExNiAyNzEgMTE2VDMwNyAxMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTE7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNDExIDBWNjdINDA3UTM3OSAyNiAzMzggOFQyNTAgLTExUTIwMSAtMTEgMTY3IDRUMTEyIDQ3VDgyIDExMFQ3MiAxODhRNzIgMjQyIDg1IDI5NlQxMjggMzk1VDIwNCA0NjhUMzE3IDQ5NlEzNTYgNDk2IDM4OSA0ODRUNDQzIDQzN0g0NDdMNDYyIDU0NUgzMjNMMzM2IDYzN0g0NzVMNDg0IDcwMEg2MjVMNjE2IDYzN0g2NzhMNjY1IDU0NUg2MDNMNTI3IDBINDExWk00MzAgMjk5UTQzNyAzNDcgNDEyIDM2N1QzNDIgMzg4UTMwMSAzODggMjc2IDM3MFQyMzggMzI0VDIxOSAyNjBUMjE0IDE5MFEyMTQgMTcwIDIxOCAxNTJUMjMyIDEyMVQyNjAgMTAwVDMwNCA5MlEzNjAgOTIgMzg0IDEyM1Q0MTYgMjA2TDQzMCAyOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTI7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMEwxNjYgNjY3SDYyMUw2MDQgNTQ1SDI5NUwyNzUgNDA0SDU1NUw1MzggMjgwSDI1OEwyMzUgMTE5SDU1NEw1MzggMEg3M1pNMjQwIDcyN0wyNTIgODE0SDU3NUw1NjMgNzI3SDI0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMzsiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01NzAgMzAzUTU3MCAyNTQgNTU4IDIwNkgyMDlRMjA4IDIwMSAyMDggMTk2VDIwNyAxODRRMjA3IDE1OCAyMTYgMTQxVDI0MiAxMTNUMjgwIDk5VDMyNCA5NVEzNjcgOTUgNDA0IDEwNlQ0NzkgMTM3TDUxMSA0M1E0NjAgMTYgNDEwIDNUMzAyIC0xMVEyNTEgLTExIDIwOSAxVDEzNyA0MFQ5MCAxMDVUNzMgMTk4UTczIDI2NCA5MyAzMjFUMTUxIDQyMlQyNDMgNDg5VDM2NiA1MTRRNDY0IDUxNCA1MTcgNDU3VDU3MCAzMDNaTTQ0NSAyOTVRNDQ2IDMwMSA0NDYgMzA3VDQ0NyAzMjFRNDQ3IDM2NiA0MjMgMzkwVDM1NCA0MTRRMjk4IDQxNCAyNjUgMzgyVDIyMyAyOTVINDQ1Wk0yMTcgNTg3TDIyOSA2NzRINTUyTDU0MCA1ODdIMjE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE0OyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTczIDBMMTY2IDY2N0g2MjFMNjA0IDU0NUgyOTVMMjc1IDQwNEg1NTVMNTM4IDI4MEgyNThMMjM1IDExOUg1NTRMNTM4IDBINzNaTTU4OCA4NDZRNTc3IDgwMSA1NTQgNzc0VDUwMyA3MzFUNDQ2IDcxMFQzOTMgNzA1UTM2OSA3MDUgMzQyIDcxMFQyOTIgNzMwVDI1NSA3NzNUMjQyIDg0NkgzMzlRMzM4IDgyMCAzNTIgNzk5VDQwNCA3NzhRNDQwIDc3OCA0NjIgNzk5VDQ5MCA4NDZINTg4SDU4OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNTsiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01NzAgMzAzUTU3MCAyNTQgNTU4IDIwNkgyMDlRMjA4IDIwMSAyMDggMTk2VDIwNyAxODRRMjA3IDE1OCAyMTYgMTQxVDI0MiAxMTNUMjgwIDk5VDMyNCA5NVEzNjcgOTUgNDA0IDEwNlQ0NzkgMTM3TDUxMSA0M1E0NjAgMTYgNDEwIDNUMzAyIC0xMVEyNTEgLTExIDIwOSAxVDEzNyA0MFQ5MCAxMDVUNzMgMTk4UTczIDI2NCA5MyAzMjFUMTUxIDQyMlQyNDMgNDg5VDM2NiA1MTRRNDY0IDUxNCA1MTcgNDU3VDU3MCAzMDNaTTQ0NSAyOTVRNDQ2IDMwMSA0NDYgMzA3VDQ0NyAzMjFRNDQ3IDM2NiA0MjMgMzkwVDM1NCA0MTRRMjk4IDQxNCAyNjUgMzgyVDIyMyAyOTVINDQ1Wk01NjkgNzA2UTU1OCA2NjEgNTM1IDYzNFQ0ODQgNTkxVDQyNyA1NzBUMzc0IDU2NVEzNTAgNTY1IDMyMyA1NzBUMjczIDU5MFQyMzYgNjMzVDIyMyA3MDZIMzIwUTMxOSA2ODAgMzMzIDY1OVQzODUgNjM4UTQyMSA2MzggNDQzIDY1OVQ0NzEgNzA2SDU2OUg1NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTY7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMEwxNjYgNjY3SDYyMUw2MDQgNTQ1SDI5NUwyNzUgNDA0SDU1NUw1MzggMjgwSDI1OEwyMzUgMTE5SDU1NEw1MzggMEg3M1pNNTA5IDc5M1E1MDkgNzU0IDQ4MCA3MzNUNDE1IDcxMlE0MDEgNzEyIDM4OCA3MTVUMzY0IDcyNlQzNDcgNzQ0VDM0MCA3NzFRMzQwIDc5MSAzNDggODA2VDM2OSA4MzFUNDAwIDg0NlQ0MzUgODUxUTQ2MyA4NTEgNDg2IDgzOFQ1MDkgNzkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE3OyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTU3MCAzMDNRNTcwIDI1NCA1NTggMjA2SDIwOVEyMDggMjAxIDIwOCAxOTZUMjA3IDE4NFEyMDcgMTU4IDIxNiAxNDFUMjQyIDExM1QyODAgOTlUMzI0IDk1UTM2NyA5NSA0MDQgMTA2VDQ3OSAxMzdMNTExIDQzUTQ2MCAxNiA0MTAgM1QzMDIgLTExUTI1MSAtMTEgMjA5IDFUMTM3IDQwVDkwIDEwNVQ3MyAxOThRNzMgMjY0IDkzIDMyMVQxNTEgNDIyVDI0MyA0ODlUMzY2IDUxNFE0NjQgNTE0IDUxNyA0NTdUNTcwIDMwM1pNNDQ1IDI5NVE0NDYgMzAxIDQ0NiAzMDdUNDQ3IDMyMVE0NDcgMzY2IDQyMyAzOTBUMzU0IDQxNFEyOTggNDE0IDI2NSAzODJUMjIzIDI5NUg0NDVaTTQ2OSA2NTBRNDY5IDYxMSA0NDAgNTkwVDM3NSA1NjlRMzYxIDU2OSAzNDggNTcyVDMyNCA1ODNUMzA3IDYwMVQzMDAgNjI4UTMwMCA2NDggMzA4IDY2M1QzMjkgNjg4VDM2MCA3MDNUMzk1IDcwOFE0MjMgNzA4IDQ0NiA2OTVUNDY5IDY1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExODsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik00ODEgMFE0NjcgLTkgNDUxIC0yMVQ0MjIgLTQ4VDQwMCAtODBUMzkxIC0xMTZRMzkxIC0xMzQgNDAyIC0xNDVUNDMyIC0xNTZRNDQ5IC0xNTYgNDYwIC0xNTJUNDg3IC0xNDFMNDk5IC0yMTlRNDc3IC0yMjkgNDQ4IC0yMzVUMzk1IC0yNDFRMzUxIC0yNDEgMzIwIC0yMjFUMjg5IC0xNTNRMjg5IC05OCAzMjIgLTYxVDQwMCAwSDczTDE2NiA2NjdINjIxTDYwNCA1NDVIMjk1TDI3NSA0MDRINTU1TDUzOCAyODBIMjU4TDIzNSAxMTlINTU0TDUzOCAwSDQ4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExOTsiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01NzAgMzAzUTU3MCAyNTQgNTU4IDIwNkgyMDlRMjA4IDIwMSAyMDggMTk2VDIwNyAxODRRMjA3IDE1OCAyMTYgMTQxVDI0MiAxMTNUMjgwIDk5VDMyNCA5NVEzNjcgOTUgNDA0IDEwNlQ0NzkgMTM3TDUxMSA0M1E0OTAgMzIgNDYzIDIwVDQxMyAtOFQzNzMgLTQ1VDM1NiAtOTZRMzU2IC0xMTQgMzY2IC0xMjdUMzk3IC0xNDFRNDE0IC0xNDEgNDI2IC0xMzdUNDUyIC0xMjVMNDY0IC0yMDRRNDQyIC0yMTMgNDEzIC0yMTlUMzYwIC0yMjVRMzE1IC0yMjUgMjg1IC0yMDVUMjU0IC0xMzZRMjU0IC05NyAyNzYgLTY3VDMyNyAtMTJMMzI2IC05UTMxNSAtMTEgMzA1IC0xMVQyODUgLTExUTIzNyAtMTEgMTk4IDJUMTMyIDQyVDg5IDEwN1Q3MyAxOTZRNzMgMjYyIDkzIDMyMFQxNTAgNDIxVDI0MiA0ODlUMzY2IDUxNFE0NjQgNTE0IDUxNyA0NTdUNTcwIDMwM1pNNDQ2IDI5MlE0NDcgMjk4IDQ0NyAzMDNUNDQ4IDMxNVE0NDggMzYwIDQyMyAzODVUMzUzIDQxMVEyOTggNDExIDI2NCAzNzhUMjIyIDI5Mkg0NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUE7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNzMgMEwxNjYgNjY3SDYyMUw2MDQgNTQ1SDI5NUwyNzUgNDA0SDU1NUw1MzggMjgwSDI1OEwyMzUgMTE5SDU1NEw1MzggMEg3M1pNNTgxIDgwMkwzOTkgNzA1TDI0MyA4MDJMMzA2IDg3N0w0MTEgODA4TDUzOCA4NzdMNTgxIDgwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQjsiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik01NzAgMzAzUTU3MCAyNTQgNTU4IDIwNkgyMDlRMjA4IDIwMSAyMDggMTk2VDIwNyAxODRRMjA3IDE1OCAyMTYgMTQxVDI0MiAxMTNUMjgwIDk5VDMyNCA5NVEzNjcgOTUgNDA0IDEwNlQ0NzkgMTM3TDUxMSA0M1E0NjAgMTYgNDEwIDNUMzAyIC0xMVEyNTEgLTExIDIwOSAxVDEzNyA0MFQ5MCAxMDVUNzMgMTk4UTczIDI2NCA5MyAzMjFUMTUxIDQyMlQyNDMgNDg5VDM2NiA1MTRRNDY0IDUxNCA1MTcgNDU3VDU3MCAzMDNaTTQ0NSAyOTVRNDQ2IDMwMSA0NDYgMzA3VDQ0NyAzMjFRNDQ3IDM2NiA0MjMgMzkwVDM1NCA0MTRRMjk4IDQxNCAyNjUgMzgyVDIyMyAyOTVINDQ1Wk01NTkgNjYyTDM3NyA1NjVMMjIxIDY2MkwyODQgNzM3TDM4OSA2NjhMNTE2IDczN0w1NTkgNjYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFDOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTQwMiAxMDBRNDgzIDEwMCA1MjUgMTM5VDU3NSAyNThINDE3TDQzMyAzNzVINzI4TDcxOCAzMDNRNzA3IDIyOCA2ODMgMTcwVDYxOCA3MlQ1MTkgMTFUMzgxIC0xMFEzMTYgLTEwIDI2NCA4VDE3NSA2MFQxMTcgMTQ2VDk3IDI2M1E5NyAzNDggMTIzIDQyNFQxOTggNTU2VDMxNyA2NDVUNDc3IDY3OFE1NDggNjc4IDYwNSA2NTRUNzA5IDU3NUw2MDggNDgyUTU4MCA1MTQgNTQ2IDUzNFQ0NjYgNTU1UTQwNCA1NTUgMzYyIDUzMFQyOTUgNDY1VDI2MCAzNzJUMjQ5IDI2NlEyNDkgMTg4IDI4NCAxNDRUNDAyIDEwMFpNNTkxIDcwMUw0NzcgNzc1TDMzOSA3MDFMMjk0IDc4MEw0ODkgODc4TDY1OSA3ODBMNTkxIDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRDsiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik01MjUgLTEzUTUxNSAtODQgNDkzIC0xMjZUNDM5IC0xOTBUMzY3IC0yMTlUMjc5IC0yMjZRMjA1IC0yMjYgMTUyIC0yMTNUNTAgLTE3MEwxMDUgLTY2UTE0NSAtOTIgMTg1IC0xMDVUMjc2IC0xMTlRMzI2IC0xMTkgMzUwIC0xMDFUMzgyIC0yOUwzOTYgNzFIMzkyUTM3NiA1MSAzNjEgMzhUMzMwIDE4VDI5NiA3VDI1NSAzUTIwNyAzIDE3MyAxOFQxMTYgNTlUODQgMTIxVDczIDIwMFE3MyAyNTIgODcgMzA3VDEzMSA0MDlUMjA5IDQ4NFQzMjQgNTEzUTM3MiA1MTMgNDAzIDUwMFQ0NTUgNDQ0SDQ1OUw0NzUgNTAySDU5N0w1MjUgLTEzWk00MzEgMzEyUTQzOCAzNjEgNDE2IDM4M1QzNDYgNDA1UTMwOCA0MDUgMjg0IDM4OFQyNDUgMzQzVDIyNCAyODJUMjE4IDIxNVEyMTggMTkzIDIyMiAxNzRUMjM2IDE0MVQyNjIgMTE4VDMwNSAxMDlRMzM0IDEwOSAzNTQgMTE3VDM4NyAxNDFUNDA4IDE3N1Q0MTkgMjI1TDQzMSAzMTJaTTQ5NiA1NjFMMzgyIDYzNUwyNDQgNTYxTDE5OSA2NDBMMzk0IDczOEw1NjQgNjQwTDQ5NiA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNDAyIDEwMFE0ODMgMTAwIDUyNSAxMzlUNTc1IDI1OEg0MTdMNDMzIDM3NUg3MjhMNzE4IDMwM1E3MDcgMjI4IDY4MyAxNzBUNjE4IDcyVDUxOSAxMVQzODEgLTEwUTMxNiAtMTAgMjY0IDhUMTc1IDYwVDExNyAxNDZUOTcgMjYzUTk3IDM0OCAxMjMgNDI0VDE5OCA1NTZUMzE3IDY0NVQ0NzcgNjc4UTU0OCA2NzggNjA1IDY1NFQ3MDkgNTc1TDYwOCA0ODJRNTgwIDUxNCA1NDYgNTM0VDQ2NiA1NTVRNDA0IDU1NSAzNjIgNTMwVDI5NSA0NjVUMjYwIDM3MlQyNDkgMjY2UTI0OSAxODggMjg0IDE0NFQ0MDIgMTAwWk02NzMgODU1UTY2MiA4MTAgNjM5IDc4M1Q1ODggNzQwVDUzMSA3MTlUNDc4IDcxNFE0NTQgNzE0IDQyNyA3MTlUMzc3IDczOVQzNDAgNzgyVDMyNyA4NTVINDI0UTQyMyA4MjkgNDM3IDgwOFQ0ODkgNzg3UTUyNSA3ODcgNTQ3IDgwOFQ1NzUgODU1SDY3M0g2NzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUY7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTI1IC0xM1E1MTUgLTg0IDQ5MyAtMTI2VDQzOSAtMTkwVDM2NyAtMjE5VDI3OSAtMjI2UTIwNSAtMjI2IDE1MiAtMjEzVDUwIC0xNzBMMTA1IC02NlExNDUgLTkyIDE4NSAtMTA1VDI3NiAtMTE5UTMyNiAtMTE5IDM1MCAtMTAxVDM4MiAtMjlMMzk2IDcxSDM5MlEzNzYgNTEgMzYxIDM4VDMzMCAxOFQyOTYgN1QyNTUgM1EyMDcgMyAxNzMgMThUMTE2IDU5VDg0IDEyMVQ3MyAyMDBRNzMgMjUyIDg3IDMwN1QxMzEgNDA5VDIwOSA0ODRUMzI0IDUxM1EzNzIgNTEzIDQwMyA1MDBUNDU1IDQ0NEg0NTlMNDc1IDUwMkg1OTdMNTI1IC0xM1pNNDMxIDMxMlE0MzggMzYxIDQxNiAzODNUMzQ2IDQwNVEzMDggNDA1IDI4NCAzODhUMjQ1IDM0M1QyMjQgMjgyVDIxOCAyMTVRMjE4IDE5MyAyMjIgMTc0VDIzNiAxNDFUMjYyIDExOFQzMDUgMTA5UTMzNCAxMDkgMzU0IDExN1QzODcgMTQxVDQwOCAxNzdUNDE5IDIyNUw0MzEgMzEyWk01NzIgNzA2UTU2MSA2NjEgNTM4IDYzNFQ0ODcgNTkxVDQzMCA1NzBUMzc3IDU2NVEzNTMgNTY1IDMyNiA1NzBUMjc2IDU5MFQyMzkgNjMzVDIyNiA3MDZIMzIzUTMyMiA2ODAgMzM2IDY1OVQzODggNjM4UTQyNCA2MzggNDQ2IDY1OVQ0NzQgNzA2SDU3Mkg1NzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjA7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNDAyIDEwMFE0ODMgMTAwIDUyNSAxMzlUNTc1IDI1OEg0MTdMNDMzIDM3NUg3MjhMNzE4IDMwM1E3MDcgMjI4IDY4MyAxNzBUNjE4IDcyVDUxOSAxMVQzODEgLTEwUTMxNiAtMTAgMjY0IDhUMTc1IDYwVDExNyAxNDZUOTcgMjYzUTk3IDM0OCAxMjMgNDI0VDE5OCA1NTZUMzE3IDY0NVQ0NzcgNjc4UTU0OCA2NzggNjA1IDY1NFQ3MDkgNTc1TDYwOCA0ODJRNTgwIDUxNCA1NDYgNTM0VDQ2NiA1NTVRNDA0IDU1NSAzNjIgNTMwVDI5NSA0NjVUMjYwIDM3MlQyNDkgMjY2UTI0OSAxODggMjg0IDE0NFQ0MDIgMTAwWk01NzIgNzk3UTU3MiA3NTggNTQzIDczN1Q0NzggNzE2UTQ2NCA3MTYgNDUxIDcxOVQ0MjcgNzMwVDQxMCA3NDhUNDAzIDc3NVE0MDMgNzk1IDQxMSA4MTBUNDMyIDgzNVQ0NjMgODUwVDQ5OCA4NTVRNTI2IDg1NSA1NDkgODQyVDU3MiA3OTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjE7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTI1IC0xM1E1MTUgLTg0IDQ5MyAtMTI2VDQzOSAtMTkwVDM2NyAtMjE5VDI3OSAtMjI2UTIwNSAtMjI2IDE1MiAtMjEzVDUwIC0xNzBMMTA1IC02NlExNDUgLTkyIDE4NSAtMTA1VDI3NiAtMTE5UTMyNiAtMTE5IDM1MCAtMTAxVDM4MiAtMjlMMzk2IDcxSDM5MlEzNzYgNTEgMzYxIDM4VDMzMCAxOFQyOTYgN1QyNTUgM1EyMDcgMyAxNzMgMThUMTE2IDU5VDg0IDEyMVQ3MyAyMDBRNzMgMjUyIDg3IDMwN1QxMzEgNDA5VDIwOSA0ODRUMzI0IDUxM1EzNzIgNTEzIDQwMyA1MDBUNDU1IDQ0NEg0NTlMNDc1IDUwMkg1OTdMNTI1IC0xM1pNNDMxIDMxMlE0MzggMzYxIDQxNiAzODNUMzQ2IDQwNVEzMDggNDA1IDI4NCAzODhUMjQ1IDM0M1QyMjQgMjgyVDIxOCAyMTVRMjE4IDE5MyAyMjIgMTc0VDIzNiAxNDFUMjYyIDExOFQzMDUgMTA5UTMzNCAxMDkgMzU0IDExN1QzODcgMTQxVDQwOCAxNzdUNDE5IDIyNUw0MzEgMzEyWk00NzAgNjUwUTQ3MCA2MTEgNDQxIDU5MFQzNzYgNTY5UTM2MiA1NjkgMzQ5IDU3MlQzMjUgNTgzVDMwOCA2MDFUMzAxIDYyOFEzMDEgNjQ4IDMwOSA2NjNUMzMwIDY4OFQzNjEgNzAzVDM5NiA3MDhRNDI0IDcwOCA0NDcgNjk1VDQ3MCA2NTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjI7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNDAyIDEwMFE0ODMgMTAwIDUyNSAxMzlUNTc1IDI1OEg0MTdMNDMzIDM3NUg3MjhMNzE4IDMwM1E3MDcgMjI4IDY4MyAxNzBUNjE4IDcyVDUxOSAxMVQzODEgLTEwUTMxNiAtMTAgMjY0IDhUMTc1IDYwVDExNyAxNDZUOTcgMjYzUTk3IDM0OCAxMjMgNDI0VDE5OCA1NTZUMzE3IDY0NVQ0NzcgNjc4UTU0OCA2NzggNjA1IDY1NFQ3MDkgNTc1TDYwOCA0ODJRNTgwIDUxNCA1NDYgNTM0VDQ2NiA1NTVRNDA0IDU1NSAzNjIgNTMwVDI5NSA0NjVUMjYwIDM3MlQyNDkgMjY2UTI0OSAxODggMjg0IDE0NFQ0MDIgMTAwWk0zNTMgLTIyNkgyNTdMMzE0IC01NUg0NjNMMzUzIC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjM7IiBob3Jpei1hZHYteD0iNTkwIiBkPSJNNTI1IC0xM1E1MTUgLTg0IDQ5MyAtMTI2VDQzOSAtMTkwVDM2NyAtMjE5VDI3OSAtMjI2UTIwNSAtMjI2IDE1MiAtMjEzVDUwIC0xNzBMMTA1IC02NlExNDUgLTkyIDE4NSAtMTA1VDI3NiAtMTE5UTMyNiAtMTE5IDM1MCAtMTAxVDM4MiAtMjlMMzk2IDcxSDM5MlEzNzYgNTEgMzYxIDM4VDMzMCAxOFQyOTYgN1QyNTUgM1EyMDcgMyAxNzMgMThUMTE2IDU5VDg0IDEyMVQ3MyAyMDBRNzMgMjUyIDg3IDMwN1QxMzEgNDA5VDIwOSA0ODRUMzI0IDUxM1EzNzIgNTEzIDQwMyA1MDBUNDU1IDQ0NEg0NTlMNDc1IDUwMkg1OTdMNTI1IC0xM1pNNDMxIDMxMlE0MzggMzYxIDQxNiAzODNUMzQ2IDQwNVEzMDggNDA1IDI4NCAzODhUMjQ1IDM0M1QyMjQgMjgyVDIxOCAyMTVRMjE4IDE5MyAyMjIgMTc0VDIzNiAxNDFUMjYyIDExOFQzMDUgMTA5UTMzNCAxMDkgMzU0IDExN1QzODcgMTQxVDQwOCAxNzdUNDE5IDIyNUw0MzEgMzEyWk00MTMgNzMwSDUwMkw0NDggNTY4SDMwMUw0MTMgNzMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI0OyIgaG9yaXotYWR2LXg9IjY5NCIgZD0iTTQ3NSAwTDUxNCAyODNIMjU4TDIxOSAwSDczTDE2NiA2NjdIMzEyTDI3OCA0MjBINTM0TDU2OCA2NjdINzE0TDYyMSAwSDQ3NVpNNTc3IDcwMUw0NjMgNzc1TDMyNSA3MDFMMjgwIDc4MEw0NzUgODc4TDY0NSA3ODBMNTc3IDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNTsiIGhvcml6LWFkdi14PSI1OTMiIGQ9Ik0zODkgMEw0MjggMjgxUTQzMCAyOTQgNDMxIDMwNVQ0MzIgMzI3UTQzMiAzNTkgNDE3IDM3N1QzNTggMzk1UTI1OSAzOTUgMjQ2IDMwMEwyMDQgMEg2M0wxNjEgNzAwSDMwMkwyNjcgNDUzSDI3MVEzMDAgNDg3IDMzNyA1MDBUNDE5IDUxM1E1MDUgNTEzIDU0MCA0NzNUNTc2IDM2MVE1NzYgMzQ3IDU3NSAzMzNUNTcyIDMwM0w1MzAgMEgzODlaTTM2MCA3MDlMMjQ2IDc4M0wxMDggNzA5TDYzIDc4OEwyNTggODg2TDQyOCA3ODhMMzYwIDcwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNjsiIGhvcml6LWFkdi14PSI2OTQiIGQ9Ik00NzUgMEw1MTQgMjgzSDI1OEwyMTkgMEg3M0wxMzkgNDc2SDU3TDczIDU4NUgxNTVMMTY2IDY2N0gzMTJMMzAxIDU4NUg1NTdMNTY4IDY2N0g3MTRMNzAzIDU4NUg3ODVMNzY5IDQ3Nkg2ODdMNjIxIDBINDc1Wk01MzEgNDAxTDU0MSA0NzZIMjg1TDI3NSA0MDFINTMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI3OyIgaG9yaXotYWR2LXg9IjU5MyIgZD0iTTI4MCA1NDdMMjY0IDQzMkgyNjhRMjk4IDQ2NiAzMzQgNDc5VDQxNiA0OTNRNTAyIDQ5MyA1MzcgNDUyVDU3MyAzNDBRNTczIDMyNiA1NzIgMzEyVDU2OSAyODJMNTMwIDBIMzg4TDQyNCAyNjBRNDI2IDI3MyA0MjcgMjg1VDQyOCAzMDhRNDI4IDMzOSA0MTQgMzU2VDM1NSAzNzRRMjU2IDM3NCAyNDMgMjgwTDIwNCAwSDYzTDEzOSA1NDdINzdMOTAgNjM3SDE1MkwxNjEgNzAwSDMwMkwyOTMgNjM3SDQ1M0w0NDAgNTQ3SDI4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyODsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwTDE2NiA2NjdIMzEyTDIxOSAwSDczWk00NDQgNzk1UTQyMyA3NTAgMzg4IDcyOVQzMTggNzA3UTI5NSA3MDcgMjc4IDcxM1QyNDUgNzI4VDIxNiA3NDNUMTg3IDc1MFExNzAgNzUwIDE1MiA3NDFUMTIwIDcwNkw2MiA3NTlROTEgODA5IDEyMSA4MjdUMTg3IDg0NlEyMDggODQ2IDIyNSA4MzlUMjU4IDgyNFQyODggODA5VDMxOSA4MDJRMzM2IDgwMiAzNTMgODExVDM4NCA4NDZMNDQ0IDc5NUg0NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjk7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNNjMgMEwxMzMgNTAySDI3NEwyMDQgMEg2M1pNNDEzIDY1NVEzOTIgNjEwIDM1NyA1ODlUMjg3IDU2N1EyNjQgNTY3IDI0NyA1NzNUMjE0IDU4OFQxODUgNjAzVDE1NiA2MTBRMTM5IDYxMCAxMjEgNjAxVDg5IDU2NkwzMSA2MTlRNjAgNjY5IDkwIDY4N1QxNTYgNzA2UTE3NyA3MDYgMTk0IDY5OVQyMjcgNjg0VDI1NyA2NjlUMjg4IDY2MlEzMDUgNjYyIDMyMiA2NzFUMzUzIDcwNkw0MTMgNjU1SDQxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQTsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik03MyAwTDE2NiA2NjdIMzEyTDIxOSAwSDczWk04NyA3MjdMOTkgODE0SDQyMkw0MTAgNzI3SDg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJCOyIgaG9yaXotYWR2LXg9IjI2NyIgZD0iTTYzIDBMMTMzIDUwMkgyNzRMMjA0IDBINjNaTTUyIDU4N0w2NCA2NzRIMzg3TDM3NSA1ODdINTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkM7IiBob3Jpei1hZHYteD0iMjkyIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMTkgMEg3M1pNNDM3IDg0NlE0MjYgODAxIDQwMyA3NzRUMzUyIDczMVQyOTUgNzEwVDI0MiA3MDVRMjE4IDcwNSAxOTEgNzEwVDE0MSA3MzBUMTA0IDc3M1Q5MSA4NDZIMTg4UTE4NyA4MjAgMjAxIDc5OVQyNTMgNzc4UTI4OSA3NzggMzExIDc5OVQzMzkgODQ2SDQzN0g0MzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkQ7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNNjMgMEwxMzMgNTAySDI3NEwyMDQgMEg2M1pNNDA3IDcwNlEzOTYgNjYxIDM3MyA2MzRUMzIyIDU5MVQyNjUgNTcwVDIxMiA1NjVRMTg4IDU2NSAxNjEgNTcwVDExMSA1OTBUNzQgNjMzVDYxIDcwNkgxNThRMTU3IDY4MCAxNzEgNjU5VDIyMyA2MzhRMjU5IDYzOCAyODEgNjU5VDMwOSA3MDZINDA3SDQwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRTsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik0xODIgMFExNjggLTkgMTUyIC0yMVQxMjMgLTQ4VDEwMCAtODBUOTEgLTExNlE5MSAtMTM1IDEwMiAtMTQ1VDEzMyAtMTU2UTE1MCAtMTU2IDE2MSAtMTUyVDE4NyAtMTQxTDE5OSAtMjE5UTE4OSAtMjI0IDE3NSAtMjI4VDE0NyAtMjM1VDExOCAtMjM5VDkyIC0yNDFRNDcgLTI0MSAxOCAtMjIxVC0xMSAtMTUyUS0xMSAtMTI0IC0yIC0xMDJUMjMgLTYxVDYwIC0yN1QxMDQgMEg3M0wxNjYgNjY3SDMxMkwyMTkgMEgxODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkY7IiBob3Jpei1hZHYteD0iMjY3IiBkPSJNMTcyIDBRMTU4IC05IDE0MiAtMjFUMTEzIC00OFQ5MCAtODBUODEgLTExNlE4MSAtMTM1IDkyIC0xNDVUMTIzIC0xNTZRMTQwIC0xNTYgMTUxIC0xNTJUMTc3IC0xNDFMMTg5IC0yMTlRMTY3IC0yMjggMTM4IC0yMzRUODYgLTI0MVE0MiAtMjQxIDExIC0yMjFULTIwIC0xNTFRLTIwIC0xMjUgLTEwIC0xMDNUMTUgLTYxVDUxIC0yN1Q5MyAwSDYzTDEzMyA1MDJIMjc0TDIwNCAwSDE3MlpNMzA3IDY0NFEzMDcgNjA0IDI3OCA1ODRUMjEzIDU2NFExODQgNTY0IDE2MSA1NzhUMTM3IDYyNFExMzcgNjQzIDE0NSA2NThUMTY2IDY4M1QxOTcgNjk4VDIzMiA3MDNRMjYwIDcwMyAyODMgNjg5VDMwNyA2NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzA7IiBob3Jpei1hZHYteD0iMjkyIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMTkgMEg3M1pNMzQyIDc5N1EzNDIgNzU4IDMxMyA3MzdUMjQ4IDcxNlEyMzQgNzE2IDIyMSA3MTlUMTk3IDczMFQxODAgNzQ4VDE3MyA3NzVRMTczIDc5NSAxODEgODEwVDIwMiA4MzVUMjMzIDg1MFQyNjggODU1UTI5NiA4NTUgMzE5IDg0MlQzNDIgNzk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMxOyIgaG9yaXotYWR2LXg9IjI2NyIgZD0iTTYzIDBMMTMzIDUwMkgyNzRMMjA0IDBINjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzI7IiBob3Jpei1hZHYteD0iNzMxIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMTkgMEg3M1pNNjkwIDIyOFE2ODIgMTc2IDY2OSAxMzJUNjI5IDU2VDU2MSA1VDQ1NyAtMTNRNDAwIC0xMyAzNTkgMlQyNzkgNTNMMzU5IDE2MFEzODUgMTMxIDQwNyAxMjFUNDYwIDExMVE0OTIgMTExIDUxMiAxMzBUNTM5IDE5N0w2MDUgNjY3SDc1MUw2OTAgMjI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMzOyIgaG9yaXotYWR2LXg9IjUzOCIgZD0iTTY1IDBMMTM1IDUwMkgyNzZMMjA2IDBINjVaTTMwOSA2NDNRMzA5IDYyMyAzMDEgNjA5VDI4MCA1ODRUMjQ5IDU2OVQyMTQgNTY0UTE4NSA1NjQgMTYyIDU3OFQxMzggNjI0UTEzOCA2NDMgMTQ2IDY1OFQxNjcgNjgzVDE5OCA2OThUMjMzIDcwM1EyNjEgNzAzIDI4NSA2ODlUMzA5IDY0M1pNNTc3IDY0NFE1NzcgNjI0IDU2OSA2MDlUNTQ4IDU4NFQ1MTggNTY5VDQ4MiA1NjRRNDY4IDU2NCA0NTUgNTY3VDQzMCA1NzhUNDEzIDU5NlQ0MDYgNjIzUTQwNiA2NDMgNDE0IDY1OFQ0MzUgNjgzVDQ2NiA2OThUNTAxIDcwM1E1MjkgNzAzIDU1MyA2OTBUNTc3IDY0NFpNNDcyIC0xN1E0NTggLTEyMCA0MDEgLTE3M1QyMzggLTIyNlEyMTcgLTIyNiAxOTcgLTIyNVQxNTUgLTIyMUwxNzIgLTEwM1EyMDUgLTEwNiAyMzggLTEwNlEyNjcgLTEwNiAyODQgLTk5VDMxMiAtNzlUMzI2IC00NlQzMzQgMEw0MDQgNTAySDU0NUw0NzIgLTE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgaG9yaXotYWR2LXg9IjQ5MCIgZD0iTTQ0OSAyMjhRNDQxIDE3NiA0MjggMTMyVDM4OCA1NlQzMjAgNVQyMTYgLTEzUTE1OSAtMTMgMTE4IDJUMzggNTNMMTE4IDE2MFExNDQgMTMxIDE2NiAxMjFUMjE5IDExMVEyNTEgMTExIDI3MSAxMzBUMjk4IDE5N0wzNjQgNjY3SDUxMEw0NDkgMjI4SDQ0OVpNNTY2IDcwMUw0NTIgNzc1TDMxNCA3MDFMMjY5IDc4MEw0NjQgODc4TDYzNCA3ODBMNTY2IDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGhvcml6LWFkdi14PSIyNzQiIGQ9Ik0yMDggLTE3UTE3OCAtMjI2IC0yNiAtMjI2US00OCAtMjI2IC02OCAtMjI1VC0xMDkgLTIyMUwtOTIgLTEwM1EtNTkgLTEwNiAtMjYgLTEwNlEyIC0xMDYgMTkgLTEwMFQ0NyAtODBUNjEgLTQ3VDcwIDBMMTQwIDUwMkgyODFMMjA4IC0xN1pNMzQ3IDU2MUwyMzMgNjM1TDk1IDU2MUw1MCA2NDBMMjQ1IDczOEw0MTUgNjQwTDM0NyA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzY7IiBob3Jpei1hZHYteD0iNjQ0IiBkPSJNNDUxIDBMMzA5IDI3OUwyNTAgMjIzTDIxOSAwSDczTDE2NiA2NjdIMzEyTDI3MyAzODlIMjc3TDUyMSA2NjdINzA1TDQzMiAzNzZMNjM3IDBINDUxWk0yOTEgLTIyNkgxOTVMMjUyIC01NUg0MDFMMjkxIC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzc7IiBob3Jpei1hZHYteD0iNTU1IiBkPSJNMzgwIDBMMjgyIDIxNEwyMjYgMTYyTDIwNCAwSDYzTDE2MSA3MDBIMzAyTDI0OCAzMTRIMjUyTDQzMyA1MDJINjA4TDM5NiAzMDFMNTUxIDBIMzgwWk0yNTEgLTIyNkgxNTVMMjEyIC01NUgzNjFMMjUxIC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzk7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMzYgMTIzSDUxOUw1MDIgMEg3M1pNMjQ4IDcwNUwxNzAgNzUwTDMyOCA4ODJMNDYwIDgyM0wyNDggNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNBOyIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI4OCAwUTI0OSAtNiAxODUgLTZRMTI1IC02IDEwMCAxMlQ3NSA3NVE3NSA4OSA3OCAxMDlMMTYxIDcwMEgzMDJMMjIzIDE0MlEyMjAgMTE5IDIyNyAxMTRUMjU0IDEwOUgzMDNMMjg4IDBIMjg4Wk0yNDEgNzM1TDE2MyA3ODBMMzIxIDkxMkw0NTMgODUzTDI0MSA3MzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0I7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMzYgMTIzSDUxOUw1MDIgMEg3M1pNMjM5IC0yMjZIMTQzTDIwMCAtNTVIMzQ5TDIzOSAtMjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNDOyIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI4OCAwUTI0OSAtNiAxODUgLTZRMTI1IC02IDEwMCAxMlQ3NSA3NVE3NSA4OSA3OCAxMDlMMTYxIDcwMEgzMDJMMjIzIDE0MlEyMjAgMTE5IDIyNyAxMTRUMjU0IDEwOUgzMDNMMjg4IDBIMjg4Wk0xNzEgLTIyNkg3NUwxMzIgLTU1SDI4MUwxNzEgLTIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRDsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik03MyAwTDE2NiA2NjdIMzEyTDIzNiAxMjNINTE5TDUwMiAwSDczWk01MzQgNTE4SDQ0MEw1MDMgNzAwSDY0MUw1MzQgNTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNFOyIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI4OCAwUTI0OSAtNiAxODUgLTZRMTI1IC02IDEwMCAxMlQ3NSA3NVE3NSA4OSA3OCAxMDlMMTYxIDcwMEgzMDJMMjIzIDE0MlEyMjAgMTE5IDIyNyAxMTRUMjU0IDEwOUgzMDNMMjg4IDBaTTQyNCA1MThIMzMwTDM5MyA3MDBINTMxTDQyNCA1MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzMgMEwxNjYgNjY3SDMxMkwyMzYgMTIzSDUxOUw1MDIgMEg3M1pNNTcxIDMzMFE1NzEgMzExIDU2MSAyOTZUNTM2IDI3MVQ1MDIgMjU2VDQ2NyAyNTFRNDUzIDI1MSA0MzggMjU0VDQxMSAyNjZUMzkyIDI4NVQzODQgMzE0UTM4NCAzMzMgMzkzIDM0OFQ0MTggMzczVDQ1MSAzODlUNDg3IDM5NFE1MDEgMzk0IDUxNiAzOTBUNTQzIDM3OVQ1NjMgMzU5VDU3MSAzMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDA7IiBob3Jpei1hZHYteD0iNDQzIiBkPSJNMjg4IDBRMjQ5IC02IDE4NSAtNlExMjUgLTYgMTAwIDEyVDc1IDc1UTc1IDg5IDc4IDEwOUwxNjEgNzAwSDMwMkwyMjMgMTQyUTIyMCAxMTkgMjI3IDExNFQyNTQgMTA5SDMwM0wyODggMFpNNDg1IDI0OVE0ODUgMjMwIDQ3NSAyMTVUNDUwIDE5MFQ0MTYgMTc1VDM4MSAxNzBRMzY3IDE3MCAzNTIgMTczVDMyNSAxODVUMzA2IDIwNFQyOTggMjMzUTI5OCAyNTIgMzA3IDI2N1QzMzIgMjkyVDM2NSAzMDhUNDAxIDMxM1E0MTUgMzEzIDQzMCAzMDlUNDU3IDI5OFQ0NzcgMjc4VDQ4NSAyNDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDE7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNzQgMEwxMTEgMjY5TDQwIDIyOEw1NSAzNDFMMTI3IDM4M0wxNjcgNjY3SDMxM0wyODYgNDc0TDQ3OCA1ODVMNDYxIDQ2NkwyNjkgMzU0TDIzNiAxMjNINTE5TDUwMyAwSDc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQyOyIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI5MCAzNjZMMjU4IDE0MlEyNTUgMTE5IDI2MSAxMTRUMjg5IDEwOUgzMzhMMzIyIC0yUTMwMiAtNSAyNzkgLTdUMjE5IC05UTE1OSAtOSAxMzUgMTBUMTEwIDczUTExMCA4OSAxMTMgMTA5TDEzNyAyODJMNzUgMjQ0TDkxIDM1N0wxNTMgMzk2TDE5NiA3MDBIMzM3TDMwNSA0NzVMNDA5IDUzN0wzOTQgNDI4TDI5MCAzNjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDM7IiBob3Jpei1hZHYteD0iNzMxIiBkPSJNNTMyIDBMMjc4IDQyNUgyNzRMMjE1IDBINzNMMTY2IDY2N0gzMDFMNTQ2IDI0OUg1NTFMNjEwIDY2N0g3NTFMNjU4IDBINTMyWk00NjkgNzA1TDM5MSA3NTBMNTQ5IDg4Mkw2ODEgODIzTDQ2OSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDQ7IiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBMNDI4IDI4MVE0MzAgMjkzIDQzMSAzMDNUNDMyIDMyNFE0MzIgMzU2IDQxNyAzNzVUMzU3IDM5NVEyNTkgMzk1IDI0NiAzMDBMMjA0IDBINjNMMTMzIDUwMkgyNTRMMjU2IDQ0MkgyNjBRMjkzIDQ4MiAzMzAgNDk3VDQxOCA1MTNRNTA1IDUxMyA1NDAgNDczVDU3NiAzNjFRNTc2IDM0NyA1NzUgMzMzVDU3MiAzMDNMNTMwIDBIMzg5Wk0zODYgNTY1TDMwOCA2MTBMNDY2IDc0Mkw1OTggNjgzTDM4NiA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDU7IiBob3Jpei1hZHYteD0iNzMxIiBkPSJNNTMyIDBMMjc4IDQyNUgyNzRMMjE1IDBINzNMMTY2IDY2N0gzMDFMNTQ2IDI0OUg1NTFMNjEwIDY2N0g3NTFMNjU4IDBINTMyWk0zMjYgLTIyNkgyMzBMMjg3IC01NUg0MzZMMzI2IC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDY7IiBob3Jpei1hZHYteD0iNTkzIiBkPSJNMzg5IDBMNDI4IDI4MVE0MzAgMjkzIDQzMSAzMDNUNDMyIDMyNFE0MzIgMzU2IDQxNyAzNzVUMzU3IDM5NVEyNTkgMzk1IDI0NiAzMDBMMjA0IDBINjNMMTMzIDUwMkgyNTRMMjU2IDQ0MkgyNjBRMjkzIDQ4MiAzMzAgNDk3VDQxOCA1MTNRNTA1IDUxMyA1NDAgNDczVDU3NiAzNjFRNTc2IDM0NyA1NzUgMzMzVDU3MiAzMDNMNTMwIDBIMzg5Wk0yNjEgLTIyNkgxNjVMMjIyIC01NUgzNzFMMjYxIC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDc7IiBob3Jpei1hZHYteD0iNzMxIiBkPSJNNTMyIDBMMjc4IDQyNUgyNzRMMjE1IDBINzNMMTY2IDY2N0gzMDFMNTQ2IDI0OUg1NTFMNjEwIDY2N0g3NTFMNjU4IDBINTMyWk02NTIgODAyTDQ3MCA3MDVMMzE0IDgwMkwzNzcgODc3TDQ4MiA4MDhMNjA5IDg3N0w2NTIgODAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ4OyIgaG9yaXotYWR2LXg9IjU5MyIgZD0iTTM4OSAwTDQyOCAyODFRNDMwIDI5MyA0MzEgMzAzVDQzMiAzMjRRNDMyIDM1NiA0MTcgMzc1VDM1NyAzOTVRMjU5IDM5NSAyNDYgMzAwTDIwNCAwSDYzTDEzMyA1MDJIMjU0TDI1NiA0NDJIMjYwUTI5MyA0ODIgMzMwIDQ5N1Q0MTggNTEzUTUwNSA1MTMgNTQwIDQ3M1Q1NzYgMzYxUTU3NiAzNDcgNTc1IDMzM1Q1NzIgMzAzTDUzMCAwSDM4OVpNNTY2IDY2MkwzODQgNTY1TDIyOCA2NjJMMjkxIDczN0wzOTYgNjY4TDUyMyA3MzdMNTY2IDY2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QTsiIGhvcml6LWFkdi14PSI3MzEiIGQ9Ik00MDQgLTEyMUg0MThRNDU2IC0xMjEgNDgxIC0xMDBUNTEzIC0zM0w1MTkgOUwyNzkgNDMwSDI3NUwyMTUgMEg3M0wxNjYgNjY3SDMwMUw1NDYgMjQySDU1MUw2MTAgNjY3SDc1MUw2NTMgLTI5UTYzOCAtMTM2IDU4MSAtMTkxVDQyMCAtMjQ2SDM4N0w0MDQgLTEyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QjsiIGhvcml6LWFkdi14PSI1OTMiIGQ9Ik0yNTQgNTAyTDI1NiA0NDJIMjYwUTI5MyA0ODIgMzMwIDQ5N1Q0MTggNTEzUTUwNSA1MTMgNTQwIDQ3M1Q1NzYgMzYxUTU3NiAzNDcgNTc1IDMzM1Q1NzIgMzAzTDUyNyAtMTdRNTEyIC0xMjcgNDU0IC0xODJUMjg5IC0yMzhIMjU1TDI3MyAtMTA4SDI4N1EzNzIgLTEwOCAzODUgLTE2TDQyNyAyODFRNDI5IDI5MyA0MzAgMzA0VDQzMSAzMjZRNDMxIDM1OCA0MTYgMzc2VDM1NyAzOTVRMjU5IDM5NSAyNDYgMzAwTDIwNCAwSDYzTDEzMyA1MDJIMjU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRDOyIgaG9yaXotYWR2LXg9Ijc3MiIgZD0iTTc2OCA0MTFRNzY4IDMyMSA3NDQgMjQ0VDY3MSAxMTBUNTUwIDIyVDM4NCAtMTBRMzE4IC0xMCAyNjUgNlQxNzQgNTVUMTE2IDEzOVQ5NiAyNTlROTYgMzQ5IDEyMSA0MjVUMTk1IDU1OFQzMTYgNjQ2VDQ4MSA2NzhRNTQ3IDY3OCA2MDAgNjYyVDY5MCA2MTNUNzQ4IDUzMFQ3NjggNDExWk00MDEgMTA4UTQ1NiAxMDggNDkzIDEyNVQ1NTMgMTcyVDU5MCAyNDRUNjEwIDMzNFE2MTYgMzcwIDYxNiA0MDdRNjE2IDQ4NSA1ODAgNTIyVDQ2NCA1NjBRNDA5IDU2MCAzNzIgNTQzVDMxMSA0OTZUMjc0IDQyNVQyNTQgMzM0UTI0OCAyOTggMjQ4IDI2M1EyNDggMTg0IDI4NCAxNDZUNDAxIDEwOFpNMzMwIDcyN0wzNDIgODE0SDY2NUw2NTMgNzI3SDMzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RDsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik03MyAxOTdRNzMgMjY2IDkzIDMyNFQxNTEgNDI0VDI0NSA0ODlUMzcyIDUxM1E0MjMgNTEzIDQ2NCA1MDFUNTM2IDQ2M1Q1ODIgMzk4VDU5OCAzMDVRNTk4IDIzNiA1NzggMTc4VDUxOSA3OFQ0MjUgMTNUMjk4IC0xMVExOTYgLTExIDEzNSA0MFQ3MyAxOTdaTTM1NyA0MDNRMzE0IDQwMyAyODcgMzg1VDI0NCAzMzdUMjIyIDI3MlQyMTYgMjAwUTIxNiAxNDkgMjM4IDEyMlQzMTQgOTVRMzU2IDk1IDM4MyAxMTRUNDI2IDE2MlQ0NDggMjI4VDQ1NSAzMDBRNDU1IDM1MSA0MzIgMzc3VDM1NyA0MDNaTTIyMiA1ODdMMjM0IDY3NEg1NTdMNTQ1IDU4N0gyMjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEU7IiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzY4IDQxMVE3NjggMzIxIDc0NCAyNDRUNjcxIDExMFQ1NTAgMjJUMzg0IC0xMFEzMTggLTEwIDI2NSA2VDE3NCA1NVQxMTYgMTM5VDk2IDI1OVE5NiAzNDkgMTIxIDQyNVQxOTUgNTU4VDMxNiA2NDZUNDgxIDY3OFE1NDcgNjc4IDYwMCA2NjJUNjkwIDYxM1Q3NDggNTMwVDc2OCA0MTFaTTQwMSAxMDhRNDU2IDEwOCA0OTMgMTI1VDU1MyAxNzJUNTkwIDI0NFQ2MTAgMzM0UTYxNiAzNzAgNjE2IDQwN1E2MTYgNDg1IDU4MCA1MjJUNDY0IDU2MFE0MDkgNTYwIDM3MiA1NDNUMzExIDQ5NlQyNzQgNDI1VDI1NCAzMzRRMjQ4IDI5OCAyNDggMjYzUTI0OCAxODQgMjg0IDE0NlQ0MDEgMTA4Wk02ODEgODU1UTY3MCA4MTAgNjQ3IDc4M1Q1OTYgNzQwVDUzOSA3MTlUNDg2IDcxNFE0NjIgNzE0IDQzNSA3MTlUMzg1IDczOVQzNDggNzgyVDMzNSA4NTVINDMyUTQzMSA4MjkgNDQ1IDgwOFQ0OTcgNzg3UTUzMyA3ODcgNTU1IDgwOFQ1ODMgODU1SDY4MUg2ODFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEY7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNzMgMTk3UTczIDI2NiA5MyAzMjRUMTUxIDQyNFQyNDUgNDg5VDM3MiA1MTNRNDIzIDUxMyA0NjQgNTAxVDUzNiA0NjNUNTgyIDM5OFQ1OTggMzA1UTU5OCAyMzYgNTc4IDE3OFQ1MTkgNzhUNDI1IDEzVDI5OCAtMTFRMTk2IC0xMSAxMzUgNDBUNzMgMTk3Wk0zNTcgNDAzUTMxNCA0MDMgMjg3IDM4NVQyNDQgMzM3VDIyMiAyNzJUMjE2IDIwMFEyMTYgMTQ5IDIzOCAxMjJUMzE0IDk1UTM1NiA5NSAzODMgMTE0VDQyNiAxNjJUNDQ4IDIyOFQ0NTUgMzAwUTQ1NSAzNTEgNDMyIDM3N1QzNTcgNDAzWk01NzQgNzA2UTU2MyA2NjEgNTQwIDYzNFQ0ODkgNTkxVDQzMiA1NzBUMzc5IDU2NVEzNTUgNTY1IDMyOCA1NzBUMjc4IDU5MFQyNDEgNjMzVDIyOCA3MDZIMzI1UTMyNCA2ODAgMzM4IDY1OVQzOTAgNjM4UTQyNiA2MzggNDQ4IDY1OVQ0NzYgNzA2SDU3NEg1NzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTA7IiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzY4IDQxMVE3NjggMzIxIDc0NCAyNDRUNjcxIDExMFQ1NTAgMjJUMzg0IC0xMFEzMTggLTEwIDI2NSA2VDE3NCA1NVQxMTYgMTM5VDk2IDI1OVE5NiAzNDkgMTIxIDQyNVQxOTUgNTU4VDMxNiA2NDZUNDgxIDY3OFE1NDcgNjc4IDYwMCA2NjJUNjkwIDYxM1Q3NDggNTMwVDc2OCA0MTFaTTQwMSAxMDhRNDU2IDEwOCA0OTMgMTI1VDU1MyAxNzJUNTkwIDI0NFQ2MTAgMzM0UTYxNiAzNzAgNjE2IDQwN1E2MTYgNDg1IDU4MCA1MjJUNDY0IDU2MFE0MDkgNTYwIDM3MiA1NDNUMzExIDQ5NlQyNzQgNDI1VDI1NCAzMzRRMjQ4IDI5OCAyNDggMjYzUTI0OCAxODQgMjg0IDE0NlQ0MDEgMTA4Wk02NDIgNzAyTDU3NiA3NDZMNzQyIDg3N0w4NTUgODIwTDY0MiA3MDJaTTM3NCA3MDJMMzA5IDc0Nkw0NzUgODc3TDU4OCA4MjBMMzc0IDcwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MTsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik03MyAxOTdRNzMgMjY2IDkzIDMyNFQxNTEgNDI0VDI0NSA0ODlUMzcyIDUxM1E0MjMgNTEzIDQ2NCA1MDFUNTM2IDQ2M1Q1ODIgMzk4VDU5OCAzMDVRNTk4IDIzNiA1NzggMTc4VDUxOSA3OFQ0MjUgMTNUMjk4IC0xMVExOTYgLTExIDEzNSA0MFQ3MyAxOTdaTTM1NyA0MDNRMzE0IDQwMyAyODcgMzg1VDI0NCAzMzdUMjIyIDI3MlQyMTYgMjAwUTIxNiAxNDkgMjM4IDEyMlQzMTQgOTVRMzU2IDk1IDM4MyAxMTRUNDI2IDE2MlQ0NDggMjI4VDQ1NSAzMDBRNDU1IDM1MSA0MzIgMzc3VDM1NyA0MDNaTTU0MSA1NTVMNDc1IDU5OUw2NDEgNzMwTDc1NCA2NzNMNTQxIDU1NVpNMjczIDU1NUwyMDggNTk5TDM3NCA3MzBMNDg3IDY3M0wyNzMgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUyOyIgaG9yaXotYWR2LXg9Ijk1NyIgZD0iTTQ5MSAwUTQ2NSAtNSA0MzUgLTdUMzc2IC0xMFEzMTEgLTEwIDI1OSA2VDE3MSA1NFQxMTYgMTM3VDk2IDI1NVE5NiAzMzcgMTE3IDQxM1QxODQgNTQ5VDMwMSA2NDNUNDcwIDY3OFE0OTkgNjc4IDUyOSA2NzVUNTg0IDY2N0gxMDAzTDk4NiA1NDVINzEzTDY5MyA0MDRIOTM3TDkyMCAyODBINjc2TDY1MyAxMTlIOTM2TDkyMCAwSDQ5MVpNMzk5IDEwOFE0MzQgMTA4IDQ2MSAxMTNUNTA4IDEyNkw1NjYgNTQwUTU0OSA1NDkgNTIyIDU1NFQ0NTkgNTYwUTM5NiA1NjAgMzU2IDUzNFQyOTEgNDY2VDI1OCAzNzBUMjQ4IDI2MVEyNDggMTg3IDI4MiAxNDhUMzk5IDEwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MzsiIGhvcml6LWFkdi14PSI5NTYiIGQ9Ik05NTMgMjk4UTk1MyAyNzQgOTUwIDI1MVQ5NDIgMjA0SDU4Nkw1ODUgMTkxUTU4NSAxNjQgNTk0IDE0NlQ2MTkgMTE3VDY1NiAxMDJUNzAxIDk3UTc0MyA5NyA3ODEgMTA4VDg1NSAxMzhMODg4IDQzUTgzOCAxNyA3ODcgM1Q2ODAgLTExUTYyOCAtMTEgNTgxIDZUNTAxIDY1UTQ2MCAyNCA0MDggN1QyOTkgLTExUTI0OCAtMTEgMjA3IDFUMTM1IDM5VDg5IDEwNFQ3MyAxOTZRNzMgMjY2IDkzIDMyNFQxNTEgNDI0VDI0NSA0ODlUMzczIDUxM1E0MjMgNTEzIDQ3MSA0OTdUNTUwIDQzOFE1ODkgNDc2IDYzOSA0OTVUNzQ0IDUxNFE3OTQgNTE0IDgzMyA0OTlUODk4IDQ1NVQ5MzkgMzg3VDk1MyAyOThaTTgyOSAyOTVRODI5IDM1MCA4MDcgMzgwVDczMSA0MTFRNjc2IDQxMSA2NDIgMzgwVDU5OSAyOTVIODI5Wk0zMTQgOThRMzU2IDk4IDM4MyAxMTZUNDI2IDE2NFQ0NDggMjI5VDQ1NCAzMDFRNDU0IDM1MiA0MzIgMzc2VDM1NyA0MDBRMzE0IDQwMCAyODcgMzgzVDI0NCAzMzdUMjIyIDI3M1QyMTYgMjAxUTIxNiAxNTAgMjM4IDEyNFQzMTQgOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTQ7IiBob3Jpei1hZHYteD0iNjQ1IiBkPSJNNDU4IDBMMzk2IDIyOFEzOTEgMjQzIDM4NSAyNDhUMzYzIDI1M0gyNTRMMjE5IDBINzNMMTY2IDY2M1EyODEgNjc1IDM5OCA2NzVRNDQ2IDY3NSA0OTIgNjY5VDU3NSA2NDRUNjM0IDU5MlQ2NTcgNTA3UTY1NyA0NzIgNjQ5IDQzOFQ2MjMgMzc2VDU3OCAzMjVUNTE1IDI5MlYyODhRNTIzIDI4NCA1MjcgMjc0VDUzNSAyNTVMNjExIDBINDU4Wk0zODMgMzY3UTQxMCAzNjcgNDMzIDM3MlQ0NzQgMzkxVDUwMiA0MjdUNTEyIDQ4MlE1MTIgNTA3IDUwMiA1MjNUNDc0IDU0N1Q0MzUgNTU4VDM4OCA1NjFRMzY0IDU2MSAzNDIgNTYwVDI5NyA1NTZMMjcwIDM2N0gzODNaTTM4OCA3MDhMMzEwIDc1M0w0NjggODg1TDYwMCA4MjZMMzg4IDcwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGhvcml6LWFkdi14PSI0MDQiIGQ9Ik0zOTkgMzg4UTM2OCAzODggMzQyIDM4NVQyOTYgMzcyVDI2MiAzNDFUMjQ0IDI4N0wyMDQgMEg2M0wxMzMgNTAySDI1M0wyNTYgNDM1SDI2MFEyODYgNDczIDMyMCA0OTJUNDE0IDUxMkg0NDlMNDMyIDM4OEgzOTlaTTI5MyA1NjVMMjE1IDYxMEwzNzMgNzQyTDUwNSA2ODNMMjkzIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NjsiIGhvcml6LWFkdi14PSI2NDUiIGQ9Ik00NTggMEwzOTYgMjI4UTM5MSAyNDMgMzg1IDI0OFQzNjMgMjUzSDI1NEwyMTkgMEg3M0wxNjYgNjYzUTI4MSA2NzUgMzk4IDY3NVE0NDYgNjc1IDQ5MiA2NjlUNTc1IDY0NFQ2MzQgNTkyVDY1NyA1MDdRNjU3IDQ3MiA2NDkgNDM4VDYyMyAzNzZUNTc4IDMyNVQ1MTUgMjkyVjI4OFE1MjMgMjg0IDUyNyAyNzRUNTM1IDI1NUw2MTEgMEg0NThaTTM4MyAzNjdRNDEwIDM2NyA0MzMgMzcyVDQ3NCAzOTFUNTAyIDQyN1Q1MTIgNDgyUTUxMiA1MDcgNTAyIDUyM1Q0NzQgNTQ3VDQzNSA1NThUMzg4IDU2MVEzNjQgNTYxIDM0MiA1NjBUMjk3IDU1NkwyNzAgMzY3SDM4M1pNMjg2IC0yMjZIMTkwTDI0NyAtNTVIMzk2TDI4NiAtMjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU3OyIgaG9yaXotYWR2LXg9IjQwNCIgZD0iTTM5OSAzODhRMzY4IDM4OCAzNDIgMzg1VDI5NiAzNzJUMjYyIDM0MVQyNDQgMjg3TDIwNCAwSDYzTDEzMyA1MDJIMjUzTDI1NiA0MzVIMjYwUTI4NiA0NzMgMzIwIDQ5MlQ0MTQgNTEySDQ0OUw0MzIgMzg4SDM5OVpNODkgLTIyNkgtN0w1MCAtNTVIMTk5TDg5IC0yMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTg7IiBob3Jpei1hZHYteD0iNjQ1IiBkPSJNNDU4IDBMMzk2IDIyOFEzOTEgMjQzIDM4NSAyNDhUMzYzIDI1M0gyNTRMMjE5IDBINzNMMTY2IDY2M1EyODEgNjc1IDM5OCA2NzVRNDQ2IDY3NSA0OTIgNjY5VDU3NSA2NDRUNjM0IDU5MlQ2NTcgNTA3UTY1NyA0NzIgNjQ5IDQzOFQ2MjMgMzc2VDU3OCAzMjVUNTE1IDI5MlYyODhRNTIzIDI4NCA1MjcgMjc0VDUzNSAyNTVMNjExIDBINDU4Wk0zODMgMzY3UTQxMCAzNjcgNDMzIDM3MlQ0NzQgMzkxVDUwMiA0MjdUNTEyIDQ4MlE1MTIgNTA3IDUwMiA1MjNUNDc0IDU0N1Q0MzUgNTU4VDM4OCA1NjFRMzY0IDU2MSAzNDIgNTYwVDI5NyA1NTZMMjcwIDM2N0gzODNaTTU5MCA4MDJMNDA4IDcwNUwyNTIgODAyTDMxNSA4NzdMNDIwIDgwOEw1NDcgODc3TDU5MCA4MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTk7IiBob3Jpei1hZHYteD0iNDA0IiBkPSJNMzk5IDM4OFEzNjggMzg4IDM0MiAzODVUMjk2IDM3MlQyNjIgMzQxVDI0NCAyODdMMjA0IDBINjNMMTMzIDUwMkgyNTNMMjU2IDQzNUgyNjBRMjg2IDQ3MyAzMjAgNDkyVDQxNCA1MTJINDQ5TDQzMiAzODhIMzk5Wk00NzQgNjYyTDI5MiA1NjVMMTM2IDY2MkwxOTkgNzM3TDMwNCA2NjhMNDMxIDczN0w0NzQgNjYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVBOyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTU4MiAyMTZRNTgyIDE1MyA1NjAgMTEwVDQ5OSA0MVQ0MTEgMlQzMDUgLTEwUTIzMCAtMTAgMTY3IDhUNDIgNzFMMTIxIDE3NVExNjMgMTQ0IDIwOSAxMjRUMzA5IDEwNFEzMzAgMTA0IDM1MiAxMDZUMzkzIDExN1Q0MjQgMTQxVDQzNiAxODFRNDM2IDIxMCA0MTMgMjI4VDM1NCAyNjBUMjc4IDI5MFQyMDEgMzI3VDE0MyAzODFUMTE5IDQ2NVExMTkgNTI0IDE0MiA1NjRUMjAzIDYyOVQyODkgNjY1VDM5MCA2NzZRNTEwIDY3NiA2MTYgNjE3TDU0OCA1MDVRNTEzIDUyOCA0NzIgNTQzVDM4NyA1NTlRMzY4IDU1OSAzNDcgNTU3VDMwOSA1NDdUMjgwIDUyN1QyNjggNDkyUTI2OCA0NjQgMjkxIDQ0N1QzNDkgNDE3VDQyNSAzOTFUNTAwIDM1NlQ1NTggMzAyVDU4MiAyMTZaTTM5NSA3MDlMMzE3IDc1NEw0NzUgODg2TDYwNyA4MjdMMzk1IDcwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QjsiIGhvcml6LWFkdi14PSI0OTIiIGQ9Ik00ODAgMTY3UTQ4MCAxMTYgNDYxIDgyVDQxMSAyN1QzMzggLTJUMjUyIC0xMVExOTUgLTExIDEzOCA0VDMzIDUwTDk1IDE0NlExMzMgMTIzIDE3NCAxMDhUMjYxIDkyUTI3NSA5MiAyOTAgOTRUMzE3IDEwMVQzMzcgMTE3VDM0NSAxNDZRMzQ1IDE2NCAzMjcgMTc0VDI4MCAxOTNUMjE5IDIxMVQxNTggMjM3VDExMSAyNzlUOTIgMzQ3UTkyIDM5MyAxMTEgNDI1VDE2MiA0NzZUMjM0IDUwNFQzMTcgNTEzUTM2NSA1MTMgNDE0IDUwM1Q1MDUgNDcwTDQ1NCAzNzBRNDI1IDM4NyAzODkgMzk3VDMxOCA0MDhRMzA2IDQwOCAyOTAgNDA3VDI1OSA0MDJUMjM1IDM4OFQyMjUgMzYyUTIyNSAzNDQgMjQ0IDMzNVQyOTEgMzE3VDM1MiAzMDBUNDE0IDI3NlQ0NjEgMjM0VDQ4MCAxNjdaTTMzMyA1NjVMMjU1IDYxMEw0MTMgNzQyTDU0NSA2ODNMMzMzIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QzsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik01ODIgMjE2UTU4MiAxNTMgNTYwIDExMFQ0OTkgNDFUNDExIDJUMzA1IC0xMFEyMzAgLTEwIDE2NyA4VDQyIDcxTDEyMSAxNzVRMTYzIDE0NCAyMDkgMTI0VDMwOSAxMDRRMzMwIDEwNCAzNTIgMTA2VDM5MyAxMTdUNDI0IDE0MVQ0MzYgMTgxUTQzNiAyMTAgNDEzIDIyOFQzNTQgMjYwVDI3OCAyOTBUMjAxIDMyN1QxNDMgMzgxVDExOSA0NjVRMTE5IDUyNCAxNDIgNTY0VDIwMyA2MjlUMjg5IDY2NVQzOTAgNjc2UTUxMCA2NzYgNjE2IDYxN0w1NDggNTA1UTUxMyA1MjggNDcyIDU0M1QzODcgNTU5UTM2OCA1NTkgMzQ3IDU1N1QzMDkgNTQ3VDI4MCA1MjdUMjY4IDQ5MlEyNjggNDY0IDI5MSA0NDdUMzQ5IDQxN1Q0MjUgMzkxVDUwMCAzNTZUNTU4IDMwMlQ1ODIgMjE2Wk01MjkgNzAxTDQxNSA3NzVMMjc3IDcwMUwyMzIgNzgwTDQyNyA4NzhMNTk3IDc4MEw1MjkgNzAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVEOyIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTQ4MCAxNjdRNDgwIDExNiA0NjEgODJUNDExIDI3VDMzOCAtMlQyNTIgLTExUTE5NSAtMTEgMTM4IDRUMzMgNTBMOTUgMTQ2UTEzMyAxMjMgMTc0IDEwOFQyNjEgOTJRMjc1IDkyIDI5MCA5NFQzMTcgMTAxVDMzNyAxMTdUMzQ1IDE0NlEzNDUgMTY0IDMyNyAxNzRUMjgwIDE5M1QyMTkgMjExVDE1OCAyMzdUMTExIDI3OVQ5MiAzNDdROTIgMzkzIDExMSA0MjVUMTYyIDQ3NlQyMzQgNTA0VDMxNyA1MTNRMzY1IDUxMyA0MTQgNTAzVDUwNSA0NzBMNDU0IDM3MFE0MjUgMzg3IDM4OSAzOTdUMzE4IDQwOFEzMDYgNDA4IDI5MCA0MDdUMjU5IDQwMlQyMzUgMzg4VDIyNSAzNjJRMjI1IDM0NCAyNDQgMzM1VDI5MSAzMTdUMzUyIDMwMFQ0MTQgMjc2VDQ2MSAyMzRUNDgwIDE2N1pNNDY3IDU2MUwzNTMgNjM1TDIxNSA1NjFMMTcwIDY0MEwzNjUgNzM4TDUzNSA2NDBMNDY3IDU2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RTsiIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik0zOTcgLTExMVEzOTcgLTEzOCAzODggLTE1N1QzNjIgLTE5MFQzMjMgLTIwOVQyNzcgLTIxNlEyNTQgLTIxNiAyMzAgLTIwOVQxODYgLTE5MUwyMDkgLTE0M1EyMjUgLTE1MSAyMzkgLTE1NlQyNzIgLTE2MlEyOTIgLTE2MiAzMDggLTE1NFQzMjQgLTEyM1EzMjQgLTEwNiAzMTIgLTEwMVQyODYgLTk1UTI2MSAtOTUgMjQ0IC0xMDNMMjE5IC04OUwyNzAgLTlRMjA2IC01IDE1MSAxM1Q0MiA3MUwxMjEgMTc1UTE2MyAxNDQgMjA5IDEyNFQzMDkgMTA0UTMzMCAxMDQgMzUyIDEwNlQzOTMgMTE3VDQyNCAxNDFUNDM2IDE4MVE0MzYgMjEwIDQxMyAyMjhUMzU0IDI2MFQyNzggMjkwVDIwMSAzMjdUMTQzIDM4MVQxMTkgNDY1UTExOSA1MjQgMTQyIDU2NFQyMDMgNjI5VDI4OSA2NjVUMzkwIDY3NlE1MTAgNjc2IDYxNiA2MTdMNTQ4IDUwNVE1MTMgNTI4IDQ3MiA1NDNUMzg3IDU1OVEzNjggNTU5IDM0NyA1NTdUMzA5IDU0N1QyODAgNTI3VDI2OCA0OTJRMjY4IDQ2NCAyOTEgNDQ3VDM0OSA0MTdUNDI1IDM5MVQ1MDAgMzU2VDU1OCAzMDJUNTgyIDIxNlE1ODIgMTU3IDU2MyAxMTZUNTA5IDQ4VDQzMCA4VDMzMyAtOUwzMDEgLTU2UTMxOSAtNTAgMzM1IC01MFEzNjEgLTUwIDM3OSAtNjVUMzk3IC0xMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUY7IiBob3Jpei1hZHYteD0iNDkyIiBkPSJNMzM2IC0xMTJRMzM2IC0xMzkgMzI3IC0xNThUMzAxIC0xOTFUMjYyIC0yMTBUMjE2IC0yMTdRMTkzIC0yMTcgMTY5IC0yMTBUMTI1IC0xOTJMMTQ4IC0xNDRRMTY0IC0xNTIgMTc4IC0xNTdUMjExIC0xNjNRMjMxIC0xNjMgMjQ3IC0xNTVUMjYzIC0xMjRRMjYzIC0xMDcgMjUxIC0xMDJUMjI1IC05NlEyMDAgLTk2IDE4MyAtMTA0TDE1OCAtOTBMMjEwIC05UTE2MiAtNCAxMTcgMTBUMzMgNTBMOTUgMTQ2UTEzMyAxMjMgMTc0IDEwOFQyNjEgOTJRMjc1IDkyIDI5MCA5NFQzMTcgMTAxVDMzNyAxMTdUMzQ1IDE0NlEzNDUgMTY0IDMyNyAxNzRUMjgwIDE5M1QyMTkgMjExVDE1OCAyMzdUMTExIDI3OVQ5MiAzNDdROTIgMzkzIDExMSA0MjVUMTYyIDQ3NlQyMzQgNTA0VDMxNyA1MTNRMzY1IDUxMyA0MTQgNTAzVDUwNSA0NzBMNDU0IDM3MFE0MjUgMzg3IDM4OSAzOTdUMzE4IDQwOFEzMDYgNDA4IDI5MCA0MDdUMjU5IDQwMlQyMzUgMzg4VDIyNSAzNjJRMjI1IDM0NCAyNDQgMzM1VDI5MSAzMTdUMzUyIDMwMFQ0MTQgMjc2VDQ2MSAyMzRUNDgwIDE2N1E0ODAgMTE5IDQ2MyA4NlQ0MTggMzJUMzUyIDFUMjcyIC0xMEwyNDAgLTU3UTI1OCAtNTEgMjc0IC01MVEzMDAgLTUxIDMxOCAtNjZUMzM2IC0xMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjA7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNTgyIDIxNlE1ODIgMTUzIDU2MCAxMTBUNDk5IDQxVDQxMSAyVDMwNSAtMTBRMjMwIC0xMCAxNjcgOFQ0MiA3MUwxMjEgMTc1UTE2MyAxNDQgMjA5IDEyNFQzMDkgMTA0UTMzMCAxMDQgMzUyIDEwNlQzOTMgMTE3VDQyNCAxNDFUNDM2IDE4MVE0MzYgMjEwIDQxMyAyMjhUMzU0IDI2MFQyNzggMjkwVDIwMSAzMjdUMTQzIDM4MVQxMTkgNDY1UTExOSA1MjQgMTQyIDU2NFQyMDMgNjI5VDI4OSA2NjVUMzkwIDY3NlE1MTAgNjc2IDYxNiA2MTdMNTQ4IDUwNVE1MTMgNTI4IDQ3MiA1NDNUMzg3IDU1OVEzNjggNTU5IDM0NyA1NTdUMzA5IDU0N1QyODAgNTI3VDI2OCA0OTJRMjY4IDQ2NCAyOTEgNDQ3VDM0OSA0MTdUNDI1IDM5MVQ1MDAgMzU2VDU1OCAzMDJUNTgyIDIxNlpNNTg2IDgwMkw0MDQgNzA1TDI0OCA4MDJMMzExIDg3N0w0MTYgODA4TDU0MyA4NzdMNTg2IDgwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGhvcml6LWFkdi14PSI0OTIiIGQ9Ik00ODAgMTY3UTQ4MCAxMTYgNDYxIDgyVDQxMSAyN1QzMzggLTJUMjUyIC0xMVExOTUgLTExIDEzOCA0VDMzIDUwTDk1IDE0NlExMzMgMTIzIDE3NCAxMDhUMjYxIDkyUTI3NSA5MiAyOTAgOTRUMzE3IDEwMVQzMzcgMTE3VDM0NSAxNDZRMzQ1IDE2NCAzMjcgMTc0VDI4MCAxOTNUMjE5IDIxMVQxNTggMjM3VDExMSAyNzlUOTIgMzQ3UTkyIDM5MyAxMTEgNDI1VDE2MiA0NzZUMjM0IDUwNFQzMTcgNTEzUTM2NSA1MTMgNDE0IDUwM1Q1MDUgNDcwTDQ1NCAzNzBRNDI1IDM4NyAzODkgMzk3VDMxOCA0MDhRMzA2IDQwOCAyOTAgNDA3VDI1OSA0MDJUMjM1IDM4OFQyMjUgMzYyUTIyNSAzNDQgMjQ0IDMzNVQyOTEgMzE3VDM1MiAzMDBUNDE0IDI3NlQ0NjEgMjM0VDQ4MCAxNjdaTTUyMyA2NjJMMzQxIDU2NUwxODUgNjYyTDI0OCA3MzdMMzUzIDY2OEw0ODAgNzM3TDUyMyA2NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjI7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNNDIzIDU0M0wzNDcgMEgyMDFMMjc3IDU0M0g5MEwxMDcgNjY3SDYyOEw2MTEgNTQzSDQyM1pNMjIxIC0yMjhIMTI1TDE4MiAtNTdIMzMxTDIyMSAtMjI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYzOyIgaG9yaXotYWR2LXg9IjM5MSIgZD0iTTM1MiAtMlEzMjMgLTYgMzAzIC03VDI2NCAtOVEyMjIgLTkgMTkzIC00VDE0NiAxNFQxMjAgNDZUMTEyIDk0UTExMiAxMDUgMTEzIDExOFQxMTYgMTQ1TDE1MSAzODlINjlMODUgNTAySDE2OEwxODcgNjM1SDMyNkwzMDcgNTAySDQyM0w0MDcgMzg5SDI5MUwyNjAgMTY0UTI1NyAxNDYgMjU3IDEzNVQyNjYgMTE3VDI5MSAxMDlUMzQyIDEwN1EzNTAgMTA3IDM1NCAxMDdUMzY4IDEwOEwzNTIgLTJIMzUyWk0xODkgLTIyNkg5M0wxNTAgLTU1SDI5OUwxODkgLTIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik00MjMgNTQzTDM0NyAwSDIwMUwyNzcgNTQzSDkwTDEwNyA2NjdINjI4TDYxMSA1NDNINDIzWk01NTggODAyTDM3NiA3MDVMMjIwIDgwMkwyODMgODc3TDM4OCA4MDhMNTE1IDg3N0w1NTggODAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY1OyIgaG9yaXotYWR2LXg9IjM5MSIgZD0iTTM1MiAtMlEzMjMgLTYgMzAzIC03VDI2NCAtOVEyMjIgLTkgMTkzIC00VDE0NiAxNFQxMjAgNDZUMTEyIDk0UTExMiAxMDUgMTEzIDExOFQxMTYgMTQ1TDE1MSAzODlINjlMODUgNTAySDE2OEwxODcgNjM1SDMyNkwzMDcgNTAySDQyM0w0MDcgMzg5SDI5MUwyNjAgMTY0UTI1NyAxNDYgMjU3IDEzNVQyNjYgMTE3VDI5MSAxMDlUMzQyIDEwN1EzNTAgMTA3IDM1NCAxMDdUMzY4IDEwOEwzNTIgLTJaTTQ4NSA1MThIMzkxTDQ1NCA3MDBINTkyTDQ4NSA1MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjY7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMzg3IDI4OUwzNDcgMEgyMDFMMjQxIDI4OUg4M0w5OSA0MDJIMjU3TDI3NyA1NDNIOTBMMTA3IDY2N0g2MjhMNjExIDU0M0g0MjNMNDAzIDQwMkg1NjFMNTQ1IDI4OUgzODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjc7IiBob3Jpei1hZHYteD0iMzkxIiBkPSJNMjY3IDIxN0wyNjAgMTY0UTI1NyAxNDYgMjU3IDEzNVQyNjYgMTE3VDI5MSAxMDlUMzQyIDEwN0gzNjhMMzUyIC0yUTMyMyAtNiAzMDMgLTdUMjY0IC05UTIyMSAtOSAxOTIgLTRUMTQ1IDE0VDEyMCA0NlQxMTIgOTVRMTEyIDEwNiAxMTMgMTE4VDExNiAxNDVMMTI2IDIxN0g0NUw2MCAzMjNIMTQyTDE1MSAzODlINjlMODUgNTAySDE2OEwxODcgNjM1SDMyNkwzMDcgNTAySDQyM0w0MDcgMzg5SDI5MUwyODIgMzIzSDM5OEwzODMgMjE3SDI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2ODsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02NjUgMjY4UTY1NiAyMDIgNjM0IDE1MFQ1NzQgNjJUNDgxIDhUMzQ4IC0xMVEyODIgLTExIDIzNiAzVDE2MSA0M1QxMTggMTA4VDEwNSAxOTdRMTA1IDIxNCAxMDYgMjMxVDExMCAyNjhMMTY2IDY2N0gzMTJMMjU5IDI5MFEyNTMgMjUxIDI1MyAyMTdRMjUzIDE5MyAyNTggMTc0VDI3NSAxNDFUMzA5IDEyMFQzNjUgMTEyUTQxMSAxMTIgNDM5IDEyNVQ0ODQgMTYzVDUwOSAyMTlUNTIyIDI5MEw1NzUgNjY3SDcyMUw2NjUgMjY4SDY2NVpNNjQ3IDc5NVE2MjYgNzUwIDU5MSA3MjlUNTIxIDcwN1E0OTggNzA3IDQ4MSA3MTNUNDQ4IDcyOFQ0MTkgNzQzVDM5MCA3NTBRMzczIDc1MCAzNTUgNzQxVDMyMyA3MDZMMjY1IDc1OVEyOTQgODA5IDMyNCA4MjdUMzkwIDg0NlE0MTEgODQ2IDQyOCA4MzlUNDYxIDgyNFQ0OTEgODA5VDUyMiA4MDJRNTM5IDgwMiA1NTYgODExVDU4NyA4NDZMNjQ3IDc5NUg2NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjk7IiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMzk4IDBWNThIMzk0UTM2NyAyNSAzMzAgN1QyNDAgLTEyUTIwNCAtMTIgMTc1IC02VDEyNiAxN1Q5NiA2MVQ4NSAxMzBRODUgMTQzIDg2IDE1N1Q4OSAxODhMMTMzIDUwMkgyNzRMMjM2IDIzNFEyMzQgMjE3IDIzMiAyMDJUMjMwIDE3NFEyMzAgMTQyIDI0NCAxMjRUMzAyIDEwNlEzMzAgMTA2IDM0OSAxMTNUMzgxIDEzMlQzOTkgMTY0VDQwOSAyMDdMNDUwIDUwMkg1OTFMNTIxIDBIMzk4Wk01NzEgNjU1UTU1MCA2MTAgNTE1IDU4OVQ0NDUgNTY3UTQyMiA1NjcgNDA1IDU3M1QzNzIgNTg4VDM0MyA2MDNUMzE0IDYxMFEyOTcgNjEwIDI3OSA2MDFUMjQ3IDU2NkwxODkgNjE5UTIxOCA2NjkgMjQ4IDY4N1QzMTQgNzA2UTMzNSA3MDYgMzUyIDY5OVQzODUgNjg0VDQxNSA2NjlUNDQ2IDY2MlE0NjMgNjYyIDQ4MCA2NzFUNTExIDcwNkw1NzEgNjU1SDU3MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02NjUgMjY4UTY1NiAyMDIgNjM0IDE1MFQ1NzQgNjJUNDgxIDhUMzQ4IC0xMVEyODIgLTExIDIzNiAzVDE2MSA0M1QxMTggMTA4VDEwNSAxOTdRMTA1IDIxNCAxMDYgMjMxVDExMCAyNjhMMTY2IDY2N0gzMTJMMjU5IDI5MFEyNTMgMjUxIDI1MyAyMTdRMjUzIDE5MyAyNTggMTc0VDI3NSAxNDFUMzA5IDEyMFQzNjUgMTEyUTQxMSAxMTIgNDM5IDEyNVQ0ODQgMTYzVDUwOSAyMTlUNTIyIDI5MEw1NzUgNjY3SDcyMUw2NjUgMjY4SDY2NVpNMjkxIDcyN0wzMDMgODE0SDYyNkw2MTQgNzI3SDI5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QjsiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0zOTggMFY1OEgzOTRRMzY3IDI1IDMzMCA3VDI0MCAtMTJRMjA0IC0xMiAxNzUgLTZUMTI2IDE3VDk2IDYxVDg1IDEzMFE4NSAxNDMgODYgMTU3VDg5IDE4OEwxMzMgNTAySDI3NEwyMzYgMjM0UTIzNCAyMTcgMjMyIDIwMlQyMzAgMTc0UTIzMCAxNDIgMjQ0IDEyNFQzMDIgMTA2UTMzMCAxMDYgMzQ5IDExM1QzODEgMTMyVDM5OSAxNjRUNDA5IDIwN0w0NTAgNTAySDU5MUw1MjEgMEgzOThaTTIxMSA1ODdMMjIzIDY3NEg1NDZMNTM0IDU4N0gyMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkM7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjY1IDI2OFE2NTYgMjAyIDYzNCAxNTBUNTc0IDYyVDQ4MSA4VDM0OCAtMTFRMjgyIC0xMSAyMzYgM1QxNjEgNDNUMTE4IDEwOFQxMDUgMTk3UTEwNSAyMTQgMTA2IDIzMVQxMTAgMjY4TDE2NiA2NjdIMzEyTDI1OSAyOTBRMjUzIDI1MSAyNTMgMjE3UTI1MyAxOTMgMjU4IDE3NFQyNzUgMTQxVDMwOSAxMjBUMzY1IDExMlE0MTEgMTEyIDQzOSAxMjVUNDg0IDE2M1Q1MDkgMjE5VDUyMiAyOTBMNTc1IDY2N0g3MjFMNjY1IDI2OEg2NjVaTTY0MyA4NDZRNjMyIDgwMSA2MDkgNzc0VDU1OCA3MzFUNTAxIDcxMFQ0NDggNzA1UTQyNCA3MDUgMzk3IDcxMFQzNDcgNzMwVDMxMCA3NzNUMjk3IDg0NkgzOTRRMzkzIDgyMCA0MDcgNzk5VDQ1OSA3NzhRNDk1IDc3OCA1MTcgNzk5VDU0NSA4NDZINjQzSDY0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RDsiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0zOTggMFY1OEgzOTRRMzY3IDI1IDMzMCA3VDI0MCAtMTJRMjA0IC0xMiAxNzUgLTZUMTI2IDE3VDk2IDYxVDg1IDEzMFE4NSAxNDMgODYgMTU3VDg5IDE4OEwxMzMgNTAySDI3NEwyMzYgMjM0UTIzNCAyMTcgMjMyIDIwMlQyMzAgMTc0UTIzMCAxNDIgMjQ0IDEyNFQzMDIgMTA2UTMzMCAxMDYgMzQ5IDExM1QzODEgMTMyVDM5OSAxNjRUNDA5IDIwN0w0NTAgNTAySDU5MUw1MjEgMEgzOThaTTU2NiA3MDZRNTU1IDY2MSA1MzIgNjM0VDQ4MSA1OTFUNDI0IDU3MFQzNzEgNTY1UTM0NyA1NjUgMzIwIDU3MFQyNzAgNTkwVDIzMyA2MzNUMjIwIDcwNkgzMTdRMzE2IDY4MCAzMzAgNjU5VDM4MiA2MzhRNDE4IDYzOCA0NDAgNjU5VDQ2OCA3MDZINTY2SDU2NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik02NjUgMjY4UTY1NiAyMDIgNjM0IDE1MFQ1NzQgNjJUNDgxIDhUMzQ4IC0xMVEyODIgLTExIDIzNiAzVDE2MSA0M1QxMTggMTA4VDEwNSAxOTdRMTA1IDIxNCAxMDYgMjMxVDExMCAyNjhMMTY2IDY2N0gzMTJMMjU5IDI5MFEyNTMgMjUxIDI1MyAyMTdRMjUzIDE5MyAyNTggMTc0VDI3NSAxNDFUMzA5IDEyMFQzNjUgMTEyUTQxMSAxMTIgNDM5IDEyNVQ0ODQgMTYzVDUwOSAyMTlUNTIyIDI5MEw1NzUgNjY3SDcyMUw2NjUgMjY4SDY2NVpNNTc0IDgxMlE1NzQgNzg2IDU2NCA3NjRUNTM4IDcyN1Q0OTggNzAyVDQ1MCA2OTNRNDA5IDY5MyAzNzkgNzE2VDM0OSA3ODJRMzQ5IDgwNyAzNTkgODI5VDM4NSA4NjZUNDI0IDg5MVQ0NzIgOTAwUTQ5MiA5MDAgNTEwIDg5NVQ1NDMgODc4VDU2NSA4NTBUNTc0IDgxMlpNNDU5IDc0NFE0ODUgNzQ0IDQ5OSA3NjJUNTEzIDgwNlE1MTMgODI2IDUwMSA4MzdUNDY2IDg0OFE0NDEgODQ4IDQyNiA4MzFUNDEwIDc4OFE0MTAgNzY4IDQyMyA3NTZUNDU5IDc0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RjsiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0zOTggMFY1OEgzOTRRMzY3IDI1IDMzMCA3VDI0MCAtMTJRMjA0IC0xMiAxNzUgLTZUMTI2IDE3VDk2IDYxVDg1IDEzMFE4NSAxNDMgODYgMTU3VDg5IDE4OEwxMzMgNTAySDI3NEwyMzYgMjM0UTIzNCAyMTcgMjMyIDIwMlQyMzAgMTc0UTIzMCAxNDIgMjQ0IDEyNFQzMDIgMTA2UTMzMCAxMDYgMzQ5IDExM1QzODEgMTMyVDM5OSAxNjRUNDA5IDIwN0w0NTAgNTAySDU5MUw1MjEgMEgzOThaTTQ5OCA2ODRRNDk4IDY1OCA0ODggNjM2VDQ2MiA1OTlUNDIyIDU3NFQzNzQgNTY1UTMzMyA1NjUgMzAzIDU4OFQyNzMgNjU0UTI3MyA2NzkgMjgzIDcwMVQzMDkgNzM4VDM0OCA3NjNUMzk2IDc3MlE0MTYgNzcyIDQzNCA3NjdUNDY3IDc1MFQ0ODkgNzIyVDQ5OCA2ODRaTTM4MyA2MTZRNDA5IDYxNiA0MjMgNjM0VDQzNyA2NzhRNDM3IDY5OCA0MjUgNzA5VDM5MCA3MjBRMzY1IDcyMCAzNTAgNzAzVDMzNCA2NjBRMzM0IDY0MCAzNDcgNjI4VDM4MyA2MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjY1IDI2OFE2NTYgMjAyIDYzNCAxNTBUNTc0IDYyVDQ4MSA4VDM0OCAtMTFRMjgyIC0xMSAyMzYgM1QxNjEgNDNUMTE4IDEwOFQxMDUgMTk3UTEwNSAyMTQgMTA2IDIzMVQxMTAgMjY4TDE2NiA2NjdIMzEyTDI1OSAyOTBRMjUzIDI1MSAyNTMgMjE3UTI1MyAxOTMgMjU4IDE3NFQyNzUgMTQxVDMwOSAxMjBUMzY1IDExMlE0MTEgMTEyIDQzOSAxMjVUNDg0IDE2M1Q1MDkgMjE5VDUyMiAyOTBMNTc1IDY2N0g3MjFMNjY1IDI2OEg2NjVaTTU5NyA3MDZMNTMxIDc1MEw2OTcgODgxTDgxMCA4MjRMNTk3IDcwNlpNMzI5IDcwNkwyNjQgNzUwTDQzMCA4ODFMNTQzIDgyNEwzMjkgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcxOyIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTM5OCAwVjU4SDM5NFEzNjcgMjUgMzMwIDdUMjQwIC0xMlEyMDQgLTEyIDE3NSAtNlQxMjYgMTdUOTYgNjFUODUgMTMwUTg1IDE0MyA4NiAxNTdUODkgMTg4TDEzMyA1MDJIMjc0TDIzNiAyMzRRMjM0IDIxNyAyMzIgMjAyVDIzMCAxNzRRMjMwIDE0MiAyNDQgMTI0VDMwMiAxMDZRMzMwIDEwNiAzNDkgMTEzVDM4MSAxMzJUMzk5IDE2NFQ0MDkgMjA3TDQ1MCA1MDJINTkxTDUyMSAwSDM5OFpNNTIzIDU2Nkw0NTcgNjEwTDYyMyA3NDFMNzM2IDY4NEw1MjMgNTY2Wk0yNTUgNTY2TDE5MCA2MTBMMzU2IDc0MUw0NjkgNjg0TDI1NSA1NjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNjY1IDI2OFE2NTEgMTY4IDYwOCAxMDJUNDgwIDhRNDY3IC0xIDQ1MiAtMTNUNDIzIC0zOVQ0MDAgLTcwVDM5MSAtMTA3UTM5MSAtMTI3IDQwMyAtMTM3VDQzMyAtMTQ4UTQ1MyAtMTQ4IDQ2NSAtMTQzVDQ4NyAtMTMzTDQ5OSAtMjExUTQ4NCAtMjE3IDQ1NCAtMjI0VDM5NiAtMjMyUTM0MSAtMjMyIDMxNSAtMjA4VDI4OSAtMTQzUTI4OSAtOTggMzEyIC02OFQzNzIgLTEwUTM2NSAtMTEgMzYwIC0xMVQzNDggLTExUTI4MiAtMTEgMjM2IDNUMTYxIDQzVDExOCAxMDhUMTA1IDE5N1ExMDUgMjE0IDEwNiAyMzFUMTEwIDI2OEwxNjYgNjY3SDMxMkwyNTkgMjkwUTI1MyAyNTEgMjUzIDIxN1EyNTMgMTkzIDI1OCAxNzRUMjc1IDE0MVQzMDkgMTIwVDM2NSAxMTJRNDExIDExMiA0MzkgMTI1VDQ4NCAxNjNUNTA5IDIxOVQ1MjIgMjkwTDU3NSA2NjdINzIxTDY2NSAyNjhINjY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTQ3OCAwUTQ2NCAtMTAgNDQ5IC0yMlQ0MjAgLTQ4VDM5NyAtNzlUMzg4IC0xMTVRMzg4IC0xMzQgMzk5IC0xNDVUNDMwIC0xNTZRNDQ3IC0xNTYgNDU4IC0xNTJUNDg0IC0xNDFMNDk2IC0yMTlRNDc0IC0yMjggNDQ1IC0yMzRUMzkzIC0yNDFRMzQ4IC0yNDEgMzE3IC0yMjBUMjg2IC0xNTBRMjg2IC0xMjUgMjk1IC0xMDNUMzIwIC02MlQzNTYgLTI4VDM5OCAwVjU4SDM5NFEzNjcgMjUgMzMwIDdUMjQwIC0xMlEyMDQgLTEyIDE3NSAtNlQxMjYgMTdUOTYgNjFUODUgMTMwUTg1IDE0MyA4NiAxNTdUODkgMTg4TDEzMyA1MDJIMjc0TDIzNiAyMzRRMjM0IDIxNyAyMzIgMjAyVDIzMCAxNzRRMjMwIDE0MiAyNDQgMTI0VDMwMiAxMDZRMzMwIDEwNiAzNDkgMTEzVDM4MSAxMzJUMzk5IDE2NFQ0MDkgMjA3TDQ1MCA1MDJINTkxTDUyMSAwSDQ3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NDsiIGhvcml6LWFkdi14PSIxMDA1IiBkPSJNNzg4IDBINjMyTDU2OSA0NzNINTY0TDM2NyAwSDIwNEwxMTQgNjY3SDI3NUwzMTUgMTc3SDMxOUw1MjQgNjY3SDY3Mkw3MzIgMTc3SDczNkw5MjIgNjY3SDEwNzdMNzg4IDBaTTcyNSA3MDFMNjExIDc3NUw0NzMgNzAxTDQyOCA3ODBMNjIzIDg3OEw3OTMgNzgwTDcyNSA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzU7IiBob3Jpei1hZHYteD0iNzk2IiBkPSJNNjI3IDBINDkzTDQzOSAyOThINDM1TDMwMyAwSDE2Nkw4NiA1MDJIMjMzTDI2MyAxNTBIMjY3TDQxMiA1MDJINTIyTDU3MSAxNDlINTc1TDcwOCA1MDJIODUwTDYyNyAwWk02MDEgNTYxTDQ4NyA2MzVMMzQ5IDU2MUwzMDQgNjQwTDQ5OSA3MzhMNjY5IDY0MEw2MDEgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc2OyIgaG9yaXotYWR2LXg9IjY0NiIgZD0iTTQzMyAyNjJMMzk3IDBIMjUxTDI4NyAyNTlMOTUgNjY3SDI2M0wzNzkgMzkwTDU3NiA2NjdINzM3TDQzMyAyNjJaTTU1MCA3MDFMNDM2IDc3NUwyOTggNzAxTDI1MyA3ODBMNDQ4IDg3OEw2MTggNzgwTDU1MCA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzc7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMzMyIC0yMVEyOTkgLTgzIDI3MyAtMTIzVDIyMCAtMTg2VDE2MSAtMjE3VDgzIC0yMjZRNjkgLTIyNiA1MSAtMjI1VDggLTIyMUwyNSAtMTA0UTMyIC0xMDYgNDQgLTEwNlQ4MCAtMTA3UTEwMCAtMTA3IDExMyAtMTA0VDEzNiAtOTRUMTU0IC03NlQxNzIgLTQ3TDIwNCAxMUw3NyA1MDJIMjMwTDI5NSAxNTRIMjk5TDQ2MSA1MDJINjEyTDMzMiAtMjFaTTQ4MiA1NjFMMzY4IDYzNUwyMzAgNTYxTDE4NSA2NDBMMzgwIDczOEw1NTAgNjQwTDQ4MiA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzg7IiBob3Jpei1hZHYteD0iNjQ2IiBkPSJNNDMzIDI2MkwzOTcgMEgyNTFMMjg3IDI1OUw5NSA2NjdIMjYzTDM3OSAzOTBMNTc2IDY2N0g3MzdMNDMzIDI2MlpNNjE2IDc4OVE2MTYgNzczIDYxMCA3NTlUNTkyIDczM1Q1NjcgNzE2VDUzNiA3MDlRNTEwIDcwOSA0OTMgNzI2VDQ3NSA3NzBRNDc1IDc4NiA0ODIgODAwVDUwMCA4MjRUNTI2IDg0MVQ1NTYgODQ4UTU4MSA4NDggNTk4IDgzMlQ2MTYgNzg5Wk0zOTMgNzg5UTM5MyA3NzMgMzg3IDc1OVQzNjkgNzMzVDM0NCA3MTZUMzEzIDcwOVEyODcgNzA5IDI3MCA3MjZUMjUzIDc2OVEyNTMgNzg1IDI1OSA3OTlUMjc3IDgyNFQzMDMgODQxVDMzMyA4NDhRMzU4IDg0OCAzNzUgODMyVDM5MyA3ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzk7IiBob3Jpei1hZHYteD0iNjA3IiBkPSJNNDMgMEw1OCAxMDdMNDQzIDU0M0gxMzVMMTUyIDY2N0g2NDFMNjI2IDU2MEwyMzYgMTE5SDU4MEw1NjQgMEg0M1pNMzk2IDcwNUwzMTggNzUwTDQ3NiA4ODJMNjA4IDgyM0wzOTYgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdBOyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTM0IDBMNDcgOTVMMzIxIDM4OUg5MUwxMDcgNTAySDUwOUw0OTUgNDAxTDIyNSAxMTJINDYzTDQ0OCAwSDM0Wk0zMTEgNTY1TDIzMyA2MTBMMzkxIDc0Mkw1MjMgNjgzTDMxMSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBob3Jpei1hZHYteD0iNjA3IiBkPSJNNDMgMEw1OCAxMDdMNDQzIDU0M0gxMzVMMTUyIDY2N0g2NDFMNjI2IDU2MEwyMzYgMTE5SDU4MEw1NjQgMEg0M1pNNTA3IDc5N1E1MDcgNzU4IDQ3OCA3MzdUNDEzIDcxNlEzOTkgNzE2IDM4NiA3MTlUMzYyIDczMFQzNDUgNzQ4VDMzOCA3NzVRMzM4IDc5NSAzNDYgODEwVDM2NyA4MzVUMzk4IDg1MFQ0MzMgODU1UTQ2MSA4NTUgNDg0IDg0MlQ1MDcgNzk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdDOyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTM0IDBMNDcgOTVMMzIxIDM4OUg5MUwxMDcgNTAySDUwOUw0OTUgNDAxTDIyNSAxMTJINDYzTDQ0OCAwSDM0Wk00MjUgNjUwUTQyNSA2MTEgMzk2IDU5MFQzMzEgNTY5UTMxNyA1NjkgMzA0IDU3MlQyODAgNTgzVDI2MyA2MDFUMjU2IDYyOFEyNTYgNjQ4IDI2NCA2NjNUMjg1IDY4OFQzMTYgNzAzVDM1MSA3MDhRMzc5IDcwOCA0MDIgNjk1VDQyNSA2NTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0Q7IiBob3Jpei1hZHYteD0iNjA3IiBkPSJNNDMgMEw1OCAxMDdMNDQzIDU0M0gxMzVMMTUyIDY2N0g2NDFMNjI2IDU2MEwyMzYgMTE5SDU4MEw1NjQgMEg0M1pNNTkyIDgwMkw0MTAgNzA1TDI1NCA4MDJMMzE3IDg3N0w0MjIgODA4TDU0OSA4NzdMNTkyIDgwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik0zNCAwTDQ3IDk1TDMyMSAzODlIOTFMMTA3IDUwMkg1MDlMNDk1IDQwMUwyMjUgMTEySDQ2M0w0NDggMEgzNFpNNTE3IDY2MkwzMzUgNTY1TDE3OSA2NjJMMjQyIDczN0wzNDcgNjY4TDQ3NCA3MzdMNTE3IDY2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE5MjsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik02MzYgNTkxUTYyNCA1OTIgNjE3IDU5M1Q1OTQgNTk0UTU1MCA1OTQgNTMyIDU3OVQ1MDMgNTM1TDQ3MiA0NDhINTgwTDU0NCAzMzRINDM4TDMyNCAtN1EyOTIgLTEwMCAyNDEgLTE0N1QxMDMgLTE5NVE4MCAtMTk1IDU3IC0xOTJUMTYgLTE4Mkw0OCAtODBRNjIgLTg0IDc0IC04NVQxMDYgLTg2UTE0MyAtODYgMTY0IC01MVQyMDQgNDNMMjk3IDMzNEgyMjBMMjU2IDQ0OEgzMzNMMzY3IDU1M1EzODAgNTk0IDM5OCA2MjFUNDQzIDY2NFQ1MDkgNjg4VDYwNCA2OTVRNjIxIDY5NSA2MzQgNjk1VDY2OCA2OTRMNjM2IDU5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFGQzsiIGhvcml6LWFkdi14PSI5MzkiIGQ9Ik00NTQgMEw0NzUgMTUxSDI1NUwxNjUgMEgxNEw0NDggNjY3SDk4NUw5NjkgNTQ4SDY3NEw2NTQgNDA2SDkyMEw5MDIgMjgzSDYzNkw2MTMgMTE5SDkxOEw5MDIgMEg0NTRaTTUzMCA1NDdINTA3TDMyOCAyNzNINDkyTDUzMCA1NDdaTTcwNCA3MDVMNjI2IDc1MEw3ODQgODgyTDkxNiA4MjNMNzA0IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFGRDsiIGhvcml6LWFkdi14PSI4OTEiIGQ9Ik04ODggMjk4UTg4OCAyNzQgODg1IDI1MFQ4NzYgMjAzSDUyMUw1MjAgMTkwUTUyMCAxNjQgNTI5IDE0N1Q1NTQgMTE4VDU5MSAxMDJUNjM1IDk3UTY3NyA5NyA3MTUgMTA3VDc5MCAxMzhMODIzIDQzUTc3MyAxNyA3MjIgM1Q2MTUgLTExUTU2MSAtMTEgNTEzIDVUNDMxIDU5UTQxNSA0NSAzOTAgMzJUMzM2IDlUMjczIC03VDIwOSAtMTNRMTc4IC0xMyAxNTAgLTdUMTAwIDE1VDY2IDU0VDUzIDExNFE1MyAxODMgODYgMjI0VDE3MSAyODdUMjgyIDMxNlQzOTUgMzIzUTM5NyAzMzQgMzk4IDM0NFQzOTkgMzY1UTM5OSAzODAgMzkzIDM4OFQzNzggNDAwVDM1NyA0MDVUMzMzIDQwNlEyODYgNDA2IDIzNiAzOTJUMTQzIDM1NUwxMTEgNDUzUTE3MiA0ODIgMjMyIDQ5N1QzNjAgNTEzUTM3OSA1MTMgNDAwIDUxMVQ0NDIgNTAzVDQ3OSA0ODZUNTA4IDQ1N1E1NDQgNDg2IDU4OCA1MDBUNjc4IDUxNFE3NzkgNTE0IDgzMyA0NTZUODg4IDI5OFpNNzYzIDI5NVE3NjMgNDExIDY2NSA0MTFRNjEwIDQxMSA1NzYgMzgwVDUzMyAyOTVINzYzWk0zOTAgMTMwUTM4NSAxNDQgMzgzIDE2MFQzODAgMTkwUTM4MCAyMDMgMzgxIDIxNlQzODUgMjQyUTM1OCAyNDIgMzI0IDI0MFQyNjEgMjI3VDIxMiAxOTVUMTkyIDEzN1ExOTIgMTA5IDIwOSA5M1QyNTMgNzdRMjk2IDc3IDMzMCA5M1QzOTAgMTMwWk01NDUgNTY1TDQ2NyA2MTBMNjI1IDc0Mkw3NTcgNjgzTDU0NSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkU7IiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNzY4IDQxMVE3NjggMzIxIDc0NCAyNDRUNjcxIDExMFQ1NTAgMjJUMzg0IC0xMFEzMjcgLTEwIDI4MCAxVDE5NiAzOEwxMjcgLTI2TDY0IDU5TDEyNiAxMTdROTYgMTc0IDk2IDI1OVE5NiAzNDkgMTIxIDQyNVQxOTUgNTU4VDMxNiA2NDZUNDgxIDY3OFE1NDEgNjc4IDU5MCA2NjVUNjc3IDYyM0w3NDkgNjkwTDgxOSA2MTJMNzQzIDU0MVE3NjggNDg1IDc2OCA0MTFaTTI0OCAyNjNRMjQ4IDI1NCAyNDggMjQ2VDI0OSAyMzBMNTczIDUyOFE1MzUgNTYwIDQ2NCA1NjBRNDA5IDU2MCAzNzIgNTQzVDMxMSA0OTZUMjc0IDQyNVQyNTQgMzM0UTI0OCAyOTggMjQ4IDI2M1pNNDAxIDEwOFE0NTYgMTA4IDQ5MyAxMjVUNTUzIDE3MlQ1OTAgMjQ0VDYxMCAzMzRRNjE2IDM3MCA2MTYgNDA3UTYxNiA0MTIgNjE2IDQxNVQ2MTUgNDI0TDMwMCAxMzNRMzM1IDEwOCA0MDEgMTA4Wk00NzIgNzA5TDM5NCA3NTRMNTUyIDg4Nkw2ODQgODI3TDQ3MiA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkY7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNTY5IDQyNFE1ODYgMzk4IDU5MiAzNjhUNTk4IDMwNlE1OTggMjM3IDU3OCAxNzlUNTIwIDc5VDQyNiAxM1QyOTkgLTExUTI1OSAtMTEgMjE5IC0yVDE0NyAzM0w4NyAtMjNMMzYgNDFMOTMgOTVRODIgMTE4IDc3IDE0M1Q3MiAxOTVRNzIgMjY0IDkyIDMyMlQxNTEgNDIzVDI0NiA0ODlUMzczIDUxM1E0MDggNTEzIDQ0MyA1MDdUNTA4IDQ4Mkw1NzMgNTM5TDYzMCA0ODBMNTY5IDQyNFpNNDEzIDM3OVE0MDIgMzkwIDM4NyAzOTVUMzU3IDQwMFEzMTYgNDAwIDI4OSAzODRUMjQ2IDM0MFQyMjMgMjc5VDIxNiAyMDlRMjE2IDIwMyAyMTggMTkzTDQxMyAzNzlaTTMxNSA5OFEzNTYgOTggMzgzIDExNVQ0MjUgMTYxVDQ0NyAyMjRUNDU0IDI5NFE0NTQgMzA5IDQ1MSAzMjRMMjQyIDEyOVEyNTIgMTEyIDI3NCAxMDVUMzE1IDk4Wk0zNzggNTY1TDMwMCA2MTBMNDU4IDc0Mkw1OTAgNjgzTDM3OCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTg7IiBob3Jpei1hZHYteD0iNjAxIiBkPSJNNTgyIDIxNlE1ODIgMTUzIDU2MCAxMTBUNDk5IDQxVDQxMSAyVDMwNSAtMTBRMjMwIC0xMCAxNjcgOFQ0MiA3MUwxMjEgMTc1UTE2MyAxNDQgMjA5IDEyNFQzMDkgMTA0UTMzMCAxMDQgMzUyIDEwNlQzOTMgMTE3VDQyNCAxNDFUNDM2IDE4MVE0MzYgMjEwIDQxMyAyMjhUMzU0IDI2MFQyNzggMjkwVDIwMSAzMjdUMTQzIDM4MVQxMTkgNDY1UTExOSA1MjQgMTQyIDU2NFQyMDMgNjI5VDI4OSA2NjVUMzkwIDY3NlE1MTAgNjc2IDYxNiA2MTdMNTQ4IDUwNVE1MTMgNTI4IDQ3MiA1NDNUMzg3IDU1OVEzNjggNTU5IDM0NyA1NTdUMzA5IDU0N1QyODAgNTI3VDI2OCA0OTJRMjY4IDQ2NCAyOTEgNDQ3VDM0OSA0MTdUNDI1IDM5MVQ1MDAgMzU2VDU1OCAzMDJUNTgyIDIxNlpNMjU3IC0yMjZIMTYxTDIxOCAtNTVIMzY3TDI1NyAtMjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE5OyIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTQ4MCAxNjdRNDgwIDExNiA0NjEgODJUNDExIDI3VDMzOCAtMlQyNTIgLTExUTE5NSAtMTEgMTM4IDRUMzMgNTBMOTUgMTQ2UTEzMyAxMjMgMTc0IDEwOFQyNjEgOTJRMjc1IDkyIDI5MCA5NFQzMTcgMTAxVDMzNyAxMTdUMzQ1IDE0NlEzNDUgMTY0IDMyNyAxNzRUMjgwIDE5M1QyMTkgMjExVDE1OCAyMzdUMTExIDI3OVQ5MiAzNDdROTIgMzkzIDExMSA0MjVUMTYyIDQ3NlQyMzQgNTA0VDMxNyA1MTNRMzY1IDUxMyA0MTQgNTAzVDUwNSA0NzBMNDU0IDM3MFE0MjUgMzg3IDM4OSAzOTdUMzE4IDQwOFEzMDYgNDA4IDI5MCA0MDdUMjU5IDQwMlQyMzUgMzg4VDIyNSAzNjJRMjI1IDM0NCAyNDQgMzM1VDI5MSAzMTdUMzUyIDMwMFQ0MTQgMjc2VDQ2MSAyMzRUNDgwIDE2N1pNMjA3IC0yMjZIMTExTDE2OCAtNTVIMzE3TDIwNyAtMjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjM3OyIgaG9yaXotYWR2LXg9IjI3NCIgZD0iTTIwOCAtMTdRMTc4IC0yMjYgLTI2IC0yMjZRLTQ4IC0yMjYgLTY4IC0yMjVULTEwOSAtMjIxTC05MiAtMTAzUS01OSAtMTA2IC0yNiAtMTA2UTIgLTEwNiAxOSAtMTAwVDQ3IC04MFQ2MSAtNDdUNzAgMEwxNDAgNTAySDI4MUwyMDggLTE3SDIwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNjsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0zNzggNTYxTDI2NCA2MzVMMTI2IDU2MUw4MSA2NDBMMjc2IDczOEw0NDYgNjQwTDM3OCA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzc7IiBob3Jpei1hZHYteD0iMzQ4IiBkPSJNNDM2IDY2MkwyNTQgNTY1TDk4IDY2MkwxNjEgNzM3TDI2NiA2NjhMMzkzIDczN0w0MzYgNjYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ4OyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTQ0NiA3MDZRNDM1IDY2MSA0MTIgNjM0VDM2MSA1OTFUMzA0IDU3MFQyNTEgNTY1UTIyNyA1NjUgMjAwIDU3MFQxNTAgNTkwVDExMyA2MzNUMTAwIDcwNkgxOTdRMTk2IDY4MCAyMTAgNjU5VDI2MiA2MzhRMjk4IDYzOCAzMjAgNjU5VDM0OCA3MDZINDQ2SDQ0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEOTsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0zNDcgNjUwUTM0NyA2MTEgMzE4IDU5MFQyNTMgNTY5UTIzOSA1NjkgMjI2IDU3MlQyMDIgNTgzVDE4NSA2MDFUMTc4IDYyOFExNzggNjQ4IDE4NiA2NjNUMjA3IDY4OFQyMzggNzAzVDI3MyA3MDhRMzAxIDcwOCAzMjQgNjk1VDM0NyA2NTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREE7IiBob3Jpei1hZHYteD0iMzQ4IiBkPSJNMzc5IDY4NFEzNzkgNjU4IDM2OSA2MzZUMzQzIDU5OVQzMDMgNTc0VDI1NSA1NjVRMjE0IDU2NSAxODQgNTg4VDE1NCA2NTRRMTU0IDY3OSAxNjQgNzAxVDE5MCA3MzhUMjI5IDc2M1QyNzcgNzcyUTI5NyA3NzIgMzE1IDc2N1QzNDggNzUwVDM3MCA3MjJUMzc5IDY4NFpNMjY0IDYxNlEyOTAgNjE2IDMwNCA2MzRUMzE4IDY3OFEzMTggNjk4IDMwNiA3MDlUMjcxIDcyMFEyNDYgNzIwIDIzMSA3MDNUMjE1IDY2MFEyMTUgNjQwIDIyOCA2MjhUMjY0IDYxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQjsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0yMzUgMVEyMjEgLTkgMjA1IC0yMVQxNzUgLTQ3VDE1MiAtNzlUMTQzIC0xMTVRMTQzIC0xMzQgMTU0IC0xNDVUMTg1IC0xNTZRMjAyIC0xNTYgMjEzIC0xNTJUMjM5IC0xNDFMMjUxIC0yMTlRMjI5IC0yMjggMjAwIC0yMzRUMTQ4IC0yNDFRMTAzIC0yNDEgNzIgLTIyMFQ0MSAtMTUwUTQxIC0xMTggNTYgLTkxVDk0IC00MlQxNDUgLTRUMjAxIDIyTDIzNSAxSDIzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQzsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik00NTQgNjU1UTQzMyA2MTAgMzk4IDU4OVQzMjggNTY3UTMwNSA1NjcgMjg4IDU3M1QyNTUgNTg4VDIyNiA2MDNUMTk3IDYxMFExODAgNjEwIDE2MiA2MDFUMTMwIDU2Nkw3MiA2MTlRMTAxIDY2OSAxMzEgNjg3VDE5NyA3MDZRMjE4IDcwNiAyMzUgNjk5VDI2OCA2ODRUMjk4IDY2OVQzMjkgNjYyUTM0NiA2NjIgMzYzIDY3MVQzOTQgNzA2TDQ1NCA2NTVINDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkREOyIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTM0MCA1NjZMMjc0IDYxMEw0NDAgNzQxTDU1MyA2ODRMMzQwIDU2NlpNNzIgNTY2TDcgNjEwTDE3MyA3NDFMMjg2IDY4NEw3MiA1NjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgwOyIgaG9yaXotYWR2LXg9IjEwMDUiIGQ9Ik03ODggMEg2MzJMNTY5IDQ3M0g1NjRMMzY3IDBIMjA0TDExNCA2NjdIMjc1TDMxNSAxNzdIMzE5TDUyNCA2NjdINjcyTDczMiAxNzdINzM2TDkyMiA2NjdIMTA3N0w3ODggMFpNNjAzIDcwNUw0MjMgODIzTDU3MyA4ODFMNjkzIDc1MEw2MDMgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4MTsiIGhvcml6LWFkdi14PSI3OTYiIGQ9Ik02MjcgMEg0OTNMNDM5IDI5OEg0MzVMMzAzIDBIMTY2TDg2IDUwMkgyMzNMMjYzIDE1MEgyNjdMNDEyIDUwMkg1MjJMNTcxIDE0OUg1NzVMNzA4IDUwMkg4NTBMNjI3IDBaTTQ3OSA1NjVMMjk5IDY4M0w0NDkgNzQxTDU2OSA2MTBMNDc5IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODI7IiBob3Jpei1hZHYteD0iMTAwNSIgZD0iTTc4OCAwSDYzMkw1NjkgNDczSDU2NEwzNjcgMEgyMDRMMTE0IDY2N0gyNzVMMzE1IDE3N0gzMTlMNTI0IDY2N0g2NzJMNzMyIDE3N0g3MzZMOTIyIDY2N0gxMDc3TDc4OCAwWk02MDcgNzA1TDUyOSA3NTBMNjg3IDg4Mkw4MTkgODIzTDYwNyA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgzOyIgaG9yaXotYWR2LXg9Ijc5NiIgZD0iTTYyNyAwSDQ5M0w0MzkgMjk4SDQzNUwzMDMgMEgxNjZMODYgNTAySDIzM0wyNjMgMTUwSDI2N0w0MTIgNTAySDUyMkw1NzEgMTQ5SDU3NUw3MDggNTAySDg1MEw2MjcgMFpNNDc3IDU2NUwzOTkgNjEwTDU1NyA3NDJMNjg5IDY4M0w0NzcgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NDsiIGhvcml6LWFkdi14PSIxMDA1IiBkPSJNNzg4IDBINjMyTDU2OSA0NzNINTY0TDM2NyAwSDIwNEwxMTQgNjY3SDI3NUwzMTUgMTc3SDMxOUw1MjQgNjY3SDY3Mkw3MzIgMTc3SDczNkw5MjIgNjY3SDEwNzdMNzg4IDBaTTc5MSA3ODlRNzkxIDc3MyA3ODUgNzU5VDc2NyA3MzNUNzQyIDcxNlQ3MTEgNzA5UTY4NSA3MDkgNjY4IDcyNlQ2NTAgNzcwUTY1MCA3ODYgNjU3IDgwMFQ2NzUgODI0VDcwMSA4NDFUNzMxIDg0OFE3NTYgODQ4IDc3MyA4MzJUNzkxIDc4OVpNNTY4IDc4OVE1NjggNzczIDU2MiA3NTlUNTQ0IDczM1Q1MTkgNzE2VDQ4OCA3MDlRNDYyIDcwOSA0NDUgNzI2VDQyOCA3NjlRNDI4IDc4NSA0MzQgNzk5VDQ1MiA4MjRUNDc4IDg0MVQ1MDggODQ4UTUzMyA4NDggNTUwIDgzMlQ1NjggNzg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NTsiIGhvcml6LWFkdi14PSI3OTYiIGQ9Ik02MjcgMEg0OTNMNDM5IDI5OEg0MzVMMzAzIDBIMTY2TDg2IDUwMkgyMzNMMjYzIDE1MEgyNjdMNDEyIDUwMkg1MjJMNTcxIDE0OUg1NzVMNzA4IDUwMkg4NTBMNjI3IDBaTTY2NyA2NDlRNjY3IDYzMyA2NjEgNjE5VDY0MyA1OTNUNjE4IDU3NlQ1ODcgNTY5UTU2MSA1NjkgNTQ0IDU4NlQ1MjYgNjMwUTUyNiA2NDYgNTMzIDY2MFQ1NTEgNjg0VDU3NyA3MDFUNjA3IDcwOFE2MzIgNzA4IDY0OSA2OTJUNjY3IDY0OVpNNDQ0IDY0OVE0NDQgNjMzIDQzOCA2MTlUNDIwIDU5M1QzOTUgNTc2VDM2NCA1NjlRMzM4IDU2OSAzMjEgNTg2VDMwNCA2MjlRMzA0IDY0NSAzMTAgNjU5VDMyOCA2ODRUMzU0IDcwMVQzODQgNzA4UTQwOSA3MDggNDI2IDY5MlQ0NDQgNjQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUVGMjsiIGhvcml6LWFkdi14PSI2NDYiIGQ9Ik00MzMgMjYyTDM5NyAwSDI1MUwyODcgMjU5TDk1IDY2N0gyNjNMMzc5IDM5MEw1NzYgNjY3SDczN0w0MzMgMjYyWk00MjAgNzA1TDI0MCA4MjNMMzkwIDg4MUw1MTAgNzUwTDQyMCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRUYzOyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTMzMiAtMjFRMjk5IC04MyAyNzMgLTEyM1QyMjAgLTE4NlQxNjEgLTIxN1Q4MyAtMjI2UTY5IC0yMjYgNTEgLTIyNVQ4IC0yMjFMMjUgLTEwNFEzMiAtMTA2IDQ0IC0xMDZUODAgLTEwN1ExMDAgLTEwNyAxMTMgLTEwNFQxMzYgLTk0VDE1NCAtNzZUMTcyIC00N0wyMDQgMTFMNzcgNTAySDIzMEwyOTUgMTU0SDI5OUw0NjEgNTAySDYxMkwzMzIgLTIxWk0zNjAgNTY1TDE4MCA2ODNMMzMwIDc0MUw0NTAgNjEwTDM2MCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDEzOyIgaG9yaXotYWR2LXg9IjU4OCIgZD0iTTczIDIwOEw4OCAzMTVINTg4TDU3MyAyMDhINzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE0OyIgaG9yaXotYWR2LXg9Ijg2NiIgZD0iTTczIDIxMEw4NyAzMTNIODY1TDg1MSAyMTBINzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE4OyIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTIzNSA0NTVINzdMMjIzIDcwMEgzMjNMMjM1IDQ1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBob3Jpei1hZHYteD0iMjcyIiBkPSJNMjEwIDQ1NUgxMTBMMTk4IDcwMEgzNTZMMjEwIDQ1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBob3Jpei1hZHYteD0iMjcyIiBkPSJNMTIxIC0xNzhIMjFMMTA5IDY3SDI2N0wxMjEgLTE3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUM7IiBob3Jpei1hZHYteD0iNTE2IiBkPSJNNDc5IDQ1NUgzMjFMNDY3IDcwMEg1NjdMNDc5IDQ1NVpNMjM1IDQ1NUg3N0wyMjMgNzAwSDMyM0wyMzUgNDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRDsiIGhvcml6LWFkdi14PSI1MTYiIGQ9Ik00NTMgNDU1SDM1M0w0NDEgNzAwSDYwMEw0NTMgNDU1Wk0yMTAgNDU1SDExMEwxOTggNzAwSDM1NkwyMTAgNDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRTsiIGhvcml6LWFkdi14PSI1MTYiIGQ9Ik0zNjQgLTE3OUgyNjRMMzUyIDY3SDUxMUwzNjQgLTE3OVpNMTIxIC0xNzlIMjFMMTA5IDY3SDI2N0wxMjEgLTE3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjA7IiBob3Jpei1hZHYteD0iMzg1IiBkPSJNMzI1IDQ0OUwyODggMTg4SDE1MEwxODcgNDQ5SDk1TDExMCA1NjFIMjAyTDIyMSA2OTJIMzU5TDM0MCA1NjFINDMxTDQxNiA0NDlIMzI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMTsiIGhvcml6LWFkdi14PSIzODUiIGQ9Ik0yOTAgMjUwTDI3MSAxMjBIMTM0TDE1MyAyNTBINjJMNzcgMzYySDE2OEwxODIgNDYxSDkwTDEwNiA1NzRIMTk4TDIxNSA2OTJIMzUyTDMzNSA1NzRINDI3TDQxMSA0NjFIMzE5TDMwNSAzNjJIMzk3TDM4MiAyNTBIMjkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGhvcml6LWFkdi14PSI1MTciIGQ9Ik00MjUgMzI5UTQyNSAyOTQgNDEyIDI2NFQzNzcgMjEyVDMyNCAxNzZUMjU4IDE2M1EyMjMgMTYzIDE5MyAxNzZUMTQxIDIxMVQxMDUgMjY0VDkyIDMyOVE5MiAzNjMgMTA1IDM5M1QxNDAgNDQ2VDE5MyA0ODJUMjU4IDQ5NVEyOTMgNDk1IDMyMyA0ODJUMzc2IDQ0N1Q0MTIgMzk0VDQyNSAzMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDI2OyIgaG9yaXotYWR2LXg9IjgzNyIgZD0iTTIyNCA2NVEyMjQgNDcgMjE2IDMzVDE5NCA5VDE2MyAtNlQxMzAgLTExUTExNiAtMTEgMTAzIC04VDc4IDNUNjAgMjFUNTMgNDhRNTMgNjYgNjIgNzlUODUgMTAyVDExNiAxMTZUMTQ4IDEyMVExNjEgMTIxIDE3NCAxMThUMTk5IDEwOFQyMTcgOTFUMjI0IDY1Wk01MTEgNjVRNTExIDQ3IDUwMyAzM1Q0ODEgOVQ0NTAgLTZUNDE3IC0xMVE0MDMgLTExIDM5MCAtOFQzNjUgM1QzNDcgMjFUMzQwIDQ4UTM0MCA2NiAzNDkgNzlUMzcyIDEwMlQ0MDMgMTE2VDQzNSAxMjFRNDQ4IDEyMSA0NjEgMTE4VDQ4NiAxMDhUNTA0IDkxVDUxMSA2NVpNNzk4IDY1UTc5OCA0NyA3OTAgMzNUNzY4IDlUNzM3IC02VDcwNCAtMTFRNjkwIC0xMSA2NzcgLThUNjUyIDNUNjM0IDIyVDYyNyA0OFE2MjcgNjYgNjM2IDc5VDY1OSAxMDJUNjkwIDExNlQ3MjIgMTIxUTczNSAxMjEgNzQ4IDExOFQ3NzMgMTA4VDc5MSA5MVQ3OTggNjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDMwOyIgaG9yaXotYWR2LXg9IjEwNTgiIGQ9Ik0zODAgNTg3UTM4MCA1NDkgMzcyIDUxNVQzNDUgNDU0VDI5NyA0MTFUMjI1IDM5NVExNjggMzk1IDE0MSA0MjRUMTEzIDUwOVExMTMgNTQ2IDEyMSA1ODBUMTQ5IDY0MVQxOTcgNjg0VDI2OCA3MDBRMzgwIDcwMCAzODAgNTg3Wk0yMzQgNDU4UTI1NiA0NTggMjY5IDQ3MVQyODkgNTA0VDI5OCA1NDZUMzAxIDU4NFEzMDEgNjA3IDI5MyA2MjFUMjU5IDYzNlEyMzcgNjM2IDIyNCA2MjJUMjA0IDU4OVQxOTUgNTQ3VDE5MyA1MDhRMTkzIDQ4NiAyMDEgNDcyVDIzNCA0NThaTTIwMyAwSDEyNkw2ODYgNzAwSDc2MkwyMDMgMFpNNzA5IDE4N1E3MDkgMTQ5IDcwMSAxMTVUNjc0IDU0VDYyNiAxMVQ1NTQgLTVRNDQyIC01IDQ0MiAxMDdRNDQyIDE0NCA0NTAgMTc5VDQ3NyAyNDFUNTI1IDI4NFQ1OTcgMzAwUTcwOSAzMDAgNzA5IDE4N1pNNTYzIDU3UTU4NSA1NyA1OTggNzFUNjE4IDEwNVQ2MjcgMTQ3VDYyOSAxODVRNjI5IDIwNyA2MjEgMjIxVDU4OCAyMzZRNTY2IDIzNiA1NTMgMjIzVDUzMyAxOTBUNTI0IDE0OVQ1MjEgMTExUTUyMSA4OSA1MjkgNzNUNTYzIDU3Wk0xMDQxIDE4N1ExMDQxIDE0OSAxMDMzIDExNVQxMDA2IDU0VDk1OCAxMVQ4ODYgLTVRNzczIC01IDc3MyAxMDdRNzczIDE0NSA3ODEgMTgwVDgwOCAyNDFUODU3IDI4NFQ5MjkgMzAwUTEwNDEgMzAwIDEwNDEgMTg3Wk04OTUgNTdROTE3IDU3IDkyOSA3MVQ5NDkgMTA2VDk1OCAxNDlUOTYwIDE4N1E5NjAgMjA4IDk1MiAyMjJUOTIwIDIzNlE4OTggMjM2IDg4NSAyMjNUODY0IDE5MFQ4NTUgMTQ4VDg1MyAxMTBRODUzIDg3IDg2MSA3MlQ4OTUgNTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDM5OyIgaG9yaXotYWR2LXg9IjI3MCIgZD0iTTE1MiA5N0w1NiAzMDBMMjA5IDUwMkwyOTcgNDU1TDE3NSAyOTlMMjU0IDE0NEwxNTIgOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDNBOyIgaG9yaXotYWR2LXg9IjI3MCIgZD0iTTE0NCA5N0w1NiAxNDRMMTc5IDI5OUw5OSA0NTVMMjAxIDUwMkwyOTggMzAwTDE0NCA5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNDQ7IiBob3Jpei1hZHYteD0iMTMxIiBkPSJNLTE1NiAwSC0yMzJMMzg2IDcwMEg0NjJMLTE1NiAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3MDsiIGhvcml6LWFkdi14PSIzNjgiIGQ9Ik00MDYgNTc0UTQwNiA1MzIgMzk3IDQ5NFQzNjcgNDI2VDMxNCAzNzlUMjM0IDM2MVExMTAgMzYxIDExMCA0ODZRMTEwIDUyOCAxMTkgNTY2VDE0OCA2MzVUMjAyIDY4MlQyODIgNzAwUTM0NSA3MDAgMzc1IDY2OFQ0MDYgNTc0Wk0yNDQgNDMxUTI2OCA0MzEgMjgyIDQ0NlQzMDUgNDg0VDMxNSA1MzFUMzE4IDU3NFEzMTggNTk4IDMwOCA2MTNUMjcyIDYyOVEyNDggNjI5IDIzMyA2MTRUMjEwIDU3N1QyMDAgNTMxVDE5NyA0ODhRMTk3IDQ2MyAyMDYgNDQ3VDI0NCA0MzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc0OyIgaG9yaXotYWR2LXg9IjM0NyIgZD0iTTMyNCA0MjlMMzE1IDM2N0gyMjVMMjM0IDQyOUg5OEw4NyA0OTNMMjcyIDY5NEgzNjFMMzM0IDUwMUgzODVMMzc1IDQyOUgzMjRaTTE2NiA0OTRIMjQ3TDI2MyA2MTFMMTY2IDQ5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzU7IiBob3Jpei1hZHYteD0iMzI5IiBkPSJNMzY0IDUwM1EzNjQgNDM4IDMyMiA0MDBUMjEwIDM2MVExNzQgMzYxIDE0MyAzNjlUODYgMzk4TDEzNiA0NThRMTY5IDQyNyAyMTEgNDI3UTIzOSA0MjcgMjU3IDQ0M1QyNzUgNDkwUTI3NSA1MDcgMjY0IDUxNlQyMjUgNTI2UTIwNyA1MjYgMTkzIDUyMVQxNjUgNTAzTDEwOSA1NDFMMTYwIDY5NEgzNzNMMzYzIDYyMkgyMTNMMTk0IDU2NUwxOTcgNTYzUTIxMiA1NzMgMjMyIDU3OFQyNzMgNTg0UTI5MSA1ODQgMzA3IDU4MFQzMzYgNTY1VDM1NiA1NDBUMzY0IDUwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzY7IiBob3Jpei1hZHYteD0iMzQxIiBkPSJNMzc2IDQ5NVEzNzYgNDYzIDM2NSA0MzhUMzMzIDM5NlQyODYgMzcwVDIyOCAzNjFRMTA5IDM2MSAxMDkgNDgxUTEwOSA1MjQgMTE4IDU2M1QxNDggNjMzVDIwMiA2ODJUMjgzIDcwMFEzMTIgNzAwIDMzNiA2OTRUMzg2IDY3MEwzNDQgNjEyUTMxNiA2MzQgMjgxIDYzNFEyNDUgNjM0IDIyOSA2MTJUMjA3IDU1N0gyMTFRMjQxIDU4MSAyNzggNTgxUTMxOSA1ODEgMzQ3IDU2MVQzNzYgNDk1Wk0yMzcgNDI5UTI2MSA0MjkgMjc2IDQ0NFQyOTIgNDgzUTI5MiA1MjMgMjQ5IDUyM1EyMjQgNTIzIDIxMCA1MDhUMTk1IDQ2OVExOTUgNDUwIDIwNyA0NDBUMjM3IDQyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzc7IiBob3Jpei1hZHYteD0iMzA3IiBkPSJNMzcyIDYyN1EzMzEgNTk3IDMwNiA1NzNUMjY2IDUyM1QyNDQgNDY1VDIzMiAzODZMMjMwIDM2N0gxMzVMMTM3IDM4NVExNDAgNDA5IDE0OCA0MzlUMTcwIDUwMlQyMDcgNTY0VDI2MSA2MTlWNjIzSDEwMkwxMTIgNjk0SDM2NkwzNzIgNjI3SDM3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzg7IiBob3Jpei1hZHYteD0iMzM3IiBkPSJNMzY4IDQ3NlEzNjggNDQzIDM1NiA0MjFUMzIzIDM4NlQyNzUgMzY3VDIxOSAzNjFRMTk3IDM2MSAxNzYgMzY0VDEzNyAzNzZUMTA4IDQwMVQ5NyA0NDRROTcgNDgxIDExMyA1MDJUMTYzIDUzOFY1NDJRMTQ2IDU1MCAxMzcgNTYyVDEyNyA1OTVRMTI3IDYyNSAxMzkgNjQ1VDE3MCA2NzdUMjE0IDY5NFQyNjUgNjk5UTI4NCA2OTkgMzA0IDY5N1QzNDEgNjg3VDM2OSA2NjVUMzgwIDYyNlEzODAgNTY2IDMyNCA1NDJWNTM4UTM0NCA1MjggMzU2IDUxNFQzNjggNDc2Wk0yNDYgNTY1UTI2NSA1NjUgMjgwIDU3NlQyOTUgNjA3UTI5NSA2MjQgMjg1IDYzMlQyNTcgNjQwUTIzNiA2NDAgMjIzIDYyOFQyMTAgNTk1UTIxMCA1NzkgMjIwIDU3MlQyNDYgNTY1Wk0yMjYgNDIyUTI0OSA0MjIgMjY1IDQzNlQyODIgNDc0UTI4MiA0OTQgMjY5IDUwMVQyMzggNTA5UTIxNCA1MDkgMTk5IDQ5NlQxODQgNDU4UTE4NCA0MzkgMTk2IDQzMVQyMjYgNDIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3OTsiIGhvcml6LWFkdi14PSIzNDAiIGQ9Ik0zNzkgNTc4UTM3OSA1MzUgMzcxIDQ5NlQzNDIgNDI2VDI5MCAzNzhUMjA5IDM2MFExNzggMzYwIDE1NCAzNjdUMTA0IDM5MUwxNDUgNDQ4UTE3NCA0MjYgMjEwIDQyNlEyNDggNDI2IDI2MyA0NDlUMjg0IDUwNUgyODBRMjY2IDQ5MSAyNDkgNDg1VDIxMiA0NzlRMTcxIDQ3OSAxNDMgNDk5VDExNCA1NjVRMTE0IDU5NyAxMjUgNjIyVDE1NyA2NjRUMjA0IDY5MFQyNjIgNjk5UTMyMiA2OTkgMzUwIDY2OFQzNzkgNTc4Wk0yNDAgNTQwUTI2NSA1NDAgMjgwIDU1NVQyOTUgNTk2UTI5NSA2MTUgMjg0IDYyNFQyNTMgNjM0UTIyOCA2MzQgMjE0IDYxOFQxOTkgNTc4UTE5OSA1NTkgMjEwIDU1MFQyNDAgNTQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MDsiIGhvcml6LWFkdi14PSIzNjgiIGQ9Ik0zMzggOTJRMzM4IDUwIDMyOSAxMlQyOTkgLTU2VDI0NiAtMTAzVDE2NiAtMTIxUTQyIC0xMjEgNDIgNFE0MiA0NiA1MSA4NFQ4MCAxNTNUMTM0IDIwMFQyMTQgMjE4UTI3NyAyMTggMzA3IDE4NlQzMzggOTJaTTE3NiAtNTFRMjAwIC01MSAyMTQgLTM2VDIzNyAxVDI0NyA0N1QyNTAgOTBRMjUwIDExNCAyNDEgMTMwVDIwNCAxNDdRMTc5IDE0NyAxNjUgMTMyVDE0MyA5NlQxMzMgNTBUMTMwIDdRMTMwIC0xOCAxMzggLTM0VDE3NiAtNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgxOyIgaG9yaXotYWR2LXg9IjMwMSIgZD0iTTEwNCAtNDRMMTI3IDEyMEgxMjNMNTUgOTFMMzggMTU3TDE2MCAyMTJIMjMxTDE5NSAtNDRIMjcyTDI2MiAtMTE1SDEzTDIzIC00NEgxMDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgyOyIgaG9yaXotYWR2LXg9IjMyNiIgZD0iTTIxIC0xMTZMMTggLTQzUTYxIC0xNSA5NiA2VDE1NyA0NFQxOTcgNzhUMjEyIDExNFEyMTIgMTI2IDIwNCAxMzRUMTc4IDE0M1ExNTMgMTQzIDEzNCAxMzVUOTIgMTA1TDUwIDE2MVE5MCAxOTIgMTI0IDIwNVQxOTggMjE4UTI1MCAyMTggMjc3IDE5N1QzMDUgMTM2UTMwNSAxMDIgMjg4IDc1VDI0NSAyN1QxODcgLTEyVDEyNSAtNDRIMjg1TDI3NSAtMTE2SDIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MzsiIGhvcml6LWFkdi14PSIzMTkiIGQ9Ik0yODMgLTRRMjgzIC0zNiAyNzEgLTU4VDIzOSAtOTVUMTkyIC0xMTVUMTM1IC0xMjFRMTAwIC0xMjEgNjggLTExMlQ4IC03OEw1NCAtMThRNzYgLTM4IDk2IC00NVQxMzcgLTUzUTE0NyAtNTMgMTU3IC01MVQxNzcgLTQzVDE5MSAtMjhUMTk3IC03UTE5NyA5IDE4NiAxNFQxNTcgMjBIMTA0TDExMiA4MEgxNDZRMTY5IDgwIDE4NiA5MFQyMDQgMTIwUTIwNCAxMzEgMTk2IDEzOVQxNjkgMTQ4UTE0NiAxNDggMTIzIDEzOVQ4MCAxMTNMNDcgMTcyUTg1IDE5OCAxMTcgMjA4VDE4OSAyMThRMjM3IDIxOCAyNjUgMTk5VDI5MyAxMzlRMjkzIDExMCAyODEgOTNUMjQyIDYxVjU3UTI4MyA0NSAyODMgLTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg0OyIgaG9yaXotYWR2LXg9IjM0NyIgZD0iTTI1NiAtNTNMMjQ3IC0xMTVIMTU3TDE2NiAtNTNIMzBMMTkgMTFMMjA0IDIxMkgyOTNMMjY2IDE5SDMxN0wzMDcgLTUzSDI1NlpNOTggMTJIMTc5TDE5NiAxMjlMOTggMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg1OyIgaG9yaXotYWR2LXg9IjMyOSIgZD0iTTI5NiAyMVEyOTYgLTQ0IDI1NCAtODJUMTQyIC0xMjFRMTA2IC0xMjEgNzUgLTExM1QxOCAtODRMNjggLTI0UTEwMSAtNTUgMTQzIC01NVExNzEgLTU1IDE4OSAtMzlUMjA3IDhRMjA3IDI1IDE5NiAzNFQxNTcgNDRRMTM5IDQ0IDEyNSAzOVQ5NyAyMUw0MSA1OUw5MiAyMTJIMzA1TDI5NSAxNDBIMTQ1TDEyNiA4M0wxMjkgODFRMTQ0IDkxIDE2NCA5NlQyMDUgMTAyUTIyMyAxMDIgMjM5IDk4VDI2OCA4M1QyODggNThUMjk2IDIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4NjsiIGhvcml6LWFkdi14PSIzNDEiIGQ9Ik0zMDggMTNRMzA4IC0xOSAyOTcgLTQ0VDI2NSAtODZUMjE4IC0xMTJUMTYwIC0xMjFRNDEgLTEyMSA0MSAtMVE0MSA0MiA1MCA4MVQ4MCAxNTFUMTM0IDIwMFQyMTUgMjE4UTI0NCAyMTggMjY4IDIxMlQzMTggMTg4TDI3NiAxMzBRMjQ4IDE1MiAyMTMgMTUyUTE3NyAxNTIgMTYxIDEzMFQxMzkgNzVIMTQzUTE3MyA5OSAyMTAgOTlRMjUxIDk5IDI3OSA3OVQzMDggMTNaTTE2OSAtNTNRMTkzIC01MyAyMDggLTM4VDIyNCAxUTIyNCA0MSAxODEgNDFRMTU2IDQxIDE0MiAyNlQxMjcgLTEzUTEyNyAtMzIgMTM5IC00MlQxNjkgLTUzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4NzsiIGhvcml6LWFkdi14PSIzMDciIGQ9Ik0zMDQgMTQ1UTI2MyAxMTUgMjM4IDkxVDE5OCA0MVQxNzYgLTE3VDE2NCAtOTZMMTYyIC0xMTVINjdMNjkgLTk3UTcyIC03MyA4MCAtNDNUMTAyIDIwVDEzOSA4MlQxOTMgMTM3VjE0MUgzNEw0NCAyMTJIMjk4TDMwNCAxNDVIMzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4ODsiIGhvcml6LWFkdi14PSIzMzciIGQ9Ik0zMDEgLTZRMzAxIC0zOSAyODkgLTYxVDI1NiAtOTZUMjA4IC0xMTVUMTUyIC0xMjFRMTMwIC0xMjEgMTA5IC0xMThUNzAgLTEwNlQ0MSAtODFUMzAgLTM4UTMwIC0xIDQ2IDIwVDk2IDU2VjYwUTc5IDY4IDcwIDgwVDYwIDExM1E2MCAxNDMgNzIgMTYzVDEwMyAxOTVUMTQ3IDIxMlQxOTggMjE3UTIxNyAyMTcgMjM3IDIxNVQyNzQgMjA1VDMwMiAxODNUMzEzIDE0NFEzMTMgODQgMjU3IDYwVjU2UTI3NyA0NiAyODkgMzJUMzAxIC02Wk0xNzkgODNRMTk4IDgzIDIxMyA5NFQyMjggMTI1UTIyOCAxNDIgMjE4IDE1MFQxOTAgMTU4UTE2OSAxNTggMTU2IDE0NlQxNDMgMTEzUTE0MyA5NyAxNTMgOTBUMTc5IDgzWk0xNTkgLTYwUTE4MiAtNjAgMTk4IC00NlQyMTUgLThRMjE1IDEyIDIwMiAxOVQxNzEgMjdRMTQ3IDI3IDEzMiAxNFQxMTcgLTI0UTExNyAtNDMgMTI5IC01MVQxNTkgLTYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4OTsiIGhvcml6LWFkdi14PSIzNDAiIGQ9Ik0zMTEgOTdRMzExIDU0IDMwMyAxNVQyNzQgLTU1VDIyMiAtMTAzVDE0MSAtMTIxUTExMCAtMTIxIDg2IC0xMTRUMzYgLTkwTDc3IC0zM1ExMDYgLTU1IDE0MiAtNTVRMTgwIC01NSAxOTUgLTMyVDIxNiAyNEgyMTJRMTk4IDEwIDE4MSA0VDE0NCAtMlExMDMgLTIgNzUgMThUNDYgODRRNDYgMTE2IDU3IDE0MVQ4OSAxODNUMTM2IDIwOVQxOTQgMjE4UTI1NCAyMTggMjgyIDE4N1QzMTEgOTdaTTE3MiA1OVExOTcgNTkgMjEyIDc0VDIyNyAxMTVRMjI3IDEzNCAyMTYgMTQzVDE4NSAxNTNRMTYwIDE1MyAxNDYgMTM3VDEzMSA5N1ExMzEgNzggMTQyIDY5VDE3MiA1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwQUM7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNMTU2IDQ0M1ExNzIgNTAwIDE5NiA1NDRUMjU0IDYxN1QzMzUgNjYyVDQ0NCA2NzhRNDgwIDY3OCA1MTAgNjcyVDU2NiA2NTNUNjE1IDYyMVQ2NjMgNTc1TDU3MSA0ODlRNTQ1IDUyNyA1MTMgNTQ0VDQzNSA1NjFRNDAzIDU2MSAzODAgNTU0VDM0MSA1MzJUMzEzIDQ5NVQyOTQgNDQzSDUyMkw1MTEgMzY3SDI3OVEyNzcgMzUwIDI3NSAzMzJUMjcwIDI5N0g1MDFMNDkwIDIyMEgyNjRRMjY1IDE5MiAyNzAgMTcxVDI4OCAxMzRUMzIwIDExMlQzNzIgMTA0UTQyNiAxMDQgNDY3IDEyOVQ1NDUgMTkwTDYwNyA5OFE1NTIgNDggNDg5IDE4VDM1MSAtMTNRMjg4IC0xMyAyNDYgMVQxNzggNDRUMTM5IDExN1QxMjQgMjIwSDQ1TDU3IDI5N0gxMjdRMTI5IDMxNCAxMzEgMzMzVDEzNyAzNjdINjZMNzggNDQzSDE1NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMjI7IiBob3Jpei1hZHYteD0iNzA4IiBkPSJNNjMyIDQzN0w2NTMgNTc3TDU1NyA0NjdMNDkwIDU3N0w0NzEgNDM3SDQwMkw0MzkgNzAwSDUwMEw1NzIgNTc0TDY3NyA3MDBINzM5TDcwMiA0MzdINjMyWk0yOTAgNjQwTDI2MiA0MzdIMTkwTDIxOCA2NDBIMTMxTDE0MCA3MDBIMzg1TDM3NiA2NDBIMjkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1MzsiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0yMDcgNDM4TDIzMCA2MDJIMjI2TDE1OCA1NzNMMTQwIDYzOUwyNjMgNjk0SDMzNEwyOTggNDM4SDM3NUwzNjUgMzY3SDExNkwxMjYgNDM4SDIwN1pNMTgyIDBIMTA2TDcyNCA3MDBIODAwTDE4MiAwWk03NTUgMTExUTc1NSA3OSA3NDMgNTdUNzExIDIwVDY2NCAwVDYwNyAtNlE1NzIgLTYgNTQwIDNUNDgwIDM3TDUyNiA5N1E1NDggNzcgNTY4IDcwVDYwOSA2MlE2MTkgNjIgNjI5IDY0VDY0OSA3MlQ2NjMgODdUNjY5IDEwOFE2NjkgMTI0IDY1OCAxMjlUNjI5IDEzNUg1NzZMNTg0IDE5NUg2MThRNjQxIDE5NSA2NTggMjA1VDY3NiAyMzVRNjc2IDI0NiA2NjggMjU0VDY0MSAyNjNRNjE4IDI2MyA1OTUgMjU0VDU1MiAyMjhMNTE5IDI4N1E1NTcgMzEzIDU4OSAzMjNUNjYxIDMzM1E3MDkgMzMzIDczNyAzMTRUNzY1IDI1NFE3NjUgMjI1IDc1MyAyMDhUNzE0IDE3NlYxNzJRNzU1IDE2MCA3NTUgMTExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1NDsiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0xMDggMzY2TDEwNSA0MzlRMTQ4IDQ2NyAxODMgNDg4VDI0NCA1MjZUMjg0IDU2MFQyOTkgNTk2UTI5OSA2MDggMjkxIDYxNlQyNjUgNjI1UTI0MCA2MjUgMjIxIDYxN1QxNzkgNTg3TDEzNyA2NDNRMTc3IDY3NCAyMTEgNjg3VDI4NSA3MDBRMzM3IDcwMCAzNjQgNjc5VDM5MiA2MThRMzkyIDU4NCAzNzUgNTU3VDMzMiA1MDlUMjc0IDQ3MFQyMTIgNDM4SDM3MkwzNjIgMzY2SDEwOFpNMTgyIDBIMTA2TDcyNCA3MDBIODAwTDE4MiAwWk03NTUgMTExUTc1NSA3OSA3NDMgNTdUNzExIDIwVDY2NCAwVDYwNyAtNlE1NzIgLTYgNTQwIDNUNDgwIDM3TDUyNiA5N1E1NDggNzcgNTY4IDcwVDYwOSA2MlE2MTkgNjIgNjI5IDY0VDY0OSA3MlQ2NjMgODdUNjY5IDEwOFE2NjkgMTI0IDY1OCAxMjlUNjI5IDEzNUg1NzZMNTg0IDE5NUg2MThRNjQxIDE5NSA2NTggMjA1VDY3NiAyMzVRNjc2IDI0NiA2NjggMjU0VDY0MSAyNjNRNjE4IDI2MyA1OTUgMjU0VDU1MiAyMjhMNTE5IDI4N1E1NTcgMzEzIDU4OSAzMjNUNjYxIDMzM1E3MDkgMzMzIDczNyAzMTRUNzY1IDI1NFE3NjUgMjI1IDc1MyAyMDhUNzE0IDE3NlYxNzJRNzU1IDE2MCA3NTUgMTExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1QjsiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0yMDcgNDM4TDIzMCA2MDJIMjI2TDE1OCA1NzNMMTQwIDYzOUwyNjMgNjk0SDMzNEwyOTggNDM4SDM3NUwzNjUgMzY3SDExNkwxMjYgNDM4SDIwN1pNMTgyIDBIMTA2TDcyNCA3MDBIODAwTDE4MiAwWk03NjAgMTA5UTc2MCA3NiA3NDggNTRUNzE1IDE5VDY2NyAwVDYxMSAtNlE1ODkgLTYgNTY4IC0zVDUyOSA5VDUwMCAzNFQ0ODkgNzdRNDg5IDExNCA1MDUgMTM1VDU1NSAxNzFWMTc1UTUzOCAxODMgNTI5IDE5NVQ1MTkgMjI4UTUxOSAyNTggNTMxIDI3OFQ1NjIgMzEwVDYwNiAzMjdUNjU3IDMzMlE2NzYgMzMyIDY5NiAzMzBUNzMzIDMyMFQ3NjEgMjk4VDc3MiAyNTlRNzcyIDE5OSA3MTYgMTc1VjE3MVE3MzYgMTYxIDc0OCAxNDdUNzYwIDEwOVpNNjM4IDE5OFE2NTcgMTk4IDY3MiAyMDlUNjg3IDI0MFE2ODcgMjU3IDY3NyAyNjVUNjQ5IDI3M1E2MjggMjczIDYxNSAyNjFUNjAyIDIyOFE2MDIgMjEyIDYxMiAyMDVUNjM4IDE5OFpNNjE4IDU1UTY0MSA1NSA2NTcgNjlUNjc0IDEwN1E2NzQgMTI3IDY2MSAxMzRUNjMwIDE0MlE2MDYgMTQyIDU5MSAxMjlUNTc2IDkxUTU3NiA3MiA1ODggNjRUNjE4IDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1QzsiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zODEgNDc4UTM4MSA0NDYgMzY5IDQyNFQzMzcgMzg3VDI5MCAzNjdUMjMzIDM2MVExOTggMzYxIDE2NiAzNzBUMTA2IDQwNEwxNTIgNDY0UTE3NCA0NDQgMTk0IDQzN1QyMzUgNDI5UTI0NSA0MjkgMjU1IDQzMVQyNzUgNDM5VDI4OSA0NTRUMjk1IDQ3NVEyOTUgNDkxIDI4NCA0OTZUMjU1IDUwMkgyMDJMMjEwIDU2MkgyNDRRMjY3IDU2MiAyODQgNTcyVDMwMiA2MDJRMzAyIDYxMyAyOTQgNjIxVDI2NyA2MzBRMjQ0IDYzMCAyMjEgNjIxVDE3OCA1OTVMMTQ1IDY1NFExODMgNjgwIDIxNSA2OTBUMjg3IDcwMFEzMzUgNzAwIDM2MyA2ODFUMzkxIDYyMVEzOTEgNTkyIDM3OSA1NzVUMzQwIDU0M1Y1MzlRMzgxIDUyNyAzODEgNDc4Wk0xODIgMEgxMDZMNzI0IDcwMEg4MDBMMTgyIDBaTTc2MCAxMDlRNzYwIDc2IDc0OCA1NFQ3MTUgMTlUNjY3IDBUNjExIC02UTU4OSAtNiA1NjggLTNUNTI5IDlUNTAwIDM0VDQ4OSA3N1E0ODkgMTE0IDUwNSAxMzVUNTU1IDE3MVYxNzVRNTM4IDE4MyA1MjkgMTk1VDUxOSAyMjhRNTE5IDI1OCA1MzEgMjc4VDU2MiAzMTBUNjA2IDMyN1Q2NTcgMzMyUTY3NiAzMzIgNjk2IDMzMFQ3MzMgMzIwVDc2MSAyOThUNzcyIDI1OVE3NzIgMTk5IDcxNiAxNzVWMTcxUTczNiAxNjEgNzQ4IDE0N1Q3NjAgMTA5Wk02MzggMTk4UTY1NyAxOTggNjcyIDIwOVQ2ODcgMjQwUTY4NyAyNTcgNjc3IDI2NVQ2NDkgMjczUTYyOCAyNzMgNjE1IDI2MVQ2MDIgMjI4UTYwMiAyMTIgNjEyIDIwNVQ2MzggMTk4Wk02MTggNTVRNjQxIDU1IDY1NyA2OVQ2NzQgMTA3UTY3NCAxMjcgNjYxIDEzNFQ2MzAgMTQyUTYwNiAxNDIgNTkxIDEyOVQ1NzYgOTFRNTc2IDcyIDU4OCA2NFQ2MTggNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTVEOyIgaG9yaXotYWR2LXg9Ijc3MSIgZD0iTTM5NCA1MDNRMzk0IDQzOCAzNTIgNDAwVDI0MCAzNjFRMjA0IDM2MSAxNzMgMzY5VDExNiAzOThMMTY2IDQ1OFExOTkgNDI3IDI0MSA0MjdRMjY5IDQyNyAyODcgNDQzVDMwNSA0OTBRMzA1IDUwNyAyOTQgNTE2VDI1NSA1MjZRMjM3IDUyNiAyMjMgNTIxVDE5NSA1MDNMMTM5IDU0MUwxOTAgNjk0SDQwM0wzOTMgNjIySDI0M0wyMjQgNTY1TDIyNyA1NjNRMjQyIDU3MyAyNjIgNTc4VDMwMyA1ODRRMzIxIDU4NCAzMzcgNTgwVDM2NiA1NjVUMzg2IDU0MFQzOTQgNTAzWk0xODIgMEgxMDZMNzI0IDcwMEg4MDBMMTgyIDBaTTc2MCAxMDlRNzYwIDc2IDc0OCA1NFQ3MTUgMTlUNjY3IDBUNjExIC02UTU4OSAtNiA1NjggLTNUNTI5IDlUNTAwIDM0VDQ4OSA3N1E0ODkgMTE0IDUwNSAxMzVUNTU1IDE3MVYxNzVRNTM4IDE4MyA1MjkgMTk1VDUxOSAyMjhRNTE5IDI1OCA1MzEgMjc4VDU2MiAzMTBUNjA2IDMyN1Q2NTcgMzMyUTY3NiAzMzIgNjk2IDMzMFQ3MzMgMzIwVDc2MSAyOThUNzcyIDI1OVE3NzIgMTk5IDcxNiAxNzVWMTcxUTczNiAxNjEgNzQ4IDE0N1Q3NjAgMTA5Wk02MzggMTk4UTY1NyAxOTggNjcyIDIwOVQ2ODcgMjQwUTY4NyAyNTcgNjc3IDI2NVQ2NDkgMjczUTYyOCAyNzMgNjE1IDI2MVQ2MDIgMjI4UTYwMiAyMTIgNjEyIDIwNVQ2MzggMTk4Wk02MTggNTVRNjQxIDU1IDY1NyA2OVQ2NzQgMTA3UTY3NCAxMjcgNjYxIDEzNFQ2MzAgMTQyUTYwNiAxNDIgNTkxIDEyOVQ1NzYgOTFRNTc2IDcyIDU4OCA2NFQ2MTggNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTVFOyIgaG9yaXotYWR2LXg9Ijc3MSIgZD0iTTQzNyA2MjdRMzk2IDU5NyAzNzEgNTczVDMzMSA1MjNUMzA5IDQ2NVQyOTcgMzg2TDI5NSAzNjdIMjAwTDIwMiAzODVRMjA1IDQwOSAyMTMgNDM5VDIzNSA1MDJUMjcyIDU2NFQzMjYgNjE5VjYyM0gxNjdMMTc3IDY5NEg0MzFMNDM3IDYyN1pNMTgyIDBIMTA2TDcyNCA3MDBIODAwTDE4MiAwWk03NjAgMTA5UTc2MCA3NiA3NDggNTRUNzE1IDE5VDY2NyAwVDYxMSAtNlE1ODkgLTYgNTY4IC0zVDUyOSA5VDUwMCAzNFQ0ODkgNzdRNDg5IDExNCA1MDUgMTM1VDU1NSAxNzFWMTc1UTUzOCAxODMgNTI5IDE5NVQ1MTkgMjI4UTUxOSAyNTggNTMxIDI3OFQ1NjIgMzEwVDYwNiAzMjdUNjU3IDMzMlE2NzYgMzMyIDY5NiAzMzBUNzMzIDMyMFQ3NjEgMjk4VDc3MiAyNTlRNzcyIDE5OSA3MTYgMTc1VjE3MVE3MzYgMTYxIDc0OCAxNDdUNzYwIDEwOVpNNjM4IDE5OFE2NTcgMTk4IDY3MiAyMDlUNjg3IDI0MFE2ODcgMjU3IDY3NyAyNjVUNjQ5IDI3M1E2MjggMjczIDYxNSAyNjFUNjAyIDIyOFE2MDIgMjEyIDYxMiAyMDVUNjM4IDE5OFpNNjE4IDU1UTY0MSA1NSA2NTcgNjlUNjc0IDEwN1E2NzQgMTI3IDY2MSAxMzRUNjMwIDE0MlE2MDYgMTQyIDU5MSAxMjlUNTc2IDkxUTU3NiA3MiA1ODggNjRUNjE4IDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxMjsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik03NCAyMTFMOTEgMzI5SDYxNEw1OTcgMjExSDc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2MDsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik00NjcgMzMzTDM2MiAyMThINTk4TDU4MiAxMDFIMjYzTDE1NyAtMTdMNzcgNDZMMTI4IDEwMUg1OUw3NSAyMThIMjI4TDMzMiAzMzNIOTFMMTA4IDQ1MEg0MzNMNTQ0IDU3NUw2MjUgNTEzTDU2NyA0NTBINjMxTDYxNCAzMzNINDY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik04OSAzMTRMMTA1IDQzNEw2NTQgNjE2TDYzNiA0OTBMMjQ0IDM3NUw2MDUgMjY2TDU4OCAxNDNMODkgMzE0Wk00NSAwTDYwIDExMkg1ODNMNTY4IDBINDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTY1IDE0M0w4MiAyNjZMNDczIDM3NUwxMTMgNDkwTDEzMSA2MTZMNjI4IDQzNEw2MTIgMzE0TDY1IDE0M1pNNDUgMEw2MCAxMTJINTgzTDU2OCAwSDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjRERjsiIGhvcml6LWFkdi14PSI3OTUiIGQ9Ik03NDMgMzM0UTc0MyAyNjIgNzE2IDIwMFQ2NDIgOTBUNTMzIDE2VDM5OCAtMTFRMzI2IC0xMSAyNjMgMTZUMTUzIDkwVDc5IDE5OVQ1MiAzMzRRNTIgNDA2IDc5IDQ2OFQxNTMgNTc4VDI2MyA2NTJUMzk4IDY3OVE0NzAgNjc5IDUzMiA2NTJUNjQyIDU3OFQ3MTYgNDY5VDc0MyAzMzRaTTY5OCAzMzVRNjk4IDM5NyA2NzUgNDUxVDYxMSA1NDdUNTE2IDYxMVQzOTggNjM1UTMzNiA2MzUgMjgyIDYxMlQxODcgNTQ3VDEyMyA0NTJUOTkgMzM1UTk5IDI3MyAxMjIgMjE5VDE4NyAxMjVUMjgyIDYxVDM5OCAzN1E0NjAgMzcgNTE0IDYwVDYxMCAxMjRUNjc0IDIxOVQ2OTggMzM1Wk01OTggNDAzUTU5OCAzNDEgNTYxIDMwM1Q0MzcgMjY0SDM2MlYxMTlIMjU2VjUzMVEyODUgNTM0IDMyNSA1MzZUNDEwIDUzOVE1MDAgNTM5IDU0OSA1MDdUNTk4IDQwM1pNNDk0IDM5OVE0OTQgNDMxIDQ3NyA0NDVUNDE0IDQ2MFE0MDEgNDYwIDM5MCA0NjBUMzYyIDQ1OFYzMzdINDEzUTQ1NSAzMzcgNDc0IDM0OVQ0OTQgMzk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjZDMzsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0xNTUgLTIyNkg1OUwxMTYgLTU1SDI2NUwxNTUgLTIyNloiICAvPgorCisKKzwvZm9udD4KKzwvZGVmcz4KKzx0ZXh0IHg9IjQwIiB5PSI0MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBCZEl0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQcOBw4DDgsOEw4XDg8OGIEPDhyBEw5AgRcOJw4jDisOLIEkgw40gw4wgw44gw48gTsORPC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjgwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEJkSXQiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID5Pw5PDksOUw5bDlcOYxZIgU8WgIFXDmsOZw5vDnCBZw53FuCBaxb0gw54gYcOhw6DDosOkw6XDo8OmIGPDpyBkw7AgZcOpw6jDqsOrIGkgxLEgw60gw6wgw64gw68gbsOxIG/Ds8Oyw7TDtsO1w7jFkyBzxaHDnyB1w7rDucO7w7wgecO9w78gesW+PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjEyMCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBCZEl0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+w74gMTIzNDU2Nzg5MCDCvSDCvCDCviAlIOKAsCAkwqLCo8KlxpLigqzCpCDigKAg4oChIMKnIMK2ICMgXn7CtSArw5fCsSAmbHQ7ID0gJmd0OyDDt8KsICHCoT/CvyAmcXVvdDsgJmFtcDsgJmFwb3M7ICogwrAgLiAsIDogOyAoKSBbIFwgXSB7fSAvIHw8L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTYwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEJkSXQiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7CpiBfIOKAmiDigJ4g4oCmIOKAueKAuiDCq8K7IOKAmCDigJkg4oCcIOKAnSDigKIgwq0gLSDigJMg4oCUIEAgwqkgwq4g4oSiIMKqwrogwrnCssKzIMK0IGAgy4Ygy5wgwqggwq8gwrcgwrg8L3RleHQ+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQudHRmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmRJdC50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliM2M4MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQud29mZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJkSXQud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg1MGE2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmRJdC53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrLmVvdCBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrLmVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ1ZmIzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmsuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrLnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzkyMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmsuc3ZnCkBAIC0wLDAgKzEsNDI1IEBACivvu788P3htbCAgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIiA+Cis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgPgorPG1ldGFkYXRhPgorPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorPGlkPjwhW0NEQVRBW0NsZWFydmlld0FUVCBCa11dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0NvcHlyaWdodCAoYykgVGVybWluYWwgRGVzaWduLCBJbmMsIDIwMDUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXV0+PC9jb3B5cmlnaHQ+Cis8dHJhZGVtYXJrPjwhW0NEQVRBW0NsZWFydmlldyBpcyBhIHRyYWRlbWFyayBvZiBUZXJtaW5hbCBEZXNpZ24sIEluYy5dXT48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjUwOCIgaWQ9IkNsZWFydmlld0FUVC1CayI+Cis8Zm9udC1mYWNlIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgQmsiIHBhbm9zZS0xPSIyIDExIDUgNiAzIDUgMCAyIDAgNCIgYXNjZW50PSI3NTAiIGRlc2NlbnQ9Ii0yNTAiIHVuaXRzLXBlci1lbT0iMTAwMCIgYWxwaGFiZXRpYz0iMCI+Cis8L2ZvbnQtZmFjZT4KKzxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSI0ODQiIGQ9Ik00OTIgNjY3VjBILThWNjY3SDQ5MlpNMzEgNjA2VjY1TDIxNyAzMzZMMzEgNjA2Wk00NTMgNjdWNjA1TDI2OCAzMzZMNDUzIDY3Wk02MSAzNUg0MjRMMjQyIDI5OUw2MSAzNVpNMjQyIDM3M0w0MTkgNjMwSDY1TDI0MiAzNzNaIiAgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGhvcml6LWFkdi14PSIzMzAiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjI4MSIgZD0iTTE5MiA2NjdRMTg3IDU0NSAxODMgNDI0VDE3NyAxODFIMTA2UTEwMCA0MjQgOTEgNjY3SDE5MlpNMjA0IDQ2UTIwNCAyMCAxODcgNVQxNDEgLTExUTExMiAtMTEgOTUgNFQ3NyA0NlE3NyA3MSA5NCA4NlQxNDEgMTAxUTE2OSAxMDEgMTg2IDg2VDIwNCA0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiZxdW90OyIgaG9yaXotYWR2LXg9IjQxNyIgZD0iTTMyNSA0OTVIMjY2TDI0OCA3MDBIMzQ2TDMyNSA0OTVaTTEzNyA0OTVINzhMNjAgNzAwSDE1OEwxMzcgNDk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgaG9yaXotYWR2LXg9IjYyMyIgZD0iTTU3NyA0NjZINDY0TDQ0MyAzMjJINTYxTDU1MiAyNTdINDMzTDQxNCAxMTNIMzQzTDM2MyAyNTdIMjI1TDIwNCAxMTNIMTM2TDE1NiAyNTdIMzdMNDUgMzIySDE2NUwxODUgNDY2SDY1TDczIDUzMEgxOTRMMjE0IDY2N0gyODRMMjY0IDUzMEg0MDVMNDI1IDY2N0g0OTVMNDczIDUzMEg1ODdMNTc3IDQ2NlpNMjU0IDQ2NkwyMzQgMzIySDM3NEwzOTUgNDY2SDI1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiQiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01MDQgMTk3UTUwNCAxNjkgNDk0IDE0MVQ0NjIgODlUNDA3IDUwVDMyOSAzMVYtNDdIMjQ1VjMxUTIwMiAzMyAxNTYgNDlUNzAgOTJMMTA4IDE1OFEyMDAgOTYgMjg2IDk2UTM1MSA5NiAzODQgMTIxVDQxOCAxOTNRNDE4IDIzMiAzOTUgMjU1VDMyOSAyOThMMjEzIDM0N1ExNTMgMzczIDEyMCA0MDdUODYgNTAwUTg2IDUyNCA5NCA1NDlUMTIwIDU5NVQxNzAgNjMxVDI0NiA2NDhWNzIzSDMzMFY2NDhRMzY1IDY0NiA0MDMgNjM0VDQ3OCA2MDFMNDQ2IDUzM1E0MDkgNTU2IDM3MSA1NjlUMjg5IDU4MlExNzMgNTgyIDE3MyA1MDNRMTczIDQ4NyAxNzggNDc1VDE5NCA0NTNUMjI1IDQzM1QyNzIgNDEwTDM2OSAzNjlRNDQxIDMzOCA0NzIgMjk5VDUwNCAxOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIlIiBob3Jpei1hZHYteD0iNzM5IiBkPSJNMzA4IDUzMFEzMDggNDkyIDMwMiA0NjFUMjgwIDQwOFQyMzkgMzczVDE3NyAzNjFRMTQxIDM2MSAxMTYgMzczVDc2IDQwN1Q1NCA0NjFUNDcgNTMwUTQ3IDU2OCA1MyA1OTlUNzUgNjUzVDExNiA2ODhUMTc3IDcwMFEyMTQgNzAwIDIzOSA2ODhUMjc5IDY1NFQzMDEgNjAwVDMwOCA1MzBaTTI0NyA1MzFRMjQ3IDU1NyAyNDUgNTc5VDIzNSA2MTdUMjEzIDY0MlQxNzcgNjUxUTE1NCA2NTEgMTQxIDY0MlQxMjAgNjE3VDExMSA1NzlUMTA4IDUzMFExMDggNDY2IDEyMyA0MzhUMTc3IDQwOVEyMTUgNDA5IDIzMSA0MzhUMjQ3IDUzMVpNMTc5IDBIMTIzTDU1MiA3MDBINjA3TDE3OSAwWk02OTIgMTYzUTY5MiAxMjUgNjg1IDk0VDY2MyA0MVQ2MjIgNlQ1NjEgLTZRNTI1IC02IDUwMCA2VDQ2MCA0MFQ0MzggOTRUNDMxIDE2M1E0MzEgMjAxIDQzNyAyMzJUNDU5IDI4NlQ1MDAgMzIxVDU2MSAzMzNRNTk3IDMzMyA2MjIgMzIxVDY2MiAyODdUNjg1IDIzM1Q2OTIgMTYzWk02MzAgMTY0UTYzMCAxOTAgNjI4IDIxMlQ2MTggMjUwVDU5NyAyNzVUNTYxIDI4NFE1MzggMjg0IDUyNSAyNzVUNTA0IDI1MFQ0OTUgMjEyVDQ5MiAxNjNRNDkyIDk5IDUwNyA3MVQ1NjEgNDJRNTk5IDQyIDYxNCA3MVQ2MzAgMTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFtcDsiIGhvcml6LWFkdi14PSI2MjMiIGQ9Ik0yOTAgLTExUTIzMCAtMTEgMTg3IDRUMTE2IDQ3VDc1IDEwOVQ2MiAxODVRNjIgMjIxIDczIDI1MFQxMDQgMzAyVDE0OSAzNDVUMjAzIDM3OVExODggMzk1IDE3NCA0MTNUMTQ4IDQ1MVQxMjkgNDkyVDEyMiA1MzVRMTIyIDU2MiAxMzIgNTg4VDE2MyA2MzRUMjE2IDY2NlQyOTIgNjc5UTMzNyA2NzkgMzY3IDY2NlQ0MTUgNjMyVDQ0MCA1ODhUNDQ3IDU0MlE0NDcgNTEwIDQzNiA0ODVUNDA0IDQ0MFQzNTggNDAyVDMwMyAzNjdMNDYwIDE1MVE0NjUgMTY0IDQ2OCAxODVUNDcyIDIyN1E0NzIgMjM5IDQ3MSAyNTNUNDY4IDI4MVQ0NjQgMzA5VDQ1OSAzMzFINTM4UTU0MyAzMTEgNTQ2IDI4MVQ1NDkgMjI1UTU0OSAxOTIgNTQyIDE1OFQ1MTUgOTdMNTg2IDBINDkxTDQ1NiA0N1E0MjcgMjMgMzg4IDZUMjkwIC0xMVpNMjkwIDU0UTMyNyA1NCAzNTkgNjZUNDExIDk5TDIzOSAzMzBRMjIxIDMxNyAyMDQgMzAzVDE3NSAyNzFUMTU0IDIzNVQxNDYgMTkyUTE0NiAxMjUgMTg2IDkwVDI5MCA1NFpNMjcxIDQwOVEzMTkgNDQxIDM0NSA0NzFUMzcyIDUzOVEzNzIgNTUxIDM2OSA1NjVUMzU3IDU5MlQzMzMgNjEzVDI5MyA2MjFRMjQ4IDYyMSAyMjUgNTk3VDIwMSA1MzhRMjAxIDUyMSAyMDggNTA0VDIyNiA0NjlUMjQ5IDQzN1QyNzEgNDA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFwb3M7IiBob3Jpei1hZHYteD0iMjE4IiBkPSJNMTM3IDQ5NUg3OEw2MCA3MDBIMTU4TDEzNyA0OTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIoIiBob3Jpei1hZHYteD0iMjk5IiBkPSJNMTgwIC0xMzhRMTQ4IC04MSAxMjQgLTI3VDgzIDgzVDU4IDE5NlQ0OSAzMTdRNDkgMzgwIDU3IDQzN1Q4MiA1NDhUMTIzIDY1N1QxODAgNzcyTDI0MCA3NThRMTkwIDY1NCAxNjMgNTQ2VDEzNSAzMTdRMTM1IDE5NyAxNjIgOTFUMjQwIC0xMjNMMTgwIC0xMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iMjk5IiBkPSJNNTkgLTEyM1ExMTAgLTE2IDEzNyA5MFQxNjQgMzE3UTE2NCA0MzggMTM3IDU0NlQ1OSA3NThMMTE5IDc3MlExNTEgNzEyIDE3NSA2NThUMjE2IDU0OVQyNDEgNDM3VDI1MCAzMTdRMjUwIDI1NCAyNDIgMTk2VDIxNyA4M1QxNzYgLTI2VDExOSAtMTM4TDU5IC0xMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBob3Jpei1hZHYteD0iMzM2IiBkPSJNMjAzIDU0NlY1NDRMMjY4IDQ3OUwyMDggNDM1TDE2MyA1MTdIMTYyTDExNyA0MzZMNTcgNDc5TDEyMiA1NDRWNTQ2TDI4IDU2MEw1MiA2MjlMMTM2IDU5MEgxMzdMMTIyIDY4MUgyMDBMMTg3IDU5MVY1OTBMMjcxIDYzMEwyOTYgNTYxTDIwMyA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIrIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMzI4IDIyNFYxNkgyNTFWMjI0SDUxVjMwMEgyNTFWNDk5SDMyOFYzMDBINTIzVjIyNEgzMjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyYzsiIGhvcml6LWFkdi14PSIyMTAiIGQ9Ik04NyAtMTE5SDI3TDY2IDk3SDE3MUw4NyAtMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgaG9yaXotYWR2LXg9IjM3NiIgZD0iTTUyIDIxOVYzMDBIMzI0VjIxOUg1MloiICAvPgorPGdseXBoIHVuaWNvZGU9Ii4iIGhvcml6LWFkdi14PSIyMTAiIGQ9Ik0xNjggNDZRMTY4IDIwIDE1MSA1VDEwNSAtMTFRNzYgLTExIDU5IDRUNDIgNDZRNDIgNzEgNTkgODZUMTA1IDEwMVExMzMgMTAxIDE1MCA4NlQxNjggNDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIvIiBob3Jpei1hZHYteD0iNTEyIiBkPSJNMTAxIC0xMTVIMjBMNDE2IDcwMEg0OThMMTAxIC0xMTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIwIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTIyIDMzNFE1MjIgMjUyIDUxMSAxODhUNDcyIDc5VDQwMCAxMlQyODggLTEyUTIyMCAtMTIgMTc1IDExVDEwMyA3OFQ2NSAxODZUNTMgMzM0UTUzIDQxNiA2NCA0ODBUMTAzIDU4OFQxNzUgNjU1VDI4OCA2NzhRMzU1IDY3OCA0MDAgNjU1VDQ3MiA1ODhUNTEwIDQ4MFQ1MjIgMzM0Wk00MzIgMzM0UTQzMiAzOTUgNDI3IDQ0NVQ0MDcgNTMwVDM2NCA1ODRUMjg4IDYwNFEyNDAgNjA0IDIxMSA1ODVUMTY3IDUzMVQxNDggNDQ2VDE0MyAzMzRRMTQzIDI3NCAxNDcgMjI0VDE2NyAxMzhUMjExIDgyVDI4OCA2MlEzMzUgNjIgMzYzIDgxVDQwNyAxMzdUNDI3IDIyM1Q0MzIgMzM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMSIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTI1OSA3NlY1NjlIMjU2TDEwNSA0NzlMNjkgNTQ2TDI3MyA2NjlIMzQ3Vjc2SDUwNlYwSDk0Vjc2SDI1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik04MSAwTDY4IDgxUTE0MCAxNDQgMjAxIDE5NlQzMDcgMjk1VDM3NyAzODdUNDAzIDQ4MFE0MDMgNTAxIDM5OCA1MjJUMzgwIDU2MlQzNDUgNTkxVDI5MCA2MDNRMjQ1IDYwMyAyMDQgNTgwVDEyMiA1MTJMNzQgNTc2UTEyOCA2MzEgMTc5IDY1NFQyOTUgNjc4UTM4NCA2NzggNDM4IDYzMlQ0OTIgNDg5UTQ5MiA0NDIgNDc2IDM5N1Q0MjIgMzAzVDMyMiAxOTlUMTcwIDc2SDUwN1YwSDgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTUwOCAxOTFRNTA4IDE1MCA0OTYgMTE0VDQ1NiA0OVQzODQgNVQyNzYgLTEyUTIxMyAtMTIgMTY0IDVUNjYgNTdMMTA3IDEyM1ExNDcgOTIgMTg5IDc3VDI3MyA2MVEzMDIgNjEgMzI4IDY4VDM3NSA5MFQ0MDYgMTMxVDQxOCAxOTJRNDE4IDI1NiAzODcgMjgzVDI4MCAzMTFIMjA1VjM4NEgyMzZRMjg0IDM4NCAzMTUgMzkzVDM2NiA0MTdUMzkzIDQ1M1Q0MDEgNDk2UTQwMSA1NDQgMzcxIDU3M1QyNzUgNjAzUTE5MyA2MDMgMTE4IDU0MEw3OCA2MDhRMTMyIDY0NSAxNzkgNjYxVDI4NSA2NzhRMzI4IDY3OCAzNjUgNjY4VDQzMSA2MzVUNDc1IDU3OVQ0OTEgNDk5UTQ5MSA0NDYgNDY3IDQxMFQzOTQgMzU1VjM1M1E1MDggMzMwIDUwOCAxOTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI0IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNDM3IDE0M1YwSDM0N1YxNDNINzBMNDYgMjE4TDMzOSA2NjVINDM3VjIxOUg1MjhWMTQzSDQzN1pNMzQ4IDU2NEwxMzcgMjE5SDM1MlY1NjRIMzQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNSIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTUwNyAyMjlRNTA3IDE2NSA0OTAgMTIwVDQ0MiA0NVQzNjUgMlQyNjQgLTEyUTIwNyAtMTIgMTYzIDJUNzAgNTFMMTA4IDEyMFExNDggOTEgMTg2IDc2VDI2NSA2MVEzNDMgNjEgMzgwIDEwMVQ0MTcgMjI5UTQxNyAzMTEgMzgyIDM0N1QyNzcgMzg0UTIzNiAzODQgMjA0IDM3MFQxMzcgMzIzTDY4IDM3MEwxMjAgNjY3SDQ3NFY1OTFIMTkwTDE1NSA0MDVMMTU3IDQwNFExODkgNDMxIDIyMyA0NDNUMjk5IDQ1NlEzOTcgNDU2IDQ1MiA0MDJUNTA3IDIyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjYiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01MjAgMjE4UTUyMCAxNjQgNTA0IDEyMlQ0NTcgNTBUMzg1IDRUMjkyIC0xMlEyMjcgLTEyIDE4MiA4VDEwOCA2N1Q2NyAxNjJUNTQgMjkzUTU0IDM3NSA2NSA0NDVUMTA2IDU2OFQxODUgNjQ5VDMxMyA2NzhRNDAxIDY3OCA0NzYgNjMzTDQzOCA1NjVRNDA1IDU4NyAzNzcgNTk1VDMxNCA2MDNRMjczIDYwMyAyNDEgNTkwVDE4NyA1NDdUMTUzIDQ2OFQxNDAgMzQ2SDE0MlExOTIgNDMyIDMwNiA0MzJRNDA2IDQzMiA0NjMgMzc1VDUyMCAyMThaTTQzMCAyMTVRNDMwIDM1OCAyOTIgMzU4UTIyNyAzNTggMTg3IDMxOVQxNDcgMjA5UTE0NyAxMzcgMTg1IDEwMFQyOTIgNjJRMzU4IDYyIDM5NCAxMDBUNDMwIDIxNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjciIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01MDkgNTkyUTQ0MyA1MzYgNDA0IDQ4NFQzNDMgMzcxVDMxNCAyMzdUMzA3IDY1VjBIMjE0VjMwUTIxNCA5OCAyMTggMTc0VDI0MSAzMjZUMjk3IDQ2OVQ0MDEgNTg5VjU5MUg2NVY2NjdINDk1TDUwOSA1OTJINTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOCIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTUxOSAxOTFRNTE5IDE0NCA1MDYgMTA3VDQ2NiA0M1QzOTQgM1QyODggLTEyUTIyNSAtMTIgMTgxIDJUMTA5IDQzVDY4IDEwNlQ1NSAxOTFRNTUgMjUzIDgwIDI5M1QxNjUgMzU1VjM1OVExMTcgMzc4IDk1IDQxNVQ3MiA1MDNRNzIgNTQwIDgyIDU3MlQxMTggNjI3VDE4NCA2NjRUMjg3IDY3OFEzOTMgNjc4IDQ0NyA2MzVUNTAxIDUwM1E1MDEgNDUzIDQ3OSA0MTZUNDA4IDM1OVYzNTVRNDY1IDMzNyA0OTIgMjk1VDUxOSAxOTFaTTQxMyA0OTlRNDEzIDU1NSAzODMgNTgwVDI4NyA2MDZRMjIwIDYwNiAxOTAgNTgxVDE2MCA0OTlRMTYwIDM4OCAyODcgMzg4UTQxMyAzODggNDEzIDQ5OVpNNDI5IDE4OVE0MjkgMjIwIDQyMyAyNDRUNDAwIDI4NlQzNTYgMzEyVDI4NyAzMjFRMjUzIDMyMSAyMjcgMzE1VDE4MiAyOTNUMTU1IDI1MVQxNDUgMTg2UTE0NSAxMTggMTc5IDg5VDI4NyA1OVEzNTggNTkgMzkzIDg4VDQyOSAxODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI5IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTIwIDM0OFE1MjAgMTYxIDQ1OSA3NVQyNjUgLTExUTIxNSAtMTEgMTcxIDNUODcgNDhMMTMxIDEwOVExNjYgODMgMTk1IDcyVDI2NSA2MVEzMDcgNjEgMzM4IDczVDM5MSAxMTdUNDIzIDIwMFQ0MzUgMzMzSDQzM1E0MTAgMjg2IDM2OCAyNjFUMjcyIDIzNVEyMjMgMjM1IDE4MyAyNTBUMTE0IDI5M1Q3MCAzNjJUNTQgNDU0UTU0IDUwNyA3MSA1NDlUMTE4IDYxOVQxOTEgNjYzVDI4MyA2NzhRMzQyIDY3OCAzODYgNjYwVDQ2MCA2MDFUNTA1IDQ5OVQ1MjAgMzQ4Wk00MjEgNDU0UTQyMSA1MjYgMzg2IDU2NVQyODQgNjA0UTIxNSA2MDQgMTgwIDU2M1QxNDQgNDUzUTE0NCAzODcgMTgwIDM0OVQyODQgMzEwUTM1NCAzMTAgMzg3IDM1MFQ0MjEgNDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOiIgaG9yaXotYWR2LXg9IjIxMCIgZD0iTTE2OCA0MDRRMTY4IDM3OCAxNTEgMzYzVDEwNiAzNDdRNzggMzQ3IDYxIDM2MlQ0NCA0MDRRNDQgNDI5IDYwIDQ0NFQxMDYgNDU5UTEzNCA0NTkgMTUxIDQ0NFQxNjggNDA0Wk0xNjggNDZRMTY4IDIwIDE1MSA1VDEwNiAtMTFRNzggLTExIDYxIDRUNDQgNDZRNDQgNzEgNjAgODZUMTA2IDEwMVExMzQgMTAxIDE1MSA4NlQxNjggNDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBob3Jpei1hZHYteD0iMjEwIiBkPSJNODcgLTExOUgyN0w2NSA5N0gxNjdMODcgLTExOVpNMTc3IDQwM1ExNzcgMzc3IDE2MCAzNjJUMTE1IDM0NlE4NyAzNDYgNzAgMzYxVDUzIDQwM1E1MyA0MjkgNzAgNDQzVDExNSA0NThRMTQ0IDQ1OCAxNjAgNDQ0VDE3NyA0MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImbHQ7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTEgMjIzVjMwMEw1MjMgNTE1VjQzNkwxMzUgMjYyTDUyMyA5MlYxNUw1MSAyMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI9IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTIgMzE5VjM5NEg1MjNWMzE5SDUyWk01MiAxMzJWMjA3SDUyM1YxMzJINTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImZ3Q7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTEgMTVWOTJMNDQwIDI2Mkw1MSA0MzZWNTE1TDUyMyAzMDBWMjIzTDUxIDE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPyIgaG9yaXotYWR2LXg9IjUxNSIgZD0iTTQ2MSA1MDZRNDYxIDQ0NCA0MzQgNDAyVDM0MiAzMjlMMjkwIDMwNVEyNzQgMjk3IDI2NSAyOTJUMjUyIDI4MFQyNDcgMjYzVDI0NiAyMzRWMTcySDE2MFYyNTFRMTYwIDI3NCAxNjIgMjg5VDE3MiAzMTVUMTkyIDMzNVQyMjYgMzU0TDI3NiAzNzdRMzA0IDM5MCAzMjMgNDAyVDM1MyA0MjlUMzY5IDQ1OVQzNzQgNDk5UTM3NCA1NTAgMzQxIDU3N1QyNDcgNjA0UTIwNSA2MDQgMTY4IDU5MVQ5MSA1NDVMNDggNjEwUTEwMSA2NDYgMTQ5IDY2MlQyNTcgNjc4UTM1NyA2NzggNDA5IDYzMlQ0NjEgNTA2Wk0yNjUgNDZRMjY1IDIwIDI0OCA1VDIwMiAtMTFRMTczIC0xMSAxNTYgNFQxMzggNDZRMTM4IDcxIDE1NSA4NlQyMDIgMTAxUTIzMCAxMDEgMjQ3IDg2VDI2NSA0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IkAiIGhvcml6LWFkdi14PSI4MDMiIGQ9Ik03NDEgMjk0UTc0MSAyMzQgNzI1IDE4OVQ2ODQgMTE0VDYyNyA2OVQ1NjUgNTRRNTM2IDU0IDUxNiA3MFQ0OTEgMTE1SDQ4NlE0NjMgODEgNDI5IDY2VDM1OSA1MVEyOTggNTEgMjY1IDkwVDIzMiAyMDRRMjMyIDI0MCAyNDIgMjc4VDI3MyAzNDhUMzI4IDQwMFQ0MDkgNDIxUTQ0MSA0MjEgNDYyIDQxMVQ1MDAgMzc3SDUwNEw1MDkgNDEzSDU4Mkw1NDYgMTQyUTU0NCAxMjggNTUxIDExNVQ1ODEgMTAyUTU5NCAxMDIgNjEzIDExMVQ2NTEgMTQ0VDY4MiAyMDRUNjk1IDI5N1E2OTUgMzU1IDY3NiA0MDBUNjIxIDQ3N1Q1MzggNTI1VDQzMSA1NDJRMzUzIDU0MiAyOTQgNTE3VDE5NCA0NDhUMTMzIDM0OFQxMTIgMjI5UTExMiAxNTkgMTMyIDEwNFQxODggMTJUMjc3IC00NVQzOTYgLTY1UTQ1OSAtNjUgNTA4IC01MFQ1OTkgLTZMNjI0IC00M1E1NzMgLTc4IDUxNiAtOTJUMzg5IC0xMDdRMzA4IC0xMDcgMjQ3IC04MVQxNDUgLTlUODMgOTlUNjIgMjMyUTYyIDMwNiA4NyAzNzBUMTYwIDQ4MlQyNzYgNTU3VDQyOSA1ODVRNDkxIDU4NSA1NDcgNTY4VDY0NyA1MTRUNzE1IDQyM1Q3NDEgMjk0Wk00OTQgMjgyUTQ5NiAyOTggNDk0IDMxM1Q0ODQgMzQwVDQ2MCAzNTlUNDE4IDM2NlEzNjIgMzY2IDMzMiAzMjRUMzAyIDE5OVEzMDIgMTUwIDMyMyAxMjhUMzgyIDEwNVE0MjggMTA1IDQ1MiAxMzNUNDg0IDIwN0w0OTQgMjgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQSIgaG9yaXotYWR2LXg9IjY0MiIgZD0iTTUyMiAwTDQ2NSAxNjFIMTc0TDExNiAwSDIyTDI2OCA2NzFIMzcwTDYyMCAwSDUyMlpNMzIwIDU4MkgzMTZMMTk2IDIzNkg0NDBMMzIwIDU4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IkIiIGhvcml6LWFkdi14PSI2MzYiIGQ9Ik01NzYgMTgwUTU3NiAxNDEgNTY1IDEwOFQ1MjcgNTFUNDU5IDE0VDM1NyAwSDg2VjY2M1ExMjggNjY4IDE4NSA2NzFUMjk3IDY3NVEzNDAgNjc1IDM4NSA2NzBUNDY2IDY0N1Q1MjYgNTk0VDU0OSA0OThRNTQ5IDQ0MSA1MjIgNDA1VDQ0NCAzNTJWMzQ4UTUwNiAzMzcgNTQxIDI5NFQ1NzYgMTgwWk00NjAgNDkzUTQ2MCA1MjcgNDQ5IDU0OFQ0MTYgNTgyVDM2NCA1OThUMjk4IDYwM1EyNzIgNjAzIDIzOSA2MDJUMTc3IDU5N1YzODBRMjA2IDM3OSAyMzYgMzc5VDI5OSAzNzlRMzM1IDM3OSAzNjQgMzgyVDQxNSAzOThUNDQ4IDQzMlQ0NjAgNDkzWk00ODYgMTg3UTQ4NiAyMzMgNDY5IDI1OFQ0MjYgMjk1VDM2NiAzMDlUMzAxIDMxMlEyNjAgMzEyIDIzMyAzMTJUMTc2IDMxMVY3MFEyMTAgNjggMjM3IDY4VDMwMSA2OFEzMzggNjggMzcyIDcxVDQzMSA4NVQ0NzEgMTIxVDQ4NiAxODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJDIiBob3Jpei1hZHYteD0iNjMyIiBkPSJNNjAwIDgzUTU0NSAzMyA0ODggMTFUMzY1IC0xMVEyOTAgLTExIDIzNCAxM1QxNDAgODJUODQgMTkxVDY1IDMzNVE2NSA0MDQgODIgNDY2VDEzNyA1NzVUMjMxIDY1MFQzNjggNjc4UTQzNCA2NzggNDg4IDY1NlQ1OTYgNTg2TDU0MSA1MjZRNDk4IDU2NiA0NTkgNTgzVDM3MSA2MDFRMjc1IDYwMSAyMTggNTM2VDE2MCAzMzVRMTYwIDI4MiAxNzAgMjM0VDIwNCAxNDhUMjY4IDg4VDM2OCA2NVE0MTYgNjUgNDYxIDg0VDU1MSAxNDVMNjAwIDgzSDYwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02MDQgMzM4UTYwNCAyNjcgNTg3IDIwNlQ1MzEgOTlUNDMzIDI3VDI4OSAwSDg2VjY2M1ExMjcgNjY4IDE3OSA2NzFUMjg4IDY3NVEzNjQgNjc1IDQyMyA2NTJUNTIyIDU4NlQ1ODMgNDgwVDYwNCAzMzhaTTUwOSAzMzlRNTA5IDM4NCA1MDAgNDMwVDQ2NyA1MTVUNDAwIDU3OFQyOTAgNjAyUTI2MiA2MDIgMjMzIDYwMFQxNzcgNTk2Vjc1UTIwMyA3NCAyMjkgNzRUMjczIDc0UTM5MSA3NCA0NTAgMTM2VDUwOSAzMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJFIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNODYgMFY2NjdINDg0VjU5MEgxNzdWMzkxSDQ1NVYzMTNIMTc3Vjc2SDQ5NlYwSDg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRiIgaG9yaXotYWR2LXg9IjUxMCIgZD0iTTE3NyA1OTBWMzg3SDQ0OFYzMDlIMTc3VjBIODZWNjY3SDQ3N1Y1OTBIMTc3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRyIgaG9yaXotYWR2LXg9IjY5OCIgZD0iTTM3MCA2MFE0NTggNjAgNTAzIDEwN1Q1NDkgMjM1VjI3N0gzNzNWMzUySDYzM1YyNzhRNjMzIDEzNSA1NjcgNjNUMzY2IC0xMFEyOTEgLTEwIDIzNSAxNlQxNDEgODhUODQgMTk2VDY1IDMzM1E2NSA0MDIgODMgNDY1VDEzOSA1NzVUMjM0IDY1MFQzNzAgNjc4UTQ0NSA2NzggNDk5IDY1MlQ1OTMgNTkxTDUzOSA1MzBRNDk1IDU2OCA0NTUgNTg0VDM3MyA2MDFRMzEzIDYwMSAyNzIgNTgwVDIwNiA1MjJUMTcxIDQzNlQxNjAgMzMzUTE2MCAyODAgMTY5IDIzMVQyMDMgMTQ0VDI2NyA4M1QzNzAgNjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iNjYyIiBkPSJNNDg1IDBWMzE0SDE3N1YwSDg2VjY2N0gxNzdWMzk5SDQ4NVY2NjdINTc2VjBINDg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSSIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBWNjY3SDE3N1YwSDg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSiIgaG9yaXotYWR2LXg9IjQ0OCIgZD0iTTM2MiAxNzdRMzYyIDg2IDMyMiAzN1QxOTEgLTEyUTE0OCAtMTIgMTEyIC0xVDQwIDM4TDc5IDEwOFExMDggODQgMTMxIDc1VDE4MiA2NlEyMjkgNjYgMjUwIDkxVDI3MSAxNzBWNjY3SDM2MlYxNzdIMzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSyIgaG9yaXotYWR2LXg9IjU3OSIgZD0iTTQ0OCAwTDI0NiAzMjFMMTc3IDI0MlYwSDg2VjY2N0gxNzdWMzUySDE3OUw0MjggNjY3SDU0MkwzMTQgMzg0TDU2MSAwSDQ0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkwiIGhvcml6LWFkdi14PSI0OTgiIGQ9Ik04NiAwVjY2N0gxNzdWNzhINDU4VjBIODZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJNIiBob3Jpei1hZHYteD0iNzY3IiBkPSJNNTkzIDBWNTE4SDU4OUwzODMgMTk4TDE3OCA1MTZIMTc0VjBIODZWNjY3SDE3MEwzODMgMzM3TDU5NiA2NjdINjgxVjBINTkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTiIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMCAwTDE3OCA1MjBIMTc0VjBIODZWNjY3SDE3Nkw1MjMgMTU0SDUyN1Y2NjdINjE1VjBINTMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTY4MSAzMzRRNjgxIDI1OSA2NjMgMTk2VDYwNyA4N1Q1MTEgMTVUMzczIC0xMVEyOTMgLTExIDIzNSAxNVQxMzkgODdUODMgMTk2VDY1IDMzNFE2NSA0MDYgODMgNDY4VDEzOCA1NzdUMjM0IDY1MVQzNzMgNjc4UTQ1MyA2NzggNTExIDY1MlQ2MDcgNTgwVDY2MyA0NzBUNjgxIDMzNFpNNTg2IDMzM1E1ODYgMzg2IDU3NyA0MzVUNTQzIDUyMVQ0NzggNTgxVDM3MyA2MDRRMzEwIDYwNCAyNjkgNTgyVDIwNCA1MjJUMTcwIDQzNVQxNjAgMzMzUTE2MCAyODEgMTY5IDIzMlQyMDMgMTQ2VDI2OSA4NlQzNzMgNjNRNDM2IDYzIDQ3NyA4NVQ1NDMgMTQ1VDU3NiAyMzJUNTg2IDMzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI2MDIiIGQ9Ik01NTAgNDY2UTU1MCAzNjAgNDk3IDMwN1QzMjggMjU0SDE3N1YwSDg2VjY2M1ExMzQgNjY4IDE4NyA2NzFUMjk1IDY3NVEzNTAgNjc1IDM5NiA2NjVUNDc3IDYzMVQ1MzAgNTY3VDU1MCA0NjZaTTQ1OCA0NjRRNDU4IDUwMyA0NDggNTI5VDQxOCA1NzJUMzY4IDU5NFQyOTUgNjAxUTI2NSA2MDEgMjM3IDYwMFQxNzcgNTk0VjMyN0gzMDFRMzM4IDMyNyAzNjcgMzMyVDQxNyAzNTJUNDQ3IDM5M1Q0NTggNDY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUSIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTY4MSAzMzRRNjgxIDI4OSA2NzQgMjQ1VDY1MiAxNjJUNjEwIDkxVDU0NCAzNVYzNFE1NjEgMjkgNTc0IDIxVDYwMSA0VDYzMSAtMTNUNjcyIC0yNkw2NDQgLTk0UTYxMSAtOTEgNTgzIC03N1Q1MzEgLTQ4VDQ4NCAtMjBUNDM5IC04UTQyNSAtOCA0MDggLTlUMzc3IC0xMVEyOTUgLTExIDIzNiAxNFQxMzkgODVUODMgMTk0VDY1IDMzNFE2NSA0MDkgODMgNDcyVDEzOCA1ODBUMjM0IDY1MlQzNzMgNjc4UTQ1NCA2NzggNTEyIDY1M1Q2MDggNTgxVDY2MyA0NzJUNjgxIDMzNFpNNTg2IDMzNFE1ODYgMzg5IDU3NiA0MzhUNTQyIDUyM1Q0NzcgNTgxVDM3MyA2MDNRMzEwIDYwMyAyNjkgNTgyVDIwNCA1MjRUMTcwIDQzOFQxNjAgMzMzUTE2MCAyNzggMTcwIDIyOVQyMDUgMTQ0VDI3MCA4NlQzNzMgNjRRNDM2IDY0IDQ3NyA4NlQ1NDIgMTQ1VDU3NiAyMzFUNTg2IDMzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI2MDQiIGQ9Ik00NTkgMEwzNzIgMjQwUTM2NCAyNjIgMzUxIDI3MFQzMTUgMjc5SDE3N1YwSDg2VjY2NFExMzkgNjcwIDE4NSA2NzJUMjg2IDY3NVEzMzMgNjc1IDM3OCA2NjdUNDU4IDYzN1Q1MTUgNTc4VDUzNyA0ODJRNTM3IDQxOSA1MTMgMzczVDQyNSAzMDRWMzAzUTQzNiAyOTggNDQ0IDI4NlQ0NTYgMjYxTDU1NSAwSDQ1OVpNNDQ3IDQ3NVE0NDcgNTE0IDQzNSA1MzhUNDAxIDU3N1QzNTAgNTk2VDI4OCA2MDJRMjU4IDYwMiAyMzIgNjAxVDE3NyA1OTVWMzUySDMwOFEzNDAgMzUyIDM2NiAzNThUNDEwIDM3OFQ0MzcgNDE1VDQ0NyA0NzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBob3Jpei1hZHYteD0iNTM5IiBkPSJNNDg4IDE4NVE0ODggODcgNDI4IDM4VDI2OSAtMTFRMjAyIC0xMSAxNDcgNlQzNiA2Mkw3OCAxMzBRMTE3IDEwMSAxNjMgODJUMjYzIDYyUTMyMiA2MiAzNTkgOTBUMzk2IDE4MVEzOTYgMjEyIDM4MSAyMzJUMzQxIDI2OFQyODUgMjk2VDIyMCAzMjJRMTg4IDMzNCAxNTkgMzQ5VDEwNiAzODZUNjkgNDM3VDU1IDUwOVE1NSA1NTUgNzMgNTg3VDEyMCA2MzlUMTg3IDY2OFQyNjYgNjc3UTMyMSA2NzcgMzcwIDY2MlQ0NjggNjE4TDQzNCA1NDVRMzk4IDU3MSAzNTcgNTg3VDI2OSA2MDNRMjQ1IDYwMyAyMjMgNTk4VDE4NCA1ODJUMTU3IDU1NFQxNDcgNTExUTE0NyA0ODUgMTU4IDQ2N1QxODkgNDM2VDIzMyA0MTJUMjg4IDM5MVEzMjMgMzc5IDM1OCAzNjRUNDIzIDMyNlQ0NzAgMjY5VDQ4OCAxODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJUIiBob3Jpei1hZHYteD0iNTA1IiBkPSJNMjk4IDU4OFYwSDIwN1Y1ODhIMTlWNjY3SDQ4NlY1ODhIMjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVSIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTU4MyAyNTlRNTgzIDEyMCA1MjUgNTVUMzM0IC0xMVEyMDIgLTExIDE0NCA1NVQ4NiAyNTlWNjY3SDE3N1YyNTlRMTc3IDIxNiAxODQgMTgxVDIwOCAxMjBUMjU2IDgwVDMzNCA2NVEzODEgNjUgNDExIDc5VDQ2MCAxMTlUNDg1IDE4MFQ0OTIgMjU5VjY2N0g1ODNWMjU5SDU4M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI1NzYiIGQ9Ik0zMzggMEgyMzdMMjIgNjY3SDExOUwyODcgMTAxSDI5MUw0NTkgNjY3SDU1NEwzMzggMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlciIGhvcml6LWFkdi14PSI5MTYiIGQ9Ik03MTIgMEg2MDhMNDU4IDUzOEg0NTRMMzA3IDBIMTk2TDMwIDY2N0gxMzBMMjU2IDEwNUgyNjFMNDEzIDY2N0g1MDVMNjU3IDEwNUg2NjFMNzg5IDY2N0g4ODZMNzEyIDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDQxIDBMMjgzIDI2OUgyNzlMMTIyIDBIMTdMMjMwIDM0Nkw0MiA2NjdIMTQ4TDI4NCA0MTVIMjg4TDQzMCA2NjdINTM1TDM0MCAzMzlMNTQ3IDBINDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWSIgaG9yaXotYWR2LXg9IjU3MiIgZD0iTTMzMiAyNjVWMEgyNDFWMjYyTDEzIDY2N0gxMTZMMjg3IDM0NUw0NTkgNjY3SDU1OUwzMzIgMjY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9IjU1OCIgZD0iTTQ2IDBWNzVMMzk4IDU4OEg2MVY2NjdINTAzVjU5M0wxNTEgNzZINTEyVjBINDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJbIiBob3Jpei1hZHYteD0iMzEwIiBkPSJNNTggLTEwNFY3NjJIMjQzVjcwNkgxMzhWLTQ4SDI0M1YtMTA0SDU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9IjUxMiIgZD0iTTQwMyAtMTE1TDIyIDY2N0gxMDVMNDg1IC0xMTVINDAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXSIgaG9yaXotYWR2LXg9IjMxMCIgZD0iTTYyIC0xMDRWLTQ4SDE2NVY3MDZINjJWNzYySDI0NFYtMTA0SDYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXiIgaG9yaXotYWR2LXg9IjM2NiIgZD0iTTMxMiA1MjVMMTgxIDYwMkw0NiA1MjVMMyA1NzFMMTgwIDY3NkwzNTkgNTcxTDMxMiA1MjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJfIiBob3Jpei1hZHYteD0iNDg0IiBkPSJNLTggLTE0NFYtODVINDkyVi0xNDRILThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJgIiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMjM1IDU2NUw2MSA2NzRMMTQ5IDcxNEwyODQgNTk1TDIzNSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJhIiBob3Jpei1hZHYteD0iNTI5IiBkPSJNNDMwIC04UTQwNyAwIDM5MyAxM1QzNzMgNTRIMzY5UTMzMiAyNCAyOTIgN1QyMDMgLTExUTE2OSAtMTEgMTQwIC0xVDkwIDI4VDU3IDc2VDQ1IDE0MFE0NSAyMDMgNzcgMjM5VDE1NiAyOTRUMjU5IDMxN1QzNjIgMzIyVjM3MVEzNjAgNDEzIDMzNyA0MzBUMjY5IDQ0OFEyMTcgNDQ4IDE3MSA0MzFUOTAgMzkxTDU5IDQ1MlExMTEgNDgxIDE2MyA0OTdUMjc3IDUxNFEzNjcgNTE0IDQwOCA0NzVUNDQ5IDM0NFYxMDRRNDUwIDY0IDQ4MiA1MEw0MzAgLThaTTM2NCAyNjlRMzMyIDI2OSAyOTIgMjY3VDIxNiAyNTJUMTU2IDIxNVQxMzEgMTQ1UTEzMSA5OSAxNTcgNzRUMjI1IDQ5UTI2NyA0OSAyOTkgNjVUMzY0IDEwNlYyNjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNTExIDI1MlE1MTEgMjAxIDUwMSAxNTRUNDY3IDcwVDQwNSAxMVQzMTEgLTExUTI1NiAtMTEgMjE3IDEyVDE1OCA4MEgxNTRMMTQxIDBINzZWNzAwSDE2M1Y0NDFIMTY0UTE4NyA0ODMgMjI2IDQ5OFQzMTAgNTE0UTM2OCA1MTQgNDA3IDQ5M1Q0NjkgNDM1VDUwMSAzNTJUNTExIDI1MlpNNDIyIDI1MVE0MjIgMjg3IDQxOCAzMjJUNDAxIDM4NFQzNjEgNDI5VDI5MCA0NDZRMjMzIDQ0NiAxOTggNDE2VDE2MiAzMjZWMjAwUTE2MiAxNzAgMTY5IDE0M1QxOTMgOTdUMjMzIDY2VDI4OSA1NFEzMzEgNTQgMzU3IDcyVDM5OCAxMThUNDE3IDE4MVQ0MjIgMjUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTQyNyAzOTBRNDAwIDQxNyAzNjggNDMxVDI5NCA0NDVRMjUwIDQ0NSAyMjEgNDI5VDE3NSAzODVUMTUwIDMyNFQxNDIgMjUyUTE0MiAyMTQgMTQ5IDE3OVQxNzQgMTE3VDIyMSA3NFQyOTQgNThRMzM1IDU4IDM2NyA3MFQ0MzMgMTEyTDQ2MyA1MVE0MjUgMjIgMzgzIDZUMjg5IC0xMVEyMzAgLTExIDE4NiA4VDExMyA2MVQ2OCAxNDNUNTMgMjQ4UTUzIDMwNiA2OCAzNTVUMTEzIDQzOVQxODcgNDk0VDI5MSA1MTRRMzM5IDUxNCAzODMgNDk3VDQ2NSA0NTFMNDI3IDM5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MTUgMEw0MTAgNzdINDA2UTM4MyAzMiAzNDQgMTFUMjU0IC0xMVExOTcgLTExIDE1OSAxMFQ5NyA2OFQ2MyAxNTFUNTMgMjUyUTUzIDMwMyA2MiAzNTBUOTUgNDM0VDE1NiA0OTJUMjU0IDUxNFEyOTkgNTE0IDMzNCA1MDBUMzk3IDQ0NEg0MDFWNzAwSDQ4OFYwSDQxNVpNNDAyIDMyNlE0MDIgMzg2IDM2NyA0MTZUMjc0IDQ0NlEyMjkgNDQ2IDIwMyA0MjlUMTY0IDM4NVQxNDYgMzIyVDE0MiAyNTFRMTQyIDIxNyAxNDcgMTgyVDE2NiAxMTlUMjA3IDcyVDI3NiA1NFEzMDggNTQgMzMyIDY1VDM3MSA5NlQzOTQgMTQzVDQwMiAyMDBWMzI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZSIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTQ5MyAyNjJRNDkzIDI1NyA0OTMgMjQ0VDQ5MiAyMjNIMTQwUTE0MCAxNDUgMTc4IDEwMVQyOTEgNTZRMzI5IDU2IDM2NCA2N1Q0NDAgMTA4TDQ3MSA0OFE0MjYgMTYgMzgxIDNUMjg4IC0xMVEyMzAgLTExIDE4NiA3VDExMyA2MFQ2OCAxNDJUNTMgMjUxUTUzIDMxNCA2OSAzNjNUMTE2IDQ0NlQxODggNDk3VDI4MyA1MTVRMzMzIDUxNSAzNzIgNDk3VDQzOCA0NDVUNDc5IDM2NVQ0OTMgMjYyWk00MTIgMjgyUTQxMiAzMTUgNDA1IDM0NVQzODMgMzk5VDM0MyA0MzdUMjg0IDQ1MVEyNDMgNDUxIDIxNSA0MzZUMTcxIDM5N1QxNDcgMzQzVDE0MCAyODJINDEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjMxOSIgZD0iTTMwNSA2MzRRMjk0IDYzNiAyODMgNjM3VDI1OCA2MzlRMjM1IDYzOSAyMjIgNjM2VDIwMSA2MjZUMTkyIDYwNVQxODkgNTcxVjUwMkgyOTdWNDMySDE5MlYwSDEwNFY0MzFIMjdWNTAySDEwNFY1NzZRMTA0IDYxMCAxMDkgNjM0VDEzMCA2NzRUMTcyIDY5N1QyNDMgNzA1UTI1NyA3MDUgMjczIDcwNFQzMDUgNzAwVjYzNEgzMDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDg4IC0zM1E0ODggLTk1IDQ3NCAtMTMzVDQzMyAtMTkxVDM3MSAtMjE5VDI5MyAtMjI2UTIzMiAtMjI2IDE4MyAtMjE0VDg2IC0xNzVMMTEzIC0xMDdRMTU2IC0xMzIgMTk4IC0xNDVUMjkxIC0xNThRMzUxIC0xNTggMzc2IC0xMzdUNDAxIC01MlY3OUgzOTdRMzcxIDMzIDMzOCAxNVQyNTcgLTRRMjAxIC00IDE2MiAxNlQ5OSA3MFQ2NCAxNTJUNTMgMjUyUTUzIDMwMyA2MiAzNTBUOTUgNDM0VDE1NiA0OTJUMjU0IDUxNFEzMDQgNTE0IDM0MSA0OThUNDA1IDQzNkg0MDlMNDE0IDUwMkg0ODhWLTMzWk00MDIgMzI1UTQwMiAzODYgMzY3IDQxNlQyNzQgNDQ2UTIzMCA0NDYgMjA0IDQyOVQxNjUgMzg1VDE0NyAzMjRUMTQyIDI1M1ExNDIgMjE2IDE0OCAxODJUMTY5IDEyMVQyMTAgNzlUMjc1IDYzUTMwOCA2MyAzMzEgNzRUMzcxIDEwNVQzOTQgMTUxVDQwMiAyMDhWMzI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaCIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwVjI5NFE0MDEgMzI3IDM5OSAzNTRUMzg1IDQwMFQzNTMgNDI5VDI5MyA0NDBRMjMwIDQ0MCAxOTcgNDA4VDE2MyAzMTVWMEg3NlY3MDBIMTYzVjQ0MEgxNjdRMTg4IDQ3OCAyMjYgNDk2VDMxNiA1MTRRMzY3IDUxNCA0MDAgNTAxVDQ1MyA0NjFUNDgwIDM5OFQ0ODggMzEzVjBINDAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaSIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTc2IDBWNTAySDE2M1YwSDc2Wk0xNzQgNjI2UTE3NCA2MDQgMTU5IDU5MVQxMTkgNTc3UTk1IDU3NyA4MCA1OTBUNjUgNjI2UTY1IDY0OSA4MCA2NjJUMTE5IDY3NlExNDUgNjc2IDE1OSA2NjNUMTc0IDYyNloiICAvPgorPGdseXBoIHVuaWNvZGU9ImoiIGhvcml6LWFkdi14PSIyNDUiIGQ9Ik0xNzkgNjI2UTE3OSA2MDIgMTYzIDU5MFQxMjQgNTc3UTEwMyA1NzcgODcgNTg5VDcwIDYyNlE3MCA2NTIgODYgNjY0VDEyNCA2NzZRMTQ3IDY3NiAxNjMgNjY0VDE3OSA2MjZaTTE2OSAtMzlRMTY5IC0xMjggMTMwIC0xNzdULTEgLTIyNlEtMTggLTIyNiAtMzQgLTIyNVQtNjggLTIyMlYtMTQ4US0zOCAtMTUxIC0xMyAtMTUxUTE4IC0xNTEgMzcgLTE0M1Q2NiAtMTIwVDc5IC04M1Q4MiAtMzFWNTAySDE2OVYtMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJrIiBob3Jpei1hZHYteD0iNTA0IiBkPSJNMzgwIDBMMjM2IDI0N0wxNjMgMTYyVjBINzZWNzAwSDE2M1YyNjNIMTY3TDM2MCA1MDJINDcwTDI5OSAzMDRMNDg1IDBIMzgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTI0NCAwUTIxOSAtNSAxNzcgLTVRMTIzIC01IDEwMCAxN1Q3NiA5N1Y3MDBIMTYzVjExOVExNjMgMTAxIDE2NSA5MVQxNzQgNzZUMTg5IDcwVDIxMyA2OUgyNDRWMEgyNDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJtIiBob3Jpei1hZHYteD0iODQxIiBkPSJNNjc4IDBWMzA0UTY3OCAzMzMgNjc1IDM1OFQ2NjIgNDAxVDYzMyA0MjlUNTgxIDQ0MFE1MjUgNDQwIDQ5NSA0MTJUNDY0IDMyNlYwSDM3N1YzMDhRMzc3IDMzOCAzNzQgMzYyVDM1OSA0MDRUMzI5IDQzMFQyNzYgNDQwUTI1MCA0NDAgMjI5IDQzMVQxOTQgNDA2VDE3MSAzNjlUMTYzIDMyM1YwSDc2VjUwMkgxNTJMMTYwIDQzOEgxNjJRMTgxIDQ3MyAyMTUgNDkzVDI5OSA1MTRRMzQ3IDUxNCAzODMgNDk2VDQzNyA0MzRRNDYzIDQ3OCA1MDEgNDk2VDU4OSA1MTRRNjM5IDUxNCA2NzIgNTAxVDcyNiA0NjFUNzU2IDM5OFQ3NjUgMzEzVjBINjc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwVjI5NFE0MDEgMzI3IDM5OCAzNTRUMzgzIDQwMFQzNTEgNDI5VDI5MiA0NDBRMjI5IDQ0MCAxOTYgNDA4VDE2MyAzMTVWMEg3NlY1MDJIMTUxTDE1OCA0MzlIMTYyUTIxMSA1MTQgMzE0IDUxNFEzNjYgNTE0IDQwMCA1MDFUNDUzIDQ2MVQ0ODAgMzk4VDQ4OCAzMTRWMEg0MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJvIiBob3Jpei1hZHYteD0iNTc0IiBkPSJNNTMgMjUwUTUzIDMwNSA2NiAzNTNUMTA3IDQzN1QxNzkgNDkzVDI4NiA1MTRRMzQ2IDUxNCAzOTAgNDk1VDQ2MyA0NDBUNTA3IDM1N1Q1MjEgMjUwUTUyMSAxOTUgNTA3IDE0OFQ0NjUgNjVUMzkyIDlUMjg2IC0xMVEyMjUgLTExIDE4MSA5VDEwOSA2NFQ2NyAxNDZUNTMgMjUwWk0xNDIgMjUxUTE0MiAyMTEgMTQ5IDE3NlQxNzIgMTE0VDIxNyA3MlQyODcgNTZRMzI5IDU2IDM1NyA3MVQ0MDEgMTEzVDQyNSAxNzVUNDMyIDI1MVE0MzIgMjkxIDQyNSAzMjZUNDAyIDM4OFQzNTcgNDI5VDI4NyA0NDVRMjQ1IDQ0NSAyMTcgNDMwVDE3MyAzODhUMTQ5IDMyN1QxNDIgMjUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icCIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTUxMSAyNTJRNTExIDIwMCA1MDEgMTUzVDQ2NiA2OVQ0MDMgMTFUMzA1IC0xMVEyNTQgLTExIDIyMSA5VDE2NSA2NkwxNjMgNjdWLTIyMEg3NlY1MDJIMTQ5TDE1NiA0MzhIMTU4UTE4NCA0ODAgMjIyIDQ5N1QzMDggNTE0UTM2OCA1MTQgNDA3IDQ5MlQ0NjkgNDM0VDUwMSAzNTFUNTExIDI1MlpNNDIyIDI1MVE0MjIgMjg3IDQxOCAzMjJUNDAwIDM4NFQzNjAgNDI5VDI4OCA0NDZRMjMxIDQ0NiAxOTcgNDE2VDE2MiAzMjVWMjAxUTE2MiAxNzAgMTY5IDE0NFQxOTIgOTdUMjMxIDY2VDI4NyA1NFEzMjkgNTQgMzU1IDcxVDM5NyAxMTdUNDE3IDE4MVQ0MjIgMjUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icSIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQ4MSAtMjM3UTQzNyAtMjIzIDQxOSAtMTk4VDQwMSAtMTE5VjY3SDM5N1EzNzQgMjUgMzQwIDdUMjU2IC0xMVExOTggLTExIDE1OSAxMVQ5NyA3MFQ2MyAxNTRUNTMgMjUyUTUzIDMwMyA2MiAzNTBUOTUgNDM0VDE1NiA0OTJUMjU0IDUxNFEyOTkgNTE0IDMzOCA0OTlUNDA0IDQzOEg0MDhMNDE1IDUwMkg0ODhWLTEwMVE0ODggLTEzMiA0OTQgLTE0NlQ1MjkgLTE3M0w0ODEgLTIzN1pNNDAyIDMyNlE0MDIgMzg1IDM2OCA0MTVUMjc0IDQ0NlEyMjkgNDQ2IDIwMyA0MjlUMTY0IDM4NVQxNDYgMzIyVDE0MiAyNTFRMTQyIDIxNiAxNDcgMTgxVDE2NyAxMThUMjA4IDcyVDI3NiA1NFEzMDggNTQgMzMyIDY1VDM3MSA5NlQzOTQgMTQzVDQwMiAyMDBWMzI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iciIgaG9yaXotYWR2LXg9IjM1OSIgZD0iTTMxNyA0MzZRMjQ2IDQzNiAyMDUgNDExVDE2MyAzMThWMEg3NlY1MDJIMTUwTDE1OCA0MzhIMTU5UTE4MiA0NzcgMjIwIDQ5NVQzMTMgNTEzSDMzOVY0MzZIMzE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icyIgaG9yaXotYWR2LXg9IjQ1MCIgZD0iTTQwOCAxNDFRNDA4IDEwMSAzOTUgNzNUMzU3IDI2VDMwMCAtMlQyMjggLTExUTE3MyAtMTEgMTI2IDJUMzUgNDJMNjcgMTA2UTEwMiA4MyAxNDUgNjlUMjI3IDU1UTI2OSA1NSAyOTcgNzNUMzI1IDEzNlEzMjUgMTU2IDMxNiAxNjlUMjkxIDE5MlQyNTUgMjA5VDIxMiAyMjJRMTgwIDIzMSAxNTEgMjQyVDk5IDI3MVQ2MyAzMTRUNDkgMzc5UTQ5IDQxMyA2MyA0MzhUMTAxIDQ4MFQxNTggNTA1VDIyOSA1MTRRMjczIDUxNCAzMTMgNTA0VDM5MiA0NzVMMzY3IDQwOVEzNDEgNDI1IDMwNSA0MzVUMjMzIDQ0NlEyMTIgNDQ2IDE5NCA0NDNUMTYyIDQzMVQxNDAgNDA5VDEzMiAzNzZRMTMyIDM1NyAxNDIgMzQ1VDE2OCAzMjRUMjA3IDMwOVQyNTQgMjk0UTI4MiAyODUgMzA5IDI3NFQzNTkgMjQ2VDM5NCAyMDRUNDA4IDE0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSIzNTIiIGQ9Ik0zMTEgLTFRMjk1IC0zIDI3OSAtNFQyNDcgLTZRMjAyIC02IDE3NCAyVDEzMSAyN1QxMTAgNjhUMTA1IDEyNlY0MzFIMjJWNTAySDEwNlY2NDBIMTkyVjUwMkgzMTFWNDMxSDE5MlYxMzlRMTkyIDExOSAxOTQgMTA2VDIwNCA4NFQyMzAgNzFUMjc5IDY3UTI4OCA2NyAyOTQgNjdUMzExIDY4Vi0xSDMxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9InUiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMEwzOTggNjNIMzk1UTM3NiAzMSAzNDAgMTBUMjQ0IC0xMVEyMDQgLTExIDE3MyAtMlQxMjAgMzBUODcgOTJUNzYgMTkyVjUwMkgxNjNWMjM3UTE2MyAxOTUgMTY2IDE2M1QxNzkgMTA4VDIxMSA3NFQyNjkgNjJRMzA0IDYyIDMyNyA3MVQzNjUgOThUMzg2IDEzOVQzOTIgMTk0VjUwMkg0NzlWMEg0MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ2IiBob3Jpei1hZHYteD0iNDg1IiBkPSJNMjk2IDBIMTkxTDIwIDUwMkgxMTNMMjQ0IDc3SDI0OEwzNzUgNTAySDQ2NUwyOTYgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InciIGhvcml6LWFkdi14PSI3NDciIGQ9Ik01NzYgMEg0ODNMMzc0IDM3M0gzNzBMMjYxIDBIMTY4TDI1IDUwMkgxMTVMMjE4IDg2SDIyMkwzMzcgNTAySDQwOEw1MjQgODZINTI4TDYzNCA1MDJINzIyTDU3NiAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieCIgaG9yaXotYWR2LXg9IjQ3NSIgZD0iTTM2MSAwTDI0MCAyMDdIMjM2TDExNSAwSDE1TDE4NyAyNjVMMzUgNTAySDEzNEwyNDAgMzIwSDI0NEwzNDkgNTAySDQ0MkwyOTIgMjY4TDQ2MCAwSDM2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik0yNjYgLTY1UTI0OCAtMTEzIDIzMyAtMTQ0VDE5OCAtMTkzVDE1NiAtMjE5VDk4IC0yMjZRNzcgLTIyNiA0NCAtMjIzVi0xNDlRNTIgLTE1MSA2MiAtMTUxVDg4IC0xNTJRMTA3IC0xNTIgMTIwIC0xNDhUMTQzIC0xMzJUMTYzIC0xMDBUMTgzIC00OEwyMDcgMThMMTggNTAySDExMkwyNTEgMTExSDI1NUwzODQgNTAySDQ3N0wyNjYgLTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieiIgaG9yaXotYWR2LXg9IjQ1NCIgZD0iTTM5IDBWNjhMMzA4IDQzMUg0NVY1MDJINDA3VjQzMUwxMzkgNzFINDE1VjBIMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ7IiBob3Jpei1hZHYteD0iMzQ4IiBkPSJNMjM0IC0xMDRRMTk4IC0xMDQgMTc2IC05NlQxNDEgLTcwVDEyMyAtMjlUMTE4IDI4VjIwN1ExMTggMjM5IDEwOSAyNjFUNjQgMjkyVjM2MVE5OSAzNjkgMTA4IDM5MVQxMTggNDQ2VjYzMVExMTggNjYyIDEyMyA2ODdUMTQwIDcyOVQxNzUgNzU1VDIzMiA3NjRIMjgxVjcwNkgyNTVRMjMyIDcwNiAyMjEgNzAwVDIwNCA2ODJUMTk5IDY1NlQxOTggNjIxVjQzNVExOTggNDE1IDE5NiA0MDFUMTg3IDM3NFQxNzEgMzUwVDE0NCAzMjdRMTYwIDMxNSAxNzAgMzA0VDE4NyAyODBUMTk1IDI1M1QxOTggMjE4VjM5UTE5OCAxNSAxOTkgLTFUMjA2IC0yOFQyMjMgLTQyVDI1NSAtNDdIMjgxVi0xMDRIMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifCIgaG9yaXotYWR2LXg9IjIzMyIgZD0iTTgyIC0yMDBWNzQwSDE1MVYtMjAwSDgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifSIgaG9yaXotYWR2LXg9IjM0OCIgZD0iTTI4NCAyOTJRMjQ5IDI4NCAyMzkgMjYyVDIyOSAyMDdWMjhRMjI5IC00IDIyNCAtMjhUMjA3IC03MFQxNzIgLTk1VDExNCAtMTA0SDY3Vi00N0g5M1ExMTQgLTQ3IDEyNSAtNDNUMTQyIC0yOFQxNDkgLTJUMTUwIDM5VjIxOFExNTAgMjM4IDE1MiAyNTNUMTYwIDI4MFQxNzYgMzAzVDIwMyAzMjdRMTg3IDMzOSAxNzcgMzUwVDE2MCAzNzNUMTUyIDQwMFQxNTAgNDM1VjYyMVExNTAgNjQwIDE1MCA2NTVUMTQ0IDY4MlQxMjggNjk5VDk0IDcwNkg2N1Y3NjRIMTE1UTE0OSA3NjQgMTcxIDc1NVQyMDYgNzI5VDIyNCA2ODdUMjI5IDYzMVY0NDZRMjI5IDQxNCAyMzkgMzkyVDI4NCAzNjFWMjkySDI4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9In4iIGhvcml6LWFkdi14PSI0MTUiIGQ9Ik00MDUgNjIyUTM5MSA1ODYgMzYzIDU2OFQyOTYgNTUwUTI3MyA1NTAgMjUyIDU1NlQyMTEgNTY5VDE3MCA1ODNUMTMwIDU5MFExMDkgNTkwIDk0IDU4MlQ2NSA1NDhMMTIgNTcyUTM0IDYxMiA1OSA2MjhUMTIzIDY0NFExNDUgNjQ0IDE2NiA2MzhUMjA3IDYyNFQyNDcgNjEwVDI4NyA2MDRRMzA3IDYwNCAzMjIgNjEzVDM0OSA2NDRMNDA1IDYyMkg0MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMDsiIGhvcml6LWFkdi14PSIzNTAiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTE7IiBob3Jpei1hZHYteD0iMjgxIiBkPSJNODkgLTE2M1E5NCAtNDEgOTggODBUMTA0IDMyM0gxNzVRMTgxIDgwIDE5MCAtMTYzSDg5Wk03NyA0NThRNzcgNDg0IDk0IDQ5OVQxNDAgNTE1UTE2OSA1MTUgMTg2IDUwMFQyMDQgNDU4UTIwNCA0MzMgMTg3IDQxOFQxNDAgNDAzUTExMiA0MDMgOTUgNDE4VDc3IDQ1OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEyOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTQ5NCAxNDhRNDYyIDExOSA0MjcgMTAyVDM1MSA3OFYwSDI2OVY3OFEyMTkgODQgMTgzIDEwNlQxMjQgMTY0VDkwIDI0NFQ3OSAzNDBRNzkgMzg5IDkwIDQzMlQxMjUgNTEwVDE4NCA1NjZUMjY5IDU5NVY2NjdIMzUxVjU5NlEzOTAgNTkyIDQyNSA1NzdUNDkyIDUzN0w0NTQgNDc1UTM5NyA1MjkgMzIwIDUyOVEyNzggNTI5IDI0OSA1MTVUMjAyIDQ3NVQxNzYgNDE1VDE2OCAzNDJRMTY4IDMwMSAxNzUgMjY2VDIwMCAyMDNUMjQ2IDE2MVQzMTcgMTQ1UTM1MiAxNDUgMzg1IDE1OFQ0NTYgMjA0TDQ5NCAxNDhINDk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTM7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTEyIDBINjNWNzFIODNRMTI4IDcxIDE1NCAxMDRUMTgwIDE5NlExODAgMjI0IDE3NSAyNThUMTYxIDMyNUg3N1YzOTRIMTUwUTE0MSA0MzIgMTM0IDQ2NFQxMjYgNTI4UTEyNiA2MDEgMTczIDYzOVQzMDcgNjc4UTM1NSA2NzggMzk5IDY2N1Q0ODQgNjMyTDQ2MiA1NTdRNDMzIDU3NyAzOTkgNTkwVDMyMiA2MDNRMjY0IDYwMyAyNDAgNTgxVDIxNSA1MTJRMjE1IDQ4NCAyMjEgNDU1VDIzNCAzOTRIMzg1VjMyNUgyNDdRMjU2IDI5MCAyNjIgMjU5VDI2OSAxOTJRMjY5IDE1MiAyNTcgMTI0VDIyNSA3OVY3Nkg1MTJWMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE0OyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTgyIDM0NFE4MiAzNzYgOTIgNDA1VDEyMSA0NThMNTEgNTI5TDk4IDU3NkwxNjkgNTA0UTE5NCA1MjIgMjIzIDUzMlQyODYgNTQyUTMxOSA1NDIgMzQ4IDUzMlQ0MDMgNTAzTDQ3NiA1NzVMNTIzIDUyOEw0NTEgNDU3UTQ5MCA0MDYgNDkwIDM0MFE0OTAgMzA3IDQ4MCAyNzdUNDUxIDIyMkw1MjMgMTUwTDQ3NiAxMDNMNDA0IDE3NVEzNzkgMTU3IDM0OSAxNDdUMjg2IDEzN1EyNTMgMTM3IDIyNCAxNDdUMTY5IDE3NUw5OCAxMDRMNTEgMTUxTDEyMSAyMjFRODIgMjcxIDgyIDM0MFYzNDRaTTE1OSAzNDBRMTU5IDMxNCAxNjkgMjkxVDE5NiAyNTBUMjM2IDIyM1QyODYgMjEzUTMxMyAyMTMgMzM2IDIyM1QzNzYgMjUwVDQwNCAyOTBUNDE0IDM0MFE0MTQgMzY3IDQwNCAzOTBUMzc3IDQzMFQzMzYgNDU4VDI4NiA0NjhRMjYwIDQ2OCAyMzcgNDU4VDE5NiA0MzFUMTY5IDM5MFQxNTkgMzQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTU7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMzkwIDM2Mkg1MTRWMzAySDM1NUwzMzUgMjY3VjIwMkg1MTRWMTQySDMzNVYwSDI0NVYxNDJINjRWMjAySDI0NVYyNjJMMjIyIDMwMkg2NFYzNjJIMTg2TDI5IDY2N0gxMzJMMjkxIDM0Mkw0NDggNjY3SDU0NkwzOTAgMzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTY7IiBob3Jpei1hZHYteD0iMjMzIiBkPSJNODIgMzM1Vjc0MEgxNTFWMzM1SDgyWk04MiAtMjAwVjIwNUgxNTFWLTIwMEg4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE3OyIgaG9yaXotYWR2LXg9IjQ3NCIgZD0iTTQyNSAzMDJRNDI1IDI1NCAzOTMgMjIwVDI4MyAxODFWMTc4UTM0OSAxNTcgMzg4IDEyMVQ0MjcgMjVRNDI3IDMgNDE5IC0yMVQzOTEgLTY1VDMzNSAtOTlUMjQ0IC0xMTNRMTkxIC0xMTMgMTQ5IC0xMDJUNjAgLTYzTDkxIDJRMTY4IC00NyAyNDEgLTQ3UTI5MSAtNDcgMzEzIC0yOVQzMzYgMjVRMzM2IDUyIDMyMCA3MFQyNTYgMTEwUTI0NiAxMTMgMjMyIDExOFQyMDUgMTMwVDE3OSAxNDFUMTYwIDE1MFExMDAgMTc4IDc0IDIwOFQ0NyAyODRRNDcgMzE0IDU4IDMzNlQ4OCAzNzJUMTM0IDM5NFQxOTEgNDA0VjQwN1ExNjUgNDE2IDE0MSA0MjlUOTkgNDU5VDY5IDQ5N1Q1OCA1NDVRNTggNjA1IDEwMyA2NDFUMjQwIDY3OFEyODQgNjc4IDMyMiA2NzBUNDAxIDY0NEwzNzcgNTc0UTM0NSA1OTEgMzEzIDYwMFQyNDcgNjEwUTIyNyA2MTAgMjEwIDYwN1QxNzggNTk3VDE1NiA1NzhUMTQ4IDU0N1ExNDggNTAwIDIxNSA0NzJRMjQ4IDQ2MCAyNzQgNDQ5VDMzMiA0MjNRMzc1IDQwMyA0MDAgMzc4VDQyNSAzMDJaTTM0MyAyODhRMzQzIDMwMyAzMzkgMzE2VDMyMiAzNDBUMjkwIDM1NlQyMzYgMzYyUTIxNyAzNjIgMTk4IDM2MFQxNjQgMzUwVDEzOCAzMjdUMTI4IDI4N1ExMjggMjc4IDEzMSAyNjVUMTQ1IDI0MVQxNzggMjIxVDIzNiAyMTNRMjkzIDIxMyAzMTggMjMxVDM0MyAyODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBODsiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0zMjMgNjIyUTMyMyA2MDIgMzA4IDU4N1QyNzMgNTcyUTI1MiA1NzIgMjM3IDU4N1QyMjIgNjIyUTIyMiA2NDMgMjM3IDY1OFQyNzMgNjczUTI5MyA2NzMgMzA4IDY1OFQzMjMgNjIyWk0xMzYgNjIyUTEzNiA2MDIgMTIxIDU4N1Q4NSA1NzJRNjUgNTcyIDUwIDU4N1QzNSA2MjJRMzUgNjQzIDUwIDY1OFQ4NSA2NzNRMTA2IDY3MyAxMjEgNjU4VDEzNiA2MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBOTsiIGhvcml6LWFkdi14PSI4NjYiIGQ9Ik03NzkgMzM0UTc3OSAyNjIgNzUyIDIwMFQ2NzggOTFUNTY4IDE3VDQzMyAtMTBRMzYxIC0xMCAyOTggMTdUMTg4IDkwVDExNCAxOTlUODcgMzM0UTg3IDQwNiAxMTQgNDY4VDE4OCA1NzdUMjk4IDY1MVQ0MzMgNjc4UTUwNSA2NzggNTY4IDY1MVQ2NzggNTc4VDc1MiA0NjlUNzc5IDMzNFpNNzQxIDMzNFE3NDEgMzk3IDcxOCA0NTNUNjUzIDU1MlQ1NTUgNjE4VDQzMyA2NDNRMzY4IDY0MyAzMTIgNjE5VDIxNCA1NTJUMTUwIDQ1NFQxMjYgMzM0UTEyNiAyNzEgMTUwIDIxNlQyMTYgMTE4VDMxNCA1MlQ0MzMgMjhRNDk2IDI4IDU1MiA1MlQ2NTAgMTE4VDcxNiAyMTVUNzQxIDMzNFpNNTk5IDE3OFE1NjUgMTQ4IDUyNyAxMzFUNDQyIDExNFEzODQgMTE0IDM0NiAxMzBUMjg0IDE3NlQyNTEgMjQ2VDI0MSAzMzVRMjQxIDM4NSAyNTIgNDI1VDI4OSA0OTRUMzUyIDUzN1Q0NDQgNTUyUTQ5MSA1NTIgNTI4IDUzNlQ1OTkgNDg5TDU2NCA0NDRRNTM5IDQ3MCA1MTAgNDg0VDQ0NSA0OThRNDA0IDQ5OCAzNzcgNDg3VDMzNSA0NTRUMzEzIDQwM1QzMDYgMzM2UTMwNiAyOTggMzEyIDI2N1QzMzQgMjE0VDM3NiAxODFUNDQzIDE2OVE0NzkgMTY5IDUwOCAxODNUNTY2IDIyM0w1OTkgMTc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUE7IiBob3Jpei1hZHYteD0iMzkwIiBkPSJNMjk1IDM3MFEyNjQgMzgwIDI1NyA0MDNIMjU1UTIzMyAzODYgMjA3IDM3N1QxNTQgMzY4UTExMiAzNjggODYgMzkxVDU5IDQ2MFE1OSA0OTEgNzMgNTEzVDExMiA1NDhUMTczIDU2N1QyNTEgNTczVjU4MVEyNTEgNjEwIDI0MyA2MjJUMjAwIDYzNFExNzQgNjM0IDE0OCA2MjlUODUgNjAzTDY0IDY0NlExMDEgNjY1IDEzMyA2NzNUMjAyIDY4MlEyNTkgNjgyIDI4NCA2NThUMzEwIDU3OFY0NDhRMzEwIDQzMSAzMTMgNDI1VDMzMiA0MTBMMjk1IDM3MFpNMjUxIDUzNlExODIgNTM2IDE1MCA1MTZUMTE4IDQ2MFExMTggNDM3IDEzMiA0MjNUMTY4IDQwOVExODcgNDA5IDIwNiA0MTZUMjUxIDQ0MVY1MzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQjsiIGhvcml6LWFkdi14PSI0NTQiIGQ9Ik0zNDkgMTEwTDIxMCAzMDZMMzQ5IDUwMkw0MDkgNDY5TDI4OSAzMDVMNDA4IDE0NEwzNDkgMTEwWk0xNjMgMTA0TDE5IDMwNkwxNjIgNTA4TDIyMSA0NzVMOTggMzA1TDIyMiAxMzhMMTYzIDEwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFDOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTQ0OCAyMjRINTFWMzAwSDUyM1Y0NEg0NDhWMjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUQ7IiBob3Jpei1hZHYteD0iMzc2IiBkPSJNNTIgMjE5VjMwMEgzMjRWMjE5SDUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUU7IiBob3Jpei1hZHYteD0iNDUzIiBkPSJNMjI3IDM2MVExOTEgMzYxIDE1OSAzNzRUMTAzIDQxMVQ2NiA0NjRUNTIgNTMwUTUyIDU2NSA2NSA1OTZUMTAzIDY1MFQxNTkgNjg2VDIyNyA3MDBRMjYzIDcwMCAyOTQgNjg3VDM1MCA2NTBUMzg3IDU5NlQ0MDEgNTMwUTQwMSA0OTUgMzg4IDQ2NVQzNTAgNDExVDI5NSAzNzVUMjI3IDM2MVpNMjI4IDY3NlExOTYgNjc2IDE2OSA2NjVUMTIxIDYzM1Q4OSA1ODdUNzcgNTMxUTc3IDUwMiA4OSA0NzZUMTIxIDQyOVQxNjkgMzk4VDIyNyAzODZRMjU3IDM4NiAyODQgMzk3VDMzMiA0MjhUMzY1IDQ3NFQzNzcgNTMxUTM3NyA1NjAgMzY1IDU4NlQzMzMgNjMzVDI4NiA2NjRUMjI4IDY3NlpNMTYyIDYyNFExODIgNjI2IDE5NyA2MjdUMjI4IDYyOFEyNDIgNjI4IDI1NiA2MjZUMjgxIDYxNlQyOTggNTk4VDMwNSA1NjhRMzA1IDU1MSAyOTcgNTM5VDI3NSA1MTlMMzA5IDQzOUgyNjZMMjQwIDUwM1EyMzggNTA3IDIzNyA1MDhUMjMwIDUwOUgyMDBWNDM5SDE2MlY2MjRaTTIyOSA1OTVRMjIxIDU5NSAyMTQgNTk1VDIwMCA1OTRWNTM5SDIzMVEyNjYgNTM5IDI2NiA1NjZRMjY2IDU5NSAyMjkgNTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUY7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMjkgNTg5VjY0NkgzMjdWNTg5SDI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjA7IiBob3Jpei1hZHYteD0iNDEwIiBkPSJNMzQ4IDUzOVEzNDggNTA5IDMzNyA0ODNUMzA3IDQzN1QyNjEgNDA2VDIwNSAzOTVRMTc1IDM5NSAxNDkgNDA2VDEwNCA0MzZUNzMgNDgyVDYyIDUzOVE2MiA1NjkgNzMgNTk1VDEwMyA2NDBUMTQ5IDY3MVQyMDUgNjgyUTIzNSA2ODIgMjYxIDY3MVQzMDYgNjQxVDMzNyA1OTVUMzQ4IDUzOVpNMzExIDUzOVEzMTEgNTYxIDMwMyA1ODBUMjgwIDYxM1QyNDcgNjM1VDIwNSA2NDRRMTgzIDY0NCAxNjQgNjM2VDEzMSA2MTNUMTA4IDU4MFQ5OSA1MzlROTkgNTE3IDEwNyA0OThUMTMwIDQ2NFQxNjQgNDQyVDIwNSA0MzNRMjUwIDQzMyAyODAgNDYzVDMxMSA1MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMTsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik0zMjggMjgyVjExNEgyNTFWMjgySDUxVjM1N0gyNTFWNTQ2SDMyOFYzNTdINTIzVjI4MkgzMjhaTTUxIDBWNzNINTIzVjBINTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMjsiIGhvcml6LWFkdi14PSIzMDkiIGQ9Ik00MSAzNjdMMzIgNDIxUTc0IDQ1NiAxMDYgNDgxVDE2MCA1MjdUMTkzIDU2NVQyMDQgNjAzUTIwNCA2MjAgMTk0IDYzNFQxNTQgNjQ5UTEzMCA2NDkgMTEyIDY0MFQ3MiA2MDhMMzggNjQ3UTY3IDY3NiA5NiA2ODhUMTYwIDcwMFEyMDkgNzAwIDIzNyA2NzdUMjY2IDYwN1EyNjYgNTg3IDI2MCA1NjlUMjM1IDUyOVQxODUgNDgwVDEwMSA0MTdIMjcwVjM2N0g0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIzOyIgaG9yaXotYWR2LXg9IjMwMiIgZD0iTTI2MyA0NjBRMjYzIDQxNSAyMzUgMzg4VDE0MyAzNjFRMTExIDM2MSA4MyAzNjlUMjcgMzk5TDUzIDQ0MlE3NiA0MjQgOTYgNDE3VDEzNyA0MDlRMTY2IDQwOSAxODQgNDIyVDIwMyA0NjRRMjAzIDQ5MSAxODkgNTAyVDE0MyA1MTNIMTAwVjU1N0gxMjRRMTYyIDU1NyAxNzggNTcxVDE5NCA2MDZRMTk0IDYyNiAxODEgNjM4VDE0MSA2NTFRMTE5IDY1MSA5OCA2NDRUNjAgNjE5TDMyIDY2MVE2MiA2ODMgODggNjkxVDE0NyA3MDBRMTk1IDcwMCAyMjQgNjc4VDI1NCA2MDhRMjU0IDU4NSAyNDEgNTY4VDIwNyA1NDJWNTQxUTI2MyA1MjcgMjYzIDQ2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTEyMyA1NjVMNzQgNTk2TDIxMSA3MTdMMjk3IDY3NUwxMjMgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjU7IiBob3Jpei1hZHYteD0iNTgxIiBkPSJNNDE3IDBMNDA5IDYzSDQwNlEzOTYgNDggMzg1IDM1VDM1NyAxMVQzMTkgLTVUMjY4IC0xMVEyNTUgLTExIDI0MSAtMTBUMjEyIC0zVDE4NiAxMlQxNjYgMzZWLTIyMEg4N1Y1MDJIMTc1VjIzOFExNzUgMTk2IDE3NyAxNjRUMTkwIDEwOVQyMjIgNzVUMjgxIDYzUTMxNiA2MyAzMzkgNzJUMzc3IDk5VDM5NyAxNDBUNDAzIDE5NFY1MDJINDkxVjBINDE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjY7IiBob3Jpei1hZHYteD0iNDg4IiBkPSJNMzM1IDBRMjYzIDAgMjA4IDE5VDExNiA3M1Q2MSAxNTNUNDIgMjUyUTQyIDMwNCA2MCAzNDlUMTE2IDQyOVQyMDggNDgyVDMzNSA1MDJINDAyVjBIMzM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjc7IiBob3Jpei1hZHYteD0iMjEwIiBkPSJNMTY3IDIzOFExNjcgMjEyIDE1MCAxOTdUMTA0IDE4MVE3NiAxODEgNTkgMTk2VDQxIDIzOFE0MSAyNjMgNTggMjc4VDEwNCAyOTNRMTMzIDI5MyAxNTAgMjc4VDE2NyAyMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCODsiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0yNzQgLTEyNFEyNzQgLTE2MCAyNDkgLTE4M1QxNzQgLTIwNlExNTAgLTIwNiAxMzAgLTE5OVQ5MiAtMTgyTDEwNyAtMTQ3UTEyNiAtMTU3IDE0MCAtMTYxVDE3MCAtMTY2UTE5MyAtMTY2IDIwOCAtMTU4VDIyMyAtMTI1UTIyMyAtMTAyIDIwOSAtOTRUMTcyIC04NlExNjEgLTg2IDE1MyAtODdUMTM2IC05MkwxMTggLTc3TDE1OCAwSDIwNUwxNzYgLTUxSDE3N1ExODMgLTUxIDE4OSAtNTFUMjAyIC01MFEyMzUgLTUwIDI1NCAtNjhUMjc0IC0xMjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCOTsiIGhvcml6LWFkdi14PSIyODAiIGQ9Ik0xMTcgNDE2VjYyOEgxMTRMNDUgNTkwTDI1IDYzNUwxMjkgNjk0SDE3OFY0MTZIMjU3VjM2N0gzNFY0MTZIMTE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkE7IiBob3Jpei1hZHYteD0iMzkwIiBkPSJNMzM4IDUyNVEzMzggNDUxIDMwMSA0MTBUMTk1IDM2OFExMjYgMzY4IDg5IDQwOVQ1MiA1MjVRNTIgNTk3IDg4IDYzOVQxOTUgNjgyUTI2NCA2ODIgMzAxIDY0MVQzMzggNTI1Wk0yNzggNTI1UTI3OCA1NzUgMjYxIDYwM1QxOTUgNjMyUTE0NyA2MzIgMTMwIDYwNFQxMTMgNTI1UTExMyA0NjMgMTM1IDQ0MFQxOTYgNDE2UTIzNCA0MTYgMjU2IDQzOVQyNzggNTI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkI7IiBob3Jpei1hZHYteD0iNDU0IiBkPSJNMjkxIDEwNEwyMzIgMTM4TDM1NSAzMDVMMjMxIDQ3NUwyOTEgNTA4TDQzNSAzMDZMMjkxIDEwNFpNMTA0IDExMEw0NSAxNDRMMTY1IDMwNUw0NCA0NjlMMTA0IDUwMkwyNDQgMzA2TDEwNCAxMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik0xNTMgNDE2VjYyOEgxNTBMODEgNTkwTDYxIDYzNUwxNjUgNjk0SDIxNFY0MTZIMjkzVjM2N0g3MFY0MTZIMTUzWk0xOTIgMEgxMzlMNjI3IDcwMEg2ODBMMTkyIDBaTTY2MiA2N1YwSDYwMFY2N0g0NjBMNDQ1IDExNEw1OTYgMzI3SDY2MlYxMTdINzEzVjY3SDY2MlpNNTAxIDExNEg2MDJWMjY3TDUwMSAxMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRDsiIGhvcml6LWFkdi14PSI3MTgiIGQ9Ik0xNDUgNDE2VjYyOEgxNDJMNzMgNTkwTDUzIDYzNUwxNTcgNjk0SDIwNlY0MTZIMjg1VjM2N0g2MlY0MTZIMTQ1Wk0xNTMgMEgxMDBMNTg4IDcwMEg2NDFMMTUzIDBaTTQ0OSAwTDQ0MCA1NFE0ODIgODkgNTE0IDExNFQ1NjggMTYwVDYwMSAxOThUNjEyIDIzNlE2MTIgMjUzIDYwMiAyNjdUNTYyIDI4MlE1MzggMjgyIDUyMCAyNzNUNDgwIDI0MUw0NDYgMjgwUTQ3NSAzMDkgNTA0IDMyMVQ1NjggMzMzUTYxNyAzMzMgNjQ1IDMxMFQ2NzQgMjQwUTY3NCAyMjAgNjY4IDIwMlQ2NDMgMTYyVDU5MyAxMTNUNTA5IDUwSDY3OFYwSDQ0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJFOyIgaG9yaXotYWR2LXg9IjcwNyIgZD0iTTI5OCA0NjBRMjk4IDQxNSAyNzAgMzg4VDE3OCAzNjFRMTQ2IDM2MSAxMTggMzY5VDYyIDM5OUw4OCA0NDJRMTExIDQyNCAxMzEgNDE3VDE3MiA0MDlRMjAxIDQwOSAyMTkgNDIyVDIzOCA0NjRRMjM4IDQ5MSAyMjQgNTAyVDE3OCA1MTNIMTM1VjU1N0gxNTlRMTk3IDU1NyAyMTMgNTcxVDIyOSA2MDZRMjI5IDYyNiAyMTYgNjM4VDE3NiA2NTFRMTU0IDY1MSAxMzMgNjQ0VDk1IDYxOUw2NyA2NjFROTcgNjgzIDEyMyA2OTFUMTgyIDcwMFEyMzAgNzAwIDI1OSA2NzhUMjg5IDYwOFEyODkgNTg1IDI3NiA1NjhUMjQyIDU0MlY1NDFRMjk4IDUyNyAyOTggNDYwWk0xNzMgMEgxMjBMNjA4IDcwMEg2NjFMMTczIDBaTTYzMCA2N1YwSDU2OFY2N0g0MjhMNDEzIDExNEw1NjQgMzI3SDYzMFYxMTdINjgxVjY3SDYzMFpNNDY5IDExNEg1NzBWMjY3TDQ2OSAxMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRjsiIGhvcml6LWFkdi14PSI1MTUiIGQ9Ik03MiAtMlE3MiA1OSA5OSAxMDFUMTkxIDE3NUwyNDMgMTk5UTI1OSAyMDcgMjY4IDIxMlQyODEgMjI0VDI4NiAyNDFUMjg3IDI3MFYzMzJIMzczVjI1M1EzNzMgMjMwIDM3MSAyMTVUMzYxIDE4OVQzNDEgMTY5VDMwNyAxNTBMMjU3IDEyN1EyMjggMTEzIDIxMCAxMDFUMTgwIDc1VDE2NCA0NFQxNTkgNVExNTkgLTQ2IDE5MiAtNzNUMjg2IC0xMDBRMzI4IC0xMDAgMzY1IC04N1Q0NDIgLTQxTDQ4NSAtMTA2UTQzMiAtMTQyIDM4NCAtMTU4VDI3NiAtMTc0UTE3NiAtMTc0IDEyNCAtMTI4VDcyIC0yWk0yNjggNDU4UTI2OCA0ODQgMjg1IDQ5OVQzMzEgNTE1UTM2MCA1MTUgMzc3IDUwMFQzOTUgNDU4UTM5NSA0MzMgMzc4IDQxOFQzMzEgNDAzUTMwMyA0MDMgMjg2IDQxOFQyNjggNDU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzA7IiBob3Jpei1hZHYteD0iNjQyIiBkPSJNNTIyIDBMNDY1IDE2MUgxNzRMMTE2IDBIMjJMMjY4IDY3MUgzNzBMNjIwIDBINTIyWk0zMjAgNTgySDMxNkwxOTYgMjM2SDQ0MEwzMjAgNTgyWk0zMzIgNzA1TDE1OCA4MTRMMjQ2IDg1NEwzODEgNzM1TDMzMiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMTsiIGhvcml6LWFkdi14PSI2NDIiIGQ9Ik01MjIgMEw0NjUgMTYxSDE3NEwxMTYgMEgyMkwyNjggNjcxSDM3MEw2MjAgMEg1MjJaTTMyMCA1ODJIMzE2TDE5NiAyMzZINDQwTDMyMCA1ODJaTTMwOSA3MDVMMjYwIDczNkwzOTcgODU3TDQ4MyA4MTVMMzA5IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgaG9yaXotYWR2LXg9IjY0MiIgZD0iTTUyMiAwTDQ2NSAxNjFIMTc0TDExNiAwSDIyTDI2OCA2NzFIMzcwTDYyMCAwSDUyMlpNMzIwIDU4MkgzMTZMMTk2IDIzNkg0NDBMMzIwIDU4MlpNNDM2IDcwM0wzMTggNzgyTDE5OSA3MDNMMTYyIDc1M0wzMTcgODUxTDQ3NCA3NTNMNDM2IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMzOyIgaG9yaXotYWR2LXg9IjY0MiIgZD0iTTUyMiAwTDQ2NSAxNjFIMTc0TDExNiAwSDIyTDI2OCA2NzFIMzcwTDYyMCAwSDUyMlpNMzIwIDU4MkgzMTZMMTk2IDIzNkg0NDBMMzIwIDU4MlpNNDgzIDc4MVE0NzIgNzQ1IDQ0NiA3MjhUMzkxIDcxMFEzNzMgNzEwIDM1NSA3MTZUMzE5IDcyOVQyODUgNzQzVDI1NCA3NTBRMjM3IDc1MCAyMjMgNzQyVDE5OCA3MDlMMTU0IDc0M1ExNzIgNzg0IDE5NSA3OTlUMjQ3IDgxNFEyNjUgODE0IDI4MyA4MDhUMzIwIDc5NFQzNTQgNzgwVDM4NSA3NzRRNDAyIDc3NCA0MTYgNzgyVDQzOCA4MTRMNDgzIDc4MUg0ODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNDsiIGhvcml6LWFkdi14PSI2NDIiIGQ9Ik01MjIgMEw0NjUgMTYxSDE3NEwxMTYgMEgyMkwyNjggNjcxSDM3MEw2MjAgMEg1MjJaTTMyMCA1ODJIMzE2TDE5NiAyMzZINDQwTDMyMCA1ODJaTTQ2MyA3NjJRNDYzIDc0MiA0NDggNzI3VDQxMyA3MTJRMzkyIDcxMiAzNzcgNzI3VDM2MiA3NjJRMzYyIDc4MyAzNzcgNzk4VDQxMyA4MTNRNDMzIDgxMyA0NDggNzk4VDQ2MyA3NjJaTTI3NiA3NjJRMjc2IDc0MiAyNjEgNzI3VDIyNSA3MTJRMjA1IDcxMiAxOTAgNzI3VDE3NSA3NjJRMTc1IDc4MyAxOTAgNzk4VDIyNSA4MTNRMjQ2IDgxMyAyNjEgNzk4VDI3NiA3NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNTsiIGhvcml6LWFkdi14PSI2NDIiIGQ9Ik00MzYgNzI2UTQzNiA2OTUgNDIyIDY3MVQzODQgNjMyTDYyMCAwSDUyMkw0NjUgMTYxSDE3NEwxMTYgMEgyMkwyNTMgNjMxUTIyOSA2NDUgMjE0IDY3MFQxOTkgNzI2UTE5OSA3NTEgMjA4IDc3MlQyMzQgODA4VDI3MSA4MzJUMzE4IDg0MVEzNDMgODQxIDM2NCA4MzNUNDAyIDgwOVQ0MjcgNzcyVDQzNiA3MjZaTTMxOSA1ODRIMzE3TDE5NiAyMzZINDQwTDMxOSA1ODRaTTM4MiA3MjZRMzgyIDc1NCAzNjQgNzcyVDMxOCA3OTBRMjkwIDc5MCAyNzIgNzcyVDI1MyA3MjZRMjUzIDY5NyAyNzEgNjc5VDMxOCA2NjBRMzQ1IDY2MCAzNjMgNjc4VDM4MiA3MjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNjsiIGhvcml6LWFkdi14PSI4OTgiIGQ9Ik00NTEgMFYxNjRIMjA1TDExOCAwSDIyTDM5MyA2NjdIODUwVjU5MUg1NDFWMzkySDgyMFYzMTRINTQxVjc2SDg2MFYwSDQ1MVpNNDUyIDU4OUg0MzlMMjQyIDI0Mkg0NTJWNTg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzc7IiBob3Jpei1hZHYteD0iNjMyIiBkPSJNNDUzIC0xMjdRNDUzIC0xNjUgNDI2IC0xODdUMzU0IC0yMDlRMzMxIC0yMDkgMzA5IC0yMDNUMjcwIC0xODVMMjg2IC0xNTBRMzAyIC0xNTkgMzE3IC0xNjRUMzUxIC0xNjlRMzcxIC0xNjkgMzg2IC0xNjFUNDAxIC0xMjlRNDAxIC0xMDYgMzg4IC05OFQzNTIgLTg5UTMzMCAtODkgMzE0IC05NUwyOTYgLTgwTDMzMyAtMTBRMTk5IDAgMTMyIDkxVDY1IDMzNVE2NSA0MDQgODIgNDY2VDEzNyA1NzVUMjMxIDY1MFQzNjggNjc4UTQzNCA2NzggNDg4IDY1NlQ1OTYgNTg2TDU0MSA1MjZRNDk4IDU2NiA0NTkgNTgzVDM3MSA2MDFRMjc1IDYwMSAyMTggNTM2VDE2MCAzMzVRMTYwIDI4MiAxNzAgMjM0VDIwNCAxNDhUMjY4IDg4VDM2OCA2NVE0MTYgNjUgNDYxIDg0VDU1MSAxNDVMNjAwIDgzUTU0NyAzNSA0OTQgMTNUMzc5IC0xMUwzNTQgLTU1TDM1NSAtNTZRMzYwIC01NSAzNjcgLTU1VDM4MCAtNTRRNDEzIC01NCA0MzMgLTcyVDQ1MyAtMTI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzg7IiBob3Jpei1hZHYteD0iNTM0IiBkPSJNODYgMFY2NjdINDg0VjU5MEgxNzdWMzkxSDQ1NVYzMTNIMTc3Vjc2SDQ5NlYwSDg2Wk0zMjkgNzA1TDE1NSA4MTRMMjQzIDg1NEwzNzggNzM1TDMyOSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDOTsiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik04NiAwVjY2N0g0ODRWNTkwSDE3N1YzOTFINDU1VjMxM0gxNzdWNzZINDk2VjBIODZaTTI3MCA3MDVMMjIxIDczNkwzNTggODU3TDQ0NCA4MTVMMjcwIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBWNjY3SDQ4NFY1OTBIMTc3VjM5MUg0NTVWMzEzSDE3N1Y3Nkg0OTZWMEg4NlpNNDA1IDcwM0wyODcgNzgyTDE2OCA3MDNMMTMxIDc1M0wyODYgODUxTDQ0MyA3NTNMNDA1IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBWNjY3SDQ4NFY1OTBIMTc3VjM5MUg0NTVWMzEzSDE3N1Y3Nkg0OTZWMEg4NlpNNDMyIDc2MlE0MzIgNzQyIDQxNyA3MjdUMzgyIDcxMlEzNjEgNzEyIDM0NiA3MjdUMzMxIDc2MlEzMzEgNzgzIDM0NiA3OThUMzgyIDgxM1E0MDIgODEzIDQxNyA3OThUNDMyIDc2MlpNMjQ1IDc2MlEyNDUgNzQyIDIzMCA3MjdUMTk0IDcxMlExNzQgNzEyIDE1OSA3MjdUMTQ0IDc2MlExNDQgNzgzIDE1OSA3OThUMTk0IDgxM1EyMTUgODEzIDIzMCA3OThUMjQ1IDc2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENDOyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBWNjY3SDE3N1YwSDg2Wk0xNDUgNzA1TC0yOSA4MTRMNTkgODU0TDE5NCA3MzVMMTQ1IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENEOyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBWNjY3SDE3N1YwSDg2Wk0xMjMgNzA1TDc0IDczNkwyMTEgODU3TDI5NyA4MTVMMTIzIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENFOyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBWNjY3SDE3N1YwSDg2Wk0yNTQgNzAzTDEzNiA3ODJMMTcgNzAzTC0yMCA3NTNMMTM1IDg1MUwyOTIgNzUzTDI1NCA3MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRjsiIGhvcml6LWFkdi14PSIyNjMiIGQ9Ik04NiAwVjY2N0gxNzdWMEg4NlpNMjc3IDc2MlEyNzcgNzQyIDI2MiA3MjdUMjI3IDcxMlEyMDYgNzEyIDE5MSA3MjdUMTc2IDc2MlExNzYgNzgzIDE5MSA3OThUMjI3IDgxM1EyNDcgODEzIDI2MiA3OThUMjc3IDc2MlpNOTAgNzYyUTkwIDc0MiA3NSA3MjdUMzkgNzEyUTE5IDcxMiA0IDcyN1QtMTEgNzYyUS0xMSA3ODMgNCA3OThUMzkgODEzUTYwIDgxMyA3NSA3OThUOTAgNzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDA7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNjA0IDMzOFE2MDQgMjY4IDU4NyAyMDdUNTMxIDk5VDQzMiAyN1QyODQgMEg4N1YzMThIMjNWMzkzSDg3VjY2M1ExMzMgNjY4IDE4OCA2NzFUMjg4IDY3NVEzNjggNjc1IDQyNyA2NTFUNTI2IDU4M1Q1ODQgNDc2VDYwNCAzMzhaTTUxMCAzMzlRNTEwIDM4NiA1MDEgNDMzVDQ2OCA1MTdUNDAxIDU3N1QyOTMgNjAwUTI2MyA2MDAgMjMzIDU5OVQxNzcgNTk0VjM5M0gzMzNWMzE4SDE3N1Y3NVEyMDAgNzQgMjI0IDc0VDI3MyA3NFE0MDEgNzQgNDU1IDE0MVQ1MTAgMzM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDE7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMwIDBMMTc4IDUyMEgxNzRWMEg4NlY2NjdIMTc2TDUyMyAxNTRINTI3VjY2N0g2MTVWMEg1MzBaTTUyMiA3ODFRNTExIDc0NSA0ODUgNzI4VDQzMCA3MTBRNDEyIDcxMCAzOTQgNzE2VDM1OCA3MjlUMzI0IDc0M1QyOTMgNzUwUTI3NiA3NTAgMjYyIDc0MlQyMzcgNzA5TDE5MyA3NDNRMjExIDc4NCAyMzQgNzk5VDI4NiA4MTRRMzA0IDgxNCAzMjIgODA4VDM1OSA3OTRUMzkzIDc4MFQ0MjQgNzc0UTQ0MSA3NzQgNDU1IDc4MlQ0NzcgODE0TDUyMiA3ODFINTIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDI7IiBob3Jpei1hZHYteD0iNzQ2IiBkPSJNNjgxIDMzNFE2ODEgMjU5IDY2MyAxOTZUNjA3IDg3VDUxMSAxNVQzNzMgLTExUTI5MyAtMTEgMjM1IDE1VDEzOSA4N1Q4MyAxOTZUNjUgMzM0UTY1IDQwNiA4MyA0NjhUMTM4IDU3N1QyMzQgNjUxVDM3MyA2NzhRNDUzIDY3OCA1MTEgNjUyVDYwNyA1ODBUNjYzIDQ3MFQ2ODEgMzM0Wk01ODYgMzMzUTU4NiAzODYgNTc3IDQzNVQ1NDMgNTIxVDQ3OCA1ODFUMzczIDYwNFEzMTAgNjA0IDI2OSA1ODJUMjA0IDUyMlQxNzAgNDM1VDE2MCAzMzNRMTYwIDI4MSAxNjkgMjMyVDIwMyAxNDZUMjY5IDg2VDM3MyA2M1E0MzYgNjMgNDc3IDg1VDU0MyAxNDVUNTc2IDIzMlQ1ODYgMzMzWk00MjUgNzA3TDI1MSA4MTZMMzM5IDg1Nkw0NzQgNzM3TDQyNSA3MDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMzsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik02ODEgMzM0UTY4MSAyNTkgNjYzIDE5NlQ2MDcgODdUNTExIDE1VDM3MyAtMTFRMjkzIC0xMSAyMzUgMTVUMTM5IDg3VDgzIDE5NlQ2NSAzMzRRNjUgNDA2IDgzIDQ2OFQxMzggNTc3VDIzNCA2NTFUMzczIDY3OFE0NTMgNjc4IDUxMSA2NTJUNjA3IDU4MFQ2NjMgNDcwVDY4MSAzMzRaTTU4NiAzMzNRNTg2IDM4NiA1NzcgNDM1VDU0MyA1MjFUNDc4IDU4MVQzNzMgNjA0UTMxMCA2MDQgMjY5IDU4MlQyMDQgNTIyVDE3MCA0MzVUMTYwIDMzM1ExNjAgMjgxIDE2OSAyMzJUMjAzIDE0NlQyNjkgODZUMzczIDYzUTQzNiA2MyA0NzcgODVUNTQzIDE0NVQ1NzYgMjMyVDU4NiAzMzNaTTM1OCA3MDdMMzA5IDczOEw0NDYgODU5TDUzMiA4MTdMMzU4IDcwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTY4MSAzMzRRNjgxIDI1OSA2NjMgMTk2VDYwNyA4N1Q1MTEgMTVUMzczIC0xMVEyOTMgLTExIDIzNSAxNVQxMzkgODdUODMgMTk2VDY1IDMzNFE2NSA0MDYgODMgNDY4VDEzOCA1NzdUMjM0IDY1MVQzNzMgNjc4UTQ1MyA2NzggNTExIDY1MlQ2MDcgNTgwVDY2MyA0NzBUNjgxIDMzNFpNNTg2IDMzM1E1ODYgMzg2IDU3NyA0MzVUNTQzIDUyMVQ0NzggNTgxVDM3MyA2MDRRMzEwIDYwNCAyNjkgNTgyVDIwNCA1MjJUMTcwIDQzNVQxNjAgMzMzUTE2MCAyODEgMTY5IDIzMlQyMDMgMTQ2VDI2OSA4NlQzNzMgNjNRNDM2IDYzIDQ3NyA4NVQ1NDMgMTQ1VDU3NiAyMzJUNTg2IDMzM1pNNDk2IDcwM0wzNzggNzgyTDI1OSA3MDNMMjIyIDc1M0wzNzcgODUxTDUzNCA3NTNMNDk2IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ1OyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTY4MSAzMzRRNjgxIDI1OSA2NjMgMTk2VDYwNyA4N1Q1MTEgMTVUMzczIC0xMVEyOTMgLTExIDIzNSAxNVQxMzkgODdUODMgMTk2VDY1IDMzNFE2NSA0MDYgODMgNDY4VDEzOCA1NzdUMjM0IDY1MVQzNzMgNjc4UTQ1MyA2NzggNTExIDY1MlQ2MDcgNTgwVDY2MyA0NzBUNjgxIDMzNFpNNTg2IDMzM1E1ODYgMzg2IDU3NyA0MzVUNTQzIDUyMVQ0NzggNTgxVDM3MyA2MDRRMzEwIDYwNCAyNjkgNTgyVDIwNCA1MjJUMTcwIDQzNVQxNjAgMzMzUTE2MCAyODEgMTY5IDIzMlQyMDMgMTQ2VDI2OSA4NlQzNzMgNjNRNDM2IDYzIDQ3NyA4NVQ1NDMgMTQ1VDU3NiAyMzJUNTg2IDMzM1pNNTM0IDc4M1E1MjMgNzQ3IDQ5NyA3MzBUNDQyIDcxMlE0MjQgNzEyIDQwNiA3MThUMzcwIDczMVQzMzYgNzQ1VDMwNSA3NTJRMjg4IDc1MiAyNzQgNzQ0VDI0OSA3MTFMMjA1IDc0NVEyMjMgNzg2IDI0NiA4MDFUMjk4IDgxNlEzMTYgODE2IDMzNCA4MTBUMzcxIDc5NlQ0MDUgNzgyVDQzNiA3NzZRNDUzIDc3NiA0NjcgNzg0VDQ4OSA4MTZMNTM0IDc4M0g1MzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENjsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik02ODEgMzM0UTY4MSAyNTkgNjYzIDE5NlQ2MDcgODdUNTExIDE1VDM3MyAtMTFRMjkzIC0xMSAyMzUgMTVUMTM5IDg3VDgzIDE5NlQ2NSAzMzRRNjUgNDA2IDgzIDQ2OFQxMzggNTc3VDIzNCA2NTFUMzczIDY3OFE0NTMgNjc4IDUxMSA2NTJUNjA3IDU4MFQ2NjMgNDcwVDY4MSAzMzRaTTU4NiAzMzNRNTg2IDM4NiA1NzcgNDM1VDU0MyA1MjFUNDc4IDU4MVQzNzMgNjA0UTMxMCA2MDQgMjY5IDU4MlQyMDQgNTIyVDE3MCA0MzVUMTYwIDMzM1ExNjAgMjgxIDE2OSAyMzJUMjAzIDE0NlQyNjkgODZUMzczIDYzUTQzNiA2MyA0NzcgODVUNTQzIDE0NVQ1NzYgMjMyVDU4NiAzMzNaTTUxNyA3NjJRNTE3IDc0MiA1MDIgNzI3VDQ2NyA3MTJRNDQ2IDcxMiA0MzEgNzI3VDQxNiA3NjJRNDE2IDc4MyA0MzEgNzk4VDQ2NyA4MTNRNDg3IDgxMyA1MDIgNzk4VDUxNyA3NjJaTTMzMCA3NjJRMzMwIDc0MiAzMTUgNzI3VDI3OSA3MTJRMjU5IDcxMiAyNDQgNzI3VDIyOSA3NjJRMjI5IDc4MyAyNDQgNzk4VDI3OSA4MTNRMzAwIDgxMyAzMTUgNzk4VDMzMCA3NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENzsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik00OTIgNDEwTDM0MSAyNTlMNDk2IDEwM0w0NDMgNTBMMjg4IDIwNkwxMzEgNTBMNzggMTAzTDIzNSAyNTlMODQgNDEwTDEzNyA0NjNMMjg4IDMxMkw0NDAgNDYzTDQ5MiA0MTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEODsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik02ODEgMzM0UTY4MSAyNTkgNjYzIDE5NlQ2MDcgODdUNTExIDE1VDM3MyAtMTFRMzE0IC0xMSAyNjggM1QxODUgNDNMMTMyIC0yNEw3OCAyNUwxMzMgOTRROTggMTQwIDgyIDIwMVQ2NSAzMzRRNjUgNDA2IDgzIDQ2OFQxMzggNTc3VDIzNCA2NTFUMzczIDY3OFE0MzAgNjc4IDQ3NSA2NjVUNTU2IDYyNkw2MDcgNjkwTDY2MyA2NDVMNjA5IDU3N1E2NDYgNTMwIDY2MyA0NjlUNjgxIDMzNFpNNTg2IDMzM1E1ODYgMzgxIDU3OSA0MjVUNTUyIDUwNUwyMzcgMTA3UTI2MSA4NyAyOTQgNzVUMzczIDYzUTQzNiA2MyA0NzcgODVUNTQzIDE0NVQ1NzYgMjMyVDU4NiAzMzNaTTE2MCAzMzNRMTYwIDI4OCAxNjcgMjQ1VDE5MSAxNjdMNTA2IDU2M1E0ODIgNTgzIDQ1MCA1OTNUMzczIDYwNFEzMTAgNjA0IDI2OSA1ODJUMjA0IDUyMlQxNzAgNDM1VDE2MCAzMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik01ODMgMjU5UTU4MyAxMjAgNTI1IDU1VDMzNCAtMTFRMjAyIC0xMSAxNDQgNTVUODYgMjU5VjY2N0gxNzdWMjU5UTE3NyAyMTYgMTg0IDE4MVQyMDggMTIwVDI1NiA4MFQzMzQgNjVRMzgxIDY1IDQxMSA3OVQ0NjAgMTE5VDQ4NSAxODBUNDkyIDI1OVY2NjdINTgzVjI1OUg1ODNaTTM0MyA3MDVMMTY5IDgxNEwyNTcgODU0TDM5MiA3MzVMMzQzIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERBOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTU4MyAyNTlRNTgzIDEyMCA1MjUgNTVUMzM0IC0xMVEyMDIgLTExIDE0NCA1NVQ4NiAyNTlWNjY3SDE3N1YyNTlRMTc3IDIxNiAxODQgMTgxVDIwOCAxMjBUMjU2IDgwVDMzNCA2NVEzODEgNjUgNDExIDc5VDQ2MCAxMTlUNDg1IDE4MFQ0OTIgMjU5VjY2N0g1ODNWMjU5SDU4M1pNMzI5IDcwNUwyODAgNzM2TDQxNyA4NTdMNTAzIDgxNUwzMjkgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REI7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNTgzIDI1OVE1ODMgMTIwIDUyNSA1NVQzMzQgLTExUTIwMiAtMTEgMTQ0IDU1VDg2IDI1OVY2NjdIMTc3VjI1OVExNzcgMjE2IDE4NCAxODFUMjA4IDEyMFQyNTYgODBUMzM0IDY1UTM4MSA2NSA0MTEgNzlUNDYwIDExOVQ0ODUgMTgwVDQ5MiAyNTlWNjY3SDU4M1YyNTlINTgzWk00NTUgNzAzTDMzNyA3ODJMMjE4IDcwM0wxODEgNzUzTDMzNiA4NTFMNDkzIDc1M0w0NTUgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REM7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNTgzIDI1OVE1ODMgMTIwIDUyNSA1NVQzMzQgLTExUTIwMiAtMTEgMTQ0IDU1VDg2IDI1OVY2NjdIMTc3VjI1OVExNzcgMjE2IDE4NCAxODFUMjA4IDEyMFQyNTYgODBUMzM0IDY1UTM4MSA2NSA0MTEgNzlUNDYwIDExOVQ0ODUgMTgwVDQ5MiAyNTlWNjY3SDU4M1YyNTlINTgzWk00ODAgNzYyUTQ4MCA3NDIgNDY1IDcyN1Q0MzAgNzEyUTQwOSA3MTIgMzk0IDcyN1QzNzkgNzYyUTM3OSA3ODMgMzk0IDc5OFQ0MzAgODEzUTQ1MCA4MTMgNDY1IDc5OFQ0ODAgNzYyWk0yOTMgNzYyUTI5MyA3NDIgMjc4IDcyN1QyNDIgNzEyUTIyMiA3MTIgMjA3IDcyN1QxOTIgNzYyUTE5MiA3ODMgMjA3IDc5OFQyNDIgODEzUTI2MyA4MTMgMjc4IDc5OFQyOTMgNzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REQ7IiBob3Jpei1hZHYteD0iNTcyIiBkPSJNMzMyIDI2NVYwSDI0MVYyNjJMMTMgNjY3SDExNkwyODcgMzQ1TDQ1OSA2NjdINTU5TDMzMiAyNjVaTTI4OSA2OTdMMjQwIDcyOEwzNzcgODQ5TDQ2MyA4MDdMMjg5IDY5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTU0OSAzNDBRNTQ5IDIzOCA0OTYgMTg0VDMyOCAxMjlIMTc2VjBIODZWNjY3SDE3NVY1NDVRMjA4IDU0NyAyMzYgNTQ4VDI5NSA1NTBRMzUwIDU1MCAzOTYgNTQwVDQ3NyA1MDZUNTMwIDQ0MlQ1NDkgMzQwWk00NTggMzM5UTQ1OCAzNzkgNDQ4IDQwNVQ0MTggNDQ2VDM2NyA0NjhUMjk0IDQ3NVEyNjQgNDc1IDIzNiA0NzRUMTc2IDQ2OVYyMDJIMzA5UTM0NSAyMDMgMzcyIDIwOFQ0MTkgMjI5VDQ0OCAyNzBUNDU4IDMzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERGOyIgaG9yaXotYWR2LXg9IjUzMiIgZD0iTTQ5MCAxNzJRNDkwIDEzMCA0NzcgOTZUNDQxIDM4VDM4NSAxVDMxNSAtMTJRMjg2IC0xMiAyNjEgLThUMjIzIDJMMjM3IDY2UTI0OSA2MSAyNjQgNThUMjk2IDU1UTMxNiA1NSAzMzUgNjFUMzY4IDgwVDM5MiAxMTZUNDAxIDE3MVE0MDEgMjI4IDM2NiAyNjhUMjQzIDMzOUwyMzIgMzk2UTI5NiA0MzkgMzIxIDQ3NlQzNDYgNTUyUTM0NiA1NjkgMzQyIDU4NVQzMjggNjEzVDMwMCA2MzNUMjU0IDY0MVEyMTEgNjQxIDE4NyA2MTlUMTYzIDUzN1YwSDc2VjU0MVE3NiA1NzkgODUgNjA5VDExNSA2NjFUMTcwIDY5M1QyNTUgNzA1UTMzNyA3MDUgMzgwIDY2N1Q0MjQgNTU4UTQyNCA1MTAgNDAyIDQ3MVQzMjIgMzkxVjM4N1EzNTYgMzcyIDM4NyAzNTNUNDQwIDMwOFQ0NzYgMjQ5VDQ5MCAxNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMDsiIGhvcml6LWFkdi14PSI1MjkiIGQ9Ik00MzAgLThRNDA3IDAgMzkzIDEzVDM3MyA1NEgzNjlRMzMyIDI0IDI5MiA3VDIwMyAtMTFRMTY5IC0xMSAxNDAgLTFUOTAgMjhUNTcgNzZUNDUgMTQwUTQ1IDIwMyA3NyAyMzlUMTU2IDI5NFQyNTkgMzE3VDM2MiAzMjJWMzcxUTM2MCA0MTMgMzM3IDQzMFQyNjkgNDQ4UTIxNyA0NDggMTcxIDQzMVQ5MCAzOTFMNTkgNDUyUTExMSA0ODEgMTYzIDQ5N1QyNzcgNTE0UTM2NyA1MTQgNDA4IDQ3NVQ0NDkgMzQ0VjEwNFE0NTAgNjQgNDgyIDUwTDQzMCAtOFpNMzY0IDI2OVEzMzIgMjY5IDI5MiAyNjdUMjE2IDI1MlQxNTYgMjE1VDEzMSAxNDVRMTMxIDk5IDE1NyA3NFQyMjUgNDlRMjY3IDQ5IDI5OSA2NVQzNjQgMTA2VjI2OVpNMjkyIDU2NUwxMTggNjc0TDIwNiA3MTRMMzQxIDU5NUwyOTIgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBob3Jpei1hZHYteD0iNTI5IiBkPSJNNDMwIC04UTQwNyAwIDM5MyAxM1QzNzMgNTRIMzY5UTMzMiAyNCAyOTIgN1QyMDMgLTExUTE2OSAtMTEgMTQwIC0xVDkwIDI4VDU3IDc2VDQ1IDE0MFE0NSAyMDMgNzcgMjM5VDE1NiAyOTRUMjU5IDMxN1QzNjIgMzIyVjM3MVEzNjAgNDEzIDMzNyA0MzBUMjY5IDQ0OFEyMTcgNDQ4IDE3MSA0MzFUOTAgMzkxTDU5IDQ1MlExMTEgNDgxIDE2MyA0OTdUMjc3IDUxNFEzNjcgNTE0IDQwOCA0NzVUNDQ5IDM0NFYxMDRRNDUwIDY0IDQ4MiA1MEw0MzAgLThaTTM2NCAyNjlRMzMyIDI2OSAyOTIgMjY3VDIxNiAyNTJUMTU2IDIxNVQxMzEgMTQ1UTEzMSA5OSAxNTcgNzRUMjI1IDQ5UTI2NyA0OSAyOTkgNjVUMzY0IDEwNlYyNjlaTTI0MCA1NjVMMTkxIDU5NkwzMjggNzE3TDQxNCA2NzVMMjQwIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgaG9yaXotYWR2LXg9IjUyOSIgZD0iTTQzMCAtOFE0MDcgMCAzOTMgMTNUMzczIDU0SDM2OVEzMzIgMjQgMjkyIDdUMjAzIC0xMVExNjkgLTExIDE0MCAtMVQ5MCAyOFQ1NyA3NlQ0NSAxNDBRNDUgMjAzIDc3IDIzOVQxNTYgMjk0VDI1OSAzMTdUMzYyIDMyMlYzNzFRMzYwIDQxMyAzMzcgNDMwVDI2OSA0NDhRMjE3IDQ0OCAxNzEgNDMxVDkwIDM5MUw1OSA0NTJRMTExIDQ4MSAxNjMgNDk3VDI3NyA1MTRRMzY3IDUxNCA0MDggNDc1VDQ0OSAzNDRWMTA0UTQ1MCA2NCA0ODIgNTBMNDMwIC04Wk0zNjQgMjY5UTMzMiAyNjkgMjkyIDI2N1QyMTYgMjUyVDE1NiAyMTVUMTMxIDE0NVExMzEgOTkgMTU3IDc0VDIyNSA0OVEyNjcgNDkgMjk5IDY1VDM2NCAxMDZWMjY5Wk0zODAgNTYyTDI2MiA2NDFMMTQzIDU2MkwxMDYgNjEyTDI2MSA3MTBMNDE4IDYxMkwzODAgNTYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTM7IiBob3Jpei1hZHYteD0iNTI5IiBkPSJNNDMwIC04UTQwNyAwIDM5MyAxM1QzNzMgNTRIMzY5UTMzMiAyNCAyOTIgN1QyMDMgLTExUTE2OSAtMTEgMTQwIC0xVDkwIDI4VDU3IDc2VDQ1IDE0MFE0NSAyMDMgNzcgMjM5VDE1NiAyOTRUMjU5IDMxN1QzNjIgMzIyVjM3MVEzNjAgNDEzIDMzNyA0MzBUMjY5IDQ0OFEyMTcgNDQ4IDE3MSA0MzFUOTAgMzkxTDU5IDQ1MlExMTEgNDgxIDE2MyA0OTdUMjc3IDUxNFEzNjcgNTE0IDQwOCA0NzVUNDQ5IDM0NFYxMDRRNDUwIDY0IDQ4MiA1MEw0MzAgLThaTTM2NCAyNjlRMzMyIDI2OSAyOTIgMjY3VDIxNiAyNTJUMTU2IDIxNVQxMzEgMTQ1UTEzMSA5OSAxNTcgNzRUMjI1IDQ5UTI2NyA0OSAyOTkgNjVUMzY0IDEwNlYyNjlaTTQyMCA2NDFRNDA5IDYwNSAzODMgNTg4VDMyOCA1NzBRMzEwIDU3MCAyOTIgNTc2VDI1NiA1ODlUMjIyIDYwM1QxOTEgNjEwUTE3NCA2MTAgMTYwIDYwMlQxMzUgNTY5TDkxIDYwM1ExMDkgNjQ0IDEzMiA2NTlUMTg0IDY3NFEyMDIgNjc0IDIyMCA2NjhUMjU3IDY1NFQyOTEgNjQwVDMyMiA2MzRRMzM5IDYzNCAzNTMgNjQyVDM3NSA2NzRMNDIwIDY0MUg0MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNDsiIGhvcml6LWFkdi14PSI1MjkiIGQ9Ik00MzAgLThRNDA3IDAgMzkzIDEzVDM3MyA1NEgzNjlRMzMyIDI0IDI5MiA3VDIwMyAtMTFRMTY5IC0xMSAxNDAgLTFUOTAgMjhUNTcgNzZUNDUgMTQwUTQ1IDIwMyA3NyAyMzlUMTU2IDI5NFQyNTkgMzE3VDM2MiAzMjJWMzcxUTM2MCA0MTMgMzM3IDQzMFQyNjkgNDQ4UTIxNyA0NDggMTcxIDQzMVQ5MCAzOTFMNTkgNDUyUTExMSA0ODEgMTYzIDQ5N1QyNzcgNTE0UTM2NyA1MTQgNDA4IDQ3NVQ0NDkgMzQ0VjEwNFE0NTAgNjQgNDgyIDUwTDQzMCAtOFpNMzY0IDI2OVEzMzIgMjY5IDI5MiAyNjdUMjE2IDI1MlQxNTYgMjE1VDEzMSAxNDVRMTMxIDk5IDE1NyA3NFQyMjUgNDlRMjY3IDQ5IDI5OSA2NVQzNjQgMTA2VjI2OVpNNDA5IDYyMlE0MDkgNjAyIDM5NCA1ODdUMzU5IDU3MlEzMzggNTcyIDMyMyA1ODdUMzA4IDYyMlEzMDggNjQzIDMyMyA2NThUMzU5IDY3M1EzNzkgNjczIDM5NCA2NThUNDA5IDYyMlpNMjIyIDYyMlEyMjIgNjAyIDIwNyA1ODdUMTcxIDU3MlExNTEgNTcyIDEzNiA1ODdUMTIxIDYyMlExMjEgNjQzIDEzNiA2NThUMTcxIDY3M1ExOTIgNjczIDIwNyA2NThUMjIyIDYyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU1OyIgaG9yaXotYWR2LXg9IjUyOSIgZD0iTTQzMCAtOFE0MDcgMCAzOTMgMTNUMzczIDU0SDM2OVEzMzIgMjQgMjkyIDdUMjAzIC0xMVExNjkgLTExIDE0MCAtMVQ5MCAyOFQ1NyA3NlQ0NSAxNDBRNDUgMjAzIDc3IDIzOVQxNTYgMjk0VDI1OSAzMTdUMzYyIDMyMlYzNzFRMzYwIDQxMyAzMzcgNDMwVDI2OSA0NDhRMjE3IDQ0OCAxNzEgNDMxVDkwIDM5MUw1OSA0NTJRMTExIDQ4MSAxNjMgNDk3VDI3NyA1MTRRMzY3IDUxNCA0MDggNDc1VDQ0OSAzNDRWMTA0UTQ1MCA2NCA0ODIgNTBMNDMwIC04Wk0zNjQgMjY5UTMzMiAyNjkgMjkyIDI2N1QyMTYgMjUyVDE1NiAyMTVUMTMxIDE0NVExMzEgOTkgMTU3IDc0VDIyNSA0OVEyNjcgNDkgMjk5IDY1VDM2NCAxMDZWMjY5Wk0zNjMgNjUxUTM2MyA2MTEgMzM2IDU4NVQyNjggNTU4UTIyOCA1NTggMjAwIDU4NFQxNzIgNjUxUTE3MiA2OTEgMTk5IDcxN1QyNjggNzQ0UTMwOCA3NDQgMzM1IDcxOFQzNjMgNjUxWk0zMjEgNjUxUTMyMSA2NzQgMzA2IDY4OVQyNjggNzA1UTI0NSA3MDUgMjMwIDY5MFQyMTQgNjUxUTIxNCA2MjggMjI5IDYxM1QyNjggNTk3UTI5MSA1OTcgMzA2IDYxMlQzMjEgNjUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTY7IiBob3Jpei1hZHYteD0iODU4IiBkPSJNODA4IDI1NVE4MDggMjUwIDgwOCAyNDJUODA2IDIyMkg0NTNRNDU1IDE0NCA0OTMgMTAxVDYwNCA1OFE2NDEgNTggNjc5IDcwVDc1MSAxMDlMNzgzIDQ4UTcwMCAtMTEgNjAzIC0xMVE1MzcgLTExIDQ4OSAxMlQ0MTIgNzdRMzcxIDQwIDMyMCAxNVQyMDIgLTExUTEzMyAtMTEgODkgMjhUNDUgMTQwUTQ1IDE5MiA2OCAyMjdUMTMyIDI4M1QyMzIgMzEzVDM2MiAzMjJWMzQ3UTM2MiAzNzIgMzU5IDM5MFQzNDUgNDIxVDMxOCA0NDBUMjcyIDQ0NlEyMjcgNDQ2IDE3OSA0MzFUOTAgMzg4TDU5IDQ1MlExMTMgNDgxIDE2NCA0OTdUMjc2IDUxNFEzMjggNTE0IDM2OSA0OTdUNDI1IDQzMFE0NTQgNDcyIDQ5NyA0OTNUNTkzIDUxNVE2NDIgNTE1IDY4MiA0OThUNzUwIDQ0OFQ3OTMgMzY3VDgwOCAyNTVaTTcyNyAyODNRNzI2IDMxNyA3MTkgMzQ3VDY5NiAzOTlUNjU1IDQzNVQ1OTIgNDQ4UTUzMiA0NDggNDkyIDQwNlQ0NTIgMjgzSDcyN1pNMzg0IDEyNVEzNzEgMTUxIDM2NyAxODJUMzYzIDI0NVYyNjdRMjQ1IDI2NyAxODggMjM4VDEzMSAxNDRRMTMxIDEyMyAxMzggMTA2VDE1OSA3NlQxODkgNTZUMjI1IDQ4UTI2MyA0OCAzMDQgNjlUMzg0IDEyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU3OyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTM3NiAtMTI3UTM3NiAtMTY1IDM1MCAtMTg3VDI3NyAtMjA5UTI1NCAtMjA5IDIzMiAtMjAzVDE5NCAtMTg2TDIwOCAtMTUxUTIyNSAtMTYwIDI0MCAtMTY1VDI3NCAtMTcwUTI5NCAtMTcwIDMwOSAtMTYxVDMyNSAtMTI5UTMyNSAtMTA3IDMxMSAtOThUMjc2IC04OVEyNTUgLTg5IDIzOCAtOTZMMjIwIC04MEwyNTYgLTlRMjA1IC01IDE2NyAxNlQxMDQgNzFUNjYgMTUwVDUzIDI0OFE1MyAzMDYgNjggMzU1VDExMyA0MzlUMTg3IDQ5NFQyOTEgNTE0UTMzOSA1MTQgMzgzIDQ5N1Q0NjUgNDUxTDQyNyAzOTBRNDAwIDQxNyAzNjggNDMxVDI5NCA0NDVRMjUwIDQ0NSAyMjEgNDI5VDE3NSAzODVUMTUwIDMyNFQxNDIgMjUyUTE0MiAyMTQgMTQ5IDE3OVQxNzQgMTE3VDIyMSA3NFQyOTQgNThRMzM1IDU4IDM2NyA3MFQ0MzMgMTEyTDQ2MyA1MVE0MjcgMjMgMzg5IDdUMzAyIC0xMUwyNzcgLTU3TDI3OCAtNThRMjgzIC01NiAyOTAgLTU2VDMwMiAtNTVRMzM2IC01NSAzNTYgLTczVDM3NiAtMTI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTg7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNDkzIDI2MlE0OTMgMjU3IDQ5MyAyNDRUNDkyIDIyM0gxNDBRMTQwIDE0NSAxNzggMTAxVDI5MSA1NlEzMjkgNTYgMzY0IDY3VDQ0MCAxMDhMNDcxIDQ4UTQyNiAxNiAzODEgM1QyODggLTExUTIzMCAtMTEgMTg2IDdUMTEzIDYwVDY4IDE0MlQ1MyAyNTFRNTMgMzE0IDY5IDM2M1QxMTYgNDQ2VDE4OCA0OTdUMjgzIDUxNVEzMzMgNTE1IDM3MiA0OTdUNDM4IDQ0NVQ0NzkgMzY1VDQ5MyAyNjJaTTQxMiAyODJRNDEyIDMxNSA0MDUgMzQ1VDM4MyAzOTlUMzQzIDQzN1QyODQgNDUxUTI0MyA0NTEgMjE1IDQzNlQxNzEgMzk3VDE0NyAzNDNUMTQwIDI4Mkg0MTJaTTMwNCA1NjVMMTMwIDY3NEwyMTggNzE0TDM1MyA1OTVMMzA0IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU5OyIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTQ5MyAyNjJRNDkzIDI1NyA0OTMgMjQ0VDQ5MiAyMjNIMTQwUTE0MCAxNDUgMTc4IDEwMVQyOTEgNTZRMzI5IDU2IDM2NCA2N1Q0NDAgMTA4TDQ3MSA0OFE0MjYgMTYgMzgxIDNUMjg4IC0xMVEyMzAgLTExIDE4NiA3VDExMyA2MFQ2OCAxNDJUNTMgMjUxUTUzIDMxNCA2OSAzNjNUMTE2IDQ0NlQxODggNDk3VDI4MyA1MTVRMzMzIDUxNSAzNzIgNDk3VDQzOCA0NDVUNDc5IDM2NVQ0OTMgMjYyWk00MTIgMjgyUTQxMiAzMTUgNDA1IDM0NVQzODMgMzk5VDM0MyA0MzdUMjg0IDQ1MVEyNDMgNDUxIDIxNSA0MzZUMTcxIDM5N1QxNDcgMzQzVDE0MCAyODJINDEyWk0yNjkgNTY1TDIyMCA1OTZMMzU3IDcxN0w0NDMgNjc1TDI2OSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQTsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik00OTMgMjYyUTQ5MyAyNTcgNDkzIDI0NFQ0OTIgMjIzSDE0MFExNDAgMTQ1IDE3OCAxMDFUMjkxIDU2UTMyOSA1NiAzNjQgNjdUNDQwIDEwOEw0NzEgNDhRNDI2IDE2IDM4MSAzVDI4OCAtMTFRMjMwIC0xMSAxODYgN1QxMTMgNjBUNjggMTQyVDUzIDI1MVE1MyAzMTQgNjkgMzYzVDExNiA0NDZUMTg4IDQ5N1QyODMgNTE1UTMzMyA1MTUgMzcyIDQ5N1Q0MzggNDQ1VDQ3OSAzNjVUNDkzIDI2MlpNNDEyIDI4MlE0MTIgMzE1IDQwNSAzNDVUMzgzIDM5OVQzNDMgNDM3VDI4NCA0NTFRMjQzIDQ1MSAyMTUgNDM2VDE3MSAzOTdUMTQ3IDM0M1QxNDAgMjgySDQxMlpNNDAwIDU2M0wyODIgNjQyTDE2MyA1NjNMMTI2IDYxM0wyODEgNzExTDQzOCA2MTNMNDAwIDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVCOyIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTQ5MyAyNjJRNDkzIDI1NyA0OTMgMjQ0VDQ5MiAyMjNIMTQwUTE0MCAxNDUgMTc4IDEwMVQyOTEgNTZRMzI5IDU2IDM2NCA2N1Q0NDAgMTA4TDQ3MSA0OFE0MjYgMTYgMzgxIDNUMjg4IC0xMVEyMzAgLTExIDE4NiA3VDExMyA2MFQ2OCAxNDJUNTMgMjUxUTUzIDMxNCA2OSAzNjNUMTE2IDQ0NlQxODggNDk3VDI4MyA1MTVRMzMzIDUxNSAzNzIgNDk3VDQzOCA0NDVUNDc5IDM2NVQ0OTMgMjYyWk00MTIgMjgyUTQxMiAzMTUgNDA1IDM0NVQzODMgMzk5VDM0MyA0MzdUMjg0IDQ1MVEyNDMgNDUxIDIxNSA0MzZUMTcxIDM5N1QxNDcgMzQzVDE0MCAyODJINDEyWk00MjcgNjIyUTQyNyA2MDIgNDEyIDU4N1QzNzcgNTcyUTM1NiA1NzIgMzQxIDU4N1QzMjYgNjIyUTMyNiA2NDMgMzQxIDY1OFQzNzcgNjczUTM5NyA2NzMgNDEyIDY1OFQ0MjcgNjIyWk0yNDAgNjIyUTI0MCA2MDIgMjI1IDU4N1QxODkgNTcyUTE2OSA1NzIgMTU0IDU4N1QxMzkgNjIyUTEzOSA2NDMgMTU0IDY1OFQxODkgNjczUTIxMCA2NzMgMjI1IDY1OFQyNDAgNjIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUM7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMFY1MDJIMTYzVjBINzZaTTE0MiA1NjVMLTMyIDY3NEw1NiA3MTRMMTkxIDU5NUwxNDIgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUQ7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMFY1MDJIMTYzVjBINzZaTTEwNCA1NjVMNTUgNTk2TDE5MiA3MTdMMjc4IDY3NUwxMDQgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUU7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMFY1MDJIMTYzVjBINzZaTTI0MSA1NjNMMTIzIDY0Mkw0IDU2M0wtMzMgNjEzTDEyMiA3MTFMMjc5IDYxM0wyNDEgNTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUY7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMFY1MDJIMTYzVjBINzZaTTI2NiA2MjJRMjY2IDYwMiAyNTEgNTg3VDIxNiA1NzJRMTk1IDU3MiAxODAgNTg3VDE2NSA2MjJRMTY1IDY0MyAxODAgNjU4VDIxNiA2NzNRMjM2IDY3MyAyNTEgNjU4VDI2NiA2MjJaTTc5IDYyMlE3OSA2MDIgNjQgNTg3VDI4IDU3MlE4IDU3MiAtNyA1ODdULTIyIDYyMlEtMjIgNjQzIC03IDY1OFQyOCA2NzNRNDkgNjczIDY0IDY1OFQ3OSA2MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMDsiIGhvcml6LWFkdi14PSI1ODciIGQ9Ik00MjAgNjE2UTQ0MyA1ODEgNDYwIDUzOVQ0ODggNDUwVDUwNCAzNTVUNTEwIDI2MlE1MTAgMjAxIDQ5OCAxNTFUNDU4IDY1VDM4NyAxMFQyODMgLTEwUTIyOCAtMTAgMTg4IDlUMTIxIDYyVDgxIDE0MlQ2OCAyNDNRNjggMjk0IDc4IDMzOFQxMTEgNDE0VDE3NCA0NjZUMjcyIDQ4NVEzMjAgNDg1IDM1MyA0NzFUNDA5IDQyMkg0MTNRNDA2IDQ2NCAzODkgNTA2VDM1MCA1ODRMMjMwIDUyNEwyMDUgNTc1TDMxOSA2MzJRMjkyIDY2NiAyNTkgNjk1TDMzNSA3MTZRMzQ2IDcwNiAzNjIgNjkxVDM4NyA2NjRMNDY2IDcwOEw0OTEgNjU2TDQyMCA2MTZaTTQyMiAyMzNRNDIyIDI3MiA0MTggMzA2VDQwMSAzNjdUMzYwIDQwOFQyODggNDIzUTI0MyA0MjMgMjE3IDQwOFQxNzggMzY3VDE2MCAzMTBUMTU2IDI0M1ExNTYgMjAyIDE2MiAxNjhUMTg0IDExMFQyMjUgNzFUMjkwIDU3UTMzMSA1NyAzNTcgNzJUMzk3IDExM1Q0MTcgMTY5VDQyMiAyMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMTsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MDEgMFYyOTRRNDAxIDMyNyAzOTggMzU0VDM4MyA0MDBUMzUxIDQyOVQyOTIgNDQwUTIyOSA0NDAgMTk2IDQwOFQxNjMgMzE1VjBINzZWNTAySDE1MUwxNTggNDM5SDE2MlEyMTEgNTE0IDMxNCA1MTRRMzY2IDUxNCA0MDAgNTAxVDQ1MyA0NjFUNDgwIDM5OFQ0ODggMzE0VjBINDAxWk00NTAgNjQxUTQzOSA2MDUgNDEzIDU4OFQzNTggNTcwUTM0MCA1NzAgMzIyIDU3NlQyODYgNTg5VDI1MiA2MDNUMjIxIDYxMFEyMDQgNjEwIDE5MCA2MDJUMTY1IDU2OUwxMjEgNjAzUTEzOSA2NDQgMTYyIDY1OVQyMTQgNjc0UTIzMiA2NzQgMjUwIDY2OFQyODcgNjU0VDMyMSA2NDBUMzUyIDYzNFEzNjkgNjM0IDM4MyA2NDJUNDA1IDY3NEw0NTAgNjQxSDQ1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYyOyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTUzIDI1MFE1MyAzMDUgNjYgMzUzVDEwNyA0MzdUMTc5IDQ5M1QyODYgNTE0UTM0NiA1MTQgMzkwIDQ5NVQ0NjMgNDQwVDUwNyAzNTdUNTIxIDI1MFE1MjEgMTk1IDUwNyAxNDhUNDY1IDY1VDM5MiA5VDI4NiAtMTFRMjI1IC0xMSAxODEgOVQxMDkgNjRUNjcgMTQ2VDUzIDI1MFpNMTQyIDI1MVExNDIgMjExIDE0OSAxNzZUMTcyIDExNFQyMTcgNzJUMjg3IDU2UTMyOSA1NiAzNTcgNzFUNDAxIDExM1Q0MjUgMTc1VDQzMiAyNTFRNDMyIDI5MSA0MjUgMzI2VDQwMiAzODhUMzU3IDQyOVQyODcgNDQ1UTI0NSA0NDUgMjE3IDQzMFQxNzMgMzg4VDE0OSAzMjdUMTQyIDI1MVpNMzEyIDU2NUwxMzggNjc0TDIyNiA3MTRMMzYxIDU5NUwzMTIgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjM7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNNTMgMjUwUTUzIDMwNSA2NiAzNTNUMTA3IDQzN1QxNzkgNDkzVDI4NiA1MTRRMzQ2IDUxNCAzOTAgNDk1VDQ2MyA0NDBUNTA3IDM1N1Q1MjEgMjUwUTUyMSAxOTUgNTA3IDE0OFQ0NjUgNjVUMzkyIDlUMjg2IC0xMVEyMjUgLTExIDE4MSA5VDEwOSA2NFQ2NyAxNDZUNTMgMjUwWk0xNDIgMjUxUTE0MiAyMTEgMTQ5IDE3NlQxNzIgMTE0VDIxNyA3MlQyODcgNTZRMzI5IDU2IDM1NyA3MVQ0MDEgMTEzVDQyNSAxNzVUNDMyIDI1MVE0MzIgMjkxIDQyNSAzMjZUNDAyIDM4OFQzNTcgNDI5VDI4NyA0NDVRMjQ1IDQ0NSAyMTcgNDMwVDE3MyAzODhUMTQ5IDMyN1QxNDIgMjUxWk0yNzMgNTY1TDIyNCA1OTZMMzYxIDcxN0w0NDcgNjc1TDI3MyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNDsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik01MyAyNTBRNTMgMzA1IDY2IDM1M1QxMDcgNDM3VDE3OSA0OTNUMjg2IDUxNFEzNDYgNTE0IDM5MCA0OTVUNDYzIDQ0MFQ1MDcgMzU3VDUyMSAyNTBRNTIxIDE5NSA1MDcgMTQ4VDQ2NSA2NVQzOTIgOVQyODYgLTExUTIyNSAtMTEgMTgxIDlUMTA5IDY0VDY3IDE0NlQ1MyAyNTBaTTE0MiAyNTFRMTQyIDIxMSAxNDkgMTc2VDE3MiAxMTRUMjE3IDcyVDI4NyA1NlEzMjkgNTYgMzU3IDcxVDQwMSAxMTNUNDI1IDE3NVQ0MzIgMjUxUTQzMiAyOTEgNDI1IDMyNlQ0MDIgMzg4VDM1NyA0MjlUMjg3IDQ0NVEyNDUgNDQ1IDIxNyA0MzBUMTczIDM4OFQxNDkgMzI3VDE0MiAyNTFaTTQwNiA1NjNMMjg4IDY0MkwxNjkgNTYzTDEzMiA2MTNMMjg3IDcxMUw0NDQgNjEzTDQwNiA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNTsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik01MyAyNTBRNTMgMzA1IDY2IDM1M1QxMDcgNDM3VDE3OSA0OTNUMjg2IDUxNFEzNDYgNTE0IDM5MCA0OTVUNDYzIDQ0MFQ1MDcgMzU3VDUyMSAyNTBRNTIxIDE5NSA1MDcgMTQ4VDQ2NSA2NVQzOTIgOVQyODYgLTExUTIyNSAtMTEgMTgxIDlUMTA5IDY0VDY3IDE0NlQ1MyAyNTBaTTE0MiAyNTFRMTQyIDIxMSAxNDkgMTc2VDE3MiAxMTRUMjE3IDcyVDI4NyA1NlEzMjkgNTYgMzU3IDcxVDQwMSAxMTNUNDI1IDE3NVQ0MzIgMjUxUTQzMiAyOTEgNDI1IDMyNlQ0MDIgMzg4VDM1NyA0MjlUMjg3IDQ0NVEyNDUgNDQ1IDIxNyA0MzBUMTczIDM4OFQxNDkgMzI3VDE0MiAyNTFaTTQ1MyA2NDFRNDQyIDYwNSA0MTYgNTg4VDM2MSA1NzBRMzQzIDU3MCAzMjUgNTc2VDI4OSA1ODlUMjU1IDYwM1QyMjQgNjEwUTIwNyA2MTAgMTkzIDYwMlQxNjggNTY5TDEyNCA2MDNRMTQyIDY0NCAxNjUgNjU5VDIxNyA2NzRRMjM1IDY3NCAyNTMgNjY4VDI5MCA2NTRUMzI0IDY0MFQzNTUgNjM0UTM3MiA2MzQgMzg2IDY0MlQ0MDggNjc0TDQ1MyA2NDFINDUzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjY7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNNTMgMjUwUTUzIDMwNSA2NiAzNTNUMTA3IDQzN1QxNzkgNDkzVDI4NiA1MTRRMzQ2IDUxNCAzOTAgNDk1VDQ2MyA0NDBUNTA3IDM1N1Q1MjEgMjUwUTUyMSAxOTUgNTA3IDE0OFQ0NjUgNjVUMzkyIDlUMjg2IC0xMVEyMjUgLTExIDE4MSA5VDEwOSA2NFQ2NyAxNDZUNTMgMjUwWk0xNDIgMjUxUTE0MiAyMTEgMTQ5IDE3NlQxNzIgMTE0VDIxNyA3MlQyODcgNTZRMzI5IDU2IDM1NyA3MVQ0MDEgMTEzVDQyNSAxNzVUNDMyIDI1MVE0MzIgMjkxIDQyNSAzMjZUNDAyIDM4OFQzNTcgNDI5VDI4NyA0NDVRMjQ1IDQ0NSAyMTcgNDMwVDE3MyAzODhUMTQ5IDMyN1QxNDIgMjUxWk00MzMgNjIyUTQzMyA2MDIgNDE4IDU4N1QzODMgNTcyUTM2MiA1NzIgMzQ3IDU4N1QzMzIgNjIyUTMzMiA2NDMgMzQ3IDY1OFQzODMgNjczUTQwMyA2NzMgNDE4IDY1OFQ0MzMgNjIyWk0yNDYgNjIyUTI0NiA2MDIgMjMxIDU4N1QxOTUgNTcyUTE3NSA1NzIgMTYwIDU4N1QxNDUgNjIyUTE0NSA2NDMgMTYwIDY1OFQxOTUgNjczUTIxNiA2NzMgMjMxIDY1OFQyNDYgNjIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjc7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTEgMjI0VjMwMEg1MjNWMjI0SDUxWk0yMzQgOTdRMjM0IDEyMCAyNTAgMTM1VDI4OSAxNTFRMzEyIDE1MSAzMjcgMTM2VDM0MyA5N1EzNDMgNzQgMzI4IDU4VDI4OSA0MlEyNjYgNDIgMjUwIDU4VDIzNCA5N1pNMjM0IDQzMFEyMzQgNDUzIDI1MCA0NjhUMjg5IDQ4NFEzMTIgNDg0IDMyNyA0NjlUMzQzIDQzMFEzNDMgNDA3IDMyOCAzOTFUMjg5IDM3NVEyNjYgMzc1IDI1MCAzOTFUMjM0IDQzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY4OyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTUzIDI1MFE1MyAzMDUgNjYgMzUzVDEwNyA0MzdUMTc5IDQ5M1QyODYgNTE0UTM2OCA1MTQgNDI0IDQ3NUw0NzcgNTM4TDUyMiA0OTlMNDY3IDQzNFE0OTQgMzk5IDUwNyAzNTNUNTIxIDI1MFE1MjEgMTk1IDUwNyAxNDhUNDY1IDY1VDM5MiA5VDI4NiAtMTFRMjM2IC0xMSAxOTggMlQxMzIgMzlMODMgLTE4TDQxIDIyTDk0IDg1UTczIDExOCA2MyAxNjBUNTMgMjUwWk00MzIgMjUxUTQzMiAyODQgNDI4IDMxNFQ0MTIgMzY5TDE4MiA5OVExOTkgNzkgMjI0IDY4VDI4NyA1NlEzMjkgNTYgMzU3IDcxVDQwMSAxMTNUNDI1IDE3NVQ0MzIgMjUxWk0xNDIgMjUxUTE0MiAyMjUgMTQ0IDIwMVQxNTQgMTU1TDM3NSA0MThRMzQyIDQ0NSAyODcgNDQ1UTI0NSA0NDUgMjE3IDQzMFQxNzMgMzg4VDE0OSAzMjdUMTQyIDI1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY5OyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTQwNiAwTDM5OCA2M0gzOTVRMzc2IDMxIDM0MCAxMFQyNDQgLTExUTIwNCAtMTEgMTczIC0yVDEyMCAzMFQ4NyA5MlQ3NiAxOTJWNTAySDE2M1YyMzdRMTYzIDE5NSAxNjYgMTYzVDE3OSAxMDhUMjExIDc0VDI2OSA2MlEzMDQgNjIgMzI3IDcxVDM2NSA5OFQzODYgMTM5VDM5MiAxOTRWNTAySDQ3OVYwSDQwNlpNMjg0IDU2NUwxMTAgNjc0TDE5OCA3MTRMMzMzIDU5NUwyODQgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkE7IiBob3Jpei1hZHYteD0iNTU1IiBkPSJNNDA2IDBMMzk4IDYzSDM5NVEzNzYgMzEgMzQwIDEwVDI0NCAtMTFRMjA0IC0xMSAxNzMgLTJUMTIwIDMwVDg3IDkyVDc2IDE5MlY1MDJIMTYzVjIzN1ExNjMgMTk1IDE2NiAxNjNUMTc5IDEwOFQyMTEgNzRUMjY5IDYyUTMwNCA2MiAzMjcgNzFUMzY1IDk4VDM4NiAxMzlUMzkyIDE5NFY1MDJINDc5VjBINDA2Wk0yNjcgNTY1TDIxOCA1OTZMMzU1IDcxN0w0NDEgNjc1TDI2NyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMEwzOTggNjNIMzk1UTM3NiAzMSAzNDAgMTBUMjQ0IC0xMVEyMDQgLTExIDE3MyAtMlQxMjAgMzBUODcgOTJUNzYgMTkyVjUwMkgxNjNWMjM3UTE2MyAxOTUgMTY2IDE2M1QxNzkgMTA4VDIxMSA3NFQyNjkgNjJRMzA0IDYyIDMyNyA3MVQzNjUgOThUMzg2IDEzOVQzOTIgMTk0VjUwMkg0NzlWMEg0MDZaTTM5OSA1NjNMMjgxIDY0MkwxNjIgNTYzTDEyNSA2MTNMMjgwIDcxMUw0MzcgNjEzTDM5OSA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQzsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMEwzOTggNjNIMzk1UTM3NiAzMSAzNDAgMTBUMjQ0IC0xMVEyMDQgLTExIDE3MyAtMlQxMjAgMzBUODcgOTJUNzYgMTkyVjUwMkgxNjNWMjM3UTE2MyAxOTUgMTY2IDE2M1QxNzkgMTA4VDIxMSA3NFQyNjkgNjJRMzA0IDYyIDMyNyA3MVQzNjUgOThUMzg2IDEzOVQzOTIgMTk0VjUwMkg0NzlWMEg0MDZaTTQyNyA2MjJRNDI3IDYwMiA0MTIgNTg3VDM3NyA1NzJRMzU2IDU3MiAzNDEgNTg3VDMyNiA2MjJRMzI2IDY0MyAzNDEgNjU4VDM3NyA2NzNRMzk3IDY3MyA0MTIgNjU4VDQyNyA2MjJaTTI0MCA2MjJRMjQwIDYwMiAyMjUgNTg3VDE4OSA1NzJRMTY5IDU3MiAxNTQgNTg3VDEzOSA2MjJRMTM5IDY0MyAxNTQgNjU4VDE4OSA2NzNRMjEwIDY3MyAyMjUgNjU4VDI0MCA2MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRDsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik0yNjYgLTY1UTI0OCAtMTEzIDIzMyAtMTQ0VDE5OCAtMTkzVDE1NiAtMjE5VDk4IC0yMjZRNzcgLTIyNiA0NCAtMjIzVi0xNDlRNTIgLTE1MSA2MiAtMTUxVDg4IC0xNTJRMTA3IC0xNTIgMTIwIC0xNDhUMTQzIC0xMzJUMTYzIC0xMDBUMTgzIC00OEwyMDcgMThMMTggNTAySDExMkwyNTEgMTExSDI1NUwzODQgNTAySDQ3N0wyNjYgLTY1Wk0yNDggNTY1TDE5OSA1OTZMMzM2IDcxN0w0MjIgNjc1TDI0OCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRTsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik01MTEgMjUyUTUxMSAxOTcgNDk5IDE1MFQ0NjEgNjdUMzk2IDExVDMwMiAtMTBRMjUzIC0xMCAyMjAgOVQxNjQgNjJMMTYyIDYzVi0yMjBINzZWNzAwSDE1N1Y0NDNIMTU5UTE4OCA0ODMgMjI1IDQ5OFQzMDggNTE0UTM2NSA1MTQgNDA0IDQ5NFQ0NjYgNDM4VDUwMCAzNTRUNTExIDI1MlpNNDIyIDI1MlE0MjIgMjkyIDQxNyAzMjdUMzk4IDM4OVQzNTggNDMxVDI4OSA0NDZRMjI5IDQ0NiAxOTYgNDE2VDE2MyAzMjZWMjAyUTE2MyAxMzYgMTk0IDk3VDI4OCA1N1EzMjcgNTcgMzUzIDcyVDM5NCAxMTRUNDE2IDE3NlQ0MjIgMjUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkY7IiBob3Jpei1hZHYteD0iNDk1IiBkPSJNMjY2IC02NVEyNDggLTExMyAyMzMgLTE0NFQxOTggLTE5M1QxNTYgLTIxOVQ5OCAtMjI2UTc3IC0yMjYgNDQgLTIyM1YtMTQ5UTUyIC0xNTEgNjIgLTE1MVQ4OCAtMTUyUTEwNyAtMTUyIDEyMCAtMTQ4VDE0MyAtMTMyVDE2MyAtMTAwVDE4MyAtNDhMMjA3IDE4TDE4IDUwMkgxMTJMMjUxIDExMUgyNTVMMzg0IDUwMkg0NzdMMjY2IC02NVpNMzk5IDYyMlEzOTkgNjAyIDM4NCA1ODdUMzQ5IDU3MlEzMjggNTcyIDMxMyA1ODdUMjk4IDYyMlEyOTggNjQzIDMxMyA2NThUMzQ5IDY3M1EzNjkgNjczIDM4NCA2NThUMzk5IDYyMlpNMjEyIDYyMlEyMTIgNjAyIDE5NyA1ODdUMTYxIDU3MlExNDEgNTcyIDEyNiA1ODdUMTExIDYyMlExMTEgNjQzIDEyNiA2NThUMTYxIDY3M1ExODIgNjczIDE5NyA2NThUMjEyIDYyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMDsiIGhvcml6LWFkdi14PSI2NDIiIGQ9Ik01MjIgMEw0NjUgMTYxSDE3NEwxMTYgMEgyMkwyNjggNjcxSDM3MEw2MjAgMEg1MjJaTTMyMCA1ODJIMzE2TDE5NiAyMzZINDQwTDMyMCA1ODJaTTE2OCA3MjlWNzg2SDQ2NlY3MjlIMTY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAxOyIgaG9yaXotYWR2LXg9IjUyOSIgZD0iTTQzMCAtOFE0MDcgMCAzOTMgMTNUMzczIDU0SDM2OVEzMzIgMjQgMjkyIDdUMjAzIC0xMVExNjkgLTExIDE0MCAtMVQ5MCAyOFQ1NyA3NlQ0NSAxNDBRNDUgMjAzIDc3IDIzOVQxNTYgMjk0VDI1OSAzMTdUMzYyIDMyMlYzNzFRMzYwIDQxMyAzMzcgNDMwVDI2OSA0NDhRMjE3IDQ0OCAxNzEgNDMxVDkwIDM5MUw1OSA0NTJRMTExIDQ4MSAxNjMgNDk3VDI3NyA1MTRRMzY3IDUxNCA0MDggNDc1VDQ0OSAzNDRWMTA0UTQ1MCA2NCA0ODIgNTBMNDMwIC04Wk0zNjQgMjY5UTMzMiAyNjkgMjkyIDI2N1QyMTYgMjUyVDE1NiAyMTVUMTMxIDE0NVExMzEgOTkgMTU3IDc0VDIyNSA0OVEyNjcgNDkgMjk5IDY1VDM2NCAxMDZWMjY5Wk0xMTEgNTg5VjY0Nkg0MDlWNTg5SDExMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMjsiIGhvcml6LWFkdi14PSI2NDIiIGQ9Ik01MjIgMEw0NjUgMTYxSDE3NEwxMTYgMEgyMkwyNjggNjcxSDM3MEw2MjAgMEg1MjJaTTMyMCA1ODJIMzE2TDE5NiAyMzZINDQwTDMyMCA1ODJaTTQ2NSA4MjdRNDYyIDc5MiA0NDggNzY5VDQxMiA3MzFUMzY3IDcxMVQzMTggNzA1UTI5NCA3MDUgMjcwIDcxMVQyMjUgNzMxVDE5MSA3NjhUMTczIDgyN0gyMzNRMjM3IDc5NiAyNTcgNzc1VDMxOCA3NTRRMzU4IDc1NCAzODAgNzc1VDQwNCA4MjdINDY1SDQ2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMzsiIGhvcml6LWFkdi14PSI1MjkiIGQ9Ik00MzAgLThRNDA3IDAgMzkzIDEzVDM3MyA1NEgzNjlRMzMyIDI0IDI5MiA3VDIwMyAtMTFRMTY5IC0xMSAxNDAgLTFUOTAgMjhUNTcgNzZUNDUgMTQwUTQ1IDIwMyA3NyAyMzlUMTU2IDI5NFQyNTkgMzE3VDM2MiAzMjJWMzcxUTM2MCA0MTMgMzM3IDQzMFQyNjkgNDQ4UTIxNyA0NDggMTcxIDQzMVQ5MCAzOTFMNTkgNDUyUTExMSA0ODEgMTYzIDQ5N1QyNzcgNTE0UTM2NyA1MTQgNDA4IDQ3NVQ0NDkgMzQ0VjEwNFE0NTAgNjQgNDgyIDUwTDQzMCAtOFpNMzY0IDI2OVEzMzIgMjY5IDI5MiAyNjdUMjE2IDI1MlQxNTYgMjE1VDEzMSAxNDVRMTMxIDk5IDE1NyA3NFQyMjUgNDlRMjY3IDQ5IDI5OSA2NVQzNjQgMTA2VjI2OVpNNDA4IDY4N1E0MDUgNjUyIDM5MSA2MjlUMzU1IDU5MVQzMTAgNTcxVDI2MSA1NjVRMjM3IDU2NSAyMTMgNTcxVDE2OCA1OTFUMTM0IDYyOFQxMTYgNjg3SDE3NlExODAgNjU2IDIwMCA2MzVUMjYxIDYxNFEzMDEgNjE0IDMyMyA2MzVUMzQ3IDY4N0g0MDhINDA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA0OyIgaG9yaXotYWR2LXg9IjY0MiIgZD0iTTU3MSAwUTUxNCAtMzUgNDk3IC02NlQ0NzkgLTEyM1E0NzkgLTE1MyA0OTYgLTE2OFQ1NDAgLTE4M1E1NjAgLTE4MyA1NzMgLTE3N1Q1OTYgLTE2Nkw2MTQgLTIxN1E2MDIgLTIyMyA1NzcgLTIzMFQ1MjcgLTIzOFE0NjkgLTIzOCA0NDIgLTIxMVQ0MTUgLTEzNVE0MTUgLTkzIDQ0NCAtNTdUNTIxIDRMNDY1IDE2MUgxNzRMMTE2IDBIMjJMMjY4IDY3MUgzNzBMNjIwIDBINTcxWk0zMTkgNTgySDMxN0wxOTYgMjM2SDQ0MEwzMTkgNTgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA1OyIgaG9yaXotYWR2LXg9IjUyOSIgZD0iTTQyNyAtN1EzNzYgLTQyIDM2MCAtNjlUMzQ0IC0xMjFRMzQ0IC0xNDkgMzYxIC0xNjZUNDA1IC0xODNRNDI1IC0xODMgNDM5IC0xNzhUNDYyIC0xNjdMNDc5IC0yMTdRNDY4IC0yMjMgNDQzIC0yMzBUMzkyIC0yMzhRMzM1IC0yMzggMzA4IC0yMDhUMjgwIC0xMzNRMjgwIC04OSAzMTEgLTUyVDM5NCAxMFEzODQgMTggMzgwIDI5VDM3MyA1NEgzNzJRMzM1IDI0IDI5MyA3VDIwMyAtMTFRMTY5IC0xMSAxNDAgLTFUOTAgMjhUNTcgNzZUNDUgMTQwUTQ1IDIwMyA3NyAyMzlUMTU2IDI5NFQyNTkgMzE3VDM2MiAzMjJWMzcxUTM2MCA0MTMgMzM3IDQzMFQyNjkgNDQ4UTIxNyA0NDggMTcxIDQzMVQ5MCAzOTFMNTkgNDUyUTExMSA0ODEgMTYzIDQ5N1QyNzcgNTE0UTM2NyA1MTQgNDA4IDQ3NVQ0NDkgMzQ0VjEwNFE0NDkgODEgNDU5IDY3VDQ4NSA0M0w0MjcgLTdaTTM2NCAyNjlRMzMyIDI2OSAyOTIgMjY3VDIxNiAyNTJUMTU2IDIxNVQxMzEgMTQ1UTEzMSAxMDMgMTU3IDc2VDIyNSA0OVEyNjcgNDkgMjk5IDY1VDM2NCAxMDZWMjY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA2OyIgaG9yaXotYWR2LXg9IjYzMiIgZD0iTTYwMCA4M1E1NDUgMzMgNDg4IDExVDM2NSAtMTFRMjkwIC0xMSAyMzQgMTNUMTQwIDgyVDg0IDE5MVQ2NSAzMzVRNjUgNDA0IDgyIDQ2NlQxMzcgNTc1VDIzMSA2NTBUMzY4IDY3OFE0MzQgNjc4IDQ4OCA2NTZUNTk2IDU4Nkw1NDEgNTI2UTQ5OCA1NjYgNDU5IDU4M1QzNzEgNjAxUTI3NSA2MDEgMjE4IDUzNlQxNjAgMzM1UTE2MCAyODIgMTcwIDIzNFQyMDQgMTQ4VDI2OCA4OFQzNjggNjVRNDE2IDY1IDQ2MSA4NFQ1NTEgMTQ1TDYwMCA4M0g2MDBaTTM0NCA3MTBMMjk1IDc0MUw0MzIgODYyTDUxOCA4MjBMMzQ0IDcxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNzsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik00MjcgMzkwUTQwMCA0MTcgMzY4IDQzMVQyOTQgNDQ1UTI1MCA0NDUgMjIxIDQyOVQxNzUgMzg1VDE1MCAzMjRUMTQyIDI1MlExNDIgMjE0IDE0OSAxNzlUMTc0IDExN1QyMjEgNzRUMjk0IDU4UTMzNSA1OCAzNjcgNzBUNDMzIDExMkw0NjMgNTFRNDI1IDIyIDM4MyA2VDI4OSAtMTFRMjMwIC0xMSAxODYgOFQxMTMgNjFUNjggMTQzVDUzIDI0OFE1MyAzMDYgNjggMzU1VDExMyA0MzlUMTg3IDQ5NFQyOTEgNTE0UTMzOSA1MTQgMzgzIDQ5N1Q0NjUgNDUxTDQyNyAzOTBaTTI2NSA1NjVMMjE2IDU5NkwzNTMgNzE3TDQzOSA2NzVMMjY1IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGhvcml6LWFkdi14PSI2MzIiIGQ9Ik02MDAgODNRNTQ1IDMzIDQ4OCAxMVQzNjUgLTExUTI5MCAtMTEgMjM0IDEzVDE0MCA4MlQ4NCAxOTFUNjUgMzM1UTY1IDQwNCA4MiA0NjZUMTM3IDU3NVQyMzEgNjUwVDM2OCA2NzhRNDM0IDY3OCA0ODggNjU2VDU5NiA1ODZMNTQxIDUyNlE0OTggNTY2IDQ1OSA1ODNUMzcxIDYwMVEyNzUgNjAxIDIxOCA1MzZUMTYwIDMzNVExNjAgMjgyIDE3MCAyMzRUMjA0IDE0OFQyNjggODhUMzY4IDY1UTQxNiA2NSA0NjEgODRUNTUxIDE0NUw2MDAgODNINjAwWk00ODYgNzA1TDM2OCA3ODRMMjQ5IDcwNUwyMTIgNzU1TDM2NyA4NTNMNTI0IDc1NUw0ODYgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA5OyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTQyNyAzOTBRNDAwIDQxNyAzNjggNDMxVDI5NCA0NDVRMjUwIDQ0NSAyMjEgNDI5VDE3NSAzODVUMTUwIDMyNFQxNDIgMjUyUTE0MiAyMTQgMTQ5IDE3OVQxNzQgMTE3VDIyMSA3NFQyOTQgNThRMzM1IDU4IDM2NyA3MFQ0MzMgMTEyTDQ2MyA1MVE0MjUgMjIgMzgzIDZUMjg5IC0xMVEyMzAgLTExIDE4NiA4VDExMyA2MVQ2OCAxNDNUNTMgMjQ4UTUzIDMwNiA2OCAzNTVUMTEzIDQzOVQxODcgNDk0VDI5MSA1MTRRMzM5IDUxNCAzODMgNDk3VDQ2NSA0NTFMNDI3IDM5MFpNNDAyIDU2M0wyODQgNjQyTDE2NSA1NjNMMTI4IDYxM0wyODMgNzExTDQ0MCA2MTNMNDAyIDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQTsiIGhvcml6LWFkdi14PSI2MzIiIGQ9Ik02MDAgODNRNTQ1IDMzIDQ4OCAxMVQzNjUgLTExUTI5MCAtMTEgMjM0IDEzVDE0MCA4MlQ4NCAxOTFUNjUgMzM1UTY1IDQwNCA4MiA0NjZUMTM3IDU3NVQyMzEgNjUwVDM2OCA2NzhRNDM0IDY3OCA0ODggNjU2VDU5NiA1ODZMNTQxIDUyNlE0OTggNTY2IDQ1OSA1ODNUMzcxIDYwMVEyNzUgNjAxIDIxOCA1MzZUMTYwIDMzNVExNjAgMjgyIDE3MCAyMzRUMjA0IDE0OFQyNjggODhUMzY4IDY1UTQxNiA2NSA0NjEgODRUNTUxIDE0NUw2MDAgODNINjAwWk00MjQgNzcwUTQyNCA3NDggNDEwIDczNVQzNjkgNzIxUTM0NSA3MjEgMzMwIDczNFQzMTUgNzcwUTMxNSA3OTMgMzMwIDgwNlQzNjkgODIwUTM5NSA4MjAgNDA5IDgwN1Q0MjQgNzcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBCOyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTQyNyAzOTBRNDAwIDQxNyAzNjggNDMxVDI5NCA0NDVRMjUwIDQ0NSAyMjEgNDI5VDE3NSAzODVUMTUwIDMyNFQxNDIgMjUyUTE0MiAyMTQgMTQ5IDE3OVQxNzQgMTE3VDIyMSA3NFQyOTQgNThRMzM1IDU4IDM2NyA3MFQ0MzMgMTEyTDQ2MyA1MVE0MjUgMjIgMzgzIDZUMjg5IC0xMVEyMzAgLTExIDE4NiA4VDExMyA2MVQ2OCAxNDNUNTMgMjQ4UTUzIDMwNiA2OCAzNTVUMTEzIDQzOVQxODcgNDk0VDI5MSA1MTRRMzM5IDUxNCAzODMgNDk3VDQ2NSA0NTFMNDI3IDM5MFpNMzM5IDYyOVEzMzkgNjA3IDMyNSA1OTRUMjg0IDU4MFEyNjAgNTgwIDI0NSA1OTNUMjMwIDYyOVEyMzAgNjUyIDI0NSA2NjVUMjg0IDY3OVEzMTAgNjc5IDMyNCA2NjZUMzM5IDYyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGhvcml6LWFkdi14PSI2MzIiIGQ9Ik02MDAgODNRNTQ1IDMzIDQ4OCAxMVQzNjUgLTExUTI5MCAtMTEgMjM0IDEzVDE0MCA4MlQ4NCAxOTFUNjUgMzM1UTY1IDQwNCA4MiA0NjZUMTM3IDU3NVQyMzEgNjUwVDM2OCA2NzhRNDM0IDY3OCA0ODggNjU2VDU5NiA1ODZMNTQxIDUyNlE0OTggNTY2IDQ1OSA1ODNUMzcxIDYwMVEyNzUgNjAxIDIxOCA1MzZUMTYwIDMzNVExNjAgMjgyIDE3MCAyMzRUMjA0IDE0OFQyNjggODhUMzY4IDY1UTQxNiA2NSA0NjEgODRUNTUxIDE0NUw2MDAgODNINjAwWk01MTAgODExTDM2NiA3MTNMMjIyIDgxMUwyNTcgODU5TDM2NSA3ODNMNDc0IDg1OUw1MTAgODExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBEOyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTQyNyAzOTBRNDAwIDQxNyAzNjggNDMxVDI5NCA0NDVRMjUwIDQ0NSAyMjEgNDI5VDE3NSAzODVUMTUwIDMyNFQxNDIgMjUyUTE0MiAyMTQgMTQ5IDE3OVQxNzQgMTE3VDIyMSA3NFQyOTQgNThRMzM1IDU4IDM2NyA3MFQ0MzMgMTEyTDQ2MyA1MVE0MjUgMjIgMzgzIDZUMjg5IC0xMVEyMzAgLTExIDE4NiA4VDExMyA2MVQ2OCAxNDNUNTMgMjQ4UTUzIDMwNiA2OCAzNTVUMTEzIDQzOVQxODcgNDk0VDI5MSA1MTRRMzM5IDUxNCAzODMgNDk3VDQ2NSA0NTFMNDI3IDM5MFpNNDM0IDY2M0wyOTAgNTY1TDE0NiA2NjNMMTgxIDcxMUwyODkgNjM1TDM5OCA3MTFMNDM0IDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRTsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02MDQgMzM4UTYwNCAyNjcgNTg3IDIwNlQ1MzEgOTlUNDMzIDI3VDI4OSAwSDg2VjY2M1ExMjcgNjY4IDE3OSA2NzFUMjg4IDY3NVEzNjQgNjc1IDQyMyA2NTJUNTIyIDU4NlQ1ODMgNDgwVDYwNCAzMzhaTTUwOSAzMzlRNTA5IDM4NCA1MDAgNDMwVDQ2NyA1MTVUNDAwIDU3OFQyOTAgNjAyUTI2MiA2MDIgMjMzIDYwMFQxNzcgNTk2Vjc1UTIwMyA3NCAyMjkgNzRUMjczIDc0UTM5MSA3NCA0NTAgMTM2VDUwOSAzMzlaTTQzMSA4MDNMMjg3IDcwNUwxNDMgODAzTDE3OCA4NTFMMjg2IDc3NUwzOTUgODUxTDQzMSA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEY7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDE1IDBMNDEwIDc3SDQwNlEzODMgMzIgMzQ0IDExVDI1NCAtMTFRMTk3IC0xMSAxNTkgMTBUOTcgNjhUNjMgMTUxVDUzIDI1MlE1MyAzMDMgNjIgMzUwVDk1IDQzNFQxNTYgNDkyVDI1NCA1MTRRMjk5IDUxNCAzMzQgNTAwVDM5NyA0NDRINDAxVjcwMEg0ODhWMEg0MTVaTTQwMiAzMjZRNDAyIDM4NiAzNjcgNDE2VDI3NCA0NDZRMjI5IDQ0NiAyMDMgNDI5VDE2NCAzODVUMTQ2IDMyMlQxNDIgMjUxUTE0MiAyMTcgMTQ3IDE4MlQxNjYgMTE5VDIwNyA3MlQyNzYgNTRRMzA4IDU0IDMzMiA2NVQzNzEgOTZUMzk0IDE0M1Q0MDIgMjAwVjMyNlpNNTk3IDUzNUg1MzhMNTcxIDcwMEg2NjRMNTk3IDUzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMDsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02MDQgMzM4UTYwNCAyNjggNTg3IDIwN1Q1MzEgOTlUNDMyIDI3VDI4NCAwSDg3VjMxOEgyM1YzOTNIODdWNjYzUTEzMyA2NjggMTg4IDY3MVQyODggNjc1UTM2OCA2NzUgNDI3IDY1MVQ1MjYgNTgzVDU4NCA0NzZUNjA0IDMzOFpNNTEwIDMzOVE1MTAgMzg2IDUwMSA0MzNUNDY4IDUxN1Q0MDEgNTc3VDI5MyA2MDBRMjYzIDYwMCAyMzMgNTk5VDE3NyA1OTRWMzkzSDMzM1YzMThIMTc3Vjc1UTIwMCA3NCAyMjQgNzRUMjczIDc0UTQwMSA3NCA0NTUgMTQxVDUxMCAzMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTE7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDE1IDBMNDEwIDc3SDQwNlEzODMgMzIgMzQ0IDExVDI1NCAtMTFRMTk3IC0xMSAxNTkgMTBUOTcgNjZUNjMgMTQ5VDUzIDI0OVE1MyAzMDAgNjIgMzQ3VDk1IDQzMFQxNTYgNDg3VDI1NCA1MDhRMjk5IDUwOCAzMzYgNDk0VDQwMCA0MzdINDAxVjU3MEgyNDNWNjI4SDQwMVY3MDBINDg4VjYyOEg1NTVWNTcwSDQ4OFYwSDQxNVpNNDAyIDMxOVE0MDIgMzgwIDM2NyA0MTBUMjc0IDQ0MFEyMjkgNDQwIDIwMyA0MjRUMTY0IDM4MFQxNDYgMzE5VDE0MiAyNDhRMTQyIDIxMyAxNDcgMTc5VDE2NiAxMTdUMjA3IDcyVDI3NiA1NFEzMDggNTQgMzMyIDY1VDM3MSA5NlQzOTQgMTQzVDQwMiAyMDBWMzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBWNjY3SDQ4NFY1OTBIMTc3VjM5MUg0NTVWMzEzSDE3N1Y3Nkg0OTZWMEg4NlpNMTM4IDcyOVY3ODZINDM2VjcyOUgxMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTM7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNDkzIDI2MlE0OTMgMjU3IDQ5MyAyNDRUNDkyIDIyM0gxNDBRMTQwIDE0NSAxNzggMTAxVDI5MSA1NlEzMjkgNTYgMzY0IDY3VDQ0MCAxMDhMNDcxIDQ4UTQyNiAxNiAzODEgM1QyODggLTExUTIzMCAtMTEgMTg2IDdUMTEzIDYwVDY4IDE0MlQ1MyAyNTFRNTMgMzE0IDY5IDM2M1QxMTYgNDQ2VDE4OCA0OTdUMjgzIDUxNVEzMzMgNTE1IDM3MiA0OTdUNDM4IDQ0NVQ0NzkgMzY1VDQ5MyAyNjJaTTQxMiAyODJRNDEyIDMxNSA0MDUgMzQ1VDM4MyAzOTlUMzQzIDQzN1QyODQgNDUxUTI0MyA0NTEgMjE1IDQzNlQxNzEgMzk3VDE0NyAzNDNUMTQwIDI4Mkg0MTJaTTEzMyA1ODlWNjQ2SDQzMVY1ODlIMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE0OyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBWNjY3SDQ4NFY1OTBIMTc3VjM5MUg0NTVWMzEzSDE3N1Y3Nkg0OTZWMEg4NlpNNDMzIDgyN1E0MzAgNzkyIDQxNiA3NjlUMzgwIDczMVQzMzUgNzExVDI4NiA3MDVRMjYyIDcwNSAyMzggNzExVDE5MyA3MzFUMTU5IDc2OFQxNDEgODI3SDIwMVEyMDUgNzk2IDIyNSA3NzVUMjg2IDc1NFEzMjYgNzU0IDM0OCA3NzVUMzcyIDgyN0g0MzNINDMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE1OyIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTQ5MyAyNjJRNDkzIDI1NyA0OTMgMjQ0VDQ5MiAyMjNIMTQwUTE0MCAxNDUgMTc4IDEwMVQyOTEgNTZRMzI5IDU2IDM2NCA2N1Q0NDAgMTA4TDQ3MSA0OFE0MjYgMTYgMzgxIDNUMjg4IC0xMVEyMzAgLTExIDE4NiA3VDExMyA2MFQ2OCAxNDJUNTMgMjUxUTUzIDMxNCA2OSAzNjNUMTE2IDQ0NlQxODggNDk3VDI4MyA1MTVRMzMzIDUxNSAzNzIgNDk3VDQzOCA0NDVUNDc5IDM2NVQ0OTMgMjYyWk00MTIgMjgyUTQxMiAzMTUgNDA1IDM0NVQzODMgMzk5VDM0MyA0MzdUMjg0IDQ1MVEyNDMgNDUxIDIxNSA0MzZUMTcxIDM5N1QxNDcgMzQzVDE0MCAyODJINDEyWk00MjkgNjg3UTQyNiA2NTIgNDEyIDYyOVQzNzYgNTkxVDMzMSA1NzFUMjgyIDU2NVEyNTggNTY1IDIzNCA1NzFUMTg5IDU5MVQxNTUgNjI4VDEzNyA2ODdIMTk3UTIwMSA2NTYgMjIxIDYzNVQyODIgNjE0UTMyMiA2MTQgMzQ0IDYzNVQzNjggNjg3SDQyOUg0MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTY7IiBob3Jpei1hZHYteD0iNTM0IiBkPSJNODYgMFY2NjdINDg0VjU5MEgxNzdWMzkxSDQ1NVYzMTNIMTc3Vjc2SDQ5NlYwSDg2Wk0zNTggNzY4UTM1OCA3NDYgMzQ0IDczM1QzMDMgNzE5UTI3OSA3MTkgMjY0IDczMlQyNDkgNzY4UTI0OSA3OTEgMjY0IDgwNFQzMDMgODE4UTMyOSA4MTggMzQzIDgwNVQzNTggNzY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE3OyIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTQ5MyAyNjJRNDkzIDI1NyA0OTMgMjQ0VDQ5MiAyMjNIMTQwUTE0MCAxNDUgMTc4IDEwMVQyOTEgNTZRMzI5IDU2IDM2NCA2N1Q0NDAgMTA4TDQ3MSA0OFE0MjYgMTYgMzgxIDNUMjg4IC0xMVEyMzAgLTExIDE4NiA3VDExMyA2MFQ2OCAxNDJUNTMgMjUxUTUzIDMxNCA2OSAzNjNUMTE2IDQ0NlQxODggNDk3VDI4MyA1MTVRMzMzIDUxNSAzNzIgNDk3VDQzOCA0NDVUNDc5IDM2NVQ0OTMgMjYyWk00MTIgMjgyUTQxMiAzMTUgNDA1IDM0NVQzODMgMzk5VDM0MyA0MzdUMjg0IDQ1MVEyNDMgNDUxIDIxNSA0MzZUMTcxIDM5N1QxNDcgMzQzVDE0MCAyODJINDEyWk0zMzggNjI5UTMzOCA2MDcgMzI0IDU5NFQyODMgNTgwUTI1OSA1ODAgMjQ0IDU5M1QyMjkgNjI5UTIyOSA2NTIgMjQ0IDY2NVQyODMgNjc5UTMwOSA2NzkgMzIzIDY2NlQzMzggNjI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE4OyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTQ0MyAwUTM4NiAtMzYgMzY5IC02NVQzNTEgLTEyMVEzNTEgLTE0OSAzNjggLTE2NlQ0MTIgLTE4M1E0MzIgLTE4MyA0NDYgLTE3OFQ0NjkgLTE2N0w0ODYgLTIxN1E0NzUgLTIyMyA0NTAgLTIzMFQzOTkgLTIzOFEzNDIgLTIzOCAzMTUgLTIwOVQyODcgLTEzNFEyODcgLTkxIDMxMyAtNTdUMzg2IDBIODZWNjY3SDQ4NFY1OTBIMTc3VjM5MUg0NTVWMzEzSDE3N1Y3Nkg0OTZWMEg0NDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTk7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNDkzIDI2MlE0OTMgMjU3IDQ5MyAyNDRUNDkyIDIyM0gxNDBRMTQwIDE0NSAxNzggMTAxVDI5MSA1NlEzMjkgNTYgMzY0IDY3VDQ0MCAxMDhMNDcxIDQ4UTQ1NiAzNyA0NDIgMjlUNDEzIDEyUTM4MyAtNSAzNjUgLTIwVDMzNyAtNTBUMzI0IC03OFQzMjAgLTEwNVEzMjAgLTEzMyAzMzcgLTE1MVQzODEgLTE2OVE0MDEgLTE2OSA0MTQgLTE2NFQ0MzggLTE1Mkw0NTUgLTIwM1E0NDMgLTIwOSA0MTggLTIxNlQzNjggLTIyNFEzMTAgLTIyNCAyODMgLTE5NFQyNTYgLTExOVEyNTYgLTg4IDI3MyAtNjBUMzE5IC05TDMxOCAtOFEzMTEgLTkgMzAyIC0xMFQyODYgLTExUTE3MCAtMTEgMTEyIDYwVDUzIDI1MVE1MyAzMTQgNjkgMzYzVDExNiA0NDZUMTg4IDQ5N1QyODMgNTE1UTMzMyA1MTUgMzcyIDQ5N1Q0MzggNDQ1VDQ3OSAzNjVUNDkzIDI2MlpNNDEzIDI4MVE0MTMgMzE0IDQwNiAzNDRUMzgzIDM5N1QzNDMgNDM1VDI4NCA0NDlRMjQzIDQ0OSAyMTYgNDM0VDE3MSAzOTVUMTQ3IDM0MVQxNDAgMjgxSDQxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQTsiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik04NiAwVjY2N0g0ODRWNTkwSDE3N1YzOTFINDU1VjMxM0gxNzdWNzZINDk2VjBIODZaTTQzNSA4MDNMMjkxIDcwNUwxNDcgODAzTDE4MiA4NTFMMjkwIDc3NUwzOTkgODUxTDQzNSA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNDkzIDI2MlE0OTMgMjU3IDQ5MyAyNDRUNDkyIDIyM0gxNDBRMTQwIDE0NSAxNzggMTAxVDI5MSA1NlEzMjkgNTYgMzY0IDY3VDQ0MCAxMDhMNDcxIDQ4UTQyNiAxNiAzODEgM1QyODggLTExUTIzMCAtMTEgMTg2IDdUMTEzIDYwVDY4IDE0MlQ1MyAyNTFRNTMgMzE0IDY5IDM2M1QxMTYgNDQ2VDE4OCA0OTdUMjgzIDUxNVEzMzMgNTE1IDM3MiA0OTdUNDM4IDQ0NVQ0NzkgMzY1VDQ5MyAyNjJaTTQxMiAyODJRNDEyIDMxNSA0MDUgMzQ1VDM4MyAzOTlUMzQzIDQzN1QyODQgNDUxUTI0MyA0NTEgMjE1IDQzNlQxNzEgMzk3VDE0NyAzNDNUMTQwIDI4Mkg0MTJaTTQyNiA2NjNMMjgyIDU2NUwxMzggNjYzTDE3MyA3MTFMMjgxIDYzNUwzOTAgNzExTDQyNiA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUM7IiBob3Jpei1hZHYteD0iNjk4IiBkPSJNMzcwIDYwUTQ1OCA2MCA1MDMgMTA3VDU0OSAyMzVWMjc3SDM3M1YzNTJINjMzVjI3OFE2MzMgMTM1IDU2NyA2M1QzNjYgLTEwUTI5MSAtMTAgMjM1IDE2VDE0MSA4OFQ4NCAxOTZUNjUgMzMzUTY1IDQwMiA4MyA0NjVUMTM5IDU3NVQyMzQgNjUwVDM3MCA2NzhRNDQ1IDY3OCA0OTkgNjUyVDU5MyA1OTFMNTM5IDUzMFE0OTUgNTY4IDQ1NSA1ODRUMzczIDYwMVEzMTMgNjAxIDI3MiA1ODBUMjA2IDUyMlQxNzEgNDM2VDE2MCAzMzNRMTYwIDI4MCAxNjkgMjMxVDIwMyAxNDRUMjY3IDgzVDM3MCA2MFpNNDgwIDcwM0wzNjIgNzgyTDI0MyA3MDNMMjA2IDc1M0wzNjEgODUxTDUxOCA3NTNMNDgwIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRDsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00ODggLTMzUTQ4OCAtOTUgNDc0IC0xMzNUNDMzIC0xOTFUMzcxIC0yMTlUMjkzIC0yMjZRMjMyIC0yMjYgMTgzIC0yMTRUODYgLTE3NUwxMTMgLTEwN1ExNTYgLTEzMiAxOTggLTE0NVQyOTEgLTE1OFEzNTEgLTE1OCAzNzYgLTEzN1Q0MDEgLTUyVjc5SDM5N1EzNzEgMzMgMzM4IDE1VDI1NyAtNFEyMDEgLTQgMTYyIDE2VDk5IDcwVDY0IDE1MlQ1MyAyNTJRNTMgMzAzIDYyIDM1MFQ5NSA0MzRUMTU2IDQ5MlQyNTQgNTE0UTMwNCA1MTQgMzQxIDQ5OFQ0MDUgNDM2SDQwOUw0MTQgNTAySDQ4OFYtMzNaTTQwMiAzMjVRNDAyIDM4NiAzNjcgNDE2VDI3NCA0NDZRMjMwIDQ0NiAyMDQgNDI5VDE2NSAzODVUMTQ3IDMyNFQxNDIgMjUzUTE0MiAyMTYgMTQ4IDE4MlQxNjkgMTIxVDIxMCA3OVQyNzUgNjNRMzA4IDYzIDMzMSA3NFQzNzEgMTA1VDM5NCAxNTFUNDAyIDIwOFYzMjVaTTM5NyA1NjNMMjc5IDY0MkwxNjAgNTYzTDEyMyA2MTNMMjc4IDcxMUw0MzUgNjEzTDM5NyA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBob3Jpei1hZHYteD0iNjk4IiBkPSJNMzcwIDYwUTQ1OCA2MCA1MDMgMTA3VDU0OSAyMzVWMjc3SDM3M1YzNTJINjMzVjI3OFE2MzMgMTM1IDU2NyA2M1QzNjYgLTEwUTI5MSAtMTAgMjM1IDE2VDE0MSA4OFQ4NCAxOTZUNjUgMzMzUTY1IDQwMiA4MyA0NjVUMTM5IDU3NVQyMzQgNjUwVDM3MCA2NzhRNDQ1IDY3OCA0OTkgNjUyVDU5MyA1OTFMNTM5IDUzMFE0OTUgNTY4IDQ1NSA1ODRUMzczIDYwMVEzMTMgNjAxIDI3MiA1ODBUMjA2IDUyMlQxNzEgNDM2VDE2MCAzMzNRMTYwIDI4MCAxNjkgMjMxVDIwMyAxNDRUMjY3IDgzVDM3MCA2MFpNNTE1IDgzNFE1MTIgNzk5IDQ5OCA3NzZUNDYyIDczOFQ0MTcgNzE4VDM2OCA3MTJRMzQ0IDcxMiAzMjAgNzE4VDI3NSA3MzhUMjQxIDc3NVQyMjMgODM0SDI4M1EyODcgODAzIDMwNyA3ODJUMzY4IDc2MVE0MDggNzYxIDQzMCA3ODJUNDU0IDgzNEg1MTVINTE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFGOyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQ4OCAtMzNRNDg4IC05NSA0NzQgLTEzM1Q0MzMgLTE5MVQzNzEgLTIxOVQyOTMgLTIyNlEyMzIgLTIyNiAxODMgLTIxNFQ4NiAtMTc1TDExMyAtMTA3UTE1NiAtMTMyIDE5OCAtMTQ1VDI5MSAtMTU4UTM1MSAtMTU4IDM3NiAtMTM3VDQwMSAtNTJWNzlIMzk3UTM3MSAzMyAzMzggMTVUMjU3IC00UTIwMSAtNCAxNjIgMTZUOTkgNzBUNjQgMTUyVDUzIDI1MlE1MyAzMDMgNjIgMzUwVDk1IDQzNFQxNTYgNDkyVDI1NCA1MTRRMzA0IDUxNCAzNDEgNDk4VDQwNSA0MzZINDA5TDQxNCA1MDJINDg4Vi0zM1pNNDAyIDMyNVE0MDIgMzg2IDM2NyA0MTZUMjc0IDQ0NlEyMzAgNDQ2IDIwNCA0MjlUMTY1IDM4NVQxNDcgMzI0VDE0MiAyNTNRMTQyIDIxNiAxNDggMTgyVDE2OSAxMjFUMjEwIDc5VDI3NSA2M1EzMDggNjMgMzMxIDc0VDM3MSAxMDVUMzk0IDE1MVQ0MDIgMjA4VjMyNVpNNDMyIDY4N1E0MjkgNjUyIDQxNSA2MjlUMzc5IDU5MVQzMzQgNTcxVDI4NSA1NjVRMjYxIDU2NSAyMzcgNTcxVDE5MiA1OTFUMTU4IDYyOFQxNDAgNjg3SDIwMFEyMDQgNjU2IDIyNCA2MzVUMjg1IDYxNFEzMjUgNjE0IDM0NyA2MzVUMzcxIDY4N0g0MzJINDMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIwOyIgaG9yaXotYWR2LXg9IjY5OCIgZD0iTTM3MCA2MFE0NTggNjAgNTAzIDEwN1Q1NDkgMjM1VjI3N0gzNzNWMzUySDYzM1YyNzhRNjMzIDEzNSA1NjcgNjNUMzY2IC0xMFEyOTEgLTEwIDIzNSAxNlQxNDEgODhUODQgMTk2VDY1IDMzM1E2NSA0MDIgODMgNDY1VDEzOSA1NzVUMjM0IDY1MFQzNzAgNjc4UTQ0NSA2NzggNDk5IDY1MlQ1OTMgNTkxTDUzOSA1MzBRNDk1IDU2OCA0NTUgNTg0VDM3MyA2MDFRMzEzIDYwMSAyNzIgNTgwVDIwNiA1MjJUMTcxIDQzNlQxNjAgMzMzUTE2MCAyODAgMTY5IDIzMVQyMDMgMTQ0VDI2NyA4M1QzNzAgNjBaTTQyNSA3NzBRNDI1IDc0OCA0MTEgNzM1VDM3MCA3MjFRMzQ2IDcyMSAzMzEgNzM0VDMxNiA3NzBRMzE2IDc5MyAzMzEgODA2VDM3MCA4MjBRMzk2IDgyMCA0MTAgODA3VDQyNSA3NzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjE7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDg4IC0zM1E0ODggLTk1IDQ3NCAtMTMzVDQzMyAtMTkxVDM3MSAtMjE5VDI5MyAtMjI2UTIzMiAtMjI2IDE4MyAtMjE0VDg2IC0xNzVMMTEzIC0xMDdRMTU2IC0xMzIgMTk4IC0xNDVUMjkxIC0xNThRMzUxIC0xNTggMzc2IC0xMzdUNDAxIC01MlY3OUgzOTdRMzcxIDMzIDMzOCAxNVQyNTcgLTRRMjAxIC00IDE2MiAxNlQ5OSA3MFQ2NCAxNTJUNTMgMjUyUTUzIDMwMyA2MiAzNTBUOTUgNDM0VDE1NiA0OTJUMjU0IDUxNFEzMDQgNTE0IDM0MSA0OThUNDA1IDQzNkg0MDlMNDE0IDUwMkg0ODhWLTMzWk00MDIgMzI1UTQwMiAzODYgMzY3IDQxNlQyNzQgNDQ2UTIzMCA0NDYgMjA0IDQyOVQxNjUgMzg1VDE0NyAzMjRUMTQyIDI1M1ExNDIgMjE2IDE0OCAxODJUMTY5IDEyMVQyMTAgNzlUMjc1IDYzUTMwOCA2MyAzMzEgNzRUMzcxIDEwNVQzOTQgMTUxVDQwMiAyMDhWMzI1Wk0zMzYgNjI5UTMzNiA2MDcgMzIyIDU5NFQyODEgNTgwUTI1NyA1ODAgMjQyIDU5M1QyMjcgNjI5UTIyNyA2NTIgMjQyIDY2NVQyODEgNjc5UTMwNyA2NzkgMzIxIDY2NlQzMzYgNjI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIyOyIgaG9yaXotYWR2LXg9IjY5OCIgZD0iTTM3MCA2MFE0NTggNjAgNTAzIDEwN1Q1NDkgMjM1VjI3N0gzNzNWMzUySDYzM1YyNzhRNjMzIDEzNSA1NjcgNjNUMzY2IC0xMFEyOTEgLTEwIDIzNSAxNlQxNDEgODhUODQgMTk2VDY1IDMzM1E2NSA0MDIgODMgNDY1VDEzOSA1NzVUMjM0IDY1MFQzNzAgNjc4UTQ0NSA2NzggNDk5IDY1MlQ1OTMgNTkxTDUzOSA1MzBRNDk1IDU2OCA0NTUgNTg0VDM3MyA2MDFRMzEzIDYwMSAyNzIgNTgwVDIwNiA1MjJUMTcxIDQzNlQxNjAgMzMzUTE2MCAyODAgMTY5IDIzMVQyMDMgMTQ0VDI2NyA4M1QzNzAgNjBaTTM2MSAtMjEzSDMwMUwzMjggLTU5SDQyNUwzNjEgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMzsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00ODggLTMzUTQ4OCAtOTUgNDc0IC0xMzNUNDMzIC0xOTFUMzcxIC0yMTlUMjkzIC0yMjZRMjMyIC0yMjYgMTgzIC0yMTRUODYgLTE3NUwxMTMgLTEwN1ExNTYgLTEzMiAxOTggLTE0NVQyOTEgLTE1OFEzNTEgLTE1OCAzNzYgLTEzN1Q0MDEgLTUyVjc5SDM5N1EzNzEgMzMgMzM4IDE1VDI1NyAtNFEyMDEgLTQgMTYyIDE2VDk5IDcwVDY0IDE1MlQ1MyAyNTJRNTMgMzAzIDYyIDM1MFQ5NSA0MzRUMTU2IDQ5MlQyNTQgNTE0UTMwNCA1MTQgMzQxIDQ5OFQ0MDUgNDM2SDQwOUw0MTQgNTAySDQ4OFYtMzNaTTQwMiAzMjVRNDAyIDM4NiAzNjcgNDE2VDI3NCA0NDZRMjMwIDQ0NiAyMDQgNDI5VDE2NSAzODVUMTQ3IDMyNFQxNDIgMjUzUTE0MiAyMTYgMTQ4IDE4MlQxNjkgMTIxVDIxMCA3OVQyNzUgNjNRMzA4IDYzIDMzMSA3NFQzNzEgMTA1VDM5NCAxNTFUNDAyIDIwOFYzMjVaTTMwNCA3MTVIMzYwTDMzMyA1NzJIMjMyTDMwNCA3MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjQ7IiBob3Jpei1hZHYteD0iNjYyIiBkPSJNNDg1IDBWMzE0SDE3N1YwSDg2VjY2N0gxNzdWMzk5SDQ4NVY2NjdINTc2VjBINDg1Wk00NTcgNzAzTDMzOSA3ODJMMjIwIDcwM0wxODMgNzUzTDMzOCA4NTFMNDk1IDc1M0w0NTcgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI1OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwVjI5NFE0MDEgMzI3IDM5OSAzNTRUMzg1IDQwMFQzNTMgNDI5VDI5MyA0NDBRMjMwIDQ0MCAxOTcgNDA4VDE2MyAzMTVWMEg3NlY3MDBIMTYzVjQ0MEgxNjdRMTg4IDQ3OCAyMjYgNDk2VDMxNiA1MTRRMzY3IDUxNCA0MDAgNTAxVDQ1MyA0NjFUNDgwIDM5OFQ0ODggMzEzVjBINDAxWk0yMzkgNzAxTDEyMSA3ODBMMiA3MDFMLTM1IDc1MUwxMjAgODQ5TDI3NyA3NTFMMjM5IDcwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNjsiIGhvcml6LWFkdi14PSI2NjIiIGQ9Ik00ODUgMFYzMTRIMTc3VjBIODZWNDkzSDBWNTYySDg2VjY2N0gxNzdWNTYySDQ4NVY2NjdINTc2VjU2Mkg2NjJWNDkzSDU3NlYwSDQ4NVpNNDg1IDM4OVY0OTNIMTc3VjM4OUg0ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjc7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNMTYzIDU3MFY0MzBIMTY3UTE4OCA0NjggMjI2IDQ4NlQzMTYgNTA0UTM2NyA1MDQgNDAwIDQ5MFQ0NTMgNDQ5VDQ4MCAzODRUNDg4IDI5OVYwSDQwMFYyODNRNDAwIDMxNiAzOTggMzQzVDM4NSAzODlUMzUzIDQxOFQyOTMgNDI5UTIzMCA0MjkgMTk3IDM5N1QxNjMgMzA1VjBINzZWNTcwSDlWNjI3SDc2VjcwMEgxNjNWNjI3SDMzNVY1NzBIMTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI4OyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBWNjY3SDE3N1YwSDg2Wk0yOTYgNzgxUTI4NSA3NDUgMjU5IDcyOFQyMDQgNzEwUTE4NiA3MTAgMTY4IDcxNlQxMzIgNzI5VDk4IDc0M1Q2NyA3NTBRNTAgNzUwIDM2IDc0MlQxMSA3MDlMLTMzIDc0M1EtMTUgNzg0IDggNzk5VDYwIDgxNFE3OCA4MTQgOTYgODA4VDEzMyA3OTRUMTY3IDc4MFQxOTggNzc0UTIxNSA3NzQgMjI5IDc4MlQyNTEgODE0TDI5NiA3ODFIMjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI5OyIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTc2IDBWNTAySDE2M1YwSDc2Wk0yODYgNjQxUTI3NSA2MDUgMjQ5IDU4OFQxOTQgNTcwUTE3NiA1NzAgMTU4IDU3NlQxMjIgNTg5VDg4IDYwM1Q1NyA2MTBRNDAgNjEwIDI2IDYwMlQxIDU2OUwtNDMgNjAzUS0yNSA2NDQgLTIgNjU5VDUwIDY3NFE2OCA2NzQgODYgNjY4VDEyMyA2NTRUMTU3IDY0MFQxODggNjM0UTIwNSA2MzQgMjE5IDY0MlQyNDEgNjc0TDI4NiA2NDFIMjg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJBOyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBWNjY3SDE3N1YwSDg2Wk0tMTcgNzI5Vjc4NkgyODFWNzI5SC0xN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQjsiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik03NiAwVjUwMkgxNjNWMEg3NlpNLTMwIDU4OVY2NDZIMjY4VjU4OUgtMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkM7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNODYgMFY2NjdIMTc3VjBIODZaTTI3OCA4MjdRMjc1IDc5MiAyNjEgNzY5VDIyNSA3MzFUMTgwIDcxMVQxMzEgNzA1UTEwNyA3MDUgODMgNzExVDM4IDczMVQ0IDc2OFQtMTQgODI3SDQ2UTUwIDc5NiA3MCA3NzVUMTMxIDc1NFExNzEgNzU0IDE5MyA3NzVUMjE3IDgyN0gyNzhIMjc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJEOyIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTc2IDBWNTAySDE2M1YwSDc2Wk0yNjcgNjg3UTI2NCA2NTIgMjUwIDYyOVQyMTQgNTkxVDE2OSA1NzFUMTIwIDU2NVE5NiA1NjUgNzIgNTcxVDI3IDU5MVQtNyA2MjhULTI1IDY4N0gzNVEzOSA2NTYgNTkgNjM1VDEyMCA2MTRRMTYwIDYxNCAxODIgNjM1VDIwNiA2ODdIMjY3SDI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRTsiIGhvcml6LWFkdi14PSIyNjMiIGQ9Ik0xNTQgMFE5NyAtMzYgNzkgLTY1VDYxIC0xMjFRNjEgLTE0OSA3OCAtMTY2VDEyMiAtMTgzUTE0MiAtMTgzIDE1NiAtMTc4VDE3OSAtMTY3TDE5NiAtMjE3UTE5MCAtMjIwIDE4MCAtMjIzVDE1OCAtMjMwVDEzMyAtMjM2VDEwNyAtMjM4UTUwIC0yMzggMjQgLTIwOFQtMyAtMTMzUS0zIC04OSAyNyAtNTZUMTA1IDBIODZWNjY3SDE3N1YwSDE1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRjsiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik0xNDUgMFE4OCAtMzYgNzAgLTY1VDUyIC0xMjFRNTIgLTE0OSA2OSAtMTY2VDExMyAtMTgzUTEzMyAtMTgzIDE0NiAtMTc4VDE3MCAtMTY3TDE4NyAtMjE3UTE3NSAtMjIzIDE1MCAtMjMwVDEwMCAtMjM4UTQyIC0yMzggMTUgLTIwOFQtMTIgLTEzM1EtMTIgLTkyIDE3IC01OFQ5NCAwSDc2VjUwMkgxNjNWMEgxNDVaTTE3NCA2MjZRMTc0IDYwNCAxNTkgNTkxVDExOSA1NzdROTUgNTc3IDgwIDU5MFQ2NSA2MjZRNjUgNjQ5IDgwIDY2MlQxMTkgNjc2UTE0NSA2NzYgMTU5IDY2M1QxNzQgNjI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMwOyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBWNjY3SDE3N1YwSDg2Wk0xODcgNzcwUTE4NyA3NDggMTczIDczNVQxMzIgNzIxUTEwOCA3MjEgOTMgNzM0VDc4IDc3MFE3OCA3OTMgOTMgODA2VDEzMiA4MjBRMTU4IDgyMCAxNzIgODA3VDE4NyA3NzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzE7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMFY1MDJIMTYzVjBINzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzI7IiBob3Jpei1hZHYteD0iNjQ3IiBkPSJNODYgMFY2NjdIMTc3VjBIODZaTTU2MSAxNzdRNTYxIDg2IDUyMSAzN1QzOTAgLTEyUTM0NyAtMTIgMzExIC0xVDIzOSAzOEwyNzggMTA4UTMwNyA4NCAzMzAgNzVUMzgxIDY2UTQyOCA2NiA0NDkgOTFUNDcwIDE3MFY2NjdINTYxVjE3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMzsiIGhvcml6LWFkdi14PSI0NjkiIGQ9Ik03NyAwVjUwMkgxNjRWMEg3N1pNMTc1IDYyNlExNzUgNjA0IDE2MCA1OTFUMTIwIDU3N1E5NiA1NzcgODEgNTkwVDY2IDYyNlE2NiA2NDkgODEgNjYyVDEyMCA2NzZRMTQ2IDY3NiAxNjAgNjYzVDE3NSA2MjZaTTQwMyA2MjZRNDAzIDYwMiAzODcgNTkwVDM0OCA1NzdRMzI3IDU3NyAzMTEgNTg5VDI5NCA2MjZRMjk0IDY1MiAzMTAgNjY0VDM0OCA2NzZRMzcxIDY3NiAzODcgNjY0VDQwMyA2MjZaTTM5MyAtMzlRMzkzIC0xMjggMzU0IC0xNzdUMjIzIC0yMjZRMjA2IC0yMjYgMTkwIC0yMjVUMTU2IC0yMjJWLTE0OFExODYgLTE1MSAyMTEgLTE1MVEyNDIgLTE1MSAyNjEgLTE0M1QyOTAgLTEyMFQzMDMgLTgzVDMwNiAtMzFWNTAySDM5M1YtMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzQ7IiBob3Jpei1hZHYteD0iNDQ4IiBkPSJNMzYyIDE3N1EzNjIgODYgMzIyIDM3VDE5MSAtMTJRMTQ4IC0xMiAxMTIgLTFUNDAgMzhMNzkgMTA4UTEwOCA4NCAxMzEgNzVUMTgyIDY2UTIyOSA2NiAyNTAgOTFUMjcxIDE3MFY2NjdIMzYyVjE3N0gzNjJaTTQzNSA3MDNMMzE3IDc4MkwxOTggNzAzTDE2MSA3NTNMMzE2IDg1MUw0NzMgNzUzTDQzNSA3MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzU7IiBob3Jpei1hZHYteD0iMjQ1IiBkPSJNMTY5IC0zOVExNjkgLTEyOSAxMzAgLTE3N1QtMSAtMjI2US0xOCAtMjI2IC0zNCAtMjI1VC02OCAtMjIyVi0xNDhRLTM4IC0xNTEgLTEzIC0xNTFRMTggLTE1MSAzNyAtMTQzVDY2IC0xMjBUNzkgLTgzVDgyIC0zMVY1MDJIMTY5Vi0zOVpNMjQ1IDU2M0wxMjcgNjQyTDggNTYzTC0yOSA2MTNMMTI2IDcxMUwyODMgNjEzTDI0NSA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzY7IiBob3Jpei1hZHYteD0iNTc5IiBkPSJNNDQ4IDBMMjQ2IDMyMUwxNzcgMjQyVjBIODZWNjY3SDE3N1YzNTJIMTc5TDQyOCA2NjdINTQyTDMxNCAzODRMNTYxIDBINDQ4Wk0yODYgLTIxM0gyMjZMMjUzIC01OUgzNTBMMjg2IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzc7IiBob3Jpei1hZHYteD0iNTA0IiBkPSJNMzgwIDBMMjM2IDI0N0wxNjMgMTYyVjBINzZWNzAwSDE2M1YyNjNIMTY3TDM2MCA1MDJINDcwTDI5OSAzMDRMNDg1IDBIMzgwWk0yNTQgLTIxM0gxOTRMMjIxIC01OUgzMThMMjU0IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzk7IiBob3Jpei1hZHYteD0iNDk4IiBkPSJNODYgMFY2NjdIMTc3Vjc4SDQ1OFYwSDg2Wk0xMzMgNzA1TDg0IDczNkwyMjEgODU3TDMwNyA4MTVMMTMzIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQTsiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0yNDQgMFEyMTkgLTUgMTc3IC01UTEyMyAtNSAxMDAgMTdUNzYgOTdWNzAwSDE2M1YxMTlRMTYzIDEwMSAxNjUgOTFUMTc0IDc2VDE4OSA3MFQyMTMgNjlIMjQ0VjBIMjQ0Wk0xMjUgNzMzTDc2IDc2NEwyMTMgODg1TDI5OSA4NDNMMTI1IDczM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQjsiIGhvcml6LWFkdi14PSI0OTgiIGQ9Ik04NiAwVjY2N0gxNzdWNzhINDU4VjBIODZaTTI1NCAtMjEzSDE5NEwyMjEgLTU5SDMxOEwyNTQgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQzsiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0yNDQgMFEyMTkgLTUgMTc3IC01UTEyMyAtNSAxMDAgMTdUNzYgOTdWNzAwSDE2M1YxMTlRMTYzIDEwMSAxNjUgOTFUMTc0IDc2VDE4OSA3MFQyMTMgNjlIMjQ0VjBIMjQ0Wk0xNTIgLTIxM0g5MkwxMTkgLTU5SDIxNkwxNTIgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRDsiIGhvcml6LWFkdi14PSI0OTgiIGQ9Ik04NiAwVjY2N0gxNzdWNzhINDU4VjBIODZaTTQwNiA1MzVIMzQ3TDM4MCA3MDBINDczTDQwNiA1MzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0U7IiBob3Jpei1hZHYteD0iMjcyIiBkPSJNMjQ0IDBRMjE5IC01IDE3NyAtNVExMjMgLTUgMTAwIDE3VDc2IDk3VjcwMEgxNjNWMTE5UTE2MyAxMDEgMTY1IDkxVDE3NCA3NlQxODkgNzBUMjEzIDY5SDI0NFYwWk0yNzYgNTM1SDIxN0wyNTAgNzAwSDM0M0wyNzYgNTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNGOyIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTg2IDBWNjY3SDE3N1Y3OEg0NThWMEg4NlpNNDY1IDI4MFE0NjUgMjU0IDQ0OCAyMzlUNDAyIDIyM1EzNzQgMjIzIDM1NyAyMzhUMzM5IDI4MFEzMzkgMzA1IDM1NiAzMjBUNDAyIDMzNVE0MzEgMzM1IDQ0OCAzMjBUNDY1IDI4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MDsiIGhvcml6LWFkdi14PSIzNTUiIGQ9Ik0yNDQgMFEyMTkgLTUgMTc3IC01UTEyMyAtNSAxMDAgMTdUNzYgOTdWNzAwSDE2M1YxMTlRMTYzIDEwMSAxNjUgOTFUMTc0IDc2VDE4OSA3MFQyMTMgNjlIMjQ0VjBaTTM3MCAyMzhRMzcwIDIxMiAzNTMgMTk3VDMwNyAxODFRMjc5IDE4MSAyNjIgMTk2VDI0NCAyMzhRMjQ0IDI2MyAyNjEgMjc4VDMwNyAyOTNRMzM2IDI5MyAzNTMgMjc4VDM3MCAyMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDE7IiBob3Jpei1hZHYteD0iNDk4IiBkPSJNODYgMFYzMDNMMzYgMjczVjM1MEw4NiAzODBWNjY3SDE3N1Y0MzRMMzE0IDUxNlY0MzdMMTc3IDM1NVY3OEg0NThWMEg4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MjsiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0xNjMgMzY1VjExOVExNjMgMTAxIDE2NSA5MVQxNzQgNzZUMTkwIDcwVDIxNCA2OUgyNDVWLTFRMjMzIC0zIDIxNyAtNFQxNzggLTZRMTIzIC02IDEwMCAxNlQ3NiA5N1YzMTVMMjkgMjg1VjM2OEw3NiAzOTlWNzAwSDE2M1Y0NDZMMjYzIDUwNlY0MjVMMTYzIDM2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MzsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzAgMEwxNzggNTIwSDE3NFYwSDg2VjY2N0gxNzZMNTIzIDE1NEg1MjdWNjY3SDYxNVYwSDUzMFpNMzUyIDcwNUwzMDMgNzM2TDQ0MCA4NTdMNTI2IDgxNUwzNTIgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwVjI5NFE0MDEgMzI3IDM5OCAzNTRUMzgzIDQwMFQzNTEgNDI5VDI5MiA0NDBRMjI5IDQ0MCAxOTYgNDA4VDE2MyAzMTVWMEg3NlY1MDJIMTUxTDE1OCA0MzlIMTYyUTIxMSA1MTQgMzE0IDUxNFEzNjYgNTE0IDQwMCA1MDFUNDUzIDQ2MVQ0ODAgMzk4VDQ4OCAzMTRWMEg0MDFaTTI3NyA1NjVMMjI4IDU5NkwzNjUgNzE3TDQ1MSA2NzVMMjc3IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzAgMEwxNzggNTIwSDE3NFYwSDg2VjY2N0gxNzZMNTIzIDE1NEg1MjdWNjY3SDYxNVYwSDUzMFpNMzMzIC0yMTNIMjczTDMwMCAtNTlIMzk3TDMzMyAtMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ2OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwVjI5NFE0MDEgMzI3IDM5OCAzNTRUMzgzIDQwMFQzNTEgNDI5VDI5MiA0NDBRMjI5IDQ0MCAxOTYgNDA4VDE2MyAzMTVWMEg3NlY1MDJIMTUxTDE1OCA0MzlIMTYyUTIxMSA1MTQgMzE0IDUxNFEzNjYgNTE0IDQwMCA1MDFUNDUzIDQ2MVQ0ODAgMzk4VDQ4OCAzMTRWMEg0MDFaTTI3NiAtMjEzSDIxNkwyNDMgLTU5SDM0MEwyNzYgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NzsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzAgMEwxNzggNTIwSDE3NFYwSDg2VjY2N0gxNzZMNTIzIDE1NEg1MjdWNjY3SDYxNVYwSDUzMFpNNTA4IDgwM0wzNjQgNzA1TDIyMCA4MDNMMjU1IDg1MUwzNjMgNzc1TDQ3MiA4NTFMNTA4IDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MDEgMFYyOTRRNDAxIDMyNyAzOTggMzU0VDM4MyA0MDBUMzUxIDQyOVQyOTIgNDQwUTIyOSA0NDAgMTk2IDQwOFQxNjMgMzE1VjBINzZWNTAySDE1MUwxNTggNDM5SDE2MlEyMTEgNTE0IDMxNCA1MTRRMzY2IDUxNCA0MDAgNTAxVDQ1MyA0NjFUNDgwIDM5OFQ0ODggMzE0VjBINDAxWk00MzUgNjYzTDI5MSA1NjVMMTQ3IDY2M0wxODIgNzExTDI5MCA2MzVMMzk5IDcxMUw0MzUgNjYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRBOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTQzMiAtMTU4SDQ0NlE0NjggLTE1OCA0ODMgLTE1MFQ1MDggLTEyOVQ1MjIgLTk5VDUyNyAtNjJWNUwxNzYgNTI1SDE3NVYwSDg2VjY2N0gxNzZMNTI1IDE0OEg1MjZWNjY3SDYxNVYtNjBRNjE1IC0xNDMgNTc4IC0xOTFUNDU2IC0yMzlINDMyVi0xNThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEI7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNMTUxIDUwMkwxNTggNDM5SDE2MFEyMDkgNTE0IDMxNCA1MTRRMzY2IDUxNCA0MDAgNTAxVDQ1MyA0NjFUNDgwIDM5OFQ0ODggMzE0Vi0yM1E0ODggLTExNSA0NDkgLTE2NFQzMTcgLTIxNEgyOTNWLTEzNUgzMDdRMzM0IC0xMzUgMzUyIC0xMjdUMzgxIC0xMDRUMzk2IC02OVQ0MDEgLTI1VjI5NFE0MDEgMzI3IDM5OCAzNTRUMzgzIDQwMFQzNTEgNDI5VDI5MiA0NDBRMjI5IDQ0MCAxOTYgNDA4VDE2MyAzMTVWMEg3NlY1MDJIMTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRDOyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTY4MSAzMzRRNjgxIDI1OSA2NjMgMTk2VDYwNyA4N1Q1MTEgMTVUMzczIC0xMVEyOTMgLTExIDIzNSAxNVQxMzkgODdUODMgMTk2VDY1IDMzNFE2NSA0MDYgODMgNDY4VDEzOCA1NzdUMjM0IDY1MVQzNzMgNjc4UTQ1MyA2NzggNTExIDY1MlQ2MDcgNTgwVDY2MyA0NzBUNjgxIDMzNFpNNTg2IDMzM1E1ODYgMzg2IDU3NyA0MzVUNTQzIDUyMVQ0NzggNTgxVDM3MyA2MDRRMzEwIDYwNCAyNjkgNTgyVDIwNCA1MjJUMTcwIDQzNVQxNjAgMzMzUTE2MCAyODEgMTY5IDIzMlQyMDMgMTQ2VDI2OSA4NlQzNzMgNjNRNDM2IDYzIDQ3NyA4NVQ1NDMgMTQ1VDU3NiAyMzJUNTg2IDMzM1pNMjI5IDcyOVY3ODZINTI3VjcyOUgyMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEQ7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNNTMgMjUwUTUzIDMwNSA2NiAzNTNUMTA3IDQzN1QxNzkgNDkzVDI4NiA1MTRRMzQ2IDUxNCAzOTAgNDk1VDQ2MyA0NDBUNTA3IDM1N1Q1MjEgMjUwUTUyMSAxOTUgNTA3IDE0OFQ0NjUgNjVUMzkyIDlUMjg2IC0xMVEyMjUgLTExIDE4MSA5VDEwOSA2NFQ2NyAxNDZUNTMgMjUwWk0xNDIgMjUxUTE0MiAyMTEgMTQ5IDE3NlQxNzIgMTE0VDIxNyA3MlQyODcgNTZRMzI5IDU2IDM1NyA3MVQ0MDEgMTEzVDQyNSAxNzVUNDMyIDI1MVE0MzIgMjkxIDQyNSAzMjZUNDAyIDM4OFQzNTcgNDI5VDI4NyA0NDVRMjQ1IDQ0NSAyMTcgNDMwVDE3MyAzODhUMTQ5IDMyN1QxNDIgMjUxWk0xMzkgNTg5VjY0Nkg0MzdWNTg5SDEzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RTsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik02ODEgMzM0UTY4MSAyNTkgNjYzIDE5NlQ2MDcgODdUNTExIDE1VDM3MyAtMTFRMjkzIC0xMSAyMzUgMTVUMTM5IDg3VDgzIDE5NlQ2NSAzMzRRNjUgNDA2IDgzIDQ2OFQxMzggNTc3VDIzNCA2NTFUMzczIDY3OFE0NTMgNjc4IDUxMSA2NTJUNjA3IDU4MFQ2NjMgNDcwVDY4MSAzMzRaTTU4NiAzMzNRNTg2IDM4NiA1NzcgNDM1VDU0MyA1MjFUNDc4IDU4MVQzNzMgNjA0UTMxMCA2MDQgMjY5IDU4MlQyMDQgNTIyVDE3MCA0MzVUMTYwIDMzM1ExNjAgMjgxIDE2OSAyMzJUMjAzIDE0NlQyNjkgODZUMzczIDYzUTQzNiA2MyA0NzcgODVUNTQzIDE0NVQ1NzYgMjMyVDU4NiAzMzNaTTUyMyA4MzRRNTIwIDc5OSA1MDYgNzc2VDQ3MCA3MzhUNDI1IDcxOFQzNzYgNzEyUTM1MiA3MTIgMzI4IDcxOFQyODMgNzM4VDI0OSA3NzVUMjMxIDgzNEgyOTFRMjk1IDgwMyAzMTUgNzgyVDM3NiA3NjFRNDE2IDc2MSA0MzggNzgyVDQ2MiA4MzRINTIzSDUyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RjsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik01MyAyNTBRNTMgMzA1IDY2IDM1M1QxMDcgNDM3VDE3OSA0OTNUMjg2IDUxNFEzNDYgNTE0IDM5MCA0OTVUNDYzIDQ0MFQ1MDcgMzU3VDUyMSAyNTBRNTIxIDE5NSA1MDcgMTQ4VDQ2NSA2NVQzOTIgOVQyODYgLTExUTIyNSAtMTEgMTgxIDlUMTA5IDY0VDY3IDE0NlQ1MyAyNTBaTTE0MiAyNTFRMTQyIDIxMSAxNDkgMTc2VDE3MiAxMTRUMjE3IDcyVDI4NyA1NlEzMjkgNTYgMzU3IDcxVDQwMSAxMTNUNDI1IDE3NVQ0MzIgMjUxUTQzMiAyOTEgNDI1IDMyNlQ0MDIgMzg4VDM1NyA0MjlUMjg3IDQ0NVEyNDUgNDQ1IDIxNyA0MzBUMTczIDM4OFQxNDkgMzI3VDE0MiAyNTFaTTQzNCA2ODdRNDMxIDY1MiA0MTcgNjI5VDM4MSA1OTFUMzM2IDU3MVQyODcgNTY1UTI2MyA1NjUgMjM5IDU3MVQxOTQgNTkxVDE2MCA2MjhUMTQyIDY4N0gyMDJRMjA2IDY1NiAyMjYgNjM1VDI4NyA2MTRRMzI3IDYxNCAzNDkgNjM1VDM3MyA2ODdINDM0SDQzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MDsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik02ODEgMzM0UTY4MSAyNTkgNjYzIDE5NlQ2MDcgODdUNTExIDE1VDM3MyAtMTFRMjkzIC0xMSAyMzUgMTVUMTM5IDg3VDgzIDE5NlQ2NSAzMzRRNjUgNDA2IDgzIDQ2OFQxMzggNTc3VDIzNCA2NTFUMzczIDY3OFE0NTMgNjc4IDUxMSA2NTJUNjA3IDU4MFQ2NjMgNDcwVDY4MSAzMzRaTTU4NiAzMzNRNTg2IDM4NiA1NzcgNDM1VDU0MyA1MjFUNDc4IDU4MVQzNzMgNjA0UTMxMCA2MDQgMjY5IDU4MlQyMDQgNTIyVDE3MCA0MzVUMTYwIDMzM1ExNjAgMjgxIDE2OSAyMzJUMjAzIDE0NlQyNjkgODZUMzczIDYzUTQzNiA2MyA0NzcgODVUNTQzIDE0NVQ1NzYgMjMyVDU4NiAzMzNaTTUwNSA2OTZMNDU5IDcyM0w2MDAgODQ0TDY4MCA4MDZMNTA1IDY5NlpNMjc1IDY5NkwyMzAgNzIzTDM3MSA4NDRMNDUxIDgwNkwyNzUgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUxOyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTUzIDI1MFE1MyAzMDUgNjYgMzUzVDEwNyA0MzdUMTc5IDQ5M1QyODYgNTE0UTM0NiA1MTQgMzkwIDQ5NVQ0NjMgNDQwVDUwNyAzNTdUNTIxIDI1MFE1MjEgMTk1IDUwNyAxNDhUNDY1IDY1VDM5MiA5VDI4NiAtMTFRMjI1IC0xMSAxODEgOVQxMDkgNjRUNjcgMTQ2VDUzIDI1MFpNMTQyIDI1MVExNDIgMjExIDE0OSAxNzZUMTcyIDExNFQyMTcgNzJUMjg3IDU2UTMyOSA1NiAzNTcgNzFUNDAxIDExM1Q0MjUgMTc1VDQzMiAyNTFRNDMyIDI5MSA0MjUgMzI2VDQwMiAzODhUMzU3IDQyOVQyODcgNDQ1UTI0NSA0NDUgMjE3IDQzMFQxNzMgMzg4VDE0OSAzMjdUMTQyIDI1MVpNNDI5IDU2MkwzODMgNTg5TDUyNCA3MTBMNjA0IDY3Mkw0MjkgNTYyWk0xOTkgNTYyTDE1NCA1ODlMMjk1IDcxMEwzNzUgNjcyTDE5OSA1NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTI7IiBob3Jpei1hZHYteD0iODk0IiBkPSJNNDcyIDBRNDQ5IC01IDQyMCAtOFQzNjQgLTExUTI4NCAtMTEgMjI4IDE1VDEzNSA4N1Q4MiAxOTZUNjUgMzM0UTY1IDQwNiA4MSA0NjhUMTM0IDU3N1QyMjcgNjUxVDM2NCA2NzhRMzkxIDY3OCA0MjAgNjc1VDQ3MiA2NjdIODQ1VjU5MEg1NjNWMzkxSDgxNlYzMTNINTYzVjc2SDg1NlYwSDQ3MlpNMzY3IDYzUTM5OCA2MyA0MjUgNjdUNDcyIDc5VjU4N1E0NTIgNTk1IDQyNSA1OTlUMzY3IDYwNFEzMDQgNjA0IDI2NCA1ODJUMjAxIDUyMlQxNjkgNDM1VDE2MCAzMzNRMTYwIDI4MSAxNjggMjMyVDIwMCAxNDZUMjY0IDg2VDM2NyA2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MzsiIGhvcml6LWFkdi14PSI5MjciIGQ9Ik04NzcgMjU1UTg3NyAyNTAgODc3IDI0MlQ4NzYgMjIzSDUyMVE1MjMgMTQzIDU2MSAxMDFUNjc0IDU4UTc0OCA1OCA4MjAgMTEwTDg1MSA0OFE4MTEgMTkgNzY2IDRUNjcyIC0xMVE1OTcgLTExIDU1MSAxOVQ0NzkgOThRNDUwIDQxIDQwMiAxNVQyODcgLTExUTE3NSAtMTEgMTE0IDU2VDUzIDI1MVE1MyAzNzMgMTEyIDQ0M1QyODcgNTE0UTM1MiA1MTQgNDAxIDQ4OFQ0NzcgNDA1UTUwNiA0NTggNTUyIDQ4NlQ2NjIgNTE1UTc2MiA1MTUgODE5IDQ0N1Q4NzcgMjU1Wk03OTYgMjgzUTc5NSAzMTMgNzg4IDM0MlQ3NjYgMzk1VDcyNiA0MzNUNjYzIDQ0OFE1OTkgNDQ4IDU2MSA0MDVUNTIxIDI4M0g3OTZaTTQzMSAyNTFRNDMxIDI5MyA0MjQgMzI4VDQwMCAzODlUMzU2IDQyOFQyODcgNDQyUTI0NiA0NDIgMjE5IDQyOFQxNzQgMzg5VDE1MCAzMjlUMTQyIDI1MVExNDIgMTQ2IDE4MSAxMDJUMjg3IDU4UTM1NCA1OCAzOTIgMTAyVDQzMSAyNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTQ7IiBob3Jpei1hZHYteD0iNjA0IiBkPSJNNDU5IDBMMzcyIDI0MFEzNjQgMjYyIDM1MSAyNzBUMzE1IDI3OUgxNzdWMEg4NlY2NjRRMTM5IDY3MCAxODUgNjcyVDI4NiA2NzVRMzMzIDY3NSAzNzggNjY3VDQ1OCA2MzdUNTE1IDU3OFQ1MzcgNDgyUTUzNyA0MTkgNTEzIDM3M1Q0MjUgMzA0VjMwM1E0MzYgMjk4IDQ0NCAyODZUNDU2IDI2MUw1NTUgMEg0NTlaTTQ0NyA0NzVRNDQ3IDUxNCA0MzUgNTM4VDQwMSA1NzdUMzUwIDU5NlQyODggNjAyUTI1OCA2MDIgMjMyIDYwMVQxNzcgNTk1VjM1MkgzMDhRMzQwIDM1MiAzNjYgMzU4VDQxMCAzNzhUNDM3IDQxNVQ0NDcgNDc1Wk0yNzEgNzA3TDIyMiA3MzhMMzU5IDg1OUw0NDUgODE3TDI3MSA3MDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTU7IiBob3Jpei1hZHYteD0iMzU5IiBkPSJNMzE3IDQzNlEyNDYgNDM2IDIwNSA0MTFUMTYzIDMxOFYwSDc2VjUwMkgxNTBMMTU4IDQzOEgxNTlRMTgyIDQ3NyAyMjAgNDk1VDMxMyA1MTNIMzM5VjQzNkgzMTdaTTE5NiA1NjVMMTQ3IDU5NkwyODQgNzE3TDM3MCA2NzVMMTk2IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NjsiIGhvcml6LWFkdi14PSI2MDQiIGQ9Ik00NTkgMEwzNzIgMjQwUTM2NCAyNjIgMzUxIDI3MFQzMTUgMjc5SDE3N1YwSDg2VjY2NFExMzkgNjcwIDE4NSA2NzJUMjg2IDY3NVEzMzMgNjc1IDM3OCA2NjdUNDU4IDYzN1Q1MTUgNTc4VDUzNyA0ODJRNTM3IDQxOSA1MTMgMzczVDQyNSAzMDRWMzAzUTQzNiAyOTggNDQ0IDI4NlQ0NTYgMjYxTDU1NSAwSDQ1OVpNNDQ3IDQ3NVE0NDcgNTE0IDQzNSA1MzhUNDAxIDU3N1QzNTAgNTk2VDI4OCA2MDJRMjU4IDYwMiAyMzIgNjAxVDE3NyA1OTVWMzUySDMwOFEzNDAgMzUyIDM2NiAzNThUNDEwIDM3OFQ0MzcgNDE1VDQ0NyA0NzVaTTI5MiAtMjEzSDIzMkwyNTkgLTU5SDM1NkwyOTIgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NzsiIGhvcml6LWFkdi14PSIzNTkiIGQ9Ik0zMTcgNDM2UTI0NiA0MzYgMjA1IDQxMVQxNjMgMzE4VjBINzZWNTAySDE1MEwxNTggNDM4SDE1OVExODIgNDc3IDIyMCA0OTVUMzEzIDUxM0gzMzlWNDM2SDMxN1pNMTM2IC0yMTNINzZMMTAzIC01OUgyMDBMMTM2IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTg7IiBob3Jpei1hZHYteD0iNjA0IiBkPSJNNDU5IDBMMzcyIDI0MFEzNjQgMjYyIDM1MSAyNzBUMzE1IDI3OUgxNzdWMEg4NlY2NjRRMTM5IDY3MCAxODUgNjcyVDI4NiA2NzVRMzMzIDY3NSAzNzggNjY3VDQ1OCA2MzdUNTE1IDU3OFQ1MzcgNDgyUTUzNyA0MTkgNTEzIDM3M1Q0MjUgMzA0VjMwM1E0MzYgMjk4IDQ0NCAyODZUNDU2IDI2MUw1NTUgMEg0NTlaTTQ0NyA0NzVRNDQ3IDUxNCA0MzUgNTM4VDQwMSA1NzdUMzUwIDU5NlQyODggNjAyUTI1OCA2MDIgMjMyIDYwMVQxNzcgNTk1VjM1MkgzMDhRMzQwIDM1MiAzNjYgMzU4VDQxMCAzNzhUNDM3IDQxNVQ0NDcgNDc1Wk00MzQgODAzTDI5MCA3MDVMMTQ2IDgwM0wxODEgODUxTDI4OSA3NzVMMzk4IDg1MUw0MzQgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU5OyIgaG9yaXotYWR2LXg9IjM1OSIgZD0iTTMxNyA0MzZRMjQ2IDQzNiAyMDUgNDExVDE2MyAzMThWMEg3NlY1MDJIMTUwTDE1OCA0MzhIMTU5UTE4MiA0NzcgMjIwIDQ5NVQzMTMgNTEzSDMzOVY0MzZIMzE3Wk0zNjQgNjYzTDIyMCA1NjVMNzYgNjYzTDExMSA3MTFMMjE5IDYzNUwzMjggNzExTDM2NCA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUE7IiBob3Jpei1hZHYteD0iNTM5IiBkPSJNNDg4IDE4NVE0ODggODcgNDI4IDM4VDI2OSAtMTFRMjAyIC0xMSAxNDcgNlQzNiA2Mkw3OCAxMzBRMTE3IDEwMSAxNjMgODJUMjYzIDYyUTMyMiA2MiAzNTkgOTBUMzk2IDE4MVEzOTYgMjEyIDM4MSAyMzJUMzQxIDI2OFQyODUgMjk2VDIyMCAzMjJRMTg4IDMzNCAxNTkgMzQ5VDEwNiAzODZUNjkgNDM3VDU1IDUwOVE1NSA1NTUgNzMgNTg3VDEyMCA2MzlUMTg3IDY2OFQyNjYgNjc3UTMyMSA2NzcgMzcwIDY2MlQ0NjggNjE4TDQzNCA1NDVRMzk4IDU3MSAzNTcgNTg3VDI2OSA2MDNRMjQ1IDYwMyAyMjMgNTk4VDE4NCA1ODJUMTU3IDU1NFQxNDcgNTExUTE0NyA0ODUgMTU4IDQ2N1QxODkgNDM2VDIzMyA0MTJUMjg4IDM5MVEzMjMgMzc5IDM1OCAzNjRUNDIzIDMyNlQ0NzAgMjY5VDQ4OCAxODVaTTI1OSA3MDdMMjEwIDczOEwzNDcgODU5TDQzMyA4MTdMMjU5IDcwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QjsiIGhvcml6LWFkdi14PSI0NTAiIGQ9Ik00MDggMTQxUTQwOCAxMDEgMzk1IDczVDM1NyAyNlQzMDAgLTJUMjI4IC0xMVExNzMgLTExIDEyNiAyVDM1IDQyTDY3IDEwNlExMDIgODMgMTQ1IDY5VDIyNyA1NVEyNjkgNTUgMjk3IDczVDMyNSAxMzZRMzI1IDE1NiAzMTYgMTY5VDI5MSAxOTJUMjU1IDIwOVQyMTIgMjIyUTE4MCAyMzEgMTUxIDI0MlQ5OSAyNzFUNjMgMzE0VDQ5IDM3OVE0OSA0MTMgNjMgNDM4VDEwMSA0ODBUMTU4IDUwNVQyMjkgNTE0UTI3MyA1MTQgMzEzIDUwNFQzOTIgNDc1TDM2NyA0MDlRMzQxIDQyNSAzMDUgNDM1VDIzMyA0NDZRMjEyIDQ0NiAxOTQgNDQzVDE2MiA0MzFUMTQwIDQwOVQxMzIgMzc2UTEzMiAzNTcgMTQyIDM0NVQxNjggMzI0VDIwNyAzMDlUMjU0IDI5NFEyODIgMjg1IDMwOSAyNzRUMzU5IDI0NlQzOTQgMjA0VDQwOCAxNDFaTTIxMCA1NjVMMTYxIDU5NkwyOTggNzE3TDM4NCA2NzVMMjEwIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QzsiIGhvcml6LWFkdi14PSI1MzkiIGQ9Ik00ODggMTg1UTQ4OCA4NyA0MjggMzhUMjY5IC0xMVEyMDIgLTExIDE0NyA2VDM2IDYyTDc4IDEzMFExMTcgMTAxIDE2MyA4MlQyNjMgNjJRMzIyIDYyIDM1OSA5MFQzOTYgMTgxUTM5NiAyMTIgMzgxIDIzMlQzNDEgMjY4VDI4NSAyOTZUMjIwIDMyMlExODggMzM0IDE1OSAzNDlUMTA2IDM4NlQ2OSA0MzdUNTUgNTA5UTU1IDU1NSA3MyA1ODdUMTIwIDYzOVQxODcgNjY4VDI2NiA2NzdRMzIxIDY3NyAzNzAgNjYyVDQ2OCA2MThMNDM0IDU0NVEzOTggNTcxIDM1NyA1ODdUMjY5IDYwM1EyNDUgNjAzIDIyMyA1OThUMTg0IDU4MlQxNTcgNTU0VDE0NyA1MTFRMTQ3IDQ4NSAxNTggNDY3VDE4OSA0MzZUMjMzIDQxMlQyODggMzkxUTMyMyAzNzkgMzU4IDM2NFQ0MjMgMzI2VDQ3MCAyNjlUNDg4IDE4NVpNMzkwIDcwM0wyNzIgNzgyTDE1MyA3MDNMMTE2IDc1M0wyNzEgODUxTDQyOCA3NTNMMzkwIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RDsiIGhvcml6LWFkdi14PSI0NTAiIGQ9Ik00MDggMTQxUTQwOCAxMDEgMzk1IDczVDM1NyAyNlQzMDAgLTJUMjI4IC0xMVExNzMgLTExIDEyNiAyVDM1IDQyTDY3IDEwNlExMDIgODMgMTQ1IDY5VDIyNyA1NVEyNjkgNTUgMjk3IDczVDMyNSAxMzZRMzI1IDE1NiAzMTYgMTY5VDI5MSAxOTJUMjU1IDIwOVQyMTIgMjIyUTE4MCAyMzEgMTUxIDI0MlQ5OSAyNzFUNjMgMzE0VDQ5IDM3OVE0OSA0MTMgNjMgNDM4VDEwMSA0ODBUMTU4IDUwNVQyMjkgNTE0UTI3MyA1MTQgMzEzIDUwNFQzOTIgNDc1TDM2NyA0MDlRMzQxIDQyNSAzMDUgNDM1VDIzMyA0NDZRMjEyIDQ0NiAxOTQgNDQzVDE2MiA0MzFUMTQwIDQwOVQxMzIgMzc2UTEzMiAzNTcgMTQyIDM0NVQxNjggMzI0VDIwNyAzMDlUMjU0IDI5NFEyODIgMjg1IDMwOSAyNzRUMzU5IDI0NlQzOTQgMjA0VDQwOCAxNDFaTTM1OSA1NjNMMjQxIDY0MkwxMjIgNTYzTDg1IDYxM0wyNDAgNzExTDM5NyA2MTNMMzU5IDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RTsiIGhvcml6LWFkdi14PSI1MzkiIGQ9Ik0zNTcgLTEyOFEzNTcgLTE2NiAzMzEgLTE4OFQyNTkgLTIxMFEyMzYgLTIxMCAyMTQgLTIwNFQxNzUgLTE4N0wxOTAgLTE1MVEyMDcgLTE2MCAyMjIgLTE2NVQyNTYgLTE3MVEyNzYgLTE3MSAyOTEgLTE2MlQzMDYgLTEzMFEzMDYgLTEwOCAyOTIgLTk5VDI1NyAtOTBRMjQ2IC05MCAyMzcgLTkyVDIxOSAtOTZMMjAxIC04MUwyMzggLTEwUTE4MSAtNiAxMzMgMTFUMzYgNjJMNzggMTMwUTExNyAxMDEgMTYyIDgyVDI2MyA2MlEyOTIgNjIgMzE2IDY5VDM1OCA5MFQzODYgMTI3VDM5NiAxODFRMzk2IDIxMiAzODEgMjMyVDM0MSAyNjhUMjg0IDI5NlQyMTkgMzIyUTE4OCAzMzQgMTU5IDM0OVQxMDYgMzg2VDY5IDQzN1Q1NSA1MDlRNTUgNTU1IDcyIDU4N1QxMTkgNjM5VDE4NyA2NjhUMjY2IDY3N1EzMjEgNjc3IDM3MCA2NjJUNDY4IDYxOEw0MzQgNTQ1UTM5OCA1NzEgMzU3IDU4N1QyNjggNjAzUTI0NCA2MDMgMjIzIDU5OFQxODUgNTgyVDE1OCA1NTRUMTQ4IDUxMVExNDggNDg1IDE1OSA0NjdUMTg5IDQzNlQyMzQgNDEyVDI4OCAzOTFRMzIzIDM3OSAzNTggMzY0VDQyMyAzMjZUNDcwIDI2OVQ0ODggMTg1UTQ4OCA5MCA0MzMgNDJUMjg0IC0xMEwyNTkgLTU3TDI2MCAtNThRMjY1IC01NiAyNzIgLTU2VDI4NCAtNTVRMzE4IC01NSAzMzcgLTczVDM1NyAtMTI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVGOyIgaG9yaXotYWR2LXg9IjQ1MCIgZD0iTTMyMiAtMTI3UTMyMiAtMTY1IDI5NSAtMTg3VDIyMyAtMjA5UTIwMCAtMjA5IDE3OCAtMjAzVDEzOSAtMTg2TDE1NCAtMTUxUTE3MCAtMTYwIDE4NSAtMTY1VDIyMCAtMTcwUTIzOSAtMTcwIDI1NSAtMTYxVDI3MSAtMTI5UTI3MSAtMTA3IDI1NyAtOThUMjIxIC04OVEyMTAgLTg5IDIwMSAtOTFUMTgzIC05NUwxNjUgLTgwTDIwMiAtMTBRMTU0IC03IDExNCA2VDM1IDQyTDY3IDEwNlExMDIgODMgMTQ1IDY5VDIyNyA1NVEyNjkgNTUgMjk3IDczVDMyNiAxMzZRMzI2IDE1NyAzMTcgMTcxVDI5MSAxOTVUMjU1IDIxMlQyMTIgMjI2UTE4MCAyMzUgMTUxIDI0NlQ5OSAyNzRUNjMgMzE2VDQ5IDM3OVE0OSA0MTMgNjMgNDM4VDEwMSA0ODBUMTU4IDUwNVQyMjkgNTE0UTI3MyA1MTQgMzEzIDUwNFQzOTIgNDc1TDM2OCA0MTJRMzQxIDQyOCAzMDUgNDM5VDIzNCA0NTBRMTkyIDQ1MCAxNjIgNDM1VDEzMiAzNzlRMTMyIDM2MCAxNDIgMzQ3VDE2OCAzMjVUMjA3IDMwOFQyNTQgMjk0UTI4MiAyODYgMzA5IDI3NVQzNTkgMjQ3VDM5NCAyMDRUNDA4IDE0MVE0MDggNjYgMzY0IDMwVDI0OCAtMTBMMjIyIC01N0wyMjMgLTU4UTIyOCAtNTcgMjM1IC01N1QyNDcgLTU2UTI4MSAtNTYgMzAxIC03M1QzMjIgLTEyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGhvcml6LWFkdi14PSI1MzkiIGQ9Ik00ODggMTg1UTQ4OCA4NyA0MjggMzhUMjY5IC0xMVEyMDIgLTExIDE0NyA2VDM2IDYyTDc4IDEzMFExMTcgMTAxIDE2MyA4MlQyNjMgNjJRMzIyIDYyIDM1OSA5MFQzOTYgMTgxUTM5NiAyMTIgMzgxIDIzMlQzNDEgMjY4VDI4NSAyOTZUMjIwIDMyMlExODggMzM0IDE1OSAzNDlUMTA2IDM4NlQ2OSA0MzdUNTUgNTA5UTU1IDU1NSA3MyA1ODdUMTIwIDYzOVQxODcgNjY4VDI2NiA2NzdRMzIxIDY3NyAzNzAgNjYyVDQ2OCA2MThMNDM0IDU0NVEzOTggNTcxIDM1NyA1ODdUMjY5IDYwM1EyNDUgNjAzIDIyMyA1OThUMTg0IDU4MlQxNTcgNTU0VDE0NyA1MTFRMTQ3IDQ4NSAxNTggNDY3VDE4OSA0MzZUMjMzIDQxMlQyODggMzkxUTMyMyAzNzkgMzU4IDM2NFQ0MjMgMzI2VDQ3MCAyNjlUNDg4IDE4NVpNNDE0IDgwM0wyNzAgNzA1TDEyNiA4MDNMMTYxIDg1MUwyNjkgNzc1TDM3OCA4NTFMNDE0IDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGhvcml6LWFkdi14PSI0NTAiIGQ9Ik00MDggMTQxUTQwOCAxMDEgMzk1IDczVDM1NyAyNlQzMDAgLTJUMjI4IC0xMVExNzMgLTExIDEyNiAyVDM1IDQyTDY3IDEwNlExMDIgODMgMTQ1IDY5VDIyNyA1NVEyNjkgNTUgMjk3IDczVDMyNSAxMzZRMzI1IDE1NiAzMTYgMTY5VDI5MSAxOTJUMjU1IDIwOVQyMTIgMjIyUTE4MCAyMzEgMTUxIDI0MlQ5OSAyNzFUNjMgMzE0VDQ5IDM3OVE0OSA0MTMgNjMgNDM4VDEwMSA0ODBUMTU4IDUwNVQyMjkgNTE0UTI3MyA1MTQgMzEzIDUwNFQzOTIgNDc1TDM2NyA0MDlRMzQxIDQyNSAzMDUgNDM1VDIzMyA0NDZRMjEyIDQ0NiAxOTQgNDQzVDE2MiA0MzFUMTQwIDQwOVQxMzIgMzc2UTEzMiAzNTcgMTQyIDM0NVQxNjggMzI0VDIwNyAzMDlUMjU0IDI5NFEyODIgMjg1IDMwOSAyNzRUMzU5IDI0NlQzOTQgMjA0VDQwOCAxNDFaTTM4MCA2NjNMMjM2IDU2NUw5MiA2NjNMMTI3IDcxMUwyMzUgNjM1TDM0NCA3MTFMMzgwIDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MjsiIGhvcml6LWFkdi14PSI1MDUiIGQ9Ik0yOTggNTg4VjBIMjA3VjU4OEgxOVY2NjdINDg2VjU4OEgyOThaTTIzMiAtMjE0SDE3MkwxOTkgLTYwSDI5NkwyMzIgLTIxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MzsiIGhvcml6LWFkdi14PSIzNTIiIGQ9Ik0zMTEgLTFRMjk1IC0zIDI3OSAtNFQyNDcgLTZRMjAyIC02IDE3NCAyVDEzMSAyN1QxMTAgNjhUMTA1IDEyNlY0MzFIMjJWNTAySDEwNlY2NDBIMTkyVjUwMkgzMTFWNDMxSDE5MlYxMzlRMTkyIDExOSAxOTQgMTA2VDIwNCA4NFQyMzAgNzFUMjc5IDY3UTI4OCA2NyAyOTQgNjdUMzExIDY4Vi0xSDMxMVpNMjAyIC0yMTNIMTQyTDE2OSAtNTlIMjY2TDIwMiAtMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY0OyIgaG9yaXotYWR2LXg9IjUwNSIgZD0iTTI5OCA1ODhWMEgyMDdWNTg4SDE5VjY2N0g0ODZWNTg4SDI5OFpNMzk5IDgwM0wyNTUgNzA1TDExMSA4MDNMMTQ2IDg1MUwyNTQgNzc1TDM2MyA4NTFMMzk5IDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NTsiIGhvcml6LWFkdi14PSIzNTIiIGQ9Ik0zMTEgLTFRMjk1IC0zIDI3OSAtNFQyNDcgLTZRMjAyIC02IDE3NCAyVDEzMSAyN1QxMTAgNjhUMTA1IDEyNlY0MzFIMjJWNTAySDEwNlY2NDBIMTkyVjUwMkgzMTFWNDMxSDE5MlYxMzlRMTkyIDExOSAxOTQgMTA2VDIwNCA4NFQyMzAgNzFUMjc5IDY3UTI4OCA2NyAyOTQgNjdUMzExIDY4Vi0xWk0zNDEgNTM1SDI4MkwzMTUgNzAwSDQwOEwzNDEgNTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY2OyIgaG9yaXotYWR2LXg9IjUwNSIgZD0iTTI5OCAzMjRWMEgyMDdWMzI0SDQ5VjM5NkgyMDdWNTg4SDE5VjY2N0g0ODZWNTg4SDI5OFYzOTZINDU2VjMyNEgyOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjc7IiBob3Jpei1hZHYteD0iMzUyIiBkPSJNMTkyIDI3MFYxMzlRMTkyIDExOSAxOTQgMTA2VDIwNCA4NFQyMzAgNzFUMjc5IDY3SDMxMVYtMVEyOTUgLTMgMjc5IC00VDI0NyAtNlEyMDIgLTYgMTc0IDJUMTMxIDI3VDExMCA2OFQxMDUgMTI2VjI3MEgyMlYzMzhIMTA1VjQzMUgyMlY1MDJIMTA2VjY0MEgxOTJWNTAySDMxMVY0MzFIMTkyVjMzOEgzMTFWMjcwSDE5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2ODsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik01ODMgMjU5UTU4MyAxMjAgNTI1IDU1VDMzNCAtMTFRMjAyIC0xMSAxNDQgNTVUODYgMjU5VjY2N0gxNzdWMjU5UTE3NyAyMTYgMTg0IDE4MVQyMDggMTIwVDI1NiA4MFQzMzQgNjVRMzgxIDY1IDQxMSA3OVQ0NjAgMTE5VDQ4NSAxODBUNDkyIDI1OVY2NjdINTgzVjI1OUg1ODNaTTQ5OCA3ODFRNDg3IDc0NSA0NjEgNzI4VDQwNiA3MTBRMzg4IDcxMCAzNzAgNzE2VDMzNCA3MjlUMzAwIDc0M1QyNjkgNzUwUTI1MiA3NTAgMjM4IDc0MlQyMTMgNzA5TDE2OSA3NDNRMTg3IDc4NCAyMTAgNzk5VDI2MiA4MTRRMjgwIDgxNCAyOTggODA4VDMzNSA3OTRUMzY5IDc4MFQ0MDAgNzc0UTQxNyA3NzQgNDMxIDc4MlQ0NTMgODE0TDQ5OCA3ODFINDk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY5OyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTQwNiAwTDM5OCA2M0gzOTVRMzc2IDMxIDM0MCAxMFQyNDQgLTExUTIwNCAtMTEgMTczIC0yVDEyMCAzMFQ4NyA5MlQ3NiAxOTJWNTAySDE2M1YyMzdRMTYzIDE5NSAxNjYgMTYzVDE3OSAxMDhUMjExIDc0VDI2OSA2MlEzMDQgNjIgMzI3IDcxVDM2NSA5OFQzODYgMTM5VDM5MiAxOTRWNTAySDQ3OVYwSDQwNlpNNDM5IDY0MVE0MjggNjA1IDQwMiA1ODhUMzQ3IDU3MFEzMjkgNTcwIDMxMSA1NzZUMjc1IDU4OVQyNDEgNjAzVDIxMCA2MTBRMTkzIDYxMCAxNzkgNjAyVDE1NCA1NjlMMTEwIDYwM1ExMjggNjQ0IDE1MSA2NTlUMjAzIDY3NFEyMjEgNjc0IDIzOSA2NjhUMjc2IDY1NFQzMTAgNjQwVDM0MSA2MzRRMzU4IDYzNCAzNzIgNjQyVDM5NCA2NzRMNDM5IDY0MUg0MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNTgzIDI1OVE1ODMgMTIwIDUyNSA1NVQzMzQgLTExUTIwMiAtMTEgMTQ0IDU1VDg2IDI1OVY2NjdIMTc3VjI1OVExNzcgMjE2IDE4NCAxODFUMjA4IDEyMFQyNTYgODBUMzM0IDY1UTM4MSA2NSA0MTEgNzlUNDYwIDExOVQ0ODUgMTgwVDQ5MiAyNTlWNjY3SDU4M1YyNTlINTgzWk0xODggNzI5Vjc4Nkg0ODZWNzI5SDE4OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QjsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMEwzOTggNjNIMzk1UTM3NiAzMSAzNDAgMTBUMjQ0IC0xMVEyMDQgLTExIDE3MyAtMlQxMjAgMzBUODcgOTJUNzYgMTkyVjUwMkgxNjNWMjM3UTE2MyAxOTUgMTY2IDE2M1QxNzkgMTA4VDIxMSA3NFQyNjkgNjJRMzA0IDYyIDMyNyA3MVQzNjUgOThUMzg2IDEzOVQzOTIgMTk0VjUwMkg0NzlWMEg0MDZaTTEyNyA1ODlWNjQ2SDQyNVY1ODlIMTI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTU4MyAyNTlRNTgzIDEyMCA1MjUgNTVUMzM0IC0xMVEyMDIgLTExIDE0NCA1NVQ4NiAyNTlWNjY3SDE3N1YyNTlRMTc3IDIxNiAxODQgMTgxVDIwOCAxMjBUMjU2IDgwVDMzNCA2NVEzODEgNjUgNDExIDc5VDQ2MCAxMTlUNDg1IDE4MFQ0OTIgMjU5VjY2N0g1ODNWMjU5SDU4M1pNNDgwIDgyN1E0NzcgNzkyIDQ2MyA3NjlUNDI3IDczMVQzODIgNzExVDMzMyA3MDVRMzA5IDcwNSAyODUgNzExVDI0MCA3MzFUMjA2IDc2OFQxODggODI3SDI0OFEyNTIgNzk2IDI3MiA3NzVUMzMzIDc1NFEzNzMgNzU0IDM5NSA3NzVUNDE5IDgyN0g0ODBINDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZEOyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTQwNiAwTDM5OCA2M0gzOTVRMzc2IDMxIDM0MCAxMFQyNDQgLTExUTIwNCAtMTEgMTczIC0yVDEyMCAzMFQ4NyA5MlQ3NiAxOTJWNTAySDE2M1YyMzdRMTYzIDE5NSAxNjYgMTYzVDE3OSAxMDhUMjExIDc0VDI2OSA2MlEzMDQgNjIgMzI3IDcxVDM2NSA5OFQzODYgMTM5VDM5MiAxOTRWNTAySDQ3OVYwSDQwNlpNNDI3IDY4N1E0MjQgNjUyIDQxMCA2MjlUMzc0IDU5MVQzMjkgNTcxVDI4MCA1NjVRMjU2IDU2NSAyMzIgNTcxVDE4NyA1OTFUMTUzIDYyOFQxMzUgNjg3SDE5NVExOTkgNjU2IDIxOSA2MzVUMjgwIDYxNFEzMjAgNjE0IDM0MiA2MzVUMzY2IDY4N0g0MjdINDI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZFOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTU4MyAyNTlRNTgzIDEyMCA1MjUgNTVUMzM0IC0xMVEyMDIgLTExIDE0NCA1NVQ4NiAyNTlWNjY3SDE3N1YyNTlRMTc3IDIxNiAxODQgMTgxVDIwOCAxMjBUMjU2IDgwVDMzNCA2NVEzODEgNjUgNDExIDc5VDQ2MCAxMTlUNDg1IDE4MFQ0OTIgMjU5VjY2N0g1ODNWMjU5SDU4M1pNNDMxIDc4MVE0MzEgNzQxIDQwNCA3MTVUMzM2IDY4OFEyOTYgNjg4IDI2OCA3MTRUMjQwIDc4MVEyNDAgODIxIDI2NyA4NDdUMzM2IDg3NFEzNzYgODc0IDQwMyA4NDhUNDMxIDc4MVpNMzg5IDc4MVEzODkgODA0IDM3NCA4MTlUMzM2IDgzNVEzMTMgODM1IDI5OCA4MjBUMjgyIDc4MVEyODIgNzU4IDI5NyA3NDNUMzM2IDcyN1EzNTkgNzI3IDM3NCA3NDJUMzg5IDc4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RjsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMEwzOTggNjNIMzk1UTM3NiAzMSAzNDAgMTBUMjQ0IC0xMVEyMDQgLTExIDE3MyAtMlQxMjAgMzBUODcgOTJUNzYgMTkyVjUwMkgxNjNWMjM3UTE2MyAxOTUgMTY2IDE2M1QxNzkgMTA4VDIxMSA3NFQyNjkgNjJRMzA0IDYyIDMyNyA3MVQzNjUgOThUMzg2IDEzOVQzOTIgMTk0VjUwMkg0NzlWMEg0MDZaTTM3NCA2NTdRMzc0IDYxNyAzNDcgNTkxVDI3OSA1NjRRMjM5IDU2NCAyMTEgNTkwVDE4MyA2NTdRMTgzIDY5NyAyMTAgNzIzVDI3OSA3NTBRMzE5IDc1MCAzNDYgNzI0VDM3NCA2NTdaTTMzMiA2NTdRMzMyIDY4MCAzMTcgNjk1VDI3OSA3MTFRMjU2IDcxMSAyNDEgNjk2VDIyNSA2NTdRMjI1IDYzNCAyNDAgNjE5VDI3OSA2MDNRMzAyIDYwMyAzMTcgNjE4VDMzMiA2NTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNTgzIDI1OVE1ODMgMTIwIDUyNSA1NVQzMzQgLTExUTIwMiAtMTEgMTQ0IDU1VDg2IDI1OVY2NjdIMTc3VjI1OVExNzcgMjE2IDE4NCAxODFUMjA4IDEyMFQyNTYgODBUMzM0IDY1UTM4MSA2NSA0MTEgNzlUNDYwIDExOVQ0ODUgMTgwVDQ5MiAyNTlWNjY3SDU4M1YyNTlINTgzWk00NTYgNzA4TDQxMCA3MzVMNTUxIDg1Nkw2MzEgODE4TDQ1NiA3MDhaTTIyNiA3MDhMMTgxIDczNUwzMjIgODU2TDQwMiA4MThMMjI2IDcwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MTsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMEwzOTggNjNIMzk1UTM3NiAzMSAzNDAgMTBUMjQ0IC0xMVEyMDQgLTExIDE3MyAtMlQxMjAgMzBUODcgOTJUNzYgMTkyVjUwMkgxNjNWMjM3UTE2MyAxOTUgMTY2IDE2M1QxNzkgMTA4VDIxMSA3NFQyNjkgNjJRMzA0IDYyIDMyNyA3MVQzNjUgOThUMzg2IDEzOVQzOTIgMTk0VjUwMkg0NzlWMEg0MDZaTTQwNyA1NjhMMzYxIDU5NUw1MDIgNzE2TDU4MiA2NzhMNDA3IDU2OFpNMTc3IDU2OEwxMzIgNTk1TDI3MyA3MTZMMzUzIDY3OEwxNzcgNTY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcyOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTU4MyAyNTlRNTgzIDE1NiA1NTIgOTVUNDUxIDdRNDIyIC0xMSA0MDUgLTI3VDM3NyAtNTlUMzYzIC04N1QzNTkgLTExNFEzNTkgLTE0MyAzNzYgLTE1OVQ0MjAgLTE3NlE0NDAgLTE3NiA0NTMgLTE3MVQ0NzcgLTE2MEw0OTMgLTIxMFE0ODIgLTIxNiA0NTcgLTIyM1Q0MDcgLTIzMVEzNDkgLTIzMSAzMjIgLTIwMVQyOTUgLTEyNlEyOTUgLTkyIDMxNCAtNjJUMzY4IC05UTM2MCAtMTAgMzUyIC0xMFQzMzQgLTExUTIwMiAtMTEgMTQ0IDU1VDg2IDI1OVY2NjdIMTc3VjI1OVExNzcgMjE2IDE4NCAxODFUMjA4IDEyMFQyNTYgODBUMzM0IDY1UTM4MSA2NSA0MTEgNzlUNDYwIDExOVQ0ODUgMTgwVDQ5MiAyNTlWNjY3SDU4M1YyNTlINTgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTQ1NCAwUTM5NyAtMzYgMzgwIC02NVQzNjIgLTEyMVEzNjIgLTE0OSAzNzkgLTE2NlQ0MjMgLTE4M1E0NDMgLTE4MyA0NTYgLTE3OFQ0ODAgLTE2N0w0OTYgLTIxN1E0ODUgLTIyMyA0NjAgLTIzMFQ0MTAgLTIzOFEzNTIgLTIzOCAzMjUgLTIwOFQyOTggLTEzM1EyOTggLTg5IDMyNyAtNTRUNDA2IDRMMzk4IDYzSDM5NVEzNzYgMzEgMzQwIDEwVDI0NCAtMTFRMjA0IC0xMSAxNzMgLTJUMTIwIDMwVDg3IDkyVDc2IDE5MlY1MDJIMTYzVjIzN1ExNjMgMTk1IDE2NiAxNjNUMTc5IDEwOFQyMTEgNzRUMjY5IDYyUTMwNCA2MiAzMjcgNzFUMzY1IDk4VDM4NiAxMzlUMzkyIDE5NFY1MDJINDc5VjBINDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc0OyIgaG9yaXotYWR2LXg9IjkxNiIgZD0iTTcxMiAwSDYwOEw0NTggNTM4SDQ1NEwzMDcgMEgxOTZMMzAgNjY3SDEzMEwyNTYgMTA1SDI2MUw0MTMgNjY3SDUwNUw2NTcgMTA1SDY2MUw3ODkgNjY3SDg4Nkw3MTIgMFpNNTc3IDcwM0w0NTkgNzgyTDM0MCA3MDNMMzAzIDc1M0w0NTggODUxTDYxNSA3NTNMNTc3IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NTsiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik01NzYgMEg0ODNMMzc0IDM3M0gzNzBMMjYxIDBIMTY4TDI1IDUwMkgxMTVMMjE4IDg2SDIyMkwzMzcgNTAySDQwOEw1MjQgODZINTI4TDYzNCA1MDJINzIyTDU3NiAwWk00OTMgNTYzTDM3NSA2NDJMMjU2IDU2M0wyMTkgNjEzTDM3NCA3MTFMNTMxIDYxM0w0OTMgNTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc2OyIgaG9yaXotYWR2LXg9IjU3MiIgZD0iTTMzMiAyNjVWMEgyNDFWMjYyTDEzIDY2N0gxMTZMMjg3IDM0NUw0NTkgNjY3SDU1OUwzMzIgMjY1Wk00MDcgNzAzTDI4OSA3ODJMMTcwIDcwM0wxMzMgNzUzTDI4OCA4NTFMNDQ1IDc1M0w0MDcgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc3OyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTI2NiAtNjVRMjQ4IC0xMTMgMjMzIC0xNDRUMTk4IC0xOTNUMTU2IC0yMTlUOTggLTIyNlE3NyAtMjI2IDQ0IC0yMjNWLTE0OVE1MiAtMTUxIDYyIC0xNTFUODggLTE1MlExMDcgLTE1MiAxMjAgLTE0OFQxNDMgLTEzMlQxNjMgLTEwMFQxODMgLTQ4TDIwNyAxOEwxOCA1MDJIMTEyTDI1MSAxMTFIMjU1TDM4NCA1MDJINDc3TDI2NiAtNjVaTTM3MSA1NjNMMjUzIDY0MkwxMzQgNTYzTDk3IDYxM0wyNTIgNzExTDQwOSA2MTNMMzcxIDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3ODsiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0zMzIgMjY1VjBIMjQxVjI2MkwxMyA2NjdIMTE2TDI4NyAzNDVMNDU5IDY2N0g1NTlMMzMyIDI2NVpNNDMzIDc2MlE0MzMgNzQyIDQxOCA3MjdUMzgzIDcxMlEzNjIgNzEyIDM0NyA3MjdUMzMyIDc2MlEzMzIgNzgzIDM0NyA3OThUMzgzIDgxM1E0MDMgODEzIDQxOCA3OThUNDMzIDc2MlpNMjQ2IDc2MlEyNDYgNzQyIDIzMSA3MjdUMTk1IDcxMlExNzUgNzEyIDE2MCA3MjdUMTQ1IDc2MlExNDUgNzgzIDE2MCA3OThUMTk1IDgxM1EyMTYgODEzIDIzMSA3OThUMjQ2IDc2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3OTsiIGhvcml6LWFkdi14PSI1NTgiIGQ9Ik00NiAwVjc1TDM5OCA1ODhINjFWNjY3SDUwM1Y1OTNMMTUxIDc2SDUxMlYwSDQ2Wk0yNjMgNzA1TDIxNCA3MzZMMzUxIDg1N0w0MzcgODE1TDI2MyA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0E7IiBob3Jpei1hZHYteD0iNDU0IiBkPSJNMzkgMFY2OEwzMDggNDMxSDQ1VjUwMkg0MDdWNDMxTDEzOSA3MUg0MTVWMEgzOVpNMjEwIDU2NUwxNjEgNTk2TDI5OCA3MTdMMzg0IDY3NUwyMTAgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdCOyIgaG9yaXotYWR2LXg9IjU1OCIgZD0iTTQ2IDBWNzVMMzk4IDU4OEg2MVY2NjdINTAzVjU5M0wxNTEgNzZINTEyVjBINDZaTTM0MCA3NzBRMzQwIDc0OCAzMjYgNzM1VDI4NSA3MjFRMjYxIDcyMSAyNDYgNzM0VDIzMSA3NzBRMjMxIDc5MyAyNDYgODA2VDI4NSA4MjBRMzExIDgyMCAzMjUgODA3VDM0MCA3NzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0M7IiBob3Jpei1hZHYteD0iNDU0IiBkPSJNMzkgMFY2OEwzMDggNDMxSDQ1VjUwMkg0MDdWNDMxTDEzOSA3MUg0MTVWMEgzOVpNMjk2IDYyOVEyOTYgNjA3IDI4MiA1OTRUMjQxIDU4MFEyMTcgNTgwIDIwMiA1OTNUMTg3IDYyOVExODcgNjUyIDIwMiA2NjVUMjQxIDY3OVEyNjcgNjc5IDI4MSA2NjZUMjk2IDYyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RDsiIGhvcml6LWFkdi14PSI1NTgiIGQ9Ik00NiAwVjc1TDM5OCA1ODhINjFWNjY3SDUwM1Y1OTNMMTUxIDc2SDUxMlYwSDQ2Wk00MjggODAzTDI4NCA3MDVMMTQwIDgwM0wxNzUgODUxTDI4MyA3NzVMMzkyIDg1MUw0MjggODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdFOyIgaG9yaXotYWR2LXg9IjQ1NCIgZD0iTTM5IDBWNjhMMzA4IDQzMUg0NVY1MDJINDA3VjQzMUwxMzkgNzFINDE1VjBIMzlaTTM4MyA2NjNMMjM5IDU2NUw5NSA2NjNMMTMwIDcxMUwyMzggNjM1TDM0NyA3MTFMMzgzIDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE5MjsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01MTQgNjEzUTUwMSA2MTQgNDk1IDYxNFQ0NzYgNjE0UTQ0MSA2MTQgNDE5IDYwMVQzODggNTQ4TDM2NCA0MjlINDcxTDQ1OCAzNTZIMzUyTDI4MSAtMTBRMjczIC01MyAyNjAgLTg3VDIyNSAtMTQ0VDE3NSAtMTgwVDEwNSAtMTkzUTkxIC0xOTMgNzcgLTE5MlQ0OCAtMTg2TDYxIC0xMTlRNzIgLTEyMSA4MiAtMTIxVDEwNiAtMTIyUTEyNSAtMTIyIDE0MCAtMTEyVDE2NiAtODNUMTg1IC00MVQxOTggMTJMMjYzIDM1NkgxODdMMjAwIDQyOUgyNzVMMjk4IDU0OFEzMDUgNTg2IDMxNiA2MTFUMzQ5IDY1M1Q0MDEgNjc1VDQ4MSA2ODJRNDkzIDY4MiA1MDIgNjgyVDUyNiA2ODFMNTE0IDYxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFGQzsiIGhvcml6LWFkdi14PSI4OTgiIGQ9Ik00NTEgMFYxNjRIMjA1TDExOCAwSDIyTDM5MyA2NjdIODUwVjU5MUg1NDFWMzkySDgyMFYzMTRINTQxVjc2SDg2MFYwSDQ1MVpNNDUyIDU4OUg0MzlMMjQyIDI0Mkg0NTJWNTg5Wk01ODYgNzA1TDUzNyA3MzZMNjc0IDg1N0w3NjAgODE1TDU4NiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkQ7IiBob3Jpei1hZHYteD0iODU4IiBkPSJNODA4IDI1NVE4MDggMjUwIDgwOCAyNDJUODA2IDIyMkg0NTNRNDU1IDE0NCA0OTMgMTAxVDYwNCA1OFE2NDEgNTggNjc5IDcwVDc1MSAxMDlMNzgzIDQ4UTcwMCAtMTEgNjAzIC0xMVE1MzcgLTExIDQ4OSAxMlQ0MTIgNzdRMzcxIDQwIDMyMCAxNVQyMDIgLTExUTEzMyAtMTEgODkgMjhUNDUgMTQwUTQ1IDE5MiA2OCAyMjdUMTMyIDI4M1QyMzIgMzEzVDM2MiAzMjJWMzQ3UTM2MiAzNzIgMzU5IDM5MFQzNDUgNDIxVDMxOCA0NDBUMjcyIDQ0NlEyMjcgNDQ2IDE3OSA0MzFUOTAgMzg4TDU5IDQ1MlExMTMgNDgxIDE2NCA0OTdUMjc2IDUxNFEzMjggNTE0IDM2OSA0OTdUNDI1IDQzMFE0NTQgNDcyIDQ5NyA0OTNUNTkzIDUxNVE2NDIgNTE1IDY4MiA0OThUNzUwIDQ0OFQ3OTMgMzY3VDgwOCAyNTVaTTcyNyAyODNRNzI2IDMxNyA3MTkgMzQ3VDY5NiAzOTlUNjU1IDQzNVQ1OTIgNDQ4UTUzMiA0NDggNDkyIDQwNlQ0NTIgMjgzSDcyN1pNMzg0IDEyNVEzNzEgMTUxIDM2NyAxODJUMzYzIDI0NVYyNjdRMjQ1IDI2NyAxODggMjM4VDEzMSAxNDRRMTMxIDEyMyAxMzggMTA2VDE1OSA3NlQxODkgNTZUMjI1IDQ4UTI2MyA0OCAzMDQgNjlUMzg0IDEyNVpNNDQ2IDU2NUwzOTcgNTk2TDUzNCA3MTdMNjIwIDY3NUw0NDYgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZFOyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTY4MSAzMzRRNjgxIDI1OSA2NjMgMTk2VDYwNyA4N1Q1MTEgMTVUMzczIC0xMVEzMTQgLTExIDI2OCAzVDE4NSA0M0wxMzIgLTI0TDc4IDI1TDEzMyA5NFE5OCAxNDAgODIgMjAxVDY1IDMzNFE2NSA0MDYgODMgNDY4VDEzOCA1NzdUMjM0IDY1MVQzNzMgNjc4UTQzMCA2NzggNDc1IDY2NVQ1NTYgNjI2TDYwNyA2OTBMNjYzIDY0NUw2MDkgNTc3UTY0NiA1MzAgNjYzIDQ2OVQ2ODEgMzM0Wk01ODYgMzMzUTU4NiAzODEgNTc5IDQyNVQ1NTIgNTA1TDIzNyAxMDdRMjYxIDg3IDI5NCA3NVQzNzMgNjNRNDM2IDYzIDQ3NyA4NVQ1NDMgMTQ1VDU3NiAyMzJUNTg2IDMzM1pNMTYwIDMzM1ExNjAgMjg4IDE2NyAyNDVUMTkxIDE2N0w1MDYgNTYzUTQ4MiA1ODMgNDUwIDU5M1QzNzMgNjA0UTMxMCA2MDQgMjY5IDU4MlQyMDQgNTIyVDE3MCA0MzVUMTYwIDMzM1pNMzUyIDcwN0wzMDMgNzM4TDQ0MCA4NTlMNTI2IDgxN0wzNTIgNzA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZGOyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTUzIDI1MFE1MyAzMDUgNjYgMzUzVDEwNyA0MzdUMTc5IDQ5M1QyODYgNTE0UTM2OCA1MTQgNDI0IDQ3NUw0NzcgNTM4TDUyMiA0OTlMNDY3IDQzNFE0OTQgMzk5IDUwNyAzNTNUNTIxIDI1MFE1MjEgMTk1IDUwNyAxNDhUNDY1IDY1VDM5MiA5VDI4NiAtMTFRMjM2IC0xMSAxOTggMlQxMzIgMzlMODMgLTE4TDQxIDIyTDk0IDg1UTczIDExOCA2MyAxNjBUNTMgMjUwWk00MzIgMjUxUTQzMiAyODQgNDI4IDMxNFQ0MTIgMzY5TDE4MiA5OVExOTkgNzkgMjI0IDY4VDI4NyA1NlEzMjkgNTYgMzU3IDcxVDQwMSAxMTNUNDI1IDE3NVQ0MzIgMjUxWk0xNDIgMjUxUTE0MiAyMjUgMTQ0IDIwMVQxNTQgMTU1TDM3NSA0MThRMzQyIDQ0NSAyODcgNDQ1UTI0NSA0NDUgMjE3IDQzMFQxNzMgMzg4VDE0OSAzMjdUMTQyIDI1MVpNMjgwIDU2NUwyMzEgNTk2TDM2OCA3MTdMNDU0IDY3NUwyODAgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE4OyIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTQ4OCAxODVRNDg4IDg3IDQyOCAzOFQyNjkgLTExUTIwMiAtMTEgMTQ3IDZUMzYgNjJMNzggMTMwUTExNyAxMDEgMTYzIDgyVDI2MyA2MlEzMjIgNjIgMzU5IDkwVDM5NiAxODFRMzk2IDIxMiAzODEgMjMyVDM0MSAyNjhUMjg1IDI5NlQyMjAgMzIyUTE4OCAzMzQgMTU5IDM0OVQxMDYgMzg2VDY5IDQzN1Q1NSA1MDlRNTUgNTU1IDczIDU4N1QxMjAgNjM5VDE4NyA2NjhUMjY2IDY3N1EzMjEgNjc3IDM3MCA2NjJUNDY4IDYxOEw0MzQgNTQ1UTM5OCA1NzEgMzU3IDU4N1QyNjkgNjAzUTI0NSA2MDMgMjIzIDU5OFQxODQgNTgyVDE1NyA1NTRUMTQ3IDUxMVExNDcgNDg1IDE1OCA0NjdUMTg5IDQzNlQyMzMgNDEyVDI4OCAzOTFRMzIzIDM3OSAzNTggMzY0VDQyMyAzMjZUNDcwIDI2OVQ0ODggMTg1Wk0yNTQgLTIxM0gxOTRMMjIxIC01OUgzMThMMjU0IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTk7IiBob3Jpei1hZHYteD0iNDUwIiBkPSJNNDA4IDE0MVE0MDggMTAxIDM5NSA3M1QzNTcgMjZUMzAwIC0yVDIyOCAtMTFRMTczIC0xMSAxMjYgMlQzNSA0Mkw2NyAxMDZRMTAyIDgzIDE0NSA2OVQyMjcgNTVRMjY5IDU1IDI5NyA3M1QzMjUgMTM2UTMyNSAxNTYgMzE2IDE2OVQyOTEgMTkyVDI1NSAyMDlUMjEyIDIyMlExODAgMjMxIDE1MSAyNDJUOTkgMjcxVDYzIDMxNFQ0OSAzNzlRNDkgNDEzIDYzIDQzOFQxMDEgNDgwVDE1OCA1MDVUMjI5IDUxNFEyNzMgNTE0IDMxMyA1MDRUMzkyIDQ3NUwzNjcgNDA5UTM0MSA0MjUgMzA1IDQzNVQyMzMgNDQ2UTIxMiA0NDYgMTk0IDQ0M1QxNjIgNDMxVDE0MCA0MDlUMTMyIDM3NlExMzIgMzU3IDE0MiAzNDVUMTY4IDMyNFQyMDcgMzA5VDI1NCAyOTRRMjgyIDI4NSAzMDkgMjc0VDM1OSAyNDZUMzk0IDIwNFQ0MDggMTQxWk0yMTAgLTIxM0gxNTBMMTc3IC01OUgyNzRMMjEwIC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMzc7IiBob3Jpei1hZHYteD0iMjQ1IiBkPSJNMTY5IC0zOVExNjkgLTEyOSAxMzAgLTE3N1QtMSAtMjI2US0xOCAtMjI2IC0zNCAtMjI1VC02OCAtMjIyVi0xNDhRLTM4IC0xNTEgLTEzIC0xNTFRMTggLTE1MSAzNyAtMTQzVDY2IC0xMjBUNzkgLTgzVDgyIC0zMVY1MDJIMTY5Vi0zOUgxNjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzY7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMjk3IDU2M0wxNzkgNjQyTDYwIDU2M0wyMyA2MTNMMTc4IDcxMUwzMzUgNjEzTDI5NyA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzc7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMzIzIDY2M0wxNzkgNTY1TDM1IDY2M0w3MCA3MTFMMTc4IDYzNUwyODcgNzExTDMyMyA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyRDg7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMzI1IDY4N1EzMjIgNjUyIDMwOCA2MjlUMjcyIDU5MVQyMjcgNTcxVDE3OCA1NjVRMTU0IDU2NSAxMzAgNTcxVDg1IDU5MVQ1MSA2MjhUMzMgNjg3SDkzUTk3IDY1NiAxMTcgNjM1VDE3OCA2MTRRMjE4IDYxNCAyNDAgNjM1VDI2NCA2ODdIMzI1SDMyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEOTsiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0yMzMgNjI5UTIzMyA2MDcgMjE5IDU5NFQxNzggNTgwUTE1NCA1ODAgMTM5IDU5M1QxMjQgNjI5UTEyNCA2NTIgMTM5IDY2NVQxNzggNjc5UTIwNCA2NzkgMjE4IDY2NlQyMzMgNjI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRBOyIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTI3NCA2NTdRMjc0IDYxNyAyNDcgNTkxVDE3OSA1NjRRMTM5IDU2NCAxMTEgNTkwVDgzIDY1N1E4MyA2OTcgMTEwIDcyM1QxNzkgNzUwUTIxOSA3NTAgMjQ2IDcyNFQyNzQgNjU3Wk0yMzIgNjU3UTIzMiA2ODAgMjE3IDY5NVQxNzkgNzExUTE1NiA3MTEgMTQxIDY5NlQxMjUgNjU3UTEyNSA2MzQgMTQwIDYxOVQxNzkgNjAzUTIwMiA2MDMgMjE3IDYxOFQyMzIgNjU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRCOyIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTE5NiAtMjdRMTczIC00NCAxNTggLTY4VDE0MiAtMTE4UTE0MiAtMTQ4IDE1OSAtMTY1VDIwMyAtMTgzUTIyMyAtMTgzIDIzNiAtMTc3VDI2MCAtMTY2TDI3NyAtMjE3UTI2NSAtMjIzIDI0MCAtMjMwVDE5MCAtMjM4UTEzMyAtMjM4IDEwNiAtMjA4VDc4IC0xMzBRNzggLTEwNiA4OCAtODRUMTE3IC00M1QxNjAgLTlUMjE0IDE3TDIzNyAyTDE5NiAtMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREM7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMzQ0IDY0MVEzMzMgNjA1IDMwNyA1ODhUMjUyIDU3MFEyMzQgNTcwIDIxNiA1NzZUMTgwIDU4OVQxNDYgNjAzVDExNSA2MTBROTggNjEwIDg0IDYwMlQ1OSA1NjlMMTUgNjAzUTMzIDY0NCA1NiA2NTlUMTA4IDY3NFExMjYgNjc0IDE0NCA2NjhUMTgxIDY1NFQyMTUgNjQwVDI0NiA2MzRRMjYzIDYzNCAyNzcgNjQyVDI5OSA2NzRMMzQ0IDY0MUgzNDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREQ7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMjM3IDU2OEwxOTEgNTk1TDMzMiA3MTZMNDEyIDY3OEwyMzcgNTY4Wk03IDU2OEwtMzggNTk1TDEwMyA3MTZMMTgzIDY3OEw3IDU2OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODA7IiBob3Jpei1hZHYteD0iOTE2IiBkPSJNNzEyIDBINjA4TDQ1OCA1MzhINDU0TDMwNyAwSDE5NkwzMCA2NjdIMTMwTDI1NiAxMDVIMjYxTDQxMyA2NjdINTA1TDY1NyAxMDVINjYxTDc4OSA2NjdIODg2TDcxMiAwWk00NzggNzA1TDMwNCA4MTRMMzkyIDg1NEw1MjcgNzM1TDQ3OCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgxOyIgaG9yaXotYWR2LXg9Ijc0NyIgZD0iTTU3NiAwSDQ4M0wzNzQgMzczSDM3MEwyNjEgMEgxNjhMMjUgNTAySDExNUwyMTggODZIMjIyTDMzNyA1MDJINDA4TDUyNCA4Nkg1MjhMNjM0IDUwMkg3MjJMNTc2IDBaTTM5MCA1NjVMMjE2IDY3NEwzMDQgNzE0TDQzOSA1OTVMMzkwIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODI7IiBob3Jpei1hZHYteD0iOTE2IiBkPSJNNzEyIDBINjA4TDQ1OCA1MzhINDU0TDMwNyAwSDE5NkwzMCA2NjdIMTMwTDI1NiAxMDVIMjYxTDQxMyA2NjdINTA1TDY1NyAxMDVINjYxTDc4OSA2NjdIODg2TDcxMiAwWk00NDEgNzA1TDM5MiA3MzZMNTI5IDg1N0w2MTUgODE1TDQ0MSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgzOyIgaG9yaXotYWR2LXg9Ijc0NyIgZD0iTTU3NiAwSDQ4M0wzNzQgMzczSDM3MEwyNjEgMEgxNjhMMjUgNTAySDExNUwyMTggODZIMjIyTDMzNyA1MDJINDA4TDUyNCA4Nkg1MjhMNjM0IDUwMkg3MjJMNTc2IDBaTTM1OCA1NjVMMzA5IDU5Nkw0NDYgNzE3TDUzMiA2NzVMMzU4IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODQ7IiBob3Jpei1hZHYteD0iOTE2IiBkPSJNNzEyIDBINjA4TDQ1OCA1MzhINDU0TDMwNyAwSDE5NkwzMCA2NjdIMTMwTDI1NiAxMDVIMjYxTDQxMyA2NjdINTA1TDY1NyAxMDVINjYxTDc4OSA2NjdIODg2TDcxMiAwWk02MDMgNzYyUTYwMyA3NDIgNTg4IDcyN1Q1NTMgNzEyUTUzMiA3MTIgNTE3IDcyN1Q1MDIgNzYyUTUwMiA3ODMgNTE3IDc5OFQ1NTMgODEzUTU3MyA4MTMgNTg4IDc5OFQ2MDMgNzYyWk00MTYgNzYyUTQxNiA3NDIgNDAxIDcyN1QzNjUgNzEyUTM0NSA3MTIgMzMwIDcyN1QzMTUgNzYyUTMxNSA3ODMgMzMwIDc5OFQzNjUgODEzUTM4NiA4MTMgNDAxIDc5OFQ0MTYgNzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NTsiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik01NzYgMEg0ODNMMzc0IDM3M0gzNzBMMjYxIDBIMTY4TDI1IDUwMkgxMTVMMjE4IDg2SDIyMkwzMzcgNTAySDQwOEw1MjQgODZINTI4TDYzNCA1MDJINzIyTDU3NiAwWk01MTcgNjIyUTUxNyA2MDIgNTAyIDU4N1Q0NjcgNTcyUTQ0NiA1NzIgNDMxIDU4N1Q0MTYgNjIyUTQxNiA2NDMgNDMxIDY1OFQ0NjcgNjczUTQ4NyA2NzMgNTAyIDY1OFQ1MTcgNjIyWk0zMzAgNjIyUTMzMCA2MDIgMzE1IDU4N1QyNzkgNTcyUTI1OSA1NzIgMjQ0IDU4N1QyMjkgNjIyUTIyOSA2NDMgMjQ0IDY1OFQyNzkgNjczUTMwMCA2NzMgMzE1IDY1OFQzMzAgNjIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUVGMjsiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0zMzIgMjY1VjBIMjQxVjI2MkwxMyA2NjdIMTE2TDI4NyAzNDVMNDU5IDY2N0g1NTlMMzMyIDI2NVpNMjk0IDcwNUwxMjAgODE0TDIwOCA4NTRMMzQzIDczNUwyOTQgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUVGMzsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik0yNjYgLTY1UTI0OCAtMTEzIDIzMyAtMTQ0VDE5OCAtMTkzVDE1NiAtMjE5VDk4IC0yMjZRNzcgLTIyNiA0NCAtMjIzVi0xNDlRNTIgLTE1MSA2MiAtMTUxVDg4IC0xNTJRMTA3IC0xNTIgMTIwIC0xNDhUMTQzIC0xMzJUMTYzIC0xMDBUMTgzIC00OEwyMDcgMThMMTggNTAySDExMkwyNTEgMTExSDI1NUwzODQgNTAySDQ3N0wyNjYgLTY1Wk0yNjEgNTY1TDg3IDY3NEwxNzUgNzE0TDMxMCA1OTVMMjYxIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTM7IiBob3Jpei1hZHYteD0iNTk4IiBkPSJNNDkgMjI2VjI5NEg1NDlWMjI2SDQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxNDsiIGhvcml6LWFkdi14PSI4NzIiIGQ9Ik00OSAyMjdWMjkzSDgyM1YyMjdINDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE4OyIgaG9yaXotYWR2LXg9IjIxNSIgZD0iTTEyNiA0OTFIMTlMMTA0IDcwMEgxNjdMMTI2IDQ5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBob3Jpei1hZHYteD0iMjE1IiBkPSJNMTEwIDQ5MUg0OEw4OSA3MDBIMTk2TDExMCA0OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFBOyIgaG9yaXotYWR2LXg9IjIxNSIgZD0iTTExMCAtMTUzSDQ4TDg5IDU2SDE5NkwxMTAgLTE1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUM7IiBob3Jpei1hZHYteD0iNDAzIiBkPSJNMzE0IDQ5MUgyMDhMMjkzIDcwMEgzNTVMMzE0IDQ5MVpNMTI2IDQ5MUgxOUwxMDUgNzAwSDE2N0wxMjYgNDkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRDsiIGhvcml6LWFkdi14PSI0MDMiIGQ9Ik0yOTggNDkxSDIzNkwyNzcgNzAwSDM4NEwyOTggNDkxWk0xMTAgNDkxSDQ4TDg5IDcwMEgxOTZMMTEwIDQ5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUU7IiBob3Jpei1hZHYteD0iNDAzIiBkPSJNMjk4IC0xNTRIMjM2TDI3NyA1NkgzODRMMjk4IC0xNTRaTTExMCAtMTU0SDQ4TDg5IDU2SDE5NkwxMTAgLTE1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjA7IiBob3Jpei1hZHYteD0iMzQ5IiBkPSJNMjE4IDQ3M1YxNzFIMTMyVjQ3M0g0N1Y1NDRIMTMyVjY3NUgyMThWNTQ0SDMwMlY0NzNIMjE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMTsiIGhvcml6LWFkdi14PSIzNDkiIGQ9Ik0yMTcgMjgwVjEzNkgxMzFWMjgwSDQ3VjM1MkgxMzFWNDc5SDQ3VjU1MUgxMzFWNjc1SDIxN1Y1NTFIMzAyVjQ3OUgyMTdWMzUySDMwMlYyODBIMjE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGhvcml6LWFkdi14PSI1MjEiIGQ9Ik00MTQgMzI5UTQxNCAyOTcgNDAyIDI2OVQzNjkgMjIxVDMyMCAxODhUMjYwIDE3NlEyMjggMTc2IDIwMCAxODhUMTUyIDIyMFQxMTkgMjY5VDEwNyAzMjlRMTA3IDM2MSAxMTkgMzg5VDE1MSA0MzdUMjAwIDQ3MFQyNjAgNDgyUTI5MiA0ODIgMzIwIDQ3MFQzNjkgNDM4VDQwMiAzODlUNDE0IDMyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjY7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNMTY1IDQzUTE2NSAxOSAxNDkgNVQxMDYgLTEwUTgwIC0xMCA2NCA0VDQ3IDQzUTQ3IDY3IDYzIDgxVDEwNiA5NlExMzMgOTYgMTQ5IDgyVDE2NSA0M1pNNDEwIDQzUTQxMCAxOSAzOTQgNVQzNTEgLTEwUTMyNCAtMTAgMzA4IDRUMjkxIDQzUTI5MSA2NyAzMDcgODFUMzUwIDk2UTM3NyA5NiAzOTMgODJUNDEwIDQzWk02NTQgNDNRNjU0IDE5IDYzOCA1VDU5NSAtMTBRNTY5IC0xMCA1NTMgNFQ1MzYgNDNRNTM2IDY3IDU1MiA4MVQ1OTUgOTZRNjIyIDk2IDYzOCA4MlQ2NTQgNDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDMwOyIgaG9yaXotYWR2LXg9Ijk5OSIgZD0iTTI4MiA1NDdRMjgyIDUxMyAyNzYgNDg1VDI1NiA0MzdUMjIwIDQwNlQxNjQgMzk1UTEzMSAzOTUgMTA5IDQwNlQ3MyA0MzdUNTMgNDg1VDQ3IDU0N1E0NyA2MTYgNzMgNjU4VDE2NCA3MDBRMjMwIDcwMCAyNTYgNjU4VDI4MiA1NDdaTTIyNyA1NDhRMjI3IDU3MSAyMjUgNTkxVDIxNiA2MjVUMTk3IDY0OFQxNjQgNjU2UTE0NCA2NTYgMTMyIDY0OFQxMTMgNjI2VDEwNCA1OTFUMTAyIDU0N1ExMDIgNDkwIDExNSA0NjRUMTY0IDQzOFExOTkgNDM4IDIxMyA0NjRUMjI3IDU0OFpNMTc5IDBIMTIzTDU1MiA3MDBINjA3TDE3OSAwWk02NDYgMTQ2UTY0NiA3NyA2MjAgMzZUNTI3IC02UTQ5NCAtNiA0NzIgNVQ0MzcgMzZUNDE3IDg0VDQxMSAxNDZRNDExIDIxNiA0MzYgMjU3VDUyNyAyOTlRNTkzIDI5OSA2MTkgMjU3VDY0NiAxNDZaTTU5MCAxNDdRNTkwIDE3MCA1ODggMTkwVDU3OSAyMjRUNTYwIDI0N1Q1MjcgMjU1UTUwNyAyNTUgNDk1IDI0N1Q0NzYgMjI1VDQ2NyAxOTBUNDY1IDE0N1E0NjUgODkgNDc5IDYzVDUyNyAzN1E1NjIgMzcgNTc2IDYzVDU5MCAxNDdaTTk1MiAxNDZROTUyIDExMiA5NDYgODRUOTI2IDM2VDg5MCA1VDgzNSAtNlE4MDIgLTYgNzgwIDVUNzQzIDM2VDcyMyA4NFQ3MTcgMTQ2UTcxNyAyMTYgNzQzIDI1N1Q4MzUgMjk5UTkwMCAyOTkgOTI2IDI1N1Q5NTIgMTQ2Wk04OTcgMTQ3UTg5NyAxNzAgODk1IDE5MFQ4ODYgMjI0VDg2NyAyNDdUODM1IDI1NVE4MTUgMjU1IDgwMyAyNDdUNzgzIDIyNVQ3NzQgMTkwVDc3MiAxNDdRNzcyIDg5IDc4NiA2M1Q4MzUgMzdRODY5IDM3IDg4MyA2M1Q4OTcgMTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGhvcml6LWFkdi14PSIyNjMiIGQ9Ik0xNTkgMTEwTDE5IDMwNkwxNTkgNTAyTDIxOSA0NjlMOTggMzA1TDIxOSAxNDRMMTU5IDExMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwM0E7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNMTA1IDExMEw0NSAxNDRMMTY1IDMwNUw0NSA0NjlMMTA1IDUwMkwyNDQgMzA2TDEwNSAxMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgaG9yaXotYWR2LXg9IjExOCIgZD0iTS0xNjIgMEgtMjE1TDI3MyA3MDBIMzI2TC0xNjIgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzA7IiBob3Jpei1hZHYteD0iMzQ5IiBkPSJNMzA1IDUzMFEzMDUgNDkyIDI5OSA0NjFUMjc3IDQwOFQyMzYgMzczVDE3NCAzNjFRMTM4IDM2MSAxMTMgMzczVDczIDQwN1Q1MSA0NjFUNDQgNTMwUTQ0IDU2OCA1MCA1OTlUNzIgNjUzVDExMyA2ODhUMTc0IDcwMFEyMTEgNzAwIDIzNiA2ODhUMjc2IDY1NFQyOTggNjAwVDMwNSA1MzBaTTI0NCA1MzFRMjQ0IDU1NyAyNDIgNTc5VDIzMiA2MTdUMjEwIDY0MlQxNzQgNjUxUTE1MiA2NTEgMTM5IDY0MlQxMTggNjE3VDEwOCA1NzlUMTA1IDUzMFExMDUgNDY2IDEyMCA0MzhUMTc0IDQwOVEyMTIgNDA5IDIyOCA0MzhUMjQ0IDUzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzQ7IiBob3Jpei1hZHYteD0iMzE3IiBkPSJNMjM4IDQzNFYzNjdIMTc2VjQzNEgzNkwyMSA0ODFMMTcyIDY5NEgyMzhWNDg0SDI4OVY0MzRIMjM4Wk03NyA0ODFIMTc4VjYzNEw3NyA0ODFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc1OyIgaG9yaXotYWR2LXg9IjMxMiIgZD0iTTI3MyA0NzlRMjczIDQyMyAyNDAgMzkyVDE0NCAzNjFRMTEyIDM2MSA4OCAzNjhUMzcgMzk1TDY2IDQzN1ExMDIgNDA4IDE0MSA0MDhRMjEyIDQwOCAyMTIgNDc5UTIxMiA1NDQgMTQ4IDU0NFExMjkgNTQ0IDExNCA1MzhUODQgNTE2TDM5IDU0Nkw2NSA2OTRIMjUyVjY0M0gxMDlMOTUgNTY0SDk2UTEyNiA1ODcgMTY2IDU4N1EyMTcgNTg3IDI0NSA1NjFUMjczIDQ3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzY7IiBob3Jpei1hZHYteD0iMzI2IiBkPSJNMjg3IDQ3NlEyODcgNDIzIDI1NSAzOTJUMTY5IDM2MVExMDQgMzYxIDc0IDQwMFQ0NCA1MTRRNDQgNTUzIDUwIDU4NlQ3MiA2NDVUMTE0IDY4NVQxODEgNzAwUTIwNyA3MDAgMjI3IDY5NFQyNzAgNjc1TDI0NSA2MzNRMjMwIDY0NCAyMTYgNjQ4VDE4MiA2NTNRMTQ0IDY1MyAxMjYgNjI3VDEwNSA1NDJRMTMwIDU3OCAxODEgNTc4UTIzMCA1NzggMjU4IDU1M1QyODcgNDc2Wk0yMzAgNDczUTIzMCA1MDIgMjE1IDUxOVQxNjggNTM2UTE0MCA1MzYgMTI0IDUxOVQxMDcgNDcyUTEwNyA0NDIgMTIzIDQyNlQxNjkgNDA5UTE5OCA0MDkgMjE0IDQyNlQyMzAgNDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3NzsiIGhvcml6LWFkdi14PSIyODgiIGQ9Ik0yNjIgNjQyUTIyOSA2MTYgMjA5IDU5NFQxNzYgNTQ1VDE2MCA0ODFUMTU1IDM5M1YzNjdIOTBWMzgxUTkwIDQxNSA5MyA0NTBUMTA2IDUxOVQxMzcgNTg0VDE5MiA2NDJWNjQ0SDIyVjY5NEgyNTJMMjYyIDY0MkgyNjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc4OyIgaG9yaXotYWR2LXg9IjMyNCIgZD0iTTI4NSA0NjFRMjg1IDQzOSAyNzkgNDIxVDI1OSAzOTBUMjIxIDM2OVQxNjIgMzYxUTkzIDM2MSA2NiAzODlUMzkgNDYxUTM5IDUxNyA5NiA1NDBWNTQxUTQ5IDU2MiA0OSA2MTFRNDkgNjQ5IDc0IDY3MlQxNjIgNjk2UTI3NCA2OTYgMjc0IDYxMVEyNzQgNTYxIDIyOSA1NDFWNTQwUTI4NSA1MTcgMjg1IDQ2MVpNMjE3IDYwNlEyMTcgNjUzIDE2MiA2NTNRMTA3IDY1MyAxMDcgNjA2UTEwNyA1ODMgMTIxIDU3MVQxNjIgNTU4UTE4OSA1NTggMjAzIDU3MFQyMTcgNjA2Wk0yMjYgNDYyUTIyNiA0ODUgMjEyIDUwMVQxNjIgNTE4UTEzNCA1MTggMTE2IDUwNVQ5OCA0NjFROTggNDM1IDExNCA0MjBUMTYyIDQwNVExOTIgNDA1IDIwOSA0MTlUMjI2IDQ2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzk7IiBob3Jpei1hZHYteD0iMzI3IiBkPSJNMjgzIDUzNVEyODMgNDUxIDI1MiA0MDZUMTQ2IDM2MVExMTggMzYxIDk3IDM2N1Q1MyAzODhMNzkgNDI5UTk2IDQxOCAxMTAgNDEzVDE0NyA0MDdRMTg3IDQwNyAyMDYgNDMzVDIyNSA1MjJIMjIzUTIxMyA1MDMgMTkzIDQ5M1QxNDcgNDgzUTk3IDQ4MyA2OCA1MDhUMzkgNTg3UTM5IDY0MCA3MiA2NzBUMTU5IDcwMFEyMjIgNzAwIDI1MiA2NjBUMjgzIDUzNVpNMjIwIDU4OVEyMjAgNjE5IDIwNSA2MzZUMTU4IDY1NFExMjkgNjU0IDExMyA2MzZUOTcgNTkwUTk3IDU2MCAxMTIgNTQ0VDE1NyA1MjdRMTg2IDUyNyAyMDMgNTQzVDIyMCA1ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgwOyIgaG9yaXotYWR2LXg9IjM0OSIgZD0iTTMwNSA0OFEzMDUgMTAgMjk5IC0yMVQyNzcgLTc0VDIzNiAtMTA5VDE3NCAtMTIxUTEzOCAtMTIxIDExMyAtMTA5VDczIC03NVQ1MSAtMjFUNDQgNDhRNDQgODYgNTAgMTE3VDcyIDE3MVQxMTMgMjA2VDE3NCAyMThRMjExIDIxOCAyMzYgMjA2VDI3NiAxNzJUMjk4IDExOFQzMDUgNDhaTTI0NCA0OVEyNDQgNzUgMjQyIDk3VDIzMiAxMzVUMjEwIDE2MFQxNzQgMTY5UTE1MiAxNjkgMTM5IDE2MFQxMTggMTM1VDEwOCA5N1QxMDUgNDhRMTA1IC0xNiAxMjAgLTQ0VDE3NCAtNzNRMjEyIC03MyAyMjggLTQ0VDI0NCA0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODE7IiBob3Jpei1hZHYteD0iMjgwIiBkPSJNMTE3IC02NlYxNDZIMTE0TDQ1IDEwOEwyNSAxNTNMMTI5IDIxMkgxNzhWLTY2SDI1N1YtMTE1SDM0Vi02NkgxMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgyOyIgaG9yaXotYWR2LXg9IjMwOSIgZD0iTTQxIC0xMTVMMzIgLTYxUTc0IC0yNiAxMDYgLTFUMTYwIDQ1VDE5MyA4M1QyMDQgMTIxUTIwNCAxMzggMTk0IDE1MlQxNTQgMTY3UTEzMCAxNjcgMTEyIDE1OFQ3MiAxMjZMMzggMTY1UTY3IDE5NCA5NiAyMDZUMTYwIDIxOFEyMDkgMjE4IDIzNyAxOTVUMjY2IDEyNVEyNjYgMTA1IDI2MCA4N1QyMzUgNDdUMTg1IC0yVDEwMSAtNjVIMjcwVi0xMTVINDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgzOyIgaG9yaXotYWR2LXg9IjMwMiIgZD0iTTI2MyAtMjJRMjYzIC02NyAyMzUgLTk0VDE0MyAtMTIxUTExMSAtMTIxIDgzIC0xMTNUMjcgLTgzTDUzIC00MFE3NiAtNTggOTYgLTY1VDEzNyAtNzNRMTY2IC03MyAxODQgLTYwVDIwMyAtMThRMjAzIDkgMTg5IDIwVDE0MyAzMUgxMDBWNzVIMTI0UTE2MiA3NSAxNzggODlUMTk0IDEyNFExOTQgMTQ0IDE4MSAxNTZUMTQxIDE2OVExMTkgMTY5IDk4IDE2MlQ2MCAxMzdMMzIgMTc5UTYyIDIwMSA4OCAyMDlUMTQ3IDIxOFExOTUgMjE4IDIyNCAxOTZUMjU0IDEyNlEyNTQgMTAzIDI0MSA4NlQyMDcgNjBWNTlRMjYzIDQ1IDI2MyAtMjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg0OyIgaG9yaXotYWR2LXg9IjMxNyIgZD0iTTIzOCAtNDhWLTExNUgxNzZWLTQ4SDM2TDIxIC0xTDE3MiAyMTJIMjM4VjJIMjg5Vi00OEgyMzhaTTc3IC0xSDE3OFYxNTJMNzcgLTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg1OyIgaG9yaXotYWR2LXg9IjMxMiIgZD0iTTI3MyAtM1EyNzMgLTU5IDI0MCAtOTBUMTQ0IC0xMjFRMTEyIC0xMjEgODggLTExNFQzNyAtODdMNjYgLTQ1UTEwMiAtNzQgMTQxIC03NFEyMTIgLTc0IDIxMiAtM1EyMTIgNjIgMTQ4IDYyUTEyOSA2MiAxMTQgNTZUODQgMzRMMzkgNjRMNjUgMjEySDI1MlYxNjFIMTA5TDk1IDgySDk2UTEyNiAxMDUgMTY2IDEwNVEyMTcgMTA1IDI0NSA3OVQyNzMgLTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg2OyIgaG9yaXotYWR2LXg9IjMyNiIgZD0iTTI4NyAtNlEyODcgLTU5IDI1NSAtOTBUMTY5IC0xMjFRMTA0IC0xMjEgNzQgLTgyVDQ0IDMyUTQ0IDcxIDUwIDEwNFQ3MiAxNjNUMTE0IDIwM1QxODEgMjE4UTIwNyAyMTggMjI3IDIxMlQyNzAgMTkzTDI0NSAxNTFRMjMwIDE2MiAyMTYgMTY2VDE4MiAxNzFRMTQ0IDE3MSAxMjYgMTQ1VDEwNSA2MFExMzAgOTYgMTgxIDk2UTIzMCA5NiAyNTggNzFUMjg3IC02Wk0yMzAgLTlRMjMwIDIwIDIxNSAzN1QxNjggNTRRMTQwIDU0IDEyNCAzN1QxMDcgLTEwUTEwNyAtNDAgMTIzIC01NlQxNjkgLTczUTE5OCAtNzMgMjE0IC01NlQyMzAgLTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg3OyIgaG9yaXotYWR2LXg9IjI4OCIgZD0iTTI2MiAxNjBRMjI5IDEzNCAyMDkgMTEyVDE3NiA2M1QxNjAgLTFUMTU1IC04OVYtMTE1SDkwVi0xMDFROTAgLTY3IDkzIC0zMlQxMDYgMzdUMTM3IDEwMlQxOTIgMTYwVjE2MkgyMlYyMTJIMjUyTDI2MiAxNjBIMjYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4ODsiIGhvcml6LWFkdi14PSIzMjQiIGQ9Ik0yODUgLTIxUTI4NSAtNDMgMjc5IC02MVQyNTkgLTkyVDIyMSAtMTEzVDE2MiAtMTIxUTkzIC0xMjEgNjYgLTkzVDM5IC0yMVEzOSAzNSA5NiA1OFY1OVE0OSA4MCA0OSAxMjlRNDkgMTY3IDc0IDE5MFQxNjIgMjE0UTI3NCAyMTQgMjc0IDEyOVEyNzQgNzkgMjI5IDU5VjU4UTI4NSAzNSAyODUgLTIxWk0yMTcgMTI0UTIxNyAxNzEgMTYyIDE3MVExMDcgMTcxIDEwNyAxMjRRMTA3IDEwMSAxMjEgODlUMTYyIDc2UTE4OSA3NiAyMDMgODhUMjE3IDEyNFpNMjI2IC0yMFEyMjYgMyAyMTIgMTlUMTYyIDM2UTEzNCAzNiAxMTYgMjNUOTggLTIxUTk4IC00NyAxMTQgLTYyVDE2MiAtNzdRMTkyIC03NyAyMDkgLTYzVDIyNiAtMjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg5OyIgaG9yaXotYWR2LXg9IjMyNyIgZD0iTTI4MyA1M1EyODMgLTMxIDI1MiAtNzZUMTQ2IC0xMjFRMTE4IC0xMjEgOTcgLTExNVQ1MyAtOTNMNzkgLTUyUTk2IC02NCAxMTAgLTY5VDE0NyAtNzVRMTg3IC03NSAyMDYgLTQ5VDIyNSA0MUgyMjNRMjEzIDIyIDE5MyAxMlQxNDcgMVE5NyAxIDY4IDI3VDM5IDEwNlEzOSAxNTggNzIgMTg4VDE1OSAyMThRMjIyIDIxOCAyNTIgMTc4VDI4MyA1M1pNMjIwIDEwOFEyMjAgMTM3IDIwNSAxNTRUMTU4IDE3MlExMjkgMTcyIDExMyAxNTRUOTcgMTA4UTk3IDc5IDExMiA2M1QxNTcgNDZRMTg2IDQ2IDIwMyA2MlQyMjAgMTA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjBBQzsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik05NiA0MzJRMTAzIDQ4MyAxMTYgNTI4VDE1NSA2MDZUMjIzIDY1OVQzMjggNjc4UTM5MyA2NzggNDQxIDY1NFQ1MzQgNTc4TDQ4MCA1MjRRNDQ4IDU2OCA0MTIgNTg2VDMzMSA2MDRRMjkzIDYwNCAyNjggNTk0VDIyNSA1NjNUMTk5IDUxMFQxODQgNDMySDQ1MFYzNzlIMTgyUTE4MSAzNjggMTgxIDM1OFQxODEgMzM1UTE4MSAzMjUgMTgxIDMxMVQxODIgMjg2SDQ1MFYyMzNIMTg2UTE4OSAyMDcgMTk0IDE3OFQyMTUgMTIyVDI1NyA3OVQzMzAgNjJRMzg2IDYyIDQyMiA4N1Q0OTEgMTU3TDU0MiAxMDJRNTAwIDUwIDQ1MCAxOVQzMjcgLTEyUTI2NyAtMTIgMjI3IDVUMTYwIDU0VDExOSAxMzFUOTYgMjMzSDIxTDIyIDI4Nkg5MlE5MSAyOTYgOTEgMzEwVDkwIDMzNVE5MCAzNDYgOTAgMzU2VDkyIDM3OUgyMUwyMiA0MzJIOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTIyOyIgaG9yaXotYWR2LXg9IjYzOCIgZD0iTTUyMSA0NjZWNjEyTDQ0MSA0OThMMzYwIDYxMlY0NjZIMzExVjcwMEgzNTZMNDQxIDU3N0w1MjUgNzAwSDU3MVY0NjZINTIxWk0xNzggNjU2VjQ2NkgxMjZWNjU2SDQ3VjcwMEgyNTdWNjU2SDE3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNTM7IiBob3Jpei1hZHYteD0iNzE4IiBkPSJNMTQ1IDQxNlY2MjhIMTQyTDczIDU5MEw1MyA2MzVMMTU3IDY5NEgyMDZWNDE2SDI4NVYzNjdINjJWNDE2SDE0NVpNMTUzIDBIMTAwTDU4OCA3MDBINjQxTDE1MyAwWk02ODEgOTNRNjgxIDQ4IDY1MyAyMVQ1NjEgLTZRNTI5IC02IDUwMSAyVDQ0NSAzMkw0NzEgNzVRNDk0IDU3IDUxNCA1MFQ1NTUgNDJRNTg0IDQyIDYwMiA1NVQ2MjEgOTdRNjIxIDEyNCA2MDcgMTM1VDU2MSAxNDZINTE4VjE5MEg1NDJRNTgwIDE5MCA1OTYgMjA0VDYxMiAyMzlRNjEyIDI1OSA1OTkgMjcxVDU1OSAyODRRNTM3IDI4NCA1MTYgMjc3VDQ3OCAyNTJMNDUwIDI5NFE0ODAgMzE2IDUwNiAzMjRUNTY1IDMzM1E2MTMgMzMzIDY0MiAzMTFUNjcyIDI0MVE2NzIgMjE4IDY1OSAyMDFUNjI1IDE3NVYxNzRRNjgxIDE2MCA2ODEgOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTU0OyIgaG9yaXotYWR2LXg9IjcxOCIgZD0iTTYxIDM2N0w1MiA0MjFROTQgNDU2IDEyNiA0ODFUMTgwIDUyN1QyMTMgNTY1VDIyNCA2MDNRMjI0IDYyMCAyMTQgNjM0VDE3NCA2NDlRMTUwIDY0OSAxMzIgNjQwVDkyIDYwOEw1OCA2NDdRODcgNjc2IDExNiA2ODhUMTgwIDcwMFEyMjkgNzAwIDI1NyA2NzdUMjg2IDYwN1EyODYgNTg3IDI4MCA1NjlUMjU1IDUyOVQyMDUgNDgwVDEyMSA0MTdIMjkwVjM2N0g2MVpNMTUzIDBIMTAwTDU4OCA3MDBINjQxTDE1MyAwWk02ODEgOTNRNjgxIDQ4IDY1MyAyMVQ1NjEgLTZRNTI5IC02IDUwMSAyVDQ0NSAzMkw0NzEgNzVRNDk0IDU3IDUxNCA1MFQ1NTUgNDJRNTg0IDQyIDYwMiA1NVQ2MjEgOTdRNjIxIDEyNCA2MDcgMTM1VDU2MSAxNDZINTE4VjE5MEg1NDJRNTgwIDE5MCA1OTYgMjA0VDYxMiAyMzlRNjEyIDI1OSA1OTkgMjcxVDU1OSAyODRRNTM3IDI4NCA1MTYgMjc3VDQ3OCAyNTJMNDUwIDI5NFE0ODAgMzE2IDUwNiAzMjRUNTY1IDMzM1E2MTMgMzMzIDY0MiAzMTFUNjcyIDI0MVE2NzIgMjE4IDY1OSAyMDFUNjI1IDE3NVYxNzRRNjgxIDE2MCA2ODEgOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTVCOyIgaG9yaXotYWR2LXg9IjcxOCIgZD0iTTE0NSA0MTZWNjI4SDE0Mkw3MyA1OTBMNTMgNjM1TDE1NyA2OTRIMjA2VjQxNkgyODVWMzY3SDYyVjQxNkgxNDVaTTE1MyAwSDEwMEw1ODggNzAwSDY0MUwxNTMgMFpNNjg3IDk0UTY4NyA3MiA2ODEgNTRUNjYxIDIzVDYyMyAyVDU2NCAtNlE0OTUgLTYgNDY4IDIyVDQ0MSA5NFE0NDEgMTUwIDQ5OCAxNzNWMTc0UTQ1MSAxOTUgNDUxIDI0NFE0NTEgMjgyIDQ3NiAzMDVUNTY0IDMyOVE2NzYgMzI5IDY3NiAyNDRRNjc2IDE5NCA2MzEgMTc0VjE3M1E2ODcgMTUwIDY4NyA5NFpNNjE5IDIzOVE2MTkgMjg2IDU2NCAyODZRNTA5IDI4NiA1MDkgMjM5UTUwOSAyMTYgNTIzIDIwNFQ1NjQgMTkxUTU5MSAxOTEgNjA1IDIwM1Q2MTkgMjM5Wk02MjggOTVRNjI4IDExOCA2MTQgMTM0VDU2NCAxNTFRNTM2IDE1MSA1MTggMTM4VDUwMCA5NFE1MDAgNjggNTE2IDUzVDU2NCAzOFE1OTQgMzggNjExIDUyVDYyOCA5NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNUM7IiBob3Jpei1hZHYteD0iNzE4IiBkPSJNMjg0IDQ2MFEyODQgNDE1IDI1NiAzODhUMTY0IDM2MVExMzIgMzYxIDEwNCAzNjlUNDggMzk5TDc0IDQ0MlE5NyA0MjQgMTE3IDQxN1QxNTggNDA5UTE4NyA0MDkgMjA1IDQyMlQyMjQgNDY0UTIyNCA0OTEgMjEwIDUwMlQxNjQgNTEzSDEyMVY1NTdIMTQ1UTE4MyA1NTcgMTk5IDU3MVQyMTUgNjA2UTIxNSA2MjYgMjAyIDYzOFQxNjIgNjUxUTE0MCA2NTEgMTE5IDY0NFQ4MSA2MTlMNTMgNjYxUTgzIDY4MyAxMDkgNjkxVDE2OCA3MDBRMjE2IDcwMCAyNDUgNjc4VDI3NSA2MDhRMjc1IDU4NSAyNjIgNTY4VDIyOCA1NDJWNTQxUTI4NCA1MjcgMjg0IDQ2MFpNMTUzIDBIMTAwTDU4OCA3MDBINjQxTDE1MyAwWk02ODcgOTRRNjg3IDcyIDY4MSA1NFQ2NjEgMjNUNjIzIDJUNTY0IC02UTQ5NSAtNiA0NjggMjJUNDQxIDk0UTQ0MSAxNTAgNDk4IDE3M1YxNzRRNDUxIDE5NSA0NTEgMjQ0UTQ1MSAyODIgNDc2IDMwNVQ1NjQgMzI5UTY3NiAzMjkgNjc2IDI0NFE2NzYgMTk0IDYzMSAxNzRWMTczUTY4NyAxNTAgNjg3IDk0Wk02MTkgMjM5UTYxOSAyODYgNTY0IDI4NlE1MDkgMjg2IDUwOSAyMzlRNTA5IDIxNiA1MjMgMjA0VDU2NCAxOTFRNTkxIDE5MSA2MDUgMjAzVDYxOSAyMzlaTTYyOCA5NVE2MjggMTE4IDYxNCAxMzRUNTY0IDE1MVE1MzYgMTUxIDUxOCAxMzhUNTAwIDk0UTUwMCA2OCA1MTYgNTNUNTY0IDM4UTU5NCAzOCA2MTEgNTJUNjI4IDk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1RDsiIGhvcml6LWFkdi14PSI3MTgiIGQ9Ik0yOTQgNDc5UTI5NCA0MjMgMjYxIDM5MlQxNjUgMzYxUTEzMyAzNjEgMTA5IDM2OFQ1OCAzOTVMODcgNDM3UTEyMyA0MDggMTYyIDQwOFEyMzMgNDA4IDIzMyA0NzlRMjMzIDU0NCAxNjkgNTQ0UTE1MCA1NDQgMTM1IDUzOFQxMDUgNTE2TDYwIDU0Nkw4NiA2OTRIMjczVjY0M0gxMzBMMTE2IDU2NEgxMTdRMTQ3IDU4NyAxODcgNTg3UTIzOCA1ODcgMjY2IDU2MVQyOTQgNDc5Wk0xNTMgMEgxMDBMNTg4IDcwMEg2NDFMMTUzIDBaTTY4NyA5NFE2ODcgNzIgNjgxIDU0VDY2MSAyM1Q2MjMgMlQ1NjQgLTZRNDk1IC02IDQ2OCAyMlQ0NDEgOTRRNDQxIDE1MCA0OTggMTczVjE3NFE0NTEgMTk1IDQ1MSAyNDRRNDUxIDI4MiA0NzYgMzA1VDU2NCAzMjlRNjc2IDMyOSA2NzYgMjQ0UTY3NiAxOTQgNjMxIDE3NFYxNzNRNjg3IDE1MCA2ODcgOTRaTTYxOSAyMzlRNjE5IDI4NiA1NjQgMjg2UTUwOSAyODYgNTA5IDIzOVE1MDkgMjE2IDUyMyAyMDRUNTY0IDE5MVE1OTEgMTkxIDYwNSAyMDNUNjE5IDIzOVpNNjI4IDk1UTYyOCAxMTggNjE0IDEzNFQ1NjQgMTUxUTUzNiAxNTEgNTE4IDEzOFQ1MDAgOTRRNTAwIDY4IDUxNiA1M1Q1NjQgMzhRNTk0IDM4IDYxMSA1MlQ2MjggOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTVFOyIgaG9yaXotYWR2LXg9IjcxOCIgZD0iTTMyMCA2NDJRMjg3IDYxNiAyNjcgNTk0VDIzNCA1NDVUMjE4IDQ4MVQyMTMgMzkzVjM2N0gxNDhWMzgxUTE0OCA0MTUgMTUxIDQ1MFQxNjQgNTE5VDE5NSA1ODRUMjUwIDY0MlY2NDRIODBWNjk0SDMxMEwzMjAgNjQyWk0xNTMgMEgxMDBMNTg4IDcwMEg2NDFMMTUzIDBaTTY4NyA5NFE2ODcgNzIgNjgxIDU0VDY2MSAyM1Q2MjMgMlQ1NjQgLTZRNDk1IC02IDQ2OCAyMlQ0NDEgOTRRNDQxIDE1MCA0OTggMTczVjE3NFE0NTEgMTk1IDQ1MSAyNDRRNDUxIDI4MiA0NzYgMzA1VDU2NCAzMjlRNjc2IDMyOSA2NzYgMjQ0UTY3NiAxOTQgNjMxIDE3NFYxNzNRNjg3IDE1MCA2ODcgOTRaTTYxOSAyMzlRNjE5IDI4NiA1NjQgMjg2UTUwOSAyODYgNTA5IDIzOVE1MDkgMjE2IDUyMyAyMDRUNTY0IDE5MVE1OTEgMTkxIDYwNSAyMDNUNjE5IDIzOVpNNjI4IDk1UTYyOCAxMTggNjE0IDEzNFQ1NjQgMTUxUTUzNiAxNTEgNTE4IDEzOFQ1MDAgOTRRNTAwIDY4IDUxNiA1M1Q1NjQgMzhRNTk0IDM4IDYxMSA1MlQ2MjggOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjEyOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTUxIDIyNFYzMDBINTIzVjIyNEg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjA7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMzg3IDMxOUwyODIgMjA3SDUyM1YxMzJIMjIzTDEzMiAzMEw3NyA3NEwxMzEgMTMySDUyVjIwN0gxOTFMMjk1IDMxOUg1MlYzOTRIMzU1TDQ1MCA1MDFMNTA2IDQ1OEw0NDYgMzk0SDUyM1YzMTlIMzg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01MSAyNzZWMzU1TDUyMyA1MjlWNDQ4TDE0MSAzMTZMNTIzIDE4OFYxMDlMNTEgMjc2Wk01MSAwVjczSDUyM1YwSDUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NTsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01MSAxMDlWMTg4TDQzNCAzMTZMNTEgNDQ4VjUyOUw1MjMgMzU1VjI3Nkw1MSAxMDlaTTUxIDBWNzNINTIzVjBINTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyNERGOyIgaG9yaXotYWR2LXg9Ijg2NiIgZD0iTTc3OSAzMzRRNzc5IDI2MiA3NTIgMjAwVDY3OCA5MVQ1NjggMTdUNDMzIC0xMFEzNjEgLTEwIDI5OCAxN1QxODggOTBUMTE0IDE5OVQ4NyAzMzRRODcgNDA2IDExNCA0NjhUMTg4IDU3N1QyOTggNjUxVDQzMyA2NzhRNTA1IDY3OCA1NjggNjUxVDY3OCA1NzhUNzUyIDQ2OVQ3NzkgMzM0Wk03NDEgMzM0UTc0MSAzOTcgNzE4IDQ1M1Q2NTMgNTUyVDU1NSA2MThUNDMzIDY0M1EzNjggNjQzIDMxMiA2MTlUMjE0IDU1MlQxNTAgNDU0VDEyNiAzMzRRMTI2IDI3MSAxNTAgMjE2VDIxNiAxMThUMzE0IDUyVDQzMyAyOFE0OTYgMjggNTUyIDUyVDY1MCAxMThUNzE2IDIxNVQ3NDEgMzM0Wk02MjMgNDE1UTYyMyAzNDYgNTg2IDMxMlQ0NjcgMjc4SDM2OVYxMTFIMzAxVjU0NFEzMzMgNTQ4IDM3MSA1NDlUNDQ5IDU1MVE0ODggNTUxIDUyMCA1NDRUNTc1IDUyMlQ2MTAgNDgwVDYyMyA0MTVaTTU1NSA0MTJRNTU1IDQ2MyA1MjkgNDgxVDQ0OCA0OTlRNDI4IDQ5OSA0MTAgNDk4VDM2OSA0OTVWMzI4SDQ0OFE0NzIgMzI4IDQ5MSAzMzFUNTI1IDM0M1Q1NDcgMzY4VDU1NSA0MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNkMzOyIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTE4MSAtMjEzSDEyMUwxNDggLTU5SDI0NUwxODEgLTIxM1oiICAvPgorCisKKzwvZm9udD4KKzwvZGVmcz4KKzx0ZXh0IHg9IjQwIiB5PSI0MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBCayIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEHDgcOAw4LDhMOFw4PDhiBDw4cgRMOQIEXDicOIw4rDiyBJIMONIMOMIMOOIMOPIE7DkTwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSI4MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBCayIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPk/Dk8OSw5TDlsOVw5jFkiBTxaAgVcOaw5nDm8OcIFnDncW4IFrFvSDDniBhw6HDoMOiw6TDpcOjw6YgY8OnIGTDsCBlw6nDqMOqw6sgaSDEsSDDrSDDrCDDriDDryBuw7Egb8Ozw7LDtMO2w7XDuMWTIHPFocOfIHXDusO5w7vDvCB5w73DvyB6xb48L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTIwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEJrIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+w74gMTIzNDU2Nzg5MCDCvSDCvCDCviAlIOKAsCAkwqLCo8KlxpLigqzCpCDigKAg4oChIMKnIMK2ICMgXn7CtSArw5fCsSAmbHQ7ID0gJmd0OyDDt8KsICHCoT/CvyAmcXVvdDsgJmFtcDsgJmFwb3M7ICogwrAgLiAsIDogOyAoKSBbIFwgXSB7fSAvIHw8L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTYwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEJrIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+wqYgXyDigJog4oCeIOKApiDigLnigLogwqvCuyDigJgg4oCZIOKAnCDigJ0g4oCiIMKtIC0g4oCTIOKAlCBAIMKpIMKuIOKEoiDCqsK6IMK5wrLCsyDCtCBgIMuGIMucIMKoIMKvIMK3IMK4PC90ZXh0PgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Cay50dGYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Cay50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzOTA0NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Cay53b2ZmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmsud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzczNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtQmsud29mZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LmVvdCBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrSXQuZW90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjY2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LmVvdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrSXQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzM3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LnN2ZwpAQCAtMCwwICsxLDQyNSBAQAor77u/PD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCIgPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID4KKzxtZXRhZGF0YT4KKzx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKzxpZD48IVtDREFUQVtDbGVhcnZpZXdBVFQgQmtJdF1dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0NvcHlyaWdodCAoYykgVGVybWluYWwgRGVzaWduLCBJbmMsIDIwMDUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXV0+PC9jb3B5cmlnaHQ+Cis8dHJhZGVtYXJrPjwhW0NEQVRBW0NsZWFydmlldyBpcyBhIHRyYWRlbWFyayBvZiBUZXJtaW5hbCBEZXNpZ24sIEluYy5dXT48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjUwOSIgaWQ9IkNsZWFydmlld0FUVC1Ca0l0Ij4KKzxmb250LWZhY2UgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBCa0l0IiBwYW5vc2UtMT0iMiAxMSA1IDYgMyA1IDAgMiAwIDQiIGFzY2VudD0iNzUwIiBkZXNjZW50PSItMjUwIiB1bml0cy1wZXItZW09IjEwMDAiIGFscGhhYmV0aWM9IjAiPgorPC9mb250LWZhY2U+Cis8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iNDg0IiBkPSJNNTg1IDY2N0w0OTIgMEgtOEw4NSA2NjdINTg1Wk0xMTYgNjA2TDQwIDY1TDI2NCAzMzZMMTE2IDYwNlpNNDYyIDY3TDUzOCA2MDVMMzE1IDMzNkw0NjIgNjdaTTY1IDM1SDQyOEwyODQgMjk5TDY1IDM1Wk0yOTQgMzczTDUwNyA2MzBIMTUzTDI5NCAzNzNaIiAgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGhvcml6LWFkdi14PSIzMzAiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjI4MSIgZD0iTTI4NSA2NjdRMjYzIDU0NSAyNDMgNDI0VDIwMiAxODFIMTMxUTE0NSAzMDMgMTU4IDQyNFQxODQgNjY3SDI4NVpNMjExIDU1UTIxMSAyNSAxOTAgN1QxMzkgLTExUTExNiAtMTEgOTkgMFQ4MiAzN1E4MiA2NyAxMDQgODRUMTU1IDEwMVExNzcgMTAxIDE5NCA5MFQyMTEgNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGhvcml6LWFkdi14PSI0MTciIGQ9Ik0zOTQgNDk1SDMzNUwzNDYgNzAwSDQ0NEwzOTQgNDk1Wk0yMDYgNDk1SDE0N0wxNTggNzAwSDI1NkwyMDYgNDk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgaG9yaXotYWR2LXg9IjYyMyIgZD0iTTY0MiA0NjZINTI5TDQ4OCAzMjJINjA2TDU4OCAyNTdINDY5TDQyOSAxMTNIMzU4TDM5OSAyNTdIMjYxTDIxOSAxMTNIMTUxTDE5MiAyNTdINzNMOTAgMzIySDIxMEwyNTAgNDY2SDEzMEwxNDcgNTMwSDI2OEwzMDcgNjY3SDM3N0wzMzggNTMwSDQ3OUw1MTggNjY3SDU4OEw1NDcgNTMwSDY2MUw2NDIgNDY2Wk0zMTkgNDY2TDI3OSAzMjJINDE5TDQ2MCA0NjZIMzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJCIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTUzMyAyMjhRNTMzIDE4NSA1MTcgMTUwVDQ3NCA4OVQ0MTEgNDhUMzMzIDMxTDMyMiAtNDdIMjM4TDI0OSAzMVEyMDQgMzMgMTYxIDUwVDgyIDkyTDEzMCAxNThRMTY3IDEzMSAyMDkgMTE0VDI5OSA5NlEzMjYgOTYgMzUyIDEwMlQzOTkgMTIxVDQzMyAxNTVUNDQ2IDIwN1E0NDYgMjM5IDQyNSAyNjBUMzcxIDI5OFQzMDAgMzI5VDIzMCAzNjNUMTc2IDQwOVQxNTQgNDc3UTE1NCA1MTYgMTY5IDU0N1QyMDkgNTk5VDI2NyA2MzNUMzM3IDY0OEwzNDcgNzIzSDQzMUw0MjEgNjQ4UTQ1OSA2NDYgNDk0IDYzNFQ1NjIgNjAxTDUyMCA1MzNRNDUxIDU4MiAzNzAgNTgyUTM0NyA1ODIgMzI1IDU3OFQyODQgNTY0VDI1NCA1MzVUMjQyIDQ5MFEyNDIgNDY1IDI2MyA0NDhUMzE3IDQxNVQzODcgMzg1VDQ1NyAzNTBUNTExIDMwMFQ1MzMgMjI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJSIgaG9yaXotYWR2LXg9IjczOSIgZD0iTTM4NiA1ODBRMzg2IDU0MSAzNzkgNTAyVDM1MyA0MzJUMzA0IDM4MVQyMjcgMzYxUTE2OCAzNjEgMTQzIDM5MlQxMTcgNDgwUTExNyA1MTkgMTI0IDU1OFQxNTAgNjI4VDE5OCA2ODBUMjc1IDcwMFEzMzUgNzAwIDM2MCA2NjlUMzg2IDU4MFpNMjM0IDQwOVEyNjQgNDA5IDI4MiA0MjdUMzA5IDQ3M1QzMjIgNTMwVDMyNSA1ODJRMzI1IDYxMiAzMTQgNjMxVDI2OCA2NTFRMjM4IDY1MSAyMjAgNjMzVDE5MyA1ODhUMTgxIDUzMlQxNzggNDgwUTE3OCA0NTAgMTg5IDQzMFQyMzQgNDA5Wk0xNzkgMEgxMjNMNjUwIDcwMEg3MDVMMTc5IDBaTTcxOCAyMTNRNzE4IDE3NCA3MTEgMTM1VDY4NSA2NVQ2MzcgMTRUNTYwIC02UTUwMCAtNiA0NzUgMjVUNDQ5IDExNFE0NDkgMTUyIDQ1NiAxOTFUNDgyIDI2MVQ1MzEgMzEzVDYwNyAzMzNRNjY2IDMzMyA2OTIgMzAyVDcxOCAyMTNaTTU2NiA0MlE1OTYgNDIgNjEzIDYwVDY0MSAxMDZUNjU0IDE2MlQ2NTcgMjE0UTY1NyAyNDQgNjQ2IDI2NFQ2MDAgMjg0UTU3MCAyODQgNTUyIDI2NlQ1MjUgMjIxVDUxMyAxNjVUNTEwIDExM1E1MTAgODMgNTIxIDYzVDU2NiA0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBob3Jpei1hZHYteD0iNjIzIiBkPSJNMjg4IC0xMVEyNDggLTExIDIxMiAtM1QxNDcgMjVUMTAzIDc2VDg2IDE1MlE4NiAxOTUgOTkgMjI5VDEzNiAyOTBUMTkwIDMzOVQyNTYgMzc5UTIzMyA0MDggMjE1IDQ0M1QxOTYgNTE2UTE5NiA1NTUgMjEyIDU4NVQyNTYgNjM2VDMxNyA2NjhUMzg3IDY3OVE0NDcgNjc5IDQ4NSA2NDlUNTI0IDU1N1E1MjQgNTIxIDUwOCA0OTNUNDY4IDQ0M1Q0MTMgNDAzVDM1MyAzNjlMNDgxIDE1MVE0OTcgMTgxIDUwMiAyMThUNTA3IDI4OVE1MDcgMzAwIDUwNyAzMTBUNTA1IDMzMUg1ODRRNTg1IDMyMyA1ODUgMzE3VDU4NSAzMDJRNTg1IDI3OCA1ODIgMjUxVDU3MiAxOThUNTU0IDE0NlQ1MjQgMTAwTDU4NiAwSDQ5MUw0NjIgNDdRMzg2IC0xMSAyODggLTExWk0yOTcgNTRRMzMwIDU0IDM2NCA2NVQ0MjQgOTlMMjgzIDMzMlEyNjAgMzE4IDI0MCAzMDJUMjA0IDI2NVQxNzkgMjIxVDE3MCAxNjhRMTcwIDExMCAyMDYgODJUMjk3IDU0Wk0zMjggNDA5UTM0OCA0MjEgMzY5IDQzNVQ0MDcgNDY4VDQzNiA1MDdUNDQ4IDU1NVE0NDggNTg3IDQzMCA2MDRUMzgwIDYyMVEzMzMgNjIxIDMwNCA1OTZUMjc1IDUyOFEyNzUgNDk2IDI5MiA0NjZUMzI4IDQwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgaG9yaXotYWR2LXg9IjIxOCIgZD0iTTIwNiA0OTVIMTQ3TDE1OCA3MDBIMjU2TDIwNiA0OTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIoIiBob3Jpei1hZHYteD0iMjk5IiBkPSJNMTYwIC0xMzhRMTI0IC01MSAxMDQgMzBUODQgMjAxUTg0IDM1MiAxMzcgNDkxVDI4OCA3NzJMMzQ2IDc1OFEyNjggNjI5IDIxOSA0ODZUMTcwIDE4NVExNzAgMTA0IDE4MyAyOVQyMjIgLTEyM0wxNjAgLTEzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IikiIGhvcml6LWFkdi14PSIyOTkiIGQ9Ik00MSAtMTIzUTEyMCA3IDE2OSAxNTFUMjE4IDQ1M1EyMTggNTM0IDIwNSA2MDlUMTY1IDc1OEwyMjcgNzcyUTI2MyA2ODEgMjgzIDYwMVQzMDMgNDMzUTMwMyAyNzkgMjQ5IDEzOFQ5OSAtMTM4TDQxIC0xMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBob3Jpei1hZHYteD0iMzM2IiBkPSJNMjc5IDU0NEwzMzUgNDc5TDI2OSA0MzVMMjM1IDUxN0wxNzggNDM2TDEyNCA0NzlMMTk4IDU0NkwxMDYgNTYwTDE0MCA2MjlMMjE5IDU5MEwyMTYgNjgxSDI5NUwyNzAgNTkxTDM1OSA2MzBMMzc0IDU2MUwyNzkgNTQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTM1OSAyMjRMMzMwIDE2SDI1M0wyODIgMjI0SDgyTDkzIDMwMEgyOTNMMzIxIDQ5OUgzOThMMzcwIDMwMEg1NjVMNTU0IDIyNEgzNTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyYzsiIGhvcml6LWFkdi14PSIyMTAiIGQ9Ik03MCAtMTE5SDEwTDc5IDk3SDE4NEw3MCAtMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgaG9yaXotYWR2LXg9IjM3NiIgZD0iTTgyIDIxOUw5NCAzMDBIMzY2TDM1NCAyMTlIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBob3Jpei1hZHYteD0iMjEwIiBkPSJNMTc1IDU1UTE3NSAyNSAxNTQgN1QxMDMgLTExUTgwIC0xMSA2NCAwVDQ3IDM3UTQ3IDY3IDY4IDg0VDExOSAxMDFRMTQxIDEwMSAxNTggOTBUMTc1IDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLyIgaG9yaXotYWR2LXg9IjUxMiIgZD0iTTg0IC0xMTVIM0w1MTQgNzAwSDU5Nkw4NCAtMTE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTU3OCA0NTZRNTc4IDQyNSA1NzYgMzk1VDU2OCAzMzRRNTU5IDI3MCA1NDMgMjA4VDQ5NSA5N1Q0MTMgMThUMjg2IC0xMlEyMzAgLTEyIDE5MyAzVDEzMiA0OFQ5OSAxMTlUODkgMjEyUTg5IDI0MyA5MSAyNzNUOTkgMzM0UTEwOCAzOTkgMTI0IDQ2MVQxNzIgNTcxVDI1NSA2NDhUMzgzIDY3OFE0MzggNjc4IDQ3NSA2NjNUNTM1IDYxOFQ1NjggNTQ4VDU3OCA0NTZaTTI5NiA2MlEzNTAgNjIgMzgzIDg4VDQzNSAxNTVUNDYzIDI0NFQ0NzggMzM0UTQ4MyAzNjUgNDg2IDM5NVQ0ODkgNDU4UTQ4OSA0ODkgNDg0IDUxNlQ0NjYgNTYyVDQzMCA1OTNUMzcyIDYwNFEzMTYgNjA0IDI4MyA1NzhUMjMxIDUxMlQyMDQgNDI1VDE4OSAzMzRRMTg0IDMwMiAxODEgMjcxVDE3OCAyMDdRMTc4IDE3NSAxODMgMTQ5VDIwMSAxMDNUMjM3IDczVDI5NiA2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik0yNjkgNzZMMzM4IDU2OUgzMzRMMTcyIDQ3OUwxNDUgNTQ2TDM2NyA2NjlINDQxTDM1NyA3Nkg1MTZMNTA2IDBIOTRMMTA0IDc2SDI2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjIiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik04MiAwTDc5IDgxUTE2MSAxNDUgMjMyIDE5N1QzNTcgMjk5VDQ0MSAzOTdUNDcyIDUwNVE0NzIgNTIzIDQ2NyA1NDFUNDUxIDU3MlQ0MjEgNTk0VDM3NCA2MDNRMzI5IDYwMyAyODUgNTgwVDE5MyA1MTJMMTU0IDU3NlEyMTYgNjMxIDI3MCA2NTRUMzkwIDY3OFE0NzAgNjc4IDUxNiA2MzhUNTYzIDUyMFE1NjMgNDUwIDUyNSAzODhUNDMwIDI3MFQzMDQgMTY2VDE3NCA3Nkg1MTdMNTA3IDBIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTM3IDIzMFE1MzcgMTcxIDUxNyAxMjZUNDYyIDUwVDM3OSA0VDI3NCAtMTJRMjE2IC0xMiAxNjggNFQ3NCA1N0wxMjQgMTIzUTE1NiA5NCAxOTYgNzhUMjgxIDYxUTM1OCA2MSA0MDIgMTAyVDQ0NiAyMjJRNDQ2IDI1MiA0MzYgMjY5VDQwNyAyOTZUMzY0IDMwOFQzMTMgMzExSDI0OEwyNTggMzg0UTI5MyAzODQgMzMwIDM4N1QzOTkgNDA0VDQ1MSA0NDNUNDcxIDUxNVE0NzEgNTQwIDQ2MiA1NTdUNDM4IDU4NFQ0MDIgNTk4VDM1OSA2MDNRMzEzIDYwMyAyNzEgNTg1VDE5MyA1NDBMMTYzIDYwOFEyMTYgNjQyIDI2NiA2NjBUMzgwIDY3OFE0MTYgNjc4IDQ0OSA2NzBUNTA3IDY0NVQ1NDggNTk5VDU2MyA1MzBRNTYzIDQ2NyA1MzMgNDIyVDQ0MyAzNTVWMzUxUTQ5MyAzNDEgNTE1IDMxMFQ1MzcgMjMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTQ1NyAxNDNMNDM3IDBIMzQ3TDM2NyAxNDNIOTBMNzYgMjE4TDQzMiA2NjVINTMwTDQ2NyAyMTlINTU4TDU0OCAxNDNINDU3Wk00MjcgNTY0TDE2NyAyMTlIMzgyTDQzMSA1NjRINDI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNSIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTU0MyAyODRRNTQzIDIxNiA1MjYgMTYyVDQ3NCA2OVQzODggOVQyNjcgLTEyUTIxMyAtMTIgMTY2IDJUNzcgNTFMMTI0IDEyMFExNTYgOTQgMTkzIDc4VDI3MyA2MVEzMjEgNjEgMzU0IDc3VDQxMCAxMjBUNDQyIDE4NlQ0NTIgMjY5UTQ1MiAzMzAgNDIxIDM1N1QzMzAgMzg0UTI4NSAzODQgMjUwIDM2OFQxODIgMzIzTDEyMCAzNzBMMjEzIDY2N0g1NjdMNTU3IDU5MUgyNzNMMjExIDQwNUwyMTQgNDAyUTI0OSA0MjggMjg0IDQ0MlQzNjMgNDU2UTQ1MCA0NTYgNDk2IDQxNVQ1NDMgMjg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNiIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTU1MyAyNTlRNTUzIDIwMSA1MzQgMTUyVDQ4MCA2NlQzOTcgOVQyOTAgLTEyUTE4MyAtMTIgMTM2IDQxVDg4IDE5OVE4OCAyMjMgOTAgMjQ2VDk1IDI5M1ExMDUgMzYzIDEyMyA0MzJUMTc3IDU1NVQyNjggNjQ0VDQwOCA2NzhRNDUwIDY3OCA0ODkgNjY3VDU2NCA2MzNMNTE3IDU2NVE0ODggNTg1IDQ2MSA1OTRUMzk4IDYwM1EzNDIgNjAzIDMwNSA1ODFUMjQ1IDUyMlQyMDggNDM5VDE4OCAzNDZIMTkyUTIyNCAzOTEgMjY4IDQxMVQzNjYgNDMyUTQwOCA0MzIgNDQyIDQyMVQ1MDEgMzg5VDUzOSAzMzVUNTUzIDI1OVpNMzAwIDYyUTM0MSA2MiAzNzEgNzZUNDIyIDExNlQ0NTIgMTc2VDQ2MiAyNDhRNDYyIDMwNyA0MzEgMzMyVDM0MiAzNThRMzAzIDM1OCAyNzIgMzQ0VDIxOSAzMDZUMTg2IDI1MFQxNzQgMTc5UTE3NCAxMTkgMjA4IDkxVDMwMCA2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IjciIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01OTIgNTkyUTUxOCA1MzYgNDcxIDQ4NFQzOTQgMzcxVDM0NyAyMzdUMzE2IDY1TDMwNyAwSDIxNEwyMTggMzBRMjI3IDk4IDI0MiAxNzRUMjg3IDMyNVQzNjMgNDY3VDQ4NCA1ODdWNTkxSDE0OEwxNTggNjY3SDU4OEw1OTIgNTkySDU5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01NDggMjI2UTU0OCAxNjYgNTI5IDEyMVQ0NzQgNDdUMzkxIDNUMjg2IC0xMlEyNDQgLTEyIDIwNiAtNVQxNDAgMjFUOTUgNzFUNzggMTUwUTc4IDIyNSAxMTAgMjc3VDIxNCAzNTVMMjE1IDM1OVExNzcgMzc1IDE1OSA0MDRUMTQwIDQ3NVExNDAgNTI5IDE1OSA1NjdUMjExIDYzMFQyODggNjY2VDM4MiA2NzhRNDE4IDY3OCA0NTIgNjcyVDUxNCA2NTFUNTU3IDYwOFQ1NzQgNTM4UTU3NCA0NzYgNTQ2IDQyOVQ0NTggMzU5TDQ1NyAzNTVRNTAzIDM0MCA1MjUgMzA3VDU0OCAyMjZaTTM0MSAzODhRNDA3IDM4OCA0NDYgNDIxVDQ4NSA1MjNRNDg1IDU0OSA0NzYgNTY1VDQ1MSA1OTBUNDE1IDYwMlQzNzIgNjA2UTMwNSA2MDYgMjY3IDU3NlQyMjggNDc1UTIyOCA0NDkgMjM3IDQzMlQyNjIgNDA2VDI5OCAzOTJUMzQxIDM4OFpNMjk1IDU5UTQ1OCA1OSA0NTggMjIzUTQ1OCAyNTMgNDQ4IDI3MlQ0MjEgMzAyVDM4MSAzMTdUMzMyIDMyMVExNjkgMzIxIDE2OSAxNTVRMTY5IDEyNSAxNzkgMTA3VDIwNiA3OFQyNDYgNjNUMjk1IDU5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOSIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTU3NiA0NTRRNTc2IDQyNyA1NzQgNDAxVDU2OCAzNDhRNTU4IDI3OCA1NDAgMjE0VDQ4NyA5OVQzOTkgMTlUMjYzIC0xMVEyMTUgLTExIDE3MiAyVDkzIDQ4TDE0NiAxMDlRMTc2IDgzIDIwNCA3MlQyNzMgNjFRMzMyIDYxIDM2OSA4NVQ0MjggMTQ5VDQ2MiAyMzZUNDgxIDMzM0g0NzdRNDQ4IDI4NyA0MDQgMjYxVDMwNSAyMzVRMjIwIDIzNSAxNjcgMjgwVDExNCA0MTRRMTE0IDQ3MiAxMzMgNTIwVDE4OCA2MDRUMjcyIDY1OFQzNzggNjc4UTQzMyA2NzggNDcxIDY2M1Q1MzIgNjE4VDU2NSA1NDhUNTc2IDQ1NFpNMzI3IDMxMFEzNjYgMzEwIDM5NiAzMjRUNDQ2IDM2MlQ0NzcgNDE4VDQ4NyA0ODhRNDg3IDU0NSA0NTYgNTc0VDM2OCA2MDRRMzI5IDYwNCAyOTkgNTkwVDI0OCA1NTJUMjE2IDQ5NVQyMDUgNDI1UTIwNSAzNjcgMjM4IDMzOVQzMjcgMzEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOiIgaG9yaXotYWR2LXg9IjIxMCIgZD0iTTIyNSA0MTNRMjI1IDM4MyAyMDQgMzY1VDE1NCAzNDdRMTMxIDM0NyAxMTYgMzU5VDEwMCAzOTZRMTAwIDQyNSAxMjEgNDQyVDE3MCA0NTlRMTkyIDQ1OSAyMDggNDQ4VDIyNSA0MTNaTTE3NSA1NVExNzUgMjUgMTU0IDdUMTA0IC0xMVE4MSAtMTEgNjUgMVQ0OSAzN1E0OSA2NyA3MCA4NFQxMjAgMTAxUTE0MiAxMDEgMTU4IDkwVDE3NSA1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjsiIGhvcml6LWFkdi14PSIyMTAiIGQ9Ik03MCAtMTE5SDEwTDc4IDk3SDE4MEw3MCAtMTE5Wk0yMzQgNDEzUTIzNCAzODMgMjEzIDM2NVQxNjMgMzQ2UTE0MCAzNDYgMTI0IDM1OFQxMDggMzk0UTEwOCA0MjQgMTI5IDQ0MVQxNzkgNDU4UTIwMSA0NTggMjE3IDQ0OFQyMzQgNDEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmx0OyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTgyIDIyM0w5MyAzMDBMNTk1IDUxNUw1ODQgNDM2TDE3MSAyNjJMNTM1IDkyTDUyNSAxNUw4MiAyMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI9IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNOTYgMzE5TDEwNyAzOTRINTc4TDU2NyAzMTlIOTZaTTcwIDEzMkw4MSAyMDdINTUyTDU0MSAxMzJINzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImZ3Q7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTMgMTVMNjMgOTJMNDc2IDI2MkwxMTIgNDM2TDEyMyA1MTVMNTY1IDMwMEw1NTQgMjIzTDUzIDE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPyIgaG9yaXotYWR2LXg9IjUxNSIgZD0iTTUzNCA1MzFRNTM0IDQ3OSA1MTggNDQ0VDQ3NSAzODRUNDExIDM0MVQzMzIgMzA1UTMxNSAyOTggMzA2IDI5M1QyOTEgMjgwVDI4MyAyNjNUMjc4IDIzNEwyNzAgMTcySDE4NEwxOTUgMjUxUTE5OCAyNzUgMjAzIDI5MFQyMTYgMzE3VDIzOSAzMzZUMjc1IDM1NFEzMDUgMzY3IDMzNSAzNzlUMzkwIDQwOVQ0MjkgNDUyVDQ0NSA1MTdRNDQ1IDU0MiA0MzYgNTU4VDQxMCA1ODVUMzc0IDU5OVQzMzEgNjA0UTI4NCA2MDQgMjQ1IDU4OFQxNjcgNTQ1TDEzMyA2MTBRMTg3IDY0MyAyMzggNjYwVDM1MiA2NzhRMzg4IDY3OCA0MjAgNjcwVDQ3OCA2NDVUNTE5IDYwMFQ1MzQgNTMxWk0yNjkgNTNRMjY5IDI0IDI0OSA3VDIwMCAtMTFRMTc4IC0xMSAxNjIgMFQxNDUgMzZRMTQ1IDY1IDE2NSA4MlQyMTQgOTlRMjM2IDk5IDI1MiA4OFQyNjkgNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJAIiBob3Jpei1hZHYteD0iODAzIiBkPSJNNzg2IDM0NVE3ODYgMzAxIDc3MiAyNTBUNzMxIDE1NlQ2NjQgODNUNTcyIDU0UTU0NSA1NCA1MjYgNzBUNTA3IDExNUg1MDJRNDc2IDg1IDQ0MSA2OFQzNjYgNTFRMzExIDUxIDI4NCA4MlQyNTcgMTY3UTI1NyAyMTEgMjcyIDI1NlQzMTQgMzM4VDM4MSAzOThUNDY4IDQyMVE0OTYgNDIxIDUxNyA0MTJUNTUyIDM3N0g1NTZMNTY3IDQxM0g2NDBRNjM3IDQwNCA2MzEgMzgxVDYxNiAzMjlUNTk4IDI2N1Q1ODIgMjA2VDU2OSAxNTdUNTY0IDEzMVE1NjQgMTAyIDU5NSAxMDJRNjA4IDEwMiA2MjAgMTA3VDY0MiAxMjBRNjY0IDEzNSA2ODAgMTU1VDcwNyAxOThUNzI1IDI0N1Q3MzYgMjk3UTczOSAzMTggNzM5IDMzOVE3MzkgMzkxIDcyMSA0MjlUNjcxIDQ5MlQ1OTcgNTI5VDUwNyA1NDJRNDI3IDU0MiAzNjAgNTE0VDI0MyA0MzVUMTY3IDMxNlQxMzkgMTY4UTEzOSAxMTAgMTU2IDY3VDIwNiAtNlQyODQgLTUwVDM4NiAtNjVRNDQ0IC02NSA0OTYgLTUxVDU5OCAtNkw2MTcgLTQzUTU2MCAtNzkgNTAwIC05M1QzNzMgLTEwN1EzMDcgLTEwNyAyNTUgLTg5VDE2NiAtMzVUMTEwIDUyVDkwIDE3MFE5MCAyNjAgMTIyIDMzNlQyMTEgNDY3VDM0NSA1NTRUNTExIDU4NVE1NjcgNTg1IDYxNyA1NzFUNzA0IDUyNlQ3NjQgNDUxVDc4NiAzNDVaTTM5NiAxMDVRNDQzIDEwNSA0NzIgMTM1VDUxMyAyMDdRNTIwIDIzMiA1MjggMjU5VDUzNyAzMTNRNTM3IDM0NSA1MTcgMzU1VDQ2OSAzNjZRNDMzIDM2NiA0MDcgMzQ4VDM2MiAzMDJUMzM2IDI0MFQzMjcgMTc1UTMyNyAxMDUgMzk2IDEwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkEiIGhvcml6LWFkdi14PSI2NDIiIGQ9Ik01MjIgMEw0ODcgMTYxSDE5NkwxMTYgMEgyMkwzNjIgNjcxSDQ2NEw2MjAgMEg1MjJaTTQwMSA1ODJIMzk3TDIyOSAyMzZINDczTDQwMSA1ODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJCIiBob3Jpei1hZHYteD0iNjM2IiBkPSJNNjAzIDIxMlE2MDMgMTYwIDU4NiAxMjFUNTM3IDU0VDQ2MSAxNFQzNjIgMEg4NkwxNzkgNjYzUTIyMiA2NjggMjc5IDY3MVQzOTEgNjc1UTQzMSA2NzUgNDcyIDY3MVQ1NDYgNjUzVDYwMCA2MTBUNjIxIDUzMlE2MjEgNDcwIDU5MCA0MjFUNDkzIDM1Mkw0OTIgMzQ4UTU0NSAzMzggNTc0IDMwNFQ2MDMgMjEyWk0zNTYgMzc5UTM5MSAzNzkgNDIzIDM4NFQ0NzkgNDAzVDUxNyA0NDRUNTMxIDUxNVE1MzEgNTQyIDUyMCA1NTlUNDkwIDU4NlQ0NDMgNTk5VDM4MiA2MDNRMzU2IDYwMyAzMjMgNjAyVDI2MCA1OTdMMjMwIDM4MFEyNTkgMzc5IDI5MSAzNzlUMzU2IDM3OVpNMzE0IDY4UTM1MyA2OCAzODkgNzJUNDUyIDkyVDQ5NyAxMzVUNTE0IDIxM1E1MTQgMjQ5IDQ5OSAyNjlUNDU5IDI5OFQ0MDQgMzEwVDM0NCAzMTJRMzAzIDMxMiAyNzYgMzEyVDIxOSAzMTFMMTg1IDcwUTIxOSA2OCAyNDggNjhUMzE0IDY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjYzMiIgZD0iTTYxMSA4M1E1NTUgMzggNDk1IDE0VDM2MyAtMTFRMjM0IC0xMSAxNzAgNThUMTA2IDI1NFExMDYgMzM1IDEyOCA0MTFUMTk0IDU0N1QzMDYgNjQyVDQ2MyA2NzhRNTI5IDY3OCA1ODAgNjU2VDY3OCA1ODZMNjE0IDUyNlE1ODAgNTYzIDU0MyA1ODJUNDU1IDYwMVEzODUgNjAxIDMzNyA1NzFUMjU5IDQ5MlQyMTYgMzg0VDIwMiAyNjNRMjAyIDIxOSAyMTEgMTgzVDI0MiAxMjFUMjk2IDgwVDM3NyA2NVE0MzIgNjUgNDgwIDg3VDU3MSAxNDVMNjExIDgzSDYxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02NTYgNDExUTY1NiAzMjUgNjMzIDI1MVQ1NjQgMTIwVDQ0OSAzMlQyODkgMEg4NkwxNzkgNjYzUTIzMCA2NjggMjgwIDY3MVQzODIgNjc1UTUxMSA2NzUgNTgzIDYwOVQ2NTYgNDExWk0yODMgNzRRMzQ5IDc0IDM5NiA5MlQ0NzYgMTQ0VDUyOCAyMjdUNTU2IDMzOVE1NTggMzU2IDU1OSAzNzJUNTYxIDQwNVE1NjEgNDk4IDUxNiA1NTBUMzc0IDYwMlEzNDUgNjAyIDMxNyA2MDBUMjYwIDU5NkwxODcgNzVRMjExIDc0IDIzNSA3NFQyODMgNzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJFIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNODYgMEwxNzkgNjY3SDU3N0w1NjYgNTkwSDI1OUwyMzEgMzkxSDUwOUw0OTggMzEzSDIyMEwxODcgNzZINTA2TDQ5NiAwSDg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRiIgaG9yaXotYWR2LXg9IjUxMCIgZD0iTTI1OSA1OTBMMjMxIDM4N0g1MDJMNDkxIDMwOUgyMjBMMTc3IDBIODZMMTc5IDY2N0g1NzBMNTU5IDU5MEgyNTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJHIiBob3Jpei1hZHYteD0iNjk4IiBkPSJNMzc4IDYwUTQ2NiA2MCA1MTcgMTA3VDU4MiAyMzVMNTg5IDI3N0g0MTFMNDIyIDM1Mkg2ODJMNjcyIDI3OFE2NTIgMTM1IDU3NSA2M1QzNjQgLTEwUTI5OCAtMTAgMjUwIDEwVDE2OSA2NlQxMjIgMTUxVDEwNiAyNjFRMTA2IDMzOCAxMjkgNDEzVDE5NyA1NDdUMzA5IDY0MlQ0NjUgNjc4UTU0MCA2NzggNTkwIDY1MlQ2NzYgNTkxTDYxMyA1MzBRNTc1IDU2OCA1MzcgNTg0VDQ1NyA2MDFRMzg2IDYwMSAzMzggNTcxVDI1OCA0OTFUMjE0IDM4MVQyMDAgMjU5UTIwMCAyMTggMjA5IDE4MlQyMzggMTE4VDI5MyA3NlQzNzggNjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBob3Jpei1hZHYteD0iNjYyIiBkPSJNNDg1IDBMNTI5IDMxNEgyMjFMMTc3IDBIODZMMTc5IDY2N0gyNzBMMjMzIDM5OUg1NDFMNTc4IDY2N0g2NjlMNTc2IDBINDg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSSIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBMMTc5IDY2N0gyNzBMMTc3IDBIODZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJKIiBob3Jpei1hZHYteD0iNDQ4IiBkPSJNMzg2IDE3N1EzNzMgODYgMzI3IDM3VDE4OSAtMTJRMTQ2IC0xMiAxMTIgLTFUNDUgMzhMOTQgMTA4UTExOSA4NCAxNDEgNzVUMTkxIDY2UTIzOCA2NiAyNjIgOTFUMjk0IDE3MEwzNjQgNjY3SDQ1NUwzODYgMTc3SDM4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI1NzkiIGQ9Ik00NDggMEwyOTEgMzIxTDIxMSAyNDJMMTc3IDBIODZMMTc5IDY2N0gyNzBMMjI2IDM1MkgyMzBMNTIxIDY2N0g2MzVMMzY3IDM4NEw1NjEgMEg0NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJMIiBob3Jpei1hZHYteD0iNDk4IiBkPSJNODYgMEwxNzkgNjY3SDI3MEwxODcgNzhINDY4TDQ1OCAwSDg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTSIgaG9yaXotYWR2LXg9Ijc2NyIgZD0iTTU5MyAwTDY2NSA1MThINjYxTDQxMCAxOThMMjUwIDUxNkgyNDZMMTc0IDBIODZMMTc5IDY2N0gyNjNMNDMwIDMzN0w2ODkgNjY3SDc3NEw2ODEgMEg1OTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMwIDBMMjUxIDUyMEgyNDdMMTc0IDBIODZMMTc5IDY2N0gyNjlMNTQ0IDE1NEg1NDhMNjIwIDY2N0g3MDhMNjE1IDBINTMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTczMyA0MTFRNzMzIDMyNyA3MTEgMjUxVDY0MyAxMTZUNTMwIDI0VDM3MSAtMTFRMjQwIC0xMSAxNzMgNTlUMTA1IDI1OFExMDUgMzQxIDEyOCA0MTdUMTk2IDU1MVQzMTAgNjQzVDQ2OCA2NzhRNTk4IDY3OCA2NjUgNjA5VDczMyA0MTFaTTM4MSA2M1E0NTMgNjMgNTAyIDk0VDU4MSAxNzRUNjI1IDI4NFQ2MzggNDA4UTYzOCA0OTkgNTk2IDU1MVQ0NTcgNjA0UTM4NSA2MDQgMzM2IDU3NFQyNTcgNDk0VDIxNCAzODRUMjAxIDI2MVEyMDEgMjE2IDIxMSAxODBUMjQyIDExN1QyOTggNzdUMzgxIDYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUCIgaG9yaXotYWR2LXg9IjYwMiIgZD0iTTYxOCA1MDlRNjE4IDQ1MiA2MDMgNDA2VDU1NiAzMjVUNDc5IDI3M1QzNjkgMjU0SDIxMkwxNzcgMEg4NkwxNzkgNjYzUTIyOCA2NjggMjgxIDY3MVQzODkgNjc1UTQzOCA2NzUgNDgwIDY2N1Q1NTMgNjQwVDYwMSA1ODlUNjE4IDUwOVpNMzUyIDMyN1EzOTMgMzI3IDQyNSAzMzVUNDc5IDM2NFQ1MTMgNDE2VDUyNSA0OTdRNTI1IDU1NiA0ODkgNTc4VDM3OSA2MDFRMzQ5IDYwMSAzMjEgNjAwVDI2MCA1OTRMMjIyIDMyN0gzNTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJRIiBob3Jpei1hZHYteD0iNzQ2IiBkPSJNNzMzIDQxNVE3MzMgMzYxIDcyMyAzMDZUNjkxIDIwMFQ2MzQgMTA3VDU0OCAzOFYzNFE1NjUgMjkgNTc3IDIxVDYwMiA0VDYzMCAtMTNUNjY4IC0yNkw2MzAgLTk0UTU5OSAtOTEgNTczIC03N1Q1MjQgLTQ4VDQ3OSAtMjBUNDM3IC04UTQyNiAtOCA0MDkgLTlUMzc1IC0xMVEyNDQgLTExIDE3NSA1NlQxMDUgMjU2UTEwNSAzNDAgMTI3IDQxNlQxOTUgNTUxVDMwOCA2NDNUNDY4IDY3OFE1OTggNjc4IDY2NSA2MTJUNzMzIDQxNVpNMzgxIDY0UTQ1NCA2NCA1MDMgOTVUNTgyIDE3NVQ2MjUgMjg3VDYzOCA0MTFRNjM4IDUwMiA1OTYgNTUyVDQ1NyA2MDNRMzg0IDYwMyAzMzUgNTczVDI1NiA0OTRUMjE0IDM4NFQyMDEgMjYwUTIwMSAxNjkgMjQzIDExN1QzODEgNjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJSIiBob3Jpei1hZHYteD0iNjA0IiBkPSJNNDU5IDBMNDA1IDI0MFE0MDAgMjYyIDM4OSAyNzBUMzU0IDI3OUgyMTZMMTc3IDBIODZMMTc5IDY2NFEyMzMgNjcwIDI3OSA2NzJUMzgwIDY3NVE0MjMgNjc1IDQ2NCA2NjhUNTM3IDY0M1Q1ODggNTk1VDYwNyA1MTdRNjA3IDQ4MiA1OTkgNDQ5VDU3NCAzODlUNTMwIDM0MFQ0NjcgMzA3VjMwM1E0NzcgMjk4IDQ4MyAyODZUNDkyIDI2MUw1NTUgMEg0NTlaTTM2MiAzNTJRNDM0IDM1MiA0NzQgMzg4VDUxNSA1MDJRNTE1IDUzMiA1MDQgNTUxVDQ3NCA1ODJUNDI4IDU5N1QzNzIgNjAyUTM0MiA2MDIgMzE2IDYwMVQyNjAgNTk1TDIyNiAzNTJIMzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUyIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTUxNiAyMDVRNTE2IDE1MCA0OTcgMTEwVDQ0MyA0MlQzNjQgMlQyNjcgLTExUTIwMiAtMTEgMTQ5IDZUNDQgNjJMOTYgMTMwUTEzNCA5OCAxNzcgODBUMjcxIDYyUTMwMSA2MiAzMjggNjlUMzc3IDkyVDQxMCAxMzFUNDIyIDE4OFE0MjIgMjIyIDQwMCAyNDRUMzQ1IDI4NVQyNzMgMzE5VDIwMSAzNThUMTQ2IDQxMVQxMjQgNDg5UTEyNCA1NDAgMTQzIDU3NlQxOTYgNjM0VDI3MiA2NjdUMzYxIDY3N1E0NjYgNjc3IDU1NCA2MThMNTEwIDU0NVE0NzYgNTcyIDQzNyA1ODdUMzUzIDYwM1EzMjkgNjAzIDMwNSA1OThUMjYxIDU4MlQyMjkgNTUyVDIxNyA1MDVRMjE3IDQ3MiAyMzkgNDUxVDI5NCA0MTNUMzY2IDM4MVQ0MzggMzQzVDQ5NCAyODhUNTE2IDIwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI1MDUiIGQ9Ik0zODAgNTg4TDI5OCAwSDIwN0wyODkgNTg4SDEwMUwxMTIgNjY3SDU3OUw1NjggNTg4SDM4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlUiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02MTkgMjU5UTU5OSAxMjEgNTMxIDU1VDMzMiAtMTFRMjE5IC0xMSAxNjggMzZUMTE2IDE4NFExMTYgMjE4IDEyMiAyNTlMMTc5IDY2N0gyNzBMMjEzIDI1OVEyMTEgMjQzIDIxMCAyMjhUMjA4IDE5OVEyMDggMTY5IDIxNCAxNDRUMjM3IDEwMlQyNzkgNzVUMzQzIDY1UTM5MCA2NSA0MjIgNzlUNDc2IDExOVQ1MTAgMTgwVDUyOCAyNTlMNTg1IDY2N0g2NzZMNjE5IDI1OUg2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJWIiBob3Jpei1hZHYteD0iNTc2IiBkPSJNMzM4IDBIMjM3TDExNSA2NjdIMjEyTDMwMSAxMDFIMzA1TDU1MiA2NjdINjQ3TDMzOCAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVyIgaG9yaXotYWR2LXg9IjkxNiIgZD0iTTcxMiAwSDYwOEw1MzMgNTM4SDUyOUwzMDcgMEgxOTZMMTIzIDY2N0gyMjNMMjcwIDEwNUgyNzVMNTA2IDY2N0g1OThMNjcxIDEwNUg2NzVMODgyIDY2N0g5NzlMNzEyIDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDQxIDBMMzIwIDI2OUgzMTZMMTIyIDBIMTdMMjc4IDM0NkwxMzUgNjY3SDI0MUwzNDIgNDE1SDM0Nkw1MjMgNjY3SDYyOEwzODcgMzM5TDU0NyAwSDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlkiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0zNjkgMjY1TDMzMiAwSDI0MUwyNzcgMjYyTDEwNiA2NjdIMjA5TDMzNSAzNDVMNTUyIDY2N0g2NTJMMzY5IDI2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IloiIGhvcml6LWFkdi14PSI1NTgiIGQ9Ik00NiAwTDU2IDc1TDQ4MCA1ODhIMTQzTDE1NCA2NjdINTk2TDU4NiA1OTNMMTYxIDc2SDUyMkw1MTIgMEg0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IlsiIGhvcml6LWFkdi14PSIzMTAiIGQ9Ik00MyAtMTA0TDE2NSA3NjJIMzUwTDM0MiA3MDZIMjM3TDEzMSAtNDhIMjM2TDIyOCAtMTA0SDQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9IjUxMiIgZD0iTTM4NiAtMTE1TDExNSA2NjdIMTk4TDQ2OCAtMTE1SDM4NloiICAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSIzMTAiIGQ9Ik00NyAtMTA0TDU1IC00OEgxNThMMjY0IDcwNkgxNjFMMTY5IDc2MkgzNTFMMjI5IC0xMDRINDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJeIiBob3Jpei1hZHYteD0iMzY2IiBkPSJNMzg1IDUyNUwyNjUgNjAyTDExOSA1MjVMODMgNTcxTDI3NSA2NzZMNDM5IDU3MUwzODUgNTI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXyIgaG9yaXotYWR2LXg9IjQ4NCIgZD0iTS0yOCAtMTQ0TC0xOSAtODVINDgwTDQ3MSAtMTQ0SC0yOFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImAiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0zMTQgNTY1TDE1NSA2NzRMMjQ5IDcxNEwzNjcgNTk1TDMxNCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJhIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDE1IDBMNDIwIDc3SDQxNlEzODcgMzIgMzQ1IDExVDI1MiAtMTFRMjA1IC0xMSAxNzMgNFQxMjEgNDVUOTIgMTA2VDgzIDE4MlE4MyAyMzUgOTQgMjkzVDEzNCA0MDFUMjA4IDQ4MlQzMjYgNTE0UTM3MSA1MTQgNDA1IDUwMFQ0NjIgNDQ0SDQ2Nkw0ODMgNTAySDU1OEw0ODggMEg0MTVaTTQ0NyAzMjZRNDU1IDM4NiA0MjQgNDE2VDMzNiA0NDZRMjg0IDQ0NiAyNTIgNDIxVDIwMiAzNThUMTc4IDI3NVQxNzIgMTg4UTE3MiAxNjEgMTc3IDEzN1QxOTQgOTVUMjI4IDY1VDI4MyA1NFEzMTUgNTQgMzQwIDY1VDM4NCA5NlQ0MTQgMTQzVDQzMCAyMDBMNDQ3IDMyNloiICAvPgorPGdseXBoIHVuaWNvZGU9ImIiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik01NTEgMzI0UTU1MSAyNzAgNTM5IDIxMVQ0OTggMTAyVDQyMyAyMVQzMDkgLTExUTI1NCAtMTEgMjE4IDEyVDE2OSA4MEgxNjVMMTQxIDBINzZMMTc0IDcwMEgyNjFMMjI0IDQ0MUgyMjhRMjU3IDQ4MyAyOTcgNDk4VDM4MiA1MTRRNDMwIDUxNCA0NjIgNDk5VDUxNCA0NTlUNTQyIDM5OVQ1NTEgMzI0Wk0yOTYgNTRRMzQ1IDU0IDM3NyA4MFQ0MjkgMTQ2VDQ1NSAyMzNUNDYzIDMyMlE0NjMgMzQ3IDQ1OCAzNzBUNDQxIDQwOVQ0MDcgNDM2VDM1MiA0NDZRMjk1IDQ0NiAyNTUgNDE2VDIwNyAzMjZMMTkwIDIwMFExODggMTkyIDE4OCAxODRUMTg4IDE2OFExODggMTE4IDIxNCA4NlQyOTYgNTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJjIiBob3Jpei1hZHYteD0iNDk1IiBkPSJNNDgxIDM5MFE0MzMgNDQ1IDM1NiA0NDVRMzA3IDQ0NSAyNzIgNDIzVDIxNSAzNjdUMTgzIDI4OVQxNzMgMjAzUTE3MyAxMzkgMjAzIDk5VDMwMiA1OFEzNDUgNTggMzc5IDcyVDQ0OCAxMTJMNDcwIDUxUTQyOCAyMiAzODMgNlQyODcgLTExUTE4OSAtMTEgMTM2IDQyVDgzIDE5NFE4MyAyNTcgMTAxIDMxNVQxNTUgNDE3VDI0MyA0ODhUMzYzIDUxNFE0MDkgNTE0IDQ1MSA0OThUNTI4IDQ1MUw0ODEgMzkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZCIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQxNSAwTDQyMCA3N0g0MTZRMzg3IDMyIDM0NSAxMVQyNTIgLTExUTIwNSAtMTEgMTczIDRUMTIxIDQ1VDkyIDEwNlQ4MyAxODJRODMgMjM1IDk0IDI5M1QxMzQgNDAxVDIwOCA0ODJUMzI2IDUxNFEzNzEgNTE0IDQwNCA1MDBUNDU5IDQ0NEg0NjNMNDk5IDcwMEg1ODZMNDg4IDBINDE1Wk00NDcgMzI2UTQ1NSAzODYgNDI0IDQxNlQzMzYgNDQ2UTI4NCA0NDYgMjUyIDQyMVQyMDIgMzU4VDE3OCAyNzVUMTcyIDE4OFExNzIgMTYxIDE3NyAxMzdUMTk0IDk1VDIyOCA2NVQyODMgNTRRMzE1IDU0IDM0MCA2NVQzODQgOTZUNDE0IDE0M1Q0MzAgMjAwTDQ0NyAzMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNTMzIDMxN1E1MzMgMjk0IDUzMCAyNjlUNTIzIDIyM0gxNzFRMTY4IDIwMiAxNjggMTg0UTE2OCAxMjQgMjAwIDkwVDI5OCA1NlEzMzYgNTYgMzczIDY3VDQ1NSAxMDhMNDc3IDQ4UTQyNyAxNiAzODEgM1QyODYgLTExUTE4NCAtMTEgMTM0IDQzVDg0IDE5MlE4NCAyNTMgMTAwIDMxMVQxNTAgNDE0VDIzNSA0ODdUMzU1IDUxNVE0NDMgNTE1IDQ4OCA0NjFUNTMzIDMxN1pNNDUxIDI4MlE0NTQgMzAzIDQ1NCAzMjNRNDU0IDM1MCA0NDggMzczVDQzMCA0MTNUMzk3IDQ0MVQzNDcgNDUxUTMwNiA0NTEgMjc2IDQzNlQyMjYgMzk3VDE5NSAzNDNUMTc5IDI4Mkg0NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJmIiBob3Jpei1hZHYteD0iMzE5IiBkPSJNMzk0IDYzNFEzODMgNjM2IDM3MiA2MzdUMzQ3IDYzOVEzMjQgNjM5IDMxMCA2MzZUMjg4IDYyNlQyNzYgNjA1VDI2OSA1NzFMMjU5IDUwMkgzNjdMMzU3IDQzMkgyNTJMMTkyIDBIMTA0TDE2NCA0MzFIODdMOTcgNTAySDE3NEwxODQgNTc2UTE4OSA2MTAgMTk4IDYzNFQyMjQgNjc0VDI2OSA2OTdUMzQyIDcwNVEzNTYgNzA1IDM3MSA3MDRUNDAzIDcwMEwzOTQgNjM0SDM5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImciIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00ODIgLTQzUTQ3MyAtMTA1IDQ1MyAtMTQxVDQwNSAtMTk2VDM0MyAtMjIwVDI3MyAtMjI2UTE0OCAtMjI2IDYxIC0xNzVMOTcgLTEwN1ExMzcgLTEzMiAxNzcgLTE0NVQyNjggLTE1OFEyOTggLTE1OCAzMTkgLTE1NFQzNTYgLTEzN1QzNzkgLTEwNVQzOTMgLTUyTDQxMiA3OUg0MDhRMzc2IDMzIDM0MCAxNVQyNTYgLTRRMjA5IC00IDE3NiAxMFQxMjMgNDlUOTMgMTEwVDgzIDE4NlE4MyAyMzkgOTQgMjk3VDEzNCA0MDNUMjA4IDQ4MlQzMjYgNTE0UTM3NiA1MTQgNDEwIDQ5OFQ0NjYgNDM2SDQ3MEw0ODQgNTAySDU1OEw0ODIgLTQzWk00NDcgMzI1UTQ1NiAzODYgNDI1IDQxNlQzMzYgNDQ2UTI4NiA0NDYgMjU1IDQyM1QyMDUgMzYzVDE4MCAyODNUMTczIDE5NlExNzMgMTY4IDE3OCAxNDRUMTk2IDEwMlQyMzAgNzRUMjgzIDYzUTMxNiA2MyAzNDEgNzRUMzg1IDEwNVQ0MTUgMTUxVDQzMSAyMDhMNDQ3IDMyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImgiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MDEgMEw0NDIgMjk0UTQ0NCAzMTEgNDQ2IDMyN1Q0NDggMzU2UTQ0OCAzOTUgNDI5IDQxN1QzNTQgNDQwUTI5MSA0NDAgMjUzIDQwOFQyMDcgMzE1TDE2MyAwSDc2TDE3NCA3MDBIMjYxTDIyNCA0NDBIMjI4UTI1NSA0NzggMjk1IDQ5NlQzODggNTE0UTQ3MiA1MTQgNTA0IDQ3OVQ1MzYgMzc4UTUzNiAzNjMgNTM1IDM0N1Q1MzEgMzEzTDQ4OCAwSDQwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImkiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik03NiAwTDE0NiA1MDJIMjMzTDE2MyAwSDc2Wk0yNjIgNjM2UTI2MiA2MDkgMjQ0IDU5M1QyMDAgNTc3UTE4MCA1NzcgMTY2IDU4N1QxNTEgNjE5UTE1MSA2NDUgMTcwIDY2MFQyMTQgNjc2UTIzNCA2NzYgMjQ4IDY2N1QyNjIgNjM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaiIgaG9yaXotYWR2LXg9IjI0NSIgZD0iTTI2NyA2MzVRMjY3IDYwOCAyNDkgNTkzVDIwNSA1NzdRMTg2IDU3NyAxNzIgNTg4VDE1NyA2MTlRMTU3IDY0NSAxNzUgNjYwVDIxOSA2NzZRMjM5IDY3NiAyNTMgNjY3VDI2NyA2MzVaTTE2MyAtMzlRMTUxIC0xMjYgMTA2IC0xNzZULTMyIC0yMjZRLTQ5IC0yMjYgLTY1IC0yMjVULTk5IC0yMjJMLTg4IC0xNDhRLTYxIC0xNTEgLTM0IC0xNTFRLTMgLTE1MSAxNyAtMTQzVDQ5IC0xMTlUNjcgLTgxVDc3IC0zMUwxNTIgNTAySDIzOUwxNjMgLTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iayIgaG9yaXotYWR2LXg9IjUwNCIgZD0iTTM4MCAwTDI3MCAyNDdMMTg1IDE2MkwxNjMgMEg3NkwxNzQgNzAwSDI2MUwxOTkgMjYzSDIwM0w0MzAgNTAySDU0MEwzNDEgMzA0TDQ4NSAwSDM4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImwiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0yNDQgMFEyMzIgLTIgMjE0IC0zVDE3NiAtNVExMzAgLTUgMTA5IDExVDg3IDY3UTg3IDc0IDg3IDgxVDg5IDk3TDE3NCA3MDBIMjYxTDE3OSAxMTlRMTc0IDgzIDE4NCA3NlQyMjIgNjlIMjUzTDI0NCAwSDI0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9Im0iIGhvcml6LWFkdi14PSI4NDEiIGQ9Ik02NzggMEw3MjAgMzA0UTcyMiAzMTggNzIzIDMzMVQ3MjUgMzU3UTcyNSAzOTUgNzA4IDQxN1Q2NDIgNDQwUTU4NiA0NDAgNTUyIDQxMlQ1MDkgMzI2TDQ2NCAwSDM3N0w0MjAgMzA4UTQyMiAzMjIgNDIzIDMzNFQ0MjQgMzU3UTQyNCAzOTYgNDA2IDQxOFQzMzcgNDQwUTMxMSA0NDAgMjg5IDQzMVQyNTAgNDA2VDIyMiAzNjlUMjA4IDMyM0wxNjMgMEg3NkwxNDYgNTAySDIyMVY0MzhIMjI1UTI0OSA0NzMgMjg1IDQ5M1QzNzEgNTE0UTQxOSA1MTQgNDUyIDQ5NlQ0OTcgNDM0UTUyOSA0NzggNTcwIDQ5NlQ2NjEgNTE0UTc0NCA1MTQgNzc4IDQ3NlQ4MTMgMzcxUTgxMyAzNTcgODEyIDM0M1Q4MDggMzEzTDc2NSAwSDY3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9Im4iIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MDEgMEw0NDIgMjk0UTQ0NCAzMTAgNDQ1IDMyNFQ0NDcgMzUyUTQ0NyAzNzIgNDQzIDM4OFQ0MjggNDE2VDM5OSA0MzRUMzUzIDQ0MFEyOTAgNDQwIDI1MyA0MDhUMjA3IDMxNUwxNjMgMEg3NkwxNDYgNTAySDIxOVY0MzlIMjIzUTI4MiA1MTQgMzg2IDUxNFE0MjkgNTE0IDQ1OCA1MDVUNTA0IDQ3OFQ1MjkgNDM1VDUzNyAzNzZRNTM3IDM2MiA1MzYgMzQ3VDUzMiAzMTRMNDg4IDBINDAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTg0IDE5MlE4NCAyNTYgMTAwIDMxNFQxNTEgNDE2VDIzNiA0ODdUMzU4IDUxNFE0NTggNTE0IDUwOSA0NjBUNTYwIDMwN1E1NjAgMjQ0IDU0MyAxODZUNDkxIDg1VDQwNSAxNVQyODQgLTExUTE4NSAtMTEgMTM1IDQyVDg0IDE5MlpNMzQ5IDQ0NVEyOTcgNDQ1IDI2MyA0MjJUMjA5IDM2MlQxODEgMjgxVDE3MyAxOTNRMTczIDEzMSAyMDAgOTRUMjk0IDU2UTM0NSA1NiAzNzkgNzlUNDM0IDEzOVQ0NjIgMjIwVDQ3MSAzMDhRNDcxIDM3MCA0NDQgNDA3VDM0OSA0NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJwIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNTUxIDMyNFE1NTEgMjY3IDUzOSAyMDhUNDk3IDEwMFQ0MjAgMjBUMzAzIC0xMVEyNTIgLTExIDIyMyA5VDE3NiA2N0gxNzJMMTMyIC0yMjBINDVMMTQ2IDUwMkgyMTdWNDM4SDIyMVEyNTMgNDgwIDI5MiA0OTdUMzgwIDUxNFE0MjkgNTE0IDQ2MSA0OTlUNTE0IDQ1OVQ1NDIgMzk5VDU1MSAzMjRaTTI5NCA1NFEzNDMgNTQgMzc2IDc5VDQyOCAxNDRUNDU1IDIzMFQ0NjMgMzIyUTQ2MyAzNDggNDU4IDM3MFQ0NDAgNDEwVDQwNiA0MzZUMzUwIDQ0NlEyOTMgNDQ2IDI1NSA0MTZUMjA3IDMyNUwxOTAgMjAxUTE4OCAxOTMgMTg4IDE4NVQxODggMTY4UTE4OCAxMTggMjEzIDg2VDI5NCA1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9InEiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00NDcgLTIzN1E0MTIgLTIyNSAzOTcgLTIwN1QzODEgLTE1M1EzODEgLTEzOSAzODQgLTExOUw0MTAgNjdINDA2UTM3NyAyNSAzNDAgN1QyNTQgLTExUTIwNiAtMTEgMTc0IDRUMTIxIDQ2VDkyIDEwOFQ4MyAxODRRODMgMjM4IDk1IDI5NlQxMzUgNDAzVDIwOSA0ODNUMzI2IDUxNFEzNzEgNTE0IDQwOCA0OTlUNDY1IDQzOEg0NjlMNDg1IDUwMkg1NThMNDczIC0xMDFRNDY4IC0xMzIgNDczIC0xNDZUNTA0IC0xNzNMNDQ3IC0yMzdaTTQ0NyAzMjZRNDU1IDM4NSA0MjUgNDE1VDMzNiA0NDZRMjg1IDQ0NiAyNTMgNDIyVDIwMyAzNjFUMTc5IDI3OFQxNzIgMTkwUTE3MiAxNjMgMTc3IDEzOVQxOTUgOTVUMjI5IDY1VDI4MyA1NFEzMTUgNTQgMzQwIDY1VDM4NCA5NlQ0MTQgMTQzVDQzMCAyMDBMNDQ3IDMyNloiICAvPgorPGdseXBoIHVuaWNvZGU9InIiIGhvcml6LWFkdi14PSIzNjUiIGQ9Ik0zNzggNDM2UTMwNyA0MzYgMjYyIDQxMVQyMDcgMzE4TDE2MyAwSDc2TDE0NiA1MDJIMjE5VjQzOEgyMjNRMjUxIDQ3NyAyOTAgNDk1VDM4NSA1MTNINDExTDQwMCA0MzZIMzc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icyIgaG9yaXotYWR2LXg9IjQ1MCIgZD0iTTQyOSAxNTdRNDI5IDExMiA0MTMgODFUMzcwIDI5VDMwNyAtMVQyMzAgLTExUTE3OSAtMTEgMTMxIDFUNDAgNDJMODEgMTA2UTExMyA4MyAxNTMgNjlUMjM0IDU1UTI1NSA1NSAyNzQgNTlUMzEwIDczVDMzNSA5OVQzNDUgMTM4UTM0NSAxNjQgMzI3IDE4MFQyODIgMjA3VDIyMyAyMjlUMTY0IDI1NVQxMTggMjk1VDEwMCAzNjBRMTAwIDQwMSAxMTYgNDMwVDE2MCA0NzhUMjIzIDUwNVQyOTcgNTE0UTMzOSA1MTQgMzgwIDUwNVQ0NTggNDc1TDQyNCA0MDlRMzk3IDQyNyAzNjIgNDM2VDI5NSA0NDZRMjc3IDQ0NiAyNTcgNDQzVDIyMSA0MzNUMTk0IDQxMVQxODMgMzc0UTE4MyAzNTEgMjAxIDMzN1QyNDYgMzExVDMwNiAyODlUMzY1IDI2MlQ0MTEgMjIxVDQyOSAxNTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ0IiBob3Jpei1hZHYteD0iMzUyIiBkPSJNMzEwIC0xUTI5NCAtMyAyNzggLTRUMjQ2IC02UTIwOCAtNiAxODQgMFQxNDUgMTdUMTI1IDQ1VDExOSA4NFExMTkgMTAzIDEyMiAxMjZMMTY1IDQzMUg4Mkw5MiA1MDJIMTc2TDE5NSA2NDBIMjgxTDI2MiA1MDJIMzgxTDM3MSA0MzFIMjUyTDIxMSAxMzlRMjA4IDEyMSAyMDggMTA5UTIwOCA4NiAyMjMgNzdUMjg4IDY3UTI5NyA2NyAzMDMgNjdUMzIwIDY4TDMxMCAtMUgzMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ1IiBob3Jpei1hZHYteD0iNTU1IiBkPSJNNDA2IDBWNjNINDAyUTM3OSAzMSAzNDEgMTBUMjQyIC0xMVEyMDggLTExIDE4MSAtNVQxMzYgMTdUMTA3IDYwVDk3IDEyOFE5NyAxNDIgOTggMTU4VDEwMiAxOTJMMTQ2IDUwMkgyMzNMMTk2IDIzN1ExOTIgMjEzIDE5MCAxOTJUMTg4IDE1M1ExODggMTA4IDIwNiA4NVQyNzcgNjJRMzQ3IDYyIDM3OSA5OFQ0MTkgMTk0TDQ2MiA1MDJINTQ5TDQ3OSAwSDQwNloiICAvPgorPGdseXBoIHVuaWNvZGU9InYiIGhvcml6LWFkdi14PSI0ODUiIGQ9Ik0yOTYgMEgxOTFMOTAgNTAySDE4M0wyNTQgNzdIMjU4TDQ0NSA1MDJINTM1TDI5NiAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9Ijc0NyIgZD0iTTU3NiAwSDQ4M0w0MjYgMzczSDQyMkwyNjEgMEgxNjhMOTUgNTAySDE4NUwyMzAgODZIMjM0TDQwNyA1MDJINDc4TDUzNiA4Nkg1NDBMNzA0IDUwMkg3OTJMNTc2IDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ4IiBob3Jpei1hZHYteD0iNDc1IiBkPSJNMzYxIDBMMjY5IDIwN0gyNjVMMTE1IDBIMTVMMjI0IDI2NUwxMDUgNTAySDIwNEwyODQgMzIwSDI4OEw0MTkgNTAySDUxMkwzMjkgMjY4TDQ2MCAwSDM2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik0yNTYgLTY1UTIzMiAtMTEzIDIxMiAtMTQ0VDE3MCAtMTkzVDEyNSAtMjE5VDY2IC0yMjZRNDUgLTIyNiAxMiAtMjIzTDIzIC0xNDlRMzEgLTE1MSA0MCAtMTUxVDY2IC0xNTJRODUgLTE1MiA5OCAtMTQ4VDEyNCAtMTMyVDE0OCAtMTAwVDE3NiAtNDhMMjA5IDE4TDg4IDUwMkgxODJMMjY2IDExMUgyNzBMNDU0IDUwMkg1NDdMMjU2IC02NVoiICAvPgorPGdseXBoIHVuaWNvZGU9InoiIGhvcml6LWFkdi14PSI0NTQiIGQ9Ik0zOSAwTDQ4IDY4TDM2OCA0MzFIMTA1TDExNSA1MDJINDc3TDQ2NyA0MzFMMTQ4IDcxSDQyNEw0MTUgMEgzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9InsiIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0yMTkgLTEwNFExNjEgLTEwNCAxMzkgLTgyVDExNyAtMTZRMTE3IC02IDExOCA1VDEyMSAyOEwxNDcgMjA3UTE1MiAyMzkgMTQ1IDI2MVQxMDUgMjkyTDExNCAzNjFRMTUwIDM2OSAxNjIgMzkxVDE4MCA0NDZMMjA2IDYzMVEyMTAgNjYyIDIxOCA2ODdUMjQyIDcyOVQyODEgNzU1VDMzOSA3NjRIMzg4TDM4MCA3MDZIMzU0UTMzMSA3MDYgMzE5IDcwMFQzMDAgNjgyVDI5MSA2NTZUMjg1IDYyMUwyNTkgNDM1UTI1NiA0MTUgMjUyIDQwMVQyMzkgMzc0VDIxOSAzNTBUMTg5IDMyN1EyMTIgMzA3IDIyMSAyOTFUMjMxIDI1MFEyMzEgMjM2IDIyOCAyMThMMjAzIDM5UTIwMSAyNSAyMDAgMTRUMTk5IC03UTE5OSAtMjkgMjA5IC0zOFQyNDggLTQ3SDI3NEwyNjYgLTEwNEgyMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ8IiBob3Jpei1hZHYteD0iMjMzIiBkPSJNNTIgLTIwMkwxODUgNzQwSDI1NEwxMjEgLTIwMkg1MloiICAvPgorPGdseXBoIHVuaWNvZGU9In0iIGhvcml6LWFkdi14PSIzNDgiIGQ9Ik0zMjUgMjkyUTI4OCAyODQgMjc2IDI2MlQyNTggMjA3TDIzMiAyOFEyMjcgLTQgMjE5IC0yOFQxOTYgLTcwVDE1OCAtOTVUOTkgLTEwNEg1Mkw2MCAtNDdIODZRMTA3IC00NyAxMTkgLTQzVDEzOCAtMjhUMTQ4IC0yVDE1NSAzOUwxODAgMjE4UTE4MyAyMzggMTg3IDI1M1QxOTkgMjgwVDIxOCAzMDNUMjQ4IDMyN1EyMjYgMzQ2IDIxNyAzNjJUMjA4IDQwMlEyMDggNDE1IDIxMSA0MzVMMjM3IDYyMVEyMzkgNjM0IDI0MCA2NDVUMjQyIDY2NlEyNDIgNjg1IDIzMiA2OTVUMTkzIDcwNkgxNjZMMTc0IDc2NEgyMjJRMjc4IDc2NCAyOTkgNzQxVDMyMSA2NzVRMzIxIDY2NSAzMjAgNjU0VDMxNyA2MzFMMjkxIDQ0NlEyODYgNDE0IDI5NCAzOTJUMzM0IDM2MUwzMjUgMjkySDMyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9In4iIGhvcml6LWFkdi14PSI0MTUiIGQ9Ik00OTIgNjIyUTQ3MiA1ODYgNDQyIDU2OFQzNzMgNTUwUTM1MCA1NTAgMzMwIDU1NlQyOTAgNTY5VDI1MSA1ODNUMjEyIDU5MFExOTEgNTkwIDE3NSA1ODJUMTQyIDU0OEw5MiA1NzJRMTIwIDYxMyAxNDcgNjI4VDIxMyA2NDRRMjM1IDY0NCAyNTUgNjM4VDI5NCA2MjRUMzMyIDYxMFQzNzEgNjA0UTM5MSA2MDQgNDA4IDYxM1Q0MzkgNjQ0TDQ5MiA2MjJINDkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTA7IiBob3Jpei1hZHYteD0iMzUwIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEExOyIgaG9yaXotYWR2LXg9IjI4MSIgZD0iTTgyIC0xNjNRMTA0IC00MSAxMjQgODBUMTY1IDMyM0gyMzZRMjIyIDIwMSAyMDkgODBUMTgzIC0xNjNIODJaTTE1NiA0NDlRMTU2IDQ3OSAxNzcgNDk3VDIyOCA1MTVRMjUxIDUxNSAyNjggNTA0VDI4NSA0NjdRMjg1IDQzNyAyNjMgNDIwVDIxMiA0MDNRMTkwIDQwMyAxNzMgNDE0VDE1NiA0NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMjsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01MTQgMTQ4UTQ4MCAxMjEgNDQyIDEwM1QzNjEgNzhMMzUxIDBIMjY5TDI3OSA3OFEyMzcgODMgMjA4IDEwMFQxNTkgMTQ1VDEzMSAyMDdUMTIyIDI4MVExMjIgMzM2IDEzNSAzODlUMTc3IDQ4NVQyNDkgNTU3VDM1MiA1OTVMMzYyIDY2N0g0NDRMNDM0IDU5NlE0NzIgNTkyIDUwNSA1NzdUNTY3IDUzN0w1MjAgNDc1UTQ3MCA1MjkgMzk0IDUyOVEzNDMgNTI5IDMwOCA1MDhUMjUyIDQ1MlQyMjIgMzc0VDIxMiAyODdRMjEyIDI1NSAyMTkgMjI5VDI0MSAxODVUMjc5IDE1NlQzMzcgMTQ1UTM4MCAxNDUgNDE1IDE2MVQ0ODQgMjA0TDUxNCAxNDhINTE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTM7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNTEyIDBINjNMNzIgNzFIOTJRMTI1IDcxIDE0OCA4NlQxODQgMTI2VDIwNCAxODNUMjEwIDI0OFEyMTAgMjY4IDIwOSAyODdUMjA2IDMyNUgxMjJMMTMyIDM5NEgyMDVRMjAyIDQyMSAyMDAgNDQ0VDE5NyA0OTFRMTk3IDU4MCAyNDkgNjI5VDQwMiA2NzhRNDUwIDY3OCA0OTMgNjY3VDU3MiA2MzJMNTQwIDU1N1E1MTMgNTc3IDQ4MSA1OTBUNDA2IDYwM1EzNDAgNjAzIDMxMiA1NzNUMjg0IDQ4MFEyODQgNDYwIDI4NiA0MzlUMjg5IDM5NEg0NDBMNDMwIDMyNUgyOTJRMjk1IDMwMyAyOTcgMjgzVDI5OSAyNDJRMjk5IDE5NSAyODcgMTU0VDIzNiA3OUwyMzUgNzZINTIyTDUxMiAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMTI3IDMxMVExMjcgMzUyIDE0MiAzOTBUMTg1IDQ1OEwxMjUgNTI5TDE3OCA1NzZMMjM5IDUwNFEyNjcgNTIyIDI5OCA1MzJUMzYyIDU0MlEzOTIgNTQyIDQyMSA1MzNUNDczIDUwM0w1NTYgNTc1TDU5NyA1MjhMNTE1IDQ1N1E1MzkgNDE2IDUzOSAzNjhRNTM5IDMyNyA1MjQgMjkwVDQ4MiAyMjJMNTQ0IDE1MEw0OTAgMTAzTDQyOCAxNzVRNDAxIDE1NyAzNzAgMTQ3VDMwNSAxMzdRMjc1IDEzNyAyNDYgMTQ2VDE5MyAxNzVMMTEyIDEwNEw3MiAxNTFMMTUyIDIyMVExMjcgMjYxIDEyNyAzMTFaTTM1MSA0NjhRMzIyIDQ2OCAyOTYgNDU2VDI0OSA0MjRUMjE3IDM3OFQyMDUgMzIyUTIwNSAyNzQgMjM2IDI0NFQzMTUgMjEzUTM0NCAyMTMgMzcwIDIyNVQ0MTcgMjU3VDQ1MCAzMDNUNDYyIDM1OFE0NjIgMzgyIDQ1NCA0MDJUNDMwIDQzN1QzOTUgNDYwVDM1MSA0NjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik00NDAgMzYySDU2NEw1NTYgMzAySDM5N0wzNzIgMjY3TDM2MyAyMDJINTQyTDUzMyAxNDJIMzU0TDMzNSAwSDI0NUwyNjQgMTQySDgzTDkyIDIwMkgyNzNMMjgxIDI2MkwyNjQgMzAySDEwNkwxMTQgMzYySDIzNkwxMjIgNjY3SDIyNUwzMzkgMzQyTDU0MSA2NjdINjM5TDQ0MCAzNjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNjsiIGhvcml6LWFkdi14PSIyMzMiIGQ9Ik0xMjggMzM1TDE4NSA3NDBIMjU0TDE5NyAzMzVIMTI4Wk01MiAtMjAyTDEwOSAyMDNIMTc4TDEyMSAtMjAySDUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTc7IiBob3Jpei1hZHYteD0iNDc0IiBkPSJNNDcwIDMyM1E0NzAgMjg3IDQ1NyAyNjFUNDIyIDIxOFQzNzEgMTkyVDMwOSAxODFWMTc3UTMzMyAxNjkgMzU1IDE1OFQzOTQgMTMyVDQyMiA5NVQ0MzMgNDZRNDMzIDMgNDE1IC0yN1QzNjkgLTc2VDMwMyAtMTA0VDIyOSAtMTEzUTE3OCAtMTEzIDEzNyAtMTAyVDUyIC02M0w5MiAyUTEyMyAtMjAgMTYwIC0zM1QyMzUgLTQ3UTI1NiAtNDcgMjc1IC00M1QzMDkgLTI5VDMzMiAtM1QzNDEgMzdRMzQxIDYxIDMyMiA3OFQyNzUgMTA4VDIxNCAxMzVUMTUyIDE2NVQxMDUgMjA2VDg2IDI2NVE4NiAzMDAgOTkgMzI1VDEzNSAzNjhUMTg3IDM5M1QyNDggNDA0TDI0OSA0MDdRMjI5IDQxNCAyMDkgNDI1VDE3MiA0NTFUMTQ1IDQ4NVQxMzQgNTI5UTEzNCA1NzAgMTUzIDU5OFQyMDEgNjQ0VDI2NiA2NzBUMzM2IDY3OFEzNzggNjc4IDQxNiA2NzBUNDkyIDY0NEw0NTggNTc0UTQyOSA1OTEgMzk4IDYwMFQzMzMgNjEwUTMxNiA2MTAgMjk3IDYwN1QyNjEgNTk3VDIzNSA1NzVUMjI0IDUzOVEyMjQgNTE1IDI0MiA0OTlUMjg3IDQ2OVQzNDcgNDQ1VDQwNiA0MTdUNDUyIDM3OVQ0NzAgMzIzWk0yNjYgMjEzUTI4OSAyMTMgMzEwIDIxN1QzNDggMjMwVDM3NSAyNTdUMzg1IDMwMlEzODUgMzIyIDM3NiAzMzRUMzUyIDM1MlQzMjAgMzYwVDI4NyAzNjJRMjY1IDM2MiAyNDQgMzU5VDIwNiAzNDZUMTc5IDMxOVQxNjggMjc1UTE2OCAyNTUgMTc3IDI0M1QyMDEgMjI1VDIzMyAyMTZUMjY2IDIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE4OyIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTQxMSA2MjlRNDExIDYwNiAzOTQgNTg5VDM1MyA1NzJRMzM1IDU3MiAzMjIgNTg0VDMwOCA2MTVRMzA4IDYzOCAzMjYgNjU1VDM2NyA2NzNRMzg2IDY3MyAzOTggNjYxVDQxMSA2MjlaTTIyNCA2MjlRMjI0IDYwNiAyMDYgNTg5VDE2NSA1NzJRMTQ3IDU3MiAxMzQgNTg0VDEyMSA2MTVRMTIxIDYzOCAxMzggNjU1VDE3OSA2NzNRMTk4IDY3MyAyMTEgNjYxVDIyNCA2MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBOTsiIGhvcml6LWFkdi14PSI4NjYiIGQ9Ik03NzkgMzM0UTc3OSAyNjIgNzUyIDIwMFQ2NzggOTFUNTY4IDE3VDQzMyAtMTBRMzYxIC0xMCAyOTggMTdUMTg4IDkwVDExNCAxOTlUODcgMzM0UTg3IDQwNiAxMTQgNDY4VDE4OCA1NzdUMjk4IDY1MVQ0MzMgNjc4UTUwNSA2NzggNTY4IDY1MVQ2NzggNTc4VDc1MiA0NjlUNzc5IDMzNFpNNzQxIDMzNFE3NDEgMzk3IDcxOCA0NTNUNjUzIDU1MlQ1NTUgNjE4VDQzMyA2NDNRMzY4IDY0MyAzMTIgNjE5VDIxNCA1NTJUMTUwIDQ1NFQxMjYgMzM0UTEyNiAyNzEgMTUwIDIxNlQyMTYgMTE4VDMxNCA1MlQ0MzMgMjhRNDk2IDI4IDU1MiA1MlQ2NTAgMTE4VDcxNiAyMTVUNzQxIDMzNFpNNTk5IDE3OFE1NjUgMTQ4IDUyNyAxMzFUNDQyIDExNFEzODQgMTE0IDM0NiAxMzBUMjg0IDE3NlQyNTEgMjQ2VDI0MSAzMzVRMjQxIDM4NSAyNTIgNDI1VDI4OSA0OTRUMzUyIDUzN1Q0NDQgNTUyUTQ5MSA1NTIgNTI4IDUzNlQ1OTkgNDg5TDU2NCA0NDRRNTM5IDQ3MCA1MTAgNDg0VDQ0NSA0OThRNDA0IDQ5OCAzNzcgNDg3VDMzNSA0NTRUMzEzIDQwM1QzMDYgMzM2UTMwNiAyOTggMzEyIDI2N1QzMzQgMjE0VDM3NiAxODFUNDQzIDE2OVE0NzkgMTY5IDUwOCAxODNUNTY2IDIyM0w1OTkgMTc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUE7IiBob3Jpei1hZHYteD0iMzkwIiBkPSJNMzQ3IDM3MFEzMzQgMzc0IDMyNSAzODFUMzEzIDQwM0gzMDlRMjg2IDM4NyAyNjAgMzc4VDIwNSAzNjhRMTY5IDM2OCAxNDYgMzg2VDEyMiA0NDNRMTIyIDQ4NSAxNDIgNTEwVDE5NCA1NTBUMjYyIDU2OFQzMzEgNTczUTMzMiA1ODEgMzMzIDU4OFQzMzQgNjAyUTMzNCA2MjAgMzIzIDYyN1QyODkgNjM0UTI0NyA2MzQgMjE2IDYyM1QxNjkgNjAzTDE1NCA2NDZRMTg5IDY2MyAyMjQgNjcyVDI5NyA2ODJRMzM5IDY4MiAzNjYgNjY3VDM5MyA2MDVRMzkzIDU4NyAzOTAgNTY1VDM4MiA1MTlUMzc1IDQ3M1QzNzEgNDM1UTM3MSA0MjUgMzc2IDQyMFQzODkgNDEwTDM0NyAzNzBaTTMyNiA1MzZRMzA2IDUzNiAyODEgNTMzVDIzMyA1MjFUMTk2IDQ5NlQxODEgNDUyUTE4MSA0MzIgMTkzIDQyMVQyMjUgNDA5UTI0OSA0MDkgMjcwIDQxOFQzMTIgNDQxTDMyNiA1MzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQjsiIGhvcml6LWFkdi14PSI0NTQiIGQ9Ik0zNjQgMTEwTDI1MyAzMDZMNDE5IDUwMkw0NzQgNDY5TDMzMSAzMDVMNDI4IDE0NEwzNjQgMTEwWk0xNzcgMTA0TDYyIDMwNkwyMzMgNTA4TDI4NyA0NzVMMTQwIDMwNUwyNDEgMTM4TDE3NyAxMDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQzsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik00NzkgMjI0SDgyTDkzIDMwMEg1NjVMNTI5IDQ0SDQ1NEw0NzkgMjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUQ7IiBob3Jpei1hZHYteD0iMzc2IiBkPSJNODIgMjE5TDk0IDMwMEgzNjZMMzU0IDIxOUg4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFFOyIgaG9yaXotYWR2LXg9IjQ1MyIgZD0iTTI5NyAzNjFRMjYxIDM2MSAyMjkgMzc0VDE3MyA0MTFUMTM2IDQ2NFQxMjIgNTMwUTEyMiA1NjUgMTM1IDU5NlQxNzMgNjUwVDIyOSA2ODZUMjk3IDcwMFEzMzMgNzAwIDM2NCA2ODdUNDIwIDY1MFQ0NTcgNTk2VDQ3MSA1MzBRNDcxIDQ5NSA0NTggNDY1VDQyMCA0MTFUMzY1IDM3NVQyOTcgMzYxWk0yOTggNjc2UTI2NiA2NzYgMjM5IDY2NVQxOTEgNjMzVDE1OSA1ODdUMTQ3IDUzMVExNDcgNTAyIDE1OSA0NzZUMTkxIDQyOVQyMzkgMzk4VDI5NyAzODZRMzI3IDM4NiAzNTQgMzk3VDQwMiA0MjhUNDM1IDQ3NFQ0NDcgNTMxUTQ0NyA1NjAgNDM1IDU4NlQ0MDMgNjMzVDM1NiA2NjRUMjk4IDY3NlpNMjMyIDYyNFEyNTIgNjI2IDI2NyA2MjdUMjk4IDYyOFEzMTIgNjI4IDMyNiA2MjZUMzUxIDYxNlQzNjggNTk4VDM3NSA1NjhRMzc1IDU1MSAzNjcgNTM5VDM0NSA1MTlMMzc5IDQzOUgzMzZMMzEwIDUwM1EzMDggNTA3IDMwNyA1MDhUMzAwIDUwOUgyNzBWNDM5SDIzMlY2MjRaTTI5OSA1OTVRMjkxIDU5NSAyODQgNTk1VDI3MCA1OTRWNTM5SDMwMVEzMzYgNTM5IDMzNiA1NjZRMzM2IDU5NSAyOTkgNTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUY7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMTExIDU4OUwxMTkgNjQ2SDQxN0w0MDkgNTg5SDExMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIwOyIgaG9yaXotYWR2LXg9IjQxMCIgZD0iTTQyNiA1NTlRNDI2IDUyMiA0MTQgNDkyVDM3OSA0NDFUMzI3IDQwOVQyNjMgMzk4UTIzNiAzOTggMjEzIDQwN1QxNzIgNDMyVDE0NCA0NzBUMTM0IDUxOVExMzQgNTU2IDE0NiA1ODVUMTgwIDYzNlQyMzIgNjY4VDI5NyA2ODBRMzI1IDY4MCAzNDkgNjcxVDM5MCA2NDZUNDE2IDYwOFQ0MjYgNTU5Wk0yNjUgNDMzUTMyMCA0MzMgMzUyIDQ2NVQzODUgNTU0UTM4NSA1OTMgMzYzIDYxOFQyOTUgNjQ0UTIzOSA2NDQgMjA3IDYxMVQxNzUgNTI0UTE3NSA0ODUgMjAwIDQ1OVQyNjUgNDMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjE7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMzY3IDI4MkwzNDQgMTE0SDI2N0wyOTAgMjgySDkwTDEwMSAzNTdIMzAxTDMyNyA1NDZINDA0TDM3OCAzNTdINTczTDU2MiAyODJIMzY3Wk01MSAwTDYxIDczSDUzM0w1MjMgMEg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIyOyIgaG9yaXotYWR2LXg9IjMwOSIgZD0iTTkzIDM2N0w5MSA0MjFRMTA4IDQzNCAxNDEgNDU0VDIwNyA0OTlUMjY0IDU1MVQyODkgNjA1UTI4OSA2MTkgMjgwIDYzNFQyNDUgNjQ5UTIyMSA2NDkgMjAxIDY0MFQxNTcgNjA4TDEyOCA2NDdRMTYyIDY3NiAxOTIgNjg4VDI1OCA3MDBRMzAzIDcwMCAzMjcgNjc3VDM1MiA2MTZRMzUyIDU4MyAzMzQgNTU2VDI4OCA1MDZUMjI2IDQ2MVQxNTkgNDE3SDMyOEwzMjEgMzY3SDkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjM7IiBob3Jpei1hZHYteD0iMzAyIiBkPSJNMzI4IDQ3OFEzMjggNDIyIDI5NCAzOTJUMTk3IDM2MVExNjUgMzYxIDEzNiAzNjlUODMgMzk5TDExNSA0NDJRMTM1IDQyNCAxNTQgNDE3VDE5OCA0MDlRMjI2IDQwOSAyNDcgNDI1VDI2OSA0NzVRMjY5IDUxMyAyMTUgNTEzSDE3MkwxNzggNTU3SDIwNlEyMTYgNTU3IDIyOSA1NTlUMjUzIDU2OFQyNzEgNTg1VDI3OSA2MTJRMjc5IDYzMCAyNjcgNjQwVDIzMiA2NTFRMjEwIDY1MSAxODggNjQ0VDE0NiA2MTlMMTI0IDY2MVExNTcgNjgzIDE4NCA2OTFUMjQ1IDcwMFEyODggNzAwIDMxNCA2ODJUMzQwIDYyNVEzNDAgNTY5IDI4MyA1NDRWNTQwUTMyOCA1MjggMzI4IDQ3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTIwMiA1NjVMMTU3IDU5NkwzMTEgNzE3TDM5MSA2NzVMMjAyIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI1OyIgaG9yaXotYWR2LXg9IjU4MSIgZD0iTTQxNyAwVjYzSDQxMlEzODkgMzIgMzU3IDExVDI2NiAtMTFRMjUzIC0xMSAyMzkgLTEwVDIxMiAtM1QxODkgMTJUMTcxIDM2TDEzNSAtMjIwSDU2TDE1NyA1MDJIMjQ1TDIwOCAyMzhRMjA0IDIxMyAyMDIgMTkxVDIwMCAxNTFRMjAwIDEwOCAyMTggODZUMjg5IDYzUTM1OSA2MyAzOTAgOTlUNDMwIDE5NEw0NzMgNTAySDU2MUw0OTEgMEg0MTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGhvcml6LWFkdi14PSI0ODgiIGQ9Ik0zMjEgMFEyNzAgMCAyMjMgMTFUMTQwIDQ4VDgyIDExNFQ2MCAyMTJRNjAgMjgyIDg3IDMzNlQxNjAgNDI3VDI2NSA0ODNUMzkxIDUwMkg0NThMMzg4IDBIMzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjc7IiBob3Jpei1hZHYteD0iMjEwIiBkPSJNMjAxIDI0N1EyMDEgMjE3IDE4MCAxOTlUMTI5IDE4MVExMDYgMTgxIDkwIDE5M1Q3MyAyMjlRNzMgMjU5IDk0IDI3NlQxNDUgMjkzUTE2NyAyOTMgMTg0IDI4MlQyMDEgMjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjg7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMjU3IC0xMTBRMjU3IC0xNjAgMjI1IC0xODNUMTQ4IC0yMDZRMTI0IC0yMDYgMTA0IC0yMDBUNjYgLTE4Mkw4NiAtMTQ3UTEwMCAtMTU1IDExNSAtMTYwVDE0OCAtMTY2UTE3MiAtMTY2IDE4OSAtMTU2VDIwNiAtMTE4UTIwNiAtOTkgMTkyIC05MlQxNjEgLTg1UTE0MCAtODUgMTIzIC05MkwxMDcgLTc3TDE1OCAwSDIwNUwxNjUgLTU0UTE3MyAtNTIgMTgwIC01MVQxOTYgLTUwUTIyMCAtNTAgMjM4IC02M1QyNTcgLTExMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI5OyIgaG9yaXotYWR2LXg9IjI4MCIgZD0iTTE3NSA0MTZMMjA1IDYyOEgyMDFMMTI3IDU5MEwxMTQgNjM1TDIyNiA2OTRIMjc1TDIzNiA0MTZIMzE1TDMwOCAzNjdIODVMOTIgNDE2SDE3NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJBOyIgaG9yaXotYWR2LXg9IjM5MCIgZD0iTTQxNCA1NjBRNDE0IDUyMSA0MDQgNDg2VDM3MiA0MjVUMzIwIDM4NFQyNDYgMzY4UTE4NiAzNjggMTU1IDQwMFQxMjMgNDkyUTEyMyA1MzEgMTMzIDU2NVQxNjUgNjI2VDIxNyA2NjdUMjkwIDY4MlEzNDkgNjgyIDM4MSA2NTFUNDE0IDU2MFpNMjU0IDQxNlEyODQgNDE2IDMwMyA0MjlUMzMzIDQ2M1QzNDkgNTA5VDM1NCA1NjBRMzU0IDYzMiAyODMgNjMyUTI1MyA2MzIgMjM0IDYyMFQyMDQgNTg3VDE4OCA1NDJUMTg0IDQ5MlExODQgNDU1IDIwMCA0MzZUMjU0IDQxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJCOyIgaG9yaXotYWR2LXg9IjQ1NCIgZD0iTTMwNSAxMDRMMjUxIDEzOEwzOTcgMzA1TDI5NyA0NzVMMzYyIDUwOEw0NzggMzA2TDMwNSAxMDRaTTExOSAxMTBMNjUgMTQ0TDIwNyAzMDVMMTA5IDQ2OUwxNzQgNTAyTDI4NyAzMDZMMTE5IDExMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJDOyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTIxMSA0MTZMMjQxIDYyOEgyMzdMMTYzIDU5MEwxNTAgNjM1TDI2MiA2OTRIMzExTDI3MiA0MTZIMzUxTDM0NCAzNjdIMTIxTDEyOCA0MTZIMjExWk0xOTIgMEgxMzlMNzI1IDcwMEg3NzhMMTkyIDBaTTY3MSA2N0w2NjIgMEg2MDBMNjA5IDY3SDQ2OUw0NjEgMTE0TDY0MSAzMjdINzA3TDY3OCAxMTdINzI5TDcyMiA2N0g2NzFaTTUxNyAxMTRINjE4TDYzOSAyNjdMNTE3IDExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJEOyIgaG9yaXotYWR2LXg9IjcxOCIgZD0iTTIwMyA0MTZMMjMzIDYyOEgyMjlMMTU1IDU5MEwxNDIgNjM1TDI1NCA2OTRIMzAzTDI2NCA0MTZIMzQzTDMzNiAzNjdIMTEzTDEyMCA0MTZIMjAzWk0xNTMgMEgxMDBMNjg2IDcwMEg3MzlMMTUzIDBaTTQ0OSAwTDQ0NyA1NFE0NjQgNjcgNDk3IDg3VDU2MyAxMzJUNjIwIDE4NFQ2NDUgMjM4UTY0NSAyNTIgNjM2IDI2N1Q2MDEgMjgyUTU3NyAyODIgNTU3IDI3M1Q1MTMgMjQxTDQ4NCAyODBRNTE4IDMwOSA1NDggMzIxVDYxNCAzMzNRNjU5IDMzMyA2ODMgMzEwVDcwOCAyNDlRNzA4IDIxNiA2OTAgMTg5VDY0NCAxMzlUNTgyIDk0VDUxNSA1MEg2ODRMNjc3IDBINDQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBob3Jpei1hZHYteD0iNzA3IiBkPSJNMzYzIDQ3OFEzNjMgNDIyIDMyOSAzOTJUMjMyIDM2MVEyMDAgMzYxIDE3MSAzNjlUMTE4IDM5OUwxNTAgNDQyUTE3MCA0MjQgMTg5IDQxN1QyMzMgNDA5UTI2MSA0MDkgMjgyIDQyNVQzMDQgNDc1UTMwNCA1MTMgMjUwIDUxM0gyMDdMMjEzIDU1N0gyNDFRMjUxIDU1NyAyNjQgNTU5VDI4OCA1NjhUMzA2IDU4NVQzMTQgNjEyUTMxNCA2MzAgMzAyIDY0MFQyNjcgNjUxUTI0NSA2NTEgMjIzIDY0NFQxODEgNjE5TDE1OSA2NjFRMTkyIDY4MyAyMTkgNjkxVDI4MCA3MDBRMzIzIDcwMCAzNDkgNjgyVDM3NSA2MjVRMzc1IDU2OSAzMTggNTQ0VjU0MFEzNjMgNTI4IDM2MyA0NzhaTTE3MyAwSDEyMEw3MDYgNzAwSDc1OUwxNzMgMFpNNjM5IDY3TDYzMCAwSDU2OEw1NzcgNjdINDM3TDQyOSAxMTRMNjA5IDMyN0g2NzVMNjQ2IDExN0g2OTdMNjkwIDY3SDYzOVpNNDg1IDExNEg1ODZMNjA3IDI2N0w0ODUgMTE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkY7IiBob3Jpei1hZHYteD0iNTE1IiBkPSJNNzIgLTI3UTcyIDI1IDg4IDYwVDEzMSAxMjBUMTk1IDE2M1QyNzQgMTk5UTI5MCAyMDYgMzAwIDIxMVQzMTUgMjI0VDMyMyAyNDFUMzI4IDI3MEwzMzYgMzMySDQyMkw0MTEgMjUzUTQwOCAyMjkgNDAzIDIxNFQzOTAgMTg3VDM2NyAxNjhUMzMxIDE1MFEzMDEgMTM3IDI3MSAxMjVUMjE2IDk1VDE3NyA1MlQxNjEgLTEzUTE2MSAtMzggMTcwIC01NFQxOTYgLTgxVDIzMiAtOTVUMjc1IC0xMDBRMzIyIC0xMDAgMzYxIC04NFQ0MzkgLTQxTDQ3MyAtMTA2UTQxOSAtMTM5IDM2OCAtMTU2VDI1NCAtMTc0UTIxOCAtMTc0IDE4NiAtMTY2VDEyOCAtMTQxVDg3IC05NlQ3MiAtMjdaTTMzNyA0NTFRMzM3IDQ4MCAzNTcgNDk3VDQwNiA1MTVRNDI4IDUxNSA0NDQgNTA0VDQ2MSA0NjhRNDYxIDQzOSA0NDEgNDIyVDM5MiA0MDVRMzcwIDQwNSAzNTQgNDE2VDMzNyA0NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMDsiIGhvcml6LWFkdi14PSI2NDIiIGQ9Ik01MjIgMEw0ODcgMTYxSDE5NkwxMTYgMEgyMkwzNjIgNjcxSDQ2NEw2MjAgMEg1MjJaTTQwMSA1ODJIMzk3TDIyOSAyMzZINDczTDQwMSA1ODJaTTQzMCA3MDVMMjcxIDgxNEwzNjUgODU0TDQ4MyA3MzVMNDMwIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMxOyIgaG9yaXotYWR2LXg9IjY0MiIgZD0iTTUyMiAwTDQ4NyAxNjFIMTk2TDExNiAwSDIyTDM2MiA2NzFINDY0TDYyMCAwSDUyMlpNNDAxIDU4MkgzOTdMMjI5IDIzNkg0NzNMNDAxIDU4MlpNNDA3IDcwNUwzNjIgNzM2TDUxNiA4NTdMNTk2IDgxNUw0MDcgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzI7IiBob3Jpei1hZHYteD0iNjQyIiBkPSJNNTIyIDBMNDg3IDE2MUgxOTZMMTE2IDBIMjJMMzYyIDY3MUg0NjRMNjIwIDBINTIyWk00MDEgNTgySDM5N0wyMjkgMjM2SDQ3M0w0MDEgNTgyWk01MzQgNzAzTDQyNyA3ODJMMjk3IDcwM0wyNjcgNzUzTDQzNSA4NTFMNTc5IDc1M0w1MzQgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzM7IiBob3Jpei1hZHYteD0iNjQyIiBkPSJNNTIyIDBMNDg3IDE2MUgxOTZMMTE2IDBIMjJMMzYyIDY3MUg0NjRMNjIwIDBINTIyWk00MDEgNTgySDM5N0wyMjkgMjM2SDQ3M0w0MDEgNTgyWk01OTIgNzgxUTU3NiA3NDUgNTQ4IDcyOFQ0OTAgNzEwUTQ3MiA3MTAgNDU1IDcxNlQ0MjAgNzI5VDM4OCA3NDNUMzU4IDc1MFEzNDEgNzUwIDMyNiA3NDJUMjk2IDcwOUwyNTcgNzQzUTI4MSA3ODQgMzA2IDc5OVQzNjAgODE0UTM3OCA4MTQgMzk1IDgwOFQ0MzAgNzk0VDQ2MyA3ODBUNDkzIDc3NFE1MTAgNzc0IDUyNSA3ODJUNTUxIDgxNEw1OTIgNzgxSDU5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM0OyIgaG9yaXotYWR2LXg9IjY0MiIgZD0iTTUyMiAwTDQ4NyAxNjFIMTk2TDExNiAwSDIyTDM2MiA2NzFINDY0TDYyMCAwSDUyMlpNNDAxIDU4MkgzOTdMMjI5IDIzNkg0NzNMNDAxIDU4MlpNNTcwIDc2OVE1NzAgNzQ2IDU1MyA3MjlUNTEyIDcxMlE0OTQgNzEyIDQ4MSA3MjRUNDY3IDc1NVE0NjcgNzc4IDQ4NSA3OTVUNTI2IDgxM1E1NDUgODEzIDU1NyA4MDFUNTcwIDc2OVpNMzgzIDc2OVEzODMgNzQ2IDM2NSA3MjlUMzI0IDcxMlEzMDYgNzEyIDI5MyA3MjRUMjgwIDc1NVEyODAgNzc4IDI5NyA3OTVUMzM4IDgxM1EzNTcgODEzIDM3MCA4MDFUMzgzIDc2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM1OyIgaG9yaXotYWR2LXg9IjY0MyIgZD0iTTU0MCA3NDFRNTQwIDcwNiA1MjIgNjc2VDQ3MyA2MzJMNjIxIDBINTIzTDQ4OCAxNjFIMTk3TDExNyAwSDIzTDM0MiA2MzFRMzIyIDY0NCAzMTIgNjY2VDMwMSA3MTJRMzAxIDczOSAzMTEgNzYyVDMzOCA4MDJUMzc5IDgyOFQ0MjkgODM4UTQ1MSA4MzggNDcxIDgzMlQ1MDYgODEzVDUzMSA3ODJUNTQwIDc0MVpNNDAzIDU4NEgzOTlMMjMwIDIzNkg0NzRMNDAzIDU4NFpNNDExIDY2MFE0NDMgNjYwIDQ2NCA2ODJUNDg2IDczNlE0ODYgNzYwIDQ3MSA3NzVUNDI4IDc5MFEzOTMgNzkwIDM3NCA3NjhUMzU1IDcxNVEzNTUgNjkwIDM3MSA2NzVUNDExIDY2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM2OyIgaG9yaXotYWR2LXg9Ijg5OCIgZD0iTTQ1MSAwTDQ3NCAxNjRIMjI4TDExOCAwSDIyTDQ4NiA2NjdIOTQzTDkzMyA1OTFINjI0TDU5NiAzOTJIODc1TDg2NCAzMTRINTg1TDU1MSA3Nkg4NzBMODYwIDBINDUxWk01MzQgNTg5SDUyMUwyNzYgMjQySDQ4Nkw1MzQgNTg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzc7IiBob3Jpei1hZHYteD0iNjMyIiBkPSJNNDM1IC0xMTNRNDM1IC0xNjMgNDAzIC0xODZUMzI2IC0yMDlRMzAyIC0yMDkgMjgyIC0yMDNUMjQ0IC0xODVMMjY0IC0xNTBRMjc4IC0xNTggMjkzIC0xNjNUMzI2IC0xNjlRMzUwIC0xNjkgMzY3IC0xNTlUMzg0IC0xMjFRMzg0IC0xMDIgMzcwIC05NVQzMzkgLTg4UTMxOCAtODggMzAxIC05NUwyODUgLTgwTDMzMSAtMTBRMjE4IC0yIDE2MiA2N1QxMDYgMjU0UTEwNiAzMzUgMTI4IDQxMVQxOTQgNTQ3VDMwNiA2NDJUNDYzIDY3OFE1MjkgNjc4IDU4MCA2NTZUNjc4IDU4Nkw2MTQgNTI2UTU4MCA1NjMgNTQzIDU4MlQ0NTUgNjAxUTM4NSA2MDEgMzM3IDU3MVQyNTkgNDkyVDIxNiAzODRUMjAyIDI2M1EyMDIgMjE5IDIxMSAxODNUMjQyIDEyMVQyOTYgODBUMzc3IDY1UTQzMiA2NSA0ODAgODdUNTcxIDE0NUw2MTEgODNRNTU4IDQxIDUwMiAxN1QzNzcgLTEwTDM0MyAtNTdRMzUxIC01NSAzNTggLTU0VDM3NCAtNTNRMzk4IC01MyA0MTYgLTY2VDQzNSAtMTEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzg7IiBob3Jpei1hZHYteD0iNTM0IiBkPSJNODYgMEwxNzkgNjY3SDU3N0w1NjYgNTkwSDI1OUwyMzEgMzkxSDUwOUw0OTggMzEzSDIyMEwxODcgNzZINTA2TDQ5NiAwSDg2Wk00MjcgNzA1TDI2OCA4MTRMMzYyIDg1NEw0ODAgNzM1TDQyNyA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDOTsiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik04NiAwTDE3OSA2NjdINTc3TDU2NiA1OTBIMjU5TDIzMSAzOTFINTA5TDQ5OCAzMTNIMjIwTDE4NyA3Nkg1MDZMNDk2IDBIODZaTTM2OCA3MDVMMzIzIDczNkw0NzcgODU3TDU1NyA4MTVMMzY4IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBMMTc5IDY2N0g1NzdMNTY2IDU5MEgyNTlMMjMxIDM5MUg1MDlMNDk4IDMxM0gyMjBMMTg3IDc2SDUwNkw0OTYgMEg4NlpNNTAzIDcwM0wzOTYgNzgyTDI2NiA3MDNMMjM2IDc1M0w0MDQgODUxTDU0OCA3NTNMNTAzIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBMMTc5IDY2N0g1NzdMNTY2IDU5MEgyNTlMMjMxIDM5MUg1MDlMNDk4IDMxM0gyMjBMMTg3IDc2SDUwNkw0OTYgMEg4NlpNNTM5IDc2OVE1MzkgNzQ2IDUyMiA3MjlUNDgxIDcxMlE0NjMgNzEyIDQ1MCA3MjRUNDM2IDc1NVE0MzYgNzc4IDQ1NCA3OTVUNDk1IDgxM1E1MTQgODEzIDUyNiA4MDFUNTM5IDc2OVpNMzUyIDc2OVEzNTIgNzQ2IDMzNCA3MjlUMjkzIDcxMlEyNzUgNzEyIDI2MiA3MjRUMjQ5IDc1NVEyNDkgNzc4IDI2NiA3OTVUMzA3IDgxM1EzMjYgODEzIDMzOSA4MDFUMzUyIDc2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENDOyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBMMTc5IDY2N0gyNzBMMTc3IDBIODZaTTI0NCA3MDVMODUgODE0TDE3OSA4NTRMMjk3IDczNUwyNDQgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Q7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNODYgMEwxNzkgNjY3SDI3MEwxNzcgMEg4NlpNMjIxIDcwNUwxNzYgNzM2TDMzMCA4NTdMNDEwIDgxNUwyMjEgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0U7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNODYgMEwxNzkgNjY3SDI3MEwxNzcgMEg4NlpNMzUzIDcwM0wyNDYgNzgyTDExNiA3MDNMODYgNzUzTDI1NCA4NTFMMzk4IDc1M0wzNTMgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Y7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNODYgMEwxNzkgNjY3SDI3MEwxNzcgMEg4NlpNMzg1IDc2OVEzODUgNzQ2IDM2OCA3MjlUMzI3IDcxMlEzMDkgNzEyIDI5NiA3MjRUMjgyIDc1NVEyODIgNzc4IDMwMCA3OTVUMzQxIDgxM1EzNjAgODEzIDM3MiA4MDFUMzg1IDc2OVpNMTk4IDc2OVExOTggNzQ2IDE4MCA3MjlUMTM5IDcxMlExMjEgNzEyIDEwOCA3MjRUOTUgNzU1UTk1IDc3OCAxMTIgNzk1VDE1MyA4MTNRMTcyIDgxMyAxODUgODAxVDE5OCA3NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMDsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02NTcgNDExUTY1NyAzMjQgNjMzIDI0OVQ1NjIgMTE5VDQ0NSAzMlQyODQgMEg4N0wxMzEgMzE4SDY3TDc4IDM5M0gxNDJMMTgwIDY2M1EyMzEgNjY4IDI4MSA2NzFUMzgyIDY3NVE1MTAgNjc1IDU4MyA2MDlUNjU3IDQxMVpNMjgzIDc0UTM0OSA3NCAzOTcgOTJUNDc3IDE0NFQ1MjkgMjI3VDU1NyAzMzlRNTU5IDM1NiA1NjAgMzczVDU2MiA0MDdRNTYyIDQ5OSA1MTggNTQ5VDM3NyA2MDBRMzE4IDYwMCAyNjAgNTk0TDIzMiAzOTNIMzg4TDM3NyAzMThIMjIxTDE4NyA3NVEyMTEgNzQgMjM1IDc0VDI4MyA3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQxOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMCAwTDI1MSA1MjBIMjQ3TDE3NCAwSDg2TDE3OSA2NjdIMjY5TDU0NCAxNTRINTQ4TDYyMCA2NjdINzA4TDYxNSAwSDUzMFpNNjMxIDc4MVE2MTUgNzQ1IDU4NyA3MjhUNTI5IDcxMFE1MTEgNzEwIDQ5NCA3MTZUNDU5IDcyOVQ0MjcgNzQzVDM5NyA3NTBRMzgwIDc1MCAzNjUgNzQyVDMzNSA3MDlMMjk2IDc0M1EzMjAgNzg0IDM0NSA3OTlUMzk5IDgxNFE0MTcgODE0IDQzNCA4MDhUNDY5IDc5NFQ1MDIgNzgwVDUzMiA3NzRRNTQ5IDc3NCA1NjQgNzgyVDU5MCA4MTRMNjMxIDc4MUg2MzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMjsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik03MzMgNDExUTczMyAzMjcgNzExIDI1MVQ2NDMgMTE2VDUzMCAyNFQzNzEgLTExUTI0MCAtMTEgMTczIDU5VDEwNSAyNThRMTA1IDM0MSAxMjggNDE3VDE5NiA1NTFUMzEwIDY0M1Q0NjggNjc4UTU5OCA2NzggNjY1IDYwOVQ3MzMgNDExWk0zODEgNjNRNDUzIDYzIDUwMiA5NFQ1ODEgMTc0VDYyNSAyODRUNjM4IDQwOFE2MzggNDk5IDU5NiA1NTFUNDU3IDYwNFEzODUgNjA0IDMzNiA1NzRUMjU3IDQ5NFQyMTQgMzg0VDIwMSAyNjFRMjAxIDIxNiAyMTEgMTgwVDI0MiAxMTdUMjk4IDc3VDM4MSA2M1pNNTIzIDcwN0wzNjQgODE2TDQ1OCA4NTZMNTc2IDczN0w1MjMgNzA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDM7IiBob3Jpei1hZHYteD0iNzQ2IiBkPSJNNzMzIDQxMVE3MzMgMzI3IDcxMSAyNTFUNjQzIDExNlQ1MzAgMjRUMzcxIC0xMVEyNDAgLTExIDE3MyA1OVQxMDUgMjU4UTEwNSAzNDEgMTI4IDQxN1QxOTYgNTUxVDMxMCA2NDNUNDY4IDY3OFE1OTggNjc4IDY2NSA2MDlUNzMzIDQxMVpNMzgxIDYzUTQ1MyA2MyA1MDIgOTRUNTgxIDE3NFQ2MjUgMjg0VDYzOCA0MDhRNjM4IDQ5OSA1OTYgNTUxVDQ1NyA2MDRRMzg1IDYwNCAzMzYgNTc0VDI1NyA0OTRUMjE0IDM4NFQyMDEgMjYxUTIwMSAyMTYgMjExIDE4MFQyNDIgMTE3VDI5OCA3N1QzODEgNjNaTTQ1NiA3MDdMNDExIDczOEw1NjUgODU5TDY0NSA4MTdMNDU2IDcwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTczMyA0MTFRNzMzIDMyNyA3MTEgMjUxVDY0MyAxMTZUNTMwIDI0VDM3MSAtMTFRMjQwIC0xMSAxNzMgNTlUMTA1IDI1OFExMDUgMzQxIDEyOCA0MTdUMTk2IDU1MVQzMTAgNjQzVDQ2OCA2NzhRNTk4IDY3OCA2NjUgNjA5VDczMyA0MTFaTTM4MSA2M1E0NTMgNjMgNTAyIDk0VDU4MSAxNzRUNjI1IDI4NFQ2MzggNDA4UTYzOCA0OTkgNTk2IDU1MVQ0NTcgNjA0UTM4NSA2MDQgMzM2IDU3NFQyNTcgNDk0VDIxNCAzODRUMjAxIDI2MVEyMDEgMjE2IDIxMSAxODBUMjQyIDExN1QyOTggNzdUMzgxIDYzWk01OTQgNzAzTDQ4NyA3ODJMMzU3IDcwM0wzMjcgNzUzTDQ5NSA4NTFMNjM5IDc1M0w1OTQgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBob3Jpei1hZHYteD0iNzQ2IiBkPSJNNzMzIDQxMVE3MzMgMzI3IDcxMSAyNTFUNjQzIDExNlQ1MzAgMjRUMzcxIC0xMVEyNDAgLTExIDE3MyA1OVQxMDUgMjU4UTEwNSAzNDEgMTI4IDQxN1QxOTYgNTUxVDMxMCA2NDNUNDY4IDY3OFE1OTggNjc4IDY2NSA2MDlUNzMzIDQxMVpNMzgxIDYzUTQ1MyA2MyA1MDIgOTRUNTgxIDE3NFQ2MjUgMjg0VDYzOCA0MDhRNjM4IDQ5OSA1OTYgNTUxVDQ1NyA2MDRRMzg1IDYwNCAzMzYgNTc0VDI1NyA0OTRUMjE0IDM4NFQyMDEgMjYxUTIwMSAyMTYgMjExIDE4MFQyNDIgMTE3VDI5OCA3N1QzODEgNjNaTTY0MyA3ODNRNjI3IDc0NyA1OTkgNzMwVDU0MSA3MTJRNTIzIDcxMiA1MDYgNzE4VDQ3MSA3MzFUNDM5IDc0NVQ0MDkgNzUyUTM5MiA3NTIgMzc3IDc0NFQzNDcgNzExTDMwOCA3NDVRMzMyIDc4NiAzNTcgODAxVDQxMSA4MTZRNDI5IDgxNiA0NDYgODEwVDQ4MSA3OTZUNTE0IDc4MlQ1NDQgNzc2UTU2MSA3NzYgNTc2IDc4NFQ2MDIgODE2TDY0MyA3ODNINjQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDY7IiBob3Jpei1hZHYteD0iNzQ2IiBkPSJNNzMzIDQxMVE3MzMgMzI3IDcxMSAyNTFUNjQzIDExNlQ1MzAgMjRUMzcxIC0xMVEyNDAgLTExIDE3MyA1OVQxMDUgMjU4UTEwNSAzNDEgMTI4IDQxN1QxOTYgNTUxVDMxMCA2NDNUNDY4IDY3OFE1OTggNjc4IDY2NSA2MDlUNzMzIDQxMVpNMzgxIDYzUTQ1MyA2MyA1MDIgOTRUNTgxIDE3NFQ2MjUgMjg0VDYzOCA0MDhRNjM4IDQ5OSA1OTYgNTUxVDQ1NyA2MDRRMzg1IDYwNCAzMzYgNTc0VDI1NyA0OTRUMjE0IDM4NFQyMDEgMjYxUTIwMSAyMTYgMjExIDE4MFQyNDIgMTE3VDI5OCA3N1QzODEgNjNaTTYyNCA3NjlRNjI0IDc0NiA2MDcgNzI5VDU2NiA3MTJRNTQ4IDcxMiA1MzUgNzI0VDUyMSA3NTVRNTIxIDc3OCA1MzkgNzk1VDU4MCA4MTNRNTk5IDgxMyA2MTEgODAxVDYyNCA3NjlaTTQzNyA3NjlRNDM3IDc0NiA0MTkgNzI5VDM3OCA3MTJRMzYwIDcxMiAzNDcgNzI0VDMzNCA3NTVRMzM0IDc3OCAzNTEgNzk1VDM5MiA4MTNRNDExIDgxMyA0MjQgODAxVDQzNyA3NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENzsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik01NDkgNDEwTDM3NyAyNTlMNTEwIDEwM0w0NTAgNTBMMzE2IDIwNkwxMzggNTBMOTIgMTAzTDI3MSAyNTlMMTQxIDQxMEwyMDIgNDYzTDMzMSAzMTJMNTA1IDQ2M0w1NDkgNDEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDg7IiBob3Jpei1hZHYteD0iNzQ2IiBkPSJNNzMzIDQxMVE3MzMgMzI3IDcxMSAyNTFUNjQzIDExNlQ1MzAgMjRUMzcxIC0xMVEyNTkgLTExIDE5MSA0M0wxMjggLTI0TDc5IDIzTDE0NSA5NFExMDUgMTU4IDEwNSAyNThRMTA1IDM0MSAxMjggNDE3VDE5NiA1NTFUMzEwIDY0M1Q0NjggNjc4UTU3OCA2NzggNjQ0IDYyNkw3MDIgNjg4TDc1MyA2NDVMNjkwIDU3N1E3MzMgNTExIDczMyA0MTFaTTM4MSA2M1E0NTMgNjMgNTAyIDk0VDU4MSAxNzRUNjI1IDI4NFQ2MzggNDA4UTYzOCA0NjYgNjIyIDUwNUwyNTEgMTA4UTI3MyA4NiAzMDQgNzVUMzgxIDYzWk0yMDEgMjYxUTIwMSAyMDcgMjE0IDE2OEw1ODQgNTYyUTUzOSA2MDQgNDU3IDYwNFEzODUgNjA0IDMzNiA1NzRUMjU3IDQ5NFQyMTQgMzg0VDIwMSAyNjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02MTkgMjU5UTU5OSAxMjEgNTMxIDU1VDMzMiAtMTFRMjE5IC0xMSAxNjggMzZUMTE2IDE4NFExMTYgMjE4IDEyMiAyNTlMMTc5IDY2N0gyNzBMMjEzIDI1OVEyMTEgMjQzIDIxMCAyMjhUMjA4IDE5OVEyMDggMTY5IDIxNCAxNDRUMjM3IDEwMlQyNzkgNzVUMzQzIDY1UTM5MCA2NSA0MjIgNzlUNDc2IDExOVQ1MTAgMTgwVDUyOCAyNTlMNTg1IDY2N0g2NzZMNjE5IDI1OUg2MTlaTTQ0MSA3MDVMMjgyIDgxNEwzNzYgODU0TDQ5NCA3MzVMNDQxIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERBOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTYxOSAyNTlRNTk5IDEyMSA1MzEgNTVUMzMyIC0xMVEyMTkgLTExIDE2OCAzNlQxMTYgMTg0UTExNiAyMTggMTIyIDI1OUwxNzkgNjY3SDI3MEwyMTMgMjU5UTIxMSAyNDMgMjEwIDIyOFQyMDggMTk5UTIwOCAxNjkgMjE0IDE0NFQyMzcgMTAyVDI3OSA3NVQzNDMgNjVRMzkwIDY1IDQyMiA3OVQ0NzYgMTE5VDUxMCAxODBUNTI4IDI1OUw1ODUgNjY3SDY3Nkw2MTkgMjU5SDYxOVpNNDI3IDcwNUwzODIgNzM2TDUzNiA4NTdMNjE2IDgxNUw0MjcgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REI7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNjE5IDI1OVE1OTkgMTIxIDUzMSA1NVQzMzIgLTExUTIxOSAtMTEgMTY4IDM2VDExNiAxODRRMTE2IDIxOCAxMjIgMjU5TDE3OSA2NjdIMjcwTDIxMyAyNTlRMjExIDI0MyAyMTAgMjI4VDIwOCAxOTlRMjA4IDE2OSAyMTQgMTQ0VDIzNyAxMDJUMjc5IDc1VDM0MyA2NVEzOTAgNjUgNDIyIDc5VDQ3NiAxMTlUNTEwIDE4MFQ1MjggMjU5TDU4NSA2NjdINjc2TDYxOSAyNTlINjE5Wk01NTMgNzAzTDQ0NiA3ODJMMzE2IDcwM0wyODYgNzUzTDQ1NCA4NTFMNTk4IDc1M0w1NTMgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REM7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNjE5IDI1OVE1OTkgMTIxIDUzMSA1NVQzMzIgLTExUTIxOSAtMTEgMTY4IDM2VDExNiAxODRRMTE2IDIxOCAxMjIgMjU5TDE3OSA2NjdIMjcwTDIxMyAyNTlRMjExIDI0MyAyMTAgMjI4VDIwOCAxOTlRMjA4IDE2OSAyMTQgMTQ0VDIzNyAxMDJUMjc5IDc1VDM0MyA2NVEzOTAgNjUgNDIyIDc5VDQ3NiAxMTlUNTEwIDE4MFQ1MjggMjU5TDU4NSA2NjdINjc2TDYxOSAyNTlINjE5Wk01ODcgNzY5UTU4NyA3NDYgNTcwIDcyOVQ1MjkgNzEyUTUxMSA3MTIgNDk4IDcyNFQ0ODQgNzU1UTQ4NCA3NzggNTAyIDc5NVQ1NDMgODEzUTU2MiA4MTMgNTc0IDgwMVQ1ODcgNzY5Wk00MDAgNzY5UTQwMCA3NDYgMzgyIDcyOVQzNDEgNzEyUTMyMyA3MTIgMzEwIDcyNFQyOTcgNzU1UTI5NyA3NzggMzE0IDc5NVQzNTUgODEzUTM3NCA4MTMgMzg3IDgwMVQ0MDAgNzY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REQ7IiBob3Jpei1hZHYteD0iNTcyIiBkPSJNMzY5IDI2NUwzMzIgMEgyNDFMMjc3IDI2MkwxMDYgNjY3SDIwOUwzMzUgMzQ1TDU1MiA2NjdINjUyTDM2OSAyNjVaTTM4NiA2OTdMMzQxIDcyOEw0OTUgODQ5TDU3NSA4MDdMMzg2IDY5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTU5OSAzODRRNTk5IDI2NyA1MzUgMTk4VDM0NiAxMjlIMTk0TDE3NiAwSDg2TDE3OSA2NjdIMjY4TDI1MSA1NDVRMjg1IDU0NyAzMTMgNTQ4VDM3MiA1NTBRNDIyIDU1MCA0NjMgNTQyVDUzNSA1MTVUNTgyIDQ2NFQ1OTkgMzg0Wk0zMzcgMjAyUTQyMiAyMDIgNDY1IDI0MlQ1MDggMzc0UTUwOCA0MzMgNDcyIDQ1NFQzNjAgNDc1UTMzMCA0NzUgMzAyIDQ3NFQyNDEgNDY5TDIwNCAyMDJIMzM3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REY7IiBob3Jpei1hZHYteD0iNTMyIiBkPSJNNTE2IDE5N1E1MTYgMTUzIDUwMiAxMTVUNDYwIDQ5VDM5NiA1VDMxMyAtMTJRMzA0IC0xMiAyOTIgLTExVDI2OCAtOVQyNDQgLTVUMjIzIDJMMjQ2IDY2UTI3NCA1NSAzMDMgNTVRMzY0IDU1IDM5NSA5M1Q0MjcgMTk1UTQyNyAyMjYgNDE1IDI0OFQzODQgMjg4VDM0MCAzMTdUMjkwIDMzOUwyODcgMzk2UTMxMSA0MTEgMzM1IDQyOFQzNzkgNDY3VDQxMSA1MTRUNDI0IDU3MlE0MjQgNjEwIDQwMiA2MjVUMzQ0IDY0MVEyOTEgNjQxIDI2OCA2MTRUMjM4IDUzN0wxNjMgMEg3NkwxNTIgNTQxUTE2NSA2MzAgMjE1IDY2N1QzNTQgNzA1UTM4NCA3MDUgNDExIDY5OVQ0NTkgNjc3VDQ5MiA2MzlUNTA0IDU4MVE1MDQgNTQ3IDQ5NCA1MjBUNDY3IDQ2OVQ0MjcgNDI3VDM3NiAzOTFWMzg3UTQwNiAzNzMgNDMxIDM1NVQ0NzUgMzEzVDUwNSAyNjBUNTE2IDE5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUwOyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQxNSAwTDQyMCA3N0g0MTZRMzg3IDMyIDM0NSAxMVQyNTIgLTExUTIwNSAtMTEgMTczIDRUMTIxIDQ1VDkyIDEwNlQ4MyAxODJRODMgMjM1IDk0IDI5M1QxMzQgNDAxVDIwOCA0ODJUMzI2IDUxNFEzNzEgNTE0IDQwNSA1MDBUNDYyIDQ0NEg0NjZMNDgzIDUwMkg1NThMNDg4IDBINDE1Wk00NDcgMzI2UTQ1NSAzODYgNDI0IDQxNlQzMzYgNDQ2UTI4NCA0NDYgMjUyIDQyMVQyMDIgMzU4VDE3OCAyNzVUMTcyIDE4OFExNzIgMTYxIDE3NyAxMzdUMTk0IDk1VDIyOCA2NVQyODMgNTRRMzE1IDU0IDM0MCA2NVQzODQgOTZUNDE0IDE0M1Q0MzAgMjAwTDQ0NyAzMjZaTTM3MSA1NjVMMjEyIDY3NEwzMDYgNzE0TDQyNCA1OTVMMzcxIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUxOyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQxNSAwTDQyMCA3N0g0MTZRMzg3IDMyIDM0NSAxMVQyNTIgLTExUTIwNSAtMTEgMTczIDRUMTIxIDQ1VDkyIDEwNlQ4MyAxODJRODMgMjM1IDk0IDI5M1QxMzQgNDAxVDIwOCA0ODJUMzI2IDUxNFEzNzEgNTE0IDQwNSA1MDBUNDYyIDQ0NEg0NjZMNDgzIDUwMkg1NThMNDg4IDBINDE1Wk00NDcgMzI2UTQ1NSAzODYgNDI0IDQxNlQzMzYgNDQ2UTI4NCA0NDYgMjUyIDQyMVQyMDIgMzU4VDE3OCAyNzVUMTcyIDE4OFExNzIgMTYxIDE3NyAxMzdUMTk0IDk1VDIyOCA2NVQyODMgNTRRMzE1IDU0IDM0MCA2NVQzODQgOTZUNDE0IDE0M1Q0MzAgMjAwTDQ0NyAzMjZaTTMxOSA1NjVMMjc0IDU5Nkw0MjggNzE3TDUwOCA2NzVMMzE5IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQxNSAwTDQyMCA3N0g0MTZRMzg3IDMyIDM0NSAxMVQyNTIgLTExUTIwNSAtMTEgMTczIDRUMTIxIDQ1VDkyIDEwNlQ4MyAxODJRODMgMjM1IDk0IDI5M1QxMzQgNDAxVDIwOCA0ODJUMzI2IDUxNFEzNzEgNTE0IDQwNSA1MDBUNDYyIDQ0NEg0NjZMNDgzIDUwMkg1NThMNDg4IDBINDE1Wk00NDcgMzI2UTQ1NSAzODYgNDI0IDQxNlQzMzYgNDQ2UTI4NCA0NDYgMjUyIDQyMVQyMDIgMzU4VDE3OCAyNzVUMTcyIDE4OFExNzIgMTYxIDE3NyAxMzdUMTk0IDk1VDIyOCA2NVQyODMgNTRRMzE1IDU0IDM0MCA2NVQzODQgOTZUNDE0IDE0M1Q0MzAgMjAwTDQ0NyAzMjZaTTQ1OCA1NjJMMzUxIDY0MUwyMjEgNTYyTDE5MSA2MTJMMzU5IDcxMEw1MDMgNjEyTDQ1OCA1NjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMzsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MTUgMEw0MjAgNzdINDE2UTM4NyAzMiAzNDUgMTFUMjUyIC0xMVEyMDUgLTExIDE3MyA0VDEyMSA0NVQ5MiAxMDZUODMgMTgyUTgzIDIzNSA5NCAyOTNUMTM0IDQwMVQyMDggNDgyVDMyNiA1MTRRMzcxIDUxNCA0MDUgNTAwVDQ2MiA0NDRINDY2TDQ4MyA1MDJINTU4TDQ4OCAwSDQxNVpNNDQ3IDMyNlE0NTUgMzg2IDQyNCA0MTZUMzM2IDQ0NlEyODQgNDQ2IDI1MiA0MjFUMjAyIDM1OFQxNzggMjc1VDE3MiAxODhRMTcyIDE2MSAxNzcgMTM3VDE5NCA5NVQyMjggNjVUMjgzIDU0UTMxNSA1NCAzNDAgNjVUMzg0IDk2VDQxNCAxNDNUNDMwIDIwMEw0NDcgMzI2Wk01MTAgNjQxUTQ5NCA2MDUgNDY2IDU4OFQ0MDggNTcwUTM5MCA1NzAgMzczIDU3NlQzMzggNTg5VDMwNiA2MDNUMjc2IDYxMFEyNTkgNjEwIDI0NCA2MDJUMjE0IDU2OUwxNzUgNjAzUTE5OSA2NDQgMjI0IDY1OVQyNzggNjc0UTI5NiA2NzQgMzEzIDY2OFQzNDggNjU0VDM4MSA2NDBUNDExIDYzNFE0MjggNjM0IDQ0MyA2NDJUNDY5IDY3NEw1MTAgNjQxSDUxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU0OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQxNSAwTDQyMCA3N0g0MTZRMzg3IDMyIDM0NSAxMVQyNTIgLTExUTIwNSAtMTEgMTczIDRUMTIxIDQ1VDkyIDEwNlQ4MyAxODJRODMgMjM1IDk0IDI5M1QxMzQgNDAxVDIwOCA0ODJUMzI2IDUxNFEzNzEgNTE0IDQwNSA1MDBUNDYyIDQ0NEg0NjZMNDgzIDUwMkg1NThMNDg4IDBINDE1Wk00NDcgMzI2UTQ1NSAzODYgNDI0IDQxNlQzMzYgNDQ2UTI4NCA0NDYgMjUyIDQyMVQyMDIgMzU4VDE3OCAyNzVUMTcyIDE4OFExNzIgMTYxIDE3NyAxMzdUMTk0IDk1VDIyOCA2NVQyODMgNTRRMzE1IDU0IDM0MCA2NVQzODQgOTZUNDE0IDE0M1Q0MzAgMjAwTDQ0NyAzMjZaTTQ5NyA2MjlRNDk3IDYwNiA0ODAgNTg5VDQzOSA1NzJRNDIxIDU3MiA0MDggNTg0VDM5NCA2MTVRMzk0IDYzOCA0MTIgNjU1VDQ1MyA2NzNRNDcyIDY3MyA0ODQgNjYxVDQ5NyA2MjlaTTMxMCA2MjlRMzEwIDYwNiAyOTIgNTg5VDI1MSA1NzJRMjMzIDU3MiAyMjAgNTg0VDIwNyA2MTVRMjA3IDYzOCAyMjQgNjU1VDI2NSA2NzNRMjg0IDY3MyAyOTcgNjYxVDMxMCA2MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNTsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MTUgMEw0MjAgNzdINDE2UTM4NyAzMiAzNDUgMTFUMjUyIC0xMVEyMDUgLTExIDE3MyA0VDEyMSA0NVQ5MiAxMDZUODMgMTgyUTgzIDIzNSA5NCAyOTNUMTM0IDQwMVQyMDggNDgyVDMyNiA1MTRRMzcxIDUxNCA0MDUgNTAwVDQ2MiA0NDRINDY2TDQ4MyA1MDJINTU4TDQ4OCAwSDQxNVpNNDQ3IDMyNlE0NTUgMzg2IDQyNCA0MTZUMzM2IDQ0NlEyODQgNDQ2IDI1MiA0MjFUMjAyIDM1OFQxNzggMjc1VDE3MiAxODhRMTcyIDE2MSAxNzcgMTM3VDE5NCA5NVQyMjggNjVUMjgzIDU0UTMxNSA1NCAzNDAgNjVUMzg0IDk2VDQxNCAxNDNUNDMwIDIwMEw0NDcgMzI2Wk00NTUgNjYxUTQ1NSA2MTcgNDI1IDU4OVQzNTEgNTYwUTMxNSA1NjAgMjg5IDU4MVQyNjIgNjM5UTI2MiA2NjEgMjcwIDY4MFQyOTMgNzEzVDMyNiA3MzRUMzY4IDc0MlE0MDYgNzQyIDQzMCA3MjBUNDU1IDY2MVpNMzUxIDU5N1EzNzYgNTk3IDM5MyA2MTNUNDExIDY1OVE0MTEgNjgxIDM5OSA2OTNUMzY2IDcwNVEzNDAgNzA1IDMyMyA2ODhUMzA2IDY0MlEzMDYgNjIxIDMxOCA2MDlUMzUxIDU5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU2OyIgaG9yaXotYWR2LXg9Ijg1OCIgZD0iTTg0OCAzMTdRODQ4IDI5NCA4NDYgMjcwVDgzNyAyMjJINDg0UTQ4MyAyMTQgNDgzIDIwNVQ0ODIgMTg4UTQ4MiAxMjUgNTE1IDkyVDYxMiA1OFE2NTQgNTggNjkzIDcyVDc2NiAxMDlMNzg5IDQ4UTc0NyAyMSA3MDAgNVQ2MDEgLTExUTU0NyAtMTEgNTAxIDdUNDI2IDcxUTM3NyAzMiAzMjIgMTFUMjAzIC0xMVExNzMgLTExIDE0OCAtNFQxMDMgMjBUNzMgNTlUNjIgMTE0UTYyIDE4MyA5NiAyMjRUMTgxIDI4N1QyOTMgMzE1VDQwNyAzMjJRNDA5IDMzNyA0MTEgMzUyVDQxMyAzODJRNDEzIDQyMiAzOTEgNDM0VDMzNCA0NDZRMjg2IDQ0NiAyMzYgNDMwVDE0NCAzODhMMTIyIDQ1MlExNzcgNDc5IDIzMSA0OTZUMzQ4IDUxNFEzNzEgNTE0IDM5MyA1MTFUNDM1IDQ5OFQ0NjcgNDczVDQ4NSA0MzBRNTIwIDQ3MSA1NjUgNDkzVDY2NSA1MTVRNzExIDUxNSA3NDUgNTAxVDgwMiA0NjBUODM2IDM5OFQ4NDggMzE3Wk03NjYgMjgzUTc2NyAyOTIgNzY3IDMwMVQ3NjggMzE5UTc2OCAzNzYgNzQyIDQxMlQ2NTQgNDQ4UTYxOCA0NDggNTkwIDQzNVQ1NDIgMzk4VDUwOCAzNDZUNDkxIDI4M0g3NjZaTTQwMSAxMjVRMzkyIDE1MyAzOTIgMTg1UTM5MiAyMDYgMzk0IDIyNlQ0MDAgMjY3UTM2NSAyNjcgMzIyIDI2M1QyNDEgMjQ1VDE3NiAyMDRUMTUwIDEyOVExNTAgOTQgMTcyIDc0VDIzMyA1M1EyODMgNTMgMzI3IDc1VDQwMSAxMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNzsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik0zNTcgLTExM1EzNTcgLTE2MyAzMjUgLTE4NlQyNDggLTIwOVEyMjQgLTIwOSAyMDQgLTIwM1QxNjYgLTE4NUwxODYgLTE1MFEyMDAgLTE1OCAyMTUgLTE2M1QyNDggLTE2OVEyNzIgLTE2OSAyODkgLTE1OVQzMDYgLTEyMVEzMDYgLTEwMiAyOTIgLTk1VDI2MSAtODhRMjQwIC04OCAyMjMgLTk1TDIwNyAtODBMMjU0IC05UTE3MSAtMSAxMjcgNTFUODMgMTk0UTgzIDI1NyAxMDEgMzE1VDE1NSA0MTdUMjQzIDQ4OFQzNjMgNTE0UTQwOSA1MTQgNDUxIDQ5OFQ1MjggNDUxTDQ4MSAzOTBRNDMzIDQ0NSAzNTYgNDQ1UTMwNyA0NDUgMjcyIDQyM1QyMTUgMzY3VDE4MyAyODlUMTczIDIwM1ExNzMgMTM5IDIwMyA5OVQzMDIgNThRMzQ1IDU4IDM3OSA3MlQ0NDggMTEyTDQ3MCA1MVE0MzAgMjQgMzg5IDhUMjk5IC0xMUwyNjUgLTU3UTI3MyAtNTUgMjgwIC01NFQyOTYgLTUzUTMyMCAtNTMgMzM4IC02NlQzNTcgLTExM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU4OyIgaG9yaXotYWR2LXg9IjU0MyIgZD0iTTUzMyAzMTdRNTMzIDI5NCA1MzAgMjY5VDUyMyAyMjNIMTcxUTE2OCAyMDIgMTY4IDE4NFExNjggMTI0IDIwMCA5MFQyOTggNTZRMzM2IDU2IDM3MyA2N1Q0NTUgMTA4TDQ3NyA0OFE0MjcgMTYgMzgxIDNUMjg2IC0xMVExODQgLTExIDEzNCA0M1Q4NCAxOTJRODQgMjUzIDEwMCAzMTFUMTUwIDQxNFQyMzUgNDg3VDM1NSA1MTVRNDQzIDUxNSA0ODggNDYxVDUzMyAzMTdaTTQ1MSAyODJRNDU0IDMwMyA0NTQgMzIzUTQ1NCAzNTAgNDQ4IDM3M1Q0MzAgNDEzVDM5NyA0NDFUMzQ3IDQ1MVEzMDYgNDUxIDI3NiA0MzZUMjI2IDM5N1QxOTUgMzQzVDE3OSAyODJINDUxWk0zODMgNTY1TDIyNCA2NzRMMzE4IDcxNEw0MzYgNTk1TDM4MyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFOTsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik01MzMgMzE3UTUzMyAyOTQgNTMwIDI2OVQ1MjMgMjIzSDE3MVExNjggMjAyIDE2OCAxODRRMTY4IDEyNCAyMDAgOTBUMjk4IDU2UTMzNiA1NiAzNzMgNjdUNDU1IDEwOEw0NzcgNDhRNDI3IDE2IDM4MSAzVDI4NiAtMTFRMTg0IC0xMSAxMzQgNDNUODQgMTkyUTg0IDI1MyAxMDAgMzExVDE1MCA0MTRUMjM1IDQ4N1QzNTUgNTE1UTQ0MyA1MTUgNDg4IDQ2MVQ1MzMgMzE3Wk00NTEgMjgyUTQ1NCAzMDMgNDU0IDMyM1E0NTQgMzUwIDQ0OCAzNzNUNDMwIDQxM1QzOTcgNDQxVDM0NyA0NTFRMzA2IDQ1MSAyNzYgNDM2VDIyNiAzOTdUMTk1IDM0M1QxNzkgMjgySDQ1MVpNMzQ4IDU2NUwzMDMgNTk2TDQ1NyA3MTdMNTM3IDY3NUwzNDggNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUE7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNTMzIDMxN1E1MzMgMjk0IDUzMCAyNjlUNTIzIDIyM0gxNzFRMTY4IDIwMiAxNjggMTg0UTE2OCAxMjQgMjAwIDkwVDI5OCA1NlEzMzYgNTYgMzczIDY3VDQ1NSAxMDhMNDc3IDQ4UTQyNyAxNiAzODEgM1QyODYgLTExUTE4NCAtMTEgMTM0IDQzVDg0IDE5MlE4NCAyNTMgMTAwIDMxMVQxNTAgNDE0VDIzNSA0ODdUMzU1IDUxNVE0NDMgNTE1IDQ4OCA0NjFUNTMzIDMxN1pNNDUxIDI4MlE0NTQgMzAzIDQ1NCAzMjNRNDU0IDM1MCA0NDggMzczVDQzMCA0MTNUMzk3IDQ0MVQzNDcgNDUxUTMwNiA0NTEgMjc2IDQzNlQyMjYgMzk3VDE5NSAzNDNUMTc5IDI4Mkg0NTFaTTQ3OSA1NjNMMzcyIDY0MkwyNDIgNTYzTDIxMiA2MTNMMzgwIDcxMUw1MjQgNjEzTDQ3OSA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik01MzMgMzE3UTUzMyAyOTQgNTMwIDI2OVQ1MjMgMjIzSDE3MVExNjggMjAyIDE2OCAxODRRMTY4IDEyNCAyMDAgOTBUMjk4IDU2UTMzNiA1NiAzNzMgNjdUNDU1IDEwOEw0NzcgNDhRNDI3IDE2IDM4MSAzVDI4NiAtMTFRMTg0IC0xMSAxMzQgNDNUODQgMTkyUTg0IDI1MyAxMDAgMzExVDE1MCA0MTRUMjM1IDQ4N1QzNTUgNTE1UTQ0MyA1MTUgNDg4IDQ2MVQ1MzMgMzE3Wk00NTEgMjgyUTQ1NCAzMDMgNDU0IDMyM1E0NTQgMzUwIDQ0OCAzNzNUNDMwIDQxM1QzOTcgNDQxVDM0NyA0NTFRMzA2IDQ1MSAyNzYgNDM2VDIyNiAzOTdUMTk1IDM0M1QxNzkgMjgySDQ1MVpNNTE1IDYyOVE1MTUgNjA2IDQ5OCA1ODlUNDU3IDU3MlE0MzkgNTcyIDQyNiA1ODRUNDEyIDYxNVE0MTIgNjM4IDQzMCA2NTVUNDcxIDY3M1E0OTAgNjczIDUwMiA2NjFUNTE1IDYyOVpNMzI4IDYyOVEzMjggNjA2IDMxMCA1ODlUMjY5IDU3MlEyNTEgNTcyIDIzOCA1ODRUMjI1IDYxNVEyMjUgNjM4IDI0MiA2NTVUMjgzIDY3M1EzMDIgNjczIDMxNSA2NjFUMzI4IDYyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVDOyIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTc2IDBMMTQ2IDUwMkgyMzNMMTYzIDBINzZaTTIyMSA1NjVMNjIgNjc0TDE1NiA3MTRMMjc0IDU5NUwyMjEgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUQ7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMEwxNDYgNTAySDIzM0wxNjMgMEg3NlpNMTgzIDU2NUwxMzggNTk2TDI5MiA3MTdMMzcyIDY3NUwxODMgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUU7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMEwxNDYgNTAySDIzM0wxNjMgMEg3NlpNMzIwIDU2M0wyMTMgNjQyTDgzIDU2M0w1MyA2MTNMMjIxIDcxMUwzNjUgNjEzTDMyMCA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRjsiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik03NiAwTDE0NiA1MDJIMjMzTDE2MyAwSDc2Wk0zNTQgNjI5UTM1NCA2MDYgMzM3IDU4OVQyOTYgNTcyUTI3OCA1NzIgMjY1IDU4NFQyNTEgNjE1UTI1MSA2MzggMjY5IDY1NVQzMTAgNjczUTMyOSA2NzMgMzQxIDY2MVQzNTQgNjI5Wk0xNjcgNjI5UTE2NyA2MDYgMTQ5IDU4OVQxMDggNTcyUTkwIDU3MiA3NyA1ODRUNjQgNjE1UTY0IDYzOCA4MSA2NTVUMTIyIDY3M1ExNDEgNjczIDE1NCA2NjFUMTY3IDYyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYwOyIgaG9yaXotYWR2LXg9IjU4NyIgZD0iTTUwNiA2MTZRNTM0IDU2MyA1NDQgNTAxVDU1NCAzNzhRNTU0IDMwOSA1NDMgMjQwVDUwMSAxMTZUNDE3IDI1VDI4MSAtMTBRMTg4IC0xMCAxNDMgNDNUOTggMTg1UTk4IDI0MyAxMTEgMjk3VDE1NCAzOTNUMjI5IDQ2MFQzNDAgNDg1UTM4MSA0ODUgNDE0IDQ3M1Q0NjggNDIySDQ3MlE0NzEgNDY0IDQ2MCA1MDVUNDMyIDU4NEwzMDMgNTI0TDI4NSA1NzVMNDA3IDYzMlEzOTYgNjQ5IDM4MyA2NjVUMzU2IDY5NUw0MzUgNzE2UTQ0NyA3MDMgNDU4IDY5MVQ0ODAgNjY0TDU2NSA3MDhMNTgzIDY1Nkw1MDYgNjE2Wk0yOTggNTdRMzQ4IDU3IDM3OSA4MVQ0MjkgMTQyVDQ1NCAyMjNUNDYxIDMwOFE0NjEgMzY3IDQzNCAzOTVUMzQ3IDQyM1EzMDQgNDIzIDI3NiA0MDlUMjMxIDM3MFQyMDQgMzEzVDE5MCAyNDNRMTg4IDIyOCAxODcgMjE0VDE4NSAxODRRMTg1IDEyNiAyMTAgOTJUMjk4IDU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjE7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDAxIDBMNDQyIDI5NFE0NDQgMzEwIDQ0NSAzMjRUNDQ3IDM1MlE0NDcgMzcyIDQ0MyAzODhUNDI4IDQxNlQzOTkgNDM0VDM1MyA0NDBRMjkwIDQ0MCAyNTMgNDA4VDIwNyAzMTVMMTYzIDBINzZMMTQ2IDUwMkgyMTlWNDM5SDIyM1EyODIgNTE0IDM4NiA1MTRRNDI5IDUxNCA0NTggNTA1VDUwNCA0NzhUNTI5IDQzNVQ1MzcgMzc2UTUzNyAzNjIgNTM2IDM0N1Q1MzIgMzE0TDQ4OCAwSDQwMVpNNTQwIDY0MVE1MjQgNjA1IDQ5NiA1ODhUNDM4IDU3MFE0MjAgNTcwIDQwMyA1NzZUMzY4IDU4OVQzMzYgNjAzVDMwNiA2MTBRMjg5IDYxMCAyNzQgNjAyVDI0NCA1NjlMMjA1IDYwM1EyMjkgNjQ0IDI1NCA2NTlUMzA4IDY3NFEzMjYgNjc0IDM0MyA2NjhUMzc4IDY1NFQ0MTEgNjQwVDQ0MSA2MzRRNDU4IDYzNCA0NzMgNjQyVDQ5OSA2NzRMNTQwIDY0MUg1NDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMjsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik04NCAxOTJRODQgMjU2IDEwMCAzMTRUMTUxIDQxNlQyMzYgNDg3VDM1OCA1MTRRNDU4IDUxNCA1MDkgNDYwVDU2MCAzMDdRNTYwIDI0NCA1NDMgMTg2VDQ5MSA4NVQ0MDUgMTVUMjg0IC0xMVExODUgLTExIDEzNSA0MlQ4NCAxOTJaTTM0OSA0NDVRMjk3IDQ0NSAyNjMgNDIyVDIwOSAzNjJUMTgxIDI4MVQxNzMgMTkzUTE3MyAxMzEgMjAwIDk0VDI5NCA1NlEzNDUgNTYgMzc5IDc5VDQzNCAxMzlUNDYyIDIyMFQ0NzEgMzA4UTQ3MSAzNzAgNDQ0IDQwN1QzNDkgNDQ1Wk0zOTEgNTY1TDIzMiA2NzRMMzI2IDcxNEw0NDQgNTk1TDM5MSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMzsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik04NCAxOTJRODQgMjU2IDEwMCAzMTRUMTUxIDQxNlQyMzYgNDg3VDM1OCA1MTRRNDU4IDUxNCA1MDkgNDYwVDU2MCAzMDdRNTYwIDI0NCA1NDMgMTg2VDQ5MSA4NVQ0MDUgMTVUMjg0IC0xMVExODUgLTExIDEzNSA0MlQ4NCAxOTJaTTM0OSA0NDVRMjk3IDQ0NSAyNjMgNDIyVDIwOSAzNjJUMTgxIDI4MVQxNzMgMTkzUTE3MyAxMzEgMjAwIDk0VDI5NCA1NlEzNDUgNTYgMzc5IDc5VDQzNCAxMzlUNDYyIDIyMFQ0NzEgMzA4UTQ3MSAzNzAgNDQ0IDQwN1QzNDkgNDQ1Wk0zNTIgNTY1TDMwNyA1OTZMNDYxIDcxN0w1NDEgNjc1TDM1MiA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNDsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik04NCAxOTJRODQgMjU2IDEwMCAzMTRUMTUxIDQxNlQyMzYgNDg3VDM1OCA1MTRRNDU4IDUxNCA1MDkgNDYwVDU2MCAzMDdRNTYwIDI0NCA1NDMgMTg2VDQ5MSA4NVQ0MDUgMTVUMjg0IC0xMVExODUgLTExIDEzNSA0MlQ4NCAxOTJaTTM0OSA0NDVRMjk3IDQ0NSAyNjMgNDIyVDIwOSAzNjJUMTgxIDI4MVQxNzMgMTkzUTE3MyAxMzEgMjAwIDk0VDI5NCA1NlEzNDUgNTYgMzc5IDc5VDQzNCAxMzlUNDYyIDIyMFQ0NzEgMzA4UTQ3MSAzNzAgNDQ0IDQwN1QzNDkgNDQ1Wk00ODUgNTYzTDM3OCA2NDJMMjQ4IDU2M0wyMTggNjEzTDM4NiA3MTFMNTMwIDYxM0w0ODUgNTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjU7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNODQgMTkyUTg0IDI1NiAxMDAgMzE0VDE1MSA0MTZUMjM2IDQ4N1QzNTggNTE0UTQ1OCA1MTQgNTA5IDQ2MFQ1NjAgMzA3UTU2MCAyNDQgNTQzIDE4NlQ0OTEgODVUNDA1IDE1VDI4NCAtMTFRMTg1IC0xMSAxMzUgNDJUODQgMTkyWk0zNDkgNDQ1UTI5NyA0NDUgMjYzIDQyMlQyMDkgMzYyVDE4MSAyODFUMTczIDE5M1ExNzMgMTMxIDIwMCA5NFQyOTQgNTZRMzQ1IDU2IDM3OSA3OVQ0MzQgMTM5VDQ2MiAyMjBUNDcxIDMwOFE0NzEgMzcwIDQ0NCA0MDdUMzQ5IDQ0NVpNNTQzIDY0MVE1MjcgNjA1IDQ5OSA1ODhUNDQxIDU3MFE0MjMgNTcwIDQwNiA1NzZUMzcxIDU4OVQzMzkgNjAzVDMwOSA2MTBRMjkyIDYxMCAyNzcgNjAyVDI0NyA1NjlMMjA4IDYwM1EyMzIgNjQ0IDI1NyA2NTlUMzExIDY3NFEzMjkgNjc0IDM0NiA2NjhUMzgxIDY1NFQ0MTQgNjQwVDQ0NCA2MzRRNDYxIDYzNCA0NzYgNjQyVDUwMiA2NzRMNTQzIDY0MUg1NDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNjsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik04NCAxOTJRODQgMjU2IDEwMCAzMTRUMTUxIDQxNlQyMzYgNDg3VDM1OCA1MTRRNDU4IDUxNCA1MDkgNDYwVDU2MCAzMDdRNTYwIDI0NCA1NDMgMTg2VDQ5MSA4NVQ0MDUgMTVUMjg0IC0xMVExODUgLTExIDEzNSA0MlQ4NCAxOTJaTTM0OSA0NDVRMjk3IDQ0NSAyNjMgNDIyVDIwOSAzNjJUMTgxIDI4MVQxNzMgMTkzUTE3MyAxMzEgMjAwIDk0VDI5NCA1NlEzNDUgNTYgMzc5IDc5VDQzNCAxMzlUNDYyIDIyMFQ0NzEgMzA4UTQ3MSAzNzAgNDQ0IDQwN1QzNDkgNDQ1Wk01MjEgNjI5UTUyMSA2MDYgNTA0IDU4OVQ0NjMgNTcyUTQ0NSA1NzIgNDMyIDU4NFQ0MTggNjE1UTQxOCA2MzggNDM2IDY1NVQ0NzcgNjczUTQ5NiA2NzMgNTA4IDY2MVQ1MjEgNjI5Wk0zMzQgNjI5UTMzNCA2MDYgMzE2IDU4OVQyNzUgNTcyUTI1NyA1NzIgMjQ0IDU4NFQyMzEgNjE1UTIzMSA2MzggMjQ4IDY1NVQyODkgNjczUTMwOCA2NzMgMzIxIDY2MVQzMzQgNjI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjc7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNODIgMjI0TDkzIDMwMEg1NjVMNTU0IDIyNEg4MlpNMjQ2IDg5UTI0NiAxMTUgMjY1IDEzM1QzMTAgMTUxUTMzMCAxNTEgMzQzIDEzOFQzNTcgMTA1UTM1NyA4MCAzMzggNjFUMjk0IDQyUTI3NCA0MiAyNjAgNTVUMjQ2IDg5Wk0yOTMgNDIyUTI5MyA0NDggMzEyIDQ2NlQzNTcgNDg0UTM3NyA0ODQgMzkwIDQ3MVQ0MDQgNDM4UTQwNCA0MTMgMzg1IDM5NFQzNDEgMzc1UTMyMSAzNzUgMzA3IDM4OFQyOTMgNDIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjg7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNODQgMTkyUTg0IDI1NiAxMDAgMzE0VDE1MSA0MTZUMjM2IDQ4N1QzNTggNTE0UTQwMCA1MTQgNDM0IDUwNFQ0OTMgNDczTDU1NyA1MzhMNTk3IDQ5OUw1MzAgNDMxUTU2MCAzODEgNTYwIDMwN1E1NjAgMjQ0IDU0MyAxODZUNDkxIDg1VDQwNSAxNVQyODQgLTExUTE5MiAtMTEgMTM5IDM3TDg1IC0xOEw0OSAyMkwxMDcgODFRODQgMTI0IDg0IDE5MlpNNDcxIDMwOFE0NzEgMzI0IDQ2OSAzMzhUNDY0IDM2NUwxOTggOTZRMjEyIDc3IDIzNSA2N1QyOTQgNTZRMzQ1IDU2IDM3OSA3OVQ0MzQgMTM5VDQ2MiAyMjBUNDcxIDMwOFpNMzQ5IDQ0NVEyOTcgNDQ1IDI2MyA0MjJUMjA5IDM2MlQxODEgMjgxVDE3MyAxOTNRMTczIDE3MCAxNzYgMTUxTDQzNiA0MTVRNDIxIDQyOSA0MDAgNDM3VDM0OSA0NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGOTsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMFY2M0g0MDJRMzc5IDMxIDM0MSAxMFQyNDIgLTExUTIwOCAtMTEgMTgxIC01VDEzNiAxN1QxMDcgNjBUOTcgMTI4UTk3IDE0MiA5OCAxNThUMTAyIDE5MkwxNDYgNTAySDIzM0wxOTYgMjM3UTE5MiAyMTMgMTkwIDE5MlQxODggMTUzUTE4OCAxMDggMjA2IDg1VDI3NyA2MlEzNDcgNjIgMzc5IDk4VDQxOSAxOTRMNDYyIDUwMkg1NDlMNDc5IDBINDA2Wk0zNjMgNTY1TDIwNCA2NzRMMjk4IDcxNEw0MTYgNTk1TDM2MyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQTsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMFY2M0g0MDJRMzc5IDMxIDM0MSAxMFQyNDIgLTExUTIwOCAtMTEgMTgxIC01VDEzNiAxN1QxMDcgNjBUOTcgMTI4UTk3IDE0MiA5OCAxNThUMTAyIDE5MkwxNDYgNTAySDIzM0wxOTYgMjM3UTE5MiAyMTMgMTkwIDE5MlQxODggMTUzUTE4OCAxMDggMjA2IDg1VDI3NyA2MlEzNDcgNjIgMzc5IDk4VDQxOSAxOTRMNDYyIDUwMkg1NDlMNDc5IDBINDA2Wk0zNDYgNTY1TDMwMSA1OTZMNDU1IDcxN0w1MzUgNjc1TDM0NiA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMFY2M0g0MDJRMzc5IDMxIDM0MSAxMFQyNDIgLTExUTIwOCAtMTEgMTgxIC01VDEzNiAxN1QxMDcgNjBUOTcgMTI4UTk3IDE0MiA5OCAxNThUMTAyIDE5MkwxNDYgNTAySDIzM0wxOTYgMjM3UTE5MiAyMTMgMTkwIDE5MlQxODggMTUzUTE4OCAxMDggMjA2IDg1VDI3NyA2MlEzNDcgNjIgMzc5IDk4VDQxOSAxOTRMNDYyIDUwMkg1NDlMNDc5IDBINDA2Wk00NzggNTYzTDM3MSA2NDJMMjQxIDU2M0wyMTEgNjEzTDM3OSA3MTFMNTIzIDYxM0w0NzggNTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkM7IiBob3Jpei1hZHYteD0iNTU1IiBkPSJNNDA2IDBWNjNINDAyUTM3OSAzMSAzNDEgMTBUMjQyIC0xMVEyMDggLTExIDE4MSAtNVQxMzYgMTdUMTA3IDYwVDk3IDEyOFE5NyAxNDIgOTggMTU4VDEwMiAxOTJMMTQ2IDUwMkgyMzNMMTk2IDIzN1ExOTIgMjEzIDE5MCAxOTJUMTg4IDE1M1ExODggMTA4IDIwNiA4NVQyNzcgNjJRMzQ3IDYyIDM3OSA5OFQ0MTkgMTk0TDQ2MiA1MDJINTQ5TDQ3OSAwSDQwNlpNNTE1IDYyOVE1MTUgNjA2IDQ5OCA1ODlUNDU3IDU3MlE0MzkgNTcyIDQyNiA1ODRUNDEyIDYxNVE0MTIgNjM4IDQzMCA2NTVUNDcxIDY3M1E0OTAgNjczIDUwMiA2NjFUNTE1IDYyOVpNMzI4IDYyOVEzMjggNjA2IDMxMCA1ODlUMjY5IDU3MlEyNTEgNTcyIDIzOCA1ODRUMjI1IDYxNVEyMjUgNjM4IDI0MiA2NTVUMjgzIDY3M1EzMDIgNjczIDMxNSA2NjFUMzI4IDYyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZEOyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTI1NiAtNjVRMjMyIC0xMTMgMjEyIC0xNDRUMTcwIC0xOTNUMTI1IC0yMTlUNjYgLTIyNlE0NSAtMjI2IDEyIC0yMjNMMjMgLTE0OVEzMSAtMTUxIDQwIC0xNTFUNjYgLTE1MlE4NSAtMTUyIDk4IC0xNDhUMTI0IC0xMzJUMTQ4IC0xMDBUMTc2IC00OEwyMDkgMThMODggNTAySDE4MkwyNjYgMTExSDI3MEw0NTQgNTAySDU0N0wyNTYgLTY1Wk0zMjcgNTY1TDI4MiA1OTZMNDM2IDcxN0w1MTYgNjc1TDMyNyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRTsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik01NTEgMzIyUTU1MSAyNjUgNTM3IDIwNlQ0OTMgOTlUNDE2IDIxVDMwMCAtMTBRMjUxIC0xMCAyMjEgOVQxNzIgNjJMMTcwIDYzTDEzMSAtMjIwSDQ1TDE3NCA3MDBIMjU1TDIxOSA0NDNIMjIzUTI1NyA0ODMgMjk1IDQ5OFQzODAgNTE0UTQyNyA1MTQgNDU5IDUwMFQ1MTIgNDYwVDU0MiAzOTlUNTUxIDMyMlpNMjk2IDU3UTM0NSA1NyAzNzcgODJUNDI5IDE0NlQ0NTUgMjMyVDQ2MyAzMjRRNDYzIDM1MSA0NTggMzczVDQ0MCA0MTJUNDA2IDQzN1QzNTEgNDQ2UTI5MSA0NDYgMjU0IDQxNlQyMDggMzI2TDE5MSAyMDJRMTg5IDE5NCAxODkgMTg2VDE4OSAxNzBRMTg5IDExOCAyMTUgODhUMjk2IDU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkY7IiBob3Jpei1hZHYteD0iNDk1IiBkPSJNMjU2IC02NVEyMzIgLTExMyAyMTIgLTE0NFQxNzAgLTE5M1QxMjUgLTIxOVQ2NiAtMjI2UTQ1IC0yMjYgMTIgLTIyM0wyMyAtMTQ5UTMxIC0xNTEgNDAgLTE1MVQ2NiAtMTUyUTg1IC0xNTIgOTggLTE0OFQxMjQgLTEzMlQxNDggLTEwMFQxNzYgLTQ4TDIwOSAxOEw4OCA1MDJIMTgyTDI2NiAxMTFIMjcwTDQ1NCA1MDJINTQ3TDI1NiAtNjVaTTQ4NyA2MjlRNDg3IDYwNiA0NzAgNTg5VDQyOSA1NzJRNDExIDU3MiAzOTggNTg0VDM4NCA2MTVRMzg0IDYzOCA0MDIgNjU1VDQ0MyA2NzNRNDYyIDY3MyA0NzQgNjYxVDQ4NyA2MjlaTTMwMCA2MjlRMzAwIDYwNiAyODIgNTg5VDI0MSA1NzJRMjIzIDU3MiAyMTAgNTg0VDE5NyA2MTVRMTk3IDYzOCAyMTQgNjU1VDI1NSA2NzNRMjc0IDY3MyAyODcgNjYxVDMwMCA2MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDA7IiBob3Jpei1hZHYteD0iNjQyIiBkPSJNNTIyIDBMNDg3IDE2MUgxOTZMMTE2IDBIMjJMMzYyIDY3MUg0NjRMNjIwIDBINTIyWk00MDEgNTgySDM5N0wyMjkgMjM2SDQ3M0w0MDEgNTgyWk0yNjkgNzI5TDI3NyA3ODZINTc1TDU2NyA3MjlIMjY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAxOyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQxNSAwTDQyMCA3N0g0MTZRMzg3IDMyIDM0NSAxMVQyNTIgLTExUTIwNSAtMTEgMTczIDRUMTIxIDQ1VDkyIDEwNlQ4MyAxODJRODMgMjM1IDk0IDI5M1QxMzQgNDAxVDIwOCA0ODJUMzI2IDUxNFEzNzEgNTE0IDQwNSA1MDBUNDYyIDQ0NEg0NjZMNDgzIDUwMkg1NThMNDg4IDBINDE1Wk00NDcgMzI2UTQ1NSAzODYgNDI0IDQxNlQzMzYgNDQ2UTI4NCA0NDYgMjUyIDQyMVQyMDIgMzU4VDE3OCAyNzVUMTcyIDE4OFExNzIgMTYxIDE3NyAxMzdUMTk0IDk1VDIyOCA2NVQyODMgNTRRMzE1IDU0IDM0MCA2NVQzODQgOTZUNDE0IDE0M1Q0MzAgMjAwTDQ0NyAzMjZaTTE5MyA1ODlMMjAxIDY0Nkg0OTlMNDkxIDU4OUgxOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDI7IiBob3Jpei1hZHYteD0iNjQyIiBkPSJNNTIyIDBMNDg3IDE2MUgxOTZMMTE2IDBIMjJMMzYyIDY3MUg0NjRMNjIwIDBINTIyWk00MDEgNTgySDM5N0wyMjkgMjM2SDQ3M0w0MDEgNTgyWk01ODAgODI3UTU3MiA3OTIgNTU0IDc2OVQ1MTQgNzMxVDQ2NiA3MTFUNDE2IDcwNVEzOTIgNzA1IDM2OSA3MTFUMzI3IDczMVQyOTggNzY4VDI4OCA4MjdIMzQ4UTM0NyA3OTYgMzY0IDc3NVQ0MjMgNzU0UTQ2MyA3NTQgNDg3IDc3NVQ1MTkgODI3SDU4MEg1ODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDM7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDE1IDBMNDIwIDc3SDQxNlEzODcgMzIgMzQ1IDExVDI1MiAtMTFRMjA1IC0xMSAxNzMgNFQxMjEgNDVUOTIgMTA2VDgzIDE4MlE4MyAyMzUgOTQgMjkzVDEzNCA0MDFUMjA4IDQ4MlQzMjYgNTE0UTM3MSA1MTQgNDA1IDUwMFQ0NjIgNDQ0SDQ2Nkw0ODMgNTAySDU1OEw0ODggMEg0MTVaTTQ0NyAzMjZRNDU1IDM4NiA0MjQgNDE2VDMzNiA0NDZRMjg0IDQ0NiAyNTIgNDIxVDIwMiAzNThUMTc4IDI3NVQxNzIgMTg4UTE3MiAxNjEgMTc3IDEzN1QxOTQgOTVUMjI4IDY1VDI4MyA1NFEzMTUgNTQgMzQwIDY1VDM4NCA5NlQ0MTQgMTQzVDQzMCAyMDBMNDQ3IDMyNlpNNTA0IDY4N1E0OTYgNjUyIDQ3OCA2MjlUNDM4IDU5MVQzOTAgNTcxVDM0MCA1NjVRMzE2IDU2NSAyOTMgNTcxVDI1MSA1OTFUMjIyIDYyOFQyMTIgNjg3SDI3MlEyNzEgNjU2IDI4OCA2MzVUMzQ3IDYxNFEzODcgNjE0IDQxMSA2MzVUNDQzIDY4N0g1MDRINTA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA0OyIgaG9yaXotYWR2LXg9IjY0MiIgZD0iTTU3MSAwUTUwOSAtMzUgNDg1IC02NFQ0NjAgLTEyOFE0NjAgLTE1MyA0NzQgLTE2OFQ1MTQgLTE4M1E1MzQgLTE4MyA1NDggLTE3N1Q1NzIgLTE2Nkw1ODMgLTIxN1E1NzAgLTIyMyA1NDQgLTIzMFQ0OTMgLTIzOFE0NDIgLTIzOCA0MTggLTIxNFQzOTQgLTE1MVEzOTQgLTEyMyA0MDQgLTEwMFQ0MzIgLTU4VDQ3MyAtMjRUNTIxIDRMNDg3IDE2MUgxOTZMMTE2IDBIMjJMMzYyIDY3MUg0NjRMNjIwIDBINTcxWk00MDEgNTgySDM5N0wyMjkgMjM2SDQ3M0w0MDEgNTgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA1OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQ2NiAwUTQxMCAtMzUgMzgzIC02NVQzNTYgLTEzMFEzNTYgLTE1NSAzNzEgLTE2OVQ0MDkgLTE4M1E0MjkgLTE4MyA0NDMgLTE3OFQ0NjggLTE2Nkw0NzggLTIxN1E0NjUgLTIyMyA0MzkgLTIzMFQzODggLTIzOFEzMzcgLTIzOCAzMTMgLTIxNFQyODkgLTE1MVEyODkgLTEyNSAyOTkgLTEwMlQzMjYgLTYwVDM2NiAtMjVUNDE1IDRMNDIwIDc3SDQxNlEzODcgMzIgMzQ1IDExVDI1MiAtMTFRMjA1IC0xMSAxNzMgNFQxMjEgNDVUOTIgMTA2VDgzIDE4MlE4MyAyMzUgOTQgMjkzVDEzNCA0MDFUMjA4IDQ4MlQzMjYgNTE0UTM3MSA1MTQgNDA1IDUwMFQ0NjIgNDQ0SDQ2Nkw0ODMgNTAySDU1OEw0ODggMEg0NjZaTTQ0NyAzMjZRNDU1IDM4NiA0MjQgNDE2VDMzNiA0NDZRMjg0IDQ0NiAyNTIgNDIxVDIwMiAzNThUMTc4IDI3NVQxNzIgMTg4UTE3MiAxNjEgMTc3IDEzN1QxOTQgOTVUMjI4IDY1VDI4MyA1NFEzMTUgNTQgMzQwIDY1VDM4NCA5NlQ0MTQgMTQzVDQzMCAyMDBMNDQ3IDMyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNjsiIGhvcml6LWFkdi14PSI2MzIiIGQ9Ik02MTEgODNRNTU1IDM4IDQ5NSAxNFQzNjMgLTExUTIzNCAtMTEgMTcwIDU4VDEwNiAyNTRRMTA2IDMzNSAxMjggNDExVDE5NCA1NDdUMzA2IDY0MlQ0NjMgNjc4UTUyOSA2NzggNTgwIDY1NlQ2NzggNTg2TDYxNCA1MjZRNTgwIDU2MyA1NDMgNTgyVDQ1NSA2MDFRMzg1IDYwMSAzMzcgNTcxVDI1OSA0OTJUMjE2IDM4NFQyMDIgMjYzUTIwMiAyMTkgMjExIDE4M1QyNDIgMTIxVDI5NiA4MFQzNzcgNjVRNDMyIDY1IDQ4MCA4N1Q1NzEgMTQ1TDYxMSA4M0g2MTFaTTQ0MyA3MTBMMzk4IDc0MUw1NTIgODYyTDYzMiA4MjBMNDQzIDcxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNzsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik00ODEgMzkwUTQzMyA0NDUgMzU2IDQ0NVEzMDcgNDQ1IDI3MiA0MjNUMjE1IDM2N1QxODMgMjg5VDE3MyAyMDNRMTczIDEzOSAyMDMgOTlUMzAyIDU4UTM0NSA1OCAzNzkgNzJUNDQ4IDExMkw0NzAgNTFRNDI4IDIyIDM4MyA2VDI4NyAtMTFRMTg5IC0xMSAxMzYgNDJUODMgMTk0UTgzIDI1NyAxMDEgMzE1VDE1NSA0MTdUMjQzIDQ4OFQzNjMgNTE0UTQwOSA1MTQgNDUxIDQ5OFQ1MjggNDUxTDQ4MSAzOTBaTTM0NCA1NjVMMjk5IDU5Nkw0NTMgNzE3TDUzMyA2NzVMMzQ0IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGhvcml6LWFkdi14PSI2MzIiIGQ9Ik02MTEgODNRNTU1IDM4IDQ5NSAxNFQzNjMgLTExUTIzNCAtMTEgMTcwIDU4VDEwNiAyNTRRMTA2IDMzNSAxMjggNDExVDE5NCA1NDdUMzA2IDY0MlQ0NjMgNjc4UTUyOSA2NzggNTgwIDY1NlQ2NzggNTg2TDYxNCA1MjZRNTgwIDU2MyA1NDMgNTgyVDQ1NSA2MDFRMzg1IDYwMSAzMzcgNTcxVDI1OSA0OTJUMjE2IDM4NFQyMDIgMjYzUTIwMiAyMTkgMjExIDE4M1QyNDIgMTIxVDI5NiA4MFQzNzcgNjVRNDMyIDY1IDQ4MCA4N1Q1NzEgMTQ1TDYxMSA4M0g2MTFaTTU4NCA3MDVMNDc3IDc4NEwzNDcgNzA1TDMxNyA3NTVMNDg1IDg1M0w2MjkgNzU1TDU4NCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDk7IiBob3Jpei1hZHYteD0iNDk1IiBkPSJNNDgxIDM5MFE0MzMgNDQ1IDM1NiA0NDVRMzA3IDQ0NSAyNzIgNDIzVDIxNSAzNjdUMTgzIDI4OVQxNzMgMjAzUTE3MyAxMzkgMjAzIDk5VDMwMiA1OFEzNDUgNTggMzc5IDcyVDQ0OCAxMTJMNDcwIDUxUTQyOCAyMiAzODMgNlQyODcgLTExUTE4OSAtMTEgMTM2IDQyVDgzIDE5NFE4MyAyNTcgMTAxIDMxNVQxNTUgNDE3VDI0MyA0ODhUMzYzIDUxNFE0MDkgNTE0IDQ1MSA0OThUNTI4IDQ1MUw0ODEgMzkwWk00ODEgNTYzTDM3NCA2NDJMMjQ0IDU2M0wyMTQgNjEzTDM4MiA3MTFMNTI2IDYxM0w0ODEgNTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBBOyIgaG9yaXotYWR2LXg9IjYzMiIgZD0iTTYxMSA4M1E1NTUgMzggNDk1IDE0VDM2MyAtMTFRMjM0IC0xMSAxNzAgNThUMTA2IDI1NFExMDYgMzM1IDEyOCA0MTFUMTk0IDU0N1QzMDYgNjQyVDQ2MyA2NzhRNTI5IDY3OCA1ODAgNjU2VDY3OCA1ODZMNjE0IDUyNlE1ODAgNTYzIDU0MyA1ODJUNDU1IDYwMVEzODUgNjAxIDMzNyA1NzFUMjU5IDQ5MlQyMTYgMzg0VDIwMiAyNjNRMjAyIDIxOSAyMTEgMTgzVDI0MiAxMjFUMjk2IDgwVDM3NyA2NVE0MzIgNjUgNDgwIDg3VDU3MSAxNDVMNjExIDgzSDYxMVpNNTMyIDc3OFE1MzIgNzUxIDUxNCA3MzZUNDY5IDcyMVE0NDkgNzIxIDQzNSA3MzFUNDIxIDc2M1E0MjEgNzg5IDQzOSA4MDRUNDgzIDgyMFE1MDMgODIwIDUxNyA4MTBUNTMyIDc3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQjsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik00ODEgMzkwUTQzMyA0NDUgMzU2IDQ0NVEzMDcgNDQ1IDI3MiA0MjNUMjE1IDM2N1QxODMgMjg5VDE3MyAyMDNRMTczIDEzOSAyMDMgOTlUMzAyIDU4UTM0NSA1OCAzNzkgNzJUNDQ4IDExMkw0NzAgNTFRNDI4IDIyIDM4MyA2VDI4NyAtMTFRMTg5IC0xMSAxMzYgNDJUODMgMTk0UTgzIDI1NyAxMDEgMzE1VDE1NSA0MTdUMjQzIDQ4OFQzNjMgNTE0UTQwOSA1MTQgNDUxIDQ5OFQ1MjggNDUxTDQ4MSAzOTBaTTQyOCA2MzdRNDI4IDYxMCA0MTAgNTk1VDM2NSA1ODBRMzQ1IDU4MCAzMzEgNTkwVDMxNyA2MjJRMzE3IDY0OCAzMzUgNjYzVDM3OSA2NzlRMzk5IDY3OSA0MTMgNjY5VDQyOCA2MzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEM7IiBob3Jpei1hZHYteD0iNjMyIiBkPSJNNjExIDgzUTU1NSAzOCA0OTUgMTRUMzYzIC0xMVEyMzQgLTExIDE3MCA1OFQxMDYgMjU0UTEwNiAzMzUgMTI4IDQxMVQxOTQgNTQ3VDMwNiA2NDJUNDYzIDY3OFE1MjkgNjc4IDU4MCA2NTZUNjc4IDU4Nkw2MTQgNTI2UTU4MCA1NjMgNTQzIDU4MlQ0NTUgNjAxUTM4NSA2MDEgMzM3IDU3MVQyNTkgNDkyVDIxNiAzODRUMjAyIDI2M1EyMDIgMjE5IDIxMSAxODNUMjQyIDEyMVQyOTYgODBUMzc3IDY1UTQzMiA2NSA0ODAgODdUNTcxIDE0NUw2MTEgODNINjExWk02MjMgODExTDQ2NSA3MTNMMzM1IDgxMUwzNzYgODU5TDQ3NCA3ODNMNTkzIDg1OUw2MjMgODExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBEOyIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTQ4MSAzOTBRNDMzIDQ0NSAzNTYgNDQ1UTMwNyA0NDUgMjcyIDQyM1QyMTUgMzY3VDE4MyAyODlUMTczIDIwM1ExNzMgMTM5IDIwMyA5OVQzMDIgNThRMzQ1IDU4IDM3OSA3MlQ0NDggMTEyTDQ3MCA1MVE0MjggMjIgMzgzIDZUMjg3IC0xMVExODkgLTExIDEzNiA0MlQ4MyAxOTRRODMgMjU3IDEwMSAzMTVUMTU1IDQxN1QyNDMgNDg4VDM2MyA1MTRRNDA5IDUxNCA0NTEgNDk4VDUyOCA0NTFMNDgxIDM5MFpNNTI3IDY2M0wzNjkgNTY1TDIzOSA2NjNMMjgwIDcxMUwzNzggNjM1TDQ5NyA3MTFMNTI3IDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRTsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02NTYgNDExUTY1NiAzMjUgNjMzIDI1MVQ1NjQgMTIwVDQ0OSAzMlQyODkgMEg4NkwxNzkgNjYzUTIzMCA2NjggMjgwIDY3MVQzODIgNjc1UTUxMSA2NzUgNTgzIDYwOVQ2NTYgNDExWk0yODMgNzRRMzQ5IDc0IDM5NiA5MlQ0NzYgMTQ0VDUyOCAyMjdUNTU2IDMzOVE1NTggMzU2IDU1OSAzNzJUNTYxIDQwNVE1NjEgNDk4IDUxNiA1NTBUMzc0IDYwMlEzNDUgNjAyIDMxNyA2MDBUMjYwIDU5NkwxODcgNzVRMjExIDc0IDIzNSA3NFQyODMgNzRaTTU0MyA4MDNMMzg1IDcwNUwyNTUgODAzTDI5NiA4NTFMMzk0IDc3NUw1MTMgODUxTDU0MyA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEY7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDE1IDBMNDIwIDc3SDQxNlEzODcgMzIgMzQ1IDExVDI1MiAtMTFRMjA1IC0xMSAxNzMgNFQxMjEgNDVUOTIgMTA2VDgzIDE4MlE4MyAyMzUgOTQgMjkzVDEzNCA0MDFUMjA4IDQ4MlQzMjYgNTE0UTM3MSA1MTQgNDA0IDUwMFQ0NTkgNDQ0SDQ2M0w0OTkgNzAwSDU4Nkw0ODggMEg0MTVaTTQ0NyAzMjZRNDU1IDM4NiA0MjQgNDE2VDMzNiA0NDZRMjg0IDQ0NiAyNTIgNDIxVDIwMiAzNThUMTc4IDI3NVQxNzIgMTg4UTE3MiAxNjEgMTc3IDEzN1QxOTQgOTVUMjI4IDY1VDI4MyA1NFEzMTUgNTQgMzQwIDY1VDM4NCA5NlQ0MTQgMTQzVDQzMCAyMDBMNDQ3IDMyNlpNNjcyIDUzNUg2MTNMNjY5IDcwMEg3NjJMNjcyIDUzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMDsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02NTcgNDExUTY1NyAzMjQgNjMzIDI0OVQ1NjIgMTE5VDQ0NSAzMlQyODQgMEg4N0wxMzEgMzE4SDY3TDc4IDM5M0gxNDJMMTgwIDY2M1EyMzEgNjY4IDI4MSA2NzFUMzgyIDY3NVE1MTAgNjc1IDU4MyA2MDlUNjU3IDQxMVpNMjgzIDc0UTM0OSA3NCAzOTcgOTJUNDc3IDE0NFQ1MjkgMjI3VDU1NyAzMzlRNTU5IDM1NiA1NjAgMzczVDU2MiA0MDdRNTYyIDQ5OSA1MTggNTQ5VDM3NyA2MDBRMzE4IDYwMCAyNjAgNTk0TDIzMiAzOTNIMzg4TDM3NyAzMThIMjIxTDE4NyA3NVEyMTEgNzQgMjM1IDc0VDI4MyA3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMTsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MTUgMEw0MjAgNzdINDE2UTM4NyAzMiAzNDUgMTFUMjUyIC0xMVEyMDUgLTExIDE3MyAzVDEyMCA0NFQ5MSAxMDVUODIgMTgxUTgyIDIzNCA5MyAyOTFUMTMyIDM5N1QyMDYgNDc2VDMyMiA1MDhRMzY3IDUwOCA0MDIgNDk0VDQ1OCA0MzdINDYyTDQ4MSA1NzBIMzIzTDMzMSA2MjhINDg5TDQ5OSA3MDBINTg2TDU3NiA2MjhINjQzTDYzNSA1NzBINTY4TDQ4OCAwSDQxNVpNNDQ2IDMxOVE0NTQgMzgwIDQyMiA0MTBUMzMyIDQ0MFEyODIgNDQwIDI1MSA0MTZUMjAyIDM1NFQxNzggMjcyVDE3MSAxODZRMTcxIDE2MCAxNzYgMTM2VDE5NCA5NFQyMjggNjVUMjgzIDU0UTMxNSA1NCAzNDAgNjVUMzg0IDk2VDQxNCAxNDNUNDMwIDIwMEw0NDYgMzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBMMTc5IDY2N0g1NzdMNTY2IDU5MEgyNTlMMjMxIDM5MUg1MDlMNDk4IDMxM0gyMjBMMTg3IDc2SDUwNkw0OTYgMEg4NlpNMjM5IDcyOUwyNDcgNzg2SDU0NUw1MzcgNzI5SDIzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMzsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik01MzMgMzE3UTUzMyAyOTQgNTMwIDI2OVQ1MjMgMjIzSDE3MVExNjggMjAyIDE2OCAxODRRMTY4IDEyNCAyMDAgOTBUMjk4IDU2UTMzNiA1NiAzNzMgNjdUNDU1IDEwOEw0NzcgNDhRNDI3IDE2IDM4MSAzVDI4NiAtMTFRMTg0IC0xMSAxMzQgNDNUODQgMTkyUTg0IDI1MyAxMDAgMzExVDE1MCA0MTRUMjM1IDQ4N1QzNTUgNTE1UTQ0MyA1MTUgNDg4IDQ2MVQ1MzMgMzE3Wk00NTEgMjgyUTQ1NCAzMDMgNDU0IDMyM1E0NTQgMzUwIDQ0OCAzNzNUNDMwIDQxM1QzOTcgNDQxVDM0NyA0NTFRMzA2IDQ1MSAyNzYgNDM2VDIyNiAzOTdUMTk1IDM0M1QxNzkgMjgySDQ1MVpNMjE1IDU4OUwyMjMgNjQ2SDUyMUw1MTMgNTg5SDIxNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNDsiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik04NiAwTDE3OSA2NjdINTc3TDU2NiA1OTBIMjU5TDIzMSAzOTFINTA5TDQ5OCAzMTNIMjIwTDE4NyA3Nkg1MDZMNDk2IDBIODZaTTU0OCA4MjdRNTQwIDc5MiA1MjIgNzY5VDQ4MiA3MzFUNDM0IDcxMVQzODQgNzA1UTM2MCA3MDUgMzM3IDcxMVQyOTUgNzMxVDI2NiA3NjhUMjU2IDgyN0gzMTZRMzE1IDc5NiAzMzIgNzc1VDM5MSA3NTRRNDMxIDc1NCA0NTUgNzc1VDQ4NyA4MjdINTQ4SDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNTsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik01MzMgMzE3UTUzMyAyOTQgNTMwIDI2OVQ1MjMgMjIzSDE3MVExNjggMjAyIDE2OCAxODRRMTY4IDEyNCAyMDAgOTBUMjk4IDU2UTMzNiA1NiAzNzMgNjdUNDU1IDEwOEw0NzcgNDhRNDI3IDE2IDM4MSAzVDI4NiAtMTFRMTg0IC0xMSAxMzQgNDNUODQgMTkyUTg0IDI1MyAxMDAgMzExVDE1MCA0MTRUMjM1IDQ4N1QzNTUgNTE1UTQ0MyA1MTUgNDg4IDQ2MVQ1MzMgMzE3Wk00NTEgMjgyUTQ1NCAzMDMgNDU0IDMyM1E0NTQgMzUwIDQ0OCAzNzNUNDMwIDQxM1QzOTcgNDQxVDM0NyA0NTFRMzA2IDQ1MSAyNzYgNDM2VDIyNiAzOTdUMTk1IDM0M1QxNzkgMjgySDQ1MVpNNTI1IDY4N1E1MTcgNjUyIDQ5OSA2MjlUNDU5IDU5MVQ0MTEgNTcxVDM2MSA1NjVRMzM3IDU2NSAzMTQgNTcxVDI3MiA1OTFUMjQzIDYyOFQyMzMgNjg3SDI5M1EyOTIgNjU2IDMwOSA2MzVUMzY4IDYxNFE0MDggNjE0IDQzMiA2MzVUNDY0IDY4N0g1MjVINTI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE2OyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTg2IDBMMTc5IDY2N0g1NzdMNTY2IDU5MEgyNTlMMjMxIDM5MUg1MDlMNDk4IDMxM0gyMjBMMTg3IDc2SDUwNkw0OTYgMEg4NlpNNDY2IDc3NlE0NjYgNzQ5IDQ0OCA3MzRUNDAzIDcxOVEzODMgNzE5IDM2OSA3MjlUMzU1IDc2MVEzNTUgNzg3IDM3MyA4MDJUNDE3IDgxOFE0MzcgODE4IDQ1MSA4MDhUNDY2IDc3NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNzsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik01MzMgMzE3UTUzMyAyOTQgNTMwIDI2OVQ1MjMgMjIzSDE3MVExNjggMjAyIDE2OCAxODRRMTY4IDEyNCAyMDAgOTBUMjk4IDU2UTMzNiA1NiAzNzMgNjdUNDU1IDEwOEw0NzcgNDhRNDI3IDE2IDM4MSAzVDI4NiAtMTFRMTg0IC0xMSAxMzQgNDNUODQgMTkyUTg0IDI1MyAxMDAgMzExVDE1MCA0MTRUMjM1IDQ4N1QzNTUgNTE1UTQ0MyA1MTUgNDg4IDQ2MVQ1MzMgMzE3Wk00NTEgMjgyUTQ1NCAzMDMgNDU0IDMyM1E0NTQgMzUwIDQ0OCAzNzNUNDMwIDQxM1QzOTcgNDQxVDM0NyA0NTFRMzA2IDQ1MSAyNzYgNDM2VDIyNiAzOTdUMTk1IDM0M1QxNzkgMjgySDQ1MVpNNDI3IDYzN1E0MjcgNjEwIDQwOSA1OTVUMzY0IDU4MFEzNDQgNTgwIDMzMCA1OTBUMzE2IDYyMlEzMTYgNjQ4IDMzNCA2NjNUMzc4IDY3OVEzOTggNjc5IDQxMiA2NjlUNDI3IDYzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExODsiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik00NDMgMFE0MjYgLTEwIDQwNyAtMjNUMzcxIC01MlQzNDMgLTg4VDMzMiAtMTMxUTMzMiAtMTU1IDM0NyAtMTY5VDM4NiAtMTgzUTQxNiAtMTgzIDQ0NSAtMTY3TDQ1NSAtMjE3UTQzNyAtMjI2IDQxMSAtMjMyVDM2NSAtMjM4UTMyNCAtMjM4IDI5NSAtMjE4VDI2NiAtMTU0UTI2NiAtMTI2IDI3NiAtMTAzVDMwMiAtNjBUMzQxIC0yNlQzODYgMEg4NkwxNzkgNjY3SDU3N0w1NjYgNTkwSDI1OUwyMzEgMzkxSDUwOUw0OTggMzEzSDIyMEwxODcgNzZINTA2TDQ5NiAwSDQ0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExOTsiIGhvcml6LWFkdi14PSI1NDMiIGQ9Ik01MzMgMzE3UTUzMyAyOTMgNTMwIDI3MFQ1MjMgMjIzSDE3MVExNjggMjAzIDE2OCAxODRRMTY4IDEyMSAyMDEgODlUMjk4IDU2UTM0MyA1NiAzODAgNzBUNDU1IDEwOEw0NzcgNDhRNDU0IDMzIDQyNSAxOFQzNjggLTE1VDMyMyAtNThUMzA0IC0xMTVRMzA0IC0xMzkgMzE4IC0xNTRUMzU3IC0xNjlRMzczIC0xNjkgMzg3IC0xNjVUNDE2IC0xNTJMNDI2IC0yMDNRNDA3IC0yMTIgMzgyIC0yMThUMzM2IC0yMjRRMjk0IC0yMjQgMjY2IC0yMDRUMjM3IC0xMzlRMjM3IC05NyAyNjEgLTY2VDMxNyAtMTFMMzE2IC04UTI5OSAtMTEgMjg0IC0xMVExODYgLTExIDEzNSA0MVQ4NCAxOTFRODQgMjUzIDEwMSAzMTFUMTUxIDQxNVQyMzYgNDg3VDM1NSA1MTVRNDAwIDUxNSA0MzMgNTAwVDQ4OSA0NTlUNTIyIDM5NlQ1MzMgMzE3Wk00NTIgMjgxUTQ1NSAzMDAgNDU1IDMxOVE0NTUgMzQ1IDQ0OSAzNjhUNDMwIDQxMFQzOTcgNDM4VDM0NyA0NDlRMzA5IDQ0OSAyODAgNDM2VDIzMCA0MDBUMTk3IDM0NlQxNzkgMjgxSDQ1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQTsiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik04NiAwTDE3OSA2NjdINTc3TDU2NiA1OTBIMjU5TDIzMSAzOTFINTA5TDQ5OCAzMTNIMjIwTDE4NyA3Nkg1MDZMNDk2IDBIODZaTTU0NyA4MDNMMzg5IDcwNUwyNTkgODAzTDMwMCA4NTFMMzk4IDc3NUw1MTcgODUxTDU0NyA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBob3Jpei1hZHYteD0iNTQzIiBkPSJNNTMzIDMxN1E1MzMgMjk0IDUzMCAyNjlUNTIzIDIyM0gxNzFRMTY4IDIwMiAxNjggMTg0UTE2OCAxMjQgMjAwIDkwVDI5OCA1NlEzMzYgNTYgMzczIDY3VDQ1NSAxMDhMNDc3IDQ4UTQyNyAxNiAzODEgM1QyODYgLTExUTE4NCAtMTEgMTM0IDQzVDg0IDE5MlE4NCAyNTMgMTAwIDMxMVQxNTAgNDE0VDIzNSA0ODdUMzU1IDUxNVE0NDMgNTE1IDQ4OCA0NjFUNTMzIDMxN1pNNDUxIDI4MlE0NTQgMzAzIDQ1NCAzMjNRNDU0IDM1MCA0NDggMzczVDQzMCA0MTNUMzk3IDQ0MVQzNDcgNDUxUTMwNiA0NTEgMjc2IDQzNlQyMjYgMzk3VDE5NSAzNDNUMTc5IDI4Mkg0NTFaTTUxOSA2NjNMMzYxIDU2NUwyMzEgNjYzTDI3MiA3MTFMMzcwIDYzNUw0ODkgNzExTDUxOSA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUM7IiBob3Jpei1hZHYteD0iNjk4IiBkPSJNMzc4IDYwUTQ2NiA2MCA1MTcgMTA3VDU4MiAyMzVMNTg5IDI3N0g0MTFMNDIyIDM1Mkg2ODJMNjcyIDI3OFE2NTIgMTM1IDU3NSA2M1QzNjQgLTEwUTI5OCAtMTAgMjUwIDEwVDE2OSA2NlQxMjIgMTUxVDEwNiAyNjFRMTA2IDMzOCAxMjkgNDEzVDE5NyA1NDdUMzA5IDY0MlQ0NjUgNjc4UTU0MCA2NzggNTkwIDY1MlQ2NzYgNTkxTDYxMyA1MzBRNTc1IDU2OCA1MzcgNTg0VDQ1NyA2MDFRMzg2IDYwMSAzMzggNTcxVDI1OCA0OTFUMjE0IDM4MVQyMDAgMjU5UTIwMCAyMTggMjA5IDE4MlQyMzggMTE4VDI5MyA3NlQzNzggNjBaTTU3OCA3MDNMNDcxIDc4MkwzNDEgNzAzTDMxMSA3NTNMNDc5IDg1MUw2MjMgNzUzTDU3OCA3MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUQ7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDgyIC00M1E0NzMgLTEwNSA0NTMgLTE0MVQ0MDUgLTE5NlQzNDMgLTIyMFQyNzMgLTIyNlExNDggLTIyNiA2MSAtMTc1TDk3IC0xMDdRMTM3IC0xMzIgMTc3IC0xNDVUMjY4IC0xNThRMjk4IC0xNTggMzE5IC0xNTRUMzU2IC0xMzdUMzc5IC0xMDVUMzkzIC01Mkw0MTIgNzlINDA4UTM3NiAzMyAzNDAgMTVUMjU2IC00UTIwOSAtNCAxNzYgMTBUMTIzIDQ5VDkzIDExMFQ4MyAxODZRODMgMjM5IDk0IDI5N1QxMzQgNDAzVDIwOCA0ODJUMzI2IDUxNFEzNzYgNTE0IDQxMCA0OThUNDY2IDQzNkg0NzBMNDg0IDUwMkg1NThMNDgyIC00M1pNNDQ3IDMyNVE0NTYgMzg2IDQyNSA0MTZUMzM2IDQ0NlEyODYgNDQ2IDI1NSA0MjNUMjA1IDM2M1QxODAgMjgzVDE3MyAxOTZRMTczIDE2OCAxNzggMTQ0VDE5NiAxMDJUMjMwIDc0VDI4MyA2M1EzMTYgNjMgMzQxIDc0VDM4NSAxMDVUNDE1IDE1MVQ0MzEgMjA4TDQ0NyAzMjVaTTQ3NiA1NjNMMzY5IDY0MkwyMzkgNTYzTDIwOSA2MTNMMzc3IDcxMUw1MjEgNjEzTDQ3NiA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBob3Jpei1hZHYteD0iNjk4IiBkPSJNMzc4IDYwUTQ2NiA2MCA1MTcgMTA3VDU4MiAyMzVMNTg5IDI3N0g0MTFMNDIyIDM1Mkg2ODJMNjcyIDI3OFE2NTIgMTM1IDU3NSA2M1QzNjQgLTEwUTI5OCAtMTAgMjUwIDEwVDE2OSA2NlQxMjIgMTUxVDEwNiAyNjFRMTA2IDMzOCAxMjkgNDEzVDE5NyA1NDdUMzA5IDY0MlQ0NjUgNjc4UTU0MCA2NzggNTkwIDY1MlQ2NzYgNTkxTDYxMyA1MzBRNTc1IDU2OCA1MzcgNTg0VDQ1NyA2MDFRMzg2IDYwMSAzMzggNTcxVDI1OCA0OTFUMjE0IDM4MVQyMDAgMjU5UTIwMCAyMTggMjA5IDE4MlQyMzggMTE4VDI5MyA3NlQzNzggNjBaTTYzMSA4MzRRNjIzIDc5OSA2MDUgNzc2VDU2NSA3MzhUNTE3IDcxOFQ0NjcgNzEyUTQ0MyA3MTIgNDIwIDcxOFQzNzggNzM4VDM0OSA3NzVUMzM5IDgzNEgzOTlRMzk4IDgwMyA0MTUgNzgyVDQ3NCA3NjFRNTE0IDc2MSA1MzggNzgyVDU3MCA4MzRINjMxSDYzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRjsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00ODIgLTQzUTQ3MyAtMTA1IDQ1MyAtMTQxVDQwNSAtMTk2VDM0MyAtMjIwVDI3MyAtMjI2UTE0OCAtMjI2IDYxIC0xNzVMOTcgLTEwN1ExMzcgLTEzMiAxNzcgLTE0NVQyNjggLTE1OFEyOTggLTE1OCAzMTkgLTE1NFQzNTYgLTEzN1QzNzkgLTEwNVQzOTMgLTUyTDQxMiA3OUg0MDhRMzc2IDMzIDM0MCAxNVQyNTYgLTRRMjA5IC00IDE3NiAxMFQxMjMgNDlUOTMgMTEwVDgzIDE4NlE4MyAyMzkgOTQgMjk3VDEzNCA0MDNUMjA4IDQ4MlQzMjYgNTE0UTM3NiA1MTQgNDEwIDQ5OFQ0NjYgNDM2SDQ3MEw0ODQgNTAySDU1OEw0ODIgLTQzWk00NDcgMzI1UTQ1NiAzODYgNDI1IDQxNlQzMzYgNDQ2UTI4NiA0NDYgMjU1IDQyM1QyMDUgMzYzVDE4MCAyODNUMTczIDE5NlExNzMgMTY4IDE3OCAxNDRUMTk2IDEwMlQyMzAgNzRUMjgzIDYzUTMxNiA2MyAzNDEgNzRUMzg1IDEwNVQ0MTUgMTUxVDQzMSAyMDhMNDQ3IDMyNVpNNTI4IDY4N1E1MjAgNjUyIDUwMiA2MjlUNDYyIDU5MVQ0MTQgNTcxVDM2NCA1NjVRMzQwIDU2NSAzMTcgNTcxVDI3NSA1OTFUMjQ2IDYyOFQyMzYgNjg3SDI5NlEyOTUgNjU2IDMxMiA2MzVUMzcxIDYxNFE0MTEgNjE0IDQzNSA2MzVUNDY3IDY4N0g1MjhINTI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIwOyIgaG9yaXotYWR2LXg9IjY5OCIgZD0iTTM3OCA2MFE0NjYgNjAgNTE3IDEwN1Q1ODIgMjM1TDU4OSAyNzdINDExTDQyMiAzNTJINjgyTDY3MiAyNzhRNjUyIDEzNSA1NzUgNjNUMzY0IC0xMFEyOTggLTEwIDI1MCAxMFQxNjkgNjZUMTIyIDE1MVQxMDYgMjYxUTEwNiAzMzggMTI5IDQxM1QxOTcgNTQ3VDMwOSA2NDJUNDY1IDY3OFE1NDAgNjc4IDU5MCA2NTJUNjc2IDU5MUw2MTMgNTMwUTU3NSA1NjggNTM3IDU4NFQ0NTcgNjAxUTM4NiA2MDEgMzM4IDU3MVQyNTggNDkxVDIxNCAzODFUMjAwIDI1OVEyMDAgMjE4IDIwOSAxODJUMjM4IDExOFQyOTMgNzZUMzc4IDYwWk01MzMgNzc4UTUzMyA3NTEgNTE1IDczNlQ0NzAgNzIxUTQ1MCA3MjEgNDM2IDczMVQ0MjIgNzYzUTQyMiA3ODkgNDQwIDgwNFQ0ODQgODIwUTUwNCA4MjAgNTE4IDgxMFQ1MzMgNzc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIxOyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQ4MiAtNDNRNDczIC0xMDUgNDUzIC0xNDFUNDA1IC0xOTZUMzQzIC0yMjBUMjczIC0yMjZRMTQ4IC0yMjYgNjEgLTE3NUw5NyAtMTA3UTEzNyAtMTMyIDE3NyAtMTQ1VDI2OCAtMTU4UTI5OCAtMTU4IDMxOSAtMTU0VDM1NiAtMTM3VDM3OSAtMTA1VDM5MyAtNTJMNDEyIDc5SDQwOFEzNzYgMzMgMzQwIDE1VDI1NiAtNFEyMDkgLTQgMTc2IDEwVDEyMyA0OVQ5MyAxMTBUODMgMTg2UTgzIDIzOSA5NCAyOTdUMTM0IDQwM1QyMDggNDgyVDMyNiA1MTRRMzc2IDUxNCA0MTAgNDk4VDQ2NiA0MzZINDcwTDQ4NCA1MDJINTU4TDQ4MiAtNDNaTTQ0NyAzMjVRNDU2IDM4NiA0MjUgNDE2VDMzNiA0NDZRMjg2IDQ0NiAyNTUgNDIzVDIwNSAzNjNUMTgwIDI4M1QxNzMgMTk2UTE3MyAxNjggMTc4IDE0NFQxOTYgMTAyVDIzMCA3NFQyODMgNjNRMzE2IDYzIDM0MSA3NFQzODUgMTA1VDQxNSAxNTFUNDMxIDIwOEw0NDcgMzI1Wk00MjUgNjM3UTQyNSA2MTAgNDA3IDU5NVQzNjIgNTgwUTM0MiA1ODAgMzI4IDU5MFQzMTQgNjIyUTMxNCA2NDggMzMyIDY2M1QzNzYgNjc5UTM5NiA2NzkgNDEwIDY2OVQ0MjUgNjM3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIyOyIgaG9yaXotYWR2LXg9IjY5OCIgZD0iTTM3OCA2MFE0NjYgNjAgNTE3IDEwN1Q1ODIgMjM1TDU4OSAyNzdINDExTDQyMiAzNTJINjgyTDY3MiAyNzhRNjUyIDEzNSA1NzUgNjNUMzY0IC0xMFEyOTggLTEwIDI1MCAxMFQxNjkgNjZUMTIyIDE1MVQxMDYgMjYxUTEwNiAzMzggMTI5IDQxM1QxOTcgNTQ3VDMwOSA2NDJUNDY1IDY3OFE1NDAgNjc4IDU5MCA2NTJUNjc2IDU5MUw2MTMgNTMwUTU3NSA1NjggNTM3IDU4NFQ0NTcgNjAxUTM4NiA2MDEgMzM4IDU3MVQyNTggNDkxVDIxNCAzODFUMjAwIDI1OVEyMDAgMjE4IDIwOSAxODJUMjM4IDExOFQyOTMgNzZUMzc4IDYwWk0zMzEgLTIxM0gyNzFMMzE5IC01OUg0MTZMMzMxIC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjM7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNNDgyIC00M1E0NzMgLTEwNSA0NTMgLTE0MVQ0MDUgLTE5NlQzNDMgLTIyMFQyNzMgLTIyNlExNDggLTIyNiA2MSAtMTc1TDk3IC0xMDdRMTM3IC0xMzIgMTc3IC0xNDVUMjY4IC0xNThRMjk4IC0xNTggMzE5IC0xNTRUMzU2IC0xMzdUMzc5IC0xMDVUMzkzIC01Mkw0MTIgNzlINDA4UTM3NiAzMyAzNDAgMTVUMjU2IC00UTIwOSAtNCAxNzYgMTBUMTIzIDQ5VDkzIDExMFQ4MyAxODZRODMgMjM5IDk0IDI5N1QxMzQgNDAzVDIwOCA0ODJUMzI2IDUxNFEzNzYgNTE0IDQxMCA0OThUNDY2IDQzNkg0NzBMNDg0IDUwMkg1NThMNDgyIC00M1pNNDQ3IDMyNVE0NTYgMzg2IDQyNSA0MTZUMzM2IDQ0NlEyODYgNDQ2IDI1NSA0MjNUMjA1IDM2M1QxODAgMjgzVDE3MyAxOTZRMTczIDE2OCAxNzggMTQ0VDE5NiAxMDJUMjMwIDc0VDI4MyA2M1EzMTYgNjMgMzQxIDc0VDM4NSAxMDVUNDE1IDE1MVQ0MzEgMjA4TDQ0NyAzMjVaTTQwNCA3MTVINDYwTDQxMyA1NzJIMzEyTDQwNCA3MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjQ7IiBob3Jpei1hZHYteD0iNjYyIiBkPSJNNDg1IDBMNTI5IDMxNEgyMjFMMTc3IDBIODZMMTc5IDY2N0gyNzBMMjMzIDM5OUg1NDFMNTc4IDY2N0g2NjlMNTc2IDBINDg1Wk01NTUgNzAzTDQ0OCA3ODJMMzE4IDcwM0wyODggNzUzTDQ1NiA4NTFMNjAwIDc1M0w1NTUgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI1OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwTDQ0MiAyOTRRNDQ0IDMxMSA0NDYgMzI3VDQ0OCAzNTZRNDQ4IDM5NSA0MjkgNDE3VDM1NCA0NDBRMjkxIDQ0MCAyNTMgNDA4VDIwNyAzMTVMMTYzIDBINzZMMTc0IDcwMEgyNjFMMjI0IDQ0MEgyMjhRMjU1IDQ3OCAyOTUgNDk2VDM4OCA1MTRRNDcyIDUxNCA1MDQgNDc5VDUzNiAzNzhRNTM2IDM2MyA1MzUgMzQ3VDUzMSAzMTNMNDg4IDBINDAxWk0zMzggNzAxTDIzMSA3ODBMMTAxIDcwMUw3MSA3NTFMMjM5IDg0OUwzODMgNzUxTDMzOCA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjY7IiBob3Jpei1hZHYteD0iNjYyIiBkPSJNNDg1IDBMNTI5IDMxNEgyMjFMMTc3IDBIODZMMTU1IDQ5M0g2OUw3OCA1NjJIMTY0TDE3OSA2NjdIMjcwTDI1NSA1NjJINTYzTDU3OCA2NjdINjY5TDY1NCA1NjJINzQwTDczMSA0OTNINjQ1TDU3NiAwSDQ4NVpNNTM5IDM4OUw1NTQgNDkzSDI0NkwyMzEgMzg5SDUzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNzsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik0yNDMgNTcwTDIyMyA0MzBIMjI3UTI1MyA0NjggMjkzIDQ4NlQzODYgNTA0UTQ3MCA1MDQgNTAyIDQ2NlQ1MzUgMzYyUTUzNSAzNDggNTM0IDMzMlQ1MzAgMjk5TDQ4OCAwSDQwMEw0MzkgMjgzUTQ0MSAzMDAgNDQzIDMxN1Q0NDUgMzQ4UTQ0NSAzODYgNDI3IDQwN1QzNTMgNDI5UTI5MCA0MjkgMjUyIDM5N1QyMDUgMzA1TDE2MyAwSDc2TDE1NiA1NzBIODlMOTcgNjI3SDE2NEwxNzQgNzAwSDI2MUwyNTEgNjI3SDQyM0w0MTUgNTcwSDI0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyODsiIGhvcml6LWFkdi14PSIyNjMiIGQ9Ik04NiAwTDE3OSA2NjdIMjcwTDE3NyAwSDg2Wk00MDYgNzgxUTM5MCA3NDUgMzYyIDcyOFQzMDQgNzEwUTI4NiA3MTAgMjY5IDcxNlQyMzQgNzI5VDIwMiA3NDNUMTcyIDc1MFExNTUgNzUwIDE0MCA3NDJUMTEwIDcwOUw3MSA3NDNROTUgNzg0IDEyMCA3OTlUMTc0IDgxNFExOTIgODE0IDIwOSA4MDhUMjQ0IDc5NFQyNzcgNzgwVDMwNyA3NzRRMzI0IDc3NCAzMzkgNzgyVDM2NSA4MTRMNDA2IDc4MUg0MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjk7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMEwxNDYgNTAySDIzM0wxNjMgMEg3NlpNMzc2IDY0MVEzNjAgNjA1IDMzMiA1ODhUMjc0IDU3MFEyNTYgNTcwIDIzOSA1NzZUMjA0IDU4OVQxNzIgNjAzVDE0MiA2MTBRMTI1IDYxMCAxMTAgNjAyVDgwIDU2OUw0MSA2MDNRNjUgNjQ0IDkwIDY1OVQxNDQgNjc0UTE2MiA2NzQgMTc5IDY2OFQyMTQgNjU0VDI0NyA2NDBUMjc3IDYzNFEyOTQgNjM0IDMwOSA2NDJUMzM1IDY3NEwzNzYgNjQxSDM3NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQTsiIGhvcml6LWFkdi14PSIyNjMiIGQ9Ik04NiAwTDE3OSA2NjdIMjcwTDE3NyAwSDg2Wk04NSA3MjlMOTMgNzg2SDM5MUwzODMgNzI5SDg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJCOyIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTc2IDBMMTQ2IDUwMkgyMzNMMTYzIDBINzZaTTUyIDU4OUw2MCA2NDZIMzU4TDM1MCA1ODlINTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkM7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNODYgMEwxNzkgNjY3SDI3MEwxNzcgMEg4NlpNMzk0IDgyN1EzODYgNzkyIDM2OCA3NjlUMzI4IDczMVQyODAgNzExVDIzMCA3MDVRMjA2IDcwNSAxODMgNzExVDE0MSA3MzFUMTEyIDc2OFQxMDIgODI3SDE2MlExNjEgNzk2IDE3OCA3NzVUMjM3IDc1NFEyNzcgNzU0IDMwMSA3NzVUMzMzIDgyN0gzOTRIMzk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJEOyIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTc2IDBMMTQ2IDUwMkgyMzNMMTYzIDBINzZaTTM2MyA2ODdRMzU1IDY1MiAzMzcgNjI5VDI5NyA1OTFUMjQ5IDU3MVQxOTkgNTY1UTE3NSA1NjUgMTUyIDU3MVQxMTAgNTkxVDgxIDYyOFQ3MSA2ODdIMTMxUTEzMCA2NTYgMTQ3IDYzNVQyMDYgNjE0UTI0NiA2MTQgMjcwIDYzNVQzMDIgNjg3SDM2M0gzNjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkU7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNMTU0IDBRMTM3IC0xMCAxMTcgLTIzVDgxIC01MlQ1MyAtODlUNDIgLTEzMVE0MiAtMTU1IDU3IC0xNjlUOTYgLTE4M1ExMjYgLTE4MyAxNTUgLTE2N0wxNjUgLTIxN1ExNDcgLTIyNiAxMjAgLTIzMlQ3MyAtMjM4UTMxIC0yMzggNSAtMjE4VC0yMiAtMTUzUS0yMiAtMTI0IC0xMSAtMTAxVDE3IC01OVQ1OCAtMjZUMTA1IDBIODZMMTc5IDY2N0gyNzBMMTc3IDBIMTU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJGOyIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTE0NSAwUTEyOCAtMTAgMTA4IC0yM1Q3MiAtNTJUNDQgLTg5VDMzIC0xMzFRMzMgLTE1NSA0OCAtMTY5VDg3IC0xODNRMTAzIC0xODMgMTE3IC0xNzlUMTQ2IC0xNjdMMTU2IC0yMTdRMTM3IC0yMjYgMTEyIC0yMzJUNjYgLTIzOFEyNCAtMjM4IC0zIC0yMThULTMxIC0xNTJRLTMxIC0xMjQgLTIwIC0xMDFUOCAtNTlUNDggLTI2VDk0IDBINzZMMTQ2IDUwMkgyMzNMMTYzIDBIMTQ1Wk0yNjIgNjM2UTI2MiA2MDkgMjQ0IDU5M1QyMDAgNTc3UTE4MCA1NzcgMTY2IDU4N1QxNTEgNjE5UTE1MSA2NDUgMTcwIDY2MFQyMTQgNjc2UTIzNCA2NzYgMjQ4IDY2N1QyNjIgNjM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMwOyIgaG9yaXotYWR2LXg9IjI2MyIgZD0iTTg2IDBMMTc5IDY2N0gyNzBMMTc3IDBIODZaTTI5NiA3NzhRMjk2IDc1MSAyNzggNzM2VDIzMyA3MjFRMjEzIDcyMSAxOTkgNzMxVDE4NSA3NjNRMTg1IDc4OSAyMDMgODA0VDI0NyA4MjBRMjY3IDgyMCAyODEgODEwVDI5NiA3NzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzE7IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNNzYgMEwxNDYgNTAySDIzM0wxNjMgMEg3NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMjsiIGhvcml6LWFkdi14PSI2NDciIGQ9Ik04NiAwTDE3OSA2NjdIMjcwTDE3NyAwSDg2Wk01ODUgMTc3UTU3MiA4NiA1MjYgMzdUMzg4IC0xMlEzNDUgLTEyIDMxMSAtMVQyNDQgMzhMMjkzIDEwOFEzMTggODQgMzQwIDc1VDM5MCA2NlE0MzcgNjYgNDYxIDkxVDQ5MyAxNzBMNTYzIDY2N0g2NTRMNTg1IDE3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMzsiIGhvcml6LWFkdi14PSI0NjkiIGQ9Ik03NyAwTDE0NyA1MDJIMjM0TDE2NCAwSDc3Wk0yNjMgNjM2UTI2MyA2MDkgMjQ1IDU5M1QyMDEgNTc3UTE4MSA1NzcgMTY3IDU4N1QxNTIgNjE5UTE1MiA2NDUgMTcxIDY2MFQyMTUgNjc2UTIzNSA2NzYgMjQ5IDY2N1QyNjMgNjM2Wk00OTEgNjM1UTQ5MSA2MDggNDczIDU5M1Q0MjkgNTc3UTQxMCA1NzcgMzk2IDU4OFQzODEgNjE5UTM4MSA2NDUgMzk5IDY2MFQ0NDMgNjc2UTQ2MyA2NzYgNDc3IDY2N1Q0OTEgNjM1Wk0zODcgLTM5UTM3NSAtMTI2IDMzMCAtMTc2VDE5MiAtMjI2UTE3NSAtMjI2IDE1OSAtMjI1VDEyNSAtMjIyTDEzNiAtMTQ4UTE2MyAtMTUxIDE5MCAtMTUxUTIyMSAtMTUxIDI0MSAtMTQzVDI3MyAtMTE5VDI5MSAtODFUMzAxIC0zMUwzNzYgNTAySDQ2M0wzODcgLTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgaG9yaXotYWR2LXg9IjQ0OCIgZD0iTTM4NiAxNzdRMzczIDg2IDMyNyAzN1QxODkgLTEyUTE0NiAtMTIgMTEyIC0xVDQ1IDM4TDk0IDEwOFExMTkgODQgMTQxIDc1VDE5MSA2NlEyMzggNjYgMjYyIDkxVDI5NCAxNzBMMzY0IDY2N0g0NTVMMzg2IDE3N0gzODZaTTUzMyA3MDNMNDI2IDc4MkwyOTYgNzAzTDI2NiA3NTNMNDM0IDg1MUw1NzggNzUzTDUzMyA3MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzU7IiBob3Jpei1hZHYteD0iMjQ1IiBkPSJNMTYzIC0zOVExNTAgLTEyOSAxMDUgLTE3N1QtMzIgLTIyNlEtNDkgLTIyNiAtNjUgLTIyNVQtOTkgLTIyMkwtODggLTE0OFEtNjAgLTE1MSAtMzQgLTE1MVEtMyAtMTUxIDE2IC0xNDNUNDggLTEyMFQ2NiAtODNUNzcgLTMxTDE1MiA1MDJIMjM5TDE2MyAtMzlaTTMyNCA1NjNMMjE3IDY0Mkw4NyA1NjNMNTcgNjEzTDIyNSA3MTFMMzY5IDYxM0wzMjQgNTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM2OyIgaG9yaXotYWR2LXg9IjU3OSIgZD0iTTQ0OCAwTDI5MSAzMjFMMjExIDI0MkwxNzcgMEg4NkwxNzkgNjY3SDI3MEwyMjYgMzUySDIzMEw1MjEgNjY3SDYzNUwzNjcgMzg0TDU2MSAwSDQ0OFpNMjU2IC0yMTNIMTk2TDI0NCAtNTlIMzQxTDI1NiAtMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM3OyIgaG9yaXotYWR2LXg9IjUwNCIgZD0iTTM4MCAwTDI3MCAyNDdMMTg1IDE2MkwxNjMgMEg3NkwxNzQgNzAwSDI2MUwxOTkgMjYzSDIwM0w0MzAgNTAySDU0MEwzNDEgMzA0TDQ4NSAwSDM4MFpNMjI0IC0yMTNIMTY0TDIxMiAtNTlIMzA5TDIyNCAtMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM5OyIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTg2IDBMMTc5IDY2N0gyNzBMMTg3IDc4SDQ2OEw0NTggMEg4NlpNMjMxIDcwNUwxODYgNzM2TDM0MCA4NTdMNDIwIDgxNUwyMzEgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNBOyIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTI0NCAwUTIzMiAtMiAyMTQgLTNUMTc2IC01UTEzMCAtNSAxMDkgMTFUODcgNjdRODcgNzQgODcgODFUODkgOTdMMTc0IDcwMEgyNjFMMTc5IDExOVExNzQgODMgMTg0IDc2VDIyMiA2OUgyNTNMMjQ0IDBIMjQ0Wk0yMjcgNzMzTDE4MiA3NjRMMzM2IDg4NUw0MTYgODQzTDIyNyA3MzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0I7IiBob3Jpei1hZHYteD0iNDk4IiBkPSJNODYgMEwxNzkgNjY3SDI3MEwxODcgNzhINDY4TDQ1OCAwSDg2Wk0yMjQgLTIxM0gxNjRMMjEyIC01OUgzMDlMMjI0IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0M7IiBob3Jpei1hZHYteD0iMjcyIiBkPSJNMjQ0IDBRMjMyIC0yIDIxNCAtM1QxNzYgLTVRMTMwIC01IDEwOSAxMVQ4NyA2N1E4NyA3NCA4NyA4MVQ4OSA5N0wxNzQgNzAwSDI2MUwxNzkgMTE5UTE3NCA4MyAxODQgNzZUMjIyIDY5SDI1M0wyNDQgMEgyNDRaTTEyMiAtMjEzSDYyTDExMCAtNTlIMjA3TDEyMiAtMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNEOyIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTg2IDBMMTc5IDY2N0gyNzBMMTg3IDc4SDQ2OEw0NTggMEg4NlpNNDgxIDUzNUg0MjJMNDc4IDcwMEg1NzFMNDgxIDUzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRTsiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0yNDQgMFEyMzIgLTIgMjE0IC0zVDE3NiAtNVExMzAgLTUgMTA5IDExVDg3IDY3UTg3IDc0IDg3IDgxVDg5IDk3TDE3NCA3MDBIMjYxTDE3OSAxMTlRMTc0IDgzIDE4NCA3NlQyMjIgNjlIMjUzTDI0NCAwWk0zNTEgNTM1SDI5MkwzNDggNzAwSDQ0MUwzNTEgNTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNGOyIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTg2IDBMMTc5IDY2N0gyNzBMMTg3IDc4SDQ2OEw0NTggMEg4NlpNNTA0IDI4OVE1MDQgMjU5IDQ4MyAyNDFUNDMyIDIyM1E0MDkgMjIzIDM5MyAyMzVUMzc2IDI3MVEzNzYgMzAxIDM5NyAzMThUNDQ4IDMzNVE0NzAgMzM1IDQ4NyAzMjRUNTA0IDI4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MDsiIGhvcml6LWFkdi14PSIzNTUiIGQ9Ik0yNDQgMFEyMzIgLTIgMjE0IC0zVDE3NiAtNVExMzAgLTUgMTA5IDExVDg3IDY3UTg3IDc0IDg3IDgxVDg5IDk3TDE3NCA3MDBIMjYxTDE3OSAxMTlRMTc0IDgzIDE4NCA3NlQyMjIgNjlIMjUzTDI0NCAwWk00MDQgMjQ3UTQwNCAyMTcgMzgzIDE5OVQzMzIgMTgxUTMwOSAxODEgMjkzIDE5M1QyNzYgMjI5UTI3NiAyNTkgMjk3IDI3NlQzNDggMjkzUTM3MCAyOTMgMzg3IDI4MlQ0MDQgMjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQxOyIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTg2IDBMMTI4IDMwM0w3NCAyNzNMODUgMzUwTDEzOSAzODBMMTc5IDY2N0gyNzBMMjM3IDQzNEwzODYgNTE2TDM3NSA0MzdMMjI2IDM1NUwxODcgNzhINDY4TDQ1OCAwSDg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQyOyIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTIxNCAzNjVMMTc5IDExOVExNzYgMTAxIDE3NyA5MVQxODQgNzZUMTk5IDcwVDIyMyA2OUgyNTRMMjQ0IC0xUTIzMiAtMyAyMTYgLTRUMTc3IC02UTEzMCAtNiAxMDkgOVQ4NyA2NlE4NyA3MyA4NyA4MVQ4OSA5N0wxMjAgMzE1TDY5IDI4NUw4MCAzNjhMMTMyIDM5OUwxNzQgNzAwSDI2MUwyMjUgNDQ2TDMzNCA1MDZMMzIyIDQyNUwyMTQgMzY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUzMCAwTDI1MSA1MjBIMjQ3TDE3NCAwSDg2TDE3OSA2NjdIMjY5TDU0NCAxNTRINTQ4TDYyMCA2NjdINzA4TDYxNSAwSDUzMFpNNDUwIDcwNUw0MDUgNzM2TDU1OSA4NTdMNjM5IDgxNUw0NTAgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwTDQ0MiAyOTRRNDQ0IDMxMCA0NDUgMzI0VDQ0NyAzNTJRNDQ3IDM3MiA0NDMgMzg4VDQyOCA0MTZUMzk5IDQzNFQzNTMgNDQwUTI5MCA0NDAgMjUzIDQwOFQyMDcgMzE1TDE2MyAwSDc2TDE0NiA1MDJIMjE5VjQzOUgyMjNRMjgyIDUxNCAzODYgNTE0UTQyOSA1MTQgNDU4IDUwNVQ1MDQgNDc4VDUyOSA0MzVUNTM3IDM3NlE1MzcgMzYyIDUzNiAzNDdUNTMyIDMxNEw0ODggMEg0MDFaTTM1NiA1NjVMMzExIDU5Nkw0NjUgNzE3TDU0NSA2NzVMMzU2IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NTsiIGhvcml6LWFkdi14PSI3MDEiIGQ9Ik01MzAgMEwyNTEgNTIwSDI0N0wxNzQgMEg4NkwxNzkgNjY3SDI2OUw1NDQgMTU0SDU0OEw2MjAgNjY3SDcwOEw2MTUgMEg1MzBaTTMwMyAtMjEzSDI0M0wyOTEgLTU5SDM4OEwzMDMgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NjsiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik00MDEgMEw0NDIgMjk0UTQ0NCAzMTAgNDQ1IDMyNFQ0NDcgMzUyUTQ0NyAzNzIgNDQzIDM4OFQ0MjggNDE2VDM5OSA0MzRUMzUzIDQ0MFEyOTAgNDQwIDI1MyA0MDhUMjA3IDMxNUwxNjMgMEg3NkwxNDYgNTAySDIxOVY0MzlIMjIzUTI4MiA1MTQgMzg2IDUxNFE0MjkgNTE0IDQ1OCA1MDVUNTA0IDQ3OFQ1MjkgNDM1VDUzNyAzNzZRNTM3IDM2MiA1MzYgMzQ3VDUzMiAzMTRMNDg4IDBINDAxWk0yNDYgLTIxM0gxODZMMjM0IC01OUgzMzFMMjQ2IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDc7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNTMwIDBMMjUxIDUyMEgyNDdMMTc0IDBIODZMMTc5IDY2N0gyNjlMNTQ0IDE1NEg1NDhMNjIwIDY2N0g3MDhMNjE1IDBINTMwWk02MjAgODAzTDQ2MiA3MDVMMzMyIDgwM0wzNzMgODUxTDQ3MSA3NzVMNTkwIDg1MUw2MjAgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ4OyIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTQwMSAwTDQ0MiAyOTRRNDQ0IDMxMCA0NDUgMzI0VDQ0NyAzNTJRNDQ3IDM3MiA0NDMgMzg4VDQyOCA0MTZUMzk5IDQzNFQzNTMgNDQwUTI5MCA0NDAgMjUzIDQwOFQyMDcgMzE1TDE2MyAwSDc2TDE0NiA1MDJIMjE5VjQzOUgyMjNRMjgyIDUxNCAzODYgNTE0UTQyOSA1MTQgNDU4IDUwNVQ1MDQgNDc4VDUyOSA0MzVUNTM3IDM3NlE1MzcgMzYyIDUzNiAzNDdUNTMyIDMxNEw0ODggMEg0MDFaTTUyOCA2NjNMMzcwIDU2NUwyNDAgNjYzTDI4MSA3MTFMMzc5IDYzNUw0OTggNzExTDUyOCA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEE7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNNDA5IC0xNThINDIzUTQ2NyAtMTU4IDQ5MCAtMTI5VDUxOCAtNjJMNTI3IDVMMjUwIDUyNUgyNDZMMTc1IDBIODZMMTc5IDY2N0gyNjlMNTQ0IDE0OEg1NDhMNjE5IDY2N0g3MDhMNjA2IC02MFE1OTUgLTE0MyA1NTEgLTE5MVQ0MjIgLTIzOUgzOThMNDA5IC0xNThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEI7IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNMjE5IDUwMlY0MzlIMjIzUTI4MiA1MTQgMzg2IDUxNFE0MjkgNTE0IDQ1OCA1MDVUNTA0IDQ3OFQ1MjkgNDM1VDUzNyAzNzZRNTM3IDM2MiA1MzYgMzQ3VDUzMiAzMTRMNDg0IC0yM1E0NzEgLTExNSA0MjUgLTE2NFQyODYgLTIxNEgyNjJMMjc0IC0xMzVIMjg4UTMxNSAtMTM1IDMzNCAtMTI3VDM2NiAtMTA0VDM4NiAtNjlUMzk3IC0yNUw0NDIgMjk0UTQ0NCAzMTAgNDQ1IDMyNFQ0NDcgMzUyUTQ0NyAzNzIgNDQzIDM4OFQ0MjggNDE2VDM5OSA0MzRUMzUzIDQ0MFEyOTAgNDQwIDI1MyA0MDhUMjA3IDMxNUwxNjMgMEg3NkwxNDYgNTAySDIxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QzsiIGhvcml6LWFkdi14PSI3NDYiIGQ9Ik03MzMgNDExUTczMyAzMjcgNzExIDI1MVQ2NDMgMTE2VDUzMCAyNFQzNzEgLTExUTI0MCAtMTEgMTczIDU5VDEwNSAyNThRMTA1IDM0MSAxMjggNDE3VDE5NiA1NTFUMzEwIDY0M1Q0NjggNjc4UTU5OCA2NzggNjY1IDYwOVQ3MzMgNDExWk0zODEgNjNRNDUzIDYzIDUwMiA5NFQ1ODEgMTc0VDYyNSAyODRUNjM4IDQwOFE2MzggNDk5IDU5NiA1NTFUNDU3IDYwNFEzODUgNjA0IDMzNiA1NzRUMjU3IDQ5NFQyMTQgMzg0VDIwMSAyNjFRMjAxIDIxNiAyMTEgMTgwVDI0MiAxMTdUMjk4IDc3VDM4MSA2M1pNMzMwIDcyOUwzMzggNzg2SDYzNkw2MjggNzI5SDMzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RDsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik04NCAxOTJRODQgMjU2IDEwMCAzMTRUMTUxIDQxNlQyMzYgNDg3VDM1OCA1MTRRNDU4IDUxNCA1MDkgNDYwVDU2MCAzMDdRNTYwIDI0NCA1NDMgMTg2VDQ5MSA4NVQ0MDUgMTVUMjg0IC0xMVExODUgLTExIDEzNSA0MlQ4NCAxOTJaTTM0OSA0NDVRMjk3IDQ0NSAyNjMgNDIyVDIwOSAzNjJUMTgxIDI4MVQxNzMgMTkzUTE3MyAxMzEgMjAwIDk0VDI5NCA1NlEzNDUgNTYgMzc5IDc5VDQzNCAxMzlUNDYyIDIyMFQ0NzEgMzA4UTQ3MSAzNzAgNDQ0IDQwN1QzNDkgNDQ1Wk0yMjEgNTg5TDIyOSA2NDZINTI3TDUxOSA1ODlIMjIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRFOyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTczMyA0MTFRNzMzIDMyNyA3MTEgMjUxVDY0MyAxMTZUNTMwIDI0VDM3MSAtMTFRMjQwIC0xMSAxNzMgNTlUMTA1IDI1OFExMDUgMzQxIDEyOCA0MTdUMTk2IDU1MVQzMTAgNjQzVDQ2OCA2NzhRNTk4IDY3OCA2NjUgNjA5VDczMyA0MTFaTTM4MSA2M1E0NTMgNjMgNTAyIDk0VDU4MSAxNzRUNjI1IDI4NFQ2MzggNDA4UTYzOCA0OTkgNTk2IDU1MVQ0NTcgNjA0UTM4NSA2MDQgMzM2IDU3NFQyNTcgNDk0VDIxNCAzODRUMjAxIDI2MVEyMDEgMjE2IDIxMSAxODBUMjQyIDExN1QyOTggNzdUMzgxIDYzWk02MzkgODM0UTYzMSA3OTkgNjEzIDc3NlQ1NzMgNzM4VDUyNSA3MThUNDc1IDcxMlE0NTEgNzEyIDQyOCA3MThUMzg2IDczOFQzNTcgNzc1VDM0NyA4MzRINDA3UTQwNiA4MDMgNDIzIDc4MlQ0ODIgNzYxUTUyMiA3NjEgNTQ2IDc4MlQ1NzggODM0SDYzOUg2MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEY7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNODQgMTkyUTg0IDI1NiAxMDAgMzE0VDE1MSA0MTZUMjM2IDQ4N1QzNTggNTE0UTQ1OCA1MTQgNTA5IDQ2MFQ1NjAgMzA3UTU2MCAyNDQgNTQzIDE4NlQ0OTEgODVUNDA1IDE1VDI4NCAtMTFRMTg1IC0xMSAxMzUgNDJUODQgMTkyWk0zNDkgNDQ1UTI5NyA0NDUgMjYzIDQyMlQyMDkgMzYyVDE4MSAyODFUMTczIDE5M1ExNzMgMTMxIDIwMCA5NFQyOTQgNTZRMzQ1IDU2IDM3OSA3OVQ0MzQgMTM5VDQ2MiAyMjBUNDcxIDMwOFE0NzEgMzcwIDQ0NCA0MDdUMzQ5IDQ0NVpNNTMwIDY4N1E1MjIgNjUyIDUwNCA2MjlUNDY0IDU5MVQ0MTYgNTcxVDM2NiA1NjVRMzQyIDU2NSAzMTkgNTcxVDI3NyA1OTFUMjQ4IDYyOFQyMzggNjg3SDI5OFEyOTcgNjU2IDMxNCA2MzVUMzczIDYxNFE0MTMgNjE0IDQzNyA2MzVUNDY5IDY4N0g1MzBINTMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUwOyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTczMyA0MTFRNzMzIDMyNyA3MTEgMjUxVDY0MyAxMTZUNTMwIDI0VDM3MSAtMTFRMjQwIC0xMSAxNzMgNTlUMTA1IDI1OFExMDUgMzQxIDEyOCA0MTdUMTk2IDU1MVQzMTAgNjQzVDQ2OCA2NzhRNTk4IDY3OCA2NjUgNjA5VDczMyA0MTFaTTM4MSA2M1E0NTMgNjMgNTAyIDk0VDU4MSAxNzRUNjI1IDI4NFQ2MzggNDA4UTYzOCA0OTkgNTk2IDU1MVQ0NTcgNjA0UTM4NSA2MDQgMzM2IDU3NFQyNTcgNDk0VDIxNCAzODRUMjAxIDI2MVEyMDEgMjE2IDIxMSAxODBUMjQyIDExN1QyOTggNzdUMzgxIDYzWk02MDEgNjk2TDU1OSA3MjNMNzE3IDg0NEw3OTIgODA2TDYwMSA2OTZaTTM3MSA2OTZMMzMwIDcyM0w0ODggODQ0TDU2MyA4MDZMMzcxIDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MTsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik04NCAxOTJRODQgMjU2IDEwMCAzMTRUMTUxIDQxNlQyMzYgNDg3VDM1OCA1MTRRNDU4IDUxNCA1MDkgNDYwVDU2MCAzMDdRNTYwIDI0NCA1NDMgMTg2VDQ5MSA4NVQ0MDUgMTVUMjg0IC0xMVExODUgLTExIDEzNSA0MlQ4NCAxOTJaTTM0OSA0NDVRMjk3IDQ0NSAyNjMgNDIyVDIwOSAzNjJUMTgxIDI4MVQxNzMgMTkzUTE3MyAxMzEgMjAwIDk0VDI5NCA1NlEzNDUgNTYgMzc5IDc5VDQzNCAxMzlUNDYyIDIyMFQ0NzEgMzA4UTQ3MSAzNzAgNDQ0IDQwN1QzNDkgNDQ1Wk01MDcgNTYyTDQ2NSA1ODlMNjIzIDcxMEw2OTggNjcyTDUwNyA1NjJaTTI3NyA1NjJMMjM2IDU4OUwzOTQgNzEwTDQ2OSA2NzJMMjc3IDU2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MjsiIGhvcml6LWFkdi14PSI4OTQiIGQ9Ik00NzIgMFE0NDkgLTUgNDE5IC04VDM2MiAtMTFRMjkzIC0xMSAyNDUgOFQxNjUgNjJUMTIwIDE0NVQxMDUgMjUyUTEwNSAzMjggMTI0IDQwNFQxODYgNTQxVDI5NSA2NDBUNDU5IDY3OFE0ODYgNjc4IDUxNCA2NzVUNTY1IDY2N0g5MzhMOTI3IDU5MEg2NDVMNjE3IDM5MUg4NzBMODU5IDMxM0g2MDZMNTczIDc2SDg2Nkw4NTYgMEg0NzJaTTM3NSA2M1E0MDYgNjMgNDM0IDY3VDQ4MyA3OUw1NTQgNTg3UTUzNSA1OTUgNTA5IDU5OVQ0NTEgNjA0UTM3OSA2MDQgMzMxIDU3M1QyNTQgNDkyVDIxMyAzODBUMjAwIDI1NVEyMDAgMjE1IDIwOCAxODBUMjM2IDExOVQyOTAgNzhUMzc1IDYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUzOyIgaG9yaXotYWR2LXg9IjkyNyIgZD0iTTkxNiAzMTRROTE2IDI5MSA5MTQgMjY5VDkwNyAyMjNINTUyUTU1MSAyMTUgNTUxIDIwNlQ1NTAgMTg5UTU1MCAxMjQgNTgzIDkxVDY4MiA1OFE3MjQgNTggNzYyIDcyVDgzNSAxMTBMODU3IDQ4UTgxNSAyMSA3NjggNVQ2NzAgLTExUTYwOSAtMTEgNTYzIDE0VDQ5MiA5OFE0NTYgNDEgNDA0IDE1VDI4NSAtMTFRMTg3IC0xMSAxMzUgNDBUODMgMTkwUTgzIDI1NCAxMDAgMzEyVDE1MSA0MTZUMjM3IDQ4N1QzNTkgNTE0UTQxOCA1MTQgNDY1IDQ4OVQ1MzMgNDA1UTU2OCA0NTYgNjE5IDQ4NVQ3MzQgNTE1UTc4MCA1MTUgODE0IDUwMFQ4NzEgNDU5VDkwNSAzOTVUOTE2IDMxNFpNODM1IDI4M1E4MzYgMjkwIDgzNiAyOThUODM3IDMxNVE4MzcgMzQzIDgzMSAzNjdUODEyIDQwOVQ3NzggNDM3VDcyNSA0NDhRNjg5IDQ0OCA2NjEgNDM1VDYxMiAzOTlUNTc4IDM0NlQ1NjAgMjgzSDgzNVpNMjk1IDU4UTM0NiA1OCAzODAgODFUNDM0IDE0MFQ0NjIgMjIxVDQ3MCAzMDlRNDcwIDM3MSA0NDMgNDA2VDM0OSA0NDJRMjk4IDQ0MiAyNjQgNDIwVDIxMCAzNjFUMTgxIDI4MVQxNzMgMTk0UTE3MyAxMzEgMjAxIDk1VDI5NSA1OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NDsiIGhvcml6LWFkdi14PSI2MDQiIGQ9Ik00NTkgMEw0MDUgMjQwUTQwMCAyNjIgMzg5IDI3MFQzNTQgMjc5SDIxNkwxNzcgMEg4NkwxNzkgNjY0UTIzMyA2NzAgMjc5IDY3MlQzODAgNjc1UTQyMyA2NzUgNDY0IDY2OFQ1MzcgNjQzVDU4OCA1OTVUNjA3IDUxN1E2MDcgNDgyIDU5OSA0NDlUNTc0IDM4OVQ1MzAgMzQwVDQ2NyAzMDdWMzAzUTQ3NyAyOTggNDgzIDI4NlQ0OTIgMjYxTDU1NSAwSDQ1OVpNMzYyIDM1MlE0MzQgMzUyIDQ3NCAzODhUNTE1IDUwMlE1MTUgNTMyIDUwNCA1NTFUNDc0IDU4MlQ0MjggNTk3VDM3MiA2MDJRMzQyIDYwMiAzMTYgNjAxVDI2MCA1OTVMMjI2IDM1MkgzNjJaTTM2OSA3MDdMMzI0IDczOEw0NzggODU5TDU1OCA4MTdMMzY5IDcwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGhvcml6LWFkdi14PSIzNjUiIGQ9Ik0zNzggNDM2UTMwNyA0MzYgMjYyIDQxMVQyMDcgMzE4TDE2MyAwSDc2TDE0NiA1MDJIMjE5VjQzOEgyMjNRMjUxIDQ3NyAyOTAgNDk1VDM4NSA1MTNINDExTDQwMCA0MzZIMzc4Wk0yNzUgNTY1TDIzMCA1OTZMMzg0IDcxN0w0NjQgNjc1TDI3NSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTY7IiBob3Jpei1hZHYteD0iNjA0IiBkPSJNNDU5IDBMNDA1IDI0MFE0MDAgMjYyIDM4OSAyNzBUMzU0IDI3OUgyMTZMMTc3IDBIODZMMTc5IDY2NFEyMzMgNjcwIDI3OSA2NzJUMzgwIDY3NVE0MjMgNjc1IDQ2NCA2NjhUNTM3IDY0M1Q1ODggNTk1VDYwNyA1MTdRNjA3IDQ4MiA1OTkgNDQ5VDU3NCAzODlUNTMwIDM0MFQ0NjcgMzA3VjMwM1E0NzcgMjk4IDQ4MyAyODZUNDkyIDI2MUw1NTUgMEg0NTlaTTM2MiAzNTJRNDM0IDM1MiA0NzQgMzg4VDUxNSA1MDJRNTE1IDUzMiA1MDQgNTUxVDQ3NCA1ODJUNDI4IDU5N1QzNzIgNjAyUTM0MiA2MDIgMzE2IDYwMVQyNjAgNTk1TDIyNiAzNTJIMzYyWk0yNjIgLTIxM0gyMDJMMjUwIC01OUgzNDdMMjYyIC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTc7IiBob3Jpei1hZHYteD0iMzY1IiBkPSJNMzc4IDQzNlEzMDcgNDM2IDI2MiA0MTFUMjA3IDMxOEwxNjMgMEg3NkwxNDYgNTAySDIxOVY0MzhIMjIzUTI1MSA0NzcgMjkwIDQ5NVQzODUgNTEzSDQxMUw0MDAgNDM2SDM3OFpNNzQgLTIxM0gxNEw2MiAtNTlIMTU5TDc0IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTg7IiBob3Jpei1hZHYteD0iNjA0IiBkPSJNNDU5IDBMNDA1IDI0MFE0MDAgMjYyIDM4OSAyNzBUMzU0IDI3OUgyMTZMMTc3IDBIODZMMTc5IDY2NFEyMzMgNjcwIDI3OSA2NzJUMzgwIDY3NVE0MjMgNjc1IDQ2NCA2NjhUNTM3IDY0M1Q1ODggNTk1VDYwNyA1MTdRNjA3IDQ4MiA1OTkgNDQ5VDU3NCAzODlUNTMwIDM0MFQ0NjcgMzA3VjMwM1E0NzcgMjk4IDQ4MyAyODZUNDkyIDI2MUw1NTUgMEg0NTlaTTM2MiAzNTJRNDM0IDM1MiA0NzQgMzg4VDUxNSA1MDJRNTE1IDUzMiA1MDQgNTUxVDQ3NCA1ODJUNDI4IDU5N1QzNzIgNjAyUTM0MiA2MDIgMzE2IDYwMVQyNjAgNTk1TDIyNiAzNTJIMzYyWk01NDYgODAzTDM4OCA3MDVMMjU4IDgwM0wyOTkgODUxTDM5NyA3NzVMNTE2IDg1MUw1NDYgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU5OyIgaG9yaXotYWR2LXg9IjM2NSIgZD0iTTM3OCA0MzZRMzA3IDQzNiAyNjIgNDExVDIwNyAzMThMMTYzIDBINzZMMTQ2IDUwMkgyMTlWNDM4SDIyM1EyNTEgNDc3IDI5MCA0OTVUMzg1IDUxM0g0MTFMNDAwIDQzNkgzNzhaTTQzNiA2NjNMMjc4IDU2NUwxNDggNjYzTDE4OSA3MTFMMjg3IDYzNUw0MDYgNzExTDQzNiA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUE7IiBob3Jpei1hZHYteD0iNTM5IiBkPSJNNTE2IDIwNVE1MTYgMTUwIDQ5NyAxMTBUNDQzIDQyVDM2NCAyVDI2NyAtMTFRMjAyIC0xMSAxNDkgNlQ0NCA2Mkw5NiAxMzBRMTM0IDk4IDE3NyA4MFQyNzEgNjJRMzAxIDYyIDMyOCA2OVQzNzcgOTJUNDEwIDEzMVQ0MjIgMTg4UTQyMiAyMjIgNDAwIDI0NFQzNDUgMjg1VDI3MyAzMTlUMjAxIDM1OFQxNDYgNDExVDEyNCA0ODlRMTI0IDU0MCAxNDMgNTc2VDE5NiA2MzRUMjcyIDY2N1QzNjEgNjc3UTQ2NiA2NzcgNTU0IDYxOEw1MTAgNTQ1UTQ3NiA1NzIgNDM3IDU4N1QzNTMgNjAzUTMyOSA2MDMgMzA1IDU5OFQyNjEgNTgyVDIyOSA1NTJUMjE3IDUwNVEyMTcgNDcyIDIzOSA0NTFUMjk0IDQxM1QzNjYgMzgxVDQzOCAzNDNUNDk0IDI4OFQ1MTYgMjA1Wk0zNTcgNzA3TDMxMiA3MzhMNDY2IDg1OUw1NDYgODE3TDM1NyA3MDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUI7IiBob3Jpei1hZHYteD0iNDUwIiBkPSJNNDI5IDE1N1E0MjkgMTEyIDQxMyA4MVQzNzAgMjlUMzA3IC0xVDIzMCAtMTFRMTc5IC0xMSAxMzEgMVQ0MCA0Mkw4MSAxMDZRMTEzIDgzIDE1MyA2OVQyMzQgNTVRMjU1IDU1IDI3NCA1OVQzMTAgNzNUMzM1IDk5VDM0NSAxMzhRMzQ1IDE2NCAzMjcgMTgwVDI4MiAyMDdUMjIzIDIyOVQxNjQgMjU1VDExOCAyOTVUMTAwIDM2MFExMDAgNDAxIDExNiA0MzBUMTYwIDQ3OFQyMjMgNTA1VDI5NyA1MTRRMzM5IDUxNCAzODAgNTA1VDQ1OCA0NzVMNDI0IDQwOVEzOTcgNDI3IDM2MiA0MzZUMjk1IDQ0NlEyNzcgNDQ2IDI1NyA0NDNUMjIxIDQzM1QxOTQgNDExVDE4MyAzNzRRMTgzIDM1MSAyMDEgMzM3VDI0NiAzMTFUMzA2IDI4OVQzNjUgMjYyVDQxMSAyMjFUNDI5IDE1N1pNMjg5IDU2NUwyNDQgNTk2TDM5OCA3MTdMNDc4IDY3NUwyODkgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVDOyIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTUxNiAyMDVRNTE2IDE1MCA0OTcgMTEwVDQ0MyA0MlQzNjQgMlQyNjcgLTExUTIwMiAtMTEgMTQ5IDZUNDQgNjJMOTYgMTMwUTEzNCA5OCAxNzcgODBUMjcxIDYyUTMwMSA2MiAzMjggNjlUMzc3IDkyVDQxMCAxMzFUNDIyIDE4OFE0MjIgMjIyIDQwMCAyNDRUMzQ1IDI4NVQyNzMgMzE5VDIwMSAzNThUMTQ2IDQxMVQxMjQgNDg5UTEyNCA1NDAgMTQzIDU3NlQxOTYgNjM0VDI3MiA2NjdUMzYxIDY3N1E0NjYgNjc3IDU1NCA2MThMNTEwIDU0NVE0NzYgNTcyIDQzNyA1ODdUMzUzIDYwM1EzMjkgNjAzIDMwNSA1OThUMjYxIDU4MlQyMjkgNTUyVDIxNyA1MDVRMjE3IDQ3MiAyMzkgNDUxVDI5NCA0MTNUMzY2IDM4MVQ0MzggMzQzVDQ5NCAyODhUNTE2IDIwNVpNNDg4IDcwM0wzODEgNzgyTDI1MSA3MDNMMjIxIDc1M0wzODkgODUxTDUzMyA3NTNMNDg4IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RDsiIGhvcml6LWFkdi14PSI0NTAiIGQ9Ik00MjkgMTU3UTQyOSAxMTIgNDEzIDgxVDM3MCAyOVQzMDcgLTFUMjMwIC0xMVExNzkgLTExIDEzMSAxVDQwIDQyTDgxIDEwNlExMTMgODMgMTUzIDY5VDIzNCA1NVEyNTUgNTUgMjc0IDU5VDMxMCA3M1QzMzUgOTlUMzQ1IDEzOFEzNDUgMTY0IDMyNyAxODBUMjgyIDIwN1QyMjMgMjI5VDE2NCAyNTVUMTE4IDI5NVQxMDAgMzYwUTEwMCA0MDEgMTE2IDQzMFQxNjAgNDc4VDIyMyA1MDVUMjk3IDUxNFEzMzkgNTE0IDM4MCA1MDVUNDU4IDQ3NUw0MjQgNDA5UTM5NyA0MjcgMzYyIDQzNlQyOTUgNDQ2UTI3NyA0NDYgMjU3IDQ0M1QyMjEgNDMzVDE5NCA0MTFUMTgzIDM3NFExODMgMzUxIDIwMSAzMzdUMjQ2IDMxMVQzMDYgMjg5VDM2NSAyNjJUNDExIDIyMVQ0MjkgMTU3Wk00MzggNTYzTDMzMSA2NDJMMjAxIDU2M0wxNzEgNjEzTDMzOSA3MTFMNDgzIDYxM0w0MzggNTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVFOyIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTMzOSAtMTE0UTMzOSAtMTY0IDMwNyAtMTg3VDIzMCAtMjEwUTIwNiAtMjEwIDE4NiAtMjA0VDE0OCAtMTg2TDE2OCAtMTUxUTE4MiAtMTU5IDE5NyAtMTY0VDIzMCAtMTcwUTI1NCAtMTcwIDI3MSAtMTYwVDI4OCAtMTIyUTI4OCAtMTAzIDI3NCAtOTZUMjQzIC04OVEyMjIgLTg5IDIwNSAtOTZMMTg5IC04MUwyMzYgLTEwUTE4MiAtNiAxMzYgMTFUNDQgNjJMOTYgMTMwUTEzNCA5OCAxNzcgODBUMjcxIDYyUTMwMSA2MiAzMjggNjlUMzc3IDkyVDQxMCAxMzFUNDIyIDE4OFE0MjIgMjIyIDQwMCAyNDRUMzQ1IDI4NVQyNzMgMzE5VDIwMSAzNThUMTQ2IDQxMVQxMjQgNDg5UTEyNCA1NDAgMTQzIDU3NlQxOTYgNjM0VDI3MiA2NjdUMzYxIDY3N1E0NjYgNjc3IDU1NCA2MThMNTEwIDU0NVE0NzYgNTcyIDQzNyA1ODdUMzUzIDYwM1EzMjkgNjAzIDMwNSA1OThUMjYxIDU4MlQyMjkgNTUyVDIxNyA1MDVRMjE3IDQ3MiAyMzkgNDUxVDI5NCA0MTNUMzY2IDM4MVQ0MzggMzQzVDQ5NCAyODhUNTE2IDIwNVE1MTYgMTUyIDQ5OCAxMTJUNDQ5IDQ2VDM3NCA1VDI4MiAtMTFMMjQ3IC01OFEyNTUgLTU2IDI2MiAtNTVUMjc4IC01NFEzMDIgLTU0IDMyMCAtNjdUMzM5IC0xMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUY7IiBob3Jpei1hZHYteD0iNDUwIiBkPSJNMzA0IC0xMTNRMzA0IC0xNjMgMjcyIC0xODZUMTk1IC0yMDlRMTcxIC0yMDkgMTUxIC0yMDNUMTEzIC0xODVMMTMzIC0xNTBRMTQ3IC0xNTggMTYyIC0xNjNUMTk1IC0xNjlRMjE5IC0xNjkgMjM2IC0xNTlUMjUzIC0xMjFRMjUzIC0xMDIgMjM5IC05NVQyMDggLTg4UTE4NyAtODggMTcwIC05NUwxNTQgLTgwTDIwMCAtMTBRMTU3IC03IDExNiA1VDQwIDQyTDgxIDEwNlExMTMgODMgMTUzIDY5VDIzNCA1NVEyNTUgNTUgMjc0IDU5VDMxMCA3M1QzMzUgOTlUMzQ1IDEzOFEzNDUgMTY0IDMyNyAxODBUMjgyIDIwN1QyMjMgMjI5VDE2NCAyNTVUMTE4IDI5NVQxMDAgMzYwUTEwMCA0MDEgMTE2IDQzMFQxNjAgNDc4VDIyMyA1MDVUMjk3IDUxNFEzMzkgNTE0IDM4MCA1MDVUNDU4IDQ3NUw0MjQgNDA5UTM5NyA0MjcgMzYyIDQzNlQyOTUgNDQ2UTI3NyA0NDYgMjU3IDQ0M1QyMjEgNDMzVDE5NCA0MTFUMTgzIDM3NFExODMgMzUxIDIwMSAzMzdUMjQ2IDMxMVQzMDYgMjg5VDM2NSAyNjJUNDExIDIyMVQ0MjkgMTU3UTQyOSAxMTUgNDE1IDg0VDM3NiAzM1QzMTggM1QyNDYgLTEwTDIxMiAtNTdRMjIwIC01NSAyMjcgLTU0VDI0MyAtNTNRMjY3IC01MyAyODUgLTY2VDMwNCAtMTEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYwOyIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTUxNiAyMDVRNTE2IDE1MCA0OTcgMTEwVDQ0MyA0MlQzNjQgMlQyNjcgLTExUTIwMiAtMTEgMTQ5IDZUNDQgNjJMOTYgMTMwUTEzNCA5OCAxNzcgODBUMjcxIDYyUTMwMSA2MiAzMjggNjlUMzc3IDkyVDQxMCAxMzFUNDIyIDE4OFE0MjIgMjIyIDQwMCAyNDRUMzQ1IDI4NVQyNzMgMzE5VDIwMSAzNThUMTQ2IDQxMVQxMjQgNDg5UTEyNCA1NDAgMTQzIDU3NlQxOTYgNjM0VDI3MiA2NjdUMzYxIDY3N1E0NjYgNjc3IDU1NCA2MThMNTEwIDU0NVE0NzYgNTcyIDQzNyA1ODdUMzUzIDYwM1EzMjkgNjAzIDMwNSA1OThUMjYxIDU4MlQyMjkgNTUyVDIxNyA1MDVRMjE3IDQ3MiAyMzkgNDUxVDI5NCA0MTNUMzY2IDM4MVQ0MzggMzQzVDQ5NCAyODhUNTE2IDIwNVpNNTI2IDgwM0wzNjggNzA1TDIzOCA4MDNMMjc5IDg1MUwzNzcgNzc1TDQ5NiA4NTFMNTI2IDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGhvcml6LWFkdi14PSI0NTAiIGQ9Ik00MjkgMTU3UTQyOSAxMTIgNDEzIDgxVDM3MCAyOVQzMDcgLTFUMjMwIC0xMVExNzkgLTExIDEzMSAxVDQwIDQyTDgxIDEwNlExMTMgODMgMTUzIDY5VDIzNCA1NVEyNTUgNTUgMjc0IDU5VDMxMCA3M1QzMzUgOTlUMzQ1IDEzOFEzNDUgMTY0IDMyNyAxODBUMjgyIDIwN1QyMjMgMjI5VDE2NCAyNTVUMTE4IDI5NVQxMDAgMzYwUTEwMCA0MDEgMTE2IDQzMFQxNjAgNDc4VDIyMyA1MDVUMjk3IDUxNFEzMzkgNTE0IDM4MCA1MDVUNDU4IDQ3NUw0MjQgNDA5UTM5NyA0MjcgMzYyIDQzNlQyOTUgNDQ2UTI3NyA0NDYgMjU3IDQ0M1QyMjEgNDMzVDE5NCA0MTFUMTgzIDM3NFExODMgMzUxIDIwMSAzMzdUMjQ2IDMxMVQzMDYgMjg5VDM2NSAyNjJUNDExIDIyMVQ0MjkgMTU3Wk00NzMgNjYzTDMxNSA1NjVMMTg1IDY2M0wyMjYgNzExTDMyNCA2MzVMNDQzIDcxMUw0NzMgNjYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYyOyIgaG9yaXotYWR2LXg9IjUwNSIgZD0iTTM4MCA1ODhMMjk4IDBIMjA3TDI4OSA1ODhIMTAxTDExMiA2NjdINTc5TDU2OCA1ODhIMzgwWk0yMDEgLTIxNEgxNDFMMTg5IC02MEgyODZMMjAxIC0yMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjM7IiBob3Jpei1hZHYteD0iMzUyIiBkPSJNMzEwIC0xUTI5NCAtMyAyNzggLTRUMjQ2IC02UTIwOCAtNiAxODQgMFQxNDUgMTdUMTI1IDQ1VDExOSA4NFExMTkgMTAzIDEyMiAxMjZMMTY1IDQzMUg4Mkw5MiA1MDJIMTc2TDE5NSA2NDBIMjgxTDI2MiA1MDJIMzgxTDM3MSA0MzFIMjUyTDIxMSAxMzlRMjA4IDEyMSAyMDggMTA5UTIwOCA4NiAyMjMgNzdUMjg4IDY3UTI5NyA2NyAzMDMgNjdUMzIwIDY4TDMxMCAtMUgzMTBaTTE3MiAtMjEzSDExMkwxNjAgLTU5SDI1N0wxNzIgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGhvcml6LWFkdi14PSI1MDUiIGQ9Ik0zODAgNTg4TDI5OCAwSDIwN0wyODkgNTg4SDEwMUwxMTIgNjY3SDU3OUw1NjggNTg4SDM4MFpNNTExIDgwM0wzNTMgNzA1TDIyMyA4MDNMMjY0IDg1MUwzNjIgNzc1TDQ4MSA4NTFMNTExIDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NTsiIGhvcml6LWFkdi14PSIzNTIiIGQ9Ik0zMTAgLTFRMjk0IC0zIDI3OCAtNFQyNDYgLTZRMjA4IC02IDE4NCAwVDE0NSAxN1QxMjUgNDVUMTE5IDg0UTExOSAxMDMgMTIyIDEyNkwxNjUgNDMxSDgyTDkyIDUwMkgxNzZMMTk1IDY0MEgyODFMMjYyIDUwMkgzODFMMzcxIDQzMUgyNTJMMjExIDEzOVEyMDggMTIxIDIwOCAxMDlRMjA4IDg2IDIyMyA3N1QyODggNjdRMjk3IDY3IDMwMyA2N1QzMjAgNjhMMzEwIC0xWk00MTYgNTM1SDM1N0w0MTMgNzAwSDUwNkw0MTYgNTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY2OyIgaG9yaXotYWR2LXg9IjUwNSIgZD0iTTM0MyAzMjRMMjk4IDBIMjA3TDI1MiAzMjRIOTRMMTA0IDM5NkgyNjJMMjg5IDU4OEgxMDFMMTEyIDY2N0g1NzlMNTY4IDU4OEgzODBMMzUzIDM5Nkg1MTFMNTAxIDMyNEgzNDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjc7IiBob3Jpei1hZHYteD0iMzUyIiBkPSJNMjI5IDI3MEwyMTEgMTM5UTIwOCAxMjEgMjA4IDEwOVEyMDggODYgMjIzIDc3VDI4OCA2N0gzMjBMMzEwIC0xUTI5NCAtMyAyNzggLTRUMjQ2IC02UTIwOCAtNiAxODQgMFQxNDUgMTdUMTI1IDQ1VDExOSA4NFExMTkgMTAzIDEyMiAxMjZMMTQyIDI3MEg1OUw2OSAzMzhIMTUyTDE2NSA0MzFIODJMOTIgNTAySDE3NkwxOTUgNjQwSDI4MUwyNjIgNTAySDM4MUwzNzEgNDMxSDI1MkwyMzkgMzM4SDM1OEwzNDggMjcwSDIyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2ODsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02MTkgMjU5UTU5OSAxMjEgNTMxIDU1VDMzMiAtMTFRMjE5IC0xMSAxNjggMzZUMTE2IDE4NFExMTYgMjE4IDEyMiAyNTlMMTc5IDY2N0gyNzBMMjEzIDI1OVEyMTEgMjQzIDIxMCAyMjhUMjA4IDE5OVEyMDggMTY5IDIxNCAxNDRUMjM3IDEwMlQyNzkgNzVUMzQzIDY1UTM5MCA2NSA0MjIgNzlUNDc2IDExOVQ1MTAgMTgwVDUyOCAyNTlMNTg1IDY2N0g2NzZMNjE5IDI1OUg2MTlaTTYwNyA3ODFRNTkxIDc0NSA1NjMgNzI4VDUwNSA3MTBRNDg3IDcxMCA0NzAgNzE2VDQzNSA3MjlUNDAzIDc0M1QzNzMgNzUwUTM1NiA3NTAgMzQxIDc0MlQzMTEgNzA5TDI3MiA3NDNRMjk2IDc4NCAzMjEgNzk5VDM3NSA4MTRRMzkzIDgxNCA0MTAgODA4VDQ0NSA3OTRUNDc4IDc4MFQ1MDggNzc0UTUyNSA3NzQgNTQwIDc4MlQ1NjYgODE0TDYwNyA3ODFINjA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY5OyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTQwNiAwVjYzSDQwMlEzNzkgMzEgMzQxIDEwVDI0MiAtMTFRMjA4IC0xMSAxODEgLTVUMTM2IDE3VDEwNyA2MFQ5NyAxMjhROTcgMTQyIDk4IDE1OFQxMDIgMTkyTDE0NiA1MDJIMjMzTDE5NiAyMzdRMTkyIDIxMyAxOTAgMTkyVDE4OCAxNTNRMTg4IDEwOCAyMDYgODVUMjc3IDYyUTM0NyA2MiAzNzkgOThUNDE5IDE5NEw0NjIgNTAySDU0OUw0NzkgMEg0MDZaTTUyOSA2NDFRNTEzIDYwNSA0ODUgNTg4VDQyNyA1NzBRNDA5IDU3MCAzOTIgNTc2VDM1NyA1ODlUMzI1IDYwM1QyOTUgNjEwUTI3OCA2MTAgMjYzIDYwMlQyMzMgNTY5TDE5NCA2MDNRMjE4IDY0NCAyNDMgNjU5VDI5NyA2NzRRMzE1IDY3NCAzMzIgNjY4VDM2NyA2NTRUNDAwIDY0MFQ0MzAgNjM0UTQ0NyA2MzQgNDYyIDY0MlQ0ODggNjc0TDUyOSA2NDFINTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZBOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTYxOSAyNTlRNTk5IDEyMSA1MzEgNTVUMzMyIC0xMVEyMTkgLTExIDE2OCAzNlQxMTYgMTg0UTExNiAyMTggMTIyIDI1OUwxNzkgNjY3SDI3MEwyMTMgMjU5UTIxMSAyNDMgMjEwIDIyOFQyMDggMTk5UTIwOCAxNjkgMjE0IDE0NFQyMzcgMTAyVDI3OSA3NVQzNDMgNjVRMzkwIDY1IDQyMiA3OVQ0NzYgMTE5VDUxMCAxODBUNTI4IDI1OUw1ODUgNjY3SDY3Nkw2MTkgMjU5SDYxOVpNMjg5IDcyOUwyOTcgNzg2SDU5NUw1ODcgNzI5SDI4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QjsiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik00MDYgMFY2M0g0MDJRMzc5IDMxIDM0MSAxMFQyNDIgLTExUTIwOCAtMTEgMTgxIC01VDEzNiAxN1QxMDcgNjBUOTcgMTI4UTk3IDE0MiA5OCAxNThUMTAyIDE5MkwxNDYgNTAySDIzM0wxOTYgMjM3UTE5MiAyMTMgMTkwIDE5MlQxODggMTUzUTE4OCAxMDggMjA2IDg1VDI3NyA2MlEzNDcgNjIgMzc5IDk4VDQxOSAxOTRMNDYyIDUwMkg1NDlMNDc5IDBINDA2Wk0yMDkgNTg5TDIxNyA2NDZINTE1TDUwNyA1ODlIMjA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTYxOSAyNTlRNTk5IDEyMSA1MzEgNTVUMzMyIC0xMVEyMTkgLTExIDE2OCAzNlQxMTYgMTg0UTExNiAyMTggMTIyIDI1OUwxNzkgNjY3SDI3MEwyMTMgMjU5UTIxMSAyNDMgMjEwIDIyOFQyMDggMTk5UTIwOCAxNjkgMjE0IDE0NFQyMzcgMTAyVDI3OSA3NVQzNDMgNjVRMzkwIDY1IDQyMiA3OVQ0NzYgMTE5VDUxMCAxODBUNTI4IDI1OUw1ODUgNjY3SDY3Nkw2MTkgMjU5SDYxOVpNNTk1IDgyN1E1ODcgNzkyIDU2OSA3NjlUNTI5IDczMVQ0ODEgNzExVDQzMSA3MDVRNDA3IDcwNSAzODQgNzExVDM0MiA3MzFUMzEzIDc2OFQzMDMgODI3SDM2M1EzNjIgNzk2IDM3OSA3NzVUNDM4IDc1NFE0NzggNzU0IDUwMiA3NzVUNTM0IDgyN0g1OTVINTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZEOyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTQwNiAwVjYzSDQwMlEzNzkgMzEgMzQxIDEwVDI0MiAtMTFRMjA4IC0xMSAxODEgLTVUMTM2IDE3VDEwNyA2MFQ5NyAxMjhROTcgMTQyIDk4IDE1OFQxMDIgMTkyTDE0NiA1MDJIMjMzTDE5NiAyMzdRMTkyIDIxMyAxOTAgMTkyVDE4OCAxNTNRMTg4IDEwOCAyMDYgODVUMjc3IDYyUTM0NyA2MiAzNzkgOThUNDE5IDE5NEw0NjIgNTAySDU0OUw0NzkgMEg0MDZaTTUyMyA2ODdRNTE1IDY1MiA0OTcgNjI5VDQ1NyA1OTFUNDA5IDU3MVQzNTkgNTY1UTMzNSA1NjUgMzEyIDU3MVQyNzAgNTkxVDI0MSA2MjhUMjMxIDY4N0gyOTFRMjkwIDY1NiAzMDcgNjM1VDM2NiA2MTRRNDA2IDYxNCA0MzAgNjM1VDQ2MiA2ODdINTIzSDUyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RTsiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik02MTkgMjU5UTU5OSAxMjEgNTMxIDU1VDMzMiAtMTFRMjE5IC0xMSAxNjggMzZUMTE2IDE4NFExMTYgMjE4IDEyMiAyNTlMMTc5IDY2N0gyNzBMMjEzIDI1OVEyMTEgMjQzIDIxMCAyMjhUMjA4IDE5OVEyMDggMTY5IDIxNCAxNDRUMjM3IDEwMlQyNzkgNzVUMzQzIDY1UTM5MCA2NSA0MjIgNzlUNDc2IDExOVQ1MTAgMTgwVDUyOCAyNTlMNTg1IDY2N0g2NzZMNjE5IDI1OUg2MTlaTTU0MSA3OTFRNTQxIDc0NyA1MTEgNzE5VDQzNyA2OTBRNDAxIDY5MCAzNzUgNzExVDM0OCA3NjlRMzQ4IDc5MSAzNTYgODEwVDM3OSA4NDNUNDEyIDg2NFQ0NTQgODcyUTQ5MiA4NzIgNTE2IDg1MFQ1NDEgNzkxWk00MzcgNzI3UTQ2MiA3MjcgNDc5IDc0M1Q0OTcgNzg5UTQ5NyA4MTEgNDg1IDgyM1Q0NTIgODM1UTQyNiA4MzUgNDA5IDgxOFQzOTIgNzcyUTM5MiA3NTEgNDA0IDczOVQ0MzcgNzI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZGOyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTQwNiAwVjYzSDQwMlEzNzkgMzEgMzQxIDEwVDI0MiAtMTFRMjA4IC0xMSAxODEgLTVUMTM2IDE3VDEwNyA2MFQ5NyAxMjhROTcgMTQyIDk4IDE1OFQxMDIgMTkyTDE0NiA1MDJIMjMzTDE5NiAyMzdRMTkyIDIxMyAxOTAgMTkyVDE4OCAxNTNRMTg4IDEwOCAyMDYgODVUMjc3IDYyUTM0NyA2MiAzNzkgOThUNDE5IDE5NEw0NjIgNTAySDU0OUw0NzkgMEg0MDZaTTQ2NyA2NjdRNDY3IDYyMyA0MzcgNTk1VDM2MyA1NjZRMzI3IDU2NiAzMDEgNTg3VDI3NCA2NDVRMjc0IDY2NyAyODIgNjg2VDMwNSA3MTlUMzM4IDc0MFQzODAgNzQ4UTQxOCA3NDggNDQyIDcyNlQ0NjcgNjY3Wk0zNjMgNjAzUTM4OCA2MDMgNDA1IDYxOVQ0MjMgNjY1UTQyMyA2ODcgNDExIDY5OVQzNzggNzExUTM1MiA3MTEgMzM1IDY5NFQzMTggNjQ4UTMxOCA2MjcgMzMwIDYxNVQzNjMgNjAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcwOyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTYxOSAyNTlRNTk5IDEyMSA1MzEgNTVUMzMyIC0xMVEyMTkgLTExIDE2OCAzNlQxMTYgMTg0UTExNiAyMTggMTIyIDI1OUwxNzkgNjY3SDI3MEwyMTMgMjU5UTIxMSAyNDMgMjEwIDIyOFQyMDggMTk5UTIwOCAxNjkgMjE0IDE0NFQyMzcgMTAyVDI3OSA3NVQzNDMgNjVRMzkwIDY1IDQyMiA3OVQ0NzYgMTE5VDUxMCAxODBUNTI4IDI1OUw1ODUgNjY3SDY3Nkw2MTkgMjU5SDYxOVpNNTU0IDcwOEw1MTIgNzM1TDY3MCA4NTZMNzQ1IDgxOEw1NTQgNzA4Wk0zMjQgNzA4TDI4MyA3MzVMNDQxIDg1Nkw1MTYgODE4TDMyNCA3MDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzE7IiBob3Jpei1hZHYteD0iNTU1IiBkPSJNNDA2IDBWNjNINDAyUTM3OSAzMSAzNDEgMTBUMjQyIC0xMVEyMDggLTExIDE4MSAtNVQxMzYgMTdUMTA3IDYwVDk3IDEyOFE5NyAxNDIgOTggMTU4VDEwMiAxOTJMMTQ2IDUwMkgyMzNMMTk2IDIzN1ExOTIgMjEzIDE5MCAxOTJUMTg4IDE1M1ExODggMTA4IDIwNiA4NVQyNzcgNjJRMzQ3IDYyIDM3OSA5OFQ0MTkgMTk0TDQ2MiA1MDJINTQ5TDQ3OSAwSDQwNlpNNDg2IDU2OEw0NDQgNTk1TDYwMiA3MTZMNjc3IDY3OEw0ODYgNTY4Wk0yNTYgNTY4TDIxNSA1OTVMMzczIDcxNkw0NDggNjc4TDI1NiA1NjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNNjE5IDI1OVE2MDUgMTU2IDU2NSA5NVQ0NTEgN1E0MzQgLTQgNDE1IC0xN1QzODAgLTQ2VDM1MiAtODFUMzQxIC0xMjRRMzQxIC0xNDggMzU1IC0xNjJUMzk1IC0xNzZRNDE1IC0xNzYgNDI5IC0xNzFUNDU0IC0xNjBMNDYzIC0yMTBRNDUxIC0yMTYgNDI1IC0yMjNUMzc0IC0yMzFRMzIzIC0yMzEgMjk5IC0yMDdUMjc1IC0xNDZRMjc1IC0xMDIgMzAxIC02OFQzNjYgLTlRMzU4IC0xMCAzNTAgLTEwVDMzMiAtMTFRMjE5IC0xMSAxNjggMzZUMTE2IDE4NFExMTYgMjE4IDEyMiAyNTlMMTc5IDY2N0gyNzBMMjEzIDI1OVEyMTEgMjQzIDIxMCAyMjhUMjA4IDE5OVEyMDggMTY5IDIxNCAxNDRUMjM3IDEwMlQyNzkgNzVUMzQzIDY1UTM5MCA2NSA0MjIgNzlUNDc2IDExOVQ1MTAgMTgwVDUyOCAyNTlMNTg1IDY2N0g2NzZMNjE5IDI1OUg2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzM7IiBob3Jpei1hZHYteD0iNTU1IiBkPSJNNDU0IDBRMzkyIC0zNiAzNjggLTY2VDM0MyAtMTMxUTM0MyAtMTU1IDM1OCAtMTY5VDM5NyAtMTgzUTQxNyAtMTgzIDQzMSAtMTc4VDQ1NiAtMTY3TDQ2NSAtMjE3UTQ1MyAtMjIzIDQyNyAtMjMwVDM3NiAtMjM4UTMyNCAtMjM4IDMwMSAtMjE0VDI3OCAtMTUyUTI3OCAtMTI0IDI4OCAtMTAxVDMxNyAtNTlUMzU4IC0yNFQ0MDYgNFY2M0g0MDJRMzc5IDMxIDM0MSAxMFQyNDIgLTExUTIwOCAtMTEgMTgxIC01VDEzNiAxN1QxMDcgNjBUOTcgMTI4UTk3IDE0MiA5OCAxNThUMTAyIDE5MkwxNDYgNTAySDIzM0wxOTYgMjM3UTE5MiAyMTMgMTkwIDE5MlQxODggMTUzUTE4OCAxMDggMjA2IDg1VDI3NyA2MlEzNDcgNjIgMzc5IDk4VDQxOSAxOTRMNDYyIDUwMkg1NDlMNDc5IDBINDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc0OyIgaG9yaXotYWR2LXg9IjkxNiIgZD0iTTcxMiAwSDYwOEw1MzMgNTM4SDUyOUwzMDcgMEgxOTZMMTIzIDY2N0gyMjNMMjcwIDEwNUgyNzVMNTA2IDY2N0g1OThMNjcxIDEwNUg2NzVMODgyIDY2N0g5NzlMNzEyIDBaTTY3NSA3MDNMNTY4IDc4Mkw0MzggNzAzTDQwOCA3NTNMNTc2IDg1MUw3MjAgNzUzTDY3NSA3MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzU7IiBob3Jpei1hZHYteD0iNzQ3IiBkPSJNNTc2IDBINDgzTDQyNiAzNzNINDIyTDI2MSAwSDE2OEw5NSA1MDJIMTg1TDIzMCA4NkgyMzRMNDA3IDUwMkg0NzhMNTM2IDg2SDU0MEw3MDQgNTAySDc5Mkw1NzYgMFpNNTcyIDU2M0w0NjUgNjQyTDMzNSA1NjNMMzA1IDYxM0w0NzMgNzExTDYxNyA2MTNMNTcyIDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NjsiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0zNjkgMjY1TDMzMiAwSDI0MUwyNzcgMjYyTDEwNiA2NjdIMjA5TDMzNSAzNDVMNTUyIDY2N0g2NTJMMzY5IDI2NVpNNTA1IDcwM0wzOTggNzgyTDI2OCA3MDNMMjM4IDc1M0w0MDYgODUxTDU1MCA3NTNMNTA1IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NzsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik0yNTYgLTY1UTIzMiAtMTEzIDIxMiAtMTQ0VDE3MCAtMTkzVDEyNSAtMjE5VDY2IC0yMjZRNDUgLTIyNiAxMiAtMjIzTDIzIC0xNDlRMzEgLTE1MSA0MCAtMTUxVDY2IC0xNTJRODUgLTE1MiA5OCAtMTQ4VDEyNCAtMTMyVDE0OCAtMTAwVDE3NiAtNDhMMjA5IDE4TDg4IDUwMkgxODJMMjY2IDExMUgyNzBMNDU0IDUwMkg1NDdMMjU2IC02NVpNNDUwIDU2M0wzNDMgNjQyTDIxMyA1NjNMMTgzIDYxM0wzNTEgNzExTDQ5NSA2MTNMNDUwIDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3ODsiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0zNjkgMjY1TDMzMiAwSDI0MUwyNzcgMjYyTDEwNiA2NjdIMjA5TDMzNSAzNDVMNTUyIDY2N0g2NTJMMzY5IDI2NVpNNTQwIDc2OVE1NDAgNzQ2IDUyMyA3MjlUNDgyIDcxMlE0NjQgNzEyIDQ1MSA3MjRUNDM3IDc1NVE0MzcgNzc4IDQ1NSA3OTVUNDk2IDgxM1E1MTUgODEzIDUyNyA4MDFUNTQwIDc2OVpNMzUzIDc2OVEzNTMgNzQ2IDMzNSA3MjlUMjk0IDcxMlEyNzYgNzEyIDI2MyA3MjRUMjUwIDc1NVEyNTAgNzc4IDI2NyA3OTVUMzA4IDgxM1EzMjcgODEzIDM0MCA4MDFUMzUzIDc2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3OTsiIGhvcml6LWFkdi14PSI1NTgiIGQ9Ik00NiAwTDU2IDc1TDQ4MCA1ODhIMTQzTDE1NCA2NjdINTk2TDU4NiA1OTNMMTYxIDc2SDUyMkw1MTIgMEg0NlpNMzYxIDcwNUwzMTYgNzM2TDQ3MCA4NTdMNTUwIDgxNUwzNjEgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdBOyIgaG9yaXotYWR2LXg9IjQ1NCIgZD0iTTM5IDBMNDggNjhMMzY4IDQzMUgxMDVMMTE1IDUwMkg0NzdMNDY3IDQzMUwxNDggNzFINDI0TDQxNSAwSDM5Wk0yODkgNTY1TDI0NCA1OTZMMzk4IDcxN0w0NzggNjc1TDI4OSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBob3Jpei1hZHYteD0iNTU4IiBkPSJNNDYgMEw1NiA3NUw0ODAgNTg4SDE0M0wxNTQgNjY3SDU5Nkw1ODYgNTkzTDE2MSA3Nkg1MjJMNTEyIDBINDZaTTQ0OCA3NzhRNDQ4IDc1MSA0MzAgNzM2VDM4NSA3MjFRMzY1IDcyMSAzNTEgNzMxVDMzNyA3NjNRMzM3IDc4OSAzNTUgODA0VDM5OSA4MjBRNDE5IDgyMCA0MzMgODEwVDQ0OCA3NzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0M7IiBob3Jpei1hZHYteD0iNDU0IiBkPSJNMzkgMEw0OCA2OEwzNjggNDMxSDEwNUwxMTUgNTAySDQ3N0w0NjcgNDMxTDE0OCA3MUg0MjRMNDE1IDBIMzlaTTM4NSA2MzdRMzg1IDYxMCAzNjcgNTk1VDMyMiA1ODBRMzAyIDU4MCAyODggNTkwVDI3NCA2MjJRMjc0IDY0OCAyOTIgNjYzVDMzNiA2NzlRMzU2IDY3OSAzNzAgNjY5VDM4NSA2MzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0Q7IiBob3Jpei1hZHYteD0iNTU4IiBkPSJNNDYgMEw1NiA3NUw0ODAgNTg4SDE0M0wxNTQgNjY3SDU5Nkw1ODYgNTkzTDE2MSA3Nkg1MjJMNTEyIDBINDZaTTU0MCA4MDNMMzgyIDcwNUwyNTIgODAzTDI5MyA4NTFMMzkxIDc3NUw1MTAgODUxTDU0MCA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0U7IiBob3Jpei1hZHYteD0iNDU0IiBkPSJNMzkgMEw0OCA2OEwzNjggNDMxSDEwNUwxMTUgNTAySDQ3N0w0NjcgNDMxTDE0OCA3MUg0MjRMNDE1IDBIMzlaTTQ3NiA2NjNMMzE4IDU2NUwxODggNjYzTDIyOSA3MTFMMzI3IDYzNUw0NDYgNzExTDQ3NiA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxOTI7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNjAwIDYxM1E1ODcgNjE0IDU4MSA2MTRUNTYyIDYxNFE1MjcgNjE0IDUwMyA2MDFUNDY1IDU0OEw0MjQgNDI5SDUzMUw1MDggMzU2SDQwMkwyNzkgLTEwUTI2NSAtNTMgMjQ3IC04N1QyMDQgLTE0NFQxNDkgLTE4MFQ3NyAtMTkzUTYzIC0xOTMgNDkgLTE5MlQyMSAtMTg2TDQ0IC0xMTlRNTQgLTEyMSA2NCAtMTIxVDg4IC0xMjJRMTA3IC0xMjIgMTIzIC0xMTJUMTUzIC04M1QxNzggLTQxVDE5OSAxMkwzMTMgMzU2SDIzN0wyNjAgNDI5SDMzNUwzNzUgNTQ4UTM4NyA1ODYgNDAyIDYxMVQ0NDAgNjUzVDQ5NSA2NzVUNTc2IDY4MlE1ODggNjgyIDU5NyA2ODJUNjIxIDY4MUw2MDAgNjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZDOyIgaG9yaXotYWR2LXg9Ijg5OCIgZD0iTTQ1MSAwTDQ3NCAxNjRIMjI4TDExOCAwSDIyTDQ4NiA2NjdIOTQzTDkzMyA1OTFINjI0TDU5NiAzOTJIODc1TDg2NCAzMTRINTg1TDU1MSA3Nkg4NzBMODYwIDBINDUxWk01MzQgNTg5SDUyMUwyNzYgMjQySDQ4Nkw1MzQgNTg5Wk02ODQgNzA1TDYzOSA3MzZMNzkzIDg1N0w4NzMgODE1TDY4NCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkQ7IiBob3Jpei1hZHYteD0iODU4IiBkPSJNODQ4IDMxN1E4NDggMjk0IDg0NiAyNzBUODM3IDIyMkg0ODRRNDgzIDIxNCA0ODMgMjA1VDQ4MiAxODhRNDgyIDEyNSA1MTUgOTJUNjEyIDU4UTY1NCA1OCA2OTMgNzJUNzY2IDEwOUw3ODkgNDhRNzQ3IDIxIDcwMCA1VDYwMSAtMTFRNTQ3IC0xMSA1MDEgN1Q0MjYgNzFRMzc3IDMyIDMyMiAxMVQyMDMgLTExUTE3MyAtMTEgMTQ4IC00VDEwMyAyMFQ3MyA1OVQ2MiAxMTRRNjIgMTgzIDk2IDIyNFQxODEgMjg3VDI5MyAzMTVUNDA3IDMyMlE0MDkgMzM3IDQxMSAzNTJUNDEzIDM4MlE0MTMgNDIyIDM5MSA0MzRUMzM0IDQ0NlEyODYgNDQ2IDIzNiA0MzBUMTQ0IDM4OEwxMjIgNDUyUTE3NyA0NzkgMjMxIDQ5NlQzNDggNTE0UTM3MSA1MTQgMzkzIDUxMVQ0MzUgNDk4VDQ2NyA0NzNUNDg1IDQzMFE1MjAgNDcxIDU2NSA0OTNUNjY1IDUxNVE3MTEgNTE1IDc0NSA1MDFUODAyIDQ2MFQ4MzYgMzk4VDg0OCAzMTdaTTc2NiAyODNRNzY3IDI5MiA3NjcgMzAxVDc2OCAzMTlRNzY4IDM3NiA3NDIgNDEyVDY1NCA0NDhRNjE4IDQ0OCA1OTAgNDM1VDU0MiAzOThUNTA4IDM0NlQ0OTEgMjgzSDc2NlpNNDAxIDEyNVEzOTIgMTUzIDM5MiAxODVRMzkyIDIwNiAzOTQgMjI2VDQwMCAyNjdRMzY1IDI2NyAzMjIgMjYzVDI0MSAyNDVUMTc2IDIwNFQxNTAgMTI5UTE1MCA5NCAxNzIgNzRUMjMzIDUzUTI4MyA1MyAzMjcgNzVUNDAxIDEyNVpNNTI1IDU2NUw0ODAgNTk2TDYzNCA3MTdMNzE0IDY3NUw1MjUgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZFOyIgaG9yaXotYWR2LXg9Ijc0NiIgZD0iTTczMyA0MTFRNzMzIDMyNyA3MTEgMjUxVDY0MyAxMTZUNTMwIDI0VDM3MSAtMTFRMjU5IC0xMSAxOTEgNDNMMTI4IC0yNEw3OSAyM0wxNDUgOTRRMTA1IDE1OCAxMDUgMjU4UTEwNSAzNDEgMTI4IDQxN1QxOTYgNTUxVDMxMCA2NDNUNDY4IDY3OFE1NzggNjc4IDY0NCA2MjZMNzAyIDY4OEw3NTMgNjQ1TDY5MCA1NzdRNzMzIDUxMSA3MzMgNDExWk0zODEgNjNRNDUzIDYzIDUwMiA5NFQ1ODEgMTc0VDYyNSAyODRUNjM4IDQwOFE2MzggNDY2IDYyMiA1MDVMMjUxIDEwOFEyNzMgODYgMzA0IDc1VDM4MSA2M1pNMjAxIDI2MVEyMDEgMjA3IDIxNCAxNjhMNTg0IDU2MlE1MzkgNjA0IDQ1NyA2MDRRMzg1IDYwNCAzMzYgNTc0VDI1NyA0OTRUMjE0IDM4NFQyMDEgMjYxWk00NTAgNzA3TDQwNSA3MzhMNTU5IDg1OUw2MzkgODE3TDQ1MCA3MDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkY7IiBob3Jpei1hZHYteD0iNTc0IiBkPSJNODQgMTkyUTg0IDI1NiAxMDAgMzE0VDE1MSA0MTZUMjM2IDQ4N1QzNTggNTE0UTQwMCA1MTQgNDM0IDUwNFQ0OTMgNDczTDU1NyA1MzhMNTk3IDQ5OUw1MzAgNDMxUTU2MCAzODEgNTYwIDMwN1E1NjAgMjQ0IDU0MyAxODZUNDkxIDg1VDQwNSAxNVQyODQgLTExUTE5MiAtMTEgMTM5IDM3TDg1IC0xOEw0OSAyMkwxMDcgODFRODQgMTI0IDg0IDE5MlpNNDcxIDMwOFE0NzEgMzI0IDQ2OSAzMzhUNDY0IDM2NUwxOTggOTZRMjEyIDc3IDIzNSA2N1QyOTQgNTZRMzQ1IDU2IDM3OSA3OVQ0MzQgMTM5VDQ2MiAyMjBUNDcxIDMwOFpNMzQ5IDQ0NVEyOTcgNDQ1IDI2MyA0MjJUMjA5IDM2MlQxODEgMjgxVDE3MyAxOTNRMTczIDE3MCAxNzYgMTUxTDQzNiA0MTVRNDIxIDQyOSA0MDAgNDM3VDM0OSA0NDVaTTM1OSA1NjVMMzE0IDU5Nkw0NjggNzE3TDU0OCA2NzVMMzU5IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxODsiIGhvcml6LWFkdi14PSI1MzkiIGQ9Ik01MTYgMjA1UTUxNiAxNTAgNDk3IDExMFQ0NDMgNDJUMzY0IDJUMjY3IC0xMVEyMDIgLTExIDE0OSA2VDQ0IDYyTDk2IDEzMFExMzQgOTggMTc3IDgwVDI3MSA2MlEzMDEgNjIgMzI4IDY5VDM3NyA5MlQ0MTAgMTMxVDQyMiAxODhRNDIyIDIyMiA0MDAgMjQ0VDM0NSAyODVUMjczIDMxOVQyMDEgMzU4VDE0NiA0MTFUMTI0IDQ4OVExMjQgNTQwIDE0MyA1NzZUMTk2IDYzNFQyNzIgNjY3VDM2MSA2NzdRNDY2IDY3NyA1NTQgNjE4TDUxMCA1NDVRNDc2IDU3MiA0MzcgNTg3VDM1MyA2MDNRMzI5IDYwMyAzMDUgNTk4VDI2MSA1ODJUMjI5IDU1MlQyMTcgNTA1UTIxNyA0NzIgMjM5IDQ1MVQyOTQgNDEzVDM2NiAzODFUNDM4IDM0M1Q0OTQgMjg4VDUxNiAyMDVaTTIyNCAtMjEzSDE2NEwyMTIgLTU5SDMwOUwyMjQgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxOTsiIGhvcml6LWFkdi14PSI0NTAiIGQ9Ik00MjkgMTU3UTQyOSAxMTIgNDEzIDgxVDM3MCAyOVQzMDcgLTFUMjMwIC0xMVExNzkgLTExIDEzMSAxVDQwIDQyTDgxIDEwNlExMTMgODMgMTUzIDY5VDIzNCA1NVEyNTUgNTUgMjc0IDU5VDMxMCA3M1QzMzUgOTlUMzQ1IDEzOFEzNDUgMTY0IDMyNyAxODBUMjgyIDIwN1QyMjMgMjI5VDE2NCAyNTVUMTE4IDI5NVQxMDAgMzYwUTEwMCA0MDEgMTE2IDQzMFQxNjAgNDc4VDIyMyA1MDVUMjk3IDUxNFEzMzkgNTE0IDM4MCA1MDVUNDU4IDQ3NUw0MjQgNDA5UTM5NyA0MjcgMzYyIDQzNlQyOTUgNDQ2UTI3NyA0NDYgMjU3IDQ0M1QyMjEgNDMzVDE5NCA0MTFUMTgzIDM3NFExODMgMzUxIDIwMSAzMzdUMjQ2IDMxMVQzMDYgMjg5VDM2NSAyNjJUNDExIDIyMVQ0MjkgMTU3Wk0xODAgLTIxM0gxMjBMMTY4IC01OUgyNjVMMTgwIC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMzc7IiBob3Jpei1hZHYteD0iMjQ1IiBkPSJNMTYzIC0zOVExNTAgLTEyOSAxMDUgLTE3N1QtMzIgLTIyNlEtNDkgLTIyNiAtNjUgLTIyNVQtOTkgLTIyMkwtODggLTE0OFEtNjAgLTE1MSAtMzQgLTE1MVEtMyAtMTUxIDE2IC0xNDNUNDggLTEyMFQ2NiAtODNUNzcgLTMxTDE1MiA1MDJIMjM5TDE2MyAtMzlIMTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM2OyIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTM3NiA1NjNMMjY5IDY0MkwxMzkgNTYzTDEwOSA2MTNMMjc3IDcxMUw0MjEgNjEzTDM3NiA1NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzc7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNNDE2IDY2M0wyNTggNTY1TDEyOCA2NjNMMTY5IDcxMUwyNjcgNjM1TDM4NiA3MTFMNDE2IDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEODsiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik00MjEgNjg3UTQxMyA2NTIgMzk1IDYyOVQzNTUgNTkxVDMwNyA1NzFUMjU3IDU2NVEyMzMgNTY1IDIxMCA1NzFUMTY4IDU5MVQxMzkgNjI4VDEyOSA2ODdIMTg5UTE4OCA2NTYgMjA1IDYzNVQyNjQgNjE0UTMwNCA2MTQgMzI4IDYzNVQzNjAgNjg3SDQyMUg0MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyRDk7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMzIyIDYzN1EzMjIgNjEwIDMwNCA1OTVUMjU5IDU4MFEyMzkgNTgwIDIyNSA1OTBUMjExIDYyMlEyMTEgNjQ4IDIyOSA2NjNUMjczIDY3OVEyOTMgNjc5IDMwNyA2NjlUMzIyIDYzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQTsiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0zNjcgNjY3UTM2NyA2MjMgMzM3IDU5NVQyNjMgNTY2UTIyNyA1NjYgMjAxIDU4N1QxNzQgNjQ1UTE3NCA2NjcgMTgyIDY4NlQyMDUgNzE5VDIzOCA3NDBUMjgwIDc0OFEzMTggNzQ4IDM0MiA3MjZUMzY3IDY2N1pNMjYzIDYwM1EyODggNjAzIDMwNSA2MTlUMzIzIDY2NVEzMjMgNjg3IDMxMSA2OTlUMjc4IDcxMVEyNTIgNzExIDIzNSA2OTRUMjE4IDY0OFEyMTggNjI3IDIzMCA2MTVUMjYzIDYwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQjsiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0yMzcgMlEyMTkgLTkgMjAwIC0yMVQxNjMgLTUwVDEzNSAtODZUMTI0IC0xMzBRMTI0IC0xNTQgMTM4IC0xNjhUMTc3IC0xODNRMTk0IC0xODMgMjA3IC0xNzlUMjM2IC0xNjZMMjQ2IC0yMTdRMjI3IC0yMjYgMjAyIC0yMzJUMTU2IC0yMzhRMTEzIC0yMzggODUgLTIxOFQ1NyAtMTUxUTU3IC0xMTggNzEgLTkyVDEwOSAtNDRUMTYwIC04VDIxNiAxN0wyMzcgMkgyMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREM7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNNDM0IDY0MVE0MTggNjA1IDM5MCA1ODhUMzMyIDU3MFEzMTQgNTcwIDI5NyA1NzZUMjYyIDU4OVQyMzAgNjAzVDIwMCA2MTBRMTgzIDYxMCAxNjggNjAyVDEzOCA1NjlMOTkgNjAzUTEyMyA2NDQgMTQ4IDY1OVQyMDIgNjc0UTIyMCA2NzQgMjM3IDY2OFQyNzIgNjU0VDMwNSA2NDBUMzM1IDYzNFEzNTIgNjM0IDM2NyA2NDJUMzkzIDY3NEw0MzQgNjQxSDQzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJERDsiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0zMTYgNTY4TDI3NCA1OTVMNDMyIDcxNkw1MDcgNjc4TDMxNiA1NjhaTTg2IDU2OEw0NSA1OTVMMjAzIDcxNkwyNzggNjc4TDg2IDU2OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODA7IiBob3Jpei1hZHYteD0iOTE2IiBkPSJNNzEyIDBINjA4TDUzMyA1MzhINTI5TDMwNyAwSDE5NkwxMjMgNjY3SDIyM0wyNzAgMTA1SDI3NUw1MDYgNjY3SDU5OEw2NzEgMTA1SDY3NUw4ODIgNjY3SDk3OUw3MTIgMFpNNTc2IDcwNUw0MTcgODE0TDUxMSA4NTRMNjI5IDczNUw1NzYgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4MTsiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik01NzYgMEg0ODNMNDI2IDM3M0g0MjJMMjYxIDBIMTY4TDk1IDUwMkgxODVMMjMwIDg2SDIzNEw0MDcgNTAySDQ3OEw1MzYgODZINTQwTDcwNCA1MDJINzkyTDU3NiAwWk00NjkgNTY1TDMxMCA2NzRMNDA0IDcxNEw1MjIgNTk1TDQ2OSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgyOyIgaG9yaXotYWR2LXg9IjkxNiIgZD0iTTcxMiAwSDYwOEw1MzMgNTM4SDUyOUwzMDcgMEgxOTZMMTIzIDY2N0gyMjNMMjcwIDEwNUgyNzVMNTA2IDY2N0g1OThMNjcxIDEwNUg2NzVMODgyIDY2N0g5NzlMNzEyIDBaTTUzOSA3MDVMNDk0IDczNkw2NDggODU3TDcyOCA4MTVMNTM5IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODM7IiBob3Jpei1hZHYteD0iNzQ3IiBkPSJNNTc2IDBINDgzTDQyNiAzNzNINDIyTDI2MSAwSDE2OEw5NSA1MDJIMTg1TDIzMCA4NkgyMzRMNDA3IDUwMkg0NzhMNTM2IDg2SDU0MEw3MDQgNTAySDc5Mkw1NzYgMFpNNDM3IDU2NUwzOTIgNTk2TDU0NiA3MTdMNjI2IDY3NUw0MzcgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NDsiIGhvcml6LWFkdi14PSI5MTYiIGQ9Ik03MTIgMEg2MDhMNTMzIDUzOEg1MjlMMzA3IDBIMTk2TDEyMyA2NjdIMjIzTDI3MCAxMDVIMjc1TDUwNiA2NjdINTk4TDY3MSAxMDVINjc1TDg4MiA2NjdIOTc5TDcxMiAwWk03MTAgNzY5UTcxMCA3NDYgNjkzIDcyOVQ2NTIgNzEyUTYzNCA3MTIgNjIxIDcyNFQ2MDcgNzU1UTYwNyA3NzggNjI1IDc5NVQ2NjYgODEzUTY4NSA4MTMgNjk3IDgwMVQ3MTAgNzY5Wk01MjMgNzY5UTUyMyA3NDYgNTA1IDcyOVQ0NjQgNzEyUTQ0NiA3MTIgNDMzIDcyNFQ0MjAgNzU1UTQyMCA3NzggNDM3IDc5NVQ0NzggODEzUTQ5NyA4MTMgNTEwIDgwMVQ1MjMgNzY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NTsiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik01NzYgMEg0ODNMNDI2IDM3M0g0MjJMMjYxIDBIMTY4TDk1IDUwMkgxODVMMjMwIDg2SDIzNEw0MDcgNTAySDQ3OEw1MzYgODZINTQwTDcwNCA1MDJINzkyTDU3NiAwWk02MDUgNjI5UTYwNSA2MDYgNTg4IDU4OVQ1NDcgNTcyUTUyOSA1NzIgNTE2IDU4NFQ1MDIgNjE1UTUwMiA2MzggNTIwIDY1NVQ1NjEgNjczUTU4MCA2NzMgNTkyIDY2MVQ2MDUgNjI5Wk00MTggNjI5UTQxOCA2MDYgNDAwIDU4OVQzNTkgNTcyUTM0MSA1NzIgMzI4IDU4NFQzMTUgNjE1UTMxNSA2MzggMzMyIDY1NVQzNzMgNjczUTM5MiA2NzMgNDA1IDY2MVQ0MTggNjI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUVGMjsiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0zNjkgMjY1TDMzMiAwSDI0MUwyNzcgMjYyTDEwNiA2NjdIMjA5TDMzNSAzNDVMNTUyIDY2N0g2NTJMMzY5IDI2NVpNMzkyIDcwNUwyMzMgODE0TDMyNyA4NTRMNDQ1IDczNUwzOTIgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUVGMzsiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik0yNTYgLTY1UTIzMiAtMTEzIDIxMiAtMTQ0VDE3MCAtMTkzVDEyNSAtMjE5VDY2IC0yMjZRNDUgLTIyNiAxMiAtMjIzTDIzIC0xNDlRMzEgLTE1MSA0MCAtMTUxVDY2IC0xNTJRODUgLTE1MiA5OCAtMTQ4VDEyNCAtMTMyVDE0OCAtMTAwVDE3NiAtNDhMMjA5IDE4TDg4IDUwMkgxODJMMjY2IDExMUgyNzBMNDU0IDUwMkg1NDdMMjU2IC02NVpNMzQwIDU2NUwxODEgNjc0TDI3NSA3MTRMMzkzIDU5NUwzNDAgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxMzsiIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik04MCAyMjZMOTAgMjk0SDU5MEw1ODAgMjI2SDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxNDsiIGhvcml6LWFkdi14PSI4NzIiIGQ9Ik04MCAyMjdMOTAgMjkzSDg2NEw4NTQgMjI3SDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGhvcml6LWFkdi14PSIyMTUiIGQ9Ik0xOTUgNDkxSDg4TDIwMiA3MDBIMjY1TDE5NSA0OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE5OyIgaG9yaXotYWR2LXg9IjIxNSIgZD0iTTE3OSA0OTFIMTE3TDE4NyA3MDBIMjk0TDE3OSA0OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFBOyIgaG9yaXotYWR2LXg9IjIxNSIgZD0iTTg4IC0xNTNIMjZMOTYgNTZIMjAzTDg4IC0xNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFDOyIgaG9yaXotYWR2LXg9IjQwMyIgZD0iTTM4MyA0OTFIMjc3TDM5MSA3MDBINDUzTDM4MyA0OTFaTTE5NSA0OTFIODhMMjAzIDcwMEgyNjVMMTk1IDQ5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUQ7IiBob3Jpei1hZHYteD0iNDAzIiBkPSJNMzY3IDQ5MUgzMDVMMzc1IDcwMEg0ODJMMzY3IDQ5MVpNMTc5IDQ5MUgxMTdMMTg3IDcwMEgyOTRMMTc5IDQ5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUU7IiBob3Jpei1hZHYteD0iNDAzIiBkPSJNMjc2IC0xNTRIMjE0TDI4NCA1NkgzOTFMMjc2IC0xNTRaTTg4IC0xNTRIMjZMOTYgNTZIMjAzTDg4IC0xNTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIwOyIgaG9yaXotYWR2LXg9IjM0OSIgZD0iTTI4NCA0NzNMMjQyIDE3MUgxNTZMMTk4IDQ3M0gxMTNMMTIzIDU0NEgyMDhMMjI2IDY3NUgzMTJMMjk0IDU0NEgzNzhMMzY4IDQ3M0gyODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIxOyIgaG9yaXotYWR2LXg9IjM0OSIgZD0iTTI1NyAyODBMMjM3IDEzNkgxNTJMMTcyIDI4MEg4N0w5NyAzNTJIMTgyTDIwMCA0NzlIMTE0TDEyNCA1NTFIMjEwTDIyNyA2NzVIMzEyTDI5NSA1NTFIMzgwTDM3MCA0NzlIMjg1TDI2NyAzNTJIMzUzTDM0MyAyODBIMjU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGhvcml6LWFkdi14PSI1MjEiIGQ9Ik00MTQgMzI5UTQxNCAyOTcgNDAyIDI2OVQzNjkgMjIxVDMyMCAxODhUMjYwIDE3NlEyMjggMTc2IDIwMCAxODhUMTUyIDIyMFQxMTkgMjY5VDEwNyAzMjlRMTA3IDM2MSAxMTkgMzg5VDE1MSA0MzdUMjAwIDQ3MFQyNjAgNDgyUTI5MiA0ODIgMzIwIDQ3MFQzNjkgNDM4VDQwMiAzODlUNDE0IDMyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjY7IiBob3Jpei1hZHYteD0iNzAxIiBkPSJNMTcyIDUxUTE3MiAyMiAxNTIgNlQxMDQgLTEwUTg0IC0xMCA2OCAwVDUyIDM0UTUyIDYzIDcxIDc5VDExOSA5NlExNDAgOTYgMTU2IDg1VDE3MiA1MVpNNDE2IDUxUTQxNiAyMiAzOTYgNlQzNDkgLTEwUTMyOCAtMTAgMzEyIDBUMjk2IDM0UTI5NiA2MyAzMTUgNzlUMzYzIDk2UTM4NCA5NiA0MDAgODVUNDE2IDUxWk02NjEgNTFRNjYxIDIyIDY0MCA2VDU5MyAtMTBRNTczIC0xMCA1NTcgMFQ1NDEgMzRRNTQxIDYzIDU2MCA3OVQ2MDggOTZRNjI5IDk2IDY0NSA4NVQ2NjEgNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDMwOyIgaG9yaXotYWR2LXg9Ijk5OSIgZD0iTTM2MiA1OTNRMzYyIDU1OCAzNTUgNTIzVDMzMiA0NjBUMjg4IDQxM1QyMTkgMzk1UTE2NSAzOTUgMTQzIDQyNFQxMjAgNTA0UTEyMCA1MzggMTI3IDU3M1QxNTAgNjM2VDE5NCA2ODJUMjYyIDcwMFEzMTYgNzAwIDMzOSA2NzJUMzYyIDU5M1pNMjI1IDQzOFEyNTIgNDM4IDI2OCA0NTRUMjkzIDQ5NVQzMDQgNTQ1VDMwNyA1OTJRMzA3IDYxOSAyOTcgNjM3VDI1NiA2NTZRMjI5IDY1NiAyMTMgNjQwVDE4OSA2MDBUMTc4IDU1MFQxNzUgNTAzUTE3NSA0NzYgMTg0IDQ1N1QyMjUgNDM4Wk0xNzkgMEgxMjNMNjUwIDcwMEg3MDVMMTc5IDBaTTY2OSAxOTFRNjY5IDE1NiA2NjMgMTIxVDY0MCA1N1Q1OTYgMTJUNTI2IC02UTQ3MyAtNiA0NTAgMjJUNDI3IDEwMVE0MjcgMTM1IDQzNCAxNzBUNDU3IDIzNFQ1MDEgMjgxVDU2OSAyOTlRNjIzIDI5OSA2NDYgMjcxVDY2OSAxOTFaTTUzMiAzN1E1NTkgMzcgNTc1IDU0VDU5OSA5NVQ2MTEgMTQ1VDYxNCAxOTJRNjE0IDIxOSA2MDQgMjM3VDU2MiAyNTVRNTM2IDI1NSA1MjAgMjM5VDQ5NiAxOTlUNDg0IDE0OVQ0ODEgMTAyUTQ4MSA3NSA0OTEgNTZUNTMyIDM3Wk05NzYgMTkyUTk3NiAxNTcgOTY5IDEyMlQ5NDYgNTlUOTAyIDEyVDgzNCAtNlE3ODAgLTYgNzU3IDIyVDczNCAxMDJRNzM0IDEzNyA3NDAgMTcyVDc2MyAyMzZUODA3IDI4MVQ4NzcgMjk5UTkzMSAyOTkgOTUzIDI3MVQ5NzYgMTkyWk04NDAgMzdRODY2IDM3IDg4MiA1NFQ5MDYgOTVUOTE4IDE0NVQ5MjEgMTkyUTkyMSAyMTkgOTExIDIzN1Q4NzAgMjU1UTg0MyAyNTUgODI3IDIzOVQ4MDMgMTk5VDc5MSAxNDlUNzg4IDEwMlE3ODggNzQgNzk4IDU2VDg0MCAzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzk7IiBob3Jpei1hZHYteD0iMjYzIiBkPSJNMTc0IDExMEw2MiAzMDZMMjI5IDUwMkwyODQgNDY5TDE0MCAzMDVMMjM5IDE0NEwxNzQgMTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzQTsiIGhvcml6LWFkdi14PSIyNjMiIGQ9Ik0xMjAgMTEwTDY1IDE0NEwyMDcgMzA1TDExMCA0NjlMMTc1IDUwMkwyODcgMzA2TDEyMCAxMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgaG9yaXotYWR2LXg9IjExOCIgZD0iTS0xNjIgMEgtMjE1TDM3MSA3MDBINDI0TC0xNjIgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzA7IiBob3Jpei1hZHYteD0iMzQ5IiBkPSJNMzgzIDU4MFEzODMgNTQxIDM3NiA1MDJUMzUwIDQzMlQzMDEgMzgxVDIyNCAzNjFRMTY1IDM2MSAxNDAgMzkyVDExNCA0ODBRMTE0IDUxOSAxMjEgNTU4VDE0NyA2MjhUMTk1IDY4MFQyNzIgNzAwUTMzMiA3MDAgMzU3IDY2OVQzODMgNTgwWk0yMzEgNDA5UTI2MSA0MDkgMjc5IDQyN1QzMDYgNDczVDMxOSA1MzBUMzIyIDU4MlEzMjIgNjEyIDMxMSA2MzFUMjY1IDY1MVEyMzUgNjUxIDIxOCA2MzNUMTkxIDU4OFQxNzggNTMyVDE3NSA0ODBRMTc1IDQ1MCAxODYgNDMwVDIzMSA0MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc0OyIgaG9yaXotYWR2LXg9IjMxNyIgZD0iTTI5OCA0MzRMMjg5IDM2N0gyMjdMMjM2IDQzNEg5Nkw4OCA0ODFMMjY5IDY5NEgzMzVMMzA2IDQ4NEgzNTdMMzQ5IDQzNEgyOThaTTE0NCA0ODFIMjQ1TDI2NyA2MzRMMTQ0IDQ4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzU7IiBob3Jpei1hZHYteD0iMzEyIiBkPSJNMzQyIDUwNFEzNDIgNDM2IDMwMiAzOTlUMTk1IDM2MVExNjQgMzYxIDE0MCAzNjhUOTIgMzk1TDEyNyA0MzdRMTQyIDQyMyAxNjAgNDE2VDE5OCA0MDhRMjM5IDQwOCAyNTkgNDMxVDI4MCA0OTVRMjgwIDUyMiAyNjUgNTMzVDIyNCA1NDRRMTg1IDU0NCAxNTYgNTE2TDExNiA1NDZMMTYyIDY5NEgzNDlMMzQyIDY0M0gxOTlMMTc0IDU2NEwxNzcgNTYxUTIwNiA1ODcgMjQ4IDU4N1EyOTAgNTg3IDMxNiA1NjhUMzQyIDUwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzY7IiBob3Jpei1hZHYteD0iMzI2IiBkPSJNMzU2IDQ5N1EzNTYgNDM3IDMxOCAzOTlUMjIwIDM2MVExNjQgMzYxIDEzOSAzODlUMTEzIDQ3MlExMTMgNTExIDEyMSA1NTFUMTQ4IDYyNVQxOTggNjc5VDI3NiA3MDBRMzI1IDcwMCAzNjUgNjc1TDMzNCA2MzNRMzA4IDY1MyAyNzQgNjUzUTI1MCA2NTMgMjM0IDY0M1QyMDcgNjE4VDE5MCA1ODJUMTgxIDU0MlExOTYgNTYwIDIxNyA1NjlUMjYyIDU3OFEzMDIgNTc4IDMyOSA1NjBUMzU2IDQ5N1pNMjI2IDQwOVEyNjEgNDA5IDI3OSA0MzFUMjk3IDQ4N1EyOTcgNTEzIDI4MiA1MjRUMjQzIDUzNlEyMTEgNTM2IDE5MiA1MTRUMTcyIDQ2MFExNzIgNDM0IDE4NiA0MjJUMjI2IDQwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzc7IiBob3Jpei1hZHYteD0iMjg4IiBkPSJNMzUyIDY0MlEzMTYgNjE2IDI5MiA1OTRUMjUxIDU0NVQyMjYgNDgxVDIxMCAzOTNMMjA3IDM2N0gxNDJMMTQzIDM4MVExNDUgNDE0IDE1MyA0NDhUMTc3IDUxN1QyMTggNTgyVDI4MiA2NDBWNjQ0SDExMkwxMTkgNjk0SDM0OUwzNTIgNjQySDM1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzg7IiBob3Jpei1hZHYteD0iMzI0IiBkPSJNMzUwIDQ3NFEzNTAgNDQzIDMzOSA0MjJUMzA5IDM4N1QyNjUgMzY3VDIxMiAzNjFRMTkxIDM2MSAxNzEgMzY0VDEzNiAzNzdUMTEyIDQwMVQxMDIgNDQyUTEwMiA0NzkgMTE5IDUwMVQxNzEgNTM4VjU0MlExMzMgNTU5IDEzMyA1OTdRMTMzIDYyNSAxNDMgNjQ0VDE3MiA2NzRUMjEyIDY5MVQyNTkgNjk2UTI3NyA2OTYgMjk1IDY5NFQzMjcgNjg0VDM1MSA2NjNUMzYwIDYyN1EzNjAgNTY2IDMwNCA1NDJWNTM4UTMyNiA1MjggMzM4IDUxNFQzNTAgNDc0Wk0yMzkgNTU4UTI2NiA1NTggMjg0IDU3MlQzMDIgNjE1UTMwMiA2MzcgMjg4IDY0NVQyNTMgNjUzUTIyNiA2NTMgMjA4IDY0MFQxOTAgNTk3UTE5MCA1NzUgMjA0IDU2N1QyMzkgNTU4Wk0yMTggNDA1UTI1MCA0MDUgMjcwIDQyMlQyOTEgNDczUTI5MSA0OTkgMjc0IDUwOFQyMzQgNTE4UTIwMiA1MTggMTgyIDUwMVQxNjEgNDUwUTE2MSA0MjQgMTc4IDQxNVQyMTggNDA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3OTsiIGhvcml6LWFkdi14PSIzMjciIGQ9Ik0zNjIgNTg1UTM2MiA1NDQgMzU1IDUwNFQzMjkgNDMyVDI4MCAzODFUMjAxIDM2MVExNzUgMzYxIDE1MiAzNjdUMTA4IDM4OUwxMzkgNDMwUTE1NSA0MTcgMTY5IDQxMlQyMDQgNDA3UTIzMCA0MDcgMjQ2IDQxN1QyNzMgNDQzVDI4OSA0ODBUMjk4IDUyM0gyOTRRMjgxIDUwMyAyNjAgNDkzVDIxNSA0ODNRMTczIDQ4MyAxNDcgNTAyVDEyMCA1NjZRMTIwIDU5NiAxMzAgNjIxVDE1OSA2NjNUMjAyIDY5MFQyNTcgNzAwUTMxNCA3MDAgMzM4IDY3MFQzNjIgNTg1Wk0yMzEgNTI4UTI2NCA1MjggMjg0IDU0OVQzMDQgNjAzUTMwNCA2MjkgMjkwIDY0MVQyNTAgNjU0UTIxNyA2NTQgMTk4IDYzMVQxNzkgNTc2UTE3OSA1NTIgMTkzIDU0MFQyMzEgNTI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MDsiIGhvcml6LWFkdi14PSIzNDkiIGQ9Ik0zMTUgOTlRMzE1IDYwIDMwOCAyMVQyODIgLTUwVDIzMyAtMTAxVDE1NiAtMTIxUTk3IC0xMjEgNzIgLTkwVDQ2IC0yUTQ2IDM2IDUzIDc1VDc5IDE0NlQxMjggMTk4VDIwNCAyMThRMjY0IDIxOCAyODkgMTg3VDMxNSA5OVpNMTYzIC03M1ExOTMgLTczIDIxMSAtNTVUMjM4IC05VDI1MSA0OFQyNTQgMTAwUTI1NCAxMzAgMjQzIDE0OVQxOTcgMTY5UTE2NyAxNjkgMTUwIDE1MVQxMjMgMTA2VDExMCA1MFQxMDcgLTJRMTA3IC0zMiAxMTggLTUyVDE2MyAtNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgxOyIgaG9yaXotYWR2LXg9IjI4MCIgZD0iTTEwNyAtNjZMMTM3IDE0NkgxMzNMNjAgMTA4TDQ2IDE1M0wxNTggMjEySDIwN0wxNjggLTY2SDI0N0wyNDAgLTExNUgxN0wyNCAtNjZIMTA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MjsiIGhvcml6LWFkdi14PSIzMDkiIGQ9Ik0yNSAtMTE1TDIzIC02MVE0MCAtNDggNzMgLTI4VDEzOSAxN1QxOTYgNjlUMjIxIDEyM1EyMjEgMTM3IDIxMiAxNTJUMTc3IDE2N1ExNTMgMTY3IDEzMyAxNThUODkgMTI2TDYwIDE2NVE5NCAxOTQgMTI0IDIwNlQxOTAgMjE4UTIzNSAyMTggMjU5IDE5NVQyODQgMTM0UTI4NCAxMDEgMjY2IDc0VDIyMCAyNFQxNTggLTIxVDkxIC02NUgyNjBMMjUzIC0xMTVIMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgzOyIgaG9yaXotYWR2LXg9IjMwMiIgZD0iTTI2MCAtNFEyNjAgLTYwIDIyNiAtOTBUMTI5IC0xMjFROTcgLTEyMSA2OCAtMTEzVDE1IC04M0w0NyAtNDBRNjcgLTU4IDg2IC02NVQxMzAgLTczUTE1OCAtNzMgMTc5IC01N1QyMDEgLTdRMjAxIDMxIDE0NyAzMUgxMDRMMTEwIDc1SDEzOFExNDggNzUgMTYxIDc3VDE4NSA4NlQyMDMgMTAzVDIxMSAxMzBRMjExIDE0OCAxOTkgMTU4VDE2NCAxNjlRMTQyIDE2OSAxMjAgMTYyVDc4IDEzN0w1NiAxNzlRODkgMjAxIDExNiAyMDlUMTc3IDIxOFEyMjAgMjE4IDI0NiAyMDBUMjcyIDE0M1EyNzIgODcgMjE1IDYyVjU4UTI2MCA0NiAyNjAgLTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg0OyIgaG9yaXotYWR2LXg9IjMxNyIgZD0iTTIzMSAtNDhMMjIxIC0xMTVIMTU5TDE2OSAtNDhIMjlMMjAgLTFMMjAxIDIxMkgyNjdMMjM4IDJIMjg5TDI4MiAtNDhIMjMxWk03NiAtMUgxNzdMMTk5IDE1Mkw3NiAtMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODU7IiBob3Jpei1hZHYteD0iMzEyIiBkPSJNMjc0IDIyUTI3NCAtNDYgMjM0IC04M1QxMjcgLTEyMVE5NiAtMTIxIDcyIC0xMTRUMjQgLTg3TDU5IC00NVE5MSAtNzQgMTMwIC03NFExNzEgLTc0IDE5MSAtNTFUMjEyIDEzUTIxMiA0MCAxOTcgNTFUMTU2IDYyUTExNyA2MiA4OCAzNEw0OCA2NEw5NCAyMTJIMjgxTDI3NCAxNjFIMTMxTDEwNiA4MkwxMDkgNzlRMTM4IDEwNSAxODAgMTA1UTIyMiAxMDUgMjQ4IDg2VDI3NCAyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODY7IiBob3Jpei1hZHYteD0iMzI2IiBkPSJNMjg4IDE1UTI4OCAtNDUgMjUwIC04M1QxNTIgLTEyMVE5NiAtMTIxIDcxIC05M1Q0NSAtMTBRNDUgMjkgNTMgNjlUODAgMTQzVDEzMCAxOTdUMjA4IDIxOFEyNTcgMjE4IDI5NyAxOTNMMjY2IDE1MVEyNDAgMTcxIDIwNiAxNzFRMTgyIDE3MSAxNjYgMTYxVDEzOSAxMzZUMTIyIDEwMFQxMTMgNjBRMTI4IDc4IDE0OSA4N1QxOTQgOTZRMjM0IDk2IDI2MSA3OFQyODggMTVaTTE1OCAtNzNRMTkzIC03MyAyMTEgLTUxVDIyOSA1UTIyOSAzMSAyMTQgNDJUMTc1IDU0UTE0MyA1NCAxMjQgMzJUMTA0IC0yMlExMDQgLTQ4IDExOCAtNjBUMTU4IC03M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODc7IiBob3Jpei1hZHYteD0iMjg4IiBkPSJNMjg0IDE2MFEyNDggMTM0IDIyNCAxMTJUMTgzIDYzVDE1OCAtMVQxNDIgLTg5TDEzOSAtMTE1SDc0TDc1IC0xMDFRNzcgLTY4IDg1IC0zNFQxMDkgMzVUMTUwIDEwMFQyMTQgMTU4VjE2Mkg0NEw1MSAyMTJIMjgxTDI4NCAxNjBIMjg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4ODsiIGhvcml6LWFkdi14PSIzMjQiIGQ9Ik0yODIgLThRMjgyIC0zOSAyNzEgLTYwVDI0MSAtOTVUMTk3IC0xMTVUMTQ0IC0xMjFRMTIzIC0xMjEgMTAzIC0xMThUNjggLTEwNVQ0NCAtODFUMzQgLTQwUTM0IC0zIDUxIDE5VDEwMyA1NlY2MFE2NSA3NyA2NSAxMTVRNjUgMTQzIDc1IDE2MlQxMDQgMTkyVDE0NCAyMDlUMTkxIDIxNFEyMDkgMjE0IDIyNyAyMTJUMjU5IDIwMlQyODMgMTgxVDI5MiAxNDVRMjkyIDg0IDIzNiA2MFY1NlEyNTggNDYgMjcwIDMyVDI4MiAtOFpNMTcxIDc2UTE5OCA3NiAyMTYgOTBUMjM0IDEzM1EyMzQgMTU1IDIyMCAxNjNUMTg1IDE3MVExNTggMTcxIDE0MCAxNThUMTIyIDExNVExMjIgOTMgMTM2IDg1VDE3MSA3NlpNMTUwIC03N1ExODIgLTc3IDIwMiAtNjBUMjIzIC05UTIyMyAxNyAyMDYgMjZUMTY2IDM2UTEzNCAzNiAxMTQgMTlUOTMgLTMyUTkzIC01OCAxMTAgLTY3VDE1MCAtNzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg5OyIgaG9yaXotYWR2LXg9IjMyNyIgZD0iTTI5NCAxMDNRMjk0IDYyIDI4NyAyMlQyNjEgLTUwVDIxMiAtMTAxVDEzMyAtMTIxUTEwNyAtMTIxIDg0IC0xMTVUNDAgLTkzTDcxIC01MlE4NyAtNjUgMTAxIC03MFQxMzYgLTc1UTE2MiAtNzUgMTc4IC02NVQyMDUgLTM5VDIyMSAtMlQyMzAgNDFIMjI2UTIxMyAyMSAxOTIgMTFUMTQ3IDFRMTA1IDEgNzkgMjBUNTIgODRRNTIgMTE0IDYyIDEzOVQ5MSAxODFUMTM0IDIwOFQxODkgMjE4UTI0NiAyMTggMjcwIDE4OFQyOTQgMTAzWk0xNjMgNDZRMTk2IDQ2IDIxNiA2N1QyMzYgMTIxUTIzNiAxNDcgMjIyIDE1OVQxODIgMTcyUTE0OSAxNzIgMTMwIDE0OVQxMTEgOTRRMTExIDcwIDEyNSA1OFQxNjMgNDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMEFDOyIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTE1NiA0MzJRMTcxIDQ4NiAxOTEgNTMxVDI0MyA2MDlUMzE3IDY2MFQ0MjMgNjc4UTQ4NyA2NzggNTMyIDY1NFQ2MTUgNTc4TDU1MyA1MjRRNTI4IDU2NSA0OTYgNTg0VDQxNSA2MDRRMzcyIDYwNCAzNDQgNTkxVDI5NiA1NTVUMjY1IDUwMVQyNDQgNDMySDUxMEw1MDMgMzc5SDIzNVEyMzAgMzU2IDIyNyAzMzNUMjIyIDI4Nkg0OTBMNDgyIDIzM0gyMThWMjE0UTIxOCAxODIgMjIyIDE1NVQyNDAgMTA3VDI3NyA3NFQzMzggNjJRMzk2IDYyIDQzNiA4OFQ1MTMgMTU3TDU1NiAxMDJRNTA4IDUxIDQ1MyAyMFQzMjUgLTEyUTI2MyAtMTIgMjI1IDZUMTY1IDU2VDEzNiAxMzRUMTI4IDIzM0g1M0w2MiAyODZIMTMyUTEzNCAzMDkgMTM2IDMzMlQxNDUgMzc5SDc0TDgyIDQzMkgxNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTIyOyIgaG9yaXotYWR2LXg9IjYzOCIgZD0iTTU4NiA0NjZMNjA3IDYxMkw1MTAgNDk4TDQ0NiA2MTJMNDI1IDQ2NkgzNzZMNDA5IDcwMEg0NTRMNTIyIDU3N0w2MjMgNzAwSDY2OUw2MzYgNDY2SDU4NlpNMjcwIDY1NkwyNDMgNDY2SDE5MUwyMTggNjU2SDEzOUwxNDUgNzAwSDM1NUwzNDkgNjU2SDI3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNTM7IiBob3Jpei1hZHYteD0iNzE4IiBkPSJNMjAzIDQxNkwyMzMgNjI4SDIyOUwxNTUgNTkwTDE0MiA2MzVMMjU0IDY5NEgzMDNMMjY0IDQxNkgzNDNMMzM2IDM2N0gxMTNMMTIwIDQxNkgyMDNaTTE1MyAwSDEwMEw2ODYgNzAwSDczOUwxNTMgMFpNNjk0IDExMVE2OTQgNTUgNjYwIDI1VDU2MyAtNlE1MzEgLTYgNTAyIDJUNDQ5IDMyTDQ4MSA3NVE1MDEgNTcgNTIwIDUwVDU2NCA0MlE1OTIgNDIgNjEzIDU4VDYzNSAxMDhRNjM1IDE0NiA1ODEgMTQ2SDUzOEw1NDQgMTkwSDU3MlE1ODIgMTkwIDU5NSAxOTJUNjE5IDIwMVQ2MzcgMjE4VDY0NSAyNDVRNjQ1IDI2MyA2MzMgMjczVDU5OCAyODRRNTc2IDI4NCA1NTQgMjc3VDUxMiAyNTJMNDkwIDI5NFE1MjMgMzE2IDU1MCAzMjRUNjExIDMzM1E2NTQgMzMzIDY4MCAzMTVUNzA2IDI1OFE3MDYgMjAyIDY0OSAxNzdWMTczUTY5NCAxNjEgNjk0IDExMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNTQ7IiBob3Jpei1hZHYteD0iNzE4IiBkPSJNMTEzIDM2N0wxMTEgNDIxUTEyOCA0MzQgMTYxIDQ1NFQyMjcgNDk5VDI4NCA1NTFUMzA5IDYwNVEzMDkgNjE5IDMwMCA2MzRUMjY1IDY0OVEyNDEgNjQ5IDIyMSA2NDBUMTc3IDYwOEwxNDggNjQ3UTE4MiA2NzYgMjEyIDY4OFQyNzggNzAwUTMyMyA3MDAgMzQ3IDY3N1QzNzIgNjE2UTM3MiA1ODMgMzU0IDU1NlQzMDggNTA2VDI0NiA0NjFUMTc5IDQxN0gzNDhMMzQxIDM2N0gxMTNaTTE1MyAwSDEwMEw2ODYgNzAwSDczOUwxNTMgMFpNNjk0IDExMVE2OTQgNTUgNjYwIDI1VDU2MyAtNlE1MzEgLTYgNTAyIDJUNDQ5IDMyTDQ4MSA3NVE1MDEgNTcgNTIwIDUwVDU2NCA0MlE1OTIgNDIgNjEzIDU4VDYzNSAxMDhRNjM1IDE0NiA1ODEgMTQ2SDUzOEw1NDQgMTkwSDU3MlE1ODIgMTkwIDU5NSAxOTJUNjE5IDIwMVQ2MzcgMjE4VDY0NSAyNDVRNjQ1IDI2MyA2MzMgMjczVDU5OCAyODRRNTc2IDI4NCA1NTQgMjc3VDUxMiAyNTJMNDkwIDI5NFE1MjMgMzE2IDU1MCAzMjRUNjExIDMzM1E2NTQgMzMzIDY4MCAzMTVUNzA2IDI1OFE3MDYgMjAyIDY0OSAxNzdWMTczUTY5NCAxNjEgNjk0IDExMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNUI7IiBob3Jpei1hZHYteD0iNzE4IiBkPSJNMjAzIDQxNkwyMzMgNjI4SDIyOUwxNTUgNTkwTDE0MiA2MzVMMjU0IDY5NEgzMDNMMjY0IDQxNkgzNDNMMzM2IDM2N0gxMTNMMTIwIDQxNkgyMDNaTTE1MyAwSDEwMEw2ODYgNzAwSDczOUwxNTMgMFpNNzAxIDEwN1E3MDEgNzYgNjkwIDU1VDY2MCAyMFQ2MTYgMFQ1NjMgLTZRNTQyIC02IDUyMiAtM1Q0ODcgMTBUNDYzIDM0VDQ1MyA3NVE0NTMgMTEyIDQ3MCAxMzRUNTIyIDE3MVYxNzVRNDg0IDE5MiA0ODQgMjMwUTQ4NCAyNTggNDk0IDI3N1Q1MjMgMzA3VDU2MyAzMjRUNjEwIDMyOVE2MjggMzI5IDY0NiAzMjdUNjc4IDMxN1Q3MDIgMjk2VDcxMSAyNjBRNzExIDE5OSA2NTUgMTc1VjE3MVE2NzcgMTYxIDY4OSAxNDdUNzAxIDEwN1pNNTkwIDE5MVE2MTcgMTkxIDYzNSAyMDVUNjUzIDI0OFE2NTMgMjcwIDYzOSAyNzhUNjA0IDI4NlE1NzcgMjg2IDU1OSAyNzNUNTQxIDIzMFE1NDEgMjA4IDU1NSAyMDBUNTkwIDE5MVpNNTY5IDM4UTYwMSAzOCA2MjEgNTVUNjQyIDEwNlE2NDIgMTMyIDYyNSAxNDFUNTg1IDE1MVE1NTMgMTUxIDUzMyAxMzRUNTEyIDgzUTUxMiA1NyA1MjkgNDhUNTY5IDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1QzsiIGhvcml6LWFkdi14PSI3MTgiIGQ9Ik0zNDkgNDc4UTM0OSA0MjIgMzE1IDM5MlQyMTggMzYxUTE4NiAzNjEgMTU3IDM2OVQxMDQgMzk5TDEzNiA0NDJRMTU2IDQyNCAxNzUgNDE3VDIxOSA0MDlRMjQ3IDQwOSAyNjggNDI1VDI5MCA0NzVRMjkwIDUxMyAyMzYgNTEzSDE5M0wxOTkgNTU3SDIyN1EyMzcgNTU3IDI1MCA1NTlUMjc0IDU2OFQyOTIgNTg1VDMwMCA2MTJRMzAwIDYzMCAyODggNjQwVDI1MyA2NTFRMjMxIDY1MSAyMDkgNjQ0VDE2NyA2MTlMMTQ1IDY2MVExNzggNjgzIDIwNSA2OTFUMjY2IDcwMFEzMDkgNzAwIDMzNSA2ODJUMzYxIDYyNVEzNjEgNTY5IDMwNCA1NDRWNTQwUTM0OSA1MjggMzQ5IDQ3OFpNMTUzIDBIMTAwTDY4NiA3MDBINzM5TDE1MyAwWk03MDEgMTA3UTcwMSA3NiA2OTAgNTVUNjYwIDIwVDYxNiAwVDU2MyAtNlE1NDIgLTYgNTIyIC0zVDQ4NyAxMFQ0NjMgMzRUNDUzIDc1UTQ1MyAxMTIgNDcwIDEzNFQ1MjIgMTcxVjE3NVE0ODQgMTkyIDQ4NCAyMzBRNDg0IDI1OCA0OTQgMjc3VDUyMyAzMDdUNTYzIDMyNFQ2MTAgMzI5UTYyOCAzMjkgNjQ2IDMyN1Q2NzggMzE3VDcwMiAyOTZUNzExIDI2MFE3MTEgMTk5IDY1NSAxNzVWMTcxUTY3NyAxNjEgNjg5IDE0N1Q3MDEgMTA3Wk01OTAgMTkxUTYxNyAxOTEgNjM1IDIwNVQ2NTMgMjQ4UTY1MyAyNzAgNjM5IDI3OFQ2MDQgMjg2UTU3NyAyODYgNTU5IDI3M1Q1NDEgMjMwUTU0MSAyMDggNTU1IDIwMFQ1OTAgMTkxWk01NjkgMzhRNjAxIDM4IDYyMSA1NVQ2NDIgMTA2UTY0MiAxMzIgNjI1IDE0MVQ1ODUgMTUxUTU1MyAxNTEgNTMzIDEzNFQ1MTIgODNRNTEyIDU3IDUyOSA0OFQ1NjkgMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTVEOyIgaG9yaXotYWR2LXg9IjcxOCIgZD0iTTM2MyA1MDRRMzYzIDQzNiAzMjMgMzk5VDIxNiAzNjFRMTg1IDM2MSAxNjEgMzY4VDExMyAzOTVMMTQ4IDQzN1ExNjMgNDIzIDE4MSA0MTZUMjE5IDQwOFEyNjAgNDA4IDI4MCA0MzFUMzAxIDQ5NVEzMDEgNTIyIDI4NiA1MzNUMjQ1IDU0NFEyMDYgNTQ0IDE3NyA1MTZMMTM3IDU0NkwxODMgNjk0SDM3MEwzNjMgNjQzSDIyMEwxOTUgNTY0TDE5OCA1NjFRMjI3IDU4NyAyNjkgNTg3UTMxMSA1ODcgMzM3IDU2OFQzNjMgNTA0Wk0xNTMgMEgxMDBMNjg2IDcwMEg3MzlMMTUzIDBaTTcwMSAxMDdRNzAxIDc2IDY5MCA1NVQ2NjAgMjBUNjE2IDBUNTYzIC02UTU0MiAtNiA1MjIgLTNUNDg3IDEwVDQ2MyAzNFQ0NTMgNzVRNDUzIDExMiA0NzAgMTM0VDUyMiAxNzFWMTc1UTQ4NCAxOTIgNDg0IDIzMFE0ODQgMjU4IDQ5NCAyNzdUNTIzIDMwN1Q1NjMgMzI0VDYxMCAzMjlRNjI4IDMyOSA2NDYgMzI3VDY3OCAzMTdUNzAyIDI5NlQ3MTEgMjYwUTcxMSAxOTkgNjU1IDE3NVYxNzFRNjc3IDE2MSA2ODkgMTQ3VDcwMSAxMDdaTTU5MCAxOTFRNjE3IDE5MSA2MzUgMjA1VDY1MyAyNDhRNjUzIDI3MCA2MzkgMjc4VDYwNCAyODZRNTc3IDI4NiA1NTkgMjczVDU0MSAyMzBRNTQxIDIwOCA1NTUgMjAwVDU5MCAxOTFaTTU2OSAzOFE2MDEgMzggNjIxIDU1VDY0MiAxMDZRNjQyIDEzMiA2MjUgMTQxVDU4NSAxNTFRNTUzIDE1MSA1MzMgMTM0VDUxMiA4M1E1MTIgNTcgNTI5IDQ4VDU2OSAzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNUU7IiBob3Jpei1hZHYteD0iNzE4IiBkPSJNNDEwIDY0MlEzNzQgNjE2IDM1MCA1OTRUMzA5IDU0NVQyODQgNDgxVDI2OCAzOTNMMjY1IDM2N0gyMDBMMjAxIDM4MVEyMDMgNDE0IDIxMSA0NDhUMjM1IDUxN1QyNzYgNTgyVDM0MCA2NDBWNjQ0SDE3MEwxNzcgNjk0SDQwN0w0MTAgNjQyWk0xNTMgMEgxMDBMNjg2IDcwMEg3MzlMMTUzIDBaTTcwMSAxMDdRNzAxIDc2IDY5MCA1NVQ2NjAgMjBUNjE2IDBUNTYzIC02UTU0MiAtNiA1MjIgLTNUNDg3IDEwVDQ2MyAzNFQ0NTMgNzVRNDUzIDExMiA0NzAgMTM0VDUyMiAxNzFWMTc1UTQ4NCAxOTIgNDg0IDIzMFE0ODQgMjU4IDQ5NCAyNzdUNTIzIDMwN1Q1NjMgMzI0VDYxMCAzMjlRNjI4IDMyOSA2NDYgMzI3VDY3OCAzMTdUNzAyIDI5NlQ3MTEgMjYwUTcxMSAxOTkgNjU1IDE3NVYxNzFRNjc3IDE2MSA2ODkgMTQ3VDcwMSAxMDdaTTU5MCAxOTFRNjE3IDE5MSA2MzUgMjA1VDY1MyAyNDhRNjUzIDI3MCA2MzkgMjc4VDYwNCAyODZRNTc3IDI4NiA1NTkgMjczVDU0MSAyMzBRNTQxIDIwOCA1NTUgMjAwVDU5MCAxOTFaTTU2OSAzOFE2MDEgMzggNjIxIDU1VDY0MiAxMDZRNjQyIDEzMiA2MjUgMTQxVDU4NSAxNTFRNTUzIDE1MSA1MzMgMTM0VDUxMiA4M1E1MTIgNTcgNTI5IDQ4VDU2OSAzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTI7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNODIgMjI0TDkzIDMwMEg1NjVMNTU0IDIyNEg4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjA7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNDMxIDMxOUwzMTEgMjA3SDU1Mkw1NDEgMTMySDI0MUwxMzYgMzBMODcgNzRMMTQ5IDEzMkg3MEw4MSAyMDdIMjIwTDMzOSAzMTlIOTZMMTA3IDM5NEg0MTBMNTIwIDUwMUw1NzAgNDU4TDUwMSAzOTRINTc4TDU2NyAzMTlINDMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik04OSAyNzZMMTAwIDM1NUw1OTcgNTI5TDU4NSA0NDhMMTg1IDMxNkw1NDkgMTg4TDUzOCAxMDlMODkgMjc2Wk01MSAwTDYxIDczSDUzM0w1MjMgMEg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjU7IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNjYgMTA5TDc3IDE4OEw0NzggMzE2TDExMyA0NDhMMTI1IDUyOUw1NzIgMzU1TDU2MSAyNzZMNjYgMTA5Wk01MSAwTDYxIDczSDUzM0w1MjMgMEg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDI0REY7IiBob3Jpei1hZHYteD0iODY2IiBkPSJNNzc5IDMzNFE3NzkgMjYyIDc1MiAyMDBUNjc4IDkxVDU2OCAxN1Q0MzMgLTEwUTM2MSAtMTAgMjk4IDE3VDE4OCA5MFQxMTQgMTk5VDg3IDMzNFE4NyA0MDYgMTE0IDQ2OFQxODggNTc3VDI5OCA2NTFUNDMzIDY3OFE1MDUgNjc4IDU2OCA2NTFUNjc4IDU3OFQ3NTIgNDY5VDc3OSAzMzRaTTc0MSAzMzRRNzQxIDM5NyA3MTggNDUzVDY1MyA1NTJUNTU1IDYxOFQ0MzMgNjQzUTM2OCA2NDMgMzEyIDYxOVQyMTQgNTUyVDE1MCA0NTRUMTI2IDMzNFExMjYgMjcxIDE1MCAyMTZUMjE2IDExOFQzMTQgNTJUNDMzIDI4UTQ5NiAyOCA1NTIgNTJUNjUwIDExOFQ3MTYgMjE1VDc0MSAzMzRaTTYyMyA0MTVRNjIzIDM0NiA1ODYgMzEyVDQ2NyAyNzhIMzY5VjExMUgzMDFWNTQ0UTMzMyA1NDggMzcxIDU0OVQ0NDkgNTUxUTQ4OCA1NTEgNTIwIDU0NFQ1NzUgNTIyVDYxMCA0ODBUNjIzIDQxNVpNNTU1IDQxMlE1NTUgNDYzIDUyOSA0ODFUNDQ4IDQ5OVE0MjggNDk5IDQxMCA0OThUMzY5IDQ5NVYzMjhINDQ4UTQ3MiAzMjggNDkxIDMzMVQ1MjUgMzQzVDU0NyAzNjhUNTU1IDQxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY2QzM7IiBob3Jpei1hZHYteD0iMzU4IiBkPSJNMTUxIC0yMTNIOTFMMTM5IC01OUgyMzZMMTUxIC0yMTNaIiAgLz4KKworCis8L2ZvbnQ+Cis8L2RlZnM+Cis8dGV4dCB4PSI0MCIgeT0iNDAiIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgQmtJdCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEHDgcOAw4LDhMOFw4PDhiBDw4cgRMOQIEXDicOIw4rDiyBJIMONIMOMIMOOIMOPIE7DkTwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSI4MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBCa0l0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+T8OTw5LDlMOWw5XDmMWSIFPFoCBVw5rDmcObw5wgWcOdxbggWsW9IMOeIGHDocOgw6LDpMOlw6PDpiBjw6cgZMOwIGXDqcOow6rDqyBpIMSxIMOtIMOsIMOuIMOvIG7DsSBvw7PDssO0w7bDtcO4xZMgc8Whw58gdcO6w7nDu8O8IHnDvcO/IHrFvjwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxMjAiIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgQmtJdCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPsO+IDEyMzQ1Njc4OTAgwr0gwrwgwr4gJSDigLAgJMKiwqPCpcaS4oKswqQg4oCgIOKAoSDCpyDCtiAjIF5+wrUgK8OXwrEgJmx0OyA9ICZndDsgw7fCrCAhwqE/wr8gJnF1b3Q7ICZhbXA7ICZhcG9zOyAqIMKwIC4gLCA6IDsgKCkgWyBcIF0ge30gLyB8PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjE2MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBCa0l0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+wqYgXyDigJog4oCeIOKApiDigLnigLogwqvCuyDigJgg4oCZIOKAnCDigJ0g4oCiIMKtIC0g4oCTIOKAlCBAIMKpIMKuIOKEoiDCqsK6IMK5wrLCsyDCtCBgIMuGIMucIMKoIMKvIMK3IMK4PC90ZXh0PgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LnR0ZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrSXQudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2FhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LndvZmYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1Ca0l0LndvZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmYmZkNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUJrSXQud29mZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdC5lb3QgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdC5lb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhNGJmOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUx0LmVvdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdC5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2NTZlMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUx0LnN2ZwpAQCAtMCwwICsxLDQyNSBAQAor77u/PD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCIgPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID4KKzxtZXRhZGF0YT4KKzx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKzxpZD48IVtDREFUQVtDbGVhcnZpZXdBVFQgTHRdXT48L2lkPgorPHZlbmRvcj5Nb25vdHlwZSBJbWFnaW5nIEluYy48L3ZlbmRvcj4KKzxjcmVkaXRzPgorPG5hbWU+Rm9udHMuY29tIFdlYkZvbnRzPC9uYW1lPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tPC9VUkw+Cis8cm9sZT5Ib21lIG9mIHRoZSBXZWIgZm9udHM8L3JvbGU+Cis8L2NyZWRpdHM+Cis8bGljZW5zZT4KKzxVUkw+aHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbS9MZWdhbDwvVVJMPgorPC9saWNlbnNlPgorPGNvcHlyaWdodD48IVtDREFUQVtDb3B5cmlnaHQgKGMpIFRlcm1pbmFsIERlc2lnbiwgSW5jLCAyMDA1LiBBbGwgcmlnaHRzIHJlc2VydmVkLl1dPjwvY29weXJpZ2h0PgorPHRyYWRlbWFyaz48IVtDREFUQVtDbGVhcnZpZXcgaXMgYSB0cmFkZW1hcmsgb2YgVGVybWluYWwgRGVzaWduLCBJbmMuXV0+PC90cmFkZW1hcms+Cis8bGljZW5zZWU+Cis8bmFtZT48L25hbWU+Cis8L2xpY2Vuc2VlPgorPC9tZXRhZGF0YT4KKzxkZWZzID4KKzxmb250IGhvcml6LWFkdi14PSI0ODkiIGlkPSJDbGVhcnZpZXdBVFQtTHQiPgorPGZvbnQtZmFjZSBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEx0IiBwYW5vc2UtMT0iMiAxMSA1IDYgMyA1IDAgMiAwIDQiIGFzY2VudD0iNzUwIiBkZXNjZW50PSItMjUwIiB1bml0cy1wZXItZW09IjEwMDAiIGFscGhhYmV0aWM9IjAiPgorPC9mb250LWZhY2U+Cis8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iNDg0IiBkPSJNNDkyIDY2N1YwSC04VjY2N0g0OTJaTTMxIDYwNlY2NUwyMTcgMzM2TDMxIDYwNlpNNDUzIDY3VjYwNUwyNjggMzM2TDQ1MyA2N1pNNjEgMzVINDI0TDI0MiAyOTlMNjEgMzVaTTI0MiAzNzNMNDE5IDYzMEg2NUwyNDIgMzczWiIgIC8+CisKKzxnbHlwaCB1bmljb2RlPSImI3hBOyIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOyIgLz4KKzxnbHlwaCB1bmljb2RlPSIgIiBob3Jpei1hZHYteD0iMjgwIiAvPgorPGdseXBoIHVuaWNvZGU9IiEiIGhvcml6LWFkdi14PSIyNzEiIGQ9Ik0xNzMgNjY3UTE2OCA1NDMgMTY1IDQyMlQxNjAgMTc2SDExMlExMTAgMzAwIDEwNyA0MjFUMTAwIDY2N0gxNzNaTTE4NCAzOFExODQgMTUgMTcxIDNUMTM2IC0xMFExMTMgLTEwIDEwMCAyVDg3IDM4UTg3IDg1IDEzNiA4NVExNTkgODUgMTcxIDczVDE4NCAzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZxdW90OyIgaG9yaXotYWR2LXg9IjM2OCIgZD0iTTI4NCA1MThIMjQ0TDIyOCA3MDBIMzAxTDI4NCA1MThaTTEyMyA1MThIODJMNjcgNzAwSDE0MEwxMjMgNTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgaG9yaXotYWR2LXg9IjU4MiIgZD0iTTU0OCA0NzFINDI5TDQwNiAzMTZINTMwTDUyMyAyNzFINDAwTDM3OCAxMTNIMzI5TDM1MCAyNzFIMjAyTDE4MSAxMTNIMTMzTDE1NCAyNzFIMzBMMzYgMzE2SDE2MUwxODMgNDcxSDU3TDYzIDUxNUgxODhMMjExIDY2N0gyNjFMMjM5IDUxNUgzODdMNDA5IDY2N0g0NTlMNDM1IDUxNUg1NTVMNTQ4IDQ3MVpNMjMxIDQ3MUwyMTAgMzE2SDM1OEwzODEgNDcxSDIzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiQiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00ODAgMTkxUTQ4MCAxNjMgNDY5IDEzNVQ0MzYgODNUMzgxIDQ1VDMwNSAyOFYtNDdIMjQ2VjI5UTIwMyAzMCAxNTYgNDdUNzQgODdMMTAxIDEzOFExNDQgMTA5IDE4OSA5M1QyNzUgNzZRMzQ0IDc2IDM4MSAxMDZUNDE4IDE5MFE0MTggMjEzIDQxMSAyMzBUMzkwIDI2MlQzNTggMjg4VDMxNyAzMTJMMjE1IDM2MlExODcgMzc2IDE2NCAzOTBUMTI1IDQyMVQ5OSA0NjBUOTAgNTExUTkwIDUzMSA5NyA1NTRUMTIyIDU5OVQxNzAgNjM0VDI0OCA2NTBWNzIzSDMwOFY2NTFRMzQxIDY1MCAzODEgNjM3VDQ1NSA2MDJMNDMxIDU1MlEzOTYgNTc2IDM1OSA1ODlUMjc4IDYwM1EyMTMgNjAzIDE4MyA1NzlUMTUyIDUxMVExNTIgNDkyIDE1NyA0NzlUMTc2IDQ1NFQyMDkgNDMxVDI2MCA0MDRMMzQ5IDM2MlE0MTkgMzI5IDQ0OSAyOTBUNDgwIDE5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiUiIGhvcml6LWFkdi14PSI3MDkiIGQ9Ik0yOTYgNTMwUTI5NiA0NTEgMjY5IDQwNlQxNzMgMzYxUTEwNSAzNjEgNzggNDA2VDUwIDUzMFE1MCA2MTAgNzcgNjU1VDE3MyA3MDBRMjQxIDcwMCAyNjggNjU1VDI5NiA1MzBaTTI0OSA1MzFRMjQ5IDU1OSAyNDcgNTgzVDIzNiA2MjVUMjEyIDY1M1QxNzMgNjYzUTE0OSA2NjMgMTM0IDY1M1QxMTEgNjI2VDEwMCA1ODRUOTcgNTMwUTk3IDQ1OCAxMTQgNDI4VDE3MyAzOThRMjEzIDM5OCAyMzEgNDI4VDI0OSA1MzFaTTE2NyAwSDEyMUw1MzMgNzAwSDU3N0wxNjcgMFpNNjU5IDE2M1E2NTkgODQgNjMyIDM5VDUzNiAtNlE0NjggLTYgNDQxIDM5VDQxMyAxNjNRNDEzIDI0MyA0NDAgMjg4VDUzNiAzMzNRNjA0IDMzMyA2MzEgMjg4VDY1OSAxNjNaTTYxMiAxNjRRNjEyIDE5MiA2MTAgMjE2VDU5OSAyNThUNTc1IDI4NlQ1MzYgMjk2UTUxMiAyOTYgNDk3IDI4NlQ0NzQgMjU5VDQ2MyAyMTdUNDYwIDE2M1E0NjAgOTEgNDc4IDYxVDUzNiAzMVE1NzYgMzEgNTk0IDYxVDYxMiAxNjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImYW1wOyIgaG9yaXotYWR2LXg9IjU3MiIgZD0iTTI3MSAtMTFRMjA5IC0xMSAxNjcgNlQxMDAgNTJUNjMgMTE1VDUyIDE4NFE1MiAyMjAgNjQgMjQ5VDk3IDMwMlQxNDQgMzQ1VDE5OCAzODFRMTg0IDM5OCAxNzAgNDE2VDE0NCA0NTVUMTI1IDQ5N1QxMTcgNTQxUTExNyA1NjYgMTI2IDU5MVQxNTMgNjM1VDIwMSA2NjZUMjcxIDY3OFEzMTQgNjc4IDM0MiA2NjVUMzg3IDYzMlQ0MTAgNTg5VDQxNyA1NDhRNDE3IDUxNSA0MDYgNDkwVDM3NCA0NDNUMzI4IDQwNVQyNzMgMzcwTDQ0MiAxMzNRNDQ5IDE0OCA0NTMgMTY5VDQ1NyAyMTNRNDU3IDI0NSA0NTEgMjc1VDQ0MCAzMjNINDk3UTUwMiAzMDQgNTA2IDI3M1Q1MTEgMjEzUTUxMSAxODEgNTA0IDE0OVQ0NzkgOTJMNTQ1IDBINDc4TDQzOSA1M1E0MTIgMjcgMzczIDhUMjcxIC0xMVpNMjcxIDM1UTMxMyAzNSAzNDkgNTFUNDA4IDkyTDIyNSAzNDRRMjA0IDMyOSAxODQgMzEzVDE0NyAyNzdUMTIyIDIzNVQxMTIgMTg1UTExMiAxNDYgMTI0IDExOFQxNTggNzFUMjA5IDQ0VDI3MSAzNVpNMjQ5IDQwM1EzMDMgNDM3IDMzMiA0NjhUMzYyIDU0NFEzNjIgNTU2IDM1OCA1NzJUMzQ0IDYwMVQzMTYgNjI0VDI3MSA2MzRRMjQ2IDYzNCAyMjggNjI3VDE5OSA2MDhUMTgyIDU3OVQxNzYgNTQzUTE3NiA1MjUgMTgzIDUwNlQyMDIgNDY5VDIyNSA0MzNUMjQ5IDQwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgaG9yaXotYWR2LXg9IjIwNyIgZD0iTTEyMyA1MThIODJMNjcgNzAwSDE0MEwxMjMgNTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjI3OCIgZD0iTTE3OCAtMTM3UTE0NiAtNzcgMTIyIC0yMlQ4MyA4OFQ2MCAxOThUNTIgMzE2UTUyIDM3OCA1OSA0MzNUODMgNTQzVDEyMiA2NTNUMTc4IDc3MUwyMTggNzYyUTE2NyA2NTEgMTQxIDU0MlQxMTUgMzE3UTExNSAyMDIgMTQxIDkzVDIxOCAtMTI4TDE3OCAtMTM3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKSIgaG9yaXotYWR2LXg9IjI3OCIgZD0iTTUyIC0xMjhRMTA0IC0xNiAxMjkgOTNUMTU1IDMxN1ExNTUgNDMzIDEyOSA1NDJUNTIgNzYyTDkyIDc3MVExMjQgNzA5IDE0OCA2NTRUMTg3IDU0NFQyMTAgNDM0VDIxOCAzMTZRMjE4IDI1NCAyMTEgMTk5VDE4OCA4OFQxNDggLTIyVDkyIC0xMzdMNTIgLTEyOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IioiIGhvcml6LWFkdi14PSIzMTYiIGQ9Ik0xODIgNTU0VjU1MkwyNDEgNDkwTDE5NCA0NTRMMTUyIDUzMUgxNTBMMTA3IDQ1NUw2MCA0OTBMMTIwIDU1MlY1NTRMMzMgNTY5TDUzIDYyNEwxMzEgNTg4SDEzMkwxMTkgNjc0SDE3OUwxNjggNTg5TDE2OSA1ODhMMjQ3IDYyNUwyNjcgNTcwTDE4MiA1NTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIrIiBob3Jpei1hZHYteD0iNTU0IiBkPSJNMzA3IDIzMVYyMkgyNTJWMjMxSDU0VjI4NUgyNTJWNDgySDMwN1YyODVINTAwVjIzMUgzMDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyYzsiIGhvcml6LWFkdi14PSIxODQiIGQ9Ik03MSAtMTEySDMwTDYzIDg1SDE0NUw3MSAtMTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgaG9yaXotYWR2LXg9IjM2OSIgZD0iTTUyIDIzMlYyODZIMzE3VjIzMkg1MloiICAvPgorPGdseXBoIHVuaWNvZGU9Ii4iIGhvcml6LWFkdi14PSIxODQiIGQ9Ik0xMzkgMzhRMTM5IDE1IDEyNyAzVDkxIC0xMFE2OSAtMTAgNTcgMlQ0NCAzOFE0NCA4NSA5MiA4NVExMzkgODUgMTM5IDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLyIgaG9yaXotYWR2LXg9IjQ3OSIgZD0iTTc2IC0xMTVIMTlMNDE0IDcwMEg0NzNMNzYgLTExNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjAiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00OTggMzM0UTQ5OCAyNTAgNDg3IDE4NlQ0NDkgNzhUMzgxIDEyVDI3NyAtMTFRMjE1IC0xMSAxNzMgMTFUMTA0IDc2VDY3IDE4NFQ1NiAzMzRRNTYgNDE5IDY3IDQ4M1QxMDQgNTkwVDE3MiA2NTZUMjc3IDY3OFEzMzkgNjc4IDM4MSA2NTZUNDQ5IDU5MVQ0ODYgNDgzVDQ5OCAzMzRaTTQzNCAzMzVRNDM0IDQwMiA0MjggNDU2VDQwNSA1NDdUMzU4IDYwNVQyNzcgNjI2UTIyNiA2MjYgMTk1IDYwNlQxNDggNTQ4VDEyNiA0NTZUMTIwIDMzNVExMjAgMjY4IDEyNSAyMTRUMTQ3IDEyMVQxOTUgNjFUMjc4IDQwUTMyNyA0MCAzNTggNjFUNDA1IDEyMFQ0MjggMjEzVDQzNCAzMzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIxIiBob3Jpei1hZHYteD0iNTU0IiBkPSJNMjYxIDU0VjU5OUgyNThMOTcgNTAzTDcwIDU1MUwyNjggNjcwSDMyMlY1NEg0ODNWMEg5MlY1NEgyNjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIyIiBob3Jpei1hZHYteD0iNTU0IiBkPSJNODAgMEw3MSA2MlExNDAgMTI1IDIwMSAxNzlUMzA3IDI4NFQzNzkgMzgzVDQwNiA0ODVRNDA2IDUwNyA0MDEgNTMxVDM4MiA1NzdUMzQ0IDYxMVQyODAgNjI1UTIzNSA2MjUgMTkzIDYwMlQxMTMgNTMzTDc4IDU3OFExMjcgNjMxIDE3NSA2NTRUMjgzIDY3OFEzMjQgNjc4IDM1OCA2NjdUNDE2IDYzM1Q0NTQgNTc1VDQ2OCA0OTFRNDY4IDQ0MiA0NTAgMzk1VDM5MyAyOTdUMjkwIDE4NlQxMzYgNTRINDg0VjBIODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNDg0IDE4NVE0ODQgMTQ3IDQ3MyAxMTJUNDM3IDUwVDM3MCA2VDI2OCAtMTFRMjA2IC0xMSAxNjEgNFQ3MSA1MkwxMDAgMTAxUTE0MSA2OSAxODIgNTVUMjY2IDQwUTI5NiA0MCAzMjMgNDdUMzcyIDcxVDQwNyAxMTdUNDIwIDE4OFE0MjAgMjI0IDQxMiAyNDlUMzg2IDI5MVQzMzggMzE2VDI2NCAzMjRIMjAxVjM3NkgyMjNRMjgwIDM3NiAzMTUgMzg3VDM3MCA0MTdUMzk3IDQ1OFQ0MDQgNTA1UTQwNCA1NjMgMzY5IDU5NFQyNjcgNjI2UTE4NSA2MjYgMTExIDU2N0w4MyA2MTZRMTMyIDY0OSAxNzYgNjYzVDI3MyA2NzhRMzEzIDY3OCAzNDggNjY4VDQxMCA2MzdUNDUxIDU4NFQ0NjcgNTA2UTQ2NyA0NTEgNDQwIDQxMlQzNjAgMzU2VjM1NFE0MjMgMzQzIDQ1MyAzMDJUNDg0IDE4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjQiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00MTQgMTQ4VjBIMzUxVjE0OEg2OEw0OSAyMDdMMzQwIDY2NUg0MTRWMjAySDUwNVYxNDhINDE0Wk0zNTMgNTk2TDExMCAyMDJIMzU0VjU5NkgzNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI1IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNDgzIDIyOFE0ODMgMTYyIDQ2NiAxMTZUNDE5IDQyVDM0NyAyVDI1NCAtMTFRMjAzIC0xMSAxNjIgMlQ3NCA0OUwxMDIgOTlRMTQ0IDY3IDE4MCA1NFQyNTUgNDBRMzM4IDQwIDM3OSA4NFQ0MjAgMjI5UTQyMCAzMjIgMzgyIDM2MlQyNzAgNDAzUTIyOSA0MDMgMTk1IDM4OVQxMjMgMzM3TDcxIDM3NEwxMjAgNjY3SDQ1M1Y2MTNIMTcwTDEzMyAzOTlIMTM0UTE2OCA0MjggMjAyIDQ0MVQyODEgNDU0UTM3OCA0NTQgNDMwIDQwMFQ0ODMgMjI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNiIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTQ5NyAyMTRRNDk3IDE2MSA0ODEgMTIwVDQzNyA0OVQzNjggNVQyODAgLTExUTIxNiAtMTEgMTczIDhUMTA1IDY1VDY4IDE1N1Q1NyAyODNRNTcgMzY5IDY3IDQ0MVQxMDQgNTY2VDE3OCA2NDhUMzAwIDY3OFEzMzkgNjc4IDM3NyA2NjhUNDQ3IDYzOEw0MjIgNTg5UTM4OCA2MTEgMzYxIDYxOFQzMDAgNjI1UTI1OCA2MjUgMjI1IDYxMVQxNjcgNTYyVDEzMCA0NzBUMTE2IDMyNkgxMThRMTY4IDQyNCAyOTEgNDI0UTM4OCA0MjQgNDQyIDM2OFQ0OTcgMjE0Wk00MzQgMjExUTQzNCAyOTEgMzk1IDMzMVQyODAgMzcyUTI0NSAzNzIgMjE2IDM2MFQxNjYgMzI3VDEzNCAyNzRUMTIyIDIwM1ExMjIgMTI1IDE2NCA4M1QyODEgNDBRMzUzIDQwIDM5MyA4M1Q0MzQgMjExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTQ4NyA2MDlRNDIyIDU1MiAzODMgNDk4VDMyMSAzODJUMjkyIDI0NVQyODUgNzNWMEgyMjFWMjlRMjIxIDEwMiAyMjUgMTgxVDI0NyAzMzdUMzA1IDQ4NVQ0MTYgNjExVjYxM0g2OFY2NjdINDc2TDQ4NyA2MDlINDg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOCIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTQ5NiAxODdRNDk2IDkwIDQ0MiA0MFQyNzcgLTExUTE2MyAtMTEgMTEwIDM5VDU3IDE4N1E1NyAyNTAgODMgMjkyVDE3MCAzNTdWMzYwUTEyMiAzNzcgOTggNDE3VDc0IDUwNlE3NCA1MzkgODMgNTcwVDExNCA2MjVUMTc2IDY2M1QyNzYgNjc4UTM3NSA2NzggNDI2IDYzNlQ0NzggNTA2UTQ3OCA0NTcgNDU1IDQxOFQzODEgMzYwVjM1N1E0NDAgMzQwIDQ2OCAyOTVUNDk2IDE4N1pNNDE2IDUwN1E0MTYgNTcwIDM4MyA1OThUMjc2IDYyN1EyMDIgNjI3IDE3MCA1OTlUMTM3IDUwN1ExMzcgNDQ0IDE3MCA0MTNUMjc2IDM4MVE0MTYgMzgxIDQxNiA1MDdaTTQzNCAxODVRNDM0IDIxOCA0MjcgMjQ1VDQwMSAyOTFUMzUzIDMyMlQyNzYgMzMzUTI0MCAzMzMgMjExIDMyNlQxNjIgMzAxVDEzMCAyNTRUMTE5IDE4MFExMTkgMTA2IDE1NyA3M1QyNzYgMzlRMzU0IDM5IDM5NCA3MlQ0MzQgMTg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOSIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTQ5NyAzNTBRNDk3IDI1MiA0ODMgMTgzVDQ0MCA3MVQzNjUgOVQyNTcgLTExUTIxMyAtMTEgMTcwIDJUODkgNDNMMTIwIDg4UTE1NCA2MyAxODQgNTJUMjU3IDQwUTMwMiA0MCAzMzUgNTRUMzkyIDEwM1Q0MjYgMjAwVDQzOCAzNTdINDM2UTQxNiAzMDMgMzcxIDI3NFQyNjkgMjQ0UTIyMCAyNDQgMTgxIDI1OVQxMTQgMzAyVDcyIDM3MFQ1NyA0NjBRNTcgNTEzIDczIDU1M1QxMTkgNjIyVDE4OCA2NjRUMjc1IDY3OFEzMzEgNjc4IDM3MiA2NjBUNDQyIDYwM1Q0ODMgNTAxVDQ5NyAzNTBaTTQyNCA0NTdRNDI0IDUzOCAzODQgNTgyVDI3NSA2MjZRMjAwIDYyNiAxNjAgNTgwVDEyMCA0NThRMTIwIDM4MiAxNjEgMzM5VDI3NSAyOTZRMzQ5IDI5NiAzODYgMzQwVDQyNCA0NTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iMTg0IiBkPSJNMTQwIDQwMlExNDAgMzc5IDEyOCAzNjZUOTMgMzUzUTcwIDM1MyA1OCAzNjZUNDUgNDAyUTQ1IDQ0OSA5MyA0NDlRMTQwIDQ0OSAxNDAgNDAyWk0xNDAgMzhRMTQwIDE1IDEyOCAzVDkzIC0xMFE3MCAtMTAgNTggMlQ0NSAzOFE0NSA4NSA5MyA4NVExNDAgODUgMTQwIDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOyIgaG9yaXotYWR2LXg9IjE4NCIgZD0iTTcxIC0xMTJIMzBMNjIgODVIMTQwTDcxIC0xMTJaTTE1MCA0MDFRMTUwIDM3OCAxMzggMzY1VDEwMiAzNTJRNzkgMzUyIDY3IDM2NVQ1NCA0MDFRNTQgNDQ4IDEwMiA0NDhRMTUwIDQ0OCAxNTAgNDAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmx0OyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTU0IDIzMFYyODVMNTAwIDUwMFY0NDVMMTA5IDI1OEw1MDAgNzRWMjBMNTQgMjMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPSIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTU1IDMxMlYzNjZINTAwVjMxMkg1NVpNNTUgMTQ3VjIwMUg1MDBWMTQ3SDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmd0OyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTU0IDIwVjc0TDQ0NCAyNThMNTQgNDQ1VjUwMEw1MDAgMjg1VjIzMEw1NCAyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij8iIGhvcml6LWFkdi14PSI0OTkiIGQ9Ik00NDMgNTEzUTQ0MyA0NTAgNDE3IDQxMFQzMjQgMzM3TDI2NiAzMTBRMjQ4IDMwMSAyMzggMjk2VDIyNCAyODNUMjE4IDI2NFQyMTcgMjM0VjE2MUgxNTZWMjQzUTE1NiAyNjYgMTU4IDI4MVQxNjggMzA4VDE4OCAzMjhUMjIyIDM0N0wyNzYgMzcxUTMwOCAzODUgMzI4IDM5OVQzNjAgNDI5VDM3NiA0NjRUMzgxIDUwOFEzODEgNTY1IDM0NSA1OTVUMjQzIDYyNlEyMDIgNjI2IDE2NCA2MTNUODQgNTY2TDUzIDYxMlExMDIgNjQ3IDE0OCA2NjJUMjQ4IDY3OFEzNDIgNjc4IDM5MiA2MzNUNDQzIDUxM1pNMjMyIDM3UTIzMiAtMTAgMTg2IC0xMFExNjQgLTEwIDE1MiAyVDEzOSAzN1ExMzkgODMgMTg2IDgzUTIzMiA4MyAyMzIgMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJAIiBob3Jpei1hZHYteD0iODA3IiBkPSJNNzM1IDI3N1E3MzUgMjE4IDcxOSAxNzRUNjc5IDEwMFQ2MjUgNTZUNTY3IDQxUTUzOCA0MSA1MjEgNTdUNTAwIDEwMEg0OTdRNDcyIDY0IDQzNSA0OVQzNjMgMzRRMzAyIDM0IDI3MCA3M1QyMzcgMTg3UTIzNyAyMjMgMjQ3IDI2MVQyNzkgMzMyVDMzNSAzODVUNDE3IDQwNlE0ODQgNDA2IDUxNCAzNjFINTE1TDUyMSAzOTlINTc4TDU0MiAxMjdRNTQwIDExMyA1NDYgOTdUNTc5IDgxUTU5MCA4MSA2MDkgOTBUNjQ4IDEyM1Q2ODEgMTg0VDY5NSAyNzlRNjk1IDMzOSA2NzYgMzg2VDYyMSA0NjZUNTM4IDUxNlQ0MzEgNTM0UTM0OCA1MzQgMjg4IDUwNVQxODkgNDI5VDEzMiAzMjZUMTEzIDIxNFExMTMgMTQyIDEzMyA4NlQxOTAgLThUMjc5IC02NlQzOTQgLTg2UTQ1NyAtODYgNTA0IC03MlQ1OTQgLTI4TDYxNCAtNjBRNTY2IC05MyA1MTIgLTEwN1QzOTAgLTEyMVEzMDQgLTEyMSAyNDQgLTkzVDE0NSAtMTdUOTAgOTFUNzIgMjE3UTcyIDI4NiA5NSAzNTBUMTY0IDQ2MlQyNzYgNTQwVDQzMCA1NjlRNDg2IDU2OSA1NDEgNTUzVDYzOSA1MDFUNzA4IDQxMFQ3MzUgMjc3Wk01MDcgMjY5UTUwOSAyODYgNTA3IDMwM1Q0OTYgMzMzVDQ2OSAzNTVUNDIxIDM2NFEzNjAgMzY0IDMyNSAzMThUMjkwIDE4NFEyOTAgMTI3IDMxMyAxMDJUMzgwIDc2UTQzMiA3NiA0NjAgMTA5VDQ5NiAxOTBMNTA3IDI2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkEiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01MTggMEw0NTggMTcxSDE1M0w5MyAwSDI4TDI2OCA2NzFIMzQzTDU4NSAwSDUxOFpNMzA2IDYxMUgzMDRMMTY4IDIyNUg0NDBMMzA2IDYxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkIiIGhvcml6LWFkdi14PSI2MjAiIGQ9Ik01NTYgMTc5UTU1NiAxNDYgNTQ3IDExNFQ1MTUgNTZUNDUwIDE2VDM0NiAwSDkyVjY2NFExMDggNjY2IDEzMSA2NjhUMTc5IDY3MVQyMzIgNjc0VDI4NiA2NzVRMzI2IDY3NSAzNjggNjcxVDQ0NiA2NTBUNTA0IDU5N1Q1MjcgNDk5UTUyNyA0NDUgNTAwIDQwN1Q0MjQgMzUzVjM1MVE0ODUgMzQwIDUyMCAyOTRUNTU2IDE3OVpNNDYzIDQ5OVE0NjMgNTQwIDQ0OSA1NjRUNDExIDYwMlQzNTQgNjIwVDI4NiA2MjRRMjU4IDYyNCAyMjUgNjIzVDE1NSA2MTdWMzczUTE4NyAzNzIgMjIwIDM3MlQyODYgMzcyUTMyNCAzNzIgMzU2IDM3NVQ0MTIgMzkyVDQ0OSA0MzBUNDYzIDQ5OVpNNDkxIDE4MlE0OTEgMjM0IDQ3MyAyNjJUNDI2IDMwNFQzNjEgMzIwVDI4NyAzMjNRMjYzIDMyMyAyNDYgMzIzVDIxNCAzMjNUMTg1IDMyM1QxNTUgMzIxVjUyUTE5MSA1MCAyMjAgNTBUMjg3IDUwUTMyOCA1MCAzNjUgNTNUNDMwIDY5VDQ3NCAxMDhUNDkxIDE4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IkMiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik01ODAgNzZRNTI2IDI4IDQ3MiA5VDM1NCAtMTFRMjE0IC0xMSAxNDIgODBUNjkgMzM0UTY5IDM5OCA4NCA0NjBUMTM1IDU3MFQyMjUgNjQ4VDM2MSA2NzhRNDIxIDY3OCA0NzIgNjU4VDU3NSA1OTZMNTM3IDU1MlE0OTIgNTkwIDQ1MSA2MDdUMzYyIDYyNVEzMTIgNjI1IDI3MCA2MDdUMTk4IDU1M1QxNTIgNDYzVDEzNSAzMzRRMTM1IDI4MSAxNDUgMjI5VDE4MCAxMzZUMjQ5IDY4VDM1OSA0MlE0MDUgNDIgNDUyIDYwVDU0NSAxMjBMNTgwIDc2SDU4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkQiIGhvcml6LWFkdi14PSI2NTAiIGQ9Ik01ODEgMzM4UTU4MSAyNzYgNTY3IDIxNlQ1MTggMTA3VDQyNiAzMFQyODIgMEg5MlY2NjRRMTI5IDY2OSAxNzYgNjcyVDI3OSA2NzVRMzU1IDY3NSA0MTIgNjUxVDUwNiA1ODJUNTYyIDQ3NVQ1ODEgMzM4Wk01MTUgMzM4UTUxNSAzODYgNTA1IDQzNlQ0NjkgNTI4VDM5OCA1OTZUMjgwIDYyM1EyNDggNjIzIDIxNiA2MjFUMTU1IDYxNlY1M0gyNjNRMzkzIDUzIDQ1NCAxMjNUNTE1IDMzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkUiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwVjY2N0g0NjJWNjEySDE1NVYzODVINDMzVjMzMEgxNTVWNTRINDczVjBIOTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJGIiBob3Jpei1hZHYteD0iNDg1IiBkPSJNMTU1IDYxMlYzODFINDI1VjMyNkgxNTVWMEg5MlY2NjdINDU1VjYxMkgxNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJHIiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzYwIDQwUTQwOSA0MCA0NDUgNTRUNTA0IDk1VDUzOSAxNTZUNTUxIDIzNFYyODdIMzY4VjM0MEg2MTBWMjY2UTYxMCAxMjggNTQ0IDU5VDM1NyAtMTBRMjc4IC0xMCAyMjMgMThUMTM0IDk1VDg1IDIwNVQ2OSAzMzNRNjkgMzkyIDgzIDQ1M1QxMzIgNTY1VDIyMyA2NDZUMzY0IDY3OFE0MjkgNjc4IDQ4MCA2NTZUNTc0IDU5OUw1MzggNTU1UTQ5MSA1OTMgNDUwIDYwOVQzNjUgNjI1UTI5OCA2MjUgMjU0IDYwMFQxODMgNTM0VDE0NiA0NDBUMTM1IDMzM1ExMzUgMjgwIDE0NCAyMjhUMTc5IDEzNFQyNDggNjZUMzYwIDQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSCIgaG9yaXotYWR2LXg9IjY0NSIgZD0iTTQ5MCAwVjMzMUgxNTVWMEg5MlY2NjdIMTU1VjM4OEg0OTBWNjY3SDU1M1YwSDQ5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwVjY2N0gxNTVWMEg5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IkoiIGhvcml6LWFkdi14PSI0MjUiIGQ9Ik0zMzMgMTUxUTMzMyA2NiAyOTEgMjhUMTc3IC0xMVExNDEgLTExIDEwOCAtMlQ0NCAzMEw3MCA4MVE5OCA1OSAxMjAgNTFUMTcwIDQyUTIyNSA0MiAyNDcgNzBUMjcwIDE1NlY2NjdIMzMzVjE1MUgzMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJLIiBob3Jpei1hZHYteD0iNTQ1IiBkPSJNNDQ2IDBMMjMyIDM0M0wxNTUgMjUyVjBIOTJWNjY3SDE1NVYzMzNIMTU3TDQyOCA2NjdINTA1TDI3OSAzODhMNTIyIDBINDQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTCIgaG9yaXotYWR2LXg9IjQ3MyIgZD0iTTkyIDBWNjY3SDE1NVY1NUg0MzZWMEg5MloiICAvPgorPGdseXBoIHVuaWNvZGU9Ik0iIGhvcml6LWFkdi14PSI3NTAiIGQ9Ik01OTYgMFY1NTlINTkyTDM3NSAyMTRMMTU4IDU1OEgxNTRWMEg5MlY2NjdIMTU2TDM3NSAzMTVMNTk1IDY2N0g2NThWMEg1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iNjg0IiBkPSJNNTMwIDBMMTU4IDU2MEgxNTRWMEg5MlY2NjdIMTU5TDUyNiAxMTBINTMwVjY2N0g1OTJWMEg1MzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJPIiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNjYzIDMzNFE2NjMgMjY3IDY0OCAyMDVUNTk3IDk0VDUwNiAxOFQzNjYgLTExUTI4MyAtMTEgMjI3IDE3VDEzNSA5NFQ4NSAyMDRUNjkgMzM0UTY5IDM5OCA4NCA0NTlUMTMzIDU2OVQyMjUgNjQ4VDM2NiA2NzhRNDQ5IDY3OCA1MDYgNjQ5VDU5OCA1NzJUNjQ4IDQ2MlQ2NjMgMzM0Wk01OTcgMzMzUTU5NyAzODUgNTg3IDQzN1Q1NTEgNTMyVDQ4MSA2MDBUMzY2IDYyN1EyOTcgNjI3IDI1MiA2MDFUMTgxIDUzMlQxNDUgNDM4VDEzNSAzMzNRMTM1IDI4MiAxNDUgMjMwVDE4MSAxMzZUMjUyIDY4VDM2NiA0MVE0MzYgNDEgNDgwIDY3VDU1MSAxMzZUNTg3IDIzMFQ1OTcgMzMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUCIgaG9yaXotYWR2LXg9IjU4NSIgZD0iTTUyNyA0NzFRNTI3IDM2MiA0NzUgMzEzVDMxNSAyNjNIMTU1VjBIOTJWNjY0UTE0MyA2NjkgMTg5IDY3MlQyODYgNjc1UTM0MSA2NzUgMzg1IDY2NVQ0NjEgNjMyVDUxMCA1NjlUNTI3IDQ3MVpNNDYzIDQ2N1E0NjMgNTEyIDQ1MiA1NDJUNDE5IDU5MFQzNjMgNjE1VDI4NSA2MjNRMjUwIDYyMyAyMjAgNjIxVDE1NSA2MTVWMzE1SDI4OVEzMzMgMzE1IDM2NiAzMjFUNDIwIDM0NFQ0NTIgMzkwVDQ2MyA0NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJRIiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNjYzIDMzNFE2NjMgMjg3IDY1NiAyNDFUNjMyIDE1NFQ1ODYgODBUNTE1IDI1VjI0UTUzMSAxOSA1NDQgMTFUNTcyIC02VDYwMiAtMjRUNjQxIC0zOEw2MjQgLTg5UTU5NSAtODUgNTcwIC03MlQ1MjMgLTQ0VDQ3OSAtMTlUNDM4IC03UTQyMiAtNyA0MDIgLTlUMzY2IC0xMVEyODUgLTExIDIyOSAxNlQxMzcgOTBUODUgMTk5VDY5IDMzNFE2OSA0MDUgODUgNDY4VDEzNyA1NzdUMjI5IDY1MVQzNjYgNjc4UTQ0NyA2NzggNTAzIDY1MVQ1OTUgNTc4VDY0NyA0NjlUNjYzIDMzNFpNNTk3IDMzNFE1OTcgMzkyIDU4NiA0NDRUNTQ4IDUzN1Q0NzcgNjAyVDM2NiA2MjZRMzAwIDYyNiAyNTYgNjAyVDE4NCA1MzhUMTQ2IDQ0NFQxMzUgMzMzUTEzNSAyNzUgMTQ2IDIyMlQxODUgMTI5VDI1NiA2NVQzNjYgNDFRNDMyIDQxIDQ3NiA2NVQ1NDggMTMwVDU4NiAyMjRUNTk3IDMzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlIiIGhvcml6LWFkdi14PSI1ODEiIGQ9Ik00NTkgMEwzNzUgMjQ2UTM2NyAyNzEgMzUxIDI4MVQzMDcgMjkySDE1NVYwSDkyVjY2NFExMTcgNjY3IDEzOSA2NjlUMTgzIDY3MlQyMjcgNjc0VDI3NiA2NzVRMzIxIDY3NSAzNjMgNjY3VDQzOCA2MzdUNDkwIDU4MFQ1MTAgNDg3UTUxMCA0MjQgNDg2IDM3OVQzOTkgMzEyVjMxMVE0MTAgMzA2IDQxOSAyOTJUNDMzIDI2NUw1MjYgMEg0NTlaTTQ0NiA0ODFRNDQ2IDUyMyA0MzMgNTUwVDM5OCA1OTRUMzQ0IDYxNlQyNzcgNjIzUTI0MyA2MjMgMjE1IDYyMlQxNTUgNjE1VjM0NEgyOTdRMzY5IDM0NCA0MDcgMzc0VDQ0NiA0ODFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBob3Jpei1hZHYteD0iNTA2IiBkPSJNNDU0IDE4MFE0NTQgODkgNDAyIDM5VDI1MiAtMTFRMTkxIC0xMSAxNDAgNVQzNyA1N0w2NyAxMDdRMTAzIDc5IDE0NyA2MFQyNDYgNDBRMzE1IDQwIDM1MiA3NVQzOTAgMTgwUTM5MCAyMTUgMzc1IDIzOFQzMzYgMjc5VDI4MCAzMDlUMjE2IDMzNlExODYgMzQ5IDE1NyAzNjRUMTA2IDQwMFQ3MCA0NTBUNTYgNTE5UTU2IDU2MSA3MiA1OTFUMTE0IDY0MFQxNzUgNjY5VDI0OCA2NzhRMzAwIDY3OCAzNDYgNjYzVDQzNiA2MThMNDExIDU2NVEzNzYgNTkzIDMzNiA2MDlUMjQ3IDYyNlEyMjIgNjI2IDE5OSA2MjBUMTU5IDYwMFQxMzIgNTY3VDEyMSA1MjBRMTIxIDQ5MSAxMzIgNDcxVDE2MiA0MzZUMjA2IDQwOVQyNTkgMzg2UTI5MyAzNzIgMzI4IDM1N1QzOTEgMzE5VDQzNiAyNjNUNDU0IDE4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlQiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik0yNzIgNjEyVjBIMjA5VjYxMkgyMVY2NjdINDYxVjYxMkgyNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJVIiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTYwIDI1NVE1NjAgMTE0IDUwMyA1MlQzMjUgLTExUTIwNCAtMTEgMTQ4IDUxVDkyIDI1NVY2NjdIMTU1VjI0MlExNTUgMTk3IDE2MyAxNjFUMTkyIDk4VDI0NSA1N1QzMjYgNDJRMzc0IDQyIDQwNiA1NlQ0NTkgOTdUNDg4IDE2MFQ0OTcgMjQyVjY2N0g1NjBWMjU1SDU2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlYiIGhvcml6LWFkdi14PSI1NDUiIGQ9Ik0zMDkgMEgyMzRMMjUgNjY3SDkzTDI3MCA2NUgyNzRMNDUzIDY2N0g1MjBMMzA5IDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJXIiBob3Jpei1hZHYteD0iODY5IiBkPSJNNjczIDBINTk0TDQzNSA1NzFINDMxTDI3NiAwSDE5MkwzNCA2NjdIMTAzTDIzNiA2OEgyNDBMNDAzIDY2N0g0NjZMNjMyIDY4SDYzNkw3NjggNjY3SDgzNUw2NzMgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlgiIGhvcml6LWFkdi14PSI1MTkiIGQ9Ik00MjcgMEwyNjEgMjkxSDI1N0w5MiAwSDIwTDIyNCAzNDVMNDUgNjY3SDExN0wyNjEgMzkzSDI2NUw0MTYgNjY3SDQ4OEwzMDEgMzM5TDQ5OSAwSDQyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlkiIGhvcml6LWFkdi14PSI1MzMiIGQ9Ik0yOTkgMjY3VjBIMjM1VjI2NEwxOCA2NjdIODhMMjY3IDMyM0w0NDYgNjY3SDUxNUwyOTkgMjY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9IjUzMiIgZD0iTTQ3IDBWNTVMNDA3IDYxMkg2MlY2NjdINDc3VjYxM0wxMTUgNTRINDg1VjBINDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJbIiBob3Jpei1hZHYteD0iMjc4IiBkPSJNNzggLTk0Vjc1MUgyMzJWNzA4SDEzNVYtNTBIMjMyVi05NEg3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlwiIGhvcml6LWFkdi14PSI0NzkiIGQ9Ik0zOTkgLTExNUwxOSA2NjdINzhMNDU4IC0xMTVIMzk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXSIgaG9yaXotYWR2LXg9IjI3OCIgZD0iTTQ2IC05NFYtNTBIMTQzVjcwOEg0NlY3NTFIMjAwVi05NEg0NloiICAvPgorPGdseXBoIHVuaWNvZGU9Il4iIGhvcml6LWFkdi14PSIzMzEiIGQ9Ik0yODQgNTI2TDE2NCA2MDNMNDAgNTI2TDYgNTU5TDE2NCA2NjBMMzIyIDU1OUwyODQgNTI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXyIgaG9yaXotYWR2LXg9IjQ4NCIgZD0iTS04IC0xMzBWLTg1SDQ5MlYtMTMwSC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTI0MyA1NjVMODEgNjY5TDE0MSA3MDFMMjc0IDU4N0wyNDMgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTQyMSAtNlEzOTkgMyAzODkgMTZUMzc1IDU3SDM3NFEzMzcgMjYgMjk1IDhUMjA0IC0xMVExNzEgLTExIDE0MyAtMVQ5NCAyOFQ2MSA3NlQ0OSAxMzlRNDkgMjAyIDgxIDIzOFQxNjEgMjkzVDI2NCAzMTdUMzY4IDMyMlYzODBRMzY1IDQyNiAzNDEgNDQ2VDI2NSA0NjdRMjEyIDQ2NyAxNjYgNDQ4VDg4IDQwN0w2NSA0NTJRMTEzIDQ4MCAxNjIgNDk3VDI3MCA1MTVRMzQ4IDUxNSAzODggNDc5VDQyOCAzNjFWODhRNDI4IDcwIDQzNCA1N1Q0NTQgMzlMNDIxIC02Wk0zNjkgMjgxUTMzNCAyODEgMjg5IDI3OFQyMDQgMjYxVDEzNyAyMTlUMTA5IDE0MVExMDkgMTE4IDExNyA5OVQxMzkgNjRUMTcyIDQxVDIxNSAzMlEyNjIgMzIgMjk3IDUxVDM2OSA5OFYyODFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDkyIDI1MFE0OTIgMjAwIDQ4MiAxNTNUNDUwIDcwVDM5MCAxMVQyOTcgLTExUTIzOSAtMTEgMjAwIDEzVDE0MCA4M0gxMzdMMTI2IDBIODJWNzAwSDE0MVY0MzdIMTQzUTE2NiA0ODAgMjA4IDQ5N1QyOTUgNTE1UTM1NSA1MTUgMzkzIDQ5M1Q0NTMgNDM1VDQ4MyAzNTBUNDkyIDI1MFpNNDMxIDI1MFE0MzEgMjg5IDQyNyAzMjhUNDA3IDM5OFQzNjIgNDQ4VDI4NCA0NjdRMjIxIDQ2NyAxODEgNDMzVDE0MSAzMzFWMTk3UTE0MSAxNjQgMTUwIDEzNVQxNzggODNUMjIyIDQ4VDI4NCAzNVEzMzAgMzUgMzU4IDU0VDQwMyAxMDVUNDI1IDE3NFQ0MzEgMjUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTQyMiA0MTFRMzk1IDQzNyAzNjEgNDUxVDI4NSA0NjZRMjM3IDQ2NiAyMDYgNDQ4VDE1NSAzOTlUMTI3IDMzMFQxMTkgMjUxUTExOSAyMTEgMTI3IDE3M1QxNTQgMTA1VDIwNSA1N1QyODUgMzhRMzI2IDM4IDM1OCA1MVQ0MjQgOTRMNDQ2IDUwUTQxMSAyMSAzNzIgNVQyODIgLTExUTIyNCAtMTEgMTgyIDlUMTEzIDY0VDcyIDE0NlQ1OCAyNDlRNTggMzA1IDcxIDM1M1QxMTIgNDM4VDE4MiA0OTRUMjgzIDUxNVEzMzAgNTE1IDM3MSA0OTlUNDQ4IDQ1Nkw0MjIgNDExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZCIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQxMyA4Mkg0MDlRMzYwIC0xMSAyNTQgLTExUTE5OCAtMTEgMTYxIDEwVDEwMCA2NlQ2OCAxNDlUNTggMjUwUTU4IDMwMiA2NiAzNDlUOTcgNDM0VDE1NyA0OTNUMjU1IDUxNVEzMDIgNTE1IDM0MCA0OTlUNDA3IDQzOEg0MDlWNzAwSDQ2OFYwSDQxN1pNNDA5IDMzMVE0MDkgMzk4IDM2OSA0MzJUMjY2IDQ2N1EyMTcgNDY3IDE4OCA0NDhUMTQ0IDM5OFQxMjQgMzI4VDExOSAyNTBRMTE5IDIxMiAxMjUgMTc0VDE0NyAxMDVUMTkyIDU1VDI2NyAzNVEzMDEgMzUgMzI3IDQ4VDM3MiA4M1QzOTkgMTM1VDQwOSAxOTdWMzMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZSIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTQ3MyAyNzBRNDczIDI2NSA0NzMgMjUyVDQ3MiAyMzJIMTE4UTExOCAxNDIgMTU5IDg5VDI4MSAzNlEzMTYgMzYgMzUyIDQ4VDQzMCA5M0w0NTMgNTBRNDEwIDE2IDM2NyAzVDI3OSAtMTFRMTY5IC0xMSAxMTQgNTlUNTggMjUxUTU4IDMwOSA3MiAzNThUMTEzIDQ0MVQxODIgNDk1VDI3NyA1MTVRMzI0IDUxNSAzNjAgNDk3VDQyMiA0NDdUNDYwIDM2OVQ0NzMgMjcwWk00MTYgMjc2UTQxNiAzMTIgNDA5IDM0N1QzODQgNDA5VDM0MSA0NTNUMjc3IDQ3MFEyMzAgNDcwIDIwMCA0NTJUMTUxIDQwNlQxMjYgMzQ0VDExOSAyNzZINDE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjI5NiIgZD0iTTI4MCA2NTJRMjY5IDY1NSAyNjAgNjU2VDIzNyA2NThRMjEzIDY1OCAxOTkgNjU1VDE3OCA2NDNUMTY4IDYyMVQxNjYgNTg0VjUwMkgyNzNWNDUzSDE2N1YwSDEwN1Y0NTJIMzBWNTAySDEwN1Y1ODNRMTA3IDYxNCAxMTEgNjM3VDEyOCA2NzVUMTY0IDY5N1QyMjcgNzA1UTIzOSA3MDUgMjUyIDcwNFQyODAgNzAwVjY1MkgyODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJnIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNNDY3IC01NFE0NjcgLTExMSA0NTMgLTE0NVQ0MTUgLTE5N1QzNTkgLTIyMFQyOTEgLTIyNlEyMzEgLTIyNiAxODQgLTIxNFQ5MSAtMTc4TDExMiAtMTI4UTE1NCAtMTUzIDE5NyAtMTY1VDI4OSAtMTc4UTMyMiAtMTc4IDM0NCAtMTczVDM4MSAtMTU1VDQwMSAtMTIwVDQwOCAtNjRWODNINDA2UTM4MCAzNCAzNDQgMTRUMjU4IC03UTIwMiAtNyAxNjQgMTNUMTAyIDY3VDY4IDE0OVQ1OCAyNTBRNTggMzAxIDY2IDM0OVQ5NiA0MzRUMTU2IDQ5M1QyNTUgNTE1UTMwNiA1MTUgMzQ1IDQ5OFQ0MTIgNDMzSDQxM0w0MTcgNTAySDQ2N1YtNTRaTTQwOCAzMzJRNDA4IDM5OSAzNjggNDMzVDI2NSA0NjdRMjE3IDQ2NyAxODggNDQ4VDE0NCAzOThUMTI0IDMyOFQxMTkgMjUwUTExOSAyMDggMTI2IDE3MFQxNTAgMTAzVDE5NSA1N1QyNjcgMzlRMzAxIDM5IDMyNyA1MlQzNzIgODZUMzk5IDEzN1Q0MDggMTk5VjMzMloiICAvPgorPGdseXBoIHVuaWNvZGU9ImgiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik00MDcgMFYzMDFRNDA3IDMzOCA0MDQgMzY4VDM5MCA0MTlUMzU0IDQ1MVQyODggNDYzUTIxNyA0NjMgMTc5IDQyN1QxNDEgMzIzVjBIODJWNzAwSDE0MVY0MzRIMTQyUTE2MSA0NzQgMjAyIDQ5NFQzMDAgNTE1UTM1MSA1MTUgMzgzIDUwMlQ0MzQgNDYzVDQ1OSA0MDFUNDY2IDMxOFYwSDQwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9ImkiIGhvcml6LWFkdi14PSIyMjMiIGQ9Ik04MiAwVjUwMkgxNDFWMEg4MlpNMTUxIDYyM1ExNTEgNjA2IDE0MCA1OTVUMTExIDU4NFE5NCA1ODQgODMgNTk1VDcyIDYyM1E3MiA2NDEgODMgNjUxVDExMSA2NjJRMTMwIDY2MiAxNDAgNjUyVDE1MSA2MjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJqIiBob3Jpei1hZHYteD0iMjI5IiBkPSJNMTU2IDYyM1ExNTYgNjA0IDE0NSA1OTRUMTE2IDU4NFExMDAgNTg0IDg5IDU5NFQ3NyA2MjNRNzcgNjQyIDg4IDY1MlQxMTYgNjYyUTEzMyA2NjIgMTQ0IDY1MlQxNTYgNjIzWk0xNDYgLTUxUTE0NiAtOTEgMTM5IC0xMjNUMTE0IC0xNzhUNjcgLTIxM1QtNCAtMjI2US0xOSAtMjI2IC0zNCAtMjI1VC02MyAtMjIyVi0xNzFRLTM2IC0xNzQgLTE1IC0xNzRRMTggLTE3NCAzOCAtMTY2VDY5IC0xNDFUODMgLTEwMVQ4NyAtNDdWNTAySDE0NlYtNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJrIiBob3Jpei1hZHYteD0iNDc3IiBkPSJNMzc5IDBMMjI4IDI2NEwxNDEgMTYyVjBIODJWNzAwSDE0MVYyMzdIMTQ0TDM1OCA1MDJINDM0TDI3MSAzMDVMNDUxIDBIMzc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgaG9yaXotYWR2LXg9IjI1MSIgZD0iTTIyMiAwUTIxNCAtMiAyMDAgLTNUMTcyIC01UTEyNSAtNSAxMDQgMTVUODIgOTFWNzAwSDE0MVYxMDdRMTQxIDg2IDE0NCA3NFQxNTQgNTdUMTcyIDUwVDIwMCA0OUgyMjJWMEgyMjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJtIiBob3Jpei1hZHYteD0iODIyIiBkPSJNNjgxIDBWMzEzUTY4MSAzNDQgNjc4IDM3MVQ2NjQgNDE5VDYzMSA0NTFUNTcyIDQ2M1E0NDEgNDYzIDQ0MSAzMzNWMEgzODJWMzE4UTM4MiAzNTEgMzc4IDM3N1QzNjIgNDIzVDMyOCA0NTJUMjY5IDQ2M1EyMzggNDYzIDIxNSA0NTJUMTc1IDQyMlQxNTAgMzc5VDE0MSAzMjlWMEg4MlY1MDJIMTMzTDE0MCA0MzdIMTQyUTE2NCA0NzYgMjAwIDQ5NVQyODIgNTE1UTMzMCA1MTUgMzY3IDQ5N1Q0MjIgNDMyUTQ0NSA0NzcgNDg1IDQ5NlQ1NzMgNTE1UTYyMyA1MTUgNjU1IDUwMVQ3MDYgNDYyVDczMiA0MDBUNzQwIDMxOVYwSDY4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9Im4iIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik00MDcgMFYzMDFRNDA3IDMzOCA0MDQgMzY4VDM4OCA0MTlUMzUxIDQ1MVQyODYgNDYzUTIxNSA0NjMgMTc4IDQyNlQxNDEgMzIzVjBIODJWNTAySDEzM0wxMzkgNDM3SDE0MVExOTAgNTE1IDI5NyA1MTVRMzQ5IDUxNSAzODIgNTAyVDQzNCA0NjRUNDU5IDQwMlQ0NjYgMzE5VjBINDA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTU4IDI1MFE1OCAzMDQgNzAgMzUyVDEwOCA0MzdUMTc3IDQ5NFQyNzkgNTE1UTMzNyA1MTUgMzc5IDQ5NVQ0NDggNDM5VDQ4OCAzNTVUNTAxIDI1MFE1MDEgMTk2IDQ4OSAxNDlUNDQ5IDY2VDM4MCAxMFQyNzkgLTExUTIyMCAtMTEgMTc5IDlUMTEwIDY1VDcxIDE0OFQ1OCAyNTBaTTEyMCAyNTFRMTIwIDIxMCAxMjcgMTcxVDE1MiAxMDJUMjAxIDU0VDI4MCAzNlEzMjcgMzYgMzU3IDU0VDQwNiAxMDJUNDMxIDE3MVQ0MzkgMjUxUTQzOSAyOTMgNDMyIDMzMlQ0MDcgNDAxVDM1OCA0NDlUMjc5IDQ2N1EyMzIgNDY3IDIwMSA0NDlUMTUyIDQwMVQxMjcgMzMyVDEyMCAyNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJwIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNNDkxIDI1MFE0OTEgMTk5IDQ4MiAxNTJUNDQ5IDY4VDM4OCAxMVQyOTIgLTExUTIzOCAtMTEgMjAyIDEyVDE0MyA3M0wxNDEgNzRWLTIyMEg4MlY1MDJIMTMyTDEzOCA0MzZIMTQwUTE2NiA0NzkgMjA1IDQ5N1QyOTIgNTE1UTM1MyA1MTUgMzkxIDQ5M1Q0NTIgNDM0VDQ4MiAzNDlUNDkxIDI1MFpNNDMwIDI1MFE0MzAgMjkwIDQyNiAzMjhUNDA2IDM5OFQzNjIgNDQ4VDI4MiA0NjdRMjE5IDQ2NyAxODAgNDMyVDE0MSAzMzBWMTk4UTE0MSAxNjUgMTUwIDEzNVQxNzcgODNUMjIxIDQ4VDI4MSAzNVEzMjcgMzUgMzU2IDU0VDQwMSAxMDRUNDI0IDE3M1Q0MzAgMjUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icSIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQ3OCAtMjM2UTQ1OSAtMjMwIDQ0NiAtMjIzVDQyNCAtMjA1VDQxMiAtMTc2VDQwOCAtMTM0VjczSDQwNVEzNTggLTExIDI1NyAtMTFRMTk5IC0xMSAxNjEgMTFUMTAwIDY5VDY4IDE1M1Q1OCAyNTBRNTggMzAxIDY2IDM0OVQ5NiA0MzRUMTU2IDQ5M1QyNTUgNTE1UTMwMCA1MTUgMzQyIDQ5OFQ0MTEgNDM1SDQxMkw0MTggNTAySDQ2N1YtMTE5UTQ2NyAtMTM0IDQ2OCAtMTQ1VDQ3MyAtMTYzVDQ4NSAtMTc3VDUwNyAtMTg5TDQ3OCAtMjM2Wk00MDggMzMxUTQwOCAzOTYgMzY5IDQzMVQyNjYgNDY3UTIxNiA0NjcgMTg3IDQ0OFQxNDMgMzk4VDEyNCAzMjhUMTIwIDI1MFExMjAgMjEyIDEyNiAxNzRUMTQ4IDEwNVQxOTQgNTVUMjY4IDM1UTMwMiAzNSAzMjggNDhUMzcyIDgzVDM5OSAxMzRUNDA4IDE5N1YzMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJyIiBob3Jpei1hZHYteD0iMzQzIiBkPSJNMzAyIDQ2MVEyMjcgNDYxIDE4NCA0MzJUMTQxIDMzM1YwSDgyVjUwMkgxMzJMMTM4IDQ0MEgxMzlRMTYyIDQ4MCAyMDMgNDk3VDI5NyA1MTRIMzE5VjQ2MUgzMDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJzIiBob3Jpei1hZHYteD0iNDI4IiBkPSJNMzgzIDEzNlEzODMgOTcgMzcwIDY5VDMzMyAyNFQyODAgLTJUMjE2IC0xMVExNjQgLTExIDEyMiAxVDM5IDM4TDYyIDg1UTk0IDYzIDEzNiA1MFQyMTYgMzZRMjM4IDM2IDI1OCA0MVQyOTMgNThUMzE3IDg4VDMyNiAxMzJRMzI2IDE1NiAzMTYgMTcyVDI4OSAyMDBUMjUwIDIyMFQyMDYgMjM2UTE3NiAyNDYgMTQ4IDI1N1Q5OSAyODZUNjUgMzI3VDUyIDM4NlE1MiA0MjIgNjcgNDQ2VDEwNSA0ODZUMTU4IDUwOFQyMTggNTE1UTI1OSA1MTUgMjk2IDUwNVQzNjggNDc3TDM1MCA0MjlRMzI1IDQ0NCAyOTAgNDU1VDIxOSA0NjdRMTk3IDQ2NyAxNzcgNDYzVDE0MiA0NDhUMTE4IDQyMlQxMDkgMzgzUTEwOSAzNjIgMTE5IDM0N1QxNDcgMzIxVDE4NyAzMDFUMjM1IDI4NVEyNjIgMjc2IDI4OCAyNjVUMzM2IDIzN1QzNzAgMTk2VDM4MyAxMzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ0IiBob3Jpei1hZHYteD0iMzMyIiBkPSJNMjkwIC0xUTI4MCAtMyAyNjUgLTRUMjM2IC01UTE5NCAtNSAxNjkgM1QxMzEgMjhUMTEzIDY2VDEwOSAxMTZWNDUySDI1VjUwMkgxMDlWNjQySDE2OFY1MDJIMjkwVjQ1MkgxNjhWMTI2UTE2OCAxMDYgMTcwIDkxVDE4MCA2NlQyMDYgNTJUMjUzIDQ3SDI5MFYtMUgyOTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ1IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDAxIDY2SDM5OVEzODIgMzUgMzQ2IDEyVDI0NSAtMTFRMjA2IC0xMSAxNzYgLTJUMTI1IDMwVDkzIDkyVDgyIDE5NFY1MDJIMTQxVjIzOFExNDEgMTg5IDE0NCAxNTJUMTYwIDkwVDE5NSA1M1QyNTkgNDBRMzM1IDQwIDM2NyA4MVQzOTkgMTg4VjUwMkg0NThWMEg0MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ2IiBob3Jpei1hZHYteD0iNDU1IiBkPSJNMjY3IDBIMTkwTDI0IDUwMkg4N0wyMjggNTBIMjMyTDM2OCA1MDJINDMxTDI2NyAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgaG9yaXotYWR2LXg9IjcyMCIgZD0iTTU1MCAwSDQ3N0wzNjIgNDExSDM1OEwyNDAgMEgxNjlMMjkgNTAySDkwTDIwNiA1M0gyMTBMMzM0IDUwMkgzODVMNTEwIDU0SDUxNEw2MzEgNTAySDY5MUw1NTAgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IngiIGhvcml6LWFkdi14PSI0NDAiIGQ9Ik0zNTQgMEwyMjQgMjI0SDIyMEw4OCAwSDE5TDE4OCAyNjZMMzggNTAySDEwNkwyMjIgMzA1SDIyNkwzMzkgNTAySDQwM0wyNTkgMjY4TDQyMSAwSDM1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI0NjYiIGQ9Ik0yMzAgLTg4UTIxNSAtMTI4IDIwMiAtMTU0VDE3MiAtMTk3VDEzNiAtMjE5VDg5IC0yMjZRODEgLTIyNiA2OSAtMjI2VDQ2IC0yMjRWLTE3MlE1NSAtMTc0IDYzIC0xNzRUODMgLTE3NFExMDIgLTE3NCAxMTUgLTE2OVQxMzkgLTE1MVQxNjEgLTExM1QxODUgLTQ5TDIwOSAyMUwyMyA1MDJIODdMMjM4IDg5SDI0MkwzODAgNTAySDQ0M0wyMzAgLTg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieiIgaG9yaXotYWR2LXg9IjQ0MSIgZD0iTTQyIDBWNDlMMzI5IDQ1Mkg1MFY1MDJIMzk0VjQ1MkwxMDggNTBIMzk5VjBINDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ7IiBob3Jpei1hZHYteD0iMzEzIiBkPSJNMjMxIC05NFExOTggLTk0IDE3OSAtODRUMTQ5IC01N1QxMzYgLTE2VDEzMyAzNVYyMTZRMTMzIDI0NyAxMjMgMjcwVDc4IDMwMFYzNTdRMTEzIDM2NSAxMjMgMzg3VDEzMyA0NDJWNjI0UTEzMyA2NTEgMTM2IDY3NFQxNDkgNzE0VDE3OCA3NDJUMjI5IDc1MkgyNjRWNzA5SDI0M1EyMjEgNzA5IDIxMCA3MDJUMTk1IDY4MlQxOTAgNjU1VDE5MCA2MjJWNDM3UTE5MCA0MTcgMTg4IDQwM1QxODEgMzc2VDE2NiAzNTNUMTQwIDMyOVExNTYgMzE3IDE2NiAzMDZUMTgxIDI4M1QxODggMjU1VDE5MCAyMjBWMzdRMTkwIDEzIDE5MSAtM1QxOTggLTMwVDIxNCAtNDVUMjQ0IC01MEgyNjRWLTk0SDIzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9InwiIGhvcml6LWFkdi14PSIyMTYiIGQ9Ik04MiAtMjAwVjc0MEgxMzRWLTIwMEg4MloiICAvPgorPGdseXBoIHVuaWNvZGU9In0iIGhvcml6LWFkdi14PSIzMTMiIGQ9Ik0yMzUgMzAwUTIwMCAyOTMgMTkxIDI3MFQxODEgMjE2VjM1UTE4MSA3IDE3OCAtMTZUMTY1IC01N1QxMzUgLTg0VDgzIC05NEg0OVYtNTBINzFROTAgLTUwIDEwMCAtNDZUMTE2IC0zMVQxMjIgLTRUMTIzIDM3VjIyMFExMjMgMjQwIDEyNSAyNTVUMTMyIDI4MlQxNDcgMzA2VDE3MyAzMjlRMTU3IDM0MSAxNDcgMzUyVDEzMiAzNzZUMTI1IDQwMlQxMjMgNDM3VjYyMlExMjMgNjM5IDEyMyA2NTRUMTE5IDY4MlQxMDQgNzAxVDcyIDcwOUg0OVY3NTJIODRRMTE2IDc1MiAxMzUgNzQyVDE2NSA3MTVUMTc4IDY3NFQxODEgNjI0VjQ0MlExODEgNDI2IDE4MyA0MTNUMTkxIDM4OFQyMDcgMzY5VDIzNSAzNTdWMzAwSDIzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9In4iIGhvcml6LWFkdi14PSIzODIiIGQ9Ik0zNzEgNjIyUTM0NSA1NTggMjc1IDU1OFEyNTQgNTU4IDIzNSA1NjRUMTk2IDU3N1QxNTcgNTkxVDExOSA1OTdROTggNTk3IDgzIDU4OVQ1NiA1NTZMMTcgNTc0UTM3IDYwOSA1OSA2MjNUMTE3IDYzOFExMzggNjM4IDE1NyA2MzJUMTk1IDYxOVQyMzIgNjA1VDI3MCA1OTlRMjkwIDU5OSAzMDUgNjA4VDMzMCA2MzhMMzcxIDYyMkgzNzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMDsiIGhvcml6LWFkdi14PSIzMDAiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTE7IiBob3Jpei1hZHYteD0iMjcxIiBkPSJNOTggLTE2MlExMDMgLTM4IDEwNiA4M1QxMTEgMzI5SDE1OVExNjMgODUgMTcxIC0xNjJIOThaTTg3IDQ2N1E4NyA0OTAgMTAwIDUwMlQxMzUgNTE1UTE1OCA1MTUgMTcxIDUwM1QxODQgNDY3UTE4NCA0MjAgMTM1IDQyMFExMTIgNDIwIDEwMCA0MzJUODcgNDY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTI7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNDcyIDE0MlE0NDEgMTE2IDQwNiA5OVQzMjggNzdWMEgyNzBWNzhRMjE4IDgzIDE4MiAxMDVUMTI0IDE2M1Q5MSAyNDRUODAgMzQxUTgwIDM5MCA5MSA0MzRUMTI1IDUxMlQxODQgNTY5VDI3MCA1OThWNjY3SDMyOFY1OTlRMzY4IDU5NyA0MDMgNTgyVDQ3MSA1NDJMNDQ1IDQ5N1EzODggNTUxIDMwOCA1NTFRMjYxIDU1MSAyMzAgNTM0VDE3OSA0ODhUMTUxIDQyMlQxNDMgMzQyUTE0MyAzMDAgMTUxIDI2MVQxNzcgMTkyVDIyNyAxNDRUMzA0IDEyNlEzNDIgMTI2IDM3NiAxNDBUNDQ0IDE4NEw0NzIgMTQySDQ3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEzOyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTQ4OCAwSDY2VjUySDgzUTEyOSA1MiAxNTYgODdUMTgzIDE4NlExODMgMjE4IDE3NiAyNTlUMTU5IDMzNkg4MlYzODVIMTQ4UTEzOSA0MjggMTMwIDQ2M1QxMjEgNTMwUTEyMSA2MDIgMTY2IDY0MFQyOTAgNjc4UTMzMiA2NzggMzc1IDY2NlQ0NTQgNjMxTDQzNSA1ODBRNDA2IDYwMCAzNzMgNjEyVDI5OCA2MjVRMjM4IDYyNSAyMTEgNjAwVDE4NCA1MjRRMTg0IDQ4OSAxOTIgNDU0VDIwOCAzODVIMzU1VjMzNkgyMTdRMjI4IDI5OCAyMzUgMjYyVDI0MyAxODRRMjQzIDEzOCAyMjkgMTA3VDE5MiA1N1Y1NEg0ODhWMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE0OyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTc5IDM0MlE3OSAzNzYgOTAgNDA2VDEyMSA0NjBMNTYgNTI1TDkwIDU1OUwxNTUgNDkzUTE4MCA1MTMgMjEwIDUyNFQyNzYgNTM2UTMxMSA1MzYgMzQxIDUyNVQzOTcgNDkzTDQ2MyA1NTlMNDk3IDUyNUw0MzEgNDU5UTQ3MyA0MDkgNDczIDMzOVE0NzMgMzA0IDQ2MiAyNzRUNDMwIDIxOEw0OTcgMTUxTDQ2MyAxMTdMMzk2IDE4NFEzNzEgMTY0IDM0MSAxNTRUMjc2IDE0M1EyNDIgMTQzIDIxMiAxNTNUMTU2IDE4NEw5MCAxMThMNTYgMTUyTDEyMiAyMThRMTAxIDI0MiA5MCAyNzNUNzkgMzM5VjM0MlpNMTM0IDM0MFExMzQgMzEwIDE0NSAyODRUMTc1IDIzOVQyMjEgMjA4VDI3NiAxOTdRMzA2IDE5NyAzMzEgMjA4VDM3NiAyMzhUNDA3IDI4NFQ0MTggMzQwUTQxOCAzNjkgNDA3IDM5NVQzNzcgNDQwVDMzMiA0NzFUMjc2IDQ4MlEyNDcgNDgyIDIyMSA0NzFUMTc2IDQ0MVQxNDUgMzk1VDEzNCAzNDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik0zNTIgMzQzSDQ4NFYyOThIMzI2TDMwOSAyNjdWMTk5SDQ4NFYxNTVIMzA5VjBIMjQ3VjE1NUg3M1YxOTlIMjQ3VjI2NEwyMjggMjk4SDczVjM0M0gyMDJMMzYgNjY3SDEwNkwyNzkgMzIwTDQ1MCA2NjdINTE4TDM1MiAzNDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNjsiIGhvcml6LWFkdi14PSIyMTYiIGQ9Ik04MiAzMjNWNzQwSDEzNFYzMjNIODJaTTgyIC0yMDBWMjE3SDEzNFYtMjAwSDgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTc7IiBob3Jpei1hZHYteD0iNDgzIiBkPSJNNDE1IDI5MVE0MTUgMjY3IDQwOCAyNDZUMzgyIDIwOVQzMzUgMTgyVDI2MiAxNzBWMTY4UTMzNSAxNDIgMzc4IDEwNVQ0MjEgNVE0MjEgLTE1IDQxNSAtMzhUMzkwIC04MVQzMzggLTExNFQyNTIgLTEyOFEyMDQgLTEyOCAxNjUgLTExOFQ4NCAtODRMMTA2IC0zNVExMzggLTU3IDE3NSAtNjhUMjQ3IC04MFEzMDQgLTgwIDMzMCAtNThUMzU3IDZRMzU3IDIzIDM1MyAzNlQzMzggNjJUMzA5IDg1VDI2NCAxMDlRMjU4IDExMSAyNDcgMTE2VDIyMyAxMjZUMjAxIDEzNlQxODYgMTQzUTExOSAxNzMgOTEgMjA1VDYyIDI4NFE2MiAzMTcgNzQgMzM5VDEwNyAzNzZUMTU1IDM5OFQyMTQgNDA2VjQwOFExODggNDE4IDE2NCA0MzFUMTE5IDQ2MlQ4NyA1MDJUNzUgNTUxUTc1IDYwOSAxMTggNjQzVDI0NiA2NzhRMjg0IDY3OCAzMTggNjcwVDM4OSA2NDdMMzc0IDU5N1EzNDQgNjExIDMxMyA2MjBUMjUwIDYyOVEyMjkgNjI5IDIwOSA2MjZUMTczIDYxNFQxNDggNTkwVDEzOCA1NTNRMTM4IDUyNCAxNTggNTAyVDIwOCA0NjVRMjMyIDQ1NSAyNTcgNDQ1VDMxNCA0MThRMzM4IDQwNyAzNTYgMzk3VDM4OCAzNzJUNDA4IDMzOVQ0MTUgMjkxWk0zNTYgMjg2UTM1NiAzMDMgMzUyIDMxOFQzMzUgMzQ2VDI5OSAzNjVUMjM5IDM3MlEyMjEgMzcyIDIwMCAzNzBUMTYxIDM1OVQxMzIgMzMzVDEyMCAyODVRMTIwIDI3NiAxMjMgMjYyVDEzNyAyMzRUMTczIDIxMFQyMzkgMjAwUTMwMyAyMDAgMzI5IDIyMFQzNTYgMjg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTg7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMzA2IDYxNFEzMDYgNTk3IDI5NCA1ODVUMjY1IDU3M1EyNDggNTczIDIzNiA1ODVUMjI0IDYxNFEyMjQgNjMxIDIzNiA2NDNUMjY1IDY1NVEyODIgNjU1IDI5NCA2NDNUMzA2IDYxNFpNMTM3IDYxNFExMzcgNTk3IDEyNSA1ODVUOTYgNTczUTc5IDU3MyA2NyA1ODVUNTUgNjE0UTU1IDYzMSA2NyA2NDNUOTYgNjU1UTExMyA2NTUgMTI1IDY0M1QxMzcgNjE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTk7IiBob3Jpei1hZHYteD0iOTA2IiBkPSJNNzk5IDMzNFE3OTkgMjYyIDc3MiAyMDBUNjk4IDkxVDU4OCAxN1Q0NTMgLTEwUTM4MSAtMTAgMzE4IDE3VDIwOCA5MFQxMzQgMTk5VDEwNyAzMzRRMTA3IDQwNiAxMzQgNDY4VDIwOCA1NzdUMzE4IDY1MVQ0NTMgNjc4UTUyNSA2NzggNTg4IDY1MVQ2OTggNTc4VDc3MiA0NjlUNzk5IDMzNFpNNzY2IDMzNFE3NjYgMzk4IDc0MiA0NTRUNjc2IDU1NFQ1NzcgNjIyVDQ1MyA2NDdRMzg2IDY0NyAzMjkgNjIyVDIzMCA1NTRUMTY1IDQ1NVQxNDEgMzM0UTE0MSAyNzAgMTY2IDIxNFQyMzMgMTE1VDMzMiA0OFQ0NTMgMjNRNTE3IDIzIDU3MyA0N1Q2NzMgMTE0VDc0MSAyMTNUNzY2IDMzNFpNNjE0IDE3M1E1ODIgMTQ1IDU0NSAxMjlUNDYwIDExMlE0MDIgMTEyIDM2NCAxMjhUMzA0IDE3M1QyNzIgMjQzVDI2MyAzMzRRMjYzIDM4NSAyNzMgNDI1VDMwNyA0OTRUMzY5IDUzOFQ0NjQgNTUzUTUxMCA1NTMgNTQ2IDUzOFQ2MTUgNDk0TDU5MiA0NThRNTY2IDQ4MyA1MzUgNDk3VDQ2NSA1MTFRNDE4IDUxMSAzODkgNDk5VDM0MyA0NjNUMzIwIDQwOFQzMTMgMzM1UTMxMyAyOTQgMzE5IDI2MVQzNDEgMjAzVDM4NiAxNjZUNDYxIDE1M1E0OTkgMTUzIDUzMCAxNjhUNTkxIDIxMEw2MTQgMTczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUE7IiBob3Jpei1hZHYteD0iMzc3IiBkPSJNMjg4IDM3MFEyNzMgMzc2IDI2NiAzODNUMjU0IDQwMkgyNTJRMjMwIDM4NSAyMDMgMzc2VDE1MCAzNjZRMTEwIDM2NiA4NCAzODlUNTcgNDU4UTU3IDQ5MSA3MiA1MTJUMTEzIDU0N1QxNzUgNTY2VDI1MSA1NzJWNTgxUTI1MSA2MTQgMjQxIDYyN1QxOTYgNjQxUTE2OSA2NDEgMTQ0IDYzNlQ4MCA2MTBMNjMgNjQzUTk4IDY2MyAxMjkgNjcxVDE5NiA2ODBRMjQ1IDY4MCAyNzEgNjU5VDI5NyA1ODhWNDQwUTI5NyA0MjEgMjk5IDQxNlQzMTUgNDAzTDI4OCAzNzBaTTI1MSA1NDJRMTc2IDU0MiAxNDAgNTIwVDEwMyA0NTdRMTAzIDQzMSAxMTkgNDE1VDE1OSAzOTlRMTgwIDM5OSAyMDIgNDA3VDI1MSA0MzVWNTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUI7IiBob3Jpei1hZHYteD0iNDMwIiBkPSJNMzM5IDExN0wxOTIgMzA5TDMzOSA1MDJMMzgxIDQ3NkwyNTAgMzA5TDM4MCAxNDRMMzM5IDExN1pNMTcxIDExNEwyMSAzMDlMMTcwIDUwNUwyMTIgNDc5TDgwIDMwOUwyMTIgMTQxTDE3MSAxMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQzsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00NDYgMjMxSDU0VjI4NUg1MDBWNDlINDQ2VjIzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFEOyIgaG9yaXotYWR2LXg9IjM2OSIgZD0iTTUyIDIzMlYyODZIMzE3VjIzMkg1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFFOyIgaG9yaXotYWR2LXg9IjQ3OSIgZD0iTTIyNiAzNjFRMTkwIDM2MSAxNTggMzc0VDEwMiA0MTFUNjUgNDY0VDUxIDUzMFE1MSA1NjUgNjQgNTk2VDEwMiA2NTBUMTU4IDY4NlQyMjYgNzAwUTI2MiA3MDAgMjkzIDY4N1QzNDkgNjUwVDM4NiA1OTZUNDAwIDUzMFE0MDAgNDk1IDM4NyA0NjVUMzQ5IDQxMVQyOTQgMzc1VDIyNiAzNjFaTTIyNyA2NzZRMTk1IDY3NiAxNjggNjY0VDEyMCA2MzJUODggNTg2VDc2IDUzMFE3NiA1MDEgODggNDc1VDEyMSA0MjlUMTY5IDM5N1QyMjYgMzg1UTI1NiAzODUgMjgzIDM5NlQzMzEgNDI3VDM2NCA0NzNUMzc2IDUzMFEzNzYgNTU5IDM2NSA1ODVUMzMzIDYzMlQyODUgNjY0VDIyNyA2NzZaTTE2NCA2MjNRMTg0IDYyNSAxOTkgNjI2VDIyOCA2MjdRMjU2IDYyNyAyNzkgNjE1VDMwMiA1NjhRMzAyIDU1MSAyOTQgNTQwVDI3MiA1MTlMMzA2IDQzOUgyNjhMMjQxIDUwM1EyMzkgNTA4IDIzOCA1MDlUMjMwIDUxMEgxOTdWNDM5SDE2NFY2MjNaTTIyOSA1OTZRMjIxIDU5NiAyMTQgNTk2VDE5OCA1OTVWNTM4SDIzMVEyNDcgNTM4IDI1OCA1NDVUMjY5IDU2NlEyNjkgNTgzIDI1OSA1ODlUMjI5IDU5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFGOyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTM3IDU5MFY2MzJIMzIyVjU5MEgzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIwOyIgaG9yaXotYWR2LXg9IjM4OSIgZD0iTTMzMiA1NDJRMzMyIDUxMyAzMjEgNDg4VDI5MiA0NDVUMjQ4IDQxNVQxOTUgNDA0UTE2NiA0MDQgMTQxIDQxNVQ5NyA0NDRUNjggNDg4VDU3IDU0MlE1NyA1NzAgNjcgNTk1VDk3IDYzOVQxNDEgNjY5VDE5NSA2ODBRMjIzIDY4MCAyNDggNjY5VDI5MSA2NDBUMzIxIDU5NlQzMzIgNTQyWk0yOTggNTQyUTI5OCA1NjMgMjkwIDU4MlQyNjggNjE1VDIzNSA2MzdUMTk1IDY0NVExNzMgNjQ1IDE1NCA2MzdUMTIxIDYxNVQ5OCA1ODJUOTAgNTQyUTkwIDUyMSA5OCA1MDJUMTIwIDQ2OVQxNTQgNDQ3VDE5NSA0MzlRMjE2IDQzOSAyMzUgNDQ3VDI2OCA0NjlUMjkwIDUwMlQyOTggNTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjE7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNMzA3IDI2MVY5MkgyNTJWMjYxSDU0VjMxNUgyNTJWNTA2SDMwN1YzMTVINTAwVjI2MUgzMDdaTTU0IDBWNTNINTAwVjBINTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMjsiIGhvcml6LWFkdi14PSIyOTkiIGQ9Ik00MiAzNjdMMzUgNDExUTc5IDQ1MCAxMTEgNDc3VDE2NSA1MjdUMTk2IDU2OFQyMDcgNjEwUTIwNyA2MTkgMjA1IDYyOFQxOTYgNjQ0VDE3OSA2NTdUMTUxIDY2MlExMjggNjYyIDEwOSA2NTJUNjkgNjE5TDQyIDY0OVE2OSA2NzYgOTYgNjg4VDE1NiA3MDBRMjAxIDcwMCAyMjcgNjc4VDI1NCA2MTFRMjU0IDU5MSAyNDggNTczVDIyMyA1MzJUMTcyIDQ3OVQ4NCA0MDZIMjU4VjM2N0g0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIzOyIgaG9yaXotYWR2LXg9IjI5MiIgZD0iTTI1MSA0NTlRMjUxIDQxOCAyMjUgMzkwVDEzNyAzNjFRMTA3IDM2MSA4MiAzNjlUMzAgMzk2TDUwIDQzMFE3MiA0MTMgOTIgNDA2VDEzNCAzOThRMTYzIDM5OCAxODQgNDEyVDIwNSA0NjFRMjA1IDQ5MiAxODkgNTA1VDEzNiA1MTlIOTlWNTU1SDExN1ExNjMgNTU1IDE3OSA1NzFUMTk2IDYxMFExOTYgNjYyIDEzNiA2NjJRMTE1IDY2MiA5NSA2NTVUNTcgNjMyTDM1IDY2NVE2MyA2ODUgODcgNjkyVDE0MSA3MDBRMTg1IDcwMCAyMTMgNjc5VDI0MiA2MTJRMjQyIDU4OCAyMjkgNTcwVDE5MyA1NDNWNTQyUTI1MSA1MjggMjUxIDQ1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTExOSA1NjVMODggNTg5TDIyNCA3MDRMMjgxIDY3MUwxMTkgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjU7IiBob3Jpei1hZHYteD0iNTY4IiBkPSJNNDIzIDBMNDE1IDY1SDQxM1E0MDQgNTAgMzkyIDM3VDM2MiAxM1QzMjEgLTRUMjY3IC0xMVEyNTAgLTExIDIzMyAtOVQyMDEgLTFUMTczIDE2VDE1MSA0NFYtMjIwSDk2VjUwMkgxNTZWMjM4UTE1NiAxOTAgMTU5IDE1M1QxNzQgOTFUMjA5IDU0VDI3MyA0MVEzNTAgNDEgMzgxIDgxVDQxMiAxODhWNTAySDQ3MlYwSDQyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI2OyIgaG9yaXotYWR2LXg9IjQ3MyIgZD0iTTM0NSAwUTI3MyAwIDIxOCAxOVQxMjYgNzNUNzEgMTUzVDUyIDI1MlE1MiAzMDQgNzAgMzQ5VDEyNiA0MjlUMjE4IDQ4MlQzNDUgNTAySDM4MVYwSDM0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI3OyIgaG9yaXotYWR2LXg9IjE4NCIgZD0iTTEzOSAyMzVRMTM5IDIxMiAxMjcgMjAwVDkxIDE4N1E2OSAxODcgNTcgMTk5VDQ0IDIzNVE0NCAyODIgOTIgMjgyUTEzOSAyODIgMTM5IDIzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI4OyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTI2OSAtMTI0UTI2OSAtMTYwIDI0NSAtMTgxVDE3NiAtMjAzUTE1MyAtMjAzIDEzNCAtMTk3VDk3IC0xNzlMMTExIC0xNTFRMTI5IC0xNjAgMTQzIC0xNjRUMTczIC0xNjlRMTk3IC0xNjkgMjEzIC0xNjBUMjI5IC0xMjVRMjI5IC05OSAyMTMgLTkxVDE3MyAtODNRMTYzIC04MyAxNTYgLTg0VDEzOSAtODhMMTI2IC03MkwxNjUgMEgyMDRMMTczIC01M0gxNzRIMTk5UTIzMSAtNTMgMjUwIC03MFQyNjkgLTEyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI5OyIgaG9yaXotYWR2LXg9IjI2OCIgZD0iTTExOSA0MDVWNjQxSDExN0w0NiA1OTlMMjkgNjMzTDEyOCA2OTRIMTY0VjQwNUgyNDVWMzY3SDM2VjQwNUgxMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQTsiIGhvcml6LWFkdi14PSIzNzciIGQ9Ik0zMjUgNTIzUTMyNSA0NDggMjkwIDQwN1QxODkgMzY2UTEyNCAzNjYgODggNDA3VDUyIDUyM1E1MiA1OTggODggNjM5VDE4OSA2ODBRMjUzIDY4MCAyODkgNjM5VDMyNSA1MjNaTTI3OSA1MjNRMjc5IDU3NSAyNjAgNjA3VDE4OSA2NDBRMTM2IDY0MCAxMTcgNjA4VDk4IDUyM1E5OCA0NTYgMTIyIDQzMVQxODkgNDA1UTIzMCA0MDUgMjU0IDQzMFQyNzkgNTIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkI7IiBob3Jpei1hZHYteD0iNDI5IiBkPSJNMjU5IDExNEwyMTggMTQxTDM0OSAzMDlMMjE3IDQ3OUwyNTkgNTA1TDQwOCAzMDlMMjU5IDExNFpNOTAgMTE3TDQ5IDE0NEwxNzkgMzA5TDQ5IDQ3Nkw5MCA1MDJMMjM4IDMwOUw5MCAxMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGhvcml6LWFkdi14PSI3MTgiIGQ9Ik0xNTQgNDA1VjY0MUgxNTJMODEgNTk5TDY0IDYzM0wxNjMgNjk0SDE5OVY0MDVIMjgwVjM2N0g3MVY0MDVIMTU0Wk0xODEgMEgxMzlMNjEwIDcwMEg2NTJMMTgxIDBaTTYzMiA3MFYwSDU4NVY3MEg0NDNMNDMwIDEwOEw1NzggMzI3SDYzMlYxMDlINjgyVjcwSDYzMlpNNDc0IDEwN0g1ODZWMjc5TDQ3NCAxMDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRDsiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik0xNDQgNDA1VjY0MUgxNDJMNzEgNTk5TDU0IDYzM0wxNTMgNjk0SDE4OVY0MDVIMjcwVjM2N0g2MVY0MDVIMTQ0Wk0xMzggMEg5Nkw1NjcgNzAwSDYwOUwxMzggMFpNNDI5IDBMNDIyIDQ0UTQ2NiA4MyA0OTggMTEwVDU1MiAxNjBUNTgzIDIwMVQ1OTQgMjQzUTU5NCAyNTIgNTkyIDI2MVQ1ODMgMjc3VDU2NiAyOTBUNTM4IDI5NVE1MTUgMjk1IDQ5NiAyODVUNDU2IDI1Mkw0MjkgMjgyUTQ1NiAzMDkgNDgzIDMyMVQ1NDMgMzMzUTU4OCAzMzMgNjE0IDMxMVQ2NDEgMjQ0UTY0MSAyMjQgNjM1IDIwNlQ2MTAgMTY1VDU1OSAxMTJUNDcxIDM5SDY0NVYwSDQyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJFOyIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTI4NSA0NTlRMjg1IDQxOCAyNTkgMzkwVDE3MSAzNjFRMTQxIDM2MSAxMTYgMzY5VDY0IDM5Nkw4NCA0MzBRMTA2IDQxMyAxMjYgNDA2VDE2OCAzOThRMTk3IDM5OCAyMTggNDEyVDIzOSA0NjFRMjM5IDQ5MiAyMjMgNTA1VDE3MCA1MTlIMTMzVjU1NUgxNTFRMTk3IDU1NSAyMTMgNTcxVDIzMCA2MTBRMjMwIDY2MiAxNzAgNjYyUTE0OSA2NjIgMTI5IDY1NVQ5MSA2MzJMNjkgNjY1UTk3IDY4NSAxMjEgNjkyVDE3NSA3MDBRMjE5IDcwMCAyNDcgNjc5VDI3NiA2MTJRMjc2IDU4OCAyNjMgNTcwVDIyNyA1NDNWNTQyUTI4NSA1MjggMjg1IDQ1OVpNMTYxIDBIMTE5TDU5MCA3MDBINjMyTDE2MSAwWk02MDMgNzBWMEg1NTZWNzBINDE0TDQwMSAxMDhMNTQ5IDMyN0g2MDNWMTA5SDY1M1Y3MEg2MDNaTTQ0NSAxMDdINTU3VjI3OUw0NDUgMTA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkY7IiBob3Jpei1hZHYteD0iNDk5IiBkPSJNNTYgLThRNTYgNTUgODIgOTVUMTc1IDE2OEwyMzMgMTk1UTI1MSAyMDQgMjYxIDIwOVQyNzUgMjIyVDI4MSAyNDFUMjgyIDI3MVYzNDRIMzQzVjI2MlEzNDMgMjM5IDM0MSAyMjRUMzMxIDE5N1QzMTEgMTc3VDI3NyAxNThMMjIzIDEzNFExOTEgMTIwIDE3MSAxMDZUMTM5IDc2VDEyMyA0MVQxMTggLTNRMTE4IC02MCAxNTQgLTkwVDI1NiAtMTIxUTI5NyAtMTIxIDMzNSAtMTA4VDQxNSAtNjFMNDQ2IC0xMDdRMzk3IC0xNDIgMzUxIC0xNTdUMjUxIC0xNzNRMTU3IC0xNzMgMTA3IC0xMjhUNTYgLThaTTI2NyA0NjhRMjY3IDUxNSAzMTMgNTE1UTMzNSA1MTUgMzQ3IDUwM1QzNjAgNDY4UTM2MCA0MjIgMzEzIDQyMlEyNjcgNDIyIDI2NyA0NjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMDsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01MTggMEw0NTggMTcxSDE1M0w5MyAwSDI4TDI2OCA2NzFIMzQzTDU4NSAwSDUxOFpNMzA2IDYxMUgzMDRMMTY4IDIyNUg0NDBMMzA2IDYxMVpNMzI2IDcwNUwxNjQgODA5TDIyNCA4NDFMMzU3IDcyN0wzMjYgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzE7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDU4IDE3MUgxNTNMOTMgMEgyOEwyNjggNjcxSDM0M0w1ODUgMEg1MThaTTMwNiA2MTFIMzA0TDE2OCAyMjVINDQwTDMwNiA2MTFaTTI5MSA3MDVMMjYwIDcyOUwzOTYgODQ0TDQ1MyA4MTFMMjkxIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTUxOCAwTDQ1OCAxNzFIMTUzTDkzIDBIMjhMMjY4IDY3MUgzNDNMNTg1IDBINTE4Wk0zMDYgNjExSDMwNEwxNjggMjI1SDQ0MEwzMDYgNjExWk00MTkgNzA0TDMwNCA3ODZMMTkwIDcwNEwxNjMgNzM5TDMwNCA4MzhMNDQ3IDczOUw0MTkgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzM7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDU4IDE3MUgxNTNMOTMgMEgyOEwyNjggNjcxSDM0M0w1ODUgMEg1MThaTTMwNiA2MTFIMzA0TDE2OCAyMjVINDQwTDMwNiA2MTFaTTQ1OCA3NzRRNDQ5IDc0MiA0MjQgNzI3VDM3MiA3MTJRMzU2IDcxMiAzMzkgNzE4VDMwNSA3MzFUMjczIDc0NFQyNDQgNzUwUTIyOCA3NTAgMjEyIDc0M1QxODcgNzExTDE1MiA3MzRRMTY4IDc3MCAxOTEgNzgzVDI0MCA3OTZRMjU2IDc5NiAyNzMgNzkwVDMwNyA3NzdUMzM5IDc2NFQzNjkgNzU4UTM4NiA3NTggNDAwIDc2NlQ0MjIgNzk2TDQ1OCA3NzRINDU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzQ7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDU4IDE3MUgxNTNMOTMgMEgyOEwyNjggNjcxSDM0M0w1ODUgMEg1MThaTTMwNiA2MTFIMzA0TDE2OCAyMjVINDQwTDMwNiA2MTFaTTQzMSA3NTRRNDMxIDczNyA0MTkgNzI1VDM5MCA3MTNRMzczIDcxMyAzNjEgNzI1VDM0OSA3NTRRMzQ5IDc3MSAzNjEgNzgzVDM5MCA3OTVRNDA3IDc5NSA0MTkgNzgzVDQzMSA3NTRaTTI2MiA3NTRRMjYyIDczNyAyNTAgNzI1VDIyMSA3MTNRMjA0IDcxMyAxOTIgNzI1VDE4MCA3NTRRMTgwIDc3MSAxOTIgNzgzVDIyMSA3OTVRMjM4IDc5NSAyNTAgNzgzVDI2MiA3NTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNTsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik00MDcgNzMwUTQwNyA3MDAgMzkyIDY3N1QzNTMgNjQyTDU4NSAwSDUxOEw0NTggMTcxSDE1M0w5MyAwSDI4TDI1NyA2NDFRMjMyIDY1MiAyMTcgNjc2VDIwMSA3MzBRMjAxIDc1MSAyMDkgNzY5VDIzMSA4MDFUMjY0IDgyM1QzMDUgODMxUTMyNiA4MzEgMzQ0IDgyM1QzNzcgODAyVDM5OSA3NzBUNDA3IDczMFpNMzA2IDYxNEgzMDRMMTY4IDIyNUg0NDBMMzA2IDYxNFpNMzY4IDczMFEzNjggNzU2IDM1MCA3NzRUMzA1IDc5M1EyNzggNzkzIDI2MCA3NzVUMjQxIDczMFEyNDEgNzAyIDI1OSA2ODRUMzA1IDY2NVEzMzEgNjY1IDM0OSA2ODNUMzY4IDczMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM2OyIgaG9yaXotYWR2LXg9Ijg2OCIgZD0iTTQ0OSAwVjE3MUgxOTBMOTQgMEgyNUw0MTEgNjY3SDgyMFY2MTNINTEyVjM4NUg3OTBWMzMwSDUxMlY1NEg4MzBWMEg0NDlaTTQ1MCA2MTBINDQyTDIxNyAyMjZINDUwVjYxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM3OyIgaG9yaXotYWR2LXg9IjYxNCIgZD0iTTQzOCAtMTI3UTQzOCAtMTY1IDQxMyAtMTg1VDM0NyAtMjA1UTMyNSAtMjA1IDMwNCAtMTk5VDI2NiAtMTgzTDI4MSAtMTU0UTI5NSAtMTYyIDMxMCAtMTY3VDM0NiAtMTczUTM2NiAtMTczIDM4MiAtMTY0VDM5OCAtMTI5UTM5OCAtMTA0IDM4MyAtOTVUMzQ1IC04NlEzMjYgLTg2IDMwOCAtOTFMMjk1IC03NkwzMzEgLTEwUTIwMiAtMiAxMzYgODdUNjkgMzM0UTY5IDM5OCA4NCA0NjBUMTM1IDU3MFQyMjUgNjQ4VDM2MSA2NzhRNDIxIDY3OCA0NzIgNjU4VDU3NSA1OTZMNTM3IDU1MlE0OTIgNTkwIDQ1MSA2MDdUMzYyIDYyNVEzMTIgNjI1IDI3MCA2MDdUMTk4IDU1M1QxNTIgNDYzVDEzNSAzMzRRMTM1IDI4MSAxNDUgMjI5VDE4MCAxMzZUMjQ5IDY4VDM1OSA0MlE0MDUgNDIgNDUyIDYwVDU0NSAxMjBMNTgwIDc2UTUyOCAzMSA0NzggMTFUMzY4IC0xMUwzNDEgLTU4TDM0MiAtNTlRMzU0IC01NiAzNjggLTU2UTQwMCAtNTYgNDE5IC03NFQ0MzggLTEyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM4OyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTkyIDBWNjY3SDQ2MlY2MTJIMTU1VjM4NUg0MzNWMzMwSDE1NVY1NEg0NzNWMEg5MlpNMzI3IDcwNUwxNjUgODA5TDIyNSA4NDFMMzU4IDcyN0wzMjcgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzk7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNOTIgMFY2NjdINDYyVjYxMkgxNTVWMzg1SDQzM1YzMzBIMTU1VjU0SDQ3M1YwSDkyWk0yNTUgNzA1TDIyNCA3MjlMMzYwIDg0NEw0MTcgODExTDI1NSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQTsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwVjY2N0g0NjJWNjEySDE1NVYzODVINDMzVjMzMEgxNTVWNTRINDczVjBIOTJaTTM5NCA3MDRMMjc5IDc4NkwxNjUgNzA0TDEzOCA3MzlMMjc5IDgzOEw0MjIgNzM5TDM5NCA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQjsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwVjY2N0g0NjJWNjEySDE1NVYzODVINDMzVjMzMEgxNTVWNTRINDczVjBIOTJaTTQwNiA3NTRRNDA2IDczNyAzOTQgNzI1VDM2NSA3MTNRMzQ4IDcxMyAzMzYgNzI1VDMyNCA3NTRRMzI0IDc3MSAzMzYgNzgzVDM2NSA3OTVRMzgyIDc5NSAzOTQgNzgzVDQwNiA3NTRaTTIzNyA3NTRRMjM3IDczNyAyMjUgNzI1VDE5NiA3MTNRMTc5IDcxMyAxNjcgNzI1VDE1NSA3NTRRMTU1IDc3MSAxNjcgNzgzVDE5NiA3OTVRMjEzIDc5NSAyMjUgNzgzVDIzNyA3NTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQzsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwVjY2N0gxNTVWMEg5MlpNMTQ0IDcwNUwtMTggODA5TDQyIDg0MUwxNzUgNzI3TDE0NCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRDsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwVjY2N0gxNTVWMEg5MlpNMTA5IDcwNUw3OCA3MjlMMjE0IDg0NEwyNzEgODExTDEwOSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRTsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwVjY2N0gxNTVWMEg5MlpNMjQxIDcwNEwxMjYgNzg2TDEyIDcwNEwtMTUgNzM5TDEyNiA4MzhMMjY5IDczOUwyNDEgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Y7IiBob3Jpei1hZHYteD0iMjQ3IiBkPSJNOTIgMFY2NjdIMTU1VjBIOTJaTTI1MCA3NTRRMjUwIDczNyAyMzggNzI1VDIwOSA3MTNRMTkyIDcxMyAxODAgNzI1VDE2OCA3NTRRMTY4IDc3MSAxODAgNzgzVDIwOSA3OTVRMjI2IDc5NSAyMzggNzgzVDI1MCA3NTRaTTgxIDc1NFE4MSA3MzcgNjkgNzI1VDQwIDcxM1EyMyA3MTMgMTEgNzI1VC0xIDc1NFEtMSA3NzEgMTEgNzgzVDQwIDc5NVE1NyA3OTUgNjkgNzgzVDgxIDc1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQwOyIgaG9yaXotYWR2LXg9IjY1MCIgZD0iTTU4MSAzMzhRNTgxIDI3NiA1NjcgMjE2VDUxOCAxMDdUNDI1IDMwVDI3OSAwSDkyVjMzMkgzMlYzODVIOTJWNjY0UTExMyA2NjYgMTM3IDY2OFQxODcgNjcxVDIzNiA2NzRUMjc5IDY3NVEzNTggNjc1IDQxNSA2NTBUNTA5IDU3OVQ1NjMgNDczVDU4MSAzMzhaTTUxNiAzMzhRNTE2IDM4NiA1MDcgNDM2VDQ3MSA1MjdUNDAwIDU5NFQyODMgNjIwUTI1MCA2MjAgMjE3IDYxOVQxNTUgNjE0VjM4NUgzMTFWMzMySDE1NVY1M0gyNjNRMzk3IDUzIDQ1NiAxMjZUNTE2IDMzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQxOyIgaG9yaXotYWR2LXg9IjY4NCIgZD0iTTUzMCAwTDE1OCA1NjBIMTU0VjBIOTJWNjY3SDE1OUw1MjYgMTEwSDUzMFY2NjdINTkyVjBINTMwWk01MDYgNzc0UTQ5NyA3NDIgNDcyIDcyN1Q0MjAgNzEyUTQwNCA3MTIgMzg3IDcxOFQzNTMgNzMxVDMyMSA3NDRUMjkyIDc1MFEyNzYgNzUwIDI2MCA3NDNUMjM1IDcxMUwyMDAgNzM0UTIxNiA3NzAgMjM5IDc4M1QyODggNzk2UTMwNCA3OTYgMzIxIDc5MFQzNTUgNzc3VDM4NyA3NjRUNDE3IDc1OFE0MzQgNzU4IDQ0OCA3NjZUNDcwIDc5Nkw1MDYgNzc0SDUwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQyOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTY2MyAzMzRRNjYzIDI2NyA2NDggMjA1VDU5NyA5NFQ1MDYgMThUMzY2IC0xMVEyODMgLTExIDIyNyAxN1QxMzUgOTRUODUgMjA0VDY5IDMzNFE2OSAzOTggODQgNDU5VDEzMyA1NjlUMjI1IDY0OFQzNjYgNjc4UTQ0OSA2NzggNTA2IDY0OVQ1OTggNTcyVDY0OCA0NjJUNjYzIDMzNFpNNTk3IDMzM1E1OTcgMzg1IDU4NyA0MzdUNTUxIDUzMlQ0ODEgNjAwVDM2NiA2MjdRMjk3IDYyNyAyNTIgNjAxVDE4MSA1MzJUMTQ1IDQzOFQxMzUgMzMzUTEzNSAyODIgMTQ1IDIzMFQxODEgMTM2VDI1MiA2OFQzNjYgNDFRNDM2IDQxIDQ4MCA2N1Q1NTEgMTM2VDU4NyAyMzBUNTk3IDMzM1pNNDI1IDcwNkwyNjMgODEwTDMyMyA4NDJMNDU2IDcyOEw0MjUgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDM7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNjYzIDMzNFE2NjMgMjY3IDY0OCAyMDVUNTk3IDk0VDUwNiAxOFQzNjYgLTExUTI4MyAtMTEgMjI3IDE3VDEzNSA5NFQ4NSAyMDRUNjkgMzM0UTY5IDM5OCA4NCA0NTlUMTMzIDU2OVQyMjUgNjQ4VDM2NiA2NzhRNDQ5IDY3OCA1MDYgNjQ5VDU5OCA1NzJUNjQ4IDQ2MlQ2NjMgMzM0Wk01OTcgMzMzUTU5NyAzODUgNTg3IDQzN1Q1NTEgNTMyVDQ4MSA2MDBUMzY2IDYyN1EyOTcgNjI3IDI1MiA2MDFUMTgxIDUzMlQxNDUgNDM4VDEzNSAzMzNRMTM1IDI4MiAxNDUgMjMwVDE4MSAxMzZUMjUyIDY4VDM2NiA0MVE0MzYgNDEgNDgwIDY3VDU1MSAxMzZUNTg3IDIzMFQ1OTcgMzMzWk0zNDMgNzA2TDMxMiA3MzBMNDQ4IDg0NUw1MDUgODEyTDM0MyA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENDsiIGhvcml6LWFkdi14PSI3MzIiIGQ9Ik02NjMgMzM0UTY2MyAyNjcgNjQ4IDIwNVQ1OTcgOTRUNTA2IDE4VDM2NiAtMTFRMjgzIC0xMSAyMjcgMTdUMTM1IDk0VDg1IDIwNFQ2OSAzMzRRNjkgMzk4IDg0IDQ1OVQxMzMgNTY5VDIyNSA2NDhUMzY2IDY3OFE0NDkgNjc4IDUwNiA2NDlUNTk4IDU3MlQ2NDggNDYyVDY2MyAzMzRaTTU5NyAzMzNRNTk3IDM4NSA1ODcgNDM3VDU1MSA1MzJUNDgxIDYwMFQzNjYgNjI3UTI5NyA2MjcgMjUyIDYwMVQxODEgNTMyVDE0NSA0MzhUMTM1IDMzM1ExMzUgMjgyIDE0NSAyMzBUMTgxIDEzNlQyNTIgNjhUMzY2IDQxUTQzNiA0MSA0ODAgNjdUNTUxIDEzNlQ1ODcgMjMwVDU5NyAzMzNaTTQ4NSA3MDRMMzcwIDc4NkwyNTYgNzA0TDIyOSA3MzlMMzcwIDgzOEw1MTMgNzM5TDQ4NSA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENTsiIGhvcml6LWFkdi14PSI3MzIiIGQ9Ik02NjMgMzM0UTY2MyAyNjcgNjQ4IDIwNVQ1OTcgOTRUNTA2IDE4VDM2NiAtMTFRMjgzIC0xMSAyMjcgMTdUMTM1IDk0VDg1IDIwNFQ2OSAzMzRRNjkgMzk4IDg0IDQ1OVQxMzMgNTY5VDIyNSA2NDhUMzY2IDY3OFE0NDkgNjc4IDUwNiA2NDlUNTk4IDU3MlQ2NDggNDYyVDY2MyAzMzRaTTU5NyAzMzNRNTk3IDM4NSA1ODcgNDM3VDU1MSA1MzJUNDgxIDYwMFQzNjYgNjI3UTI5NyA2MjcgMjUyIDYwMVQxODEgNTMyVDE0NSA0MzhUMTM1IDMzM1ExMzUgMjgyIDE0NSAyMzBUMTgxIDEzNlQyNTIgNjhUMzY2IDQxUTQzNiA0MSA0ODAgNjdUNTUxIDEzNlQ1ODcgMjMwVDU5NyAzMzNaTTUxNiA3NzVRNTA3IDc0MyA0ODIgNzI4VDQzMCA3MTNRNDE0IDcxMyAzOTcgNzE5VDM2MyA3MzJUMzMxIDc0NVQzMDIgNzUxUTI4NiA3NTEgMjcwIDc0NFQyNDUgNzEyTDIxMCA3MzVRMjI2IDc3MSAyNDkgNzg0VDI5OCA3OTdRMzE0IDc5NyAzMzEgNzkxVDM2NSA3NzhUMzk3IDc2NVQ0MjcgNzU5UTQ0NCA3NTkgNDU4IDc2N1Q0ODAgNzk3TDUxNiA3NzVINTE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDY7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNjYzIDMzNFE2NjMgMjY3IDY0OCAyMDVUNTk3IDk0VDUwNiAxOFQzNjYgLTExUTI4MyAtMTEgMjI3IDE3VDEzNSA5NFQ4NSAyMDRUNjkgMzM0UTY5IDM5OCA4NCA0NTlUMTMzIDU2OVQyMjUgNjQ4VDM2NiA2NzhRNDQ5IDY3OCA1MDYgNjQ5VDU5OCA1NzJUNjQ4IDQ2MlQ2NjMgMzM0Wk01OTcgMzMzUTU5NyAzODUgNTg3IDQzN1Q1NTEgNTMyVDQ4MSA2MDBUMzY2IDYyN1EyOTcgNjI3IDI1MiA2MDFUMTgxIDUzMlQxNDUgNDM4VDEzNSAzMzNRMTM1IDI4MiAxNDUgMjMwVDE4MSAxMzZUMjUyIDY4VDM2NiA0MVE0MzYgNDEgNDgwIDY3VDU1MSAxMzZUNTg3IDIzMFQ1OTcgMzMzWk00OTAgNzU0UTQ5MCA3MzcgNDc4IDcyNVQ0NDkgNzEzUTQzMiA3MTMgNDIwIDcyNVQ0MDggNzU0UTQwOCA3NzEgNDIwIDc4M1Q0NDkgNzk1UTQ2NiA3OTUgNDc4IDc4M1Q0OTAgNzU0Wk0zMjEgNzU0UTMyMSA3MzcgMzA5IDcyNVQyODAgNzEzUTI2MyA3MTMgMjUxIDcyNVQyMzkgNzU0UTIzOSA3NzEgMjUxIDc4M1QyODAgNzk1UTI5NyA3OTUgMzA5IDc4M1QzMjEgNzU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDc7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNDYxIDQwMEwzMTUgMjU0TDQ2NyAxMDJMNDI5IDY0TDI3NyAyMTZMMTI0IDY0TDg3IDEwMkwyNDAgMjU0TDk0IDM5OUwxMzIgNDM4TDI3OCAyOTJMNDI0IDQzOEw0NjEgNDAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDg7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNjYzIDMzNFE2NjMgMjY3IDY0OCAyMDVUNTk3IDk0VDUwNiAxOFQzNjYgLTExUTMwNiAtMTEgMjYxIDRUMTgxIDQ1TDEzMiAtMjNMOTEgMTFMMTQzIDgzUTEwMyAxMzIgODYgMTk3VDY5IDMzNFE2OSAzOTggODQgNDU5VDEzMyA1NjlUMjI1IDY0OFQzNjYgNjc4UTQyMSA2NzggNDY0IDY2NVQ1NDAgNjI4TDU4OCA2OTRMNjI2IDY2MUw1NzggNTk1UTYyNCA1NDUgNjQzIDQ3N1Q2NjMgMzM0Wk01OTcgMzMzUTU5NyAzOTAgNTg1IDQ0NlQ1NDIgNTQ1TDIxNiA5M1EyNDIgNjkgMjc4IDU1VDM2NiA0MVE0MzYgNDEgNDgwIDY3VDU1MSAxMzZUNTg3IDIzMFQ1OTcgMzMzWk0xMzUgMzMzUTEzNSAyODEgMTQ1IDIyOVQxODEgMTM1TDUwNyA1ODNRNDgxIDYwMyA0NDcgNjE1VDM2NiA2MjdRMjk3IDYyNyAyNTIgNjAxVDE4MSA1MzJUMTQ1IDQzOFQxMzUgMzMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDk7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTYwIDI1NVE1NjAgMTE0IDUwMyA1MlQzMjUgLTExUTIwNCAtMTEgMTQ4IDUxVDkyIDI1NVY2NjdIMTU1VjI0MlExNTUgMTk3IDE2MyAxNjFUMTkyIDk4VDI0NSA1N1QzMjYgNDJRMzc0IDQyIDQwNiA1NlQ0NTkgOTdUNDg4IDE2MFQ0OTcgMjQyVjY2N0g1NjBWMjU1SDU2MFpNMzM5IDcwNUwxNzcgODA5TDIzNyA4NDFMMzcwIDcyN0wzMzkgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REE7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTYwIDI1NVE1NjAgMTE0IDUwMyA1MlQzMjUgLTExUTIwNCAtMTEgMTQ4IDUxVDkyIDI1NVY2NjdIMTU1VjI0MlExNTUgMTk3IDE2MyAxNjFUMTkyIDk4VDI0NSA1N1QzMjYgNDJRMzc0IDQyIDQwNiA1NlQ0NTkgOTdUNDg4IDE2MFQ0OTcgMjQyVjY2N0g1NjBWMjU1SDU2MFpNMzE4IDcwNUwyODcgNzI5TDQyMyA4NDRMNDgwIDgxMUwzMTggNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REI7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTYwIDI1NVE1NjAgMTE0IDUwMyA1MlQzMjUgLTExUTIwNCAtMTEgMTQ4IDUxVDkyIDI1NVY2NjdIMTU1VjI0MlExNTUgMTk3IDE2MyAxNjFUMTkyIDk4VDI0NSA1N1QzMjYgNDJRMzc0IDQyIDQwNiA1NlQ0NTkgOTdUNDg4IDE2MFQ0OTcgMjQyVjY2N0g1NjBWMjU1SDU2MFpNNDQzIDcwNEwzMjggNzg2TDIxNCA3MDRMMTg3IDczOUwzMjggODM4TDQ3MSA3MzlMNDQzIDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERDOyIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU2MCAyNTVRNTYwIDExNCA1MDMgNTJUMzI1IC0xMVEyMDQgLTExIDE0OCA1MVQ5MiAyNTVWNjY3SDE1NVYyNDJRMTU1IDE5NyAxNjMgMTYxVDE5MiA5OFQyNDUgNTdUMzI2IDQyUTM3NCA0MiA0MDYgNTZUNDU5IDk3VDQ4OCAxNjBUNDk3IDI0MlY2NjdINTYwVjI1NUg1NjBaTTQ1MyA3NTRRNDUzIDczNyA0NDEgNzI1VDQxMiA3MTNRMzk1IDcxMyAzODMgNzI1VDM3MSA3NTRRMzcxIDc3MSAzODMgNzgzVDQxMiA3OTVRNDI5IDc5NSA0NDEgNzgzVDQ1MyA3NTRaTTI4NCA3NTRRMjg0IDczNyAyNzIgNzI1VDI0MyA3MTNRMjI2IDcxMyAyMTQgNzI1VDIwMiA3NTRRMjAyIDc3MSAyMTQgNzgzVDI0MyA3OTVRMjYwIDc5NSAyNzIgNzgzVDI4NCA3NTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERDsiIGhvcml6LWFkdi14PSI1MzMiIGQ9Ik0yOTkgMjY3VjBIMjM1VjI2NEwxOCA2NjdIODhMMjY3IDMyM0w0NDYgNjY3SDUxNUwyOTkgMjY3Wk0yNTkgNzAxTDIyOCA3MjVMMzY0IDg0MEw0MjEgODA3TDI1OSA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERTsiIGhvcml6LWFkdi14PSI1ODUiIGQ9Ik01MjcgMzQzUTUyNyAyMzcgNDc2IDE4N1QzMTUgMTM2SDE1NVYwSDkyVjY2N0gxNTRWNTQyUTE5MSA1NDUgMjIxIDU0NlQyODcgNTQ4UTM0MiA1NDggMzg2IDUzOFQ0NjEgNTA1VDUxMCA0NDJUNTI3IDM0M1pNNDYzIDM0MFE0NjMgMzg1IDQ1MiA0MTVUNDE5IDQ2MlQzNjMgNDg3VDI4NSA0OTRRMjUwIDQ5NCAyMjAgNDkzVDE1NSA0ODdWMTg4SDI5OVEzNDEgMTg5IDM3MSAxOTZUNDIyIDIyMFQ0NTMgMjY2VDQ2MyAzNDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERjsiIGhvcml6LWFkdi14PSI1MDIiIGQ9Ik00NTcgMTY2UTQ1NyAxMzAgNDQ3IDk4VDQxNSA0MlQzNjQgM1QyOTMgLTExUTI2OCAtMTEgMjQ0IC03VDIwOSAyTDIyMCA0OFEyMzMgNDMgMjQ5IDQwVDI4MyAzNlEzMDQgMzYgMzI0IDQzVDM2MCA2NVQzODUgMTA0VDM5NSAxNjVRMzk1IDE5OSAzODYgMjI1VDM1NyAyNzRUMzA0IDMxNlQyMjcgMzU0TDIxOSAzOTdRMjU1IDQyMCAyNzggNDQxVDMxNCA0ODJUMzMzIDUyMVQzMzkgNTYyUTMzOSA1NzkgMzM1IDU5NlQzMjAgNjI4VDI5MCA2NTBUMjQwIDY1OVEyMTkgNjU5IDIwMSA2NTRUMTcwIDYzN1QxNDkgNjAyVDE0MSA1NDVWMEg4MlY1NTBRODIgNjI1IDExOSA2NjVUMjQyIDcwNVEzMTUgNzA1IDM1NCA2NzBUMzkzIDU2NVEzOTMgNTE1IDM2OSA0NzRUMjgxIDM4OVYzODdRMzE3IDM3MSAzNDkgMzUyVDQwNSAzMDZUNDQzIDI0NVQ0NTcgMTY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTA7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNNDIxIC02UTM5OSAzIDM4OSAxNlQzNzUgNTdIMzc0UTMzNyAyNiAyOTUgOFQyMDQgLTExUTE3MSAtMTEgMTQzIC0xVDk0IDI4VDYxIDc2VDQ5IDEzOVE0OSAyMDIgODEgMjM4VDE2MSAyOTNUMjY0IDMxN1QzNjggMzIyVjM4MFEzNjUgNDI2IDM0MSA0NDZUMjY1IDQ2N1EyMTIgNDY3IDE2NiA0NDhUODggNDA3TDY1IDQ1MlExMTMgNDgwIDE2MiA0OTdUMjcwIDUxNVEzNDggNTE1IDM4OCA0NzlUNDI4IDM2MVY4OFE0MjggNzAgNDM0IDU3VDQ1NCAzOUw0MjEgLTZaTTM2OSAyODFRMzM0IDI4MSAyODkgMjc4VDIwNCAyNjFUMTM3IDIxOVQxMDkgMTQxUTEwOSAxMTggMTE3IDk5VDEzOSA2NFQxNzIgNDFUMjE1IDMyUTI2MiAzMiAyOTcgNTFUMzY5IDk4VjI4MVpNMjk2IDU2NUwxMzQgNjY5TDE5NCA3MDFMMzI3IDU4N0wyOTYgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNNDIxIC02UTM5OSAzIDM4OSAxNlQzNzUgNTdIMzc0UTMzNyAyNiAyOTUgOFQyMDQgLTExUTE3MSAtMTEgMTQzIC0xVDk0IDI4VDYxIDc2VDQ5IDEzOVE0OSAyMDIgODEgMjM4VDE2MSAyOTNUMjY0IDMxN1QzNjggMzIyVjM4MFEzNjUgNDI2IDM0MSA0NDZUMjY1IDQ2N1EyMTIgNDY3IDE2NiA0NDhUODggNDA3TDY1IDQ1MlExMTMgNDgwIDE2MiA0OTdUMjcwIDUxNVEzNDggNTE1IDM4OCA0NzlUNDI4IDM2MVY4OFE0MjggNzAgNDM0IDU3VDQ1NCAzOUw0MjEgLTZaTTM2OSAyODFRMzM0IDI4MSAyODkgMjc4VDIwNCAyNjFUMTM3IDIxOVQxMDkgMTQxUTEwOSAxMTggMTE3IDk5VDEzOSA2NFQxNzIgNDFUMjE1IDMyUTI2MiAzMiAyOTcgNTFUMzY5IDk4VjI4MVpNMjI2IDU2NUwxOTUgNTg5TDMzMSA3MDRMMzg4IDY3MUwyMjYgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTI7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNNDIxIC02UTM5OSAzIDM4OSAxNlQzNzUgNTdIMzc0UTMzNyAyNiAyOTUgOFQyMDQgLTExUTE3MSAtMTEgMTQzIC0xVDk0IDI4VDYxIDc2VDQ5IDEzOVE0OSAyMDIgODEgMjM4VDE2MSAyOTNUMjY0IDMxN1QzNjggMzIyVjM4MFEzNjUgNDI2IDM0MSA0NDZUMjY1IDQ2N1EyMTIgNDY3IDE2NiA0NDhUODggNDA3TDY1IDQ1MlExMTMgNDgwIDE2MiA0OTdUMjcwIDUxNVEzNDggNTE1IDM4OCA0NzlUNDI4IDM2MVY4OFE0MjggNzAgNDM0IDU3VDQ1NCAzOUw0MjEgLTZaTTM2OSAyODFRMzM0IDI4MSAyODkgMjc4VDIwNCAyNjFUMTM3IDIxOVQxMDkgMTQxUTEwOSAxMTggMTE3IDk5VDEzOSA2NFQxNzIgNDFUMjE1IDMyUTI2MiAzMiAyOTcgNTFUMzY5IDk4VjI4MVpNMzY4IDU2M0wyNTMgNjQ1TDEzOSA1NjNMMTEyIDU5OEwyNTMgNjk3TDM5NiA1OThMMzY4IDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUzOyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTQyMSAtNlEzOTkgMyAzODkgMTZUMzc1IDU3SDM3NFEzMzcgMjYgMjk1IDhUMjA0IC0xMVExNzEgLTExIDE0MyAtMVQ5NCAyOFQ2MSA3NlQ0OSAxMzlRNDkgMjAyIDgxIDIzOFQxNjEgMjkzVDI2NCAzMTdUMzY4IDMyMlYzODBRMzY1IDQyNiAzNDEgNDQ2VDI2NSA0NjdRMjEyIDQ2NyAxNjYgNDQ4VDg4IDQwN0w2NSA0NTJRMTEzIDQ4MCAxNjIgNDk3VDI3MCA1MTVRMzQ4IDUxNSAzODggNDc5VDQyOCAzNjFWODhRNDI4IDcwIDQzNCA1N1Q0NTQgMzlMNDIxIC02Wk0zNjkgMjgxUTMzNCAyODEgMjg5IDI3OFQyMDQgMjYxVDEzNyAyMTlUMTA5IDE0MVExMDkgMTE4IDExNyA5OVQxMzkgNjRUMTcyIDQxVDIxNSAzMlEyNjIgMzIgMjk3IDUxVDM2OSA5OFYyODFaTTQwMiA2MzRRMzkzIDYwMiAzNjggNTg3VDMxNiA1NzJRMzAwIDU3MiAyODMgNTc4VDI0OSA1OTFUMjE3IDYwNFQxODggNjEwUTE3MiA2MTAgMTU2IDYwM1QxMzEgNTcxTDk2IDU5NFExMTIgNjMwIDEzNSA2NDNUMTg0IDY1NlEyMDAgNjU2IDIxNyA2NTBUMjUxIDYzN1QyODMgNjI0VDMxMyA2MThRMzMwIDYxOCAzNDQgNjI2VDM2NiA2NTZMNDAyIDYzNEg0MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNDsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik00MjEgLTZRMzk5IDMgMzg5IDE2VDM3NSA1N0gzNzRRMzM3IDI2IDI5NSA4VDIwNCAtMTFRMTcxIC0xMSAxNDMgLTFUOTQgMjhUNjEgNzZUNDkgMTM5UTQ5IDIwMiA4MSAyMzhUMTYxIDI5M1QyNjQgMzE3VDM2OCAzMjJWMzgwUTM2NSA0MjYgMzQxIDQ0NlQyNjUgNDY3UTIxMiA0NjcgMTY2IDQ0OFQ4OCA0MDdMNjUgNDUyUTExMyA0ODAgMTYyIDQ5N1QyNzAgNTE1UTM0OCA1MTUgMzg4IDQ3OVQ0MjggMzYxVjg4UTQyOCA3MCA0MzQgNTdUNDU0IDM5TDQyMSAtNlpNMzY5IDI4MVEzMzQgMjgxIDI4OSAyNzhUMjA0IDI2MVQxMzcgMjE5VDEwOSAxNDFRMTA5IDExOCAxMTcgOTlUMTM5IDY0VDE3MiA0MVQyMTUgMzJRMjYyIDMyIDI5NyA1MVQzNjkgOThWMjgxWk0zODUgNjE0UTM4NSA1OTcgMzczIDU4NVQzNDQgNTczUTMyNyA1NzMgMzE1IDU4NVQzMDMgNjE0UTMwMyA2MzEgMzE1IDY0M1QzNDQgNjU1UTM2MSA2NTUgMzczIDY0M1QzODUgNjE0Wk0yMTYgNjE0UTIxNiA1OTcgMjA0IDU4NVQxNzUgNTczUTE1OCA1NzMgMTQ2IDU4NVQxMzQgNjE0UTEzNCA2MzEgMTQ2IDY0M1QxNzUgNjU1UTE5MiA2NTUgMjA0IDY0M1QyMTYgNjE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTU7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNNDIxIC02UTM5OSAzIDM4OSAxNlQzNzUgNTdIMzc0UTMzNyAyNiAyOTUgOFQyMDQgLTExUTE3MSAtMTEgMTQzIC0xVDk0IDI4VDYxIDc2VDQ5IDEzOVE0OSAyMDIgODEgMjM4VDE2MSAyOTNUMjY0IDMxN1QzNjggMzIyVjM4MFEzNjUgNDI2IDM0MSA0NDZUMjY1IDQ2N1EyMTIgNDY3IDE2NiA0NDhUODggNDA3TDY1IDQ1MlExMTMgNDgwIDE2MiA0OTdUMjcwIDUxNVEzNDggNTE1IDM4OCA0NzlUNDI4IDM2MVY4OFE0MjggNzAgNDM0IDU3VDQ1NCAzOUw0MjEgLTZaTTM2OSAyODFRMzM0IDI4MSAyODkgMjc4VDIwNCAyNjFUMTM3IDIxOVQxMDkgMTQxUTEwOSAxMTggMTE3IDk5VDEzOSA2NFQxNzIgNDFUMjE1IDMyUTI2MiAzMiAyOTcgNTFUMzY5IDk4VjI4MVpNMzQ5IDY0MlEzNDkgNjA2IDMyNCA1ODFUMjYyIDU1NlEyMjUgNTU2IDIwMCA1ODFUMTc0IDY0MlExNzQgNjc4IDE5OSA3MDNUMjYyIDcyOFEyOTggNzI4IDMyMyA3MDNUMzQ5IDY0MlpNMzE2IDY0MlEzMTYgNjY1IDMwMSA2ODFUMjYyIDY5N1EyMzkgNjk3IDIyMyA2ODFUMjA3IDY0MlEyMDcgNjE5IDIyMyA2MDNUMjYyIDU4N1EyODUgNTg3IDMwMCA2MDNUMzE2IDY0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU2OyIgaG9yaXotYWR2LXg9Ijg0MCIgZD0iTTc4NiAyNjFRNzg2IDI1NiA3ODYgMjQ4VDc4NSAyMzJINDMyUTQzMyAxNDAgNDc0IDg5VDU5NCAzOFE2MzAgMzggNjY5IDUyVDc0MSA5NUw3NjUgNTFRNzI3IDIwIDY4NCA1VDU5NSAtMTFRNTI5IC0xMSA0ODQgMTNUNDEwIDgxUTM2OCA0MSAzMTggMTVUMjAzIC0xMVExNzAgLTExIDE0MiAtMVQ5NCAyOFQ2MSA3NVQ0OSAxMzlRNDkgMTkzIDczIDIyOFQxMzkgMjg0VDI0MCAzMTNUMzY4IDMyMlYzNTFRMzY4IDQxMCAzNDggNDM4VDI2OSA0NjZRMjIxIDQ2NiAxNzMgNDQ5VDg3IDQwNUw2NSA0NTFRMTE2IDQ4MCAxNjMgNDk3VDI2OSA1MTVRMjk1IDUxNSAzMTkgNTExVDM2MiA0OTZUMzk1IDQ2NVQ0MTUgNDE2UTQ0MiA0NjQgNDg1IDQ4OVQ1ODUgNTE1UTY3NyA1MTUgNzMxIDQ1MlQ3ODYgMjYxWk03MjkgMjc3UTcyOCAzMTQgNzIxIDM0OFQ2OTcgNDA5VDY1MyA0NTFUNTgzIDQ2N1E1NTEgNDY3IDUyNCA0NTVUNDc1IDQxOFQ0NDIgMzU5VDQzMCAyNzdINzI5Wk0zOTAgMTIwUTM3NiAxNTAgMzczIDE4NVQzNjggMjU1VjI4MFEyNDEgMjgwIDE3NiAyNDdUMTEwIDE0MlExMTAgMTE5IDExOCA5OVQxNDEgNjRUMTc1IDQxVDIxNSAzMlEyNTkgMzIgMzAzIDU3VDM5MCAxMjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNzsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik0zNjUgLTEyN1EzNjUgLTE2NSAzNDAgLTE4NVQyNzMgLTIwNVEyNTEgLTIwNSAyMzAgLTE5OVQxOTIgLTE4M0wyMDYgLTE1NFEyMjEgLTE2MyAyMzYgLTE2OFQyNzIgLTE3NFEyOTIgLTE3NCAzMDggLTE2NFQzMjUgLTEyOVEzMjUgLTEwNCAzMDkgLTk1VDI3MiAtODZRMjUyIC04NiAyMzUgLTkxTDIyMiAtNzVMMjU3IC0xMFEyMDUgLTYgMTY4IDE1VDEwNiA3MVQ3MCAxNTFUNTggMjQ5UTU4IDMwNSA3MSAzNTNUMTEyIDQzOFQxODIgNDk0VDI4MyA1MTVRMzMwIDUxNSAzNzEgNDk5VDQ0OCA0NTZMNDIyIDQxMVEzOTUgNDM3IDM2MSA0NTFUMjg1IDQ2NlEyMzcgNDY2IDIwNiA0NDhUMTU1IDM5OVQxMjcgMzMwVDExOSAyNTFRMTE5IDIxMSAxMjcgMTczVDE1NCAxMDVUMjA1IDU3VDI4NSAzOFEzMjYgMzggMzU4IDUxVDQyNCA5NEw0NDYgNTBRNDEyIDI0IDM3NiA4VDI5NCAtMTFMMjY3IC01OUwyNjggLTYwUTI3NCAtNTkgMjgxIC01OVQyOTQgLTU4UTMyNiAtNTggMzQ1IC03NVQzNjUgLTEyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU4OyIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTQ3MyAyNzBRNDczIDI2NSA0NzMgMjUyVDQ3MiAyMzJIMTE4UTExOCAxNDIgMTU5IDg5VDI4MSAzNlEzMTYgMzYgMzUyIDQ4VDQzMCA5M0w0NTMgNTBRNDEwIDE2IDM2NyAzVDI3OSAtMTFRMTY5IC0xMSAxMTQgNTlUNTggMjUxUTU4IDMwOSA3MiAzNThUMTEzIDQ0MVQxODIgNDk1VDI3NyA1MTVRMzI0IDUxNSAzNjAgNDk3VDQyMiA0NDdUNDYwIDM2OVQ0NzMgMjcwWk00MTYgMjc2UTQxNiAzMTIgNDA5IDM0N1QzODQgNDA5VDM0MSA0NTNUMjc3IDQ3MFEyMzAgNDcwIDIwMCA0NTJUMTUxIDQwNlQxMjYgMzQ0VDExOSAyNzZINDE2Wk0zMDMgNTY1TDE0MSA2NjlMMjAxIDcwMUwzMzQgNTg3TDMwMyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFOTsiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik00NzMgMjcwUTQ3MyAyNjUgNDczIDI1MlQ0NzIgMjMySDExOFExMTggMTQyIDE1OSA4OVQyODEgMzZRMzE2IDM2IDM1MiA0OFQ0MzAgOTNMNDUzIDUwUTQxMCAxNiAzNjcgM1QyNzkgLTExUTE2OSAtMTEgMTE0IDU5VDU4IDI1MVE1OCAzMDkgNzIgMzU4VDExMyA0NDFUMTgyIDQ5NVQyNzcgNTE1UTMyNCA1MTUgMzYwIDQ5N1Q0MjIgNDQ3VDQ2MCAzNjlUNDczIDI3MFpNNDE2IDI3NlE0MTYgMzEyIDQwOSAzNDdUMzg0IDQwOVQzNDEgNDUzVDI3NyA0NzBRMjMwIDQ3MCAyMDAgNDUyVDE1MSA0MDZUMTI2IDM0NFQxMTkgMjc2SDQxNlpNMjU1IDU2NUwyMjQgNTg5TDM2MCA3MDRMNDE3IDY3MUwyNTUgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUE7IiBob3Jpei1hZHYteD0iNTI3IiBkPSJNNDczIDI3MFE0NzMgMjY1IDQ3MyAyNTJUNDcyIDIzMkgxMThRMTE4IDE0MiAxNTkgODlUMjgxIDM2UTMxNiAzNiAzNTIgNDhUNDMwIDkzTDQ1MyA1MFE0MTAgMTYgMzY3IDNUMjc5IC0xMVExNjkgLTExIDExNCA1OVQ1OCAyNTFRNTggMzA5IDcyIDM1OFQxMTMgNDQxVDE4MiA0OTVUMjc3IDUxNVEzMjQgNTE1IDM2MCA0OTdUNDIyIDQ0N1Q0NjAgMzY5VDQ3MyAyNzBaTTQxNiAyNzZRNDE2IDMxMiA0MDkgMzQ3VDM4NCA0MDlUMzQxIDQ1M1QyNzcgNDcwUTIzMCA0NzAgMjAwIDQ1MlQxNTEgNDA2VDEyNiAzNDRUMTE5IDI3Nkg0MTZaTTM4OSA1NjRMMjc0IDY0NkwxNjAgNTY0TDEzMyA1OTlMMjc0IDY5OEw0MTcgNTk5TDM4OSA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik00NzMgMjcwUTQ3MyAyNjUgNDczIDI1MlQ0NzIgMjMySDExOFExMTggMTQyIDE1OSA4OVQyODEgMzZRMzE2IDM2IDM1MiA0OFQ0MzAgOTNMNDUzIDUwUTQxMCAxNiAzNjcgM1QyNzkgLTExUTE2OSAtMTEgMTE0IDU5VDU4IDI1MVE1OCAzMDkgNzIgMzU4VDExMyA0NDFUMTgyIDQ5NVQyNzcgNTE1UTMyNCA1MTUgMzYwIDQ5N1Q0MjIgNDQ3VDQ2MCAzNjlUNDczIDI3MFpNNDE2IDI3NlE0MTYgMzEyIDQwOSAzNDdUMzg0IDQwOVQzNDEgNDUzVDI3NyA0NzBRMjMwIDQ3MCAyMDAgNDUyVDE1MSA0MDZUMTI2IDM0NFQxMTkgMjc2SDQxNlpNMzk5IDYxNFEzOTkgNTk3IDM4NyA1ODVUMzU4IDU3M1EzNDEgNTczIDMyOSA1ODVUMzE3IDYxNFEzMTcgNjMxIDMyOSA2NDNUMzU4IDY1NVEzNzUgNjU1IDM4NyA2NDNUMzk5IDYxNFpNMjMwIDYxNFEyMzAgNTk3IDIxOCA1ODVUMTg5IDU3M1ExNzIgNTczIDE2MCA1ODVUMTQ4IDYxNFExNDggNjMxIDE2MCA2NDNUMTg5IDY1NVEyMDYgNjU1IDIxOCA2NDNUMjMwIDYxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVDOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTgyIDBWNTAySDE0MVYwSDgyWk0xNDQgNTY1TC0xOCA2NjlMNDIgNzAxTDE3NSA1ODdMMTQ0IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVEOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTgyIDBWNTAySDE0MVYwSDgyWk04NyA1NjVMNTYgNTg5TDE5MiA3MDRMMjQ5IDY3MUw4NyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRTsiIGhvcml6LWFkdi14PSIyMjMiIGQ9Ik04MiAwVjUwMkgxNDFWMEg4MlpNMjI5IDU2NEwxMTQgNjQ2TDAgNTY0TC0yNyA1OTlMMTE0IDY5OEwyNTcgNTk5TDIyOSA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRjsiIGhvcml6LWFkdi14PSIyMjMiIGQ9Ik04MiAwVjUwMkgxNDFWMEg4MlpNMjQwIDYxNFEyNDAgNTk3IDIyOCA1ODVUMTk5IDU3M1ExODIgNTczIDE3MCA1ODVUMTU4IDYxNFExNTggNjMxIDE3MCA2NDNUMTk5IDY1NVEyMTYgNjU1IDIyOCA2NDNUMjQwIDYxNFpNNzEgNjE0UTcxIDU5NyA1OSA1ODVUMzAgNTczUTEzIDU3MyAxIDU4NVQtMTEgNjE0US0xMSA2MzEgMSA2NDNUMzAgNjU1UTQ3IDY1NSA1OSA2NDNUNzEgNjE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjA7IiBob3Jpei1hZHYteD0iNTMyIiBkPSJNMzgxIDYxOVE0MDYgNTgyIDQyMyA1NDNUNDUyIDQ1OVQ0NjggMzY0VDQ3NCAyNTNRNDc0IDE5OCA0NjMgMTUwVDQyNyA2N1QzNjIgMTFUMjYyIC0xMFEyMDUgLTEwIDE2NiAxMVQxMDMgNjdUNjkgMTQ5VDU4IDI0N1E1OCAyOTUgNjYgMzQwVDk2IDQyMFQxNTcgNDc2VDI1OCA0OTdRMzA2IDQ5NyAzNDEgNDgxVDQwMSA0MjZINDA1UTM5NSA0NzMgMzc1IDUxNlQzMzIgNTk2TDIyOCA1NDBMMjEwIDU3NEwzMDggNjI4UTI5NCA2NDUgMjc4IDY2NFQyNDYgNjk4TDI5OSA3MTFRMzExIDcwMCAzMjggNjgyVDM1NiA2NTFMNDM4IDcwMEw0NTcgNjY1TDM4MSA2MTlaTTQxMyAyMzNRNDEzIDI3NCA0MTAgMzEzVDM5MSAzODNUMzQ2IDQzM1QyNjQgNDUyUTIxMyA0NTIgMTg0IDQzM1QxNDEgMzg1VDEyMyAzMTlUMTE5IDI0N1ExMTkgMjA2IDEyNiAxNjhUMTQ5IDEwMVQxOTQgNTVUMjY3IDM4UTMxNCAzOCAzNDMgNTdUMzg3IDEwNlQ0MDggMTY5VDQxMyAyMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMTsiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik00MDcgMFYzMDFRNDA3IDMzOCA0MDQgMzY4VDM4OCA0MTlUMzUxIDQ1MVQyODYgNDYzUTIxNSA0NjMgMTc4IDQyNlQxNDEgMzIzVjBIODJWNTAySDEzM0wxMzkgNDM3SDE0MVExOTAgNTE1IDI5NyA1MTVRMzQ5IDUxNSAzODIgNTAyVDQzNCA0NjRUNDU5IDQwMlQ0NjYgMzE5VjBINDA3Wk00MzAgNjM0UTQyMSA2MDIgMzk2IDU4N1QzNDQgNTcyUTMyOCA1NzIgMzExIDU3OFQyNzcgNTkxVDI0NSA2MDRUMjE2IDYxMFEyMDAgNjEwIDE4NCA2MDNUMTU5IDU3MUwxMjQgNTk0UTE0MCA2MzAgMTYzIDY0M1QyMTIgNjU2UTIyOCA2NTYgMjQ1IDY1MFQyNzkgNjM3VDMxMSA2MjRUMzQxIDYxOFEzNTggNjE4IDM3MiA2MjZUMzk0IDY1Nkw0MzAgNjM0SDQzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYyOyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTU4IDI1MFE1OCAzMDQgNzAgMzUyVDEwOCA0MzdUMTc3IDQ5NFQyNzkgNTE1UTMzNyA1MTUgMzc5IDQ5NVQ0NDggNDM5VDQ4OCAzNTVUNTAxIDI1MFE1MDEgMTk2IDQ4OSAxNDlUNDQ5IDY2VDM4MCAxMFQyNzkgLTExUTIyMCAtMTEgMTc5IDlUMTEwIDY1VDcxIDE0OFQ1OCAyNTBaTTEyMCAyNTFRMTIwIDIxMCAxMjcgMTcxVDE1MiAxMDJUMjAxIDU0VDI4MCAzNlEzMjcgMzYgMzU3IDU0VDQwNiAxMDJUNDMxIDE3MVQ0MzkgMjUxUTQzOSAyOTMgNDMyIDMzMlQ0MDcgNDAxVDM1OCA0NDlUMjc5IDQ2N1EyMzIgNDY3IDIwMSA0NDlUMTUyIDQwMVQxMjcgMzMyVDEyMCAyNTFaTTMxMSA1NjVMMTQ5IDY2OUwyMDkgNzAxTDM0MiA1ODdMMzExIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYzOyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTU4IDI1MFE1OCAzMDQgNzAgMzUyVDEwOCA0MzdUMTc3IDQ5NFQyNzkgNTE1UTMzNyA1MTUgMzc5IDQ5NVQ0NDggNDM5VDQ4OCAzNTVUNTAxIDI1MFE1MDEgMTk2IDQ4OSAxNDlUNDQ5IDY2VDM4MCAxMFQyNzkgLTExUTIyMCAtMTEgMTc5IDlUMTEwIDY1VDcxIDE0OFQ1OCAyNTBaTTEyMCAyNTFRMTIwIDIxMCAxMjcgMTcxVDE1MiAxMDJUMjAxIDU0VDI4MCAzNlEzMjcgMzYgMzU3IDU0VDQwNiAxMDJUNDMxIDE3MVQ0MzkgMjUxUTQzOSAyOTMgNDMyIDMzMlQ0MDcgNDAxVDM1OCA0NDlUMjc5IDQ2N1EyMzIgNDY3IDIwMSA0NDlUMTUyIDQwMVQxMjcgMzMyVDEyMCAyNTFaTTI1NiA1NjVMMjI1IDU4OUwzNjEgNzA0TDQxOCA2NzFMMjU2IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY0OyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTU4IDI1MFE1OCAzMDQgNzAgMzUyVDEwOCA0MzdUMTc3IDQ5NFQyNzkgNTE1UTMzNyA1MTUgMzc5IDQ5NVQ0NDggNDM5VDQ4OCAzNTVUNTAxIDI1MFE1MDEgMTk2IDQ4OSAxNDlUNDQ5IDY2VDM4MCAxMFQyNzkgLTExUTIyMCAtMTEgMTc5IDlUMTEwIDY1VDcxIDE0OFQ1OCAyNTBaTTEyMCAyNTFRMTIwIDIxMCAxMjcgMTcxVDE1MiAxMDJUMjAxIDU0VDI4MCAzNlEzMjcgMzYgMzU3IDU0VDQwNiAxMDJUNDMxIDE3MVQ0MzkgMjUxUTQzOSAyOTMgNDMyIDMzMlQ0MDcgNDAxVDM1OCA0NDlUMjc5IDQ2N1EyMzIgNDY3IDIwMSA0NDlUMTUyIDQwMVQxMjcgMzMyVDEyMCAyNTFaTTM5NSA1NjRMMjgwIDY0NkwxNjYgNTY0TDEzOSA1OTlMMjgwIDY5OEw0MjMgNTk5TDM5NSA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNTsiIGhvcml6LWFkdi14PSI1NTkiIGQ9Ik01OCAyNTBRNTggMzA0IDcwIDM1MlQxMDggNDM3VDE3NyA0OTRUMjc5IDUxNVEzMzcgNTE1IDM3OSA0OTVUNDQ4IDQzOVQ0ODggMzU1VDUwMSAyNTBRNTAxIDE5NiA0ODkgMTQ5VDQ0OSA2NlQzODAgMTBUMjc5IC0xMVEyMjAgLTExIDE3OSA5VDExMCA2NVQ3MSAxNDhUNTggMjUwWk0xMjAgMjUxUTEyMCAyMTAgMTI3IDE3MVQxNTIgMTAyVDIwMSA1NFQyODAgMzZRMzI3IDM2IDM1NyA1NFQ0MDYgMTAyVDQzMSAxNzFUNDM5IDI1MVE0MzkgMjkzIDQzMiAzMzJUNDA3IDQwMVQzNTggNDQ5VDI3OSA0NjdRMjMyIDQ2NyAyMDEgNDQ5VDE1MiA0MDFUMTI3IDMzMlQxMjAgMjUxWk00MzUgNjM0UTQyNiA2MDIgNDAxIDU4N1QzNDkgNTcyUTMzMyA1NzIgMzE2IDU3OFQyODIgNTkxVDI1MCA2MDRUMjIxIDYxMFEyMDUgNjEwIDE4OSA2MDNUMTY0IDU3MUwxMjkgNTk0UTE0NSA2MzAgMTY4IDY0M1QyMTcgNjU2UTIzMyA2NTYgMjUwIDY1MFQyODQgNjM3VDMxNiA2MjRUMzQ2IDYxOFEzNjMgNjE4IDM3NyA2MjZUMzk5IDY1Nkw0MzUgNjM0SDQzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY2OyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTU4IDI1MFE1OCAzMDQgNzAgMzUyVDEwOCA0MzdUMTc3IDQ5NFQyNzkgNTE1UTMzNyA1MTUgMzc5IDQ5NVQ0NDggNDM5VDQ4OCAzNTVUNTAxIDI1MFE1MDEgMTk2IDQ4OSAxNDlUNDQ5IDY2VDM4MCAxMFQyNzkgLTExUTIyMCAtMTEgMTc5IDlUMTEwIDY1VDcxIDE0OFQ1OCAyNTBaTTEyMCAyNTFRMTIwIDIxMCAxMjcgMTcxVDE1MiAxMDJUMjAxIDU0VDI4MCAzNlEzMjcgMzYgMzU3IDU0VDQwNiAxMDJUNDMxIDE3MVQ0MzkgMjUxUTQzOSAyOTMgNDMyIDMzMlQ0MDcgNDAxVDM1OCA0NDlUMjc5IDQ2N1EyMzIgNDY3IDIwMSA0NDlUMTUyIDQwMVQxMjcgMzMyVDEyMCAyNTFaTTQwOCA2MTRRNDA4IDU5NyAzOTYgNTg1VDM2NyA1NzNRMzUwIDU3MyAzMzggNTg1VDMyNiA2MTRRMzI2IDYzMSAzMzggNjQzVDM2NyA2NTVRMzg0IDY1NSAzOTYgNjQzVDQwOCA2MTRaTTIzOSA2MTRRMjM5IDU5NyAyMjcgNTg1VDE5OCA1NzNRMTgxIDU3MyAxNjkgNTg1VDE1NyA2MTRRMTU3IDYzMSAxNjkgNjQzVDE5OCA2NTVRMjE1IDY1NSAyMjcgNjQzVDIzOSA2MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNzsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik01NCAyMzFWMjg1SDUwMFYyMzFINTRaTTIzOSAxMTFRMjM5IDEyOCAyNTAgMTM5VDI3OSAxNTFRMjk2IDE1MSAzMDggMTQwVDMyMCAxMTFRMzIwIDk0IDMwOCA4M1QyNzkgNzFRMjYyIDcxIDI1MSA4MlQyMzkgMTExWk0yMzkgNDA2UTIzOSA0MjMgMjUwIDQzNFQyNzkgNDQ2UTI5NiA0NDYgMzA4IDQzNVQzMjAgNDA2UTMyMCAzODkgMzA4IDM3OFQyNzkgMzY2UTI2MiAzNjYgMjUxIDM3N1QyMzkgNDA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjg7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNNDQ3IDQ0MlE0NzkgNDAwIDQ5MCAzNTFUNTAyIDI1MVE1MDIgMTk3IDQ5MCAxNDlUNDUyIDY2VDM4MyAxMFQyNzkgLTExUTIzNCAtMTEgMTk2IDJUMTI4IDQ4TDc4IC0xNkw0NiAxMkwxMDAgODBRNzYgMTE4IDY3IDE2MlQ1OCAyNTFRNTggMzA1IDcwIDM1M1QxMTAgNDM3VDE3OSA0OTRUMjc5IDUxNVEzNjIgNTE1IDQxMyA0NzJMNDY1IDUzN0w1MDEgNTA5TDQ0NyA0NDJaTTM4MCA0MjhRMzYzIDQ0NCAzMzkgNDUzVDI4MCA0NjNRMjMyIDQ2MyAyMDEgNDQ2VDE1MiAzOTlUMTI3IDMzMVQxMjAgMjUxUTEyMCAyMTkgMTI0IDE4NlQxNDMgMTI2TDM4MCA0MjhaTTQ0MCAyNTFRNDQwIDI4NiA0MzMgMzI3VDQwNiAzOThMMTYzIDkyUTE4NCA2MyAyMTQgNTFUMjgwIDM5UTMyNyAzOSAzNTggNTZUNDA3IDEwM1Q0MzIgMTcwVDQ0MCAyNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGOTsiIGhvcml6LWFkdi14PSI1NDAiIGQ9Ik00MDkgMEw0MDEgNjZIMzk5UTM4MiAzNSAzNDYgMTJUMjQ1IC0xMVEyMDYgLTExIDE3NiAtMlQxMjUgMzBUOTMgOTJUODIgMTk0VjUwMkgxNDFWMjM4UTE0MSAxODkgMTQ0IDE1MlQxNjAgOTBUMTk1IDUzVDI1OSA0MFEzMzUgNDAgMzY3IDgxVDM5OSAxODhWNTAySDQ1OFYwSDQwOVpNMjc4IDU2NUwxMTYgNjY5TDE3NiA3MDFMMzA5IDU4N0wyNzggNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkE7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDAxIDY2SDM5OVEzODIgMzUgMzQ2IDEyVDI0NSAtMTFRMjA2IC0xMSAxNzYgLTJUMTI1IDMwVDkzIDkyVDgyIDE5NFY1MDJIMTQxVjIzOFExNDEgMTg5IDE0NCAxNTJUMTYwIDkwVDE5NSA1M1QyNTkgNDBRMzM1IDQwIDM2NyA4MVQzOTkgMTg4VjUwMkg0NThWMEg0MDlaTTI1OCA1NjVMMjI3IDU4OUwzNjMgNzA0TDQyMCA2NzFMMjU4IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCOyIgaG9yaXotYWR2LXg9IjU0MCIgZD0iTTQwOSAwTDQwMSA2NkgzOTlRMzgyIDM1IDM0NiAxMlQyNDUgLTExUTIwNiAtMTEgMTc2IC0yVDEyNSAzMFQ5MyA5MlQ4MiAxOTRWNTAySDE0MVYyMzhRMTQxIDE4OSAxNDQgMTUyVDE2MCA5MFQxOTUgNTNUMjU5IDQwUTMzNSA0MCAzNjcgODFUMzk5IDE4OFY1MDJINDU4VjBINDA5Wk0zODcgNTY0TDI3MiA2NDZMMTU4IDU2NEwxMzEgNTk5TDI3MiA2OThMNDE1IDU5OUwzODcgNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkM7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDAxIDY2SDM5OVEzODIgMzUgMzQ2IDEyVDI0NSAtMTFRMjA2IC0xMSAxNzYgLTJUMTI1IDMwVDkzIDkyVDgyIDE5NFY1MDJIMTQxVjIzOFExNDEgMTg5IDE0NCAxNTJUMTYwIDkwVDE5NSA1M1QyNTkgNDBRMzM1IDQwIDM2NyA4MVQzOTkgMTg4VjUwMkg0NThWMEg0MDlaTTQwMiA2MTRRNDAyIDU5NyAzOTAgNTg1VDM2MSA1NzNRMzQ0IDU3MyAzMzIgNTg1VDMyMCA2MTRRMzIwIDYzMSAzMzIgNjQzVDM2MSA2NTVRMzc4IDY1NSAzOTAgNjQzVDQwMiA2MTRaTTIzMyA2MTRRMjMzIDU5NyAyMjEgNTg1VDE5MiA1NzNRMTc1IDU3MyAxNjMgNTg1VDE1MSA2MTRRMTUxIDYzMSAxNjMgNjQzVDE5MiA2NTVRMjA5IDY1NSAyMjEgNjQzVDIzMyA2MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRDsiIGhvcml6LWFkdi14PSI0NjYiIGQ9Ik0yMzAgLTg4UTIxNSAtMTI4IDIwMiAtMTU0VDE3MiAtMTk3VDEzNiAtMjE5VDg5IC0yMjZRODEgLTIyNiA2OSAtMjI2VDQ2IC0yMjRWLTE3MlE1NSAtMTc0IDYzIC0xNzRUODMgLTE3NFExMDIgLTE3NCAxMTUgLTE2OVQxMzkgLTE1MVQxNjEgLTExM1QxODUgLTQ5TDIwOSAyMUwyMyA1MDJIODdMMjM4IDg5SDI0MkwzODAgNTAySDQ0M0wyMzAgLTg4Wk0yMzMgNTY1TDIwMiA1ODlMMzM4IDcwNEwzOTUgNjcxTDIzMyA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRTsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik00OTEgMjUwUTQ5MSAxOTcgNDgwIDE1MFQ0NDUgNjhUMzgzIDExVDI4OSAtMTBRMjM1IC0xMCAyMDAgMTNUMTQyIDcxTDE0MCA3MlYtMjIwSDgyVjcwMEgxMzhWNDQwSDE0MFExNjkgNDgyIDIwNyA0OThUMjkyIDUxNVEzNTIgNTE1IDM5MCA0OTRUNDUxIDQzNVQ0ODIgMzUwVDQ5MSAyNTBaTTQzMCAyNTFRNDMwIDI5MyA0MjUgMzMxVDQwNSA0MDBUMzYwIDQ0OFQyODMgNDY2UTIxOCA0NjYgMTgwIDQzMlQxNDEgMzMwVjE5OVExNDEgMTY0IDE1MCAxMzVUMTc4IDg0VDIyMiA1MFQyODIgMzdRMzI2IDM3IDM1NSA1NVQ0MDAgMTAzVDQyMyAxNzFUNDMwIDI1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZGOyIgaG9yaXotYWR2LXg9IjQ2NiIgZD0iTTIzMCAtODhRMjE1IC0xMjggMjAyIC0xNTRUMTcyIC0xOTdUMTM2IC0yMTlUODkgLTIyNlE4MSAtMjI2IDY5IC0yMjZUNDYgLTIyNFYtMTcyUTU1IC0xNzQgNjMgLTE3NFQ4MyAtMTc0UTEwMiAtMTc0IDExNSAtMTY5VDEzOSAtMTUxVDE2MSAtMTEzVDE4NSAtNDlMMjA5IDIxTDIzIDUwMkg4N0wyMzggODlIMjQyTDM4MCA1MDJINDQzTDIzMCAtODhaTTM2NyA2MTRRMzY3IDU5NyAzNTUgNTg1VDMyNiA1NzNRMzA5IDU3MyAyOTcgNTg1VDI4NSA2MTRRMjg1IDYzMSAyOTcgNjQzVDMyNiA2NTVRMzQzIDY1NSAzNTUgNjQzVDM2NyA2MTRaTTE5OCA2MTRRMTk4IDU5NyAxODYgNTg1VDE1NyA1NzNRMTQwIDU3MyAxMjggNTg1VDExNiA2MTRRMTE2IDYzMSAxMjggNjQzVDE1NyA2NTVRMTc0IDY1NSAxODYgNjQzVDE5OCA2MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDA7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDU4IDE3MUgxNTNMOTMgMEgyOEwyNjggNjcxSDM0M0w1ODUgMEg1MThaTTMwNiA2MTFIMzA0TDE2OCAyMjVINDQwTDMwNiA2MTFaTTE2MSA3MzBWNzcySDQ0NlY3MzBIMTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAxOyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTQyMSAtNlEzOTkgMyAzODkgMTZUMzc1IDU3SDM3NFEzMzcgMjYgMjk1IDhUMjA0IC0xMVExNzEgLTExIDE0MyAtMVQ5NCAyOFQ2MSA3NlQ0OSAxMzlRNDkgMjAyIDgxIDIzOFQxNjEgMjkzVDI2NCAzMTdUMzY4IDMyMlYzODBRMzY1IDQyNiAzNDEgNDQ2VDI2NSA0NjdRMjEyIDQ2NyAxNjYgNDQ4VDg4IDQwN0w2NSA0NTJRMTEzIDQ4MCAxNjIgNDk3VDI3MCA1MTVRMzQ4IDUxNSAzODggNDc5VDQyOCAzNjFWODhRNDI4IDcwIDQzNCA1N1Q0NTQgMzlMNDIxIC02Wk0zNjkgMjgxUTMzNCAyODEgMjg5IDI3OFQyMDQgMjYxVDEzNyAyMTlUMTA5IDE0MVExMDkgMTE4IDExNyA5OVQxMzkgNjRUMTcyIDQxVDIxNSAzMlEyNjIgMzIgMjk3IDUxVDM2OSA5OFYyODFaTTExMCA1OTBWNjMySDM5NVY1OTBIMTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAyOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTUxOCAwTDQ1OCAxNzFIMTUzTDkzIDBIMjhMMjY4IDY3MUgzNDNMNTg1IDBINTE4Wk0zMDYgNjExSDMwNEwxNjggMjI1SDQ0MEwzMDYgNjExWk00MzggODE4UTQzNSA3ODcgNDIzIDc2NlQzOTIgNzMxVDM1MSA3MTFUMzA0IDcwNVEyODAgNzA1IDI1OCA3MTFUMjE3IDczMFQxODcgNzY1VDE3MiA4MThIMjE0UTIxOCA3ODQgMjQwIDc2M1QzMDQgNzQxUTM0NiA3NDEgMzY5IDc2MlQzOTUgODE4SDQzOEg0MzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDM7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNNDIxIC02UTM5OSAzIDM4OSAxNlQzNzUgNTdIMzc0UTMzNyAyNiAyOTUgOFQyMDQgLTExUTE3MSAtMTEgMTQzIC0xVDk0IDI4VDYxIDc2VDQ5IDEzOVE0OSAyMDIgODEgMjM4VDE2MSAyOTNUMjY0IDMxN1QzNjggMzIyVjM4MFEzNjUgNDI2IDM0MSA0NDZUMjY1IDQ2N1EyMTIgNDY3IDE2NiA0NDhUODggNDA3TDY1IDQ1MlExMTMgNDgwIDE2MiA0OTdUMjcwIDUxNVEzNDggNTE1IDM4OCA0NzlUNDI4IDM2MVY4OFE0MjggNzAgNDM0IDU3VDQ1NCAzOUw0MjEgLTZaTTM2OSAyODFRMzM0IDI4MSAyODkgMjc4VDIwNCAyNjFUMTM3IDIxOVQxMDkgMTQxUTEwOSAxMTggMTE3IDk5VDEzOSA2NFQxNzIgNDFUMjE1IDMyUTI2MiAzMiAyOTcgNTFUMzY5IDk4VjI4MVpNMzkyIDY3OFEzODkgNjQ3IDM3NyA2MjZUMzQ2IDU5MVQzMDUgNTcxVDI1OCA1NjVRMjM0IDU2NSAyMTIgNTcxVDE3MSA1OTBUMTQxIDYyNVQxMjYgNjc4SDE2OFExNzIgNjQ0IDE5NCA2MjNUMjU4IDYwMVEzMDAgNjAxIDMyMyA2MjJUMzQ5IDY3OEgzOTJIMzkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA0OyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTU1MSAwUTUxOSAtMTggNTAwIC0zNVQ0NzAgLTY5VDQ1NSAtMTAxVDQ1MSAtMTMxUTQ1MSAtMTY0IDQ3MCAtMTgwVDUxOCAtMTk2UTUzOCAtMTk2IDU1MiAtMTkxVDU3NyAtMTc5TDU5MSAtMjE2UTU4MSAtMjIyIDU1OCAtMjI5VDUxMiAtMjM3UTQ1NSAtMjM3IDQzMCAtMjEwVDQwNCAtMTM2UTQwNCAtOTQgNDMzIC01N1Q1MTYgNUw0NTggMTcxSDE1M0w5MyAwSDI4TDI2OCA2NzFIMzQzTDU4NSAwSDU1MVpNMzA2IDYxMUgzMDRMMTY4IDIyNUg0NDBMMzA2IDYxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNTsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik00MTggLTNRMzg4IC0yMiAzNzAgLTM4VDM0MSAtNzBUMzI3IC0xMDBUMzIzIC0xMjlRMzIzIC0xNTggMzQxIC0xNzdUMzkwIC0xOTZRNDEwIC0xOTYgNDI1IC0xOTFUNDUwIC0xODBMNDYzIC0yMTZRNDUyIC0yMjIgNDMwIC0yMjlUMzg0IC0yMzdRMzI4IC0yMzcgMzAyIC0yMDdUMjc2IC0xMzRRMjc2IC05MCAzMDcgLTUzVDM5NCAxMFEzODMgMTkgMzgwIDMwVDM3NSA1N0gzNzRRMzM3IDI2IDI5NSA4VDIwNCAtMTFRMTcxIC0xMSAxNDMgLTFUOTQgMjhUNjEgNzZUNDkgMTM5UTQ5IDIwMiA4MSAyMzhUMTYxIDI5M1QyNjQgMzE3VDM2OCAzMjJWMzgwUTM2NSA0MjYgMzQxIDQ0NlQyNjUgNDY3UTIxMiA0NjcgMTY2IDQ0OFQ4OCA0MDdMNjUgNDUyUTExMyA0ODAgMTYyIDQ5N1QyNzAgNTE1UTM0OCA1MTUgMzg4IDQ3OVQ0MjggMzYxVjg4UTQyOCA2NyA0MzYgNTJUNDU4IDI5TDQxOCAtM1pNMzY5IDI4MVEzMzQgMjgxIDI4OSAyNzhUMjA0IDI2MVQxMzcgMjE5VDEwOSAxNDFRMTA5IDExOCAxMTcgOTlUMTM5IDY0VDE3MiA0MVQyMTUgMzJRMjYyIDMyIDI5NyA1MVQzNjkgOThWMjgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA2OyIgaG9yaXotYWR2LXg9IjYxNCIgZD0iTTU4MCA3NlE1MjYgMjggNDcyIDlUMzU0IC0xMVEyMTQgLTExIDE0MiA4MFQ2OSAzMzRRNjkgMzk4IDg0IDQ2MFQxMzUgNTcwVDIyNSA2NDhUMzYxIDY3OFE0MjEgNjc4IDQ3MiA2NThUNTc1IDU5Nkw1MzcgNTUyUTQ5MiA1OTAgNDUxIDYwN1QzNjIgNjI1UTMxMiA2MjUgMjcwIDYwN1QxOTggNTUzVDE1MiA0NjNUMTM1IDMzNFExMzUgMjgxIDE0NSAyMjlUMTgwIDEzNlQyNDkgNjhUMzU5IDQyUTQwNSA0MiA0NTIgNjBUNTQ1IDEyMEw1ODAgNzZINTgwWk0zMzQgNzEwTDMwMyA3MzRMNDM5IDg0OUw0OTYgODE2TDMzNCA3MTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDc7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNNDIyIDQxMVEzOTUgNDM3IDM2MSA0NTFUMjg1IDQ2NlEyMzcgNDY2IDIwNiA0NDhUMTU1IDM5OVQxMjcgMzMwVDExOSAyNTFRMTE5IDIxMSAxMjcgMTczVDE1NCAxMDVUMjA1IDU3VDI4NSAzOFEzMjYgMzggMzU4IDUxVDQyNCA5NEw0NDYgNTBRNDExIDIxIDM3MiA1VDI4MiAtMTFRMjI0IC0xMSAxODIgOVQxMTMgNjRUNzIgMTQ2VDU4IDI0OVE1OCAzMDUgNzEgMzUzVDExMiA0MzhUMTgyIDQ5NFQyODMgNTE1UTMzMCA1MTUgMzcxIDQ5OVQ0NDggNDU2TDQyMiA0MTFaTTI1MSA1NjVMMjIwIDU4OUwzNTYgNzA0TDQxMyA2NzFMMjUxIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik01ODAgNzZRNTI2IDI4IDQ3MiA5VDM1NCAtMTFRMjE0IC0xMSAxNDIgODBUNjkgMzM0UTY5IDM5OCA4NCA0NjBUMTM1IDU3MFQyMjUgNjQ4VDM2MSA2NzhRNDIxIDY3OCA0NzIgNjU4VDU3NSA1OTZMNTM3IDU1MlE0OTIgNTkwIDQ1MSA2MDdUMzYyIDYyNVEzMTIgNjI1IDI3MCA2MDdUMTk4IDU1M1QxNTIgNDYzVDEzNSAzMzRRMTM1IDI4MSAxNDUgMjI5VDE4MCAxMzZUMjQ5IDY4VDM1OSA0MlE0MDUgNDIgNDUyIDYwVDU0NSAxMjBMNTgwIDc2SDU4MFpNNDc0IDcwNUwzNTkgNzg3TDI0NSA3MDVMMjE4IDc0MEwzNTkgODM5TDUwMiA3NDBMNDc0IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwOTsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik00MjIgNDExUTM5NSA0MzcgMzYxIDQ1MVQyODUgNDY2UTIzNyA0NjYgMjA2IDQ0OFQxNTUgMzk5VDEyNyAzMzBUMTE5IDI1MVExMTkgMjExIDEyNyAxNzNUMTU0IDEwNVQyMDUgNTdUMjg1IDM4UTMyNiAzOCAzNTggNTFUNDI0IDk0TDQ0NiA1MFE0MTEgMjEgMzcyIDVUMjgyIC0xMVEyMjQgLTExIDE4MiA5VDExMyA2NFQ3MiAxNDZUNTggMjQ5UTU4IDMwNSA3MSAzNTNUMTEyIDQzOFQxODIgNDk0VDI4MyA1MTVRMzMwIDUxNSAzNzEgNDk5VDQ0OCA0NTZMNDIyIDQxMVpNMzkzIDU2NEwyNzggNjQ2TDE2NCA1NjRMMTM3IDU5OUwyNzggNjk4TDQyMSA1OTlMMzkzIDU2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQTsiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik01ODAgNzZRNTI2IDI4IDQ3MiA5VDM1NCAtMTFRMjE0IC0xMSAxNDIgODBUNjkgMzM0UTY5IDM5OCA4NCA0NjBUMTM1IDU3MFQyMjUgNjQ4VDM2MSA2NzhRNDIxIDY3OCA0NzIgNjU4VDU3NSA1OTZMNTM3IDU1MlE0OTIgNTkwIDQ1MSA2MDdUMzYyIDYyNVEzMTIgNjI1IDI3MCA2MDdUMTk4IDU1M1QxNTIgNDYzVDEzNSAzMzRRMTM1IDI4MSAxNDUgMjI5VDE4MCAxMzZUMjQ5IDY4VDM1OSA0MlE0MDUgNDIgNDUyIDYwVDU0NSAxMjBMNTgwIDc2SDU4MFpNNDA0IDc2MlE0MDQgNzQ1IDM5NCA3MzVUMzY0IDcyNFEzNDcgNzI0IDMzNyA3MzRUMzI2IDc2MlEzMjYgNzgwIDMzNiA3OTBUMzY0IDgwMVEzODMgODAxIDM5MyA3OTFUNDA0IDc2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQjsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik00MjIgNDExUTM5NSA0MzcgMzYxIDQ1MVQyODUgNDY2UTIzNyA0NjYgMjA2IDQ0OFQxNTUgMzk5VDEyNyAzMzBUMTE5IDI1MVExMTkgMjExIDEyNyAxNzNUMTU0IDEwNVQyMDUgNTdUMjg1IDM4UTMyNiAzOCAzNTggNTFUNDI0IDk0TDQ0NiA1MFE0MTEgMjEgMzcyIDVUMjgyIC0xMVEyMjQgLTExIDE4MiA5VDExMyA2NFQ3MiAxNDZUNTggMjQ5UTU4IDMwNSA3MSAzNTNUMTEyIDQzOFQxODIgNDk0VDI4MyA1MTVRMzMwIDUxNSAzNzEgNDk5VDQ0OCA0NTZMNDIyIDQxMVpNMzE5IDYyNFEzMTkgNjA3IDMwOSA1OTdUMjc5IDU4NlEyNjIgNTg2IDI1MiA1OTZUMjQxIDYyNFEyNDEgNjQyIDI1MSA2NTJUMjc5IDY2M1EyOTggNjYzIDMwOCA2NTNUMzE5IDYyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik01ODAgNzZRNTI2IDI4IDQ3MiA5VDM1NCAtMTFRMjE0IC0xMSAxNDIgODBUNjkgMzM0UTY5IDM5OCA4NCA0NjBUMTM1IDU3MFQyMjUgNjQ4VDM2MSA2NzhRNDIxIDY3OCA0NzIgNjU4VDU3NSA1OTZMNTM3IDU1MlE0OTIgNTkwIDQ1MSA2MDdUMzYyIDYyNVEzMTIgNjI1IDI3MCA2MDdUMTk4IDU1M1QxNTIgNDYzVDEzNSAzMzRRMTM1IDI4MSAxNDUgMjI5VDE4MCAxMzZUMjQ5IDY4VDM1OSA0MlE0MDUgNDIgNDUyIDYwVDU0NSAxMjBMNTgwIDc2SDU4MFpNNDkxIDgxMkwzNTkgNzE0TDIyOCA4MTJMMjU1IDg0NkwzNTkgNzY2TDQ2NCA4NDZMNDkxIDgxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRDsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik00MjIgNDExUTM5NSA0MzcgMzYxIDQ1MVQyODUgNDY2UTIzNyA0NjYgMjA2IDQ0OFQxNTUgMzk5VDEyNyAzMzBUMTE5IDI1MVExMTkgMjExIDEyNyAxNzNUMTU0IDEwNVQyMDUgNTdUMjg1IDM4UTMyNiAzOCAzNTggNTFUNDI0IDk0TDQ0NiA1MFE0MTEgMjEgMzcyIDVUMjgyIC0xMVEyMjQgLTExIDE4MiA5VDExMyA2NFQ3MiAxNDZUNTggMjQ5UTU4IDMwNSA3MSAzNTNUMTEyIDQzOFQxODIgNDk0VDI4MyA1MTVRMzMwIDUxNSAzNzEgNDk5VDQ0OCA0NTZMNDIyIDQxMVpNNDE1IDY2M0wyODMgNTY1TDE1MiA2NjNMMTc5IDY5N0wyODMgNjE3TDM4OCA2OTdMNDE1IDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRTsiIGhvcml6LWFkdi14PSI2NTAiIGQ9Ik01ODEgMzM4UTU4MSAyNzYgNTY3IDIxNlQ1MTggMTA3VDQyNiAzMFQyODIgMEg5MlY2NjRRMTI5IDY2OSAxNzYgNjcyVDI3OSA2NzVRMzU1IDY3NSA0MTIgNjUxVDUwNiA1ODJUNTYyIDQ3NVQ1ODEgMzM4Wk01MTUgMzM4UTUxNSAzODYgNTA1IDQzNlQ0NjkgNTI4VDM5OCA1OTZUMjgwIDYyM1EyNDggNjIzIDIxNiA2MjFUMTU1IDYxNlY1M0gyNjNRMzkzIDUzIDQ1NCAxMjNUNTE1IDMzOFpNNDA5IDgwM0wyNzcgNzA1TDE0NiA4MDNMMTczIDgzN0wyNzcgNzU3TDM4MiA4MzdMNDA5IDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRjsiIGhvcml6LWFkdi14PSI1NTAiIGQ9Ik00MTcgMEw0MTMgODJINDA5UTM2MCAtMTEgMjU0IC0xMVExOTggLTExIDE2MSAxMFQxMDAgNjZUNjggMTQ5VDU4IDI1MFE1OCAzMDIgNjYgMzQ5VDk3IDQzNFQxNTcgNDkzVDI1NSA1MTVRMzAyIDUxNSAzNDAgNDk5VDQwNyA0MzhINDA5VjcwMEg0NjhWMEg0MTdaTTQwOSAzMzFRNDA5IDM5OCAzNjkgNDMyVDI2NiA0NjdRMjE3IDQ2NyAxODggNDQ4VDE0NCAzOThUMTI0IDMyOFQxMTkgMjUwUTExOSAyMTIgMTI1IDE3NFQxNDcgMTA1VDE5MiA1NVQyNjcgMzVRMzAxIDM1IDMyNyA0OFQzNzIgODNUMzk5IDEzNVQ0MDkgMTk3VjMzMVpNNTYyIDU0NEg1MjBMNTUyIDcwMEg2MjFMNTYyIDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMDsiIGhvcml6LWFkdi14PSI2NTAiIGQ9Ik01ODEgMzM4UTU4MSAyNzYgNTY3IDIxNlQ1MTggMTA3VDQyNSAzMFQyNzkgMEg5MlYzMzJIMzJWMzg1SDkyVjY2NFExMTMgNjY2IDEzNyA2NjhUMTg3IDY3MVQyMzYgNjc0VDI3OSA2NzVRMzU4IDY3NSA0MTUgNjUwVDUwOSA1NzlUNTYzIDQ3M1Q1ODEgMzM4Wk01MTYgMzM4UTUxNiAzODYgNTA3IDQzNlQ0NzEgNTI3VDQwMCA1OTRUMjgzIDYyMFEyNTAgNjIwIDIxNyA2MTlUMTU1IDYxNFYzODVIMzExVjMzMkgxNTVWNTNIMjYzUTM5NyA1MyA0NTYgMTI2VDUxNiAzMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTE7IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDE3IDBMNDEzIDgySDQwOVEzNjAgLTExIDI1NCAtMTFRMTk4IC0xMSAxNjEgOVQxMDAgNjVUNjggMTQ4VDU4IDI0OFE1OCAzMDAgNjYgMzQ3VDk3IDQzMVQxNTcgNDg5VDI1NSA1MTFRMzAyIDUxMSAzNDAgNDk2VDQwNyA0MzVINDA4VjU4MUgyNDBWNjIzSDQwOFY3MDBINDY4VjYyM0g1MzdWNTgxSDQ2OFYwSDQxN1pNNDA5IDMyN1E0MDkgMzk0IDM2OSA0MjlUMjY2IDQ2NFEyMTcgNDY0IDE4OCA0NDVUMTQ0IDM5NlQxMjQgMzI3VDExOSAyNDlRMTE5IDIxMSAxMjUgMTczVDE0NyAxMDRUMTkyIDU0VDI2NyAzNVEzMDEgMzUgMzI3IDQ4VDM3MiA4M1QzOTkgMTM1VDQwOSAxOTdWMzI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTkyIDBWNjY3SDQ2MlY2MTJIMTU1VjM4NUg0MzNWMzMwSDE1NVY1NEg0NzNWMEg5MlpNMTM3IDczMFY3NzJINDIyVjczMEgxMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTM7IiBob3Jpei1hZHYteD0iNTI3IiBkPSJNNDczIDI3MFE0NzMgMjY1IDQ3MyAyNTJUNDcyIDIzMkgxMThRMTE4IDE0MiAxNTkgODlUMjgxIDM2UTMxNiAzNiAzNTIgNDhUNDMwIDkzTDQ1MyA1MFE0MTAgMTYgMzY3IDNUMjc5IC0xMVExNjkgLTExIDExNCA1OVQ1OCAyNTFRNTggMzA5IDcyIDM1OFQxMTMgNDQxVDE4MiA0OTVUMjc3IDUxNVEzMjQgNTE1IDM2MCA0OTdUNDIyIDQ0N1Q0NjAgMzY5VDQ3MyAyNzBaTTQxNiAyNzZRNDE2IDMxMiA0MDkgMzQ3VDM4NCA0MDlUMzQxIDQ1M1QyNzcgNDcwUTIzMCA0NzAgMjAwIDQ1MlQxNTEgNDA2VDEyNiAzNDRUMTE5IDI3Nkg0MTZaTTEzMSA1OTBWNjMySDQxNlY1OTBIMTMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE0OyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTkyIDBWNjY3SDQ2MlY2MTJIMTU1VjM4NUg0MzNWMzMwSDE1NVY1NEg0NzNWMEg5MlpNNDE0IDgxOFE0MTEgNzg3IDM5OSA3NjZUMzY4IDczMVQzMjcgNzExVDI4MCA3MDVRMjU2IDcwNSAyMzQgNzExVDE5MyA3MzBUMTYzIDc2NVQxNDggODE4SDE5MFExOTQgNzg0IDIxNiA3NjNUMjgwIDc0MVEzMjIgNzQxIDM0NSA3NjJUMzcxIDgxOEg0MTRINDE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE1OyIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTQ3MyAyNzBRNDczIDI2NSA0NzMgMjUyVDQ3MiAyMzJIMTE4UTExOCAxNDIgMTU5IDg5VDI4MSAzNlEzMTYgMzYgMzUyIDQ4VDQzMCA5M0w0NTMgNTBRNDEwIDE2IDM2NyAzVDI3OSAtMTFRMTY5IC0xMSAxMTQgNTlUNTggMjUxUTU4IDMwOSA3MiAzNThUMTEzIDQ0MVQxODIgNDk1VDI3NyA1MTVRMzI0IDUxNSAzNjAgNDk3VDQyMiA0NDdUNDYwIDM2OVQ0NzMgMjcwWk00MTYgMjc2UTQxNiAzMTIgNDA5IDM0N1QzODQgNDA5VDM0MSA0NTNUMjc3IDQ3MFEyMzAgNDcwIDIwMCA0NTJUMTUxIDQwNlQxMjYgMzQ0VDExOSAyNzZINDE2Wk00MDggNjc4UTQwNSA2NDcgMzkzIDYyNlQzNjIgNTkxVDMyMSA1NzFUMjc0IDU2NVEyNTAgNTY1IDIyOCA1NzFUMTg3IDU5MFQxNTcgNjI1VDE0MiA2NzhIMTg0UTE4OCA2NDQgMjEwIDYyM1QyNzQgNjAxUTMxNiA2MDEgMzM5IDYyMlQzNjUgNjc4SDQwOEg0MDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTY7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNOTIgMFY2NjdINDYyVjYxMkgxNTVWMzg1SDQzM1YzMzBIMTU1VjU0SDQ3M1YwSDkyWk0zMzcgNzYxUTMzNyA3NDQgMzI3IDczNFQyOTcgNzIzUTI4MCA3MjMgMjcwIDczM1QyNTkgNzYxUTI1OSA3NzkgMjY5IDc4OVQyOTcgODAwUTMxNiA4MDAgMzI2IDc5MFQzMzcgNzYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE3OyIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTQ3MyAyNzBRNDczIDI2NSA0NzMgMjUyVDQ3MiAyMzJIMTE4UTExOCAxNDIgMTU5IDg5VDI4MSAzNlEzMTYgMzYgMzUyIDQ4VDQzMCA5M0w0NTMgNTBRNDEwIDE2IDM2NyAzVDI3OSAtMTFRMTY5IC0xMSAxMTQgNTlUNTggMjUxUTU4IDMwOSA3MiAzNThUMTEzIDQ0MVQxODIgNDk1VDI3NyA1MTVRMzI0IDUxNSAzNjAgNDk3VDQyMiA0NDdUNDYwIDM2OVQ0NzMgMjcwWk00MTYgMjc2UTQxNiAzMTIgNDA5IDM0N1QzODQgNDA5VDM0MSA0NTNUMjc3IDQ3MFEyMzAgNDcwIDIwMCA0NTJUMTUxIDQwNlQxMjYgMzQ0VDExOSAyNzZINDE2Wk0zMTYgNjI0UTMxNiA2MDcgMzA2IDU5N1QyNzYgNTg2UTI1OSA1ODYgMjQ5IDU5NlQyMzggNjI0UTIzOCA2NDIgMjQ4IDY1MlQyNzYgNjYzUTI5NSA2NjMgMzA1IDY1M1QzMTYgNjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE4OyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTQyMyAwUTM5MSAtMTkgMzcyIC0zNlQzNDEgLTY5VDMyNiAtMTAwVDMyMiAtMTI5UTMyMiAtMTU4IDM0MSAtMTc3VDM5MCAtMTk2UTQxMCAtMTk2IDQyNSAtMTkxVDQ0OSAtMTgwTDQ2MyAtMjE2UTQ1MiAtMjIyIDQyOSAtMjI5VDM4MyAtMjM3UTMyNyAtMjM3IDMwMiAtMjA3VDI3NiAtMTM1UTI3NiAtOTMgMzAzIC01OVQzNzggMEg5MlY2NjdINDYyVjYxMkgxNTVWMzg1SDQzM1YzMzBIMTU1VjU0SDQ3M1YwSDQyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExOTsiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik00NzMgMjcwUTQ3MyAyNjUgNDczIDI1MlQ0NzIgMjMySDExOFExMTggMTQyIDE1OSA4OVQyODEgMzZRMzE2IDM2IDM1MiA0OFQ0MzAgOTNMNDUzIDUwUTQzOSAzOSA0MjUgMzFUMzk3IDE0UTM2NCAtNCAzNDQgLTIxVDMxMyAtNTRUMjk4IC04NVQyOTQgLTExNFEyOTQgLTE0NCAzMTMgLTE2M1QzNjIgLTE4M1EzODIgLTE4MyAzOTYgLTE3OFQ0MjEgLTE2Nkw0MzUgLTIwMlE0MjQgLTIwOCA0MDEgLTIxNVQzNTUgLTIyM1EyOTkgLTIyMyAyNzMgLTE5M1QyNDcgLTEyMFEyNDcgLTg4IDI2NCAtNjBUMzEzIC05TDMxMiAtN1EzMDQgLTkgMjk1IC0xMFQyNzggLTExUTE2OCAtMTEgMTEzIDU5VDU4IDI1MVE1OCAzMDkgNzIgMzU4VDExMyA0NDFUMTgyIDQ5NVQyNzcgNTE1UTMyNCA1MTUgMzYwIDQ5N1Q0MjIgNDQ3VDQ2MCAzNjlUNDczIDI3MFpNNDE2IDI3NVE0MTYgMzExIDQwOSAzNDZUMzg1IDQwOFQzNDIgNDUyVDI3NyA0NjlRMjMwIDQ2OSAyMDAgNDUxVDE1MSA0MDVUMTI2IDM0M1QxMTggMjc1SDQxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQTsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwVjY2N0g0NjJWNjEySDE1NVYzODVINDMzVjMzMEgxNTVWNTRINDczVjBIOTJaTTQxNyA4MDNMMjg1IDcwNUwxNTQgODAzTDE4MSA4MzdMMjg1IDc1N0wzOTAgODM3TDQxNyA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBob3Jpei1hZHYteD0iNTI3IiBkPSJNNDczIDI3MFE0NzMgMjY1IDQ3MyAyNTJUNDcyIDIzMkgxMThRMTE4IDE0MiAxNTkgODlUMjgxIDM2UTMxNiAzNiAzNTIgNDhUNDMwIDkzTDQ1MyA1MFE0MTAgMTYgMzY3IDNUMjc5IC0xMVExNjkgLTExIDExNCA1OVQ1OCAyNTFRNTggMzA5IDcyIDM1OFQxMTMgNDQxVDE4MiA0OTVUMjc3IDUxNVEzMjQgNTE1IDM2MCA0OTdUNDIyIDQ0N1Q0NjAgMzY5VDQ3MyAyNzBaTTQxNiAyNzZRNDE2IDMxMiA0MDkgMzQ3VDM4NCA0MDlUMzQxIDQ1M1QyNzcgNDcwUTIzMCA0NzAgMjAwIDQ1MlQxNTEgNDA2VDEyNiAzNDRUMTE5IDI3Nkg0MTZaTTQwNCA2NjNMMjcyIDU2NUwxNDEgNjYzTDE2OCA2OTdMMjcyIDYxN0wzNzcgNjk3TDQwNCA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUM7IiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzYwIDQwUTQwOSA0MCA0NDUgNTRUNTA0IDk1VDUzOSAxNTZUNTUxIDIzNFYyODdIMzY4VjM0MEg2MTBWMjY2UTYxMCAxMjggNTQ0IDU5VDM1NyAtMTBRMjc4IC0xMCAyMjMgMThUMTM0IDk1VDg1IDIwNVQ2OSAzMzNRNjkgMzkyIDgzIDQ1M1QxMzIgNTY1VDIyMyA2NDZUMzY0IDY3OFE0MjkgNjc4IDQ4MCA2NTZUNTc0IDU5OUw1MzggNTU1UTQ5MSA1OTMgNDUwIDYwOVQzNjUgNjI1UTI5OCA2MjUgMjU0IDYwMFQxODMgNTM0VDE0NiA0NDBUMTM1IDMzM1ExMzUgMjgwIDE0NCAyMjhUMTc5IDEzNFQyNDggNjZUMzYwIDQwWk00NzIgNzA0TDM1NyA3ODZMMjQzIDcwNEwyMTYgNzM5TDM1NyA4MzhMNTAwIDczOUw0NzIgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFEOyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTQ2NyAtNTRRNDY3IC0xMTEgNDUzIC0xNDVUNDE1IC0xOTdUMzU5IC0yMjBUMjkxIC0yMjZRMjMxIC0yMjYgMTg0IC0yMTRUOTEgLTE3OEwxMTIgLTEyOFExNTQgLTE1MyAxOTcgLTE2NVQyODkgLTE3OFEzMjIgLTE3OCAzNDQgLTE3M1QzODEgLTE1NVQ0MDEgLTEyMFQ0MDggLTY0VjgzSDQwNlEzODAgMzQgMzQ0IDE0VDI1OCAtN1EyMDIgLTcgMTY0IDEzVDEwMiA2N1Q2OCAxNDlUNTggMjUwUTU4IDMwMSA2NiAzNDlUOTYgNDM0VDE1NiA0OTNUMjU1IDUxNVEzMDYgNTE1IDM0NSA0OThUNDEyIDQzM0g0MTNMNDE3IDUwMkg0NjdWLTU0Wk00MDggMzMyUTQwOCAzOTkgMzY4IDQzM1QyNjUgNDY3UTIxNyA0NjcgMTg4IDQ0OFQxNDQgMzk4VDEyNCAzMjhUMTE5IDI1MFExMTkgMjA4IDEyNiAxNzBUMTUwIDEwM1QxOTUgNTdUMjY3IDM5UTMwMSAzOSAzMjcgNTJUMzcyIDg2VDM5OSAxMzdUNDA4IDE5OVYzMzJaTTM4NiA1NjRMMjcxIDY0NkwxNTcgNTY0TDEzMCA1OTlMMjcxIDY5OEw0MTQgNTk5TDM4NiA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzYwIDQwUTQwOSA0MCA0NDUgNTRUNTA0IDk1VDUzOSAxNTZUNTUxIDIzNFYyODdIMzY4VjM0MEg2MTBWMjY2UTYxMCAxMjggNTQ0IDU5VDM1NyAtMTBRMjc4IC0xMCAyMjMgMThUMTM0IDk1VDg1IDIwNVQ2OSAzMzNRNjkgMzkyIDgzIDQ1M1QxMzIgNTY1VDIyMyA2NDZUMzY0IDY3OFE0MjkgNjc4IDQ4MCA2NTZUNTc0IDU5OUw1MzggNTU1UTQ5MSA1OTMgNDUwIDYwOVQzNjUgNjI1UTI5OCA2MjUgMjU0IDYwMFQxODMgNTM0VDE0NiA0NDBUMTM1IDMzM1ExMzUgMjgwIDE0NCAyMjhUMTc5IDEzNFQyNDggNjZUMzYwIDQwWk00OTUgODI0UTQ5MiA3OTMgNDgwIDc3MlQ0NDkgNzM3VDQwOCA3MTdUMzYxIDcxMVEzMzcgNzExIDMxNSA3MTdUMjc0IDczNlQyNDQgNzcxVDIyOSA4MjRIMjcxUTI3NSA3OTAgMjk3IDc2OVQzNjEgNzQ3UTQwMyA3NDcgNDI2IDc2OFQ0NTIgODI0SDQ5NUg0OTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUY7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNNDY3IC01NFE0NjcgLTExMSA0NTMgLTE0NVQ0MTUgLTE5N1QzNTkgLTIyMFQyOTEgLTIyNlEyMzEgLTIyNiAxODQgLTIxNFQ5MSAtMTc4TDExMiAtMTI4UTE1NCAtMTUzIDE5NyAtMTY1VDI4OSAtMTc4UTMyMiAtMTc4IDM0NCAtMTczVDM4MSAtMTU1VDQwMSAtMTIwVDQwOCAtNjRWODNINDA2UTM4MCAzNCAzNDQgMTRUMjU4IC03UTIwMiAtNyAxNjQgMTNUMTAyIDY3VDY4IDE0OVQ1OCAyNTBRNTggMzAxIDY2IDM0OVQ5NiA0MzRUMTU2IDQ5M1QyNTUgNTE1UTMwNiA1MTUgMzQ1IDQ5OFQ0MTIgNDMzSDQxM0w0MTcgNTAySDQ2N1YtNTRaTTQwOCAzMzJRNDA4IDM5OSAzNjggNDMzVDI2NSA0NjdRMjE3IDQ2NyAxODggNDQ4VDE0NCAzOThUMTI0IDMyOFQxMTkgMjUwUTExOSAyMDggMTI2IDE3MFQxNTAgMTAzVDE5NSA1N1QyNjcgMzlRMzAxIDM5IDMyNyA1MlQzNzIgODZUMzk5IDEzN1Q0MDggMTk5VjMzMlpNNDExIDY3OFE0MDggNjQ3IDM5NiA2MjZUMzY1IDU5MVQzMjQgNTcxVDI3NyA1NjVRMjUzIDU2NSAyMzEgNTcxVDE5MCA1OTBUMTYwIDYyNVQxNDUgNjc4SDE4N1ExOTEgNjQ0IDIxMyA2MjNUMjc3IDYwMVEzMTkgNjAxIDM0MiA2MjJUMzY4IDY3OEg0MTFINDExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIwOyIgaG9yaXotYWR2LXg9IjY3OSIgZD0iTTM2MCA0MFE0MDkgNDAgNDQ1IDU0VDUwNCA5NVQ1MzkgMTU2VDU1MSAyMzRWMjg3SDM2OFYzNDBINjEwVjI2NlE2MTAgMTI4IDU0NCA1OVQzNTcgLTEwUTI3OCAtMTAgMjIzIDE4VDEzNCA5NVQ4NSAyMDVUNjkgMzMzUTY5IDM5MiA4MyA0NTNUMTMyIDU2NVQyMjMgNjQ2VDM2NCA2NzhRNDI5IDY3OCA0ODAgNjU2VDU3NCA1OTlMNTM4IDU1NVE0OTEgNTkzIDQ1MCA2MDlUMzY1IDYyNVEyOTggNjI1IDI1NCA2MDBUMTgzIDUzNFQxNDYgNDQwVDEzNSAzMzNRMTM1IDI4MCAxNDQgMjI4VDE3OSAxMzRUMjQ4IDY2VDM2MCA0MFpNNDA1IDc2MlE0MDUgNzQ1IDM5NSA3MzVUMzY1IDcyNFEzNDggNzI0IDMzOCA3MzRUMzI3IDc2MlEzMjcgNzgwIDMzNyA3OTBUMzY1IDgwMVEzODQgODAxIDM5NCA3OTFUNDA1IDc2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMTsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik00NjcgLTU0UTQ2NyAtMTExIDQ1MyAtMTQ1VDQxNSAtMTk3VDM1OSAtMjIwVDI5MSAtMjI2UTIzMSAtMjI2IDE4NCAtMjE0VDkxIC0xNzhMMTEyIC0xMjhRMTU0IC0xNTMgMTk3IC0xNjVUMjg5IC0xNzhRMzIyIC0xNzggMzQ0IC0xNzNUMzgxIC0xNTVUNDAxIC0xMjBUNDA4IC02NFY4M0g0MDZRMzgwIDM0IDM0NCAxNFQyNTggLTdRMjAyIC03IDE2NCAxM1QxMDIgNjdUNjggMTQ5VDU4IDI1MFE1OCAzMDEgNjYgMzQ5VDk2IDQzNFQxNTYgNDkzVDI1NSA1MTVRMzA2IDUxNSAzNDUgNDk4VDQxMiA0MzNINDEzTDQxNyA1MDJINDY3Vi01NFpNNDA4IDMzMlE0MDggMzk5IDM2OCA0MzNUMjY1IDQ2N1EyMTcgNDY3IDE4OCA0NDhUMTQ0IDM5OFQxMjQgMzI4VDExOSAyNTBRMTE5IDIwOCAxMjYgMTcwVDE1MCAxMDNUMTk1IDU3VDI2NyAzOVEzMDEgMzkgMzI3IDUyVDM3MiA4NlQzOTkgMTM3VDQwOCAxOTlWMzMyWk0zMTIgNjI0UTMxMiA2MDcgMzAyIDU5N1QyNzIgNTg2UTI1NSA1ODYgMjQ1IDU5NlQyMzQgNjI0UTIzNCA2NDIgMjQ0IDY1MlQyNzIgNjYzUTI5MSA2NjMgMzAxIDY1M1QzMTIgNjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIyOyIgaG9yaXotYWR2LXg9IjY3OSIgZD0iTTM2MCA0MFE0MDkgNDAgNDQ1IDU0VDUwNCA5NVQ1MzkgMTU2VDU1MSAyMzRWMjg3SDM2OFYzNDBINjEwVjI2NlE2MTAgMTI4IDU0NCA1OVQzNTcgLTEwUTI3OCAtMTAgMjIzIDE4VDEzNCA5NVQ4NSAyMDVUNjkgMzMzUTY5IDM5MiA4MyA0NTNUMTMyIDU2NVQyMjMgNjQ2VDM2NCA2NzhRNDI5IDY3OCA0ODAgNjU2VDU3NCA1OTlMNTM4IDU1NVE0OTEgNTkzIDQ1MCA2MDlUMzY1IDYyNVEyOTggNjI1IDI1NCA2MDBUMTgzIDUzNFQxNDYgNDQwVDEzNSAzMzNRMTM1IDI4MCAxNDQgMjI4VDE3OSAxMzRUMjQ4IDY2VDM2MCA0MFpNMzQ3IC0yMDZIMzA2TDMzMCAtNjFIMzk5TDM0NyAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIzOyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTQ2NyAtNTRRNDY3IC0xMTEgNDUzIC0xNDVUNDE1IC0xOTdUMzU5IC0yMjBUMjkxIC0yMjZRMjMxIC0yMjYgMTg0IC0yMTRUOTEgLTE3OEwxMTIgLTEyOFExNTQgLTE1MyAxOTcgLTE2NVQyODkgLTE3OFEzMjIgLTE3OCAzNDQgLTE3M1QzODEgLTE1NVQ0MDEgLTEyMFQ0MDggLTY0VjgzSDQwNlEzODAgMzQgMzQ0IDE0VDI1OCAtN1EyMDIgLTcgMTY0IDEzVDEwMiA2N1Q2OCAxNDlUNTggMjUwUTU4IDMwMSA2NiAzNDlUOTYgNDM0VDE1NiA0OTNUMjU1IDUxNVEzMDYgNTE1IDM0NSA0OThUNDEyIDQzM0g0MTNMNDE3IDUwMkg0NjdWLTU0Wk00MDggMzMyUTQwOCAzOTkgMzY4IDQzM1QyNjUgNDY3UTIxNyA0NjcgMTg4IDQ0OFQxNDQgMzk4VDEyNCAzMjhUMTE5IDI1MFExMTkgMjA4IDEyNiAxNzBUMTUwIDEwM1QxOTUgNTdUMjY3IDM5UTMwMSAzOSAzMjcgNTJUMzcyIDg2VDM5OSAxMzdUNDA4IDE5OVYzMzJaTTI5OSA3MDdIMzM5TDMxNCA1NzRIMjM1TDI5OSA3MDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjQ7IiBob3Jpei1hZHYteD0iNjQ1IiBkPSJNNDkwIDBWMzMxSDE1NVYwSDkyVjY2N0gxNTVWMzg4SDQ5MFY2NjdINTUzVjBINDkwWk00NDUgNzA0TDMzMCA3ODZMMjE2IDcwNEwxODkgNzM5TDMzMCA4MzhMNDczIDczOUw0NDUgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI1OyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTQwNyAwVjMwMVE0MDcgMzM4IDQwNCAzNjhUMzkwIDQxOVQzNTQgNDUxVDI4OCA0NjNRMjE3IDQ2MyAxNzkgNDI3VDE0MSAzMjNWMEg4MlY3MDBIMTQxVjQzNEgxNDJRMTYxIDQ3NCAyMDIgNDk0VDMwMCA1MTVRMzUxIDUxNSAzODMgNTAyVDQzNCA0NjNUNDU5IDQwMVQ0NjYgMzE4VjBINDA3Wk0yMjcgNjk3TDExMiA3NzlMLTIgNjk3TC0yOSA3MzJMMTEyIDgzMUwyNTUgNzMyTDIyNyA2OTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjY7IiBob3Jpei1hZHYteD0iNjQ1IiBkPSJNNDg5IDBWMzMxSDE1NVYwSDkyVjUwMUg0VjU1MEg5MlY2NjdIMTU1VjU1MEg0ODlWNjY3SDU1M1Y1NTBINjQxVjUwMUg1NTNWMEg0ODlaTTQ4OSAzODNWNTAxSDE1NVYzODNINDg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI3OyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTE0MSA1ODBWNDMwSDE0MlExNjEgNDcxIDIwMiA0OTFUMzAwIDUxMVEzNTEgNTExIDM4MyA0OThUNDM0IDQ2MFQ0NTkgMzk4VDQ2NiAzMTVWMEg0MDZWMjk3UTQwNiAzMzQgNDA0IDM2NFQzODkgNDE1VDM1NCA0NDhUMjg4IDQ2MFEyMTcgNDYwIDE3OSA0MjNUMTQxIDMxOVYwSDgyVjU4MEgxM1Y2MjJIODJWNzAwSDE0MVY2MjJIMzIwVjU4MEgxNDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjg7IiBob3Jpei1hZHYteD0iMjQ3IiBkPSJNOTIgMFY2NjdIMTU1VjBIOTJaTTI3NyA3NzRRMjY4IDc0MiAyNDMgNzI3VDE5MSA3MTJRMTc1IDcxMiAxNTggNzE4VDEyNCA3MzFUOTIgNzQ0VDYzIDc1MFE0NyA3NTAgMzEgNzQzVDYgNzExTC0yOSA3MzRRLTEzIDc3MCAxMCA3ODNUNTkgNzk2UTc1IDc5NiA5MiA3OTBUMTI2IDc3N1QxNTggNzY0VDE4OCA3NThRMjA1IDc1OCAyMTkgNzY2VDI0MSA3OTZMMjc3IDc3NEgyNzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjk7IiBob3Jpei1hZHYteD0iMjIzIiBkPSJNODIgMFY1MDJIMTQxVjBIODJaTTI2OCA2MzRRMjU5IDYwMiAyMzQgNTg3VDE4MiA1NzJRMTY2IDU3MiAxNDkgNTc4VDExNSA1OTFUODMgNjA0VDU0IDYxMFEzOCA2MTAgMjIgNjAzVC0zIDU3MUwtMzggNTk0US0yMiA2MzAgMSA2NDNUNTAgNjU2UTY2IDY1NiA4MyA2NTBUMTE3IDYzN1QxNDkgNjI0VDE3OSA2MThRMTk2IDYxOCAyMTAgNjI2VDIzMiA2NTZMMjY4IDYzNEgyNjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkE7IiBob3Jpei1hZHYteD0iMjQ3IiBkPSJNOTIgMFY2NjdIMTU1VjBIOTJaTS0xOSA3MzBWNzcySDI2NlY3MzBILTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJCOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTgyIDBWNTAySDE0MVYwSDgyWk0tMzEgNTkwVjYzMkgyNTRWNTkwSC0zMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQzsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwVjY2N0gxNTVWMEg5MlpNMjU3IDgxOFEyNTQgNzg3IDI0MiA3NjZUMjExIDczMVQxNzAgNzExVDEyMyA3MDVROTkgNzA1IDc3IDcxMVQzNiA3MzBUNiA3NjVULTkgODE4SDMzUTM3IDc4NCA1OSA3NjNUMTIzIDc0MVExNjUgNzQxIDE4OCA3NjJUMjE0IDgxOEgyNTdIMjU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJEOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTgyIDBWNTAySDE0MVYwSDgyWk0yNDUgNjc4UTI0MiA2NDcgMjMwIDYyNlQxOTkgNTkxVDE1OCA1NzFUMTExIDU2NVE4NyA1NjUgNjUgNTcxVDI0IDU5MFQtNiA2MjVULTIxIDY3OEgyMVEyNSA2NDQgNDcgNjIzVDExMSA2MDFRMTUzIDYwMSAxNzYgNjIyVDIwMiA2NzhIMjQ1SDI0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRTsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik0xMzggMFExMDcgLTE5IDg4IC0zNlQ1NyAtNjlUNDEgLTEwMFQzNyAtMTI5UTM3IC0xNTggNTYgLTE3N1QxMDUgLTE5NlExMjUgLTE5NiAxMzkgLTE5MVQxNjQgLTE4MEwxNzggLTIxNlExNjcgLTIyMiAxNDQgLTIyOVQ5NyAtMjM3UTQxIC0yMzcgMTYgLTIwN1QtMTAgLTEzNFEtMTAgLTkxIDIxIC01OFQxMDQgMEg5MlY2NjdIMTU1VjBIMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJGOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTEyOSAwUTk3IC0xOSA3OCAtMzZUNDcgLTY5VDMyIC0xMDBUMjggLTEyOVEyOCAtMTU4IDQ2IC0xNzdUOTUgLTE5NlExMTUgLTE5NiAxMzAgLTE5MVQxNTUgLTE4MEwxNjggLTIxNlExNTcgLTIyMiAxMzUgLTIyOVQ4OSAtMjM3UTMzIC0yMzcgNyAtMjA3VC0xOSAtMTM0US0xOSAtOTIgMTIgLTU4VDkzIDBIODJWNTAySDE0MVYwSDEyOVpNMTUwIDYyM1ExNTAgNjA2IDEzOSA1OTVUMTEwIDU4NFE5MyA1ODQgODIgNTk1VDcxIDYyM1E3MSA2NDEgODIgNjUxVDExMCA2NjJRMTI5IDY2MiAxMzkgNjUyVDE1MCA2MjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzA7IiBob3Jpei1hZHYteD0iMjQ3IiBkPSJNOTIgMFY2NjdIMTU1VjBIOTJaTTE2NCA3NjJRMTY0IDc0NSAxNTQgNzM1VDEyNCA3MjRRMTA3IDcyNCA5NyA3MzRUODYgNzYyUTg2IDc4MCA5NiA3OTBUMTI0IDgwMVExNDMgODAxIDE1MyA3OTFUMTY0IDc2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMTsiIGhvcml6LWFkdi14PSIyMjMiIGQ9Ik04MiAwVjUwMkgxNDFWMEg4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMjsiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik05MiAwVjY2N0gxNTVWMEg5MlpNNTExIDE1MVE1MTEgNjYgNDY5IDI4VDM1NSAtMTFRMzE5IC0xMSAyODYgLTJUMjIyIDMwTDI0OCA4MVEyNzYgNTkgMjk4IDUxVDM0OCA0MlE0MDMgNDIgNDI1IDcwVDQ0OCAxNTZWNjY3SDUxMVYxNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzM7IiBob3Jpei1hZHYteD0iNDMyIiBkPSJNODIgMFY1MDJIMTQxVjBIODJaTTE1MSA2MjNRMTUxIDYwNiAxNDAgNTk1VDExMSA1ODRROTQgNTg0IDgzIDU5NVQ3MiA2MjNRNzIgNjQxIDgzIDY1MVQxMTEgNjYyUTEzMCA2NjIgMTQwIDY1MlQxNTEgNjIzWk0zNTkgNjIzUTM1OSA2MDQgMzQ4IDU5NFQzMTkgNTg0UTMwMyA1ODQgMjkyIDU5NFQyODAgNjIzUTI4MCA2NDIgMjkxIDY1MlQzMTkgNjYyUTMzNiA2NjIgMzQ3IDY1MlQzNTkgNjIzWk0zNDkgLTUxUTM0OSAtOTEgMzQyIC0xMjNUMzE3IC0xNzhUMjcwIC0yMTNUMTk5IC0yMjZRMTg0IC0yMjYgMTY5IC0yMjVUMTQwIC0yMjJWLTE3MVExNjcgLTE3NCAxODggLTE3NFEyMjEgLTE3NCAyNDEgLTE2NlQyNzIgLTE0MVQyODYgLTEwMVQyOTAgLTQ3VjUwMkgzNDlWLTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgaG9yaXotYWR2LXg9IjQyNSIgZD0iTTMzMyAxNTFRMzMzIDY2IDI5MSAyOFQxNzcgLTExUTE0MSAtMTEgMTA4IC0yVDQ0IDMwTDcwIDgxUTk4IDU5IDEyMCA1MVQxNzAgNDJRMjI1IDQyIDI0NyA3MFQyNzAgMTU2VjY2N0gzMzNWMTUxSDMzM1pNNDE3IDcwNEwzMDIgNzg2TDE4OCA3MDRMMTYxIDczOUwzMDIgODM4TDQ0NSA3MzlMNDE3IDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGhvcml6LWFkdi14PSIyMjkiIGQ9Ik0xNDcgLTUxUTE0NyAtOTEgMTQwIC0xMjNUMTE0IC0xNzhUNjcgLTIxM1QtNCAtMjI2US0xOSAtMjI2IC0zNCAtMjI1VC02MyAtMjIyVi0xNzFRLTM2IC0xNzQgLTE1IC0xNzRRMTggLTE3NCAzOCAtMTY2VDY5IC0xNDFUODMgLTEwMVQ4NyAtNDdWNTAySDE0N1YtNTFaTTIzMiA1NjRMMTE3IDY0NkwzIDU2NEwtMjQgNTk5TDExNyA2OThMMjYwIDU5OUwyMzIgNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM2OyIgaG9yaXotYWR2LXg9IjU0NSIgZD0iTTQ0NiAwTDIzMiAzNDNMMTU1IDI1MlYwSDkyVjY2N0gxNTVWMzMzSDE1N0w0MjggNjY3SDUwNUwyNzkgMzg4TDUyMiAwSDQ0NlpNMjY3IC0yMDZIMjI2TDI1MCAtNjFIMzE5TDI2NyAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM3OyIgaG9yaXotYWR2LXg9IjQ3NyIgZD0iTTM3OSAwTDIyOCAyNjRMMTQxIDE2MlYwSDgyVjcwMEgxNDFWMjM3SDE0NEwzNTggNTAySDQzNEwyNzEgMzA1TDQ1MSAwSDM3OVpNMjM5IC0yMDZIMTk4TDIyMiAtNjFIMjkxTDIzOSAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM5OyIgaG9yaXotYWR2LXg9IjQ3MyIgZD0iTTkyIDBWNjY3SDE1NVY1NUg0MzZWMEg5MlpNMTI0IDcwNUw5MyA3MjlMMjI5IDg0NEwyODYgODExTDEyNCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0E7IiBob3Jpei1hZHYteD0iMjUxIiBkPSJNMjIyIDBRMjE0IC0yIDIwMCAtM1QxNzIgLTVRMTI1IC01IDEwNCAxNVQ4MiA5MVY3MDBIMTQxVjEwN1ExNDEgODYgMTQ0IDc0VDE1NCA1N1QxNzIgNTBUMjAwIDQ5SDIyMlYwSDIyMlpNMTE3IDczMkw4NiA3NTZMMjIyIDg3MUwyNzkgODM4TDExNyA3MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0I7IiBob3Jpei1hZHYteD0iNDczIiBkPSJNOTIgMFY2NjdIMTU1VjU1SDQzNlYwSDkyWk0yNDQgLTIwNkgyMDNMMjI3IC02MUgyOTZMMjQ0IC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0M7IiBob3Jpei1hZHYteD0iMjUxIiBkPSJNMjIyIDBRMjE0IC0yIDIwMCAtM1QxNzIgLTVRMTI1IC01IDEwNCAxNVQ4MiA5MVY3MDBIMTQxVjEwN1ExNDEgODYgMTQ0IDc0VDE1NCA1N1QxNzIgNTBUMjAwIDQ5SDIyMlYwSDIyMlpNMTM4IC0yMDZIOTdMMTIxIC02MUgxOTBMMTM4IC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Q7IiBob3Jpei1hZHYteD0iNDczIiBkPSJNOTIgMFY2NjdIMTU1VjU1SDQzNlYwSDkyWk0zNzcgNTQ0SDMzNUwzNjcgNzAwSDQzNkwzNzcgNTQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNFOyIgaG9yaXotYWR2LXg9IjI1MSIgZD0iTTIyMiAwUTIxNCAtMiAyMDAgLTNUMTcyIC01UTEyNSAtNSAxMDQgMTVUODIgOTFWNzAwSDE0MVYxMDdRMTQxIDg2IDE0NCA3NFQxNTQgNTdUMTcyIDUwVDIwMCA0OUgyMjJWMFpNMjM3IDU0NEgxOTVMMjI3IDcwMEgyOTZMMjM3IDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRjsiIGhvcml6LWFkdi14PSI0NzMiIGQ9Ik05MiAwVjY2N0gxNTVWNTVINDM2VjBIOTJaTTQzNCAyNTdRNDM0IDIzNCA0MjIgMjIyVDM4NiAyMDlRMzY0IDIwOSAzNTIgMjIxVDMzOSAyNTdRMzM5IDMwNCAzODcgMzA0UTQzNCAzMDQgNDM0IDI1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MDsiIGhvcml6LWFkdi14PSIzMDIiIGQ9Ik0yMjIgMFEyMTQgLTIgMjAwIC0zVDE3MiAtNVExMjUgLTUgMTA0IDE1VDgyIDkxVjcwMEgxNDFWMTA3UTE0MSA4NiAxNDQgNzRUMTU0IDU3VDE3MiA1MFQyMDAgNDlIMjIyVjBaTTMxOCAyMzVRMzE4IDIxMiAzMDYgMjAwVDI3MCAxODdRMjQ4IDE4NyAyMzYgMTk5VDIyMyAyMzVRMjIzIDI4MiAyNzEgMjgyUTMxOCAyODIgMzE4IDIzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MTsiIGhvcml6LWFkdi14PSI0NzMiIGQ9Ik05MiAwVjMyMUw1MCAyOTZWMzU0TDkyIDM3OVY2NjdIMTU1VjQxNEwyNzEgNDgxVjQyMkwxNTUgMzU1VjU1SDQzNlYwSDkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQyOyIgaG9yaXotYWR2LXg9IjI1MSIgZD0iTTE0MSAzNjRWMTA3UTE0MSA4NiAxNDQgNzRUMTU0IDU3VDE3MiA1MFQyMDAgNDlIMjIyVjBRMjEzIC0yIDIwMCAtM1QxNzMgLTVRMTI1IC01IDEwNCAxNVQ4MiA5MVYzMzJMMzkgMzA2VjM2NEw4MiAzODlWNzAwSDE0MVY0MjBMMjQ0IDQ3OVY0MjNMMTQxIDM2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MzsiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik01MzAgMEwxNTggNTYwSDE1NFYwSDkyVjY2N0gxNTlMNTI2IDExMEg1MzBWNjY3SDU5MlYwSDUzMFpNMzQyIDcwNUwzMTEgNzI5TDQ0NyA4NDRMNTA0IDgxMUwzNDIgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTQwNyAwVjMwMVE0MDcgMzM4IDQwNCAzNjhUMzg4IDQxOVQzNTEgNDUxVDI4NiA0NjNRMjE1IDQ2MyAxNzggNDI2VDE0MSAzMjNWMEg4MlY1MDJIMTMzTDEzOSA0MzdIMTQxUTE5MCA1MTUgMjk3IDUxNVEzNDkgNTE1IDM4MiA1MDJUNDM0IDQ2NFQ0NTkgNDAyVDQ2NiAzMTlWMEg0MDdaTTI2MSA1NjVMMjMwIDU4OUwzNjYgNzA0TDQyMyA2NzFMMjYxIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NTsiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik01MzAgMEwxNTggNTYwSDE1NFYwSDkyVjY2N0gxNTlMNTI2IDExMEg1MzBWNjY3SDU5MlYwSDUzMFpNMzE5IC0yMDZIMjc4TDMwMiAtNjFIMzcxTDMxOSAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ2OyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTQwNyAwVjMwMVE0MDcgMzM4IDQwNCAzNjhUMzg4IDQxOVQzNTEgNDUxVDI4NiA0NjNRMjE1IDQ2MyAxNzggNDI2VDE0MSAzMjNWMEg4MlY1MDJIMTMzTDEzOSA0MzdIMTQxUTE5MCA1MTUgMjk3IDUxNVEzNDkgNTE1IDM4MiA1MDJUNDM0IDQ2NFQ0NTkgNDAyVDQ2NiAzMTlWMEg0MDdaTTI2NyAtMjA2SDIyNkwyNTAgLTYxSDMxOUwyNjcgLTIwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NzsiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik01MzAgMEwxNTggNTYwSDE1NFYwSDkyVjY2N0gxNTlMNTI2IDExMEg1MzBWNjY3SDU5MlYwSDUzMFpNNDkxIDgwM0wzNTkgNzA1TDIyOCA4MDNMMjU1IDgzN0wzNTkgNzU3TDQ2NCA4MzdMNDkxIDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik00MDcgMFYzMDFRNDA3IDMzOCA0MDQgMzY4VDM4OCA0MTlUMzUxIDQ1MVQyODYgNDYzUTIxNSA0NjMgMTc4IDQyNlQxNDEgMzIzVjBIODJWNTAySDEzM0wxMzkgNDM3SDE0MVExOTAgNTE1IDI5NyA1MTVRMzQ5IDUxNSAzODIgNTAyVDQzNCA0NjRUNDU5IDQwMlQ0NjYgMzE5VjBINDA3Wk00MTQgNjYzTDI4MiA1NjVMMTUxIDY2M0wxNzggNjk3TDI4MiA2MTdMMzg3IDY5N0w0MTQgNjYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRBOyIgaG9yaXotYWR2LXg9IjY4NCIgZD0iTTQzNyAtMTc5SDQ1MFE0NzQgLTE3OSA0ODkgLTE3MFQ1MTQgLTE0N1Q1MjcgLTExNVQ1MzEgLTc5VjJMMTU1IDU3MkgxNTRWMEg5MlY2NjdIMTU5TDUyOSAxMDNINTMxVjY2N0g1OTJWLTc2UTU5MiAtMTQ2IDU2MSAtMTkxVDQ1NiAtMjM2SDQzN1YtMTc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRCOyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTEzMyA1MDJMMTM5IDQzN0gxNDFRMTkwIDUxNSAyOTcgNTE1UTM0OSA1MTUgMzgyIDUwMlQ0MzQgNDY0VDQ1OSA0MDJUNDY2IDMxOVYtMjdRNDY2IC02OCA0NTkgLTEwMFQ0MzMgLTE1NVQzODYgLTE5MFQzMTQgLTIwMkgyOTVWLTE0OEgzMDhRMzM4IC0xNDggMzU3IC0xMzlUMzg3IC0xMTNUNDAzIC03NVQ0MDcgLTMwVjMwMVE0MDcgMzM4IDQwNCAzNjhUMzg4IDQxOVQzNTEgNDUxVDI4NiA0NjNRMjE1IDQ2MyAxNzggNDI2VDE0MSAzMjNWMEg4MlY1MDJIMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRDOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTY2MyAzMzRRNjYzIDI2NyA2NDggMjA1VDU5NyA5NFQ1MDYgMThUMzY2IC0xMVEyODMgLTExIDIyNyAxN1QxMzUgOTRUODUgMjA0VDY5IDMzNFE2OSAzOTggODQgNDU5VDEzMyA1NjlUMjI1IDY0OFQzNjYgNjc4UTQ0OSA2NzggNTA2IDY0OVQ1OTggNTcyVDY0OCA0NjJUNjYzIDMzNFpNNTk3IDMzM1E1OTcgMzg1IDU4NyA0MzdUNTUxIDUzMlQ0ODEgNjAwVDM2NiA2MjdRMjk3IDYyNyAyNTIgNjAxVDE4MSA1MzJUMTQ1IDQzOFQxMzUgMzMzUTEzNSAyODIgMTQ1IDIzMFQxODEgMTM2VDI1MiA2OFQzNjYgNDFRNDM2IDQxIDQ4MCA2N1Q1NTEgMTM2VDU4NyAyMzBUNTk3IDMzM1pNMjI5IDczMFY3NzJINTE0VjczMEgyMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEQ7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNNTggMjUwUTU4IDMwNCA3MCAzNTJUMTA4IDQzN1QxNzcgNDk0VDI3OSA1MTVRMzM3IDUxNSAzNzkgNDk1VDQ0OCA0MzlUNDg4IDM1NVQ1MDEgMjUwUTUwMSAxOTYgNDg5IDE0OVQ0NDkgNjZUMzgwIDEwVDI3OSAtMTFRMjIwIC0xMSAxNzkgOVQxMTAgNjVUNzEgMTQ4VDU4IDI1MFpNMTIwIDI1MVExMjAgMjEwIDEyNyAxNzFUMTUyIDEwMlQyMDEgNTRUMjgwIDM2UTMyNyAzNiAzNTcgNTRUNDA2IDEwMlQ0MzEgMTcxVDQzOSAyNTFRNDM5IDI5MyA0MzIgMzMyVDQwNyA0MDFUMzU4IDQ0OVQyNzkgNDY3UTIzMiA0NjcgMjAxIDQ0OVQxNTIgNDAxVDEyNyAzMzJUMTIwIDI1MVpNMTM3IDU5MFY2MzJINDIyVjU5MEgxMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEU7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNjYzIDMzNFE2NjMgMjY3IDY0OCAyMDVUNTk3IDk0VDUwNiAxOFQzNjYgLTExUTI4MyAtMTEgMjI3IDE3VDEzNSA5NFQ4NSAyMDRUNjkgMzM0UTY5IDM5OCA4NCA0NTlUMTMzIDU2OVQyMjUgNjQ4VDM2NiA2NzhRNDQ5IDY3OCA1MDYgNjQ5VDU5OCA1NzJUNjQ4IDQ2MlQ2NjMgMzM0Wk01OTcgMzMzUTU5NyAzODUgNTg3IDQzN1Q1NTEgNTMyVDQ4MSA2MDBUMzY2IDYyN1EyOTcgNjI3IDI1MiA2MDFUMTgxIDUzMlQxNDUgNDM4VDEzNSAzMzNRMTM1IDI4MiAxNDUgMjMwVDE4MSAxMzZUMjUyIDY4VDM2NiA0MVE0MzYgNDEgNDgwIDY3VDU1MSAxMzZUNTg3IDIzMFQ1OTcgMzMzWk01MDMgODI0UTUwMCA3OTMgNDg4IDc3MlQ0NTcgNzM3VDQxNiA3MTdUMzY5IDcxMVEzNDUgNzExIDMyMyA3MTdUMjgyIDczNlQyNTIgNzcxVDIzNyA4MjRIMjc5UTI4MyA3OTAgMzA1IDc2OVQzNjkgNzQ3UTQxMSA3NDcgNDM0IDc2OFQ0NjAgODI0SDUwM0g1MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEY7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNNTggMjUwUTU4IDMwNCA3MCAzNTJUMTA4IDQzN1QxNzcgNDk0VDI3OSA1MTVRMzM3IDUxNSAzNzkgNDk1VDQ0OCA0MzlUNDg4IDM1NVQ1MDEgMjUwUTUwMSAxOTYgNDg5IDE0OVQ0NDkgNjZUMzgwIDEwVDI3OSAtMTFRMjIwIC0xMSAxNzkgOVQxMTAgNjVUNzEgMTQ4VDU4IDI1MFpNMTIwIDI1MVExMjAgMjEwIDEyNyAxNzFUMTUyIDEwMlQyMDEgNTRUMjgwIDM2UTMyNyAzNiAzNTcgNTRUNDA2IDEwMlQ0MzEgMTcxVDQzOSAyNTFRNDM5IDI5MyA0MzIgMzMyVDQwNyA0MDFUMzU4IDQ0OVQyNzkgNDY3UTIzMiA0NjcgMjAxIDQ0OVQxNTIgNDAxVDEyNyAzMzJUMTIwIDI1MVpNNDEzIDY3OFE0MTAgNjQ3IDM5OCA2MjZUMzY3IDU5MVQzMjYgNTcxVDI3OSA1NjVRMjU1IDU2NSAyMzMgNTcxVDE5MiA1OTBUMTYyIDYyNVQxNDcgNjc4SDE4OVExOTMgNjQ0IDIxNSA2MjNUMjc5IDYwMVEzMjEgNjAxIDM0NCA2MjJUMzcwIDY3OEg0MTNINDEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUwOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTY2MyAzMzRRNjYzIDI2NyA2NDggMjA1VDU5NyA5NFQ1MDYgMThUMzY2IC0xMVEyODMgLTExIDIyNyAxN1QxMzUgOTRUODUgMjA0VDY5IDMzNFE2OSAzOTggODQgNDU5VDEzMyA1NjlUMjI1IDY0OFQzNjYgNjc4UTQ0OSA2NzggNTA2IDY0OVQ1OTggNTcyVDY0OCA0NjJUNjYzIDMzNFpNNTk3IDMzM1E1OTcgMzg1IDU4NyA0MzdUNTUxIDUzMlQ0ODEgNjAwVDM2NiA2MjdRMjk3IDYyNyAyNTIgNjAxVDE4MSA1MzJUMTQ1IDQzOFQxMzUgMzMzUTEzNSAyODIgMTQ1IDIzMFQxODEgMTM2VDI1MiA2OFQzNjYgNDFRNDM2IDQxIDQ4MCA2N1Q1NTEgMTM2VDU4NyAyMzBUNTk3IDMzM1pNNDg1IDY5M0w0NTMgNzEyTDU5MSA4MjdMNjUwIDc5OEw0ODUgNjkzWk0yNzUgNjkzTDI0MyA3MTJMMzgxIDgyN0w0NDAgNzk4TDI3NSA2OTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTE7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNNTggMjUwUTU4IDMwNCA3MCAzNTJUMTA4IDQzN1QxNzcgNDk0VDI3OSA1MTVRMzM3IDUxNSAzNzkgNDk1VDQ0OCA0MzlUNDg4IDM1NVQ1MDEgMjUwUTUwMSAxOTYgNDg5IDE0OVQ0NDkgNjZUMzgwIDEwVDI3OSAtMTFRMjIwIC0xMSAxNzkgOVQxMTAgNjVUNzEgMTQ4VDU4IDI1MFpNMTIwIDI1MVExMjAgMjEwIDEyNyAxNzFUMTUyIDEwMlQyMDEgNTRUMjgwIDM2UTMyNyAzNiAzNTcgNTRUNDA2IDEwMlQ0MzEgMTcxVDQzOSAyNTFRNDM5IDI5MyA0MzIgMzMyVDQwNyA0MDFUMzU4IDQ0OVQyNzkgNDY3UTIzMiA0NjcgMjAxIDQ0OVQxNTIgNDAxVDEyNyAzMzJUMTIwIDI1MVpNNDEwIDU2NkwzNzggNTg1TDUxNiA3MDBMNTc1IDY3MUw0MTAgNTY2Wk0yMDAgNTY2TDE2OCA1ODVMMzA2IDcwMEwzNjUgNjcxTDIwMCA1NjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTI7IiBob3Jpei1hZHYteD0iODUzIiBkPSJNNDYxIDBRNDQwIC01IDQxMiAtOFQzNTcgLTExUTI3NCAtMTEgMjE5IDE3VDEzMCA5NFQ4MyAyMDRUNjkgMzM0UTY5IDM5OCA4MiA0NTlUMTI5IDU2OVQyMTcgNjQ4VDM1NyA2NzhRMzgzIDY3OCA0MTEgNjc1VDQ2MSA2NjdIODAzVjYxMkg1MjRWMzg1SDc3NFYzMzBINTI0VjU0SDgxNVYwSDQ2MVpNMzU4IDQxUTM4NyA0MSA0MTQgNDRUNDYxIDU2VjYxMFE0NDEgNjE4IDQxNCA2MjJUMzU4IDYyN1EyODkgNjI3IDI0NiA2MDFUMTc4IDUzMlQxNDQgNDM4VDEzNSAzMzNRMTM1IDI4MiAxNDQgMjMwVDE3NyAxMzZUMjQ1IDY4VDM1OCA0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MzsiIGhvcml6LWFkdi14PSI5MTEiIGQ9Ik04NTcgMjYxUTg1NyAyNTYgODU3IDI0OFQ4NTYgMjMySDUwMlE1MDMgMTM4IDU0NCA4OFQ2NjcgMzhRNzQwIDM4IDgxMiA5NUw4MzUgNTFRNzk4IDIyIDc1NSA2VDY2NiAtMTFRNjI2IC0xMSA1OTUgLTJUNTQxIDI1VDUwMCA2NFQ0NzEgMTE0UTQ0NCA0NyAzOTYgMThUMjc5IC0xMVExNzUgLTExIDExNyA1NFQ1OCAyNTFRNTggMzc3IDExNSA0NDZUMjc5IDUxNVEzNDYgNTE1IDM5NSA0ODRUNDcwIDM4N1E0OTUgNDQ3IDU0MiA0ODFUNjU2IDUxNVE3NTAgNTE1IDgwMyA0NDlUODU3IDI2MVpNODAwIDI3N1E3OTkgMzA5IDc5MyAzNDJUNzcwIDQwNFQ3MjcgNDQ5VDY1NyA0NjdRNTg3IDQ2NyA1NDUgNDE3VDUwMiAyNzdIODAwWk00MzkgMjUxUTQzOSAyOTYgNDMxIDMzNFQ0MDUgNDAyVDM1NiA0NDdUMjc5IDQ2NFEyMzQgNDY0IDIwMyA0NDhUMTU0IDQwMlQxMjcgMzM1VDExOSAyNTFRMTE5IDE5MyAxMzEgMTUzVDE2NCA4N1QyMTUgNTBUMjgwIDM4UTMxNiAzOCAzNDUgNDlUMzk1IDg2VDQyNyAxNTJUNDM5IDI1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NDsiIGhvcml6LWFkdi14PSI1ODEiIGQ9Ik00NTkgMEwzNzUgMjQ2UTM2NyAyNzEgMzUxIDI4MVQzMDcgMjkySDE1NVYwSDkyVjY2NFExMTcgNjY3IDEzOSA2NjlUMTgzIDY3MlQyMjcgNjc0VDI3NiA2NzVRMzIxIDY3NSAzNjMgNjY3VDQzOCA2MzdUNDkwIDU4MFQ1MTAgNDg3UTUxMCA0MjQgNDg2IDM3OVQzOTkgMzEyVjMxMVE0MTAgMzA2IDQxOSAyOTJUNDMzIDI2NUw1MjYgMEg0NTlaTTQ0NiA0ODFRNDQ2IDUyMyA0MzMgNTUwVDM5OCA1OTRUMzQ0IDYxNlQyNzcgNjIzUTI0MyA2MjMgMjE1IDYyMlQxNTUgNjE1VjM0NEgyOTdRMzY5IDM0NCA0MDcgMzc0VDQ0NiA0ODFaTTI2MSA3MDZMMjMwIDczMEwzNjYgODQ1TDQyMyA4MTJMMjYxIDcwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGhvcml6LWFkdi14PSIzNDMiIGQ9Ik0zMDIgNDYxUTIyNyA0NjEgMTg0IDQzMlQxNDEgMzMzVjBIODJWNTAySDEzMkwxMzggNDQwSDEzOVExNjIgNDgwIDIwMyA0OTdUMjk3IDUxNEgzMTlWNDYxSDMwMlpNMTg3IDU2NUwxNTYgNTg5TDI5MiA3MDRMMzQ5IDY3MUwxODcgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU2OyIgaG9yaXotYWR2LXg9IjU4MSIgZD0iTTQ1OSAwTDM3NSAyNDZRMzY3IDI3MSAzNTEgMjgxVDMwNyAyOTJIMTU1VjBIOTJWNjY0UTExNyA2NjcgMTM5IDY2OVQxODMgNjcyVDIyNyA2NzRUMjc2IDY3NVEzMjEgNjc1IDM2MyA2NjdUNDM4IDYzN1Q0OTAgNTgwVDUxMCA0ODdRNTEwIDQyNCA0ODYgMzc5VDM5OSAzMTJWMzExUTQxMCAzMDYgNDE5IDI5MlQ0MzMgMjY1TDUyNiAwSDQ1OVpNNDQ2IDQ4MVE0NDYgNTIzIDQzMyA1NTBUMzk4IDU5NFQzNDQgNjE2VDI3NyA2MjNRMjQzIDYyMyAyMTUgNjIyVDE1NSA2MTVWMzQ0SDI5N1EzNjkgMzQ0IDQwNyAzNzRUNDQ2IDQ4MVpNMjc3IC0yMDZIMjM2TDI2MCAtNjFIMzI5TDI3NyAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU3OyIgaG9yaXotYWR2LXg9IjM0MyIgZD0iTTMwMiA0NjFRMjI3IDQ2MSAxODQgNDMyVDE0MSAzMzNWMEg4MlY1MDJIMTMyTDEzOCA0NDBIMTM5UTE2MiA0ODAgMjAzIDQ5N1QyOTcgNTE0SDMxOVY0NjFIMzAyWk05NCAtMjA2SDUzTDc3IC02MUgxNDZMOTQgLTIwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1ODsiIGhvcml6LWFkdi14PSI1ODEiIGQ9Ik00NTkgMEwzNzUgMjQ2UTM2NyAyNzEgMzUxIDI4MVQzMDcgMjkySDE1NVYwSDkyVjY2NFExMTcgNjY3IDEzOSA2NjlUMTgzIDY3MlQyMjcgNjc0VDI3NiA2NzVRMzIxIDY3NSAzNjMgNjY3VDQzOCA2MzdUNDkwIDU4MFQ1MTAgNDg3UTUxMCA0MjQgNDg2IDM3OVQzOTkgMzEyVjMxMVE0MTAgMzA2IDQxOSAyOTJUNDMzIDI2NUw1MjYgMEg0NTlaTTQ0NiA0ODFRNDQ2IDUyMyA0MzMgNTUwVDM5OCA1OTRUMzQ0IDYxNlQyNzcgNjIzUTI0MyA2MjMgMjE1IDYyMlQxNTUgNjE1VjM0NEgyOTdRMzY5IDM0NCA0MDcgMzc0VDQ0NiA0ODFaTTQxMCA4MDNMMjc4IDcwNUwxNDcgODAzTDE3NCA4MzdMMjc4IDc1N0wzODMgODM3TDQxMCA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTk7IiBob3Jpei1hZHYteD0iMzQzIiBkPSJNMzAyIDQ2MVEyMjcgNDYxIDE4NCA0MzJUMTQxIDMzM1YwSDgyVjUwMkgxMzJMMTM4IDQ0MEgxMzlRMTYyIDQ4MCAyMDMgNDk3VDI5NyA1MTRIMzE5VjQ2MUgzMDJaTTMyMiA2NjNMMTkwIDU2NUw1OSA2NjNMODYgNjk3TDE5MCA2MTdMMjk1IDY5N0wzMjIgNjYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVBOyIgaG9yaXotYWR2LXg9IjUwNiIgZD0iTTQ1NCAxODBRNDU0IDg5IDQwMiAzOVQyNTIgLTExUTE5MSAtMTEgMTQwIDVUMzcgNTdMNjcgMTA3UTEwMyA3OSAxNDcgNjBUMjQ2IDQwUTMxNSA0MCAzNTIgNzVUMzkwIDE4MFEzOTAgMjE1IDM3NSAyMzhUMzM2IDI3OVQyODAgMzA5VDIxNiAzMzZRMTg2IDM0OSAxNTcgMzY0VDEwNiA0MDBUNzAgNDUwVDU2IDUxOVE1NiA1NjEgNzIgNTkxVDExNCA2NDBUMTc1IDY2OVQyNDggNjc4UTMwMCA2NzggMzQ2IDY2M1Q0MzYgNjE4TDQxMSA1NjVRMzc2IDU5MyAzMzYgNjA5VDI0NyA2MjZRMjIyIDYyNiAxOTkgNjIwVDE1OSA2MDBUMTMyIDU2N1QxMjEgNTIwUTEyMSA0OTEgMTMyIDQ3MVQxNjIgNDM2VDIwNiA0MDlUMjU5IDM4NlEyOTMgMzcyIDMyOCAzNTdUMzkxIDMxOVQ0MzYgMjYzVDQ1NCAxODBaTTI0MCA3MDZMMjA5IDczMEwzNDUgODQ1TDQwMiA4MTJMMjQwIDcwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QjsiIGhvcml6LWFkdi14PSI0MjgiIGQ9Ik0zODMgMTM2UTM4MyA5NyAzNzAgNjlUMzMzIDI0VDI4MCAtMlQyMTYgLTExUTE2NCAtMTEgMTIyIDFUMzkgMzhMNjIgODVROTQgNjMgMTM2IDUwVDIxNiAzNlEyMzggMzYgMjU4IDQxVDI5MyA1OFQzMTcgODhUMzI2IDEzMlEzMjYgMTU2IDMxNiAxNzJUMjg5IDIwMFQyNTAgMjIwVDIwNiAyMzZRMTc2IDI0NiAxNDggMjU3VDk5IDI4NlQ2NSAzMjdUNTIgMzg2UTUyIDQyMiA2NyA0NDZUMTA1IDQ4NlQxNTggNTA4VDIxOCA1MTVRMjU5IDUxNSAyOTYgNTA1VDM2OCA0NzdMMzUwIDQyOVEzMjUgNDQ0IDI5MCA0NTVUMjE5IDQ2N1ExOTcgNDY3IDE3NyA0NjNUMTQyIDQ0OFQxMTggNDIyVDEwOSAzODNRMTA5IDM2MiAxMTkgMzQ3VDE0NyAzMjFUMTg3IDMwMVQyMzUgMjg1UTI2MiAyNzYgMjg4IDI2NVQzMzYgMjM3VDM3MCAxOTZUMzgzIDEzNlpNMTg3IDU2NUwxNTYgNTg5TDI5MiA3MDRMMzQ5IDY3MUwxODcgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVDOyIgaG9yaXotYWR2LXg9IjUwNiIgZD0iTTQ1NCAxODBRNDU0IDg5IDQwMiAzOVQyNTIgLTExUTE5MSAtMTEgMTQwIDVUMzcgNTdMNjcgMTA3UTEwMyA3OSAxNDcgNjBUMjQ2IDQwUTMxNSA0MCAzNTIgNzVUMzkwIDE4MFEzOTAgMjE1IDM3NSAyMzhUMzM2IDI3OVQyODAgMzA5VDIxNiAzMzZRMTg2IDM0OSAxNTcgMzY0VDEwNiA0MDBUNzAgNDUwVDU2IDUxOVE1NiA1NjEgNzIgNTkxVDExNCA2NDBUMTc1IDY2OVQyNDggNjc4UTMwMCA2NzggMzQ2IDY2M1Q0MzYgNjE4TDQxMSA1NjVRMzc2IDU5MyAzMzYgNjA5VDI0NyA2MjZRMjIyIDYyNiAxOTkgNjIwVDE1OSA2MDBUMTMyIDU2N1QxMjEgNTIwUTEyMSA0OTEgMTMyIDQ3MVQxNjIgNDM2VDIwNiA0MDlUMjU5IDM4NlEyOTMgMzcyIDMyOCAzNTdUMzkxIDMxOVQ0MzYgMjYzVDQ1NCAxODBaTTM2OCA3MDRMMjUzIDc4NkwxMzkgNzA0TDExMiA3MzlMMjUzIDgzOEwzOTYgNzM5TDM2OCA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUQ7IiBob3Jpei1hZHYteD0iNDI4IiBkPSJNMzgzIDEzNlEzODMgOTcgMzcwIDY5VDMzMyAyNFQyODAgLTJUMjE2IC0xMVExNjQgLTExIDEyMiAxVDM5IDM4TDYyIDg1UTk0IDYzIDEzNiA1MFQyMTYgMzZRMjM4IDM2IDI1OCA0MVQyOTMgNThUMzE3IDg4VDMyNiAxMzJRMzI2IDE1NiAzMTYgMTcyVDI4OSAyMDBUMjUwIDIyMFQyMDYgMjM2UTE3NiAyNDYgMTQ4IDI1N1Q5OSAyODZUNjUgMzI3VDUyIDM4NlE1MiA0MjIgNjcgNDQ2VDEwNSA0ODZUMTU4IDUwOFQyMTggNTE1UTI1OSA1MTUgMjk2IDUwNVQzNjggNDc3TDM1MCA0MjlRMzI1IDQ0NCAyOTAgNDU1VDIxOSA0NjdRMTk3IDQ2NyAxNzcgNDYzVDE0MiA0NDhUMTE4IDQyMlQxMDkgMzgzUTEwOSAzNjIgMTE5IDM0N1QxNDcgMzIxVDE4NyAzMDFUMjM1IDI4NVEyNjIgMjc2IDI4OCAyNjVUMzM2IDIzN1QzNzAgMTk2VDM4MyAxMzZaTTM0NCA1NjRMMjI5IDY0NkwxMTUgNTY0TDg4IDU5OUwyMjkgNjk4TDM3MiA1OTlMMzQ0IDU2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RTsiIGhvcml6LWFkdi14PSI1MDciIGQ9Ik0zMzIgLTEyOVEzMzIgLTE2NyAzMDcgLTE4N1QyNDEgLTIwN1EyMTggLTIwNyAxOTcgLTIwMVQxNjAgLTE4NEwxNzQgLTE1NVExODkgLTE2NCAyMDQgLTE2OVQyNDAgLTE3NFEyNjAgLTE3NCAyNzUgLTE2NVQyOTEgLTEzMFEyOTEgLTEwNSAyNzYgLTk2VDIzOSAtODdRMjE5IC04NyAyMDIgLTkyTDE4OSAtNzdMMjI1IC0xMFExNzIgLTYgMTI3IDEwVDM3IDU3TDY3IDEwN1ExMDMgNzkgMTQ3IDYwVDI0NiA0MFEzMTUgNDAgMzUzIDc1VDM5MSAxODBRMzkxIDIxNCAzNzYgMjM3VDMzNiAyNzhUMjgwIDMwOFQyMTYgMzM2UTE4NiAzNDkgMTU3IDM2NFQxMDYgNDAwVDcwIDQ1MFQ1NiA1MTlRNTYgNTYxIDcyIDU5MVQxMTQgNjQwVDE3NSA2NjlUMjQ4IDY3OFEzMDAgNjc4IDM0NiA2NjNUNDM2IDYxOEw0MTEgNTY1UTM3NiA1OTMgMzM2IDYwOVQyNDcgNjI2UTIyMiA2MjYgMTk5IDYyMFQxNTkgNjAwVDEzMiA1NjdUMTIxIDUyMFExMjEgNDkxIDEzMiA0NzFUMTYzIDQzNlQyMDcgNDA5VDI1OSAzODZRMjkzIDM3MiAzMjggMzU3VDM5MSAzMTlUNDM3IDI2M1Q0NTUgMTgwUTQ1NSA5MiA0MDYgNDJUMjYyIC0xMUwyMzUgLTU5TDIzNiAtNjBRMjQ4IC01NyAyNjIgLTU3UTI5NCAtNTcgMzEzIC03NVQzMzIgLTEyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RjsiIGhvcml6LWFkdi14PSI0MjgiIGQ9Ik0zMDUgLTEyOFEzMDUgLTE2NiAyODAgLTE4NlQyMTMgLTIwNlExOTEgLTIwNiAxNzAgLTIwMFQxMzIgLTE4M0wxNDYgLTE1NVExNjEgLTE2MyAxNzYgLTE2OFQyMTEgLTE3NFEyMzIgLTE3NCAyNDggLTE2NFQyNjUgLTEyOVEyNjUgLTEwNCAyNDkgLTk1VDIxMiAtODZRMTkyIC04NiAxNzQgLTkxTDE2MSAtNzZMMTk3IC0xMVExNTAgLTggMTEyIDRUMzkgMzhMNjIgODVROTQgNjMgMTM2IDUwVDIxNiAzNlEyMzggMzYgMjU4IDQxVDI5MyA1OFQzMTcgODhUMzI2IDEzMlEzMjYgMTU2IDMxNiAxNzNUMjg5IDIwMVQyNTAgMjIxVDIwNiAyMzdRMTc2IDI0NyAxNDggMjU4VDk5IDI4NlQ2NSAzMjdUNTIgMzg2UTUyIDQyMiA2NyA0NDZUMTA1IDQ4NlQxNTggNTA4VDIxOCA1MTVRMjU5IDUxNSAyOTYgNTA1VDM2OCA0NzdMMzUwIDQzMFEzMjUgNDQ2IDI5MSA0NTdUMjE5IDQ2OFExOTcgNDY4IDE3NyA0NjRUMTQyIDQ1MFQxMTggNDI0VDEwOSAzODVRMTA5IDM2NCAxMTkgMzQ5VDE0NyAzMjJUMTg3IDMwM1QyMzUgMjg2UTI2MiAyNzcgMjg4IDI2NlQzMzYgMjM4VDM3MCAxOTZUMzgzIDEzNlEzODMgMTAwIDM3MiA3M1QzNDAgMjlUMjkyIDJUMjM1IC0xMEwyMDYgLTYxTDIwNyAtNjJRMjE5IC01OSAyMzIgLTU5UTI2NCAtNTkgMjg0IC03NVQzMDUgLTEyOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGhvcml6LWFkdi14PSI1MDYiIGQ9Ik00NTQgMTgwUTQ1NCA4OSA0MDIgMzlUMjUyIC0xMVExOTEgLTExIDE0MCA1VDM3IDU3TDY3IDEwN1ExMDMgNzkgMTQ3IDYwVDI0NiA0MFEzMTUgNDAgMzUyIDc1VDM5MCAxODBRMzkwIDIxNSAzNzUgMjM4VDMzNiAyNzlUMjgwIDMwOVQyMTYgMzM2UTE4NiAzNDkgMTU3IDM2NFQxMDYgNDAwVDcwIDQ1MFQ1NiA1MTlRNTYgNTYxIDcyIDU5MVQxMTQgNjQwVDE3NSA2NjlUMjQ4IDY3OFEzMDAgNjc4IDM0NiA2NjNUNDM2IDYxOEw0MTEgNTY1UTM3NiA1OTMgMzM2IDYwOVQyNDcgNjI2UTIyMiA2MjYgMTk5IDYyMFQxNTkgNjAwVDEzMiA1NjdUMTIxIDUyMFExMjEgNDkxIDEzMiA0NzFUMTYyIDQzNlQyMDYgNDA5VDI1OSAzODZRMjkzIDM3MiAzMjggMzU3VDM5MSAzMTlUNDM2IDI2M1Q0NTQgMTgwWk0zODMgODAzTDI1MSA3MDVMMTIwIDgwM0wxNDcgODM3TDI1MSA3NTdMMzU2IDgzN0wzODMgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYxOyIgaG9yaXotYWR2LXg9IjQyOCIgZD0iTTM4MyAxMzZRMzgzIDk3IDM3MCA2OVQzMzMgMjRUMjgwIC0yVDIxNiAtMTFRMTY0IC0xMSAxMjIgMVQzOSAzOEw2MiA4NVE5NCA2MyAxMzYgNTBUMjE2IDM2UTIzOCAzNiAyNTggNDFUMjkzIDU4VDMxNyA4OFQzMjYgMTMyUTMyNiAxNTYgMzE2IDE3MlQyODkgMjAwVDI1MCAyMjBUMjA2IDIzNlExNzYgMjQ2IDE0OCAyNTdUOTkgMjg2VDY1IDMyN1Q1MiAzODZRNTIgNDIyIDY3IDQ0NlQxMDUgNDg2VDE1OCA1MDhUMjE4IDUxNVEyNTkgNTE1IDI5NiA1MDVUMzY4IDQ3N0wzNTAgNDI5UTMyNSA0NDQgMjkwIDQ1NVQyMTkgNDY3UTE5NyA0NjcgMTc3IDQ2M1QxNDIgNDQ4VDExOCA0MjJUMTA5IDM4M1ExMDkgMzYyIDExOSAzNDdUMTQ3IDMyMVQxODcgMzAxVDIzNSAyODVRMjYyIDI3NiAyODggMjY1VDMzNiAyMzdUMzcwIDE5NlQzODMgMTM2Wk0zNTQgNjYzTDIyMiA1NjVMOTEgNjYzTDExOCA2OTdMMjIyIDYxN0wzMjcgNjk3TDM1NCA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjI7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNMjcyIDYxMlYwSDIwOVY2MTJIMjFWNjY3SDQ2MVY2MTJIMjcyWk0yMjAgLTIwNkgxNzlMMjAzIC02MUgyNzJMMjIwIC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjM7IiBob3Jpei1hZHYteD0iMzMyIiBkPSJNMjkwIC0xUTI4MCAtMyAyNjUgLTRUMjM2IC01UTE5NCAtNSAxNjkgM1QxMzEgMjhUMTEzIDY2VDEwOSAxMTZWNDUySDI1VjUwMkgxMDlWNjQySDE2OFY1MDJIMjkwVjQ1MkgxNjhWMTI2UTE2OCAxMDYgMTcwIDkxVDE4MCA2NlQyMDYgNTJUMjUzIDQ3SDI5MFYtMUgyOTBaTTE5MSAtMjA2SDE1MEwxNzQgLTYxSDI0M0wxOTEgLTIwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik0yNzIgNjEyVjBIMjA5VjYxMkgyMVY2NjdINDYxVjYxMkgyNzJaTTM3NSA4MDNMMjQzIDcwNUwxMTIgODAzTDEzOSA4MzdMMjQzIDc1N0wzNDggODM3TDM3NSA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjU7IiBob3Jpei1hZHYteD0iMzMyIiBkPSJNMjkwIC0xUTI4MCAtMyAyNjUgLTRUMjM2IC01UTE5NCAtNSAxNjkgM1QxMzEgMjhUMTEzIDY2VDEwOSAxMTZWNDUySDI1VjUwMkgxMDlWNjQySDE2OFY1MDJIMjkwVjQ1MkgxNjhWMTI2UTE2OCAxMDYgMTcwIDkxVDE4MCA2NlQyMDYgNTJUMjUzIDQ3SDI5MFYtMVpNMzA0IDU0NEgyNjJMMjk0IDcwMEgzNjNMMzA0IDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NjsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik0yNzIgMzQyVjBIMjA5VjM0Mkg1MVYzOTJIMjA5VjYxMkgyMVY2NjdINDYxVjYxMkgyNzJWMzkySDQzMFYzNDJIMjcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY3OyIgaG9yaXotYWR2LXg9IjMzMiIgZD0iTTE2OCAyOTdWMTI2UTE2OCAxMDYgMTcwIDkxVDE4MCA2NlQyMDYgNTJUMjUzIDQ3SDI5MFYtMVEyNzkgLTMgMjY1IC00VDIzNiAtNVExOTQgLTUgMTY5IDNUMTMxIDI4VDExMyA2NlQxMDkgMTE2VjI5N0gyNVYzNDVIMTA5VjQ1MkgyNVY1MDJIMTA5VjY0MkgxNjhWNTAySDI5MFY0NTJIMTY4VjM0NUgyODlWMjk3SDE2OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2ODsiIGhvcml6LWFkdi14PSI2NTIiIGQ9Ik01NjAgMjU1UTU2MCAxMTQgNTAzIDUyVDMyNSAtMTFRMjA0IC0xMSAxNDggNTFUOTIgMjU1VjY2N0gxNTVWMjQyUTE1NSAxOTcgMTYzIDE2MVQxOTIgOThUMjQ1IDU3VDMyNiA0MlEzNzQgNDIgNDA2IDU2VDQ1OSA5N1Q0ODggMTYwVDQ5NyAyNDJWNjY3SDU2MFYyNTVINTYwWk00NzggNzc0UTQ2OSA3NDIgNDQ0IDcyN1QzOTIgNzEyUTM3NiA3MTIgMzU5IDcxOFQzMjUgNzMxVDI5MyA3NDRUMjY0IDc1MFEyNDggNzUwIDIzMiA3NDNUMjA3IDcxMUwxNzIgNzM0UTE4OCA3NzAgMjExIDc4M1QyNjAgNzk2UTI3NiA3OTYgMjkzIDc5MFQzMjcgNzc3VDM1OSA3NjRUMzg5IDc1OFE0MDYgNzU4IDQyMCA3NjZUNDQyIDc5Nkw0NzggNzc0SDQ3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2OTsiIGhvcml6LWFkdi14PSI1NDAiIGQ9Ik00MDkgMEw0MDEgNjZIMzk5UTM4MiAzNSAzNDYgMTJUMjQ1IC0xMVEyMDYgLTExIDE3NiAtMlQxMjUgMzBUOTMgOTJUODIgMTk0VjUwMkgxNDFWMjM4UTE0MSAxODkgMTQ0IDE1MlQxNjAgOTBUMTk1IDUzVDI1OSA0MFEzMzUgNDAgMzY3IDgxVDM5OSAxODhWNTAySDQ1OFYwSDQwOVpNNDE4IDYzNFE0MDkgNjAyIDM4NCA1ODdUMzMyIDU3MlEzMTYgNTcyIDI5OSA1NzhUMjY1IDU5MVQyMzMgNjA0VDIwNCA2MTBRMTg4IDYxMCAxNzIgNjAzVDE0NyA1NzFMMTEyIDU5NFExMjggNjMwIDE1MSA2NDNUMjAwIDY1NlEyMTYgNjU2IDIzMyA2NTBUMjY3IDYzN1QyOTkgNjI0VDMyOSA2MThRMzQ2IDYxOCAzNjAgNjI2VDM4MiA2NTZMNDE4IDYzNEg0MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTYwIDI1NVE1NjAgMTE0IDUwMyA1MlQzMjUgLTExUTIwNCAtMTEgMTQ4IDUxVDkyIDI1NVY2NjdIMTU1VjI0MlExNTUgMTk3IDE2MyAxNjFUMTkyIDk4VDI0NSA1N1QzMjYgNDJRMzc0IDQyIDQwNiA1NlQ0NTkgOTdUNDg4IDE2MFQ0OTcgMjQyVjY2N0g1NjBWMjU1SDU2MFpNMTg2IDczMFY3NzJINDcxVjczMEgxODZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkI7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDAxIDY2SDM5OVEzODIgMzUgMzQ2IDEyVDI0NSAtMTFRMjA2IC0xMSAxNzYgLTJUMTI1IDMwVDkzIDkyVDgyIDE5NFY1MDJIMTQxVjIzOFExNDEgMTg5IDE0NCAxNTJUMTYwIDkwVDE5NSA1M1QyNTkgNDBRMzM1IDQwIDM2NyA4MVQzOTkgMTg4VjUwMkg0NThWMEg0MDlaTTEyNiA1OTBWNjMySDQxMVY1OTBIMTI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU2MCAyNTVRNTYwIDExNCA1MDMgNTJUMzI1IC0xMVEyMDQgLTExIDE0OCA1MVQ5MiAyNTVWNjY3SDE1NVYyNDJRMTU1IDE5NyAxNjMgMTYxVDE5MiA5OFQyNDUgNTdUMzI2IDQyUTM3NCA0MiA0MDYgNTZUNDU5IDk3VDQ4OCAxNjBUNDk3IDI0MlY2NjdINTYwVjI1NUg1NjBaTTQ1NyA4MThRNDU0IDc4NyA0NDIgNzY2VDQxMSA3MzFUMzcwIDcxMVQzMjMgNzA1UTI5OSA3MDUgMjc3IDcxMVQyMzYgNzMwVDIwNiA3NjVUMTkxIDgxOEgyMzNRMjM3IDc4NCAyNTkgNzYzVDMyMyA3NDFRMzY1IDc0MSAzODggNzYyVDQxNCA4MThINDU3SDQ1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RDsiIGhvcml6LWFkdi14PSI1NDAiIGQ9Ik00MDkgMEw0MDEgNjZIMzk5UTM4MiAzNSAzNDYgMTJUMjQ1IC0xMVEyMDYgLTExIDE3NiAtMlQxMjUgMzBUOTMgOTJUODIgMTk0VjUwMkgxNDFWMjM4UTE0MSAxODkgMTQ0IDE1MlQxNjAgOTBUMTk1IDUzVDI1OSA0MFEzMzUgNDAgMzY3IDgxVDM5OSAxODhWNTAySDQ1OFYwSDQwOVpNNDA2IDY3OFE0MDMgNjQ3IDM5MSA2MjZUMzYwIDU5MVQzMTkgNTcxVDI3MiA1NjVRMjQ4IDU2NSAyMjYgNTcxVDE4NSA1OTBUMTU1IDYyNVQxNDAgNjc4SDE4MlExODYgNjQ0IDIwOCA2MjNUMjcyIDYwMVEzMTQgNjAxIDMzNyA2MjJUMzYzIDY3OEg0MDZINDA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZFOyIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU2MCAyNTVRNTYwIDExNCA1MDMgNTJUMzI1IC0xMVEyMDQgLTExIDE0OCA1MVQ5MiAyNTVWNjY3SDE1NVYyNDJRMTU1IDE5NyAxNjMgMTYxVDE5MiA5OFQyNDUgNTdUMzI2IDQyUTM3NCA0MiA0MDYgNTZUNDU5IDk3VDQ4OCAxNjBUNDk3IDI0MlY2NjdINTYwVjI1NUg1NjBaTTQxNCA3NzNRNDE0IDczNyAzODkgNzEyVDMyNyA2ODdRMjkwIDY4NyAyNjUgNzEyVDIzOSA3NzNRMjM5IDgwOSAyNjQgODM0VDMyNyA4NTlRMzYzIDg1OSAzODggODM0VDQxNCA3NzNaTTM4MSA3NzNRMzgxIDc5NiAzNjYgODEyVDMyNyA4MjhRMzA0IDgyOCAyODggODEyVDI3MiA3NzNRMjcyIDc1MCAyODggNzM0VDMyNyA3MThRMzUwIDcxOCAzNjUgNzM0VDM4MSA3NzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkY7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDAxIDY2SDM5OVEzODIgMzUgMzQ2IDEyVDI0NSAtMTFRMjA2IC0xMSAxNzYgLTJUMTI1IDMwVDkzIDkyVDgyIDE5NFY1MDJIMTQxVjIzOFExNDEgMTg5IDE0NCAxNTJUMTYwIDkwVDE5NSA1M1QyNTkgNDBRMzM1IDQwIDM2NyA4MVQzOTkgMTg4VjUwMkg0NThWMEg0MDlaTTM1OCA2NTFRMzU4IDYxNSAzMzMgNTkwVDI3MSA1NjVRMjM0IDU2NSAyMDkgNTkwVDE4MyA2NTFRMTgzIDY4NyAyMDggNzEyVDI3MSA3MzdRMzA3IDczNyAzMzIgNzEyVDM1OCA2NTFaTTMyNSA2NTFRMzI1IDY3NCAzMTAgNjkwVDI3MSA3MDZRMjQ4IDcwNiAyMzIgNjkwVDIxNiA2NTFRMjE2IDYyOCAyMzIgNjEyVDI3MSA1OTZRMjk0IDU5NiAzMDkgNjEyVDMyNSA2NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTYwIDI1NVE1NjAgMTE0IDUwMyA1MlQzMjUgLTExUTIwNCAtMTEgMTQ4IDUxVDkyIDI1NVY2NjdIMTU1VjI0MlExNTUgMTk3IDE2MyAxNjFUMTkyIDk4VDI0NSA1N1QzMjYgNDJRMzc0IDQyIDQwNiA1NlQ0NTkgOTdUNDg4IDE2MFQ0OTcgMjQyVjY2N0g1NjBWMjU1SDU2MFpNNDMzIDcwOUw0MDEgNzI4TDUzOSA4NDNMNTk4IDgxNEw0MzMgNzA5Wk0yMjMgNzA5TDE5MSA3MjhMMzI5IDg0M0wzODggODE0TDIyMyA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzE7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDAxIDY2SDM5OVEzODIgMzUgMzQ2IDEyVDI0NSAtMTFRMjA2IC0xMSAxNzYgLTJUMTI1IDMwVDkzIDkyVDgyIDE5NFY1MDJIMTQxVjIzOFExNDEgMTg5IDE0NCAxNTJUMTYwIDkwVDE5NSA1M1QyNTkgNDBRMzM1IDQwIDM2NyA4MVQzOTkgMTg4VjUwMkg0NThWMEg0MDlaTTM4NyA1NjlMMzU1IDU4OEw0OTMgNzAzTDU1MiA2NzRMMzg3IDU2OVpNMTc3IDU2OUwxNDUgNTg4TDI4MyA3MDNMMzQyIDY3NEwxNzcgNTY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcyOyIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU2MCAyNTVRNTYwIDE1MSA1MzAgOTFUNDM1IDZRNDAzIC0xMyAzODQgLTMwVDM1MyAtNjNUMzM4IC05NFQzMzQgLTEyM1EzMzQgLTE1MiAzNTMgLTE3MVQ0MDIgLTE5MVE0MjIgLTE5MSA0MzYgLTE4NlQ0NjEgLTE3NEw0NzQgLTIxMFE0NjQgLTIxNiA0NDEgLTIyM1QzOTUgLTIzMVEzMzkgLTIzMSAzMTMgLTIwMVQyODcgLTEyOFEyODcgLTkzIDMwNyAtNjNUMzY0IC04UTM0NiAtMTEgMzI1IC0xMVEyMDQgLTExIDE0OCA1MVQ5MiAyNTVWNjY3SDE1NVYyNDJRMTU1IDE5NyAxNjMgMTYxVDE5MiA5OFQyNDUgNTdUMzI2IDQyUTM3NCA0MiA0MDYgNTZUNDU5IDk3VDQ4NyAxNjBUNDk2IDI0MlY2NjdINTYwVjI1NUg1NjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzM7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDQxIDBRNDA5IC0xOSAzOTAgLTM2VDM2MCAtNjlUMzQ1IC0xMDBUMzQxIC0xMjlRMzQxIC0xNTggMzYwIC0xNzdUNDA4IC0xOTZRNDI4IC0xOTYgNDQzIC0xOTFUNDY4IC0xODBMNDgxIC0yMTZRNDcxIC0yMjIgNDQ4IC0yMjlUNDAyIC0yMzdRMzQ2IC0yMzcgMzIwIC0yMDdUMjk0IC0xMzRRMjk0IC05MCAzMjQgLTU0VDQwOSA1TDQwMSA2NkgzOTlRMzgyIDM1IDM0NiAxMlQyNDUgLTExUTIwNiAtMTEgMTc2IC0yVDEyNSAzMFQ5MyA5MlQ4MiAxOTRWNTAySDE0MlYyMzhRMTQyIDE4OSAxNDUgMTUyVDE2MSA5MFQxOTYgNTNUMjU5IDQwUTI5OCA0MCAzMjQgNTBUMzY3IDgwVDM5MSAxMjdUMzk4IDE4OFY1MDJINDU4VjBINDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc0OyIgaG9yaXotYWR2LXg9Ijg2OSIgZD0iTTY3MyAwSDU5NEw0MzUgNTcxSDQzMUwyNzYgMEgxOTJMMzQgNjY3SDEwM0wyMzYgNjhIMjQwTDQwMyA2NjdINDY2TDYzMiA2OEg2MzZMNzY4IDY2N0g4MzVMNjczIDBaTTU1MCA3MDRMNDM1IDc4NkwzMjEgNzA0TDI5NCA3MzlMNDM1IDgzOEw1NzggNzM5TDU1MCA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzU7IiBob3Jpei1hZHYteD0iNzIwIiBkPSJNNTUwIDBINDc3TDM2MiA0MTFIMzU4TDI0MCAwSDE2OUwyOSA1MDJIOTBMMjA2IDUzSDIxMEwzMzQgNTAySDM4NUw1MTAgNTRINTE0TDYzMSA1MDJINjkxTDU1MCAwWk00NzggNTY0TDM2MyA2NDZMMjQ5IDU2NEwyMjIgNTk5TDM2MyA2OThMNTA2IDU5OUw0NzggNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc2OyIgaG9yaXotYWR2LXg9IjUzMyIgZD0iTTI5OSAyNjdWMEgyMzVWMjY0TDE4IDY2N0g4OEwyNjcgMzIzTDQ0NiA2NjdINTE1TDI5OSAyNjdaTTM4MyA3MDRMMjY4IDc4NkwxNTQgNzA0TDEyNyA3MzlMMjY4IDgzOEw0MTEgNzM5TDM4MyA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzc7IiBob3Jpei1hZHYteD0iNDY2IiBkPSJNMjMwIC04OFEyMTUgLTEyOCAyMDIgLTE1NFQxNzIgLTE5N1QxMzYgLTIxOVQ4OSAtMjI2UTgxIC0yMjYgNjkgLTIyNlQ0NiAtMjI0Vi0xNzJRNTUgLTE3NCA2MyAtMTc0VDgzIC0xNzRRMTAyIC0xNzQgMTE1IC0xNjlUMTM5IC0xNTFUMTYxIC0xMTNUMTg1IC00OUwyMDkgMjFMMjMgNTAySDg3TDIzOCA4OUgyNDJMMzgwIDUwMkg0NDNMMjMwIC04OFpNMzU0IDU2NEwyMzkgNjQ2TDEyNSA1NjRMOTggNTk5TDIzOSA2OThMMzgyIDU5OUwzNTQgNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc4OyIgaG9yaXotYWR2LXg9IjUzMyIgZD0iTTI5OSAyNjdWMEgyMzVWMjY0TDE4IDY2N0g4OEwyNjcgMzIzTDQ0NiA2NjdINTE1TDI5OSAyNjdaTTM5NSA3NTRRMzk1IDczNyAzODMgNzI1VDM1NCA3MTNRMzM3IDcxMyAzMjUgNzI1VDMxMyA3NTRRMzEzIDc3MSAzMjUgNzgzVDM1NCA3OTVRMzcxIDc5NSAzODMgNzgzVDM5NSA3NTRaTTIyNiA3NTRRMjI2IDczNyAyMTQgNzI1VDE4NSA3MTNRMTY4IDcxMyAxNTYgNzI1VDE0NCA3NTRRMTQ0IDc3MSAxNTYgNzgzVDE4NSA3OTVRMjAyIDc5NSAyMTQgNzgzVDIyNiA3NTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzk7IiBob3Jpei1hZHYteD0iNTMyIiBkPSJNNDcgMFY1NUw0MDcgNjEySDYyVjY2N0g0NzdWNjEzTDExNSA1NEg0ODVWMEg0N1pNMjQ1IDcwNUwyMTQgNzI5TDM1MCA4NDRMNDA3IDgxMUwyNDUgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdBOyIgaG9yaXotYWR2LXg9IjQ0MSIgZD0iTTQyIDBWNDlMMzI5IDQ1Mkg1MFY1MDJIMzk0VjQ1MkwxMDggNTBIMzk5VjBINDJaTTE5OSA1NjVMMTY4IDU4OUwzMDQgNzA0TDM2MSA2NzFMMTk5IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QjsiIGhvcml6LWFkdi14PSI1MzIiIGQ9Ik00NyAwVjU1TDQwNyA2MTJINjJWNjY3SDQ3N1Y2MTNMMTE1IDU0SDQ4NVYwSDQ3Wk0zMTAgNzYyUTMxMCA3NDUgMzAwIDczNVQyNzAgNzI0UTI1MyA3MjQgMjQzIDczNFQyMzIgNzYyUTIzMiA3ODAgMjQyIDc5MFQyNzAgODAxUTI4OSA4MDEgMjk5IDc5MVQzMTAgNzYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdDOyIgaG9yaXotYWR2LXg9IjQ0MSIgZD0iTTQyIDBWNDlMMzI5IDQ1Mkg1MFY1MDJIMzk0VjQ1MkwxMDggNTBIMzk5VjBINDJaTTI2NyA2MjRRMjY3IDYwNyAyNTcgNTk3VDIyNyA1ODZRMjEwIDU4NiAyMDAgNTk2VDE4OSA2MjRRMTg5IDY0MiAxOTkgNjUyVDIyNyA2NjNRMjQ2IDY2MyAyNTYgNjUzVDI2NyA2MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0Q7IiBob3Jpei1hZHYteD0iNTMyIiBkPSJNNDcgMFY1NUw0MDcgNjEySDYyVjY2N0g0NzdWNjEzTDExNSA1NEg0ODVWMEg0N1pNNDAxIDgwM0wyNjkgNzA1TDEzOCA4MDNMMTY1IDgzN0wyNjkgNzU3TDM3NCA4MzdMNDAxIDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGhvcml6LWFkdi14PSI0NDEiIGQ9Ik00MiAwVjQ5TDMyOSA0NTJINTBWNTAySDM5NFY0NTJMMTA4IDUwSDM5OVYwSDQyWk0zNjIgNjYzTDIzMCA1NjVMOTkgNjYzTDEyNiA2OTdMMjMwIDYxN0wzMzUgNjk3TDM2MiA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxOTI7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNDkzIDYyNFE0ODEgNjI1IDQ3NSA2MjVUNDU3IDYyNVE0NDIgNjI1IDQyOCA2MjNUNDAyIDYxM1QzODEgNTkxVDM2OCA1NTVMMzQwIDQyMEg0NDZMNDM4IDM2N0gzMzFMMjU5IC0xMVEyNTEgLTUyIDIzOCAtODVUMjA2IC0xNDJUMTU4IC0xNzlUOTAgLTE5MlE4MiAtMTkyIDcyIC0xOTJUNTEgLTE4OUw2MSAtMTM5UTcwIC0xNDAgNzkgLTE0MFQ5OSAtMTQwUTExOCAtMTQwIDEzNCAtMTI5VDE2MyAtMTAwVDE4NCAtNTZUMTk4IC00TDI2OCAzNjdIMTkzTDIwMyA0MjBIMjc3TDMwMSA1NDZRMzA4IDU4MiAzMTggNjA2VDM0NyA2NDZUMzk0IDY2OFQ0NjcgNjc1UTQ3NiA2NzUgNDgzIDY3NVQ1MDMgNjc0TDQ5MyA2MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkM7IiBob3Jpei1hZHYteD0iODY4IiBkPSJNNDQ5IDBWMTcxSDE5MEw5NCAwSDI1TDQxMSA2NjdIODIwVjYxM0g1MTJWMzg1SDc5MFYzMzBINTEyVjU0SDgzMFYwSDQ0OVpNNDUwIDYxMEg0NDJMMjE3IDIyNkg0NTBWNjEwWk01NzYgNzA1TDU0NSA3MjlMNjgxIDg0NEw3MzggODExTDU3NiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkQ7IiBob3Jpei1hZHYteD0iODQwIiBkPSJNNzg2IDI2MVE3ODYgMjU2IDc4NiAyNDhUNzg1IDIzMkg0MzJRNDMzIDE0MCA0NzQgODlUNTk0IDM4UTYzMCAzOCA2NjkgNTJUNzQxIDk1TDc2NSA1MVE3MjcgMjAgNjg0IDVUNTk1IC0xMVE1MjkgLTExIDQ4NCAxM1Q0MTAgODFRMzY4IDQxIDMxOCAxNVQyMDMgLTExUTE3MCAtMTEgMTQyIC0xVDk0IDI4VDYxIDc1VDQ5IDEzOVE0OSAxOTMgNzMgMjI4VDEzOSAyODRUMjQwIDMxM1QzNjggMzIyVjM1MVEzNjggNDEwIDM0OCA0MzhUMjY5IDQ2NlEyMjEgNDY2IDE3MyA0NDlUODcgNDA1TDY1IDQ1MVExMTYgNDgwIDE2MyA0OTdUMjY5IDUxNVEyOTUgNTE1IDMxOSA1MTFUMzYyIDQ5NlQzOTUgNDY1VDQxNSA0MTZRNDQyIDQ2NCA0ODUgNDg5VDU4NSA1MTVRNjc3IDUxNSA3MzEgNDUyVDc4NiAyNjFaTTcyOSAyNzdRNzI4IDMxNCA3MjEgMzQ4VDY5NyA0MDlUNjUzIDQ1MVQ1ODMgNDY3UTU1MSA0NjcgNTI0IDQ1NVQ0NzUgNDE4VDQ0MiAzNTlUNDMwIDI3N0g3MjlaTTM5MCAxMjBRMzc2IDE1MCAzNzMgMTg1VDM2OCAyNTVWMjgwUTI0MSAyODAgMTc2IDI0N1QxMTAgMTQyUTExMCAxMTkgMTE4IDk5VDE0MSA2NFQxNzUgNDFUMjE1IDMyUTI1OSAzMiAzMDMgNTdUMzkwIDEyMFpNNDM1IDU2NUw0MDQgNTg5TDU0MCA3MDRMNTk3IDY3MUw0MzUgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZFOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTY2MyAzMzRRNjYzIDI2NyA2NDggMjA1VDU5NyA5NFQ1MDYgMThUMzY2IC0xMVEzMDYgLTExIDI2MSA0VDE4MSA0NUwxMzIgLTIzTDkxIDExTDE0MyA4M1ExMDMgMTMyIDg2IDE5N1Q2OSAzMzRRNjkgMzk4IDg0IDQ1OVQxMzMgNTY5VDIyNSA2NDhUMzY2IDY3OFE0MjEgNjc4IDQ2NCA2NjVUNTQwIDYyOEw1ODggNjk0TDYyNiA2NjFMNTc4IDU5NVE2MjQgNTQ1IDY0MyA0NzdUNjYzIDMzNFpNNTk3IDMzM1E1OTcgMzkwIDU4NSA0NDZUNTQyIDU0NUwyMTYgOTNRMjQyIDY5IDI3OCA1NVQzNjYgNDFRNDM2IDQxIDQ4MCA2N1Q1NTEgMTM2VDU4NyAyMzBUNTk3IDMzM1pNMTM1IDMzM1ExMzUgMjgxIDE0NSAyMjlUMTgxIDEzNUw1MDcgNTgzUTQ4MSA2MDMgNDQ3IDYxNVQzNjYgNjI3UTI5NyA2MjcgMjUyIDYwMVQxODEgNTMyVDE0NSA0MzhUMTM1IDMzM1pNMzQyIDcwNkwzMTEgNzMwTDQ0NyA4NDVMNTA0IDgxMkwzNDIgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZGOyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTQ0NyA0NDJRNDc5IDQwMCA0OTAgMzUxVDUwMiAyNTFRNTAyIDE5NyA0OTAgMTQ5VDQ1MiA2NlQzODMgMTBUMjc5IC0xMVEyMzQgLTExIDE5NiAyVDEyOCA0OEw3OCAtMTZMNDYgMTJMMTAwIDgwUTc2IDExOCA2NyAxNjJUNTggMjUxUTU4IDMwNSA3MCAzNTNUMTEwIDQzN1QxNzkgNDk0VDI3OSA1MTVRMzYyIDUxNSA0MTMgNDcyTDQ2NSA1MzdMNTAxIDUwOUw0NDcgNDQyWk0zODAgNDI4UTM2MyA0NDQgMzM5IDQ1M1QyODAgNDYzUTIzMiA0NjMgMjAxIDQ0NlQxNTIgMzk5VDEyNyAzMzFUMTIwIDI1MVExMjAgMjE5IDEyNCAxODZUMTQzIDEyNkwzODAgNDI4Wk00NDAgMjUxUTQ0MCAyODYgNDMzIDMyN1Q0MDYgMzk4TDE2MyA5MlExODQgNjMgMjE0IDUxVDI4MCAzOVEzMjcgMzkgMzU4IDU2VDQwNyAxMDNUNDMyIDE3MFQ0NDAgMjUxWk0yNzAgNTY1TDIzOSA1ODlMMzc1IDcwNEw0MzIgNjcxTDI3MCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTg7IiBob3Jpei1hZHYteD0iNTA2IiBkPSJNNDU0IDE4MFE0NTQgODkgNDAyIDM5VDI1MiAtMTFRMTkxIC0xMSAxNDAgNVQzNyA1N0w2NyAxMDdRMTAzIDc5IDE0NyA2MFQyNDYgNDBRMzE1IDQwIDM1MiA3NVQzOTAgMTgwUTM5MCAyMTUgMzc1IDIzOFQzMzYgMjc5VDI4MCAzMDlUMjE2IDMzNlExODYgMzQ5IDE1NyAzNjRUMTA2IDQwMFQ3MCA0NTBUNTYgNTE5UTU2IDU2MSA3MiA1OTFUMTE0IDY0MFQxNzUgNjY5VDI0OCA2NzhRMzAwIDY3OCAzNDYgNjYzVDQzNiA2MThMNDExIDU2NVEzNzYgNTkzIDMzNiA2MDlUMjQ3IDYyNlEyMjIgNjI2IDE5OSA2MjBUMTU5IDYwMFQxMzIgNTY3VDEyMSA1MjBRMTIxIDQ5MSAxMzIgNDcxVDE2MiA0MzZUMjA2IDQwOVQyNTkgMzg2UTI5MyAzNzIgMzI4IDM1N1QzOTEgMzE5VDQzNiAyNjNUNDU0IDE4MFpNMjM1IC0yMDZIMTk0TDIxOCAtNjFIMjg3TDIzNSAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE5OyIgaG9yaXotYWR2LXg9IjQyOCIgZD0iTTM4MyAxMzZRMzgzIDk3IDM3MCA2OVQzMzMgMjRUMjgwIC0yVDIxNiAtMTFRMTY0IC0xMSAxMjIgMVQzOSAzOEw2MiA4NVE5NCA2MyAxMzYgNTBUMjE2IDM2UTIzOCAzNiAyNTggNDFUMjkzIDU4VDMxNyA4OFQzMjYgMTMyUTMyNiAxNTYgMzE2IDE3MlQyODkgMjAwVDI1MCAyMjBUMjA2IDIzNlExNzYgMjQ2IDE0OCAyNTdUOTkgMjg2VDY1IDMyN1Q1MiAzODZRNTIgNDIyIDY3IDQ0NlQxMDUgNDg2VDE1OCA1MDhUMjE4IDUxNVEyNTkgNTE1IDI5NiA1MDVUMzY4IDQ3N0wzNTAgNDI5UTMyNSA0NDQgMjkwIDQ1NVQyMTkgNDY3UTE5NyA0NjcgMTc3IDQ2M1QxNDIgNDQ4VDExOCA0MjJUMTA5IDM4M1ExMDkgMzYyIDExOSAzNDdUMTQ3IDMyMVQxODcgMzAxVDIzNSAyODVRMjYyIDI3NiAyODggMjY1VDMzNiAyMzdUMzcwIDE5NlQzODMgMTM2Wk0yMDEgLTIwNkgxNjBMMTg0IC02MUgyNTNMMjAxIC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMzc7IiBob3Jpei1hZHYteD0iMjI5IiBkPSJNMTQ3IC01MVExNDcgLTkxIDE0MCAtMTIzVDExNCAtMTc4VDY3IC0yMTNULTQgLTIyNlEtMTkgLTIyNiAtMzQgLTIyNVQtNjMgLTIyMlYtMTcxUS0zNiAtMTc0IC0xNSAtMTc0UTE4IC0xNzQgMzggLTE2NlQ2OSAtMTQxVDgzIC0xMDFUODcgLTQ3VjUwMkgxNDdWLTUxSDE0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNjsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0yOTUgNTY0TDE4MCA2NDZMNjYgNTY0TDM5IDU5OUwxODAgNjk4TDMyMyA1OTlMMjk1IDU2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNzsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0zMTIgNjYzTDE4MCA1NjVMNDkgNjYzTDc2IDY5N0wxODAgNjE3TDI4NSA2OTdMMzEyIDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEODsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0zMTQgNjc4UTMxMSA2NDcgMjk5IDYyNlQyNjggNTkxVDIyNyA1NzFUMTgwIDU2NVExNTYgNTY1IDEzNCA1NzFUOTMgNTkwVDYzIDYyNVQ0OCA2NzhIOTBROTQgNjQ0IDExNiA2MjNUMTgwIDYwMVEyMjIgNjAxIDI0NSA2MjJUMjcxIDY3OEgzMTRIMzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ5OyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTIyMCA2MjRRMjIwIDYwNyAyMTAgNTk3VDE4MCA1ODZRMTYzIDU4NiAxNTMgNTk2VDE0MiA2MjRRMTQyIDY0MiAxNTIgNjUyVDE4MCA2NjNRMTk5IDY2MyAyMDkgNjUzVDIyMCA2MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREE7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMjY4IDY1MVEyNjggNjE1IDI0MyA1OTBUMTgxIDU2NVExNDQgNTY1IDExOSA1OTBUOTMgNjUxUTkzIDY4NyAxMTggNzEyVDE4MSA3MzdRMjE3IDczNyAyNDIgNzEyVDI2OCA2NTFaTTIzNSA2NTFRMjM1IDY3NCAyMjAgNjkwVDE4MSA3MDZRMTU4IDcwNiAxNDIgNjkwVDEyNiA2NTFRMTI2IDYyOCAxNDIgNjEyVDE4MSA1OTZRMjA0IDU5NiAyMTkgNjEyVDIzNSA2NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREI7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMTkxIC0yOFExNjUgLTQ1IDE0OSAtNzBUMTMzIC0xMjVRMTMzIC0xNTcgMTUyIC0xNzZUMjAxIC0xOTZRMjIxIC0xOTYgMjM1IC0xOTFUMjU5IC0xNzlMMjc0IC0yMTZRMjYzIC0yMjIgMjQwIC0yMjlUMTk0IC0yMzdRMTM3IC0yMzcgMTEyIC0yMDdUODYgLTEzMFE4NiAtODMgMTIzIC00NlQyMjEgMTVMMjM4IDJMMTkxIC0yOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQzsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0zMzUgNjM0UTMyNiA2MDIgMzAxIDU4N1QyNDkgNTcyUTIzMyA1NzIgMjE2IDU3OFQxODIgNTkxVDE1MCA2MDRUMTIxIDYxMFExMDUgNjEwIDg5IDYwM1Q2NCA1NzFMMjkgNTk0UTQ1IDYzMCA2OCA2NDNUMTE3IDY1NlExMzMgNjU2IDE1MCA2NTBUMTg0IDYzN1QyMTYgNjI0VDI0NiA2MThRMjYzIDYxOCAyNzcgNjI2VDI5OSA2NTZMMzM1IDYzNEgzMzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREQ7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMjI0IDU2OUwxOTIgNTg4TDMzMCA3MDNMMzg5IDY3NEwyMjQgNTY5Wk0xNCA1NjlMLTE4IDU4OEwxMjAgNzAzTDE3OSA2NzRMMTQgNTY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4MDsiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik02NzMgMEg1OTRMNDM1IDU3MUg0MzFMMjc2IDBIMTkyTDM0IDY2N0gxMDNMMjM2IDY4SDI0MEw0MDMgNjY3SDQ2Nkw2MzIgNjhINjM2TDc2OCA2NjdIODM1TDY3MyAwWk00NjMgNzA1TDMwMSA4MDlMMzYxIDg0MUw0OTQgNzI3TDQ2MyA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgxOyIgaG9yaXotYWR2LXg9IjcyMCIgZD0iTTU1MCAwSDQ3N0wzNjIgNDExSDM1OEwyNDAgMEgxNjlMMjkgNTAySDkwTDIwNiA1M0gyMTBMMzM0IDUwMkgzODVMNTEwIDU0SDUxNEw2MzEgNTAySDY5MUw1NTAgMFpNMzg0IDU2NUwyMjIgNjY5TDI4MiA3MDFMNDE1IDU4N0wzODQgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4MjsiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik02NzMgMEg1OTRMNDM1IDU3MUg0MzFMMjc2IDBIMTkyTDM0IDY2N0gxMDNMMjM2IDY4SDI0MEw0MDMgNjY3SDQ2Nkw2MzIgNjhINjM2TDc2OCA2NjdIODM1TDY3MyAwWk00MDYgNzA1TDM3NSA3MjlMNTExIDg0NEw1NjggODExTDQwNiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgzOyIgaG9yaXotYWR2LXg9IjcyMCIgZD0iTTU1MCAwSDQ3N0wzNjIgNDExSDM1OEwyNDAgMEgxNjlMMjkgNTAySDkwTDIwNiA1M0gyMTBMMzM0IDUwMkgzODVMNTEwIDU0SDUxNEw2MzEgNTAySDY5MUw1NTAgMFpNMzM3IDU2NUwzMDYgNTg5TDQ0MiA3MDRMNDk5IDY3MUwzMzcgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NDsiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik02NzMgMEg1OTRMNDM1IDU3MUg0MzFMMjc2IDBIMTkyTDM0IDY2N0gxMDNMMjM2IDY4SDI0MEw0MDMgNjY3SDQ2Nkw2MzIgNjhINjM2TDc2OCA2NjdIODM1TDY3MyAwWk01NjMgNzU0UTU2MyA3MzcgNTUxIDcyNVQ1MjIgNzEzUTUwNSA3MTMgNDkzIDcyNVQ0ODEgNzU0UTQ4MSA3NzEgNDkzIDc4M1Q1MjIgNzk1UTUzOSA3OTUgNTUxIDc4M1Q1NjMgNzU0Wk0zOTQgNzU0UTM5NCA3MzcgMzgyIDcyNVQzNTMgNzEzUTMzNiA3MTMgMzI0IDcyNVQzMTIgNzU0UTMxMiA3NzEgMzI0IDc4M1QzNTMgNzk1UTM3MCA3OTUgMzgyIDc4M1QzOTQgNzU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NTsiIGhvcml6LWFkdi14PSI3MjAiIGQ9Ik01NTAgMEg0NzdMMzYyIDQxMUgzNThMMjQwIDBIMTY5TDI5IDUwMkg5MEwyMDYgNTNIMjEwTDMzNCA1MDJIMzg1TDUxMCA1NEg1MTRMNjMxIDUwMkg2OTFMNTUwIDBaTTQ4NiA2MTRRNDg2IDU5NyA0NzQgNTg1VDQ0NSA1NzNRNDI4IDU3MyA0MTYgNTg1VDQwNCA2MTRRNDA0IDYzMSA0MTYgNjQzVDQ0NSA2NTVRNDYyIDY1NSA0NzQgNjQzVDQ4NiA2MTRaTTMxNyA2MTRRMzE3IDU5NyAzMDUgNTg1VDI3NiA1NzNRMjU5IDU3MyAyNDcgNTg1VDIzNSA2MTRRMjM1IDYzMSAyNDcgNjQzVDI3NiA2NTVRMjkzIDY1NSAzMDUgNjQzVDMxNyA2MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRUYyOyIgaG9yaXotYWR2LXg9IjUzMyIgZD0iTTI5OSAyNjdWMEgyMzVWMjY0TDE4IDY2N0g4OEwyNjcgMzIzTDQ0NiA2NjdINTE1TDI5OSAyNjdaTTI4MCA3MDVMMTE4IDgwOUwxNzggODQxTDMxMSA3MjdMMjgwIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFRjM7IiBob3Jpei1hZHYteD0iNDY2IiBkPSJNMjMwIC04OFEyMTUgLTEyOCAyMDIgLTE1NFQxNzIgLTE5N1QxMzYgLTIxOVQ4OSAtMjI2UTgxIC0yMjYgNjkgLTIyNlQ0NiAtMjI0Vi0xNzJRNTUgLTE3NCA2MyAtMTc0VDgzIC0xNzRRMTAyIC0xNzQgMTE1IC0xNjlUMTM5IC0xNTFUMTYxIC0xMTNUMTg1IC00OUwyMDkgMjFMMjMgNTAySDg3TDIzOCA4OUgyNDJMMzgwIDUwMkg0NDNMMjMwIC04OFpNMjUwIDU2NUw4OCA2NjlMMTQ4IDcwMUwyODEgNTg3TDI1MCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDEzOyIgaG9yaXotYWR2LXg9IjYwMiIgZD0iTTUxIDIzNVYyODNINTUxVjIzNUg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTQ7IiBob3Jpei1hZHYteD0iODc0IiBkPSJNNTEgMjM2VjI4Mkg4MjNWMjM2SDUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGhvcml6LWFkdi14PSIxODUiIGQ9Ik0xMDIgNTA5SDIxTDkzIDcwMEgxMzdMMTAyIDUwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBob3Jpei1hZHYteD0iMTg1IiBkPSJNOTEgNTA5SDQ4TDgzIDcwMEgxNjRMOTEgNTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQTsiIGhvcml6LWFkdi14PSIxODUiIGQ9Ik05MSAtMTQwSDQ4TDgzIDUxSDE2NEw5MSAtMTQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQzsiIGhvcml6LWFkdi14PSIzNDUiIGQ9Ik0yNjMgNTA5SDE4MkwyNTUgNzAwSDI5N0wyNjMgNTA5Wk0xMDEgNTA5SDIxTDk0IDcwMEgxMzZMMTAxIDUwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUQ7IiBob3Jpei1hZHYteD0iMzQ1IiBkPSJNMjUwIDUwOUgyMDhMMjQyIDcwMEgzMjRMMjUwIDUwOVpNOTEgNTA5SDQ4TDgzIDcwMEgxNjRMOTEgNTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRTsiIGhvcml6LWFkdi14PSIzNDUiIGQ9Ik0yNTAgLTE0MUgyMDhMMjQyIDUwSDMyNEwyNTAgLTE0MVpNOTEgLTE0MUg0OEw4MyA1MEgxNjRMOTEgLTE0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjA7IiBob3Jpei1hZHYteD0iMzI2IiBkPSJNMTkzIDQ4NlYxNjJIMTM0VjQ4Nkg1MlY1MzVIMTM0VjY2NkgxOTNWNTM1SDI3NFY0ODZIMTkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMTsiIGhvcml6LWFkdi14PSIzMjYiIGQ9Ik0xOTEgMjk1VjE0NEgxMzNWMjk1SDUyVjM0N0gxMzNWNDg4SDUyVjUzOUgxMzNWNjY2SDE5MVY1MzlIMjczVjQ4OEgxOTFWMzQ3SDI3NFYyOTVIMTkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGhvcml6LWFkdi14PSI1MTciIGQ9Ik00MDUgMzI5UTQwNSAyOTggMzk0IDI3MlQzNjIgMjI2VDMxNiAxOTVUMjU4IDE4M1EyMjcgMTgzIDIwMSAxOTRUMTU1IDIyNVQxMjQgMjcxVDExMiAzMjlRMTEyIDM2MCAxMjMgMzg2VDE1NCA0MzJUMjAwIDQ2M1QyNTggNDc1UTI4OSA0NzUgMzE1IDQ2NFQzNjIgNDMzVDM5MyAzODdUNDA1IDMyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjY7IiBob3Jpei1hZHYteD0iNjMwIiBkPSJNMTM5IDM3UTEzOSAxNSAxMjcgM1Q5MyAtMTBRNzEgLTEwIDU5IDJUNDcgMzdRNDcgODMgOTMgODNRMTM5IDgzIDEzOSAzN1pNMzYxIDM3UTM2MSAxNSAzNDkgM1QzMTUgLTEwUTI5MyAtMTAgMjgxIDJUMjY5IDM3UTI2OSA4MyAzMTUgODNRMzYxIDgzIDM2MSAzN1pNNTg0IDM3UTU4NCAxNSA1NzIgM1Q1MzggLTEwUTUxNiAtMTAgNTA0IDJUNDkyIDM3UTQ5MiA4MyA1MzggODNRNTg0IDgzIDU4NCAzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzA7IiBob3Jpei1hZHYteD0iOTY4IiBkPSJNMjcxIDU0N1EyNzEgNDc1IDI0NiA0MzVUMTYwIDM5NVExMDAgMzk1IDc1IDQzNVQ1MCA1NDdRNTAgNjE5IDc1IDY1OVQxNjAgNzAwUTIyMSA3MDAgMjQ2IDY2MFQyNzEgNTQ3Wk0yMjkgNTQ4UTIyOSA1NzQgMjI3IDU5NlQyMTcgNjMzVDE5NiA2NThUMTYwIDY2N1ExMzggNjY3IDEyNSA2NThUMTA1IDYzM1Q5NSA1OTVUOTIgNTQ3UTkyIDQ4MSAxMDggNDU1VDE2MCA0MjhRMTk3IDQyOCAyMTMgNDU1VDIyOSA1NDhaTTE2NyAwSDEyMUw1MzMgNzAwSDU3N0wxNjcgMFpNNjI0IDE0NlE2MjQgNzQgNTk5IDM0VDUxMyAtNlE0NTMgLTYgNDI4IDM0VDQwMyAxNDZRNDAzIDIxOCA0MjggMjU4VDUxMyAyOTlRNTc0IDI5OSA1OTkgMjU5VDYyNCAxNDZaTTU4MSAxNDdRNTgxIDE3MiA1NzkgMTk0VDU2OSAyMzFUNTQ5IDI1NlQ1MTMgMjY1UTQ5MSAyNjUgNDc4IDI1NlQ0NTggMjMyVDQ0OCAxOTRUNDQ1IDE0NlE0NDUgODEgNDYxIDU0VDUxMyAyN1E1NDkgMjcgNTY1IDU0VDU4MSAxNDdaTTkxOCAxNDZROTE4IDc0IDg5MyAzNFQ4MDcgLTZRNzQ2IC02IDcyMSAzNFQ2OTYgMTQ2UTY5NiAyMTggNzIxIDI1OFQ4MDcgMjk5UTg2OCAyOTkgODkzIDI1OVQ5MTggMTQ2Wk04NzUgMTQ3UTg3NSAxNzIgODczIDE5NFQ4NjMgMjMxVDg0MiAyNTZUODA3IDI2NVE3ODUgMjY1IDc3MiAyNTZUNzUyIDIzMlQ3NDIgMTk0VDczOSAxNDZRNzM5IDgxIDc1NSA1NFQ4MDcgMjdRODQzIDI3IDg1OSA1NFQ4NzUgMTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGhvcml6LWFkdi14PSIyNTkiIGQ9Ik0xNjkgMTE3TDIxIDMwOUwxNjkgNTAyTDIxMCA0NzZMODAgMzA5TDIxMCAxNDRMMTY5IDExN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwM0E7IiBob3Jpei1hZHYteD0iMjU5IiBkPSJNOTAgMTE3TDUwIDE0NEwxNzkgMzA5TDQ5IDQ3Nkw5MCA1MDJMMjM4IDMwOUw5MCAxMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgaG9yaXotYWR2LXg9IjExMSIgZD0iTS0xNjUgMEgtMjA3TDI2NCA3MDBIMzA2TC0xNjUgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzA7IiBob3Jpei1hZHYteD0iMzM4IiBkPSJNMjkyIDUzMFEyOTIgNDUxIDI2NSA0MDZUMTY5IDM2MVExMDEgMzYxIDc0IDQwNlQ0NiA1MzBRNDYgNjEwIDczIDY1NVQxNjkgNzAwUTIzNyA3MDAgMjY0IDY1NVQyOTIgNTMwWk0yNDUgNTMxUTI0NSA1NTkgMjQzIDU4M1QyMzIgNjI1VDIwOCA2NTNUMTY5IDY2M1ExNDUgNjYzIDEzMCA2NTNUMTA3IDYyNlQ5NiA1ODRUOTMgNTMwUTkzIDQ1OCAxMTEgNDI4VDE2OSAzOThRMjA5IDM5OCAyMjcgNDI4VDI0NSA1MzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc0OyIgaG9yaXotYWR2LXg9IjMwMCIgZD0iTTIyNCA0MzdWMzY3SDE3N1Y0MzdIMzVMMjIgNDc1TDE3MCA2OTRIMjI0VjQ3NkgyNzRWNDM3SDIyNFpNNjYgNDc0SDE3OFY2NDZMNjYgNDc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3NTsiIGhvcml6LWFkdi14PSIzMDIiIGQ9Ik0yNjEgNDc5UTI2MSA0MTkgMjI5IDM5MFQxNDAgMzYxUTEwOSAzNjEgODcgMzY4VDQwIDM5M0w2MiA0MjZRODIgNDExIDEwMCA0MDVUMTM4IDM5OFExNzYgMzk4IDE5NSA0MTdUMjE0IDQ3OVEyMTQgNTU0IDE0NiA1NTRRMTI2IDU1NCAxMTEgNTQ3VDc4IDUyM0w0MSA1NDlMNjYgNjk0SDIzOVY2NTRIMTAwTDg0IDU2M0g4NVExMDEgNTc3IDExOCA1ODJUMTU3IDU4OFEyMDYgNTg4IDIzMyA1NjJUMjYxIDQ3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzY7IiBob3Jpei1hZHYteD0iMzE3IiBkPSJNMjc2IDQ3NFEyNzYgNDIyIDI0NiAzOTJUMTY0IDM2MVExMDEgMzYxIDc0IDM5OVQ0NiA1MTBRNDYgNTUwIDUyIDU4NVQ3MiA2NDVUMTEyIDY4NVQxNzUgNzAwUTE5OCA3MDAgMjE3IDY5NFQyNTcgNjc3TDIzOCA2NDRRMjIyIDY1NSAyMDggNjU5VDE3NiA2NjNRMTM2IDY2MyAxMTUgNjM1VDkxIDUzNUg5MlExMTcgNTc3IDE3MyA1NzdRMjIyIDU3NyAyNDkgNTUxVDI3NiA0NzRaTTIzMyA0NzJRMjMzIDUwNSAyMTYgNTI0VDE2MyA1NDNRMTMzIDU0MyAxMTQgNTIzVDk1IDQ2OVE5NSA0MzUgMTEzIDQxN1QxNjQgMzk4UTE5NyAzOTggMjE1IDQxN1QyMzMgNDcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3NzsiIGhvcml6LWFkdi14PSIyNzciIGQ9Ik0yNTAgNjUwUTIxOSA2MjcgMTk5IDYwNVQxNjYgNTU1VDE0OCA0ODlUMTQyIDM5NlYzNjdIOTNWMzc5UTkzIDQxOCA5NiA0NTVUMTA5IDUyOFQxNDEgNTk0VDIwMCA2NTNWNjU0SDI1VjY5NEgyNDJMMjUwIDY1MEgyNTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc4OyIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI3NSA0NjBRMjc1IDQxNCAyNDggMzg4VDE1OCAzNjFROTYgMzYxIDY5IDM4N1Q0MSA0NjBRNDEgNTE5IDk5IDU0MFY1NDFRNTIgNTYyIDUyIDYxMVE1MiA2NDYgNzUgNjcwVDE1OCA2OTVRMjA5IDY5NSAyMzYgNjc1VDI2NCA2MTFRMjY0IDU2MiAyMTggNTQxVjU0MFEyNzUgNTE4IDI3NSA0NjBaTTIxOSA2MDlRMjE5IDY2MCAxNTggNjYwUTk3IDY2MCA5NyA2MDlROTcgNTU1IDE1OCA1NTVRMjE5IDU1NSAyMTkgNjA5Wk0yMzAgNDYwUTIzMCA0ODUgMjE1IDUwM1QxNTggNTIyUTEyOCA1MjIgMTA4IDUwOVQ4NyA0NTdRODcgMzk2IDE1OCAzOTZRMTkyIDM5NiAyMTEgNDExVDIzMCA0NjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDc5OyIgaG9yaXotYWR2LXg9IjMyMCIgZD0iTTI3NCA1MzVRMjc0IDQ0NCAyNDMgNDAzVDE0MyAzNjFRMTE4IDM2MSA5OCAzNjdUNTcgMzg3TDc3IDQyMFE5NCA0MDcgMTA4IDQwMlQxNDUgMzk3UTE4NyAzOTcgMjA4IDQyNVQyMzAgNTMxSDIyOFEyMTggNTA4IDE5NiA0OTdUMTQ3IDQ4NVE5OCA0ODUgNzAgNTEyVDQxIDU5MFE0MSA2NDIgNzMgNjcxVDE1NiA3MDBRMjE2IDcwMCAyNDUgNjYwVDI3NCA1MzVaTTIyMyA1OTBRMjIzIDYyNSAyMDYgNjQ0VDE1NSA2NjRRMTIzIDY2NCAxMDUgNjQ0VDg2IDU5MVE4NiA1NTcgMTAzIDUzOVQxNTMgNTIwUTE4NSA1MjAgMjA0IDUzOVQyMjMgNTkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MDsiIGhvcml6LWFkdi14PSIzMzgiIGQ9Ik0yOTIgNDhRMjkyIC0zMSAyNjUgLTc2VDE2OSAtMTIxUTEwMSAtMTIxIDc0IC03NlQ0NiA0OFE0NiAxMjggNzMgMTczVDE2OSAyMThRMjM3IDIxOCAyNjQgMTczVDI5MiA0OFpNMjQ1IDQ5UTI0NSA3NyAyNDMgMTAxVDIzMiAxNDNUMjA4IDE3MVQxNjkgMTgxUTE0NSAxODEgMTMwIDE3MVQxMDcgMTQ0VDk2IDEwMlQ5MyA0OFE5MyAtMjQgMTExIC01NFQxNjkgLTg0UTIwOSAtODQgMjI3IC01NFQyNDUgNDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgxOyIgaG9yaXotYWR2LXg9IjI2OCIgZD0iTTExOSAtNzdWMTU5SDExN0w0NiAxMTdMMjkgMTUxTDEyOCAyMTJIMTY0Vi03N0gyNDVWLTExNUgzNlYtNzdIMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MjsiIGhvcml6LWFkdi14PSIyOTkiIGQ9Ik00MiAtMTE1TDM1IC03MVE3OSAtMzIgMTExIC01VDE2NSA0NVQxOTYgODZUMjA3IDEyOFEyMDcgMTM3IDIwNSAxNDZUMTk2IDE2MlQxNzkgMTc1VDE1MSAxODBRMTI4IDE4MCAxMDkgMTcwVDY5IDEzN0w0MiAxNjdRNjkgMTk0IDk2IDIwNlQxNTYgMjE4UTIwMSAyMTggMjI3IDE5NlQyNTQgMTI5UTI1NCAxMDkgMjQ4IDkxVDIyMyA1MFQxNzIgLTNUODQgLTc2SDI1OFYtMTE1SDQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4MzsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik0yNTEgLTIzUTI1MSAtNjQgMjI1IC05MlQxMzcgLTEyMVExMDcgLTEyMSA4MiAtMTEzVDMwIC04Nkw1MCAtNTJRNzIgLTY5IDkyIC03NlQxMzQgLTg0UTE2MyAtODQgMTg0IC03MFQyMDUgLTIxUTIwNSAxMCAxODkgMjNUMTM2IDM3SDk5VjczSDExN1ExNjMgNzMgMTc5IDg5VDE5NiAxMjhRMTk2IDE4MCAxMzYgMTgwUTExNSAxODAgOTUgMTczVDU3IDE1MEwzNSAxODNRNjMgMjAzIDg3IDIxMFQxNDEgMjE4UTE4NSAyMTggMjEzIDE5N1QyNDIgMTMwUTI0MiAxMDYgMjI5IDg4VDE5MyA2MVY2MFEyNTEgNDYgMjUxIC0yM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODQ7IiBob3Jpei1hZHYteD0iMzAwIiBkPSJNMjI0IC00NVYtMTE1SDE3N1YtNDVIMzVMMjIgLTdMMTcwIDIxMkgyMjRWLTZIMjc0Vi00NUgyMjRaTTY2IC04SDE3OFYxNjRMNjYgLThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg1OyIgaG9yaXotYWR2LXg9IjMwMiIgZD0iTTI2MSAtM1EyNjEgLTYzIDIyOSAtOTJUMTQwIC0xMjFRMTA5IC0xMjEgODcgLTExNFQ0MCAtODlMNjIgLTU2UTgyIC03MSAxMDAgLTc3VDEzOCAtODRRMTc2IC04NCAxOTUgLTY1VDIxNCAtM1EyMTQgNzIgMTQ2IDcyUTEyNiA3MiAxMTEgNjVUNzggNDFMNDEgNjdMNjYgMjEySDIzOVYxNzJIMTAwTDg0IDgxSDg1UTEwMSA5NSAxMTggMTAwVDE1NyAxMDZRMjA2IDEwNiAyMzMgODBUMjYxIC0zWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA4NjsiIGhvcml6LWFkdi14PSIzMTciIGQ9Ik0yNzYgLThRMjc2IC02MCAyNDYgLTkwVDE2NCAtMTIxUTEwMSAtMTIxIDc0IC04M1Q0NiAyOFE0NiA2OCA1MiAxMDNUNzIgMTYzVDExMiAyMDNUMTc1IDIxOFExOTggMjE4IDIxNyAyMTJUMjU3IDE5NUwyMzggMTYyUTIyMiAxNzMgMjA4IDE3N1QxNzYgMTgxUTEzNiAxODEgMTE1IDE1M1Q5MSA1M0g5MlExMTcgOTUgMTczIDk1UTIyMiA5NSAyNDkgNjlUMjc2IC04Wk0yMzMgLTEwUTIzMyAyMyAyMTYgNDJUMTYzIDYxUTEzMyA2MSAxMTQgNDFUOTUgLTEzUTk1IC00NyAxMTMgLTY1VDE2NCAtODRRMTk3IC04NCAyMTUgLTY1VDIzMyAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg3OyIgaG9yaXotYWR2LXg9IjI3NyIgZD0iTTI1MCAxNjhRMjE5IDE0NSAxOTkgMTIzVDE2NiA3M1QxNDggN1QxNDIgLTg2Vi0xMTVIOTNWLTEwM1E5MyAtNjQgOTYgLTI3VDEwOSA0NlQxNDEgMTEyVDIwMCAxNzFWMTcySDI1VjIxMkgyNDJMMjUwIDE2OEgyNTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg4OyIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI3NSAtMjJRMjc1IC02OCAyNDggLTk0VDE1OCAtMTIxUTk2IC0xMjEgNjkgLTk1VDQxIC0yMlE0MSAzNyA5OSA1OFY1OVE1MiA4MCA1MiAxMjlRNTIgMTY0IDc1IDE4OFQxNTggMjEzUTIwOSAyMTMgMjM2IDE5M1QyNjQgMTI5UTI2NCA4MCAyMTggNTlWNThRMjc1IDM2IDI3NSAtMjJaTTIxOSAxMjdRMjE5IDE3OCAxNTggMTc4UTk3IDE3OCA5NyAxMjdROTcgNzMgMTU4IDczUTIxOSA3MyAyMTkgMTI3Wk0yMzAgLTIyUTIzMCAzIDIxNSAyMVQxNTggNDBRMTI4IDQwIDEwOCAyN1Q4NyAtMjVRODcgLTg2IDE1OCAtODZRMTkyIC04NiAyMTEgLTcxVDIzMCAtMjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg5OyIgaG9yaXotYWR2LXg9IjMyMCIgZD0iTTI3NCA1M1EyNzQgLTM4IDI0MyAtNzlUMTQzIC0xMjFRMTE4IC0xMjEgOTggLTExNVQ1NyAtOTRMNzcgLTYyUTk0IC03NSAxMDggLTgwVDE0NSAtODVRMTY2IC04NSAxODIgLTc5VDIwOCAtNTdUMjI0IC0xNVQyMzAgNTBIMjI4UTIxOCAyNyAxOTYgMTVUMTQ3IDNROTggMyA3MCAzMFQ0MSAxMDhRNDEgMTYxIDczIDE4OVQxNTYgMjE4UTIxNiAyMTggMjQ1IDE3OVQyNzQgNTNaTTIyMyAxMDlRMjIzIDE0NCAyMDYgMTYzVDE1NSAxODJRMTIzIDE4MiAxMDUgMTYyVDg2IDEwOVE4NiA3NSAxMDMgNTdUMTUzIDM5UTE4NSAzOSAyMDQgNTdUMjIzIDEwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwQUM7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNOTcgNDI2UTEwMyA0NzUgMTE0IDUyMVQxNDkgNjAxVDIxMyA2NTdUMzE2IDY3OFEzNzYgNjc4IDQyMiA2NTRUNTA5IDU4MEw0NjggNTQyUTQzNiA1ODcgNDAxIDYwNlQzMTggNjI2UTI3NyA2MjYgMjQ5IDYxNVQyMDMgNTc5VDE3NCA1MTZUMTU5IDQyNkg0NDRWMzg1SDE1N1ExNTcgMzcyIDE1NyAzNjBUMTU2IDMzNFExNTYgMzI0IDE1NiAzMDhUMTU4IDI4MUg0NDRWMjM5SDE2MFExNjMgMjEyIDE2OCAxNzhUMTg5IDExM1QyMzQgNjFUMzE1IDQwUTM3NCA0MCA0MTAgNjZUNDc2IDE0MEw1MTUgMTA1UTQ5NyA4MCA0NzggNTlUNDM0IDIyVDM4MCAtMlQzMTIgLTExUTI1NiAtMTEgMjE4IDZUMTU1IDU2VDExNyAxMzVUOTcgMjM5SDI0VjI4MUg5NFE5MyAyOTAgOTMgMzA3VDkyIDMzNFE5MiAzNDcgOTIgMzU5VDk0IDM4NUgyNFY0MjZIOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTIyOyIgaG9yaXotYWR2LXg9IjU5NiIgZD0iTTQ5NCA0ODFWNjMwTDQxNCA1MTRMMzM0IDYzMFY0ODFIMjk0VjcwMEgzMzJMNDE0IDU3OEw0OTYgNzAwSDUzNFY0ODFINDk0Wk0xNjUgNjY0VjQ4MUgxMjRWNjY0SDQ5VjcwMEgyNDBWNjY0SDE2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNTM7IiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMTQ0IDQwNVY2NDFIMTQyTDcxIDU5OUw1NCA2MzNMMTUzIDY5NEgxODlWNDA1SDI3MFYzNjdINjFWNDA1SDE0NFpNMTM4IDBIOTZMNTY3IDcwMEg2MDlMMTM4IDBaTTY1MCA5MlE2NTAgNTEgNjI0IDIzVDUzNiAtNlE1MDYgLTYgNDgxIDJUNDI5IDI5TDQ0OSA2M1E0NzEgNDYgNDkxIDM5VDUzMyAzMVE1NjIgMzEgNTgzIDQ1VDYwNCA5NFE2MDQgMTI1IDU4OCAxMzhUNTM1IDE1Mkg0OThWMTg4SDUxNlE1NjIgMTg4IDU3OCAyMDRUNTk1IDI0M1E1OTUgMjk1IDUzNSAyOTVRNTE0IDI5NSA0OTQgMjg4VDQ1NiAyNjVMNDM0IDI5OFE0NjIgMzE4IDQ4NiAzMjVUNTQwIDMzM1E1ODQgMzMzIDYxMiAzMTJUNjQxIDI0NVE2NDEgMjIxIDYyOCAyMDNUNTkyIDE3NlYxNzVRNjUwIDE2MSA2NTAgOTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTU0OyIgaG9yaXotYWR2LXg9IjY5MCIgZD0iTTYyIDM2N0w1NSA0MTFROTkgNDUwIDEzMSA0NzdUMTg1IDUyN1QyMTYgNTY4VDIyNyA2MTBRMjI3IDYxOSAyMjUgNjI4VDIxNiA2NDRUMTk5IDY1N1QxNzEgNjYyUTE0OCA2NjIgMTI5IDY1MlQ4OSA2MTlMNjIgNjQ5UTg5IDY3NiAxMTYgNjg4VDE3NiA3MDBRMjIxIDcwMCAyNDcgNjc4VDI3NCA2MTFRMjc0IDU5MSAyNjggNTczVDI0MyA1MzJUMTkyIDQ3OVQxMDQgNDA2SDI3OFYzNjdINjJaTTEzOCAwSDk2TDU2NyA3MDBINjA5TDEzOCAwWk02NTAgOTJRNjUwIDUxIDYyNCAyM1Q1MzYgLTZRNTA2IC02IDQ4MSAyVDQyOSAyOUw0NDkgNjNRNDcxIDQ2IDQ5MSAzOVQ1MzMgMzFRNTYyIDMxIDU4MyA0NVQ2MDQgOTRRNjA0IDEyNSA1ODggMTM4VDUzNSAxNTJINDk4VjE4OEg1MTZRNTYyIDE4OCA1NzggMjA0VDU5NSAyNDNRNTk1IDI5NSA1MzUgMjk1UTUxNCAyOTUgNDk0IDI4OFQ0NTYgMjY1TDQzNCAyOThRNDYyIDMxOCA0ODYgMzI1VDU0MCAzMzNRNTg0IDMzMyA2MTIgMzEyVDY0MSAyNDVRNjQxIDIyMSA2MjggMjAzVDU5MiAxNzZWMTc1UTY1MCAxNjEgNjUwIDkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1QjsiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik0xNDQgNDA1VjY0MUgxNDJMNzEgNTk5TDU0IDYzM0wxNTMgNjk0SDE4OVY0MDVIMjcwVjM2N0g2MVY0MDVIMTQ0Wk0xMzggMEg5Nkw1NjcgNzAwSDYwOUwxMzggMFpNNjU2IDkzUTY1NiA0NyA2MjkgMjFUNTM5IC02UTQ3NyAtNiA0NTAgMjBUNDIyIDkzUTQyMiAxNTIgNDgwIDE3M1YxNzRRNDMzIDE5NSA0MzMgMjQ0UTQzMyAyNzkgNDU2IDMwM1Q1MzkgMzI4UTU5MCAzMjggNjE3IDMwOFQ2NDUgMjQ0UTY0NSAxOTUgNTk5IDE3NFYxNzNRNjU2IDE1MSA2NTYgOTNaTTYwMCAyNDJRNjAwIDI5MyA1MzkgMjkzUTQ3OCAyOTMgNDc4IDI0MlE0NzggMTg4IDUzOSAxODhRNjAwIDE4OCA2MDAgMjQyWk02MTEgOTNRNjExIDExOCA1OTYgMTM2VDUzOSAxNTVRNTA5IDE1NSA0ODkgMTQyVDQ2OCA5MFE0NjggMjkgNTM5IDI5UTU3MyAyOSA1OTIgNDRUNjExIDkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1QzsiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik0yNjcgNDU5UTI2NyA0MTggMjQxIDM5MFQxNTMgMzYxUTEyMyAzNjEgOTggMzY5VDQ2IDM5Nkw2NiA0MzBRODggNDEzIDEwOCA0MDZUMTUwIDM5OFExNzkgMzk4IDIwMCA0MTJUMjIxIDQ2MVEyMjEgNDkyIDIwNSA1MDVUMTUyIDUxOUgxMTVWNTU1SDEzM1ExNzkgNTU1IDE5NSA1NzFUMjEyIDYxMFEyMTIgNjYyIDE1MiA2NjJRMTMxIDY2MiAxMTEgNjU1VDczIDYzMkw1MSA2NjVRNzkgNjg1IDEwMyA2OTJUMTU3IDcwMFEyMDEgNzAwIDIyOSA2NzlUMjU4IDYxMlEyNTggNTg4IDI0NSA1NzBUMjA5IDU0M1Y1NDJRMjY3IDUyOCAyNjcgNDU5Wk0xMzggMEg5Nkw1NjcgNzAwSDYwOUwxMzggMFpNNjU2IDkzUTY1NiA0NyA2MjkgMjFUNTM5IC02UTQ3NyAtNiA0NTAgMjBUNDIyIDkzUTQyMiAxNTIgNDgwIDE3M1YxNzRRNDMzIDE5NSA0MzMgMjQ0UTQzMyAyNzkgNDU2IDMwM1Q1MzkgMzI4UTU5MCAzMjggNjE3IDMwOFQ2NDUgMjQ0UTY0NSAxOTUgNTk5IDE3NFYxNzNRNjU2IDE1MSA2NTYgOTNaTTYwMCAyNDJRNjAwIDI5MyA1MzkgMjkzUTQ3OCAyOTMgNDc4IDI0MlE0NzggMTg4IDUzOSAxODhRNjAwIDE4OCA2MDAgMjQyWk02MTEgOTNRNjExIDExOCA1OTYgMTM2VDUzOSAxNTVRNTA5IDE1NSA0ODkgMTQyVDQ2OCA5MFE0NjggMjkgNTM5IDI5UTU3MyAyOSA1OTIgNDRUNjExIDkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1RDsiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik0yNzcgNDc5UTI3NyA0MTkgMjQ1IDM5MFQxNTYgMzYxUTEyNSAzNjEgMTAzIDM2OFQ1NiAzOTNMNzggNDI2UTk4IDQxMSAxMTYgNDA1VDE1NCAzOThRMTkyIDM5OCAyMTEgNDE3VDIzMCA0NzlRMjMwIDU1NCAxNjIgNTU0UTE0MiA1NTQgMTI3IDU0N1Q5NCA1MjNMNTcgNTQ5TDgyIDY5NEgyNTVWNjU0SDExNkwxMDAgNTYzSDEwMVExMTcgNTc3IDEzNCA1ODJUMTczIDU4OFEyMjIgNTg4IDI0OSA1NjJUMjc3IDQ3OVpNMTM4IDBIOTZMNTY3IDcwMEg2MDlMMTM4IDBaTTY1NiA5M1E2NTYgNDcgNjI5IDIxVDUzOSAtNlE0NzcgLTYgNDUwIDIwVDQyMiA5M1E0MjIgMTUyIDQ4MCAxNzNWMTc0UTQzMyAxOTUgNDMzIDI0NFE0MzMgMjc5IDQ1NiAzMDNUNTM5IDMyOFE1OTAgMzI4IDYxNyAzMDhUNjQ1IDI0NFE2NDUgMTk1IDU5OSAxNzRWMTczUTY1NiAxNTEgNjU2IDkzWk02MDAgMjQyUTYwMCAyOTMgNTM5IDI5M1E0NzggMjkzIDQ3OCAyNDJRNDc4IDE4OCA1MzkgMTg4UTYwMCAxODggNjAwIDI0MlpNNjExIDkzUTYxMSAxMTggNTk2IDEzNlQ1MzkgMTU1UTUwOSAxNTUgNDg5IDE0MlQ0NjggOTBRNDY4IDI5IDUzOSAyOVE1NzMgMjkgNTkyIDQ0VDYxMSA5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNUU7IiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMzA1IDY1MFEyNzQgNjI3IDI1NCA2MDVUMjIxIDU1NVQyMDMgNDg5VDE5NyAzOTZWMzY3SDE0OFYzNzlRMTQ4IDQxOCAxNTEgNDU1VDE2NCA1MjhUMTk2IDU5NFQyNTUgNjUzVjY1NEg4MFY2OTRIMjk3TDMwNSA2NTBaTTEzOCAwSDk2TDU2NyA3MDBINjA5TDEzOCAwWk02NTYgOTNRNjU2IDQ3IDYyOSAyMVQ1MzkgLTZRNDc3IC02IDQ1MCAyMFQ0MjIgOTNRNDIyIDE1MiA0ODAgMTczVjE3NFE0MzMgMTk1IDQzMyAyNDRRNDMzIDI3OSA0NTYgMzAzVDUzOSAzMjhRNTkwIDMyOCA2MTcgMzA4VDY0NSAyNDRRNjQ1IDE5NSA1OTkgMTc0VjE3M1E2NTYgMTUxIDY1NiA5M1pNNjAwIDI0MlE2MDAgMjkzIDUzOSAyOTNRNDc4IDI5MyA0NzggMjQyUTQ3OCAxODggNTM5IDE4OFE2MDAgMTg4IDYwMCAyNDJaTTYxMSA5M1E2MTEgMTE4IDU5NiAxMzZUNTM5IDE1NVE1MDkgMTU1IDQ4OSAxNDJUNDY4IDkwUTQ2OCAyOSA1MzkgMjlRNTczIDI5IDU5MiA0NFQ2MTEgOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjEyOyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTU0IDIzMVYyODVINTAwVjIzMUg1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjA7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNMzY5IDMxMkwyNTYgMjAxSDUwMFYxNDdIMjA5TDExOCA1NUw4MCA4OUwxMzkgMTQ3SDU1VjIwMUgxODdMMjk5IDMxMkg1NVYzNjZIMzQ3TDQ0MiA0NjNMNDgyIDQzMEw0MTYgMzY2SDUwMFYzMTJIMzY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik01NCAyNTZWMzE1TDUwMCA0ODRWNDI3TDExNCAyODZMNTAwIDE0OFY5Mkw1NCAyNTZaTTU0IDBWNTNINTAwVjBINTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTU0IDkyVjE0OEw0NDAgMjg2TDU0IDQyN1Y0ODRMNTAwIDMxNVYyNTZMNTQgOTJaTTU0IDBWNTNINTAwVjBINTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyNERGOyIgaG9yaXotYWR2LXg9IjkwNiIgZD0iTTc5OSAzMzRRNzk5IDI2MiA3NzIgMjAwVDY5OCA5MVQ1ODggMTdUNDUzIC0xMFEzODEgLTEwIDMxOCAxN1QyMDggOTBUMTM0IDE5OVQxMDcgMzM0UTEwNyA0MDYgMTM0IDQ2OFQyMDggNTc3VDMxOCA2NTFUNDUzIDY3OFE1MjUgNjc4IDU4OCA2NTFUNjk4IDU3OFQ3NzIgNDY5VDc5OSAzMzRaTTc2NiAzMzRRNzY2IDM5OCA3NDIgNDU0VDY3NiA1NTRUNTc3IDYyMlQ0NTMgNjQ3UTM4NiA2NDcgMzI5IDYyMlQyMzAgNTU0VDE2NSA0NTVUMTQxIDMzNFExNDEgMjcwIDE2NiAyMTRUMjMzIDExNVQzMzIgNDhUNDUzIDIzUTUxNyAyMyA1NzMgNDdUNjczIDExNFQ3NDEgMjEzVDc2NiAzMzRaTTYzNyA0MjFRNjM3IDM1MCA2MDAgMzE4VDQ4NCAyODVIMzc1VjEwN0gzMjZWNTUxUTM2MCA1NTUgMzk3IDU1NlQ0NzEgNTU3UTUwOCA1NTcgNTM4IDU1MVQ1OTEgNTMwVDYyNSA0ODhUNjM3IDQyMVpNNTg4IDQxOVE1ODggNDQ5IDU4MSA0NjhUNTU4IDQ5OVQ1MjEgNTE1VDQ2OCA1MTlRNDQ0IDUxOSA0MjIgNTE4VDM3NSA1MTRWMzIzSDQ2OFE0OTQgMzIzIDUxNiAzMjZUNTU0IDMzOVQ1NzkgMzY4VDU4OCA0MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNkMzOyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTE3NyAtMjA2SDEzNkwxNjAgLTYxSDIyOUwxNzcgLTIwNloiICAvPgorCisKKzwvZm9udD4KKzwvZGVmcz4KKzx0ZXh0IHg9IjQwIiB5PSI0MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBMdCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEHDgcOAw4LDhMOFw4PDhiBDw4cgRMOQIEXDicOIw4rDiyBJIMONIMOMIMOOIMOPIE7DkTwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSI4MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBMdCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPk/Dk8OSw5TDlsOVw5jFkiBTxaAgVcOaw5nDm8OcIFnDncW4IFrFvSDDniBhw6HDoMOiw6TDpcOjw6YgY8OnIGTDsCBlw6nDqMOqw6sgaSDEsSDDrSDDrCDDriDDryBuw7Egb8Ozw7LDtMO2w7XDuMWTIHPFocOfIHXDusO5w7vDvCB5w73DvyB6xb48L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTIwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEx0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+w74gMTIzNDU2Nzg5MCDCvSDCvCDCviAlIOKAsCAkwqLCo8KlxpLigqzCpCDigKAg4oChIMKnIMK2ICMgXn7CtSArw5fCsSAmbHQ7ID0gJmd0OyDDt8KsICHCoT/CvyAmcXVvdDsgJmFtcDsgJmFwb3M7ICogwrAgLiAsIDogOyAoKSBbIFwgXSB7fSAvIHw8L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTYwIiBmb250LWZhbWlseT0iQ2xlYXJ2aWV3QVRUIEx0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+wqYgXyDigJog4oCeIOKApiDigLnigLogwqvCuyDigJgg4oCZIOKAnCDigJ0g4oCiIMKtIC0g4oCTIOKAlCBAIMKpIMKuIOKEoiDCqsK6IMK5wrLCsyDCtCBgIMuGIMucIMKoIMKvIMK3IMK4PC90ZXh0PgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdC50dGYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdC50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhNDVjMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUx0LnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdC53b2ZmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtTHQud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFlZTJlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL0NsZWFydmlld0FUVC9DbGVhcnZpZXdBVFQtTHQud29mZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LmVvdCBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUx0SXQuZW90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzcyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LmVvdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUx0SXQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjYzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LnN2ZwpAQCAtMCwwICsxLDQyNCBAQAor77u/PD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCIgPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID4KKzxtZXRhZGF0YT4KKzx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKzxpZD48IVtDREFUQVtDbGVhcnZpZXdBVFQgTHRJdF1dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0NvcHlyaWdodCAoYykgVGVybWluYWwgRGVzaWduLCBJbmMsIDIwMDUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXV0+PC9jb3B5cmlnaHQ+Cis8dHJhZGVtYXJrPjwhW0NEQVRBW0NsZWFydmlldyBpcyBhIHRyYWRlbWFyayBvZiBUZXJtaW5hbCBEZXNpZ24sIEluYy5dXT48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjQ5MCIgaWQ9IkNsZWFydmlld0FUVC1MdEl0Ij4KKzxmb250LWZhY2UgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBMdEl0IiBwYW5vc2UtMT0iMiAxMSA1IDYgMyA1IDAgMiAwIDQiIGFzY2VudD0iNzUwIiBkZXNjZW50PSItMjUwIiB1bml0cy1wZXItZW09IjEwMDAiIGFscGhhYmV0aWM9IjAiPgorPC9mb250LWZhY2U+Cis8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iNDg0IiBkPSJNNTg1IDY2N0w0OTIgMEgtOEw4NSA2NjdINTg1Wk0xMTYgNjA2TDQwIDY1TDI2NCAzMzZMMTE2IDYwNlpNNDYyIDY3TDUzOCA2MDVMMzE1IDMzNkw0NjIgNjdaTTY1IDM1SDQyOEwyODQgMjk5TDY1IDM1Wk0yOTQgMzczTDUwNyA2MzBIMTUzTDI5NCAzNzNaIiAgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGhvcml6LWFkdi14PSIyODAiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgaG9yaXotYWR2LXg9IjI3MSIgZD0iTTI2NiA2NjdRMjQ0IDU0MyAyMjQgNDIyVDE4NCAxNzZIMTM2UTE1MSAzMDAgMTY1IDQyMVQxOTMgNjY3SDI2NlpNMTkwIDQ3UTE5MCAyMyAxNzUgN1QxMzQgLTEwUTExMyAtMTAgMTAyIDBUOTEgMjlROTEgNTMgMTA2IDY5VDE0NyA4NVExOTAgODUgMTkwIDQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJnF1b3Q7IiBob3Jpei1hZHYteD0iMzY4IiBkPSJNMzU2IDUxOEgzMTZMMzI2IDcwMEgzOTlMMzU2IDUxOFpNMTk1IDUxOEgxNTRMMTY1IDcwMEgyMzhMMTk1IDUxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiMiIGhvcml6LWFkdi14PSI1ODIiIGQ9Ik02MTQgNDcxSDQ5NUw0NTAgMzE2SDU3NEw1NjEgMjcxSDQzOEwzOTMgMTEzSDM0NEwzODggMjcxSDI0MEwxOTYgMTEzSDE0OEwxOTIgMjcxSDY4TDgwIDMxNkgyMDVMMjQ5IDQ3MUgxMjNMMTM1IDUxNUgyNjBMMzA0IDY2N0gzNTRMMzExIDUxNUg0NTlMNTAyIDY2N0g1NTJMNTA3IDUxNUg2MjdMNjE0IDQ3MVpNMjk3IDQ3MUwyNTQgMzE2SDQwMkw0NDcgNDcxSDI5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiQiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik01MDggMjIxUTUwOCAxODEgNDkzIDE0N1Q0NTIgODdUMzg5IDQ2VDMwOCAyOEwyOTggLTQ3SDIzOUwyNTAgMjlRMjA3IDMwIDE2MyA0N1Q4NiA4N0wxMjAgMTM4UTE1OCAxMDkgMjAxIDkzVDI4NSA3NlEzMTMgNzYgMzQxIDgzVDM5MyAxMDVUNDMwIDE0NlQ0NDUgMjA4UTQ0NSAyNDYgNDIyIDI2OVQzNjAgMzEyTDI2NSAzNjJRMjE5IDM4NyAxODkgNDE3VDE1OSA0OTVRMTU5IDUzMCAxNzMgNTU4VDIxMSA2MDdUMjY5IDYzOFQzMzkgNjUwTDM0OSA3MjNINDA5TDM5OSA2NTFRNDMyIDY1MCA0NzAgNjM3VDUzOSA2MDJMNTA4IDU1MlE0NzcgNTc2IDQ0MiA1ODlUMzYyIDYwM1EyOTcgNjAzIDI2MCA1ODBUMjIyIDUwMVEyMjIgNDcyIDI0NCA0NTFUMzE2IDQwNEwzOTkgMzYyUTQ1NiAzMzMgNDgyIDMwMVQ1MDggMjIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJSIgaG9yaXotYWR2LXg9IjcwOSIgZD0iTTM3NCA1ODNRMzc0IDU0NiAzNjcgNTA3VDM0MyA0MzZUMjk3IDM4MlQyMjMgMzYxUTE2NiAzNjEgMTQzIDM5MlQxMjAgNDc3UTEyMCA1MTQgMTI2IDU1M1QxNTAgNjI1VDE5NyA2NzlUMjcxIDcwMFEzMjggNzAwIDM1MSA2NjhUMzc0IDU4M1pNMjI4IDM5OFEyNjAgMzk4IDI4MCA0MThUMzEwIDQ2OFQzMjQgNTMwVDMyOCA1ODdRMzI4IDYyMCAzMTYgNjQxVDI2NiA2NjNRMjM0IDY2MyAyMTQgNjQzVDE4NCA1OTRUMTcwIDUzMlQxNjYgNDc1UTE2NiA0NDIgMTc4IDQyMFQyMjggMzk4Wk0xNjcgMEgxMjFMNjMxIDcwMEg2NzVMMTY3IDBaTTY4NSAyMTZRNjg1IDE3OSA2NzkgMTQwVDY1NSA2OVQ2MDkgMTVUNTM1IC02UTQ3OCAtNiA0NTUgMjZUNDMxIDExMlE0MzEgMTQ5IDQzOCAxODhUNDYyIDI1OVQ1MDggMzEyVDU4MiAzMzNRNjM5IDMzMyA2NjIgMzAxVDY4NSAyMTZaTTU0MCAzMVE1NzIgMzEgNTkxIDUxVDYyMSAxMDBUNjM1IDE2MVQ2MzkgMjE4UTYzOSAyNTEgNjI3IDI3M1Q1NzcgMjk2UTU0NSAyOTYgNTI2IDI3NlQ0OTYgMjI4VDQ4MiAxNjdUNDc4IDExMVE0NzggNzggNDkwIDU1VDU0MCAzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBob3Jpei1hZHYteD0iNTcyIiBkPSJNMjY5IC0xMVEyMTQgLTExIDE3NyAzVDExNyA0MFQ4NSA5M1Q3NSAxNTRRNzUgMTk2IDg5IDIyOVQxMjggMjkwVDE4NCAzMzlUMjUxIDM4MVEyMjkgNDExIDIxMSA0NDdUMTkyIDUyMlExOTIgNTU3IDIwNSA1ODZUMjQxIDYzNVQyOTYgNjY3VDM2NiA2NzhRNDA1IDY3OCA0MzAgNjY4VDQ2OSA2NDFUNDg5IDYwNFQ0OTUgNTY2UTQ5NSA1MzAgNDgwIDUwMVQ0NDEgNDQ5VDM4NiA0MDZUMzI1IDM3MEw0NjAgMTMzUTQ2OSAxNDggNDc2IDE2OVQ0ODYgMjEzUTQ4OSAyMzggNDg5IDI2NFE0ODkgMjgyIDQ4OCAyOTdUNDg1IDMyM0g1NDJRNTQzIDMxNCA1NDMgMzAyVDU0NCAyNzZRNTQ0IDI2MCA1NDMgMjQ0VDU0MCAyMTNRNTM1IDE4MSA1MjQgMTQ5VDQ5MSA5Mkw1NDUgMEg0NzhMNDQ2IDUzUTQxNSAyNyAzNzMgOFQyNjkgLTExWk0yNzUgMzVRMzE3IDM1IDM1NSA1MVQ0MjAgOTJMMjczIDM0NFEyNDcgMzI4IDIyMyAzMTBUMTc5IDI3MFQxNDggMjIwVDEzNiAxNTZRMTM2IDk0IDE3NSA2NVQyNzUgMzVaTTMwNSA0MDNRMzI1IDQxNSAzNDggNDMwVDM5MiA0NjRUNDI1IDUwNlQ0MzkgNTU5UTQzOSA1NzEgNDM2IDU4NFQ0MjMgNjA5VDM5OSA2MjdUMzYwIDYzNFEzMDkgNjM0IDI4MCA2MDdUMjUxIDUzMVEyNTEgNTE0IDI1NiA0OTdUMjcwIDQ2MlQyODcgNDMwVDMwNSA0MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImYXBvczsiIGhvcml6LWFkdi14PSIyMDciIGQ9Ik0xOTUgNTE4SDE1NEwxNjUgNzAwSDIzOEwxOTUgNTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKCIgaG9yaXotYWR2LXg9IjI3OCIgZD0iTTE1OCAtMTM3UTEyMyAtNDcgMTA1IDMyVDg3IDE5NVE4NyAzNTEgMTM5IDQ5MVQyODYgNzcxTDMyNSA3NjJRMjQ2IDYzMCAxOTggNDg2VDE1MCAxODFRMTUwIDEwMyAxNjIgMjdUMjAwIC0xMjhMMTU4IC0xMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIpIiBob3Jpei1hZHYteD0iMjc4IiBkPSJNMzQgLTEyOFExMTQgNCAxNjEgMTQ5VDIwOSA0NTVRMjA5IDUzMyAxOTcgNjA5VDE1OSA3NjJMMjAwIDc3MVEyMzUgNjc5IDI1MyA2MDBUMjcxIDQzN1EyNzEgMjgyIDIyMCAxNDFUNzIgLTEzN0wzNCAtMTI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKiIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI1OSA1NTRMMzA5IDQ5MEwyNTcgNDU0TDIyNCA1MzFMMTcwIDQ1NUwxMjggNDkwTDE5NyA1NTRMMTEyIDU2OUwxNDAgNjI0TDIxNCA1ODhMMjExIDY3NEgyNzNMMjUwIDU4OUwzMzQgNjI1TDM0NyA1NzBMMjU5IDU1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IisiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik0zMzkgMjMxTDMxMCAyMkgyNTVMMjg0IDIzMUg4Nkw5NCAyODVIMjkyTDMxOSA0ODJIMzc0TDM0NyAyODVINTQwTDUzMiAyMzFIMzM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MmM7IiBob3Jpei1hZHYteD0iMTg0IiBkPSJNNTUgLTExMkgxNEw3NCA4NUgxNTZMNTUgLTExMloiICAvPgorPGdseXBoIHVuaWNvZGU9Ii0iIGhvcml6LWFkdi14PSIzNjkiIGQ9Ik04NCAyMzJMOTIgMjg2SDM1N0wzNDkgMjMySDg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLiIgaG9yaXotYWR2LXg9IjE4NCIgZD0iTTE0NSA0N1ExNDUgMjIgMTMwIDZUODkgLTEwUTcxIC0xMCA2MCAwVDQ4IDI5UTQ4IDU1IDYyIDcwVDEwMyA4NVExMjIgODUgMTMzIDc2VDE0NSA0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9Ii8iIGhvcml6LWFkdi14PSI0NzkiIGQ9Ik01OSAtMTE1SDJMNTEyIDcwMEg1NzFMNTkgLTExNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjAiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik01NTQgNDYxUTU1NCA0MTUgNTUwIDM2M1Q1MzQgMjU4VDUwMyAxNTdUNDUyIDcxVDM3OCAxMlQyNzUgLTExUTIyMiAtMTEgMTg3IDVUMTMwIDQ5VDEwMSAxMThUOTIgMjA3UTkyIDI1MyA5NiAzMDZUMTEyIDQxMVQxNDMgNTEyVDE5NCA1OTdUMjY5IDY1NlQzNzIgNjc4UTQyNSA2NzggNDYwIDY2MlQ1MTYgNjE4VDU0NSA1NDlUNTU0IDQ2MVpNMjgzIDQwUTMyOSA0MCAzNjIgNjJUNDE5IDEyMFQ0NTYgMjAxVDQ3OSAyOTRUNDg5IDM4NlQ0OTIgNDY1UTQ5MiA0OTkgNDg3IDUyOFQ0NjcgNTc5VDQyOCA2MTNUMzY0IDYyNlEzMTcgNjI2IDI4MyA2MDRUMjI2IDU0NlQxODkgNDY0VDE2OCAzNzFUMTU4IDI3OFQxNTUgMTk4UTE1NSAxNjQgMTYwIDEzNVQxODAgODVUMjIwIDUyVDI4MyA0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik0yNjggNTRMMzQ1IDU5OUgzNDFMMTY3IDUwM0wxNDcgNTUxTDM2MiA2NzBINDE2TDMyOSA1NEg0OTBMNDgzIDBIOTJMOTkgNTRIMjY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMiIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTgyIDBMNzkgNjJRMTA5IDg2IDE1MCAxMTdUMjM2IDE4NFQzMjMgMjU5VDQwMCAzNDFUNDU1IDQyNlQ0NzYgNTE0UTQ3NiA1NjcgNDQ5IDU5NlQzNjcgNjI1UTM0MSA2MjUgMzE2IDYxN1QyNjkgNTk3VDIyNiA1NjhUMTg3IDUzM0wxNTkgNTc4UTIwNyA2MjMgMjU5IDY1MFQzNzggNjc4UTQ1MCA2NzggNDk1IDY0MVQ1NDAgNTI2UTU0MCA0NzcgNTIxIDQzMVQ0NjkgMzQwVDM5NiAyNTZUMzEwIDE4MFQyMjMgMTEyVDE0MyA1NEg0OTFMNDg0IDBIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNTEzIDIyN1E1MTMgMTc1IDQ5NyAxMzJUNDUwIDU3VDM3MyA3VDI2NiAtMTFRMjA0IC0xMSAxNjIgNFQ3OCA1MkwxMTQgMTAxUTE1MCA2OSAxODkgNTVUMjcxIDQwUTM1OCA0MCA0MDMgOTBUNDQ5IDIyM1E0NDkgMjc2IDQxNyAzMDBUMzA5IDMyNEgyNDZMMjUzIDM3NkgyNzVRMzEyIDM3NiAzNDggMzgzVDQxMiA0MDdUNDU4IDQ1M1Q0NzYgNTI3UTQ3NiA1NzUgNDQ1IDYwMFQzNTQgNjI2UTI3MyA2MjYgMTkwIDU2N0wxNjkgNjE2UTIyMyA2NDkgMjY5IDY2M1QzNjggNjc4UTQwNCA2NzggNDM1IDY3MFQ0OTAgNjQ1VDUyNyA2MDFUNTQwIDUzN1E1NDAgNDc1IDUwNyA0MjZUNDEwIDM1Nkw0MDkgMzUzUTQ2MiAzNDQgNDg3IDMxNFQ1MTMgMjI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNCIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTQzNCAxNDhMNDE0IDBIMzUxTDM3MSAxNDhIODhMNzggMjA3TDQzMyA2NjVINTA3TDQ0MiAyMDJINTMzTDUyNSAxNDhINDM0Wk00MzMgNTk2TDEzOCAyMDJIMzgyTDQzNyA1OTZINDMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNSIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTUxOSAyODRRNTE5IDIyMCA1MDQgMTY2VDQ1NiA3M1QzNzQgMTFUMjU1IC0xMVEyMDQgLTExIDE2MyAyVDgwIDQ5TDExNSA5OVExNTMgNjcgMTg3IDU0VDI2MCA0MFEzMTEgNDAgMzQ4IDU3VDQwOCAxMDVUNDQzIDE3OVQ0NTUgMjc1UTQ1NSAzNDMgNDIyIDM3M1QzMjYgNDAzUTI4NSA0MDMgMjQ5IDM4OVQxNzAgMzM3TDEyMyAzNzRMMjEzIDY2N0g1NDZMNTM5IDYxM0gyNTZMMTg5IDM5OUwxOTIgMzk2UTIzMCA0MjUgMjYzIDQzOVQzNDQgNDU0UTQyOSA0NTQgNDc0IDQxM1Q1MTkgMjg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNiIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTUzMCAyNTVRNTMwIDIwNCA1MTQgMTU2VDQ2NSA3MVQzODYgMTJUMjc4IC0xMVExNzQgLTExIDEzMSAzOVQ4OCAxODZRODggMjA4IDkwIDIzMlQ5NiAyODNRMTA4IDM2OSAxMjggNDQxVDE4MyA1NjZUMjY5IDY0OFQzOTUgNjc4UTQzNCA2NzggNDcwIDY2OFQ1MzYgNjM4TDUwNCA1ODlRNDczIDYxMSA0NDcgNjE4VDM4NyA2MjVRMzQ1IDYyNSAzMTAgNjExVDI0NiA1NjJUMTk2IDQ3MFQxNjEgMzI2TDE2NSAzMjVRMjI5IDQyNCAzNTAgNDI0UTQzNyA0MjQgNDgzIDM4MFQ1MzAgMjU1Wk0yODYgNDBRMzMwIDQwIDM2NCA1N1Q0MjAgMTAyVDQ1NCAxNjhUNDY2IDI0OFE0NjYgMzcyIDMzMiAzNzJRMjkxIDM3MiAyNTggMzU2VDE5OSAzMTJUMTYxIDI0N1QxNDcgMTY5UTE0NyAxMDYgMTgzIDczVDI4NiA0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjciIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik01NzIgNjA5UTQ5OSA1NTIgNDUyIDQ5OFQzNzUgMzgyVDMyNiAyNDVUMjk1IDczTDI4NSAwSDIyMUwyMjUgMjlRMjM1IDEwMiAyNTAgMTgxVDI5NCAzMzdUMzczIDQ4NFQ1MDEgNjEwTDUwMiA2MTNIMTU0TDE2MSA2NjdINTY5TDU3MiA2MDlINTcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOCIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTUyNCAyMjFRNTI0IDExNSA0NjEgNTJUMjc1IC0xMVExNzQgLTExIDEyNyAyOFQ4MCAxNDVRODAgMTgxIDg3IDIxNFQxMTIgMjc1VDE1NSAzMjNUMjIwIDM1NlYzNjBRMTgwIDM3NSAxNjIgNDA2VDE0MyA0NzlRMTQzIDU3MyAyMDEgNjI1VDM3MSA2NzhRNDYwIDY3OCA1MDUgNjQ0VDU1MSA1NDBRNTUxIDQ3NyA1MjEgNDMwVDQzMSAzNjBWMzU2UTQ3OSAzNDIgNTAxIDMwN1Q1MjQgMjIxWk0zMjkgMzgxUTM2NCAzODEgMzkzIDM5MFQ0NDQgNDE3VDQ3NyA0NjVUNDg5IDUzM1E0ODkgNTgyIDQ1OSA2MDRUMzY0IDYyN1EyODggNjI3IDI0NyA1OTJUMjA2IDQ3OVEyMDYgNDMwIDIzNiA0MDZUMzI5IDM4MVpNMjgxIDM5UTQ2MyAzOSA0NjMgMjIwUTQ2MyAyNDUgNDU2IDI2NlQ0MzMgMzAyVDM4OSAzMjVUMzIyIDMzM1EyMzQgMzMzIDE4OCAyODdUMTQyIDE0N1ExNDIgOTAgMTc2IDY1VDI4MSAzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjkiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik01NDYgMzUwUTUzMiAyNTIgNTA4IDE4M1Q0NDkgNzFUMzY1IDlUMjU1IC0xMVEyMTEgLTExIDE2OSAyVDk1IDQzTDEzMiA4OFExNjIgNjMgMTkxIDUyVDI2MiA0MFEzMDcgNDAgMzQyIDU0VDQwNiAxMDNUNDU0IDIwMFQ0ODggMzU3SDQ4NFE0NTYgMzAzIDQwOCAyNzRUMzAzIDI0NFEyMTUgMjQ0IDE2NyAyOTFUMTE4IDQyMFExMTggNDc1IDEzNiA1MjJUMTg3IDYwNFQyNjYgNjU4VDM3MCA2NzhRNDYyIDY3OCA1MDggNjI4VDU1NSA0NjNRNTU1IDQxMyA1NDYgMzUwWk0zMTYgMjk2UTM1OCAyOTYgMzkxIDMxMlQ0NDYgMzU1VDQ3OSA0MTdUNDkxIDQ5M1E0OTEgNTU4IDQ1NyA1OTJUMzYyIDYyNlEzMjUgNjI2IDI5MiA2MTRUMjM1IDU3NlQxOTYgNTEzVDE4MiA0MjVRMTgyIDM2NCAyMTYgMzMwVDMxNiAyOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI6IiBob3Jpei1hZHYteD0iMTg0IiBkPSJNMTk3IDQxMlExOTcgMzg2IDE4MyAzNzBUMTQyIDM1M1ExMjMgMzUzIDExMiAzNjNUMTAwIDM5M1ExMDAgNDE5IDExNSA0MzRUMTU2IDQ0OVExNzUgNDQ5IDE4NiA0NDBUMTk3IDQxMlpNMTQ2IDQ3UTE0NiAyMiAxMzIgNlQ5MSAtMTBRNzIgLTEwIDYxIC0xVDQ5IDI5UTQ5IDU1IDYzIDcwVDEwNCA4NVExMjMgODUgMTM0IDc2VDE0NiA0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjsiIGhvcml6LWFkdi14PSIxODQiIGQ9Ik01NSAtMTEySDE0TDczIDg1SDE1MUw1NSAtMTEyWk0yMDcgNDEwUTIwNyAzODUgMTkyIDM2OVQxNTEgMzUyUTEzMiAzNTIgMTIxIDM2MlQxMDkgMzkyUTEwOSA0MTggMTIzIDQzM1QxNjQgNDQ4UTE4MyA0NDggMTk1IDQzOVQyMDcgNDEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmx0OyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTg2IDIzMEw5NCAyODVMNTcwIDUwMEw1NjIgNDQ1TDE0NSAyNThMNTEwIDc0TDUwMiAyMEw4NiAyMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI9IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNOTggMzEyTDEwNiAzNjZINTUxTDU0MyAzMTJIOThaTTc1IDE0N0w4MyAyMDFINTI4TDUyMCAxNDdINzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImZ3Q7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNTYgMjBMNjQgNzRMNDgwIDI1OEwxMTYgNDQ1TDEyNCA1MDBMNTQwIDI4NUw1MzIgMjMwTDU2IDIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPyIgaG9yaXotYWR2LXg9IjQ5OSIgZD0iTTUxNyA1MzdRNTE3IDQ3OSA0OTkgNDQzVDQ1MiAzODRUMzkwIDM0NlQzMjYgMzE4VDI3NSAyODVUMjQ5IDIzNEwyMzkgMTYxSDE3OEwxOTAgMjQzUTE5NiAyODQgMjE4IDMwOFQyNjkgMzQ3VDMzMCAzNzRUMzkwIDQwNFQ0MzUgNDUwVDQ1MyA1MjhRNDUzIDU1NSA0NDMgNTc0VDQxNiA2MDRUMzc2IDYyMVQzMzAgNjI2UTI4MyA2MjYgMjQyIDYwOVQxNjMgNTY2TDEzOSA2MTJRMTg2IDY0MiAyMzYgNjYwVDM0MyA2NzhRMzc2IDY3OCA0MDcgNjcwVDQ2MyA2NDVUNTAyIDYwMVQ1MTcgNTM3Wk0yMzggNDZRMjM4IDIyIDIyNCA2VDE4NCAtMTBRMTY3IC0xMCAxNTUgLTFUMTQzIDI3UTE0MyA1MiAxNTcgNjdUMTk3IDgzUTIxNSA4MyAyMjYgNzRUMjM4IDQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQCIgaG9yaXotYWR2LXg9IjgwNyIgZD0iTTc3NyAzMzBRNzc3IDI4NSA3NjQgMjM0VDcyNSAxNDBUNjYxIDY5VDU3MiA0MVE1NDYgNDEgNTMxIDU3VDUxNSAxMDBINTExUTQ4NSA2OCA0NDcgNTFUMzY3IDM0UTMxMyAzNCAyODcgNjRUMjYwIDE0OFEyNjAgMTkzIDI3NSAyMzlUMzE3IDMyMlQzODQgMzgyVDQ3NCA0MDZRNTAxIDQwNiA1MjQgMzk3VDU2MSAzNjFINTY1TDU3NyAzOTlINjM0UTYzMiAzOTAgNjI1IDM2N1Q2MTAgMzEzVDU5MiAyNTBUNTc1IDE4OFQ1NjIgMTM4VDU1NyAxMTJRNTU3IDk3IDU2NiA4OVQ1OTAgODFRNjI2IDgxIDY1MyAxMDZUNjk5IDE2OFQ3MjcgMjQ3VDczNyAzMjNRNzM3IDM3NSA3MjAgNDE0VDY3MSA0ODBUNTk4IDUyMFQ1MDYgNTM0UTQyNSA1MzQgMzU4IDUwNFQyNDIgNDIyVDE2NiAzMDFUMTM5IDE1M1ExMzkgMzkgMjAzIC0yM1QzODEgLTg2UTQzOCAtODYgNDkwIC03MlQ1OTAgLTI4TDYwNSAtNjBRNTUyIC05MyA0OTMgLTEwN1QzNzIgLTEyMVEyNDEgLTEyMSAxNjkgLTUxVDk3IDE1MVE5NyAyMzkgMTI4IDMxNVQyMTQgNDQ3VDM0NCA1MzZUNTA5IDU2OVE1NjQgNTY5IDYxMyA1NTRUNjk4IDUwOVQ3NTYgNDM0VDc3NyAzMzBaTTM5MCA3NlE0NDIgNzYgNDczIDEwN1Q1MjIgMTkwUTUzMSAyMTcgNTQwIDI0NlQ1NDkgMzA0UTU0OSAzMzkgNTI2IDM1MVQ0NzIgMzY0UTQzMiAzNjQgNDAzIDM0NVQzNTMgMjk1VDMyMyAyMjdUMzEzIDE1NlEzMTMgMTE4IDMzMiA5N1QzOTAgNzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJBIiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDgyIDE3MUgxNzdMOTMgMEgyOEwzNjIgNjcxSDQzN0w1ODUgMEg1MThaTTM5MSA2MTFIMzg5TDE5OSAyMjVINDcxTDM5MSA2MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJCIiBob3Jpei1hZHYteD0iNjIwIiBkPSJNNTgzIDIwOVE1ODMgMTU3IDU2NiAxMThUNTE4IDUzVDQ0MyAxM1QzNDYgMEg5MkwxODUgNjY0UTIxOSA2NjggMjczIDY3MVQzODAgNjc1UTQxNyA2NzUgNDU2IDY3MlQ1MjcgNjU1VDU3OSA2MTNUNjAwIDUzNVE2MDAgNDY1IDU2OCA0MjFUNDczIDM1NFYzNTBRNTI2IDM0MSA1NTQgMzA0VDU4MyAyMDlaTTM0NCAzNzJRMzgzIDM3MiA0MTggMzc3VDQ3OSAzOTlUNTIwIDQ0NlQ1MzUgNTI0UTUzNSA1NTYgNTIyIDU3NlQ0ODcgNjA2VDQzNiA2MjBUMzczIDYyNFEzNDUgNjI0IDMxMiA2MjNUMjQxIDYxN0wyMDcgMzczUTIzOSAzNzIgMjc1IDM3MlQzNDQgMzcyWk0zMDAgNTBRMzQyIDUwIDM4MSA1NFQ0NTEgNzRUNDk5IDEyM1Q1MTggMjEzUTUxOCAyNTMgNTAyIDI3NVQ0NTkgMzA4VDQwMCAzMjFUMzMyIDMyM1EzMDggMzIzIDI5MSAzMjNUMjU5IDMyM1QyMzAgMzIzVDIwMCAzMjFMMTYyIDUyUTE5OCA1MCAyMzAgNTBUMzAwIDUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgaG9yaXotYWR2LXg9IjYxNCIgZD0iTTU5MCA3NlE1MjkgMjggNDcyIDlUMzUyIC0xMVEyMzEgLTExIDE3MCA1N1QxMDkgMjUxUTEwOSAzMjggMTI5IDQwNFQxOTMgNTQxVDMwMSA2NDBUNDU2IDY3OFE1MTYgNjc4IDU2NCA2NThUNjU4IDU5Nkw2MTQgNTUyUTU3NCA1OTAgNTM2IDYwN1Q0NDkgNjI1UTM3NyA2MjUgMzI2IDU5M1QyNDEgNTA4VDE5MiAzOTFUMTc2IDI1OVExNzYgMjE2IDE4NSAxNzdUMjE1IDEwN1QyNzMgNjBUMzY0IDQyUTQxMCA0MiA0NjAgNjBUNTYxIDEyMEw1OTAgNzZINTkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRCIgaG9yaXotYWR2LXg9IjY1MCIgZD0iTTYzMyA0MTJRNjMzIDMzMyA2MTIgMjU5VDU0OCAxMjdUNDM5IDM1VDI4MiAwSDkyTDE4NSA2NjRRMjIzIDY2OSAyNzAgNjcyVDM3MyA2NzVRNDQwIDY3NSA0ODkgNjU2VDU3MCA2MDNUNjE3IDUyMFQ2MzMgNDEyWk0yNzQgNTNRMzUyIDUzIDQwNyA4MFQ0OTggMTU2VDU1MCAyNjhUNTY3IDQwN1E1NjcgNDQ4IDU1OCA0ODdUNTI2IDU1NlQ0NjUgNjA0VDM2NyA2MjNRMzM1IDYyMyAzMDMgNjIxVDI0MSA2MTZMMTYyIDUzSDI3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkUiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwTDE4NSA2NjdINTU1TDU0OCA2MTJIMjQxTDIwOSAzODVINDg3TDQ3OSAzMzBIMjAxTDE2MiA1NEg0ODBMNDczIDBIOTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJGIiBob3Jpei1hZHYteD0iNDg1IiBkPSJNMjQxIDYxMkwyMDggMzgxSDQ3OEw0NzAgMzI2SDIwMEwxNTUgMEg5MkwxODUgNjY3SDU0OEw1NDEgNjEySDI0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkciIGhvcml6LWFkdi14PSI2NzkiIGQ9Ik0zNjUgNDBRNDE0IDQwIDQ1MSA1NFQ1MTYgOTVUNTYwIDE1NlQ1ODMgMjM0TDU5MSAyODdINDA4TDQxNSAzNDBINjU3TDY0NiAyNjJRNjI2IDEyNCA1NTEgNTdUMzU1IC0xMFEyODcgLTEwIDI0MSAxMVQxNjUgNjhUMTIyIDE1M1QxMDkgMjU2UTEwOSAzMzIgMTMwIDQwN1QxOTUgNTQzVDMwNCA2NDBUNDU5IDY3OFE1MjQgNjc4IDU3MiA2NTZUNjU4IDU5OUw2MTYgNTU1UTU3NCA1OTMgNTM1IDYwOVQ0NTIgNjI1UTM3OCA2MjUgMzI2IDU5M1QyNDAgNTA4VDE5MSAzOTBUMTc1IDI1NlExNzUgMjEzIDE4NCAxNzRUMjE0IDEwNVQyNzIgNThUMzY1IDQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSCIgaG9yaXotYWR2LXg9IjY0NSIgZD0iTTQ5MCAwTDUzNiAzMzFIMjAxTDE1NSAwSDkyTDE4NSA2NjdIMjQ4TDIwOSAzODhINTQ0TDU4MyA2NjdINjQ2TDU1MyAwSDQ5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwTDE4NSA2NjdIMjQ4TDE1NSAwSDkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSiIgaG9yaXotYWR2LXg9IjQyNSIgZD0iTTM1NCAxNTFRMzQyIDY2IDI5NSAyOFQxNzUgLTExUTEzOSAtMTEgMTA4IC0yVDQ4IDMwTDgxIDgxUTEwNiA1OSAxMjcgNTFUMTc1IDQyUTIzMCA0MiAyNTYgNzBUMjkxIDE1NkwzNjMgNjY3SDQyNkwzNTQgMTUxSDM1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IksiIGhvcml6LWFkdi14PSI1NDUiIGQ9Ik00NDYgMEwyODAgMzQzTDE5MCAyNTJMMTU1IDBIOTJMMTg1IDY2N0gyNDhMMjAxIDMzM0gyMDVMNTIxIDY2N0g1OThMMzMzIDM4OEw1MjIgMEg0NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJMIiBob3Jpei1hZHYteD0iNDczIiBkPSJNOTIgMEwxODUgNjY3SDI0OEwxNjIgNTVINDQzTDQzNiAwSDkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTSIgaG9yaXotYWR2LXg9Ijc1MCIgZD0iTTU5NiAwTDY3NCA1NTlINjcwTDQwNSAyMTRMMjM2IDU1OEgyMzJMMTU0IDBIOTJMMTg1IDY2N0gyNDlMNDE5IDMxNUw2ODggNjY3SDc1MUw2NTggMEg1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBob3Jpei1hZHYteD0iNjg0IiBkPSJNNTMwIDBMMjM2IDU2MEgyMzJMMTU0IDBIOTJMMTg1IDY2N0gyNTJMNTQxIDExMEg1NDVMNjIzIDY2N0g2ODVMNTkyIDBINTMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTcxNSA0MTJRNzE1IDMzMSA2OTQgMjU1VDYzMCAxMjBUNTIwIDI1VDM2NCAtMTFRMjM2IC0xMSAxNzMgNjFUMTA5IDI1NlExMDkgMzM3IDEzMCA0MTNUMTk1IDU0OFQzMDUgNjQyVDQ2MSA2NzhRNTg4IDY3OCA2NTEgNjA3VDcxNSA0MTJaTTM3MSA0MVE0NDcgNDEgNTAwIDc0VDU4NiAxNjFUNjM0IDI4MFQ2NDkgNDExUTY0OSA0NTkgNjM4IDQ5OVQ2MDQgNTY3VDU0MyA2MTFUNDU0IDYyN1EzNzggNjI3IDMyNSA1OTRUMjM5IDUwOVQxOTEgMzkxVDE3NiAyNjBRMTc2IDIxMiAxODcgMTcyVDIyMSAxMDJUMjgyIDU3VDM3MSA0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGhvcml6LWFkdi14PSI1ODUiIGQ9Ik01OTYgNTE2UTU5NiAzOTYgNTM2IDMzMFQzNTEgMjYzSDE5MUwxNTUgMEg5MkwxODUgNjY0UTIzNiA2NjkgMjgzIDY3MlQzODAgNjc1UTQyOSA2NzUgNDY5IDY2OFQ1MzcgNjQyVDU4MCA1OTNUNTk2IDUxNlpNMzM5IDMxNVE0MzcgMzE1IDQ4NCAzNTlUNTMxIDUwN1E1MzEgNTc0IDQ5MSA1OThUMzcyIDYyM1EzMzcgNjIzIDMwNyA2MjFUMjQxIDYxNUwxOTkgMzE1SDMzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlEiIGhvcml6LWFkdi14PSI3MzIiIGQ9Ik03MTUgNDE1UTcxNSAzNTkgNzA1IDMwMlQ2NzEgMTkyVDYxMCA5NlQ1MTggMjhWMjRRNTMzIDE5IDU0NiAxMFQ1NzIgLThUNjAxIC0yNVQ2MzUgLTM4TDYxMSAtODlRNTg0IC04NSA1NjEgLTcyVDUxNyAtNDRUNDc2IC0xOVQ0MzcgLTdRNDIzIC03IDQwNCAtOVQzNjQgLTExUTIzNSAtMTEgMTcyIDU5VDEwOSAyNTVRMTA5IDMzNiAxMzAgNDEyVDE5NCA1NDhUMzA0IDY0MlQ0NjEgNjc4UTU4OSA2NzggNjUyIDYwOVQ3MTUgNDE1Wk0zNzEgNDFRNDQ3IDQxIDUwMCA3NFQ1ODYgMTYwVDYzNCAyNzlUNjQ5IDQxMVE2NDkgNDYwIDYzOCA0OTlUNjAzIDU2N1Q1NDIgNjEwVDQ1MyA2MjZRMzc3IDYyNiAzMjQgNTk0VDIzOCA1MDlUMTkxIDM5MVQxNzYgMjU5UTE3NiAyMTAgMTg3IDE3MFQyMjEgMTAyVDI4MiA1N1QzNzEgNDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJSIiBob3Jpei1hZHYteD0iNTgxIiBkPSJNNDU5IDBMNDA5IDI0NlE0MDQgMjczIDM5MCAyODJUMzQ4IDI5MkgxOTZMMTU1IDBIOTJMMTg1IDY2NFEyMzIgNjY5IDI3NyA2NzJUMzcwIDY3NVE0MDkgNjc1IDQ0NiA2NjlUNTE0IDY0NlQ1NjIgNTk5VDU4MSA1MjNRNTgxIDQ1MCA1NDggMzkzVDQ0MiAzMTJWMzA4UTQ1MyAzMDIgNDYwIDI5MFQ0NzAgMjY1TDUyNiAwSDQ1OVpNMzQ1IDM0NFE0MzAgMzQ0IDQ3MiAzODRUNTE1IDUxMlE1MTUgNTQ3IDUwMyA1NjhUNDY5IDYwMlQ0MjEgNjE4VDM2NCA2MjNRMzMzIDYyMyAzMDMgNjIyVDI0MSA2MTVMMjAzIDM0NEgzNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBob3Jpei1hZHYteD0iNTA2IiBkPSJNNDgxIDIwMVE0ODEgMTUwIDQ2NCAxMTFUNDE2IDQ0VDM0MyAzVDI1MCAtMTFRMTkyIC0xMSAxNDIgNVQ0NSA1N0w4MiAxMDdRMTE4IDc1IDE2MCA1OFQyNTEgNDBRMjg3IDQwIDMxNyA0OVQzNjkgNzdUNDAzIDEyNFQ0MTYgMTg5UTQxNiAyMjYgMzk1IDI1MVQzNDEgMjk1VDI3MSAzMzFUMjAxIDM3MVQxNDggNDI0VDEyNiA1MDBRMTI2IDU0NiAxNDQgNTgwVDE5MiA2MzVUMjYxIDY2N1QzNDMgNjc4UTM5MyA2NzggNDM3IDY2M1Q1MjIgNjE4TDQ5MCA1NjVRNDIzIDYyNiAzMzQgNjI2UTMwNiA2MjYgMjgxIDYyMFQyMzYgNTk5VDIwNSA1NjNUMTkzIDUxMVExOTMgNDc2IDIxNCA0NTNUMjY4IDQxMVQzMzcgMzc2VDQwNiAzMzZUNDU5IDI4MVQ0ODEgMjAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVCIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTM1OCA2MTJMMjcyIDBIMjA5TDI5NSA2MTJIMTA3TDExNCA2NjdINTU0TDU0NyA2MTJIMzU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVSIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU5NSAyNTVRNTc1IDExNCA1MDkgNTJUMzIzIC0xMVEyMjAgLTExIDE3MSAzNFQxMjEgMTc5UTEyMSAyMTMgMTI3IDI1NUwxODUgNjY3SDI0OEwxODkgMjQyUTE4NyAyMjcgMTg2IDIxM1QxODUgMTg2UTE4NSAxMjAgMjE3IDgxVDMzMSA0MlEzNzkgNDIgNDE0IDU2VDQ3MyA5N1Q1MTEgMTYwVDUzMSAyNDJMNTkwIDY2N0g2NTNMNTk1IDI1NUg1OTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJWIiBob3Jpei1hZHYteD0iNTQ1IiBkPSJNMzA5IDBIMjM0TDExOCA2NjdIMTg2TDI3OSA2NUgyODNMNTQ2IDY2N0g2MTNMMzA5IDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJXIiBob3Jpei1hZHYteD0iODY5IiBkPSJNNjczIDBINTk0TDUxNSA1NzFINTExTDI3NiAwSDE5MkwxMjcgNjY3SDE5NkwyNDUgNjhIMjQ5TDQ5NiA2NjdINTU5TDY0MSA2OEg2NDVMODYxIDY2N0g5MjhMNjczIDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJYIiBob3Jpei1hZHYteD0iNTE5IiBkPSJNNDI3IDBMMzAxIDI5MUgyOTdMOTIgMEgyMEwyNzIgMzQ1TDEzOCA2NjdIMjEwTDMxNiAzOTNIMzIwTDUwOSA2NjdINTgxTDM0OCAzMzlMNDk5IDBINDI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWSIgaG9yaXotYWR2LXg9IjUzMyIgZD0iTTMzNiAyNjdMMjk5IDBIMjM1TDI3MiAyNjRMMTExIDY2N0gxODFMMzEyIDMyM0w1MzkgNjY3SDYwOEwzMzYgMjY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWiIgaG9yaXotYWR2LXg9IjUzMiIgZD0iTTQ3IDBMNTQgNTVMNDkzIDYxMkgxNDhMMTU1IDY2N0g1NzBMNTYzIDYxM0wxMjIgNTRINDkyTDQ4NSAwSDQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWyIgaG9yaXotYWR2LXg9IjI3OCIgZD0iTTY0IC05NEwxODMgNzUxSDMzN0wzMzEgNzA4SDIzNEwxMjcgLTUwSDIyNEwyMTggLTk0SDY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgaG9yaXotYWR2LXg9IjQ3OSIgZD0iTTM4MiAtMTE1TDExMiA2NjdIMTcxTDQ0MSAtMTE1SDM4MloiICAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGhvcml6LWFkdi14PSIyNzgiIGQ9Ik0zMiAtOTRMMzggLTUwSDEzNUwyNDIgNzA4SDE0NUwxNTEgNzUxSDMwNUwxODYgLTk0SDMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXiIgaG9yaXotYWR2LXg9IjMzMSIgZD0iTTM1NyA1MjZMMjQ4IDYwM0wxMTMgNTI2TDg0IDU1OUwyNTYgNjYwTDQwMCA1NTlMMzU3IDUyNloiICAvPgorPGdseXBoIHVuaWNvZGU9Il8iIGhvcml6LWFkdi14PSI0ODQiIGQ9Ik0tMjYgLTEzMEwtMTkgLTg1SDQ4MEw0NzMgLTEzMEgtMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJgIiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMzIyIDU2NUwxNzUgNjY5TDIzOSA3MDFMMzU2IDU4N0wzMjIgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYSIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQyNCA4Mkg0MjBRMzg5IDM2IDM0OCAxM1QyNTIgLTExUTIwNiAtMTEgMTc1IDNUMTI0IDQzVDk2IDEwMlQ4NyAxNzdRODcgMjI5IDk3IDI4OFQxMzQgMzk3VDIwNyA0ODFUMzI3IDUxNVEzNzQgNTE1IDQwOCA0OTlUNDY2IDQzOEg0NzBMNDg0IDUwMkg1MzlMNDY4IDBINDE3Wk00NTUgMzMxUTQ2NSAzOTggNDI5IDQzMlQzMzEgNDY3UTI3NCA0NjcgMjM5IDQ0MFQxODMgMzcyVDE1NiAyODBUMTQ5IDE4NFExNDkgMTU1IDE1NCAxMjhUMTc0IDgxVDIxMSA0OFQyNzEgMzVRMzA1IDM1IDMzMyA0OFQzODMgODNUNDE4IDEzNVQ0MzYgMTk3TDQ1NSAzMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNTMzIDMyOVE1MzMgMjc1IDUyMiAyMTVUNDgyIDEwNVQ0MDkgMjJUMjk1IC0xMVEyMzcgLTExIDIwMiAxM1QxNTIgODNIMTQ4TDEyNiAwSDgyTDE4MCA3MDBIMjM5TDIwMiA0MzdIMjA2UTIzNSA0ODEgMjc4IDQ5OFQzNjcgNTE1UTQxNSA1MTUgNDQ3IDUwMVQ0OTggNDYxVDUyNSA0MDJUNTMzIDMyOVpNMjg4IDM1UTM0MiAzNSAzNzcgNjNUNDM0IDEzNVQ0NjMgMjMwVDQ3MiAzMjdRNDcyIDM1NSA0NjcgMzgwVDQ0OCA0MjVUNDEwIDQ1NlQzNDkgNDY3UTI4NiA0NjcgMjQyIDQzM1QxODcgMzMxTDE2OCAxOTdRMTY3IDE4OSAxNjcgMTgyVDE2NiAxNjdRMTY2IDEzOSAxNzMgMTE1VDE5NiA3M1QyMzQgNDVUMjg4IDM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTQ3OSA0MTFRNDU2IDQzNyA0MjQgNDUxVDM1MCA0NjZRMjk3IDQ2NiAyNTkgNDQyVDE5NyAzODBUMTYyIDI5NFQxNTAgMTk4UTE1MCAxNjYgMTU3IDEzN1QxODAgODZUMjIzIDUxVDI5MCAzOFEzMzEgMzggMzY1IDUxVDQzNyA5NEw0NTMgNTBRNDEzIDIxIDM3MiA1VDI4MCAtMTFRMjMwIC0xMSAxOTQgNFQxMzQgNDdUOTkgMTExVDg4IDE5M1E4OCAyNDggMTAzIDMwNVQxNTAgNDA5VDIzMyA0ODVUMzU1IDUxNVE0MDIgNTE1IDQ0MSA0OTlUNTEyIDQ1Nkw0NzkgNDExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZCIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQyNCA4Mkg0MjBRMzg5IDM2IDM0OCAxM1QyNTIgLTExUTIwNiAtMTEgMTc1IDNUMTI0IDQzVDk2IDEwMlQ4NyAxNzdRODcgMjI5IDk3IDI4OFQxMzQgMzk3VDIwNyA0ODFUMzI3IDUxNVEzNzQgNTE1IDQwOCA0OTlUNDY2IDQzOEg0NzBMNTA3IDcwMEg1NjZMNDY4IDBINDE3Wk00NTUgMzMxUTQ2NSAzOTggNDI5IDQzMlQzMzEgNDY3UTI3NCA0NjcgMjM5IDQ0MFQxODMgMzcyVDE1NiAyODBUMTQ5IDE4NFExNDkgMTU1IDE1NCAxMjhUMTc0IDgxVDIxMSA0OFQyNzEgMzVRMzA1IDM1IDMzMyA0OFQzODMgODNUNDE4IDEzNVQ0MzYgMTk3TDQ1NSAzMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJlIiBob3Jpei1hZHYteD0iNTI3IiBkPSJNNTE0IDMyNlE1MTQgMzAzIDUxMiAyNzlUNTA0IDIzMkgxNTBRMTQ3IDIwOCAxNDcgMTg2UTE0NyAxMTYgMTgxIDc2VDI4NiAzNlEzMjEgMzYgMzU4IDQ4VDQ0MyA5M0w0NjAgNTBRNDEyIDE2IDM2NyAzVDI3NyAtMTFRMTgyIC0xMSAxMzUgNDFUODggMTg4UTg4IDI0MyAxMDIgMzAxVDE0OCA0MDZUMjI4IDQ4NFQzNDkgNTE1UTQzMSA1MTUgNDcyIDQ2M1Q1MTQgMzI2Wk00NTQgMjc2UTQ1NiAyODggNDU3IDMwMFQ0NTggMzI0UTQ1OCAzNTQgNDUyIDM4MFQ0MzIgNDI3VDM5NiA0NThUMzQzIDQ3MFEyOTYgNDcwIDI2MyA0NTJUMjA4IDQwNlQxNzQgMzQ0VDE1NyAyNzZINDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZiIgaG9yaXotYWR2LXg9IjI5NiIgZD0iTTM3MSA2NTJRMzYwIDY1NSAzNTEgNjU2VDMyOSA2NThRMzA1IDY1OCAyOTEgNjU1VDI2OCA2NDNUMjU1IDYyMVQyNDggNTg0TDIzNiA1MDJIMzQzTDMzNiA0NTNIMjMwTDE2NyAwSDEwN0wxNzAgNDUySDkzTDEwMCA1MDJIMTc3TDE4OCA1ODNRMTkyIDYxNCAyMDAgNjM3VDIyMyA2NzVUMjYyIDY5N1QzMjYgNzA1UTMzOCA3MDUgMzUxIDcwNFQzNzggNzAwTDM3MSA2NTJIMzcxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTQ1NyAtNjVRNDQ5IC0xMjIgNDMwIC0xNTRUMzg1IC0yMDJUMzI4IC0yMjJUMjY1IC0yMjZRMjAyIC0yMjYgMTU1IC0yMTRUNjUgLTE3OEw5NCAtMTI4UTEzMiAtMTUzIDE3MyAtMTY1VDI2MyAtMTc4UTI5NiAtMTc4IDMxOSAtMTczVDM1OSAtMTU1VDM4NCAtMTIwVDM5OSAtNjRMNDE5IDgzSDQxNVEzODMgMzQgMzQ1IDE0VDI1NyAtN1EyMTAgLTcgMTc4IDdUMTI2IDQ1VDk2IDEwNFQ4NyAxNzlRODcgMjMwIDk3IDI4OVQxMzUgMzk4VDIwOCA0ODJUMzI3IDUxNVEzNzggNTE1IDQxMyA0OThUNDY5IDQzM0g0NzNMNDg3IDUwMkg1MzdMNDU3IC02NVpNNDU0IDMzMlE0NjQgMzk5IDQyOSA0MzNUMzMwIDQ2N1EyNzUgNDY3IDI0MCA0NDBUMTg1IDM3MlQxNTcgMjgxVDE0OSAxODhRMTQ5IDE1NiAxNTUgMTI5VDE3NiA4MlQyMTMgNTFUMjcyIDM5UTMwNiAzOSAzMzQgNTJUMzgzIDg2VDQxNyAxMzdUNDM1IDE5OUw0NTQgMzMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaCIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTQwNyAwTDQ0OSAzMDFRNDUyIDMyMSA0NTQgMzM5VDQ1NiAzNzNRNDU2IDM5NCA0NTIgNDEwVDQzNiA0MzlUNDA0IDQ1N1QzNTMgNDYzUTI4MiA0NjMgMjM5IDQyN1QxODYgMzIzTDE0MSAwSDgyTDE4MCA3MDBIMjM5TDIwMSA0MzRIMjA1UTIzMCA0NzQgMjcyIDQ5NFQzNzIgNTE1UTQxMyA1MTUgNDQwIDUwN1Q0ODUgNDgyVDUwOSA0NDFUNTE2IDM4NVE1MTYgMzcxIDUxNCAzNTRUNTEwIDMxOEw0NjYgMEg0MDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJpIiBob3Jpei1hZHYteD0iMjIzIiBkPSJNODIgMEwxNTIgNTAySDIxMUwxNDEgMEg4MlpNMjM4IDYzMFEyMzggNjEwIDIyNiA1OTdUMTkzIDU4NFExNzggNTg0IDE2OSA1OTNUMTU5IDYxN1ExNTkgNjM3IDE3MSA2NDlUMjA0IDY2MlEyMzggNjYyIDIzOCA2MzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJqIiBob3Jpei1hZHYteD0iMjI5IiBkPSJNMTM4IC01N1ExMjcgLTEzNyA4OCAtMTgxVC0zNSAtMjI2US01MCAtMjI2IC02NSAtMjI1VC05NCAtMjIyTC04NyAtMTcxUS02MCAtMTc0IC0zOSAtMTc0US03IC0xNzQgMTQgLTE2NlQ0OCAtMTQxVDY5IC0xMDFUODAgLTQ3TDE1NyA1MDJIMjE2TDEzOCAtNTdaTTI0MyA2MzBRMjQzIDYxMCAyMzEgNTk3VDE5OCA1ODRRMTgzIDU4NCAxNzQgNTkzVDE2NCA2MTdRMTY0IDYzNyAxNzYgNjQ5VDIwOSA2NjJRMjQzIDY2MiAyNDMgNjMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iayIgaG9yaXotYWR2LXg9IjQ3NyIgZD0iTTM3OSAwTDI2NSAyNjRMMTYzIDE2MkwxNDEgMEg4MkwxODAgNzAwSDIzOUwxNzQgMjM3SDE3OEw0MjggNTAySDUwNEwzMTMgMzA1TDQ1MSAwSDM3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImwiIGhvcml6LWFkdi14PSIyNTEiIGQ9Ik0yMjIgMFEyMTMgLTIgMTk5IC0zVDE3MSAtNVExMjQgLTUgMTA1IDE1VDk0IDkxTDE4MCA3MDBIMjM5TDE1NiAxMDdRMTUzIDg2IDE1NCA3NFQxNjIgNTdUMTc5IDUwVDIwNiA0OUgyMjhMMjIyIDBIMjIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgaG9yaXotYWR2LXg9IjgyMiIgZD0iTTY4MSAwTDcyNCAzMTNRNzI2IDMyOSA3MjcgMzQ0VDcyOSAzNzNRNzI5IDM5MyA3MjUgNDA5VDcxMSA0MzhUNjgyIDQ1NlQ2MzcgNDYzUTUwNSA0NjMgNDg3IDMzM0w0NDEgMEgzODJMNDI2IDMxOFE0MjggMzMyIDQyOSAzNDZUNDMwIDM3MlE0MzAgNDE0IDQxMCA0MzhUMzM0IDQ2M1EzMDMgNDYzIDI3OCA0NTJUMjMzIDQyMlQyMDIgMzc5VDE4NyAzMjlMMTQxIDBIODJMMTUyIDUwMkgyMDNMMjAxIDQzN0gyMDVRMjMyIDQ3NiAyNzAgNDk1VDM1NCA1MTVRNDAyIDUxNSA0MzYgNDk3VDQ4MiA0MzJRNTEyIDQ3NyA1NTQgNDk2VDY0NSA1MTVRNjg2IDUxNSA3MTMgNTA2VDc1OCA0NzlUNzgyIDQzN1Q3ODkgMzgxUTc4OSAzNjcgNzg4IDM1MlQ3ODQgMzE5TDc0MCAwSDY4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9Im4iIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik00MDcgMEw0NDkgMzAxUTQ1NSAzMzggNDU1IDM2OFE0NTUgMzkwIDQ1MSA0MDdUNDM0IDQzN1Q0MDIgNDU2VDM1MSA0NjNRMjgwIDQ2MyAyMzggNDI2VDE4NiAzMjNMMTQxIDBIODJMMTUyIDUwMkgyMDNMMjAwIDQzN0gyMDRRMjY0IDUxNSAzNjkgNTE1UTQxMSA1MTUgNDM5IDUwN1Q0ODQgNDgyVDUwOSA0NDJUNTE2IDM4N1E1MTYgMzU2IDUxMCAzMTlMNDY2IDBINDA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTg4IDE5MFE4OCAyNTEgMTAzIDMwOVQxNTEgNDEzVDIzMyA0ODdUMzUxIDUxNVEzOTkgNTE1IDQzNSA1MDFUNDk0IDQ1OVQ1MjggMzk1VDU0MCAzMTFRNTQwIDI1MCA1MjUgMTkyVDQ3NyA4OVQzOTUgMTdUMjc3IC0xMVExODEgLTExIDEzNSA0M1Q4OCAxOTBaTTM0NCA0NjdRMjg4IDQ2NyAyNTEgNDQxVDE5MiAzNzVUMTYwIDI4NVQxNTAgMTg5UTE1MCAxNTUgMTU3IDEyN1QxODEgNzlUMjIyIDQ3VDI4NSAzNlEzNDAgMzYgMzc3IDYyVDQzNyAxMjhUNDY4IDIxN1Q0NzggMzEyUTQ3OCAzNDYgNDcxIDM3NFQ0NDggNDIzVDQwNyA0NTVUMzQ0IDQ2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9InAiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik01MzIgMzI4UTUzMiAyNzQgNTIwIDIxNFQ0ODAgMTA0VDQwNiAyMlQyOTAgLTExUTIzNiAtMTEgMjA0IDEyVDE1NSA3NEgxNTFMMTEwIC0yMjBINTFMMTUyIDUwMkgyMDJMMTk5IDQzNkgyMDNRMjM1IDQ3OSAyNzUgNDk3VDM2NCA1MTVRNDEzIDUxNSA0NDUgNTAxVDQ5NiA0NjFUNTI0IDQwMVQ1MzIgMzI4Wk0yODUgMzVRMzQwIDM1IDM3NiA2M1Q0MzQgMTM1VDQ2MyAyMzFUNDcyIDMyOVE0NzIgMzU3IDQ2NyAzODJUNDQ3IDQyNlQ0MDkgNDU2VDM0NyA0NjdRMjg0IDQ2NyAyNDAgNDMyVDE4NyAzMzBMMTY4IDE5OFExNjYgMTkwIDE2NiAxODNUMTY2IDE2N1ExNjYgMTM5IDE3MyAxMTVUMTk1IDczVDIzMiA0NVQyODUgMzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJxIiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDQ0IC0yMzZRNDE0IC0yMjcgNDAwIC0yMTNUMzg2IC0xNjdRMzg2IC0xNTIgMzg5IC0xMzRMNDE4IDczSDQxNFEzODQgMzAgMzQ2IDEwVDI1NSAtMTFRMjA3IC0xMSAxNzUgNFQxMjQgNDRUOTYgMTA1VDg4IDE3OVE4OCAyMzIgOTggMjkxVDEzNiA0MDBUMjA5IDQ4MlQzMjcgNTE1UTM3MiA1MTUgNDEwIDQ5OFQ0NjkgNDM1SDQ3M0w0ODggNTAySDUzN0w0NTAgLTExOVE0NDcgLTEzNyA0NDcgLTE0OFE0NDcgLTE2MiA0NTMgLTE3MVQ0ODAgLTE4OUw0NDQgLTIzNlpNNDU0IDMzMVE0NjMgMzk2IDQyOSA0MzFUMzMxIDQ2N1EyNzUgNDY3IDI0MCA0NDBUMTg0IDM3MlQxNTcgMjgxVDE1MCAxODZRMTUwIDE1NiAxNTUgMTI5VDE3NSA4MVQyMTIgNDhUMjcyIDM1UTMwNiAzNSAzMzQgNDhUMzgzIDgzVDQxNyAxMzRUNDM1IDE5N0w0NTQgMzMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iciIgaG9yaXotYWR2LXg9IjM0MyIgZD0iTTM2NiA0NjFRMjkxIDQ2MSAyNDQgNDMyVDE4NyAzMzNMMTQxIDBIODJMMTUyIDUwMkgyMDJMMTk5IDQ0MEgyMDNRMjMyIDQ4MCAyNzQgNDk3VDM2OSA1MTRIMzkxTDM4MyA0NjFIMzY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icyIgaG9yaXotYWR2LXg9IjQyOCIgZD0iTTQwNCAxNTJRNDA0IDExMSAzODkgODFUMzQ3IDMwVDI4NyAtMVQyMTQgLTExUTE2NyAtMTEgMTI1IDBUNDQgMzhMNzMgODVRMTA0IDYyIDE0MyA0OVQyMjEgMzZRMjQ1IDM2IDI2NyA0MlQzMDcgNjFUMzM0IDkzVDM0NCAxNDBRMzQ0IDE2OSAzMjYgMTg2VDI4MiAyMTdUMjI0IDI0MVQxNjcgMjY4VDEyMiAzMDdUMTA0IDM2OFExMDQgNDA4IDEyMCA0MzZUMTYyIDQ4MVQyMjEgNTA3VDI5MCA1MTVRMzI4IDUxNSAzNjQgNTA1VDQzNSA0NzdMNDEwIDQyOVEzODMgNDQ3IDM1MCA0NTdUMjg0IDQ2N1EyNjIgNDY3IDI0MCA0NjNUMjAxIDQ0OFQxNzMgNDIwVDE2MiAzNzdRMTYyIDM1MCAxODAgMzM0VDIyNSAzMDZUMjgzIDI4MlQzNDEgMjU1VDM4NiAyMTRUNDA0IDE1MloiICAvPgorPGdseXBoIHVuaWNvZGU9InQiIGhvcml6LWFkdi14PSIzMzIiIGQ9Ik0yODkgLTFRMjc5IC0zIDI2NCAtNFQyMzUgLTVRMjAxIC01IDE3OSAwVDE0NSAxNlQxMjcgNDJUMTIyIDc3UTEyMiA5NSAxMjUgMTE2TDE3MiA0NTJIODhMOTUgNTAySDE3OUwxOTkgNjQySDI1OEwyMzggNTAySDM2MEwzNTMgNDUySDIzMUwxODUgMTI2UTE4MiAxMDggMTgyIDk0UTE4MiA3MCAxOTcgNTlUMjU5IDQ3SDI5NkwyODkgLTFIMjg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idSIgaG9yaXotYWR2LXg9IjU0MCIgZD0iTTQwOSAwTDQxMCA2Nkg0MDZRMzg0IDM1IDM0NiAxMlQyNDMgLTExUTIxMCAtMTEgMTg0IC01VDE0MSAxN1QxMTQgNTlUMTA0IDEyNlExMDQgMTQxIDEwNSAxNTdUMTA5IDE5NEwxNTIgNTAySDIxMUwxNzQgMjM4UTE3MCAyMTAgMTY4IDE4N1QxNjUgMTQzUTE2NSA5MiAxODYgNjZUMjY0IDQwUTM0MCA0MCAzNzggODFUNDI1IDE4OEw0NjkgNTAySDUyOEw0NTggMEg0MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ2IiBob3Jpei1hZHYteD0iNDU1IiBkPSJNMjY3IDBIMTkwTDk0IDUwMkgxNTdMMjM1IDUwSDIzOUw0MzggNTAySDUwMUwyNjcgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InciIGhvcml6LWFkdi14PSI3MjAiIGQ9Ik01NTAgMEg0NzdMNDE5IDQxMUg0MTVMMjQwIDBIMTY5TDk5IDUwMkgxNjBMMjEzIDUzSDIxN0w0MDQgNTAySDQ1NUw1MTcgNTRINTIxTDcwMSA1MDJINzYxTDU1MCAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieCIgaG9yaXotYWR2LXg9IjQ0MCIgZD0iTTM1NCAwTDI1NSAyMjRIMjUxTDg4IDBIMTlMMjI1IDI2NkwxMDggNTAySDE3NkwyNjQgMzA1SDI2OEw0MDkgNTAySDQ3M0wyOTYgMjY4TDQyMSAwSDM1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9InkiIGhvcml6LWFkdi14PSI0NjYiIGQ9Ik0yMTcgLTg4UTE5NyAtMTI4IDE4MCAtMTU0VDE0NCAtMTk3VDEwNSAtMjE5VDU3IC0yMjZRNDkgLTIyNiAzNyAtMjI2VDE0IC0yMjRMMjEgLTE3MlEzMCAtMTc0IDM4IC0xNzRUNTggLTE3NFE3NyAtMTc0IDkxIC0xNjlUMTE4IC0xNTFUMTQ1IC0xMTNUMTc4IC00OUwyMTEgMjFMOTMgNTAySDE1N0wyNTAgODlIMjU0TDQ1MCA1MDJINTEzTDIxNyAtODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ6IiBob3Jpei1hZHYteD0iNDQxIiBkPSJNNDIgMEw0OCA0OUwzOTIgNDUySDExM0wxMjAgNTAySDQ2NEw0NTcgNDUyTDExNSA1MEg0MDZMMzk5IDBINDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ7IiBob3Jpei1hZHYteD0iMzEzIiBkPSJNMjE3IC05NFExNjcgLTk0IDE1MCAtNzJUMTMzIC0xNFExMzMgLTMgMTM0IDlUMTM3IDM1TDE2MyAyMTZRMTY4IDI0NyAxNjEgMjcwVDEyMCAzMDBMMTI4IDM1N1ExNjQgMzY1IDE3NyAzODdUMTk1IDQ0MkwyMjAgNjI0UTIyNCA2NTEgMjMwIDY3NFQyNDggNzE0VDI4MSA3NDJUMzM0IDc1MkgzNjlMMzYzIDcwOUgzNDJRMzIwIDcwOSAzMDggNzAyVDI5MCA2ODJUMjgyIDY1NVQyNzcgNjIyTDI1MSA0MzdRMjQ4IDQxNyAyNDUgNDAzVDIzNCAzNzZUMjE1IDM1M1QxODYgMzI5UTIwNyAzMTEgMjE1IDI5NVQyMjMgMjU3UTIyMyAyNDEgMjIwIDIyMEwxOTUgMzdRMTkzIDIzIDE5MiAxMlQxOTAgLTlRMTkwIC0zMSAyMDAgLTQwVDIzNiAtNTBIMjU2TDI1MCAtOTRIMjE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifCIgaG9yaXotYWR2LXg9IjIxNiIgZD0iTTUxIC0yMDBMMTgyIDc0MEgyMzRMMTAzIC0yMDBINTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ9IiBob3Jpei1hZHYteD0iMzEzIiBkPSJNMjc3IDMwMFEyNDEgMjkzIDIyOSAyNzBUMjExIDIxNkwxODUgMzVRMTgxIDcgMTc1IC0xNlQxNTYgLTU3VDEyMyAtODRUNjkgLTk0SDM1TDQxIC01MEg2M1E4MiAtNTAgOTMgLTQ2VDExMSAtMzFUMTIxIC00VDEyOCAzN0wxNTMgMjIwUTE1NiAyNDAgMTYwIDI1NVQxNzEgMjgyVDE4OSAzMDZUMjE5IDMyOVExOTcgMzQ3IDE4OSAzNjNUMTgxIDQwMVExODEgNDE2IDE4NCA0MzdMMjEwIDYyMlEyMTIgNjM0IDIxMyA2NDVUMjE1IDY2OFEyMTUgNjg2IDIwNiA2OTdUMTcxIDcwOUgxNDhMMTU0IDc1MkgxODlRMjM4IDc1MiAyNTUgNzI5VDI3MiA2NzFRMjcyIDY2MCAyNzEgNjQ5VDI2OCA2MjRMMjQzIDQ0MlEyNDEgNDI2IDI0MSA0MTNUMjQ1IDM4OFQyNTggMzY5VDI4NSAzNTdMMjc3IDMwMEgyNzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBob3Jpei1hZHYteD0iMzgyIiBkPSJNNDU4IDYyMlE0MjMgNTU4IDM1MyA1NThRMzMyIDU1OCAzMTMgNTY0VDI3NiA1NzdUMjQwIDU5MVQyMDIgNTk3UTE4MSA1OTcgMTY1IDU4OVQxMzQgNTU2TDk3IDU3NFExMjIgNjA5IDE0NiA2MjNUMjA2IDYzOFEyMjcgNjM4IDI0NSA2MzJUMjgyIDYxOVQzMTcgNjA1VDM1NCA1OTlRMzc0IDU5OSAzOTAgNjA4VDQxOSA2MzhMNDU4IDYyMkg0NThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMDsiIGhvcml6LWFkdi14PSIzMDAiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTE7IiBob3Jpei1hZHYteD0iMjcxIiBkPSJNODggLTE2MlExMTAgLTM4IDEzMCA4M1QxNzAgMzI5SDIxOFEyMDMgMjA1IDE4OSA4NFQxNjEgLTE2Mkg4OFpNMTY0IDQ1OFExNjQgNDgyIDE3OSA0OThUMjIwIDUxNVEyNDEgNTE1IDI1MiA1MDVUMjYzIDQ3NlEyNjMgNDUyIDI0OCA0MzZUMjA3IDQyMFExNjQgNDIwIDE2NCA0NThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMjsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00OTEgMTQyUTQ1NyAxMTYgNDE5IDk5VDMzOCA3N0wzMjggMEgyNzBMMjgwIDc4UTIzNyA4MiAyMDcgOTlUMTU4IDE0MlQxMzEgMjAyVDEyMiAyNzdRMTIyIDMzMSAxMzUgMzg1VDE3NiA0ODVUMjQ4IDU2MFQzNTQgNTk4TDM2MyA2NjdINDIxTDQxMiA1OTlRNDUxIDU5NyA0ODQgNTgyVDU0NyA1NDJMNTE0IDQ5N1E0NjUgNTUxIDM4NSA1NTFRMzMxIDU1MSAyOTQgNTI4VDIzMyA0NjZUMTk4IDM4MFQxODcgMjgzUTE4NyAyNTAgMTkzIDIyMlQyMTYgMTcyVDI1NyAxMzlUMzIxIDEyNlEzOTYgMTI2IDQ2OSAxODRMNDkxIDE0Mkg0OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMzsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00ODggMEg2Nkw3MyA1Mkg5MFExMjUgNTIgMTQ4IDY5VDE4NiAxMTNUMjA2IDE3NFQyMTIgMjQxUTIxMiAyOTEgMjA2IDMzNkgxMjlMMTM2IDM4NUgyMDJRMjAwIDQxNyAxOTcgNDQ1VDE5MyA0OTlRMTkzIDU3OSAyNDIgNjI4VDM4NSA2NzhRNDI3IDY3OCA0NjggNjY2VDU0MiA2MzFMNTE2IDU4MFE0OTAgNjAwIDQ1OSA2MTJUMzg1IDYyNVEzMTYgNjI1IDI4NiA1OTJUMjU1IDQ4N1EyNTUgNDYxIDI1NyA0MzZUMjYyIDM4NUg0MDlMNDAyIDMzNkgyNjRRMjY3IDMxMiAyNjkgMjg5VDI3MiAyNDFRMjcyIDIxNiAyNjkgMTkxVDI1OCAxNDFUMjM2IDk1VDIwMCA1N0wxOTkgNTRINDk1TDQ4OCAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNMTI0IDMxMlExMjQgMzU0IDE0MCAzOTJUMTg1IDQ2MEwxMjkgNTI1TDE2OCA1NTlMMjI0IDQ5M1EyNTIgNTEzIDI4NCA1MjRUMzUxIDUzNlEzODMgNTM2IDQxMiA1MjVUNDY2IDQ5M0w1NDEgNTU5TDU3MCA1MjVMNDk1IDQ1OVE1MDkgNDM5IDUxNSA0MTZUNTIyIDM2OVE1MjIgMjgzIDQ2MCAyMThMNTE4IDE1MUw0NzkgMTE3TDQyMSAxODRRMzk0IDE2NCAzNjIgMTU0VDI5NiAxNDNRMjY0IDE0MyAyMzUgMTUzVDE4MSAxODRMMTA2IDExOEw3NyAxNTJMMTUyIDIxOFExMzggMjM4IDEzMSAyNjJUMTI0IDMxMlpNMzQzIDQ4MlEzMTEgNDgyIDI4MiA0NjlUMjMwIDQzNFQxOTQgMzgyVDE4MCAzMjBRMTgwIDI5NCAxODkgMjcyVDIxNSAyMzNUMjU0IDIwN1QzMDMgMTk3UTMzNSAxOTcgMzY0IDIxMFQ0MTYgMjQ2VDQ1MiAyOThUNDY2IDM2MFE0NjYgMzg2IDQ1NyA0MDhUNDMxIDQ0N1QzOTIgNDczVDM0MyA0ODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00MDAgMzQzSDUzMkw1MjUgMjk4SDM2N0wzNDYgMjY3TDMzNiAxOTlINTExTDUwNSAxNTVIMzMwTDMwOSAwSDI0N0wyNjggMTU1SDk0TDEwMCAxOTlIMjc0TDI4NCAyNjRMMjY5IDI5OEgxMTRMMTIxIDM0M0gyNTBMMTI5IDY2N0gxOTlMMzIzIDMyMEw1NDMgNjY3SDYxMUw0MDAgMzQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTY7IiBob3Jpei1hZHYteD0iMjE2IiBkPSJNMTIzIDMyM0wxODIgNzQwSDIzNEwxNzUgMzIzSDEyM1pNNTEgLTIwMEwxMDkgMjE3SDE2MUwxMDMgLTIwMEg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE3OyIgaG9yaXotYWR2LXg9IjQ4MyIgZD0iTTQ1MiAzMTZRNDUyIDI3NyA0MzkgMjUwVDQwMiAyMDVUMzQ3IDE4MFQyODAgMTcwVjE2NlEzMDQgMTU3IDMyOSAxNDVUMzczIDExN1Q0MDUgNzhUNDE4IDI2UTQxOCAtMTUgNDAyIC00NFQzNjAgLTkxVDMwMCAtMTE5VDIyOSAtMTI4UTE4NCAtMTI4IDE0NSAtMTE4VDY3IC04NEw5NiAtMzVRMTI1IC01NiAxNTkgLTY4VDIzMCAtODBRMjU1IC04MCAyNzcgLTc1VDMxNyAtNTdUMzQzIC0yNlQzNTMgMjNRMzUzIDUwIDMzNCA2OVQyODYgMTAzVDIyNCAxMzJUMTYyIDE2NFQxMTQgMjA2VDk1IDI2NVE5NSAzMDIgMTA5IDMyOFQxNDggMzcxVDIwMiAzOTZUMjY2IDQwNlY0MTBRMjQ2IDQxOSAyMjUgNDMwVDE4NiA0NTdUMTU3IDQ5MVQxNDYgNTM2UTE0NiA1NzUgMTYzIDYwMlQyMDggNjQ2VDI2OSA2NzBUMzM2IDY3OFEzNzMgNjc4IDQwNyA2NzBUNDc0IDY0N0w0NTIgNTk3UTQyNCA2MTEgMzk1IDYyMFQzMzMgNjI5UTMxMyA2MjkgMjkxIDYyNVQyNTEgNjEyVDIyMSA1ODZUMjA5IDU0NFEyMDkgNTE1IDIyNyA0OTZUMjcyIDQ2M1QzMzAgNDM2VDM4OSA0MDhUNDM0IDM3MVQ0NTIgMzE2Wk0yNjIgMjAwUTI4OSAyMDAgMzEzIDIwNFQzNTQgMjIxVDM4MiAyNTNUMzkyIDMwNFEzOTIgMzI2IDM4MyAzMzlUMzU4IDM2MFQzMjMgMzcwVDI4NiAzNzJRMjYwIDM3MiAyMzYgMzY4VDE5NCAzNTJUMTY1IDMyMVQxNTQgMjcwUTE1NCAyNDggMTY0IDIzNFQxOTAgMjEzVDIyNSAyMDNUMjYyIDIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE4OyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTM5MiA2MjBRMzkyIDYwMSAzNzggNTg3VDM0NSA1NzNRMzMwIDU3MyAzMjAgNTgzVDMxMCA2MDlRMzEwIDYyNyAzMjQgNjQxVDM1NyA2NTVRMzcyIDY1NSAzODIgNjQ1VDM5MiA2MjBaTTIyMyA2MTlRMjIzIDYwMSAyMDkgNTg3VDE3NiA1NzNRMTYxIDU3MyAxNTEgNTgzVDE0MSA2MDlRMTQxIDYyNyAxNTUgNjQxVDE4OCA2NTVRMjAzIDY1NSAyMTMgNjQ1VDIyMyA2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBOTsiIGhvcml6LWFkdi14PSI5MDYiIGQ9Ik03OTkgMzM0UTc5OSAyNjIgNzcyIDIwMFQ2OTggOTFUNTg4IDE3VDQ1MyAtMTBRMzgxIC0xMCAzMTggMTdUMjA4IDkwVDEzNCAxOTlUMTA3IDMzNFExMDcgNDA2IDEzNCA0NjhUMjA4IDU3N1QzMTggNjUxVDQ1MyA2NzhRNTI1IDY3OCA1ODggNjUxVDY5OCA1NzhUNzcyIDQ2OVQ3OTkgMzM0Wk03NjYgMzM0UTc2NiAzOTggNzQyIDQ1NFQ2NzYgNTU0VDU3NyA2MjJUNDUzIDY0N1EzODYgNjQ3IDMyOSA2MjJUMjMwIDU1NFQxNjUgNDU1VDE0MSAzMzRRMTQxIDI3MCAxNjYgMjE0VDIzMyAxMTVUMzMyIDQ4VDQ1MyAyM1E1MTcgMjMgNTczIDQ3VDY3MyAxMTRUNzQxIDIxM1Q3NjYgMzM0Wk02MTQgMTczUTU4MiAxNDUgNTQ1IDEyOVQ0NjAgMTEyUTQwMiAxMTIgMzY0IDEyOFQzMDQgMTczVDI3MiAyNDNUMjYzIDMzNFEyNjMgMzg1IDI3MyA0MjVUMzA3IDQ5NFQzNjkgNTM4VDQ2NCA1NTNRNTEwIDU1MyA1NDYgNTM4VDYxNSA0OTRMNTkyIDQ1OFE1NjYgNDgzIDUzNSA0OTdUNDY1IDUxMVE0MTggNTExIDM4OSA0OTlUMzQzIDQ2M1QzMjAgNDA4VDMxMyAzMzVRMzEzIDI5NCAzMTkgMjYxVDM0MSAyMDNUMzg2IDE2NlQ0NjEgMTUzUTQ5OSAxNTMgNTMwIDE2OFQ1OTEgMjEwTDYxNCAxNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQTsiIGhvcml6LWFkdi14PSIzNzciIGQ9Ik0zNDAgMzcwUTMyOCAzNzUgMzIwIDM4MVQzMTAgNDAySDMwNlEyODMgMzg2IDI1NiAzNzZUMjAxIDM2NlExNjYgMzY2IDE0MyAzODRUMTIwIDQ0MFExMjAgNDgyIDE0MCA1MDhUMTkyIDU0OFQyNjEgNTY3VDMzMSA1NzJRMzMyIDU4MCAzMzMgNTg4VDMzNCA2MDRRMzM0IDYyNSAzMjEgNjMzVDI4MSA2NDJRMjY2IDY0MiAyNDkgNjM5VDIxNiA2MzFUMTg3IDYyMVQxNjUgNjEwTDE1MyA2NDNRMTg2IDY2MCAyMTkgNjcwVDI5MSA2ODBRMzI5IDY4MCAzNTQgNjY2VDM4MCA2MDlRMzgwIDU4NiAzNzcgNTYzVDM2OSA1MTZUMzYxIDQ3MFQzNTcgNDI0UTM1NyA0MTYgMzYxIDQxMlQzNzEgNDAzTDM0MCAzNzBaTTMyNyA1NDJRMzA0IDU0MiAyNzYgNTM5VDIyNCA1MjVUMTgzIDQ5NlQxNjYgNDQ3UTE2NiA0MjUgMTc5IDQxMlQyMTUgMzk5UTI0MSAzOTkgMjY1IDQxMFQzMTIgNDM1TDMyNyA1NDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQjsiIGhvcml6LWFkdi14PSI0MzAiIGQ9Ik0zNTUgMTE3TDIzNSAzMDlMNDA5IDUwMkw0NDcgNDc2TDI5MyAzMDlMNDAwIDE0NEwzNTUgMTE3Wk0xODcgMTE0TDY0IDMwOUwyNDAgNTA1TDI3OSA0NzlMMTIzIDMwOUwyMzEgMTQxTDE4NyAxMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQzsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik00NzggMjMxSDg2TDk0IDI4NUg1NDBMNTA2IDQ5SDQ1Mkw0NzggMjMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUU7IiBob3Jpei1hZHYteD0iNDc5IiBkPSJNMjI2IDM2MVExOTAgMzYxIDE1OCAzNzRUMTAyIDQxMVQ2NSA0NjRUNTEgNTMwUTUxIDU2NSA2NCA1OTZUMTAyIDY1MFQxNTggNjg2VDIyNiA3MDBRMjYyIDcwMCAyOTMgNjg3VDM0OSA2NTBUMzg2IDU5NlQ0MDAgNTMwUTQwMCA0OTUgMzg3IDQ2NVQzNDkgNDExVDI5NCAzNzVUMjI2IDM2MVpNMjI3IDY3NlExOTUgNjc2IDE2OCA2NjRUMTIwIDYzMlQ4OCA1ODZUNzYgNTMwUTc2IDUwMSA4OCA0NzVUMTIxIDQyOVQxNjkgMzk3VDIyNiAzODVRMjU2IDM4NSAyODMgMzk2VDMzMSA0MjdUMzY0IDQ3M1QzNzYgNTMwUTM3NiA1NTkgMzY1IDU4NVQzMzMgNjMyVDI4NSA2NjRUMjI3IDY3NlpNMTY0IDYyM1ExODQgNjI1IDE5OSA2MjZUMjI4IDYyN1EyNTYgNjI3IDI3OSA2MTVUMzAyIDU2OFEzMDIgNTUxIDI5NCA1NDBUMjcyIDUxOUwzMDYgNDM5SDI2OEwyNDEgNTAzUTIzOSA1MDggMjM4IDUwOVQyMzAgNTEwSDE5N1Y0MzlIMTY0VjYyM1pNMjI5IDU5NlEyMjEgNTk2IDIxNCA1OTZUMTk4IDU5NVY1MzhIMjMxUTI0NyA1MzggMjU4IDU0NVQyNjkgNTY2UTI2OSA1ODMgMjU5IDU4OVQyMjkgNTk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUY7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMTE5IDU5MEwxMjUgNjMySDQxMEw0MDQgNTkwSDExOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIwOyIgaG9yaXotYWR2LXg9IjM4OSIgZD0iTTQxMSA1NjBRNDExIDUyOCAzOTkgNTAwVDM2NSA0NTJUMzE0IDQxOVQyNTEgNDA3UTIyNSA0MDcgMjAzIDQxNVQxNjUgNDM5VDEzOSA0NzVUMTI5IDUyMlExMjkgNTUzIDE0MCA1ODFUMTcyIDYzMVQyMjMgNjY0VDI5MCA2NzdRMzE1IDY3NyAzMzcgNjY5VDM3NiA2NDRUNDAxIDYwN1Q0MTEgNTYwWk0yNTYgNDM5UTMxMCA0MzkgMzQyIDQ3M1QzNzQgNTU2UTM3NCA1OTUgMzQ5IDYyMFQyODUgNjQ1UTI1OCA2NDUgMjM2IDYzNlQxOTggNjEwVDE3NCA1NzNUMTY1IDUyOFExNjUgNDg5IDE5MSA0NjRUMjU2IDQzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIxOyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTM0MyAyNjFMMzE5IDkySDI2NEwyODggMjYxSDkwTDk4IDMxNUgyOTZMMzIzIDUwNkgzNzhMMzUxIDMxNUg1NDRMNTM2IDI2MUgzNDNaTTU0IDBMNjEgNTNINTA3TDUwMCAwSDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjI7IiBob3Jpei1hZHYteD0iMjk5IiBkPSJNOTQgMzY3TDkyIDQxMVExMTEgNDI2IDE0NSA0NDlUMjEyIDUwMFQyNjkgNTU4VDI5MyA2MTZRMjkzIDYzOSAyNzkgNjUwVDI0NCA2NjJRMjE3IDY2MiAxOTYgNjQ5VDE1NSA2MTlMMTMzIDY0OVExNjAgNjcyIDE4OSA2ODZUMjU0IDcwMFEyODkgNzAwIDMxNCA2ODJUMzQwIDYyNlEzNDAgNTkxIDMxOSA1NjBUMjY2IDUwMFQyMDEgNDQ4VDE0MSA0MDZIMzE1TDMwOSAzNjdIOTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMzsiIGhvcml6LWFkdi14PSIyOTIiIGQ9Ik0zMTcgNDc5UTMxNyA0MjAgMjgwIDM5MVQxODcgMzYxUTE1OCAzNjEgMTMzIDM2OVQ4NSAzOTZMMTEwIDQzMFExMjcgNDE1IDE0NiA0MDdUMTg5IDM5OFEyMjUgMzk4IDI0NyA0MTdUMjcwIDQ3NVEyNzAgNDkwIDI2NCA0OTlUMjQ5IDUxMlQyMjcgNTE4VDIwMiA1MjBRMTk0IDUyMCAxODYgNTIwVDE3MSA1MTlMMTc3IDU1NVExOTUgNTU1IDIxMyA1NTZUMjQ3IDU2NFQyNzIgNTg0VDI4MiA2MjBRMjgyIDY0NCAyNjYgNjUzVDIyOSA2NjJRMTgzIDY2MiAxNDUgNjMyTDEyOCA2NjVRMTU1IDY4MiAxODEgNjkxVDIzOSA3MDBRMjc1IDcwMCAzMDIgNjg0VDMyOSA2MjdRMzI5IDU5OCAzMTMgNTc2VDI2OSA1NDRWNTQwUTMxNyA1MjggMzE3IDQ3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTE5OCA1NjVMMTcwIDU4OUwzMjIgNzA0TDM3NSA2NzFMMTk4IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI1OyIgaG9yaXotYWR2LXg9IjU2OCIgZD0iTTQyMyAwTDQyNCA2NUg0MjBRNDA4IDUwIDM5NCAzN1QzNjIgMTNUMzIwIC00VDI2NSAtMTFRMjQ4IC0xMSAyMzIgLTlUMjAxIC0xVDE3NSAxNlQxNTcgNDRMMTIwIC0yMjBINjVMMTY2IDUwMkgyMjZMMTg5IDIzOFExODUgMjA5IDE4MyAxODVUMTgwIDE0MVExODAgOTEgMjAwIDY2VDI3OCA0MVEzNTUgNDEgMzkyIDgxVDQzOCAxODhMNDgyIDUwMkg1NDJMNDcyIDBINDIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjY7IiBob3Jpei1hZHYteD0iNDczIiBkPSJNMzQ4IDBRMjk3IDAgMjUwIDExVDE2NyA0OFQxMDkgMTE0VDg3IDIxMlE4NyAyODIgMTE0IDMzNlQxODcgNDI3VDI5MiA0ODNUNDE4IDUwMkg0NTRMMzg0IDBIMzQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjc7IiBob3Jpei1hZHYteD0iMTg0IiBkPSJNMTczIDI0NFExNzMgMjE5IDE1OCAyMDNUMTE3IDE4N1E5OSAxODcgODggMTk2VDc2IDIyNVE3NiAyNTEgOTAgMjY2VDEzMSAyODJRMTUwIDI4MiAxNjEgMjczVDE3MyAyNDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCODsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0yNTIgLTExMFEyNTIgLTE1NyAyMjMgLTE4MFQxNTAgLTIwM1ExMjkgLTIwMyAxMDkgLTE5N1Q3MSAtMTc5TDg5IC0xNTFRMTAzIC0xNTkgMTE3IC0xNjRUMTQ5IC0xNjlRMTc1IC0xNjkgMTkzIC0xNThUMjEyIC0xMTZRMjEyIC05NiAxOTcgLTg5VDE2MyAtODJRMTQxIC04MiAxMjYgLTg4TDExNSAtNzJMMTY1IDBIMjA0TDE2NSAtNTNRMTcwIC01MiAxNzUgLTUyVDE4NiAtNTJRMjEyIC01MiAyMzIgLTYzVDI1MiAtMTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjk7IiBob3Jpei1hZHYteD0iMjY4IiBkPSJNMTc1IDQwNUwyMDkgNjQxSDIwNUwxMzAgNTk5TDExNyA2MzNMMjI1IDY5NEgyNjFMMjIwIDQwNUgzMDFMMjk2IDM2N0g4N0w5MiA0MDVIMTc1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkE7IiBob3Jpei1hZHYteD0iMzc3IiBkPSJNNDAxIDU1OFE0MDEgNTIxIDM5MSA0ODdUMzYxIDQyNVQzMTEgMzgyVDI0MCAzNjZRMTgzIDM2NiAxNTMgMzk4VDEyMiA0ODhRMTIyIDUyNSAxMzIgNTU5VDE2MiA2MjFUMjEzIDY2NFQyODQgNjgwUTM0MSA2ODAgMzcxIDY0N1Q0MDEgNTU4Wk0yNDUgNDA1UTI3NyA0MDUgMjk4IDQxOVQzMzIgNDU1VDM1MCA1MDRUMzU1IDU1OVEzNTUgNTk4IDMzNyA2MTlUMjc4IDY0MFEyNDYgNjQwIDIyNSA2MjdUMTkxIDU5MVQxNzMgNTQyVDE2OCA0ODdRMTY4IDQ0NyAxODYgNDI2VDI0NSA0MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQjsiIGhvcml6LWFkdi14PSI0MjkiIGQ9Ik0yNzUgMTE0TDIzNyAxNDFMMzkyIDMwOUwyODQgNDc5TDMyOSA1MDVMNDUxIDMwOUwyNzUgMTE0Wk0xMDYgMTE3TDY5IDE0NEwyMjIgMzA5TDExNSA0NzZMMTYwIDUwMkwyODEgMzA5TDEwNiAxMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGhvcml6LWFkdi14PSI3MTgiIGQ9Ik0yMTAgNDA1TDI0NCA2NDFIMjQwTDE2NSA1OTlMMTUyIDYzM0wyNjAgNjk0SDI5NkwyNTUgNDA1SDMzNkwzMzEgMzY3SDEyMkwxMjcgNDA1SDIxMFpNMTgxIDBIMTM5TDcwOCA3MDBINzUwTDE4MSAwWk02NDEgNzBMNjMyIDBINTg1TDU5NCA3MEg0NTJMNDQ1IDEwOEw2MjMgMzI3SDY3N0w2NDcgMTA5SDY5N0w2OTEgNzBINjQxWk00ODkgMTA3SDYwMUw2MjUgMjc5TDQ4OSAxMDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRDsiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik0yMDAgNDA1TDIzNCA2NDFIMjMwTDE1NSA1OTlMMTQyIDYzM0wyNTAgNjk0SDI4NkwyNDUgNDA1SDMyNkwzMjEgMzY3SDExMkwxMTcgNDA1SDIwMFpNMTM4IDBIOTZMNjY1IDcwMEg3MDdMMTM4IDBaTTQzMCAwTDQyOCA0NFE0NTQgNjUgNDg5IDg5VDU1NSAxNDBUNjA3IDE5M1Q2MjkgMjQ2UTYyOSAyNjYgNjE5IDI4MFQ1NzkgMjk1UTU1NiAyOTUgNTM2IDI4NVQ0OTEgMjUyTDQ2OCAyODJRNDk5IDMwOSA1MjcgMzIxVDU4OSAzMzNRNjI5IDMzMyA2NTIgMzEzVDY3NiAyNThRNjc2IDIyNSA2NTYgMTk1VDYwNSAxMzZUNTQwIDg0VDQ3NiAzOUg2NTBMNjQ1IDBINDMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBob3Jpei1hZHYteD0iNjgyIiBkPSJNMzUxIDQ3OVEzNTEgNDIwIDMxNSAzOTFUMjIyIDM2MVExOTMgMzYxIDE2OCAzNjlUMTIwIDM5NkwxNDQgNDMwUTE3OSAzOTggMjI0IDM5OFEyNTkgMzk4IDI4MiA0MTdUMzA1IDQ3NFEzMDUgNTA0IDI4NSA1MTFUMjQwIDUxOUgyMDZMMjExIDU1NVEyMjggNTU1IDI0NiA1NTZUMjgxIDU2NFQzMDcgNTgzVDMxNyA2MTlRMzE3IDY0MyAzMDEgNjUyVDI2MyA2NjJRMjE4IDY2MiAxODAgNjMyTDE2MiA2NjVRMTkwIDY4MiAyMTUgNjkxVDI3MyA3MDBRMjkxIDcwMCAzMDcgNjk3VDMzNSA2ODVUMzU1IDY2MlQzNjMgNjI4UTM2MyA1OTkgMzQ4IDU3N1QzMDMgNTQ0VjU0MFEzNTEgNTI4IDM1MSA0NzlaTTE2MSAwSDExOUw2ODggNzAwSDczMEwxNjEgMFpNNjEyIDcwTDYwMyAwSDU1Nkw1NjUgNzBINDIzTDQxNiAxMDhMNTk0IDMyN0g2NDhMNjE4IDEwOUg2NjhMNjYyIDcwSDYxMlpNNDYwIDEwN0g1NzJMNTk2IDI3OUw0NjAgMTA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkY7IiBob3Jpei1hZHYteD0iNDk5IiBkPSJNODEgLTMyUTgxIDI2IDk5IDYyVDE0NiAxMjFUMjA4IDE1OVQyNzIgMTg3VDMyMyAyMjBUMzQ5IDI3MUwzNTkgMzQ0SDQyMEw0MDggMjYyUTQwMiAyMjEgMzgwIDE5N1QzMjkgMTU4VDI2OCAxMzFUMjA4IDEwMVQxNjMgNTVUMTQ1IC0yM1ExNDUgLTUwIDE1NSAtNjlUMTgyIC05OVQyMjIgLTExNlQyNjggLTEyMVEzMTUgLTEyMSAzNTYgLTEwNFQ0MzUgLTYxTDQ1OSAtMTA3UTQxMiAtMTM3IDM2MiAtMTU1VDI1NSAtMTczUTIyMiAtMTczIDE5MSAtMTY1VDEzNSAtMTQwVDk2IC05N1Q4MSAtMzJaTTM2MCA0NTlRMzYwIDQ4MyAzNzQgNDk5VDQxNCA1MTVRNDMxIDUxNSA0NDMgNTA2VDQ1NSA0NzhRNDU1IDQ1MyA0NDEgNDM4VDQwMSA0MjJRMzgzIDQyMiAzNzIgNDMxVDM2MCA0NTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMDsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01MTggMEw0ODIgMTcxSDE3N0w5MyAwSDI4TDM2MiA2NzFINDM3TDU4NSAwSDUxOFpNMzkxIDYxMUgzODlMMTk5IDIyNUg0NzFMMzkxIDYxMVpNNDI0IDcwNUwyNzcgODA5TDM0MSA4NDFMNDU4IDcyN0w0MjQgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzE7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDgyIDE3MUgxNzdMOTMgMEgyOEwzNjIgNjcxSDQzN0w1ODUgMEg1MThaTTM5MSA2MTFIMzg5TDE5OSAyMjVINDcxTDM5MSA2MTFaTTM4OSA3MDVMMzYxIDcyOUw1MTMgODQ0TDU2NiA4MTFMMzg5IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgaG9yaXotYWR2LXg9IjYxMyIgZD0iTTUxOCAwTDQ4MiAxNzFIMTc3TDkzIDBIMjhMMzYyIDY3MUg0MzdMNTg1IDBINTE4Wk0zOTEgNjExSDM4OUwxOTkgMjI1SDQ3MUwzOTEgNjExWk01MTcgNzA0TDQxMyA3ODZMMjg4IDcwNEwyNjYgNzM5TDQyMSA4MzhMNTUwIDczOUw1MTcgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzM7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDgyIDE3MUgxNzdMOTMgMEgyOEwzNjIgNjcxSDQzN0w1ODUgMEg1MThaTTM5MSA2MTFIMzg5TDE5OSAyMjVINDcxTDM5MSA2MTFaTTU2NiA3NzRRNTUyIDc0MiA1MjUgNzI3VDQ3MSA3MTJRNDU1IDcxMiA0MzkgNzE4VDQwNyA3MzFUMzc2IDc0NFQzNDggNzUwUTMzMiA3NTAgMzE1IDc0M1QyODYgNzExTDI1NCA3MzRRMjc1IDc3MCAzMDAgNzgzVDM1MSA3OTZRMzY3IDc5NiAzODMgNzkwVDQxNSA3NzdUNDQ1IDc2NFQ0NzQgNzU4UTQ5MSA3NTggNTA2IDc2NlQ1MzMgNzk2TDU2NiA3NzRINTY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzQ7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDgyIDE3MUgxNzdMOTMgMEgyOEwzNjIgNjcxSDQzN0w1ODUgMEg1MThaTTM5MSA2MTFIMzg5TDE5OSAyMjVINDcxTDM5MSA2MTFaTTUzNiA3NjBRNTM2IDc0MSA1MjIgNzI3VDQ4OSA3MTNRNDc0IDcxMyA0NjQgNzIzVDQ1NCA3NDlRNDU0IDc2NyA0NjggNzgxVDUwMSA3OTVRNTE2IDc5NSA1MjYgNzg1VDUzNiA3NjBaTTM2NyA3NTlRMzY3IDc0MSAzNTMgNzI3VDMyMCA3MTNRMzA1IDcxMyAyOTUgNzIzVDI4NSA3NDlRMjg1IDc2NyAyOTkgNzgxVDMzMiA3OTVRMzQ3IDc5NSAzNTcgNzg1VDM2NyA3NTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNTsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01MTAgNzQ0UTUxMCA3MTIgNDkxIDY4NFQ0NDMgNjQyTDU4NSAwSDUxOEw0ODIgMTcxSDE3N0w5MyAwSDI4TDM0NyA2NDFRMzI1IDY1MiAzMTQgNjcyVDMwMiA3MTVRMzAyIDczOSAzMTEgNzU5VDMzNSA3OTVUMzczIDgxOVQ0MjEgODI4UTQ2MiA4MjggNDg2IDgwNVQ1MTAgNzQ0Wk0zOTMgNjE0SDM4OUwxOTkgMjI1SDQ3MUwzOTMgNjE0Wk0zOTggNjY1UTQxMyA2NjUgNDI2IDY3MVQ0NDkgNjg3VDQ2NSA3MTFUNDcxIDczOVE0NzEgNzYyIDQ1NSA3NzdUNDE2IDc5M1EzODQgNzkzIDM2MyA3NzJUMzQyIDcyMFEzNDIgNjk2IDM1OCA2ODFUMzk4IDY2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM2OyIgaG9yaXotYWR2LXg9Ijg2OCIgZD0iTTQ0OSAwTDQ3MyAxNzFIMjE0TDk0IDBIMjVMNTA0IDY2N0g5MTNMOTA2IDYxM0g1OThMNTY2IDM4NUg4NDRMODM2IDMzMEg1NThMNTE5IDU0SDgzN0w4MzAgMEg0NDlaTTUzNSA2MTBINTI3TDI0OCAyMjZINDgxTDUzNSA2MTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNzsiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik00MjEgLTExM1E0MjEgLTE1MiAzOTQgLTE3OFQzMTggLTIwNVEyOTYgLTIwNSAyNzUgLTE5OVQyNDAgLTE4M0wyNTkgLTE1NFEyNzIgLTE2MiAyODYgLTE2N1QzMjEgLTE3M1EzNDcgLTE3MyAzNjMgLTE2MFQzODAgLTEyMFEzODAgLTEwMCAzNjYgLTkzVDMzMiAtODZRMzEzIC04NiAyOTUgLTkxTDI4NCAtNzZMMzI5IC0xMFEyMjAgLTMgMTY1IDY0VDEwOSAyNTFRMTA5IDMyOSAxMjkgNDA1VDE5MyA1NDJUMzAxIDY0MFQ0NTYgNjc4UTUxNiA2NzggNTY0IDY1OFQ2NTggNTk2TDYxNCA1NTJRNTc0IDU5MCA1MzYgNjA3VDQ0OSA2MjVRMzc3IDYyNSAzMjYgNTkyVDI0MSA1MDdUMTkyIDM4OVQxNzYgMjU5UTE3NiAyMTYgMTg1IDE3N1QyMTUgMTA3VDI3MyA2MFQzNjQgNDJRNDEwIDQyIDQ2MCA2MFQ1NjEgMTIwTDU5MCA3NlE1MzIgMzEgNDc5IDExVDM2NiAtMTFMMzMyIC01OEwzMzQgLTYxUTM0NyAtNTYgMzYwIC01NlEzODkgLTU2IDQwNSAtNzBUNDIxIC0xMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDODsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwTDE4NSA2NjdINTU1TDU0OCA2MTJIMjQxTDIwOSAzODVINDg3TDQ3OSAzMzBIMjAxTDE2MiA1NEg0ODBMNDczIDBIOTJaTTQyNSA3MDVMMjc4IDgwOUwzNDIgODQxTDQ1OSA3MjdMNDI1IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM5OyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTkyIDBMMTg1IDY2N0g1NTVMNTQ4IDYxMkgyNDFMMjA5IDM4NUg0ODdMNDc5IDMzMEgyMDFMMTYyIDU0SDQ4MEw0NzMgMEg5MlpNMzUzIDcwNUwzMjUgNzI5TDQ3NyA4NDRMNTMwIDgxMUwzNTMgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0E7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNOTIgMEwxODUgNjY3SDU1NUw1NDggNjEySDI0MUwyMDkgMzg1SDQ4N0w0NzkgMzMwSDIwMUwxNjIgNTRINDgwTDQ3MyAwSDkyWk00OTIgNzA0TDM4OCA3ODZMMjYzIDcwNEwyNDEgNzM5TDM5NiA4MzhMNTI1IDczOUw0OTIgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0I7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNOTIgMEwxODUgNjY3SDU1NUw1NDggNjEySDI0MUwyMDkgMzg1SDQ4N0w0NzkgMzMwSDIwMUwxNjIgNTRINDgwTDQ3MyAwSDkyWk01MTEgNzYwUTUxMSA3NDEgNDk3IDcyN1Q0NjQgNzEzUTQ0OSA3MTMgNDM5IDcyM1Q0MjkgNzQ5UTQyOSA3NjcgNDQzIDc4MVQ0NzYgNzk1UTQ5MSA3OTUgNTAxIDc4NVQ1MTEgNzYwWk0zNDIgNzU5UTM0MiA3NDEgMzI4IDcyN1QyOTUgNzEzUTI4MCA3MTMgMjcwIDcyM1QyNjAgNzQ5UTI2MCA3NjcgMjc0IDc4MVQzMDcgNzk1UTMyMiA3OTUgMzMyIDc4NVQzNDIgNzU5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0M7IiBob3Jpei1hZHYteD0iMjQ3IiBkPSJNOTIgMEwxODUgNjY3SDI0OEwxNTUgMEg5MlpNMjQzIDcwNUw5NiA4MDlMMTYwIDg0MUwyNzcgNzI3TDI0MyA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRDsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwTDE4NSA2NjdIMjQ4TDE1NSAwSDkyWk0yMDcgNzA1TDE3OSA3MjlMMzMxIDg0NEwzODQgODExTDIwNyA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRTsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwTDE4NSA2NjdIMjQ4TDE1NSAwSDkyWk0zNDAgNzA0TDIzNiA3ODZMMTExIDcwNEw4OSA3MzlMMjQ0IDgzOEwzNzMgNzM5TDM0MCA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRjsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwTDE4NSA2NjdIMjQ4TDE1NSAwSDkyWk0zNTYgNzYwUTM1NiA3NDEgMzQyIDcyN1QzMDkgNzEzUTI5NCA3MTMgMjg0IDcyM1QyNzQgNzQ5UTI3NCA3NjcgMjg4IDc4MVQzMjEgNzk1UTMzNiA3OTUgMzQ2IDc4NVQzNTYgNzYwWk0xODcgNzU5UTE4NyA3NDEgMTczIDcyN1QxNDAgNzEzUTEyNSA3MTMgMTE1IDcyM1QxMDUgNzQ5UTEwNSA3NjcgMTE5IDc4MVQxNTIgNzk1UTE2NyA3OTUgMTc3IDc4NVQxODcgNzU5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDA7IiBob3Jpei1hZHYteD0iNjUwIiBkPSJNNjMzIDQxM1E2MzMgMzM4IDYxMyAyNjRUNTUxIDEzMlQ0NDEgMzdUMjc5IDBIOTJMMTM4IDMzMkg3OEw4NiAzODVIMTQ2TDE4NSA2NjRRMjA2IDY2NiAyMzEgNjY4VDI4MSA2NzFUMzMwIDY3NFQzNzMgNjc1UTQ0MiA2NzUgNDkxIDY1NlQ1NzEgNjAzVDYxOCA1MjBUNjMzIDQxM1pNMjcwIDUzUTM1MSA1MyA0MDggODFUNTAwIDE1N1Q1NTIgMjcwVDU2OCA0MDlRNTY4IDQ0OSA1NTkgNDg3VDUyOCA1NTVUNDY3IDYwMlQzNzAgNjIwUTMzNyA2MjAgMzA0IDYxOVQyNDEgNjE0TDIwOSAzODVIMzY1TDM1NyAzMzJIMjAxTDE2MiA1M0gyNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMTsiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik01MzAgMEwyMzYgNTYwSDIzMkwxNTQgMEg5MkwxODUgNjY3SDI1Mkw1NDEgMTEwSDU0NUw2MjMgNjY3SDY4NUw1OTIgMEg1MzBaTTYxNCA3NzRRNjAwIDc0MiA1NzMgNzI3VDUxOSA3MTJRNTAzIDcxMiA0ODcgNzE4VDQ1NSA3MzFUNDI0IDc0NFQzOTYgNzUwUTM4MCA3NTAgMzYzIDc0M1QzMzQgNzExTDMwMiA3MzRRMzIzIDc3MCAzNDggNzgzVDM5OSA3OTZRNDE1IDc5NiA0MzEgNzkwVDQ2MyA3NzdUNDkzIDc2NFQ1MjIgNzU4UTUzOSA3NTggNTU0IDc2NlQ1ODEgNzk2TDYxNCA3NzRINjE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDI7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNzE1IDQxMlE3MTUgMzMxIDY5NCAyNTVUNjMwIDEyMFQ1MjAgMjVUMzY0IC0xMVEyMzYgLTExIDE3MyA2MVQxMDkgMjU2UTEwOSAzMzcgMTMwIDQxM1QxOTUgNTQ4VDMwNSA2NDJUNDYxIDY3OFE1ODggNjc4IDY1MSA2MDdUNzE1IDQxMlpNMzcxIDQxUTQ0NyA0MSA1MDAgNzRUNTg2IDE2MVQ2MzQgMjgwVDY0OSA0MTFRNjQ5IDQ1OSA2MzggNDk5VDYwNCA1NjdUNTQzIDYxMVQ0NTQgNjI3UTM3OCA2MjcgMzI1IDU5NFQyMzkgNTA5VDE5MSAzOTFUMTc2IDI2MFExNzYgMjEyIDE4NyAxNzJUMjIxIDEwMlQyODIgNTdUMzcxIDQxWk01MjMgNzA2TDM3NiA4MTBMNDQwIDg0Mkw1NTcgNzI4TDUyMyA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMzsiIGhvcml6LWFkdi14PSI3MzIiIGQ9Ik03MTUgNDEyUTcxNSAzMzEgNjk0IDI1NVQ2MzAgMTIwVDUyMCAyNVQzNjQgLTExUTIzNiAtMTEgMTczIDYxVDEwOSAyNTZRMTA5IDMzNyAxMzAgNDEzVDE5NSA1NDhUMzA1IDY0MlQ0NjEgNjc4UTU4OCA2NzggNjUxIDYwN1Q3MTUgNDEyWk0zNzEgNDFRNDQ3IDQxIDUwMCA3NFQ1ODYgMTYxVDYzNCAyODBUNjQ5IDQxMVE2NDkgNDU5IDYzOCA0OTlUNjA0IDU2N1Q1NDMgNjExVDQ1NCA2MjdRMzc4IDYyNyAzMjUgNTk0VDIzOSA1MDlUMTkxIDM5MVQxNzYgMjYwUTE3NiAyMTIgMTg3IDE3MlQyMjEgMTAyVDI4MiA1N1QzNzEgNDFaTTQ0MSA3MDZMNDEzIDczMEw1NjUgODQ1TDYxOCA4MTJMNDQxIDcwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTcxNSA0MTJRNzE1IDMzMSA2OTQgMjU1VDYzMCAxMjBUNTIwIDI1VDM2NCAtMTFRMjM2IC0xMSAxNzMgNjFUMTA5IDI1NlExMDkgMzM3IDEzMCA0MTNUMTk1IDU0OFQzMDUgNjQyVDQ2MSA2NzhRNTg4IDY3OCA2NTEgNjA3VDcxNSA0MTJaTTM3MSA0MVE0NDcgNDEgNTAwIDc0VDU4NiAxNjFUNjM0IDI4MFQ2NDkgNDExUTY0OSA0NTkgNjM4IDQ5OVQ2MDQgNTY3VDU0MyA2MTFUNDU0IDYyN1EzNzggNjI3IDMyNSA1OTRUMjM5IDUwOVQxOTEgMzkxVDE3NiAyNjBRMTc2IDIxMiAxODcgMTcyVDIyMSAxMDJUMjgyIDU3VDM3MSA0MVpNNTgzIDcwNEw0NzkgNzg2TDM1NCA3MDRMMzMyIDczOUw0ODcgODM4TDYxNiA3MzlMNTgzIDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ1OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTcxNSA0MTJRNzE1IDMzMSA2OTQgMjU1VDYzMCAxMjBUNTIwIDI1VDM2NCAtMTFRMjM2IC0xMSAxNzMgNjFUMTA5IDI1NlExMDkgMzM3IDEzMCA0MTNUMTk1IDU0OFQzMDUgNjQyVDQ2MSA2NzhRNTg4IDY3OCA2NTEgNjA3VDcxNSA0MTJaTTM3MSA0MVE0NDcgNDEgNTAwIDc0VDU4NiAxNjFUNjM0IDI4MFQ2NDkgNDExUTY0OSA0NTkgNjM4IDQ5OVQ2MDQgNTY3VDU0MyA2MTFUNDU0IDYyN1EzNzggNjI3IDMyNSA1OTRUMjM5IDUwOVQxOTEgMzkxVDE3NiAyNjBRMTc2IDIxMiAxODcgMTcyVDIyMSAxMDJUMjgyIDU3VDM3MSA0MVpNNjI0IDc3NVE2MTAgNzQzIDU4MyA3MjhUNTI5IDcxM1E1MTMgNzEzIDQ5NyA3MTlUNDY1IDczMlQ0MzQgNzQ1VDQwNiA3NTFRMzkwIDc1MSAzNzMgNzQ0VDM0NCA3MTJMMzEyIDczNVEzMzMgNzcxIDM1OCA3ODRUNDA5IDc5N1E0MjUgNzk3IDQ0MSA3OTFUNDczIDc3OFQ1MDMgNzY1VDUzMiA3NTlRNTQ5IDc1OSA1NjQgNzY3VDU5MSA3OTdMNjI0IDc3NUg2MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENjsiIGhvcml6LWFkdi14PSI3MzIiIGQ9Ik03MTUgNDEyUTcxNSAzMzEgNjk0IDI1NVQ2MzAgMTIwVDUyMCAyNVQzNjQgLTExUTIzNiAtMTEgMTczIDYxVDEwOSAyNTZRMTA5IDMzNyAxMzAgNDEzVDE5NSA1NDhUMzA1IDY0MlQ0NjEgNjc4UTU4OCA2NzggNjUxIDYwN1Q3MTUgNDEyWk0zNzEgNDFRNDQ3IDQxIDUwMCA3NFQ1ODYgMTYxVDYzNCAyODBUNjQ5IDQxMVE2NDkgNDU5IDYzOCA0OTlUNjA0IDU2N1Q1NDMgNjExVDQ1NCA2MjdRMzc4IDYyNyAzMjUgNTk0VDIzOSA1MDlUMTkxIDM5MVQxNzYgMjYwUTE3NiAyMTIgMTg3IDE3MlQyMjEgMTAyVDI4MiA1N1QzNzEgNDFaTTU5NSA3NjBRNTk1IDc0MSA1ODEgNzI3VDU0OCA3MTNRNTMzIDcxMyA1MjMgNzIzVDUxMyA3NDlRNTEzIDc2NyA1MjcgNzgxVDU2MCA3OTVRNTc1IDc5NSA1ODUgNzg1VDU5NSA3NjBaTTQyNiA3NTlRNDI2IDc0MSA0MTIgNzI3VDM3OSA3MTNRMzY0IDcxMyAzNTQgNzIzVDM0NCA3NDlRMzQ0IDc2NyAzNTggNzgxVDM5MSA3OTVRNDA2IDc5NSA0MTYgNzg1VDQyNiA3NTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENzsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik01MTcgNDAwTDM1MCAyNTRMNDgxIDEwMkw0MzcgNjRMMzA3IDIxNkwxMzIgNjRMMTAxIDEwMkwyNzUgMjU0TDE1MCAzOTlMMTkzIDQzOEwzMTkgMjkyTDQ4NSA0MzhMNTE3IDQwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ4OyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTcxNSA0MTVRNzE1IDMzNCA2OTUgMjU3VDYzMiAxMjFUNTIzIDI1VDM2NyAtMTFRMzE5IC0xMSAyNzIgMVQxODggNDVMMTI4IC0yM0w5NSAxMkwxNTYgODFRMTI5IDExOSAxMjAgMTY1VDExMCAyNTZRMTEwIDMzNyAxMzEgNDEzVDE5NiA1NDhUMzA2IDY0MlQ0NjIgNjc4UTUwNyA2NzggNTQ5IDY2OFQ2MjcgNjMwTDY4MiA2OTRMNzE1IDY2MUw2NTkgNTk3UTY5MSA1NjAgNzAzIDUxMlQ3MTUgNDE1Wk0zNzIgNDFRNDQ3IDQxIDQ5OSA3M1Q1ODUgMTU4VDYzMyAyNzVUNjQ4IDQwNVE2NDggNDQzIDY0MiA0ODNUNjE0IDU1NEwyMzIgOTFRMjYwIDY0IDI5NSA1M1QzNzIgNDFaTTQ1NCA2MjdRMzgwIDYyNyAzMjggNTk1VDI0MiA1MTFUMTkzIDM5NVQxNzcgMjY1UTE3NyAyMzAgMTgzIDE5NlQyMDcgMTMwTDU4NCA1ODVRNTU2IDYwOSA1MjMgNjE4VDQ1NCA2MjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGhvcml6LWFkdi14PSI2NTIiIGQ9Ik01OTUgMjU1UTU3NSAxMTQgNTA5IDUyVDMyMyAtMTFRMjIwIC0xMSAxNzEgMzRUMTIxIDE3OVExMjEgMjEzIDEyNyAyNTVMMTg1IDY2N0gyNDhMMTg5IDI0MlExODcgMjI3IDE4NiAyMTNUMTg1IDE4NlExODUgMTIwIDIxNyA4MVQzMzEgNDJRMzc5IDQyIDQxNCA1NlQ0NzMgOTdUNTExIDE2MFQ1MzEgMjQyTDU5MCA2NjdINjUzTDU5NSAyNTVINTk1Wk00MzcgNzA1TDI5MCA4MDlMMzU0IDg0MUw0NzEgNzI3TDQzNyA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQTsiIGhvcml6LWFkdi14PSI2NTIiIGQ9Ik01OTUgMjU1UTU3NSAxMTQgNTA5IDUyVDMyMyAtMTFRMjIwIC0xMSAxNzEgMzRUMTIxIDE3OVExMjEgMjEzIDEyNyAyNTVMMTg1IDY2N0gyNDhMMTg5IDI0MlExODcgMjI3IDE4NiAyMTNUMTg1IDE4NlExODUgMTIwIDIxNyA4MVQzMzEgNDJRMzc5IDQyIDQxNCA1NlQ0NzMgOTdUNTExIDE2MFQ1MzEgMjQyTDU5MCA2NjdINjUzTDU5NSAyNTVINTk1Wk00MTYgNzA1TDM4OCA3MjlMNTQwIDg0NEw1OTMgODExTDQxNiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQjsiIGhvcml6LWFkdi14PSI2NTIiIGQ9Ik01OTUgMjU1UTU3NSAxMTQgNTA5IDUyVDMyMyAtMTFRMjIwIC0xMSAxNzEgMzRUMTIxIDE3OVExMjEgMjEzIDEyNyAyNTVMMTg1IDY2N0gyNDhMMTg5IDI0MlExODcgMjI3IDE4NiAyMTNUMTg1IDE4NlExODUgMTIwIDIxNyA4MVQzMzEgNDJRMzc5IDQyIDQxNCA1NlQ0NzMgOTdUNTExIDE2MFQ1MzEgMjQyTDU5MCA2NjdINjUzTDU5NSAyNTVINTk1Wk01NDEgNzA0TDQzNyA3ODZMMzEyIDcwNEwyOTAgNzM5TDQ0NSA4MzhMNTc0IDczOUw1NDEgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REM7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTk1IDI1NVE1NzUgMTE0IDUwOSA1MlQzMjMgLTExUTIyMCAtMTEgMTcxIDM0VDEyMSAxNzlRMTIxIDIxMyAxMjcgMjU1TDE4NSA2NjdIMjQ4TDE4OSAyNDJRMTg3IDIyNyAxODYgMjEzVDE4NSAxODZRMTg1IDEyMCAyMTcgODFUMzMxIDQyUTM3OSA0MiA0MTQgNTZUNDczIDk3VDUxMSAxNjBUNTMxIDI0Mkw1OTAgNjY3SDY1M0w1OTUgMjU1SDU5NVpNNTU4IDc2MFE1NTggNzQxIDU0NCA3MjdUNTExIDcxM1E0OTYgNzEzIDQ4NiA3MjNUNDc2IDc0OVE0NzYgNzY3IDQ5MCA3ODFUNTIzIDc5NVE1MzggNzk1IDU0OCA3ODVUNTU4IDc2MFpNMzg5IDc1OVEzODkgNzQxIDM3NSA3MjdUMzQyIDcxM1EzMjcgNzEzIDMxNyA3MjNUMzA3IDc0OVEzMDcgNzY3IDMyMSA3ODFUMzU0IDc5NVEzNjkgNzk1IDM3OSA3ODVUMzg5IDc1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEREOyIgaG9yaXotYWR2LXg9IjUzMyIgZD0iTTMzNiAyNjdMMjk5IDBIMjM1TDI3MiAyNjRMMTExIDY2N0gxODFMMzEyIDMyM0w1MzkgNjY3SDYwOEwzMzYgMjY3Wk0zNTcgNzAxTDMyOSA3MjVMNDgxIDg0MEw1MzQgODA3TDM1NyA3MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERTsiIGhvcml6LWFkdi14PSI1ODUiIGQ9Ik01NzggMzg5UTU3OCAzMzQgNTY0IDI4OFQ1MjAgMjA4VDQ0NSAxNTVUMzM4IDEzNkgxNzRMMTU1IDBIOTJMMTg1IDY2N0gyNDdMMjMwIDU0MlEyNjcgNTQ1IDI5OCA1NDZUMzY0IDU0OFE0MTMgNTQ4IDQ1MiA1NDFUNTIwIDUxNVQ1NjMgNDY2VDU3OCAzODlaTTMyOSAxODhRNDI0IDE5MCA0NjggMjM0VDUxMyAzODBRNTEzIDQxMyA1MDMgNDM1VDQ3MyA0NzBUNDIzIDQ4OFQzNTQgNDk0UTMxOSA0OTQgMjg5IDQ5M1QyMjMgNDg3TDE4MSAxODhIMzI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REY7IiBob3Jpei1hZHYteD0iNTAyIiBkPSJNNDgzIDE5NVE0ODMgMTUzIDQ3MCAxMTZUNDMxIDUwVDM3MCA2VDI5MSAtMTFRMjc0IC0xMSAyNTAgLTlUMjA5IDJMMjI2IDQ4UTI0MSA0MyAyNTYgNDBUMjg4IDM2UTMyMSAzNiAzNDYgNDhUMzg3IDgxVDQxMiAxMjlUNDIwIDE4OVE0MjAgMjIyIDQwOCAyNDdUMzc1IDI5M1QzMjkgMzI3VDI3NiAzNTRMMjc0IDM5N1EzMDEgNDEzIDMyNyA0MzFUMzczIDQ3MlQ0MDYgNTIyVDQxOSA1ODVRNDE5IDYyNiAzOTUgNjQyVDMzMiA2NTlRMjc1IDY1OSAyNTAgNjI5VDIxNyA1NDVMMTQxIDBIODJMMTU5IDU1MFExODEgNzA1IDM0MSA3MDVRMzY5IDcwNSAzOTMgNjk5VDQzNSA2ODBUNDYzIDY0NlQ0NzQgNTk0UTQ3NCA1NTcgNDY0IDUyOFQ0MzQgNDczVDM5MCA0MjhUMzM1IDM4OVYzODVRMzY1IDM3MSAzOTIgMzU0VDQzOSAzMTNUNDcxIDI2MFQ0ODMgMTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTA7IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDE3IDBMNDI0IDgySDQyMFEzODkgMzYgMzQ4IDEzVDI1MiAtMTFRMjA2IC0xMSAxNzUgM1QxMjQgNDNUOTYgMTAyVDg3IDE3N1E4NyAyMjkgOTcgMjg4VDEzNCAzOTdUMjA3IDQ4MVQzMjcgNTE1UTM3NCA1MTUgNDA4IDQ5OVQ0NjYgNDM4SDQ3MEw0ODQgNTAySDUzOUw0NjggMEg0MTdaTTQ1NSAzMzFRNDY1IDM5OCA0MjkgNDMyVDMzMSA0NjdRMjc0IDQ2NyAyMzkgNDQwVDE4MyAzNzJUMTU2IDI4MFQxNDkgMTg0UTE0OSAxNTUgMTU0IDEyOFQxNzQgODFUMjExIDQ4VDI3MSAzNVEzMDUgMzUgMzMzIDQ4VDM4MyA4M1Q0MTggMTM1VDQzNiAxOTdMNDU1IDMzMVpNMzc1IDU2NUwyMjggNjY5TDI5MiA3MDFMNDA5IDU4N0wzNzUgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDE3IDBMNDI0IDgySDQyMFEzODkgMzYgMzQ4IDEzVDI1MiAtMTFRMjA2IC0xMSAxNzUgM1QxMjQgNDNUOTYgMTAyVDg3IDE3N1E4NyAyMjkgOTcgMjg4VDEzNCAzOTdUMjA3IDQ4MVQzMjcgNTE1UTM3NCA1MTUgNDA4IDQ5OVQ0NjYgNDM4SDQ3MEw0ODQgNTAySDUzOUw0NjggMEg0MTdaTTQ1NSAzMzFRNDY1IDM5OCA0MjkgNDMyVDMzMSA0NjdRMjc0IDQ2NyAyMzkgNDQwVDE4MyAzNzJUMTU2IDI4MFQxNDkgMTg0UTE0OSAxNTUgMTU0IDEyOFQxNzQgODFUMjExIDQ4VDI3MSAzNVEzMDUgMzUgMzMzIDQ4VDM4MyA4M1Q0MTggMTM1VDQzNiAxOTdMNDU1IDMzMVpNMzA1IDU2NUwyNzcgNTg5TDQyOSA3MDRMNDgyIDY3MUwzMDUgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTI7IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDE3IDBMNDI0IDgySDQyMFEzODkgMzYgMzQ4IDEzVDI1MiAtMTFRMjA2IC0xMSAxNzUgM1QxMjQgNDNUOTYgMTAyVDg3IDE3N1E4NyAyMjkgOTcgMjg4VDEzNCAzOTdUMjA3IDQ4MVQzMjcgNTE1UTM3NCA1MTUgNDA4IDQ5OVQ0NjYgNDM4SDQ3MEw0ODQgNTAySDUzOUw0NjggMEg0MTdaTTQ1NSAzMzFRNDY1IDM5OCA0MjkgNDMyVDMzMSA0NjdRMjc0IDQ2NyAyMzkgNDQwVDE4MyAzNzJUMTU2IDI4MFQxNDkgMTg0UTE0OSAxNTUgMTU0IDEyOFQxNzQgODFUMjExIDQ4VDI3MSAzNVEzMDUgMzUgMzMzIDQ4VDM4MyA4M1Q0MTggMTM1VDQzNiAxOTdMNDU1IDMzMVpNNDQ2IDU2M0wzNDIgNjQ1TDIxNyA1NjNMMTk1IDU5OEwzNTAgNjk3TDQ3OSA1OThMNDQ2IDU2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUzOyIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQyNCA4Mkg0MjBRMzg5IDM2IDM0OCAxM1QyNTIgLTExUTIwNiAtMTEgMTc1IDNUMTI0IDQzVDk2IDEwMlQ4NyAxNzdRODcgMjI5IDk3IDI4OFQxMzQgMzk3VDIwNyA0ODFUMzI3IDUxNVEzNzQgNTE1IDQwOCA0OTlUNDY2IDQzOEg0NzBMNDg0IDUwMkg1MzlMNDY4IDBINDE3Wk00NTUgMzMxUTQ2NSAzOTggNDI5IDQzMlQzMzEgNDY3UTI3NCA0NjcgMjM5IDQ0MFQxODMgMzcyVDE1NiAyODBUMTQ5IDE4NFExNDkgMTU1IDE1NCAxMjhUMTc0IDgxVDIxMSA0OFQyNzEgMzVRMzA1IDM1IDMzMyA0OFQzODMgODNUNDE4IDEzNVQ0MzYgMTk3TDQ1NSAzMzFaTTQ5MSA2MzRRNDc3IDYwMiA0NTAgNTg3VDM5NiA1NzJRMzgwIDU3MiAzNjQgNTc4VDMzMiA1OTFUMzAxIDYwNFQyNzMgNjEwUTI1NyA2MTAgMjQwIDYwM1QyMTEgNTcxTDE3OSA1OTRRMjAwIDYzMCAyMjUgNjQzVDI3NiA2NTZRMjkyIDY1NiAzMDggNjUwVDM0MCA2MzdUMzcwIDYyNFQzOTkgNjE4UTQxNiA2MTggNDMxIDYyNlQ0NTggNjU2TDQ5MSA2MzRINDkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTQ7IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDE3IDBMNDI0IDgySDQyMFEzODkgMzYgMzQ4IDEzVDI1MiAtMTFRMjA2IC0xMSAxNzUgM1QxMjQgNDNUOTYgMTAyVDg3IDE3N1E4NyAyMjkgOTcgMjg4VDEzNCAzOTdUMjA3IDQ4MVQzMjcgNTE1UTM3NCA1MTUgNDA4IDQ5OVQ0NjYgNDM4SDQ3MEw0ODQgNTAySDUzOUw0NjggMEg0MTdaTTQ1NSAzMzFRNDY1IDM5OCA0MjkgNDMyVDMzMSA0NjdRMjc0IDQ2NyAyMzkgNDQwVDE4MyAzNzJUMTU2IDI4MFQxNDkgMTg0UTE0OSAxNTUgMTU0IDEyOFQxNzQgODFUMjExIDQ4VDI3MSAzNVEzMDUgMzUgMzMzIDQ4VDM4MyA4M1Q0MTggMTM1VDQzNiAxOTdMNDU1IDMzMVpNNDcxIDYyMFE0NzEgNjAxIDQ1NyA1ODdUNDI0IDU3M1E0MDkgNTczIDM5OSA1ODNUMzg5IDYwOVEzODkgNjI3IDQwMyA2NDFUNDM2IDY1NVE0NTEgNjU1IDQ2MSA2NDVUNDcxIDYyMFpNMzAyIDYxOVEzMDIgNjAxIDI4OCA1ODdUMjU1IDU3M1EyNDAgNTczIDIzMCA1ODNUMjIwIDYwOVEyMjAgNjI3IDIzNCA2NDFUMjY3IDY1NVEyODIgNjU1IDI5MiA2NDVUMzAyIDYxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU1OyIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQyNCA4Mkg0MjBRMzg5IDM2IDM0OCAxM1QyNTIgLTExUTIwNiAtMTEgMTc1IDNUMTI0IDQzVDk2IDEwMlQ4NyAxNzdRODcgMjI5IDk3IDI4OFQxMzQgMzk3VDIwNyA0ODFUMzI3IDUxNVEzNzQgNTE1IDQwOCA0OTlUNDY2IDQzOEg0NzBMNDg0IDUwMkg1MzlMNDY4IDBINDE3Wk00NTUgMzMxUTQ2NSAzOTggNDI5IDQzMlQzMzEgNDY3UTI3NCA0NjcgMjM5IDQ0MFQxODMgMzcyVDE1NiAyODBUMTQ5IDE4NFExNDkgMTU1IDE1NCAxMjhUMTc0IDgxVDIxMSA0OFQyNzEgMzVRMzA1IDM1IDMzMyA0OFQzODMgODNUNDE4IDEzNVQ0MzYgMTk3TDQ1NSAzMzFaTTQzOSA2NTRRNDM5IDYzNCA0MzIgNjE3VDQxMSA1ODdUMzc5IDU2NlQzMzkgNTU4UTMwNyA1NTggMjg1IDU3N1QyNjIgNjMwUTI2MiA2NTAgMjcwIDY2N1QyOTEgNjk4VDMyMyA3MThUMzYzIDcyNlEzOTUgNzI2IDQxNyA3MDdUNDM5IDY1NFpNMzQzIDU4N1EzNzEgNTg3IDM4OCA2MDVUNDA2IDY1MFE0MDYgNjcwIDM5NCA2ODNUMzU5IDY5N1EzMzAgNjk3IDMxMyA2NzlUMjk1IDYzNFEyOTUgNjE0IDMwNyA2MDFUMzQzIDU4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU2OyIgaG9yaXotYWR2LXg9Ijg0MCIgZD0iTTgyNyAzMjZRODI3IDMwMyA4MjUgMjc5VDgxNyAyMzJINDY0UTQ2MSAyMDkgNDYxIDE4OFE0NjEgMTIwIDQ5NCA3OVQ1OTkgMzhRNjQxIDM4IDY4MSA1M1Q3NTQgOTVMNzcyIDUxUTczMyAyMiA2ODggNlQ1OTMgLTExUTUzOSAtMTEgNDkzIDlUNDIxIDgxUTM3MyA0MSAzMTkgMTVUMjAxIC0xMVExNDMgLTExIDEwNSAyMFQ2NiAxMTNRNjYgMTU5IDgyIDE5MlQxMjQgMjQ5VDE4NiAyODdUMjYwIDMwOVQzMzggMzE5VDQxMyAzMjJRNDE1IDMzOSA0MTcgMzU2VDQyMCAzOTBRNDIwIDQzNSAzOTggNDUwVDMzNCA0NjZRMjg0IDQ2NiAyMzUgNDQ5VDE0MyA0MDVMMTI4IDQ1MVExNzkgNDc5IDIzMCA0OTdUMzQxIDUxNVEzNjcgNTE1IDM5MCA1MTFUNDMxIDQ5NVQ0NjAgNDY1VDQ3MyA0MTZRNTA2IDQ2MyA1NTMgNDg5VDY1NyA1MTVRNzAxIDUxNSA3MzMgNTAxVDc4NiA0NjNUODE3IDQwM1Q4MjcgMzI2Wk03NjcgMjc3UTc3MCAzMDEgNzcwIDMyNVE3NzAgMzU2IDc2NCAzODJUNzQzIDQyN1Q3MDUgNDU2VDY0OCA0NjdRNjA5IDQ2NyA1NzggNDUxVDUyNCA0MDdUNDg3IDM0NlQ0NjggMjc3SDc2N1pNNDA3IDExNlE0MDIgMTMxIDQwMCAxNDhUMzk4IDE4MVEzOTggMjMwIDQwNyAyODBRMzY5IDI4MCAzMjEgMjc2VDIzMCAyNTVUMTU4IDIwOVQxMjggMTI3UTEyOCA4MCAxNTMgNTZUMjE5IDMyUTI0NyAzMiAyNzMgMzlUMzIyIDU5VDM2NyA4NlQ0MDcgMTE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTc7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNMzQ4IC0xMTRRMzQ4IC0xNTMgMzIxIC0xNzlUMjQ0IC0yMDVRMjIyIC0yMDUgMjAxIC0xOTlUMTY2IC0xODNMMTg0IC0xNTRRMTk4IC0xNjMgMjEyIC0xNjhUMjQ3IC0xNzRRMjU3IC0xNzQgMjY3IC0xNzJUMjg3IC0xNjNUMzAxIC0xNDZUMzA3IC0xMjFRMzA3IC0xMDEgMjkzIC05NFQyNTkgLTg2UTIzOSAtODYgMjIyIC05MUwyMTEgLTc1TDI1NSAtMTBRMjExIC03IDE4MCA5VDEyOCA1M1Q5OCAxMTVUODggMTkyUTg4IDI1MSAxMDQgMzA5VDE1NCA0MTJUMjM3IDQ4NlQzNTUgNTE1UTQwMiA1MTUgNDQxIDQ5OVQ1MTIgNDU2TDQ3OSA0MTFRNDU2IDQzNyA0MjQgNDUxVDM1MCA0NjZRMjk5IDQ2NiAyNjEgNDQzVDE5OSAzODNUMTYyIDI5N1QxNTAgMTk4UTE1MCAxNjYgMTU3IDEzN1QxODAgODZUMjIzIDUxVDI5MCAzOFEzMzEgMzggMzY1IDUxVDQzNyA5NEw0NTMgNTBRNDE1IDI0IDM3NyA4VDI5MiAtMTFMMjU4IC01OUwyNjAgLTYyUTI2NiAtNjAgMjcyIC01OVQyODUgLTU4UTMxNCAtNTggMzMxIC03MVQzNDggLTExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU4OyIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTUxNCAzMjZRNTE0IDMwMyA1MTIgMjc5VDUwNCAyMzJIMTUwUTE0NyAyMDggMTQ3IDE4NlExNDcgMTE2IDE4MSA3NlQyODYgMzZRMzIxIDM2IDM1OCA0OFQ0NDMgOTNMNDYwIDUwUTQxMiAxNiAzNjcgM1QyNzcgLTExUTE4MiAtMTEgMTM1IDQxVDg4IDE4OFE4OCAyNDMgMTAyIDMwMVQxNDggNDA2VDIyOCA0ODRUMzQ5IDUxNVE0MzEgNTE1IDQ3MiA0NjNUNTE0IDMyNlpNNDU0IDI3NlE0NTYgMjg4IDQ1NyAzMDBUNDU4IDMyNFE0NTggMzU0IDQ1MiAzODBUNDMyIDQyN1QzOTYgNDU4VDM0MyA0NzBRMjk2IDQ3MCAyNjMgNDUyVDIwOCA0MDZUMTc0IDM0NFQxNTcgMjc2SDQ1NFpNMzgyIDU2NUwyMzUgNjY5TDI5OSA3MDFMNDE2IDU4N0wzODIgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTk7IiBob3Jpei1hZHYteD0iNTI3IiBkPSJNNTE0IDMyNlE1MTQgMzAzIDUxMiAyNzlUNTA0IDIzMkgxNTBRMTQ3IDIwOCAxNDcgMTg2UTE0NyAxMTYgMTgxIDc2VDI4NiAzNlEzMjEgMzYgMzU4IDQ4VDQ0MyA5M0w0NjAgNTBRNDEyIDE2IDM2NyAzVDI3NyAtMTFRMTgyIC0xMSAxMzUgNDFUODggMTg4UTg4IDI0MyAxMDIgMzAxVDE0OCA0MDZUMjI4IDQ4NFQzNDkgNTE1UTQzMSA1MTUgNDcyIDQ2M1Q1MTQgMzI2Wk00NTQgMjc2UTQ1NiAyODggNDU3IDMwMFQ0NTggMzI0UTQ1OCAzNTQgNDUyIDM4MFQ0MzIgNDI3VDM5NiA0NThUMzQzIDQ3MFEyOTYgNDcwIDI2MyA0NTJUMjA4IDQwNlQxNzQgMzQ0VDE1NyAyNzZINDU0Wk0zMzQgNTY1TDMwNiA1ODlMNDU4IDcwNEw1MTEgNjcxTDMzNCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQTsiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik01MTQgMzI2UTUxNCAzMDMgNTEyIDI3OVQ1MDQgMjMySDE1MFExNDcgMjA4IDE0NyAxODZRMTQ3IDExNiAxODEgNzZUMjg2IDM2UTMyMSAzNiAzNTggNDhUNDQzIDkzTDQ2MCA1MFE0MTIgMTYgMzY3IDNUMjc3IC0xMVExODIgLTExIDEzNSA0MVQ4OCAxODhRODggMjQzIDEwMiAzMDFUMTQ4IDQwNlQyMjggNDg0VDM0OSA1MTVRNDMxIDUxNSA0NzIgNDYzVDUxNCAzMjZaTTQ1NCAyNzZRNDU2IDI4OCA0NTcgMzAwVDQ1OCAzMjRRNDU4IDM1NCA0NTIgMzgwVDQzMiA0MjdUMzk2IDQ1OFQzNDMgNDcwUTI5NiA0NzAgMjYzIDQ1MlQyMDggNDA2VDE3NCAzNDRUMTU3IDI3Nkg0NTRaTTQ2OCA1NjRMMzY0IDY0NkwyMzkgNTY0TDIxNyA1OTlMMzcyIDY5OEw1MDEgNTk5TDQ2OCA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik01MTQgMzI2UTUxNCAzMDMgNTEyIDI3OVQ1MDQgMjMySDE1MFExNDcgMjA4IDE0NyAxODZRMTQ3IDExNiAxODEgNzZUMjg2IDM2UTMyMSAzNiAzNTggNDhUNDQzIDkzTDQ2MCA1MFE0MTIgMTYgMzY3IDNUMjc3IC0xMVExODIgLTExIDEzNSA0MVQ4OCAxODhRODggMjQzIDEwMiAzMDFUMTQ4IDQwNlQyMjggNDg0VDM0OSA1MTVRNDMxIDUxNSA0NzIgNDYzVDUxNCAzMjZaTTQ1NCAyNzZRNDU2IDI4OCA0NTcgMzAwVDQ1OCAzMjRRNDU4IDM1NCA0NTIgMzgwVDQzMiA0MjdUMzk2IDQ1OFQzNDMgNDcwUTI5NiA0NzAgMjYzIDQ1MlQyMDggNDA2VDE3NCAzNDRUMTU3IDI3Nkg0NTRaTTQ4NSA2MjBRNDg1IDYwMSA0NzEgNTg3VDQzOCA1NzNRNDIzIDU3MyA0MTMgNTgzVDQwMyA2MDlRNDAzIDYyNyA0MTcgNjQxVDQ1MCA2NTVRNDY1IDY1NSA0NzUgNjQ1VDQ4NSA2MjBaTTMxNiA2MTlRMzE2IDYwMSAzMDIgNTg3VDI2OSA1NzNRMjU0IDU3MyAyNDQgNTgzVDIzNCA2MDlRMjM0IDYyNyAyNDggNjQxVDI4MSA2NTVRMjk2IDY1NSAzMDYgNjQ1VDMxNiA2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQzsiIGhvcml6LWFkdi14PSIyMjMiIGQ9Ik04MiAwTDE1MiA1MDJIMjExTDE0MSAwSDgyWk0yMjMgNTY1TDc2IDY2OUwxNDAgNzAxTDI1NyA1ODdMMjIzIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVEOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTgyIDBMMTUyIDUwMkgyMTFMMTQxIDBIODJaTTE2NiA1NjVMMTM4IDU4OUwyOTAgNzA0TDM0MyA2NzFMMTY2IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVFOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTgyIDBMMTUyIDUwMkgyMTFMMTQxIDBIODJaTTMwOCA1NjRMMjA0IDY0Nkw3OSA1NjRMNTcgNTk5TDIxMiA2OThMMzQxIDU5OUwzMDggNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUY7IiBob3Jpei1hZHYteD0iMjIzIiBkPSJNODIgMEwxNTIgNTAySDIxMUwxNDEgMEg4MlpNMzI2IDYyMFEzMjYgNjAxIDMxMiA1ODdUMjc5IDU3M1EyNjQgNTczIDI1NCA1ODNUMjQ0IDYwOVEyNDQgNjI3IDI1OCA2NDFUMjkxIDY1NVEzMDYgNjU1IDMxNiA2NDVUMzI2IDYyMFpNMTU3IDYxOVExNTcgNjAxIDE0MyA1ODdUMTEwIDU3M1E5NSA1NzMgODUgNTgzVDc1IDYwOVE3NSA2MjcgODkgNjQxVDEyMiA2NTVRMTM3IDY1NSAxNDcgNjQ1VDE1NyA2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMDsiIGhvcml6LWFkdi14PSI1MzIiIGQ9Ik00NjcgNjE5UTQ5NiA1NjUgNTA4IDUwOVQ1MjAgMzkyUTUyMCAzNDggNTE2IDMwMlQ1MDIgMjEwVDQ3MyAxMjVUNDI1IDU1VDM1NiA4VDI2MCAtMTBRMjE0IC0xMCAxODIgNFQxMjggNDRUOTcgMTA1VDg3IDE4NFE4NyAyMzcgOTggMjkyVDEzNiAzOTNUMjEwIDQ2OFQzMjcgNDk3UTM3MSA0OTcgNDA1IDQ4M1Q0NjAgNDI2SDQ2NFE0NjEgNDcxIDQ0OCA1MTRUNDE1IDU5NkwzMDMgNTQwTDI5MCA1NzRMMzk2IDYyOFEzODQgNjQ2IDM3MSA2NjNUMzQ0IDY5OEwzOTggNzExUTQxMiA2OTcgNDI0IDY4MlQ0NDcgNjUxTDUzNiA3MDBMNTUwIDY2NUw0NjcgNjE5Wk0yNzIgMzhRMzI3IDM4IDM2MiA2NlQ0MTggMTM2VDQ0NSAyMjhUNDUzIDMyMlE0NTMgMzg3IDQyNCA0MTlUMzI3IDQ1MlEyNzMgNDUyIDIzOCA0MjhUMTgzIDM2NFQxNTYgMjc4VDE0OCAxODZRMTQ4IDE1NCAxNTQgMTI3VDE3NSA4MVQyMTMgNTBUMjcyIDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjE7IiBob3Jpei1hZHYteD0iNTQ4IiBkPSJNNDA3IDBMNDQ5IDMwMVE0NTUgMzM4IDQ1NSAzNjhRNDU1IDM5MCA0NTEgNDA3VDQzNCA0MzdUNDAyIDQ1NlQzNTEgNDYzUTI4MCA0NjMgMjM4IDQyNlQxODYgMzIzTDE0MSAwSDgyTDE1MiA1MDJIMjAzTDIwMCA0MzdIMjA0UTI2NCA1MTUgMzY5IDUxNVE0MTEgNTE1IDQzOSA1MDdUNDg0IDQ4MlQ1MDkgNDQyVDUxNiAzODdRNTE2IDM1NiA1MTAgMzE5TDQ2NiAwSDQwN1pNNTE5IDYzNFE1MDUgNjAyIDQ3OCA1ODdUNDI0IDU3MlE0MDggNTcyIDM5MiA1NzhUMzYwIDU5MVQzMjkgNjA0VDMwMSA2MTBRMjg1IDYxMCAyNjggNjAzVDIzOSA1NzFMMjA3IDU5NFEyMjggNjMwIDI1MyA2NDNUMzA0IDY1NlEzMjAgNjU2IDMzNiA2NTBUMzY4IDYzN1QzOTggNjI0VDQyNyA2MThRNDQ0IDYxOCA0NTkgNjI2VDQ4NiA2NTZMNTE5IDYzNEg1MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMjsiIGhvcml6LWFkdi14PSI1NTkiIGQ9Ik04OCAxOTBRODggMjUxIDEwMyAzMDlUMTUxIDQxM1QyMzMgNDg3VDM1MSA1MTVRMzk5IDUxNSA0MzUgNTAxVDQ5NCA0NTlUNTI4IDM5NVQ1NDAgMzExUTU0MCAyNTAgNTI1IDE5MlQ0NzcgODlUMzk1IDE3VDI3NyAtMTFRMTgxIC0xMSAxMzUgNDNUODggMTkwWk0zNDQgNDY3UTI4OCA0NjcgMjUxIDQ0MVQxOTIgMzc1VDE2MCAyODVUMTUwIDE4OVExNTAgMTU1IDE1NyAxMjdUMTgxIDc5VDIyMiA0N1QyODUgMzZRMzQwIDM2IDM3NyA2MlQ0MzcgMTI4VDQ2OCAyMTdUNDc4IDMxMlE0NzggMzQ2IDQ3MSAzNzRUNDQ4IDQyM1Q0MDcgNDU1VDM0NCA0NjdaTTM5MCA1NjVMMjQzIDY2OUwzMDcgNzAxTDQyNCA1ODdMMzkwIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYzOyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTg4IDE5MFE4OCAyNTEgMTAzIDMwOVQxNTEgNDEzVDIzMyA0ODdUMzUxIDUxNVEzOTkgNTE1IDQzNSA1MDFUNDk0IDQ1OVQ1MjggMzk1VDU0MCAzMTFRNTQwIDI1MCA1MjUgMTkyVDQ3NyA4OVQzOTUgMTdUMjc3IC0xMVExODEgLTExIDEzNSA0M1Q4OCAxOTBaTTM0NCA0NjdRMjg4IDQ2NyAyNTEgNDQxVDE5MiAzNzVUMTYwIDI4NVQxNTAgMTg5UTE1MCAxNTUgMTU3IDEyN1QxODEgNzlUMjIyIDQ3VDI4NSAzNlEzNDAgMzYgMzc3IDYyVDQzNyAxMjhUNDY4IDIxN1Q0NzggMzEyUTQ3OCAzNDYgNDcxIDM3NFQ0NDggNDIzVDQwNyA0NTVUMzQ0IDQ2N1pNMzM1IDU2NUwzMDcgNTg5TDQ1OSA3MDRMNTEyIDY3MUwzMzUgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjQ7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNODggMTkwUTg4IDI1MSAxMDMgMzA5VDE1MSA0MTNUMjMzIDQ4N1QzNTEgNTE1UTM5OSA1MTUgNDM1IDUwMVQ0OTQgNDU5VDUyOCAzOTVUNTQwIDMxMVE1NDAgMjUwIDUyNSAxOTJUNDc3IDg5VDM5NSAxN1QyNzcgLTExUTE4MSAtMTEgMTM1IDQzVDg4IDE5MFpNMzQ0IDQ2N1EyODggNDY3IDI1MSA0NDFUMTkyIDM3NVQxNjAgMjg1VDE1MCAxODlRMTUwIDE1NSAxNTcgMTI3VDE4MSA3OVQyMjIgNDdUMjg1IDM2UTM0MCAzNiAzNzcgNjJUNDM3IDEyOFQ0NjggMjE3VDQ3OCAzMTJRNDc4IDM0NiA0NzEgMzc0VDQ0OCA0MjNUNDA3IDQ1NVQzNDQgNDY3Wk00NzQgNTY0TDM3MCA2NDZMMjQ1IDU2NEwyMjMgNTk5TDM3OCA2OThMNTA3IDU5OUw0NzQgNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjU7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNODggMTkwUTg4IDI1MSAxMDMgMzA5VDE1MSA0MTNUMjMzIDQ4N1QzNTEgNTE1UTM5OSA1MTUgNDM1IDUwMVQ0OTQgNDU5VDUyOCAzOTVUNTQwIDMxMVE1NDAgMjUwIDUyNSAxOTJUNDc3IDg5VDM5NSAxN1QyNzcgLTExUTE4MSAtMTEgMTM1IDQzVDg4IDE5MFpNMzQ0IDQ2N1EyODggNDY3IDI1MSA0NDFUMTkyIDM3NVQxNjAgMjg1VDE1MCAxODlRMTUwIDE1NSAxNTcgMTI3VDE4MSA3OVQyMjIgNDdUMjg1IDM2UTM0MCAzNiAzNzcgNjJUNDM3IDEyOFQ0NjggMjE3VDQ3OCAzMTJRNDc4IDM0NiA0NzEgMzc0VDQ0OCA0MjNUNDA3IDQ1NVQzNDQgNDY3Wk01MjQgNjM0UTUxMCA2MDIgNDgzIDU4N1Q0MjkgNTcyUTQxMyA1NzIgMzk3IDU3OFQzNjUgNTkxVDMzNCA2MDRUMzA2IDYxMFEyOTAgNjEwIDI3MyA2MDNUMjQ0IDU3MUwyMTIgNTk0UTIzMyA2MzAgMjU4IDY0M1QzMDkgNjU2UTMyNSA2NTYgMzQxIDY1MFQzNzMgNjM3VDQwMyA2MjRUNDMyIDYxOFE0NDkgNjE4IDQ2NCA2MjZUNDkxIDY1Nkw1MjQgNjM0SDUyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY2OyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTg4IDE5MFE4OCAyNTEgMTAzIDMwOVQxNTEgNDEzVDIzMyA0ODdUMzUxIDUxNVEzOTkgNTE1IDQzNSA1MDFUNDk0IDQ1OVQ1MjggMzk1VDU0MCAzMTFRNTQwIDI1MCA1MjUgMTkyVDQ3NyA4OVQzOTUgMTdUMjc3IC0xMVExODEgLTExIDEzNSA0M1Q4OCAxOTBaTTM0NCA0NjdRMjg4IDQ2NyAyNTEgNDQxVDE5MiAzNzVUMTYwIDI4NVQxNTAgMTg5UTE1MCAxNTUgMTU3IDEyN1QxODEgNzlUMjIyIDQ3VDI4NSAzNlEzNDAgMzYgMzc3IDYyVDQzNyAxMjhUNDY4IDIxN1Q0NzggMzEyUTQ3OCAzNDYgNDcxIDM3NFQ0NDggNDIzVDQwNyA0NTVUMzQ0IDQ2N1pNNDk0IDYyMFE0OTQgNjAxIDQ4MCA1ODdUNDQ3IDU3M1E0MzIgNTczIDQyMiA1ODNUNDEyIDYwOVE0MTIgNjI3IDQyNiA2NDFUNDU5IDY1NVE0NzQgNjU1IDQ4NCA2NDVUNDk0IDYyMFpNMzI1IDYxOVEzMjUgNjAxIDMxMSA1ODdUMjc4IDU3M1EyNjMgNTczIDI1MyA1ODNUMjQzIDYwOVEyNDMgNjI3IDI1NyA2NDFUMjkwIDY1NVEzMDUgNjU1IDMxNSA2NDVUMzI1IDYxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY3OyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTg2IDIzMUw5NCAyODVINTQwTDUzMiAyMzFIODZaTTI1NCAxMDVRMjU0IDEyNCAyNjggMTM3VDMwMCAxNTFRMzE1IDE1MSAzMjUgMTQyVDMzNSAxMTdRMzM1IDk4IDMyMSA4NVQyODggNzFRMjczIDcxIDI2NCA4MVQyNTQgMTA1Wk0yOTUgMzk5UTI5NSA0MTggMzA4IDQzMlQzNDEgNDQ2UTM1NiA0NDYgMzY2IDQzN1QzNzcgNDExUTM3NyAzOTIgMzYzIDM3OVQzMzAgMzY2UTMxNiAzNjYgMzA2IDM3NVQyOTUgMzk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjg7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNODggMTkwUTg4IDI1MSAxMDMgMzA5VDE1MSA0MTNUMjMzIDQ4N1QzNTEgNTE1UTQzMiA1MTUgNDgwIDQ3M0w1NDAgNTM3TDU3MiA1MDlMNTA3IDQ0MVE1NDAgMzkwIDU0MCAzMTFRNTQwIDI1MCA1MjUgMTkyVDQ3NyA4OVQzOTUgMTdUMjc3IC0xMVEyMjggLTExIDE5MyAzVDEzMyA0NUw3NSAtMTZMNDcgMTJMMTEwIDgwUTg4IDEyNCA4OCAxOTBaTTQ3OCAzMTJRNDc4IDM2MSA0NjQgMzk1TDE3NCA4OFExOTAgNjMgMjE2IDUwVDI4NSAzNlEzNDAgMzYgMzc3IDYyVDQzNyAxMjhUNDY4IDIxN1Q0NzggMzEyWk0zNDQgNDY3UTI4OCA0NjcgMjUxIDQ0MVQxOTIgMzc1VDE2MCAyODVUMTUwIDE4OVExNTAgMTU0IDE1NyAxMjlMNDQxIDQzMlE0MjQgNDQ5IDQwMSA0NThUMzQ0IDQ2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY5OyIgaG9yaXotYWR2LXg9IjU0MCIgZD0iTTQwOSAwTDQxMCA2Nkg0MDZRMzg0IDM1IDM0NiAxMlQyNDMgLTExUTIxMCAtMTEgMTg0IC01VDE0MSAxN1QxMTQgNTlUMTA0IDEyNlExMDQgMTQxIDEwNSAxNTdUMTA5IDE5NEwxNTIgNTAySDIxMUwxNzQgMjM4UTE3MCAyMTAgMTY4IDE4N1QxNjUgMTQzUTE2NSA5MiAxODYgNjZUMjY0IDQwUTM0MCA0MCAzNzggODFUNDI1IDE4OEw0NjkgNTAySDUyOEw0NTggMEg0MDlaTTM1NyA1NjVMMjEwIDY2OUwyNzQgNzAxTDM5MSA1ODdMMzU3IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZBOyIgaG9yaXotYWR2LXg9IjU0MCIgZD0iTTQwOSAwTDQxMCA2Nkg0MDZRMzg0IDM1IDM0NiAxMlQyNDMgLTExUTIxMCAtMTEgMTg0IC01VDE0MSAxN1QxMTQgNTlUMTA0IDEyNlExMDQgMTQxIDEwNSAxNTdUMTA5IDE5NEwxNTIgNTAySDIxMUwxNzQgMjM4UTE3MCAyMTAgMTY4IDE4N1QxNjUgMTQzUTE2NSA5MiAxODYgNjZUMjY0IDQwUTM0MCA0MCAzNzggODFUNDI1IDE4OEw0NjkgNTAySDUyOEw0NTggMEg0MDlaTTMzNyA1NjVMMzA5IDU4OUw0NjEgNzA0TDUxNCA2NzFMMzM3IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCOyIgaG9yaXotYWR2LXg9IjU0MCIgZD0iTTQwOSAwTDQxMCA2Nkg0MDZRMzg0IDM1IDM0NiAxMlQyNDMgLTExUTIxMCAtMTEgMTg0IC01VDE0MSAxN1QxMTQgNTlUMTA0IDEyNlExMDQgMTQxIDEwNSAxNTdUMTA5IDE5NEwxNTIgNTAySDIxMUwxNzQgMjM4UTE3MCAyMTAgMTY4IDE4N1QxNjUgMTQzUTE2NSA5MiAxODYgNjZUMjY0IDQwUTM0MCA0MCAzNzggODFUNDI1IDE4OEw0NjkgNTAySDUyOEw0NTggMEg0MDlaTTQ2NiA1NjRMMzYyIDY0NkwyMzcgNTY0TDIxNSA1OTlMMzcwIDY5OEw0OTkgNTk5TDQ2NiA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQzsiIGhvcml6LWFkdi14PSI1NDAiIGQ9Ik00MDkgMEw0MTAgNjZINDA2UTM4NCAzNSAzNDYgMTJUMjQzIC0xMVEyMTAgLTExIDE4NCAtNVQxNDEgMTdUMTE0IDU5VDEwNCAxMjZRMTA0IDE0MSAxMDUgMTU3VDEwOSAxOTRMMTUyIDUwMkgyMTFMMTc0IDIzOFExNzAgMjEwIDE2OCAxODdUMTY1IDE0M1ExNjUgOTIgMTg2IDY2VDI2NCA0MFEzNDAgNDAgMzc4IDgxVDQyNSAxODhMNDY5IDUwMkg1MjhMNDU4IDBINDA5Wk00ODggNjIwUTQ4OCA2MDEgNDc0IDU4N1Q0NDEgNTczUTQyNiA1NzMgNDE2IDU4M1Q0MDYgNjA5UTQwNiA2MjcgNDIwIDY0MVQ0NTMgNjU1UTQ2OCA2NTUgNDc4IDY0NVQ0ODggNjIwWk0zMTkgNjE5UTMxOSA2MDEgMzA1IDU4N1QyNzIgNTczUTI1NyA1NzMgMjQ3IDU4M1QyMzcgNjA5UTIzNyA2MjcgMjUxIDY0MVQyODQgNjU1UTI5OSA2NTUgMzA5IDY0NVQzMTkgNjE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkQ7IiBob3Jpei1hZHYteD0iNDY2IiBkPSJNMjE3IC04OFExOTcgLTEyOCAxODAgLTE1NFQxNDQgLTE5N1QxMDUgLTIxOVQ1NyAtMjI2UTQ5IC0yMjYgMzcgLTIyNlQxNCAtMjI0TDIxIC0xNzJRMzAgLTE3NCAzOCAtMTc0VDU4IC0xNzRRNzcgLTE3NCA5MSAtMTY5VDExOCAtMTUxVDE0NSAtMTEzVDE3OCAtNDlMMjExIDIxTDkzIDUwMkgxNTdMMjUwIDg5SDI1NEw0NTAgNTAySDUxM0wyMTcgLTg4Wk0zMTIgNTY1TDI4NCA1ODlMNDM2IDcwNEw0ODkgNjcxTDMxMiA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRTsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik01MzIgMzI3UTUzMiAyNzEgNTIwIDIxMlQ0NzggMTAzVDQwMyAyMlQyODcgLTEwUTIzMyAtMTAgMjAzIDEzVDE1NCA3MkgxNTBMMTA5IC0yMjBINTFMMTgwIDcwMEgyMzZMMTk5IDQ0MEgyMDNRMjM4IDQ4MiAyNzggNDk4VDM2NCA1MTVRNDEyIDUxNSA0NDQgNTAxVDQ5NiA0NjFUNTI0IDQwMVQ1MzIgMzI3Wk0yODcgMzdRMzQxIDM3IDM3NiA2NVQ0MzMgMTM3VDQ2MiAyMzJUNDcxIDMyOVE0NzEgMzU4IDQ2NiAzODNUNDQ2IDQyNlQ0MDkgNDU1VDM0OCA0NjZRMjgzIDQ2NiAyNDAgNDMyVDE4NyAzMzBMMTY4IDE5OVExNjcgMTkxIDE2NyAxODRUMTY2IDE2OVExNjYgMTExIDE5NiA3NFQyODcgMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRjsiIGhvcml6LWFkdi14PSI0NjYiIGQ9Ik0yMTcgLTg4UTE5NyAtMTI4IDE4MCAtMTU0VDE0NCAtMTk3VDEwNSAtMjE5VDU3IC0yMjZRNDkgLTIyNiAzNyAtMjI2VDE0IC0yMjRMMjEgLTE3MlEzMCAtMTc0IDM4IC0xNzRUNTggLTE3NFE3NyAtMTc0IDkxIC0xNjlUMTE4IC0xNTFUMTQ1IC0xMTNUMTc4IC00OUwyMTEgMjFMOTMgNTAySDE1N0wyNTAgODlIMjU0TDQ1MCA1MDJINTEzTDIxNyAtODhaTTQ1MyA2MjBRNDUzIDYwMSA0MzkgNTg3VDQwNiA1NzNRMzkxIDU3MyAzODEgNTgzVDM3MSA2MDlRMzcxIDYyNyAzODUgNjQxVDQxOCA2NTVRNDMzIDY1NSA0NDMgNjQ1VDQ1MyA2MjBaTTI4NCA2MTlRMjg0IDYwMSAyNzAgNTg3VDIzNyA1NzNRMjIyIDU3MyAyMTIgNTgzVDIwMiA2MDlRMjAyIDYyNyAyMTYgNjQxVDI0OSA2NTVRMjY0IDY1NSAyNzQgNjQ1VDI4NCA2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDA7IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNNTE4IDBMNDgyIDE3MUgxNzdMOTMgMEgyOEwzNjIgNjcxSDQzN0w1ODUgMEg1MThaTTM5MSA2MTFIMzg5TDE5OSAyMjVINDcxTDM5MSA2MTFaTTI2MiA3MzBMMjY4IDc3Mkg1NTNMNTQ3IDczMEgyNjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDE7IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNNDE3IDBMNDI0IDgySDQyMFEzODkgMzYgMzQ4IDEzVDI1MiAtMTFRMjA2IC0xMSAxNzUgM1QxMjQgNDNUOTYgMTAyVDg3IDE3N1E4NyAyMjkgOTcgMjg4VDEzNCAzOTdUMjA3IDQ4MVQzMjcgNTE1UTM3NCA1MTUgNDA4IDQ5OVQ0NjYgNDM4SDQ3MEw0ODQgNTAySDUzOUw0NjggMEg0MTdaTTQ1NSAzMzFRNDY1IDM5OCA0MjkgNDMyVDMzMSA0NjdRMjc0IDQ2NyAyMzkgNDQwVDE4MyAzNzJUMTU2IDI4MFQxNDkgMTg0UTE0OSAxNTUgMTU0IDEyOFQxNzQgODFUMjExIDQ4VDI3MSAzNVEzMDUgMzUgMzMzIDQ4VDM4MyA4M1Q0MTggMTM1VDQzNiAxOTdMNDU1IDMzMVpNMTkyIDU5MEwxOTggNjMySDQ4M0w0NzcgNTkwSDE5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMjsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01MTggMEw0ODIgMTcxSDE3N0w5MyAwSDI4TDM2MiA2NzFINDM3TDU4NSAwSDUxOFpNMzkxIDYxMUgzODlMMTk5IDIyNUg0NzFMMzkxIDYxMVpNNTUyIDgxOFE1NDQgNzg3IDUyOSA3NjZUNDk0IDczMVQ0NTAgNzExVDQwMiA3MDVRMzc4IDcwNSAzNTYgNzExVDMxOCA3MzBUMjkzIDc2NVQyODYgODE4SDMyOFEzMjYgNzg0IDM0NSA3NjNUNDA3IDc0MVE0NDkgNzQxIDQ3NSA3NjJUNTA5IDgxOEg1NTJINTUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAzOyIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQyNCA4Mkg0MjBRMzg5IDM2IDM0OCAxM1QyNTIgLTExUTIwNiAtMTEgMTc1IDNUMTI0IDQzVDk2IDEwMlQ4NyAxNzdRODcgMjI5IDk3IDI4OFQxMzQgMzk3VDIwNyA0ODFUMzI3IDUxNVEzNzQgNTE1IDQwOCA0OTlUNDY2IDQzOEg0NzBMNDg0IDUwMkg1MzlMNDY4IDBINDE3Wk00NTUgMzMxUTQ2NSAzOTggNDI5IDQzMlQzMzEgNDY3UTI3NCA0NjcgMjM5IDQ0MFQxODMgMzcyVDE1NiAyODBUMTQ5IDE4NFExNDkgMTU1IDE1NCAxMjhUMTc0IDgxVDIxMSA0OFQyNzEgMzVRMzA1IDM1IDMzMyA0OFQzODMgODNUNDE4IDEzNVQ0MzYgMTk3TDQ1NSAzMzFaTTQ4NyA2NzhRNDc5IDY0NyA0NjQgNjI2VDQyOSA1OTFUMzg1IDU3MVQzMzcgNTY1UTMxMyA1NjUgMjkxIDU3MVQyNTMgNTkwVDIyOCA2MjVUMjIxIDY3OEgyNjNRMjYxIDY0NCAyODAgNjIzVDM0MiA2MDFRMzg0IDYwMSA0MTAgNjIyVDQ0NCA2NzhINDg3SDQ4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNDsiIGhvcml6LWFkdi14PSI2MTMiIGQ9Ik01NTEgMFE1MzIgLTExIDUxMSAtMjRUNDcyIC01NVQ0NDMgLTk0VDQzMSAtMTQzUTQzMSAtMTcwIDQ0NyAtMTgzVDQ5MCAtMTk2UTUxMCAtMTk2IDUyNSAtMTkxVDU1MSAtMTc5TDU2MCAtMjE2UTU0OSAtMjIyIDUyNSAtMjI5VDQ3OCAtMjM3UTQyNyAtMjM3IDQwNSAtMjE2VDM4MyAtMTU2UTM4MyAtMTI4IDM5NCAtMTA0VDQyMyAtNTlUNDY2IC0yM1Q1MTYgNUw0ODIgMTcxSDE3N0w5MyAwSDI4TDM2MiA2NzFINDM3TDU4NSAwSDU1MVpNMzkyIDYxMUgzODdMMTk5IDIyNUg0NzFMMzkyIDYxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNTsiIGhvcml6LWFkdi14PSI1NTAiIGQ9Ik00NTUgMEw0MDggLTI4UTM4MSAtNDQgMzU4IC03MlQzMzUgLTEzOFEzMzUgLTE2NSAzNTEgLTE4MFQzOTQgLTE5NlE0MTQgLTE5NiA0MjkgLTE5MVQ0NTQgLTE3OUw0NjQgLTIxNlE0NTMgLTIyMiA0MjkgLTIyOVQzODEgLTIzN1EzMzEgLTIzNyAzMDkgLTIxM1QyODcgLTE1MVEyODcgLTEyMyAyOTcgLTEwMFQzMjYgLTU3VDM2NyAtMjNUNDE3IDRMNDI0IDgySDQyMFEzODkgMzYgMzQ4IDEzVDI1MiAtMTFRMjA2IC0xMSAxNzUgM1QxMjQgNDNUOTYgMTAyVDg3IDE3N1E4NyAyMjkgOTcgMjg4VDEzNCAzOTdUMjA3IDQ4MVQzMjcgNTE1UTM3NCA1MTUgNDA4IDQ5OVQ0NjYgNDM4SDQ3MEw0ODQgNTAySDUzOUw0NjggMEg0NTVaTTQ1NSAzMzFRNDY1IDM5OCA0MjkgNDMyVDMzMSA0NjdRMjc0IDQ2NyAyMzkgNDQwVDE4MyAzNzJUMTU2IDI4MFQxNDkgMTg0UTE0OSAxNTUgMTU0IDEyOFQxNzQgODFUMjExIDQ4VDI3MSAzNVEzMDUgMzUgMzMzIDQ4VDM4MyA4M1Q0MTggMTM1VDQzNiAxOTdMNDU1IDMzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNjsiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik01OTAgNzZRNTI5IDI4IDQ3MiA5VDM1MiAtMTFRMjMxIC0xMSAxNzAgNTdUMTA5IDI1MVExMDkgMzI4IDEyOSA0MDRUMTkzIDU0MVQzMDEgNjQwVDQ1NiA2NzhRNTE2IDY3OCA1NjQgNjU4VDY1OCA1OTZMNjE0IDU1MlE1NzQgNTkwIDUzNiA2MDdUNDQ5IDYyNVEzNzcgNjI1IDMyNiA1OTNUMjQxIDUwOFQxOTIgMzkxVDE3NiAyNTlRMTc2IDIxNiAxODUgMTc3VDIxNSAxMDdUMjczIDYwVDM2NCA0MlE0MTAgNDIgNDYwIDYwVDU2MSAxMjBMNTkwIDc2SDU5MFpNNDMzIDcxMEw0MDUgNzM0TDU1NyA4NDlMNjEwIDgxNkw0MzMgNzEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA3OyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTQ3OSA0MTFRNDU2IDQzNyA0MjQgNDUxVDM1MCA0NjZRMjk3IDQ2NiAyNTkgNDQyVDE5NyAzODBUMTYyIDI5NFQxNTAgMTk4UTE1MCAxNjYgMTU3IDEzN1QxODAgODZUMjIzIDUxVDI5MCAzOFEzMzEgMzggMzY1IDUxVDQzNyA5NEw0NTMgNTBRNDEzIDIxIDM3MiA1VDI4MCAtMTFRMjMwIC0xMSAxOTQgNFQxMzQgNDdUOTkgMTExVDg4IDE5M1E4OCAyNDggMTAzIDMwNVQxNTAgNDA5VDIzMyA0ODVUMzU1IDUxNVE0MDIgNTE1IDQ0MSA0OTlUNTEyIDQ1Nkw0NzkgNDExWk0zMzAgNTY1TDMwMiA1ODlMNDU0IDcwNEw1MDcgNjcxTDMzMCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDg7IiBob3Jpei1hZHYteD0iNjE0IiBkPSJNNTkwIDc2UTUyOSAyOCA0NzIgOVQzNTIgLTExUTIzMSAtMTEgMTcwIDU3VDEwOSAyNTFRMTA5IDMyOCAxMjkgNDA0VDE5MyA1NDFUMzAxIDY0MFQ0NTYgNjc4UTUxNiA2NzggNTY0IDY1OFQ2NTggNTk2TDYxNCA1NTJRNTc0IDU5MCA1MzYgNjA3VDQ0OSA2MjVRMzc3IDYyNSAzMjYgNTkzVDI0MSA1MDhUMTkyIDM5MVQxNzYgMjU5UTE3NiAyMTYgMTg1IDE3N1QyMTUgMTA3VDI3MyA2MFQzNjQgNDJRNDEwIDQyIDQ2MCA2MFQ1NjEgMTIwTDU5MCA3Nkg1OTBaTTU3MiA3MDVMNDY4IDc4N0wzNDMgNzA1TDMyMSA3NDBMNDc2IDgzOUw2MDUgNzQwTDU3MiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDk7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNNDc5IDQxMVE0NTYgNDM3IDQyNCA0NTFUMzUwIDQ2NlEyOTcgNDY2IDI1OSA0NDJUMTk3IDM4MFQxNjIgMjk0VDE1MCAxOThRMTUwIDE2NiAxNTcgMTM3VDE4MCA4NlQyMjMgNTFUMjkwIDM4UTMzMSAzOCAzNjUgNTFUNDM3IDk0TDQ1MyA1MFE0MTMgMjEgMzcyIDVUMjgwIC0xMVEyMzAgLTExIDE5NCA0VDEzNCA0N1Q5OSAxMTFUODggMTkzUTg4IDI0OCAxMDMgMzA1VDE1MCA0MDlUMjMzIDQ4NVQzNTUgNTE1UTQwMiA1MTUgNDQxIDQ5OVQ1MTIgNDU2TDQ3OSA0MTFaTTQ3MiA1NjRMMzY4IDY0NkwyNDMgNTY0TDIyMSA1OTlMMzc2IDY5OEw1MDUgNTk5TDQ3MiA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEE7IiBob3Jpei1hZHYteD0iNjE0IiBkPSJNNTkwIDc2UTUyOSAyOCA0NzIgOVQzNTIgLTExUTIzMSAtMTEgMTcwIDU3VDEwOSAyNTFRMTA5IDMyOCAxMjkgNDA0VDE5MyA1NDFUMzAxIDY0MFQ0NTYgNjc4UTUxNiA2NzggNTY0IDY1OFQ2NTggNTk2TDYxNCA1NTJRNTc0IDU5MCA1MzYgNjA3VDQ0OSA2MjVRMzc3IDYyNSAzMjYgNTkzVDI0MSA1MDhUMTkyIDM5MVQxNzYgMjU5UTE3NiAyMTYgMTg1IDE3N1QyMTUgMTA3VDI3MyA2MFQzNjQgNDJRNDEwIDQyIDQ2MCA2MFQ1NjEgMTIwTDU5MCA3Nkg1OTBaTTUxMSA3NzBRNTExIDc1MCA0OTkgNzM3VDQ2NSA3MjRRNDUxIDcyNCA0NDIgNzMyVDQzMiA3NTZRNDMyIDc3NSA0NDQgNzg4VDQ3NiA4MDFRNDkxIDgwMSA1MDEgNzk0VDUxMSA3NzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEI7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNNDc5IDQxMVE0NTYgNDM3IDQyNCA0NTFUMzUwIDQ2NlEyOTcgNDY2IDI1OSA0NDJUMTk3IDM4MFQxNjIgMjk0VDE1MCAxOThRMTUwIDE2NiAxNTcgMTM3VDE4MCA4NlQyMjMgNTFUMjkwIDM4UTMzMSAzOCAzNjUgNTFUNDM3IDk0TDQ1MyA1MFE0MTMgMjEgMzcyIDVUMjgwIC0xMVEyMzAgLTExIDE5NCA0VDEzNCA0N1Q5OSAxMTFUODggMTkzUTg4IDI0OCAxMDMgMzA1VDE1MCA0MDlUMjMzIDQ4NVQzNTUgNTE1UTQwMiA1MTUgNDQxIDQ5OVQ1MTIgNDU2TDQ3OSA0MTFaTTQwNyA2MzJRNDA3IDYxMiAzOTUgNTk5VDM2MSA1ODZRMzQ3IDU4NiAzMzggNTk0VDMyOCA2MThRMzI4IDYzNyAzNDAgNjUwVDM3MiA2NjNRMzg3IDY2MyAzOTcgNjU2VDQwNyA2MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEM7IiBob3Jpei1hZHYteD0iNjE0IiBkPSJNNTkwIDc2UTUyOSAyOCA0NzIgOVQzNTIgLTExUTIzMSAtMTEgMTcwIDU3VDEwOSAyNTFRMTA5IDMyOCAxMjkgNDA0VDE5MyA1NDFUMzAxIDY0MFQ0NTYgNjc4UTUxNiA2NzggNTY0IDY1OFQ2NTggNTk2TDYxNCA1NTJRNTc0IDU5MCA1MzYgNjA3VDQ0OSA2MjVRMzc3IDYyNSAzMjYgNTkzVDI0MSA1MDhUMTkyIDM5MVQxNzYgMjU5UTE3NiAyMTYgMTg1IDE3N1QyMTUgMTA3VDI3MyA2MFQzNjQgNDJRNDEwIDQyIDQ2MCA2MFQ1NjEgMTIwTDU5MCA3Nkg1OTBaTTYwNCA4MTJMNDU4IDcxNEwzNDEgODEyTDM3MiA4NDZMNDY1IDc2Nkw1ODEgODQ2TDYwNCA4MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEQ7IiBob3Jpei1hZHYteD0iNDgyIiBkPSJNNDc5IDQxMVE0NTYgNDM3IDQyNCA0NTFUMzUwIDQ2NlEyOTcgNDY2IDI1OSA0NDJUMTk3IDM4MFQxNjIgMjk0VDE1MCAxOThRMTUwIDE2NiAxNTcgMTM3VDE4MCA4NlQyMjMgNTFUMjkwIDM4UTMzMSAzOCAzNjUgNTFUNDM3IDk0TDQ1MyA1MFE0MTMgMjEgMzcyIDVUMjgwIC0xMVEyMzAgLTExIDE5NCA0VDEzNCA0N1Q5OSAxMTFUODggMTkzUTg4IDI0OCAxMDMgMzA1VDE1MCA0MDlUMjMzIDQ4NVQzNTUgNTE1UTQwMiA1MTUgNDQxIDQ5OVQ1MTIgNDU2TDQ3OSA0MTFaTTUwOCA2NjNMMzYyIDU2NUwyNDUgNjYzTDI3NiA2OTdMMzY5IDYxN0w0ODUgNjk3TDUwOCA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEU7IiBob3Jpei1hZHYteD0iNjUwIiBkPSJNNjMzIDQxMlE2MzMgMzMzIDYxMiAyNTlUNTQ4IDEyN1Q0MzkgMzVUMjgyIDBIOTJMMTg1IDY2NFEyMjMgNjY5IDI3MCA2NzJUMzczIDY3NVE0NDAgNjc1IDQ4OSA2NTZUNTcwIDYwM1Q2MTcgNTIwVDYzMyA0MTJaTTI3NCA1M1EzNTIgNTMgNDA3IDgwVDQ5OCAxNTZUNTUwIDI2OFQ1NjcgNDA3UTU2NyA0NDggNTU4IDQ4N1Q1MjYgNTU2VDQ2NSA2MDRUMzY3IDYyM1EzMzUgNjIzIDMwMyA2MjFUMjQxIDYxNkwxNjIgNTNIMjc0Wk01MjEgODAzTDM3NSA3MDVMMjU4IDgwM0wyODkgODM3TDM4MiA3NTdMNDk4IDgzN0w1MjEgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBGOyIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQyNCA4Mkg0MjBRMzg5IDM2IDM0OCAxM1QyNTIgLTExUTIwNiAtMTEgMTc1IDNUMTI0IDQzVDk2IDEwMlQ4NyAxNzdRODcgMjI5IDk3IDI4OFQxMzQgMzk3VDIwNyA0ODFUMzI3IDUxNVEzNzQgNTE1IDQwOCA0OTlUNDY2IDQzOEg0NzBMNTA3IDcwMEg1NjZMNDY4IDBINDE3Wk00NTUgMzMxUTQ2NSAzOTggNDI5IDQzMlQzMzEgNDY3UTI3NCA0NjcgMjM5IDQ0MFQxODMgMzcyVDE1NiAyODBUMTQ5IDE4NFExNDkgMTU1IDE1NCAxMjhUMTc0IDgxVDIxMSA0OFQyNzEgMzVRMzA1IDM1IDMzMyA0OFQzODMgODNUNDE4IDEzNVQ0MzYgMTk3TDQ1NSAzMzFaTTYzOCA1NDRINTk2TDY1MCA3MDBINzE5TDYzOCA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTA7IiBob3Jpei1hZHYteD0iNjUwIiBkPSJNNjMzIDQxM1E2MzMgMzMxIDYxMiAyNTZUNTQ2IDEyNFQ0MzYgMzRUMjc5IDBIOTJMMTM4IDMzMkg3OEw4NiAzODVIMTQ2TDE4NSA2NjRRMjMyIDY2OSAyNzggNjcyVDM3MyA2NzVRNTAxIDY3NSA1NjcgNjA4VDYzMyA0MTNaTTI3MCA1M1EzNTEgNTMgNDA3IDgxVDQ5OSAxNTdUNTUxIDI3MFQ1NjggNDA5UTU2OCA1MDcgNTIxIDU2M1QzNzAgNjIwUTMwNSA2MjAgMjQxIDYxNEwyMDkgMzg1SDM2NUwzNTcgMzMySDIwMUwxNjIgNTNIMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTExOyIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTQxNyAwTDQyNCA4Mkg0MjBRMzg5IDM2IDM0OCAxM1QyNTIgLTExUTIwNiAtMTEgMTc1IDNUMTI0IDQzVDk2IDEwMlQ4NyAxNzhRODcgMjMxIDk4IDI4OVQxMzYgMzk3VDIxMCA0NzlUMzI2IDUxMVEzNzMgNTExIDQwOCA0OTZUNDY1IDQzNUg0NjlMNDg5IDU4MUgzMjFMMzI3IDYyM0g0OTVMNTA2IDcwMEg1NjZMNTU1IDYyM0g2MjRMNjE4IDU4MUg1NDlMNDY4IDBINDE3Wk00NTQgMzI3UTQ2NCAzOTQgNDI5IDQyOVQzMzEgNDY0UTI3NSA0NjQgMjQwIDQzOFQxODQgMzcxVDE1NiAyODBUMTQ4IDE4NFExNDggMTU0IDE1MyAxMjdUMTczIDgwVDIxMSA0N1QyNzEgMzVRMzA1IDM1IDMzMyA0OFQzODMgODNUNDE4IDEzNVQ0MzYgMTk3TDQ1NCAzMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTI7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNOTIgMEwxODUgNjY3SDU1NUw1NDggNjEySDI0MUwyMDkgMzg1SDQ4N0w0NzkgMzMwSDIwMUwxNjIgNTRINDgwTDQ3MyAwSDkyWk0yMzggNzMwTDI0NCA3NzJINTI5TDUyMyA3MzBIMjM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEzOyIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTUxNCAzMjZRNTE0IDMwMyA1MTIgMjc5VDUwNCAyMzJIMTUwUTE0NyAyMDggMTQ3IDE4NlExNDcgMTE2IDE4MSA3NlQyODYgMzZRMzIxIDM2IDM1OCA0OFQ0NDMgOTNMNDYwIDUwUTQxMiAxNiAzNjcgM1QyNzcgLTExUTE4MiAtMTEgMTM1IDQxVDg4IDE4OFE4OCAyNDMgMTAyIDMwMVQxNDggNDA2VDIyOCA0ODRUMzQ5IDUxNVE0MzEgNTE1IDQ3MiA0NjNUNTE0IDMyNlpNNDU0IDI3NlE0NTYgMjg4IDQ1NyAzMDBUNDU4IDMyNFE0NTggMzU0IDQ1MiAzODBUNDMyIDQyN1QzOTYgNDU4VDM0MyA0NzBRMjk2IDQ3MCAyNjMgNDUyVDIwOCA0MDZUMTc0IDM0NFQxNTcgMjc2SDQ1NFpNMjEzIDU5MEwyMTkgNjMySDUwNEw0OTggNTkwSDIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNDsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwTDE4NSA2NjdINTU1TDU0OCA2MTJIMjQxTDIwOSAzODVINDg3TDQ3OSAzMzBIMjAxTDE2MiA1NEg0ODBMNDczIDBIOTJaTTUyOCA4MThRNTIwIDc4NyA1MDUgNzY2VDQ3MCA3MzFUNDI2IDcxMVQzNzggNzA1UTM1NCA3MDUgMzMyIDcxMVQyOTQgNzMwVDI2OSA3NjVUMjYyIDgxOEgzMDRRMzAyIDc4NCAzMjEgNzYzVDM4MyA3NDFRNDI1IDc0MSA0NTEgNzYyVDQ4NSA4MThINTI4SDUyOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNTsiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik01MTQgMzI2UTUxNCAzMDMgNTEyIDI3OVQ1MDQgMjMySDE1MFExNDcgMjA4IDE0NyAxODZRMTQ3IDExNiAxODEgNzZUMjg2IDM2UTMyMSAzNiAzNTggNDhUNDQzIDkzTDQ2MCA1MFE0MTIgMTYgMzY3IDNUMjc3IC0xMVExODIgLTExIDEzNSA0MVQ4OCAxODhRODggMjQzIDEwMiAzMDFUMTQ4IDQwNlQyMjggNDg0VDM0OSA1MTVRNDMxIDUxNSA0NzIgNDYzVDUxNCAzMjZaTTQ1NCAyNzZRNDU2IDI4OCA0NTcgMzAwVDQ1OCAzMjRRNDU4IDM1NCA0NTIgMzgwVDQzMiA0MjdUMzk2IDQ1OFQzNDMgNDcwUTI5NiA0NzAgMjYzIDQ1MlQyMDggNDA2VDE3NCAzNDRUMTU3IDI3Nkg0NTRaTTUwMyA2NzhRNDk1IDY0NyA0ODAgNjI2VDQ0NSA1OTFUNDAxIDU3MVQzNTMgNTY1UTMyOSA1NjUgMzA3IDU3MVQyNjkgNTkwVDI0NCA2MjVUMjM3IDY3OEgyNzlRMjc3IDY0NCAyOTYgNjIzVDM1OCA2MDFRNDAwIDYwMSA0MjYgNjIyVDQ2MCA2NzhINTAzSDUwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNjsiIGhvcml6LWFkdi14PSI1MTEiIGQ9Ik05MiAwTDE4NSA2NjdINTU1TDU0OCA2MTJIMjQxTDIwOSAzODVINDg3TDQ3OSAzMzBIMjAxTDE2MiA1NEg0ODBMNDczIDBIOTJaTTQ0NCA3NjlRNDQ0IDc0OSA0MzIgNzM2VDM5OCA3MjNRMzg0IDcyMyAzNzUgNzMxVDM2NSA3NTVRMzY1IDc3NCAzNzcgNzg3VDQwOSA4MDBRNDI0IDgwMCA0MzQgNzkzVDQ0NCA3NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTc7IiBob3Jpei1hZHYteD0iNTI3IiBkPSJNNTE0IDMyNlE1MTQgMzAzIDUxMiAyNzlUNTA0IDIzMkgxNTBRMTQ3IDIwOCAxNDcgMTg2UTE0NyAxMTYgMTgxIDc2VDI4NiAzNlEzMjEgMzYgMzU4IDQ4VDQ0MyA5M0w0NjAgNTBRNDEyIDE2IDM2NyAzVDI3NyAtMTFRMTgyIC0xMSAxMzUgNDFUODggMTg4UTg4IDI0MyAxMDIgMzAxVDE0OCA0MDZUMjI4IDQ4NFQzNDkgNTE1UTQzMSA1MTUgNDcyIDQ2M1Q1MTQgMzI2Wk00NTQgMjc2UTQ1NiAyODggNDU3IDMwMFQ0NTggMzI0UTQ1OCAzNTQgNDUyIDM4MFQ0MzIgNDI3VDM5NiA0NThUMzQzIDQ3MFEyOTYgNDcwIDI2MyA0NTJUMjA4IDQwNlQxNzQgMzQ0VDE1NyAyNzZINDU0Wk00MDQgNjMyUTQwNCA2MTIgMzkyIDU5OVQzNTggNTg2UTM0NCA1ODYgMzM1IDU5NFQzMjUgNjE4UTMyNSA2MzcgMzM3IDY1MFQzNjkgNjYzUTM4NCA2NjMgMzk0IDY1NlQ0MDQgNjMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE4OyIgaG9yaXotYWR2LXg9IjUxMSIgZD0iTTQyMyAwUTQwNCAtMTEgMzgzIC0yNFQzNDQgLTU1VDMxNCAtOTRUMzAyIC0xMzlRMzAyIC0xNjUgMzE5IC0xODBUMzYyIC0xOTZRMzkzIC0xOTYgNDIzIC0xODBMNDMyIC0yMTZRNDE1IC0yMjUgMzkyIC0yMzFUMzQ5IC0yMzdRMzA4IC0yMzcgMjgyIC0yMThUMjU2IC0xNTRRMjU2IC0xMjYgMjY2IC0xMDNUMjkzIC02MFQzMzIgLTI2VDM3OCAwSDkyTDE4NSA2NjdINTU1TDU0OCA2MTJIMjQxTDIwOSAzODVINDg3TDQ3OSAzMzBIMjAxTDE2MiA1NEg0ODBMNDczIDBINDIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE5OyIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTUxNCAzMjZRNTE0IDMwMyA1MTIgMjc5VDUwNCAyMzJIMTUwUTE0NyAyMDggMTQ3IDE4NlExNDcgMTE2IDE4MSA3NlQyODYgMzZRMzIxIDM2IDM1OCA0OFQ0NDMgOTNMNDYwIDUwUTQ0MyAzOSA0MjggMzFUMzk4IDE0UTM3OSA0IDM1OCAtOVQzMTggLTQwVDI4OCAtNzhUMjc2IC0xMjRRMjc2IC0xNTAgMjkyIC0xNjZUMzM2IC0xODNRMzU2IC0xODMgMzcxIC0xNzhUMzk3IC0xNjZMNDA2IC0yMDJRMzk1IC0yMDggMzcxIC0yMTVUMzIzIC0yMjNRMjczIC0yMjMgMjUxIC0xOTlUMjI5IC0xMzlRMjI5IC0xMDEgMjUxIC03MFQzMTIgLTExTDMxMSAtN1EzMDMgLTkgMjkzIC0xMFQyNzYgLTExUTE4MSAtMTEgMTM1IDQxVDg4IDE4OFE4OCAyMDMgODkgMjE4VDkzIDI1MVExMDEgMzA5IDEyMiAzNThUMTc1IDQ0MVQyNTEgNDk1VDM0OSA1MTVRNDMxIDUxNSA0NzIgNDYzVDUxNCAzMjZaTTQ1NCAyNzVRNDU2IDI4NyA0NTcgMjk5VDQ1OCAzMjNRNDU4IDM1MyA0NTIgMzc5VDQzMiA0MjZUMzk2IDQ1N1QzNDIgNDY5UTI5NSA0NjkgMjYyIDQ1MVQyMDcgNDA1VDE3MyAzNDNUMTU2IDI3NUg0NTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUE7IiBob3Jpei1hZHYteD0iNTExIiBkPSJNOTIgMEwxODUgNjY3SDU1NUw1NDggNjEySDI0MUwyMDkgMzg1SDQ4N0w0NzkgMzMwSDIwMUwxNjIgNTRINDgwTDQ3MyAwSDkyWk01MjkgODAzTDM4MyA3MDVMMjY2IDgwM0wyOTcgODM3TDM5MCA3NTdMNTA2IDgzN0w1MjkgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFCOyIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTUxNCAzMjZRNTE0IDMwMyA1MTIgMjc5VDUwNCAyMzJIMTUwUTE0NyAyMDggMTQ3IDE4NlExNDcgMTE2IDE4MSA3NlQyODYgMzZRMzIxIDM2IDM1OCA0OFQ0NDMgOTNMNDYwIDUwUTQxMiAxNiAzNjcgM1QyNzcgLTExUTE4MiAtMTEgMTM1IDQxVDg4IDE4OFE4OCAyNDMgMTAyIDMwMVQxNDggNDA2VDIyOCA0ODRUMzQ5IDUxNVE0MzEgNTE1IDQ3MiA0NjNUNTE0IDMyNlpNNDU0IDI3NlE0NTYgMjg4IDQ1NyAzMDBUNDU4IDMyNFE0NTggMzU0IDQ1MiAzODBUNDMyIDQyN1QzOTYgNDU4VDM0MyA0NzBRMjk2IDQ3MCAyNjMgNDUyVDIwOCA0MDZUMTc0IDM0NFQxNTcgMjc2SDQ1NFpNNDk3IDY2M0wzNTEgNTY1TDIzNCA2NjNMMjY1IDY5N0wzNTggNjE3TDQ3NCA2OTdMNDk3IDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQzsiIGhvcml6LWFkdi14PSI2NzkiIGQ9Ik0zNjUgNDBRNDE0IDQwIDQ1MSA1NFQ1MTYgOTVUNTYwIDE1NlQ1ODMgMjM0TDU5MSAyODdINDA4TDQxNSAzNDBINjU3TDY0NiAyNjJRNjI2IDEyNCA1NTEgNTdUMzU1IC0xMFEyODcgLTEwIDI0MSAxMVQxNjUgNjhUMTIyIDE1M1QxMDkgMjU2UTEwOSAzMzIgMTMwIDQwN1QxOTUgNTQzVDMwNCA2NDBUNDU5IDY3OFE1MjQgNjc4IDU3MiA2NTZUNjU4IDU5OUw2MTYgNTU1UTU3NCA1OTMgNTM1IDYwOVQ0NTIgNjI1UTM3OCA2MjUgMzI2IDU5M1QyNDAgNTA4VDE5MSAzOTBUMTc1IDI1NlExNzUgMjEzIDE4NCAxNzRUMjE0IDEwNVQyNzIgNThUMzY1IDQwWk01NzAgNzA0TDQ2NiA3ODZMMzQxIDcwNEwzMTkgNzM5TDQ3NCA4MzhMNjAzIDczOUw1NzAgNzA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFEOyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTQ1NyAtNjVRNDQ5IC0xMjIgNDMwIC0xNTRUMzg1IC0yMDJUMzI4IC0yMjJUMjY1IC0yMjZRMjAyIC0yMjYgMTU1IC0yMTRUNjUgLTE3OEw5NCAtMTI4UTEzMiAtMTUzIDE3MyAtMTY1VDI2MyAtMTc4UTI5NiAtMTc4IDMxOSAtMTczVDM1OSAtMTU1VDM4NCAtMTIwVDM5OSAtNjRMNDE5IDgzSDQxNVEzODMgMzQgMzQ1IDE0VDI1NyAtN1EyMTAgLTcgMTc4IDdUMTI2IDQ1VDk2IDEwNFQ4NyAxNzlRODcgMjMwIDk3IDI4OVQxMzUgMzk4VDIwOCA0ODJUMzI3IDUxNVEzNzggNTE1IDQxMyA0OThUNDY5IDQzM0g0NzNMNDg3IDUwMkg1MzdMNDU3IC02NVpNNDU0IDMzMlE0NjQgMzk5IDQyOSA0MzNUMzMwIDQ2N1EyNzUgNDY3IDI0MCA0NDBUMTg1IDM3MlQxNTcgMjgxVDE0OSAxODhRMTQ5IDE1NiAxNTUgMTI5VDE3NiA4MlQyMTMgNTFUMjcyIDM5UTMwNiAzOSAzMzQgNTJUMzgzIDg2VDQxNyAxMzdUNDM1IDE5OUw0NTQgMzMyWk00NjUgNTY0TDM2MSA2NDZMMjM2IDU2NEwyMTQgNTk5TDM2OSA2OThMNDk4IDU5OUw0NjUgNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFFOyIgaG9yaXotYWR2LXg9IjY3OSIgZD0iTTM2NSA0MFE0MTQgNDAgNDUxIDU0VDUxNiA5NVQ1NjAgMTU2VDU4MyAyMzRMNTkxIDI4N0g0MDhMNDE1IDM0MEg2NTdMNjQ2IDI2MlE2MjYgMTI0IDU1MSA1N1QzNTUgLTEwUTI4NyAtMTAgMjQxIDExVDE2NSA2OFQxMjIgMTUzVDEwOSAyNTZRMTA5IDMzMiAxMzAgNDA3VDE5NSA1NDNUMzA0IDY0MFQ0NTkgNjc4UTUyNCA2NzggNTcyIDY1NlQ2NTggNTk5TDYxNiA1NTVRNTc0IDU5MyA1MzUgNjA5VDQ1MiA2MjVRMzc4IDYyNSAzMjYgNTkzVDI0MCA1MDhUMTkxIDM5MFQxNzUgMjU2UTE3NSAyMTMgMTg0IDE3NFQyMTQgMTA1VDI3MiA1OFQzNjUgNDBaTTYxMCA4MjRRNjAyIDc5MyA1ODcgNzcyVDU1MiA3MzdUNTA4IDcxN1Q0NjAgNzExUTQzNiA3MTEgNDE0IDcxN1QzNzYgNzM2VDM1MSA3NzFUMzQ0IDgyNEgzODZRMzg0IDc5MCA0MDMgNzY5VDQ2NSA3NDdRNTA3IDc0NyA1MzMgNzY4VDU2NyA4MjRINjEwSDYxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRjsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik00NTcgLTY1UTQ0OSAtMTIyIDQzMCAtMTU0VDM4NSAtMjAyVDMyOCAtMjIyVDI2NSAtMjI2UTIwMiAtMjI2IDE1NSAtMjE0VDY1IC0xNzhMOTQgLTEyOFExMzIgLTE1MyAxNzMgLTE2NVQyNjMgLTE3OFEyOTYgLTE3OCAzMTkgLTE3M1QzNTkgLTE1NVQzODQgLTEyMFQzOTkgLTY0TDQxOSA4M0g0MTVRMzgzIDM0IDM0NSAxNFQyNTcgLTdRMjEwIC03IDE3OCA3VDEyNiA0NVQ5NiAxMDRUODcgMTc5UTg3IDIzMCA5NyAyODlUMTM1IDM5OFQyMDggNDgyVDMyNyA1MTVRMzc4IDUxNSA0MTMgNDk4VDQ2OSA0MzNINDczTDQ4NyA1MDJINTM3TDQ1NyAtNjVaTTQ1NCAzMzJRNDY0IDM5OSA0MjkgNDMzVDMzMCA0NjdRMjc1IDQ2NyAyNDAgNDQwVDE4NSAzNzJUMTU3IDI4MVQxNDkgMTg4UTE0OSAxNTYgMTU1IDEyOVQxNzYgODJUMjEzIDUxVDI3MiAzOVEzMDYgMzkgMzM0IDUyVDM4MyA4NlQ0MTcgMTM3VDQzNSAxOTlMNDU0IDMzMlpNNTA2IDY3OFE0OTggNjQ3IDQ4MyA2MjZUNDQ4IDU5MVQ0MDQgNTcxVDM1NiA1NjVRMzMyIDU2NSAzMTAgNTcxVDI3MiA1OTBUMjQ3IDYyNVQyNDAgNjc4SDI4MlEyODAgNjQ0IDI5OSA2MjNUMzYxIDYwMVE0MDMgNjAxIDQyOSA2MjJUNDYzIDY3OEg1MDZINTA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIwOyIgaG9yaXotYWR2LXg9IjY3OSIgZD0iTTM2NSA0MFE0MTQgNDAgNDUxIDU0VDUxNiA5NVQ1NjAgMTU2VDU4MyAyMzRMNTkxIDI4N0g0MDhMNDE1IDM0MEg2NTdMNjQ2IDI2MlE2MjYgMTI0IDU1MSA1N1QzNTUgLTEwUTI4NyAtMTAgMjQxIDExVDE2NSA2OFQxMjIgMTUzVDEwOSAyNTZRMTA5IDMzMiAxMzAgNDA3VDE5NSA1NDNUMzA0IDY0MFQ0NTkgNjc4UTUyNCA2NzggNTcyIDY1NlQ2NTggNTk5TDYxNiA1NTVRNTc0IDU5MyA1MzUgNjA5VDQ1MiA2MjVRMzc4IDYyNSAzMjYgNTkzVDI0MCA1MDhUMTkxIDM5MFQxNzUgMjU2UTE3NSAyMTMgMTg0IDE3NFQyMTQgMTA1VDI3MiA1OFQzNjUgNDBaTTUxMiA3NzBRNTEyIDc1MCA1MDAgNzM3VDQ2NiA3MjRRNDUyIDcyNCA0NDMgNzMyVDQzMyA3NTZRNDMzIDc3NSA0NDUgNzg4VDQ3NyA4MDFRNDkyIDgwMSA1MDIgNzk0VDUxMiA3NzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjE7IiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNNDU3IC02NVE0NDkgLTEyMiA0MzAgLTE1NFQzODUgLTIwMlQzMjggLTIyMlQyNjUgLTIyNlEyMDIgLTIyNiAxNTUgLTIxNFQ2NSAtMTc4TDk0IC0xMjhRMTMyIC0xNTMgMTczIC0xNjVUMjYzIC0xNzhRMjk2IC0xNzggMzE5IC0xNzNUMzU5IC0xNTVUMzg0IC0xMjBUMzk5IC02NEw0MTkgODNINDE1UTM4MyAzNCAzNDUgMTRUMjU3IC03UTIxMCAtNyAxNzggN1QxMjYgNDVUOTYgMTA0VDg3IDE3OVE4NyAyMzAgOTcgMjg5VDEzNSAzOThUMjA4IDQ4MlQzMjcgNTE1UTM3OCA1MTUgNDEzIDQ5OFQ0NjkgNDMzSDQ3M0w0ODcgNTAySDUzN0w0NTcgLTY1Wk00NTQgMzMyUTQ2NCAzOTkgNDI5IDQzM1QzMzAgNDY3UTI3NSA0NjcgMjQwIDQ0MFQxODUgMzcyVDE1NyAyODFUMTQ5IDE4OFExNDkgMTU2IDE1NSAxMjlUMTc2IDgyVDIxMyA1MVQyNzIgMzlRMzA2IDM5IDMzNCA1MlQzODMgODZUNDE3IDEzN1Q0MzUgMTk5TDQ1NCAzMzJaTTQwMCA2MzJRNDAwIDYxMiAzODggNTk5VDM1NCA1ODZRMzQwIDU4NiAzMzEgNTk0VDMyMSA2MThRMzIxIDYzNyAzMzMgNjUwVDM2NSA2NjNRMzgwIDY2MyAzOTAgNjU2VDQwMCA2MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjI7IiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzY1IDQwUTQxNCA0MCA0NTEgNTRUNTE2IDk1VDU2MCAxNTZUNTgzIDIzNEw1OTEgMjg3SDQwOEw0MTUgMzQwSDY1N0w2NDYgMjYyUTYyNiAxMjQgNTUxIDU3VDM1NSAtMTBRMjg3IC0xMCAyNDEgMTFUMTY1IDY4VDEyMiAxNTNUMTA5IDI1NlExMDkgMzMyIDEzMCA0MDdUMTk1IDU0M1QzMDQgNjQwVDQ1OSA2NzhRNTI0IDY3OCA1NzIgNjU2VDY1OCA1OTlMNjE2IDU1NVE1NzQgNTkzIDUzNSA2MDlUNDUyIDYyNVEzNzggNjI1IDMyNiA1OTNUMjQwIDUwOFQxOTEgMzkwVDE3NSAyNTZRMTc1IDIxMyAxODQgMTc0VDIxNCAxMDVUMjcyIDU4VDM2NSA0MFpNMzE4IC0yMDZIMjc3TDMyMSAtNjFIMzkwTDMxOCAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIzOyIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTQ1NyAtNjVRNDQ5IC0xMjIgNDMwIC0xNTRUMzg1IC0yMDJUMzI4IC0yMjJUMjY1IC0yMjZRMjAyIC0yMjYgMTU1IC0yMTRUNjUgLTE3OEw5NCAtMTI4UTEzMiAtMTUzIDE3MyAtMTY1VDI2MyAtMTc4UTI5NiAtMTc4IDMxOSAtMTczVDM1OSAtMTU1VDM4NCAtMTIwVDM5OSAtNjRMNDE5IDgzSDQxNVEzODMgMzQgMzQ1IDE0VDI1NyAtN1EyMTAgLTcgMTc4IDdUMTI2IDQ1VDk2IDEwNFQ4NyAxNzlRODcgMjMwIDk3IDI4OVQxMzUgMzk4VDIwOCA0ODJUMzI3IDUxNVEzNzggNTE1IDQxMyA0OThUNDY5IDQzM0g0NzNMNDg3IDUwMkg1MzdMNDU3IC02NVpNNDU0IDMzMlE0NjQgMzk5IDQyOSA0MzNUMzMwIDQ2N1EyNzUgNDY3IDI0MCA0NDBUMTg1IDM3MlQxNTcgMjgxVDE0OSAxODhRMTQ5IDE1NiAxNTUgMTI5VDE3NiA4MlQyMTMgNTFUMjcyIDM5UTMwNiAzOSAzMzQgNTJUMzgzIDg2VDQxNyAxMzdUNDM1IDE5OUw0NTQgMzMyWk0zOTggNzA3SDQzOEwzOTQgNTc0SDMxNUwzOTggNzA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI0OyIgaG9yaXotYWR2LXg9IjY0NSIgZD0iTTQ5MCAwTDUzNiAzMzFIMjAxTDE1NSAwSDkyTDE4NSA2NjdIMjQ4TDIwOSAzODhINTQ0TDU4MyA2NjdINjQ2TDU1MyAwSDQ5MFpNNTQzIDcwNEw0MzkgNzg2TDMxNCA3MDRMMjkyIDczOUw0NDcgODM4TDU3NiA3MzlMNTQzIDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNTsiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik00MDcgMEw0NDkgMzAxUTQ1MiAzMjEgNDU0IDMzOVQ0NTYgMzczUTQ1NiAzOTQgNDUyIDQxMFQ0MzYgNDM5VDQwNCA0NTdUMzUzIDQ2M1EyODIgNDYzIDIzOSA0MjdUMTg2IDMyM0wxNDEgMEg4MkwxODAgNzAwSDIzOUwyMDEgNDM0SDIwNVEyMzAgNDc0IDI3MiA0OTRUMzcyIDUxNVE0MTMgNTE1IDQ0MCA1MDdUNDg1IDQ4MlQ1MDkgNDQxVDUxNiAzODVRNTE2IDM3MSA1MTQgMzU0VDUxMCAzMThMNDY2IDBINDA3Wk0zMjUgNjk3TDIyMSA3NzlMOTYgNjk3TDc0IDczMkwyMjkgODMxTDM1OCA3MzJMMzI1IDY5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNjsiIGhvcml6LWFkdi14PSI2NDUiIGQ9Ik00ODkgMEw1MzUgMzMxSDIwMUwxNTUgMEg5MkwxNjIgNTAxSDc0TDgxIDU1MEgxNjlMMTg1IDY2N0gyNDhMMjMyIDU1MEg1NjZMNTgyIDY2N0g2NDZMNjMwIDU1MEg3MThMNzExIDUwMUg2MjNMNTUzIDBINDg5Wk01NDIgMzgzTDU1OSA1MDFIMjI1TDIwOCAzODNINTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI3OyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTIyMiA1ODBMMjAxIDQzMEgyMDVRMjMwIDQ3MSAyNzIgNDkxVDM3MSA1MTFRNDEyIDUxMSA0NDAgNTAzVDQ4NCA0NzdUNTA4IDQzNlQ1MTUgMzgwUTUxNSAzNjUgNTE0IDM0OVQ1MTAgMzE1TDQ2NiAwSDQwNkw0NDcgMjk3UTQ1MCAzMTcgNDUyIDMzNVQ0NTQgMzcwUTQ1NCAzOTEgNDUwIDQwN1Q0MzQgNDM2VDQwMiA0NTRUMzUyIDQ2MFEyODEgNDYwIDIzOCA0MjNUMTg1IDMxOUwxNDEgMEg4MkwxNjMgNTgwSDk0TDEwMCA2MjJIMTY5TDE4MCA3MDBIMjM5TDIyOCA2MjJINDA3TDQwMSA1ODBIMjIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI4OyIgaG9yaXotYWR2LXg9IjI0NyIgZD0iTTkyIDBMMTg1IDY2N0gyNDhMMTU1IDBIOTJaTTM4NiA3NzRRMzcyIDc0MiAzNDUgNzI3VDI5MSA3MTJRMjc1IDcxMiAyNTkgNzE4VDIyNyA3MzFUMTk2IDc0NFQxNjggNzUwUTE1MiA3NTAgMTM1IDc0M1QxMDYgNzExTDc0IDczNFE5NSA3NzAgMTIwIDc4M1QxNzEgNzk2UTE4NyA3OTYgMjAzIDc5MFQyMzUgNzc3VDI2NSA3NjRUMjk0IDc1OFEzMTEgNzU4IDMyNiA3NjZUMzUzIDc5NkwzODYgNzc0SDM4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyOTsiIGhvcml6LWFkdi14PSIyMjMiIGQ9Ik04MiAwTDE1MiA1MDJIMjExTDE0MSAwSDgyWk0zNTcgNjM0UTM0MyA2MDIgMzE2IDU4N1QyNjIgNTcyUTI0NiA1NzIgMjMwIDU3OFQxOTggNTkxVDE2NyA2MDRUMTM5IDYxMFExMjMgNjEwIDEwNiA2MDNUNzcgNTcxTDQ1IDU5NFE2NiA2MzAgOTEgNjQzVDE0MiA2NTZRMTU4IDY1NiAxNzQgNjUwVDIwNiA2MzdUMjM2IDYyNFQyNjUgNjE4UTI4MiA2MTggMjk3IDYyNlQzMjQgNjU2TDM1NyA2MzRIMzU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJBOyIgaG9yaXotYWR2LXg9IjI0NyIgZD0iTTkyIDBMMTg1IDY2N0gyNDhMMTU1IDBIOTJaTTgzIDczMEw4OSA3NzJIMzc0TDM2OCA3MzBIODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkI7IiBob3Jpei1hZHYteD0iMjIzIiBkPSJNODIgMEwxNTIgNTAySDIxMUwxNDEgMEg4MlpNNTEgNTkwTDU3IDYzMkgzNDJMMzM2IDU5MEg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQzsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwTDE4NSA2NjdIMjQ4TDE1NSAwSDkyWk0zNzIgODE4UTM2NCA3ODcgMzQ5IDc2NlQzMTQgNzMxVDI3MCA3MTFUMjIyIDcwNVExOTggNzA1IDE3NiA3MTFUMTM4IDczMFQxMTMgNzY1VDEwNiA4MThIMTQ4UTE0NiA3ODQgMTY1IDc2M1QyMjcgNzQxUTI2OSA3NDEgMjk1IDc2MlQzMjkgODE4SDM3MkgzNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkQ7IiBob3Jpei1hZHYteD0iMjIzIiBkPSJNODIgMEwxNTIgNTAySDIxMUwxNDEgMEg4MlpNMzQwIDY3OFEzMzIgNjQ3IDMxNyA2MjZUMjgyIDU5MVQyMzggNTcxVDE5MCA1NjVRMTY2IDU2NSAxNDQgNTcxVDEwNiA1OTBUODEgNjI1VDc0IDY3OEgxMTZRMTE0IDY0NCAxMzMgNjIzVDE5NSA2MDFRMjM3IDYwMSAyNjMgNjIyVDI5NyA2NzhIMzQwSDM0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRTsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik0xMzggMFE3MCAtMzggNDQgLTcyVDE3IC0xMzlRMTcgLTE2NSAzMyAtMTgwVDc3IC0xOTZROTcgLTE5NiAxMTIgLTE5MVQxMzggLTE4MEwxNDcgLTIxNlExMzYgLTIyMiAxMTEgLTIyOVQ2MyAtMjM3UTE0IC0yMzcgLTcgLTIxM1QtMjkgLTE1M1EtMjkgLTEyNSAtMTggLTEwMlQxMiAtNjFUNTUgLTI3VDEwNCAwSDkyTDE4NSA2NjdIMjQ4TDE1NSAwSDEzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRjsiIGhvcml6LWFkdi14PSIyMjMiIGQ9Ik0xMjkgMFExMTAgLTExIDg5IC0yNFQ0OSAtNTVUMjAgLTkzVDggLTEzOVE4IC0xNjUgMjQgLTE4MFQ2NyAtMTk2UTk5IC0xOTYgMTI5IC0xODBMMTM3IC0yMTZRMTIwIC0yMjUgOTcgLTIzMVQ1NSAtMjM3UTE0IC0yMzcgLTEyIC0yMTdULTM4IC0xNTNRLTM4IC0xMjUgLTI2IC0xMDJUNCAtNjBUNDYgLTI2VDkzIDBIODJMMTUyIDUwMkgyMTFMMTQxIDBIMTI5Wk0yMzcgNjMwUTIzNyA2MTAgMjI1IDU5N1QxOTIgNTg0UTE3NyA1ODQgMTY4IDU5M1QxNTggNjE3UTE1OCA2MzcgMTcwIDY0OVQyMDMgNjYyUTIzNyA2NjIgMjM3IDYzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMDsiIGhvcml6LWFkdi14PSIyNDciIGQ9Ik05MiAwTDE4NSA2NjdIMjQ4TDE1NSAwSDkyWk0yNzIgNzcwUTI3MiA3NTAgMjYwIDczN1QyMjYgNzI0UTIxMiA3MjQgMjAzIDczMlQxOTMgNzU2UTE5MyA3NzUgMjA1IDc4OFQyMzcgODAxUTI1MiA4MDEgMjYyIDc5NFQyNzIgNzcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMxOyIgaG9yaXotYWR2LXg9IjIyMyIgZD0iTTgyIDBMMTUyIDUwMkgyMTFMMTQxIDBIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzI7IiBob3Jpei1hZHYteD0iNjAzIiBkPSJNOTIgMEwxODUgNjY3SDI0OEwxNTUgMEg5MlpNNTMyIDE1MVE1MjAgNjYgNDczIDI4VDM1MyAtMTFRMzE3IC0xMSAyODYgLTJUMjI2IDMwTDI1OSA4MVEyODQgNTkgMzA1IDUxVDM1MyA0MlE0MDggNDIgNDM0IDcwVDQ2OSAxNTZMNTQxIDY2N0g2MDRMNTMyIDE1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMzsiIGhvcml6LWFkdi14PSI0MzIiIGQ9Ik04MiAwTDE1MiA1MDJIMjExTDE0MSAwSDgyWk0yMzggNjMwUTIzOCA2MTAgMjI2IDU5N1QxOTMgNTg0UTE3OCA1ODQgMTY5IDU5M1QxNTkgNjE3UTE1OSA2MzcgMTcxIDY0OVQyMDQgNjYyUTIzOCA2NjIgMjM4IDYzMFpNMzQxIC01N1EzMzAgLTEzNyAyOTEgLTE4MVQxNjggLTIyNlExNTMgLTIyNiAxMzggLTIyNVQxMDkgLTIyMkwxMTYgLTE3MVExNDMgLTE3NCAxNjQgLTE3NFExOTYgLTE3NCAyMTcgLTE2NlQyNTEgLTE0MVQyNzIgLTEwMVQyODMgLTQ3TDM2MCA1MDJINDE5TDM0MSAtNTdaTTQ0NiA2MzBRNDQ2IDYxMCA0MzQgNTk3VDQwMSA1ODRRMzg2IDU4NCAzNzcgNTkzVDM2NyA2MTdRMzY3IDYzNyAzNzkgNjQ5VDQxMiA2NjJRNDQ2IDY2MiA0NDYgNjMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgaG9yaXotYWR2LXg9IjQyNSIgZD0iTTM1NCAxNTFRMzQyIDY2IDI5NSAyOFQxNzUgLTExUTEzOSAtMTEgMTA4IC0yVDQ4IDMwTDgxIDgxUTEwNiA1OSAxMjcgNTFUMTc1IDQyUTIzMCA0MiAyNTYgNzBUMjkxIDE1NkwzNjMgNjY3SDQyNkwzNTQgMTUxSDM1NFpNNTE1IDcwNEw0MTEgNzg2TDI4NiA3MDRMMjY0IDczOUw0MTkgODM4TDU0OCA3MzlMNTE1IDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGhvcml6LWFkdi14PSIyMjkiIGQ9Ik0xMzkgLTUxUTEyOCAtMTMxIDg5IC0xNzhULTM1IC0yMjZRLTUwIC0yMjYgLTY1IC0yMjVULTk0IC0yMjJMLTg3IC0xNzFRLTYwIC0xNzQgLTM5IC0xNzRRLTcgLTE3NCAxNCAtMTY2VDQ4IC0xNDFUNjkgLTEwMVQ4MCAtNDdMMTU3IDUwMkgyMTdMMTM5IC01MVpNMzExIDU2NEwyMDcgNjQ2TDgyIDU2NEw2MCA1OTlMMjE1IDY5OEwzNDQgNTk5TDMxMSA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzY7IiBob3Jpei1hZHYteD0iNTQ1IiBkPSJNNDQ2IDBMMjgwIDM0M0wxOTAgMjUyTDE1NSAwSDkyTDE4NSA2NjdIMjQ4TDIwMSAzMzNIMjA1TDUyMSA2NjdINTk4TDMzMyAzODhMNTIyIDBINDQ2Wk0yMzggLTIwNkgxOTdMMjQxIC02MUgzMTBMMjM4IC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzc7IiBob3Jpei1hZHYteD0iNDc3IiBkPSJNMzc5IDBMMjY1IDI2NEwxNjMgMTYyTDE0MSAwSDgyTDE4MCA3MDBIMjM5TDE3NCAyMzdIMTc4TDQyOCA1MDJINTA0TDMxMyAzMDVMNDUxIDBIMzc5Wk0yMTAgLTIwNkgxNjlMMjEzIC02MUgyODJMMjEwIC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzk7IiBob3Jpei1hZHYteD0iNDczIiBkPSJNOTIgMEwxODUgNjY3SDI0OEwxNjIgNTVINDQzTDQzNiAwSDkyWk0yMjIgNzA1TDE5NCA3MjlMMzQ2IDg0NEwzOTkgODExTDIyMiA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0E7IiBob3Jpei1hZHYteD0iMjUxIiBkPSJNMjIyIDBRMjEzIC0yIDE5OSAtM1QxNzEgLTVRMTI0IC01IDEwNSAxNVQ5NCA5MUwxODAgNzAwSDIzOUwxNTYgMTA3UTE1MyA4NiAxNTQgNzRUMTYyIDU3VDE3OSA1MFQyMDYgNDlIMjI4TDIyMiAwSDIyMlpNMjE5IDczMkwxOTEgNzU2TDM0MyA4NzFMMzk2IDgzOEwyMTkgNzMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNCOyIgaG9yaXotYWR2LXg9IjQ3MyIgZD0iTTkyIDBMMTg1IDY2N0gyNDhMMTYyIDU1SDQ0M0w0MzYgMEg5MlpNMjE1IC0yMDZIMTc0TDIxOCAtNjFIMjg3TDIxNSAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNDOyIgaG9yaXotYWR2LXg9IjI1MSIgZD0iTTIyMiAwUTIxMyAtMiAxOTkgLTNUMTcxIC01UTEyNCAtNSAxMDUgMTVUOTQgOTFMMTgwIDcwMEgyMzlMMTU2IDEwN1ExNTMgODYgMTU0IDc0VDE2MiA1N1QxNzkgNTBUMjA2IDQ5SDIyOEwyMjIgMEgyMjJaTTEwOSAtMjA2SDY4TDExMiAtNjFIMTgxTDEwOSAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNEOyIgaG9yaXotYWR2LXg9IjQ3MyIgZD0iTTkyIDBMMTg1IDY2N0gyNDhMMTYyIDU1SDQ0M0w0MzYgMEg5MlpNNDUzIDU0NEg0MTFMNDY1IDcwMEg1MzRMNDUzIDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRTsiIGhvcml6LWFkdi14PSIyNTEiIGQ9Ik0yMjIgMFEyMTMgLTIgMTk5IC0zVDE3MSAtNVExMjQgLTUgMTA1IDE1VDk0IDkxTDE4MCA3MDBIMjM5TDE1NiAxMDdRMTUzIDg2IDE1NCA3NFQxNjIgNTdUMTc5IDUwVDIwNiA0OUgyMjhMMjIyIDBaTTMxMyA1NDRIMjcxTDMyNSA3MDBIMzk0TDMxMyA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBob3Jpei1hZHYteD0iNDczIiBkPSJNOTIgMEwxODUgNjY3SDI0OEwxNjIgNTVINDQzTDQzNiAwSDkyWk00NzEgMjY2UTQ3MSAyNDEgNDU2IDIyNVQ0MTUgMjA5UTM5NyAyMDkgMzg2IDIxOFQzNzQgMjQ3UTM3NCAyNzMgMzg4IDI4OFQ0MjkgMzA0UTQ0OCAzMDQgNDU5IDI5NVQ0NzEgMjY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQwOyIgaG9yaXotYWR2LXg9IjMwMiIgZD0iTTIyMiAwUTIxMyAtMiAxOTkgLTNUMTcxIC01UTEyNCAtNSAxMDUgMTVUOTQgOTFMMTgwIDcwMEgyMzlMMTU2IDEwN1ExNTMgODYgMTU0IDc0VDE2MiA1N1QxNzkgNTBUMjA2IDQ5SDIyOEwyMjIgMFpNMzUyIDI0NFEzNTIgMjE5IDMzNyAyMDNUMjk2IDE4N1EyNzggMTg3IDI2NyAxOTZUMjU1IDIyNVEyNTUgMjUxIDI2OSAyNjZUMzEwIDI4MlEzMjkgMjgyIDM0MCAyNzNUMzUyIDI0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MTsiIGhvcml6LWFkdi14PSI0NzMiIGQ9Ik05MiAwTDEzNyAzMjFMOTEgMjk2TDk5IDM1NEwxNDUgMzc5TDE4NSA2NjdIMjQ4TDIxMyA0MTRMMzM4IDQ4MUwzMzAgNDIyTDIwNCAzNTVMMTYyIDU1SDQ0M0w0MzYgMEg5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MjsiIGhvcml6LWFkdi14PSIyNTEiIGQ9Ik0xOTIgMzY0TDE1NiAxMDdRMTUzIDg2IDE1NCA3NFQxNjIgNTdUMTc5IDUwVDIwNiA0OUgyMjhMMjIyIDBRMjEyIC0yIDE5OSAtM1QxNzIgLTVRMTI0IC01IDEwNSAxNVQ5NCA5MUwxMjggMzMyTDgyIDMwNkw5MCAzNjRMMTM2IDM4OUwxODAgNzAwSDIzOUwyMDAgNDIwTDMxMSA0NzlMMzAzIDQyM0wxOTIgMzY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgaG9yaXotYWR2LXg9IjY4NCIgZD0iTTUzMCAwTDIzNiA1NjBIMjMyTDE1NCAwSDkyTDE4NSA2NjdIMjUyTDU0MSAxMTBINTQ1TDYyMyA2NjdINjg1TDU5MiAwSDUzMFpNNDQwIDcwNUw0MTIgNzI5TDU2NCA4NDRMNjE3IDgxMUw0NDAgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTQwNyAwTDQ0OSAzMDFRNDU1IDMzOCA0NTUgMzY4UTQ1NSAzOTAgNDUxIDQwN1Q0MzQgNDM3VDQwMiA0NTZUMzUxIDQ2M1EyODAgNDYzIDIzOCA0MjZUMTg2IDMyM0wxNDEgMEg4MkwxNTIgNTAySDIwM0wyMDAgNDM3SDIwNFEyNjQgNTE1IDM2OSA1MTVRNDExIDUxNSA0MzkgNTA3VDQ4NCA0ODJUNTA5IDQ0MlQ1MTYgMzg3UTUxNiAzNTYgNTEwIDMxOUw0NjYgMEg0MDdaTTM0MCA1NjVMMzEyIDU4OUw0NjQgNzA0TDUxNyA2NzFMMzQwIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NTsiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik01MzAgMEwyMzYgNTYwSDIzMkwxNTQgMEg5MkwxODUgNjY3SDI1Mkw1NDEgMTEwSDU0NUw2MjMgNjY3SDY4NUw1OTIgMEg1MzBaTTI5MCAtMjA2SDI0OUwyOTMgLTYxSDM2MkwyOTAgLTIwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NjsiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik00MDcgMEw0NDkgMzAxUTQ1NSAzMzggNDU1IDM2OFE0NTUgMzkwIDQ1MSA0MDdUNDM0IDQzN1Q0MDIgNDU2VDM1MSA0NjNRMjgwIDQ2MyAyMzggNDI2VDE4NiAzMjNMMTQxIDBIODJMMTUyIDUwMkgyMDNMMjAwIDQzN0gyMDRRMjY0IDUxNSAzNjkgNTE1UTQxMSA1MTUgNDM5IDUwN1Q0ODQgNDgyVDUwOSA0NDJUNTE2IDM4N1E1MTYgMzU2IDUxMCAzMTlMNDY2IDBINDA3Wk0yMzggLTIwNkgxOTdMMjQxIC02MUgzMTBMMjM4IC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDc7IiBob3Jpei1hZHYteD0iNjg0IiBkPSJNNTMwIDBMMjM2IDU2MEgyMzJMMTU0IDBIOTJMMTg1IDY2N0gyNTJMNTQxIDExMEg1NDVMNjIzIDY2N0g2ODVMNTkyIDBINTMwWk02MDMgODAzTDQ1NyA3MDVMMzQwIDgwM0wzNzEgODM3TDQ2NCA3NTdMNTgwIDgzN0w2MDMgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ4OyIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTQwNyAwTDQ0OSAzMDFRNDU1IDMzOCA0NTUgMzY4UTQ1NSAzOTAgNDUxIDQwN1Q0MzQgNDM3VDQwMiA0NTZUMzUxIDQ2M1EyODAgNDYzIDIzOCA0MjZUMTg2IDMyM0wxNDEgMEg4MkwxNTIgNTAySDIwM0wyMDAgNDM3SDIwNFEyNjQgNTE1IDM2OSA1MTVRNDExIDUxNSA0MzkgNTA3VDQ4NCA0ODJUNTA5IDQ0MlQ1MTYgMzg3UTUxNiAzNTYgNTEwIDMxOUw0NjYgMEg0MDdaTTUwNyA2NjNMMzYxIDU2NUwyNDQgNjYzTDI3NSA2OTdMMzY4IDYxN0w0ODQgNjk3TDUwNyA2NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEE7IiBob3Jpei1hZHYteD0iNjg0IiBkPSJNNDExIC0xNzlINDI0UTQ0OCAtMTc5IDQ2NSAtMTcwVDQ5MyAtMTQ3VDUxMCAtMTE1VDUxOSAtNzlMNTMxIDJMMjM1IDU3MkgyMzFMMTU0IDBIOTJMMTg1IDY2N0gyNTJMNTQzIDEwM0g1NDdMNjI0IDY2N0g2ODVMNTgxIC03NlE1NzEgLTE0NiA1MzMgLTE5MVQ0MjIgLTIzNkg0MDNMNDExIC0xNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEI7IiBob3Jpei1hZHYteD0iNTQ4IiBkPSJNMjAzIDUwMkwyMDAgNDM3SDIwNFEyNjQgNTE1IDM2OSA1MTVRNDExIDUxNSA0MzkgNTA3VDQ4NCA0ODJUNTA5IDQ0MlQ1MTYgMzg3UTUxNiAzNTYgNTEwIDMxOUw0NjIgLTI3UTQ1MSAtMTA4IDQxMSAtMTU1VDI4NSAtMjAySDI2NkwyNzQgLTE0OEgyODdRMzE3IC0xNDggMzM3IC0xMzlUMzcxIC0xMTNUMzkxIC03NVQ0MDIgLTMwTDQ0OSAzMDFRNDU1IDMzOCA0NTUgMzY4UTQ1NSAzOTAgNDUxIDQwN1Q0MzQgNDM3VDQwMiA0NTZUMzUxIDQ2M1EyODAgNDYzIDIzOCA0MjZUMTg2IDMyM0wxNDEgMEg4MkwxNTIgNTAySDIwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QzsiIGhvcml6LWFkdi14PSI3MzIiIGQ9Ik03MTUgNDEyUTcxNSAzMzEgNjk0IDI1NVQ2MzAgMTIwVDUyMCAyNVQzNjQgLTExUTIzNiAtMTEgMTczIDYxVDEwOSAyNTZRMTA5IDMzNyAxMzAgNDEzVDE5NSA1NDhUMzA1IDY0MlQ0NjEgNjc4UTU4OCA2NzggNjUxIDYwN1Q3MTUgNDEyWk0zNzEgNDFRNDQ3IDQxIDUwMCA3NFQ1ODYgMTYxVDYzNCAyODBUNjQ5IDQxMVE2NDkgNDU5IDYzOCA0OTlUNjA0IDU2N1Q1NDMgNjExVDQ1NCA2MjdRMzc4IDYyNyAzMjUgNTk0VDIzOSA1MDlUMTkxIDM5MVQxNzYgMjYwUTE3NiAyMTIgMTg3IDE3MlQyMjEgMTAyVDI4MiA1N1QzNzEgNDFaTTMzMCA3MzBMMzM2IDc3Mkg2MjFMNjE1IDczMEgzMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEQ7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNODggMTkwUTg4IDI1MSAxMDMgMzA5VDE1MSA0MTNUMjMzIDQ4N1QzNTEgNTE1UTM5OSA1MTUgNDM1IDUwMVQ0OTQgNDU5VDUyOCAzOTVUNTQwIDMxMVE1NDAgMjUwIDUyNSAxOTJUNDc3IDg5VDM5NSAxN1QyNzcgLTExUTE4MSAtMTEgMTM1IDQzVDg4IDE5MFpNMzQ0IDQ2N1EyODggNDY3IDI1MSA0NDFUMTkyIDM3NVQxNjAgMjg1VDE1MCAxODlRMTUwIDE1NSAxNTcgMTI3VDE4MSA3OVQyMjIgNDdUMjg1IDM2UTM0MCAzNiAzNzcgNjJUNDM3IDEyOFQ0NjggMjE3VDQ3OCAzMTJRNDc4IDM0NiA0NzEgMzc0VDQ0OCA0MjNUNDA3IDQ1NVQzNDQgNDY3Wk0yMTkgNTkwTDIyNSA2MzJINTEwTDUwNCA1OTBIMjE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRFOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTcxNSA0MTJRNzE1IDMzMSA2OTQgMjU1VDYzMCAxMjBUNTIwIDI1VDM2NCAtMTFRMjM2IC0xMSAxNzMgNjFUMTA5IDI1NlExMDkgMzM3IDEzMCA0MTNUMTk1IDU0OFQzMDUgNjQyVDQ2MSA2NzhRNTg4IDY3OCA2NTEgNjA3VDcxNSA0MTJaTTM3MSA0MVE0NDcgNDEgNTAwIDc0VDU4NiAxNjFUNjM0IDI4MFQ2NDkgNDExUTY0OSA0NTkgNjM4IDQ5OVQ2MDQgNTY3VDU0MyA2MTFUNDU0IDYyN1EzNzggNjI3IDMyNSA1OTRUMjM5IDUwOVQxOTEgMzkxVDE3NiAyNjBRMTc2IDIxMiAxODcgMTcyVDIyMSAxMDJUMjgyIDU3VDM3MSA0MVpNNjE4IDgyNFE2MTAgNzkzIDU5NSA3NzJUNTYwIDczN1Q1MTYgNzE3VDQ2OCA3MTFRNDQ0IDcxMSA0MjIgNzE3VDM4NCA3MzZUMzU5IDc3MVQzNTIgODI0SDM5NFEzOTIgNzkwIDQxMSA3NjlUNDczIDc0N1E1MTUgNzQ3IDU0MSA3NjhUNTc1IDgyNEg2MThINjE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRGOyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTg4IDE5MFE4OCAyNTEgMTAzIDMwOVQxNTEgNDEzVDIzMyA0ODdUMzUxIDUxNVEzOTkgNTE1IDQzNSA1MDFUNDk0IDQ1OVQ1MjggMzk1VDU0MCAzMTFRNTQwIDI1MCA1MjUgMTkyVDQ3NyA4OVQzOTUgMTdUMjc3IC0xMVExODEgLTExIDEzNSA0M1Q4OCAxOTBaTTM0NCA0NjdRMjg4IDQ2NyAyNTEgNDQxVDE5MiAzNzVUMTYwIDI4NVQxNTAgMTg5UTE1MCAxNTUgMTU3IDEyN1QxODEgNzlUMjIyIDQ3VDI4NSAzNlEzNDAgMzYgMzc3IDYyVDQzNyAxMjhUNDY4IDIxN1Q0NzggMzEyUTQ3OCAzNDYgNDcxIDM3NFQ0NDggNDIzVDQwNyA0NTVUMzQ0IDQ2N1pNNTA4IDY3OFE1MDAgNjQ3IDQ4NSA2MjZUNDUwIDU5MVQ0MDYgNTcxVDM1OCA1NjVRMzM0IDU2NSAzMTIgNTcxVDI3NCA1OTBUMjQ5IDYyNVQyNDIgNjc4SDI4NFEyODIgNjQ0IDMwMSA2MjNUMzYzIDYwMVE0MDUgNjAxIDQzMSA2MjJUNDY1IDY3OEg1MDhINTA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUwOyIgaG9yaXotYWR2LXg9IjczMiIgZD0iTTcxNSA0MTJRNzE1IDMzMSA2OTQgMjU1VDYzMCAxMjBUNTIwIDI1VDM2NCAtMTFRMjM2IC0xMSAxNzMgNjFUMTA5IDI1NlExMDkgMzM3IDEzMCA0MTNUMTk1IDU0OFQzMDUgNjQyVDQ2MSA2NzhRNTg4IDY3OCA2NTEgNjA3VDcxNSA0MTJaTTM3MSA0MVE0NDcgNDEgNTAwIDc0VDU4NiAxNjFUNjM0IDI4MFQ2NDkgNDExUTY0OSA0NTkgNjM4IDQ5OVQ2MDQgNTY3VDU0MyA2MTFUNDU0IDYyN1EzNzggNjI3IDMyNSA1OTRUMjM5IDUwOVQxOTEgMzkxVDE3NiAyNjBRMTc2IDIxMiAxODcgMTcyVDIyMSAxMDJUMjgyIDU3VDM3MSA0MVpNNTgxIDY5M0w1NTIgNzEyTDcwNiA4MjdMNzYxIDc5OEw1ODEgNjkzWk0zNzEgNjkzTDM0MiA3MTJMNDk2IDgyN0w1NTEgNzk4TDM3MSA2OTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTE7IiBob3Jpei1hZHYteD0iNTU5IiBkPSJNODggMTkwUTg4IDI1MSAxMDMgMzA5VDE1MSA0MTNUMjMzIDQ4N1QzNTEgNTE1UTM5OSA1MTUgNDM1IDUwMVQ0OTQgNDU5VDUyOCAzOTVUNTQwIDMxMVE1NDAgMjUwIDUyNSAxOTJUNDc3IDg5VDM5NSAxN1QyNzcgLTExUTE4MSAtMTEgMTM1IDQzVDg4IDE5MFpNMzQ0IDQ2N1EyODggNDY3IDI1MSA0NDFUMTkyIDM3NVQxNjAgMjg1VDE1MCAxODlRMTUwIDE1NSAxNTcgMTI3VDE4MSA3OVQyMjIgNDdUMjg1IDM2UTM0MCAzNiAzNzcgNjJUNDM3IDEyOFQ0NjggMjE3VDQ3OCAzMTJRNDc4IDM0NiA0NzEgMzc0VDQ0OCA0MjNUNDA3IDQ1NVQzNDQgNDY3Wk00ODggNTY2TDQ1OSA1ODVMNjEzIDcwMEw2NjggNjcxTDQ4OCA1NjZaTTI3OCA1NjZMMjQ5IDU4NUw0MDMgNzAwTDQ1OCA2NzFMMjc4IDU2NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MjsiIGhvcml6LWFkdi14PSI4NTMiIGQ9Ik00NjEgMFE0MzkgLTUgNDEwIC04VDM1NSAtMTFRMjg1IC0xMSAyMzggOVQxNjMgNjVUMTIyIDE0OFQxMDkgMjQ5UTEwOSAzMjMgMTI2IDM5OVQxODQgNTM3VDI5MCA2MzhUNDUyIDY3OFE0NzggNjc4IDUwNiA2NzVUNTU0IDY2N0g4OTZMODg5IDYxMkg2MTBMNTc4IDM4NUg4MjhMODIwIDMzMEg1NzBMNTMxIDU0SDgyMkw4MTUgMEg0NjFaTTM2MyA0MVEzOTIgNDEgNDIwIDQ0VDQ2OCA1Nkw1NDYgNjEwUTUyOCA2MTggNTAyIDYyMlQ0NDYgNjI3UTM2OSA2MjcgMzE3IDU5M1QyMzQgNTA2VDE4OSAzODVUMTc1IDI1MlExNzUgMjEwIDE4MyAxNzJUMjEzIDEwNVQyNzEgNTlUMzYzIDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUzOyIgaG9yaXotYWR2LXg9IjkxMSIgZD0iTTg5OCAzMjJRODk4IDI5OSA4OTYgMjc3VDg4OCAyMzJINTM0UTUzMSAyMDggNTMxIDE4N1E1MzEgMTE1IDU2NiA3N1Q2NzIgMzhRNzQ1IDM4IDgyNSA5NUw4NDIgNTFRODAwIDIyIDc1NSA2VDY2NCAtMTFRNjI0IC0xMSA1OTUgLTJUNTQ0IDI1VDUwOSA2NFQ0ODcgMTE0UTQ1MCA0NyAzOTggMThUMjc3IC0xMVExODYgLTExIDEzNyAzOFQ4OCAxODZRODggMjQ2IDEwMyAzMDVUMTUwIDQxMFQyMzEgNDg2VDM1MSA1MTVRNDE4IDUxNSA0NjMgNDg0VDUyNCAzODdRNTU3IDQ0NyA2MDkgNDgxVDcyOCA1MTVRODA5IDUxNSA4NTMgNDY1VDg5OCAzMjJaTTgzOCAyNzdRODQxIDI5OCA4NDEgMzIwUTg0MSAzNDggODM2IDM3NFQ4MTcgNDIxVDc4MCA0NTRUNzIyIDQ2N1E2NTIgNDY3IDYwMyA0MTdUNTQwIDI3N0g4MzhaTTQ3NCAyNTFRNDc2IDI2OCA0NzcgMjgzVDQ3OSAzMTNRNDc5IDM0NiA0NzIgMzczVDQ0OSA0MjFUNDA3IDQ1M1QzNDQgNDY0UTI5MCA0NjQgMjUzIDQzOVQxOTMgMzc1VDE2MCAyODhUMTQ5IDE5MlExNDkgMTUxIDE1OSAxMjJUMTg3IDc0VDIzMCA0N1QyODUgMzhRMzIxIDM4IDM1MiA0OVQ0MDcgODZUNDQ5IDE1MlQ0NzQgMjUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU0OyIgaG9yaXotYWR2LXg9IjU4MSIgZD0iTTQ1OSAwTDQwOSAyNDZRNDA0IDI3MyAzOTAgMjgyVDM0OCAyOTJIMTk2TDE1NSAwSDkyTDE4NSA2NjRRMjMyIDY2OSAyNzcgNjcyVDM3MCA2NzVRNDA5IDY3NSA0NDYgNjY5VDUxNCA2NDZUNTYyIDU5OVQ1ODEgNTIzUTU4MSA0NTAgNTQ4IDM5M1Q0NDIgMzEyVjMwOFE0NTMgMzAyIDQ2MCAyOTBUNDcwIDI2NUw1MjYgMEg0NTlaTTM0NSAzNDRRNDMwIDM0NCA0NzIgMzg0VDUxNSA1MTJRNTE1IDU0NyA1MDMgNTY4VDQ2OSA2MDJUNDIxIDYxOFQzNjQgNjIzUTMzMyA2MjMgMzAzIDYyMlQyNDEgNjE1TDIwMyAzNDRIMzQ1Wk0zNTkgNzA2TDMzMSA3MzBMNDgzIDg0NUw1MzYgODEyTDM1OSA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTU7IiBob3Jpei1hZHYteD0iMzQzIiBkPSJNMzY2IDQ2MVEyOTEgNDYxIDI0NCA0MzJUMTg3IDMzM0wxNDEgMEg4MkwxNTIgNTAySDIwMkwxOTkgNDQwSDIwM1EyMzIgNDgwIDI3NCA0OTdUMzY5IDUxNEgzOTFMMzgzIDQ2MUgzNjZaTTI2NiA1NjVMMjM4IDU4OUwzOTAgNzA0TDQ0MyA2NzFMMjY2IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NjsiIGhvcml6LWFkdi14PSI1ODEiIGQ9Ik00NTkgMEw0MDkgMjQ2UTQwNCAyNzMgMzkwIDI4MlQzNDggMjkySDE5NkwxNTUgMEg5MkwxODUgNjY0UTIzMiA2NjkgMjc3IDY3MlQzNzAgNjc1UTQwOSA2NzUgNDQ2IDY2OVQ1MTQgNjQ2VDU2MiA1OTlUNTgxIDUyM1E1ODEgNDUwIDU0OCAzOTNUNDQyIDMxMlYzMDhRNDUzIDMwMiA0NjAgMjkwVDQ3MCAyNjVMNTI2IDBINDU5Wk0zNDUgMzQ0UTQzMCAzNDQgNDcyIDM4NFQ1MTUgNTEyUTUxNSA1NDcgNTAzIDU2OFQ0NjkgNjAyVDQyMSA2MThUMzY0IDYyM1EzMzMgNjIzIDMwMyA2MjJUMjQxIDYxNUwyMDMgMzQ0SDM0NVpNMjQ4IC0yMDZIMjA3TDI1MSAtNjFIMzIwTDI0OCAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU3OyIgaG9yaXotYWR2LXg9IjM0MyIgZD0iTTM2NiA0NjFRMjkxIDQ2MSAyNDQgNDMyVDE4NyAzMzNMMTQxIDBIODJMMTUyIDUwMkgyMDJMMTk5IDQ0MEgyMDNRMjMyIDQ4MCAyNzQgNDk3VDM2OSA1MTRIMzkxTDM4MyA0NjFIMzY2Wk02NSAtMjA2SDI0TDY4IC02MUgxMzdMNjUgLTIwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1ODsiIGhvcml6LWFkdi14PSI1ODEiIGQ9Ik00NTkgMEw0MDkgMjQ2UTQwNCAyNzMgMzkwIDI4MlQzNDggMjkySDE5NkwxNTUgMEg5MkwxODUgNjY0UTIzMiA2NjkgMjc3IDY3MlQzNzAgNjc1UTQwOSA2NzUgNDQ2IDY2OVQ1MTQgNjQ2VDU2MiA1OTlUNTgxIDUyM1E1ODEgNDUwIDU0OCAzOTNUNDQyIDMxMlYzMDhRNDUzIDMwMiA0NjAgMjkwVDQ3MCAyNjVMNTI2IDBINDU5Wk0zNDUgMzQ0UTQzMCAzNDQgNDcyIDM4NFQ1MTUgNTEyUTUxNSA1NDcgNTAzIDU2OFQ0NjkgNjAyVDQyMSA2MThUMzY0IDYyM1EzMzMgNjIzIDMwMyA2MjJUMjQxIDYxNUwyMDMgMzQ0SDM0NVpNNTIyIDgwM0wzNzYgNzA1TDI1OSA4MDNMMjkwIDgzN0wzODMgNzU3TDQ5OSA4MzdMNTIyIDgwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1OTsiIGhvcml6LWFkdi14PSIzNDMiIGQ9Ik0zNjYgNDYxUTI5MSA0NjEgMjQ0IDQzMlQxODcgMzMzTDE0MSAwSDgyTDE1MiA1MDJIMjAyTDE5OSA0NDBIMjAzUTIzMiA0ODAgMjc0IDQ5N1QzNjkgNTE0SDM5MUwzODMgNDYxSDM2NlpNNDE1IDY2M0wyNjkgNTY1TDE1MiA2NjNMMTgzIDY5N0wyNzYgNjE3TDM5MiA2OTdMNDE1IDY2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QTsiIGhvcml6LWFkdi14PSI1MDYiIGQ9Ik00ODEgMjAxUTQ4MSAxNTAgNDY0IDExMVQ0MTYgNDRUMzQzIDNUMjUwIC0xMVExOTIgLTExIDE0MiA1VDQ1IDU3TDgyIDEwN1ExMTggNzUgMTYwIDU4VDI1MSA0MFEyODcgNDAgMzE3IDQ5VDM2OSA3N1Q0MDMgMTI0VDQxNiAxODlRNDE2IDIyNiAzOTUgMjUxVDM0MSAyOTVUMjcxIDMzMVQyMDEgMzcxVDE0OCA0MjRUMTI2IDUwMFExMjYgNTQ2IDE0NCA1ODBUMTkyIDYzNVQyNjEgNjY3VDM0MyA2NzhRMzkzIDY3OCA0MzcgNjYzVDUyMiA2MThMNDkwIDU2NVE0MjMgNjI2IDMzNCA2MjZRMzA2IDYyNiAyODEgNjIwVDIzNiA1OTlUMjA1IDU2M1QxOTMgNTExUTE5MyA0NzYgMjE0IDQ1M1QyNjggNDExVDMzNyAzNzZUNDA2IDMzNlQ0NTkgMjgxVDQ4MSAyMDFaTTMzOCA3MDZMMzEwIDczMEw0NjIgODQ1TDUxNSA4MTJMMzM4IDcwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QjsiIGhvcml6LWFkdi14PSI0MjgiIGQ9Ik00MDQgMTUyUTQwNCAxMTEgMzg5IDgxVDM0NyAzMFQyODcgLTFUMjE0IC0xMVExNjcgLTExIDEyNSAwVDQ0IDM4TDczIDg1UTEwNCA2MiAxNDMgNDlUMjIxIDM2UTI0NSAzNiAyNjcgNDJUMzA3IDYxVDMzNCA5M1QzNDQgMTQwUTM0NCAxNjkgMzI2IDE4NlQyODIgMjE3VDIyNCAyNDFUMTY3IDI2OFQxMjIgMzA3VDEwNCAzNjhRMTA0IDQwOCAxMjAgNDM2VDE2MiA0ODFUMjIxIDUwN1QyOTAgNTE1UTMyOCA1MTUgMzY0IDUwNVQ0MzUgNDc3TDQxMCA0MjlRMzgzIDQ0NyAzNTAgNDU3VDI4NCA0NjdRMjYyIDQ2NyAyNDAgNDYzVDIwMSA0NDhUMTczIDQyMFQxNjIgMzc3UTE2MiAzNTAgMTgwIDMzNFQyMjUgMzA2VDI4MyAyODJUMzQxIDI1NVQzODYgMjE0VDQwNCAxNTJaTTI2NiA1NjVMMjM4IDU4OUwzOTAgNzA0TDQ0MyA2NzFMMjY2IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QzsiIGhvcml6LWFkdi14PSI1MDYiIGQ9Ik00ODEgMjAxUTQ4MSAxNTAgNDY0IDExMVQ0MTYgNDRUMzQzIDNUMjUwIC0xMVExOTIgLTExIDE0MiA1VDQ1IDU3TDgyIDEwN1ExMTggNzUgMTYwIDU4VDI1MSA0MFEyODcgNDAgMzE3IDQ5VDM2OSA3N1Q0MDMgMTI0VDQxNiAxODlRNDE2IDIyNiAzOTUgMjUxVDM0MSAyOTVUMjcxIDMzMVQyMDEgMzcxVDE0OCA0MjRUMTI2IDUwMFExMjYgNTQ2IDE0NCA1ODBUMTkyIDYzNVQyNjEgNjY3VDM0MyA2NzhRMzkzIDY3OCA0MzcgNjYzVDUyMiA2MThMNDkwIDU2NVE0MjMgNjI2IDMzNCA2MjZRMzA2IDYyNiAyODEgNjIwVDIzNiA1OTlUMjA1IDU2M1QxOTMgNTExUTE5MyA0NzYgMjE0IDQ1M1QyNjggNDExVDMzNyAzNzZUNDA2IDMzNlQ0NTkgMjgxVDQ4MSAyMDFaTTQ2NiA3MDRMMzYyIDc4NkwyMzcgNzA0TDIxNSA3MzlMMzcwIDgzOEw0OTkgNzM5TDQ2NiA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUQ7IiBob3Jpei1hZHYteD0iNDI4IiBkPSJNNDA0IDE1MlE0MDQgMTExIDM4OSA4MVQzNDcgMzBUMjg3IC0xVDIxNCAtMTFRMTY3IC0xMSAxMjUgMFQ0NCAzOEw3MyA4NVExMDQgNjIgMTQzIDQ5VDIyMSAzNlEyNDUgMzYgMjY3IDQyVDMwNyA2MVQzMzQgOTNUMzQ0IDE0MFEzNDQgMTY5IDMyNiAxODZUMjgyIDIxN1QyMjQgMjQxVDE2NyAyNjhUMTIyIDMwN1QxMDQgMzY4UTEwNCA0MDggMTIwIDQzNlQxNjIgNDgxVDIyMSA1MDdUMjkwIDUxNVEzMjggNTE1IDM2NCA1MDVUNDM1IDQ3N0w0MTAgNDI5UTM4MyA0NDcgMzUwIDQ1N1QyODQgNDY3UTI2MiA0NjcgMjQwIDQ2M1QyMDEgNDQ4VDE3MyA0MjBUMTYyIDM3N1ExNjIgMzUwIDE4MCAzMzRUMjI1IDMwNlQyODMgMjgyVDM0MSAyNTVUMzg2IDIxNFQ0MDQgMTUyWk00MjMgNTY0TDMxOSA2NDZMMTk0IDU2NEwxNzIgNTk5TDMyNyA2OThMNDU2IDU5OUw0MjMgNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVFOyIgaG9yaXotYWR2LXg9IjUwNiIgZD0iTTMxNSAtMTE0UTMxNSAtMTYxIDI4NiAtMTg0VDIxMyAtMjA3UTE5MiAtMjA3IDE3MiAtMjAxVDEzNCAtMTgzTDE1MiAtMTU1UTE2NiAtMTYzIDE4MCAtMTY4VDIxMiAtMTczUTIzOCAtMTczIDI1NiAtMTYyVDI3NSAtMTIwUTI3NSAtMTAwIDI2MCAtOTNUMjI2IC04NlEyMDQgLTg2IDE4OSAtOTJMMTc4IC03NkwyMjMgLTEwUTE3MyAtNiAxMzAgOVQ0NSA1N0w4MiAxMDdRMTE4IDc1IDE2MCA1OFQyNTEgNDBRMjg3IDQwIDMxNyA0OVQzNjkgNzdUNDAzIDEyNFQ0MTYgMTg5UTQxNiAyMjYgMzk1IDI1MVQzNDEgMjk1VDI3MSAzMzFUMjAxIDM3MVQxNDggNDI0VDEyNiA1MDBRMTI2IDU0NiAxNDQgNTgwVDE5MiA2MzVUMjYxIDY2N1QzNDMgNjc4UTM5MyA2NzggNDM3IDY2M1Q1MjIgNjE4TDQ5MCA1NjVRNDIzIDYyNiAzMzQgNjI2UTMwNiA2MjYgMjgxIDYyMFQyMzYgNTk5VDIwNSA1NjNUMTkzIDUxMVExOTMgNDc2IDIxNCA0NTNUMjY4IDQxMVQzMzcgMzc2VDQwNiAzMzZUNDU5IDI4MVQ0ODEgMjAxUTQ4MSAxNTEgNDY1IDExM1Q0MTkgNDdUMzUwIDZUMjYyIC0xMUwyMjggLTU3UTIzMyAtNTYgMjM4IC01NlQyNDkgLTU2UTI3NSAtNTYgMjk1IC02N1QzMTUgLTExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RjsiIGhvcml6LWFkdi14PSI0MjgiIGQ9Ik0yODcgLTExNFEyODcgLTE2MSAyNTggLTE4NFQxODUgLTIwN1ExNjQgLTIwNyAxNDQgLTIwMVQxMDYgLTE4M0wxMjQgLTE1NVExMzggLTE2MyAxNTIgLTE2OFQxODQgLTE3M1EyMTAgLTE3MyAyMjggLTE2MlQyNDcgLTEyMFEyNDcgLTEwMCAyMzIgLTkzVDE5OCAtODZRMTc2IC04NiAxNjEgLTkyTDE1MCAtNzZMMTk1IC0xMFExNTQgLTggMTE3IDNUNDQgMzhMNzMgODVRMTA0IDYyIDE0MyA0OVQyMjEgMzZRMjQ1IDM2IDI2NyA0MlQzMDcgNjFUMzM0IDkzVDM0NCAxNDBRMzQ0IDE2OSAzMjYgMTg2VDI4MiAyMTdUMjI0IDI0MVQxNjcgMjY4VDEyMiAzMDdUMTA0IDM2OFExMDQgNDA4IDEyMCA0MzZUMTYyIDQ4MVQyMjEgNTA3VDI5MCA1MTVRMzI4IDUxNSAzNjQgNTA1VDQzNSA0NzdMNDEwIDQyOVEzODMgNDQ3IDM1MCA0NTdUMjg0IDQ2N1EyNjIgNDY3IDI0MCA0NjNUMjAxIDQ0OFQxNzMgNDIwVDE2MiAzNzdRMTYyIDM1MCAxODAgMzM0VDIyNSAzMDZUMjgzIDI4MlQzNDEgMjU1VDM4NiAyMTRUNDA0IDE1MlE0MDQgMTE0IDM5MSA4NVQzNTQgMzZUMzAwIDRUMjM0IC0xMEwyMDAgLTU3UTIwNSAtNTYgMjEwIC01NlQyMjEgLTU2UTI0NyAtNTYgMjY3IC02N1QyODcgLTExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGhvcml6LWFkdi14PSI1MDYiIGQ9Ik00ODEgMjAxUTQ4MSAxNTAgNDY0IDExMVQ0MTYgNDRUMzQzIDNUMjUwIC0xMVExOTIgLTExIDE0MiA1VDQ1IDU3TDgyIDEwN1ExMTggNzUgMTYwIDU4VDI1MSA0MFEyODcgNDAgMzE3IDQ5VDM2OSA3N1Q0MDMgMTI0VDQxNiAxODlRNDE2IDIyNiAzOTUgMjUxVDM0MSAyOTVUMjcxIDMzMVQyMDEgMzcxVDE0OCA0MjRUMTI2IDUwMFExMjYgNTQ2IDE0NCA1ODBUMTkyIDYzNVQyNjEgNjY3VDM0MyA2NzhRMzkzIDY3OCA0MzcgNjYzVDUyMiA2MThMNDkwIDU2NVE0MjMgNjI2IDMzNCA2MjZRMzA2IDYyNiAyODEgNjIwVDIzNiA1OTlUMjA1IDU2M1QxOTMgNTExUTE5MyA0NzYgMjE0IDQ1M1QyNjggNDExVDMzNyAzNzZUNDA2IDMzNlQ0NTkgMjgxVDQ4MSAyMDFaTTQ5NSA4MDNMMzQ5IDcwNUwyMzIgODAzTDI2MyA4MzdMMzU2IDc1N0w0NzIgODM3TDQ5NSA4MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjE7IiBob3Jpei1hZHYteD0iNDI4IiBkPSJNNDA0IDE1MlE0MDQgMTExIDM4OSA4MVQzNDcgMzBUMjg3IC0xVDIxNCAtMTFRMTY3IC0xMSAxMjUgMFQ0NCAzOEw3MyA4NVExMDQgNjIgMTQzIDQ5VDIyMSAzNlEyNDUgMzYgMjY3IDQyVDMwNyA2MVQzMzQgOTNUMzQ0IDE0MFEzNDQgMTY5IDMyNiAxODZUMjgyIDIxN1QyMjQgMjQxVDE2NyAyNjhUMTIyIDMwN1QxMDQgMzY4UTEwNCA0MDggMTIwIDQzNlQxNjIgNDgxVDIyMSA1MDdUMjkwIDUxNVEzMjggNTE1IDM2NCA1MDVUNDM1IDQ3N0w0MTAgNDI5UTM4MyA0NDcgMzUwIDQ1N1QyODQgNDY3UTI2MiA0NjcgMjQwIDQ2M1QyMDEgNDQ4VDE3MyA0MjBUMTYyIDM3N1ExNjIgMzUwIDE4MCAzMzRUMjI1IDMwNlQyODMgMjgyVDM0MSAyNTVUMzg2IDIxNFQ0MDQgMTUyWk00NDcgNjYzTDMwMSA1NjVMMTg0IDY2M0wyMTUgNjk3TDMwOCA2MTdMNDI0IDY5N0w0NDcgNjYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYyOyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTM1OCA2MTJMMjcyIDBIMjA5TDI5NSA2MTJIMTA3TDExNCA2NjdINTU0TDU0NyA2MTJIMzU4Wk0xOTEgLTIwNkgxNTBMMTk0IC02MUgyNjNMMTkxIC0yMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjM7IiBob3Jpei1hZHYteD0iMzMyIiBkPSJNMjg5IC0xUTI3OSAtMyAyNjQgLTRUMjM1IC01UTIwMSAtNSAxNzkgMFQxNDUgMTZUMTI3IDQyVDEyMiA3N1ExMjIgOTUgMTI1IDExNkwxNzIgNDUySDg4TDk1IDUwMkgxNzlMMTk5IDY0MkgyNThMMjM4IDUwMkgzNjBMMzUzIDQ1MkgyMzFMMTg1IDEyNlExODIgMTA4IDE4MiA5NFExODIgNzAgMTk3IDU5VDI1OSA0N0gyOTZMMjg5IC0xSDI4OVpNMTYyIC0yMDZIMTIxTDE2NSAtNjFIMjM0TDE2MiAtMjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY0OyIgaG9yaXotYWR2LXg9IjQ4MiIgZD0iTTM1OCA2MTJMMjcyIDBIMjA5TDI5NSA2MTJIMTA3TDExNCA2NjdINTU0TDU0NyA2MTJIMzU4Wk00ODcgODAzTDM0MSA3MDVMMjI0IDgwM0wyNTUgODM3TDM0OCA3NTdMNDY0IDgzN0w0ODcgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY1OyIgaG9yaXotYWR2LXg9IjMzMiIgZD0iTTI4OSAtMVEyNzkgLTMgMjY0IC00VDIzNSAtNVEyMDEgLTUgMTc5IDBUMTQ1IDE2VDEyNyA0MlQxMjIgNzdRMTIyIDk1IDEyNSAxMTZMMTcyIDQ1Mkg4OEw5NSA1MDJIMTc5TDE5OSA2NDJIMjU4TDIzOCA1MDJIMzYwTDM1MyA0NTJIMjMxTDE4NSAxMjZRMTgyIDEwOCAxODIgOTRRMTgyIDcwIDE5NyA1OVQyNTkgNDdIMjk2TDI4OSAtMVpNMzgwIDU0NEgzMzhMMzkyIDcwMEg0NjFMMzgwIDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NjsiIGhvcml6LWFkdi14PSI0ODIiIGQ9Ik0zMjAgMzQyTDI3MiAwSDIwOUwyNTcgMzQySDk5TDEwNiAzOTJIMjY0TDI5NSA2MTJIMTA3TDExNCA2NjdINTU0TDU0NyA2MTJIMzU4TDMyNyAzOTJINDg1TDQ3OCAzNDJIMzIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY3OyIgaG9yaXotYWR2LXg9IjMzMiIgZD0iTTIwOSAyOTdMMTg1IDEyNlExODIgMTA4IDE4MiA5NFExODIgNzAgMTk3IDU5VDI1OSA0N0gyOTZMMjg5IC0xUTI3OCAtMyAyNjQgLTRUMjM1IC01UTIwMSAtNSAxNzkgMFQxNDUgMTZUMTI3IDQyVDEyMiA3N1ExMjIgOTUgMTI1IDExNkwxNTAgMjk3SDY2TDczIDM0NUgxNTdMMTcyIDQ1Mkg4OEw5NSA1MDJIMTc5TDE5OSA2NDJIMjU4TDIzOCA1MDJIMzYwTDM1MyA0NTJIMjMxTDIxNiAzNDVIMzM3TDMzMCAyOTdIMjA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY4OyIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU5NSAyNTVRNTc1IDExNCA1MDkgNTJUMzIzIC0xMVEyMjAgLTExIDE3MSAzNFQxMjEgMTc5UTEyMSAyMTMgMTI3IDI1NUwxODUgNjY3SDI0OEwxODkgMjQyUTE4NyAyMjcgMTg2IDIxM1QxODUgMTg2UTE4NSAxMjAgMjE3IDgxVDMzMSA0MlEzNzkgNDIgNDE0IDU2VDQ3MyA5N1Q1MTEgMTYwVDUzMSAyNDJMNTkwIDY2N0g2NTNMNTk1IDI1NUg1OTVaTTU4NiA3NzRRNTcyIDc0MiA1NDUgNzI3VDQ5MSA3MTJRNDc1IDcxMiA0NTkgNzE4VDQyNyA3MzFUMzk2IDc0NFQzNjggNzUwUTM1MiA3NTAgMzM1IDc0M1QzMDYgNzExTDI3NCA3MzRRMjk1IDc3MCAzMjAgNzgzVDM3MSA3OTZRMzg3IDc5NiA0MDMgNzkwVDQzNSA3NzdUNDY1IDc2NFQ0OTQgNzU4UTUxMSA3NTggNTI2IDc2NlQ1NTMgNzk2TDU4NiA3NzRINTg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY5OyIgaG9yaXotYWR2LXg9IjU0MCIgZD0iTTQwOSAwTDQxMCA2Nkg0MDZRMzg0IDM1IDM0NiAxMlQyNDMgLTExUTIxMCAtMTEgMTg0IC01VDE0MSAxN1QxMTQgNTlUMTA0IDEyNlExMDQgMTQxIDEwNSAxNTdUMTA5IDE5NEwxNTIgNTAySDIxMUwxNzQgMjM4UTE3MCAyMTAgMTY4IDE4N1QxNjUgMTQzUTE2NSA5MiAxODYgNjZUMjY0IDQwUTM0MCA0MCAzNzggODFUNDI1IDE4OEw0NjkgNTAySDUyOEw0NTggMEg0MDlaTTUwNyA2MzRRNDkzIDYwMiA0NjYgNTg3VDQxMiA1NzJRMzk2IDU3MiAzODAgNTc4VDM0OCA1OTFUMzE3IDYwNFQyODkgNjEwUTI3MyA2MTAgMjU2IDYwM1QyMjcgNTcxTDE5NSA1OTRRMjE2IDYzMCAyNDEgNjQzVDI5MiA2NTZRMzA4IDY1NiAzMjQgNjUwVDM1NiA2MzdUMzg2IDYyNFQ0MTUgNjE4UTQzMiA2MTggNDQ3IDYyNlQ0NzQgNjU2TDUwNyA2MzRINTA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZBOyIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU5NSAyNTVRNTc1IDExNCA1MDkgNTJUMzIzIC0xMVEyMjAgLTExIDE3MSAzNFQxMjEgMTc5UTEyMSAyMTMgMTI3IDI1NUwxODUgNjY3SDI0OEwxODkgMjQyUTE4NyAyMjcgMTg2IDIxM1QxODUgMTg2UTE4NSAxMjAgMjE3IDgxVDMzMSA0MlEzNzkgNDIgNDE0IDU2VDQ3MyA5N1Q1MTEgMTYwVDUzMSAyNDJMNTkwIDY2N0g2NTNMNTk1IDI1NUg1OTVaTTI4NyA3MzBMMjkzIDc3Mkg1NzhMNTcyIDczMEgyODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkI7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDEwIDY2SDQwNlEzODQgMzUgMzQ2IDEyVDI0MyAtMTFRMjEwIC0xMSAxODQgLTVUMTQxIDE3VDExNCA1OVQxMDQgMTI2UTEwNCAxNDEgMTA1IDE1N1QxMDkgMTk0TDE1MiA1MDJIMjExTDE3NCAyMzhRMTcwIDIxMCAxNjggMTg3VDE2NSAxNDNRMTY1IDkyIDE4NiA2NlQyNjQgNDBRMzQwIDQwIDM3OCA4MVQ0MjUgMTg4TDQ2OSA1MDJINTI4TDQ1OCAwSDQwOVpNMjA4IDU5MEwyMTQgNjMySDQ5OUw0OTMgNTkwSDIwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QzsiIGhvcml6LWFkdi14PSI2NTIiIGQ9Ik01OTUgMjU1UTU3NSAxMTQgNTA5IDUyVDMyMyAtMTFRMjIwIC0xMSAxNzEgMzRUMTIxIDE3OVExMjEgMjEzIDEyNyAyNTVMMTg1IDY2N0gyNDhMMTg5IDI0MlExODcgMjI3IDE4NiAyMTNUMTg1IDE4NlExODUgMTIwIDIxNyA4MVQzMzEgNDJRMzc5IDQyIDQxNCA1NlQ0NzMgOTdUNTExIDE2MFQ1MzEgMjQyTDU5MCA2NjdINjUzTDU5NSAyNTVINTk1Wk01NzEgODE4UTU2MyA3ODcgNTQ4IDc2NlQ1MTMgNzMxVDQ2OSA3MTFUNDIxIDcwNVEzOTcgNzA1IDM3NSA3MTFUMzM3IDczMFQzMTIgNzY1VDMwNSA4MThIMzQ3UTM0NSA3ODQgMzY0IDc2M1Q0MjYgNzQxUTQ2OCA3NDEgNDk0IDc2MlQ1MjggODE4SDU3MUg1NzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkQ7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDEwIDY2SDQwNlEzODQgMzUgMzQ2IDEyVDI0MyAtMTFRMjEwIC0xMSAxODQgLTVUMTQxIDE3VDExNCA1OVQxMDQgMTI2UTEwNCAxNDEgMTA1IDE1N1QxMDkgMTk0TDE1MiA1MDJIMjExTDE3NCAyMzhRMTcwIDIxMCAxNjggMTg3VDE2NSAxNDNRMTY1IDkyIDE4NiA2NlQyNjQgNDBRMzQwIDQwIDM3OCA4MVQ0MjUgMTg4TDQ2OSA1MDJINTI4TDQ1OCAwSDQwOVpNNTAxIDY3OFE0OTMgNjQ3IDQ3OCA2MjZUNDQzIDU5MVQzOTkgNTcxVDM1MSA1NjVRMzI3IDU2NSAzMDUgNTcxVDI2NyA1OTBUMjQyIDYyNVQyMzUgNjc4SDI3N1EyNzUgNjQ0IDI5NCA2MjNUMzU2IDYwMVEzOTggNjAxIDQyNCA2MjJUNDU4IDY3OEg1MDFINTAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZFOyIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTU5NSAyNTVRNTc1IDExNCA1MDkgNTJUMzIzIC0xMVEyMjAgLTExIDE3MSAzNFQxMjEgMTc5UTEyMSAyMTMgMTI3IDI1NUwxODUgNjY3SDI0OEwxODkgMjQyUTE4NyAyMjcgMTg2IDIxM1QxODUgMTg2UTE4NSAxMjAgMjE3IDgxVDMzMSA0MlEzNzkgNDIgNDE0IDU2VDQ3MyA5N1Q1MTEgMTYwVDUzMSAyNDJMNTkwIDY2N0g2NTNMNTk1IDI1NUg1OTVaTTUyMyA3ODVRNTIzIDc2NSA1MTYgNzQ4VDQ5NSA3MThUNDYzIDY5N1Q0MjMgNjg5UTM5MSA2ODkgMzY5IDcwOFQzNDYgNzYxUTM0NiA3ODEgMzU0IDc5OFQzNzUgODI5VDQwNyA4NDlUNDQ3IDg1N1E0NzkgODU3IDUwMSA4MzhUNTIzIDc4NVpNNDI3IDcxOFE0NTUgNzE4IDQ3MiA3MzZUNDkwIDc4MVE0OTAgODAxIDQ3OCA4MTRUNDQzIDgyOFE0MTQgODI4IDM5NyA4MTBUMzc5IDc2NVEzNzkgNzQ1IDM5MSA3MzJUNDI3IDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RjsiIGhvcml6LWFkdi14PSI1NDAiIGQ9Ik00MDkgMEw0MTAgNjZINDA2UTM4NCAzNSAzNDYgMTJUMjQzIC0xMVEyMTAgLTExIDE4NCAtNVQxNDEgMTdUMTE0IDU5VDEwNCAxMjZRMTA0IDE0MSAxMDUgMTU3VDEwOSAxOTRMMTUyIDUwMkgyMTFMMTc0IDIzOFExNzAgMjEwIDE2OCAxODdUMTY1IDE0M1ExNjUgOTIgMTg2IDY2VDI2NCA0MFEzNDAgNDAgMzc4IDgxVDQyNSAxODhMNDY5IDUwMkg1MjhMNDU4IDBINDA5Wk00NTAgNjYzUTQ1MCA2NDMgNDQzIDYyNlQ0MjIgNTk2VDM5MCA1NzVUMzUwIDU2N1EzMTggNTY3IDI5NiA1ODZUMjczIDYzOVEyNzMgNjU5IDI4MSA2NzZUMzAyIDcwN1QzMzQgNzI3VDM3NCA3MzVRNDA2IDczNSA0MjggNzE2VDQ1MCA2NjNaTTM1NCA1OTZRMzgyIDU5NiAzOTkgNjE0VDQxNyA2NTlRNDE3IDY3OSA0MDUgNjkyVDM3MCA3MDZRMzQxIDcwNiAzMjQgNjg4VDMwNiA2NDNRMzA2IDYyMyAzMTggNjEwVDM1NCA1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTk1IDI1NVE1NzUgMTE0IDUwOSA1MlQzMjMgLTExUTIyMCAtMTEgMTcxIDM0VDEyMSAxNzlRMTIxIDIxMyAxMjcgMjU1TDE4NSA2NjdIMjQ4TDE4OSAyNDJRMTg3IDIyNyAxODYgMjEzVDE4NSAxODZRMTg1IDEyMCAyMTcgODFUMzMxIDQyUTM3OSA0MiA0MTQgNTZUNDczIDk3VDUxMSAxNjBUNTMxIDI0Mkw1OTAgNjY3SDY1M0w1OTUgMjU1SDU5NVpNNTMxIDcwOUw1MDIgNzI4TDY1NiA4NDNMNzExIDgxNEw1MzEgNzA5Wk0zMjEgNzA5TDI5MiA3MjhMNDQ2IDg0M0w1MDEgODE0TDMyMSA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzE7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDA5IDBMNDEwIDY2SDQwNlEzODQgMzUgMzQ2IDEyVDI0MyAtMTFRMjEwIC0xMSAxODQgLTVUMTQxIDE3VDExNCA1OVQxMDQgMTI2UTEwNCAxNDEgMTA1IDE1N1QxMDkgMTk0TDE1MiA1MDJIMjExTDE3NCAyMzhRMTcwIDIxMCAxNjggMTg3VDE2NSAxNDNRMTY1IDkyIDE4NiA2NlQyNjQgNDBRMzQwIDQwIDM3OCA4MVQ0MjUgMTg4TDQ2OSA1MDJINTI4TDQ1OCAwSDQwOVpNNDY2IDU2OUw0MzcgNTg4TDU5MSA3MDNMNjQ2IDY3NEw0NjYgNTY5Wk0yNTYgNTY5TDIyNyA1ODhMMzgxIDcwM0w0MzYgNjc0TDI1NiA1NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNTk1IDI1NVE1ODEgMTUxIDU0MiA5MVQ0MzUgNlE0MDEgLTEzIDM3OCAtMzBUMzQxIC02NFQzMjEgLTk4VDMxNSAtMTMzUTMxNSAtMTU5IDMzMSAtMTc1VDM3NSAtMTkxUTM5NSAtMTkxIDQxMCAtMTg2VDQzNiAtMTc0TDQ0NCAtMjEwUTQzMyAtMjE2IDQwOSAtMjIzVDM2MiAtMjMxUTMxMiAtMjMxIDI5MCAtMjA3VDI2OCAtMTQ3UTI2OCAtMTAxIDI5NSAtNjhUMzYyIC04UTM0NCAtMTEgMzIzIC0xMVEyMjAgLTExIDE3MSAzNFQxMjEgMTc5UTEyMSAyMTMgMTI3IDI1NUwxODUgNjY3SDI0OEwxODkgMjQyUTE4NyAyMjcgMTg2IDIxM1QxODUgMTg2UTE4NSAxMjAgMjE3IDgxVDMzMSA0MlEzNzkgNDIgNDEzIDU2VDQ3MiA5N1Q1MTAgMTYwVDUzMCAyNDJMNTg5IDY2N0g2NTNMNTk1IDI1NUg1OTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzM7IiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDQxIDBRNDA2IC0xOSAzODMgLTM2VDM0NyAtNzBUMzI3IC0xMDRUMzIxIC0xMzlRMzIxIC0xNjUgMzM3IC0xODBUMzgwIC0xOTZRNDAwIC0xOTYgNDE1IC0xOTFUNDQyIC0xODBMNDUwIC0yMTZRNDM5IC0yMjIgNDE1IC0yMjlUMzY4IC0yMzdRMzE4IC0yMzcgMjk2IC0yMTNUMjc0IC0xNTNRMjc0IC0xMjUgMjg1IC0xMDFUMzE1IC01OFQzNTggLTIzVDQwOSA1TDQxMCA2Nkg0MDZRMzg0IDM1IDM0NiAxMlQyNDMgLTExUTIxMCAtMTEgMTg0IC01VDE0MSAxN1QxMTQgNTlUMTA0IDEyNlExMDQgMTQxIDEwNSAxNTdUMTA5IDE5NEwxNTIgNTAySDIxMkwxNzUgMjM4UTE3MSAyMTAgMTY5IDE4NlQxNjYgMTQxUTE2NiA5MCAxODYgNjVUMjY0IDQwUTM0MSA0MCAzNzggODFUNDI0IDE4OEw0NjggNTAySDUyOEw0NTggMEg0NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzQ7IiBob3Jpei1hZHYteD0iODY5IiBkPSJNNjczIDBINTk0TDUxNSA1NzFINTExTDI3NiAwSDE5MkwxMjcgNjY3SDE5NkwyNDUgNjhIMjQ5TDQ5NiA2NjdINTU5TDY0MSA2OEg2NDVMODYxIDY2N0g5MjhMNjczIDBaTTY0OCA3MDRMNTQ0IDc4Nkw0MTkgNzA0TDM5NyA3MzlMNTUyIDgzOEw2ODEgNzM5TDY0OCA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzU7IiBob3Jpei1hZHYteD0iNzIwIiBkPSJNNTUwIDBINDc3TDQxOSA0MTFINDE1TDI0MCAwSDE2OUw5OSA1MDJIMTYwTDIxMyA1M0gyMTdMNDA0IDUwMkg0NTVMNTE3IDU0SDUyMUw3MDEgNTAySDc2MUw1NTAgMFpNNTU3IDU2NEw0NTMgNjQ2TDMyOCA1NjRMMzA2IDU5OUw0NjEgNjk4TDU5MCA1OTlMNTU3IDU2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NjsiIGhvcml6LWFkdi14PSI1MzMiIGQ9Ik0zMzYgMjY3TDI5OSAwSDIzNUwyNzIgMjY0TDExMSA2NjdIMTgxTDMxMiAzMjNMNTM5IDY2N0g2MDhMMzM2IDI2N1pNNDgxIDcwNEwzNzcgNzg2TDI1MiA3MDRMMjMwIDczOUwzODUgODM4TDUxNCA3MzlMNDgxIDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NzsiIGhvcml6LWFkdi14PSI0NjYiIGQ9Ik0yMTcgLTg4UTE5NyAtMTI4IDE4MCAtMTU0VDE0NCAtMTk3VDEwNSAtMjE5VDU3IC0yMjZRNDkgLTIyNiAzNyAtMjI2VDE0IC0yMjRMMjEgLTE3MlEzMCAtMTc0IDM4IC0xNzRUNTggLTE3NFE3NyAtMTc0IDkxIC0xNjlUMTE4IC0xNTFUMTQ1IC0xMTNUMTc4IC00OUwyMTEgMjFMOTMgNTAySDE1N0wyNTAgODlIMjU0TDQ1MCA1MDJINTEzTDIxNyAtODhaTTQzMyA1NjRMMzI5IDY0NkwyMDQgNTY0TDE4MiA1OTlMMzM3IDY5OEw0NjYgNTk5TDQzMyA1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzg7IiBob3Jpei1hZHYteD0iNTMzIiBkPSJNMzM2IDI2N0wyOTkgMEgyMzVMMjcyIDI2NEwxMTEgNjY3SDE4MUwzMTIgMzIzTDUzOSA2NjdINjA4TDMzNiAyNjdaTTUwMCA3NjBRNTAwIDc0MSA0ODYgNzI3VDQ1MyA3MTNRNDM4IDcxMyA0MjggNzIzVDQxOCA3NDlRNDE4IDc2NyA0MzIgNzgxVDQ2NSA3OTVRNDgwIDc5NSA0OTAgNzg1VDUwMCA3NjBaTTMzMSA3NTlRMzMxIDc0MSAzMTcgNzI3VDI4NCA3MTNRMjY5IDcxMyAyNTkgNzIzVDI0OSA3NDlRMjQ5IDc2NyAyNjMgNzgxVDI5NiA3OTVRMzExIDc5NSAzMjEgNzg1VDMzMSA3NTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzk7IiBob3Jpei1hZHYteD0iNTMyIiBkPSJNNDcgMEw1NCA1NUw0OTMgNjEySDE0OEwxNTUgNjY3SDU3MEw1NjMgNjEzTDEyMiA1NEg0OTJMNDg1IDBINDdaTTM0MyA3MDVMMzE1IDcyOUw0NjcgODQ0TDUyMCA4MTFMMzQzIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QTsiIGhvcml6LWFkdi14PSI0NDEiIGQ9Ik00MiAwTDQ4IDQ5TDM5MiA0NTJIMTEzTDEyMCA1MDJINDY0TDQ1NyA0NTJMMTE1IDUwSDQwNkwzOTkgMEg0MlpNMjc4IDU2NUwyNTAgNTg5TDQwMiA3MDRMNDU1IDY3MUwyNzggNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdCOyIgaG9yaXotYWR2LXg9IjUzMiIgZD0iTTQ3IDBMNTQgNTVMNDkzIDYxMkgxNDhMMTU1IDY2N0g1NzBMNTYzIDYxM0wxMjIgNTRINDkyTDQ4NSAwSDQ3Wk00MTcgNzcwUTQxNyA3NTAgNDA1IDczN1QzNzEgNzI0UTM1NyA3MjQgMzQ4IDczMlQzMzggNzU2UTMzOCA3NzUgMzUwIDc4OFQzODIgODAxUTM5NyA4MDEgNDA3IDc5NFQ0MTcgNzcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdDOyIgaG9yaXotYWR2LXg9IjQ0MSIgZD0iTTQyIDBMNDggNDlMMzkyIDQ1MkgxMTNMMTIwIDUwMkg0NjRMNDU3IDQ1MkwxMTUgNTBINDA2TDM5OSAwSDQyWk0zNTUgNjMyUTM1NSA2MTIgMzQzIDU5OVQzMDkgNTg2UTI5NSA1ODYgMjg2IDU5NFQyNzYgNjE4UTI3NiA2MzcgMjg4IDY1MFQzMjAgNjYzUTMzNSA2NjMgMzQ1IDY1NlQzNTUgNjMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdEOyIgaG9yaXotYWR2LXg9IjUzMiIgZD0iTTQ3IDBMNTQgNTVMNDkzIDYxMkgxNDhMMTU1IDY2N0g1NzBMNTYzIDYxM0wxMjIgNTRINDkyTDQ4NSAwSDQ3Wk01MTMgODAzTDM2NyA3MDVMMjUwIDgwM0wyODEgODM3TDM3NCA3NTdMNDkwIDgzN0w1MTMgODAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdFOyIgaG9yaXotYWR2LXg9IjQ0MSIgZD0iTTQyIDBMNDggNDlMMzkyIDQ1MkgxMTNMMTIwIDUwMkg0NjRMNDU3IDQ1MkwxMTUgNTBINDA2TDM5OSAwSDQyWk00NTUgNjYzTDMwOSA1NjVMMTkyIDY2M0wyMjMgNjk3TDMxNiA2MTdMNDMyIDY5N0w0NTUgNjYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTkyOyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTU4MCA2MjRRNTY4IDYyNSA1NjIgNjI1VDU0NCA2MjVRNTI5IDYyNSA1MTUgNjIzVDQ4OCA2MTNUNDY0IDU5MVQ0NDYgNTU1TDM5OSA0MjBINTA1TDQ4OSAzNjdIMzgyTDI1NyAtMTFRMjQzIC01MiAyMjYgLTg1VDE4NiAtMTQyVDEzMyAtMTc5VDYzIC0xOTJRNTUgLTE5MiA0NSAtMTkyVDI0IC0xODlMNDEgLTEzOVE1MCAtMTQwIDU5IC0xNDBUNzkgLTE0MFE5OCAtMTQwIDExNSAtMTI5VDE0OCAtMTAwVDE3NSAtNTZUMTk3IC00TDMxOSAzNjdIMjQ0TDI2MiA0MjBIMzM2TDM3NyA1NDZRMzg5IDU4MiA0MDIgNjA3VDQzNyA2NDdUNDg3IDY2OFQ1NjEgNjc1UTU3MCA2NzUgNTc3IDY3NVQ1OTcgNjc0TDU4MCA2MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkM7IiBob3Jpei1hZHYteD0iODY4IiBkPSJNNDQ5IDBMNDczIDE3MUgyMTRMOTQgMEgyNUw1MDQgNjY3SDkxM0w5MDYgNjEzSDU5OEw1NjYgMzg1SDg0NEw4MzYgMzMwSDU1OEw1MTkgNTRIODM3TDgzMCAwSDQ0OVpNNTM1IDYxMEg1MjdMMjQ4IDIyNkg0ODFMNTM1IDYxMFpNNjc0IDcwNUw2NDYgNzI5TDc5OCA4NDRMODUxIDgxMUw2NzQgNzA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZEOyIgaG9yaXotYWR2LXg9Ijg0MCIgZD0iTTgyNyAzMjZRODI3IDMwMyA4MjUgMjc5VDgxNyAyMzJINDY0UTQ2MSAyMDkgNDYxIDE4OFE0NjEgMTIwIDQ5NCA3OVQ1OTkgMzhRNjQxIDM4IDY4MSA1M1Q3NTQgOTVMNzcyIDUxUTczMyAyMiA2ODggNlQ1OTMgLTExUTUzOSAtMTEgNDkzIDlUNDIxIDgxUTM3MyA0MSAzMTkgMTVUMjAxIC0xMVExNDMgLTExIDEwNSAyMFQ2NiAxMTNRNjYgMTU5IDgyIDE5MlQxMjQgMjQ5VDE4NiAyODdUMjYwIDMwOVQzMzggMzE5VDQxMyAzMjJRNDE1IDMzOSA0MTcgMzU2VDQyMCAzOTBRNDIwIDQzNSAzOTggNDUwVDMzNCA0NjZRMjg0IDQ2NiAyMzUgNDQ5VDE0MyA0MDVMMTI4IDQ1MVExNzkgNDc5IDIzMCA0OTdUMzQxIDUxNVEzNjcgNTE1IDM5MCA1MTFUNDMxIDQ5NVQ0NjAgNDY1VDQ3MyA0MTZRNTA2IDQ2MyA1NTMgNDg5VDY1NyA1MTVRNzAxIDUxNSA3MzMgNTAxVDc4NiA0NjNUODE3IDQwM1Q4MjcgMzI2Wk03NjcgMjc3UTc3MCAzMDEgNzcwIDMyNVE3NzAgMzU2IDc2NCAzODJUNzQzIDQyN1Q3MDUgNDU2VDY0OCA0NjdRNjA5IDQ2NyA1NzggNDUxVDUyNCA0MDdUNDg3IDM0NlQ0NjggMjc3SDc2N1pNNDA3IDExNlE0MDIgMTMxIDQwMCAxNDhUMzk4IDE4MVEzOTggMjMwIDQwNyAyODBRMzY5IDI4MCAzMjEgMjc2VDIzMCAyNTVUMTU4IDIwOVQxMjggMTI3UTEyOCA4MCAxNTMgNTZUMjE5IDMyUTI0NyAzMiAyNzMgMzlUMzIyIDU5VDM2NyA4NlQ0MDcgMTE2Wk01MTQgNTY1TDQ4NiA1ODlMNjM4IDcwNEw2OTEgNjcxTDUxNCA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRkU7IiBob3Jpei1hZHYteD0iNzMyIiBkPSJNNzE1IDQxNVE3MTUgMzM0IDY5NSAyNTdUNjMyIDEyMVQ1MjMgMjVUMzY3IC0xMVEzMTkgLTExIDI3MiAxVDE4OCA0NUwxMjggLTIzTDk1IDEyTDE1NiA4MVExMjkgMTE5IDEyMCAxNjVUMTEwIDI1NlExMTAgMzM3IDEzMSA0MTNUMTk2IDU0OFQzMDYgNjQyVDQ2MiA2NzhRNTA3IDY3OCA1NDkgNjY4VDYyNyA2MzBMNjgyIDY5NEw3MTUgNjYxTDY1OSA1OTdRNjkxIDU2MCA3MDMgNTEyVDcxNSA0MTVaTTM3MiA0MVE0NDcgNDEgNDk5IDczVDU4NSAxNThUNjMzIDI3NVQ2NDggNDA1UTY0OCA0NDMgNjQyIDQ4M1Q2MTQgNTU0TDIzMiA5MVEyNjAgNjQgMjk1IDUzVDM3MiA0MVpNNDU0IDYyN1EzODAgNjI3IDMyOCA1OTVUMjQyIDUxMVQxOTMgMzk1VDE3NyAyNjVRMTc3IDIzMCAxODMgMTk2VDIwNyAxMzBMNTg0IDU4NVE1NTYgNjA5IDUyMyA2MThUNDU0IDYyN1pNNDQwIDcwNkw0MTIgNzMwTDU2NCA4NDVMNjE3IDgxMkw0NDAgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUZGOyIgaG9yaXotYWR2LXg9IjU1OSIgZD0iTTg4IDE5MFE4OCAyNTEgMTAzIDMwOVQxNTEgNDEzVDIzMyA0ODdUMzUxIDUxNVE0MzIgNTE1IDQ4MCA0NzNMNTQwIDUzN0w1NzIgNTA5TDUwNyA0NDFRNTQwIDM5MCA1NDAgMzExUTU0MCAyNTAgNTI1IDE5MlQ0NzcgODlUMzk1IDE3VDI3NyAtMTFRMjI4IC0xMSAxOTMgM1QxMzMgNDVMNzUgLTE2TDQ3IDEyTDExMCA4MFE4OCAxMjQgODggMTkwWk00NzggMzEyUTQ3OCAzNjEgNDY0IDM5NUwxNzQgODhRMTkwIDYzIDIxNiA1MFQyODUgMzZRMzQwIDM2IDM3NyA2MlQ0MzcgMTI4VDQ2OCAyMTdUNDc4IDMxMlpNMzQ0IDQ2N1EyODggNDY3IDI1MSA0NDFUMTkyIDM3NVQxNjAgMjg1VDE1MCAxODlRMTUwIDE1NCAxNTcgMTI5TDQ0MSA0MzJRNDI0IDQ0OSA0MDEgNDU4VDM0NCA0NjdaTTM0OSA1NjVMMzIxIDU4OUw0NzMgNzA0TDUyNiA2NzFMMzQ5IDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxODsiIGhvcml6LWFkdi14PSI1MDYiIGQ9Ik00ODEgMjAxUTQ4MSAxNTAgNDY0IDExMVQ0MTYgNDRUMzQzIDNUMjUwIC0xMVExOTIgLTExIDE0MiA1VDQ1IDU3TDgyIDEwN1ExMTggNzUgMTYwIDU4VDI1MSA0MFEyODcgNDAgMzE3IDQ5VDM2OSA3N1Q0MDMgMTI0VDQxNiAxODlRNDE2IDIyNiAzOTUgMjUxVDM0MSAyOTVUMjcxIDMzMVQyMDEgMzcxVDE0OCA0MjRUMTI2IDUwMFExMjYgNTQ2IDE0NCA1ODBUMTkyIDYzNVQyNjEgNjY3VDM0MyA2NzhRMzkzIDY3OCA0MzcgNjYzVDUyMiA2MThMNDkwIDU2NVE0MjMgNjI2IDMzNCA2MjZRMzA2IDYyNiAyODEgNjIwVDIzNiA1OTlUMjA1IDU2M1QxOTMgNTExUTE5MyA0NzYgMjE0IDQ1M1QyNjggNDExVDMzNyAzNzZUNDA2IDMzNlQ0NTkgMjgxVDQ4MSAyMDFaTTIwNiAtMjA2SDE2NUwyMDkgLTYxSDI3OEwyMDYgLTIwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxOTsiIGhvcml6LWFkdi14PSI0MjgiIGQ9Ik00MDQgMTUyUTQwNCAxMTEgMzg5IDgxVDM0NyAzMFQyODcgLTFUMjE0IC0xMVExNjcgLTExIDEyNSAwVDQ0IDM4TDczIDg1UTEwNCA2MiAxNDMgNDlUMjIxIDM2UTI0NSAzNiAyNjcgNDJUMzA3IDYxVDMzNCA5M1QzNDQgMTQwUTM0NCAxNjkgMzI2IDE4NlQyODIgMjE3VDIyNCAyNDFUMTY3IDI2OFQxMjIgMzA3VDEwNCAzNjhRMTA0IDQwOCAxMjAgNDM2VDE2MiA0ODFUMjIxIDUwN1QyOTAgNTE1UTMyOCA1MTUgMzY0IDUwNVQ0MzUgNDc3TDQxMCA0MjlRMzgzIDQ0NyAzNTAgNDU3VDI4NCA0NjdRMjYyIDQ2NyAyNDAgNDYzVDIwMSA0NDhUMTczIDQyMFQxNjIgMzc3UTE2MiAzNTAgMTgwIDMzNFQyMjUgMzA2VDI4MyAyODJUMzQxIDI1NVQzODYgMjE0VDQwNCAxNTJaTTE3MiAtMjA2SDEzMUwxNzUgLTYxSDI0NEwxNzIgLTIwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIzNzsiIGhvcml6LWFkdi14PSIyMjkiIGQ9Ik0xMzkgLTUxUTEyOCAtMTMxIDg5IC0xNzhULTM1IC0yMjZRLTUwIC0yMjYgLTY1IC0yMjVULTk0IC0yMjJMLTg3IC0xNzFRLTYwIC0xNzQgLTM5IC0xNzRRLTcgLTE3NCAxNCAtMTY2VDQ4IC0xNDFUNjkgLTEwMVQ4MCAtNDdMMTU3IDUwMkgyMTdMMTM5IC01MUgxMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzY7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMzc0IDU2NEwyNzAgNjQ2TDE0NSA1NjRMMTIzIDU5OUwyNzggNjk4TDQwNyA1OTlMMzc0IDU2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNzsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik00MDUgNjYzTDI1OSA1NjVMMTQyIDY2M0wxNzMgNjk3TDI2NiA2MTdMMzgyIDY5N0w0MDUgNjYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ4OyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTQwOSA2NzhRNDAxIDY0NyAzODYgNjI2VDM1MSA1OTFUMzA3IDU3MVQyNTkgNTY1UTIzNSA1NjUgMjEzIDU3MVQxNzUgNTkwVDE1MCA2MjVUMTQzIDY3OEgxODVRMTgzIDY0NCAyMDIgNjIzVDI2NCA2MDFRMzA2IDYwMSAzMzIgNjIyVDM2NiA2NzhINDA5SDQwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEOTsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0zMDggNjMyUTMwOCA2MTIgMjk2IDU5OVQyNjIgNTg2UTI0OCA1ODYgMjM5IDU5NFQyMjkgNjE4UTIyOSA2MzcgMjQxIDY1MFQyNzMgNjYzUTI4OCA2NjMgMjk4IDY1NlQzMDggNjMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRBOyIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTM2MCA2NjNRMzYwIDY0MyAzNTMgNjI2VDMzMiA1OTZUMzAwIDU3NVQyNjAgNTY3UTIyOCA1NjcgMjA2IDU4NlQxODMgNjM5UTE4MyA2NTkgMTkxIDY3NlQyMTIgNzA3VDI0NCA3MjdUMjg0IDczNVEzMTYgNzM1IDMzOCA3MTZUMzYwIDY2M1pNMjY0IDU5NlEyOTIgNTk2IDMwOSA2MTRUMzI3IDY1OVEzMjcgNjc5IDMxNSA2OTJUMjgwIDcwNlEyNTEgNzA2IDIzNCA2ODhUMjE2IDY0M1EyMTYgNjIzIDIyOCA2MTBUMjY0IDU5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQjsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0yMjQgLTZRMjA1IC0xNyAxODYgLTI5VDE1MCAtNTdUMTI0IC05M1QxMTQgLTEzOFExMTQgLTE2NCAxMzAgLTE4MFQxNzMgLTE5NlEyMDUgLTE5NiAyMzMgLTE3OUwyNDMgLTIxNlEyMjYgLTIyNSAyMDMgLTIzMVQxNjAgLTIzN1ExMTcgLTIzNyA5MiAtMjE3VDY2IC0xNTFRNjYgLTExOCA4MCAtOTJUMTE3IC00NlQxNjggLTEwVDIyMyAxNUwyMzggMkwyMjQgLTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREM7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNNDI0IDYzNFE0MTAgNjAyIDM4MyA1ODdUMzI5IDU3MlEzMTMgNTcyIDI5NyA1NzhUMjY1IDU5MVQyMzQgNjA0VDIwNiA2MTBRMTkwIDYxMCAxNzMgNjAzVDE0NCA1NzFMMTEyIDU5NFExMzMgNjMwIDE1OCA2NDNUMjA5IDY1NlEyMjUgNjU2IDI0MSA2NTBUMjczIDYzN1QzMDMgNjI0VDMzMiA2MThRMzQ5IDYxOCAzNjQgNjI2VDM5MSA2NTZMNDI0IDYzNEg0MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREQ7IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMzAzIDU2OUwyNzQgNTg4TDQyOCA3MDNMNDgzIDY3NEwzMDMgNTY5Wk05MyA1NjlMNjQgNTg4TDIxOCA3MDNMMjczIDY3NEw5MyA1NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgwOyIgaG9yaXotYWR2LXg9Ijg2OSIgZD0iTTY3MyAwSDU5NEw1MTUgNTcxSDUxMUwyNzYgMEgxOTJMMTI3IDY2N0gxOTZMMjQ1IDY4SDI0OUw0OTYgNjY3SDU1OUw2NDEgNjhINjQ1TDg2MSA2NjdIOTI4TDY3MyAwWk01NjEgNzA1TDQxNCA4MDlMNDc4IDg0MUw1OTUgNzI3TDU2MSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxRTgxOyIgaG9yaXotYWR2LXg9IjcyMCIgZD0iTTU1MCAwSDQ3N0w0MTkgNDExSDQxNUwyNDAgMEgxNjlMOTkgNTAySDE2MEwyMTMgNTNIMjE3TDQwNCA1MDJINDU1TDUxNyA1NEg1MjFMNzAxIDUwMkg3NjFMNTUwIDBaTTQ2MyA1NjVMMzE2IDY2OUwzODAgNzAxTDQ5NyA1ODdMNDYzIDU2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODI7IiBob3Jpei1hZHYteD0iODY5IiBkPSJNNjczIDBINTk0TDUxNSA1NzFINTExTDI3NiAwSDE5MkwxMjcgNjY3SDE5NkwyNDUgNjhIMjQ5TDQ5NiA2NjdINTU5TDY0MSA2OEg2NDVMODYxIDY2N0g5MjhMNjczIDBaTTUwNCA3MDVMNDc2IDcyOUw2MjggODQ0TDY4MSA4MTFMNTA0IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODM7IiBob3Jpei1hZHYteD0iNzIwIiBkPSJNNTUwIDBINDc3TDQxOSA0MTFINDE1TDI0MCAwSDE2OUw5OSA1MDJIMTYwTDIxMyA1M0gyMTdMNDA0IDUwMkg0NTVMNTE3IDU0SDUyMUw3MDEgNTAySDc2MUw1NTAgMFpNNDE2IDU2NUwzODggNTg5TDU0MCA3MDRMNTkzIDY3MUw0MTYgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MUU4NDsiIGhvcml6LWFkdi14PSI4NjkiIGQ9Ik02NzMgMEg1OTRMNTE1IDU3MUg1MTFMMjc2IDBIMTkyTDEyNyA2NjdIMTk2TDI0NSA2OEgyNDlMNDk2IDY2N0g1NTlMNjQxIDY4SDY0NUw4NjEgNjY3SDkyOEw2NzMgMFpNNjY4IDc2MFE2NjggNzQxIDY1NCA3MjdUNjIxIDcxM1E2MDYgNzEzIDU5NiA3MjNUNTg2IDc0OVE1ODYgNzY3IDYwMCA3ODFUNjMzIDc5NVE2NDggNzk1IDY1OCA3ODVUNjY4IDc2MFpNNDk5IDc1OVE0OTkgNzQxIDQ4NSA3MjdUNDUyIDcxM1E0MzcgNzEzIDQyNyA3MjNUNDE3IDc0OVE0MTcgNzY3IDQzMSA3ODFUNDY0IDc5NVE0NzkgNzk1IDQ4OSA3ODVUNDk5IDc1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFODU7IiBob3Jpei1hZHYteD0iNzIwIiBkPSJNNTUwIDBINDc3TDQxOSA0MTFINDE1TDI0MCAwSDE2OUw5OSA1MDJIMTYwTDIxMyA1M0gyMTdMNDA0IDUwMkg0NTVMNTE3IDU0SDUyMUw3MDEgNTAySDc2MUw1NTAgMFpNNTcyIDYyMFE1NzIgNjAxIDU1OCA1ODdUNTI1IDU3M1E1MTAgNTczIDUwMCA1ODNUNDkwIDYwOVE0OTAgNjI3IDUwNCA2NDFUNTM3IDY1NVE1NTIgNjU1IDU2MiA2NDVUNTcyIDYyMFpNNDAzIDYxOVE0MDMgNjAxIDM4OSA1ODdUMzU2IDU3M1EzNDEgNTczIDMzMSA1ODNUMzIxIDYwOVEzMjEgNjI3IDMzNSA2NDFUMzY4IDY1NVEzODMgNjU1IDM5MyA2NDVUNDAzIDYxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFRjI7IiBob3Jpei1hZHYteD0iNTMzIiBkPSJNMzM2IDI2N0wyOTkgMEgyMzVMMjcyIDI2NEwxMTEgNjY3SDE4MUwzMTIgMzIzTDUzOSA2NjdINjA4TDMzNiAyNjdaTTM3OCA3MDVMMjMxIDgwOUwyOTUgODQxTDQxMiA3MjdMMzc4IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDFFRjM7IiBob3Jpei1hZHYteD0iNDY2IiBkPSJNMjE3IC04OFExOTcgLTEyOCAxODAgLTE1NFQxNDQgLTE5N1QxMDUgLTIxOVQ1NyAtMjI2UTQ5IC0yMjYgMzcgLTIyNlQxNCAtMjI0TDIxIC0xNzJRMzAgLTE3NCAzOCAtMTc0VDU4IC0xNzRRNzcgLTE3NCA5MSAtMTY5VDExOCAtMTUxVDE0NSAtMTEzVDE3OCAtNDlMMjExIDIxTDkzIDUwMkgxNTdMMjUwIDg5SDI1NEw0NTAgNTAySDUxM0wyMTcgLTg4Wk0zMjkgNTY1TDE4MiA2NjlMMjQ2IDcwMUwzNjMgNTg3TDMyOSA1NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDEzOyIgaG9yaXotYWR2LXg9IjYwMiIgZD0iTTg0IDIzNUw5MCAyODNINTkwTDU4NCAyMzVIODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE0OyIgaG9yaXotYWR2LXg9Ijg3NCIgZD0iTTg0IDIzNkw5MCAyODJIODYyTDg1NiAyMzZIODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE4OyIgaG9yaXotYWR2LXg9IjE4NSIgZD0iTTE3MyA1MDlIOTJMMTkxIDcwMEgyMzVMMTczIDUwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBob3Jpei1hZHYteD0iMTg1IiBkPSJNMTYyIDUwOUgxMTlMMTgxIDcwMEgyNjJMMTYyIDUwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBob3Jpei1hZHYteD0iMTg1IiBkPSJNNzEgLTE0MEgyOEw5MCA1MUgxNzFMNzEgLTE0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUM7IiBob3Jpei1hZHYteD0iMzQ1IiBkPSJNMzM0IDUwOUgyNTNMMzUzIDcwMEgzOTVMMzM0IDUwOVpNMTcyIDUwOUg5MkwxOTIgNzAwSDIzNEwxNzIgNTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRDsiIGhvcml6LWFkdi14PSIzNDUiIGQ9Ik0zMjEgNTA5SDI3OUwzNDAgNzAwSDQyMkwzMjEgNTA5Wk0xNjIgNTA5SDExOUwxODEgNzAwSDI2MkwxNjIgNTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRTsiIGhvcml6LWFkdi14PSIzNDUiIGQ9Ik0yMzAgLTE0MUgxODhMMjQ5IDUwSDMzMUwyMzAgLTE0MVpNNzEgLTE0MUgyOEw5MCA1MEgxNzFMNzEgLTE0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjA7IiBob3Jpei1hZHYteD0iMzI2IiBkPSJNMjUzIDQ4NkwyMDcgMTYySDE0OEwxOTQgNDg2SDExMkwxMTkgNTM1SDIwMUwyMTkgNjY2SDI3OEwyNjAgNTM1SDM0MUwzMzQgNDg2SDI1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjE7IiBob3Jpei1hZHYteD0iMzI2IiBkPSJNMjIzIDI5NUwyMDIgMTQ0SDE0NEwxNjUgMjk1SDg0TDkxIDM0N0gxNzJMMTkyIDQ4OEgxMTFMMTE4IDUzOUgxOTlMMjE3IDY2NkgyNzVMMjU3IDUzOUgzMzlMMzMyIDQ4OEgyNTBMMjMwIDM0N0gzMTNMMzA2IDI5NUgyMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIyOyIgaG9yaXotYWR2LXg9IjUxNyIgZD0iTTQwNSAzMjlRNDA1IDI5OCAzOTQgMjcyVDM2MiAyMjZUMzE2IDE5NVQyNTggMTgzUTIyNyAxODMgMjAxIDE5NFQxNTUgMjI1VDEyNCAyNzFUMTEyIDMyOVExMTIgMzYwIDEyMyAzODZUMTU0IDQzMlQyMDAgNDYzVDI1OCA0NzVRMjg5IDQ3NSAzMTUgNDY0VDM2MiA0MzNUMzkzIDM4N1Q0MDUgMzI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyNjsiIGhvcml6LWFkdi14PSI2MzAiIGQ9Ik0xNDUgNDZRMTQ1IDIyIDEzMSA2VDkxIC0xMFE3MyAtMTAgNjIgLTFUNTEgMjhRNTEgNTIgNjQgNjdUMTA0IDgzUTEyMiA4MyAxMzMgNzRUMTQ1IDQ2Wk0zNjcgNDZRMzY3IDIyIDM1MyA2VDMxMyAtMTBRMjk1IC0xMCAyODQgLTFUMjczIDI4UTI3MyA1MiAyODcgNjdUMzI2IDgzUTM0NCA4MyAzNTUgNzVUMzY3IDQ2Wk01OTAgNDZRNTkwIDIyIDU3NiA2VDUzNiAtMTBRNTE4IC0xMCA1MDcgLTFUNDk2IDI4UTQ5NiA1MiA1MDkgNjdUNTQ5IDgzUTU2NyA4MyA1NzggNzVUNTkwIDQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzMDsiIGhvcml6LWFkdi14PSI5NjgiIGQ9Ik0zNTEgNTk2UTM1MSA1NjMgMzQ1IDUyN1QzMjQgNDYyVDI4MiA0MTRUMjE1IDM5NVExNjMgMzk1IDE0MyA0MjRUMTIzIDUwMVExMjMgNTM0IDEyOSA1NjlUMTUwIDYzM1QxOTIgNjgxVDI1OCA3MDBRMzA5IDcwMCAzMzAgNjcyVDM1MSA1OTZaTTIyMCA0MjhRMjQ5IDQyOCAyNjcgNDQ2VDI5NCA0OTBUMzA3IDU0NlQzMTAgNTk3UTMxMCA2MjcgMjk5IDY0N1QyNTMgNjY3UTIyNCA2NjcgMjA3IDY0OVQxODAgNjA1VDE2NyA1NTBUMTY0IDQ5OVExNjQgNDY5IDE3NCA0NDlUMjIwIDQyOFpNMTY3IDBIMTIxTDYzMSA3MDBINjc1TDE2NyAwWk02NDggMTk1UTY0OCAxNjIgNjQyIDEyNlQ2MjEgNjFUNTc5IDEzVDUxMiAtNlE0NjAgLTYgNDQwIDIzVDQyMCAxMDBRNDIwIDEzMyA0MjYgMTY4VDQ0NyAyMzJUNDg5IDI4MFQ1NTUgMjk5UTYwNiAyOTkgNjI3IDI3MVQ2NDggMTk1Wk01MTYgMjdRNTQ1IDI3IDU2MiA0NVQ1OTAgOTBUNjAzIDE0NlQ2MDYgMTk4UTYwNiAyMjcgNTk0IDI0NlQ1NTAgMjY1UTUyMSAyNjUgNTA0IDI0N1Q0NzcgMjAzVDQ2NCAxNDhUNDYxIDk3UTQ2MSA2NyA0NzEgNDdUNTE2IDI3Wk05NDIgMTk1UTk0MiAxNjIgOTM2IDEyNlQ5MTUgNjFUODczIDEzVDgwNiAtNlE3NTQgLTYgNzM0IDIzVDcxMyAxMDBRNzEzIDEzMyA3MTkgMTY4VDc0MCAyMzNUNzgyIDI4MFQ4NDkgMjk5UTkwMCAyOTkgOTIxIDI3MVQ5NDIgMTk1Wk04MTAgMjdRODM5IDI3IDg1NiA0NVQ4ODMgOTBUODk2IDE0NlQ4OTkgMTk3UTg5OSAyMjYgODg4IDI0NVQ4NDQgMjY1UTgxNSAyNjUgNzk4IDI0N1Q3NzEgMjAzVDc1OCAxNDhUNzU1IDk3UTc1NSA2NyA3NjUgNDdUODEwIDI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGhvcml6LWFkdi14PSIyNTkiIGQ9Ik0xODUgMTE3TDY0IDMwOUwyMzkgNTAyTDI3NiA0NzZMMTIzIDMwOUwyMzAgMTQ0TDE4NSAxMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDNBOyIgaG9yaXotYWR2LXg9IjI1OSIgZD0iTTEwNiAxMTdMNzAgMTQ0TDIyMiAzMDlMMTE1IDQ3NkwxNjAgNTAyTDI4MSAzMDlMMTA2IDExN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNDQ7IiBob3Jpei1hZHYteD0iMTExIiBkPSJNLTE2NSAwSC0yMDdMMzYyIDcwMEg0MDRMLTE2NSAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3MDsiIGhvcml6LWFkdi14PSIzMzgiIGQ9Ik0zNzAgNTgzUTM3MCA1NDYgMzYzIDUwN1QzMzkgNDM2VDI5MyAzODJUMjE5IDM2MVExNjIgMzYxIDEzOSAzOTJUMTE2IDQ3N1ExMTYgNTE0IDEyMiA1NTNUMTQ2IDYyNVQxOTMgNjc5VDI2NyA3MDBRMzI0IDcwMCAzNDcgNjY5VDM3MCA1ODNaTTIyNCAzOThRMjU2IDM5OCAyNzYgNDE4VDMwNiA0NjhUMzIwIDUzMFQzMjQgNTg3UTMyNCA2MjAgMzEyIDY0MVQyNjIgNjYzUTIzMCA2NjMgMjEwIDY0M1QxODAgNTk0VDE2NiA1MzNUMTYyIDQ3NlExNjIgNDQyIDE3NCA0MjBUMjI0IDM5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNzQ7IiBob3Jpei1hZHYteD0iMzAwIiBkPSJNMjg1IDQzN0wyNzUgMzY3SDIyOEwyMzggNDM3SDk2TDg4IDQ3NUwyNjcgNjk0SDMyMUwyOTAgNDc2SDM0MEwzMzUgNDM3SDI4NVpNMTMyIDQ3NEgyNDRMMjY4IDY0NkwxMzIgNDc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3NTsiIGhvcml6LWFkdi14PSIzMDIiIGQ9Ik0zMzAgNTA1UTMzMCA0NzUgMzIyIDQ0OVQyOTcgNDA0VDI1NSAzNzNUMTk3IDM2MVExNjYgMzYxIDE0MiAzNjhUOTUgMzkzTDEyMiA0MjZRMTM5IDQxMSAxNTcgNDA1VDE5OCAzOThRMjM5IDM5OCAyNjAgNDI1VDI4MiA0OThRMjgyIDU1NCAyMjQgNTU0UTIwNCA1NTQgMTg4IDU0N1QxNTEgNTIzTDExOCA1NDlMMTYzIDY5NEgzMzZMMzMxIDY1NEgxOTJMMTYzIDU2M0wxNjYgNTYwUTE4NCA1NzQgMjAxIDU4MVQyNDAgNTg4UTI4MyA1ODggMzA2IDU2OFQzMzAgNTA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3NjsiIGhvcml6LWFkdi14PSIzMTciIGQ9Ik0zNDQgNDk1UTM0NCA0NjYgMzM1IDQ0MlQzMDggMzk5VDI2OCAzNzFUMjE1IDM2MVExNjIgMzYxIDEzOCAzODhUMTE0IDQ2NlExMTQgNDc2IDExNSA0ODdUMTE4IDUxMFExMjMgNTQ0IDEzMiA1NzhUMTU5IDYzOVQyMDQgNjgzVDI3MyA3MDBRMzE1IDcwMCAzNTIgNjc3TDMyOCA2NDRRMzAyIDY2MyAyNjkgNjYzUTI0MiA2NjMgMjI0IDY1MlQxOTQgNjIyVDE3NiA1ODBUMTY2IDUzNUgxNzBRMjAxIDU3NyAyNTQgNTc3UTI5NSA1NzcgMzE5IDU1OFQzNDQgNDk1Wk0yMjAgMzk4UTI1OSAzOTggMjc5IDQyM1QzMDAgNDg3UTMwMCA1MTYgMjg0IDUyOVQyMzkgNTQzUTIwMiA1NDMgMTgxIDUxNlQxNjAgNDU1UTE2MCA0MjYgMTc2IDQxMlQyMjAgMzk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3NzsiIGhvcml6LWFkdi14PSIyNzciIGQ9Ik0zNDEgNjUwUTMwNyA2MjcgMjgzIDYwNVQyNDMgNTU1VDIxNiA0ODlUMTk3IDM5NkwxOTMgMzY3SDE0NEwxNDYgMzc5UTE1MSA0MTggMTU5IDQ1NVQxODMgNTI2VDIyNCA1OTJUMjkxIDY1MFY2NTRIMTE2TDEyMiA2OTRIMzM5TDM0MSA2NTBIMzQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3ODsiIGhvcml6LWFkdi14PSIzMTYiIGQ9Ik0zNDEgNDczUTM0MSA0NDQgMzMxIDQyM1QzMDIgMzg4VDI2MCAzNjhUMjA5IDM2MVExODkgMzYxIDE3MCAzNjRUMTM3IDM3N1QxMTMgNDAxVDEwNCA0NDBRMTA0IDUxNCAxNzUgNTM4VjU0MlExMzcgNTU5IDEzNyA1OTdRMTM3IDYyNCAxNDYgNjQyVDE3MiA2NzJUMjEwIDY4OVQyNTYgNjk1UTI3MyA2OTUgMjkwIDY5MlQzMjAgNjgyVDM0MiA2NjFUMzUxIDYyN1EzNTEgNTY1IDI5NCA1NDJWNTM4UTMxNyA1MjkgMzI5IDUxNFQzNDEgNDczWk0yMzYgNTU1UTI2NyA1NTUgMjg2IDU3MVQzMDYgNjE5UTMwNiA2NDQgMjkwIDY1MlQyNTEgNjYwUTIxOSA2NjAgMjAxIDY0NlQxODIgNTk4UTE4MiA1NzMgMTk4IDU2NFQyMzYgNTU1Wk0yMTQgMzk2UTI0OSAzOTYgMjcyIDQxNFQyOTYgNDcxUTI5NiA1MDAgMjc3IDUxMVQyMzEgNTIyUTE5NSA1MjIgMTczIDUwM1QxNTAgNDQ2UTE1MCA0MTcgMTY5IDQwN1QyMTQgMzk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA3OTsiIGhvcml6LWFkdi14PSIzMjAiIGQ9Ik0zNTMgNTg4UTM1MyA1NDkgMzQ3IDUwOVQzMjMgNDM2VDI3NSAzODJUMTk3IDM2MVExNzMgMzYxIDE1MiAzNjdUMTExIDM4OEwxMzYgNDIwUTE1MiA0MDcgMTY2IDQwMlQyMDEgMzk3UTIzMCAzOTcgMjQ5IDQwOVQyNzkgNDQwVDI5NiA0ODNUMzA1IDUzMkgzMDFRMjg3IDUwOSAyNjQgNDk3VDIxNSA0ODVRMTc0IDQ4NSAxNDggNTA1VDEyMiA1NjlRMTIyIDYyNyAxNTkgNjYzVDI1NCA3MDBRMzA5IDcwMCAzMzEgNjcwVDM1MyA1ODhaTTIyNiA1MjFRMjY0IDUyMSAyODUgNTQ1VDMwNyA2MDdRMzA3IDYzNiAyOTIgNjUwVDI0OCA2NjRRMjExIDY2NCAxOTAgNjM4VDE2OCA1NzdRMTY4IDU0OSAxODMgNTM1VDIyNiA1MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgwOyIgaG9yaXotYWR2LXg9IjMzOCIgZD0iTTMwMiAxMDFRMzAyIDY0IDI5NSAyNVQyNzEgLTQ2VDIyNSAtMTAwVDE1MSAtMTIxUTk0IC0xMjEgNzEgLTkwVDQ4IC01UTQ4IDMyIDU0IDcxVDc4IDE0M1QxMjUgMTk3VDE5OSAyMThRMjU2IDIxOCAyNzkgMTg3VDMwMiAxMDFaTTE1NyAtODRRMTg5IC04NCAyMDggLTY0VDIzOCAtMTRUMjUyIDQ4VDI1NiAxMDVRMjU2IDEzOCAyNDQgMTU5VDE5NCAxODFRMTYyIDE4MSAxNDMgMTYxVDExMyAxMTNUOTkgNTJUOTUgLTRROTUgLTM3IDEwNyAtNjBUMTU3IC04NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODE7IiBob3Jpei1hZHYteD0iMjY4IiBkPSJNMTA4IC03N0wxNDEgMTU5SDEzN0w2MiAxMTdMNTAgMTUxTDE1NyAyMTJIMTkzTDE1MyAtNzdIMjM0TDIyOCAtMTE1SDE5TDI1IC03N0gxMDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDgyOyIgaG9yaXotYWR2LXg9IjI5OSIgZD0iTTI3IC0xMTVMMjUgLTcxUTUxIC01MCA4NiAtMjZUMTUyIDI1VDIwNCA3OFQyMjYgMTMxUTIyNiAxNTEgMjE2IDE2NVQxNzYgMTgwUTE1MyAxODAgMTMzIDE3MFQ4OCAxMzdMNjUgMTY3UTk2IDE5NCAxMjQgMjA2VDE4NiAyMThRMjI2IDIxOCAyNDkgMTk4VDI3MyAxNDNRMjczIDExMCAyNTMgODBUMjAyIDIxVDEzNyAtMzFUNzMgLTc2SDI0N0wyNDIgLTExNUgyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODM7IiBob3Jpei1hZHYteD0iMjkyIiBkPSJNMjQ5IC0zUTI0OSAtNjIgMjEzIC05MVQxMjAgLTEyMVE5MSAtMTIxIDY2IC0xMTNUMTggLTg2TDQyIC01MlE3NyAtODQgMTIyIC04NFExNTcgLTg0IDE4MCAtNjVUMjAzIC04UTIwMyAyMiAxODMgMjlUMTM4IDM3SDEwNEwxMDkgNzNRMTI2IDczIDE0NCA3NFQxNzkgODJUMjA1IDEwMVQyMTUgMTM3UTIxNSAxNjEgMTk5IDE3MFQxNjEgMTgwUTExNiAxODAgNzggMTUwTDYwIDE4M1E4OCAyMDAgMTEzIDIwOVQxNzEgMjE4UTE4OSAyMTggMjA1IDIxNVQyMzMgMjAzVDI1MyAxODBUMjYxIDE0NlEyNjEgMTE3IDI0NiA5NVQyMDEgNjJWNThRMjQ5IDQ2IDI0OSAtM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODQ7IiBob3Jpei1hZHYteD0iMzAwIiBkPSJNMjE3IC00NUwyMDcgLTExNUgxNjBMMTcwIC00NUgyOEwyMSAtN0wxOTkgMjEySDI1M0wyMjMgLTZIMjczTDI2NyAtNDVIMjE3Wk02NCAtOEgxNzZMMjAxIDE2NEw2NCAtOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODU7IiBob3Jpei1hZHYteD0iMzAyIiBkPSJNMjYyIDIzUTI2MiAtNyAyNTQgLTMzVDIyOSAtNzhUMTg3IC0xMDlUMTI5IC0xMjFROTggLTEyMSA3NCAtMTE0VDI3IC04OUw1NCAtNTZRNzEgLTcxIDg5IC03N1QxMzAgLTg0UTE3MSAtODQgMTkyIC01N1QyMTQgMTZRMjE0IDcyIDE1NiA3MlExMzYgNzIgMTIwIDY1VDgzIDQxTDUwIDY3TDk1IDIxMkgyNjhMMjYzIDE3MkgxMjRMOTUgODFMOTggNzhRMTE2IDkyIDEzMyA5OVQxNzIgMTA2UTIxNSAxMDYgMjM4IDg2VDI2MiAyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODY7IiBob3Jpei1hZHYteD0iMzE3IiBkPSJNMjc1IDEzUTI3NSAtMTYgMjY2IC00MFQyMzkgLTgzVDE5OSAtMTExVDE0NiAtMTIxUTkzIC0xMjEgNjkgLTk0VDQ1IC0xNlE0NSAtNiA0NiA1VDQ5IDI4UTU0IDYyIDYzIDk2VDkwIDE1N1QxMzUgMjAxVDIwNCAyMThRMjQ2IDIxOCAyODMgMTk1TDI1OSAxNjJRMjMzIDE4MSAyMDAgMTgxUTE3MyAxODEgMTU1IDE3MFQxMjUgMTQwVDEwNyA5OFQ5NyA1M0gxMDFRMTMyIDk1IDE4NSA5NVEyMjYgOTUgMjUwIDc2VDI3NSAxM1pNMTUxIC04NFExOTAgLTg0IDIxMCAtNTlUMjMxIDVRMjMxIDM0IDIxNSA0N1QxNzAgNjFRMTMzIDYxIDExMiAzNFQ5MSAtMjdROTEgLTU2IDEwNyAtNzBUMTUxIC04NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwODc7IiBob3Jpei1hZHYteD0iMjc3IiBkPSJNMjczIDE2OFEyMzkgMTQ1IDIxNSAxMjNUMTc1IDczVDE0OCA3VDEyOSAtODZMMTI1IC0xMTVINzZMNzggLTEwM1E4NCAtNjQgOTIgLTI3VDExNSA0NFQxNTcgMTEwVDIyNCAxNjhWMTcySDQ5TDU0IDIxMkgyNzFMMjczIDE2OEgyNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg4OyIgaG9yaXotYWR2LXg9IjMxNiIgZD0iTTI3MyAtOVEyNzMgLTM4IDI2MyAtNTlUMjM0IC05NFQxOTIgLTExNFQxNDEgLTEyMVExMjEgLTEyMSAxMDIgLTExOFQ2OSAtMTA1VDQ1IC04MVQzNiAtNDJRMzYgMzIgMTA3IDU2VjYwUTY5IDc3IDY5IDExNVE2OSAxNDIgNzggMTYwVDEwNCAxOTBUMTQyIDIwN1QxODggMjEzUTIwNSAyMTMgMjIyIDIxMFQyNTIgMjAwVDI3NCAxNzlUMjgzIDE0NVEyODMgODMgMjI2IDYwVjU2UTI0OSA0NyAyNjEgMzJUMjczIC05Wk0xNjggNzNRMTk5IDczIDIxOCA4OVQyMzggMTM3UTIzOCAxNjIgMjIyIDE3MFQxODMgMTc4UTE1MSAxNzggMTMzIDE2NFQxMTQgMTE2UTExNCA5MSAxMzAgODJUMTY4IDczWk0xNDYgLTg2UTE4MSAtODYgMjA0IC02OFQyMjggLTExUTIyOCAxOCAyMDkgMjlUMTYzIDQwUTEyNyA0MCAxMDUgMjFUODIgLTM2UTgyIC02NSAxMDEgLTc1VDE0NiAtODZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDg5OyIgaG9yaXotYWR2LXg9IjMyMCIgZD0iTTI4NSAxMDZRMjg1IDY3IDI3OSAyN1QyNTUgLTQ2VDIwNyAtMTAwVDEyOSAtMTIxUTEwNSAtMTIxIDg0IC0xMTVUNDMgLTk0TDY4IC02MlE4NCAtNzUgOTggLTgwVDEzMyAtODVRMTYyIC04NSAxODEgLTczVDIxMSAtNDJUMjI4IDFUMjM3IDUwSDIzM1EyMTkgMjcgMTk2IDE1VDE0NyAzUTEwNiAzIDgwIDIzVDU0IDg3UTU0IDE0NSA5MSAxODFUMTg2IDIxOFEyNDEgMjE4IDI2MyAxODhUMjg1IDEwNlpNMTU4IDM5UTE5NiAzOSAyMTcgNjNUMjM5IDEyNVEyMzkgMTU0IDIyNCAxNjhUMTgwIDE4MlExNDMgMTgyIDEyMiAxNTZUMTAwIDk1UTEwMCA2NyAxMTUgNTNUMTU4IDM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjBBQzsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik0xNTYgNDI2UTE2OSA0NzggMTg4IDUyNFQyMzYgNjA0VDMwNyA2NThUNDExIDY3OFE0NzEgNjc4IDUxMyA2NTRUNTkwIDU4MEw1NDQgNTQyUTUyMCA1ODQgNDg3IDYwNVQ0MDUgNjI2UTM1NyA2MjYgMzI2IDYxMFQyNzQgNTY3VDI0MSA1MDNUMjE4IDQyNkg1MDNMNDk4IDM4NUgyMTFRMjA2IDM1OSAyMDMgMzMzVDE5NyAyODFINDgzTDQ3NyAyMzlIMTkzUTE5MiAyMjAgMTkyIDIxM1QxOTIgMjAwUTE5MiAxNjcgMTk3IDEzOFQyMTcgODdUMjU3IDUzVDMyMCA0MFEzODAgNDAgNDIwIDY3VDQ5NSAxNDBMNTI5IDEwNVE0ODQgNTEgNDMzIDIwVDMxMCAtMTFRMjU0IC0xMSAyMTkgNlQxNjQgNTRUMTM3IDEyNlQxMzAgMjE3VjIzOUg1N0w2MyAyODFIMTMzUTEzNSAzMDcgMTM4IDMzM1QxNDggMzg1SDc4TDgzIDQyNkgxNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTIyOyIgaG9yaXotYWR2LXg9IjU5NiIgZD0iTTU2MSA0ODFMNTgyIDYzMEw0ODYgNTE0TDQyMiA2MzBMNDAxIDQ4MUgzNjFMMzkyIDcwMEg0MzBMNDk1IDU3OEw1OTQgNzAwSDYzMkw2MDEgNDgxSDU2MVpNMjU4IDY2NEwyMzIgNDgxSDE5MUwyMTcgNjY0SDE0MkwxNDcgNzAwSDMzOEwzMzMgNjY0SDI1OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNTM7IiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMjAwIDQwNUwyMzQgNjQxSDIzMEwxNTUgNTk5TDE0MiA2MzNMMjUwIDY5NEgyODZMMjQ1IDQwNUgzMjZMMzIxIDM2N0gxMTJMMTE3IDQwNUgyMDBaTTEzOCAwSDk2TDY2NSA3MDBINzA3TDEzOCAwWk02NjQgMTEyUTY2NCA1MyA2MjggMjRUNTM1IC02UTUwNiAtNiA0ODEgMlQ0MzMgMjlMNDU3IDYzUTQ5MiAzMSA1MzcgMzFRNTcyIDMxIDU5NSA1MFQ2MTggMTA3UTYxOCAxMzcgNTk4IDE0NFQ1NTMgMTUySDUxOUw1MjQgMTg4UTU0MSAxODggNTU5IDE4OVQ1OTQgMTk3VDYyMCAyMTZUNjMwIDI1MlE2MzAgMjc2IDYxNCAyODVUNTc2IDI5NVE1MzEgMjk1IDQ5MyAyNjVMNDc1IDI5OFE1MDMgMzE1IDUyOCAzMjRUNTg2IDMzM1E2MDQgMzMzIDYyMCAzMzBUNjQ4IDMxOFQ2NjggMjk1VDY3NiAyNjFRNjc2IDIzMiA2NjEgMjEwVDYxNiAxNzdWMTczUTY2NCAxNjEgNjY0IDExMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNTQ7IiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMTE1IDM2N0wxMTMgNDExUTEzOSA0MzIgMTc0IDQ1NlQyNDAgNTA3VDI5MiA1NjBUMzE0IDYxM1EzMTQgNjMzIDMwNCA2NDdUMjY0IDY2MlEyNDEgNjYyIDIyMSA2NTJUMTc2IDYxOUwxNTMgNjQ5UTE4NCA2NzYgMjEyIDY4OFQyNzQgNzAwUTMxNCA3MDAgMzM3IDY4MFQzNjEgNjI1UTM2MSA1OTIgMzQxIDU2MlQyOTAgNTAzVDIyNSA0NTFUMTYxIDQwNkgzMzVMMzMwIDM2N0gxMTVaTTEzOCAwSDk2TDY2NSA3MDBINzA3TDEzOCAwWk02NjQgMTEyUTY2NCA1MyA2MjggMjRUNTM1IC02UTUwNiAtNiA0ODEgMlQ0MzMgMjlMNDU3IDYzUTQ5MiAzMSA1MzcgMzFRNTcyIDMxIDU5NSA1MFQ2MTggMTA3UTYxOCAxMzcgNTk4IDE0NFQ1NTMgMTUySDUxOUw1MjQgMTg4UTU0MSAxODggNTU5IDE4OVQ1OTQgMTk3VDYyMCAyMTZUNjMwIDI1MlE2MzAgMjc2IDYxNCAyODVUNTc2IDI5NVE1MzEgMjk1IDQ5MyAyNjVMNDc1IDI5OFE1MDMgMzE1IDUyOCAzMjRUNTg2IDMzM1E2MDQgMzMzIDYyMCAzMzBUNjQ4IDMxOFQ2NjggMjk1VDY3NiAyNjFRNjc2IDIzMiA2NjEgMjEwVDYxNiAxNzdWMTczUTY2NCAxNjEgNjY0IDExMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNUI7IiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMjAwIDQwNUwyMzQgNjQxSDIzMEwxNTUgNTk5TDE0MiA2MzNMMjUwIDY5NEgyODZMMjQ1IDQwNUgzMjZMMzIxIDM2N0gxMTJMMTE3IDQwNUgyMDBaTTEzOCAwSDk2TDY2NSA3MDBINzA3TDEzOCAwWk02NzAgMTA2UTY3MCA3NyA2NjAgNTZUNjMxIDIxVDU4OSAxVDUzOCAtNlE1MTggLTYgNDk5IC0zVDQ2NiAxMFQ0NDIgMzRUNDMzIDczUTQzMyAxNDcgNTA0IDE3MVYxNzVRNDY2IDE5MiA0NjYgMjMwUTQ2NiAyNTcgNDc1IDI3NVQ1MDEgMzA1VDUzOSAzMjJUNTg1IDMyOFE2MDIgMzI4IDYxOSAzMjVUNjQ5IDMxNVQ2NzEgMjk0VDY4MCAyNjBRNjgwIDE5OCA2MjMgMTc1VjE3MVE2NDYgMTYyIDY1OCAxNDdUNjcwIDEwNlpNNTY1IDE4OFE1OTYgMTg4IDYxNSAyMDRUNjM1IDI1MlE2MzUgMjc3IDYxOSAyODVUNTgwIDI5M1E1NDggMjkzIDUzMCAyNzlUNTExIDIzMVE1MTEgMjA2IDUyNyAxOTdUNTY1IDE4OFpNNTQzIDI5UTU3OCAyOSA2MDEgNDdUNjI1IDEwNFE2MjUgMTMzIDYwNiAxNDRUNTYwIDE1NVE1MjQgMTU1IDUwMiAxMzZUNDc5IDc5UTQ3OSA1MCA0OTggNDBUNTQzIDI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE1QzsiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik0zMzMgNDc5UTMzMyA0MjAgMjk3IDM5MVQyMDQgMzYxUTE3NSAzNjEgMTUwIDM2OVQxMDIgMzk2TDEyNiA0MzBRMTYxIDM5OCAyMDYgMzk4UTI0MSAzOTggMjY0IDQxN1QyODcgNDc0UTI4NyA1MDQgMjY3IDUxMVQyMjIgNTE5SDE4OEwxOTMgNTU1UTIxMCA1NTUgMjI4IDU1NlQyNjMgNTY0VDI4OSA1ODNUMjk5IDYxOVEyOTkgNjQzIDI4MyA2NTJUMjQ1IDY2MlEyMDAgNjYyIDE2MiA2MzJMMTQ0IDY2NVExNzIgNjgyIDE5NyA2OTFUMjU1IDcwMFEyNzMgNzAwIDI4OSA2OTdUMzE3IDY4NVQzMzcgNjYyVDM0NSA2MjhRMzQ1IDU5OSAzMzAgNTc3VDI4NSA1NDRWNTQwUTMzMyA1MjggMzMzIDQ3OVpNMTM4IDBIOTZMNjY1IDcwMEg3MDdMMTM4IDBaTTY3MCAxMDZRNjcwIDc3IDY2MCA1NlQ2MzEgMjFUNTg5IDFUNTM4IC02UTUxOCAtNiA0OTkgLTNUNDY2IDEwVDQ0MiAzNFQ0MzMgNzNRNDMzIDE0NyA1MDQgMTcxVjE3NVE0NjYgMTkyIDQ2NiAyMzBRNDY2IDI1NyA0NzUgMjc1VDUwMSAzMDVUNTM5IDMyMlQ1ODUgMzI4UTYwMiAzMjggNjE5IDMyNVQ2NDkgMzE1VDY3MSAyOTRUNjgwIDI2MFE2ODAgMTk4IDYyMyAxNzVWMTcxUTY0NiAxNjIgNjU4IDE0N1Q2NzAgMTA2Wk01NjUgMTg4UTU5NiAxODggNjE1IDIwNFQ2MzUgMjUyUTYzNSAyNzcgNjE5IDI4NVQ1ODAgMjkzUTU0OCAyOTMgNTMwIDI3OVQ1MTEgMjMxUTUxMSAyMDYgNTI3IDE5N1Q1NjUgMTg4Wk01NDMgMjlRNTc4IDI5IDYwMSA0N1Q2MjUgMTA0UTYyNSAxMzMgNjA2IDE0NFQ1NjAgMTU1UTUyNCAxNTUgNTAyIDEzNlQ0NzkgNzlRNDc5IDUwIDQ5OCA0MFQ1NDMgMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTVEOyIgaG9yaXotYWR2LXg9IjY5MCIgZD0iTTM0NiA1MDVRMzQ2IDQ3NSAzMzggNDQ5VDMxMyA0MDRUMjcxIDM3M1QyMTMgMzYxUTE4MiAzNjEgMTU4IDM2OFQxMTEgMzkzTDEzOCA0MjZRMTU1IDQxMSAxNzMgNDA1VDIxNCAzOThRMjU1IDM5OCAyNzYgNDI1VDI5OCA0OThRMjk4IDU1NCAyNDAgNTU0UTIyMCA1NTQgMjA0IDU0N1QxNjcgNTIzTDEzNCA1NDlMMTc5IDY5NEgzNTJMMzQ3IDY1NEgyMDhMMTc5IDU2M0wxODIgNTYwUTIwMCA1NzQgMjE3IDU4MVQyNTYgNTg4UTI5OSA1ODggMzIyIDU2OFQzNDYgNTA1Wk0xMzggMEg5Nkw2NjUgNzAwSDcwN0wxMzggMFpNNjcwIDEwNlE2NzAgNzcgNjYwIDU2VDYzMSAyMVQ1ODkgMVQ1MzggLTZRNTE4IC02IDQ5OSAtM1Q0NjYgMTBUNDQyIDM0VDQzMyA3M1E0MzMgMTQ3IDUwNCAxNzFWMTc1UTQ2NiAxOTIgNDY2IDIzMFE0NjYgMjU3IDQ3NSAyNzVUNTAxIDMwNVQ1MzkgMzIyVDU4NSAzMjhRNjAyIDMyOCA2MTkgMzI1VDY0OSAzMTVUNjcxIDI5NFQ2ODAgMjYwUTY4MCAxOTggNjIzIDE3NVYxNzFRNjQ2IDE2MiA2NTggMTQ3VDY3MCAxMDZaTTU2NSAxODhRNTk2IDE4OCA2MTUgMjA0VDYzNSAyNTJRNjM1IDI3NyA2MTkgMjg1VDU4MCAyOTNRNTQ4IDI5MyA1MzAgMjc5VDUxMSAyMzFRNTExIDIwNiA1MjcgMTk3VDU2NSAxODhaTTU0MyAyOVE1NzggMjkgNjAxIDQ3VDYyNSAxMDRRNjI1IDEzMyA2MDYgMTQ0VDU2MCAxNTVRNTI0IDE1NSA1MDIgMTM2VDQ3OSA3OVE0NzkgNTAgNDk4IDQwVDU0MyAyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxNUU7IiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMzk2IDY1MFEzNjIgNjI3IDMzOCA2MDVUMjk4IDU1NVQyNzEgNDg5VDI1MiAzOTZMMjQ4IDM2N0gxOTlMMjAxIDM3OVEyMDYgNDE4IDIxNCA0NTVUMjM4IDUyNlQyNzkgNTkyVDM0NiA2NTBWNjU0SDE3MUwxNzcgNjk0SDM5NEwzOTYgNjUwWk0xMzggMEg5Nkw2NjUgNzAwSDcwN0wxMzggMFpNNjcwIDEwNlE2NzAgNzcgNjYwIDU2VDYzMSAyMVQ1ODkgMVQ1MzggLTZRNTE4IC02IDQ5OSAtM1Q0NjYgMTBUNDQyIDM0VDQzMyA3M1E0MzMgMTQ3IDUwNCAxNzFWMTc1UTQ2NiAxOTIgNDY2IDIzMFE0NjYgMjU3IDQ3NSAyNzVUNTAxIDMwNVQ1MzkgMzIyVDU4NSAzMjhRNjAyIDMyOCA2MTkgMzI1VDY0OSAzMTVUNjcxIDI5NFQ2ODAgMjYwUTY4MCAxOTggNjIzIDE3NVYxNzFRNjQ2IDE2MiA2NTggMTQ3VDY3MCAxMDZaTTU2NSAxODhRNTk2IDE4OCA2MTUgMjA0VDYzNSAyNTJRNjM1IDI3NyA2MTkgMjg1VDU4MCAyOTNRNTQ4IDI5MyA1MzAgMjc5VDUxMSAyMzFRNTExIDIwNiA1MjcgMTk3VDU2NSAxODhaTTU0MyAyOVE1NzggMjkgNjAxIDQ3VDYyNSAxMDRRNjI1IDEzMyA2MDYgMTQ0VDU2MCAxNTVRNTI0IDE1NSA1MDIgMTM2VDQ3OSA3OVE0NzkgNTAgNDk4IDQwVDU0MyAyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTI7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNODYgMjMxTDk0IDI4NUg1NDBMNTMyIDIzMUg4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjA7IiBob3Jpei1hZHYteD0iNTU0IiBkPSJNNDEyIDMxMkwyODQgMjAxSDUyOEw1MjAgMTQ3SDIyOUwxMjUgNTVMOTIgODlMMTU5IDE0N0g3NUw4MyAyMDFIMjE1TDM0MiAzMTJIOThMMTA2IDM2NkgzOThMNTA3IDQ2M0w1NDIgNDMwTDQ2NyAzNjZINTUxTDU0MyAzMTJINDEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik04OSAyNTZMOTggMzE1TDU2OCA0ODRMNTYwIDQyN0wxNTQgMjg2TDUyMCAxNDhMNTEyIDkyTDg5IDI1NlpNNTQgMEw2MSA1M0g1MDdMNTAwIDBINTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTY2IDkyTDc0IDE0OEw0ODAgMjg2TDExNCA0MjdMMTIyIDQ4NEw1NDQgMzE1TDUzNSAyNTZMNjYgOTJaTTU0IDBMNjEgNTNINTA3TDUwMCAwSDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjRERjsiIGhvcml6LWFkdi14PSI5MDYiIGQ9Ik03OTkgMzM0UTc5OSAyNjIgNzcyIDIwMFQ2OTggOTFUNTg4IDE3VDQ1MyAtMTBRMzgxIC0xMCAzMTggMTdUMjA4IDkwVDEzNCAxOTlUMTA3IDMzNFExMDcgNDA2IDEzNCA0NjhUMjA4IDU3N1QzMTggNjUxVDQ1MyA2NzhRNTI1IDY3OCA1ODggNjUxVDY5OCA1NzhUNzcyIDQ2OVQ3OTkgMzM0Wk03NjYgMzM0UTc2NiAzOTggNzQyIDQ1NFQ2NzYgNTU0VDU3NyA2MjJUNDUzIDY0N1EzODYgNjQ3IDMyOSA2MjJUMjMwIDU1NFQxNjUgNDU1VDE0MSAzMzRRMTQxIDI3MCAxNjYgMjE0VDIzMyAxMTVUMzMyIDQ4VDQ1MyAyM1E1MTcgMjMgNTczIDQ3VDY3MyAxMTRUNzQxIDIxM1Q3NjYgMzM0Wk02MzcgNDIxUTYzNyAzNTAgNjAwIDMxOFQ0ODQgMjg1SDM3NVYxMDdIMzI2VjU1MVEzNjAgNTU1IDM5NyA1NTZUNDcxIDU1N1E1MDggNTU3IDUzOCA1NTFUNTkxIDUzMFQ2MjUgNDg4VDYzNyA0MjFaTTU4OCA0MTlRNTg4IDQ0OSA1ODEgNDY4VDU1OCA0OTlUNTIxIDUxNVQ0NjggNTE5UTQ0NCA1MTkgNDIyIDUxOFQzNzUgNTE0VjMyM0g0NjhRNDk0IDMyMyA1MTYgMzI2VDU1NCAzMzlUNTc5IDM2OFQ1ODggNDE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjZDMzsiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0xNDggLTIwNkgxMDdMMTUxIC02MUgyMjBMMTQ4IC0yMDZaIiAgLz4KKworCis8L2ZvbnQ+Cis8L2RlZnM+Cis8dGV4dCB4PSI0MCIgeT0iNDAiIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgTHRJdCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEHDgcOAw4LDhMOFw4PDhiBDw4cgRMOQIEXDicOIw4rDiyBJIMONIMOMIMOOIMOPIE7DkTwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSI4MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBMdEl0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+T8OTw5LDlMOWw5XDmMWSIFPFoCBVw5rDmcObw5wgWcOdxbggWsW9IMOeIGHDocOgw6LDpMOlw6PDpiBjw6cgZMOwIGXDqcOow6rDqyBpIMSxIMOtIMOsIMOuIMOvIG7DsSBvw7PDssO0w7bDtcO4xZMgc8Whw58gdcO6w7nDu8O8IHnDvcO/IHrFvjwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxMjAiIGZvbnQtZmFtaWx5PSJDbGVhcnZpZXdBVFQgTHRJdCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPsO+IDEyMzQ1Njc4OTAgwr0gwrwgwr4gJSDigLAgJMKiwqPCpcaS4oKswqQg4oCgIOKAoSDCpyDCtiAjIF5+wrUgK8OXwrEgJmx0OyA9ICZndDsgw7fCrCAhwqE/wr8gJnF1b3Q7ICZhbXA7ICZhcG9zOyAqIMKwIC4gLCA6IDsgKCkgWyBcIF0ge30gLyB8PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjE2MCIgZm9udC1mYW1pbHk9IkNsZWFydmlld0FUVCBMdEl0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+wqYgXyDigJog4oCeIOKApiDigLnigLogwqvCuyDigJgg4oCZIOKAnCDigJ0g4oCiIMKtIC0g4oCTIOKAlCBAIMKpIMKuIOKEoiDCqsK6IMK5wrLCsyDCtCBgIMuGIMucIMKoIMKvIMK3IMK4PC90ZXh0PgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LnR0ZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUx0SXQudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2FjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LndvZmYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvQ2xlYXJ2aWV3QVRUL0NsZWFydmlld0FUVC1MdEl0LndvZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4YTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9DbGVhcnZpZXdBVFQvQ2xlYXJ2aWV3QVRULUx0SXQud29mZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvQVQmVCBWYXJpYXRpb24gSUQudGFiIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL0FUJlQgVmFyaWF0aW9uIElELnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDA4NWZkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL0FUJlQgVmFyaWF0aW9uIElELnRhYgpAQCAtMCwwICsxLDkgQEAKKwkJCQlWYXJpYXRpb24gSUQJdGllcgkKKzYwMgkyNDg3NQkxMjQzMTE2CU9tbmVzX0FUVCBXMDIgSXRhbGljCTEyNDMxMTcJMzgJQ1VTMjQ4NzVXMDIKKzYwMgkyNDg3MgkxMjQzMTE5CU9tbmVzX0FUVCBXMDIgTGlnaHQJMTI0MzEyMAkzOAlDVVMyNDg3MlcwMgorNjAyCTI0ODczCTEyNDMxMjIJT21uZXNfQVRUIFcwMiBMaWdodCBJdGFsaWMJMTI0MzEyMwkzOAlDVVMyNDg3M1cwMgorNjAyCTI0ODc2CTEyNDMxMjUJT21uZXNfQVRUIFcwMiBNZWRpdW0JMTI0MzEyNgkzOAlDVVMyNDg3NlcwMgorNjAyCTI0ODc3CTEyNDMxMjgJT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljCTEyNDMxMjkJMzgJQ1VTMjQ4NzdXMDIKKzYwMgkyNDg3NAkxMjQzMTMxCU9tbmVzX0FUVCBXMDIgUmVndWxhcgkxMjQzMTMyCTM4CUNVUzI0ODc0VzAyCis2MDIJMjY3MzAJMTQxODIyMAlPbW5lc19BVFQgVzAyIEJvbGQJMTQxODIyMQkzOAlDVVMyNjczMFcwMgorNjAyCTI2NzMxCTE0MTgyMjMJT21uZXNfQVRUIFcwMiBCb2xkIEl0YWxpYwkxNDE4MjI0CTM4CUNVUzI2NzMxVzAyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNBVFRXMDJCb2xkSXRhbGljLmVvdCBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMuZW90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWMxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNBVFRXMDJCb2xkSXRhbGljLmVvdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNBVFRXMDJCb2xkSXRhbGljLnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjA3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNBVFRXMDJCb2xkSXRhbGljLnN2ZwpAQCAtMCwwICsxLDM2NzEgQEAKKzw/eG1sICB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiID4KKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiA+Cis8bWV0YWRhdGE+Cis8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Cis8aWQ+PCFbQ0RBVEFbT21uZXNfQVRUIFcwMiBCb2xkIEl0YWxpY11dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0dlbmVyYXRlZCBpbiAyMDEwIGJ5IEZvbnRMYWIgU3R1ZGlvLiBDb3B5cmlnaHQgaW5mbyBwZW5kaW5nLl1dPjwvY29weXJpZ2h0PgorPHRyYWRlbWFyaz48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjU3MCIgaWQ9Ik9tbmVzQVRUVzAyQm9sZEl0YWxpYyI+Cis8Zm9udC1mYWNlIGZvbnQtZmFtaWx5PSJPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMiIHBhbm9zZS0xPSIyIDAgOCAwIDAgMCAwIDkgMCAwIiBhc2NlbnQ9IjkwOSIgZGVzY2VudD0iLTI0MCIgdW5pdHMtcGVyLWVtPSIxMDAwIiBhbHBoYWJldGljPSIwIj4KKzwvZm9udC1mYWNlPgorPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGdseXBoLW5hbWU9InNwYWNlIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiEiIGdseXBoLW5hbWU9ImV4Y2xhbSIgaG9yaXotYWR2LXg9IjI5NyIgZD0iTTE0OSAyMTVRMTE4IDIxNSAxMDYgMjI5VDk0IDI3NkwxMDYgNjQ3SDM1N0wyMTIgMjc0UTE5OCAyNDQgMTg1IDIzMFQxNDkgMjE1Wk0xNiA1NVExNiA3NSAyMyAxMDNUNDggMTQ5UTU0IDE1NSA2MCAxNTlUNzYgMTY2VDk3IDE3MFQxMjkgMTcxUTE3MSAxNzEgMTkwIDE1NlQyMTAgMTA4UTIxMCA4OCAyMDMgNjBUMTc4IDE0UTE2NiAyIDE1MCAtM1Q5NyAtOFE1NSAtOCAzNiA3VDE2IDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJnF1b3Q7IiBnbHlwaC1uYW1lPSJxdW90ZWRibCIgaG9yaXotYWR2LXg9IjQ4MyIgZD0iTTMzNiA2NDdINTM3TDQyNyAzNjlRNDE4IDM0NyA0MDggMzM4VDM3MyAzMjlRMzQ0IDMyOSAzMzAgMzM4VDMxNyAzODBMMzM2IDY0N1pNMTU4IDMyOVExMjkgMzI5IDExNCAzMzhUOTkgMzgwTDExMCA2NDdIMzEyTDIxMCAzNjlRMjAxIDM0NyAxOTEgMzM4VDE1OCAzMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIjIiBnbHlwaC1uYW1lPSJudW1iZXJzaWduIiBob3Jpei1hZHYteD0iNjc2IiBkPSJNOTUgNTRROTUgNjMgOTcgNzJUMTAyIDkzTDExMyAxMjlIN0wzNiAyNjdIMTU2TDE5MSAzODBIODdMMTE1IDUxOEgyMzVMMjc3IDY1NVEyODAgNjYyIDI5NSA2NjJRMzA4IDY2MiAzMjQgNjU4VDM1NCA2NDVUMzc3IDYyM1QzODYgNTk0UTM4NiA1NzUgMzc5IDU1NUwzNjggNTE4SDQ2NEw1MDcgNjU1UTUwOCA2NjIgNTI1IDY2MlE1MzggNjYyIDU1NCA2NThUNTgzIDY0NVQ2MDYgNjIzVDYxNSA1OTRRNjE1IDU3NiA2MDkgNTU1TDU5OCA1MThINzAyTDY3MyAzODBINTU0TDUxOSAyNjdINjIzTDU5NCAxMjlINDc2TDQzMyAtN1E0MzEgLTE1IDQxNSAtMTVRNDAyIC0xNSAzODYgLTExVDM1NyAzVDMzNCAyNFQzMjUgNTRRMzI1IDcyIDMzMSA5M0wzNDMgMTI5SDI0N0wyMDQgLTdRMjAxIC0xNSAxODYgLTE1UTE3MyAtMTUgMTU3IC0xMVQxMjggM1QxMDUgMjRUOTUgNTRaTTM5MiAyNjVMNDI4IDM4MkgzMTlMMjgzIDI2NUgzOTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIkIiBnbHlwaC1uYW1lPSJkb2xsYXIiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0zNSA3NVEtNSAxMTUgLTUgMTYyUS01IDE4NCA0IDIwMFQyNCAyMjhUNDYgMjQ0VDU4IDI0N1E4MiAyMTYgMTIwIDE5MlQxOTkgMTU2TDIyNCAyNzFRMTk4IDI4MyAxNzEgMjk4VDEyMSAzMzRUODUgMzg1VDcxIDQ1NlE3MSA0OTIgODUgNTI0VDEyNyA1ODJUMTk5IDYyNFQzMDMgNjQzTDMzMSA3NDVINDc4TDQ0OSA2MzBRNDgyIDYyMSA1MDcgNjA3VDU1MyA1NzNRNTg1IDU0MSA1ODUgNDk4UTU4NSA0NzIgNTc1IDQ1M1Q1NTIgNDIyVDUyOCA0MDVUNTE0IDQwMlE0NzMgNDU5IDQxMSA0ODVMMzg3IDM2OVE0MTUgMzU3IDQ0MyAzNDJUNDkzIDMwNlQ1MjkgMjU4VDU0MyAxOTNRNTQzIDExNSA0ODMgNjRUMzAzIDVMMjgwIC05OEgxMzBMMTU0IDE1UTExMiAyNCA4NCAzOVQzNSA3NVpNMjgwIDUwOFEyNTQgNTA4IDI0NiA0OTdUMjM3IDQ3NFEyMzcgNDYyIDI0NCA0NTJUMjY0IDQzM0wyODAgNTA4Wk0zMzAgMTM4UTM1NiAxNDMgMzY1IDE1MVQzNzUgMTcxUTM3NSAxOTMgMzQ1IDIwOUwzMzAgMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJSIgZ2x5cGgtbmFtZT0icGVyY2VudCIgaG9yaXotYWR2LXg9Ijc2NCIgZD0iTTM1IDUzUTM1IDY2IDQyIDc3VDY0IDEwM0w2ODMgNjU4UTY4NiA2NjEgNjk4IDY1N1Q3MjMgNjQzVDc0NyA2MjFUNzU4IDU5MlE3NTggNTY5IDcyOCA1NDJMMTA5IC0xNFExMDYgLTE2IDk1IC0xMlQ3MCAxVDQ2IDI0VDM1IDUzWk0yMTIgMzM4UTE3NCAzMzggMTQ1IDM0OVQ5NiAzNzhUNjYgNDIyVDU2IDQ3N1E1NiA1MTQgNjcgNTQ2VDEwMCA2MDNUMTU2IDY0MlQyMzUgNjU3UTI3NCA2NTcgMzAzIDY0NlQzNTIgNjE3VDM4MiA1NzNUMzkyIDUxOFEzOTIgNDgxIDM4MSA0NDlUMzQ4IDM5MlQyOTEgMzUzVDIxMiAzMzhaTTIxOCA0MzFRMjQ3IDQzMSAyNjIgNDU0VDI3NyA1MTJRMjc3IDUzNSAyNjMgNTQ5VDIyOSA1NjRRMjAxIDU2NCAxODUgNTQxVDE2OSA0ODNRMTY5IDQ2MCAxODMgNDQ2VDIxOCA0MzFaTTQwNCAxMzBRNDA0IDE2NyA0MTUgMTk5VDQ0OCAyNTZUNTA0IDI5NVQ1ODMgMzEwUTYyMiAzMTAgNjUxIDI5OVQ3MDAgMjcwVDczMCAyMjZUNzQwIDE3MVE3NDAgMTM0IDcyOSAxMDJUNjk2IDQ1VDYzOSA2VDU2MCAtOVE1MjIgLTkgNDkzIDJUNDQ0IDMxVDQxNCA3NVQ0MDQgMTMwWk01MTcgMTM2UTUxNyAxMTMgNTMxIDk5VDU2NiA4NFE1OTUgODQgNjEwIDEwN1Q2MjUgMTY1UTYyNSAxODggNjExIDIwMlQ1NzcgMjE3UTU0OSAyMTcgNTMzIDE5NFQ1MTcgMTM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFtcDsiIGdseXBoLW5hbWU9ImFtcGVyc2FuZCIgaG9yaXotYWR2LXg9IjcyNiIgZD0iTTIgMTYyUTIgMjA3IDE1IDIzOVQ1MiAyOTZUMTA3IDMzN1QxNzUgMzY2UTE2MCAzODUgMTUxIDQxMFQxNDIgNDY0UTE0MiA1MDEgMTU3IDUzNlQyMDAgNTk5VDI3MSA2NDRUMzY5IDY2MVE0MTEgNjYxIDQ0OCA2NTBUNTEyIDYxN1Q1NTQgNTY3VDU3MCA1MDFRNTcwIDQ2NSA1NTggNDM4VDUyNCAzOTJUNDczIDM1OFQ0MDkgMzM0TDQ4OCAyNDdRNTIwIDI3OCA1NDIgMzE0VDU3NSAzOTJINzI1UTcxMyAzMTYgNjc3IDI1NVQ1OTQgMTQ4TDU5OSAxNDNRNjE2IDEyNCA2MzQgMTEzVDY4OCA5OVE2ODkgOTkgNjkwIDgyVDY4MyA0NFQ2NTMgNlQ1ODcgLTExUTU2NiAtMTEgNTUwIC04VDUyMSAzVDQ5NCAyMlQ0NjcgNDlMNDYzIDU0UTQxOCAyMiAzNjQgNVQyNDIgLTEzUTE4MyAtMTMgMTM4IDBUNjMgMzdUMTggOTNUMiAxNjJaTTMzNCA0MTFRMzc1IDQyMyAzOTcgNDQwVDQyMCA0OTBRNDIwIDUxMCA0MDcgNTI0VDM2OCA1MzlRMzQyIDUzOSAzMjYgNTIwVDMwOSA0NzRRMzA5IDQ1NiAzMTQgNDQyVDMzNCA0MTFaTTE3MiAxOTNRMTcyIDE2MyAxOTQgMTQyVDI2MyAxMjBRMjkzIDEyMCAzMTggMTI4VDM2NyAxNTRMMjUwIDI4MVExNzIgMjU1IDE3MiAxOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImYXBvczsiIGdseXBoLW5hbWU9InF1b3Rlc2luZ2xlIiBob3Jpei1hZHYteD0iMjU4IiBkPSJNMTU4IDMyOVExMjkgMzI5IDExNCAzMzhUOTkgMzgwTDExMCA2NDdIMzEyTDIxMCAzNjlRMjAxIDM0NyAxOTEgMzM4VDE1OCAzMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIoIiBnbHlwaC1uYW1lPSJwYXJlbmxlZnQiIGhvcml6LWFkdi14PSI0NDEiIGQ9Ik0yMCAxNTNRMjAgMjA5IDMxIDI2M1Q2NCAzNjlUMTE1IDQ2NlQxODUgNTUxUTIzMyA1OTkgMjkwIDYyOVQ0MTQgNjU5UTQ1NyA2NTkgNDgxIDYzOVQ1MDUgNTgwUTUwNSA1NjcgNTAxIDU1NVQ0OTIgNTMzVDQ4MiA1MTdUNDc1IDUxMVE0MjYgNTA3IDM5MCA0OTBUMzIwIDQ0MFEyOTIgNDExIDI3MSAzNzdUMjM3IDMwNFQyMTcgMjI3VDIxMCAxNDhRMjEwIDk0IDIyNCA1M1QyNzMgLTIzUTI4NyAtMzcgMzA0IC00N1QzNDEgLTY1UTM0MiAtNjUgMzQ0IC03MFQzNTAgLTgyVDM1NSAtOTlUMzU4IC0xMThRMzU4IC0xNTMgMzMyIC0xNzZUMjYzIC0yMDBRMjIzIC0yMDAgMTg4IC0xODRUMTI0IC0xMzdRNzUgLTg5IDQ4IC0xNFQyMCAxNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIpIiBnbHlwaC1uYW1lPSJwYXJlbnJpZ2h0IiBob3Jpei1hZHYteD0iNDQxIiBkPSJNLTQyIC01MlE4IC00OCA0NCAtMzFUMTE0IDIwUTE0MiA0OCAxNjMgODJUMTk3IDE1NVQyMTcgMjMzVDIyNCAzMTJRMjI0IDM2NSAyMDkgNDA3VDE2MSA0ODJRMTQ3IDQ5NiAxMzAgNTA2VDkyIDUyNVE5MCA1MjYgODMgNTQyVDc2IDU3N1E3NiA2MTIgMTAyIDYzNVQxNzAgNjU5UTIxMCA2NTkgMjQ1IDY0M1QzMTAgNTk3UTM1OSA1NDggMzg2IDQ3M1Q0MTMgMzA2UTQxMyAxOTQgMzcwIDkwVDI0OCAtOTJRMjAwIC0xNDAgMTQzIC0xNzBUMjAgLTIwMFEtMjMgLTIwMCAtNDcgLTE4MFQtNzEgLTEyMVEtNzEgLTEwOCAtNjcgLTk2VC01OCAtNzRULTQ5IC01OFQtNDIgLTUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKiIgZ2x5cGgtbmFtZT0iYXN0ZXJpc2siIGhvcml6LWFkdi14PSI0MzMiIGQ9Ik0xMzYgMjg0UTExNyAyOTQgMTEzIDMwOVQxMjMgMzUyTDE2MSA0MjNMOTUgNDU1UTY5IDQ2OSA2NSA0ODFUNjYgNTE3TDY3IDUyMVE3MyA1NDQgODUgNTUxVDEyNyA1NTRMMjA0IDU0MEwyMTQgNjEzUTIxOSA2NDMgMjMxIDY1MVQyNjQgNjYwSDI2OFEyODggNjYwIDMwMSA2NTJUMzE5IDYxM0wzMjggNTQwTDQwMyA1NTRRNDMzIDU1OSA0NDUgNTUxVDQ2NCA1MjFMNDY1IDUxN1E0NzEgNDk0IDQ2NyA0ODJUNDM2IDQ1NUwzNjkgNDIzTDQwOCAzNTJRNDIyIDMyNSA0MTUgMzA5VDM5NCAyODRMMzkxIDI4MlEzNzggMjcyIDM2MiAyNzFUMzIzIDI5MEwyNjUgMzQ5TDIwOCAyOTBRMTg2IDI2OSAxNzMgMjcwVDE0MCAyODJMMTM2IDI4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IisiIGdseXBoLW5hbWU9InBsdXMiIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0xODAgMTg0SDgzUTQ5IDE4NCAzMiAxOThUMTUgMjM2UTE1IDI1MCAyMCAyNjlUMzggMzAxUTQ4IDMxMiA2MiAzMTdUMTAxIDMyMkgyMDlMMjMzIDQzMlEyNDEgNDcwIDI2MSA0ODdUMzA1IDUwNUgzMjFRMzU1IDUwNSAzNzAgNDg0VDM3NyA0MjVMMzU1IDMyMkg0NTNRNDg4IDMyMiA1MDQgMzA4VDUyMSAyNzBRNTIxIDI1NiA1MTYgMjM3VDQ5OSAyMDVRNDg5IDE5NSA0NzUgMTkwVDQzNiAxODRIMzI2TDMwMiA3MVEyOTQgMzMgMjc0IDE2VDIzMCAtMUgyMTRRMTgwIC0xIDE2NSAyMFQxNTcgNzlMMTgwIDE4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJjOyIgZ2x5cGgtbmFtZT0iY29tbWEiIGhvcml6LWFkdi14PSIyNjYiIGQ9Ik00OCAxNzJRNDkgMTc0IDcyIDE3NVQxMjQgMTcwVDE3NiAxNDZUMjAwIDk2UTIwMCA3MSAxODkgNTFUMTQ2IC0yTDQyIC0xMTNRMzMgLTEyMSAxNiAtMTIxVC0xOCAtMTEzVC00MyAtOTJULTQ2IC01OUw0OCAxNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSItIiBnbHlwaC1uYW1lPSJoeXBoZW4iIGhvcml6LWFkdi14PSI0NjkiIGQ9Ik02MSAzMzRINDQ2TDQwOSAxNTlIMjRMNjEgMzM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLiIgZ2x5cGgtbmFtZT0icGVyaW9kIiBob3Jpei1hZHYteD0iMjU5IiBkPSJNLTQgNTVRLTQgNzUgMyAxMDNUMjggMTQ5UTM0IDE1NSA0MCAxNTlUNTYgMTY2VDc3IDE3MFQxMDkgMTcxUTE1MSAxNzEgMTcxIDE1NlQxOTEgMTA4UTE5MSA4OCAxODQgNjBUMTU4IDE0UTE0NiAyIDEzMSAtM1Q3OCAtOFEzNSAtOCAxNiA3VC00IDU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLyIgZ2x5cGgtbmFtZT0ic2xhc2giIGhvcml6LWFkdi14PSIzODIiIGQ9Ik0tMTI4IC0yMTBMMzMzIDY1Mkg0OTNMMzIgLTIxMEgtMTI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgZ2x5cGgtbmFtZT0iemVybyIgaG9yaXotYWR2LXg9IjY1MyIgZD0iTTMxIDIyMlEzMSAyNTYgMzYgMjkxVDU0IDM3OVE4NyA1MjggMTY5IDU5NFQzOTAgNjYxUTQ1NCA2NjEgNTAzIDY0M1Q1ODUgNTk0VDYzNiA1MTlUNjUzIDQyNVE2NTMgMzkxIDY0OCAzNTZUNjMwIDI2OFE1OTcgMTE5IDUxNSA1M1QyOTQgLTE0UTIzMCAtMTQgMTgxIDNUOTkgNTJUNDggMTI3VDMxIDIyMlpNMjI5IDIyOFEyMjkgMTkwIDI1MSAxNjdUMzIwIDE0NFEzNjcgMTQ0IDM5MCAxNzNUNDI3IDI2MVE0NDEgMzIxIDQ0OCAzNThUNDU1IDQxOVE0NTUgNDU3IDQzMyA0ODBUMzY0IDUwM1EzMTcgNTAzIDI5NSA0NzRUMjU4IDM4NlEyNDMgMzI2IDIzNiAyODlUMjI5IDIyOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGdseXBoLW5hbWU9Im9uZSIgaG9yaXotYWR2LXg9IjQyMCIgZD0iTTIwMSA0MjRRMTgxIDQxMSAxNTYgNDExUTExNSA0MTEgOTMgNDMzUTcwIDQ1NiA3MCA0OTVRNzAgNTI2IDc5IDU0N1QxMDAgNTgyVDEyMiA2MDJUMTMzIDYwN1ExNDcgNTk1IDE2OCA1ODlUMjEwIDU4M1EyNDEgNTgzIDI2NiA2MDJUMzA3IDY1NkgzNTRRMzk5IDY1NiA0MTggNjM0VDQyNyA1NjJMMzA3IDBIMTEyTDIwMSA0MjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIyIiBnbHlwaC1uYW1lPSJ0d28iIGhvcml6LWFkdi14PSI1NzciIGQ9Ik02OCAwUTM2IDAgMjEgMjhUNSA5NlE1IDE1NSAxOCAyMDJUNTYgMjc1UTc1IDI5NCA5OSAzMDhUMTUwIDMzM1QyMTAgMzUyVDI3OSAzNjlRMzEyIDM3OCAzMzggMzg2VDM4MSA0MDRUNDA3IDQyN1Q0MTYgNDU3UTQxNiA1MTIgMzM4IDUxMlEyODUgNTEyIDI0OSA0ODZUMTg5IDQxNVExODggNDE0IDE3MiA0MTZUMTM3IDQyNlQxMDIgNDUwVDg2IDQ5NVE4NiA1NDggMTI4IDU5MFExNjEgNjIzIDIxMyA2NDJUMzM4IDY2MVE0MDIgNjYxIDQ1MSA2NDdUNTMzIDYwNlQ1ODQgNTQ1VDYwMiA0NjZRNjAyIDQxMiA1ODcgMzc1VDU0MCAzMTFUNDYwIDI2NlQzNDggMjMyUTMwNSAyMjIgMjc4IDIxNVQyMzMgMjAyVDIwNSAxOTBUMTg3IDE3NlExODIgMTcxIDE3OCAxNjZUMTcyIDE1M0g1MzBMNDk4IDBINjhINjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBnbHlwaC1uYW1lPSJ0aHJlZSIgaG9yaXotYWR2LXg9IjU4NSIgZD0iTTM0IDUzUS0zIDkwIC0zIDEzNlEtMyAxNzUgMTYgMTk3VDU3IDIyOVQ5OSAyMzlUMTE5IDIzNlExMjcgMTkwIDE2MSAxNjNUMjU1IDEzNlEzMDYgMTM2IDMzMyAxNTZUMzYxIDIxMlEzNjEgMjM1IDM0NSAyNDhUMjkzIDI2MkgyMDJMMjMyIDQwM0gzNDJRMzgwIDQwMyAzOTUgNDE4VDQxMiA0NTVRNDE0IDQ4MSAzODkgNDk2VDMyMSA1MTFRMjkwIDUxMSAyNjggNTA0VDIyOSA0ODVUMjAyIDQ1OVQxODYgNDMxUTE4NSA0MjggMTY5IDQyOFQxMzIgNDM0VDk2IDQ1OFQ3OSA1MDlRNzkgNTMyIDg4IDU1MlQxMTQgNTg5UTE0OCA2MjMgMjA0IDY0MlQzMzIgNjYxUTQ2MyA2NjEgNTMxIDYxNVQ2MDAgNDkwUTYwMCA0NjIgNTkyIDQzNlQ1NjUgMzg5VDUxOSAzNTJUNDUyIDMyOVE1MDMgMzA5IDUyNiAyNzVUNTUwIDE5NVE1NTAgMTU4IDUzNyAxMjFUNDkxIDU0VDQwMiA2VDI1NyAtMTNRMTc2IC0xMyAxMjAgNVQzNCA1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjQiIGdseXBoLW5hbWU9ImZvdXIiIGhvcml6LWFkdi14PSI2MjgiIGQ9Ik03MSAxNDVRNjggMTQ1IDYwIDE1M1Q0MyAxNzZUMjggMjEwVDIxIDI1MlEyMSAyNjcgMjQgMjgwVDM0IDMwN1Q1MiAzMzhUODIgMzc1TDI3NSA1OTBRMjkxIDYwOSAzMDUgNjIyVDMzNiA2NDJUMzc3IDY1M1Q0MzYgNjU2UTUxNSA2NTYgNTQ4IDYyN1Q1NjYgNTI1TDUxNyAyOTBINjE3TDU4NyAxNDVINDkzTDQ2MyAwSDI4MkwzMTIgMTQ1SDcxWk0zNTAgMjg2TDM5OSA1MjJMMTkwIDI4NkgzNTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI1IiBnbHlwaC1uYW1lPSJmaXZlIiBob3Jpei1hZHYteD0iNTY2IiBkPSJNMjUgNDhROCA2NiAxIDg0VC02IDEyM1EtNiAxNDcgNCAxNjVUMjggMTk2VDUyIDIxNVQ2NiAyMTlRODMgMTk3IDEwMSAxODFUMTQyIDE1M1QxOTAgMTM2VDI1MiAxMzBRMzAwIDEzMCAzMjkgMTU0VDM1OCAyMTRRMzU4IDI0NiAzMzYgMjY0VDI2MyAyODNRMjIzIDI4MyAxOTYgMjczVDE1MSAyNTJROTggMjY0IDc0IDI5MlQ2MiAzODFMOTcgNTQ4UTEwOSA2MDEgMTM5IDYyNFQyMTkgNjQ3SDU5MEw1NTYgNDg5SDI0OEwyMjcgMzk3UTI2NiA0MDkgMzE4IDQwOVE0MzMgNDA5IDQ4NSAzNjFUNTM4IDIzMlE1MzggMTc3IDUxOCAxMzJUNDYxIDU1VDM3MCA1VDI1MSAtMTNRMTU5IC0xMyAxMDUgNFQyNSA0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjYiIGdseXBoLW5hbWU9InNpeCIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTM1IDI0NlEzNSAyNzQgNDAgMzE2VDU5IDQwNFQ5NSA0OTVUMTUxIDU3NFExOTEgNjE0IDI0NiA2MzdUMzg4IDY2MVE0NTggNjYxIDUxNCA2NDJUNTk5IDU5NFE2MzAgNTYzIDYzMCA1MjNRNjMwIDQ5MCA2MTQgNDcyVDU3OSA0NDRUNTQzIDQzNFQ1MjUgNDM0UTUxMyA0NjEgNDgwIDQ4MlQzOTggNTA0UTMzOCA1MDQgMzAyIDQ2OVQyNDYgMzY2UTI3OCAzODUgMzE1IDM5NlQ0MDggNDA3UTQ0OCA0MDcgNDgyIDM5NlQ1NDIgMzY0VDU4MiAzMTNUNTk3IDI0NFE1OTcgMTkxIDU3OCAxNDRUNTIxIDYzVDQyOCA4VDMwMiAtMTJRMjM5IC0xMiAxODkgN1QxMDUgNjBUNTMgMTQxVDM1IDI0NlpNMjI3IDIzNlEyMjEgMTg4IDI0NCAxNTlUMzExIDEzMFEzNTUgMTMwIDM4MCAxNTZUNDA1IDIyMFE0MDUgMjUyIDM4MyAyNjlUMzIwIDI4N1EyOTEgMjg3IDI3MCAyNzhUMjI5IDI1NFEyMjcgMjQ0IDIyNyAyMzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI3IiBnbHlwaC1uYW1lPSJzZXZlbiIgaG9yaXotYWR2LXg9IjU2NSIgZD0iTTY2IDcyUTY2IDk5IDgwIDEyMFQxMjMgMTczTDM5MSA0ODZINzFMMTA2IDY0N0g1NDBRNTQ0IDY0NyA1NTMgNjM4VDU3MyA2MTRUNTkwIDU3OVQ1OTcgNTM2UTU5NyA1MDEgNTgzIDQ3MFQ1MzEgMzk2TDE5MyAtOVExOTIgLTExIDE3MiAtMTFUMTI5IC0zVDg2IDIxVDY2IDcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOCIgZ2x5cGgtbmFtZT0iZWlnaHQiIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik05IDE2N1E5IDIyNSA0OCAyNzFUMTcxIDMzN1ExMzMgMzU0IDExMiAzODRUOTAgNDU5UTkwIDUwNCAxMTEgNTQxVDE2OSA2MDVUMjU2IDY0NlQzNjUgNjYxUTQyOSA2NjEgNDc4IDY0OFQ1NjAgNjExVDYwOSA1NTVUNjI2IDQ4NlE2MjYgNDIzIDU5MSAzODJUNDg4IDMyMlE1MzQgMzAzIDU1OSAyNzFUNTg1IDE4OVE1ODUgMTQzIDU2NSAxMDZUNTA2IDQzVDQxMyAyVDI5MCAtMTJRMTU1IC0xMiA4MiAzNVQ5IDE2N1pNMzUxIDM4MlEzODkgMzgyIDQxNSA0MDNUNDQxIDQ1OVE0NDEgNDg1IDQxOSA1MDNUMzYwIDUyMVEzMjIgNTIxIDI5NiA0OTlUMjcwIDQ0NFEyNzAgNDE3IDI5MiA0MDBUMzUxIDM4MlpNMjA4IDE5M1EyMDggMTYzIDIzMSAxNDRUMjk4IDEyNVEzNDAgMTI1IDM2NyAxNDhUMzk1IDIwOFEzOTUgMjM3IDM3MiAyNTVUMzA1IDI3NFEyNjUgMjc0IDIzNyAyNTJUMjA4IDE5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjkiIGdseXBoLW5hbWU9Im5pbmUiIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik01MyA0OVEyNCA3OSAyNCAxMjBRMjQgMTUwIDM4IDE2OFQ3MSAxOTZUMTA0IDIwOFQxMjAgMjEwUTEzNiAxODIgMTcwIDE2M1QyNTEgMTQ0UTMxMiAxNDQgMzQ3IDE3NlQ0MDEgMjY4UTM3MiAyNTQgMzMzIDI0M1QyNDcgMjMyUTIwNSAyMzIgMTcwIDI0M1QxMTAgMjc1VDcwIDMyN1Q1NiAzOTlRNTYgNDU0IDc2IDUwMlQxMzMgNTg1VDIyNSA2NDFUMzQ5IDY2MVE0MTYgNjYxIDQ2NiA2NDJUNTUxIDU4OVQ2MDMgNTA3VDYyMSA0MDNRNjIxIDM3NSA2MTYgMzMzVDU5NyAyNDVUNTYxIDE1NFQ1MDUgNzVRNDY1IDM1IDQxMCAxMVQyNjggLTEzUTIyMiAtMTMgMTg5IC05VDEzMCAzVDg3IDIyVDUzIDQ5Wk0zMzEgMzUyUTM2MCAzNTIgMzgxIDM2MVQ0MjIgMzg1UTQyNCAzOTAgNDI1IDM5N1Q0MjYgNDA5UTQzMyA0NjIgNDA5IDQ5MFQzNDMgNTE5UTI5OSA1MTkgMjczIDQ5MlQyNDcgNDI0UTI0NyAzOTAgMjY4IDM3MVQzMzEgMzUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOiIgZ2x5cGgtbmFtZT0iY29sb24iIGhvcml6LWFkdi14PSIyNjYiIGQ9Ik0xNDEgMjczUTk4IDI3MyA3OSAyODhUNTkgMzM3UTU5IDM1NyA2NiAzODRUOTEgNDMxUTk3IDQzNyAxMDMgNDQxVDExOSA0NDdUMTQwIDQ1MVQxNzIgNDUzUTIxNCA0NTMgMjM0IDQzOFQyNTQgMzg5UTI1NCAzNjkgMjQ3IDM0MlQyMjEgMjk1UTIwOSAyODQgMTk0IDI3OVQxNDEgMjczWk0tMSA1NVEtMSA3NSA2IDEwM1QzMiAxNDlRMzggMTU1IDQ0IDE1OVQ2MCAxNjZUODEgMTcwVDExMyAxNzFRMTU1IDE3MSAxNzQgMTU2VDE5NCAxMDhRMTk0IDg4IDE4NyA2MFQxNjIgMTRRMTUwIDIgMTM0IC0zVDgxIC04UTM5IC04IDE5IDdULTEgNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBnbHlwaC1uYW1lPSJzZW1pY29sb24iIGhvcml6LWFkdi14PSIyNzQiIGQ9Ik0xNDggMjczUTEwNiAyNzMgODYgMjg4VDY2IDMzN1E2NiAzNTcgNzMgMzg0VDk5IDQzMVExMTEgNDQyIDEyNiA0NDdUMTc5IDQ1M1EyMjIgNDUzIDI0MSA0MzhUMjYxIDM4OVEyNjEgMzY5IDI1NCAzNDJUMjI5IDI5NVEyMTcgMjg0IDIwMSAyNzlUMTQ4IDI3M1pNNTEgMTcyUTUyIDE3NCA3NSAxNzVUMTI3IDE3MFQxNzkgMTQ2VDIwMyA5NlEyMDMgNzEgMTkyIDUwVDE1MCAtMkw0NiAtMTEzUTM3IC0xMjEgMjAgLTEyMVQtMTQgLTExM1QtMzkgLTkyVC00MiAtNTlMNTEgMTcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmx0OyIgZ2x5cGgtbmFtZT0ibGVzcyIgaG9yaXotYWR2LXg9IjQ1MyIgZD0iTTg0IDE2NlE2MiAxNzkgNDYgMjAyVDMwIDI1NVEzMiAyODYgNTEgMzA5VDk2IDM0NEw0MTcgNTAwUTQyMCA1MDEgNDI3IDQ5NFQ0NDEgNDc0VDQ1MyA0NDVUNDU4IDQxMFE0NTcgMzg0IDQ0MSAzNjBUMzgyIDMxN0wyMjcgMjQ5TDMyNCAxOTVRMzY1IDE3MiAzNzkgMTQ2VDM5MSA5NVEzOTAgNzcgMzgzIDYxVDM2OCAzM1QzNTEgMTVUMzQwIDEwTDg0IDE2Nkg4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij0iIGdseXBoLW5hbWU9ImVxdWFsIiBob3Jpei1hZHYteD0iNTM1IiBkPSJNMTM1IDMwMFE5NyAzMDAgNzggMzE1VDU4IDM1N1E1OCAzNjQgNTkgMzc0VDY0IDM5N1Q3MyA0MjBUODcgNDM5UTk4IDQ1MCAxMTMgNDU1VDE2MCA0NjBINDU1UTQ5MyA0NjAgNTEyIDQ0NVQ1MzEgNDAzUTUzMSAzOTYgNTMwIDM4NlQ1MjUgMzYzVDUxNyAzNDBUNTAzIDMyMVE0OTIgMzEwIDQ3NyAzMDVUNDMwIDMwMEgxMzVaTTgxIDQ4UTQzIDQ4IDI0IDYzVDUgMTA1UTUgMTEyIDYgMTIyVDExIDE0NVQxOSAxNjhUMzMgMTg3UTQ0IDE5OCA1OSAyMDNUMTA2IDIwOUg0MDFRNDM5IDIwOSA0NTggMTkzVDQ3OCAxNTFRNDc4IDE0NSA0NzcgMTM0VDQ3MiAxMTJUNDYzIDg5VDQ0OSA2OVE0MzggNTggNDIzIDUzVDM3NiA0OEg4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZndDsiIGdseXBoLW5hbWU9ImdyZWF0ZXIiIGhvcml6LWFkdi14PSI0NTMiIGQ9Ik0zOCAxMFEzNSA5IDI4IDE2VDE0IDM2VDIgNjVULTMgMTAwUS0yIDEyNiAxNCAxNTBUNzMgMTkzTDIyOCAyNjFMMTMxIDMxNVE5MCAzMzggNzYgMzY0VDY0IDQxNVE2NSA0MzMgNzIgNDQ5VDg3IDQ3N1QxMDQgNDk1VDExNSA1MDBMMzcxIDM0NFEzOTMgMzMxIDQwOSAzMDhUNDI1IDI1NVE0MjMgMjI0IDQwNCAyMDFUMzU5IDE2NkwzOCAxMEgzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij8iIGdseXBoLW5hbWU9InF1ZXN0aW9uIiBob3Jpei1hZHYteD0iNTIyIiBkPSJNMTMzIDIxNFExNDIgMjk0IDE3NCAzMzhUMjY4IDQwMlEyOTIgNDExIDMwOCA0MTdUMzMzIDQzMFQzNDYgNDQ0VDM1MCA0NjJRMzUwIDQ4NCAzMzIgNDk1VDI4NiA1MDdRMjQxIDUwNyAyMTAgNDg2VDE2MyA0MjdRMTYzIDQyNiAxNDggNDI5VDExNCA0NDFUODEgNDY3VDY1IDUxMVE2NSA1MzUgNzUgNTU2VDEwMyA1OTZRMTM0IDYyNyAxODIgNjQ0VDI5OSA2NjFRMzU1IDY2MSA0MDEgNjQ4VDQ4MSA2MTJUNTMyIDU1NVQ1NTAgNDgxUTU1MCA0MzMgNTM0IDQwM1Q0OTMgMzUzVDQzOSAzMjRUMzg0IDMwNlEzNDkgMjk1IDMyNCAyNzZUMjg1IDIxNEgxMzNaTTEwOSA1NVExMDkgNzUgMTE2IDEwM1QxNDEgMTQ5UTE0NyAxNTUgMTUzIDE1OVQxNjkgMTY2VDE5MCAxNzBUMjIyIDE3MVEyNjQgMTcxIDI4NCAxNTZUMzA0IDEwOFEzMDQgODggMjk3IDYwVDI3MSAxNFEyNTkgMiAyNDQgLTNUMTkxIC04UTE0OCAtOCAxMjkgN1QxMDkgNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJAIiBnbHlwaC1uYW1lPSJhdCIgaG9yaXotYWR2LXg9IjczNiIgZD0iTTQ3IDI4MFE0NyAzNjIgNzUgNDMyVDE1MyA1NTNUMjczIDYzMlQ0MjQgNjYxUTQ5MSA2NjEgNTQ3IDY0MlQ2NDUgNTg4VDcwOCA1MDRUNzMxIDM5NVE3MzEgMzQzIDcxNyAzMDFUNjc3IDIyOFQ2MTUgMTgxVDUzNCAxNjRRNDc2IDE2NCA0NTAgMTg0VDQxNSAyMzdRNDAxIDIwNiAzNzQgMTg3VDMwNyAxNjdRMjYwIDE2NyAyMzIgMTk3VDIwMyAyODFRMjAzIDMxNyAyMTQgMzUwVDI0NSA0MTBUMjk0IDQ1MlQzNTcgNDY4UTM4MyA0NjggNDA2IDQ1NlQ0NDEgNDIwTDQ0OSA0NjNINTY0TDUzMSAzMDVRNTE3IDI0NyA1NjQgMjQ3UTYwOCAyNDcgNjM0IDI4MlQ2NjEgMzkxUTY2MSA0MzcgNjQzIDQ3NVQ1OTMgNTQwVDUxNiA1ODFUNDE4IDU5NlEzNTIgNTk2IDI5NyA1NzNUMjAyIDUwOFQxMzkgNDA5VDExNiAyODRRMTE2IDIzMiAxMzMgMTg5VDE4NCAxMTVUMjY2IDY3VDM3NSA1MFE0MjMgNTAgNDY0IDY2VDUzNiAxMDdRNTU0IDEyMiA1NzEgMTIyUTU4MiAxMjIgNTkwIDExNlQ2MDMgMTAyVDYxMCA4N1Q2MTIgNzlRNTc0IDM3IDUxNCAxMlQzNjkgLTE0UTI5MiAtMTQgMjMzIDZUMTMyIDY1VDY5IDE1OFQ0NyAyODBaTTMxNSAzMDFRMzE1IDI4MSAzMjYgMjY5VDM1NiAyNTZRMzc4IDI1NiAzOTUgMjcxVDQxNyAzMTNMNDI0IDM0N1E0MTkgMzYxIDQwOCAzNzBUMzc5IDM4MFEzNDkgMzgwIDMzMiAzNTZUMzE1IDMwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkEiIGdseXBoLW5hbWU9IkEiIGhvcml6LWFkdi14PSI2OTIiIGQ9Ik0yOTAgNTk3UTI5OCA2MTAgMzA4IDYyMFQzMzMgNjM4VDM2OSA2NDlUNDIwIDY1M1E0NTMgNjUzIDQ3NCA2NDlUNTA5IDYzN1Q1MjkgNjE5VDUzOSA1OTZMNjQ5IDBINDQ1TDQyNSAxMzRIMjE3TDE0NCAwSC02NEwyOTAgNTk3Wk00MTkgMjc4TDM4OCA0NjRMMjc5IDI3OEg0MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJCIiBnbHlwaC1uYW1lPSJCIiBob3Jpei1hZHYteD0iNjYwIiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0g0MzhRNTQ0IDY0NyA1OTkgNjExVDY1NSA1MDNRNjU1IDQ0MSA2MjQgNDAwVDUxNiAzMzlRNTc1IDMyMyA2MDQgMjg5VDYzMyAyMDVRNjMzIDE1OSA2MTggMTIxVDU2NyA1NlQ0NzQgMTVUMzMyIDBILTlMMTA5IDU0OFpNMzUyIDM4NlE0NDkgMzg2IDQ0OSA0NTlRNDQ4IDUwNSAzNjggNTA1SDI5NkwyNzEgMzg2SDM1MlpNMzI1IDE0M1EzODEgMTQzIDQwNiAxNjFUNDMxIDIyMVE0MzEgMjcwIDM0NCAyNzBIMjQ3TDIyMCAxNDNIMzI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgZ2x5cGgtbmFtZT0iQyIgaG9yaXotYWR2LXg9IjY0NyIgZD0iTTQwIDI3N1E0MCAzNTMgNjcgNDIzVDE0NCA1NDVUMjYxIDYyOVQ0MTEgNjYxUTQ5NiA2NjEgNTQ2IDY0MFQ2MjYgNTkwUTY0NyA1NjkgNjU2IDU0NlQ2NjYgNTA2UTY2NiA0NjcgNjQ2IDQ0NFQ2MDIgNDEwVDU1NyAzOTdUNTM1IDM5N1E1MTkgNDM1IDQ5MCA0NTdUNDE1IDQ3OVEzNzkgNDc5IDM0OSA0NjVUMjk2IDQyNlQyNjAgMzY4VDI0NyAyOThRMjQ3IDI0MSAyODIgMjA1VDM3MyAxNjhRNDU4IDE2OCA1MDQgMjM2UTUwNSAyMzggNTIxIDIzNVQ1NTUgMjIwVDU4OSAxOTBUNjA0IDE0MlE2MDQgMTAzIDU2NCA2M1E1MzIgMzEgNDc5IDlUMzU4IC0xM1EyODUgLTEzIDIyNiA3VDEyNiA2NVQ2MyAxNTdUNDAgMjc3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRCIgZ2x5cGgtbmFtZT0iRCIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTEwOSA1NDhRMTIwIDYwMSAxNTEgNjI0VDIzMSA2NDdIMzY1UTQzOCA2NDcgNDk1IDYyOFQ1OTMgNTczVDY1NCA0ODhUNjc1IDM3N1E2NzUgMzAzIDY1MSAyMzVUNTc2IDExNFQ0NDkgMzFUMjcxIDBILThMMTA5IDU0OFpNMjk2IDE2MVEzNDAgMTYxIDM3MyAxNzdUNDMwIDIyMVQ0NjUgMjgyVDQ3NyAzNTRRNDc3IDQxMyA0NDMgNDQ5VDM0NyA0ODVIMjkzTDIyNCAxNjFIMjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRSIgZ2x5cGgtbmFtZT0iRSIgaG9yaXotYWR2LXg9IjYxNiIgZD0iTTEwOSA1NDhRMTIwIDYwMSAxNTEgNjI0VDIzMSA2NDdINjUwTDYxNSA0ODFIMjk0TDI3OCA0MDNINTI3TDQ5NyAyNTJIMjQ3TDIyOCAxNjhINTU1TDUxOSAwSC05TDEwOSA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJGIiBnbHlwaC1uYW1lPSJGIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0g2MzdMNjAwIDQ3OEgyOTBMMjY4IDM3M0g1MTJMNDc3IDIxMkgyNDFMMTk2IDBILThMMTA5IDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkciIGdseXBoLW5hbWU9IkciIGhvcml6LWFkdi14PSI3MjQiIGQ9Ik00MCAyNjlRNDAgMzQ4IDY4IDQxOVQxNDYgNTQ0VDI2NyA2MjlUNDIzIDY2MVE1MDMgNjYxIDU2MSA2NDBUNjUyIDU4NlE2ODkgNTQ3IDY4OSA1MDRRNjg5IDQ4MCA2ODAgNDY0VDY1OCA0MzhUNjMwIDQyMlQ2MDAgNDE1VDU3NiA0MTNUNTY1IDQxNlE1NDUgNDQ3IDUxMSA0NjhUNDI5IDQ5MFEzOTAgNDkwIDM1NyA0NzVUMjk4IDQzMVQyNTggMzY2VDI0MyAyODRRMjQxIDIxOCAyNzggMTc4VDM3OCAxMzdRNDI1IDEzNyA0NTkgMTYyUTQ3MyAxNzMgNDgzIDE4NVQ1MDIgMjI0SDM1OUwzOTEgMzcxSDYzNlE3MTYgMzcxIDY5NyAyODBMNjQwIDE0UTYzOSAxMCA2MjIgM1Q1NzkgLTVRNTQ0IC01IDUyMSAxMFQ0OTAgNTlRNDYxIDI0IDQxNyA2VDMxNCAtMTNRMjUwIC0xMyAyMDAgNlQxMTQgNjJUNTkgMTUxVDQwIDI2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkgiIGdseXBoLW5hbWU9IkgiIGhvcml6LWFkdi14PSI2OTciIGQ9Ik0xMTIgNTYxUTEyMyA2MDggMTQ1IDYzMFQyMTAgNjUySDIzOVEyODEgNjUyIDMwMiA2MjlUMzEzIDU1OEwyODEgNDA5SDQ4NUw1MTcgNTU5UTUyOCA2MDcgNTUwIDYyOVQ2MTUgNjUySDY0NVE2ODcgNjUyIDcwNyA2MjhUNzE4IDU1N0w1OTkgMEgzOThMNDQ5IDI0MUgyNDZMMTk0IDBILThMMTEyIDU2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGdseXBoLW5hbWU9IkkiIGhvcml6LWFkdi14PSIzMDQiIGQ9Ik0xMTggNTYxUTEyOSA2MDggMTUxIDYzMFQyMTcgNjUySDI0N1EyODggNjUyIDMwOSA2MjhUMzE5IDU1N0wyMDAgMEgtMUwxMTggNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSiIgZ2x5cGgtbmFtZT0iSiIgaG9yaXotYWR2LXg9IjUyOCIgZD0iTTI2IDQzUS03IDc2IC03IDExNVEtNyAxNDkgNiAxNzBUMzUgMjA0VDY1IDIxOVQ4MCAyMjFROTcgMTkyIDEyNCAxNzVUMTg2IDE1N1EyMzAgMTU3IDI1NCAxODNUMjkyIDI2OUwzNzIgNjQ3SDU3M0w0ODUgMjM0UTQ2MCAxMTUgMzkyIDUxVDE5NiAtMTNRMTM2IC0xMyA5NCAyVDI2IDQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSyIgZ2x5cGgtbmFtZT0iSyIgaG9yaXotYWR2LXg9IjY1MCIgZD0iTTExMiA1NjFRMTIyIDYwOCAxNDQgNjMwVDIxMCA2NTJIMjQwUTI4MiA2NTIgMzAyIDYyOFQzMTMgNTU3TDI3NSAzNzdMNTQ0IDY2MVE1NDUgNjYyIDU2NCA2NThUNjA2IDY0M1Q2NDggNjEzVDY2NyA1NjVRNjY3IDU0MiA2NTUgNTE5VDYxMyA0NjlMNDM2IDMwNkw1MTYgMTczUTUzOSAxMzEgNTYwIDExNVQ2MTIgOTdRNjE0IDk3IDYxMyA4MVQ2MDEgNDVUNTY0IDlUNDkzIC03UTQ2MCAtNyA0MzcgMVQzOTUgMjVUMzYyIDY1VDMzMiAxMjFMMjUyIDI3M0wxOTQgMEgtOEwxMTIgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTCIgZ2x5cGgtbmFtZT0iTCIgaG9yaXotYWR2LXg9IjU0NyIgZD0iTTExMiA1NjFRMTIzIDYwOCAxNDUgNjMwVDIxMCA2NTJIMjM5UTI4MSA2NTIgMzAyIDYyOVQzMTMgNTU4TDIzMCAxNzRINDIwUTQ2MSAxNzQgNDgyIDE1N1Q1MDQgMTEyUTUwNCAxMDUgNTAyIDk0VDQ5NyA2OVQ0ODcgNDRUNDcyIDIzUTQ2MSAxMiA0NDUgNlQzOTQgMEgtOEwxMTIgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTSIgZ2x5cGgtbmFtZT0iTSIgaG9yaXotYWR2LXg9Ijc3MiIgZD0iTTExMCA1NTZRMTMxIDY1MiAyMTkgNjUySDI3MFEzMTAgNjUyIDMyNiA2MzlUMzQ4IDU5NEwzOTggMzM5TDU2MSA2MDJRNTc5IDYzMiA2MDAgNjQyVDY1NiA2NTJINzE5UTgxMSA2NTIgNzkxIDU1NUw2NzIgMEg0ODRMNTYxIDM2NUw0NTQgMTc0UTQ0OSAxNjQgNDQ0IDE1NlQ0MzEgMTQxVDQwNyAxMzBUMzY1IDEyNlEzMzUgMTI2IDMxOSAxMzBUMjk2IDE0MVQyODggMTU3VDI4NSAxNzZMMjU3IDM1N0wxODAgMEgtOEwxMTAgNTU2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTiIgZ2x5cGgtbmFtZT0iTiIgaG9yaXotYWR2LXg9IjcwMyIgZD0iTTExMSA1NTdRMTIyIDYwNSAxNDUgNjI4VDIxMyA2NTJIMjMxUTI2MyA2NTIgMjgyIDY0MFQzMjAgNTk2TDQ4MSAzMDRMNTU0IDY0N0g3NDFMNjIzIDg5UTYxMiA0MSA1ODkgMThUNTIyIC01SDUxMFE0NzkgLTUgNDYwIDdUNDIyIDUxTDI1NSAzNTRMMTgwIDBILThMMTExIDU1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9Ik8iIGdseXBoLW5hbWU9Ik8iIGhvcml6LWFkdi14PSI3MjciIGQ9Ik00MSAyNzdRNDEgMzUyIDY2IDQyMVQxMzggNTQzVDI1NCA2MjlUNDExIDY2MVE0ODggNjYxIDU0NSA2MzhUNjQxIDU3NFQ2OTkgNDgyVDcxOCAzNzJRNzE4IDI5NyA2OTMgMjI4VDYyMSAxMDVUNTA1IDE5VDM0OCAtMTNRMjcxIC0xMyAyMTMgMTBUMTE3IDc0VDYwIDE2NlQ0MSAyNzdaTTI0MCAyOTFRMjQwIDIzNyAyNzEgMjAxVDM1OSAxNjRRMzkzIDE2NCA0MjIgMTc5VDQ3MyAyMjBUNTA3IDI4MlQ1MjAgMzU4UTUyMCA0MTIgNDg5IDQ0OFQ0MDAgNDg1UTM2NiA0ODUgMzM3IDQ3MFQyODcgNDI5VDI1MyAzNjdUMjQwIDI5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGdseXBoLW5hbWU9IlAiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik0xMDkgNTQ4UTEyMCA2MDEgMTUxIDYyNFQyMzEgNjQ3SDM3OVE1MDYgNjQ3IDU3MiA1OThUNjM5IDQ0OVE2MzkgMzkxIDYyMSAzNDJUNTY2IDI1OFQ0NzAgMjAyVDMzMiAxODJIMjMzTDE5MSAwSC0xMEwxMDkgNTQ4Wk0zNDMgMzI4UTM4OSAzMjggNDE2IDM1M1Q0NDQgNDI5UTQ0NCA0OTYgMzU3IDQ5NkgyOTZMMjYxIDMyOEgzNDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJRIiBnbHlwaC1uYW1lPSJRIiBob3Jpei1hZHYteD0iNzMwIiBkPSJNNDEgMjc3UTQxIDM1MiA2NiA0MjFUMTM4IDU0M1QyNTUgNjI5VDQxMyA2NjFRNDkxIDY2MSA1NDggNjM4VDY0NCA1NzVUNzAxIDQ4M1Q3MjAgMzcyUTcyMCAzMDQgNjk4IDI0MVQ2MzMgMTI1TDYzNCAxMjRRNjUwIDEwMSA2NjQgODZUNjk0IDYyUTY5NSA2MSA2OTIgNDlUNjc4IDIyVDY0NiAtNFQ1OTUgLTE2UTU2MyAtMTYgNTQyIC05VDQ5OSAyMlE0MjkgLTEwIDM0NCAtMTBRMjY2IC0xMCAyMDkgMTNUMTE1IDc1VDU5IDE2N1Q0MSAyNzdaTTI0MCAyOTFRMjQwIDIzNyAyNzEgMjAxVDM2MCAxNjRRMzc2IDE2NCAzOTEgMTY3TDM0MyAyMzdMNDczIDMzMkw1MTAgMjc3UTUxNyAyOTUgNTIxIDMxNVQ1MjUgMzU4UTUyNSA0MTIgNDk0IDQ0OFQ0MDQgNDg1UTM2OSA0ODUgMzM5IDQ3MFQyODcgNDI5VDI1MyAzNjdUMjQwIDI5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlIiIGdseXBoLW5hbWU9IlIiIGhvcml6LWFkdi14PSI2NDQiIGQ9Ik0xMDkgNTQ4UTEyMCA2MDEgMTUxIDYyNFQyMzEgNjQ3SDM5M1E1MjcgNjQ3IDU5MSA1OThUNjU1IDQ1M1E2NTUgNDExIDY0MyAzNzVUNjA2IDMxMFQ1NDcgMjYyVDQ2NSAyMzNMNTAxIDE3NFE1MTQgMTUzIDUyNSAxNDBUNTQ2IDExOFQ1NjkgMTA1VDU5NyA5OVE2MDAgOTggNTk5IDgyVDU4NyA0NlQ1NTAgMTBUNDc2IC03UTQ0OSAtNyA0MjggLTFUMzg4IDE5VDM1MyA1N1QzMTggMTE3TDI3MyAyMDJIMjM1TDE5MSAwSC05TDEwOSA1NDhaTTM1MCAzNDRRNDA1IDM0NCA0MjkgMzY5VDQ1MyA0MzJRNDUzIDQ5NiAzNzAgNDk2SDI5NUwyNjIgMzQ0SDM1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlMiIGdseXBoLW5hbWU9IlMiIGhvcml6LWFkdi14PSI1ODMiIGQ9Ik0yNiA1OFEtMTEgOTcgLTExIDE0MFEtMTEgMTYzIC0xIDE4MVQyMyAyMTNUNDggMjMyVDYyIDIzNlE3OCAyMTYgMTAwIDE5OVQxNDkgMTY4VDIwNCAxNDdUMjYxIDEzOVEzMzYgMTM5IDMzNiAxOTJRMzM2IDIxNCAzMDggMjI1VDIzOSAyNTJRMjEwIDI2MyAxODIgMjc3VDEzMCAzMTNUOTIgMzY1VDc3IDQzN1E3NyA0ODAgOTMgNTIwVDE0MiA1OTJUMjI4IDY0MlQzNTQgNjYxUTQzNSA2NjEgNDkxIDY0MlQ1NzggNTkyUTYxMCA1NTggNjEwIDUxOFE2MTAgNDkyIDU5OCA0NzJUNTcyIDQzN1Q1NDUgNDE3VDUzMCA0MTNRNDk4IDQ1NSA0NTEgNDgxVDM1MiA1MDhRMzE0IDUwOCAyOTUgNDk0VDI3NSA0NTdRMjc1IDQzNCAzMDYgNDIyVDM4MyAzOTJRNDE1IDM4MCA0NDYgMzY2VDUwMiAzMzBUNTQyIDI4MVQ1NTcgMjEzUTU1NyAxNjUgNTQwIDEyNFQ0ODYgNTJUMzk1IDRUMjYzIC0xNFExNzUgLTE0IDExNyA2VDI2IDU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVCIgZ2x5cGgtbmFtZT0iVCIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTI1OCA0NzNIMTU2UTExNCA0NzMgOTMgNDkwVDcyIDUzNVE3MiA1NDIgNzMgNTU0VDc5IDU3OFQ4OSA2MDNUMTAzIDYyNFExMTQgNjM1IDEzMCA2NDFUMTgyIDY0N0g1OTVRNjM3IDY0NyA2NTggNjMwVDY4MCA1ODVRNjgwIDU3OCA2NzggNTY3VDY3MyA1NDJUNjYzIDUxN1Q2NDggNDk2UTYzNyA0ODUgNjIxIDQ3OVQ1NjkgNDczSDQ1OUwzNTggMEgxNTdMMjU4IDQ3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlUiIGdseXBoLW5hbWU9IlUiIGhvcml6LWFkdi14PSI2NzEiIGQ9Ik0xMDYgNTYxUTExNiA2MDggMTM4IDYzMFQyMDQgNjUySDIzNFEyNzYgNjUyIDI5NiA2MjlUMzA3IDU1OEwyNTAgMjkyUTIzNiAyMjkgMjU2IDE5NlQzMzQgMTYyUTM3MyAxNjIgMzk5IDE4N1Q0MzggMjczTDQ5OSA1NTlRNTEwIDYwNyA1MzIgNjI5VDU5OCA2NTJINjI0UTY2NiA2NTIgNjg3IDYyOFQ2OTcgNTU4TDYzNCAyNjJRNjA0IDEyMiA1MjQgNTVUMzEzIC0xM1ExNTAgLTEzIDg0IDY4VDUxIDMwN0wxMDYgNTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iViIgZ2x5cGgtbmFtZT0iViIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTg1IDU4M1E4NCA1OTAgOTQgNjAxVDEyMyA2MjRUMTY0IDY0NFQyMTAgNjUyUTI1MiA2NTIgMjc1IDYyN1QzMDIgNTU3TDMzNyAyNTFMNTU0IDY1NVE1NTQgNjU2IDU2NSA2NTZUNTk0IDY1MlQ2MzAgNjQzVDY2NiA2MjVUNjk0IDU5OFQ3MDUgNTU3UTcwNSA1MzQgNjk2IDUxM1Q2NjQgNDU3TDM2OCAwSDE5OUw4NSA1ODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJXIiBnbHlwaC1uYW1lPSJXIiBob3Jpei1hZHYteD0iOTc5IiBkPSJNMTA2IDU5OVExMDYgNjA1IDExNSA2MTRUMTQxIDYzMVQxNzggNjQ2VDIyNCA2NTJRMjc1IDY1MiAyOTYgNjIyVDMxNiA1NDZMMzEwIDI1Nkw0NDAgNTIyUTQ1NyA1NTcgNDg4IDU3M1Q1NTQgNTkwUTYwMiA1OTAgNjI4IDU3MVQ2NTUgNTExTDY2NiAyNTJMODM3IDY1NFE4MzcgNjU1IDg0OSA2NTVUODgwIDY1NVQ5MTggNjQ4VDk1NiA2MzJUOTg2IDYwNFQ5OTggNTYwUTk5OCA1NDQgOTkyIDUyM1Q5NjUgNDY3TDcyNiAwSDUyOEw1MTEgMzM4TDMzOSAwSDE0MUwxMDYgNTk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWCIgZ2x5cGgtbmFtZT0iWCIgaG9yaXotYWR2LXg9IjY2MSIgZD0iTS02IDg2US02IDEzMSA0OCAxODFMMjI1IDM1M0w3MiA2NDdIMjkwTDM3MyA0NDlMNTU5IDY1OFE1NjAgNjU5IDU3OSA2NTVUNjIxIDY0MFQ2NjMgNjEwVDY4MiA1NjJRNjgyIDUxNiA2MjggNDY3TDQ1MiAzMDBMNTA5IDE5NlE1MzEgMTU1IDU1NiAxMzBUNjA4IDEwM1E2MTEgMTAzIDYwOSA4NlQ1OTMgNDdUNTUyIDhUNDc4IC0xMFE0NTYgLTEwIDQzNyAtNVQ0MDEgMTNUMzY5IDUwVDM0MCAxMTFMMzA1IDIwNkwxMTcgLTEwUTExNiAtMTEgOTcgLTdUNTUgOFQxMyAzOFQtNiA4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IlkiIGdseXBoLW5hbWU9IlkiIGhvcml6LWFkdi14PSI2MzIiIGQ9Ik0yMjggMjU1TDQ2IDY0N0gyNjBMMzUxIDQwNUw1MjcgNjU5UTUyOCA2NjAgNTUxIDY1OFQ2MDMgNjQ2VDY1NSA2MThUNjc5IDU2N1E2NzkgNTQ4IDY2NyA1MjNUNjI3IDQ2OEw0MjggMjUzTDM3MyAwSDE3M0wyMjggMjU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWiIgZ2x5cGgtbmFtZT0iWiIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTEwIDE2MUwzNTQgNDgySDE5NFE5MCA0ODIgOTAgNTUyUTkwIDU2OSA5NSA1ODZUMTA2IDYxNlQxMTggNjM4VDEyNiA2NDdINjM4TDYwMyA0ODNMMjU5IDE2Nkg0MzlRNTQ0IDE2NiA1NDQgOTZRNTQ0IDc5IDUzOSA2MlQ1MjggMzFUNTE1IDlUNTA4IDBILTI0TDEwIDE2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlsiIGdseXBoLW5hbWU9ImJyYWNrZXRsZWZ0IiBob3Jpei1hZHYteD0iNDA2IiBkPSJNMjQ2IC00NlEyODIgLTQ2IDMwMSAtNjFUMzIwIC0xMDFRMzIwIC0xMTQgMzE0IC0xMzlUMjkyIC0xODBRMjgyIC0xOTAgMjY4IC0xOTRUMjIyIC0xOTlILTQ5TDEzMyA2NThIMzkyUTQyOCA2NTggNDQ3IDY0M1Q0NjYgNjAzUTQ2NiA1OTcgNDY1IDU4N1Q0NjAgNTY2VDQ1MSA1NDNUNDM4IDUyNVE0MjggNTE0IDQxNCA1MTBUMzY5IDUwNUgyNzhMMTYwIC00NkgyNDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJcIiBnbHlwaC1uYW1lPSJiYWNrc2xhc2giIGhvcml6LWFkdi14PSIzODIiIGQ9Ik02OCA2NTJIMjIxTDMxMyAtMjEwSDE2MEw2OCA2NTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJdIiBnbHlwaC1uYW1lPSJicmFja2V0cmlnaHQiIGhvcml6LWFkdi14PSI0MDYiIGQ9Ik0xMjEgLTQ2TDIzOCA1MDVIMTUzUTExNiA1MDUgOTggNTIwVDc5IDU2MFE3OSA1NzMgODUgNTk4VDEwNiA2MzlRMTE3IDY0OSAxMzEgNjUzVDE3NiA2NThINDQ3TDI2NSAtMTk5SDZRLTMwIC0xOTkgLTQ5IC0xODRULTY4IC0xNDRRLTY4IC0xMzggLTY3IC0xMjhULTYyIC0xMDdULTUzIC04NVQtNDAgLTY2US0zMCAtNTUgLTE2IC01MVQzMCAtNDZIMTIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXiIgZ2x5cGgtbmFtZT0iYXNjaWljaXJjdW0iIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0xOTYgNDM4UTE2OSA0MzggMTU0IDQ1NVQxMzkgNDk1UTEzOSA1MjEgMTU2IDU0NVQyMDMgNTkxUTIzMyA2MTMgMjY4IDYyOFQzMzUgNjUxUTM1MyA2NDUgMzc3IDYyOVQ0MjMgNTkxUTQ0MyA1NzAgNDU2IDU0OFQ0NjkgNTA1UTQ2OSA0NzYgNDUxIDQ1N1Q0MDMgNDM4UTM3OSA0MzggMzU5IDQ1M1QzMjUgNDk2UTMyMiA1MDMgMzE5IDUxMVQzMTIgNTI4UTMwNiA1MjAgMzAxIDUxMlQyODggNDk2UTI2OCA0NjggMjQ2IDQ1M1QxOTYgNDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXyIgZ2x5cGgtbmFtZT0idW5kZXJzY29yZSIgaG9yaXotYWR2LXg9IjUxNiIgZD0iTTM3NSAwUTQwOCAwIDQyNSAtMTNUNDQyIC00OVE0NDIgLTYxIDQzNyAtODRUNDE3IC0xMjBRNDA3IC0xMzAgMzk1IC0xMzRUMzU0IC0xMzlINlEtMjcgLTEzOSAtNDQgLTEyNlQtNjEgLTg5US02MSAtODMgLTYwIC03NFQtNTUgLTU1VC00OCAtMzVULTM2IC0xOVEtMjYgLTkgLTE0IC01VDI3IDBIMzc1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgZ2x5cGgtbmFtZT0iZ3JhdmUiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0yMTIgNTc5UTE4NiA1OTQgMTcxIDYxN1QxNTYgNjY0UTE1NiA2OTggMTc4IDcyMVQyMzcgNzQ1UTI2OSA3NDUgMjk2IDcyOVEzMjEgNzE0IDM0MSA2ODlUMzc2IDYzOVQzOTcgNTk0VDQwMCA1NjdRMzk2IDU2MSAzNzggNTU1VDMzNCA1NDhUMjc1IDU1NFQyMTIgNTc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYSIgZ2x5cGgtbmFtZT0iYSIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTIxIDE4NlEyMSAyNDcgNDAgMzA1VDk1IDQwOFQxNzkgNDgwVDI4OCA1MDhRMzMzIDUwOCAzNzIgNDg5VDQzNCA0MzFMNDQ4IDQ5Nkg2NDBMNTYzIDEzNVE1NTMgOTAgNTYwIDcwVDU5NCA0MlE1OTQgNDIgNTkxIDM0VDU3NyAxNVQ1NDYgLTNUNDkzIC0xMlE0MzMgLTEyIDQwNSAxNlQzNzQgOTFRMzQ4IDQ1IDMwNCAxN1QyMDEgLTEyUTE2MSAtMTIgMTI4IDJUNzEgNDFUMzQgMTA0VDIxIDE4NlpNMjA1IDIxOVEyMDUgMTgyIDIyNiAxNjBUMjgxIDEzN1EzMjIgMTM3IDM1MiAxNjRUMzk0IDI0MEw0MDcgMzAwUTM5NiAzMjkgMzc2IDM0NVQzMjIgMzYyUTI5NSAzNjIgMjc0IDM1MFQyMzcgMzE4VDIxMyAyNzJUMjA1IDIxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImIiIGdseXBoLW5hbWU9ImIiIGhvcml6LWFkdi14PSI2MjgiIGQ9Ik0xMzggNjk3SDMyOUwyNzQgNDM4UTI5OSA0NzAgMzM0IDQ4OVQ0MTYgNTA4UTQ1NiA1MDggNDkxIDQ5NFQ1NTEgNDUzVDU5MSAzODhUNjA2IDMwMFE2MDYgMjQwIDU4OSAxODRUNTM4IDg1VDQ1OSAxNVQzNTQgLTEyUTMwMyAtMTIgMjU5IDExVDE5MiA4MFExNzIgMzUgMTQxIDE2VDU5IC00UTQ1IC00IDMzIC0yVDEyIDVULTIgMTJULTYgMTlMMTM4IDY5N1pNMzE3IDEzNFEzNDIgMTM0IDM2MSAxNDVUMzk0IDE3NVQ0MTQgMjE4VDQyMSAyNzBRNDIxIDMxMCA0MDAgMzM0VDM0MCAzNTlRMzEzIDM1OSAyODkgMzQ2VDI0NyAzMTFMMjM1IDI1NlEyMjQgMjAyIDI0NSAxNjhUMzE3IDEzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImMiIGdseXBoLW5hbWU9ImMiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0xOCAyMTRRMTggMjc0IDQwIDMyN1QxMDAgNDIwVDE5MCA0ODRUMzAzIDUwOFEzNjggNTA4IDQxMiA0OTFUNDgzIDQ0N1E1MDEgNDI5IDUwOSA0MDlUNTE4IDM3MFE1MTggMzM1IDUwMCAzMTZUNDYwIDI4OVQ0MjAgMjgwVDQwMCAyODNRMzk0IDMxNSAzNzIgMzM3VDMwNyAzNTlRMjgxIDM1OSAyNjAgMzQ4VDIyMyAzMTlUMTk5IDI3OFQxOTAgMjMwUTE5MCAxOTAgMjE0IDE2NFQyODUgMTM3UTM0NyAxMzcgMzgwIDE5M1EzODEgMTk1IDM5NCAxOTNUNDIzIDE4MlQ0NTIgMTU3VDQ2NSAxMTdRNDY1IDc4IDQzMCA0NVE0MDQgMTkgMzYzIDNUMjY4IC0xM1EyMTEgLTEzIDE2NSAyVDg3IDQ2VDM2IDExOFQxOCAyMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJkIiBnbHlwaC1uYW1lPSJkIiBob3Jpei1hZHYteD0iNjQwIiBkPSJNMjQgMTk3UTI0IDI1NyA0MSAzMTNUOTIgNDEyVDE3MSA0ODJUMjc2IDUwOFEzMjMgNTA4IDM2NSA0ODhUNDMzIDQyN0w0OTAgNjk3SDY4Mkw1NjMgMTM1UTU1MiA5MCA1NjAgNzBUNTk0IDQyUTU5NCA0MiA1OTEgMzRUNTc3IDE1VDU0NiAtM1Q0OTMgLTEyUTQzMyAtMTIgNDA2IDE2VDM3NSA4OVEzNTEgNDQgMzEwIDE2VDIxMyAtMTJRMTcyIC0xMiAxMzggMlQ3OCA0M1QzOSAxMDlUMjQgMTk3Wk0yMDggMjI0UTIwOCAxODUgMjI5IDE2MVQyODcgMTM3UTMyNCAxMzcgMzUzIDE2M1QzOTMgMjM4TDQwNiAyOTlRMzk1IDMyOCAzNzUgMzQ1VDMxNyAzNjJRMjkwIDM2MiAyNzAgMzUxVDIzNiAzMjBUMjE1IDI3NlQyMDggMjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZSIgZ2x5cGgtbmFtZT0iZSIgaG9yaXotYWR2LXg9IjU0NCIgZD0iTTE4IDIwNVExOCAyNzMgNDIgMzI5VDEwOSA0MjRUMjA4IDQ4NlQzMzAgNTA4UTQzMyA1MDggNDg1IDQ2NlQ1MzggMzUzUTUzOCAzMTUgNTI1IDI4NVQ0NzggMjMzVDM5MSAyMDFUMjU0IDE4OVEyMzUgMTg5IDIxNiAxODlUMTc0IDE5MVExODMgMTE4IDI3NiAxMThRMzIwIDExOCAzNTQgMTM3VDQwOSAxODRRNDA5IDE4NCA0MjEgMTgyVDQ0NyAxNzNUNDczIDE1MlQ0ODUgMTE2UTQ4NSA5MCA0NzggNzVUNDU0IDQ0UTQzMCAyMCAzODUgNFQyNzMgLTEzUTIwNyAtMTMgMTU5IDNUODAgNDlUMzMgMTE4VDE4IDIwNVpNMTk0IDI5N1EyMDYgMjk2IDIxNyAyOTZUMjM4IDI5N1EyODAgMjk3IDMwOCAzMDBUMzUyIDMxMVQzNzYgMzI3VDM4MyAzNDhRMzgzIDM2MyAzNjggMzc1VDMyMSAzODhRMjc4IDM4OCAyNDYgMzYyVDE5NCAyOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJmIiBnbHlwaC1uYW1lPSJmIiBob3Jpei1hZHYteD0iNDE2IiBkPSJNMTE2IDM1MUgzM0w2MyA0OTZIMTQ2TDE1MCA1MTNRMTYyIDU3MCAxODMgNjA4VDIzMyA2NjhUMjk0IDcwMFQzNjUgNzA5UTQwNyA3MDkgNDM1IDcwMFQ0ODEgNjczUTUwMiA2NTIgNTAyIDYyMlE1MDIgNjA0IDQ5NSA1ODlUNDgwIDU2M1Q0NjUgNTQ3VDQ1NiA1NDJRNDQ2IDU1MyA0MzAgNTYwVDM5MyA1NjdRMzcwIDU2NyAzNTYgNTU2VDMzNCA1MTRMMzMwIDQ5Nkg0NDRMNDEzIDM1MUgzMDhMMjMzIDBINDFMMTE2IDM1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImciIGdseXBoLW5hbWU9ImciIGhvcml6LWFkdi14PSI2MjkiIGQ9Ik0tMyAtNjFRLTMgLTM3IDkgLTE4VDM2IDEzVDY0IDMwVDc5IDMzUTEwMiAtNSAxMzYgLTI1VDIyNCAtNDZRMjg0IC00NiAzMTQgLTIwVDM1NSA1OEwzNjMgOTZRMzM0IDYxIDI5OCA0NVQyMTMgMjhRMTcyIDI4IDEzOCA0MlQ3OSA4M1Q0MSAxNDZUMjcgMjI5UTI3IDI4MSA0NCAzMzFUOTQgNDIwVDE3NSA0ODRUMjg1IDUwOFEzMjkgNTA4IDM2OSA0OTBUNDM1IDQzNUw0NDggNDk2SDY0MEw1NDYgNTdRNTMyIC05IDUwOSAtNTdUNDQ3IC0xMzdUMzUzIC0xODRUMjIxIC0yMDBRMTgxIC0yMDAgMTUxIC0xOTVUOTcgLTE4MVQ1OCAtMTYxVDI5IC0xMzdRLTMgLTEwNiAtMyAtNjFaTTIwOCAyNDlRMjA4IDIxNCAyMzAgMTkzVDI4OSAxNzFRMzMxIDE3MSAzNjAgMTk0VDM5NyAyNTRMNDA4IDMwN1EzOTcgMzMyIDM3NSAzNDZUMzIxIDM2MVEyOTQgMzYxIDI3MyAzNTJUMjM4IDMyN1QyMTYgMjkxVDIwOCAyNDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJoIiBnbHlwaC1uYW1lPSJoIiBob3Jpei1hZHYteD0iNjExIiBkPSJNMTIwIDYxMlExMzEgNjY0IDE1MSA2ODRUMjA4IDcwNEgyMjhRMjQ3IDcwNCAyNjUgNzAwVDI5NSA2ODVUMzEyIDY1N1QzMTEgNjEyTDI2OSA0MTJRMjk2IDQ1NSAzMzkgNDgxVDQzNiA1MDhRNTA1IDUwOCA1NDQgNDY1VDU4MyAzNTNRNTgzIDMyNyA1NzYgMjkzVDU1NSAyMTBRNTQ1IDE3NSA1MzkgMTQ3VDUzMiAxMDRRNTMyIDgyIDU0MSA3MlQ1NzEgNTZRNTcyIDU2IDU2OCA0NlQ1NTIgMjJUNTE3IC0xVDQ1NyAtMTJRMzk0IC0xMiAzNjcgMTRUMzM5IDg2UTMzOSAxMDggMzQ0IDEzM1QzNjIgMjAyUTM3MSAyMzQgMzc2IDI1N1QzODEgMjkzUTM4MSAzMjEgMzY3IDMzN1QzMjMgMzUzUTI5OCAzNTMgMjgxIDM0M1QyNDggMzEwTDE4MiAwSC0xMEwxMjAgNjEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaSIgZ2x5cGgtbmFtZT0iaSIgaG9yaXotYWR2LXg9IjI5OCIgZD0iTTIyNSA1NTJRMTc3IDU1MiAxNTEgNTc0VDEyNSA2MzFRMTI1IDY3OCAxNTUgNzA1VDIzMSA3MzNRMjc5IDczMyAzMDUgNzExVDMzMSA2NTRRMzMxIDYwOCAzMDEgNTgwVDIyNSA1NTJaTTE0MyAtMTJRMTAxIC0xMiA3NSAwVDM2IDMzVDIwIDgyVDI1IDE0MkwxMDEgNDk2SDI5M0wyMTUgMTM1UTIwNSA5MCAyMTMgNzBUMjQ4IDQyUTI0OCA0MiAyNDUgMzRUMjMwIDE1VDE5OCAtM1QxNDMgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaiIgZ2x5cGgtbmFtZT0iaiIgaG9yaXotYWR2LXg9IjMwMSIgZD0iTTI0MCA1NTJRMTkzIDU1MiAxNjcgNTc0VDE0MSA2MzFRMTQxIDY3OCAxNzEgNzA1VDI0NyA3MzNRMjk1IDczMyAzMjAgNzExVDM0NiA2NTRRMzQ2IDYwOCAzMTYgNTgwVDI0MCA1NTJaTTExNiA0OTZIMzA4TDE5NyAtMjFRMTc3IC0xMTMgMTM1IC0xNTdUOSAtMjAxUS0zMSAtMjAxIC01OSAtMTkyVC0xMDMgLTE2NlEtMTI1IC0xNDQgLTEyNSAtMTExUS0xMjUgLTk1IC0xMjAgLTgxVC0xMDkgLTU3VC05OCAtNDFULTkyIC0zNVEtODQgLTQzIC02OCAtNDlULTM4IC01NVEtMjAgLTU1IC05IC00NFQxMCAtMkwxMTYgNDk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iayIgZ2x5cGgtbmFtZT0iayIgaG9yaXotYWR2LXg9IjU1NiIgZD0iTTEzOCA2OTdIMzI5UTMwNiA1ODggMjg4IDUwNFEyODAgNDY3IDI3MyA0MzNUMjYwIDM3MVEyNTMgMzM5IDI0NyAzMTFMNDQ5IDUwOFE0NTAgNTA5IDQ2NiA1MDZUNTAyIDQ5MlQ1MzcgNDYyVDU1MyA0MTJRNTUzIDM4NyA1NDIgMzY4VDUwNyAzMzBMMzkzIDIzOEw0MjggMTcyUTQzOCAxNDkgNDQ3IDEzNFQ0NjYgMTA5VDQ4OCA5NlQ1MTYgOTBRNTE4IDkwIDUxNyA3NFQ1MDUgNDBUNDcxIDZUNDA3IC0xMFEzODEgLTEwIDM2MyAtNFQzMzEgMTVUMzA0IDUwVDI3OSAxMDNMMjI4IDIyMVEyMjUgMjA1IDIyMSAxODdRMjE4IDE3MSAyMTQgMTUxVDIwNSAxMTFRMTk0IDYzIDE4MiAwSC0xMEwxMzggNjk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgZ2x5cGgtbmFtZT0ibCIgaG9yaXotYWR2LXg9IjI5OCIgZD0iTTE0MyAtMTJRMTAxIC0xMiA3NSAwVDM2IDMzVDIwIDgyVDI1IDE0MkwxNDMgNjk3SDMzNUwyMTUgMTM1UTIwNSA5MCAyMTMgNzBUMjQ4IDQyUTI0OCA0MiAyNDUgMzRUMjMwIDE1VDE5OCAtM1QxNDMgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgZ2x5cGgtbmFtZT0ibSIgaG9yaXotYWR2LXg9IjkxNyIgZD0iTTkzIDQ4OFE5NCA0OTEgMTEwIDQ5NVQxNDkgNTAwUTE2NyA1MDAgMTg0IDQ5NVQyMTYgNDc5VDIzOSA0NTFUMjUyIDQwOFEyODQgNDU1IDMyNyA0ODFUNDI2IDUwOFE0NzcgNTA4IDUxNSA0ODBUNTY1IDQwM1E1OTcgNDUxIDY0MCA0NzlUNzQzIDUwOFE3NzcgNTA4IDgwMyA0OTZUODQ5IDQ2NFQ4NzggNDE1VDg4OCAzNTNRODg4IDMyNyA4ODEgMjkzVDg2MCAyMTBRODUwIDE3NSA4NDQgMTQ3VDgzNyAxMDRRODM3IDgyIDg0NiA3MlQ4NzYgNTZRODc3IDU2IDg3MyA0NlQ4NTcgMjJUODIyIC0xVDc2MiAtMTJRNjk5IC0xMiA2NzIgMTRUNjQ0IDg2UTY0NCAxMDggNjQ5IDEzM1Q2NjcgMjAyUTY3NiAyMzQgNjgxIDI1N1Q2ODYgMjkzUTY4NiAzMjEgNjcyIDMzN1Q2MzQgMzUzUTYxNCAzNTMgNTk4IDM0NFQ1NjUgMzEzTDQ5OSAwSDMwN0wzNjQgMjcwUTM3MiAzMDYgMzU5IDMyOVQzMTggMzUzUTI5NyAzNTMgMjgxIDM0NFQyNDkgMzE2TDE4MiAwSC0xMEw5MyA0ODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJuIiBnbHlwaC1uYW1lPSJuIiBob3Jpei1hZHYteD0iNjExIiBkPSJNOTMgNDg4UTk0IDQ5MSAxMTAgNDk1VDE0OSA1MDBRMTg2IDUwMCAyMTYgNDc5VDI1MiA0MDZRMjg0IDQ1MyAzMjggNDgwVDQzMiA1MDhRNTA0IDUwOCA1NDMgNDY1VDU4MyAzNTNRNTgzIDMyNyA1NzYgMjkzVDU1NSAyMTBRNTQ1IDE3NSA1MzkgMTQ3VDUzMiAxMDRRNTMyIDgyIDU0MSA3MlQ1NzEgNTZRNTcyIDU2IDU2OCA0NlQ1NTIgMjJUNTE3IC0xVDQ1NyAtMTJRMzk0IC0xMiAzNjcgMTRUMzM5IDg2UTMzOSAxMDggMzQ0IDEzM1QzNjIgMjAyUTM3MSAyMzQgMzc2IDI1N1QzODEgMjkzUTM4MSAzMjEgMzY3IDMzN1QzMjMgMzUzUTI5OCAzNTMgMjgxIDM0M1QyNDggMzEwTDE4MiAwSC0xMEw5MyA0ODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJvIiBnbHlwaC1uYW1lPSJvIiBob3Jpei1hZHYteD0iNTY2IiBkPSJNMjEgMjE0UTIxIDI3MCAzOSAzMjNUOTMgNDE3VDE4MSA0ODNUMzAyIDUwOFEzNjMgNTA4IDQwOCA0OTBUNDg0IDQ0MlQ1MzAgMzcwVDU0NSAyODFRNTQ1IDIyNSA1MjcgMTcyVDQ3MyA3OFQzODUgMTJUMjY0IC0xM1EyMDMgLTEzIDE1OCA1VDgyIDU0VDM2IDEyNlQyMSAyMTRaTTE4MSAyMjJRMTgxIDE4MSAyMDUgMTU1VDI2OCAxMjhRMjk1IDEyOCAzMTYgMTQwVDM1MyAxNzNUMzc2IDIyMFQzODUgMjc0UTM4NSAzMTQgMzYxIDM0MFQyOTggMzY3UTI3MSAzNjcgMjUwIDM1NVQyMTMgMzIyVDE5MCAyNzZUMTgxIDIyMloiICAvPgorPGdseXBoIHVuaWNvZGU9InAiIGdseXBoLW5hbWU9InAiIGhvcml6LWFkdi14PSI2MjgiIGQ9Ik05MyA0ODhROTQgNDkxIDExMCA0OTVUMTQ5IDUwMFExODYgNTAwIDIxNiA0NzlUMjUyIDQwNFEyNzYgNDUxIDMxNyA0NzlUNDE2IDUwOFE0NTYgNTA4IDQ5MSA0OTRUNTUxIDQ1M1Q1OTEgMzg4VDYwNiAzMDBRNjA2IDI0MCA1ODkgMTg0VDUzOCA4NVQ0NTkgMTVUMzU0IC0xMlEzMDAgLTEyIDI2MCA5VDE5NyA3MkwxNDIgLTE4NkgtNTBMOTMgNDg4Wk0zMTcgMTM0UTM0MiAxMzQgMzYxIDE0NVQzOTQgMTc1VDQxNCAyMThUNDIxIDI3MFE0MjEgMzEwIDQwMCAzMzRUMzQwIDM1OVEzMTMgMzU5IDI4OSAzNDZUMjQ3IDMxMEwyMzUgMjU2UTIyNCAyMDIgMjQ1IDE2OFQzMTcgMTM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icSIgZ2x5cGgtbmFtZT0icSIgaG9yaXotYWR2LXg9IjYyOSIgZD0iTTI0IDE5N1EyNCAyNTcgNDEgMzEzVDkyIDQxMlQxNzEgNDgyVDI3NiA1MDhRMzI1IDUwOCAzNzAgNDg2VDQzOCA0MThRNDU4IDQ2MiA0ODkgNDgxVDU3MCA1MDBRNTk4IDUwMCA2MTcgNDkxVDYzNiA0NzdMNDk1IC0xODZIMzAzTDM1NCA1NlEzMjggMjQgMjkzIDZUMjEzIC0xMlExNzIgLTEyIDEzOCAyVDc4IDQzVDM5IDEwOVQyNCAxOTdaTTIwOCAyMjRRMjA4IDE4NSAyMjkgMTYxVDI4NyAxMzdRMzI0IDEzNyAzNTMgMTYzVDM5MyAyMzhMNDA2IDI5OVEzOTUgMzI4IDM3NSAzNDVUMzE3IDM2MlEyOTAgMzYyIDI3MCAzNTFUMjM2IDMyMFQyMTUgMjc2VDIwOCAyMjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJyIiBnbHlwaC1uYW1lPSJyIiBob3Jpei1hZHYteD0iNDY1IiBkPSJNOTMgNDg4UTk0IDQ5MSAxMTAgNDk1VDE0OSA1MDBRMTg2IDUwMCAyMTYgNDc5VDI1MiA0MDZRMjczIDQ1MiAzMDggNDgwVDM4OSA1MDhRNDMxIDUwOCA0NTggNDg1VDQ4NiA0MjRRNDg2IDM4OSA0NzMgMzY2VDQ0MyAzMjhUNDE0IDMwOFQzOTkgMzAzUTM4OCAzMTYgMzcyIDMyNVQzMjggMzM0UTI4NyAzMzQgMjYzIDI5OVQyMjQgMjAxTDE4MSAwSC0xMUw5MyA0ODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJzIiBnbHlwaC1uYW1lPSJzIiBob3Jpei1hZHYteD0iNDgxIiBkPSJNMTggNTRRNCA2OCAtNCA4NFQtMTMgMTE4US0xMyAxMzcgLTUgMTUyVDEzIDE3OFQzMiAxOTNUNDMgMTk2UTU3IDE4MSA3NiAxNjdUMTE2IDE0MlQxNTkgMTI1VDIwMyAxMThRMjQ5IDExOCAyNDkgMTQ2UTI0OSAxNTcgMjM2IDE2NVQxOTUgMTg0UTE2OSAxOTQgMTQ0IDIwNlQ5OSAyMzRUNjcgMjc0VDU0IDMzMlE1NCAzNzAgNjcgNDAyVDEwOCA0NTdUMTc0IDQ5M1QyNjYgNTA2UTMzMCA1MDYgMzgwIDQ4OFQ0NjEgNDQwUTQ3MiA0MjkgNDc5IDQxNVQ0ODYgMzgzUTQ4NiAzNjAgNDc3IDM0NFQ0NTYgMzE3VDQzNSAzMDFUNDIzIDI5OFEzOTcgMzMwIDM1OSAzNTRUMjc5IDM3OFEyNTUgMzc4IDI0MyAzNzBUMjMxIDM0OVEyMzEgMzM4IDI0NiAzMzBUMjk4IDMwNlEzMjggMjk0IDM1NSAyODFUNDAyIDI1MVQ0MzUgMjExVDQ0NyAxNTVRNDQ3IDgwIDM5MiAzNVQyMjggLTExUTE1MSAtMTEgOTkgN1QxOCA1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9InQiIGdseXBoLW5hbWU9InQiIGhvcml6LWFkdi14PSI0MzMiIGQ9Ik0xMTEgMzUxSDM1TDY1IDQ5NkgxNDJMMTQ1IDUxMVExNTggNTc2IDE4OSA2MDZUMjg1IDYzN1EzMTYgNjM3IDMzNiA2MjhUMzU1IDYxNEwzMzAgNDk2SDQ1NUw0MjQgMzUxSDI5NkwyNjIgMTg5UTI1NSAxNTcgMjY1IDE0M1QyOTggMTI4UTMxNCAxMjggMzI4IDEzNFQzNTQgMTUwUTM1NyAxNTMgMzY5IDE0MFQzODIgOTlRMzgyIDU4IDM1MSAyN1EzMTIgLTE0IDIyOSAtMTRRMTMzIC0xNCA5NSAzN1Q3NSAxODBMMTExIDM1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9InUiIGdseXBoLW5hbWU9InUiIGhvcml6LWFkdi14PSI2MTUiIGQ9Ik0xNzEgLTEzUTgyIC0xMyA0NiA0OFQzMiAyMTRMOTIgNDk2SDI4NEwyMjYgMjM0UTIxNiAxOTMgMjMwIDE2OFQyODAgMTQzUTMwNSAxNDMgMzIyIDE1M1QzNTUgMTg2TDQyMSA0OTZINjEzTDUzNiAxMzVRNTI2IDkwIDUzMyA3MFQ1NjcgNDJRNTY4IDQyIDU2NSAzNFQ1NTAgMTVUNTE5IC0zVDQ2NyAtMTJRNDA4IC0xMiAzODAgMTRUMzQ4IDg2UTMxNiA0MCAyNzMgMTRUMTcxIC0xM1oiICAvPgorPGdseXBoIHVuaWNvZGU9InYiIGdseXBoLW5hbWU9InYiIGhvcml6LWFkdi14PSI1NjgiIGQ9Ik05NCAzMjJROTAgMzUwIDg0IDM2OFQ2OCAzOThUNDggNDE0VDI0IDQyMVEyMiA0MjEgMjYgNDM0VDQzIDQ2NFQ3OSA0OTNUMTQwIDUwNlExOTEgNTA2IDIyMSA0NzZRMjQzIDQ1NCAyNTMgNDIwVDI2NiAzMzVMMjc1IDIwNEw0NDMgNTA1UTQ0MyA1MDYgNDY0IDUwNFQ1MDkgNDkyVDU1NCA0NjNUNTc1IDQxM1E1NzUgMzkwIDU2NyAzNzJUNTM4IDMyMkwzMTggMEgxNDNMOTQgMzIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgZ2x5cGgtbmFtZT0idyIgaG9yaXotYWR2LXg9IjgwNSIgZD0iTTk0IDMyOVE5MiAzNzggNzQgMzk4VDI4IDQyMlEyNiA0MjIgMjkgNDM1VDQzIDQ2NFQ3NyA0OTNUMTM2IDUwNlExODkgNTA2IDIxOCA0NzhRMjU2IDQzOSAyNTYgMzM5TDI1NSAyMDJMMzUyIDQwN1EzNjcgNDM5IDM4OCA0NTBUNDQxIDQ2MlE0ODUgNDYyIDUxMCA0NDZUNTM4IDM4OUw1NDcgMjAwTDY4NiA1MDVRNjg3IDUwNiA3MDcgNTA1VDc1MCA0OTVUNzk0IDQ2OVQ4MTQgNDE5UTgxNCA0MDIgODA4IDM4NlQ3ODUgMzQwTDU5MiAwSDQzNUw0MDggMjQyTDI3MSAwSDExNUw5NCAzMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ4IiBnbHlwaC1uYW1lPSJ4IiBob3Jpei1hZHYteD0iNTU2IiBkPSJNODQgLTExUTgzIC0xMiA2NyAtN1QzMiA5VC0zIDQwVC0xOSA4NlEtMTkgMTEyIC00IDEzNFQzNyAxNzZMMTY5IDI3MEwzOSA0OTVIMjQwTDMwOSAzNDlMNDU0IDUwN1E0NTUgNTA4IDQ3MSA1MDNUNTA3IDQ4N1Q1NDEgNDU2VDU1NyA0MTBRNTU3IDM4NCA1NDMgMzYyVDUwMiAzMjBMMzc4IDIxOUwzOTkgMTg0UTQxMiAxNjAgNDI2IDE0NVQ0NTUgMTIyVDQ4MyAxMTBUNTExIDEwNVE1MTMgMTA1IDUxMCA4N1Q0OTMgNDhUNDUyIDEwVDM4MCAtOFEzNTkgLTggMzQxIC00VDMwNyAxMlQyNzcgNDRUMjQ3IDk4TDIyOCAxNDBMODQgLTExSDg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieSIgZ2x5cGgtbmFtZT0ieSIgaG9yaXotYWR2LXg9IjU3MiIgZD0iTS03IC0zOFExIC00NSAxNyAtNTBUNDcgLTU1UTc0IC01NSA5OCAtMzlUMTU1IDI0TDE2NSAzOFExMzAgNDkgMTIzIDk2TDk0IDMyMlE4NiAzNzcgNjggMzk3VDIzIDQyMVEyMSA0MjEgMjUgNDM0VDQxIDQ2NFQ3NyA0OTNUMTM5IDUwNlExOTUgNTA2IDIyNyA0NjZUMjY2IDMzNUwyNzUgMjA4TDQyNSA0OTZINjI3TDMwNiAtNDVRMjgzIC04MSAyNjEgLTEwOVQyMTQgLTE1OFQxNjAgLTE5MFQ5NiAtMjAxUTIyIC0yMDEgLTEyIC0xNjhRLTM2IC0xNDQgLTM2IC0xMDNRLTM2IC05MCAtMzIgLTc4VC0yMyAtNTdULTEzIC00M1QtNyAtMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ6IiBnbHlwaC1uYW1lPSJ6IiBob3Jpei1hZHYteD0iNTE2IiBkPSJNNCAxMzVMMjY5IDM1MkgxNTdRNjYgMzUyIDY2IDQxM1E2NiA0MjggNzAgNDQyVDgwIDQ2OVQ5MSA0ODhUOTcgNDk2SDUzMkw1MDYgMzYxTDI0MSAxNDRIMzcxUTQ2MiAxNDQgNDYyIDgzUTQ2MiA2OCA0NTggNTNUNDQ4IDI3VDQzNyA4VDQzMSAwSC0yMkw0IDEzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9InsiIGdseXBoLW5hbWU9ImJyYWNlbGVmdCIgaG9yaXotYWR2LXg9IjQ5NyIgZD0iTTgwIDEwMlE2MCAxMTUgNDggMTI2VDI4IDE0OVQxNyAxNzJUMTQgMjAxUTE0IDIzNCAyMyAyNjlUNTMgMzI0UTU5IDMzMCA2NSAzMzRUODAgMzQzVDEwMiAzNTJUMTM1IDM2M0wxNjUgMzc0UTE4NSA0NDggMjEzIDQ5OFQyNzYgNTg0UTMxNSA2MjMgMzYxIDY0MVQ0NTYgNjU5UTUwNyA2NTkgNTMwIDYzOVQ1NTQgNTgxUTU1NCA1NjcgNTUwIDU1NVQ1NDAgNTMzVDUyOSA1MTlUNTI0IDUxNFE0NzkgNTEzIDQ0OSA1MDJUMzk2IDQ2OFEzNzAgNDQyIDM1MyAzOTlUMzIwIDI5MkwxODkgMjI5TDI5MSAxNTZRMjgyIDg0IDI4NyA0MlQzMTYgLTI1UTMzOSAtNDggMzkyIC01OFEzOTQgLTU4IDQwMCAtNzBUNDA2IC0xMDRRNDA2IC0xNTAgMzgxIC0xNzVUMzAxIC0yMDBRMjYxIC0yMDAgMjMyIC0xODhUMTc1IC0xNTBRMTQwIC0xMTUgMTIxIC01NlQxMDQgODZMODAgMTAySDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifCIgZ2x5cGgtbmFtZT0iYmFyIiBob3Jpei1hZHYteD0iMjkwIiBkPSJNMTE3IDU2N1ExMjggNjE0IDE1MCA2MzZUMjExIDY1OUgyNDBRMjc3IDY1OSAyOTcgNjM2VDMwOCA1NjZMMTY2IC0xMDdRMTU1IC0xNTQgMTMzIC0xNzZUNzEgLTE5OUg0M1E1IC0xOTkgLTE1IC0xNzZULTI2IC0xMDZMMTE3IDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9In0iIGdseXBoLW5hbWU9ImJyYWNlcmlnaHQiIGhvcml6LWFkdi14PSI0OTciIGQ9Ik0tMzYgLTU1UTkgLTU0IDM5IC00M1Q5MiAtOVExMTggMTcgMTM1IDYwVDE2OCAxNjdMMjk5IDIzMEwxOTcgMzA0UTIwNiAzNzUgMjAxIDQxOFQxNzIgNDg0UTE0OSA1MDcgOTYgNTE3UTk0IDUxNyA4OCA1MjlUODIgNTYzUTgyIDYwOSAxMDggNjM0VDE4NyA2NTlRMjI4IDY1OSAyNTcgNjQ3VDMxMyA2MDlRMzQ4IDU3NCAzNjcgNTE1VDM4NCAzNzRMNDA4IDM1N1E0MjggMzQzIDQ0MSAzMzJUNDYxIDMxMFQ0NzIgMjg3VDQ3NSAyNThRNDc1IDIyNSA0NjUgMTkxVDQzNSAxMzZRNDI5IDEzMCA0MjMgMTI2VDQwOCAxMTdUMzg2IDEwN1QzNTMgOTZMMzIzIDg1UTMwMyAxMSAyNzUgLTM5VDIxMiAtMTI1UTE3MyAtMTY0IDEyNyAtMTgyVDMyIC0yMDBRLTE5IC0yMDAgLTQyIC0xODBULTY2IC0xMjJRLTY2IC0xMDggLTYyIC05NlQtNTIgLTc0VC00MSAtNjBULTM2IC01NVoiICAvPgorPGdseXBoIHVuaWNvZGU9In4iIGdseXBoLW5hbWU9ImFzY2lpdGlsZGUiIGhvcml6LWFkdi14PSI0OTkiIGQ9Ik0xMTkgMTU1UTk0IDE1NSA4MCAxNzBUNjQgMjA2UTY1IDIzNSA3NSAyNThUMTAxIDI5N1QxMzkgMzIxVDE4MiAzMzBRMjA4IDMzMCAyMjcgMzIzVDI2MCAzMDVRMjc3IDI5NCAyODYgMjg2VDMwMyAyNzhRMzEzIDI3OCAzMjAgMjg3VDMzNiAzMDhRMzQ0IDMxOSAzNTMgMzIzVDM3NyAzMjdRNDAyIDMyNyA0MTYgMzEyVDQzMiAyNzZRNDMxIDI0NyA0MjEgMjI1VDM5NSAxODZUMzU3IDE2MlQzMTQgMTUzUTI4NyAxNTMgMjY5IDE2MVQyMzggMTc4UTIyMSAxOTEgMjEzIDIwMVQxOTMgMjEyUTE4MyAyMTIgMTc4IDIwMlQxNjUgMTc3UTE1OSAxNjcgMTQ5IDE2MVQxMTkgMTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTA7IiBnbHlwaC1uYW1lPSJuYnNwYWNlIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEExOyIgZ2x5cGgtbmFtZT0iZXhjbGFtZG93biIgaG9yaXotYWR2LXg9IjI5NyIgZD0iTTIwMSA0NzdRMTU5IDQ3NyAxMzkgNDkyVDExOSA1NDBRMTE5IDU2MCAxMjYgNTg4VDE1MiA2MzRRMTU4IDY0MCAxNjQgNjQ0VDE3OSA2NTFUMjAwIDY1NVQyMzIgNjU2UTI3NCA2NTYgMjk0IDY0MVQzMTQgNTkzUTMxNCA1NzMgMzA3IDU0NVQyODEgNDk5UTI3MCA0ODcgMjU0IDQ4MlQyMDEgNDc3Wk0xMTggMzc0UTEzMSA0MDQgMTQ0IDQxOFQxODEgNDMzUTIxMiA0MzMgMjIzIDQxOVQyMzUgMzcyTDIyNCAxSC0yOEwxMTggMzc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTI7IiBnbHlwaC1uYW1lPSJjZW50IiBob3Jpei1hZHYteD0iNTQxIiBkPSJNMTcwIDM1UTEwNCA2MCA2NyAxMTJUMjkgMjQ2UTI5IDMwMyA0NyAzNTNUOTkgNDQzVDE3OCA1MDlUMjc4IDU0NEwyODUgNTc0UTI5NiA2MjcgMzE1IDY0N1QzNjUgNjY3SDM3MFEzODYgNjY3IDQwMiA2NjNUNDI5IDY0OFQ0NDYgNjE5VDQ0NSA1NzRMNDM3IDUzNVE0ODkgNTE5IDUyMSA0ODdRNTM4IDQ3MCA1NDYgNDQ5VDU1NSA0MDZRNTU1IDM3MCA1MzUgMzUyVDQ5MSAzMjdUNDQ3IDMyMVQ0MjUgMzI1UTQxNyAzNTkgMzk1IDM3N0wzNTIgMTc1UTM4MyAxODYgNDAxIDIxN1E0MDIgMjE5IDQxNyAyMTdUNDUxIDIwNVQ0ODQgMTc5VDQ5OSAxMzVRNDk5IDExOCA0OTIgMTAyVDQ2OCA2OVE0NDcgNDggNDEyIDM0VDMyNiAxNkwzMjEgLTExUTMxMCAtNjMgMjkxIC04M1QyNDEgLTEwM0gyMzZRMjIwIC0xMDMgMjA0IC05OVQxNzcgLTg0VDE2MCAtNTZUMTYxIC0xMUwxNzAgMzVaTTI1MCAzNjhRMjI4IDM0OSAyMTcgMzIxVDIwNSAyNjJRMjA1IDIzNCAyMTcgMjEyTDI1MCAzNjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMzsiIGdseXBoLW5hbWU9InN0ZXJsaW5nIiBob3Jpei1hZHYteD0iNjA5IiBkPSJNLTEyIDU0US0xMiA2MCAtMTEgNzBULTYgOTJUMyAxMTNUMTYgMTMxUTI3IDE0MSA0MCAxNDZUNzggMTUxSDkzTDExOSAyMzlIOThRNzUgMjM5IDYxIDI1MVQ0NyAyODRRNDcgMjk4IDUzIDMyMFQ3MiAzNTZRODEgMzY1IDkzIDM2OVQxMzMgMzc0SDE2MkwxODUgNDUxUTIxOCA1NjAgMjc4IDYxMFQ0NDAgNjYxUTU0MCA2NjEgNTkwIDYxMVE2MjIgNTgwIDYyMiA1MzZRNjIyIDUwNCA2MDcgNDg1VDU3NCA0NTdUNTQxIDQ0NVQ1MjUgNDQzUTUxNSA0NzggNDkzIDQ5M1Q0MzkgNTA5UTQwMyA1MDkgMzgwIDQ4OFQzMzkgNDEwTDMyOCAzNzRINDMwUTQ2MiAzNzQgNDc4IDM2MVQ0OTUgMzI2UTQ5NSAzMjAgNDk0IDMxMVQ0ODkgMjkyVDQ4MiAyNzNUNDcwIDI1N1E0NjEgMjQ4IDQ0OSAyNDRUNDA5IDIzOUgyODZMMjU5IDE1MUg0ODFRNTc2IDE1MSA1NzYgODdRNTc2IDcxIDU3MiA1NlQ1NjEgMjhUNTUwIDhUNTQ0IDBINjFRMjYgMCA3IDE1VC0xMiA1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE0OyIgZ2x5cGgtbmFtZT0iY3VycmVuY3kiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik03MCAxOTZRNDEgMTk2IDI3IDIwN1QxMiAyMzdRMTIgMjY4IDMwIDI4NlE0OSAzMDUgODIgMzA1SDEwNVExMDcgMzEzIDEwOCAzMjJUMTEyIDM0MkgxMDFRNzIgMzQyIDU4IDM1M1Q0MyAzODNRNDMgNDE0IDYxIDQzMlE4MCA0NTEgMTEzIDQ1MUgxNDRRMTU4IDQ4NCAxNzUgNTE0VDIxNCA1NjZRMjY1IDYxNiAzMjIgNjM4VDQ1MSA2NjFRNTExIDY2MSA1NTkgNjQ0VDYzNSA2MDBRNjUyIDU4MyA2NTkgNTY0VDY2NiA1MjRRNjY2IDQ5MCA2NTEgNDcwVDYxOCA0MzlUNTg1IDQyNVQ1NjggNDI0UTU0NyA0NjEgNTE3IDQ4MFQ0MzQgNDk5UTQwMyA0OTkgMzg1IDQ5MVQzNDkgNDY0TDMzOCA0NTFINDUyUTQ4MSA0NTEgNDk1IDQzOVQ1MTAgNDA5UTUxMCAzNzggNDkyIDM2MFE0NzQgMzQyIDQ0MCAzNDJIMjk4UTI5NiAzMzIgMjk1IDMyM1QyOTEgMzA1SDQyMVE0NTAgMzA1IDQ2NCAyOTNUNDc5IDI2M1E0NzkgMjMyIDQ2MSAyMTRRNDQzIDE5NiA0MDkgMTk2SDI5M1EzMTggMTQ5IDM5MCAxNDlRNDEwIDE0OSA0MjYgMTUyVDQ1OCAxNjJUNDg3IDE4MFQ1MTcgMjA3UTUxOSAyMDkgNTMxIDIwNFQ1NTYgMTg4VDU4MSAxNjFUNTkyIDEyNFE1OTIgODMgNTYwIDUxUTUzMSAyMiA0ODAgNVQzNjkgLTEzUTI1NSAtMTMgMTg0IDQyVDEwMCAxOTZINzBINzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGdseXBoLW5hbWU9InllbiIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTgyIDEwMVE1MCAxMDEgMzUgMTEzVDE5IDE0NlExOSAxNjIgMjMgMTc2VDM4IDIwMFE1OCAyMjAgOTUgMjIwSDIyOUwyMzYgMjU1SDExNlE4NCAyNTUgNjggMjY3VDUyIDMwMFE1MiAzMzUgNzIgMzU1UTkyIDM3NSAxMjkgMzc1SDE5Nkw5NCA1ODBROTIgNTg0IDk4IDU5NlQxMTkgNjIwVDE1NiA2NDJUMjA4IDY1MlEyMzkgNjUyIDI2MSA2MzNUMjk4IDU3MUwzNTAgNDI1TDUzMiA2NTlRNTMzIDY2MCA1NTIgNjU4VDU5MyA2NDZUNjM0IDYxOFQ2NTMgNTY3UTY1MyA1NDggNjQxIDUyMlQ1OTkgNDY4TDUwNSAzNzVINTU3UTU4OSAzNzUgNjA0IDM2MlQ2MjAgMzI5UTYyMCAzMTMgNjE2IDMwMFQ2MDEgMjc1UTU4MSAyNTUgNTQ0IDI1NUg0MTNMNDA1IDIyMEg1MjNRNTU1IDIyMCA1NzEgMjA4VDU4NyAxNzVRNTg3IDE1OSA1ODMgMTQ1VDU2NyAxMjBRNTQ4IDEwMSA1MTAgMTAxSDM4MEwzNzcgODZRMzY3IDM5IDM0NCAxN1QyNzggLTVIMjczUTIzMiAtNSAyMTIgMThUMjAxIDg5TDIwMyAxMDFIODJIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNzsiIGdseXBoLW5hbWU9InNlY3Rpb24iIGhvcml6LWFkdi14PSI2MDEiIGQ9Ik00MiAxOVE1NSA0IDc3IC0xMFQxMjUgLTM0VDE4MCAtNTFUMjM2IC01OFEyNzEgLTU4IDI4NyAtNDZUMzA0IC0xNlEzMDQgNCAyNzYgMTVUMjA5IDQxUTE3OSA1MSAxNDUgNjNUODMgOTRUMzUgMTM3VDE2IDE5OVExNiAyNTkgNTIgMzAyVDE0OSAzNjRRMTI3IDM4MSAxMTUgNDAzVDEwMiA0NTZRMTAyIDUwMSAxMjAgNTM4VDE3MyA2MDNUMjU1IDY0NVQzNjEgNjYwUTQ0MiA2NjAgNDkyIDY0M1Q1NjggNjAwUTU5NCA1NzQgNTk0IDU0M1E1OTQgNTE5IDU4MyA1MDJUNTU5IDQ3M1Q1MzQgNDU3VDUyMCA0NTNRNDkyIDQ4NSA0NTIgNTA2VDM2MyA1MjhRMjk1IDUyOCAyOTUgNDg4UTI5NSA0NjggMzIyIDQ1NlQzOTAgNDMwUTQyMSA0MjAgNDU0IDQwOFQ1MTUgMzc4VDU2MSAzMzVUNTc5IDI3NFE1NzkgMjE0IDU0NSAxNzRUNDQ5IDExMFE0NzAgOTQgNDgzIDcyVDQ5NyAxNlE0OTcgLTI2IDQ4MSAtNjNUNDMwIC0xMjhUMzQzIC0xNzNUMjIxIC0xOTBRMTMzIC0xOTAgODEgLTE3NFQwIC0xMzBRLTI3IC0xMDMgLTI3IC02OFEtMjcgLTQ3IC0xNyAtMzFUNSAtM1QyOSAxNFQ0MiAxOVpNMTg1IDI0OVExODUgMjMyIDE5NCAyMjFUMjE4IDIwMFQyNTQgMTg0VDI5OSAxNzBMMzQwIDE1OVEzNzAgMTY0IDM5MCAxODFUNDEwIDIyNFE0MTAgMjQwIDQwMiAyNTFUMzc4IDI3MVQzNDMgMjg2VDMwMCAzMDBMMjU0IDMxNFEyMjMgMzA3IDIwNCAyOTBUMTg1IDI0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE4OyIgZ2x5cGgtbmFtZT0iZGllcmVzaXMiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik00MzkgNTQxUTM5NiA1NDEgMzc1IDU2MlQzNTMgNjE1UTM1MyA2NjEgMzgxIDY4OFQ0NDkgNzE2UTQ5MiA3MTYgNTEzIDY5NVQ1MzQgNjQxUTUzNCA1OTYgNTA2IDU2OVQ0MzkgNTQxWk0yMTMgNTQxUTE3MCA1NDEgMTQ5IDU2MlQxMjggNjE1UTEyOCA2NjEgMTU2IDY4OFQyMjMgNzE2UTI2NiA3MTYgMjg3IDY5NVQzMDkgNjQxUTMwOSA1OTYgMjgxIDU2OVQyMTMgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTk7IiBnbHlwaC1uYW1lPSJjb3B5cmlnaHQiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik01MiAzMjRRNTIgMzk3IDc2IDQ1OVQxNDYgNTY2VDI1MyA2MzZUMzkwIDY2MVE0NjUgNjYxIDUyNiA2MzZUNjMyIDU2N1Q3MDEgNDYwVDcyNiAzMjRRNzI2IDI1MCA3MDIgMTg4VDYzMyA4MVQ1MjYgMTFUMzg5IC0xNFEzMTQgLTE0IDI1MiAxMVQxNDYgODFUNzcgMTg4VDUyIDMyNFpNMTIzIDMyNFExMjMgMjY1IDE0MiAyMTZUMTk3IDEzMFQyODEgNzRUMzkwIDUzUTQ1MCA1MyA0OTggNzNUNTgyIDEyOVQ2MzYgMjE1VDY1NSAzMjRRNjU1IDM4MyA2MzYgNDMyVDU4MSA1MThUNDk3IDU3NFQzODkgNTk0UTMyOSA1OTQgMjgwIDU3NFQxOTYgNTE4VDE0MiA0MzNUMTIzIDMyNFpNMjEyIDMyM1EyMTIgMzYzIDIyNiAzOTZUMjY0IDQ1NFQzMjMgNDkyVDM5OSA1MDZRNDQ2IDUwNiA0NzQgNDkzVDUxNyA0NjZRNTI1IDQ1NyA1MzAgNDQ4VDUzNCA0MjNRNTM0IDQwOCA1MjYgMzk3VDUwNyAzNzhUNDg3IDM2N1Q0NzcgMzY1UTQ2MSAzODQgNDQ1IDM5MlQ0MDQgNDAwUTM3NCA0MDAgMzUzIDM3OVQzMzEgMzIzUTMzMSAyODggMzUyIDI2N1Q0MDUgMjQ1UTQzMCAyNDUgNDQ2IDI1M1Q0NzggMjgxUTQ3OSAyODIgNDg4IDI3OVQ1MDcgMjY5VDUyNiAyNTBUNTM1IDIyM1E1MzYgMjA5IDUzMSAxOTlUNTE3IDE3OFE1MDMgMTY0IDQ3NSAxNTFUMzk5IDEzOFEzNTggMTM4IDMyNCAxNTFUMjY0IDE5MFQyMjYgMjQ4VDIxMiAzMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQTsiIGdseXBoLW5hbWU9Im9yZGZlbWluaW5lIiBob3Jpei1hZHYteD0iNTQxIiBkPSJNMTk1IDI0NVExMzEgMjQ1IDkxIDI4OFQ1MSA0MDRRNTEgNDUzIDY2IDQ5OVQxMTAgNTgyVDE3NyA2NDBUMjY0IDY2MlEzMDIgNjYyIDMzNSA2NDVUMzg2IDU5MlE0MDIgNjI2IDQyNyA2NDBUNDkxIDY1NVE1MTQgNjU1IDUyOSA2NDhUNTQ0IDYzNkw0ODYgMzYzUTQ3OCAzMjcgNDg0IDMxMVQ1MTAgMjg4UTUxMSAyODggNTA4IDI4MVQ0OTcgMjY2VDQ3MiAyNTJUNDI5IDI0NVEzODEgMjQ1IDM1OCAyNjhUMzMzIDMyOFEzMTMgMjkxIDI3OCAyNjhUMTk1IDI0NVpNMjYwIDM2NlEyOTIgMzY2IDMxNiAzODdUMzQ4IDQ0N0wzNTggNDk0UTM1MCA1MTYgMzM0IDUyOVQyOTIgNTQzUTI3MSA1NDMgMjU0IDUzNFQyMjYgNTA4VDIwOCA0NzJUMjAxIDQzMFEyMDEgNDAxIDIxNyAzODRUMjYwIDM2NlpNMTI2IDQ4UTEyNiA2NiAxMzIgOTFUMTU2IDEzM1ExNjcgMTQ0IDE4MCAxNDhUMjI4IDE1M1EyNjYgMTUzIDI4NCAxNDBUMzAyIDk2UTMwMiA3OCAyOTYgNTNUMjcyIDExUTI2MSAwIDI0OCAtNFQyMDAgLTlRMTYyIC05IDE0NCA0VDEyNiA0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90bGVmdCIgaG9yaXotYWR2LXg9IjU1NCIgZD0iTTgyIDE0NFE3MCAxNjIgNjAgMTgwVDQyIDIxNFQzMCAyNDFUMjYgMjU2UTI2IDI1OSAzMiAyNjlUNTEgMjk1VDc4IDMyN1QxMTIgMzYxUTE0NCAzOTAgMTc3IDQxMlQyNDAgNDM0UTI2OSA0MzQgMjg1IDQxOVQzMDIgMzc2UTMwMiAzNDkgMjgzIDMyNlQyMzIgMjgzUTIxNyAyNzIgMjAwIDI2M1QxNjIgMjQ1UTE3NSAyMzggMTg3IDIzMFQyMTEgMjEwUTIzNSAxODkgMjQ5IDE3MFQyNjQgMTMwUTI2NCAxMDEgMjQ0IDgzVDE5MiA2NFExNjAgNjQgMTMzIDg4VDgyIDE0NFpNMzE2IDE0MVEzMDUgMTU5IDI5NiAxNzZUMjgxIDIwOVQyNzIgMjM1VDI2OCAyNTBRMjY4IDI1MyAyNzUgMjY0VDI5NCAyOTBUMzIyIDMyMlQzNTcgMzU3UTM4OSAzODYgNDI0IDQwOVQ0ODkgNDMyUTUyMiA0MzIgNTM5IDQxN1Q1NTYgMzc0UTU1NiAzNDYgNTM1IDMyMlQ0ODEgMjc3UTQ0NiAyNTYgNDA3IDIzOVE0MTkgMjMxIDQyOSAyMjRUNDUwIDIwOFE0NzMgMTg5IDQ4NiAxNjlUNTAwIDEyOFE1MDAgOTkgNDgwIDgwVDQyMyA2MFEzOTEgNjAgMzY0IDg0VDMxNiAxNDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRTsiIGdseXBoLW5hbWU9InJlZ2lzdGVyZWQiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik01MiAzMjRRNTIgMzk3IDc2IDQ1OVQxNDYgNTY2VDI1MyA2MzZUMzkwIDY2MVE0NjUgNjYxIDUyNiA2MzZUNjMyIDU2N1Q3MDEgNDYwVDcyNiAzMjRRNzI2IDI1MCA3MDIgMTg4VDYzMyA4MVQ1MjYgMTFUMzg5IC0xNFEzMTQgLTE0IDI1MiAxMVQxNDYgODFUNzcgMTg4VDUyIDMyNFpNMTIzIDMyNFExMjMgMjY1IDE0MiAyMTZUMTk3IDEzMFQyODEgNzRUMzkwIDUzUTQ1MCA1MyA0OTggNzNUNTgyIDEyOVQ2MzYgMjE1VDY1NSAzMjRRNjU1IDM4MyA2MzYgNDMyVDU4MSA1MThUNDk3IDU3NFQzODkgNTk0UTMyOSA1OTQgMjgwIDU3NFQxOTYgNTE4VDE0MiA0MzNUMTIzIDMyNFpNMjM2IDQzOFEyMzYgNTAyIDI5NiA1MDJINDAzUTU1NyA1MDIgNTU3IDM4NFE1NTcgMzQ2IDUzOSAzMjFUNDg5IDI4M0w1NTkgMTgxUTU2MSAxNzggNTU2IDE3MlQ1NDEgMTU5VDUxOCAxNDdUNDkyIDE0MVE0NzUgMTQxIDQ1OCAxNTBUNDI2IDE4NUwzNzkgMjU3SDM1MlYxOThRMzUyIDE3MiAzNDAgMTU4VDMwMSAxNDRIMjg1UTI2MSAxNDQgMjQ5IDE2MlQyMzYgMjEyVjQzOFpNMzk1IDMzOFE0NDEgMzM4IDQ0MSAzNzZRNDQxIDQxNCAzOTMgNDE0SDM1MFYzMzhIMzk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUY7IiBnbHlwaC1uYW1lPSJvdmVyc2NvcmUiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0yMDAgNTQ2UTE2NyA1NDYgMTUwIDU1OVQxMzMgNTk1UTEzMyA2MDEgMTM0IDYxMFQxMzkgNjI5VDE0NiA2NDlUMTU4IDY2NlExNjggNjc1IDE4MCA2NzlUMjIxIDY4NEg0NTZRNDg5IDY4NCA1MDYgNjcxVDUyMyA2MzVRNTIzIDYyMyA1MTggNjAxVDQ5OCA1NjRRNDg4IDU1NCA0NzYgNTUwVDQzNSA1NDZIMjAwSDIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIwOyIgZ2x5cGgtbmFtZT0iZGVncmVlIiBob3Jpei1hZHYteD0iMzg0IiBkPSJNMjE4IDMzNlExODMgMzM2IDE1NSAzNDVUMTA1IDM3MlQ3MyA0MTVUNjEgNDcxUTYxIDUwNCA3MSA1MzdUMTA0IDU5N1QxNjIgNjQxVDI0NyA2NThRMjgxIDY1OCAzMTAgNjQ5VDM2MCA2MjJUMzkyIDU4MFQ0MDQgNTI0UTQwNCA0OTEgMzk0IDQ1OFQzNjEgMzk3VDMwMyAzNTNUMjE4IDMzNlpNMjI1IDQyNlEyNDIgNDI2IDI1NSA0MzVUMjc2IDQ1OVQyODkgNDg5VDI5MyA1MThRMjkzIDU0MyAyNzggNTU1VDI0MCA1NjhRMjIzIDU2OCAyMTAgNTU5VDE4OSA1MzZUMTc2IDUwNlQxNzIgNDc3UTE3MiA0NTIgMTg3IDQzOVQyMjUgNDI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjE7IiBnbHlwaC1uYW1lPSJwbHVzbWludXMiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik0yOTIgMjExUTI1OSAyMTEgMjQ0IDIzMlQyMzYgMjkxTDI0OSAzNTNIMTU3UTEyMyAzNTMgMTA2IDM2N1Q4OSA0MDVRODkgNDE5IDk0IDQzOFQxMTIgNDcwUTEyMiA0ODAgMTM2IDQ4NVQxNzUgNDkwSDI3OEwyOTggNTgxUTMwNiA2MTkgMzI2IDYzNlQzNzAgNjUzSDM4NlE0MjAgNjUzIDQzNSA2MzJUNDQyIDU3M0w0MjQgNDkwSDUxOVE1NTQgNDkwIDU3MCA0NzZUNTg3IDQzOFE1ODcgNDI0IDU4MiA0MDVUNTY1IDM3M1E1NTUgMzYzIDU0MSAzNThUNTAyIDM1M0gzOTVMMzgwIDI4NFEzNzIgMjQ2IDM1MiAyMjlUMzA5IDIxMUgyOTJaTTE4IDgyUTE4IDk2IDIzIDExNlQ0MSAxNDhRNTEgMTU4IDY1IDE2M1QxMDQgMTY4SDQ1MVE0ODYgMTY4IDUwMyAxNTRUNTIwIDExNlE1MjAgMTAyIDUxNSA4MlQ0OTcgNTBRNDg3IDQwIDQ3MyAzNVQ0MzQgMzBIODZRNTIgMzAgMzUgNDRUMTggODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMjsiIGdseXBoLW5hbWU9InR3b3N1cGVyaW9yIiBob3Jpei1hZHYteD0iMzM2IiBkPSJNNTEgMjg1UTE5IDI4NSAxMCAzMDNUNyAzNTNRMTIgMzgzIDIyIDQwNFQ0NyA0NDFRNjYgNDYxIDkwIDQ3MlQxNDAgNDkxUTE3NSA1MDEgMTk2IDUwOVQyMTcgNTM2UTIxNyA1NDcgMjA4IDU1NFQxODAgNTYxUTE1MyA1NjEgMTM3IDU0NVQxMTMgNTA4UTExMyA1MDggMTAyIDUwOFQ3NyA1MTJUNTIgNTI4VDQxIDU2MVE0MSA1NzggNDkgNTkyVDY5IDYxOFE4OCA2MzcgMTIxIDY0NlQxOTYgNjU2UTI2MSA2NTYgMzAwIDYyN1QzMzkgNTQ2UTMzOSA1MTYgMzI5IDQ5NlQzMDMgNDYyVDI2NSA0NDBUMjE5IDQyN1ExODcgNDE5IDE2MiA0MTFUMTIwIDM4N1ExMTggMzg1IDExNyAzODRUMTE0IDM4MEgyNTFRMzEyIDM4MCAzMTIgMzQwUTMxMiAzMzAgMzA5IDMyMFQzMDIgMzAzVDI5NSAyOTBUMjkwIDI4NUg1MUg1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIzOyIgZ2x5cGgtbmFtZT0idGhyZWVzdXBlcmlvciIgaG9yaXotYWR2LXg9IjMzNiIgZD0iTTE0OSAyNzhRMTAyIDI3OCA3MCAyODhUMjEgMzE1UTEwIDMyNiA2IDMzN1QyIDM2MVEyIDM4NSAxMyAzOTlUMzkgNDE5VDY0IDQyNVQ3NyA0MjNRODAgNDAwIDk3IDM4NlQxNDcgMzcxUTE3MSAzNzEgMTg1IDM4MFQyMDAgNDA2UTIwMCA0MjYgMTcxIDQyNkgxNjFRMTE4IDQyNiAxMTggNDYzUTExOCA0NzEgMTIxIDQ4MlQxMzIgNTAwUTE0MCA1MDkgMTUyIDUxMVQxODggNTE0SDIwMlEyMTUgNTE0IDIyMSA1MjBUMjI5IDUzNVEyMzAgNTQ3IDIxOCA1NTRUMTgyIDU2MlExNDggNTYyIDEzMyA1NDhUMTEyIDUxOFExMTIgNTE2IDEwMSA1MTZUNzggNTE5VDU1IDUzNVQ0NCA1NjdRNDQgNTgxIDQ5IDU5M1Q2NCA2MTRRODQgNjM0IDExNiA2NDVUMTkwIDY1NlEyNjUgNjU2IDMwNCA2MjlUMzQ0IDU1OVEzNDQgNTI3IDMyNSA1MDJUMjYwIDQ2OVEzMTUgNDQ2IDMxNSAzOTRRMzE1IDM3MSAzMDcgMzUxVDI3OSAzMTRUMjI4IDI4OFQxNDkgMjc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjQ7IiBnbHlwaC1uYW1lPSJhY3V0ZSIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTIzNSA1NjdRMjMyIDU3MyAyMzkgNTk0VDI2MiA2MzlUMzAwIDY4OFQzNDggNzI3UTM3NSA3NDIgNDA4IDc0MlE0NDQgNzQyIDQ2NiA3MThUNDg4IDY2MVE0ODggNjM3IDQ3MiA2MTRUNDI5IDU3NlEzOTYgNTU4IDM2MyA1NTJUMzAzIDU0N1QyNTcgNTU1VDIzNSA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGdseXBoLW5hbWU9InBhcmFncmFwaCIgaG9yaXotYWR2LXg9IjYxNyIgZD0iTTU0MiA1OTlRNTQ3IDYyNSA1NTkgNjM2VDU5NSA2NDhINjExUTYzNCA2NDggNjQ0IDYzNVQ2NDkgNTk1TDUzMyA0NVE1MjcgMTkgNTE1IDhUNDc4IC00SDQ2M1E0NDAgLTQgNDMwIDlUNDI1IDQ5TDU0MiA1OTlaTTMxMSAyNjVIMjcxUTE2MiAyNjUgMTA3IDMwNVQ1MiA0MjdRNTIgNDc1IDY4IDUxNVQxMTYgNTg1VDE5NiA2MzBUMzA5IDY0N0g0MzdRNDY1IDY0NyA0NzkgNjMxVDQ4NyA1ODVMMzcyIDQ1UTM2NyAxOSAzNTQgOFQzMTggLTRIMzAzUTI4MCAtNCAyNzAgOVQyNjUgNDlMMzExIDI2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI3OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjYyIiBkPSJNMTE1IDE1OFE3MyAxNTggNTQgMTczVDM0IDIyMVEzNCAyNDEgNDEgMjY5VDY2IDMxNVE3MiAzMjEgNzggMzI1VDk0IDMzMlQxMTUgMzM2VDE0NyAzMzdRMTg5IDMzNyAyMDggMzIyVDIyOCAyNzRRMjI4IDI1NCAyMjEgMjI3VDE5NiAxODBRMTg0IDE2OCAxNjggMTYzVDExNSAxNThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCODsiIGdseXBoLW5hbWU9ImNlZGlsbGEiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0xMzkgLTM5UTE0MCAtMzggMTU5IC0zOFQyMDIgLTQzVDI0NSAtNjJUMjY1IC0xMDBRMjY1IC0xMjUgMjUwIC0xNDJUMjA0IC0xNzlMMTIwIC0yMzRRMTEyIC0yNDAgOTcgLTIzOFQ2OSAtMjI5VDQ5IC0yMTFUNTAgLTE4NkwxMzkgLTM5SDEzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI5OyIgZ2x5cGgtbmFtZT0ib25lc3VwZXJpb3IiIGhvcml6LWFkdi14PSIzMzYiIGQ9Ik02MyAyODZRMzggMjg2IDI1IDI5NlQxMyAzMjRRMTMgMzMyIDE3IDM0OFQzMSAzNzRRMzggMzgyIDQ3IDM4NVQ3OSAzODlIMTE1TDE0NiA1MTlRMTI2IDUwNSAxMDQgNTA1UTc4IDUwNSA2NiA1MTlUNTMgNTU3UTUzIDU3NiA1OSA1ODlUNzIgNjExVDg1IDYyM1Q5MiA2MjdRMTExIDYxMSAxMzkgNjExUTE1NiA2MTEgMTcwIDYyMlQxOTQgNjUzSDIzOFEyOTQgNjUzIDI3OSA1OTRMMjI5IDM4OUgyNjBRMjg0IDM4OSAyOTcgMzc5VDMxMCAzNTFRMzEwIDM0MyAzMDYgMzI3VDI5MSAzMDBRMjg1IDI5MiAyNzUgMjg5VDI0MyAyODZINjNINjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQTsiIGdseXBoLW5hbWU9Im9yZG1hc2N1bGluZSIgaG9yaXotYWR2LXg9IjQ1OCIgZD0iTTI0OSAyNDRRMjAwIDI0NCAxNjQgMjU4VDEwMyAyOTdUNjcgMzU1VDU1IDQyNlE1NSA0NzEgNjkgNTEzVDExMiA1ODhUMTgzIDY0MVQyNzkgNjYxUTMyOCA2NjEgMzY1IDY0N1Q0MjYgNjA4VDQ2MyA1NTBUNDc1IDQ4MFE0NzUgNDM1IDQ2MCAzOTNUNDE3IDMxN1QzNDYgMjY0VDI0OSAyNDRaTTI1MyAzNTlRMjc0IDM1OSAyOTEgMzY5VDMyMCAzOTVUMzM4IDQzMVQzNDUgNDc0UTM0NSA1MDUgMzI2IDUyNlQyNzYgNTQ3UTI1NSA1NDcgMjM4IDUzN1QyMTAgNTExVDE5MiA0NzVUMTg1IDQzMlExODUgNDAwIDIwNCAzODBUMjUzIDM1OVpNOTUgNDhROTUgNjYgMTAxIDkxVDEyNSAxMzNRMTM2IDE0NCAxNDkgMTQ4VDE5NyAxNTNRMjM1IDE1MyAyNTMgMTQwVDI3MSA5NlEyNzEgNzggMjY1IDUzVDI0MSAxMVEyMzAgMCAyMTcgLTRUMTY5IC05UTEzMSAtOSAxMTMgNFQ5NSA0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90cmlnaHQiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik02NCA2MVEzMSA2MSAxNCA3NlQtNCAxMTlRLTQgMTQ3IDE3IDE3MVQ3MSAyMTZRODggMjI2IDEwNiAyMzVUMTQ2IDI1NFExMzEgMjYyIDExNyAyNzJUOTEgMjk0UTcyIDMxMyA2MyAzMzBUNTMgMzY1UTUzIDM5NCA3MyA0MTNUMTMwIDQzM1ExNjIgNDMzIDE4OSA0MDlUMjM3IDM1MlEyNDggMzM0IDI1NyAzMTdUMjcyIDI4NFQyODEgMjU4VDI4NSAyNDNRMjg1IDI0MCAyNzggMjI5VDI1OSAyMDNUMjMwIDE3MVQxOTYgMTM2UTE2NCAxMDYgMTI5IDg0VDY0IDYxWk0yNTAgMTE3UTI1MCAxNDMgMjY4IDE2NVQzMTYgMjA3UTMzMiAyMTggMzUxIDIyOFQzOTEgMjQ4UTM1OCAyNjYgMzI5IDI5NVEzMTAgMzE1IDMwMCAzMzFUMjg5IDM2M1EyODkgMzkyIDMwOCA0MTBUMzYxIDQyOVEzOTMgNDI5IDQyMCA0MDVUNDcwIDM0OVE0ODMgMzMxIDQ5MyAzMTNUNTEwIDI3OVQ1MjIgMjUyVDUyNiAyMzdRNTI2IDIzNCA1MjAgMjI0VDUwMiAxOThUNDc0IDE2NlQ0NDAgMTMyUTQwOSAxMDMgMzc2IDgxVDMxMyA1OVEyODQgNTkgMjY3IDc0VDI1MCAxMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGdseXBoLW5hbWU9Im9uZXF1YXJ0ZXIiIGhvcml6LWFkdi14PSI3OTIiIGQ9Ik02MyAyODZRMzggMjg2IDI1IDI5NlQxMyAzMjRRMTMgMzMyIDE3IDM0OFQzMSAzNzRRMzggMzgyIDQ3IDM4NVQ3OSAzODlIMTE1TDE0NiA1MTlRMTI2IDUwNSAxMDQgNTA1UTc4IDUwNSA2NiA1MTlUNTMgNTU3UTUzIDU3NiA1OSA1ODlUNzIgNjExVDg1IDYyM1Q5MiA2MjdRMTExIDYxMSAxMzkgNjExUTE1NiA2MTEgMTcwIDYyMlQxOTQgNjUzSDIzOFEyOTQgNjUzIDI3OSA1OTRMMjI5IDM4OUgyNjBRMjg0IDM4OSAyOTcgMzc5VDMxMCAzNTFRMzEwIDM0MyAzMDYgMzI3VDI5MSAzMDBRMjg1IDI5MiAyNzUgMjg5VDI0MyAyODZINjNaTTgwIDIyUTg0IDM0IDkxIDQ1VDExNSA3MlExMTcgNzQgMTQyIDk4VDIwNCAxNTdUMjg0IDIzM1QzNjYgMzEyUTM4NSAzMzEgNDA5IDM1NVQ0NjEgNDA1VDUxNyA0NThUNTczIDUxMlE2MzYgNTczIDcwNCA2MzhRNzA3IDY0MSA3MTYgNjM5VDczMyA2MzBUNzQ3IDYxMlQ3NDggNTg0UTc0NiA1NzMgNzM5IDU2MVQ3MTUgNTM0UTcxMyA1MzIgNjg4IDUwOFQ2MjUgNDQ5VDU0NSAzNzFUNDY0IDI5MlE0NDQgMjczIDQyMCAyNDlUMzY4IDE5OVQzMTIgMTQ1VDI1NyA5MVExOTUgMzAgMTI3IC0zNFExMjMgLTM3IDExNCAtMzVUOTYgLTI1VDgyIC02VDgwIDIyWk00NjcgMTM5UTQ2NyAxNTcgNDc3IDE3NFQ1MDggMjE5TDU5MSAzMjhRNjAwIDM0MCA2MDggMzQ3VDYyNiAzNTlUNjUxIDM2NlQ2ODggMzY4UTczNyAzNjggNzU3IDM1MVQ3NjYgMjg2TDc0MSAxNjdINzUwUTc3MSAxNjcgNzgyIDE1OFQ3OTMgMTM1UTc5MyAxMjcgNzkwIDExM1Q3NzcgODlRNzcxIDgzIDc2MyA4MFQ3MzYgNzdINzIyTDcxNyA1M1E3MTAgMjAgNjk4IDhUNjY2IC01SDY1MVE2NDAgLTUgNjMxIC0yVDYxNCA3VDYwNSAyNVQ2MDYgNTRMNjExIDc3SDUwMlE1MDAgNzcgNDk0IDgxVDQ4MiA5NFQ0NzIgMTEzVDQ2NyAxMzlaTTYzNiAxNjRMNjYzIDI5MUw1NjMgMTY0SDYzNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJEOyIgZ2x5cGgtbmFtZT0ib25laGFsZiIgaG9yaXotYWR2LXg9Ijc5MiIgZD0iTTYzIDI4NlEzOCAyODYgMjUgMjk2VDEzIDMyNFExMyAzMzIgMTcgMzQ4VDMxIDM3NFEzOCAzODIgNDcgMzg1VDc5IDM4OUgxMTVMMTQ2IDUxOVExMjYgNTA1IDEwNCA1MDVRNzggNTA1IDY2IDUxOVQ1MyA1NTdRNTMgNTc2IDU5IDU4OVQ3MiA2MTFUODUgNjIzVDkyIDYyN1ExMTEgNjExIDEzOSA2MTFRMTU2IDYxMSAxNzAgNjIyVDE5NCA2NTNIMjM4UTI5NCA2NTMgMjc5IDU5NEwyMjkgMzg5SDI2MFEyODQgMzg5IDI5NyAzNzlUMzEwIDM1MVEzMTAgMzQzIDMwNiAzMjdUMjkxIDMwMFEyODUgMjkyIDI3NSAyODlUMjQzIDI4Nkg2M1pNNTggMjJRNjIgMzQgNjkgNDVUOTMgNzJROTUgNzQgMTIwIDk4VDE4MiAxNTdUMjYyIDIzM1QzNDQgMzEyUTM2MyAzMzEgMzg3IDM1NVQ0MzkgNDA1VDQ5NSA0NThUNTUxIDUxMlE2MTQgNTczIDY4MiA2MzhRNjg1IDY0MSA2OTQgNjM5VDcxMSA2MzBUNzI1IDYxMlQ3MjYgNTg0UTcyNCA1NzMgNzE3IDU2MVQ2OTMgNTM0UTY5MSA1MzIgNjY2IDUwOFQ2MDMgNDQ5VDUyMyAzNzFUNDQyIDI5MlE0MjIgMjczIDM5OCAyNDlUMzQ2IDE5OVQyOTAgMTQ1VDIzNSA5MVExNzMgMzAgMTA1IC0zNFExMDEgLTM3IDkyIC0zNVQ3NCAtMjVUNjAgLTZUNTggMjJaTTQ2MyA2OFE0NjggOTggNDc4IDExOVQ1MDMgMTU2UTUyMiAxNzYgNTQ2IDE4N1Q1OTYgMjA2UTYzMSAyMTYgNjUyIDIyNFQ2NzMgMjUxUTY3MyAyNjIgNjY0IDI2OVQ2MzYgMjc2UTYwOSAyNzYgNTkzIDI2MFQ1NjkgMjIzUTU2OSAyMjMgNTU4IDIyM1Q1MzMgMjI3VDUwOCAyNDNUNDk3IDI3NlE0OTcgMjkzIDUwNSAzMDdUNTI1IDMzM1E1NDQgMzUyIDU3NyAzNjFUNjUyIDM3MVE3MTcgMzcxIDc1NiAzNDJUNzk1IDI2MVE3OTUgMjMxIDc4NSAyMTFUNzU5IDE3N1Q3MjEgMTU1VDY3NSAxNDJRNjQzIDEzNCA2MTggMTI2VDU3NiAxMDJRNTc0IDEwMCA1NzMgOTlUNTcwIDk1SDcwN1E3NjggOTUgNzY4IDU1UTc2OCA0NSA3NjUgMzVUNzU4IDE4VDc1MSA1VDc0NiAwSDUwN1E0NzUgMCA0NjYgMThUNDYzIDY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBnbHlwaC1uYW1lPSJ0aHJlZXF1YXJ0ZXJzIiBob3Jpei1hZHYteD0iNzkyIiBkPSJNMTQ5IDI3OFExMDIgMjc4IDcwIDI4OFQyMSAzMTVRMTAgMzI2IDYgMzM3VDIgMzYxUTIgMzg1IDEzIDM5OVQzOSA0MTlUNjQgNDI1VDc3IDQyM1E4MCA0MDAgOTcgMzg2VDE0NyAzNzFRMTcxIDM3MSAxODUgMzgwVDIwMCA0MDZRMjAwIDQyNiAxNzEgNDI2SDE2MVExMTggNDI2IDExOCA0NjNRMTE4IDQ3MSAxMjEgNDgyVDEzMiA1MDBRMTQwIDUwOSAxNTIgNTExVDE4OCA1MTRIMjAyUTIxNSA1MTQgMjIxIDUyMFQyMjkgNTM1UTIzMCA1NDcgMjE4IDU1NFQxODIgNTYyUTE0OCA1NjIgMTMzIDU0OFQxMTIgNTE4UTExMiA1MTYgMTAxIDUxNlQ3OCA1MTlUNTUgNTM1VDQ0IDU2N1E0NCA1ODEgNDkgNTkzVDY0IDYxNFE4NCA2MzQgMTE2IDY0NVQxOTAgNjU2UTI2NSA2NTYgMzA0IDYyOVQzNDQgNTU5UTM0NCA1MjcgMzI1IDUwMlQyNjAgNDY5UTMxNSA0NDYgMzE1IDM5NFEzMTUgMzcxIDMwNyAzNTFUMjc5IDMxNFQyMjggMjg4VDE0OSAyNzhaTTY1IDIyUTY5IDM0IDc2IDQ1VDEwMCA3MlExMDIgNzQgMTI3IDk4VDE4OSAxNTdUMjY5IDIzM1QzNTEgMzEyUTM3MCAzMzEgMzk0IDM1NVQ0NDYgNDA1VDUwMiA0NThUNTU4IDUxMlE2MjEgNTczIDY4OSA2MzhRNjkyIDY0MSA3MDEgNjM5VDcxOCA2MzBUNzMyIDYxMlQ3MzMgNTg0UTczMSA1NzMgNzI0IDU2MVQ3MDAgNTM0UTY5OCA1MzIgNjczIDUwOFQ2MTAgNDQ5VDUzMCAzNzFUNDQ5IDI5MlE0MjkgMjczIDQwNSAyNDlUMzUzIDE5OVQyOTcgMTQ1VDI0MiA5MVExODAgMzAgMTEyIC0zNFExMDggLTM3IDk5IC0zNVQ4MSAtMjVUNjcgLTZUNjUgMjJaTTQ2NyAxMzlRNDY3IDE1NyA0NzcgMTc0VDUwOCAyMTlMNTkxIDMyOFE2MDAgMzQwIDYwOCAzNDdUNjI2IDM1OVQ2NTEgMzY2VDY4OCAzNjhRNzM3IDM2OCA3NTcgMzUxVDc2NiAyODZMNzQxIDE2N0g3NTBRNzcxIDE2NyA3ODIgMTU4VDc5MyAxMzVRNzkzIDEyNyA3OTAgMTEzVDc3NyA4OVE3NzEgODMgNzYzIDgwVDczNiA3N0g3MjJMNzE3IDUzUTcxMCAyMCA2OTggOFQ2NjYgLTVINjUxUTY0MCAtNSA2MzEgLTJUNjE0IDdUNjA1IDI1VDYwNiA1NEw2MTEgNzdINTAyUTUwMCA3NyA0OTQgODFUNDgyIDk0VDQ3MiAxMTNUNDY3IDEzOVpNNjM2IDE2NEw2NjMgMjkxTDU2MyAxNjRINjM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkY7IiBnbHlwaC1uYW1lPSJxdWVzdGlvbmRvd24iIGhvcml6LWFkdi14PSI1MjIiIGQ9Ik0zMzEgNDc2UTI4OSA0NzYgMjY5IDQ5MVQyNDkgNTQwUTI0OSA1NjAgMjU2IDU4N1QyODIgNjM0UTI4OCA2NDAgMjk0IDY0NFQzMDkgNjUwVDMzMCA2NTRUMzYyIDY1NlE0MDQgNjU2IDQyNCA2NDFUNDQ0IDU5MlE0NDQgNTcyIDQzNyA1NDVUNDExIDQ5OFE0MDAgNDg3IDM4NCA0ODJUMzMxIDQ3NlpNMyAxNjdRMyAyMTUgMTkgMjQ1VDYwIDI5NFQxMTQgMzIzVDE2OSAzNDJRMjA0IDM1MyAyMjggMzcyVDI2OCA0MzRINDE5UTQxMSAzNTMgMzc5IDMxMFQyODUgMjQ1UTI2MCAyMzcgMjQ0IDIzMVQyMTkgMjE4VDIwNyAyMDRUMjAzIDE4NlEyMDMgMTYzIDIyMSAxNTJUMjY2IDE0MVEzMTEgMTQxIDM0MyAxNjJUMzkwIDIyMVEzOTAgMjIxIDQwNSAyMTlUNDM4IDIwN1Q0NzIgMTgxVDQ4NyAxMzdRNDg3IDg3IDQ1MCA1MlE0MTggMjAgMzcwIDNUMjUzIC0xNFExOTcgLTE0IDE1MSAtMVQ3MiAzNlQyMSA5M1QzIDE2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMwOyIgZ2x5cGgtbmFtZT0iQWdyYXZlIiBob3Jpei1hZHYteD0iNjkyIiBkPSJNMjkwIDU5N1EyOTggNjEwIDMwOCA2MjBUMzMzIDYzOFQzNjkgNjQ5VDQyMCA2NTNRNDUzIDY1MyA0NzQgNjQ5VDUwOSA2MzdUNTI5IDYxOVQ1MzkgNTk2TDY0OSAwSDQ0NUw0MjUgMTM0SDIxN0wxNDQgMEgtNjRMMjkwIDU5N1pNNDE5IDI3OEwzODggNDY0TDI3OSAyNzhINDE5Wk0yOTcgNzM0UTI3MSA3NDkgMjU2IDc3MlQyNDEgODE5UTI0MSA4NTMgMjYzIDg3NlQzMjIgOTAwUTM1NCA5MDAgMzgxIDg4NFE0MDYgODY5IDQyNiA4NDRUNDYxIDc5NFQ0ODIgNzQ5VDQ4NSA3MjJRNDgxIDcxNiA0NjMgNzEwVDQxOSA3MDNUMzYwIDcwOVQyOTcgNzM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzE7IiBnbHlwaC1uYW1lPSJBYWN1dGUiIGhvcml6LWFkdi14PSI2OTIiIGQ9Ik0yOTAgNTk3UTI5OCA2MTAgMzA4IDYyMFQzMzMgNjM4VDM2OSA2NDlUNDIwIDY1M1E0NTMgNjUzIDQ3NCA2NDlUNTA5IDYzN1Q1MjkgNjE5VDUzOSA1OTZMNjQ5IDBINDQ1TDQyNSAxMzRIMjE3TDE0NCAwSC02NEwyOTAgNTk3Wk00MTkgMjc4TDM4OCA0NjRMMjc5IDI3OEg0MTlaTTM0NyA3MjJRMzQ0IDcyOCAzNTEgNzQ5VDM3NCA3OTRUNDEyIDg0M1Q0NjAgODgyUTQ4NyA4OTcgNTIwIDg5N1E1NTYgODk3IDU3OCA4NzNUNjAwIDgxNlE2MDAgNzkyIDU4NCA3NjlUNTQxIDczMVE1MDggNzEzIDQ3NSA3MDdUNDE1IDcwMlQzNjkgNzEwVDM0NyA3MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMjsiIGdseXBoLW5hbWU9IkFjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjkyIiBkPSJNMjkwIDU5N1EyOTggNjEwIDMwOCA2MjBUMzMzIDYzOFQzNjkgNjQ5VDQyMCA2NTNRNDUzIDY1MyA0NzQgNjQ5VDUwOSA2MzdUNTI5IDYxOVQ1MzkgNTk2TDY0OSAwSDQ0NUw0MjUgMTM0SDIxN0wxNDQgMEgtNjRMMjkwIDU5N1pNNDE5IDI3OEwzODggNDY0TDI3OSAyNzhINDE5Wk0zMjYgNjk2UTI5OSA2OTYgMjg0IDcxM1QyNjkgNzUzUTI2OSA3NzkgMjg2IDgwM1QzMzMgODQ5UTM2MyA4NzEgMzk4IDg4NlQ0NjUgOTA5UTQ4MyA5MDMgNTA3IDg4N1Q1NTMgODQ5UTU3MyA4MjggNTg2IDgwNlQ1OTkgNzYzUTU5OSA3MzQgNTgxIDcxNVQ1MzMgNjk2UTUwOSA2OTYgNDg5IDcxMVQ0NTUgNzU0UTQ1MiA3NjEgNDQ5IDc2OVQ0NDIgNzg2UTQzNiA3NzggNDMxIDc3MFQ0MTggNzU0UTM5OCA3MjYgMzc2IDcxMVQzMjYgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzM7IiBnbHlwaC1uYW1lPSJBdGlsZGUiIGhvcml6LWFkdi14PSI2OTIiIGQ9Ik0yOTAgNTk3UTI5OCA2MTAgMzA4IDYyMFQzMzMgNjM4VDM2OSA2NDlUNDIwIDY1M1E0NTMgNjUzIDQ3NCA2NDlUNTA5IDYzN1Q1MjkgNjE5VDUzOSA1OTZMNjQ5IDBINDQ1TDQyNSAxMzRIMjE3TDE0NCAwSC02NEwyOTAgNTk3Wk00MTkgMjc4TDM4OCA0NjRMMjc5IDI3OEg0MTlaTTMwNiA2OTdRMjgxIDY5NyAyNjcgNzEyVDI1MSA3NDhRMjUyIDc3NyAyNjIgODAwVDI4OCA4MzlUMzI2IDg2M1QzNjkgODcyUTM5NSA4NzIgNDE0IDg2NVQ0NDcgODQ3UTQ2NCA4MzYgNDczIDgyOFQ0OTAgODIwUTUwMCA4MjAgNTA3IDgyOVQ1MjMgODUwUTUzMSA4NjEgNTQwIDg2NVQ1NjQgODY5UTU4OSA4NjkgNjAzIDg1NFQ2MTkgODE4UTYxOCA3ODkgNjA4IDc2N1Q1ODIgNzI4VDU0NCA3MDRUNTAxIDY5NVE0NzQgNjk1IDQ1NiA3MDNUNDI1IDcyMFE0MDggNzMzIDQwMCA3NDNUMzgwIDc1NFEzNzAgNzU0IDM2NSA3NDRUMzUyIDcxOVEzNDYgNzA5IDMzNiA3MDNUMzA2IDY5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM0OyIgZ2x5cGgtbmFtZT0iQWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjkyIiBkPSJNMjkwIDU5N1EyOTggNjEwIDMwOCA2MjBUMzMzIDYzOFQzNjkgNjQ5VDQyMCA2NTNRNDUzIDY1MyA0NzQgNjQ5VDUwOSA2MzdUNTI5IDYxOVQ1MzkgNTk2TDY0OSAwSDQ0NUw0MjUgMTM0SDIxN0wxNDQgMEgtNjRMMjkwIDU5N1pNNDE5IDI3OEwzODggNDY0TDI3OSAyNzhINDE5Wk01NTQgNjk2UTUxMSA2OTYgNDkwIDcxN1Q0NjggNzcwUTQ2OCA4MTYgNDk2IDg0M1Q1NjQgODcxUTYwNyA4NzEgNjI4IDg1MFQ2NDkgNzk2UTY0OSA3NTEgNjIxIDcyNFQ1NTQgNjk2Wk0zMjggNjk2UTI4NSA2OTYgMjY0IDcxN1QyNDMgNzcwUTI0MyA4MTYgMjcxIDg0M1QzMzggODcxUTM4MSA4NzEgNDAyIDg1MFQ0MjQgNzk2UTQyNCA3NTEgMzk2IDcyNFQzMjggNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzU7IiBnbHlwaC1uYW1lPSJBcmluZyIgaG9yaXotYWR2LXg9IjY5MiIgZD0iTTI4NiA1OTBRMjk2IDYwNiAzMDkgNjE3VDM0NCA2MzZRMzA5IDY2NSAzMDkgNzEzUTMwOSA3NDAgMzE5IDc2NVQzNDcgODA5VDM5MiA4MzlUNDQ5IDg1MFE1MDcgODUwIDU0MSA4MjFUNTc1IDc0NVE1NzUgNzA5IDU1OCA2NzhUNTEwIDYyOFE1MjQgNjIwIDUzMSA2MTBUNTQwIDU4OEw2NDkgMEg0NDVMNDI1IDEzNEgyMTdMMTQ0IDBILTY0TDI4NiA1OTBaTTQzNyA2NzZRNDYwIDY3NiA0NzQgNjkzVDQ4OSA3MzFRNDg5IDc0OSA0NzggNzYxVDQ0NyA3NzNRNDI0IDc3MyA0MTAgNzU2VDM5NSA3MThRMzk1IDcwMCA0MDYgNjg4VDQzNyA2NzZaTTQxOSAyNzhMMzg4IDQ2NEwyNzkgMjc4SDQxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM2OyIgZ2x5cGgtbmFtZT0iQUUiIGhvcml6LWFkdi14PSI4OTUiIGQ9Ik0tNSA3N1EtNSAxMDMgNCAxMjNUMzUgMTc5TDI4MyA1ODVRMjkyIDYwMCAzMDIgNjExVDMyOCA2MzFUMzY0IDY0M1Q0MTQgNjQ3SDkyOUw4OTIgNDc1SDU1Nkw1NzEgNDA1SDgwNkw3NzUgMjUwSDU5OEw2MTMgMTY4SDgzNEw3OTggMEg1NDFRNDg4IDAgNDY0IDE5VDQzMyA4NUw0MjUgMTM0SDIxN0wxMzkgLTEwUTEzOCAtMTIgMTE2IC0xMlQ2NiAtM1QxNyAyNFQtNSA3N1pNNDE5IDI3OEwzODcgNDY0TDI3OSAyNzhINDE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzc7IiBnbHlwaC1uYW1lPSJDY2VkaWxsYSIgaG9yaXotYWR2LXg9IjY0NyIgZD0iTTQwIDI3N1E0MCAzNTMgNjcgNDIzVDE0NCA1NDVUMjYxIDYyOVQ0MTEgNjYxUTQ5NiA2NjEgNTQ2IDY0MFQ2MjYgNTkwUTY0NyA1NjkgNjU2IDU0NlQ2NjYgNTA2UTY2NiA0NjcgNjQ2IDQ0NFQ2MDIgNDEwVDU1NyAzOTdUNTM1IDM5N1E1MTkgNDM1IDQ5MCA0NTdUNDE1IDQ3OVEzNzkgNDc5IDM0OSA0NjVUMjk2IDQyNlQyNjAgMzY4VDI0NyAyOThRMjQ3IDI0MSAyODIgMjA1VDM3MyAxNjhRNDU4IDE2OCA1MDQgMjM2UTUwNSAyMzggNTIxIDIzNVQ1NTUgMjIwVDU4OSAxOTBUNjA0IDE0MlE2MDQgMTAzIDU2NCA2M1E1MzIgMzEgNDc5IDlUMzU4IC0xM1EyODUgLTEzIDIyNiA3VDEyNiA2NVQ2MyAxNTdUNDAgMjc3Wk0yNjUgLTM5UTI2NiAtMzggMjg1IC0zOFQzMjggLTQzVDM3MSAtNjJUMzkxIC0xMDBRMzkxIC0xMjUgMzc2IC0xNDJUMzMwIC0xNzlMMjQ2IC0yMzRRMjM4IC0yNDAgMjIzIC0yMzhUMTk1IC0yMjlUMTc1IC0yMTFUMTc2IC0xODZMMjY1IC0zOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM4OyIgZ2x5cGgtbmFtZT0iRWdyYXZlIiBob3Jpei1hZHYteD0iNjE2IiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0g2NTBMNjE1IDQ4MUgyOTRMMjc4IDQwM0g1MjdMNDk3IDI1MkgyNDdMMjI4IDE2OEg1NTVMNTE5IDBILTlMMTA5IDU0OFpNMzA5IDczNFEyODMgNzQ5IDI2OCA3NzJUMjUzIDgxOVEyNTMgODUzIDI3NSA4NzZUMzM0IDkwMFEzNjYgOTAwIDM5MyA4ODRRNDE4IDg2OSA0MzggODQ0VDQ3MyA3OTRUNDk0IDc0OVQ0OTcgNzIyUTQ5MyA3MTYgNDc1IDcxMFQ0MzEgNzAzVDM3MiA3MDlUMzA5IDczNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM5OyIgZ2x5cGgtbmFtZT0iRWFjdXRlIiBob3Jpei1hZHYteD0iNjE2IiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0g2NTBMNjE1IDQ4MUgyOTRMMjc4IDQwM0g1MjdMNDk3IDI1MkgyNDdMMjI4IDE2OEg1NTVMNTE5IDBILTlMMTA5IDU0OFpNMzE1IDcyMlEzMTIgNzI4IDMxOSA3NDlUMzQyIDc5NFQzODAgODQzVDQyOCA4ODJRNDU1IDg5NyA0ODggODk3UTUyNCA4OTcgNTQ2IDg3M1Q1NjggODE2UTU2OCA3OTIgNTUyIDc2OVQ1MDkgNzMxUTQ3NiA3MTMgNDQzIDcwN1QzODMgNzAyVDMzNyA3MTBUMzE1IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgZ2x5cGgtbmFtZT0iRWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MTYiIGQ9Ik0xMDkgNTQ4UTEyMCA2MDEgMTUxIDYyNFQyMzEgNjQ3SDY1MEw2MTUgNDgxSDI5NEwyNzggNDAzSDUyN0w0OTcgMjUySDI0N0wyMjggMTY4SDU1NUw1MTkgMEgtOUwxMDkgNTQ4Wk0zMDIgNjk2UTI3NSA2OTYgMjYwIDcxM1QyNDUgNzUzUTI0NSA3NzkgMjYyIDgwM1QzMDkgODQ5UTMzOSA4NzEgMzc0IDg4NlQ0NDEgOTA5UTQ1OSA5MDMgNDgzIDg4N1Q1MjkgODQ5UTU0OSA4MjggNTYyIDgwNlQ1NzUgNzYzUTU3NSA3MzQgNTU3IDcxNVQ1MDkgNjk2UTQ4NSA2OTYgNDY1IDcxMVQ0MzEgNzU0UTQyOCA3NjEgNDI1IDc2OVQ0MTggNzg2UTQxMiA3NzggNDA3IDc3MFQzOTQgNzU0UTM3NCA3MjYgMzUyIDcxMVQzMDIgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0I7IiBnbHlwaC1uYW1lPSJFZGllcmVzaXMiIGhvcml6LWFkdi14PSI2MTYiIGQ9Ik0xMDkgNTQ4UTEyMCA2MDEgMTUxIDYyNFQyMzEgNjQ3SDY1MEw2MTUgNDgxSDI5NEwyNzggNDAzSDUyN0w0OTcgMjUySDI0N0wyMjggMTY4SDU1NUw1MTkgMEgtOUwxMDkgNTQ4Wk01MjEgNjk2UTQ3OCA2OTYgNDU3IDcxN1Q0MzUgNzcwUTQzNSA4MTYgNDYzIDg0M1Q1MzEgODcxUTU3NCA4NzEgNTk1IDg1MFQ2MTYgNzk2UTYxNiA3NTEgNTg4IDcyNFQ1MjEgNjk2Wk0yOTUgNjk2UTI1MiA2OTYgMjMxIDcxN1QyMTAgNzcwUTIxMCA4MTYgMjM4IDg0M1QzMDUgODcxUTM0OCA4NzEgMzY5IDg1MFQzOTEgNzk2UTM5MSA3NTEgMzYzIDcyNFQyOTUgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0M7IiBnbHlwaC1uYW1lPSJJZ3JhdmUiIGhvcml6LWFkdi14PSIzMDQiIGQ9Ik0xMTggNTYxUTEyOSA2MDggMTUxIDYzMFQyMTcgNjUySDI0N1EyODggNjUyIDMwOSA2MjhUMzE5IDU1N0wyMDAgMEgtMUwxMTggNTYxWk0xMjkgNzM0UTEwMyA3NDkgODggNzcyVDczIDgxOVE3MyA4NTMgOTUgODc2VDE1NCA5MDBRMTg2IDkwMCAyMTMgODg0UTIzOCA4NjkgMjU4IDg0NFQyOTMgNzk0VDMxNCA3NDlUMzE3IDcyMlEzMTMgNzE2IDI5NSA3MTBUMjUxIDcwM1QxOTIgNzA5VDEyOSA3MzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRDsiIGdseXBoLW5hbWU9IklhY3V0ZSIgaG9yaXotYWR2LXg9IjMwNCIgZD0iTTExOCA1NjFRMTI5IDYwOCAxNTEgNjMwVDIxNyA2NTJIMjQ3UTI4OCA2NTIgMzA5IDYyOFQzMTkgNTU3TDIwMCAwSC0xTDExOCA1NjFaTTE3MiA3MjJRMTY5IDcyOCAxNzYgNzQ5VDE5OSA3OTRUMjM3IDg0M1QyODUgODgyUTMxMiA4OTcgMzQ1IDg5N1EzODEgODk3IDQwMyA4NzNUNDI1IDgxNlE0MjUgNzkyIDQwOSA3NjlUMzY2IDczMVEzMzMgNzEzIDMwMCA3MDdUMjQwIDcwMlQxOTQgNzEwVDE3MiA3MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRTsiIGdseXBoLW5hbWU9IkljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMzA0IiBkPSJNMTE4IDU2MVExMjkgNjA4IDE1MSA2MzBUMjE3IDY1MkgyNDdRMjg4IDY1MiAzMDkgNjI4VDMxOSA1NTdMMjAwIDBILTFMMTE4IDU2MVpNMTQ1IDY5NlExMTggNjk2IDEwMyA3MTNUODggNzUzUTg4IDc3OSAxMDUgODAzVDE1MiA4NDlRMTgyIDg3MSAyMTcgODg2VDI4NCA5MDlRMzAyIDkwMyAzMjYgODg3VDM3MiA4NDlRMzkyIDgyOCA0MDUgODA2VDQxOCA3NjNRNDE4IDczNCA0MDAgNzE1VDM1MiA2OTZRMzI4IDY5NiAzMDggNzExVDI3NCA3NTRRMjcxIDc2MSAyNjggNzY5VDI2MSA3ODZRMjU1IDc3OCAyNTAgNzcwVDIzNyA3NTRRMjE3IDcyNiAxOTUgNzExVDE0NSA2OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRjsiIGdseXBoLW5hbWU9IklkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjMwNCIgZD0iTTExOCA1NjFRMTI5IDYwOCAxNTEgNjMwVDIxNyA2NTJIMjQ3UTI4OCA2NTIgMzA5IDYyOFQzMTkgNTU3TDIwMCAwSC0xTDExOCA1NjFaTTM2NyA2OTZRMzI0IDY5NiAzMDMgNzE3VDI4MSA3NzBRMjgxIDgxNiAzMDkgODQzVDM3NyA4NzFRNDIwIDg3MSA0NDEgODUwVDQ2MiA3OTZRNDYyIDc1MSA0MzQgNzI0VDM2NyA2OTZaTTE0MSA2OTZROTggNjk2IDc3IDcxN1Q1NiA3NzBRNTYgODE2IDg0IDg0M1QxNTEgODcxUTE5NCA4NzEgMjE1IDg1MFQyMzcgNzk2UTIzNyA3NTEgMjA5IDcyNFQxNDEgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDA7IiBnbHlwaC1uYW1lPSJFdGgiIGhvcml6LWFkdi14PSI3MjQiIGQ9Ik04NyAyNThINjlRNDYgMjU4IDMyIDI3MFQxNyAzMDNRMTcgMzE2IDIyIDMzOFQ0MSAzNzVRNTAgMzgzIDYyIDM4N1Q5NyAzOTJIMTE2TDE0OSA1NDhRMTYwIDYwMSAxOTEgNjI0VDI3MSA2NDdINDExUTQ4NCA2NDcgNTQxIDYyOFQ2MzcgNTczVDY5NiA0ODhUNzE3IDM3N1E3MTcgMzAzIDY5MyAyMzVUNjE5IDExNFQ0OTQgMzFUMzE2IDBIMzNMODcgMjU4Wk0zNDEgMTYxUTM4NSAxNjEgNDE4IDE3N1Q0NzMgMjIxVDUwNyAyODJUNTE4IDM1NFE1MTggNDE1IDQ4NCA0NTBUMzg4IDQ4NUgzMzRMMzE0IDM5MkgzNjlRMzk5IDM5MiA0MTUgMzc5VDQzMiAzNDRRNDMyIDMzOCA0MzEgMzI5VDQyNiAzMTFUNDE5IDI5MlQ0MDcgMjc1UTM5OCAyNjYgMzg2IDI2MlQzNDYgMjU4SDI4NkwyNjUgMTYxSDM0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQxOyIgZ2x5cGgtbmFtZT0iTnRpbGRlIiBob3Jpei1hZHYteD0iNzAzIiBkPSJNMTExIDU1N1ExMjIgNjA1IDE0NSA2MjhUMjEzIDY1MkgyMzFRMjYzIDY1MiAyODIgNjQwVDMyMCA1OTZMNDgxIDMwNEw1NTQgNjQ3SDc0MUw2MjMgODlRNjEyIDQxIDU4OSAxOFQ1MjIgLTVINTEwUTQ3OSAtNSA0NjAgN1Q0MjIgNTFMMjU1IDM1NEwxODAgMEgtOEwxMTEgNTU3Wk0zMTkgNjk3UTI5NCA2OTcgMjgwIDcxMlQyNjQgNzQ4UTI2NSA3NzcgMjc1IDgwMFQzMDEgODM5VDMzOSA4NjNUMzgyIDg3MlE0MDggODcyIDQyNyA4NjVUNDYwIDg0N1E0NzcgODM2IDQ4NiA4MjhUNTAzIDgyMFE1MTMgODIwIDUyMCA4MjlUNTM2IDg1MFE1NDQgODYxIDU1MyA4NjVUNTc3IDg2OVE2MDIgODY5IDYxNiA4NTRUNjMyIDgxOFE2MzEgNzg5IDYyMSA3NjdUNTk1IDcyOFQ1NTcgNzA0VDUxNCA2OTVRNDg3IDY5NSA0NjkgNzAzVDQzOCA3MjBRNDIxIDczMyA0MTMgNzQzVDM5MyA3NTRRMzgzIDc1NCAzNzggNzQ0VDM2NSA3MTlRMzU5IDcwOSAzNDkgNzAzVDMxOSA2OTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMjsiIGdseXBoLW5hbWU9Ik9ncmF2ZSIgaG9yaXotYWR2LXg9IjcyNyIgZD0iTTQxIDI3N1E0MSAzNTIgNjYgNDIxVDEzOCA1NDNUMjU0IDYyOVQ0MTEgNjYxUTQ4OCA2NjEgNTQ1IDYzOFQ2NDEgNTc0VDY5OSA0ODJUNzE4IDM3MlE3MTggMjk3IDY5MyAyMjhUNjIxIDEwNVQ1MDUgMTlUMzQ4IC0xM1EyNzEgLTEzIDIxMyAxMFQxMTcgNzRUNjAgMTY2VDQxIDI3N1pNMjQwIDI5MVEyNDAgMjM3IDI3MSAyMDFUMzU5IDE2NFEzOTMgMTY0IDQyMiAxNzlUNDczIDIyMFQ1MDcgMjgyVDUyMCAzNThRNTIwIDQxMiA0ODkgNDQ4VDQwMCA0ODVRMzY2IDQ4NSAzMzcgNDcwVDI4NyA0MjlUMjUzIDM2N1QyNDAgMjkxWk0zMjUgNzM0UTI5OSA3NDkgMjg0IDc3MlQyNjkgODE5UTI2OSA4NTMgMjkxIDg3NlQzNTAgOTAwUTM4MiA5MDAgNDA5IDg4NFE0MzQgODY5IDQ1NCA4NDRUNDg5IDc5NFQ1MTAgNzQ5VDUxMyA3MjJRNTA5IDcxNiA0OTEgNzEwVDQ0NyA3MDNUMzg4IDcwOVQzMjUgNzM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDM7IiBnbHlwaC1uYW1lPSJPYWN1dGUiIGhvcml6LWFkdi14PSI3MjciIGQ9Ik00MSAyNzdRNDEgMzUyIDY2IDQyMVQxMzggNTQzVDI1NCA2MjlUNDExIDY2MVE0ODggNjYxIDU0NSA2MzhUNjQxIDU3NFQ2OTkgNDgyVDcxOCAzNzJRNzE4IDI5NyA2OTMgMjI4VDYyMSAxMDVUNTA1IDE5VDM0OCAtMTNRMjcxIC0xMyAyMTMgMTBUMTE3IDc0VDYwIDE2NlQ0MSAyNzdaTTI0MCAyOTFRMjQwIDIzNyAyNzEgMjAxVDM1OSAxNjRRMzkzIDE2NCA0MjIgMTc5VDQ3MyAyMjBUNTA3IDI4MlQ1MjAgMzU4UTUyMCA0MTIgNDg5IDQ0OFQ0MDAgNDg1UTM2NiA0ODUgMzM3IDQ3MFQyODcgNDI5VDI1MyAzNjdUMjQwIDI5MVpNMzQ4IDcyMlEzNDUgNzI4IDM1MiA3NDlUMzc1IDc5NFQ0MTMgODQzVDQ2MSA4ODJRNDg4IDg5NyA1MjEgODk3UTU1NyA4OTcgNTc5IDg3M1Q2MDEgODE2UTYwMSA3OTIgNTg1IDc2OVQ1NDIgNzMxUTUwOSA3MTMgNDc2IDcwN1Q0MTYgNzAyVDM3MCA3MTBUMzQ4IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgZ2x5cGgtbmFtZT0iT2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3MjciIGQ9Ik00MSAyNzdRNDEgMzUyIDY2IDQyMVQxMzggNTQzVDI1NCA2MjlUNDExIDY2MVE0ODggNjYxIDU0NSA2MzhUNjQxIDU3NFQ2OTkgNDgyVDcxOCAzNzJRNzE4IDI5NyA2OTMgMjI4VDYyMSAxMDVUNTA1IDE5VDM0OCAtMTNRMjcxIC0xMyAyMTMgMTBUMTE3IDc0VDYwIDE2NlQ0MSAyNzdaTTI0MCAyOTFRMjQwIDIzNyAyNzEgMjAxVDM1OSAxNjRRMzkzIDE2NCA0MjIgMTc5VDQ3MyAyMjBUNTA3IDI4MlQ1MjAgMzU4UTUyMCA0MTIgNDg5IDQ0OFQ0MDAgNDg1UTM2NiA0ODUgMzM3IDQ3MFQyODcgNDI5VDI1MyAzNjdUMjQwIDI5MVpNMzMyIDY5NlEzMDUgNjk2IDI5MCA3MTNUMjc1IDc1M1EyNzUgNzc5IDI5MiA4MDNUMzM5IDg0OVEzNjkgODcxIDQwNCA4ODZUNDcxIDkwOVE0ODkgOTAzIDUxMyA4ODdUNTU5IDg0OVE1NzkgODI4IDU5MiA4MDZUNjA1IDc2M1E2MDUgNzM0IDU4NyA3MTVUNTM5IDY5NlE1MTUgNjk2IDQ5NSA3MTFUNDYxIDc1NFE0NTggNzYxIDQ1NSA3NjlUNDQ4IDc4NlE0NDIgNzc4IDQzNyA3NzBUNDI0IDc1NFE0MDQgNzI2IDM4MiA3MTFUMzMyIDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ1OyIgZ2x5cGgtbmFtZT0iT3RpbGRlIiBob3Jpei1hZHYteD0iNzI3IiBkPSJNNDEgMjc3UTQxIDM1MiA2NiA0MjFUMTM4IDU0M1QyNTQgNjI5VDQxMSA2NjFRNDg4IDY2MSA1NDUgNjM4VDY0MSA1NzRUNjk5IDQ4MlQ3MTggMzcyUTcxOCAyOTcgNjkzIDIyOFQ2MjEgMTA1VDUwNSAxOVQzNDggLTEzUTI3MSAtMTMgMjEzIDEwVDExNyA3NFQ2MCAxNjZUNDEgMjc3Wk0yNDAgMjkxUTI0MCAyMzcgMjcxIDIwMVQzNTkgMTY0UTM5MyAxNjQgNDIyIDE3OVQ0NzMgMjIwVDUwNyAyODJUNTIwIDM1OFE1MjAgNDEyIDQ4OSA0NDhUNDAwIDQ4NVEzNjYgNDg1IDMzNyA0NzBUMjg3IDQyOVQyNTMgMzY3VDI0MCAyOTFaTTMxMyA2OTdRMjg4IDY5NyAyNzQgNzEyVDI1OCA3NDhRMjU5IDc3NyAyNjkgODAwVDI5NSA4MzlUMzMzIDg2M1QzNzYgODcyUTQwMiA4NzIgNDIxIDg2NVQ0NTQgODQ3UTQ3MSA4MzYgNDgwIDgyOFQ0OTcgODIwUTUwNyA4MjAgNTE0IDgyOVQ1MzAgODUwUTUzOCA4NjEgNTQ3IDg2NVQ1NzEgODY5UTU5NiA4NjkgNjEwIDg1NFQ2MjYgODE4UTYyNSA3ODkgNjE1IDc2N1Q1ODkgNzI4VDU1MSA3MDRUNTA4IDY5NVE0ODEgNjk1IDQ2MyA3MDNUNDMyIDcyMFE0MTUgNzMzIDQwNyA3NDNUMzg3IDc1NFEzNzcgNzU0IDM3MiA3NDRUMzU5IDcxOVEzNTMgNzA5IDM0MyA3MDNUMzEzIDY5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ2OyIgZ2x5cGgtbmFtZT0iT2RpZXJlc2lzIiBob3Jpei1hZHYteD0iNzI3IiBkPSJNNDEgMjc3UTQxIDM1MiA2NiA0MjFUMTM4IDU0M1QyNTQgNjI5VDQxMSA2NjFRNDg4IDY2MSA1NDUgNjM4VDY0MSA1NzRUNjk5IDQ4MlQ3MTggMzcyUTcxOCAyOTcgNjkzIDIyOFQ2MjEgMTA1VDUwNSAxOVQzNDggLTEzUTI3MSAtMTMgMjEzIDEwVDExNyA3NFQ2MCAxNjZUNDEgMjc3Wk0yNDAgMjkxUTI0MCAyMzcgMjcxIDIwMVQzNTkgMTY0UTM5MyAxNjQgNDIyIDE3OVQ0NzMgMjIwVDUwNyAyODJUNTIwIDM1OFE1MjAgNDEyIDQ4OSA0NDhUNDAwIDQ4NVEzNjYgNDg1IDMzNyA0NzBUMjg3IDQyOVQyNTMgMzY3VDI0MCAyOTFaTTU2MiA2OTZRNTE5IDY5NiA0OTggNzE3VDQ3NiA3NzBRNDc2IDgxNiA1MDQgODQzVDU3MiA4NzFRNjE1IDg3MSA2MzYgODUwVDY1NyA3OTZRNjU3IDc1MSA2MjkgNzI0VDU2MiA2OTZaTTMzNiA2OTZRMjkzIDY5NiAyNzIgNzE3VDI1MSA3NzBRMjUxIDgxNiAyNzkgODQzVDM0NiA4NzFRMzg5IDg3MSA0MTAgODUwVDQzMiA3OTZRNDMyIDc1MSA0MDQgNzI0VDMzNiA2OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENzsiIGdseXBoLW5hbWU9Im11bHRpcGx5IiBob3Jpei1hZHYteD0iNTY1IiBkPSJNODkgMjNRNzggMjMgNjYgMzBUNDUgNDhUMjkgNzFUMjMgOTJRMjMgMTA4IDMwIDEyNVQ1NyAxNTlMMTgzIDI2MkwxMDUgMzYwUTg1IDM4NiA4NSA0MTFRODUgNDIxIDkyIDQzNFQxMTEgNDU3VDEzNiA0NzVUMTYxIDQ4M1ExOTEgNDgzIDIxNyA0NTBMMjkyIDM1Mkw0MTYgNDU2UTQzMSA0NzAgNDQ1IDQ3NVQ0NzQgNDgxUTQ4NSA0ODEgNDk3IDQ3NFQ1MTggNDU2VDUzNCA0MzNUNTQwIDQxMlE1NDAgMzk2IDUzNCAzNzlUNTA3IDM0NUwzODAgMjQyTDQ1OSAxNDRRNDgwIDExOSA0ODAgOTNRNDgwIDgyIDQ3MyA3MFQ0NTQgNDdUNDI5IDI5VDQwMyAyMVEzNzIgMjEgMzQ3IDU0TDI3MSAxNTJMMTQ4IDQ4UTEyMCAyMyA4OSAyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ4OyIgZ2x5cGgtbmFtZT0iT3NsYXNoIiBob3Jpei1hZHYteD0iNzI3IiBkPSJNLTE0IDIxUS0xNCAzNSAtNyA0NlQxNCA2OUw3OSAxMjdRNTkgMTYxIDUwIDE5OFQ0MSAyNzdRNDEgMzUyIDY2IDQyMVQxMzggNTQzVDI1NCA2MjlUNDExIDY2MVE0NzQgNjYxIDUyMyA2NDVUNjEwIDYwMUw3MDIgNjg0UTcwNSA2ODYgNzE2IDY4M1Q3NDAgNjcxVDc2MiA2NTFUNzcyIDYyMlE3NzIgNjA4IDc2NiA1OTdUNzQ1IDU3NEw2ODIgNTE3UTcxOCA0NTIgNzE4IDM3MlE3MTggMjk3IDY5MyAyMjhUNjIxIDEwNVQ1MDUgMTlUMzQ4IC0xM1EyODYgLTEzIDIzOCAyVDE1MiA0NUw1NyAtNDFRNTQgLTQ0IDQzIC00MVQxOSAtMjlULTQgLThULTE0IDIxWk00NjkgNDc0UTQ0MCA0OTEgNDAxIDQ5MVEzNjQgNDkxIDMzMyA0NzVUMjgwIDQzMlQyNDQgMzY4VDIzMSAyODlRMjMxIDI4MiAyMzEgMjc2VDIzMyAyNjRMNDY5IDQ3NFpNMjk1IDE3MlEzMjEgMTU4IDM1OCAxNThRMzk1IDE1OCA0MjYgMTc0VDQ3OSAyMTdUNTE1IDI4MVQ1MjggMzYwUTUyOCAzNjUgNTI4IDM3MFQ1MjYgMzgwTDI5NSAxNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGdseXBoLW5hbWU9IlVncmF2ZSIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTEwNiA1NjFRMTE2IDYwOCAxMzggNjMwVDIwNCA2NTJIMjM0UTI3NiA2NTIgMjk2IDYyOVQzMDcgNTU4TDI1MCAyOTJRMjM2IDIyOSAyNTYgMTk2VDMzNCAxNjJRMzczIDE2MiAzOTkgMTg3VDQzOCAyNzNMNDk5IDU1OVE1MTAgNjA3IDUzMiA2MjlUNTk4IDY1Mkg2MjRRNjY2IDY1MiA2ODcgNjI4VDY5NyA1NThMNjM0IDI2MlE2MDQgMTIyIDUyNCA1NVQzMTMgLTEzUTE1MCAtMTMgODQgNjhUNTEgMzA3TDEwNiA1NjFaTTMxMyA3MzFRMjg3IDc0NiAyNzIgNzY5VDI1NyA4MTZRMjU3IDg1MCAyNzkgODczVDMzOCA4OTdRMzcwIDg5NyAzOTcgODgxUTQyMiA4NjYgNDQyIDg0MVQ0NzcgNzkxVDQ5OCA3NDZUNTAxIDcxOVE0OTcgNzEzIDQ3OSA3MDdUNDM1IDcwMFQzNzYgNzA2VDMxMyA3MzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQTsiIGdseXBoLW5hbWU9IlVhY3V0ZSIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTEwNiA1NjFRMTE2IDYwOCAxMzggNjMwVDIwNCA2NTJIMjM0UTI3NiA2NTIgMjk2IDYyOVQzMDcgNTU4TDI1MCAyOTJRMjM2IDIyOSAyNTYgMTk2VDMzNCAxNjJRMzczIDE2MiAzOTkgMTg3VDQzOCAyNzNMNDk5IDU1OVE1MTAgNjA3IDUzMiA2MjlUNTk4IDY1Mkg2MjRRNjY2IDY1MiA2ODcgNjI4VDY5NyA1NThMNjM0IDI2MlE2MDQgMTIyIDUyNCA1NVQzMTMgLTEzUTE1MCAtMTMgODQgNjhUNTEgMzA3TDEwNiA1NjFaTTM0MCA3MTlRMzM3IDcyNSAzNDQgNzQ2VDM2NyA3OTFUNDA1IDg0MFQ0NTMgODc5UTQ4MCA4OTQgNTEzIDg5NFE1NDkgODk0IDU3MSA4NzBUNTkzIDgxM1E1OTMgNzg5IDU3NyA3NjZUNTM0IDcyOFE1MDEgNzEwIDQ2OCA3MDRUNDA4IDY5OVQzNjIgNzA3VDM0MCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQjsiIGdseXBoLW5hbWU9IlVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjcxIiBkPSJNMTA2IDU2MVExMTYgNjA4IDEzOCA2MzBUMjA0IDY1MkgyMzRRMjc2IDY1MiAyOTYgNjI5VDMwNyA1NThMMjUwIDI5MlEyMzYgMjI5IDI1NiAxOTZUMzM0IDE2MlEzNzMgMTYyIDM5OSAxODdUNDM4IDI3M0w0OTkgNTU5UTUxMCA2MDcgNTMyIDYyOVQ1OTggNjUySDYyNFE2NjYgNjUyIDY4NyA2MjhUNjk3IDU1OEw2MzQgMjYyUTYwNCAxMjIgNTI0IDU1VDMxMyAtMTNRMTUwIC0xMyA4NCA2OFQ1MSAzMDdMMTA2IDU2MVpNMzI0IDY5M1EyOTcgNjkzIDI4MiA3MTBUMjY3IDc1MFEyNjcgNzc2IDI4NCA4MDBUMzMxIDg0NlEzNjEgODY4IDM5NiA4ODNUNDYzIDkwNlE0ODEgOTAwIDUwNSA4ODRUNTUxIDg0NlE1NzEgODI1IDU4NCA4MDNUNTk3IDc2MFE1OTcgNzMxIDU3OSA3MTJUNTMxIDY5M1E1MDcgNjkzIDQ4NyA3MDhUNDUzIDc1MVE0NTAgNzU4IDQ0NyA3NjZUNDQwIDc4M1E0MzQgNzc1IDQyOSA3NjdUNDE2IDc1MVEzOTYgNzIzIDM3NCA3MDhUMzI0IDY5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERDOyIgZ2x5cGgtbmFtZT0iVWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjcxIiBkPSJNMTA2IDU2MVExMTYgNjA4IDEzOCA2MzBUMjA0IDY1MkgyMzRRMjc2IDY1MiAyOTYgNjI5VDMwNyA1NThMMjUwIDI5MlEyMzYgMjI5IDI1NiAxOTZUMzM0IDE2MlEzNzMgMTYyIDM5OSAxODdUNDM4IDI3M0w0OTkgNTU5UTUxMCA2MDcgNTMyIDYyOVQ1OTggNjUySDYyNFE2NjYgNjUyIDY4NyA2MjhUNjk3IDU1OEw2MzQgMjYyUTYwNCAxMjIgNTI0IDU1VDMxMyAtMTNRMTUwIC0xMyA4NCA2OFQ1MSAzMDdMMTA2IDU2MVpNNTQ1IDY5M1E1MDIgNjkzIDQ4MSA3MTRUNDU5IDc2N1E0NTkgODEzIDQ4NyA4NDBUNTU1IDg2OFE1OTggODY4IDYxOSA4NDdUNjQwIDc5M1E2NDAgNzQ4IDYxMiA3MjFUNTQ1IDY5M1pNMzE5IDY5M1EyNzYgNjkzIDI1NSA3MTRUMjM0IDc2N1EyMzQgODEzIDI2MiA4NDBUMzI5IDg2OFEzNzIgODY4IDM5MyA4NDdUNDE1IDc5M1E0MTUgNzQ4IDM4NyA3MjFUMzE5IDY5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEREOyIgZ2x5cGgtbmFtZT0iWWFjdXRlIiBob3Jpei1hZHYteD0iNjMyIiBkPSJNMjI4IDI1NUw0NiA2NDdIMjYwTDM1MSA0MDVMNTI3IDY1OVE1MjggNjYwIDU1MSA2NThUNjAzIDY0NlQ2NTUgNjE4VDY3OSA1NjdRNjc5IDU0OCA2NjcgNTIzVDYyNyA0NjhMNDI4IDI1M0wzNzMgMEgxNzNMMjI4IDI1NVpNMzE3IDcxOVEzMTQgNzI1IDMyMSA3NDZUMzQ0IDc5MVQzODIgODQwVDQzMCA4NzlRNDU3IDg5NCA0OTAgODk0UTUyNiA4OTQgNTQ4IDg3MFQ1NzAgODEzUTU3MCA3ODkgNTU0IDc2NlQ1MTEgNzI4UTQ3OCA3MTAgNDQ1IDcwNFQzODUgNjk5VDMzOSA3MDdUMzE3IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgZ2x5cGgtbmFtZT0iVGhvcm4iIGhvcml6LWFkdi14PSI2MjMiIGQ9Ik0xMTEgNTU5UTEyMSA2MDYgMTQ0IDYyOVQyMTEgNjUySDI0N1EyODMgNjUyIDMwMyA2MzJUMzE2IDU3NkwzMTEgNTUxSDM1NlE0ODcgNTUxIDU1MyA1MDJUNjE5IDM1OVE2MTkgMjk5IDYwMSAyNTJUNTQ2IDE3MVQ0NTIgMTE5VDMxNyAxMDFIMjE2TDE5NCAwSC04TDExMSA1NTlaTTMyOCAyNDdRMzgyIDI0NyA0MDUgMjczVDQyOCAzMzdRNDI3IDM2OSA0MDcgMzg0VDM0MyA0MDBIMjc4TDI0NyAyNDdIMzI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REY7IiBnbHlwaC1uYW1lPSJnZXJtYW5kYmxzIiBob3Jpei1hZHYteD0iNjI1IiBkPSJNOTAgNDcyUTEwMyA1MzYgMTI2IDU4MFQxODMgNjUzVDI2NiA2OTNUMzc4IDcwNlE0NDIgNzA2IDQ4OSA2OTNUNTY4IDY1N1Q2MTUgNjAzVDYzMSA1MzdRNjMxIDQ3MiA1OTMgNDM0VDQ4NCAzODRRNTQxIDM1OCA1NzIgMzE3VDYwMyAyMThRNjAzIDE2OCA1ODcgMTI2VDU0MSA1M1Q0NzMgNVQzODYgLTEzUTM0MSAtMTMgMzA3IC0yVDI1NSAyOFEyMzEgNTIgMjMxIDg3UTIzMSAxMDggMjM5IDEyM1QyNTggMTQ5VDI3OCAxNjNUMjg4IDE2N1EyOTcgMTU2IDMxMSAxNDdUMzU1IDEzN1EzODQgMTM3IDQwMyAxNTZUNDIyIDIwN1E0MjIgMjMxIDQwNyAyNDdUMzYzIDI3NVEzNDAgMjg2IDMyMyAzMDJUMzA2IDM1M1EzMDYgMzc5IDMxOCA0MDRUMzQ1IDQzOVEzOTkgNDM5IDQyMSA0NTVUNDQ0IDUwOVE0NDQgNTM1IDQyNSA1NTFUMzczIDU2OFEzNDAgNTY4IDMxNyA1NDVUMjgzIDQ3MEwxODIgMEgtMTBMOTAgNDcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTA7IiBnbHlwaC1uYW1lPSJhZ3JhdmUiIGhvcml6LWFkdi14PSI2NDAiIGQ9Ik0yMSAxODZRMjEgMjQ3IDQwIDMwNVQ5NSA0MDhUMTc5IDQ4MFQyODggNTA4UTMzMyA1MDggMzcyIDQ4OVQ0MzQgNDMxTDQ0OCA0OTZINjQwTDU2MyAxMzVRNTUzIDkwIDU2MCA3MFQ1OTQgNDJRNTk0IDQyIDU5MSAzNFQ1NzcgMTVUNTQ2IC0zVDQ5MyAtMTJRNDMzIC0xMiA0MDUgMTZUMzc0IDkxUTM0OCA0NSAzMDQgMTdUMjAxIC0xMlExNjEgLTEyIDEyOCAyVDcxIDQxVDM0IDEwNFQyMSAxODZaTTIwNSAyMTlRMjA1IDE4MiAyMjYgMTYwVDI4MSAxMzdRMzIyIDEzNyAzNTIgMTY0VDM5NCAyNDBMNDA3IDMwMFEzOTYgMzI5IDM3NiAzNDVUMzIyIDM2MlEyOTUgMzYyIDI3NCAzNTBUMjM3IDMxOFQyMTMgMjcyVDIwNSAyMTlaTTI2NyA1NzlRMjQxIDU5NCAyMjYgNjE3VDIxMSA2NjRRMjExIDY5OCAyMzMgNzIxVDI5MiA3NDVRMzI0IDc0NSAzNTEgNzI5UTM3NiA3MTQgMzk2IDY4OVQ0MzEgNjM5VDQ1MiA1OTRUNDU1IDU2N1E0NTEgNTYxIDQzMyA1NTVUMzg5IDU0OFQzMzAgNTU0VDI2NyA1NzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMTsiIGdseXBoLW5hbWU9ImFhY3V0ZSIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTIxIDE4NlEyMSAyNDcgNDAgMzA1VDk1IDQwOFQxNzkgNDgwVDI4OCA1MDhRMzMzIDUwOCAzNzIgNDg5VDQzNCA0MzFMNDQ4IDQ5Nkg2NDBMNTYzIDEzNVE1NTMgOTAgNTYwIDcwVDU5NCA0MlE1OTQgNDIgNTkxIDM0VDU3NyAxNVQ1NDYgLTNUNDkzIC0xMlE0MzMgLTEyIDQwNSAxNlQzNzQgOTFRMzQ4IDQ1IDMwNCAxN1QyMDEgLTEyUTE2MSAtMTIgMTI4IDJUNzEgNDFUMzQgMTA0VDIxIDE4NlpNMjA1IDIxOVEyMDUgMTgyIDIyNiAxNjBUMjgxIDEzN1EzMjIgMTM3IDM1MiAxNjRUMzk0IDI0MEw0MDcgMzAwUTM5NiAzMjkgMzc2IDM0NVQzMjIgMzYyUTI5NSAzNjIgMjc0IDM1MFQyMzcgMzE4VDIxMyAyNzJUMjA1IDIxOVpNMjkwIDU2N1EyODcgNTczIDI5NCA1OTRUMzE3IDYzOVQzNTUgNjg4VDQwMyA3MjdRNDMwIDc0MiA0NjMgNzQyUTQ5OSA3NDIgNTIxIDcxOFQ1NDMgNjYxUTU0MyA2MzcgNTI3IDYxNFQ0ODQgNTc2UTQ1MSA1NTggNDE4IDU1MlQzNTggNTQ3VDMxMiA1NTVUMjkwIDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgZ2x5cGgtbmFtZT0iYWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2NDAiIGQ9Ik0yMSAxODZRMjEgMjQ3IDQwIDMwNVQ5NSA0MDhUMTc5IDQ4MFQyODggNTA4UTMzMyA1MDggMzcyIDQ4OVQ0MzQgNDMxTDQ0OCA0OTZINjQwTDU2MyAxMzVRNTUzIDkwIDU2MCA3MFQ1OTQgNDJRNTk0IDQyIDU5MSAzNFQ1NzcgMTVUNTQ2IC0zVDQ5MyAtMTJRNDMzIC0xMiA0MDUgMTZUMzc0IDkxUTM0OCA0NSAzMDQgMTdUMjAxIC0xMlExNjEgLTEyIDEyOCAyVDcxIDQxVDM0IDEwNFQyMSAxODZaTTIwNSAyMTlRMjA1IDE4MiAyMjYgMTYwVDI4MSAxMzdRMzIyIDEzNyAzNTIgMTY0VDM5NCAyNDBMNDA3IDMwMFEzOTYgMzI5IDM3NiAzNDVUMzIyIDM2MlEyOTUgMzYyIDI3NCAzNTBUMjM3IDMxOFQyMTMgMjcyVDIwNSAyMTlaTTI4NCA1NDFRMjU3IDU0MSAyNDIgNTU4VDIyNyA1OThRMjI3IDYyNCAyNDQgNjQ4VDI5MSA2OTRRMzIxIDcxNiAzNTYgNzMxVDQyMyA3NTRRNDQxIDc0OCA0NjUgNzMyVDUxMSA2OTRRNTMxIDY3MyA1NDQgNjUxVDU1NyA2MDhRNTU3IDU3OSA1MzkgNTYwVDQ5MSA1NDFRNDY3IDU0MSA0NDcgNTU2VDQxMyA1OTlRNDEwIDYwNiA0MDcgNjE0VDQwMCA2MzFRMzk0IDYyMyAzODkgNjE1VDM3NiA1OTlRMzU2IDU3MSAzMzQgNTU2VDI4NCA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMzsiIGdseXBoLW5hbWU9ImF0aWxkZSIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTIxIDE4NlEyMSAyNDcgNDAgMzA1VDk1IDQwOFQxNzkgNDgwVDI4OCA1MDhRMzMzIDUwOCAzNzIgNDg5VDQzNCA0MzFMNDQ4IDQ5Nkg2NDBMNTYzIDEzNVE1NTMgOTAgNTYwIDcwVDU5NCA0MlE1OTQgNDIgNTkxIDM0VDU3NyAxNVQ1NDYgLTNUNDkzIC0xMlE0MzMgLTEyIDQwNSAxNlQzNzQgOTFRMzQ4IDQ1IDMwNCAxN1QyMDEgLTEyUTE2MSAtMTIgMTI4IDJUNzEgNDFUMzQgMTA0VDIxIDE4NlpNMjA1IDIxOVEyMDUgMTgyIDIyNiAxNjBUMjgxIDEzN1EzMjIgMTM3IDM1MiAxNjRUMzk0IDI0MEw0MDcgMzAwUTM5NiAzMjkgMzc2IDM0NVQzMjIgMzYyUTI5NSAzNjIgMjc0IDM1MFQyMzcgMzE4VDIxMyAyNzJUMjA1IDIxOVpNMjYwIDU0MlEyMzUgNTQyIDIyMSA1NTdUMjA1IDU5M1EyMDYgNjIyIDIxNiA2NDVUMjQyIDY4NFQyODAgNzA4VDMyMyA3MTdRMzQ5IDcxNyAzNjggNzEwVDQwMSA2OTJRNDE4IDY4MSA0MjcgNjczVDQ0NCA2NjVRNDU0IDY2NSA0NjEgNjc0VDQ3NyA2OTVRNDg1IDcwNiA0OTQgNzEwVDUxOCA3MTRRNTQzIDcxNCA1NTcgNjk5VDU3MyA2NjNRNTcyIDYzNCA1NjIgNjEyVDUzNiA1NzNUNDk4IDU0OVQ0NTUgNTQwUTQyOCA1NDAgNDEwIDU0OFQzNzkgNTY1UTM2MiA1NzggMzU0IDU4OFQzMzQgNTk5UTMyNCA1OTkgMzE5IDU4OVQzMDYgNTY0UTMwMCA1NTQgMjkwIDU0OFQyNjAgNTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTQ7IiBnbHlwaC1uYW1lPSJhZGllcmVzaXMiIGhvcml6LWFkdi14PSI2NDAiIGQ9Ik0yMSAxODZRMjEgMjQ3IDQwIDMwNVQ5NSA0MDhUMTc5IDQ4MFQyODggNTA4UTMzMyA1MDggMzcyIDQ4OVQ0MzQgNDMxTDQ0OCA0OTZINjQwTDU2MyAxMzVRNTUzIDkwIDU2MCA3MFQ1OTQgNDJRNTk0IDQyIDU5MSAzNFQ1NzcgMTVUNTQ2IC0zVDQ5MyAtMTJRNDMzIC0xMiA0MDUgMTZUMzc0IDkxUTM0OCA0NSAzMDQgMTdUMjAxIC0xMlExNjEgLTEyIDEyOCAyVDcxIDQxVDM0IDEwNFQyMSAxODZaTTIwNSAyMTlRMjA1IDE4MiAyMjYgMTYwVDI4MSAxMzdRMzIyIDEzNyAzNTIgMTY0VDM5NCAyNDBMNDA3IDMwMFEzOTYgMzI5IDM3NiAzNDVUMzIyIDM2MlEyOTUgMzYyIDI3NCAzNTBUMjM3IDMxOFQyMTMgMjcyVDIwNSAyMTlaTTUwNiA1NDFRNDYzIDU0MSA0NDIgNTYyVDQyMCA2MTVRNDIwIDY2MSA0NDggNjg4VDUxNiA3MTZRNTU5IDcxNiA1ODAgNjk1VDYwMSA2NDFRNjAxIDU5NiA1NzMgNTY5VDUwNiA1NDFaTTI4MCA1NDFRMjM3IDU0MSAyMTYgNTYyVDE5NSA2MTVRMTk1IDY2MSAyMjMgNjg4VDI5MCA3MTZRMzMzIDcxNiAzNTQgNjk1VDM3NiA2NDFRMzc2IDU5NiAzNDggNTY5VDI4MCA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNTsiIGdseXBoLW5hbWU9ImFyaW5nIiBob3Jpei1hZHYteD0iNjQwIiBkPSJNMjEgMTg2UTIxIDI0NyA0MCAzMDVUOTUgNDA4VDE3OSA0ODBUMjg4IDUwOFEzMzMgNTA4IDM3MiA0ODlUNDM0IDQzMUw0NDggNDk2SDY0MEw1NjMgMTM1UTU1MyA5MCA1NjAgNzBUNTk0IDQyUTU5NCA0MiA1OTEgMzRUNTc3IDE1VDU0NiAtM1Q0OTMgLTEyUTQzMyAtMTIgNDA1IDE2VDM3NCA5MVEzNDggNDUgMzA0IDE3VDIwMSAtMTJRMTYxIC0xMiAxMjggMlQ3MSA0MVQzNCAxMDRUMjEgMTg2Wk0yMDUgMjE5UTIwNSAxODIgMjI2IDE2MFQyODEgMTM3UTMyMiAxMzcgMzUyIDE2NFQzOTQgMjQwTDQwNyAzMDBRMzk2IDMyOSAzNzYgMzQ1VDMyMiAzNjJRMjk1IDM2MiAyNzQgMzUwVDIzNyAzMThUMjEzIDI3MlQyMDUgMjE5Wk0zOTEgNTQxUTMzMyA1NDEgMzAwIDU3MVQyNjYgNjUwUTI2NiA2NzggMjc2IDcwNFQzMDUgNzUwVDM1MCA3ODFUNDA3IDc5M1E0NjUgNzkzIDQ5OCA3NjNUNTMyIDY4NFE1MzIgNjU1IDUyMiA2MzBUNDkzIDU4NFQ0NDggNTUzVDM5MSA1NDFaTTM5NCA2MTlRNDE3IDYxOSA0MzEgNjM2VDQ0NiA2NzRRNDQ2IDY5MiA0MzUgNzA0VDQwNCA3MTZRMzgxIDcxNiAzNjcgNjk5VDM1MiA2NjFRMzUyIDY0MyAzNjMgNjMxVDM5NCA2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNjsiIGdseXBoLW5hbWU9ImFlIiBob3Jpei1hZHYteD0iODYxIiBkPSJNLTMgMTIwUS0zIDIxNiA4MyAyNTdUMzM2IDMwMUgzNTZWMzA0UTM2MiAzMzIgMzQ0IDM1MVQyNzggMzcxUTI1NSAzNzEgMjM5IDM2OFQyMDkgMzU4VDE4NSAzMzdUMTY0IDMwNFExNjMgMzAyIDE0NyAzMDJUMTExIDMwN1Q3NSAzMjhUNTkgMzc0UTU5IDM5OCA3MiA0MjJUMTEzIDQ2NVQxODMgNDk1VDI4MiA1MDdRMzQ3IDUwNyAzODkgNDg4VDQ1NSA0MzZRNDkyIDQ3MSA1NDAgNDg5VDY0NiA1MDhRNzQ5IDUwOCA4MDIgNDY2VDg1NSAzNTNRODU1IDMxNSA4NDIgMjg1VDc5NSAyMzNUNzA4IDIwMVQ1NzEgMTg5UTU1MiAxODkgNTMzIDE4OVQ0OTEgMTkxUTUwMCAxMTggNTkzIDExOFE2MzcgMTE4IDY3MSAxMzdUNzI1IDE4NFE3MjYgMTg0IDczOCAxODJUNzY0IDE3M1Q3OTAgMTUyVDgwMiAxMTZRODAyIDkwIDc5NSA3NVQ3NzEgNDRRNzQ3IDIwIDcwMiA0VDU5NCAtMTNRNTEyIC0xMyA0NjMgMTFUMzkwIDc4UTM2MiAzNiAzMTQgMTJUMTg1IC0xM1E5MSAtMTMgNDQgMjFULTMgMTIwWk01MTEgMjk3UTUyMyAyOTYgNTMzIDI5NlQ1NTQgMjk3UTU5NiAyOTcgNjI0IDMwMFQ2NjkgMzExVDY5MyAzMjdUNzAwIDM0OFE3MDAgMzYzIDY4NSAzNzVUNjM4IDM4OFE1OTUgMzg4IDU2MyAzNjJUNTExIDI5N1pNMTgwIDE0NVExODAgMTI3IDE5NCAxMTZUMjM1IDEwNVEyNzAgMTA1IDI5NyAxMjdUMzMyIDE4NUwzMzggMjEzSDMxMlEyMzggMjExIDIwOSAxOTRUMTgwIDE0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU3OyIgZ2x5cGgtbmFtZT0iY2NlZGlsbGEiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0xOCAyMTRRMTggMjc0IDQwIDMyN1QxMDAgNDIwVDE5MCA0ODRUMzAzIDUwOFEzNjggNTA4IDQxMiA0OTFUNDgzIDQ0N1E1MDEgNDI5IDUwOSA0MDlUNTE4IDM3MFE1MTggMzM1IDUwMCAzMTZUNDYwIDI4OVQ0MjAgMjgwVDQwMCAyODNRMzk0IDMxNSAzNzIgMzM3VDMwNyAzNTlRMjgxIDM1OSAyNjAgMzQ4VDIyMyAzMTlUMTk5IDI3OFQxOTAgMjMwUTE5MCAxOTAgMjE0IDE2NFQyODUgMTM3UTM0NyAxMzcgMzgwIDE5M1EzODEgMTk1IDM5NCAxOTNUNDIzIDE4MlQ0NTIgMTU3VDQ2NSAxMTdRNDY1IDc4IDQzMCA0NVE0MDQgMTkgMzYzIDNUMjY4IC0xM1EyMTEgLTEzIDE2NSAyVDg3IDQ2VDM2IDExOFQxOCAyMTRaTTE4NSAtMzlRMTg2IC0zOCAyMDUgLTM4VDI0OCAtNDNUMjkxIC02MlQzMTEgLTEwMFEzMTEgLTEyNSAyOTYgLTE0MlQyNTAgLTE3OUwxNjYgLTIzNFExNTggLTI0MCAxNDMgLTIzOFQxMTUgLTIyOVQ5NSAtMjExVDk2IC0xODZMMTg1IC0zOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU4OyIgZ2x5cGgtbmFtZT0iZWdyYXZlIiBob3Jpei1hZHYteD0iNTQ0IiBkPSJNMTggMjA1UTE4IDI3MyA0MiAzMjlUMTA5IDQyNFQyMDggNDg2VDMzMCA1MDhRNDMzIDUwOCA0ODUgNDY2VDUzOCAzNTNRNTM4IDMxNSA1MjUgMjg1VDQ3OCAyMzNUMzkxIDIwMVQyNTQgMTg5UTIzNSAxODkgMjE2IDE4OVQxNzQgMTkxUTE4MyAxMTggMjc2IDExOFEzMjAgMTE4IDM1NCAxMzdUNDA5IDE4NFE0MDkgMTg0IDQyMSAxODJUNDQ3IDE3M1Q0NzMgMTUyVDQ4NSAxMTZRNDg1IDkwIDQ3OCA3NVQ0NTQgNDRRNDMwIDIwIDM4NSA0VDI3MyAtMTNRMjA3IC0xMyAxNTkgM1Q4MCA0OVQzMyAxMThUMTggMjA1Wk0xOTQgMjk3UTIwNiAyOTYgMjE3IDI5NlQyMzggMjk3UTI4MCAyOTcgMzA4IDMwMFQzNTIgMzExVDM3NiAzMjdUMzgzIDM0OFEzODMgMzYzIDM2OCAzNzVUMzIxIDM4OFEyNzggMzg4IDI0NiAzNjJUMTk0IDI5N1pNMjQ5IDU3OVEyMjMgNTk0IDIwOCA2MTdUMTkzIDY2NFExOTMgNjk4IDIxNSA3MjFUMjc0IDc0NVEzMDYgNzQ1IDMzMyA3MjlRMzU4IDcxNCAzNzggNjg5VDQxMyA2MzlUNDM0IDU5NFQ0MzcgNTY3UTQzMyA1NjEgNDE1IDU1NVQzNzEgNTQ4VDMxMiA1NTRUMjQ5IDU3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU5OyIgZ2x5cGgtbmFtZT0iZWFjdXRlIiBob3Jpei1hZHYteD0iNTQ0IiBkPSJNMTggMjA1UTE4IDI3MyA0MiAzMjlUMTA5IDQyNFQyMDggNDg2VDMzMCA1MDhRNDMzIDUwOCA0ODUgNDY2VDUzOCAzNTNRNTM4IDMxNSA1MjUgMjg1VDQ3OCAyMzNUMzkxIDIwMVQyNTQgMTg5UTIzNSAxODkgMjE2IDE4OVQxNzQgMTkxUTE4MyAxMTggMjc2IDExOFEzMjAgMTE4IDM1NCAxMzdUNDA5IDE4NFE0MDkgMTg0IDQyMSAxODJUNDQ3IDE3M1Q0NzMgMTUyVDQ4NSAxMTZRNDg1IDkwIDQ3OCA3NVQ0NTQgNDRRNDMwIDIwIDM4NSA0VDI3MyAtMTNRMjA3IC0xMyAxNTkgM1Q4MCA0OVQzMyAxMThUMTggMjA1Wk0xOTQgMjk3UTIwNiAyOTYgMjE3IDI5NlQyMzggMjk3UTI4MCAyOTcgMzA4IDMwMFQzNTIgMzExVDM3NiAzMjdUMzgzIDM0OFEzODMgMzYzIDM2OCAzNzVUMzIxIDM4OFEyNzggMzg4IDI0NiAzNjJUMTk0IDI5N1pNMjY1IDU2N1EyNjIgNTczIDI2OSA1OTRUMjkyIDYzOVQzMzAgNjg4VDM3OCA3MjdRNDA1IDc0MiA0MzggNzQyUTQ3NCA3NDIgNDk2IDcxOFQ1MTggNjYxUTUxOCA2MzcgNTAyIDYxNFQ0NTkgNTc2UTQyNiA1NTggMzkzIDU1MlQzMzMgNTQ3VDI4NyA1NTVUMjY1IDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVBOyIgZ2x5cGgtbmFtZT0iZWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NDQiIGQ9Ik0xOCAyMDVRMTggMjczIDQyIDMyOVQxMDkgNDI0VDIwOCA0ODZUMzMwIDUwOFE0MzMgNTA4IDQ4NSA0NjZUNTM4IDM1M1E1MzggMzE1IDUyNSAyODVUNDc4IDIzM1QzOTEgMjAxVDI1NCAxODlRMjM1IDE4OSAyMTYgMTg5VDE3NCAxOTFRMTgzIDExOCAyNzYgMTE4UTMyMCAxMTggMzU0IDEzN1Q0MDkgMTg0UTQwOSAxODQgNDIxIDE4MlQ0NDcgMTczVDQ3MyAxNTJUNDg1IDExNlE0ODUgOTAgNDc4IDc1VDQ1NCA0NFE0MzAgMjAgMzg1IDRUMjczIC0xM1EyMDcgLTEzIDE1OSAzVDgwIDQ5VDMzIDExOFQxOCAyMDVaTTE5NCAyOTdRMjA2IDI5NiAyMTcgMjk2VDIzOCAyOTdRMjgwIDI5NyAzMDggMzAwVDM1MiAzMTFUMzc2IDMyN1QzODMgMzQ4UTM4MyAzNjMgMzY4IDM3NVQzMjEgMzg4UTI3OCAzODggMjQ2IDM2MlQxOTQgMjk3Wk0yNDMgNTQxUTIxNiA1NDEgMjAxIDU1OFQxODYgNTk4UTE4NiA2MjQgMjAzIDY0OFQyNTAgNjk0UTI4MCA3MTYgMzE1IDczMVQzODIgNzU0UTQwMCA3NDggNDI0IDczMlQ0NzAgNjk0UTQ5MCA2NzMgNTAzIDY1MVQ1MTYgNjA4UTUxNiA1NzkgNDk4IDU2MFQ0NTAgNTQxUTQyNiA1NDEgNDA2IDU1NlQzNzIgNTk5UTM2OSA2MDYgMzY2IDYxNFQzNTkgNjMxUTM1MyA2MjMgMzQ4IDYxNVQzMzUgNTk5UTMxNSA1NzEgMjkzIDU1NlQyNDMgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUI7IiBnbHlwaC1uYW1lPSJlZGllcmVzaXMiIGhvcml6LWFkdi14PSI1NDQiIGQ9Ik0xOCAyMDVRMTggMjczIDQyIDMyOVQxMDkgNDI0VDIwOCA0ODZUMzMwIDUwOFE0MzMgNTA4IDQ4NSA0NjZUNTM4IDM1M1E1MzggMzE1IDUyNSAyODVUNDc4IDIzM1QzOTEgMjAxVDI1NCAxODlRMjM1IDE4OSAyMTYgMTg5VDE3NCAxOTFRMTgzIDExOCAyNzYgMTE4UTMyMCAxMTggMzU0IDEzN1Q0MDkgMTg0UTQwOSAxODQgNDIxIDE4MlQ0NDcgMTczVDQ3MyAxNTJUNDg1IDExNlE0ODUgOTAgNDc4IDc1VDQ1NCA0NFE0MzAgMjAgMzg1IDRUMjczIC0xM1EyMDcgLTEzIDE1OSAzVDgwIDQ5VDMzIDExOFQxOCAyMDVaTTE5NCAyOTdRMjA2IDI5NiAyMTcgMjk2VDIzOCAyOTdRMjgwIDI5NyAzMDggMzAwVDM1MiAzMTFUMzc2IDMyN1QzODMgMzQ4UTM4MyAzNjMgMzY4IDM3NVQzMjEgMzg4UTI3OCAzODggMjQ2IDM2MlQxOTQgMjk3Wk00NjUgNTQxUTQyMiA1NDEgNDAxIDU2MlQzNzkgNjE1UTM3OSA2NjEgNDA3IDY4OFQ0NzUgNzE2UTUxOCA3MTYgNTM5IDY5NVQ1NjAgNjQxUTU2MCA1OTYgNTMyIDU2OVQ0NjUgNTQxWk0yMzkgNTQxUTE5NiA1NDEgMTc1IDU2MlQxNTQgNjE1UTE1NCA2NjEgMTgyIDY4OFQyNDkgNzE2UTI5MiA3MTYgMzEzIDY5NVQzMzUgNjQxUTMzNSA1OTYgMzA3IDU2OVQyMzkgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUM7IiBnbHlwaC1uYW1lPSJpZ3JhdmUiIGhvcml6LWFkdi14PSIyODYiIGQ9Ik0xNDMgLTEyUTEwMSAtMTIgNzUgMFQzNiAzM1QyMCA4MlQyNSAxNDJMMTAxIDQ5NkgyOTNMMjE1IDEzNVEyMDUgOTAgMjEzIDcwVDI0OCA0MlEyNDggNDIgMjQ1IDM0VDIzMCAxNVQxOTggLTNUMTQzIC0xMlpNMTAwIDU3OVE3NCA1OTQgNTkgNjE3VDQ0IDY2NFE0NCA2OTggNjYgNzIxVDEyNSA3NDVRMTU3IDc0NSAxODQgNzI5UTIwOSA3MTQgMjI5IDY4OVQyNjQgNjM5VDI4NSA1OTRUMjg4IDU2N1EyODQgNTYxIDI2NiA1NTVUMjIyIDU0OFQxNjMgNTU0VDEwMCA1NzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRDsiIGdseXBoLW5hbWU9ImlhY3V0ZSIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTE0MyAtMTJRMTAxIC0xMiA3NSAwVDM2IDMzVDIwIDgyVDI1IDE0MkwxMDEgNDk2SDI5M0wyMTUgMTM1UTIwNSA5MCAyMTMgNzBUMjQ4IDQyUTI0OCA0MiAyNDUgMzRUMjMwIDE1VDE5OCAtM1QxNDMgLTEyWk0xMzYgNTY3UTEzMyA1NzMgMTQwIDU5NFQxNjMgNjM5VDIwMSA2ODhUMjQ5IDcyN1EyNzYgNzQyIDMwOSA3NDJRMzQ1IDc0MiAzNjcgNzE4VDM4OSA2NjFRMzg5IDYzNyAzNzMgNjE0VDMzMCA1NzZRMjk3IDU1OCAyNjQgNTUyVDIwNCA1NDdUMTU4IDU1NVQxMzYgNTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUU7IiBnbHlwaC1uYW1lPSJpY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTE0MyAtMTJRMTAxIC0xMiA3NSAwVDM2IDMzVDIwIDgyVDI1IDE0MkwxMDEgNDk2SDI5M0wyMTUgMTM1UTIwNSA5MCAyMTMgNzBUMjQ4IDQyUTI0OCA0MiAyNDUgMzRUMjMwIDE1VDE5OCAtM1QxNDMgLTEyWk0xMTAgNTQxUTgzIDU0MSA2OCA1NThUNTMgNTk4UTUzIDYyNCA3MCA2NDhUMTE3IDY5NFExNDcgNzE2IDE4MiA3MzFUMjQ5IDc1NFEyNjcgNzQ4IDI5MSA3MzJUMzM3IDY5NFEzNTcgNjczIDM3MCA2NTFUMzgzIDYwOFEzODMgNTc5IDM2NSA1NjBUMzE3IDU0MVEyOTMgNTQxIDI3MyA1NTZUMjM5IDU5OVEyMzYgNjA2IDIzMyA2MTRUMjI2IDYzMVEyMjAgNjIzIDIxNSA2MTVUMjAyIDU5OVExODIgNTcxIDE2MCA1NTZUMTEwIDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVGOyIgZ2x5cGgtbmFtZT0iaWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMjg2IiBkPSJNMTQzIC0xMlExMDEgLTEyIDc1IDBUMzYgMzNUMjAgODJUMjUgMTQyTDEwMSA0OTZIMjkzTDIxNSAxMzVRMjA1IDkwIDIxMyA3MFQyNDggNDJRMjQ4IDQyIDI0NSAzNFQyMzAgMTVUMTk4IC0zVDE0MyAtMTJaTTMzMiA1NDFRMjg5IDU0MSAyNjggNTYyVDI0NiA2MTVRMjQ2IDY2MSAyNzQgNjg4VDM0MiA3MTZRMzg1IDcxNiA0MDYgNjk1VDQyNyA2NDFRNDI3IDU5NiAzOTkgNTY5VDMzMiA1NDFaTTEwNiA1NDFRNjMgNTQxIDQyIDU2MlQyMSA2MTVRMjEgNjYxIDQ5IDY4OFQxMTYgNzE2UTE1OSA3MTYgMTgwIDY5NVQyMDIgNjQxUTIwMiA1OTYgMTc0IDU2OVQxMDYgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjA7IiBnbHlwaC1uYW1lPSJldGgiIGhvcml6LWFkdi14PSI2MTciIGQ9Ik0xNyAyMTBRMTcgMjYwIDM0IDMwNFQ4MiAzODJUMTU2IDQzNFQyNTIgNDUzUTMyMSA0NTMgMzY1IDQyOVQ0MzAgMzY4UTQzMiA0MjIgNDIyIDQ2M1QzOTEgNTM2TDIyOCA0ODBRMjI1IDQ3OSAyMTUgNDk2VDIwNCA1NDBRMjA0IDU2MiAyMTQgNTgyVDI1NSA2MTJMMjg4IDYyM1EyNjIgNjM1IDIzNCA2NDJUMTc5IDY1MVExNzcgNjUxIDE4MSA2NjRUMTk4IDY5MlQyMzUgNzIwVDI5OSA3MzNRMzQ2IDczMyAzODggNzE4VDQ2OCA2NzZMNjA2IDcyMlE2MDkgNzIzIDYxOSA3MDZUNjMwIDY2MlE2MzAgNjQwIDYyMCA2MjBUNTc5IDU5MEw1NTQgNTgyUTU4NCA1MzIgNTk5IDQ3MVQ2MTAgMzM5UTYwNyAyNTMgNTg1IDE4OFQ1MDggNjhRNDcyIDMyIDQyMiAxMFQyOTkgLTEzUTIzOSAtMTMgMTg3IDFUOTggNDRUMzkgMTE0VDE3IDIxMFpNMjAwIDIxMFEyMDAgMTcyIDIyMyAxNDlUMjg2IDEyNlEzMzEgMTI2IDM2MyAxNTZRMzk4IDE5MSA0MTAgMjY1UTQwMiAyODkgMzc2IDMwOFQzMTIgMzI3UTI4NyAzMjcgMjY2IDMxOFQyMzEgMjkzVDIwOCAyNTZUMjAwIDIxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYxOyIgZ2x5cGgtbmFtZT0ibnRpbGRlIiBob3Jpei1hZHYteD0iNjExIiBkPSJNOTMgNDg4UTk0IDQ5MSAxMTAgNDk1VDE0OSA1MDBRMTg2IDUwMCAyMTYgNDc5VDI1MiA0MDZRMjg0IDQ1MyAzMjggNDgwVDQzMiA1MDhRNTA0IDUwOCA1NDMgNDY1VDU4MyAzNTNRNTgzIDMyNyA1NzYgMjkzVDU1NSAyMTBRNTQ1IDE3NSA1MzkgMTQ3VDUzMiAxMDRRNTMyIDgyIDU0MSA3MlQ1NzEgNTZRNTcyIDU2IDU2OCA0NlQ1NTIgMjJUNTE3IC0xVDQ1NyAtMTJRMzk0IC0xMiAzNjcgMTRUMzM5IDg2UTMzOSAxMDggMzQ0IDEzM1QzNjIgMjAyUTM3MSAyMzQgMzc2IDI1N1QzODEgMjkzUTM4MSAzMjEgMzY3IDMzN1QzMjMgMzUzUTI5OCAzNTMgMjgxIDM0M1QyNDggMzEwTDE4MiAwSC0xMEw5MyA0ODhaTTI0OCA1NDJRMjIzIDU0MiAyMDkgNTU3VDE5MyA1OTNRMTk0IDYyMiAyMDQgNjQ1VDIzMCA2ODRUMjY4IDcwOFQzMTEgNzE3UTMzNyA3MTcgMzU2IDcxMFQzODkgNjkyUTQwNiA2ODEgNDE1IDY3M1Q0MzIgNjY1UTQ0MiA2NjUgNDQ5IDY3NFQ0NjUgNjk1UTQ3MyA3MDYgNDgyIDcxMFQ1MDYgNzE0UTUzMSA3MTQgNTQ1IDY5OVQ1NjEgNjYzUTU2MCA2MzQgNTUwIDYxMlQ1MjQgNTczVDQ4NiA1NDlUNDQzIDU0MFE0MTYgNTQwIDM5OCA1NDhUMzY3IDU2NVEzNTAgNTc4IDM0MiA1ODhUMzIyIDU5OVEzMTIgNTk5IDMwNyA1ODlUMjk0IDU2NFEyODggNTU0IDI3OCA1NDhUMjQ4IDU0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYyOyIgZ2x5cGgtbmFtZT0ib2dyYXZlIiBob3Jpei1hZHYteD0iNTY2IiBkPSJNMjEgMjE0UTIxIDI3MCAzOSAzMjNUOTMgNDE3VDE4MSA0ODNUMzAyIDUwOFEzNjMgNTA4IDQwOCA0OTBUNDg0IDQ0MlQ1MzAgMzcwVDU0NSAyODFRNTQ1IDIyNSA1MjcgMTcyVDQ3MyA3OFQzODUgMTJUMjY0IC0xM1EyMDMgLTEzIDE1OCA1VDgyIDU0VDM2IDEyNlQyMSAyMTRaTTE4MSAyMjJRMTgxIDE4MSAyMDUgMTU1VDI2OCAxMjhRMjk1IDEyOCAzMTYgMTQwVDM1MyAxNzNUMzc2IDIyMFQzODUgMjc0UTM4NSAzMTQgMzYxIDM0MFQyOTggMzY3UTI3MSAzNjcgMjUwIDM1NVQyMTMgMzIyVDE5MCAyNzZUMTgxIDIyMlpNMjIyIDU3OVExOTYgNTk0IDE4MSA2MTdUMTY2IDY2NFExNjYgNjk4IDE4OCA3MjFUMjQ3IDc0NVEyNzkgNzQ1IDMwNiA3MjlRMzMxIDcxNCAzNTEgNjg5VDM4NiA2MzlUNDA3IDU5NFQ0MTAgNTY3UTQwNiA1NjEgMzg4IDU1NVQzNDQgNTQ4VDI4NSA1NTRUMjIyIDU3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYzOyIgZ2x5cGgtbmFtZT0ib2FjdXRlIiBob3Jpei1hZHYteD0iNTY2IiBkPSJNMjEgMjE0UTIxIDI3MCAzOSAzMjNUOTMgNDE3VDE4MSA0ODNUMzAyIDUwOFEzNjMgNTA4IDQwOCA0OTBUNDg0IDQ0MlQ1MzAgMzcwVDU0NSAyODFRNTQ1IDIyNSA1MjcgMTcyVDQ3MyA3OFQzODUgMTJUMjY0IC0xM1EyMDMgLTEzIDE1OCA1VDgyIDU0VDM2IDEyNlQyMSAyMTRaTTE4MSAyMjJRMTgxIDE4MSAyMDUgMTU1VDI2OCAxMjhRMjk1IDEyOCAzMTYgMTQwVDM1MyAxNzNUMzc2IDIyMFQzODUgMjc0UTM4NSAzMTQgMzYxIDM0MFQyOTggMzY3UTI3MSAzNjcgMjUwIDM1NVQyMTMgMzIyVDE5MCAyNzZUMTgxIDIyMlpNMjU3IDU2N1EyNTQgNTczIDI2MSA1OTRUMjg0IDYzOVQzMjIgNjg4VDM3MCA3MjdRMzk3IDc0MiA0MzAgNzQyUTQ2NiA3NDIgNDg4IDcxOFQ1MTAgNjYxUTUxMCA2MzcgNDk0IDYxNFQ0NTEgNTc2UTQxOCA1NTggMzg1IDU1MlQzMjUgNTQ3VDI3OSA1NTVUMjU3IDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY0OyIgZ2x5cGgtbmFtZT0ib2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NjYiIGQ9Ik0yMSAyMTRRMjEgMjcwIDM5IDMyM1Q5MyA0MTdUMTgxIDQ4M1QzMDIgNTA4UTM2MyA1MDggNDA4IDQ5MFQ0ODQgNDQyVDUzMCAzNzBUNTQ1IDI4MVE1NDUgMjI1IDUyNyAxNzJUNDczIDc4VDM4NSAxMlQyNjQgLTEzUTIwMyAtMTMgMTU4IDVUODIgNTRUMzYgMTI2VDIxIDIxNFpNMTgxIDIyMlExODEgMTgxIDIwNSAxNTVUMjY4IDEyOFEyOTUgMTI4IDMxNiAxNDBUMzUzIDE3M1QzNzYgMjIwVDM4NSAyNzRRMzg1IDMxNCAzNjEgMzQwVDI5OCAzNjdRMjcxIDM2NyAyNTAgMzU1VDIxMyAzMjJUMTkwIDI3NlQxODEgMjIyWk0yMzcgNTQxUTIxMCA1NDEgMTk1IDU1OFQxODAgNTk4UTE4MCA2MjQgMTk3IDY0OFQyNDQgNjk0UTI3NCA3MTYgMzA5IDczMVQzNzYgNzU0UTM5NCA3NDggNDE4IDczMlQ0NjQgNjk0UTQ4NCA2NzMgNDk3IDY1MVQ1MTAgNjA4UTUxMCA1NzkgNDkyIDU2MFQ0NDQgNTQxUTQyMCA1NDEgNDAwIDU1NlQzNjYgNTk5UTM2MyA2MDYgMzYwIDYxNFQzNTMgNjMxUTM0NyA2MjMgMzQyIDYxNVQzMjkgNTk5UTMwOSA1NzEgMjg3IDU1NlQyMzcgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjU7IiBnbHlwaC1uYW1lPSJvdGlsZGUiIGhvcml6LWFkdi14PSI1NjYiIGQ9Ik0yMSAyMTRRMjEgMjcwIDM5IDMyM1Q5MyA0MTdUMTgxIDQ4M1QzMDIgNTA4UTM2MyA1MDggNDA4IDQ5MFQ0ODQgNDQyVDUzMCAzNzBUNTQ1IDI4MVE1NDUgMjI1IDUyNyAxNzJUNDczIDc4VDM4NSAxMlQyNjQgLTEzUTIwMyAtMTMgMTU4IDVUODIgNTRUMzYgMTI2VDIxIDIxNFpNMTgxIDIyMlExODEgMTgxIDIwNSAxNTVUMjY4IDEyOFEyOTUgMTI4IDMxNiAxNDBUMzUzIDE3M1QzNzYgMjIwVDM4NSAyNzRRMzg1IDMxNCAzNjEgMzQwVDI5OCAzNjdRMjcxIDM2NyAyNTAgMzU1VDIxMyAzMjJUMTkwIDI3NlQxODEgMjIyWk0yMjAgNTQyUTE5NSA1NDIgMTgxIDU1N1QxNjUgNTkzUTE2NiA2MjIgMTc2IDY0NVQyMDIgNjg0VDI0MCA3MDhUMjgzIDcxN1EzMDkgNzE3IDMyOCA3MTBUMzYxIDY5MlEzNzggNjgxIDM4NyA2NzNUNDA0IDY2NVE0MTQgNjY1IDQyMSA2NzRUNDM3IDY5NVE0NDUgNzA2IDQ1NCA3MTBUNDc4IDcxNFE1MDMgNzE0IDUxNyA2OTlUNTMzIDY2M1E1MzIgNjM0IDUyMiA2MTJUNDk2IDU3M1Q0NTggNTQ5VDQxNSA1NDBRMzg4IDU0MCAzNzAgNTQ4VDMzOSA1NjVRMzIyIDU3OCAzMTQgNTg4VDI5NCA1OTlRMjg0IDU5OSAyNzkgNTg5VDI2NiA1NjRRMjYwIDU1NCAyNTAgNTQ4VDIyMCA1NDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNjsiIGdseXBoLW5hbWU9Im9kaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU2NiIgZD0iTTIxIDIxNFEyMSAyNzAgMzkgMzIzVDkzIDQxN1QxODEgNDgzVDMwMiA1MDhRMzYzIDUwOCA0MDggNDkwVDQ4NCA0NDJUNTMwIDM3MFQ1NDUgMjgxUTU0NSAyMjUgNTI3IDE3MlQ0NzMgNzhUMzg1IDEyVDI2NCAtMTNRMjAzIC0xMyAxNTggNVQ4MiA1NFQzNiAxMjZUMjEgMjE0Wk0xODEgMjIyUTE4MSAxODEgMjA1IDE1NVQyNjggMTI4UTI5NSAxMjggMzE2IDE0MFQzNTMgMTczVDM3NiAyMjBUMzg1IDI3NFEzODUgMzE0IDM2MSAzNDBUMjk4IDM2N1EyNzEgMzY3IDI1MCAzNTVUMjEzIDMyMlQxOTAgMjc2VDE4MSAyMjJaTTQ1OSA1NDFRNDE2IDU0MSAzOTUgNTYyVDM3MyA2MTVRMzczIDY2MSA0MDEgNjg4VDQ2OSA3MTZRNTEyIDcxNiA1MzMgNjk1VDU1NCA2NDFRNTU0IDU5NiA1MjYgNTY5VDQ1OSA1NDFaTTIzMyA1NDFRMTkwIDU0MSAxNjkgNTYyVDE0OCA2MTVRMTQ4IDY2MSAxNzYgNjg4VDI0MyA3MTZRMjg2IDcxNiAzMDcgNjk1VDMyOSA2NDFRMzI5IDU5NiAzMDEgNTY5VDIzMyA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNzsiIGdseXBoLW5hbWU9ImRpdmlkZSIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTMzMSAzNzZRMjY0IDM3NiAyNjQgNDMwUTI2NCA0NDcgMjY5IDQ2OVQyOTAgNTA3UTMwMSA1MTggMzEzIDUyMlQzNTYgNTI3UTQyNCA1MjcgNDI0IDQ3M1E0MjQgNDU2IDQxOCA0MzRUMzk3IDM5NlEzODcgMzg1IDM3NSAzODFUMzMxIDM3NlpNMTExIDE4NFE3NiAxODQgNjAgMTk5VDQ0IDIzOVE0NCAyNTEgNDggMjY4VDY0IDI5N1E3NCAzMDkgODkgMzE1VDEzMCAzMjJINDkzUTUyOCAzMjIgNTQ0IDMwN1Q1NjAgMjY4UTU2MCAyNTUgNTU2IDIzOFQ1NDAgMjEwUTUyOSAxOTcgNTE1IDE5MVQ0NzQgMTg0SDExMVpNMTgwIDM1UTE4MCA1MiAxODUgNzVUMjA2IDExM1EyMTcgMTIzIDIyOSAxMjhUMjczIDEzM1EzNDAgMTMzIDM0MCA3OVEzNDAgNjIgMzM1IDQwVDMxNCAyUTMwMyAtOSAyOTEgLTEzVDI0NyAtMThRMTgwIC0xOCAxODAgMzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGODsiIGdseXBoLW5hbWU9Im9zbGFzaCIgaG9yaXotYWR2LXg9IjU2NiIgZD0iTS0zMCAxUS0zMCAyNCAtNCA0N0w1MiA5OVEyMSAxNTIgMjEgMjE0UTIxIDI3MCAzOSAzMjNUOTMgNDE3VDE4MSA0ODNUMzAyIDUwOFEzNDQgNTA4IDM3OSA0OThUNDQzIDQ2OUw1MzEgNTU0UTUzNCA1NTYgNTQ1IDU1M1Q1NjkgNTQzVDU5MiA1MjNUNjAyIDQ5NlE2MDIgNDcyIDU3NyA0NDdMNTE3IDM5MFE1NDUgMzM5IDU0NSAyODFRNTQ1IDIyNSA1MjcgMTcyVDQ3MyA3OFQzODUgMTJUMjY0IC0xM1EyMjMgLTEzIDE4OSAtNFQxMjcgMjNMNDIgLTU4UTM5IC02MSAyOCAtNThUMyAtNDdULTIwIC0yN1QtMzAgMVpNMzQ1IDM2MVEzMjMgMzc1IDI5NiAzNzVRMjY5IDM3NSAyNDcgMzYyVDIwOSAzMjhUMTg0IDI3OVQxNzUgMjIzUTE3NSAyMTcgMTc1IDIxMlQxNzcgMjAxTDM0NSAzNjFaTTIyNCAxMzNRMjQzIDEyMSAyNzAgMTIxUTI5NyAxMjEgMzE5IDEzNFQzNTcgMTY4VDM4MSAyMTdUMzkwIDI3M1EzOTAgMjc3IDM5MCAyODFUMzg5IDI4OUwyMjQgMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjk7IiBnbHlwaC1uYW1lPSJ1Z3JhdmUiIGhvcml6LWFkdi14PSI2MTUiIGQ9Ik0xNzEgLTEzUTgyIC0xMyA0NiA0OFQzMiAyMTRMOTIgNDk2SDI4NEwyMjYgMjM0UTIxNiAxOTMgMjMwIDE2OFQyODAgMTQzUTMwNSAxNDMgMzIyIDE1M1QzNTUgMTg2TDQyMSA0OTZINjEzTDUzNiAxMzVRNTI2IDkwIDUzMyA3MFQ1NjcgNDJRNTY4IDQyIDU2NSAzNFQ1NTAgMTVUNTE5IC0zVDQ2NyAtMTJRNDA4IC0xMiAzODAgMTRUMzQ4IDg2UTMxNiA0MCAyNzMgMTRUMTcxIC0xM1pNMjQ3IDU3OVEyMjEgNTk0IDIwNiA2MTdUMTkxIDY2NFExOTEgNjk4IDIxMyA3MjFUMjcyIDc0NVEzMDQgNzQ1IDMzMSA3MjlRMzU2IDcxNCAzNzYgNjg5VDQxMSA2MzlUNDMyIDU5NFQ0MzUgNTY3UTQzMSA1NjEgNDEzIDU1NVQzNjkgNTQ4VDMxMCA1NTRUMjQ3IDU3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZBOyIgZ2x5cGgtbmFtZT0idWFjdXRlIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMTcxIC0xM1E4MiAtMTMgNDYgNDhUMzIgMjE0TDkyIDQ5NkgyODRMMjI2IDIzNFEyMTYgMTkzIDIzMCAxNjhUMjgwIDE0M1EzMDUgMTQzIDMyMiAxNTNUMzU1IDE4Nkw0MjEgNDk2SDYxM0w1MzYgMTM1UTUyNiA5MCA1MzMgNzBUNTY3IDQyUTU2OCA0MiA1NjUgMzRUNTUwIDE1VDUxOSAtM1Q0NjcgLTEyUTQwOCAtMTIgMzgwIDE0VDM0OCA4NlEzMTYgNDAgMjczIDE0VDE3MSAtMTNaTTI3NyA1NjdRMjc0IDU3MyAyODEgNTk0VDMwNCA2MzlUMzQyIDY4OFQzOTAgNzI3UTQxNyA3NDIgNDUwIDc0MlE0ODYgNzQyIDUwOCA3MThUNTMwIDY2MVE1MzAgNjM3IDUxNCA2MTRUNDcxIDU3NlE0MzggNTU4IDQwNSA1NTJUMzQ1IDU0N1QyOTkgNTU1VDI3NyA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGdseXBoLW5hbWU9InVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMTcxIC0xM1E4MiAtMTMgNDYgNDhUMzIgMjE0TDkyIDQ5NkgyODRMMjI2IDIzNFEyMTYgMTkzIDIzMCAxNjhUMjgwIDE0M1EzMDUgMTQzIDMyMiAxNTNUMzU1IDE4Nkw0MjEgNDk2SDYxM0w1MzYgMTM1UTUyNiA5MCA1MzMgNzBUNTY3IDQyUTU2OCA0MiA1NjUgMzRUNTUwIDE1VDUxOSAtM1Q0NjcgLTEyUTQwOCAtMTIgMzgwIDE0VDM0OCA4NlEzMTYgNDAgMjczIDE0VDE3MSAtMTNaTTI1NiA1NDFRMjI5IDU0MSAyMTQgNTU4VDE5OSA1OThRMTk5IDYyNCAyMTYgNjQ4VDI2MyA2OTRRMjkzIDcxNiAzMjggNzMxVDM5NSA3NTRRNDEzIDc0OCA0MzcgNzMyVDQ4MyA2OTRRNTAzIDY3MyA1MTYgNjUxVDUyOSA2MDhRNTI5IDU3OSA1MTEgNTYwVDQ2MyA1NDFRNDM5IDU0MSA0MTkgNTU2VDM4NSA1OTlRMzgyIDYwNiAzNzkgNjE0VDM3MiA2MzFRMzY2IDYyMyAzNjEgNjE1VDM0OCA1OTlRMzI4IDU3MSAzMDYgNTU2VDI1NiA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQzsiIGdseXBoLW5hbWU9InVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjYxNSIgZD0iTTE3MSAtMTNRODIgLTEzIDQ2IDQ4VDMyIDIxNEw5MiA0OTZIMjg0TDIyNiAyMzRRMjE2IDE5MyAyMzAgMTY4VDI4MCAxNDNRMzA1IDE0MyAzMjIgMTUzVDM1NSAxODZMNDIxIDQ5Nkg2MTNMNTM2IDEzNVE1MjYgOTAgNTMzIDcwVDU2NyA0MlE1NjggNDIgNTY1IDM0VDU1MCAxNVQ1MTkgLTNUNDY3IC0xMlE0MDggLTEyIDM4MCAxNFQzNDggODZRMzE2IDQwIDI3MyAxNFQxNzEgLTEzWk00NzggNTQxUTQzNSA1NDEgNDE0IDU2MlQzOTIgNjE1UTM5MiA2NjEgNDIwIDY4OFQ0ODggNzE2UTUzMSA3MTYgNTUyIDY5NVQ1NzMgNjQxUTU3MyA1OTYgNTQ1IDU2OVQ0NzggNTQxWk0yNTIgNTQxUTIwOSA1NDEgMTg4IDU2MlQxNjcgNjE1UTE2NyA2NjEgMTk1IDY4OFQyNjIgNzE2UTMwNSA3MTYgMzI2IDY5NVQzNDggNjQxUTM0OCA1OTYgMzIwIDU2OVQyNTIgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkQ7IiBnbHlwaC1uYW1lPSJ5YWN1dGUiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0tNyAtMzhRMSAtNDUgMTcgLTUwVDQ3IC01NVE3NCAtNTUgOTggLTM5VDE1NSAyNEwxNjUgMzhRMTMwIDQ5IDEyMyA5Nkw5NCAzMjJRODYgMzc3IDY4IDM5N1QyMyA0MjFRMjEgNDIxIDI1IDQzNFQ0MSA0NjRUNzcgNDkzVDEzOSA1MDZRMTk1IDUwNiAyMjcgNDY2VDI2NiAzMzVMMjc1IDIwOEw0MjUgNDk2SDYyN0wzMDYgLTQ1UTI4MyAtODEgMjYxIC0xMDlUMjE0IC0xNThUMTYwIC0xOTBUOTYgLTIwMVEyMiAtMjAxIC0xMiAtMTY4US0zNiAtMTQ0IC0zNiAtMTAzUS0zNiAtOTAgLTMyIC03OFQtMjMgLTU3VC0xMyAtNDNULTcgLTM4Wk0yNTggNTY1UTI1NSA1NzEgMjYyIDU5MlQyODUgNjM3VDMyMyA2ODZUMzcxIDcyNVEzOTggNzQwIDQzMSA3NDBRNDY3IDc0MCA0ODkgNzE2VDUxMSA2NTlRNTExIDYzNSA0OTUgNjEyVDQ1MiA1NzRRNDE5IDU1NiAzODYgNTUwVDMyNiA1NDVUMjgwIDU1M1QyNTggNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBnbHlwaC1uYW1lPSJ0aG9ybiIgaG9yaXotYWR2LXg9IjYyOCIgZD0iTTEyMCA2MTJRMTMxIDY2NCAxNTEgNjg0VDIwOCA3MDRIMjI4UTI0NyA3MDQgMjY0IDcwMFQyOTQgNjg1VDMxMSA2NTdUMzExIDYxMkwyNzQgNDM4UTI5OSA0NzAgMzM0IDQ4OVQ0MTYgNTA4UTQ1NiA1MDggNDkxIDQ5NFQ1NTEgNDUzVDU5MSAzODhUNjA2IDMwMFE2MDYgMjQwIDU4OSAxODRUNTM4IDg1VDQ1OSAxNVQzNTQgLTEyUTMwNiAtMTIgMjYzIDhUMTk3IDcxTDE0MiAtMTg2SC01MEwxMjAgNjEyWk0zMTQgMTM0UTM0MCAxMzQgMzYwIDE0NVQzOTQgMTc2VDQxNSAyMjFUNDIyIDI3M1E0MjIgMzEyIDQwMSAzMzVUMzQyIDM1OVEzMTQgMzU5IDI5MCAzNDdUMjQ3IDMxMUwyMzUgMjUzUTIyNCAxOTkgMjQ1IDE2N1QzMTQgMTM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkY7IiBnbHlwaC1uYW1lPSJ5ZGllcmVzaXMiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0tNyAtMzhRMSAtNDUgMTcgLTUwVDQ3IC01NVE3NCAtNTUgOTggLTM5VDE1NSAyNEwxNjUgMzhRMTMwIDQ5IDEyMyA5Nkw5NCAzMjJRODYgMzc3IDY4IDM5N1QyMyA0MjFRMjEgNDIxIDI1IDQzNFQ0MSA0NjRUNzcgNDkzVDEzOSA1MDZRMTk1IDUwNiAyMjcgNDY2VDI2NiAzMzVMMjc1IDIwOEw0MjUgNDk2SDYyN0wzMDYgLTQ1UTI4MyAtODEgMjYxIC0xMDlUMjE0IC0xNThUMTYwIC0xOTBUOTYgLTIwMVEyMiAtMjAxIC0xMiAtMTY4US0zNiAtMTQ0IC0zNiAtMTAzUS0zNiAtOTAgLTMyIC03OFQtMjMgLTU3VC0xMyAtNDNULTcgLTM4Wk00NTYgNTQxUTQxMyA1NDEgMzkyIDU2MlQzNzAgNjE1UTM3MCA2NjEgMzk4IDY4OFQ0NjYgNzE2UTUwOSA3MTYgNTMwIDY5NVQ1NTEgNjQxUTU1MSA1OTYgNTIzIDU2OVQ0NTYgNTQxWk0yMzAgNTQxUTE4NyA1NDEgMTY2IDU2MlQxNDUgNjE1UTE0NSA2NjEgMTczIDY4OFQyNDAgNzE2UTI4MyA3MTYgMzA0IDY5NVQzMjYgNjQxUTMyNiA1OTYgMjk4IDU2OVQyMzAgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAwOyIgZ2x5cGgtbmFtZT0iQW1hY3JvbiIgaG9yaXotYWR2LXg9IjY5MiIgZD0iTTI5MCA1OTdRMjk4IDYxMCAzMDggNjIwVDMzMyA2MzhUMzY5IDY0OVQ0MjAgNjUzUTQ1MyA2NTMgNDc0IDY0OVQ1MDkgNjM3VDUyOSA2MTlUNTM5IDU5Nkw2NDkgMEg0NDVMNDI1IDEzNEgyMTdMMTQ0IDBILTY0TDI5MCA1OTdaTTQxOSAyNzhMMzg4IDQ2NEwyNzkgMjc4SDQxOVpNMzE3IDY5MFEyODQgNjkwIDI2NyA3MDNUMjUwIDczOVEyNTAgNzQ1IDI1MSA3NTRUMjU2IDc3M1QyNjMgNzkzVDI3NSA4MTBRMjg1IDgxOSAyOTcgODIzVDMzOCA4MjhINTczUTYwNiA4MjggNjIzIDgxNVQ2NDAgNzc5UTY0MCA3NjcgNjM1IDc0NVQ2MTUgNzA4UTYwNSA2OTggNTkzIDY5NFQ1NTIgNjkwSDMxN0gzMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDE7IiBnbHlwaC1uYW1lPSJhbWFjcm9uIiBob3Jpei1hZHYteD0iNjQwIiBkPSJNMjEgMTg2UTIxIDI0NyA0MCAzMDVUOTUgNDA4VDE3OSA0ODBUMjg4IDUwOFEzMzMgNTA4IDM3MiA0ODlUNDM0IDQzMUw0NDggNDk2SDY0MEw1NjMgMTM1UTU1MyA5MCA1NjAgNzBUNTk0IDQyUTU5NCA0MiA1OTEgMzRUNTc3IDE1VDU0NiAtM1Q0OTMgLTEyUTQzMyAtMTIgNDA1IDE2VDM3NCA5MVEzNDggNDUgMzA0IDE3VDIwMSAtMTJRMTYxIC0xMiAxMjggMlQ3MSA0MVQzNCAxMDRUMjEgMTg2Wk0yMDUgMjE5UTIwNSAxODIgMjI2IDE2MFQyODEgMTM3UTMyMiAxMzcgMzUyIDE2NFQzOTQgMjQwTDQwNyAzMDBRMzk2IDMyOSAzNzYgMzQ1VDMyMiAzNjJRMjk1IDM2MiAyNzQgMzUwVDIzNyAzMThUMjEzIDI3MlQyMDUgMjE5Wk0yNzAgNTQ2UTIzNyA1NDYgMjIwIDU1OVQyMDMgNTk1UTIwMyA2MDEgMjA0IDYxMFQyMDkgNjI5VDIxNiA2NDlUMjI4IDY2NlEyMzggNjc1IDI1MCA2NzlUMjkxIDY4NEg1MjZRNTU5IDY4NCA1NzYgNjcxVDU5MyA2MzVRNTkzIDYyMyA1ODggNjAxVDU2OCA1NjRRNTU4IDU1NCA1NDYgNTUwVDUwNSA1NDZIMjcwSDI3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMjsiIGdseXBoLW5hbWU9IkFicmV2ZSIgaG9yaXotYWR2LXg9IjY5MiIgZD0iTTI5MCA1OTdRMjk4IDYxMCAzMDggNjIwVDMzMyA2MzhUMzY5IDY0OVQ0MjAgNjUzUTQ1MyA2NTMgNDc0IDY0OVQ1MDkgNjM3VDUyOSA2MTlUNTM5IDU5Nkw2NDkgMEg0NDVMNDI1IDEzNEgyMTdMMTQ0IDBILTY0TDI5MCA1OTdaTTQxOSAyNzhMMzg4IDQ2NEwyNzkgMjc4SDQxOVpNMzA1IDczNFEyNzEgNzY4IDI3MSA4MTFRMjcxIDgzNiAyODcgODU2VDMzNiA4NzZRMzYwIDg3MSAzNzUgODU4VDQwMiA4MzBUNDIzIDgwM1Q0NDYgNzkxUTQ1OSA3OTEgNDcxIDgwMlQ0OTYgODI5VDUyNyA4NTdUNTY3IDg3NlE2MDIgODc2IDYxOSA4NTlUNjM3IDgxOFE2MzcgNzk4IDYyNyA3NzlUNjAwIDc0MlE1NzQgNzE2IDUzNCA3MDFUNDQ2IDY4NVEzOTggNjg1IDM2MyA2OThUMzA1IDczNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMzsiIGdseXBoLW5hbWU9ImFicmV2ZSIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTIxIDE4NlEyMSAyNDcgNDAgMzA1VDk1IDQwOFQxNzkgNDgwVDI4OCA1MDhRMzMzIDUwOCAzNzIgNDg5VDQzNCA0MzFMNDQ4IDQ5Nkg2NDBMNTYzIDEzNVE1NTMgOTAgNTYwIDcwVDU5NCA0MlE1OTQgNDIgNTkxIDM0VDU3NyAxNVQ1NDYgLTNUNDkzIC0xMlE0MzMgLTEyIDQwNSAxNlQzNzQgOTFRMzQ4IDQ1IDMwNCAxN1QyMDEgLTEyUTE2MSAtMTIgMTI4IDJUNzEgNDFUMzQgMTA0VDIxIDE4NlpNMjA1IDIxOVEyMDUgMTgyIDIyNiAxNjBUMjgxIDEzN1EzMjIgMTM3IDM1MiAxNjRUMzk0IDI0MEw0MDcgMzAwUTM5NiAzMjkgMzc2IDM0NVQzMjIgMzYyUTI5NSAzNjIgMjc0IDM1MFQyMzcgMzE4VDIxMyAyNzJUMjA1IDIxOVpNMjYwIDU5MFEyMjYgNjI0IDIyNiA2NjdRMjI2IDY5MiAyNDIgNzEyVDI5MSA3MzJRMzE1IDcyNyAzMzAgNzE0VDM1NyA2ODZUMzc4IDY1OVQ0MDEgNjQ3UTQxNCA2NDcgNDI2IDY1OFQ0NTEgNjg1VDQ4MiA3MTNUNTIyIDczMlE1NTcgNzMyIDU3NCA3MTVUNTkyIDY3NFE1OTIgNjU0IDU4MiA2MzVUNTU1IDU5OFE1MjkgNTcyIDQ4OSA1NTdUNDAxIDU0MVEzNTMgNTQxIDMxOCA1NTRUMjYwIDU5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNDsiIGdseXBoLW5hbWU9IkFvZ29uZWsiIGhvcml6LWFkdi14PSI2OTIiIGQ9Ik0yOTAgNTk3UTI5OCA2MTAgMzA4IDYyMFQzMzMgNjM4VDM2OSA2NDlUNDIwIDY1M1E0NTMgNjUzIDQ3NCA2NDlUNTA5IDYzN1Q1MjkgNjE5VDUzOSA1OTZMNjQ5IDBINTc2UTUzNSAtMjkgNTIwIC00N1Q1MDUgLTgyUTUwNSAtMTA3IDUzMiAtMTA3UTU1MSAtMTA3IDU2MiAtOTFRNTc1IC05NSA1ODMgLTEwNlQ1OTIgLTEzMlE1OTIgLTE2NCA1NjcgLTE4NVQ0ODkgLTIwNlE0NDEgLTIwNiA0MTAgLTE4MlQzNzggLTExN1EzNzggLTgxIDQwNiAtNDlUNDg2IDBINDQ1TDQyNSAxMzRIMjE3TDE0NCAwSC02NEwyOTAgNTk3Wk00MTkgMjc4TDM4OCA0NjRMMjc5IDI3OEg0MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDU7IiBnbHlwaC1uYW1lPSJhb2dvbmVrIiBob3Jpei1hZHYteD0iNjQwIiBkPSJNMjEgMTg2UTIxIDI0NyA0MCAzMDVUOTUgNDA4VDE3OSA0ODBUMjg4IDUwOFEzMzMgNTA4IDM3MiA0ODlUNDM0IDQzMUw0NDggNDk2SDY0MEw1NjMgMTM1UTU1MyA5MCA1NjAgNzBUNTk0IDQyUTU5NCA0MiA1OTIgMzhUNTg2IDI3VDU3MyAxM1Q1NTMgMFE1MzAgLTE2IDUxNSAtMjhUNDkwIC01MVQ0NzcgLTcxVDQ3MyAtODlRNDczIC0xMTQgNTAwIC0xMTRRNTE5IC0xMTQgNTMwIC05OFE1NDMgLTEwMiA1NTEgLTExM1Q1NjAgLTEzOVE1NjAgLTE3MSA1MzUgLTE5MlQ0NTcgLTIxM1E0MDkgLTIxMyAzNzggLTE4OVQzNDYgLTEyNFEzNDYgLTg4IDM3NCAtNTZUNDUyIC03UTQxMyAyIDM5NSAyN1QzNzQgOTFRMzQ4IDQ1IDMwNCAxN1QyMDEgLTEyUTE2MSAtMTIgMTI4IDJUNzEgNDFUMzQgMTA0VDIxIDE4NlpNMjA1IDIxOVEyMDUgMTgyIDIyNiAxNjBUMjgxIDEzN1EzMjIgMTM3IDM1MiAxNjRUMzk0IDI0MEw0MDcgMzAwUTM5NiAzMjkgMzc2IDM0NVQzMjIgMzYyUTI5NSAzNjIgMjc0IDM1MFQyMzcgMzE4VDIxMyAyNzJUMjA1IDIxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNjsiIGdseXBoLW5hbWU9IkNhY3V0ZSIgaG9yaXotYWR2LXg9IjY0NyIgZD0iTTQwIDI3N1E0MCAzNTMgNjcgNDIzVDE0NCA1NDVUMjYxIDYyOVQ0MTEgNjYxUTQ5NiA2NjEgNTQ2IDY0MFQ2MjYgNTkwUTY0NyA1NjkgNjU2IDU0NlQ2NjYgNTA2UTY2NiA0NjcgNjQ2IDQ0NFQ2MDIgNDEwVDU1NyAzOTdUNTM1IDM5N1E1MTkgNDM1IDQ5MCA0NTdUNDE1IDQ3OVEzNzkgNDc5IDM0OSA0NjVUMjk2IDQyNlQyNjAgMzY4VDI0NyAyOThRMjQ3IDI0MSAyODIgMjA1VDM3MyAxNjhRNDU4IDE2OCA1MDQgMjM2UTUwNSAyMzggNTIxIDIzNVQ1NTUgMjIwVDU4OSAxOTBUNjA0IDE0MlE2MDQgMTAzIDU2NCA2M1E1MzIgMzEgNDc5IDlUMzU4IC0xM1EyODUgLTEzIDIyNiA3VDEyNiA2NVQ2MyAxNTdUNDAgMjc3Wk0zMTggNzExUTMxNSA3MTcgMzIyIDczOFQzNDUgNzgzVDM4MyA4MzJUNDMxIDg3MVE0NTggODg2IDQ5MSA4ODZRNTI3IDg4NiA1NDkgODYyVDU3MSA4MDVRNTcxIDc4MSA1NTUgNzU4VDUxMiA3MjBRNDc5IDcwMiA0NDYgNjk2VDM4NiA2OTFUMzQwIDY5OVQzMTggNzExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA3OyIgZ2x5cGgtbmFtZT0iY2FjdXRlIiBob3Jpei1hZHYteD0iNTEyIiBkPSJNMTggMjE0UTE4IDI3NCA0MCAzMjdUMTAwIDQyMFQxOTAgNDg0VDMwMyA1MDhRMzY4IDUwOCA0MTIgNDkxVDQ4MyA0NDdRNTAxIDQyOSA1MDkgNDA5VDUxOCAzNzBRNTE4IDMzNSA1MDAgMzE2VDQ2MCAyODlUNDIwIDI4MFQ0MDAgMjgzUTM5NCAzMTUgMzcyIDMzN1QzMDcgMzU5UTI4MSAzNTkgMjYwIDM0OFQyMjMgMzE5VDE5OSAyNzhUMTkwIDIzMFExOTAgMTkwIDIxNCAxNjRUMjg1IDEzN1EzNDcgMTM3IDM4MCAxOTNRMzgxIDE5NSAzOTQgMTkzVDQyMyAxODJUNDUyIDE1N1Q0NjUgMTE3UTQ2NSA3OCA0MzAgNDVRNDA0IDE5IDM2MyAzVDI2OCAtMTNRMjExIC0xMyAxNjUgMlQ4NyA0NlQzNiAxMThUMTggMjE0Wk0yMzEgNTY3UTIyOCA1NzMgMjM1IDU5NFQyNTggNjM5VDI5NiA2ODhUMzQ0IDcyN1EzNzEgNzQyIDQwNCA3NDJRNDQwIDc0MiA0NjIgNzE4VDQ4NCA2NjFRNDg0IDYzNyA0NjggNjE0VDQyNSA1NzZRMzkyIDU1OCAzNTkgNTUyVDI5OSA1NDdUMjUzIDU1NVQyMzEgNTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA4OyIgZ2x5cGgtbmFtZT0iQ2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2NDciIGQ9Ik00MCAyNzdRNDAgMzUzIDY3IDQyM1QxNDQgNTQ1VDI2MSA2MjlUNDExIDY2MVE0OTYgNjYxIDU0NiA2NDBUNjI2IDU5MFE2NDcgNTY5IDY1NiA1NDZUNjY2IDUwNlE2NjYgNDY3IDY0NiA0NDRUNjAyIDQxMFQ1NTcgMzk3VDUzNSAzOTdRNTE5IDQzNSA0OTAgNDU3VDQxNSA0NzlRMzc5IDQ3OSAzNDkgNDY1VDI5NiA0MjZUMjYwIDM2OFQyNDcgMjk4UTI0NyAyNDEgMjgyIDIwNVQzNzMgMTY4UTQ1OCAxNjggNTA0IDIzNlE1MDUgMjM4IDUyMSAyMzVUNTU1IDIyMFQ1ODkgMTkwVDYwNCAxNDJRNjA0IDEwMyA1NjQgNjNRNTMyIDMxIDQ3OSA5VDM1OCAtMTNRMjg1IC0xMyAyMjYgN1QxMjYgNjVUNjMgMTU3VDQwIDI3N1pNMzI4IDY4NVEzMDEgNjg1IDI4NiA3MDJUMjcxIDc0MlEyNzEgNzY4IDI4OCA3OTJUMzM1IDgzOFEzNjUgODYwIDQwMCA4NzVUNDY3IDg5OFE0ODUgODkyIDUwOSA4NzZUNTU1IDgzOFE1NzUgODE3IDU4OCA3OTVUNjAxIDc1MlE2MDEgNzIzIDU4MyA3MDRUNTM1IDY4NVE1MTEgNjg1IDQ5MSA3MDBUNDU3IDc0M1E0NTQgNzUwIDQ1MSA3NThUNDQ0IDc3NVE0MzggNzY3IDQzMyA3NTlUNDIwIDc0M1E0MDAgNzE1IDM3OCA3MDBUMzI4IDY4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwOTsiIGdseXBoLW5hbWU9ImNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTEyIiBkPSJNMTggMjE0UTE4IDI3NCA0MCAzMjdUMTAwIDQyMFQxOTAgNDg0VDMwMyA1MDhRMzY4IDUwOCA0MTIgNDkxVDQ4MyA0NDdRNTAxIDQyOSA1MDkgNDA5VDUxOCAzNzBRNTE4IDMzNSA1MDAgMzE2VDQ2MCAyODlUNDIwIDI4MFQ0MDAgMjgzUTM5NCAzMTUgMzcyIDMzN1QzMDcgMzU5UTI4MSAzNTkgMjYwIDM0OFQyMjMgMzE5VDE5OSAyNzhUMTkwIDIzMFExOTAgMTkwIDIxNCAxNjRUMjg1IDEzN1EzNDcgMTM3IDM4MCAxOTNRMzgxIDE5NSAzOTQgMTkzVDQyMyAxODJUNDUyIDE1N1Q0NjUgMTE3UTQ2NSA3OCA0MzAgNDVRNDA0IDE5IDM2MyAzVDI2OCAtMTNRMjExIC0xMyAxNjUgMlQ4NyA0NlQzNiAxMThUMTggMjE0Wk0yMTMgNTQxUTE4NiA1NDEgMTcxIDU1OFQxNTYgNTk4UTE1NiA2MjQgMTczIDY0OFQyMjAgNjk0UTI1MCA3MTYgMjg1IDczMVQzNTIgNzU0UTM3MCA3NDggMzk0IDczMlQ0NDAgNjk0UTQ2MCA2NzMgNDczIDY1MVQ0ODYgNjA4UTQ4NiA1NzkgNDY4IDU2MFQ0MjAgNTQxUTM5NiA1NDEgMzc2IDU1NlQzNDIgNTk5UTMzOSA2MDYgMzM2IDYxNFQzMjkgNjMxUTMyMyA2MjMgMzE4IDYxNVQzMDUgNTk5UTI4NSA1NzEgMjYzIDU1NlQyMTMgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBBOyIgZ2x5cGgtbmFtZT0iQ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjY0NyIgZD0iTTQwIDI3N1E0MCAzNTMgNjcgNDIzVDE0NCA1NDVUMjYxIDYyOVQ0MTEgNjYxUTQ5NiA2NjEgNTQ2IDY0MFQ2MjYgNTkwUTY0NyA1NjkgNjU2IDU0NlQ2NjYgNTA2UTY2NiA0NjcgNjQ2IDQ0NFQ2MDIgNDEwVDU1NyAzOTdUNTM1IDM5N1E1MTkgNDM1IDQ5MCA0NTdUNDE1IDQ3OVEzNzkgNDc5IDM0OSA0NjVUMjk2IDQyNlQyNjAgMzY4VDI0NyAyOThRMjQ3IDI0MSAyODIgMjA1VDM3MyAxNjhRNDU4IDE2OCA1MDQgMjM2UTUwNSAyMzggNTIxIDIzNVQ1NTUgMjIwVDU4OSAxOTBUNjA0IDE0MlE2MDQgMTAzIDU2NCA2M1E1MzIgMzEgNDc5IDlUMzU4IC0xM1EyODUgLTEzIDIyNiA3VDEyNiA2NVQ2MyAxNTdUNDAgMjc3Wk00MjkgNjg1UTM4NCA2ODUgMzYyIDcwN1QzMzkgNzYzUTMzOSA4MTEgMzY4IDgzOVQ0MzkgODY4UTQ4NSA4NjggNTA3IDg0NlQ1MjkgNzkxUTUyOSA3NjcgNTIxIDc0OFQ1MDAgNzE0VDQ2OCA2OTNUNDI5IDY4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQjsiIGdseXBoLW5hbWU9ImNkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0xOCAyMTRRMTggMjc0IDQwIDMyN1QxMDAgNDIwVDE5MCA0ODRUMzAzIDUwOFEzNjggNTA4IDQxMiA0OTFUNDgzIDQ0N1E1MDEgNDI5IDUwOSA0MDlUNTE4IDM3MFE1MTggMzM1IDUwMCAzMTZUNDYwIDI4OVQ0MjAgMjgwVDQwMCAyODNRMzk0IDMxNSAzNzIgMzM3VDMwNyAzNTlRMjgxIDM1OSAyNjAgMzQ4VDIyMyAzMTlUMTk5IDI3OFQxOTAgMjMwUTE5MCAxOTAgMjE0IDE2NFQyODUgMTM3UTM0NyAxMzcgMzgwIDE5M1EzODEgMTk1IDM5NCAxOTNUNDIzIDE4MlQ0NTIgMTU3VDQ2NSAxMTdRNDY1IDc4IDQzMCA0NVE0MDQgMTkgMzYzIDNUMjY4IC0xM1EyMTEgLTEzIDE2NSAyVDg3IDQ2VDM2IDExOFQxOCAyMTRaTTMyNiA1NDFRMjgxIDU0MSAyNTkgNTYzVDIzNiA2MTlRMjM2IDY2NyAyNjUgNjk1VDMzNiA3MjRRMzgyIDcyNCA0MDQgNzAyVDQyNiA2NDdRNDI2IDYyMyA0MTggNjA0VDM5NyA1NzBUMzY1IDU0OVQzMjYgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBDOyIgZ2x5cGgtbmFtZT0iQ2Nhcm9uIiBob3Jpei1hZHYteD0iNjQ3IiBkPSJNNDAgMjc3UTQwIDM1MyA2NyA0MjNUMTQ0IDU0NVQyNjEgNjI5VDQxMSA2NjFRNDk2IDY2MSA1NDYgNjQwVDYyNiA1OTBRNjQ3IDU2OSA2NTYgNTQ2VDY2NiA1MDZRNjY2IDQ2NyA2NDYgNDQ0VDYwMiA0MTBUNTU3IDM5N1Q1MzUgMzk3UTUxOSA0MzUgNDkwIDQ1N1Q0MTUgNDc5UTM3OSA0NzkgMzQ5IDQ2NVQyOTYgNDI2VDI2MCAzNjhUMjQ3IDI5OFEyNDcgMjQxIDI4MiAyMDVUMzczIDE2OFE0NTggMTY4IDUwNCAyMzZRNTA1IDIzOCA1MjEgMjM1VDU1NSAyMjBUNTg5IDE5MFQ2MDQgMTQyUTYwNCAxMDMgNTY0IDYzUTUzMiAzMSA0NzkgOVQzNTggLTEzUTI4NSAtMTMgMjI2IDdUMTI2IDY1VDYzIDE1N1Q0MCAyNzdaTTQxNyA2ODBRMzk5IDY4NyAzNzQgNzAzVDMyOCA3NDFRMzA4IDc2MiAyOTYgNzg0VDI4MyA4MjdRMjgzIDg1NiAzMDAgODc1VDM0OCA4OTRRMzc4IDg5NCA0MDMgODcwVDQzOSA4MDRMNDYzIDgzNlE0ODMgODYzIDUwNSA4NzhUNTU1IDg5NFE1ODIgODk0IDU5NyA4NzdUNjEzIDgzNlE2MTMgODEwIDU5NiA3ODZUNTQ4IDc0MVE1MTggNzIwIDQ4NCA3MDRUNDE3IDY4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRDsiIGdseXBoLW5hbWU9ImNjYXJvbiIgaG9yaXotYWR2LXg9IjUxMiIgZD0iTTE4IDIxNFExOCAyNzQgNDAgMzI3VDEwMCA0MjBUMTkwIDQ4NFQzMDMgNTA4UTM2OCA1MDggNDEyIDQ5MVQ0ODMgNDQ3UTUwMSA0MjkgNTA5IDQwOVQ1MTggMzcwUTUxOCAzMzUgNTAwIDMxNlQ0NjAgMjg5VDQyMCAyODBUNDAwIDI4M1EzOTQgMzE1IDM3MiAzMzdUMzA3IDM1OVEyODEgMzU5IDI2MCAzNDhUMjIzIDMxOVQxOTkgMjc4VDE5MCAyMzBRMTkwIDE5MCAyMTQgMTY0VDI4NSAxMzdRMzQ3IDEzNyAzODAgMTkzUTM4MSAxOTUgMzk0IDE5M1Q0MjMgMTgyVDQ1MiAxNTdUNDY1IDExN1E0NjUgNzggNDMwIDQ1UTQwNCAxOSAzNjMgM1QyNjggLTEzUTIxMSAtMTMgMTY1IDJUODcgNDZUMzYgMTE4VDE4IDIxNFpNMzExIDUyOVEyOTMgNTM2IDI2OCA1NTJUMjIyIDU5MFEyMDIgNjExIDE5MCA2MzNUMTc3IDY3NlExNzcgNzA1IDE5NCA3MjRUMjQyIDc0M1EyNzIgNzQzIDI5NyA3MTlUMzMzIDY1M0wzNTcgNjg1UTM3NyA3MTIgMzk5IDcyN1Q0NDkgNzQzUTQ3NiA3NDMgNDkxIDcyNlQ1MDcgNjg1UTUwNyA2NTkgNDkwIDYzNVQ0NDIgNTkwUTQxMiA1NjkgMzc4IDU1M1QzMTEgNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBFOyIgZ2x5cGgtbmFtZT0iRGNhcm9uIiBob3Jpei1hZHYteD0iNjgyIiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0gzNjVRNDM4IDY0NyA0OTUgNjI4VDU5MyA1NzNUNjU0IDQ4OFQ2NzUgMzc3UTY3NSAzMDMgNjUxIDIzNVQ1NzYgMTE0VDQ0OSAzMVQyNzEgMEgtOEwxMDkgNTQ4Wk0yOTYgMTYxUTM0MCAxNjEgMzczIDE3N1Q0MzAgMjIxVDQ2NSAyODJUNDc3IDM1NFE0NzcgNDEzIDQ0MyA0NDlUMzQ3IDQ4NUgyOTNMMjI0IDE2MUgyOTZaTTM5MSA2NzNRMzczIDY4MCAzNDggNjk2VDMwMiA3MzRRMjgyIDc1NSAyNzAgNzc3VDI1NyA4MjBRMjU3IDg0OSAyNzQgODY4VDMyMiA4ODdRMzUyIDg4NyAzNzcgODYzVDQxMyA3OTdMNDM3IDgyOVE0NTcgODU2IDQ3OSA4NzFUNTI5IDg4N1E1NTYgODg3IDU3MSA4NzBUNTg3IDgyOVE1ODcgODAzIDU3MCA3NzlUNTIyIDczNFE0OTIgNzEzIDQ1OCA2OTdUMzkxIDY3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRjsiIGdseXBoLW5hbWU9ImRjYXJvbiIgaG9yaXotYWR2LXg9Ijg2NyIgZD0iTTI0IDE5N1EyNCAyNTcgNDEgMzEzVDkyIDQxMlQxNzEgNDgyVDI3NiA1MDhRMzIzIDUwOCAzNjUgNDg4VDQzMyA0MjdMNDkwIDY5N0g2ODJMNTYzIDEzNVE1NTIgOTAgNTYwIDcwVDU5NCA0MlE1OTQgNDIgNTkxIDM0VDU3NyAxNVQ1NDYgLTNUNDkzIC0xMlE0MzMgLTEyIDQwNiAxNlQzNzUgODlRMzUxIDQ0IDMxMCAxNlQyMTMgLTEyUTE3MiAtMTIgMTM4IDJUNzggNDNUMzkgMTA5VDI0IDE5N1pNNzY3IDY5M1E3NjggNjk1IDc5MSA2OTZUODQzIDY5MVQ4OTUgNjY3VDkxOSA2MTdROTE5IDU5MiA5MDggNTcxVDg2NiA1MTlMNzYwIDQwNlE3NTEgMzk4IDczNCAzOThUNzAwIDQwNlQ2NzUgNDI3VDY3MiA0NjBMNzY3IDY5M1pNMjA4IDIyNFEyMDggMTg1IDIyOSAxNjFUMjg3IDEzN1EzMjQgMTM3IDM1MyAxNjNUMzkzIDIzOEw0MDYgMjk5UTM5NSAzMjggMzc1IDM0NVQzMTcgMzYyUTI5MCAzNjIgMjcwIDM1MVQyMzYgMzIwVDIxNSAyNzZUMjA4IDIyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMDsiIGdseXBoLW5hbWU9IkRjcm9hdCIgaG9yaXotYWR2LXg9IjcyNCIgZD0iTTg3IDI1OEg2OVE0NiAyNTggMzIgMjcwVDE3IDMwM1ExNyAzMTYgMjIgMzM4VDQxIDM3NVE1MCAzODMgNjIgMzg3VDk3IDM5MkgxMTZMMTQ5IDU0OFExNjAgNjAxIDE5MSA2MjRUMjcxIDY0N0g0MTFRNDg0IDY0NyA1NDEgNjI4VDYzNyA1NzNUNjk2IDQ4OFQ3MTcgMzc3UTcxNyAzMDMgNjkzIDIzNVQ2MTkgMTE0VDQ5NCAzMVQzMTYgMEgzM0w4NyAyNThaTTM0MSAxNjFRMzg1IDE2MSA0MTggMTc3VDQ3MyAyMjFUNTA3IDI4MlQ1MTggMzU0UTUxOCA0MTMgNDg2IDQ0NVQzOTEgNDc4SDMzM0wzMTQgMzkySDM2OVEzOTkgMzkyIDQxNSAzNzlUNDMyIDM0NFE0MzIgMzM4IDQzMSAzMjlUNDI2IDMxMVQ0MTkgMjkyVDQwNyAyNzVRMzk4IDI2NiAzODYgMjYyVDM0NiAyNThIMjg2TDI2NSAxNjFIMzQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTExOyIgZ2x5cGgtbmFtZT0iZGNyb2F0IiBob3Jpei1hZHYteD0iNjQwIiBkPSJNMjQgMTk3UTI0IDI1NyA0MSAzMTNUOTIgNDEyVDE3MSA0ODJUMjc2IDUwOFEzMjMgNTA4IDM2NSA0ODhUNDMzIDQyN0w0NTkgNTUzSDM3NlEzNDUgNTUzIDM0NSA1NzFRMzQ1IDU3OSAzNDkgNTk0VDM1OSA2MTVRMzY2IDYyMyAzODUgNjIzSDQ3NEw0OTAgNjk3SDY4Mkw2NjYgNjIzSDcwNlE3MzcgNjIzIDczNyA2MDVRNzM3IDU5NyA3MzMgNTgyVDcyMyA1NjFRNzE2IDU1MyA2OTcgNTUzSDY1MUw1NjMgMTM1UTU1MiA5MCA1NjAgNzBUNTk0IDQyUTU5NCA0MiA1OTEgMzRUNTc3IDE1VDU0NiAtM1Q0OTMgLTEyUTQzMyAtMTIgNDA2IDE2VDM3NSA4OVEzNTEgNDQgMzEwIDE2VDIxMyAtMTJRMTcyIC0xMiAxMzggMlQ3OCA0M1QzOSAxMDlUMjQgMTk3Wk0yMDggMjI0UTIwOCAxODUgMjI5IDE2MVQyODcgMTM3UTMyNCAxMzcgMzUzIDE2M1QzOTMgMjM4TDQwNiAyOTlRMzk1IDMyOCAzNzUgMzQ1VDMxNyAzNjJRMjkwIDM2MiAyNzAgMzUxVDIzNiAzMjBUMjE1IDI3NlQyMDggMjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgZ2x5cGgtbmFtZT0iRW1hY3JvbiIgaG9yaXotYWR2LXg9IjYxNiIgZD0iTTEwOSA1NDhRMTIwIDYwMSAxNTEgNjI0VDIzMSA2NDdINjUwTDYxNSA0ODFIMjk0TDI3OCA0MDNINTI3TDQ5NyAyNTJIMjQ3TDIyOCAxNjhINTU1TDUxOSAwSC05TDEwOSA1NDhaTTMwMCA2OTBRMjY3IDY5MCAyNTAgNzAzVDIzMyA3MzlRMjMzIDc0NSAyMzQgNzU0VDIzOSA3NzNUMjQ2IDc5M1QyNTggODEwUTI2OCA4MTkgMjgwIDgyM1QzMjEgODI4SDU1NlE1ODkgODI4IDYwNiA4MTVUNjIzIDc3OVE2MjMgNzY3IDYxOCA3NDVUNTk4IDcwOFE1ODggNjk4IDU3NiA2OTRUNTM1IDY5MEgzMDBIMzAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEzOyIgZ2x5cGgtbmFtZT0iZW1hY3JvbiIgaG9yaXotYWR2LXg9IjU0NCIgZD0iTTE4IDIwNVExOCAyNzMgNDIgMzI5VDEwOSA0MjRUMjA4IDQ4NlQzMzAgNTA4UTQzMyA1MDggNDg1IDQ2NlQ1MzggMzUzUTUzOCAzMTUgNTI1IDI4NVQ0NzggMjMzVDM5MSAyMDFUMjU0IDE4OVEyMzUgMTg5IDIxNiAxODlUMTc0IDE5MVExODMgMTE4IDI3NiAxMThRMzIwIDExOCAzNTQgMTM3VDQwOSAxODRRNDA5IDE4NCA0MjEgMTgyVDQ0NyAxNzNUNDczIDE1MlQ0ODUgMTE2UTQ4NSA5MCA0NzggNzVUNDU0IDQ0UTQzMCAyMCAzODUgNFQyNzMgLTEzUTIwNyAtMTMgMTU5IDNUODAgNDlUMzMgMTE4VDE4IDIwNVpNMTk0IDI5N1EyMDYgMjk2IDIxNyAyOTZUMjM4IDI5N1EyODAgMjk3IDMwOCAzMDBUMzUyIDMxMVQzNzYgMzI3VDM4MyAzNDhRMzgzIDM2MyAzNjggMzc1VDMyMSAzODhRMjc4IDM4OCAyNDYgMzYyVDE5NCAyOTdaTTIxNiA1NDZRMTgzIDU0NiAxNjYgNTU5VDE0OSA1OTVRMTQ5IDYwMSAxNTAgNjEwVDE1NSA2MjlUMTYyIDY0OVQxNzQgNjY2UTE4NCA2NzUgMTk2IDY3OVQyMzcgNjg0SDQ3MlE1MDUgNjg0IDUyMiA2NzFUNTM5IDYzNVE1MzkgNjIzIDUzNCA2MDFUNTE0IDU2NFE1MDQgNTU0IDQ5MiA1NTBUNDUxIDU0NkgyMTZIMjE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE0OyIgZ2x5cGgtbmFtZT0iRWJyZXZlIiBob3Jpei1hZHYteD0iNjE2IiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0g2NTBMNjE1IDQ4MUgyOTRMMjc4IDQwM0g1MjdMNDk3IDI1MkgyNDdMMjI4IDE2OEg1NTVMNTE5IDBILTlMMTA5IDU0OFpNMjczIDczNFEyMzkgNzY4IDIzOSA4MTFRMjM5IDgzNiAyNTUgODU2VDMwNCA4NzZRMzI4IDg3MSAzNDMgODU4VDM3MCA4MzBUMzkxIDgwM1Q0MTQgNzkxUTQyNyA3OTEgNDM5IDgwMlQ0NjQgODI5VDQ5NSA4NTdUNTM1IDg3NlE1NzAgODc2IDU4NyA4NTlUNjA1IDgxOFE2MDUgNzk4IDU5NSA3NzlUNTY4IDc0MlE1NDIgNzE2IDUwMiA3MDFUNDE0IDY4NVEzNjYgNjg1IDMzMSA2OThUMjczIDczNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNTsiIGdseXBoLW5hbWU9ImVicmV2ZSIgaG9yaXotYWR2LXg9IjU0NCIgZD0iTTE4IDIwNVExOCAyNzMgNDIgMzI5VDEwOSA0MjRUMjA4IDQ4NlQzMzAgNTA4UTQzMyA1MDggNDg1IDQ2NlQ1MzggMzUzUTUzOCAzMTUgNTI1IDI4NVQ0NzggMjMzVDM5MSAyMDFUMjU0IDE4OVEyMzUgMTg5IDIxNiAxODlUMTc0IDE5MVExODMgMTE4IDI3NiAxMThRMzIwIDExOCAzNTQgMTM3VDQwOSAxODRRNDA5IDE4NCA0MjEgMTgyVDQ0NyAxNzNUNDczIDE1MlQ0ODUgMTE2UTQ4NSA5MCA0NzggNzVUNDU0IDQ0UTQzMCAyMCAzODUgNFQyNzMgLTEzUTIwNyAtMTMgMTU5IDNUODAgNDlUMzMgMTE4VDE4IDIwNVpNMTk0IDI5N1EyMDYgMjk2IDIxNyAyOTZUMjM4IDI5N1EyODAgMjk3IDMwOCAzMDBUMzUyIDMxMVQzNzYgMzI3VDM4MyAzNDhRMzgzIDM2MyAzNjggMzc1VDMyMSAzODhRMjc4IDM4OCAyNDYgMzYyVDE5NCAyOTdaTTE5NSA1OTBRMTYxIDYyNCAxNjEgNjY3UTE2MSA2OTIgMTc3IDcxMlQyMjYgNzMyUTI1MCA3MjcgMjY1IDcxNFQyOTIgNjg2VDMxMyA2NTlUMzM2IDY0N1EzNDkgNjQ3IDM2MSA2NThUMzg2IDY4NVQ0MTcgNzEzVDQ1NyA3MzJRNDkyIDczMiA1MDkgNzE1VDUyNyA2NzRRNTI3IDY1NCA1MTcgNjM1VDQ5MCA1OThRNDY0IDU3MiA0MjQgNTU3VDMzNiA1NDFRMjg4IDU0MSAyNTMgNTU0VDE5NSA1OTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTY7IiBnbHlwaC1uYW1lPSJFZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjE2IiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0g2NTBMNjE1IDQ4MUgyOTRMMjc4IDQwM0g1MjdMNDk3IDI1MkgyNDdMMjI4IDE2OEg1NTVMNTE5IDBILTlMMTA5IDU0OFpNNDEzIDY4NVEzNjggNjg1IDM0NiA3MDdUMzIzIDc2M1EzMjMgODExIDM1MiA4MzlUNDIzIDg2OFE0NjkgODY4IDQ5MSA4NDZUNTEzIDc5MVE1MTMgNzY3IDUwNSA3NDhUNDg0IDcxNFQ0NTIgNjkzVDQxMyA2ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTc7IiBnbHlwaC1uYW1lPSJlZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTQ0IiBkPSJNMTggMjA1UTE4IDI3MyA0MiAzMjlUMTA5IDQyNFQyMDggNDg2VDMzMCA1MDhRNDMzIDUwOCA0ODUgNDY2VDUzOCAzNTNRNTM4IDMxNSA1MjUgMjg1VDQ3OCAyMzNUMzkxIDIwMVQyNTQgMTg5UTIzNSAxODkgMjE2IDE4OVQxNzQgMTkxUTE4MyAxMTggMjc2IDExOFEzMjAgMTE4IDM1NCAxMzdUNDA5IDE4NFE0MDkgMTg0IDQyMSAxODJUNDQ3IDE3M1Q0NzMgMTUyVDQ4NSAxMTZRNDg1IDkwIDQ3OCA3NVQ0NTQgNDRRNDMwIDIwIDM4NSA0VDI3MyAtMTNRMjA3IC0xMyAxNTkgM1Q4MCA0OVQzMyAxMThUMTggMjA1Wk0xOTQgMjk3UTIwNiAyOTYgMjE3IDI5NlQyMzggMjk3UTI4MCAyOTcgMzA4IDMwMFQzNTIgMzExVDM3NiAzMjdUMzgzIDM0OFEzODMgMzYzIDM2OCAzNzVUMzIxIDM4OFEyNzggMzg4IDI0NiAzNjJUMTk0IDI5N1pNMzQ5IDU0MVEzMDQgNTQxIDI4MiA1NjNUMjU5IDYxOVEyNTkgNjY3IDI4OCA2OTVUMzU5IDcyNFE0MDUgNzI0IDQyNyA3MDJUNDQ5IDY0N1E0NDkgNjIzIDQ0MSA2MDRUNDIwIDU3MFQzODggNTQ5VDM0OSA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTg7IiBnbHlwaC1uYW1lPSJFb2dvbmVrIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0g2NTBMNjE0IDQ4MUgyOTRMMjc4IDQwM0g1MjdMNDk3IDI1MkgyNDdMMjI4IDE2OEg1NTVMNTE5IDBINDk3UTQ3NSAtMTQgNDYxIC0yNlQ0MzkgLTQ4VDQyNyAtNjZUNDIzIC04NFE0MjMgLTEwOSA0NTAgLTEwOVE0NjkgLTEwOSA0ODAgLTkzUTQ5MyAtOTcgNTAxIC0xMDhUNTEwIC0xMzRRNTEwIC0xNjYgNDg1IC0xODdUNDA3IC0yMDhRMzU5IC0yMDggMzI4IC0xODRUMjk2IC0xMTlRMjk2IC04MSAzMjUgLTQ5VDQwOSAwSC05TDEwOSA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTk7IiBnbHlwaC1uYW1lPSJlb2dvbmVrIiBob3Jpei1hZHYteD0iNTQ0IiBkPSJNMTggMjA1UTE4IDI3MyA0MiAzMjlUMTA5IDQyNFQyMDggNDg2VDMzMCA1MDhRNDMzIDUwOCA0ODUgNDY2VDUzOCAzNTNRNTM4IDMxNSA1MjUgMjg1VDQ3OCAyMzNUMzkxIDIwMVQyNTQgMTg5UTIzNSAxODkgMjE2IDE4OVQxNzQgMTkxUTE4MyAxMTggMjc2IDExOFEzMjAgMTE4IDM1NCAxMzdUNDA5IDE4NFE0MDkgMTg0IDQyMSAxODJUNDQ3IDE3M1Q0NzMgMTUyVDQ4NSAxMTZRNDg1IDkwIDQ3OCA3NVQ0NTQgNDRRNDM4IDI4IDQxNyAxN1EzOTQgMiAzNzkgLTEwVDM1NCAtMzNUMzQxIC01M1QzMzcgLTcxUTMzNyAtOTYgMzY0IC05NlEzODMgLTk2IDM5NCAtODBRNDA3IC04NCA0MTUgLTk1VDQyNCAtMTIxUTQyNCAtMTUzIDM5OSAtMTc0VDMyMSAtMTk1UTI3MyAtMTk1IDI0MiAtMTcxVDIxMCAtMTA2UTIxMCAtODAgMjI1IC01NlQyNjggLTEzUTIwMyAtMTIgMTU2IDRUNzggNTBUMzMgMTE4VDE4IDIwNVpNMTk0IDI5N1EyMDYgMjk2IDIxNyAyOTZUMjM4IDI5N1EyODAgMjk3IDMwOCAzMDBUMzUyIDMxMVQzNzYgMzI3VDM4MyAzNDhRMzgzIDM2MyAzNjggMzc1VDMyMSAzODhRMjc4IDM4OCAyNDYgMzYyVDE5NCAyOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUE7IiBnbHlwaC1uYW1lPSJFY2Fyb24iIGhvcml6LWFkdi14PSI2MTYiIGQ9Ik0xMDkgNTQ4UTEyMCA2MDEgMTUxIDYyNFQyMzEgNjQ3SDY1MEw2MTUgNDgxSDI5NEwyNzggNDAzSDUyN0w0OTcgMjUySDI0N0wyMjggMTY4SDU1NUw1MTkgMEgtOUwxMDkgNTQ4Wk0zOTUgNjczUTM3NyA2ODAgMzUyIDY5NlQzMDYgNzM0UTI4NiA3NTUgMjc0IDc3N1QyNjEgODIwUTI2MSA4NDkgMjc4IDg2OFQzMjYgODg3UTM1NiA4ODcgMzgxIDg2M1Q0MTcgNzk3TDQ0MSA4MjlRNDYxIDg1NiA0ODMgODcxVDUzMyA4ODdRNTYwIDg4NyA1NzUgODcwVDU5MSA4MjlRNTkxIDgwMyA1NzQgNzc5VDUyNiA3MzRRNDk2IDcxMyA0NjIgNjk3VDM5NSA2NzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBnbHlwaC1uYW1lPSJlY2Fyb24iIGhvcml6LWFkdi14PSI1NDQiIGQ9Ik0xOCAyMDVRMTggMjczIDQyIDMyOVQxMDkgNDI0VDIwOCA0ODZUMzMwIDUwOFE0MzMgNTA4IDQ4NSA0NjZUNTM4IDM1M1E1MzggMzE1IDUyNSAyODVUNDc4IDIzM1QzOTEgMjAxVDI1NCAxODlRMjM1IDE4OSAyMTYgMTg5VDE3NCAxOTFRMTgzIDExOCAyNzYgMTE4UTMyMCAxMTggMzU0IDEzN1Q0MDkgMTg0UTQwOSAxODQgNDIxIDE4MlQ0NDcgMTczVDQ3MyAxNTJUNDg1IDExNlE0ODUgOTAgNDc4IDc1VDQ1NCA0NFE0MzAgMjAgMzg1IDRUMjczIC0xM1EyMDcgLTEzIDE1OSAzVDgwIDQ5VDMzIDExOFQxOCAyMDVaTTE5NCAyOTdRMjA2IDI5NiAyMTcgMjk2VDIzOCAyOTdRMjgwIDI5NyAzMDggMzAwVDM1MiAzMTFUMzc2IDMyN1QzODMgMzQ4UTM4MyAzNjMgMzY4IDM3NVQzMjEgMzg4UTI3OCAzODggMjQ2IDM2MlQxOTQgMjk3Wk0zMzIgNTI5UTMxNCA1MzYgMjg5IDU1MlQyNDMgNTkwUTIyMyA2MTEgMjExIDYzM1QxOTggNjc2UTE5OCA3MDUgMjE1IDcyNFQyNjMgNzQzUTI5MyA3NDMgMzE4IDcxOVQzNTQgNjUzTDM3OCA2ODVRMzk4IDcxMiA0MjAgNzI3VDQ3MCA3NDNRNDk3IDc0MyA1MTIgNzI2VDUyOCA2ODVRNTI4IDY1OSA1MTEgNjM1VDQ2MyA1OTBRNDMzIDU2OSAzOTkgNTUzVDMzMiA1MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUM7IiBnbHlwaC1uYW1lPSJHY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjcyNCIgZD0iTTQwIDI2OVE0MCAzNDggNjggNDE5VDE0NiA1NDRUMjY3IDYyOVQ0MjMgNjYxUTUwMyA2NjEgNTYxIDY0MFQ2NTIgNTg2UTY4OSA1NDcgNjg5IDUwNFE2ODkgNDgwIDY4MCA0NjRUNjU4IDQzOFQ2MzAgNDIyVDYwMCA0MTVUNTc2IDQxM1Q1NjUgNDE2UTU0NSA0NDcgNTExIDQ2OFQ0MjkgNDkwUTM5MCA0OTAgMzU3IDQ3NVQyOTggNDMxVDI1OCAzNjZUMjQzIDI4NFEyNDEgMjE4IDI3OCAxNzhUMzc4IDEzN1E0MjUgMTM3IDQ1OSAxNjJRNDczIDE3MyA0ODMgMTg1VDUwMiAyMjRIMzU5TDM5MSAzNzFINjM2UTcxNiAzNzEgNjk3IDI4MEw2NDAgMTRRNjM5IDEwIDYyMiAzVDU3OSAtNVE1NDQgLTUgNTIxIDEwVDQ5MCA1OVE0NjEgMjQgNDE3IDZUMzE0IC0xM1EyNTAgLTEzIDIwMCA2VDExNCA2MlQ1OSAxNTFUNDAgMjY5Wk0zMzUgNjg1UTMwOCA2ODUgMjkzIDcwMlQyNzggNzQyUTI3OCA3NjggMjk1IDc5MlQzNDIgODM4UTM3MiA4NjAgNDA3IDg3NVQ0NzQgODk4UTQ5MiA4OTIgNTE2IDg3NlQ1NjIgODM4UTU4MiA4MTcgNTk1IDc5NVQ2MDggNzUyUTYwOCA3MjMgNTkwIDcwNFQ1NDIgNjg1UTUxOCA2ODUgNDk4IDcwMFQ0NjQgNzQzUTQ2MSA3NTAgNDU4IDc1OFQ0NTEgNzc1UTQ0NSA3NjcgNDQwIDc1OVQ0MjcgNzQzUTQwNyA3MTUgMzg1IDcwMFQzMzUgNjg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFEOyIgZ2x5cGgtbmFtZT0iZ2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MjkiIGQ9Ik0tMyAtNjFRLTMgLTM3IDkgLTE4VDM2IDEzVDY0IDMwVDc5IDMzUTEwMiAtNSAxMzYgLTI1VDIyNCAtNDZRMjg0IC00NiAzMTQgLTIwVDM1NSA1OEwzNjMgOTZRMzM0IDYxIDI5OCA0NVQyMTMgMjhRMTcyIDI4IDEzOCA0MlQ3OSA4M1Q0MSAxNDZUMjcgMjI5UTI3IDI4MSA0NCAzMzFUOTQgNDIwVDE3NSA0ODRUMjg1IDUwOFEzMjkgNTA4IDM2OSA0OTBUNDM1IDQzNUw0NDggNDk2SDY0MEw1NDYgNTdRNTMyIC05IDUwOSAtNTdUNDQ3IC0xMzdUMzUzIC0xODRUMjIxIC0yMDBRMTgxIC0yMDAgMTUxIC0xOTVUOTcgLTE4MVQ1OCAtMTYxVDI5IC0xMzdRLTMgLTEwNiAtMyAtNjFaTTIwOCAyNDlRMjA4IDIxNCAyMzAgMTkzVDI4OSAxNzFRMzMxIDE3MSAzNjAgMTk0VDM5NyAyNTRMNDA4IDMwN1EzOTcgMzMyIDM3NSAzNDZUMzIxIDM2MVEyOTQgMzYxIDI3MyAzNTJUMjM4IDMyN1QyMTYgMjkxVDIwOCAyNDlaTTI2MyA1NDFRMjM2IDU0MSAyMjEgNTU4VDIwNiA1OThRMjA2IDYyNCAyMjMgNjQ4VDI3MCA2OTRRMzAwIDcxNiAzMzUgNzMxVDQwMiA3NTRRNDIwIDc0OCA0NDQgNzMyVDQ5MCA2OTRRNTEwIDY3MyA1MjMgNjUxVDUzNiA2MDhRNTM2IDU3OSA1MTggNTYwVDQ3MCA1NDFRNDQ2IDU0MSA0MjYgNTU2VDM5MiA1OTlRMzg5IDYwNiAzODYgNjE0VDM3OSA2MzFRMzczIDYyMyAzNjggNjE1VDM1NSA1OTlRMzM1IDU3MSAzMTMgNTU2VDI2MyA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBnbHlwaC1uYW1lPSJHYnJldmUiIGhvcml6LWFkdi14PSI3MjQiIGQ9Ik00MCAyNjlRNDAgMzQ4IDY4IDQxOVQxNDYgNTQ0VDI2NyA2MjlUNDIzIDY2MVE1MDMgNjYxIDU2MSA2NDBUNjUyIDU4NlE2ODkgNTQ3IDY4OSA1MDRRNjg5IDQ4MCA2ODAgNDY0VDY1OCA0MzhUNjMwIDQyMlQ2MDAgNDE1VDU3NiA0MTNUNTY1IDQxNlE1NDUgNDQ3IDUxMSA0NjhUNDI5IDQ5MFEzOTAgNDkwIDM1NyA0NzVUMjk4IDQzMVQyNTggMzY2VDI0MyAyODRRMjQxIDIxOCAyNzggMTc4VDM3OCAxMzdRNDI1IDEzNyA0NTkgMTYyUTQ3MyAxNzMgNDgzIDE4NVQ1MDIgMjI0SDM1OUwzOTEgMzcxSDYzNlE3MTYgMzcxIDY5NyAyODBMNjQwIDE0UTYzOSAxMCA2MjIgM1Q1NzkgLTVRNTQ0IC01IDUyMSAxMFQ0OTAgNTlRNDYxIDI0IDQxNyA2VDMxNCAtMTNRMjUwIC0xMyAyMDAgNlQxMTQgNjJUNTkgMTUxVDQwIDI2OVpNMzA2IDczNFEyNzIgNzY4IDI3MiA4MTFRMjcyIDgzNiAyODggODU2VDMzNyA4NzZRMzYxIDg3MSAzNzYgODU4VDQwMyA4MzBUNDI0IDgwM1Q0NDcgNzkxUTQ2MCA3OTEgNDcyIDgwMlQ0OTcgODI5VDUyOCA4NTdUNTY4IDg3NlE2MDMgODc2IDYyMCA4NTlUNjM4IDgxOFE2MzggNzk4IDYyOCA3NzlUNjAxIDc0MlE1NzUgNzE2IDUzNSA3MDFUNDQ3IDY4NVEzOTkgNjg1IDM2NCA2OThUMzA2IDczNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRjsiIGdseXBoLW5hbWU9ImdicmV2ZSIgaG9yaXotYWR2LXg9IjYyOSIgZD0iTS0zIC02MVEtMyAtMzcgOSAtMThUMzYgMTNUNjQgMzBUNzkgMzNRMTAyIC01IDEzNiAtMjVUMjI0IC00NlEyODQgLTQ2IDMxNCAtMjBUMzU1IDU4TDM2MyA5NlEzMzQgNjEgMjk4IDQ1VDIxMyAyOFExNzIgMjggMTM4IDQyVDc5IDgzVDQxIDE0NlQyNyAyMjlRMjcgMjgxIDQ0IDMzMVQ5NCA0MjBUMTc1IDQ4NFQyODUgNTA4UTMyOSA1MDggMzY5IDQ5MFQ0MzUgNDM1TDQ0OCA0OTZINjQwTDU0NiA1N1E1MzIgLTkgNTA5IC01N1Q0NDcgLTEzN1QzNTMgLTE4NFQyMjEgLTIwMFExODEgLTIwMCAxNTEgLTE5NVQ5NyAtMTgxVDU4IC0xNjFUMjkgLTEzN1EtMyAtMTA2IC0zIC02MVpNMjA4IDI0OVEyMDggMjE0IDIzMCAxOTNUMjg5IDE3MVEzMzEgMTcxIDM2MCAxOTRUMzk3IDI1NEw0MDggMzA3UTM5NyAzMzIgMzc1IDM0NlQzMjEgMzYxUTI5NCAzNjEgMjczIDM1MlQyMzggMzI3VDIxNiAyOTFUMjA4IDI0OVpNMjM4IDU5MFEyMDQgNjI0IDIwNCA2NjdRMjA0IDY5MiAyMjAgNzEyVDI2OSA3MzJRMjkzIDcyNyAzMDggNzE0VDMzNSA2ODZUMzU2IDY1OVQzNzkgNjQ3UTM5MiA2NDcgNDA0IDY1OFQ0MjkgNjg1VDQ2MCA3MTNUNTAwIDczMlE1MzUgNzMyIDU1MiA3MTVUNTcwIDY3NFE1NzAgNjU0IDU2MCA2MzVUNTMzIDU5OFE1MDcgNTcyIDQ2NyA1NTdUMzc5IDU0MVEzMzEgNTQxIDI5NiA1NTRUMjM4IDU5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMDsiIGdseXBoLW5hbWU9Ikdkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI3MjQiIGQ9Ik00MCAyNjlRNDAgMzQ4IDY4IDQxOVQxNDYgNTQ0VDI2NyA2MjlUNDIzIDY2MVE1MDMgNjYxIDU2MSA2NDBUNjUyIDU4NlE2ODkgNTQ3IDY4OSA1MDRRNjg5IDQ4MCA2ODAgNDY0VDY1OCA0MzhUNjMwIDQyMlQ2MDAgNDE1VDU3NiA0MTNUNTY1IDQxNlE1NDUgNDQ3IDUxMSA0NjhUNDI5IDQ5MFEzOTAgNDkwIDM1NyA0NzVUMjk4IDQzMVQyNTggMzY2VDI0MyAyODRRMjQxIDIxOCAyNzggMTc4VDM3OCAxMzdRNDI1IDEzNyA0NTkgMTYyUTQ3MyAxNzMgNDgzIDE4NVQ1MDIgMjI0SDM1OUwzOTEgMzcxSDYzNlE3MTYgMzcxIDY5NyAyODBMNjQwIDE0UTYzOSAxMCA2MjIgM1Q1NzkgLTVRNTQ0IC01IDUyMSAxMFQ0OTAgNTlRNDYxIDI0IDQxNyA2VDMxNCAtMTNRMjUwIC0xMyAyMDAgNlQxMTQgNjJUNTkgMTUxVDQwIDI2OVpNNDQ5IDY4NVE0MDQgNjg1IDM4MiA3MDdUMzU5IDc2M1EzNTkgODExIDM4OCA4MzlUNDU5IDg2OFE1MDUgODY4IDUyNyA4NDZUNTQ5IDc5MVE1NDkgNzY3IDU0MSA3NDhUNTIwIDcxNFQ0ODggNjkzVDQ0OSA2ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjE7IiBnbHlwaC1uYW1lPSJnZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjI5IiBkPSJNLTMgLTYxUS0zIC0zNyA5IC0xOFQzNiAxM1Q2NCAzMFQ3OSAzM1ExMDIgLTUgMTM2IC0yNVQyMjQgLTQ2UTI4NCAtNDYgMzE0IC0yMFQzNTUgNThMMzYzIDk2UTMzNCA2MSAyOTggNDVUMjEzIDI4UTE3MiAyOCAxMzggNDJUNzkgODNUNDEgMTQ2VDI3IDIyOVEyNyAyODEgNDQgMzMxVDk0IDQyMFQxNzUgNDg0VDI4NSA1MDhRMzI5IDUwOCAzNjkgNDkwVDQzNSA0MzVMNDQ4IDQ5Nkg2NDBMNTQ2IDU3UTUzMiAtOSA1MDkgLTU3VDQ0NyAtMTM3VDM1MyAtMTg0VDIyMSAtMjAwUTE4MSAtMjAwIDE1MSAtMTk1VDk3IC0xODFUNTggLTE2MVQyOSAtMTM3US0zIC0xMDYgLTMgLTYxWk0yMDggMjQ5UTIwOCAyMTQgMjMwIDE5M1QyODkgMTcxUTMzMSAxNzEgMzYwIDE5NFQzOTcgMjU0TDQwOCAzMDdRMzk3IDMzMiAzNzUgMzQ2VDMyMSAzNjFRMjk0IDM2MSAyNzMgMzUyVDIzOCAzMjdUMjE2IDI5MVQyMDggMjQ5Wk0zNzYgNTQxUTMzMSA1NDEgMzA5IDU2M1QyODYgNjE5UTI4NiA2NjcgMzE1IDY5NVQzODYgNzI0UTQzMiA3MjQgNDU0IDcwMlQ0NzYgNjQ3UTQ3NiA2MjMgNDY4IDYwNFQ0NDcgNTcwVDQxNSA1NDlUMzc2IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMjsiIGdseXBoLW5hbWU9Ikdjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjcyNCIgZD0iTTQwIDI2OVE0MCAzNDggNjggNDE5VDE0NiA1NDRUMjY3IDYyOVQ0MjMgNjYxUTUwMyA2NjEgNTYxIDY0MFQ2NTIgNTg2UTY4OSA1NDcgNjg5IDUwNFE2ODkgNDgwIDY4MCA0NjRUNjU4IDQzOFQ2MzAgNDIyVDYwMCA0MTVUNTc2IDQxM1Q1NjUgNDE2UTU0NSA0NDcgNTExIDQ2OFQ0MjkgNDkwUTM5MCA0OTAgMzU3IDQ3NVQyOTggNDMxVDI1OCAzNjZUMjQzIDI4NFEyNDEgMjE4IDI3OCAxNzhUMzc4IDEzN1E0MjUgMTM3IDQ1OSAxNjJRNDczIDE3MyA0ODMgMTg1VDUwMiAyMjRIMzU5TDM5MSAzNzFINjM2UTcxNiAzNzEgNjk3IDI4MEw2NDAgMTRRNjM5IDEwIDYyMiAzVDU3OSAtNVE1NDQgLTUgNTIxIDEwVDQ5MCA1OVE0NjEgMjQgNDE3IDZUMzE0IC0xM1EyNTAgLTEzIDIwMCA2VDExNCA2MlQ1OSAxNTFUNDAgMjY5Wk0zMDggLTMyUTMwOSAtMzEgMzIwIC0zMFQzNDggLTMwVDM4NCAtMzVUNDIwIC00OVQ0NDggLTcyVDQ1OSAtMTA5UTQ1OSAtMTM1IDQ0OCAtMTU1VDQwNSAtMjA3TDMwMyAtMzA2UTI5NCAtMzE0IDI3NyAtMzE0VDI0NCAtMzA3VDIxOCAtMjg1VDIxNSAtMjUyTDMwOCAtMzJIMzA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIzOyIgZ2x5cGgtbmFtZT0iZ2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjI5IiBkPSJNMjkxIDU5OFEyOTEgNjI0IDMwMiA2NDRUMzQ1IDY5Nkw0NDcgNzk1UTQ1NiA4MDMgNDczIDgwM1Q1MDYgNzk1VDUzMiA3NzRUNTM1IDc0MUw0NDIgNTIxUTQ0MSA1MjAgNDMwIDUxOVQ0MDIgNTE5VDM2NiA1MjRUMzMwIDUzOFQzMDIgNTYxVDI5MSA1OThaTS0zIC02MVEtMyAtMzcgOSAtMThUMzYgMTNUNjQgMzBUNzkgMzNRMTAyIC01IDEzNiAtMjVUMjI0IC00NlEyODQgLTQ2IDMxNCAtMjBUMzU1IDU4TDM2MyA5NlEzMzQgNjEgMjk4IDQ1VDIxMyAyOFExNzIgMjggMTM4IDQyVDc5IDgzVDQxIDE0NlQyNyAyMjlRMjcgMjgxIDQ0IDMzMVQ5NCA0MjBUMTc1IDQ4NFQyODUgNTA4UTMyOSA1MDggMzY5IDQ5MFQ0MzUgNDM1TDQ0OCA0OTZINjQwTDU0NiA1N1E1MzIgLTkgNTA5IC01N1Q0NDcgLTEzN1QzNTMgLTE4NFQyMjEgLTIwMFExODEgLTIwMCAxNTEgLTE5NVQ5NyAtMTgxVDU4IC0xNjFUMjkgLTEzN1EtMyAtMTA2IC0zIC02MVpNMjA4IDI0OVEyMDggMjE0IDIzMCAxOTNUMjg5IDE3MVEzMzEgMTcxIDM2MCAxOTRUMzk3IDI1NEw0MDggMzA3UTM5NyAzMzIgMzc1IDM0NlQzMjEgMzYxUTI5NCAzNjEgMjczIDM1MlQyMzggMzI3VDIxNiAyOTFUMjA4IDI0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNDsiIGdseXBoLW5hbWU9IkhjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjk3IiBkPSJNMTEyIDU2MVExMjMgNjA4IDE0NSA2MzBUMjEwIDY1MkgyMzlRMjgxIDY1MiAzMDIgNjI5VDMxMyA1NThMMjgxIDQwOUg0ODVMNTE3IDU1OVE1MjggNjA3IDU1MCA2MjlUNjE1IDY1Mkg2NDVRNjg3IDY1MiA3MDcgNjI4VDcxOCA1NTdMNTk5IDBIMzk4TDQ0OSAyNDFIMjQ2TDE5NCAwSC04TDExMiA1NjFaTTMzNSA2ODVRMzA4IDY4NSAyOTMgNzAyVDI3OCA3NDJRMjc4IDc2OCAyOTUgNzkyVDM0MiA4MzhRMzcyIDg2MCA0MDcgODc1VDQ3NCA4OThRNDkyIDg5MiA1MTYgODc2VDU2MiA4MzhRNTgyIDgxNyA1OTUgNzk1VDYwOCA3NTJRNjA4IDcyMyA1OTAgNzA0VDU0MiA2ODVRNTE4IDY4NSA0OTggNzAwVDQ2NCA3NDNRNDYxIDc1MCA0NTggNzU4VDQ1MSA3NzVRNDQ1IDc2NyA0NDAgNzU5VDQyNyA3NDNRNDA3IDcxNSAzODUgNzAwVDMzNSA2ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjU7IiBnbHlwaC1uYW1lPSJoY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjYxMSIgZD0iTTEyMCA2MTJRMTMxIDY2NCAxNTEgNjg0VDIwOCA3MDRIMjI4UTI0NyA3MDQgMjY1IDcwMFQyOTUgNjg1VDMxMiA2NTdUMzExIDYxMkwyNjkgNDEyUTI5NiA0NTUgMzM5IDQ4MVQ0MzYgNTA4UTUwNSA1MDggNTQ0IDQ2NVQ1ODMgMzUzUTU4MyAzMjcgNTc2IDI5M1Q1NTUgMjEwUTU0NSAxNzUgNTM5IDE0N1Q1MzIgMTA0UTUzMiA4MiA1NDEgNzJUNTcxIDU2UTU3MiA1NiA1NjggNDZUNTUyIDIyVDUxNyAtMVQ0NTcgLTEyUTM5NCAtMTIgMzY3IDE0VDMzOSA4NlEzMzkgMTA4IDM0NCAxMzNUMzYyIDIwMlEzNzEgMjM0IDM3NiAyNTdUMzgxIDI5M1EzODEgMzIxIDM2NyAzMzdUMzIzIDM1M1EyOTggMzUzIDI4MSAzNDNUMjQ4IDMxMEwxODIgMEgtMTBMMTIwIDYxMlpNMTQyIDcyMlExMTUgNzIyIDEwMCA3MzlUODUgNzc5UTg1IDgwNSAxMDIgODI5VDE0OSA4NzVRMTc5IDg5NyAyMTQgOTEyVDI4MSA5MzVRMjk5IDkyOSAzMjMgOTEzVDM2OSA4NzVRMzg5IDg1NCA0MDIgODMyVDQxNSA3ODlRNDE1IDc2MCAzOTcgNzQxVDM0OSA3MjJRMzI1IDcyMiAzMDUgNzM3VDI3MSA3ODBRMjY4IDc4NyAyNjUgNzk1VDI1OCA4MTJRMjUyIDgwNCAyNDcgNzk2VDIzNCA3ODBRMjE0IDc1MiAxOTIgNzM3VDE0MiA3MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjY7IiBnbHlwaC1uYW1lPSJIYmFyIiBob3Jpei1hZHYteD0iNjk3IiBkPSJNOTQgNDgwSDUwUTE5IDQ4MCAxOSA0OThRMTkgNTA2IDIzIDUyMFQzMyA1NDFRNDAgNTQ5IDU5IDU0OUgxMDlMMTEyIDU2MVExMjMgNjA4IDE0NSA2MzBUMjEwIDY1MkgyMzlRMjgxIDY1MiAzMDIgNjI5VDMxMyA1NThMMzExIDU0OUg1MTVMNTE3IDU1OVE1MjggNjA3IDU1MCA2MjlUNjE1IDY1Mkg2NDVRNjg3IDY1MiA3MDcgNjI4VDcxOCA1NTdMNzE2IDU0OUg3NjJRNzkzIDU0OSA3OTMgNTMxUTc5MyA1MjMgNzg5IDUwOVQ3NzkgNDg4UTc3MiA0ODAgNzUzIDQ4MEg3MDFMNTk5IDBIMzk4TDQ0OSAyNDFIMjQ2TDE5NCAwSC04TDk0IDQ4MFpNNDg1IDQwOUw1MDAgNDgwSDI5NkwyODEgNDA5SDQ4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNzsiIGdseXBoLW5hbWU9ImhiYXIiIGhvcml6LWFkdi14PSI2MTEiIGQ9Ik0xMDcgNTUzSDY3UTM2IDU1MyAzNiA1NzFRMzYgNTc5IDQwIDU5NFQ1MCA2MTVRNTcgNjIzIDc2IDYyM0gxMjJRMTMzIDY2OCAxNTMgNjg2VDIwOCA3MDRIMjI4UTI0NiA3MDQgMjYzIDcwMFQyOTIgNjg3VDMxMCA2NjJUMzEzIDYyM0gzOTdRNDI4IDYyMyA0MjggNjA1UTQyOCA1OTcgNDI0IDU4MlQ0MTQgNTYxUTQwNyA1NTMgMzg4IDU1M0gyOThMMjY5IDQxMlEyOTYgNDU1IDMzOSA0ODFUNDM2IDUwOFE1MDUgNTA4IDU0NCA0NjVUNTgzIDM1M1E1ODMgMzI3IDU3NiAyOTNUNTU1IDIxMFE1NDUgMTc1IDUzOSAxNDdUNTMyIDEwNFE1MzIgODIgNTQxIDcyVDU3MSA1NlE1NzIgNTYgNTY4IDQ2VDU1MiAyMlQ1MTcgLTFUNDU3IC0xMlEzOTQgLTEyIDM2NyAxNFQzMzkgODZRMzM5IDEwOCAzNDQgMTMzVDM2MiAyMDJRMzcxIDIzNCAzNzYgMjU3VDM4MSAyOTNRMzgxIDMyMSAzNjcgMzM3VDMyMyAzNTNRMjk4IDM1MyAyODEgMzQzVDI0OCAzMTBMMTgyIDBILTEwTDEwNyA1NTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkE7IiBnbHlwaC1uYW1lPSJJbWFjcm9uIiBob3Jpei1hZHYteD0iMzA0IiBkPSJNMTE4IDU2MVExMjkgNjA4IDE1MSA2MzBUMjE3IDY1MkgyNDdRMjg4IDY1MiAzMDkgNjI4VDMxOSA1NTdMMjAwIDBILTFMMTE4IDU2MVpNMTI3IDY5MFE5NCA2OTAgNzcgNzAzVDYwIDczOVE2MCA3NDUgNjEgNzU0VDY2IDc3M1Q3MyA3OTNUODUgODEwUTk1IDgxOSAxMDcgODIzVDE0OCA4MjhIMzgzUTQxNiA4MjggNDMzIDgxNVQ0NTAgNzc5UTQ1MCA3NjcgNDQ1IDc0NVQ0MjUgNzA4UTQxNSA2OTggNDAzIDY5NFQzNjIgNjkwSDEyN0gxMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkI7IiBnbHlwaC1uYW1lPSJpbWFjcm9uIiBob3Jpei1hZHYteD0iMjg2IiBkPSJNMTQzIC0xMlExMDEgLTEyIDc1IDBUMzYgMzNUMjAgODJUMjUgMTQyTDEwMSA0OTZIMjkzTDIxNSAxMzVRMjA1IDkwIDIxMyA3MFQyNDggNDJRMjQ4IDQyIDI0NSAzNFQyMzAgMTVUMTk4IC0zVDE0MyAtMTJaTTg0IDU0NlE1MSA1NDYgMzQgNTU5VDE3IDU5NVExNyA2MDEgMTggNjEwVDIzIDYyOVQzMCA2NDlUNDIgNjY2UTUyIDY3NSA2NCA2NzlUMTA1IDY4NEgzNDBRMzczIDY4NCAzOTAgNjcxVDQwNyA2MzVRNDA3IDYyMyA0MDIgNjAxVDM4MiA1NjRRMzcyIDU1NCAzNjAgNTUwVDMxOSA1NDZIODRIODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkU7IiBnbHlwaC1uYW1lPSJJb2dvbmVrIiBob3Jpei1hZHYteD0iMzA0IiBkPSJNMTE4IDU2MVExMjkgNjA4IDE1MSA2MzBUMjE3IDY1MkgyNDdRMjg4IDY1MiAzMDkgNjI4VDMxOSA1NTdMMjAwIDBIMTYxUTExNSAtMzEgOTkgLTUwVDgzIC04N1E4MyAtMTEyIDExMCAtMTEyUTEyOSAtMTEyIDE0MCAtOTZRMTUzIC0xMDAgMTYxIC0xMTFUMTcwIC0xMzdRMTcwIC0xNjkgMTQ1IC0xOTBUNjcgLTIxMVExOSAtMjExIC0xMiAtMTg3VC00NCAtMTIyUS00NCAtODMgLTExIC00OVQ4MCAwSC0xTDExOCA1NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkY7IiBnbHlwaC1uYW1lPSJpb2dvbmVrIiBob3Jpei1hZHYteD0iMjk4IiBkPSJNMjI1IDU1MlExNzcgNTUyIDE1MSA1NzRUMTI1IDYzMVExMjUgNjc4IDE1NSA3MDVUMjMxIDczM1EyNzkgNzMzIDMwNSA3MTFUMzMxIDY1NFEzMzEgNjA4IDMwMSA1ODBUMjI1IDU1MlpNMTA3IC05UTc3IC00IDU4IDlUMzAgNDNUMjAgODhUMjUgMTQyTDEwMSA0OTZIMjkzTDIxNSAxMzVRMjA1IDkwIDIxMyA3MFQyNDggNDJRMjQ4IDQxIDI0MiAyOVQyMTcgNVExODkgLTEzIDE3MSAtMjdUMTQyIC01MlQxMjcgLTc0VDEyMiAtOTNRMTIyIC0xMTggMTQ5IC0xMThRMTY4IC0xMTggMTc5IC0xMDJRMTkyIC0xMDYgMjAwIC0xMTdUMjA5IC0xNDNRMjA5IC0xNzUgMTg0IC0xOTZUMTA2IC0yMTdRNTggLTIxNyAyNyAtMTkzVC01IC0xMjhRLTUgLTkwIDI0IC01OFQxMDcgLTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzA7IiBnbHlwaC1uYW1lPSJJZG90IiBob3Jpei1hZHYteD0iMzA0IiBkPSJNMTE4IDU2MVExMjkgNjA4IDE1MSA2MzBUMjE3IDY1MkgyNDdRMjg4IDY1MiAzMDkgNjI4VDMxOSA1NTdMMjAwIDBILTFMMTE4IDU2MVpNMjUxIDY4NVEyMDYgNjg1IDE4NCA3MDdUMTYxIDc2M1ExNjEgODExIDE5MCA4MzlUMjYxIDg2OFEzMDcgODY4IDMyOSA4NDZUMzUxIDc5MVEzNTEgNzY3IDM0MyA3NDhUMzIyIDcxNFQyOTAgNjkzVDI1MSA2ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzE7IiBnbHlwaC1uYW1lPSJkb3RsZXNzaSIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTE0MyAtMTJRMTAxIC0xMiA3NSAwVDM2IDMzVDIwIDgyVDI1IDE0MkwxMDEgNDk2SDI5M0wyMTUgMTM1UTIwNSA5MCAyMTMgNzBUMjQ4IDQyUTI0OCA0MiAyNDUgMzRUMjMwIDE1VDE5OCAtM1QxNDMgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgZ2x5cGgtbmFtZT0iSmNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MjgiIGQ9Ik0yNiA0M1EtNyA3NiAtNyAxMTVRLTcgMTQ5IDYgMTcwVDM1IDIwNFQ2NSAyMTlUODAgMjIxUTk3IDE5MiAxMjQgMTc1VDE4NiAxNTdRMjMwIDE1NyAyNTQgMTgzVDI5MiAyNjlMMzcyIDY0N0g1NzNMNDg1IDIzNFE0NjAgMTE1IDM5MiA1MVQxOTYgLTEzUTEzNiAtMTMgOTQgMlQyNiA0M1pNMzc0IDY4NVEzNDcgNjg1IDMzMiA3MDJUMzE3IDc0MlEzMTcgNzY4IDMzNCA3OTJUMzgxIDgzOFE0MTEgODYwIDQ0NiA4NzVUNTEzIDg5OFE1MzEgODkyIDU1NSA4NzZUNjAxIDgzOFE2MjEgODE3IDYzNCA3OTVUNjQ3IDc1MlE2NDcgNzIzIDYyOSA3MDRUNTgxIDY4NVE1NTcgNjg1IDUzNyA3MDBUNTAzIDc0M1E1MDAgNzUwIDQ5NyA3NThUNDkwIDc3NVE0ODQgNzY3IDQ3OSA3NTlUNDY2IDc0M1E0NDYgNzE1IDQyNCA3MDBUMzc0IDY4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGdseXBoLW5hbWU9ImpjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMzAxIiBkPSJNMTI4IDU0MVExMDEgNTQxIDg2IDU1OFQ3MSA1OThRNzEgNjI0IDg4IDY0OFQxMzUgNjk0UTE2NSA3MTYgMjAwIDczMVQyNjcgNzU0UTI4NSA3NDggMzA5IDczMlQzNTUgNjk0UTM3NSA2NzMgMzg4IDY1MVQ0MDEgNjA4UTQwMSA1NzkgMzgzIDU2MFQzMzUgNTQxUTMxMSA1NDEgMjkxIDU1NlQyNTcgNTk5UTI1NCA2MDYgMjUxIDYxNFQyNDQgNjMxUTIzOCA2MjMgMjMzIDYxNVQyMjAgNTk5UTIwMCA1NzEgMTc4IDU1NlQxMjggNTQxWk0xMTYgNDk2SDMwOEwxOTcgLTIxUTE3NyAtMTEzIDEzNSAtMTU3VDkgLTIwMVEtMzEgLTIwMSAtNTkgLTE5MlQtMTAzIC0xNjZRLTEyNSAtMTQ0IC0xMjUgLTExMVEtMTI1IC05NSAtMTIwIC04MVQtMTA5IC01N1QtOTggLTQxVC05MiAtMzVRLTg0IC00MyAtNjggLTQ5VC0zOCAtNTVRLTIwIC01NSAtOSAtNDRUMTAgLTJMMTE2IDQ5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNjsiIGdseXBoLW5hbWU9Iktjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjY1MCIgZD0iTTExMiA1NjFRMTIyIDYwOCAxNDQgNjMwVDIxMCA2NTJIMjQwUTI4MiA2NTIgMzAyIDYyOFQzMTMgNTU3TDI3NSAzNzdMNTQ0IDY2MVE1NDUgNjYyIDU2NCA2NThUNjA2IDY0M1Q2NDggNjEzVDY2NyA1NjVRNjY3IDU0MiA2NTUgNTE5VDYxMyA0NjlMNDM2IDMwNkw1MTYgMTczUTUzOSAxMzEgNTYwIDExNVQ2MTIgOTdRNjE0IDk3IDYxMyA4MVQ2MDEgNDVUNTY0IDlUNDkzIC03UTQ2MCAtNyA0MzcgMVQzOTUgMjVUMzYyIDY1VDMzMiAxMjFMMjUyIDI3M0wxOTQgMEgtOEwxMTIgNTYxWk0yMTggLTMyUTIxOSAtMzEgMjMwIC0zMFQyNTggLTMwVDI5NCAtMzVUMzMwIC00OVQzNTggLTcyVDM2OSAtMTA5UTM2OSAtMTM1IDM1OCAtMTU1VDMxNSAtMjA3TDIxMyAtMzA2UTIwNCAtMzE0IDE4NyAtMzE0VDE1NCAtMzA3VDEyOCAtMjg1VDEyNSAtMjUyTDIxOCAtMzJIMjE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM3OyIgZ2x5cGgtbmFtZT0ia2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTU2IiBkPSJNMTM4IDY5N0gzMjlRMzA2IDU4OCAyODggNTA0UTI4MCA0NjcgMjczIDQzM1QyNjAgMzcxUTI1MyAzMzkgMjQ3IDMxMUw0NDkgNTA4UTQ1MCA1MDkgNDY2IDUwNlQ1MDIgNDkyVDUzNyA0NjJUNTUzIDQxMlE1NTMgMzg3IDU0MiAzNjhUNTA3IDMzMEwzOTMgMjM4TDQyOCAxNzJRNDM4IDE0OSA0NDcgMTM0VDQ2NiAxMDlUNDg4IDk2VDUxNiA5MFE1MTggOTAgNTE3IDc0VDUwNSA0MFQ0NzEgNlQ0MDcgLTEwUTM4MSAtMTAgMzYzIC00VDMzMSAxNVQzMDQgNTBUMjc5IDEwM0wyMjggMjIxUTIyNSAyMDUgMjIxIDE4N1EyMTggMTcxIDIxNCAxNTFUMjA1IDExMVExOTQgNjMgMTgyIDBILTEwTDEzOCA2OTdaTTE2NSAtMzJRMTY2IC0zMSAxNzcgLTMwVDIwNSAtMzBUMjQxIC0zNVQyNzcgLTQ5VDMwNSAtNzJUMzE2IC0xMDlRMzE2IC0xMzUgMzA1IC0xNTVUMjYyIC0yMDdMMTYwIC0zMDZRMTUxIC0zMTQgMTM0IC0zMTRUMTAxIC0zMDdUNzUgLTI4NVQ3MiAtMjUyTDE2NSAtMzJIMTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM5OyIgZ2x5cGgtbmFtZT0iTGFjdXRlIiBob3Jpei1hZHYteD0iNTQ3IiBkPSJNMTEyIDU2MVExMjMgNjA4IDE0NSA2MzBUMjEwIDY1MkgyMzlRMjgxIDY1MiAzMDIgNjI5VDMxMyA1NThMMjMwIDE3NEg0MjBRNDYxIDE3NCA0ODIgMTU3VDUwNCAxMTJRNTA0IDEwNSA1MDIgOTRUNDk3IDY5VDQ4NyA0NFQ0NzIgMjNRNDYxIDEyIDQ0NSA2VDM5NCAwSC04TDExMiA1NjFaTTE3MCA3MTFRMTY3IDcxNyAxNzQgNzM4VDE5NyA3ODNUMjM1IDgzMlQyODMgODcxUTMxMCA4ODYgMzQzIDg4NlEzNzkgODg2IDQwMSA4NjJUNDIzIDgwNVE0MjMgNzgxIDQwNyA3NThUMzY0IDcyMFEzMzEgNzAyIDI5OCA2OTZUMjM4IDY5MVQxOTIgNjk5VDE3MCA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0E7IiBnbHlwaC1uYW1lPSJsYWN1dGUiIGhvcml6LWFkdi14PSIyOTgiIGQ9Ik0xNDMgLTEyUTEwMSAtMTIgNzUgMFQzNiAzM1QyMCA4MlQyNSAxNDJMMTQzIDY5N0gzMzVMMjE1IDEzNVEyMDUgOTAgMjEzIDcwVDI0OCA0MlEyNDggNDIgMjQ1IDM0VDIzMCAxNVQxOTggLTNUMTQzIC0xMlpNMTc1IDc1OVExNzIgNzY1IDE3OSA3ODZUMjAyIDgzMVQyNDAgODgwVDI4OCA5MTlRMzE1IDkzNCAzNDggOTM0UTM4NCA5MzQgNDA2IDkxMFQ0MjggODUzUTQyOCA4MjkgNDEyIDgwNlQzNjkgNzY4UTMzNiA3NTAgMzAzIDc0NFQyNDMgNzM5VDE5NyA3NDdUMTc1IDc1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQjsiIGdseXBoLW5hbWU9Ikxjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU0NyIgZD0iTTExMiA1NjFRMTIzIDYwOCAxNDUgNjMwVDIxMCA2NTJIMjM5UTI4MSA2NTIgMzAyIDYyOVQzMTMgNTU4TDIzMCAxNzRINDIwUTQ2MSAxNzQgNDgyIDE1N1Q1MDQgMTEyUTUwNCAxMDUgNTAyIDk0VDQ5NyA2OVQ0ODcgNDRUNDcyIDIzUTQ2MSAxMiA0NDUgNlQzOTQgMEgtOEwxMTIgNTYxWk0xNjAgLTMyUTE2MSAtMzEgMTcyIC0zMFQyMDAgLTMwVDIzNiAtMzVUMjcyIC00OVQzMDAgLTcyVDMxMSAtMTA5UTMxMSAtMTM1IDMwMCAtMTU1VDI1NyAtMjA3TDE1NSAtMzA2UTE0NiAtMzE0IDEyOSAtMzE0VDk2IC0zMDdUNzAgLTI4NVQ2NyAtMjUyTDE2MCAtMzJIMTYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNDOyIgZ2x5cGgtbmFtZT0ibGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iMjk4IiBkPSJNMTQzIC0xMlExMDEgLTEyIDc1IDBUMzYgMzNUMjAgODJUMjUgMTQyTDE0MyA2OTdIMzM1TDIxNSAxMzVRMjA1IDkwIDIxMyA3MFQyNDggNDJRMjQ4IDQyIDI0NSAzNFQyMzAgMTVUMTk4IC0zVDE0MyAtMTJaTTM3IC0zMlEzOCAtMzEgNDkgLTMwVDc3IC0zMFQxMTMgLTM1VDE0OSAtNDlUMTc3IC03MlQxODggLTEwOVExODggLTEzNSAxNzcgLTE1NVQxMzQgLTIwN0wzMiAtMzA2UTIzIC0zMTQgNiAtMzE0VC0yNyAtMzA3VC01MyAtMjg1VC01NiAtMjUyTDM3IC0zMkgzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRDsiIGdseXBoLW5hbWU9IkxjYXJvbiIgaG9yaXotYWR2LXg9IjY3NSIgZD0iTTExMiA1NjFRMTIzIDYwOCAxNDUgNjMwVDIxMCA2NTJIMjM5UTI4MSA2NTIgMzAyIDYyOVQzMTMgNTU4TDIzMCAxNzRINDIwUTQ2MSAxNzQgNDgyIDE1N1Q1MDQgMTEyUTUwNCAxMDUgNTAyIDk0VDQ5NyA2OVQ0ODcgNDRUNDcyIDIzUTQ2MSAxMiA0NDUgNlQzOTQgMEgtOEwxMTIgNTYxWk01OTAgNjUxUTU5MSA2NTMgNjE0IDY1NFQ2NjYgNjQ5VDcxOCA2MjVUNzQyIDU3NVE3NDIgNTUwIDczMSA1MjlUNjg5IDQ3N0w1ODMgMzY0UTU3NCAzNTYgNTU3IDM1NlQ1MjMgMzY0VDQ5OCAzODVUNDk1IDQxOEw1OTAgNjUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNFOyIgZ2x5cGgtbmFtZT0ibGNhcm9uIiBob3Jpei1hZHYteD0iNTIzIiBkPSJNMTQzIC0xMlExMDEgLTEyIDc1IDBUMzYgMzNUMjAgODJUMjUgMTQyTDE0MyA2OTdIMzM1TDIxNSAxMzVRMjA1IDkwIDIxMyA3MFQyNDggNDJRMjQ4IDQyIDI0NSAzNFQyMzAgMTVUMTk4IC0zVDE0MyAtMTJaTTQyMyA2OTVRNDI0IDY5NyA0NDcgNjk4VDQ5OSA2OTNUNTUxIDY2OVQ1NzUgNjE5UTU3NSA1OTQgNTY0IDU3M1Q1MjIgNTIxTDQxNiA0MDhRNDA3IDQwMCAzOTAgNDAwVDM1NiA0MDhUMzMxIDQyOVQzMjggNDYyTDQyMyA2OTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBnbHlwaC1uYW1lPSJMZG90IiBob3Jpei1hZHYteD0iNzQyIiBkPSJNMTEyIDU2MVExMjMgNjA4IDE0NSA2MzBUMjEwIDY1MkgyMzlRMjgxIDY1MiAzMDIgNjI5VDMxMyA1NThMMjMwIDE3NEg0MjBRNDYxIDE3NCA0ODIgMTU3VDUwNCAxMTJRNTA0IDEwNSA1MDIgOTRUNDk3IDY5VDQ4NyA0NFQ0NzIgMjNRNDYxIDEyIDQ0NSA2VDM5NCAwSC04TDExMiA1NjFaTTUzOCAyOTlRNTM4IDMxOSA1NDUgMzQ3VDU3MCAzOTNRNTc2IDM5OSA1ODIgNDAzVDU5OCA0MTBUNjE5IDQxNFQ2NTEgNDE1UTY5MyA0MTUgNzEyIDQwMFQ3MzIgMzUyUTczMiAzMzIgNzI1IDMwNVQ3MDAgMjU4UTY4OCAyNDYgNjcyIDI0MVQ2MTkgMjM2UTU3NyAyMzYgNTU4IDI1MVQ1MzggMjk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQwOyIgZ2x5cGgtbmFtZT0ibGRvdCIgaG9yaXotYWR2LXg9IjU2NSIgZD0iTTE0MyAtMTJRMTAxIC0xMiA3NSAwVDM2IDMzVDIwIDgyVDI1IDE0MkwxNDMgNjk3SDMzNUwyMTUgMTM1UTIwNSA5MCAyMTMgNzBUMjQ4IDQyUTI0OCA0MiAyNDUgMzRUMjMwIDE1VDE5OCAtM1QxNDMgLTEyWk0zNTQgMjc5UTM1NCAyOTkgMzYxIDMyN1QzODYgMzczUTM5MiAzNzkgMzk4IDM4M1Q0MTQgMzkwVDQzNSAzOTRUNDY3IDM5NVE1MDkgMzk1IDUyOCAzODBUNTQ4IDMzMlE1NDggMzEyIDU0MSAyODVUNTE2IDIzOFE1MDQgMjI2IDQ4OCAyMjFUNDM1IDIxNlEzOTMgMjE2IDM3NCAyMzFUMzU0IDI3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MTsiIGdseXBoLW5hbWU9IkxzbGFzaCIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTg3IDE5NEwzNCAxODBRMzIgMTc5IDI4IDE4NFQxOCAyMDFUMTAgMjI3VDYgMjYxUTYgMjc3IDEwIDI5MFQyNSAzMTNUNTUgMzMzVDEwNSAzNTFMMTIyIDM1NkwxNjYgNTYxUTE3NyA2MDggMTk5IDYzMFQyNjQgNjUySDI5M1EzMzUgNjUyIDM1NiA2MjlUMzY3IDU1OEwzMzYgNDE0TDQ2MCA0NDhRNDY0IDQ0OSA0NzUgNDI3VDQ4NyAzNjdRNDg3IDM1MSA0ODMgMzM4VDQ2OCAzMTVUNDM4IDI5NVQzODggMjc3TDMwMSAyNTNMMjg0IDE3NEg0NzRRNTE1IDE3NCA1MzYgMTU3VDU1OCAxMTJRNTU4IDEwNSA1NTYgOTRUNTUxIDY5VDU0MSA0NFQ1MjYgMjNRNTE1IDEyIDQ5OSA2VDQ0OCAwSDQ2TDg3IDE5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MjsiIGdseXBoLW5hbWU9ImxzbGFzaCIgaG9yaXotYWR2LXg9IjQwMSIgZD0iTTkzIDIwNEwyNSAxODlRMjQgMTg5IDIxIDE5NVQxMyAyMTFUNiAyMzRUMyAyNTlRMyAyOTQgMjAgMzE4VDg3IDM1MkwxMjYgMzYyTDE5OCA2OTdIMzg5TDMyNyA0MDRMMzk4IDQyMVEzOTkgNDIxIDQwMiA0MTVUNDA5IDM5OFQ0MTYgMzc2VDQxOSAzNTFRNDE5IDMxNiA0MDIgMjkyVDMzNSAyNTdMMjk0IDI0N0wyNzAgMTM1UTI2MCA5MCAyNjggNzBUMzAyIDQyUTMwMyA0MiAzMDAgMzRUMjg1IDE1VDI1MyAtM1QxOTggLTEyUTE1NiAtMTIgMTMwIDBUOTAgMzNUNzUgODJUODAgMTQyTDkzIDIwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MzsiIGdseXBoLW5hbWU9Ik5hY3V0ZSIgaG9yaXotYWR2LXg9IjcwMyIgZD0iTTExMSA1NTdRMTIyIDYwNSAxNDUgNjI4VDIxMyA2NTJIMjMxUTI2MyA2NTIgMjgyIDY0MFQzMjAgNTk2TDQ4MSAzMDRMNTU0IDY0N0g3NDFMNjIzIDg5UTYxMiA0MSA1ODkgMThUNTIyIC01SDUxMFE0NzkgLTUgNDYwIDdUNDIyIDUxTDI1NSAzNTRMMTgwIDBILThMMTExIDU1N1pNMzQ4IDcxMVEzNDUgNzE3IDM1MiA3MzhUMzc1IDc4M1Q0MTMgODMyVDQ2MSA4NzFRNDg4IDg4NiA1MjEgODg2UTU1NyA4ODYgNTc5IDg2MlQ2MDEgODA1UTYwMSA3ODEgNTg1IDc1OFQ1NDIgNzIwUTUwOSA3MDIgNDc2IDY5NlQ0MTYgNjkxVDM3MCA2OTlUMzQ4IDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NDsiIGdseXBoLW5hbWU9Im5hY3V0ZSIgaG9yaXotYWR2LXg9IjYxMSIgZD0iTTkzIDQ4OFE5NCA0OTEgMTEwIDQ5NVQxNDkgNTAwUTE4NiA1MDAgMjE2IDQ3OVQyNTIgNDA2UTI4NCA0NTMgMzI4IDQ4MFQ0MzIgNTA4UTUwNCA1MDggNTQzIDQ2NVQ1ODMgMzUzUTU4MyAzMjcgNTc2IDI5M1Q1NTUgMjEwUTU0NSAxNzUgNTM5IDE0N1Q1MzIgMTA0UTUzMiA4MiA1NDEgNzJUNTcxIDU2UTU3MiA1NiA1NjggNDZUNTUyIDIyVDUxNyAtMVQ0NTcgLTEyUTM5NCAtMTIgMzY3IDE0VDMzOSA4NlEzMzkgMTA4IDM0NCAxMzNUMzYyIDIwMlEzNzEgMjM0IDM3NiAyNTdUMzgxIDI5M1EzODEgMzIxIDM2NyAzMzdUMzIzIDM1M1EyOTggMzUzIDI4MSAzNDNUMjQ4IDMxMEwxODIgMEgtMTBMOTMgNDg4Wk0yNTIgNTY3UTI0OSA1NzMgMjU2IDU5NFQyNzkgNjM5VDMxNyA2ODhUMzY1IDcyN1EzOTIgNzQyIDQyNSA3NDJRNDYxIDc0MiA0ODMgNzE4VDUwNSA2NjFRNTA1IDYzNyA0ODkgNjE0VDQ0NiA1NzZRNDEzIDU1OCAzODAgNTUyVDMyMCA1NDdUMjc0IDU1NVQyNTIgNTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ1OyIgZ2x5cGgtbmFtZT0iTmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNzAzIiBkPSJNMTExIDU1N1ExMjIgNjA1IDE0NSA2MjhUMjEzIDY1MkgyMzFRMjYzIDY1MiAyODIgNjQwVDMyMCA1OTZMNDgxIDMwNEw1NTQgNjQ3SDc0MUw2MjMgODlRNjEyIDQxIDU4OSAxOFQ1MjIgLTVINTEwUTQ3OSAtNSA0NjAgN1Q0MjIgNTFMMjU1IDM1NEwxODAgMEgtOEwxMTEgNTU3Wk0yMzcgLTMyUTIzOCAtMzEgMjQ5IC0zMFQyNzcgLTMwVDMxMyAtMzVUMzQ5IC00OVQzNzcgLTcyVDM4OCAtMTA5UTM4OCAtMTM1IDM3NyAtMTU1VDMzNCAtMjA3TDIzMiAtMzA2UTIyMyAtMzE0IDIwNiAtMzE0VDE3MyAtMzA3VDE0NyAtMjg1VDE0NCAtMjUyTDIzNyAtMzJIMjM3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ2OyIgZ2x5cGgtbmFtZT0ibmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjExIiBkPSJNOTMgNDg4UTk0IDQ5MSAxMTAgNDk1VDE0OSA1MDBRMTg2IDUwMCAyMTYgNDc5VDI1MiA0MDZRMjg0IDQ1MyAzMjggNDgwVDQzMiA1MDhRNTA0IDUwOCA1NDMgNDY1VDU4MyAzNTNRNTgzIDMyNyA1NzYgMjkzVDU1NSAyMTBRNTQ1IDE3NSA1MzkgMTQ3VDUzMiAxMDRRNTMyIDgyIDU0MSA3MlQ1NzEgNTZRNTcyIDU2IDU2OCA0NlQ1NTIgMjJUNTE3IC0xVDQ1NyAtMTJRMzk0IC0xMiAzNjcgMTRUMzM5IDg2UTMzOSAxMDggMzQ0IDEzM1QzNjIgMjAyUTM3MSAyMzQgMzc2IDI1N1QzODEgMjkzUTM4MSAzMjEgMzY3IDMzN1QzMjMgMzUzUTI5OCAzNTMgMjgxIDM0M1QyNDggMzEwTDE4MiAwSC0xMEw5MyA0ODhaTTE5NSAtMzJRMTk2IC0zMSAyMDcgLTMwVDIzNSAtMzBUMjcxIC0zNVQzMDcgLTQ5VDMzNSAtNzJUMzQ2IC0xMDlRMzQ2IC0xMzUgMzM1IC0xNTVUMjkyIC0yMDdMMTkwIC0zMDZRMTgxIC0zMTQgMTY0IC0zMTRUMTMxIC0zMDdUMTA1IC0yODVUMTAyIC0yNTJMMTk1IC0zMkgxOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDc7IiBnbHlwaC1uYW1lPSJOY2Fyb24iIGhvcml6LWFkdi14PSI3MDMiIGQ9Ik0xMTEgNTU3UTEyMiA2MDUgMTQ1IDYyOFQyMTMgNjUySDIzMVEyNjMgNjUyIDI4MiA2NDBUMzIwIDU5Nkw0ODEgMzA0TDU1NCA2NDdINzQxTDYyMyA4OVE2MTIgNDEgNTg5IDE4VDUyMiAtNUg1MTBRNDc5IC01IDQ2MCA3VDQyMiA1MUwyNTUgMzU0TDE4MCAwSC04TDExMSA1NTdaTTQyMCA2NzNRNDAyIDY4MCAzNzcgNjk2VDMzMSA3MzRRMzExIDc1NSAyOTkgNzc3VDI4NiA4MjBRMjg2IDg0OSAzMDMgODY4VDM1MSA4ODdRMzgxIDg4NyA0MDYgODYzVDQ0MiA3OTdMNDY2IDgyOVE0ODYgODU2IDUwOCA4NzFUNTU4IDg4N1E1ODUgODg3IDYwMCA4NzBUNjE2IDgyOVE2MTYgODAzIDU5OSA3NzlUNTUxIDczNFE1MjEgNzEzIDQ4NyA2OTdUNDIwIDY3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGdseXBoLW5hbWU9Im5jYXJvbiIgaG9yaXotYWR2LXg9IjYxMSIgZD0iTTkzIDQ4OFE5NCA0OTEgMTEwIDQ5NVQxNDkgNTAwUTE4NiA1MDAgMjE2IDQ3OVQyNTIgNDA2UTI4NCA0NTMgMzI4IDQ4MFQ0MzIgNTA4UTUwNCA1MDggNTQzIDQ2NVQ1ODMgMzUzUTU4MyAzMjcgNTc2IDI5M1Q1NTUgMjEwUTU0NSAxNzUgNTM5IDE0N1Q1MzIgMTA0UTUzMiA4MiA1NDEgNzJUNTcxIDU2UTU3MiA1NiA1NjggNDZUNTUyIDIyVDUxNyAtMVQ0NTcgLTEyUTM5NCAtMTIgMzY3IDE0VDMzOSA4NlEzMzkgMTA4IDM0NCAxMzNUMzYyIDIwMlEzNzEgMjM0IDM3NiAyNTdUMzgxIDI5M1EzODEgMzIxIDM2NyAzMzdUMzIzIDM1M1EyOTggMzUzIDI4MSAzNDNUMjQ4IDMxMEwxODIgMEgtMTBMOTMgNDg4Wk0zMzIgNTI5UTMxNCA1MzYgMjg5IDU1MlQyNDMgNTkwUTIyMyA2MTEgMjExIDYzM1QxOTggNjc2UTE5OCA3MDUgMjE1IDcyNFQyNjMgNzQzUTI5MyA3NDMgMzE4IDcxOVQzNTQgNjUzTDM3OCA2ODVRMzk4IDcxMiA0MjAgNzI3VDQ3MCA3NDNRNDk3IDc0MyA1MTIgNzI2VDUyOCA2ODVRNTI4IDY1OSA1MTEgNjM1VDQ2MyA1OTBRNDMzIDU2OSAzOTkgNTUzVDMzMiA1MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEM7IiBnbHlwaC1uYW1lPSJPbWFjcm9uIiBob3Jpei1hZHYteD0iNzI3IiBkPSJNNDEgMjc3UTQxIDM1MiA2NiA0MjFUMTM4IDU0M1QyNTQgNjI5VDQxMSA2NjFRNDg4IDY2MSA1NDUgNjM4VDY0MSA1NzRUNjk5IDQ4MlQ3MTggMzcyUTcxOCAyOTcgNjkzIDIyOFQ2MjEgMTA1VDUwNSAxOVQzNDggLTEzUTI3MSAtMTMgMjEzIDEwVDExNyA3NFQ2MCAxNjZUNDEgMjc3Wk0yNDAgMjkxUTI0MCAyMzcgMjcxIDIwMVQzNTkgMTY0UTM5MyAxNjQgNDIyIDE3OVQ0NzMgMjIwVDUwNyAyODJUNTIwIDM1OFE1MjAgNDEyIDQ4OSA0NDhUNDAwIDQ4NVEzNjYgNDg1IDMzNyA0NzBUMjg3IDQyOVQyNTMgMzY3VDI0MCAyOTFaTTMxNSA2OTBRMjgyIDY5MCAyNjUgNzAzVDI0OCA3MzlRMjQ4IDc0NSAyNDkgNzU0VDI1NCA3NzNUMjYxIDc5M1QyNzMgODEwUTI4MyA4MTkgMjk1IDgyM1QzMzYgODI4SDU3MVE2MDQgODI4IDYyMSA4MTVUNjM4IDc3OVE2MzggNzY3IDYzMyA3NDVUNjEzIDcwOFE2MDMgNjk4IDU5MSA2OTRUNTUwIDY5MEgzMTVIMzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTREOyIgZ2x5cGgtbmFtZT0ib21hY3JvbiIgaG9yaXotYWR2LXg9IjU2NiIgZD0iTTIxIDIxNFEyMSAyNzAgMzkgMzIzVDkzIDQxN1QxODEgNDgzVDMwMiA1MDhRMzYzIDUwOCA0MDggNDkwVDQ4NCA0NDJUNTMwIDM3MFQ1NDUgMjgxUTU0NSAyMjUgNTI3IDE3MlQ0NzMgNzhUMzg1IDEyVDI2NCAtMTNRMjAzIC0xMyAxNTggNVQ4MiA1NFQzNiAxMjZUMjEgMjE0Wk0xODEgMjIyUTE4MSAxODEgMjA1IDE1NVQyNjggMTI4UTI5NSAxMjggMzE2IDE0MFQzNTMgMTczVDM3NiAyMjBUMzg1IDI3NFEzODUgMzE0IDM2MSAzNDBUMjk4IDM2N1EyNzEgMzY3IDI1MCAzNTVUMjEzIDMyMlQxOTAgMjc2VDE4MSAyMjJaTTIwNSA1NDZRMTcyIDU0NiAxNTUgNTU5VDEzOCA1OTVRMTM4IDYwMSAxMzkgNjEwVDE0NCA2MjlUMTUxIDY0OVQxNjMgNjY2UTE3MyA2NzUgMTg1IDY3OVQyMjYgNjg0SDQ2MVE0OTQgNjg0IDUxMSA2NzFUNTI4IDYzNVE1MjggNjIzIDUyMyA2MDFUNTAzIDU2NFE0OTMgNTU0IDQ4MSA1NTBUNDQwIDU0NkgyMDVIMjA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRFOyIgZ2x5cGgtbmFtZT0iT2JyZXZlIiBob3Jpei1hZHYteD0iNzI3IiBkPSJNNDEgMjc3UTQxIDM1MiA2NiA0MjFUMTM4IDU0M1QyNTQgNjI5VDQxMSA2NjFRNDg4IDY2MSA1NDUgNjM4VDY0MSA1NzRUNjk5IDQ4MlQ3MTggMzcyUTcxOCAyOTcgNjkzIDIyOFQ2MjEgMTA1VDUwNSAxOVQzNDggLTEzUTI3MSAtMTMgMjEzIDEwVDExNyA3NFQ2MCAxNjZUNDEgMjc3Wk0yNDAgMjkxUTI0MCAyMzcgMjcxIDIwMVQzNTkgMTY0UTM5MyAxNjQgNDIyIDE3OVQ0NzMgMjIwVDUwNyAyODJUNTIwIDM1OFE1MjAgNDEyIDQ4OSA0NDhUNDAwIDQ4NVEzNjYgNDg1IDMzNyA0NzBUMjg3IDQyOVQyNTMgMzY3VDI0MCAyOTFaTTI5OSA3MzRRMjY1IDc2OCAyNjUgODExUTI2NSA4MzYgMjgxIDg1NlQzMzAgODc2UTM1NCA4NzEgMzY5IDg1OFQzOTYgODMwVDQxNyA4MDNUNDQwIDc5MVE0NTMgNzkxIDQ2NSA4MDJUNDkwIDgyOVQ1MjEgODU3VDU2MSA4NzZRNTk2IDg3NiA2MTMgODU5VDYzMSA4MThRNjMxIDc5OCA2MjEgNzc5VDU5NCA3NDJRNTY4IDcxNiA1MjggNzAxVDQ0MCA2ODVRMzkyIDY4NSAzNTcgNjk4VDI5OSA3MzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEY7IiBnbHlwaC1uYW1lPSJvYnJldmUiIGhvcml6LWFkdi14PSI1NjYiIGQ9Ik0yMSAyMTRRMjEgMjcwIDM5IDMyM1Q5MyA0MTdUMTgxIDQ4M1QzMDIgNTA4UTM2MyA1MDggNDA4IDQ5MFQ0ODQgNDQyVDUzMCAzNzBUNTQ1IDI4MVE1NDUgMjI1IDUyNyAxNzJUNDczIDc4VDM4NSAxMlQyNjQgLTEzUTIwMyAtMTMgMTU4IDVUODIgNTRUMzYgMTI2VDIxIDIxNFpNMTgxIDIyMlExODEgMTgxIDIwNSAxNTVUMjY4IDEyOFEyOTUgMTI4IDMxNiAxNDBUMzUzIDE3M1QzNzYgMjIwVDM4NSAyNzRRMzg1IDMxNCAzNjEgMzQwVDI5OCAzNjdRMjcxIDM2NyAyNTAgMzU1VDIxMyAzMjJUMTkwIDI3NlQxODEgMjIyWk0xODMgNTkwUTE0OSA2MjQgMTQ5IDY2N1ExNDkgNjkyIDE2NSA3MTJUMjE0IDczMlEyMzggNzI3IDI1MyA3MTRUMjgwIDY4NlQzMDEgNjU5VDMyNCA2NDdRMzM3IDY0NyAzNDkgNjU4VDM3NCA2ODVUNDA1IDcxM1Q0NDUgNzMyUTQ4MCA3MzIgNDk3IDcxNVQ1MTUgNjc0UTUxNSA2NTQgNTA1IDYzNVQ0NzggNTk4UTQ1MiA1NzIgNDEyIDU1N1QzMjQgNTQxUTI3NiA1NDEgMjQxIDU1NFQxODMgNTkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUwOyIgZ2x5cGgtbmFtZT0iT2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjcyNyIgZD0iTTQxIDI3N1E0MSAzNTIgNjYgNDIxVDEzOCA1NDNUMjU0IDYyOVQ0MTEgNjYxUTQ4OCA2NjEgNTQ1IDYzOFQ2NDEgNTc0VDY5OSA0ODJUNzE4IDM3MlE3MTggMjk3IDY5MyAyMjhUNjIxIDEwNVQ1MDUgMTlUMzQ4IC0xM1EyNzEgLTEzIDIxMyAxMFQxMTcgNzRUNjAgMTY2VDQxIDI3N1pNMjQwIDI5MVEyNDAgMjM3IDI3MSAyMDFUMzU5IDE2NFEzOTMgMTY0IDQyMiAxNzlUNDczIDIyMFQ1MDcgMjgyVDUyMCAzNThRNTIwIDQxMiA0ODkgNDQ4VDQwMCA0ODVRMzY2IDQ4NSAzMzcgNDcwVDI4NyA0MjlUMjUzIDM2N1QyNDAgMjkxWk00NzAgNzExUTQ2NyA3MTcgNDc0IDczN1Q0OTUgNzgzVDUzMSA4MzJUNTc4IDg3MlE2MDcgODg4IDYzMiA4ODhRNjY4IDg4OCA2OTMgODY3VDcxOCA4MTRRNzE4IDc4OCA3MDMgNzYyVDY2MSA3MjFRNjI5IDcwMyA1OTcgNjk3VDUzNyA2OTJUNDkyIDY5OVQ0NzAgNzExWk0yMjMgNzExUTIxOSA3MTcgMjI2IDczN1QyNDggNzgzVDI4NCA4MzJUMzMxIDg3MlEzNjAgODg4IDM4NSA4ODhRNDIxIDg4OCA0NDYgODY3VDQ3MSA4MTRRNDcxIDc4OCA0NTYgNzYyVDQxNCA3MjFRMzgyIDcwMyAzNTAgNjk3VDI5MCA2OTJUMjQ1IDY5OVQyMjMgNzExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUxOyIgZ2x5cGgtbmFtZT0ib2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjU2NiIgZD0iTTIxIDIxNFEyMSAyNzAgMzkgMzIzVDkzIDQxN1QxODEgNDgzVDMwMiA1MDhRMzYzIDUwOCA0MDggNDkwVDQ4NCA0NDJUNTMwIDM3MFQ1NDUgMjgxUTU0NSAyMjUgNTI3IDE3MlQ0NzMgNzhUMzg1IDEyVDI2NCAtMTNRMjAzIC0xMyAxNTggNVQ4MiA1NFQzNiAxMjZUMjEgMjE0Wk0xODEgMjIyUTE4MSAxODEgMjA1IDE1NVQyNjggMTI4UTI5NSAxMjggMzE2IDE0MFQzNTMgMTczVDM3NiAyMjBUMzg1IDI3NFEzODUgMzE0IDM2MSAzNDBUMjk4IDM2N1EyNzEgMzY3IDI1MCAzNTVUMjEzIDMyMlQxOTAgMjc2VDE4MSAyMjJaTTM2NCA1NjdRMzYxIDU3MyAzNjggNTkzVDM4OSA2MzlUNDI1IDY4OFQ0NzIgNzI4UTUwMSA3NDQgNTI2IDc0NFE1NjIgNzQ0IDU4NyA3MjNUNjEyIDY3MFE2MTIgNjQ0IDU5NyA2MThUNTU1IDU3N1E1MjMgNTU5IDQ5MSA1NTNUNDMxIDU0OFQzODYgNTU1VDM2NCA1NjdaTTExNyA1NjdRMTEzIDU3MyAxMjAgNTkzVDE0MiA2MzlUMTc4IDY4OFQyMjUgNzI4UTI1NCA3NDQgMjc5IDc0NFEzMTUgNzQ0IDM0MCA3MjNUMzY1IDY3MFEzNjUgNjQ0IDM1MCA2MThUMzA4IDU3N1EyNzYgNTU5IDI0NCA1NTNUMTg0IDU0OFQxMzkgNTU1VDExNyA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTI7IiBnbHlwaC1uYW1lPSJPRSIgaG9yaXotYWR2LXg9IjEwMjgiIGQ9Ik00MSAyNzdRNDEgMzUyIDY2IDQyMVQxMzggNTQzVDI1NCA2MjlUNDExIDY2MVE0NjYgNjYxIDUxNiA2NDdIMTA2MkwxMDI3IDQ3NUg3MDFRNzEyIDQ0MSA3MTcgNDA1SDk0MEw5MDkgMjUwSDY5OVE2OTQgMjI4IDY4NCAyMDZUNjY0IDE2OEg5NjlMOTMyIDBINDQ5UTQyNiAtNiA0MDEgLTlUMzQ4IC0xM1EyNzEgLTEzIDIxMyAxMFQxMTcgNzRUNjAgMTY2VDQxIDI3N1pNMjQwIDI5MVEyNDAgMjM3IDI3MSAyMDFUMzU5IDE2NFEzOTMgMTY0IDQyMiAxNzlUNDczIDIyMFQ1MDcgMjgyVDUyMCAzNThRNTIwIDQxMiA0ODkgNDQ4VDQwMCA0ODVRMzY2IDQ4NSAzMzcgNDcwVDI4NyA0MjlUMjUzIDM2N1QyNDAgMjkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUzOyIgZ2x5cGgtbmFtZT0ib2UiIGhvcml6LWFkdi14PSI5MjMiIGQ9Ik0yMSAyMTRRMjEgMjcwIDM5IDMyM1Q5MiA0MTdUMTc4IDQ4M1QyOTYgNTA4UTM2NiA1MDggNDE2IDQ4MlQ0OTMgNDEwUTUzMiA0NTYgNTg1IDQ4MlQ3MTMgNTA4UTgxMyA1MDggODY1IDQ2NlQ5MTcgMzUzUTkxNyAzMTUgOTA0IDI4NVQ4NTggMjMzVDc3MCAyMDFUNjMzIDE4OVE2MTQgMTg5IDU5NSAxODlUNTUzIDE5MVE1NjIgMTE4IDY1NSAxMThRNzAwIDExOCA3MzMgMTM3VDc4OCAxODRRNzg4IDE4NCA4MDAgMTgyVDgyNyAxNzNUODUzIDE1MlQ4NjUgMTE2UTg2NSA5MCA4NTcgNzVUODM0IDQ0UTgwOSAyMCA3NjQgNFQ2NTMgLTEzUTU4MyAtMTMgNTMxIDlUNDUyIDc0UTQxNyAzNSAzNjkgMTFUMjU3IC0xM1ExOTggLTEzIDE1NCA1VDgwIDUzVDM2IDEyNVQyMSAyMTRaTTU3MyAyOTdRNTg1IDI5NiA1OTUgMjk2VDYxNyAyOTdRNjU5IDI5NyA2ODcgMzAwVDczMiAzMTFUNzU2IDMyN1Q3NjMgMzQ4UTc2MyAzNjMgNzQ4IDM3NVQ3MDEgMzg4UTY1OCAzODggNjI2IDM2MlQ1NzMgMjk3Wk0xODEgMjIyUTE4MSAxODEgMjA1IDE1NVQyNjggMTI4UTI5NSAxMjggMzE2IDE0MFQzNTMgMTczVDM3NiAyMjBUMzg1IDI3NFEzODUgMzE0IDM2MSAzNDBUMjk4IDM2N1EyNzEgMzY3IDI1MCAzNTVUMjEzIDMyMlQxOTAgMjc2VDE4MSAyMjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTQ7IiBnbHlwaC1uYW1lPSJSYWN1dGUiIGhvcml6LWFkdi14PSI2NDQiIGQ9Ik0xMDkgNTQ4UTEyMCA2MDEgMTUxIDYyNFQyMzEgNjQ3SDM5M1E1MjcgNjQ3IDU5MSA1OThUNjU1IDQ1M1E2NTUgNDExIDY0MyAzNzVUNjA2IDMxMFQ1NDcgMjYyVDQ2NSAyMzNMNTAxIDE3NFE1MTQgMTUzIDUyNSAxNDBUNTQ2IDExOFQ1NjkgMTA1VDU5NyA5OVE2MDAgOTggNTk5IDgyVDU4NyA0NlQ1NTAgMTBUNDc2IC03UTQ0OSAtNyA0MjggLTFUMzg4IDE5VDM1MyA1N1QzMTggMTE3TDI3MyAyMDJIMjM1TDE5MSAwSC05TDEwOSA1NDhaTTM1MCAzNDRRNDA1IDM0NCA0MjkgMzY5VDQ1MyA0MzJRNDUzIDQ5NiAzNzAgNDk2SDI5NUwyNjIgMzQ0SDM1MFpNMjk2IDcxMVEyOTMgNzE3IDMwMCA3MzhUMzIzIDc4M1QzNjEgODMyVDQwOSA4NzFRNDM2IDg4NiA0NjkgODg2UTUwNSA4ODYgNTI3IDg2MlQ1NDkgODA1UTU0OSA3ODEgNTMzIDc1OFQ0OTAgNzIwUTQ1NyA3MDIgNDI0IDY5NlQzNjQgNjkxVDMxOCA2OTlUMjk2IDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGdseXBoLW5hbWU9InJhY3V0ZSIgaG9yaXotYWR2LXg9IjQ2NSIgZD0iTTkzIDQ4OFE5NCA0OTEgMTEwIDQ5NVQxNDkgNTAwUTE4NiA1MDAgMjE2IDQ3OVQyNTIgNDA2UTI3MyA0NTIgMzA4IDQ4MFQzODkgNTA4UTQzMSA1MDggNDU4IDQ4NVQ0ODYgNDI0UTQ4NiAzODkgNDczIDM2NlQ0NDMgMzI4VDQxNCAzMDhUMzk5IDMwM1EzODggMzE2IDM3MiAzMjVUMzI4IDMzNFEyODcgMzM0IDI2MyAyOTlUMjI0IDIwMUwxODEgMEgtMTFMOTMgNDg4Wk0xOTYgNTY3UTE5MyA1NzMgMjAwIDU5NFQyMjMgNjM5VDI2MSA2ODhUMzA5IDcyN1EzMzYgNzQyIDM2OSA3NDJRNDA1IDc0MiA0MjcgNzE4VDQ0OSA2NjFRNDQ5IDYzNyA0MzMgNjE0VDM5MCA1NzZRMzU3IDU1OCAzMjQgNTUyVDI2NCA1NDdUMjE4IDU1NVQxOTYgNTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU2OyIgZ2x5cGgtbmFtZT0iUmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjQ0IiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0gzOTNRNTI3IDY0NyA1OTEgNTk4VDY1NSA0NTNRNjU1IDQxMSA2NDMgMzc1VDYwNiAzMTBUNTQ3IDI2MlQ0NjUgMjMzTDUwMSAxNzRRNTE0IDE1MyA1MjUgMTQwVDU0NiAxMThUNTY5IDEwNVQ1OTcgOTlRNjAwIDk4IDU5OSA4MlQ1ODcgNDZUNTUwIDEwVDQ3NiAtN1E0NDkgLTcgNDI4IC0xVDM4OCAxOVQzNTMgNTdUMzE4IDExN0wyNzMgMjAySDIzNUwxOTEgMEgtOUwxMDkgNTQ4Wk0zNTAgMzQ0UTQwNSAzNDQgNDI5IDM2OVQ0NTMgNDMyUTQ1MyA0OTYgMzcwIDQ5NkgyOTVMMjYyIDM0NEgzNTBaTTIxOSAtMzJRMjIwIC0zMSAyMzEgLTMwVDI1OSAtMzBUMjk1IC0zNVQzMzEgLTQ5VDM1OSAtNzJUMzcwIC0xMDlRMzcwIC0xMzUgMzU5IC0xNTVUMzE2IC0yMDdMMjE0IC0zMDZRMjA1IC0zMTQgMTg4IC0zMTRUMTU1IC0zMDdUMTI5IC0yODVUMTI2IC0yNTJMMjE5IC0zMkgyMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTc7IiBnbHlwaC1uYW1lPSJyY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0NjUiIGQ9Ik05MyA0ODhROTQgNDkxIDExMCA0OTVUMTQ5IDUwMFExODYgNTAwIDIxNiA0NzlUMjUyIDQwNlEyNzMgNDUyIDMwOCA0ODBUMzg5IDUwOFE0MzEgNTA4IDQ1OCA0ODVUNDg2IDQyNFE0ODYgMzg5IDQ3MyAzNjZUNDQzIDMyOFQ0MTQgMzA4VDM5OSAzMDNRMzg4IDMxNiAzNzIgMzI1VDMyOCAzMzRRMjg3IDMzNCAyNjMgMjk5VDIyNCAyMDFMMTgxIDBILTExTDkzIDQ4OFpNMTEgLTMyUTEyIC0zMSAyMyAtMzBUNTEgLTMwVDg3IC0zNVQxMjMgLTQ5VDE1MSAtNzJUMTYyIC0xMDlRMTYyIC0xMzUgMTUxIC0xNTVUMTA4IC0yMDdMNiAtMzA2US0zIC0zMTQgLTIwIC0zMTRULTUzIC0zMDdULTc5IC0yODVULTgyIC0yNTJMMTEgLTMySDExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU4OyIgZ2x5cGgtbmFtZT0iUmNhcm9uIiBob3Jpei1hZHYteD0iNjQ0IiBkPSJNMTA5IDU0OFExMjAgNjAxIDE1MSA2MjRUMjMxIDY0N0gzOTNRNTI3IDY0NyA1OTEgNTk4VDY1NSA0NTNRNjU1IDQxMSA2NDMgMzc1VDYwNiAzMTBUNTQ3IDI2MlQ0NjUgMjMzTDUwMSAxNzRRNTE0IDE1MyA1MjUgMTQwVDU0NiAxMThUNTY5IDEwNVQ1OTcgOTlRNjAwIDk4IDU5OSA4MlQ1ODcgNDZUNTUwIDEwVDQ3NiAtN1E0NDkgLTcgNDI4IC0xVDM4OCAxOVQzNTMgNTdUMzE4IDExN0wyNzMgMjAySDIzNUwxOTEgMEgtOUwxMDkgNTQ4Wk0zNTAgMzQ0UTQwNSAzNDQgNDI5IDM2OVQ0NTMgNDMyUTQ1MyA0OTYgMzcwIDQ5NkgyOTVMMjYyIDM0NEgzNTBaTTM4NiA2NzNRMzY4IDY4MCAzNDMgNjk2VDI5NyA3MzRRMjc3IDc1NSAyNjUgNzc3VDI1MiA4MjBRMjUyIDg0OSAyNjkgODY4VDMxNyA4ODdRMzQ3IDg4NyAzNzIgODYzVDQwOCA3OTdMNDMyIDgyOVE0NTIgODU2IDQ3NCA4NzFUNTI0IDg4N1E1NTEgODg3IDU2NiA4NzBUNTgyIDgyOVE1ODIgODAzIDU2NSA3NzlUNTE3IDczNFE0ODcgNzEzIDQ1MyA2OTdUMzg2IDY3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1OTsiIGdseXBoLW5hbWU9InJjYXJvbiIgaG9yaXotYWR2LXg9IjQ2NSIgZD0iTTkzIDQ4OFE5NCA0OTEgMTEwIDQ5NVQxNDkgNTAwUTE4NiA1MDAgMjE2IDQ3OVQyNTIgNDA2UTI3MyA0NTIgMzA4IDQ4MFQzODkgNTA4UTQzMSA1MDggNDU4IDQ4NVQ0ODYgNDI0UTQ4NiAzODkgNDczIDM2NlQ0NDMgMzI4VDQxNCAzMDhUMzk5IDMwM1EzODggMzE2IDM3MiAzMjVUMzI4IDMzNFEyODcgMzM0IDI2MyAyOTlUMjI0IDIwMUwxODEgMEgtMTFMOTMgNDg4Wk0yODIgNTI5UTI2NCA1MzYgMjM5IDU1MlQxOTMgNTkwUTE3MyA2MTEgMTYxIDYzM1QxNDggNjc2UTE0OCA3MDUgMTY1IDcyNFQyMTMgNzQzUTI0MyA3NDMgMjY4IDcxOVQzMDQgNjUzTDMyOCA2ODVRMzQ4IDcxMiAzNzAgNzI3VDQyMCA3NDNRNDQ3IDc0MyA0NjIgNzI2VDQ3OCA2ODVRNDc4IDY1OSA0NjEgNjM1VDQxMyA1OTBRMzgzIDU2OSAzNDkgNTUzVDI4MiA1MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUE7IiBnbHlwaC1uYW1lPSJTYWN1dGUiIGhvcml6LWFkdi14PSI1ODMiIGQ9Ik0yNiA1OFEtMTEgOTcgLTExIDE0MFEtMTEgMTYzIC0xIDE4MVQyMyAyMTNUNDggMjMyVDYyIDIzNlE3OCAyMTYgMTAwIDE5OVQxNDkgMTY4VDIwNCAxNDdUMjYxIDEzOVEzMzYgMTM5IDMzNiAxOTJRMzM2IDIxNCAzMDggMjI1VDIzOSAyNTJRMjEwIDI2MyAxODIgMjc3VDEzMCAzMTNUOTIgMzY1VDc3IDQzN1E3NyA0ODAgOTMgNTIwVDE0MiA1OTJUMjI4IDY0MlQzNTQgNjYxUTQzNSA2NjEgNDkxIDY0MlQ1NzggNTkyUTYxMCA1NTggNjEwIDUxOFE2MTAgNDkyIDU5OCA0NzJUNTcyIDQzN1Q1NDUgNDE3VDUzMCA0MTNRNDk4IDQ1NSA0NTEgNDgxVDM1MiA1MDhRMzE0IDUwOCAyOTUgNDk0VDI3NSA0NTdRMjc1IDQzNCAzMDYgNDIyVDM4MyAzOTJRNDE1IDM4MCA0NDYgMzY2VDUwMiAzMzBUNTQyIDI4MVQ1NTcgMjEzUTU1NyAxNjUgNTQwIDEyNFQ0ODYgNTJUMzk1IDRUMjYzIC0xNFExNzUgLTE0IDExNyA2VDI2IDU4Wk0yODMgNzExUTI4MCA3MTcgMjg3IDczOFQzMTAgNzgzVDM0OCA4MzJUMzk2IDg3MVE0MjMgODg2IDQ1NiA4ODZRNDkyIDg4NiA1MTQgODYyVDUzNiA4MDVRNTM2IDc4MSA1MjAgNzU4VDQ3NyA3MjBRNDQ0IDcwMiA0MTEgNjk2VDM1MSA2OTFUMzA1IDY5OVQyODMgNzExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVCOyIgZ2x5cGgtbmFtZT0ic2FjdXRlIiBob3Jpei1hZHYteD0iNDgxIiBkPSJNMTggNTRRNCA2OCAtNCA4NFQtMTMgMTE4US0xMyAxMzcgLTUgMTUyVDEzIDE3OFQzMiAxOTNUNDMgMTk2UTU3IDE4MSA3NiAxNjdUMTE2IDE0MlQxNTkgMTI1VDIwMyAxMThRMjQ5IDExOCAyNDkgMTQ2UTI0OSAxNTcgMjM2IDE2NVQxOTUgMTg0UTE2OSAxOTQgMTQ0IDIwNlQ5OSAyMzRUNjcgMjc0VDU0IDMzMlE1NCAzNzAgNjcgNDAyVDEwOCA0NTdUMTc0IDQ5M1QyNjYgNTA2UTMzMCA1MDYgMzgwIDQ4OFQ0NjEgNDQwUTQ3MiA0MjkgNDc5IDQxNVQ0ODYgMzgzUTQ4NiAzNjAgNDc3IDM0NFQ0NTYgMzE3VDQzNSAzMDFUNDIzIDI5OFEzOTcgMzMwIDM1OSAzNTRUMjc5IDM3OFEyNTUgMzc4IDI0MyAzNzBUMjMxIDM0OVEyMzEgMzM4IDI0NiAzMzBUMjk4IDMwNlEzMjggMjk0IDM1NSAyODFUNDAyIDI1MVQ0MzUgMjExVDQ0NyAxNTVRNDQ3IDgwIDM5MiAzNVQyMjggLTExUTE1MSAtMTEgOTkgN1QxOCA1NFpNMjI2IDU2N1EyMjMgNTczIDIzMCA1OTRUMjUzIDYzOVQyOTEgNjg4VDMzOSA3MjdRMzY2IDc0MiAzOTkgNzQyUTQzNSA3NDIgNDU3IDcxOFQ0NzkgNjYxUTQ3OSA2MzcgNDYzIDYxNFQ0MjAgNTc2UTM4NyA1NTggMzU0IDU1MlQyOTQgNTQ3VDI0OCA1NTVUMjI2IDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QzsiIGdseXBoLW5hbWU9IlNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTgzIiBkPSJNMjYgNThRLTExIDk3IC0xMSAxNDBRLTExIDE2MyAtMSAxODFUMjMgMjEzVDQ4IDIzMlQ2MiAyMzZRNzggMjE2IDEwMCAxOTlUMTQ5IDE2OFQyMDQgMTQ3VDI2MSAxMzlRMzM2IDEzOSAzMzYgMTkyUTMzNiAyMTQgMzA4IDIyNVQyMzkgMjUyUTIxMCAyNjMgMTgyIDI3N1QxMzAgMzEzVDkyIDM2NVQ3NyA0MzdRNzcgNDgwIDkzIDUyMFQxNDIgNTkyVDIyOCA2NDJUMzU0IDY2MVE0MzUgNjYxIDQ5MSA2NDJUNTc4IDU5MlE2MTAgNTU4IDYxMCA1MThRNjEwIDQ5MiA1OTggNDcyVDU3MiA0MzdUNTQ1IDQxN1Q1MzAgNDEzUTQ5OCA0NTUgNDUxIDQ4MVQzNTIgNTA4UTMxNCA1MDggMjk1IDQ5NFQyNzUgNDU3UTI3NSA0MzQgMzA2IDQyMlQzODMgMzkyUTQxNSAzODAgNDQ2IDM2NlQ1MDIgMzMwVDU0MiAyODFUNTU3IDIxM1E1NTcgMTY1IDU0MCAxMjRUNDg2IDUyVDM5NSA0VDI2MyAtMTRRMTc1IC0xNCAxMTcgNlQyNiA1OFpNMjc1IDY4NVEyNDggNjg1IDIzMyA3MDJUMjE4IDc0MlEyMTggNzY4IDIzNSA3OTJUMjgyIDgzOFEzMTIgODYwIDM0NyA4NzVUNDE0IDg5OFE0MzIgODkyIDQ1NiA4NzZUNTAyIDgzOFE1MjIgODE3IDUzNSA3OTVUNTQ4IDc1MlE1NDggNzIzIDUzMCA3MDRUNDgyIDY4NVE0NTggNjg1IDQzOCA3MDBUNDA0IDc0M1E0MDEgNzUwIDM5OCA3NThUMzkxIDc3NVEzODUgNzY3IDM4MCA3NTlUMzY3IDc0M1EzNDcgNzE1IDMyNSA3MDBUMjc1IDY4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RDsiIGdseXBoLW5hbWU9InNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNDgxIiBkPSJNMTggNTRRNCA2OCAtNCA4NFQtMTMgMTE4US0xMyAxMzcgLTUgMTUyVDEzIDE3OFQzMiAxOTNUNDMgMTk2UTU3IDE4MSA3NiAxNjdUMTE2IDE0MlQxNTkgMTI1VDIwMyAxMThRMjQ5IDExOCAyNDkgMTQ2UTI0OSAxNTcgMjM2IDE2NVQxOTUgMTg0UTE2OSAxOTQgMTQ0IDIwNlQ5OSAyMzRUNjcgMjc0VDU0IDMzMlE1NCAzNzAgNjcgNDAyVDEwOCA0NTdUMTc0IDQ5M1QyNjYgNTA2UTMzMCA1MDYgMzgwIDQ4OFQ0NjEgNDQwUTQ3MiA0MjkgNDc5IDQxNVQ0ODYgMzgzUTQ4NiAzNjAgNDc3IDM0NFQ0NTYgMzE3VDQzNSAzMDFUNDIzIDI5OFEzOTcgMzMwIDM1OSAzNTRUMjc5IDM3OFEyNTUgMzc4IDI0MyAzNzBUMjMxIDM0OVEyMzEgMzM4IDI0NiAzMzBUMjk4IDMwNlEzMjggMjk0IDM1NSAyODFUNDAyIDI1MVQ0MzUgMjExVDQ0NyAxNTVRNDQ3IDgwIDM5MiAzNVQyMjggLTExUTE1MSAtMTEgOTkgN1QxOCA1NFpNMjExIDU0MVExODQgNTQxIDE2OSA1NThUMTU0IDU5OFExNTQgNjI0IDE3MSA2NDhUMjE4IDY5NFEyNDggNzE2IDI4MyA3MzFUMzUwIDc1NFEzNjggNzQ4IDM5MiA3MzJUNDM4IDY5NFE0NTggNjczIDQ3MSA2NTFUNDg0IDYwOFE0ODQgNTc5IDQ2NiA1NjBUNDE4IDU0MVEzOTQgNTQxIDM3NCA1NTZUMzQwIDU5OVEzMzcgNjA2IDMzNCA2MTRUMzI3IDYzMVEzMjEgNjIzIDMxNiA2MTVUMzAzIDU5OVEyODMgNTcxIDI2MSA1NTZUMjExIDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RTsiIGdseXBoLW5hbWU9IlNjZWRpbGxhIiBob3Jpei1hZHYteD0iNTgzIiBkPSJNMjYgNThRLTExIDk3IC0xMSAxNDBRLTExIDE2MyAtMSAxODFUMjMgMjEzVDQ4IDIzMlQ2MiAyMzZRNzggMjE2IDEwMCAxOTlUMTQ5IDE2OFQyMDQgMTQ3VDI2MSAxMzlRMzM2IDEzOSAzMzYgMTkyUTMzNiAyMTQgMzA4IDIyNVQyMzkgMjUyUTIxMCAyNjMgMTgyIDI3N1QxMzAgMzEzVDkyIDM2NVQ3NyA0MzdRNzcgNDgwIDkzIDUyMFQxNDIgNTkyVDIyOCA2NDJUMzU0IDY2MVE0MzUgNjYxIDQ5MSA2NDJUNTc4IDU5MlE2MTAgNTU4IDYxMCA1MThRNjEwIDQ5MiA1OTggNDcyVDU3MiA0MzdUNTQ1IDQxN1Q1MzAgNDEzUTQ5OCA0NTUgNDUxIDQ4MVQzNTIgNTA4UTMxNCA1MDggMjk1IDQ5NFQyNzUgNDU3UTI3NSA0MzQgMzA2IDQyMlQzODMgMzkyUTQxNSAzODAgNDQ2IDM2NlQ1MDIgMzMwVDU0MiAyODFUNTU3IDIxM1E1NTcgMTY1IDU0MCAxMjRUNDg2IDUyVDM5NSA0VDI2MyAtMTRRMTc1IC0xNCAxMTcgNlQyNiA1OFpNMTc5IC0zOVExODAgLTM4IDE5OSAtMzhUMjQyIC00M1QyODUgLTYyVDMwNSAtMTAwUTMwNSAtMTI1IDI5MCAtMTQyVDI0NCAtMTc5TDE2MCAtMjM0UTE1MiAtMjQwIDEzNyAtMjM4VDEwOSAtMjI5VDg5IC0yMTFUOTAgLTE4NkwxNzkgLTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVGOyIgZ2x5cGgtbmFtZT0ic2NlZGlsbGEiIGhvcml6LWFkdi14PSI0ODEiIGQ9Ik0xOCA1NFE0IDY4IC00IDg0VC0xMyAxMThRLTEzIDEzNyAtNSAxNTJUMTMgMTc4VDMyIDE5M1Q0MyAxOTZRNTcgMTgxIDc2IDE2N1QxMTYgMTQyVDE1OSAxMjVUMjAzIDExOFEyNDkgMTE4IDI0OSAxNDZRMjQ5IDE1NyAyMzYgMTY1VDE5NSAxODRRMTY5IDE5NCAxNDQgMjA2VDk5IDIzNFQ2NyAyNzRUNTQgMzMyUTU0IDM3MCA2NyA0MDJUMTA4IDQ1N1QxNzQgNDkzVDI2NiA1MDZRMzMwIDUwNiAzODAgNDg4VDQ2MSA0NDBRNDcyIDQyOSA0NzkgNDE1VDQ4NiAzODNRNDg2IDM2MCA0NzcgMzQ0VDQ1NiAzMTdUNDM1IDMwMVQ0MjMgMjk4UTM5NyAzMzAgMzU5IDM1NFQyNzkgMzc4UTI1NSAzNzggMjQzIDM3MFQyMzEgMzQ5UTIzMSAzMzggMjQ2IDMzMFQyOTggMzA2UTMyOCAyOTQgMzU1IDI4MVQ0MDIgMjUxVDQzNSAyMTFUNDQ3IDE1NVE0NDcgODAgMzkyIDM1VDIyOCAtMTFRMTUxIC0xMSA5OSA3VDE4IDU0Wk0xNjYgLTM5UTE2NyAtMzggMTg2IC0zOFQyMjkgLTQzVDI3MiAtNjJUMjkyIC0xMDBRMjkyIC0xMjUgMjc3IC0xNDJUMjMxIC0xNzlMMTQ3IC0yMzRRMTM5IC0yNDAgMTI0IC0yMzhUOTYgLTIyOVQ3NiAtMjExVDc3IC0xODZMMTY2IC0zOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGdseXBoLW5hbWU9IlNjYXJvbiIgaG9yaXotYWR2LXg9IjU4MyIgZD0iTTI2IDU4US0xMSA5NyAtMTEgMTQwUS0xMSAxNjMgLTEgMTgxVDIzIDIxM1Q0OCAyMzJUNjIgMjM2UTc4IDIxNiAxMDAgMTk5VDE0OSAxNjhUMjA0IDE0N1QyNjEgMTM5UTMzNiAxMzkgMzM2IDE5MlEzMzYgMjE0IDMwOCAyMjVUMjM5IDI1MlEyMTAgMjYzIDE4MiAyNzdUMTMwIDMxM1Q5MiAzNjVUNzcgNDM3UTc3IDQ4MCA5MyA1MjBUMTQyIDU5MlQyMjggNjQyVDM1NCA2NjFRNDM1IDY2MSA0OTEgNjQyVDU3OCA1OTJRNjEwIDU1OCA2MTAgNTE4UTYxMCA0OTIgNTk4IDQ3MlQ1NzIgNDM3VDU0NSA0MTdUNTMwIDQxM1E0OTggNDU1IDQ1MSA0ODFUMzUyIDUwOFEzMTQgNTA4IDI5NSA0OTRUMjc1IDQ1N1EyNzUgNDM0IDMwNiA0MjJUMzgzIDM5MlE0MTUgMzgwIDQ0NiAzNjZUNTAyIDMzMFQ1NDIgMjgxVDU1NyAyMTNRNTU3IDE2NSA1NDAgMTI0VDQ4NiA1MlQzOTUgNFQyNjMgLTE0UTE3NSAtMTQgMTE3IDZUMjYgNThaTTM3NSA2ODRRMzU3IDY5MSAzMzIgNzA3VDI4NiA3NDVRMjY2IDc2NiAyNTQgNzg4VDI0MSA4MzFRMjQxIDg2MCAyNTggODc5VDMwNiA4OThRMzM2IDg5OCAzNjEgODc0VDM5NyA4MDhMNDIxIDg0MFE0NDEgODY3IDQ2MyA4ODJUNTEzIDg5OFE1NDAgODk4IDU1NSA4ODFUNTcxIDg0MFE1NzEgODE0IDU1NCA3OTBUNTA2IDc0NVE0NzYgNzI0IDQ0MiA3MDhUMzc1IDY4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGdseXBoLW5hbWU9InNjYXJvbiIgaG9yaXotYWR2LXg9IjQ4MSIgZD0iTTE4IDU0UTQgNjggLTQgODRULTEzIDExOFEtMTMgMTM3IC01IDE1MlQxMyAxNzhUMzIgMTkzVDQzIDE5NlE1NyAxODEgNzYgMTY3VDExNiAxNDJUMTU5IDEyNVQyMDMgMTE4UTI0OSAxMTggMjQ5IDE0NlEyNDkgMTU3IDIzNiAxNjVUMTk1IDE4NFExNjkgMTk0IDE0NCAyMDZUOTkgMjM0VDY3IDI3NFQ1NCAzMzJRNTQgMzcwIDY3IDQwMlQxMDggNDU3VDE3NCA0OTNUMjY2IDUwNlEzMzAgNTA2IDM4MCA0ODhUNDYxIDQ0MFE0NzIgNDI5IDQ3OSA0MTVUNDg2IDM4M1E0ODYgMzYwIDQ3NyAzNDRUNDU2IDMxN1Q0MzUgMzAxVDQyMyAyOThRMzk3IDMzMCAzNTkgMzU0VDI3OSAzNzhRMjU1IDM3OCAyNDMgMzcwVDIzMSAzNDlRMjMxIDMzOCAyNDYgMzMwVDI5OCAzMDZRMzI4IDI5NCAzNTUgMjgxVDQwMiAyNTFUNDM1IDIxMVQ0NDcgMTU1UTQ0NyA4MCAzOTIgMzVUMjI4IC0xMVExNTEgLTExIDk5IDdUMTggNTRaTTMwOCA1MjlRMjkwIDUzNiAyNjUgNTUyVDIxOSA1OTBRMTk5IDYxMSAxODcgNjMzVDE3NCA2NzZRMTc0IDcwNSAxOTEgNzI0VDIzOSA3NDNRMjY5IDc0MyAyOTQgNzE5VDMzMCA2NTNMMzU0IDY4NVEzNzQgNzEyIDM5NiA3MjdUNDQ2IDc0M1E0NzMgNzQzIDQ4OCA3MjZUNTA0IDY4NVE1MDQgNjU5IDQ4NyA2MzVUNDM5IDU5MFE0MDkgNTY5IDM3NSA1NTNUMzA4IDUyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MjsiIGdseXBoLW5hbWU9IlRjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTI1OCA0NzNIMTU2UTExNCA0NzMgOTMgNDkwVDcyIDUzNVE3MiA1NDIgNzMgNTU0VDc5IDU3OFQ4OSA2MDNUMTAzIDYyNFExMTQgNjM1IDEzMCA2NDFUMTgyIDY0N0g1OTVRNjM3IDY0NyA2NTggNjMwVDY4MCA1ODVRNjgwIDU3OCA2NzggNTY3VDY3MyA1NDJUNjYzIDUxN1Q2NDggNDk2UTYzNyA0ODUgNjIxIDQ3OVQ1NjkgNDczSDQ1OUwzNTggMEgxNTdMMjU4IDQ3M1pNMTc5IC0zMlExODAgLTMxIDE5MSAtMzBUMjE5IC0zMFQyNTUgLTM1VDI5MSAtNDlUMzE5IC03MlQzMzAgLTEwOVEzMzAgLTEzNSAzMTkgLTE1NVQyNzYgLTIwN0wxNzQgLTMwNlExNjUgLTMxNCAxNDggLTMxNFQxMTUgLTMwN1Q4OSAtMjg1VDg2IC0yNTJMMTc5IC0zMkgxNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjM7IiBnbHlwaC1uYW1lPSJ0Y29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0MzMiIGQ9Ik0xMTEgMzUxSDM1TDY1IDQ5NkgxNDJMMTQ1IDUxMVExNTggNTc2IDE4OSA2MDZUMjg1IDYzN1EzMTYgNjM3IDMzNiA2MjhUMzU1IDYxNEwzMzAgNDk2SDQ1NUw0MjQgMzUxSDI5NkwyNjIgMTg5UTI1NSAxNTcgMjY1IDE0M1QyOTggMTI4UTMxNCAxMjggMzI4IDEzNFQzNTQgMTUwUTM1NyAxNTMgMzY5IDE0MFQzODIgOTlRMzgyIDU4IDM1MSAyN1EzMTIgLTE0IDIyOSAtMTRRMTMzIC0xNCA5NSAzN1Q3NSAxODBMMTExIDM1MVpNMTMyIC0zMlExMzMgLTMxIDE0NCAtMzBUMTcyIC0zMFQyMDggLTM1VDI0NCAtNDlUMjcyIC03MlQyODMgLTEwOVEyODMgLTEzNSAyNzIgLTE1NVQyMjkgLTIwN0wxMjcgLTMwNlExMTggLTMxNCAxMDEgLTMxNFQ2OCAtMzA3VDQyIC0yODVUMzkgLTI1MkwxMzIgLTMySDEzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGdseXBoLW5hbWU9IlRjYXJvbiIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTI1OCA0NzNIMTU2UTExNCA0NzMgOTMgNDkwVDcyIDUzNVE3MiA1NDIgNzMgNTU0VDc5IDU3OFQ4OSA2MDNUMTAzIDYyNFExMTQgNjM1IDEzMCA2NDFUMTgyIDY0N0g1OTVRNjM3IDY0NyA2NTggNjMwVDY4MCA1ODVRNjgwIDU3OCA2NzggNTY3VDY3MyA1NDJUNjYzIDUxN1Q2NDggNDk2UTYzNyA0ODUgNjIxIDQ3OVQ1NjkgNDczSDQ1OUwzNTggMEgxNTdMMjU4IDQ3M1pNMzkzIDY3M1EzNzUgNjgwIDM1MCA2OTZUMzA0IDczNFEyODQgNzU1IDI3MiA3NzdUMjU5IDgyMFEyNTkgODQ5IDI3NiA4NjhUMzI0IDg4N1EzNTQgODg3IDM3OSA4NjNUNDE1IDc5N0w0MzkgODI5UTQ1OSA4NTYgNDgxIDg3MVQ1MzEgODg3UTU1OCA4ODcgNTczIDg3MFQ1ODkgODI5UTU4OSA4MDMgNTcyIDc3OVQ1MjQgNzM0UTQ5NCA3MTMgNDYwIDY5N1QzOTMgNjczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY1OyIgZ2x5cGgtbmFtZT0idGNhcm9uIiBob3Jpei1hZHYteD0iNDMzIiBkPSJNNDc1IDgyMVE0NzYgODIzIDQ5OSA4MjRUNTUxIDgxOVQ2MDMgNzk1VDYyNyA3NDVRNjI3IDcyMCA2MTYgNjk5VDU3NCA2NDdMNDY4IDUzNFE0NTkgNTI2IDQ0MiA1MjZUNDA4IDUzNFQzODMgNTU1VDM4MCA1ODhMNDc1IDgyMVpNMTExIDM1MUgzNUw2NSA0OTZIMTQyTDE0NSA1MTFRMTU4IDU3NiAxODkgNjA2VDI4NSA2MzdRMzE2IDYzNyAzMzYgNjI4VDM1NSA2MTRMMzMwIDQ5Nkg0NTVMNDI0IDM1MUgyOTZMMjYyIDE4OVEyNTUgMTU3IDI2NSAxNDNUMjk4IDEyOFEzMTQgMTI4IDMyOCAxMzRUMzU0IDE1MFEzNTcgMTUzIDM2OSAxNDBUMzgyIDk5UTM4MiA1OCAzNTEgMjdRMzEyIC0xNCAyMjkgLTE0UTEzMyAtMTQgOTUgMzdUNzUgMTgwTDExMSAzNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBnbHlwaC1uYW1lPSJVbWFjcm9uIiBob3Jpei1hZHYteD0iNjcxIiBkPSJNMTA2IDU2MVExMTYgNjA4IDEzOCA2MzBUMjA0IDY1MkgyMzRRMjc2IDY1MiAyOTYgNjI5VDMwNyA1NThMMjUwIDI5MlEyMzYgMjI5IDI1NiAxOTZUMzM0IDE2MlEzNzMgMTYyIDM5OSAxODdUNDM4IDI3M0w0OTkgNTU5UTUxMCA2MDcgNTMyIDYyOVQ1OTggNjUySDYyNFE2NjYgNjUyIDY4NyA2MjhUNjk3IDU1OEw2MzQgMjYyUTYwNCAxMjIgNTI0IDU1VDMxMyAtMTNRMTUwIC0xMyA4NCA2OFQ1MSAzMDdMMTA2IDU2MVpNMzA1IDY5MFEyNzIgNjkwIDI1NSA3MDNUMjM4IDczOVEyMzggNzQ1IDIzOSA3NTRUMjQ0IDc3M1QyNTEgNzkzVDI2MyA4MTBRMjczIDgxOSAyODUgODIzVDMyNiA4MjhINTYxUTU5NCA4MjggNjExIDgxNVQ2MjggNzc5UTYyOCA3NjcgNjIzIDc0NVQ2MDMgNzA4UTU5MyA2OTggNTgxIDY5NFQ1NDAgNjkwSDMwNUgzMDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkI7IiBnbHlwaC1uYW1lPSJ1bWFjcm9uIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMTcxIC0xM1E4MiAtMTMgNDYgNDhUMzIgMjE0TDkyIDQ5NkgyODRMMjI2IDIzNFEyMTYgMTkzIDIzMCAxNjhUMjgwIDE0M1EzMDUgMTQzIDMyMiAxNTNUMzU1IDE4Nkw0MjEgNDk2SDYxM0w1MzYgMTM1UTUyNiA5MCA1MzMgNzBUNTY3IDQyUTU2OCA0MiA1NjUgMzRUNTUwIDE1VDUxOSAtM1Q0NjcgLTEyUTQwOCAtMTIgMzgwIDE0VDM0OCA4NlEzMTYgNDAgMjczIDE0VDE3MSAtMTNaTTI0MSA1NDZRMjA4IDU0NiAxOTEgNTU5VDE3NCA1OTVRMTc0IDYwMSAxNzUgNjEwVDE4MCA2MjlUMTg3IDY0OVQxOTkgNjY2UTIwOSA2NzUgMjIxIDY3OVQyNjIgNjg0SDQ5N1E1MzAgNjg0IDU0NyA2NzFUNTY0IDYzNVE1NjQgNjIzIDU1OSA2MDFUNTM5IDU2NFE1MjkgNTU0IDUxNyA1NTBUNDc2IDU0NkgyNDFIMjQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgZ2x5cGgtbmFtZT0iVWJyZXZlIiBob3Jpei1hZHYteD0iNjcxIiBkPSJNMTA2IDU2MVExMTYgNjA4IDEzOCA2MzBUMjA0IDY1MkgyMzRRMjc2IDY1MiAyOTYgNjI5VDMwNyA1NThMMjUwIDI5MlEyMzYgMjI5IDI1NiAxOTZUMzM0IDE2MlEzNzMgMTYyIDM5OSAxODdUNDM4IDI3M0w0OTkgNTU5UTUxMCA2MDcgNTMyIDYyOVQ1OTggNjUySDYyNFE2NjYgNjUyIDY4NyA2MjhUNjk3IDU1OEw2MzQgMjYyUTYwNCAxMjIgNTI0IDU1VDMxMyAtMTNRMTUwIC0xMyA4NCA2OFQ1MSAzMDdMMTA2IDU2MVpNMjkxIDczNFEyNTcgNzY4IDI1NyA4MTFRMjU3IDgzNiAyNzMgODU2VDMyMiA4NzZRMzQ2IDg3MSAzNjEgODU4VDM4OCA4MzBUNDA5IDgwM1Q0MzIgNzkxUTQ0NSA3OTEgNDU3IDgwMlQ0ODIgODI5VDUxMyA4NTdUNTUzIDg3NlE1ODggODc2IDYwNSA4NTlUNjIzIDgxOFE2MjMgNzk4IDYxMyA3NzlUNTg2IDc0MlE1NjAgNzE2IDUyMCA3MDFUNDMyIDY4NVEzODQgNjg1IDM0OSA2OThUMjkxIDczNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RDsiIGdseXBoLW5hbWU9InVicmV2ZSIgaG9yaXotYWR2LXg9IjYxNSIgZD0iTTE3MSAtMTNRODIgLTEzIDQ2IDQ4VDMyIDIxNEw5MiA0OTZIMjg0TDIyNiAyMzRRMjE2IDE5MyAyMzAgMTY4VDI4MCAxNDNRMzA1IDE0MyAzMjIgMTUzVDM1NSAxODZMNDIxIDQ5Nkg2MTNMNTM2IDEzNVE1MjYgOTAgNTMzIDcwVDU2NyA0MlE1NjggNDIgNTY1IDM0VDU1MCAxNVQ1MTkgLTNUNDY3IC0xMlE0MDggLTEyIDM4MCAxNFQzNDggODZRMzE2IDQwIDI3MyAxNFQxNzEgLTEzWk0yMjAgNTkwUTE4NiA2MjQgMTg2IDY2N1ExODYgNjkyIDIwMiA3MTJUMjUxIDczMlEyNzUgNzI3IDI5MCA3MTRUMzE3IDY4NlQzMzggNjU5VDM2MSA2NDdRMzc0IDY0NyAzODYgNjU4VDQxMSA2ODVUNDQyIDcxM1Q0ODIgNzMyUTUxNyA3MzIgNTM0IDcxNVQ1NTIgNjc0UTU1MiA2NTQgNTQyIDYzNVQ1MTUgNTk4UTQ4OSA1NzIgNDQ5IDU1N1QzNjEgNTQxUTMxMyA1NDEgMjc4IDU1NFQyMjAgNTkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZFOyIgZ2x5cGgtbmFtZT0iVXJpbmciIGhvcml6LWFkdi14PSI2NzEiIGQ9Ik0xMDYgNTYxUTExNiA2MDggMTM4IDYzMFQyMDQgNjUySDIzNFEyNzYgNjUyIDI5NiA2MjlUMzA3IDU1OEwyNTAgMjkyUTIzNiAyMjkgMjU2IDE5NlQzMzQgMTYyUTM3MyAxNjIgMzk5IDE4N1Q0MzggMjczTDQ5OSA1NTlRNTEwIDYwNyA1MzIgNjI5VDU5OCA2NTJINjI0UTY2NiA2NTIgNjg3IDYyOFQ2OTcgNTU4TDYzNCAyNjJRNjA0IDEyMiA1MjQgNTVUMzEzIC0xM1ExNTAgLTEzIDg0IDY4VDUxIDMwN0wxMDYgNTYxWk00MzYgNjg1UTM3OCA2ODUgMzQ1IDcxNVQzMTEgNzk0UTMxMSA4MjIgMzIxIDg0OFQzNTAgODk0VDM5NSA5MjVUNDUyIDkzN1E1MTAgOTM3IDU0MyA5MDdUNTc3IDgyOFE1NzcgNzk5IDU2NyA3NzRUNTM4IDcyOFQ0OTMgNjk3VDQzNiA2ODVaTTQzOSA3NjNRNDYyIDc2MyA0NzYgNzgwVDQ5MSA4MThRNDkxIDgzNiA0ODAgODQ4VDQ0OSA4NjBRNDI2IDg2MCA0MTIgODQzVDM5NyA4MDVRMzk3IDc4NyA0MDggNzc1VDQzOSA3NjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkY7IiBnbHlwaC1uYW1lPSJ1cmluZyIgaG9yaXotYWR2LXg9IjYxNSIgZD0iTTE3MSAtMTNRODIgLTEzIDQ2IDQ4VDMyIDIxNEw5MiA0OTZIMjg0TDIyNiAyMzRRMjE2IDE5MyAyMzAgMTY4VDI4MCAxNDNRMzA1IDE0MyAzMjIgMTUzVDM1NSAxODZMNDIxIDQ5Nkg2MTNMNTM2IDEzNVE1MjYgOTAgNTMzIDcwVDU2NyA0MlE1NjggNDIgNTY1IDM0VDU1MCAxNVQ1MTkgLTNUNDY3IC0xMlE0MDggLTEyIDM4MCAxNFQzNDggODZRMzE2IDQwIDI3MyAxNFQxNzEgLTEzWk0zNjAgNTM2UTMwMiA1MzYgMjY5IDU2NlQyMzUgNjQ1UTIzNSA2NzMgMjQ1IDY5OVQyNzQgNzQ1VDMxOSA3NzZUMzc2IDc4OFE0MzQgNzg4IDQ2NyA3NThUNTAxIDY3OVE1MDEgNjUwIDQ5MSA2MjVUNDYyIDU3OVQ0MTcgNTQ4VDM2MCA1MzZaTTM2MyA2MTRRMzg2IDYxNCA0MDAgNjMxVDQxNSA2NjlRNDE1IDY4NyA0MDQgNjk5VDM3MyA3MTFRMzUwIDcxMSAzMzYgNjk0VDMyMSA2NTZRMzIxIDYzOCAzMzIgNjI2VDM2MyA2MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBnbHlwaC1uYW1lPSJVaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNjcxIiBkPSJNMTA2IDU2MVExMTYgNjA4IDEzOCA2MzBUMjA0IDY1MkgyMzRRMjc2IDY1MiAyOTYgNjI5VDMwNyA1NThMMjUwIDI5MlEyMzYgMjI5IDI1NiAxOTZUMzM0IDE2MlEzNzMgMTYyIDM5OSAxODdUNDM4IDI3M0w0OTkgNTU5UTUxMCA2MDcgNTMyIDYyOVQ1OTggNjUySDYyNFE2NjYgNjUyIDY4NyA2MjhUNjk3IDU1OEw2MzQgMjYyUTYwNCAxMjIgNTI0IDU1VDMxMyAtMTNRMTUwIC0xMyA4NCA2OFQ1MSAzMDdMMTA2IDU2MVpNNDYxIDcxMVE0NTggNzE3IDQ2NSA3MzdUNDg2IDc4M1Q1MjIgODMyVDU2OSA4NzJRNTk4IDg4OCA2MjMgODg4UTY1OSA4ODggNjg0IDg2N1Q3MDkgODE0UTcwOSA3ODggNjk0IDc2MlQ2NTIgNzIxUTYyMCA3MDMgNTg4IDY5N1Q1MjggNjkyVDQ4MyA2OTlUNDYxIDcxMVpNMjE0IDcxMVEyMTAgNzE3IDIxNyA3MzdUMjM5IDc4M1QyNzUgODMyVDMyMiA4NzJRMzUxIDg4OCAzNzYgODg4UTQxMiA4ODggNDM3IDg2N1Q0NjIgODE0UTQ2MiA3ODggNDQ3IDc2MlQ0MDUgNzIxUTM3MyA3MDMgMzQxIDY5N1QyODEgNjkyVDIzNiA2OTlUMjE0IDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MTsiIGdseXBoLW5hbWU9InVodW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI2MTUiIGQ9Ik0xNzEgLTEzUTgyIC0xMyA0NiA0OFQzMiAyMTRMOTIgNDk2SDI4NEwyMjYgMjM0UTIxNiAxOTMgMjMwIDE2OFQyODAgMTQzUTMwNSAxNDMgMzIyIDE1M1QzNTUgMTg2TDQyMSA0OTZINjEzTDUzNiAxMzVRNTI2IDkwIDUzMyA3MFQ1NjcgNDJRNTY4IDQyIDU2NSAzNFQ1NTAgMTVUNTE5IC0zVDQ2NyAtMTJRNDA4IC0xMiAzODAgMTRUMzQ4IDg2UTMxNiA0MCAyNzMgMTRUMTcxIC0xM1pNMzkxIDU2N1EzODggNTczIDM5NSA1OTNUNDE2IDYzOVQ0NTIgNjg4VDQ5OSA3MjhRNTI4IDc0NCA1NTMgNzQ0UTU4OSA3NDQgNjE0IDcyM1Q2MzkgNjcwUTYzOSA2NDQgNjI0IDYxOFQ1ODIgNTc3UTU1MCA1NTkgNTE4IDU1M1Q0NTggNTQ4VDQxMyA1NTVUMzkxIDU2N1pNMTQ0IDU2N1ExNDAgNTczIDE0NyA1OTNUMTY5IDYzOVQyMDUgNjg4VDI1MiA3MjhRMjgxIDc0NCAzMDYgNzQ0UTM0MiA3NDQgMzY3IDcyM1QzOTIgNjcwUTM5MiA2NDQgMzc3IDYxOFQzMzUgNTc3UTMwMyA1NTkgMjcxIDU1M1QyMTEgNTQ4VDE2NiA1NTVUMTQ0IDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MjsiIGdseXBoLW5hbWU9IlVvZ29uZWsiIGhvcml6LWFkdi14PSI2NzEiIGQ9Ik0yNzkgLTk0UTI3OSAtNDkgMzIxIC0xM0gzMTNRMTUwIC0xMyA4NCA2OFQ1MSAzMDdMMTA2IDU2MVExMTYgNjA4IDEzOCA2MzBUMjA0IDY1MkgyMzRRMjc2IDY1MiAyOTYgNjI5VDMwNyA1NThMMjUwIDI5MlEyMzYgMjI5IDI1NiAxOTZUMzM0IDE2MlEzNzMgMTYyIDM5OSAxODdUNDM4IDI3M0w0OTkgNTU5UTUxMCA2MDcgNTMyIDYyOVQ1OTggNjUySDYyNFE2NjYgNjUyIDY4NyA2MjhUNjk3IDU1OEw2MzQgMjYyUTU5NyA5MCA0ODAgMjVRNDM3IC00IDQyMiAtMjNUNDA2IC01OVE0MDYgLTg0IDQzMyAtODRRNDUyIC04NCA0NjMgLTY4UTQ3NiAtNzIgNDg0IC04M1Q0OTMgLTEwOVE0OTMgLTE0MSA0NjggLTE2MlQzOTAgLTE4M1EzNDIgLTE4MyAzMTEgLTE1OVQyNzkgLTk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgZ2x5cGgtbmFtZT0idW9nb25layIgaG9yaXotYWR2LXg9IjYxNSIgZD0iTTE3MSAtMTNRODIgLTEzIDQ2IDQ4VDMyIDIxNEw5MiA0OTZIMjg0TDIyNiAyMzRRMjE2IDE5MyAyMzAgMTY4VDI4MCAxNDNRMzA1IDE0MyAzMjIgMTUzVDM1NSAxODZMNDIxIDQ5Nkg2MTNMNTM2IDEzNVE1MjYgOTAgNTMzIDcwVDU2NyA0MlE1NjggNDEgNTYxIDI3VDUzMSAxUTQ4MyAtMzEgNDY2IC01MFQ0NDkgLTg4UTQ0OSAtMTEzIDQ3NiAtMTEzUTQ5NSAtMTEzIDUwNiAtOTdRNTE5IC0xMDEgNTI3IC0xMTJUNTM2IC0xMzhRNTM2IC0xNzAgNTExIC0xOTFUNDMzIC0yMTJRMzg1IC0yMTIgMzU0IC0xODhUMzIyIC0xMjNRMzIyIC04OCAzNDkgLTU3VDQyNSAtN1EzODcgMSAzNjkgMjVUMzQ4IDg2UTMxNiA0MCAyNzMgMTRUMTcxIC0xM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NDsiIGdseXBoLW5hbWU9IldjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iOTc5IiBkPSJNMTA2IDU5OVExMDYgNjA1IDExNSA2MTRUMTQxIDYzMVQxNzggNjQ2VDIyNCA2NTJRMjc1IDY1MiAyOTYgNjIyVDMxNiA1NDZMMzEwIDI1Nkw0NDAgNTIyUTQ1NyA1NTcgNDg4IDU3M1Q1NTQgNTkwUTYwMiA1OTAgNjI4IDU3MVQ2NTUgNTExTDY2NiAyNTJMODM3IDY1NFE4MzcgNjU1IDg0OSA2NTVUODgwIDY1NVQ5MTggNjQ4VDk1NiA2MzJUOTg2IDYwNFQ5OTggNTYwUTk5OCA1NDQgOTkyIDUyM1Q5NjUgNDY3TDcyNiAwSDUyOEw1MTEgMzM4TDMzOSAwSDE0MUwxMDYgNTk5Wk00NzcgNjgyUTQ1MCA2ODIgNDM1IDY5OVQ0MjAgNzM5UTQyMCA3NjUgNDM3IDc4OVQ0ODQgODM1UTUxNCA4NTcgNTQ5IDg3MlQ2MTYgODk1UTYzNCA4ODkgNjU4IDg3M1Q3MDQgODM1UTcyNCA4MTQgNzM3IDc5MlQ3NTAgNzQ5UTc1MCA3MjAgNzMyIDcwMVQ2ODQgNjgyUTY2MCA2ODIgNjQwIDY5N1Q2MDYgNzQwUTYwMyA3NDcgNjAwIDc1NVQ1OTMgNzcyUTU4NyA3NjQgNTgyIDc1NlQ1NjkgNzQwUTU0OSA3MTIgNTI3IDY5N1Q0NzcgNjgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc1OyIgZ2x5cGgtbmFtZT0id2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI4MDUiIGQ9Ik05NCAzMjlROTIgMzc4IDc0IDM5OFQyOCA0MjJRMjYgNDIyIDI5IDQzNVQ0MyA0NjRUNzcgNDkzVDEzNiA1MDZRMTg5IDUwNiAyMTggNDc4UTI1NiA0MzkgMjU2IDMzOUwyNTUgMjAyTDM1MiA0MDdRMzY3IDQzOSAzODggNDUwVDQ0MSA0NjJRNDg1IDQ2MiA1MTAgNDQ2VDUzOCAzODlMNTQ3IDIwMEw2ODYgNTA1UTY4NyA1MDYgNzA3IDUwNVQ3NTAgNDk1VDc5NCA0NjlUODE0IDQxOVE4MTQgNDAyIDgwOCAzODZUNzg1IDM0MEw1OTIgMEg0MzVMNDA4IDI0MkwyNzEgMEgxMTVMOTQgMzI5Wk0zNjYgNTM5UTMzOSA1MzkgMzI0IDU1NlQzMDkgNTk2UTMwOSA2MjIgMzI2IDY0NlQzNzMgNjkyUTQwMyA3MTQgNDM4IDcyOVQ1MDUgNzUyUTUyMyA3NDYgNTQ3IDczMFQ1OTMgNjkyUTYxMyA2NzEgNjI2IDY0OVQ2MzkgNjA2UTYzOSA1NzcgNjIxIDU1OFQ1NzMgNTM5UTU0OSA1MzkgNTI5IDU1NFQ0OTUgNTk3UTQ5MiA2MDQgNDg5IDYxMlQ0ODIgNjI5UTQ3NiA2MjEgNDcxIDYxM1Q0NTggNTk3UTQzOCA1NjkgNDE2IDU1NFQzNjYgNTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc2OyIgZ2x5cGgtbmFtZT0iWWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MzIiIGQ9Ik0yMjggMjU1TDQ2IDY0N0gyNjBMMzUxIDQwNUw1MjcgNjU5UTUyOCA2NjAgNTUxIDY1OFQ2MDMgNjQ2VDY1NSA2MThUNjc5IDU2N1E2NzkgNTQ4IDY2NyA1MjNUNjI3IDQ2OEw0MjggMjUzTDM3MyAwSDE3M0wyMjggMjU1Wk0yODQgNjg1UTI1NyA2ODUgMjQyIDcwMlQyMjcgNzQyUTIyNyA3NjggMjQ0IDc5MlQyOTEgODM4UTMyMSA4NjAgMzU2IDg3NVQ0MjMgODk4UTQ0MSA4OTIgNDY1IDg3NlQ1MTEgODM4UTUzMSA4MTcgNTQ0IDc5NVQ1NTcgNzUyUTU1NyA3MjMgNTM5IDcwNFQ0OTEgNjg1UTQ2NyA2ODUgNDQ3IDcwMFQ0MTMgNzQzUTQxMCA3NTAgNDA3IDc1OFQ0MDAgNzc1UTM5NCA3NjcgMzg5IDc1OVQzNzYgNzQzUTM1NiA3MTUgMzM0IDcwMFQyODQgNjg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc3OyIgZ2x5cGgtbmFtZT0ieWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0tNyAtMzhRMSAtNDUgMTcgLTUwVDQ3IC01NVE3NCAtNTUgOTggLTM5VDE1NSAyNEwxNjUgMzhRMTMwIDQ5IDEyMyA5Nkw5NCAzMjJRODYgMzc3IDY4IDM5N1QyMyA0MjFRMjEgNDIxIDI1IDQzNFQ0MSA0NjRUNzcgNDkzVDEzOSA1MDZRMTk1IDUwNiAyMjcgNDY2VDI2NiAzMzVMMjc1IDIwOEw0MjUgNDk2SDYyN0wzMDYgLTQ1UTI4MyAtODEgMjYxIC0xMDlUMjE0IC0xNThUMTYwIC0xOTBUOTYgLTIwMVEyMiAtMjAxIC0xMiAtMTY4US0zNiAtMTQ0IC0zNiAtMTAzUS0zNiAtOTAgLTMyIC03OFQtMjMgLTU3VC0xMyAtNDNULTcgLTM4Wk0yMjggNTQxUTIwMSA1NDEgMTg2IDU1OFQxNzEgNTk4UTE3MSA2MjQgMTg4IDY0OFQyMzUgNjk0UTI2NSA3MTYgMzAwIDczMVQzNjcgNzU0UTM4NSA3NDggNDA5IDczMlQ0NTUgNjk0UTQ3NSA2NzMgNDg4IDY1MVQ1MDEgNjA4UTUwMSA1NzkgNDgzIDU2MFQ0MzUgNTQxUTQxMSA1NDEgMzkxIDU1NlQzNTcgNTk5UTM1NCA2MDYgMzUxIDYxNFQzNDQgNjMxUTMzOCA2MjMgMzMzIDYxNVQzMjAgNTk5UTMwMCA1NzEgMjc4IDU1NlQyMjggNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc4OyIgZ2x5cGgtbmFtZT0iWWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjMyIiBkPSJNMjI4IDI1NUw0NiA2NDdIMjYwTDM1MSA0MDVMNTI3IDY1OVE1MjggNjYwIDU1MSA2NThUNjAzIDY0NlQ2NTUgNjE4VDY3OSA1NjdRNjc5IDU0OCA2NjcgNTIzVDYyNyA0NjhMNDI4IDI1M0wzNzMgMEgxNzNMMjI4IDI1NVpNNTE2IDY5M1E0NzMgNjkzIDQ1MiA3MTRUNDMwIDc2N1E0MzAgODEzIDQ1OCA4NDBUNTI2IDg2OFE1NjkgODY4IDU5MCA4NDdUNjExIDc5M1E2MTEgNzQ4IDU4MyA3MjFUNTE2IDY5M1pNMjkwIDY5M1EyNDcgNjkzIDIyNiA3MTRUMjA1IDc2N1EyMDUgODEzIDIzMyA4NDBUMzAwIDg2OFEzNDMgODY4IDM2NCA4NDdUMzg2IDc5M1EzODYgNzQ4IDM1OCA3MjFUMjkwIDY5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3OTsiIGdseXBoLW5hbWU9IlphY3V0ZSIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTEwIDE2MUwzNTQgNDgySDE5NFE5MCA0ODIgOTAgNTUyUTkwIDU2OSA5NSA1ODZUMTA2IDYxNlQxMTggNjM4VDEyNiA2NDdINjM4TDYwMyA0ODNMMjU5IDE2Nkg0MzlRNTQ0IDE2NiA1NDQgOTZRNTQ0IDc5IDUzOSA2MlQ1MjggMzFUNTE1IDlUNTA4IDBILTI0TDEwIDE2MVpNMjY1IDcxMVEyNjIgNzE3IDI2OSA3MzhUMjkyIDc4M1QzMzAgODMyVDM3OCA4NzFRNDA1IDg4NiA0MzggODg2UTQ3NCA4ODYgNDk2IDg2MlQ1MTggODA1UTUxOCA3ODEgNTAyIDc1OFQ0NTkgNzIwUTQyNiA3MDIgMzkzIDY5NlQzMzMgNjkxVDI4NyA2OTlUMjY1IDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QTsiIGdseXBoLW5hbWU9InphY3V0ZSIgaG9yaXotYWR2LXg9IjUxNiIgZD0iTTQgMTM1TDI2OSAzNTJIMTU3UTY2IDM1MiA2NiA0MTNRNjYgNDI4IDcwIDQ0MlQ4MCA0NjlUOTEgNDg4VDk3IDQ5Nkg1MzJMNTA2IDM2MUwyNDEgMTQ0SDM3MVE0NjIgMTQ0IDQ2MiA4M1E0NjIgNjggNDU4IDUzVDQ0OCAyN1Q0MzcgOFQ0MzEgMEgtMjJMNCAxMzVaTTE5OCA1NjdRMTk1IDU3MyAyMDIgNTk0VDIyNSA2MzlUMjYzIDY4OFQzMTEgNzI3UTMzOCA3NDIgMzcxIDc0MlE0MDcgNzQyIDQyOSA3MThUNDUxIDY2MVE0NTEgNjM3IDQzNSA2MTRUMzkyIDU3NlEzNTkgNTU4IDMyNiA1NTJUMjY2IDU0N1QyMjAgNTU1VDE5OCA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBnbHlwaC1uYW1lPSJaZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTkxIiBkPSJNMTAgMTYxTDM1NCA0ODJIMTk0UTkwIDQ4MiA5MCA1NTJROTAgNTY5IDk1IDU4NlQxMDYgNjE2VDExOCA2MzhUMTI2IDY0N0g2MzhMNjAzIDQ4M0wyNTkgMTY2SDQzOVE1NDQgMTY2IDU0NCA5NlE1NDQgNzkgNTM5IDYyVDUyOCAzMVQ1MTUgOVQ1MDggMEgtMjRMMTAgMTYxWk0zNzQgNjg1UTMyOSA2ODUgMzA3IDcwN1QyODQgNzYzUTI4NCA4MTEgMzEzIDgzOVQzODQgODY4UTQzMCA4NjggNDUyIDg0NlQ0NzQgNzkxUTQ3NCA3NjcgNDY2IDc0OFQ0NDUgNzE0VDQxMyA2OTNUMzc0IDY4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QzsiIGdseXBoLW5hbWU9Inpkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1MTYiIGQ9Ik00IDEzNUwyNjkgMzUySDE1N1E2NiAzNTIgNjYgNDEzUTY2IDQyOCA3MCA0NDJUODAgNDY5VDkxIDQ4OFQ5NyA0OTZINTMyTDUwNiAzNjFMMjQxIDE0NEgzNzFRNDYyIDE0NCA0NjIgODNRNDYyIDY4IDQ1OCA1M1Q0NDggMjdUNDM3IDhUNDMxIDBILTIyTDQgMTM1Wk0zMDQgNTQxUTI1OSA1NDEgMjM3IDU2M1QyMTQgNjE5UTIxNCA2NjcgMjQzIDY5NVQzMTQgNzI0UTM2MCA3MjQgMzgyIDcwMlQ0MDQgNjQ3UTQwNCA2MjMgMzk2IDYwNFQzNzUgNTcwVDM0MyA1NDlUMzA0IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RDsiIGdseXBoLW5hbWU9IlpjYXJvbiIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTEwIDE2MUwzNTQgNDgySDE5NFE5MCA0ODIgOTAgNTUyUTkwIDU2OSA5NSA1ODZUMTA2IDYxNlQxMTggNjM4VDEyNiA2NDdINjM4TDYwMyA0ODNMMjU5IDE2Nkg0MzlRNTQ0IDE2NiA1NDQgOTZRNTQ0IDc5IDUzOSA2MlQ1MjggMzFUNTE1IDlUNTA4IDBILTI0TDEwIDE2MVpNMzYxIDY4NFEzNDMgNjkxIDMxOCA3MDdUMjcyIDc0NVEyNTIgNzY2IDI0MCA3ODhUMjI3IDgzMVEyMjcgODYwIDI0NCA4NzlUMjkyIDg5OFEzMjIgODk4IDM0NyA4NzRUMzgzIDgwOEw0MDcgODQwUTQyNyA4NjcgNDQ5IDg4MlQ0OTkgODk4UTUyNiA4OTggNTQxIDg4MVQ1NTcgODQwUTU1NyA4MTQgNTQwIDc5MFQ0OTIgNzQ1UTQ2MiA3MjQgNDI4IDcwOFQzNjEgNjg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdFOyIgZ2x5cGgtbmFtZT0iemNhcm9uIiBob3Jpei1hZHYteD0iNTE2IiBkPSJNNCAxMzVMMjY5IDM1MkgxNTdRNjYgMzUyIDY2IDQxM1E2NiA0MjggNzAgNDQyVDgwIDQ2OVQ5MSA0ODhUOTcgNDk2SDUzMkw1MDYgMzYxTDI0MSAxNDRIMzcxUTQ2MiAxNDQgNDYyIDgzUTQ2MiA2OCA0NTggNTNUNDQ4IDI3VDQzNyA4VDQzMSAwSC0yMkw0IDEzNVpNMzAwIDUyOVEyODIgNTM2IDI1NyA1NTJUMjExIDU5MFExOTEgNjExIDE3OSA2MzNUMTY2IDY3NlExNjYgNzA1IDE4MyA3MjRUMjMxIDc0M1EyNjEgNzQzIDI4NiA3MTlUMzIyIDY1M0wzNDYgNjg1UTM2NiA3MTIgMzg4IDcyN1Q0MzggNzQzUTQ2NSA3NDMgNDgwIDcyNlQ0OTYgNjg1UTQ5NiA2NTkgNDc5IDYzNVQ0MzEgNTkwUTQwMSA1NjkgMzY3IDU1M1QzMDAgNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTkyOyIgZ2x5cGgtbmFtZT0iZmxvcmluIiBob3Jpei1hZHYteD0iNDQxIiBkPSJNMTA5IDI3Nkg5MlE2MCAyNzYgNDIgMjkwVDI0IDMyN1EyNCAzMzMgMjUgMzQyVDMwIDM2MlQzOSAzODNUNTEgNDAxUTYwIDQxMSA3MyA0MTVUMTE2IDQyMEgxMzlMMTQ4IDQ2MlExNjAgNTE5IDE4MSA1NTZUMjMxIDYxNlQyOTIgNjQ4VDM2MyA2NThRNDA1IDY1OCA0MzMgNjQ4VDQ4MCA2MThRNDkxIDYwOCA0OTYgNTk0VDUwMiA1NjVRNTAyIDU0NiA0OTUgNTMwVDQ3OSA1MDJUNDYyIDQ4NFQ0NTMgNDc5UTQ0MiA0OTEgNDI2IDQ5OFQzODkgNTA1UTM2NiA1MDUgMzUyIDQ5NFQzMzAgNDUyTDMyMyA0MjBIMzcyUTQwNiA0MjAgNDIzIDQwNlQ0NDEgMzY5UTQ0MSAzNjMgNDQwIDM1NFQ0MzUgMzM0VDQyNyAzMTNUNDE1IDI5NVE0MDUgMjg2IDM5MiAyODFUMzUwIDI3NkgzMDBMMjY2IDExNFEyNTggNzIgMjQ1IDQ2VDIxNSA1VDE3NyAtMTRUMTM1IC0xOVExMTYgLTE5IDEwMSAtMTZUNzUgLTdUNTkgM1Q1MyAxMEwxMDkgMjc2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE4OyIgZ2x5cGgtbmFtZT0iU2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTgzIiBkPSJNMjYgNThRLTExIDk3IC0xMSAxNDBRLTExIDE2MyAtMSAxODFUMjMgMjEzVDQ4IDIzMlQ2MiAyMzZRNzggMjE2IDEwMCAxOTlUMTQ5IDE2OFQyMDQgMTQ3VDI2MSAxMzlRMzM2IDEzOSAzMzYgMTkyUTMzNiAyMTQgMzA4IDIyNVQyMzkgMjUyUTIxMCAyNjMgMTgyIDI3N1QxMzAgMzEzVDkyIDM2NVQ3NyA0MzdRNzcgNDgwIDkzIDUyMFQxNDIgNTkyVDIyOCA2NDJUMzU0IDY2MVE0MzUgNjYxIDQ5MSA2NDJUNTc4IDU5MlE2MTAgNTU4IDYxMCA1MThRNjEwIDQ5MiA1OTggNDcyVDU3MiA0MzdUNTQ1IDQxN1Q1MzAgNDEzUTQ5OCA0NTUgNDUxIDQ4MVQzNTIgNTA4UTMxNCA1MDggMjk1IDQ5NFQyNzUgNDU3UTI3NSA0MzQgMzA2IDQyMlQzODMgMzkyUTQxNSAzODAgNDQ2IDM2NlQ1MDIgMzMwVDU0MiAyODFUNTU3IDIxM1E1NTcgMTY1IDU0MCAxMjRUNDg2IDUyVDM5NSA0VDI2MyAtMTRRMTc1IC0xNCAxMTcgNlQyNiA1OFpNMjA1IC0zMlEyMDYgLTMxIDIxNyAtMzBUMjQ1IC0zMFQyODEgLTM1VDMxNyAtNDlUMzQ1IC03MlQzNTYgLTEwOVEzNTYgLTEzNSAzNDUgLTE1NVQzMDIgLTIwN0wyMDAgLTMwNlExOTEgLTMxNCAxNzQgLTMxNFQxNDEgLTMwN1QxMTUgLTI4NVQxMTIgLTI1MkwyMDUgLTMySDIwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxOTsiIGdseXBoLW5hbWU9InNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjQ4MSIgZD0iTTE4IDU0UTQgNjggLTQgODRULTEzIDExOFEtMTMgMTM3IC01IDE1MlQxMyAxNzhUMzIgMTkzVDQzIDE5NlE1NyAxODEgNzYgMTY3VDExNiAxNDJUMTU5IDEyNVQyMDMgMTE4UTI0OSAxMTggMjQ5IDE0NlEyNDkgMTU3IDIzNiAxNjVUMTk1IDE4NFExNjkgMTk0IDE0NCAyMDZUOTkgMjM0VDY3IDI3NFQ1NCAzMzJRNTQgMzcwIDY3IDQwMlQxMDggNDU3VDE3NCA0OTNUMjY2IDUwNlEzMzAgNTA2IDM4MCA0ODhUNDYxIDQ0MFE0NzIgNDI5IDQ3OSA0MTVUNDg2IDM4M1E0ODYgMzYwIDQ3NyAzNDRUNDU2IDMxN1Q0MzUgMzAxVDQyMyAyOThRMzk3IDMzMCAzNTkgMzU0VDI3OSAzNzhRMjU1IDM3OCAyNDMgMzcwVDIzMSAzNDlRMjMxIDMzOCAyNDYgMzMwVDI5OCAzMDZRMzI4IDI5NCAzNTUgMjgxVDQwMiAyNTFUNDM1IDIxMVQ0NDcgMTU1UTQ0NyA4MCAzOTIgMzVUMjI4IC0xMVExNTEgLTExIDk5IDdUMTggNTRaTTE1NiAtMzJRMTU3IC0zMSAxNjggLTMwVDE5NiAtMzBUMjMyIC0zNVQyNjggLTQ5VDI5NiAtNzJUMzA3IC0xMDlRMzA3IC0xMzUgMjk2IC0xNTVUMjUzIC0yMDdMMTUxIC0zMDZRMTQyIC0zMTQgMTI1IC0zMTRUOTIgLTMwN1Q2NiAtMjg1VDYzIC0yNTJMMTU2IC0zMkgxNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzY7IiBnbHlwaC1uYW1lPSJjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMjE3IDU0MVExOTAgNTQxIDE3NSA1NThUMTYwIDU5OFExNjAgNjI0IDE3NyA2NDhUMjI0IDY5NFEyNTQgNzE2IDI4OSA3MzFUMzU2IDc1NFEzNzQgNzQ4IDM5OCA3MzJUNDQ0IDY5NFE0NjQgNjczIDQ3NyA2NTFUNDkwIDYwOFE0OTAgNTc5IDQ3MiA1NjBUNDI0IDU0MVE0MDAgNTQxIDM4MCA1NTZUMzQ2IDU5OVEzNDMgNjA2IDM0MCA2MTRUMzMzIDYzMVEzMjcgNjIzIDMyMiA2MTVUMzA5IDU5OVEyODkgNTcxIDI2NyA1NTZUMjE3IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNzsiIGdseXBoLW5hbWU9ImNhcm9uIiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMzEyIDUyOVEyOTQgNTM2IDI2OSA1NTJUMjIzIDU5MFEyMDMgNjExIDE5MSA2MzNUMTc4IDY3NlExNzggNzA1IDE5NSA3MjRUMjQzIDc0M1EyNzMgNzQzIDI5OCA3MTlUMzM0IDY1M0wzNTggNjg1UTM3OCA3MTIgNDAwIDcyN1Q0NTAgNzQzUTQ3NyA3NDMgNDkyIDcyNlQ1MDggNjg1UTUwOCA2NTkgNDkxIDYzNVQ0NDMgNTkwUTQxMyA1NjkgMzc5IDU1M1QzMTIgNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ4OyIgZ2x5cGgtbmFtZT0iYnJldmUiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0xOTAgNTkwUTE1NiA2MjQgMTU2IDY2N1ExNTYgNjkyIDE3MiA3MTJUMjIxIDczMlEyNDUgNzI3IDI2MCA3MTRUMjg3IDY4NlQzMDggNjU5VDMzMSA2NDdRMzQ0IDY0NyAzNTYgNjU4VDM4MSA2ODVUNDEyIDcxM1Q0NTIgNzMyUTQ4NyA3MzIgNTA0IDcxNVQ1MjIgNjc0UTUyMiA2NTQgNTEyIDYzNVQ0ODUgNTk4UTQ1OSA1NzIgNDE5IDU1N1QzMzEgNTQxUTI4MyA1NDEgMjQ4IDU1NFQxOTAgNTkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ5OyIgZ2x5cGgtbmFtZT0iZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMzI2IDU0MVEyODEgNTQxIDI1OSA1NjNUMjM2IDYxOVEyMzYgNjY3IDI2NSA2OTVUMzM2IDcyNFEzODIgNzI0IDQwNCA3MDJUNDI2IDY0N1E0MjYgNjIzIDQxOCA2MDRUMzk3IDU3MFQzNjUgNTQ5VDMyNiA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREE7IiBnbHlwaC1uYW1lPSJyaW5nIiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMzMxIDU0MVEyNzMgNTQxIDI0MCA1NzFUMjA2IDY1MFEyMDYgNjc4IDIxNiA3MDRUMjQ1IDc1MFQyOTAgNzgxVDM0NyA3OTNRNDA1IDc5MyA0MzggNzYzVDQ3MiA2ODRRNDcyIDY1NSA0NjIgNjMwVDQzMyA1ODRUMzg4IDU1M1QzMzEgNTQxWk0zMzQgNjE5UTM1NyA2MTkgMzcxIDYzNlQzODYgNjc0UTM4NiA2OTIgMzc1IDcwNFQzNDQgNzE2UTMyMSA3MTYgMzA3IDY5OVQyOTIgNjYxUTI5MiA2NDMgMzAzIDYzMVQzMzQgNjE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRCOyIgZ2x5cGgtbmFtZT0ib2dvbmVrIiBob3Jpei1hZHYteD0iNTAwIiBkPSJNNzQgLTExOVE3NCAtOTUgODYgLTczVDEyMiAtMzNUMTc3IC0zVDI1MSAxMkwyOTYgMTRRMjY4IC00IDI1MCAtMThUMjIxIC00M1QyMDYgLTY1VDIwMSAtODRRMjAxIC0xMDkgMjI4IC0xMDlRMjQ3IC0xMDkgMjU4IC05M1EyNzEgLTk3IDI3OSAtMTA4VDI4OCAtMTM0UTI4OCAtMTY2IDI2MyAtMTg3VDE4NSAtMjA4UTEzNyAtMjA4IDEwNiAtMTg0VDc0IC0xMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREM7IiBnbHlwaC1uYW1lPSJ0aWxkZSIgaG9yaXotYWR2LXg9IjQ5OSIgZD0iTTIwMCA1NDJRMTc1IDU0MiAxNjEgNTU3VDE0NSA1OTNRMTQ2IDYyMiAxNTYgNjQ1VDE4MiA2ODRUMjIwIDcwOFQyNjMgNzE3UTI4OSA3MTcgMzA4IDcxMFQzNDEgNjkyUTM1OCA2ODEgMzY3IDY3M1QzODQgNjY1UTM5NCA2NjUgNDAxIDY3NFQ0MTcgNjk1UTQyNSA3MDYgNDM0IDcxMFQ0NTggNzE0UTQ4MyA3MTQgNDk3IDY5OVQ1MTMgNjYzUTUxMiA2MzQgNTAyIDYxMlQ0NzYgNTczVDQzOCA1NDlUMzk1IDU0MFEzNjggNTQwIDM1MCA1NDhUMzE5IDU2NVEzMDIgNTc4IDI5NCA1ODhUMjc0IDU5OVEyNjQgNTk5IDI1OSA1ODlUMjQ2IDU2NFEyNDAgNTU0IDIzMCA1NDhUMjAwIDU0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJERDsiIGdseXBoLW5hbWU9Imh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTM1MiA1NjdRMzQ5IDU3MyAzNTYgNTkzVDM3NyA2MzlUNDEzIDY4OFQ0NjAgNzI4UTQ4OSA3NDQgNTE0IDc0NFE1NTAgNzQ0IDU3NSA3MjNUNjAwIDY3MFE2MDAgNjQ0IDU4NSA2MThUNTQzIDU3N1E1MTEgNTU5IDQ3OSA1NTNUNDE5IDU0OFQzNzQgNTU1VDM1MiA1NjdaTTEwNSA1NjdRMTAxIDU3MyAxMDggNTkzVDEzMCA2MzlUMTY2IDY4OFQyMTMgNzI4UTI0MiA3NDQgMjY3IDc0NFEzMDMgNzQ0IDMyOCA3MjNUMzUzIDY3MFEzNTMgNjQ0IDMzOCA2MThUMjk2IDU3N1EyNjQgNTU5IDIzMiA1NTNUMTcyIDU0OFQxMjcgNTU1VDEwNSA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQzA7IiBnbHlwaC1uYW1lPSJwaSIgaG9yaXotYWR2LXg9Ijc0NyIgZD0iTTUyIDMyNFE1MiAzOTcgNzYgNDU5VDE0NiA1NjZUMjUzIDYzNlQzOTAgNjYxUTQ2NSA2NjEgNTI2IDYzNlQ2MzIgNTY3VDcwMSA0NjBUNzI2IDMyNFE3MjYgMjUwIDcwMiAxODhUNjMzIDgxVDUyNiAxMVQzODkgLTE0UTMxNCAtMTQgMjUyIDExVDE0NiA4MVQ3NyAxODhUNTIgMzI0Wk0xMjMgMzI0UTEyMyAyNjUgMTQyIDIxNlQxOTcgMTMwVDI4MSA3NFQzOTAgNTNRNDUwIDUzIDQ5OCA3M1Q1ODIgMTI5VDYzNiAyMTVUNjU1IDMyNFE2NTUgMzgzIDYzNiA0MzJUNTgxIDUxOFQ0OTcgNTc0VDM4OSA1OTRRMzI5IDU5NCAyODAgNTc0VDE5NiA1MThUMTQyIDQzM1QxMjMgMzI0Wk0yNDYgNDI3UTI0NiA0OTEgMzA2IDQ5MUg0MDBRNDc4IDQ5MSA1MTggNDU5VDU1OSAzNjFRNTU5IDIzMiA0MDUgMjMySDM2M1YxODdRMzYzIDEzNCAzMTIgMTM0SDI5NVEyNDYgMTM0IDI0NiAxODdWNDI3Wk00MDAgMzE3UTQ0NyAzMTcgNDQ3IDM2MVE0NDcgMzgxIDQzNSAzOTNUMzk3IDQwNUgzNjFWMzE3SDQwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTM7IiBnbHlwaC1uYW1lPSJlbmRhc2giIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik0xMDMgMTY3UTY1IDE2NyA0NiAxODJUMjYgMjI0UTI2IDIzMCAyNyAyNDFUMzIgMjYzVDQxIDI4NlQ1NSAzMDVRNjYgMzE2IDgxIDMyMVQxMjggMzI3SDQ3M1E1MTEgMzI3IDUzMCAzMTFUNTQ5IDI2OVE1NDkgMjYzIDU0OCAyNTJUNTQzIDIzMFQ1MzUgMjA3VDUyMSAxODhRNTEwIDE3NyA0OTUgMTcyVDQ0OCAxNjdIMTAzSDEwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTQ7IiBnbHlwaC1uYW1lPSJlbWRhc2giIGhvcml6LWFkdi14PSI3MzciIGQ9Ik0xMDMgMTY3UTY1IDE2NyA0NiAxODJUMjYgMjI0UTI2IDIzMCAyNyAyNDFUMzIgMjYzVDQxIDI4NlQ1NSAzMDVRNjYgMzE2IDgxIDMyMVQxMjggMzI3SDYzNVE2NzMgMzI3IDY5MiAzMTFUNzExIDI2OVE3MTEgMjYzIDcxMCAyNTJUNzA1IDIzMFQ2OTcgMjA3VDY4MyAxODhRNjcyIDE3NyA2NTcgMTcyVDYxMCAxNjdIMTAzSDEwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTg7IiBnbHlwaC1uYW1lPSJxdW90ZWxlZnQiIGhvcml6LWFkdi14PSIyNTYiIGQ9Ik0yMTYgMzcyUTIxNSAzNzAgMTkyIDM2OVQxNDAgMzc0VDg4IDM5OFQ2NCA0NDhRNjQgNDczIDc1IDQ5M1QxMTggNTQ2TDIyMyA2NTlRMjMxIDY2NyAyNDggNjY3VDI4MiA2NTlUMzA4IDYzOFQzMTEgNjA1TDIxNiAzNzJIMjE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxOTsiIGdseXBoLW5hbWU9InF1b3RlcmlnaHQiIGhvcml6LWFkdi14PSIyNTYiIGQ9Ik0xNDUgMzcyUTEzNiAzNjQgMTE5IDM2NFQ4NSAzNzJUNjAgMzkzVDU3IDQyNkwxNTIgNjU5UTE1MyA2NjEgMTc2IDY2MlQyMjggNjU3VDI4MCA2MzNUMzA0IDU4M1EzMDQgNTU4IDI5MyA1MzdUMjUxIDQ4NUwxNDUgMzcySDE0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjI2NiIgZD0iTTU2IDE3MlE1NyAxNzQgODAgMTc1VDEzMiAxNzBUMTg0IDE0NlQyMDggOTZRMjA4IDcxIDE5NyA1MVQxNTQgLTJMNDkgLTExNVE0MCAtMTIzIDIzIC0xMjNULTExIC0xMTVULTM2IC05NFQtMzkgLTYxTDU2IDE3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUM7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGxlZnQiIGhvcml6LWFkdi14PSI0ODkiIGQ9Ik0yMDggMzc2UTIwNyAzNzQgMTg1IDM3M1QxMzYgMzc4VDg3IDQwMlQ2NSA0NTJRNjUgNDY0IDY3IDQ3NVQ3NiA0OTdUOTMgNTIxVDEyMCA1NTBMMjMxIDY2N1EyMzkgNjc1IDI1NiA2NzVUMjg5IDY2N1QzMTQgNjQ2VDMxNiA2MTNMMjA4IDM3NlpNMzAyIDQ0OFEzMDIgNDcxIDMxMSA0OTBUMzUxIDU0Mkw0NTMgNjU1UTQ2MSA2NjMgNDc4IDY2M1Q1MTEgNjU2VDUzOCA2MzVUNTQxIDYwMkw0NDkgMzY4UTQ0OSAzNjcgNDM4IDM2NlQ0MTAgMzY2VDM3NSAzNzFUMzQwIDM4NVQzMTMgNDEwVDMwMiA0NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFEOyIgZ2x5cGgtbmFtZT0icXVvdGVkYmxyaWdodCIgaG9yaXotYWR2LXg9IjQ4OSIgZD0iTTE0OSAzNzZRMTQxIDM2OCAxMjQgMzY4VDkwIDM3NVQ2MyAzOTdUNjAgNDMwTDE1MiA2NjRRMTUyIDY2NSAxNjMgNjY2VDE5MSA2NjZUMjI3IDY2MVQyNjIgNjQ3VDI4OSA2MjJUMzAwIDU4M1EzMDAgNTYxIDI5MCA1NDJUMjUxIDQ5MEwxNDkgMzc2Wk0zOTQgNjU2UTM5NCA2NTcgNDA1IDY1OFQ0MzIgNjU4VDQ2NiA2NTNUNTAwIDY0MVQ1MjYgNjE3VDUzNyA1ODBRNTM3IDU1NSA1MjUgNTM1VDQ4MiA0ODJMMzcxIDM2NVEzNjMgMzU3IDM0NiAzNTdUMzEyIDM2NFQyODcgMzg2VDI4NiA0MTlMMzk0IDY1NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUU7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGJhc2UiIGhvcml6LWFkdi14PSI0OTAiIGQ9Ik00OCAxNzRRNDkgMTc2IDcyIDE3NlQxMjIgMTcxVDE3MiAxNDZUMTk1IDk0UTE5NSA3MSAxODYgNTJUMTQ2IDBMNDQgLTExNFEzNiAtMTIyIDE5IC0xMjJULTE1IC0xMTVULTQyIC05M1QtNDUgLTYwTDQ4IDE3NFpNMjg5IDE2NlEyOTAgMTY4IDMxMiAxNjlUMzYxIDE2NFQ0MTAgMTQwVDQzMiA5MFE0MzIgNjUgNDIwIDQ0VDM3NyAtOEwyNjYgLTEyNVEyNTggLTEzMyAyNDEgLTEzM1QyMDggLTEyNlQxODMgLTEwNFQxODEgLTcxTDI4OSAxNjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIwOyIgZ2x5cGgtbmFtZT0iZGFnZ2VyIiBob3Jpei1hZHYteD0iNTQwIiBkPSJNMTc2IDIwM1ExODMgMjQ1IDE5NyAyNzlUMjQ1IDM0NEwxMTEgMzA5UTk1IDMwNCA4MyAzMDdUNjQgMzE5VDUyIDM0MFQ0OCAzNjZRNDggMzg4IDUyIDQxMlQ2NSA0NTVUOTEgNDgzVDEzMCA0ODZMMjYyIDQ1MUwyNTkgNTkzUTI1NyA2MjggMjc2IDY0NFQzNDIgNjYxUTQwMSA2NjEgNDIwIDYzOVQ0MjMgNTgxTDM2NSA0NTJMNDkzIDQ4NlE1MDkgNDkxIDUyMSA0ODhUNTQxIDQ3NlQ1NTMgNDU1VDU1NyA0MjlRNTU3IDQwNyA1NTMgMzgzVDU0MCAzNDBUNTE0IDMxMVQ0NzUgMzA4TDM0MCAzNDRRMzU4IDMxOCAzNTkgMjg5VDM1MCAyMThMMjY4IC0xMDdRMjYwIC0xMzkgMjQ1IC0xNDdUMjA4IC0xNTVIMTczUTE0NyAtMTU1IDEzMiAtMTQ1VDEyMiAtMTA2TDE3NiAyMDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIxOyIgZ2x5cGgtbmFtZT0iZGFnZ2VyZGJsIiBob3Jpei1hZHYteD0iNTQwIiBkPSJNNDggMTVRMzEgMTAgMTkgMTNUMCAyNVQtMTIgNDZULTE2IDcyUS0xNiA5NCAtMTIgMTE4VDEgMTYxVDI3IDE4OVQ2NiAxOTJMMTY5IDE2NkwxNzkgMjE4UTE4NiAyNjAgMjAwIDI5NFQyNDggMzU5TDExNCAzMjRROTggMzE5IDg2IDMyMlQ2NyAzMzRUNTUgMzU1VDUxIDM4MVE1MSA0MDMgNTUgNDI3VDY4IDQ3MFQ5NCA0OThUMTMzIDUwMUwyNjEgNDY4TDI1OSA1OTNRMjU3IDYyOCAyNzYgNjQ0VDM0MiA2NjFRNDAxIDY2MSA0MjAgNjM5VDQyMyA1ODFMMzc0IDQ2OUw0OTYgNTAxUTUxMiA1MDYgNTI0IDUwM1Q1NDQgNDkxVDU1NiA0NzBUNTYwIDQ0NFE1NjAgNDIyIDU1NiAzOThUNTQzIDM1NVQ1MTcgMzI2VDQ3OCAzMjNMMzQzIDM1OVEzNjEgMzMzIDM2MiAzMDRUMzUzIDIzM0wzMzcgMTY4TDQzMCAxOTJRNDQ2IDE5NyA0NTggMTk0VDQ3OCAxODJUNDkwIDE2MVQ0OTQgMTM1UTQ5NCAxMTMgNDkwIDg5VDQ3NyA0NlQ0NTEgMTdUNDEyIDE0TDMwNSA0MkwyNjggLTEwN1EyNjAgLTEzOSAyNDUgLTE0N1QyMDggLTE1NUgxNzNRMTQ3IC0xNTUgMTMyIC0xNDVUMTIyIC0xMDZMMTQ4IDQwTDQ4IDE1SDQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGdseXBoLW5hbWU9ImJ1bGxldCIgaG9yaXotYWR2LXg9IjM2MyIgZD0iTTE4MiAxMDFRMTUxIDEwMSAxMjQgMTEyVDc4IDE0MlQ0NyAxODhUMzYgMjQ3UTM2IDI3OCA0NyAzMDVUNzcgMzUzVDEyNCAzODRUMTgyIDM5NlEyMTMgMzk2IDIzOSAzODVUMjg1IDM1M1QzMTYgMzA2VDMyNyAyNDdRMzI3IDIxNyAzMTYgMTkwVDI4NSAxNDRUMjM5IDExM1QxODIgMTAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyNjsiIGdseXBoLW5hbWU9ImVsbGlwc2lzIiBob3Jpei1hZHYteD0iNzc2IiBkPSJNNTEzIDU1UTUxMyA3NSA1MjAgMTAzVDU0NSAxNDlRNTUxIDE1NSA1NTcgMTU5VDU3MyAxNjZUNTk0IDE3MFQ2MjYgMTcxUTY2OCAxNzEgNjg4IDE1NlQ3MDggMTA4UTcwOCA4OCA3MDEgNjBUNjc1IDE0UTY2MyAyIDY0OCAtM1Q1OTUgLThRNTUyIC04IDUzMyA3VDUxMyA1NVpNMjU0IDU1UTI1NCA3NSAyNjEgMTAzVDI4NyAxNDlRMjk5IDE2MSAzMTQgMTY2VDM2NyAxNzFRNDEwIDE3MSA0MjkgMTU2VDQ0OSAxMDhRNDQ5IDg4IDQ0MiA2MFQ0MTcgMTRRNDA1IDIgMzg5IC0zVDMzNiAtOFEyOTQgLTggMjc0IDdUMjU0IDU1Wk0tNCA1NVEtNCA3NSAzIDEwM1QyOCAxNDlRMzQgMTU1IDQwIDE1OVQ1NiAxNjZUNzcgMTcwVDEwOSAxNzFRMTUxIDE3MSAxNzEgMTU2VDE5MSAxMDhRMTkxIDg4IDE4NCA2MFQxNTggMTRRMTQ2IDIgMTMxIC0zVDc4IC04UTM1IC04IDE2IDdULTQgNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDMwOyIgZ2x5cGgtbmFtZT0icGVydGhvdXNhbmQiIGhvcml6LWFkdi14PSIxMTE3IiBkPSJNMzUgNTNRMzUgNjYgNDIgNzdUNjQgMTAzTDY4MyA2NThRNjg2IDY2MSA2OTggNjU3VDcyMyA2NDNUNzQ3IDYyMVQ3NTggNTkyUTc1OCA1NjkgNzI4IDU0MkwxMDkgLTE0UTEwNiAtMTYgOTUgLTEyVDcwIDFUNDYgMjRUMzUgNTNaTTIxMiAzMzhRMTc0IDMzOCAxNDUgMzQ5VDk2IDM3OFQ2NiA0MjJUNTYgNDc3UTU2IDUxNCA2NyA1NDZUMTAwIDYwM1QxNTYgNjQyVDIzNSA2NTdRMjc0IDY1NyAzMDMgNjQ2VDM1MiA2MTdUMzgyIDU3M1QzOTIgNTE4UTM5MiA0ODEgMzgxIDQ0OVQzNDggMzkyVDI5MSAzNTNUMjEyIDMzOFpNMjE4IDQzMVEyNDcgNDMxIDI2MiA0NTRUMjc3IDUxMlEyNzcgNTM1IDI2MyA1NDlUMjI5IDU2NFEyMDEgNTY0IDE4NSA1NDFUMTY5IDQ4M1ExNjkgNDYwIDE4MyA0NDZUMjE4IDQzMVpNNzU4IDEzMFE3NTggMTY3IDc2OSAxOTlUODAyIDI1NlQ4NTggMjk1VDkzNyAzMTBROTc1IDMxMCAxMDA0IDI5OVQxMDUzIDI3MFQxMDgzIDIyNlQxMDkzIDE3MVExMDkzIDEzNCAxMDgyIDEwMlQxMDQ5IDQ1VDk5MyA2VDkxNCAtOVE4NzYgLTkgODQ3IDJUNzk4IDMxVDc2OCA3NVQ3NTggMTMwWk00MDQgMTMwUTQwNCAxNjcgNDE1IDE5OVQ0NDggMjU2VDUwNCAyOTVUNTgzIDMxMFE2MjIgMzEwIDY1MSAyOTlUNzAwIDI3MFQ3MzAgMjI2VDc0MCAxNzFRNzQwIDEzNCA3MjkgMTAyVDY5NiA0NVQ2MzkgNlQ1NjAgLTlRNTIyIC05IDQ5MyAyVDQ0NCAzMVQ0MTQgNzVUNDA0IDEzMFpNODcxIDEzNlE4NzEgMTEzIDg4NSA5OVQ5MjAgODRROTQ5IDg0IDk2NCAxMDdUOTc5IDE2NVE5NzkgMTg4IDk2NSAyMDJUOTMxIDIxN1E5MDIgMjE3IDg4NyAxOTRUODcxIDEzNlpNNTE3IDEzNlE1MTcgMTEzIDUzMSA5OVQ1NjYgODRRNTk1IDg0IDYxMCAxMDdUNjI1IDE2NVE2MjUgMTg4IDYxMSAyMDJUNTc3IDIxN1E1NDkgMjE3IDUzMyAxOTRUNTE3IDEzNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzk7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xsZWZ0IiBob3Jpei1hZHYteD0iMzIzIiBkPSJNNzUgMTQ0UTY0IDE2MiA1NSAxNzlUMzkgMjEyVDI5IDIzOFQyNiAyNTNRMjYgMjU2IDMzIDI2N1Q1MiAyOTNUODEgMzI1VDExNyAzNjBRMTUxIDM5MiAxODggNDE1VDI1NiA0MzlRMjg4IDQzOSAzMDYgNDIzVDMyNCAzNzlRMzI0IDM0OSAzMDMgMzI0VDI0NyAyNzlRMjEyIDI1OCAxNzIgMjQyUTE4OCAyMzMgMjAzIDIyMlQyMzEgMTk4UTI1MCAxNzggMjYwIDE2MVQyNzEgMTI1UTI3MSA5NSAyNTAgNzVUMTkxIDU1UTE1NiA1NSAxMjcgODFUNzUgMTQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzQTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbHJpZ2h0IiBob3Jpei1hZHYteD0iMzIzIiBkPSJNNjYgNTVRMzQgNTUgMTYgNzFULTIgMTE1US0yIDE0NCAxOSAxNjlUNzUgMjE0UTEwOCAyMzUgMTUwIDI1MlExMzQgMjYxIDExOSAyNzJUOTIgMjk2UTUyIDMzNCA1MiAzNjlRNTIgMzk5IDczIDQxOVQxMzEgNDM5UTE2NiA0MzkgMTk1IDQxMlQyNDcgMzUwUTI1OCAzMzIgMjY3IDMxNVQyODMgMjgyVDI5MyAyNTZUMjk3IDI0MVEyOTcgMjM3IDI5MCAyMjdUMjcwIDIwMVQyNDEgMTY5VDIwNSAxMzRRMTcxIDEwMiAxMzQgNzlUNjYgNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgZ2x5cGgtbmFtZT0iZnJhY3Rpb24iIGhvcml6LWFkdi14PSI3MjMiIGQ9Ik0xMyA0OVExMyA3MyA0MCA5OUw2NDkgNjU5UTY1MyA2NjMgNjY3IDY2MVQ2OTYgNjUwVDcyMyA2MzBUNzM1IDYwMVE3MzUgNTc1IDcwOCA1NTBMOTkgLTEwUTk0IC0xNCA4MCAtMTJUNTEgLTFUMjUgMjBUMTMgNDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMEFDOyIgZ2x5cGgtbmFtZT0iRXVybyIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTcwIDE5NlE0MSAxOTYgMjcgMjA3VDEyIDIzN1ExMiAyNjggMzAgMjg2UTQ5IDMwNSA4MiAzMDVIMTA1UTEwNyAzMTMgMTA4IDMyMlQxMTIgMzQySDEwMVE3MiAzNDIgNTggMzUzVDQzIDM4M1E0MyA0MTQgNjEgNDMyUTgwIDQ1MSAxMTMgNDUxSDE0NFExNTggNDg0IDE3NSA1MTRUMjE0IDU2NlEyNjUgNjE2IDMyMiA2MzhUNDUxIDY2MVE1MTEgNjYxIDU1OSA2NDRUNjM1IDYwMFE2NTIgNTgzIDY1OSA1NjRUNjY2IDUyNFE2NjYgNDkwIDY1MSA0NzBUNjE4IDQzOVQ1ODUgNDI1VDU2OCA0MjRRNTQ3IDQ2MSA1MTcgNDgwVDQzNCA0OTlRNDAzIDQ5OSAzODUgNDkxVDM0OSA0NjRMMzM4IDQ1MUg0NTJRNDgxIDQ1MSA0OTUgNDM5VDUxMCA0MDlRNTEwIDM3OCA0OTIgMzYwUTQ3NCAzNDIgNDQwIDM0MkgyOThRMjk2IDMzMiAyOTUgMzIzVDI5MSAzMDVINDIxUTQ1MCAzMDUgNDY0IDI5M1Q0NzkgMjYzUTQ3OSAyMzIgNDYxIDIxNFE0NDMgMTk2IDQwOSAxOTZIMjkzUTMxOCAxNDkgMzkwIDE0OVE0MTAgMTQ5IDQyNiAxNTJUNDU4IDE2MlQ0ODcgMTgwVDUxNyAyMDdRNTE5IDIwOSA1MzEgMjA0VDU1NiAxODhUNTgxIDE2MVQ1OTIgMTI0UTU5MiA4MyA1NjAgNTFRNTMxIDIyIDQ4MCA1VDM2OSAtMTNRMjU1IC0xMyAxODQgNDJUMTAwIDE5Nkg3MEg3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMjI7IiBnbHlwaC1uYW1lPSJ0cmFkZW1hcmsiIGhvcml6LWFkdi14PSI3MTUiIGQ9Ik0zODkgNjAyUTM4OSA2MjcgMzk4IDYzOVQ0MzEgNjUySDQ2NFE0ODQgNjUyIDQ5MyA2NDZUNTA4IDYyNUw1NTkgNTA0TDYxMCA2MjVRNjE3IDY0MiA2MjYgNjQ3VDY1MyA2NTJINjg1UTcwOCA2NTIgNzE4IDY0MFQ3MjggNjAyVjM3M1E3MjggMzQ5IDcxOSAzMzdUNjg3IDMyNEg2NzBRNjI5IDMyNCA2MjkgMzczVjQ5OEw2MDEgNDA5UTU5OSA0MDAgNTkzIDM5NFQ1NTkgMzg4UTU0NCAzODggNTM2IDM4OVQ1MjUgMzk0VDUyMCA0MDBUNTE3IDQwOUw0ODggNDk0VjM3M1E0ODggMzQ5IDQ4MCAzMzdUNDQ4IDMyNEg0MzFRNDA4IDMyNCAzOTkgMzM2VDM4OSAzNzNWNjAyWk0yMDMgMzI0UTE2MCAzMjQgMTYwIDM3M1Y1NTZIMTExUTYzIDU1NiA2MyA2MDJWNjA0UTYzIDY0NyAxMTEgNjQ3SDMxM1EzNjEgNjQ3IDM2MSA2MDRWNjAyUTM2MSA1NTYgMzEzIDU1NkgyNjVWMzczUTI2NSAzMjQgMjE5IDMyNEgyMDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjEyOyIgZ2x5cGgtbmFtZT0ibWludXMiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik0xMDUgMTc4UTY3IDE3OCA1MiAxOTdUNDQgMjQ5TDQ2IDI1OFE1NCAyOTAgNzYgMzA5VDEzNyAzMjhINDk4UTUzNyAzMjggNTUyIDMwOVQ1NjAgMjU4TDU1OCAyNDlRNTUwIDIxNyA1MjggMTk4VDQ2NyAxNzhIMTA1SDEwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTk7IiBnbHlwaC1uYW1lPSJ1bmkyMjE5IiBob3Jpei1hZHYteD0iMjYyIiBkPSJNMTE1IDE1OFE3MyAxNTggNTQgMTczVDM0IDIyMVEzNCAyNDEgNDEgMjY5VDY2IDMxNVE3MiAzMjEgNzggMzI1VDk0IDMzMlQxMTUgMzM2VDE0NyAzMzdRMTg5IDMzNyAyMDggMzIyVDIyOCAyNzRRMjI4IDI1NCAyMjEgMjI3VDE5NiAxODBRMTg0IDE2OCAxNjggMTYzVDExNSAxNThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjYwOyIgZ2x5cGgtbmFtZT0ibm90ZXF1YWwiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik0xMjMgNTlINzZRNTMgNTkgMzkgNzFUMjUgMTA0UTI1IDExOCAzMSAxNDBUNTAgMTc3UTU5IDE4NiA3MSAxOTBUMTExIDE5NEgyMDhMMjc2IDMxNEgxMjhRMTA1IDMxNCA5MSAzMjZUNzcgMzU4UTc3IDM2NSA3OCAzNzVUODMgMzk1VDkxIDQxNVQxMDIgNDMyUTExMSA0NDAgMTIzIDQ0NFQxNjMgNDQ5SDM0Mkw0MTQgNTc2UTQzOSA2MjUgNDYyIDYzN1Q1MDIgNjQyTDUyMCA2MzJRNTM3IDYyNCA1MzggNjAyVDUxMyA1MzBMNDY3IDQ0OUg1MTRRNTQ2IDQ0OSA1NjIgNDM2VDU3OSA0MDFRNTc5IDM5NSA1NzggMzg2VDU3MyAzNjdUNTY2IDM0OFQ1NTQgMzMxUTU0NSAzMjMgNTMzIDMxOVQ0OTMgMzE0SDM4M0wzMTQgMTk0SDQ2MlE0OTQgMTk0IDUxMCAxODFUNTI3IDE0NlE1MjcgMTQwIDUyNiAxMzFUNTIxIDExMlQ1MTQgOTNUNTAyIDc3UTQ5MyA2OCA0ODEgNjRUNDQxIDU5SDI0N0wxNzcgLTcwUTE1MSAtMTIwIDEyOCAtMTMyVDkwIC0xMzdMNzEgLTEyN1E2MyAtMTIzIDU4IC0xMTZUNTMgLTk2VDU4IC02N1Q3NyAtMjRMMTIzIDU5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGdseXBoLW5hbWU9Imxlc3NlcXVhbCIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTE0MSAzNDJRMTE4IDM1MyAxMDcgMzY4VDk1IDQxMlE5NSA0NDIgMTExIDQ2NFQxNTQgNDk4TDU1OSA2NDZRNTYyIDY0NyA1NjkgNjQxVDU4MyA2MjJUNTk2IDU5NFQ2MDIgNTYxUTYwMiA1MzcgNTg0IDUxMlQ1MTcgNDcyTDMyMSA0MThMNDY1IDM2N1E1MDggMzUwIDUyMiAzMjNUNTM1IDI3MlE1MzUgMjU0IDUyOCAyMzlUNTExIDIxM1Q0OTMgMTk1VDQ4MSAxOTFMMTQxIDM0MlpNMjUgODJRMjUgOTYgMzAgMTE2VDQ4IDE0OFE1OCAxNTggNzIgMTYzVDExMSAxNjhINDQ0UTQ3OCAxNjggNDk1IDE1NFQ1MTIgMTE2UTUxMiAxMDIgNTA3IDgyVDQ4OSA1MFE0NzkgNDAgNDY1IDM1VDQyNiAzMEg5NFE1OSAzMCA0MiA0NFQyNSA4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjU7IiBnbHlwaC1uYW1lPSJncmVhdGVyZXF1YWwiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik0xMDMgMTk1UTEwMCAxOTQgOTMgMTk5VDc5IDIxNVQ2NiAyNDFUNjAgMjczUTYwIDI4NSA2NCAyOThUNzcgMzIzVDEwMyAzNDVUMTQ1IDM2MkwzNDYgNDIzTDE5NyA0NzZRMTc1IDQ4MyAxNjIgNDkzVDE0MCA1MTVUMTMwIDUzOVQxMjcgNTYzUTEyNyA1ODAgMTM0IDU5NVQxNTEgNjIyVDE2OSA2MzlUMTgxIDY0NEw1MjEgNDkyUTU0NCA0ODIgNTU1IDQ2N1Q1NjcgNDIyUTU2NyAzOTIgNTUxIDM3MFQ1MDggMzM2TDEwMyAxOTVaTTI1IDgyUTI1IDk2IDMwIDExNlQ0OCAxNDhRNTggMTU4IDcyIDE2M1QxMTEgMTY4SDQ0NFE0NzggMTY4IDQ5NSAxNTRUNTEyIDExNlE1MTIgMTAyIDUwNyA4MlQ0ODkgNTBRNDc5IDQwIDQ2NSAzNVQ0MjYgMzBIOTRRNTkgMzAgNDIgNDRUMjUgODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjAxOyIgZ2x5cGgtbmFtZT0iZmkiIGhvcml6LWFkdi14PSI3MTMiIGQ9Ik01NDEgNjMxUTU0MSA2NzggNTcxIDcwNVQ2NDcgNzMzUTY5NCA3MzMgNzIwIDcxMVQ3NDYgNjU0UTc0NiA2MDggNzE2IDU4MFQ2NDAgNTUyUTU5MiA1NTIgNTY3IDU3NFQ1NDEgNjMxWk0xMTYgMzUxSDMzTDYzIDQ5NkgxNDZMMTUwIDUxM1ExNjIgNTcwIDE4MyA2MDhUMjMzIDY2OFQyOTQgNzAwVDM2NSA3MDlRNDA3IDcwOSA0MzUgNzAwVDQ4MSA2NzNRNTAyIDY1MiA1MDIgNjIyUTUwMiA2MDQgNDk1IDU4OVQ0ODAgNTYzVDQ2NSA1NDdUNDU2IDU0MlE0NDYgNTUzIDQzMCA1NjBUMzkzIDU2N1EzNzAgNTY3IDM1NiA1NTZUMzM0IDUxNEwzMzAgNDk2SDQ0NEw0MTMgMzUxSDMwOEwyNTAgODFRMjQwIDMzIDIxOCAxNVQxNjIgLTRIMTQyUTEyNCAtNCAxMDcgMFQ3OCAxNFQ1OSA0MFQ1OSA4MUwxMTYgMzUxWk01MTcgNDk2SDcwOUw2MzEgMTM1UTYyMSA5MCA2MjkgNzBUNjYzIDQyUTY2NCA0MiA2NjEgMzRUNjQ2IDE1VDYxMyAtM1Q1NTggLTEyUTUxNiAtMTIgNDkwIDBUNDUxIDMzVDQzNiA4MlQ0NDEgMTQyTDUxNyA0OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjAyOyIgZ2x5cGgtbmFtZT0iZmwiIGhvcml6LWFkdi14PSI3MTMiIGQ9Ik0xMTYgMzUxSDMzTDYzIDQ5NkgxNDZMMTUwIDUxM1ExNjIgNTcwIDE4MyA2MDhUMjMzIDY2OFQyOTQgNzAwVDM2NSA3MDlRNDA3IDcwOSA0MzUgNzAwVDQ4MSA2NzNRNTAyIDY1MiA1MDIgNjIyUTUwMiA2MDQgNDk1IDU4OVQ0ODAgNTYzVDQ2NSA1NDdUNDU2IDU0MlE0NDYgNTUzIDQzMCA1NjBUMzkzIDU2N1EzNzAgNTY3IDM1NiA1NTZUMzM0IDUxNEwzMzAgNDk2SDQ0NEw0MTMgMzUxSDMwOEwyNTAgODFRMjQwIDMzIDIxOCAxNVQxNjIgLTRIMTQyUTEyNCAtNCAxMDcgMFQ3OCAxNFQ1OSA0MFQ1OSA4MUwxMTYgMzUxWk01NTggNjk3SDc1MEw2MzEgMTM1UTYyMSA5MCA2MjkgNzBUNjYzIDQyUTY2NCA0MiA2NjEgMzRUNjQ2IDE1VDYxMyAtM1Q1NTggLTEyUTUxNiAtMTIgNDkwIDBUNDUxIDMzVDQzNiA4MlQ0NDEgMTQyTDU1OCA2OTdaIiAgLz4KKworPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hkZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxN2Q7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ii8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJKIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iVCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJXIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IloiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ4IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRkOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJAIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJHIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9Ik8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iUSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJWIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlciIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iWSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJcIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkNjsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YWU7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGE5OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMTIyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDg7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDNjMDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkNTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTUyOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxYzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTc4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQzOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkNDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDI7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRhOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRiOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ5OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTYwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE2MTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImYW1wOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iKSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyYzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSItIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iLiIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkciIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkoiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJPIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJRIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJTIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iVCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJYIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iXSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJhIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iYyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImQiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJlIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Im0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ibyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJxIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InMiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ0IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ1IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ifSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGM1OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hlNzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hhZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkODsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDNjMDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGU2OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGFiOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGJiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMjY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQ1OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTUyOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTUzOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMTM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxNDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDM5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwM2E7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxYTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDFlOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGMyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQ0OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDI7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxMzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZGQ7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTdkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSIvIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iPyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iSiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlQiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJWIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iVyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlgiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlkiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJaIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZTc7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxYzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMTg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxNzg7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4ZGQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJKIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJUIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJWIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iWCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iWSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3gxNzg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4ZGQ7IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJWIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlciIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iWSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iZyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJqIiBrPSItMzgiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSImI3gxNzg7IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSJBIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMwOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMxOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRkOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIxIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iNCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjgiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJDIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iRyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Ik8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJRIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iVCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlYiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJZIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDE1MjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNzg7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZGE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ5OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGRkOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxN2Q7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iMSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IjciIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJBIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlQiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iViIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJXIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJZIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IloiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9InkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGM1OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4ZTY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzA7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTc4OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzE7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRkOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSIwIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iNCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iOCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJBIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iRyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJPIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJVIiBrPSIzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iViIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iWSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGM1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNTI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNzg7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDk7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iNCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkMiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iRyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJPIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IlEiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iYSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJkIiBrPSIzIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImciIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQ2OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkODsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZTY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDU7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeDE1MjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IjciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSItIiBrPSIzIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iNCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iJiN4MjAxNDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyYzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSIuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iNyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMjY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAxYTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyMDFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IjciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3hiMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjEyMjsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iJiN4MmM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iLiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IjciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDI2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iJiN4MjAxZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyYzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSIuIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iNyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMjY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAxYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyMDFlOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSItIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iMCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iMyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI0IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjUiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI6IiBrPSI1IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeGEyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyYzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSIuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iNyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMjY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAxYTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDFlOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDJjOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9Ii4iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSI3IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMjY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAxYTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSImI3gyMDFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGRkOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IjEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSI3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJWIiBrPSI1IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOiIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4MTc4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGRkOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IjEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSI3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iVCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJWIiBrPSI1IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iVyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOyIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4MTc4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJmd0OyIgdTI9IjciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4ZGQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iQSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IlQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iWSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM1OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeDE3ODsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNjA7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGRkOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSIqIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDJjOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSItIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Ii4iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iQCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkEiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iQyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iUyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJUIiBrPSI4MyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iViIgaz0iODgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJXIiBrPSI3OCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlkiIGs9Ijg4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ1IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InYiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idyIgaz0iNDMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ4IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzU7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hhZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hhOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMTIyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDNjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDI2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNTI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDEzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFkOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFhOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFlOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzE7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSImI3hkZDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJWIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iVyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSImI3gxNzg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4MTdkOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IlQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJWIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iWiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImEiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iYyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJkIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImUiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ibyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJxIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InkiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZTc7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGU2OyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxNTM7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGRkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxN2Q7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Ii8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iPyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IkoiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iVCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJWIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlkiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJ4IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMTg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTc4OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iQCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IlQiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iYSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJkIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJnIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ibyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGU3OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGE5OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDNjMDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hlNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3gxNTM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTYxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkZDsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJmFtcDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MmM7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Ii0iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iLiIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iQCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iSiIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJUIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJYIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlkiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJkIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImUiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJvIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0icSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJyIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZTc7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGE5OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gzYzA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZTY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMjY7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTUzOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDEzOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDE0OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNzg7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMWE7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMWU7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hkZDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyYzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iLiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJUIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iViIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJZIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjEyMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMDI2OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gxNzg7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAxYTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAxZTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0iLyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSCIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSIvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJJIiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDJjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSiIgdTI9Ii4iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSiIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4MjAyNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMWE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4MjAxZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGYwOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE2MDsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkZDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTdkOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiZhbXA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJAIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iQyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJPIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iUSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJUIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJWIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJYIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlkiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJmIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4YWU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4YTk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4M2MwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ1OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE1MjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MjAxMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MjAxNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTc4OyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkZDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkMiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iRyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJPIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlEiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVCIgaz0iMTMwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlYiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVyIgaz0iOTgiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJZIiBrPSIxNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJcIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNjsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZGM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YWU7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGE5OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMTIyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDg7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDNjMDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUyOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxYzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTc4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQzOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDI7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRhOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRiOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ5OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTSIgdTI9Ii8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik0iIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iTSIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0iLyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTiIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hkZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTdkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSIvIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Ij8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJKIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlQiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iViIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJXIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlgiIGs9IjkiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJZIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IloiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ieCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxYzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDE4OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGRkOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ZDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImYW1wOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDJjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSIuIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkEiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJKIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlYiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iVyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlgiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IloiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InQiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ3IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IngiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0ieSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyMDI2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MTc4OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMyOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMxOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGRkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxN2Q7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ii8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iSiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJUIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iVyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJYIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iWSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJaIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTc7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxNzg7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hkZDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJmFtcDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iQSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJKIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iVCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iWCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJZIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9InYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0idyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJ5IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGM0OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjNTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzY7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGMwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjMzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4MTc4OyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGRkOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IkEiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iViIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJYIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNDsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzU7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM2OyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMDsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzM7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeDE3ODsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMjsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzE7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE2MTsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZGQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE3ZDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImYW1wOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iLSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSIuIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IjoiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJAIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iQSIgaz0iNDMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJDIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iRyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkoiIGs9IjEwMSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Ik8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJRIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iVCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJWIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iWSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJaIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iXCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJhIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImMiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZCIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJlIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJnIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJvIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idiIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ3IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ieSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ6IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM0OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTc7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM2OyIgaz0iNjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkODsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gzYzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGJmOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhYjsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YmI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMjY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMwOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTUyOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE1MzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxMzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxNDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTc4OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDM5OyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDNhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFlOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMjsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzE7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQyOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MmM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iLiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IkEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iSiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVSIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjNDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzU7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGM2OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3gyMDI2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGMwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjMzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAxYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3gyMDFlOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGMyOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjMTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTYwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNjE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGRkOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImYW1wOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSIpIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDJjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSItIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iOiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJBIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IkoiIGs9IjczIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iUyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJUIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iVyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iWSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJdIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJnIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im4iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJzIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ1IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ4IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ieSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9In0iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM2OyIgaz0iNTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YWI7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGJiOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMjY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAxMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAxNDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTc4OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDM5OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDNhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDEzMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDE2MTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJmFtcDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIpIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDJjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Ii0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iLiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IjoiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkEiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJKIiBrPSIxMDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJPIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iUSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iViIgaz0iMSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJdIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImEiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImMiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZCIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJlIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJnIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJpIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im4iIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJvIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InAiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJxIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InIiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJzIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ1IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ9IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM0OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM1OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGU3OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hhZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hhOTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNjsiIGs9IjU4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4M2MwOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGU2OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hhYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YmI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAyNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkNTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNTI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTUzOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDM5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDNhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMWE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkMzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkMjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxMzE7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTYwOyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkZDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJmFtcDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSIpIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSItIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iQSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJDIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iRyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ik8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJRIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iUyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJUIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iWSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJdIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im0iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJuIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InAiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJxIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iciIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ1IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ieSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ9IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjNDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzU7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM2OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkODsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjMDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ1OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE1MjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MjAxMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gyMDE0OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE3ODsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzI7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxMzE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTYwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNjE7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiZhbXA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iKSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MmM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ii0iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iLiIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSI6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJBIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJHIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iSiIgaz0iODMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJPIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iUSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlMiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iVCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJWIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iXSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iYSIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJjIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImQiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZSIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJmIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJtIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJwIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJzIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ1IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ieCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ifSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZTc7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ4OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDNjMDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hlNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YWI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGJiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDI2OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNTI7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTUzOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDEzOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDE0OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDM5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDNhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDFhOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDFlOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNDsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxMzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGYwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Ii0iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iQSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkMiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iRyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJKIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iTyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJRIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IlQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJmIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJpIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iaiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzQ7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDY7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ1OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxNTI7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MjAxMzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MjAxNDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDM7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ0OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkMjsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IiYjeGRkOyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iViIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJXIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlkiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iWyIgdTI9ImciIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iaiIgaz0iLTM4IiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iJiN4MTc4OyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZGQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlQiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iViIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJXIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlkiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iYSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJkIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iZSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImoiIGs9Ii0zMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJxIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZTc7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZTY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeDE3ODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iPyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0idiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iYSIgdTI9InkiIGs9IjEiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMWM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iJiN4MjAxODsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gxNjE7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDJjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ii4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSIvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iOiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InMiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InYiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InkiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIxMjI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAyNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDE4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJkIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9ImQiIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0ieSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGYwOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiZhbXA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iKSIgaz0iLTE4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iKiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSI6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ij8iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IlwiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Il0iIGs9Ii0xOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJjIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9In0iIGs9Ii0xOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIxMjI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hhYjsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YmI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFjOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFkOyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxODsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxOTsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMzk7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwM2E7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IikiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iLyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSJdIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iZyIgdTI9ImciIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iaiIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0idCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSJ9IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMWM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMWQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3gyMDE4OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3gyMDE5OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iPyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0idiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InkiIGs9IjEiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIwMWM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxODsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImoiIHUyPSJqIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iaiIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJqIiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iZyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iayIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJxIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImwiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0ibCIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iPyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibSIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0idiIgaz0iMSIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InkiIGs9IjEiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibSIgdTI9IiYjeDIwMWM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iJiN4MjAxODsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSI/IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0ieSIgaz0iMSIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIxMjI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iJiN4MjAxYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSImI3gyMDE4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDE2MTsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MmM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iLiIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9Ii8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSI6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibyIgdTI9Ij8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0icyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idiIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ4IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0ieSIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ6IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjEyMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSImI3gyMDI2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMTg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gxNjE7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDJjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9Ii4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSIvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iOiIgaz0iMyIgLz4KKzxoa2VybiB1MT0icCIgdTI9IjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0icCIgdTI9InMiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0icCIgdTI9InYiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieCIgaz0iMSIgLz4KKzxoa2VybiB1MT0icCIgdTI9InkiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieiIgaz0iNCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIxMjI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iJiN4MjAyNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDE4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJxIiB1Mj0iaiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyYzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ii4iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSI/IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iciIgdTI9ImYiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iciIgdTI9InQiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0idiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0idyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ4IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iciIgdTI9InkiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMjY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFjOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFkOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxODsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxOTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMWE7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMWU7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDJjOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSIuIiBrPSItMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0idCIgdTI9InYiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0ieCIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJ5IiBrPSItNCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMjY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFjOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDE4OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFhOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFlOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InUiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idSIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MmM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9Ii0iIGs9IjMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSIuIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJjIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9InYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0idyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ5IiBrPSItOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMjY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDEzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTQ7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxYzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxZDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxODsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxOTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxYTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxZTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MmM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iLiIgaz0iOCIgLz4KKzxoa2VybiB1MT0idyIgdTI9InYiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0ieSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDI2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMTg7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMTk7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSItIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGFiOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDE0OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTg7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTk7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMzk7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDJjOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSItIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iLiIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJ2IiBrPSItOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InciIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0ieSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDI2OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxMzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTg7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTk7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWE7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWU7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0ieiIgdTI9Ii0iIGs9IjgiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iZyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ieiIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4YWI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDEzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MjAzOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IiYjeGRkOyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iViIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJXIiBrPSItMyIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IlkiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0ieyIgdTI9ImciIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iaiIgaz0iLTM4IiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iJiN4MTc4OyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNjA7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iKiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDJjOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ii0iIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSIuIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iQCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iQSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJHIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iSiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iTyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJTIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iVCIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJXIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iWSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IngiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ6IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzU7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZTc7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hhZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGE5OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjEyMjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gzYzA7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMjY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzA7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTUyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDE4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxYTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFlOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMyOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMxOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDE2MDsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSIqIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MmM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iLSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Ii4iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJAIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJBIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iQyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJKIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJPIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iUSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlMiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJUIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iViIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlciIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJZIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0idCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InoiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGFlOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YTk7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMTIyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGM2OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDNjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAyNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNTI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDE0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMTg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDFhOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWU7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzE7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iQCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iVCIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImciIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9Im8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGU3OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YWU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hhOTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeDNjMDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGU2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4MTUzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDE7IiB1Mj0iLyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDE7IiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQxOyIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hkZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxN2Q7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9Ii8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJKIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iVCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJXIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iWCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iWSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IloiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJ4IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MmM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSIuIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iSiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDI2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MjAxYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDIwMWU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjMTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSI/IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ5IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iJiN4MjAxYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IiYjeDIwMTg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSI/IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ5IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iJiN4MjAxYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IiYjeDIwMTg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSI/IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ5IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iJiN4MjAxYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IiYjeDIwMTg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSI/IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ5IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IiYjeDIwMTg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSI/IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJ5IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSImI3gyMTIyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iJiN4MjAxYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IiYjeDIwMTg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gxNjE7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MmM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSIuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSIvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSI6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJzIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0idiIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IngiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InkiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ6IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMTIyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAyNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMWM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDFhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDE2MTsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyYzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ii4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ii8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IjoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ij8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InMiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJ2IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0ieCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0ieSIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InoiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIxMjI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDI2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDE4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MTYxOyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDJjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iLiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iLyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iOiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iPyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0icyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InYiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ4IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ5IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0ieiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjEyMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMjY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMTg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxYTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMWU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gxNjE7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MmM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSIuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSIvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSI6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJzIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0idiIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IngiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InkiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ6IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMTIyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAyNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMWM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDFhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGIwOyIgdTI9IjQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hhMzsiIHUyPSIxIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YTM7IiB1Mj0iNCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MTYxOyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDJjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iLiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iLyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iOiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iPyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iZyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0icyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InYiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ4IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ5IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0ieiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjEyMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMjY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDFjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMTg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxYTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMWU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hkZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IkEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGM0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3gxNzg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMxOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4ZGQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJBIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJUIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJZIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGM1OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGMzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4MTc4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IkAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IlQiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJhIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJjIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJkIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJlIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJmIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJnIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJvIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hlNzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4YTk7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gzYzA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hlNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGRkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE3ZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iLyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Ij8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IkoiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJUIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iViIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJYIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJZIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iWiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDE4OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTc4OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4ZGQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iQSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iWSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGM0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGM1OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGM2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeDE3ODsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9IngiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9InkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDE2MTsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyYzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ii4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ii8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IjoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ij8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InMiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ2IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieSIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InoiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIxMjI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDI2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDE4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZGQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IjMiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSI3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJDIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJHIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJPIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJRIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJUIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iViIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ4IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ4OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNTI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNzg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTkyOyIgdTI9IjEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSImI3hkZDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJUIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iViIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iVyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iWSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IiYjeDE3ODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSImI3hkZDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJUIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iViIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJZIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0ieCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9InoiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSImI3gxNzg7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkZDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjQiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iOCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IkEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IkMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IkciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9Ik8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IlEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IlQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IlUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iViIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJZIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGMwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeDE1MjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTc4OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRhOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDk7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE2MDsiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSIqIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MmM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iLSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Ii4iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJAIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJBIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iQyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJKIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJPIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iUSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlMiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJUIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iViIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlciIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJZIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ieCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InoiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGFlOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YTk7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMTIyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM2OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDNjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAyNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxNTI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMWM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMTg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFhOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMWU7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzE7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MTYwOyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGRkOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IioiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyYzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSItIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iLiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkAiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkEiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJDIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iRyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9Ik8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJRIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iUyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlQiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJWIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iVyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ0IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ4IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ieSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ieiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM1OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YWU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hhOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIxMjI7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4M2MwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDI2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMwOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE1MjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDEzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMTQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFkOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMWE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxZTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3hkZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxN2Q7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Ii8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJKIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iVCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJXIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iWCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iWSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IloiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ4IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IkAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJUIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJjIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJmIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9Im8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hlNzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhOTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gzYzA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZTY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4MTUzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNTM7IiB1Mj0ieSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hkZDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeDE3ZDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iMSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSI3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IkEiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlQiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlYiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iWSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iWiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IngiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0ieSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzU7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzA7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTc4OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGRkOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTdkOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSIxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iQSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iVCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iViIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iVyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iWCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJZIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJaIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJkIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJxIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ieCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9InoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjMDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3gxNzg7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMxOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTYxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hkZDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IkoiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlQiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlciIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlkiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJkIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJuIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9Im8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJxIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJ1IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTc4OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDEzMTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTYwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJDIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJHIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJKIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJPIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJRIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJTIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImEiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImMiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImQiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImUiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9Im8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9InEiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZTc7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGU2OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3gxNTI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3gxNTM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNjE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGRkOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iSiIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iViIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iWCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iWSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iYSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJnIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJtIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9Im4iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJwIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iciIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJzIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU3OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNzg7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTMxOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3gxNjA7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9Ik8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0ibyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0icSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hlNzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ4OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZTY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNjE7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiZhbXA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iKSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MmM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ii0iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iLiIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSI6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJBIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iQyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkciIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJKIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ik8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJRIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iUyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJUIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iWCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJdIiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJhIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImMiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZCIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJlIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJnIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Im0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJvIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0icSIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJyIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InMiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ4IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ9IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjNTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YWU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YTk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDg7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4M2MwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGU2OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YmI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMjY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ1OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDE1MjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNTM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMTM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMTQ7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMzk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwM2E7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMWE7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMWU7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ0OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQyOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IiYjeGRkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iVCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iViIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAzOTsiIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IiYjeDE3ODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IiYjeGRkOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iVCIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iViIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iVyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iWSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0ieCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0ieiIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iJiN4MTc4OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGQ7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIwIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIxIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI0IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IjgiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iOSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJBIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJDIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJHIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJPIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJRIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJUIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJVIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlYiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iWSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJqIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzU7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3gxNTI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE3ODsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ5OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRkOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSI4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iQSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iQyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iRyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iTyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iUSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iVCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iVSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJWIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlkiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iaiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ieSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjNDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkYzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzA7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTUyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNzg7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRiOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTYwOyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGRkOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IioiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyYzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSItIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iLiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkAiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkEiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJDIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iRyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ik8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJRIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iUyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlQiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJWIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iVyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ0IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ4IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ieSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ieiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGM0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGM1OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YWU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hhOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIxMjI7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4M2MwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDI2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMwOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDE1MjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDEzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDFkOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxZTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJAIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJUIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iYSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iYyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0ibyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0icSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZTc7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hhZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGE5OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4M2MwOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZTY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3gxNTM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNjA7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iKiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDJjOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Ii0iIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSIuIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iQCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iQSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJHIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iSiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iTyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJTIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iVCIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJXIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iWSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IngiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ6IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzU7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZTc7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hhZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGE5OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjEyMjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gzYzA7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMjY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzA7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MTUyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMWQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDE4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFlOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMyOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMxOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQ0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IkAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IlQiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJhIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJjIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJkIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJlIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJmIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJnIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJvIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hlNzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4YTk7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3gzYzA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hlNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeDE1MzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IkAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IlQiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJhIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJjIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJkIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJlIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJmIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJnIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJvIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hlNzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGFlOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4YTk7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3gzYzA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hlNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeDE1MzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGNkOyIgdTI9Ii8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNkOyIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjZDsiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0iLyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGNlOyIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSIvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2Y7IiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGNjOyIgdTI9Ii8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNjOyIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjYzsiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZGQ7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTdkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSIvIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iPyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iSiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlQiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJWIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iVyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlgiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlkiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJaIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ieCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ieiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZTc7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxYzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMTg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gxNzg7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeGRkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE3ZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iLyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Ij8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IkoiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJUIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iViIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJYIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJZIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iWiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMWM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDE4OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTc4OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hkZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxN2Q7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9Ii8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSI/IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJKIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iVCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJXIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IloiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJ4IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDFjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAxODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MmM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSIuIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iSiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjNDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjNTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyMDI2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MjAxYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeDIwMWU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjMTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyYzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9Ii4iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IkEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSJKIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM0OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM2OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeDIwMjY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3hjMDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3hjMzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyMDFhOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4MjAxZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMyOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDJjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iLiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iQSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzU7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzY7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4MjAyNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDIwMWE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyMDFlOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzI7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YTQ7IiB1Mj0iNCIgaz0iNSIgLz4KKworPC9mb250PgorPC9kZWZzPgorPHRleHQgeD0iNDAiIHk9IjQwIiBmb250LWZhbWlseT0iT21uZXNBVFQgVzAyIEJvbGQgSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQcOBw4DDgsOEw4XDg8OGIEPDhyBEw5AgRcOJw4jDisOLIEkgw40gw4wgw44gw48gTsORPC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjgwIiBmb250LWZhbWlseT0iT21uZXNBVFQgVzAyIEJvbGQgSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+T8OTw5LDlMOWw5XDmMWSIFPFoCBVw5rDmcObw5wgWcOdxbggWsW9IMOeIGHDocOgw6LDpMOlw6PDpiBjw6cgZMOwIGXDqcOow6rDqyBpIMSxIMOtIMOsIMOuIMOvIG7DsSBvw7PDssO0w7bDtcO4xZMgc8Whw58gdcO6w7nDu8O8IHnDvcO/IHrFvjwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxMjAiIGZvbnQtZmFtaWx5PSJPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7DviAxMjM0NTY3ODkwIMK9IMK8IMK+ICUg4oCwICTCosKjwqXGkuKCrMKkIOKAoCDigKEgwqcgwrYgIyBefsK1ICvDl8KxICZsdDsgPSAmZ3Q7IMO3wqwgIcKhP8K/ICZxdW90OyAmYW1wOyAmYXBvczsgKiDCsCAuICwgOiA7ICgpIFsgXCBdIHt9IC8gfDwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxNjAiIGZvbnQtZmFtaWx5PSJPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7CpiBfIOKAmiDigJ4g4oCmIOKAueKAuiDCq8K7IOKAmCDigJkg4oCcIOKAnSDigKIgwq0gLSDigJMg4oCUIEAgwqkgwq4g4oSiIMKqwrogwrnCssKzIMK0IGAgy4Ygy5wgwqggwq8gwrcgwrg8L3RleHQ+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMudHRmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzQVRUVzAyQm9sZEl0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzNWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMud29mZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc0FUVFcwMkJvbGRJdGFsaWMud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzIyZGNlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzQVRUVzAyQm9sZEl0YWxpYy53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDIuZW90IGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMi5lb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllMWVhZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDIuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDIuc3ZnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5MjNkZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDIuc3ZnCkBAIC0wLDAgKzEsMzY5NCBAQAorPD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCIgPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID4KKzxtZXRhZGF0YT4KKzx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKzxpZD48IVtDREFUQVtPbW5lc19BVFQgVzAyXV0+PC9pZD4KKzx2ZW5kb3I+TW9ub3R5cGUgSW1hZ2luZyBJbmMuPC92ZW5kb3I+Cis8Y3JlZGl0cz4KKzxuYW1lPkZvbnRzLmNvbSBXZWJGb250czwvbmFtZT4KKzxVUkw+aHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbTwvVVJMPgorPHJvbGU+SG9tZSBvZiB0aGUgV2ViIGZvbnRzPC9yb2xlPgorPC9jcmVkaXRzPgorPGxpY2Vuc2U+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb20vTGVnYWw8L1VSTD4KKzwvbGljZW5zZT4KKzxjb3B5cmlnaHQ+PCFbQ0RBVEFbR2VuZXJhdGVkIGJ5IFJvYm9Gb2ddXT48L2NvcHlyaWdodD4KKzx0cmFkZW1hcms+PC90cmFkZW1hcms+Cis8bGljZW5zZWU+Cis8bmFtZT48L25hbWU+Cis8L2xpY2Vuc2VlPgorPC9tZXRhZGF0YT4KKzxkZWZzID4KKzxmb250IGhvcml6LWFkdi14PSI1NTIiIGlkPSJPbW5lc19BVFRXMDIiPgorPGZvbnQtZmFjZSBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiIgcGFub3NlLTE9IjIgMCA2IDYgNCAwIDAgMiAwIDQiIGFzY2VudD0iNzAwIiBkZXNjZW50PSItMzAwIiB1bml0cy1wZXItZW09IjEwMDAiIGFscGhhYmV0aWM9IjAiPgorPC9mb250LWZhY2U+Cis8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iMTcwIiAvPgorCis8Z2x5cGggdW5pY29kZT0iJiN4QTsiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDsiIC8+Cis8Z2x5cGggdW5pY29kZT0iICIgZ2x5cGgtbmFtZT0ic3BhY2UiIGhvcml6LWFkdi14PSIxNzAiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgZ2x5cGgtbmFtZT0iZXhjbGFtIiBob3Jpei1hZHYteD0iMjc3IiBkPSJNMTM0IDE3OFExMjUgMTc4IDEyMyAxODRUMTE5IDIwMkw5NyA2NDdIMTgwTDE1OCAyMDJRMTU3IDE5MSAxNTUgMTg1VDE0MiAxNzhIMTM0Wk0xMzMgLTZRODkgLTYgODkgMzhWNDhRODkgNjkgMTAwIDgxVDEzMyA5M0gxNDNRMTY1IDkzIDE3NiA4MVQxODggNDhWMzhRMTg4IC02IDE0MyAtNkgxMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGdseXBoLW5hbWU9InF1b3RlZGJsIiBob3Jpei1hZHYteD0iMzg3IiBkPSJNMjYyIDM5MVEyNTMgMzkxIDI1MCAzOTdUMjQ1IDQxN0wyMjYgNjQ3SDMwOEwyODkgNDE3UTI4NyA0MDQgMjg0IDM5OFQyNzIgMzkxSDI2MlpNMTE0IDM5MVExMDUgMzkxIDEwMiAzOTdUOTcgNDE3TDc4IDY0N0gxNjBMMTQxIDQxN1ExMzkgNDA0IDEzNiAzOThUMTI0IDM5MUgxMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIjIiBnbHlwaC1uYW1lPSJudW1iZXJzaWduIiBob3Jpei1hZHYteD0iNjgxIiBkPSJNMTQ3IC00UTEyNyAtNCAxMTcgMTRUMTIwIDc4TDE1MCAxNzVIMjlWMjMzSDE2N0wxOTUgMzIzUTIwNyAzNjMgMjIzIDQxNEgxMDNWNDcySDI0MFEyNDUgNDg0IDI0OSA0OTlRMjUzIDUxMSAyNTcgNTI3VDI2NyA1NjBRMjc4IDU5OSAyOTQgNjQ4UTI5NCA2NDkgMjk3IDY1MFQzMDYgNjUxUTMyNiA2NTEgMzM2IDYzM1QzMzMgNTY5TDMwMyA0NzJINDY4TDUyMiA2NDhRNTIyIDY0OSA1MjUgNjUwVDUzNCA2NTFRNTU0IDY1MSA1NjQgNjMzVDU2MSA1NjlMNTMxIDQ3Mkg2NTJWNDE0SDUxM0w0NTggMjMzSDU3OFYxNzVINDQwTDM4NyAtMVEzODcgLTIgMzg0IC0zVDM3NSAtNFEzNTUgLTQgMzQ1IDE0VDM0OCA3OEwzNzggMTc1SDIxM0wxNTkgLTFRMTU5IC0yIDE1NiAtM1QxNDcgLTRaTTM5NyAyMzFMNDUzIDQxNkgyODRMMjI4IDIzMUgzOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIkIiBnbHlwaC1uYW1lPSJkb2xsYXIiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik0yNTIgLTEwUTE5MyAtNCAxNTAgMTZUODEgNjJRNTIgOTEgNTIgMTE1UTUyIDEyNiA1OCAxMzRUNzEgMTQ3VDg1IDE1NVQ5MiAxNTZRMTE1IDExNyAxNTYgODlUMjU1IDUyVjMwMVEyMjAgMzEwIDE4NyAzMjNUMTI3IDM1NlQ4NSA0MDdUNjkgNDgxUTY5IDUxNSA4MyA1NDVUMTIyIDU5OFQxODEgNjM2VDI1NCA2NTdWNzQySDMxNFY2NThRMzcxIDY1MyA0MTIgNjM1VDQ3NyA1OTNRNDg4IDU4MiA0OTQgNTcwVDUwMSA1NDdRNTAxIDUzNiA0OTUgNTI4VDQ4MiA1MTVUNDY4IDUwN1Q0NjEgNTA2UTQ0MSA1NDEgNDAyIDU2NlQzMTEgNTk3VjM1N1EzNDggMzQ4IDM4NCAzMzVUNDUwIDMwMVQ0OTYgMjQ4VDUxNCAxNzBRNTE0IDEzNCA0OTkgMTAyVDQ1NiA0NlQzOTIgN1QzMTIgLTExVi05OEgyNTJWLTEwWk0zMDggNTFRMzcwIDU1IDQwOCA4N1Q0NDcgMTY3UTQ0NyAxOTQgNDM2IDIxM1Q0MDYgMjQ3VDM2MiAyNzBUMzA4IDI4OFY1MVpNMjU4IDU5NlEyMDUgNTg5IDE3MSA1NThUMTM2IDQ4MlExMzYgNDMyIDE2OSA0MDlUMjU4IDM3MFY1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIlIiBnbHlwaC1uYW1lPSJwZXJjZW50IiBob3Jpei1hZHYteD0iNzYyIiBkPSJNMjAxIDM0N1ExNjkgMzQ3IDE0MiAzNThUOTUgMzkwVDY0IDQzOFQ1MiA0OTZWNTA2UTUyIDUzNyA2NCA1NjRUOTYgNjEyVDE0MyA2NDVUMjAyIDY1N1EyMzMgNjU3IDI2MCA2NDVUMzA4IDYxM1QzMzkgNTY2VDM1MSA1MDhWNDk4UTM1MSA0NjcgMzM5IDQ0MFQzMDcgMzkyVDI2MCAzNTlUMjAxIDM0N1pNMTI4IC04UTEyNyAtOSAxMjIgLThUMTExIC00VDEwMSA1VDk2IDIwUTk2IDM0IDEwMiA0NVQxMjYgNzVMNjI5IDY2MVE2MzAgNjYyIDYzNSA2NjJUNjQ2IDY1OFQ2NTYgNjQ4VDY2MSA2MzNRNjYxIDYxMiA2MzEgNTc4TDEyOCAtOFpNNTYwIC00UTUyOCAtNCA1MDEgN1Q0NTQgMzlUNDIzIDg3VDQxMSAxNDVWMTU1UTQxMSAxODYgNDIzIDIxM1Q0NTUgMjYxVDUwMiAyOTRUNTYxIDMwNlE1OTIgMzA2IDYxOSAyOTRUNjY3IDI2MlQ2OTggMjE1VDcxMCAxNTdWMTQ3UTcxMCAxMTYgNjk4IDg5VDY2NiA0MVQ2MTkgOFQ1NjAgLTRaTTIwMiAzOTlRMjQxIDM5OSAyNjYgNDI2VDI5MiA0OTVWNTA5UTI5MiA1NTEgMjY2IDU3OFQyMDEgNjA2UTE2MiA2MDYgMTM3IDU3OVQxMTEgNTA5VjQ5NVExMTEgNDU0IDEzNyA0MjdUMjAyIDM5OVpNNTYxIDQ4UTYwMCA0OCA2MjUgNzVUNjUxIDE0NFYxNThRNjUxIDIwMCA2MjUgMjI3VDU2MCAyNTVRNTIxIDI1NSA0OTYgMjI4VDQ3MCAxNThWMTQ0UTQ3MCAxMDMgNDk2IDc2VDU2MSA0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBnbHlwaC1uYW1lPSJhbXBlcnNhbmQiIGhvcml6LWFkdi14PSI2ODEiIGQ9Ik0yNjQgLTEyUTIxNCAtMTIgMTczIDFUMTAxIDM4VDU1IDk5VDM4IDE4MlEzOCAyNTcgODQgMzAyVDIwOSAzNzFRMTg2IDM5OCAxNjkgNDMwVDE1MiA1MDVRMTUyIDUzNiAxNjQgNTY0VDE5OCA2MTNUMjUwIDY0NlQzMTcgNjU5UTM1MSA2NTkgMzc5IDY0OFQ0MjkgNjE3VDQ2MiA1NzBUNDc0IDUxMlE0NzQgNDUzIDQzNCA0MTRUMzE2IDM1MUw0ODkgMTkyUTQ5OSAyMDkgNTA4IDIyOFQ1MjUgMjcwVDU0MSAzMjNUNTU3IDM5MUg2MjRRNjE4IDM1OSA2MDkgMzI3VDU4OCAyNjNUNTYzIDIwM1Q1MzQgMTUyTDY3MyAyNFE2NzQgMjMgNjczIDE5VDY2OCA5VDY1NiAwVDYzNiAtNFE2MjYgLTQgNjE0IC0xVDU4NiAxN0w0OTcgMTAxUTQ0OSA0NyAzOTEgMThUMjY0IC0xMlpNMjY4IDQ2UTMyNiA0NiAzNzIgNzJUNDU1IDE0MUwyNDYgMzMzUTE4NiAzMTUgMTQ3IDI4MVQxMDggMTg1UTEwOCAxMTkgMTUzIDgzVDI2OCA0NlpNMjc1IDM4OVEzNDUgNDA4IDM3OCA0MzZUNDExIDUxMVE0MTEgNTUwIDM4NSA1NzZUMzE2IDYwM1EyNjggNjAzIDI0MyA1NzVUMjE4IDUwNlEyMTggNDcxIDIzMyA0NDRUMjc1IDM4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgZ2x5cGgtbmFtZT0icXVvdGVzaW5nbGUiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik0xMTQgMzkxUTEwNSAzOTEgMTAyIDM5N1Q5NyA0MTdMNzggNjQ3SDE2MEwxNDEgNDE3UTEzOSA0MDQgMTM2IDM5OFQxMjQgMzkxSDExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IigiIGdseXBoLW5hbWU9InBhcmVubGVmdCIgaG9yaXotYWR2LXg9IjM4MSIgZD0iTTMzMiAtMTk4UTI5OSAtMTk4IDI2NCAtMTgxVDE5MyAtMTI4UTEzOCAtNzMgMTAxIDE2VDYzIDIyNlE2MyAyODQgNzMgMzM2VDEwMiA0MzNUMTQzIDUxNFQxOTMgNTc3UTI2NSA2NDkgMzMyIDY0OVEzNDYgNjQ5IDM1NCA2NDRUMzYyIDYyNVEzNjIgNjE4IDM1OSA2MTBUMzUzIDYwMFEzMDEgNTg5IDI2MCA1NTVUMTkwIDQ3MFQxNDYgMzU3VDEzMSAyMjdRMTMxIDE1NyAxNDYgOTRUMTg5IC0xOVQyNTkgLTEwNFQzNTMgLTE0OVEzNTUgLTE1MCAzNTggLTE1OFQzNjIgLTE3NFEzNjIgLTE4OCAzNTQgLTE5M1QzMzIgLTE5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IikiIGdseXBoLW5hbWU9InBhcmVucmlnaHQiIGhvcml6LWFkdi14PSIzODEiIGQ9Ik00OSAtMTk4UTM1IC0xOTggMjcgLTE5M1QxOSAtMTc0UTE5IC0xNjcgMjIgLTE1OVQyOCAtMTQ5UTgwIC0xMzggMTIxIC0xMDRUMTkxIC0yMFQyMzUgOTRUMjUwIDIyN1EyNTAgMjk0IDIzNSAzNTZUMTkyIDQ2OVQxMjIgNTU0VDI4IDYwMFEyNiA2MDEgMjMgNjA5VDE5IDYyNVExOSA2MzkgMjcgNjQ0VDQ5IDY0OVExMTYgNjQ5IDE4OCA1NzdRMjE0IDU1MSAyMzcgNTE1VDI3OSA0MzNUMzA3IDMzNlQzMTggMjI2UTMxOCAxMDUgMjgxIDE2VDE4OCAtMTI4UTE1MyAtMTYzIDExOCAtMTgwVDQ5IC0xOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBnbHlwaC1uYW1lPSJhc3RlcmlzayIgaG9yaXotYWR2LXg9IjQwNyIgZD0iTTk2IDM1MlE5MiAzNTYgOTIgMzYzVDk4IDM4MUwxNTkgNDcyTDU3IDUxMVEzOSA1MTggMzkgNTI5UTM5IDU2NCA3MiA1NTVMMTc4IDUyNkwxODIgNjM0UTE4MyA2NTAgMTg4IDY1NFQyMDUgNjU5UTIxNiA2NTkgMjIxIDY1NVQyMjggNjM0TDIzMiA1MjZMMzM4IDU1NVEzNzEgNTY0IDM3MSA1MjlRMzcxIDUxOCAzNTMgNTExTDI1MSA0NzJMMzEyIDM4MVEzMTkgMzcwIDMxOSAzNjNUMzE0IDM1MlEzMDQgMzQzIDI5NSAzNDJUMjc0IDM1NEwyMDUgNDQwTDEzNiAzNTRRMTI1IDM0MCAxMTYgMzQxVDk2IDM1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IisiIGdseXBoLW5hbWU9InBsdXMiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik0yODIgMzRRMjY5IDM0IDI2MiA0MFQyNTQgNjVWMjM5SDkzUTc1IDIzOSA2OSAyNDVUNjIgMjY1VjI3MVE2MiAyODQgNjggMjkwVDkzIDI5N0gyNTRWNDYwUTI1NCA0NzggMjYxIDQ4NFQyODIgNDkxSDI4N1EzMDAgNDkxIDMwNyA0ODVUMzE1IDQ2MFYyOTdINDc2UTQ5NCAyOTcgNTAwIDI5MVQ1MDcgMjcxVjI2NVE1MDcgMjUyIDUwMSAyNDZUNDc2IDIzOUgzMTVWNjVRMzE1IDQ3IDMwOCA0MVQyODcgMzRIMjgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MmM7IiBnbHlwaC1uYW1lPSJjb21tYSIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTYzIC0xMzFRNjEgLTEzNSA1NSAtMTM2VDQyIC0xMzZUMzEgLTEyOVQzMCAtMTE2TDkwIDYzUTk3IDgwIDEwMyA4OVQxMjkgOThIMTM0UTE0NiA5OCAxNTUgODlUMTY0IDYzVjU5UTE2NCA1MSAxNjIgNDBUMTQ4IDExTDYzIC0xMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSItIiBnbHlwaC1uYW1lPSJoeXBoZW4iIGhvcml6LWFkdi14PSIzOTYiIGQ9Ik02NCAyNzJIMzMyVjIxMkg2NFYyNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBnbHlwaC1uYW1lPSJwZXJpb2QiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik0xMTQgLTZRNzAgLTYgNzAgMzhWNDhRNzAgNjkgODEgODFUMTE0IDkzSDEyNFExNDYgOTMgMTU3IDgxVDE2OSA0OFYzOFExNjkgLTYgMTI0IC02SDExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ii8iIGdseXBoLW5hbWU9InNsYXNoIiBob3Jpei1hZHYteD0iMzUzIiBkPSJNMjY3IDY0N0gzMzVMNzggLTE5M0gxMEwyNjcgNjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgZ2x5cGgtbmFtZT0iemVybyIgaG9yaXotYWR2LXg9IjY1OSIgZD0iTTMyOCAtMTJRMjY4IC0xMiAyMjEgOFQxNDAgNjhUODkgMTYzVDcxIDI4OVYzNTZRNzEgNDI2IDg5IDQ4MlQxNDAgNTc3VDIyMSA2MzhUMzI5IDY1OVEzODkgNjU5IDQzNyA2MzhUNTE4IDU3OFQ1NzAgNDg0VDU4OCAzNThWMjkxUTU4OCAyMjEgNTcwIDE2NVQ1MTggNzBUNDM2IDlUMzI4IC0xMlpNMzI5IDQ3UTQyMCA0NyA0NzAgMTExVDUyMCAyOTFWMzU0UTUyMCA0NzAgNDcwIDUzNVQzMjggNjAxUTIzOCA2MDEgMTg5IDUzN1QxMzkgMzU2VjI5M1ExMzkgMTc3IDE4OSAxMTJUMzI5IDQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMSIgZ2x5cGgtbmFtZT0ib25lIiBob3Jpei1hZHYteD0iMzc3IiBkPSJNMTgzIDU0MVExNzEgNTI0IDE1MiA1MTRUMTA5IDUwNFE3MiA1MDQgNTIgNTI0UTM2IDU0MCAzNiA1NjFRMzYgNTc4IDQ2IDU4OFQ1NyA1OThRNjcgNTg3IDgwIDU4MFQxMTQgNTczUTE0NiA1NzMgMTY4IDU5NlQxOTIgNjUxSDIyMVEyNTEgNjUxIDI1MSA2MjBWMEgxODNWNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMiIgZ2x5cGgtbmFtZT0idHdvIiBob3Jpei1hZHYteD0iNTUwIiBkPSJNMTAwIDBRNTcgMCA1NyA0MVY2MVE1NyAxMTMgNzQgMTUxVDExOSAyMTlUMTgzIDI2OVQyNTcgMzEwUTI5MCAzMjcgMzIxIDM0M1QzNzUgMzc4VDQxMyA0MjBUNDI4IDQ3M1E0MjggNTMxIDM4OCA1NjRUMjc4IDU5N1EyMzkgNTk3IDIxMCA1ODZUMTYxIDU1N1QxMjcgNTE1VDEwNiA0NjRRMTA2IDQ2MiA5OSA0NjJUODMgNDY1VDY3IDQ3N1Q2MCA1MDBRNjAgNTE5IDcxIDU0NFQxMDYgNTkyUTEzMyA2MTkgMTc3IDYzOVQyODMgNjYwUTM4MiA2NjAgNDM4IDYxMFQ0OTUgNDcyUTQ5NSA0MzAgNDc5IDM5OVQ0MzUgMzQzVDM3MyAzMDBUMzAwIDI2MlEyNjUgMjQ1IDIzMyAyMjdUMTc3IDE4OFQxMzggMTM4VDEyMyA3M1Y2Mkg1MDRWMEgxMDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBnbHlwaC1uYW1lPSJ0aHJlZSIgaG9yaXotYWR2LXg9IjU2MiIgZD0iTTI2MiAtMTJRMTk0IC0xMiAxNDYgOFQ3MiA1NVE1MiA3NSA0MiA5NFQzMiAxMzBRMzIgMTQzIDM4IDE1MVQ1MSAxNjRUNjQgMTY5VDcxIDE2OVE5MiAxMDkgMTQzIDc4VDI2MyA0N1EzNDAgNDcgMzg1IDgyVDQzMSAxNzhRNDMxIDI0NCAzODcgMjc4VDI1NyAzMTNIMTcyVjM3MUgyNjhRMzQwIDM3MSAzNzYgNDAxVDQxMiA0ODZRNDEyIDU0MCAzNzMgNTcwVDI2MyA2MDFRMjAxIDYwMSAxNTggNTczVDkzIDQ5OVE5MiA0OTcgODYgNDk5VDczIDUwNVQ2MCA1MTdUNTQgNTM2UTU0IDU2MiA4NCA1OTJRMTEwIDYxOCAxNTYgNjM4VDI2MyA2NTlRMzY2IDY1OSA0MjMgNjE0VDQ4MSA0ODdRNDgxIDM4MCAzNzQgMzQ3UTQzNSAzMjcgNDY3IDI4NFQ1MDAgMTc5UTUwMCA5MCA0MzcgMzlUMjYyIC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9IjQiIGdseXBoLW5hbWU9ImZvdXIiIGhvcml6LWFkdi14PSI2MTEiIGQ9Ik0zODggMTg0SDEwM1E4MCAxODQgNjggMTk0VDU1IDIyMFYyNDBRNTUgMjU0IDYyIDI2NlQ4MyAyOTVMMzQwIDYxMlEzNDkgNjIzIDM1NSA2MzBUMzY3IDY0MlQzODIgNjQ5VDQwMSA2NTFRNDMxIDY1MSA0NDIgNjQwVDQ1NCA2MDdWMjQ2SDU2OVYxODRINDU0VjBIMzg4VjE4NFpNMzkwIDI0NVY1ODVMMTE3IDI0NUgzOTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI1IiBnbHlwaC1uYW1lPSJmaXZlIiBob3Jpei1hZHYteD0iNTU4IiBkPSJNMjY4IC0xMlEyMDUgLTEyIDE1NiA4VDc4IDU2UTQ2IDg4IDQ2IDExNlE0NiAxMjcgNTIgMTM0VDY1IDE0NlQ3OSAxNTJUODYgMTUzUTEwOSAxMDUgMTU1IDc3VDI3MCA0OVEzNDggNDkgMzk1IDg4VDQ0MiAxOTVRNDQyIDI2MSAzOTkgMjk5VDI4MiAzMzhRMjI1IDMzOCAxODYgMzI1VDExNyAyOTBROTQgMjkzIDg0IDMwNVQ3NCAzMzdWNjA5UTc0IDYyNSA4NSA2MzZUMTEyIDY0N0g0NzNWNTg1SDEzOVYzNjdRMTcwIDM4MiAyMDUgMzkxVDI4MyA0MDFRMzM0IDQwMSAzNzYgMzg3VDQ0NyAzNDZUNDkzIDI4MlQ1MTAgMTk4UTUxMCAxNTAgNDkzIDExMVQ0NDUgNDVUMzY5IDNUMjY4IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9IjYiIGdseXBoLW5hbWU9InNpeCIgaG9yaXotYWR2LXg9IjYwNSIgZD0iTTEzOCAzMjhRMTc0IDM2MiAyMjQgMzgzVDMyOSA0MDVRMzc5IDQwNSA0MjAgMzkxVDQ5MCAzNTJUNTM0IDI5MFQ1NTAgMjA5VjIwNFE1NTAgMTU3IDUzMyAxMThUNDg2IDUwVDQxNCA1VDMyMyAtMTJRMjYwIC0xMiAyMTMgOVQxMzUgNzBUODcgMTYzVDcxIDI4M1YzNTZRNzEgNDI3IDg5IDQ4M1QxNDAgNTc4VDIyMSA2MzhUMzI4IDY1OVEzOTEgNjU5IDQzMyA2NDJUNDk4IDYwMlE1MTEgNTg5IDUxNyA1NzdUNTIzIDU1M1E1MjMgNTQ0IDUxOCA1MzdUNTA1IDUyNFQ0OTMgNTE3VDQ4NiA1MTZRNDYwIDU1NCA0MjMgNTc3VDMyOCA2MDFRMjM5IDYwMSAxODkgNTM5VDEzOCAzNjBWMzI4Wk0zMTkgNDZRMzU1IDQ2IDM4NSA1N1Q0MzggODhUNDcyIDEzNlQ0ODQgMTk4VjIwNFE0ODQgMjczIDQ0MyAzMTBUMzIzIDM0OFEyOTYgMzQ4IDI3MCAzNDFUMjE5IDMyMlQxNzUgMjk0VDEzOSAyNTlRMTQ0IDE1OSAxODkgMTAzVDMxOSA0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IjciIGdseXBoLW5hbWU9InNldmVuIiBob3Jpei1hZHYteD0iNTQ4IiBkPSJNMTY5IC00UTE2MCAtNCAxNTMgLTFUMTQxIDhUMTM0IDE3VDEzMiAyNEw0MzggNTg1SDQ1VjY0N0g0NzRRNDk3IDY0NyA1MDUgNjM5VDUxMyA2MTdWNjExUTUxMyA1OTggNDk1IDU2NEwyMDUgMjBRMTk3IDYgMTg4IDFUMTY5IC00WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOCIgZ2x5cGgtbmFtZT0iZWlnaHQiIGhvcml6LWFkdi14PSI1OTkiIGQ9Ik0yOTkgLTEyUTI0MyAtMTIgMTk5IDFUMTIzIDM4VDc0IDk1VDU3IDE2OVE1NyAyMjYgOTAgMjY5VDE4OSAzMzNRMTMxIDM1MiAxMDQgMzkwVDc2IDQ4MVE3NiA1MjAgOTIgNTUzVDEzNyA2MDlUMjA3IDY0NlQzMDAgNjU5UTQwNSA2NTkgNDYzIDYxMlQ1MjIgNDgzUTUyMiA0MzEgNDk1IDM5M1Q0MTAgMzM0UTQ3NiAzMTQgNTA4IDI3MVQ1NDEgMTcwUTU0MSAxMzEgNTI0IDk4VDQ3NCA0MFQzOTggMlQyOTkgLTEyWk0zMDAgMzYyUTM3NSAzNjIgNDE0IDM5M1Q0NTQgNDc5UTQ1NCA1MzQgNDE0IDU2OFQyOTkgNjAyUTIyMSA2MDIgMTgzIDU2OVQxNDQgNDc5UTE0NCA0MjYgMTg0IDM5NFQzMDAgMzYyWk0zMDAgNDZRMzg3IDQ2IDQzMCA3OVQ0NzMgMTczUTQ3MyAyMzIgNDI4IDI2N1QyOTkgMzAzUTIxNCAzMDMgMTcwIDI2OFQxMjUgMTczUTEyNSAxMTcgMTcwIDgyVDMwMCA0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IjkiIGdseXBoLW5hbWU9Im5pbmUiIGhvcml6LWFkdi14PSI2MDUiIGQ9Ik0yNzIgNDZRMzcwIDQ2IDQxOCAxMDRUNDY3IDI4N1YzMDhRNDM1IDI3NyAzODQgMjU1VDI3NiAyMzJRMjI2IDIzMiAxODUgMjQ2VDExNSAyODVUNzEgMzQ3VDU1IDQyOFY0MzNRNTUgNDc5IDcyIDUyMFQxMTkgNTkyVDE5MSA2NDFUMjgyIDY1OVEzNDEgNjU5IDM4OCA2MzlUNDY3IDU4MVQ1MTcgNDg4VDUzNCAzNjRWMjkxUTUzNCAxMzkgNDY3IDY0VDI3MiAtMTJRMjEzIC0xMiAxNzAgNFQxMDMgNDRRNzcgNzAgNzcgOTRRNzcgMTAzIDgyIDExMFQ5NCAxMjNUMTA3IDEzMFQxMTQgMTMxUTE0MCA5MyAxNzcgNzBUMjcyIDQ2Wk0yODIgMjg5UTMzNyAyODkgMzg3IDMxNVQ0NjcgMzc5UTQ2MyA0ODMgNDE3IDU0MlQyODYgNjAxUTI1MCA2MDEgMjIwIDU4OVQxNjcgNTU0VDEzMyA1MDNUMTIxIDQzOVY0MzNRMTIxIDM2NCAxNjIgMzI3VDI4MiAyODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI6IiBnbHlwaC1uYW1lPSJjb2xvbiIgaG9yaXotYWR2LXg9IjI2OSIgZD0iTTEyOSAzMzRRODUgMzM0IDg1IDM3OFYzODhRODUgNDA5IDk2IDQyMVQxMjkgNDMzSDEzOVExNjEgNDMzIDE3MiA0MjFUMTg0IDM4OFYzNzhRMTg0IDMzNCAxMzkgMzM0SDEyOVpNMTI5IC02UTg1IC02IDg1IDM4VjQ4UTg1IDY5IDk2IDgxVDEyOSA5M0gxMzlRMTYxIDkzIDE3MiA4MVQxODQgNDhWMzhRMTg0IC02IDEzOSAtNkgxMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBnbHlwaC1uYW1lPSJzZW1pY29sb24iIGhvcml6LWFkdi14PSIyNjkiIGQ9Ik0xMjkgMzM0UTg1IDMzNCA4NSAzNzhWMzg4UTg1IDQwOSA5NiA0MjFUMTI5IDQzM0gxMzlRMTYxIDQzMyAxNzIgNDIxVDE4NCAzODhWMzc4UTE4NCAzMzQgMTM5IDMzNEgxMjlaTTc4IC0xMzFRNzYgLTEzNSA3MCAtMTM2VDU3IC0xMzZUNDYgLTEyOVQ0NSAtMTE2TDEwNSA2M1ExMTIgODAgMTE4IDg5VDE0NCA5OEgxNDlRMTYxIDk4IDE3MCA4OVQxNzkgNjNWNTlRMTc5IDUxIDE3NyA0MFQxNjMgMTFMNzggLTEzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZsdDsiIGdseXBoLW5hbWU9Imxlc3MiIGhvcml6LWFkdi14PSI0OTgiIGQ9Ik04NCAyMjVRNzQgMjMwIDY5IDIzN1Q2NCAyNjhRNjQgMjkwIDY5IDI5N1Q4NCAzMTBMNDExIDQ4NlE0MTMgNDg3IDQyMiA0NzhUNDMzIDQ1NVE0MzUgNDQ0IDQyNyA0MzJUMzkyIDQwNkwxMjkgMjY4TDM5MiAxMzFRNDE4IDExNyA0MjYgMTA1VDQzMyA4MVE0MzEgNjUgNDIzIDU3VDQxMSA1MEw4NCAyMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI9IiBnbHlwaC1uYW1lPSJlcXVhbCIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTEwMyAzNDZRODUgMzQ2IDc5IDM1M1Q3MiAzNzNWMzgwUTcyIDM5MyA3OCA0MDBUMTAzIDQwN0g0NjZRNDg0IDQwNyA0OTAgNDAwVDQ5NyAzODBWMzczUTQ5NyAzNjAgNDkxIDM1M1Q0NjYgMzQ2SDEwM1pNMTAzIDExOVE4NSAxMTkgNzkgMTI2VDcyIDE0NlYxNTNRNzIgMTY2IDc4IDE3M1QxMDMgMTgwSDQ2NlE0ODQgMTgwIDQ5MCAxNzNUNDk3IDE1M1YxNDZRNDk3IDEzMyA0OTEgMTI2VDQ2NiAxMTlIMTAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmd0OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlciIgaG9yaXotYWR2LXg9IjQ5NyIgZD0iTTg2IDUwUTgzIDQ4IDc1IDU2VDY0IDgxUTYzIDkyIDcxIDEwNFQxMDUgMTMxTDM2OCAyNjhMMTA1IDQwNlE3OSA0MjAgNzEgNDMyVDY0IDQ1NVE2NiA0NjkgNzUgNDc4VDg2IDQ4Nkw0MTMgMzEwUTQyMyAzMDUgNDI4IDI5OFQ0MzMgMjY4UTQzMyAyNDUgNDI4IDIzOFQ0MTMgMjI1TDg2IDUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPyIgZ2x5cGgtbmFtZT0icXVlc3Rpb24iIGhvcml6LWFkdi14PSI0OTMiIGQ9Ik0xOTIgMTc3UTE5MyAyMjMgMjAzIDI1NlQyMjkgMzE0VDI2NCAzNTRUMzAyIDM4M1EzMTggMzkzIDMzMiA0MDNUMzU3IDQyNlQzNzQgNDUzVDM4MSA0ODlRMzgxIDU0MCAzNDggNTY5VDI1MiA1OTlRMjEzIDU5OSAxODYgNTg3VDE0MSA1NTZUMTE0IDUxMlQxMDAgNDYzUTEwMCA0NjEgOTIgNDYyVDc1IDQ2N1Q1OSA0ODBUNTEgNTAzUTUxIDUyMiA2MiA1NDlUOTggNjAwUTEyMyA2MjUgMTYxIDY0MlQyNTQgNjU5UTI5OSA2NTkgMzM1IDY0N1QzOTYgNjEyVDQzNCA1NjBUNDQ4IDQ5NVE0NDggNDY1IDQ0MCA0NDNUNDE3IDQwM1QzODYgMzcyVDM0OSAzNDVRMzMwIDMzMiAzMTIgMzE4VDI4MCAyODRUMjU3IDIzOVQyNDggMTc3SDE5MlpNMjEzIC00UTE5MyAtNCAxODUgNFQxNzYgMzNWNTNRMTc2IDc0IDE4NCA4MlQyMTMgOTBIMjMzUTI1NCA5MCAyNjIgODJUMjcxIDUzVjMzUTI3MSAxMyAyNjMgNVQyMzMgLTRIMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQCIgZ2x5cGgtbmFtZT0iYXQiIGhvcml6LWFkdi14PSI3NzYiIGQ9Ik00MDMgLTEyUTMyNiAtMTIgMjY0IDEyVDE1NyA4MFQ4OCAxODZUNjMgMzIzUTYzIDM5NyA4NyA0NThUMTU1IDU2NFQyNTkgNjM0VDM5MiA2NTlRNDY2IDY1OSA1MjYgNjM4VDYyOCA1NzhUNjk0IDQ4M1Q3MTcgMzU3UTcxNyAyNjMgNjgxIDIxM1Q1NzUgMTYzUTUzMyAxNjMgNTA1IDE4MFQ0NjkgMjMwUTQ1MiAxOTkgNDI2IDE4MlQzNjMgMTY1UTMzNCAxNjUgMzEwIDE3NlQyNjcgMjA3VDIzOSAyNTVUMjI4IDMxN1EyMjggMzUxIDIzOCAzNzhUMjY2IDQyNlQzMTAgNDU3VDM2NSA0NjhRMzk3IDQ2OCA0MjIgNDUyVDQ2MiA0MTVWNDYySDUyNlYyOTZRNTI2IDI1NyA1MzkgMjM1VDU4OCAyMTJRNjA5IDIxMiA2MjQgMjIzVDY0OCAyNTNUNjYyIDI5OVQ2NjcgMzU3UTY2NyA0MTUgNjQ4IDQ2MlQ1OTIgNTQyVDUwNSA1OTNUMzkyIDYxMVEzMzAgNjExIDI3OSA1OTBUMTkxIDUzMVQxMzQgNDM5VDExMyAzMjNRMTEzIDI2MSAxMzQgMjA4VDE5NCAxMTdUMjg2IDU4VDQwMyAzNlE0NTEgMzYgNDkyIDQ4VDU2MiA3OVE1NzAgODQgNTc3IDg3VDU5NiA5MVE2MDMgOTEgNjA4IDg3VDYxOCA3NlQ2MjMgNjVUNjIzIDU4UTU5MCAzMSA1MzIgMTBUNDAzIC0xMlpNMzc4IDIyMVE0MTIgMjIxIDQzNyAyNDNUNDYyIDMwMlYzNTBRNDUxIDM3NSA0MzEgMzkzVDM3OSA0MTJRMzQxIDQxMiAzMTggMzg2VDI5NSAzMTdRMjk1IDI3NCAzMTggMjQ4VDM3OCAyMjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJBIiBnbHlwaC1uYW1lPSJBIiBob3Jpei1hZHYteD0iNjM5IiBkPSJNMjY4IDYyOFEyNzMgNjQxIDI4NCA2NDdUMzE5IDY1M1EzNDMgNjUzIDM1NCA2NDdUMzcwIDYyOEw2MTMgMEg1MzdMNDU2IDIxMUgxNzlMOTggMEgyNUwyNjggNjI4Wk00MzQgMjcxTDMxOCA1NzZMMjAxIDI3MUg0MzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJCIiBnbHlwaC1uYW1lPSJCIiBob3Jpei1hZHYteD0iNjMzIiBkPSJNOTIgNjA5UTkyIDYyNSAxMDMgNjM2VDEzMCA2NDdIMzM3UTQ0MCA2NDcgNDk0IDYwNFQ1NDggNDc3UTU0OCAzNzMgNDM2IDMzNlE1MDggMzIwIDU0MiAyNzhUNTc2IDE3OVE1NzYgOTAgNTE5IDQ1VDM0MyAwSDkyVjYwOVpNMzQyIDYxUTQyOSA2MSA0NjcgODlUNTA2IDE4MlE1MDYgMjk4IDM0NiAyOThIMTYwVjYxSDM0MlpNMzQwIDM1OFE0MDMgMzU4IDQ0MCAzODlUNDc4IDQ3NFE0NzggNTg2IDMzNyA1ODZIMTYwVjM1OEgzNDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJDIiBnbHlwaC1uYW1lPSJDIiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMzg2IC0xMlEzMTUgLTEyIDI1NiAxMlQxNTUgODFUODkgMTg2VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODkgNjU5UTQyOCA2NTkgNDYxIDY1MlQ1MjAgNjM0VDU2NyA2MDlUNjAyIDU4MVE2MzAgNTUzIDYzMCA1MzFRNjMwIDUxOCA2MjQgNTEwVDYxMSA0OTdUNTk3IDQ5MVQ1OTAgNDkwUTU3NSA1MTcgNTUyIDUzN1Q1MDIgNTcyVDQ0NiA1OTNUMzg3IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2NCAxNTQgMjEzVDIwNyAxMjVUMjg3IDY4VDM4OSA0N1E0MjUgNDcgNDU4IDU2VDUxOCA4MVQ1NjYgMTIxVDU5OCAxNzRRNTk4IDE3NSA2MDUgMTc0VDYyMCAxNjlUNjM1IDE1NlQ2NDIgMTM0UTY0MiAxMjIgNjMyIDEwNFQ2MDQgNjhRNTc0IDM4IDUxOSAxM1QzODYgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRCIgZ2x5cGgtbmFtZT0iRCIgaG9yaXotYWR2LXg9IjcwMiIgZD0iTTkyIDYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDI4M1EzNjcgNjQ3IDQzMiA2MjVUNTQzIDU2MlQ2MTMgNDYxVDYzNyAzMjVRNjM3IDI0OCA2MTMgMTg4VDU0MiA4NlQ0MjkgMjJUMjc4IDBIOTJWNjA5Wk0yODIgNjBRNDE5IDYwIDQ5MyAxMjhUNTY3IDMyM1E1NjcgMzg1IDU0OCA0MzRUNDkyIDUxN1Q0MDMgNTY5VDI4MyA1ODdIMTYwVjYwSDI4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IkUiIGdseXBoLW5hbWU9IkUiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik05MiA2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0g1NDRWNTg1SDE2MFYzNjJINDczVjMwMkgxNjBWNjJINTUwVjBIOTJWNjA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRiIgZ2x5cGgtbmFtZT0iRiIgaG9yaXotYWR2LXg9IjU2MyIgZD0iTTkyIDYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDUxOVY1ODVIMTYwVjM0MUg0MzhWMjgxSDE2MFYwSDkyVjYwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkciIGdseXBoLW5hbWU9IkciIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik0zNzAgLTEyUTMwMCAtMTIgMjQ0IDEzVDE0OCA4MlQ4NyAxODhUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OSA2NTlRNDY1IDY1OSA1MTggNjM1VDU5OSA1ODRRNjMwIDU1MyA2MzAgNTMxUTYzMCA1MTcgNjI0IDUwOVQ2MTEgNDk2VDU5NyA0OTJUNTg5IDQ5MlE1NzQgNTE5IDU1MiA1MzlUNTAyIDU3MlQ0NDYgNTkzVDM4NyA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNSA1MjRUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjQgMTUxIDIxM1QxOTkgMTI2VDI3NiA2OFQzNzkgNDdRNDIzIDQ3IDQ2MCA2MFQ1MjYgOTZUNTczIDE1MFQ1OTcgMjE4VjI2OUgzODJWMzMwSDYwN1E2MjkgMzMwIDY0MyAzMTZUNjU3IDI4MFYzUTY1NyAxIDY1MSAtMVQ2MzUgLTRRNjE4IC00IDYwOCA4VDU5NyA2MVY5N1E1NjcgNDYgNTA4IDE3VDM3MCAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBnbHlwaC1uYW1lPSJIIiBob3Jpei1hZHYteD0iNzA5IiBkPSJNOTIgNjIwUTkyIDY1MSAxMjEgNjUxSDEzMFExNjAgNjUxIDE2MCA2MjBWMzU1SDU0OVY2MjBRNTQ5IDY1MSA1NzggNjUxSDU4N1E2MTcgNjUxIDYxNyA2MjBWMEg1NDlWMjkzSDE2MFYwSDkyVjYyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGdseXBoLW5hbWU9IkkiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0xMDIgNjIwUTEwMiA2NTEgMTMxIDY1MUgxNDBRMTcwIDY1MSAxNzAgNjIwVjBIMTAyVjYyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkoiIGdseXBoLW5hbWU9IkoiIGhvcml6LWFkdi14PSI0NjciIGQ9Ik0xOTcgLTEyUTE2MyAtMTIgMTM1IC0zVDg1IDIxVDUzIDUxVDQxIDgyUTQxIDkyIDQ3IDEwMFQ2MCAxMTRUNzQgMTIyVDgxIDEyM1E5NiA5MCAxMjYgNjlUMTk3IDQ3UTI2MiA0NyAyODkgODNUMzE3IDIwNFY2NDdIMzg1VjIwNFEzODUgOTMgMzQwIDQxVDE5NyAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJLIiBnbHlwaC1uYW1lPSJLIiBob3Jpei1hZHYteD0iNTg2IiBkPSJNOTIgNjIwUTkyIDY1MSAxMjEgNjUxSDEzMFExNjAgNjUxIDE2MCA2MjBWMzM5TDQ1NiA2MzBRNDcyIDY0NiA0ODYgNjQ5VDUxMCA2NDhUNTI1IDYzNFQ1MjkgNjE1TDIzNSAzMzJMNTM2IDMxUTUzNyAyMCA1MzEgMTFUNTEzIC0yVDQ4OCAtNFQ0NjIgMTJMMTYwIDMyM1YwSDkyVjYyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkwiIGdseXBoLW5hbWU9IkwiIGhvcml6LWFkdi14PSI1NTAiIGQ9Ik05MiA2MjBROTIgNjUxIDEyMSA2NTFIMTMwUTE2MCA2NTEgMTYwIDYyMFY2M0g0NzJRNTAzIDYzIDUwMyAzNFYyOVE1MDMgMCA0NzIgMEg5MlY2MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJNIiBnbHlwaC1uYW1lPSJNIiBob3Jpei1hZHYteD0iNzcxIiBkPSJNOTIgNjA4UTkyIDYyNyAxMDUgNjM5VDE0MSA2NTFIMTU3UTE4MyA2NTEgMTkzIDYzOVQyMTYgNjAwTDM4NiAyMjNMNTU3IDYwMFE1NjggNjI2IDU3OSA2MzhUNjE2IDY1MUg2MzBRNjUyIDY1MSA2NjUgNjM5VDY3OSA2MDhWMEg2MTRWNTczTDQ0NCAyMDRRNDM1IDE4NCA0MjMgMTczVDM4NSAxNjFRMzU5IDE2MSAzNDcgMTcyVDMyNiAyMDRMMTU3IDU3M1YwSDkyVjYwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ik4iIGdseXBoLW5hbWU9Ik4iIGhvcml6LWFkdi14PSI3MDUiIGQ9Ik05MiA2MDVROTIgNjI0IDEwMSA2MzdUMTI5IDY1MUgxNDZRMTY1IDY1MSAxNzUgNjQyVDE5OCA2MTVMNTQ5IDEwNlY2NDdINjEzVjQyUTYxMyAyMiA2MDQgOVQ1NzggLTRINTczUTU1NCAtNCA1NDcgMlQ1MjkgMjJMMTU2IDU2MVYwSDkyVjYwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ik8iIGdseXBoLW5hbWU9Ik8iIGhvcml6LWFkdi14PSI3NzQiIGQ9Ik0zODYgLTEyUTMxNSAtMTIgMjU2IDEyVDE1NSA4MVQ4OSAxODZUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OCA2NTlRNDU5IDY1OSA1MTggNjM1VDYxOSA1NjZUNjg1IDQ2MFQ3MDkgMzI0UTcwOSAyNTAgNjg1IDE4OFQ2MTkgODJUNTE3IDEzVDM4NiAtMTJaTTM4OCA0N1E0NDMgNDcgNDg5IDY3VDU2OCAxMjNUNjIwIDIxMFQ2MzkgMzIyUTYzOSAzODIgNjIwIDQzM1Q1NjggNTIxVDQ4OCA1NzlUMzg2IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2MyAxNTQgMjEyVDIwNiAxMjVUMjg2IDY4VDM4OCA0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGdseXBoLW5hbWU9IlAiIGhvcml6LWFkdi14PSI1ODMiIGQ9Ik05MiA2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0gyOTZRNDEwIDY0NyA0NzIgNTk2VDUzNCA0NTFRNTM0IDM1NCA0NzIgMzAzVDI4OCAyNTJIMTYwVjBIOTJWNjA5Wk0yOTQgMzEyUTM3OSAzMTIgNDIxIDM0N1Q0NjQgNDQ5UTQ2NCA1ODYgMjk3IDU4NkgxNjBWMzEySDI5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlEiIGdseXBoLW5hbWU9IlEiIGhvcml6LWFkdi14PSI3NzQiIGQ9Ik0zODYgLTEyUTMxNSAtMTIgMjU2IDEyVDE1NSA4MVQ4OSAxODZUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OCA2NTlRNDU5IDY1OSA1MTggNjM1VDYxOSA1NjZUNjg1IDQ2MFQ3MDkgMzI0UTcwOSAyNTYgNjg4IDE5OVQ2MjggOTZMNzA1IDE5UTcwNiAxOCA3MDQgMTNUNjk3IDNUNjg0IC03VDY2NiAtMTJRNjQ5IC0xMiA2MzIgNUw1ODQgNTRRNTQzIDIyIDQ5MyA1VDM4NiAtMTJaTTM4OCA0N1E0NzggNDcgNTQxIDk1TDM5NyAyNDFMNDQwIDI4Nkw1ODQgMTM5UTYxMCAxNzQgNjI0IDIyMFQ2MzkgMzIyUTYzOSAzODIgNjIwIDQzM1Q1NjggNTIxVDQ4OCA1NzlUMzg2IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2MyAxNTQgMjEyVDIwNiAxMjVUMjg2IDY4VDM4OCA0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlIiIGdseXBoLW5hbWU9IlIiIGhvcml6LWFkdi14PSI1OTciIGQ9Ik01NDEgNDYwUTU0MSAzNjkgNDg0IDMyMVQzMjcgMjcyTDUzMyAyOFE1MzQgMjYgNTMyIDIxVDUyNSAxMVQ1MTEgMVQ0OTIgLTRRNDgyIC00IDQ3MiAxVDQ1MCAyMEwyNDAgMjcySDE1OVYwSDkyVjYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDMwOFE0MjIgNjQ3IDQ4MSA2MDFUNTQxIDQ2MFpNMzE0IDMzMFEzOTUgMzMwIDQzMyAzNjVUNDcxIDQ1OFE0NzEgNTg2IDMxMCA1ODZIMTU5VjMzMEgzMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBnbHlwaC1uYW1lPSJTIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjg5IC0xMlEyMTYgLTEyIDE2MyAxMFQ4MSA2MlE1MiA5MSA1MiAxMTVRNTIgMTI2IDU4IDEzNFQ3MSAxNDdUODUgMTU1VDkyIDE1NlExMTggMTExIDE2NyA3OVQyODggNDdRMzYzIDQ3IDQwNSA3OFQ0NDcgMTY3UTQ0NyAxOTkgNDMzIDIyMFQzOTMgMjU1VDMzNiAyNzlUMjY5IDI5N1EyMzIgMzA2IDE5NyAzMTdUMTMzIDM0OVQ4OCA0MDFUNzAgNDgxUTcwIDUxOSA4NiA1NTFUMTMyIDYwOFQyMDAgNjQ1VDI4NyA2NTlRMzU1IDY1OSA0MDMgNjM5VDQ3NiA1OTRRNTAxIDU2OSA1MDEgNTQ3UTUwMSA1MzYgNDk1IDUyOFQ0ODIgNTE1VDQ2OCA1MDdUNDYxIDUwNlE0MzggNTQ2IDM5MyA1NzNUMjg4IDYwMFEyMjAgNjAwIDE3OCA1NjhUMTM2IDQ4M1ExMzYgNDUyIDE0OCA0MzJUMTgyIDM5OVQyMzQgMzc4VDMwMiAzNjBRMzQxIDM1MSAzNzkgMzM4VDQ0NyAzMDRUNDk1IDI1MVQ1MTQgMTcwUTUxNCAxMjkgNDk4IDk2VDQ1MyAzOFQzODIgMVQyODkgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVCIgZ2x5cGgtbmFtZT0iVCIgaG9yaXotYWR2LXg9IjYxNCIgZD0iTTI3MyA1ODVINzBRMzkgNTg1IDM5IDYxM1Y2MThRMzkgNjQ3IDcwIDY0N0g1NDRRNTc1IDY0NyA1NzUgNjE4VjYxM1E1NzUgNTg1IDU0NCA1ODVIMzQxVjBIMjczVjU4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlUiIGdseXBoLW5hbWU9IlUiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik0zMzMgLTEyUTIxMCAtMTIgMTQ2IDU2VDgyIDI1NVY2MjBRODIgNjUxIDExMSA2NTFIMTIwUTE1MCA2NTEgMTUwIDYyMFYyNjBRMTUwIDQ5IDMzNSA0OVE1MjAgNDkgNTIwIDI2MVY2MjBRNTIwIDY1MSA1NDggNjUxSDU2MFE1ODcgNjUxIDU4NyA2MjBWMjU4UTU4NyAxMjYgNTIyIDU3VDMzMyAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJWIiBnbHlwaC1uYW1lPSJWIiBob3Jpei1hZHYteD0iNjMwIiBkPSJNMzMgNjMxUTMxIDYzNCA0MCA2NDFUNjMgNjUwVDkxIDY0N1QxMTMgNjIwTDMxNiA3Mkw1MjAgNjIwUTUyOCA2NDEgNTQxIDY0N1Q1NjggNjUxVDU4OSA2NDFUNTk3IDYzMUwzNTMgMEgyNzdMMzMgNjMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVyIgZ2x5cGgtbmFtZT0iVyIgaG9yaXotYWR2LXg9IjkzNCIgZD0iTTcwIDYzNlE2OSA2MzkgNzkgNjQ0VDEwMyA2NTFUMTMwIDY0M1QxNDkgNjA5TDI3MyA2MUw0MTUgNTI0UTQyMSA1NDIgNDMyIDU1MlQ0NjkgNTYyUTQ5NSA1NjIgNTA1IDU1M1Q1MjIgNTI0TDY2MiA2M0w3ODkgNjA5UTc5NSA2MzQgODA3IDY0M1Q4MzMgNjUxVDg1NSA2NDVUODY0IDYzNkw3MDggMEg2MThMNDcwIDQ5NUwzMTMgMEgyMjZMNzAgNjM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWCIgZ2x5cGgtbmFtZT0iWCIgaG9yaXotYWR2LXg9IjYxMiIgZD0iTTc1IC00UTY2IC00IDU5IDBUNDggMTBUNDEgMjFUNDEgMjhMMjY2IDMyN0w0OSA2NDdIMTIzTDMwOCAzNzRMNDA0IDUwNFE0NDYgNTYxIDUwMSA2MzNRNTEwIDY0NSA1MTggNjQ5VDUzNCA2NTRRNTQzIDY1NCA1NTAgNjUwVDU2MSA2NDBUNTY3IDYyOVQ1NjggNjIyTDM0NSAzMjZMNTY4IDMxUTU2OSAyOSA1NjggMjRUNTYyIDE0VDU1MCA0VDUzMiAtMVE1MjIgLTEgNTEyIDRUNDk0IDE5TDMwNCAyODFMMTA4IDE3UTk5IDUgOTEgMVQ3NSAtNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlkiIGdseXBoLW5hbWU9IlkiIGhvcml6LWFkdi14PSI1NzkiIGQ9Ik0yNTUgMjY5TDI1IDY0N0gxMDBMMjkwIDMzMUw0NzkgNjI3UTQ5MSA2NDYgNTA0IDY0OVQ1MjkgNjQ4VDU0NyA2MzVUNTUzIDYyMkwzMjMgMjY5VjBIMjU1VjI2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IloiIGdseXBoLW5hbWU9IloiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik02OSA3Mkw0ODEgNTg1SDEwMVE3MCA1ODUgNzAgNjEzVjYxOFE3MCA2NDcgMTAxIDY0N0g1NTZWNTc4TDE0MiA2Mkg1NDNRNTc0IDYyIDU3NCAzNFYyOVE1NzQgMCA1NDMgMEg2OVY3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IlsiIGdseXBoLW5hbWU9ImJyYWNrZXRsZWZ0IiBob3Jpei1hZHYteD0iMzUzIiBkPSJNOTQgNjQ3SDI4NlEzMDQgNjQ3IDMxMCA2NDFUMzE3IDYyMVY2MTRRMzE3IDYwMSAzMTEgNTk1VDI4NiA1ODhIMTU2Vi0xMzhIMjg2UTMwNCAtMTM4IDMxMCAtMTQ0VDMxNyAtMTY0Vi0xNzFRMzE3IC0xODQgMzExIC0xOTBUMjg2IC0xOTdIOTRWNjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgZ2x5cGgtbmFtZT0iYmFja3NsYXNoIiBob3Jpei1hZHYteD0iMzUzIiBkPSJNMTcgNjQ3SDg1TDM0MiAtMTkzSDI3NEwxNyA2NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJdIiBnbHlwaC1uYW1lPSJicmFja2V0cmlnaHQiIGhvcml6LWFkdi14PSIzNTMiIGQ9Ik0yNTkgLTE5N0g2N1E0OSAtMTk3IDQzIC0xOTFUMzYgLTE3MVYtMTY0UTM2IC0xNTEgNDIgLTE0NVQ2NyAtMTM4SDE5N1Y1ODhINjdRNDkgNTg4IDQzIDU5NFQzNiA2MTRWNjIxUTM2IDYzNCA0MiA2NDBUNjcgNjQ3SDI1OVYtMTk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXiIgZ2x5cGgtbmFtZT0iYXNjaWljaXJjdW0iIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xNTYgNDQ2UTEzNCA0NDYgMTM0IDQ2OVExMzQgNDg1IDE1MCA1MDdUMTg2IDU0OVEyMDAgNTYzIDIxMyA1NzVUMjM4IDU5NlQyNTYgNjEwVDI2NSA2MTZRMjY2IDYxNiAyNzMgNjExVDI5MiA1OTZUMzE2IDU3NlQzNDEgNTUyUTM2MSA1MzIgMzc4IDUwOVQzOTUgNDY5UTM5NSA0NDYgMzc0IDQ0NlEzNjEgNDQ2IDM0NSA0NjBUMzAzIDUwN0wyNjQgNTU4TDIyNCA1MDVRMjAzIDQ3OCAxODYgNDYyVDE1NiA0NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJfIiBnbHlwaC1uYW1lPSJ1bmRlcnNjb3JlIiBob3Jpei1hZHYteD0iNDk1IiBkPSJNNjEgLTYyUTMwIC02MiAzMCAtMzRWLTI5UTMwIDAgNjEgMEg0MzRRNDY1IDAgNDY1IC0yOVYtMzRRNDY1IC02MiA0MzQgLTYySDYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgZ2x5cGgtbmFtZT0iZ3JhdmUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0zMzYgNTUxUTMzNCA1NDkgMzE4IDU1M1QyNzcgNTY2VDIyNSA1ODlUMTcyIDYyMFExMzUgNjQ1IDEzNSA2NzBRMTM1IDY4MiAxNDQgNjg5VDE2NSA2OTdRMTg3IDY5NyAyMTEgNjc5UTIzNSA2NjIgMjU4IDY0MVQyOTkgNjAwVDMyNyA1NjdUMzM2IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImEiIGdseXBoLW5hbWU9ImEiIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0yMTYgLTExUTEzOCAtMTEgOTUgMjVUNTIgMTIyUTUyIDIwNiAxMzQgMjQzVDM4MyAyODRIMzkzVjMwMVEzOTMgMzYzIDM1OSAzOTVUMjU5IDQyOFEyMDEgNDI4IDE2NCA0MDNUMTA3IDM0MFExMDcgMzQwIDEwMSAzNDFUODkgMzQ1VDc2IDM1N1Q3MCAzNzhRNzAgMzg3IDc3IDQwMFQ5NiA0MjZRMTE5IDQ0OSAxNjEgNDY4VDI2NCA0ODhRMzU1IDQ4OCA0MDYgNDM5VDQ1NyAzMDNWMEgzOTRWNzNRMzY2IDM0IDMyMCAxMlQyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODZUMzgwIDEzMlQzOTMgMTg5VjIzM0gzODBRMjQ2IDIyOCAxODIgMjA0VDExOCAxMjJRMTE4IDg2IDE0NSA2NVQyMjIgNDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBnbHlwaC1uYW1lPSJiIiBob3Jpei1hZHYteD0iNTk5IiBkPSJNMzIwIC0xMlEyODggLTEyIDI2MSAtNVQyMTEgMTVUMTczIDQyVDE0NiA3NVYwSDgyVjY3NFE4MiA2NzYgODggNjc4VDEwNCA2ODFRMTIxIDY4MSAxMzQgNjY5VDE0NyA2MThWNDAyUTE3OSA0NDQgMjIyIDQ2NlQzMjQgNDg4UTM3MSA0ODggNDEyIDQ3MVQ0ODMgNDIxVDUzMSAzNDJUNTQ5IDIzOVE1NDkgMTgzIDUzMiAxMzdUNDg0IDU3VDQxMSA2VDMyMCAtMTJaTTMxNSA0NVEzNTMgNDUgMzg0IDU5VDQzNyA5OFQ0NzEgMTU5VDQ4MyAyMzhRNDgzIDI4MCA0NzEgMzE1VDQzNiAzNzZUMzg0IDQxNlQzMTcgNDMxUTI1NCA0MzEgMjEyIDQwMVQxNDYgMzE4VjIwNlExNDYgMTcyIDE1OSAxNDNUMTk2IDkyVDI1MCA1OFQzMTUgNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJjIiBnbHlwaC1uYW1lPSJjIiBob3Jpei1hZHYteD0iNTQ4IiBkPSJNMjk1IC0xMlEyNDIgLTEyIDE5OCA3VDEyMCA1OVQ2OSAxMzlUNTAgMjM5UTUwIDI5MyA2OCAzMzhUMTIwIDQxN1QxOTcgNDY5VDI5NSA0ODhRMzU2IDQ4OCAzOTcgNDY5VDQ2NSA0MjRRNDgyIDQwNyA0OTEgMzg5VDUwMCAzNTZRNTAwIDM0NSA0OTQgMzM5VDQ3OSAzMjlUNDY1IDMyNFQ0NTcgMzI1UTQ0OCAzNDcgNDM0IDM2NlQ0MDEgMzk5VDM1NSA0MjJUMjk1IDQzMFEyNTcgNDMwIDIyNCA0MTZUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDFUMjIzIDYxVDI5NSA0NlEzMjkgNDYgMzU1IDU0VDQwMCA3NlQ0MzQgMTEwVDQ1NyAxNTFRNDU4IDE1MiA0NjQgMTUyVDQ3OSAxNDhUNDkzIDEzOFQ1MDAgMTIwUTUwMCAxMDYgNDkxIDg4VDQ2MyA1MFE0MzggMjUgMzk3IDdUMjk1IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGdseXBoLW5hbWU9ImQiIGhvcml6LWFkdi14PSI1OTkiIGQ9Ik0yNzUgLTEyUTIyOCAtMTIgMTg3IDVUMTE2IDU1VDY4IDEzNFQ1MCAyMzdRNTAgMjkzIDY3IDMzOVQxMTUgNDE5VDE4NyA0NzBUMjc5IDQ4OFEzNDMgNDg4IDM4NyA0NjRUNDUyIDQwOVY2NzRRNDUyIDY3NiA0NTggNjc4VDQ3NCA2ODFRNDkxIDY4MSA1MDQgNjY5VDUxNyA2MThWMEg0NTNWNzRRNDIxIDMyIDM3OCAxMFQyNzUgLTEyWk0yODIgNDVRMzE1IDQ1IDM0NiA1N1Q0MDEgOTBUNDM5IDE0MVQ0NTMgMjA1VjMxOVE0MzAgMzcxIDM4OSA0MDFUMjg0IDQzMVEyNDYgNDMxIDIxNSA0MTdUMTYyIDM3OFQxMjggMzE3VDExNiAyMzhRMTE2IDE5NiAxMjggMTYxVDE2MyAxMDBUMjE1IDYwVDI4MiA0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImUiIGdseXBoLW5hbWU9ImUiIGhvcml6LWFkdi14PSI1NjEiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDZUMTE5IDU3VDY4IDEzNVQ1MCAyMzZRNTAgMjkwIDY4IDMzNlQxMTggNDE2VDE5NCA0NjlUMjkwIDQ4OFEzNDAgNDg4IDM4MSA0NzFUNDUxIDQyM1Q0OTYgMzQ3VDUxMiAyNDhWMjQyUTUxMiAyMjggNTA2IDIyNFQ0ODUgMjIwSDExNVExMTggMTgwIDEzMiAxNDhUMTcxIDk0VDIyNiA1OVQyOTYgNDZRMzMxIDQ2IDM1NyA1M1Q0MDIgNzFUNDM0IDk4VDQ1OSAxMzFRNDYwIDEzMiA0NjYgMTMxVDQ3OSAxMjZUNDkxIDExNFQ0OTcgOTRRNDk3IDc1IDQ3MSA0OVE0NDggMjYgNDAzIDdUMjk2IC0xMlpNMjkwIDQzMVEyNTcgNDMxIDIyOCA0MjBUMTc3IDM4OFQxMzkgMzM5VDExOCAyNzZINDQzUTQzOCAzNDcgMzk4IDM4OVQyOTAgNDMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZiIgZ2x5cGgtbmFtZT0iZiIgaG9yaXotYWR2LXg9IjM2MCIgZD0iTTEyNiA0MThIMjlWNDc2SDEyNlY1MjBRMTI2IDYwMiAxNjEgNjQ1VDI2NiA2ODlRMjk3IDY4OSAzMTYgNjgyVDM0OCA2NjNRMzYxIDY1MCAzNjEgNjMzUTM2MSA2MTYgMzUzIDYwOFQzNDIgNjAyUTMzMSA2MTMgMzExIDYyMlQyNjYgNjMxUTIyNSA2MzEgMjA3IDYwNFQxODkgNTE3VjQ3NkgzMTJWNDE4SDE5MFYwSDEyNlY0MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJnIiBnbHlwaC1uYW1lPSJnIiBob3Jpei1hZHYteD0iNTk5IiBkPSJNMjkxIC0yMDBRMjI1IC0yMDAgMTc5IC0xODFUMTA3IC0xMzZRODEgLTExMCA4MSAtODhRODEgLTc1IDg2IC02N1Q5OSAtNTNUMTEyIC00N1QxMTkgLTQ3UTE0MSAtODggMTgyIC0xMTVUMjkyIC0xNDJRNDUzIC0xNDIgNDUzIDI0Vjg0UTQyMSA0MyAzNzggMjNUMjc1IDJRMjI1IDIgMTg0IDE5VDExMyA2N1Q2NyAxNDNUNTAgMjQzUTUwIDI5NiA2OCAzNDFUMTE2IDQxOFQxODkgNDY5VDI3OSA0ODhRMzQyIDQ4OCAzODcgNDY1VDQ1MyA0MTFWNDc2SDUxOFYyNFE1MTggLTg5IDQ1OSAtMTQ0VDI5MSAtMjAwWk0yODIgNThRMzE1IDU4IDM0NiA2OVQ0MDEgMTAyVDQzOSAxNTJUNDUzIDIxNVYzMTlRNDMwIDM3MSAzODkgNDAxVDI4NCA0MzFRMjQ2IDQzMSAyMTUgNDE3VDE2MiAzNzhUMTI4IDMxOVQxMTYgMjQ0UTExNiAxNTkgMTYxIDEwOVQyODIgNThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJoIiBnbHlwaC1uYW1lPSJoIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNODIgNjc0UTgyIDY3NiA4OCA2NzhUMTA0IDY4MVExMjEgNjgxIDEzNCA2NjlUMTQ3IDYxOFY0MDBRMTcyIDQzOSAyMTIgNDYzVDMwOCA0ODhRMzU1IDQ4OCAzOTAgNDczVDQ0OSA0MzFUNDg1IDM2NFQ0OTcgMjc4VjBINDMyVjI3NFE0MzIgMzQ2IDM5OCAzODZUMzA0IDQyN1EyMzMgNDI3IDE5MCAzODNUMTQ3IDI2NFYwSDgyVjY3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImkiIGdseXBoLW5hbWU9ImkiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik04NyA0NDlRODcgNDY3IDk1IDQ3M1QxMTYgNDgwSDEyM1ExMzYgNDgwIDE0NCA0NzRUMTUyIDQ0OVYwSDg3VjQ0OVpNMTE5IDU5NVE3NyA1OTUgNzcgNjM4UTc3IDY4MSAxMjEgNjgxUTE2MyA2ODEgMTYzIDYzOFExNjMgNTk1IDExOSA1OTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJqIiBnbHlwaC1uYW1lPSJqIiBob3Jpei1hZHYteD0iMjM5IiBkPSJNMjEgLTE5MVEtNSAtMTkxIC0yNSAtMTg0VC01NiAtMTY2US02OSAtMTUzIC02OSAtMTM5US02OSAtMTIzIC02MSAtMTEyVC01MCAtMTAzUS0zOSAtMTE0IC0yMiAtMTIzVDIwIC0xMzNRNTYgLTEzMyA3MSAtMTEzVDg3IC00NFY0NzZIMTUyVi00OVExNTIgLTExOCAxMTkgLTE1NFQyMSAtMTkxWk0xMTkgNTk1UTc3IDU5NSA3NyA2MzhRNzcgNjgxIDEyMSA2ODFRMTYzIDY4MSAxNjMgNjM4UTE2MyA1OTUgMTE5IDU5NVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImsiIGdseXBoLW5hbWU9ImsiIGhvcml6LWFkdi14PSI0NzMiIGQ9Ik04MiA2NzRRODIgNjc2IDg4IDY3OFQxMDQgNjgxUTEyMSA2ODEgMTM0IDY2OVQxNDcgNjE4VjI1OEwzMzkgNDU0UTM1OSA0NzUgMzc0IDQ3OFQzOTggNDc3VDQxMiA0NjJUNDE1IDQ0OEwyMTggMjUzTDQ0NiAzMFE0NDYgMjUgNDQyIDE2VDQyOSAwVDQwNSAtM1QzNjkgMjFMMTQ3IDI0MlYwSDgyVjY3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImwiIGdseXBoLW5hbWU9ImwiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik04NyA2NzRRODcgNjc2IDkzIDY3OFQxMDkgNjgxUTEyNiA2ODEgMTM5IDY2OVQxNTIgNjE4VjBIODdWNjc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgZ2x5cGgtbmFtZT0ibSIgaG9yaXotYWR2LXg9Ijg4NSIgZD0iTTgyIDQ3M1E4MiA0NzUgODggNDc3VDEwNCA0ODBRMTIxIDQ4MCAxMzMgNDY4VDE0NiA0MTdWNDA1UTE3MSA0NDIgMjA5IDQ2NVQyOTYgNDg4UTM1MyA0ODggMzkzIDQ2M1Q0NTQgMzg2UTQ3OCA0MjkgNTIwIDQ1OFQ2MjMgNDg4UTcxNCA0ODggNzYwIDQzOFQ4MDcgMjg3VjBINzQyVjI4M1E3NDIgNDI3IDYxOSA0MjdRNTc0IDQyNyA1MzYgNDAxVDQ3NyAzMzFWMEg0MTJWMjc4UTQxMiA0MjcgMjg5IDQyN1EyNDQgNDI3IDIwNiA0MDFUMTQ3IDMzMVYwSDgyVjQ3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9Im4iIGdseXBoLW5hbWU9Im4iIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik04MiA0NzNRODIgNDc1IDg4IDQ3N1QxMDQgNDgwUTEyMSA0ODAgMTMzIDQ2OFQxNDYgNDE3VjQwMlExNzEgNDQwIDIxMSA0NjRUMzA4IDQ4OFEzNTUgNDg4IDM5MCA0NzNUNDQ5IDQzMVQ0ODUgMzY0VDQ5NyAyNzhWMEg0MzJWMjc0UTQzMiAzNDYgMzk5IDM4NlQzMDQgNDI3UTI0OCA0MjcgMjA4IDM5OVQxNDcgMzI2VjBIODJWNDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibyIgZ2x5cGgtbmFtZT0ibyIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTI5NiAtMTJRMjQyIC0xMiAxOTcgN1QxMjAgNTlUNjkgMTM5VDUwIDIzOVE1MCAyOTMgNjggMzM4VDExOSA0MTdUMTk3IDQ2OVQyOTYgNDg4UTM0OSA0ODggMzk0IDQ2OVQ0NzEgNDE3VDUyMiAzMzdUNTQxIDIzN1E1NDEgMTgzIDUyMyAxMzhUNDcyIDU5VDM5NCA3VDI5NiAtMTJaTTI5NiA0NVEzMzQgNDUgMzY3IDU5VDQyNCA5OVQ0NjEgMTYwVDQ3NSAyMzdRNDc1IDI3OSA0NjIgMzE0VDQyNCAzNzZUMzY4IDQxNlQyOTYgNDMxUTI1NyA0MzEgMjI0IDQxN1QxNjcgMzc3VDEzMCAzMTZUMTE2IDIzOVExMTYgMTk3IDEyOSAxNjJUMTY3IDEwMFQyMjQgNjBUMjk2IDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icCIgZ2x5cGgtbmFtZT0icCIgaG9yaXotYWR2LXg9IjU5OSIgZD0iTTgyIDQ3M1E4MiA0NzUgODggNDc3VDEwNCA0ODBRMTIxIDQ4MCAxMzMgNDY4VDE0NiA0MTdWNDAyUTE3OCA0NDQgMjIxIDQ2NlQzMjQgNDg4UTM3MSA0ODggNDEyIDQ3MVQ0ODMgNDIxVDUzMSAzNDJUNTQ5IDIzOVE1NDkgMTgzIDUzMiAxMzdUNDg0IDU3VDQxMSA2VDMyMCAtMTJRMjg4IC0xMiAyNjEgLTVUMjEyIDE1VDE3NCA0MlQxNDcgNzVWLTE5M0g4MlY0NzNaTTMxNSA0NVEzNTMgNDUgMzg0IDU5VDQzNyA5OFQ0NzEgMTU5VDQ4MyAyMzhRNDgzIDI4MCA0NzEgMzE1VDQzNiAzNzZUMzg0IDQxNlQzMTcgNDMxUTI1NCA0MzEgMjEyIDQwMVQxNDYgMzE4VjIwNlExNDYgMTcyIDE1OSAxNDNUMTk2IDkyVDI1MCA1OFQzMTUgNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJxIiBnbHlwaC1uYW1lPSJxIiBob3Jpei1hZHYteD0iNTk5IiBkPSJNNDUyIDczUTQyMCAzMiAzNzcgMTBUMjc1IC0xMlEyMjggLTEyIDE4NyA1VDExNiA1NVQ2OCAxMzRUNTAgMjM3UTUwIDI5MyA2NyAzMzlUMTE1IDQxOVQxODcgNDcwVDI3OSA0ODhRMzQ0IDQ4OCAzODggNDY0VDQ1MyA0MDhWNDE3UTQ1MyA0NTYgNDY1IDQ2OFQ0OTUgNDgwUTUwNCA0ODAgNTEwIDQ3OFQ1MTcgNDczVi0xOTNINDUyVjczWk0yODIgNDVRMzE1IDQ1IDM0NiA1N1Q0MDEgOTJUNDM5IDE0M1Q0NTMgMjA3VjMxN1E0MzAgMzcwIDM4OSA0MDBUMjg0IDQzMVEyNDYgNDMxIDIxNSA0MTdUMTYyIDM3OFQxMjggMzE3VDExNiAyMzhRMTE2IDE5NiAxMjggMTYxVDE2MyAxMDBUMjE1IDYwVDI4MiA0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9InIiIGdseXBoLW5hbWU9InIiIGhvcml6LWFkdi14PSIzNjgiIGQ9Ik04MiA0NzNRODIgNDc1IDg4IDQ3N1QxMDQgNDgwUTEyMSA0ODAgMTMzIDQ2OFQxNDYgNDE3VjM4OFExNzggNDg4IDI3MiA0ODhRMzA1IDQ4OCAzMjMgNDc1VDM0MSA0MzlRMzQxIDQyMSAzMzMgNDEyVDMyMyA0MDVRMzEyIDQxNCAyOTkgNDE5VDI2NSA0MjVRMjMzIDQyNSAyMTEgNDA5VDE3NCAzNjVUMTU0IDI5OVQxNDcgMjE0VjBIODJWNDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icyIgZ2x5cGgtbmFtZT0icyIgaG9yaXotYWR2LXg9IjQ4NCIgZD0iTTI0MiAtMTJRMTc5IC0xMiAxMzUgNVQ2OCA0NVE0NiA2NyA0NiA4NVE0NiA5NSA1MSAxMDJUNjIgMTEzVDc0IDExOVQ4MSAxMjBRMTA1IDg3IDE0NCA2NVQyNDQgNDNRMzA0IDQzIDMzNSA2NVQzNjcgMTIzUTM2NyAxNDQgMzU4IDE1OFQzMzEgMTgxVDI4NyAxOTdUMjI3IDIxMVExOTkgMjE3IDE3MCAyMjVUMTE2IDI0N1Q3NiAyODVUNjAgMzQ0UTYwIDM3NiA3MyA0MDJUMTEwIDQ0OFQxNjcgNDc3VDI0MiA0ODhRMzAxIDQ4OCAzMzkgNDczVDM5OCA0MzdRNDE4IDQxNyA0MTggMzk3UTQxOCAzODggNDEzIDM4MVQ0MDEgMzcwVDM4OSAzNjRUMzgyIDM2M1EzNjIgMzk0IDMyNyA0MTNUMjQyIDQzM1ExODMgNDMzIDE1MyA0MTFUMTIyIDM1M1ExMjIgMzE1IDE1NSAyOTlUMjU1IDI2OVEyODQgMjYzIDMxNSAyNTVUMzcxIDIzMlQ0MTMgMTk0VDQzMCAxMzNRNDMwIDY3IDM4MCAyOFQyNDIgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idCIgZ2x5cGgtbmFtZT0idCIgaG9yaXotYWR2LXg9IjM3NiIgZD0iTTI0NSAtMTJRMTc1IC0xMiAxNDQgMjZUMTEyIDE0MFY0MThINDFWNDc2SDExMlY1NTlRMTEyIDU3NyAxMjAgNTgzVDE0MSA1OTBIMTQ4UTE2MSA1OTAgMTY4IDU4NFQxNzYgNTU5VjQ3NkgzMzBWNDE4SDE3NlYxNDdRMTc2IDk0IDE5MSA2OVQyNDcgNDRRMjcyIDQ0IDI5MCA1M1QzMjEgNzlRMzIzIDgxIDMzMyA3NFQzNDMgNDdRMzQzIDMxIDMyOCAxNlEzMTYgNCAyOTUgLTRUMjQ1IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9InUiIGdseXBoLW5hbWU9InUiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik0yNjcgLTEyUTIyMCAtMTIgMTg1IDNUMTI2IDQ1VDkwIDExMlQ3OCAxOThWNDc2SDE0M1YyMDJRMTQzIDEzMCAxNzYgOTBUMjcxIDQ5UTMyNyA0OSAzNjcgNzdUNDI4IDE1MFY0NzZINDkzVjNRNDkzIDEgNDg3IC0xVDQ3MSAtNFE0NTQgLTQgNDQyIDhUNDI5IDU5Vjc0UTQwNCAzNiAzNjQgMTJUMjY3IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9InYiIGdseXBoLW5hbWU9InYiIGhvcml6LWFkdi14PSI1MDMiIGQ9Ik0zMCA0NjFRMzAgNDY1IDM4IDQ3MlQ1OSA0ODBUODUgNDczVDEwOSA0MzhMMjUyIDU5TDM5NiA0MzhRNDA2IDQ2NCA0MTkgNDcyVDQ0NSA0ODBUNDY1IDQ3MlQ0NzMgNDYxTDI5MCAwSDIxNEwzMCA0NjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ3IiBnbHlwaC1uYW1lPSJ3IiBob3Jpei1hZHYteD0iNzA0IiBkPSJNMzkgNDYxUTM5IDQ2NCA0OCA0NzFUNzAgNDc5VDk2IDQ3M1QxMTYgNDM0TDIwMyA2MEwzMDUgMzgxUTMxMCAzOTUgMzE5IDQwMVQzNTQgNDA4UTM3OSA0MDggMzg4IDQwMlQ0MDMgMzgxTDUwNCA2MEw1OTAgNDM0UTU5NyA0NjQgNjA5IDQ3M1Q2MzQgNDgwVDY1NiA0NzFUNjY1IDQ2MUw1NDUgMEg0NjVMMzU0IDM0NUwyNDAgMEgxNjBMMzkgNDYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieCIgZ2x5cGgtbmFtZT0ieCIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTczIC00UTYzIC00IDU3IDBUNDYgOVQ0MCAxOFQzOSAyNEwyMDggMjM3TDQyIDQ1MlE0MSA0NTMgNDIgNDU3VDQ4IDQ2N1Q1OCA0NzZUNzUgNDgwUTkyIDQ4MCAxMDIgNDcxVDEyNCA0NDdMMjUwIDI3N0wzNzMgNDQ2UTM4NyA0NjUgMzk4IDQ3MlQ0MjEgNDgwUTQzMSA0ODAgNDM3IDQ3NlQ0NDggNDY3VDQ1NCA0NThUNDU1IDQ1MkwyODcgMjM3TDQ1MiAyNFE0NTMgMjMgNDUyIDE5VDQ0NiA5VDQzNiAwVDQxOSAtNFE0MDIgLTQgMzkyIDVUMzcwIDI5TDI0NCAxOThMMTIyIDMwUTExMCAxMyA5OSA1VDczIC00WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieSIgZ2x5cGgtbmFtZT0ieSIgaG9yaXotYWR2LXg9IjUwMiIgZD0iTTE5OCAtMTk3UTE4NCAtMTk3IDE3NCAtMTkwVDE2NCAtMTgwTDI0NCAyNFEyMjcgMjQgMjE5IDI5VDIwNCA0OUwyNCA0NzZIOTJMMjYyIDY1TDQxMCA0NzZINDc5TDI0NCAtMTU0UTIzNCAtMTgwIDIyMyAtMTg4VDE5OCAtMTk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieiIgZ2x5cGgtbmFtZT0ieiIgaG9yaXotYWR2LXg9IjUwMyIgZD0iTTU1IDUwTDM1OCA0MjBIODhRNzAgNDIwIDYzIDQyNlQ1NSA0NDVWNDUxUTU1IDQ2NCA2MiA0NzBUODggNDc2SDQ0NVY0MzJMMTM3IDU2SDQxOVE0MzcgNTYgNDQ0IDUwVDQ1MiAzMVYyNVE0NTIgMTIgNDQ1IDZUNDE5IDBINTVWNTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ7IiBnbHlwaC1uYW1lPSJicmFjZWxlZnQiIGhvcml6LWFkdi14PSI0NDAiIGQ9Ik0zNzkgLTE5OVEzNDQgLTE5OSAzMDYgLTE3OVQyMzQgLTExOVQxNzcgLTE3VDE1MSAxMjlMODYgMTY0UTczIDE3MSA2NSAxNzZUNTEgMTg4VDQzIDIwM1Q0MSAyMjZRNDEgMjQwIDQzIDI0OFQ1MCAyNjNUNjQgMjc1VDg2IDI4OEwxNTIgMzIzUTE1NSA0MDcgMTc4IDQ2OFQyMzQgNTcwVDMwNiA2MzFUMzgwIDY1MVE0MDYgNjUxIDQwNiA2MjNRNDA2IDYxNiA0MDMgNjA4VDM5NyA1OThRMzQ3IDU4NyAzMTQgNTYzVDI1OSA0OTlUMjI5IDQwOFQyMTcgMjg5TDk4IDIyNkwyMTYgMTYzUTIxOCA5NyAyMjcgNDVUMjU4IC00N1QzMTIgLTExMVQzOTYgLTE0NlEzOTggLTE0NyA0MDEgLTE1NVQ0MDUgLTE3MVE0MDUgLTE5OSAzNzkgLTE5OVoiICAvPgorPGdseXBoIHVuaWNvZGU9InwiIGdseXBoLW5hbWU9ImJhciIgaG9yaXotYWR2LXg9IjI3MyIgZD0iTTEzMyAtMTk3UTEyMCAtMTk3IDExMiAtMTkxVDEwNCAtMTY2VjYyMFExMDQgNjM4IDExMiA2NDRUMTMzIDY1MUgxNDBRMTUzIDY1MSAxNjEgNjQ1VDE2OSA2MjBWLTE2NlExNjkgLTE4NCAxNjEgLTE5MFQxNDAgLTE5N0gxMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ9IiBnbHlwaC1uYW1lPSJicmFjZXJpZ2h0IiBob3Jpei1hZHYteD0iNDQwIiBkPSJNNjAgLTE5OVEzNCAtMTk5IDM0IC0xNzFRMzQgLTE2NCAzNyAtMTU2VDQzIC0xNDZROTMgLTEzNiAxMjYgLTExMVQxODEgLTQ3VDIxMSA0NFQyMjMgMTYzTDM0MSAyMjZMMjIyIDI4OVEyMjAgMzU1IDIxMSA0MDdUMTgwIDQ5OVQxMjYgNTYyVDQyIDU5OFE0MCA1OTkgMzcgNjA3VDMzIDYyM1EzMyA2NTEgNTkgNjUxUTk0IDY1MSAxMzIgNjMxVDIwNCA1NzFUMjYxIDQ2OVQyODcgMzIzTDM1MyAyODhRMzY2IDI4MSAzNzQgMjc2VDM4OCAyNjRUMzk1IDI0OVQzOTggMjI2UTM5OCAyMTIgMzk2IDIwNFQzODggMTg5VDM3NSAxNzdUMzUzIDE2NEwyODggMTI5UTI4NSA0NSAyNjIgLTE2VDIwNiAtMTE4VDEzNCAtMTc5VDYwIC0xOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBnbHlwaC1uYW1lPSJhc2NpaXRpbGRlIiBob3Jpei1hZHYteD0iNTI5IiBkPSJNMTQ2IDE2OFExMjEgMTY4IDEyMSAxOTRRMTIxIDIxMCAxMjYgMjI2VDE0MCAyNTVUMTYyIDI3NlQxOTAgMjg0UTIxNCAyODQgMjU0IDI2M1QzMzggMjA0UTM0MiAyMTcgMzQ3IDIzMFQzNTggMjUzVDM3MCAyNzBUMzg0IDI3N1E0MDkgMjc3IDQwOSAyNTFRNDA5IDIzNCA0MDQgMjE4VDM5MCAxOTBUMzY4IDE2OVQzNDAgMTYxUTMxNiAxNjEgMjc2IDE4MlQxOTIgMjQxUTE4OCAyMjggMTgzIDIxNVQxNzIgMTkyVDE2MCAxNzVUMTQ2IDE2OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEwOyIgZ2x5cGgtbmFtZT0idW5pMDBBMCIgaG9yaXotYWR2LXg9IjE3MCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMTsiIGdseXBoLW5hbWU9ImV4Y2xhbWRvd24iIGhvcml6LWFkdi14PSIyNzciIGQ9Ik0xNDMgNDY5UTE1MiA0NjkgMTU0IDQ2M1QxNTggNDQ1TDE4MCAwSDk3TDExOSA0NDVRMTIwIDQ1NiAxMjIgNDYyVDEzNSA0NjlIMTQzWk0xNDQgNjUzUTE4OCA2NTMgMTg4IDYwOVY1OTlRMTg4IDU3OCAxNzcgNTY2VDE0NCA1NTRIMTM0UTExMiA1NTQgMTAxIDU2NlQ4OSA1OTlWNjA5UTg5IDY1MyAxMzQgNjUzSDE0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEyOyIgZ2x5cGgtbmFtZT0iY2VudCIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTMwNSAtOThRMjkyIC05OCAyODUgLTkyVDI3OCAtNjdWMzBRMTc3IDQyIDEyMCAxMDdUNjIgMjgxUTYyIDMzMiA3OCAzNzVUMTIyIDQ1MlQxOTEgNTA3VDI3OCA1MzRWNjI2UTI3OCA2NDQgMjg1IDY1MFQzMDUgNjU3SDMxMFEzMjMgNjU3IDMzMCA2NTFUMzM3IDYyNlY1MzZRMzgxIDUzMyA0MTQgNTIwVDQ2OSA0ODlUNTAzIDQ1NFQ1MTUgNDIzUTUxNSA0MTIgNTEwIDQwNFQ0OTggMzkxVDQ4NiAzODRUNDc5IDM4NFE0NTYgNDI2IDQyMiA0NDlUMzM0IDQ3OFY4NlE0NDMgOTIgNDg2IDE5MFE0ODcgMTkxIDQ5MyAxOTBUNTA2IDE4NVQ1MTggMTc0VDUyNCAxNTZRNTI0IDE0MCA1MTIgMTE5VDQ3NiA3OVQ0MTcgNDVUMzM3IDI4Vi02N1EzMzcgLTg1IDMzMCAtOTFUMzEwIC05OEgzMDVaTTEyOCAyODJRMTI4IDIwMCAxNzAgMTUwVDI4MSA4OVY0NzdRMjExIDQ2OSAxNzAgNDE5VDEyOCAyODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMzsiIGdseXBoLW5hbWU9InN0ZXJsaW5nIiBob3Jpei1hZHYteD0iNTk0IiBkPSJNNzYgMjYzUTQ1IDI2MyA0NSAyODlWMjk2UTQ1IDMyMyA3NiAzMjNIMTY2TDE5NCA0NzZRMjEwIDU2MyAyNTYgNjExVDM4NSA2NTlRNDI3IDY1OSA0NTggNjQ2VDUwOSA2MTRUNTM5IDU3M1Q1NDkgNTMxUTU0OSA1MTYgNTQyIDUwOFQ1MjcgNDk3VDUxMSA0OTNUNTAzIDQ5NVE0OTIgNTQ1IDQ2MyA1NzNUMzg1IDYwMVEzMjcgNjAxIDMwMCA1NzBUMjYwIDQ3MkwyMzMgMzIzSDM5OVE0MzAgMzIzIDQzMCAyOTZWMjg5UTQzMCAyNjMgMzk5IDI2M0gyMjJMMTg1IDYySDUwNVE1MzYgNjIgNTM2IDMzVjI4UTUzNiAwIDUwNSAwSDYyUTMxIDAgMzEgMjhWMzRRMzEgNjIgNjIgNjJIMTE4TDE1NSAyNjNINzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNDsiIGdseXBoLW5hbWU9ImN1cnJlbmN5IiBob3Jpei1hZHYteD0iNjU2IiBkPSJNODIgMzc2UTY0IDM3NiA1OCAzODJUNTEgNDAyVjQwOFE1MSA0MjEgNTcgNDI3VDgyIDQzNEgxNTJRMTYyIDQ4NiAxODMgNTI3VDIzNyA1OThUMzEwIDY0M1QzOTkgNjU5UTQ0NiA2NTkgNDgzIDY0NlQ1NDYgNjE1VDU4NSA1NzVUNTk5IDUzNlE1OTkgNTI0IDU5MyA1MTdUNTgwIDUwNVQ1NjcgNDk5VDU2MCA0OTlRNTM0IDU0OCA0OTUgNTc1VDM5NSA2MDJRMzI4IDYwMiAyODIgNTU3VDIxOCA0MzRINDM0UTQ1MiA0MzQgNDU4IDQyOFQ0NjUgNDA4VjQwMlE0NjUgMzg5IDQ1OSAzODNUNDM0IDM3NkgyMTBRMjA5IDM2OSAyMDkgMzYyVDIwOSAzNDhWMjc2SDQzNFE0NTIgMjc2IDQ1OCAyNzBUNDY1IDI1MFYyNDRRNDY1IDIzMSA0NTkgMjI1VDQzNCAyMThIMjE3UTIzNCAxNDAgMjgyIDkzVDQwMSA0NlE0NjMgNDYgNTAxIDc1VDU2MyAxNThRNTY0IDE1OSA1NzAgMTU4VDU4MyAxNTNUNTk3IDE0MFQ2MDMgMTIwUTYwMyAxMDIgNTg5IDc5VDU0OSAzNlQ0ODYgMlQ0MDQgLTEyUTMwMSAtMTIgMjM1IDQ4VDE1MSAyMThIODJRNjQgMjE4IDU4IDIyNFQ1MSAyNDRWMjUwUTUxIDI2MyA1NyAyNjlUODIgMjc2SDE0NFYzNDdRMTQ0IDM1NSAxNDQgMzYxVDE0NSAzNzZIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGdseXBoLW5hbWU9InllbiIgaG9yaXotYWR2LXg9IjU5OSIgZD0iTTEwNyAyNTVRODkgMjU1IDgzIDI2MVQ3NiAyODFWMjg3UTc2IDMwMCA4MiAzMDZUMTA3IDMxM0gyNDZMNTcgNjIyUTU2IDYyNCA1OSA2MjhUNjggNjM4VDgzIDY0N1QxMDMgNjUxUTEyMyA2NTEgMTM2IDYyOEwyOTkgMzM1TDQ2NiA2MjdRNDgyIDY1MSA1MDAgNjUxUTUwOSA2NTEgNTE3IDY0N1Q1MzAgNjM4VDUzOSA2MjlUNTQxIDYyMkwzNTEgMzEzSDQ5MVE1MDkgMzEzIDUxNSAzMDdUNTIyIDI4N1YyODFRNTIyIDI2OCA1MTYgMjYyVDQ5MSAyNTVIMzMwVjE3NUg0OTFRNTA5IDE3NSA1MTUgMTY5VDUyMiAxNDlWMTQzUTUyMiAxMzAgNTE2IDEyNFQ0OTEgMTE3SDMzMFYyN1EzMzAgLTQgMzAyIC00SDI5NVEyNjggLTQgMjY4IDI3VjExN0gxMDdRODkgMTE3IDgzIDEyM1Q3NiAxNDNWMTQ5UTc2IDE2MiA4MiAxNjhUMTA3IDE3NUgyNjhWMjU1SDEwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE2OyIgZ2x5cGgtbmFtZT0iYnJva2VuYmFyIiBob3Jpei1hZHYteD0iMjczIiBkPSJNMTMzIDI5OVExMjAgMjk5IDExMiAzMDVUMTA0IDMzMFY2MjBRMTA0IDYzOCAxMTIgNjQ0VDEzMyA2NTFIMTQwUTE1MyA2NTEgMTYxIDY0NVQxNjkgNjIwVjMzMFExNjkgMzEyIDE2MSAzMDZUMTQwIDI5OUgxMzNaTTEzMyAtMTk3UTEyMCAtMTk3IDExMiAtMTkxVDEwNCAtMTY2VjEyNFExMDQgMTQyIDExMiAxNDhUMTMzIDE1NUgxNDBRMTUzIDE1NSAxNjEgMTQ5VDE2OSAxMjRWLTE2NlExNjkgLTE4NCAxNjEgLTE5MFQxNDAgLTE5N0gxMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNzsiIGdseXBoLW5hbWU9InNlY3Rpb24iIGhvcml6LWFkdi14PSI1NTAiIGQ9Ik0yNjkgLTE2MFEyMTAgLTE2MCAxNjggLTE0N1Q5OCAtMTE1VDU4IC03NVQ0NSAtMzhRNDUgLTI4IDUwIC0yMFQ2MyAtN1Q3NiAxVDgyIDJRMTA4IC00NiAxNTIgLTczVDI2OCAtMTAwUTMzOCAtMTAwIDM3OCAtNzdUNDE4IC0xMlE0MTggMTQgNDA3IDMwVDM3NSA1N1QzMjQgNzVUMjU0IDkyUTIxOCAxMDAgMTgzIDExMFQxMTkgMTM4VDcyIDE4MVQ1NCAyNDhRNTQgMjk2IDgzIDMyOFQxNjQgMzc1UTEyMyAzOTIgOTggNDIwVDczIDUwMVE3MyA1MzYgODkgNTY1VDEzMyA2MTVUMTk4IDY0N1QyNzkgNjU5UTMzMSA2NTkgMzY4IDY0N1Q0MzAgNjE4VDQ2NiA1ODFUNDc4IDU0OFE0NzggNTM4IDQ3MyA1MzBUNDYxIDUxN1Q0NDkgNTEwVDQ0MiA1MDlRNDE1IDU1MSAzNzcgNTc1VDI3OSA1OTlRMjUxIDU5OSAyMjYgNTkzVDE4MSA1NzZUMTUwIDU0N1QxMzggNTA5UTEzOCA0NjQgMTc5IDQ0MlQyOTcgNDAzUTMzMyAzOTUgMzY4IDM4NVQ0MzIgMzU4VDQ3OSAzMTVUNDk3IDI0OVE0OTcgMjAxIDQ2OCAxNjlUMzkwIDEyMVE0MzAgMTA2IDQ1NiA3N1Q0ODMgLTdRNDgzIC00MiA0NjggLTcwVDQyNCAtMTE4VDM1NiAtMTQ5VDI2OSAtMTYwWk0yNjkgMzQ2UTI2MCAzNDggMjUxIDM0OVQyMzMgMzUzUTIwNyAzNTAgMTg2IDM0MFQxNDkgMzE3VDEyNiAyODdUMTE3IDI1NVExMTcgMjI5IDEzMCAyMTJUMTY1IDE4NFQyMTggMTY0VDI4MiAxNDlMMzE2IDE0MVEzNDEgMTQzIDM2MiAxNTJUNDAwIDE3NlQ0MjUgMjA3VDQzNCAyNDJRNDM0IDI2NyA0MjEgMjgzVDM4NiAzMTFUMzMzIDMzMFQyNjkgMzQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTg7IiBnbHlwaC1uYW1lPSJkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTM1MCA1NDhRMzI3IDU0OCAzMTQgNTYxVDMwMCA1OTdRMzAwIDYyMCAzMTMgNjMzVDM0OCA2NDZRMzcxIDY0NiAzODQgNjMzVDM5OCA1OTdRMzk4IDU3NCAzODUgNTYxVDM1MCA1NDhaTTE4MiA1NDhRMTU5IDU0OCAxNDYgNTYxVDEzMiA1OTdRMTMyIDYyMCAxNDUgNjMzVDE4MCA2NDZRMjAzIDY0NiAyMTYgNjMzVDIzMCA1OTdRMjMwIDU3NCAyMTcgNTYxVDE4MiA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBOTsiIGdseXBoLW5hbWU9ImNvcHlyaWdodCIgaG9yaXotYWR2LXg9Ijc4NyIgZD0iTTM5MyAtMTJRMzIxIC0xMiAyNjEgMTNUMTU3IDgyVDg5IDE4N1Q2NSAzMjJRNjUgMzk0IDkwIDQ1NlQxNTkgNTYzVDI2MyA2MzNUMzk0IDY1OVE0NjYgNjU5IDUyNiA2MzRUNjI5IDU2NVQ2OTcgNDYwVDcyMiAzMjVRNzIyIDI1MyA2OTcgMTkxVDYyOCA4NFQ1MjQgMTRUMzkzIC0xMlpNMzk1IDM2UTQ1NSAzNiA1MDUgNTdUNTkyIDExNlQ2NDggMjA2VDY2OCAzMjNRNjY4IDM4NSA2NDcgNDM3VDU4OSA1MjhUNTAyIDU4OVQzOTIgNjExUTMzMiA2MTEgMjgyIDU5MFQxOTUgNTMxVDEzOSA0NDFUMTE5IDMyNFExMTkgMjYyIDE0MCAyMTBUMTk4IDExOVQyODUgNThUMzk1IDM2Wk00MDIgMTQ0UTM2MyAxNDQgMzMxIDE1N1QyNzUgMTkzVDIzOCAyNTBUMjI1IDMyMlEyMjUgMzYwIDIzOCAzOTNUMjc2IDQ1MFQzMzIgNDg3VDQwMSA1MDFRNDQxIDUwMSA0NzAgNDg4VDUxNSA0NTlRNTM0IDQ0MCA1MzQgNDIxUTUzNCA0MTIgNTI5IDQwNlQ1MTggMzk1VDUwNyAzOTBUNTAwIDM5MFE0ODYgNDE2IDQ2MSA0MzBUNDAwIDQ0NVEzNzcgNDQ1IDM1NyA0MzZUMzIwIDQxMFQyOTUgMzcxVDI4NiAzMjNRMjg2IDI5NiAyOTUgMjc0VDMyMCAyMzVUMzU3IDIwOVQ0MDQgMjAwUTQ0MSAyMDAgNDY2IDIxN1Q1MDQgMjYwUTUwNSAyNjEgNTEwIDI2MFQ1MjIgMjU1VDUzNCAyNDVUNTM5IDIyOVE1MzkgMjEwIDUxNSAxODVRNTAwIDE2OSA0NzEgMTU3VDQwMiAxNDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQTsiIGdseXBoLW5hbWU9Im9yZGZlbWluaW5lIiBob3Jpei1hZHYteD0iNDU3IiBkPSJNMTk1IDI1OFExMjcgMjU4IDg5IDI4NVQ1MSAzNjNRNTEgMzkxIDYyIDQxNFQxMDQgNDU0VDE4NyA0ODJUMzIyIDQ5OFEzMjIgNTQ5IDI5NyA1NzdUMjE2IDYwNVExNzMgNjA1IDE0NSA1ODVUMTAwIDUzN1ExMDAgNTM2IDk1IDUzN1Q4NCA1NDFUNzIgNTUxVDY3IDU2N1E2NyA1NzggNzYgNTkzVDEwNCA2MjNUMTUyIDY0OFQyMjEgNjU5UTMwNCA2NTkgMzQzIDYxNlQzODMgNTAwVjI3MFEzODMgMjY4IDM3NyAyNjZUMzYyIDI2NFEzNDcgMjY0IDMzNSAyNzRUMzIzIDMyMFEzMDIgMjkxIDI2OCAyNzVUMTk1IDI1OFpNMjE1IC02UTE3NSAtNiAxNzUgMzRWNDJRMTc1IDgzIDIxNSA4M0gyMjNRMjY0IDgzIDI2NCA0MlYzNFEyNjQgLTYgMjIzIC02SDIxNVpNMjAzIDMwOFEyMjggMzA4IDI1MCAzMTZUMjg4IDMzN1QzMTMgMzY2VDMyMyA0MDFWNDU1UTI1NSA0NTAgMjE0IDQ0MlQxNTAgNDIzVDEyMCAzOTdUMTEyIDM2NlExMTIgMzM5IDEzNiAzMjRUMjAzIDMwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90bGVmdCIgaG9yaXotYWR2LXg9IjUzNyIgZD0iTTQ0NyA3OFE0MzMgNzggNDEzIDg5VDM3MiAxMTdUMzMwIDE1NVQyOTMgMTk0VDI2NiAyMjVUMjU2IDI0M1EyNTYgMjQ2IDI2NiAyNTlUMjkyIDI5MVQzMzAgMzMwVDM3MiAzNjhUNDEzIDM5NlQ0NDcgNDA4SDQ0OFE0NTkgNDA4IDQ2NSA0MDFUNDcyIDM4NVYzODNRNDcyIDM3MyA0NTkgMzU4VDQyNSAzMjRUMzc1IDI4NFQzMTYgMjQyUTM0NyAyMjEgMzc1IDIwMVQ0MjQgMTYyVDQ1OSAxMjhUNDcyIDEwM1YxMDBRNDcyIDkyIDQ2NiA4NVQ0NDggNzhINDQ3Wk0yMzMgOTRRMjEzIDk0IDE4NCAxMTVUMTI3IDE2M1Q4MCAyMTRUNjAgMjQzUTYwIDI0NiA2OSAyNThUOTMgMjg2VDEyNyAzMjFUMTY1IDM1NVQyMDIgMzgxVDIzMyAzOTFIMjM0UTI0MyAzOTEgMjQ5IDM4NVQyNTUgMzcwVjM2OVEyNTUgMzYwIDI0NCAzNDZUMjEzIDMxNlQxNjkgMjgwVDExNyAyNDJRMTQ0IDIyMyAxNjkgMjA1VDIxMyAxNzBUMjQzIDEzOVQyNTUgMTE2VjExNVEyNTUgMTA3IDI0OSAxMDFUMjM0IDk0SDIzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFDOyIgZ2x5cGgtbmFtZT0ibG9naWNhbG5vdCIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTQ5IDM4MEg1NDNWOTZINDUzVjI5N0g0OVYzODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRDsiIGdseXBoLW5hbWU9InVuaTAwQUQiIGhvcml6LWFkdi14PSIzOTYiIGQ9Ik02NCAyNzJIMzMyVjIxMkg2NFYyNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRTsiIGdseXBoLW5hbWU9InJlZ2lzdGVyZWQiIGhvcml6LWFkdi14PSI3ODciIGQ9Ik0zOTMgLTEyUTMyMSAtMTIgMjYxIDEzVDE1NyA4MlQ4OSAxODdUNjUgMzIyUTY1IDM5NCA5MCA0NTZUMTU5IDU2M1QyNjMgNjMzVDM5NCA2NTlRNDY2IDY1OSA1MjYgNjM0VDYyOSA1NjVUNjk3IDQ2MFQ3MjIgMzI1UTcyMiAyNTMgNjk3IDE5MVQ2MjggODRUNTI0IDE0VDM5MyAtMTJaTTM5NSAzNlE0NTUgMzYgNTA1IDU3VDU5MiAxMTZUNjQ4IDIwNlQ2NjggMzIzUTY2OCAzODUgNjQ3IDQzN1Q1ODkgNTI4VDUwMiA1ODlUMzkyIDYxMVEzMzIgNjExIDI4MiA1OTBUMTk1IDUzMVQxMzkgNDQxVDExOSAzMjRRMTE5IDI2MiAxNDAgMjEwVDE5OCAxMTlUMjg1IDU4VDM5NSAzNlpNNTAwIDE1MVE0OTIgMTUxIDQ4MSAxNTVUNDU5IDE3M0wzNzEgMjgzSDMyOFYxNzlRMzI4IDE1MSAzMDIgMTUxSDI5NFEyNjggMTUxIDI2OCAxODNWNDY0UTI2OCA0ODAgMjc3IDQ4OVQzMDAgNDk4SDQwNlE0NzEgNDk4IDUwNSA0NzJUNTQwIDM5MVE1NDAgMzQ2IDUxMyAzMTlUNDM2IDI4N0w1MzMgMTc2UTUzNSAxNzMgNTI2IDE2MlQ1MDAgMTUxWk0zMjcgMzMzSDQwN1E0NDIgMzMzIDQ2MSAzNDhUNDgwIDM5MFE0ODAgNDQ3IDQwNCA0NDdIMzI3VjMzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFGOyIgZ2x5cGgtbmFtZT0idW5pMDBBRiIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTE2MSA1NjhRMTIyIDU2OCAxMjIgNTk3VjYwMlExMjIgNjE2IDEzMiA2MjNUMTYxIDYzMEgzNjlRNDA4IDYzMCA0MDggNjAyVjU5N1E0MDggNTY4IDM2OSA1NjhIMTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjA7IiBnbHlwaC1uYW1lPSJkZWdyZWUiIGhvcml6LWFkdi14PSI0MzgiIGQ9Ik0yMTcgMzQ2UTE4NCAzNDYgMTU3IDM1N1QxMDkgMzg5VDc4IDQzOFQ2NiA0OTlWNTA4UTY2IDU0MSA3OCA1NjlUMTExIDYxN1QxNjAgNjUwVDIyMSA2NjJRMjU0IDY2MiAyODEgNjUxVDMyOSA2MTlUMzYwIDU3MFQzNzIgNTA5VjUwMFEzNzIgNDY3IDM2MCA0MzlUMzI3IDM5MVQyNzggMzU4VDIxNyAzNDZaTTIyMCAzOTlRMjYyIDM5OSAyODkgNDI3VDMxNyA0OTlWNTA4UTMxNyA1MjkgMzA5IDU0N1QyODggNTc5VDI1NiA2MDFUMjE4IDYwOVExNzYgNjA5IDE0OSA1ODFUMTIxIDUwOVY1MDBRMTIxIDQ3OSAxMjkgNDYxVDE1MCA0MjlUMTgyIDQwN1QyMjAgMzk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjE7IiBnbHlwaC1uYW1lPSJwbHVzbWludXMiIGhvcml6LWFkdi14PSI2MzAiIGQ9Ik0xNDMgNDExUTEyNSA0MTEgMTE5IDQxN1QxMTIgNDM3VjQ0M1ExMTIgNDU2IDExOCA0NjJUMTQzIDQ2OUgyODRWNjEyUTI4NCA2MzAgMjkxIDYzNlQzMTIgNjQzSDMxN1EzMzAgNjQzIDMzNyA2MzdUMzQ1IDYxMlY0NjlINDg2UTUwNCA0NjkgNTEwIDQ2M1Q1MTcgNDQzVjQzN1E1MTcgNDI0IDUxMSA0MThUNDg2IDQxMUgzNDVWMjU3UTM0NSAyMzkgMzM4IDIzM1QzMTcgMjI2SDMxMlEyOTkgMjI2IDI5MiAyMzJUMjg0IDI1N1Y0MTFIMTQzWk0xMzMgMTE5UTExNSAxMTkgMTA5IDEyNlQxMDIgMTQ2VjE1M1ExMDIgMTY2IDEwOCAxNzNUMTMzIDE4MEg0OTZRNTE0IDE4MCA1MjAgMTczVDUyNyAxNTNWMTQ2UTUyNyAxMzMgNTIxIDEyNlQ0OTYgMTE5SDEzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIyOyIgZ2x5cGgtbmFtZT0idHdvc3VwZXJpb3IiIGhvcml6LWFkdi14PSIzNjYiIGQ9Ik0yMDkgNDMwUTE5MCA0MjEgMTcyIDQxM1QxNDAgMzk1VDExOCAzNzFUMTA4IDMzOUgyOTBRMzIwIDMzOSAzMjAgMzE0VjMxMVEzMjAgMjg1IDI5MCAyODVIOTNRNzEgMjg1IDYzIDI5M1Q1NCAzMTlWMzM0UTU0IDM2MiA2MyAzODJUODcgNDE4VDEyMyA0NDRUMTY1IDQ2N1ExODIgNDc2IDE5OCA0ODNUMjI2IDUwMFQyNDUgNTE5VDI1MiA1NDRRMjUyIDU3MCAyMzQgNTg1VDE4MiA2MDFRMTQ0IDYwMSAxMjUgNTgwVDk4IDUzM1E5OCA1MzIgOTEgNTMyVDc2IDUzNFQ2MSA1NDNUNTQgNTYyUTU0IDU3NyA2MiA1OTNUODggNjIzVDEzMCA2NDZUMTg3IDY1NVEyNDggNjU1IDI4MSA2MjZUMzE1IDU0NVEzMTUgNTIxIDMwNiA1MDRUMjgzIDQ3M1QyNDkgNDQ5VDIwOSA0MzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMzsiIGdseXBoLW5hbWU9InRocmVlc3VwZXJpb3IiIGhvcml6LWFkdi14PSIzNjYiIGQ9Ik0zMTUgMzg3UTMxNSAzMzYgMjc4IDMwN1QxNzMgMjc4UTE0MCAyNzggMTE1IDI4NlQ3MyAzMDZUNDcgMzMyVDM4IDM1OVEzOCAzNzEgNDQgMzc4VDU3IDM4OFQ3MCAzOTJUNzYgMzkxUTg2IDM2MSAxMTEgMzQ1VDE3MiAzMjlRMjEwIDMyOSAyMzQgMzQ1VDI1OCAzOTBRMjU4IDQxOSAyMzYgNDM0VDE3NSA0NTBIMTUxUTEzNCA0NTAgMTI4IDQ1NlQxMjEgNDczVjQ3N1ExMjEgNDk5IDE1MCA0OTlIMTgyUTIxMyA0OTkgMjMxIDUxM1QyNTAgNTUwUTI1MCA1NzUgMjI4IDU4OVQxNzIgNjA0UTEzNyA2MDQgMTE2IDU4OFQ4NiA1NDlRODYgNTQ4IDgwIDU0OFQ2NyA1NTJUNTUgNTYyVDQ5IDU4MVE0OSA1OTMgNTcgNjA2VDgyIDYzMFQxMjEgNjQ4VDE3MyA2NTVRMjM4IDY1NSAyNzIgNjMwVDMwNiA1NTZRMzA2IDQ5NyAyNDUgNDc5UTMxNSA0NTYgMzE1IDM4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgZ2x5cGgtbmFtZT0iYWN1dGUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xOTQgNTUxUTE5MiA1NTMgMjAyIDU2N1QyMzEgNjAwVDI3MiA2NDBUMzE5IDY3OVEzNDMgNjk3IDM2NSA2OTdRMzc3IDY5NyAzODYgNjkwVDM5NSA2NzBRMzk1IDY0NSAzNTggNjIwUTMzMyA2MDMgMzA1IDU4OVQyNTMgNTY2VDIxMyA1NTNUMTk0IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI1OyIgZ2x5cGgtbmFtZT0idW5pMDBCNSIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTI2NyAtMTJRMjIwIC0xMiAxODQgM1ExNjEgMTMgMTQzIDI3Vi0yOTBINzhWNDc2SDE0M1YxOTFRMTQ1IDEyNyAxNzYgODlRMjEwIDQ5IDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAxIDQ4NyAtMVQ0NzEgLTRRNDU0IC00IDQ0MiA4VDQyOSA1OVY3NFE0MDQgMzYgMzY0IDEyVDI2NyAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGdseXBoLW5hbWU9InBhcmFncmFwaCIgaG9yaXotYWR2LXg9IjY0OCIgZD0iTTUxNyAtNFE0ODggLTQgNDg4IDI3VjYyMFE0ODggNjUxIDUxNyA2NTFINTI2UTU1NiA2NTEgNTU2IDYyMFYyN1E1NTYgLTQgNTI2IC00SDUxN1pNMzkyIC00UTM3NyAtNCAzNzAgNVQzNjIgMjdWMjkwSDI4M1ExNjggMjkwIDEwOCAzMzRUNDggNDY2UTQ4IDU1NSAxMDUgNjAxVDI3OCA2NDhIMzkyUTQwOCA2NDggNDE5IDYzN1Q0MzAgNjEwVjI3UTQzMCAtNCA0MDEgLTRIMzkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjc7IiBnbHlwaC1uYW1lPSJ1bmkwMEI3IiBob3Jpei1hZHYteD0iMjUxIiBkPSJNMTIwIDE5M1E3NiAxOTMgNzYgMjM3VjI0N1E3NiAyNjggODcgMjgwVDEyMCAyOTJIMTMwUTE1MiAyOTIgMTYzIDI4MFQxNzUgMjQ3VjIzN1ExNzUgMTkzIDEzMCAxOTNIMTIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjg7IiBnbHlwaC1uYW1lPSJjZWRpbGxhIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMjA3IC0yMjVRMjA0IC0yMjggMTk3IC0yMjlUMTg0IC0yMjhUMTc1IC0yMjJUMTc0IC0yMDlMMjM0IC04NFEyNDIgLTY4IDI0OCAtNTlUMjc0IC01MEgyNzlRMjkzIC01MCAzMDMgLTU3VDMxNCAtNzlWLTgzUTMxNCAtOTEgMzA3IC0xMDBUMjg4IC0xMjRMMjA3IC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCOTsiIGdseXBoLW5hbWU9Im9uZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iMzY2IiBkPSJNOTMgMjg1UTY0IDI4NSA2NCAzMTBWMzEyUTY0IDMzOSA5MyAzMzlIMTY1VjU2N1ExNDYgNTQ2IDExNSA1NDZROTQgNTQ2IDc3IDU1N1Q2MCA1ODlRNjAgNjA1IDY4IDYxM1Q3OSA2MjFROTQgNjA0IDExOSA2MDRRMTM5IDYwNCAxNTUgNjE3VDE3MyA2NTFIMTk2UTIyNSA2NTEgMjI1IDYyMFYzMzlIMjg1UTMxNSAzMzkgMzE1IDMxMlYzMTBRMzE1IDI4NSAyODUgMjg1SDkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkE7IiBnbHlwaC1uYW1lPSJvcmRtYXNjdWxpbmUiIGhvcml6LWFkdi14PSI1MDkiIGQ9Ik0yNTUgMjU3UTIxMyAyNTcgMTc3IDI3MlQxMTUgMzE1VDc0IDM3OFQ1OSA0NTdRNTkgNDk5IDc0IDUzNlQxMTYgNjAwVDE3OCA2NDNUMjU1IDY1OVEyOTcgNjU5IDMzMiA2NDRUMzk0IDYwMVQ0MzUgNTM4VDQ1MCA0NTlRNDUwIDQxNyA0MzUgMzgwVDM5MyAzMTZUMzMxIDI3M1QyNTUgMjU3Wk0yNDkgLTZRMjA5IC02IDIwOSAzNFY0MlEyMDkgODMgMjQ5IDgzSDI1N1EyOTggODMgMjk4IDQyVjM0UTI5OCAtNiAyNTcgLTZIMjQ5Wk0yNTUgMzExUTI4NCAzMTEgMzA5IDMyMlQzNTIgMzUzVDM4MCAzOTlUMzkwIDQ1OFEzOTAgNDg5IDM4MCA1MTZUMzUxIDU2MlQzMDggNTkzVDI1NSA2MDVRMjI2IDYwNSAyMDEgNTk0VDE1OCA1NjNUMTMwIDUxNlQxMTkgNDU4UTExOSA0MjcgMTI5IDQwMVQxNTggMzU0VDIwMSAzMjNUMjU1IDMxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90cmlnaHQiIGhvcml6LWFkdi14PSI1MzciIGQ9Ik0zMDMgOTVRMjk0IDk1IDI4OCAxMDFUMjgyIDExNlYxMTdRMjgyIDEyNiAyOTMgMTQwVDMyNCAxNzBUMzY4IDIwNlQ0MjAgMjQ0UTM5MyAyNjMgMzY4IDI4MVQzMjQgMzE2VDI5NCAzNDdUMjgyIDM3MFYzNzFRMjgyIDM3OSAyODggMzg1VDMwMyAzOTJIMzA0UTMxNyAzOTIgMzM1IDM4MlQzNzIgMzU3VDQxMCAzMjNUNDQ0IDI4OFQ0NjggMjU5VDQ3NyAyNDNRNDc3IDI0MCA0NjggMjI4VDQ0NCAyMDBUNDEwIDE2NVQzNzIgMTMxVDMzNSAxMDVUMzA0IDk1SDMwM1pNODkgNzhRNzggNzggNzIgODVUNjUgMTAxVjEwM1E2NSAxMTMgNzggMTI4VDExMiAxNjJUMTYyIDIwMlQyMjEgMjQ0UTE5MCAyNjUgMTYyIDI4NVQxMTMgMzI0VDc4IDM1OFQ2NSAzODNWMzg2UTY1IDM5NCA3MSA0MDFUODkgNDA4SDkwUTEwNCA0MDggMTI0IDM5N1QxNjUgMzY5VDIwNyAzMzFUMjQ0IDI5MlQyNzEgMjYxVDI4MSAyNDNRMjgxIDI0MCAyNzEgMjI3VDI0NSAxOTVUMjA3IDE1NlQxNjUgMTE4VDEyNCA5MFQ5MCA3OEg4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJDOyIgZ2x5cGgtbmFtZT0ib25lcXVhcnRlciIgaG9yaXotYWR2LXg9IjgyMiIgZD0iTTY5OSAtM1E2ODYgLTMgNjgwIDVUNjczIDI3Vjk1SDUyN1E1MDkgOTUgNDk5IDEwM1Q0ODggMTI0VjEzN1E0ODkgMTQ3IDQ5MyAxNTRUNTA1IDE3NUw2MjkgMzM4UTYzOSAzNTQgNjQ5IDM2MFQ2ODQgMzY2UTcxMCAzNjYgNzIwIDM1N1Q3MzAgMzI0VjE0Nkg3NjhRNzk3IDE0NiA3OTcgMTIyVjExOVE3OTcgOTUgNzY4IDk1SDczMFYyN1E3MzAgLTMgNzAzIC0zSDY5OVpNMTY0IC01UTE2NCA5IDE2OCAxOFQxODggNDhRMTk1IDU4IDIxNyA4NFQyNjkgMTQ3VDMzMyAyMjNUMzk3IDMwMlE0MTIgMzIxIDQzMSAzNDVUNDcyIDM5NVQ1MTUgNDUwVDU1OSA1MDRRNjA4IDU2NiA2NjAgNjMyUTY2OCA2MzIgNjc0IDYzMFE2NzkgNjI4IDY4NCA2MjRUNjg5IDYxMFE2ODkgNTk5IDY4NCA1ODhUNjY0IDU1N1E2NTcgNTQ4IDYzNSA1MjFUNTgyIDQ1OFQ1MTkgMzgxVDQ1NSAzMDJRNDQwIDI4MyA0MjEgMjU5VDM4MCAyMDlUMzM3IDE1NFQyOTQgMTAwUTI0NiAzOCAxOTQgLTI3UTE5MyAtMjggMTg4IC0yOFQxNzggLTI2VDE2OSAtMThUMTY0IC01Wk05MyAyODVRNjQgMjg1IDY0IDMxMFYzMTJRNjQgMzM5IDkzIDMzOUgxNjVWNTY3UTE0NiA1NDYgMTE1IDU0NlE5NCA1NDYgNzcgNTU3VDYwIDU4OVE2MCA2MDUgNjggNjEzVDc5IDYyMVE5NCA2MDQgMTE5IDYwNFExMzkgNjA0IDE1NSA2MTdUMTczIDY1MUgxOTZRMjI1IDY1MSAyMjUgNjIwVjMzOUgyODVRMzE1IDMzOSAzMTUgMzEyVjMxMFEzMTUgMjg1IDI4NSAyODVIOTNaTTU0NCAxNDVINjc0TDY3MyAzMTZMNTQ0IDE0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJEOyIgZ2x5cGgtbmFtZT0ib25laGFsZiIgaG9yaXotYWR2LXg9IjgyMiIgZD0iTTY2NSAxNDVRNjQ2IDEzNiA2MjggMTI4VDU5NiAxMTBUNTc0IDg2VDU2NCA1NEg3NDZRNzc2IDU0IDc3NiAyOVYyNlE3NzYgMCA3NDYgMEg1NDlRNTI3IDAgNTE5IDhUNTEwIDM0VjQ5UTUxMCA3NyA1MTkgOTdUNTQzIDEzM1Q1NzkgMTU5VDYyMSAxODJRNjM4IDE5MSA2NTQgMTk4VDY4MiAyMTVUNzAxIDIzNFQ3MDggMjU5UTcwOCAyODUgNjkwIDMwMFQ2MzggMzE2UTYwMCAzMTYgNTgxIDI5NVQ1NTQgMjQ4UTU1NCAyNDcgNTQ3IDI0N1Q1MzIgMjQ5VDUxNyAyNThUNTEwIDI3N1E1MTAgMjkyIDUxOCAzMDhUNTQ0IDMzOFQ1ODYgMzYxVDY0MyAzNzBRNzA0IDM3MCA3MzcgMzQxVDc3MSAyNjBRNzcxIDIzNiA3NjIgMjE5VDczOSAxODhUNzA1IDE2NFQ2NjUgMTQ1Wk0xMzQgLTVRMTM0IDkgMTM4IDE4VDE1OCA0OFExNjUgNTggMTg3IDg0VDIzOSAxNDdUMzAzIDIyM1QzNjcgMzAyUTM4MiAzMjEgNDAxIDM0NVQ0NDIgMzk1VDQ4NSA0NTBUNTI5IDUwNFE1NzggNTY2IDYzMCA2MzJRNjM4IDYzMiA2NDQgNjMwUTY0OSA2MjggNjU0IDYyNFQ2NTkgNjEwUTY1OSA1OTkgNjU0IDU4OFQ2MzQgNTU3UTYyNyA1NDggNjA1IDUyMVQ1NTIgNDU4VDQ4OSAzODFUNDI1IDMwMlE0MTAgMjgzIDM5MSAyNTlUMzUwIDIwOVQzMDcgMTU0VDI2NCAxMDBRMjE2IDM4IDE2NCAtMjdRMTYzIC0yOCAxNTggLTI4VDE0OCAtMjZUMTM5IC0xOFQxMzQgLTVaTTkzIDI4NVE2NCAyODUgNjQgMzEwVjMxMlE2NCAzMzkgOTMgMzM5SDE2NVY1NjdRMTQ2IDU0NiAxMTUgNTQ2UTk0IDU0NiA3NyA1NTdUNjAgNTg5UTYwIDYwNSA2OCA2MTNUNzkgNjIxUTk0IDYwNCAxMTkgNjA0UTEzOSA2MDQgMTU1IDYxN1QxNzMgNjUxSDE5NlEyMjUgNjUxIDIyNSA2MjBWMzM5SDI4NVEzMTUgMzM5IDMxNSAzMTJWMzEwUTMxNSAyODUgMjg1IDI4NUg5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJFOyIgZ2x5cGgtbmFtZT0idGhyZWVxdWFydGVycyIgaG9yaXotYWR2LXg9IjgyMiIgZD0iTTY5OSAtM1E2ODYgLTMgNjgwIDVUNjczIDI3Vjk1SDUyN1E1MDkgOTUgNDk5IDEwM1Q0ODggMTI0VjEzN1E0ODkgMTQ3IDQ5MyAxNTRUNTA1IDE3NUw2MjkgMzM4UTYzOSAzNTQgNjQ5IDM2MFQ2ODQgMzY2UTcxMCAzNjYgNzIwIDM1N1Q3MzAgMzI0VjE0Nkg3NjhRNzk3IDE0NiA3OTcgMTIyVjExOVE3OTcgOTUgNzY4IDk1SDczMFYyN1E3MzAgLTMgNzAzIC0zSDY5OVpNMzE1IDM4N1EzMTUgMzM2IDI3OCAzMDdUMTczIDI3OFExNDAgMjc4IDExNSAyODZUNzMgMzA2VDQ3IDMzMlQzOCAzNTlRMzggMzcxIDQ0IDM3OFQ1NyAzODhUNzAgMzkyVDc2IDM5MVE4NiAzNjEgMTExIDM0NVQxNzIgMzI5UTIxMCAzMjkgMjM0IDM0NVQyNTggMzkwUTI1OCA0MTkgMjM2IDQzNFQxNzUgNDUwSDE1MVExMzQgNDUwIDEyOCA0NTZUMTIxIDQ3M1Y0NzdRMTIxIDQ5OSAxNTAgNDk5SDE4MlEyMTMgNDk5IDIzMSA1MTNUMjUwIDU1MFEyNTAgNTc1IDIyOCA1ODlUMTcyIDYwNFExMzcgNjA0IDExNiA1ODhUODYgNTQ5UTg2IDU0OCA4MCA1NDhUNjcgNTUyVDU1IDU2MlQ0OSA1ODFRNDkgNTkzIDU3IDYwNlQ4MiA2MzBUMTIxIDY0OFQxNzMgNjU1UTIzOCA2NTUgMjcyIDYzMFQzMDYgNTU2UTMwNiA0OTcgMjQ1IDQ3OVEzMTUgNDU2IDMxNSAzODdaTTE2NCAtNVExNjQgOSAxNjggMThUMTg4IDQ4UTE5NSA1OCAyMTcgODRUMjY5IDE0N1QzMzMgMjIzVDM5NyAzMDJRNDEyIDMyMSA0MzEgMzQ1VDQ3MiAzOTVUNTE1IDQ1MFQ1NTkgNTA0UTYwOCA1NjYgNjYwIDYzMlE2NjggNjMyIDY3NCA2MzBRNjc5IDYyOCA2ODQgNjI0VDY4OSA2MTBRNjg5IDU5OSA2ODQgNTg4VDY2NCA1NTdRNjU3IDU0OCA2MzUgNTIxVDU4MiA0NThUNTE5IDM4MVQ0NTUgMzAyUTQ0MCAyODMgNDIxIDI1OVQzODAgMjA5VDMzNyAxNTRUMjk0IDEwMFEyNDYgMzggMTk0IC0yN1ExOTMgLTI4IDE4OCAtMjhUMTc4IC0yNlQxNjkgLTE4VDE2NCAtNVpNNTQ0IDE0NUg2NzRMNjczIDMxNkw1NDQgMTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkY7IiBnbHlwaC1uYW1lPSJxdWVzdGlvbmRvd24iIGhvcml6LWFkdi14PSI0OTMiIGQ9Ik0yNjAgNTU3UTIzOSA1NTcgMjMxIDU2NVQyMjIgNTk0VjYxNFEyMjIgNjM0IDIzMCA2NDJUMjYwIDY1MUgyODBRMzAwIDY1MSAzMDggNjQzVDMxNyA2MTRWNTk0UTMxNyA1NzMgMzA5IDU2NVQyODAgNTU3SDI2MFpNMjM5IC0xMlExOTQgLTEyIDE1OCAwVDk3IDM1VDU5IDg3VDQ1IDE1MlE0NSAxODIgNTMgMjA0VDc2IDI0NFQxMDggMjc1VDE0NCAzMDJRMTYzIDMxNSAxODEgMzI5VDIxMyAzNjBUMjM2IDM5OVQyNDUgNDUzUTI0NSA0NjEgMjUzIDQ2NVQyNzMgNDcwUTI4NiA0NzAgMjk0IDQ2NVQzMDEgNDQ5UTI5OSA0MDggMjg5IDM3OVQyNjQgMzI5VDIyOSAyOTJUMTkxIDI2NFExNTkgMjQzIDEzNiAyMjFUMTEyIDE1OFExMTIgMTA3IDE0NSA3OFQyNDEgNDhRMjgwIDQ4IDMwNyA2MFQzNTIgOTFUMzc5IDEzNVQzOTMgMTg0UTM5MyAxODUgNDAxIDE4NVQ0MTggMTgwVDQzNCAxNjdUNDQyIDE0NFE0NDIgMTI1IDQzMSA5OFQzOTUgNDdRMzcwIDIyIDMzMiA1VDIzOSAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMDsiIGdseXBoLW5hbWU9IkFncmF2ZSIgaG9yaXotYWR2LXg9IjYzOSIgZD0iTTI2OCA2MjhRMjczIDY0MSAyODQgNjQ3VDMxOSA2NTNRMzQzIDY1MyAzNTQgNjQ3VDM3MCA2MjhMNjEzIDBINTM3TDQ1NiAyMTFIMTc5TDk4IDBIMjVMMjY4IDYyOFpNNDM0IDI3MUwzMTggNTc2TDIwMSAyNzFINDM0Wk0zNjAgNzIxUTM1OCA3MTkgMzQyIDcyM1QzMDEgNzM2VDI0OSA3NTlUMTk2IDc5MFExNTkgODE1IDE1OSA4NDBRMTU5IDg1MiAxNjggODU5VDE4OSA4NjdRMjExIDg2NyAyMzUgODQ5UTI1OSA4MzIgMjgyIDgxMVQzMjMgNzcwVDM1MSA3MzdUMzYwIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMxOyIgZ2x5cGgtbmFtZT0iQWFjdXRlIiBob3Jpei1hZHYteD0iNjM5IiBkPSJNMjY4IDYyOFEyNzMgNjQxIDI4NCA2NDdUMzE5IDY1M1EzNDMgNjUzIDM1NCA2NDdUMzcwIDYyOEw2MTMgMEg1MzdMNDU2IDIxMUgxNzlMOTggMEgyNUwyNjggNjI4Wk00MzQgMjcxTDMxOCA1NzZMMjAxIDI3MUg0MzRaTTI2OCA3MjFRMjY2IDcyMyAyNzYgNzM3VDMwNSA3NzBUMzQ2IDgxMFQzOTMgODQ5UTQxNyA4NjcgNDM5IDg2N1E0NTEgODY3IDQ2MCA4NjBUNDY5IDg0MFE0NjkgODE1IDQzMiA3OTBRNDA3IDc3MyAzNzkgNzU5VDMyNyA3MzZUMjg3IDcyM1QyNjggNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzI7IiBnbHlwaC1uYW1lPSJBY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjYzOSIgZD0iTTI2OCA2MjhRMjczIDY0MSAyODQgNjQ3VDMxOSA2NTNRMzQzIDY1MyAzNTQgNjQ3VDM3MCA2MjhMNjEzIDBINTM3TDQ1NiAyMTFIMTc5TDk4IDBIMjVMMjY4IDYyOFpNNDM0IDI3MUwzMTggNTc2TDIwMSAyNzFINDM0Wk0yMTAgNzE5UTE4OCA3MTkgMTg4IDc0MlExODggNzYwIDIwOCA3ODVUMjUyIDgzM1QyOTYgODczVDMxOSA4ODlRMzIxIDg4OSAzNDEgODczVDM4NiA4MzRUNDI5IDc4NVQ0NDkgNzQyUTQ0OSA3MTkgNDI4IDcxOVE0MTEgNzE5IDM4NyA3NDRUMzE4IDgzMVEyOTUgODAwIDI3OSA3NzlUMjUwIDc0NVQyMjggNzI1VDIxMCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMzsiIGdseXBoLW5hbWU9IkF0aWxkZSIgaG9yaXotYWR2LXg9IjYzOSIgZD0iTTI2OCA2MjhRMjczIDY0MSAyODQgNjQ3VDMxOSA2NTNRMzQzIDY1MyAzNTQgNjQ3VDM3MCA2MjhMNjEzIDBINTM3TDQ1NiAyMTFIMTc5TDk4IDBIMjVMMjY4IDYyOFpNNDM0IDI3MUwzMTggNTc2TDIwMSAyNzFINDM0Wk0yMDYgNzI1UTE4MSA3MjUgMTgxIDc1MVExODEgNzY3IDE4NiA3ODNUMjAwIDgxMlQyMjIgODMzVDI1MCA4NDFRMjc0IDg0MSAzMTQgODIwVDM5OCA3NjFRNDAyIDc3NCA0MDcgNzg3VDQxOCA4MTBUNDMwIDgyN1Q0NDQgODM0UTQ2OSA4MzQgNDY5IDgwOFE0NjkgNzkxIDQ2NCA3NzVUNDUwIDc0N1Q0MjggNzI2VDQwMCA3MThRMzc2IDcxOCAzMzYgNzM5VDI1MiA3OThRMjQ4IDc4NSAyNDMgNzcyVDIzMiA3NDlUMjIwIDczMlQyMDYgNzI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzQ7IiBnbHlwaC1uYW1lPSJBZGllcmVzaXMiIGhvcml6LWFkdi14PSI2MzkiIGQ9Ik0yNjggNjI4UTI3MyA2NDEgMjg0IDY0N1QzMTkgNjUzUTM0MyA2NTMgMzU0IDY0N1QzNzAgNjI4TDYxMyAwSDUzN0w0NTYgMjExSDE3OUw5OCAwSDI1TDI2OCA2MjhaTTQzNCAyNzFMMzE4IDU3NkwyMDEgMjcxSDQzNFpNNDA0IDcxOFEzODEgNzE4IDM2OCA3MzFUMzU0IDc2N1EzNTQgNzkwIDM2NyA4MDNUNDAyIDgxNlE0MjUgODE2IDQzOCA4MDNUNDUyIDc2N1E0NTIgNzQ0IDQzOSA3MzFUNDA0IDcxOFpNMjM2IDcxOFEyMTMgNzE4IDIwMCA3MzFUMTg2IDc2N1ExODYgNzkwIDE5OSA4MDNUMjM0IDgxNlEyNTcgODE2IDI3MCA4MDNUMjg0IDc2N1EyODQgNzQ0IDI3MSA3MzFUMjM2IDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM1OyIgZ2x5cGgtbmFtZT0iQXJpbmciIGhvcml6LWFkdi14PSI2MzkiIGQ9Ik00MzUgNzE5UTQzNSA2ODQgNDE4IDY1OFQzNzMgNjE3TDYwNyAxNlE2MDkgMTIgNTk3IDRUNTY4IC00UTU1NiAtNCA1NDUgMlQ1MjcgMjdMNDU2IDIxMUgxNzhMMTA4IDI3UTEwMSA5IDkxIDNUNjkgLTRRNTQgLTQgNDIgNFQzMSAxNkwyNjMgNjE2UTIzNCA2MzAgMjE4IDY1N1QyMDIgNzE5UTIwMiA3NDQgMjExIDc2NVQyMzUgODAyVDI3MiA4MjdUMzE5IDgzNlEzNDQgODM2IDM2NSA4MjdUNDAyIDgwM1Q0MjYgNzY2VDQzNSA3MTlaTTIwMCAyNzFINDM0TDMxNyA1NzdMMjAwIDI3MVpNMzE4IDY0N1EzNDcgNjQ3IDM2NiA2NjdUMzg1IDcxOVEzODUgNzUwIDM2NiA3NzFUMzE4IDc5MlEyODkgNzkyIDI3MCA3NzFUMjUxIDcxOVEyNTEgNjg5IDI3MCA2NjhUMzE4IDY0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM2OyIgZ2x5cGgtbmFtZT0iQUUiIGhvcml6LWFkdi14PSI4NzQiIGQ9Ik01NzcgMFE1NTEgMCA1NDAgOVQ1MjEgMzhMNDU3IDIxMUgxNzhMMTA4IDI3UTEwMCA2IDg3IDFUNjAgLTNUMzkgNlQzMSAxNkwyNjQgNjE3UTI2OSA2MzAgMjc5IDYzOFQzMDcgNjQ3SDgxMlY1ODVIMzg0UTM5MSA1NjggMzk4IDU1MFE0MDQgNTM0IDQxMSA1MTRUNDI3IDQ3NFE0NDUgNDI1IDQ3MCAzNjNINzQxVjMwMUg0OTVMNTg3IDYySDgxOFYwSDU3N1pNNDM1IDI3MUwzMTggNTc2TDIwMSAyNzFINDM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzc7IiBnbHlwaC1uYW1lPSJDY2VkaWxsYSIgaG9yaXotYWR2LXg9IjY5MCIgZD0iTTM4NiAtMTJRMzE1IC0xMiAyNTYgMTJUMTU1IDgxVDg5IDE4NlQ2NSAzMjJRNjUgMzk2IDg5IDQ1OFQxNTUgNTY0VDI1NyA2MzRUMzg5IDY1OVE0MjggNjU5IDQ2MSA2NTJUNTIwIDYzNFQ1NjcgNjA5VDYwMiA1ODFRNjMwIDU1MyA2MzAgNTMxUTYzMCA1MTggNjI0IDUxMFQ2MTEgNDk3VDU5NyA0OTFUNTkwIDQ5MFE1NzUgNTE3IDU1MiA1MzdUNTAyIDU3MlQ0NDYgNTkzVDM4NyA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNiA1MjNUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjQgMTU0IDIxM1QyMDcgMTI1VDI4NyA2OFQzODkgNDdRNDI1IDQ3IDQ1OCA1NlQ1MTggODFUNTY2IDEyMVQ1OTggMTc0UTU5OCAxNzUgNjA1IDE3NFQ2MjAgMTY5VDYzNSAxNTZUNjQyIDEzNFE2NDIgMTIyIDYzMiAxMDRUNjA0IDY4UTU3NCAzOCA1MTkgMTNUMzg2IC0xMlpNMzEyIC0yMjVRMzA5IC0yMjggMzAyIC0yMjlUMjg5IC0yMjhUMjgwIC0yMjJUMjc5IC0yMDlMMzM5IC04NFEzNDcgLTY4IDM1MyAtNTlUMzc5IC01MEgzODRRMzk4IC01MCA0MDggLTU3VDQxOSAtNzlWLTgzUTQxOSAtOTEgNDEyIC0xMDBUMzkzIC0xMjRMMzEyIC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDODsiIGdseXBoLW5hbWU9IkVncmF2ZSIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTkyIDYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDU0NFY1ODVIMTYwVjM2Mkg0NzNWMzAySDE2MFY2Mkg1NTBWMEg5MlY2MDlaTTM5MSA3MjFRMzg5IDcxOSAzNzMgNzIzVDMzMiA3MzZUMjgwIDc1OVQyMjcgNzkwUTE5MCA4MTUgMTkwIDg0MFExOTAgODUyIDE5OSA4NTlUMjIwIDg2N1EyNDIgODY3IDI2NiA4NDlRMjkwIDgzMiAzMTMgODExVDM1NCA3NzBUMzgyIDczN1QzOTEgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzk7IiBnbHlwaC1uYW1lPSJFYWN1dGUiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik05MiA2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0g1NDRWNTg1SDE2MFYzNjJINDczVjMwMkgxNjBWNjJINTUwVjBIOTJWNjA5Wk0yNDIgNzIxUTI0MCA3MjMgMjUwIDczN1QyNzkgNzcwVDMyMCA4MTBUMzY3IDg0OVEzOTEgODY3IDQxMyA4NjdRNDI1IDg2NyA0MzQgODYwVDQ0MyA4NDBRNDQzIDgxNSA0MDYgNzkwUTM4MSA3NzMgMzUzIDc1OVQzMDEgNzM2VDI2MSA3MjNUMjQyIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgZ2x5cGgtbmFtZT0iRWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik05MiA2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0g1NDRWNTg1SDE2MFYzNjJINDczVjMwMkgxNjBWNjJINTUwVjBIOTJWNjA5Wk0yMTEgNzE5UTE4OSA3MTkgMTg5IDc0MlExODkgNzYwIDIwOSA3ODVUMjUzIDgzM1QyOTcgODczVDMyMCA4ODlRMzIyIDg4OSAzNDIgODczVDM4NyA4MzRUNDMwIDc4NVQ0NTAgNzQyUTQ1MCA3MTkgNDI5IDcxOVE0MTIgNzE5IDM4OCA3NDRUMzE5IDgzMVEyOTYgODAwIDI4MCA3NzlUMjUxIDc0NVQyMjkgNzI1VDIxMSA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQjsiIGdseXBoLW5hbWU9IkVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTkyIDYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDU0NFY1ODVIMTYwVjM2Mkg0NzNWMzAySDE2MFY2Mkg1NTBWMEg5MlY2MDlaTTQwNSA3MThRMzgyIDcxOCAzNjkgNzMxVDM1NSA3NjdRMzU1IDc5MCAzNjggODAzVDQwMyA4MTZRNDI2IDgxNiA0MzkgODAzVDQ1MyA3NjdRNDUzIDc0NCA0NDAgNzMxVDQwNSA3MThaTTIzNyA3MThRMjE0IDcxOCAyMDEgNzMxVDE4NyA3NjdRMTg3IDc5MCAyMDAgODAzVDIzNSA4MTZRMjU4IDgxNiAyNzEgODAzVDI4NSA3NjdRMjg1IDc0NCAyNzIgNzMxVDIzNyA3MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQzsiIGdseXBoLW5hbWU9IklncmF2ZSIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTEwMiA2MjBRMTAyIDY1MSAxMzEgNjUxSDE0MFExNzAgNjUxIDE3MCA2MjBWMEgxMDJWNjIwWk0xODcgNzIxUTE4NSA3MTkgMTY5IDcyM1QxMjggNzM2VDc2IDc1OVQyMyA3OTBRLTE0IDgxNSAtMTQgODQwUS0xNCA4NTIgLTUgODU5VDE2IDg2N1EzOCA4NjcgNjIgODQ5UTg2IDgzMiAxMDkgODExVDE1MCA3NzBUMTc4IDczN1QxODcgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Q7IiBnbHlwaC1uYW1lPSJJYWN1dGUiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0xMDIgNjIwUTEwMiA2NTEgMTMxIDY1MUgxNDBRMTcwIDY1MSAxNzAgNjIwVjBIMTAyVjYyMFpNODUgNzIxUTgzIDcyMyA5MyA3MzdUMTIyIDc3MFQxNjMgODEwVDIxMCA4NDlRMjM0IDg2NyAyNTYgODY3UTI2OCA4NjcgMjc3IDg2MFQyODYgODQwUTI4NiA4MTUgMjQ5IDc5MFEyMjQgNzczIDE5NiA3NTlUMTQ0IDczNlQxMDQgNzIzVDg1IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENFOyIgZ2x5cGgtbmFtZT0iSWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0xMDIgNjIwUTEwMiA2NTEgMTMxIDY1MUgxNDBRMTcwIDY1MSAxNzAgNjIwVjBIMTAyVjYyMFpNMjcgNzE5UTUgNzE5IDUgNzQyUTUgNzYwIDI1IDc4NVQ2OSA4MzNUMTEzIDg3M1QxMzYgODg5UTEzOCA4ODkgMTU4IDg3M1QyMDMgODM0VDI0NiA3ODVUMjY2IDc0MlEyNjYgNzE5IDI0NSA3MTlRMjI4IDcxOSAyMDQgNzQ0VDEzNSA4MzFRMTEyIDgwMCA5NiA3NzlUNjcgNzQ1VDQ1IDcyNVQyNyA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRjsiIGdseXBoLW5hbWU9IklkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTEwMiA2MjBRMTAyIDY1MSAxMzEgNjUxSDE0MFExNzAgNjUxIDE3MCA2MjBWMEgxMDJWNjIwWk0yMjEgNzE4UTE5OCA3MTggMTg1IDczMVQxNzEgNzY3UTE3MSA3OTAgMTg0IDgwM1QyMTkgODE2UTI0MiA4MTYgMjU1IDgwM1QyNjkgNzY3UTI2OSA3NDQgMjU2IDczMVQyMjEgNzE4Wk01MyA3MThRMzAgNzE4IDE3IDczMVQzIDc2N1EzIDc5MCAxNiA4MDNUNTEgODE2UTc0IDgxNiA4NyA4MDNUMTAxIDc2N1ExMDEgNzQ0IDg4IDczMVQ1MyA3MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMDsiIGdseXBoLW5hbWU9IkV0aCIgaG9yaXotYWR2LXg9Ijc0NyIgZD0iTTYyIDI5NFE0NCAyOTQgMzggMzAxVDMxIDMyMVYzMjdRMzEgMzQwIDM3IDM0N1Q2MiAzNTRIMTI3VjYwOVExMjcgNjI1IDEzOCA2MzZUMTY1IDY0N0gzMjNRNDA2IDY0NyA0NzIgNjI1VDU4NSA1NjJUNjU3IDQ2MFQ2ODIgMzI1UTY4MiAyNDkgNjU3IDE4OVQ1ODQgODdUNDY5IDIzVDMxOCAwSDE2NVExNDkgMCAxMzggMTFUMTI3IDM4VjI5NEg2MlpNMzI3IDYyUTQ2NiA2MiA1MzkgMTMwVDYxMyAzMjNRNjEzIDQ0NyA1MzkgNTE2VDMyOCA1ODVIMTk1VjM1NEg0MDlRNDI3IDM1NCA0MzMgMzQ3VDQ0MCAzMjdWMzIxUTQ0MCAzMDggNDM0IDMwMVQ0MDkgMjk0SDE5NVY2MkgzMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMTsiIGdseXBoLW5hbWU9Ik50aWxkZSIgaG9yaXotYWR2LXg9IjcwNSIgZD0iTTkyIDYwNVE5MiA2MjQgMTAxIDYzN1QxMjkgNjUxSDE0NlExNjUgNjUxIDE3NSA2NDJUMTk4IDYxNUw1NDkgMTA2VjY0N0g2MTNWNDJRNjEzIDIyIDYwNCA5VDU3OCAtNEg1NzNRNTU0IC00IDU0NyAyVDUyOSAyMkwxNTYgNTYxVjBIOTJWNjA1Wk0yMzQgNzI1UTIwOSA3MjUgMjA5IDc1MVEyMDkgNzY3IDIxNCA3ODNUMjI4IDgxMlQyNTAgODMzVDI3OCA4NDFRMzAyIDg0MSAzNDIgODIwVDQyNiA3NjFRNDMwIDc3NCA0MzUgNzg3VDQ0NiA4MTBUNDU4IDgyN1Q0NzIgODM0UTQ5NyA4MzQgNDk3IDgwOFE0OTcgNzkxIDQ5MiA3NzVUNDc4IDc0N1Q0NTYgNzI2VDQyOCA3MThRNDA0IDcxOCAzNjQgNzM5VDI4MCA3OThRMjc2IDc4NSAyNzEgNzcyVDI2MCA3NDlUMjQ4IDczMlQyMzQgNzI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDI7IiBnbHlwaC1uYW1lPSJPZ3JhdmUiIGhvcml6LWFkdi14PSI3NzQiIGQ9Ik0zODYgLTEyUTMxNSAtMTIgMjU2IDEyVDE1NSA4MVQ4OSAxODZUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OCA2NTlRNDU5IDY1OSA1MTggNjM1VDYxOSA1NjZUNjg1IDQ2MFQ3MDkgMzI0UTcwOSAyNTAgNjg1IDE4OFQ2MTkgODJUNTE3IDEzVDM4NiAtMTJaTTM4OCA0N1E0NDMgNDcgNDg5IDY3VDU2OCAxMjNUNjIwIDIxMFQ2MzkgMzIyUTYzOSAzODIgNjIwIDQzM1Q1NjggNTIxVDQ4OCA1NzlUMzg2IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2MyAxNTQgMjEyVDIwNiAxMjVUMjg2IDY4VDM4OCA0N1pNNDM4IDcyMVE0MzYgNzE5IDQyMCA3MjNUMzc5IDczNlQzMjcgNzU5VDI3NCA3OTBRMjM3IDgxNSAyMzcgODQwUTIzNyA4NTIgMjQ2IDg1OVQyNjcgODY3UTI4OSA4NjcgMzEzIDg0OVEzMzcgODMyIDM2MCA4MTFUNDAxIDc3MFQ0MjkgNzM3VDQzOCA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMzsiIGdseXBoLW5hbWU9Ik9hY3V0ZSIgaG9yaXotYWR2LXg9Ijc3NCIgZD0iTTM4NiAtMTJRMzE1IC0xMiAyNTYgMTJUMTU1IDgxVDg5IDE4NlQ2NSAzMjJRNjUgMzk2IDg5IDQ1OFQxNTUgNTY0VDI1NyA2MzRUMzg4IDY1OVE0NTkgNjU5IDUxOCA2MzVUNjE5IDU2NlQ2ODUgNDYwVDcwOSAzMjRRNzA5IDI1MCA2ODUgMTg4VDYxOSA4MlQ1MTcgMTNUMzg2IC0xMlpNMzg4IDQ3UTQ0MyA0NyA0ODkgNjdUNTY4IDEyM1Q2MjAgMjEwVDYzOSAzMjJRNjM5IDM4MiA2MjAgNDMzVDU2OCA1MjFUNDg4IDU3OVQzODYgNjAwUTMzMSA2MDAgMjg1IDU4MFQyMDYgNTIzVDE1NCA0MzZUMTM1IDMyNFExMzUgMjYzIDE1NCAyMTJUMjA2IDEyNVQyODYgNjhUMzg4IDQ3Wk0zMzYgNzIxUTMzNCA3MjMgMzQ0IDczN1QzNzMgNzcwVDQxNCA4MTBUNDYxIDg0OVE0ODUgODY3IDUwNyA4NjdRNTE5IDg2NyA1MjggODYwVDUzNyA4NDBRNTM3IDgxNSA1MDAgNzkwUTQ3NSA3NzMgNDQ3IDc1OVQzOTUgNzM2VDM1NSA3MjNUMzM2IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgZ2x5cGgtbmFtZT0iT2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NzQiIGQ9Ik0zODYgLTEyUTMxNSAtMTIgMjU2IDEyVDE1NSA4MVQ4OSAxODZUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OCA2NTlRNDU5IDY1OSA1MTggNjM1VDYxOSA1NjZUNjg1IDQ2MFQ3MDkgMzI0UTcwOSAyNTAgNjg1IDE4OFQ2MTkgODJUNTE3IDEzVDM4NiAtMTJaTTM4OCA0N1E0NDMgNDcgNDg5IDY3VDU2OCAxMjNUNjIwIDIxMFQ2MzkgMzIyUTYzOSAzODIgNjIwIDQzM1Q1NjggNTIxVDQ4OCA1NzlUMzg2IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2MyAxNTQgMjEyVDIwNiAxMjVUMjg2IDY4VDM4OCA0N1pNMjc4IDcxOVEyNTYgNzE5IDI1NiA3NDJRMjU2IDc2MCAyNzYgNzg1VDMyMCA4MzNUMzY0IDg3M1QzODcgODg5UTM4OSA4ODkgNDA5IDg3M1Q0NTQgODM0VDQ5NyA3ODVUNTE3IDc0MlE1MTcgNzE5IDQ5NiA3MTlRNDc5IDcxOSA0NTUgNzQ0VDM4NiA4MzFRMzYzIDgwMCAzNDcgNzc5VDMxOCA3NDVUMjk2IDcyNVQyNzggNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBnbHlwaC1uYW1lPSJPdGlsZGUiIGhvcml6LWFkdi14PSI3NzQiIGQ9Ik0zODYgLTEyUTMxNSAtMTIgMjU2IDEyVDE1NSA4MVQ4OSAxODZUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OCA2NTlRNDU5IDY1OSA1MTggNjM1VDYxOSA1NjZUNjg1IDQ2MFQ3MDkgMzI0UTcwOSAyNTAgNjg1IDE4OFQ2MTkgODJUNTE3IDEzVDM4NiAtMTJaTTM4OCA0N1E0NDMgNDcgNDg5IDY3VDU2OCAxMjNUNjIwIDIxMFQ2MzkgMzIyUTYzOSAzODIgNjIwIDQzM1Q1NjggNTIxVDQ4OCA1NzlUMzg2IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2MyAxNTQgMjEyVDIwNiAxMjVUMjg2IDY4VDM4OCA0N1pNMjY5IDcyNVEyNDQgNzI1IDI0NCA3NTFRMjQ0IDc2NyAyNDkgNzgzVDI2MyA4MTJUMjg1IDgzM1QzMTMgODQxUTMzNyA4NDEgMzc3IDgyMFQ0NjEgNzYxUTQ2NSA3NzQgNDcwIDc4N1Q0ODEgODEwVDQ5MyA4MjdUNTA3IDgzNFE1MzIgODM0IDUzMiA4MDhRNTMyIDc5MSA1MjcgNzc1VDUxMyA3NDdUNDkxIDcyNlQ0NjMgNzE4UTQzOSA3MTggMzk5IDczOVQzMTUgNzk4UTMxMSA3ODUgMzA2IDc3MlQyOTUgNzQ5VDI4MyA3MzJUMjY5IDcyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ2OyIgZ2x5cGgtbmFtZT0iT2RpZXJlc2lzIiBob3Jpei1hZHYteD0iNzc0IiBkPSJNMzg2IC0xMlEzMTUgLTEyIDI1NiAxMlQxNTUgODFUODkgMTg2VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODggNjU5UTQ1OSA2NTkgNTE4IDYzNVQ2MTkgNTY2VDY4NSA0NjBUNzA5IDMyNFE3MDkgMjUwIDY4NSAxODhUNjE5IDgyVDUxNyAxM1QzODYgLTEyWk0zODggNDdRNDQzIDQ3IDQ4OSA2N1Q1NjggMTIzVDYyMCAyMTBUNjM5IDMyMlE2MzkgMzgyIDYyMCA0MzNUNTY4IDUyMVQ0ODggNTc5VDM4NiA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNiA1MjNUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjMgMTU0IDIxMlQyMDYgMTI1VDI4NiA2OFQzODggNDdaTTQ3MiA3MThRNDQ5IDcxOCA0MzYgNzMxVDQyMiA3NjdRNDIyIDc5MCA0MzUgODAzVDQ3MCA4MTZRNDkzIDgxNiA1MDYgODAzVDUyMCA3NjdRNTIwIDc0NCA1MDcgNzMxVDQ3MiA3MThaTTMwNCA3MThRMjgxIDcxOCAyNjggNzMxVDI1NCA3NjdRMjU0IDc5MCAyNjcgODAzVDMwMiA4MTZRMzI1IDgxNiAzMzggODAzVDM1MiA3NjdRMzUyIDc0NCAzMzkgNzMxVDMwNCA3MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENzsiIGdseXBoLW5hbWU9Im11bHRpcGx5IiBob3Jpei1hZHYteD0iNTY5IiBkPSJNMTE4IDk0UTk4IDExMiAxMjAgMTM2TDI0NiAyNjZMMTIwIDM5NFE5OCA0MTggMTE4IDQzNkwxMjIgNDQwUTEzMCA0NDkgMTQwIDQ0OVQxNjUgNDM2TDI4NyAzMDhMNDA5IDQzNlE0MjMgNDUwIDQzMyA0NTBUNDUyIDQ0MEw0NTYgNDM2UTQ3NiA0MTggNDU0IDM5NEwzMjggMjY2TDQ1NCAxMzZRNDc2IDExMiA0NTYgOTRMNDUyIDkwUTQ0NCA4MSA0MzQgODFUNDA5IDk0TDI4NyAyMjNMMTY1IDk0UTE1MSA4MCAxNDEgODBUMTIyIDkwTDExOCA5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ4OyIgZ2x5cGgtbmFtZT0iT3NsYXNoIiBob3Jpei1hZHYteD0iNzc0IiBkPSJNOTQgLTQyUTkyIC00NCA4NyAtNDJUNzYgLTM1VDY2IC0yM1Q2MSAtNlE2MSA0IDY2IDE1VDg1IDQzTDEzOCAxMDJRMTAzIDE0NiA4NCAyMDFUNjUgMzIyUTY1IDM5MyA4OCA0NTRUMTU0IDU2MVQyNTYgNjMzVDM4OCA2NTlRNDQ3IDY1OSA0OTYgNjQyVDU4NiA1OTNMNjY3IDY4M1E2NjggNjg0IDY3MyA2ODJUNjg1IDY3NlQ2OTUgNjY0VDcwMCA2NDdRNzAwIDYzNyA2OTUgNjI2VDY3NiA1OThMNjMyIDU0OVE2NjkgNTA0IDY4OSA0NDdUNzA5IDMyNFE3MDkgMjUzIDY4NiAxOTJUNjIwIDg1VDUxOCAxNFQzODYgLTEyUTMyNSAtMTIgMjc0IDZUMTgzIDU3TDk0IC00MlpNMzg4IDUwUTQ0NiA1MCA0OTIgNzBUNTcyIDEyN1Q2MjMgMjEzVDY0MSAzMjJRNjQxIDQyOCA1ODQgNTAyTDIyNyAxMDVRMjU5IDc5IDI5OSA2NVQzODggNTBaTTEzMyAzMjRRMTMzIDI3MyAxNDYgMjI5VDE4NiAxNDlMNTQyIDU0NVE1MTEgNTcwIDQ3MiA1ODNUMzg2IDU5N1EzMjggNTk3IDI4MiA1NzdUMjAyIDUxOVQxNTEgNDMyVDEzMyAzMjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGdseXBoLW5hbWU9IlVncmF2ZSIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTMzMyAtMTJRMjEwIC0xMiAxNDYgNTZUODIgMjU1VjYyMFE4MiA2NTEgMTExIDY1MUgxMjBRMTUwIDY1MSAxNTAgNjIwVjI2MFExNTAgNDkgMzM1IDQ5UTUyMCA0OSA1MjAgMjYxVjYyMFE1MjAgNjUxIDU0OCA2NTFINTYwUTU4NyA2NTEgNTg3IDYyMFYyNThRNTg3IDEyNiA1MjIgNTdUMzMzIC0xMlpNMzk0IDcxMVEzOTIgNzA5IDM3NiA3MTNUMzM1IDcyNlQyODMgNzQ5VDIzMCA3ODBRMTkzIDgwNSAxOTMgODMwUTE5MyA4NDIgMjAyIDg0OVQyMjMgODU3UTI0NSA4NTcgMjY5IDgzOVEyOTMgODIyIDMxNiA4MDFUMzU3IDc2MFQzODUgNzI3VDM5NCA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQTsiIGdseXBoLW5hbWU9IlVhY3V0ZSIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTMzMyAtMTJRMjEwIC0xMiAxNDYgNTZUODIgMjU1VjYyMFE4MiA2NTEgMTExIDY1MUgxMjBRMTUwIDY1MSAxNTAgNjIwVjI2MFExNTAgNDkgMzM1IDQ5UTUyMCA0OSA1MjAgMjYxVjYyMFE1MjAgNjUxIDU0OCA2NTFINTYwUTU4NyA2NTEgNTg3IDYyMFYyNThRNTg3IDEyNiA1MjIgNTdUMzMzIC0xMlpNMjgyIDcxMVEyODAgNzEzIDI5MCA3MjdUMzE5IDc2MFQzNjAgODAwVDQwNyA4MzlRNDMxIDg1NyA0NTMgODU3UTQ2NSA4NTcgNDc0IDg1MFQ0ODMgODMwUTQ4MyA4MDUgNDQ2IDc4MFE0MjEgNzYzIDM5MyA3NDlUMzQxIDcyNlQzMDEgNzEzVDI4MiA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQjsiIGdseXBoLW5hbWU9IlVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjY5IiBkPSJNMzMzIC0xMlEyMTAgLTEyIDE0NiA1NlQ4MiAyNTVWNjIwUTgyIDY1MSAxMTEgNjUxSDEyMFExNTAgNjUxIDE1MCA2MjBWMjYwUTE1MCA0OSAzMzUgNDlRNTIwIDQ5IDUyMCAyNjFWNjIwUTUyMCA2NTEgNTQ4IDY1MUg1NjBRNTg3IDY1MSA1ODcgNjIwVjI1OFE1ODcgMTI2IDUyMiA1N1QzMzMgLTEyWk0yMjQgNzE5UTIwMiA3MTkgMjAyIDc0MlEyMDIgNzYwIDIyMiA3ODVUMjY2IDgzM1QzMTAgODczVDMzMyA4ODlRMzM1IDg4OSAzNTUgODczVDQwMCA4MzRUNDQzIDc4NVQ0NjMgNzQyUTQ2MyA3MTkgNDQyIDcxOVE0MjUgNzE5IDQwMSA3NDRUMzMyIDgzMVEzMDkgODAwIDI5MyA3NzlUMjY0IDc0NVQyNDIgNzI1VDIyNCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQzsiIGdseXBoLW5hbWU9IlVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTMzMyAtMTJRMjEwIC0xMiAxNDYgNTZUODIgMjU1VjYyMFE4MiA2NTEgMTExIDY1MUgxMjBRMTUwIDY1MSAxNTAgNjIwVjI2MFExNTAgNDkgMzM1IDQ5UTUyMCA0OSA1MjAgMjYxVjYyMFE1MjAgNjUxIDU0OCA2NTFINTYwUTU4NyA2NTEgNTg3IDYyMFYyNThRNTg3IDEyNiA1MjIgNTdUMzMzIC0xMlpNNDE4IDcxOFEzOTUgNzE4IDM4MiA3MzFUMzY4IDc2N1EzNjggNzkwIDM4MSA4MDNUNDE2IDgxNlE0MzkgODE2IDQ1MiA4MDNUNDY2IDc2N1E0NjYgNzQ0IDQ1MyA3MzFUNDE4IDcxOFpNMjUwIDcxOFEyMjcgNzE4IDIxNCA3MzFUMjAwIDc2N1EyMDAgNzkwIDIxMyA4MDNUMjQ4IDgxNlEyNzEgODE2IDI4NCA4MDNUMjk4IDc2N1EyOTggNzQ0IDI4NSA3MzFUMjUwIDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEREOyIgZ2x5cGgtbmFtZT0iWWFjdXRlIiBob3Jpei1hZHYteD0iNTc5IiBkPSJNMjU1IDI2OUwyNSA2NDdIMTAwTDI5MCAzMzFMNDc5IDYyN1E0OTEgNjQ2IDUwNCA2NDlUNTI5IDY0OFQ1NDcgNjM1VDU1MyA2MjJMMzIzIDI2OVYwSDI1NVYyNjlaTTIyOCA3MTFRMjI2IDcxMyAyMzYgNzI3VDI2NSA3NjBUMzA2IDgwMFQzNTMgODM5UTM3NyA4NTcgMzk5IDg1N1E0MTEgODU3IDQyMCA4NTBUNDI5IDgzMFE0MjkgODA1IDM5MiA3ODBRMzY3IDc2MyAzMzkgNzQ5VDI4NyA3MjZUMjQ3IDcxM1QyMjggNzExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REU7IiBnbHlwaC1uYW1lPSJUaG9ybiIgaG9yaXotYWR2LXg9IjU4OCIgZD0iTTEyMSAtNFE5MiAtNCA5MiAyN1Y2MjBROTIgNjUxIDEyMSA2NTFIMTMwUTE2MCA2NTEgMTYwIDYyMFY1MjRIMjk2UTQxMCA1MjQgNDcyIDQ3M1Q1MzQgMzI4UTUzNCAyMzEgNDcyIDE4MFQyODggMTI5SDE2MFYyN1ExNjAgLTQgMTMwIC00SDEyMVpNMTYwIDQ2M1YxODlIMjk0UTM3OSAxODkgNDIxIDIyNFQ0NjQgMzI2UTQ2NCA0NjMgMjk3IDQ2M0gxNjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERjsiIGdseXBoLW5hbWU9Imdlcm1hbmRibHMiIGhvcml6LWFkdi14PSI1NTYiIGQ9Ik0zMjcgLTEyUTI4MyAtMTIgMjU0IC0yVDIxMCAyNFExOTQgNDAgMTk0IDU2UTE5NCA2NSAxOTggNzJUMjA2IDg1VDIxNSA5MlQyMjAgOTRRMjM4IDc0IDI2MiA2MFQzMjkgNDVRMzUzIDQ1IDM3NCA1NFQ0MTAgODBUNDM1IDExOVQ0NDUgMTY3UTQ0NSAxOTIgNDM5IDIxNlQ0MTUgMjYwVDM2OSAyOThUMjkyIDMyN1EyNjAgMzM1IDI0OCAzNDhUMjM2IDM4MVEyMzYgMzk2IDI0MiA0MDdUMjUzIDQyMlEzMzEgNDIxIDM3MCA0NDVUNDEwIDUyNlE0MTAgNTc0IDM3NyA2MDJUMjg1IDYzMFEyMTkgNjMwIDE4MyA1OTFUMTQ3IDQ2N1YwSDgyVjQ2OFE4MiA1NzcgMTM3IDYzM1QyODYgNjg5UTMyOCA2ODkgMzYyIDY3OFQ0MjIgNjQ1VDQ2MCA1OTVUNDc0IDUzMVE0NzQgMzkyIDMxMiAzODBRMzY5IDM2NiA0MDcgMzQ1VDQ2OCAyOTdUNTAwIDIzN1Q1MTAgMTY3UTUxMCAxMzAgNDk2IDk4VDQ1NyA0MVQzOTkgMlQzMjcgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTA7IiBnbHlwaC1uYW1lPSJhZ3JhdmUiIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0yMTYgLTExUTEzOCAtMTEgOTUgMjVUNTIgMTIyUTUyIDIwNiAxMzQgMjQzVDM4MyAyODRIMzkzVjMwMVEzOTMgMzYzIDM1OSAzOTVUMjU5IDQyOFEyMDEgNDI4IDE2NCA0MDNUMTA3IDM0MFExMDcgMzQwIDEwMSAzNDFUODkgMzQ1VDc2IDM1N1Q3MCAzNzhRNzAgMzg3IDc3IDQwMFQ5NiA0MjZRMTE5IDQ0OSAxNjEgNDY4VDI2NCA0ODhRMzU1IDQ4OCA0MDYgNDM5VDQ1NyAzMDNWMEgzOTRWNzNRMzY2IDM0IDMyMCAxMlQyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODZUMzgwIDEzMlQzOTMgMTg5VjIzM0gzODBRMjQ2IDIyOCAxODIgMjA0VDExOCAxMjJRMTE4IDg2IDE0NSA2NVQyMjIgNDNaTTMzOCA1NTFRMzM2IDU0OSAzMjAgNTUzVDI3OSA1NjZUMjI3IDU4OVQxNzQgNjIwUTEzNyA2NDUgMTM3IDY3MFExMzcgNjgyIDE0NiA2ODlUMTY3IDY5N1ExODkgNjk3IDIxMyA2NzlRMjM3IDY2MiAyNjAgNjQxVDMwMSA2MDBUMzI5IDU2N1QzMzggNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBnbHlwaC1uYW1lPSJhYWN1dGUiIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0yMTYgLTExUTEzOCAtMTEgOTUgMjVUNTIgMTIyUTUyIDIwNiAxMzQgMjQzVDM4MyAyODRIMzkzVjMwMVEzOTMgMzYzIDM1OSAzOTVUMjU5IDQyOFEyMDEgNDI4IDE2NCA0MDNUMTA3IDM0MFExMDcgMzQwIDEwMSAzNDFUODkgMzQ1VDc2IDM1N1Q3MCAzNzhRNzAgMzg3IDc3IDQwMFQ5NiA0MjZRMTE5IDQ0OSAxNjEgNDY4VDI2NCA0ODhRMzU1IDQ4OCA0MDYgNDM5VDQ1NyAzMDNWMEgzOTRWNzNRMzY2IDM0IDMyMCAxMlQyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODZUMzgwIDEzMlQzOTMgMTg5VjIzM0gzODBRMjQ2IDIyOCAxODIgMjA0VDExOCAxMjJRMTE4IDg2IDE0NSA2NVQyMjIgNDNaTTE5NiA1NTFRMTk0IDU1MyAyMDQgNTY3VDIzMyA2MDBUMjc0IDY0MFQzMjEgNjc5UTM0NSA2OTcgMzY3IDY5N1EzNzkgNjk3IDM4OCA2OTBUMzk3IDY3MFEzOTcgNjQ1IDM2MCA2MjBRMzM1IDYwMyAzMDcgNTg5VDI1NSA1NjZUMjE1IDU1M1QxOTYgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTI7IiBnbHlwaC1uYW1lPSJhY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjUzNSIgZD0iTTIxNiAtMTFRMTM4IC0xMSA5NSAyNVQ1MiAxMjJRNTIgMjA2IDEzNCAyNDNUMzgzIDI4NEgzOTNWMzAxUTM5MyAzNjMgMzU5IDM5NVQyNTkgNDI4UTIwMSA0MjggMTY0IDQwM1QxMDcgMzQwUTEwNyAzNDAgMTAxIDM0MVQ4OSAzNDVUNzYgMzU3VDcwIDM3OFE3MCAzODcgNzcgNDAwVDk2IDQyNlExMTkgNDQ5IDE2MSA0NjhUMjY0IDQ4OFEzNTUgNDg4IDQwNiA0MzlUNDU3IDMwM1YwSDM5NFY3M1EzNjYgMzQgMzIwIDEyVDIxNiAtMTFaTTIyMiA0M1EyNTkgNDMgMjkwIDU0VDM0NCA4NlQzODAgMTMyVDM5MyAxODlWMjMzSDM4MFEyNDYgMjI4IDE4MiAyMDRUMTE4IDEyMlExMTggODYgMTQ1IDY1VDIyMiA0M1pNMTU4IDU0OVExMzYgNTQ5IDEzNiA1NzJRMTM2IDU5MCAxNTYgNjE1VDIwMCA2NjNUMjQ0IDcwM1QyNjcgNzE5UTI2OSA3MTkgMjg5IDcwM1QzMzQgNjY0VDM3NyA2MTVUMzk3IDU3MlEzOTcgNTQ5IDM3NiA1NDlRMzU5IDU0OSAzMzUgNTc0VDI2NiA2NjFRMjQzIDYzMCAyMjcgNjA5VDE5OCA1NzVUMTc2IDU1NVQxNTggNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTM7IiBnbHlwaC1uYW1lPSJhdGlsZGUiIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0yMTYgLTExUTEzOCAtMTEgOTUgMjVUNTIgMTIyUTUyIDIwNiAxMzQgMjQzVDM4MyAyODRIMzkzVjMwMVEzOTMgMzYzIDM1OSAzOTVUMjU5IDQyOFEyMDEgNDI4IDE2NCA0MDNUMTA3IDM0MFExMDcgMzQwIDEwMSAzNDFUODkgMzQ1VDc2IDM1N1Q3MCAzNzhRNzAgMzg3IDc3IDQwMFQ5NiA0MjZRMTE5IDQ0OSAxNjEgNDY4VDI2NCA0ODhRMzU1IDQ4OCA0MDYgNDM5VDQ1NyAzMDNWMEgzOTRWNzNRMzY2IDM0IDMyMCAxMlQyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODZUMzgwIDEzMlQzOTMgMTg5VjIzM0gzODBRMjQ2IDIyOCAxODIgMjA0VDExOCAxMjJRMTE4IDg2IDE0NSA2NVQyMjIgNDNaTTE0OSA1NTVRMTI0IDU1NSAxMjQgNTgxUTEyNCA1OTcgMTI5IDYxM1QxNDMgNjQyVDE2NSA2NjNUMTkzIDY3MVEyMTcgNjcxIDI1NyA2NTBUMzQxIDU5MVEzNDUgNjA0IDM1MCA2MTdUMzYxIDY0MFQzNzMgNjU3VDM4NyA2NjRRNDEyIDY2NCA0MTIgNjM4UTQxMiA2MjEgNDA3IDYwNVQzOTMgNTc3VDM3MSA1NTZUMzQzIDU0OFEzMTkgNTQ4IDI3OSA1NjlUMTk1IDYyOFExOTEgNjE1IDE4NiA2MDJUMTc1IDU3OVQxNjMgNTYyVDE0OSA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNDsiIGdseXBoLW5hbWU9ImFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjUzNSIgZD0iTTIxNiAtMTFRMTM4IC0xMSA5NSAyNVQ1MiAxMjJRNTIgMjA2IDEzNCAyNDNUMzgzIDI4NEgzOTNWMzAxUTM5MyAzNjMgMzU5IDM5NVQyNTkgNDI4UTIwMSA0MjggMTY0IDQwM1QxMDcgMzQwUTEwNyAzNDAgMTAxIDM0MVQ4OSAzNDVUNzYgMzU3VDcwIDM3OFE3MCAzODcgNzcgNDAwVDk2IDQyNlExMTkgNDQ5IDE2MSA0NjhUMjY0IDQ4OFEzNTUgNDg4IDQwNiA0MzlUNDU3IDMwM1YwSDM5NFY3M1EzNjYgMzQgMzIwIDEyVDIxNiAtMTFaTTIyMiA0M1EyNTkgNDMgMjkwIDU0VDM0NCA4NlQzODAgMTMyVDM5MyAxODlWMjMzSDM4MFEyNDYgMjI4IDE4MiAyMDRUMTE4IDEyMlExMTggODYgMTQ1IDY1VDIyMiA0M1pNMzUyIDU0OFEzMjkgNTQ4IDMxNiA1NjFUMzAyIDU5N1EzMDIgNjIwIDMxNSA2MzNUMzUwIDY0NlEzNzMgNjQ2IDM4NiA2MzNUNDAwIDU5N1E0MDAgNTc0IDM4NyA1NjFUMzUyIDU0OFpNMTg0IDU0OFExNjEgNTQ4IDE0OCA1NjFUMTM0IDU5N1ExMzQgNjIwIDE0NyA2MzNUMTgyIDY0NlEyMDUgNjQ2IDIxOCA2MzNUMjMyIDU5N1EyMzIgNTc0IDIxOSA1NjFUMTg0IDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU1OyIgZ2x5cGgtbmFtZT0iYXJpbmciIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0yMTYgLTExUTEzOCAtMTEgOTUgMjVUNTIgMTIyUTUyIDIwNiAxMzQgMjQzVDM4MyAyODRIMzkzVjMwMVEzOTMgMzYzIDM1OSAzOTVUMjU5IDQyOFEyMDEgNDI4IDE2NCA0MDNUMTA3IDM0MFExMDcgMzQwIDEwMSAzNDFUODkgMzQ1VDc2IDM1N1Q3MCAzNzhRNzAgMzg3IDc3IDQwMFQ5NiA0MjZRMTE5IDQ0OSAxNjEgNDY4VDI2NCA0ODhRMzU1IDQ4OCA0MDYgNDM5VDQ1NyAzMDNWMEgzOTRWNzNRMzY2IDM0IDMyMCAxMlQyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODZUMzgwIDEzMlQzOTMgMTg5VjIzM0gzODBRMjQ2IDIyOCAxODIgMjA0VDExOCAxMjJRMTE4IDg2IDE0NSA2NVQyMjIgNDNaTTI2NiA1NDhRMjQwIDU0OCAyMTkgNTU3VDE4MyA1ODFUMTU5IDYxOFQxNTAgNjY1UTE1MCA2OTAgMTU5IDcxMVQxODMgNzQ4VDIyMCA3NzNUMjY3IDc4MlEyOTIgNzgyIDMxMyA3NzNUMzUwIDc0OVQzNzQgNzEyVDM4MyA2NjVRMzgzIDY0MCAzNzQgNjE5VDM1MCA1ODJUMzEzIDU1N1QyNjYgNTQ4Wk0yNjYgNTkzUTI5NSA1OTMgMzE0IDYxM1QzMzMgNjY1UTMzMyA2OTYgMzE0IDcxN1QyNjYgNzM4UTIzNyA3MzggMjE4IDcxN1QxOTkgNjY1UTE5OSA2MzUgMjE4IDYxNFQyNjYgNTkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTY7IiBnbHlwaC1uYW1lPSJhZSIgaG9yaXotYWR2LXg9Ijg5NSIgZD0iTTIxNiAtMTFRMTM4IC0xMSA5NSAyNVQ1MiAxMjJRNTIgMjA2IDEzNCAyNDNUMzgzIDI4NEgzOTNWMzAxUTM5MyAzNjMgMzU5IDM5NVQyNTkgNDI4UTIwMSA0MjggMTY0IDQwM1QxMDcgMzQwUTEwNyAzNDAgMTAxIDM0MVQ4OSAzNDVUNzYgMzU3VDcwIDM3OFE3MCAzOTEgODIgNDA5VDExOSA0NDVUMTgwIDQ3NVQyNjQgNDg4UTMzMCA0ODggMzcyIDQ2MFQ0MzQgMzgyUTQ2MyA0MzIgNTExIDQ2MFQ2MjQgNDg4UTY3NCA0ODggNzE1IDQ3MVQ3ODUgNDIzVDgzMCAzNDdUODQ2IDI0OFYyNDJRODQ2IDIyOCA4NDAgMjI0VDgxOSAyMjBINDQ5UTQ1MSAxODIgNDY1IDE1MFQ1MDMgOTVUNTU5IDU5VDYzMCA0NlE2NjUgNDYgNjkxIDUzVDczNiA3MVQ3NjggOThUNzkzIDEzMVE3OTQgMTMyIDgwMCAxMzFUODEzIDEyNlQ4MjUgMTE0VDgzMSA5NFE4MzEgODIgODE4IDY0VDc3OSAyOVQ3MTYgMFQ2MzAgLTEyUTU1NCAtMTIgNTAxIDIwVDQyMSAxMTBRMzk1IDU2IDM0MSAyM1QyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODRUMzgwIDEzMFQzOTMgMTg5VjIzM0wzNjUgMjMyUTI0MiAyMjcgMTgwIDIwM1QxMTggMTIyUTExOCA4NiAxNDUgNjVUMjIyIDQzWk02MjQgNDMxUTU5MCA0MzEgNTYxIDQyMFQ1MDkgMzg4VDQ3MSAzMzlUNDUxIDI3Nkg3NzdRNzcyIDM0NyA3MzIgMzg5VDYyNCA0MzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNzsiIGdseXBoLW5hbWU9ImNjZWRpbGxhIiBob3Jpei1hZHYteD0iNTQ4IiBkPSJNMjk1IC0xMlEyNDIgLTEyIDE5OCA3VDEyMCA1OVQ2OSAxMzlUNTAgMjM5UTUwIDI5MyA2OCAzMzhUMTIwIDQxN1QxOTcgNDY5VDI5NSA0ODhRMzU2IDQ4OCAzOTcgNDY5VDQ2NSA0MjRRNDgyIDQwNyA0OTEgMzg5VDUwMCAzNTZRNTAwIDM0NSA0OTQgMzM5VDQ3OSAzMjlUNDY1IDMyNFQ0NTcgMzI1UTQ0OCAzNDcgNDM0IDM2NlQ0MDEgMzk5VDM1NSA0MjJUMjk1IDQzMFEyNTcgNDMwIDIyNCA0MTZUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDFUMjIzIDYxVDI5NSA0NlEzMjkgNDYgMzU1IDU0VDQwMCA3NlQ0MzQgMTEwVDQ1NyAxNTFRNDU4IDE1MiA0NjQgMTUyVDQ3OSAxNDhUNDkzIDEzOFQ1MDAgMTIwUTUwMCAxMDYgNDkxIDg4VDQ2MyA1MFE0MzggMjUgMzk3IDdUMjk1IC0xMlpNMjMyIC0yMjVRMjI5IC0yMjggMjIyIC0yMjlUMjA5IC0yMjhUMjAwIC0yMjJUMTk5IC0yMDlMMjU5IC04NFEyNjcgLTY4IDI3MyAtNTlUMjk5IC01MEgzMDRRMzE4IC01MCAzMjggLTU3VDMzOSAtNzlWLTgzUTMzOSAtOTEgMzMyIC0xMDBUMzEzIC0xMjRMMjMyIC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFODsiIGdseXBoLW5hbWU9ImVncmF2ZSIgaG9yaXotYWR2LXg9IjU2MSIgZD0iTTI5NiAtMTJRMjQyIC0xMiAxOTcgNlQxMTkgNTdUNjggMTM1VDUwIDIzNlE1MCAyOTAgNjggMzM2VDExOCA0MTZUMTk0IDQ2OVQyOTAgNDg4UTM0MCA0ODggMzgxIDQ3MVQ0NTEgNDIzVDQ5NiAzNDdUNTEyIDI0OFYyNDJRNTEyIDIyOCA1MDYgMjI0VDQ4NSAyMjBIMTE1UTExOCAxODAgMTMyIDE0OFQxNzEgOTRUMjI2IDU5VDI5NiA0NlEzMzEgNDYgMzU3IDUzVDQwMiA3MVQ0MzQgOThUNDU5IDEzMVE0NjAgMTMyIDQ2NiAxMzFUNDc5IDEyNlQ0OTEgMTE0VDQ5NyA5NFE0OTcgNzUgNDcxIDQ5UTQ0OCAyNiA0MDMgN1QyOTYgLTEyWk0yOTAgNDMxUTI1NyA0MzEgMjI4IDQyMFQxNzcgMzg4VDEzOSAzMzlUMTE4IDI3Nkg0NDNRNDM4IDM0NyAzOTggMzg5VDI5MCA0MzFaTTM0NiA1NTFRMzQ0IDU0OSAzMjggNTUzVDI4NyA1NjZUMjM1IDU4OVQxODIgNjIwUTE0NSA2NDUgMTQ1IDY3MFExNDUgNjgyIDE1NCA2ODlUMTc1IDY5N1ExOTcgNjk3IDIyMSA2NzlRMjQ1IDY2MiAyNjggNjQxVDMwOSA2MDBUMzM3IDU2N1QzNDYgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTk7IiBnbHlwaC1uYW1lPSJlYWN1dGUiIGhvcml6LWFkdi14PSI1NjEiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDZUMTE5IDU3VDY4IDEzNVQ1MCAyMzZRNTAgMjkwIDY4IDMzNlQxMTggNDE2VDE5NCA0NjlUMjkwIDQ4OFEzNDAgNDg4IDM4MSA0NzFUNDUxIDQyM1Q0OTYgMzQ3VDUxMiAyNDhWMjQyUTUxMiAyMjggNTA2IDIyNFQ0ODUgMjIwSDExNVExMTggMTgwIDEzMiAxNDhUMTcxIDk0VDIyNiA1OVQyOTYgNDZRMzMxIDQ2IDM1NyA1M1Q0MDIgNzFUNDM0IDk4VDQ1OSAxMzFRNDYwIDEzMiA0NjYgMTMxVDQ3OSAxMjZUNDkxIDExNFQ0OTcgOTRRNDk3IDc1IDQ3MSA0OVE0NDggMjYgNDAzIDdUMjk2IC0xMlpNMjkwIDQzMVEyNTcgNDMxIDIyOCA0MjBUMTc3IDM4OFQxMzkgMzM5VDExOCAyNzZINDQzUTQzOCAzNDcgMzk4IDM4OVQyOTAgNDMxWk0yMTkgNTUxUTIxNyA1NTMgMjI3IDU2N1QyNTYgNjAwVDI5NyA2NDBUMzQ0IDY3OVEzNjggNjk3IDM5MCA2OTdRNDAyIDY5NyA0MTEgNjkwVDQyMCA2NzBRNDIwIDY0NSAzODMgNjIwUTM1OCA2MDMgMzMwIDU4OVQyNzggNTY2VDIzOCA1NTNUMjE5IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVBOyIgZ2x5cGgtbmFtZT0iZWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NjEiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDZUMTE5IDU3VDY4IDEzNVQ1MCAyMzZRNTAgMjkwIDY4IDMzNlQxMTggNDE2VDE5NCA0NjlUMjkwIDQ4OFEzNDAgNDg4IDM4MSA0NzFUNDUxIDQyM1Q0OTYgMzQ3VDUxMiAyNDhWMjQyUTUxMiAyMjggNTA2IDIyNFQ0ODUgMjIwSDExNVExMTggMTgwIDEzMiAxNDhUMTcxIDk0VDIyNiA1OVQyOTYgNDZRMzMxIDQ2IDM1NyA1M1Q0MDIgNzFUNDM0IDk4VDQ1OSAxMzFRNDYwIDEzMiA0NjYgMTMxVDQ3OSAxMjZUNDkxIDExNFQ0OTcgOTRRNDk3IDc1IDQ3MSA0OVE0NDggMjYgNDAzIDdUMjk2IC0xMlpNMjkwIDQzMVEyNTcgNDMxIDIyOCA0MjBUMTc3IDM4OFQxMzkgMzM5VDExOCAyNzZINDQzUTQzOCAzNDcgMzk4IDM4OVQyOTAgNDMxWk0xODEgNTQ5UTE1OSA1NDkgMTU5IDU3MlExNTkgNTkwIDE3OSA2MTVUMjIzIDY2M1QyNjcgNzAzVDI5MCA3MTlRMjkyIDcxOSAzMTIgNzAzVDM1NyA2NjRUNDAwIDYxNVQ0MjAgNTcyUTQyMCA1NDkgMzk5IDU0OVEzODIgNTQ5IDM1OCA1NzRUMjg5IDY2MVEyNjYgNjMwIDI1MCA2MDlUMjIxIDU3NVQxOTkgNTU1VDE4MSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGdseXBoLW5hbWU9ImVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU2MSIgZD0iTTI5NiAtMTJRMjQyIC0xMiAxOTcgNlQxMTkgNTdUNjggMTM1VDUwIDIzNlE1MCAyOTAgNjggMzM2VDExOCA0MTZUMTk0IDQ2OVQyOTAgNDg4UTM0MCA0ODggMzgxIDQ3MVQ0NTEgNDIzVDQ5NiAzNDdUNTEyIDI0OFYyNDJRNTEyIDIyOCA1MDYgMjI0VDQ4NSAyMjBIMTE1UTExOCAxODAgMTMyIDE0OFQxNzEgOTRUMjI2IDU5VDI5NiA0NlEzMzEgNDYgMzU3IDUzVDQwMiA3MVQ0MzQgOThUNDU5IDEzMVE0NjAgMTMyIDQ2NiAxMzFUNDc5IDEyNlQ0OTEgMTE0VDQ5NyA5NFE0OTcgNzUgNDcxIDQ5UTQ0OCAyNiA0MDMgN1QyOTYgLTEyWk0yOTAgNDMxUTI1NyA0MzEgMjI4IDQyMFQxNzcgMzg4VDEzOSAzMzlUMTE4IDI3Nkg0NDNRNDM4IDM0NyAzOTggMzg5VDI5MCA0MzFaTTM3NSA1NDhRMzUyIDU0OCAzMzkgNTYxVDMyNSA1OTdRMzI1IDYyMCAzMzggNjMzVDM3MyA2NDZRMzk2IDY0NiA0MDkgNjMzVDQyMyA1OTdRNDIzIDU3NCA0MTAgNTYxVDM3NSA1NDhaTTIwNyA1NDhRMTg0IDU0OCAxNzEgNTYxVDE1NyA1OTdRMTU3IDYyMCAxNzAgNjMzVDIwNSA2NDZRMjI4IDY0NiAyNDEgNjMzVDI1NSA1OTdRMjU1IDU3NCAyNDIgNTYxVDIwNyA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQzsiIGdseXBoLW5hbWU9ImlncmF2ZSIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTg3IDQ0OVE4NyA0NjcgOTUgNDczVDExNiA0ODBIMTIzUTEzNiA0ODAgMTQ0IDQ3NFQxNTIgNDQ5VjBIODdWNDQ5Wk0xNzUgNTUxUTE3MyA1NDkgMTU3IDU1M1QxMTYgNTY2VDY0IDU4OVQxMSA2MjBRLTI2IDY0NSAtMjYgNjcwUS0yNiA2ODIgLTE3IDY4OVQ0IDY5N1EyNiA2OTcgNTAgNjc5UTc0IDY2MiA5NyA2NDFUMTM4IDYwMFQxNjYgNTY3VDE3NSA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRDsiIGdseXBoLW5hbWU9ImlhY3V0ZSIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTg3IDQ0OVE4NyA0NjcgOTUgNDczVDExNiA0ODBIMTIzUTEzNiA0ODAgMTQ0IDQ3NFQxNTIgNDQ5VjBIODdWNDQ5Wk03MyA1NTFRNzEgNTUzIDgxIDU2N1QxMTAgNjAwVDE1MSA2NDBUMTk4IDY3OVEyMjIgNjk3IDI0NCA2OTdRMjU2IDY5NyAyNjUgNjkwVDI3NCA2NzBRMjc0IDY0NSAyMzcgNjIwUTIxMiA2MDMgMTg0IDU4OVQxMzIgNTY2VDkyIDU1M1Q3MyA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRTsiIGdseXBoLW5hbWU9ImljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNODcgNDQ5UTg3IDQ2NyA5NSA0NzNUMTE2IDQ4MEgxMjNRMTM2IDQ4MCAxNDQgNDc0VDE1MiA0NDlWMEg4N1Y0NDlaTTE1IDU0OVEtNyA1NDkgLTcgNTcyUS03IDU5MCAxMyA2MTVUNTcgNjYzVDEwMSA3MDNUMTI0IDcxOVExMjYgNzE5IDE0NiA3MDNUMTkxIDY2NFQyMzQgNjE1VDI1NCA1NzJRMjU0IDU0OSAyMzMgNTQ5UTIxNiA1NDkgMTkyIDU3NFQxMjMgNjYxUTEwMCA2MzAgODQgNjA5VDU1IDU3NVQzMyA1NTVUMTUgNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUY7IiBnbHlwaC1uYW1lPSJpZGllcmVzaXMiIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik04NyA0NDlRODcgNDY3IDk1IDQ3M1QxMTYgNDgwSDEyM1ExMzYgNDgwIDE0NCA0NzRUMTUyIDQ0OVYwSDg3VjQ0OVpNMjA5IDU0OFExODYgNTQ4IDE3MyA1NjFUMTU5IDU5N1ExNTkgNjIwIDE3MiA2MzNUMjA3IDY0NlEyMzAgNjQ2IDI0MyA2MzNUMjU3IDU5N1EyNTcgNTc0IDI0NCA1NjFUMjA5IDU0OFpNNDEgNTQ4UTE4IDU0OCA1IDU2MVQtOSA1OTdRLTkgNjIwIDQgNjMzVDM5IDY0NlE2MiA2NDYgNzUgNjMzVDg5IDU5N1E4OSA1NzQgNzYgNTYxVDQxIDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYwOyIgZ2x5cGgtbmFtZT0ibnVsbCIgaG9yaXotYWR2LXg9IjU5NSIgZD0iTTIyMCA0OTFRMjA1IDQ4MiAxOTYgNDg0VDE4MSA0OThMMTc5IDUwMlExNzIgNTEzIDE3NCA1MjJUMTkyIDU0MEwyOTMgNTk1UTIxMSA2MzUgMTE4IDYzNVExMTUgNjM1IDExNSA2NDNUMTIwIDY2MlQxMzYgNjgxVDE2NyA2OTBRMjA3IDY5MCAyNTcgNjc1VDM1OCA2MjhMNDY0IDY4OVE0ODAgNjk4IDQ4OSA2OTZUNTA0IDY4Mkw1MDYgNjc5UTUxMyA2NjggNTExIDY1OVQ0OTIgNjQxTDQwNCA1OTNRNDMyIDU2OSA0NTYgNTM3VDQ5NyA0NjZUNTI1IDM3OVQ1MzUgMjc0UTUzNSAyMDYgNTE3IDE1M1Q0NjcgNjNUMzkwIDdUMjkwIC0xMlEyMzggLTEyIDE5NSAzVDEyMiA0OFQ3NSAxMThUNTggMjEzUTU4IDI2MyA3NSAzMDNUMTIzIDM3M1QxOTggNDE3VDI5NCA0MzNRMzIyIDQzMyAzNDggNDI3VDM5NyA0MDlUNDM4IDM4M1Q0NjggMzUzUTQ1NyA0MjMgNDI1IDQ3NVQzNDUgNTYzTDIyMCA0OTFaTTI5MSA0NVEzMzQgNDUgMzY3IDYxVDQyMiAxMDZUNDU2IDE3NFQ0NjggMjU4VjI4NlE0NTkgMzAyIDQ0MiAzMThUNDAzIDM0N1QzNTQgMzY4VDI5OSAzNzZRMjEzIDM3NiAxNjkgMzM0VDEyNCAyMTRRMTI0IDEzMiAxNjkgODlUMjkxIDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjE7IiBnbHlwaC1uYW1lPSJudGlsZGUiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik04MiA0NzNRODIgNDc1IDg4IDQ3N1QxMDQgNDgwUTEyMSA0ODAgMTMzIDQ2OFQxNDYgNDE3VjQwMlExNzEgNDQwIDIxMSA0NjRUMzA4IDQ4OFEzNTUgNDg4IDM5MCA0NzNUNDQ5IDQzMVQ0ODUgMzY0VDQ5NyAyNzhWMEg0MzJWMjc0UTQzMiAzNDYgMzk5IDM4NlQzMDQgNDI3UTI0OCA0MjcgMjA4IDM5OVQxNDcgMzI2VjBIODJWNDczWk0xNjMgNTU1UTEzOCA1NTUgMTM4IDU4MVExMzggNTk3IDE0MyA2MTNUMTU3IDY0MlQxNzkgNjYzVDIwNyA2NzFRMjMxIDY3MSAyNzEgNjUwVDM1NSA1OTFRMzU5IDYwNCAzNjQgNjE3VDM3NSA2NDBUMzg3IDY1N1Q0MDEgNjY0UTQyNiA2NjQgNDI2IDYzOFE0MjYgNjIxIDQyMSA2MDVUNDA3IDU3N1QzODUgNTU2VDM1NyA1NDhRMzMzIDU0OCAyOTMgNTY5VDIwOSA2MjhRMjA1IDYxNSAyMDAgNjAyVDE4OSA1NzlUMTc3IDU2MlQxNjMgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjI7IiBnbHlwaC1uYW1lPSJvZ3JhdmUiIGhvcml6LWFkdi14PSI1OTIiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDdUMTIwIDU5VDY5IDEzOVQ1MCAyMzlRNTAgMjkzIDY4IDMzOFQxMTkgNDE3VDE5NyA0NjlUMjk2IDQ4OFEzNDkgNDg4IDM5NCA0NjlUNDcxIDQxN1Q1MjIgMzM3VDU0MSAyMzdRNTQxIDE4MyA1MjMgMTM4VDQ3MiA1OVQzOTQgN1QyOTYgLTEyWk0yOTYgNDVRMzM0IDQ1IDM2NyA1OVQ0MjQgOTlUNDYxIDE2MFQ0NzUgMjM3UTQ3NSAyNzkgNDYyIDMxNFQ0MjQgMzc2VDM2OCA0MTZUMjk2IDQzMVEyNTcgNDMxIDIyNCA0MTdUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDBUMjI0IDYwVDI5NiA0NVpNMzUwIDU1MVEzNDggNTQ5IDMzMiA1NTNUMjkxIDU2NlQyMzkgNTg5VDE4NiA2MjBRMTQ5IDY0NSAxNDkgNjcwUTE0OSA2ODIgMTU4IDY4OVQxNzkgNjk3UTIwMSA2OTcgMjI1IDY3OVEyNDkgNjYyIDI3MiA2NDFUMzEzIDYwMFQzNDEgNTY3VDM1MCA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMzsiIGdseXBoLW5hbWU9Im9hY3V0ZSIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTI5NiAtMTJRMjQyIC0xMiAxOTcgN1QxMjAgNTlUNjkgMTM5VDUwIDIzOVE1MCAyOTMgNjggMzM4VDExOSA0MTdUMTk3IDQ2OVQyOTYgNDg4UTM0OSA0ODggMzk0IDQ2OVQ0NzEgNDE3VDUyMiAzMzdUNTQxIDIzN1E1NDEgMTgzIDUyMyAxMzhUNDcyIDU5VDM5NCA3VDI5NiAtMTJaTTI5NiA0NVEzMzQgNDUgMzY3IDU5VDQyNCA5OVQ0NjEgMTYwVDQ3NSAyMzdRNDc1IDI3OSA0NjIgMzE0VDQyNCAzNzZUMzY4IDQxNlQyOTYgNDMxUTI1NyA0MzEgMjI0IDQxN1QxNjcgMzc3VDEzMCAzMTZUMTE2IDIzOVExMTYgMTk3IDEyOSAxNjJUMTY3IDEwMFQyMjQgNjBUMjk2IDQ1Wk0yNDggNTUxUTI0NiA1NTMgMjU2IDU2N1QyODUgNjAwVDMyNiA2NDBUMzczIDY3OVEzOTcgNjk3IDQxOSA2OTdRNDMxIDY5NyA0NDAgNjkwVDQ0OSA2NzBRNDQ5IDY0NSA0MTIgNjIwUTM4NyA2MDMgMzU5IDU4OVQzMDcgNTY2VDI2NyA1NTNUMjQ4IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY0OyIgZ2x5cGgtbmFtZT0ib2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1OTIiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDdUMTIwIDU5VDY5IDEzOVQ1MCAyMzlRNTAgMjkzIDY4IDMzOFQxMTkgNDE3VDE5NyA0NjlUMjk2IDQ4OFEzNDkgNDg4IDM5NCA0NjlUNDcxIDQxN1Q1MjIgMzM3VDU0MSAyMzdRNTQxIDE4MyA1MjMgMTM4VDQ3MiA1OVQzOTQgN1QyOTYgLTEyWk0yOTYgNDVRMzM0IDQ1IDM2NyA1OVQ0MjQgOTlUNDYxIDE2MFQ0NzUgMjM3UTQ3NSAyNzkgNDYyIDMxNFQ0MjQgMzc2VDM2OCA0MTZUMjk2IDQzMVEyNTcgNDMxIDIyNCA0MTdUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDBUMjI0IDYwVDI5NiA0NVpNMTkwIDU0OVExNjggNTQ5IDE2OCA1NzJRMTY4IDU5MCAxODggNjE1VDIzMiA2NjNUMjc2IDcwM1QyOTkgNzE5UTMwMSA3MTkgMzIxIDcwM1QzNjYgNjY0VDQwOSA2MTVUNDI5IDU3MlE0MjkgNTQ5IDQwOCA1NDlRMzkxIDU0OSAzNjcgNTc0VDI5OCA2NjFRMjc1IDYzMCAyNTkgNjA5VDIzMCA1NzVUMjA4IDU1NVQxOTAgNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjU7IiBnbHlwaC1uYW1lPSJvdGlsZGUiIGhvcml6LWFkdi14PSI1OTIiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDdUMTIwIDU5VDY5IDEzOVQ1MCAyMzlRNTAgMjkzIDY4IDMzOFQxMTkgNDE3VDE5NyA0NjlUMjk2IDQ4OFEzNDkgNDg4IDM5NCA0NjlUNDcxIDQxN1Q1MjIgMzM3VDU0MSAyMzdRNTQxIDE4MyA1MjMgMTM4VDQ3MiA1OVQzOTQgN1QyOTYgLTEyWk0yOTYgNDVRMzM0IDQ1IDM2NyA1OVQ0MjQgOTlUNDYxIDE2MFQ0NzUgMjM3UTQ3NSAyNzkgNDYyIDMxNFQ0MjQgMzc2VDM2OCA0MTZUMjk2IDQzMVEyNTcgNDMxIDIyNCA0MTdUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDBUMjI0IDYwVDI5NiA0NVpNMTgxIDU1NVExNTYgNTU1IDE1NiA1ODFRMTU2IDU5NyAxNjEgNjEzVDE3NSA2NDJUMTk3IDY2M1QyMjUgNjcxUTI0OSA2NzEgMjg5IDY1MFQzNzMgNTkxUTM3NyA2MDQgMzgyIDYxN1QzOTMgNjQwVDQwNSA2NTdUNDE5IDY2NFE0NDQgNjY0IDQ0NCA2MzhRNDQ0IDYyMSA0MzkgNjA1VDQyNSA1NzdUNDAzIDU1NlQzNzUgNTQ4UTM1MSA1NDggMzExIDU2OVQyMjcgNjI4UTIyMyA2MTUgMjE4IDYwMlQyMDcgNTc5VDE5NSA1NjJUMTgxIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY2OyIgZ2x5cGgtbmFtZT0ib2RpZXJlc2lzIiBob3Jpei1hZHYteD0iNTkyIiBkPSJNMjk2IC0xMlEyNDIgLTEyIDE5NyA3VDEyMCA1OVQ2OSAxMzlUNTAgMjM5UTUwIDI5MyA2OCAzMzhUMTE5IDQxN1QxOTcgNDY5VDI5NiA0ODhRMzQ5IDQ4OCAzOTQgNDY5VDQ3MSA0MTdUNTIyIDMzN1Q1NDEgMjM3UTU0MSAxODMgNTIzIDEzOFQ0NzIgNTlUMzk0IDdUMjk2IC0xMlpNMjk2IDQ1UTMzNCA0NSAzNjcgNTlUNDI0IDk5VDQ2MSAxNjBUNDc1IDIzN1E0NzUgMjc5IDQ2MiAzMTRUNDI0IDM3NlQzNjggNDE2VDI5NiA0MzFRMjU3IDQzMSAyMjQgNDE3VDE2NyAzNzdUMTMwIDMxNlQxMTYgMjM5UTExNiAxOTcgMTI5IDE2MlQxNjcgMTAwVDIyNCA2MFQyOTYgNDVaTTM4NCA1NDhRMzYxIDU0OCAzNDggNTYxVDMzNCA1OTdRMzM0IDYyMCAzNDcgNjMzVDM4MiA2NDZRNDA1IDY0NiA0MTggNjMzVDQzMiA1OTdRNDMyIDU3NCA0MTkgNTYxVDM4NCA1NDhaTTIxNiA1NDhRMTkzIDU0OCAxODAgNTYxVDE2NiA1OTdRMTY2IDYyMCAxNzkgNjMzVDIxNCA2NDZRMjM3IDY0NiAyNTAgNjMzVDI2NCA1OTdRMjY0IDU3NCAyNTEgNTYxVDIxNiA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNzsiIGdseXBoLW5hbWU9ImRpdmlkZSIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTMwOSAzNzlRMjY1IDM3OSAyNjUgNDIzVjQzM1EyNjUgNDU0IDI3NiA0NjZUMzA5IDQ3OEgzMTlRMzQxIDQ3OCAzNTIgNDY2VDM2NCA0MzNWNDIzUTM2NCAzNzkgMzE5IDM3OUgzMDlaTTMwOSA1OVEyNjUgNTkgMjY1IDEwM1YxMTNRMjY1IDEzNCAyNzYgMTQ2VDMwOSAxNThIMzE5UTM0MSAxNTggMzUyIDE0NlQzNjQgMTEzVjEwM1EzNjQgNTkgMzE5IDU5SDMwOVpNMTMzIDIzOFExMTUgMjM4IDEwOSAyNDVUMTAyIDI2NVYyNzJRMTAyIDI4NSAxMDggMjkyVDEzMyAyOTlINDk2UTUxNCAyOTkgNTIwIDI5MlQ1MjcgMjcyVjI2NVE1MjcgMjUyIDUyMSAyNDVUNDk2IDIzOEgxMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGODsiIGdseXBoLW5hbWU9Im9zbGFzaCIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTg2IC0zNlE4NSAtMzcgODAgLTM2VDcwIC0zMFQ2MSAtMjBUNTYgLTZRNTYgMiA2MCAxM1Q3OCAzOEwxMTMgNzZRODcgMTA4IDczIDE0OVQ1OCAyMzdRNTggMjg5IDc3IDMzNVQxMjkgNDE1VDIwNiA0NjhUMzAwIDQ4OFEzNDIgNDg4IDM3OCA0NzZUNDQ1IDQ0MEw1MDkgNTExUTUxMCA1MTIgNTE1IDUxMVQ1MjUgNTA1VDUzNCA0OTVUNTM5IDQ4MVE1MzkgNDczIDUzNSA0NjJUNTE3IDQzN0w0ODUgNDAyUTUxMSAzNjkgNTI2IDMyOFQ1NDEgMjM5UTU0MSAxODYgNTIyIDE0MVQ0NzAgNjFUMzkzIDhUMjk5IC0xMlEyNTcgLTEyIDIyMCAxVDE1MiAzN0w4NiAtMzZaTTQwNCAzOTJRMzgyIDQwOSAzNTYgNDE5VDI5OSA0MjlRMjYxIDQyOSAyMjkgNDE1VDE3NCAzNzVUMTM3IDMxNFQxMjQgMjM4UTEyNCAyMDUgMTMzIDE3NlQxNTkgMTIyTDQwNCAzOTJaTTMwMCA0N1EzMzggNDcgMzcwIDYxVDQyNSAxMDFUNDYyIDE2MlQ0NzUgMjM4UTQ3NSAzMDUgNDM5IDM1NUwxOTMgODVRMjQwIDQ3IDMwMCA0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY5OyIgZ2x5cGgtbmFtZT0idWdyYXZlIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMjY3IC0xMlEyMjAgLTEyIDE4NSAzVDEyNiA0NVQ5MCAxMTJUNzggMTk4VjQ3NkgxNDNWMjAyUTE0MyAxMzAgMTc2IDkwVDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAxIDQ4NyAtMVQ0NzEgLTRRNDU0IC00IDQ0MiA4VDQyOSA1OVY3NFE0MDQgMzYgMzY0IDEyVDI2NyAtMTJaTTMzOCA1NTFRMzM2IDU0OSAzMjAgNTUzVDI3OSA1NjZUMjI3IDU4OVQxNzQgNjIwUTEzNyA2NDUgMTM3IDY3MFExMzcgNjgyIDE0NiA2ODlUMTY3IDY5N1ExODkgNjk3IDIxMyA2NzlRMjM3IDY2MiAyNjAgNjQxVDMwMSA2MDBUMzI5IDU2N1QzMzggNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkE7IiBnbHlwaC1uYW1lPSJ1YWN1dGUiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik0yNjcgLTEyUTIyMCAtMTIgMTg1IDNUMTI2IDQ1VDkwIDExMlQ3OCAxOThWNDc2SDE0M1YyMDJRMTQzIDEzMCAxNzYgOTBUMjcxIDQ5UTMyNyA0OSAzNjcgNzdUNDI4IDE1MFY0NzZINDkzVjNRNDkzIDEgNDg3IC0xVDQ3MSAtNFE0NTQgLTQgNDQyIDhUNDI5IDU5Vjc0UTQwNCAzNiAzNjQgMTJUMjY3IC0xMlpNMjQ2IDU1MVEyNDQgNTUzIDI1NCA1NjdUMjgzIDYwMFQzMjQgNjQwVDM3MSA2NzlRMzk1IDY5NyA0MTcgNjk3UTQyOSA2OTcgNDM4IDY5MFQ0NDcgNjcwUTQ0NyA2NDUgNDEwIDYyMFEzODUgNjAzIDM1NyA1ODlUMzA1IDU2NlQyNjUgNTUzVDI0NiA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGdseXBoLW5hbWU9InVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMjY3IC0xMlEyMjAgLTEyIDE4NSAzVDEyNiA0NVQ5MCAxMTJUNzggMTk4VjQ3NkgxNDNWMjAyUTE0MyAxMzAgMTc2IDkwVDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAxIDQ4NyAtMVQ0NzEgLTRRNDU0IC00IDQ0MiA4VDQyOSA1OVY3NFE0MDQgMzYgMzY0IDEyVDI2NyAtMTJaTTE4MCA1NDlRMTU4IDU0OSAxNTggNTcyUTE1OCA1OTAgMTc4IDYxNVQyMjIgNjYzVDI2NiA3MDNUMjg5IDcxOVEyOTEgNzE5IDMxMSA3MDNUMzU2IDY2NFQzOTkgNjE1VDQxOSA1NzJRNDE5IDU0OSAzOTggNTQ5UTM4MSA1NDkgMzU3IDU3NFQyODggNjYxUTI2NSA2MzAgMjQ5IDYwOVQyMjAgNTc1VDE5OCA1NTVUMTgwIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZDOyIgZ2x5cGgtbmFtZT0idWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMjY3IC0xMlEyMjAgLTEyIDE4NSAzVDEyNiA0NVQ5MCAxMTJUNzggMTk4VjQ3NkgxNDNWMjAyUTE0MyAxMzAgMTc2IDkwVDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAxIDQ4NyAtMVQ0NzEgLTRRNDU0IC00IDQ0MiA4VDQyOSA1OVY3NFE0MDQgMzYgMzY0IDEyVDI2NyAtMTJaTTM3NSA1NDhRMzUyIDU0OCAzMzkgNTYxVDMyNSA1OTdRMzI1IDYyMCAzMzggNjMzVDM3MyA2NDZRMzk2IDY0NiA0MDkgNjMzVDQyMyA1OTdRNDIzIDU3NCA0MTAgNTYxVDM3NSA1NDhaTTIwNyA1NDhRMTg0IDU0OCAxNzEgNTYxVDE1NyA1OTdRMTU3IDYyMCAxNzAgNjMzVDIwNSA2NDZRMjI4IDY0NiAyNDEgNjMzVDI1NSA1OTdRMjU1IDU3NCAyNDIgNTYxVDIwNyA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRDsiIGdseXBoLW5hbWU9InlhY3V0ZSIgaG9yaXotYWR2LXg9IjUwMiIgZD0iTTE5OCAtMTk3UTE4NCAtMTk3IDE3NCAtMTkwVDE2NCAtMTgwTDI0NCAyNFEyMjcgMjQgMjE5IDI5VDIwNCA0OUwyNCA0NzZIOTJMMjYyIDY1TDQxMCA0NzZINDc5TDI0NCAtMTU0UTIzNCAtMTgwIDIyMyAtMTg4VDE5OCAtMTk3Wk0yMDAgNTQxUTE5OCA1NDMgMjA4IDU1N1QyMzcgNTkwVDI3OCA2MzBUMzI1IDY2OVEzNDkgNjg3IDM3MSA2ODdRMzgzIDY4NyAzOTIgNjgwVDQwMSA2NjBRNDAxIDYzNSAzNjQgNjEwUTMzOSA1OTMgMzExIDU3OVQyNTkgNTU2VDIxOSA1NDNUMjAwIDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZFOyIgZ2x5cGgtbmFtZT0idGhvcm4iIGhvcml6LWFkdi14PSI2MDkiIGQ9Ik0zMjAgLTEyUTI4OCAtMTIgMjYxIC01VDIxMiAxNlQxNzQgNDVUMTQ3IDc5Vi0xNjZRMTQ3IC0xODQgMTM5IC0xOTBUMTE4IC0xOTdIMTExUTk4IC0xOTcgOTAgLTE5MVQ4MiAtMTY2VjY3NFE4MiA2NzYgODggNjc4VDEwNCA2ODFRMTIxIDY4MSAxMzQgNjY5VDE0NyA2MThWMzk4UTE3OSA0NDEgMjIxIDQ2NFQzMjQgNDg4UTM3MSA0ODggNDEyIDQ3MVQ0ODMgNDIxVDUzMSAzNDJUNTQ5IDIzOVE1NDkgMTgzIDUzMiAxMzdUNDg0IDU3VDQxMSA2VDMyMCAtMTJaTTMxNSA0NVEzNTMgNDUgMzg0IDU5VDQzNyA5OFQ0NzEgMTU5VDQ4MyAyMzhRNDgzIDI4MCA0NzEgMzE1VDQzNiAzNzZUMzg0IDQxNlQzMTcgNDMxUTI1NCA0MzEgMjEyIDQwMVQxNDcgMzIwVjE4OVExNTAgMTU4IDE2NSAxMzJUMjAyIDg2VDI1NCA1NlQzMTUgNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRjsiIGdseXBoLW5hbWU9InlkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjUwMiIgZD0iTTE5OCAtMTk3UTE4NCAtMTk3IDE3NCAtMTkwVDE2NCAtMTgwTDI0NCAyNFEyMjcgMjQgMjE5IDI5VDIwNCA0OUwyNCA0NzZIOTJMMjYyIDY1TDQxMCA0NzZINDc5TDI0NCAtMTU0UTIzNCAtMTgwIDIyMyAtMTg4VDE5OCAtMTk3Wk0zNDAgNTQ4UTMxNyA1NDggMzA0IDU2MVQyOTAgNTk3UTI5MCA2MjAgMzAzIDYzM1QzMzggNjQ2UTM2MSA2NDYgMzc0IDYzM1QzODggNTk3UTM4OCA1NzQgMzc1IDU2MVQzNDAgNTQ4Wk0xNzIgNTQ4UTE0OSA1NDggMTM2IDU2MVQxMjIgNTk3UTEyMiA2MjAgMTM1IDYzM1QxNzAgNjQ2UTE5MyA2NDYgMjA2IDYzM1QyMjAgNTk3UTIyMCA1NzQgMjA3IDU2MVQxNzIgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAwOyIgZ2x5cGgtbmFtZT0iQW1hY3JvbiIgaG9yaXotYWR2LXg9IjYzOSIgZD0iTTI2OCA2MjhRMjczIDY0MSAyODQgNjQ3VDMxOSA2NTNRMzQzIDY1MyAzNTQgNjQ3VDM3MCA2MjhMNjEzIDBINTM3TDQ1NiAyMTFIMTc5TDk4IDBIMjVMMjY4IDYyOFpNNDM0IDI3MUwzMTggNTc2TDIwMSAyNzFINDM0Wk0yMTUgNzM5UTE3NiA3MzkgMTc2IDc2OFY3NzNRMTc2IDc4NyAxODYgNzk0VDIxNSA4MDFINDIzUTQ2MiA4MDEgNDYyIDc3M1Y3NjhRNDYyIDczOSA0MjMgNzM5SDIxNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMTsiIGdseXBoLW5hbWU9ImFtYWNyb24iIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0yMTYgLTExUTEzOCAtMTEgOTUgMjVUNTIgMTIyUTUyIDIwNiAxMzQgMjQzVDM4MyAyODRIMzkzVjMwMVEzOTMgMzYzIDM1OSAzOTVUMjU5IDQyOFEyMDEgNDI4IDE2NCA0MDNUMTA3IDM0MFExMDcgMzQwIDEwMSAzNDFUODkgMzQ1VDc2IDM1N1Q3MCAzNzhRNzAgMzg3IDc3IDQwMFQ5NiA0MjZRMTE5IDQ0OSAxNjEgNDY4VDI2NCA0ODhRMzU1IDQ4OCA0MDYgNDM5VDQ1NyAzMDNWMEgzOTRWNzNRMzY2IDM0IDMyMCAxMlQyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODZUMzgwIDEzMlQzOTMgMTg5VjIzM0gzODBRMjQ2IDIyOCAxODIgMjA0VDExOCAxMjJRMTE4IDg2IDE0NSA2NVQyMjIgNDNaTTE3MyA1NjhRMTM0IDU2OCAxMzQgNTk3VjYwMlExMzQgNjE2IDE0NCA2MjNUMTczIDYzMEgzODFRNDIwIDYzMCA0MjAgNjAyVjU5N1E0MjAgNTY4IDM4MSA1NjhIMTczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAyOyIgZ2x5cGgtbmFtZT0iQWJyZXZlIiBob3Jpei1hZHYteD0iNjM5IiBkPSJNMjY4IDYyOFEyNzMgNjQxIDI4NCA2NDdUMzE5IDY1M1EzNDMgNjUzIDM1NCA2NDdUMzcwIDYyOEw2MTMgMEg1MzdMNDU2IDIxMUgxNzlMOTggMEgyNUwyNjggNjI4Wk00MzQgMjcxTDMxOCA1NzZMMjAxIDI3MUg0MzRaTTMyMCA3MTlRMjk5IDcxOSAyNzQgNzMwVDIyOCA3NTdUMTkzIDc5MVQxNzkgODI0UTE3OSA4NTMgMjA4IDg1M1EyMTUgODUzIDIyOCA4NDRUMjU2IDgyMlQyODggNzkyVDMyMiA3NjJRMzM3IDc3NiAzNTMgNzkyVDM4NCA4MjFUNDExIDg0NFQ0MzIgODUzUTQ2MSA4NTMgNDYxIDgyNFE0NjEgODA5IDQ0NyA3OTFUNDExIDc1NlQzNjUgNzMwVDMyMCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDM7IiBnbHlwaC1uYW1lPSJhYnJldmUiIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0yMTYgLTExUTEzOCAtMTEgOTUgMjVUNTIgMTIyUTUyIDIwNiAxMzQgMjQzVDM4MyAyODRIMzkzVjMwMVEzOTMgMzYzIDM1OSAzOTVUMjU5IDQyOFEyMDEgNDI4IDE2NCA0MDNUMTA3IDM0MFExMDcgMzQwIDEwMSAzNDFUODkgMzQ1VDc2IDM1N1Q3MCAzNzhRNzAgMzg3IDc3IDQwMFQ5NiA0MjZRMTE5IDQ0OSAxNjEgNDY4VDI2NCA0ODhRMzU1IDQ4OCA0MDYgNDM5VDQ1NyAzMDNWMEgzOTRWNzNRMzY2IDM0IDMyMCAxMlQyMTYgLTExWk0yMjIgNDNRMjU5IDQzIDI5MCA1NFQzNDQgODZUMzgwIDEzMlQzOTMgMTg5VjIzM0gzODBRMjQ2IDIyOCAxODIgMjA0VDExOCAxMjJRMTE4IDg2IDE0NSA2NVQyMjIgNDNaTTI3NCA1NDhRMjUzIDU0OCAyMjggNTU5VDE4MiA1ODZUMTQ3IDYyMFQxMzMgNjUzUTEzMyA2ODIgMTYyIDY4MlExNjkgNjgyIDE4MiA2NzNUMjEwIDY1MVQyNDIgNjIxVDI3NiA1OTFRMjkxIDYwNSAzMDcgNjIxVDMzOCA2NTBUMzY1IDY3M1QzODYgNjgyUTQxNSA2ODIgNDE1IDY1M1E0MTUgNjM4IDQwMSA2MjBUMzY1IDU4NVQzMTkgNTU5VDI3NCA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDQ7IiBnbHlwaC1uYW1lPSJBb2dvbmVrIiBob3Jpei1hZHYteD0iNjM5IiBkPSJNMjY4IDYyOFEyNzMgNjQxIDI4NCA2NDdUMzE5IDY1M1EzNDMgNjUzIDM1NCA2NDdUMzcwIDYyOEw2MTMgMEg1OTFRNTQ4IC0zMiA1MzQgLTU1VDUxOSAtOThRNTE5IC0xMTUgNTI5IC0xMjVUNTUzIC0xMzZRNTc5IC0xMzYgNTkyIC0xMTVRNjAzIC0xMTUgNjEzIC0xMjNUNjI0IC0xNDlRNjI0IC0xNjkgNjA0IC0xODFUNTUyIC0xOTNRNTEwIC0xOTMgNDg1IC0xNzFUNDU5IC0xMTFRNDU5IC04MiA0NzcgLTUzVDUzNiAzTDQ1NiAyMTFIMTc5TDk4IDBIMjVMMjY4IDYyOFpNNDM0IDI3MUwzMTggNTc2TDIwMSAyNzFINDM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA1OyIgZ2x5cGgtbmFtZT0iYW9nb25layIgaG9yaXotYWR2LXg9IjUzNSIgZD0iTTIxNiAtMTFRMTM4IC0xMSA5NSAyNVQ1MiAxMjJRNTIgMjA2IDEzNCAyNDNUMzgzIDI4NEgzOTNWMzAxUTM5MyAzNjMgMzU5IDM5NVQyNTkgNDI4UTIwMSA0MjggMTY0IDQwM1QxMDcgMzQwUTEwNyAzNDAgMTAxIDM0MVQ4OSAzNDVUNzYgMzU3VDcwIDM3OFE3MCAzODcgNzcgNDAwVDk2IDQyNlExMTkgNDQ5IDE2MSA0NjhUMjY0IDQ4OFEzNTUgNDg4IDQwNiA0MzlUNDU3IDMwM1YwSDQ1M1E0MDYgLTM0IDM5MSAtNThUMzc1IC0xMDNRMzc1IC0xMjAgMzg1IC0xMzBUNDA5IC0xNDFRNDM1IC0xNDEgNDQ4IC0xMjBRNDU5IC0xMjAgNDY5IC0xMjhUNDgwIC0xNTRRNDgwIC0xNzQgNDYwIC0xODZUNDA4IC0xOThRMzY2IC0xOTggMzQxIC0xNzZUMzE1IC0xMTZRMzE1IC04NyAzMzMgLTU3VDM5NCAwVjczUTM2NiAzNCAzMjAgMTJUMjE2IC0xMVpNMjIyIDQzUTI1OSA0MyAyOTAgNTRUMzQ0IDg2VDM4MCAxMzJUMzkzIDE4OVYyMzNIMzgwUTI0NiAyMjggMTgyIDIwNFQxMTggMTIyUTExOCA4NiAxNDUgNjVUMjIyIDQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA2OyIgZ2x5cGgtbmFtZT0iQ2FjdXRlIiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMzg2IC0xMlEzMTUgLTEyIDI1NiAxMlQxNTUgODFUODkgMTg2VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODkgNjU5UTQyOCA2NTkgNDYxIDY1MlQ1MjAgNjM0VDU2NyA2MDlUNjAyIDU4MVE2MzAgNTUzIDYzMCA1MzFRNjMwIDUxOCA2MjQgNTEwVDYxMSA0OTdUNTk3IDQ5MVQ1OTAgNDkwUTU3NSA1MTcgNTUyIDUzN1Q1MDIgNTcyVDQ0NiA1OTNUMzg3IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2NCAxNTQgMjEzVDIwNyAxMjVUMjg3IDY4VDM4OSA0N1E0MjUgNDcgNDU4IDU2VDUxOCA4MVQ1NjYgMTIxVDU5OCAxNzRRNTk4IDE3NSA2MDUgMTc0VDYyMCAxNjlUNjM1IDE1NlQ2NDIgMTM0UTY0MiAxMjIgNjMyIDEwNFQ2MDQgNjhRNTc0IDM4IDUxOSAxM1QzODYgLTEyWk0zMzkgNzIyUTMzNyA3MjQgMzQ3IDczOFQzNzYgNzcxVDQxNyA4MTFUNDY0IDg1MFE0ODggODY4IDUxMCA4NjhRNTIyIDg2OCA1MzEgODYxVDU0MCA4NDFRNTQwIDgxNiA1MDMgNzkxUTQ3OCA3NzQgNDUwIDc2MFQzOTggNzM3VDM1OCA3MjRUMzM5IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNzsiIGdseXBoLW5hbWU9ImNhY3V0ZSIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTI5NSAtMTJRMjQyIC0xMiAxOTggN1QxMjAgNTlUNjkgMTM5VDUwIDIzOVE1MCAyOTMgNjggMzM4VDEyMCA0MTdUMTk3IDQ2OVQyOTUgNDg4UTM1NiA0ODggMzk3IDQ2OVQ0NjUgNDI0UTQ4MiA0MDcgNDkxIDM4OVQ1MDAgMzU2UTUwMCAzNDUgNDk0IDMzOVQ0NzkgMzI5VDQ2NSAzMjRUNDU3IDMyNVE0NDggMzQ3IDQzNCAzNjZUNDAxIDM5OVQzNTUgNDIyVDI5NSA0MzBRMjU3IDQzMCAyMjQgNDE2VDE2NyAzNzdUMTMwIDMxNlQxMTYgMjM5UTExNiAxOTcgMTI5IDE2MlQxNjcgMTAxVDIyMyA2MVQyOTUgNDZRMzI5IDQ2IDM1NSA1NFQ0MDAgNzZUNDM0IDExMFQ0NTcgMTUxUTQ1OCAxNTIgNDY0IDE1MlQ0NzkgMTQ4VDQ5MyAxMzhUNTAwIDEyMFE1MDAgMTA2IDQ5MSA4OFQ0NjMgNTBRNDM4IDI1IDM5NyA3VDI5NSAtMTJaTTI0NCA1NTFRMjQyIDU1MyAyNTIgNTY3VDI4MSA2MDBUMzIyIDY0MFQzNjkgNjc5UTM5MyA2OTcgNDE1IDY5N1E0MjcgNjk3IDQzNiA2OTBUNDQ1IDY3MFE0NDUgNjQ1IDQwOCA2MjBRMzgzIDYwMyAzNTUgNTg5VDMwMyA1NjZUMjYzIDU1M1QyNDQgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA4OyIgZ2x5cGgtbmFtZT0iQ2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik0zODYgLTEyUTMxNSAtMTIgMjU2IDEyVDE1NSA4MVQ4OSAxODZUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OSA2NTlRNDI4IDY1OSA0NjEgNjUyVDUyMCA2MzRUNTY3IDYwOVQ2MDIgNTgxUTYzMCA1NTMgNjMwIDUzMVE2MzAgNTE4IDYyNCA1MTBUNjExIDQ5N1Q1OTcgNDkxVDU5MCA0OTBRNTc1IDUxNyA1NTIgNTM3VDUwMiA1NzJUNDQ2IDU5M1QzODcgNjAwUTMzMSA2MDAgMjg1IDU4MFQyMDYgNTIzVDE1NCA0MzZUMTM1IDMyNFExMzUgMjY0IDE1NCAyMTNUMjA3IDEyNVQyODcgNjhUMzg5IDQ3UTQyNSA0NyA0NTggNTZUNTE4IDgxVDU2NiAxMjFUNTk4IDE3NFE1OTggMTc1IDYwNSAxNzRUNjIwIDE2OVQ2MzUgMTU2VDY0MiAxMzRRNjQyIDEyMiA2MzIgMTA0VDYwNCA2OFE1NzQgMzggNTE5IDEzVDM4NiAtMTJaTTI2NiA3MjBRMjQ0IDcyMCAyNDQgNzQzUTI0NCA3NjEgMjY0IDc4NlQzMDggODM0VDM1MiA4NzRUMzc1IDg5MFEzNzcgODkwIDM5NyA4NzRUNDQyIDgzNVQ0ODUgNzg2VDUwNSA3NDNRNTA1IDcyMCA0ODQgNzIwUTQ2NyA3MjAgNDQzIDc0NVQzNzQgODMyUTM1MSA4MDEgMzM1IDc4MFQzMDYgNzQ2VDI4NCA3MjZUMjY2IDcyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwOTsiIGdseXBoLW5hbWU9ImNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTQ4IiBkPSJNMjk1IC0xMlEyNDIgLTEyIDE5OCA3VDEyMCA1OVQ2OSAxMzlUNTAgMjM5UTUwIDI5MyA2OCAzMzhUMTIwIDQxN1QxOTcgNDY5VDI5NSA0ODhRMzU2IDQ4OCAzOTcgNDY5VDQ2NSA0MjRRNDgyIDQwNyA0OTEgMzg5VDUwMCAzNTZRNTAwIDM0NSA0OTQgMzM5VDQ3OSAzMjlUNDY1IDMyNFQ0NTcgMzI1UTQ0OCAzNDcgNDM0IDM2NlQ0MDEgMzk5VDM1NSA0MjJUMjk1IDQzMFEyNTcgNDMwIDIyNCA0MTZUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDFUMjIzIDYxVDI5NSA0NlEzMjkgNDYgMzU1IDU0VDQwMCA3NlQ0MzQgMTEwVDQ1NyAxNTFRNDU4IDE1MiA0NjQgMTUyVDQ3OSAxNDhUNDkzIDEzOFQ1MDAgMTIwUTUwMCAxMDYgNDkxIDg4VDQ2MyA1MFE0MzggMjUgMzk3IDdUMjk1IC0xMlpNMTk1IDU0OVExNzMgNTQ5IDE3MyA1NzJRMTczIDU5MCAxOTMgNjE1VDIzNyA2NjNUMjgxIDcwM1QzMDQgNzE5UTMwNiA3MTkgMzI2IDcwM1QzNzEgNjY0VDQxNCA2MTVUNDM0IDU3MlE0MzQgNTQ5IDQxMyA1NDlRMzk2IDU0OSAzNzIgNTc0VDMwMyA2NjFRMjgwIDYzMCAyNjQgNjA5VDIzNSA1NzVUMjEzIDU1NVQxOTUgNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBBOyIgZ2x5cGgtbmFtZT0iQ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjY5MCIgZD0iTTM4NiAtMTJRMzE1IC0xMiAyNTYgMTJUMTU1IDgxVDg5IDE4NlQ2NSAzMjJRNjUgMzk2IDg5IDQ1OFQxNTUgNTY0VDI1NyA2MzRUMzg5IDY1OVE0MjggNjU5IDQ2MSA2NTJUNTIwIDYzNFQ1NjcgNjA5VDYwMiA1ODFRNjMwIDU1MyA2MzAgNTMxUTYzMCA1MTggNjI0IDUxMFQ2MTEgNDk3VDU5NyA0OTFUNTkwIDQ5MFE1NzUgNTE3IDU1MiA1MzdUNTAyIDU3MlQ0NDYgNTkzVDM4NyA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNiA1MjNUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjQgMTU0IDIxM1QyMDcgMTI1VDI4NyA2OFQzODkgNDdRNDI1IDQ3IDQ1OCA1NlQ1MTggODFUNTY2IDEyMVQ1OTggMTc0UTU5OCAxNzUgNjA1IDE3NFQ2MjAgMTY5VDYzNSAxNTZUNjQyIDEzNFE2NDIgMTIyIDYzMiAxMDRUNjA0IDY4UTU3NCAzOCA1MTkgMTNUMzg2IC0xMlpNMzg0IDcyMFEzNTggNzIwIDM0NCA3MzRUMzI5IDc3MlEzMjkgNzk1IDM0NCA4MDlUMzg1IDgyNFE0MTAgODI0IDQyNCA4MTBUNDM5IDc3MlE0MzkgNzQ5IDQyNSA3MzVUMzg0IDcyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQjsiIGdseXBoLW5hbWU9ImNkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik0yOTUgLTEyUTI0MiAtMTIgMTk4IDdUMTIwIDU5VDY5IDEzOVQ1MCAyMzlRNTAgMjkzIDY4IDMzOFQxMjAgNDE3VDE5NyA0NjlUMjk1IDQ4OFEzNTYgNDg4IDM5NyA0NjlUNDY1IDQyNFE0ODIgNDA3IDQ5MSAzODlUNTAwIDM1NlE1MDAgMzQ1IDQ5NCAzMzlUNDc5IDMyOVQ0NjUgMzI0VDQ1NyAzMjVRNDQ4IDM0NyA0MzQgMzY2VDQwMSAzOTlUMzU1IDQyMlQyOTUgNDMwUTI1NyA0MzAgMjI0IDQxNlQxNjcgMzc3VDEzMCAzMTZUMTE2IDIzOVExMTYgMTk3IDEyOSAxNjJUMTY3IDEwMVQyMjMgNjFUMjk1IDQ2UTMyOSA0NiAzNTUgNTRUNDAwIDc2VDQzNCAxMTBUNDU3IDE1MVE0NTggMTUyIDQ2NCAxNTJUNDc5IDE0OFQ0OTMgMTM4VDUwMCAxMjBRNTAwIDEwNiA0OTEgODhUNDYzIDUwUTQzOCAyNSAzOTcgN1QyOTUgLTEyWk0zMDkgNTQ5UTI4MyA1NDkgMjY5IDU2M1QyNTQgNjAxUTI1NCA2MjQgMjY5IDYzOFQzMTAgNjUzUTMzNSA2NTMgMzQ5IDYzOVQzNjQgNjAxUTM2NCA1NzggMzUwIDU2NFQzMDkgNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBDOyIgZ2x5cGgtbmFtZT0iQ2Nhcm9uIiBob3Jpei1hZHYteD0iNjkwIiBkPSJNMzg2IC0xMlEzMTUgLTEyIDI1NiAxMlQxNTUgODFUODkgMTg2VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODkgNjU5UTQyOCA2NTkgNDYxIDY1MlQ1MjAgNjM0VDU2NyA2MDlUNjAyIDU4MVE2MzAgNTUzIDYzMCA1MzFRNjMwIDUxOCA2MjQgNTEwVDYxMSA0OTdUNTk3IDQ5MVQ1OTAgNDkwUTU3NSA1MTcgNTUyIDUzN1Q1MDIgNTcyVDQ0NiA1OTNUMzg3IDYwMFEzMzEgNjAwIDI4NSA1ODBUMjA2IDUyM1QxNTQgNDM2VDEzNSAzMjRRMTM1IDI2NCAxNTQgMjEzVDIwNyAxMjVUMjg3IDY4VDM4OSA0N1E0MjUgNDcgNDU4IDU2VDUxOCA4MVQ1NjYgMTIxVDU5OCAxNzRRNTk4IDE3NSA2MDUgMTc0VDYyMCAxNjlUNjM1IDE1NlQ2NDIgMTM0UTY0MiAxMjIgNjMyIDEwNFQ2MDQgNjhRNTc0IDM4IDUxOSAxM1QzODYgLTEyWk00OTkgODc0UTUyMCA4NzQgNTIwIDg1MVE1MjAgODMzIDUwMSA4MDhUNDU3IDc2MFQ0MTMgNzIwVDM5MCA3MDRRMzg4IDcwNCAzNjggNzIwVDMyMyA3NTlUMjgwIDgwOFQyNjAgODUxUTI2MCA4NzQgMjgxIDg3NFEyOTggODc0IDMyMiA4NDlUMzkxIDc2MlE0MzUgODIzIDQ1OCA4NDhUNDk5IDg3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRDsiIGdseXBoLW5hbWU9ImNjYXJvbiIgaG9yaXotYWR2LXg9IjU0OCIgZD0iTTI5NSAtMTJRMjQyIC0xMiAxOTggN1QxMjAgNTlUNjkgMTM5VDUwIDIzOVE1MCAyOTMgNjggMzM4VDEyMCA0MTdUMTk3IDQ2OVQyOTUgNDg4UTM1NiA0ODggMzk3IDQ2OVQ0NjUgNDI0UTQ4MiA0MDcgNDkxIDM4OVQ1MDAgMzU2UTUwMCAzNDUgNDk0IDMzOVQ0NzkgMzI5VDQ2NSAzMjRUNDU3IDMyNVE0NDggMzQ3IDQzNCAzNjZUNDAxIDM5OVQzNTUgNDIyVDI5NSA0MzBRMjU3IDQzMCAyMjQgNDE2VDE2NyAzNzdUMTMwIDMxNlQxMTYgMjM5UTExNiAxOTcgMTI5IDE2MlQxNjcgMTAxVDIyMyA2MVQyOTUgNDZRMzI5IDQ2IDM1NSA1NFQ0MDAgNzZUNDM0IDExMFQ0NTcgMTUxUTQ1OCAxNTIgNDY0IDE1MlQ0NzkgMTQ4VDQ5MyAxMzhUNTAwIDEyMFE1MDAgMTA2IDQ5MSA4OFQ0NjMgNTBRNDM4IDI1IDM5NyA3VDI5NSAtMTJaTTQxMyA3MDNRNDM0IDcwMyA0MzQgNjgwUTQzNCA2NjIgNDE1IDYzN1QzNzEgNTg5VDMyNyA1NDlUMzA0IDUzM1EzMDIgNTMzIDI4MiA1NDlUMjM3IDU4OFQxOTQgNjM3VDE3NCA2ODBRMTc0IDcwMyAxOTUgNzAzUTIxMiA3MDMgMjM2IDY3OFQzMDUgNTkxUTM0OSA2NTIgMzcyIDY3N1Q0MTMgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBFOyIgZ2x5cGgtbmFtZT0iRGNhcm9uIiBob3Jpei1hZHYteD0iNzAyIiBkPSJNOTIgNjA5UTkyIDYyNSAxMDMgNjM2VDEzMCA2NDdIMjgzUTM2NyA2NDcgNDMyIDYyNVQ1NDMgNTYyVDYxMyA0NjFUNjM3IDMyNVE2MzcgMjQ4IDYxMyAxODhUNTQyIDg2VDQyOSAyMlQyNzggMEg5MlY2MDlaTTI4MiA2MFE0MTkgNjAgNDkzIDEyOFQ1NjcgMzIzUTU2NyAzODUgNTQ4IDQzNFQ0OTIgNTE3VDQwMyA1NjlUMjgzIDU4N0gxNjBWNjBIMjgyWk00MzAgODc0UTQ1MSA4NzQgNDUxIDg1MVE0NTEgODMzIDQzMiA4MDhUMzg4IDc2MFQzNDQgNzIwVDMyMSA3MDRRMzE5IDcwNCAyOTkgNzIwVDI1NCA3NTlUMjExIDgwOFQxOTEgODUxUTE5MSA4NzQgMjEyIDg3NFEyMjkgODc0IDI1MyA4NDlUMzIyIDc2MlEzNjYgODIzIDM4OSA4NDhUNDMwIDg3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRjsiIGdseXBoLW5hbWU9ImRjYXJvbiIgaG9yaXotYWR2LXg9Ijc3MiIgZD0iTTI3NSAtMTJRMjI4IC0xMiAxODcgNVQxMTYgNTVUNjggMTM0VDUwIDIzN1E1MCAyOTMgNjcgMzM5VDExNSA0MTlUMTg3IDQ3MFQyNzkgNDg4UTM0MyA0ODggMzg3IDQ2NFQ0NTIgNDA5VjY3NFE0NTIgNjc2IDQ1OCA2NzhUNDc0IDY4MVE0OTEgNjgxIDUwNCA2NjlUNTE3IDYxOFYwSDQ1M1Y3NFE0MjEgMzIgMzc4IDEwVDI3NSAtMTJaTTI4MiA0NVEzMTUgNDUgMzQ2IDU3VDQwMSA5MFQ0MzkgMTQxVDQ1MyAyMDVWMzE5UTQzMCAzNzEgMzg5IDQwMVQyODQgNDMxUTI0NiA0MzEgMjE1IDQxN1QxNjIgMzc4VDEyOCAzMTdUMTE2IDIzOFExMTYgMTk2IDEyOCAxNjFUMTYzIDEwMFQyMTUgNjBUMjgyIDQ1Wk02MzggNDU5UTYzNiA0NTUgNjMwIDQ1NFQ2MTcgNDU0VDYwNiA0NjFUNjA1IDQ3NEw2NjUgNjUyUTY3MiA2NzAgNjc4IDY3OVQ3MDQgNjg4SDcwOVE3MjEgNjg4IDczMCA2NzlUNzM5IDY1MlY2NDlRNzM5IDYyNyA3MjMgNjAwTDYzOCA0NTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTA7IiBnbHlwaC1uYW1lPSJEY3JvYXQiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik02MiAyOTRRNDQgMjk0IDM4IDMwMVQzMSAzMjFWMzI3UTMxIDM0MCAzNyAzNDdUNjIgMzU0SDEyN1Y2MDlRMTI3IDYyNSAxMzggNjM2VDE2NSA2NDdIMzIzUTQwNiA2NDcgNDcyIDYyNVQ1ODUgNTYyVDY1NyA0NjBUNjgyIDMyNVE2ODIgMjQ5IDY1NyAxODlUNTg0IDg3VDQ2OSAyM1QzMTggMEgxNjVRMTQ5IDAgMTM4IDExVDEyNyAzOFYyOTRINjJaTTMyNyA2MlE0NjYgNjIgNTM5IDEzMFQ2MTMgMzIzUTYxMyA0NDcgNTM5IDUxNlQzMjggNTg1SDE5NVYzNTRINDA5UTQyNyAzNTQgNDMzIDM0N1Q0NDAgMzI3VjMyMVE0NDAgMzA4IDQzNCAzMDFUNDA5IDI5NEgxOTVWNjJIMzI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTExOyIgZ2x5cGgtbmFtZT0iZGNyb2F0IiBob3Jpei1hZHYteD0iNTk5IiBkPSJNMjc1IC0xMlEyMjggLTEyIDE4NyA1VDExNiA1NVQ2OCAxMzRUNTAgMjM3UTUwIDI5MyA2NyAzMzlUMTE1IDQxOVQxODcgNDcwVDI3OSA0ODhRMzQzIDQ4OCAzODcgNDY0VDQ1MiA0MDlWNTMzSDM2MFEzMjEgNTMzIDMyMSA1NjFWNTY2UTMyMSA1OTUgMzYwIDU5NUg0NTJWNjc0UTQ1MiA2NzYgNDU4IDY3OFQ0NzQgNjgxUTQ5MSA2ODEgNTA0IDY2OVQ1MTcgNjE4VjU5NUg1NThRNTk3IDU5NSA1OTcgNTY2VjU2MVE1OTcgNTQ3IDU4NyA1NDBUNTU4IDUzM0g1MTdWMEg0NTNWNzRRNDIxIDMyIDM3OCAxMFQyNzUgLTEyWk0yODIgNDVRMzE1IDQ1IDM0NiA1N1Q0MDEgOTBUNDM5IDE0MVQ0NTMgMjA1VjMxOVE0MzAgMzcxIDM4OSA0MDFUMjg0IDQzMVEyNDYgNDMxIDIxNSA0MTdUMTYyIDM3OFQxMjggMzE3VDExNiAyMzhRMTE2IDE5NiAxMjggMTYxVDE2MyAxMDBUMjE1IDYwVDI4MiA0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMjsiIGdseXBoLW5hbWU9IkVtYWNyb24iIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik05MiA2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0g1NDRWNTg1SDE2MFYzNjJINDczVjMwMkgxNjBWNjJINTUwVjBIOTJWNjA5Wk0yMTYgNzM5UTE3NyA3MzkgMTc3IDc2OFY3NzNRMTc3IDc4NyAxODcgNzk0VDIxNiA4MDFINDI0UTQ2MyA4MDEgNDYzIDc3M1Y3NjhRNDYzIDczOSA0MjQgNzM5SDIxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMzsiIGdseXBoLW5hbWU9ImVtYWNyb24iIGhvcml6LWFkdi14PSI1NjEiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDZUMTE5IDU3VDY4IDEzNVQ1MCAyMzZRNTAgMjkwIDY4IDMzNlQxMTggNDE2VDE5NCA0NjlUMjkwIDQ4OFEzNDAgNDg4IDM4MSA0NzFUNDUxIDQyM1Q0OTYgMzQ3VDUxMiAyNDhWMjQyUTUxMiAyMjggNTA2IDIyNFQ0ODUgMjIwSDExNVExMTggMTgwIDEzMiAxNDhUMTcxIDk0VDIyNiA1OVQyOTYgNDZRMzMxIDQ2IDM1NyA1M1Q0MDIgNzFUNDM0IDk4VDQ1OSAxMzFRNDYwIDEzMiA0NjYgMTMxVDQ3OSAxMjZUNDkxIDExNFQ0OTcgOTRRNDk3IDc1IDQ3MSA0OVE0NDggMjYgNDAzIDdUMjk2IC0xMlpNMjkwIDQzMVEyNTcgNDMxIDIyOCA0MjBUMTc3IDM4OFQxMzkgMzM5VDExOCAyNzZINDQzUTQzOCAzNDcgMzk4IDM4OVQyOTAgNDMxWk0xODQgNTY4UTE0NSA1NjggMTQ1IDU5N1Y2MDJRMTQ1IDYxNiAxNTUgNjIzVDE4NCA2MzBIMzkyUTQzMSA2MzAgNDMxIDYwMlY1OTdRNDMxIDU2OCAzOTIgNTY4SDE4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNDsiIGdseXBoLW5hbWU9IkVicmV2ZSIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTkyIDYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDU0NFY1ODVIMTYwVjM2Mkg0NzNWMzAySDE2MFY2Mkg1NTBWMEg5MlY2MDlaTTMyMCA3MTlRMjk5IDcxOSAyNzQgNzMwVDIyOCA3NTdUMTkzIDc5MVQxNzkgODI0UTE3OSA4NTMgMjA4IDg1M1EyMTUgODUzIDIyOCA4NDRUMjU2IDgyMlQyODggNzkyVDMyMiA3NjJRMzM3IDc3NiAzNTMgNzkyVDM4NCA4MjFUNDExIDg0NFQ0MzIgODUzUTQ2MSA4NTMgNDYxIDgyNFE0NjEgODA5IDQ0NyA3OTFUNDExIDc1NlQzNjUgNzMwVDMyMCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTU7IiBnbHlwaC1uYW1lPSJlYnJldmUiIGhvcml6LWFkdi14PSI1NjEiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDZUMTE5IDU3VDY4IDEzNVQ1MCAyMzZRNTAgMjkwIDY4IDMzNlQxMTggNDE2VDE5NCA0NjlUMjkwIDQ4OFEzNDAgNDg4IDM4MSA0NzFUNDUxIDQyM1Q0OTYgMzQ3VDUxMiAyNDhWMjQyUTUxMiAyMjggNTA2IDIyNFQ0ODUgMjIwSDExNVExMTggMTgwIDEzMiAxNDhUMTcxIDk0VDIyNiA1OVQyOTYgNDZRMzMxIDQ2IDM1NyA1M1Q0MDIgNzFUNDM0IDk4VDQ1OSAxMzFRNDYwIDEzMiA0NjYgMTMxVDQ3OSAxMjZUNDkxIDExNFQ0OTcgOTRRNDk3IDc1IDQ3MSA0OVE0NDggMjYgNDAzIDdUMjk2IC0xMlpNMjkwIDQzMVEyNTcgNDMxIDIyOCA0MjBUMTc3IDM4OFQxMzkgMzM5VDExOCAyNzZINDQzUTQzOCAzNDcgMzk4IDM4OVQyOTAgNDMxWk0yOTAgNTQ4UTI2OSA1NDggMjQ0IDU1OVQxOTggNTg2VDE2MyA2MjBUMTQ5IDY1M1ExNDkgNjgyIDE3OCA2ODJRMTg1IDY4MiAxOTggNjczVDIyNiA2NTFUMjU4IDYyMVQyOTIgNTkxUTMwNyA2MDUgMzIzIDYyMVQzNTQgNjUwVDM4MSA2NzNUNDAyIDY4MlE0MzEgNjgyIDQzMSA2NTNRNDMxIDYzOCA0MTcgNjIwVDM4MSA1ODVUMzM1IDU1OVQyOTAgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE2OyIgZ2x5cGgtbmFtZT0iRWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTkyIDYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDU0NFY1ODVIMTYwVjM2Mkg0NzNWMzAySDE2MFY2Mkg1NTBWMEg5MlY2MDlaTTMyNyA3MjBRMzAxIDcyMCAyODcgNzM0VDI3MiA3NzJRMjcyIDc5NSAyODcgODA5VDMyOCA4MjRRMzUzIDgyNCAzNjcgODEwVDM4MiA3NzJRMzgyIDc0OSAzNjggNzM1VDMyNyA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTc7IiBnbHlwaC1uYW1lPSJlZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTYxIiBkPSJNMjk2IC0xMlEyNDIgLTEyIDE5NyA2VDExOSA1N1Q2OCAxMzVUNTAgMjM2UTUwIDI5MCA2OCAzMzZUMTE4IDQxNlQxOTQgNDY5VDI5MCA0ODhRMzQwIDQ4OCAzODEgNDcxVDQ1MSA0MjNUNDk2IDM0N1Q1MTIgMjQ4VjI0MlE1MTIgMjI4IDUwNiAyMjRUNDg1IDIyMEgxMTVRMTE4IDE4MCAxMzIgMTQ4VDE3MSA5NFQyMjYgNTlUMjk2IDQ2UTMzMSA0NiAzNTcgNTNUNDAyIDcxVDQzNCA5OFQ0NTkgMTMxUTQ2MCAxMzIgNDY2IDEzMVQ0NzkgMTI2VDQ5MSAxMTRUNDk3IDk0UTQ5NyA3NSA0NzEgNDlRNDQ4IDI2IDQwMyA3VDI5NiAtMTJaTTI5MCA0MzFRMjU3IDQzMSAyMjggNDIwVDE3NyAzODhUMTM5IDMzOVQxMTggMjc2SDQ0M1E0MzggMzQ3IDM5OCAzODlUMjkwIDQzMVpNMjg0IDU0OVEyNTggNTQ5IDI0NCA1NjNUMjI5IDYwMVEyMjkgNjI0IDI0NCA2MzhUMjg1IDY1M1EzMTAgNjUzIDMyNCA2MzlUMzM5IDYwMVEzMzkgNTc4IDMyNSA1NjRUMjg0IDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExODsiIGdseXBoLW5hbWU9IkVvZ29uZWsiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik05MiA2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0g1NDRWNTg1SDE2MFYzNjJINDczVjMwMkgxNjBWNjJINTUwVjBINTM2UTQ5MyAtMzIgNDc5IC01NVQ0NjQgLTk4UTQ2NCAtMTE1IDQ3NCAtMTI1VDQ5OCAtMTM2UTUyNCAtMTM2IDUzNyAtMTE1UTU0OCAtMTE1IDU1OCAtMTIzVDU2OSAtMTQ5UTU2OSAtMTY5IDU0OSAtMTgxVDQ5NyAtMTkzUTQ1NSAtMTkzIDQzMCAtMTcxVDQwNCAtMTExUTQwNCAtODMgNDIxIC01NVQ0NzYgMEg5MlY2MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTk7IiBnbHlwaC1uYW1lPSJlb2dvbmVrIiBob3Jpei1hZHYteD0iNTYxIiBkPSJNMjk2IC0xMlEyNDIgLTEyIDE5NyA2VDExOSA1N1Q2OCAxMzVUNTAgMjM2UTUwIDI5MCA2OCAzMzZUMTE4IDQxNlQxOTQgNDY5VDI5MCA0ODhRMzQwIDQ4OCAzODEgNDcxVDQ1MSA0MjNUNDk2IDM0N1Q1MTIgMjQ4VjI0MlE1MTIgMjI4IDUwNiAyMjRUNDg1IDIyMEgxMTVRMTE4IDE4MCAxMzIgMTQ4VDE3MSA5NFQyMjYgNTlUMjk2IDQ2UTMzMSA0NiAzNTcgNTNUNDAyIDcxVDQzNCA5OFQ0NTkgMTMxUTQ2MCAxMzIgNDY2IDEzMVQ0NzkgMTI2VDQ5MSAxMTRUNDk3IDk0UTQ5NyA3NSA0NzEgNDlRNDUyIDMwIDQyMiAxNVEzNzUgLTE4IDM2MCAtNDJUMzQ0IC04N1EzNDQgLTEwNCAzNTQgLTExNFQzNzggLTEyNVE0MDQgLTEyNSA0MTcgLTEwNFE0MjggLTEwNCA0MzggLTExMlQ0NDkgLTEzOFE0NDkgLTE1OCA0MjkgLTE3MFQzNzcgLTE4MlEzMzUgLTE4MiAzMTAgLTE2MFQyODQgLTEwMFEyODQgLTc3IDI5NSAtNTVUMzI5IC0xMFEzMjEgLTExIDMxMyAtMTFUMjk2IC0xMlpNMjkwIDQzMVEyNTcgNDMxIDIyOCA0MjBUMTc3IDM4OFQxMzkgMzM5VDExOCAyNzZINDQzUTQzOCAzNDcgMzk4IDM4OVQyOTAgNDMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFBOyIgZ2x5cGgtbmFtZT0iRWNhcm9uIiBob3Jpei1hZHYteD0iNjA2IiBkPSJNOTIgNjA5UTkyIDYyNSAxMDMgNjM2VDEzMCA2NDdINTQ0VjU4NUgxNjBWMzYySDQ3M1YzMDJIMTYwVjYySDU1MFYwSDkyVjYwOVpNNDMyIDg3NFE0NTMgODc0IDQ1MyA4NTFRNDUzIDgzMyA0MzQgODA4VDM5MCA3NjBUMzQ2IDcyMFQzMjMgNzA0UTMyMSA3MDQgMzAxIDcyMFQyNTYgNzU5VDIxMyA4MDhUMTkzIDg1MVExOTMgODc0IDIxNCA4NzRRMjMxIDg3NCAyNTUgODQ5VDMyNCA3NjJRMzY4IDgyMyAzOTEgODQ4VDQzMiA4NzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBnbHlwaC1uYW1lPSJlY2Fyb24iIGhvcml6LWFkdi14PSI1NjEiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDZUMTE5IDU3VDY4IDEzNVQ1MCAyMzZRNTAgMjkwIDY4IDMzNlQxMTggNDE2VDE5NCA0NjlUMjkwIDQ4OFEzNDAgNDg4IDM4MSA0NzFUNDUxIDQyM1Q0OTYgMzQ3VDUxMiAyNDhWMjQyUTUxMiAyMjggNTA2IDIyNFQ0ODUgMjIwSDExNVExMTggMTgwIDEzMiAxNDhUMTcxIDk0VDIyNiA1OVQyOTYgNDZRMzMxIDQ2IDM1NyA1M1Q0MDIgNzFUNDM0IDk4VDQ1OSAxMzFRNDYwIDEzMiA0NjYgMTMxVDQ3OSAxMjZUNDkxIDExNFQ0OTcgOTRRNDk3IDc1IDQ3MSA0OVE0NDggMjYgNDAzIDdUMjk2IC0xMlpNMjkwIDQzMVEyNTcgNDMxIDIyOCA0MjBUMTc3IDM4OFQxMzkgMzM5VDExOCAyNzZINDQzUTQzOCAzNDcgMzk4IDM4OVQyOTAgNDMxWk0zOTIgNzAzUTQxMyA3MDMgNDEzIDY4MFE0MTMgNjYyIDM5NCA2MzdUMzUwIDU4OVQzMDYgNTQ5VDI4MyA1MzNRMjgxIDUzMyAyNjEgNTQ5VDIxNiA1ODhUMTczIDYzN1QxNTMgNjgwUTE1MyA3MDMgMTc0IDcwM1ExOTEgNzAzIDIxNSA2NzhUMjg0IDU5MVEzMjggNjUyIDM1MSA2NzdUMzkyIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQzsiIGdseXBoLW5hbWU9IkdjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNzM2IiBkPSJNMzcwIC0xMlEzMDAgLTEyIDI0NCAxM1QxNDggODJUODcgMTg4VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODkgNjU5UTQ2NSA2NTkgNTE4IDYzNVQ1OTkgNTg0UTYzMCA1NTMgNjMwIDUzMVE2MzAgNTE3IDYyNCA1MDlUNjExIDQ5NlQ1OTcgNDkyVDU4OSA0OTJRNTc0IDUxOSA1NTIgNTM5VDUwMiA1NzJUNDQ2IDU5M1QzODcgNjAwUTMzMSA2MDAgMjg1IDU4MFQyMDUgNTI0VDE1NCA0MzZUMTM1IDMyNFExMzUgMjY0IDE1MSAyMTNUMTk5IDEyNlQyNzYgNjhUMzc5IDQ3UTQyMyA0NyA0NjAgNjBUNTI2IDk2VDU3MyAxNTBUNTk3IDIxOFYyNjlIMzgyVjMzMEg2MDdRNjI5IDMzMCA2NDMgMzE2VDY1NyAyODBWM1E2NTcgMSA2NTEgLTFUNjM1IC00UTYxOCAtNCA2MDggOFQ1OTcgNjFWOTdRNTY3IDQ2IDUwOCAxN1QzNzAgLTEyWk0yNjcgNzIwUTI0NSA3MjAgMjQ1IDc0M1EyNDUgNzYxIDI2NSA3ODZUMzA5IDgzNFQzNTMgODc0VDM3NiA4OTBRMzc4IDg5MCAzOTggODc0VDQ0MyA4MzVUNDg2IDc4NlQ1MDYgNzQzUTUwNiA3MjAgNDg1IDcyMFE0NjggNzIwIDQ0NCA3NDVUMzc1IDgzMlEzNTIgODAxIDMzNiA3ODBUMzA3IDc0NlQyODUgNzI2VDI2NyA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUQ7IiBnbHlwaC1uYW1lPSJnY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU5OSIgZD0iTTI5MSAtMjAwUTIyNSAtMjAwIDE3OSAtMTgxVDEwNyAtMTM2UTgxIC0xMTAgODEgLTg4UTgxIC03NSA4NiAtNjdUOTkgLTUzVDExMiAtNDdUMTE5IC00N1ExNDEgLTg4IDE4MiAtMTE1VDI5MiAtMTQyUTQ1MyAtMTQyIDQ1MyAyNFY4NFE0MjEgNDMgMzc4IDIzVDI3NSAyUTIyNSAyIDE4NCAxOVQxMTMgNjdUNjcgMTQzVDUwIDI0M1E1MCAyOTYgNjggMzQxVDExNiA0MThUMTg5IDQ2OVQyNzkgNDg4UTM0MiA0ODggMzg3IDQ2NVQ0NTMgNDExVjQ3Nkg1MThWMjRRNTE4IC04OSA0NTkgLTE0NFQyOTEgLTIwMFpNMjgyIDU4UTMxNSA1OCAzNDYgNjlUNDAxIDEwMlQ0MzkgMTUyVDQ1MyAyMTVWMzE5UTQzMCAzNzEgMzg5IDQwMVQyODQgNDMxUTI0NiA0MzEgMjE1IDQxN1QxNjIgMzc4VDEyOCAzMTlUMTE2IDI0NFExMTYgMTU5IDE2MSAxMDlUMjgyIDU4Wk0xNzkgNTQ5UTE1NyA1NDkgMTU3IDU3MlExNTcgNTkwIDE3NyA2MTVUMjIxIDY2M1QyNjUgNzAzVDI4OCA3MTlRMjkwIDcxOSAzMTAgNzAzVDM1NSA2NjRUMzk4IDYxNVQ0MTggNTcyUTQxOCA1NDkgMzk3IDU0OVEzODAgNTQ5IDM1NiA1NzRUMjg3IDY2MVEyNjQgNjMwIDI0OCA2MDlUMjE5IDU3NVQxOTcgNTU1VDE3OSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBnbHlwaC1uYW1lPSJHYnJldmUiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik0zNzAgLTEyUTMwMCAtMTIgMjQ0IDEzVDE0OCA4MlQ4NyAxODhUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OSA2NTlRNDY1IDY1OSA1MTggNjM1VDU5OSA1ODRRNjMwIDU1MyA2MzAgNTMxUTYzMCA1MTcgNjI0IDUwOVQ2MTEgNDk2VDU5NyA0OTJUNTg5IDQ5MlE1NzQgNTE5IDU1MiA1MzlUNTAyIDU3MlQ0NDYgNTkzVDM4NyA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNSA1MjRUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjQgMTUxIDIxM1QxOTkgMTI2VDI3NiA2OFQzNzkgNDdRNDIzIDQ3IDQ2MCA2MFQ1MjYgOTZUNTczIDE1MFQ1OTcgMjE4VjI2OUgzODJWMzMwSDYwN1E2MjkgMzMwIDY0MyAzMTZUNjU3IDI4MFYzUTY1NyAxIDY1MSAtMVQ2MzUgLTRRNjE4IC00IDYwOCA4VDU5NyA2MVY5N1E1NjcgNDYgNTA4IDE3VDM3MCAtMTJaTTM3OCA3MTlRMzU3IDcxOSAzMzIgNzMwVDI4NiA3NTdUMjUxIDc5MVQyMzcgODI0UTIzNyA4NTMgMjY2IDg1M1EyNzMgODUzIDI4NiA4NDRUMzE0IDgyMlQzNDYgNzkyVDM4MCA3NjJRMzk1IDc3NiA0MTEgNzkyVDQ0MiA4MjFUNDY5IDg0NFQ0OTAgODUzUTUxOSA4NTMgNTE5IDgyNFE1MTkgODA5IDUwNSA3OTFUNDY5IDc1NlQ0MjMgNzMwVDM3OCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUY7IiBnbHlwaC1uYW1lPSJnYnJldmUiIGhvcml6LWFkdi14PSI1OTkiIGQ9Ik0yOTEgLTIwMFEyMjUgLTIwMCAxNzkgLTE4MVQxMDcgLTEzNlE4MSAtMTEwIDgxIC04OFE4MSAtNzUgODYgLTY3VDk5IC01M1QxMTIgLTQ3VDExOSAtNDdRMTQxIC04OCAxODIgLTExNVQyOTIgLTE0MlE0NTMgLTE0MiA0NTMgMjRWODRRNDIxIDQzIDM3OCAyM1QyNzUgMlEyMjUgMiAxODQgMTlUMTEzIDY3VDY3IDE0M1Q1MCAyNDNRNTAgMjk2IDY4IDM0MVQxMTYgNDE4VDE4OSA0NjlUMjc5IDQ4OFEzNDIgNDg4IDM4NyA0NjVUNDUzIDQxMVY0NzZINTE4VjI0UTUxOCAtODkgNDU5IC0xNDRUMjkxIC0yMDBaTTI4MiA1OFEzMTUgNTggMzQ2IDY5VDQwMSAxMDJUNDM5IDE1MlQ0NTMgMjE1VjMxOVE0MzAgMzcxIDM4OSA0MDFUMjg0IDQzMVEyNDYgNDMxIDIxNSA0MTdUMTYyIDM3OFQxMjggMzE5VDExNiAyNDRRMTE2IDE1OSAxNjEgMTA5VDI4MiA1OFpNMjg3IDU0OFEyNjYgNTQ4IDI0MSA1NTlUMTk1IDU4NlQxNjAgNjIwVDE0NiA2NTNRMTQ2IDY4MiAxNzUgNjgyUTE4MiA2ODIgMTk1IDY3M1QyMjMgNjUxVDI1NSA2MjFUMjg5IDU5MVEzMDQgNjA1IDMyMCA2MjFUMzUxIDY1MFQzNzggNjczVDM5OSA2ODJRNDI4IDY4MiA0MjggNjUzUTQyOCA2MzggNDE0IDYyMFQzNzggNTg1VDMzMiA1NTlUMjg3IDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMDsiIGdseXBoLW5hbWU9Ikdkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik0zNzAgLTEyUTMwMCAtMTIgMjQ0IDEzVDE0OCA4MlQ4NyAxODhUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OSA2NTlRNDY1IDY1OSA1MTggNjM1VDU5OSA1ODRRNjMwIDU1MyA2MzAgNTMxUTYzMCA1MTcgNjI0IDUwOVQ2MTEgNDk2VDU5NyA0OTJUNTg5IDQ5MlE1NzQgNTE5IDU1MiA1MzlUNTAyIDU3MlQ0NDYgNTkzVDM4NyA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNSA1MjRUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjQgMTUxIDIxM1QxOTkgMTI2VDI3NiA2OFQzNzkgNDdRNDIzIDQ3IDQ2MCA2MFQ1MjYgOTZUNTczIDE1MFQ1OTcgMjE4VjI2OUgzODJWMzMwSDYwN1E2MjkgMzMwIDY0MyAzMTZUNjU3IDI4MFYzUTY1NyAxIDY1MSAtMVQ2MzUgLTRRNjE4IC00IDYwOCA4VDU5NyA2MVY5N1E1NjcgNDYgNTA4IDE3VDM3MCAtMTJaTTM4MiA3MjBRMzU2IDcyMCAzNDIgNzM0VDMyNyA3NzJRMzI3IDc5NSAzNDIgODA5VDM4MyA4MjRRNDA4IDgyNCA0MjIgODEwVDQzNyA3NzJRNDM3IDc0OSA0MjMgNzM1VDM4MiA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjE7IiBnbHlwaC1uYW1lPSJnZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTk5IiBkPSJNMjkxIC0yMDBRMjI1IC0yMDAgMTc5IC0xODFUMTA3IC0xMzZRODEgLTExMCA4MSAtODhRODEgLTc1IDg2IC02N1Q5OSAtNTNUMTEyIC00N1QxMTkgLTQ3UTE0MSAtODggMTgyIC0xMTVUMjkyIC0xNDJRNDUzIC0xNDIgNDUzIDI0Vjg0UTQyMSA0MyAzNzggMjNUMjc1IDJRMjI1IDIgMTg0IDE5VDExMyA2N1Q2NyAxNDNUNTAgMjQzUTUwIDI5NiA2OCAzNDFUMTE2IDQxOFQxODkgNDY5VDI3OSA0ODhRMzQyIDQ4OCAzODcgNDY1VDQ1MyA0MTFWNDc2SDUxOFYyNFE1MTggLTg5IDQ1OSAtMTQ0VDI5MSAtMjAwWk0yODIgNThRMzE1IDU4IDM0NiA2OVQ0MDEgMTAyVDQzOSAxNTJUNDUzIDIxNVYzMTlRNDMwIDM3MSAzODkgNDAxVDI4NCA0MzFRMjQ2IDQzMSAyMTUgNDE3VDE2MiAzNzhUMTI4IDMxOVQxMTYgMjQ0UTExNiAxNTkgMTYxIDEwOVQyODIgNThaTTI5MCA1NDlRMjY0IDU0OSAyNTAgNTYzVDIzNSA2MDFRMjM1IDYyNCAyNTAgNjM4VDI5MSA2NTNRMzE2IDY1MyAzMzAgNjM5VDM0NSA2MDFRMzQ1IDU3OCAzMzEgNTY0VDI5MCA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjI7IiBnbHlwaC1uYW1lPSJHY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI3MzYiIGQ9Ik0zNzAgLTEyUTMwMCAtMTIgMjQ0IDEzVDE0OCA4MlQ4NyAxODhUNjUgMzIyUTY1IDM5NiA4OSA0NThUMTU1IDU2NFQyNTcgNjM0VDM4OSA2NTlRNDY1IDY1OSA1MTggNjM1VDU5OSA1ODRRNjMwIDU1MyA2MzAgNTMxUTYzMCA1MTcgNjI0IDUwOVQ2MTEgNDk2VDU5NyA0OTJUNTg5IDQ5MlE1NzQgNTE5IDU1MiA1MzlUNTAyIDU3MlQ0NDYgNTkzVDM4NyA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNSA1MjRUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjQgMTUxIDIxM1QxOTkgMTI2VDI3NiA2OFQzNzkgNDdRNDIzIDQ3IDQ2MCA2MFQ1MjYgOTZUNTczIDE1MFQ1OTcgMjE4VjI2OUgzODJWMzMwSDYwN1E2MjkgMzMwIDY0MyAzMTZUNjU3IDI4MFYzUTY1NyAxIDY1MSAtMVQ2MzUgLTRRNjE4IC00IDYwOCA4VDU5NyA2MVY5N1E1NjcgNDYgNTA4IDE3VDM3MCAtMTJaTTMyMSAtMjI1UTMxOCAtMjI4IDMxMSAtMjI5VDI5OCAtMjI4VDI4OSAtMjIyVDI4OCAtMjA5TDM0OCAtODRRMzU2IC02OCAzNjIgLTU5VDM4OCAtNTBIMzkzUTQwNyAtNTAgNDE3IC01N1Q0MjggLTc5Vi04M1E0MjggLTkxIDQyMSAtMTAwVDQwMiAtMTI0TDMyMSAtMjI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIzOyIgZ2x5cGgtbmFtZT0iZ2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTk5IiBkPSJNMjkxIC0yMDBRMjI1IC0yMDAgMTc5IC0xODFUMTA3IC0xMzZRODEgLTExMCA4MSAtODhRODEgLTc1IDg2IC02N1Q5OSAtNTNUMTEyIC00N1QxMTkgLTQ3UTE0MSAtODggMTgyIC0xMTVUMjkyIC0xNDJRNDUzIC0xNDIgNDUzIDI0Vjg0UTQyMSA0MyAzNzggMjNUMjc1IDJRMjI1IDIgMTg0IDE5VDExMyA2N1Q2NyAxNDNUNTAgMjQzUTUwIDI5NiA2OCAzNDFUMTE2IDQxOFQxODkgNDY5VDI3OSA0ODhRMzQyIDQ4OCAzODcgNDY1VDQ1MyA0MTFWNDc2SDUxOFYyNFE1MTggLTg5IDQ1OSAtMTQ0VDI5MSAtMjAwWk0yODIgNThRMzE1IDU4IDM0NiA2OVQ0MDEgMTAyVDQzOSAxNTJUNDUzIDIxNVYzMTlRNDMwIDM3MSAzODkgNDAxVDI4NCA0MzFRMjQ2IDQzMSAyMTUgNDE3VDE2MiAzNzhUMTI4IDMxOVQxMTYgMjQ0UTExNiAxNTkgMTYxIDEwOVQyODIgNThaTTMxNyA2OTRRMzIwIDY5NyAzMjcgNjk4VDM0MCA2OTdUMzQ5IDY5MFQzNTAgNjc4TDI5MCA1NTNRMjgyIDUzNyAyNzYgNTI4VDI1MCA1MTlIMjQ1UTIzMSA1MTkgMjIxIDUyNlQyMTAgNTQ4VjU1MlEyMTAgNTYwIDIxNyA1NjlUMjM2IDU5M0wzMTcgNjk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI0OyIgZ2x5cGgtbmFtZT0iSGNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3MDkiIGQ9Ik05MiA2MjBROTIgNjUxIDEyMSA2NTFIMTMwUTE2MCA2NTEgMTYwIDYyMFYzNTVINTQ5VjYyMFE1NDkgNjUxIDU3OCA2NTFINTg3UTYxNyA2NTEgNjE3IDYyMFYwSDU0OVYyOTNIMTYwVjBIOTJWNjIwWk0yNDYgNzIwUTIyNCA3MjAgMjI0IDc0M1EyMjQgNzYxIDI0NCA3ODZUMjg4IDgzNFQzMzIgODc0VDM1NSA4OTBRMzU3IDg5MCAzNzcgODc0VDQyMiA4MzVUNDY1IDc4NlQ0ODUgNzQzUTQ4NSA3MjAgNDY0IDcyMFE0NDcgNzIwIDQyMyA3NDVUMzU0IDgzMlEzMzEgODAxIDMxNSA3ODBUMjg2IDc0NlQyNjQgNzI2VDI0NiA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjU7IiBnbHlwaC1uYW1lPSJoY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTgyIDY3NFE4MiA2NzYgODggNjc4VDEwNCA2ODFRMTIxIDY4MSAxMzQgNjY5VDE0NyA2MThWNDAwUTE3MiA0MzkgMjEyIDQ2M1QzMDggNDg4UTM1NSA0ODggMzkwIDQ3M1Q0NDkgNDMxVDQ4NSAzNjRUNDk3IDI3OFYwSDQzMlYyNzRRNDMyIDM0NiAzOTggMzg2VDMwNCA0MjdRMjMzIDQyNyAxOTAgMzgzVDE0NyAyNjRWMEg4MlY2NzRaTTIgNzIwUS0yMCA3MjAgLTIwIDc0M1EtMjAgNzYxIDAgNzg2VDQ0IDgzNFQ4OCA4NzRUMTExIDg5MFExMTMgODkwIDEzMyA4NzRUMTc4IDgzNVQyMjEgNzg2VDI0MSA3NDNRMjQxIDcyMCAyMjAgNzIwUTIwMyA3MjAgMTc5IDc0NVQxMTAgODMyUTg3IDgwMSA3MSA3ODBUNDIgNzQ2VDIwIDcyNlQyIDcyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNjsiIGdseXBoLW5hbWU9IkhiYXIiIGhvcml6LWFkdi14PSI3MDkiIGQ9Ik02NyA0NjBRNDggNDYwIDM4IDQ2NlQyOCA0ODdWNDkyUTI4IDUwNiAzOCA1MTJUNjcgNTE4SDkyVjYyMFE5MiA2NTEgMTIxIDY1MUgxMzBRMTYwIDY1MSAxNjAgNjIwVjUxOEg1NDlWNjIwUTU0OSA2NTEgNTc4IDY1MUg1ODdRNjE3IDY1MSA2MTcgNjIwVjUxOEg2NDFRNjgwIDUxOCA2ODAgNDkyVjQ4N1E2ODAgNDcyIDY3MCA0NjZUNjQxIDQ2MEg2MTdWMEg1NDlWMjkzSDE2MFYwSDkyVjQ2MEg2N1pNNTQ5IDM1NVY0NjBIMTYwVjM1NUg1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjc7IiBnbHlwaC1uYW1lPSJoYmFyIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNNDEgNTMzUTIgNTMzIDIgNTYyVjU2N1EyIDU4MSAxMiA1ODhUNDEgNTk1SDgyVjY3NFE4MiA2NzYgODggNjc4VDEwNCA2ODFRMTIxIDY4MSAxMzQgNjY5VDE0NyA2MThWNTk1SDIzOVEyNzggNTk1IDI3OCA1NjdWNTYyUTI3OCA1MzMgMjM5IDUzM0gxNDdWNDAwUTE3MiA0MzkgMjEyIDQ2M1QzMDggNDg4UTM1NSA0ODggMzkwIDQ3M1Q0NDkgNDMxVDQ4NSAzNjRUNDk3IDI3OFYwSDQzMlYyNzRRNDMyIDM0NiAzOTggMzg2VDMwNCA0MjdRMjMzIDQyNyAxOTAgMzgzVDE0NyAyNjRWMEg4MlY1MzNINDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjg7IiBnbHlwaC1uYW1lPSJJdGlsZGUiIGhvcml6LWFkdi14PSIyNzIiIGQ9Ik0xMDIgNjIwUTEwMiA2NTEgMTMxIDY1MUgxNDBRMTcwIDY1MSAxNzAgNjIwVjBIMTAyVjYyMFpNMTcgNjgwUS04IDY4MCAtOCA3MDZRLTggNzIyIC0zIDczOFQxMSA3NjdUMzMgNzg4VDYxIDc5NlE4NSA3OTYgMTI1IDc3NVQyMDkgNzE2UTIxMyA3MjkgMjE4IDc0MlQyMjkgNzY1VDI0MSA3ODJUMjU1IDc4OVEyODAgNzg5IDI4MCA3NjNRMjgwIDc0NiAyNzUgNzMwVDI2MSA3MDJUMjM5IDY4MVQyMTEgNjczUTE4NyA2NzMgMTQ3IDY5NFQ2MyA3NTNRNTkgNzQwIDU0IDcyN1Q0MyA3MDRUMzEgNjg3VDE3IDY4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyOTsiIGdseXBoLW5hbWU9Iml0aWxkZSIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTg3IDQ0OVE4NyA0NjcgOTUgNDczVDExNiA0ODBIMTIzUTEzNiA0ODAgMTQ0IDQ3NFQxNTIgNDQ5VjBIODdWNDQ5Wk0xIDU1NVEtMjQgNTU1IC0yNCA1ODFRLTI0IDU5NyAtMTkgNjEzVC01IDY0MlQxNyA2NjNUNDUgNjcxUTY5IDY3MSAxMDkgNjUwVDE5MyA1OTFRMTk3IDYwNCAyMDIgNjE3VDIxMyA2NDBUMjI1IDY1N1QyMzkgNjY0UTI2NCA2NjQgMjY0IDYzOFEyNjQgNjIxIDI1OSA2MDVUMjQ1IDU3N1QyMjMgNTU2VDE5NSA1NDhRMTcxIDU0OCAxMzEgNTY5VDQ3IDYyOFE0MyA2MTUgMzggNjAyVDI3IDU3OVQxNSA1NjJUMSA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkE7IiBnbHlwaC1uYW1lPSJJbWFjcm9uIiBob3Jpei1hZHYteD0iMjcyIiBkPSJNMTAyIDYyMFExMDIgNjUxIDEzMSA2NTFIMTQwUTE3MCA2NTEgMTcwIDYyMFYwSDEwMlY2MjBaTTMyIDczOVEtNyA3MzkgLTcgNzY4Vjc3M1EtNyA3ODcgMyA3OTRUMzIgODAxSDI0MFEyNzkgODAxIDI3OSA3NzNWNzY4UTI3OSA3MzkgMjQwIDczOUgzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQjsiIGdseXBoLW5hbWU9ImltYWNyb24iIGhvcml6LWFkdi14PSIyMzkiIGQ9Ik04NyA0NDlRODcgNDY3IDk1IDQ3M1QxMTYgNDgwSDEyM1ExMzYgNDgwIDE0NCA0NzRUMTUyIDQ0OVYwSDg3VjQ0OVpNMTUgNTY4US0yNCA1NjggLTI0IDU5N1Y2MDJRLTI0IDYxNiAtMTQgNjIzVDE1IDYzMEgyMjNRMjYyIDYzMCAyNjIgNjAyVjU5N1EyNjIgNTY4IDIyMyA1NjhIMTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkU7IiBnbHlwaC1uYW1lPSJJb2dvbmVrIiBob3Jpei1hZHYteD0iMjcyIiBkPSJNMTAyIDYxOVExMDIgNjMzIDEwOSA2NDJUMTI2IDY1MUgxNDZRMTcwIDY1MSAxNzAgNjE5VjBIMTU3UTExMCAtMzQgOTUgLTU4VDc5IC0xMDNRNzkgLTEyMCA4OSAtMTMwVDExMyAtMTQxUTEzOSAtMTQxIDE1MiAtMTIwUTE2MyAtMTIwIDE3MyAtMTI4VDE4NCAtMTU0UTE4NCAtMTc0IDE2NCAtMTg2VDExMiAtMTk4UTcwIC0xOTggNDUgLTE3NlQxOSAtMTE2UTE5IC04NiAzOCAtNTZUMTAyIDJWNjE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJGOyIgZ2x5cGgtbmFtZT0iaW9nb25layIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTE0MCAwUTkzIC0zNCA3OCAtNThUNjIgLTEwM1E2MiAtMTIwIDcyIC0xMzBUOTYgLTE0MVExMjIgLTE0MSAxMzUgLTEyMFExNDYgLTEyMCAxNTYgLTEyOFQxNjcgLTE1NFExNjcgLTE3NCAxNDcgLTE4NlQ5NSAtMTk4UTUzIC0xOTggMjggLTE3NlQyIC0xMTZRMiAtODYgMjIgLTU1VDg3IDNWNDQ5UTg3IDQ2NyA5NSA0NzNUMTE2IDQ4MEgxMjNRMTM2IDQ4MCAxNDQgNDc0VDE1MiA0NDlWMEgxNDBaTTExOSA1OTVRNzcgNTk1IDc3IDYzOFE3NyA2ODEgMTIxIDY4MVExNjMgNjgxIDE2MyA2MzhRMTYzIDU5NSAxMTkgNTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMwOyIgZ2x5cGgtbmFtZT0iSWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjI3MiIgZD0iTTEwMiA2MjBRMTAyIDY1MSAxMzEgNjUxSDE0MFExNzAgNjUxIDE3MCA2MjBWMEgxMDJWNjIwWk0xMzYgNzIwUTExMCA3MjAgOTYgNzM0VDgxIDc3MlE4MSA3OTUgOTYgODA5VDEzNyA4MjRRMTYyIDgyNCAxNzYgODEwVDE5MSA3NzJRMTkxIDc0OSAxNzcgNzM1VDEzNiA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzE7IiBnbHlwaC1uYW1lPSJkb3RsZXNzaSIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTg3IDQ0OVE4NyA0NjcgOTUgNDczVDExNiA0ODBIMTIzUTEzNiA0ODAgMTQ0IDQ3NFQxNTIgNDQ5VjBIODdWNDQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMyOyIgZ2x5cGgtbmFtZT0iSUoiIGhvcml6LWFkdi14PSI3MzkiIGQ9Ik0xMDIgNjIwUTEwMiA2NTEgMTMxIDY1MUgxNDBRMTcwIDY1MSAxNzAgNjIwVjBIMTAyVjYyMFpNNDY5IC0xMlE0MzUgLTEyIDQwNyAtM1QzNTcgMjFUMzI1IDUxVDMxMyA4MlEzMTMgOTIgMzE5IDEwMFQzMzIgMTE0VDM0NiAxMjJUMzUzIDEyM1EzNjggOTAgMzk4IDY5VDQ2OSA0N1E1MzQgNDcgNTYxIDgzVDU4OSAyMDRWNjQ3SDY1N1YyMDRRNjU3IDkzIDYxMiA0MVQ0NjkgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMzOyIgZ2x5cGgtbmFtZT0iaWoiIGhvcml6LWFkdi14PSI0NzgiIGQ9Ik04NyA0NDlRODcgNDY3IDk1IDQ3M1QxMTYgNDgwSDEyM1ExMzYgNDgwIDE0NCA0NzRUMTUyIDQ0OVYwSDg3VjQ0OVpNMTE5IDU5NVE3NyA1OTUgNzcgNjM4UTc3IDY4MSAxMjEgNjgxUTE2MyA2ODEgMTYzIDYzOFExNjMgNTk1IDExOSA1OTVaTTI2MCAtMTkxUTIzNCAtMTkxIDIxNCAtMTg0VDE4MyAtMTY2UTE3MCAtMTUzIDE3MCAtMTM5UTE3MCAtMTIzIDE3OCAtMTEyVDE4OSAtMTAzUTIwMCAtMTE0IDIxNyAtMTIzVDI1OSAtMTMzUTI5NSAtMTMzIDMxMCAtMTEzVDMyNiAtNDRWNDc2SDM5MVYtNDlRMzkxIC0xMTggMzU4IC0xNTRUMjYwIC0xOTFaTTM1OCA1OTVRMzE2IDU5NSAzMTYgNjM4UTMxNiA2ODEgMzYwIDY4MVE0MDIgNjgxIDQwMiA2MzhRNDAyIDU5NSAzNTggNTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgZ2x5cGgtbmFtZT0iSmNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI0NjciIGQ9Ik0xOTcgLTEyUTE2MyAtMTIgMTM1IC0zVDg1IDIxVDUzIDUxVDQxIDgyUTQxIDkyIDQ3IDEwMFQ2MCAxMTRUNzQgMTIyVDgxIDEyM1E5NiA5MCAxMjYgNjlUMTk3IDQ3UTI2MiA0NyAyODkgODNUMzE3IDIwNFY2NDdIMzg1VjIwNFEzODUgOTMgMzQwIDQxVDE5NyAtMTJaTTIzNiA3MjBRMjE0IDcyMCAyMTQgNzQzUTIxNCA3NjEgMjM0IDc4NlQyNzggODM0VDMyMiA4NzRUMzQ1IDg5MFEzNDcgODkwIDM2NyA4NzRUNDEyIDgzNVQ0NTUgNzg2VDQ3NSA3NDNRNDc1IDcyMCA0NTQgNzIwUTQzNyA3MjAgNDEzIDc0NVQzNDQgODMyUTMyMSA4MDEgMzA1IDc4MFQyNzYgNzQ2VDI1NCA3MjZUMjM2IDcyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGdseXBoLW5hbWU9ImpjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjM5IiBkPSJNMjEgLTE5MVEtNSAtMTkxIC0yNSAtMTg0VC01NiAtMTY2US02OSAtMTUzIC02OSAtMTM5US02OSAtMTIzIC02MSAtMTEyVC01MCAtMTAzUS0zOSAtMTE0IC0yMiAtMTIzVDIwIC0xMzNRNTYgLTEzMyA3MSAtMTEzVDg3IC00NFY0NzZIMTUyVi00OVExNTIgLTExOCAxMTkgLTE1NFQyMSAtMTkxWk0xMCA1NDlRLTEyIDU0OSAtMTIgNTcyUS0xMiA1OTAgOCA2MTVUNTIgNjYzVDk2IDcwM1QxMTkgNzE5UTEyMSA3MTkgMTQxIDcwM1QxODYgNjY0VDIyOSA2MTVUMjQ5IDU3MlEyNDkgNTQ5IDIyOCA1NDlRMjExIDU0OSAxODcgNTc0VDExOCA2NjFROTUgNjMwIDc5IDYwOVQ1MCA1NzVUMjggNTU1VDEwIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNjsiIGdseXBoLW5hbWU9Iktjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU4NiIgZD0iTTkyIDYyMFE5MiA2NTEgMTIxIDY1MUgxMzBRMTYwIDY1MSAxNjAgNjIwVjMzOUw0NTYgNjMwUTQ3MiA2NDYgNDg2IDY0OVQ1MTAgNjQ4VDUyNSA2MzRUNTI5IDYxNUwyMzUgMzMyTDUzNiAzMVE1MzcgMjAgNTMxIDExVDUxMyAtMlQ0ODggLTRUNDYyIDEyTDE2MCAzMjNWMEg5MlY2MjBaTTIyNSAtMjI1UTIyMiAtMjI4IDIxNSAtMjI5VDIwMiAtMjI4VDE5MyAtMjIyVDE5MiAtMjA5TDI1MiAtODRRMjYwIC02OCAyNjYgLTU5VDI5MiAtNTBIMjk3UTMxMSAtNTAgMzIxIC01N1QzMzIgLTc5Vi04M1EzMzIgLTkxIDMyNSAtMTAwVDMwNiAtMTI0TDIyNSAtMjI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM3OyIgZ2x5cGgtbmFtZT0ia2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNDczIiBkPSJNODIgNjc0UTgyIDY3NiA4OCA2NzhUMTA0IDY4MVExMjEgNjgxIDEzNCA2NjlUMTQ3IDYxOFYyNThMMzM5IDQ1NFEzNTkgNDc1IDM3NCA0NzhUMzk4IDQ3N1Q0MTIgNDYyVDQxNSA0NDhMMjE4IDI1M0w0NDYgMzBRNDQ2IDI1IDQ0MiAxNlQ0MjkgMFQ0MDUgLTNUMzY5IDIxTDE0NyAyNDJWMEg4MlY2NzRaTTE4NCAtMjI1UTE4MSAtMjI4IDE3NCAtMjI5VDE2MSAtMjI4VDE1MiAtMjIyVDE1MSAtMjA5TDIxMSAtODRRMjE5IC02OCAyMjUgLTU5VDI1MSAtNTBIMjU2UTI3MCAtNTAgMjgwIC01N1QyOTEgLTc5Vi04M1EyOTEgLTkxIDI4NCAtMTAwVDI2NSAtMTI0TDE4NCAtMjI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM5OyIgZ2x5cGgtbmFtZT0iTGFjdXRlIiBob3Jpei1hZHYteD0iNTUwIiBkPSJNOTIgNjIwUTkyIDY1MSAxMjEgNjUxSDEzMFExNjAgNjUxIDE2MCA2MjBWNjNINDcyUTUwMyA2MyA1MDMgMzRWMjlRNTAzIDAgNDcyIDBIOTJWNjIwWk0xMTUgNzIyUTExMyA3MjQgMTIzIDczOFQxNTIgNzcxVDE5MyA4MTFUMjQwIDg1MFEyNjQgODY4IDI4NiA4NjhRMjk4IDg2OCAzMDcgODYxVDMxNiA4NDFRMzE2IDgxNiAyNzkgNzkxUTI1NCA3NzQgMjI2IDc2MFQxNzQgNzM3VDEzNCA3MjRUMTE1IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQTsiIGdseXBoLW5hbWU9ImxhY3V0ZSIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTg3IDY3NFE4NyA2NzYgOTMgNjc4VDEwOSA2ODFRMTI2IDY4MSAxMzkgNjY5VDE1MiA2MThWMEg4N1Y2NzRaTTEwNyA3MjJRMTA1IDcyNCAxMTUgNzM4VDE0NCA3NzFUMTg1IDgxMVQyMzIgODUwUTI1NiA4NjggMjc4IDg2OFEyOTAgODY4IDI5OSA4NjFUMzA4IDg0MVEzMDggODE2IDI3MSA3OTFRMjQ2IDc3NCAyMTggNzYwVDE2NiA3MzdUMTI2IDcyNFQxMDcgNzIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNCOyIgZ2x5cGgtbmFtZT0iTGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNOTIgNjIwUTkyIDY1MSAxMjEgNjUxSDEzMFExNjAgNjUxIDE2MCA2MjBWNjNINDcyUTUwMyA2MyA1MDMgMzRWMjlRNTAzIDAgNDcyIDBIOTJWNjIwWk0yNDIgLTIyNVEyMzkgLTIyOCAyMzIgLTIyOVQyMTkgLTIyOFQyMTAgLTIyMlQyMDkgLTIwOUwyNjkgLTg0UTI3NyAtNjggMjgzIC01OVQzMDkgLTUwSDMxNFEzMjggLTUwIDMzOCAtNTdUMzQ5IC03OVYtODNRMzQ5IC05MSAzNDIgLTEwMFQzMjMgLTEyNEwyNDIgLTIyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQzsiIGdseXBoLW5hbWU9Imxjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjIzOSIgZD0iTTg3IDY3NFE4NyA2NzYgOTMgNjc4VDEwOSA2ODFRMTI2IDY4MSAxMzkgNjY5VDE1MiA2MThWMEg4N1Y2NzRaTTU1IC0yMjVRNTIgLTIyOCA0NSAtMjI5VDMyIC0yMjhUMjMgLTIyMlQyMiAtMjA5TDgyIC04NFE5MCAtNjggOTYgLTU5VDEyMiAtNTBIMTI3UTE0MSAtNTAgMTUxIC01N1QxNjIgLTc5Vi04M1ExNjIgLTkxIDE1NSAtMTAwVDEzNiAtMTI0TDU1IC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Q7IiBnbHlwaC1uYW1lPSJMY2Fyb24iIGhvcml6LWFkdi14PSI1ODYiIGQ9Ik05MiA2MjBROTIgNjUxIDEyMSA2NTFIMTMwUTE2MCA2NTEgMTYwIDYyMFY2M0g0NzJRNTAzIDYzIDUwMyAzNFYyOVE1MDMgMCA0NzIgMEg5MlY2MjBaTTQ3MyA0MjJRNDcxIDQxOCA0NjUgNDE3VDQ1MiA0MTdUNDQxIDQyNFQ0NDAgNDM3TDUwMCA2MTVRNTA3IDYzMyA1MTMgNjQyVDUzOSA2NTFINTQ0UTU1NiA2NTEgNTY1IDY0MlQ1NzQgNjE1VjYxMlE1NzQgNTkwIDU1OCA1NjNMNDczIDQyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRTsiIGdseXBoLW5hbWU9ImxjYXJvbiIgaG9yaXotYWR2LXg9IjQwNyIgZD0iTTg3IDY3NFE4NyA2NzYgOTMgNjc4VDEwOSA2ODFRMTI2IDY4MSAxMzkgNjY5VDE1MiA2MThWMEg4N1Y2NzRaTTI3MyA0NTRRMjcxIDQ1MCAyNjUgNDQ5VDI1MiA0NDlUMjQxIDQ1NlQyNDAgNDY5TDMwMCA2NDdRMzA3IDY2NSAzMTMgNjc0VDMzOSA2ODNIMzQ0UTM1NiA2ODMgMzY1IDY3NFQzNzQgNjQ3VjY0NFEzNzQgNjIyIDM1OCA1OTVMMjczIDQ1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRjsiIGdseXBoLW5hbWU9Ikxkb3QiIGhvcml6LWFkdi14PSI2MDkiIGQ9Ik05MiA2MjBROTIgNjUxIDEyMSA2NTFIMTMwUTE2MCA2NTEgMTYwIDYyMFY2M0g0NzJRNTAzIDYzIDUwMyAzNFYyOVE1MDMgMCA0NzIgMEg5MlY2MjBaTTU0MiAyNzZRNDk4IDI3NiA0OTggMzIwVjMzMFE0OTggMzUxIDUwOSAzNjNUNTQyIDM3NUg1NTJRNTc0IDM3NSA1ODUgMzYzVDU5NyAzMzBWMzIwUTU5NyAyNzYgNTUyIDI3Nkg1NDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDA7IiBnbHlwaC1uYW1lPSJsZG90IiBob3Jpei1hZHYteD0iMzM3IiBkPSJNODcgNjc0UTg3IDY3NiA5MyA2NzhUMTA5IDY4MVExMjYgNjgxIDEzOSA2NjlUMTUyIDYxOFYwSDg3VjY3NFpNMjYzIDI1NlEyMTkgMjU2IDIxOSAzMDBWMzEwUTIxOSAzMzEgMjMwIDM0M1QyNjMgMzU1SDI3M1EyOTUgMzU1IDMwNiAzNDNUMzE4IDMxMFYzMDBRMzE4IDI1NiAyNzMgMjU2SDI2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MTsiIGdseXBoLW5hbWU9IkNSIiBob3Jpei1hZHYteD0iNTY1IiBkPSJNNDYgMjExUTQ0IDIwOSAzOCAyMTlUMzIgMjQxUTMyIDI1MyA0MSAyNjNUNzcgMjgyTDEyNyAyOTdWNjIwUTEyNyA2NTEgMTU2IDY1MUgxNjVRMTk1IDY1MSAxOTUgNjIwVjMxOEwzOTcgMzgwUTQwMCAzODEgNDA1IDM3MlQ0MTEgMzUwUTQxMSAzMzggNDAxIDMyOFQzNjYgMzA5TDE5NSAyNTdWNjJINDk3UTUyOCA2MiA1MjggMzNWMjhRNTI4IDAgNDk3IDBIMTY1UTE0OSAwIDEzOCAxMVQxMjcgMzhWMjM2TDQ2IDIxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MjsiIGdseXBoLW5hbWU9ImxzbGFzaCIgaG9yaXotYWR2LXg9IjM1NCIgZD0iTTQ1IDIxN1E0MyAyMTYgMzcgMjI3VDMxIDI0OFEzMSAyNTkgNDAgMjY5VDc1IDI4N0wxNDEgMzA3VjY3NFExNDEgNjc2IDE0NyA2NzhUMTYzIDY4MVExODAgNjgxIDE5MyA2NjlUMjA2IDYxOFYzMjdMMzA5IDM1OVEzMTEgMzYwIDMxNyAzNDlUMzIzIDMyOFEzMjMgMzE3IDMxNCAzMDdUMjc5IDI4OUwyMDYgMjY2VjI3UTIwNiA5IDE5OCAzVDE3NyAtNEgxNzBRMTU3IC00IDE0OSAyVDE0MSAyN1YyNDZMNDUgMjE3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgZ2x5cGgtbmFtZT0iTmFjdXRlIiBob3Jpei1hZHYteD0iNzA1IiBkPSJNOTIgNjA1UTkyIDYyNCAxMDEgNjM3VDEyOSA2NTFIMTQ2UTE2NSA2NTEgMTc1IDY0MlQxOTggNjE1TDU0OSAxMDZWNjQ3SDYxM1Y0MlE2MTMgMjIgNjA0IDlUNTc4IC00SDU3M1E1NTQgLTQgNTQ3IDJUNTI5IDIyTDE1NiA1NjFWMEg5MlY2MDVaTTMzMCA3MjJRMzI4IDcyNCAzMzggNzM4VDM2NyA3NzFUNDA4IDgxMVQ0NTUgODUwUTQ3OSA4NjggNTAxIDg2OFE1MTMgODY4IDUyMiA4NjFUNTMxIDg0MVE1MzEgODE2IDQ5NCA3OTFRNDY5IDc3NCA0NDEgNzYwVDM4OSA3MzdUMzQ5IDcyNFQzMzAgNzIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgZ2x5cGgtbmFtZT0ibmFjdXRlIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNODIgNDczUTgyIDQ3NSA4OCA0NzdUMTA0IDQ4MFExMjEgNDgwIDEzMyA0NjhUMTQ2IDQxN1Y0MDJRMTcxIDQ0MCAyMTEgNDY0VDMwOCA0ODhRMzU1IDQ4OCAzOTAgNDczVDQ0OSA0MzFUNDg1IDM2NFQ0OTcgMjc4VjBINDMyVjI3NFE0MzIgMzQ2IDM5OSAzODZUMzA0IDQyN1EyNDggNDI3IDIwOCAzOTlUMTQ3IDMyNlYwSDgyVjQ3M1pNMjUwIDU1MVEyNDggNTUzIDI1OCA1NjdUMjg3IDYwMFQzMjggNjQwVDM3NSA2NzlRMzk5IDY5NyA0MjEgNjk3UTQzMyA2OTcgNDQyIDY5MFQ0NTEgNjcwUTQ1MSA2NDUgNDE0IDYyMFEzODkgNjAzIDM2MSA1ODlUMzA5IDU2NlQyNjkgNTUzVDI1MCA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDU7IiBnbHlwaC1uYW1lPSJOY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI3MDUiIGQ9Ik05MiA2MDVROTIgNjI0IDEwMSA2MzdUMTI5IDY1MUgxNDZRMTY1IDY1MSAxNzUgNjQyVDE5OCA2MTVMNTQ5IDEwNlY2NDdINjEzVjQyUTYxMyAyMiA2MDQgOVQ1NzggLTRINTczUTU1NCAtNCA1NDcgMlQ1MjkgMjJMMTU2IDU2MVYwSDkyVjYwNVpNMjk0IC0yMjVRMjkxIC0yMjggMjg0IC0yMjlUMjcxIC0yMjhUMjYyIC0yMjJUMjYxIC0yMDlMMzIxIC04NFEzMjkgLTY4IDMzNSAtNTlUMzYxIC01MEgzNjZRMzgwIC01MCAzOTAgLTU3VDQwMSAtNzlWLTgzUTQwMSAtOTEgMzk0IC0xMDBUMzc1IC0xMjRMMjk0IC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDY7IiBnbHlwaC1uYW1lPSJuY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik04MiA0NzNRODIgNDc1IDg4IDQ3N1QxMDQgNDgwUTEyMSA0ODAgMTMzIDQ2OFQxNDYgNDE3VjQwMlExNzEgNDQwIDIxMSA0NjRUMzA4IDQ4OFEzNTUgNDg4IDM5MCA0NzNUNDQ5IDQzMVQ0ODUgMzY0VDQ5NyAyNzhWMEg0MzJWMjc0UTQzMiAzNDYgMzk5IDM4NlQzMDQgNDI3UTI0OCA0MjcgMjA4IDM5OVQxNDcgMzI2VjBIODJWNDczWk0yMjYgLTIyNVEyMjMgLTIyOCAyMTYgLTIyOVQyMDMgLTIyOFQxOTQgLTIyMlQxOTMgLTIwOUwyNTMgLTg0UTI2MSAtNjggMjY3IC01OVQyOTMgLTUwSDI5OFEzMTIgLTUwIDMyMiAtNTdUMzMzIC03OVYtODNRMzMzIC05MSAzMjYgLTEwMFQzMDcgLTEyNEwyMjYgLTIyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NzsiIGdseXBoLW5hbWU9Ik5jYXJvbiIgaG9yaXotYWR2LXg9IjcwNSIgZD0iTTkyIDYwNVE5MiA2MjQgMTAxIDYzN1QxMjkgNjUxSDE0NlExNjUgNjUxIDE3NSA2NDJUMTk4IDYxNUw1NDkgMTA2VjY0N0g2MTNWNDJRNjEzIDIyIDYwNCA5VDU3OCAtNEg1NzNRNTU0IC00IDU0NyAyVDUyOSAyMkwxNTYgNTYxVjBIOTJWNjA1Wk00NjcgODc0UTQ4OCA4NzQgNDg4IDg1MVE0ODggODMzIDQ2OSA4MDhUNDI1IDc2MFQzODEgNzIwVDM1OCA3MDRRMzU2IDcwNCAzMzYgNzIwVDI5MSA3NTlUMjQ4IDgwOFQyMjggODUxUTIyOCA4NzQgMjQ5IDg3NFEyNjYgODc0IDI5MCA4NDlUMzU5IDc2MlE0MDMgODIzIDQyNiA4NDhUNDY3IDg3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGdseXBoLW5hbWU9Im5jYXJvbiIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTgyIDQ3M1E4MiA0NzUgODggNDc3VDEwNCA0ODBRMTIxIDQ4MCAxMzMgNDY4VDE0NiA0MTdWNDAyUTE3MSA0NDAgMjExIDQ2NFQzMDggNDg4UTM1NSA0ODggMzkwIDQ3M1Q0NDkgNDMxVDQ4NSAzNjRUNDk3IDI3OFYwSDQzMlYyNzRRNDMyIDM0NiAzOTkgMzg2VDMwNCA0MjdRMjQ4IDQyNyAyMDggMzk5VDE0NyAzMjZWMEg4MlY0NzNaTTQwMiA3MDNRNDIzIDcwMyA0MjMgNjgwUTQyMyA2NjIgNDA0IDYzN1QzNjAgNTg5VDMxNiA1NDlUMjkzIDUzM1EyOTEgNTMzIDI3MSA1NDlUMjI2IDU4OFQxODMgNjM3VDE2MyA2ODBRMTYzIDcwMyAxODQgNzAzUTIwMSA3MDMgMjI1IDY3OFQyOTQgNTkxUTMzOCA2NTIgMzYxIDY3N1Q0MDIgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ5OyIgZ2x5cGgtbmFtZT0ibmFwb3N0cm9waGUiIGhvcml6LWFkdi14PSI4MDciIGQ9Ik03NCA0MzJRNzIgNDI4IDY2IDQyN1Q1MyA0MjdUNDIgNDM0VDQxIDQ0N0wxMDEgNjI1UTEwOCA2NDMgMTE0IDY1MlQxNDAgNjYxSDE0NVExNTcgNjYxIDE2NiA2NTJUMTc1IDYyNVY2MjJRMTc1IDYwMCAxNTkgNTczTDc0IDQzMlpNMzE0IDQ3M1EzMTQgNDc1IDMyMCA0NzdUMzM2IDQ4MFEzNTMgNDgwIDM2NSA0NjhUMzc4IDQxN1Y0MDJRNDAzIDQ0MCA0NDMgNDY0VDU0MCA0ODhRNTg3IDQ4OCA2MjIgNDczVDY4MSA0MzFUNzE3IDM2NFQ3MjkgMjc4VjBINjY0VjI3NFE2NjQgMzQ2IDYzMSAzODZUNTM2IDQyN1E0ODAgNDI3IDQ0MCAzOTlUMzc5IDMyNlYwSDMxNFY0NzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEM7IiBnbHlwaC1uYW1lPSJPbWFjcm9uIiBob3Jpei1hZHYteD0iNzc0IiBkPSJNMzg2IC0xMlEzMTUgLTEyIDI1NiAxMlQxNTUgODFUODkgMTg2VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODggNjU5UTQ1OSA2NTkgNTE4IDYzNVQ2MTkgNTY2VDY4NSA0NjBUNzA5IDMyNFE3MDkgMjUwIDY4NSAxODhUNjE5IDgyVDUxNyAxM1QzODYgLTEyWk0zODggNDdRNDQzIDQ3IDQ4OSA2N1Q1NjggMTIzVDYyMCAyMTBUNjM5IDMyMlE2MzkgMzgyIDYyMCA0MzNUNTY4IDUyMVQ0ODggNTc5VDM4NiA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNiA1MjNUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjMgMTU0IDIxMlQyMDYgMTI1VDI4NiA2OFQzODggNDdaTTI5OSA3MzlRMjYwIDczOSAyNjAgNzY4Vjc3M1EyNjAgNzg3IDI3MCA3OTRUMjk5IDgwMUg1MDdRNTQ2IDgwMSA1NDYgNzczVjc2OFE1NDYgNzM5IDUwNyA3MzlIMjk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTREOyIgZ2x5cGgtbmFtZT0ib21hY3JvbiIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTI5NiAtMTJRMjQyIC0xMiAxOTcgN1QxMjAgNTlUNjkgMTM5VDUwIDIzOVE1MCAyOTMgNjggMzM4VDExOSA0MTdUMTk3IDQ2OVQyOTYgNDg4UTM0OSA0ODggMzk0IDQ2OVQ0NzEgNDE3VDUyMiAzMzdUNTQxIDIzN1E1NDEgMTgzIDUyMyAxMzhUNDcyIDU5VDM5NCA3VDI5NiAtMTJaTTI5NiA0NVEzMzQgNDUgMzY3IDU5VDQyNCA5OVQ0NjEgMTYwVDQ3NSAyMzdRNDc1IDI3OSA0NjIgMzE0VDQyNCAzNzZUMzY4IDQxNlQyOTYgNDMxUTI1NyA0MzEgMjI0IDQxN1QxNjcgMzc3VDEzMCAzMTZUMTE2IDIzOVExMTYgMTk3IDEyOSAxNjJUMTY3IDEwMFQyMjQgNjBUMjk2IDQ1Wk0yMDMgNTY4UTE2NCA1NjggMTY0IDU5N1Y2MDJRMTY0IDYxNiAxNzQgNjIzVDIwMyA2MzBINDExUTQ1MCA2MzAgNDUwIDYwMlY1OTdRNDUwIDU2OCA0MTEgNTY4SDIwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RTsiIGdseXBoLW5hbWU9Ik9icmV2ZSIgaG9yaXotYWR2LXg9Ijc3NCIgZD0iTTM4NiAtMTJRMzE1IC0xMiAyNTYgMTJUMTU1IDgxVDg5IDE4NlQ2NSAzMjJRNjUgMzk2IDg5IDQ1OFQxNTUgNTY0VDI1NyA2MzRUMzg4IDY1OVE0NTkgNjU5IDUxOCA2MzVUNjE5IDU2NlQ2ODUgNDYwVDcwOSAzMjRRNzA5IDI1MCA2ODUgMTg4VDYxOSA4MlQ1MTcgMTNUMzg2IC0xMlpNMzg4IDQ3UTQ0MyA0NyA0ODkgNjdUNTY4IDEyM1Q2MjAgMjEwVDYzOSAzMjJRNjM5IDM4MiA2MjAgNDMzVDU2OCA1MjFUNDg4IDU3OVQzODYgNjAwUTMzMSA2MDAgMjg1IDU4MFQyMDYgNTIzVDE1NCA0MzZUMTM1IDMyNFExMzUgMjYzIDE1NCAyMTJUMjA2IDEyNVQyODYgNjhUMzg4IDQ3Wk0zOTQgNzE5UTM3MyA3MTkgMzQ4IDczMFQzMDIgNzU3VDI2NyA3OTFUMjUzIDgyNFEyNTMgODUzIDI4MiA4NTNRMjg5IDg1MyAzMDIgODQ0VDMzMCA4MjJUMzYyIDc5MlQzOTYgNzYyUTQxMSA3NzYgNDI3IDc5MlQ0NTggODIxVDQ4NSA4NDRUNTA2IDg1M1E1MzUgODUzIDUzNSA4MjRRNTM1IDgwOSA1MjEgNzkxVDQ4NSA3NTZUNDM5IDczMFQzOTQgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRGOyIgZ2x5cGgtbmFtZT0ib2JyZXZlIiBob3Jpei1hZHYteD0iNTkyIiBkPSJNMjk2IC0xMlEyNDIgLTEyIDE5NyA3VDEyMCA1OVQ2OSAxMzlUNTAgMjM5UTUwIDI5MyA2OCAzMzhUMTE5IDQxN1QxOTcgNDY5VDI5NiA0ODhRMzQ5IDQ4OCAzOTQgNDY5VDQ3MSA0MTdUNTIyIDMzN1Q1NDEgMjM3UTU0MSAxODMgNTIzIDEzOFQ0NzIgNTlUMzk0IDdUMjk2IC0xMlpNMjk2IDQ1UTMzNCA0NSAzNjcgNTlUNDI0IDk5VDQ2MSAxNjBUNDc1IDIzN1E0NzUgMjc5IDQ2MiAzMTRUNDI0IDM3NlQzNjggNDE2VDI5NiA0MzFRMjU3IDQzMSAyMjQgNDE3VDE2NyAzNzdUMTMwIDMxNlQxMTYgMjM5UTExNiAxOTcgMTI5IDE2MlQxNjcgMTAwVDIyNCA2MFQyOTYgNDVaTTMwNiA1NDhRMjg1IDU0OCAyNjAgNTU5VDIxNCA1ODZUMTc5IDYyMFQxNjUgNjUzUTE2NSA2ODIgMTk0IDY4MlEyMDEgNjgyIDIxNCA2NzNUMjQyIDY1MVQyNzQgNjIxVDMwOCA1OTFRMzIzIDYwNSAzMzkgNjIxVDM3MCA2NTBUMzk3IDY3M1Q0MTggNjgyUTQ0NyA2ODIgNDQ3IDY1M1E0NDcgNjM4IDQzMyA2MjBUMzk3IDU4NVQzNTEgNTU5VDMwNiA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTA7IiBnbHlwaC1uYW1lPSJPaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNzc0IiBkPSJNMzg2IC0xMlEzMTUgLTEyIDI1NiAxMlQxNTUgODFUODkgMTg2VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODggNjU5UTQ1OSA2NTkgNTE4IDYzNVQ2MTkgNTY2VDY4NSA0NjBUNzA5IDMyNFE3MDkgMjUwIDY4NSAxODhUNjE5IDgyVDUxNyAxM1QzODYgLTEyWk0zODggNDdRNDQzIDQ3IDQ4OSA2N1Q1NjggMTIzVDYyMCAyMTBUNjM5IDMyMlE2MzkgMzgyIDYyMCA0MzNUNTY4IDUyMVQ0ODggNTc5VDM4NiA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNiA1MjNUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjMgMTU0IDIxMlQyMDYgMTI1VDI4NiA2OFQzODggNDdaTTQzMyA3MjJRNDMxIDcyNCA0NDEgNzM4VDQ3MCA3NzFUNTExIDgxMVQ1NTggODUwUTU4MiA4NjggNjA0IDg2OFE2MTYgODY4IDYyNSA4NjFUNjM0IDg0MVE2MzQgODE2IDU5NyA3OTFRNTcyIDc3NCA1NDQgNzYwVDQ5MiA3MzdUNDUyIDcyNFQ0MzMgNzIyWk0yNTQgNzIyUTI1MiA3MjQgMjYyIDczOFQyOTEgNzcxVDMzMiA4MTFUMzc5IDg1MFE0MDMgODY4IDQyNSA4NjhRNDM3IDg2OCA0NDYgODYxVDQ1NSA4NDFRNDU1IDgxNiA0MTggNzkxUTM5MyA3NzQgMzY1IDc2MFQzMTMgNzM3VDI3MyA3MjRUMjU0IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MTsiIGdseXBoLW5hbWU9Im9odW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI1OTIiIGQ9Ik0yOTYgLTEyUTI0MiAtMTIgMTk3IDdUMTIwIDU5VDY5IDEzOVQ1MCAyMzlRNTAgMjkzIDY4IDMzOFQxMTkgNDE3VDE5NyA0NjlUMjk2IDQ4OFEzNDkgNDg4IDM5NCA0NjlUNDcxIDQxN1Q1MjIgMzM3VDU0MSAyMzdRNTQxIDE4MyA1MjMgMTM4VDQ3MiA1OVQzOTQgN1QyOTYgLTEyWk0yOTYgNDVRMzM0IDQ1IDM2NyA1OVQ0MjQgOTlUNDYxIDE2MFQ0NzUgMjM3UTQ3NSAyNzkgNDYyIDMxNFQ0MjQgMzc2VDM2OCA0MTZUMjk2IDQzMVEyNTcgNDMxIDIyNCA0MTdUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDBUMjI0IDYwVDI5NiA0NVpNMzE0IDU1MVEzMTIgNTUzIDMyMiA1NjdUMzUxIDYwMFQzOTIgNjQwVDQzOSA2NzlRNDYzIDY5NyA0ODUgNjk3UTQ5NyA2OTcgNTA2IDY5MFQ1MTUgNjcwUTUxNSA2NDUgNDc4IDYyMFE0NTMgNjAzIDQyNSA1ODlUMzczIDU2NlQzMzMgNTUzVDMxNCA1NTFaTTEzNSA1NTFRMTMzIDU1MyAxNDMgNTY3VDE3MiA2MDBUMjEzIDY0MFQyNjAgNjc5UTI4NCA2OTcgMzA2IDY5N1EzMTggNjk3IDMyNyA2OTBUMzM2IDY3MFEzMzYgNjQ1IDI5OSA2MjBRMjc0IDYwMyAyNDYgNTg5VDE5NCA1NjZUMTU0IDU1M1QxMzUgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUyOyIgZ2x5cGgtbmFtZT0iT0UiIGhvcml6LWFkdi14PSIxMDYxIiBkPSJNMzg2IC0xMlEzMTUgLTEyIDI1NiAxMlQxNTUgODFUODkgMTg2VDY1IDMyMlE2NSAzOTYgODkgNDU4VDE1NSA1NjRUMjU3IDYzNFQzODggNjU5UTQzNyA2NTkgNDgyIDY0N0g5OTlWNTg1SDU5OVE2NDUgNTQ1IDY3MyA0ODlUNzA3IDM2Mkg5MjhWMzAySDcwOFE3MDQgMjI2IDY3NiAxNjVUNTk4IDYySDEwMDVWMEg0NzhRNDU2IC01IDQzMyAtOFQzODYgLTEyWk0zODggNDdRNDQzIDQ3IDQ4OSA2N1Q1NjggMTIzVDYyMCAyMTBUNjM5IDMyMlE2MzkgMzgyIDYyMCA0MzNUNTY4IDUyMVQ0ODggNTc5VDM4NiA2MDBRMzMxIDYwMCAyODUgNTgwVDIwNiA1MjNUMTU0IDQzNlQxMzUgMzI0UTEzNSAyNjMgMTU0IDIxMlQyMDYgMTI1VDI4NiA2OFQzODggNDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTM7IiBnbHlwaC1uYW1lPSJvZSIgaG9yaXotYWR2LXg9Ijk4NSIgZD0iTTI5NiAtMTJRMjQyIC0xMiAxOTcgN1QxMjAgNTlUNjkgMTM5VDUwIDIzOVE1MCAyOTMgNjggMzM4VDExOSA0MTdUMTk3IDQ2OVQyOTYgNDg4UTM2OCA0ODggNDIzIDQ1NFQ1MDcgMzYxUTUzNiA0MjAgNTg5IDQ1NFQ3MTQgNDg4UTc2NCA0ODggODA1IDQ3MVQ4NzUgNDIzVDkyMCAzNDdUOTM2IDI0OFYyNDJROTM2IDIyOCA5MzAgMjI0VDkwOSAyMjBINTM5UTU0MSAxODIgNTU1IDE1MFQ1OTMgOTVUNjQ5IDU5VDcyMCA0NlE3NTUgNDYgNzgxIDUzVDgyNiA3MVQ4NTggOThUODgzIDEzMVE4ODQgMTMyIDg5MCAxMzFUOTAzIDEyNlQ5MTUgMTE0VDkyMSA5NFE5MjEgODIgOTA4IDY0VDg2OSAyOVQ4MDYgMFQ3MjAgLTEyUTY0NCAtMTIgNTg5IDIwVDUwNCAxMTJRNDc1IDU1IDQyMiAyMlQyOTYgLTEyWk0yOTYgNDVRMzM0IDQ1IDM2NyA1OVQ0MjQgOTlUNDYxIDE2MFQ0NzUgMjM3UTQ3NSAyNzkgNDYyIDMxNFQ0MjQgMzc2VDM2OCA0MTZUMjk2IDQzMVEyNTcgNDMxIDIyNCA0MTdUMTY3IDM3N1QxMzAgMzE2VDExNiAyMzlRMTE2IDE5NyAxMjkgMTYyVDE2NyAxMDBUMjI0IDYwVDI5NiA0NVpNNzE0IDQzMVE2ODAgNDMxIDY1MSA0MjBUNTk5IDM4OFQ1NjEgMzM5VDU0MSAyNzZIODY3UTg2MiAzNDcgODIyIDM4OVQ3MTQgNDMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU0OyIgZ2x5cGgtbmFtZT0iUmFjdXRlIiBob3Jpei1hZHYteD0iNTk3IiBkPSJNNTQxIDQ2MFE1NDEgMzY5IDQ4NCAzMjFUMzI3IDI3Mkw1MzMgMjhRNTM0IDI2IDUzMiAyMVQ1MjUgMTFUNTExIDFUNDkyIC00UTQ4MiAtNCA0NzIgMVQ0NTAgMjBMMjQwIDI3MkgxNTlWMEg5MlY2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0gzMDhRNDIyIDY0NyA0ODEgNjAxVDU0MSA0NjBaTTMxNCAzMzBRMzk1IDMzMCA0MzMgMzY1VDQ3MSA0NThRNDcxIDU4NiAzMTAgNTg2SDE1OVYzMzBIMzE0Wk0yNDMgNzIyUTI0MSA3MjQgMjUxIDczOFQyODAgNzcxVDMyMSA4MTFUMzY4IDg1MFEzOTIgODY4IDQxNCA4NjhRNDI2IDg2OCA0MzUgODYxVDQ0NCA4NDFRNDQ0IDgxNiA0MDcgNzkxUTM4MiA3NzQgMzU0IDc2MFQzMDIgNzM3VDI2MiA3MjRUMjQzIDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGdseXBoLW5hbWU9InJhY3V0ZSIgaG9yaXotYWR2LXg9IjM2OCIgZD0iTTgyIDQ3M1E4MiA0NzUgODggNDc3VDEwNCA0ODBRMTIxIDQ4MCAxMzMgNDY4VDE0NiA0MTdWMzg4UTE3OCA0ODggMjcyIDQ4OFEzMDUgNDg4IDMyMyA0NzVUMzQxIDQzOVEzNDEgNDIxIDMzMyA0MTJUMzIzIDQwNVEzMTIgNDE0IDI5OSA0MTlUMjY1IDQyNVEyMzMgNDI1IDIxMSA0MDlUMTc0IDM2NVQxNTQgMjk5VDE0NyAyMTRWMEg4MlY0NzNaTTE0OSA1NTFRMTQ3IDU1MyAxNTcgNTY3VDE4NiA2MDBUMjI3IDY0MFQyNzQgNjc5UTI5OCA2OTcgMzIwIDY5N1EzMzIgNjk3IDM0MSA2OTBUMzUwIDY3MFEzNTAgNjQ1IDMxMyA2MjBRMjg4IDYwMyAyNjAgNTg5VDIwOCA1NjZUMTY4IDU1M1QxNDkgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU2OyIgZ2x5cGgtbmFtZT0iUmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTk3IiBkPSJNNTQxIDQ2MFE1NDEgMzY5IDQ4NCAzMjFUMzI3IDI3Mkw1MzMgMjhRNTM0IDI2IDUzMiAyMVQ1MjUgMTFUNTExIDFUNDkyIC00UTQ4MiAtNCA0NzIgMVQ0NTAgMjBMMjQwIDI3MkgxNTlWMEg5MlY2MDlROTIgNjI1IDEwMyA2MzZUMTMwIDY0N0gzMDhRNDIyIDY0NyA0ODEgNjAxVDU0MSA0NjBaTTMxNCAzMzBRMzk1IDMzMCA0MzMgMzY1VDQ3MSA0NThRNDcxIDU4NiAzMTAgNTg2SDE1OVYzMzBIMzE0Wk0yMzYgLTIyNVEyMzMgLTIyOCAyMjYgLTIyOVQyMTMgLTIyOFQyMDQgLTIyMlQyMDMgLTIwOUwyNjMgLTg0UTI3MSAtNjggMjc3IC01OVQzMDMgLTUwSDMwOFEzMjIgLTUwIDMzMiAtNTdUMzQzIC03OVYtODNRMzQzIC05MSAzMzYgLTEwMFQzMTcgLTEyNEwyMzYgLTIyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NzsiIGdseXBoLW5hbWU9InJjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjM2OCIgZD0iTTgyIDQ3M1E4MiA0NzUgODggNDc3VDEwNCA0ODBRMTIxIDQ4MCAxMzMgNDY4VDE0NiA0MTdWMzg4UTE3OCA0ODggMjcyIDQ4OFEzMDUgNDg4IDMyMyA0NzVUMzQxIDQzOVEzNDEgNDIxIDMzMyA0MTJUMzIzIDQwNVEzMTIgNDE0IDI5OSA0MTlUMjY1IDQyNVEyMzMgNDI1IDIxMSA0MDlUMTc0IDM2NVQxNTQgMjk5VDE0NyAyMTRWMEg4MlY0NzNaTTQzIC0yMjVRNDAgLTIyOCAzMyAtMjI5VDIwIC0yMjhUMTEgLTIyMlQxMCAtMjA5TDcwIC04NFE3OCAtNjggODQgLTU5VDExMCAtNTBIMTE1UTEyOSAtNTAgMTM5IC01N1QxNTAgLTc5Vi04M1ExNTAgLTkxIDE0MyAtMTAwVDEyNCAtMTI0TDQzIC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTg7IiBnbHlwaC1uYW1lPSJSY2Fyb24iIGhvcml6LWFkdi14PSI1OTciIGQ9Ik01NDEgNDYwUTU0MSAzNjkgNDg0IDMyMVQzMjcgMjcyTDUzMyAyOFE1MzQgMjYgNTMyIDIxVDUyNSAxMVQ1MTEgMVQ0OTIgLTRRNDgyIC00IDQ3MiAxVDQ1MCAyMEwyNDAgMjcySDE1OVYwSDkyVjYwOVE5MiA2MjUgMTAzIDYzNlQxMzAgNjQ3SDMwOFE0MjIgNjQ3IDQ4MSA2MDFUNTQxIDQ2MFpNMzE0IDMzMFEzOTUgMzMwIDQzMyAzNjVUNDcxIDQ1OFE0NzEgNTg2IDMxMCA1ODZIMTU5VjMzMEgzMTRaTTM5OCA4NzRRNDE5IDg3NCA0MTkgODUxUTQxOSA4MzMgNDAwIDgwOFQzNTYgNzYwVDMxMiA3MjBUMjg5IDcwNFEyODcgNzA0IDI2NyA3MjBUMjIyIDc1OVQxNzkgODA4VDE1OSA4NTFRMTU5IDg3NCAxODAgODc0UTE5NyA4NzQgMjIxIDg0OVQyOTAgNzYyUTMzNCA4MjMgMzU3IDg0OFQzOTggODc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU5OyIgZ2x5cGgtbmFtZT0icmNhcm9uIiBob3Jpei1hZHYteD0iMzY4IiBkPSJNODIgNDczUTgyIDQ3NSA4OCA0NzdUMTA0IDQ4MFExMjEgNDgwIDEzMyA0NjhUMTQ2IDQxN1YzODhRMTc4IDQ4OCAyNzIgNDg4UTMwNSA0ODggMzIzIDQ3NVQzNDEgNDM5UTM0MSA0MjEgMzMzIDQxMlQzMjMgNDA1UTMxMiA0MTQgMjk5IDQxOVQyNjUgNDI1UTIzMyA0MjUgMjExIDQwOVQxNzQgMzY1VDE1NCAyOTlUMTQ3IDIxNFYwSDgyVjQ3M1pNMzIyIDcwM1EzNDMgNzAzIDM0MyA2ODBRMzQzIDY2MiAzMjQgNjM3VDI4MCA1ODlUMjM2IDU0OVQyMTMgNTMzUTIxMSA1MzMgMTkxIDU0OVQxNDYgNTg4VDEwMyA2MzdUODMgNjgwUTgzIDcwMyAxMDQgNzAzUTEyMSA3MDMgMTQ1IDY3OFQyMTQgNTkxUTI1OCA2NTIgMjgxIDY3N1QzMjIgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVBOyIgZ2x5cGgtbmFtZT0iU2FjdXRlIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjg5IC0xMlEyMTYgLTEyIDE2MyAxMFQ4MSA2MlE1MiA5MSA1MiAxMTVRNTIgMTI2IDU4IDEzNFQ3MSAxNDdUODUgMTU1VDkyIDE1NlExMTggMTExIDE2NyA3OVQyODggNDdRMzYzIDQ3IDQwNSA3OFQ0NDcgMTY3UTQ0NyAxOTkgNDMzIDIyMFQzOTMgMjU1VDMzNiAyNzlUMjY5IDI5N1EyMzIgMzA2IDE5NyAzMTdUMTMzIDM0OVQ4OCA0MDFUNzAgNDgxUTcwIDUxOSA4NiA1NTFUMTMyIDYwOFQyMDAgNjQ1VDI4NyA2NTlRMzU1IDY1OSA0MDMgNjM5VDQ3NiA1OTRRNTAxIDU2OSA1MDEgNTQ3UTUwMSA1MzYgNDk1IDUyOFQ0ODIgNTE1VDQ2OCA1MDdUNDYxIDUwNlE0MzggNTQ2IDM5MyA1NzNUMjg4IDYwMFEyMjAgNjAwIDE3OCA1NjhUMTM2IDQ4M1ExMzYgNDUyIDE0OCA0MzJUMTgyIDM5OVQyMzQgMzc4VDMwMiAzNjBRMzQxIDM1MSAzNzkgMzM4VDQ0NyAzMDRUNDk1IDI1MVQ1MTQgMTcwUTUxNCAxMjkgNDk4IDk2VDQ1MyAzOFQzODIgMVQyODkgLTEyWk0yMjQgNzIyUTIyMiA3MjQgMjMyIDczOFQyNjEgNzcxVDMwMiA4MTFUMzQ5IDg1MFEzNzMgODY4IDM5NSA4NjhRNDA3IDg2OCA0MTYgODYxVDQyNSA4NDFRNDI1IDgxNiAzODggNzkxUTM2MyA3NzQgMzM1IDc2MFQyODMgNzM3VDI0MyA3MjRUMjI0IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QjsiIGdseXBoLW5hbWU9InNhY3V0ZSIgaG9yaXotYWR2LXg9IjQ4NCIgZD0iTTI0MiAtMTJRMTc5IC0xMiAxMzUgNVQ2OCA0NVE0NiA2NyA0NiA4NVE0NiA5NSA1MSAxMDJUNjIgMTEzVDc0IDExOVQ4MSAxMjBRMTA1IDg3IDE0NCA2NVQyNDQgNDNRMzA0IDQzIDMzNSA2NVQzNjcgMTIzUTM2NyAxNDQgMzU4IDE1OFQzMzEgMTgxVDI4NyAxOTdUMjI3IDIxMVExOTkgMjE3IDE3MCAyMjVUMTE2IDI0N1Q3NiAyODVUNjAgMzQ0UTYwIDM3NiA3MyA0MDJUMTEwIDQ0OFQxNjcgNDc3VDI0MiA0ODhRMzAxIDQ4OCAzMzkgNDczVDM5OCA0MzdRNDE4IDQxNyA0MTggMzk3UTQxOCAzODggNDEzIDM4MVQ0MDEgMzcwVDM4OSAzNjRUMzgyIDM2M1EzNjIgMzk0IDMyNyA0MTNUMjQyIDQzM1ExODMgNDMzIDE1MyA0MTFUMTIyIDM1M1ExMjIgMzE1IDE1NSAyOTlUMjU1IDI2OVEyODQgMjYzIDMxNSAyNTVUMzcxIDIzMlQ0MTMgMTk0VDQzMCAxMzNRNDMwIDY3IDM4MCAyOFQyNDIgLTEyWk0xOTEgNTUxUTE4OSA1NTMgMTk5IDU2N1QyMjggNjAwVDI2OSA2NDBUMzE2IDY3OVEzNDAgNjk3IDM2MiA2OTdRMzc0IDY5NyAzODMgNjkwVDM5MiA2NzBRMzkyIDY0NSAzNTUgNjIwUTMzMCA2MDMgMzAyIDU4OVQyNTAgNTY2VDIxMCA1NTNUMTkxIDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QzsiIGdseXBoLW5hbWU9IlNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjg5IC0xMlEyMTYgLTEyIDE2MyAxMFQ4MSA2MlE1MiA5MSA1MiAxMTVRNTIgMTI2IDU4IDEzNFQ3MSAxNDdUODUgMTU1VDkyIDE1NlExMTggMTExIDE2NyA3OVQyODggNDdRMzYzIDQ3IDQwNSA3OFQ0NDcgMTY3UTQ0NyAxOTkgNDMzIDIyMFQzOTMgMjU1VDMzNiAyNzlUMjY5IDI5N1EyMzIgMzA2IDE5NyAzMTdUMTMzIDM0OVQ4OCA0MDFUNzAgNDgxUTcwIDUxOSA4NiA1NTFUMTMyIDYwOFQyMDAgNjQ1VDI4NyA2NTlRMzU1IDY1OSA0MDMgNjM5VDQ3NiA1OTRRNTAxIDU2OSA1MDEgNTQ3UTUwMSA1MzYgNDk1IDUyOFQ0ODIgNTE1VDQ2OCA1MDdUNDYxIDUwNlE0MzggNTQ2IDM5MyA1NzNUMjg4IDYwMFEyMjAgNjAwIDE3OCA1NjhUMTM2IDQ4M1ExMzYgNDUyIDE0OCA0MzJUMTgyIDM5OVQyMzQgMzc4VDMwMiAzNjBRMzQxIDM1MSAzNzkgMzM4VDQ0NyAzMDRUNDk1IDI1MVQ1MTQgMTcwUTUxNCAxMjkgNDk4IDk2VDQ1MyAzOFQzODIgMVQyODkgLTEyWk0xODYgNzIwUTE2NCA3MjAgMTY0IDc0M1ExNjQgNzYxIDE4NCA3ODZUMjI4IDgzNFQyNzIgODc0VDI5NSA4OTBRMjk3IDg5MCAzMTcgODc0VDM2MiA4MzVUNDA1IDc4NlQ0MjUgNzQzUTQyNSA3MjAgNDA0IDcyMFEzODcgNzIwIDM2MyA3NDVUMjk0IDgzMlEyNzEgODAxIDI1NSA3ODBUMjI2IDc0NlQyMDQgNzI2VDE4NiA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUQ7IiBnbHlwaC1uYW1lPSJzY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ4NCIgZD0iTTI0MiAtMTJRMTc5IC0xMiAxMzUgNVQ2OCA0NVE0NiA2NyA0NiA4NVE0NiA5NSA1MSAxMDJUNjIgMTEzVDc0IDExOVQ4MSAxMjBRMTA1IDg3IDE0NCA2NVQyNDQgNDNRMzA0IDQzIDMzNSA2NVQzNjcgMTIzUTM2NyAxNDQgMzU4IDE1OFQzMzEgMTgxVDI4NyAxOTdUMjI3IDIxMVExOTkgMjE3IDE3MCAyMjVUMTE2IDI0N1Q3NiAyODVUNjAgMzQ0UTYwIDM3NiA3MyA0MDJUMTEwIDQ0OFQxNjcgNDc3VDI0MiA0ODhRMzAxIDQ4OCAzMzkgNDczVDM5OCA0MzdRNDE4IDQxNyA0MTggMzk3UTQxOCAzODggNDEzIDM4MVQ0MDEgMzcwVDM4OSAzNjRUMzgyIDM2M1EzNjIgMzk0IDMyNyA0MTNUMjQyIDQzM1ExODMgNDMzIDE1MyA0MTFUMTIyIDM1M1ExMjIgMzE1IDE1NSAyOTlUMjU1IDI2OVEyODQgMjYzIDMxNSAyNTVUMzcxIDIzMlQ0MTMgMTk0VDQzMCAxMzNRNDMwIDY3IDM4MCAyOFQyNDIgLTEyWk0xMzUgNTQ5UTExMyA1NDkgMTEzIDU3MlExMTMgNTkwIDEzMyA2MTVUMTc3IDY2M1QyMjEgNzAzVDI0NCA3MTlRMjQ2IDcxOSAyNjYgNzAzVDMxMSA2NjRUMzU0IDYxNVQzNzQgNTcyUTM3NCA1NDkgMzUzIDU0OVEzMzYgNTQ5IDMxMiA1NzRUMjQzIDY2MVEyMjAgNjMwIDIwNCA2MDlUMTc1IDU3NVQxNTMgNTU1VDEzNSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUU7IiBnbHlwaC1uYW1lPSJTY2VkaWxsYSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTI4OSAtMTJRMjE2IC0xMiAxNjMgMTBUODEgNjJRNTIgOTEgNTIgMTE1UTUyIDEyNiA1OCAxMzRUNzEgMTQ3VDg1IDE1NVQ5MiAxNTZRMTE4IDExMSAxNjcgNzlUMjg4IDQ3UTM2MyA0NyA0MDUgNzhUNDQ3IDE2N1E0NDcgMTk5IDQzMyAyMjBUMzkzIDI1NVQzMzYgMjc5VDI2OSAyOTdRMjMyIDMwNiAxOTcgMzE3VDEzMyAzNDlUODggNDAxVDcwIDQ4MVE3MCA1MTkgODYgNTUxVDEzMiA2MDhUMjAwIDY0NVQyODcgNjU5UTM1NSA2NTkgNDAzIDYzOVQ0NzYgNTk0UTUwMSA1NjkgNTAxIDU0N1E1MDEgNTM2IDQ5NSA1MjhUNDgyIDUxNVQ0NjggNTA3VDQ2MSA1MDZRNDM4IDU0NiAzOTMgNTczVDI4OCA2MDBRMjIwIDYwMCAxNzggNTY4VDEzNiA0ODNRMTM2IDQ1MiAxNDggNDMyVDE4MiAzOTlUMjM0IDM3OFQzMDIgMzYwUTM0MSAzNTEgMzc5IDMzOFQ0NDcgMzA0VDQ5NSAyNTFUNTE0IDE3MFE1MTQgMTI5IDQ5OCA5NlQ0NTMgMzhUMzgyIDFUMjg5IC0xMlpNMjEwIC0yMjVRMjA3IC0yMjggMjAwIC0yMjlUMTg3IC0yMjhUMTc4IC0yMjJUMTc3IC0yMDlMMjM3IC04NFEyNDUgLTY4IDI1MSAtNTlUMjc3IC01MEgyODJRMjk2IC01MCAzMDYgLTU3VDMxNyAtNzlWLTgzUTMxNyAtOTEgMzEwIC0xMDBUMjkxIC0xMjRMMjEwIC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUY7IiBnbHlwaC1uYW1lPSJzY2VkaWxsYSIgaG9yaXotYWR2LXg9IjQ4NCIgZD0iTTI0MiAtMTJRMTc5IC0xMiAxMzUgNVQ2OCA0NVE0NiA2NyA0NiA4NVE0NiA5NSA1MSAxMDJUNjIgMTEzVDc0IDExOVQ4MSAxMjBRMTA1IDg3IDE0NCA2NVQyNDQgNDNRMzA0IDQzIDMzNSA2NVQzNjcgMTIzUTM2NyAxNDQgMzU4IDE1OFQzMzEgMTgxVDI4NyAxOTdUMjI3IDIxMVExOTkgMjE3IDE3MCAyMjVUMTE2IDI0N1Q3NiAyODVUNjAgMzQ0UTYwIDM3NiA3MyA0MDJUMTEwIDQ0OFQxNjcgNDc3VDI0MiA0ODhRMzAxIDQ4OCAzMzkgNDczVDM5OCA0MzdRNDE4IDQxNyA0MTggMzk3UTQxOCAzODggNDEzIDM4MVQ0MDEgMzcwVDM4OSAzNjRUMzgyIDM2M1EzNjIgMzk0IDMyNyA0MTNUMjQyIDQzM1ExODMgNDMzIDE1MyA0MTFUMTIyIDM1M1ExMjIgMzE1IDE1NSAyOTlUMjU1IDI2OVEyODQgMjYzIDMxNSAyNTVUMzcxIDIzMlQ0MTMgMTk0VDQzMCAxMzNRNDMwIDY3IDM4MCAyOFQyNDIgLTEyWk0xNjggLTIyNVExNjUgLTIyOCAxNTggLTIyOVQxNDUgLTIyOFQxMzYgLTIyMlQxMzUgLTIwOUwxOTUgLTg0UTIwMyAtNjggMjA5IC01OVQyMzUgLTUwSDI0MFEyNTQgLTUwIDI2NCAtNTdUMjc1IC03OVYtODNRMjc1IC05MSAyNjggLTEwMFQyNDkgLTEyNEwxNjggLTIyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGdseXBoLW5hbWU9IlNjYXJvbiIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTI4OSAtMTJRMjE2IC0xMiAxNjMgMTBUODEgNjJRNTIgOTEgNTIgMTE1UTUyIDEyNiA1OCAxMzRUNzEgMTQ3VDg1IDE1NVQ5MiAxNTZRMTE4IDExMSAxNjcgNzlUMjg4IDQ3UTM2MyA0NyA0MDUgNzhUNDQ3IDE2N1E0NDcgMTk5IDQzMyAyMjBUMzkzIDI1NVQzMzYgMjc5VDI2OSAyOTdRMjMyIDMwNiAxOTcgMzE3VDEzMyAzNDlUODggNDAxVDcwIDQ4MVE3MCA1MTkgODYgNTUxVDEzMiA2MDhUMjAwIDY0NVQyODcgNjU5UTM1NSA2NTkgNDAzIDYzOVQ0NzYgNTk0UTUwMSA1NjkgNTAxIDU0N1E1MDEgNTM2IDQ5NSA1MjhUNDgyIDUxNVQ0NjggNTA3VDQ2MSA1MDZRNDM4IDU0NiAzOTMgNTczVDI4OCA2MDBRMjIwIDYwMCAxNzggNTY4VDEzNiA0ODNRMTM2IDQ1MiAxNDggNDMyVDE4MiAzOTlUMjM0IDM3OFQzMDIgMzYwUTM0MSAzNTEgMzc5IDMzOFQ0NDcgMzA0VDQ5NSAyNTFUNTE0IDE3MFE1MTQgMTI5IDQ5OCA5NlQ0NTMgMzhUMzgyIDFUMjg5IC0xMlpNMzk4IDg3M1E0MTkgODczIDQxOSA4NTBRNDE5IDgzMiA0MDAgODA3VDM1NiA3NTlUMzEyIDcxOVQyODkgNzAzUTI4NyA3MDMgMjY3IDcxOVQyMjIgNzU4VDE3OSA4MDdUMTU5IDg1MFExNTkgODczIDE4MCA4NzNRMTk3IDg3MyAyMjEgODQ4VDI5MCA3NjFRMzM0IDgyMiAzNTcgODQ3VDM5OCA4NzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjE7IiBnbHlwaC1uYW1lPSJzY2Fyb24iIGhvcml6LWFkdi14PSI0ODQiIGQ9Ik0yNDIgLTEyUTE3OSAtMTIgMTM1IDVUNjggNDVRNDYgNjcgNDYgODVRNDYgOTUgNTEgMTAyVDYyIDExM1Q3NCAxMTlUODEgMTIwUTEwNSA4NyAxNDQgNjVUMjQ0IDQzUTMwNCA0MyAzMzUgNjVUMzY3IDEyM1EzNjcgMTQ0IDM1OCAxNThUMzMxIDE4MVQyODcgMTk3VDIyNyAyMTFRMTk5IDIxNyAxNzAgMjI1VDExNiAyNDdUNzYgMjg1VDYwIDM0NFE2MCAzNzYgNzMgNDAyVDExMCA0NDhUMTY3IDQ3N1QyNDIgNDg4UTMwMSA0ODggMzM5IDQ3M1QzOTggNDM3UTQxOCA0MTcgNDE4IDM5N1E0MTggMzg4IDQxMyAzODFUNDAxIDM3MFQzODkgMzY0VDM4MiAzNjNRMzYyIDM5NCAzMjcgNDEzVDI0MiA0MzNRMTgzIDQzMyAxNTMgNDExVDEyMiAzNTNRMTIyIDMxNSAxNTUgMjk5VDI1NSAyNjlRMjg0IDI2MyAzMTUgMjU1VDM3MSAyMzJUNDEzIDE5NFQ0MzAgMTMzUTQzMCA2NyAzODAgMjhUMjQyIC0xMlpNMzQ0IDcwM1EzNjUgNzAzIDM2NSA2ODBRMzY1IDY2MiAzNDYgNjM3VDMwMiA1ODlUMjU4IDU0OVQyMzUgNTMzUTIzMyA1MzMgMjEzIDU0OVQxNjggNTg4VDEyNSA2MzdUMTA1IDY4MFExMDUgNzAzIDEyNiA3MDNRMTQzIDcwMyAxNjcgNjc4VDIzNiA1OTFRMjgwIDY1MiAzMDMgNjc3VDM0NCA3MDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjI7IiBnbHlwaC1uYW1lPSJUY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik0yNzMgNTg1SDcwUTM5IDU4NSAzOSA2MTNWNjE4UTM5IDY0NyA3MCA2NDdINTQ0UTU3NSA2NDcgNTc1IDYxOFY2MTNRNTc1IDU4NSA1NDQgNTg1SDM0MVYwSDI3M1Y1ODVaTTI0OCAtMjI1UTI0NSAtMjI4IDIzOCAtMjI5VDIyNSAtMjI4VDIxNiAtMjIyVDIxNSAtMjA5TDI3NSAtODRRMjgzIC02OCAyODkgLTU5VDMxNSAtNTBIMzIwUTMzNCAtNTAgMzQ0IC01N1QzNTUgLTc5Vi04M1EzNTUgLTkxIDM0OCAtMTAwVDMyOSAtMTI0TDI0OCAtMjI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYzOyIgZ2x5cGgtbmFtZT0idGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iMzc2IiBkPSJNMjQ1IC0xMlExNzUgLTEyIDE0NCAyNlQxMTIgMTQwVjQxOEg0MVY0NzZIMTEyVjU1OVExMTIgNTc3IDEyMCA1ODNUMTQxIDU5MEgxNDhRMTYxIDU5MCAxNjggNTg0VDE3NiA1NTlWNDc2SDMzMFY0MThIMTc2VjE0N1ExNzYgOTQgMTkxIDY5VDI0NyA0NFEyNzIgNDQgMjkwIDUzVDMyMSA3OVEzMjMgODEgMzMzIDc0VDM0MyA0N1EzNDMgMzEgMzI4IDE2UTMxNiA0IDI5NSAtNFQyNDUgLTEyWk0xNDkgLTIyNVExNDYgLTIyOCAxMzkgLTIyOVQxMjYgLTIyOFQxMTcgLTIyMlQxMTYgLTIwOUwxNzYgLTg0UTE4NCAtNjggMTkwIC01OVQyMTYgLTUwSDIyMVEyMzUgLTUwIDI0NSAtNTdUMjU2IC03OVYtODNRMjU2IC05MSAyNDkgLTEwMFQyMzAgLTEyNEwxNDkgLTIyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGdseXBoLW5hbWU9IlRjYXJvbiIgaG9yaXotYWR2LXg9IjYxNCIgZD0iTTI3MyA1ODVINzBRMzkgNTg1IDM5IDYxM1Y2MThRMzkgNjQ3IDcwIDY0N0g1NDRRNTc1IDY0NyA1NzUgNjE4VjYxM1E1NzUgNTg1IDU0NCA1ODVIMzQxVjBIMjczVjU4NVpNNDE2IDg3NFE0MzcgODc0IDQzNyA4NTFRNDM3IDgzMyA0MTggODA4VDM3NCA3NjBUMzMwIDcyMFQzMDcgNzA0UTMwNSA3MDQgMjg1IDcyMFQyNDAgNzU5VDE5NyA4MDhUMTc3IDg1MVExNzcgODc0IDE5OCA4NzRRMjE1IDg3NCAyMzkgODQ5VDMwOCA3NjJRMzUyIDgyMyAzNzUgODQ4VDQxNiA4NzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjU7IiBnbHlwaC1uYW1lPSJ0Y2Fyb24iIGhvcml6LWFkdi14PSI0MDAiIGQ9Ik0yNDUgLTEyUTE3NSAtMTIgMTQ0IDI2VDExMiAxNDBWNDE4SDQxVjQ3NkgxMTJWNTU5UTExMiA1NzcgMTIwIDU4M1QxNDEgNTkwSDE0OFExNjEgNTkwIDE2OCA1ODRUMTc2IDU1OVY0NzZIMzMwVjQxOEgxNzZWMTQ3UTE3NiA5NCAxOTEgNjlUMjQ3IDQ0UTI3MiA0NCAyOTAgNTNUMzIxIDc5UTMyMyA4MSAzMzMgNzRUMzQzIDQ3UTM0MyAzMSAzMjggMTZRMzE2IDQgMjk1IC00VDI0NSAtMTJaTTI1MyA1MzRRMjUxIDUzMSAyNDYgNTMwVDIzNiA1MzBUMjI3IDUzNlQyMjYgNTQ3TDI3NiA2OTRRMjgxIDcwOSAyODcgNzE2VDMwOCA3MjRIMzEyUTMyMyA3MjQgMzMwIDcxNlQzMzcgNjk0VjY5MlEzMzcgNjc0IDMyNCA2NTFMMjUzIDUzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NjsiIGdseXBoLW5hbWU9IlRiYXIiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik0yMDMgMzAyUTE2NCAzMDIgMTY0IDMzMVYzMzZRMTY0IDM1MCAxNzQgMzU3VDIwMyAzNjRIMjczVjU4NUg3MFEzOSA1ODUgMzkgNjEzVjYxOFEzOSA2NDcgNzAgNjQ3SDU0NFE1NzUgNjQ3IDU3NSA2MThWNjEzUTU3NSA1ODUgNTQ0IDU4NUgzNDFWMzY0SDQxMVE0NTAgMzY0IDQ1MCAzMzZWMzMxUTQ1MCAzMDIgNDExIDMwMkgzNDFWMEgyNzNWMzAySDIwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NzsiIGdseXBoLW5hbWU9InRiYXIiIGhvcml6LWFkdi14PSIzNzYiIGQ9Ik04NCAyMDlRNDUgMjA5IDQ1IDIzOFYyNDNRNDUgMjU3IDU1IDI2NFQ4NCAyNzFIMTEyVjQxOEg0MVY0NzZIMTEyVjU1OVExMTIgNTc3IDEyMCA1ODNUMTQxIDU5MEgxNDhRMTYxIDU5MCAxNjggNTg0VDE3NiA1NTlWNDc2SDMzMFY0MThIMTc2VjI3MUgyOTJRMzMxIDI3MSAzMzEgMjQzVjIzOFEzMzEgMjA5IDI5MiAyMDlIMTc2VjE0N1ExNzYgOTQgMTkxIDY5VDI0NyA0NFEyNzIgNDQgMjkwIDUzVDMyMSA3OVEzMjMgODEgMzMzIDc0VDM0MyA0N1EzNDMgMzEgMzI4IDE2UTMxNiA0IDI5NSAtNFQyNDUgLTEyUTE3NSAtMTIgMTQ0IDI2VDExMiAxNDBWMjA5SDg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY4OyIgZ2x5cGgtbmFtZT0iVXRpbGRlIiBob3Jpei1hZHYteD0iNjY5IiBkPSJNMzMzIC0xMlEyMTAgLTEyIDE0NiA1NlQ4MiAyNTVWNjIwUTgyIDY1MSAxMTEgNjUxSDEyMFExNTAgNjUxIDE1MCA2MjBWMjYwUTE1MCA0OSAzMzUgNDlRNTIwIDQ5IDUyMCAyNjFWNjIwUTUyMCA2NTEgNTQ4IDY1MUg1NjBRNTg3IDY1MSA1ODcgNjIwVjI1OFE1ODcgMTI2IDUyMiA1N1QzMzMgLTEyWk0yMTUgNjgwUTE5MCA2ODAgMTkwIDcwNlExOTAgNzIyIDE5NSA3MzhUMjA5IDc2N1QyMzEgNzg4VDI1OSA3OTZRMjgzIDc5NiAzMjMgNzc1VDQwNyA3MTZRNDExIDcyOSA0MTYgNzQyVDQyNyA3NjVUNDM5IDc4MlQ0NTMgNzg5UTQ3OCA3ODkgNDc4IDc2M1E0NzggNzQ2IDQ3MyA3MzBUNDU5IDcwMlQ0MzcgNjgxVDQwOSA2NzNRMzg1IDY3MyAzNDUgNjk0VDI2MSA3NTNRMjU3IDc0MCAyNTIgNzI3VDI0MSA3MDRUMjI5IDY4N1QyMTUgNjgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY5OyIgZ2x5cGgtbmFtZT0idXRpbGRlIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMjY3IC0xMlEyMjAgLTEyIDE4NSAzVDEyNiA0NVQ5MCAxMTJUNzggMTk4VjQ3NkgxNDNWMjAyUTE0MyAxMzAgMTc2IDkwVDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAxIDQ4NyAtMVQ0NzEgLTRRNDU0IC00IDQ0MiA4VDQyOSA1OVY3NFE0MDQgMzYgMzY0IDEyVDI2NyAtMTJaTTE2OCA1NTVRMTQzIDU1NSAxNDMgNTgxUTE0MyA1OTcgMTQ4IDYxM1QxNjIgNjQyVDE4NCA2NjNUMjEyIDY3MVEyMzYgNjcxIDI3NiA2NTBUMzYwIDU5MVEzNjQgNjA0IDM2OSA2MTdUMzgwIDY0MFQzOTIgNjU3VDQwNiA2NjRRNDMxIDY2NCA0MzEgNjM4UTQzMSA2MjEgNDI2IDYwNVQ0MTIgNTc3VDM5MCA1NTZUMzYyIDU0OFEzMzggNTQ4IDI5OCA1NjlUMjE0IDYyOFEyMTAgNjE1IDIwNSA2MDJUMTk0IDU3OVQxODIgNTYyVDE2OCA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBnbHlwaC1uYW1lPSJVbWFjcm9uIiBob3Jpei1hZHYteD0iNjY5IiBkPSJNMzMzIC0xMlEyMTAgLTEyIDE0NiA1NlQ4MiAyNTVWNjIwUTgyIDY1MSAxMTEgNjUxSDEyMFExNTAgNjUxIDE1MCA2MjBWMjYwUTE1MCA0OSAzMzUgNDlRNTIwIDQ5IDUyMCAyNjFWNjIwUTUyMCA2NTEgNTQ4IDY1MUg1NjBRNTg3IDY1MSA1ODcgNjIwVjI1OFE1ODcgMTI2IDUyMiA1N1QzMzMgLTEyWk0yNDEgNzM5UTIwMiA3MzkgMjAyIDc2OFY3NzNRMjAyIDc4NyAyMTIgNzk0VDI0MSA4MDFINDQ5UTQ4OCA4MDEgNDg4IDc3M1Y3NjhRNDg4IDczOSA0NDkgNzM5SDI0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QjsiIGdseXBoLW5hbWU9InVtYWNyb24iIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik0yNjcgLTEyUTIyMCAtMTIgMTg1IDNUMTI2IDQ1VDkwIDExMlQ3OCAxOThWNDc2SDE0M1YyMDJRMTQzIDEzMCAxNzYgOTBUMjcxIDQ5UTMyNyA0OSAzNjcgNzdUNDI4IDE1MFY0NzZINDkzVjNRNDkzIDEgNDg3IC0xVDQ3MSAtNFE0NTQgLTQgNDQyIDhUNDI5IDU5Vjc0UTQwNCAzNiAzNjQgMTJUMjY3IC0xMlpNMTg3IDU2OFExNDggNTY4IDE0OCA1OTdWNjAyUTE0OCA2MTYgMTU4IDYyM1QxODcgNjMwSDM5NVE0MzQgNjMwIDQzNCA2MDJWNTk3UTQzNCA1NjggMzk1IDU2OEgxODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkM7IiBnbHlwaC1uYW1lPSJVYnJldmUiIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik0zMzMgLTEyUTIxMCAtMTIgMTQ2IDU2VDgyIDI1NVY2MjBRODIgNjUxIDExMSA2NTFIMTIwUTE1MCA2NTEgMTUwIDYyMFYyNjBRMTUwIDQ5IDMzNSA0OVE1MjAgNDkgNTIwIDI2MVY2MjBRNTIwIDY1MSA1NDggNjUxSDU2MFE1ODcgNjUxIDU4NyA2MjBWMjU4UTU4NyAxMjYgNTIyIDU3VDMzMyAtMTJaTTM0MCA3MTlRMzE5IDcxOSAyOTQgNzMwVDI0OCA3NTdUMjEzIDc5MVQxOTkgODI0UTE5OSA4NTMgMjI4IDg1M1EyMzUgODUzIDI0OCA4NDRUMjc2IDgyMlQzMDggNzkyVDM0MiA3NjJRMzU3IDc3NiAzNzMgNzkyVDQwNCA4MjFUNDMxIDg0NFQ0NTIgODUzUTQ4MSA4NTMgNDgxIDgyNFE0ODEgODA5IDQ2NyA3OTFUNDMxIDc1NlQzODUgNzMwVDM0MCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkQ7IiBnbHlwaC1uYW1lPSJ1YnJldmUiIGhvcml6LWFkdi14PSI1NzUiIGQ9Ik0yNjcgLTEyUTIyMCAtMTIgMTg1IDNUMTI2IDQ1VDkwIDExMlQ3OCAxOThWNDc2SDE0M1YyMDJRMTQzIDEzMCAxNzYgOTBUMjcxIDQ5UTMyNyA0OSAzNjcgNzdUNDI4IDE1MFY0NzZINDkzVjNRNDkzIDEgNDg3IC0xVDQ3MSAtNFE0NTQgLTQgNDQyIDhUNDI5IDU5Vjc0UTQwNCAzNiAzNjQgMTJUMjY3IC0xMlpNMjc3IDU0OFEyNTYgNTQ4IDIzMSA1NTlUMTg1IDU4NlQxNTAgNjIwVDEzNiA2NTNRMTM2IDY4MiAxNjUgNjgyUTE3MiA2ODIgMTg1IDY3M1QyMTMgNjUxVDI0NSA2MjFUMjc5IDU5MVEyOTQgNjA1IDMxMCA2MjFUMzQxIDY1MFQzNjggNjczVDM4OSA2ODJRNDE4IDY4MiA0MTggNjUzUTQxOCA2MzggNDA0IDYyMFQzNjggNTg1VDMyMiA1NTlUMjc3IDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RTsiIGdseXBoLW5hbWU9IlVyaW5nIiBob3Jpei1hZHYteD0iNjY5IiBkPSJNMzMzIC0xMlEyMTAgLTEyIDE0NiA1NlQ4MiAyNTVWNjIwUTgyIDY1MSAxMTEgNjUxSDEyMFExNTAgNjUxIDE1MCA2MjBWMjYwUTE1MCA0OSAzMzUgNDlRNTIwIDQ5IDUyMCAyNjFWNjIwUTUyMCA2NTEgNTQ4IDY1MUg1NjBRNTg3IDY1MSA1ODcgNjIwVjI1OFE1ODcgMTI2IDUyMiA1N1QzMzMgLTEyWk0zNDQgNzE5UTMxOCA3MTkgMjk3IDcyOFQyNjEgNzUyVDIzNyA3ODlUMjI4IDgzNlEyMjggODYxIDIzNyA4ODJUMjYxIDkxOVQyOTggOTQ0VDM0NSA5NTNRMzcwIDk1MyAzOTEgOTQ0VDQyOCA5MjBUNDUyIDg4M1Q0NjEgODM2UTQ2MSA4MTEgNDUyIDc5MFQ0MjggNzUzVDM5MSA3MjhUMzQ0IDcxOVpNMzQ0IDc2NFEzNzMgNzY0IDM5MiA3ODRUNDExIDgzNlE0MTEgODY3IDM5MiA4ODhUMzQ0IDkwOVEzMTUgOTA5IDI5NiA4ODhUMjc3IDgzNlEyNzcgODA2IDI5NiA3ODVUMzQ0IDc2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RjsiIGdseXBoLW5hbWU9InVyaW5nIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMjY3IC0xMlEyMjAgLTEyIDE4NSAzVDEyNiA0NVQ5MCAxMTJUNzggMTk4VjQ3NkgxNDNWMjAyUTE0MyAxMzAgMTc2IDkwVDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAxIDQ4NyAtMVQ0NzEgLTRRNDU0IC00IDQ0MiA4VDQyOSA1OVY3NFE0MDQgMzYgMzY0IDEyVDI2NyAtMTJaTTI5MSA1MzVRMjY1IDUzNSAyNDQgNTQ0VDIwOCA1NjhUMTg0IDYwNVQxNzUgNjUyUTE3NSA2NzcgMTg0IDY5OFQyMDggNzM1VDI0NSA3NjBUMjkyIDc2OVEzMTcgNzY5IDMzOCA3NjBUMzc1IDczNlQzOTkgNjk5VDQwOCA2NTJRNDA4IDYyNyAzOTkgNjA2VDM3NSA1NjlUMzM4IDU0NFQyOTEgNTM1Wk0yOTEgNTgwUTMyMCA1ODAgMzM5IDYwMFQzNTggNjUyUTM1OCA2ODMgMzM5IDcwNFQyOTEgNzI1UTI2MiA3MjUgMjQzIDcwNFQyMjQgNjUyUTIyNCA2MjIgMjQzIDYwMVQyOTEgNTgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcwOyIgZ2x5cGgtbmFtZT0iVWh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjY2OSIgZD0iTTMzMyAtMTJRMjEwIC0xMiAxNDYgNTZUODIgMjU1VjYyMFE4MiA2NTEgMTExIDY1MUgxMjBRMTUwIDY1MSAxNTAgNjIwVjI2MFExNTAgNDkgMzM1IDQ5UTUyMCA0OSA1MjAgMjYxVjYyMFE1MjAgNjUxIDU0OCA2NTFINTYwUTU4NyA2NTEgNTg3IDYyMFYyNThRNTg3IDEyNiA1MjIgNTdUMzMzIC0xMlpNMzg5IDcyMlEzODcgNzI0IDM5NyA3MzhUNDI2IDc3MVQ0NjcgODExVDUxNCA4NTBRNTM4IDg2OCA1NjAgODY4UTU3MiA4NjggNTgxIDg2MVQ1OTAgODQxUTU5MCA4MTYgNTUzIDc5MVE1MjggNzc0IDUwMCA3NjBUNDQ4IDczN1Q0MDggNzI0VDM4OSA3MjJaTTIxMCA3MjJRMjA4IDcyNCAyMTggNzM4VDI0NyA3NzFUMjg4IDgxMVQzMzUgODUwUTM1OSA4NjggMzgxIDg2OFEzOTMgODY4IDQwMiA4NjFUNDExIDg0MVE0MTEgODE2IDM3NCA3OTFRMzQ5IDc3NCAzMjEgNzYwVDI2OSA3MzdUMjI5IDcyNFQyMTAgNzIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcxOyIgZ2x5cGgtbmFtZT0idWh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTI2NyAtMTJRMjIwIC0xMiAxODUgM1QxMjYgNDVUOTAgMTEyVDc4IDE5OFY0NzZIMTQzVjIwMlExNDMgMTMwIDE3NiA5MFQyNzEgNDlRMzI3IDQ5IDM2NyA3N1Q0MjggMTUwVjQ3Nkg0OTNWM1E0OTMgMSA0ODcgLTFUNDcxIC00UTQ1NCAtNCA0NDIgOFQ0MjkgNTlWNzRRNDA0IDM2IDM2NCAxMlQyNjcgLTEyWk0zMjIgNTUxUTMyMCA1NTMgMzMwIDU2N1QzNTkgNjAwVDQwMCA2NDBUNDQ3IDY3OVE0NzEgNjk3IDQ5MyA2OTdRNTA1IDY5NyA1MTQgNjkwVDUyMyA2NzBRNTIzIDY0NSA0ODYgNjIwUTQ2MSA2MDMgNDMzIDU4OVQzODEgNTY2VDM0MSA1NTNUMzIyIDU1MVpNMTQzIDU1MVExNDEgNTUzIDE1MSA1NjdUMTgwIDYwMFQyMjEgNjQwVDI2OCA2NzlRMjkyIDY5NyAzMTQgNjk3UTMyNiA2OTcgMzM1IDY5MFQzNDQgNjcwUTM0NCA2NDUgMzA3IDYyMFEyODIgNjAzIDI1NCA1ODlUMjAyIDU2NlQxNjIgNTUzVDE0MyA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBnbHlwaC1uYW1lPSJVb2dvbmVrIiBob3Jpei1hZHYteD0iNjY5IiBkPSJNMzMzIC0xMlEyMTAgLTEyIDE0NiA1NlQ4MiAyNTVWNjIwUTgyIDY1MSAxMTEgNjUxSDEyMFExNTAgNjUxIDE1MCA2MjBWMjYwUTE1MCA0OSAzMzUgNDlRNTIwIDQ5IDUyMCAyNjFWNjIwUTUyMCA2NTEgNTQ4IDY1MUg1NjBRNTg3IDY1MSA1ODcgNjIwVjI1OFE1ODcgOTQgNDg2IDI4UTQ0MyAtNCA0MjggLTI4VDQxMyAtNzFRNDEzIC04OCA0MjMgLTk4VDQ0NyAtMTA5UTQ3MyAtMTA5IDQ4NiAtODhRNDk3IC04OCA1MDcgLTk2VDUxOCAtMTIyUTUxOCAtMTQyIDQ5OCAtMTU0VDQ0NiAtMTY2UTQwNCAtMTY2IDM3OSAtMTQ0VDM1MyAtODRRMzUzIC00NSAzODQgLThRMzcyIC0xMCAzNjAgLTExVDMzMyAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzM7IiBnbHlwaC1uYW1lPSJ1b2dvbmVrIiBob3Jpei1hZHYteD0iNTc1IiBkPSJNMjY3IC0xMlEyMjAgLTEyIDE4NSAzVDEyNiA0NVQ5MCAxMTJUNzggMTk4VjQ3NkgxNDNWMjAyUTE0MyAxMzAgMTc2IDkwVDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAyIDQ4OSAwUTQ0MyAtMzQgNDI4IC01OFQ0MTIgLTEwMlE0MTIgLTExOSA0MjIgLTEyOVQ0NDYgLTE0MFE0NzIgLTE0MCA0ODUgLTExOVE0OTYgLTExOSA1MDYgLTEyN1Q1MTcgLTE1M1E1MTcgLTE3MyA0OTcgLTE4NVQ0NDUgLTE5N1E0MDMgLTE5NyAzNzggLTE3NVQzNTIgLTExNVEzNTIgLTg0IDM3MyAtNTNUNDQyIDdRNDM2IDE0IDQzMyAyNlQ0MjkgNTlWNzRRNDA0IDM2IDM2NCAxMlQyNjcgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc0OyIgZ2x5cGgtbmFtZT0iV2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI5MzQiIGQ9Ik03MCA2MzZRNjkgNjM5IDc5IDY0NFQxMDMgNjUxVDEzMCA2NDNUMTQ5IDYwOUwyNzMgNjFMNDE1IDUyNFE0MjEgNTQyIDQzMiA1NTJUNDY5IDU2MlE0OTUgNTYyIDUwNSA1NTNUNTIyIDUyNEw2NjIgNjNMNzg5IDYwOVE3OTUgNjM0IDgwNyA2NDNUODMzIDY1MVQ4NTUgNjQ1VDg2NCA2MzZMNzA4IDBINjE4TDQ3MCA0OTVMMzEzIDBIMjI2TDcwIDYzNlpNMzYyIDcwMFEzNDAgNzAwIDM0MCA3MjNRMzQwIDc0MSAzNjAgNzY2VDQwNCA4MTRUNDQ4IDg1NFQ0NzEgODcwUTQ3MyA4NzAgNDkzIDg1NFQ1MzggODE1VDU4MSA3NjZUNjAxIDcyM1E2MDEgNzAwIDU4MCA3MDBRNTYzIDcwMCA1MzkgNzI1VDQ3MCA4MTJRNDQ3IDc4MSA0MzEgNzYwVDQwMiA3MjZUMzgwIDcwNlQzNjIgNzAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc1OyIgZ2x5cGgtbmFtZT0id2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0zOSA0NjFRMzkgNDY0IDQ4IDQ3MVQ3MCA0NzlUOTYgNDczVDExNiA0MzRMMjAzIDYwTDMwNSAzODFRMzEwIDM5NSAzMTkgNDAxVDM1NCA0MDhRMzc5IDQwOCAzODggNDAyVDQwMyAzODFMNTA0IDYwTDU5MCA0MzRRNTk3IDQ2NCA2MDkgNDczVDYzNCA0ODBUNjU2IDQ3MVQ2NjUgNDYxTDU0NSAwSDQ2NUwzNTQgMzQ1TDI0MCAwSDE2MEwzOSA0NjFaTTI0NiA1MzlRMjI0IDUzOSAyMjQgNTYyUTIyNCA1ODAgMjQ0IDYwNVQyODggNjUzVDMzMiA2OTNUMzU1IDcwOVEzNTcgNzA5IDM3NyA2OTNUNDIyIDY1NFQ0NjUgNjA1VDQ4NSA1NjJRNDg1IDUzOSA0NjQgNTM5UTQ0NyA1MzkgNDIzIDU2NFQzNTQgNjUxUTMzMSA2MjAgMzE1IDU5OVQyODYgNTY1VDI2NCA1NDVUMjQ2IDUzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NjsiIGdseXBoLW5hbWU9IlljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTc5IiBkPSJNMjU1IDI2OUwyNSA2NDdIMTAwTDI5MCAzMzFMNDc5IDYyN1E0OTEgNjQ2IDUwNCA2NDlUNTI5IDY0OFQ1NDcgNjM1VDU1MyA2MjJMMzIzIDI2OVYwSDI1NVYyNjlaTTE4NSA3MjBRMTYzIDcyMCAxNjMgNzQzUTE2MyA3NjEgMTgzIDc4NlQyMjcgODM0VDI3MSA4NzRUMjk0IDg5MFEyOTYgODkwIDMxNiA4NzRUMzYxIDgzNVQ0MDQgNzg2VDQyNCA3NDNRNDI0IDcyMCA0MDMgNzIwUTM4NiA3MjAgMzYyIDc0NVQyOTMgODMyUTI3MCA4MDEgMjU0IDc4MFQyMjUgNzQ2VDIwMyA3MjZUMTg1IDcyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NzsiIGdseXBoLW5hbWU9InljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTAyIiBkPSJNMTk4IC0xOTdRMTg0IC0xOTcgMTc0IC0xOTBUMTY0IC0xODBMMjQ0IDI0UTIyNyAyNCAyMTkgMjlUMjA0IDQ5TDI0IDQ3Nkg5MkwyNjIgNjVMNDEwIDQ3Nkg0NzlMMjQ0IC0xNTRRMjM0IC0xODAgMjIzIC0xODhUMTk4IC0xOTdaTTE1MiA1NDlRMTMwIDU0OSAxMzAgNTcyUTEzMCA1OTAgMTUwIDYxNVQxOTQgNjYzVDIzOCA3MDNUMjYxIDcxOVEyNjMgNzE5IDI4MyA3MDNUMzI4IDY2NFQzNzEgNjE1VDM5MSA1NzJRMzkxIDU0OSAzNzAgNTQ5UTM1MyA1NDkgMzI5IDU3NFQyNjAgNjYxUTIzNyA2MzAgMjIxIDYwOVQxOTIgNTc1VDE3MCA1NTVUMTUyIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3ODsiIGdseXBoLW5hbWU9IllkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU3OSIgZD0iTTI1NSAyNjlMMjUgNjQ3SDEwMEwyOTAgMzMxTDQ3OSA2MjdRNDkxIDY0NiA1MDQgNjQ5VDUyOSA2NDhUNTQ3IDYzNVQ1NTMgNjIyTDMyMyAyNjlWMEgyNTVWMjY5Wk0zNzQgNzE4UTM1MSA3MTggMzM4IDczMVQzMjQgNzY3UTMyNCA3OTAgMzM3IDgwM1QzNzIgODE2UTM5NSA4MTYgNDA4IDgwM1Q0MjIgNzY3UTQyMiA3NDQgNDA5IDczMVQzNzQgNzE4Wk0yMDYgNzE4UTE4MyA3MTggMTcwIDczMVQxNTYgNzY3UTE1NiA3OTAgMTY5IDgwM1QyMDQgODE2UTIyNyA4MTYgMjQwIDgwM1QyNTQgNzY3UTI1NCA3NDQgMjQxIDczMVQyMDYgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc5OyIgZ2x5cGgtbmFtZT0iWmFjdXRlIiBob3Jpei1hZHYteD0iNjM0IiBkPSJNNjkgNzJMNDgxIDU4NUgxMDFRNzAgNTg1IDcwIDYxM1Y2MThRNzAgNjQ3IDEwMSA2NDdINTU2VjU3OEwxNDIgNjJINTQzUTU3NCA2MiA1NzQgMzRWMjlRNTc0IDAgNTQzIDBINjlWNzJaTTI3MCA3MjJRMjY4IDcyNCAyNzggNzM4VDMwNyA3NzFUMzQ4IDgxMVQzOTUgODUwUTQxOSA4NjggNDQxIDg2OFE0NTMgODY4IDQ2MiA4NjFUNDcxIDg0MVE0NzEgODE2IDQzNCA3OTFRNDA5IDc3NCAzODEgNzYwVDMyOSA3MzdUMjg5IDcyNFQyNzAgNzIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdBOyIgZ2x5cGgtbmFtZT0iemFjdXRlIiBob3Jpei1hZHYteD0iNTAzIiBkPSJNNTUgNTBMMzU4IDQyMEg4OFE3MCA0MjAgNjMgNDI2VDU1IDQ0NVY0NTFRNTUgNDY0IDYyIDQ3MFQ4OCA0NzZINDQ1VjQzMkwxMzcgNTZINDE5UTQzNyA1NiA0NDQgNTBUNDUyIDMxVjI1UTQ1MiAxMiA0NDUgNlQ0MTkgMEg1NVY1MFpNMjEwIDU1MVEyMDggNTUzIDIxOCA1NjdUMjQ3IDYwMFQyODggNjQwVDMzNSA2NzlRMzU5IDY5NyAzODEgNjk3UTM5MyA2OTcgNDAyIDY5MFQ0MTEgNjcwUTQxMSA2NDUgMzc0IDYyMFEzNDkgNjAzIDMyMSA1ODlUMjY5IDU2NlQyMjkgNTUzVDIxMCA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBnbHlwaC1uYW1lPSJaZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjM0IiBkPSJNNjkgNzJMNDgxIDU4NUgxMDFRNzAgNTg1IDcwIDYxM1Y2MThRNzAgNjQ3IDEwMSA2NDdINTU2VjU3OEwxNDIgNjJINTQzUTU3NCA2MiA1NzQgMzRWMjlRNTc0IDAgNTQzIDBINjlWNzJaTTMxNSA3MjBRMjg5IDcyMCAyNzUgNzM0VDI2MCA3NzJRMjYwIDc5NSAyNzUgODA5VDMxNiA4MjRRMzQxIDgyNCAzNTUgODEwVDM3MCA3NzJRMzcwIDc0OSAzNTYgNzM1VDMxNSA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0M7IiBnbHlwaC1uYW1lPSJ6ZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTAzIiBkPSJNNTUgNTBMMzU4IDQyMEg4OFE3MCA0MjAgNjMgNDI2VDU1IDQ0NVY0NTFRNTUgNDY0IDYyIDQ3MFQ4OCA0NzZINDQ1VjQzMkwxMzcgNTZINDE5UTQzNyA1NiA0NDQgNTBUNDUyIDMxVjI1UTQ1MiAxMiA0NDUgNlQ0MTkgMEg1NVY1MFpNMjYxIDU0OVEyMzUgNTQ5IDIyMSA1NjNUMjA2IDYwMVEyMDYgNjI0IDIyMSA2MzhUMjYyIDY1M1EyODcgNjUzIDMwMSA2MzlUMzE2IDYwMVEzMTYgNTc4IDMwMiA1NjRUMjYxIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RDsiIGdseXBoLW5hbWU9IlpjYXJvbiIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTY5IDcyTDQ4MSA1ODVIMTAxUTcwIDU4NSA3MCA2MTNWNjE4UTcwIDY0NyAxMDEgNjQ3SDU1NlY1NzhMMTQyIDYySDU0M1E1NzQgNjIgNTc0IDM0VjI5UTU3NCAwIDU0MyAwSDY5VjcyWk00MjAgODczUTQ0MSA4NzMgNDQxIDg1MFE0NDEgODMyIDQyMiA4MDdUMzc4IDc1OVQzMzQgNzE5VDMxMSA3MDNRMzA5IDcwMyAyODkgNzE5VDI0NCA3NThUMjAxIDgwN1QxODEgODUwUTE4MSA4NzMgMjAyIDg3M1EyMTkgODczIDI0MyA4NDhUMzEyIDc2MVEzNTYgODIyIDM3OSA4NDdUNDIwIDg3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGdseXBoLW5hbWU9InpjYXJvbiIgaG9yaXotYWR2LXg9IjUwMyIgZD0iTTU1IDUwTDM1OCA0MjBIODhRNzAgNDIwIDYzIDQyNlQ1NSA0NDVWNDUxUTU1IDQ2NCA2MiA0NzBUODggNDc2SDQ0NVY0MzJMMTM3IDU2SDQxOVE0MzcgNTYgNDQ0IDUwVDQ1MiAzMVYyNVE0NTIgMTIgNDQ1IDZUNDE5IDBINTVWNTBaTTM1NSA3MDNRMzc2IDcwMyAzNzYgNjgwUTM3NiA2NjIgMzU3IDYzN1QzMTMgNTg5VDI2OSA1NDlUMjQ2IDUzM1EyNDQgNTMzIDIyNCA1NDlUMTc5IDU4OFQxMzYgNjM3VDExNiA2ODBRMTE2IDcwMyAxMzcgNzAzUTE1NCA3MDMgMTc4IDY3OFQyNDcgNTkxUTI5MSA2NTIgMzE0IDY3N1QzNTUgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTkyOyIgZ2x5cGgtbmFtZT0iZmxvcmluIiBob3Jpei1hZHYteD0iNDEzIiBkPSJNNzMgMzc4UTU1IDM3OCA0OSAzODRUNDIgNDA0VjQxMFE0MiA0MjMgNDggNDI5VDczIDQzNkgxNDRMMTU2IDUwMFExNzAgNTc3IDIwNyA2MThUMzA3IDY1OVEzNDkgNjU5IDM3MyA2NDJUMzk4IDYwMlEzOTggNTkzIDM5NCA1ODZUMzg2IDU3M1QzNzcgNTY1VDM3MyA1NjNRMzYzIDU3NyAzNDUgNTg4VDMwMSA1OTlRMjY2IDU5OSAyNDggNTczVDIxOSA0ODlMMjA5IDQzNkgzMjlRMzQ3IDQzNiAzNTMgNDMwVDM2MCA0MTBWNDA0UTM2MCAzOTEgMzU0IDM4NVQzMjkgMzc4SDIwMEwxNDAgNTBRMTMxIC00IDk4IC00UTg0IC00IDc1IDFUNjcgOUwxMzQgMzc4SDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE4OyIgZ2x5cGgtbmFtZT0iU2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjg5IC0xMlEyMTYgLTEyIDE2MyAxMFQ4MSA2MlE1MiA5MSA1MiAxMTVRNTIgMTI2IDU4IDEzNFQ3MSAxNDdUODUgMTU1VDkyIDE1NlExMTggMTExIDE2NyA3OVQyODggNDdRMzYzIDQ3IDQwNSA3OFQ0NDcgMTY3UTQ0NyAxOTkgNDMzIDIyMFQzOTMgMjU1VDMzNiAyNzlUMjY5IDI5N1EyMzIgMzA2IDE5NyAzMTdUMTMzIDM0OVQ4OCA0MDFUNzAgNDgxUTcwIDUxOSA4NiA1NTFUMTMyIDYwOFQyMDAgNjQ1VDI4NyA2NTlRMzU1IDY1OSA0MDMgNjM5VDQ3NiA1OTRRNTAxIDU2OSA1MDEgNTQ3UTUwMSA1MzYgNDk1IDUyOFQ0ODIgNTE1VDQ2OCA1MDdUNDYxIDUwNlE0MzggNTQ2IDM5MyA1NzNUMjg4IDYwMFEyMjAgNjAwIDE3OCA1NjhUMTM2IDQ4M1ExMzYgNDUyIDE0OCA0MzJUMTgyIDM5OVQyMzQgMzc4VDMwMiAzNjBRMzQxIDM1MSAzNzkgMzM4VDQ0NyAzMDRUNDk1IDI1MVQ1MTQgMTcwUTUxNCAxMjkgNDk4IDk2VDQ1MyAzOFQzODIgMVQyODkgLTEyWk0yMjQgLTIyNVEyMjEgLTIyOCAyMTQgLTIyOVQyMDEgLTIyOFQxOTIgLTIyMlQxOTEgLTIwOUwyNTEgLTg0UTI1OSAtNjggMjY1IC01OVQyOTEgLTUwSDI5NlEzMTAgLTUwIDMyMCAtNTdUMzMxIC03OVYtODNRMzMxIC05MSAzMjQgLTEwMFQzMDUgLTEyNEwyMjQgLTIyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxOTsiIGdseXBoLW5hbWU9InNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjQ4NCIgZD0iTTI0MiAtMTJRMTc5IC0xMiAxMzUgNVQ2OCA0NVE0NiA2NyA0NiA4NVE0NiA5NSA1MSAxMDJUNjIgMTEzVDc0IDExOVQ4MSAxMjBRMTA1IDg3IDE0NCA2NVQyNDQgNDNRMzA0IDQzIDMzNSA2NVQzNjcgMTIzUTM2NyAxNDQgMzU4IDE1OFQzMzEgMTgxVDI4NyAxOTdUMjI3IDIxMVExOTkgMjE3IDE3MCAyMjVUMTE2IDI0N1Q3NiAyODVUNjAgMzQ0UTYwIDM3NiA3MyA0MDJUMTEwIDQ0OFQxNjcgNDc3VDI0MiA0ODhRMzAxIDQ4OCAzMzkgNDczVDM5OCA0MzdRNDE4IDQxNyA0MTggMzk3UTQxOCAzODggNDEzIDM4MVQ0MDEgMzcwVDM4OSAzNjRUMzgyIDM2M1EzNjIgMzk0IDMyNyA0MTNUMjQyIDQzM1ExODMgNDMzIDE1MyA0MTFUMTIyIDM1M1ExMjIgMzE1IDE1NSAyOTlUMjU1IDI2OVEyODQgMjYzIDMxNSAyNTVUMzcxIDIzMlQ0MTMgMTk0VDQzMCAxMzNRNDMwIDY3IDM4MCAyOFQyNDIgLTEyWk0xNTggLTIyNVExNTUgLTIyOCAxNDggLTIyOVQxMzUgLTIyOFQxMjYgLTIyMlQxMjUgLTIwOUwxODUgLTg0UTE5MyAtNjggMTk5IC01OVQyMjUgLTUwSDIzMFEyNDQgLTUwIDI1NCAtNTdUMjY1IC03OVYtODNRMjY1IC05MSAyNTggLTEwMFQyMzkgLTEyNEwxNTggLTIyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxQTsiIGdseXBoLW5hbWU9InVuaTAyMUEiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik0yNzMgNTg1SDcwUTM5IDU4NSAzOSA2MTNWNjE4UTM5IDY0NyA3MCA2NDdINTQ0UTU3NSA2NDcgNTc1IDYxOFY2MTNRNTc1IDU4NSA1NDQgNTg1SDM0MVYwSDI3M1Y1ODVaTTI0OCAtMjI1UTI0NSAtMjI4IDIzOCAtMjI5VDIyNSAtMjI4VDIxNiAtMjIyVDIxNSAtMjA5TDI3NSAtODRRMjgzIC02OCAyODkgLTU5VDMxNSAtNTBIMzIwUTMzNCAtNTAgMzQ0IC01N1QzNTUgLTc5Vi04M1EzNTUgLTkxIDM0OCAtMTAwVDMyOSAtMTI0TDI0OCAtMjI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjFCOyIgZ2x5cGgtbmFtZT0idW5pMDIxQiIgaG9yaXotYWR2LXg9IjM3NiIgZD0iTTI0NSAtMTJRMTc1IC0xMiAxNDQgMjZUMTEyIDE0MFY0MThINDFWNDc2SDExMlY1NTlRMTEyIDU3NyAxMjAgNTgzVDE0MSA1OTBIMTQ4UTE2MSA1OTAgMTY4IDU4NFQxNzYgNTU5VjQ3NkgzMzBWNDE4SDE3NlYxNDdRMTc2IDk0IDE5MSA2OVQyNDcgNDRRMjcyIDQ0IDI5MCA1M1QzMjEgNzlRMzIzIDgxIDMzMyA3NFQzNDMgNDdRMzQzIDMxIDMyOCAxNlEzMTYgNCAyOTUgLTRUMjQ1IC0xMlpNMTQ5IC0yMjVRMTQ2IC0yMjggMTM5IC0yMjlUMTI2IC0yMjhUMTE3IC0yMjJUMTE2IC0yMDlMMTc2IC04NFExODQgLTY4IDE5MCAtNTlUMjE2IC01MEgyMjFRMjM1IC01MCAyNDUgLTU3VDI1NiAtNzlWLTgzUTI1NiAtOTEgMjQ5IC0xMDBUMjMwIC0xMjRMMTQ5IC0yMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzY7IiBnbHlwaC1uYW1lPSJjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMTU2IDU0OVExMzQgNTQ5IDEzNCA1NzJRMTM0IDU5MCAxNTQgNjE1VDE5OCA2NjNUMjQyIDcwM1QyNjUgNzE5UTI2NyA3MTkgMjg3IDcwM1QzMzIgNjY0VDM3NSA2MTVUMzk1IDU3MlEzOTUgNTQ5IDM3NCA1NDlRMzU3IDU0OSAzMzMgNTc0VDI2NCA2NjFRMjQxIDYzMCAyMjUgNjA5VDE5NiA1NzVUMTc0IDU1NVQxNTYgNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM3OyIgZ2x5cGgtbmFtZT0iY2Fyb24iIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0zNzQgNzAzUTM5NSA3MDMgMzk1IDY4MFEzOTUgNjYyIDM3NiA2MzdUMzMyIDU4OVQyODggNTQ5VDI2NSA1MzNRMjYzIDUzMyAyNDMgNTQ5VDE5OCA1ODhUMTU1IDYzN1QxMzUgNjgwUTEzNSA3MDMgMTU2IDcwM1ExNzMgNzAzIDE5NyA2NzhUMjY2IDU5MVEzMTAgNjUyIDMzMyA2NzdUMzc0IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDOTsiIGdseXBoLW5hbWU9Im92ZXJzY29yZSIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTE2MSA1NjhRMTIyIDU2OCAxMjIgNTk3VjYwMlExMjIgNjE2IDEzMiA2MjNUMTYxIDYzMEgzNjlRNDA4IDYzMCA0MDggNjAyVjU5N1E0MDggNTY4IDM2OSA1NjhIMTYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ4OyIgZ2x5cGgtbmFtZT0iYnJldmUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0yNjUgNTQ4UTI0NCA1NDggMjE5IDU1OVQxNzMgNTg2VDEzOCA2MjBUMTI0IDY1M1ExMjQgNjgyIDE1MyA2ODJRMTYwIDY4MiAxNzMgNjczVDIwMSA2NTFUMjMzIDYyMVQyNjcgNTkxUTI4MiA2MDUgMjk4IDYyMVQzMjkgNjUwVDM1NiA2NzNUMzc3IDY4MlE0MDYgNjgyIDQwNiA2NTNRNDA2IDYzOCAzOTIgNjIwVDM1NiA1ODVUMzEwIDU1OVQyNjUgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ5OyIgZ2x5cGgtbmFtZT0iZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMjY1IDU0OVEyMzkgNTQ5IDIyNSA1NjNUMjEwIDYwMVEyMTAgNjI0IDIyNSA2MzhUMjY2IDY1M1EyOTEgNjUzIDMwNSA2MzlUMzIwIDYwMVEzMjAgNTc4IDMwNiA1NjRUMjY1IDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQTsiIGdseXBoLW5hbWU9InJpbmciIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0yNjQgNTQ4UTIzOCA1NDggMjE3IDU1N1QxODEgNTgxVDE1NyA2MThUMTQ4IDY2NVExNDggNjkwIDE1NyA3MTFUMTgxIDc0OFQyMTggNzczVDI2NSA3ODJRMjkwIDc4MiAzMTEgNzczVDM0OCA3NDlUMzcyIDcxMlQzODEgNjY1UTM4MSA2NDAgMzcyIDYxOVQzNDggNTgyVDMxMSA1NTdUMjY0IDU0OFpNMjY0IDU5M1EyOTMgNTkzIDMxMiA2MTNUMzMxIDY2NVEzMzEgNjk2IDMxMiA3MTdUMjY0IDczOFEyMzUgNzM4IDIxNiA3MTdUMTk3IDY2NVExOTcgNjM1IDIxNiA2MTRUMjY0IDU5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQjsiIGdseXBoLW5hbWU9Im9nb25layIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTMyNyAwUTI4MCAtMzUgMjY0IC02MFQyNDcgLTEwNFEyNDcgLTEyMSAyNTcgLTEzMVQyODEgLTE0MlEzMDcgLTE0MiAzMjAgLTEyMVEzMzEgLTEyMSAzNDEgLTEyOVQzNTIgLTE1NVEzNTIgLTE3NSAzMzIgLTE4N1QyODAgLTE5OVEyMzggLTE5OSAyMTMgLTE3N1QxODcgLTExN1ExODcgLTgwIDIxNyAtNDNUMzE3IDI2TDMyNyAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRDOyIgZ2x5cGgtbmFtZT0idGlsZGUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xNDYgNTU1UTEyMSA1NTUgMTIxIDU4MVExMjEgNTk3IDEyNiA2MTNUMTQwIDY0MlQxNjIgNjYzVDE5MCA2NzFRMjE0IDY3MSAyNTQgNjUwVDMzOCA1OTFRMzQyIDYwNCAzNDcgNjE3VDM1OCA2NDBUMzcwIDY1N1QzODQgNjY0UTQwOSA2NjQgNDA5IDYzOFE0MDkgNjIxIDQwNCA2MDVUMzkwIDU3N1QzNjggNTU2VDM0MCA1NDhRMzE2IDU0OCAyNzYgNTY5VDE5MiA2MjhRMTg4IDYxNSAxODMgNjAyVDE3MiA1NzlUMTYwIDU2MlQxNDYgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkREOyIgZ2x5cGgtbmFtZT0iaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMjk0IDU1MVEyOTIgNTUzIDMwMiA1NjdUMzMxIDYwMFQzNzIgNjQwVDQxOSA2NzlRNDQzIDY5NyA0NjUgNjk3UTQ3NyA2OTcgNDg2IDY5MFQ0OTUgNjcwUTQ5NSA2NDUgNDU4IDYyMFE0MzMgNjAzIDQwNSA1ODlUMzUzIDU2NlQzMTMgNTUzVDI5NCA1NTFaTTExNSA1NTFRMTEzIDU1MyAxMjMgNTY3VDE1MiA2MDBUMTkzIDY0MFQyNDAgNjc5UTI2NCA2OTcgMjg2IDY5N1EyOTggNjk3IDMwNyA2OTBUMzE2IDY3MFEzMTYgNjQ1IDI3OSA2MjBRMjU0IDYwMyAyMjYgNTg5VDE3NCA1NjZUMTM0IDU1M1QxMTUgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Mzk0OyIgZ2x5cGgtbmFtZT0iaW5jcmVtZW50IiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNMjkzIDcwMEgzOTZMNjMzIDBIMzBMMjkzIDcwMFpNMTQwIDczSDQ2NUwzMTAgNTI4TDE0MCA3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDNBOTsiIGdseXBoLW5hbWU9Ik9tZWdhIiBob3Jpei1hZHYteD0iNzYwIiBkPSJNMzgwIDYwMlEzMTggNjAyIDI3MiA1ODVUMTk2IDUzN1QxNTAgNDY3VDEzNSAzODBRMTM1IDMzNSAxNDkgMjk0VDE4OCAyMTZUMjQ5IDE0OFQzMjUgOTNWMEg1MVY5M0gxODhRMTE0IDE1MyA3MiAyMjVUMzAgMzgwUTMwIDQ0NiA1NCA1MDRUMTI0IDYwNVQyMzUgNjc0VDM4MCA3MDBRNDYwIDcwMCA1MjUgNjc1VDYzNSA2MDZUNzA1IDUwNFQ3MzAgMzgwUTczMCAyOTcgNjg4IDIyNVQ1NzIgOTNINzA5VjBINDM1VjkzUTQ3NiAxMTcgNTExIDE0OFQ1NzEgMjE1VDYxMSAyOTNUNjI1IDM4MFE2MjUgNDI2IDYxMCA0NjZUNTY1IDUzN1Q0ODggNTg0VDM4MCA2MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQkM7IiBnbHlwaC1uYW1lPSJtdSIgaG9yaXotYWR2LXg9IjU3NSIgZD0iTTI2NyAtMTJRMjIwIC0xMiAxODQgM1ExNjEgMTMgMTQzIDI3Vi0yOTBINzhWNDc2SDE0M1YxOTFRMTQ1IDEyNyAxNzYgODlRMjEwIDQ5IDI3MSA0OVEzMjcgNDkgMzY3IDc3VDQyOCAxNTBWNDc2SDQ5M1YzUTQ5MyAxIDQ4NyAtMVQ0NzEgLTRRNDU0IC00IDQ0MiA4VDQyOSA1OVY3NFE0MDQgMzYgMzY0IDEyVDI2NyAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQzA7IiBnbHlwaC1uYW1lPSJwaSIgaG9yaXotYWR2LXg9Ijc4NyIgZD0iTTM5MyAtMTJRMzIxIC0xMiAyNjEgMTNUMTU3IDgyVDg5IDE4N1Q2NSAzMjJRNjUgMzk0IDkwIDQ1NlQxNTkgNTYzVDI2MyA2MzNUMzk0IDY1OVE0NjYgNjU5IDUyNiA2MzRUNjI5IDU2NVQ2OTcgNDYwVDcyMiAzMjVRNzIyIDI1MyA2OTcgMTkxVDYyOCA4NFQ1MjQgMTRUMzkzIC0xMlpNMzk1IDM2UTQ1NSAzNiA1MDUgNTdUNTkyIDExNlQ2NDggMjA2VDY2OCAzMjNRNjY4IDM4NSA2NDcgNDM3VDU4OSA1MjhUNTAyIDU4OVQzOTIgNjExUTMzMiA2MTEgMjgyIDU5MFQxOTUgNTMxVDEzOSA0NDFUMTE5IDMyNFExMTkgMjYyIDE0MCAyMTBUMTk4IDExOVQyODUgNThUMzk1IDM2Wk0zMDYgMTM5UTI4MSAxMzkgMjgxIDE2N1Y0NTJRMjgxIDQ2NyAyOTAgNDc2VDMxMyA0ODZINDA5UTQ3NSA0ODYgNTEwIDQ1N1Q1NDYgMzczUTU0NiAzMTcgNTEyIDI4N1Q0MTIgMjU3SDM0MVYxNjdRMzQxIDEzOSAzMTUgMTM5SDMwNlpNMzQwIDMwNkg0MTNRNDQ5IDMwNiA0NjggMzIzVDQ4NyAzNzJRNDg3IDQwMyA0NjcgNDIwVDQwOSA0MzdIMzQwVjMwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTM7IiBnbHlwaC1uYW1lPSJlbmRhc2giIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik05MSAyMTNRNzMgMjEzIDY3IDIxOVQ2MCAyMzlWMjQ1UTYwIDI1OCA2NiAyNjRUOTEgMjcxSDQ2NFE0ODIgMjcxIDQ4OCAyNjVUNDk1IDI0NVYyMzlRNDk1IDIyNiA0ODkgMjIwVDQ2NCAyMTNIOTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE0OyIgZ2x5cGgtbmFtZT0iZW1kYXNoIiBob3Jpei1hZHYteD0iNzIzIiBkPSJNOTEgMjEzUTczIDIxMyA2NyAyMTlUNjAgMjM5VjI0NVE2MCAyNTggNjYgMjY0VDkxIDI3MUg2MzJRNjUwIDI3MSA2NTYgMjY1VDY2MyAyNDVWMjM5UTY2MyAyMjYgNjU3IDIyMFQ2MzIgMjEzSDkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGdseXBoLW5hbWU9InF1b3RlbGVmdCIgaG9yaXotYWR2LXg9IjIzMiIgZD0iTTg4IDQyNlE3NSA0MjYgNjYgNDM1VDU3IDQ2MlY0NjVRNTcgNDczIDYwIDQ4NFQ3NCA1MTRMMTU4IDY1NVExNjAgNjU5IDE2NiA2NjBUMTc5IDY2MFQxOTAgNjUzVDE5MSA2NDBMMTMyIDQ2MlExMjUgNDQ1IDExOCA0MzZUOTIgNDI2SDg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxOTsiIGdseXBoLW5hbWU9InF1b3RlcmlnaHQiIGhvcml6LWFkdi14PSIyMzIiIGQ9Ik03NCA0MzJRNzIgNDI4IDY2IDQyN1Q1MyA0MjdUNDIgNDM0VDQxIDQ0N0wxMDEgNjI1UTEwOCA2NDMgMTE0IDY1MlQxNDAgNjYxSDE0NVExNTcgNjYxIDE2NiA2NTJUMTc1IDYyNVY2MjJRMTc1IDYwMCAxNTkgNTczTDc0IDQzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjIzMiIgZD0iTTY0IC0xMjlRNjIgLTEzMyA1NiAtMTM0VDQzIC0xMzRUMzIgLTEyN1QzMSAtMTE0TDkxIDY0UTk4IDgyIDEwNCA5MVQxMzAgMTAwSDEzNVExNDcgMTAwIDE1NiA5MVQxNjUgNjRWNjFRMTY1IDM5IDE0OSAxMkw2NCAtMTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQzsiIGdseXBoLW5hbWU9InF1b3RlZGJsbGVmdCIgaG9yaXotYWR2LXg9IjM4NSIgZD0iTTI0MSA0MjZRMjI5IDQyNiAyMjAgNDM1VDIxMSA0NjJWNDY1UTIxMSA0ODcgMjI3IDUxNEwzMTIgNjU1UTMxNSA2NTkgMzIxIDY2MFQzMzQgNjYwVDM0NCA2NTNUMzQ1IDY0MEwyODUgNDYyUTI3OSA0NDMgMjcyIDQzNVQyNDYgNDI2SDI0MVpNODcgNDI2UTc1IDQyNiA2NiA0MzVUNTcgNDYyVjQ2NVE1NyA0ODcgNzMgNTE0TDE1OCA2NTVRMTYxIDY1OSAxNjcgNjYwVDE4MCA2NjBUMTkwIDY1M1QxOTEgNjQwTDEzMSA0NjJRMTI1IDQ0MyAxMTggNDM1VDkyIDQyNkg4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUQ7IiBnbHlwaC1uYW1lPSJxdW90ZWRibHJpZ2h0IiBob3Jpei1hZHYteD0iMzg1IiBkPSJNMjI3IDQzMlEyMjUgNDI4IDIxOSA0MjdUMjA2IDQyN1QxOTUgNDM0VDE5NCA0NDdMMjU0IDYyNVEyNjEgNjQzIDI2NyA2NTJUMjkzIDY2MUgyOThRMzEwIDY2MSAzMTkgNjUyVDMyOCA2MjVWNjIyUTMyOCA2MDAgMzEyIDU3M0wyMjcgNDMyWk03MyA0MzJRNzEgNDI4IDY1IDQyN1Q1MiA0MjdUNDEgNDM0VDQwIDQ0N0wxMDAgNjI1UTEwNyA2NDMgMTEzIDY1MlQxMzkgNjYxSDE0NFExNTYgNjYxIDE2NSA2NTJUMTc0IDYyNVY2MjJRMTc0IDYwMCAxNTggNTczTDczIDQzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUU7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGJhc2UiIGhvcml6LWFkdi14PSIzODUiIGQ9Ik0yMTcgLTEyOVEyMTUgLTEzMyAyMDkgLTEzNFQxOTYgLTEzNFQxODUgLTEyN1QxODQgLTExNEwyNDQgNjRRMjUxIDgyIDI1NyA5MVQyODMgMTAwSDI4OFEzMDAgMTAwIDMwOSA5MVQzMTggNjRWNjFRMzE4IDM5IDMwMiAxMkwyMTcgLTEyOVpNNjMgLTEyOVE2MSAtMTMzIDU1IC0xMzRUNDIgLTEzNFQzMSAtMTI3VDMwIC0xMTRMOTAgNjRROTcgODIgMTAzIDkxVDEyOSAxMDBIMTM0UTE0NiAxMDAgMTU1IDkxVDE2NCA2NFY2MVExNjQgMzkgMTQ4IDEyTDYzIC0xMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIwOyIgZ2x5cGgtbmFtZT0iZGFnZ2VyIiBob3Jpei1hZHYteD0iNTQwIiBkPSJNMjY1IC0xNjBRMjUyIC0xNjAgMjQ5IC0xNTRUMjQ1IC0xMzdMMjMwIDI5OFEyMjkgMzE1IDIzNSAzMzdUMjU0IDM4MEw5MCAzNThRNjMgMzU0IDUzIDM2NFQ0MyAzOTZRNDMgNDE4IDUzIDQyOFQ5MCA0MzRMMjU0IDQxMkwyMzAgNjA2UTIyNiA2MzMgMjM2IDY0M1QyNzAgNjUzUTI5MyA2NTMgMzAzIDY0M1QzMTAgNjA2TDI4NiA0MTJMNDUwIDQzNFE0NzcgNDM4IDQ4NyA0MjhUNDk3IDM5NlE0OTcgMzc0IDQ4NyAzNjRUNDUwIDM1OEwyODYgMzgwUTI5OSAzNjAgMzA1IDMzOFQzMTAgMjk4TDI5NSAtMTM3UTI5NCAtMTQ4IDI5MSAtMTU0VDI3NSAtMTYwSDI2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjE7IiBnbHlwaC1uYW1lPSJkYWdnZXJkYmwiIGhvcml6LWFkdi14PSI1NDAiIGQ9Ik0yNjUgLTE2MFEyNTIgLTE2MCAyNDkgLTE1NFQyNDUgLTEzN0wyMzcgMTAzTDkwIDgyUTYzIDc4IDUzIDg4VDQzIDEyMFE0MyAxNDIgNTMgMTUyVDkwIDE1OEwyMzYgMTM3TDIzMCAyOThRMjI5IDMxNSAyMzUgMzM4VDI1NiAzODBMOTAgMzU4UTYzIDM1NCA1MyAzNjRUNDMgMzk2UTQzIDQxOCA1MyA0MjhUOTAgNDM0TDI1NCA0MTJMMjMwIDYwNlEyMjYgNjMzIDIzNiA2NDNUMjcwIDY1M1EyOTMgNjUzIDMwMyA2NDNUMzEwIDYwNkwyODYgNDEyTDQ1MCA0MzRRNDc3IDQzOCA0ODcgNDI4VDQ5NyAzOTZRNDk3IDM3NCA0ODcgMzY0VDQ1MCAzNThMMjg0IDM4MFEyOTggMzYxIDMwNCAzMzhUMzEwIDI5OEwzMDQgMTM3TDQ1MCAxNThRNDc3IDE2MiA0ODcgMTUyVDQ5NyAxMjBRNDk3IDk4IDQ4NyA4OFQ0NTAgODJMMzAzIDEwM0wyOTUgLTEzN1EyOTQgLTE0OCAyOTEgLTE1NFQyNzUgLTE2MEgyNjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIyOyIgZ2x5cGgtbmFtZT0iYnVsbGV0IiBob3Jpei1hZHYteD0iMzU0IiBkPSJNMTc3IDEzOVExNTYgMTM5IDEzNyAxNDdUMTA1IDE2OVQ4MyAyMDJUNzUgMjQyUTc1IDI2MyA4MyAyODJUMTA0IDMxNVQxMzcgMzM4VDE3NyAzNDZRMTk4IDM0NiAyMTcgMzM4VDI0OSAzMTZUMjcxIDI4MlQyNzkgMjQyUTI3OSAyMjEgMjcxIDIwMlQyNTAgMTY5VDIxNyAxNDdUMTc3IDEzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjY7IiBnbHlwaC1uYW1lPSJlbGxpcHNpcyIgaG9yaXotYWR2LXg9IjY1NyIgZD0iTTUzMiAtNlE0ODggLTYgNDg4IDM4VjQ4UTQ4OCA2OSA0OTkgODFUNTMyIDkzSDU0MlE1NjQgOTMgNTc1IDgxVDU4NyA0OFYzOFE1ODcgLTYgNTQyIC02SDUzMlpNMzIzIC02UTI3OSAtNiAyNzkgMzhWNDhRMjc5IDY5IDI5MCA4MVQzMjMgOTNIMzMzUTM1NSA5MyAzNjYgODFUMzc4IDQ4VjM4UTM3OCAtNiAzMzMgLTZIMzIzWk0xMTQgLTZRNzAgLTYgNzAgMzhWNDhRNzAgNjkgODEgODFUMTE0IDkzSDEyNFExNDYgOTMgMTU3IDgxVDE2OSA0OFYzOFExNjkgLTYgMTI0IC02SDExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzA7IiBnbHlwaC1uYW1lPSJwZXJ0aG91c2FuZCIgaG9yaXotYWR2LXg9IjExMTYiIGQ9Ik0yMDEgMzQ3UTE2OSAzNDcgMTQyIDM1OFQ5NSAzOTBUNjQgNDM4VDUyIDQ5NlY1MDZRNTIgNTM3IDY0IDU2NFQ5NiA2MTJUMTQzIDY0NVQyMDIgNjU3UTIzMyA2NTcgMjYwIDY0NVQzMDggNjEzVDMzOSA1NjZUMzUxIDUwOFY0OThRMzUxIDQ2NyAzMzkgNDQwVDMwNyAzOTJUMjYwIDM1OVQyMDEgMzQ3Wk0xMjggLThRMTI3IC05IDEyMiAtOFQxMTEgLTRUMTAxIDVUOTYgMjBROTYgMzQgMTAyIDQ1VDEyNiA3NUw2MjkgNjYxUTYzMCA2NjIgNjM1IDY2MlQ2NDYgNjU4VDY1NiA2NDhUNjYxIDYzM1E2NjEgNjEyIDYzMSA1NzhMMTI4IC04Wk05MTQgLTRRODgyIC00IDg1NSA3VDgwOCAzOVQ3NzcgODdUNzY1IDE0NVYxNTVRNzY1IDE4NiA3NzcgMjEzVDgwOSAyNjFUODU2IDI5NFQ5MTUgMzA2UTk0NiAzMDYgOTczIDI5NFQxMDIxIDI2MlQxMDUyIDIxNVQxMDY0IDE1N1YxNDdRMTA2NCAxMTYgMTA1MiA4OVQxMDIwIDQxVDk3MyA4VDkxNCAtNFpNNTYwIC00UTUyOCAtNCA1MDEgN1Q0NTQgMzlUNDIzIDg3VDQxMSAxNDVWMTU1UTQxMSAxODYgNDIzIDIxM1Q0NTUgMjYxVDUwMiAyOTRUNTYxIDMwNlE1OTIgMzA2IDYxOSAyOTRUNjY3IDI2MlQ2OTggMjE1VDcxMCAxNTdWMTQ3UTcxMCAxMTYgNjk4IDg5VDY2NiA0MVQ2MTkgOFQ1NjAgLTRaTTIwMiAzOTlRMjQxIDM5OSAyNjYgNDI2VDI5MiA0OTVWNTA5UTI5MiA1NTEgMjY2IDU3OFQyMDEgNjA2UTE2MiA2MDYgMTM3IDU3OVQxMTEgNTA5VjQ5NVExMTEgNDU0IDEzNyA0MjdUMjAyIDM5OVpNOTE1IDQ4UTk1NCA0OCA5NzkgNzVUMTAwNSAxNDRWMTU4UTEwMDUgMjAwIDk3OSAyMjdUOTE0IDI1NVE4NzUgMjU1IDg1MCAyMjhUODI0IDE1OFYxNDRRODI0IDEwMyA4NTAgNzZUOTE1IDQ4Wk01NjEgNDhRNjAwIDQ4IDYyNSA3NVQ2NTEgMTQ0VjE1OFE2NTEgMjAwIDYyNSAyMjdUNTYwIDI1NVE1MjEgMjU1IDQ5NiAyMjhUNDcwIDE1OFYxNDRRNDcwIDEwMyA0OTYgNzZUNTYxIDQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbGxlZnQiIGhvcml6LWFkdi14PSIzNDIiIGQ9Ik0yNzcgMTAzVjEwMFEyNzcgOTIgMjcxIDg1VDI1MyA3OEgyNTJRMjM4IDc4IDIxOCA4OVQxNzcgMTE3VDEzNSAxNTVUOTggMTk0VDcxIDIyNVQ2MCAyNDNRNjAgMjQ2IDcwIDI1OVQ5NyAyOTFUMTM1IDMzMFQxNzcgMzY4VDIxOCAzOTZUMjUyIDQwOEgyNTNRMjY0IDQwOCAyNzAgNDAxVDI3NyAzODVWMzgzUTI3NyAzNzIgMjY0IDM1N1QyMzAgMzI0VDE4MCAyODRUMTIxIDI0MlExNTEgMjIxIDE3OSAyMDFUMjI5IDE2MlQyNjQgMTI4VDI3NyAxMDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDNBOyIgZ2x5cGgtbmFtZT0iZ3VpbHNpbmdscmlnaHQiIGhvcml6LWFkdi14PSIzNDIiIGQ9Ik02NiAxMDNRNjYgMTEzIDc5IDEyOFQxMTMgMTYxVDE2MyAyMDBUMjIyIDI0MlExOTEgMjYzIDE2MyAyODRUMTE0IDMyM1Q3OSAzNTdUNjYgMzgzVjM4NVE2NiAzOTMgNzIgNDAwVDg5IDQwOEg5MFExMDQgNDA4IDEyNCAzOTdUMTY1IDM2OFQyMDcgMzMxVDI0NCAyOTJUMjcxIDI2MFQyODIgMjQzUTI4MiAyMzkgMjcyIDIyNlQyNDUgMTk0VDIwNyAxNTZUMTY1IDExOFQxMjQgOTBUOTAgNzhIODlRNzkgNzggNzMgODVUNjYgMTAwVjEwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwNDQ7IiBnbHlwaC1uYW1lPSJ1bmkyMDQ0IiBob3Jpei1hZHYteD0iNjU1IiBkPSJNNjcgLThRNjYgLTkgNjEgLThUNTAgLTRUNDAgNVQzNSAyMFEzNSAzNCA0MSA0NVQ2NSA3NUw1ODggNjYxUTU4OSA2NjIgNTk0IDY2MlQ2MDUgNjU4VDYxNSA2NDhUNjIwIDYzM1E2MjAgNjEyIDU5MCA1NzhMNjcgLThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMEFDOyIgZ2x5cGgtbmFtZT0iRXVybyIgaG9yaXotYWR2LXg9IjY1NiIgZD0iTTgyIDM3NlE2NCAzNzYgNTggMzgyVDUxIDQwMlY0MDhRNTEgNDIxIDU3IDQyN1Q4MiA0MzRIMTUyUTE2MiA0ODYgMTgzIDUyN1QyMzcgNTk4VDMxMCA2NDNUMzk5IDY1OVE0NDYgNjU5IDQ4MyA2NDZUNTQ2IDYxNVQ1ODUgNTc1VDU5OSA1MzZRNTk5IDUyNCA1OTMgNTE3VDU4MCA1MDVUNTY3IDQ5OVQ1NjAgNDk5UTUzNCA1NDggNDk1IDU3NVQzOTUgNjAyUTMyOCA2MDIgMjgyIDU1N1QyMTggNDM0SDQzNFE0NTIgNDM0IDQ1OCA0MjhUNDY1IDQwOFY0MDJRNDY1IDM4OSA0NTkgMzgzVDQzNCAzNzZIMjEwUTIwOSAzNjkgMjA5IDM2MlQyMDkgMzQ4VjI3Nkg0MzRRNDUyIDI3NiA0NTggMjcwVDQ2NSAyNTBWMjQ0UTQ2NSAyMzEgNDU5IDIyNVQ0MzQgMjE4SDIxN1EyMzQgMTQwIDI4MiA5M1Q0MDEgNDZRNDYzIDQ2IDUwMSA3NVQ1NjMgMTU4UTU2NCAxNTkgNTcwIDE1OFQ1ODMgMTUzVDU5NyAxNDBUNjAzIDEyMFE2MDMgMTAyIDU4OSA3OVQ1NDkgMzZUNDg2IDJUNDA0IC0xMlEzMDEgLTEyIDIzNSA0OFQxNTEgMjE4SDgyUTY0IDIxOCA1OCAyMjRUNTEgMjQ0VjI1MFE1MSAyNjMgNTcgMjY5VDgyIDI3NkgxNDRWMzQ3UTE0NCAzNTUgMTQ0IDM2MVQxNDUgMzc2SDgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjExMzsiIGdseXBoLW5hbWU9ImFmaWk2MTI4OSIgaG9yaXotYWR2LXg9IjQzNCIgZD0iTTE5OSAzNDFRMjI4IDM2NSAyNTEgMzk1VDI5MSA0NTZUMzE3IDUxM1QzMjYgNTU4UTMyNiA1ODQgMzE1IDU4NFEzMDggNTg0IDMwMCA1NzNRMjkxIDU2MSAyNzggNTM5VDI1MCA0ODZUMjIyIDQxOVQxOTkgMzQxWk00NCAxMzhRMzAgMTUxIDE5IDE3MlQ3IDIyOFEyNSAyMzcgMzMgMjQwVDQ5IDI0Nkw1OSAyNTFRNjMgMzIxIDgxIDM4M1QxMjYgNDk3VDE4MyA1ODhUMjQ1IDY1MlEyODUgNjgzIDMyNyA2ODNRMzY3IDY4MyAzOTUgNjUyVDQyMyA1NThRNDIzIDUwOSA0MDIgNDYzVDM0OSAzNzVUMjc2IDI5NFQxOTYgMjIzUTE5NiAyMTggMTk2IDIxNFQxOTUgMjA0UTE5NSAxNTggMjA3IDEzM1QyMzcgMTA3UTI1NCAxMDcgMjczIDEzM1QzMTAgMjE3UTMyMiAyMjAgMzM2IDIyMFEzNTUgMjIwIDM3MyAyMTNUNDA0IDE4NlEzOTcgMTQ5IDM4MiAxMTRUMzQ1IDUyVDI5MyA5VDIyOCAtOFEyMDYgLTggMTgyIDFUMTM1IDMwVDk0IDc4VDY2IDE0Nkw0NCAxMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTIyOyIgZ2x5cGgtbmFtZT0idHJhZGVtYXJrIiBob3Jpei1hZHYteD0iNzA3IiBkPSJNMzczIDM0MVEzNTIgMzQxIDM1MiAzNjZWNjIyUTM1MiA2NTEgMzc4IDY1MUg0MDNRNDE3IDY1MSA0MjIgNjQ2VDQzMyA2MjlMNDk2IDQ3M0w1NTkgNjI5UTU2NCA2NDEgNTcwIDY0NlQ1ODkgNjUxSDYxMlE2MzggNjUxIDYzOCA2MjJWMzY2UTYzOCAzNDEgNjE2IDM0MUg2MDlRNTg4IDM0MSA1ODggMzY2VjU3OUw1MjMgNDE4UTUyMSA0MTIgNTE3IDQwOFQ0OTUgNDA0UTQ3OCA0MDQgNDc0IDQwOFQ0NjggNDE4TDQwMiA1NzhWMzY2UTQwMiAzNDEgMzgyIDM0MUgzNzNaTTYwIDYwMFEzNiA2MDAgMzYgNjIyVjYyNlEzNiA2NDggNjAgNjQ4SDI3NFEyOTggNjQ4IDI5OCA2MjZWNjIyUTI5OCA2MDAgMjc0IDYwMEgxOTRWMzY2UTE5NCAzNDEgMTcwIDM0MUgxNjNRMTQxIDM0MSAxNDEgMzY2VjYwMEg2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMjY7IiBnbHlwaC1uYW1lPSJ1bmkyMTI2IiBob3Jpei1hZHYteD0iNzYwIiBkPSJNMzgwIDYwMlEzMTggNjAyIDI3MiA1ODVUMTk2IDUzN1QxNTAgNDY3VDEzNSAzODBRMTM1IDMzNSAxNDkgMjk0VDE4OCAyMTZUMjQ5IDE0OFQzMjUgOTNWMEg1MVY5M0gxODhRMTE0IDE1MyA3MiAyMjVUMzAgMzgwUTMwIDQ0NiA1NCA1MDRUMTI0IDYwNVQyMzUgNjc0VDM4MCA3MDBRNDYwIDcwMCA1MjUgNjc1VDYzNSA2MDZUNzA1IDUwNFQ3MzAgMzgwUTczMCAyOTcgNjg4IDIyNVQ1NzIgOTNINzA5VjBINDM1VjkzUTQ3NiAxMTcgNTExIDE0OFQ1NzEgMjE1VDYxMSAyOTNUNjI1IDM4MFE2MjUgNDI2IDYxMCA0NjZUNTY1IDUzN1Q0ODggNTg0VDM4MCA2MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTJFOyIgZ2x5cGgtbmFtZT0iZXN0aW1hdGVkIiBob3Jpei1hZHYteD0iODMwIiBkPSJNNDE1IDY3MVE0OTIgNjcxIDU2MCA2NDVUNjgxIDU3M1Q3NjMgNDYzVDc5MyAzMjRIMTg1UTE3NSAzMjQgMTc1IDMxM1YxMTZRMjIzIDY1IDI4NiAzOFQ0MTUgMTBRNDkwIDEwIDU1NSA0M1Q2NjcgMTMxSDcyNFE2NjcgNjIgNTg1IDI2VDQxNSAtMTFRMzQwIC0xMSAyNzIgMTRUMTUxIDg0VDY3IDE5MVQzNiAzMzBRMzYgNDAzIDY2IDQ2NVQxNDcgNTc0VDI2OCA2NDVUNDE1IDY3MVpNNDE1IDY1MFEzNDUgNjUwIDI4MiA2MjJUMTc1IDU0M1YzNThRMTc1IDM0NyAxODUgMzQ3SDY0NlE2NTUgMzQ3IDY1NSAzNThWNTQyUTYxMCA1OTQgNTQ2IDYyMlQ0MTUgNjUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIwMjsiIGdseXBoLW5hbWU9InBhcnRpYWxkaWZmIiBob3Jpei1hZHYteD0iNTM4IiBkPSJNMzAzIDQ4MVEzMzUgNDgxIDM2MSA0NzFUNDA0IDQ0NVY0NjRRNDA0IDQ5OSAzOTkgNTI4VDM4MSA1NzhUMzQzIDYxMFQyODIgNjIyUTI0NyA2MjIgMjA4IDYxMkwxODkgNjc5UTI3MSA3MTAgMzMyIDcxMFE0MjEgNzEwIDQ2NCA2NDlUNTA4IDQ3NVE1MDggMzcwIDQ4MSAyODNUNDA5IDEzM1QzMTEgMzVUMjAxIDBRMTY1IDAgMTM0IDEwVDgwIDQ0VDQzIDEwMlQzMCAxODdRMzAgMjU2IDU1IDMxMFQxMjAgNDAzVDIwOCA0NjFUMzAzIDQ4MVpNMjA1IDEwNVEyMjkgMTA1IDI1NiAxMjFUMzEwIDE2N1QzNTkgMjQzVDM5MyAzNDlRMzgyIDM2MSAzNjAgMzczVDMwOSAzODZRMjc1IDM4NiAyNDQgMzcxVDE4OCAzMzFUMTQ5IDI3MFQxMzQgMTk0UTEzNCAxNTcgMTUwIDEzMVQyMDUgMTA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIwNjsiIGdseXBoLW5hbWU9InVuaTIyMDYiIGhvcml6LWFkdi14PSI2NDkiIGQ9Ik0yOTMgNzAwSDM5Nkw2MzMgMEgzMEwyOTMgNzAwWk0xNDAgNzNINDY1TDMxMCA1MjhMMTQwIDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIwRjsiIGdseXBoLW5hbWU9InByb2R1Y3QiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik00ODQgMFY2MDdIMTUwVjBINTBWNzAwSDU4NFYwSDQ4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTE7IiBnbHlwaC1uYW1lPSJzdW1tYXRpb24iIGhvcml6LWFkdi14PSI0NzUiIGQ9Ik0xMTAgODBINDM3VjBIMjVWOTZMMjA5IDMyNUwyNSA1NTRWNjUwSDQzN1Y1NzBIMTE1TDI4OCAzNTNWMzAwTDExMCA4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTI7IiBnbHlwaC1uYW1lPSJtaW51cyIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTEzMyAyMzdRMTE1IDIzNyAxMDkgMjQ0VDEwMiAyNjRWMjcxUTEwMiAyODQgMTA4IDI5MVQxMzMgMjk4SDQ5NlE1MTQgMjk4IDUyMCAyOTFUNTI3IDI3MVYyNjRRNTI3IDI1MSA1MjEgMjQ0VDQ5NiAyMzdIMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxNTsiIGdseXBoLW5hbWU9ImZyYWN0aW9uIiBob3Jpei1hZHYteD0iNjU1IiBkPSJNNjcgLThRNjYgLTkgNjEgLThUNTAgLTRUNDAgNVQzNSAyMFEzNSAzNCA0MSA0NVQ2NSA3NUw1ODggNjYxUTU4OSA2NjIgNTk0IDY2MlQ2MDUgNjU4VDYxNSA2NDhUNjIwIDYzM1E2MjAgNjEyIDU5MCA1NzhMNjcgLThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE5OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjUxIiBkPSJNMTIwIDE5M1E3NiAxOTMgNzYgMjM3VjI0N1E3NiAyNjggODcgMjgwVDEyMCAyOTJIMTMwUTE1MiAyOTIgMTYzIDI4MFQxNzUgMjQ3VjIzN1ExNzUgMTkzIDEzMCAxOTNIMTIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxQTsiIGdseXBoLW5hbWU9InJhZGljYWwiIGhvcml6LWFkdi14PSI2NDkiIGQ9Ik0yNTYgNTAxTDM2OSAxNzFMNTY2IDcwMEg2NDlMMzg2IDBIMjgzTDEzNiA0MzNIMzBWNTAxSDI1NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMUU7IiBnbHlwaC1uYW1lPSJpbmZpbml0eSIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTcwMyAyNzFRNzAzIDIzMSA2OTAgMjAzVDY1NCAxNTZUNjA0IDEyOVQ1NDcgMTIwUTUxOCAxMjAgNDkzIDEyOFQ0NDcgMTUwVDQwNSAxODFUMzY2IDIxN1EzNDcgMTk5IDMyOCAxODJUMjg3IDE1MVQyNDAgMTI5VDE4NiAxMjBRMTU3IDEyMCAxMjkgMTI5VDc5IDE1NlQ0NCAyMDNUMzAgMjcxUTMwIDMxMCA0MyAzMzhUNzkgMzg1VDEyOSA0MTNUMTg2IDQyMlEyMTUgNDIyIDI0MCA0MTRUMjg2IDM5MlQzMjcgMzYxVDM2NiAzMjVRMzg1IDM0MyA0MDUgMzYwVDQ0NiAzOTFUNDkzIDQxM1Q1NDcgNDIyUTU3NiA0MjIgNjA0IDQxNFQ2NTQgMzg3VDY4OSAzNDBUNzAzIDI3MVpNMTg3IDIyMlEyMjMgMjIyIDI1MiAyMzVUMzA4IDI3MVEyODIgMjkyIDI1MyAzMDZUMTg3IDMyMFExNjcgMzIwIDE0OSAzMDlUMTMwIDI3MVExMzAgMjQ0IDE0OCAyMzNUMTg3IDIyMlpNNTQ2IDMyMFE1MTAgMzIwIDQ4MSAzMDZUNDI1IDI3MVE0NTEgMjQ5IDQ4MCAyMzZUNTQ2IDIyMlE1NjYgMjIyIDU4NCAyMzNUNjAzIDI3MVE2MDMgMjk4IDU4NSAzMDlUNTQ2IDMyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMkI7IiBnbHlwaC1uYW1lPSJpbnRlZ3JhbCciIGhvcml6LWFkdi14PSIzOTYiIGQ9Ik0xNjQgNTk2UTE3MiA2NTQgMjAxIDY4NVEyMjggNzE0IDI3MSA3MjNUMzc1IDcyNFY2NDhRMzE0IDY1MyAyODggNjQwVDI1NSA1ODRMMTY4IC0zMlExNTkgLTk1IDEyOCAtMTI2UTEwNSAtMTQ5IDcwIC0xNTVULTE1IC0xNTVWLTgxUTIyIC04NCA0NSAtNzVUNzQgLTI1TDE2NCA1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjQ4OyIgZ2x5cGgtbmFtZT0iYXBwcm94ZXF1YWwiIGhvcml6LWFkdi14PSI1MjkiIGQ9Ik0xNDYgMTM0UTEyMSAxMzQgMTIxIDE2MFExMjEgMTc2IDEyNiAxOTJUMTQwIDIyMVQxNjIgMjQyVDE5MCAyNTBRMjE0IDI1MCAyNTQgMjI5VDMzOCAxNzBRMzQyIDE4MyAzNDcgMTk2VDM1OCAyMTlUMzcwIDIzNlQzODQgMjQzUTQwOSAyNDMgNDA5IDIxN1E0MDkgMjAwIDQwNCAxODRUMzkwIDE1NlQzNjggMTM1VDM0MCAxMjdRMzE2IDEyNyAyNzYgMTQ4VDE5MiAyMDdRMTg4IDE5NCAxODMgMTgxVDE3MiAxNThUMTYwIDE0MVQxNDYgMTM0Wk0xNDYgMjY4UTEyMSAyNjggMTIxIDI5NFExMjEgMzEwIDEyNiAzMjZUMTQwIDM1NVQxNjIgMzc2VDE5MCAzODRRMjE0IDM4NCAyNTQgMzYzVDMzOCAzMDRRMzQyIDMxNyAzNDcgMzMwVDM1OCAzNTNUMzcwIDM3MFQzODQgMzc3UTQwOSAzNzcgNDA5IDM1MVE0MDkgMzM0IDQwNCAzMThUMzkwIDI5MFQzNjggMjY5VDM0MCAyNjFRMzE2IDI2MSAyNzYgMjgyVDE5MiAzNDFRMTg4IDMyOCAxODMgMzE1VDE3MiAyOTJUMTYwIDI3NVQxNDYgMjY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2MDsiIGdseXBoLW5hbWU9Im5vdGVxdWFsIiBob3Jpei1hZHYteD0iNjMwIiBkPSJNMTMzIDM0NlExMTUgMzQ2IDEwOSAzNTNUMTAyIDM3M1YzODBRMTAyIDM5MyAxMDggNDAwVDEzMyA0MDdIMzUwTDQxOSA1NDlRNDI3IDU2NSA0MzYgNTY3VDQ1NyA1NjVMNDYzIDU2MlE0NzUgNTU2IDQ3OCA1NDhUNDc0IDUyMkw0MTggNDA3SDQ5NlE1MTQgNDA3IDUyMCA0MDBUNTI3IDM4MFYzNzNRNTI3IDM2MCA1MjEgMzUzVDQ5NiAzNDZIMzg0TDMwMyAxODBINDk2UTUxNCAxODAgNTIwIDE3M1Q1MjcgMTUzVjE0NlE1MjcgMTMzIDUyMSAxMjZUNDk2IDExOUgyNzhMMjEwIC0yMlEyMDIgLTM5IDE5MyAtNDFUMTcyIC0zOEwxNjYgLTM1UTE1NCAtMzAgMTUxIC0yMVQxNTUgNUwyMTAgMTE5SDEzM1ExMTUgMTE5IDEwOSAxMjZUMTAyIDE0NlYxNTNRMTAyIDE2NiAxMDggMTczVDEzMyAxODBIMjQ1TDMyNiAzNDZIMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGdseXBoLW5hbWU9Imxlc3NlcXVhbCIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTEwOSA0MjNRMTA5IDQ0NSAxMTQgNDUyVDEyOSA0NjVMNDk2IDYyNlE0OTggNjI3IDUwNyA2MThUNTE4IDU5NVE1MjIgNTg0IDUxMCA1NzBUNDc3IDU0NkwxNzMgNDIzTDQ3NyAzMDFRNDk3IDI5MyA1MDggMjc5VDUxOCAyNTFRNTE2IDIzNSA1MDggMjI3VDQ5NiAyMjBMMTI5IDM4MFExMTkgMzg1IDExNCAzOTJUMTA5IDQyM1pNMTMzIDExN1ExMTUgMTE3IDEwOSAxMjRUMTAyIDE0NFYxNTFRMTAyIDE2NCAxMDggMTcxVDEzMyAxNzhINDk2UTUxNCAxNzggNTIwIDE3MVQ1MjcgMTUxVjE0NFE1MjcgMTMxIDUyMSAxMjRUNDk2IDExN0gxMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlcmVxdWFsIiBob3Jpei1hZHYteD0iNjMwIiBkPSJNMTExIDU5OFExMTMgNjEyIDEyMiA2MjFUMTMzIDYyOUw1MDAgNDY4UTUxMCA0NjMgNTE1IDQ1NlQ1MjAgNDI2UTUyMCA0MDMgNTE1IDM5NlQ1MDAgMzgzTDEzMyAyMjNRMTMwIDIyMSAxMjIgMjI5VDExMSAyNTRRMTEwIDI2OCAxMjIgMjgyVDE1MiAzMDRMNDU1IDQyNkwxNTIgNTQ5UTEzMiA1NTggMTIwIDU3MlQxMTEgNTk4Wk0xMzMgMTIwUTExNSAxMjAgMTA5IDEyN1QxMDIgMTQ3VjE1NFExMDIgMTY3IDEwOCAxNzRUMTMzIDE4MUg0OTZRNTE0IDE4MSA1MjAgMTc0VDUyNyAxNTRWMTQ3UTUyNyAxMzQgNTIxIDEyN1Q0OTYgMTIwSDEzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDI1Q0E7IiBnbHlwaC1uYW1lPSJsb3plbmdlIiBob3Jpei1hZHYteD0iNTIwIiBkPSJNMzAgMzg4TDIyNiA3NzZIMjk0TDQ5MCAzODhMMjk0IDBIMjI2TDMwIDM4OFpNMzcwIDM4OEwyNjAgNjE2TDE1MCAzODhMMjYwIDE1OUwzNzAgMzg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkIwMTsiIGdseXBoLW5hbWU9ImZpIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNMTI2IDQxOEgyNVY0NzZIMTI2VjUyMFExMjYgNjAyIDE2MSA2NDVUMjY2IDY4OVEyOTcgNjg5IDMxNiA2ODJUMzQ4IDY2M1EzNjEgNjUwIDM2MSA2MzNRMzYxIDYxNiAzNTMgNjA4VDM0MiA2MDJRMzMxIDYxMyAzMTEgNjIyVDI2NiA2MzFRMjI1IDYzMSAyMDcgNjA0VDE4OSA1MTdWNDc2SDMxNlY0MThIMTkwVjBIMTI2VjQxOFpNNDE3IDQ0OVE0MTcgNDY3IDQyNSA0NzNUNDQ2IDQ4MEg0NTNRNDY2IDQ4MCA0NzQgNDc0VDQ4MiA0NDlWMEg0MTdWNDQ5Wk00NDkgNTk1UTQwNyA1OTUgNDA3IDYzOFE0MDcgNjgxIDQ1MSA2ODFRNDkzIDY4MSA0OTMgNjM4UTQ5MyA1OTUgNDQ5IDU5NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCMDI7IiBnbHlwaC1uYW1lPSJmbCIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTEyNiA0MThIMjVWNDc2SDEyNlY1MjBRMTI2IDYwMiAxNjEgNjQ1VDI2NiA2ODlRMjk3IDY4OSAzMTYgNjgyVDM0OCA2NjNRMzYxIDY1MCAzNjEgNjMzUTM2MSA2MTYgMzUzIDYwOFQzNDIgNjAyUTMzMSA2MTMgMzExIDYyMlQyNjYgNjMxUTIyNSA2MzEgMjA3IDYwNFQxODkgNTE3VjQ3NkgzMTZWNDE4SDE5MFYwSDEyNlY0MThaTTQxNyA2NzRRNDE3IDY3NiA0MjMgNjc4VDQzOSA2ODFRNDU2IDY4MSA0NjkgNjY5VDQ4MiA2MThWMEg0MTdWNjc0WiIgIC8+CisKKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRkOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJZIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJDIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iTyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJRIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlQiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlUiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iViIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJXIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlwiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0idiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGM0OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzU7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hhZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YTk7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIxMjI7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGM2OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDNjMDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMwOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzM7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkNTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTUyOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMWM7IiBrPSIxMDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDFkOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDE4OyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTc4OyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ0OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkMjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRiOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4ZGQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJZIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlYiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3gxNzg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGRkOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iWSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iQSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJWIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJYIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM0OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzY7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4MTc4OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzI7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE2MDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iUyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxNjE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0icyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSIpIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iOiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJAIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iQSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJHIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iSiIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ik8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJRIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iVCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJhIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iYyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImQiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJlIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Im8iIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0icSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZTc7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGFlOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQ4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDNjMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hlNjsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hhYjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hiYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGMwOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGMzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQ1OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE1MjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxNTM7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDE0OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMzk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDFhOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDI7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE2MDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE2MTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0icyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iKSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MmM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iLiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSI6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iQCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJBIiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iRyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJKIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ik8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iUSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJUIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJYIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJdIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJhIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImMiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZCIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJlIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InEiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iciIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ifSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM1OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZTc7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDEzMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDNjMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZTY7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGFiOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hiYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAyNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNTsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTUyOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNTM7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMzk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwM2E7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMyOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ0OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MmM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9Ii0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iLiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE4OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxOTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGYwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJDIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IkciIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJPIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IlEiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iVCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJhIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iYyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJkIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJnIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJqIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ2OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hlNzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDg7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGU2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ1OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxNTI7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDE1MzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkMzsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDQ7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQyOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hmMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iQyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJHIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iTyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJRIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IlQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iYSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJlIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iaiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJxIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGM1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZTc7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hlNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNTsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTUyOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxNTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDM7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ0OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkMjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4YWI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MjAxMzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MjAxNDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iQSIgaz0iLTM0IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IkoiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJYIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzQ7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzU7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzY7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzA7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzM7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzI7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzE7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSImI3hkZDsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlkiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlYiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlciIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlgiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9ImciIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9ImoiIGs9Ii0xNTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSImI3gxNzg7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSJBIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM0OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzY7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMwOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMxOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iMCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjEiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iNiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjgiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iQSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Ik8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJWIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM1OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IloiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSIxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IjciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iVCIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iWCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjEiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iQyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iRyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iTyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iUSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJnIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkODsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeDE1MjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iNyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSItIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IjQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iJiN4MjAxMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iJiN4MjAxNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iMyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iNyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSI3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeGIwOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyMTIyOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSI3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IjciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MmM7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Ii0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iLiIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIwIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjEiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjMiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjQiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iNSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeGEyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDI2OyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDEzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDE0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDFhOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDFlOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iLiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSI3IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMjY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMWE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMWU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDJjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSIuIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IjciIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAyNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAxYTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAxZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZGQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iMSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSI3IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IjEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iNyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJUIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiZndDsiIHUyPSI3IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlkiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iVCIgaz0iMTE2IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iViIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZGQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJZIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJhIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iZCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJlIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9Im8iIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0icSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ0IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hlNzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZTY7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeDE1MzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4MTc4OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlkiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTdkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJYIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGM2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxNzg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IlQiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iYyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJkIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImUiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJnIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ibyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJxIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZTc7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hlNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MTUzOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNjE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZGQ7IiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJZIiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InoiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJmFtcDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MmM7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iLiIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSIvIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IjoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iSiIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJUIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJXIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJjIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJmIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJpIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0icSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJyIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ieCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGU3OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZTY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMjY7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMwOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTUzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDEzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDE0OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNzg7IiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDFhOyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDFlOyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGRkOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJZIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MmM7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSIuIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJUIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iVyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAyNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDE3ODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAxYTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIwMWU7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSCIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSSIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJJIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSJBIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hmMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTYwOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkZDsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTdkOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IloiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImYW1wOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSItIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iQyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJHIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9Ik8iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iUSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJUIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iViIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJhIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJnIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE1MjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDEzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDE0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNzg7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkZDsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iWSIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJ5IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkAiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJHIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Ik8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iUSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJUIiBrPSIxMDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJVIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlYiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJcIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGE5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gzYzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE1MjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMDFjOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxZDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxODsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMTk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE3ODsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTSIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0iLyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik0iIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTiIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0iLyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik4iIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGRkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJZIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJBIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IkoiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTc4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGRkOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0ieSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MTdkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJaIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiZhbXA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDJjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSIuIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkEiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iSiIgaz0iODUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJWIiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJXIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJmIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idiIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0ieCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNDsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzU7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNjsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMjY7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMwOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMzsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxNzg7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyMDFhOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyMDFlOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMjsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzE7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGRkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJZIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSIvIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iQSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlgiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hkZDsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiZhbXA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4MTc4OyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTYxOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZGQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJZIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ5IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE3ZDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iWiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ6IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiZhbXA7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDJjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSItIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Ii4iIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iOiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iQSIgaz0iNjYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJDIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iSiIgaz0iODUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJPIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iXCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iYSIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJjIiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImQiIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZSIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImciIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibSIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJuIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im8iIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icCIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJxIiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InIiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ1IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InYiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ4IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM0OyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNTsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGU3OyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxMzE7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGFlOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzY7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gzYzA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGU2OyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hiZjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YWI7IiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hiYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAyNjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzA7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMzOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTUyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxNTM7IiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTM7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTQ7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE3ODsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMzk7IiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDNhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFhOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFlOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzE7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IkEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE2MDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE2MTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkZDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlkiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJmFtcDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iKSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MmM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Ii0iIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iLiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSI6IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iQSIgaz0iNTciIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IkciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iSiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iVCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iVyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Il0iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJjIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImciIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJuIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJxIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InIiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ1IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ4IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9In0iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM0OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjNTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGU3OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxMzE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZTY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hiYjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAyNjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTQ7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE3ODsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMzk7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwM2E7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWE7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWU7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMyOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTYxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJzIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImYW1wOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIpIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iLSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkEiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkoiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJYIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Il0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImEiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJjIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImQiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJmIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJpIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im0iIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibiIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJvIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InAiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJyIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idSIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ9IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hlNzsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTMxOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hlNjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YWI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGJiOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDE1MzsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAzOTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAzYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZGQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJZIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiZhbXA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IikiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ii0iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iQyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJHIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ik8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iUSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJUIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJXIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Il0iIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJtIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJwIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9In0iIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNTsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTUyOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE3ODsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQyOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSImI3hkZDsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlkiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlYiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlciIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlgiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9ImciIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9ImoiIGs9Ii0xNTAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSImI3gxNzg7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3hkZDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iWSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJUIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlYiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iVyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImoiIGs9Ii0xMzAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeDE3ODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iYSIgdTI9Ij8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hmMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iKSIgaz0iLTcwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iKiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MmM7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ii0iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLiIgaz0iODAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSI/IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJcIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJdIiBrPSItNzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9In0iIGs9Ii03MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjEyMjsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hhYjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YmI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMjY7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxMzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxNDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMWQ7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDE4OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxOTsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMzk7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwM2E7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMWE7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMWU7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJnIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iayIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibSIgdTI9Ij8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSItIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ii4iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSI/IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iciIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZiIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iciIgdTI9InQiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDEzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZDsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE5OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MmM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSIuIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDI2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMWM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDE4OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxYTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMWU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAyNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDFjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxZDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDE5OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MmM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9Ii4iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAyNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxYzsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDE4OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxOTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9Ii0iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iYSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJjIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iZSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJvIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9InEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTc7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGU2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3hhYjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MTUzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDEzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDE0OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDFjOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxZDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDE5OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAzOTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iJiN4ZGQ7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJZIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJXIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJYIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJnIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJqIiBrPSItMTUwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iJiN4MTc4OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iUyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSIqIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MmM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ii0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iLiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iRyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iUyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSIqIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MmM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Ii0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iLiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iRyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iQCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IlQiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iYSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJkIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iZSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJnIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJvIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0icSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZTY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4MTUzOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQxOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMTsiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDE7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGRkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlkiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJBIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlgiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxNzg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTk7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU5OyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZTg7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZWE7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGVhOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZWI7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGViOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDFjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IngiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDFjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGIwOyIgdTI9IjQiIGs9IjY1IiAvPgorPGhrZXJuIHUxPSImI3hhMzsiIHUyPSIxIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGEzOyIgdTI9IjQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9ImciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IngiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJUIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJjIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iZCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImUiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iZyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0ibyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9InEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZTc7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGU2OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hkZDsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJZIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTdkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IloiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iLiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iQSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IkoiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJYIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hjNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGM2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTc4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hjMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4ZGQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGM1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTY7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9IngiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iWSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSIxIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSI3IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iQyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IkciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iUSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlQiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iVyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ3IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNzg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTkyOyIgdTI9IjEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iWSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0ieiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlQiIGs9IjExMCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJ4IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIxIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iViIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGMzOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE2MDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IioiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iLSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSIuIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJHIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iSiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iUSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iVyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ4IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hhZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gzYzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE2MDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IioiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iLSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSIuIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJHIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iSiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iUSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iVyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ4IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hhZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gzYzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGRkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlkiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJBIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlgiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxNzg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iYSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJjIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJvIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGU2OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gxNTM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNTM7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeDE3ZDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IloiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IjEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IjciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJYIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJaIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSIxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSI3IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iVCIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iWCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ieCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDE2MTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InMiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGRkOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlkiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJBIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJKIiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJXIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImMiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImUiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9Im0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9Im4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9Im8iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGM0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGM2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4ZTY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGMzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTUzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTc4OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGMyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3gxNjA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJTIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJKIiBrPSIxMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iYSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iYyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iZCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iZSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0ibyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0icSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hlNzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZTY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE1MzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDE2MTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InMiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGRkOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlkiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJBIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJKIiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJXIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImMiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImUiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9Im0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9Im4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9Im8iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGM0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hlNzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGM2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4ZTY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTUzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTc4OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3gxNjA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJTIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJKIiBrPSIxMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0ibyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0icSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hlNzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZTY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iUyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJzIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImYW1wOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSIpIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iLSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IjoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJAIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iQyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJHIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkoiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iTyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJRIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlQiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlYiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Il0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImEiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iYyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJkIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImUiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJnIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Im0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJvIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0icSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJyIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0idSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ9IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ2OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNjsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YWI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ1OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNTI7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDE1MzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkMzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQyOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGE0OyIgdTI9IjQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IiYjeGRkOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iWSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iVCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJ6IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJUIiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0ieCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIxIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iViIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iaiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM1OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMyOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iOSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iQSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9Ik8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlQiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImoiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjNDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTYwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iKiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDJjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSItIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ii4iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iQCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iQyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJKIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ik8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJRIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iVCIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJXIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ0IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IngiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGE5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIxMjI7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDNjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMjY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDE4OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJUIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJjIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImUiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0ibyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9InEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZTc7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGU2OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeDE1MzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iUyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSIqIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MmM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Ii0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iLiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iRyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iQCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IlQiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iYSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJkIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iZSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJnIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJvIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0icSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4ZTY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4MTUzOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJhIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iYyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJlIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9Im8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJxIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGU3OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hlNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3gxNTM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2Q7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNkOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjZDsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNlOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjZTsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2Y7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNmOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2M7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNjOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYzsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iWSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iWSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSIxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iVCIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKworPC9mb250PgorPC9kZWZzPgorPHRleHQgeD0iNDAiIHk9IjQwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEHDgcOAw4LDhMOFw4PDhiBDw4cgRMOQIEXDicOIw4rDiyBJIMONIMOMIMOOIMOPIE7DkTwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSI4MCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID5Pw5PDksOUw5bDlcOYxZIgU8WgIFXDmsOZw5vDnCBZw53FuCBaxb0gw54gYcOhw6DDosOkw6XDo8OmIGPDpyBkw7AgZcOpw6jDqsOrIGkgxLEgw60gw6wgw64gw68gbsOxIG/Ds8Oyw7TDtsO1w7jFkyBzxaHDnyB1w7rDucO7w7wgecO9w78gesW+PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjEyMCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7DviAxMjM0NTY3ODkwIMK9IMK8IMK+ICUg4oCwICTCosKjwqXGkuKCrMKkIOKAoCDigKEgwqcgwrYgIyBefsK1ICvDl8KxICZsdDsgPSAmZ3Q7IMO3wqwgIcKhP8K/ICZxdW90OyAmYW1wOyAmYXBvczsgKiDCsCAuICwgOiA7ICgpIFsgXCBdIHt9IC8gfDwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxNjAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+wqYgXyDigJog4oCeIOKApiDigLnigLogwqvCuyDigJgg4oCZIOKAnCDigJ0g4oCiIMKtIC0g4oCTIOKAlCBAIMKpIMKuIOKEoiDCqsK6IMK5wrLCsyDCtCBgIMuGIMucIMKoIMKvIMK3IMK4PC90ZXh0PgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyLnR0ZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDIudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDJiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyLndvZmYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyLndvZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjZjFmMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDIud29mZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyQm9sZC5lb3QgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyQm9sZC5lb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ODkyZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJCb2xkLmVvdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyQm9sZC5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyQm9sZC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MDk4MQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJCb2xkLnN2ZwpAQCAtMCwwICsxLDQzNjUgQEAKKzw/eG1sICB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiID4KKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiA+Cis8bWV0YWRhdGE+Cis8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Cis8aWQ+PCFbQ0RBVEFbT21uZXNfQVRUIFcwMiBCb2xkXV0+PC9pZD4KKzx2ZW5kb3I+TW9ub3R5cGUgSW1hZ2luZyBJbmMuPC92ZW5kb3I+Cis8Y3JlZGl0cz4KKzxuYW1lPkZvbnRzLmNvbSBXZWJGb250czwvbmFtZT4KKzxVUkw+aHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbTwvVVJMPgorPHJvbGU+SG9tZSBvZiB0aGUgV2ViIGZvbnRzPC9yb2xlPgorPC9jcmVkaXRzPgorPGxpY2Vuc2U+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb20vTGVnYWw8L1VSTD4KKzwvbGljZW5zZT4KKzxjb3B5cmlnaHQ+PCFbQ0RBVEFbR2VuZXJhdGVkIGluIDIwMTAgYnkgRm9udExhYiBTdHVkaW8uIENvcHlyaWdodCBpbmZvIHBlbmRpbmcuXV0+PC9jb3B5cmlnaHQ+Cis8dHJhZGVtYXJrPjwvdHJhZGVtYXJrPgorPGxpY2Vuc2VlPgorPG5hbWU+PC9uYW1lPgorPC9saWNlbnNlZT4KKzwvbWV0YWRhdGE+Cis8ZGVmcyA+Cis8Zm9udCBob3Jpei1hZHYteD0iNTY5IiBpZD0iT21uZXNfQVRUVzAyQm9sZCI+Cis8Zm9udC1mYWNlIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIEJvbGQiIHBhbm9zZS0xPSIyIDAgOCAwIDAgMCAwIDAgMCAwIiBhc2NlbnQ9IjkwOSIgZGVzY2VudD0iLTIzMyIgdW5pdHMtcGVyLWVtPSIxMDAwIiBhbHBoYWJldGljPSIwIj4KKzwvZm9udC1mYWNlPgorPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjUwMCIgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGdseXBoLW5hbWU9InNwYWNlIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiEiIGdseXBoLW5hbWU9ImV4Y2xhbSIgaG9yaXotYWR2LXg9IjI5NyIgZD0iTTEzOCAyMTZRMTE5IDIxNiAxMDggMjMwVDkwIDI3NkwyNCA2NDdIMjc0TDIwOCAyNzZRMjAwIDI0NCAxODkgMjMwVDE1NyAyMTZIMTM4Wk0xMzYgLThRNTUgLTggNTUgNzNWODlRNTUgMTcwIDEzNiAxNzBIMTU5UTI0MiAxNzAgMjQyIDg5VjczUTI0MiAtOCAxNTkgLThIMTM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJnF1b3Q7IiBnbHlwaC1uYW1lPSJxdW90ZWRibCIgaG9yaXotYWR2LXg9IjQ3OSIgZD0iTTMzOSAzMzBRMzAwIDMzMCAyOTQgMzc0TDI1OCA2NDdINDQxTDQwNSAzNzRRMzk4IDMzMCAzNjAgMzMwSDMzOVpNMTE4IDMzMFE3OSAzMzAgNzMgMzc0TDM3IDY0N0gyMjBMMTg0IDM3NFExNzggMzMwIDEzOSAzMzBIMTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgZ2x5cGgtbmFtZT0ibnVtYmVyc2lnbiIgaG9yaXotYWR2LXg9IjY5OCIgZD0iTTEzIDI2N0gxNTNMMTg5IDM4MEg5MlY1MThIMjMyTDI3NSA2NTVRMjc2IDY2MiAyOTMgNjYyUTMwMyA2NjIgMzE3IDY1N1QzNDMgNjQzVDM2NCA2MThUMzczIDU4M1EzNzMgNTY4IDM2NyA1NDdMMzU4IDUxOEg0NjFMNTA0IDY1NVE1MDcgNjYyIDUyMiA2NjJRNTMzIDY2MiA1NDcgNjU3VDU3MyA2NDNUNTk0IDYxOFQ2MDMgNTgzUTYwMyA1NjcgNTk2IDU0N0w1ODcgNTE4SDY4NFYzODBINTQ0TDUwOCAyNjdINjA2VjEyOUg0NjVMNDIzIC03UTQyMSAtMTUgNDA1IC0xNVEzOTQgLTE1IDM4MSAtMTBUMzU0IDVUMzMzIDMwVDMyNCA2NVEzMjQgNzMgMzI2IDgxVDMzMSAxMDFMMzM5IDEyOUgyMzZMMTk0IC03UTE5MSAtMTUgMTc2IC0xNVExNjUgLTE1IDE1MSAtMTBUMTI1IDVUMTA0IDMwVDk1IDY1UTk1IDgwIDEwMSAxMDFMMTEwIDEyOUgxM1YyNjdaTTI3OCAyNjZIMzgzTDQxOSAzODFIMzE0TDI3OCAyNjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIkIiBnbHlwaC1uYW1lPSJkb2xsYXIiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik0yMTAgOFExMTkgMTggNzQgNTFUMjggMTMyUTI4IDE1MSAzNyAxNjhUNTYgMTk4VDc2IDIxNlQ4OCAyMjFRMTExIDIwMSAxNDYgMTg0VDIxOSAxNThWMjYyUTE4NyAyNzAgMTU0IDI4M1Q5NCAzMThUNTAgMzczVDMyIDQ1NVEzMiA1MjcgODIgNTc0VDIyNCA2MzhWNzM3SDM3NVY2NDFRNDU2IDYzMSA0OTUgNjAxVDUzNSA1MjVRNTM1IDUwNCA1MjYgNDg2VDUwNSA0NTZUNDgzIDQzNlQ0NzEgNDMwUTQyNiA0NzAgMzY1IDQ4OVYzODdRMzk3IDM3OSA0MzEgMzY2VDQ5NCAzMzFUNTQxIDI3N1Q1NjAgMTk4UTU2MCAxMjIgNTA4IDc1VDM2MCAxMVYtOThIMjEwVjhaTTIyMiA0OTNRMjAzIDQ5MiAxOTIgNDgzVDE4MCA0NTZRMTgwIDQzOSAxOTEgNDI5VDIyMiA0MTFWNDkzWk0zNjIgMTUxUTQwMiAxNTMgNDAyIDE5MFE0MDIgMjA3IDM5MiAyMTZUMzYyIDIzM1YxNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIlIiBnbHlwaC1uYW1lPSJwZXJjZW50IiBob3Jpei1hZHYteD0iNzQzIiBkPSJNMTQ4IC0xM1ExNDYgLTE2IDEzMyAtMTNUMTA0IC0xVDc3IDIxVDY0IDUwUTY0IDcxIDg5IDk5TDU5MyA2NThRNTk2IDY2MSA2MDkgNjU4VDYzOCA2NDZUNjY1IDYyNVQ2NzcgNTk2UTY3NyA1NzMgNjUzIDU0NkwxNDggLTEzWk0xODAgMzM1UTEwMCAzMzUgNTMgMzc3VDYgNDkyVjQ5OVE2IDU3MiA1MyA2MTRUMTgwIDY1N1EyNTkgNjU3IDMwNiA2MTVUMzUzIDUwMFY0OTNRMzUzIDQyMCAzMDYgMzc4VDE4MCAzMzVaTTE4MCA0MzBRMjAxIDQzMCAyMTUgNDQ0VDIzMCA0ODhWNTA0UTIzMCA1MzQgMjE2IDU0OFQxODAgNTYzUTE1NyA1NjMgMTQ0IDU0OVQxMzAgNTA0VjQ4OFExMzAgNDU5IDE0NCA0NDVUMTgwIDQzMFpNNTY0IC0xMlE0ODQgLTEyIDQzNyAzMFQzODkgMTQ1VjE1MlEzODkgMjI1IDQzNyAyNjdUNTY0IDMxMFE2NDMgMzEwIDY5MCAyNjhUNzM3IDE1M1YxNDZRNzM3IDczIDY5MCAzMVQ1NjQgLTEyWk01NjQgODNRNTg1IDgzIDU5OSA5N1Q2MTQgMTQxVjE1N1E2MTQgMTg3IDYwMCAyMDFUNTY0IDIxNlE1NDEgMjE2IDUyOCAyMDJUNTE0IDE1N1YxNDFRNTE0IDExMSA1MjggOTdUNTY0IDgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFtcDsiIGdseXBoLW5hbWU9ImFtcGVyc2FuZCIgaG9yaXotYWR2LXg9IjcxMSIgZD0iTTI3MCAtMTRRMTQ5IC0xNCA4MyAzNlQxNiAxODFRMTYgMjQ0IDUyIDI4OVQxNTQgMzU5UTEyNiAzODUgMTEwIDQxN1Q5NCA0ODRROTQgNTI0IDExMCA1NTZUMTU1IDYxMlQyMjYgNjQ4VDMxOSA2NjFRMzY0IDY2MSA0MDEgNjUwVDQ2NSA2MTdUNTA1IDU2NVQ1MjAgNDk5UTUyMCA0NDYgNDg1IDQwN1QzODkgMzQ2TDQ3NyAyNzJRNDg4IDI5NCA0OTggMzIxVDUyMiAzOTBINjg3UTY3MyAzMzEgNjQ3IDI3OFQ1ODYgMTc4TDcxMSA3NFE3MTIgNzMgNzA2IDYwVDY4OCAzMlQ2NTUgNFQ2MDggLTlRNTg1IC05IDU1NyAyVDUwMSA0Nkw0ODQgNjNRNDQzIDI3IDM5MSA3VDI3MCAtMTRaTTI2MiA0NzlRMjYyIDQ1NyAyNzIgNDQxVDMwMSA0MDdRMzQwIDQyMCAzNTYgNDM4VDM3MiA0ODJRMzcyIDUwNyAzNTcgNTIzVDMxOCA1MzlRMjkyIDUzOSAyNzcgNTIyVDI2MiA0NzlaTTI4NSAxMTdRMzExIDExNyAzMzYgMTI4VDM4MyAxNThMMjM3IDI4NFEyMTEgMjcwIDE5NyAyNTFUMTgyIDIwM1ExODIgMTYzIDIxMCAxNDBUMjg1IDExN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgZ2x5cGgtbmFtZT0icXVvdGVzaW5nbGUiIGhvcml6LWFkdi14PSIyNTgiIGQ9Ik0xMTggMzMwUTc5IDMzMCA3MyAzNzRMMzcgNjQ3SDIyMEwxODQgMzc0UTE3OCAzMzAgMTM5IDMzMEgxMThIMTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKCIgZ2x5cGgtbmFtZT0icGFyZW5sZWZ0IiBob3Jpei1hZHYteD0iNDQxIiBkPSJNMzQyIC0xOThRMjgzIC0xOTggMjI3IC0xNjVUMTI4IC03M1Q1OCA2M1QzMSAyMzFRMzEgMzE5IDU3IDM5N1QxMjcgNTMzVDIyNyA2MjVUMzQyIDY1OVEzODcgNjU5IDQxMCA2MzdUNDM0IDU3NlE0MzQgNTYzIDQzMCA1NTJUNDE5IDUzM1Q0MDggNTIxVDQwMCA1MTVRMzU1IDUwMyAzMjIgNDc4VDI2NyA0MTVUMjMzIDMzMlQyMjIgMjMxUTIyMiAxMjIgMjY2IDQ2VDQwMCAtNTVRNDAyIC01NSA0MDcgLTU5VDQxOSAtNzJUNDI5IC05MVQ0MzQgLTExNVE0MzQgLTE1NCA0MTEgLTE3NlQzNDIgLTE5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IikiIGdseXBoLW5hbWU9InBhcmVucmlnaHQiIGhvcml6LWFkdi14PSI0NDEiIGQ9Ik05OSAtMTk4UTU1IC0xOTggMzEgLTE3NlQ3IC0xMTVRNyAtMTAyIDExIC05MVQyMiAtNzJUMzMgLTYwVDQxIC01NVExMzAgLTMxIDE3NCA0NVQyMTkgMjMxUTIxOSAyODUgMjA4IDMzMVQxNzUgNDE1VDExOSA0NzdUNDEgNTE1UTM5IDUxNiAzNCA1MjBUMjIgNTMzVDEyIDU1MlQ3IDU3NlE3IDYxNCAzMSA2MzZUOTkgNjU5UTE1OCA2NTkgMjE0IDYyNlQzMTMgNTM0VDM4MyAzOTdUNDEwIDIzMVE0MTAgMTQxIDM4NCA2M1QzMTQgLTczVDIxNCAtMTY0VDk5IC0xOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBnbHlwaC1uYW1lPSJhc3RlcmlzayIgaG9yaXotYWR2LXg9IjQzMyIgZD0iTTg5IDI4NFE3MiAyOTMgNjcgMzA5VDc2IDM1MkwxMTMgNDIyTDQ4IDQ1NVEyMiA0NjkgMTggNDgxVDE5IDUxN0wyMCA1MjFRMjYgNTQzIDM4IDU1MVQ4MCA1NTRMMTU2IDU0MUwxNjcgNjEzUTE3MiA2NDMgMTg0IDY1MVQyMTcgNjYwSDIyMVEyNDEgNjYwIDI1NCA2NTJUMjcyIDYxM0wyODEgNTQxTDM1NiA1NTRRMzg2IDU1OSAzOTkgNTUwVDQxNyA1MjFMNDE4IDUxN1E0MjQgNDk1IDQyMCA0ODJUMzg5IDQ1NUwzMjMgNDIxTDM2MSAzNTJRMzc1IDMyNSAzNjkgMzEwVDM0NyAyODRMMzQ0IDI4MlEzMjkgMjcyIDMxNCAyNzFUMjc2IDI5MEwyMTggMzQ4TDE2MSAyOTBRMTM5IDI2OSAxMjUgMjcwVDkzIDI4Mkw4OSAyODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIrIiBnbHlwaC1uYW1lPSJwbHVzIiBob3Jpei1hZHYteD0iNTM1IiBkPSJNOTIgMTg0UTU0IDE4NCAzNSAyMDJUMTYgMjQ5VjI1OFExNiAyODUgMzUgMzAzVDkyIDMyMkgxOTRWNDI5UTE5NCA0NjcgMjEyIDQ4NlQyNjAgNTA1SDI3NVEzMDMgNTA1IDMyMSA0ODZUMzQwIDQyOVYzMjJINDQzUTQ4MiAzMjIgNTAwIDMwNFQ1MTkgMjU4VjI0OVE1MTkgMjIwIDUwMSAyMDJUNDQzIDE4NEgzNDBWNzRRMzQwIDM1IDMyMiAxN1QyNzUgLTJIMjYwUTIzMSAtMiAyMTMgMTZUMTk0IDc0VjE4NEg5Mkg5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJjOyIgZ2x5cGgtbmFtZT0iY29tbWEiIGhvcml6LWFkdi14PSIyNTkiIGQ9Ik0xMDYgLTk3UTkzIC0xMTAgNzUgLTExMlQ0MCAtMTA4VDE1IC04N1Q5IC01M0w0NCA5M1E0OCAxMTMgNTMgMTI4VDY4IDE1MlQ5MiAxNjdUMTMwIDE3MkgxNTFRMTg2IDE3MiAyMDUgMTU0VDIyNSA5M1Y4NVEyMjUgNjEgMjE1IDM5VDE4MiAtN0wxMDYgLTk3SDEwNloiICAvPgorPGdseXBoIHVuaWNvZGU9Ii0iIGdseXBoLW5hbWU9Imh5cGhlbiIgaG9yaXotYWR2LXg9IjQ2OSIgZD0iTTM3IDMzNEg0MzJWMTU5SDM3VjMzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ii4iIGdseXBoLW5hbWU9InBlcmlvZCIgaG9yaXotYWR2LXg9IjI1OSIgZD0iTTExNiAtOFEzNSAtOCAzNSA3M1Y4OVEzNSAxNzAgMTE2IDE3MEgxMzlRMTgzIDE3MCAyMDIgMTUxVDIyMiA4OVY3M1EyMjIgLTggMTM5IC04SDExNkgxMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIvIiBnbHlwaC1uYW1lPSJzbGFzaCIgaG9yaXotYWR2LXg9IjM4MiIgZD0iTTgxIC0yMTdRNjYgLTIxNyA1MCAtMjE1VDIxIC0yMDVULTIgLTE4NFQtMTEgLTE0OVEtMTEgLTE0MCAtMTAgLTEyOVQtMyAtMTA0TDI0MSA2NTVRMjQyIDY1NyAyNTQgNjU5VDI4MyA2NjJRMjk4IDY2MiAzMTQgNjU5VDM0MyA2NDlUMzY2IDYyOFQzNzUgNTkzUTM3NSA1ODUgMzc0IDU3NFQzNjcgNTQ5TDEyMyAtMjExUTEyMyAtMjEzIDExMSAtMjE1VDgxIC0yMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIwIiBnbHlwaC1uYW1lPSJ6ZXJvIiBob3Jpei1hZHYteD0iNjUzIiBkPSJNMzI3IC0xNFEyNTYgLTE0IDIwMSA3VDEwNyA2OFQ0OCAxNjVUMjcgMjkzVjM1NVEyNyA0MjUgNDcgNDgxVDEwNiA1NzhUMjAwIDYzOVQzMjcgNjYxUTM5NyA2NjEgNDUzIDY0MFQ1NDcgNTc5VDYwNSA0ODJUNjI2IDM1NVYyOTNRNjI2IDIyMiA2MDYgMTY2VDU0NyA2OVQ0NTMgOFQzMjcgLTE0Wk0zMjcgMTQ3UTQyNSAxNDcgNDI1IDI3NVYzNzNRNDI1IDUwMyAzMjcgNTAzUTIyOCA1MDMgMjI4IDM3M1YyNzZRMjI4IDE0NyAzMjcgMTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMSIgZ2x5cGgtbmFtZT0ib25lIiBob3Jpei1hZHYteD0iNDIwIiBkPSJNMTY0IDBWNDIyUTE0MCA0MTEgMTE3IDQxMVE3MyA0MTEgNDUgNDM5VDE2IDUxMVExNiA1MzYgMjMgNTU0VDM5IDU4M1Q1NiA1OTlUNjggNjAzUTgzIDU5MyA5OCA1ODhUMTMxIDU4M1ExNjMgNTgzIDE4OCA2MDJUMjIxIDY1NkgyNzNRMzYxIDY1NiAzNjEgNTYzVjBIMTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMiIgZ2x5cGgtbmFtZT0idHdvIiBob3Jpei1hZHYteD0iNTc3IiBkPSJNMzc3IDI1NVEzMTggMjMyIDI3NyAyMTJUMjE3IDE2MEg1NTJWMUgxNDlRMTE0IDEgOTEgNFQ1NCAxOFQzNSA0N1QyOSA5N1YxMzVRMjkgMTc3IDQ3IDIxMFQ5NSAyNzBUMTU5IDMxNlQyMjcgMzUxUTI1NSAzNjQgMjc5IDM3NFQzMjIgMzk1VDM1MCA0MTZUMzYwIDQ0M1EzNjAgNTA1IDI3NyA1MDVRMjUyIDUwNSAyMzIgNDk3VDE5NyA0NzRUMTczIDQ0MVQxNjAgNDA0UTE2MCA0MDMgMTQwIDQwM1Q5NiA0MTJUNTEgNDM4VDMxIDQ5M1EzMSA1MjkgNDggNTYwVDk4IDYxM1QxNzkgNjQ5VDI5MCA2NjJRNDE5IDY2MiA0ODYgNjA3VDU1NCA0NTNRNTU0IDQwNiA1NDAgMzc1VDUwMCAzMjFUNDQzIDI4M1QzNzcgMjU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMyIgZ2x5cGgtbmFtZT0idGhyZWUiIGhvcml6LWFkdi14PSI1ODUiIGQ9Ik01NTEgNDgwUTU1MSA0MzIgNTIxIDM5OVQ0MzMgMzQ5UTQ5NiAzMjkgNTI4IDI4OFQ1NjEgMTg3UTU2MSA5MCA0ODcgMzhUMjczIC0xNFEyMTMgLTE0IDE2NSAtMlQ4MyAzMFQzMSA3OFQxMyAxMzdRMTMgMTc0IDMxIDE5NFQ3MSAyMjJUMTExIDIzMVQxMzEgMjI4UTE0NCAxODIgMTgwIDE1OVQyNzEgMTM2UTMxOSAxMzYgMzQ1IDE1NFQzNzIgMjAzUTM3MiAyNjIgMjk2IDI2MkgxOTFWNDAzSDMwOVEzMzUgNDAzIDM1MCA0MTZUMzY2IDQ1MlEzNjYgNDc5IDM0MCA0OTVUMjY4IDUxMVEyMzYgNTExIDIxNCA1MDNUMTc2IDQ4M1QxNTMgNDU1VDE0MCA0MjVRMTQwIDQyMiAxMjIgNDIyVDgzIDQyOVQ0MyA0NTdUMjUgNTE1UTI1IDU0NiA0MiA1NzNUOTEgNjE5VDE2OSA2NTBUMjcyIDY2MVE0MDkgNjYxIDQ4MCA2MTVUNTUxIDQ4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjQiIGdseXBoLW5hbWU9ImZvdXIiIGhvcml6LWFkdi14PSI2MzAiIGQ9Ik0zMjggMFYxNDFIMTIwUTcwIDE0MSA0MiAxNjRUMTQgMjIyVjI1MFExNSAyNzMgMjIgMjkzVDQ2IDM0MkwyMDYgNTkwUTIxOCA2MTEgMjMxIDYyNFQyNjEgNjQ0VDMwNCA2NTNUMzY3IDY1NlE0NDMgNjU2IDQ3NiA2MjhUNTEwIDUyNlYyODZINjEyVjE0MUg1MTBWMEgzMjhaTTE4NCAyODJIMzM2VjUyMkwxODQgMjgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNSIgZ2x5cGgtbmFtZT0iZml2ZSIgaG9yaXotYWR2LXg9IjU2NiIgZD0iTTE5NyAzOTNRMjIwIDQwMSAyNDUgNDA1VDI5NyA0MDlRMzU0IDQwOSAzOTkgMzk1VDQ3NyAzNTVUNTI3IDI5MFQ1NDUgMjAzUTU0NSAxNTMgNTI2IDExM1Q0NzEgNDVUMzg0IDJUMjY4IC0xNFEyMDYgLTE0IDE1OSAtNFQ3OSAyNVQzMSA2NVQxNCAxMTJRMTQgMTMyIDI0IDE0OVQ0OCAxNzlUNzQgMTk4VDg4IDIwM1ExMjMgMTY2IDE2OCAxNDdUMjYzIDEyOFEzMTUgMTI4IDM0MyAxNDhUMzcyIDIwNlEzNzIgMjgzIDI2MyAyODNRMjIxIDI4MyAxOTQgMjcyVDE1MCAyNDlROTQgMjUwIDY0IDI3NVQzNCAzNjFWNTM2UTM0IDU5MCA1NSA2MThUMTI4IDY0N0g1MTZWNDg5SDE5N1YzOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI2IiBnbHlwaC1uYW1lPSJzaXgiIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik0zNTcgNTA1UTI4OSA1MDUgMjU4IDQ3MVQyMjQgMzYyUTI1MCAzODUgMjkxIDQwMFQzODggNDE2UTQ4NCA0MTYgNTQzIDM2OFQ2MDIgMjI0VjIxOVE2MDIgMTY3IDU4MiAxMjRUNTI2IDUxVDQzOCAzVDMyNiAtMTRRMjU2IC0xNCAyMDEgOFQxMDcgNzBUNDggMTY4VDI3IDI5N1YzNDVRMjcgNDE4IDQ4IDQ3NlQxMTAgNTc2VDIwOSA2MzlUMzQwIDY2MVE0NTUgNjYxIDUxNiA2MjNUNTc3IDUyMlE1NzcgNDkzIDU2MyA0NzZUNTMxIDQ1MVQ0OTggNDQwVDQ4MiA0MzlRNDY4IDQ2MyA0MzggNDg0VDM1NyA1MDVaTTMyMyAyODNRMjk2IDI4MyAyNzIgMjc0VDIyOCAyNDdRMjMxIDE5MiAyNTYgMTYzVDMyNCAxMzNRMzYxIDEzMyAzODYgMTUyVDQxMSAyMDdWMjEwUTQxMSAyNDUgMzg4IDI2NFQzMjMgMjgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNyIgZ2x5cGgtbmFtZT0ic2V2ZW4iIGhvcml6LWFkdi14PSI1NjIiIGQ9Ik0xOTggLTlRMTc0IC05IDE1MiAwVDExNSAyMVQ5MSA0NFQ4NiA2MEwzMzAgNDg2SDE4VjY0N0g0MDlRNDU0IDY0NyA0ODAgNjM5VDUyMSA2MTZUNTM5IDU4M1Q1NDQgNTQ0VjUzM1E1NDQgNTEzIDUzNyA0OTJUNTIxIDQ1MVQ1MDAgNDEzVDQ4MCAzODBMMzAwIDYxUTI3NyAyMiAyNTEgN1QxOTggLTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI4IiBnbHlwaC1uYW1lPSJlaWdodCIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTMwOSAtMTJRMTcyIC0xMiA5OCAzOFQyMyAxNzlRMjMgMjkyIDE0OCAzMzJROTMgMzUyIDY4IDM4N1Q0MiA0NzVRNDIgNTE3IDYxIDU1MlQxMTYgNjEyVDIwMiA2NTBUMzEyIDY2NFEzNzMgNjY0IDQyMSA2NTFUNTA0IDYxNFQ1NTYgNTU0VDU3NSA0NzZRNTc1IDM3MyA0NzEgMzMzUTU5OCAyOTUgNTk4IDE3OVE1OTggMTM1IDU3OCAxMDBUNTIxIDM5VDQzMCAxVDMwOSAtMTJaTTMxMSAzODdRMzQ4IDM4NyAzNzIgNDA2VDM5NiA0NTVRMzk2IDQ4NSAzNzMgNTA0VDMxMCA1MjRRMjcyIDUyNCAyNDkgNTA1VDIyNSA0NTVRMjI1IDQyNSAyNDkgNDA2VDMxMSAzODdaTTMxMSAxMjZRMzU1IDEyNiAzNzkgMTQ2VDQwNCAxOTlRNDA0IDIzMyAzNzkgMjUzVDMxMCAyNzRRMjY3IDI3NCAyNDIgMjU0VDIxNyAxOTlRMjE3IDE2NyAyNDIgMTQ3VDMxMSAxMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI5IiBnbHlwaC1uYW1lPSJuaW5lIiBob3Jpei1hZHYteD0iNjIyIiBkPSJNMjYwIDE0MVEzMzEgMTQxIDM2MyAxNzVUMzk4IDI4NlEzNzIgMjYzIDMzMCAyNDdUMjM0IDIzMVExMzggMjMxIDc5IDI3OVQyMCA0MjNWNDI2UTIwIDQ3OCA0MCA1MjFUOTYgNTk2VDE4MyA2NDRUMjk2IDY2MVEzNjQgNjYxIDQxOSA2NDBUNTE0IDU3OVQ1NzQgNDgyVDU5NSAzNTFWMjk2UTU5NSAxNDQgNTEzIDY1VDI3NyAtMTVRMTYwIC0xNSAxMDIgMTdUNDQgMTA0UTQ0IDEzMyA1MiAxNTJUNzIgMTgxVDkyIDE5NVQxMDQgMTk4UTEzMiAxNzQgMTcwIDE1OFQyNjAgMTQxWk0yOTkgMzY0UTMyNSAzNjQgMzQ5IDM3M1QzOTMgNDAwUTM5MSA0NTUgMzY2IDQ4NFQyOTcgNTE0UTI2MCA1MTQgMjM1IDQ5M1QyMTAgNDM4VjQzN1EyMTAgNDAyIDIzMyAzODNUMjk5IDM2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjoiIGdseXBoLW5hbWU9ImNvbG9uIiBob3Jpei1hZHYteD0iMjY2IiBkPSJNMTIwIDI3NFEzOSAyNzQgMzkgMzU1VjM3MlEzOSA0NTMgMTIwIDQ1M0gxNDNRMjI2IDQ1MyAyMjYgMzcyVjM1NVEyMjYgMjc0IDE0MyAyNzRIMTIwWk0xMjAgLThRMzkgLTggMzkgNzNWODlRMzkgMTcwIDEyMCAxNzBIMTQzUTIyNiAxNzAgMjI2IDg5VjczUTIyNiAtOCAxNDMgLThIMTIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOyIgZ2x5cGgtbmFtZT0ic2VtaWNvbG9uIiBob3Jpei1hZHYteD0iMjY2IiBkPSJNMTIwIDI3NFEzOSAyNzQgMzkgMzU1VjM3MlEzOSA0NTMgMTIwIDQ1M0gxNDNRMjI2IDQ1MyAyMjYgMzcyVjM1NVEyMjYgMjc0IDE0MyAyNzRIMTIwWk0xMTAgLTk3UTk2IC0xMTAgNzggLTExMlQ0NCAtMTA4VDE5IC04N1QxMyAtNTNMNDcgOTNRNTEgMTEzIDU3IDEyOFQ3MiAxNTJUOTYgMTY3VDEzNCAxNzJIMTU0UTE5MCAxNzIgMjA5IDE1NFQyMjkgOTNWODVRMjI5IDYxIDIxOSAzOVQxODYgLTdMMTEwIC05N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiZsdDsiIGdseXBoLW5hbWU9Imxlc3MiIGhvcml6LWFkdi14PSI0NTMiIGQ9Ik0yMjUgMjU1TDM1MCAxOTNRMzkyIDE3MyA0MDcgMTQ4VDQyMiA5OFE0MjIgODAgNDE2IDY0VDQwMiAzNVQzODcgMTVUMzc2IDEwTDg3IDE2NlE2NSAxNzggNDggMTk5VDMxIDI1M1EzMSAyODUgNDggMzA3VDg3IDM0MkwzNzYgNTAwUTM3OSA1MDEgMzg2IDQ5NVQ0MDEgNDc2VDQxNSA0NDdUNDIxIDQxMlE0MjIgMzg3IDQwNyAzNjJUMzUwIDMxNkwyMjUgMjU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPSIgZ2x5cGgtbmFtZT0iZXF1YWwiIGhvcml6LWFkdi14PSI1MzUiIGQ9Ik0xMDkgMzAwUTcxIDMwMCA1MiAzMjFUMzMgMzcyVjM4OFEzMyA0MTYgNTIgNDM4VDEwOSA0NjBINDI2UTQ2NCA0NjAgNDgzIDQzOFQ1MDIgMzg4VjM3MlE1MDIgMzQzIDQ4MyAzMjJUNDI2IDMwMEgxMDlaTTEwOSA0OFE3MSA0OCA1MiA3MFQzMyAxMjFWMTM3UTMzIDE2NCA1MiAxODZUMTA5IDIwOUg0MjZRNDY0IDIwOSA0ODMgMTg3VDUwMiAxMzdWMTIxUTUwMiA5MiA0ODMgNzBUNDI2IDQ4SDEwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZndDsiIGdseXBoLW5hbWU9ImdyZWF0ZXIiIGhvcml6LWFkdi14PSI0NTMiIGQ9Ik0zMSA5OFEzMSAxMjIgNDYgMTQ3VDEwMyAxOTNMMjI4IDI1NUwxMDMgMzE2UTYxIDMzNiA0NiAzNjFUMzIgNDEyUTMyIDQzMCAzOCA0NDZUNTEgNDc1VDY2IDQ5NFQ3NyA1MDBMMzY2IDM0MlEzODggMzMwIDQwNSAzMDhUNDIyIDI1M1E0MjIgMjIxIDQwNSAyMDBUMzY2IDE2Nkw3NyAxMFE3NCA4IDY3IDE1VDUyIDM0VDM4IDYzVDMxIDk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPyIgZ2x5cGgtbmFtZT0icXVlc3Rpb24iIGhvcml6LWFkdi14PSI1MjIiIGQ9Ik0xNjIgMjE0UTE1OSAyNTYgMTY2IDI4N1QxODcgMzQyVDIyMCAzODFUMjYzIDQwNlEyODkgNDE3IDMwNyA0MjdUMzI2IDQ1OFEzMjYgNDgxIDMwOCA0OTRUMjU3IDUwOFEyMzAgNTA4IDIxMCA1MDBUMTc1IDQ3N1QxNTMgNDQ0VDE0MSA0MDdRMTQxIDQwNiAxMjEgNDA2VDc4IDQxM1QzNCA0MzlUMTQgNDk2UTE0IDUyOCAzMCA1NThUNzcgNjExVDE1NCA2NDdUMjU5IDY2MVEzNzcgNjYxIDQ0MiA2MTBUNTA3IDQ3MVE1MDcgNDM2IDQ5OCA0MTFUNDczIDM2OVQ0NDAgMzM5VDQwMiAzMTdRMzg3IDMwOSAzNzMgMzAxVDM0NiAyODJUMzI0IDI1NFQzMTIgMjE0SDE2MlpNMjMwIC04UTE0OSAtOCAxNDkgNzNWODlRMTQ5IDE3MCAyMzAgMTcwSDI1M1EzMzYgMTcwIDMzNiA4OVY3M1EzMzYgLTggMjUzIC04SDIzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkAiIGdseXBoLW5hbWU9ImF0IiBob3Jpei1hZHYteD0iNzM2IiBkPSJNMzIzIDE2NlEyOTEgMTY2IDI2NyAxNzhUMjI2IDIxMFQyMDEgMjU3VDE5MiAzMTZRMTkyIDM1MCAyMDIgMzc3VDIyOSA0MjVUMjcwIDQ1NlQzMjIgNDY3UTM0OCA0NjcgMzY4IDQ1NlQ0MDQgNDI3VjQ2Mkg1MTlWMzA0UTUxOSAyNjcgNTMxIDI1NlQ1NjUgMjQ0UTU3NyAyNDQgNTkwIDI1MFQ2MTMgMjcwVDYyOSAzMDhUNjM2IDM2NVE2MzYgNDEwIDYyMSA0NTFUNTc0IDUyNVQ0OTIgNTc3VDM3MyA1OTZRMzEzIDU5NiAyNjMgNTc2VDE3OCA1MTlUMTIyIDQzM1QxMDIgMzI0UTEwMiAyNjUgMTIxIDIxNVQxNzYgMTI5VDI2MiA3MlQzNzIgNTFRNDMwIDUxIDQ3NSA2OVQ1NTIgMTE3UTU2OCAxMzIgNTg1IDEzMlE1OTUgMTMyIDYwMyAxMjZUNjE3IDExMlQ2MjQgOThUNjI2IDkwUTU4MiA0MiA1MTggMTRUMzcyIC0xNFEyOTYgLTE0IDIzNCAxMVQxMjYgODBUNTcgMTg3VDMyIDMyNFEzMiAzOTcgNTcgNDU5VDEyNyA1NjZUMjM1IDYzNlQzNzMgNjYxUTQ1NSA2NjEgNTE3IDYzOFQ2MjEgNTc0VDY4NCA0ODFUNzA1IDM2N1E3MDUgMjcwIDY2MCAyMTlUNTI2IDE2OFE0ODQgMTY4IDQ1NiAxODRUNDE1IDIyOFE0MDQgMjAwIDM4MCAxODNUMzIzIDE2NlpNMzU2IDI1N1EzNzcgMjU3IDM5MCAyNjlUNDA0IDMwMlYzNDhRMzg4IDM3NiAzNTcgMzc2UTMzMiAzNzYgMzE4IDM2MFQzMDMgMzE2UTMwMyAyODkgMzE4IDI3M1QzNTYgMjU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQSIgZ2x5cGgtbmFtZT0iQSIgaG9yaXotYWR2LXg9IjY4OCIgZD0iTTQ0NSAxMzRIMjM2TDE4NSAwSC0xNUwyMTYgNTk3UTIyMCA2MDkgMjI3IDYxOVQyNDkgNjM2VDI4NiA2NDhUMzQzIDY1MlEzNzcgNjUyIDM5OSA2NDhUNDM1IDYzN1Q0NTYgNjE5VDQ2NyA1OTdMNzA4IDBINDk5TDQ0NSAxMzRaTTI3MCAyNzhINDA5TDMzOSA0NjZMMjcwIDI3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkIiIGdseXBoLW5hbWU9IkIiIGhvcml6LWFkdi14PSI2NjAiIGQ9Ik00NiA1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDM4MFE0OTUgNjQ3IDU1NCA2MDVUNjE0IDQ4NVE2MTQgNDI4IDU4NCAzOTZUNDk2IDM1MFE1NjkgMzMzIDYwMyAyOTBUNjM3IDE4N1E2MzcgMTM4IDYyMSAxMDNUNTcxIDQ1VDQ4NCAxMVQzNTYgMEg0NlY1MzZaTTMyMCAzODZRNDA4IDM4NiA0MDggNDQ4UTQwOCA1MDUgMzIzIDUwNUgyNDNWMzg2SDMyMFpNMzMyIDE0M1EzODUgMTQzIDQwOCAxNThUNDMxIDIwOVE0MzEgMjQxIDQwOCAyNTVUMzMwIDI3MEgyNDNWMTQzSDMzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IkMiIGdseXBoLW5hbWU9IkMiIGhvcml6LWFkdi14PSI2NTAiIGQ9Ik0zNjggLTE0UTI5MiAtMTQgMjMwIDExVDEyMyA4MVQ1NCAxODhUMjkgMzI0UTI5IDM5NyA1MyA0NTlUMTIzIDU2NlQyMzAgNjM2VDM2OSA2NjFRNDM4IDY2MSA0ODYgNjQ1VDU2NCA2MDVUNjA5IDU1NFQ2MjMgNTAzUTYyMyA0NzEgNjA2IDQ1MVQ1NjcgNDIwVDUyNyA0MDZUNTA4IDQwNVE0ODkgNDQwIDQ1NiA0NTlUMzgwIDQ3OFEzNDkgNDc4IDMyMyA0NjdUMjc3IDQzNlQyNDYgMzg4VDIzNSAzMjRRMjM1IDI4OSAyNDYgMjYxVDI3NiAyMTJUMzIyIDE4MFQzODAgMTY5UTQyNyAxNjkgNDYwIDE4OVQ1MTAgMjQ3UTUxMSAyNDkgNTI5IDI0NlQ1NjkgMjMyVDYwOCAyMDFUNjI2IDE0OVE2MjYgMTI1IDYxMiA5N1Q1NjcgNDRUNDg3IDNUMzY4IC0xNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkQiIGdseXBoLW5hbWU9IkQiIGhvcml6LWFkdi14PSI2OTAiIGQ9Ik00NiA1MzZRNDYgNTkwIDc1IDYxOFQxNTAgNjQ3SDMyMVE0MDEgNjQ3IDQ2NCA2MjVUNTcyIDU2MVQ2NDEgNDYwVDY2NSAzMjdRNjY1IDI1MiA2NDEgMTkyVDU3MSA4OVQ0NjIgMjNUMzE3IDBINDZWNTM2Wk0zMTIgMTcwUTM4MyAxNzAgNDI1IDIxMFQ0NjcgMzI2UTQ2NyAzOTkgNDI2IDQzOFQzMTUgNDc3SDI0NFYxNzBIMzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRSIgZ2x5cGgtbmFtZT0iRSIgaG9yaXotYWR2LXg9IjYxNiIgZD0iTTQ2IDBWNTM2UTQ2IDU5MCA3MiA2MThUMTQ4IDY0N0g1ODFWNDc1SDI0NlY0MDhINDk2VjI0OEgyNDZWMTcwSDU4MlYwSDQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRiIgZ2x5cGgtbmFtZT0iRiIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTQ2IDBWNTM2UTQ2IDU5MCA3MiA2MThUMTQ4IDY0N0g1NDlWNDgxSDI0M1YzNzNINDc5VjIxMkgyNTBWMEg0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IkciIGdseXBoLW5hbWU9IkciIGhvcml6LWFkdi14PSI3MjgiIGQ9Ik02MjQgLTVRNTk0IC01IDU2NiAxMFQ1MjUgNzFRNDk5IDMzIDQ1MiAxMVQzMzcgLTExUTI2NyAtMTEgMjEwIDE0VDExMyA4M1Q1MSAxODlUMjkgMzI0UTI5IDM5NyA1NCA0NTlUMTI2IDU2NlQyMzggNjM2VDM4MyA2NjFRNDQ0IDY2MSA0OTEgNjUwVDU3MiA2MThUNjIyIDU3MVQ2MzkgNTEyUTYzOSA0ODUgNjI0IDQ2NlQ1OTEgNDM3VDU1NyA0MjJUNTM5IDQyMVE1MTMgNDU0IDQ3NiA0NzJUMzk1IDQ5MFEzNjAgNDkwIDMzMSA0NzhUMjc5IDQ0MlQyNDQgMzg3VDIzMSAzMTRRMjMxIDI3NCAyNDIgMjQyVDI3NCAxODdUMzIzIDE1MlQzODYgMTM5UTQzOSAxMzkgNDcyIDE2MVQ1MTMgMjI0SDM2MFYzNzFINjIyUTY2NSAzNzEgNjc4IDM1MFQ2OTEgMjg2VjE1UTY5MSAxMCA2NzEgM1Q2MjQgLTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBnbHlwaC1uYW1lPSJIIiBob3Jpei1hZHYteD0iNzAwIiBkPSJNNDYgNTU5UTQ2IDY1MiAxMzAgNjUySDE1OVEyNDcgNjUyIDI0NyA1NTlWNDA5SDQ1NFY1NTlRNDU0IDY1MiA1MzggNjUySDU2OFE2NTUgNjUyIDY1NSA1NTlWMEg0NTRWMjQxSDI0N1YwSDQ2VjU1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGdseXBoLW5hbWU9IkkiIGhvcml6LWFkdi14PSIzMDYiIGQ9Ik01MyA1NjZRNTMgNjA5IDc2IDYzMFQxMzcgNjUxSDE2NlEyMDUgNjUxIDIyOSA2MzBUMjUzIDU2NlYwSDUzVjU2NloiICAvPgorPGdseXBoIHVuaWNvZGU9IkoiIGdseXBoLW5hbWU9IkoiIGhvcml6LWFkdi14PSI1MzgiIGQ9Ik0yMjkgLTE0UTEyNCAtMTQgNzAgMjBUMTUgMTE1UTE1IDE0MyAyNSAxNjJUNDcgMTk0VDY5IDIxMVQ4MSAyMTVRMTI5IDE1NiAxOTkgMTU2UTI0NiAxNTYgMjY2IDE3OVQyODYgMjYwVjY0N0g0ODdWMjU3UTQ4NyAxMTcgNDIyIDUyVDIyOSAtMTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJLIiBnbHlwaC1uYW1lPSJLIiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNDYgNTU5UTQ2IDY1MiAxMzAgNjUySDE1OVEyNDYgNjUyIDI0NiA1NTlWMzY3TDQwMiA1ODRRNDI4IDYyMiA0NTYgNjM3VDUxMiA2NTJRNTM3IDY1MiA1NTkgNjQyVDU5NiA2MTlUNjIwIDU5NFQ2MjYgNTc3TDQ0NSAzMjlMNjM1IDY5UTYzOCA2NCA2MzAgNTJUNjA1IDI4VDU2NSA1VDUxNCAtNVE0ODUgLTUgNDU4IDlUNDA0IDYyTDI0NiAyODFWMEg0NlY1NTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJMIiBnbHlwaC1uYW1lPSJMIiBob3Jpei1hZHYteD0iNTUyIiBkPSJNNDYgNTU5UTQ2IDY1MiAxMzAgNjUySDE1OVEyNDYgNjUyIDI0NiA1NTlWMTc0SDQ0M1E1MzUgMTc0IDUzNSA5MVY4OFE1MzUgMCA0NDMgMEg0NlY1NTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJNIiBnbHlwaC1uYW1lPSJNIiBob3Jpei1hZHYteD0iNzcyIiBkPSJNNDYgNTU2UTQ2IDYwNCA2OSA2MjhUMTM1IDY1MkgxOTJRMjEyIDY1MiAyMjYgNjUwVDI1MCA2NDFUMjY3IDYyNFQyODEgNTk4TDM4NiAzMzlMNDkyIDU5OFE1MDYgNjMxIDUyNCA2NDFUNTc4IDY1Mkg2MzRRNzI2IDY1MiA3MjYgNTU2VjBINTM4VjM2NUw0NzAgMTc1UTQ2NyAxNjYgNDY0IDE1N1Q0NTIgMTQxVDQyOSAxMzBUMzg1IDEyNlEzNTcgMTI2IDM0MiAxMzBUMzE5IDE0MFQzMDggMTU2VDMwMSAxNzVMMjM0IDM1N1YwSDQ2VjU1NloiICAvPgorPGdseXBoIHVuaWNvZGU9Ik4iIGdseXBoLW5hbWU9Ik4iIGhvcml6LWFkdi14PSI3MDMiIGQ9Ik00NiA1NTlRNDYgNjA2IDY4IDYyOVQxMjggNjUySDE0N1ExNjUgNjUyIDE3NyA2NTBUMTk5IDY0MVQyMTcgNjI2VDIzNyA2MDVMNDY5IDMwM1Y2NDdINjU3Vjg4UTY1NyA0MSA2MzYgMThUNTc2IC01SDU2MFE1NDIgLTUgNTMwIC0zVDUwOCA1VDQ5MCAxOFQ0NzEgMzlMMjM0IDM0NlYwSDQ2VjU1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ik8iIGdseXBoLW5hbWU9Ik8iIGhvcml6LWFkdi14PSI3MzMiIGQ9Ik0zNjcgLTE0UTI5MiAtMTQgMjI5IDExVDEyMSA4MVQ1MSAxODhUMjUgMzI0UTI1IDM5NyA1MCA0NTlUMTIxIDU2NlQyMjkgNjM2VDM2NyA2NjFRNDQyIDY2MSA1MDQgNjM2VDYxMiA1NjdUNjgyIDQ2MFQ3MDggMzI0UTcwOCAyNTAgNjgzIDE4OFQ2MTIgODFUNTA1IDExVDM2NyAtMTRaTTM2NyAxNjVRNDMyIDE2NSA0NzEgMjA4VDUxMCAzMjRRNTEwIDM5NiA0NzEgNDQwVDM2NyA0ODRRMzAxIDQ4NCAyNjIgNDQxVDIyMyAzMjRRMjIzIDI1MiAyNjIgMjA5VDM2NyAxNjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJQIiBnbHlwaC1uYW1lPSJQIiBob3Jpei1hZHYteD0iNjE0IiBkPSJNNDYgNTM2UTQ2IDU5MCA3MiA2MThUMTQ4IDY0N0gzMTlRNDU5IDY0NyA1MzIgNTg4VDYwNSA0MTJRNjA1IDI5NiA1MzQgMjM5VDMyNSAxODJIMjQ3VjBINDZWNTM2Wk0yNDQgMzI4SDMxN1EzNjMgMzI4IDM4NiAzNDlUNDEwIDQxMlE0MTAgNDUzIDM4NiA0NzRUMzE0IDQ5NkgyNDRWMzI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUSIgZ2x5cGgtbmFtZT0iUSIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTYxOSAtMTRRNTk5IC0xNCA1NzUgLTZUNTI0IDI1UTQ4OSA2IDQ1MCAtNFQzNjggLTE0UTI5MyAtMTQgMjMwIDExVDEyMiA4MVQ1MSAxODhUMjUgMzI0UTI1IDM5NyA1MCA0NTlUMTIyIDU2NlQyMzEgNjM2VDM2OSA2NjFRNDQ0IDY2MSA1MDYgNjM2VDYxMyA1NjdUNjgzIDQ2MFQ3MDggMzI0UTcwOCAyNzMgNjkzIDIyN1Q2NTEgMTQwTDczMSA1MlE3MzIgNTAgNzI1IDQwVDcwNCAxN1Q2NjggLTRUNjE5IC0xNFpNMzY5IDE2NFEzODcgMTY0IDQwMiAxNjdMMzQxIDIzNEw0NTIgMzQ1TDUxMyAyNzlRNTE4IDMwMiA1MTggMzI0UTUxOCAzNTggNTA4IDM4N1Q0NzggNDM5VDQzMiA0NzNUMzcyIDQ4NVEzMzcgNDg1IDMxMCA0NzNUMjYzIDQzOVQyMzQgMzg4VDIyMyAzMjNRMjIzIDI4OCAyMzMgMjU5VDI2MyAyMDlUMzEwIDE3NlQzNjkgMTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgZ2x5cGgtbmFtZT0iUiIgaG9yaXotYWR2LXg9IjY1MCIgZD0iTTUwOSAtNVE0ODYgLTUgNDY4IDBUNDM0IDE1VDQwNCA0MlQzNzQgODBMMjgyIDIwMkgyNDZWMEg0NlY1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDM0OFE0ODQgNjQ3IDU1MSA1OTNUNjE4IDQzNVE2MTggMzY0IDU4MyAzMTVUNDc4IDI0NUw2MjQgNjRRNjI2IDYxIDYyMSA1MFQ2MDEgMjdUNTY0IDVUNTA5IC01Wk0yNDMgMzQ0SDMyN1EzNzIgMzQ0IDM5NCAzNjNUNDE3IDQxOVE0MTcgNDk1IDMyNSA0OTVIMjQzVjM0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlMiIGdseXBoLW5hbWU9IlMiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzcgLTE0UTIwNiAtMTQgMTU3IC0zVDc3IDI3VDMzIDY5VDE5IDExOVExOSAxMzcgMjggMTU1VDUwIDE4NlQ3MiAyMDhUODUgMjE0UTEwMSAyMDAgMTIzIDE4N1QxNzAgMTYzVDIyMyAxNDZUMjc3IDEzOVEzMjQgMTM5IDM0NSAxNTJUMzY3IDE5MFEzNjcgMjA1IDM1OCAyMTNUMzM0IDIyN1QyOTcgMjM1VDI1MSAyNDRRMjEwIDI1MiAxNzIgMjY2VDEwMiAzMDNUNTMgMzYxVDM0IDQ0NlEzNCA1NDYgMTA1IDYwM1QzMTAgNjYxUTM3NCA2NjEgNDIwIDY1MVQ0OTYgNjI0VDU0MCA1ODRUNTU0IDUzOFE1NTQgNTE3IDU0NCA0OThUNTIwIDQ2NlQ0OTYgNDQ0VDQ4MyA0MzhRNDUxIDQ2OCA0MDUgNDg4VDMxMiA1MDhRMjI1IDUwOCAyMjUgNDU4UTIyNSA0NDQgMjM0IDQzN1QyNTkgNDI1VDI5NyA0MTdUMzQ1IDQwOFEzOTMgMzk3IDQzNCAzODFUNTA1IDM0MVQ1NTIgMjg0VDU2OSAyMDZRNTY5IDEwMCA0OTcgNDNUMjc3IC0xNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlQiIGdseXBoLW5hbWU9IlQiIGhvcml6LWFkdi14PSI2MTkiIGQ9Ik0xMDIgNDczUTEwIDQ3MyAxMCA1NjFWNTY0UTEwIDY0NyAxMDIgNjQ3SDUxN1E2MTAgNjQ3IDYxMCA1NjRWNTYxUTYxMCA0NzMgNTE3IDQ3M0g0MTJWMEgyMTFWNDczSDEwMkgxMDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJVIiBnbHlwaC1uYW1lPSJVIiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzM5IC0xMVE0MyAtMTEgNDMgMjg0VjU1OVE0MyA2MDYgNjYgNjI5VDEzMSA2NTJIMTU2UTI0NCA2NTIgMjQ0IDU1OVYyODNRMjQ0IDE2MyAzNDAgMTYzUTM4OSAxNjMgNDEyIDE5MlQ0MzUgMjg0VjU1OVE0MzUgNjA3IDQ1OCA2MjlUNTIzIDY1Mkg1NDlRNjM2IDY1MiA2MzYgNTU5VjI4NFE2MzYgMTM3IDU2MiA2M1QzMzkgLTExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iViIgZ2x5cGgtbmFtZT0iViIgaG9yaXotYWR2LXg9IjY3NCIgZD0iTTEzMCA2NTJRMTY4IDY1MiAxOTcgNjI3VDI0MSA1NTlMMzQyIDIzN0w0NDIgNTU5UTQ1NiA2MDggNDg2IDYzMFQ1NDkgNjUyUTU3MyA2NTIgNTk2IDY0NFQ2MzYgNjI1VDY2MiA2MDJUNjY4IDU4M0w0MjQgMEgyNTVMNiA1ODNRMyA1OTAgMTIgNjAxVDQwIDYyNFQ4MSA2NDRUMTMwIDY1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IlciIGdseXBoLW5hbWU9IlciIGhvcml6LWFkdi14PSI5ODMiIGQ9Ik0zMCA1ODJRMjkgNTg1IDM2IDU5NlQ2MCA2MTlUOTkgNjQwVDE1NSA2NTBRMTcwIDY1MCAxODcgNjQ1VDIxOSA2MjhUMjQ2IDU5NlQyNjUgNTQzTDMxOSAyNjRMMzg3IDUxN1EzOTUgNTU1IDQyNSA1NzJUNDk3IDU5MFE1MzUgNTkwIDU2NSA1NzFUNjA0IDUxN0w2NzIgMjY0TDcyNiA1NDZRNzMxIDU3NSA3NDIgNTk1VDc2OCA2MjdUODAwIDY0NFQ4MzUgNjUwUTg2NSA2NTAgODg3IDY0MVQ5MjQgNjIwVDk0NiA1OTdUOTUyIDU4Mkw3ODQgMEg1ODlMNDkzIDMzOEwzOTkgMEgyMDVMMzAgNTgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWCIgZ2x5cGgtbmFtZT0iWCIgaG9yaXotYWR2LXg9IjY3MSIgZD0iTTEzOSAtOVExMTMgLTkgOTAgMFQ0OCAyM1QyMSA0OFQxNCA2NUwyMDggMzM2TDIgNjQ3SDIyM0wzNDYgNDQ2TDQyNCA1NzhRNDQ0IDYxNiA0NzMgNjMzVDUzMSA2NTBRNTU3IDY1MCA1ODAgNjQxVDYyMiA2MTlUNjQ5IDU5NFQ2NTYgNTc3TDQ3MyAzMjFMNjU2IDY2UTY1OSA2MSA2NDkgNDlUNjIxIDI0VDU3OSAyVDUyOCAtOFE0OTggLTggNDcwIDhUNDE4IDY1TDMzMiAyMDhMMjQ2IDY0UTIyMyAyMiAxOTYgN1QxMzkgLTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJZIiBnbHlwaC1uYW1lPSJZIiBob3Jpei1hZHYteD0iNjM5IiBkPSJNMjIxIDI2OUwtMTYgNjQ3SDIwM0wzMjcgNDMwTDQxNCA1ODFRNDM3IDYxOSA0NjAgNjM1VDUwOSA2NTFRNTQzIDY1MSA1NjggNjQxVDYwOCA2MTdUNjI5IDU5MVQ2MzMgNTc1TDQyMSAyNTNWMEgyMjFWMjY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWiIgZ2x5cGgtbmFtZT0iWiIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTQ1IDExNEwzMjkgNDgySDEzMlE4OCA0ODIgNjYgNDk5VDQ0IDU2MFY1NjlRNDQgNjExIDY2IDYyOVQxMzIgNjQ3SDU4MFY1NDNMMjgxIDE2Nkg1MDlRNTUzIDE2NiA1NzUgMTQ4VDU5NyA4N1Y3OVE1OTcgMzcgNTc1IDE5VDUwOSAwSDQ1VjExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlsiIGdseXBoLW5hbWU9ImJyYWNrZXRsZWZ0IiBob3Jpei1hZHYteD0iNDA2IiBkPSJNNDYgNjU4SDMwMFEzNDggNjU4IDM3MCA2NDJUMzkyIDU4NlY1ODBRMzkyIDUzOSAzNzAgNTIyVDMwMCA1MDVIMjIzVi00N0gzMDNRMzUxIC00NyAzNzMgLTYzVDM5NSAtMTE4Vi0xMjRRMzk1IC0xNjUgMzczIC0xODJUMzAzIC0xOTlINDZWNjU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgZ2x5cGgtbmFtZT0iYmFja3NsYXNoIiBob3Jpei1hZHYteD0iMzgyIiBkPSJNMzAwIC0yMTdRMjgzIC0yMTcgMjcxIC0yMTVUMjU4IC0yMTFMMTQgNTQ5UTYgNTc4IDYgNTkzUTYgNjE0IDE1IDYyN1QzOCA2NDhUNjggNjU5VDk5IDY2MlExMTYgNjYyIDEyOCA2NjBUMTQxIDY1NUwzODUgLTEwNFEzODkgLTExOCAzOTEgLTEyOVQzOTMgLTE0OVEzOTMgLTE3MCAzODQgLTE4M1QzNjEgLTIwNFQzMzEgLTIxNFQzMDAgLTIxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGdseXBoLW5hbWU9ImJyYWNrZXRyaWdodCIgaG9yaXotYWR2LXg9IjQwNiIgZD0iTTEwNCAtMTk5UTU1IC0xOTkgMzMgLTE4MlQxMSAtMTI0Vi0xMThRMTEgLTgwIDMzIC02NFQxMDQgLTQ3SDE4NFY1MDVIMTA3UTU4IDUwNSAzNiA1MjJUMTQgNTgwVjU4NlExNCA2MjUgMzYgNjQxVDEwNyA2NThIMzYwVi0xOTlIMTA0SDEwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9Il4iIGdseXBoLW5hbWU9ImFzY2lpY2lyY3VtIiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMzU0IDQzOFEzMjMgNDM4IDI5NiA0NjJUMjUwIDUzMFEyMzAgNDg3IDIwMyA0NjNUMTQ2IDQzOFExMTggNDM4IDEwMiA0NTRUODUgNDk2UTg1IDUyMiAxMDIgNTQ3VDE0NCA1OTNUMTk4IDYyOVQyNTAgNjUxUTI3MyA2NDUgMzAyIDYzMFQzNTYgNTkzVDM5OCA1NDdUNDE1IDQ5NlE0MTUgNDcxIDM5OSA0NTVUMzU0IDQzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9Il8iIGdseXBoLW5hbWU9InVuZGVyc2NvcmUiIGhvcml6LWFkdi14PSI1MTYiIGQ9Ik04NCAtMTM5UTQ2IC0xMzkgMjcgLTEyMVQ4IC03M1YtNjVROCAtMzcgMjcgLTE5VDg0IDBINDMzUTQ3MSAwIDQ5MCAtMThUNTA5IC02NVYtNzNRNTA5IC0xMDIgNDkwIC0xMjBUNDMzIC0xMzlIODRIODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJgIiBnbHlwaC1uYW1lPSJncmF2ZSIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTE0MSA1NzdRMTE0IDU5MiA5OSA2MThUODMgNjcwUTgzIDcwMiAxMDggNzIzVDE3MCA3NDRRMTk2IDc0NCAyMjMgNzI4UTI0OCA3MTMgMjY5IDY4OVQzMDYgNjM5VDMyOCA1OTRUMzMyIDU2N1EzMjggNTYxIDMxMCA1NTVUMjY1IDU0OFQyMDYgNTUzVDE0MSA1NzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJhIiBnbHlwaC1uYW1lPSJhIiBob3Jpei1hZHYteD0iNTc0IiBkPSJNMTg2IC0xMFExNDggLTEwIDExOCAwVDY2IDMwVDMzIDc3VDIxIDEzNlEyMSAyMjEgOTMgMjYyVDMyNSAzMDRIMzQ0UTMzOCAzNzAgMjY3IDM3MFEyNDQgMzcwIDIyNyAzNjRUMTk5IDM0OVQxODAgMzI3VDE2NyAzMDRRMTY3IDMwMyAxNDcgMzAzVDEwMyAzMDhUNjAgMzMxVDQwIDM3OVE0MCA0MzcgOTcgNDcxVDI3OCA1MDZRNDEyIDUwNiA0NzMgNDU0VDUzNCAyOTVWMEgzNDVWNjFRMzE5IDI3IDI3OCA5VDE4NiAtMTBaTTI2MSAxMDdRMjk5IDEwNyAzMjIgMTMwVDM0NSAxOTJWMjA5SDMyMVEyNjMgMjA3IDIzMyAxOTVUMjAzIDE1M1EyMDMgMTMxIDIxOSAxMTlUMjYxIDEwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9ImIiIGdseXBoLW5hbWU9ImIiIGhvcml6LWFkdi14PSI2MjkiIGQ9Ik0zODAgLTE0UTMyOSAtMTQgMjkxIDEwVDIzNSA3MlYwSDQ0VjY4MlE0NCA2ODcgNjYgNjk1VDExOCA3MDRRMTM5IDcwNCAxNjAgNjk4VDE5OCA2NzVUMjI1IDYzMFQyMzYgNTU4VjQzNVEyNTkgNDY4IDI5NiA0ODdUMzgwIDUwNlE0MzEgNTA2IDQ3MyA0ODhUNTQ1IDQzN1Q1OTEgMzU1VDYwNyAyNDdRNjA3IDE5MCA1OTEgMTQyVDU0NSA2MFQ0NzMgNlQzODAgLTE0Wk0zMjcgMTM1UTM3MiAxMzUgMzk4IDE2NVQ0MjUgMjQ2UTQyNSAyOTcgMzk5IDMyN1QzMjggMzU3UTI5NSAzNTcgMjcxIDM0MVQyMzUgMjk4VjIyM1EyMzUgMTgxIDI2MSAxNThUMzI3IDEzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImMiIGdseXBoLW5hbWU9ImMiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0yODYgLTE0UTIyNyAtMTQgMTc4IDVUOTUgNThUNDEgMTQxVDIyIDI0N1EyMiAzMDMgNDEgMzUwVDk2IDQzMlQxNzkgNDg2VDI4NiA1MDVRMzQ1IDUwNSAzODUgNDkyVDQ1MCA0NThUNDg2IDQxNFQ0OTcgMzczUTQ5NyAzNDQgNDgyIDMyN1Q0NDcgMzAxVDQxMiAyOTBUMzk1IDI5MVEzODQgMzIwIDM2MSAzMzhUMjk3IDM1NlEyNTIgMzU2IDIyMyAzMjZUMTk0IDI0N1ExOTQgMTk4IDIyMiAxNjdUMjk3IDEzNVEzMzUgMTM1IDM1OSAxNTNUMzk1IDIwMVEzOTYgMjA0IDQxMiAyMDNUNDQ3IDE5MlQ0ODEgMTY1VDQ5NyAxMTdRNDk3IDk5IDQ4NiA3NlQ0NDkgMzNUMzgzIDBUMjg2IC0xNFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGdseXBoLW5hbWU9ImQiIGhvcml6LWFkdi14PSI2MjkiIGQ9Ik0yNDggLTE0UTE5NyAtMTQgMTU2IDVUODQgNThUMzggMTQxVDIyIDI0N1EyMiAzMDcgMzggMzU0VDg0IDQzNlQxNTYgNDg4VDI1MCA1MDZRMjk3IDUwNiAzMzQgNDg3VDM5NCA0MzhWNjgyUTM5NCA2ODcgNDE2IDY5NVQ0NjcgNzA0UTQ4OCA3MDQgNTA5IDY5OFQ1NDcgNjc1VDU3NCA2MzBUNTg1IDU1OFYwSDM5NFY3NlEzNzQgMzQgMzM3IDEwVDI0OCAtMTRaTTMwMiAxMzVRMzQwIDEzNSAzNjYgMTU3VDM5NCAyMThWMzAwUTM4MiAzMjYgMzU5IDM0MVQzMDQgMzU3UTI1OSAzNTcgMjMyIDMyOFQyMDQgMjQ2UTIwNCAxOTYgMjMxIDE2NlQzMDIgMTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZSIgZ2x5cGgtbmFtZT0iZSIgaG9yaXotYWR2LXg9IjU2MyIgZD0iTTI5OCAtMTRRMjM1IC0xNCAxODQgM1Q5NyA1NFQ0MiAxMzRUMjIgMjQyUTIyIDI5OSA0MSAzNDdUOTYgNDMxVDE4MCA0ODZUMjg2IDUwNlEzNDMgNTA2IDM5MCA0ODhUNDcyIDQzNlQ1MjUgMzU4VDU0NCAyNTlWMjQ3UTU0MyAyMjUgNTM1IDIxMVQ1MDUgMTk3SDE5MlEyMDEgMTU4IDIzMSAxMzlUMzA3IDExOVEzNTIgMTE5IDM4MiAxMzdUNDI3IDE4MlE0MjcgMTgzIDQ0MCAxODFUNDcwIDE3MFQ1MDEgMTQ2VDUxNSAxMDJRNTE1IDUyIDQ2MCAxOVQyOTggLTE0Wk0yODQgMzgxUTI0NiAzODEgMjIwIDM1N1QxODkgMjk2SDM3MVEzNzAgMzM0IDM0NyAzNTdUMjg0IDM4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImYiIGdseXBoLW5hbWU9ImYiIGhvcml6LWFkdi14PSI0MTYiIGQ9Ik0xMCA0OTZIMTAxVjUxMFExMDEgNTY4IDExNSA2MDZUMTU0IDY2N1QyMTQgNjk5VDI5MCA3MDlRMzY1IDcwOSAzOTggNjgyVDQzMiA2MThRNDMyIDYwMiA0MjcgNTg4VDQxNSA1NjRUNDAyIDU0OVQzOTUgNTQ0UTM4NCA1NTQgMzY5IDU2MFQzMzQgNTY3UTMxMCA1NjcgMjk4IDU1NVQyODUgNTEyVjQ5NkgzOThWMzUxSDI5M1YwSDEwMVYzNTFIMTBWNDk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZyIgZ2x5cGgtbmFtZT0iZyIgaG9yaXotYWR2LXg9IjYyOSIgZD0iTTI5MyAtMTk1UTIzMyAtMTk1IDE4OSAtMTg0VDExNSAtMTUzVDcyIC0xMDhUNTcgLTU2UTU3IC0zNSA2NyAtMTlUOTAgN1QxMTQgMjNUMTI3IDI2UTE1MSAtNSAxODYgLTIzVDI3OSAtNDFRMzQyIC00MSAzNzEgLTE3VDQwMSA1OVYxMDRRMzc0IDY5IDMzNSA0OVQyNDQgMjhRMTkzIDI4IDE1MiA0NFQ4MiA5MVQzOCAxNjZUMjIgMjY4UTIyIDMyMSAzOCAzNjRUODUgNDM5VDE1NiA0ODhUMjQ4IDUwNlEyOTcgNTA2IDMzNiA0OTFUNDAxIDQ1MVY0OTZINTg2VjY2UTU4NiAtNjkgNTE1IC0xMzJUMjkzIC0xOTVaTTMwMCAxNzJRMzQ1IDE3MiAzNzIgMTkzVDQwMSAyNTBWMzE1UTM4NSAzMzUgMzYwIDM0OFQzMDIgMzYxUTI1NyAzNjEgMjMxIDMzNVQyMDQgMjY2UTIwNCAyMjMgMjMwIDE5OFQzMDAgMTcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaCIgZ2x5cGgtbmFtZT0iaCIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTIzNiA0MTdRMjU4IDQ1NSAyOTUgNDgwVDM5MSA1MDZRNDM5IDUwNiA0NzIgNDg5VDUyNyA0NDRUNTU3IDM4MFQ1NjcgMzAzVjBIMzc1VjI3M1EzNzUgMzA5IDM1OCAzMjlUMzEyIDM1MFEyNzUgMzUwIDI1NiAzMjlUMjM2IDI2OVYwSDQ0VjY4MlE0NCA2ODcgNjYgNjk1VDExOCA3MDRRMTM5IDcwNCAxNjAgNjk4VDE5OCA2NzVUMjI1IDYzMFQyMzYgNTU4VjQxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9ImkiIGdseXBoLW5hbWU9ImkiIGhvcml6LWFkdi14PSIyODYiIGQ9Ik0xNDUgNTUyUTk3IDU1MiA2OSA1NzZUNDEgNjQzUTQxIDY4NSA2OCA3MDlUMTQyIDczM1ExOTAgNzMzIDIxOCA3MDlUMjQ2IDY0M1EyNDYgNjAxIDIxOSA1NzdUMTQ1IDU1MlpNNDcgNDA5UTQ3IDQ2MSA3MSA0ODFUMTMzIDUwMUgxNTNRMTkyIDUwMSAyMTUgNDgyVDIzOSA0MDlWMEg0N1Y0MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJqIiBnbHlwaC1uYW1lPSJqIiBob3Jpei1hZHYteD0iMjg2IiBkPSJNMTQ1IDU1MlE5NyA1NTIgNjkgNTc2VDQxIDY0M1E0MSA2ODUgNjggNzA5VDE0MiA3MzNRMTkwIDczMyAyMTggNzA5VDI0NiA2NDNRMjQ2IDYwMSAyMTkgNTc3VDE0NSA1NTJaTTU4IC0xOThRLTcgLTE5OCAtNDIgLTE3NFQtNzggLTEwMFEtNzggLTg1IC03MyAtNzJULTYxIC00OVQtNDggLTM0VC00MSAtMjlRLTMzIC00MCAtMjAgLTQ1VDcgLTUwUTQ3IC01MCA0NyAtNVY0OTZIMjM5Vi0xNVEyMzkgLTEwMyAxOTMgLTE1MFQ1OCAtMTk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iayIgZ2x5cGgtbmFtZT0iayIgaG9yaXotYWR2LXg9IjU2MSIgZD0iTTQ0IDY4MlE0NCA2ODcgNjYgNjk1VDExOCA3MDRRMTM5IDcwNCAxNjAgNjk4VDE5OCA2NzVUMjI1IDYzMFQyMzYgNTU4VjI5NkwzMzUgNDQ1UTM1NSA0NzcgMzgzIDQ5MFQ0MzYgNTAzUTQ1OCA1MDMgNDc3IDQ5NlQ1MTEgNDc4VDUzNCA0NThUNTQwIDQ0NEw0MDcgMjU1TDU1MyA1MFE1NTUgNDYgNTQ3IDM3VDUyMyAxN1Q0ODggMFQ0NDcgLThRNDIxIC04IDM5MyA1VDM0MyA1MEwyMzYgMjA1VjBINDRWNjgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgZ2x5cGgtbmFtZT0ibCIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTQ3IDY4MlE0NyA2ODcgNjkgNjk1VDEyMSA3MDRRMTQyIDcwNCAxNjMgNjk4VDIwMSA2NzVUMjI4IDYzMFQyMzkgNTU4VjBINDdWNjgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgZ2x5cGgtbmFtZT0ibSIgaG9yaXotYWR2LXg9IjkwOSIgZD0iTTExOCA1MDFRMTM0IDUwMSAxNTEgNDk3VDE4MyA0ODNUMjA5IDQ1N1QyMjggNDE1UTI1NCA0NTQgMjkwIDQ4MFQzODMgNTA2UTQ0NyA1MDYgNDg0IDQ3OVQ1MzcgNDA3UTU2MyA0NDkgNjAwIDQ3N1Q3MDAgNTA2UTc0OCA1MDYgNzgwIDQ5MVQ4MzMgNDUxVDg2MSAzOTBUODcwIDMxNlYwSDY3OFYyODJRNjc4IDM1MCA2MTkgMzUwUTU5OCAzNTAgNTgxIDM0MFQ1NTMgMzE0VjBIMzYxVjI4MFEzNjEgMzUwIDMwMiAzNTBRMjgxIDM1MCAyNjQgMzQwVDIzNiAzMTRWMEg0NFY0NzlRNDQgNDg0IDY2IDQ5MlQxMTggNTAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgZ2x5cGgtbmFtZT0ibiIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTExOCA1MDFRMTM0IDUwMSAxNTEgNDk3VDE4MyA0ODNUMjA5IDQ1N1QyMjggNDE1UTI1NCA0NTUgMjkyIDQ4MFQzOTEgNTA2UTQzOSA1MDYgNDcyIDQ5MFQ1MjcgNDQ3VDU1NyAzODVUNTY3IDMxMFYwSDM3NVYyNzdRMzc1IDMxMSAzNTggMzMwVDMxMSAzNTBRMjg1IDM1MCAyNjYgMzM5VDIzNiAzMTBWMEg0NFY0NzlRNDQgNDg0IDY2IDQ5MlQxMTggNTAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibyIgZ2x5cGgtbmFtZT0ibyIgaG9yaXotYWR2LXg9IjU4NiIgZD0iTTI5MiAtMTRRMjMwIC0xNCAxODEgNFQ5NiA1N1Q0MSAxMzlUMjIgMjQ3UTIyIDMwNSA0MSAzNTNUOTcgNDM1VDE4MyA0ODdUMjk1IDUwNlEzNTYgNTA2IDQwNSA0ODhUNDkwIDQzNVQ1NDQgMzUyVDU2NCAyNDZRNTY0IDE4NyA1NDUgMTM5VDQ5MCA1N1Q0MDQgNVQyOTIgLTE0Wk0yOTMgMTMzUTM0MCAxMzMgMzcwIDE2NVQ0MDEgMjQ2UTQwMSAyOTcgMzcxIDMyOVQyOTMgMzYxUTI0NSAzNjEgMjE1IDMyOVQxODUgMjQ3UTE4NSAxOTYgMjE1IDE2NVQyOTMgMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icCIgZ2x5cGgtbmFtZT0icCIgaG9yaXotYWR2LXg9IjYyOSIgZD0iTTQ0IDQ3OVE0NCA0ODQgNjYgNDkyVDExOCA1MDFRMTM1IDUwMSAxNTIgNDk3VDE4NCA0ODNUMjExIDQ1NVQyMjkgNDEwUTI0NiA0NTQgMjg1IDQ4MFQzODAgNTA2UTQzMSA1MDYgNDczIDQ4OFQ1NDUgNDM3VDU5MSAzNTVUNjA3IDI0N1E2MDcgMTkwIDU5MSAxNDJUNTQ1IDYwVDQ3MyA2VDM4MCAtMTRRMzI5IC0xNCAyOTIgMTBUMjM2IDcyVi0xODZINDRWNDc5Wk0zMjcgMTM1UTM3MiAxMzUgMzk4IDE2NVQ0MjUgMjQ2UTQyNSAyOTcgMzk5IDMyN1QzMjggMzU3UTI5NSAzNTcgMjcxIDM0MVQyMzUgMjk4VjIyM1EyMzUgMTgxIDI2MSAxNThUMzI3IDEzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9InEiIGdseXBoLW5hbWU9InEiIGhvcml6LWFkdi14PSI2MjkiIGQ9Ik0zOTQgNzZRMzc0IDM0IDMzNyAxMFQyNDggLTE0UTE5NyAtMTQgMTU2IDVUODQgNThUMzggMTQxVDIyIDI0N1EyMiAzMDcgMzggMzU0VDg0IDQzNlQxNTYgNDg4VDI1MCA1MDZRMzAzIDUwNiAzNDMgNDgzVDQwMyA0MjJRNDEwIDQ0NSA0MjIgNDYwVDQ0OCA0ODRUNDc5IDQ5N1Q1MTIgNTAxUTU0MSA1MDEgNTYzIDQ5M1Q1ODUgNDc5Vi0xODZIMzk0Vjc2Wk0zMDIgMTM1UTM0MiAxMzUgMzY4IDE1OFQzOTQgMjIzVjMwMFEzODIgMzI2IDM1OSAzNDFUMzA0IDM1N1EyNTkgMzU3IDIzMiAzMjhUMjA0IDI0NlEyMDQgMTk2IDIzMSAxNjZUMzAyIDEzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9InIiIGdseXBoLW5hbWU9InIiIGhvcml6LWFkdi14PSI0NjciIGQ9Ik0xMTggNTAxUTEzNCA1MDEgMTUxIDQ5N1QxODMgNDgzVDIxMCA0NTZUMjI4IDQxM1EyNDIgNDU1IDI3MiA0ODBUMzQ4IDUwNlEzOTYgNTA2IDQyNCA0NzlUNDUzIDQwM1E0NTMgMzc0IDQ0NCAzNTVUNDIzIDMyM1Q0MDEgMzA2VDM5MCAzMDJRMzc4IDMxMyAzNjAgMzIwVDMyMSAzMjhRMjM2IDMyOCAyMzYgMjA2VjBINDRWNDc5UTQ0IDQ4NCA2NiA0OTJUMTE4IDUwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9InMiIGdseXBoLW5hbWU9InMiIGhvcml6LWFkdi14PSI0OTIiIGQ9Ik0yMzUgLTExUTExOSAtMTEgNjYgMTlUMTMgMTAyUTEzIDExOCAyMCAxMzJUMzYgMTU2VDUyIDE3MVQ2MiAxNzZRODggMTUyIDEyOCAxMzVUMjIwIDExOFEyNTAgMTE4IDI2NiAxMjNUMjgyIDE0M1EyODIgMTYxIDI2MCAxNjZUMjAxIDE4MFExNzggMTg1IDE0OCAxOTNUOTAgMjE4VDQ1IDI2M1QyNiAzMzdRMjYgMzc1IDQxIDQwNlQ4NSA0NTlUMTU0IDQ5M1QyNDQgNTA1UTM1MiA1MDUgNDA0IDQ3NVQ0NTYgMzkyUTQ1NiAzNzUgNDQ5IDM2MVQ0MzEgMzM2VDQxMyAzMjBUNDAzIDMxNVEzNzYgMzQyIDMzNyAzNTlUMjU5IDM3NlEyMzEgMzc2IDIxNiAzNzFUMjAwIDM0OVEyMDAgMzMyIDIyNCAzMjhUMjg2IDMxNFEzMTAgMzA5IDM0MSAzMDFUNDAwIDI3NVQ0NDggMjI5VDQ2OCAxNTdRNDY4IDc4IDQwNyAzNFQyMzUgLTExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idCIgZ2x5cGgtbmFtZT0idCIgaG9yaXotYWR2LXg9IjQzOSIgZD0iTTE2IDQ5Nkg5OFY1NDRROTggNTkwIDEyMCA2MTNUMTg0IDYzN0gyMDBRMjM4IDYzNyAyNjIgNjE3VDI4NiA1NDRWNDk2SDQxMVYzNTFIMjgyVjE4NVEyODIgMTM1IDMyNCAxMzVRMzQ0IDEzNSAzNTYgMTQzVDM3OSAxNjVRMzgwIDE2NyAzODcgMTYzVDQwMSAxNTBUNDE1IDEyN1Q0MjEgOTVRNDIxIDQ3IDM4MSAxN1QyNzIgLTE0UTE4MyAtMTQgMTQxIDMwVDk4IDE2NFYzNTFIMTZWNDk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idSIgZ2x5cGgtbmFtZT0idSIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTQ4OCAtNVE0NzEgLTUgNDU1IC0xVDQyMyAxMlQzOTcgMzhUMzc4IDc4UTM1MiAzOCAzMTQgMTJUMjE1IC0xNFExNjcgLTE0IDEzNCAyVDc5IDQ2VDQ5IDEwOFQzOSAxODJWNDk2SDIzMVYyMTZRMjMxIDE4MiAyNDggMTYzVDI5NiAxNDNRMzIxIDE0MyAzNDAgMTU0VDM3MCAxODJWNDk2SDU2MlYxN1E1NjIgMTUgNTU2IDExVDU0MCA0VDUxNiAtMlQ0ODggLTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ2IiBnbHlwaC1uYW1lPSJ2IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMTE0IDUwM1ExNDUgNTAzIDE3MiA0ODVUMjE1IDQxNUwyODYgMTg0TDM2MCA0MTVRMzc2IDQ2NiA0MDIgNDg0VDQ1OCA1MDNRNDc5IDUwMyA0OTggNDk2VDUzMyA0NzlUNTU2IDQ2MFQ1NjIgNDQ3TDM3MSAwSDIwMUw4IDQ0N1E2IDQ1MSAxNSA0NjBUMzkgNDc4VDczIDQ5NVQxMTQgNTAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgZ2x5cGgtbmFtZT0idyIgaG9yaXotYWR2LXg9IjgwOSIgZD0iTTEwIDQ0N1E4IDQ1MSAxOSA0NjBUNDcgNDc5VDg1IDQ5NlQxMjcgNTAzUTE0MCA1MDMgMTU0IDUwMFQxODAgNDg4VDIwMSA0NjZUMjE0IDQzMEwyNTYgMTk0TDMxOSA0MDJRMzI3IDQzMSAzNTMgNDQ2VDQxMyA0NjJRNDQ2IDQ2MiA0NzEgNDQ3VDUwNCA0MDJMNTU5IDIwNEw2MDEgNDMwUTYwOSA0NzIgNjMzIDQ4N1Q2ODQgNTAzUTcwNSA1MDMgNzI2IDQ5NlQ3NjMgNDgwVDc5MCA0NjFUNzk5IDQ0N0w2NTIgMEg0ODVMNDA1IDI1MEwzMjcgMEgxNjBMMTAgNDQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieCIgZ2x5cGgtbmFtZT0ieCIgaG9yaXotYWR2LXg9IjU1NiIgZD0iTTQwMiAyNDhMNTM5IDUzUTU0MiA0OSA1MzQgNDBUNTEwIDIwVDQ3MyAxVDQyNiAtN1EzOTcgLTcgMzcyIDhUMzMyIDU1TDI3NiAxNTJMMjIyIDU2UTE5MSAtNyAxMjUgLTdRMTAyIC03IDgxIDFUNDUgMTlUMjEgMzlUMTUgNTNMMTUyIDI0OEwxNiA0NDRRMTMgNDQ4IDIxIDQ1N1Q0NSA0NzdUODAgNDk1VDEyNCA1MDNRMTUzIDUwMyAxNzkgNDkwVDIyMiA0NDFMMjc3IDM0M0wzMzMgNDQxUTM0OSA0NzQgMzc1IDQ4OFQ0MjkgNTAzUTQ1MiA1MDMgNDczIDQ5NVQ1MTAgNDc3VDUzNCA0NTdUNTQwIDQ0NEw0MDIgMjQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieSIgZ2x5cGgtbmFtZT0ieSIgaG9yaXotYWR2LXg9IjU3MCIgZD0iTTI0MyAtMTg4UTIyMiAtMTg4IDIwMyAtMTgxVDE2OSAtMTY1VDE0NiAtMTQ4VDE0MCAtMTM1TDIyMiAzNlEyMDUgNDAgMTkyIDQ4VDE3MyA3MkwtOSA0OTZIMTk1TDI5MCAxOTlMMzc5IDQ5Nkg1NzlMMzQ1IC0xMDNRMzI2IC0xNTEgMzAwIC0xNjlUMjQzIC0xODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ6IiBnbHlwaC1uYW1lPSJ6IiBob3Jpei1hZHYteD0iNTA4IiBkPSJNMjMgMTE4TDIzNyAzNTJIMTAxUTI4IDM1MiAyOCA0MjBWNDI3UTI4IDQ2MCA0NiA0NzhUMTAxIDQ5Nkg0NzdWMzgwTDI1NyAxNDVINDE1UTQ4NyAxNDUgNDg3IDc3VjY5UTQ4NyAxIDQxNSAxSDIzVjExOFoiICAvPgorPGdseXBoIHVuaWNvZGU9InsiIGdseXBoLW5hbWU9ImJyYWNlbGVmdCIgaG9yaXotYWR2LXg9IjQ5NyIgZD0iTTM4NCAtMjAwUTM0MyAtMjAwIDMwNCAtMTg1VDIzMCAtMTM3VDE3MiAtNDlUMTM4IDg2TDExMiAxMDBRODMgMTE1IDY1IDEyN1QzNiAxNTNUMjIgMTg2VDE4IDIzMFExOCAyNTYgMjIgMjc0VDM4IDMwN1Q2NyAzMzRUMTEyIDM2MEwxMzkgMzc0UTE0OCA0NTMgMTcyIDUwN1QyMzAgNTk2VDMwNCA2NDRUMzg0IDY1OVE0MjggNjU5IDQ1NyA2MzdUNDg2IDU3NVE0ODYgNTYwIDQ4MiA1NDlUNDcyIDUzMVQ0NjEgNTE5VDQ1MyA1MTVRNDE0IDUxMiAzODggNDk5VDM0NiA0NTlUMzIxIDM5M1QzMTAgMjk4TDE5MiAyMzBMMzEwIDE2MlEzMTMgMTA3IDMyMSA2N1QzNDUgMVQzODcgLTM4VDQ1MiAtNTVRNDU0IC01NSA0NTkgLTU5VDQ3MSAtNzFUNDgxIC05MFQ0ODYgLTExNlE0ODYgLTE1NCA0NTcgLTE3N1QzODQgLTIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InwiIGdseXBoLW5hbWU9ImJhciIgaG9yaXotYWR2LXg9IjI5MCIgZD0iTTEzNyAtMTk5UTk4IC0xOTkgNzQgLTE4MFQ0OSAtMTA3VjU2N1E0OSA2MTkgNzMgNjM5VDEzNSA2NTlIMTU1UTE5NCA2NTkgMjE3IDY0MFQyNDEgNTY3Vi0xMDdRMjQxIC0xNTkgMjE4IC0xNzlUMTU3IC0xOTlIMTM3SDEzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9In0iIGdseXBoLW5hbWU9ImJyYWNlcmlnaHQiIGhvcml6LWFkdi14PSI0OTciIGQ9Ik0xMTMgLTIwMFE2OSAtMjAwIDQwIC0xNzdUMTEgLTExNlExMSAtMTAxIDE1IC05MFQyNiAtNzJUMzcgLTYwVDQ1IC01NVE4NCAtNTIgMTEwIC0zOVQxNTIgMVQxNzYgNjdUMTg3IDE2MkwzMDUgMjMwTDE4NyAyOThRMTg0IDM1MyAxNzYgMzkzVDE1MiA0NTlUMTA5IDQ5OFQ0NCA1MTVRNDIgNTE1IDM3IDUxOVQyNiA1MzBUMTYgNTQ5VDExIDU3NVExMSA2MTQgNDAgNjM2VDExMyA2NTlRMTUzIDY1OSAxOTMgNjQ1VDI2NiA1OTZUMzI0IDUwOFQzNTggMzc0TDM4NSAzNjBRNDExIDM0NyA0MjkgMzM1VDQ1OCAzMDhUNDc0IDI3NVQ0NzkgMjMwUTQ3OSAyMDQgNDc1IDE4NlQ0NjEgMTU0VDQzMiAxMjdUMzg1IDEwMEwzNTkgODZRMzUwIDYgMzI2IC00OFQyNjcgLTEzNlQxOTMgLTE4NVQxMTMgLTIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9In4iIGdseXBoLW5hbWU9ImFzY2lpdGlsZGUiIGhvcml6LWFkdi14PSI0OTkiIGQ9Ik0zMjUgMTU0UTI5MyAxNTQgMjY5IDE2M1QyMjQgMTg5UTIxNiAxOTcgMjA5IDIwMlQxOTcgMjA4UTE4OSAyMDggMTg0IDE5N1QxNzIgMTc2UTE1NiAxNTUgMTI5IDE1NVExMDMgMTU1IDg2IDE3MlQ2OCAyMTRRNjggMjY5IDk5IDI5OVQxNzQgMzI5UTIwMiAzMjkgMjI0IDMyMlQyNjUgMzAwUTI3NiAyOTIgMjg1IDI4NFQzMDIgMjc1UTMxMCAyNzUgMzE0IDI4NVQzMjUgMzA1UTM0MSAzMjcgMzY5IDMyN1EzOTYgMzI3IDQxMiAzMTBUNDMxIDI2OFE0MzEgMjEzIDQwMCAxODRUMzI1IDE1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEwOyIgZ2x5cGgtbmFtZT0ibmJzcGFjZSIgaG9yaXotYWR2LXg9IjE3MCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMTsiIGdseXBoLW5hbWU9ImV4Y2xhbWRvd24iIGhvcml6LWFkdi14PSIyOTciIGQ9Ik0xMzggNDc4UTk0IDQ3OCA3NSA0OTdUNTUgNTU5VjU3NVE1NSA2NTYgMTM4IDY1NkgxNjFRMjQyIDY1NiAyNDIgNTc1VjU1OVEyNDIgNDc4IDE2MSA0NzhIMTM4Wk04OSAzNzJROTYgNDA0IDEwOCA0MThUMTQwIDQzMkgxNTlRMTc4IDQzMiAxODkgNDE4VDIwNyAzNzJMMjczIDFIMjNMODkgMzcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTI7IiBnbHlwaC1uYW1lPSJjZW50IiBob3Jpei1hZHYteD0iNTIzIiBkPSJNMjg4IC0xMDNRMjQ0IC0xMDMgMjI3IC04MVQyMTAgLTExVjI1UTExOCA0NyA2NSAxMTNUMTIgMjgzUTEyIDM4MiA2NSA0NDhUMjA4IDUzOFY1NzRRMjA4IDYyMCAyMjYgNjQzVDI4NiA2NjdIMjkwUTMzMyA2NjcgMzUwIDY0NVQzNjggNTc0VjU0NFE0NDEgNTMzIDQ3NyA1MDFUNTEzIDQyM1E1MTMgMzk2IDQ5OCAzNzlUNDY1IDM1M1Q0MzAgMzQxVDQxMyAzNDFRMzkwIDM3OCAzNjAgMzkxVjE3NFEzOTMgMTg3IDQxNSAyMjZRNDE2IDIyOSA0MzIgMjI3VDQ2NiAyMTVUNTAwIDE5MFQ1MTUgMTQ2UTUxNSAxMDAgNDc5IDY3VDM3MCAyMlYtMTFRMzcwIC01NyAzNTIgLTgwVDI5MiAtMTAzSDI4OFpNMTkzIDI4NFExOTMgMjM3IDIxNyAyMDdWMzYwUTE5MyAzMzAgMTkzIDI4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEzOyIgZ2x5cGgtbmFtZT0ic3RlcmxpbmciIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik0xMDYgMjM5UTc4IDIzOSA2MSAyNTZUNDMgMjk5VjMxNVE0MyAzNDEgNjEgMzU3VDEwNiAzNzRIMTQ1TDE2MCA0NTRRMTc5IDU1OSAyNDAgNjEwVDM5OCA2NjFRNDkzIDY2MSA1NDcgNjI0VDYwMiA1MjJRNjAyIDQ4NSA1ODYgNDY2VDU0OSA0MzlUNTEzIDQzMVQ0OTYgNDMyUTQ4OSA0NjggNDY5IDQ4OFQ0MDcgNTA5UTM3MiA1MDkgMzUyIDQ5MVQzMjMgNDI5TDMxMyAzNzRINDIyUTQ1MSAzNzQgNDY4IDM1OFQ0ODYgMzE1VjI5OVE0ODYgMjcyIDQ2OSAyNTZUNDIyIDIzOUgyODlMMjczIDE1MUg1MTRRNTYwIDE1MSA1ODAgMTM1VDYwMCA4MVY3MlE2MDAgMzQgNTgwIDE3VDUxNCAwSDEwM1E1NiAwIDM3IDE3VDE3IDcyVjgxUTE3IDExOCAzNyAxMzRUMTAzIDE1MUgxMDZMMTIxIDIzOUgxMDZIMTA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBnbHlwaC1uYW1lPSJjdXJyZW5jeSIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTc4IDMzOFE0NiAzMzggMzEgMzUyVDE1IDM4NlY0MDBRMTUgNDE4IDMwIDQzMlQ3OCA0NDdIMTA0UTExNiA0OTcgMTQxIDUzN1QyMDQgNjA0VDI4OSA2NDZUMzkyIDY2MVE0OTggNjYxIDU1NyA2MjNUNjE2IDUyNlE2MTYgNTAyIDYwMyA0ODRUNTc0IDQ1NFQ1NDMgNDM3VDUyNiA0MzRRNTAwIDQ2NiA0NzIgNDgyVDM5NiA0OTlRMzI2IDQ5OSAyOTYgNDQ3SDQxNVE0NDggNDQ3IDQ2MyA0MzNUNDc4IDQwMFYzODZRNDc4IDM2NiA0NjMgMzUyVDQxNSAzMzhIMjgwVjMwOEg0MTVRNDQ4IDMwOCA0NjMgMjk0VDQ3OCAyNjFWMjQ3UTQ3OCAyMjggNDYzIDIxNFQ0MTUgMTk5SDI5OFEzMTMgMTczIDMzOCAxNjFUMzk3IDE0OFE0NDUgMTQ4IDQ3MyAxNjVUNTI3IDIxNVE1MjkgMjE3IDU0MyAyMTJUNTc0IDE5NlQ2MDQgMTY2VDYxNyAxMjNRNjE3IDk5IDYwNSA3NVQ1NjYgMzFUNDk3IC0xVDM5NCAtMTRRMjgxIC0xNCAyMDUgNDFUMTA1IDE5OUg3OFE0NiAxOTkgMzEgMjEzVDE1IDI0N1YyNjFRMTUgMjgwIDMwIDI5NFQ3OCAzMDhIOTVWMzM4SDc4SDc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTU7IiBnbHlwaC1uYW1lPSJ5ZW4iIGhvcml6LWFkdi14PSI2NDQiIGQ9Ik0xMDggMjU1UTczIDI1NSA1NiAyNzFUMzkgMzA4VjMyMlEzOSAzNDMgNTYgMzU5VDEwOCAzNzVIMTc2TDQyIDU3MVE0MCA1NzUgNDMgNTg4VDU5IDYxNVQ5NCA2NDFUMTUzIDY1M1ExODQgNjUzIDIwOCA2MzhUMjQ5IDU4NEwzMjMgNDMzTDQwMiA1ODRRNDIyIDYyMyA0NDYgNjM5VDUwMSA2NTVRNTMyIDY1NSA1NTIgNjQzVDU4NSA2MTZUNjAxIDU4OFQ2MDMgNTcxTDQ3MCAzNzVINTM3UTU3MiAzNzUgNTg4IDM1OVQ2MDUgMzIyVjMwOFE2MDUgMjg3IDU4OSAyNzFUNTM3IDI1NUg0MTJWMjIwSDUzN1E1NzIgMjIwIDU4OCAyMDRUNjA1IDE2OFYxNTRRNjA1IDEzMiA1ODkgMTE3VDUzNyAxMDFINDEyVjg0UTQxMiAzOCAzOTQgMTVUMzMyIC05SDMxMlEyNzAgLTkgMjUzIDE0VDIzNSA4NFYxMDFIMTA4UTczIDEwMSA1NiAxMTZUMzkgMTU0VjE2OFEzOSAxODggNTYgMjA0VDEwOCAyMjBIMjM1VjI1NUgxMDhIMTA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTc7IiBnbHlwaC1uYW1lPSJzZWN0aW9uIiBob3Jpei1hZHYteD0iNjAxIiBkPSJNMjgwIC0xOTZRMTU0IC0xOTYgOTUgLTE2MlQzNiAtNzFRMzYgLTU1IDQ0IC00MVQ2MiAtMTZUODEgMFQ5MyA0UTEwOCAtMTAgMTMxIC0yMlQxODEgLTQzVDIzNCAtNTdUMjgzIC02MlEzMjUgLTYyIDM0MyAtNTJUMzYxIC0yMVEzNjEgMSAzMzEgMTFUMjUyIDMzUTIxNiA0MSAxNzYgNTJUMTAxIDgzVDQ1IDEzM1QyMyAyMDhRMjMgMzA0IDEyNyAzNDZROTQgMzY0IDczIDM5M1Q1MiA0NzBRNTIgNTU3IDExOCA2MDlUMzA1IDY2MVEzNzIgNjYxIDQxNiA2NTBUNDg3IDYyMVQ1MjMgNTgzVDUzNCA1NDNRNTM0IDUyNCA1MjUgNTA5VDUwNSA0ODJUNDg0IDQ2NlQ0NzMgNDYyUTQ0MCA0OTIgNDAwIDUxMFQzMTcgNTI5UTI0MiA1MjkgMjQyIDQ4N1EyNDIgNDc2IDI1MSA0NjhUMjc4IDQ1NFQzMTkgNDQxVDM3MSA0MjlRNDA2IDQyMCA0NDMgNDA4VDUxMCAzNzdUNTU5IDMyOVQ1NzkgMjU4UTU3OSAxNjMgNDc3IDEyMFE1MDkgMTAzIDUzMCA3NFQ1NTEgLTRRNTUxIC00NyA1MzMgLTgyVDQ4MCAtMTQzVDM5NSAtMTgyVDI4MCAtMTk2Wk00MTUgMjI0UTQxNSAyNDMgNDAzIDI1NVQzNzAgMjc2VDMyMiAyOTFUMjY0IDMwNFEyMjYgMjk2IDIwNiAyNzhUMTg2IDIzOVExODYgMjE5IDE5OSAyMDdUMjM2IDE4N1QyODggMTczVDM1MSAxNjFRMzgzIDE2OSAzOTkgMTg1VDQxNSAyMjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBODsiIGdseXBoLW5hbWU9ImRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMzY1IDU0MVEzMjMgNTQxIDI5OSA1NjNUMjc1IDYyOVEyNzUgNjcxIDI5OCA2OTRUMzYyIDcxN1E0MDMgNzE3IDQyNyA2OTRUNDUxIDYyOVE0NTEgNTg3IDQyNyA1NjRUMzY1IDU0MVpNMTM5IDU0MVE5NyA1NDEgNzMgNTYzVDQ5IDYyOVE0OSA2NzEgNzMgNjk0VDEzNSA3MTdRMTc3IDcxNyAyMDEgNjk0VDIyNiA2MjlRMjI2IDU4NyAyMDIgNTY0VDEzOSA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBOTsiIGdseXBoLW5hbWU9ImNvcHlyaWdodCIgaG9yaXotYWR2LXg9IjczOSIgZD0iTTM3MCAtMTRRMjk1IC0xNCAyMzMgMTFUMTI3IDgxVDU4IDE4OFQzMyAzMjRRMzMgMzk3IDU3IDQ1OVQxMjYgNTY2VDIzMyA2MzZUMzcwIDY2MVE0NDUgNjYxIDUwNyA2MzZUNjEzIDU2N1Q2ODEgNDYwVDcwNiAzMjRRNzA2IDI1MCA2ODIgMTg4VDYxMyA4MVQ1MDcgMTFUMzcwIC0xNFpNMzcwIDUzUTQzMCA1MyA0NzkgNzNUNTYzIDEyOVQ2MTcgMjE1VDYzNiAzMjRRNjM2IDM4MyA2MTcgNDMyVDU2MiA1MThUNDc4IDU3NFQzNzAgNTk0UTMxMCA1OTQgMjYxIDU3NFQxNzcgNTE4VDEyMiA0MzNUMTAzIDMyNFExMDMgMjY1IDEyMiAyMTZUMTc3IDEzMFQyNjEgNzRUMzcwIDUzWk0zODAgMTM4UTMzOCAxMzggMzA0IDE1MVQyNDUgMTkwVDIwNiAyNDhUMTkyIDMyM1ExOTIgMzYzIDIwNiAzOTZUMjQ0IDQ1NFQzMDMgNDkyVDM3OSA1MDZRNDI2IDUwNiA0NTQgNDkzVDQ5NyA0NjZRNTA2IDQ1NyA1MTAgNDQ4VDUxNSA0MjNRNTE1IDQwOCA1MDcgMzk3VDQ4OCAzNzhUNDY4IDM2N1Q0NTcgMzY1UTQ0MSAzODQgNDI1IDM5MlQzODQgNDAwUTM1NCA0MDAgMzMzIDM3OVQzMTIgMzIzUTMxMiAyODggMzMzIDI2N1QzODUgMjQ1UTQxMSAyNDUgNDI3IDI1M1Q0NTggMjgxUTQ1OSAyODIgNDY4IDI3OVQ0ODggMjY5VDUwNyAyNTBUNTE2IDIyM1E1MTcgMjA5IDUxMiAxOTlUNDk3IDE3OFE0ODMgMTY0IDQ1NSAxNTFUMzgwIDEzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFBOyIgZ2x5cGgtbmFtZT0ib3JkZmVtaW5pbmUiIGhvcml6LWFkdi14PSI0NTYiIGQ9Ik0xNDkgMjQ4UTg4IDI0OCA1MiAyODBUMTYgMzY0UTE2IDM5NSAyNyA0MThUNjcgNDU4VDE0NSA0ODNUMjcxIDQ5M1EyNjggNTUwIDIwOSA1NTBRMTkxIDU1MCAxNzkgNTQ1VDE1NyA1MzFUMTQyIDUxNFQxMzIgNDk1UTEzMiA0OTQgMTE2IDQ5NFQ4MiA0OThUNDcgNTE2VDMxIDU1NVEzMSA2MDIgNzYgNjMxVDIxOSA2NjFRMzI3IDY2MSAzNzQgNjE5VDQyMiA0OTBWMjY2UTQyMiAyNjAgNDA0IDI1NVQzNjMgMjQ5UTI5NiAyNDkgMjc5IDMxNFEyNjEgMjgyIDIyNyAyNjVUMTQ5IDI0OFpNMjA5IDM0M1EyMzggMzQzIDI1NCAzNjFUMjcxIDQwNlY0MjRRMjEyIDQyMiAxODcgNDEyVDE2MSAzNzlRMTYxIDM2MiAxNzQgMzUzVDIwOSAzNDNaTTIxNyAtOVExNDQgLTkgMTQ0IDY0Vjc5UTE0NCAxNTIgMjE3IDE1MkgyMzdRMjc2IDE1MiAyOTQgMTM1VDMxMiA3OVY2NFEzMTIgLTkgMjM3IC05SDIxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90bGVmdCIgaG9yaXotYWR2LXg9IjU1MSIgZD0iTTQ1MiA1NVE0MjAgNTUgMzg3IDgyVDMyNSAxNDNUMjc5IDIwOFQyNjEgMjQ3UTI2MSAyNTIgMjY5IDI2OFQyOTIgMzA1VDMyNSAzNTBUMzY1IDM5M1Q0MDggNDI2VDQ1MiA0MzlINDU0UTQ4OSA0MzkgNTA2IDQyMFQ1MjQgMzcwVjM2NlE1MjQgMzQ4IDUxMSAzMzFUNDgwIDI5N1Q0NDAgMjY4VDQwMSAyNDdRNDE4IDIzOCA0MzkgMjI1VDQ3OSAxOTZUNTExIDE2M1Q1MjQgMTI4VjEyM1E1MjQgOTQgNTA3IDc1VDQ1NCA1NUg0NTJaTTIwNCA3NFExODUgNzQgMTY1IDg1VDEyNCAxMTVUODcgMTU0VDU2IDE5NFQzNCAyMjdUMjYgMjQ3UTI2IDI1NCA0MyAyODFUODYgMzQwVDE0NCAzOTVUMjA0IDQyMEgyMDZRMjM4IDQyMCAyNTMgNDAzVDI2OSAzNTdWMzU0UTI2OSAzMzggMjU4IDMyMlQyMzAgMjkyVDE5NCAyNjZUMTU5IDI0N1ExNzQgMjM5IDE5MyAyMjdUMjI5IDIwMVQyNTcgMTcxVDI2OSAxMzlWMTM2UTI2OSAxMDkgMjU0IDkyVDIwNiA3NEgyMDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRTsiIGdseXBoLW5hbWU9InJlZ2lzdGVyZWQiIGhvcml6LWFkdi14PSI3MzkiIGQ9Ik0zNzAgLTE0UTI5NSAtMTQgMjMzIDExVDEyNyA4MVQ1OCAxODhUMzMgMzI0UTMzIDM5NyA1NyA0NTlUMTI2IDU2NlQyMzMgNjM2VDM3MCA2NjFRNDQ1IDY2MSA1MDcgNjM2VDYxMyA1NjdUNjgxIDQ2MFQ3MDYgMzI0UTcwNiAyNTAgNjgyIDE4OFQ2MTMgODFUNTA3IDExVDM3MCAtMTRaTTM3MCA1M1E0MzAgNTMgNDc5IDczVDU2MyAxMjlUNjE3IDIxNVQ2MzYgMzI0UTYzNiAzODMgNjE3IDQzMlQ1NjIgNTE4VDQ3OCA1NzRUMzcwIDU5NFEzMTAgNTk0IDI2MSA1NzRUMTc3IDUxOFQxMjIgNDMzVDEwMyAzMjRRMTAzIDI2NSAxMjIgMjE2VDE3NyAxMzBUMjYxIDc0VDM3MCA1M1pNNDcyIDE0MVE0NTUgMTQxIDQzOCAxNTBUNDA3IDE4NUwzNjEgMjU3SDMzM1YxOThRMzMzIDE3MiAzMjAgMTU4VDI4MiAxNDRIMjY2UTI0MiAxNDQgMjI5IDE2MlQyMTYgMjEyVjQzOFEyMTYgNDcwIDIzMSA0ODZUMjc2IDUwMkgzODRRNTM4IDUwMiA1MzggMzg0UTUzOCAzNDggNTIxIDMyMlQ0NjkgMjgzTDU0MCAxODFRNTQyIDE3OCA1MzcgMTcyVDUyMiAxNTlUNDk5IDE0N1Q0NzIgMTQxWk0zMzEgMzM4SDM3NlE0MjIgMzM4IDQyMiAzNzZRNDIyIDQxNCAzNzMgNDE0SDMzMVYzMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRjsiIGdseXBoLW5hbWU9Im92ZXJzY29yZSIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTEzMyA1NDZROTcgNTQ2IDc2IDU2M1Q1NSA2MTFWNjE5UTU1IDY0OSA3NiA2NjZUMTMzIDY4NEgzNjdRNDAzIDY4NCA0MjQgNjY3VDQ0NSA2MTlWNjExUTQ0NSA1ODAgNDI1IDU2M1QzNjcgNTQ2SDEzM0gxMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMDsiIGdseXBoLW5hbWU9ImRlZ3JlZSIgaG9yaXotYWR2LXg9IjM3NSIgZD0iTTE4OCAzMzVRMTUxIDMzNSAxMjAgMzQ2VDY3IDM3N1QzMyA0MjdUMjAgNDkzVjUwMFEyMCA1MzcgMzIgNTY2VDY3IDYxNVQxMjEgNjQ3VDE4OSA2NThRMjYzIDY1OCAzMDkgNjE3VDM1NSA1MDBWNDkzUTM1NSA0MTkgMzA5IDM3N1QxODggMzM1Wk0xODkgNDI1UTIxMiA0MjUgMjI3IDQ0MFQyNDMgNDg5VjUwNFEyNDMgNTM3IDIyNyA1NTNUMTg4IDU2OVExNjQgNTY5IDE0OSA1NTRUMTMzIDUwNVY0ODlRMTMzIDQ1NyAxNDkgNDQxVDE4OSA0MjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMTsiIGdseXBoLW5hbWU9InBsdXNtaW51cyIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTEyOSAzNTNROTEgMzUzIDcyIDM3MVQ1MyA0MThWNDI2UTUzIDQ1MyA3MiA0NzFUMTI5IDQ5MEgyMjZWNTc3UTIyNiA2MTUgMjQ0IDYzNFQyOTIgNjUzSDMwN1EzMzUgNjUzIDM1MyA2MzRUMzcyIDU3N1Y0OTBINDcwUTUwOSA0OTAgNTI3IDQ3MlQ1NDYgNDI2VjQxOFE1NDYgMzg5IDUyOCAzNzFUNDcwIDM1M0gzNzJWMjg1UTM3MiAyNDYgMzU0IDIyOFQzMDcgMjA5SDI5MlEyNjMgMjA5IDI0NSAyMjdUMjI2IDI4NVYzNTNIMTI5Wk0xMTkgMzBRODEgMzAgNjIgNDhUNDMgOTVWMTA0UTQzIDEzMSA2MiAxNDlUMTE5IDE2OEg0ODBRNTE5IDE2OCA1MzcgMTUwVDU1NiAxMDRWOTVRNTU2IDY2IDUzOCA0OFQ0ODAgMzBIMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjI7IiBnbHlwaC1uYW1lPSJ0d28uc3VwcyIgaG9yaXotYWR2LXg9IjMzNiIgZD0iTTIyMyA0MjdRMTkyIDQxNiAxNjUgNDA4VDEyNCAzODNIMjYyUTMyMSAzODMgMzIxIDMzN1YzMzVRMzIxIDI4NiAyNjIgMjg2SDk2UTUxIDI4NiAzNiAyOTdUMjEgMzQ1VjM2OVEyMSAzOTQgMjkgNDEyVDUxIDQ0M1Q4NSA0NjZUMTMxIDQ4N1ExNjMgNTAxIDE4MyA1MDlUMjA0IDUzMVEyMDQgNTQ1IDE5NCA1NTRUMTY1IDU2NFExMzggNTY0IDEyMyA1NDVUMTA0IDUwNVExMDQgNTA0IDkyIDUwNFQ2NCA1MTBUMzYgNTI2VDIzIDU2MVEyMyA2MDQgNjEgNjMwVDE3MiA2NTZRMjQxIDY1NiAyODAgNjI0VDMyMCA1MzZRMzIwIDUxMCAzMTIgNDkyVDI5MSA0NjJUMjYwIDQ0MlQyMjMgNDI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjM7IiBnbHlwaC1uYW1lPSJ0aHJlZS5zdXBzIiBob3Jpei1hZHYteD0iMzM2IiBkPSJNMzIxIDM5MFEzMjEgMzM2IDI4MSAzMDdUMTYwIDI3N1E5MSAyNzcgNTEgMzAxVDEwIDM2MlExMCAzODYgMjEgMzk4VDQ3IDQxNVQ3MyA0MjFUODYgNDE5UTk4IDM2OSAxNTYgMzY5UTE3OSAzNjkgMTkyIDM3OFQyMDYgNDAxUTIwNiA0MjYgMTc0IDQyNkgxNjZRMTM1IDQyNiAxMjMgNDM2VDExMCA0NjZWNDczUTExMCA0OTMgMTIzIDUwM1QxNjUgNTE0SDE4MVExOTEgNTE0IDE5NyA1MTlUMjA0IDUzNFEyMDQgNTQ3IDE5MSA1NTVUMTU0IDU2NFExMzYgNTY0IDEyNSA1NTlUMTA2IDU0N1Q5NSA1MzFUODkgNTE1UTg5IDUxMyA3OCA1MTNUNTMgNTE3VDI4IDUzNFQxNyA1NzFRMTcgNjA5IDU1IDYzMlQxNTkgNjU2UTMxNyA2NTYgMzE3IDU1M1EzMTcgNDk4IDI1NSA0NzlRMzIxIDQ1NiAzMjEgMzkwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjQ7IiBnbHlwaC1uYW1lPSJhY3V0ZSIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTE2NyA1NjdRMTY0IDU3MyAxNzEgNTkzVDE5MyA2MzlUMjI5IDY4OFQyNzYgNzI4UTMwMyA3NDQgMzI5IDc0NFEzNjUgNzQ0IDM5MCA3MjNUNDE1IDY3MFE0MTUgNjQ0IDQwMCA2MThUMzU4IDU3N1EzMjYgNTU5IDI5NCA1NTNUMjM0IDU0OFQxODkgNTU1VDE2NyA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGdseXBoLW5hbWU9InBhcmFncmFwaCIgaG9yaXotYWR2LXg9IjYyNiIgZD0iTTUxOCAtOVE0NzIgLTkgNDcyIDQyVjYwNlE0NzIgNjU2IDUxOCA2NTZINTM0UTU4MSA2NTYgNTgxIDYwNlY0MlE1ODEgLTkgNTM0IC05SDUxOFpNMzU5IC05UTMzNiAtOSAzMjQgNFQzMTIgNDJWMjcySDI1MFExMzUgMjcyIDc0IDMxOVQxMyA0NjFRMTMgNTU3IDcxIDYwNlQyNDggNjU1SDM1N1EzODcgNjU1IDQwMyA2MzlUNDIwIDU5NFY0MlE0MjAgLTkgMzc0IC05SDM1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI3OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjYyIiBkPSJNMTE4IDE1OFEzNiAxNTggMzYgMjM5VjI1NVEzNiAzMzYgMTE4IDMzNkgxNDFRMjI0IDMzNiAyMjQgMjU1VjIzOVEyMjQgMTU4IDE0MSAxNThIMTE4SDExOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI4OyIgZ2x5cGgtbmFtZT0iY2VkaWxsYSIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTIzMyAtMjIxUTIxOSAtMjMwIDIwMSAtMjMxVDE2NyAtMjI5VDE0MiAtMjE2VDEzNyAtMTkzTDE3MSAtOTZRMTc1IC04MyAxODEgLTczVDE5NiAtNTZUMjIwIC00NlQyNTggLTQzSDI3OFEzMTQgLTQzIDMzNCAtNTZUMzU0IC05NVYtMTAwUTM1NCAtMTE3IDM0MyAtMTMxVDMwOCAtMTYyTDIzMyAtMjIxSDIzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI5OyIgZ2x5cGgtbmFtZT0ib25lLnN1cHMiIGhvcml6LWFkdi14PSIzMzYiIGQ9Ik04NSAyODVRMjcgMjg1IDI3IDMzNVYzMzZRMjcgMzg5IDg1IDM4OUgxMjVWNTEzUTEwNSA1MDMgODcgNTAzUTYxIDUwMyA0MiA1MjBUMjMgNTY0UTIzIDU4MCAyOCA1OTFUMzkgNjEwVDUxIDYyMFQ1OSA2MjNRNjggNjE4IDc1IDYxNVQ5NCA2MTJRMTEyIDYxMiAxMjYgNjIyVDE0NSA2NTNIMTg0UTI0MCA2NTMgMjQwIDU5NFYzODlIMjYzUTMyMSAzODkgMzIxIDMzNlYzMzVRMzIxIDI4NSAyNjMgMjg1SDg1SDg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkE7IiBnbHlwaC1uYW1lPSJvcmRtYXNjdWxpbmUiIGhvcml6LWFkdi14PSI0NzYiIGQ9Ik0yMzcgMjQ0UTE4OCAyNDQgMTQ5IDI2MFQ4MSAzMDRUMzggMzcwVDIyIDQ1M1EyMiA0OTcgMzggNTM1VDgzIDYwMVQxNTEgNjQ1VDIzOSA2NjFRMjg3IDY2MSAzMjcgNjQ1VDM5NSA2MDFUNDM5IDUzNVQ0NTUgNDUzUTQ1NSA0MDggNDM5IDM3MFQzOTQgMzA0VDMyNSAyNjBUMjM3IDI0NFpNMjM5IDM2N1EyNzMgMzY3IDI5NiAzOTJUMzIwIDQ1M1EzMjAgNDkwIDI5NyA1MTVUMjM5IDU0MFEyMDQgNTQwIDE4MSA1MTVUMTU3IDQ1M1ExNTcgNDE3IDE4MCAzOTJUMjM5IDM2N1pNMjI2IC05UTE1MyAtOSAxNTMgNjRWNzlRMTUzIDE1MiAyMjYgMTUySDI0N1EzMjEgMTUyIDMyMSA3OVY2NFEzMjEgLTkgMjQ3IC05SDIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90cmlnaHQiIGhvcml6LWFkdi14PSI1NTEiIGQ9Ik05NyA1NVE2MiA1NSA0NSA3NFQyNyAxMjRWMTI4UTI3IDE0NiA0MCAxNjNUNzEgMTk2VDExMSAyMjVUMTUwIDI0N1ExMzMgMjU1IDExMiAyNjhUNzIgMjk3VDQwIDMzMVQyNyAzNjZWMzcwUTI3IDQwMSA0NCA0MjBUOTcgNDM5SDk5UTEyMCA0MzkgMTQyIDQyNlQxODUgMzk0VDIyNSAzNTFUMjU4IDMwNlQyODEgMjY4VDI4OSAyNDdRMjg5IDI0MiAyODEgMjI2VDI1OSAxODlUMjI2IDE0NFQxODYgMTAxVDE0MiA2OFQ5OSA1NUg5N1pNMzQ0IDc0UTMxMyA3NCAyOTggOTJUMjgyIDEzNlYxNDBRMjgyIDE1NiAyOTMgMTcxVDMyMSAyMDFUMzU3IDIyN1QzOTIgMjQ3UTM3NyAyNTQgMzU4IDI2NlQzMjIgMjkyVDI5NCAzMjJUMjgyIDM1NFYzNThRMjgyIDM4NSAyOTcgNDAyVDM0NCA0MjBIMzQ3UTM2NiA0MjAgMzg2IDQwOVQ0MjcgMzc5VDQ2NCAzNDBUNDk1IDMwMFQ1MTcgMjY2VDUyNSAyNDdRNTI1IDI0MiA1MTcgMjI4VDQ5NiAxOTRUNDY1IDE1NFQ0MjcgMTE1VDM4NyA4NlQzNDcgNzRIMzQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkM7IiBnbHlwaC1uYW1lPSJvbmVxdWFydGVyIiBob3Jpei1hZHYteD0iNzkyIiBkPSJNODUgMjg1UTI3IDI4NSAyNyAzMzVWMzM2UTI3IDM4OSA4NSAzODlIMTI1VjUxM1ExMDUgNTAzIDg3IDUwM1E2MSA1MDMgNDIgNTIwVDIzIDU2NFEyMyA1ODAgMjggNTkxVDM5IDYxMFQ1MSA2MjBUNTkgNjIzUTY4IDYxOCA3NSA2MTVUOTQgNjEyUTExMiA2MTIgMTI2IDYyMlQxNDUgNjUzSDE4NFEyNDAgNjUzIDI0MCA1OTRWMzg5SDI2M1EzMjEgMzg5IDMyMSAzMzZWMzM1UTMyMSAyODUgMjYzIDI4NUg4NVpNMTMyIDEyUTEzMyAyNCAxMzggMzVUMTU1IDYyUTE1NyA2NCAxNzcgODhUMjI2IDE0N1QyOTAgMjIzVDM1NSAzMDJRMzcwIDMyMSAzODkgMzQ1VDQzMCAzOTZUNDc1IDQ1MVQ1MTkgNTA3UTU2OSA1NjkgNjIyIDYzOFE2MjQgNjQxIDYzMyA2NDFUNjUyIDYzNVQ2NjkgNjIwVDY3NyA1OTRRNjc2IDU4MyA2NzIgNTcxVDY1NCA1NDRRNjUyIDU0MiA2MzIgNTE4VDU4MiA0NTlUNTE4IDM4MVQ0NTMgMzAyUTQzOCAyODMgNDE5IDI1OVQzNzggMjA3VDMzNCAxNTJUMjkwIDk2UTI0MSAzMyAxODggLTM0UTE4NSAtMzcgMTc2IC0zNlQxNTcgLTMwVDE0MCAtMTRUMTMyIDEyWk02NzUgLTVRNjI0IC01IDYyNCA1M1Y3NUg1MjJRNDkxIDc1IDQ3NCA4OVQ0NTYgMTI1VjE0MVE0NTcgMTU1IDQ2MSAxNjZUNDc1IDE5Nkw1NDcgMzI4UTU1NCAzNDEgNTYxIDM0OVQ1ODAgMzYxVDYwOCAzNjZUNjQ5IDM2OFE2OTYgMzY4IDcxNSAzNTFUNzM1IDI4NlYxNjRINzM3UTc2NyAxNjQgNzc5IDE1NVQ3OTEgMTIyVjExOVE3OTEgOTQgNzc5IDg1VDczNyA3NUg3MzVWNTNRNzM1IC01IDY4MiAtNUg2NzVaTTU1NSAxNjJINjMxVjI5NUw1NTUgMTYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkQ7IiBnbHlwaC1uYW1lPSJvbmVoYWxmIiBob3Jpei1hZHYteD0iNzkyIiBkPSJNODUgMjg1UTI3IDI4NSAyNyAzMzVWMzM2UTI3IDM4OSA4NSAzODlIMTI1VjUxM1ExMDUgNTAzIDg3IDUwM1E2MSA1MDMgNDIgNTIwVDIzIDU2NFEyMyA1ODAgMjggNTkxVDM5IDYxMFQ1MSA2MjBUNTkgNjIzUTY4IDYxOCA3NSA2MTVUOTQgNjEyUTExMiA2MTIgMTI2IDYyMlQxNDUgNjUzSDE4NFEyNDAgNjUzIDI0MCA1OTRWMzg5SDI2M1EzMjEgMzg5IDMyMSAzMzZWMzM1UTMyMSAyODUgMjYzIDI4NUg4NVpNMTEwIDEyUTExMSAyNCAxMTYgMzVUMTMzIDYyUTEzNSA2NCAxNTUgODhUMjA0IDE0N1QyNjggMjIzVDMzMyAzMDJRMzQ4IDMyMSAzNjcgMzQ1VDQwOCAzOTZUNDUzIDQ1MVQ0OTcgNTA3UTU0NyA1NjkgNjAwIDYzOFE2MDIgNjQxIDYxMSA2NDFUNjMwIDYzNVQ2NDcgNjIwVDY1NSA1OTRRNjU0IDU4MyA2NTAgNTcxVDYzMiA1NDRRNjMwIDU0MiA2MTAgNTE4VDU2MCA0NTlUNDk2IDM4MVQ0MzEgMzAyUTQxNiAyODMgMzk3IDI1OVQzNTYgMjA3VDMxMiAxNTJUMjY4IDk2UTIxOSAzMyAxNjYgLTM0UTE2MyAtMzcgMTU0IC0zNlQxMzUgLTMwVDExOCAtMTRUMTEwIDEyWk02NzkgMTQyUTY0OCAxMzEgNjIxIDEyM1Q1ODAgOThINzE4UTc3NyA5OCA3NzcgNTJWNTBRNzc3IDEgNzE4IDFINTUyUTUwNyAxIDQ5MiAxMlQ0NzcgNjBWODRRNDc3IDEwOSA0ODUgMTI3VDUwNyAxNThUNTQxIDE4MVQ1ODcgMjAyUTYxOSAyMTYgNjM5IDIyNFQ2NjAgMjQ2UTY2MCAyNjAgNjUwIDI2OVQ2MjEgMjc5UTU5NCAyNzkgNTc5IDI2MFQ1NjAgMjIwUTU2MCAyMTkgNTQ4IDIxOVQ1MjAgMjI1VDQ5MiAyNDFUNDc5IDI3NlE0NzkgMzE5IDUxNyAzNDVUNjI4IDM3MVE2OTcgMzcxIDczNiAzMzlUNzc2IDI1MVE3NzYgMjI1IDc2OCAyMDdUNzQ3IDE3N1Q3MTYgMTU3VDY3OSAxNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRTsiIGdseXBoLW5hbWU9InRocmVlcXVhcnRlcnMiIGhvcml6LWFkdi14PSI3OTIiIGQ9Ik0zMjEgMzkwUTMyMSAzMzYgMjgxIDMwN1QxNjAgMjc3UTkxIDI3NyA1MSAzMDFUMTAgMzYyUTEwIDM4NiAyMSAzOThUNDcgNDE1VDczIDQyMVQ4NiA0MTlROTggMzY5IDE1NiAzNjlRMTc5IDM2OSAxOTIgMzc4VDIwNiA0MDFRMjA2IDQyNiAxNzQgNDI2SDE2NlExMzUgNDI2IDEyMyA0MzZUMTEwIDQ2NlY0NzNRMTEwIDQ5MyAxMjMgNTAzVDE2NSA1MTRIMTgxUTE5MSA1MTQgMTk3IDUxOVQyMDQgNTM0UTIwNCA1NDcgMTkxIDU1NVQxNTQgNTY0UTEzNiA1NjQgMTI1IDU1OVQxMDYgNTQ3VDk1IDUzMVQ4OSA1MTVRODkgNTEzIDc4IDUxM1Q1MyA1MTdUMjggNTM0VDE3IDU3MVExNyA2MDkgNTUgNjMyVDE1OSA2NTZRMzE3IDY1NiAzMTcgNTUzUTMxNyA0OTggMjU1IDQ3OVEzMjEgNDU2IDMyMSAzOTBaTTEyNSAxMlExMjYgMjQgMTMxIDM1VDE0OCA2MlExNTAgNjQgMTcwIDg4VDIxOSAxNDdUMjgzIDIyM1QzNDggMzAyUTM2MyAzMjEgMzgyIDM0NVQ0MjMgMzk2VDQ2OCA0NTFUNTEyIDUwN1E1NjIgNTY5IDYxNSA2MzhRNjE3IDY0MSA2MjYgNjQxVDY0NSA2MzVUNjYyIDYyMFQ2NzAgNTk0UTY2OSA1ODMgNjY1IDU3MVQ2NDcgNTQ0UTY0NSA1NDIgNjI1IDUxOFQ1NzUgNDU5VDUxMSAzODFUNDQ2IDMwMlE0MzEgMjgzIDQxMiAyNTlUMzcxIDIwN1QzMjcgMTUyVDI4MyA5NlEyMzQgMzMgMTgxIC0zNFExNzggLTM3IDE2OSAtMzZUMTUwIC0zMFQxMzMgLTE0VDEyNSAxMlpNNjc1IC01UTYyNCAtNSA2MjQgNTNWNzVINTIyUTQ5MSA3NSA0NzQgODlUNDU2IDEyNVYxNDFRNDU3IDE1NSA0NjEgMTY2VDQ3NSAxOTZMNTQ3IDMyOFE1NTQgMzQxIDU2MSAzNDlUNTgwIDM2MVQ2MDggMzY2VDY0OSAzNjhRNjk2IDM2OCA3MTUgMzUxVDczNSAyODZWMTY0SDczN1E3NjcgMTY0IDc3OSAxNTVUNzkxIDEyMlYxMTlRNzkxIDk0IDc3OSA4NVQ3MzcgNzVINzM1VjUzUTczNSAtNSA2ODIgLTVINjc1Wk01NTUgMTYySDYzMVYyOTVMNTU1IDE2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJGOyIgZ2x5cGgtbmFtZT0icXVlc3Rpb25kb3duIiBob3Jpei1hZHYteD0iNTIyIiBkPSJNMjkyIDY1NlEzNzQgNjU2IDM3NCA1NzVWNTU5UTM3NCA0NzggMjkyIDQ3OEgyNzBRMTg2IDQ3OCAxODYgNTU5VjU3NVExODYgNjU2IDI3MCA2NTZIMjkyWk0zNjAgNDM0UTM2MyAzOTIgMzU2IDM2MVQzMzUgMzA2VDMwMSAyNjdUMjU5IDI0MlEyMzQgMjMxIDIxNiAyMjFUMTk3IDE5MFExOTcgMTY3IDIxNSAxNTRUMjY2IDE0MFEyOTIgMTQwIDMxMiAxNDhUMzQ3IDE3MVQzNjkgMjA0VDM4MSAyNDFRMzgxIDI0MSAzOTAgMjQyVDQxNCAyNDFUNDQ0IDIzNVQ0NzUgMjIwVDQ5OCAxOTRUNTA4IDE1MlE1MDggMTIwIDQ5MiA5MFQ0NDUgMzdUMzY4IDFUMjYzIC0xM1ExNDYgLTEzIDgxIDM4VDE2IDE3N1ExNiAyMTIgMjUgMjM3VDQ5IDI3OVQ4MyAzMDlUMTIxIDMzMVExMzYgMzM5IDE1MCAzNDdUMTc3IDM2NlQxOTkgMzk0VDIxMSA0MzRIMzYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzA7IiBnbHlwaC1uYW1lPSJBZ3JhdmUiIGhvcml6LWFkdi14PSI2ODgiIGQ9Ik00NDUgMTM0SDIzNkwxODUgMEgtMTVMMjE2IDU5N1EyMjAgNjA5IDIyNyA2MTlUMjQ5IDYzNlQyODYgNjQ4VDM0MyA2NTJRMzc3IDY1MiAzOTkgNjQ4VDQzNSA2MzdUNDU2IDYxOVQ0NjcgNTk3TDcwOCAwSDQ5OUw0NDUgMTM0Wk0yNzAgMjc4SDQwOUwzMzkgNDY2TDI3MCAyNzhaTTIyNyA3MzJRMjAwIDc0NyAxODUgNzczVDE2OSA4MjVRMTY5IDg1NyAxOTQgODc4VDI1NiA4OTlRMjgyIDg5OSAzMDkgODgzUTMzNCA4NjggMzU1IDg0NFQzOTIgNzk0VDQxNCA3NDlUNDE4IDcyMlE0MTQgNzE2IDM5NiA3MTBUMzUxIDcwM1QyOTIgNzA4VDIyNyA3MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMTsiIGdseXBoLW5hbWU9IkFhY3V0ZSIgaG9yaXotYWR2LXg9IjY4OCIgZD0iTTQ0NSAxMzRIMjM2TDE4NSAwSC0xNUwyMTYgNTk3UTIyMCA2MDkgMjI3IDYxOVQyNDkgNjM2VDI4NiA2NDhUMzQzIDY1MlEzNzcgNjUyIDM5OSA2NDhUNDM1IDYzN1Q0NTYgNjE5VDQ2NyA1OTdMNzA4IDBINDk5TDQ0NSAxMzRaTTI3MCAyNzhINDA5TDMzOSA0NjZMMjcwIDI3OFpNMjY1IDcyMlEyNjIgNzI4IDI2OSA3NDhUMjkxIDc5NFQzMjcgODQzVDM3NCA4ODNRNDAxIDg5OSA0MjcgODk5UTQ2MyA4OTkgNDg4IDg3OFQ1MTMgODI1UTUxMyA3OTkgNDk4IDc3M1Q0NTYgNzMyUTQyNCA3MTQgMzkyIDcwOFQzMzIgNzAzVDI4NyA3MTBUMjY1IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgZ2x5cGgtbmFtZT0iQWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2ODgiIGQ9Ik00NDUgMTM0SDIzNkwxODUgMEgtMTVMMjE2IDU5N1EyMjAgNjA5IDIyNyA2MTlUMjQ5IDYzNlQyODYgNjQ4VDM0MyA2NTJRMzc3IDY1MiAzOTkgNjQ4VDQzNSA2MzdUNDU2IDYxOVQ0NjcgNTk3TDcwOCAwSDQ5OUw0NDUgMTM0Wk0yNzAgMjc4SDQwOUwzMzkgNDY2TDI3MCAyNzhaTTQ0NyA2OTZRNDE2IDY5NiAzODkgNzIwVDM0MyA3ODhRMzIzIDc0NSAyOTYgNzIxVDIzOSA2OTZRMjExIDY5NiAxOTUgNzEyVDE3OCA3NTRRMTc4IDc4MCAxOTUgODA1VDIzNyA4NTFUMjkxIDg4N1QzNDMgOTA5UTM2NiA5MDMgMzk1IDg4OFQ0NDkgODUxVDQ5MSA4MDVUNTA4IDc1NFE1MDggNzI5IDQ5MiA3MTNUNDQ3IDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMzOyIgZ2x5cGgtbmFtZT0iQXRpbGRlIiBob3Jpei1hZHYteD0iNjg4IiBkPSJNNDQ1IDEzNEgyMzZMMTg1IDBILTE1TDIxNiA1OTdRMjIwIDYwOSAyMjcgNjE5VDI0OSA2MzZUMjg2IDY0OFQzNDMgNjUyUTM3NyA2NTIgMzk5IDY0OFQ0MzUgNjM3VDQ1NiA2MTlUNDY3IDU5N0w3MDggMEg0OTlMNDQ1IDEzNFpNMjcwIDI3OEg0MDlMMzM5IDQ2NkwyNzAgMjc4Wk00MjEgNjk2UTM4OSA2OTYgMzY1IDcwNVQzMjAgNzMxUTMxMiA3MzkgMzA1IDc0NFQyOTMgNzUwUTI4NSA3NTAgMjgwIDczOVQyNjggNzE4UTI1MiA2OTcgMjI1IDY5N1ExOTkgNjk3IDE4MiA3MTRUMTY0IDc1NlExNjQgODExIDE5NSA4NDFUMjcwIDg3MVEyOTggODcxIDMyMCA4NjRUMzYxIDg0MlEzNzIgODM0IDM4MSA4MjZUMzk4IDgxN1E0MDYgODE3IDQxMCA4MjdUNDIxIDg0N1E0MzcgODY5IDQ2NSA4NjlRNDkyIDg2OSA1MDggODUyVDUyNyA4MTBRNTI3IDc1NSA0OTYgNzI2VDQyMSA2OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNDsiIGdseXBoLW5hbWU9IkFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjY4OCIgZD0iTTQ0NSAxMzRIMjM2TDE4NSAwSC0xNUwyMTYgNTk3UTIyMCA2MDkgMjI3IDYxOVQyNDkgNjM2VDI4NiA2NDhUMzQzIDY1MlEzNzcgNjUyIDM5OSA2NDhUNDM1IDYzN1Q0NTYgNjE5VDQ2NyA1OTdMNzA4IDBINDk5TDQ0NSAxMzRaTTI3MCAyNzhINDA5TDMzOSA0NjZMMjcwIDI3OFpNNDUzIDY5NlE0MTEgNjk2IDM4NyA3MThUMzYzIDc4NFEzNjMgODI2IDM4NiA4NDlUNDUwIDg3MlE0OTEgODcyIDUxNSA4NDlUNTM5IDc4NFE1MzkgNzQyIDUxNSA3MTlUNDUzIDY5NlpNMjI3IDY5NlExODUgNjk2IDE2MSA3MThUMTM3IDc4NFExMzcgODI2IDE2MSA4NDlUMjIzIDg3MlEyNjUgODcyIDI4OSA4NDlUMzE0IDc4NFEzMTQgNzQyIDI5MCA3MTlUMjI3IDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM1OyIgZ2x5cGgtbmFtZT0iQXJpbmciIGhvcml6LWFkdi14PSI2ODgiIGQ9Ik00NzUgNzI0UTQ3NSA2OTQgNDYzIDY3MFQ0MjggNjMxUTQ1OCA2MTggNDY3IDU5N0w3MDggMEg0OTlMNDQ1IDEzNEgyMzZMMTg1IDBILTE1TDIxNiA1OTdRMjI1IDYxOSAyNTcgNjMyUTIxMyA2NjMgMjEzIDcyNFEyMTMgNzUxIDIyMyA3NzRUMjUwIDgxNFQyOTIgODQwVDM0NSA4NTBRMzczIDg1MCAzOTcgODQxVDQzOCA4MTVUNDY1IDc3NVQ0NzUgNzI0Wk0zNDQgNjc2UTM2MyA2NzYgMzc2IDY5MFQzOTAgNzI0UTM5MCA3NDUgMzc3IDc1OVQzNDQgNzczUTMyNCA3NzMgMzExIDc1OVQyOTggNzI0UTI5OCA3MDQgMzExIDY5MFQzNDQgNjc2Wk0yNzAgMjc4SDQwOUwzNDAgNDY2TDI3MCAyNzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNjsiIGdseXBoLW5hbWU9IkFFIiBob3Jpei1hZHYteD0iODk1IiBkPSJNNDQ1IDEzNEgyMzZMMjE4IDg0UTE5OSAzMSAxNzAgMTFUMTEwIC05UTg4IC05IDY4IC0yVDM0IDE1VDExIDM1VDYgNTNMMjEwIDU4M1EyMTUgNTk4IDIyMyA2MTBUMjQ3IDYzMFQyODQgNjQyVDM0MCA2NDdIODU3VjQ3NUg1MDlMNTM0IDQwOEg3NzJWMjQ4SDYwMUw2MzEgMTcwSDg1OVYwSDU5OFE1NzIgMCA1NTIgM1Q1MTUgMTZUNDg2IDQzVDQ2MiA4OUw0NDUgMTM0Wk0yNzAgMjc4SDQwOUwzMzkgNDY2TDI3MCAyNzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNzsiIGdseXBoLW5hbWU9IkNjZWRpbGxhIiBob3Jpei1hZHYteD0iNjUwIiBkPSJNMzY4IC0xNFEyOTIgLTE0IDIzMCAxMVQxMjMgODFUNTQgMTg4VDI5IDMyNFEyOSAzOTcgNTMgNDU5VDEyMyA1NjZUMjMwIDYzNlQzNjkgNjYxUTQzOCA2NjEgNDg2IDY0NVQ1NjQgNjA1VDYwOSA1NTRUNjIzIDUwM1E2MjMgNDcxIDYwNiA0NTFUNTY3IDQyMFQ1MjcgNDA2VDUwOCA0MDVRNDg5IDQ0MCA0NTYgNDU5VDM4MCA0NzhRMzQ5IDQ3OCAzMjMgNDY3VDI3NyA0MzZUMjQ2IDM4OFQyMzUgMzI0UTIzNSAyODkgMjQ2IDI2MVQyNzYgMjEyVDMyMiAxODBUMzgwIDE2OVE0MjcgMTY5IDQ2MCAxODlUNTEwIDI0N1E1MTEgMjQ5IDUyOSAyNDZUNTY5IDIzMlQ2MDggMjAxVDYyNiAxNDlRNjI2IDEyNSA2MTIgOTdUNTY3IDQ0VDQ4NyAzVDM2OCAtMTRaTTMzNCAtMjIxUTMyMCAtMjMwIDMwMiAtMjMxVDI2OCAtMjI5VDI0MyAtMjE2VDIzOCAtMTkzTDI3MiAtOTZRMjc2IC04MyAyODIgLTczVDI5NyAtNTZUMzIxIC00NlQzNTkgLTQzSDM3OVE0MTUgLTQzIDQzNSAtNTZUNDU1IC05NVYtMTAwUTQ1NSAtMTE3IDQ0NCAtMTMxVDQwOSAtMTYyTDMzNCAtMjIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzg7IiBnbHlwaC1uYW1lPSJFZ3JhdmUiIGhvcml6LWFkdi14PSI2MTYiIGQ9Ik00NiAwVjUzNlE0NiA1OTAgNzIgNjE4VDE0OCA2NDdINTgxVjQ3NUgyNDZWNDA4SDQ5NlYyNDhIMjQ2VjE3MEg1ODJWMEg0NlpNMjI3IDczMlEyMDAgNzQ3IDE4NSA3NzNUMTY5IDgyNVExNjkgODU3IDE5NCA4NzhUMjU2IDg5OVEyODIgODk5IDMwOSA4ODNRMzM0IDg2OCAzNTUgODQ0VDM5MiA3OTRUNDE0IDc0OVQ0MTggNzIyUTQxNCA3MTYgMzk2IDcxMFQzNTEgNzAzVDI5MiA3MDhUMjI3IDczMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM5OyIgZ2x5cGgtbmFtZT0iRWFjdXRlIiBob3Jpei1hZHYteD0iNjE2IiBkPSJNNDYgMFY1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDU4MVY0NzVIMjQ2VjQwOEg0OTZWMjQ4SDI0NlYxNzBINTgyVjBINDZaTTIyMSA3MjJRMjE4IDcyOCAyMjUgNzQ4VDI0NyA3OTRUMjgzIDg0M1QzMzAgODgzUTM1NyA4OTkgMzgzIDg5OVE0MTkgODk5IDQ0NCA4NzhUNDY5IDgyNVE0NjkgNzk5IDQ1NCA3NzNUNDEyIDczMlEzODAgNzE0IDM0OCA3MDhUMjg4IDcwM1QyNDMgNzEwVDIyMSA3MjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQTsiIGdseXBoLW5hbWU9IkVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjE2IiBkPSJNNDYgMFY1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDU4MVY0NzVIMjQ2VjQwOEg0OTZWMjQ4SDI0NlYxNzBINTgyVjBINDZaTTQyNSA2OTZRMzk0IDY5NiAzNjcgNzIwVDMyMSA3ODhRMzAxIDc0NSAyNzQgNzIxVDIxNyA2OTZRMTg5IDY5NiAxNzMgNzEyVDE1NiA3NTRRMTU2IDc4MCAxNzMgODA1VDIxNSA4NTFUMjY5IDg4N1QzMjEgOTA5UTM0NCA5MDMgMzczIDg4OFQ0MjcgODUxVDQ2OSA4MDVUNDg2IDc1NFE0ODYgNzI5IDQ3MCA3MTNUNDI1IDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgZ2x5cGgtbmFtZT0iRWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjE2IiBkPSJNNDYgMFY1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDU4MVY0NzVIMjQ2VjQwOEg0OTZWMjQ4SDI0NlYxNzBINTgyVjBINDZaTTQzNiA2OTZRMzk0IDY5NiAzNzAgNzE4VDM0NiA3ODRRMzQ2IDgyNiAzNjkgODQ5VDQzMyA4NzJRNDc0IDg3MiA0OTggODQ5VDUyMiA3ODRRNTIyIDc0MiA0OTggNzE5VDQzNiA2OTZaTTIxMCA2OTZRMTY4IDY5NiAxNDQgNzE4VDEyMCA3ODRRMTIwIDgyNiAxNDQgODQ5VDIwNiA4NzJRMjQ4IDg3MiAyNzIgODQ5VDI5NyA3ODRRMjk3IDc0MiAyNzMgNzE5VDIxMCA2OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQzsiIGdseXBoLW5hbWU9IklncmF2ZSIgaG9yaXotYWR2LXg9IjMwNiIgZD0iTTUzIDU2NlE1MyA2MDkgNzYgNjMwVDEzNyA2NTFIMTY2UTIwNSA2NTEgMjI5IDYzMFQyNTMgNTY2VjBINTNWNTY2Wk01MSA3MzJRMjQgNzQ3IDkgNzczVC03IDgyNVEtNyA4NTcgMTggODc4VDgwIDg5OVExMDYgODk5IDEzMyA4ODNRMTU4IDg2OCAxNzkgODQ0VDIxNiA3OTRUMjM4IDc0OVQyNDIgNzIyUTIzOCA3MTYgMjIwIDcxMFQxNzUgNzAzVDExNiA3MDhUNTEgNzMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Q7IiBnbHlwaC1uYW1lPSJJYWN1dGUiIGhvcml6LWFkdi14PSIzMDYiIGQ9Ik01MyA1NjZRNTMgNjA5IDc2IDYzMFQxMzcgNjUxSDE2NlEyMDUgNjUxIDIyOSA2MzBUMjUzIDU2NlYwSDUzVjU2NlpNNTcgNzIyUTU0IDcyOCA2MSA3NDhUODMgNzk0VDExOSA4NDNUMTY2IDg4M1ExOTMgODk5IDIxOSA4OTlRMjU1IDg5OSAyODAgODc4VDMwNSA4MjVRMzA1IDc5OSAyOTAgNzczVDI0OCA3MzJRMjE2IDcxNCAxODQgNzA4VDEyNCA3MDNUNzkgNzEwVDU3IDcyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENFOyIgZ2x5cGgtbmFtZT0iSWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIzMDYiIGQ9Ik01MyA1NjZRNTMgNjA5IDc2IDYzMFQxMzcgNjUxSDE2NlEyMDUgNjUxIDIyOSA2MzBUMjUzIDU2NlYwSDUzVjU2NlpNMjU0IDY5NlEyMjMgNjk2IDE5NiA3MjBUMTUwIDc4OFExMzAgNzQ1IDEwMyA3MjFUNDYgNjk2UTE4IDY5NiAyIDcxMlQtMTUgNzU0US0xNSA3ODAgMiA4MDVUNDQgODUxVDk4IDg4N1QxNTAgOTA5UTE3MyA5MDMgMjAyIDg4OFQyNTYgODUxVDI5OCA4MDVUMzE1IDc1NFEzMTUgNzI5IDI5OSA3MTNUMjU0IDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENGOyIgZ2x5cGgtbmFtZT0iSWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMzA2IiBkPSJNNTMgNTY2UTUzIDYwOSA3NiA2MzBUMTM3IDY1MUgxNjZRMjA1IDY1MSAyMjkgNjMwVDI1MyA1NjZWMEg1M1Y1NjZaTTI2NSA2OTZRMjIzIDY5NiAxOTkgNzE4VDE3NSA3ODRRMTc1IDgyNiAxOTggODQ5VDI2MiA4NzJRMzAzIDg3MiAzMjcgODQ5VDM1MSA3ODRRMzUxIDc0MiAzMjcgNzE5VDI2NSA2OTZaTTM5IDY5NlEtMyA2OTYgLTI3IDcxOFQtNTEgNzg0US01MSA4MjYgLTI3IDg0OVQzNSA4NzJRNzcgODcyIDEwMSA4NDlUMTI2IDc4NFExMjYgNzQyIDEwMiA3MTlUMzkgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDA7IiBnbHlwaC1uYW1lPSJFdGgiIGhvcml6LWFkdi14PSI3MzEiIGQ9Ik02NyAyNTdRMzUgMjU3IDE5IDI3NVQzIDMxN1YzMzNRMyAzNTYgMTkgMzc0VDY3IDM5Mkg4NFY1MzZRODQgNTkwIDExMyA2MThUMTg4IDY0N0gzNjFRNDQwIDY0NyA1MDQgNjI1VDYxMyA1NjFUNjgyIDQ2MFQ3MDYgMzI3UTcwNiAyNTIgNjgyIDE5MlQ2MTIgODlUNTAyIDIzVDM1NyAwSDE5NlExNzMgMCAxNTMgOFQxMTcgMzJUOTMgNjdUODQgMTEwVjI1N0g2N1pNMzUzIDE3MVE0MjQgMTcxIDQ2NiAyMTFUNTA5IDMyNlE1MDkgMzk5IDQ2OCA0MzdUMzU2IDQ3NkgyODNWMzkySDM0OVEzODIgMzkyIDM5NyAzNzRUNDEyIDMzM1YzMTdRNDEyIDI5MyAzOTcgMjc1VDM0OSAyNTdIMjgzVjE3MUgzNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMTsiIGdseXBoLW5hbWU9Ik50aWxkZSIgaG9yaXotYWR2LXg9IjcwMyIgZD0iTTQ2IDU1OVE0NiA2MDYgNjggNjI5VDEyOCA2NTJIMTQ3UTE2NSA2NTIgMTc3IDY1MFQxOTkgNjQxVDIxNyA2MjZUMjM3IDYwNUw0NjkgMzAzVjY0N0g2NTdWODhRNjU3IDQxIDYzNiAxOFQ1NzYgLTVINTYwUTU0MiAtNSA1MzAgLTNUNTA4IDVUNDkwIDE4VDQ3MSAzOUwyMzQgMzQ2VjBINDZWNTU5Wk00MjcgNjk2UTM5NSA2OTYgMzcxIDcwNVQzMjYgNzMxUTMxOCA3MzkgMzExIDc0NFQyOTkgNzUwUTI5MSA3NTAgMjg2IDczOVQyNzQgNzE4UTI1OCA2OTcgMjMxIDY5N1EyMDUgNjk3IDE4OCA3MTRUMTcwIDc1NlExNzAgODExIDIwMSA4NDFUMjc2IDg3MVEzMDQgODcxIDMyNiA4NjRUMzY3IDg0MlEzNzggODM0IDM4NyA4MjZUNDA0IDgxN1E0MTIgODE3IDQxNiA4MjdUNDI3IDg0N1E0NDMgODY5IDQ3MSA4NjlRNDk4IDg2OSA1MTQgODUyVDUzMyA4MTBRNTMzIDc1NSA1MDIgNzI2VDQyNyA2OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMjsiIGdseXBoLW5hbWU9Ik9ncmF2ZSIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTM2NyAtMTRRMjkyIC0xNCAyMjkgMTFUMTIxIDgxVDUxIDE4OFQyNSAzMjRRMjUgMzk3IDUwIDQ1OVQxMjEgNTY2VDIyOSA2MzZUMzY3IDY2MVE0NDIgNjYxIDUwNCA2MzZUNjEyIDU2N1Q2ODIgNDYwVDcwOCAzMjRRNzA4IDI1MCA2ODMgMTg4VDYxMiA4MVQ1MDUgMTFUMzY3IC0xNFpNMzY3IDE2NVE0MzIgMTY1IDQ3MSAyMDhUNTEwIDMyNFE1MTAgMzk2IDQ3MSA0NDBUMzY3IDQ4NFEzMDEgNDg0IDI2MiA0NDFUMjIzIDMyNFEyMjMgMjUyIDI2MiAyMDlUMzY3IDE2NVpNMjUzIDczMlEyMjYgNzQ3IDIxMSA3NzNUMTk1IDgyNVExOTUgODU3IDIyMCA4NzhUMjgyIDg5OVEzMDggODk5IDMzNSA4ODNRMzYwIDg2OCAzODEgODQ0VDQxOCA3OTRUNDQwIDc0OVQ0NDQgNzIyUTQ0MCA3MTYgNDIyIDcxMFQzNzcgNzAzVDMxOCA3MDhUMjUzIDczMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQzOyIgZ2x5cGgtbmFtZT0iT2FjdXRlIiBob3Jpei1hZHYteD0iNzMzIiBkPSJNMzY3IC0xNFEyOTIgLTE0IDIyOSAxMVQxMjEgODFUNTEgMTg4VDI1IDMyNFEyNSAzOTcgNTAgNDU5VDEyMSA1NjZUMjI5IDYzNlQzNjcgNjYxUTQ0MiA2NjEgNTA0IDYzNlQ2MTIgNTY3VDY4MiA0NjBUNzA4IDMyNFE3MDggMjUwIDY4MyAxODhUNjEyIDgxVDUwNSAxMVQzNjcgLTE0Wk0zNjcgMTY1UTQzMiAxNjUgNDcxIDIwOFQ1MTAgMzI0UTUxMCAzOTYgNDcxIDQ0MFQzNjcgNDg0UTMwMSA0ODQgMjYyIDQ0MVQyMjMgMzI0UTIyMyAyNTIgMjYyIDIwOVQzNjcgMTY1Wk0yNzQgNzIyUTI3MSA3MjggMjc4IDc0OFQzMDAgNzk0VDMzNiA4NDNUMzgzIDg4M1E0MTAgODk5IDQzNiA4OTlRNDcyIDg5OSA0OTcgODc4VDUyMiA4MjVRNTIyIDc5OSA1MDcgNzczVDQ2NSA3MzJRNDMzIDcxNCA0MDEgNzA4VDM0MSA3MDNUMjk2IDcxMFQyNzQgNzIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDQ7IiBnbHlwaC1uYW1lPSJPY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTM2NyAtMTRRMjkyIC0xNCAyMjkgMTFUMTIxIDgxVDUxIDE4OFQyNSAzMjRRMjUgMzk3IDUwIDQ1OVQxMjEgNTY2VDIyOSA2MzZUMzY3IDY2MVE0NDIgNjYxIDUwNCA2MzZUNjEyIDU2N1Q2ODIgNDYwVDcwOCAzMjRRNzA4IDI1MCA2ODMgMTg4VDYxMiA4MVQ1MDUgMTFUMzY3IC0xNFpNMzY3IDE2NVE0MzIgMTY1IDQ3MSAyMDhUNTEwIDMyNFE1MTAgMzk2IDQ3MSA0NDBUMzY3IDQ4NFEzMDEgNDg0IDI2MiA0NDFUMjIzIDMyNFEyMjMgMjUyIDI2MiAyMDlUMzY3IDE2NVpNNDcxIDY5NlE0NDAgNjk2IDQxMyA3MjBUMzY3IDc4OFEzNDcgNzQ1IDMyMCA3MjFUMjYzIDY5NlEyMzUgNjk2IDIxOSA3MTJUMjAyIDc1NFEyMDIgNzgwIDIxOSA4MDVUMjYxIDg1MVQzMTUgODg3VDM2NyA5MDlRMzkwIDkwMyA0MTkgODg4VDQ3MyA4NTFUNTE1IDgwNVQ1MzIgNzU0UTUzMiA3MjkgNTE2IDcxM1Q0NzEgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBnbHlwaC1uYW1lPSJPdGlsZGUiIGhvcml6LWFkdi14PSI3MzMiIGQ9Ik0zNjcgLTE0UTI5MiAtMTQgMjI5IDExVDEyMSA4MVQ1MSAxODhUMjUgMzI0UTI1IDM5NyA1MCA0NTlUMTIxIDU2NlQyMjkgNjM2VDM2NyA2NjFRNDQyIDY2MSA1MDQgNjM2VDYxMiA1NjdUNjgyIDQ2MFQ3MDggMzI0UTcwOCAyNTAgNjgzIDE4OFQ2MTIgODFUNTA1IDExVDM2NyAtMTRaTTM2NyAxNjVRNDMyIDE2NSA0NzEgMjA4VDUxMCAzMjRRNTEwIDM5NiA0NzEgNDQwVDM2NyA0ODRRMzAxIDQ4NCAyNjIgNDQxVDIyMyAzMjRRMjIzIDI1MiAyNjIgMjA5VDM2NyAxNjVaTTQ0MyA2OTZRNDExIDY5NiAzODcgNzA1VDM0MiA3MzFRMzM0IDczOSAzMjcgNzQ0VDMxNSA3NTBRMzA3IDc1MCAzMDIgNzM5VDI5MCA3MThRMjc0IDY5NyAyNDcgNjk3UTIyMSA2OTcgMjA0IDcxNFQxODYgNzU2UTE4NiA4MTEgMjE3IDg0MVQyOTIgODcxUTMyMCA4NzEgMzQyIDg2NFQzODMgODQyUTM5NCA4MzQgNDAzIDgyNlQ0MjAgODE3UTQyOCA4MTcgNDMyIDgyN1Q0NDMgODQ3UTQ1OSA4NjkgNDg3IDg2OVE1MTQgODY5IDUzMCA4NTJUNTQ5IDgxMFE1NDkgNzU1IDUxOCA3MjZUNDQzIDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ2OyIgZ2x5cGgtbmFtZT0iT2RpZXJlc2lzIiBob3Jpei1hZHYteD0iNzMzIiBkPSJNMzY3IC0xNFEyOTIgLTE0IDIyOSAxMVQxMjEgODFUNTEgMTg4VDI1IDMyNFEyNSAzOTcgNTAgNDU5VDEyMSA1NjZUMjI5IDYzNlQzNjcgNjYxUTQ0MiA2NjEgNTA0IDYzNlQ2MTIgNTY3VDY4MiA0NjBUNzA4IDMyNFE3MDggMjUwIDY4MyAxODhUNjEyIDgxVDUwNSAxMVQzNjcgLTE0Wk0zNjcgMTY1UTQzMiAxNjUgNDcxIDIwOFQ1MTAgMzI0UTUxMCAzOTYgNDcxIDQ0MFQzNjcgNDg0UTMwMSA0ODQgMjYyIDQ0MVQyMjMgMzI0UTIyMyAyNTIgMjYyIDIwOVQzNjcgMTY1Wk00ODIgNjk2UTQ0MCA2OTYgNDE2IDcxOFQzOTIgNzg0UTM5MiA4MjYgNDE1IDg0OVQ0NzkgODcyUTUyMCA4NzIgNTQ0IDg0OVQ1NjggNzg0UTU2OCA3NDIgNTQ0IDcxOVQ0ODIgNjk2Wk0yNTYgNjk2UTIxNCA2OTYgMTkwIDcxOFQxNjYgNzg0UTE2NiA4MjYgMTkwIDg0OVQyNTIgODcyUTI5NCA4NzIgMzE4IDg0OVQzNDMgNzg0UTM0MyA3NDIgMzE5IDcxOVQyNTYgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDc7IiBnbHlwaC1uYW1lPSJtdWx0aXBseSIgaG9yaXotYWR2LXg9IjU2NSIgZD0iTTc1IDUzUTU1IDczIDU0IDk5VDgyIDE1M0wxODUgMjUyTDgyIDM1MVE1MyAzNzcgNTQgNDAzVDc0IDQ1MEw4NSA0NjJRMTA1IDQ4MyAxMzEgNDgzVDE4NSA0NTNMMjgzIDM1MEwzODAgNDUzUTQwNyA0ODIgNDM0IDQ4MlQ0ODEgNDYyTDQ5MSA0NTBRNTEwIDQzMCA1MTEgNDA0VDQ4MyAzNTFMMzgxIDI1Mkw0ODMgMTUzUTUxMiAxMjYgNTEyIDEwMFQ0OTEgNTNMNDc5IDQxUTQ2MSAyMyA0MzQgMjJUMzgwIDUwTDI4MyAxNTNMMTg1IDUwUTE1OCAyMSAxMzIgMjJUODYgNDFMNzUgNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEODsiIGdseXBoLW5hbWU9Ik9zbGFzaCIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTExMCAtNDRRMTA3IC00NyA5NSAtNDVUNjkgLTM1VDQ0IC0xNVQzMyAxNFEzMyAyNCAzOCAzNVQ1NiA2MUw5OCAxMDhRNjQgMTUxIDQ2IDIwNVQyNyAzMjRRMjcgMzk3IDUyIDQ1OFQxMjIgNTY1VDIzMSA2MzVUMzY5IDY2MVE0MjIgNjYxIDQ2OCA2NDhUNTUzIDYxMkw2MjEgNjg2UTYyNCA2ODkgNjM2IDY4N1Q2NjEgNjc3VDY4NiA2NTdUNjk3IDYyOFE2OTcgNjE4IDY5MiA2MDdUNjc1IDU4MUw2MzcgNTM5UTY3MiA0OTYgNjkwIDQ0MlQ3MDkgMzI0UTcwOSAyNTEgNjg0IDE4OVQ2MTQgODJUNTA2IDEyVDM2OCAtMTRRMzE0IC0xNCAyNjggLTFUMTgxIDM1TDExMCAtNDRaTTIxMCAzMjRRMjEwIDI4MSAyMjQgMjQ3TDQzNCA0ODBRNDAzIDQ5MyAzNjggNDkzUTI5NCA0OTMgMjUyIDQ0N1QyMTAgMzI0Wk0zNjkgMTU2UTQwNCAxNTYgNDMzIDE2OFQ0ODMgMjAzVDUxNSAyNTZUNTI3IDMyNFE1MjcgMzY2IDUxMiA0MDFMMzAyIDE2OVEzMzEgMTU2IDM2OSAxNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGdseXBoLW5hbWU9IlVncmF2ZSIgaG9yaXotYWR2LXg9IjY3OSIgZD0iTTMzOSAtMTFRNDMgLTExIDQzIDI4NFY1NTlRNDMgNjA2IDY2IDYyOVQxMzEgNjUySDE1NlEyNDQgNjUyIDI0NCA1NTlWMjgzUTI0NCAxNjMgMzQwIDE2M1EzODkgMTYzIDQxMiAxOTJUNDM1IDI4NFY1NTlRNDM1IDYwNyA0NTggNjI5VDUyMyA2NTJINTQ5UTYzNiA2NTIgNjM2IDU1OVYyODRRNjM2IDEzNyA1NjIgNjNUMzM5IC0xMVpNMjI3IDcyOVEyMDAgNzQ0IDE4NSA3NzBUMTY5IDgyMlExNjkgODU0IDE5NCA4NzVUMjU2IDg5NlEyODIgODk2IDMwOSA4ODBRMzM0IDg2NSAzNTUgODQxVDM5MiA3OTFUNDE0IDc0NlQ0MTggNzE5UTQxNCA3MTMgMzk2IDcwN1QzNTEgNzAwVDI5MiA3MDVUMjI3IDcyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERBOyIgZ2x5cGgtbmFtZT0iVWFjdXRlIiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzM5IC0xMVE0MyAtMTEgNDMgMjg0VjU1OVE0MyA2MDYgNjYgNjI5VDEzMSA2NTJIMTU2UTI0NCA2NTIgMjQ0IDU1OVYyODNRMjQ0IDE2MyAzNDAgMTYzUTM4OSAxNjMgNDEyIDE5MlQ0MzUgMjg0VjU1OVE0MzUgNjA3IDQ1OCA2MjlUNTIzIDY1Mkg1NDlRNjM2IDY1MiA2MzYgNTU5VjI4NFE2MzYgMTM3IDU2MiA2M1QzMzkgLTExWk0yNjEgNzE5UTI1OCA3MjUgMjY1IDc0NVQyODcgNzkxVDMyMyA4NDBUMzcwIDg4MFEzOTcgODk2IDQyMyA4OTZRNDU5IDg5NiA0ODQgODc1VDUwOSA4MjJRNTA5IDc5NiA0OTQgNzcwVDQ1MiA3MjlRNDIwIDcxMSAzODggNzA1VDMyOCA3MDBUMjgzIDcwN1QyNjEgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REI7IiBnbHlwaC1uYW1lPSJVY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjY3OSIgZD0iTTMzOSAtMTFRNDMgLTExIDQzIDI4NFY1NTlRNDMgNjA2IDY2IDYyOVQxMzEgNjUySDE1NlEyNDQgNjUyIDI0NCA1NTlWMjgzUTI0NCAxNjMgMzQwIDE2M1EzODkgMTYzIDQxMiAxOTJUNDM1IDI4NFY1NTlRNDM1IDYwNyA0NTggNjI5VDUyMyA2NTJINTQ5UTYzNiA2NTIgNjM2IDU1OVYyODRRNjM2IDEzNyA1NjIgNjNUMzM5IC0xMVpNNDQzIDY5NlE0MTIgNjk2IDM4NSA3MjBUMzM5IDc4OFEzMTkgNzQ1IDI5MiA3MjFUMjM1IDY5NlEyMDcgNjk2IDE5MSA3MTJUMTc0IDc1NFExNzQgNzgwIDE5MSA4MDVUMjMzIDg1MVQyODcgODg3VDMzOSA5MDlRMzYyIDkwMyAzOTEgODg4VDQ0NSA4NTFUNDg3IDgwNVQ1MDQgNzU0UTUwNCA3MjkgNDg4IDcxM1Q0NDMgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REM7IiBnbHlwaC1uYW1lPSJVZGllcmVzaXMiIGhvcml6LWFkdi14PSI2NzkiIGQ9Ik0zMzkgLTExUTQzIC0xMSA0MyAyODRWNTU5UTQzIDYwNiA2NiA2MjlUMTMxIDY1MkgxNTZRMjQ0IDY1MiAyNDQgNTU5VjI4M1EyNDQgMTYzIDM0MCAxNjNRMzg5IDE2MyA0MTIgMTkyVDQzNSAyODRWNTU5UTQzNSA2MDcgNDU4IDYyOVQ1MjMgNjUySDU0OVE2MzYgNjUyIDYzNiA1NTlWMjg0UTYzNiAxMzcgNTYyIDYzVDMzOSAtMTFaTTQ1NCA2OTZRNDEyIDY5NiAzODggNzE4VDM2NCA3ODRRMzY0IDgyNiAzODcgODQ5VDQ1MSA4NzJRNDkyIDg3MiA1MTYgODQ5VDU0MCA3ODRRNTQwIDc0MiA1MTYgNzE5VDQ1NCA2OTZaTTIyOCA2OTZRMTg2IDY5NiAxNjIgNzE4VDEzOCA3ODRRMTM4IDgyNiAxNjIgODQ5VDIyNCA4NzJRMjY2IDg3MiAyOTAgODQ5VDMxNSA3ODRRMzE1IDc0MiAyOTEgNzE5VDIyOCA2OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERDsiIGdseXBoLW5hbWU9IllhY3V0ZSIgaG9yaXotYWR2LXg9IjYzOSIgZD0iTTIyMSAyNjlMLTE2IDY0N0gyMDNMMzI3IDQzMEw0MTQgNTgxUTQzNyA2MTkgNDYwIDYzNVQ1MDkgNjUxUTU0MyA2NTEgNTY4IDY0MVQ2MDggNjE3VDYyOSA1OTFUNjMzIDU3NUw0MjEgMjUzVjBIMjIxVjI2OVpNMjM4IDcxOVEyMzUgNzI1IDI0MiA3NDVUMjY0IDc5MVQzMDAgODQwVDM0NyA4ODBRMzc0IDg5NiA0MDAgODk2UTQzNiA4OTYgNDYxIDg3NVQ0ODYgODIyUTQ4NiA3OTYgNDcxIDc3MFQ0MjkgNzI5UTM5NyA3MTEgMzY1IDcwNVQzMDUgNzAwVDI2MCA3MDdUMjM4IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgZ2x5cGgtbmFtZT0iVGhvcm4iIGhvcml6LWFkdi14PSI2MjMiIGQ9Ik0xMzAgLTVRNDYgLTUgNDYgODhWNTU5UTQ2IDY1MiAxMzAgNjUySDE1OVEyNDYgNjUyIDI0NiA1NTlWNTUxSDMxNVE0NTcgNTUxIDUyOSA0OTRUNjAxIDMyNFE2MDEgMTAxIDMyMSAxMDFIMjQ2Vjg4UTI0NiAtNSAxNTkgLTVIMTMwWk0yNDYgNDAwVjI0N0gzMTdRNDEwIDI0NyA0MTAgMzIzUTQxMCAzNjMgMzg4IDM4MVQzMTcgNDAwSDI0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERGOyIgZ2x5cGgtbmFtZT0iZ2VybWFuZGJscyIgaG9yaXotYWR2LXg9IjYyNSIgZD0iTTU3MyA1MzJRNTczIDQ3NSA1NDggNDQzVDQ3MCAzOTdRNTQwIDM2OSA1NzcgMzE2VDYxNCAxOTRRNjE0IDE0NyA2MDAgMTA5VDU1OSA0NFQ0OTcgMVQ0MTcgLTE0UTM0MSAtMTQgMzAzIDEyVDI2NSA4NVEyNjUgMTAwIDI3MSAxMTNUMjg0IDEzNlQyOTcgMTUyVDMwNSAxNTdRMzE2IDE0NyAzMzAgMTQwVDM3MCAxMzNRMzk2IDEzMyA0MTUgMTUwVDQzNCAxOTNRNDM0IDIyNSA0MTMgMjQ0VDM0NyAyNzhRMzMzIDI4MyAzMjEgMjg5VDMwMCAzMDZUMjg2IDMzMVQyODAgMzY3UTI4MCAzODMgMjg1IDM5NlQyOTYgNDE5VDMwNyA0MzRUMzEyIDQzOVEzNTAgNDM5IDM3MCA0NTVUMzkxIDUwNFEzOTEgNTM0IDM3MSA1NTFUMzE3IDU2OFEyMzYgNTY4IDIzNiA0NjZWMEg0NFY0NDdRNDQgNTg1IDEwOSA2NDZUMzIwIDcwOFE0NDEgNzA4IDUwNyA2NjFUNTczIDUzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUwOyIgZ2x5cGgtbmFtZT0iYWdyYXZlIiBob3Jpei1hZHYteD0iNTc0IiBkPSJNMTg2IC0xMFExNDggLTEwIDExOCAwVDY2IDMwVDMzIDc3VDIxIDEzNlEyMSAyMjEgOTMgMjYyVDMyNSAzMDRIMzQ0UTMzOCAzNzAgMjY3IDM3MFEyNDQgMzcwIDIyNyAzNjRUMTk5IDM0OVQxODAgMzI3VDE2NyAzMDRRMTY3IDMwMyAxNDcgMzAzVDEwMyAzMDhUNjAgMzMxVDQwIDM3OVE0MCA0MzcgOTcgNDcxVDI3OCA1MDZRNDEyIDUwNiA0NzMgNDU0VDUzNCAyOTVWMEgzNDVWNjFRMzE5IDI3IDI3OCA5VDE4NiAtMTBaTTI2MSAxMDdRMjk5IDEwNyAzMjIgMTMwVDM0NSAxOTJWMjA5SDMyMVEyNjMgMjA3IDIzMyAxOTVUMjAzIDE1M1EyMDMgMTMxIDIxOSAxMTlUMjYxIDEwN1pNMTg2IDU3N1ExNTkgNTkyIDE0NCA2MThUMTI4IDY3MFExMjggNzAyIDE1MyA3MjNUMjE1IDc0NFEyNDEgNzQ0IDI2OCA3MjhRMjkzIDcxMyAzMTQgNjg5VDM1MSA2MzlUMzczIDU5NFQzNzcgNTY3UTM3MyA1NjEgMzU1IDU1NVQzMTAgNTQ4VDI1MSA1NTNUMTg2IDU3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUxOyIgZ2x5cGgtbmFtZT0iYWFjdXRlIiBob3Jpei1hZHYteD0iNTc0IiBkPSJNMTg2IC0xMFExNDggLTEwIDExOCAwVDY2IDMwVDMzIDc3VDIxIDEzNlEyMSAyMjEgOTMgMjYyVDMyNSAzMDRIMzQ0UTMzOCAzNzAgMjY3IDM3MFEyNDQgMzcwIDIyNyAzNjRUMTk5IDM0OVQxODAgMzI3VDE2NyAzMDRRMTY3IDMwMyAxNDcgMzAzVDEwMyAzMDhUNjAgMzMxVDQwIDM3OVE0MCA0MzcgOTcgNDcxVDI3OCA1MDZRNDEyIDUwNiA0NzMgNDU0VDUzNCAyOTVWMEgzNDVWNjFRMzE5IDI3IDI3OCA5VDE4NiAtMTBaTTI2MSAxMDdRMjk5IDEwNyAzMjIgMTMwVDM0NSAxOTJWMjA5SDMyMVEyNjMgMjA3IDIzMyAxOTVUMjAzIDE1M1EyMDMgMTMxIDIxOSAxMTlUMjYxIDEwN1pNMTk3IDU2N1ExOTQgNTczIDIwMSA1OTNUMjIzIDYzOVQyNTkgNjg4VDMwNiA3MjhRMzMzIDc0NCAzNTkgNzQ0UTM5NSA3NDQgNDIwIDcyM1Q0NDUgNjcwUTQ0NSA2NDQgNDMwIDYxOFQzODggNTc3UTM1NiA1NTkgMzI0IDU1M1QyNjQgNTQ4VDIxOSA1NTVUMTk3IDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgZ2x5cGgtbmFtZT0iYWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik0xODYgLTEwUTE0OCAtMTAgMTE4IDBUNjYgMzBUMzMgNzdUMjEgMTM2UTIxIDIyMSA5MyAyNjJUMzI1IDMwNEgzNDRRMzM4IDM3MCAyNjcgMzcwUTI0NCAzNzAgMjI3IDM2NFQxOTkgMzQ5VDE4MCAzMjdUMTY3IDMwNFExNjcgMzAzIDE0NyAzMDNUMTAzIDMwOFQ2MCAzMzFUNDAgMzc5UTQwIDQzNyA5NyA0NzFUMjc4IDUwNlE0MTIgNTA2IDQ3MyA0NTRUNTM0IDI5NVYwSDM0NVY2MVEzMTkgMjcgMjc4IDlUMTg2IC0xMFpNMjYxIDEwN1EyOTkgMTA3IDMyMiAxMzBUMzQ1IDE5MlYyMDlIMzIxUTI2MyAyMDcgMjMzIDE5NVQyMDMgMTUzUTIwMyAxMzEgMjE5IDExOVQyNjEgMTA3Wk0zOTIgNTQxUTM2MSA1NDEgMzM0IDU2NVQyODggNjMzUTI2OCA1OTAgMjQxIDU2NlQxODQgNTQxUTE1NiA1NDEgMTQwIDU1N1QxMjMgNTk5UTEyMyA2MjUgMTQwIDY1MFQxODIgNjk2VDIzNiA3MzJUMjg4IDc1NFEzMTEgNzQ4IDM0MCA3MzNUMzk0IDY5NlQ0MzYgNjUwVDQ1MyA1OTlRNDUzIDU3NCA0MzcgNTU4VDM5MiA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMzsiIGdseXBoLW5hbWU9ImF0aWxkZSIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTE4NiAtMTBRMTQ4IC0xMCAxMTggMFQ2NiAzMFQzMyA3N1QyMSAxMzZRMjEgMjIxIDkzIDI2MlQzMjUgMzA0SDM0NFEzMzggMzcwIDI2NyAzNzBRMjQ0IDM3MCAyMjcgMzY0VDE5OSAzNDlUMTgwIDMyN1QxNjcgMzA0UTE2NyAzMDMgMTQ3IDMwM1QxMDMgMzA4VDYwIDMzMVQ0MCAzNzlRNDAgNDM3IDk3IDQ3MVQyNzggNTA2UTQxMiA1MDYgNDczIDQ1NFQ1MzQgMjk1VjBIMzQ1VjYxUTMxOSAyNyAyNzggOVQxODYgLTEwWk0yNjEgMTA3UTI5OSAxMDcgMzIyIDEzMFQzNDUgMTkyVjIwOUgzMjFRMjYzIDIwNyAyMzMgMTk1VDIwMyAxNTNRMjAzIDEzMSAyMTkgMTE5VDI2MSAxMDdaTTM1NiA1NDFRMzI0IDU0MSAzMDAgNTUwVDI1NSA1NzZRMjQ3IDU4NCAyNDAgNTg5VDIyOCA1OTVRMjIwIDU5NSAyMTUgNTg0VDIwMyA1NjNRMTg3IDU0MiAxNjAgNTQyUTEzNCA1NDIgMTE3IDU1OVQ5OSA2MDFROTkgNjU2IDEzMCA2ODZUMjA1IDcxNlEyMzMgNzE2IDI1NSA3MDlUMjk2IDY4N1EzMDcgNjc5IDMxNiA2NzFUMzMzIDY2MlEzNDEgNjYyIDM0NSA2NzJUMzU2IDY5MlEzNzIgNzE0IDQwMCA3MTRRNDI3IDcxNCA0NDMgNjk3VDQ2MiA2NTVRNDYyIDYwMCA0MzEgNTcxVDM1NiA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNDsiIGdseXBoLW5hbWU9ImFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTE4NiAtMTBRMTQ4IC0xMCAxMTggMFQ2NiAzMFQzMyA3N1QyMSAxMzZRMjEgMjIxIDkzIDI2MlQzMjUgMzA0SDM0NFEzMzggMzcwIDI2NyAzNzBRMjQ0IDM3MCAyMjcgMzY0VDE5OSAzNDlUMTgwIDMyN1QxNjcgMzA0UTE2NyAzMDMgMTQ3IDMwM1QxMDMgMzA4VDYwIDMzMVQ0MCAzNzlRNDAgNDM3IDk3IDQ3MVQyNzggNTA2UTQxMiA1MDYgNDczIDQ1NFQ1MzQgMjk1VjBIMzQ1VjYxUTMxOSAyNyAyNzggOVQxODYgLTEwWk0yNjEgMTA3UTI5OSAxMDcgMzIyIDEzMFQzNDUgMTkyVjIwOUgzMjFRMjYzIDIwNyAyMzMgMTk1VDIwMyAxNTNRMjAzIDEzMSAyMTkgMTE5VDI2MSAxMDdaTTM5NSA1NDFRMzUzIDU0MSAzMjkgNTYzVDMwNSA2MjlRMzA1IDY3MSAzMjggNjk0VDM5MiA3MTdRNDMzIDcxNyA0NTcgNjk0VDQ4MSA2MjlRNDgxIDU4NyA0NTcgNTY0VDM5NSA1NDFaTTE2OSA1NDFRMTI3IDU0MSAxMDMgNTYzVDc5IDYyOVE3OSA2NzEgMTAzIDY5NFQxNjUgNzE3UTIwNyA3MTcgMjMxIDY5NFQyNTYgNjI5UTI1NiA1ODcgMjMyIDU2NFQxNjkgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTU7IiBnbHlwaC1uYW1lPSJhcmluZyIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTE4NiAtMTBRMTQ4IC0xMCAxMTggMFQ2NiAzMFQzMyA3N1QyMSAxMzZRMjEgMjIxIDkzIDI2MlQzMjUgMzA0SDM0NFEzMzggMzcwIDI2NyAzNzBRMjQ0IDM3MCAyMjcgMzY0VDE5OSAzNDlUMTgwIDMyN1QxNjcgMzA0UTE2NyAzMDMgMTQ3IDMwM1QxMDMgMzA4VDYwIDMzMVQ0MCAzNzlRNDAgNDM3IDk3IDQ3MVQyNzggNTA2UTQxMiA1MDYgNDczIDQ1NFQ1MzQgMjk1VjBIMzQ1VjYxUTMxOSAyNyAyNzggOVQxODYgLTEwWk0yNjEgMTA3UTI5OSAxMDcgMzIyIDEzMFQzNDUgMTkyVjIwOUgzMjFRMjYzIDIwNyAyMzMgMTk1VDIwMyAxNTNRMjAzIDEzMSAyMTkgMTE5VDI2MSAxMDdaTTI3OSA1NDFRMjE5IDU0MSAxODQgNTc2VDE0OSA2NjdRMTQ5IDY5NCAxNTggNzE3VDE4NSA3NTdUMjI3IDc4M1QyODEgNzkzUTMxMCA3OTMgMzM0IDc4NFQzNzUgNzU3VDQwMSA3MTdUNDExIDY2N1E0MTEgNjQwIDQwMiA2MTdUMzc1IDU3N1QzMzMgNTUxVDI3OSA1NDFaTTI4MCA2MTlRMzAwIDYxOSAzMTMgNjMzVDMyNiA2NjdRMzI2IDY4NyAzMTMgNzAxVDI4MCA3MTZRMjYwIDcxNiAyNDcgNzAyVDIzNCA2NjdRMjM0IDY0NiAyNDcgNjMzVDI4MCA2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNjsiIGdseXBoLW5hbWU9ImFlIiBob3Jpei1hZHYteD0iODcyIiBkPSJNMTg4IC0xMFExNTAgLTEwIDEyMCAwVDY3IDMwVDMzIDc3VDIxIDEzNlEyMSAyMjEgOTMgMjYyVDMyNSAzMDRIMzQ0UTMzOCAzNzAgMjY3IDM3MFEyNDQgMzcwIDIyNyAzNjRUMTk5IDM0OVQxODAgMzI3VDE2NyAzMDRRMTY3IDMwMyAxNDcgMzAzVDEwMyAzMDhUNjAgMzMxVDQwIDM3OVE0MCA0MzggOTQgNDcyVDI2MCA1MDZRMzc3IDUwNiA0MzQgNDUxUTQ5NyA1MDYgNTk1IDUwNlE2NTIgNTA2IDY5OSA0ODhUNzgwIDQzNlQ4MzMgMzU4VDg1MiAyNTlWMjQ3UTg1MSAyMjUgODQ0IDIxMVQ4MTQgMTk3SDUwMFE1MDkgMTU4IDUzOSAxMzlUNjE1IDExOVE2NjAgMTE5IDY5MCAxMzdUNzM1IDE4MlE3MzUgMTgzIDc0OSAxODFUNzc5IDE3MFQ4MTAgMTQ2VDgyNCAxMDJRODI0IDUyIDc2OCAxOVQ2MDcgLTE0UTQ0OCAtMTQgMzg5IDg5UTM2MyA0NSAzMTAgMThUMTg4IC0xMFpNNTkzIDM4MVE1NTUgMzgxIDUyOSAzNTdUNDk3IDI5Nkg2ODBRNjc4IDMzNCA2NTYgMzU3VDU5MyAzODFaTTI2MSAxMDdRMjk5IDEwNyAzMjIgMTMwVDM0NSAxOTJWMjA5SDMyMVEyNjMgMjA3IDIzMyAxOTVUMjAzIDE1M1EyMDMgMTMxIDIxOSAxMTlUMjYxIDEwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU3OyIgZ2x5cGgtbmFtZT0iY2NlZGlsbGEiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0yODYgLTE0UTIyNyAtMTQgMTc4IDVUOTUgNThUNDEgMTQxVDIyIDI0N1EyMiAzMDMgNDEgMzUwVDk2IDQzMlQxNzkgNDg2VDI4NiA1MDVRMzQ1IDUwNSAzODUgNDkyVDQ1MCA0NThUNDg2IDQxNFQ0OTcgMzczUTQ5NyAzNDQgNDgyIDMyN1Q0NDcgMzAxVDQxMiAyOTBUMzk1IDI5MVEzODQgMzIwIDM2MSAzMzhUMjk3IDM1NlEyNTIgMzU2IDIyMyAzMjZUMTk0IDI0N1ExOTQgMTk4IDIyMiAxNjdUMjk3IDEzNVEzMzUgMTM1IDM1OSAxNTNUMzk1IDIwMVEzOTYgMjA0IDQxMiAyMDNUNDQ3IDE5MlQ0ODEgMTY1VDQ5NyAxMTdRNDk3IDk5IDQ4NiA3NlQ0NDkgMzNUMzgzIDBUMjg2IC0xNFpNMjU4IC0yMjFRMjQ0IC0yMzAgMjI2IC0yMzFUMTkyIC0yMjlUMTY3IC0yMTZUMTYyIC0xOTNMMTk2IC05NlEyMDAgLTgzIDIwNiAtNzNUMjIxIC01NlQyNDUgLTQ2VDI4MyAtNDNIMzAzUTMzOSAtNDMgMzU5IC01NlQzNzkgLTk1Vi0xMDBRMzc5IC0xMTcgMzY4IC0xMzFUMzMzIC0xNjJMMjU4IC0yMjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFODsiIGdseXBoLW5hbWU9ImVncmF2ZSIgaG9yaXotYWR2LXg9IjU2MyIgZD0iTTI5OCAtMTRRMjM1IC0xNCAxODQgM1Q5NyA1NFQ0MiAxMzRUMjIgMjQyUTIyIDI5OSA0MSAzNDdUOTYgNDMxVDE4MCA0ODZUMjg2IDUwNlEzNDMgNTA2IDM5MCA0ODhUNDcyIDQzNlQ1MjUgMzU4VDU0NCAyNTlWMjQ3UTU0MyAyMjUgNTM1IDIxMVQ1MDUgMTk3SDE5MlEyMDEgMTU4IDIzMSAxMzlUMzA3IDExOVEzNTIgMTE5IDM4MiAxMzdUNDI3IDE4MlE0MjcgMTgzIDQ0MCAxODFUNDcwIDE3MFQ1MDEgMTQ2VDUxNSAxMDJRNTE1IDUyIDQ2MCAxOVQyOTggLTE0Wk0yODQgMzgxUTI0NiAzODEgMjIwIDM1N1QxODkgMjk2SDM3MVEzNzAgMzM0IDM0NyAzNTdUMjg0IDM4MVpNMTcyIDU3N1ExNDUgNTkyIDEzMCA2MThUMTE0IDY3MFExMTQgNzAyIDEzOSA3MjNUMjAxIDc0NFEyMjcgNzQ0IDI1NCA3MjhRMjc5IDcxMyAzMDAgNjg5VDMzNyA2MzlUMzU5IDU5NFQzNjMgNTY3UTM1OSA1NjEgMzQxIDU1NVQyOTYgNTQ4VDIzNyA1NTNUMTcyIDU3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU5OyIgZ2x5cGgtbmFtZT0iZWFjdXRlIiBob3Jpei1hZHYteD0iNTYzIiBkPSJNMjk4IC0xNFEyMzUgLTE0IDE4NCAzVDk3IDU0VDQyIDEzNFQyMiAyNDJRMjIgMjk5IDQxIDM0N1Q5NiA0MzFUMTgwIDQ4NlQyODYgNTA2UTM0MyA1MDYgMzkwIDQ4OFQ0NzIgNDM2VDUyNSAzNThUNTQ0IDI1OVYyNDdRNTQzIDIyNSA1MzUgMjExVDUwNSAxOTdIMTkyUTIwMSAxNTggMjMxIDEzOVQzMDcgMTE5UTM1MiAxMTkgMzgyIDEzN1Q0MjcgMTgyUTQyNyAxODMgNDQwIDE4MVQ0NzAgMTcwVDUwMSAxNDZUNTE1IDEwMlE1MTUgNTIgNDYwIDE5VDI5OCAtMTRaTTI4NCAzODFRMjQ2IDM4MSAyMjAgMzU3VDE4OSAyOTZIMzcxUTM3MCAzMzQgMzQ3IDM1N1QyODQgMzgxWk0xOTUgNTY3UTE5MiA1NzMgMTk5IDU5M1QyMjEgNjM5VDI1NyA2ODhUMzA0IDcyOFEzMzEgNzQ0IDM1NyA3NDRRMzkzIDc0NCA0MTggNzIzVDQ0MyA2NzBRNDQzIDY0NCA0MjggNjE4VDM4NiA1NzdRMzU0IDU1OSAzMjIgNTUzVDI2MiA1NDhUMjE3IDU1NVQxOTUgNTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUE7IiBnbHlwaC1uYW1lPSJlY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU2MyIgZD0iTTI5OCAtMTRRMjM1IC0xNCAxODQgM1Q5NyA1NFQ0MiAxMzRUMjIgMjQyUTIyIDI5OSA0MSAzNDdUOTYgNDMxVDE4MCA0ODZUMjg2IDUwNlEzNDMgNTA2IDM5MCA0ODhUNDcyIDQzNlQ1MjUgMzU4VDU0NCAyNTlWMjQ3UTU0MyAyMjUgNTM1IDIxMVQ1MDUgMTk3SDE5MlEyMDEgMTU4IDIzMSAxMzlUMzA3IDExOVEzNTIgMTE5IDM4MiAxMzdUNDI3IDE4MlE0MjcgMTgzIDQ0MCAxODFUNDcwIDE3MFQ1MDEgMTQ2VDUxNSAxMDJRNTE1IDUyIDQ2MCAxOVQyOTggLTE0Wk0yODQgMzgxUTI0NiAzODEgMjIwIDM1N1QxODkgMjk2SDM3MVEzNzAgMzM0IDM0NyAzNTdUMjg0IDM4MVpNMzg5IDU0MVEzNTggNTQxIDMzMSA1NjVUMjg1IDYzM1EyNjUgNTkwIDIzOCA1NjZUMTgxIDU0MVExNTMgNTQxIDEzNyA1NTdUMTIwIDU5OVExMjAgNjI1IDEzNyA2NTBUMTc5IDY5NlQyMzMgNzMyVDI4NSA3NTRRMzA4IDc0OCAzMzcgNzMzVDM5MSA2OTZUNDMzIDY1MFQ0NTAgNTk5UTQ1MCA1NzQgNDM0IDU1OFQzODkgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUI7IiBnbHlwaC1uYW1lPSJlZGllcmVzaXMiIGhvcml6LWFkdi14PSI1NjMiIGQ9Ik0yOTggLTE0UTIzNSAtMTQgMTg0IDNUOTcgNTRUNDIgMTM0VDIyIDI0MlEyMiAyOTkgNDEgMzQ3VDk2IDQzMVQxODAgNDg2VDI4NiA1MDZRMzQzIDUwNiAzOTAgNDg4VDQ3MiA0MzZUNTI1IDM1OFQ1NDQgMjU5VjI0N1E1NDMgMjI1IDUzNSAyMTFUNTA1IDE5N0gxOTJRMjAxIDE1OCAyMzEgMTM5VDMwNyAxMTlRMzUyIDExOSAzODIgMTM3VDQyNyAxODJRNDI3IDE4MyA0NDAgMTgxVDQ3MCAxNzBUNTAxIDE0NlQ1MTUgMTAyUTUxNSA1MiA0NjAgMTlUMjk4IC0xNFpNMjg0IDM4MVEyNDYgMzgxIDIyMCAzNTdUMTg5IDI5NkgzNzFRMzcwIDMzNCAzNDcgMzU3VDI4NCAzODFaTTQwMCA1NDFRMzU4IDU0MSAzMzQgNTYzVDMxMCA2MjlRMzEwIDY3MSAzMzMgNjk0VDM5NyA3MTdRNDM4IDcxNyA0NjIgNjk0VDQ4NiA2MjlRNDg2IDU4NyA0NjIgNTY0VDQwMCA1NDFaTTE3NCA1NDFRMTMyIDU0MSAxMDggNTYzVDg0IDYyOVE4NCA2NzEgMTA4IDY5NFQxNzAgNzE3UTIxMiA3MTcgMjM2IDY5NFQyNjEgNjI5UTI2MSA1ODcgMjM3IDU2NFQxNzQgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUM7IiBnbHlwaC1uYW1lPSJpZ3JhdmUiIGhvcml6LWFkdi14PSIyODYiIGQ9Ik00NyA0MDlRNDcgNDYxIDcxIDQ4MVQxMzMgNTAxSDE1M1ExOTIgNTAxIDIxNSA0ODJUMjM5IDQwOVYwSDQ3VjQwOVpNNDMgNTc3UTE2IDU5MiAxIDYxOFQtMTUgNjcwUS0xNSA3MDIgMTAgNzIzVDcyIDc0NFE5OCA3NDQgMTI1IDcyOFExNTAgNzEzIDE3MSA2ODlUMjA4IDYzOVQyMzAgNTk0VDIzNCA1NjdRMjMwIDU2MSAyMTIgNTU1VDE2NyA1NDhUMTA4IDU1M1Q0MyA1NzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRDsiIGdseXBoLW5hbWU9ImlhY3V0ZSIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTQ3IDQwOVE0NyA0NjEgNzEgNDgxVDEzMyA1MDFIMTUzUTE5MiA1MDEgMjE1IDQ4MlQyMzkgNDA5VjBINDdWNDA5Wk00OSA1NjdRNDYgNTczIDUzIDU5M1Q3NSA2MzlUMTExIDY4OFQxNTggNzI4UTE4NSA3NDQgMjExIDc0NFEyNDcgNzQ0IDI3MiA3MjNUMjk3IDY3MFEyOTcgNjQ0IDI4MiA2MThUMjQwIDU3N1EyMDggNTU5IDE3NiA1NTNUMTE2IDU0OFQ3MSA1NTVUNDkgNTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUU7IiBnbHlwaC1uYW1lPSJpY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTQ3IDQwOVE0NyA0NjEgNzEgNDgxVDEzMyA1MDFIMTUzUTE5MiA1MDEgMjE1IDQ4MlQyMzkgNDA5VjBINDdWNDA5Wk0yNDYgNTQxUTIxNSA1NDEgMTg4IDU2NVQxNDIgNjMzUTEyMiA1OTAgOTUgNTY2VDM4IDU0MVExMCA1NDEgLTYgNTU3VC0yMyA1OTlRLTIzIDYyNSAtNiA2NTBUMzYgNjk2VDkwIDczMlQxNDIgNzU0UTE2NSA3NDggMTk0IDczM1QyNDggNjk2VDI5MCA2NTBUMzA3IDU5OVEzMDcgNTc0IDI5MSA1NThUMjQ2IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVGOyIgZ2x5cGgtbmFtZT0iaWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMjg2IiBkPSJNNDcgNDA5UTQ3IDQ2MSA3MSA0ODFUMTMzIDUwMUgxNTNRMTkyIDUwMSAyMTUgNDgyVDIzOSA0MDlWMEg0N1Y0MDlaTTI1NyA1NDFRMjE1IDU0MSAxOTEgNTYzVDE2NyA2MjlRMTY3IDY3MSAxOTAgNjk0VDI1NCA3MTdRMjk1IDcxNyAzMTkgNjk0VDM0MyA2MjlRMzQzIDU4NyAzMTkgNTY0VDI1NyA1NDFaTTMxIDU0MVEtMTEgNTQxIC0zNSA1NjNULTU5IDYyOVEtNTkgNjcxIC0zNSA2OTRUMjcgNzE3UTY5IDcxNyA5MyA2OTRUMTE4IDYyOVExMTggNTg3IDk0IDU2NFQzMSA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMDsiIGdseXBoLW5hbWU9ImV0aCIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTIyMSA1MDVRMTkwIDQ5MCAxNjcgNDk3VDEzMyA1MzBMMTMxIDUzNVExMjIgNTYxIDEyOSA1ODFUMTY4IDYxOEgxNjlRMTM0IDYzMCA5NiA2MzlROTIgNjQwIDk2IDY1NVQxMTUgNjg5VDE1OSA3MjJUMjM1IDczN1EyOTcgNzM3IDM1NyA3MTFMNDU2IDc2MFE0ODcgNzc1IDUwNyA3NjVUNTQyIDczNUw1NDYgNzMwUTU2MiA3MTAgNTUyIDY4N1Q1MDkgNjQ3TDQ3MSA2MjlRNTMwIDU2OSA1NjQgNDg2VDU5OSAzMDhRNTk5IDIzNCA1NzggMTc1VDUxNyA3M1Q0MjIgOVQzMDEgLTE0UTIzOSAtMTQgMTg4IDJUMTAxIDUwVDQ0IDEyOFQyNCAyMzRRMjQgMjg2IDQxIDMzMFQ4OCA0MDVUMTYxIDQ1NFQyNTYgNDcyUTMwOCA0NzIgMzQ1IDQ1MVQ0MDQgMzk3UTM5MSA0MzkgMzY2IDQ3NlQzMDMgNTQ2TDIyMSA1MDVaTTMwMyAxMzNRMzQ5IDEzMyAzNzYgMTYxVDQwMyAyMzZWMjg5UTM5MCAzMTIgMzY0IDMyN1QzMDcgMzQzUTI2MCAzNDMgMjMzIDMxM1QyMDUgMjM4UTIwNSAxOTMgMjMyIDE2M1QzMDMgMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjE7IiBnbHlwaC1uYW1lPSJudGlsZGUiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik0xMTggNTAxUTEzNCA1MDEgMTUxIDQ5N1QxODMgNDgzVDIwOSA0NTdUMjI4IDQxNVEyNTQgNDU1IDI5MiA0ODBUMzkxIDUwNlE0MzkgNTA2IDQ3MiA0OTBUNTI3IDQ0N1Q1NTcgMzg1VDU2NyAzMTBWMEgzNzVWMjc3UTM3NSAzMTEgMzU4IDMzMFQzMTEgMzUwUTI4NSAzNTAgMjY2IDMzOVQyMzYgMzEwVjBINDRWNDc5UTQ0IDQ4NCA2NiA0OTJUMTE4IDUwMVpNMzg0IDU0MVEzNTIgNTQxIDMyOCA1NTBUMjgzIDU3NlEyNzUgNTg0IDI2OCA1ODlUMjU2IDU5NVEyNDggNTk1IDI0MyA1ODRUMjMxIDU2M1EyMTUgNTQyIDE4OCA1NDJRMTYyIDU0MiAxNDUgNTU5VDEyNyA2MDFRMTI3IDY1NiAxNTggNjg2VDIzMyA3MTZRMjYxIDcxNiAyODMgNzA5VDMyNCA2ODdRMzM1IDY3OSAzNDQgNjcxVDM2MSA2NjJRMzY5IDY2MiAzNzMgNjcyVDM4NCA2OTJRNDAwIDcxNCA0MjggNzE0UTQ1NSA3MTQgNDcxIDY5N1Q0OTAgNjU1UTQ5MCA2MDAgNDU5IDU3MVQzODQgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjI7IiBnbHlwaC1uYW1lPSJvZ3JhdmUiIGhvcml6LWFkdi14PSI1ODYiIGQ9Ik0yOTIgLTE0UTIzMCAtMTQgMTgxIDRUOTYgNTdUNDEgMTM5VDIyIDI0N1EyMiAzMDUgNDEgMzUzVDk3IDQzNVQxODMgNDg3VDI5NSA1MDZRMzU2IDUwNiA0MDUgNDg4VDQ5MCA0MzVUNTQ0IDM1MlQ1NjQgMjQ2UTU2NCAxODcgNTQ1IDEzOVQ0OTAgNTdUNDA0IDVUMjkyIC0xNFpNMjkzIDEzM1EzNDAgMTMzIDM3MCAxNjVUNDAxIDI0NlE0MDEgMjk3IDM3MSAzMjlUMjkzIDM2MVEyNDUgMzYxIDIxNSAzMjlUMTg1IDI0N1ExODUgMTk2IDIxNSAxNjVUMjkzIDEzM1pNMTc5IDU3N1ExNTIgNTkyIDEzNyA2MThUMTIxIDY3MFExMjEgNzAyIDE0NiA3MjNUMjA4IDc0NFEyMzQgNzQ0IDI2MSA3MjhRMjg2IDcxMyAzMDcgNjg5VDM0NCA2MzlUMzY2IDU5NFQzNzAgNTY3UTM2NiA1NjEgMzQ4IDU1NVQzMDMgNTQ4VDI0NCA1NTNUMTc5IDU3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYzOyIgZ2x5cGgtbmFtZT0ib2FjdXRlIiBob3Jpei1hZHYteD0iNTg2IiBkPSJNMjkyIC0xNFEyMzAgLTE0IDE4MSA0VDk2IDU3VDQxIDEzOVQyMiAyNDdRMjIgMzA1IDQxIDM1M1Q5NyA0MzVUMTgzIDQ4N1QyOTUgNTA2UTM1NiA1MDYgNDA1IDQ4OFQ0OTAgNDM1VDU0NCAzNTJUNTY0IDI0NlE1NjQgMTg3IDU0NSAxMzlUNDkwIDU3VDQwNCA1VDI5MiAtMTRaTTI5MyAxMzNRMzQwIDEzMyAzNzAgMTY1VDQwMSAyNDZRNDAxIDI5NyAzNzEgMzI5VDI5MyAzNjFRMjQ1IDM2MSAyMTUgMzI5VDE4NSAyNDdRMTg1IDE5NiAyMTUgMTY1VDI5MyAxMzNaTTIxNSA1NjdRMjEyIDU3MyAyMTkgNTkzVDI0MSA2MzlUMjc3IDY4OFQzMjQgNzI4UTM1MSA3NDQgMzc3IDc0NFE0MTMgNzQ0IDQzOCA3MjNUNDYzIDY3MFE0NjMgNjQ0IDQ0OCA2MThUNDA2IDU3N1EzNzQgNTU5IDM0MiA1NTNUMjgyIDU0OFQyMzcgNTU1VDIxNSA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNDsiIGdseXBoLW5hbWU9Im9jaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTg2IiBkPSJNMjkyIC0xNFEyMzAgLTE0IDE4MSA0VDk2IDU3VDQxIDEzOVQyMiAyNDdRMjIgMzA1IDQxIDM1M1Q5NyA0MzVUMTgzIDQ4N1QyOTUgNTA2UTM1NiA1MDYgNDA1IDQ4OFQ0OTAgNDM1VDU0NCAzNTJUNTY0IDI0NlE1NjQgMTg3IDU0NSAxMzlUNDkwIDU3VDQwNCA1VDI5MiAtMTRaTTI5MyAxMzNRMzQwIDEzMyAzNzAgMTY1VDQwMSAyNDZRNDAxIDI5NyAzNzEgMzI5VDI5MyAzNjFRMjQ1IDM2MSAyMTUgMzI5VDE4NSAyNDdRMTg1IDE5NiAyMTUgMTY1VDI5MyAxMzNaTTM5NyA1NDFRMzY2IDU0MSAzMzkgNTY1VDI5MyA2MzNRMjczIDU5MCAyNDYgNTY2VDE4OSA1NDFRMTYxIDU0MSAxNDUgNTU3VDEyOCA1OTlRMTI4IDYyNSAxNDUgNjUwVDE4NyA2OTZUMjQxIDczMlQyOTMgNzU0UTMxNiA3NDggMzQ1IDczM1QzOTkgNjk2VDQ0MSA2NTBUNDU4IDU5OVE0NTggNTc0IDQ0MiA1NThUMzk3IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY1OyIgZ2x5cGgtbmFtZT0ib3RpbGRlIiBob3Jpei1hZHYteD0iNTg2IiBkPSJNMjkyIC0xNFEyMzAgLTE0IDE4MSA0VDk2IDU3VDQxIDEzOVQyMiAyNDdRMjIgMzA1IDQxIDM1M1Q5NyA0MzVUMTgzIDQ4N1QyOTUgNTA2UTM1NiA1MDYgNDA1IDQ4OFQ0OTAgNDM1VDU0NCAzNTJUNTY0IDI0NlE1NjQgMTg3IDU0NSAxMzlUNDkwIDU3VDQwNCA1VDI5MiAtMTRaTTI5MyAxMzNRMzQwIDEzMyAzNzAgMTY1VDQwMSAyNDZRNDAxIDI5NyAzNzEgMzI5VDI5MyAzNjFRMjQ1IDM2MSAyMTUgMzI5VDE4NSAyNDdRMTg1IDE5NiAyMTUgMTY1VDI5MyAxMzNaTTM2OSA1NDFRMzM3IDU0MSAzMTMgNTUwVDI2OCA1NzZRMjYwIDU4NCAyNTMgNTg5VDI0MSA1OTVRMjMzIDU5NSAyMjggNTg0VDIxNiA1NjNRMjAwIDU0MiAxNzMgNTQyUTE0NyA1NDIgMTMwIDU1OVQxMTIgNjAxUTExMiA2NTYgMTQzIDY4NlQyMTggNzE2UTI0NiA3MTYgMjY4IDcwOVQzMDkgNjg3UTMyMCA2NzkgMzI5IDY3MVQzNDYgNjYyUTM1NCA2NjIgMzU4IDY3MlQzNjkgNjkyUTM4NSA3MTQgNDEzIDcxNFE0NDAgNzE0IDQ1NiA2OTdUNDc1IDY1NVE0NzUgNjAwIDQ0NCA1NzFUMzY5IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY2OyIgZ2x5cGgtbmFtZT0ib2RpZXJlc2lzIiBob3Jpei1hZHYteD0iNTg2IiBkPSJNMjkyIC0xNFEyMzAgLTE0IDE4MSA0VDk2IDU3VDQxIDEzOVQyMiAyNDdRMjIgMzA1IDQxIDM1M1Q5NyA0MzVUMTgzIDQ4N1QyOTUgNTA2UTM1NiA1MDYgNDA1IDQ4OFQ0OTAgNDM1VDU0NCAzNTJUNTY0IDI0NlE1NjQgMTg3IDU0NSAxMzlUNDkwIDU3VDQwNCA1VDI5MiAtMTRaTTI5MyAxMzNRMzQwIDEzMyAzNzAgMTY1VDQwMSAyNDZRNDAxIDI5NyAzNzEgMzI5VDI5MyAzNjFRMjQ1IDM2MSAyMTUgMzI5VDE4NSAyNDdRMTg1IDE5NiAyMTUgMTY1VDI5MyAxMzNaTTQwOCA1NDFRMzY2IDU0MSAzNDIgNTYzVDMxOCA2MjlRMzE4IDY3MSAzNDEgNjk0VDQwNSA3MTdRNDQ2IDcxNyA0NzAgNjk0VDQ5NCA2MjlRNDk0IDU4NyA0NzAgNTY0VDQwOCA1NDFaTTE4MiA1NDFRMTQwIDU0MSAxMTYgNTYzVDkyIDYyOVE5MiA2NzEgMTE2IDY5NFQxNzggNzE3UTIyMCA3MTcgMjQ0IDY5NFQyNjkgNjI5UTI2OSA1ODcgMjQ1IDU2NFQxODIgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjc7IiBnbHlwaC1uYW1lPSJkaXZpZGUiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik0yODkgMzc3UTIyMiAzNzcgMjIyIDQ0NVY0NTlRMjIyIDUyNyAyODkgNTI3SDMwOVEzNzggNTI3IDM3OCA0NTlWNDQ1UTM3OCAzNzcgMzA5IDM3N0gyODlaTTExOSAxODJRODEgMTgyIDYyIDIwMFQ0MyAyNDlWMjU4UTQzIDI4OCA2MiAzMDZUMTE5IDMyNUg0ODBRNTE5IDMyNSA1MzcgMzA3VDU1NiAyNThWMjQ5UTU1NiAyMTggNTM4IDIwMFQ0ODAgMTgySDExOVpNMjg5IC0xOFEyMjIgLTE4IDIyMiA1MFY2NFEyMjIgMTMyIDI4OSAxMzJIMzA5UTM3OCAxMzIgMzc4IDY0VjUwUTM3OCAtMTggMzA5IC0xOEgyODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGODsiIGdseXBoLW5hbWU9Im9zbGFzaCIgaG9yaXotYWR2LXg9IjU4NiIgZD0iTTgyIC03M1E3OSAtNzYgNjcgLTc0VDQxIC02NFQxNiAtNDRUNSAtMTZRNSA0IDI4IDMwTDc3IDg0UTUxIDExNyAzOCAxNTdUMjQgMjQ2UTI0IDMwMSA0NCAzNDhUMTAwIDQzMVQxODYgNDg2VDI5NiA1MDZRMzM0IDUwNiAzNjcgNDk4VDQyOSA0NzRMNTE0IDU2OFE1MTcgNTcxIDUyOSA1NjlUNTU0IDU1OVQ1NzkgNTQxVDU5MCA1MTNRNTkwIDUwMiA1ODUgNDkxVDU2OCA0NjZMNTEzIDQwNFE1NjQgMzM4IDU2NCAyNDdRNTY0IDE5MSA1NDQgMTQ0VDQ4OCA2MVQ0MDIgNlQyOTIgLTE0UTIxNyAtMTQgMTYyIDE2TDgyIC03M1pNMTkxIDE5M1EyMDIgMjA1IDIxNCAyMThRMjI1IDIyOSAyMzggMjQzVDI2NSAyNzRRMjk4IDMwOSAzMzkgMzU1UTMxOSAzNjcgMjk0IDM2N1EyNDMgMzY3IDIxMiAzMzNUMTgwIDI0NlExODAgMjE4IDE5MSAxOTNaTTI5NCAxMjdRMzE5IDEyNyAzNDAgMTM2VDM3NiAxNjFUMzk5IDE5OFQ0MDggMjQ2UTQwOCAyNzYgMzk2IDI5N0wzMjQgMjE3UTI5MiAxODIgMjUyIDEzOFEyNzEgMTI3IDI5NCAxMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGOTsiIGdseXBoLW5hbWU9InVncmF2ZSIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTQ4OCAtNVE0NzEgLTUgNDU1IC0xVDQyMyAxMlQzOTcgMzhUMzc4IDc4UTM1MiAzOCAzMTQgMTJUMjE1IC0xNFExNjcgLTE0IDEzNCAyVDc5IDQ2VDQ5IDEwOFQzOSAxODJWNDk2SDIzMVYyMTZRMjMxIDE4MiAyNDggMTYzVDI5NiAxNDNRMzIxIDE0MyAzNDAgMTU0VDM3MCAxODJWNDk2SDU2MlYxN1E1NjIgMTUgNTU2IDExVDU0MCA0VDUxNiAtMlQ0ODggLTVaTTE4OCA1NzdRMTYxIDU5MiAxNDYgNjE4VDEzMCA2NzBRMTMwIDcwMiAxNTUgNzIzVDIxNyA3NDRRMjQzIDc0NCAyNzAgNzI4UTI5NSA3MTMgMzE2IDY4OVQzNTMgNjM5VDM3NSA1OTRUMzc5IDU2N1EzNzUgNTYxIDM1NyA1NTVUMzEyIDU0OFQyNTMgNTUzVDE4OCA1NzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQTsiIGdseXBoLW5hbWU9InVhY3V0ZSIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTQ4OCAtNVE0NzEgLTUgNDU1IC0xVDQyMyAxMlQzOTcgMzhUMzc4IDc4UTM1MiAzOCAzMTQgMTJUMjE1IC0xNFExNjcgLTE0IDEzNCAyVDc5IDQ2VDQ5IDEwOFQzOSAxODJWNDk2SDIzMVYyMTZRMjMxIDE4MiAyNDggMTYzVDI5NiAxNDNRMzIxIDE0MyAzNDAgMTU0VDM3MCAxODJWNDk2SDU2MlYxN1E1NjIgMTUgNTU2IDExVDU0MCA0VDUxNiAtMlQ0ODggLTVaTTIyNyA1NjdRMjI0IDU3MyAyMzEgNTkzVDI1MyA2MzlUMjg5IDY4OFQzMzYgNzI4UTM2MyA3NDQgMzg5IDc0NFE0MjUgNzQ0IDQ1MCA3MjNUNDc1IDY3MFE0NzUgNjQ0IDQ2MCA2MThUNDE4IDU3N1EzODYgNTU5IDM1NCA1NTNUMjk0IDU0OFQyNDkgNTU1VDIyNyA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGdseXBoLW5hbWU9InVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjA2IiBkPSJNNDg4IC01UTQ3MSAtNSA0NTUgLTFUNDIzIDEyVDM5NyAzOFQzNzggNzhRMzUyIDM4IDMxNCAxMlQyMTUgLTE0UTE2NyAtMTQgMTM0IDJUNzkgNDZUNDkgMTA4VDM5IDE4MlY0OTZIMjMxVjIxNlEyMzEgMTgyIDI0OCAxNjNUMjk2IDE0M1EzMjEgMTQzIDM0MCAxNTRUMzcwIDE4MlY0OTZINTYyVjE3UTU2MiAxNSA1NTYgMTFUNTQwIDRUNTE2IC0yVDQ4OCAtNVpNNDA3IDU0MVEzNzYgNTQxIDM0OSA1NjVUMzAzIDYzM1EyODMgNTkwIDI1NiA1NjZUMTk5IDU0MVExNzEgNTQxIDE1NSA1NTdUMTM4IDU5OVExMzggNjI1IDE1NSA2NTBUMTk3IDY5NlQyNTEgNzMyVDMwMyA3NTRRMzI2IDc0OCAzNTUgNzMzVDQwOSA2OTZUNDUxIDY1MFQ0NjggNTk5UTQ2OCA1NzQgNDUyIDU1OFQ0MDcgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkM7IiBnbHlwaC1uYW1lPSJ1ZGllcmVzaXMiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik00ODggLTVRNDcxIC01IDQ1NSAtMVQ0MjMgMTJUMzk3IDM4VDM3OCA3OFEzNTIgMzggMzE0IDEyVDIxNSAtMTRRMTY3IC0xNCAxMzQgMlQ3OSA0NlQ0OSAxMDhUMzkgMTgyVjQ5NkgyMzFWMjE2UTIzMSAxODIgMjQ4IDE2M1QyOTYgMTQzUTMyMSAxNDMgMzQwIDE1NFQzNzAgMTgyVjQ5Nkg1NjJWMTdRNTYyIDE1IDU1NiAxMVQ1NDAgNFQ1MTYgLTJUNDg4IC01Wk00MTggNTQxUTM3NiA1NDEgMzUyIDU2M1QzMjggNjI5UTMyOCA2NzEgMzUxIDY5NFQ0MTUgNzE3UTQ1NiA3MTcgNDgwIDY5NFQ1MDQgNjI5UTUwNCA1ODcgNDgwIDU2NFQ0MTggNTQxWk0xOTIgNTQxUTE1MCA1NDEgMTI2IDU2M1QxMDIgNjI5UTEwMiA2NzEgMTI2IDY5NFQxODggNzE3UTIzMCA3MTcgMjU0IDY5NFQyNzkgNjI5UTI3OSA1ODcgMjU1IDU2NFQxOTIgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkQ7IiBnbHlwaC1uYW1lPSJ5YWN1dGUiIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0yNDMgLTE4OFEyMjIgLTE4OCAyMDMgLTE4MVQxNjkgLTE2NVQxNDYgLTE0OFQxNDAgLTEzNUwyMjIgMzZRMjA1IDQwIDE5MiA0OFQxNzMgNzJMLTkgNDk2SDE5NUwyOTAgMTk5TDM3OSA0OTZINTc5TDM0NSAtMTAzUTMyNiAtMTUxIDMwMCAtMTY5VDI0MyAtMTg4Wk0yMDkgNTY1UTIwNiA1NzEgMjEzIDU5MVQyMzUgNjM3VDI3MSA2ODZUMzE4IDcyNlEzNDUgNzQyIDM3MSA3NDJRNDA3IDc0MiA0MzIgNzIxVDQ1NyA2NjhRNDU3IDY0MiA0NDIgNjE2VDQwMCA1NzVRMzY4IDU1NyAzMzYgNTUxVDI3NiA1NDZUMjMxIDU1M1QyMDkgNTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBnbHlwaC1uYW1lPSJ0aG9ybiIgaG9yaXotYWR2LXg9IjYzMiIgZD0iTTM4MCAtMTRRMzM1IC0xNCAyOTggNFQyMzYgNTFWLTEwMVEyMzYgLTE1MyAyMTIgLTE3M1QxNTEgLTE5M0gxMzFROTMgLTE5MyA2OSAtMTc0VDQ0IC0xMDFWNjgyUTQ0IDY4NyA2NiA2OTVUMTE4IDcwNFExMzkgNzA0IDE2MCA2OThUMTk4IDY3NVQyMjUgNjMwVDIzNiA1NThWNDMwUTI2MiA0NjUgMjk5IDQ4NVQzODEgNTA2UTQzMiA1MDYgNDczIDQ4OFQ1NDUgNDM1VDU5MSAzNTNUNjA3IDI0NVE2MDcgMTg1IDU5MSAxMzhUNTQ2IDU2VDQ3NCA0VDM4MCAtMTRaTTMyNyAxMzVRMzcyIDEzNSAzOTggMTY1VDQyNSAyNDZRNDI1IDI5NyAzOTkgMzI3VDMyOCAzNTdRMjk2IDM1NyAyNzIgMzQyVDIzNiAzMDFWMjA3UTI0MSAxNzIgMjY2IDE1NFQzMjcgMTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkY7IiBnbHlwaC1uYW1lPSJ5ZGllcmVzaXMiIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0yNDMgLTE4OFEyMjIgLTE4OCAyMDMgLTE4MVQxNjkgLTE2NVQxNDYgLTE0OFQxNDAgLTEzNUwyMjIgMzZRMjA1IDQwIDE5MiA0OFQxNzMgNzJMLTkgNDk2SDE5NUwyOTAgMTk5TDM3OSA0OTZINTc5TDM0NSAtMTAzUTMyNiAtMTUxIDMwMCAtMTY5VDI0MyAtMTg4Wk00MDMgNTQxUTM2MSA1NDEgMzM3IDU2M1QzMTMgNjI5UTMxMyA2NzEgMzM2IDY5NFQ0MDAgNzE3UTQ0MSA3MTcgNDY1IDY5NFQ0ODkgNjI5UTQ4OSA1ODcgNDY1IDU2NFQ0MDMgNTQxWk0xNzcgNTQxUTEzNSA1NDEgMTExIDU2M1Q4NyA2MjlRODcgNjcxIDExMSA2OTRUMTczIDcxN1EyMTUgNzE3IDIzOSA2OTRUMjY0IDYyOVEyNjQgNTg3IDI0MCA1NjRUMTc3IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMDsiIGdseXBoLW5hbWU9IkFtYWNyb24iIGhvcml6LWFkdi14PSI2ODgiIGQ9Ik00NDUgMTM0SDIzNkwxODUgMEgtMTVMMjE2IDU5N1EyMjAgNjA5IDIyNyA2MTlUMjQ5IDYzNlQyODYgNjQ4VDM0MyA2NTJRMzc3IDY1MiAzOTkgNjQ4VDQzNSA2MzdUNDU2IDYxOVQ0NjcgNTk3TDcwOCAwSDQ5OUw0NDUgMTM0Wk0yNzAgMjc4SDQwOUwzMzkgNDY2TDI3MCAyNzhaTTIyNiA2OTRRMTkwIDY5NCAxNjkgNzExVDE0OCA3NTlWNzY3UTE0OCA3OTcgMTY5IDgxNFQyMjYgODMySDQ2MFE0OTYgODMyIDUxNyA4MTVUNTM4IDc2N1Y3NTlRNTM4IDcyOCA1MTggNzExVDQ2MCA2OTRIMjI2SDIyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMTsiIGdseXBoLW5hbWU9ImFtYWNyb24iIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik0xODYgLTEwUTE0OCAtMTAgMTE4IDBUNjYgMzBUMzMgNzdUMjEgMTM2UTIxIDIyMSA5MyAyNjJUMzI1IDMwNEgzNDRRMzM4IDM3MCAyNjcgMzcwUTI0NCAzNzAgMjI3IDM2NFQxOTkgMzQ5VDE4MCAzMjdUMTY3IDMwNFExNjcgMzAzIDE0NyAzMDNUMTAzIDMwOFQ2MCAzMzFUNDAgMzc5UTQwIDQzNyA5NyA0NzFUMjc4IDUwNlE0MTIgNTA2IDQ3MyA0NTRUNTM0IDI5NVYwSDM0NVY2MVEzMTkgMjcgMjc4IDlUMTg2IC0xMFpNMjYxIDEwN1EyOTkgMTA3IDMyMiAxMzBUMzQ1IDE5MlYyMDlIMzIxUTI2MyAyMDcgMjMzIDE5NVQyMDMgMTUzUTIwMyAxMzEgMjE5IDExOVQyNjEgMTA3Wk0xNzggNTQ2UTE0MiA1NDYgMTIxIDU2M1QxMDAgNjExVjYxOVExMDAgNjQ5IDEyMSA2NjZUMTc4IDY4NEg0MTJRNDQ4IDY4NCA0NjkgNjY3VDQ5MCA2MTlWNjExUTQ5MCA1ODAgNDcwIDU2M1Q0MTIgNTQ2SDE3OEgxNzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDI7IiBnbHlwaC1uYW1lPSJBYnJldmUiIGhvcml6LWFkdi14PSI2ODgiIGQ9Ik00NDUgMTM0SDIzNkwxODUgMEgtMTVMMjE2IDU5N1EyMjAgNjA5IDIyNyA2MTlUMjQ5IDYzNlQyODYgNjQ4VDM0MyA2NTJRMzc3IDY1MiAzOTkgNjQ4VDQzNSA2MzdUNDU2IDYxOVQ0NjcgNTk3TDcwOCAwSDQ5OUw0NDUgMTM0Wk0yNzAgMjc4SDQwOUwzMzkgNDY2TDI3MCAyNzhaTTM0NCA2ODlRMzAxIDY4OSAyNjMgNzAzVDE5OCA3NDJRMTgxIDc1OSAxNzEgNzc4VDE2MSA4MTdRMTYxIDg0MiAxNzkgODYxVDIyOSA4ODBRMjUyIDg3NSAyNjggODYzVDI5NyA4MzdUMzIxIDgxM1QzNDQgODAyUTM1NyA4MDIgMzY3IDgxMlQzOTEgODM2VDQyMCA4NjJUNDU5IDg4MFE0OTEgODgwIDUwOSA4NjFUNTI3IDgxN1E1MjcgNzc3IDQ5MSA3NDRRNDY2IDcxOSA0MjcgNzA0VDM0NCA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDM7IiBnbHlwaC1uYW1lPSJhYnJldmUiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik0xODYgLTEwUTE0OCAtMTAgMTE4IDBUNjYgMzBUMzMgNzdUMjEgMTM2UTIxIDIyMSA5MyAyNjJUMzI1IDMwNEgzNDRRMzM4IDM3MCAyNjcgMzcwUTI0NCAzNzAgMjI3IDM2NFQxOTkgMzQ5VDE4MCAzMjdUMTY3IDMwNFExNjcgMzAzIDE0NyAzMDNUMTAzIDMwOFQ2MCAzMzFUNDAgMzc5UTQwIDQzNyA5NyA0NzFUMjc4IDUwNlE0MTIgNTA2IDQ3MyA0NTRUNTM0IDI5NVYwSDM0NVY2MVEzMTkgMjcgMjc4IDlUMTg2IC0xMFpNMjYxIDEwN1EyOTkgMTA3IDMyMiAxMzBUMzQ1IDE5MlYyMDlIMzIxUTI2MyAyMDcgMjMzIDE5NVQyMDMgMTUzUTIwMyAxMzEgMjE5IDExOVQyNjEgMTA3Wk0yOTIgNTQxUTI0OSA1NDEgMjExIDU1NVQxNDYgNTk0UTEyOSA2MTEgMTE5IDYzMFQxMDkgNjY5UTEwOSA2OTQgMTI3IDcxM1QxNzcgNzMyUTIwMCA3MjcgMjE2IDcxNVQyNDUgNjg5VDI2OSA2NjVUMjkyIDY1NFEzMDUgNjU0IDMxNSA2NjRUMzM5IDY4OFQzNjggNzE0VDQwNyA3MzJRNDM5IDczMiA0NTcgNzEzVDQ3NSA2NjlRNDc1IDYyOSA0MzkgNTk2UTQxNCA1NzEgMzc1IDU1NlQyOTIgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA0OyIgZ2x5cGgtbmFtZT0iQW9nb25layIgaG9yaXotYWR2LXg9IjY4OCIgZD0iTTQ0NSAxMzRIMjM2TDE4NSAwSC0xNUwyMTYgNTk3UTIyMCA2MDkgMjI3IDYxOVQyNDkgNjM2VDI4NiA2NDhUMzQzIDY1MlEzNzcgNjUyIDM5OSA2NDhUNDM1IDYzN1Q0NTYgNjE5VDQ2NyA1OTdMNzA4IDBINjQwUTYxMiAtMjcgNjAxIC00NFQ1OTAgLTc1UTU5MCAtMTA0IDYxOCAtMTA0UTYzOSAtMTA0IDY1MCAtODZRNjY2IC04OCA2NzYgLTEwMlQ2ODYgLTEzNVE2ODYgLTE2NSA2NjMgLTE4NVQ1OTAgLTIwNVE1MzQgLTIwNSA1MDIgLTE4MVQ0NzAgLTExMVE0NzAgLTc4IDQ5NCAtNDhUNTU5IDBINDk5TDQ0NSAxMzRaTTI3MCAyNzhINDA5TDMzOSA0NjZMMjcwIDI3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNTsiIGdseXBoLW5hbWU9ImFvZ29uZWsiIGhvcml6LWFkdi14PSI1NzQiIGQ9Ik0xODYgLTEwUTE0OCAtMTAgMTE4IDBUNjYgMzBUMzMgNzdUMjEgMTM2UTIxIDIyMSA5MyAyNjJUMzI1IDMwNEgzNDRRMzM4IDM3MCAyNjcgMzcwUTI0NCAzNzAgMjI3IDM2NFQxOTkgMzQ5VDE4MCAzMjdUMTY3IDMwNFExNjcgMzAzIDE0NyAzMDNUMTAzIDMwOFQ2MCAzMzFUNDAgMzc5UTQwIDQzNyA5NyA0NzFUMjc4IDUwNlE0MTIgNTA2IDQ3MyA0NTRUNTM0IDI5NVYwSDUyMVE0ODYgLTMzIDQ3MiAtNTJUNDU4IC04OFE0NTggLTExNyA0ODYgLTExN1E1MDcgLTExNyA1MTggLTk5UTUzNCAtMTAxIDU0NCAtMTE1VDU1NCAtMTQ4UTU1NCAtMTc4IDUzMSAtMTk4VDQ1OCAtMjE4UTQwMiAtMjE4IDM3MCAtMTk0VDMzOCAtMTI0UTMzOCAtMTAzIDM0OCAtODRUMzc1IC00N1Q0MTYgLTE4VDQ2OCAwSDM0NVY2MVEzMTkgMjcgMjc4IDlUMTg2IC0xMFpNMjYxIDEwN1EyOTkgMTA3IDMyMiAxMzBUMzQ1IDE5MlYyMDlIMzIxUTI2MyAyMDcgMjMzIDE5NVQyMDMgMTUzUTIwMyAxMzEgMjE5IDExOVQyNjEgMTA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA2OyIgZ2x5cGgtbmFtZT0iQ2FjdXRlIiBob3Jpei1hZHYteD0iNjUwIiBkPSJNMzY4IC0xNFEyOTIgLTE0IDIzMCAxMVQxMjMgODFUNTQgMTg4VDI5IDMyNFEyOSAzOTcgNTMgNDU5VDEyMyA1NjZUMjMwIDYzNlQzNjkgNjYxUTQzOCA2NjEgNDg2IDY0NVQ1NjQgNjA1VDYwOSA1NTRUNjIzIDUwM1E2MjMgNDcxIDYwNiA0NTFUNTY3IDQyMFQ1MjcgNDA2VDUwOCA0MDVRNDg5IDQ0MCA0NTYgNDU5VDM4MCA0NzhRMzQ5IDQ3OCAzMjMgNDY3VDI3NyA0MzZUMjQ2IDM4OFQyMzUgMzI0UTIzNSAyODkgMjQ2IDI2MVQyNzYgMjEyVDMyMiAxODBUMzgwIDE2OVE0MjcgMTY5IDQ2MCAxODlUNTEwIDI0N1E1MTEgMjQ5IDUyOSAyNDZUNTY5IDIzMlQ2MDggMjAxVDYyNiAxNDlRNjI2IDEyNSA2MTIgOTdUNTY3IDQ0VDQ4NyAzVDM2OCAtMTRaTTI2NyA3MTVRMjY0IDcyMSAyNzEgNzQxVDI5MyA3ODdUMzI5IDgzNlQzNzYgODc2UTQwMyA4OTIgNDI5IDg5MlE0NjUgODkyIDQ5MCA4NzFUNTE1IDgxOFE1MTUgNzkyIDUwMCA3NjZUNDU4IDcyNVE0MjYgNzA3IDM5NCA3MDFUMzM0IDY5NlQyODkgNzAzVDI2NyA3MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDc7IiBnbHlwaC1uYW1lPSJjYWN1dGUiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0yODYgLTE0UTIyNyAtMTQgMTc4IDVUOTUgNThUNDEgMTQxVDIyIDI0N1EyMiAzMDMgNDEgMzUwVDk2IDQzMlQxNzkgNDg2VDI4NiA1MDVRMzQ1IDUwNSAzODUgNDkyVDQ1MCA0NThUNDg2IDQxNFQ0OTcgMzczUTQ5NyAzNDQgNDgyIDMyN1Q0NDcgMzAxVDQxMiAyOTBUMzk1IDI5MVEzODQgMzIwIDM2MSAzMzhUMjk3IDM1NlEyNTIgMzU2IDIyMyAzMjZUMTk0IDI0N1ExOTQgMTk4IDIyMiAxNjdUMjk3IDEzNVEzMzUgMTM1IDM1OSAxNTNUMzk1IDIwMVEzOTYgMjA0IDQxMiAyMDNUNDQ3IDE5MlQ0ODEgMTY1VDQ5NyAxMTdRNDk3IDk5IDQ4NiA3NlQ0NDkgMzNUMzgzIDBUMjg2IC0xNFpNMTg4IDU2N1ExODUgNTczIDE5MiA1OTNUMjE0IDYzOVQyNTAgNjg4VDI5NyA3MjhRMzI0IDc0NCAzNTAgNzQ0UTM4NiA3NDQgNDExIDcyM1Q0MzYgNjcwUTQzNiA2NDQgNDIxIDYxOFQzNzkgNTc3UTM0NyA1NTkgMzE1IDU1M1QyNTUgNTQ4VDIxMCA1NTVUMTg4IDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGdseXBoLW5hbWU9IkNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjUwIiBkPSJNMzY4IC0xNFEyOTIgLTE0IDIzMCAxMVQxMjMgODFUNTQgMTg4VDI5IDMyNFEyOSAzOTcgNTMgNDU5VDEyMyA1NjZUMjMwIDYzNlQzNjkgNjYxUTQzOCA2NjEgNDg2IDY0NVQ1NjQgNjA1VDYwOSA1NTRUNjIzIDUwM1E2MjMgNDcxIDYwNiA0NTFUNTY3IDQyMFQ1MjcgNDA2VDUwOCA0MDVRNDg5IDQ0MCA0NTYgNDU5VDM4MCA0NzhRMzQ5IDQ3OCAzMjMgNDY3VDI3NyA0MzZUMjQ2IDM4OFQyMzUgMzI0UTIzNSAyODkgMjQ2IDI2MVQyNzYgMjEyVDMyMiAxODBUMzgwIDE2OVE0MjcgMTY5IDQ2MCAxODlUNTEwIDI0N1E1MTEgMjQ5IDUyOSAyNDZUNTY5IDIzMlQ2MDggMjAxVDYyNiAxNDlRNjI2IDEyNSA2MTIgOTdUNTY3IDQ0VDQ4NyAzVDM2OCAtMTRaTTQ2MyA2ODlRNDMyIDY4OSA0MDUgNzEzVDM1OSA3ODFRMzM5IDczOCAzMTIgNzE0VDI1NSA2ODlRMjI3IDY4OSAyMTEgNzA1VDE5NCA3NDdRMTk0IDc3MyAyMTEgNzk4VDI1MyA4NDRUMzA3IDg4MFQzNTkgOTAyUTM4MiA4OTYgNDExIDg4MVQ0NjUgODQ0VDUwNyA3OThUNTI0IDc0N1E1MjQgNzIyIDUwOCA3MDZUNDYzIDY4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwOTsiIGdseXBoLW5hbWU9ImNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTEyIiBkPSJNMjg2IC0xNFEyMjcgLTE0IDE3OCA1VDk1IDU4VDQxIDE0MVQyMiAyNDdRMjIgMzAzIDQxIDM1MFQ5NiA0MzJUMTc5IDQ4NlQyODYgNTA1UTM0NSA1MDUgMzg1IDQ5MlQ0NTAgNDU4VDQ4NiA0MTRUNDk3IDM3M1E0OTcgMzQ0IDQ4MiAzMjdUNDQ3IDMwMVQ0MTIgMjkwVDM5NSAyOTFRMzg0IDMyMCAzNjEgMzM4VDI5NyAzNTZRMjUyIDM1NiAyMjMgMzI2VDE5NCAyNDdRMTk0IDE5OCAyMjIgMTY3VDI5NyAxMzVRMzM1IDEzNSAzNTkgMTUzVDM5NSAyMDFRMzk2IDIwNCA0MTIgMjAzVDQ0NyAxOTJUNDgxIDE2NVQ0OTcgMTE3UTQ5NyA5OSA0ODYgNzZUNDQ5IDMzVDM4MyAwVDI4NiAtMTRaTTM5MCA1NDFRMzU5IDU0MSAzMzIgNTY1VDI4NiA2MzNRMjY2IDU5MCAyMzkgNTY2VDE4MiA1NDFRMTU0IDU0MSAxMzggNTU3VDEyMSA1OTlRMTIxIDYyNSAxMzggNjUwVDE4MCA2OTZUMjM0IDczMlQyODYgNzU0UTMwOSA3NDggMzM4IDczM1QzOTIgNjk2VDQzNCA2NTBUNDUxIDU5OVE0NTEgNTc0IDQzNSA1NThUMzkwIDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQTsiIGdseXBoLW5hbWU9IkNkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI2NTAiIGQ9Ik0zNjggLTE0UTI5MiAtMTQgMjMwIDExVDEyMyA4MVQ1NCAxODhUMjkgMzI0UTI5IDM5NyA1MyA0NTlUMTIzIDU2NlQyMzAgNjM2VDM2OSA2NjFRNDM4IDY2MSA0ODYgNjQ1VDU2NCA2MDVUNjA5IDU1NFQ2MjMgNTAzUTYyMyA0NzEgNjA2IDQ1MVQ1NjcgNDIwVDUyNyA0MDZUNTA4IDQwNVE0ODkgNDQwIDQ1NiA0NTlUMzgwIDQ3OFEzNDkgNDc4IDMyMyA0NjdUMjc3IDQzNlQyNDYgMzg4VDIzNSAzMjRRMjM1IDI4OSAyNDYgMjYxVDI3NiAyMTJUMzIyIDE4MFQzODAgMTY5UTQyNyAxNjkgNDYwIDE4OVQ1MTAgMjQ3UTUxMSAyNDkgNTI5IDI0NlQ1NjkgMjMyVDYwOCAyMDFUNjI2IDE0OVE2MjYgMTI1IDYxMiA5N1Q1NjcgNDRUNDg3IDNUMzY4IC0xNFpNMzY0IDY4OVEzMjAgNjg5IDI5NSA3MTRUMjY5IDc4MFEyNjkgODE5IDI5NSA4NDVUMzY2IDg3MVE0MTAgODcxIDQzNSA4NDVUNDYxIDc4MFE0NjEgNzQwIDQzNSA3MTVUMzY0IDY4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQjsiIGdseXBoLW5hbWU9ImNkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0yODYgLTE0UTIyNyAtMTQgMTc4IDVUOTUgNThUNDEgMTQxVDIyIDI0N1EyMiAzMDMgNDEgMzUwVDk2IDQzMlQxNzkgNDg2VDI4NiA1MDVRMzQ1IDUwNSAzODUgNDkyVDQ1MCA0NThUNDg2IDQxNFQ0OTcgMzczUTQ5NyAzNDQgNDgyIDMyN1Q0NDcgMzAxVDQxMiAyOTBUMzk1IDI5MVEzODQgMzIwIDM2MSAzMzhUMjk3IDM1NlEyNTIgMzU2IDIyMyAzMjZUMTk0IDI0N1ExOTQgMTk4IDIyMiAxNjdUMjk3IDEzNVEzMzUgMTM1IDM1OSAxNTNUMzk1IDIwMVEzOTYgMjA0IDQxMiAyMDNUNDQ3IDE5MlQ0ODEgMTY1VDQ5NyAxMTdRNDk3IDk5IDQ4NiA3NlQ0NDkgMzNUMzgzIDBUMjg2IC0xNFpNMjgyIDU0MVEyMzggNTQxIDIxMyA1NjZUMTg3IDYzMlExODcgNjcxIDIxMyA2OTdUMjg0IDcyM1EzMjggNzIzIDM1MyA2OTdUMzc5IDYzMlEzNzkgNTkyIDM1MyA1NjdUMjgyIDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGdseXBoLW5hbWU9IkNjYXJvbiIgaG9yaXotYWR2LXg9IjY1MCIgZD0iTTM2OCAtMTRRMjkyIC0xNCAyMzAgMTFUMTIzIDgxVDU0IDE4OFQyOSAzMjRRMjkgMzk3IDUzIDQ1OVQxMjMgNTY2VDIzMCA2MzZUMzY5IDY2MVE0MzggNjYxIDQ4NiA2NDVUNTY0IDYwNVQ2MDkgNTU0VDYyMyA1MDNRNjIzIDQ3MSA2MDYgNDUxVDU2NyA0MjBUNTI3IDQwNlQ1MDggNDA1UTQ4OSA0NDAgNDU2IDQ1OVQzODAgNDc4UTM0OSA0NzggMzIzIDQ2N1QyNzcgNDM2VDI0NiAzODhUMjM1IDMyNFEyMzUgMjg5IDI0NiAyNjFUMjc2IDIxMlQzMjIgMTgwVDM4MCAxNjlRNDI3IDE2OSA0NjAgMTg5VDUxMCAyNDdRNTExIDI0OSA1MjkgMjQ2VDU2OSAyMzJUNjA4IDIwMVQ2MjYgMTQ5UTYyNiAxMjUgNjEyIDk3VDU2NyA0NFQ0ODcgM1QzNjggLTE0Wk0yNTkgODkxUTI4OSA4OTEgMzE2IDg2NlQzNjMgNzk3UTM4MiA4NDEgNDA5IDg2NlQ0NjcgODkxUTQ5NSA4OTEgNTExIDg3NVQ1MjggODMzUTUyOCA4MDcgNTExIDc4MlQ0NjkgNzM2VDQxNSA2OTlUMzYzIDY3N1EzNDAgNjgzIDMxMSA2OThUMjU3IDczNVQyMTUgNzgyVDE5OCA4MzNRMTk4IDg1OCAyMTQgODc0VDI1OSA4OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEQ7IiBnbHlwaC1uYW1lPSJjY2Fyb24iIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik0yODYgLTE0UTIyNyAtMTQgMTc4IDVUOTUgNThUNDEgMTQxVDIyIDI0N1EyMiAzMDMgNDEgMzUwVDk2IDQzMlQxNzkgNDg2VDI4NiA1MDVRMzQ1IDUwNSAzODUgNDkyVDQ1MCA0NThUNDg2IDQxNFQ0OTcgMzczUTQ5NyAzNDQgNDgyIDMyN1Q0NDcgMzAxVDQxMiAyOTBUMzk1IDI5MVEzODQgMzIwIDM2MSAzMzhUMjk3IDM1NlEyNTIgMzU2IDIyMyAzMjZUMTk0IDI0N1ExOTQgMTk4IDIyMiAxNjdUMjk3IDEzNVEzMzUgMTM1IDM1OSAxNTNUMzk1IDIwMVEzOTYgMjA0IDQxMiAyMDNUNDQ3IDE5MlQ0ODEgMTY1VDQ5NyAxMTdRNDk3IDk5IDQ4NiA3NlQ0NDkgMzNUMzgzIDBUMjg2IC0xNFpNMTc5IDc0M1EyMDkgNzQzIDIzNiA3MThUMjgzIDY0OVEzMDIgNjkzIDMyOSA3MThUMzg3IDc0M1E0MTUgNzQzIDQzMSA3MjdUNDQ4IDY4NVE0NDggNjU5IDQzMSA2MzRUMzg5IDU4OFQzMzUgNTUxVDI4MyA1MjlRMjYwIDUzNSAyMzEgNTUwVDE3NyA1ODdUMTM1IDYzNFQxMTggNjg1UTExOCA3MTAgMTM0IDcyNlQxNzkgNzQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBFOyIgZ2x5cGgtbmFtZT0iRGNhcm9uIiBob3Jpei1hZHYteD0iNjkwIiBkPSJNNDYgNTM2UTQ2IDU5MCA3NSA2MThUMTUwIDY0N0gzMjFRNDAxIDY0NyA0NjQgNjI1VDU3MiA1NjFUNjQxIDQ2MFQ2NjUgMzI3UTY2NSAyNTIgNjQxIDE5MlQ1NzEgODlUNDYyIDIzVDMxNyAwSDQ2VjUzNlpNMzEyIDE3MFEzODMgMTcwIDQyNSAyMTBUNDY3IDMyNlE0NjcgMzk5IDQyNiA0MzhUMzE1IDQ3N0gyNDRWMTcwSDMxMlpNMjE2IDg5MVEyNDYgODkxIDI3MyA4NjZUMzIwIDc5N1EzMzkgODQxIDM2NiA4NjZUNDI0IDg5MVE0NTIgODkxIDQ2OCA4NzVUNDg1IDgzM1E0ODUgODA3IDQ2OCA3ODJUNDI2IDczNlQzNzIgNjk5VDMyMCA2NzdRMjk3IDY4MyAyNjggNjk4VDIxNCA3MzVUMTcyIDc4MlQxNTUgODMzUTE1NSA4NTggMTcxIDg3NFQyMTYgODkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBGOyIgZ2x5cGgtbmFtZT0iZGNhcm9uIiBob3Jpei1hZHYteD0iODYyIiBkPSJNMjQ4IC0xNFExOTcgLTE0IDE1NiA1VDg0IDU4VDM4IDE0MVQyMiAyNDdRMjIgMzA3IDM4IDM1NFQ4NCA0MzZUMTU2IDQ4OFQyNTAgNTA2UTI5NyA1MDYgMzM0IDQ4N1QzOTQgNDM4VjY4MlEzOTQgNjg3IDQxNiA2OTVUNDY3IDcwNFE0ODggNzA0IDUwOSA2OThUNTQ3IDY3NVQ1NzQgNjMwVDU4NSA1NThWMEgzOTRWNzZRMzc0IDM0IDMzNyAxMFQyNDggLTE0Wk03MjggNDMzUTcxNSA0MTkgNjk3IDQxN1Q2NjIgNDIxVDYzNyA0NDJUNjMxIDQ3N0w2NjYgNjIyUTY3MCA2NDIgNjc1IDY1N1Q2OTAgNjgxVDcxNCA2OTZUNzUyIDcwMUg3NzNRODA4IDcwMSA4MjcgNjgzVDg0NyA2MjJWNjE1UTg0NyA1NjYgODA0IDUyMkw3MjggNDMzWk0zMDIgMTM1UTM0MiAxMzUgMzY4IDE1OFQzOTQgMjIyVjMwMFEzODIgMzI2IDM1OSAzNDFUMzA0IDM1N1EyNTkgMzU3IDIzMiAzMjhUMjA0IDI0NlEyMDQgMTk2IDIzMSAxNjZUMzAyIDEzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMDsiIGdseXBoLW5hbWU9IkRjcm9hdCIgaG9yaXotYWR2LXg9IjczMSIgZD0iTTY3IDI1N1EzNSAyNTcgMTkgMjc1VDMgMzE3VjMzM1EzIDM1NiAxOSAzNzRUNjcgMzkySDg0VjUzNlE4NCA1OTAgMTEzIDYxOFQxODggNjQ3SDM2MVE0NDAgNjQ3IDUwNCA2MjVUNjEzIDU2MVQ2ODIgNDYwVDcwNiAzMjdRNzA2IDI1MiA2ODIgMTkyVDYxMiA4OVQ1MDIgMjNUMzU3IDBIMTk2UTE3MyAwIDE1MyA4VDExNyAzMlQ5MyA2N1Q4NCAxMTBWMjU3SDY3Wk0zNTMgMTcxUTQyNCAxNzEgNDY2IDIxMVQ1MDkgMzI2UTUwOSAzOTkgNDY4IDQzN1QzNTYgNDc2SDI4M1YzOTJIMzQ5UTM4MiAzOTIgMzk3IDM3NFQ0MTIgMzMzVjMxN1E0MTIgMjkzIDM5NyAyNzVUMzQ5IDI1N0gyODNWMTcxSDM1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMTsiIGdseXBoLW5hbWU9ImRjcm9hdCIgaG9yaXotYWR2LXg9IjYyOSIgZD0iTTI0OCAtMTRRMTk3IC0xNCAxNTYgNVQ4NCA1OFQzOCAxNDFUMjIgMjQ3UTIyIDMwNyAzOCAzNTRUODQgNDM2VDE1NiA0ODhUMjUwIDUwNlEyOTcgNTA2IDMzNCA0ODdUMzk0IDQzOFY1NTJIMzMzUTI5NCA1NTIgMjk0IDU4MFY1OTJRMjk0IDYyMSAzMzMgNjIxSDM5NFY2ODJRMzk0IDY4NyA0MTYgNjk1VDQ2NyA3MDRRNDgzIDcwNCA0OTkgNzAwVDUzMSA2ODdUNTU4IDY2MVQ1NzcgNjIxSDYxMVE2NTAgNjIxIDY1MCA1OTJWNTgwUTY1MCA1NjYgNjQwIDU1OVQ2MTEgNTUySDU4NVYwSDM5NFY3NlEzNzQgMzQgMzM3IDEwVDI0OCAtMTRaTTMwMiAxMzVRMzQwIDEzNSAzNjYgMTU3VDM5NCAyMThWMzAwUTM4MiAzMjYgMzU5IDM0MVQzMDQgMzU3UTI1OSAzNTcgMjMyIDMyOFQyMDQgMjQ2UTIwNCAxOTYgMjMxIDE2NlQzMDIgMTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgZ2x5cGgtbmFtZT0iRW1hY3JvbiIgaG9yaXotYWR2LXg9IjYxNiIgZD0iTTQ2IDBWNTM2UTQ2IDU5MCA3MiA2MThUMTQ4IDY0N0g1ODFWNDc1SDI0NlY0MDhINDk2VjI0OEgyNDZWMTcwSDU4MlYwSDQ2Wk0xOTcgNjk0UTE2MSA2OTQgMTQwIDcxMVQxMTkgNzU5Vjc2N1ExMTkgNzk3IDE0MCA4MTRUMTk3IDgzMkg0MzFRNDY3IDgzMiA0ODggODE1VDUwOSA3NjdWNzU5UTUwOSA3MjggNDg5IDcxMVQ0MzEgNjk0SDE5N0gxOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTM7IiBnbHlwaC1uYW1lPSJlbWFjcm9uIiBob3Jpei1hZHYteD0iNTYzIiBkPSJNMjk4IC0xNFEyMzUgLTE0IDE4NCAzVDk3IDU0VDQyIDEzNFQyMiAyNDJRMjIgMjk5IDQxIDM0N1Q5NiA0MzFUMTgwIDQ4NlQyODYgNTA2UTM0MyA1MDYgMzkwIDQ4OFQ0NzIgNDM2VDUyNSAzNThUNTQ0IDI1OVYyNDdRNTQzIDIyNSA1MzUgMjExVDUwNSAxOTdIMTkyUTIwMSAxNTggMjMxIDEzOVQzMDcgMTE5UTM1MiAxMTkgMzgyIDEzN1Q0MjcgMTgyUTQyNyAxODMgNDQwIDE4MVQ0NzAgMTcwVDUwMSAxNDZUNTE1IDEwMlE1MTUgNTIgNDYwIDE5VDI5OCAtMTRaTTI4NCAzODFRMjQ2IDM4MSAyMjAgMzU3VDE4OSAyOTZIMzcxUTM3MCAzMzQgMzQ3IDM1N1QyODQgMzgxWk0xNzEgNTQ2UTEzNSA1NDYgMTE0IDU2M1Q5MyA2MTFWNjE5UTkzIDY0OSAxMTQgNjY2VDE3MSA2ODRINDA1UTQ0MSA2ODQgNDYyIDY2N1Q0ODMgNjE5VjYxMVE0ODMgNTgwIDQ2MyA1NjNUNDA1IDU0NkgxNzFIMTcxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE0OyIgZ2x5cGgtbmFtZT0iRWJyZXZlIiBob3Jpei1hZHYteD0iNjE2IiBkPSJNNDYgMFY1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDU4MVY0NzVIMjQ2VjQwOEg0OTZWMjQ4SDI0NlYxNzBINTgyVjBINDZaTTMyMiA2ODlRMjc5IDY4OSAyNDEgNzAzVDE3NiA3NDJRMTU5IDc1OSAxNDkgNzc4VDEzOSA4MTdRMTM5IDg0MiAxNTcgODYxVDIwNyA4ODBRMjMwIDg3NSAyNDYgODYzVDI3NSA4MzdUMjk5IDgxM1QzMjIgODAyUTMzNSA4MDIgMzQ1IDgxMlQzNjkgODM2VDM5OCA4NjJUNDM3IDg4MFE0NjkgODgwIDQ4NyA4NjFUNTA1IDgxN1E1MDUgNzc3IDQ2OSA3NDRRNDQ0IDcxOSA0MDUgNzA0VDMyMiA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTU7IiBnbHlwaC1uYW1lPSJlYnJldmUiIGhvcml6LWFkdi14PSI1NjMiIGQ9Ik0yOTggLTE0UTIzNSAtMTQgMTg0IDNUOTcgNTRUNDIgMTM0VDIyIDI0MlEyMiAyOTkgNDEgMzQ3VDk2IDQzMVQxODAgNDg2VDI4NiA1MDZRMzQzIDUwNiAzOTAgNDg4VDQ3MiA0MzZUNTI1IDM1OFQ1NDQgMjU5VjI0N1E1NDMgMjI1IDUzNSAyMTFUNTA1IDE5N0gxOTJRMjAxIDE1OCAyMzEgMTM5VDMwNyAxMTlRMzUyIDExOSAzODIgMTM3VDQyNyAxODJRNDI3IDE4MyA0NDAgMTgxVDQ3MCAxNzBUNTAxIDE0NlQ1MTUgMTAyUTUxNSA1MiA0NjAgMTlUMjk4IC0xNFpNMjg0IDM4MVEyNDYgMzgxIDIyMCAzNTdUMTg5IDI5NkgzNzFRMzcwIDMzNCAzNDcgMzU3VDI4NCAzODFaTTI4OCA1NDFRMjQ1IDU0MSAyMDcgNTU1VDE0MiA1OTRRMTI1IDYxMSAxMTUgNjMwVDEwNSA2NjlRMTA1IDY5NCAxMjMgNzEzVDE3MyA3MzJRMTk2IDcyNyAyMTIgNzE1VDI0MSA2ODlUMjY1IDY2NVQyODggNjU0UTMwMSA2NTQgMzExIDY2NFQzMzUgNjg4VDM2NCA3MTRUNDAzIDczMlE0MzUgNzMyIDQ1MyA3MTNUNDcxIDY2OVE0NzEgNjI5IDQzNSA1OTZRNDEwIDU3MSAzNzEgNTU2VDI4OCA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTY7IiBnbHlwaC1uYW1lPSJFZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjE2IiBkPSJNNDYgMFY1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDU4MVY0NzVIMjQ2VjQwOEg0OTZWMjQ4SDI0NlYxNzBINTgyVjBINDZaTTMyMyA2ODlRMjc5IDY4OSAyNTQgNzE0VDIyOCA3ODBRMjI4IDgxOSAyNTQgODQ1VDMyNSA4NzFRMzY5IDg3MSAzOTQgODQ1VDQyMCA3ODBRNDIwIDc0MCAzOTQgNzE1VDMyMyA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTc7IiBnbHlwaC1uYW1lPSJlZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTYzIiBkPSJNMjk4IC0xNFEyMzUgLTE0IDE4NCAzVDk3IDU0VDQyIDEzNFQyMiAyNDJRMjIgMjk5IDQxIDM0N1Q5NiA0MzFUMTgwIDQ4NlQyODYgNTA2UTM0MyA1MDYgMzkwIDQ4OFQ0NzIgNDM2VDUyNSAzNThUNTQ0IDI1OVYyNDdRNTQzIDIyNSA1MzUgMjExVDUwNSAxOTdIMTkyUTIwMSAxNTggMjMxIDEzOVQzMDcgMTE5UTM1MiAxMTkgMzgyIDEzN1Q0MjcgMTgyUTQyNyAxODMgNDQwIDE4MVQ0NzAgMTcwVDUwMSAxNDZUNTE1IDEwMlE1MTUgNTIgNDYwIDE5VDI5OCAtMTRaTTI4NCAzODFRMjQ2IDM4MSAyMjAgMzU3VDE4OSAyOTZIMzcxUTM3MCAzMzQgMzQ3IDM1N1QyODQgMzgxWk0yODMgNTQxUTIzOSA1NDEgMjE0IDU2NlQxODggNjMyUTE4OCA2NzEgMjE0IDY5N1QyODUgNzIzUTMyOSA3MjMgMzU0IDY5N1QzODAgNjMyUTM4MCA1OTIgMzU0IDU2N1QyODMgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE4OyIgZ2x5cGgtbmFtZT0iRW9nb25layIgaG9yaXotYWR2LXg9IjYxNiIgZD0iTTE0OCAwUTEwMiAwIDc0IDI1VDQ2IDEwMVY1MzZRNDYgNTkwIDcyIDYxOFQxNDggNjQ3SDU4MVY0NzVIMjQ2VjQwOEg0OTZWMjQ4SDI0NlYxNzBINTgyVjBINTQ1UTUxNiAtMjggNTA1IC00NVQ0OTMgLTc3UTQ5MyAtMTA2IDUyMSAtMTA2UTU0MiAtMTA2IDU1MyAtODhRNTY5IC05MCA1NzkgLTEwNFQ1ODkgLTEzN1E1ODkgLTE2NyA1NjYgLTE4N1Q0OTMgLTIwN1E0MzcgLTIwNyA0MDUgLTE4M1QzNzMgLTExM1EzNzMgLTc4IDM5OSAtNDhUNDY3IDBIMTQ4SDE0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExOTsiIGdseXBoLW5hbWU9ImVvZ29uZWsiIGhvcml6LWFkdi14PSI1NjMiIGQ9Ik0yOTggLTE0UTIzNSAtMTQgMTg0IDNUOTcgNTRUNDIgMTM0VDIyIDI0MlEyMiAyOTkgNDEgMzQ3VDk2IDQzMVQxODAgNDg2VDI4NiA1MDZRMzQzIDUwNiAzOTAgNDg4VDQ3MiA0MzZUNTI1IDM1OFQ1NDQgMjU5VjI0N1E1NDMgMjI1IDUzNSAyMTFUNTA1IDE5N0gxOTJRMjAxIDE1OCAyMzEgMTM5VDMwNyAxMTlRMzUyIDExOSAzODIgMTM3VDQyNyAxODJRNDI3IDE4MyA0NDAgMTgxVDQ3MCAxNzBUNTAxIDE0NlQ1MTUgMTAyUTUxNSA1MyA0NjUgMjNRNDMxIC05IDQxOCAtMjhUNDA0IC02M1E0MDQgLTkyIDQzMiAtOTJRNDUzIC05MiA0NjQgLTc0UTQ4MCAtNzYgNDkwIC05MFQ1MDAgLTEyM1E1MDAgLTE1MyA0NzcgLTE3M1Q0MDQgLTE5M1EzNDggLTE5MyAzMTYgLTE2OVQyODQgLTk5UTI4NCAtNzUgMjk2IC01M1QzMzIgLTEzUTMyNCAtMTMgMzE2IC0xM1QyOTggLTE0Wk0yODQgMzgxUTI0NiAzODEgMjIwIDM1N1QxODkgMjk2SDM3MVEzNzAgMzM0IDM0NyAzNTdUMjg0IDM4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQTsiIGdseXBoLW5hbWU9IkVjYXJvbiIgaG9yaXotYWR2LXg9IjYxNiIgZD0iTTQ2IDBWNTM2UTQ2IDU5MCA3MiA2MThUMTQ4IDY0N0g1ODFWNDc1SDI0NlY0MDhINDk2VjI0OEgyNDZWMTcwSDU4MlYwSDQ2Wk0yMTcgODkxUTI0NyA4OTEgMjc0IDg2NlQzMjEgNzk3UTM0MCA4NDEgMzY3IDg2NlQ0MjUgODkxUTQ1MyA4OTEgNDY5IDg3NVQ0ODYgODMzUTQ4NiA4MDcgNDY5IDc4MlQ0MjcgNzM2VDM3MyA2OTlUMzIxIDY3N1EyOTggNjgzIDI2OSA2OThUMjE1IDczNVQxNzMgNzgyVDE1NiA4MzNRMTU2IDg1OCAxNzIgODc0VDIxNyA4OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBnbHlwaC1uYW1lPSJlY2Fyb24iIGhvcml6LWFkdi14PSI1NjMiIGQ9Ik0yOTggLTE0UTIzNSAtMTQgMTg0IDNUOTcgNTRUNDIgMTM0VDIyIDI0MlEyMiAyOTkgNDEgMzQ3VDk2IDQzMVQxODAgNDg2VDI4NiA1MDZRMzQzIDUwNiAzOTAgNDg4VDQ3MiA0MzZUNTI1IDM1OFQ1NDQgMjU5VjI0N1E1NDMgMjI1IDUzNSAyMTFUNTA1IDE5N0gxOTJRMjAxIDE1OCAyMzEgMTM5VDMwNyAxMTlRMzUyIDExOSAzODIgMTM3VDQyNyAxODJRNDI3IDE4MyA0NDAgMTgxVDQ3MCAxNzBUNTAxIDE0NlQ1MTUgMTAyUTUxNSA1MiA0NjAgMTlUMjk4IC0xNFpNMjg0IDM4MVEyNDYgMzgxIDIyMCAzNTdUMTg5IDI5NkgzNzFRMzcwIDMzNCAzNDcgMzU3VDI4NCAzODFaTTE4NSA3NDNRMjE1IDc0MyAyNDIgNzE4VDI4OSA2NDlRMzA4IDY5MyAzMzUgNzE4VDM5MyA3NDNRNDIxIDc0MyA0MzcgNzI3VDQ1NCA2ODVRNDU0IDY1OSA0MzcgNjM0VDM5NSA1ODhUMzQxIDU1MVQyODkgNTI5UTI2NiA1MzUgMjM3IDU1MFQxODMgNTg3VDE0MSA2MzRUMTI0IDY4NVExMjQgNzEwIDE0MCA3MjZUMTg1IDc0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQzsiIGdseXBoLW5hbWU9IkdjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNzI4IiBkPSJNNjI0IC01UTU5NCAtNSA1NjYgMTBUNTI1IDcxUTQ5OSAzMyA0NTIgMTFUMzM3IC0xMVEyNjcgLTExIDIxMCAxNFQxMTMgODNUNTEgMTg5VDI5IDMyNFEyOSAzOTcgNTQgNDU5VDEyNiA1NjZUMjM4IDYzNlQzODMgNjYxUTQ0NCA2NjEgNDkxIDY1MFQ1NzIgNjE4VDYyMiA1NzFUNjM5IDUxMlE2MzkgNDg1IDYyNCA0NjZUNTkxIDQzN1Q1NTcgNDIyVDUzOSA0MjFRNTEzIDQ1NCA0NzYgNDcyVDM5NSA0OTBRMzYwIDQ5MCAzMzEgNDc4VDI3OSA0NDJUMjQ0IDM4N1QyMzEgMzE0UTIzMSAyNzQgMjQyIDI0MlQyNzQgMTg3VDMyMyAxNTJUMzg2IDEzOVE0MzkgMTM5IDQ3MiAxNjFUNTEzIDIyNEgzNjBWMzcxSDYyMlE2NjUgMzcxIDY3OCAzNTBUNjkxIDI4NlYxNVE2OTEgMTAgNjcxIDNUNjI0IC01Wk00NzIgNjg5UTQ0MSA2ODkgNDE0IDcxM1QzNjggNzgxUTM0OCA3MzggMzIxIDcxNFQyNjQgNjg5UTIzNiA2ODkgMjIwIDcwNVQyMDMgNzQ3UTIwMyA3NzMgMjIwIDc5OFQyNjIgODQ0VDMxNiA4ODBUMzY4IDkwMlEzOTEgODk2IDQyMCA4ODFUNDc0IDg0NFQ1MTYgNzk4VDUzMyA3NDdRNTMzIDcyMiA1MTcgNzA2VDQ3MiA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUQ7IiBnbHlwaC1uYW1lPSJnY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjYyOSIgZD0iTTI5MyAtMTk1UTIzMyAtMTk1IDE4OSAtMTg0VDExNSAtMTUzVDcyIC0xMDhUNTcgLTU2UTU3IC0zNSA2NyAtMTlUOTAgN1QxMTQgMjNUMTI3IDI2UTE1MSAtNSAxODYgLTIzVDI3OSAtNDFRMzQyIC00MSAzNzEgLTE3VDQwMSA1OVYxMDRRMzc0IDY5IDMzNSA0OVQyNDQgMjhRMTkzIDI4IDE1MiA0NFQ4MiA5MVQzOCAxNjZUMjIgMjY4UTIyIDMyMSAzOCAzNjRUODUgNDM5VDE1NiA0ODhUMjQ4IDUwNlEyOTcgNTA2IDMzNiA0OTFUNDAxIDQ1MVY0OTZINTg2VjY2UTU4NiAtNjkgNTE1IC0xMzJUMjkzIC0xOTVaTTMwMCAxNzJRMzQ1IDE3MiAzNzIgMTkzVDQwMSAyNTBWMzE1UTM4NSAzMzUgMzYwIDM0OFQzMDIgMzYxUTI1NyAzNjEgMjMxIDMzNVQyMDQgMjY2UTIwNCAyMjMgMjMwIDE5OFQzMDAgMTcyWk00MjQgNTQxUTM5MyA1NDEgMzY2IDU2NVQzMjAgNjMzUTMwMCA1OTAgMjczIDU2NlQyMTYgNTQxUTE4OCA1NDEgMTcyIDU1N1QxNTUgNTk5UTE1NSA2MjUgMTcyIDY1MFQyMTQgNjk2VDI2OCA3MzJUMzIwIDc1NFEzNDMgNzQ4IDM3MiA3MzNUNDI2IDY5NlQ0NjggNjUwVDQ4NSA1OTlRNDg1IDU3NCA0NjkgNTU4VDQyNCA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBnbHlwaC1uYW1lPSJHYnJldmUiIGhvcml6LWFkdi14PSI3MjgiIGQ9Ik02MjQgLTVRNTk0IC01IDU2NiAxMFQ1MjUgNzFRNDk5IDMzIDQ1MiAxMVQzMzcgLTExUTI2NyAtMTEgMjEwIDE0VDExMyA4M1Q1MSAxODlUMjkgMzI0UTI5IDM5NyA1NCA0NTlUMTI2IDU2NlQyMzggNjM2VDM4MyA2NjFRNDQ0IDY2MSA0OTEgNjUwVDU3MiA2MThUNjIyIDU3MVQ2MzkgNTEyUTYzOSA0ODUgNjI0IDQ2NlQ1OTEgNDM3VDU1NyA0MjJUNTM5IDQyMVE1MTMgNDU0IDQ3NiA0NzJUMzk1IDQ5MFEzNjAgNDkwIDMzMSA0NzhUMjc5IDQ0MlQyNDQgMzg3VDIzMSAzMTRRMjMxIDI3NCAyNDIgMjQyVDI3NCAxODdUMzIzIDE1MlQzODYgMTM5UTQzOSAxMzkgNDcyIDE2MVQ1MTMgMjI0SDM2MFYzNzFINjIyUTY2NSAzNzEgNjc4IDM1MFQ2OTEgMjg2VjE1UTY5MSAxMCA2NzEgM1Q2MjQgLTVaTTM2NiA2ODlRMzIzIDY4OSAyODUgNzAzVDIyMCA3NDJRMjAzIDc1OSAxOTMgNzc4VDE4MyA4MTdRMTgzIDg0MiAyMDEgODYxVDI1MSA4ODBRMjc0IDg3NSAyOTAgODYzVDMxOSA4MzdUMzQzIDgxM1QzNjYgODAyUTM3OSA4MDIgMzg5IDgxMlQ0MTMgODM2VDQ0MiA4NjJUNDgxIDg4MFE1MTMgODgwIDUzMSA4NjFUNTQ5IDgxN1E1NDkgNzc3IDUxMyA3NDRRNDg4IDcxOSA0NDkgNzA0VDM2NiA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUY7IiBnbHlwaC1uYW1lPSJnYnJldmUiIGhvcml6LWFkdi14PSI2MjkiIGQ9Ik0yOTMgLTE5NVEyMzMgLTE5NSAxODkgLTE4NFQxMTUgLTE1M1Q3MiAtMTA4VDU3IC01NlE1NyAtMzUgNjcgLTE5VDkwIDdUMTE0IDIzVDEyNyAyNlExNTEgLTUgMTg2IC0yM1QyNzkgLTQxUTM0MiAtNDEgMzcxIC0xN1Q0MDEgNTlWMTA0UTM3NCA2OSAzMzUgNDlUMjQ0IDI4UTE5MyAyOCAxNTIgNDRUODIgOTFUMzggMTY2VDIyIDI2OFEyMiAzMjEgMzggMzY0VDg1IDQzOVQxNTYgNDg4VDI0OCA1MDZRMjk3IDUwNiAzMzYgNDkxVDQwMSA0NTFWNDk2SDU4NlY2NlE1ODYgLTY5IDUxNSAtMTMyVDI5MyAtMTk1Wk0zMDAgMTcyUTM0NSAxNzIgMzcyIDE5M1Q0MDEgMjUwVjMxNVEzODUgMzM1IDM2MCAzNDhUMzAyIDM2MVEyNTcgMzYxIDIzMSAzMzVUMjA0IDI2NlEyMDQgMjIzIDIzMCAxOThUMzAwIDE3MlpNMzI2IDU0MVEyODMgNTQxIDI0NSA1NTVUMTgwIDU5NFExNjMgNjExIDE1MyA2MzBUMTQzIDY2OVExNDMgNjk0IDE2MSA3MTNUMjExIDczMlEyMzQgNzI3IDI1MCA3MTVUMjc5IDY4OVQzMDMgNjY1VDMyNiA2NTRRMzM5IDY1NCAzNDkgNjY0VDM3MyA2ODhUNDAyIDcxNFQ0NDEgNzMyUTQ3MyA3MzIgNDkxIDcxM1Q1MDkgNjY5UTUwOSA2MjkgNDczIDU5NlE0NDggNTcxIDQwOSA1NTZUMzI2IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMDsiIGdseXBoLW5hbWU9Ikdkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI3MjgiIGQ9Ik02MjQgLTVRNTk0IC01IDU2NiAxMFQ1MjUgNzFRNDk5IDMzIDQ1MiAxMVQzMzcgLTExUTI2NyAtMTEgMjEwIDE0VDExMyA4M1Q1MSAxODlUMjkgMzI0UTI5IDM5NyA1NCA0NTlUMTI2IDU2NlQyMzggNjM2VDM4MyA2NjFRNDQ0IDY2MSA0OTEgNjUwVDU3MiA2MThUNjIyIDU3MVQ2MzkgNTEyUTYzOSA0ODUgNjI0IDQ2NlQ1OTEgNDM3VDU1NyA0MjJUNTM5IDQyMVE1MTMgNDU0IDQ3NiA0NzJUMzk1IDQ5MFEzNjAgNDkwIDMzMSA0NzhUMjc5IDQ0MlQyNDQgMzg3VDIzMSAzMTRRMjMxIDI3NCAyNDIgMjQyVDI3NCAxODdUMzIzIDE1MlQzODYgMTM5UTQzOSAxMzkgNDcyIDE2MVQ1MTMgMjI0SDM2MFYzNzFINjIyUTY2NSAzNzEgNjc4IDM1MFQ2OTEgMjg2VjE1UTY5MSAxMCA2NzEgM1Q2MjQgLTVaTTM2OSA2ODlRMzI1IDY4OSAzMDAgNzE0VDI3NCA3ODBRMjc0IDgxOSAzMDAgODQ1VDM3MSA4NzFRNDE1IDg3MSA0NDAgODQ1VDQ2NiA3ODBRNDY2IDc0MCA0NDAgNzE1VDM2OSA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjE7IiBnbHlwaC1uYW1lPSJnZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjI5IiBkPSJNMjkzIC0xOTVRMjMzIC0xOTUgMTg5IC0xODRUMTE1IC0xNTNUNzIgLTEwOFQ1NyAtNTZRNTcgLTM1IDY3IC0xOVQ5MCA3VDExNCAyM1QxMjcgMjZRMTUxIC01IDE4NiAtMjNUMjc5IC00MVEzNDIgLTQxIDM3MSAtMTdUNDAxIDU5VjEwNFEzNzQgNjkgMzM1IDQ5VDI0NCAyOFExOTMgMjggMTUyIDQ0VDgyIDkxVDM4IDE2NlQyMiAyNjhRMjIgMzIxIDM4IDM2NFQ4NSA0MzlUMTU2IDQ4OFQyNDggNTA2UTI5NyA1MDYgMzM2IDQ5MVQ0MDEgNDUxVjQ5Nkg1ODZWNjZRNTg2IC02OSA1MTUgLTEzMlQyOTMgLTE5NVpNMzAwIDE3MlEzNDUgMTcyIDM3MiAxOTNUNDAxIDI1MFYzMTVRMzg1IDMzNSAzNjAgMzQ4VDMwMiAzNjFRMjU3IDM2MSAyMzEgMzM1VDIwNCAyNjZRMjA0IDIyMyAyMzAgMTk4VDMwMCAxNzJaTTMxMCA1NDFRMjY2IDU0MSAyNDEgNTY2VDIxNSA2MzJRMjE1IDY3MSAyNDEgNjk3VDMxMiA3MjNRMzU2IDcyMyAzODEgNjk3VDQwNyA2MzJRNDA3IDU5MiAzODEgNTY3VDMxMCA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjI7IiBnbHlwaC1uYW1lPSJHY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI3MjgiIGQ9Ik02MjQgLTVRNTk0IC01IDU2NiAxMFQ1MjUgNzFRNDk5IDMzIDQ1MiAxMVQzMzcgLTExUTI2NyAtMTEgMjEwIDE0VDExMyA4M1Q1MSAxODlUMjkgMzI0UTI5IDM5NyA1NCA0NTlUMTI2IDU2NlQyMzggNjM2VDM4MyA2NjFRNDQ0IDY2MSA0OTEgNjUwVDU3MiA2MThUNjIyIDU3MVQ2MzkgNTEyUTYzOSA0ODUgNjI0IDQ2NlQ1OTEgNDM3VDU1NyA0MjJUNTM5IDQyMVE1MTMgNDU0IDQ3NiA0NzJUMzk1IDQ5MFEzNjAgNDkwIDMzMSA0NzhUMjc5IDQ0MlQyNDQgMzg3VDIzMSAzMTRRMjMxIDI3NCAyNDIgMjQyVDI3NCAxODdUMzIzIDE1MlQzODYgMTM5UTQzOSAxMzkgNDcyIDE2MVQ1MTMgMjI0SDM2MFYzNzFINjIyUTY2NSAzNzEgNjc4IDM1MFQ2OTEgMjg2VjE1UTY5MSAxMCA2NzEgM1Q2MjQgLTVaTTM2NyAtMjg3UTM1MyAtMzAxIDMzNSAtMzAzVDMwMSAtMjk5VDI3NiAtMjc4VDI3MCAtMjQ0TDMwNSAtMTExUTMwOSAtOTIgMzE0IC03N1QzMjkgLTUzVDM1MyAtMzhUMzkxIC0zM0g0MTJRNDQ4IC0zMyA0NjcgLTUxVDQ4NyAtMTEwVi0xMThRNDg3IC0xNDIgNDc2IC0xNjNUNDQyIC0yMDhMMzY3IC0yODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjM7IiBnbHlwaC1uYW1lPSJnY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI2MjkiIGQ9Ik0zMzEgNzg4UTM0NCA4MDEgMzYyIDgwM1QzOTcgODAwVDQyMiA3NzlUNDI4IDc0NUwzOTMgNjEyUTM4OSA1OTIgMzg0IDU3OFQzNjkgNTU0VDM0NSA1MzlUMzA3IDUzNEgyODZRMjUwIDUzNCAyMzEgNTUyVDIxMSA2MTFWNjE5UTIxMSA2NDMgMjIyIDY2NFQyNTYgNzA5TDMzMSA3ODhaTTI5MyAtMTk1UTIzMyAtMTk1IDE4OSAtMTg0VDExNSAtMTUzVDcyIC0xMDhUNTcgLTU2UTU3IC0zNSA2NyAtMTlUOTAgN1QxMTQgMjNUMTI3IDI2UTE1MSAtNSAxODYgLTIzVDI3OSAtNDFRMzQyIC00MSAzNzEgLTE3VDQwMSA1OVYxMDRRMzc0IDY5IDMzNSA0OVQyNDQgMjhRMTkzIDI4IDE1MiA0NFQ4MiA5MVQzOCAxNjZUMjIgMjY4UTIyIDMyMSAzOCAzNjRUODUgNDM5VDE1NiA0ODhUMjQ4IDUwNlEyOTcgNTA2IDMzNiA0OTFUNDAxIDQ1MVY0OTZINTg2VjY2UTU4NiAtNjkgNTE1IC0xMzJUMjkzIC0xOTVaTTMwMCAxNzJRMzQ1IDE3MiAzNzIgMTkzVDQwMSAyNTBWMzE1UTM4NSAzMzUgMzYwIDM0OFQzMDIgMzYxUTI1NyAzNjEgMjMxIDMzNVQyMDQgMjY2UTIwNCAyMjMgMjMwIDE5OFQzMDAgMTcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI0OyIgZ2x5cGgtbmFtZT0iSGNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3MDAiIGQ9Ik00NiA1NTlRNDYgNjUyIDEzMCA2NTJIMTU5UTI0NyA2NTIgMjQ3IDU1OVY0MDlINDU0VjU1OVE0NTQgNjUyIDUzOCA2NTJINTY4UTY1NSA2NTIgNjU1IDU1OVYwSDQ1NFYyNDFIMjQ3VjBINDZWNTU5Wk00NTMgNjg5UTQyMiA2ODkgMzk1IDcxM1QzNDkgNzgxUTMyOSA3MzggMzAyIDcxNFQyNDUgNjg5UTIxNyA2ODkgMjAxIDcwNVQxODQgNzQ3UTE4NCA3NzMgMjAxIDc5OFQyNDMgODQ0VDI5NyA4ODBUMzQ5IDkwMlEzNzIgODk2IDQwMSA4ODFUNDU1IDg0NFQ0OTcgNzk4VDUxNCA3NDdRNTE0IDcyMiA0OTggNzA2VDQ1MyA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjU7IiBnbHlwaC1uYW1lPSJoY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTIzNiA0MTdRMjU4IDQ1NSAyOTUgNDgwVDM5MSA1MDZRNDM5IDUwNiA0NzIgNDg5VDUyNyA0NDRUNTU3IDM4MFQ1NjcgMzAzVjBIMzc1VjI3M1EzNzUgMzA5IDM1OCAzMjlUMzEyIDM1MFEyNzUgMzUwIDI1NiAzMjlUMjM2IDI2OVYwSDQ0VjY4MlE0NCA2ODcgNjYgNjk1VDExOCA3MDRRMTM5IDcwNCAxNjAgNjk4VDE5OCA2NzVUMjI1IDYzMFQyMzYgNTU4VjQxN1pNMjMwIDcxMlExOTkgNzEyIDE3MiA3MzZUMTI2IDgwNFExMDYgNzYxIDc5IDczN1QyMiA3MTJRLTYgNzEyIC0yMiA3MjhULTM5IDc3MFEtMzkgNzk2IC0yMiA4MjFUMjAgODY3VDc0IDkwM1QxMjYgOTI1UTE0OSA5MTkgMTc4IDkwNFQyMzIgODY3VDI3NCA4MjFUMjkxIDc3MFEyOTEgNzQ1IDI3NSA3MjlUMjMwIDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNjsiIGdseXBoLW5hbWU9IkhiYXIiIGhvcml6LWFkdi14PSI3MDAiIGQ9Ik0xMCA0NzdRLTI5IDQ3NyAtMjkgNTA2VjUxOFEtMjkgNTMyIC0xOSA1MzlUMTAgNTQ2SDQ2VjU1OVE0NiA2NTIgMTMwIDY1MkgxNTlRMjQ3IDY1MiAyNDcgNTU5VjU0Nkg0NTRWNTU5UTQ1NCA2NTIgNTM4IDY1Mkg1NjhRNjU1IDY1MiA2NTUgNTU5VjU0Nkg2OTVRNzM0IDU0NiA3MzQgNTE4VjUwNlE3MzQgNDc3IDY5NSA0NzdINjU1VjBINDU0VjI0MUgyNDdWMEg0NlY0NzdIMTBaTTQ1NCA0MDlWNDc3SDI0N1Y0MDlINDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI3OyIgZ2x5cGgtbmFtZT0iaGJhciIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTE5IDU1MlEtMjEgNTUyIC0yMSA1ODFWNTkzUS0yMSA2MjEgMTkgNjIxSDQ0VjY4MlE0NCA2ODcgNjYgNjk1VDExOCA3MDRRMTM0IDcwNCAxNTAgNzAwVDE4MiA2ODdUMjA5IDY2MVQyMjggNjIxSDI5NlEzMzUgNjIxIDMzNSA1OTNWNTgxUTMzNSA1NTIgMjk2IDU1MkgyMzZWNDE3UTI1OCA0NTUgMjk1IDQ4MFQzOTEgNTA2UTQzOSA1MDYgNDcyIDQ4OVQ1MjcgNDQ0VDU1NyAzODBUNTY3IDMwM1YwSDM3NVYyNzNRMzc1IDMwOSAzNTggMzI5VDMxMiAzNTBRMjc1IDM1MCAyNTYgMzI5VDIzNiAyNjlWMEg0NFY1NTJIMTlIMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkE7IiBnbHlwaC1uYW1lPSJJbWFjcm9uIiBob3Jpei1hZHYteD0iMzA2IiBkPSJNNTMgNTY2UTUzIDYwOSA3NiA2MzBUMTM3IDY1MUgxNjZRMjA1IDY1MSAyMjkgNjMwVDI1MyA1NjZWMEg1M1Y1NjZaTTM2IDY5NFEwIDY5NCAtMjEgNzExVC00MiA3NTlWNzY3US00MiA3OTcgLTIxIDgxNFQzNiA4MzJIMjcwUTMwNiA4MzIgMzI3IDgxNVQzNDggNzY3Vjc1OVEzNDggNzI4IDMyOCA3MTFUMjcwIDY5NEgzNkgzNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQjsiIGdseXBoLW5hbWU9ImltYWNyb24iIGhvcml6LWFkdi14PSIyODYiIGQ9Ik00NyA0MDlRNDcgNDYxIDcxIDQ4MVQxMzMgNTAxSDE1M1ExOTIgNTAxIDIxNSA0ODJUMjM5IDQwOVYwSDQ3VjQwOVpNMjYgNTQ2US0xMCA1NDYgLTMxIDU2M1QtNTIgNjExVjYxOVEtNTIgNjQ5IC0zMSA2NjZUMjYgNjg0SDI2MFEyOTYgNjg0IDMxNyA2NjdUMzM4IDYxOVY2MTFRMzM4IDU4MCAzMTggNTYzVDI2MCA1NDZIMjZIMjZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkU7IiBnbHlwaC1uYW1lPSJJb2dvbmVrIiBob3Jpei1hZHYteD0iMzA2IiBkPSJNNTMgNTY2UTUzIDYwOSA3NiA2MzBUMTM3IDY1MUgxNjZRMjA1IDY1MSAyMjkgNjMwVDI1MyA1NjZWMEgyMDlRMTgwIC0yOCAxNjggLTQ2VDE1NiAtNzhRMTU2IC0xMDcgMTg0IC0xMDdRMjA1IC0xMDcgMjE2IC04OVEyMzIgLTkxIDI0MiAtMTA1VDI1MiAtMTM4UTI1MiAtMTY4IDIyOSAtMTg4VDE1NiAtMjA4UTEwMCAtMjA4IDY4IC0xODRUMzYgLTExNFEzNiAtNzkgNjIgLTQ4VDEzMyAwSDUzVjU2NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRjsiIGdseXBoLW5hbWU9ImlvZ29uZWsiIGhvcml6LWFkdi14PSIyODYiIGQ9Ik0xNDUgNTUyUTk3IDU1MiA2OSA1NzZUNDEgNjQzUTQxIDY4NSA2OCA3MDlUMTQyIDczM1ExOTAgNzMzIDIxOCA3MDlUMjQ2IDY0M1EyNDYgNjAxIDIxOSA1NzdUMTQ1IDU1MlpNNDcgNDA5UTQ3IDQ2MSA3MSA0ODFUMTMzIDUwMUgxNTNRMTkyIDUwMSAyMTUgNDgyVDIzOSA0MDlWMEgxOThRMTY4IC0yOSAxNTYgLTQ3VDE0NCAtNzlRMTQ0IC0xMDggMTcyIC0xMDhRMTkzIC0xMDggMjA0IC05MFEyMjAgLTkyIDIzMCAtMTA2VDI0MCAtMTM5UTI0MCAtMTY5IDIxNyAtMTg5VDE0NCAtMjA5UTg4IC0yMDkgNTYgLTE4NVQyNCAtMTE1UTI0IC04MCA1MSAtNDlUMTIzIDBINDdWNDA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMwOyIgZ2x5cGgtbmFtZT0iSWRvdCIgaG9yaXotYWR2LXg9IjMwNiIgZD0iTTUzIDU2NlE1MyA2MDkgNzYgNjMwVDEzNyA2NTFIMTY2UTIwNSA2NTEgMjI5IDYzMFQyNTMgNTY2VjBINTNWNTY2Wk0xNTIgNjg5UTEwOCA2ODkgODMgNzE0VDU3IDc4MFE1NyA4MTkgODMgODQ1VDE1NCA4NzFRMTk4IDg3MSAyMjMgODQ1VDI0OSA3ODBRMjQ5IDc0MCAyMjMgNzE1VDE1MiA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzE7IiBnbHlwaC1uYW1lPSJkb3RsZXNzaSIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTQ3IDQwOVE0NyA0NjEgNzEgNDgxVDEzMyA1MDFIMTUzUTE5MiA1MDEgMjE1IDQ4MlQyMzkgNDA5VjBINDdWNDA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgZ2x5cGgtbmFtZT0iSmNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MzgiIGQ9Ik0yMjkgLTE0UTEyNCAtMTQgNzAgMjBUMTUgMTE1UTE1IDE0MyAyNSAxNjJUNDcgMTk0VDY5IDIxMVQ4MSAyMTVRMTI5IDE1NiAxOTkgMTU2UTI0NiAxNTYgMjY2IDE3OVQyODYgMjYwVjY0N0g0ODdWMjU3UTQ4NyAxMTcgNDIyIDUyVDIyOSAtMTRaTTQ4NyA2ODlRNDU2IDY4OSA0MjkgNzEzVDM4MyA3ODFRMzYzIDczOCAzMzYgNzE0VDI3OSA2ODlRMjUxIDY4OSAyMzUgNzA1VDIxOCA3NDdRMjE4IDc3MyAyMzUgNzk4VDI3NyA4NDRUMzMxIDg4MFQzODMgOTAyUTQwNiA4OTYgNDM1IDg4MVQ0ODkgODQ0VDUzMSA3OThUNTQ4IDc0N1E1NDggNzIyIDUzMiA3MDZUNDg3IDY4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGdseXBoLW5hbWU9ImpjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjg2IiBkPSJNMjQ3IDU0MVEyMTYgNTQxIDE4OSA1NjVUMTQzIDYzM1ExMjMgNTkwIDk2IDU2NlQzOSA1NDFRMTEgNTQxIC01IDU1N1QtMjIgNTk5US0yMiA2MjUgLTUgNjUwVDM3IDY5NlQ5MSA3MzJUMTQzIDc1NFExNjYgNzQ4IDE5NSA3MzNUMjQ5IDY5NlQyOTEgNjUwVDMwOCA1OTlRMzA4IDU3NCAyOTIgNTU4VDI0NyA1NDFaTTU4IC0xOThRLTcgLTE5OCAtNDIgLTE3NFQtNzggLTEwMFEtNzggLTg1IC03MyAtNzJULTYxIC00OVQtNDggLTM0VC00MSAtMjlRLTMzIC00MCAtMjAgLTQ1VDcgLTUwUTQ3IC01MCA0NyAtNVY0OTZIMjM5Vi0xNVEyMzkgLTEwMyAxOTMgLTE1MFQ1OCAtMTk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM2OyIgZ2x5cGgtbmFtZT0iS2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjUyIiBkPSJNNDYgNTU5UTQ2IDY1MiAxMzAgNjUySDE1OVEyNDYgNjUyIDI0NiA1NTlWMzY3TDQwMiA1ODRRNDI4IDYyMiA0NTYgNjM3VDUxMiA2NTJRNTM3IDY1MiA1NTkgNjQyVDU5NiA2MTlUNjIwIDU5NFQ2MjYgNTc3TDQ0NSAzMjlMNjM1IDY5UTYzOCA2NCA2MzAgNTJUNjA1IDI4VDU2NSA1VDUxNCAtNVE0ODUgLTUgNDU4IDlUNDA0IDYyTDI0NiAyODFWMEg0NlY1NTlaTTI5MyAtMjg3UTI3OSAtMzAxIDI2MSAtMzAzVDIyNyAtMjk5VDIwMiAtMjc4VDE5NiAtMjQ0TDIzMSAtMTExUTIzNSAtOTIgMjQwIC03N1QyNTUgLTUzVDI3OSAtMzhUMzE3IC0zM0gzMzhRMzc0IC0zMyAzOTMgLTUxVDQxMyAtMTEwVi0xMThRNDEzIC0xNDIgNDAyIC0xNjNUMzY4IC0yMDhMMjkzIC0yODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzc7IiBnbHlwaC1uYW1lPSJrY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1NjEiIGQ9Ik00NCA2ODJRNDQgNjg3IDY2IDY5NVQxMTggNzA0UTEzOSA3MDQgMTYwIDY5OFQxOTggNjc1VDIyNSA2MzBUMjM2IDU1OFYyOTZMMzM1IDQ0NVEzNTUgNDc3IDM4MyA0OTBUNDM2IDUwM1E0NTggNTAzIDQ3NyA0OTZUNTExIDQ3OFQ1MzQgNDU4VDU0MCA0NDRMNDA3IDI1NUw1NTMgNTBRNTU1IDQ2IDU0NyAzN1Q1MjMgMTdUNDg4IDBUNDQ3IC04UTQyMSAtOCAzOTMgNVQzNDMgNTBMMjM2IDIwNVYwSDQ0VjY4MlpNMjYzIC0yODdRMjQ5IC0zMDEgMjMxIC0zMDNUMTk3IC0yOTlUMTcyIC0yNzhUMTY2IC0yNDRMMjAxIC0xMTFRMjA1IC05MiAyMTAgLTc3VDIyNSAtNTNUMjQ5IC0zOFQyODcgLTMzSDMwOFEzNDQgLTMzIDM2MyAtNTFUMzgzIC0xMTBWLTExOFEzODMgLTE0MiAzNzIgLTE2M1QzMzggLTIwOEwyNjMgLTI4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzOTsiIGdseXBoLW5hbWU9IkxhY3V0ZSIgaG9yaXotYWR2LXg9IjU1MiIgZD0iTTQ2IDU1OVE0NiA2NTIgMTMwIDY1MkgxNTlRMjQ2IDY1MiAyNDYgNTU5VjE3NEg0NDNRNTM1IDE3NCA1MzUgOTFWODhRNTM1IDAgNDQzIDBINDZWNTU5Wk02MyA3MTVRNjAgNzIxIDY3IDc0MVQ4OSA3ODdUMTI1IDgzNlQxNzIgODc2UTE5OSA4OTIgMjI1IDg5MlEyNjEgODkyIDI4NiA4NzFUMzExIDgxOFEzMTEgNzkyIDI5NiA3NjZUMjU0IDcyNVEyMjIgNzA3IDE5MCA3MDFUMTMwIDY5NlQ4NSA3MDNUNjMgNzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNBOyIgZ2x5cGgtbmFtZT0ibGFjdXRlIiBob3Jpei1hZHYteD0iMjg2IiBkPSJNNDcgNjgyUTQ3IDY4NyA2OSA2OTVUMTIxIDcwNFExNDIgNzA0IDE2MyA2OThUMjAxIDY3NVQyMjggNjMwVDIzOSA1NThWMEg0N1Y2ODJaTTYzIDc1NlE2MCA3NjIgNjcgNzgyVDg5IDgyOFQxMjUgODc3VDE3MiA5MTdRMTk5IDkzMyAyMjUgOTMzUTI2MSA5MzMgMjg2IDkxMlQzMTEgODU5UTMxMSA4MzMgMjk2IDgwN1QyNTQgNzY2UTIyMiA3NDggMTkwIDc0MlQxMzAgNzM3VDg1IDc0NFQ2MyA3NTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0I7IiBnbHlwaC1uYW1lPSJMY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1NTIiIGQ9Ik00NiA1NTlRNDYgNjUyIDEzMCA2NTJIMTU5UTI0NiA2NTIgMjQ2IDU1OVYxNzRINDQzUTUzNSAxNzQgNTM1IDkxVjg4UTUzNSAwIDQ0MyAwSDQ2VjU1OVpNMjY2IC0yODdRMjUyIC0zMDEgMjM0IC0zMDNUMjAwIC0yOTlUMTc1IC0yNzhUMTY5IC0yNDRMMjA0IC0xMTFRMjA4IC05MiAyMTMgLTc3VDIyOCAtNTNUMjUyIC0zOFQyOTAgLTMzSDMxMVEzNDcgLTMzIDM2NiAtNTFUMzg2IC0xMTBWLTExOFEzODYgLTE0MiAzNzUgLTE2M1QzNDEgLTIwOEwyNjYgLTI4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQzsiIGdseXBoLW5hbWU9Imxjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjI4NiIgZD0iTTQ3IDY4MlE0NyA2ODcgNjkgNjk1VDEyMSA3MDRRMTQyIDcwNCAxNjMgNjk4VDIwMSA2NzVUMjI4IDYzMFQyMzkgNTU4VjBINDdWNjgyWk0xMjAgLTI4N1ExMDYgLTMwMSA4OCAtMzAzVDU0IC0yOTlUMjkgLTI3OFQyMyAtMjQ0TDU4IC0xMTFRNjIgLTkyIDY3IC03N1Q4MiAtNTNUMTA2IC0zOFQxNDQgLTMzSDE2NVEyMDEgLTMzIDIyMCAtNTFUMjQwIC0xMTBWLTExOFEyNDAgLTE0MiAyMjkgLTE2M1QxOTUgLTIwOEwxMjAgLTI4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRDsiIGdseXBoLW5hbWU9IkxjYXJvbiIgaG9yaXotYWR2LXg9IjU1MiIgZD0iTTQzNiAzODhRNDIzIDM3NCA0MDUgMzcyVDM3MCAzNzZUMzQ1IDM5N1QzMzkgNDMyTDM3NCA1NzdRMzc4IDU5NyAzODMgNjEyVDM5OCA2MzZUNDIyIDY1MVQ0NjAgNjU2SDQ4MVE1MTYgNjU2IDUzNSA2MzhUNTU1IDU3N1Y1NzBRNTU1IDUyMSA1MTIgNDc3TDQzNiAzODhaTTQ2IDU1OVE0NiA2NTIgMTMwIDY1MkgxNTlRMjQ2IDY1MiAyNDYgNTU5VjE3NEg0NDNRNTM1IDE3NCA1MzUgOTFWODhRNTM1IDAgNDQzIDBINDZWNTU5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNFOyIgZ2x5cGgtbmFtZT0ibGNhcm9uIiBob3Jpei1hZHYteD0iNTE3IiBkPSJNMzg1IDQzOFEzNzIgNDI0IDM1NCA0MjJUMzE5IDQyNlQyOTQgNDQ3VDI4OCA0ODJMMzIzIDYyN1EzMjcgNjQ3IDMzMiA2NjJUMzQ3IDY4NlQzNzEgNzAxVDQwOSA3MDZINDMwUTQ2NSA3MDYgNDg0IDY4OFQ1MDQgNjI3VjYyMFE1MDQgNTcxIDQ2MSA1MjdMMzg1IDQzOFpNNDcgNjgyUTQ3IDY4NyA2OSA2OTVUMTIxIDcwNFExNDIgNzA0IDE2MyA2OThUMjAxIDY3NVQyMjggNjMwVDIzOSA1NThWMEg0N1Y2ODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBnbHlwaC1uYW1lPSJMZG90IiBob3Jpei1hZHYteD0iNzUxIiBkPSJNNDYgNTU5UTQ2IDY1MiAxMzAgNjUySDE1OVEyNDYgNjUyIDI0NiA1NTlWMTc0SDQ0M1E1MzUgMTc0IDUzNSA5MVY4OFE1MzUgMCA0NDMgMEg0NlY1NTlaTTU5NyAyMzdRNTE1IDIzNyA1MTUgMzE4VjMzNFE1MTUgNDE1IDU5NyA0MTVINjIwUTcwMyA0MTUgNzAzIDMzNFYzMThRNzAzIDIzNyA2MjAgMjM3SDU5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MDsiIGdseXBoLW5hbWU9Imxkb3QiIGhvcml6LWFkdi14PSI0OTYiIGQ9Ik00NyA2ODJRNDcgNjg3IDY5IDY5NVQxMjEgNzA0UTE0MiA3MDQgMTYzIDY5OFQyMDEgNjc1VDIyOCA2MzBUMjM5IDU1OFYwSDQ3VjY4MlpNMzc5IDIzMlEyOTcgMjMyIDI5NyAzMTNWMzI5UTI5NyA0MTAgMzc5IDQxMEg0MDJRNDg1IDQxMCA0ODUgMzI5VjMxM1E0ODUgMjMyIDQwMiAyMzJIMzc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQxOyIgZ2x5cGgtbmFtZT0iTHNsYXNoIiBob3Jpei1hZHYteD0iNTg1IiBkPSJNNDEgMTgyUTM4IDE4MSAzMiAxODdUMjEgMjAzVDExIDIyOFQ2IDI1N1E2IDI3MSA4IDI4M1QxOSAzMDZUNDMgMzI2VDg0IDM0NVY1NTlRODQgNjUyIDE2OSA2NTJIMTk3UTI4NSA2NTIgMjg1IDU1OVY0MDdMNDE0IDQ0N1E0MTggNDQ4IDQyNCA0NDJUNDM1IDQyNlQ0NDUgNDAxVDQ0OSAzNzJRNDQ5IDM1NyA0NDUgMzQ0VDQzMSAzMTlUNDAxIDI5N1QzNTEgMjc3TDI4NSAyNTZWMTc0SDQ3OVE1NzIgMTc0IDU3MiA5MVY4N1E1NzIgMCA0NzkgMEgxODdRMTQxIDAgMTEzIDI1VDg0IDEwMVYxOTVMNDEgMTgySDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQyOyIgZ2x5cGgtbmFtZT0ibHNsYXNoIiBob3Jpei1hZHYteD0iMzcxIiBkPSJNNDEgMTgzUTM4IDE4MiAzMiAxODhUMjAgMjA1VDEwIDIzMFQ2IDI1OVE2IDI3MiA4IDI4NFQyMCAzMDhUNDUgMzI5VDg5IDM0OFY2ODJRODkgNjg3IDExMSA2OTVUMTYyIDcwNFExODMgNzA0IDIwNCA2OThUMjQyIDY3NVQyNjkgNjMwVDI4MCA1NThWNDA3TDMzMiA0MjNRMzM1IDQyNCAzNDEgNDE4VDM1MyA0MDJUMzYzIDM3N1QzNjcgMzQ4UTM2NyAzMTkgMzUxIDI5N1QyODAgMjU2Vjc3UTI4MCAzMCAyNTUgMTFUMTk2IC04SDE3NlExNTggLTggMTQzIC00VDExNSAxMFQ5NiAzNlQ4OSA3N1YxOTdMNDEgMTgzSDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgZ2x5cGgtbmFtZT0iTmFjdXRlIiBob3Jpei1hZHYteD0iNzAzIiBkPSJNNDYgNTU5UTQ2IDYwNiA2OCA2MjlUMTI4IDY1MkgxNDdRMTY1IDY1MiAxNzcgNjUwVDE5OSA2NDFUMjE3IDYyNlQyMzcgNjA1TDQ2OSAzMDNWNjQ3SDY1N1Y4OFE2NTcgNDEgNjM2IDE4VDU3NiAtNUg1NjBRNTQyIC01IDUzMCAtM1Q1MDggNVQ0OTAgMThUNDcxIDM5TDIzNCAzNDZWMEg0NlY1NTlaTTI1OSA3MTVRMjU2IDcyMSAyNjMgNzQxVDI4NSA3ODdUMzIxIDgzNlQzNjggODc2UTM5NSA4OTIgNDIxIDg5MlE0NTcgODkyIDQ4MiA4NzFUNTA3IDgxOFE1MDcgNzkyIDQ5MiA3NjZUNDUwIDcyNVE0MTggNzA3IDM4NiA3MDFUMzI2IDY5NlQyODEgNzAzVDI1OSA3MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDQ7IiBnbHlwaC1uYW1lPSJuYWN1dGUiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik0xMTggNTAxUTEzNCA1MDEgMTUxIDQ5N1QxODMgNDgzVDIwOSA0NTdUMjI4IDQxNVEyNTQgNDU1IDI5MiA0ODBUMzkxIDUwNlE0MzkgNTA2IDQ3MiA0OTBUNTI3IDQ0N1Q1NTcgMzg1VDU2NyAzMTBWMEgzNzVWMjc3UTM3NSAzMTEgMzU4IDMzMFQzMTEgMzUwUTI4NSAzNTAgMjY2IDMzOVQyMzYgMzEwVjBINDRWNDc5UTQ0IDQ4NCA2NiA0OTJUMTE4IDUwMVpNMjEyIDU2N1EyMDkgNTczIDIxNiA1OTNUMjM4IDYzOVQyNzQgNjg4VDMyMSA3MjhRMzQ4IDc0NCAzNzQgNzQ0UTQxMCA3NDQgNDM1IDcyM1Q0NjAgNjcwUTQ2MCA2NDQgNDQ1IDYxOFQ0MDMgNTc3UTM3MSA1NTkgMzM5IDU1M1QyNzkgNTQ4VDIzNCA1NTVUMjEyIDU2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NTsiIGdseXBoLW5hbWU9Ik5jb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjcwMyIgZD0iTTQ2IDU1OVE0NiA2MDYgNjggNjI5VDEyOCA2NTJIMTQ3UTE2NSA2NTIgMTc3IDY1MFQxOTkgNjQxVDIxNyA2MjZUMjM3IDYwNUw0NjkgMzAzVjY0N0g2NTdWODhRNjU3IDQxIDYzNiAxOFQ1NzYgLTVINTYwUTU0MiAtNSA1MzAgLTNUNTA4IDVUNDkwIDE4VDQ3MSAzOUwyMzQgMzQ2VjBINDZWNTU5Wk0zMzEgLTI4N1EzMTcgLTMwMSAyOTkgLTMwM1QyNjUgLTI5OVQyNDAgLTI3OFQyMzQgLTI0NEwyNjkgLTExMVEyNzMgLTkyIDI3OCAtNzdUMjkzIC01M1QzMTcgLTM4VDM1NSAtMzNIMzc2UTQxMiAtMzMgNDMxIC01MVQ0NTEgLTExMFYtMTE4UTQ1MSAtMTQyIDQ0MCAtMTYzVDQwNiAtMjA4TDMzMSAtMjg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ2OyIgZ2x5cGgtbmFtZT0ibmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjA2IiBkPSJNMTE4IDUwMVExMzQgNTAxIDE1MSA0OTdUMTgzIDQ4M1QyMDkgNDU3VDIyOCA0MTVRMjU0IDQ1NSAyOTIgNDgwVDM5MSA1MDZRNDM5IDUwNiA0NzIgNDkwVDUyNyA0NDdUNTU3IDM4NVQ1NjcgMzEwVjBIMzc1VjI3N1EzNzUgMzExIDM1OCAzMzBUMzExIDM1MFEyODUgMzUwIDI2NiAzMzlUMjM2IDMxMFYwSDQ0VjQ3OVE0NCA0ODQgNjYgNDkyVDExOCA1MDFaTTI3NCAtMjg3UTI2MCAtMzAxIDI0MiAtMzAzVDIwOCAtMjk5VDE4MyAtMjc4VDE3NyAtMjQ0TDIxMiAtMTExUTIxNiAtOTIgMjIxIC03N1QyMzYgLTUzVDI2MCAtMzhUMjk4IC0zM0gzMTlRMzU1IC0zMyAzNzQgLTUxVDM5NCAtMTEwVi0xMThRMzk0IC0xNDIgMzgzIC0xNjNUMzQ5IC0yMDhMMjc0IC0yODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDc7IiBnbHlwaC1uYW1lPSJOY2Fyb24iIGhvcml6LWFkdi14PSI3MDMiIGQ9Ik00NiA1NTlRNDYgNjA2IDY4IDYyOVQxMjggNjUySDE0N1ExNjUgNjUyIDE3NyA2NTBUMTk5IDY0MVQyMTcgNjI2VDIzNyA2MDVMNDY5IDMwM1Y2NDdINjU3Vjg4UTY1NyA0MSA2MzYgMThUNTc2IC01SDU2MFE1NDIgLTUgNTMwIC0zVDUwOCA1VDQ5MCAxOFQ0NzEgMzlMMjM0IDM0NlYwSDQ2VjU1OVpNMjQyIDg5MVEyNzIgODkxIDI5OSA4NjZUMzQ2IDc5N1EzNjUgODQxIDM5MiA4NjZUNDUwIDg5MVE0NzggODkxIDQ5NCA4NzVUNTExIDgzM1E1MTEgODA3IDQ5NCA3ODJUNDUyIDczNlQzOTggNjk5VDM0NiA2NzdRMzIzIDY4MyAyOTQgNjk4VDI0MCA3MzVUMTk4IDc4MlQxODEgODMzUTE4MSA4NTggMTk3IDg3NFQyNDIgODkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ4OyIgZ2x5cGgtbmFtZT0ibmNhcm9uIiBob3Jpei1hZHYteD0iNjA2IiBkPSJNMTE4IDUwMVExMzQgNTAxIDE1MSA0OTdUMTgzIDQ4M1QyMDkgNDU3VDIyOCA0MTVRMjU0IDQ1NSAyOTIgNDgwVDM5MSA1MDZRNDM5IDUwNiA0NzIgNDkwVDUyNyA0NDdUNTU3IDM4NVQ1NjcgMzEwVjBIMzc1VjI3N1EzNzUgMzExIDM1OCAzMzBUMzExIDM1MFEyODUgMzUwIDI2NiAzMzlUMjM2IDMxMFYwSDQ0VjQ3OVE0NCA0ODQgNjYgNDkyVDExOCA1MDFaTTE4NSA3NDNRMjE1IDc0MyAyNDIgNzE4VDI4OSA2NDlRMzA4IDY5MyAzMzUgNzE4VDM5MyA3NDNRNDIxIDc0MyA0MzcgNzI3VDQ1NCA2ODVRNDU0IDY1OSA0MzcgNjM0VDM5NSA1ODhUMzQxIDU1MVQyODkgNTI5UTI2NiA1MzUgMjM3IDU1MFQxODMgNTg3VDE0MSA2MzRUMTI0IDY4NVExMjQgNzEwIDE0MCA3MjZUMTg1IDc0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QzsiIGdseXBoLW5hbWU9Ik9tYWNyb24iIGhvcml6LWFkdi14PSI3MzMiIGQ9Ik0zNjcgLTE0UTI5MiAtMTQgMjI5IDExVDEyMSA4MVQ1MSAxODhUMjUgMzI0UTI1IDM5NyA1MCA0NTlUMTIxIDU2NlQyMjkgNjM2VDM2NyA2NjFRNDQyIDY2MSA1MDQgNjM2VDYxMiA1NjdUNjgyIDQ2MFQ3MDggMzI0UTcwOCAyNTAgNjgzIDE4OFQ2MTIgODFUNTA1IDExVDM2NyAtMTRaTTM2NyAxNjVRNDMyIDE2NSA0NzEgMjA4VDUxMCAzMjRRNTEwIDM5NiA0NzEgNDQwVDM2NyA0ODRRMzAxIDQ4NCAyNjIgNDQxVDIyMyAzMjRRMjIzIDI1MiAyNjIgMjA5VDM2NyAxNjVaTTI1OCA2OTRRMjIyIDY5NCAyMDEgNzExVDE4MCA3NTlWNzY3UTE4MCA3OTcgMjAxIDgxNFQyNTggODMySDQ5MlE1MjggODMyIDU0OSA4MTVUNTcwIDc2N1Y3NTlRNTcwIDcyOCA1NTAgNzExVDQ5MiA2OTRIMjU4SDI1OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RDsiIGdseXBoLW5hbWU9Im9tYWNyb24iIGhvcml6LWFkdi14PSI1ODYiIGQ9Ik0yOTIgLTE0UTIzMCAtMTQgMTgxIDRUOTYgNTdUNDEgMTM5VDIyIDI0N1EyMiAzMDUgNDEgMzUzVDk3IDQzNVQxODMgNDg3VDI5NSA1MDZRMzU2IDUwNiA0MDUgNDg4VDQ5MCA0MzVUNTQ0IDM1MlQ1NjQgMjQ2UTU2NCAxODcgNTQ1IDEzOVQ0OTAgNTdUNDA0IDVUMjkyIC0xNFpNMjkzIDEzM1EzNDAgMTMzIDM3MCAxNjVUNDAxIDI0NlE0MDEgMjk3IDM3MSAzMjlUMjkzIDM2MVEyNDUgMzYxIDIxNSAzMjlUMTg1IDI0N1ExODUgMTk2IDIxNSAxNjVUMjkzIDEzM1pNMTc4IDU0NlExNDIgNTQ2IDEyMSA1NjNUMTAwIDYxMVY2MTlRMTAwIDY0OSAxMjEgNjY2VDE3OCA2ODRINDEyUTQ0OCA2ODQgNDY5IDY2N1Q0OTAgNjE5VjYxMVE0OTAgNTgwIDQ3MCA1NjNUNDEyIDU0NkgxNzhIMTc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRFOyIgZ2x5cGgtbmFtZT0iT2JyZXZlIiBob3Jpei1hZHYteD0iNzMzIiBkPSJNMzY3IC0xNFEyOTIgLTE0IDIyOSAxMVQxMjEgODFUNTEgMTg4VDI1IDMyNFEyNSAzOTcgNTAgNDU5VDEyMSA1NjZUMjI5IDYzNlQzNjcgNjYxUTQ0MiA2NjEgNTA0IDYzNlQ2MTIgNTY3VDY4MiA0NjBUNzA4IDMyNFE3MDggMjUwIDY4MyAxODhUNjEyIDgxVDUwNSAxMVQzNjcgLTE0Wk0zNjcgMTY1UTQzMiAxNjUgNDcxIDIwOFQ1MTAgMzI0UTUxMCAzOTYgNDcxIDQ0MFQzNjcgNDg0UTMwMSA0ODQgMjYyIDQ0MVQyMjMgMzI0UTIyMyAyNTIgMjYyIDIwOVQzNjcgMTY1Wk0zNjcgNjg5UTMyNCA2ODkgMjg2IDcwM1QyMjEgNzQyUTIwNCA3NTkgMTk0IDc3OFQxODQgODE3UTE4NCA4NDIgMjAyIDg2MVQyNTIgODgwUTI3NSA4NzUgMjkxIDg2M1QzMjAgODM3VDM0NCA4MTNUMzY3IDgwMlEzODAgODAyIDM5MCA4MTJUNDE0IDgzNlQ0NDMgODYyVDQ4MiA4ODBRNTE0IDg4MCA1MzIgODYxVDU1MCA4MTdRNTUwIDc3NyA1MTQgNzQ0UTQ4OSA3MTkgNDUwIDcwNFQzNjcgNjg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRGOyIgZ2x5cGgtbmFtZT0ib2JyZXZlIiBob3Jpei1hZHYteD0iNTg2IiBkPSJNMjkyIC0xNFEyMzAgLTE0IDE4MSA0VDk2IDU3VDQxIDEzOVQyMiAyNDdRMjIgMzA1IDQxIDM1M1Q5NyA0MzVUMTgzIDQ4N1QyOTUgNTA2UTM1NiA1MDYgNDA1IDQ4OFQ0OTAgNDM1VDU0NCAzNTJUNTY0IDI0NlE1NjQgMTg3IDU0NSAxMzlUNDkwIDU3VDQwNCA1VDI5MiAtMTRaTTI5MyAxMzNRMzQwIDEzMyAzNzAgMTY1VDQwMSAyNDZRNDAxIDI5NyAzNzEgMzI5VDI5MyAzNjFRMjQ1IDM2MSAyMTUgMzI5VDE4NSAyNDdRMTg1IDE5NiAyMTUgMTY1VDI5MyAxMzNaTTI5NSA1NDFRMjUyIDU0MSAyMTQgNTU1VDE0OSA1OTRRMTMyIDYxMSAxMjIgNjMwVDExMiA2NjlRMTEyIDY5NCAxMzAgNzEzVDE4MCA3MzJRMjAzIDcyNyAyMTkgNzE1VDI0OCA2ODlUMjcyIDY2NVQyOTUgNjU0UTMwOCA2NTQgMzE4IDY2NFQzNDIgNjg4VDM3MSA3MTRUNDEwIDczMlE0NDIgNzMyIDQ2MCA3MTNUNDc4IDY2OVE0NzggNjI5IDQ0MiA1OTZRNDE3IDU3MSAzNzggNTU2VDI5NSA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTA7IiBnbHlwaC1uYW1lPSJPaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNzMzIiBkPSJNMzY3IC0xNFEyOTIgLTE0IDIyOSAxMVQxMjEgODFUNTEgMTg4VDI1IDMyNFEyNSAzOTcgNTAgNDU5VDEyMSA1NjZUMjI5IDYzNlQzNjcgNjYxUTQ0MiA2NjEgNTA0IDYzNlQ2MTIgNTY3VDY4MiA0NjBUNzA4IDMyNFE3MDggMjUwIDY4MyAxODhUNjEyIDgxVDUwNSAxMVQzNjcgLTE0Wk0zNjcgMTY1UTQzMiAxNjUgNDcxIDIwOFQ1MTAgMzI0UTUxMCAzOTYgNDcxIDQ0MFQzNjcgNDg0UTMwMSA0ODQgMjYyIDQ0MVQyMjMgMzI0UTIyMyAyNTIgMjYyIDIwOVQzNjcgMTY1Wk00MTcgNzE1UTQxNCA3MjEgNDIxIDc0MVQ0NDMgNzg3VDQ3OSA4MzZUNTI2IDg3NlE1NTMgODkyIDU3OSA4OTJRNjE1IDg5MiA2NDAgODcxVDY2NSA4MThRNjY1IDc5MiA2NTAgNzY2VDYwOCA3MjVRNTc2IDcwNyA1NDQgNzAxVDQ4NCA2OTZUNDM5IDcwM1Q0MTcgNzE1Wk0xNzAgNzE1UTE2NyA3MjEgMTc0IDc0MVQxOTUgNzg3VDIzMSA4MzZUMjc4IDg3NlEzMDcgODkyIDMzMiA4OTJRMzY4IDg5MiAzOTMgODcxVDQxOCA4MThRNDE4IDc5MiA0MDMgNzY2VDM2MSA3MjVRMzI5IDcwNyAyOTcgNzAxVDIzNyA2OTZUMTkyIDcwM1QxNzAgNzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUxOyIgZ2x5cGgtbmFtZT0ib2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjU4NiIgZD0iTTI5MiAtMTRRMjMwIC0xNCAxODEgNFQ5NiA1N1Q0MSAxMzlUMjIgMjQ3UTIyIDMwNSA0MSAzNTNUOTcgNDM1VDE4MyA0ODdUMjk1IDUwNlEzNTYgNTA2IDQwNSA0ODhUNDkwIDQzNVQ1NDQgMzUyVDU2NCAyNDZRNTY0IDE4NyA1NDUgMTM5VDQ5MCA1N1Q0MDQgNVQyOTIgLTE0Wk0yOTMgMTMzUTM0MCAxMzMgMzcwIDE2NVQ0MDEgMjQ2UTQwMSAyOTcgMzcxIDMyOVQyOTMgMzYxUTI0NSAzNjEgMjE1IDMyOVQxODUgMjQ3UTE4NSAxOTYgMjE1IDE2NVQyOTMgMTMzWk0zMDcgNTY3UTMwNCA1NzMgMzExIDU5M1QzMzMgNjM5VDM2OSA2ODhUNDE2IDcyOFE0NDMgNzQ0IDQ2OSA3NDRRNTA1IDc0NCA1MzAgNzIzVDU1NSA2NzBRNTU1IDY0NCA1NDAgNjE4VDQ5OCA1NzdRNDY2IDU1OSA0MzQgNTUzVDM3NCA1NDhUMzI5IDU1NVQzMDcgNTY3Wk02MCA1NjdRNTcgNTczIDY0IDU5M1Q4NSA2MzlUMTIxIDY4OFQxNjggNzI4UTE5NyA3NDQgMjIyIDc0NFEyNTggNzQ0IDI4MyA3MjNUMzA4IDY3MFEzMDggNjQ0IDI5MyA2MThUMjUxIDU3N1EyMTkgNTU5IDE4NyA1NTNUMTI3IDU0OFQ4MiA1NTVUNjAgNTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUyOyIgZ2x5cGgtbmFtZT0iT0UiIGhvcml6LWFkdi14PSIxMDMwIiBkPSJNMzY3IC0xNFEyOTIgLTE0IDIyOSAxMVQxMjEgODFUNTEgMTg4VDI1IDMyNFEyNSAzOTcgNTAgNDU5VDEyMSA1NjZUMjI5IDYzNlQzNjcgNjYxUTM5NiA2NjEgNDIxIDY1OFQ0NzIgNjQ3SDk5MlY0NzVINjY3UTY3OSA0NjMgNjg3IDQ0NlQ2OTcgNDA4SDkwNlYyNDhINjk4UTY5NiAyMjUgNjg4IDIwNVQ2NjYgMTcwSDk5M1YwSDQ3MlE0NDcgLTggNDIxIC0xMVQzNjcgLTE0Wk0zNjcgMTY1UTQzMiAxNjUgNDcxIDIwOFQ1MTAgMzI0UTUxMCAzOTYgNDcxIDQ0MFQzNjcgNDg0UTMwMSA0ODQgMjYyIDQ0MVQyMjMgMzI0UTIyMyAyNTIgMjYyIDIwOVQzNjcgMTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUzOyIgZ2x5cGgtbmFtZT0ib2UiIGhvcml6LWFkdi14PSI5NDIiIGQ9Ik0yOTIgLTE0UTIzMCAtMTQgMTgxIDRUOTYgNTdUNDEgMTM5VDIyIDI0N1EyMiAzMDUgNDEgMzUzVDk3IDQzNVQxODMgNDg3VDI5NSA1MDZRMzUzIDUwNiA0MDAgNDg2VDQ3OSA0MjlRNTQ3IDUwNiA2NjUgNTA2UTcyMiA1MDYgNzY5IDQ4OFQ4NTEgNDM2VDkwNCAzNThUOTIzIDI1OVYyNDdROTIyIDIyNSA5MTQgMjExVDg4NCAxOTdINTcxUTU4MCAxNTggNjEwIDEzOVQ2ODYgMTE5UTczMSAxMTkgNzYxIDEzN1Q4MDYgMTgyUTgwNiAxODMgODE5IDE4MVQ4NDkgMTcwVDg4MCAxNDZUODk0IDEwMlE4OTQgNTIgODM5IDE5VDY3NyAtMTRRNTQxIC0xNCA0NzUgNjBRNDQzIDI1IDM5NyA2VDI5MiAtMTRaTTY2MyAzODFRNjI1IDM4MSA1OTkgMzU3VDU2OCAyOTZINzUwUTc0OSAzMzQgNzI2IDM1N1Q2NjMgMzgxWk0yOTMgMTMzUTM0MCAxMzMgMzcwIDE2NVQ0MDEgMjQ2UTQwMSAyOTcgMzcxIDMyOVQyOTMgMzYxUTI0NSAzNjEgMjE1IDMyOVQxODUgMjQ3UTE4NSAxOTYgMjE1IDE2NVQyOTMgMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU0OyIgZ2x5cGgtbmFtZT0iUmFjdXRlIiBob3Jpei1hZHYteD0iNjUwIiBkPSJNNTA5IC01UTQ4NiAtNSA0NjggMFQ0MzQgMTVUNDA0IDQyVDM3NCA4MEwyODIgMjAySDI0NlYwSDQ2VjUzNlE0NiA1OTAgNzIgNjE4VDE0OCA2NDdIMzQ4UTQ4NCA2NDcgNTUxIDU5M1Q2MTggNDM1UTYxOCAzNjQgNTgzIDMxNVQ0NzggMjQ1TDYyNCA2NFE2MjYgNjEgNjIxIDUwVDYwMSAyN1Q1NjQgNVQ1MDkgLTVaTTI0MyAzNDRIMzI3UTM3MiAzNDQgMzk0IDM2M1Q0MTcgNDE5UTQxNyA0OTUgMzI1IDQ5NUgyNDNWMzQ0Wk0yMTIgNzE1UTIwOSA3MjEgMjE2IDc0MVQyMzggNzg3VDI3NCA4MzZUMzIxIDg3NlEzNDggODkyIDM3NCA4OTJRNDEwIDg5MiA0MzUgODcxVDQ2MCA4MThRNDYwIDc5MiA0NDUgNzY2VDQwMyA3MjVRMzcxIDcwNyAzMzkgNzAxVDI3OSA2OTZUMjM0IDcwM1QyMTIgNzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU1OyIgZ2x5cGgtbmFtZT0icmFjdXRlIiBob3Jpei1hZHYteD0iNDY3IiBkPSJNMTE4IDUwMVExMzQgNTAxIDE1MSA0OTdUMTgzIDQ4M1QyMTAgNDU2VDIyOCA0MTNRMjQyIDQ1NSAyNzIgNDgwVDM0OCA1MDZRMzk2IDUwNiA0MjQgNDc5VDQ1MyA0MDNRNDUzIDM3NCA0NDQgMzU1VDQyMyAzMjNUNDAxIDMwNlQzOTAgMzAyUTM3OCAzMTMgMzYwIDMyMFQzMjEgMzI4UTIzNiAzMjggMjM2IDIwNlYwSDQ0VjQ3OVE0NCA0ODQgNjYgNDkyVDExOCA1MDFaTTE2MCA1NjdRMTU3IDU3MyAxNjQgNTkzVDE4NiA2MzlUMjIyIDY4OFQyNjkgNzI4UTI5NiA3NDQgMzIyIDc0NFEzNTggNzQ0IDM4MyA3MjNUNDA4IDY3MFE0MDggNjQ0IDM5MyA2MThUMzUxIDU3N1EzMTkgNTU5IDI4NyA1NTNUMjI3IDU0OFQxODIgNTU1VDE2MCA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTY7IiBnbHlwaC1uYW1lPSJSY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI2NTAiIGQ9Ik01MDkgLTVRNDg2IC01IDQ2OCAwVDQzNCAxNVQ0MDQgNDJUMzc0IDgwTDI4MiAyMDJIMjQ2VjBINDZWNTM2UTQ2IDU5MCA3MiA2MThUMTQ4IDY0N0gzNDhRNDg0IDY0NyA1NTEgNTkzVDYxOCA0MzVRNjE4IDM2NCA1ODMgMzE1VDQ3OCAyNDVMNjI0IDY0UTYyNiA2MSA2MjEgNTBUNjAxIDI3VDU2NCA1VDUwOSAtNVpNMjQzIDM0NEgzMjdRMzcyIDM0NCAzOTQgMzYzVDQxNyA0MTlRNDE3IDQ5NSAzMjUgNDk1SDI0M1YzNDRaTTMwMCAtMjg3UTI4NiAtMzAxIDI2OCAtMzAzVDIzNCAtMjk5VDIwOSAtMjc4VDIwMyAtMjQ0TDIzOCAtMTExUTI0MiAtOTIgMjQ3IC03N1QyNjIgLTUzVDI4NiAtMzhUMzI0IC0zM0gzNDVRMzgxIC0zMyA0MDAgLTUxVDQyMCAtMTEwVi0xMThRNDIwIC0xNDIgNDA5IC0xNjNUMzc1IC0yMDhMMzAwIC0yODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTc7IiBnbHlwaC1uYW1lPSJyY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0NjciIGQ9Ik0xMTggNTAxUTEzNCA1MDEgMTUxIDQ5N1QxODMgNDgzVDIxMCA0NTZUMjI4IDQxM1EyNDIgNDU1IDI3MiA0ODBUMzQ4IDUwNlEzOTYgNTA2IDQyNCA0NzlUNDUzIDQwM1E0NTMgMzc0IDQ0NCAzNTVUNDIzIDMyM1Q0MDEgMzA2VDM5MCAzMDJRMzc4IDMxMyAzNjAgMzIwVDMyMSAzMjhRMjM2IDMyOCAyMzYgMjA2VjBINDRWNDc5UTQ0IDQ4NCA2NiA0OTJUMTE4IDUwMVpNMTEzIC0yODdROTkgLTMwMSA4MSAtMzAzVDQ3IC0yOTlUMjIgLTI3OFQxNiAtMjQ0TDUxIC0xMTFRNTUgLTkyIDYwIC03N1Q3NSAtNTNUOTkgLTM4VDEzNyAtMzNIMTU4UTE5NCAtMzMgMjEzIC01MVQyMzMgLTExMFYtMTE4UTIzMyAtMTQyIDIyMiAtMTYzVDE4OCAtMjA4TDExMyAtMjg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU4OyIgZ2x5cGgtbmFtZT0iUmNhcm9uIiBob3Jpei1hZHYteD0iNjUwIiBkPSJNNTA5IC01UTQ4NiAtNSA0NjggMFQ0MzQgMTVUNDA0IDQyVDM3NCA4MEwyODIgMjAySDI0NlYwSDQ2VjUzNlE0NiA1OTAgNzIgNjE4VDE0OCA2NDdIMzQ4UTQ4NCA2NDcgNTUxIDU5M1Q2MTggNDM1UTYxOCAzNjQgNTgzIDMxNVQ0NzggMjQ1TDYyNCA2NFE2MjYgNjEgNjIxIDUwVDYwMSAyN1Q1NjQgNVQ1MDkgLTVaTTI0MyAzNDRIMzI3UTM3MiAzNDQgMzk0IDM2M1Q0MTcgNDE5UTQxNyA0OTUgMzI1IDQ5NUgyNDNWMzQ0Wk0yMDMgODkxUTIzMyA4OTEgMjYwIDg2NlQzMDcgNzk3UTMyNiA4NDEgMzUzIDg2NlQ0MTEgODkxUTQzOSA4OTEgNDU1IDg3NVQ0NzIgODMzUTQ3MiA4MDcgNDU1IDc4MlQ0MTMgNzM2VDM1OSA2OTlUMzA3IDY3N1EyODQgNjgzIDI1NSA2OThUMjAxIDczNVQxNTkgNzgyVDE0MiA4MzNRMTQyIDg1OCAxNTggODc0VDIwMyA4OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTk7IiBnbHlwaC1uYW1lPSJyY2Fyb24iIGhvcml6LWFkdi14PSI0NjciIGQ9Ik0xMTggNTAxUTEzNCA1MDEgMTUxIDQ5N1QxODMgNDgzVDIxMCA0NTZUMjI4IDQxM1EyNDIgNDU1IDI3MiA0ODBUMzQ4IDUwNlEzOTYgNTA2IDQyNCA0NzlUNDUzIDQwM1E0NTMgMzc0IDQ0NCAzNTVUNDIzIDMyM1Q0MDEgMzA2VDM5MCAzMDJRMzc4IDMxMyAzNjAgMzIwVDMyMSAzMjhRMjM2IDMyOCAyMzYgMjA2VjBINDRWNDc5UTQ0IDQ4NCA2NiA0OTJUMTE4IDUwMVpNMTM3IDc0M1ExNjcgNzQzIDE5NCA3MThUMjQxIDY0OVEyNjAgNjkzIDI4NyA3MThUMzQ1IDc0M1EzNzMgNzQzIDM4OSA3MjdUNDA2IDY4NVE0MDYgNjU5IDM4OSA2MzRUMzQ3IDU4OFQyOTMgNTUxVDI0MSA1MjlRMjE4IDUzNSAxODkgNTUwVDEzNSA1ODdUOTMgNjM0VDc2IDY4NVE3NiA3MTAgOTIgNzI2VDEzNyA3NDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUE7IiBnbHlwaC1uYW1lPSJTYWN1dGUiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzcgLTE0UTIwNiAtMTQgMTU3IC0zVDc3IDI3VDMzIDY5VDE5IDExOVExOSAxMzcgMjggMTU1VDUwIDE4NlQ3MiAyMDhUODUgMjE0UTEwMSAyMDAgMTIzIDE4N1QxNzAgMTYzVDIyMyAxNDZUMjc3IDEzOVEzMjQgMTM5IDM0NSAxNTJUMzY3IDE5MFEzNjcgMjA1IDM1OCAyMTNUMzM0IDIyN1QyOTcgMjM1VDI1MSAyNDRRMjEwIDI1MiAxNzIgMjY2VDEwMiAzMDNUNTMgMzYxVDM0IDQ0NlEzNCA1NDYgMTA1IDYwM1QzMTAgNjYxUTM3NCA2NjEgNDIwIDY1MVQ0OTYgNjI0VDU0MCA1ODRUNTU0IDUzOFE1NTQgNTE3IDU0NCA0OThUNTIwIDQ2NlQ0OTYgNDQ0VDQ4MyA0MzhRNDUxIDQ2OCA0MDUgNDg4VDMxMiA1MDhRMjI1IDUwOCAyMjUgNDU4UTIyNSA0NDQgMjM0IDQzN1QyNTkgNDI1VDI5NyA0MTdUMzQ1IDQwOFEzOTMgMzk3IDQzNCAzODFUNTA1IDM0MVQ1NTIgMjg0VDU2OSAyMDZRNTY5IDEwMCA0OTcgNDNUMjc3IC0xNFpNMTk2IDcxNVExOTMgNzIxIDIwMCA3NDFUMjIyIDc4N1QyNTggODM2VDMwNSA4NzZRMzMyIDg5MiAzNTggODkyUTM5NCA4OTIgNDE5IDg3MVQ0NDQgODE4UTQ0NCA3OTIgNDI5IDc2NlQzODcgNzI1UTM1NSA3MDcgMzIzIDcwMVQyNjMgNjk2VDIxOCA3MDNUMTk2IDcxNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QjsiIGdseXBoLW5hbWU9InNhY3V0ZSIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTIzNSAtMTFRMTE5IC0xMSA2NiAxOVQxMyAxMDJRMTMgMTE4IDIwIDEzMlQzNiAxNTZUNTIgMTcxVDYyIDE3NlE4OCAxNTIgMTI4IDEzNVQyMjAgMTE4UTI1MCAxMTggMjY2IDEyM1QyODIgMTQzUTI4MiAxNjEgMjYwIDE2NlQyMDEgMTgwUTE3OCAxODUgMTQ4IDE5M1Q5MCAyMThUNDUgMjYzVDI2IDMzN1EyNiAzNzUgNDEgNDA2VDg1IDQ1OVQxNTQgNDkzVDI0NCA1MDVRMzUyIDUwNSA0MDQgNDc1VDQ1NiAzOTJRNDU2IDM3NSA0NDkgMzYxVDQzMSAzMzZUNDEzIDMyMFQ0MDMgMzE1UTM3NiAzNDIgMzM3IDM1OVQyNTkgMzc2UTIzMSAzNzYgMjE2IDM3MVQyMDAgMzQ5UTIwMCAzMzIgMjI0IDMyOFQyODYgMzE0UTMxMCAzMDkgMzQxIDMwMVQ0MDAgMjc1VDQ0OCAyMjlUNDY4IDE1N1E0NjggNzggNDA3IDM0VDIzNSAtMTFaTTE1OCA1NjdRMTU1IDU3MyAxNjIgNTkzVDE4NCA2MzlUMjIwIDY4OFQyNjcgNzI4UTI5NCA3NDQgMzIwIDc0NFEzNTYgNzQ0IDM4MSA3MjNUNDA2IDY3MFE0MDYgNjQ0IDM5MSA2MThUMzQ5IDU3N1EzMTcgNTU5IDI4NSA1NTNUMjI1IDU0OFQxODAgNTU1VDE1OCA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUM7IiBnbHlwaC1uYW1lPSJTY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU4OCIgZD0iTTI3NyAtMTRRMjA2IC0xNCAxNTcgLTNUNzcgMjdUMzMgNjlUMTkgMTE5UTE5IDEzNyAyOCAxNTVUNTAgMTg2VDcyIDIwOFQ4NSAyMTRRMTAxIDIwMCAxMjMgMTg3VDE3MCAxNjNUMjIzIDE0NlQyNzcgMTM5UTMyNCAxMzkgMzQ1IDE1MlQzNjcgMTkwUTM2NyAyMDUgMzU4IDIxM1QzMzQgMjI3VDI5NyAyMzVUMjUxIDI0NFEyMTAgMjUyIDE3MiAyNjZUMTAyIDMwM1Q1MyAzNjFUMzQgNDQ2UTM0IDU0NiAxMDUgNjAzVDMxMCA2NjFRMzc0IDY2MSA0MjAgNjUxVDQ5NiA2MjRUNTQwIDU4NFQ1NTQgNTM4UTU1NCA1MTcgNTQ0IDQ5OFQ1MjAgNDY2VDQ5NiA0NDRUNDgzIDQzOFE0NTEgNDY4IDQwNSA0ODhUMzEyIDUwOFEyMjUgNTA4IDIyNSA0NThRMjI1IDQ0NCAyMzQgNDM3VDI1OSA0MjVUMjk3IDQxN1QzNDUgNDA4UTM5MyAzOTcgNDM0IDM4MVQ1MDUgMzQxVDU1MiAyODRUNTY5IDIwNlE1NjkgMTAwIDQ5NyA0M1QyNzcgLTE0Wk0zOTkgNjg5UTM2OCA2ODkgMzQxIDcxM1QyOTUgNzgxUTI3NSA3MzggMjQ4IDcxNFQxOTEgNjg5UTE2MyA2ODkgMTQ3IDcwNVQxMzAgNzQ3UTEzMCA3NzMgMTQ3IDc5OFQxODkgODQ0VDI0MyA4ODBUMjk1IDkwMlEzMTggODk2IDM0NyA4ODFUNDAxIDg0NFQ0NDMgNzk4VDQ2MCA3NDdRNDYwIDcyMiA0NDQgNzA2VDM5OSA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUQ7IiBnbHlwaC1uYW1lPSJzY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTIzNSAtMTFRMTE5IC0xMSA2NiAxOVQxMyAxMDJRMTMgMTE4IDIwIDEzMlQzNiAxNTZUNTIgMTcxVDYyIDE3NlE4OCAxNTIgMTI4IDEzNVQyMjAgMTE4UTI1MCAxMTggMjY2IDEyM1QyODIgMTQzUTI4MiAxNjEgMjYwIDE2NlQyMDEgMTgwUTE3OCAxODUgMTQ4IDE5M1Q5MCAyMThUNDUgMjYzVDI2IDMzN1EyNiAzNzUgNDEgNDA2VDg1IDQ1OVQxNTQgNDkzVDI0NCA1MDVRMzUyIDUwNSA0MDQgNDc1VDQ1NiAzOTJRNDU2IDM3NSA0NDkgMzYxVDQzMSAzMzZUNDEzIDMyMFQ0MDMgMzE1UTM3NiAzNDIgMzM3IDM1OVQyNTkgMzc2UTIzMSAzNzYgMjE2IDM3MVQyMDAgMzQ5UTIwMCAzMzIgMjI0IDMyOFQyODYgMzE0UTMxMCAzMDkgMzQxIDMwMVQ0MDAgMjc1VDQ0OCAyMjlUNDY4IDE1N1E0NjggNzggNDA3IDM0VDIzNSAtMTFaTTM1MSA1NDFRMzIwIDU0MSAyOTMgNTY1VDI0NyA2MzNRMjI3IDU5MCAyMDAgNTY2VDE0MyA1NDFRMTE1IDU0MSA5OSA1NTdUODIgNTk5UTgyIDYyNSA5OSA2NTBUMTQxIDY5NlQxOTUgNzMyVDI0NyA3NTRRMjcwIDc0OCAyOTkgNzMzVDM1MyA2OTZUMzk1IDY1MFQ0MTIgNTk5UTQxMiA1NzQgMzk2IDU1OFQzNTEgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVFOyIgZ2x5cGgtbmFtZT0iU2NlZGlsbGEiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzcgLTE0UTIwNiAtMTQgMTU3IC0zVDc3IDI3VDMzIDY5VDE5IDExOVExOSAxMzcgMjggMTU1VDUwIDE4NlQ3MiAyMDhUODUgMjE0UTEwMSAyMDAgMTIzIDE4N1QxNzAgMTYzVDIyMyAxNDZUMjc3IDEzOVEzMjQgMTM5IDM0NSAxNTJUMzY3IDE5MFEzNjcgMjA1IDM1OCAyMTNUMzM0IDIyN1QyOTcgMjM1VDI1MSAyNDRRMjEwIDI1MiAxNzIgMjY2VDEwMiAzMDNUNTMgMzYxVDM0IDQ0NlEzNCA1NDYgMTA1IDYwM1QzMTAgNjYxUTM3NCA2NjEgNDIwIDY1MVQ0OTYgNjI0VDU0MCA1ODRUNTU0IDUzOFE1NTQgNTE3IDU0NCA0OThUNTIwIDQ2NlQ0OTYgNDQ0VDQ4MyA0MzhRNDUxIDQ2OCA0MDUgNDg4VDMxMiA1MDhRMjI1IDUwOCAyMjUgNDU4UTIyNSA0NDQgMjM0IDQzN1QyNTkgNDI1VDI5NyA0MTdUMzQ1IDQwOFEzOTMgMzk3IDQzNCAzODFUNTA1IDM0MVQ1NTIgMjg0VDU2OSAyMDZRNTY5IDEwMCA0OTcgNDNUMjc3IC0xNFpNMjY0IC0yMjFRMjUwIC0yMzAgMjMyIC0yMzFUMTk4IC0yMjlUMTczIC0yMTZUMTY4IC0xOTNMMjAyIC05NlEyMDYgLTgzIDIxMiAtNzNUMjI3IC01NlQyNTEgLTQ2VDI4OSAtNDNIMzA5UTM0NSAtNDMgMzY1IC01NlQzODUgLTk1Vi0xMDBRMzg1IC0xMTcgMzc0IC0xMzFUMzM5IC0xNjJMMjY0IC0yMjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUY7IiBnbHlwaC1uYW1lPSJzY2VkaWxsYSIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTIzNSAtMTFRMTE5IC0xMSA2NiAxOVQxMyAxMDJRMTMgMTE4IDIwIDEzMlQzNiAxNTZUNTIgMTcxVDYyIDE3NlE4OCAxNTIgMTI4IDEzNVQyMjAgMTE4UTI1MCAxMTggMjY2IDEyM1QyODIgMTQzUTI4MiAxNjEgMjYwIDE2NlQyMDEgMTgwUTE3OCAxODUgMTQ4IDE5M1Q5MCAyMThUNDUgMjYzVDI2IDMzN1EyNiAzNzUgNDEgNDA2VDg1IDQ1OVQxNTQgNDkzVDI0NCA1MDVRMzUyIDUwNSA0MDQgNDc1VDQ1NiAzOTJRNDU2IDM3NSA0NDkgMzYxVDQzMSAzMzZUNDEzIDMyMFQ0MDMgMzE1UTM3NiAzNDIgMzM3IDM1OVQyNTkgMzc2UTIzMSAzNzYgMjE2IDM3MVQyMDAgMzQ5UTIwMCAzMzIgMjI0IDMyOFQyODYgMzE0UTMxMCAzMDkgMzQxIDMwMVQ0MDAgMjc1VDQ0OCAyMjlUNDY4IDE1N1E0NjggNzggNDA3IDM0VDIzNSAtMTFaTTIwMSAtMjIxUTE4NyAtMjMwIDE2OSAtMjMxVDEzNSAtMjI5VDExMCAtMjE2VDEwNSAtMTkzTDEzOSAtOTZRMTQzIC04MyAxNDkgLTczVDE2NCAtNTZUMTg4IC00NlQyMjYgLTQzSDI0NlEyODIgLTQzIDMwMiAtNTZUMzIyIC05NVYtMTAwUTMyMiAtMTE3IDMxMSAtMTMxVDI3NiAtMTYyTDIwMSAtMjIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYwOyIgZ2x5cGgtbmFtZT0iU2Nhcm9uIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjc3IC0xNFEyMDYgLTE0IDE1NyAtM1Q3NyAyN1QzMyA2OVQxOSAxMTlRMTkgMTM3IDI4IDE1NVQ1MCAxODZUNzIgMjA4VDg1IDIxNFExMDEgMjAwIDEyMyAxODdUMTcwIDE2M1QyMjMgMTQ2VDI3NyAxMzlRMzI0IDEzOSAzNDUgMTUyVDM2NyAxOTBRMzY3IDIwNSAzNTggMjEzVDMzNCAyMjdUMjk3IDIzNVQyNTEgMjQ0UTIxMCAyNTIgMTcyIDI2NlQxMDIgMzAzVDUzIDM2MVQzNCA0NDZRMzQgNTQ2IDEwNSA2MDNUMzEwIDY2MVEzNzQgNjYxIDQyMCA2NTFUNDk2IDYyNFQ1NDAgNTg0VDU1NCA1MzhRNTU0IDUxNyA1NDQgNDk4VDUyMCA0NjZUNDk2IDQ0NFQ0ODMgNDM4UTQ1MSA0NjggNDA1IDQ4OFQzMTIgNTA4UTIyNSA1MDggMjI1IDQ1OFEyMjUgNDQ0IDIzNCA0MzdUMjU5IDQyNVQyOTcgNDE3VDM0NSA0MDhRMzkzIDM5NyA0MzQgMzgxVDUwNSAzNDFUNTUyIDI4NFQ1NjkgMjA2UTU2OSAxMDAgNDk3IDQzVDI3NyAtMTRaTTIwMCA4OThRMjMwIDg5OCAyNTcgODczVDMwNCA4MDRRMzIzIDg0OCAzNTAgODczVDQwOCA4OThRNDM2IDg5OCA0NTIgODgyVDQ2OSA4NDBRNDY5IDgxNCA0NTIgNzg5VDQxMCA3NDNUMzU2IDcwNlQzMDQgNjg0UTI4MSA2OTAgMjUyIDcwNVQxOTggNzQyVDE1NiA3ODlUMTM5IDg0MFExMzkgODY1IDE1NSA4ODFUMjAwIDg5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGdseXBoLW5hbWU9InNjYXJvbiIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTIzNSAtMTFRMTE5IC0xMSA2NiAxOVQxMyAxMDJRMTMgMTE4IDIwIDEzMlQzNiAxNTZUNTIgMTcxVDYyIDE3NlE4OCAxNTIgMTI4IDEzNVQyMjAgMTE4UTI1MCAxMTggMjY2IDEyM1QyODIgMTQzUTI4MiAxNjEgMjYwIDE2NlQyMDEgMTgwUTE3OCAxODUgMTQ4IDE5M1Q5MCAyMThUNDUgMjYzVDI2IDMzN1EyNiAzNzUgNDEgNDA2VDg1IDQ1OVQxNTQgNDkzVDI0NCA1MDVRMzUyIDUwNSA0MDQgNDc1VDQ1NiAzOTJRNDU2IDM3NSA0NDkgMzYxVDQzMSAzMzZUNDEzIDMyMFQ0MDMgMzE1UTM3NiAzNDIgMzM3IDM1OVQyNTkgMzc2UTIzMSAzNzYgMjE2IDM3MVQyMDAgMzQ5UTIwMCAzMzIgMjI0IDMyOFQyODYgMzE0UTMxMCAzMDkgMzQxIDMwMVQ0MDAgMjc1VDQ0OCAyMjlUNDY4IDE1N1E0NjggNzggNDA3IDM0VDIzNSAtMTFaTTEzOCA3NDNRMTY4IDc0MyAxOTUgNzE4VDI0MiA2NDlRMjYxIDY5MyAyODggNzE4VDM0NiA3NDNRMzc0IDc0MyAzOTAgNzI3VDQwNyA2ODVRNDA3IDY1OSAzOTAgNjM0VDM0OCA1ODhUMjk0IDU1MVQyNDIgNTI5UTIxOSA1MzUgMTkwIDU1MFQxMzYgNTg3VDk0IDYzNFQ3NyA2ODVRNzcgNzEwIDkzIDcyNlQxMzggNzQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYyOyIgZ2x5cGgtbmFtZT0iVGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjE5IiBkPSJNMTAyIDQ3M1ExMCA0NzMgMTAgNTYxVjU2NFExMCA2NDcgMTAyIDY0N0g1MTdRNjEwIDY0NyA2MTAgNTY0VjU2MVE2MTAgNDczIDUxNyA0NzNINDEyVjBIMjExVjQ3M0gxMDJaTTI5MiAtMjg3UTI3OCAtMzAxIDI2MCAtMzAzVDIyNiAtMjk5VDIwMSAtMjc4VDE5NSAtMjQ0TDIzMCAtMTExUTIzNCAtOTIgMjM5IC03N1QyNTQgLTUzVDI3OCAtMzhUMzE2IC0zM0gzMzdRMzczIC0zMyAzOTIgLTUxVDQxMiAtMTEwVi0xMThRNDEyIC0xNDIgNDAxIC0xNjNUMzY3IC0yMDhMMjkyIC0yODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjM7IiBnbHlwaC1uYW1lPSJ0Y29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0MzkiIGQ9Ik0xNiA0OTZIOThWNTQ0UTk4IDU5MCAxMjAgNjEzVDE4NCA2MzdIMjAwUTIzOCA2MzcgMjYyIDYxN1QyODYgNTQ0VjQ5Nkg0MTFWMzUxSDI4MlYxODVRMjgyIDEzNSAzMjQgMTM1UTM0NCAxMzUgMzU2IDE0M1QzNzkgMTY1UTM4MCAxNjcgMzg3IDE2M1Q0MDEgMTUwVDQxNSAxMjdUNDIxIDk1UTQyMSA0NyAzODEgMTdUMjcyIC0xNFExODMgLTE0IDE0MSAzMFQ5OCAxNjRWMzUxSDE2VjQ5NlpNMjIzIC0yODdRMjA5IC0zMDEgMTkxIC0zMDNUMTU3IC0yOTlUMTMyIC0yNzhUMTI2IC0yNDRMMTYxIC0xMTFRMTY1IC05MiAxNzAgLTc3VDE4NSAtNTNUMjA5IC0zOFQyNDcgLTMzSDI2OFEzMDQgLTMzIDMyMyAtNTFUMzQzIC0xMTBWLTExOFEzNDMgLTE0MiAzMzIgLTE2M1QyOTggLTIwOEwyMjMgLTI4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGdseXBoLW5hbWU9IlRjYXJvbiIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTEwMiA0NzNRMTAgNDczIDEwIDU2MVY1NjRRMTAgNjQ3IDEwMiA2NDdINTE3UTYxMCA2NDcgNjEwIDU2NFY1NjFRNjEwIDQ3MyA1MTcgNDczSDQxMlYwSDIxMVY0NzNIMTAySDEwMlpNMjA1IDg5MVEyMzUgODkxIDI2MiA4NjZUMzA5IDc5N1EzMjggODQxIDM1NSA4NjZUNDEzIDg5MVE0NDEgODkxIDQ1NyA4NzVUNDc0IDgzM1E0NzQgODA3IDQ1NyA3ODJUNDE1IDczNlQzNjEgNjk5VDMwOSA2NzdRMjg2IDY4MyAyNTcgNjk4VDIwMyA3MzVUMTYxIDc4MlQxNDQgODMzUTE0NCA4NTggMTYwIDg3NFQyMDUgODkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY1OyIgZ2x5cGgtbmFtZT0idGNhcm9uIiBob3Jpei1hZHYteD0iNDQ1IiBkPSJNNDE1IDU0NlE0MDMgNTMzIDM4NiA1MzFUMzUzIDUzNVQzMjggNTU1VDMyMiA1ODhMMzU2IDcyN1EzNjAgNzQ2IDM2NSA3NjBUMzc5IDc4NFQ0MDIgNzk4VDQzOCA4MDNINDU4UTQ5MiA4MDMgNTEwIDc4NVQ1MjkgNzI3VjcyMVE1MjkgNjczIDQ4OCA2MzJMNDE1IDU0NlpNMTYgNDk2SDk4VjU0NFE5OCA1OTAgMTIwIDYxM1QxODQgNjM3SDIwMFEyMzggNjM3IDI2MiA2MTdUMjg2IDU0NFY0OTZINDExVjM1MUgyODJWMTg1UTI4MiAxMzUgMzI0IDEzNVEzNDQgMTM1IDM1NiAxNDNUMzc5IDE2NVEzODAgMTY3IDM4NyAxNjNUNDAxIDE1MFQ0MTUgMTI3VDQyMSA5NVE0MjEgNDcgMzgxIDE3VDI3MiAtMTRRMTgzIC0xNCAxNDEgMzBUOTggMTY0VjM1MUgxNlY0OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBnbHlwaC1uYW1lPSJVbWFjcm9uIiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzM5IC0xMVE0MyAtMTEgNDMgMjg0VjU1OVE0MyA2MDYgNjYgNjI5VDEzMSA2NTJIMTU2UTI0NCA2NTIgMjQ0IDU1OVYyODNRMjQ0IDE2MyAzNDAgMTYzUTM4OSAxNjMgNDEyIDE5MlQ0MzUgMjg0VjU1OVE0MzUgNjA3IDQ1OCA2MjlUNTIzIDY1Mkg1NDlRNjM2IDY1MiA2MzYgNTU5VjI4NFE2MzYgMTM3IDU2MiA2M1QzMzkgLTExWk0yMjUgNjk0UTE4OSA2OTQgMTY4IDcxMVQxNDcgNzU5Vjc2N1ExNDcgNzk3IDE2OCA4MTRUMjI1IDgzMkg0NTlRNDk1IDgzMiA1MTYgODE1VDUzNyA3NjdWNzU5UTUzNyA3MjggNTE3IDcxMVQ0NTkgNjk0SDIyNUgyMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkI7IiBnbHlwaC1uYW1lPSJ1bWFjcm9uIiBob3Jpei1hZHYteD0iNjA2IiBkPSJNNDg4IC01UTQ3MSAtNSA0NTUgLTFUNDIzIDEyVDM5NyAzOFQzNzggNzhRMzUyIDM4IDMxNCAxMlQyMTUgLTE0UTE2NyAtMTQgMTM0IDJUNzkgNDZUNDkgMTA4VDM5IDE4MlY0OTZIMjMxVjIxNlEyMzEgMTgyIDI0OCAxNjNUMjk2IDE0M1EzMjEgMTQzIDM0MCAxNTRUMzcwIDE4MlY0OTZINTYyVjE3UTU2MiAxNSA1NTYgMTFUNTQwIDRUNTE2IC0yVDQ4OCAtNVpNMTg2IDU0NlExNTAgNTQ2IDEyOSA1NjNUMTA4IDYxMVY2MTlRMTA4IDY0OSAxMjkgNjY2VDE4NiA2ODRINDIwUTQ1NiA2ODQgNDc3IDY2N1Q0OTggNjE5VjYxMVE0OTggNTgwIDQ3OCA1NjNUNDIwIDU0NkgxODZIMTg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgZ2x5cGgtbmFtZT0iVWJyZXZlIiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzM5IC0xMVE0MyAtMTEgNDMgMjg0VjU1OVE0MyA2MDYgNjYgNjI5VDEzMSA2NTJIMTU2UTI0NCA2NTIgMjQ0IDU1OVYyODNRMjQ0IDE2MyAzNDAgMTYzUTM4OSAxNjMgNDEyIDE5MlQ0MzUgMjg0VjU1OVE0MzUgNjA3IDQ1OCA2MjlUNTIzIDY1Mkg1NDlRNjM2IDY1MiA2MzYgNTU5VjI4NFE2MzYgMTM3IDU2MiA2M1QzMzkgLTExWk0zNDAgNjg5UTI5NyA2ODkgMjU5IDcwM1QxOTQgNzQyUTE3NyA3NTkgMTY3IDc3OFQxNTcgODE3UTE1NyA4NDIgMTc1IDg2MVQyMjUgODgwUTI0OCA4NzUgMjY0IDg2M1QyOTMgODM3VDMxNyA4MTNUMzQwIDgwMlEzNTMgODAyIDM2MyA4MTJUMzg3IDgzNlQ0MTYgODYyVDQ1NSA4ODBRNDg3IDg4MCA1MDUgODYxVDUyMyA4MTdRNTIzIDc3NyA0ODcgNzQ0UTQ2MiA3MTkgNDIzIDcwNFQzNDAgNjg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZEOyIgZ2x5cGgtbmFtZT0idWJyZXZlIiBob3Jpei1hZHYteD0iNjA2IiBkPSJNNDg4IC01UTQ3MSAtNSA0NTUgLTFUNDIzIDEyVDM5NyAzOFQzNzggNzhRMzUyIDM4IDMxNCAxMlQyMTUgLTE0UTE2NyAtMTQgMTM0IDJUNzkgNDZUNDkgMTA4VDM5IDE4MlY0OTZIMjMxVjIxNlEyMzEgMTgyIDI0OCAxNjNUMjk2IDE0M1EzMjEgMTQzIDM0MCAxNTRUMzcwIDE4MlY0OTZINTYyVjE3UTU2MiAxNSA1NTYgMTFUNTQwIDRUNTE2IC0yVDQ4OCAtNVpNMzAwIDU0MVEyNTcgNTQxIDIxOSA1NTVUMTU0IDU5NFExMzcgNjExIDEyNyA2MzBUMTE3IDY2OVExMTcgNjk0IDEzNSA3MTNUMTg1IDczMlEyMDggNzI3IDIyNCA3MTVUMjUzIDY4OVQyNzcgNjY1VDMwMCA2NTRRMzEzIDY1NCAzMjMgNjY0VDM0NyA2ODhUMzc2IDcxNFQ0MTUgNzMyUTQ0NyA3MzIgNDY1IDcxM1Q0ODMgNjY5UTQ4MyA2MjkgNDQ3IDU5NlE0MjIgNTcxIDM4MyA1NTZUMzAwIDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RTsiIGdseXBoLW5hbWU9IlVyaW5nIiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzM5IC0xMVE0MyAtMTEgNDMgMjg0VjU1OVE0MyA2MDYgNjYgNjI5VDEzMSA2NTJIMTU2UTI0NCA2NTIgMjQ0IDU1OVYyODNRMjQ0IDE2MyAzNDAgMTYzUTM4OSAxNjMgNDEyIDE5MlQ0MzUgMjg0VjU1OVE0MzUgNjA3IDQ1OCA2MjlUNTIzIDY1Mkg1NDlRNjM2IDY1MiA2MzYgNTU5VjI4NFE2MzYgMTM3IDU2MiA2M1QzMzkgLTExWk0zNDEgNjg5UTI4MSA2ODkgMjQ2IDcyNFQyMTEgODE1UTIxMSA4NDIgMjIwIDg2NVQyNDcgOTA1VDI4OSA5MzFUMzQzIDk0MVEzNzIgOTQxIDM5NiA5MzJUNDM3IDkwNVQ0NjMgODY1VDQ3MyA4MTVRNDczIDc4OCA0NjQgNzY1VDQzNyA3MjVUMzk1IDY5OVQzNDEgNjg5Wk0zNDIgNzY3UTM2MiA3NjcgMzc1IDc4MVQzODggODE1UTM4OCA4MzUgMzc1IDg0OVQzNDIgODY0UTMyMiA4NjQgMzA5IDg1MFQyOTYgODE1UTI5NiA3OTQgMzA5IDc4MVQzNDIgNzY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZGOyIgZ2x5cGgtbmFtZT0idXJpbmciIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik00ODggLTVRNDcxIC01IDQ1NSAtMVQ0MjMgMTJUMzk3IDM4VDM3OCA3OFEzNTIgMzggMzE0IDEyVDIxNSAtMTRRMTY3IC0xNCAxMzQgMlQ3OSA0NlQ0OSAxMDhUMzkgMTgyVjQ5NkgyMzFWMjE2UTIzMSAxODIgMjQ4IDE2M1QyOTYgMTQzUTMyMSAxNDMgMzQwIDE1NFQzNzAgMTgyVjQ5Nkg1NjJWMTdRNTYyIDE1IDU1NiAxMVQ1NDAgNFQ1MTYgLTJUNDg4IC01Wk0zMDAgNTI4UTI0MCA1MjggMjA1IDU2M1QxNzAgNjU0UTE3MCA2ODEgMTc5IDcwNFQyMDYgNzQ0VDI0OCA3NzBUMzAyIDc4MFEzMzEgNzgwIDM1NSA3NzFUMzk2IDc0NFQ0MjIgNzA0VDQzMiA2NTRRNDMyIDYyNyA0MjMgNjA0VDM5NiA1NjRUMzU0IDUzOFQzMDAgNTI4Wk0zMDEgNjA2UTMyMSA2MDYgMzM0IDYyMFQzNDcgNjU0UTM0NyA2NzQgMzM0IDY4OFQzMDEgNzAzUTI4MSA3MDMgMjY4IDY4OVQyNTUgNjU0UTI1NSA2MzMgMjY4IDYyMFQzMDEgNjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcwOyIgZ2x5cGgtbmFtZT0iVWh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjY3OSIgZD0iTTMzOSAtMTFRNDMgLTExIDQzIDI4NFY1NTlRNDMgNjA2IDY2IDYyOVQxMzEgNjUySDE1NlEyNDQgNjUyIDI0NCA1NTlWMjgzUTI0NCAxNjMgMzQwIDE2M1EzODkgMTYzIDQxMiAxOTJUNDM1IDI4NFY1NTlRNDM1IDYwNyA0NTggNjI5VDUyMyA2NTJINTQ5UTYzNiA2NTIgNjM2IDU1OVYyODRRNjM2IDEzNyA1NjIgNjNUMzM5IC0xMVpNMzc3IDcxNVEzNzQgNzIxIDM4MSA3NDFUNDAzIDc4N1Q0MzkgODM2VDQ4NiA4NzZRNTEzIDg5MiA1MzkgODkyUTU3NSA4OTIgNjAwIDg3MVQ2MjUgODE4UTYyNSA3OTIgNjEwIDc2NlQ1NjggNzI1UTUzNiA3MDcgNTA0IDcwMVQ0NDQgNjk2VDM5OSA3MDNUMzc3IDcxNVpNMTMwIDcxNVExMjcgNzIxIDEzNCA3NDFUMTU1IDc4N1QxOTEgODM2VDIzOCA4NzZRMjY3IDg5MiAyOTIgODkyUTMyOCA4OTIgMzUzIDg3MVQzNzggODE4UTM3OCA3OTIgMzYzIDc2NlQzMjEgNzI1UTI4OSA3MDcgMjU3IDcwMVQxOTcgNjk2VDE1MiA3MDNUMTMwIDcxNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MTsiIGdseXBoLW5hbWU9InVodW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik00ODggLTVRNDcxIC01IDQ1NSAtMVQ0MjMgMTJUMzk3IDM4VDM3OCA3OFEzNTIgMzggMzE0IDEyVDIxNSAtMTRRMTY3IC0xNCAxMzQgMlQ3OSA0NlQ0OSAxMDhUMzkgMTgyVjQ5NkgyMzFWMjE2UTIzMSAxODIgMjQ4IDE2M1QyOTYgMTQzUTMyMSAxNDMgMzQwIDE1NFQzNzAgMTgyVjQ5Nkg1NjJWMTdRNTYyIDE1IDU1NiAxMVQ1NDAgNFQ1MTYgLTJUNDg4IC01Wk0zMzYgNTY3UTMzMyA1NzMgMzQwIDU5M1QzNjIgNjM5VDM5OCA2ODhUNDQ1IDcyOFE0NzIgNzQ0IDQ5OCA3NDRRNTM0IDc0NCA1NTkgNzIzVDU4NCA2NzBRNTg0IDY0NCA1NjkgNjE4VDUyNyA1NzdRNDk1IDU1OSA0NjMgNTUzVDQwMyA1NDhUMzU4IDU1NVQzMzYgNTY3Wk04OSA1NjdRODYgNTczIDkzIDU5M1QxMTQgNjM5VDE1MCA2ODhUMTk3IDcyOFEyMjYgNzQ0IDI1MSA3NDRRMjg3IDc0NCAzMTIgNzIzVDMzNyA2NzBRMzM3IDY0NCAzMjIgNjE4VDI4MCA1NzdRMjQ4IDU1OSAyMTYgNTUzVDE1NiA1NDhUMTExIDU1NVQ4OSA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBnbHlwaC1uYW1lPSJVb2dvbmVrIiBob3Jpei1hZHYteD0iNjc5IiBkPSJNMzM5IC0xMVE0MyAtMTEgNDMgMjg0VjU1OVE0MyA2MDYgNjYgNjI5VDEzMSA2NTJIMTU2UTI0NCA2NTIgMjQ0IDU1OVYyODNRMjQ0IDE2MyAzNDAgMTYzUTM4OSAxNjMgNDEyIDE5MlQ0MzUgMjg0VjU1OVE0MzUgNjA3IDQ1OCA2MjlUNTIzIDY1Mkg1NDlRNjM2IDY1MiA2MzYgNTU5VjI4NFE2MzYgMTE5IDU0MCA0NVE1MDAgOSA0ODUgLTEyVDQ2OSAtNTBRNDY5IC03OSA0OTcgLTc5UTUxOCAtNzkgNTI5IC02MVE1NDUgLTYzIDU1NSAtNzdUNTY1IC0xMTBRNTY1IC0xNDAgNTQyIC0xNjBUNDY5IC0xODBRNDEzIC0xODAgMzgxIC0xNTZUMzQ5IC04NlEzNDkgLTY1IDM1OSAtNDZUMzg2IC05UTM3NSAtMTAgMzYzIC0xMFQzMzkgLTExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgZ2x5cGgtbmFtZT0idW9nb25layIgaG9yaXotYWR2LXg9IjYwNiIgZD0iTTM2OCAtMTE3UTM2OCAtODIgMzk0IC01MVQ0NjQgLTNRNDM3IDIgNDEzIDE5VDM3OCA3OFEzNTIgMzggMzE0IDEyVDIxNSAtMTRRMTY3IC0xNCAxMzQgMlQ3OSA0NlQ0OSAxMDhUMzkgMTgyVjQ5NkgyMzFWMjE2UTIzMSAxODIgMjQ4IDE2M1QyOTYgMTQzUTMyMSAxNDMgMzQwIDE1NFQzNzAgMTgyVjQ5Nkg1NjJWMTdRNTYyIDEzIDU1NCAxMFE1MTcgLTI1IDUwMyAtNDVUNDg4IC04MVE0ODggLTExMCA1MTYgLTExMFE1MzcgLTExMCA1NDggLTkyUTU2NCAtOTQgNTc0IC0xMDhUNTg0IC0xNDFRNTg0IC0xNzEgNTYxIC0xOTFUNDg4IC0yMTFRNDMyIC0yMTEgNDAwIC0xODdUMzY4IC0xMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzQ7IiBnbHlwaC1uYW1lPSJXY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9Ijk4MyIgZD0iTTMwIDU4MlEyOSA1ODUgMzYgNTk2VDYwIDYxOVQ5OSA2NDBUMTU1IDY1MFExNzAgNjUwIDE4NyA2NDVUMjE5IDYyOFQyNDYgNTk2VDI2NSA1NDNMMzE5IDI2NEwzODcgNTE3UTM5NSA1NTUgNDI1IDU3MlQ0OTcgNTkwUTUzNSA1OTAgNTY1IDU3MVQ2MDQgNTE3TDY3MiAyNjRMNzI2IDU0NlE3MzEgNTc1IDc0MiA1OTVUNzY4IDYyN1Q4MDAgNjQ0VDgzNSA2NTBRODY1IDY1MCA4ODcgNjQxVDkyNCA2MjBUOTQ2IDU5N1Q5NTIgNTgyTDc4NCAwSDU4OUw0OTMgMzM4TDM5OSAwSDIwNUwzMCA1ODJaTTU5NiA2ODRRNTY1IDY4NCA1MzggNzA4VDQ5MiA3NzZRNDcyIDczMyA0NDUgNzA5VDM4OCA2ODRRMzYwIDY4NCAzNDQgNzAwVDMyNyA3NDJRMzI3IDc2OCAzNDQgNzkzVDM4NiA4MzlUNDQwIDg3NVQ0OTIgODk3UTUxNSA4OTEgNTQ0IDg3NlQ1OTggODM5VDY0MCA3OTNUNjU3IDc0MlE2NTcgNzE3IDY0MSA3MDFUNTk2IDY4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NTsiIGdseXBoLW5hbWU9IndjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iODA5IiBkPSJNMTAgNDQ3UTggNDUxIDE5IDQ2MFQ0NyA0NzlUODUgNDk2VDEyNyA1MDNRMTQwIDUwMyAxNTQgNTAwVDE4MCA0ODhUMjAxIDQ2NlQyMTQgNDMwTDI1NiAxOTRMMzE5IDQwMlEzMjcgNDMxIDM1MyA0NDZUNDEzIDQ2MlE0NDYgNDYyIDQ3MSA0NDdUNTA0IDQwMkw1NTkgMjA0TDYwMSA0MzBRNjA5IDQ3MiA2MzMgNDg3VDY4NCA1MDNRNzA1IDUwMyA3MjYgNDk2VDc2MyA0ODBUNzkwIDQ2MVQ3OTkgNDQ3TDY1MiAwSDQ4NUw0MDUgMjUwTDMyNyAwSDE2MEwxMCA0NDdaTTUwOSA1MzlRNDc4IDUzOSA0NTEgNTYzVDQwNSA2MzFRMzg1IDU4OCAzNTggNTY0VDMwMSA1MzlRMjczIDUzOSAyNTcgNTU1VDI0MCA1OTdRMjQwIDYyMyAyNTcgNjQ4VDI5OSA2OTRUMzUzIDczMFQ0MDUgNzUyUTQyOCA3NDYgNDU3IDczMVQ1MTEgNjk0VDU1MyA2NDhUNTcwIDU5N1E1NzAgNTcyIDU1NCA1NTZUNTA5IDUzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NjsiIGdseXBoLW5hbWU9IlljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjM5IiBkPSJNMjIxIDI2OUwtMTYgNjQ3SDIwM0wzMjcgNDMwTDQxNCA1ODFRNDM3IDYxOSA0NjAgNjM1VDUwOSA2NTFRNTQzIDY1MSA1NjggNjQxVDYwOCA2MTdUNjI5IDU5MVQ2MzMgNTc1TDQyMSAyNTNWMEgyMjFWMjY5Wk00MjQgNjg5UTM5MyA2ODkgMzY2IDcxM1QzMjAgNzgxUTMwMCA3MzggMjczIDcxNFQyMTYgNjg5UTE4OCA2ODkgMTcyIDcwNVQxNTUgNzQ3UTE1NSA3NzMgMTcyIDc5OFQyMTQgODQ0VDI2OCA4ODBUMzIwIDkwMlEzNDMgODk2IDM3MiA4ODFUNDI2IDg0NFQ0NjggNzk4VDQ4NSA3NDdRNDg1IDcyMiA0NjkgNzA2VDQyNCA2ODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzc7IiBnbHlwaC1uYW1lPSJ5Y2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU3MCIgZD0iTTI0MyAtMTg4UTIyMiAtMTg4IDIwMyAtMTgxVDE2OSAtMTY1VDE0NiAtMTQ4VDE0MCAtMTM1TDIyMiAzNlEyMDUgNDAgMTkyIDQ4VDE3MyA3MkwtOSA0OTZIMTk1TDI5MCAxOTlMMzc5IDQ5Nkg1NzlMMzQ1IC0xMDNRMzI2IC0xNTEgMzAwIC0xNjlUMjQzIC0xODhaTTM5MiA1NDFRMzYxIDU0MSAzMzQgNTY1VDI4OCA2MzNRMjY4IDU5MCAyNDEgNTY2VDE4NCA1NDFRMTU2IDU0MSAxNDAgNTU3VDEyMyA1OTlRMTIzIDYyNSAxNDAgNjUwVDE4MiA2OTZUMjM2IDczMlQyODggNzU0UTMxMSA3NDggMzQwIDczM1QzOTQgNjk2VDQzNiA2NTBUNDUzIDU5OVE0NTMgNTc0IDQzNyA1NThUMzkyIDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3ODsiIGdseXBoLW5hbWU9IllkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjYzOSIgZD0iTTIyMSAyNjlMLTE2IDY0N0gyMDNMMzI3IDQzMEw0MTQgNTgxUTQzNyA2MTkgNDYwIDYzNVQ1MDkgNjUxUTU0MyA2NTEgNTY4IDY0MVQ2MDggNjE3VDYyOSA1OTFUNjMzIDU3NUw0MjEgMjUzVjBIMjIxVjI2OVpNNDM0IDY5NlEzOTIgNjk2IDM2OCA3MThUMzQ0IDc4NFEzNDQgODI2IDM2NyA4NDlUNDMxIDg3MlE0NzIgODcyIDQ5NiA4NDlUNTIwIDc4NFE1MjAgNzQyIDQ5NiA3MTlUNDM0IDY5NlpNMjA4IDY5NlExNjYgNjk2IDE0MiA3MThUMTE4IDc4NFExMTggODI2IDE0MiA4NDlUMjA0IDg3MlEyNDYgODcyIDI3MCA4NDlUMjk1IDc4NFEyOTUgNzQyIDI3MSA3MTlUMjA4IDY5NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3OTsiIGdseXBoLW5hbWU9IlphY3V0ZSIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTQ1IDExNEwzMjkgNDgySDEzMlE4OCA0ODIgNjYgNDk5VDQ0IDU2MFY1NjlRNDQgNjExIDY2IDYyOVQxMzIgNjQ3SDU4MFY1NDNMMjgxIDE2Nkg1MDlRNTUzIDE2NiA1NzUgMTQ4VDU5NyA4N1Y3OVE1OTcgMzcgNTc1IDE5VDUwOSAwSDQ1VjExNFpNMjM3IDcxNVEyMzQgNzIxIDI0MSA3NDFUMjYzIDc4N1QyOTkgODM2VDM0NiA4NzZRMzczIDg5MiAzOTkgODkyUTQzNSA4OTIgNDYwIDg3MVQ0ODUgODE4UTQ4NSA3OTIgNDcwIDc2NlQ0MjggNzI1UTM5NiA3MDcgMzY0IDcwMVQzMDQgNjk2VDI1OSA3MDNUMjM3IDcxNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QTsiIGdseXBoLW5hbWU9InphY3V0ZSIgaG9yaXotYWR2LXg9IjUwOCIgZD0iTTIzIDExOEwyMzcgMzUySDEwMVEyOCAzNTIgMjggNDIwVjQyN1EyOCA0NjAgNDYgNDc4VDEwMSA0OTZINDc3VjM4MEwyNTcgMTQ1SDQxNVE0ODcgMTQ1IDQ4NyA3N1Y2OVE0ODcgMSA0MTUgMUgyM1YxMThaTTE3OCA1NjdRMTc1IDU3MyAxODIgNTkzVDIwNCA2MzlUMjQwIDY4OFQyODcgNzI4UTMxNCA3NDQgMzQwIDc0NFEzNzYgNzQ0IDQwMSA3MjNUNDI2IDY3MFE0MjYgNjQ0IDQxMSA2MThUMzY5IDU3N1EzMzcgNTU5IDMwNSA1NTNUMjQ1IDU0OFQyMDAgNTU1VDE3OCA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBnbHlwaC1uYW1lPSJaZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjIxIiBkPSJNNDUgMTE0TDMyOSA0ODJIMTMyUTg4IDQ4MiA2NiA0OTlUNDQgNTYwVjU2OVE0NCA2MTEgNjYgNjI5VDEzMiA2NDdINTgwVjU0M0wyODEgMTY2SDUwOVE1NTMgMTY2IDU3NSAxNDhUNTk3IDg3Vjc5UTU5NyAzNyA1NzUgMTlUNTA5IDBINDVWMTE0Wk0zMjAgNjg5UTI3NiA2ODkgMjUxIDcxNFQyMjUgNzgwUTIyNSA4MTkgMjUxIDg0NVQzMjIgODcxUTM2NiA4NzEgMzkxIDg0NVQ0MTcgNzgwUTQxNyA3NDAgMzkxIDcxNVQzMjAgNjg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdDOyIgZ2x5cGgtbmFtZT0iemRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjUwOCIgZD0iTTIzIDExOEwyMzcgMzUySDEwMVEyOCAzNTIgMjggNDIwVjQyN1EyOCA0NjAgNDYgNDc4VDEwMSA0OTZINDc3VjM4MEwyNTcgMTQ1SDQxNVE0ODcgMTQ1IDQ4NyA3N1Y2OVE0ODcgMSA0MTUgMUgyM1YxMThaTTI2MyA1NDFRMjE5IDU0MSAxOTQgNTY2VDE2OCA2MzJRMTY4IDY3MSAxOTQgNjk3VDI2NSA3MjNRMzA5IDcyMyAzMzQgNjk3VDM2MCA2MzJRMzYwIDU5MiAzMzQgNTY3VDI2MyA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0Q7IiBnbHlwaC1uYW1lPSJaY2Fyb24iIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik00NSAxMTRMMzI5IDQ4MkgxMzJRODggNDgyIDY2IDQ5OVQ0NCA1NjBWNTY5UTQ0IDYxMSA2NiA2MjlUMTMyIDY0N0g1ODBWNTQzTDI4MSAxNjZINTA5UTU1MyAxNjYgNTc1IDE0OFQ1OTcgODdWNzlRNTk3IDM3IDU3NSAxOVQ1MDkgMEg0NVYxMTRaTTE5NyA4OThRMjI3IDg5OCAyNTQgODczVDMwMSA4MDRRMzIwIDg0OCAzNDcgODczVDQwNSA4OThRNDMzIDg5OCA0NDkgODgyVDQ2NiA4NDBRNDY2IDgxNCA0NDkgNzg5VDQwNyA3NDNUMzUzIDcwNlQzMDEgNjg0UTI3OCA2OTAgMjQ5IDcwNVQxOTUgNzQyVDE1MyA3ODlUMTM2IDg0MFExMzYgODY1IDE1MiA4ODFUMTk3IDg5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGdseXBoLW5hbWU9InpjYXJvbiIgaG9yaXotYWR2LXg9IjUwOCIgZD0iTTIzIDExOEwyMzcgMzUySDEwMVEyOCAzNTIgMjggNDIwVjQyN1EyOCA0NjAgNDYgNDc4VDEwMSA0OTZINDc3VjM4MEwyNTcgMTQ1SDQxNVE0ODcgMTQ1IDQ4NyA3N1Y2OVE0ODcgMSA0MTUgMUgyM1YxMThaTTE0MyA3NDNRMTczIDc0MyAyMDAgNzE4VDI0NyA2NDlRMjY2IDY5MyAyOTMgNzE4VDM1MSA3NDNRMzc5IDc0MyAzOTUgNzI3VDQxMiA2ODVRNDEyIDY1OSAzOTUgNjM0VDM1MyA1ODhUMjk5IDU1MVQyNDcgNTI5UTIyNCA1MzUgMTk1IDU1MFQxNDEgNTg3VDk5IDYzNFQ4MiA2ODVRODIgNzEwIDk4IDcyNlQxNDMgNzQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTkyOyIgZ2x5cGgtbmFtZT0iZmxvcmluIiBob3Jpei1hZHYteD0iNDk2IiBkPSJNMTAyIDI3NlEyNSAyNzYgMjUgMzQ1VjM1NVEyNSA0MjAgMTAyIDQyMEgxMzNMMTQzIDQ3NVExNTIgNTI3IDE3MCA1NjJUMjEyIDYxOFQyNjggNjQ5VDMzNSA2NThRNDkwIDY1OCA0OTAgNTU5UTQ5MCA1MzkgNDgyIDUyM1Q0NjUgNDk2VDQ0NyA0ODBUNDM4IDQ3NVE0MjkgNDg2IDQxNCA0OTVUMzc4IDUwNVEzNTUgNTA1IDM0MyA0OTRUMzI2IDQ1M0wzMTkgNDIwSDM1NVE0MzMgNDIwIDQzMyAzNTJWMzQxUTQzMyAyNzYgMzU1IDI3NkgzMDBMMjcyIDExNFEyNjQgNzIgMjUwIDQ2VDIxOCA2VDE4MSAtMTRUMTQ1IC0xOVExMjUgLTE5IDExMCAtMTZUODMgLTdUNjcgM1Q2MSAxMUwxMDggMjc2SDEwMkgxMDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTg7IiBnbHlwaC1uYW1lPSJTY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzcgLTE0UTIwNiAtMTQgMTU3IC0zVDc3IDI3VDMzIDY5VDE5IDExOVExOSAxMzcgMjggMTU1VDUwIDE4NlQ3MiAyMDhUODUgMjE0UTEwMSAyMDAgMTIzIDE4N1QxNzAgMTYzVDIyMyAxNDZUMjc3IDEzOVEzMjQgMTM5IDM0NSAxNTJUMzY3IDE5MFEzNjcgMjA1IDM1OCAyMTNUMzM0IDIyN1QyOTcgMjM1VDI1MSAyNDRRMjEwIDI1MiAxNzIgMjY2VDEwMiAzMDNUNTMgMzYxVDM0IDQ0NlEzNCA1NDYgMTA1IDYwM1QzMTAgNjYxUTM3NCA2NjEgNDIwIDY1MVQ0OTYgNjI0VDU0MCA1ODRUNTU0IDUzOFE1NTQgNTE3IDU0NCA0OThUNTIwIDQ2NlQ0OTYgNDQ0VDQ4MyA0MzhRNDUxIDQ2OCA0MDUgNDg4VDMxMiA1MDhRMjI1IDUwOCAyMjUgNDU4UTIyNSA0NDQgMjM0IDQzN1QyNTkgNDI1VDI5NyA0MTdUMzQ1IDQwOFEzOTMgMzk3IDQzNCAzODFUNTA1IDM0MVQ1NTIgMjg0VDU2OSAyMDZRNTY5IDEwMCA0OTcgNDNUMjc3IC0xNFpNMjY0IC0yODdRMjUwIC0zMDEgMjMyIC0zMDNUMTk4IC0yOTlUMTczIC0yNzhUMTY3IC0yNDRMMjAyIC0xMTFRMjA2IC05MiAyMTEgLTc3VDIyNiAtNTNUMjUwIC0zOFQyODggLTMzSDMwOVEzNDUgLTMzIDM2NCAtNTFUMzg0IC0xMTBWLTExOFEzODQgLTE0MiAzNzMgLTE2M1QzMzkgLTIwOEwyNjQgLTI4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxOTsiIGdseXBoLW5hbWU9InNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjQ5MiIgZD0iTTIzNSAtMTFRMTE5IC0xMSA2NiAxOVQxMyAxMDJRMTMgMTE4IDIwIDEzMlQzNiAxNTZUNTIgMTcxVDYyIDE3NlE4OCAxNTIgMTI4IDEzNVQyMjAgMTE4UTI1MCAxMTggMjY2IDEyM1QyODIgMTQzUTI4MiAxNjEgMjYwIDE2NlQyMDEgMTgwUTE3OCAxODUgMTQ4IDE5M1Q5MCAyMThUNDUgMjYzVDI2IDMzN1EyNiAzNzUgNDEgNDA2VDg1IDQ1OVQxNTQgNDkzVDI0NCA1MDVRMzUyIDUwNSA0MDQgNDc1VDQ1NiAzOTJRNDU2IDM3NSA0NDkgMzYxVDQzMSAzMzZUNDEzIDMyMFQ0MDMgMzE1UTM3NiAzNDIgMzM3IDM1OVQyNTkgMzc2UTIzMSAzNzYgMjE2IDM3MVQyMDAgMzQ5UTIwMCAzMzIgMjI0IDMyOFQyODYgMzE0UTMxMCAzMDkgMzQxIDMwMVQ0MDAgMjc1VDQ0OCAyMjlUNDY4IDE1N1E0NjggNzggNDA3IDM0VDIzNSAtMTFaTTIwMSAtMjg3UTE4NyAtMzAxIDE2OSAtMzAzVDEzNSAtMjk5VDExMCAtMjc4VDEwNCAtMjQ0TDEzOSAtMTExUTE0MyAtOTIgMTQ4IC03N1QxNjMgLTUzVDE4NyAtMzhUMjI1IC0zM0gyNDZRMjgyIC0zMyAzMDEgLTUxVDMyMSAtMTEwVi0xMThRMzIxIC0xNDIgMzEwIC0xNjNUMjc2IC0yMDhMMjAxIC0yODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzY7IiBnbHlwaC1uYW1lPSJjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMzU0IDU0MVEzMjMgNTQxIDI5NiA1NjVUMjUwIDYzM1EyMzAgNTkwIDIwMyA1NjZUMTQ2IDU0MVExMTggNTQxIDEwMiA1NTdUODUgNTk5UTg1IDYyNSAxMDIgNjUwVDE0NCA2OTZUMTk4IDczMlQyNTAgNzU0UTI3MyA3NDggMzAyIDczM1QzNTYgNjk2VDM5OCA2NTBUNDE1IDU5OVE0MTUgNTc0IDM5OSA1NThUMzU0IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNzsiIGdseXBoLW5hbWU9ImNhcm9uIiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMTQ2IDc0M1ExNzYgNzQzIDIwMyA3MThUMjUwIDY0OVEyNjkgNjkzIDI5NiA3MThUMzU0IDc0M1EzODIgNzQzIDM5OCA3MjdUNDE1IDY4NVE0MTUgNjU5IDM5OCA2MzRUMzU2IDU4OFQzMDIgNTUxVDI1MCA1MjlRMjI3IDUzNSAxOTggNTUwVDE0NCA1ODdUMTAyIDYzNFQ4NSA2ODVRODUgNzEwIDEwMSA3MjZUMTQ2IDc0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEODsiIGdseXBoLW5hbWU9ImJyZXZlIiBob3Jpei1hZHYteD0iNTAwIiBkPSJNMjUwIDU0MVEyMDcgNTQxIDE2OSA1NTVUMTA0IDU5NFE4NyA2MTEgNzcgNjMwVDY3IDY2OVE2NyA2OTQgODUgNzEzVDEzNSA3MzJRMTU4IDcyNyAxNzQgNzE1VDIwMyA2ODlUMjI3IDY2NVQyNTAgNjU0UTI2MyA2NTQgMjczIDY2NFQyOTcgNjg4VDMyNiA3MTRUMzY1IDczMlEzOTcgNzMyIDQxNSA3MTNUNDMzIDY2OVE0MzMgNjI5IDM5NyA1OTZRMzcyIDU3MSAzMzMgNTU2VDI1MCA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyRDk7IiBnbHlwaC1uYW1lPSJkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0yNDkgNTQxUTIwNSA1NDEgMTgwIDU2NlQxNTQgNjMyUTE1NCA2NzEgMTgwIDY5N1QyNTEgNzIzUTI5NSA3MjMgMzIwIDY5N1QzNDYgNjMyUTM0NiA1OTIgMzIwIDU2N1QyNDkgNTQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRBOyIgZ2x5cGgtbmFtZT0icmluZyIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTI0OSA1NDFRMTg5IDU0MSAxNTQgNTc2VDExOSA2NjdRMTE5IDY5NCAxMjggNzE3VDE1NSA3NTdUMTk3IDc4M1QyNTEgNzkzUTI4MCA3OTMgMzA0IDc4NFQzNDUgNzU3VDM3MSA3MTdUMzgxIDY2N1EzODEgNjQwIDM3MiA2MTdUMzQ1IDU3N1QzMDMgNTUxVDI0OSA1NDFaTTI1MCA2MTlRMjcwIDYxOSAyODMgNjMzVDI5NiA2NjdRMjk2IDY4NyAyODMgNzAxVDI1MCA3MTZRMjMwIDcxNiAyMTcgNzAyVDIwNCA2NjdRMjA0IDY0NiAyMTcgNjMzVDI1MCA2MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREI7IiBnbHlwaC1uYW1lPSJvZ29uZWsiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0zNTUgMjBRMzE0IC0xOCAyOTggLTM5VDI4MiAtNzdRMjgyIC0xMDYgMzEwIC0xMDZRMzMxIC0xMDYgMzQyIC04OFEzNTggLTkwIDM2OCAtMTA0VDM3OCAtMTM3UTM3OCAtMTY3IDM1NSAtMTg3VDI4MiAtMjA3UTIyNiAtMjA3IDE5NCAtMTgzVDE2MiAtMTEzUTE2MiAtOTEgMTczIC03MFQyMDUgLTMxVDI1MiAtMlQzMTEgMTRMMzU1IDIwSDM1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQzsiIGdseXBoLW5hbWU9InRpbGRlIiBob3Jpei1hZHYteD0iNDk5IiBkPSJNMzI1IDU0MVEyOTMgNTQxIDI2OSA1NTBUMjI0IDU3NlEyMTYgNTg0IDIwOSA1ODlUMTk3IDU5NVExODkgNTk1IDE4NCA1ODRUMTcyIDU2M1ExNTYgNTQyIDEyOSA1NDJRMTAzIDU0MiA4NiA1NTlUNjggNjAxUTY4IDY1NiA5OSA2ODZUMTc0IDcxNlEyMDIgNzE2IDIyNCA3MDlUMjY1IDY4N1EyNzYgNjc5IDI4NSA2NzFUMzAyIDY2MlEzMTAgNjYyIDMxNCA2NzJUMzI1IDY5MlEzNDEgNzE0IDM2OSA3MTRRMzk2IDcxNCA0MTIgNjk3VDQzMSA2NTVRNDMxIDYwMCA0MDAgNTcxVDMyNSA1NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREQ7IiBnbHlwaC1uYW1lPSJodW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0yODIgNTY3UTI3OSA1NzMgMjg2IDU5M1QzMDggNjM5VDM0NCA2ODhUMzkxIDcyOFE0MTggNzQ0IDQ0NCA3NDRRNDgwIDc0NCA1MDUgNzIzVDUzMCA2NzBRNTMwIDY0NCA1MTUgNjE4VDQ3MyA1NzdRNDQxIDU1OSA0MDkgNTUzVDM0OSA1NDhUMzA0IDU1NVQyODIgNTY3Wk0zNSA1NjdRMzIgNTczIDM5IDU5M1Q2MCA2MzlUOTYgNjg4VDE0MyA3MjhRMTcyIDc0NCAxOTcgNzQ0UTIzMyA3NDQgMjU4IDcyM1QyODMgNjcwUTI4MyA2NDQgMjY4IDYxOFQyMjYgNTc3UTE5NCA1NTkgMTYyIDU1M1QxMDIgNTQ4VDU3IDU1NVQzNSA1NjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQzA7IiBnbHlwaC1uYW1lPSJwaSIgaG9yaXotYWR2LXg9IjczOSIgZD0iTTM3MCAtMTRRMjk1IC0xNCAyMzMgMTFUMTI3IDgxVDU4IDE4OFQzMyAzMjRRMzMgMzk3IDU3IDQ1OVQxMjYgNTY2VDIzMyA2MzZUMzcwIDY2MVE0NDUgNjYxIDUwNyA2MzZUNjEzIDU2N1Q2ODEgNDYwVDcwNiAzMjRRNzA2IDI1MCA2ODIgMTg4VDYxMyA4MVQ1MDcgMTFUMzcwIC0xNFpNMzcwIDUzUTQzMCA1MyA0NzkgNzNUNTYzIDEyOVQ2MTcgMjE1VDYzNiAzMjRRNjM2IDM4MyA2MTcgNDMyVDU2MiA1MThUNDc4IDU3NFQzNzAgNTk0UTMxMCA1OTQgMjYxIDU3NFQxNzcgNTE4VDEyMiA0MzNUMTAzIDMyNFExMDMgMjY1IDEyMiAyMTZUMTc3IDEzMFQyNjEgNzRUMzcwIDUzWk0yNzUgMTM0UTIyNiAxMzQgMjI2IDE4N1Y0MjdRMjI2IDQ1OCAyNDEgNDc0VDI4NiA0OTFIMzgxUTQ1OSA0OTEgNDk5IDQ1OVQ1MzkgMzYxUTUzOSAyOTcgNTAwIDI2NVQzODYgMjMySDM0M1YxODdRMzQzIDEzNCAyOTMgMTM0SDI3NVpNMzQyIDMxN0gzODFRNDI4IDMxNyA0MjggMzYxUTQyOCAzODEgNDE2IDM5M1QzNzggNDA1SDM0MlYzMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDEzOyIgZ2x5cGgtbmFtZT0iZW5kYXNoIiBob3Jpei1hZHYteD0iNTc2IiBkPSJNMTA2IDE2N1E2OCAxNjcgNDkgMTg4VDMwIDIzOVYyNTVRMzAgMjgyIDQ5IDMwNFQxMDYgMzI3SDQ2M1E1MDEgMzI3IDUyMCAzMDVUNTM5IDI1NVYyMzlRNTM5IDIxMCA1MjAgMTg5VDQ2MyAxNjdIMTA2SDEwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTQ7IiBnbHlwaC1uYW1lPSJlbWRhc2giIGhvcml6LWFkdi14PSI3MzgiIGQ9Ik0xMDYgMTY3UTY4IDE2NyA0OSAxODhUMzAgMjM5VjI1NVEzMCAyODIgNDkgMzA0VDEwNiAzMjdINjMyUTY3MSAzMjcgNjg5IDMwNVQ3MDggMjU1VjIzOVE3MDggMjEwIDY5MCAxODlUNjMyIDE2N0gxMDZIMTA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGdseXBoLW5hbWU9InF1b3RlbGVmdCIgaG9yaXotYWR2LXg9IjI1NiIgZD0iTTk1IDM3M1E2MCAzNzMgNDEgMzkxVDIxIDQ1MlY0NTlRMjEgNDg0IDMxIDUwNVQ2NCA1NTJMMTM5IDY0MVExNTIgNjU0IDE3MSA2NTZUMjA2IDY1M1QyMzIgNjMyVDIzOCA1OTdMMjAyIDQ1MlExOTcgNDMyIDE5MiA0MTdUMTc4IDM5M1QxNTUgMzc4VDExNyAzNzNIOTVIOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE5OyIgZ2x5cGgtbmFtZT0icXVvdGVyaWdodCIgaG9yaXotYWR2LXg9IjI1NiIgZD0iTTExNiAzOTBRMTAzIDM3NiA4NSAzNzRUNTAgMzc4VDI1IDM5OVQxOSA0MzRMNTQgNTc5UTU4IDU5OSA2MyA2MTRUNzggNjM4VDEwMiA2NTNUMTQwIDY1OEgxNjFRMTk2IDY1OCAyMTUgNjQwVDIzNSA1NzlWNTcyUTIzNSA1MjMgMTkyIDQ3OUwxMTYgMzkwSDExNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjI1NiIgZD0iTTExNCAtOTZRMTAwIC0xMTAgODIgLTExMlQ0OCAtMTA4VDIzIC04N1QxNyAtNTNMNTEgOTNRNTUgMTEzIDYxIDEyOFQ3NiAxNTJUMTAwIDE2N1QxMzggMTcySDE1OFExOTQgMTcyIDIxMyAxNTRUMjMzIDkzVjg2UTIzMyA2MCAyMjIgMzhUMTkwIC03TDExNCAtOTZIMTE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQzsiIGdseXBoLW5hbWU9InF1b3RlZGJsbGVmdCIgaG9yaXotYWR2LXg9IjQ4OSIgZD0iTTMyOCAzNzNRMjkzIDM3MyAyNzQgMzkxVDI1NCA0NTJWNDU5UTI1NCA1MDggMjk3IDU1MkwzNzMgNjQxUTM4NiA2NTQgNDA0IDY1NlQ0MzggNjUzVDQ2NCA2MzJUNDcwIDU5N0w0MzUgNDUyUTQzMSA0MzIgNDI2IDQxN1Q0MTEgMzkyVDM4NyAzNzhUMzQ5IDM3M0gzMjhaTTk1IDM3M1E2MCAzNzMgNDEgMzkxVDIxIDQ1MlY0NTlRMjEgNDg1IDMxIDUwN1Q2NCA1NTJMMTM5IDY0MVExNTIgNjU0IDE3MSA2NTZUMjA2IDY1M1QyMzIgNjMyVDIzOCA1OTdMMjAyIDQ1MlExOTcgNDMyIDE5MiA0MTdUMTc4IDM5MlQxNTUgMzc4VDExNyAzNzNIOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFEOyIgZ2x5cGgtbmFtZT0icXVvdGVkYmxyaWdodCIgaG9yaXotYWR2LXg9IjQ4OSIgZD0iTTM0OSAzOTBRMzM2IDM3NiAzMTggMzc0VDI4MyAzNzhUMjU2IDM5OVQyNTEgNDM0TDI4NyA1NzlRMjkxIDU5OSAyOTYgNjE0VDMxMSA2MzhUMzM0IDY1M1QzNzIgNjU4SDM5NFE0MjkgNjU4IDQ0OCA2NDBUNDY4IDU3OVY1NzJRNDY4IDU0NiA0NTcgNTI0VDQyNSA0NzlMMzQ5IDM5MFpNMTE2IDM5MFExMDMgMzc2IDg1IDM3NFQ1MCAzNzhUMjUgMzk5VDE5IDQzNEw1NCA1NzlRNTggNTk5IDYzIDYxNFQ3OCA2MzhUMTAyIDY1M1QxNDAgNjU4SDE2MVExOTYgNjU4IDIxNSA2NDBUMjM1IDU3OVY1NzJRMjM1IDUyMyAxOTIgNDc5TDExNiAzOTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFFOyIgZ2x5cGgtbmFtZT0icXVvdGVkYmxiYXNlIiBob3Jpei1hZHYteD0iNDg5IiBkPSJNMzQ3IC05NlEzMzQgLTExMCAzMTYgLTExMlQyODEgLTEwOVQyNTQgLTg4VDI0OSAtNTNMMjg1IDkzUTI4OSAxMTMgMjk0IDEyOFQzMDkgMTUyVDMzMiAxNjdUMzY5IDE3MkgzOTJRNDI3IDE3MiA0NDYgMTU0VDQ2NSA5M1Y4NlE0NjUgNjAgNDU1IDM4VDQyMiAtN0wzNDcgLTk2Wk0xMTMgLTk2UTEwMCAtMTEwIDgyIC0xMTJUNDggLTEwOFQyMyAtODdUMTcgLTUzTDUxIDkzUTU1IDExMyA2MCAxMjhUNzUgMTUyVDk5IDE2N1QxMzcgMTcySDE1OFExOTQgMTcyIDIxMyAxNTRUMjMyIDkzVjg2UTIzMiAzNyAxODkgLTdMMTEzIC05NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjA7IiBnbHlwaC1uYW1lPSJkYWdnZXIiIGhvcml6LWFkdi14PSI1NDAiIGQ9Ik0yNTIgLTE1NVEyMzAgLTE1NSAyMTUgLTE0OVQxOTggLTExMEwxODQgMjE4UTE4MiAyNTkgMTg5IDI4OFQyMjAgMzQzTDg5IDMwOVE3MSAzMDQgNTggMzA5VDM2IDMyNlQyMyAzNTdUMTggMzk4UTE4IDQ0NyAzMyA0NzJUODkgNDg2TDIxOSA0NTFMMTg3IDU4OVExNjggNjYxIDI3MCA2NjFRMzI0IDY2MSAzNDQgNjQ0VDM1NCA1ODlMMzIyIDQ1Mkw0NTEgNDg2UTQ2OSA0OTEgNDgyIDQ4NlQ1MDUgNDY5VDUxOCA0MzhUNTIzIDM5OFE1MjMgMzc2IDUxOSAzNThUNTA1IDMyN1Q0ODMgMzA5VDQ1MSAzMDlMMzIxIDM0M1EzNDUgMzE3IDM1MiAyODhUMzU3IDIxOEwzNDMgLTExMFEzNDEgLTE0MiAzMjYgLTE0OFQyODkgLTE1NUgyNTJIMjUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMTsiIGdseXBoLW5hbWU9ImRhZ2dlcmRibCIgaG9yaXotYWR2LXg9IjU0MCIgZD0iTTI1MiAtMTU1UTIzMCAtMTU1IDIxNSAtMTQ5VDE5OCAtMTEwTDE5MiA0Mkw4OSAxNVE0OSA0IDM0IDI5VDE4IDEwNFExOCAxMjYgMjIgMTQ0VDM1IDE3NVQ1NyAxOTNUODkgMTkzTDE4NyAxNjdMMTg0IDIzM1ExODIgMjc0IDE4OSAzMDNUMjIxIDM1OEw4OSAzMjRRNzEgMzE5IDU4IDMyNFQzNiAzNDFUMjMgMzcyVDE4IDQxM1ExOCA0NjIgMzMgNDg3VDg5IDUwMUwyMTggNDY3TDE4NyA1ODlRMTY4IDY2MSAyNzAgNjYxUTMyNCA2NjEgMzQ0IDY0NFQzNTQgNTg5TDMyMiA0NjdMNDUxIDUwMVE0NjkgNTA2IDQ4MiA1MDFUNTA1IDQ4NFQ1MTggNDUzVDUyMyA0MTNRNTIzIDM5MSA1MTkgMzczVDUwNSAzNDJUNDgzIDMyNFQ0NTEgMzI0TDMyMCAzNThRMzQ0IDMzMiAzNTEgMzAzVDM1NyAyMzNMMzU0IDE2OEw0NTEgMTkzUTQ2OSAxOTggNDgyIDE5M1Q1MDUgMTc2VDUxOCAxNDVUNTIzIDEwNFE1MjMgODMgNTE5IDY1VDUwNSAzM1Q0ODMgMTVUNDUxIDE1TDM0OSA0MkwzNDMgLTExMFEzNDEgLTE0MiAzMjYgLTE0OFQyODkgLTE1NUgyNTJIMjUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGdseXBoLW5hbWU9ImJ1bGxldCIgaG9yaXotYWR2LXg9IjM2MyIgZD0iTTE4MiAxMDFRMTUwIDEwMSAxMjQgMTEyVDc4IDE0MlQ0NyAxODhUMzYgMjQ3UTM2IDI3OCA0NyAzMDVUNzcgMzUzVDEyNCAzODRUMTgyIDM5NlEyMTMgMzk2IDIzOSAzODVUMjg1IDM1M1QzMTYgMzA2VDMyNyAyNDdRMzI3IDIxNyAzMTYgMTkwVDI4NSAxNDRUMjM5IDExM1QxODIgMTAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyNjsiIGdseXBoLW5hbWU9ImVsbGlwc2lzIiBob3Jpei1hZHYteD0iNzc2IiBkPSJNNjMzIC04UTU1MiAtOCA1NTIgNzNWODlRNTUyIDE3MCA2MzMgMTcwSDY1NlE3MDAgMTcwIDcxOSAxNTFUNzM5IDg5VjczUTczOSAtOCA2NTYgLThINjMzWk0zNzUgLThRMjkzIC04IDI5MyA3M1Y4OVEyOTMgMTcwIDM3NSAxNzBIMzk4UTQ4MSAxNzAgNDgxIDg5VjczUTQ4MSAtOCAzOTggLThIMzc1Wk0xMTYgLThRMzUgLTggMzUgNzNWODlRMzUgMTcwIDExNiAxNzBIMTM5UTE4MyAxNzAgMjAyIDE1MVQyMjIgODlWNzNRMjIyIC04IDEzOSAtOEgxMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDMwOyIgZ2x5cGgtbmFtZT0icGVydGhvdXNhbmQiIGhvcml6LWFkdi14PSIxMTI0IiBkPSJNMTQ4IC0xM1ExNDYgLTE2IDEzMyAtMTNUMTA0IC0xVDc3IDIxVDY0IDUwUTY0IDcxIDg5IDk5TDU5MyA2NThRNTk2IDY2MSA2MDkgNjU4VDYzOCA2NDZUNjY1IDYyNVQ2NzcgNTk2UTY3NyA1NzMgNjUzIDU0NkwxNDggLTEzWk0xODAgMzM1UTEwMCAzMzUgNTMgMzc3VDYgNDkyVjQ5OVE2IDU3MiA1MyA2MTRUMTgwIDY1N1EyNTkgNjU3IDMwNiA2MTVUMzUzIDUwMFY0OTNRMzUzIDQyMCAzMDYgMzc4VDE4MCAzMzVaTTE4MCA0MzBRMjAxIDQzMCAyMTUgNDQ0VDIzMCA0ODhWNTA0UTIzMCA1MzQgMjE2IDU0OFQxODAgNTYzUTE1NyA1NjMgMTQ0IDU0OVQxMzAgNTA0VjQ4OFExMzAgNDU5IDE0NCA0NDVUMTgwIDQzMFpNOTQ1IC0xMlE4NjUgLTEyIDgxOCAzMFQ3NzAgMTQ1VjE1MlE3NzAgMjI1IDgxOCAyNjdUOTQ1IDMxMFExMDI0IDMxMCAxMDcxIDI2OFQxMTE4IDE1M1YxNDZRMTExOCA3MyAxMDcxIDMxVDk0NSAtMTJaTTU2NCAtMTJRNDg0IC0xMiA0MzcgMzBUMzg5IDE0NVYxNTJRMzg5IDIyNSA0MzcgMjY3VDU2NCAzMTBRNjQzIDMxMCA2OTAgMjY4VDczNyAxNTNWMTQ2UTczNyA3MyA2OTAgMzFUNTY0IC0xMlpNOTQ1IDgzUTk2NiA4MyA5ODAgOTdUOTk1IDE0MVYxNTdROTk1IDE4NyA5ODEgMjAxVDk0NSAyMTZROTIyIDIxNiA5MDkgMjAyVDg5NSAxNTdWMTQxUTg5NSAxMTEgOTA5IDk3VDk0NSA4M1pNNTY0IDgzUTU4NSA4MyA1OTkgOTdUNjE0IDE0MVYxNTdRNjE0IDE4NyA2MDAgMjAxVDU2NCAyMTZRNTQxIDIxNiA1MjggMjAyVDUxNCAxNTdWMTQxUTUxNCAxMTEgNTI4IDk3VDU2NCA4M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzk7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xsZWZ0IiBob3Jpei1hZHYteD0iMzIzIiBkPSJNMjk2IDM2NlEyOTYgMzQ4IDI4MyAzMzFUMjUxIDI5N1QyMTEgMjY4VDE3MyAyNDdRMTg5IDIzOCAyMTAgMjI1VDI1MSAxOTZUMjgzIDE2M1QyOTYgMTI4VjEyM1EyOTYgOTQgMjc5IDc1VDIyNiA1NUgyMjRRMTkyIDU1IDE1OCA4MlQ5NCAxNDNUNDUgMjA4VDI2IDI0N1EyNiAyNTIgMzUgMjY4VDU5IDMwNVQ5MyAzNTBUMTM1IDM5M1QxODAgNDI2VDIyNCA0MzlIMjI2UTI2MSA0MzkgMjc4IDQyMFQyOTYgMzcwVjM2NkgyOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDNBOyIgZ2x5cGgtbmFtZT0iZ3VpbHNpbmdscmlnaHQiIGhvcml6LWFkdi14PSIzMjMiIGQ9Ik0yNyAxMjhRMjcgMTQ2IDM5IDE2M1Q3MSAxOTZUMTExIDIyNVQxNDkgMjQ3UTEzMiAyNTUgMTExIDI2OFQ3MSAyOTdUNDAgMzMwVDI3IDM2NlYzNzBRMjcgNDAwIDQ0IDQxOVQ5NyA0MzlIOTlRMTIwIDQzOSAxNDMgNDI2VDE4OCAzOTRUMjI5IDM1MVQyNjQgMzA2VDI4OCAyNjhUMjk3IDI0N1EyOTcgMjQyIDI4OCAyMjZUMjY0IDE4OVQyMzAgMTQ0VDE4OCAxMDFUMTQzIDY4VDk5IDU1SDk3UTYyIDU1IDQ1IDc0VDI3IDEyM1YxMjhIMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgZ2x5cGgtbmFtZT0iZnJhY3Rpb24iIGhvcml6LWFkdi14PSI3MjMiIGQ9Ik0xNDQgLTEwUTEzOSAtMTUgMTI0IC0xNFQ5MyAtNVQ2NCAxNFQ1MSA0NFE1MSA1NSA1NSA2NlQ3MyA5Mkw1NjkgNjU4UTU3MyA2NjMgNTg4IDY2MlQ2MTkgNjU0VDY0OCA2MzVUNjYxIDYwNVE2NjEgNTk0IDY1NiA1ODNUNjM5IDU1N0wxNDQgLTEwSDE0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwQUM7IiBnbHlwaC1uYW1lPSJFdXJvIiBob3Jpei1hZHYteD0iNjM0IiBkPSJNNzggMzM4UTQ2IDMzOCAzMSAzNTJUMTUgMzg2VjQwMFExNSA0MTggMzAgNDMyVDc4IDQ0N0gxMDRRMTE2IDQ5NyAxNDEgNTM3VDIwNCA2MDRUMjg5IDY0NlQzOTIgNjYxUTQ5OCA2NjEgNTU3IDYyM1Q2MTYgNTI2UTYxNiA1MDIgNjAzIDQ4NFQ1NzQgNDU0VDU0MyA0MzdUNTI2IDQzNFE1MDAgNDY2IDQ3MiA0ODJUMzk2IDQ5OVEzMjYgNDk5IDI5NiA0NDdINDE1UTQ0OCA0NDcgNDYzIDQzM1Q0NzggNDAwVjM4NlE0NzggMzY2IDQ2MyAzNTJUNDE1IDMzOEgyODBWMzA4SDQxNVE0NDggMzA4IDQ2MyAyOTRUNDc4IDI2MVYyNDdRNDc4IDIyOCA0NjMgMjE0VDQxNSAxOTlIMjk4UTMxMyAxNzMgMzM4IDE2MVQzOTcgMTQ4UTQ0NSAxNDggNDczIDE2NVQ1MjcgMjE1UTUyOSAyMTcgNTQzIDIxMlQ1NzQgMTk2VDYwNCAxNjZUNjE3IDEyM1E2MTcgOTkgNjA1IDc1VDU2NiAzMVQ0OTcgLTFUMzk0IC0xNFEyODEgLTE0IDIwNSA0MVQxMDUgMTk5SDc4UTQ2IDE5OSAzMSAyMTNUMTUgMjQ3VjI2MVExNSAyODAgMzAgMjk0VDc4IDMwOEg5NVYzMzhINzhINzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTIyOyIgZ2x5cGgtbmFtZT0idHJhZGVtYXJrIiBob3Jpei1hZHYteD0iNzAwIiBkPSJNMzc1IDMyNFEzMzQgMzI0IDMzNCAzNzNWNjAyUTMzNCA2MjcgMzQzIDYzOVQzNzYgNjUySDQwOFE0MjggNjUyIDQzNyA2NDZUNDUzIDYyNUw1MDQgNTA0TDU1NSA2MjVRNTYyIDY0MiA1NzEgNjQ3VDU5OCA2NTJINjMwUTY3MyA2NTIgNjczIDYwMlYzNzNRNjczIDM0OSA2NjQgMzM3VDYzMiAzMjRINjE1UTU3NCAzMjQgNTc0IDM3M1Y0OThMNTQ2IDQwOVE1NDQgNDAwIDUzOCAzOTRUNTAzIDM4OFE0ODggMzg4IDQ4MSAzODlUNDcwIDM5NFQ0NjUgNDAwVDQ2MiA0MDlMNDMzIDQ5NFYzNzNRNDMzIDM0OSA0MjUgMzM3VDM5MyAzMjRIMzc1Wk01NiA1NTZROCA1NTYgOCA2MDJWNjA0UTggNjQ3IDU2IDY0N0gyNThRMzA2IDY0NyAzMDYgNjA0VjYwMlEzMDYgNTU2IDI1OCA1NTZIMjEwVjM3M1EyMTAgMzI0IDE2MyAzMjRIMTQ4UTEwNSAzMjQgMTA1IDM3M1Y1NTZINTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjEyOyIgZ2x5cGgtbmFtZT0ibWludXMiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik0xMTkgMTc4UTgxIDE3OCA2MiAxOTdUNDMgMjQ5VjI1OFE0MyAyODggNjIgMzA4VDExOSAzMjhINDgwUTUxOSAzMjggNTM3IDMwOFQ1NTYgMjU4VjI0OVE1NTYgMjE3IDUzOCAxOThUNDgwIDE3OEgxMTlIMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxOTsiIGdseXBoLW5hbWU9InVuaTIyMTkiIGhvcml6LWFkdi14PSIyNjIiIGQ9Ik0xMTggMTU4UTM2IDE1OCAzNiAyMzlWMjU1UTM2IDMzNiAxMTggMzM2SDE0MVEyMjQgMzM2IDIyNCAyNTVWMjM5UTIyNCAxNTggMTQxIDE1OEgxMThIMTE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2MDsiIGdseXBoLW5hbWU9Im5vdGVxdWFsIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNMTE5IDMxMVE4MSAzMTEgNjIgMzI5VDQzIDM3NlYzODVRNDMgNDEyIDYyIDQzMFQxMTkgNDQ5SDI5OUwzNDAgNTY4UTM1NyA2MTkgMzc2IDYzM1Q0MTMgNjQyTDQzNyA2MzRRNDU1IDYyOCA0NjEgNjA2VDQ1MiA1MzFMNDIzIDQ0OUg0ODBRNTE5IDQ0OSA1MzcgNDMxVDU1NiAzODVWMzc2UTU1NiAzNDcgNTM4IDMyOVQ0ODAgMzExSDM2NkwzMjYgMTk3SDQ4MFE1MTkgMTk3IDUzNyAxNzlUNTU2IDEzM1YxMjRRNTU2IDk1IDUzOCA3N1Q0ODAgNTlIMjg2TDI0NSAtNjNRMjI4IC0xMTUgMjEwIC0xMjlUMTczIC0xMzhMMTQ5IC0xMzBRMTMxIC0xMjQgMTI0IC0xMDFUMTMzIC0yN0wxNjIgNTlIMTE5UTgxIDU5IDYyIDc3VDQzIDEyNFYxMzNRNDMgMTYwIDYyIDE3OFQxMTkgMTk3SDIxOUwyNTkgMzExSDExOUgxMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY0OyIgZ2x5cGgtbmFtZT0ibGVzc2VxdWFsIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNjMgNDEyUTYzIDQ0NiA3NSA0NjZUMTEzIDQ5N0w1MDEgNjQwUTUwNCA2NDEgNTExIDYzNVQ1MjUgNjE3VDUzOSA1OTBUNTQ1IDU1NlE1NDYgNTMxIDUzMSA1MDdUNDc1IDQ3MEwyOTMgNDEzTDQ3NSAzNTlRNTE3IDM0NiA1MzEgMzIyVDU0NiAyNzNRNTQ2IDI1NSA1NDAgMjM5VDUyNyAyMTJUNTEyIDE5NFQ1MDEgMTg5TDExMyAzMjhRODcgMzM5IDc1IDM1OVQ2MyA0MTJaTTEzMCAyOVE5MiAyOSA3MyA0N1Q1NCA5NVYxMDNRNTQgMTMxIDczIDE0OVQxMzAgMTY4SDQ2OVE1MDggMTY4IDUyNiAxNTBUNTQ1IDEwM1Y5NVE1NDUgNjYgNTI3IDQ4VDQ2OSAyOUgxMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlcmVxdWFsIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNTUgNTU3UTU1IDU3NSA2MCA1OTBUNzMgNjE3VDg4IDYzNVQ5OSA2NDFMNDg3IDQ5OFE1MzcgNDc3IDUzNyA0MTNRNTM3IDM4MCA1MjUgMzYwVDQ4NyAzMjlMOTkgMTg5UTk2IDE4NyA4OSAxOTNUNzQgMjEyVDYwIDI0MFQ1NCAyNzRRNTQgMjk4IDY5IDMyMlQxMjUgMzYwTDMwNiA0MTRMMTI1IDQ3MFE4NCA0ODQgNjkgNTA4VDU1IDU1N1pNMTMxIDMwUTkyIDMwIDc0IDQ4VDU1IDk1VjEwNFE1NSAxMzEgNzMgMTQ5VDEzMSAxNjhINDcwUTUwOCAxNjggNTI3IDE1MFQ1NDYgMTA0Vjk1UTU0NiA2NiA1MjcgNDhUNDcwIDMwSDEzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCMDE7IiBnbHlwaC1uYW1lPSJmaSIgaG9yaXotYWR2LXg9IjcwMiIgZD0iTTU2MCA1NTJRNTEyIDU1MiA0ODUgNTc2VDQ1NyA2NDNRNDU3IDY4NSA0ODQgNzA5VDU1OCA3MzNRNjA2IDczMyA2MzMgNzA5VDY2MSA2NDNRNjYxIDYwMSA2MzQgNTc3VDU2MCA1NTJaTTgxIDM1MVEzIDM1MSAzIDQyMFY0MzFRMyA0OTYgODEgNDk2SDEwMVY1MTBRMTAxIDU2OCAxMTUgNjA2VDE1NCA2NjdUMjE0IDY5OVQyOTAgNzA5UTM2NSA3MDkgMzk4IDY4MlQ0MzIgNjE4UTQzMiA2MDIgNDI3IDU4OFQ0MTUgNTY0VDQwMiA1NDlUMzk1IDU0NFEzODQgNTU0IDM2OSA1NjBUMzM0IDU2N1EzMTAgNTY3IDI5OCA1NTVUMjg1IDUxMlY0OTZIMzI3UTQwNSA0OTYgNDA1IDQyN1Y0MTZRNDA1IDM1MSAzMjcgMzUxSDI5M1YwSDEwMVYzNTFIODFaTTQ2MyA0MDlRNDYzIDQ2MSA0ODcgNDgxVDU0OSA1MDFINTY5UTYwNyA1MDEgNjMxIDQ4MlQ2NTUgNDA5VjBINDYzVjQwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCMDI7IiBnbHlwaC1uYW1lPSJmbCIgaG9yaXotYWR2LXg9IjcwMiIgZD0iTTczIDM1MVEzOCAzNTEgMjEgMzcwVDMgNDIwVjQzMVEzIDQ2MCAyMCA0NzhUNzMgNDk2SDEwMVY1MTBRMTAxIDU2OCAxMTUgNjA2VDE1NCA2NjdUMjE0IDY5OVQyOTAgNzA5UTM2NSA3MDkgMzk4IDY4MlQ0MzIgNjE4UTQzMiA2MDIgNDI3IDU4OFQ0MTUgNTY0VDQwMiA1NDlUMzk1IDU0NFEzODQgNTU0IDM2OSA1NjBUMzM0IDU2N1EzMTAgNTY3IDI5OCA1NTVUMjg1IDUxMlY0OTZIMzM1UTM3MCA0OTYgMzg3IDQ3N1Q0MDUgNDI3VjQxNlE0MDUgMzg3IDM4OCAzNjlUMzM1IDM1MUgyOTNWMEgxMDFWMzUxSDczWk00NjMgNjgyUTQ2MyA2ODcgNDg1IDY5NVQ1MzcgNzA0UTU1OCA3MDQgNTc5IDY5OFQ2MTcgNjc1VDY0NCA2MzBUNjU1IDU1OFYwSDQ2M1Y2ODJaIiAgLz4KKworPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxN2Q7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MmM7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iLiIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iQSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IkoiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJUIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJYIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IloiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDI2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxYTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFlOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkZDsiIGs9IjkxIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTdkOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSIqIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9Ij8iIGs9IjUzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJDIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkciIGs9IjMxIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iSiIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iTyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJRIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlQiIGs9Ijk2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iVSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJWIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlciIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iWSIgaz0iOTEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJaIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlwiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iYSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJjIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImQiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iZSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJvIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InEiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0idiIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ3IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InkiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ2OyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZTc7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGFlOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hhOTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkODsiIGs9IjMxIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4M2MwOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hlNjsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YWI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMwOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzM7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkNTsiIGs9IjMxIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTUyOyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gxNTM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMWM7IiBrPSIxMDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDFkOyIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDE4OyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxOTsiIGs9IjY4IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTc4OyIgaz0iOTEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDM5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDM7IiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ0OyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkMjsiIGs9IjMxIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRiOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4ZGQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iVyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iWSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3gxNzg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTYwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxNjE7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSIpIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iLyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IjoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iQCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkEiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJDIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iRyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkoiIGs9Ijg1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJPIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iUSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iVCIgaz0iLTI4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJWIiBrPSItMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlgiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJhIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iYyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJlIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Im8iIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0icSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJzIiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzQ7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzU7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDY7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZTc7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzY7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGU2OyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGFiOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzA7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzM7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDU7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTUyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE1MzsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDEzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDNhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMjsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMTsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkNDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTdkOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDJjOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ii4iIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJKIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iVCIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJXIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWCIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJaIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGM2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAyNjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWE7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxZTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZjA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGZlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Ii0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJDIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IkciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iSiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJPIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IlEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iVCIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJhIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iYyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJkIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImUiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJnIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJqIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InEiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGU3OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGU2OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ1OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxNTI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDE1MzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MjAxMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MjAxNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iISIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiEiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSIhIiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iISIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiEiIHUyPSJvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSIhIiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iISIgdTI9IiYjeGU3OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iISIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iISIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4ZGQ7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iSiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlYiIGs9IjQzIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlciIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJZIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNDsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNTsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNjsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMDsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMzsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3gxNzg7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMjsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMTsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IiYjeGRkOyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iNyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iSiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJXIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJYIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJZIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJnIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJqIiBrPSItMTUwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4MTc4OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iQSIgaz0iNzUiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSJKIiBrPSI1MyIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IlQiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM0OyIgaz0iNzUiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNTsiIGs9Ijc1IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzY7IiBrPSI3NSIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMwOyIgaz0iNzUiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMzsiIGs9Ijc1IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzI7IiBrPSI3NSIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMxOyIgaz0iNzUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjAiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIxIiBrPSI4NiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iMiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjMiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI0IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iNSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI2IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iNyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iQyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJPIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iUSIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlQiIGs9IjgzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iViIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlciIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDY7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ4OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDU7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTUyOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMzsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNDsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IjEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJUIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJYIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iWiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjAiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iMSIgaz0iODYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSIyIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjMiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iNCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI1IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI2IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjciIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJDIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iTyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJRIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlQiIGs9IjgzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJWIiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlciIGs9IjI4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ4OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ1OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNTI7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDM7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ0OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkMjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4MTQxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkZTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iMSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iMiIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iMyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iNCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjUiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjciIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkIiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iQyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJEIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkUiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iRiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJHIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkgiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iSSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJKIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IksiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iTCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJNIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9Ik4iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iTyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJQIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IlEiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iUiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImciIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGM5OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkMTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkODsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQ1OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4Y2E7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGNiOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hjODsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4Y2Q7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGNlOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hjZjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4Y2M7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDJjOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSIuIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAyNjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxYTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxZTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIxIiB1Mj0iJiN4MmM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iMSIgdTI9Ii4iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIxIiB1Mj0iNyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjEiIHUyPSImI3gyMDI2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjEiIHUyPSImI3gyMDFhOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjEiIHUyPSImI3gyMDFlOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSItIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDJjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iMyIgdTI9Ii4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSIvIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IjciIGs9IjEiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyMDI2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMWE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAxZTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyYzsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iNCIgdTI9Ii4iIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iNCIgdTI9Ii8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSIxIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IjciIGs9IjE4IiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4YjA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeDIxMjI7IiBrPSI0MyIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeDIwMjY7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyMDFkOyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyMDE5OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyMDFhOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjAxZTsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9Ii8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSI3IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDJjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNiIgdTI9Ii4iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSI3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMjY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAxYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyMDFlOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IikiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MmM7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Ii0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iLiIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIvIiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjAiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIxIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIzIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI0IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjUiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Ij8iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iXSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSJ9IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeGEyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDI2OyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDEzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDE0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDFhOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyMDFlOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iLiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSI3IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMjY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMWE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMWU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDJjOyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSIuIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IjciIGs9IjE5IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAyNjsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAxYTsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAxZTsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZGQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IjEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iNyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJUIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSIxIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iVCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiZndDsiIHUyPSI3IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSIzIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IlYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IlgiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJnIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE2MDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MTYxOyIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZGQ7IiBrPSI0MSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IioiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MmM7IiBrPSItMjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSItIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Ii4iIGs9Ii0yMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Ij8iIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iQCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iQyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJHIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkoiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iTyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJRIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iVCIgaz0iNDEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJWIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlciIGs9IjQ5IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iWCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJZIiBrPSI0MSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iZiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJnIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InMiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idiIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ3IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IngiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieSIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ6IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIxMjI7IiBrPSI1MyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGM2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4M2MwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMjY7IiBrPSItMjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ1OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNTI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDEzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFjOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFkOyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE5OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNzg7IiBrPSI0MSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWE7IiBrPSItMjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFlOyIgaz0iLTIzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iViIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iYSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJjIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQiIgdTI9ImQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iZSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJvIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQiIgdTI9InEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0idiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0ieSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSImI3hlNzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iJiN4ZTY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IiYjeDE1MzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZGQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJDIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iRyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9Ik8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJRIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iWSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iYSIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJjIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImQiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iZSIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJvIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InEiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZDY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZTc7IiBrPSItMSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGQ4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGU2OyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hkNTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxNTI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4MTUzOyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxNzg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hkMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hkNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hkMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTdkOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyYzsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iLiIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iQSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJKIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlQiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJXIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlgiIGs9IjI5IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJaIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGM2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDI2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWE7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWU7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGZlOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iQyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJHIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IkoiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iTyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJRIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IlQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iViIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJXIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iYSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJjIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImQiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iaCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJsIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ibSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9Im4iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJvIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJxIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ1IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGQ2OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hlNzsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkODsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hlNjsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4YWI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGQ1OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3gxNTI7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDE1MzsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MjAzOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZDM7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGQ0OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkMjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MTMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDE2MTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZGQ7IiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hmZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImYW1wOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyYzsiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iLSIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSIuIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Ii8iIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iOiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iQSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJDIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iSiIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJPIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJZIiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJhIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJkIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImUiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJnIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJqIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iciIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJzIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ieCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InoiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM1OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkNjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZTc7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjEyMjsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hlNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YWI7IiBrPSIyNiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMjY7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMwOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZDU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDE1MjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTUzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDEzOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDE0OyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNzg7IiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDM5OyIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDFhOyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDFlOyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGQzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkNDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZDI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDEzMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4ZGQ7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDJjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iLiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iVCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJWIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJZIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idiIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ3IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAyNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDE3ODsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAxYTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIwMWU7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSCIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSSIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJJIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSJBIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGM1OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzA7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGMzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGYwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNjA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGQ7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE3ZDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImYW1wOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSItIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iQyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJPIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iUSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJUIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iViIgaz0iNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlciIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWCIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJZIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IloiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJhIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJnIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InYiIGs9IjMxIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0idyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0ieSIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGFlOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hhOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDg7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTUyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MjAxMzsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MjAxNDsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTc4OyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkZDsiIGs9IjkxIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTdkOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSIqIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Ij8iIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJDIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkciIGs9IjMxIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iSiIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iTyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJRIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlQiIGs9Ijk2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJWIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlciIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iWSIgaz0iOTEiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJaIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlwiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImMiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iZCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJlIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Im8iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0icSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJ2IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InciIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0ieSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDY7IiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hlNzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGE5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ4OyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gzYzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGFiOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDU7IiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE1MjsiIGs9IjMxIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUzOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMDFjOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxZDsiIGs9IjY4IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxODsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMTk7IiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE3ODsiIGs9IjkxIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAzOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQzOyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNDsiIGs9IjMxIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDI7IiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTSIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik0iIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTiIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik4iIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGRkOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxN2Q7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDJjOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSIuIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJBIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IkoiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iVCIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iWCIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJZIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IloiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4ZTc7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMjY7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxYTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxZTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZGQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ZDsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJmFtcDsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iKiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iLiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJBIiBrPSIzOSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkoiIGs9IjU5IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iVCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJWIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJYIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJaIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ2IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ3IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ4IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM0OyIgaz0iMzkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNTsiIGs9IjM5IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM2OyIgaz0iMzkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MjAyNjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzA7IiBrPSIzOSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMzOyIgaz0iMzkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ODsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MjAxYTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MjAxZTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzI7IiBrPSIzOSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMxOyIgaz0iMzkiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTdkOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gyYzsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ii4iIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ii8iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJBIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IkoiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJUIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iVyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJYIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iWiIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAyNjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gyMDFhOyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxZTsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGRkOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImYW1wOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iQyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IkciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJKIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iTyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJUIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iViIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJXIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlkiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDg7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDU7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4MTUyOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeDE3ODsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDQ7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4ZGQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iVyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iWSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3gxNzg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE2MTsiIGs9IjYzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZGQ7IiBrPSItMjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxN2Q7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJmFtcDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iKiIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MmM7IiBrPSI4MyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Ii0iIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iLiIgaz0iODMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSIvIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IjoiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJAIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkEiIGs9IjU4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iQyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJHIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkoiIGs9Ijk2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iTyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJRIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlQiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlkiIGs9Ii0yOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IloiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJcIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJhIiBrPSI1OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImMiIGs9Ijc2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZCIgaz0iNzYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJlIiBrPSI3NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJtIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im4iIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibyIgaz0iNzYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJwIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InEiIGs9Ijc2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iciIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJzIiBrPSI2MyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idSIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ2IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InciIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ieCIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ5IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InoiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzQ7IiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM1OyIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTc7IiBrPSI3NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGFlOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzY7IiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ4OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gzYzA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGU2OyIgaz0iNTgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hiZjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YWI7IiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hiYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAyNjsiIGs9IjgzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzA7IiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMzOyIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNTsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTUyOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxNTM7IiBrPSI3NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTM7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTQ7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE3ODsiIGs9Ii0yOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMzk7IiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDNhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFhOyIgaz0iODMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFlOyIgaz0iODMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMjsiIGs9IjU5IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzE7IiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQzOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNDsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDI7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDEzMTsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iQSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGM0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjNTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGMwOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGMxOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNjA7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE2MTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZGQ7IiBrPSItMjMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hmZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImYW1wOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSIpIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyYzsiIGs9IjY4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iLSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSIuIiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJAIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iQSIgaz0iNzQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IkciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iSiIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iUyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJUIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJWIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlciIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJYIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlkiIGs9Ii0yMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9Il0iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImEiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJjIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImQiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImciIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJuIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im8iIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJxIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iViIgdTI9InIiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InUiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IngiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ9IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjNDsiIGs9IjczIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzU7IiBrPSI3MyIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hlNzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YWU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YTk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzY7IiBrPSI3MyIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQ4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gzYzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZTY7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hiYjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAyNjsiIGs9IjY4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzA7IiBrPSI3MyIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMzOyIgaz0iNzMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNTM7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTQ7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE3ODsiIGs9Ii0yMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMzk7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwM2E7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWE7IiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWU7IiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMyOyIgaz0iNzMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMTsiIGs9IjczIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTMxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNjA7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDE2MTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZmU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJmFtcDsiIGs9IjQxIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iKSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MmM7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Ii0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iLiIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSI6IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJBIiBrPSI2MiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkMiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iRyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJKIiBrPSI3NCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Ik8iIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iUSIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJTIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlYiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJXIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlgiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iXSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYSIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImMiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJlIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImYiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibSIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJuIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im8iIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icCIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJxIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InIiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ0IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InUiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ3IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9In0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM0OyIgaz0iNjEiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNTsiIGs9IjYxIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDY7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGU3OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM2OyIgaz0iNjEiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkODsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hlNjsiIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YWI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGJiOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDI2OyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMDsiIGs9IjYxIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzM7IiBrPSI2MSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ1OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNTI7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDE1MzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAzOTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAzYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxYTsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxZTsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzI7IiBrPSI2MSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMxOyIgaz0iNjEiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkMzsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDQ7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQyOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxMzE7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE2MDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZGQ7IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImYW1wOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IikiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ii0iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iQCIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJDIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IkciIGs9IjI5IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iTyIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJRIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlMiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iViIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJXIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iWSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iXSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJyIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ9IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDY7IiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hhZTsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YTk7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDg7IiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDNjMDsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNTsiIGs9IjI5IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTUyOyIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE3ODsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMzsiIGs9IjI5IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDQ7IiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQyOyIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxMzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE2MDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE2MTsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iKSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MmM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iLiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSIvIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IjoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJAIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkEiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iQyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJHIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkoiIGs9Ijg1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iTyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJRIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlQiIGs9Ii0yOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlYiIGs9Ii0yMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlgiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Il0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImEiIGs9IjYzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iYyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJkIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImUiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJnIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJvIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0icSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJyIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InMiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ1IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ4IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ9IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjNDsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzU7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ2OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hlNzsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjNjsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDNjMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZTY7IiBrPSI2MyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGFiOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hiYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAyNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzA7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMzOyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTUyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNTM7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMzk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwM2E7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMyOyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMTsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDM7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ0OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hmMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZmU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iLSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkMiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iRyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJKIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Ik8iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iUSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJUIiBrPSItMSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImMiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJlIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iaiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im8iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJxIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hlNzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hlNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ1OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxNTI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDE1MzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MjAxMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MjAxNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IiYjeGRkOyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iNyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iSiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJXIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJYIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJZIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJnIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJqIiBrPSItMTUwIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iJiN4MTc4OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZGQ7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlQiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iViIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJXIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlkiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJqIiBrPSItMTMwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3gxNzg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9Ij8iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJmIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0ieSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iPyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ0IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InYiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0idyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ4IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InkiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieiIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFjOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDE4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImMiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJjIiB1Mj0iJiN4MjAzOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ2IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ4IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZjA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGZlOyIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iISIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJmFtcDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iKSIgaz0iLTcwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iKiIgaz0iLTI4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MmM7IiBrPSI1OCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ii0iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLiIgaz0iNTgiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIvIiBrPSI2NSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IjoiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSI/IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJAIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJcIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJdIiBrPSItNzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJhIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImIiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImMiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iZCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJlIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iZyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImgiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImsiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImwiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0icSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0idCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ifSIgaz0iLTcwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZTc7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGFlOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YTk7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMTIyOyIgaz0iLTQ4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4M2MwOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZTY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGFiOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hiYjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAyNjsiIGs9IjU4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTUzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDEzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDE0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxZDsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDE5OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAzOTsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAzYTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxYTsiIGs9IjU4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxZTsiIGs9IjU4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IikiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IioiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDJjOyIgaz0iLTIzIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iLyIgaz0iLTQ4IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iPyIgaz0iLTIzIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iQCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iXSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iZyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iaiIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0idCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0ifSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iJiN4YWU7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3hhOTsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDNjMDsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMWM7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3gyMDFkOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iJiN4MjAxODsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMTk7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSI/IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iZiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0idiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJhIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImMiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iZCIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJlIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0ibyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJxIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iayIgdTI9InYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ5IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iJiN4ZTc7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeGU2OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3hhYjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iJiN4MTUzOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3gyMDM5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSI/IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iZiIgaz0iNCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0idiIgaz0iOSIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSI/IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iZiIgaz0iNCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0idiIgaz0iOSIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSIhIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9Ij8iIGs9IjMxIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idCIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ2IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InciIGs9IjExIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0ieCIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ5IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InoiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxYzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iISIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSI/IiBrPSIzMSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0icCIgdTI9InQiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ3IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IngiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ6IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMTg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiZhbXA7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iciIgdTI9IioiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MmM7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ii0iIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLiIgaz0iODAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSIvIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ij8iIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iYSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iciIgdTI9ImMiIGs9IjkiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJkIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iciIgdTI9ImYiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJvIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0icSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iciIgdTI9InQiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0ieCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeGU3OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeGU2OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMjY7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDE1MzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDEzOyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE0OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZDsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE5OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxYTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJzIiB1Mj0iJiN4MTYxOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9InMiIHUyPSI/IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0icyIgdTI9ImciIGs9IjgiIC8+Cis8aGtlcm4gdTE9InMiIHUyPSJzIiBrPSItNCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDJjOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iLiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iYSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJjIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImQiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iZSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJvIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9InEiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0idCIgaz0iNCIgLz4KKzxoa2VybiB1MT0idCIgdTI9InYiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0ieSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3hlNzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4ZTY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMjY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gxNTM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMWM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDE4OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxYTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMWU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InUiIHUyPSI/IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MmM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9Ii0iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iLiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJhIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImMiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iZCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJlIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0idiIgdTI9Im8iIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0icSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ2IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0idiIgdTI9InciIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ5IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU3OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3hlNjsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4YWI7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDE1MzsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDE4OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxOTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMzk7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDJjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSIuIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9ImEiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iYyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJkIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0idyIgdTI9ImUiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0ibyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJxIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0idyIgdTI9InYiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0idyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJ4IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0idyIgdTI9InkiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4ZTc7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeGU2OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAyNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MTUzOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDFjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxZDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMTg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDE5OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAzOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxYTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJhIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImMiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iZCIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJlIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9Im8iIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0icSIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJ2IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9InciIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0ieSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3hlNzsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTY7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gxNTM7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDFkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxODsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTk7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDM5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImEiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iYyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJkIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImUiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0ibyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJxIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InYiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0idyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InkiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4ZTc7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeGU2OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hhYjsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAyNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MTUzOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDFjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE5OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAzOTsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iLSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImciIGs9IjMiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hhYjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDEzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDE0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDM5OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSImI3hkZDsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IjciIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IkoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iViIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iVyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iWCIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iWSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iZyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iaiIgaz0iLTE1MCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IiYjeDE3ODsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTYwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE2MTsiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZGQ7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iKiIgaz0iNzUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDJjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSItIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ii4iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iPyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJHIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iSiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iUSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJUIiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iViIgaz0iNzMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlciIGs9IjYxIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlkiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJmIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iZyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InMiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0idiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ4IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InkiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hhZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gzYzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE3ODsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDE2MDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNjE7IiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGRkOyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IioiIGs9Ijc1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iLSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSIuIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Ij8iIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iRyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iVCIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlYiIGs9IjczIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJXIiBrPSI2MSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJZIiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iZiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImciIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJzIiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ3IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieCIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ5IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNzg7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hmZTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJDIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iRyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IkoiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJPIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iUSIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IlQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJWIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iVyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iYSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImMiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJkIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iZSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJnIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iaCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iayIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0ibCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0ibSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0ibiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0ibyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InEiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJyIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJ1IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGQ2OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGU3OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGQ4OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hlNjsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hkNTsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3gxNTI7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4MTUzOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeDIwMzk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZDM7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZDQ7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZDI7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4MTMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDE7IiB1Mj0iLyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQxOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMTsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTdkOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDJjOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9Ii4iIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJKIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iVCIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJXIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iWCIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJaIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGM2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAyNjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMWE7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxZTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iQSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGMwOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGMzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjMjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjMTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSI/IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9ImYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ5IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSI/IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9ImYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ5IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSI/IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9ImYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ5IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSI/IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9ImYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ5IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlNzsiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hlNzsiIHUyPSImI3gyMDM5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGU5OyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU5OyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGU5OyIgdTI9InYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ4IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZTk7IiB1Mj0ieSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9InYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ4IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZTg7IiB1Mj0ieSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGVhOyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGVhOyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGVhOyIgdTI9InYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ4IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZWE7IiB1Mj0ieSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGViOyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGViOyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGViOyIgdTI9InYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ4IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZWI7IiB1Mj0ieSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9Ij8iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iZiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9InYiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9InkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iPyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ0IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InciIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ4IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InoiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxYzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDE4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSIhIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ij8iIGs9IjMxIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0idCIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InYiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJ3IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0ieCIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InkiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJ6IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iISIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSI/IiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InQiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ2IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0idyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IngiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ5IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0ieiIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFjOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMTg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iPyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ0IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InciIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ4IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InoiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxYzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDE4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiMDsiIHUyPSI0IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YTM7IiB1Mj0iMSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhMzsiIHUyPSI0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iISIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSI/IiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9ImciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InciIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ4IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InoiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxYzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDE4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSIzIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJYIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9ImciIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4ZGQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iMyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJWIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iWCIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJnIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGZlOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iQCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IkMiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJHIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iSiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9Ik8iIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJRIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iVCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IlYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJXIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJhIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iYiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iYyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImQiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJlIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJoIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJrIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJsIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJtIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJvIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0icCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0icSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9InIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9InUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZDY7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZTc7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZDg7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGU2OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGFiOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGQ1OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gxNTM7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4MjAzOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkMzsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkNDsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkMjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gxMzE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxN2Q7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MmM7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iLiIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iQSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IkoiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJUIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJYIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iWSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IloiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDI2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxYTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFlOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iMyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJWIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJYIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iZyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9InYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ4IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZTY7IiB1Mj0ieSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iPyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ0IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InciIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ4IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InoiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxYzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDE4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNjE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZGQ7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IjIiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IjQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSI3IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iQyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IkciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iUSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlQiIGs9IjY4IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJWIiBrPSI2NSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iVyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlkiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJhIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iYyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9ImQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJlIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0ibyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJzIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0idCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InYiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ3IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InkiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hlNzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hlNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4MTUzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeDE3ODsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhMTsiIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hhMTsiIHUyPSJWIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YTE7IiB1Mj0iVyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGExOyIgdTI9IlkiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hhMTsiIHUyPSJmIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YTE7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGExOyIgdTI9InciIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hhMTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YTE7IiB1Mj0iJiN4MTc4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE5MjsiIHUyPSIxIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IiYjeGRkOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJmIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJUIiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9InYiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJ3IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0ieCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9InkiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJ6IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIwIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIxIiBrPSI4NiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIyIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIzIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI0IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI1IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iNiIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iNyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJDIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJHIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJPIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJRIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJUIiBrPSI4MyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJWIiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJXIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJmIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkNjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkODsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDU7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTI7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkMzsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ0OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDI7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MTYwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE2MTsiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZGQ7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iKiIgaz0iNzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDJjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSItIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Ii4iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iPyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJHIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iSiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iUSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJUIiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iViIgaz0iNzMiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlciIGs9IjYxIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlkiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJmIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InMiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ4IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InkiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hhZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gzYzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE3ODsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE2MDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNjE7IiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGRkOyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IioiIGs9Ijc1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iLSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSIuIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9Ij8iIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iRyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iVCIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlYiIGs9IjczIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJXIiBrPSI2MSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJZIiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iZiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9ImciIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJzIiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ3IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ieCIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ5IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNzg7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxN2Q7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MmM7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iLiIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iQSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IkoiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJUIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJYIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iWSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IloiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDI2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxYTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFlOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hmZTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IkMiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iRyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJKIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9Ik8iIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iUSIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJUIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IlYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iVyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImEiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iYiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImMiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJlIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJoIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iayIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImwiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJtIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0ibiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9Im8iIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0icCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InEiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iciIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDY7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGU3OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGQ4OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGU2OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDU7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeDE1MjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4MTUzOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gyMDM5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hkMzsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDQ7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGQyOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gxMzE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNTM7IiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ2IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ4IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTdkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iMSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlQiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlgiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IloiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeDE3ZDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJUIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJYIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJaIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTYxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4ZGQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iQSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iSiIgaz0iMTE4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlQiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iVyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJZIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0idSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGU3OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGMwOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE2MDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkEiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkoiIGs9IjEyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJTIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJhIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJjIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJkIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJlIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJxIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hjNDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGM1OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hlNzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGM2OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hlNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGMwOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4YzM7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE1MzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGMyOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4YzE7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNjE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hkZDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJBIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJKIiBrPSIxMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJXIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlkiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJhIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJjIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJkIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJlIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJnIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJtIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJvIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJwIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJxIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJyIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJzIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJ1IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGM1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4ZTc7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU2OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzA7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDE1MzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDE3ODsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4MTYwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iQSIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iSiIgaz0iMTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9Ik8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9ImEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9ImMiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9ImQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9ImUiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9Im8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9InEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGM0OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4YzU7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGU3OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4YzY7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGU2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4YzA7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hjMzsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4MTUzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4YzI7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hjMTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYxOyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImYW1wOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSIpIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iLSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ii8iIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iOiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iQSIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJDIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkciIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iSiIgaz0iODUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJPIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlEiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iUyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iVCIgaz0iLTI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iViIgaz0iLTIzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iWCIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iYSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJjIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ibSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Im8iIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0icCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJxIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0icyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGM0OyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjNTsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDY7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGU3OyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGM2OyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YWI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMDsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzM7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ1OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNTI7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDE1MzsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzI7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMxOyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkMzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzOTsiIHUyPSImI3hkZDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9ImYiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAzOTsiIHUyPSImI3gxNzg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IlQiIGs9IjExMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9InYiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9InciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IngiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9InkiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9InoiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iMCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iMSIgaz0iODYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iMiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iMyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iNCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iNSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IjYiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IjciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iOSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iQyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iRyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iTyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iUSIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVCIgaz0iODMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iViIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iaiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM1OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ4OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMyOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQzOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDQ7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkMjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMSIgaz0iODYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNCIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjYiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iOSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iQyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iRyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iTyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iUSIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iVCIgaz0iODMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iViIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iVyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iZiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iaiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM1OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ4OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeDE1MjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMyOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQzOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDQ7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkMjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTYxOyIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkZDsiIGs9IjU0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSIqIiBrPSI3NSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MmM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ii0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iLiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSI/IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iQCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iQyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJKIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ik8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJRIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iUyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlQiIGs9IjU5IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJWIiBrPSI3MyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iVyIgaz0iNjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iWSIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJnIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0icyIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ0IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ2IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0idyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IngiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ieSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGE5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIxMjI7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDNjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMjY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDE4OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTc4OyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZmU7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iQyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IkciIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJKIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iTyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IlEiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJUIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iViIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IlciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImEiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJiIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJjIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImUiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImgiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImwiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9Im0iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9Im4iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9Im8iIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJwIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJxIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iciIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0idSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hkNjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hlNzsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hkODsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZTY7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4YWI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZDU7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4MTUyOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeDE1MzsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3gyMDM5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGQzOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGQ0OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGQyOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeDEzMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDE2MDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNjE7IiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGRkOyIgaz0iNTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IioiIGs9Ijc1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iLSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSIuIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Ij8iIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJDIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iRyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iVCIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlYiIGs9IjczIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJXIiBrPSI2MSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJZIiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iZiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImciIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJzIiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ3IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ieCIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ5IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNzg7IiBrPSI1NCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hmZTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJDIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iRyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IkoiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJPIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iUSIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IlQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJWIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iVyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iYSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImMiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJkIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iZSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJnIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iaCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iayIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0ibCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0ibSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0ibiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0ibyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9InAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9InEiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJyIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJ1IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGQ2OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGU3OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGQ4OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hlNjsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hkNTsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3gxNTI7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4MTUzOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeDIwMzk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4ZDM7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4ZDQ7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4ZDI7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4MTMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4ZmU7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iQyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IkciIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJKIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iTyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IlEiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJUIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iViIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IlciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImEiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJiIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJjIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iZCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImUiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iZyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImgiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImwiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9Im0iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9Im4iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9Im8iIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJwIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJxIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iciIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0idSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hkNjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hlNzsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hkODsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4ZTY7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4YWI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4ZDU7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4MTUyOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeDE1MzsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3gyMDM5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGQzOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGQ0OyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGQyOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeDEzMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGNkOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjZDsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2Q7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNlOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjZTsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNmOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2Y7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNjOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYzsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2M7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeGRkOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDE3ZDsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyYzsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSIuIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJBIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iSiIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlQiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iVyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlgiIGs9IjI5IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJZIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iWiIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImQiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Im0iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Im8iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9InAiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9InIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9InUiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZTc7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hlNjsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMjY7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDFhOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMWU7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTdkOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDJjOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Ii4iIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJKIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iVCIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJXIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iWCIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJaIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iZCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibiIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0icSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iciIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hlNzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeGM2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeGU2OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAyNjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gxNTM7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMWE7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gxMzE7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxN2Q7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MmM7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iLiIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iQSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IkoiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJUIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJYIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IloiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJhIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJjIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJlIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJtIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJuIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJwIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJxIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJ1IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDI2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDE1MzsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAxYTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDFlOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDEzMTsiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSJBIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGM0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGM1OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGM2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzA7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGMyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGMxOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSJBIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM1OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4YzA7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4YzM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMxOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSJBIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGM0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGM1OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGM2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzA7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMxOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGE0OyIgdTI9IjQiIGs9IjIwIiAvPgorCis8L2ZvbnQ+Cis8L2RlZnM+Cis8dGV4dCB4PSI0MCIgeT0iNDAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIEJvbGQiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID5BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBBw4HDgMOCw4TDhcODw4YgQ8OHIETDkCBFw4nDiMOKw4sgSSDDjSDDjCDDjiDDjyBOw5E8L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iODAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIEJvbGQiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID5Pw5PDksOUw5bDlcOYxZIgU8WgIFXDmsOZw5vDnCBZw53FuCBaxb0gw54gYcOhw6DDosOkw6XDo8OmIGPDpyBkw7AgZcOpw6jDqsOrIGkgxLEgw60gw6wgw64gw68gbsOxIG/Ds8Oyw7TDtsO1w7jFkyBzxaHDnyB1w7rDucO7w7wgecO9w78gesW+PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjEyMCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgQm9sZCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPsO+IDEyMzQ1Njc4OTAgwr0gwrwgwr4gJSDigLAgJMKiwqPCpcaS4oKswqQg4oCgIOKAoSDCpyDCtiAjIF5+wrUgK8OXwrEgJmx0OyA9ICZndDsgw7fCrCAhwqE/wr8gJnF1b3Q7ICZhbXA7ICZhcG9zOyAqIMKwIC4gLCA6IDsgKCkgWyBcIF0ge30gLyB8PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjE2MCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgQm9sZCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPsKmIF8g4oCaIOKAniDigKYg4oC54oC6IMKrwrsg4oCYIOKAmSDigJwg4oCdIOKAoiDCrSAtIOKAkyDigJQgQCDCqSDCriDihKIgwqrCuiDCucKywrMgwrQgYCDLhiDLnCDCqCDCryDCtyDCuDwvdGV4dD4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkJvbGQudHRmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkJvbGQudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTM0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyQm9sZC50dGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkJvbGQud29mZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJCb2xkLndvZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmZDI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJCb2xkLndvZmYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkl0YWxpYy5lb3QgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAySXRhbGljLmVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIzZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkl0YWxpYy5lb3QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkl0YWxpYy5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAySXRhbGljLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmYzM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkl0YWxpYy5zdmcKQEAgLTAsMCArMSwzNzk5IEBACis8P3htbCAgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIiA+Cis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgPgorPG1ldGFkYXRhPgorPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorPGlkPjwhW0NEQVRBW09tbmVzX0FUVCBXMDIgSXRhbGljXV0+PC9pZD4KKzx2ZW5kb3I+TW9ub3R5cGUgSW1hZ2luZyBJbmMuPC92ZW5kb3I+Cis8Y3JlZGl0cz4KKzxuYW1lPkZvbnRzLmNvbSBXZWJGb250czwvbmFtZT4KKzxVUkw+aHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbTwvVVJMPgorPHJvbGU+SG9tZSBvZiB0aGUgV2ViIGZvbnRzPC9yb2xlPgorPC9jcmVkaXRzPgorPGxpY2Vuc2U+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb20vTGVnYWw8L1VSTD4KKzwvbGljZW5zZT4KKzxjb3B5cmlnaHQ+PCFbQ0RBVEFbR2VuZXJhdGVkIGJ5IFJvYm9Gb2ddXT48L2NvcHlyaWdodD4KKzx0cmFkZW1hcms+PC90cmFkZW1hcms+Cis8bGljZW5zZWU+Cis8bmFtZT48L25hbWU+Cis8L2xpY2Vuc2VlPgorPC9tZXRhZGF0YT4KKzxkZWZzID4KKzxmb250IGhvcml6LWFkdi14PSI1NTQiIGlkPSJPbW5lc19BVFRXMDJJdGFsaWMiPgorPGZvbnQtZmFjZSBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBJdGFsaWMiIHBhbm9zZS0xPSIyIDAgNiA2IDQgMCAwIDkgMCA0IiBhc2NlbnQ9IjcwMCIgZGVzY2VudD0iLTMwMCIgdW5pdHMtcGVyLWVtPSIxMDAwIiBhbHBoYWJldGljPSIwIj4KKzwvZm9udC1mYWNlPgorPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjE3MCIgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGdseXBoLW5hbWU9InNwYWNlIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiEiIGdseXBoLW5hbWU9ImV4Y2xhbSIgaG9yaXotYWR2LXg9IjI4MSIgZD0iTTEzNSAxNzdRMTIwIDE3NyAxMTYgMTgzVDExNCAyMDVMMTg0IDY0N0gyNzNMMTUyIDE5N1ExNDcgMTc3IDEzNSAxNzdaTTk3IC02UTc0IC02IDYyIDNUNDkgMjhRNDkgNjQgNjUgODBRNzggOTMgMTAyIDkzUTEyNSA5MyAxMzcgODRUMTUwIDU5UTE1MCAyMyAxMzQgN1ExMjEgLTYgOTcgLTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGdseXBoLW5hbWU9InF1b3RlZGJsIiBob3Jpei1hZHYteD0iMzkxIiBkPSJNMzEwIDM5MFEyOTUgMzkwIDI5MCAzOTVUMjg3IDQxOUwzMTEgNjQ3SDQwNUwzMzEgNDE1UTMyNCAzOTAgMzEwIDM5MFpNMTYxIDM5MFExNDYgMzkwIDE0MSAzOTVUMTM4IDQxOUwxNjIgNjQ3SDI1NkwxODIgNDE1UTE3NSAzOTAgMTYxIDM5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiMiIGdseXBoLW5hbWU9Im51bWJlcnNpZ24iIGhvcml6LWFkdi14PSI2NTkiIGQ9Ik0xNjYgLTFRMTY2IC0zIDE1NiAtNFQxMzUgMVQxMjEgMjRUMTI3IDc4TDE1NyAxNzVIMjRRMjQgMTc2IDI1IDE3OVEyNiAxODEgMjYgMTgzVDI4IDE5MUwzNSAyMjZRMzUgMjI4IDM1IDIyOVQzNiAyMzFRMzYgMjMyIDM3IDIzM0gxNzRMMjMwIDQxNEg5OFE5OCA0MTUgOTkgNDE4UTEwMCA0MjAgMTAwIDQyMlQxMDIgNDMwTDEwOSA0NjVRMTA5IDQ2NyAxMDkgNDY4VDExMCA0NzBRMTEwIDQ3MSAxMTEgNDcySDI0N0wzMDEgNjQ4UTMwMSA2NDkgMzExIDY1MFQzMzIgNjQ2VDM0NiA2MjNUMzQwIDU2OUwzMTAgNDcySDQ3NUw1MjkgNjQ4UTUyOSA2NDkgNTM5IDY1MFQ1NjAgNjQ2VDU3NCA2MjNUNTY4IDU2OUw1MzggNDcySDY3MFE2NzAgNDcxIDY2OSA0NjhRNjY3IDQ2MyA2NjYgNDU2TDY1OSA0MjFRNjU4IDQxOCA2NTggNDE2UTY1OCA0MTUgNjU3IDQxNEg1MjBMNDY1IDIzM0g1OTdRNTk3IDIzMiA1OTYgMjI5UTU5NCAyMjQgNTkzIDIxN0w1ODYgMTgyUTU4NSAxNzkgNTg1IDE3N1E1ODUgMTc2IDU4NCAxNzVINDQ3TDM5NCAtMVEzOTQgLTMgMzg0IC00VDM2MyAxVDM0OSAyNFQzNTUgNzhMMzg1IDE3NUgyMjBMMTY2IC0xWk00MDQgMjMxTDQ2MCA0MTZIMjkxTDIzNSAyMzFINDA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJCIgZ2x5cGgtbmFtZT0iZG9sbGFyIiBob3Jpei1hZHYteD0iNTY3IiBkPSJNMTk2IC01UTE1MyA0IDEyMCAyMVQ2NSA2MVE0OCA3OCAzOCA5NlQyOCAxMzNRMjggMTQ2IDM0IDE1NFQ0OCAxNjZUNjMgMTcwVDcwIDE3MFE4OCAxMjUgMTIzIDk1VDIxMSA1M0wyNjUgMzA0UTIzNiAzMTYgMjEwIDMzMVQxNjIgMzY2VDEyOSA0MTRUMTE2IDQ4MFExMTYgNTE3IDEzMSA1NTBUMTc0IDYwN1QyNDMgNjQ1VDMzMyA2NTlIMzM5TDM1NyA3NDJINDE3TDM5OCA2NTRRNDQwIDY0NiA0NzAgNjMxVDUyMSA1OTVRNTUzIDU2MyA1NTMgNTI5UTU1MyA1MTYgNTQ3IDUwOVQ1MzQgNDk3VDUyMCA0OTJUNTEyIDQ5M1E0OTUgNTMxIDQ2NCA1NThUMzgyIDU5NUwzMzAgMzUwUTM2MSAzMzcgMzkxIDMyM1Q0NDQgMjg4VDQ4MSAyNDFUNDk1IDE3NFE0OTUgMTMyIDQ4MCA5OFQ0MzcgNDBUMzY2IDJUMjY5IC0xMkgyNTVMMjM2IC05OEgxNzZMMTk2IC01Wk0yNzMgNDdRMzUxIDQ3IDM4OCA3OVQ0MjYgMTY4UTQyNiAxOTAgNDE4IDIwN1QzOTQgMjM3VDM1OCAyNjJUMzEzIDI4NEwyNjMgNDdIMjczWk0zMzEgNjAwSDMyOVEyOTcgNjAwIDI3MSA1OTJUMjI1IDU2OFQxOTYgNTMyVDE4NSA0ODdRMTg1IDQ0MiAyMTIgNDE3VDI4MiAzNzFMMzMxIDYwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiUiIGdseXBoLW5hbWU9InBlcmNlbnQiIGhvcml6LWFkdi14PSI3NjYiIGQ9Ik0yMzIgMzQ3UTIwNCAzNDcgMTc5IDM1NlQxMzYgMzg0VDEwNyA0MjdUOTYgNDg0UTk2IDUxOCAxMDggNTQ5VDE0MyA2MDVUMTk1IDY0M1QyNjIgNjU3UTI5MCA2NTcgMzE1IDY0OFQzNTggNjIwVDM4NyA1NzdUMzk4IDUyMFEzOTggNDg1IDM4NiA0NTRUMzUxIDM5OVQyOTkgMzYxVDIzMiAzNDdaTTY5IC05UTY4IC0xMCA2NCAtOVQ1NSAtNVQ0NiA0VDQyIDE4UTQyIDMxIDQ5IDQxVDc4IDcyTDczNCA2NjJRNzM1IDY2MyA3MzkgNjYyVDc0OCA2NThUNzU3IDY0OVQ3NjEgNjM1UTc2MSA2MjIgNzU0IDYxMlQ3MjUgNTgxTDY5IC05Wk01NDEgLTRRNTEzIC00IDQ4OCA1VDQ0NSAzM1Q0MTYgNzZUNDA1IDEzM1E0MDUgMTY3IDQxNyAxOThUNDUyIDI1NFQ1MDQgMjkyVDU3MSAzMDZRNTk5IDMwNiA2MjQgMjk3VDY2NyAyNjlUNjk2IDIyNlQ3MDcgMTY5UTcwNyAxMzQgNjk1IDEwM1Q2NjAgNDhUNjA4IDEwVDU0MSAtNFpNMjM2IDM5OFEyNTggMzk4IDI3OCA0MDdUMzEyIDQzM1QzMzQgNDcxVDM0MyA1MTdRMzQzIDU1NSAzMTkgNTgwVDI1OCA2MDZRMjM1IDYwNiAyMTYgNTk3VDE4MiA1NzFUMTYwIDUzM1QxNTEgNDg3UTE1MSA0NDkgMTc2IDQyNFQyMzYgMzk4Wk01NDUgNDdRNTY3IDQ3IDU4NyA1NlQ2MjEgODJUNjQzIDEyMFQ2NTIgMTY2UTY1MiAyMDQgNjI4IDIyOVQ1NjcgMjU1UTU0NCAyNTUgNTI1IDI0NlQ0OTEgMjIwVDQ2OSAxODJUNDYwIDEzNlE0NjAgOTggNDg1IDczVDU0NSA0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBnbHlwaC1uYW1lPSJhbXBlcnNhbmQiIGhvcml6LWFkdi14PSI2ODUiIGQ9Ik0yNDYgLTEyUTE5NiAtMTIgMTU3IDFUOTAgMzhUNDkgOTVUMzUgMTY3UTM1IDIxMSA0OSAyNDRUOTEgMzAzVDE1NiAzNDdUMjQzIDM3N1EyMjkgMzk5IDIyMCA0MjZUMjExIDQ4NVEyMTEgNTIxIDIyNCA1NTJUMjYxIDYwOFQzMTcgNjQ1VDM4OSA2NTlRNDIwIDY1OSA0NDcgNjQ5VDQ5MyA2MjFUNTIzIDU3OFQ1MzQgNTIxUTUzNCAzODMgMzQyIDM0Nkw0ODUgMTYxUTUyMyAyMDggNTQ2IDI2M1Q1NzggMzkxSDYzOVE2MjIgMjMwIDUyMCAxMTdMNTI0IDExMVE1NTEgNzYgNTczIDYwVDYzMSA0M1E2MzIgNDMgNjMyIDM2VDYzMCAyMFQ2MTggNFQ1OTAgLTRRNTUzIC00IDUzMSAxNFQ0ODIgNjdMNDc2IDc0UTQzMSAzNSAzNzYgMTJUMjQ2IC0xMlpNMzA5IDM5MFEzNDkgMzk4IDM4MCA0MDdUNDMxIDQzMVQ0NjEgNDY3VDQ3MiA1MjBRNDcyIDU1OCA0NDcgNTgwVDM4MyA2MDNRMzU4IDYwMyAzMzggNTkzVDMwNSA1NjhUMjg0IDUzMlQyNzYgNDkwUTI3NiA0NjAgMjgzIDQzOFQzMDkgMzkwWk0yNTMgNDZRMzE2IDQ2IDM1OSA2NFQ0NDMgMTE3TDI3NCAzMzNRMTkxIDMxNSAxNDYgMjc2VDEwMCAxNjlRMTAwIDE0NSAxMDkgMTIzVDEzNiA4M1QxODQgNTZUMjUzIDQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFwb3M7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsZSIgaG9yaXotYWR2LXg9IjI0MyIgZD0iTTE2MSAzOTBRMTQ2IDM5MCAxNDEgMzk1VDEzOCA0MTlMMTYyIDY0N0gyNTdMMTgyIDQxNVExNzUgMzkwIDE2MSAzOTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIoIiBnbHlwaC1uYW1lPSJwYXJlbmxlZnQiIGhvcml6LWFkdi14PSIzODUiIGQ9Ik0yNDggLTIwMFEyMjYgLTIwMCAyMDEgLTE4OFQxNTEgLTE1MFExMTAgLTEwOSA4MyAtNDFUNTYgMTIwUTU2IDE3OSA2NyAyMzlUMTAxIDM1NVQxNTYgNDYyVDIzMCA1NTVRMjc1IDYwMCAzMjIgNjI1VDQxNCA2NTBRNDMxIDY1MCA0MzggNjQzVDQ0NyA2MjVUNDQ1IDYwN1Q0MzUgNTk1UTM5NSA1OTMgMzU2IDU3NVQyNzMgNTEzUTIzNSA0NzUgMjA4IDQyOVQxNjEgMzMxVDEzMyAyMjVUMTI0IDEyMFExMjQgNDkgMTQzIC05VDIwMyAtMTA3UTIzNCAtMTM4IDI3NSAtMTUwUTI3NyAtMTUxIDI3OSAtMTU5VDI4MSAtMTc2VDI3MiAtMTkyVDI0OCAtMjAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKSIgZ2x5cGgtbmFtZT0icGFyZW5yaWdodCIgaG9yaXotYWR2LXg9IjM4NSIgZD0iTS0zMiAtMTk5US00OSAtMTk5IC01NiAtMTkyVC02NSAtMTc0VC02MyAtMTU2VC01MyAtMTQ0US0xMyAtMTQyIDI2IC0xMjRUMTA5IC02MlExNDYgLTI1IDE3NCAyMlQyMjEgMTIwVDI0OSAyMjZUMjU4IDMzMVEyNTggNDAyIDIzOSA0NjBUMTc5IDU1OFExNDggNTg5IDEwNyA2MDFRMTA1IDYwMiAxMDMgNjEwVDEwMSA2MjdUMTEwIDY0M1QxMzQgNjUxUTE1NiA2NTEgMTgxIDYzOVQyMzEgNjAxUTI3MiA1NjAgMjk5IDQ5MlQzMjYgMzMxUTMyNiAyNzIgMzE1IDIxMlQyODEgOTZUMjI2IC0xMVQxNTIgLTEwNFExMDcgLTE0OSA2MCAtMTc0VC0zMiAtMTk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKiIgZ2x5cGgtbmFtZT0iYXN0ZXJpc2siIGhvcml6LWFkdi14PSI0MTEiIGQ9Ik0xNTQgMzUyUTE1MCAzNTYgMTUwIDM2M1QxNTYgMzgxTDIxNyA0NzJMMTE1IDUxMVE5NyA1MTggOTcgNTI5UTk3IDU2NCAxMzAgNTU1TDIzNiA1MjZMMjQwIDYzNFEyNDEgNjUwIDI0NiA2NTRUMjYzIDY1OVEyNzQgNjU5IDI3OSA2NTVUMjg2IDYzNEwyOTAgNTI2TDM5NiA1NTVRNDI5IDU2NCA0MjkgNTI5UTQyOSA1MTggNDExIDUxMUwzMDkgNDcyTDM3MCAzODFRMzc3IDM3MCAzNzcgMzYzVDM3MiAzNTJRMzYyIDM0MyAzNTMgMzQyVDMzMiAzNTRMMjYzIDQ0MEwxOTQgMzU0UTE4MyAzNDAgMTc0IDM0MVQxNTQgMzUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKyIgZ2x5cGgtbmFtZT0icGx1cyIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTI0NCAzNFEyMzMgMzQgMjI1IDQwVDIyMCA2NUwyNTcgMjM5SDk4UTY5IDIzOSA2OSAyNTVRNjkgMjYzIDcyIDI3NFQ4MSAyOTBRODggMjk3IDEwNSAyOTdIMjY5TDMwNCA0NjBRMzA4IDQ3NyAzMTUgNDg0VDMzMyA0OTFIMzQxUTM1MiA0OTEgMzYwIDQ4NVQzNjUgNDYwTDMzMCAyOTdINDg5UTUxOCAyOTcgNTE4IDI4MVE1MTggMjczIDUxNSAyNjJUNTA2IDI0NlE0OTkgMjM5IDQ4MiAyMzlIMzE4TDI4MSA2NVEyNzcgNDggMjcwIDQxVDI1MiAzNEgyNDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyYzsiIGdseXBoLW5hbWU9ImNvbW1hIiBob3Jpei1hZHYteD0iMjQzIiBkPSJNLTExIC0xMzJRLTEzIC0xMzUgLTE5IC0xMzRULTMwIC0xMjlULTM5IC0xMjFULTQxIC0xMTJMNjkgOThRNzAgOTkgNzkgOTlUMTAwIDk2VDEyMSA4NVQxMzEgNjVRMTMxIDU0IDEyNyA0NFQxMTIgMjBMLTExIC0xMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSItIiBnbHlwaC1uYW1lPSJoeXBoZW4iIGhvcml6LWFkdi14PSI0MDAiIGQ9Ik02NiAyNzJIMzM3VjIxMkg2NlYyNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBnbHlwaC1uYW1lPSJwZXJpb2QiIGhvcml6LWFkdi14PSIyNDMiIGQ9Ik03OCAtNlE1NSAtNiA0MyAzVDMwIDI4UTMwIDY0IDQ2IDgwUTU5IDkzIDgzIDkzUTEwNiA5MyAxMTggODRUMTMxIDU5UTEzMSAyMyAxMTUgN1ExMDIgLTYgNzggLTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIvIiBnbHlwaC1uYW1lPSJzbGFzaCIgaG9yaXotYWR2LXg9IjM1NyIgZD0iTS04MyAtMTkzTDM1NCA2NDdINDI4TC05IC0xOTNILTgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgZ2x5cGgtbmFtZT0iemVybyIgaG9yaXotYWR2LXg9IjY2MyIgZD0iTTMxOCAtMTJRMjYwIC0xMiAyMTYgNVQxNDEgNTRUOTYgMTI5VDgxIDIyM1E4MSAyNTkgODggMzAyVDEwNiAzOTJRMTE5IDQ0NSAxMzkgNDkzVDE5MiA1NzhUMjcxIDYzNlQzODIgNjU4UTQ0MCA2NTggNDg0IDY0MVQ1NTkgNTkyVDYwNCA1MTdUNjE5IDQyM1E2MTkgMzg3IDYxMiAzNDRUNTk0IDI1NFE1ODEgMjAxIDU2MSAxNTNUNTA4IDY4VDQyOSAxMFQzMTggLTEyWk0zMTggNDZRMzY5IDQ2IDQwNSA2NFQ0NjUgMTEzVDUwNCAxODJUNTI5IDI2MlE1NDAgMzA2IDU0NSAzNDhUNTUxIDQyM1E1NTEgNDYyIDUzOSA0OTVUNTA2IDU1MVQ0NTMgNTg3VDM4MiA2MDBRMzMxIDYwMCAyOTUgNTgyVDIzNSA1MzNUMTk2IDQ2NFQxNzEgMzg0UTE2MCAzNDAgMTU1IDI5OFQxNDkgMjIzUTE0OSAxODQgMTYxIDE1MVQxOTQgOTVUMjQ3IDU5VDMxOCA0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGdseXBoLW5hbWU9Im9uZSIgaG9yaXotYWR2LXg9IjM4MSIgZD0iTTI0OCA1MzRRMjMzIDUxOSAyMTMgNTEyVDE3NSA1MDRRMTUzIDUwNCAxNDAgNTA4VDExOCA1MjFRMTA2IDUzMyAxMDYgNTUyUTEwNiA1NjMgMTEwIDU3MVQxMjAgNTg2VDEzMSA1OTVUMTM2IDU5OFExNDQgNTg3IDE1OCA1ODBUMTkzIDU3M1EyMjUgNTczIDI0OSA1OTZUMjgyIDY1MUgzMTBRMzI1IDY1MSAzMzEgNjQyVDMzNCA2MTZMMjAzIDBIMTM2TDI0OCA1MzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIyIiBnbHlwaC1uYW1lPSJ0d28iIGQ9Ik0xMzYgMTYyUTk4IDEyNCA5MiA2Mkg0NjhMNDYzIDM3UTQ2MSAzMSA0NjEgMjVUNDU4IDEzUTQ1NiA3IDQ1NSAwSDYwUTQ2IDAgMzUgMTRUMjQgNDZRMjQgOTQgNDAgMTM2VDg5IDIxMFExMjcgMjQ4IDE3NyAyNzFUMjg0IDMxNVEzMzMgMzMzIDM2OSAzNDhUNDMwIDM4M1Q0NjYgNDI2VDQ3OCA0ODVRNDc4IDUzMyA0NDAgNTY1VDMzMyA1OTdRMjY2IDU5NyAyMjYgNTY0VDE2MiA0ODBRMTYxIDQ3OCAxNTUgNDc5VDE0MiA0ODRUMTI4IDQ5NlQxMjIgNTE5UTEyMiA1MzMgMTMyIDU1M1QxNjAgNTkxUTE4NyA2MTggMjMxIDYzOFQzMzcgNjU5UTQzNCA2NTkgNDkxIDYxMlQ1NDggNDg1UTU0OCA0MzQgNTMxIDM5OVQ0ODIgMzM3VDQwNiAyOTFUMzA2IDI1MVEyNDUgMjI5IDIwNSAyMTBUMTM2IDE2MloiICAvPgorPGdseXBoIHVuaWNvZGU9IjMiIGdseXBoLW5hbWU9InRocmVlIiBob3Jpei1hZHYteD0iNTY2IiBkPSJNMjQyIC0xMlExNzcgLTEyIDEzMCA2VDU2IDUxUTMzIDc0IDI0IDk2VDE1IDEzMlExNSAxNDkgMjIgMTU5VDM3IDE3NVQ1MyAxODBUNjEgMTgwUTczIDExNiAxMjAgODJUMjQ2IDQ3UTI5MSA0NyAzMjMgNTlUMzc3IDkyVDQwOCAxMzlUNDE4IDE5NVE0MTggMjQ5IDM4MCAyODFUMjY2IDMxM0gxODRRMTg0IDMxNCAxODUgMzE3UTE4NiAzMTkgMTg2IDMyMVQxODggMzI5TDE5NSAzNjRRMTk1IDM2NiAxOTUgMzY3VDE5NiAzNjlRMTk2IDM3MCAxOTcgMzcxSDI3OVEzMzYgMzcxIDM3MiAzODFUNDI5IDQxMFQ0NTcgNDUxVDQ2NSA0OThRNDY1IDUyMSA0NTUgNTQwVDQyNSA1NzJUMzgxIDU5M1QzMjcgNjAxUTI2OSA2MDEgMjI1IDU3NVQxNTIgNTA3UTE1MSA1MDYgMTQ2IDUwN1QxMzQgNTEzVDEyMyA1MjRUMTE4IDU0MFExMTggNTY0IDE0NSA1OTFRMTc0IDYyMSAyMjAgNjQwVDMzMCA2NTlRMzcyIDY1OSA0MTAgNjUwVDQ3NiA2MjBUNTIwIDU3MFQ1MzcgNTAwUTUzNyA0NzEgNTI4IDQ0NFQ1MDEgMzk0VDQ1NCAzNTZUMzg3IDMzNFE0NDAgMzE3IDQ2NSAyODBUNDkwIDE5NlE0OTAgMTYxIDQ3NyAxMjRUNDM1IDU3VDM1OCA4VDI0MiAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI0IiBnbHlwaC1uYW1lPSJmb3VyIiBob3Jpei1hZHYteD0iNjA1IiBkPSJNMzY5IDE4NEg2NlE2NCAxODQgNjEgMTg4VDUzIDE5OVQ0NiAyMTRUNDMgMjMyUTQzIDI0OSA1MCAyNjJUNzcgMjk1TDQwNCA2MTJRNDI3IDYzNCA0NDIgNjQyVDQ3NyA2NTFRNTA5IDY1MSA1MTkgNjM4VDUyNCA2MDJMNDQ4IDI0Nkg1NjhRNTY4IDI0NSA1NjcgMjQyUTU2NSAyMzcgNTY0IDIyOUw1NTYgMTkxUTU1NSAxODggNTU1IDE4NVYxODRINDM1TDM5NiAwSDMzMUwzNjkgMTg0Wk0zODQgMjQ1TDQ1NiA1ODVMMTEwIDI0NUgzODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI1IiBnbHlwaC1uYW1lPSJmaXZlIiBob3Jpei1hZHYteD0iNTYyIiBkPSJNMTcxIDM3OFEyMjUgMzk5IDI4NSAzOTlRMzM2IDM5OSAzNzYgMzg2VDQ0NSAzNDlUNDg5IDI5MlQ1MDQgMjE5UTUwNCAxNjggNDg3IDEyNlQ0MzcgNTNUMzU3IDVUMjUxIC0xMlExODMgLTEyIDEzNSA3VDYwIDU1UTI4IDg4IDI4IDEyNFEyOCAxMzYgMzQgMTQ0VDQ5IDE1N1Q2NCAxNjNUNzEgMTYzUTg3IDExMiAxMzIgODBUMjUzIDQ4UTI5NCA0OCAzMjcgNjBUMzgzIDk0VDQyMCAxNDdUNDMzIDIxNVE0MzMgMjc1IDM5NiAzMDdUMjgwIDMzOVEyMjkgMzM5IDE5NSAzMjlUMTM0IDMwNFExMTEgMzA5IDEwNCAzMjJUMTAyIDM1NUwxNTQgNjA2UTE1OCA2MjUgMTY5IDYzNlQyMDEgNjQ3SDU2M1E1NjMgNjQ0IDU2MiA2NDBRNTYxIDYzNyA1NjAgNjM0VDU1OCA2MjVRNTU2IDYxOCA1NTYgNjEyVDU1MyA1OTlRNTUxIDU5MiA1NTAgNTg1SDIxNUwxNzEgMzc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNiIgZ2x5cGgtbmFtZT0ic2l4IiBob3Jpei1hZHYteD0iNjA5IiBkPSJNMzA2IC0xMlEyNTYgLTEyIDIxNSAzVDE0NCA0N1Q5OCAxMTlUODEgMjE5UTgxIDI1MyA4OCAzMDJUMTEwIDQwM1QxNTAgNTA0VDIwOSA1ODdRMjI2IDYwNCAyNDQgNjE3VDI4NCA2NDBUMzMzIDY1NFQzOTYgNjU5UTQ1MiA2NTkgNDkwIDY0MlQ1NTEgNjAzUTU2NyA1ODYgNTczIDU3MVQ1ODAgNTQ1UTU4MCA1MzMgNTc0IDUyNVQ1NjEgNTExVDU0OCA1MDVUNTQxIDUwNVE1MTggNTU0IDQ3OCA1NzdUMzg5IDYwMVEyOTkgNjAxIDI0NCA1MzVUMTYyIDM0NVExOTEgMzY4IDIzMyAzODZUMzM3IDQwNFEzODMgNDA0IDQyMSAzOTJUNDg3IDM1N1Q1MzAgMzAxVDU0NiAyMjRRNTQ2IDE3OSA1MjkgMTM3VDQ4MCA2MVQ0MDQgOFQzMDYgLTEyWk0zMDcgNDhRMzQ4IDQ4IDM4MCA2MVQ0MzUgOThUNDcwIDE1M1Q0ODIgMjIwUTQ4MiAyNzggNDQ0IDMxM1QzMjkgMzQ4UTI2NyAzNDggMjI2IDMyOFQxNTAgMjc4UTE0NyAyNjEgMTQ2IDI0NlQxNDUgMjE3UTE0NSAxMzYgMTg2IDkyVDMwNyA0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjciIGdseXBoLW5hbWU9InNldmVuIiBob3Jpei1hZHYteD0iNTUyIiBkPSJNMTQyIC00UTE0MiAtNCAxMzAgLTJUMTA5IDhUMTAwIDM1VDEyNSA4NEw1MDcgNTg1SDExNVExMTUgNTg2IDExNiA1OTBRMTE3IDU5MiAxMTcgNTk2VDEyMCA2MDdRMTIxIDYxOSAxMjUgNjMzUTEyNyA2NDAgMTI4IDY0N0g1NDBRNTQxIDY0NyA1NDYgNjQzVDU1NyA2MzJUNTY3IDYxNVQ1NzIgNTkzUTU3MiA1ODIgNTY4IDU3MVQ1NDkgNTQwTDE0MiAtNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGdseXBoLW5hbWU9ImVpZ2h0IiBob3Jpei1hZHYteD0iNjAzIiBkPSJNMjg3IC0xMlEyMzMgLTEyIDE4OSAwVDExNCAzNFQ2NSA4OVQ0NyAxNjFRNDcgMjI1IDkzIDI3NFQyMTkgMzQxUTE3NyAzNTggMTU1IDM4OVQxMzIgNDY2UTEzMiA1MDUgMTQ5IDU0MFQxOTYgNjAyVDI3MCA2NDNUMzY1IDY1OVE0MTAgNjU5IDQ0OSA2NDhUNTE2IDYxNVQ1NjEgNTY1VDU3OCA0OTlRNTc4IDQ0MSA1NDAgMzkzVDQyNSAzMjZRNDc2IDMwNSA1MDMgMjY5VDUzMCAxODZRNTMwIDE0NSA1MTMgMTA5VDQ2NSA0NlQzODggNFQyODcgLTEyWk0zNTIgMzYyUTQyOCAzNjIgNDY5IDM5OFQ1MTAgNDkzUTUxMCA1NDQgNDY4IDU3M1QzNTYgNjAyUTI4MyA2MDIgMjQyIDU2NVQyMDAgNDY5UTIwMCA0MTggMjQxIDM5MFQzNTIgMzYyWk0yODkgNDVRMzMwIDQ1IDM2MiA1NlQ0MTcgODVUNDUwIDEzMFQ0NjIgMTg2UTQ2MiAyMzggNDE1IDI3MFQyODQgMzAzUTI0OSAzMDMgMjE4IDI5M1QxNjQgMjY1VDEyOCAyMjJUMTE1IDE2NVExMTUgMTExIDE2MiA3OFQyODkgNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI5IiBnbHlwaC1uYW1lPSJuaW5lIiBob3Jpei1hZHYteD0iNjA5IiBkPSJNMjUwIC0xMlExOTQgLTEyIDE1NiA1VDk1IDQ0UTc5IDYwIDczIDc1VDY2IDEwMlE2NiAxMTQgNzIgMTIyVDg1IDEzNlQ5OCAxNDJUMTA1IDE0MlExMjggOTMgMTY4IDcwVDI1NyA0NlEzNDUgNDYgMzk5IDEwOVQ0ODIgMjkyUTQ1MiAyNjkgNDA5IDI1MVQzMDggMjMzUTIxMSAyMzMgMTU1IDI4MFQ5OSA0MThROTkgNDY2IDExNiA1MDlUMTY1IDU4NlQyNDEgNjM5VDM0MCA2NTlRMzkwIDY1OSA0MzEgNjQ0VDUwMiA2MDBUNTQ4IDUyOFQ1NjUgNDI4UTU2NSAzOTMgNTU4IDM0NFQ1MzYgMjQ0VDQ5NiAxNDNUNDM3IDYwUTQyMCA0MyA0MDIgMzBUMzYyIDdUMzEzIC03VDI1MCAtMTJaTTMxNiAyODlRMzc1IDI4OSA0MTcgMzA5VDQ5NCAzNTlRNTAxIDM5NyA1MDEgNDMwUTUwMSA1MTEgNDYwIDU1NVQzMzkgNTk5UTI5OCA1OTkgMjY1IDU4NlQyMTAgNTQ4VDE3NSA0OTJUMTYzIDQyMlExNjMgMzYxIDE5OSAzMjVUMzE2IDI4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjoiIGdseXBoLW5hbWU9ImNvbG9uIiBob3Jpei1hZHYteD0iMjczIiBkPSJNMTY1IDMzNFExNDIgMzM0IDEzMCAzNDNUMTE3IDM2OFExMTcgNDA0IDEzMyA0MjBRMTQ2IDQzMyAxNzAgNDMzUTE5MyA0MzMgMjA1IDQyNFQyMTggMzk5UTIxOCAzNjMgMjAyIDM0N1ExODkgMzM0IDE2NSAzMzRaTTkzIC02UTcwIC02IDU4IDNUNDUgMjhRNDUgNjQgNjEgODBRNzQgOTMgOTggOTNRMTIxIDkzIDEzMyA4NFQxNDYgNTlRMTQ2IDIzIDEzMCA3UTExNyAtNiA5MyAtNloiICAvPgorPGdseXBoIHVuaWNvZGU9IjsiIGdseXBoLW5hbWU9InNlbWljb2xvbiIgaG9yaXotYWR2LXg9IjI3MyIgZD0iTTE2NSAzMzRRMTQyIDMzNCAxMzAgMzQzVDExNyAzNjhRMTE3IDQwNCAxMzMgNDIwUTE0NiA0MzMgMTcwIDQzM1ExOTMgNDMzIDIwNSA0MjRUMjE4IDM5OVEyMTggMzYzIDIwMiAzNDdRMTg5IDMzNCAxNjUgMzM0Wk00IC0xMzJRMiAtMTM1IC00IC0xMzRULTE1IC0xMjlULTI0IC0xMjFULTI2IC0xMTJMODQgOThRODUgOTkgOTQgOTlUMTE1IDk2VDEzNiA4NVQxNDYgNjVRMTQ2IDU0IDE0MiA0NFQxMjcgMjBMNCAtMTMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmx0OyIgZ2x5cGgtbmFtZT0ibGVzcyIgaG9yaXotYWR2LXg9IjUwMiIgZD0iTTkzIDIyMlE2OSAyMzcgNjkgMjYyUTY5IDI3OSA3NyAyOTJUMTExIDMxOEw0NjAgNDg2UTQ2MiA0ODcgNDcxIDQ3OFQ0ODEgNDU0UTQ4MiA0NDMgNDczIDQzMlQ0MzggNDA3TDEzNiAyNjVMMzY3IDEzMVEzOTIgMTE3IDQwMCAxMDRUNDA2IDgwUTQwNCA2NCAzOTUgNTZUMzgyIDUwTDkzIDIyMloiICAvPgorPGdseXBoIHVuaWNvZGU9Ij0iIGdseXBoLW5hbWU9ImVxdWFsIiBob3Jpei1hZHYteD0iNTczIiBkPSJNMTMzIDM0NlExMDIgMzQ2IDEwMiAzNjJRMTAyIDM3MCAxMDYgMzgyVDExNSA0MDBRMTIyIDQwNyAxNDAgNDA3SDUwMFE1MzEgNDA3IDUzMSAzOTFRNTMxIDM4MyA1MjcgMzcxVDUxOCAzNTNRNTExIDM0NiA0OTMgMzQ2SDEzM1pNODQgMTE5UTUzIDExOSA1MyAxMzVRNTMgMTQzIDU3IDE1NVQ2NiAxNzNRNzMgMTgwIDkxIDE4MEg0NTFRNDgyIDE4MCA0ODIgMTY0UTQ4MiAxNTYgNDc4IDE0NFQ0NjkgMTI2UTQ2MiAxMTkgNDQ0IDExOUg4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZndDsiIGdseXBoLW5hbWU9ImdyZWF0ZXIiIGhvcml6LWFkdi14PSI1MDIiIGQ9Ik01NSA1MFE1MyA0OSA0NCA1OFQzNCA4MlEzMyA5MyA0MiAxMDRUNzcgMTI5TDM3OSAyNzFMMTQ4IDQwNVExMjMgNDE5IDExNSA0MzJUMTA5IDQ1NlExMTEgNDcyIDEyMCA0ODBUMTMzIDQ4Nkw0MjIgMzE0UTQ0NiAyOTkgNDQ2IDI3NFE0NDYgMjU3IDQzOCAyNDRUNDA0IDIxOEw1NSA1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij8iIGdseXBoLW5hbWU9InF1ZXN0aW9uIiBob3Jpei1hZHYteD0iNDk3IiBkPSJNMTc1IDIxOVExODEgMjQ2IDE5MCAyNjVUMjE0IDMwMFQyNTEgMzI4VDMwNCAzNTFRMzM1IDM2MiAzNjAgMzczVDQwMiA0MDBUNDI4IDQzNVQ0MzggNDgzUTQzOCA1MDcgNDI5IDUyOFQ0MDMgNTY0VDM2MSA1ODlUMzA0IDU5OVEyNDcgNTk5IDIwOSA1NjVUMTUwIDQ3N1ExNTAgNDc1IDE0MyA0NzZUMTI4IDQ4MlQxMTQgNDkzVDEwNyA1MTNRMTA3IDUzMyAxMTggNTU0VDE0OSA1OTVRMTc3IDYyMyAyMTUgNjQxVDMwOCA2NTlRMzUzIDY1OSAzODkgNjQ2VDQ1MSA2MDhUNDkxIDU1MlQ1MDUgNDgzUTUwNSA0NDEgNDkwIDQxMVQ0NTIgMzYwVDQwMCAzMjZUMzQ3IDMwNVEzMTggMjk2IDI5OSAyODdUMjY4IDI2N1QyNDkgMjQzVDIzOCAyMTBMMjMwIDE3N0gxNjZMMTc1IDIxOVpNMTgyIC02UTE1OSAtNiAxNDcgM1QxMzQgMjhRMTM0IDY0IDE1MCA4MFExNjMgOTMgMTg3IDkzUTIxMCA5MyAyMjIgODRUMjM1IDU5UTIzNSAyMyAyMTkgN1EyMDYgLTYgMTgyIC02WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQCIgZ2x5cGgtbmFtZT0iYXQiIGhvcml6LWFkdi14PSI3ODAiIGQ9Ik00MDQgNDczUTQzOSA0NzMgNDY0IDQ1OFQ1MDEgNDE2TDUxMiA0NjZINTc1TDUzNyAyODZRNTI5IDI1MSA1NDAgMjMyVDU4NSAyMTJRNjM2IDIxMiA2NjYgMjU5VDY5NiAzODhRNjk2IDQzNyA2NzcgNDc4VDYyNSA1NDlUNTQ0IDU5NVQ0NDEgNjEyUTM3OCA2MTIgMzIyIDU4N1QyMjQgNTE3VDE1OCA0MTNUMTM0IDI4NVExMzQgMjMwIDE1MyAxODVUMjA4IDEwNlQyOTIgNTVUNDAwIDM2UTQ0MyAzNiA0ODQgNDhUNTU0IDc5UTU2MiA4NCA1NjkgODdUNTg4IDkxUTU5NSA5MSA2MDAgODdUNjEwIDc2VDYxNSA2NVQ2MTUgNThRNTgyIDMxIDUyNCAxMFQzOTUgLTEyUTMyNCAtMTIgMjY3IDlUMTY5IDY4VDEwNiAxNjBUODMgMjgxUTgzIDM2MCAxMTEgNDI5VDE4OCA1NDlUMzAzIDYyOVQ0NDYgNjU5UTUxNCA2NTkgNTY5IDY0MFQ2NjQgNTg2VDcyNCA1MDFUNzQ2IDM5MFE3NDYgMjgzIDcwMCAyMjNUNTc3IDE2M1E1MjYgMTYzIDUwMiAxODJUNDczIDIzMFE0MzUgMTY5IDM1OCAxNjlRMzA5IDE2OSAyNzYgMjAwVDI0MyAyODlRMjQzIDMyMyAyNTUgMzU2VDI4OCA0MTVUMzM5IDQ1N1Q0MDQgNDczWk0zNzUgMjIxUTQxMyAyMjEgNDQyIDI0OFQ0ODAgMzE1TDQ4OSAzNThRNDgxIDM4NyA0NjEgNDA0VDQwOSA0MjFRMzg1IDQyMSAzNjYgNDEwVDMzNCAzODFUMzEzIDM0MVQzMDYgMjk2UTMwNiAyNjEgMzI2IDI0MVQzNzUgMjIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQSIgZ2x5cGgtbmFtZT0iQSIgaG9yaXotYWR2LXg9IjY0MyIgZD0iTS0yNSAwTDM1MCA2MzFRMzU4IDY0NCAzNjcgNjQ5VDM5MyA2NTRRNDE5IDY1NCA0MjggNjQ2VDQ0MCA2MjRMNTY1IDBINDk0TDQ1NSAyMTFIMTc1TDU0IDBILTI1Wk00NDMgMjcxTDM4NiA1NzZMMjEwIDI3MUg0NDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJCIiBnbHlwaC1uYW1lPSJCIiBob3Jpei1hZHYteD0iNjM3IiBkPSJNMTcyIDYwNlExNzggNjQ3IDIxOSA2NDdINDAzUTQ5OSA2NDcgNTQ4IDYxMFQ1OTcgNTAxUTU5NyA0NDQgNTY3IDM5OVQ0NjAgMzMwUTUxNyAzMTQgNTQ1IDI3OVQ1NzMgMTk5UTU3MyAxNTkgNTYwIDEyM1Q1MTggNjBUNDQwIDE2VDMyMCAwSDQzTDE3MiA2MDZaTTMyNSA2MVE0MjEgNjEgNDYyIDk1VDUwMyAxOTlRNTAzIDI0NSA0NjggMjcxVDM2MiAyOThIMTc1TDEyNCA2MUgzMjVaTTM2NyAzNThRNDQyIDM1OCA0ODQgMzk1VDUyNyA0OTJRNTI0IDU4NiAzOTYgNTg2SDIzNkwxODcgMzU4SDM2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IkMiIGdseXBoLW5hbWU9IkMiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik0zNzAgLTEyUTMwNCAtMTIgMjUwIDdUMTU4IDYzVDk5IDE1MFQ3OCAyNjdRNzggMzQ2IDEwNSA0MTdUMTgxIDU0MlQyOTUgNjI3VDQzOCA2NTlRNTEwIDY1OSA1NTYgNjM4VDYzMSA1ODhRNjUzIDU2NiA2NjMgNTQ0VDY3MyA1MDhRNjczIDQ5NSA2NjcgNDg3VDY1MyA0NzRUNjM4IDQ2OFQ2MjggNDY5UTU4MCA2MDAgNDM1IDYwMFEzNzQgNjAwIDMyMiA1NzRUMjMyIDUwNFQxNzIgNDAyVDE1MCAyNzdRMTUwIDIyNCAxNjYgMTgyVDIxMSAxMTBUMjgwIDY0VDM2OSA0OFE0MzkgNDggNDkxIDc2VDU3NiAxNTNRNTc3IDE1NCA1ODIgMTUzVDU5NCAxNDdUNjA1IDEzNVQ2MTAgMTE3UTYxMCA5MyA1ODEgNjRRNTY2IDQ5IDU0NSAzNlQ0OTYgMTJUNDM2IC01VDM3MCAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJEIiBnbHlwaC1uYW1lPSJEIiBob3Jpei1hZHYteD0iNjk0IiBkPSJNMTcyIDYwNlExNzggNjQ3IDIxOSA2NDdIMzI5UTQ4MCA2NDcgNTY0IDU3N1Q2NDkgMzc4UTY0OSAzMDAgNjI0IDIzMVQ1NDkgMTExVDQyMyAzMFQyNDYgMEg0M0wxNzIgNjA2Wk0yNTYgNjBRMzM5IDYwIDM5OSA4NVQ0OTkgMTUyVDU1OCAyNTBUNTc3IDM2OFE1NzcgNDcxIDUxMSA1MjlUMzI0IDU4N0gyMzZMMTI0IDYwSDI1NloiICAvPgorPGdseXBoIHVuaWNvZGU9IkUiIGdseXBoLW5hbWU9IkUiIGhvcml6LWFkdi14PSI2MTAiIGQ9Ik0xNzIgNjA2UTE3NiA2MjUgMTg3IDYzNlQyMTkgNjQ3SDYzNFE2MzMgNjQ2IDYzMyA2NDNRNjMyIDY0MSA2MzIgNjM4VDYzMSA2MzBRNjI5IDYyMiA2MjcgNjEwVDYyMyA1OTJRNjIxIDU4NiA2MjEgNTg2VjU4NUgyMzZMMTg4IDM2Mkg1MDFRNTAxIDM2MSA1MDAgMzU4UTQ5OCAzNTMgNDk3IDM0Nkw0ODkgMzA5UTQ4OCAzMDYgNDg4IDMwNFYzMDJIMTc1TDEyNCA2Mkg1MTRRNTE0IDYxIDUxMyA1OFE1MTEgNTMgNTEwIDQ1TDUwMiA3UTUwMSA0IDUwMSAxVjBINDNMMTcyIDYwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IkYiIGdseXBoLW5hbWU9IkYiIGhvcml6LWFkdi14PSI1NjciIGQ9Ik0xNzIgNjA2UTE3OCA2NDcgMjE5IDY0N0g2MDdRNjA2IDY0NiA2MDYgNjQzUTYwNSA2NDEgNjA1IDYzOFQ2MDQgNjMwUTYwMiA2MjIgNjAwIDYxMFQ1OTYgNTkyUTU5NSA1ODkgNTk1IDU4NlE1OTUgNTg1IDU5NCA1ODVIMjM2TDE4NCAzNDFINDYxUTQ2MCAzNDAgNDYwIDMzN1E0NTkgMzM1IDQ1OSAzMzJUNDU4IDMyNVE0NTYgMzE3IDQ1NCAzMDVUNDUwIDI4OFE0NDkgMjg1IDQ0OSAyODNRNDQ5IDI4MiA0NDggMjgxSDE3MUwxMTAgMEg0M0wxNzIgNjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRyIgZ2x5cGgtbmFtZT0iRyIgaG9yaXotYWR2LXg9Ijc0MCIgZD0iTTM2OCAtMTJRMzAzIC0xMiAyNTAgNlQxNTkgNjBUOTkgMTQ3VDc4IDI2NFE3OCAzNDIgMTA1IDQxM1QxODAgNTM5VDI5NiA2MjZUNDQzIDY1OVE1MTcgNjU5IDU2OCA2MzZUNjQ5IDU4NFE2NjYgNTY3IDY3NSA1NDhUNjg1IDUxNVE2ODUgNDk5IDY3OCA0OTBUNjYzIDQ3N1Q2NDcgNDczVDYzOSA0NzNRNjIwIDUyNyA1NjggNTYzVDQ0MiA1OTlRMzc4IDU5OSAzMjUgNTczVDIzMiA1MDFUMTcyIDM5N1QxNTAgMjcxUTE1MCAyMTcgMTY2IDE3NVQyMTAgMTA1VDI3OSA2MlQzNjkgNDdRNDY4IDQ3IDUyOSAxMDhRNTQzIDEyMiA1NTQgMTM2VDU3NCAxNjhUNTkxIDIxMFQ2MDYgMjY5SDM5MlEzOTIgMjcwIDM5MyAyNzNRMzk0IDI3NSAzOTQgMjc3VDM5NiAyODVRMzk4IDI5MyA0MDAgMzA1VDQwNCAzMjNRNDA0IDMyNSA0MDQgMzI2VDQwNSAzMjhWMzMwSDYzM1E2NTYgMzMwIDY2NSAzMThUNjcwIDI4NUw2MDkgLTFRNjA5IC00IDU5NSAtNFE1NzYgLTQgNTY2IDExVDU2MyA2NUw1NjUgNzRRNTQxIDM5IDQ5MSAxNFQzNjggLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSCIgZ2x5cGgtbmFtZT0iSCIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTE3NSA2MjBRMTc5IDYzNiAxODYgNjQzVDIwOSA2NTFIMjE4UTIzMyA2NTEgMjM5IDY0MlQyNDIgNjE2TDE4NyAzNTVINTY0TDYyMCA2MjBRNjI0IDYzNiA2MzEgNjQzVDY1NCA2NTFINjYzUTY3OCA2NTEgNjg0IDY0MlQ2ODcgNjE2TDU1NiAwSDQ4OUw1NTEgMjkzSDE3NEwxMTEgMEg0NEwxNzUgNjIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSSIgZ2x5cGgtbmFtZT0iSSIgaG9yaXotYWR2LXg9IjI3NiIgZD0iTTE4NyA2MTlRMTk0IDY1MSAyMjEgNjUxSDIzMFEyNDUgNjUxIDI1MSA2NDJUMjUzIDYxNUwxMjIgMEg1NUwxODcgNjE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSiIgZ2x5cGgtbmFtZT0iSiIgaG9yaXotYWR2LXg9IjQ3MSIgZD0iTTE3NSAtMTJRMTMwIC0xMiA5OSAyVDQ3IDM2UTMzIDUwIDI4IDYwVDIzIDgwUTIzIDkyIDI5IDEwMFQ0MiAxMTRUNTUgMTIwVDYyIDEyMVE3NyA4OCAxMDcgNjhUMTc2IDQ3UTIzMiA0NyAyNjIgODFUMzEwIDE5NEw0MDcgNjQ3SDQ3NEwzNzYgMTg1UTM1NCA4NCAzMDYgMzZUMTc1IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9IksiIGdseXBoLW5hbWU9IksiIGhvcml6LWFkdi14PSI1ODAiIGQ9Ik00NjcgLTVRNDU0IC01IDQ0MiAwVDQxNyAxN1QzODkgNDdUMzU0IDkzTDE4MSAzMjhMMTEwIDBINDNMMTc1IDYyMFExNzkgNjM3IDE4NiA2NDRUMjA5IDY1MUgyMThRMjUwIDY1MSAyNDIgNjE2TDE4NSAzNDZMNTcwIDY1OVE1NzEgNjYwIDU4MSA2NTZUNTk3IDY0MVQ1OTkgNjE1VDU2NSA1NzVMMjU2IDMyOEw0MTcgMTE2UTQzNCA5MyA0NDYgNzlUNDcwIDU2VDQ5MSA0NFQ1MTUgMzlRNTE2IDM5IDUxNiAzMlQ1MTIgMTdUNDk4IDJUNDY3IC01WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTCIgZ2x5cGgtbmFtZT0iTCIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTE3NSA2MjBRMTc5IDYzNiAxODYgNjQzVDIwOSA2NTFIMjE4UTIzMyA2NTEgMjM5IDY0MlQyNDIgNjE2TDEyNCA2Mkg0MzJRNDYzIDYyIDQ2MyA0NVE0NjMgMzcgNDU5IDI1VDQ1MCA3UTQ0NCAwIDQyNCAwSDQzTDE3NSA2MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJNIiBnbHlwaC1uYW1lPSJNIiBob3Jpei1hZHYteD0iNzc1IiBkPSJNMTcyIDYwNVExNzcgNjI2IDE5MCA2MzhUMjI3IDY1MUgyNDNRMjY5IDY1MSAyNzcgNjM5VDI5MiA2MDBMMzgxIDIyM0w2MzMgNjAwUTY1MyA2MzAgNjY2IDY0MFQ3MDIgNjUxSDcyMFE3NDMgNjUxIDc1MiA2MzdUNzU4IDYwM0w2MjkgMEg1NjVMNjg3IDU3M0w0MzYgMjAxUTQyMSAxNzkgNDA3IDE3MFQzNzMgMTYxUTM0NSAxNjEgMzM1IDE3M1QzMTkgMjA4TDIzMCA1NzNMMTA3IDBINDNMMTcyIDYwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ik4iIGdseXBoLW5hbWU9Ik4iIGhvcml6LWFkdi14PSI3MDkiIGQ9Ik0xNzIgNjA1UTE3NyA2MjYgMTg5IDYzOFQyMjAgNjUxSDIzN1EyNTQgNjUxIDI2MiA2NDJUMjgwIDYxNUw1MjIgMTAxTDYzOSA2NDdINzAyTDU3MiAzN1E1NjggMTkgNTU3IDhUNTI4IC00SDUyMVE1MDYgLTQgNDk3IDVUNDc5IDMyTDIyNyA1NjZMMTA2IDBINDNMMTcyIDYwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ik8iIGdseXBoLW5hbWU9Ik8iIGhvcml6LWFkdi14PSI3NjYiIGQ9Ik0zNjYgLTExUTI5OSAtMTEgMjQ2IDEwVDE1NiA2OVQ5OCAxNThUNzggMjY5UTc4IDM1NSAxMDggNDI2VDE4OSA1NTBUMzA0IDYzMFQ0MzYgNjU5UTUwMyA2NTkgNTU2IDYzOFQ2NDYgNTc5VDcwNCA0OTBUNzI0IDM3OVE3MjQgMjkzIDY5NCAyMjJUNjEzIDk4VDQ5OCAxOFQzNjYgLTExWk0zNzMgNDhRNDI0IDQ4IDQ3NCA3MlQ1NjMgMTM5VDYyNyAyNDJUNjUyIDM3NFE2NTIgNDIwIDYzOCA0NjFUNTk1IDUzM1Q1MjUgNTgyVDQyOSA2MDBRMzc4IDYwMCAzMjggNTc2VDIzOSA1MDlUMTc1IDQwNlQxNTAgMjc0UTE1MCAyMjcgMTY0IDE4NlQyMDcgMTE1VDI3NyA2NlQzNzMgNDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJQIiBnbHlwaC1uYW1lPSJQIiBob3Jpei1hZHYteD0iNTg3IiBkPSJNMTcyIDYwNlExNzggNjQ3IDIxOSA2NDdIMzY3UTQ3MSA2NDcgNTI2IDYwNFQ1ODIgNDgwUTU4MiAzNzAgNTE2IDMxMVQzMjQgMjUySDE2NUwxMTAgMEg0M0wxNzIgNjA2Wk0zMzcgMzEyUTQxOSAzMTIgNDY1IDM1M1Q1MTIgNDcxUTUxMiA1ODYgMzYzIDU4NkgyMzZMMTc4IDMxMkgzMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJRIiBnbHlwaC1uYW1lPSJRIiBob3Jpei1hZHYteD0iNzc4IiBkPSJNMzYyIC0xMVEyOTQgLTExIDI0MiAxMFQxNTMgNjhUOTcgMTU3VDc4IDI2OVE3OCAzNTUgMTA4IDQyNlQxOTAgNTUwVDMwNiA2MzBUNDQwIDY1OVE1MDcgNjU5IDU2MCA2MzhUNjQ5IDU4MFQ3MDUgNDkxVDcyNCAzNzlRNzI0IDI4OSA2OTEgMjE2VDYwNCA5MUw2MTAgODRRNjI5IDYwIDY0NCA0OFQ2NzYgMzNRNjc3IDMzIDY3NyAyNlQ2NzUgMTFUNjY1IC01VDY0MyAtMTJRNjIwIC0xMiA2MDQgMFQ1NjMgNDVMNTU4IDUyUTUxMyAyMSA0NjQgNVQzNjIgLTExWk0zNjkgNDhRNDA4IDQ4IDQ0NiA2MVQ1MTkgOTlMNDA2IDI0Nkw0NTQgMjg1TDU2NCAxNDBRNjA0IDE4MyA2MjggMjQyVDY1MiAzNzRRNjUyIDQyMCA2MzggNDYxVDU5NSA1MzNUNTI2IDU4MlQ0MzMgNjAwUTM4MCA2MDAgMzI5IDU3NlQyMzkgNTA5VDE3NSA0MDZUMTUwIDI3NFExNTAgMjI3IDE2NCAxODZUMjA3IDExNVQyNzUgNjZUMzY5IDQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgZ2x5cGgtbmFtZT0iUiIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTMzNyAyNzJMNDI2IDExOFE0NDggNzkgNDY3IDYxVDUyMSA0M1E1MjIgNDMgNTIyIDM2VDUxOCAxOVQ1MDQgM1Q0NzMgLTVRNDYwIC01IDQ0OCAtMVQ0MjMgMTNUMzk2IDQzVDM2NSA5MkwyNjQgMjcySDE2OUwxMTAgMEg0M0wxNzIgNjA2UTE3OCA2NDcgMjE5IDY0N0gzNzdRNDgyIDY0NyA1MzcgNjA3VDU5MiA0ODhRNTkyIDM4NSA1MjcgMzI5VDM0OCAyNzJIMzM3Wk0zNTAgMzMwUTQzMSAzMzAgNDc2IDM2OVQ1MjEgNDgxUTUyMSA1MzMgNDgzIDU2MFQzNzMgNTg3SDIzNkwxODEgMzMwSDM1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlMiIGdseXBoLW5hbWU9IlMiIGhvcml6LWFkdi14PSI1NjciIGQ9Ik0yNjkgLTEyUTIwMSAtMTIgMTQ5IDlUNjUgNjFRNDggNzggMzggOTZUMjggMTMzUTI4IDE0NiAzNCAxNTRUNDggMTY2VDYzIDE3MFQ3MCAxNzBROTMgMTEzIDE0MyA4MFQyNzMgNDdRMzUxIDQ3IDM4OCA3OVQ0MjYgMTY4UTQyNiAxOTMgNDE1IDIxMlQzODUgMjQ1VDM0MCAyNzJUMjg0IDI5NlEyNTMgMzA5IDIyMyAzMjNUMTY5IDM1OVQxMzEgNDA5VDExNiA0ODBRMTE2IDUxNyAxMzEgNTUwVDE3NCA2MDdUMjQzIDY0NVQzMzMgNjU5UTQwMSA2NTkgNDQ4IDY0MFQ1MjEgNTk1UTU1MyA1NjMgNTUzIDUyOVE1NTMgNTE2IDU0NyA1MDlUNTM0IDQ5N1Q1MjAgNDkyVDUxMiA0OTNRNDkyIDU0MSA0NDggNTcwVDMzMCA2MDBRMjk4IDYwMCAyNzEgNTkyVDIyNSA1NjhUMTk2IDUzMlQxODUgNDg3UTE4NSA0NTkgMTk1IDQzOVQyMjUgNDA0VDI3MiAzNzZUMzMxIDM1MFEzNjEgMzM3IDM5MCAzMjNUNDQzIDI4OVQ0ODAgMjQyVDQ5NSAxNzRRNDk1IDEzMiA0ODAgOThUNDM3IDQwVDM2NiAyVDI2OSAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJUIiBnbHlwaC1uYW1lPSJUIiBob3Jpei1hZHYteD0iNjE4IiBkPSJNMzUwIDU4NUgxNTFRMTIwIDU4NSAxMjAgNjAyUTEyMCA2MTAgMTI0IDYyMlQxMzMgNjQwUTEzOSA2NDcgMTU5IDY0N0g2MjhRNjU5IDY0NyA2NTkgNjMwUTY1OSA2MjIgNjU1IDYxMFQ2NDYgNTkyUTY0MCA1ODUgNjIwIDU4NUg0MThMMjkzIDBIMjI2TDM1MCA1ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJVIiBnbHlwaC1uYW1lPSJVIiBob3Jpei1hZHYteD0iNjczIiBkPSJNMzIxIC0xMlEyNTYgLTEyIDIwNyA3VDEyNyA2M1Q4OCAxNTVUOTUgMjg1TDE2NiA2MjBRMTcwIDYzNiAxNzcgNjQzVDIwMCA2NTFIMjA5UTIyNCA2NTEgMjMwIDY0MlQyMzMgNjE2TDE2MiAyODBRMTM4IDE2NCAxODAgMTA3VDMyNSA0OVE0ODMgNDkgNTI1IDI0N0w2MDQgNjIwUTYwOCA2MzYgNjE1IDY0M1Q2MzggNjUxSDY0NlE2NjEgNjUxIDY2NyA2NDJUNjcwIDYxNkw1ODkgMjMzUTU2MyAxMTIgNDk3IDUwVDMyMSAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJWIiBnbHlwaC1uYW1lPSJWIiBob3Jpei1hZHYteD0iNjM0IiBkPSJNMTE4IDYzMVExMTcgNjM0IDEyNyA2NDFUMTUwIDY1MFQxNzUgNjQ1VDE5MiA2MTRMMjg4IDcyTDYxNiA2NTFRNjE2IDY1MSA2MjggNjUxVDY1MCA2NDRUNjYyIDYxOFQ2NDQgNTY2TDMxNCAwSDIzOUwxMTggNjMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVyIgZ2x5cGgtbmFtZT0iVyIgaG9yaXotYWR2LXg9IjkzOCIgZD0iTTE1NyA2MzdRMTU3IDY0MSAxNjggNjQ2VDE5MiA2NTJUMjE2IDY0MlQyMjcgNjA5TDIzNSA2MUw0NzggNTI5UTQ4NyA1NDcgNDk4IDU1NFQ1MzIgNTYyUTU2MSA1NjIgNTcxIDU1MFQ1ODMgNTE4TDYyNCA2M0w4ODUgNjQ5UTg4NSA2NDkgODk3IDY1MFQ5MTkgNjQ1VDkzMyA2MjJUOTIwIDU2N0w2NjAgMEg1NzBMNTI2IDQ5NUwyNjQgMEgxNzdMMTU3IDYzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlgiIGdseXBoLW5hbWU9IlgiIGhvcml6LWFkdi14PSI2MDYiIGQ9Ik00OTEgLTEyUTQ1NyAtMTIgNDM1IDE1VDM4OSA5NkwzMDggMjc3TDM1IC0xMlEzNSAtMTIgMjQgLTlUNCAzVC00IDI3VDIyIDY4TDI3OCAzMjhMMTQxIDY0N0gyMTNMMzI5IDM2Nkw2MDYgNjU5UTYwNiA2NTkgNjE3IDY1NlQ2MzcgNjQ0VDY0NSA2MjBUNjE5IDU3OUwzNTkgMzE1TDQ0NyAxMjZRNDU5IDEwMCA0NjggODRUNDg4IDU5VDUwOSA0N1Q1MzcgNDRRNTM4IDQ0IDUzOCAzNVQ1MzUgMTZUNTIxIC0zVDQ5MSAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJZIiBnbHlwaC1uYW1lPSJZIiBob3Jpei1hZHYteD0iNTgzIiBkPSJNMjY1IDI3MkwxMTAgNjQ3SDE4MUwzMDggMzMxTDU4MSA2NTNRNTgxIDY1MyA1OTMgNjUxVDYxNCA2MzlUNjIyIDYxMlQ1OTMgNTY0TDMzMSAyNjVMMjc1IDBIMjA3TDI2NSAyNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJaIiBnbHlwaC1uYW1lPSJaIiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMTMgNDhMMTUgNjFMNTIxIDU4NUgxNzBRMTQ5IDU4NSAxNDEgNTkyVDEzMiA2MTBRMTMyIDYyMSAxMzggNjM0VDE0NyA2NDdINjIyTDYxMiA1OTlMNjA5IDU4NkwxMDMgNjJINDc1UTQ5NiA2MiA1MDQgNTVUNTEzIDM3UTUxMyAyNiA1MDcgMTNUNDk4IDBIMkwxMyA0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlsiIGdseXBoLW5hbWU9ImJyYWNrZXRsZWZ0IiBob3Jpei1hZHYteD0iMzU3IiBkPSJNMTg0IDY0N0gzNzNRNDAyIDY0NyA0MDIgNjMxUTQwMiA2MjMgMzk5IDYxMlQzOTAgNTk1UTM4MyA1ODggMzY2IDU4OEgyMzNMNzkgLTEzOEgyMDdRMjM2IC0xMzggMjM2IC0xNTRRMjM2IC0xNjIgMjMzIC0xNzNUMjI0IC0xOTBRMjE3IC0xOTcgMjAwIC0xOTdINEwxODQgNjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgZ2x5cGgtbmFtZT0iYmFja3NsYXNoIiBob3Jpei1hZHYteD0iMzU3IiBkPSJNMTA3IDY0N0gxNzNMMjUyIC0xOTNIMTg2TDEwNyA2NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJdIiBnbHlwaC1uYW1lPSJicmFja2V0cmlnaHQiIGhvcml6LWFkdi14PSIzNTciIGQ9Ik0xNjcgLTE5N0gtMjJRLTUxIC0xOTcgLTUxIC0xODFRLTUxIC0xNzMgLTQ4IC0xNjJULTM5IC0xNDVRLTMyIC0xMzggLTE1IC0xMzhIMTE4TDI3MiA1ODhIMTQ0UTExNSA1ODggMTE1IDYwNFExMTUgNjEyIDExOCA2MjNUMTI3IDY0MFExMzQgNjQ3IDE1MSA2NDdIMzQ3TDE2NyAtMTk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXiIgZ2x5cGgtbmFtZT0iYXNjaWljaXJjdW0iIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yMDYgNDQ2UTE5NiA0NDYgMTkyIDQ1MVQxODcgNDYzUTE4NyA0ODAgMjA0IDUwMFQyNTQgNTQ5UTI3MCA1NjMgMjg2IDU3NVQzMTYgNTk2VDMzNyA2MTBUMzQ3IDYxNlEzNDggNjE2IDM1NCA2MTFUMzY5IDU5NlQzODggNTc2VDQwOSA1NTJRNDMxIDUyMyA0MzkgNTA1VDQ0OCA0NzVRNDQ4IDQ2MSA0NDEgNDU0VDQyNCA0NDZRNDExIDQ0NiAzOTkgNDYwVDM2OCA1MDdMMzM5IDU1OEwyODggNTA1UTI2MiA0NzggMjQxIDQ2MlQyMDYgNDQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXyIgZ2x5cGgtbmFtZT0idW5kZXJzY29yZSIgaG9yaXotYWR2LXg9IjQ5OSIgZD0iTTUgLTYyUS0yNiAtNjIgLTI2IC00NVEtMjYgLTM3IC0yMyAtMjVULTE0IC04US02IDAgMTIgMEgzODFRNDEyIDAgNDEyIC0xN1E0MTIgLTI1IDQwOSAtMzdUNDAwIC01NFEzOTIgLTYyIDM3NCAtNjJINVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImAiIGdseXBoLW5hbWU9ImdyYXZlIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNNDA1IDU1MVE0MDMgNTQ5IDM4NyA1NTNUMzQ5IDU2OFQzMDAgNTkzVDI1MiA2MjZRMjM1IDY0MCAyMjkgNjUxVDIyMiA2NzVRMjIyIDY4OCAyMzIgNjk2VDI1NCA3MDRRMjY1IDcwNCAyNzYgNjk4VDI5OSA2ODNRMzIxIDY2NSAzNDEgNjQzVDM3NiA2MDFUMzk5IDU2N1Q0MDUgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYSIgZ2x5cGgtbmFtZT0iYSIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTQ4OSAtOFE0NTAgLTggNDMzIDE2VDQyMyA4NlEzOTAgMzcgMzQyIDEzVDI0MCAtMTJRMjAxIC0xMiAxNjcgMVQxMDYgMzlUNjUgMTAyVDQ5IDE5MFE0OSAyNDUgNjkgMjk4VDEyNSAzOTRUMjEwIDQ2MlQzMTkgNDg4UTM3OSA0ODggNDIzIDQ2MVQ0ODkgMzkzTDUwNyA0NzZINTcxTDQ5MSAxMDFRNDgzIDY2IDQ5MiA1MlQ1MzQgMzdRNTM0IDM3IDUzNCAzMFQ1MzEgMTVUNTE4IC0xVDQ4OSAtOFpNMjQ4IDQ1UTI4NSA0NSAzMTkgNjBUMzgxIDEwMFQ0MjcgMTU4VDQ1NCAyMjhMNDcxIDMwN1E0NTMgMzY0IDQxNiAzOTdUMzE1IDQzMVEyNjggNDMxIDIzMSA0MTBUMTY4IDM1NFQxMjkgMjc3VDExNSAxOTFRMTE1IDE1NiAxMjUgMTI5VDE1NCA4M1QxOTcgNTVUMjQ4IDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYiIgZ2x5cGgtbmFtZT0iYiIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTI5MiAtMTJRMjI5IC0xMiAxODUgMThUMTE3IDkwTDExMSA2MlExMDMgMjUgOTEgMTFUNTkgLTRRNDkgLTQgNDIgLTFUMzQgNEwxNzcgNjc3SDI0MkwxODIgMzk5UTIxNSA0NDEgMjU3IDQ2NFQzNTYgNDg4UTM5NCA0ODggNDI5IDQ3NVQ0OTIgNDM1VDUzNSAzNjlUNTUyIDI3N1E1NTIgMjIyIDUzMyAxNzBUNDgwIDc4VDM5OCAxM1QyOTIgLTEyWk0yOTYgNDVRMzQyIDQ1IDM3NyA2NVQ0MzcgMTE4VDQ3MyAxOTJUNDg2IDI3N1E0ODYgMzE0IDQ3NSAzNDJUNDQ0IDM5MFQ0MDAgNDIwVDM0OCA0MzFRMjkwIDQzMSAyNDEgMzk4VDE2NCAzMTFMMTQ1IDIyMVExMzkgMTg4IDE0NiAxNTZUMTczIDEwMFQyMjQgNjBUMjk2IDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgZ2x5cGgtbmFtZT0iYyIgaG9yaXotYWR2LXg9IjU1MiIgZD0iTTI3NCAtMTJRMjI3IC0xMiAxODYgM1QxMTQgNDZUNjYgMTE2VDQ4IDIwOVE0OCAyNjMgNjkgMzEzVDEyNiA0MDJUMjExIDQ2NFQzMTggNDg3UTM3OCA0ODcgNDE4IDQ3MFQ0ODMgNDI3UTUwNCA0MDYgNTEzIDM4NFQ1MjMgMzQ1UTUyMyAzMjkgNTE2IDMyMVQ0OTkgMzA5VDQ4MyAzMDVUNDc1IDMwOFE0NjUgMzYxIDQyNiAzOTVUMzIwIDQyOVEyNzQgNDI5IDIzNyA0MTFUMTcyIDM2MlQxMzAgMjkyVDExNSAyMTNRMTE1IDE3NiAxMjYgMTQ2VDE2MCA5M1QyMTIgNTlUMjgwIDQ3UTMzNiA0NyAzNzMgNzJUNDM1IDEzN1E0MzYgMTM4IDQ0MSAxMzdUNDU0IDEzM1Q0NjYgMTIzVDQ3MiAxMDZRNDcyIDgzIDQ0MSA1MlE0MTYgMjcgMzczIDhUMjc0IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGdseXBoLW5hbWU9ImQiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik00ODkgLThRNDUxIC04IDQzNCAxNFQ0MjIgNzhRMzg5IDM0IDM0NyAxMVQyNDggLTEyUTIxMCAtMTIgMTc1IDFUMTEyIDQxVDY5IDEwN1Q1MiAxOTlRNTIgMjU0IDcxIDMwNlQxMjQgMzk4VDIwNiA0NjNUMzEyIDQ4OFEzNzMgNDg4IDQxNyA0NjJUNDg4IDM5MUw1NDkgNjc3SDYxNEw0OTEgMTAxUTQ4MyA2NiA0OTIgNTJUNTM0IDM3UTUzNCAzNyA1MzQgMzBUNTMxIDE1VDUxOCAtMVQ0ODkgLThaTTI1NiA0NVEyOTIgNDUgMzI0IDU4VDM4MSA5NFQ0MjUgMTQ5VDQ1MSAyMThMNDcwIDMwNVE0NTAgMzY0IDQxMCAzOTdUMzA4IDQzMVEyNjIgNDMxIDIyNyA0MTFUMTY3IDM1OFQxMzEgMjg0VDExOCAxOTlRMTE4IDE2MiAxMjkgMTM0VDE2MCA4NlQyMDQgNTZUMjU2IDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZSIgZ2x5cGgtbmFtZT0iZSIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1MiAtMTJRMjAxIC0xMiAxNjMgMlQ5OCA0M1Q1OSAxMDRUNDUgMTgyUTQ1IDI0NiA2OCAzMDJUMTMxIDM5OVQyMjYgNDY0VDM0NSA0ODhRNDI2IDQ4OCA0NzAgNDU0VDUxNSAzNjJRNTE1IDMyNiA1MDIgMjk4VDQ1NyAyNTFUMzcyIDIyMVQyMzggMjEwUTE4NSAyMTAgMTEyIDIxNlExMTEgMjA4IDExMSAyMDFUMTExIDE4NlExMTEgMTIzIDE0NyA4NFQyNTQgNDRRMzEwIDQ0IDM0OCA2NFQ0MTUgMTIzUTQxNiAxMjQgNDIxIDEyM1Q0MzMgMTE4VDQ0NCAxMDhUNDQ5IDkyUTQ0OSA4MSA0NDUgNzJUNDI3IDUwUTM5NSAxOCAzNTMgM1QyNTIgLTEyWk0zNDIgNDMxUTMwNCA0MzEgMjcxIDQxOVQyMDkgMzg2VDE2MCAzMzVUMTI2IDI3MVExNTYgMjY3IDE4MiAyNjZUMjMyIDI2NVEyOTYgMjY1IDMzOCAyNzNUNDA1IDI5NFQ0MzkgMzI1VDQ0OSAzNjFRNDQ5IDM4NyA0MjMgNDA5VDM0MiA0MzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJmIiBnbHlwaC1uYW1lPSJmIiBob3Jpei1hZHYteD0iMzY0IiBkPSJNMTY2IDQxOEg3MFE3MCA0MTkgNzEgNDIyUTcxIDQyNCA3MSA0MjZUNzMgNDM0TDgxIDQ2OVE4MSA0NzEgODEgNDcyVDgyIDQ3NFY0NzZIMTc4TDE5MSA1MzRRMjA4IDYxMiAyNDcgNjUwVDM0NiA2ODlRMzc3IDY4OSAzOTcgNjgyVDQzMCA2NjFRNDQ0IDY0NyA0NDQgNjI5UTQ0NCA2MjAgNDQxIDYxNFQ0MzMgNjAzVDQyNCA1OTZUNDE5IDU5NVE0MDkgNjA5IDM4OSA2MjBUMzQzIDYzMVEzMDkgNjMxIDI4NyA2MDdUMjUyIDUyNUwyNDEgNDc2SDM2NVEzNjQgNDc1IDM2NCA0NzJRMzYzIDQ3MCAzNjMgNDY3VDM2MiA0NjBMMzU0IDQyNVEzNTMgNDIyIDM1MyA0MjBWNDE4SDIzMEwxNDIgMEg3N0wxNjYgNDE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZyIgZ2x5cGgtbmFtZT0iZyIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTIyOSAtMjAwUTE2NSAtMjAwIDEyMSAtMTgyVDUxIC0xMzhRMzMgLTEyMCAyNSAtMTA0VDE3IC03NFExNyAtNTggMjQgLTQ4VDQwIC0zM1Q1NiAtMjdUNjQgLTI3UTc4IC03OSAxMTggLTExMFQyMzUgLTE0MVEzMDEgLTE0MSAzNDUgLTEwM1Q0MDcgMTRMNDIzIDg4UTM5MSA0NiAzNDggMjRUMjQ5IDFRMjExIDEgMTc2IDE0VDExMiA1NFQ2OCAxMjBUNTEgMjEyUTUxIDI2MyA3MSAzMTJUMTI4IDQwMVQyMTMgNDY0VDMxOSA0ODhRMzc5IDQ4OCA0MjMgNDYxVDQ4OSAzOTNMNTA3IDQ3Nkg1NzFMNDcxIDhRNDUwIC05MSAzOTAgLTE0NVQyMjkgLTIwMFpNMjU3IDU4UTI5MSA1OCAzMjIgNzBUMzgwIDEwM1Q0MjQgMTUzVDQ1MSAyMTlMNDcxIDMwOFE0NTQgMzY1IDQxMyAzOThUMzE1IDQzMVEyNzEgNDMxIDIzNSA0MTJUMTcyIDM2MVQxMzIgMjkxVDExNyAyMTJRMTE3IDE3NSAxMjggMTQ3VDE1OSA5OVQyMDQgNjlUMjU3IDU4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaCIgZ2x5cGgtbmFtZT0iaCIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTQ1MyAtOFE0MjMgLTggNDA2IDExVDM4OSA2M1EzODkgODQgMzk2IDExOFQ0MTUgMTkwUTQyNiAyMjggNDMzIDI2MVQ0NDAgMzE1UTQ0MCAzNjcgNDEyIDM5N1QzMzEgNDI3UTI3NiA0MjcgMjM3IDM5OVQxNjQgMzEyTDk4IDBIMzNMMTcxIDY1MFExNzUgNjY3IDE4MiA2NzRUMjAxIDY4MUgyMDlRMjIyIDY4MSAyMzEgNjc1VDIzNiA2NTBMMTgyIDM5N1EyMDggNDQwIDI1MCA0NjRUMzQwIDQ4OFEzNzkgNDg4IDQxMCA0NzZUNDYyIDQ0MlQ0OTUgMzkxVDUwNyAzMjdRNTA3IDMwMSA0OTggMjYyVDQ3OCAxODFRNDY3IDE0NCA0NjEgMTE2VDQ1NCA3M1E0NTQgNTMgNDY0IDQ2VDQ5NiAzNlE0OTcgMzYgNDk3IDI5VDQ5MyAxNFQ0ODAgLTFUNDUzIC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaSIgZ2x5cGgtbmFtZT0iaSIgaG9yaXotYWR2LXg9IjI0MyIgZD0iTTEyNiAtOFE4MSAtOCA2NSAxOVQ2MCAxMDBMMTQwIDQ3NkgyMDVMMTI1IDEwMVExMTcgNjYgMTI2IDUyVDE3MyAzN1ExNzMgMzcgMTczIDMwVDE2OSAxNVQxNTUgLTFUMTI2IC04Wk0yMDcgNTk2UTE2MyA1OTYgMTYzIDYyOVExNjMgNjQ5IDE3NCA2NjRUMjA5IDY4MFEyNTMgNjgwIDI1MyA2NDdRMjUzIDYyNyAyNDIgNjEyVDIwNyA1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJqIiBnbHlwaC1uYW1lPSJqIiBob3Jpei1hZHYteD0iMjQzIiBkPSJNLTUxIC0yMDNRLTgyIC0yMDMgLTEwMiAtMTk1VC0xMzQgLTE3NlEtMTQ4IC0xNjIgLTE0OCAtMTQ4US0xNDggLTEzOSAtMTQ0IC0xMzFULTEzNSAtMTE4VC0xMjYgLTEwOVQtMTIxIC0xMDdRLTExMCAtMTIzIC05MSAtMTM0VC00OSAtMTQ1US0yMCAtMTQ1IC0yIC0xMjhUMjYgLTYyTDE0MCA0NzZIMjA1TDg4IC03NFE3NCAtMTQyIDM3IC0xNzJULTUxIC0yMDNaTTIwNyA1OTZRMTYzIDU5NiAxNjMgNjI5UTE2MyA2NDkgMTc0IDY2NFQyMDkgNjgwUTI1MyA2ODAgMjUzIDY0N1EyNTMgNjI3IDI0MiA2MTJUMjA3IDU5NloiICAvPgorPGdseXBoIHVuaWNvZGU9ImsiIGdseXBoLW5hbWU9ImsiIGhvcml6LWFkdi14PSI0NzUiIGQ9Ik0zNjQgLThRMzQ5IC04IDMzOCAtNFQzMTMgMTFUMjg1IDQ0VDI0NiAxMDBMMTUwIDI0NUw5OCAwSDMzTDE3NyA2NzdIMjQyTDE1MyAyNjBMNDM2IDQ4OFE0MzcgNDg5IDQ0NyA0ODVUNDYyIDQ3MFQ0NjQgNDQ0VDQzMSA0MDZMMjI0IDI0MkwzMDkgMTE3UTMyNSA5MiAzMzcgNzhUMzYwIDU3VDM4MyA0OFQ0MTIgNDVRNDEzIDQ1IDQxMyAzN1Q0MDkgMTlUMzk1IDFUMzY0IC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgZ2x5cGgtbmFtZT0ibCIgaG9yaXotYWR2LXg9IjI0MyIgZD0iTTEyNiAtOFE4MSAtOCA2NSAxOVQ2MCAxMDBMMTgzIDY3N0gyNDhMMTI1IDEwMVExMTcgNjYgMTI2IDUyVDE3MyAzN1ExNzMgMzcgMTczIDMwVDE2OSAxNVQxNTUgLTFUMTI2IC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgZ2x5cGgtbmFtZT0ibSIgaG9yaXotYWR2LXg9Ijg4OSIgZD0iTTc3MSAtOFE3NDEgLTggNzI0IDExVDcwNyA2M1E3MDcgODQgNzE0IDExOFQ3MzMgMTkwUTc0NCAyMjggNzUxIDI2MVQ3NTggMzE1UTc1OCAzNjcgNzMwIDM5N1Q2NTYgNDI3UTYzMCA0MjcgNjA4IDQyMVQ1NjcgNDAyVDUzMSAzNjlUNDk2IDMyMkw0MjggMEgzNjNMNDIxIDI3NFE0MjggMzA4IDQyNSAzMzZUNDA4IDM4NFQzNzQgNDE1VDMyNiA0MjdRMjc0IDQyNyAyMzggNDAzVDE2NiAzMjJMOTggMEgzM0wxMzUgNDc3UTEzNSA0ODAgMTQ5IDQ4MFExNTggNDgwIDE2NiA0NzdUMTgwIDQ2N1QxODcgNDQ2VDE4NSA0MTFMMTg0IDQwOFEyMTMgNDQ4IDI1MyA0NjhUMzM1IDQ4OFEzOTIgNDg4IDQzMCA0NjBUNDgzIDM4NFE1MTIgNDI5IDU1NyA0NThUNjY1IDQ4OFE3MDEgNDg4IDczMCA0NzZUNzgxIDQ0MlQ4MTMgMzkxVDgyNSAzMjdRODI1IDMwMSA4MTYgMjYyVDc5NiAxODFRNzg1IDE0NCA3NzkgMTE2VDc3MiA3M1E3NzIgNTMgNzgyIDQ2VDgxNCAzNlE4MTUgMzYgODE1IDI5VDgxMSAxNFQ3OTggLTFUNzcxIC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgZ2x5cGgtbmFtZT0ibiIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTQ1MyAtOFE0MjMgLTggNDA2IDExVDM4OSA2M1EzODkgODQgMzk2IDExOFQ0MTUgMTkwUTQyNiAyMjggNDMzIDI2MVQ0NDAgMzE1UTQ0MCAzNjcgNDEyIDM5N1QzMzEgNDI3UTI3NiA0MjcgMjM3IDM5OVQxNjQgMzEyTDk4IDBIMzNMMTM1IDQ3N1ExMzUgNDgwIDE0OSA0ODBRMTU4IDQ4MCAxNjYgNDc3VDE4MCA0NjdUMTg3IDQ0NlQxODUgNDExTDE4MiAzOThRMjA5IDQ0MSAyNTAgNDY0VDM0MCA0ODhRMzc5IDQ4OCA0MTAgNDc2VDQ2MiA0NDJUNDk1IDM5MVQ1MDcgMzI3UTUwNyAzMDEgNDk4IDI2MlQ0NzggMTgxUTQ2NyAxNDQgNDYxIDExNlQ0NTQgNzNRNDU0IDUzIDQ2NCA0NlQ0OTYgMzZRNDk3IDM2IDQ5NyAyOVQ0OTMgMTRUNDgwIC0xVDQ1MyAtOFoiICAvPgorPGdseXBoIHVuaWNvZGU9Im8iIGdseXBoLW5hbWU9Im8iIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0yNjggLTEyUTIyMyAtMTIgMTgzIDRUMTEzIDQ5VDY2IDExOVQ0OSAyMDlRNDkgMjY0IDY5IDMxNVQxMjUgNDA0VDIxMCA0NjVUMzE3IDQ4OFEzNjIgNDg4IDQwMiA0NzJUNDcyIDQyN1Q1MTkgMzU3VDUzNiAyNjdRNTM2IDIxMSA1MTYgMTYxVDQ2MCA3MlQzNzUgMTFUMjY4IC0xMlpNMjcyIDQ1UTMxNCA0NSAzNTAgNjNUNDEyIDExMVQ0NTQgMTgxVDQ3MCAyNjVRNDcwIDMwMSA0NTggMzMxVDQyNSAzODRUMzc1IDQxOFQzMTMgNDMxUTI3MSA0MzEgMjM1IDQxM1QxNzMgMzY1VDEzMSAyOTVUMTE1IDIxMVExMTUgMTc1IDEyNyAxNDVUMTYwIDkyVDIxMCA1OFQyNzIgNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJwIiBnbHlwaC1uYW1lPSJwIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNMTM1IDQ3N1ExMzUgNDgwIDE0OSA0ODBRMTU4IDQ4MCAxNjYgNDc3VDE4MCA0NjdUMTg3IDQ0NlQxODUgNDExTDE4MyAzOTlRMjE2IDQ0MSAyNTcgNDY0VDM1NiA0ODhRMzk0IDQ4OCA0MjkgNDc1VDQ5MiA0MzVUNTM1IDM2OVQ1NTIgMjc3UTU1MiAyMjIgNTMzIDE3MFQ0ODAgNzhUMzk4IDEzVDI5MiAtMTJRMjU5IC0xMiAyMzIgLTNUMTgyIDIwVDE0MyA1MlQxMTcgOTBMNTcgLTE5M0gtOEwxMzUgNDc3Wk0yOTYgNDVRMzQyIDQ1IDM3NyA2NVQ0MzcgMTE4VDQ3MyAxOTJUNDg2IDI3N1E0ODYgMzE0IDQ3NSAzNDJUNDQ0IDM5MFQ0MDAgNDIwVDM0OCA0MzFRMjkwIDQzMSAyNDEgMzk4VDE2NCAzMTFMMTQ1IDIyMVExMzkgMTg4IDE0NiAxNTZUMTczIDEwMFQyMjQgNjBUMjk2IDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icSIgZ2x5cGgtbmFtZT0icSIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTQyMSA3N1EzODggMzUgMzQ3IDEyVDI0OCAtMTJRMjEwIC0xMiAxNzUgMVQxMTIgNDFUNjkgMTA3VDUyIDE5OVE1MiAyNTQgNzEgMzA2VDEyNCAzOThUMjA2IDQ2M1QzMTIgNDg4UTM3MyA0ODggNDE4IDQ2MlQ0ODkgMzk2TDQ5MyA0MTNRNTAxIDQ1MCA1MTMgNDY1VDU0NSA0ODBRNTU1IDQ4MCA1NjIgNDc3VDU3MCA0NzJMNDI4IC0xOTNIMzYzTDQyMSA3N1pNMjU2IDQ1UTI5MiA0NSAzMjQgNThUMzgxIDk0VDQyNSAxNDlUNDUxIDIxOEw0NzAgMzA1UTQ1MCAzNjQgNDE0IDM5N1QzMDggNDMxUTI2MiA0MzEgMjI3IDQxMVQxNjcgMzU4VDEzMSAyODRUMTE4IDE5OVExMTggMTYyIDEyOSAxMzRUMTYwIDg2VDIwNCA1NlQyNTYgNDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJyIiBnbHlwaC1uYW1lPSJyIiBob3Jpei1hZHYteD0iMzcyIiBkPSJNMTM1IDQ3N1ExMzUgNDgwIDE0OSA0ODBRMTU4IDQ4MCAxNjYgNDc3VDE4MCA0NjdUMTg3IDQ0NlQxODUgNDExTDE4MSAzOTJRMjA2IDQ0MCAyMzggNDY0VDMxNSA0ODhRMzQzIDQ4OCAzNjMgNDc2VDM4NCA0NDNRMzg0IDQzMSAzODAgNDIzVDM3MiA0MDlUMzYzIDQwMVQzNTggNDAwUTM0OCA0MTEgMzM0IDQxOFQyOTYgNDI2UTI2NyA0MjYgMjQzIDQwOVQyMDAgMzYwVDE2NSAyODdUMTM5IDE5NEw5OCAwSDMzTDEzNSA0NzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJzIiBnbHlwaC1uYW1lPSJzIiBob3Jpei1hZHYteD0iNDgxIiBkPSJNMjIyIC0xMlExNjMgLTEyIDExNyA2VDQ1IDUwUTM0IDYxIDI4IDcyVDIxIDk1UTIxIDEwNiAyNiAxMTNUMzggMTI2VDUwIDEzMlQ1NyAxMzNRODAgOTUgMTIyIDY5VDIyNiA0M1EyODIgNDMgMzEyIDY1VDM0MiAxMjRRMzQyIDE1NyAzMTIgMTc0VDIyOCAyMDlRMjAyIDIxOCAxNzcgMjI4VDEzMSAyNTRUOTcgMjkyVDg0IDM0N1E4NCAzNzggOTcgNDAzVDEzNCA0NDhUMTkwIDQ3N1QyNjIgNDg4UTMxNiA0ODggMzU2IDQ3MlQ0MjAgNDMyUTQ0NCA0MDggNDQ0IDM4NFE0NDQgMzczIDQzOSAzNjZUNDI2IDM1NFQ0MTMgMzQ5VDQwNiAzNTBRMzg3IDM4NyAzNDcgNDEwVDI1NyA0MzNRMjAyIDQzMyAxNzUgNDA5VDE0NyAzNTVRMTQ3IDMyMCAxNzkgMzAyVDI2NSAyNjRRMjkwIDI1NSAzMTUgMjQ1VDM2MCAyMTlUMzkyIDE4M1Q0MDUgMTMyUTQwNSA2NiAzNTcgMjdUMjIyIC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9InQiIGdseXBoLW5hbWU9InQiIGhvcml6LWFkdi14PSIzNzUiIGQ9Ik0yMDggLTEyUTE0MSAtMTIgMTA4IDMxVDkzIDE2MUwxNDcgNDE4SDc5UTc5IDQxOSA4MCA0MjJRODAgNDI0IDgwIDQyNlQ4MiA0MzRMOTAgNDY5UTkwIDQ3MSA5MCA0NzJUOTEgNDc0VjQ3NkgxNTlMMTY5IDUyM1ExNzcgNTYwIDE4OSA1NzVUMjIyIDU5MFEyMzIgNTkwIDIzOSA1ODdUMjQ3IDU4MkwyMjQgNDc2SDM3MlEzNzEgNDc1IDM3MSA0NzJRMzcwIDQ3MCAzNzAgNDY3VDM2OSA0NjBMMzYxIDQyNVEzNjAgNDIyIDM2MCA0MjBWNDE4SDIxMkwxNTcgMTYxUTE0MyA5NyAxNjAgNzFUMjE4IDQ0UTI0MCA0NCAyNTggNTNUMjg0IDczUTI4NiA3NSAyOTIgNjZUMjk5IDQzUTI5OSAyNiAyODUgMTJRMjc0IDEgMjU1IC01VDIwOCAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ1IiBnbHlwaC1uYW1lPSJ1IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNNDU1IC04UTQxNyAtOCA0MDAgMTRUMzg4IDc5UTM2MiAzNiAzMjAgMTJUMjMwIC0xMlExODIgLTEyIDE0OCA0VDkzIDQ5VDY4IDExOVQ3MiAyMDdMMTI5IDQ3NkgxOTRMMTM2IDIwMlExMjIgMTM0IDE0OCA5MlQyMzkgNDlRMjk0IDQ5IDMzMyA3N1Q0MDYgMTY0TDQ3MiA0NzZINTM3TDQ1NyAxMDFRNDQ5IDY2IDQ1OCA1MlQ1MDAgMzdRNTAwIDM3IDUwMCAzMFQ0OTcgMTVUNDg0IC0xVDQ1NSAtOFoiICAvPgorPGdseXBoIHVuaWNvZGU9InYiIGdseXBoLW5hbWU9InYiIGhvcml6LWFkdi14PSI0OTciIGQ9Ik0xMTcgMzMwUTExMyAzNTkgMTA3IDM3OFQ5MiA0MDhUNzAgNDIzVDQwIDQyOFE0MCA0MjggNDAgNDM2VDQyIDQ1NFQ1NSA0NzJUODUgNDgwUTExNyA0ODAgMTM4IDQ1OVExNTYgNDQxIDE2NSA0MDhUMTgxIDMyNEwyMTEgNjZMNDU1IDQ3OVE0NTYgNDgwIDQ2NyA0ODBUNDg3IDQ3MlQ0OTggNDQ5VDQ4MSA0MDFMMjM3IDBIMTYwTDExNyAzMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ3IiBnbHlwaC1uYW1lPSJ3IiBob3Jpei1hZHYteD0iNzI5IiBkPSJNMTI3IDMzMFExMjcgMzYwIDEyMyAzNzlUMTEwIDQxMFQ4OCA0MjVUNTggNDMxUTU3IDQzMSA1NyA0MzhUNjEgNDU1VDc3IDQ3MlQxMDkgNDgwUTEzOCA0ODAgMTU3IDQ2MVExOTIgNDI2IDE5MCAzMjRMMTg2IDY5TDMzNyAzNzFRMzQ5IDM5NSAzNjIgNDAxVDM5NiA0MDhRNDQyIDQwOCA0NDYgMzYwTDQ3MiA2OEw2NjQgNDc5UTY2NCA0NzkgNjc1IDQ3OVQ2OTYgNDcyVDcwOSA0NDlUNjk3IDQwMUw1MDIgMEg0MjFMMzg0IDMyOUwyMTQgMEgxMjZMMTI3IDMzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IngiIGdseXBoLW5hbWU9IngiIGhvcml6LWFkdi14PSI0ODciIGQ9Ik0zMCAtOVEyOSAtMTAgMTkgLTdUMSA2VC01IDMxVDI0IDczTDE5MCAyMzZMNjUgNDc2SDE0MUwyMzcgMjcyTDQ0NiA0ODVRNDQ3IDQ4NiA0NTggNDgzVDQ3NiA0NzFUNDgyIDQ0NlQ0NTIgNDAzTDI3MCAyMjRMMzE5IDEzMVEzMzMgMTA0IDM0NCA4OVQzNjYgNjVUMzkxIDUzVDQyNCA0OVE0MjUgNDkgNDI1IDQxVDQyMyAyM1Q0MDkgNVQzODAgLTRRMzYxIC00IDM0NiAxVDMxNyAyMVQyODcgNjBUMjUyIDEyNkwyMjMgMTg3TDMwIC05SDMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieSIgZ2x5cGgtbmFtZT0ieSIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTkgLTIwNFEtMTUgLTIwNCAtMzQgLTE5OVQtNjUgLTE4MVEtNzcgLTE2OSAtNzcgLTE1M1EtNzcgLTE0NSAtNzMgLTEzOVQtNjUgLTEyN1QtNTYgLTEyMFQtNTAgLTExOVEtNDAgLTEzMCAtMjMgLTEzN1Q1IC0xNDVRMjAgLTE0NSAzNSAtMTM5VDY4IC0xMTdUMTA5IC03MlQxNjIgMUwxNzggMjRRMTYxIDI2IDE1MyAzN1QxNDMgNjdMMTE1IDMzMFExMTAgMzgyIDkzIDQwNVQ0MCA0MjhRNDAgNDI4IDQwIDQzNlQ0MiA0NTRUNTcgNDcyVDkwIDQ4MFExMTYgNDgwIDEzNCA0NjJRMTcwIDQyNiAxNzkgMzI0TDIwMyA1OUw0NTcgNDc2SDUyOEwyMjUgLTEyUTE4OSAtNjkgMTYxIC0xMDZUMTA4IC0xNjVUNjAgLTE5NVQ5IC0yMDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ6IiBnbHlwaC1uYW1lPSJ6IiBob3Jpei1hZHYteD0iNTA3IiBkPSJNMTAgNDlMNDA2IDQyMEgxMzhRMTE5IDQyMCAxMTIgNDI2VDEwNCA0NDNRMTA0IDQ1MyAxMDkgNDY0VDExNyA0NzZINDkwVjQyN0w5NCA1NkgzNzFRMzkwIDU2IDM5NyA1MFQ0MDUgMzNRNDA1IDIzIDQwMCAxMlQzOTIgMEgxMFY0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9InsiIGdseXBoLW5hbWU9ImJyYWNlbGVmdCIgaG9yaXotYWR2LXg9IjQ0NCIgZD0iTTI4OSAtMjAwUTI0NSAtMjAwIDIwMiAtMTU3UTE1NSAtMTEwIDEzOCAtMzVUMTMyIDEyOUw3NCAxNzFRNTIgMTg3IDQ3IDE5NVQ0MSAyMThRNDEgMjI5IDQ0IDI0NVQ2MCAyNzRRNjUgMjc5IDcyIDI4M1QxMDAgMjk1TDE3MiAzMjNRMTkzIDQxNiAyMjQgNDczVDI5NiA1NzFRMzQxIDYxNiAzODEgNjMzVDQ1NyA2NTBRNDcwIDY1MCA0NzkgNjQzVDQ4OSA2MjFRNDg5IDYxMSA0ODQgNjAzVDQ3NiA1OTVRNDQxIDU5MyA0MDIgNTc0VDMzNSA1MjdRMjk0IDQ4NiAyNzIgNDI4VDIyOSAyODNMOTkgMjMyTDIwMyAxNTdRMTcxIC0zNyAyNDcgLTExMlEyNjAgLTEyNSAyNzYgLTEzNFQzMTYgLTE1MFEzMTggLTE1MSAzMjAgLTE1NlQzMjIgLTE2OFEzMjIgLTE4MiAzMTQgLTE5MVQyODkgLTIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InwiIGdseXBoLW5hbWU9ImJhciIgaG9yaXotYWR2LXg9IjI3NyIgZD0iTTQzIC0xOTdRMjkgLTE5NyAyMyAtMTg4VDIxIC0xNjJMMTg3IDYyMFExOTEgNjM2IDE5OCA2NDNUMjIzIDY1MUgyMjlRMjQzIDY1MSAyNDkgNjQyVDI1MSA2MTZMODUgLTE2NlE4MSAtMTgzIDc0IC0xOTBUNDkgLTE5N0g0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9In0iIGdseXBoLW5hbWU9ImJyYWNlcmlnaHQiIGhvcml6LWFkdi14PSI0NDQiIGQ9Ik0tMTkgLTIwMFEtMzIgLTIwMCAtNDEgLTE5M1QtNTEgLTE3MVEtNTEgLTE2MSAtNDYgLTE1M1QtMzggLTE0NVEtMyAtMTQzIDM2IC0xMjRUMTAzIC03N1ExNDQgLTM2IDE2NiAyMlQyMDkgMTY3TDMzOSAyMThMMjM1IDI5M1EyNjYgNDg2IDE5MSA1NjJRMTc4IDU3NSAxNjIgNTg0VDEyMiA2MDBRMTIwIDYwMSAxMTggNjA2VDExNiA2MThRMTE2IDYzMiAxMjQgNjQxVDE0OSA2NTBRMTkzIDY1MCAyMzYgNjA3UTI4MyA1NjAgMzAwIDQ4NVQzMDYgMzIxTDM2NCAyNzlRMzg2IDI2MyAzOTEgMjU1VDM5NyAyMzJRMzk3IDIyMSAzOTQgMjA1VDM3OCAxNzZRMzczIDE3MSAzNjYgMTY3VDMzOCAxNTVMMjY2IDEyN1EyNDUgMzQgMjE0IC0yM1QxNDIgLTEyMVE5NyAtMTY2IDU3IC0xODNULTE5IC0yMDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBnbHlwaC1uYW1lPSJhc2NpaXRpbGRlIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzMzIDE2MVEzMDkgMTYxIDI3MSAxODJUMTk0IDI0MVExODggMjI4IDE4MiAyMTVUMTY5IDE5MlQxNTUgMTc1VDE0MCAxNjhRMTI4IDE2OCAxMjMgMTc0VDExNyAxODhRMTE3IDIwNSAxMjQgMjIyVDE0MiAyNTNUMTY3IDI3NVQxOTcgMjg0UTIyMSAyODQgMjU5IDI2M1QzMzYgMjA0UTM0MiAyMTcgMzQ4IDIzMFQzNjEgMjUzVDM3NSAyNzBUMzkwIDI3N1E0MDIgMjc3IDQwNyAyNzFUNDEzIDI1N1E0MTMgMjQwIDQwNiAyMjNUMzg4IDE5MlQzNjMgMTcwVDMzMyAxNjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMDsiIGdseXBoLW5hbWU9InVuaTAwQTAiIGhvcml6LWFkdi14PSIxNzAiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTE7IiBnbHlwaC1uYW1lPSJleGNsYW1kb3duIiBob3Jpei1hZHYteD0iMjgxIiBkPSJNMTY3IDQ1MFExNzIgNDcwIDE4NCA0NzBRMTk5IDQ3MCAyMDMgNDY0VDIwNSA0NDJMMTM1IDBINDZMMTY3IDQ1MFpNMjE3IDU1NFExOTQgNTU0IDE4MiA1NjNUMTY5IDU4OFExNjkgNjI0IDE4NSA2NDBRMTk4IDY1MyAyMjIgNjUzUTI0NSA2NTMgMjU3IDY0NFQyNzAgNjE5UTI3MCA1ODMgMjU0IDU2N1EyNDEgNTU0IDIxNyA1NTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMjsiIGdseXBoLW5hbWU9ImNlbnQiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik0yNDEgLTk4UTIzMCAtOTggMjIxIC05MlQyMTYgLTY3TDIzOCAzOVEyMDMgNDggMTczIDY2VDEyMSAxMTFUODcgMTc0VDc1IDI1M1E3NSAzMDcgOTUgMzU3VDE1MiA0NDVUMjM3IDUwN1QzNDMgNTMxTDM2MyA2MjZRMzY3IDY0MyAzNzMgNjUwVDM5MSA2NTdIMzk3UTQwOCA2NTcgNDE3IDY1MVQ0MjIgNjI2TDQwMSA1MjZRNDM4IDUxOCA0NjQgNTA0VDUxMCA0NzFRNTMxIDQ1MCA1NDAgNDI4VDU1MCAzODlRNTUwIDM3MyA1NDMgMzY1VDUyNiAzNTNUNTEwIDM0OVQ1MDIgMzUyUTQ5NCAzOTYgNDY1IDQyN1QzODcgNDcwTDMwNiA5MEgzMDdRMzYzIDkwIDQwMCAxMTZUNDYyIDE4MVE0NjMgMTgyIDQ2OCAxODFUNDgxIDE3N1Q0OTMgMTY3VDQ5OSAxNTBRNDk5IDEyNyA0NjggOTZRNDQzIDcxIDQwMCA1MlQzMDEgMzJIMjk2TDI3NSAtNjdRMjcxIC04NCAyNjUgLTkxVDI0NyAtOThIMjQxWk0xNDIgMjU3UTE0MiAxOTcgMTcyIDE1NVQyNTQgOTdMMzMzIDQ3M1EyOTAgNDcwIDI1NSA0NTFUMTk1IDQwMVQxNTYgMzM0VDE0MiAyNTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMzsiIGdseXBoLW5hbWU9InN0ZXJsaW5nIiBob3Jpei1hZHYteD0iNTc4IiBkPSJNNDEgMFExMCAwIDEwIDE3UTEwIDI1IDE0IDM3VDIzIDU1UTI5IDYyIDQ5IDYySDEwMkwxNjAgMjYzSDgxUTUxIDI2MyA1MSAyODBRNTEgMjg4IDU0IDI5OVQ2MyAzMTVRNzEgMzIzIDg4IDMyM0gxNzdMMjA5IDQzNlEyMjYgNDk2IDI0NiA1MzhUMjkyIDYwOFQzNTAgNjQ3VDQyMiA2NTlRNDY3IDY1OSA0OTcgNjQ2VDU0OCA2MTNRNTY1IDU5NiA1NzIgNTc5VDU4MCA1NDdRNTgwIDUzMCA1NzMgNTIxVDU1OCA1MDhUNTQyIDUwM1Q1MzQgNTA0UTUxMiA2MDEgNDE4IDYwMVEzOTQgNjAxIDM3NCA1OTJUMzM2IDU2M1QzMDQgNTEwVDI3NCA0MjdMMjQ0IDMyM0g0MDlRNDM5IDMyMyA0MzkgMzA2UTQzOSAyOTggNDM2IDI4N1Q0MjcgMjcxUTQxOSAyNjMgNDAyIDI2M0gyMjdMMTY5IDYySDQ3OVE1MDAgNjIgNTA4IDU1VDUxNyAzN1E1MTcgMjYgNTExIDEzVDUwMiAwSDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBnbHlwaC1uYW1lPSJjdXJyZW5jeSIgaG9yaXotYWR2LXg9IjY2MCIgZD0iTTExNiAzNzZRODcgMzc2IDg3IDM5MlE4NyA0MDAgOTAgNDExVDk5IDQyN1ExMDYgNDM0IDEyMyA0MzRIMTk0UTIxMCA0NzUgMjMxIDUxMlQyODIgNTc5UTMyMiA2MTkgMzY5IDYzOVQ0NzUgNjU5UTUyNyA2NTkgNTYzIDY0M1Q2MjUgNjAyUTY0MiA1ODUgNjUxIDU2NFQ2NjAgNTIyUTY2MCA1MDcgNjUzIDQ5OFQ2MzggNDg1VDYyMiA0NzlUNjE0IDQ4MFE1OTkgNTQ0IDU2MCA1NzNUNDY3IDYwMlE0MjUgNjAyIDM5MSA1ODdUMzI4IDU0M1EzMDYgNTIxIDI5MCA0OTNUMjYwIDQzNEg0NzZRNTA1IDQzNCA1MDUgNDE4UTUwNSA0MTAgNTAyIDM5OVQ0OTMgMzgzUTQ4NiAzNzYgNDY5IDM3NkgyNDBRMjMzIDM0OSAyMjkgMzI0VDIyMiAyNzZINDQyUTQ3MSAyNzYgNDcxIDI2MFE0NzEgMjUyIDQ2OCAyNDFUNDU5IDIyNVE0NTIgMjE4IDQzNSAyMThIMjIwUTIyMyAxODIgMjM0IDE1MVQyNjYgOTZUMzE2IDU5VDM4MSA0NlE0MzEgNDYgNDcwIDY5VDU0NSAxNDRRNTQ2IDE0NSA1NTEgMTQ0VDU2MiAxMzhUNTcyIDEyN1Q1NzcgMTExUTU3NyA4NiA1NDUgNTRRNTMyIDQxIDUxNCAyOVQ0NzUgOFQ0MzAgLTZUMzgzIC0xMlEzMjcgLTEyIDI4NSA0VDIxNCA1MVQxNzAgMTIzVDE1MiAyMThIODJRNTMgMjE4IDUzIDIzNFE1MyAyNDIgNTYgMjUzVDY1IDI2OVE3MiAyNzYgODkgMjc2SDE1NFExNTcgMjk5IDE2MSAzMjRUMTc0IDM3NkgxMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGdseXBoLW5hbWU9InllbiIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTExNiAyNTVRODcgMjU1IDg3IDI3MVE4NyAyNzkgOTAgMjkwVDk5IDMwNlExMDYgMzEzIDEyMyAzMTNIMjY2TDEzNiA2MjlRMTM0IDYzNCAxNDYgNjQyVDE3NSA2NTFRMTg2IDY1MSAxOTYgNjQ2VDIxMiA2MjNMMzIwIDMzNkw1NjggNjUzUTU2OCA2NTMgNTc0IDY1MlQ1ODggNjQ4VDYwMiA2MzdUNjA5IDYxN1E2MDkgNjA2IDYwNCA1OTZUNTgwIDU2NEwzNzEgMzEzSDUwN1E1MzYgMzEzIDUzNiAyOTdRNTM2IDI4OSA1MzMgMjc4VDUyNCAyNjJRNTE3IDI1NSA1MDAgMjU1SDMzNkwzMTkgMTc1SDQ3OFE1MDcgMTc1IDUwNyAxNTlRNTA3IDE1MSA1MDQgMTQwVDQ5NSAxMjRRNDg4IDExNyA0NzEgMTE3SDMwN0wyODggMjdRMjg0IDEwIDI3NSAzVDI1MSAtNEgyNDhRMjM0IC00IDIyOCAzVDIyNiAyN0wyNDQgMTE3SDg3UTU4IDExNyA1OCAxMzNRNTggMTQxIDYxIDE1MlQ3MCAxNjhRNzcgMTc1IDk0IDE3NUgyNTZMMjczIDI1NUgxMTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNjsiIGdseXBoLW5hbWU9ImJyb2tlbmJhciIgaG9yaXotYWR2LXg9IjI3NyIgZD0iTTQzIC0xOTdRMjkgLTE5NyAyMyAtMTg4VDIxIC0xNjJMOTIgMTcwUTk2IDE4NiAxMDMgMTkzVDEyOCAyMDFIMTM0UTE0OCAyMDEgMTU0IDE5MlQxNTYgMTY2TDg1IC0xNjZRODEgLTE4MyA3NCAtMTkwVDQ5IC0xOTdINDNaTTEzOCAyNTNRMTI0IDI1MyAxMTggMjYyVDExNiAyODhMMTg3IDYyMFExOTEgNjM2IDE5OCA2NDNUMjIzIDY1MUgyMjlRMjQzIDY1MSAyNDkgNjQyVDI1MSA2MTZMMTgwIDI4NFExNzYgMjY3IDE2OSAyNjBUMTQ0IDI1M0gxMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNzsiIGdseXBoLW5hbWU9InNlY3Rpb24iIGQ9Ik0yMjEgLTE2MFExNDggLTE2MCA5OSAtMTQxVDIzIC05NVEtOCAtNjQgLTggLTM1US04IC0yMiAtMiAtMTNUMTIgMVQyNiA4VDMzIDlRNDMgLTE1IDU5IC0zNVQ5OCAtNzBUMTUyIC05M1QyMjYgLTEwMlEyOTUgLTEwMiAzMzAgLTc2VDM2NiAtNVEzNjYgMTUgMzU1IDI5VDMyNSA1NVQyODEgNzZUMjI3IDk3UTE5NyAxMDggMTY3IDEyMFQxMTQgMTQ5VDc3IDE4OVQ2MiAyNDZRNjIgMjc3IDczIDMwMVQxMDIgMzQzVDE0NSAzNzNUMTk2IDM5MVExNjggNDA5IDE1MCA0MzVUMTMyIDUwMVExMzIgNTM1IDE0NiA1NjRUMTg4IDYxNFQyNTMgNjQ3VDMzOSA2NTlRNDA3IDY1OSA0NDkgNjQxVDUxNiA1OThRNTMwIDU4NCA1MzcgNTcwVDU0NCA1NDRRNTQ0IDUzMiA1MzggNTI0VDUyNCA1MTBUNTEwIDUwM1Q1MDIgNTAzUTQ4MSA1NDggNDQwIDU3NFQzMzQgNjAxUTI2OSA2MDEgMjM0IDU3NVQxOTggNTEwUTE5OCA0ODggMjA5IDQ3M1QyMzkgNDQ1VDI4NCA0MjJUMzM5IDQwMFEzNjkgMzg4IDM5NyAzNzZUNDQ4IDM0OFQ0ODUgMzA5VDQ5OSAyNTZRNDk5IDIyMyA0ODggMTk4VDQ1OSAxNTVUNDE3IDEyNlQzNjUgMTA5UTM5NCA5MiA0MTMgNjdUNDMyIDNRNDMyIC03MCAzNzcgLTExNVQyMjEgLTE2MFpNMzA0IDEzN1EzMjkgMTM4IDM1MiAxNDZUMzk0IDE2OFQ0MjMgMjAxVDQzNCAyNDNRNDM0IDI2NCA0MjMgMjc5VDM5NCAzMDVUMzUwIDMyNlQyOTcgMzQ2UTI4NiAzNTAgMjc1IDM1NFQyNTIgMzYzUTIyNiAzNjAgMjA0IDM1MlQxNjQgMzMwVDEzNyAzMDBUMTI3IDI2MFExMjcgMjM3IDEzOCAyMjFUMTY4IDE5M1QyMTMgMTcwVDI2OSAxNTBMMzA0IDEzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE4OyIgZ2x5cGgtbmFtZT0iZGllcmVzaXMiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik00MjYgNTQ4UTM3NyA1NDggMzc3IDU4NlEzNzcgNjA5IDM4OSA2MjZUNDI4IDY0NFE0NzcgNjQ0IDQ3NyA2MDZRNDc3IDU4MyA0NjUgNTY2VDQyNiA1NDhaTTI1OCA1NDhRMjA5IDU0OCAyMDkgNTg2UTIwOSA2MDkgMjIxIDYyNlQyNjAgNjQ0UTMwOSA2NDQgMzA5IDYwNlEzMDkgNTgzIDI5NyA1NjZUMjU4IDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE5OyIgZ2x5cGgtbmFtZT0iY29weXJpZ2h0IiBob3Jpei1hZHYteD0iNzkxIiBkPSJNNDEzIC0xMlEzNDEgLTEyIDI4MSAxM1QxNzcgODJUMTA5IDE4N1Q4NSAzMjJRODUgMzk0IDExMCA0NTZUMTc5IDU2M1QyODMgNjMzVDQxNCA2NTlRNDg2IDY1OSA1NDYgNjM0VDY0OSA1NjVUNzE3IDQ2MFQ3NDIgMzI1UTc0MiAyNTMgNzE3IDE5MVQ2NDggODRUNTQ0IDE0VDQxMyAtMTJaTTQxNSAzNlE0NzUgMzYgNTI1IDU3VDYxMiAxMTZUNjY4IDIwNlQ2ODggMzIzUTY4OCAzODUgNjY3IDQzN1Q2MDkgNTI4VDUyMiA1ODlUNDEyIDYxMVEzNTIgNjExIDMwMiA1OTBUMjE1IDUzMVQxNTkgNDQxVDEzOSAzMjRRMTM5IDI2MiAxNjAgMjEwVDIxOCAxMTlUMzA1IDU4VDQxNSAzNlpNNDIyIDE0NFEzODMgMTQ0IDM1MSAxNTdUMjk1IDE5M1QyNTggMjUwVDI0NSAzMjJRMjQ1IDM2MCAyNTggMzkzVDI5NiA0NTBUMzUyIDQ4N1Q0MjEgNTAxUTQ2MSA1MDEgNDkwIDQ4OFQ1MzUgNDU5UTU1NCA0NDAgNTU0IDQyMVE1NTQgNDEyIDU0OSA0MDZUNTM4IDM5NVQ1MjcgMzkwVDUyMCAzOTBRNTA2IDQxNiA0ODEgNDMwVDQyMCA0NDVRMzk3IDQ0NSAzNzcgNDM2VDM0MCA0MTBUMzE1IDM3MVQzMDYgMzIzUTMwNiAyOTYgMzE1IDI3NFQzNDAgMjM1VDM3NyAyMDlUNDI0IDIwMFE0NjEgMjAwIDQ4NiAyMTdUNTI0IDI2MFE1MjUgMjYxIDUzMCAyNjBUNTQyIDI1NVQ1NTQgMjQ1VDU1OSAyMjlRNTU5IDIxMCA1MzUgMTg1UTUyMCAxNjkgNDkxIDE1N1Q0MjIgMTQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUE7IiBnbHlwaC1uYW1lPSJvcmRmZW1pbmluZSIgaG9yaXotYWR2LXg9IjUyMSIgZD0iTTQzNyAyNjFRNDAzIDI2MSAzOTAgMjgyVDM4MSAzNDBRMzU1IDI5OCAzMTcgMjc4VDIzNSAyNThRMjA0IDI1OCAxNzcgMjY4VDEyOCAyOTlUOTUgMzUwVDgzIDQyMFE4MyA0NjQgOTkgNTA3VDE0MyA1ODRUMjEyIDYzOVQyOTkgNjYwUTM0NiA2NjAgMzgwIDYzOVQ0MzEgNTgyTDQzNCA1OTNRNDQxIDYyNiA0NTIgNjM5VDQ4NCA2NTNRNDkzIDY1MyA1MDAgNjUwVDUwNyA2NDVMNDQ0IDM1MVE0MzggMzIyIDQ0NCAzMTFUNDc3IDI5N1E0NzcgMjk3IDQ3NyAyOTJUNDc0IDI3OVQ0NjIgMjY3VDQzNyAyNjFaTTI0NyAzMTFRMjc1IDMxMSAzMDEgMzIyVDM0OCAzNTNUMzgzIDM5N1Q0MDQgNDUxTDQxNyA1MTNRNDA0IDU1NyAzNzUgNTgyVDI5OCA2MDhRMjYyIDYwOCAyMzQgNTkyVDE4NSA1NDlUMTU1IDQ4OVQxNDQgNDIzUTE0NCAzNjkgMTc0IDM0MFQyNDcgMzExWk0xOTkgLTZRMTU2IC02IDE1NiAyNVExNTYgNTUgMTcwIDcxUTE4MSA4MyAyMDQgODNRMjQ3IDgzIDI0NyA1MlEyNDcgMjEgMjMyIDZRMjIwIC02IDE5OSAtNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90bGVmdCIgaG9yaXotYWR2LXg9IjU0MSIgZD0iTTQwOSA4OFEzODkgODggMzY4IDEwNVQzMjQgMTUwUTMxMiAxNjUgMzAyIDE4MFQyODMgMjA5VDI3MSAyMzJUMjY2IDI0NVEyNjYgMjQ3IDI3NSAyNTZUMjk4IDI3OVQzMzIgMzA5VDM3MSAzNDBRNDA0IDM2NiA0MzYgMzg0VDQ4OCA0MDNRNDk5IDQwMyA1MDUgMzk2VDUxMSAzNzlRNTExIDM3MSA1MDMgMzYwVDQ4MCAzMzZUNDQ3IDMwOFQ0MDYgMjgxUTM4NyAyNzAgMzY3IDI1N1QzMjUgMjMyUTM0MiAyMTggMzU0IDIwOFQzODAgMTg1UTQxMCAxNTcgNDIzIDE0MlQ0MzYgMTExUTQzNiAxMDIgNDI4IDk1VDQwOSA4OFpNMjMyIDg0UTIxMiA4NCAxODcgMTAzVDEzNiAxNTRRMTIyIDE3MSAxMTAgMTg4VDg4IDIxOVQ3NCAyNDNUNjggMjU2UTY4IDI2MSA5NCAyODZUMTYwIDM0M1ExOTIgMzY4IDIyMSAzODRUMjcwIDQwMVEyODEgNDAxIDI4NyAzOTRUMjkzIDM3N1EyOTMgMzYyIDI2OCAzMzlUMjAyIDI5MFExODUgMjc5IDE2NyAyNjdUMTI3IDI0M1ExNDQgMjI5IDE2MCAyMTZUMTkxIDE4OVEyMjYgMTU3IDI0MSAxNDBUMjU4IDEwN1EyNTkgOTggMjUxIDkxVDIzMiA4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFDOyIgZ2x5cGgtbmFtZT0ibG9naWNhbG5vdCIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTQ5IDM4MEg1NDNWOTZINDUzVjI5N0g0OVYzODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRDsiIGdseXBoLW5hbWU9InVuaTAwQUQiIGhvcml6LWFkdi14PSI0MDAiIGQ9Ik02NiAyNzJIMzM3VjIxMkg2NlYyNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRTsiIGdseXBoLW5hbWU9InJlZ2lzdGVyZWQiIGhvcml6LWFkdi14PSI3OTEiIGQ9Ik00MTMgLTEyUTM0MSAtMTIgMjgxIDEzVDE3NyA4MlQxMDkgMTg3VDg1IDMyMlE4NSAzOTQgMTEwIDQ1NlQxNzkgNTYzVDI4MyA2MzNUNDE0IDY1OVE0ODYgNjU5IDU0NiA2MzRUNjQ5IDU2NVQ3MTcgNDYwVDc0MiAzMjVRNzQyIDI1MyA3MTcgMTkxVDY0OCA4NFQ1NDQgMTRUNDEzIC0xMlpNNDE1IDM2UTQ3NSAzNiA1MjUgNTdUNjEyIDExNlQ2NjggMjA2VDY4OCAzMjNRNjg4IDM4NSA2NjcgNDM3VDYwOSA1MjhUNTIyIDU4OVQ0MTIgNjExUTM1MiA2MTEgMzAyIDU5MFQyMTUgNTMxVDE1OSA0NDFUMTM5IDMyNFExMzkgMjYyIDE2MCAyMTBUMjE4IDExOVQzMDUgNThUNDE1IDM2Wk01NjAgMzkxUTU2MCAzNjQgNTUxIDM0NVQ1MjcgMzE0VDQ5NCAyOTVUNDU2IDI4OEw1NTMgMTc2UTU1NSAxNzMgNTQ2IDE2MlQ1MjAgMTUxUTUxMiAxNTEgNTAxIDE1NVQ0NzkgMTczTDM5MiAyODNIMzQ4VjE3OVEzNDggMTUxIDMyMiAxNTFIMzE0UTI4OCAxNTEgMjg4IDE4M1Y0NjRRMjg4IDQ4MCAyOTcgNDg5VDMyMCA0OThINDI2UTQ5MSA0OTggNTI1IDQ3MlQ1NjAgMzkxWk00MjcgMzMzUTQ2MiAzMzMgNDgxIDM0OFQ1MDAgMzkwUTUwMCA0NDcgNDI0IDQ0N0gzNDdWMzMzSDQyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFGOyIgZ2x5cGgtbmFtZT0idW5pMDBBRiIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTIzMSA1NjhRMjAwIDU2OCAyMDAgNTg2UTIwMCA1OTQgMjAzIDYwNVQyMTIgNjIyUTIxOSA2MzAgMjM4IDYzMEg0NThRNDg5IDYzMCA0ODkgNjEyUTQ4OSA2MDQgNDg2IDU5M1Q0NzcgNTc2UTQ3MCA1NjggNDUxIDU2OEgyMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMDsiIGdseXBoLW5hbWU9ImRlZ3JlZSIgaG9yaXotYWR2LXg9IjQyMiIgZD0iTTIzOSAzNDhRMjEwIDM0OCAxODUgMzU3VDE0MiAzODVUMTE0IDQyOFQxMDMgNDg0UTEwMyA1MjEgMTE3IDU1M1QxNTUgNjEwVDIxMCA2NDhUMjc3IDY2MlEzMDYgNjYyIDMzMSA2NTNUMzc0IDYyNVQ0MDIgNTgyVDQxMyA1MjZRNDEzIDQ4OCAzOTkgNDU2VDM2MSAzOTlUMzA2IDM2MlQyMzkgMzQ4Wk0yNDkgNDAwUTI3MSA0MDAgMjkwIDQwOVQzMjUgNDM1VDM0OCA0NzRUMzU3IDUyMlEzNTcgNTU4IDMzMiA1ODRUMjY3IDYxMFEyNDUgNjEwIDIyNiA2MDFUMTkxIDU3NVQxNjggNTM2VDE1OSA0ODhRMTU5IDQ1MiAxODQgNDI2VDI0OSA0MDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMTsiIGdseXBoLW5hbWU9InBsdXNtaW51cyIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTE4MyA0MTFRMTU0IDQxMSAxNTQgNDI3UTE1NCA0MzUgMTU3IDQ0NlQxNjYgNDYyUTE3MyA0NjkgMTkwIDQ2OUgzMzVMMzY1IDYxMlEzNjkgNjI5IDM3NiA2MzZUMzk0IDY0M0g0MDJRNDEzIDY0MyA0MjEgNjM3VDQyNiA2MTJMMzk2IDQ2OUg1MzRRNTYzIDQ2OSA1NjMgNDUzUTU2MyA0NDUgNTYwIDQzNFQ1NTEgNDE4UTU0NCA0MTEgNTI3IDQxMUgzODNMMzUzIDI2N1EzNDkgMjUwIDM0MiAyNDNUMzI0IDIzNkgzMTZRMzA1IDIzNiAyOTcgMjQyVDI5MiAyNjdMMzIyIDQxMUgxODNaTTExMyAxMTlRODIgMTE5IDgyIDEzNVE4MiAxNDMgODYgMTU1VDk1IDE3M1ExMDIgMTgwIDEyMCAxODBINDgwUTUxMSAxODAgNTExIDE2NFE1MTEgMTU2IDUwNyAxNDRUNDk4IDEyNlE0OTEgMTE5IDQ3MyAxMTlIMTEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjI7IiBnbHlwaC1uYW1lPSJ0d29zdXBlcmlvciIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTExNSAzODFROTggMzY0IDk0IDMzOEgyNjlRMzAzIDMzOCAzMDMgMzE2UTMwMyAzMDUgMjk3IDI5NVQyOTAgMjg1SDYxUTUwIDI4NSA0MyAyOTZUMzcgMzI0UTM5IDM1MiA0OCAzNzRUNzUgNDE0UTk1IDQzNSAxMjIgNDQ3VDE3OSA0NzBRMjI4IDQ4NyAyNTUgNTAyVDI4MiA1NTBRMjgyIDU3MyAyNjIgNTg3VDIxMCA2MDFRMTc2IDYwMSAxNTYgNTg0VDEyMyA1NDBRMTIzIDUzOSAxMTcgNTM5VDEwNCA1NDNUOTIgNTUyVDg2IDU3MVE4NiA1ODIgOTIgNTk0VDEwOSA2MTdRMTI2IDYzMyAxNTMgNjQ0VDIxNyA2NTVRMjc1IDY1NSAzMDkgNjI4VDM0MyA1NTNRMzQzIDUyNSAzMzMgNTA2VDMwNiA0NzJUMjY0IDQ0OFQyMTEgNDI4UTE3OCA0MTcgMTU1IDQwOFQxMTUgMzgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjM7IiBnbHlwaC1uYW1lPSJ0aHJlZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iMzcwIiBkPSJNMzA5IDM5NVEzMDkgMzc0IDMwMiAzNTRUMjc3IDMxNlQyMzEgMjg5VDE2MiAyNzhRMTIzIDI3OCA5NSAyODhUNTEgMzE0UTM4IDMyNiAzNCAzMzhUMjkgMzU5UTI5IDM3MyAzNSAzODFUNDkgMzkzVDYzIDM5N1Q3MCAzOTdRNzUgMzY1IDk4IDM0N1QxNjMgMzI5UTIwNSAzMjkgMjI1IDM0OVQyNDYgMzk4UTI0NiA0MjEgMjI5IDQzNVQxNzggNDUwSDE1N1ExMzMgNDUwIDEzMyA0NjdRMTMzIDQ3MiAxMzUgNDgwVDE0MiA0OTJRMTQ4IDQ5OSAxNjggNDk5SDE5M1EyMTcgNDk5IDIzMiA1MDNUMjU3IDUxNlQyNjkgNTM0VDI3MyA1NTVRMjczIDU3NyAyNTQgNTkwVDIwNSA2MDRRMTcyIDYwNCAxNTAgNTg5VDExNiA1NTNRMTE1IDU1MiAxMTAgNTUyVDk4IDU1NlQ4NyA1NjVUODIgNTgxUTgyIDYwMCA5OSA2MTVRMTE2IDYzMyAxNDMgNjQ0VDIwOSA2NTVRMjM0IDY1NSAyNTcgNjQ4VDI5OCA2MjlUMzI1IDYwMFQzMzYgNTYzUTMzNiA1MjcgMzE2IDUwM1QyNTMgNDcwUTMwOSA0NTAgMzA5IDM5NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgZ2x5cGgtbmFtZT0iYWN1dGUiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yNjMgNTUxUTI2MiA1NTMgMjc1IDU2N1QzMDkgNjAwVDM1NiA2NDFUNDA3IDY3N1E0MzEgNjkyIDQ1MyA2OTJRNDY2IDY5MiA0NzQgNjg0VDQ4MiA2NjRRNDgyIDY0MCA0NDEgNjE2UTQxMyA2MDAgMzgzIDU4N1QzMjYgNTY1VDI4MiA1NTNUMjYzIDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI1OyIgZ2x5cGgtbmFtZT0idW5pMDBCNSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTUyIC0yOThRNyAtMjk4IC05IC0yNzFULTE0IC0xOTBMMTI5IDQ3NkgxOTRMMTM2IDIwMlExMjIgMTM0IDE0OCA5MlQyMzkgNDlRMjk0IDQ5IDMzMyA3N1Q0MDYgMTY0TDQ3MiA0NzZINTM3TDQ1NyAxMDFRNDQ5IDY2IDQ1OCA1MlQ1MDAgMzdWMzBRNTAwIDIzIDQ5NyAxNVQ0ODQgLTFUNDU1IC04UTQxNyAtOCA0MDAgMTRUMzg4IDc5UTM2MiAzNiAzMjAgMTJUMjMwIC0xMlExODIgLTEyIDE0NyA0UTExOCAxNyAxMDAgNDBMNTEgLTE4OVE0MyAtMjI0IDUyIC0yMzhUOTkgLTI1M1YtMjYwUTk5IC0yNjcgOTUgLTI3NVQ4MSAtMjkxVDUyIC0yOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGdseXBoLW5hbWU9InBhcmFncmFwaCIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTQ1MSAtNFE0MTkgLTQgNDI3IDMxTDU1MiA2MjBRNTU2IDYzNiA1NjMgNjQzVDU4NiA2NTFINTk1UTYxMCA2NTEgNjE2IDY0MlQ2MTkgNjE2TDQ5NCAyN1E0OTAgMTAgNDgzIDNUNDYwIC00SDQ1MVpNMzI1IC00UTI5MyAtNCAzMDEgMzFMMzU2IDI5MEgzMDFRMTk1IDI5MCAxMzkgMzI3VDgzIDQ0MFE4MyA0ODIgOTYgNTIwVDEzOSA1ODZUMjE3IDYzMFQzMzQgNjQ3SDQ1M1E0NzYgNjQ3IDQ4NSA2MzVUNDkwIDYwMkwzNjggMjdRMzY0IDEwIDM1NyAzVDMzNCAtNEgzMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNzsiIGdseXBoLW5hbWU9InVuaTAwQjciIGhvcml6LWFkdi14PSIyNTUiIGQ9Ik0xMjcgMTk0UTEwNCAxOTQgOTIgMjAzVDc5IDIyOFE3OSAyNjQgOTUgMjgwUTEwOCAyOTMgMTMyIDI5M1ExNTUgMjkzIDE2NyAyODRUMTgwIDI1OVExODAgMjIzIDE2NCAyMDdRMTUxIDE5NCAxMjcgMTk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjg7IiBnbHlwaC1uYW1lPSJjZWRpbGxhIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMTI3IC0yMzRRMTI0IC0yMzcgMTE4IC0yMzZUMTA3IC0yMzBUOTkgLTIyMlQ5NyAtMjE0TDIwNCAtNDdRMjA1IC00NiAyMTQgLTQ3VDIzMyAtNTJUMjUzIC02M1QyNjIgLTgzUTI2MiAtMTA1IDI0MCAtMTI4TDEyNyAtMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjk7IiBnbHlwaC1uYW1lPSJvbmVzdXBlcmlvciIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTY5IDI4NVE0MSAyODUgNDQgMzA3UTQ0IDMwOSA0NSAzMTVUNDkgMzI0UTU2IDMzOSA3OSAzMzlIMTQ4TDE5OSA1NjlRMTc3IDU0NyAxNDYgNTQ3UTEyMyA1NDcgMTExIDU1OFQ5OCA1ODdROTggNTk3IDEwMSA2MDRUMTA5IDYxN1QxMTggNjI0VDEyMiA2MjZRMTI3IDYxOCAxMzcgNjExVDE2NCA2MDNRMTgyIDYwMyAxOTkgNjE2VDIyNCA2NTFIMjQ5UTI3NyA2NTEgMjcxIDYyMEwyMDggMzM5SDI3MVEyOTkgMzM5IDI5NiAzMTdRMjk2IDMxNSAyOTUgMzA5VDI5MCAzMDBRMjg1IDI4NSAyNjEgMjg1SDY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkE7IiBnbHlwaC1uYW1lPSJvcmRtYXNjdWxpbmUiIGhvcml6LWFkdi14PSI0NzciIGQ9Ik0yNjUgMjU3UTIyNyAyNTcgMTk1IDI2OVQxMzkgMzA1VDEwMiAzNjFUODggNDM1UTg4IDQ3OSAxMDQgNTE5VDE0OCA1OTFUMjE2IDY0MFQzMDMgNjU5UTM0MSA2NTkgMzczIDY0N1Q0MzAgNjExVDQ2NyA1NTVUNDgxIDQ4MlE0ODEgNDM3IDQ2NSAzOTdUNDIxIDMyNVQzNTIgMjc2VDI2NSAyNTdaTTE5MiAtNlExNDkgLTYgMTQ5IDI1UTE0OSA1NSAxNjMgNzFRMTc0IDgzIDE5NyA4M1EyNDAgODMgMjQwIDUyUTI0MCAyMSAyMjUgNlEyMTMgLTYgMTkyIC02Wk0yNjggMzEwUTMwMCAzMTAgMzI4IDMyNFQzNzYgMzYxVDQwOCA0MTVUNDIwIDQ4MFE0MjAgNTA3IDQxMSA1MzBUMzg1IDU3MFQzNDcgNTk2VDMwMCA2MDZRMjY4IDYwNiAyNDAgNTkyVDE5MiA1NTVUMTYxIDUwMVQxNDkgNDM2UTE0OSA0MDkgMTU4IDM4NlQxODMgMzQ2VDIyMSAzMjBUMjY4IDMxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90cmlnaHQiIGhvcml6LWFkdi14PSI1NDEiIGQ9Ik0yNzMgODVRMjYyIDg1IDI1NiA5MlQyNTAgMTA5UTI1MCAxMjQgMjc1IDE0N1QzNDEgMTk2UTM1OCAyMDcgMzc2IDIxOVQ0MTYgMjQzUTM5OSAyNTcgMzgzIDI3MFQzNTIgMjk3UTMxNyAzMjkgMzAyIDM0NlQyODUgMzc5UTI4NCAzODggMjkyIDM5NVQzMTEgNDAyUTMzMSA0MDIgMzU2IDM4M1Q0MDcgMzMyUTQyMSAzMTUgNDMzIDI5OFQ0NTUgMjY3VDQ2OSAyNDNUNDc1IDIzMFE0NzUgMjI1IDQ0OSAyMDBUMzgzIDE0M1EzNTEgMTE4IDMyMiAxMDJUMjczIDg1Wk01NSA4M1E0NCA4MyAzOCA5MFQzMiAxMDdRMzIgMTE0IDQwIDEyNVQ2MiAxNTBUOTYgMTc4VDEzNyAyMDVRMTU2IDIxNiAxNzYgMjI5VDIxOCAyNTRRMjAxIDI2OCAxODkgMjc4VDE2MyAzMDFRMTMzIDMyOSAxMjAgMzQ0VDEwNyAzNzVRMTA3IDM4NCAxMTUgMzkxVDEzNCAzOThRMTU0IDM5OCAxNzUgMzgxVDIxOSAzMzZRMjMxIDMyMSAyNDEgMzA2VDI2MCAyNzdUMjcyIDI1NFQyNzcgMjQxUTI3NyAyMzkgMjY4IDIzMFQyNDUgMjA3VDIxMSAxNzdUMTcyIDE0NlExMzkgMTIwIDEwNyAxMDJUNTUgODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGdseXBoLW5hbWU9Im9uZXF1YXJ0ZXIiIGhvcml6LWFkdi14PSI4MjYiIGQ9Ik02NzMgLTNRNjYxIC0zIDY1NCA0VDY1MSAyOEw2NjQgOTVINTEzUTUxMSA5NSA1MDMgMTA2VDQ5NCAxMzNRNDk0IDE0NSA1MDAgMTU1VDUxOSAxODFMNjcyIDMzOFE2ODYgMzU0IDY5NyAzNjBUNzMwIDM2NlE3ODIgMzY2IDc3MiAzMjFMNzM1IDE0N0g3NzBRNzk1IDE0NyA3OTUgMTMwUTc5NSAxMjUgNzkzIDExNlQ3ODUgMTAxUTc4MSA5OCA3NzcgOTdUNzYzIDk1SDcyNEw3MDkgMjdRNzA2IDEwIDY5OSA0VDY4MSAtM0g2NzNaTTczMiA2MzJRNzQwIDYyOSA3NDYgNjI1UTc1MSA2MjEgNzU0IDYxNVQ3NTYgNjAwUTc1NCA1ODkgNzQ2IDU3OFQ3MjAgNTQ3UTcxMSA1MzggNjgzIDUxMVQ2MTcgNDQ4VDUzNyAzNzFUNDU3IDI5MlE0MzggMjczIDQxNCAyNTBUMzYzIDIwMFQzMDggMTQ3VDI1NCA5NVExOTIgMzYgMTI3IC0yN1ExMjUgLTI4IDEyMSAtMjdUMTExIC0yMVQxMDMgLTEwVDEwMSA1UTEwMiAxMiAxMDQgMTdUMTExIDI5VDEyMSA0MVQxMzcgNThRMTQ2IDY4IDE3MyA5NFQyMzggMTU3VDMxOCAyMzNUMzk5IDMxMlE0MTggMzMxIDQ0MiAzNTRUNDk0IDQwNFQ1NDkgNDU2VDYwNCA1MDlRNjY2IDU2OCA3MzIgNjMyWk02OSAyODVRNDEgMjg1IDQ0IDMwN1E0NCAzMDkgNDUgMzE1VDQ5IDMyNFE1NiAzMzkgNzkgMzM5SDE0OEwxOTkgNTY5UTE3NyA1NDcgMTQ2IDU0N1ExMjMgNTQ3IDExMSA1NThUOTggNTg3UTk4IDU5NyAxMDEgNjA0VDEwOSA2MTdUMTE4IDYyNFQxMjIgNjI2UTEyNyA2MTggMTM3IDYxMVQxNjQgNjAzUTE4MiA2MDMgMTk5IDYxNlQyMjQgNjUxSDI0OVEyNzcgNjUxIDI3MSA2MjBMMjA4IDMzOUgyNzFRMjk5IDMzOSAyOTYgMzE3UTI5NiAzMTUgMjk1IDMwOVQyOTAgMzAwUTI4NSAyODUgMjYxIDI4NUg2OVpNNTUwIDE0Nkg2NzhMNzE0IDMxNkw1NTAgMTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkQ7IiBnbHlwaC1uYW1lPSJvbmVoYWxmIiBob3Jpei1hZHYteD0iODI2IiBkPSJNNTcxIDk2UTU1NCA3OSA1NTAgNTNINzI1UTc1OSA1MyA3NTkgMzFRNzU5IDIwIDc1MyAxMFQ3NDYgMEg1MTdRNTA2IDAgNDk5IDExVDQ5MyAzOVE0OTUgNjcgNTA0IDg5VDUzMSAxMjlRNTUxIDE1MCA1NzggMTYyVDYzNSAxODVRNjg0IDIwMiA3MTEgMjE3VDczOCAyNjVRNzM4IDI4OCA3MTggMzAyVDY2NiAzMTZRNjMyIDMxNiA2MTIgMjk5VDU3OSAyNTVRNTc5IDI1NCA1NzMgMjU0VDU2MCAyNThUNTQ4IDI2N1Q1NDIgMjg2UTU0MiAyOTcgNTQ4IDMwOVQ1NjUgMzMyUTU4MiAzNDggNjA5IDM1OVQ2NzMgMzcwUTczMSAzNzAgNzY1IDM0M1Q3OTkgMjY4UTc5OSAyNDAgNzg5IDIyMVQ3NjIgMTg3VDcyMCAxNjNUNjY3IDE0M1E2MzQgMTMyIDYxMSAxMjNUNTcxIDk2Wk03MDIgNjMyUTcxMCA2MjkgNzE2IDYyNVE3MjEgNjIxIDcyNCA2MTVUNzI2IDYwMFE3MjQgNTg5IDcxNiA1NzhUNjkwIDU0N1E2ODEgNTM4IDY1MyA1MTFUNTg3IDQ0OFQ1MDcgMzcxVDQyNyAyOTJRNDA4IDI3MyAzODQgMjUwVDMzMyAyMDBUMjc4IDE0N1QyMjQgOTVRMTYyIDM2IDk3IC0yN1E5NSAtMjggOTEgLTI3VDgxIC0yMVQ3MyAtMTBUNzEgNVE3MiAxMiA3NCAxN1Q4MSAyOVQ5MSA0MVQxMDcgNThRMTE2IDY4IDE0MyA5NFQyMDggMTU3VDI4OCAyMzNUMzY5IDMxMlEzODggMzMxIDQxMiAzNTRUNDY0IDQwNFQ1MTkgNDU2VDU3NCA1MDlRNjM2IDU2OCA3MDIgNjMyWk02OSAyODVRNDEgMjg1IDQ0IDMwN1E0NCAzMDkgNDUgMzE1VDQ5IDMyNFE1NiAzMzkgNzkgMzM5SDE0OEwxOTkgNTY5UTE3NyA1NDcgMTQ2IDU0N1ExMjMgNTQ3IDExMSA1NThUOTggNTg3UTk4IDU5NyAxMDEgNjA0VDEwOSA2MTdUMTE4IDYyNFQxMjIgNjI2UTEyNyA2MTggMTM3IDYxMVQxNjQgNjAzUTE4MiA2MDMgMTk5IDYxNlQyMjQgNjUxSDI0OVEyNzcgNjUxIDI3MSA2MjBMMjA4IDMzOUgyNzFRMjk5IDMzOSAyOTYgMzE3UTI5NiAzMTUgMjk1IDMwOVQyOTAgMzAwUTI4NSAyODUgMjYxIDI4NUg2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJFOyIgZ2x5cGgtbmFtZT0idGhyZWVxdWFydGVycyIgaG9yaXotYWR2LXg9IjgyNiIgZD0iTTY3MyAtM1E2NjEgLTMgNjU0IDRUNjUxIDI4TDY2NCA5NUg1MTNRNTExIDk1IDUwMyAxMDZUNDk0IDEzM1E0OTQgMTQ1IDUwMCAxNTVUNTE5IDE4MUw2NzIgMzM4UTY4NiAzNTQgNjk3IDM2MFQ3MzAgMzY2UTc4MiAzNjYgNzcyIDMyMUw3MzUgMTQ3SDc3MFE3OTUgMTQ3IDc5NSAxMzBRNzk1IDEyNSA3OTMgMTE2VDc4NSAxMDFRNzgxIDk4IDc3NyA5N1Q3NjMgOTVINzI0TDcwOSAyN1E3MDYgMTAgNjk5IDRUNjgxIC0zSDY3M1pNNzMyIDYzMlE3NDAgNjI5IDc0NiA2MjVRNzUxIDYyMSA3NTQgNjE1VDc1NiA2MDBRNzU0IDU4OSA3NDYgNTc4VDcyMCA1NDdRNzExIDUzOCA2ODMgNTExVDYxNyA0NDhUNTM3IDM3MVQ0NTcgMjkyUTQzOCAyNzMgNDE0IDI1MFQzNjMgMjAwVDMwOCAxNDdUMjU0IDk1UTE5MiAzNiAxMjcgLTI3UTEyNSAtMjggMTIxIC0yN1QxMTEgLTIxVDEwMyAtMTBUMTAxIDVRMTAyIDEyIDEwNCAxN1QxMTEgMjlUMTIxIDQxVDEzNyA1OFExNDYgNjggMTczIDk0VDIzOCAxNTdUMzE4IDIzM1QzOTkgMzEyUTQxOCAzMzEgNDQyIDM1NFQ0OTQgNDA0VDU0OSA0NTZUNjA0IDUwOVE2NjYgNTY4IDczMiA2MzJaTTMwOSAzOTVRMzA5IDM3NCAzMDIgMzU0VDI3NyAzMTZUMjMxIDI4OVQxNjIgMjc4UTEyMyAyNzggOTUgMjg4VDUxIDMxNFEzOCAzMjYgMzQgMzM4VDI5IDM1OVEyOSAzNzMgMzUgMzgxVDQ5IDM5M1Q2MyAzOTdUNzAgMzk3UTc1IDM2NSA5OCAzNDdUMTYzIDMyOVEyMDUgMzI5IDIyNSAzNDlUMjQ2IDM5OFEyNDYgNDIxIDIyOSA0MzVUMTc4IDQ1MEgxNTdRMTMzIDQ1MCAxMzMgNDY3UTEzMyA0NzIgMTM1IDQ4MFQxNDIgNDkyUTE0OCA0OTkgMTY4IDQ5OUgxOTNRMjE3IDQ5OSAyMzIgNTAzVDI1NyA1MTZUMjY5IDUzNFQyNzMgNTU1UTI3MyA1NzcgMjU0IDU5MFQyMDUgNjA0UTE3MiA2MDQgMTUwIDU4OVQxMTYgNTUzUTExNSA1NTIgMTEwIDU1MlQ5OCA1NTZUODcgNTY1VDgyIDU4MVE4MiA2MDAgOTkgNjE1UTExNiA2MzMgMTQzIDY0NFQyMDkgNjU1UTIzNCA2NTUgMjU3IDY0OFQyOTggNjI5VDMyNSA2MDBUMzM2IDU2M1EzMzYgNTI3IDMxNiA1MDNUMjUzIDQ3MFEzMDkgNDUwIDMwOSAzOTVaTTU1MCAxNDZINjc4TDcxNCAzMTZMNTUwIDE0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJGOyIgZ2x5cGgtbmFtZT0icXVlc3Rpb25kb3duIiBob3Jpei1hZHYteD0iNDk3IiBkPSJNMzU2IDQyNlEzNTAgMzk5IDM0MSAzODBUMzE3IDM0NVQyODAgMzE3VDIyNyAyOTRRMTk2IDI4MyAxNzEgMjcyVDEyOSAyNDVUMTAzIDIxMFQ5MyAxNjJROTMgMTM4IDEwMiAxMTdUMTI4IDgxVDE3MCA1NlQyMjcgNDZRMjg0IDQ2IDMyMiA4MFQzODEgMTY4UTM4MSAxNjkgMzg4IDE2OFQ0MDMgMTYzVDQxNyAxNTJUNDI0IDEzMlE0MjQgMTEyIDQxMyA5MVQzODIgNTBRMzU0IDIyIDMxNiA0VDIyMyAtMTRRMTc4IC0xNCAxNDIgLTFUODAgMzdUNDAgOTNUMjYgMTYyUTI2IDIwNCA0MSAyMzRUODAgMjg1VDEzMSAzMTlUMTg0IDM0MFEyMTMgMzQ5IDIzMiAzNThUMjYzIDM3OFQyODEgNDAyVDI5MyA0MzVMMzAxIDQ2OEgzNjVMMzU2IDQyNlpNMzQ5IDY1MVEzNzIgNjUxIDM4NCA2NDJUMzk3IDYxN1EzOTcgNTgxIDM4MSA1NjVRMzY4IDU1MiAzNDQgNTUyUTMyMSA1NTIgMzA5IDU2MVQyOTYgNTg2UTI5NiA2MjIgMzEyIDYzOFEzMjUgNjUxIDM0OSA2NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMDsiIGdseXBoLW5hbWU9IkFncmF2ZSIgaG9yaXotYWR2LXg9IjY0MyIgZD0iTS0yNSAwTDM1MCA2MzFRMzU4IDY0NCAzNjcgNjQ5VDM5MyA2NTRRNDE5IDY1NCA0MjggNjQ2VDQ0MCA2MjRMNTY1IDBINDk0TDQ1NSAyMTFIMTc1TDU0IDBILTI1Wk00NDMgMjcxTDM4NiA1NzZMMjEwIDI3MUg0NDNaTTQ0OSA3MjFRNDQ3IDcxOSA0MzEgNzIzVDM5MyA3MzhUMzQ0IDc2M1QyOTYgNzk2UTI3OSA4MTAgMjczIDgyMVQyNjYgODQ1UTI2NiA4NTggMjc2IDg2NlQyOTggODc0UTMwOSA4NzQgMzIwIDg2OFQzNDMgODUzUTM2NSA4MzUgMzg1IDgxM1Q0MjAgNzcxVDQ0MyA3MzdUNDQ5IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMxOyIgZ2x5cGgtbmFtZT0iQWFjdXRlIiBob3Jpei1hZHYteD0iNjQzIiBkPSJNLTI1IDBMMzUwIDYzMVEzNTggNjQ0IDM2NyA2NDlUMzkzIDY1NFE0MTkgNjU0IDQyOCA2NDZUNDQwIDYyNEw1NjUgMEg0OTRMNDU1IDIxMUgxNzVMNTQgMEgtMjVaTTQ0MyAyNzFMMzg2IDU3NkwyMTAgMjcxSDQ0M1pNMzU3IDcyMVEzNTYgNzIzIDM2OSA3MzdUNDAzIDc3MFQ0NTAgODExVDUwMSA4NDdRNTI1IDg2MiA1NDcgODYyUTU2MCA4NjIgNTY4IDg1NFQ1NzYgODM0UTU3NiA4MTAgNTM1IDc4NlE1MDcgNzcwIDQ3NyA3NTdUNDIwIDczNVQzNzYgNzIzVDM1NyA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMjsiIGdseXBoLW5hbWU9IkFjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjQzIiBkPSJNLTI1IDBMMzUwIDYzMVEzNTggNjQ0IDM2NyA2NDlUMzkzIDY1NFE0MTkgNjU0IDQyOCA2NDZUNDQwIDYyNEw1NjUgMEg0OTRMNDU1IDIxMUgxNzVMNTQgMEgtMjVaTTQ0MyAyNzFMMzg2IDU3NkwyMTAgMjcxSDQ0M1pNMjkxIDcxOVEyODEgNzE5IDI3NyA3MjRUMjcyIDczNlEyNzIgNzUzIDI4OSA3NzNUMzM5IDgyMlEzNTUgODM2IDM3MSA4NDhUNDAxIDg2OVQ0MjIgODgzVDQzMiA4ODlRNDMzIDg4OSA0MzkgODg0VDQ1NCA4NjlUNDczIDg0OVQ0OTQgODI1UTUxNiA3OTYgNTI0IDc3OFQ1MzMgNzQ4UTUzMyA3MzQgNTI2IDcyN1Q1MDkgNzE5UTQ5NiA3MTkgNDg0IDczM1Q0NTMgNzgwTDQyNCA4MzFMMzczIDc3OFEzNDcgNzUxIDMyNiA3MzVUMjkxIDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMzOyIgZ2x5cGgtbmFtZT0iQXRpbGRlIiBob3Jpei1hZHYteD0iNjQzIiBkPSJNLTI1IDBMMzUwIDYzMVEzNTggNjQ0IDM2NyA2NDlUMzkzIDY1NFE0MTkgNjU0IDQyOCA2NDZUNDQwIDYyNEw1NjUgMEg0OTRMNDU1IDIxMUgxNzVMNTQgMEgtMjVaTTQ0MyAyNzFMMzg2IDU3NkwyMTAgMjcxSDQ0M1pNNDc4IDcxOFE0NTQgNzE4IDQxNiA3MzlUMzM5IDc5OFEzMzMgNzg1IDMyNyA3NzJUMzE0IDc0OVQzMDAgNzMyVDI4NSA3MjVRMjczIDcyNSAyNjggNzMxVDI2MiA3NDVRMjYyIDc2MiAyNjkgNzc5VDI4NyA4MTBUMzEyIDgzMlQzNDIgODQxUTM2NiA4NDEgNDA0IDgyMFQ0ODEgNzYxUTQ4NyA3NzQgNDkzIDc4N1Q1MDYgODEwVDUyMCA4MjdUNTM1IDgzNFE1NDcgODM0IDU1MiA4MjhUNTU4IDgxNFE1NTggNzk3IDU1MSA3ODBUNTMzIDc0OVQ1MDggNzI3VDQ3OCA3MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNDsiIGdseXBoLW5hbWU9IkFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjY0MyIgZD0iTS0yNSAwTDM1MCA2MzFRMzU4IDY0NCAzNjcgNjQ5VDM5MyA2NTRRNDE5IDY1NCA0MjggNjQ2VDQ0MCA2MjRMNTY1IDBINDk0TDQ1NSAyMTFIMTc1TDU0IDBILTI1Wk00NDMgMjcxTDM4NiA1NzZMMjEwIDI3MUg0NDNaTTQ5MCA3MThRNDQxIDcxOCA0NDEgNzU2UTQ0MSA3NzkgNDUzIDc5NlQ0OTIgODE0UTU0MSA4MTQgNTQxIDc3NlE1NDEgNzUzIDUyOSA3MzZUNDkwIDcxOFpNMzIyIDcxOFEyNzMgNzE4IDI3MyA3NTZRMjczIDc3OSAyODUgNzk2VDMyNCA4MTRRMzczIDgxNCAzNzMgNzc2UTM3MyA3NTMgMzYxIDczNlQzMjIgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzU7IiBnbHlwaC1uYW1lPSJBcmluZyIgaG9yaXotYWR2LXg9IjY0MyIgZD0iTTUyIC0zUTUyIC0zIDQ1IC0zVDI4IC0xVDEyIDlUNSAzM1E1IDQyIDkgNTNUMjQgODJMMzMzIDYwMkwzNDIgNjE1UTMxOCA2MjggMzA1IDY1MFQyOTEgNzAyUTI5MSA3MjggMzAwIDc1MlQzMjcgNzk1VDM2OCA4MjVUNDIxIDgzNlE0NzAgODM2IDUwMCA4MDhUNTMwIDczNVE1MzAgNjkzIDUwNiA2NThUNDQyIDYwOFE0NDUgNjAyIDQ0NiA1OTNMNTYyIDE3UTU2MyAxMyA1NTIgNVQ1MjQgLTNRNTEyIC0zIDUwMiA1VDQ4OCAzNEw0NTUgMjExSDE3NUw1MiAtM1pNNDQzIDI3MUwzODYgNTc2TDIxMCAyNzFINDQzWk00MDIgNjQ2UTQyMCA2NDYgNDM0IDY1M1Q0NTggNjczVDQ3MyA3MDBUNDc5IDczMVE0NzkgNzU2IDQ2MiA3NzNUNDE5IDc5MVE0MDEgNzkxIDM4NyA3ODRUMzYzIDc2NFQzNDggNzM3VDM0MiA3MDZRMzQyIDY4MSAzNTkgNjY0VDQwMiA2NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNjsiIGdseXBoLW5hbWU9IkFFIiBob3Jpei1hZHYteD0iODgwIiBkPSJNNTIgLTNRNTIgLTMgNDAgLTNUMTcgNFQ1IDI5VDI0IDgyTDMzOSA2MTJRMzQ5IDYyOSAzNjEgNjM4VDM5NiA2NDdIODgyUTg4MSA2NDYgODgxIDY0M1E4ODAgNjQxIDg4MCA2MzhUODc5IDYzMFE4NzcgNjIyIDg3NSA2MTBUODcxIDU5MlE4NzAgNTg5IDg3MCA1ODZRODcwIDU4NSA4NjkgNTg1SDQ0OEw0OTMgMzYySDc1NlE3NTUgMzYxIDc1NSAzNThRNzU0IDM1NiA3NTQgMzUzVDc1MyAzNDZRNzUxIDMzOCA3NDkgMzI2VDc0NSAzMDlRNzQ0IDMwNiA3NDQgMzA0UTc0NCAzMDMgNzQzIDMwMkg1MDVMNTUzIDYySDc3M1E3NzIgNjEgNzcyIDU4UTc3MSA1NiA3NzEgNTNUNzcwIDQ1UTc2OCAzNyA3NjYgMjVUNzYyIDdRNzYxIDQgNzYxIDFRNzYxIDAgNzYwIDBINTQxUTUxNSAwIDUwMyA5VDQ4NiA0NEw0NTUgMjExSDE3NUw1MiAtM1pNNDQzIDI3MUwzODYgNTc2TDIxMCAyNzFINDQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzc7IiBnbHlwaC1uYW1lPSJDY2VkaWxsYSIgaG9yaXotYWR2LXg9IjY4NCIgZD0iTTM3MCAtMTJRMzA0IC0xMiAyNTAgN1QxNTggNjNUOTkgMTUwVDc4IDI2N1E3OCAzNDYgMTA1IDQxN1QxODEgNTQyVDI5NSA2MjdUNDM4IDY1OVE1MTAgNjU5IDU1NiA2MzhUNjMxIDU4OFE2NTMgNTY2IDY2MyA1NDRUNjczIDUwOFE2NzMgNDk1IDY2NyA0ODdUNjUzIDQ3NFQ2MzggNDY4VDYyOCA0NjlRNTgwIDYwMCA0MzUgNjAwUTM3NCA2MDAgMzIyIDU3NFQyMzIgNTA0VDE3MiA0MDJUMTUwIDI3N1ExNTAgMjI0IDE2NiAxODJUMjExIDExMFQyODAgNjRUMzY5IDQ4UTQzOSA0OCA0OTEgNzZUNTc2IDE1M1E1NzcgMTU0IDU4MiAxNTNUNTk0IDE0N1Q2MDUgMTM1VDYxMCAxMTdRNjEwIDkzIDU4MSA2NFE1NjYgNDkgNTQ1IDM2VDQ5NiAxMlQ0MzYgLTVUMzcwIC0xMlpNMjcyIC0yMzRRMjY5IC0yMzcgMjYzIC0yMzZUMjUyIC0yMzBUMjQ0IC0yMjJUMjQyIC0yMTRMMzQ5IC00N1EzNTAgLTQ2IDM1OSAtNDdUMzc4IC01MlQzOTggLTYzVDQwNyAtODNRNDA3IC0xMDUgMzg1IC0xMjhMMjcyIC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDODsiIGdseXBoLW5hbWU9IkVncmF2ZSIgaG9yaXotYWR2LXg9IjYxMCIgZD0iTTE3MiA2MDZRMTc2IDYyNSAxODcgNjM2VDIxOSA2NDdINjM0UTYzMyA2NDYgNjMzIDY0M1E2MzIgNjQxIDYzMiA2MzhUNjMxIDYzMFE2MjkgNjIyIDYyNyA2MTBUNjIzIDU5MlE2MjEgNTg2IDYyMSA1ODZWNTg1SDIzNkwxODggMzYySDUwMVE1MDEgMzYxIDUwMCAzNThRNDk4IDM1MyA0OTcgMzQ2TDQ4OSAzMDlRNDg4IDMwNiA0ODggMzA0VjMwMkgxNzVMMTI0IDYySDUxNFE1MTQgNjEgNTEzIDU4UTUxMSA1MyA1MTAgNDVMNTAyIDdRNTAxIDQgNTAxIDFWMEg0M0wxNzIgNjA2Wk00ODMgNzIxUTQ4MSA3MTkgNDY1IDcyM1Q0MjcgNzM4VDM3OCA3NjNUMzMwIDc5NlEzMTMgODEwIDMwNyA4MjFUMzAwIDg0NVEzMDAgODU4IDMxMCA4NjZUMzMyIDg3NFEzNDMgODc0IDM1NCA4NjhUMzc3IDg1M1EzOTkgODM1IDQxOSA4MTNUNDU0IDc3MVQ0NzcgNzM3VDQ4MyA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDOTsiIGdseXBoLW5hbWU9IkVhY3V0ZSIgaG9yaXotYWR2LXg9IjYxMCIgZD0iTTE3MiA2MDZRMTc2IDYyNSAxODcgNjM2VDIxOSA2NDdINjM0UTYzMyA2NDYgNjMzIDY0M1E2MzIgNjQxIDYzMiA2MzhUNjMxIDYzMFE2MjkgNjIyIDYyNyA2MTBUNjIzIDU5MlE2MjEgNTg2IDYyMSA1ODZWNTg1SDIzNkwxODggMzYySDUwMVE1MDEgMzYxIDUwMCAzNThRNDk4IDM1MyA0OTcgMzQ2TDQ4OSAzMDlRNDg4IDMwNiA0ODggMzA0VjMwMkgxNzVMMTI0IDYySDUxNFE1MTQgNjEgNTEzIDU4UTUxMSA1MyA1MTAgNDVMNTAyIDdRNTAxIDQgNTAxIDFWMEg0M0wxNzIgNjA2Wk0zNjEgNzIxUTM2MCA3MjMgMzczIDczN1Q0MDcgNzcwVDQ1NCA4MTFUNTA1IDg0N1E1MjkgODYyIDU1MSA4NjJRNTY0IDg2MiA1NzIgODU0VDU4MCA4MzRRNTgwIDgxMCA1MzkgNzg2UTUxMSA3NzAgNDgxIDc1N1Q0MjQgNzM1VDM4MCA3MjNUMzYxIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgZ2x5cGgtbmFtZT0iRWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MTAiIGQ9Ik0xNzIgNjA2UTE3NiA2MjUgMTg3IDYzNlQyMTkgNjQ3SDYzNFE2MzMgNjQ2IDYzMyA2NDNRNjMyIDY0MSA2MzIgNjM4VDYzMSA2MzBRNjI5IDYyMiA2MjcgNjEwVDYyMyA1OTJRNjIxIDU4NiA2MjEgNTg2VjU4NUgyMzZMMTg4IDM2Mkg1MDFRNTAxIDM2MSA1MDAgMzU4UTQ5OCAzNTMgNDk3IDM0Nkw0ODkgMzA5UTQ4OCAzMDYgNDg4IDMwNFYzMDJIMTc1TDEyNCA2Mkg1MTRRNTE0IDYxIDUxMyA1OFE1MTEgNTMgNTEwIDQ1TDUwMiA3UTUwMSA0IDUwMSAxVjBINDNMMTcyIDYwNlpNMzE1IDcxOVEzMDUgNzE5IDMwMSA3MjRUMjk2IDczNlEyOTYgNzUzIDMxMyA3NzNUMzYzIDgyMlEzNzkgODM2IDM5NSA4NDhUNDI1IDg2OVQ0NDYgODgzVDQ1NiA4ODlRNDU3IDg4OSA0NjMgODg0VDQ3OCA4NjlUNDk3IDg0OVQ1MTggODI1UTU0MCA3OTYgNTQ4IDc3OFQ1NTcgNzQ4UTU1NyA3MzQgNTUwIDcyN1Q1MzMgNzE5UTUyMCA3MTkgNTA4IDczM1Q0NzcgNzgwTDQ0OCA4MzFMMzk3IDc3OFEzNzEgNzUxIDM1MCA3MzVUMzE1IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgZ2x5cGgtbmFtZT0iRWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjEwIiBkPSJNMTcyIDYwNlExNzYgNjI1IDE4NyA2MzZUMjE5IDY0N0g2MzRRNjMzIDY0NiA2MzMgNjQzUTYzMiA2NDEgNjMyIDYzOFQ2MzEgNjMwUTYyOSA2MjIgNjI3IDYxMFQ2MjMgNTkyUTYyMSA1ODYgNjIxIDU4NlY1ODVIMjM2TDE4OCAzNjJINTAxUTUwMSAzNjEgNTAwIDM1OFE0OTggMzUzIDQ5NyAzNDZMNDg5IDMwOVE0ODggMzA2IDQ4OCAzMDRWMzAySDE3NUwxMjQgNjJINTE0UTUxNCA2MSA1MTMgNThRNTExIDUzIDUxMCA0NUw1MDIgN1E1MDEgNCA1MDEgMVYwSDQzTDE3MiA2MDZaTTUwNCA3MThRNDU1IDcxOCA0NTUgNzU2UTQ1NSA3NzkgNDY3IDc5NlQ1MDYgODE0UTU1NSA4MTQgNTU1IDc3NlE1NTUgNzUzIDU0MyA3MzZUNTA0IDcxOFpNMzM2IDcxOFEyODcgNzE4IDI4NyA3NTZRMjg3IDc3OSAyOTkgNzk2VDMzOCA4MTRRMzg3IDgxNCAzODcgNzc2UTM4NyA3NTMgMzc1IDczNlQzMzYgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0M7IiBnbHlwaC1uYW1lPSJJZ3JhdmUiIGhvcml6LWFkdi14PSIyNzYiIGQ9Ik0xODcgNjE5UTE5NCA2NTEgMjIxIDY1MUgyMzBRMjQ1IDY1MSAyNTEgNjQyVDI1MyA2MTVMMTIyIDBINTVMMTg3IDYxOVpNMjc2IDcyMVEyNzQgNzE5IDI1OCA3MjNUMjIwIDczOFQxNzEgNzYzVDEyMyA3OTZRMTA2IDgxMCAxMDAgODIxVDkzIDg0NVE5MyA4NTggMTAzIDg2NlQxMjUgODc0UTEzNiA4NzQgMTQ3IDg2OFQxNzAgODUzUTE5MiA4MzUgMjEyIDgxM1QyNDcgNzcxVDI3MCA3MzdUMjc2IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENEOyIgZ2x5cGgtbmFtZT0iSWFjdXRlIiBob3Jpei1hZHYteD0iMjc2IiBkPSJNMTg3IDYxOVExOTQgNjUxIDIyMSA2NTFIMjMwUTI0NSA2NTEgMjUxIDY0MlQyNTMgNjE1TDEyMiAwSDU1TDE4NyA2MTlaTTE5NCA3MjFRMTkzIDcyMyAyMDYgNzM3VDI0MCA3NzBUMjg3IDgxMVQzMzggODQ3UTM2MiA4NjIgMzg0IDg2MlEzOTcgODYyIDQwNSA4NTRUNDEzIDgzNFE0MTMgODEwIDM3MiA3ODZRMzQ0IDc3MCAzMTQgNzU3VDI1NyA3MzVUMjEzIDcyM1QxOTQgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0U7IiBnbHlwaC1uYW1lPSJJY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjI3NiIgZD0iTTE4NyA2MTlRMTk0IDY1MSAyMjEgNjUxSDIzMFEyNDUgNjUxIDI1MSA2NDJUMjUzIDYxNUwxMjIgMEg1NUwxODcgNjE5Wk0xMjggNzE5UTExOCA3MTkgMTE0IDcyNFQxMDkgNzM2UTEwOSA3NTMgMTI2IDc3M1QxNzYgODIyUTE5MiA4MzYgMjA4IDg0OFQyMzggODY5VDI1OSA4ODNUMjY5IDg4OVEyNzAgODg5IDI3NiA4ODRUMjkxIDg2OVQzMTAgODQ5VDMzMSA4MjVRMzUzIDc5NiAzNjEgNzc4VDM3MCA3NDhRMzcwIDczNCAzNjMgNzI3VDM0NiA3MTlRMzMzIDcxOSAzMjEgNzMzVDI5MCA3ODBMMjYxIDgzMUwyMTAgNzc4UTE4NCA3NTEgMTYzIDczNVQxMjggNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Y7IiBnbHlwaC1uYW1lPSJJZGllcmVzaXMiIGhvcml6LWFkdi14PSIyNzYiIGQ9Ik0xODcgNjE5UTE5NCA2NTEgMjIxIDY1MUgyMzBRMjQ1IDY1MSAyNTEgNjQyVDI1MyA2MTVMMTIyIDBINTVMMTg3IDYxOVpNMzI3IDcxOFEyNzggNzE4IDI3OCA3NTZRMjc4IDc3OSAyOTAgNzk2VDMyOSA4MTRRMzc4IDgxNCAzNzggNzc2UTM3OCA3NTMgMzY2IDczNlQzMjcgNzE4Wk0xNTkgNzE4UTExMCA3MTggMTEwIDc1NlExMTAgNzc5IDEyMiA3OTZUMTYxIDgxNFEyMTAgODE0IDIxMCA3NzZRMjEwIDc1MyAxOTggNzM2VDE1OSA3MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMDsiIGdseXBoLW5hbWU9IkV0aCIgaG9yaXotYWR2LXg9IjczMSIgZD0iTTEyNyAwUTEwNCAwIDk1IDEyVDkwIDQ1TDE0MyAyOTVINzlRNTAgMjk1IDUwIDMxMVE1MCAzMTkgNTMgMzMwVDYyIDM0NlE2OSAzNTMgODYgMzUzSDE1NUwyMDkgNjA2UTIxNSA2NDcgMjU2IDY0N0gzNjZRNTE3IDY0NyA2MDEgNTc3VDY4NiAzNzhRNjg2IDMwMCA2NjEgMjMxVDU4NiAxMTFUNDYwIDMwVDI4MyAwSDEyN1pNMjkzIDYwUTM3NiA2MCA0MzYgODVUNTM2IDE1MlQ1OTUgMjUwVDYxNCAzNjhRNjE0IDQ3MSA1NDggNTI5VDM2MSA1ODdIMjczTDIyMyAzNTNINDM0UTQ2MyAzNTMgNDYzIDMzN1E0NjMgMzI5IDQ2MCAzMThUNDUxIDMwMlE0NDQgMjk1IDQyNyAyOTVIMjExTDE2MSA2MEgyOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMTsiIGdseXBoLW5hbWU9Ik50aWxkZSIgaG9yaXotYWR2LXg9IjcwOSIgZD0iTTE3MiA2MDVRMTc3IDYyNiAxODkgNjM4VDIyMCA2NTFIMjM3UTI1NCA2NTEgMjYyIDY0MlQyODAgNjE1TDUyMiAxMDFMNjM5IDY0N0g3MDJMNTcyIDM3UTU2OCAxOSA1NTcgOFQ1MjggLTRINTIxUTUwNiAtNCA0OTcgNVQ0NzkgMzJMMjI3IDU2NkwxMDYgMEg0M0wxNzIgNjA1Wk01NDEgNzE4UTUxNyA3MTggNDc5IDczOVQ0MDIgNzk4UTM5NiA3ODUgMzkwIDc3MlQzNzcgNzQ5VDM2MyA3MzJUMzQ4IDcyNVEzMzYgNzI1IDMzMSA3MzFUMzI1IDc0NVEzMjUgNzYyIDMzMiA3NzlUMzUwIDgxMFQzNzUgODMyVDQwNSA4NDFRNDI5IDg0MSA0NjcgODIwVDU0NCA3NjFRNTUwIDc3NCA1NTYgNzg3VDU2OSA4MTBUNTgzIDgyN1Q1OTggODM0UTYxMCA4MzQgNjE1IDgyOFQ2MjEgODE0UTYyMSA3OTcgNjE0IDc4MFQ1OTYgNzQ5VDU3MSA3MjdUNTQxIDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQyOyIgZ2x5cGgtbmFtZT0iT2dyYXZlIiBob3Jpei1hZHYteD0iNzY2IiBkPSJNMzY2IC0xMVEyOTkgLTExIDI0NiAxMFQxNTYgNjlUOTggMTU4VDc4IDI2OVE3OCAzNTUgMTA4IDQyNlQxODkgNTUwVDMwNCA2MzBUNDM2IDY1OVE1MDMgNjU5IDU1NiA2MzhUNjQ2IDU3OVQ3MDQgNDkwVDcyNCAzNzlRNzI0IDI5MyA2OTQgMjIyVDYxMyA5OFQ0OTggMThUMzY2IC0xMVpNMzczIDQ4UTQyNCA0OCA0NzQgNzJUNTYzIDEzOVQ2MjcgMjQyVDY1MiAzNzRRNjUyIDQyMCA2MzggNDYxVDU5NSA1MzNUNTI1IDU4MlQ0MjkgNjAwUTM3OCA2MDAgMzI4IDU3NlQyMzkgNTA5VDE3NSA0MDZUMTUwIDI3NFExNTAgMjI3IDE2NCAxODZUMjA3IDExNVQyNzcgNjZUMzczIDQ4Wk01MjEgNzIxUTUxOSA3MTkgNTAzIDcyM1Q0NjUgNzM4VDQxNiA3NjNUMzY4IDc5NlEzNTEgODEwIDM0NSA4MjFUMzM4IDg0NVEzMzggODU4IDM0OCA4NjZUMzcwIDg3NFEzODEgODc0IDM5MiA4NjhUNDE1IDg1M1E0MzcgODM1IDQ1NyA4MTNUNDkyIDc3MVQ1MTUgNzM3VDUyMSA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMzsiIGdseXBoLW5hbWU9Ik9hY3V0ZSIgaG9yaXotYWR2LXg9Ijc2NiIgZD0iTTM2NiAtMTFRMjk5IC0xMSAyNDYgMTBUMTU2IDY5VDk4IDE1OFQ3OCAyNjlRNzggMzU1IDEwOCA0MjZUMTg5IDU1MFQzMDQgNjMwVDQzNiA2NTlRNTAzIDY1OSA1NTYgNjM4VDY0NiA1NzlUNzA0IDQ5MFQ3MjQgMzc5UTcyNCAyOTMgNjk0IDIyMlQ2MTMgOThUNDk4IDE4VDM2NiAtMTFaTTM3MyA0OFE0MjQgNDggNDc0IDcyVDU2MyAxMzlUNjI3IDI0MlQ2NTIgMzc0UTY1MiA0MjAgNjM4IDQ2MVQ1OTUgNTMzVDUyNSA1ODJUNDI5IDYwMFEzNzggNjAwIDMyOCA1NzZUMjM5IDUwOVQxNzUgNDA2VDE1MCAyNzRRMTUwIDIyNyAxNjQgMTg2VDIwNyAxMTVUMjc3IDY2VDM3MyA0OFpNMzc5IDcyMVEzNzggNzIzIDM5MSA3MzdUNDI1IDc3MFQ0NzIgODExVDUyMyA4NDdRNTQ3IDg2MiA1NjkgODYyUTU4MiA4NjIgNTkwIDg1NFQ1OTggODM0UTU5OCA4MTAgNTU3IDc4NlE1MjkgNzcwIDQ5OSA3NTdUNDQyIDczNVQzOTggNzIzVDM3OSA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENDsiIGdseXBoLW5hbWU9Ik9jaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNzY2IiBkPSJNMzY2IC0xMVEyOTkgLTExIDI0NiAxMFQxNTYgNjlUOTggMTU4VDc4IDI2OVE3OCAzNTUgMTA4IDQyNlQxODkgNTUwVDMwNCA2MzBUNDM2IDY1OVE1MDMgNjU5IDU1NiA2MzhUNjQ2IDU3OVQ3MDQgNDkwVDcyNCAzNzlRNzI0IDI5MyA2OTQgMjIyVDYxMyA5OFQ0OTggMThUMzY2IC0xMVpNMzczIDQ4UTQyNCA0OCA0NzQgNzJUNTYzIDEzOVQ2MjcgMjQyVDY1MiAzNzRRNjUyIDQyMCA2MzggNDYxVDU5NSA1MzNUNTI1IDU4MlQ0MjkgNjAwUTM3OCA2MDAgMzI4IDU3NlQyMzkgNTA5VDE3NSA0MDZUMTUwIDI3NFExNTAgMjI3IDE2NCAxODZUMjA3IDExNVQyNzcgNjZUMzczIDQ4Wk0zNTMgNzE5UTM0MyA3MTkgMzM5IDcyNFQzMzQgNzM2UTMzNCA3NTMgMzUxIDc3M1Q0MDEgODIyUTQxNyA4MzYgNDMzIDg0OFQ0NjMgODY5VDQ4NCA4ODNUNDk0IDg4OVE0OTUgODg5IDUwMSA4ODRUNTE2IDg2OVQ1MzUgODQ5VDU1NiA4MjVRNTc4IDc5NiA1ODYgNzc4VDU5NSA3NDhRNTk1IDczNCA1ODggNzI3VDU3MSA3MTlRNTU4IDcxOSA1NDYgNzMzVDUxNSA3ODBMNDg2IDgzMUw0MzUgNzc4UTQwOSA3NTEgMzg4IDczNVQzNTMgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBnbHlwaC1uYW1lPSJPdGlsZGUiIGhvcml6LWFkdi14PSI3NjYiIGQ9Ik0zNjYgLTExUTI5OSAtMTEgMjQ2IDEwVDE1NiA2OVQ5OCAxNThUNzggMjY5UTc4IDM1NSAxMDggNDI2VDE4OSA1NTBUMzA0IDYzMFQ0MzYgNjU5UTUwMyA2NTkgNTU2IDYzOFQ2NDYgNTc5VDcwNCA0OTBUNzI0IDM3OVE3MjQgMjkzIDY5NCAyMjJUNjEzIDk4VDQ5OCAxOFQzNjYgLTExWk0zNzMgNDhRNDI0IDQ4IDQ3NCA3MlQ1NjMgMTM5VDYyNyAyNDJUNjUyIDM3NFE2NTIgNDIwIDYzOCA0NjFUNTk1IDUzM1Q1MjUgNTgyVDQyOSA2MDBRMzc4IDYwMCAzMjggNTc2VDIzOSA1MDlUMTc1IDQwNlQxNTAgMjc0UTE1MCAyMjcgMTY0IDE4NlQyMDcgMTE1VDI3NyA2NlQzNzMgNDhaTTUzMCA3MThRNTA2IDcxOCA0NjggNzM5VDM5MSA3OThRMzg1IDc4NSAzNzkgNzcyVDM2NiA3NDlUMzUyIDczMlQzMzcgNzI1UTMyNSA3MjUgMzIwIDczMVQzMTQgNzQ1UTMxNCA3NjIgMzIxIDc3OVQzMzkgODEwVDM2NCA4MzJUMzk0IDg0MVE0MTggODQxIDQ1NiA4MjBUNTMzIDc2MVE1MzkgNzc0IDU0NSA3ODdUNTU4IDgxMFQ1NzIgODI3VDU4NyA4MzRRNTk5IDgzNCA2MDQgODI4VDYxMCA4MTRRNjEwIDc5NyA2MDMgNzgwVDU4NSA3NDlUNTYwIDcyN1Q1MzAgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDY7IiBnbHlwaC1uYW1lPSJPZGllcmVzaXMiIGhvcml6LWFkdi14PSI3NjYiIGQ9Ik0zNjYgLTExUTI5OSAtMTEgMjQ2IDEwVDE1NiA2OVQ5OCAxNThUNzggMjY5UTc4IDM1NSAxMDggNDI2VDE4OSA1NTBUMzA0IDYzMFQ0MzYgNjU5UTUwMyA2NTkgNTU2IDYzOFQ2NDYgNTc5VDcwNCA0OTBUNzI0IDM3OVE3MjQgMjkzIDY5NCAyMjJUNjEzIDk4VDQ5OCAxOFQzNjYgLTExWk0zNzMgNDhRNDI0IDQ4IDQ3NCA3MlQ1NjMgMTM5VDYyNyAyNDJUNjUyIDM3NFE2NTIgNDIwIDYzOCA0NjFUNTk1IDUzM1Q1MjUgNTgyVDQyOSA2MDBRMzc4IDYwMCAzMjggNTc2VDIzOSA1MDlUMTc1IDQwNlQxNTAgMjc0UTE1MCAyMjcgMTY0IDE4NlQyMDcgMTE1VDI3NyA2NlQzNzMgNDhaTTU1MiA3MThRNTAzIDcxOCA1MDMgNzU2UTUwMyA3NzkgNTE1IDc5NlQ1NTQgODE0UTYwMyA4MTQgNjAzIDc3NlE2MDMgNzUzIDU5MSA3MzZUNTUyIDcxOFpNMzg0IDcxOFEzMzUgNzE4IDMzNSA3NTZRMzM1IDc3OSAzNDcgNzk2VDM4NiA4MTRRNDM1IDgxNCA0MzUgNzc2UTQzNSA3NTMgNDIzIDczNlQzODQgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDc7IiBnbHlwaC1uYW1lPSJtdWx0aXBseSIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTQxMyA3OVEzOTggNzkgMzg3IDk0TDI5MSAyMjJMMTQwIDk0UTEyOCA4MyAxMTYgODNRMTA3IDgzIDk3IDk0VDg2IDExNFE4NiAxMjkgMTAwIDE0MEwyNTQgMjcxTDE1OCA0MDBRMTQ4IDQxMyAxNDggNDIyUTE0OCA0MzEgMTU3IDQ0MVQxNzkgNDUxUTE5NCA0NTEgMjA1IDQzNkwzMDAgMzA5TDQ1MCA0MzZRNDYyIDQ0NyA0NzQgNDQ3UTQ4MyA0NDcgNDkzIDQzNlQ1MDQgNDE2UTUwNCA0MDEgNDkwIDM5MEwzMzcgMjYwTDQzNCAxMzBRNDQ0IDExNyA0NDQgMTA4UTQ0NCA5OSA0MzUgODlUNDEzIDc5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDg7IiBnbHlwaC1uYW1lPSJPc2xhc2giIGhvcml6LWFkdi14PSI3NjYiIGQ9Ik00MiAtMzJRNDAgLTMzIDM2IC0zMVQyNyAtMjRUMTggLTEzVDE0IDJRMTQgMTYgMjAgMjhUNDMgNTRMMTE4IDEyMFE3OCAxODggNzggMjY5UTc4IDM1NSAxMDggNDI2VDE4OSA1NTBUMzA0IDYzMFQ0MzYgNjU5UTQ5OSA2NTkgNTUwIDYzOFQ2NDAgNTgxTDc0MyA2NzNRNzQ0IDY3NCA3NDkgNjcyVDc1OCA2NjVUNzY3IDY1M1Q3NzEgNjM5UTc3MSA2MjUgNzY1IDYxM1Q3NDIgNTg3TDY4MCA1MzJRNzAxIDQ5OCA3MTIgNDYwVDcyNCAzNzlRNzI0IDI5MyA2OTQgMjIyVDYxMyA5OFQ0OTggMThUMzY2IC0xMVEzMDAgLTExIDI0OCAxMVQxNTcgNzFMNDIgLTMyWk0zNzMgNDhRNDI0IDQ4IDQ3NCA3MlQ1NjMgMTM5VDYyNyAyNDJUNjUyIDM3NFE2NTIgNDM5IDYyNiA0ODlMMjA2IDExNFEyMzUgODMgMjc2IDY2VDM3MyA0OFpNMTUwIDI3NFExNTAgMjE1IDE3MyAxNjRMNTkxIDUzOFE1NjMgNTY3IDUyMyA1ODNUNDI5IDYwMFEzNzggNjAwIDMyOCA1NzZUMjM5IDUwOVQxNzUgNDA2VDE1MCAyNzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGdseXBoLW5hbWU9IlVncmF2ZSIgaG9yaXotYWR2LXg9IjY3MyIgZD0iTTMyMSAtMTJRMjU2IC0xMiAyMDcgN1QxMjcgNjNUODggMTU1VDk1IDI4NUwxNjYgNjIwUTE3MCA2MzYgMTc3IDY0M1QyMDAgNjUxSDIwOVEyMjQgNjUxIDIzMCA2NDJUMjMzIDYxNkwxNjIgMjgwUTEzOCAxNjQgMTgwIDEwN1QzMjUgNDlRNDgzIDQ5IDUyNSAyNDdMNjA0IDYyMFE2MDggNjM2IDYxNSA2NDNUNjM4IDY1MUg2NDZRNjYxIDY1MSA2NjcgNjQyVDY3MCA2MTZMNTg5IDIzM1E1NjMgMTEyIDQ5NyA1MFQzMjEgLTEyWk00OTQgNzExUTQ5MiA3MDkgNDc2IDcxM1Q0MzggNzI4VDM4OSA3NTNUMzQxIDc4NlEzMjQgODAwIDMxOCA4MTFUMzExIDgzNVEzMTEgODQ4IDMyMSA4NTZUMzQzIDg2NFEzNTQgODY0IDM2NSA4NThUMzg4IDg0M1E0MTAgODI1IDQzMCA4MDNUNDY1IDc2MVQ0ODggNzI3VDQ5NCA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQTsiIGdseXBoLW5hbWU9IlVhY3V0ZSIgaG9yaXotYWR2LXg9IjY3MyIgZD0iTTMyMSAtMTJRMjU2IC0xMiAyMDcgN1QxMjcgNjNUODggMTU1VDk1IDI4NUwxNjYgNjIwUTE3MCA2MzYgMTc3IDY0M1QyMDAgNjUxSDIwOVEyMjQgNjUxIDIzMCA2NDJUMjMzIDYxNkwxNjIgMjgwUTEzOCAxNjQgMTgwIDEwN1QzMjUgNDlRNDgzIDQ5IDUyNSAyNDdMNjA0IDYyMFE2MDggNjM2IDYxNSA2NDNUNjM4IDY1MUg2NDZRNjYxIDY1MSA2NjcgNjQyVDY3MCA2MTZMNTg5IDIzM1E1NjMgMTEyIDQ5NyA1MFQzMjEgLTEyWk0zNTIgNzExUTM1MSA3MTMgMzY0IDcyN1QzOTggNzYwVDQ0NSA4MDFUNDk2IDgzN1E1MjAgODUyIDU0MiA4NTJRNTU1IDg1MiA1NjMgODQ0VDU3MSA4MjRRNTcxIDgwMCA1MzAgNzc2UTUwMiA3NjAgNDcyIDc0N1Q0MTUgNzI1VDM3MSA3MTNUMzUyIDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERCOyIgZ2x5cGgtbmFtZT0iVWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2NzMiIGQ9Ik0zMjEgLTEyUTI1NiAtMTIgMjA3IDdUMTI3IDYzVDg4IDE1NVQ5NSAyODVMMTY2IDYyMFExNzAgNjM2IDE3NyA2NDNUMjAwIDY1MUgyMDlRMjI0IDY1MSAyMzAgNjQyVDIzMyA2MTZMMTYyIDI4MFExMzggMTY0IDE4MCAxMDdUMzI1IDQ5UTQ4MyA0OSA1MjUgMjQ3TDYwNCA2MjBRNjA4IDYzNiA2MTUgNjQzVDYzOCA2NTFINjQ2UTY2MSA2NTEgNjY3IDY0MlQ2NzAgNjE2TDU4OSAyMzNRNTYzIDExMiA0OTcgNTBUMzIxIC0xMlpNMzIzIDcwOVEzMTMgNzA5IDMwOSA3MTRUMzA0IDcyNlEzMDQgNzQzIDMyMSA3NjNUMzcxIDgxMlEzODcgODI2IDQwMyA4MzhUNDMzIDg1OVQ0NTQgODczVDQ2NCA4NzlRNDY1IDg3OSA0NzEgODc0VDQ4NiA4NTlUNTA1IDgzOVQ1MjYgODE1UTU0OCA3ODYgNTU2IDc2OFQ1NjUgNzM4UTU2NSA3MjQgNTU4IDcxN1Q1NDEgNzA5UTUyOCA3MDkgNTE2IDcyM1Q0ODUgNzcwTDQ1NiA4MjFMNDA1IDc2OFEzNzkgNzQxIDM1OCA3MjVUMzIzIDcwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERDOyIgZ2x5cGgtbmFtZT0iVWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjczIiBkPSJNMzIxIC0xMlEyNTYgLTEyIDIwNyA3VDEyNyA2M1Q4OCAxNTVUOTUgMjg1TDE2NiA2MjBRMTcwIDYzNiAxNzcgNjQzVDIwMCA2NTFIMjA5UTIyNCA2NTEgMjMwIDY0MlQyMzMgNjE2TDE2MiAyODBRMTM4IDE2NCAxODAgMTA3VDMyNSA0OVE0ODMgNDkgNTI1IDI0N0w2MDQgNjIwUTYwOCA2MzYgNjE1IDY0M1Q2MzggNjUxSDY0NlE2NjEgNjUxIDY2NyA2NDJUNjcwIDYxNkw1ODkgMjMzUTU2MyAxMTIgNDk3IDUwVDMyMSAtMTJaTTUyNCA3MDhRNDc1IDcwOCA0NzUgNzQ2UTQ3NSA3NjkgNDg3IDc4NlQ1MjYgODA0UTU3NSA4MDQgNTc1IDc2NlE1NzUgNzQzIDU2MyA3MjZUNTI0IDcwOFpNMzU2IDcwOFEzMDcgNzA4IDMwNyA3NDZRMzA3IDc2OSAzMTkgNzg2VDM1OCA4MDRRNDA3IDgwNCA0MDcgNzY2UTQwNyA3NDMgMzk1IDcyNlQzNTYgNzA4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REQ7IiBnbHlwaC1uYW1lPSJZYWN1dGUiIGhvcml6LWFkdi14PSI1ODMiIGQ9Ik0yNjUgMjcyTDExMCA2NDdIMTgxTDMwOCAzMzFMNTgxIDY1M1E1ODEgNjUzIDU5MyA2NTFUNjE0IDYzOVQ2MjIgNjEyVDU5MyA1NjRMMzMxIDI2NUwyNzUgMEgyMDdMMjY1IDI3MlpNMzI1IDcxMVEzMjQgNzEzIDMzNyA3MjdUMzcxIDc2MFQ0MTggODAxVDQ2OSA4MzdRNDkzIDg1MiA1MTUgODUyUTUyOCA4NTIgNTM2IDg0NFQ1NDQgODI0UTU0NCA4MDAgNTAzIDc3NlE0NzUgNzYwIDQ0NSA3NDdUMzg4IDcyNVQzNDQgNzEzVDMyNSA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERTsiIGdseXBoLW5hbWU9IlRob3JuIiBob3Jpei1hZHYteD0iNTkyIiBkPSJNNzQgLTRRNDIgLTQgNTAgMzFMMTc1IDYyMFExNzkgNjM3IDE4NiA2NDRUMjA5IDY1MUgyMThRMjUwIDY1MSAyNDIgNjE2TDIyMiA1MjRIMzQxUTQ0NSA1MjQgNTAwIDQ4MVQ1NTYgMzU3UTU1NiAyNDcgNDkwIDE4OFQyOTggMTI5SDEzOEwxMTcgMjdRMTEzIDEwIDEwNiAzVDgzIC00SDc0Wk0zMTEgMTg5UTM5MyAxODkgNDM5IDIzMFQ0ODYgMzQ4UTQ4NiA0NjMgMzM3IDQ2M0gyMDlMMTUxIDE4OUgzMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERjsiIGdseXBoLW5hbWU9Imdlcm1hbmRibHMiIGhvcml6LWFkdi14PSI1NjAiIGQ9Ik0yOTYgLTEyUTIxOCAtMTIgMTgxIDI1UTE2MiA0NCAxNjIgNjNRMTYyIDc0IDE2NyA4MlQxNzggOTZUMTg5IDEwNFQxOTYgMTA1UTIxMCA4MiAyMzMgNjRUMzAwIDQ1UTMyNyA0NSAzNTEgNTZUMzk0IDg3VDQyMiAxMzRUNDMzIDE5NlE0MzMgMjE1IDQyOCAyMzNUNDA5IDI2N1QzNzIgMjk4VDMxNSAzMjRRMjg5IDMzMyAyODAgMzQzVDI3MCAzNjhRMjcwIDM5MiAyODAgNDA1VDI5NSA0MjJRMzg2IDQyMiA0MzAgNDQ3VDQ3NCA1MzZRNDc0IDU4MCA0NDAgNjA1VDM1MSA2MzBRMjk0IDYzMCAyNTUgNTkxVDE5NiA0NjJMOTkgMEgzNEwxMzQgNDY4UTE1OCA1ODIgMjE1IDYzNVQzNTIgNjg5UTQzOSA2ODkgNDg5IDY0OVQ1MzkgNTQwUTUzOSA0NjcgNDkxIDQyMlQzNDAgMzcxUTM3NCAzNjMgNDAzIDM0OFQ0NTMgMzEyVDQ4NyAyNjNUNDk5IDIwMlE0OTkgMTU2IDQ4MyAxMTdUNDM5IDQ5VDM3NSA0VDI5NiAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMDsiIGdseXBoLW5hbWU9ImFncmF2ZSIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTQ4OSAtOFE0NTAgLTggNDMzIDE2VDQyMyA4NlEzOTAgMzcgMzQyIDEzVDI0MCAtMTJRMjAxIC0xMiAxNjcgMVQxMDYgMzlUNjUgMTAyVDQ5IDE5MFE0OSAyNDUgNjkgMjk4VDEyNSAzOTRUMjEwIDQ2MlQzMTkgNDg4UTM3OSA0ODggNDIzIDQ2MVQ0ODkgMzkzTDUwNyA0NzZINTcxTDQ5MSAxMDFRNDgzIDY2IDQ5MiA1MlQ1MzQgMzdRNTM0IDM3IDUzNCAzMFQ1MzEgMTVUNTE4IC0xVDQ4OSAtOFpNMjQ4IDQ1UTI4NSA0NSAzMTkgNjBUMzgxIDEwMFQ0MjcgMTU4VDQ1NCAyMjhMNDcxIDMwN1E0NTMgMzY0IDQxNiAzOTdUMzE1IDQzMVEyNjggNDMxIDIzMSA0MTBUMTY4IDM1NFQxMjkgMjc3VDExNSAxOTFRMTE1IDE1NiAxMjUgMTI5VDE1NCA4M1QxOTcgNTVUMjQ4IDQ1Wk00MDkgNTUxUTQwNyA1NDkgMzkxIDU1M1QzNTMgNTY4VDMwNCA1OTNUMjU2IDYyNlEyMzkgNjQwIDIzMyA2NTFUMjI2IDY3NVEyMjYgNjg4IDIzNiA2OTZUMjU4IDcwNFEyNjkgNzA0IDI4MCA2OThUMzAzIDY4M1EzMjUgNjY1IDM0NSA2NDNUMzgwIDYwMVQ0MDMgNTY3VDQwOSA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMTsiIGdseXBoLW5hbWU9ImFhY3V0ZSIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTQ4OSAtOFE0NTAgLTggNDMzIDE2VDQyMyA4NlEzOTAgMzcgMzQyIDEzVDI0MCAtMTJRMjAxIC0xMiAxNjcgMVQxMDYgMzlUNjUgMTAyVDQ5IDE5MFE0OSAyNDUgNjkgMjk4VDEyNSAzOTRUMjEwIDQ2MlQzMTkgNDg4UTM3OSA0ODggNDIzIDQ2MVQ0ODkgMzkzTDUwNyA0NzZINTcxTDQ5MSAxMDFRNDgzIDY2IDQ5MiA1MlQ1MzQgMzdRNTM0IDM3IDUzNCAzMFQ1MzEgMTVUNTE4IC0xVDQ4OSAtOFpNMjQ4IDQ1UTI4NSA0NSAzMTkgNjBUMzgxIDEwMFQ0MjcgMTU4VDQ1NCAyMjhMNDcxIDMwN1E0NTMgMzY0IDQxNiAzOTdUMzE1IDQzMVEyNjggNDMxIDIzMSA0MTBUMTY4IDM1NFQxMjkgMjc3VDExNSAxOTFRMTE1IDE1NiAxMjUgMTI5VDE1NCA4M1QxOTcgNTVUMjQ4IDQ1Wk0yOTcgNTUxUTI5NiA1NTMgMzA5IDU2N1QzNDMgNjAwVDM5MCA2NDFUNDQxIDY3N1E0NjUgNjkyIDQ4NyA2OTJRNTAwIDY5MiA1MDggNjg0VDUxNiA2NjRRNTE2IDY0MCA0NzUgNjE2UTQ0NyA2MDAgNDE3IDU4N1QzNjAgNTY1VDMxNiA1NTNUMjk3IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgZ2x5cGgtbmFtZT0iYWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik00ODkgLThRNDUwIC04IDQzMyAxNlQ0MjMgODZRMzkwIDM3IDM0MiAxM1QyNDAgLTEyUTIwMSAtMTIgMTY3IDFUMTA2IDM5VDY1IDEwMlQ0OSAxOTBRNDkgMjQ1IDY5IDI5OFQxMjUgMzk0VDIxMCA0NjJUMzE5IDQ4OFEzNzkgNDg4IDQyMyA0NjFUNDg5IDM5M0w1MDcgNDc2SDU3MUw0OTEgMTAxUTQ4MyA2NiA0OTIgNTJUNTM0IDM3UTUzNCAzNyA1MzQgMzBUNTMxIDE1VDUxOCAtMVQ0ODkgLThaTTI0OCA0NVEyODUgNDUgMzE5IDYwVDM4MSAxMDBUNDI3IDE1OFQ0NTQgMjI4TDQ3MSAzMDdRNDUzIDM2NCA0MTYgMzk3VDMxNSA0MzFRMjY4IDQzMSAyMzEgNDEwVDE2OCAzNTRUMTI5IDI3N1QxMTUgMTkxUTExNSAxNTYgMTI1IDEyOVQxNTQgODNUMTk3IDU1VDI0OCA0NVpNMjUxIDU0OVEyNDEgNTQ5IDIzNyA1NTRUMjMyIDU2NlEyMzIgNTgzIDI0OSA2MDNUMjk5IDY1MlEzMTUgNjY2IDMzMSA2NzhUMzYxIDY5OVQzODIgNzEzVDM5MiA3MTlRMzkzIDcxOSAzOTkgNzE0VDQxNCA2OTlUNDMzIDY3OVQ0NTQgNjU1UTQ3NiA2MjYgNDg0IDYwOFQ0OTMgNTc4UTQ5MyA1NjQgNDg2IDU1N1Q0NjkgNTQ5UTQ1NiA1NDkgNDQ0IDU2M1Q0MTMgNjEwTDM4NCA2NjFMMzMzIDYwOFEzMDcgNTgxIDI4NiA1NjVUMjUxIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUzOyIgZ2x5cGgtbmFtZT0iYXRpbGRlIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNNDg5IC04UTQ1MCAtOCA0MzMgMTZUNDIzIDg2UTM5MCAzNyAzNDIgMTNUMjQwIC0xMlEyMDEgLTEyIDE2NyAxVDEwNiAzOVQ2NSAxMDJUNDkgMTkwUTQ5IDI0NSA2OSAyOThUMTI1IDM5NFQyMTAgNDYyVDMxOSA0ODhRMzc5IDQ4OCA0MjMgNDYxVDQ4OSAzOTNMNTA3IDQ3Nkg1NzFMNDkxIDEwMVE0ODMgNjYgNDkyIDUyVDUzNCAzN1E1MzQgMzcgNTM0IDMwVDUzMSAxNVQ1MTggLTFUNDg5IC04Wk0yNDggNDVRMjg1IDQ1IDMxOSA2MFQzODEgMTAwVDQyNyAxNThUNDU0IDIyOEw0NzEgMzA3UTQ1MyAzNjQgNDE2IDM5N1QzMTUgNDMxUTI2OCA0MzEgMjMxIDQxMFQxNjggMzU0VDEyOSAyNzdUMTE1IDE5MVExMTUgMTU2IDEyNSAxMjlUMTU0IDgzVDE5NyA1NVQyNDggNDVaTTQzOCA1NDhRNDE0IDU0OCAzNzYgNTY5VDI5OSA2MjhRMjkzIDYxNSAyODcgNjAyVDI3NCA1NzlUMjYwIDU2MlQyNDUgNTU1UTIzMyA1NTUgMjI4IDU2MVQyMjIgNTc1UTIyMiA1OTIgMjI5IDYwOVQyNDcgNjQwVDI3MiA2NjJUMzAyIDY3MVEzMjYgNjcxIDM2NCA2NTBUNDQxIDU5MVE0NDcgNjA0IDQ1MyA2MTdUNDY2IDY0MFQ0ODAgNjU3VDQ5NSA2NjRRNTA3IDY2NCA1MTIgNjU4VDUxOCA2NDRRNTE4IDYyNyA1MTEgNjEwVDQ5MyA1NzlUNDY4IDU1N1Q0MzggNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTQ7IiBnbHlwaC1uYW1lPSJhZGllcmVzaXMiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik00ODkgLThRNDUwIC04IDQzMyAxNlQ0MjMgODZRMzkwIDM3IDM0MiAxM1QyNDAgLTEyUTIwMSAtMTIgMTY3IDFUMTA2IDM5VDY1IDEwMlQ0OSAxOTBRNDkgMjQ1IDY5IDI5OFQxMjUgMzk0VDIxMCA0NjJUMzE5IDQ4OFEzNzkgNDg4IDQyMyA0NjFUNDg5IDM5M0w1MDcgNDc2SDU3MUw0OTEgMTAxUTQ4MyA2NiA0OTIgNTJUNTM0IDM3UTUzNCAzNyA1MzQgMzBUNTMxIDE1VDUxOCAtMVQ0ODkgLThaTTI0OCA0NVEyODUgNDUgMzE5IDYwVDM4MSAxMDBUNDI3IDE1OFQ0NTQgMjI4TDQ3MSAzMDdRNDUzIDM2NCA0MTYgMzk3VDMxNSA0MzFRMjY4IDQzMSAyMzEgNDEwVDE2OCAzNTRUMTI5IDI3N1QxMTUgMTkxUTExNSAxNTYgMTI1IDEyOVQxNTQgODNUMTk3IDU1VDI0OCA0NVpNNDUwIDU0OFE0MDEgNTQ4IDQwMSA1ODZRNDAxIDYwOSA0MTMgNjI2VDQ1MiA2NDRRNTAxIDY0NCA1MDEgNjA2UTUwMSA1ODMgNDg5IDU2NlQ0NTAgNTQ4Wk0yODIgNTQ4UTIzMyA1NDggMjMzIDU4NlEyMzMgNjA5IDI0NSA2MjZUMjg0IDY0NFEzMzMgNjQ0IDMzMyA2MDZRMzMzIDU4MyAzMjEgNTY2VDI4MiA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNTsiIGdseXBoLW5hbWU9ImFyaW5nIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNNDg5IC04UTQ1MCAtOCA0MzMgMTZUNDIzIDg2UTM5MCAzNyAzNDIgMTNUMjQwIC0xMlEyMDEgLTEyIDE2NyAxVDEwNiAzOVQ2NSAxMDJUNDkgMTkwUTQ5IDI0NSA2OSAyOThUMTI1IDM5NFQyMTAgNDYyVDMxOSA0ODhRMzc5IDQ4OCA0MjMgNDYxVDQ4OSAzOTNMNTA3IDQ3Nkg1NzFMNDkxIDEwMVE0ODMgNjYgNDkyIDUyVDUzNCAzN1E1MzQgMzcgNTM0IDMwVDUzMSAxNVQ1MTggLTFUNDg5IC04Wk0yNDggNDVRMjg1IDQ1IDMxOSA2MFQzODEgMTAwVDQyNyAxNThUNDU0IDIyOEw0NzEgMzA3UTQ1MyAzNjQgNDE2IDM5N1QzMTUgNDMxUTI2OCA0MzEgMjMxIDQxMFQxNjggMzU0VDEyOSAyNzdUMTE1IDE5MVExMTUgMTU2IDEyNSAxMjlUMTU0IDgzVDE5NyA1NVQyNDggNDVaTTM3MiA1NTBRMzIzIDU1MCAyOTMgNTc4VDI2MyA2NTFRMjYzIDY3NyAyNzIgNzAxVDI5OSA3NDRUMzQwIDc3NFQzOTMgNzg1UTQ0MiA3ODUgNDcyIDc1N1Q1MDIgNjg0UTUwMiA2NTggNDkzIDYzNFQ0NjYgNTkxVDQyNCA1NjFUMzcyIDU1MFpNMzc0IDU5NVEzOTIgNTk1IDQwNiA2MDJUNDMwIDYyMlQ0NDUgNjQ5VDQ1MSA2ODBRNDUxIDcwNSA0MzQgNzIyVDM5MSA3NDBRMzczIDc0MCAzNTkgNzMzVDMzNSA3MTNUMzIwIDY4NlQzMTQgNjU1UTMxNCA2MzAgMzMxIDYxM1QzNzQgNTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTY7IiBnbHlwaC1uYW1lPSJhZSIgaG9yaXotYWR2LXg9Ijg4MiIgZD0iTTE5NiAtMTJRMTE5IC0xMiA3NSAyMFQzMCAxMDdRMzAgMTUyIDQ5IDE4NFQxMTAgMjM4VDIyMyAyNzFUMzk1IDI4NEg0MDVMNDA2IDI4OFE0MjAgMzU0IDM4NyAzOTFUMjc4IDQyOVEyMjAgNDI5IDE4NCA0MTBUMTIzIDM1NVExMjMgMzU1IDExOSAzNTZUMTA5IDM2MlQ5OSAzNzRUOTUgMzkwUTk1IDQwMiAxMDYgNDE5VDE0MCA0NTFUMTk5IDQ3N1QyODUgNDg4UTM1OCA0ODggNDA1IDQ1OFQ0NjQgMzY5UTUwMiA0MjYgNTU4IDQ1N1Q2ODggNDg4UTc2OSA0ODggODEzIDQ1NFQ4NTggMzYyUTg1OCAzMjYgODQ1IDI5OFQ4MDAgMjUxVDcxNSAyMjFUNTgxIDIxMFE1MjggMjEwIDQ1NSAyMTZRNDU0IDIwOCA0NTQgMjAxVDQ1NCAxODZRNDU0IDEyMyA0OTAgODRUNTk3IDQ0UTY1MyA0NCA2OTEgNjRUNzU4IDEyM1E3NTkgMTI0IDc2NCAxMjNUNzc2IDExOFQ3ODcgMTA4VDc5MiA5MlE3OTIgODEgNzg4IDcyVDc3MCA1MFE3MzggMTggNjk2IDNUNTk1IC0xMlE1MTcgLTEyIDQ3MSAyMFQ0MDggMTA0UTM3OCA1MCAzMjUgMTlUMTk2IC0xMlpNMjA1IDQzUTIzOCA0MyAyNjcgNTNUMzE5IDgyVDM1OSAxMjZUMzgzIDE4MEwzOTUgMjMzTDM2NiAyMzJRMjg1IDIyOSAyMzMgMjIxVDE1MCAxOTlUMTA4IDE2M1Q5NiAxMTJROTYgODIgMTI2IDYzVDIwNSA0M1pNNjg1IDQzMVE2NDcgNDMxIDYxNCA0MTlUNTUyIDM4NlQ1MDMgMzM1VDQ2OSAyNzFRNDk5IDI2NyA1MjUgMjY2VDU3NSAyNjVRNjM5IDI2NSA2ODEgMjczVDc0OCAyOTRUNzgyIDMyNVQ3OTIgMzYxUTc5MiAzODcgNzY2IDQwOVQ2ODUgNDMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTc7IiBnbHlwaC1uYW1lPSJjY2VkaWxsYSIgaG9yaXotYWR2LXg9IjU1MiIgZD0iTTI3NCAtMTJRMjI3IC0xMiAxODYgM1QxMTQgNDZUNjYgMTE2VDQ4IDIwOVE0OCAyNjMgNjkgMzEzVDEyNiA0MDJUMjExIDQ2NFQzMTggNDg3UTM3OCA0ODcgNDE4IDQ3MFQ0ODMgNDI3UTUwNCA0MDYgNTEzIDM4NFQ1MjMgMzQ1UTUyMyAzMjkgNTE2IDMyMVQ0OTkgMzA5VDQ4MyAzMDVUNDc1IDMwOFE0NjUgMzYxIDQyNiAzOTVUMzIwIDQyOVEyNzQgNDI5IDIzNyA0MTFUMTcyIDM2MlQxMzAgMjkyVDExNSAyMTNRMTE1IDE3NiAxMjYgMTQ2VDE2MCA5M1QyMTIgNTlUMjgwIDQ3UTMzNiA0NyAzNzMgNzJUNDM1IDEzN1E0MzYgMTM4IDQ0MSAxMzdUNDU0IDEzM1Q0NjYgMTIzVDQ3MiAxMDZRNDcyIDgzIDQ0MSA1MlE0MTYgMjcgMzczIDhUMjc0IC0xMlpNMTc2IC0yMzRRMTczIC0yMzcgMTY3IC0yMzZUMTU2IC0yMzBUMTQ4IC0yMjJUMTQ2IC0yMTRMMjUzIC00N1EyNTQgLTQ2IDI2MyAtNDdUMjgyIC01MlQzMDIgLTYzVDMxMSAtODNRMzExIC0xMDUgMjg5IC0xMjhMMTc2IC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFODsiIGdseXBoLW5hbWU9ImVncmF2ZSIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1MiAtMTJRMjAxIC0xMiAxNjMgMlQ5OCA0M1Q1OSAxMDRUNDUgMTgyUTQ1IDI0NiA2OCAzMDJUMTMxIDM5OVQyMjYgNDY0VDM0NSA0ODhRNDI2IDQ4OCA0NzAgNDU0VDUxNSAzNjJRNTE1IDMyNiA1MDIgMjk4VDQ1NyAyNTFUMzcyIDIyMVQyMzggMjEwUTE4NSAyMTAgMTEyIDIxNlExMTEgMjA4IDExMSAyMDFUMTExIDE4NlExMTEgMTIzIDE0NyA4NFQyNTQgNDRRMzEwIDQ0IDM0OCA2NFQ0MTUgMTIzUTQxNiAxMjQgNDIxIDEyM1Q0MzMgMTE4VDQ0NCAxMDhUNDQ5IDkyUTQ0OSA4MSA0NDUgNzJUNDI3IDUwUTM5NSAxOCAzNTMgM1QyNTIgLTEyWk0zNDIgNDMxUTMwNCA0MzEgMjcxIDQxOVQyMDkgMzg2VDE2MCAzMzVUMTI2IDI3MVExNTYgMjY3IDE4MiAyNjZUMjMyIDI2NVEyOTYgMjY1IDMzOCAyNzNUNDA1IDI5NFQ0MzkgMzI1VDQ0OSAzNjFRNDQ5IDM4NyA0MjMgNDA5VDM0MiA0MzFaTTQwMCA1NTFRMzk4IDU0OSAzODIgNTUzVDM0NCA1NjhUMjk1IDU5M1QyNDcgNjI2UTIzMCA2NDAgMjI0IDY1MVQyMTcgNjc1UTIxNyA2ODggMjI3IDY5NlQyNDkgNzA0UTI2MCA3MDQgMjcxIDY5OFQyOTQgNjgzUTMxNiA2NjUgMzM2IDY0M1QzNzEgNjAxVDM5NCA1NjdUNDAwIDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU5OyIgZ2x5cGgtbmFtZT0iZWFjdXRlIiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjUyIC0xMlEyMDEgLTEyIDE2MyAyVDk4IDQzVDU5IDEwNFQ0NSAxODJRNDUgMjQ2IDY4IDMwMlQxMzEgMzk5VDIyNiA0NjRUMzQ1IDQ4OFE0MjYgNDg4IDQ3MCA0NTRUNTE1IDM2MlE1MTUgMzI2IDUwMiAyOThUNDU3IDI1MVQzNzIgMjIxVDIzOCAyMTBRMTg1IDIxMCAxMTIgMjE2UTExMSAyMDggMTExIDIwMVQxMTEgMTg2UTExMSAxMjMgMTQ3IDg0VDI1NCA0NFEzMTAgNDQgMzQ4IDY0VDQxNSAxMjNRNDE2IDEyNCA0MjEgMTIzVDQzMyAxMThUNDQ0IDEwOFQ0NDkgOTJRNDQ5IDgxIDQ0NSA3MlQ0MjcgNTBRMzk1IDE4IDM1MyAzVDI1MiAtMTJaTTM0MiA0MzFRMzA0IDQzMSAyNzEgNDE5VDIwOSAzODZUMTYwIDMzNVQxMjYgMjcxUTE1NiAyNjcgMTgyIDI2NlQyMzIgMjY1UTI5NiAyNjUgMzM4IDI3M1Q0MDUgMjk0VDQzOSAzMjVUNDQ5IDM2MVE0NDkgMzg3IDQyMyA0MDlUMzQyIDQzMVpNMjg4IDU1MVEyODcgNTUzIDMwMCA1NjdUMzM0IDYwMFQzODEgNjQxVDQzMiA2NzdRNDU2IDY5MiA0NzggNjkyUTQ5MSA2OTIgNDk5IDY4NFQ1MDcgNjY0UTUwNyA2NDAgNDY2IDYxNlE0MzggNjAwIDQwOCA1ODdUMzUxIDU2NVQzMDcgNTUzVDI4OCA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQTsiIGdseXBoLW5hbWU9ImVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjUyIC0xMlEyMDEgLTEyIDE2MyAyVDk4IDQzVDU5IDEwNFQ0NSAxODJRNDUgMjQ2IDY4IDMwMlQxMzEgMzk5VDIyNiA0NjRUMzQ1IDQ4OFE0MjYgNDg4IDQ3MCA0NTRUNTE1IDM2MlE1MTUgMzI2IDUwMiAyOThUNDU3IDI1MVQzNzIgMjIxVDIzOCAyMTBRMTg1IDIxMCAxMTIgMjE2UTExMSAyMDggMTExIDIwMVQxMTEgMTg2UTExMSAxMjMgMTQ3IDg0VDI1NCA0NFEzMTAgNDQgMzQ4IDY0VDQxNSAxMjNRNDE2IDEyNCA0MjEgMTIzVDQzMyAxMThUNDQ0IDEwOFQ0NDkgOTJRNDQ5IDgxIDQ0NSA3MlQ0MjcgNTBRMzk1IDE4IDM1MyAzVDI1MiAtMTJaTTM0MiA0MzFRMzA0IDQzMSAyNzEgNDE5VDIwOSAzODZUMTYwIDMzNVQxMjYgMjcxUTE1NiAyNjcgMTgyIDI2NlQyMzIgMjY1UTI5NiAyNjUgMzM4IDI3M1Q0MDUgMjk0VDQzOSAzMjVUNDQ5IDM2MVE0NDkgMzg3IDQyMyA0MDlUMzQyIDQzMVpNMjUyIDU0OVEyNDIgNTQ5IDIzOCA1NTRUMjMzIDU2NlEyMzMgNTgzIDI1MCA2MDNUMzAwIDY1MlEzMTYgNjY2IDMzMiA2NzhUMzYyIDY5OVQzODMgNzEzVDM5MyA3MTlRMzk0IDcxOSA0MDAgNzE0VDQxNSA2OTlUNDM0IDY3OVQ0NTUgNjU1UTQ3NyA2MjYgNDg1IDYwOFQ0OTQgNTc4UTQ5NCA1NjQgNDg3IDU1N1Q0NzAgNTQ5UTQ1NyA1NDkgNDQ1IDU2M1Q0MTQgNjEwTDM4NSA2NjFMMzM0IDYwOFEzMDggNTgxIDI4NyA1NjVUMjUyIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVCOyIgZ2x5cGgtbmFtZT0iZWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjUyIC0xMlEyMDEgLTEyIDE2MyAyVDk4IDQzVDU5IDEwNFQ0NSAxODJRNDUgMjQ2IDY4IDMwMlQxMzEgMzk5VDIyNiA0NjRUMzQ1IDQ4OFE0MjYgNDg4IDQ3MCA0NTRUNTE1IDM2MlE1MTUgMzI2IDUwMiAyOThUNDU3IDI1MVQzNzIgMjIxVDIzOCAyMTBRMTg1IDIxMCAxMTIgMjE2UTExMSAyMDggMTExIDIwMVQxMTEgMTg2UTExMSAxMjMgMTQ3IDg0VDI1NCA0NFEzMTAgNDQgMzQ4IDY0VDQxNSAxMjNRNDE2IDEyNCA0MjEgMTIzVDQzMyAxMThUNDQ0IDEwOFQ0NDkgOTJRNDQ5IDgxIDQ0NSA3MlQ0MjcgNTBRMzk1IDE4IDM1MyAzVDI1MiAtMTJaTTM0MiA0MzFRMzA0IDQzMSAyNzEgNDE5VDIwOSAzODZUMTYwIDMzNVQxMjYgMjcxUTE1NiAyNjcgMTgyIDI2NlQyMzIgMjY1UTI5NiAyNjUgMzM4IDI3M1Q0MDUgMjk0VDQzOSAzMjVUNDQ5IDM2MVE0NDkgMzg3IDQyMyA0MDlUMzQyIDQzMVpNNDUxIDU0OFE0MDIgNTQ4IDQwMiA1ODZRNDAyIDYwOSA0MTQgNjI2VDQ1MyA2NDRRNTAyIDY0NCA1MDIgNjA2UTUwMiA1ODMgNDkwIDU2NlQ0NTEgNTQ4Wk0yODMgNTQ4UTIzNCA1NDggMjM0IDU4NlEyMzQgNjA5IDI0NiA2MjZUMjg1IDY0NFEzMzQgNjQ0IDMzNCA2MDZRMzM0IDU4MyAzMjIgNTY2VDI4MyA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQzsiIGdseXBoLW5hbWU9ImlncmF2ZSIgaG9yaXotYWR2LXg9IjI0MyIgZD0iTTEyNiAtOFE4MSAtOCA2NSAxOVQ2MCAxMDBMMTQwIDQ3NkgyMDVMMTI1IDEwMVExMTcgNjYgMTI2IDUyVDE3MyAzN1ExNzMgMzcgMTczIDMwVDE2OSAxNVQxNTUgLTFUMTI2IC04Wk0yMzkgNTUxUTIzNyA1NDkgMjIxIDU1M1QxODMgNTY4VDEzNCA1OTNUODYgNjI2UTY5IDY0MCA2MyA2NTFUNTYgNjc1UTU2IDY4OCA2NiA2OTZUODggNzA0UTk5IDcwNCAxMTAgNjk4VDEzMyA2ODNRMTU1IDY2NSAxNzUgNjQzVDIxMCA2MDFUMjMzIDU2N1QyMzkgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUQ7IiBnbHlwaC1uYW1lPSJpYWN1dGUiIGhvcml6LWFkdi14PSIyNDMiIGQ9Ik0xMjYgLThRODEgLTggNjUgMTlUNjAgMTAwTDE0MCA0NzZIMjA1TDEyNSAxMDFRMTE3IDY2IDEyNiA1MlQxNzMgMzdRMTczIDM3IDE3MyAzMFQxNjkgMTVUMTU1IC0xVDEyNiAtOFpNMTE3IDU1MVExMTYgNTUzIDEyOSA1NjdUMTYzIDYwMFQyMTAgNjQxVDI2MSA2NzdRMjg1IDY5MiAzMDcgNjkyUTMyMCA2OTIgMzI4IDY4NFQzMzYgNjY0UTMzNiA2NDAgMjk1IDYxNlEyNjcgNjAwIDIzNyA1ODdUMTgwIDU2NVQxMzYgNTUzVDExNyA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRTsiIGdseXBoLW5hbWU9ImljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjQzIiBkPSJNMTI2IC04UTgxIC04IDY1IDE5VDYwIDEwMEwxNDAgNDc2SDIwNUwxMjUgMTAxUTExNyA2NiAxMjYgNTJUMTczIDM3UTE3MyAzNyAxNzMgMzBUMTY5IDE1VDE1NSAtMVQxMjYgLThaTTgxIDU0OVE3MSA1NDkgNjcgNTU0VDYyIDU2NlE2MiA1ODMgNzkgNjAzVDEyOSA2NTJRMTQ1IDY2NiAxNjEgNjc4VDE5MSA2OTlUMjEyIDcxM1QyMjIgNzE5UTIyMyA3MTkgMjI5IDcxNFQyNDQgNjk5VDI2MyA2NzlUMjg0IDY1NVEzMDYgNjI2IDMxNCA2MDhUMzIzIDU3OFEzMjMgNTY0IDMxNiA1NTdUMjk5IDU0OVEyODYgNTQ5IDI3NCA1NjNUMjQzIDYxMEwyMTQgNjYxTDE2MyA2MDhRMTM3IDU4MSAxMTYgNTY1VDgxIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVGOyIgZ2x5cGgtbmFtZT0iaWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMjQzIiBkPSJNMTI2IC04UTgxIC04IDY1IDE5VDYwIDEwMEwxNDAgNDc2SDIwNUwxMjUgMTAxUTExNyA2NiAxMjYgNTJUMTczIDM3UTE3MyAzNyAxNzMgMzBUMTY5IDE1VDE1NSAtMVQxMjYgLThaTTI4MCA1NDhRMjMxIDU0OCAyMzEgNTg2UTIzMSA2MDkgMjQzIDYyNlQyODIgNjQ0UTMzMSA2NDQgMzMxIDYwNlEzMzEgNTgzIDMxOSA1NjZUMjgwIDU0OFpNMTEyIDU0OFE2MyA1NDggNjMgNTg2UTYzIDYwOSA3NSA2MjZUMTE0IDY0NFExNjMgNjQ0IDE2MyA2MDZRMTYzIDU4MyAxNTEgNTY2VDExMiA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMDsiIGdseXBoLW5hbWU9Im51bGwiIGhvcml6LWFkdi14PSI1NzgiIGQ9Ik0yMzEgNDc0UTIyOSA0NzIgMjIxIDQ4MFQyMTIgNTA1UTIxMiA1MTUgMjE3IDUyNVQyNDYgNTQ3TDMzNCA1OTVRMjY5IDYzMCAxOTQgNjM1UTE5MiA2MzUgMTkyIDY0M1QxOTYgNjYyVDIxMSA2ODBUMjQyIDY4OVEyNzMgNjg5IDMxNCA2NzRUMzk4IDYyOEw1MTMgNjk0UTUxNSA2OTYgNTIzIDY4OFQ1MzIgNjYzUTUzMiA2NTMgNTI3IDY0M1Q0OTggNjIxTDQ0MSA1OTBRNDY4IDU2MyA0OTAgNTI5VDUyNSA0NTJUNTQxIDM2MFQ1MzIgMjUzUTUyMiAyMDUgNTAxIDE1NVQ0MzAgNTVRNDAxIDI2IDM1OCA3VDI2MSAtMTJRMjEzIC0xMiAxNzMgMFQxMDQgMzdUNTggOTdUNDIgMTc5UTQyIDIyOSA1OSAyNzRUMTEwIDM1MlQxODkgNDA2VDI5NCA0MjZRMzI4IDQyNiAzNTcgNDE4VDQxMCAzOTZUNDUxIDM2NVQ0NzggMzMwUTQ4MSA0MDcgNDU1IDQ2NVQzODMgNTYyTDIzMSA0NzRaTTI1OSA0NFEzMzYgNDQgMzkwIDk4UTQxOSAxMjcgNDM3IDE3MVQ0NjUgMjYzUTQ1OSAyODEgNDQ0IDMwMFQ0MDYgMzM0VDM1NSAzNTlUMjkzIDM2OVEyNDQgMzY5IDIwOSAzNTRUMTUxIDMxM1QxMTggMjUzVDEwNyAxNzhRMTA3IDE0NiAxMTggMTIxVDE1MCA3OVQxOTggNTNUMjU5IDQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjE7IiBnbHlwaC1uYW1lPSJudGlsZGUiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik00NTMgLThRNDIzIC04IDQwNiAxMVQzODkgNjNRMzg5IDg0IDM5NiAxMThUNDE1IDE5MFE0MjYgMjI4IDQzMyAyNjFUNDQwIDMxNVE0NDAgMzY3IDQxMiAzOTdUMzMxIDQyN1EyNzYgNDI3IDIzNyAzOTlUMTY0IDMxMkw5OCAwSDMzTDEzNSA0NzdRMTM1IDQ4MCAxNDkgNDgwUTE1OCA0ODAgMTY2IDQ3N1QxODAgNDY3VDE4NyA0NDZUMTg1IDQxMUwxODIgMzk4UTIwOSA0NDEgMjUwIDQ2NFQzNDAgNDg4UTM3OSA0ODggNDEwIDQ3NlQ0NjIgNDQyVDQ5NSAzOTFUNTA3IDMyN1E1MDcgMzAxIDQ5OCAyNjJUNDc4IDE4MVE0NjcgMTQ0IDQ2MSAxMTZUNDU0IDczUTQ1NCA1MyA0NjQgNDZUNDk2IDM2UTQ5NyAzNiA0OTcgMjlUNDkzIDE0VDQ4MCAtMVQ0NTMgLThaTTQzMiA1NDhRNDA4IDU0OCAzNzAgNTY5VDI5MyA2MjhRMjg3IDYxNSAyODEgNjAyVDI2OCA1NzlUMjU0IDU2MlQyMzkgNTU1UTIyNyA1NTUgMjIyIDU2MVQyMTYgNTc1UTIxNiA1OTIgMjIzIDYwOVQyNDEgNjQwVDI2NiA2NjJUMjk2IDY3MVEzMjAgNjcxIDM1OCA2NTBUNDM1IDU5MVE0NDEgNjA0IDQ0NyA2MTdUNDYwIDY0MFQ0NzQgNjU3VDQ4OSA2NjRRNTAxIDY2NCA1MDYgNjU4VDUxMiA2NDRRNTEyIDYyNyA1MDUgNjEwVDQ4NyA1NzlUNDYyIDU1N1Q0MzIgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjI7IiBnbHlwaC1uYW1lPSJvZ3JhdmUiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0yNjggLTEyUTIyMyAtMTIgMTgzIDRUMTEzIDQ5VDY2IDExOVQ0OSAyMDlRNDkgMjY0IDY5IDMxNVQxMjUgNDA0VDIxMCA0NjVUMzE3IDQ4OFEzNjIgNDg4IDQwMiA0NzJUNDcyIDQyN1Q1MTkgMzU3VDUzNiAyNjdRNTM2IDIxMSA1MTYgMTYxVDQ2MCA3MlQzNzUgMTFUMjY4IC0xMlpNMjcyIDQ1UTMxNCA0NSAzNTAgNjNUNDEyIDExMVQ0NTQgMTgxVDQ3MCAyNjVRNDcwIDMwMSA0NTggMzMxVDQyNSAzODRUMzc1IDQxOFQzMTMgNDMxUTI3MSA0MzEgMjM1IDQxM1QxNzMgMzY1VDEzMSAyOTVUMTE1IDIxMVExMTUgMTc1IDEyNyAxNDVUMTYwIDkyVDIxMCA1OFQyNzIgNDVaTTM5MiA1NTFRMzkwIDU0OSAzNzQgNTUzVDMzNiA1NjhUMjg3IDU5M1QyMzkgNjI2UTIyMiA2NDAgMjE2IDY1MVQyMDkgNjc1UTIwOSA2ODggMjE5IDY5NlQyNDEgNzA0UTI1MiA3MDQgMjYzIDY5OFQyODYgNjgzUTMwOCA2NjUgMzI4IDY0M1QzNjMgNjAxVDM4NiA1NjdUMzkyIDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYzOyIgZ2x5cGgtbmFtZT0ib2FjdXRlIiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMjY4IC0xMlEyMjMgLTEyIDE4MyA0VDExMyA0OVQ2NiAxMTlUNDkgMjA5UTQ5IDI2NCA2OSAzMTVUMTI1IDQwNFQyMTAgNDY1VDMxNyA0ODhRMzYyIDQ4OCA0MDIgNDcyVDQ3MiA0MjdUNTE5IDM1N1Q1MzYgMjY3UTUzNiAyMTEgNTE2IDE2MVQ0NjAgNzJUMzc1IDExVDI2OCAtMTJaTTI3MiA0NVEzMTQgNDUgMzUwIDYzVDQxMiAxMTFUNDU0IDE4MVQ0NzAgMjY1UTQ3MCAzMDEgNDU4IDMzMVQ0MjUgMzg0VDM3NSA0MThUMzEzIDQzMVEyNzEgNDMxIDIzNSA0MTNUMTczIDM2NVQxMzEgMjk1VDExNSAyMTFRMTE1IDE3NSAxMjcgMTQ1VDE2MCA5MlQyMTAgNThUMjcyIDQ1Wk0yNzggNTUxUTI3NyA1NTMgMjkwIDU2N1QzMjQgNjAwVDM3MSA2NDFUNDIyIDY3N1E0NDYgNjkyIDQ2OCA2OTJRNDgxIDY5MiA0ODkgNjg0VDQ5NyA2NjRRNDk3IDY0MCA0NTYgNjE2UTQyOCA2MDAgMzk4IDU4N1QzNDEgNTY1VDI5NyA1NTNUMjc4IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY0OyIgZ2x5cGgtbmFtZT0ib2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0yNjggLTEyUTIyMyAtMTIgMTgzIDRUMTEzIDQ5VDY2IDExOVQ0OSAyMDlRNDkgMjY0IDY5IDMxNVQxMjUgNDA0VDIxMCA0NjVUMzE3IDQ4OFEzNjIgNDg4IDQwMiA0NzJUNDcyIDQyN1Q1MTkgMzU3VDUzNiAyNjdRNTM2IDIxMSA1MTYgMTYxVDQ2MCA3MlQzNzUgMTFUMjY4IC0xMlpNMjcyIDQ1UTMxNCA0NSAzNTAgNjNUNDEyIDExMVQ0NTQgMTgxVDQ3MCAyNjVRNDcwIDMwMSA0NTggMzMxVDQyNSAzODRUMzc1IDQxOFQzMTMgNDMxUTI3MSA0MzEgMjM1IDQxM1QxNzMgMzY1VDEzMSAyOTVUMTE1IDIxMVExMTUgMTc1IDEyNyAxNDVUMTYwIDkyVDIxMCA1OFQyNzIgNDVaTTIzMiA1NDlRMjIyIDU0OSAyMTggNTU0VDIxMyA1NjZRMjEzIDU4MyAyMzAgNjAzVDI4MCA2NTJRMjk2IDY2NiAzMTIgNjc4VDM0MiA2OTlUMzYzIDcxM1QzNzMgNzE5UTM3NCA3MTkgMzgwIDcxNFQzOTUgNjk5VDQxNCA2NzlUNDM1IDY1NVE0NTcgNjI2IDQ2NSA2MDhUNDc0IDU3OFE0NzQgNTY0IDQ2NyA1NTdUNDUwIDU0OVE0MzcgNTQ5IDQyNSA1NjNUMzk0IDYxMEwzNjUgNjYxTDMxNCA2MDhRMjg4IDU4MSAyNjcgNTY1VDIzMiA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNTsiIGdseXBoLW5hbWU9Im90aWxkZSIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTI2OCAtMTJRMjIzIC0xMiAxODMgNFQxMTMgNDlUNjYgMTE5VDQ5IDIwOVE0OSAyNjQgNjkgMzE1VDEyNSA0MDRUMjEwIDQ2NVQzMTcgNDg4UTM2MiA0ODggNDAyIDQ3MlQ0NzIgNDI3VDUxOSAzNTdUNTM2IDI2N1E1MzYgMjExIDUxNiAxNjFUNDYwIDcyVDM3NSAxMVQyNjggLTEyWk0yNzIgNDVRMzE0IDQ1IDM1MCA2M1Q0MTIgMTExVDQ1NCAxODFUNDcwIDI2NVE0NzAgMzAxIDQ1OCAzMzFUNDI1IDM4NFQzNzUgNDE4VDMxMyA0MzFRMjcxIDQzMSAyMzUgNDEzVDE3MyAzNjVUMTMxIDI5NVQxMTUgMjExUTExNSAxNzUgMTI3IDE0NVQxNjAgOTJUMjEwIDU4VDI3MiA0NVpNNDE5IDU0OFEzOTUgNTQ4IDM1NyA1NjlUMjgwIDYyOFEyNzQgNjE1IDI2OCA2MDJUMjU1IDU3OVQyNDEgNTYyVDIyNiA1NTVRMjE0IDU1NSAyMDkgNTYxVDIwMyA1NzVRMjAzIDU5MiAyMTAgNjA5VDIyOCA2NDBUMjUzIDY2MlQyODMgNjcxUTMwNyA2NzEgMzQ1IDY1MFQ0MjIgNTkxUTQyOCA2MDQgNDM0IDYxN1Q0NDcgNjQwVDQ2MSA2NTdUNDc2IDY2NFE0ODggNjY0IDQ5MyA2NThUNDk5IDY0NFE0OTkgNjI3IDQ5MiA2MTBUNDc0IDU3OVQ0NDkgNTU3VDQxOSA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNjsiIGdseXBoLW5hbWU9Im9kaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTI2OCAtMTJRMjIzIC0xMiAxODMgNFQxMTMgNDlUNjYgMTE5VDQ5IDIwOVE0OSAyNjQgNjkgMzE1VDEyNSA0MDRUMjEwIDQ2NVQzMTcgNDg4UTM2MiA0ODggNDAyIDQ3MlQ0NzIgNDI3VDUxOSAzNTdUNTM2IDI2N1E1MzYgMjExIDUxNiAxNjFUNDYwIDcyVDM3NSAxMVQyNjggLTEyWk0yNzIgNDVRMzE0IDQ1IDM1MCA2M1Q0MTIgMTExVDQ1NCAxODFUNDcwIDI2NVE0NzAgMzAxIDQ1OCAzMzFUNDI1IDM4NFQzNzUgNDE4VDMxMyA0MzFRMjcxIDQzMSAyMzUgNDEzVDE3MyAzNjVUMTMxIDI5NVQxMTUgMjExUTExNSAxNzUgMTI3IDE0NVQxNjAgOTJUMjEwIDU4VDI3MiA0NVpNNDMxIDU0OFEzODIgNTQ4IDM4MiA1ODZRMzgyIDYwOSAzOTQgNjI2VDQzMyA2NDRRNDgyIDY0NCA0ODIgNjA2UTQ4MiA1ODMgNDcwIDU2NlQ0MzEgNTQ4Wk0yNjMgNTQ4UTIxNCA1NDggMjE0IDU4NlEyMTQgNjA5IDIyNiA2MjZUMjY1IDY0NFEzMTQgNjQ0IDMxNCA2MDZRMzE0IDU4MyAzMDIgNTY2VDI2MyA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNzsiIGdseXBoLW5hbWU9ImRpdmlkZSIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTM1NCAzNzlRMzMxIDM3OSAzMTkgMzg4VDMwNiA0MTNRMzA2IDQ0OSAzMjIgNDY1UTMzNSA0NzggMzU5IDQ3OFEzODIgNDc4IDM5NCA0NjlUNDA3IDQ0NFE0MDcgNDA4IDM5MSAzOTJRMzc4IDM3OSAzNTQgMzc5Wk0yODYgNTlRMjYzIDU5IDI1MSA2OFQyMzggOTNRMjM4IDEyOSAyNTQgMTQ1UTI2NyAxNTggMjkxIDE1OFEzMTQgMTU4IDMyNiAxNDlUMzM5IDEyNFEzMzkgODggMzIzIDcyUTMxMCA1OSAyODYgNTlaTTEzNSAyMzhRMTAxIDIzOCAxMDkgMjY1TDExMSAyNzJRMTE1IDI4NiAxMjIgMjkyVDE0OCAyOTlINTExUTUyOSAyOTkgNTM0IDI5M1Q1MzYgMjcyTDUzNCAyNjVRNTMwIDI1MSA1MjMgMjQ1VDQ5OCAyMzhIMTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjg7IiBnbHlwaC1uYW1lPSJvc2xhc2giIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0zNSAtMjZRMzMgLTI3IDI5IC0yNVQyMCAtMTlUMTIgLThUOCA1UTggMTMgMTQgMjRUMzQgNDhMODIgOTBRNjYgMTE1IDU4IDE0NVQ0OSAyMDlRNDkgMjY0IDY5IDMxNVQxMjUgNDA0VDIxMCA0NjVUMzE3IDQ4OFEzNTkgNDg4IDM5NyA0NzNUNDY1IDQzMUw1NDMgNTAxUTU0NCA1MDIgNTQ4IDUwMFQ1NTggNDk0VDU2NiA0ODNUNTcwIDQ3MFE1NzAgNDYxIDU2NCA0NTFUNTQ0IDQyN0w1MDEgMzg5UTUxOCAzNjMgNTI3IDMzM1Q1MzYgMjY3UTUzNiAyMTEgNTE2IDE2MVQ0NjAgNzJUMzc1IDExVDI2OCAtMTJRMjI0IC0xMiAxODUgM1QxMTcgNDdMMzUgLTI2Wk0yNzIgNDVRMzE0IDQ1IDM1MCA2M1Q0MTIgMTExVDQ1NCAxODFUNDcwIDI2NVE0NzAgMzA5IDQ1MSAzNDdMMTYyIDkwUTIwNSA0NSAyNzIgNDVaTTExNSAyMTFRMTE1IDE2NSAxMzMgMTMxTDQyMCAzODhRMzk5IDQwOCAzNzIgNDE5VDMxMyA0MzFRMjcxIDQzMSAyMzUgNDEzVDE3MyAzNjVUMTMxIDI5NVQxMTUgMjExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjk7IiBnbHlwaC1uYW1lPSJ1Z3JhdmUiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik00NTUgLThRNDE3IC04IDQwMCAxNFQzODggNzlRMzYyIDM2IDMyMCAxMlQyMzAgLTEyUTE4MiAtMTIgMTQ4IDRUOTMgNDlUNjggMTE5VDcyIDIwN0wxMjkgNDc2SDE5NEwxMzYgMjAyUTEyMiAxMzQgMTQ4IDkyVDIzOSA0OVEyOTQgNDkgMzMzIDc3VDQwNiAxNjRMNDcyIDQ3Nkg1MzdMNDU3IDEwMVE0NDkgNjYgNDU4IDUyVDUwMCAzN1E1MDAgMzcgNTAwIDMwVDQ5NyAxNVQ0ODQgLTFUNDU1IC04Wk0zODMgNTUxUTM4MSA1NDkgMzY1IDU1M1QzMjcgNTY4VDI3OCA1OTNUMjMwIDYyNlEyMTMgNjQwIDIwNyA2NTFUMjAwIDY3NVEyMDAgNjg4IDIxMCA2OTZUMjMyIDcwNFEyNDMgNzA0IDI1NCA2OThUMjc3IDY4M1EyOTkgNjY1IDMxOSA2NDNUMzU0IDYwMVQzNzcgNTY3VDM4MyA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQTsiIGdseXBoLW5hbWU9InVhY3V0ZSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTQ1NSAtOFE0MTcgLTggNDAwIDE0VDM4OCA3OVEzNjIgMzYgMzIwIDEyVDIzMCAtMTJRMTgyIC0xMiAxNDggNFQ5MyA0OVQ2OCAxMTlUNzIgMjA3TDEyOSA0NzZIMTk0TDEzNiAyMDJRMTIyIDEzNCAxNDggOTJUMjM5IDQ5UTI5NCA0OSAzMzMgNzdUNDA2IDE2NEw0NzIgNDc2SDUzN0w0NTcgMTAxUTQ0OSA2NiA0NTggNTJUNTAwIDM3UTUwMCAzNyA1MDAgMzBUNDk3IDE1VDQ4NCAtMVQ0NTUgLThaTTI4MSA1NTFRMjgwIDU1MyAyOTMgNTY3VDMyNyA2MDBUMzc0IDY0MVQ0MjUgNjc3UTQ0OSA2OTIgNDcxIDY5MlE0ODQgNjkyIDQ5MiA2ODRUNTAwIDY2NFE1MDAgNjQwIDQ1OSA2MTZRNDMxIDYwMCA0MDEgNTg3VDM0NCA1NjVUMzAwIDU1M1QyODEgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkI7IiBnbHlwaC1uYW1lPSJ1Y2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTQ1NSAtOFE0MTcgLTggNDAwIDE0VDM4OCA3OVEzNjIgMzYgMzIwIDEyVDIzMCAtMTJRMTgyIC0xMiAxNDggNFQ5MyA0OVQ2OCAxMTlUNzIgMjA3TDEyOSA0NzZIMTk0TDEzNiAyMDJRMTIyIDEzNCAxNDggOTJUMjM5IDQ5UTI5NCA0OSAzMzMgNzdUNDA2IDE2NEw0NzIgNDc2SDUzN0w0NTcgMTAxUTQ0OSA2NiA0NTggNTJUNTAwIDM3UTUwMCAzNyA1MDAgMzBUNDk3IDE1VDQ4NCAtMVQ0NTUgLThaTTIzNSA1NDlRMjI1IDU0OSAyMjEgNTU0VDIxNiA1NjZRMjE2IDU4MyAyMzMgNjAzVDI4MyA2NTJRMjk5IDY2NiAzMTUgNjc4VDM0NSA2OTlUMzY2IDcxM1QzNzYgNzE5UTM3NyA3MTkgMzgzIDcxNFQzOTggNjk5VDQxNyA2NzlUNDM4IDY1NVE0NjAgNjI2IDQ2OCA2MDhUNDc3IDU3OFE0NzcgNTY0IDQ3MCA1NTdUNDUzIDU0OVE0NDAgNTQ5IDQyOCA1NjNUMzk3IDYxMEwzNjggNjYxTDMxNyA2MDhRMjkxIDU4MSAyNzAgNTY1VDIzNSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQzsiIGdseXBoLW5hbWU9InVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTQ1NSAtOFE0MTcgLTggNDAwIDE0VDM4OCA3OVEzNjIgMzYgMzIwIDEyVDIzMCAtMTJRMTgyIC0xMiAxNDggNFQ5MyA0OVQ2OCAxMTlUNzIgMjA3TDEyOSA0NzZIMTk0TDEzNiAyMDJRMTIyIDEzNCAxNDggOTJUMjM5IDQ5UTI5NCA0OSAzMzMgNzdUNDA2IDE2NEw0NzIgNDc2SDUzN0w0NTcgMTAxUTQ0OSA2NiA0NTggNTJUNTAwIDM3UTUwMCAzNyA1MDAgMzBUNDk3IDE1VDQ4NCAtMVQ0NTUgLThaTTQzNCA1NDhRMzg1IDU0OCAzODUgNTg2UTM4NSA2MDkgMzk3IDYyNlQ0MzYgNjQ0UTQ4NSA2NDQgNDg1IDYwNlE0ODUgNTgzIDQ3MyA1NjZUNDM0IDU0OFpNMjY2IDU0OFEyMTcgNTQ4IDIxNyA1ODZRMjE3IDYwOSAyMjkgNjI2VDI2OCA2NDRRMzE3IDY0NCAzMTcgNjA2UTMxNyA1ODMgMzA1IDU2NlQyNjYgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkQ7IiBnbHlwaC1uYW1lPSJ5YWN1dGUiIGhvcml6LWFkdi14PSI0OTgiIGQ9Ik05IC0yMDRRLTE1IC0yMDQgLTM0IC0xOTlULTY1IC0xODFRLTc3IC0xNjkgLTc3IC0xNTNRLTc3IC0xNDUgLTczIC0xMzlULTY1IC0xMjdULTU2IC0xMjBULTUwIC0xMTlRLTQwIC0xMzAgLTIzIC0xMzdUNSAtMTQ1UTIwIC0xNDUgMzUgLTEzOVQ2OCAtMTE3VDEwOSAtNzJUMTYyIDFMMTc4IDI0UTE2MSAyNiAxNTMgMzdUMTQzIDY3TDExNSAzMzBRMTEwIDM4MiA5MyA0MDVUNDAgNDI4UTQwIDQyOCA0MCA0MzZUNDIgNDU0VDU3IDQ3MlQ5MCA0ODBRMTE2IDQ4MCAxMzQgNDYyUTE3MCA0MjYgMTc5IDMyNEwyMDMgNTlMNDU3IDQ3Nkg1MjhMMjI1IC0xMlExODkgLTY5IDE2MSAtMTA2VDEwOCAtMTY1VDYwIC0xOTVUOSAtMjA0Wk0yNTUgNTQxUTI1NCA1NDMgMjY3IDU1N1QzMDEgNTkwVDM0OCA2MzFUMzk5IDY2N1E0MjMgNjgyIDQ0NSA2ODJRNDU4IDY4MiA0NjYgNjc0VDQ3NCA2NTRRNDc0IDYzMCA0MzMgNjA2UTQwNSA1OTAgMzc1IDU3N1QzMTggNTU1VDI3NCA1NDNUMjU1IDU0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZFOyIgZ2x5cGgtbmFtZT0idGhvcm4iIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik0yOTIgLTEyUTIyNyAtMTIgMTgzIDE5VDExOCA5NUw2MyAtMTY2UTU5IC0xODMgNTIgLTE5MFQzMyAtMTk3SDI1UTEyIC0xOTcgMyAtMTkxVC0yIC0xNjZMMTcxIDY1MFExNzUgNjY3IDE4MSA2NzRUMjAxIDY4MUgyMDlRMjIxIDY4MSAyMzAgNjc1VDIzNiA2NTBMMTgxIDM5NFEyMTUgNDQwIDI1NyA0NjRUMzU2IDQ4OFEzOTQgNDg4IDQyOSA0NzVUNDkyIDQzNVQ1MzUgMzY5VDU1MiAyNzdRNTUyIDIyMiA1MzMgMTcwVDQ4MCA3OFQzOTggMTNUMjkyIC0xMlpNMzQ4IDQzMVEyOTAgNDMxIDI0MSAzOThUMTY0IDMxMUwxNDUgMjIxUTEzOSAxODggMTQ2IDE1NlQxNzMgMTAwVDIyNCA2MFQyOTYgNDVRMzQyIDQ1IDM3NyA2NVQ0MzcgMTE4VDQ3MyAxOTJUNDg2IDI3N1E0ODYgMzE0IDQ3NSAzNDJUNDQ0IDM5MFQ0MDAgNDIwVDM0OCA0MzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRjsiIGdseXBoLW5hbWU9InlkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTkgLTIwNFEtMTUgLTIwNCAtMzQgLTE5OVQtNjUgLTE4MVEtNzcgLTE2OSAtNzcgLTE1M1EtNzcgLTE0NSAtNzMgLTEzOVQtNjUgLTEyN1QtNTYgLTEyMFQtNTAgLTExOVEtNDAgLTEzMCAtMjMgLTEzN1Q1IC0xNDVRMjAgLTE0NSAzNSAtMTM5VDY4IC0xMTdUMTA5IC03MlQxNjIgMUwxNzggMjRRMTYxIDI2IDE1MyAzN1QxNDMgNjdMMTE1IDMzMFExMTAgMzgyIDkzIDQwNVQ0MCA0MjhRNDAgNDI4IDQwIDQzNlQ0MiA0NTRUNTcgNDcyVDkwIDQ4MFExMTYgNDgwIDEzNCA0NjJRMTcwIDQyNiAxNzkgMzI0TDIwMyA1OUw0NTcgNDc2SDUyOEwyMjUgLTEyUTE4OSAtNjkgMTYxIC0xMDZUMTA4IC0xNjVUNjAgLTE5NVQ5IC0yMDRaTTM5MyA1NDhRMzQ0IDU0OCAzNDQgNTg2UTM0NCA2MDkgMzU2IDYyNlQzOTUgNjQ0UTQ0NCA2NDQgNDQ0IDYwNlE0NDQgNTgzIDQzMiA1NjZUMzkzIDU0OFpNMjI1IDU0OFExNzYgNTQ4IDE3NiA1ODZRMTc2IDYwOSAxODggNjI2VDIyNyA2NDRRMjc2IDY0NCAyNzYgNjA2UTI3NiA1ODMgMjY0IDU2NlQyMjUgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAwOyIgZ2x5cGgtbmFtZT0iQW1hY3JvbiIgaG9yaXotYWR2LXg9IjY0MyIgZD0iTS0yNSAwTDM1MCA2MzFRMzU4IDY0NCAzNjcgNjQ5VDM5MyA2NTRRNDE5IDY1NCA0MjggNjQ2VDQ0MCA2MjRMNTY1IDBINDk0TDQ1NSAyMTFIMTc1TDU0IDBILTI1Wk00NDMgMjcxTDM4NiA1NzZMMjEwIDI3MUg0NDNaTTMwNiA3MzNRMjc1IDczMyAyNzUgNzUxUTI3NSA3NTkgMjc4IDc3MFQyODcgNzg3UTI5NCA3OTUgMzEzIDc5NUg1MzNRNTY0IDc5NSA1NjQgNzc3UTU2NCA3NjkgNTYxIDc1OFQ1NTIgNzQxUTU0NSA3MzMgNTI2IDczM0gzMDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDE7IiBnbHlwaC1uYW1lPSJhbWFjcm9uIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNNDg5IC04UTQ1MCAtOCA0MzMgMTZUNDIzIDg2UTM5MCAzNyAzNDIgMTNUMjQwIC0xMlEyMDEgLTEyIDE2NyAxVDEwNiAzOVQ2NSAxMDJUNDkgMTkwUTQ5IDI0NSA2OSAyOThUMTI1IDM5NFQyMTAgNDYyVDMxOSA0ODhRMzc5IDQ4OCA0MjMgNDYxVDQ4OSAzOTNMNTA3IDQ3Nkg1NzFMNDkxIDEwMVE0ODMgNjYgNDkyIDUyVDUzNCAzN1E1MzQgMzcgNTM0IDMwVDUzMSAxNVQ1MTggLTFUNDg5IC04Wk0yNDggNDVRMjg1IDQ1IDMxOSA2MFQzODEgMTAwVDQyNyAxNThUNDU0IDIyOEw0NzEgMzA3UTQ1MyAzNjQgNDE2IDM5N1QzMTUgNDMxUTI2OCA0MzEgMjMxIDQxMFQxNjggMzU0VDEyOSAyNzdUMTE1IDE5MVExMTUgMTU2IDEyNSAxMjlUMTU0IDgzVDE5NyA1NVQyNDggNDVaTTI2NSA1NjhRMjM0IDU2OCAyMzQgNTg2UTIzNCA1OTQgMjM3IDYwNVQyNDYgNjIyUTI1MyA2MzAgMjcyIDYzMEg0OTJRNTIzIDYzMCA1MjMgNjEyUTUyMyA2MDQgNTIwIDU5M1Q1MTEgNTc2UTUwNCA1NjggNDg1IDU2OEgyNjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDI7IiBnbHlwaC1uYW1lPSJBYnJldmUiIGhvcml6LWFkdi14PSI2NDMiIGQ9Ik0tMjUgMEwzNTAgNjMxUTM1OCA2NDQgMzY3IDY0OVQzOTMgNjU0UTQxOSA2NTQgNDI4IDY0NlQ0NDAgNjI0TDU2NSAwSDQ5NEw0NTUgMjExSDE3NUw1NCAwSC0yNVpNNDQzIDI3MUwzODYgNTc2TDIxMCAyNzFINDQzWk00MjAgNzEzUTM5NiA3MTMgMzczIDcyM1QzMzAgNzQ5VDI5OSA3ODRUMjg3IDgyMFEyODcgODMxIDI5MyA4MzlUMzEyIDg0N1EzMjggODQ3IDM1MiA4MjhUNDE5IDc1NlE0NjYgODA1IDQ5NSA4MjZUNTQ0IDg0N1E1NTUgODQ3IDU2MiA4NDBUNTY5IDgyM1E1NjkgODA4IDU1NiA3ODlUNTIyIDc1M1Q0NzQgNzI1VDQyMCA3MTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDM7IiBnbHlwaC1uYW1lPSJhYnJldmUiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik00ODkgLThRNDUwIC04IDQzMyAxNlQ0MjMgODZRMzkwIDM3IDM0MiAxM1QyNDAgLTEyUTIwMSAtMTIgMTY3IDFUMTA2IDM5VDY1IDEwMlQ0OSAxOTBRNDkgMjQ1IDY5IDI5OFQxMjUgMzk0VDIxMCA0NjJUMzE5IDQ4OFEzNzkgNDg4IDQyMyA0NjFUNDg5IDM5M0w1MDcgNDc2SDU3MUw0OTEgMTAxUTQ4MyA2NiA0OTIgNTJUNTM0IDM3UTUzNCAzNyA1MzQgMzBUNTMxIDE1VDUxOCAtMVQ0ODkgLThaTTI0OCA0NVEyODUgNDUgMzE5IDYwVDM4MSAxMDBUNDI3IDE1OFQ0NTQgMjI4TDQ3MSAzMDdRNDUzIDM2NCA0MTYgMzk3VDMxNSA0MzFRMjY4IDQzMSAyMzEgNDEwVDE2OCAzNTRUMTI5IDI3N1QxMTUgMTkxUTExNSAxNTYgMTI1IDEyOVQxNTQgODNUMTk3IDU1VDI0OCA0NVpNMzgwIDU0OFEzNTYgNTQ4IDMzMyA1NThUMjkwIDU4NFQyNTkgNjE5VDI0NyA2NTVRMjQ3IDY2NiAyNTMgNjc0VDI3MiA2ODJRMjg4IDY4MiAzMTIgNjYzVDM3OSA1OTFRNDI2IDY0MCA0NTUgNjYxVDUwNCA2ODJRNTE1IDY4MiA1MjIgNjc1VDUyOSA2NThRNTI5IDY0MyA1MTYgNjI0VDQ4MiA1ODhUNDM0IDU2MFQzODAgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA0OyIgZ2x5cGgtbmFtZT0iQW9nb25layIgaG9yaXotYWR2LXg9IjY0MyIgZD0iTS0yNSAwTDM1MCA2MzFRMzU4IDY0NCAzNjcgNjQ5VDM5MyA2NTRRNDE5IDY1NCA0MjggNjQ2VDQ0MCA2MjRMNTY1IDBINTQxUTUxMCAtMTcgNDkxIC0zMlQ0NjAgLTYwVDQ0NCAtODZUNDM5IC0xMDlRNDM5IC0xMjQgNDQ4IC0xMzNUNDcyIC0xNDJRNDk0IC0xNDIgNTA5IC0xMjRRNTE5IC0xMjYgNTI3IC0xMzNUNTM1IC0xNTRRNTM1IC0xNzQgNTE3IC0xODdUNDY3IC0yMDBRNDI3IC0yMDAgNDAyIC0xNzhUMzc2IC0xMjFRMzc2IC04NiA0MDQgLTUzVDQ5MiA3TDQ1NSAyMTFIMTc1TDU0IDBILTI1Wk00NDMgMjcxTDM4NiA1NzZMMjEwIDI3MUg0NDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDU7IiBnbHlwaC1uYW1lPSJhb2dvbmVrIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNNTM0IDM3UTUzNCAzNyA1MzQgMzJUNTMzIDIwVDUyNSA2VDUwOSAtNVE0NzggLTIyIDQ1OSAtMzdUNDI4IC02NVQ0MTIgLTkxVDQwNyAtMTE0UTQwNyAtMTI5IDQxNiAtMTM4VDQ0MCAtMTQ3UTQ2MiAtMTQ3IDQ3NyAtMTI5UTQ4NyAtMTMxIDQ5NSAtMTM4VDUwMyAtMTU5UTUwMyAtMTc5IDQ4NSAtMTkyVDQzNSAtMjA1UTM5NSAtMjA1IDM3MCAtMTgzVDM0NCAtMTI2UTM0NCAtOTIgMzcwIC02MFQ0NTMgLTFRNDEyIDE5IDQyMyA4NlEzOTAgMzcgMzQyIDEzVDI0MCAtMTJRMjAxIC0xMiAxNjcgMVQxMDYgMzlUNjUgMTAyVDQ5IDE5MFE0OSAyNDUgNjkgMjk4VDEyNSAzOTRUMjEwIDQ2MlQzMTkgNDg4UTM3OSA0ODggNDIzIDQ2MVQ0ODkgMzkzTDUwNyA0NzZINTcxTDQ5MSAxMDFRNDgzIDY2IDQ5MiA1MlQ1MzQgMzdaTTI0OCA0NVEyODUgNDUgMzE5IDYwVDM4MSAxMDBUNDI3IDE1OFQ0NTQgMjI4TDQ3MSAzMDdRNDUzIDM2NCA0MTYgMzk3VDMxNSA0MzFRMjY4IDQzMSAyMzEgNDEwVDE2OCAzNTRUMTI5IDI3N1QxMTUgMTkxUTExNSAxNTYgMTI1IDEyOVQxNTQgODNUMTk3IDU1VDI0OCA0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNjsiIGdseXBoLW5hbWU9IkNhY3V0ZSIgaG9yaXotYWR2LXg9IjY4NCIgZD0iTTM3MCAtMTJRMzA0IC0xMiAyNTAgN1QxNTggNjNUOTkgMTUwVDc4IDI2N1E3OCAzNDYgMTA1IDQxN1QxODEgNTQyVDI5NSA2MjdUNDM4IDY1OVE1MTAgNjU5IDU1NiA2MzhUNjMxIDU4OFE2NTMgNTY2IDY2MyA1NDRUNjczIDUwOFE2NzMgNDk1IDY2NyA0ODdUNjUzIDQ3NFQ2MzggNDY4VDYyOCA0NjlRNTgwIDYwMCA0MzUgNjAwUTM3NCA2MDAgMzIyIDU3NFQyMzIgNTA0VDE3MiA0MDJUMTUwIDI3N1ExNTAgMjI0IDE2NiAxODJUMjExIDExMFQyODAgNjRUMzY5IDQ4UTQzOSA0OCA0OTEgNzZUNTc2IDE1M1E1NzcgMTU0IDU4MiAxNTNUNTk0IDE0N1Q2MDUgMTM1VDYxMCAxMTdRNjEwIDkzIDU4MSA2NFE1NjYgNDkgNTQ1IDM2VDQ5NiAxMlQ0MzYgLTVUMzcwIC0xMlpNMzc2IDcxNlEzNzUgNzE4IDM4OCA3MzJUNDIyIDc2NVQ0NjkgODA2VDUyMCA4NDJRNTQ0IDg1NyA1NjYgODU3UTU3OSA4NTcgNTg3IDg0OVQ1OTUgODI5UTU5NSA4MDUgNTU0IDc4MVE1MjYgNzY1IDQ5NiA3NTJUNDM5IDczMFQzOTUgNzE4VDM3NiA3MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDc7IiBnbHlwaC1uYW1lPSJjYWN1dGUiIGhvcml6LWFkdi14PSI1NTIiIGQ9Ik0yNzQgLTEyUTIyNyAtMTIgMTg2IDNUMTE0IDQ2VDY2IDExNlQ0OCAyMDlRNDggMjYzIDY5IDMxM1QxMjYgNDAyVDIxMSA0NjRUMzE4IDQ4N1EzNzggNDg3IDQxOCA0NzBUNDgzIDQyN1E1MDQgNDA2IDUxMyAzODRUNTIzIDM0NVE1MjMgMzI5IDUxNiAzMjFUNDk5IDMwOVQ0ODMgMzA1VDQ3NSAzMDhRNDY1IDM2MSA0MjYgMzk1VDMyMCA0MjlRMjc0IDQyOSAyMzcgNDExVDE3MiAzNjJUMTMwIDI5MlQxMTUgMjEzUTExNSAxNzYgMTI2IDE0NlQxNjAgOTNUMjEyIDU5VDI4MCA0N1EzMzYgNDcgMzczIDcyVDQzNSAxMzdRNDM2IDEzOCA0NDEgMTM3VDQ1NCAxMzNUNDY2IDEyM1Q0NzIgMTA2UTQ3MiA4MyA0NDEgNTJRNDE2IDI3IDM3MyA4VDI3NCAtMTJaTTI2MiA1NTFRMjYxIDU1MyAyNzQgNTY3VDMwOCA2MDBUMzU1IDY0MVQ0MDYgNjc3UTQzMCA2OTIgNDUyIDY5MlE0NjUgNjkyIDQ3MyA2ODRUNDgxIDY2NFE0ODEgNjQwIDQ0MCA2MTZRNDEyIDYwMCAzODIgNTg3VDMyNSA1NjVUMjgxIDU1M1QyNjIgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA4OyIgZ2x5cGgtbmFtZT0iQ2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik0zNzAgLTEyUTMwNCAtMTIgMjUwIDdUMTU4IDYzVDk5IDE1MFQ3OCAyNjdRNzggMzQ2IDEwNSA0MTdUMTgxIDU0MlQyOTUgNjI3VDQzOCA2NTlRNTEwIDY1OSA1NTYgNjM4VDYzMSA1ODhRNjUzIDU2NiA2NjMgNTQ0VDY3MyA1MDhRNjczIDQ5NSA2NjcgNDg3VDY1MyA0NzRUNjM4IDQ2OFQ2MjggNDY5UTU4MCA2MDAgNDM1IDYwMFEzNzQgNjAwIDMyMiA1NzRUMjMyIDUwNFQxNzIgNDAyVDE1MCAyNzdRMTUwIDIyNCAxNjYgMTgyVDIxMSAxMTBUMjgwIDY0VDM2OSA0OFE0MzkgNDggNDkxIDc2VDU3NiAxNTNRNTc3IDE1NCA1ODIgMTUzVDU5NCAxNDdUNjA1IDEzNVQ2MTAgMTE3UTYxMCA5MyA1ODEgNjRRNTY2IDQ5IDU0NSAzNlQ0OTYgMTJUNDM2IC01VDM3MCAtMTJaTTM0MiA3MTRRMzMyIDcxNCAzMjggNzE5VDMyMyA3MzFRMzIzIDc0OCAzNDAgNzY4VDM5MCA4MTdRNDA2IDgzMSA0MjIgODQzVDQ1MiA4NjRUNDczIDg3OFQ0ODMgODg0UTQ4NCA4ODQgNDkwIDg3OVQ1MDUgODY0VDUyNCA4NDRUNTQ1IDgyMFE1NjcgNzkxIDU3NSA3NzNUNTg0IDc0M1E1ODQgNzI5IDU3NyA3MjJUNTYwIDcxNFE1NDcgNzE0IDUzNSA3MjhUNTA0IDc3NUw0NzUgODI2TDQyNCA3NzNRMzk4IDc0NiAzNzcgNzMwVDM0MiA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDk7IiBnbHlwaC1uYW1lPSJjY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU1MiIgZD0iTTI3NCAtMTJRMjI3IC0xMiAxODYgM1QxMTQgNDZUNjYgMTE2VDQ4IDIwOVE0OCAyNjMgNjkgMzEzVDEyNiA0MDJUMjExIDQ2NFQzMTggNDg3UTM3OCA0ODcgNDE4IDQ3MFQ0ODMgNDI3UTUwNCA0MDYgNTEzIDM4NFQ1MjMgMzQ1UTUyMyAzMjkgNTE2IDMyMVQ0OTkgMzA5VDQ4MyAzMDVUNDc1IDMwOFE0NjUgMzYxIDQyNiAzOTVUMzIwIDQyOVEyNzQgNDI5IDIzNyA0MTFUMTcyIDM2MlQxMzAgMjkyVDExNSAyMTNRMTE1IDE3NiAxMjYgMTQ2VDE2MCA5M1QyMTIgNTlUMjgwIDQ3UTMzNiA0NyAzNzMgNzJUNDM1IDEzN1E0MzYgMTM4IDQ0MSAxMzdUNDU0IDEzM1Q0NjYgMTIzVDQ3MiAxMDZRNDcyIDgzIDQ0MSA1MlE0MTYgMjcgMzczIDhUMjc0IC0xMlpNMjI4IDU0OVEyMTggNTQ5IDIxNCA1NTRUMjA5IDU2NlEyMDkgNTgzIDIyNiA2MDNUMjc2IDY1MlEyOTIgNjY2IDMwOCA2NzhUMzM4IDY5OVQzNTkgNzEzVDM2OSA3MTlRMzcwIDcxOSAzNzYgNzE0VDM5MSA2OTlUNDEwIDY3OVQ0MzEgNjU1UTQ1MyA2MjYgNDYxIDYwOFQ0NzAgNTc4UTQ3MCA1NjQgNDYzIDU1N1Q0NDYgNTQ5UTQzMyA1NDkgNDIxIDU2M1QzOTAgNjEwTDM2MSA2NjFMMzEwIDYwOFEyODQgNTgxIDI2MyA1NjVUMjI4IDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQTsiIGdseXBoLW5hbWU9IkNkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI2ODQiIGQ9Ik0zNzAgLTEyUTMwNCAtMTIgMjUwIDdUMTU4IDYzVDk5IDE1MFQ3OCAyNjdRNzggMzQ2IDEwNSA0MTdUMTgxIDU0MlQyOTUgNjI3VDQzOCA2NTlRNTEwIDY1OSA1NTYgNjM4VDYzMSA1ODhRNjUzIDU2NiA2NjMgNTQ0VDY3MyA1MDhRNjczIDQ5NSA2NjcgNDg3VDY1MyA0NzRUNjM4IDQ2OFQ2MjggNDY5UTU4MCA2MDAgNDM1IDYwMFEzNzQgNjAwIDMyMiA1NzRUMjMyIDUwNFQxNzIgNDAyVDE1MCAyNzdRMTUwIDIyNCAxNjYgMTgyVDIxMSAxMTBUMjgwIDY0VDM2OSA0OFE0MzkgNDggNDkxIDc2VDU3NiAxNTNRNTc3IDE1NCA1ODIgMTUzVDU5NCAxNDdUNjA1IDEzNVQ2MTAgMTE3UTYxMCA5MyA1ODEgNjRRNTY2IDQ5IDU0NSAzNlQ0OTYgMTJUNDM2IC01VDM3MCAtMTJaTTQ1OSA3MTRRNDA1IDcxNCA0MDUgNzU1UTQwNSA3NzkgNDE4IDc5OFQ0NjEgODE4UTUxNSA4MTggNTE1IDc3N1E1MTUgNzUzIDUwMiA3MzRUNDU5IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQjsiIGdseXBoLW5hbWU9ImNkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1NTIiIGQ9Ik0yNzQgLTEyUTIyNyAtMTIgMTg2IDNUMTE0IDQ2VDY2IDExNlQ0OCAyMDlRNDggMjYzIDY5IDMxM1QxMjYgNDAyVDIxMSA0NjRUMzE4IDQ4N1EzNzggNDg3IDQxOCA0NzBUNDgzIDQyN1E1MDQgNDA2IDUxMyAzODRUNTIzIDM0NVE1MjMgMzI5IDUxNiAzMjFUNDk5IDMwOVQ0ODMgMzA1VDQ3NSAzMDhRNDY1IDM2MSA0MjYgMzk1VDMyMCA0MjlRMjc0IDQyOSAyMzcgNDExVDE3MiAzNjJUMTMwIDI5MlQxMTUgMjEzUTExNSAxNzYgMTI2IDE0NlQxNjAgOTNUMjEyIDU5VDI4MCA0N1EzMzYgNDcgMzczIDcyVDQzNSAxMzdRNDM2IDEzOCA0NDEgMTM3VDQ1NCAxMzNUNDY2IDEyM1Q0NzIgMTA2UTQ3MiA4MyA0NDEgNTJRNDE2IDI3IDM3MyA4VDI3NCAtMTJaTTM1MyA1NDlRMjk5IDU0OSAyOTkgNTkwUTI5OSA2MTQgMzEyIDYzM1QzNTUgNjUzUTQwOSA2NTMgNDA5IDYxMlE0MDkgNTg4IDM5NiA1NjlUMzUzIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGdseXBoLW5hbWU9IkNjYXJvbiIgaG9yaXotYWR2LXg9IjY4NCIgZD0iTTM3MCAtMTJRMzA0IC0xMiAyNTAgN1QxNTggNjNUOTkgMTUwVDc4IDI2N1E3OCAzNDYgMTA1IDQxN1QxODEgNTQyVDI5NSA2MjdUNDM4IDY1OVE1MTAgNjU5IDU1NiA2MzhUNjMxIDU4OFE2NTMgNTY2IDY2MyA1NDRUNjczIDUwOFE2NzMgNDk1IDY2NyA0ODdUNjUzIDQ3NFQ2MzggNDY4VDYyOCA0NjlRNTgwIDYwMCA0MzUgNjAwUTM3NCA2MDAgMzIyIDU3NFQyMzIgNTA0VDE3MiA0MDJUMTUwIDI3N1ExNTAgMjI0IDE2NiAxODJUMjExIDExMFQyODAgNjRUMzY5IDQ4UTQzOSA0OCA0OTEgNzZUNTc2IDE1M1E1NzcgMTU0IDU4MiAxNTNUNTk0IDE0N1Q2MDUgMTM1VDYxMCAxMTdRNjEwIDkzIDU4MSA2NFE1NjYgNDkgNTQ1IDM2VDQ5NiAxMlQ0MzYgLTVUMzcwIC0xMlpNNDQ0IDY5OFE0NDMgNjk4IDQzNyA3MDNUNDIxIDcxOFQ0MDIgNzM4VDM4MiA3NjJRMzYwIDc5MSAzNTIgODA5VDM0MyA4MzlRMzQzIDg1MyAzNTAgODYwVDM2NyA4NjhRMzgzIDg2OCA0MDAgODQzVDQ1MiA3NTZMNTAzIDgwOVE1MjkgODM2IDU1MCA4NTJUNTg1IDg2OFE1OTUgODY4IDU5OSA4NjNUNjA0IDg1MVE2MDQgODM0IDU4NyA4MTRUNTM3IDc2NVE1MjAgNzUxIDUwNCA3MzlUNDc1IDcxOFQ0NTQgNzA0VDQ0NCA2OThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEQ7IiBnbHlwaC1uYW1lPSJjY2Fyb24iIGhvcml6LWFkdi14PSI1NTIiIGQ9Ik0yNzQgLTEyUTIyNyAtMTIgMTg2IDNUMTE0IDQ2VDY2IDExNlQ0OCAyMDlRNDggMjYzIDY5IDMxM1QxMjYgNDAyVDIxMSA0NjRUMzE4IDQ4N1EzNzggNDg3IDQxOCA0NzBUNDgzIDQyN1E1MDQgNDA2IDUxMyAzODRUNTIzIDM0NVE1MjMgMzI5IDUxNiAzMjFUNDk5IDMwOVQ0ODMgMzA1VDQ3NSAzMDhRNDY1IDM2MSA0MjYgMzk1VDMyMCA0MjlRMjc0IDQyOSAyMzcgNDExVDE3MiAzNjJUMTMwIDI5MlQxMTUgMjEzUTExNSAxNzYgMTI2IDE0NlQxNjAgOTNUMjEyIDU5VDI4MCA0N1EzMzYgNDcgMzczIDcyVDQzNSAxMzdRNDM2IDEzOCA0NDEgMTM3VDQ1NCAxMzNUNDY2IDEyM1Q0NzIgMTA2UTQ3MiA4MyA0NDEgNTJRNDE2IDI3IDM3MyA4VDI3NCAtMTJaTTM0MiA1MzNRMzQxIDUzMyAzMzUgNTM4VDMxOSA1NTNUMzAwIDU3M1QyODAgNTk3UTI1OCA2MjYgMjUwIDY0NFQyNDEgNjc0UTI0MSA2ODggMjQ4IDY5NVQyNjUgNzAzUTI4MSA3MDMgMjk4IDY3OFQzNTAgNTkxTDQwMSA2NDRRNDI3IDY3MSA0NDggNjg3VDQ4MyA3MDNRNDkzIDcwMyA0OTcgNjk4VDUwMiA2ODZRNTAyIDY2OSA0ODUgNjQ5VDQzNSA2MDBRNDE4IDU4NiA0MDIgNTc0VDM3MyA1NTNUMzUyIDUzOVQzNDIgNTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBFOyIgZ2x5cGgtbmFtZT0iRGNhcm9uIiBob3Jpei1hZHYteD0iNjk0IiBkPSJNMTcyIDYwNlExNzggNjQ3IDIxOSA2NDdIMzI5UTQ4MCA2NDcgNTY0IDU3N1Q2NDkgMzc4UTY0OSAzMDAgNjI0IDIzMVQ1NDkgMTExVDQyMyAzMFQyNDYgMEg0M0wxNzIgNjA2Wk0yNTYgNjBRMzM5IDYwIDM5OSA4NVQ0OTkgMTUyVDU1OCAyNTBUNTc3IDM2OFE1NzcgNDcxIDUxMSA1MjlUMzI0IDU4N0gyMzZMMTI0IDYwSDI1NlpNNDA2IDY5OFE0MDUgNjk4IDM5OSA3MDNUMzgzIDcxOFQzNjQgNzM4VDM0NCA3NjJRMzIyIDc5MSAzMTQgODA5VDMwNSA4MzlRMzA1IDg1MyAzMTIgODYwVDMyOSA4NjhRMzQ1IDg2OCAzNjIgODQzVDQxNCA3NTZMNDY1IDgwOVE0OTEgODM2IDUxMiA4NTJUNTQ3IDg2OFE1NTcgODY4IDU2MSA4NjNUNTY2IDg1MVE1NjYgODM0IDU0OSA4MTRUNDk5IDc2NVE0ODIgNzUxIDQ2NiA3MzlUNDM3IDcxOFQ0MTYgNzA0VDQwNiA2OThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEY7IiBnbHlwaC1uYW1lPSJkY2Fyb24iIGhvcml6LWFkdi14PSI3NzAiIGQ9Ik00ODkgLThRNDUxIC04IDQzNCAxNFQ0MjIgNzhRMzg5IDM0IDM0NyAxMVQyNDggLTEyUTIxMCAtMTIgMTc1IDFUMTEyIDQxVDY5IDEwN1Q1MiAxOTlRNTIgMjU0IDcxIDMwNlQxMjQgMzk4VDIwNiA0NjNUMzEyIDQ4OFEzNzMgNDg4IDQxNyA0NjJUNDg4IDM5MUw1NDkgNjc3SDYxNEw0OTEgMTAxUTQ4MyA2NiA0OTIgNTJUNTM0IDM3UTUzNCAzNyA1MzQgMzBUNTMxIDE1VDUxOCAtMVQ0ODkgLThaTTI1NiA0NVEyOTIgNDUgMzI0IDU4VDM4MSA5NFQ0MjUgMTQ5VDQ1MSAyMThMNDcwIDMwNVE0NTAgMzY0IDQxMCAzOTdUMzA4IDQzMVEyNjIgNDMxIDIyNyA0MTFUMTY3IDM1OFQxMzEgMjg0VDExOCAxOTlRMTE4IDE2MiAxMjkgMTM0VDE2MCA4NlQyMDQgNTZUMjU2IDQ1Wk02NDcgNDM4UTY0NSA0MzUgNjM5IDQzNlQ2MjggNDQxVDYxOSA0NDlUNjE3IDQ1OEw3MzMgNjc4UTczNCA2NzkgNzQzIDY3OVQ3NjQgNjc2VDc4NSA2NjVUNzk1IDY0NVE3OTUgNjM0IDc5MSA2MjRUNzc2IDYwMEw2NDcgNDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEwOyIgZ2x5cGgtbmFtZT0iRGNyb2F0IiBob3Jpei1hZHYteD0iNzMxIiBkPSJNMTI3IDBRMTA0IDAgOTUgMTJUOTAgNDVMMTQzIDI5NUg3OVE1MCAyOTUgNTAgMzExUTUwIDMxOSA1MyAzMzBUNjIgMzQ2UTY5IDM1MyA4NiAzNTNIMTU1TDIwOSA2MDZRMjE1IDY0NyAyNTYgNjQ3SDM2NlE1MTcgNjQ3IDYwMSA1NzdUNjg2IDM3OFE2ODYgMzAwIDY2MSAyMzFUNTg2IDExMVQ0NjAgMzBUMjgzIDBIMTI3Wk0yOTMgNjBRMzc2IDYwIDQzNiA4NVQ1MzYgMTUyVDU5NSAyNTBUNjE0IDM2OFE2MTQgNDcxIDU0OCA1MjlUMzYxIDU4N0gyNzNMMjIzIDM1M0g0MzRRNDYzIDM1MyA0NjMgMzM3UTQ2MyAzMjkgNDYwIDMxOFQ0NTEgMzAyUTQ0NCAyOTUgNDI3IDI5NUgyMTFMMTYxIDYwSDI5M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMTsiIGdseXBoLW5hbWU9ImRjcm9hdCIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTY0NyA2MjhRNjc4IDYyOCA2NzggNjEwUTY3OCA2MDIgNjc1IDU5MVQ2NjYgNTc0UTY1OSA1NjYgNjQwIDU2Nkg1OTBMNDkxIDEwMVE0ODMgNjYgNDkyIDUyVDUzNCAzN1E1MzQgMzcgNTM0IDMwVDUzMSAxNVQ1MTggLTFUNDg5IC04UTQ1MSAtOCA0MzQgMTRUNDIyIDc4UTM4OSAzNCAzNDcgMTFUMjQ4IC0xMlEyMTAgLTEyIDE3NSAxVDExMiA0MVQ2OSAxMDdUNTIgMTk5UTUyIDI1NCA3MSAzMDZUMTI0IDM5OFQyMDYgNDYzVDMxMiA0ODhRMzczIDQ4OCA0MTcgNDYyVDQ4OCAzOTFMNTI1IDU2Nkg0MzBRMzk5IDU2NiAzOTkgNTg0UTM5OSA1OTIgNDAyIDYwM1Q0MTEgNjIwUTQxOCA2MjggNDM3IDYyOEg1MzhMNTQ5IDY3N0g2MTRMNjAzIDYyOEg2NDdaTTI1NiA0NVEyOTIgNDUgMzI0IDU4VDM4MSA5NFQ0MjUgMTQ5VDQ1MSAyMThMNDcwIDMwNVE0NTAgMzY0IDQxMCAzOTdUMzA4IDQzMVEyNjIgNDMxIDIyNyA0MTFUMTY3IDM1OFQxMzEgMjg0VDExOCAxOTlRMTE4IDE2MiAxMjkgMTM0VDE2MCA4NlQyMDQgNTZUMjU2IDQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgZ2x5cGgtbmFtZT0iRW1hY3JvbiIgaG9yaXotYWR2LXg9IjYxMCIgZD0iTTE3MiA2MDZRMTc2IDYyNSAxODcgNjM2VDIxOSA2NDdINjM0UTYzMyA2NDYgNjMzIDY0M1E2MzIgNjQxIDYzMiA2MzhUNjMxIDYzMFE2MjkgNjIyIDYyNyA2MTBUNjIzIDU5MlE2MjEgNTg2IDYyMSA1ODZWNTg1SDIzNkwxODggMzYySDUwMVE1MDEgMzYxIDUwMCAzNThRNDk4IDM1MyA0OTcgMzQ2TDQ4OSAzMDlRNDg4IDMwNiA0ODggMzA0VjMwMkgxNzVMMTI0IDYySDUxNFE1MTQgNjEgNTEzIDU4UTUxMSA1MyA1MTAgNDVMNTAyIDdRNTAxIDQgNTAxIDFWMEg0M0wxNzIgNjA2Wk0zMjEgNzMzUTI5MCA3MzMgMjkwIDc1MVEyOTAgNzU5IDI5MyA3NzBUMzAyIDc4N1EzMDkgNzk1IDMyOCA3OTVINTQ4UTU3OSA3OTUgNTc5IDc3N1E1NzkgNzY5IDU3NiA3NThUNTY3IDc0MVE1NjAgNzMzIDU0MSA3MzNIMzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEzOyIgZ2x5cGgtbmFtZT0iZW1hY3JvbiIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1MiAtMTJRMjAxIC0xMiAxNjMgMlQ5OCA0M1Q1OSAxMDRUNDUgMTgyUTQ1IDI0NiA2OCAzMDJUMTMxIDM5OVQyMjYgNDY0VDM0NSA0ODhRNDI2IDQ4OCA0NzAgNDU0VDUxNSAzNjJRNTE1IDMyNiA1MDIgMjk4VDQ1NyAyNTFUMzcyIDIyMVQyMzggMjEwUTE4NSAyMTAgMTEyIDIxNlExMTEgMjA4IDExMSAyMDFUMTExIDE4NlExMTEgMTIzIDE0NyA4NFQyNTQgNDRRMzEwIDQ0IDM0OCA2NFQ0MTUgMTIzUTQxNiAxMjQgNDIxIDEyM1Q0MzMgMTE4VDQ0NCAxMDhUNDQ5IDkyUTQ0OSA4MSA0NDUgNzJUNDI3IDUwUTM5NSAxOCAzNTMgM1QyNTIgLTEyWk0zNDIgNDMxUTMwNCA0MzEgMjcxIDQxOVQyMDkgMzg2VDE2MCAzMzVUMTI2IDI3MVExNTYgMjY3IDE4MiAyNjZUMjMyIDI2NVEyOTYgMjY1IDMzOCAyNzNUNDA1IDI5NFQ0MzkgMzI1VDQ0OSAzNjFRNDQ5IDM4NyA0MjMgNDA5VDM0MiA0MzFaTTIzMyA1NjhRMjAyIDU2OCAyMDIgNTg2UTIwMiA1OTQgMjA1IDYwNVQyMTQgNjIyUTIyMSA2MzAgMjQwIDYzMEg0NjBRNDkxIDYzMCA0OTEgNjEyUTQ5MSA2MDQgNDg4IDU5M1Q0NzkgNTc2UTQ3MiA1NjggNDUzIDU2OEgyMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTQ7IiBnbHlwaC1uYW1lPSJFYnJldmUiIGhvcml6LWFkdi14PSI2MTAiIGQ9Ik0xNzIgNjA2UTE3NiA2MjUgMTg3IDYzNlQyMTkgNjQ3SDYzNFE2MzMgNjQ2IDYzMyA2NDNRNjMyIDY0MSA2MzIgNjM4VDYzMSA2MzBRNjI5IDYyMiA2MjcgNjEwVDYyMyA1OTJRNjIxIDU4NiA2MjEgNTg2VjU4NUgyMzZMMTg4IDM2Mkg1MDFRNTAxIDM2MSA1MDAgMzU4UTQ5OCAzNTMgNDk3IDM0Nkw0ODkgMzA5UTQ4OCAzMDYgNDg4IDMwNFYzMDJIMTc1TDEyNCA2Mkg1MTRRNTE0IDYxIDUxMyA1OFE1MTEgNTMgNTEwIDQ1TDUwMiA3UTUwMSA0IDUwMSAxVjBINDNMMTcyIDYwNlpNNDI2IDcxM1E0MDIgNzEzIDM3OSA3MjNUMzM2IDc0OVQzMDUgNzg0VDI5MyA4MjBRMjkzIDgzMSAyOTkgODM5VDMxOCA4NDdRMzM0IDg0NyAzNTggODI4VDQyNSA3NTZRNDcyIDgwNSA1MDEgODI2VDU1MCA4NDdRNTYxIDg0NyA1NjggODQwVDU3NSA4MjNRNTc1IDgwOCA1NjIgNzg5VDUyOCA3NTNUNDgwIDcyNVQ0MjYgNzEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE1OyIgZ2x5cGgtbmFtZT0iZWJyZXZlIiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjUyIC0xMlEyMDEgLTEyIDE2MyAyVDk4IDQzVDU5IDEwNFQ0NSAxODJRNDUgMjQ2IDY4IDMwMlQxMzEgMzk5VDIyNiA0NjRUMzQ1IDQ4OFE0MjYgNDg4IDQ3MCA0NTRUNTE1IDM2MlE1MTUgMzI2IDUwMiAyOThUNDU3IDI1MVQzNzIgMjIxVDIzOCAyMTBRMTg1IDIxMCAxMTIgMjE2UTExMSAyMDggMTExIDIwMVQxMTEgMTg2UTExMSAxMjMgMTQ3IDg0VDI1NCA0NFEzMTAgNDQgMzQ4IDY0VDQxNSAxMjNRNDE2IDEyNCA0MjEgMTIzVDQzMyAxMThUNDQ0IDEwOFQ0NDkgOTJRNDQ5IDgxIDQ0NSA3MlQ0MjcgNTBRMzk1IDE4IDM1MyAzVDI1MiAtMTJaTTM0MiA0MzFRMzA0IDQzMSAyNzEgNDE5VDIwOSAzODZUMTYwIDMzNVQxMjYgMjcxUTE1NiAyNjcgMTgyIDI2NlQyMzIgMjY1UTI5NiAyNjUgMzM4IDI3M1Q0MDUgMjk0VDQzOSAzMjVUNDQ5IDM2MVE0NDkgMzg3IDQyMyA0MDlUMzQyIDQzMVpNMzQ4IDU0OFEzMjQgNTQ4IDMwMSA1NThUMjU4IDU4NFQyMjcgNjE5VDIxNSA2NTVRMjE1IDY2NiAyMjEgNjc0VDI0MCA2ODJRMjU2IDY4MiAyODAgNjYzVDM0NyA1OTFRMzk0IDY0MCA0MjMgNjYxVDQ3MiA2ODJRNDgzIDY4MiA0OTAgNjc1VDQ5NyA2NThRNDk3IDY0MyA0ODQgNjI0VDQ1MCA1ODhUNDAyIDU2MFQzNDggNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE2OyIgZ2x5cGgtbmFtZT0iRWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjYxMCIgZD0iTTE3MiA2MDZRMTc2IDYyNSAxODcgNjM2VDIxOSA2NDdINjM0UTYzMyA2NDYgNjMzIDY0M1E2MzIgNjQxIDYzMiA2MzhUNjMxIDYzMFE2MjkgNjIyIDYyNyA2MTBUNjIzIDU5MlE2MjEgNTg2IDYyMSA1ODZWNTg1SDIzNkwxODggMzYySDUwMVE1MDEgMzYxIDUwMCAzNThRNDk4IDM1MyA0OTcgMzQ2TDQ4OSAzMDlRNDg4IDMwNiA0ODggMzA0VjMwMkgxNzVMMTI0IDYySDUxNFE1MTQgNjEgNTEzIDU4UTUxMSA1MyA1MTAgNDVMNTAyIDdRNTAxIDQgNTAxIDFWMEg0M0wxNzIgNjA2Wk00MjUgNzE0UTM3MSA3MTQgMzcxIDc1NVEzNzEgNzc5IDM4NCA3OThUNDI3IDgxOFE0ODEgODE4IDQ4MSA3NzdRNDgxIDc1MyA0NjggNzM0VDQyNSA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTc7IiBnbHlwaC1uYW1lPSJlZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjUyIC0xMlEyMDEgLTEyIDE2MyAyVDk4IDQzVDU5IDEwNFQ0NSAxODJRNDUgMjQ2IDY4IDMwMlQxMzEgMzk5VDIyNiA0NjRUMzQ1IDQ4OFE0MjYgNDg4IDQ3MCA0NTRUNTE1IDM2MlE1MTUgMzI2IDUwMiAyOThUNDU3IDI1MVQzNzIgMjIxVDIzOCAyMTBRMTg1IDIxMCAxMTIgMjE2UTExMSAyMDggMTExIDIwMVQxMTEgMTg2UTExMSAxMjMgMTQ3IDg0VDI1NCA0NFEzMTAgNDQgMzQ4IDY0VDQxNSAxMjNRNDE2IDEyNCA0MjEgMTIzVDQzMyAxMThUNDQ0IDEwOFQ0NDkgOTJRNDQ5IDgxIDQ0NSA3MlQ0MjcgNTBRMzk1IDE4IDM1MyAzVDI1MiAtMTJaTTM0MiA0MzFRMzA0IDQzMSAyNzEgNDE5VDIwOSAzODZUMTYwIDMzNVQxMjYgMjcxUTE1NiAyNjcgMTgyIDI2NlQyMzIgMjY1UTI5NiAyNjUgMzM4IDI3M1Q0MDUgMjk0VDQzOSAzMjVUNDQ5IDM2MVE0NDkgMzg3IDQyMyA0MDlUMzQyIDQzMVpNMzU4IDU0OVEzMDQgNTQ5IDMwNCA1OTBRMzA0IDYxNCAzMTcgNjMzVDM2MCA2NTNRNDE0IDY1MyA0MTQgNjEyUTQxNCA1ODggNDAxIDU2OVQzNTggNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE4OyIgZ2x5cGgtbmFtZT0iRW9nb25layIgaG9yaXotYWR2LXg9IjYxMCIgZD0iTTE3MiA2MDZRMTc2IDYyNSAxODcgNjM2VDIxOSA2NDdINjM0UTYzMyA2NDYgNjMzIDY0M1E2MzIgNjQxIDYzMiA2MzhUNjMxIDYzMFE2MjkgNjIyIDYyNyA2MTBUNjIzIDU5MlE2MjEgNTg2IDYyMSA1ODZWNTg1SDIzNkwxODggMzYySDUwMVE1MDEgMzYxIDUwMCAzNThRNDk4IDM1MyA0OTcgMzQ2TDQ4OSAzMDlRNDg4IDMwNiA0ODggMzA0VjMwMkgxNzVMMTI0IDYySDUxNFE1MTQgNjEgNTEzIDU4UTUxMSA1MyA1MTAgNDVMNTAyIDdRNTAxIDQgNTAxIDFWMEg0ODlRNDI5IC0zMyA0MDkgLTYwVDM4OSAtMTA4UTM4OSAtMTIzIDM5OCAtMTMyVDQyMiAtMTQxUTQ0NCAtMTQxIDQ1OSAtMTIzUTQ2OSAtMTI1IDQ3NyAtMTMyVDQ4NSAtMTUzUTQ4NSAtMTczIDQ2NyAtMTg2VDQxNyAtMTk5UTM3NyAtMTk5IDM1MiAtMTc3VDMyNiAtMTIwUTMyNiAtODggMzUwIC01N1Q0MjUgMEg0M0wxNzIgNjA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE5OyIgZ2x5cGgtbmFtZT0iZW9nb25layIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1MiAtMTJRMjAxIC0xMiAxNjMgMlQ5OCA0M1Q1OSAxMDRUNDUgMTgyUTQ1IDI0NiA2OCAzMDJUMTMxIDM5OVQyMjYgNDY0VDM0NSA0ODhRNDI2IDQ4OCA0NzAgNDU0VDUxNSAzNjJRNTE1IDMyNiA1MDIgMjk4VDQ1NyAyNTFUMzcyIDIyMVQyMzggMjEwUTE4NSAyMTAgMTEyIDIxNlExMTEgMjA4IDExMSAyMDFUMTExIDE4NlExMTEgMTIzIDE0NyA4NFQyNTQgNDRRMzEwIDQ0IDM0OCA2NFQ0MTUgMTIzUTQxNiAxMjQgNDIxIDEyM1Q0MzMgMTE4VDQ0NCAxMDhUNDQ5IDkyUTQ0OSA4MSA0NDUgNzJUNDI3IDUwUTQwMyAyNiAzNzIgMTFRMzEyIC0yMiAyOTMgLTQ4VDI3MyAtOTZRMjczIC0xMTEgMjgyIC0xMjBUMzA2IC0xMjlRMzI4IC0xMjkgMzQzIC0xMTFRMzUzIC0xMTMgMzYxIC0xMjBUMzY5IC0xNDFRMzY5IC0xNjEgMzUxIC0xNzRUMzAxIC0xODdRMjYxIC0xODcgMjM2IC0xNjVUMjEwIC0xMDhRMjEwIC04MiAyMjQgLTU4VDI3MCAtMTFRMjY1IC0xMiAyNjEgLTEyVDI1MiAtMTJaTTM0MiA0MzFRMzA0IDQzMSAyNzEgNDE5VDIwOSAzODZUMTYwIDMzNVQxMjYgMjcxUTE1NiAyNjcgMTgyIDI2NlQyMzIgMjY1UTI5NiAyNjUgMzM4IDI3M1Q0MDUgMjk0VDQzOSAzMjVUNDQ5IDM2MVE0NDkgMzg3IDQyMyA0MDlUMzQyIDQzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQTsiIGdseXBoLW5hbWU9IkVjYXJvbiIgaG9yaXotYWR2LXg9IjYxMCIgZD0iTTE3MiA2MDZRMTc2IDYyNSAxODcgNjM2VDIxOSA2NDdINjM0UTYzMyA2NDYgNjMzIDY0M1E2MzIgNjQxIDYzMiA2MzhUNjMxIDYzMFE2MjkgNjIyIDYyNyA2MTBUNjIzIDU5MlE2MjEgNTg2IDYyMSA1ODZWNTg1SDIzNkwxODggMzYySDUwMVE1MDEgMzYxIDUwMCAzNThRNDk4IDM1MyA0OTcgMzQ2TDQ4OSAzMDlRNDg4IDMwNiA0ODggMzA0VjMwMkgxNzVMMTI0IDYySDUxNFE1MTQgNjEgNTEzIDU4UTUxMSA1MyA1MTAgNDVMNTAyIDdRNTAxIDQgNTAxIDFWMEg0M0wxNzIgNjA2Wk00MTEgNjk4UTQxMCA2OTggNDA0IDcwM1QzODggNzE4VDM2OSA3MzhUMzQ5IDc2MlEzMjcgNzkxIDMxOSA4MDlUMzEwIDgzOVEzMTAgODUzIDMxNyA4NjBUMzM0IDg2OFEzNTAgODY4IDM2NyA4NDNUNDE5IDc1Nkw0NzAgODA5UTQ5NiA4MzYgNTE3IDg1MlQ1NTIgODY4UTU2MiA4NjggNTY2IDg2M1Q1NzEgODUxUTU3MSA4MzQgNTU0IDgxNFQ1MDQgNzY1UTQ4NyA3NTEgNDcxIDczOVQ0NDIgNzE4VDQyMSA3MDRUNDExIDY5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQjsiIGdseXBoLW5hbWU9ImVjYXJvbiIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1MiAtMTJRMjAxIC0xMiAxNjMgMlQ5OCA0M1Q1OSAxMDRUNDUgMTgyUTQ1IDI0NiA2OCAzMDJUMTMxIDM5OVQyMjYgNDY0VDM0NSA0ODhRNDI2IDQ4OCA0NzAgNDU0VDUxNSAzNjJRNTE1IDMyNiA1MDIgMjk4VDQ1NyAyNTFUMzcyIDIyMVQyMzggMjEwUTE4NSAyMTAgMTEyIDIxNlExMTEgMjA4IDExMSAyMDFUMTExIDE4NlExMTEgMTIzIDE0NyA4NFQyNTQgNDRRMzEwIDQ0IDM0OCA2NFQ0MTUgMTIzUTQxNiAxMjQgNDIxIDEyM1Q0MzMgMTE4VDQ0NCAxMDhUNDQ5IDkyUTQ0OSA4MSA0NDUgNzJUNDI3IDUwUTM5NSAxOCAzNTMgM1QyNTIgLTEyWk0zNDIgNDMxUTMwNCA0MzEgMjcxIDQxOVQyMDkgMzg2VDE2MCAzMzVUMTI2IDI3MVExNTYgMjY3IDE4MiAyNjZUMjMyIDI2NVEyOTYgMjY1IDMzOCAyNzNUNDA1IDI5NFQ0MzkgMzI1VDQ0OSAzNjFRNDQ5IDM4NyA0MjMgNDA5VDM0MiA0MzFaTTMzNSA1MzNRMzM0IDUzMyAzMjggNTM4VDMxMiA1NTNUMjkzIDU3M1QyNzMgNTk3UTI1MSA2MjYgMjQzIDY0NFQyMzQgNjc0UTIzNCA2ODggMjQxIDY5NVQyNTggNzAzUTI3NCA3MDMgMjkxIDY3OFQzNDMgNTkxTDM5NCA2NDRRNDIwIDY3MSA0NDEgNjg3VDQ3NiA3MDNRNDg2IDcwMyA0OTAgNjk4VDQ5NSA2ODZRNDk1IDY2OSA0NzggNjQ5VDQyOCA2MDBRNDExIDU4NiAzOTUgNTc0VDM2NiA1NTNUMzQ1IDUzOVQzMzUgNTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFDOyIgZ2x5cGgtbmFtZT0iR2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NDAiIGQ9Ik0zNjggLTEyUTMwMyAtMTIgMjUwIDZUMTU5IDYwVDk5IDE0N1Q3OCAyNjRRNzggMzQyIDEwNSA0MTNUMTgwIDUzOVQyOTYgNjI2VDQ0MyA2NTlRNTE3IDY1OSA1NjggNjM2VDY0OSA1ODRRNjY2IDU2NyA2NzUgNTQ4VDY4NSA1MTVRNjg1IDQ5OSA2NzggNDkwVDY2MyA0NzdUNjQ3IDQ3M1Q2MzkgNDczUTYyMCA1MjcgNTY4IDU2M1Q0NDIgNTk5UTM3OCA1OTkgMzI1IDU3M1QyMzIgNTAxVDE3MiAzOTdUMTUwIDI3MVExNTAgMjE3IDE2NiAxNzVUMjEwIDEwNVQyNzkgNjJUMzY5IDQ3UTQ2OCA0NyA1MjkgMTA4UTU0MyAxMjIgNTU0IDEzNlQ1NzQgMTY4VDU5MSAyMTBUNjA2IDI2OUgzOTJRMzkyIDI3MCAzOTMgMjczUTM5NCAyNzUgMzk0IDI3N1QzOTYgMjg1UTM5OCAyOTMgNDAwIDMwNVQ0MDQgMzIzUTQwNCAzMjUgNDA0IDMyNlQ0MDUgMzI4VjMzMEg2MzNRNjU2IDMzMCA2NjUgMzE4VDY3MCAyODVMNjA5IC0xUTYwOSAtNCA1OTUgLTRRNTc2IC00IDU2NiAxMVQ1NjMgNjVMNTY1IDc0UTU0MSAzOSA0OTEgMTRUMzY4IC0xMlpNMzMwIDcxNFEzMjAgNzE0IDMxNiA3MTlUMzExIDczMVEzMTEgNzQ4IDMyOCA3NjhUMzc4IDgxN1EzOTQgODMxIDQxMCA4NDNUNDQwIDg2NFQ0NjEgODc4VDQ3MSA4ODRRNDcyIDg4NCA0NzggODc5VDQ5MyA4NjRUNTEyIDg0NFQ1MzMgODIwUTU1NSA3OTEgNTYzIDc3M1Q1NzIgNzQzUTU3MiA3MjkgNTY1IDcyMlQ1NDggNzE0UTUzNSA3MTQgNTIzIDcyOFQ0OTIgNzc1TDQ2MyA4MjZMNDEyIDc3M1EzODYgNzQ2IDM2NSA3MzBUMzMwIDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRDsiIGdseXBoLW5hbWU9ImdjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjAzIiBkPSJNMjI5IC0yMDBRMTY1IC0yMDAgMTIxIC0xODJUNTEgLTEzOFEzMyAtMTIwIDI1IC0xMDRUMTcgLTc0UTE3IC01OCAyNCAtNDhUNDAgLTMzVDU2IC0yN1Q2NCAtMjdRNzggLTc5IDExOCAtMTEwVDIzNSAtMTQxUTMwMSAtMTQxIDM0NSAtMTAzVDQwNyAxNEw0MjMgODhRMzkxIDQ2IDM0OCAyNFQyNDkgMVEyMTEgMSAxNzYgMTRUMTEyIDU0VDY4IDEyMFQ1MSAyMTJRNTEgMjYzIDcxIDMxMlQxMjggNDAxVDIxMyA0NjRUMzE5IDQ4OFEzNzkgNDg4IDQyMyA0NjFUNDg5IDM5M0w1MDcgNDc2SDU3MUw0NzEgOFE0NTAgLTkxIDM5MCAtMTQ1VDIyOSAtMjAwWk0yNTcgNThRMjkxIDU4IDMyMiA3MFQzODAgMTAzVDQyNCAxNTNUNDUxIDIxOUw0NzEgMzA4UTQ1NCAzNjUgNDEzIDM5OFQzMTUgNDMxUTI3MSA0MzEgMjM1IDQxMlQxNzIgMzYxVDEzMiAyOTFUMTE3IDIxMlExMTcgMTc1IDEyOCAxNDdUMTU5IDk5VDIwNCA2OVQyNTcgNThaTTIzOSA1NDlRMjI5IDU0OSAyMjUgNTU0VDIyMCA1NjZRMjIwIDU4MyAyMzcgNjAzVDI4NyA2NTJRMzAzIDY2NiAzMTkgNjc4VDM0OSA2OTlUMzcwIDcxM1QzODAgNzE5UTM4MSA3MTkgMzg3IDcxNFQ0MDIgNjk5VDQyMSA2NzlUNDQyIDY1NVE0NjQgNjI2IDQ3MiA2MDhUNDgxIDU3OFE0ODEgNTY0IDQ3NCA1NTdUNDU3IDU0OVE0NDQgNTQ5IDQzMiA1NjNUNDAxIDYxMEwzNzIgNjYxTDMyMSA2MDhRMjk1IDU4MSAyNzQgNTY1VDIzOSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBnbHlwaC1uYW1lPSJHYnJldmUiIGhvcml6LWFkdi14PSI3NDAiIGQ9Ik0zNjggLTEyUTMwMyAtMTIgMjUwIDZUMTU5IDYwVDk5IDE0N1Q3OCAyNjRRNzggMzQyIDEwNSA0MTNUMTgwIDUzOVQyOTYgNjI2VDQ0MyA2NTlRNTE3IDY1OSA1NjggNjM2VDY0OSA1ODRRNjY2IDU2NyA2NzUgNTQ4VDY4NSA1MTVRNjg1IDQ5OSA2NzggNDkwVDY2MyA0NzdUNjQ3IDQ3M1Q2MzkgNDczUTYyMCA1MjcgNTY4IDU2M1Q0NDIgNTk5UTM3OCA1OTkgMzI1IDU3M1QyMzIgNTAxVDE3MiAzOTdUMTUwIDI3MVExNTAgMjE3IDE2NiAxNzVUMjEwIDEwNVQyNzkgNjJUMzY5IDQ3UTQ2OCA0NyA1MjkgMTA4UTU0MyAxMjIgNTU0IDEzNlQ1NzQgMTY4VDU5MSAyMTBUNjA2IDI2OUgzOTJRMzkyIDI3MCAzOTMgMjczUTM5NCAyNzUgMzk0IDI3N1QzOTYgMjg1UTM5OCAyOTMgNDAwIDMwNVQ0MDQgMzIzUTQwNCAzMjUgNDA0IDMyNlQ0MDUgMzI4VjMzMEg2MzNRNjU2IDMzMCA2NjUgMzE4VDY3MCAyODVMNjA5IC0xUTYwOSAtNCA1OTUgLTRRNTc2IC00IDU2NiAxMVQ1NjMgNjVMNTY1IDc0UTU0MSAzOSA0OTEgMTRUMzY4IC0xMlpNNDQ5IDcxM1E0MjUgNzEzIDQwMiA3MjNUMzU5IDc0OVQzMjggNzg0VDMxNiA4MjBRMzE2IDgzMSAzMjIgODM5VDM0MSA4NDdRMzU3IDg0NyAzODEgODI4VDQ0OCA3NTZRNDk1IDgwNSA1MjQgODI2VDU3MyA4NDdRNTg0IDg0NyA1OTEgODQwVDU5OCA4MjNRNTk4IDgwOCA1ODUgNzg5VDU1MSA3NTNUNTAzIDcyNVQ0NDkgNzEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFGOyIgZ2x5cGgtbmFtZT0iZ2JyZXZlIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNMjI5IC0yMDBRMTY1IC0yMDAgMTIxIC0xODJUNTEgLTEzOFEzMyAtMTIwIDI1IC0xMDRUMTcgLTc0UTE3IC01OCAyNCAtNDhUNDAgLTMzVDU2IC0yN1Q2NCAtMjdRNzggLTc5IDExOCAtMTEwVDIzNSAtMTQxUTMwMSAtMTQxIDM0NSAtMTAzVDQwNyAxNEw0MjMgODhRMzkxIDQ2IDM0OCAyNFQyNDkgMVEyMTEgMSAxNzYgMTRUMTEyIDU0VDY4IDEyMFQ1MSAyMTJRNTEgMjYzIDcxIDMxMlQxMjggNDAxVDIxMyA0NjRUMzE5IDQ4OFEzNzkgNDg4IDQyMyA0NjFUNDg5IDM5M0w1MDcgNDc2SDU3MUw0NzEgOFE0NTAgLTkxIDM5MCAtMTQ1VDIyOSAtMjAwWk0yNTcgNThRMjkxIDU4IDMyMiA3MFQzODAgMTAzVDQyNCAxNTNUNDUxIDIxOUw0NzEgMzA4UTQ1NCAzNjUgNDEzIDM5OFQzMTUgNDMxUTI3MSA0MzEgMjM1IDQxMlQxNzIgMzYxVDEzMiAyOTFUMTE3IDIxMlExMTcgMTc1IDEyOCAxNDdUMTU5IDk5VDIwNCA2OVQyNTcgNThaTTM1NyA1NDhRMzMzIDU0OCAzMTAgNTU4VDI2NyA1ODRUMjM2IDYxOVQyMjQgNjU1UTIyNCA2NjYgMjMwIDY3NFQyNDkgNjgyUTI2NSA2ODIgMjg5IDY2M1QzNTYgNTkxUTQwMyA2NDAgNDMyIDY2MVQ0ODEgNjgyUTQ5MiA2ODIgNDk5IDY3NVQ1MDYgNjU4UTUwNiA2NDMgNDkzIDYyNFQ0NTkgNTg4VDQxMSA1NjBUMzU3IDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMDsiIGdseXBoLW5hbWU9Ikdkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI3NDAiIGQ9Ik0zNjggLTEyUTMwMyAtMTIgMjUwIDZUMTU5IDYwVDk5IDE0N1Q3OCAyNjRRNzggMzQyIDEwNSA0MTNUMTgwIDUzOVQyOTYgNjI2VDQ0MyA2NTlRNTE3IDY1OSA1NjggNjM2VDY0OSA1ODRRNjY2IDU2NyA2NzUgNTQ4VDY4NSA1MTVRNjg1IDQ5OSA2NzggNDkwVDY2MyA0NzdUNjQ3IDQ3M1Q2MzkgNDczUTYyMCA1MjcgNTY4IDU2M1Q0NDIgNTk5UTM3OCA1OTkgMzI1IDU3M1QyMzIgNTAxVDE3MiAzOTdUMTUwIDI3MVExNTAgMjE3IDE2NiAxNzVUMjEwIDEwNVQyNzkgNjJUMzY5IDQ3UTQ2OCA0NyA1MjkgMTA4UTU0MyAxMjIgNTU0IDEzNlQ1NzQgMTY4VDU5MSAyMTBUNjA2IDI2OUgzOTJRMzkyIDI3MCAzOTMgMjczUTM5NCAyNzUgMzk0IDI3N1QzOTYgMjg1UTM5OCAyOTMgNDAwIDMwNVQ0MDQgMzIzUTQwNCAzMjUgNDA0IDMyNlQ0MDUgMzI4VjMzMEg2MzNRNjU2IDMzMCA2NjUgMzE4VDY3MCAyODVMNjA5IC0xUTYwOSAtNCA1OTUgLTRRNTc2IC00IDU2NiAxMVQ1NjMgNjVMNTY1IDc0UTU0MSAzOSA0OTEgMTRUMzY4IC0xMlpNNDQ3IDcxNFEzOTMgNzE0IDM5MyA3NTVRMzkzIDc3OSA0MDYgNzk4VDQ0OSA4MThRNTAzIDgxOCA1MDMgNzc3UTUwMyA3NTMgNDkwIDczNFQ0NDcgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIxOyIgZ2x5cGgtbmFtZT0iZ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTIyOSAtMjAwUTE2NSAtMjAwIDEyMSAtMTgyVDUxIC0xMzhRMzMgLTEyMCAyNSAtMTA0VDE3IC03NFExNyAtNTggMjQgLTQ4VDQwIC0zM1Q1NiAtMjdUNjQgLTI3UTc4IC03OSAxMTggLTExMFQyMzUgLTE0MVEzMDEgLTE0MSAzNDUgLTEwM1Q0MDcgMTRMNDIzIDg4UTM5MSA0NiAzNDggMjRUMjQ5IDFRMjExIDEgMTc2IDE0VDExMiA1NFQ2OCAxMjBUNTEgMjEyUTUxIDI2MyA3MSAzMTJUMTI4IDQwMVQyMTMgNDY0VDMxOSA0ODhRMzc5IDQ4OCA0MjMgNDYxVDQ4OSAzOTNMNTA3IDQ3Nkg1NzFMNDcxIDhRNDUwIC05MSAzOTAgLTE0NVQyMjkgLTIwMFpNMjU3IDU4UTI5MSA1OCAzMjIgNzBUMzgwIDEwM1Q0MjQgMTUzVDQ1MSAyMTlMNDcxIDMwOFE0NTQgMzY1IDQxMyAzOThUMzE1IDQzMVEyNzEgNDMxIDIzNSA0MTJUMTcyIDM2MVQxMzIgMjkxVDExNyAyMTJRMTE3IDE3NSAxMjggMTQ3VDE1OSA5OVQyMDQgNjlUMjU3IDU4Wk0zNTUgNTQ5UTMwMSA1NDkgMzAxIDU5MFEzMDEgNjE0IDMxNCA2MzNUMzU3IDY1M1E0MTEgNjUzIDQxMSA2MTJRNDExIDU4OCAzOTggNTY5VDM1NSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjI7IiBnbHlwaC1uYW1lPSJHY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI3NDAiIGQ9Ik0zNjggLTEyUTMwMyAtMTIgMjUwIDZUMTU5IDYwVDk5IDE0N1Q3OCAyNjRRNzggMzQyIDEwNSA0MTNUMTgwIDUzOVQyOTYgNjI2VDQ0MyA2NTlRNTE3IDY1OSA1NjggNjM2VDY0OSA1ODRRNjY2IDU2NyA2NzUgNTQ4VDY4NSA1MTVRNjg1IDQ5OSA2NzggNDkwVDY2MyA0NzdUNjQ3IDQ3M1Q2MzkgNDczUTYyMCA1MjcgNTY4IDU2M1Q0NDIgNTk5UTM3OCA1OTkgMzI1IDU3M1QyMzIgNTAxVDE3MiAzOTdUMTUwIDI3MVExNTAgMjE3IDE2NiAxNzVUMjEwIDEwNVQyNzkgNjJUMzY5IDQ3UTQ2OCA0NyA1MjkgMTA4UTU0MyAxMjIgNTU0IDEzNlQ1NzQgMTY4VDU5MSAyMTBUNjA2IDI2OUgzOTJRMzkyIDI3MCAzOTMgMjczUTM5NCAyNzUgMzk0IDI3N1QzOTYgMjg1UTM5OCAyOTMgNDAwIDMwNVQ0MDQgMzIzUTQwNCAzMjUgNDA0IDMyNlQ0MDUgMzI4VjMzMEg2MzNRNjU2IDMzMCA2NjUgMzE4VDY3MCAyODVMNjA5IC0xUTYwOSAtNCA1OTUgLTRRNTc2IC00IDU2NiAxMVQ1NjMgNjVMNTY1IDc0UTU0MSAzOSA0OTEgMTRUMzY4IC0xMlpNMjQ0IC0yMzRRMjQxIC0yMzcgMjM1IC0yMzZUMjI0IC0yMzBUMjE2IC0yMjJUMjE0IC0yMTRMMzIxIC00N1EzMjIgLTQ2IDMzMSAtNDdUMzUwIC01MlQzNzAgLTYzVDM3OSAtODNRMzc5IC0xMDUgMzU3IC0xMjhMMjQ0IC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjM7IiBnbHlwaC1uYW1lPSJnY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik0yMjkgLTIwMFExNjUgLTIwMCAxMjEgLTE4MlQ1MSAtMTM4UTMzIC0xMjAgMjUgLTEwNFQxNyAtNzRRMTcgLTU4IDI0IC00OFQ0MCAtMzNUNTYgLTI3VDY0IC0yN1E3OCAtNzkgMTE4IC0xMTBUMjM1IC0xNDFRMzAxIC0xNDEgMzQ1IC0xMDNUNDA3IDE0TDQyMyA4OFEzOTEgNDYgMzQ4IDI0VDI0OSAxUTIxMSAxIDE3NiAxNFQxMTIgNTRUNjggMTIwVDUxIDIxMlE1MSAyNjMgNzEgMzEyVDEyOCA0MDFUMjEzIDQ2NFQzMTkgNDg4UTM3OSA0ODggNDIzIDQ2MVQ0ODkgMzkzTDUwNyA0NzZINTcxTDQ3MSA4UTQ1MCAtOTEgMzkwIC0xNDVUMjI5IC0yMDBaTTI1NyA1OFEyOTEgNTggMzIyIDcwVDM4MCAxMDNUNDI0IDE1M1Q0NTEgMjE5TDQ3MSAzMDhRNDU0IDM2NSA0MTMgMzk4VDMxNSA0MzFRMjcxIDQzMSAyMzUgNDEyVDE3MiAzNjFUMTMyIDI5MVQxMTcgMjEyUTExNyAxNzUgMTI4IDE0N1QxNTkgOTlUMjA0IDY5VDI1NyA1OFpNNDAxIDY4N1E0MDQgNjkwIDQxMCA2ODlUNDIxIDY4M1Q0MjkgNjc1VDQzMSA2NjdMMzI0IDUwMFEzMjMgNDk5IDMxNCA1MDBUMjk1IDUwNVQyNzUgNTE2VDI2NiA1MzZRMjY2IDU1OCAyODggNTgxTDQwMSA2ODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjQ7IiBnbHlwaC1uYW1lPSJIY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTE3NSA2MjBRMTc5IDYzNiAxODYgNjQzVDIwOSA2NTFIMjE4UTIzMyA2NTEgMjM5IDY0MlQyNDIgNjE2TDE4NyAzNTVINTY0TDYyMCA2MjBRNjI0IDYzNiA2MzEgNjQzVDY1NCA2NTFINjYzUTY3OCA2NTEgNjg0IDY0MlQ2ODcgNjE2TDU1NiAwSDQ4OUw1NTEgMjkzSDE3NEwxMTEgMEg0NEwxNzUgNjIwWk0zMjEgNzE0UTMxMSA3MTQgMzA3IDcxOVQzMDIgNzMxUTMwMiA3NDggMzE5IDc2OFQzNjkgODE3UTM4NSA4MzEgNDAxIDg0M1Q0MzEgODY0VDQ1MiA4NzhUNDYyIDg4NFE0NjMgODg0IDQ2OSA4NzlUNDg0IDg2NFQ1MDMgODQ0VDUyNCA4MjBRNTQ2IDc5MSA1NTQgNzczVDU2MyA3NDNRNTYzIDcyOSA1NTYgNzIyVDUzOSA3MTRRNTI2IDcxNCA1MTQgNzI4VDQ4MyA3NzVMNDU0IDgyNkw0MDMgNzczUTM3NyA3NDYgMzU2IDczMFQzMjEgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI1OyIgZ2x5cGgtbmFtZT0iaGNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik00NTMgLThRNDIzIC04IDQwNiAxMVQzODkgNjNRMzg5IDg0IDM5NiAxMThUNDE1IDE5MFE0MjYgMjI4IDQzMyAyNjFUNDQwIDMxNVE0NDAgMzY3IDQxMiAzOTdUMzMxIDQyN1EyNzYgNDI3IDIzNyAzOTlUMTY0IDMxMkw5OCAwSDMzTDE3MSA2NTBRMTc1IDY2NyAxODIgNjc0VDIwMSA2ODFIMjA5UTIyMiA2ODEgMjMxIDY3NVQyMzYgNjUwTDE4MiAzOTdRMjA4IDQ0MCAyNTAgNDY0VDM0MCA0ODhRMzc5IDQ4OCA0MTAgNDc2VDQ2MiA0NDJUNDk1IDM5MVQ1MDcgMzI3UTUwNyAzMDEgNDk4IDI2MlQ0NzggMTgxUTQ2NyAxNDQgNDYxIDExNlQ0NTQgNzNRNDU0IDUzIDQ2NCA0NlQ0OTYgMzZRNDk3IDM2IDQ5NyAyOVQ0OTMgMTRUNDgwIC0xVDQ1MyAtOFpNMTAxIDcxNFE5MSA3MTQgODcgNzE5VDgyIDczMVE4MiA3NDggOTkgNzY4VDE0OSA4MTdRMTY1IDgzMSAxODEgODQzVDIxMSA4NjRUMjMyIDg3OFQyNDIgODg0UTI0MyA4ODQgMjQ5IDg3OVQyNjQgODY0VDI4MyA4NDRUMzA0IDgyMFEzMjYgNzkxIDMzNCA3NzNUMzQzIDc0M1EzNDMgNzI5IDMzNiA3MjJUMzE5IDcxNFEzMDYgNzE0IDI5NCA3MjhUMjYzIDc3NUwyMzQgODI2TDE4MyA3NzNRMTU3IDc0NiAxMzYgNzMwVDEwMSA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjY7IiBnbHlwaC1uYW1lPSJIYmFyIiBob3Jpei1hZHYteD0iNzAxIiBkPSJNMTAxIDQ2OVE3MCA0NjkgNzAgNDg3UTcwIDQ5NSA3MyA1MDVUODIgNTIxUTg5IDUyOSAxMDggNTI5SDE1NUwxNzUgNjIwUTE3OSA2MzYgMTg2IDY0M1QyMDkgNjUxSDIxOFEyMzMgNjUxIDIzOSA2NDJUMjQyIDYxNkwyMjMgNTI5SDYwMEw2MjAgNjIwUTYyNCA2MzYgNjMxIDY0M1Q2NTQgNjUxSDY2M1E2NzggNjUxIDY4NCA2NDJUNjg3IDYxNkw2NjggNTI5SDcwOVE3NDAgNTI5IDc0MCA1MTFRNzQwIDUwMyA3MzcgNDkzVDcyOCA0NzdRNzIxIDQ2OSA3MDIgNDY5SDY1NUw1NTYgMEg0ODlMNTUxIDI5M0gxNzRMMTExIDBINDRMMTQzIDQ2OUgxMDFaTTU2NCAzNTVMNTg4IDQ2OUgyMTFMMTg3IDM1NUg1NjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjc7IiBnbHlwaC1uYW1lPSJoYmFyIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMTA5IDU2NlE3OCA1NjYgNzggNTg0UTc4IDU5MiA4MSA2MDNUOTAgNjIwUTk3IDYyOCAxMTYgNjI4SDE2NkwxNzEgNjUwUTE3NSA2NjcgMTgyIDY3NFQyMDEgNjgxSDIwOVEyMjIgNjgxIDIzMSA2NzVUMjM2IDY1MEwyMzEgNjI4SDMyNlEzNTcgNjI4IDM1NyA2MTBRMzU3IDYwMiAzNTQgNTkxVDM0NSA1NzRRMzM4IDU2NiAzMTkgNTY2SDIxOEwxODIgMzk3UTIwOCA0NDAgMjUwIDQ2NFQzNDAgNDg4UTM3OSA0ODggNDEwIDQ3NlQ0NjIgNDQyVDQ5NSAzOTFUNTA3IDMyN1E1MDcgMzAxIDQ5OCAyNjJUNDc4IDE4MVE0NjcgMTQ0IDQ2MSAxMTZUNDU0IDczUTQ1NCA1MyA0NjQgNDZUNDk2IDM2UTQ5NyAzNiA0OTcgMjlUNDkzIDE0VDQ4MCAtMVQ0NTMgLThRNDIzIC04IDQwNiAxMVQzODkgNjNRMzg5IDg0IDM5NiAxMThUNDE1IDE5MFE0MjYgMjI4IDQzMyAyNjFUNDQwIDMxNVE0NDAgMzY3IDQxMiAzOTdUMzMxIDQyN1EyNzYgNDI3IDIzNyAzOTlUMTY0IDMxMkw5OCAwSDMzTDE1MyA1NjZIMTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI4OyIgZ2x5cGgtbmFtZT0iSXRpbGRlIiBob3Jpei1hZHYteD0iMjc2IiBkPSJNMTg3IDYxOVExOTQgNjUxIDIyMSA2NTFIMjMwUTI0NSA2NTEgMjUxIDY0MlQyNTMgNjE1TDEyMiAwSDU1TDE4NyA2MTlaTTMwOSA2NzNRMjg1IDY3MyAyNDcgNjk0VDE3MCA3NTNRMTY0IDc0MCAxNTggNzI3VDE0NSA3MDRUMTMxIDY4N1QxMTYgNjgwUTEwNCA2ODAgOTkgNjg2VDkzIDcwMFE5MyA3MTcgMTAwIDczNFQxMTggNzY1VDE0MyA3ODdUMTczIDc5NlExOTcgNzk2IDIzNSA3NzVUMzEyIDcxNlEzMTggNzI5IDMyNCA3NDJUMzM3IDc2NVQzNTEgNzgyVDM2NiA3ODlRMzc4IDc4OSAzODMgNzgzVDM4OSA3NjlRMzg5IDc1MiAzODIgNzM1VDM2NCA3MDRUMzM5IDY4MlQzMDkgNjczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI5OyIgZ2x5cGgtbmFtZT0iaXRpbGRlIiBob3Jpei1hZHYteD0iMjQzIiBkPSJNMTI2IC04UTgxIC04IDY1IDE5VDYwIDEwMEwxNDAgNDc2SDIwNUwxMjUgMTAxUTExNyA2NiAxMjYgNTJUMTczIDM3UTE3MyAzNyAxNzMgMzBUMTY5IDE1VDE1NSAtMVQxMjYgLThaTTI2MCA1NDhRMjM2IDU0OCAxOTggNTY5VDEyMSA2MjhRMTE1IDYxNSAxMDkgNjAyVDk2IDU3OVQ4MiA1NjJUNjcgNTU1UTU1IDU1NSA1MCA1NjFUNDQgNTc1UTQ0IDU5MiA1MSA2MDlUNjkgNjQwVDk0IDY2MlQxMjQgNjcxUTE0OCA2NzEgMTg2IDY1MFQyNjMgNTkxUTI2OSA2MDQgMjc1IDYxN1QyODggNjQwVDMwMiA2NTdUMzE3IDY2NFEzMjkgNjY0IDMzNCA2NThUMzQwIDY0NFEzNDAgNjI3IDMzMyA2MTBUMzE1IDU3OVQyOTAgNTU3VDI2MCA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkE7IiBnbHlwaC1uYW1lPSJJbWFjcm9uIiBob3Jpei1hZHYteD0iMjc2IiBkPSJNMTg3IDYxOVExOTQgNjUxIDIyMSA2NTFIMjMwUTI0NSA2NTEgMjUxIDY0MlQyNTMgNjE1TDEyMiAwSDU1TDE4NyA2MTlaTTE0MSA3MzNRMTEwIDczMyAxMTAgNzUxUTExMCA3NTkgMTEzIDc3MFQxMjIgNzg3UTEyOSA3OTUgMTQ4IDc5NUgzNjhRMzk5IDc5NSAzOTkgNzc3UTM5OSA3NjkgMzk2IDc1OFQzODcgNzQxUTM4MCA3MzMgMzYxIDczM0gxNDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkI7IiBnbHlwaC1uYW1lPSJpbWFjcm9uIiBob3Jpei1hZHYteD0iMjQzIiBkPSJNMTI2IC04UTgxIC04IDY1IDE5VDYwIDEwMEwxNDAgNDc2SDIwNUwxMjUgMTAxUTExNyA2NiAxMjYgNTJUMTczIDM3UTE3MyAzNyAxNzMgMzBUMTY5IDE1VDE1NSAtMVQxMjYgLThaTTgyIDU2OFE1MSA1NjggNTEgNTg2UTUxIDU5NCA1NCA2MDVUNjMgNjIyUTcwIDYzMCA4OSA2MzBIMzA5UTM0MCA2MzAgMzQwIDYxMlEzNDAgNjA0IDMzNyA1OTNUMzI4IDU3NlEzMjEgNTY4IDMwMiA1NjhIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkU7IiBnbHlwaC1uYW1lPSJJb2dvbmVrIiBob3Jpei1hZHYteD0iMjc2IiBkPSJNMTg3IDYxOVExOTQgNjUxIDIyMSA2NTFIMjMwUTI0NSA2NTEgMjUxIDY0MlQyNTMgNjE1TDEyMiAwSDExMVE3OSAtMTcgNTkgLTMyVDI2IC02MlQxMCAtODhUNSAtMTExUTUgLTEyNiAxNCAtMTM1VDM4IC0xNDRRNjAgLTE0NCA3NSAtMTI2UTg1IC0xMjggOTMgLTEzNVQxMDEgLTE1NlExMDEgLTE3NiA4MyAtMTg5VDMzIC0yMDJRLTcgLTIwMiAtMzIgLTE4MFQtNTggLTEyM1EtNTggLTg4IC0zMSAtNTVUNTYgNEwxODcgNjE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJGOyIgZ2x5cGgtbmFtZT0iaW9nb25layIgaG9yaXotYWR2LXg9IjI0MyIgZD0iTTE3MyAzN1ExNzMgMzcgMTczIDMyVDE3MCAxOVQxNjEgNVQxNDIgLTZRMTEzIC0yMiA5NSAtMzdUNjUgLTY1VDUwIC05MFQ0NiAtMTEyUTQ2IC0xMjcgNTUgLTEzNlQ3OSAtMTQ1UTEwMSAtMTQ1IDExNiAtMTI3UTEyNiAtMTI5IDEzNCAtMTM2VDE0MiAtMTU3UTE0MiAtMTc3IDEyNCAtMTkwVDc0IC0yMDNRMzQgLTIwMyA5IC0xODFULTE3IC0xMjRRLTE3IC05MSA4IC01OVQ4OCAtMVE0MiAyMCA2MCAxMDBMMTQwIDQ3NkgyMDVMMTI1IDEwMVExMTcgNjYgMTI2IDUyVDE3MyAzN1pNMjA3IDU5NlExNjMgNTk2IDE2MyA2MjlRMTYzIDY0OSAxNzQgNjY0VDIwOSA2ODBRMjUzIDY4MCAyNTMgNjQ3UTI1MyA2MjcgMjQyIDYxMlQyMDcgNTk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMwOyIgZ2x5cGgtbmFtZT0iSWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjI3NiIgZD0iTTE4NyA2MTlRMTk0IDY1MSAyMjEgNjUxSDIzMFEyNDUgNjUxIDI1MSA2NDJUMjUzIDYxNUwxMjIgMEg1NUwxODcgNjE5Wk0yNDggNzE0UTE5NCA3MTQgMTk0IDc1NVExOTQgNzc5IDIwNyA3OThUMjUwIDgxOFEzMDQgODE4IDMwNCA3NzdRMzA0IDc1MyAyOTEgNzM0VDI0OCA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzE7IiBnbHlwaC1uYW1lPSJkb3RsZXNzaSIgaG9yaXotYWR2LXg9IjI0MyIgZD0iTTEyNiAtOFE4MSAtOCA2NSAxOVQ2MCAxMDBMMTQwIDQ3NkgyMDVMMTI1IDEwMVExMTcgNjYgMTI2IDUyVDE3MyAzN1ExNzMgMzcgMTczIDMwVDE2OSAxNVQxNTUgLTFUMTI2IC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMyOyIgZ2x5cGgtbmFtZT0iSUoiIGhvcml6LWFkdi14PSI3NDciIGQ9Ik0xODcgNjE5UTE5NCA2NTEgMjIxIDY1MUgyMzBRMjQ1IDY1MSAyNTEgNjQyVDI1MyA2MTVMMTIyIDBINTVMMTg3IDYxOVpNNDUxIC0xMlE0MDYgLTEyIDM3NSAyVDMyMyAzNlEzMDkgNTAgMzA0IDYwVDI5OSA4MFEyOTkgOTIgMzA1IDEwMFQzMTggMTE0VDMzMSAxMjBUMzM4IDEyMVEzNTMgODggMzgzIDY4VDQ1MiA0N1E1MDggNDcgNTM4IDgxVDU4NiAxOTRMNjgzIDY0N0g3NTBMNjUyIDE4NVE2MzAgODQgNTgyIDM2VDQ1MSAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzM7IiBnbHlwaC1uYW1lPSJpaiIgaG9yaXotYWR2LXg9IjQ4NiIgZD0iTTEyNiAtOFE4MSAtOCA2NSAxOVQ2MCAxMDBMMTQwIDQ3NkgyMDVMMTI1IDEwMVExMTcgNjYgMTI2IDUyVDE3MyAzN1ExNzMgMzcgMTczIDMwVDE2OSAxNVQxNTUgLTFUMTI2IC04Wk0yMDcgNTk2UTE2MyA1OTYgMTYzIDYyOVExNjMgNjQ5IDE3NCA2NjRUMjA5IDY4MFEyNTMgNjgwIDI1MyA2NDdRMjUzIDYyNyAyNDIgNjEyVDIwNyA1OTZaTTE5MiAtMjAzUTE2MSAtMjAzIDE0MSAtMTk1VDEwOSAtMTc2UTk1IC0xNjIgOTUgLTE0OFE5NSAtMTM5IDk5IC0xMzFUMTA4IC0xMThUMTE3IC0xMDlUMTIyIC0xMDdRMTMzIC0xMjMgMTUyIC0xMzRUMTk0IC0xNDVRMjIzIC0xNDUgMjQxIC0xMjhUMjY5IC02MkwzODMgNDc2SDQ0OEwzMzEgLTc0UTMxNyAtMTQyIDI4MCAtMTcyVDE5MiAtMjAzWk00NTAgNTk2UTQwNiA1OTYgNDA2IDYyOVE0MDYgNjQ5IDQxNyA2NjRUNDUyIDY4MFE0OTYgNjgwIDQ5NiA2NDdRNDk2IDYyNyA0ODUgNjEyVDQ1MCA1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzQ7IiBnbHlwaC1uYW1lPSJKY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ3MSIgZD0iTTE3NSAtMTJRMTMwIC0xMiA5OSAyVDQ3IDM2UTMzIDUwIDI4IDYwVDIzIDgwUTIzIDkyIDI5IDEwMFQ0MiAxMTRUNTUgMTIwVDYyIDEyMVE3NyA4OCAxMDcgNjhUMTc2IDQ3UTIzMiA0NyAyNjIgODFUMzEwIDE5NEw0MDcgNjQ3SDQ3NEwzNzYgMTg1UTM1NCA4NCAzMDYgMzZUMTc1IC0xMlpNMzQ1IDcxNFEzMzUgNzE0IDMzMSA3MTlUMzI2IDczMVEzMjYgNzQ4IDM0MyA3NjhUMzkzIDgxN1E0MDkgODMxIDQyNSA4NDNUNDU1IDg2NFQ0NzYgODc4VDQ4NiA4ODRRNDg3IDg4NCA0OTMgODc5VDUwOCA4NjRUNTI3IDg0NFQ1NDggODIwUTU3MCA3OTEgNTc4IDc3M1Q1ODcgNzQzUTU4NyA3MjkgNTgwIDcyMlQ1NjMgNzE0UTU1MCA3MTQgNTM4IDcyOFQ1MDcgNzc1TDQ3OCA4MjZMNDI3IDc3M1E0MDEgNzQ2IDM4MCA3MzBUMzQ1IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGdseXBoLW5hbWU9ImpjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjQzIiBkPSJNLTUxIC0yMDNRLTgyIC0yMDMgLTEwMiAtMTk1VC0xMzQgLTE3NlEtMTQ4IC0xNjIgLTE0OCAtMTQ4US0xNDggLTEzOSAtMTQ0IC0xMzFULTEzNSAtMTE4VC0xMjYgLTEwOVQtMTIxIC0xMDdRLTExMCAtMTIzIC05MSAtMTM0VC00OSAtMTQ1US0yMCAtMTQ1IC0yIC0xMjhUMjYgLTYyTDE0MCA0NzZIMjA1TDg4IC03NFE3NCAtMTQyIDM3IC0xNzJULTUxIC0yMDNaTTgxIDU0OVE3MSA1NDkgNjcgNTU0VDYyIDU2NlE2MiA1ODMgNzkgNjAzVDEyOSA2NTJRMTQ1IDY2NiAxNjEgNjc4VDE5MSA2OTlUMjEyIDcxM1QyMjIgNzE5UTIyMyA3MTkgMjI5IDcxNFQyNDQgNjk5VDI2MyA2NzlUMjg0IDY1NVEzMDYgNjI2IDMxNCA2MDhUMzIzIDU3OFEzMjMgNTY0IDMxNiA1NTdUMjk5IDU0OVEyODYgNTQ5IDI3NCA1NjNUMjQzIDYxMEwyMTQgNjYxTDE2MyA2MDhRMTM3IDU4MSAxMTYgNTY1VDgxIDU0OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNjsiIGdseXBoLW5hbWU9Iktjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTQ2NyAtNVE0NTQgLTUgNDQyIDBUNDE3IDE3VDM4OSA0N1QzNTQgOTNMMTgxIDMyOEwxMTAgMEg0M0wxNzUgNjIwUTE3OSA2MzcgMTg2IDY0NFQyMDkgNjUxSDIxOFEyNTAgNjUxIDI0MiA2MTZMMTg1IDM0Nkw1NzAgNjU5UTU3MSA2NjAgNTgxIDY1NlQ1OTcgNjQxVDU5OSA2MTVUNTY1IDU3NUwyNTYgMzI4TDQxNyAxMTZRNDM0IDkzIDQ0NiA3OVQ0NzAgNTZUNDkxIDQ0VDUxNSAzOVE1MTYgMzkgNTE2IDMyVDUxMiAxN1Q0OTggMlQ0NjcgLTVaTTEzOCAtMjM0UTEzNSAtMjM3IDEyOSAtMjM2VDExOCAtMjMwVDExMCAtMjIyVDEwOCAtMjE0TDIxNSAtNDdRMjE2IC00NiAyMjUgLTQ3VDI0NCAtNTJUMjY0IC02M1QyNzMgLTgzUTI3MyAtMTA1IDI1MSAtMTI4TDEzOCAtMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM3OyIgZ2x5cGgtbmFtZT0ia2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNDc1IiBkPSJNMzY0IC04UTM0OSAtOCAzMzggLTRUMzEzIDExVDI4NSA0NFQyNDYgMTAwTDE1MCAyNDVMOTggMEgzM0wxNzcgNjc3SDI0MkwxNTMgMjYwTDQzNiA0ODhRNDM3IDQ4OSA0NDcgNDg1VDQ2MiA0NzBUNDY0IDQ0NFQ0MzEgNDA2TDIyNCAyNDJMMzA5IDExN1EzMjUgOTIgMzM3IDc4VDM2MCA1N1QzODMgNDhUNDEyIDQ1UTQxMyA0NSA0MTMgMzdUNDA5IDE5VDM5NSAxVDM2NCAtOFpNOTMgLTIzNFE5MCAtMjM3IDg0IC0yMzZUNzMgLTIzMFQ2NSAtMjIyVDYzIC0yMTRMMTcwIC00N1ExNzEgLTQ2IDE4MCAtNDdUMTk5IC01MlQyMTkgLTYzVDIyOCAtODNRMjI4IC0xMDUgMjA2IC0xMjhMOTMgLTIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzOTsiIGdseXBoLW5hbWU9IkxhY3V0ZSIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTE3NSA2MjBRMTc5IDYzNiAxODYgNjQzVDIwOSA2NTFIMjE4UTIzMyA2NTEgMjM5IDY0MlQyNDIgNjE2TDEyNCA2Mkg0MzJRNDYzIDYyIDQ2MyA0NVE0NjMgMzcgNDU5IDI1VDQ1MCA3UTQ0NCAwIDQyNCAwSDQzTDE3NSA2MjBaTTIwNCA3MTZRMjAzIDcxOCAyMTYgNzMyVDI1MCA3NjVUMjk3IDgwNlQzNDggODQyUTM3MiA4NTcgMzk0IDg1N1E0MDcgODU3IDQxNSA4NDlUNDIzIDgyOVE0MjMgODA1IDM4MiA3ODFRMzU0IDc2NSAzMjQgNzUyVDI2NyA3MzBUMjIzIDcxOFQyMDQgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNBOyIgZ2x5cGgtbmFtZT0ibGFjdXRlIiBob3Jpei1hZHYteD0iMjQzIiBkPSJNMTI2IC04UTgxIC04IDY1IDE5VDYwIDEwMEwxODMgNjc3SDI0OEwxMjUgMTAxUTExNyA2NiAxMjYgNTJUMTczIDM3UTE3MyAzNyAxNzMgMzBUMTY5IDE1VDE1NSAtMVQxMjYgLThaTTE5NCA3MTZRMTkzIDcxOCAyMDYgNzMyVDI0MCA3NjVUMjg3IDgwNlQzMzggODQyUTM2MiA4NTcgMzg0IDg1N1EzOTcgODU3IDQwNSA4NDlUNDEzIDgyOVE0MTMgODA1IDM3MiA3ODFRMzQ0IDc2NSAzMTQgNzUyVDI1NyA3MzBUMjEzIDcxOFQxOTQgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNCOyIgZ2x5cGgtbmFtZT0iTGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMTc1IDYyMFExNzkgNjM2IDE4NiA2NDNUMjA5IDY1MUgyMThRMjMzIDY1MSAyMzkgNjQyVDI0MiA2MTZMMTI0IDYySDQzMlE0NjMgNjIgNDYzIDQ1UTQ2MyAzNyA0NTkgMjVUNDUwIDdRNDQ0IDAgNDI0IDBINDNMMTc1IDYyMFpNMTQxIC0yMzRRMTM4IC0yMzcgMTMyIC0yMzZUMTIxIC0yMzBUMTEzIC0yMjJUMTExIC0yMTRMMjE4IC00N1EyMTkgLTQ2IDIyOCAtNDdUMjQ3IC01MlQyNjcgLTYzVDI3NiAtODNRMjc2IC0xMDUgMjU0IC0xMjhMMTQxIC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0M7IiBnbHlwaC1uYW1lPSJsY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSIyNDMiIGQ9Ik0xMjYgLThRODEgLTggNjUgMTlUNjAgMTAwTDE4MyA2NzdIMjQ4TDEyNSAxMDFRMTE3IDY2IDEyNiA1MlQxNzMgMzdRMTczIDM3IDE3MyAzMFQxNjkgMTVUMTU1IC0xVDEyNiAtOFpNLTUgLTIzNFEtOCAtMjM3IC0xNCAtMjM2VC0yNSAtMjMwVC0zMyAtMjIyVC0zNSAtMjE0TDcyIC00N1E3MyAtNDYgODIgLTQ3VDEwMSAtNTJUMTIxIC02M1QxMzAgLTgzUTEzMCAtMTA1IDEwOCAtMTI4TC01IC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Q7IiBnbHlwaC1uYW1lPSJMY2Fyb24iIGhvcml6LWFkdi14PSI2MzUiIGQ9Ik0xNzUgNjIwUTE3OSA2MzYgMTg2IDY0M1QyMDkgNjUxSDIxOFEyMzMgNjUxIDIzOSA2NDJUMjQyIDYxNkwxMjQgNjJINDMyUTQ2MyA2MiA0NjMgNDVRNDYzIDM3IDQ1OSAyNVQ0NTAgN1E0NDQgMCA0MjQgMEg0M0wxNzUgNjIwWk01MTIgNDIyUTUxMCA0MTkgNTA0IDQyMFQ0OTMgNDI1VDQ4NCA0MzNUNDgyIDQ0Mkw1OTggNjYyUTU5OSA2NjMgNjA4IDY2M1Q2MjkgNjYwVDY1MCA2NDlUNjYwIDYyOVE2NjAgNjE4IDY1NiA2MDhUNjQxIDU4NEw1MTIgNDIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNFOyIgZ2x5cGgtbmFtZT0ibGNhcm9uIiBob3Jpei1hZHYteD0iNDA0IiBkPSJNMTI2IC04UTgxIC04IDY1IDE5VDYwIDEwMEwxODMgNjc3SDI0OEwxMjUgMTAxUTExNyA2NiAxMjYgNTJUMTczIDM3UTE3MyAzNyAxNzMgMzBUMTY5IDE1VDE1NSAtMVQxMjYgLThaTTI4MSA0MzdRMjc5IDQzNCAyNzMgNDM1VDI2MiA0NDBUMjUzIDQ0OFQyNTEgNDU3TDM2NyA2NzdRMzY4IDY3OCAzNzcgNjc4VDM5OCA2NzVUNDE5IDY2NFQ0MjkgNjQ0UTQyOSA2MzMgNDI1IDYyM1Q0MTAgNTk5TDI4MSA0MzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBnbHlwaC1uYW1lPSJMZG90IiBob3Jpei1hZHYteD0iNjI2IiBkPSJNMTc1IDYyMFExNzkgNjM2IDE4NiA2NDNUMjA5IDY1MUgyMThRMjMzIDY1MSAyMzkgNjQyVDI0MiA2MTZMMTI0IDYySDQzMlE0NjMgNjIgNDYzIDQ1UTQ2MyAzNyA0NTkgMjVUNDUwIDdRNDQ0IDAgNDI0IDBINDNMMTc1IDYyMFpNNTU5IDI3NlE1MzYgMjc2IDUyNCAyODVUNTExIDMxMFE1MTEgMzQ2IDUyNyAzNjJRNTQwIDM3NSA1NjQgMzc1UTU4NyAzNzUgNTk5IDM2NlQ2MTIgMzQxUTYxMiAzMDUgNTk2IDI4OVE1ODMgMjc2IDU1OSAyNzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDA7IiBnbHlwaC1uYW1lPSJsZG90IiBob3Jpei1hZHYteD0iNDAyIiBkPSJNMTI2IC04UTgxIC04IDY1IDE5VDYwIDEwMEwxODMgNjc3SDI0OEwxMjUgMTAxUTExNyA2NiAxMjYgNTJUMTczIDM3UTE3MyAzNyAxNzMgMzBUMTY5IDE1VDE1NSAtMVQxMjYgLThaTTMxMCAxOTVRMjg3IDE5NSAyNzUgMjA0VDI2MiAyMjlRMjYyIDI2NSAyNzggMjgxUTI5MSAyOTQgMzE1IDI5NFEzMzggMjk0IDM1MCAyODVUMzYzIDI2MFEzNjMgMjI0IDM0NyAyMDhRMzM0IDE5NSAzMTAgMTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQxOyIgZ2x5cGgtbmFtZT0iQ1IiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik0xMjYgMFExMDMgMCA5NCAxMlQ4OSA0NUwxMjkgMjM0TDQ5IDIxMVE0NyAyMDkgNDEgMjE5VDM1IDI0MVEzNSAyNTMgNDQgMjYzVDgwIDI4MkwxNDMgMzAwTDIxMSA2MjBRMjE1IDYzNiAyMjIgNjQzVDI0NSA2NTFIMjU0UTI2OSA2NTEgMjc1IDY0MlQyNzggNjE2TDIxNSAzMjBMNDI1IDM4MFE0MjggMzgxIDQzMyAzNzJUNDM5IDM1MFE0MzkgMzM4IDQyOSAzMjhUMzk0IDMwOUwyMDEgMjU0TDE2MCA2Mkg0NjhRNDk5IDYyIDQ5OSA0NVE0OTkgMzcgNDk1IDI1VDQ4NiA3UTQ4MCAwIDQ2MCAwSDEyNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MjsiIGdseXBoLW5hbWU9ImxzbGFzaCIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTE4MCAtOFExMzUgLTggMTE5IDE5VDExNCAxMDBMMTQ1IDI0NEw0OSAyMTdRNDcgMjE2IDQxIDIyN1QzNSAyNDhRMzUgMjU5IDQ0IDI2OVQ3OSAyODdMMTU5IDMxMEwyMzEgNjUwUTIzNSA2NjcgMjQyIDY3NFQyNjEgNjgxSDI2OVEyODIgNjgxIDI5MSA2NzVUMjk2IDY1MEwyMjggMzI5TDMzMiAzNTlRMzM0IDM2MCAzNDAgMzQ5VDM0NiAzMjhRMzQ2IDMxNyAzMzcgMzA3VDMwMiAyODlMMjE0IDI2NEwxNzkgMTAxUTE3MSA2NiAxODAgNTJUMjI3IDM3UTIyNyAzNyAyMjcgMzBUMjIzIDE1VDIwOSAtMVQxODAgLThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDM7IiBnbHlwaC1uYW1lPSJOYWN1dGUiIGhvcml6LWFkdi14PSI3MDkiIGQ9Ik0xNzIgNjA1UTE3NyA2MjYgMTg5IDYzOFQyMjAgNjUxSDIzN1EyNTQgNjUxIDI2MiA2NDJUMjgwIDYxNUw1MjIgMTAxTDYzOSA2NDdINzAyTDU3MiAzN1E1NjggMTkgNTU3IDhUNTI4IC00SDUyMVE1MDYgLTQgNDk3IDVUNDc5IDMyTDIyNyA1NjZMMTA2IDBINDNMMTcyIDYwNVpNMzk5IDcxNlEzOTggNzE4IDQxMSA3MzJUNDQ1IDc2NVQ0OTIgODA2VDU0MyA4NDJRNTY3IDg1NyA1ODkgODU3UTYwMiA4NTcgNjEwIDg0OVQ2MTggODI5UTYxOCA4MDUgNTc3IDc4MVE1NDkgNzY1IDUxOSA3NTJUNDYyIDczMFQ0MTggNzE4VDM5OSA3MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDQ7IiBnbHlwaC1uYW1lPSJuYWN1dGUiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik00NTMgLThRNDIzIC04IDQwNiAxMVQzODkgNjNRMzg5IDg0IDM5NiAxMThUNDE1IDE5MFE0MjYgMjI4IDQzMyAyNjFUNDQwIDMxNVE0NDAgMzY3IDQxMiAzOTdUMzMxIDQyN1EyNzYgNDI3IDIzNyAzOTlUMTY0IDMxMkw5OCAwSDMzTDEzNSA0NzdRMTM1IDQ4MCAxNDkgNDgwUTE1OCA0ODAgMTY2IDQ3N1QxODAgNDY3VDE4NyA0NDZUMTg1IDQxMUwxODIgMzk4UTIwOSA0NDEgMjUwIDQ2NFQzNDAgNDg4UTM3OSA0ODggNDEwIDQ3NlQ0NjIgNDQyVDQ5NSAzOTFUNTA3IDMyN1E1MDcgMzAxIDQ5OCAyNjJUNDc4IDE4MVE0NjcgMTQ0IDQ2MSAxMTZUNDU0IDczUTQ1NCA1MyA0NjQgNDZUNDk2IDM2UTQ5NyAzNiA0OTcgMjlUNDkzIDE0VDQ4MCAtMVQ0NTMgLThaTTI3NyA1NTFRMjc2IDU1MyAyODkgNTY3VDMyMyA2MDBUMzcwIDY0MVQ0MjEgNjc3UTQ0NSA2OTIgNDY3IDY5MlE0ODAgNjkyIDQ4OCA2ODRUNDk2IDY2NFE0OTYgNjQwIDQ1NSA2MTZRNDI3IDYwMCAzOTcgNTg3VDM0MCA1NjVUMjk2IDU1M1QyNzcgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ1OyIgZ2x5cGgtbmFtZT0iTmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNzA5IiBkPSJNMTcyIDYwNVExNzcgNjI2IDE4OSA2MzhUMjIwIDY1MUgyMzdRMjU0IDY1MSAyNjIgNjQyVDI4MCA2MTVMNTIyIDEwMUw2MzkgNjQ3SDcwMkw1NzIgMzdRNTY4IDE5IDU1NyA4VDUyOCAtNEg1MjFRNTA2IC00IDQ5NyA1VDQ3OSAzMkwyMjcgNTY2TDEwNiAwSDQzTDE3MiA2MDVaTTIwNCAtMjM0UTIwMSAtMjM3IDE5NSAtMjM2VDE4NCAtMjMwVDE3NiAtMjIyVDE3NCAtMjE0TDI4MSAtNDdRMjgyIC00NiAyOTEgLTQ3VDMxMCAtNTJUMzMwIC02M1QzMzkgLTgzUTMzOSAtMTA1IDMxNyAtMTI4TDIwNCAtMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ2OyIgZ2x5cGgtbmFtZT0ibmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNNDUzIC04UTQyMyAtOCA0MDYgMTFUMzg5IDYzUTM4OSA4NCAzOTYgMTE4VDQxNSAxOTBRNDI2IDIyOCA0MzMgMjYxVDQ0MCAzMTVRNDQwIDM2NyA0MTIgMzk3VDMzMSA0MjdRMjc2IDQyNyAyMzcgMzk5VDE2NCAzMTJMOTggMEgzM0wxMzUgNDc3UTEzNSA0ODAgMTQ5IDQ4MFExNTggNDgwIDE2NiA0NzdUMTgwIDQ2N1QxODcgNDQ2VDE4NSA0MTFMMTgyIDM5OFEyMDkgNDQxIDI1MCA0NjRUMzQwIDQ4OFEzNzkgNDg4IDQxMCA0NzZUNDYyIDQ0MlQ0OTUgMzkxVDUwNyAzMjdRNTA3IDMwMSA0OTggMjYyVDQ3OCAxODFRNDY3IDE0NCA0NjEgMTE2VDQ1NCA3M1E0NTQgNTMgNDY0IDQ2VDQ5NiAzNlE0OTcgMzYgNDk3IDI5VDQ5MyAxNFQ0ODAgLTFUNDUzIC04Wk0xNTkgLTIzNFExNTYgLTIzNyAxNTAgLTIzNlQxMzkgLTIzMFQxMzEgLTIyMlQxMjkgLTIxNEwyMzYgLTQ3UTIzNyAtNDYgMjQ2IC00N1QyNjUgLTUyVDI4NSAtNjNUMjk0IC04M1EyOTQgLTEwNSAyNzIgLTEyOEwxNTkgLTIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NzsiIGdseXBoLW5hbWU9Ik5jYXJvbiIgaG9yaXotYWR2LXg9IjcwOSIgZD0iTTE3MiA2MDVRMTc3IDYyNiAxODkgNjM4VDIyMCA2NTFIMjM3UTI1NCA2NTEgMjYyIDY0MlQyODAgNjE1TDUyMiAxMDFMNjM5IDY0N0g3MDJMNTcyIDM3UTU2OCAxOSA1NTcgOFQ1MjggLTRINTIxUTUwNiAtNCA0OTcgNVQ0NzkgMzJMMjI3IDU2NkwxMDYgMEg0M0wxNzIgNjA1Wk00NTAgNjk4UTQ0OSA2OTggNDQzIDcwM1Q0MjcgNzE4VDQwOCA3MzhUMzg4IDc2MlEzNjYgNzkxIDM1OCA4MDlUMzQ5IDgzOVEzNDkgODUzIDM1NiA4NjBUMzczIDg2OFEzODkgODY4IDQwNiA4NDNUNDU4IDc1Nkw1MDkgODA5UTUzNSA4MzYgNTU2IDg1MlQ1OTEgODY4UTYwMSA4NjggNjA1IDg2M1Q2MTAgODUxUTYxMCA4MzQgNTkzIDgxNFQ1NDMgNzY1UTUyNiA3NTEgNTEwIDczOVQ0ODEgNzE4VDQ2MCA3MDRUNDUwIDY5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGdseXBoLW5hbWU9Im5jYXJvbiIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTQ1MyAtOFE0MjMgLTggNDA2IDExVDM4OSA2M1EzODkgODQgMzk2IDExOFQ0MTUgMTkwUTQyNiAyMjggNDMzIDI2MVQ0NDAgMzE1UTQ0MCAzNjcgNDEyIDM5N1QzMzEgNDI3UTI3NiA0MjcgMjM3IDM5OVQxNjQgMzEyTDk4IDBIMzNMMTM1IDQ3N1ExMzUgNDgwIDE0OSA0ODBRMTU4IDQ4MCAxNjYgNDc3VDE4MCA0NjdUMTg3IDQ0NlQxODUgNDExTDE4MiAzOThRMjA5IDQ0MSAyNTAgNDY0VDM0MCA0ODhRMzc5IDQ4OCA0MTAgNDc2VDQ2MiA0NDJUNDk1IDM5MVQ1MDcgMzI3UTUwNyAzMDEgNDk4IDI2MlQ0NzggMTgxUTQ2NyAxNDQgNDYxIDExNlQ0NTQgNzNRNDU0IDUzIDQ2NCA0NlQ0OTYgMzZRNDk3IDM2IDQ5NyAyOVQ0OTMgMTRUNDgwIC0xVDQ1MyAtOFpNMzUyIDUzM1EzNTEgNTMzIDM0NSA1MzhUMzI5IDU1M1QzMTAgNTczVDI5MCA1OTdRMjY4IDYyNiAyNjAgNjQ0VDI1MSA2NzRRMjUxIDY4OCAyNTggNjk1VDI3NSA3MDNRMjkxIDcwMyAzMDggNjc4VDM2MCA1OTFMNDExIDY0NFE0MzcgNjcxIDQ1OCA2ODdUNDkzIDcwM1E1MDMgNzAzIDUwNyA2OThUNTEyIDY4NlE1MTIgNjY5IDQ5NSA2NDlUNDQ1IDYwMFE0MjggNTg2IDQxMiA1NzRUMzgzIDU1M1QzNjIgNTM5VDM1MiA1MzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDk7IiBnbHlwaC1uYW1lPSJuYXBvc3Ryb3BoZSIgaG9yaXotYWR2LXg9IjgwNyIgZD0iTTExMyA0MjJRMTExIDQxOSAxMDUgNDIwVDk0IDQyNVQ4NSA0MzNUODMgNDQyTDE5OSA2NjJRMjAwIDY2MyAyMDkgNjYzVDIzMCA2NjBUMjUxIDY0OVQyNjEgNjI5UTI2MSA2MTggMjU3IDYwOFQyNDIgNTg0TDExMyA0MjJaTTY4OSAtOFE2NTkgLTggNjQyIDExVDYyNSA2M1E2MjUgODQgNjMyIDExOFQ2NTEgMTkwUTY2MiAyMjggNjY5IDI2MVQ2NzYgMzE1UTY3NiAzNjcgNjQ4IDM5N1Q1NjcgNDI3UTUxMiA0MjcgNDczIDM5OVQ0MDAgMzEyTDMzNCAwSDI2OUwzNzEgNDc3UTM3MSA0ODAgMzg1IDQ4MFEzOTQgNDgwIDQwMiA0NzdUNDE2IDQ2N1Q0MjMgNDQ2VDQyMSA0MTFMNDE4IDM5OFE0NDUgNDQxIDQ4NiA0NjRUNTc2IDQ4OFE2MTUgNDg4IDY0NiA0NzZUNjk4IDQ0MlQ3MzEgMzkxVDc0MyAzMjdRNzQzIDMwMSA3MzQgMjYyVDcxNCAxODFRNzAzIDE0NCA2OTcgMTE2VDY5MCA3M1E2OTAgNTMgNzAwIDQ2VDczMiAzNlE3MzMgMzYgNzMzIDI5VDcyOSAxNFQ3MTYgLTFUNjg5IC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRDOyIgZ2x5cGgtbmFtZT0iT21hY3JvbiIgaG9yaXotYWR2LXg9Ijc2NiIgZD0iTTM2NiAtMTFRMjk5IC0xMSAyNDYgMTBUMTU2IDY5VDk4IDE1OFQ3OCAyNjlRNzggMzU1IDEwOCA0MjZUMTg5IDU1MFQzMDQgNjMwVDQzNiA2NTlRNTAzIDY1OSA1NTYgNjM4VDY0NiA1NzlUNzA0IDQ5MFQ3MjQgMzc5UTcyNCAyOTMgNjk0IDIyMlQ2MTMgOThUNDk4IDE4VDM2NiAtMTFaTTM3MyA0OFE0MjQgNDggNDc0IDcyVDU2MyAxMzlUNjI3IDI0MlQ2NTIgMzc0UTY1MiA0MjAgNjM4IDQ2MVQ1OTUgNTMzVDUyNSA1ODJUNDI5IDYwMFEzNzggNjAwIDMyOCA1NzZUMjM5IDUwOVQxNzUgNDA2VDE1MCAyNzRRMTUwIDIyNyAxNjQgMTg2VDIwNyAxMTVUMjc3IDY2VDM3MyA0OFpNMzQxIDczM1EzMTAgNzMzIDMxMCA3NTFRMzEwIDc1OSAzMTMgNzcwVDMyMiA3ODdRMzI5IDc5NSAzNDggNzk1SDU2OFE1OTkgNzk1IDU5OSA3NzdRNTk5IDc2OSA1OTYgNzU4VDU4NyA3NDFRNTgwIDczMyA1NjEgNzMzSDM0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RDsiIGdseXBoLW5hbWU9Im9tYWNyb24iIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0yNjggLTEyUTIyMyAtMTIgMTgzIDRUMTEzIDQ5VDY2IDExOVQ0OSAyMDlRNDkgMjY0IDY5IDMxNVQxMjUgNDA0VDIxMCA0NjVUMzE3IDQ4OFEzNjIgNDg4IDQwMiA0NzJUNDcyIDQyN1Q1MTkgMzU3VDUzNiAyNjdRNTM2IDIxMSA1MTYgMTYxVDQ2MCA3MlQzNzUgMTFUMjY4IC0xMlpNMjcyIDQ1UTMxNCA0NSAzNTAgNjNUNDEyIDExMVQ0NTQgMTgxVDQ3MCAyNjVRNDcwIDMwMSA0NTggMzMxVDQyNSAzODRUMzc1IDQxOFQzMTMgNDMxUTI3MSA0MzEgMjM1IDQxM1QxNzMgMzY1VDEzMSAyOTVUMTE1IDIxMVExMTUgMTc1IDEyNyAxNDVUMTYwIDkyVDIxMCA1OFQyNzIgNDVaTTIyNSA1NjhRMTk0IDU2OCAxOTQgNTg2UTE5NCA1OTQgMTk3IDYwNVQyMDYgNjIyUTIxMyA2MzAgMjMyIDYzMEg0NTJRNDgzIDYzMCA0ODMgNjEyUTQ4MyA2MDQgNDgwIDU5M1Q0NzEgNTc2UTQ2NCA1NjggNDQ1IDU2OEgyMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEU7IiBnbHlwaC1uYW1lPSJPYnJldmUiIGhvcml6LWFkdi14PSI3NjYiIGQ9Ik0zNjYgLTExUTI5OSAtMTEgMjQ2IDEwVDE1NiA2OVQ5OCAxNThUNzggMjY5UTc4IDM1NSAxMDggNDI2VDE4OSA1NTBUMzA0IDYzMFQ0MzYgNjU5UTUwMyA2NTkgNTU2IDYzOFQ2NDYgNTc5VDcwNCA0OTBUNzI0IDM3OVE3MjQgMjkzIDY5NCAyMjJUNjEzIDk4VDQ5OCAxOFQzNjYgLTExWk0zNzMgNDhRNDI0IDQ4IDQ3NCA3MlQ1NjMgMTM5VDYyNyAyNDJUNjUyIDM3NFE2NTIgNDIwIDYzOCA0NjFUNTk1IDUzM1Q1MjUgNTgyVDQyOSA2MDBRMzc4IDYwMCAzMjggNTc2VDIzOSA1MDlUMTc1IDQwNlQxNTAgMjc0UTE1MCAyMjcgMTY0IDE4NlQyMDcgMTE1VDI3NyA2NlQzNzMgNDhaTTQ2NiA3MTNRNDQyIDcxMyA0MTkgNzIzVDM3NiA3NDlUMzQ1IDc4NFQzMzMgODIwUTMzMyA4MzEgMzM5IDgzOVQzNTggODQ3UTM3NCA4NDcgMzk4IDgyOFQ0NjUgNzU2UTUxMiA4MDUgNTQxIDgyNlQ1OTAgODQ3UTYwMSA4NDcgNjA4IDg0MFQ2MTUgODIzUTYxNSA4MDggNjAyIDc4OVQ1NjggNzUzVDUyMCA3MjVUNDY2IDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RjsiIGdseXBoLW5hbWU9Im9icmV2ZSIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTI2OCAtMTJRMjIzIC0xMiAxODMgNFQxMTMgNDlUNjYgMTE5VDQ5IDIwOVE0OSAyNjQgNjkgMzE1VDEyNSA0MDRUMjEwIDQ2NVQzMTcgNDg4UTM2MiA0ODggNDAyIDQ3MlQ0NzIgNDI3VDUxOSAzNTdUNTM2IDI2N1E1MzYgMjExIDUxNiAxNjFUNDYwIDcyVDM3NSAxMVQyNjggLTEyWk0yNzIgNDVRMzE0IDQ1IDM1MCA2M1Q0MTIgMTExVDQ1NCAxODFUNDcwIDI2NVE0NzAgMzAxIDQ1OCAzMzFUNDI1IDM4NFQzNzUgNDE4VDMxMyA0MzFRMjcxIDQzMSAyMzUgNDEzVDE3MyAzNjVUMTMxIDI5NVQxMTUgMjExUTExNSAxNzUgMTI3IDE0NVQxNjAgOTJUMjEwIDU4VDI3MiA0NVpNMzMzIDU0OFEzMDkgNTQ4IDI4NiA1NThUMjQzIDU4NFQyMTIgNjE5VDIwMCA2NTVRMjAwIDY2NiAyMDYgNjc0VDIyNSA2ODJRMjQxIDY4MiAyNjUgNjYzVDMzMiA1OTFRMzc5IDY0MCA0MDggNjYxVDQ1NyA2ODJRNDY4IDY4MiA0NzUgNjc1VDQ4MiA2NThRNDgyIDY0MyA0NjkgNjI0VDQzNSA1ODhUMzg3IDU2MFQzMzMgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUwOyIgZ2x5cGgtbmFtZT0iT2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9Ijc2NiIgZD0iTTM2NiAtMTFRMjk5IC0xMSAyNDYgMTBUMTU2IDY5VDk4IDE1OFQ3OCAyNjlRNzggMzU1IDEwOCA0MjZUMTg5IDU1MFQzMDQgNjMwVDQzNiA2NTlRNTAzIDY1OSA1NTYgNjM4VDY0NiA1NzlUNzA0IDQ5MFQ3MjQgMzc5UTcyNCAyOTMgNjk0IDIyMlQ2MTMgOThUNDk4IDE4VDM2NiAtMTFaTTM3MyA0OFE0MjQgNDggNDc0IDcyVDU2MyAxMzlUNjI3IDI0MlQ2NTIgMzc0UTY1MiA0MjAgNjM4IDQ2MVQ1OTUgNTMzVDUyNSA1ODJUNDI5IDYwMFEzNzggNjAwIDMyOCA1NzZUMjM5IDUwOVQxNzUgNDA2VDE1MCAyNzRRMTUwIDIyNyAxNjQgMTg2VDIwNyAxMTVUMjc3IDY2VDM3MyA0OFpNNTAxIDcxNlE0OTkgNzE4IDUwOSA3MzJUNTM4IDc2NVQ1NzkgODA1VDYyNiA4NDRRNjUwIDg2MiA2NzIgODYyUTY4NCA4NjIgNjkzIDg1NVQ3MDIgODM1UTcwMiA4MTAgNjY1IDc4NVE2NDAgNzY4IDYxMiA3NTRUNTYwIDczMVQ1MjAgNzE4VDUwMSA3MTZaTTMyMiA3MTZRMzIwIDcxOCAzMzAgNzMyVDM1OSA3NjVUNDAwIDgwNVQ0NDcgODQ0UTQ3MSA4NjIgNDkzIDg2MlE1MDUgODYyIDUxNCA4NTVUNTIzIDgzNVE1MjMgODEwIDQ4NiA3ODVRNDYxIDc2OCA0MzMgNzU0VDM4MSA3MzFUMzQxIDcxOFQzMjIgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUxOyIgZ2x5cGgtbmFtZT0ib2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTI2OCAtMTJRMjIzIC0xMiAxODMgNFQxMTMgNDlUNjYgMTE5VDQ5IDIwOVE0OSAyNjQgNjkgMzE1VDEyNSA0MDRUMjEwIDQ2NVQzMTcgNDg4UTM2MiA0ODggNDAyIDQ3MlQ0NzIgNDI3VDUxOSAzNTdUNTM2IDI2N1E1MzYgMjExIDUxNiAxNjFUNDYwIDcyVDM3NSAxMVQyNjggLTEyWk0yNzIgNDVRMzE0IDQ1IDM1MCA2M1Q0MTIgMTExVDQ1NCAxODFUNDcwIDI2NVE0NzAgMzAxIDQ1OCAzMzFUNDI1IDM4NFQzNzUgNDE4VDMxMyA0MzFRMjcxIDQzMSAyMzUgNDEzVDE3MyAzNjVUMTMxIDI5NVQxMTUgMjExUTExNSAxNzUgMTI3IDE0NVQxNjAgOTJUMjEwIDU4VDI3MiA0NVpNMzcwIDU1MVEzNjggNTUzIDM3OCA1NjdUNDA3IDYwMFQ0NDggNjQwVDQ5NSA2NzlRNTE5IDY5NyA1NDEgNjk3UTU1MyA2OTcgNTYyIDY5MFQ1NzEgNjcwUTU3MSA2NDUgNTM0IDYyMFE1MDkgNjAzIDQ4MSA1ODlUNDI5IDU2NlQzODkgNTUzVDM3MCA1NTFaTTE5MSA1NTFRMTg5IDU1MyAxOTkgNTY3VDIyOCA2MDBUMjY5IDY0MFQzMTYgNjc5UTM0MCA2OTcgMzYyIDY5N1EzNzQgNjk3IDM4MyA2OTBUMzkyIDY3MFEzOTIgNjQ1IDM1NSA2MjBRMzMwIDYwMyAzMDIgNTg5VDI1MCA1NjZUMjEwIDU1M1QxOTEgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUyOyIgZ2x5cGgtbmFtZT0iT0UiIGhvcml6LWFkdi14PSIxMDU1IiBkPSJNMzY2IC0xMVEyOTkgLTExIDI0NiAxMFQxNTYgNjlUOTggMTU4VDc4IDI2OVE3OCAzNTUgMTA4IDQyNlQxODkgNTUwVDMwNCA2MzBUNDM2IDY1OVE0ODMgNjU5IDUyNCA2NDdIMTA2NFExMDYzIDY0NiAxMDYzIDY0M1ExMDYyIDY0MSAxMDYyIDYzOFQxMDYxIDYzMFExMDU5IDYyMiAxMDU3IDYxMFQxMDUzIDU5MlExMDUyIDU4OSAxMDUyIDU4NlExMDUyIDU4NSAxMDUxIDU4NUg2MzZRNjc4IDU0NyA3MDEgNDk1VDcyNCAzNzlWMzYySDkzM1E5MzIgMzYxIDkzMiAzNThROTMxIDM1NiA5MzEgMzUzVDkzMCAzNDZROTI4IDMzOCA5MjYgMzI2VDkyMiAzMDlROTIxIDMwNiA5MjEgMzA0UTkyMSAzMDMgOTIwIDMwMkg3MTdRNzAyIDIyNiA2NjIgMTY1VDU2NyA2Mkg5NDVROTQ0IDYxIDk0NCA1OFE5NDMgNTYgOTQzIDUzVDk0MiA0NVE5NDAgMzcgOTM4IDI1VDkzNCA3UTkzMyA0IDkzMyAxUTkzMyAwIDkzMiAwSDQ0NVE0MDQgLTExIDM2NiAtMTFaTTM3MyA0OFE0MjQgNDggNDc0IDcyVDU2MyAxMzlUNjI3IDI0MlQ2NTIgMzc0UTY1MiA0MjAgNjM4IDQ2MVQ1OTUgNTMzVDUyNSA1ODJUNDI5IDYwMFEzNzggNjAwIDMyOCA1NzZUMjM5IDUwOVQxNzUgNDA2VDE1MCAyNzRRMTUwIDIyNyAxNjQgMTg2VDIwNyAxMTVUMjc3IDY2VDM3MyA0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MzsiIGdseXBoLW5hbWU9Im9lIiBob3Jpei1hZHYteD0iOTU4IiBkPSJNNTE4IDM0M1E1NTYgNDA5IDYyMSA0NDhUNzY0IDQ4OFE4NDUgNDg4IDg4OSA0NTRUOTM0IDM2MlE5MzQgMzI2IDkyMSAyOThUODc2IDI1MVQ3OTEgMjIxVDY1NyAyMTBRNjA0IDIxMCA1MzEgMjE2UTUzMCAyMDggNTMwIDIwMVQ1MzAgMTg2UTUzMCAxMjMgNTY2IDg0VDY3MyA0NFE3MjkgNDQgNzY3IDY0VDgzNCAxMjNRODM1IDEyNCA4NDAgMTIzVDg1MiAxMThUODYzIDEwOFQ4NjggOTJRODY4IDgxIDg2NCA3MlQ4NDYgNTBRODE0IDE4IDc3MiAzVDY3MSAtMTJRNTk4IC0xMiA1NTAgMjJUNDg0IDExMFE0NDkgNTYgMzkzIDIyVDI2NiAtMTJRMjIxIC0xMiAxODIgM1QxMTMgNDdUNjYgMTE3VDQ5IDIwOVE0OSAyNjQgNjkgMzE1VDEyNCA0MDRUMjA4IDQ2NVQzMTQgNDg4UTM4NiA0ODggNDQxIDQ1MFQ1MTggMzQzWk0yNzIgNDVRMzE0IDQ1IDM1MCA2M1Q0MTIgMTExVDQ1NCAxODFUNDcwIDI2NVE0NzAgMzAxIDQ1OCAzMzFUNDI1IDM4NFQzNzUgNDE4VDMxMyA0MzFRMjcxIDQzMSAyMzUgNDEzVDE3MyAzNjVUMTMxIDI5NVQxMTUgMjExUTExNSAxNzUgMTI3IDE0NVQxNjAgOTJUMjEwIDU4VDI3MiA0NVpNNzYxIDQzMVE3MjMgNDMxIDY5MCA0MTlUNjI4IDM4NlQ1NzkgMzM1VDU0NSAyNzFRNTc1IDI2NyA2MDEgMjY2VDY1MSAyNjVRNzE1IDI2NSA3NTcgMjczVDgyNCAyOTRUODU4IDMyNVQ4NjggMzYxUTg2OCAzODcgODQyIDQwOVQ3NjEgNDMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU0OyIgZ2x5cGgtbmFtZT0iUmFjdXRlIiBob3Jpei1hZHYteD0iNjAxIiBkPSJNMzM3IDI3Mkw0MjYgMTE4UTQ0OCA3OSA0NjcgNjFUNTIxIDQzUTUyMiA0MyA1MjIgMzZUNTE4IDE5VDUwNCAzVDQ3MyAtNVE0NjAgLTUgNDQ4IC0xVDQyMyAxM1QzOTYgNDNUMzY1IDkyTDI2NCAyNzJIMTY5TDExMCAwSDQzTDE3MiA2MDZRMTc4IDY0NyAyMTkgNjQ3SDM3N1E0ODIgNjQ3IDUzNyA2MDdUNTkyIDQ4OFE1OTIgMzg1IDUyNyAzMjlUMzQ4IDI3MkgzMzdaTTM1MCAzMzBRNDMxIDMzMCA0NzYgMzY5VDUyMSA0ODFRNTIxIDUzMyA0ODMgNTYwVDM3MyA1ODdIMjM2TDE4MSAzMzBIMzUwWk0zMTcgNzE2UTMxNiA3MTggMzI5IDczMlQzNjMgNzY1VDQxMCA4MDZUNDYxIDg0MlE0ODUgODU3IDUwNyA4NTdRNTIwIDg1NyA1MjggODQ5VDUzNiA4MjlRNTM2IDgwNSA0OTUgNzgxUTQ2NyA3NjUgNDM3IDc1MlQzODAgNzMwVDMzNiA3MThUMzE3IDcxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGdseXBoLW5hbWU9InJhY3V0ZSIgaG9yaXotYWR2LXg9IjM3MiIgZD0iTTEzNSA0NzdRMTM1IDQ4MCAxNDkgNDgwUTE1OCA0ODAgMTY2IDQ3N1QxODAgNDY3VDE4NyA0NDZUMTg1IDQxMUwxODEgMzkyUTIwNiA0NDAgMjM4IDQ2NFQzMTUgNDg4UTM0MyA0ODggMzYzIDQ3NlQzODQgNDQzUTM4NCA0MzEgMzgwIDQyM1QzNzIgNDA5VDM2MyA0MDFUMzU4IDQwMFEzNDggNDExIDMzNCA0MThUMjk2IDQyNlEyNjcgNDI2IDI0MyA0MDlUMjAwIDM2MFQxNjUgMjg3VDEzOSAxOTRMOTggMEgzM0wxMzUgNDc3Wk0xODYgNTUxUTE4NSA1NTMgMTk4IDU2N1QyMzIgNjAwVDI3OSA2NDFUMzMwIDY3N1EzNTQgNjkyIDM3NiA2OTJRMzg5IDY5MiAzOTcgNjg0VDQwNSA2NjRRNDA1IDY0MCAzNjQgNjE2UTMzNiA2MDAgMzA2IDU4N1QyNDkgNTY1VDIwNSA1NTNUMTg2IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NjsiIGdseXBoLW5hbWU9IlJjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjYwMSIgZD0iTTMzNyAyNzJMNDI2IDExOFE0NDggNzkgNDY3IDYxVDUyMSA0M1E1MjIgNDMgNTIyIDM2VDUxOCAxOVQ1MDQgM1Q0NzMgLTVRNDYwIC01IDQ0OCAtMVQ0MjMgMTNUMzk2IDQzVDM2NSA5MkwyNjQgMjcySDE2OUwxMTAgMEg0M0wxNzIgNjA2UTE3OCA2NDcgMjE5IDY0N0gzNzdRNDgyIDY0NyA1MzcgNjA3VDU5MiA0ODhRNTkyIDM4NSA1MjcgMzI5VDM0OCAyNzJIMzM3Wk0zNTAgMzMwUTQzMSAzMzAgNDc2IDM2OVQ1MjEgNDgxUTUyMSA1MzMgNDgzIDU2MFQzNzMgNTg3SDIzNkwxODEgMzMwSDM1MFpNMTU0IC0yMzRRMTUxIC0yMzcgMTQ1IC0yMzZUMTM0IC0yMzBUMTI2IC0yMjJUMTI0IC0yMTRMMjMxIC00N1EyMzIgLTQ2IDI0MSAtNDdUMjYwIC01MlQyODAgLTYzVDI4OSAtODNRMjg5IC0xMDUgMjY3IC0xMjhMMTU0IC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTc7IiBnbHlwaC1uYW1lPSJyY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSIzNzIiIGQ9Ik0xMzUgNDc3UTEzNSA0ODAgMTQ5IDQ4MFExNTggNDgwIDE2NiA0NzdUMTgwIDQ2N1QxODcgNDQ2VDE4NSA0MTFMMTgxIDM5MlEyMDYgNDQwIDIzOCA0NjRUMzE1IDQ4OFEzNDMgNDg4IDM2MyA0NzZUMzg0IDQ0M1EzODQgNDMxIDM4MCA0MjNUMzcyIDQwOVQzNjMgNDAxVDM1OCA0MDBRMzQ4IDQxMSAzMzQgNDE4VDI5NiA0MjZRMjY3IDQyNiAyNDMgNDA5VDIwMCAzNjBUMTY1IDI4N1QxMzkgMTk0TDk4IDBIMzNMMTM1IDQ3N1pNLTQwIC0yMzRRLTQzIC0yMzcgLTQ5IC0yMzZULTYwIC0yMzBULTY4IC0yMjJULTcwIC0yMTRMMzcgLTQ3UTM4IC00NiA0NyAtNDdUNjYgLTUyVDg2IC02M1Q5NSAtODNROTUgLTEwNSA3MyAtMTI4TC00MCAtMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU4OyIgZ2x5cGgtbmFtZT0iUmNhcm9uIiBob3Jpei1hZHYteD0iNjAxIiBkPSJNMzM3IDI3Mkw0MjYgMTE4UTQ0OCA3OSA0NjcgNjFUNTIxIDQzUTUyMiA0MyA1MjIgMzZUNTE4IDE5VDUwNCAzVDQ3MyAtNVE0NjAgLTUgNDQ4IC0xVDQyMyAxM1QzOTYgNDNUMzY1IDkyTDI2NCAyNzJIMTY5TDExMCAwSDQzTDE3MiA2MDZRMTc4IDY0NyAyMTkgNjQ3SDM3N1E0ODIgNjQ3IDUzNyA2MDdUNTkyIDQ4OFE1OTIgMzg1IDUyNyAzMjlUMzQ4IDI3MkgzMzdaTTM1MCAzMzBRNDMxIDMzMCA0NzYgMzY5VDUyMSA0ODFRNTIxIDUzMyA0ODMgNTYwVDM3MyA1ODdIMjM2TDE4MSAzMzBIMzUwWk0zNzggNjk4UTM3NyA2OTggMzcxIDcwM1QzNTUgNzE4VDMzNiA3MzhUMzE2IDc2MlEyOTQgNzkxIDI4NiA4MDlUMjc3IDgzOVEyNzcgODUzIDI4NCA4NjBUMzAxIDg2OFEzMTcgODY4IDMzNCA4NDNUMzg2IDc1Nkw0MzcgODA5UTQ2MyA4MzYgNDg0IDg1MlQ1MTkgODY4UTUyOSA4NjggNTMzIDg2M1Q1MzggODUxUTUzOCA4MzQgNTIxIDgxNFQ0NzEgNzY1UTQ1NCA3NTEgNDM4IDczOVQ0MDkgNzE4VDM4OCA3MDRUMzc4IDY5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1OTsiIGdseXBoLW5hbWU9InJjYXJvbiIgaG9yaXotYWR2LXg9IjM3MiIgZD0iTTEzNSA0NzdRMTM1IDQ4MCAxNDkgNDgwUTE1OCA0ODAgMTY2IDQ3N1QxODAgNDY3VDE4NyA0NDZUMTg1IDQxMUwxODEgMzkyUTIwNiA0NDAgMjM4IDQ2NFQzMTUgNDg4UTM0MyA0ODggMzYzIDQ3NlQzODQgNDQzUTM4NCA0MzEgMzgwIDQyM1QzNzIgNDA5VDM2MyA0MDFUMzU4IDQwMFEzNDggNDExIDMzNCA0MThUMjk2IDQyNlEyNjcgNDI2IDI0MyA0MDlUMjAwIDM2MFQxNjUgMjg3VDEzOSAxOTRMOTggMEgzM0wxMzUgNDc3Wk0yNTIgNTMzUTI1MSA1MzMgMjQ1IDUzOFQyMjkgNTUzVDIxMCA1NzNUMTkwIDU5N1ExNjggNjI2IDE2MCA2NDRUMTUxIDY3NFExNTEgNjg4IDE1OCA2OTVUMTc1IDcwM1ExOTEgNzAzIDIwOCA2NzhUMjYwIDU5MUwzMTEgNjQ0UTMzNyA2NzEgMzU4IDY4N1QzOTMgNzAzUTQwMyA3MDMgNDA3IDY5OFQ0MTIgNjg2UTQxMiA2NjkgMzk1IDY0OVQzNDUgNjAwUTMyOCA1ODYgMzEyIDU3NFQyODMgNTUzVDI2MiA1MzlUMjUyIDUzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QTsiIGdseXBoLW5hbWU9IlNhY3V0ZSIgaG9yaXotYWR2LXg9IjU2NyIgZD0iTTI2OSAtMTJRMjAxIC0xMiAxNDkgOVQ2NSA2MVE0OCA3OCAzOCA5NlQyOCAxMzNRMjggMTQ2IDM0IDE1NFQ0OCAxNjZUNjMgMTcwVDcwIDE3MFE5MyAxMTMgMTQzIDgwVDI3MyA0N1EzNTEgNDcgMzg4IDc5VDQyNiAxNjhRNDI2IDE5MyA0MTUgMjEyVDM4NSAyNDVUMzQwIDI3MlQyODQgMjk2UTI1MyAzMDkgMjIzIDMyM1QxNjkgMzU5VDEzMSA0MDlUMTE2IDQ4MFExMTYgNTE3IDEzMSA1NTBUMTc0IDYwN1QyNDMgNjQ1VDMzMyA2NTlRNDAxIDY1OSA0NDggNjQwVDUyMSA1OTVRNTUzIDU2MyA1NTMgNTI5UTU1MyA1MTYgNTQ3IDUwOVQ1MzQgNDk3VDUyMCA0OTJUNTEyIDQ5M1E0OTIgNTQxIDQ0OCA1NzBUMzMwIDYwMFEyOTggNjAwIDI3MSA1OTJUMjI1IDU2OFQxOTYgNTMyVDE4NSA0ODdRMTg1IDQ1OSAxOTUgNDM5VDIyNSA0MDRUMjcyIDM3NlQzMzEgMzUwUTM2MSAzMzcgMzkwIDMyM1Q0NDMgMjg5VDQ4MCAyNDJUNDk1IDE3NFE0OTUgMTMyIDQ4MCA5OFQ0MzcgNDBUMzY2IDJUMjY5IC0xMlpNMzExIDcxNlEzMTAgNzE4IDMyMyA3MzJUMzU3IDc2NVQ0MDQgODA2VDQ1NSA4NDJRNDc5IDg1NyA1MDEgODU3UTUxNCA4NTcgNTIyIDg0OVQ1MzAgODI5UTUzMCA4MDUgNDg5IDc4MVE0NjEgNzY1IDQzMSA3NTJUMzc0IDczMFQzMzAgNzE4VDMxMSA3MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUI7IiBnbHlwaC1uYW1lPSJzYWN1dGUiIGhvcml6LWFkdi14PSI0ODEiIGQ9Ik0yMjIgLTEyUTE2MyAtMTIgMTE3IDZUNDUgNTBRMzQgNjEgMjggNzJUMjEgOTVRMjEgMTA2IDI2IDExM1QzOCAxMjZUNTAgMTMyVDU3IDEzM1E4MCA5NSAxMjIgNjlUMjI2IDQzUTI4MiA0MyAzMTIgNjVUMzQyIDEyNFEzNDIgMTU3IDMxMiAxNzRUMjI4IDIwOVEyMDIgMjE4IDE3NyAyMjhUMTMxIDI1NFQ5NyAyOTJUODQgMzQ3UTg0IDM3OCA5NyA0MDNUMTM0IDQ0OFQxOTAgNDc3VDI2MiA0ODhRMzE2IDQ4OCAzNTYgNDcyVDQyMCA0MzJRNDQ0IDQwOCA0NDQgMzg0UTQ0NCAzNzMgNDM5IDM2NlQ0MjYgMzU0VDQxMyAzNDlUNDA2IDM1MFEzODcgMzg3IDM0NyA0MTBUMjU3IDQzM1EyMDIgNDMzIDE3NSA0MDlUMTQ3IDM1NVExNDcgMzIwIDE3OSAzMDJUMjY1IDI2NFEyOTAgMjU1IDMxNSAyNDVUMzYwIDIxOVQzOTIgMTgzVDQwNSAxMzJRNDA1IDY2IDM1NyAyN1QyMjIgLTEyWk0yMzYgNTUxUTIzNSA1NTMgMjQ4IDU2N1QyODIgNjAwVDMyOSA2NDFUMzgwIDY3N1E0MDQgNjkyIDQyNiA2OTJRNDM5IDY5MiA0NDcgNjg0VDQ1NSA2NjRRNDU1IDY0MCA0MTQgNjE2UTM4NiA2MDAgMzU2IDU4N1QyOTkgNTY1VDI1NSA1NTNUMjM2IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QzsiIGdseXBoLW5hbWU9IlNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTY3IiBkPSJNMjY5IC0xMlEyMDEgLTEyIDE0OSA5VDY1IDYxUTQ4IDc4IDM4IDk2VDI4IDEzM1EyOCAxNDYgMzQgMTU0VDQ4IDE2NlQ2MyAxNzBUNzAgMTcwUTkzIDExMyAxNDMgODBUMjczIDQ3UTM1MSA0NyAzODggNzlUNDI2IDE2OFE0MjYgMTkzIDQxNSAyMTJUMzg1IDI0NVQzNDAgMjcyVDI4NCAyOTZRMjUzIDMwOSAyMjMgMzIzVDE2OSAzNTlUMTMxIDQwOVQxMTYgNDgwUTExNiA1MTcgMTMxIDU1MFQxNzQgNjA3VDI0MyA2NDVUMzMzIDY1OVE0MDEgNjU5IDQ0OCA2NDBUNTIxIDU5NVE1NTMgNTYzIDU1MyA1MjlRNTUzIDUxNiA1NDcgNTA5VDUzNCA0OTdUNTIwIDQ5MlQ1MTIgNDkzUTQ5MiA1NDEgNDQ4IDU3MFQzMzAgNjAwUTI5OCA2MDAgMjcxIDU5MlQyMjUgNTY4VDE5NiA1MzJUMTg1IDQ4N1ExODUgNDU5IDE5NSA0MzlUMjI1IDQwNFQyNzIgMzc2VDMzMSAzNTBRMzYxIDMzNyAzOTAgMzIzVDQ0MyAyODlUNDgwIDI0MlQ0OTUgMTc0UTQ5NSAxMzIgNDgwIDk4VDQzNyA0MFQzNjYgMlQyNjkgLTEyWk0yNjQgNzE0UTI1NCA3MTQgMjUwIDcxOVQyNDUgNzMxUTI0NSA3NDggMjYyIDc2OFQzMTIgODE3UTMyOCA4MzEgMzQ0IDg0M1QzNzQgODY0VDM5NSA4NzhUNDA1IDg4NFE0MDYgODg0IDQxMiA4NzlUNDI3IDg2NFQ0NDYgODQ0VDQ2NyA4MjBRNDg5IDc5MSA0OTcgNzczVDUwNiA3NDNRNTA2IDcyOSA0OTkgNzIyVDQ4MiA3MTRRNDY5IDcxNCA0NTcgNzI4VDQyNiA3NzVMMzk3IDgyNkwzNDYgNzczUTMyMCA3NDYgMjk5IDczMFQyNjQgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVEOyIgZ2x5cGgtbmFtZT0ic2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI0ODEiIGQ9Ik0yMjIgLTEyUTE2MyAtMTIgMTE3IDZUNDUgNTBRMzQgNjEgMjggNzJUMjEgOTVRMjEgMTA2IDI2IDExM1QzOCAxMjZUNTAgMTMyVDU3IDEzM1E4MCA5NSAxMjIgNjlUMjI2IDQzUTI4MiA0MyAzMTIgNjVUMzQyIDEyNFEzNDIgMTU3IDMxMiAxNzRUMjI4IDIwOVEyMDIgMjE4IDE3NyAyMjhUMTMxIDI1NFQ5NyAyOTJUODQgMzQ3UTg0IDM3OCA5NyA0MDNUMTM0IDQ0OFQxOTAgNDc3VDI2MiA0ODhRMzE2IDQ4OCAzNTYgNDcyVDQyMCA0MzJRNDQ0IDQwOCA0NDQgMzg0UTQ0NCAzNzMgNDM5IDM2NlQ0MjYgMzU0VDQxMyAzNDlUNDA2IDM1MFEzODcgMzg3IDM0NyA0MTBUMjU3IDQzM1EyMDIgNDMzIDE3NSA0MDlUMTQ3IDM1NVExNDcgMzIwIDE3OSAzMDJUMjY1IDI2NFEyOTAgMjU1IDMxNSAyNDVUMzYwIDIxOVQzOTIgMTgzVDQwNSAxMzJRNDA1IDY2IDM1NyAyN1QyMjIgLTEyWk0xODIgNTQ5UTE3MiA1NDkgMTY4IDU1NFQxNjMgNTY2UTE2MyA1ODMgMTgwIDYwM1QyMzAgNjUyUTI0NiA2NjYgMjYyIDY3OFQyOTIgNjk5VDMxMyA3MTNUMzIzIDcxOVEzMjQgNzE5IDMzMCA3MTRUMzQ1IDY5OVQzNjQgNjc5VDM4NSA2NTVRNDA3IDYyNiA0MTUgNjA4VDQyNCA1NzhRNDI0IDU2NCA0MTcgNTU3VDQwMCA1NDlRMzg3IDU0OSAzNzUgNTYzVDM0NCA2MTBMMzE1IDY2MUwyNjQgNjA4UTIzOCA1ODEgMjE3IDU2NVQxODIgNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVFOyIgZ2x5cGgtbmFtZT0iU2NlZGlsbGEiIGhvcml6LWFkdi14PSI1NjciIGQ9Ik0yNjkgLTEyUTIwMSAtMTIgMTQ5IDlUNjUgNjFRNDggNzggMzggOTZUMjggMTMzUTI4IDE0NiAzNCAxNTRUNDggMTY2VDYzIDE3MFQ3MCAxNzBROTMgMTEzIDE0MyA4MFQyNzMgNDdRMzUxIDQ3IDM4OCA3OVQ0MjYgMTY4UTQyNiAxOTMgNDE1IDIxMlQzODUgMjQ1VDM0MCAyNzJUMjg0IDI5NlEyNTMgMzA5IDIyMyAzMjNUMTY5IDM1OVQxMzEgNDA5VDExNiA0ODBRMTE2IDUxNyAxMzEgNTUwVDE3NCA2MDdUMjQzIDY0NVQzMzMgNjU5UTQwMSA2NTkgNDQ4IDY0MFQ1MjEgNTk1UTU1MyA1NjMgNTUzIDUyOVE1NTMgNTE2IDU0NyA1MDlUNTM0IDQ5N1Q1MjAgNDkyVDUxMiA0OTNRNDkyIDU0MSA0NDggNTcwVDMzMCA2MDBRMjk4IDYwMCAyNzEgNTkyVDIyNSA1NjhUMTk2IDUzMlQxODUgNDg3UTE4NSA0NTkgMTk1IDQzOVQyMjUgNDA0VDI3MiAzNzZUMzMxIDM1MFEzNjEgMzM3IDM5MCAzMjNUNDQzIDI4OVQ0ODAgMjQyVDQ5NSAxNzRRNDk1IDEzMiA0ODAgOThUNDM3IDQwVDM2NiAyVDI2OSAtMTJaTTE0MyAtMjM0UTE0MCAtMjM3IDEzNCAtMjM2VDEyMyAtMjMwVDExNSAtMjIyVDExMyAtMjE0TDIyMCAtNDdRMjIxIC00NiAyMzAgLTQ3VDI0OSAtNTJUMjY5IC02M1QyNzggLTgzUTI3OCAtMTA1IDI1NiAtMTI4TDE0MyAtMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVGOyIgZ2x5cGgtbmFtZT0ic2NlZGlsbGEiIGhvcml6LWFkdi14PSI0ODEiIGQ9Ik0yMjIgLTEyUTE2MyAtMTIgMTE3IDZUNDUgNTBRMzQgNjEgMjggNzJUMjEgOTVRMjEgMTA2IDI2IDExM1QzOCAxMjZUNTAgMTMyVDU3IDEzM1E4MCA5NSAxMjIgNjlUMjI2IDQzUTI4MiA0MyAzMTIgNjVUMzQyIDEyNFEzNDIgMTU3IDMxMiAxNzRUMjI4IDIwOVEyMDIgMjE4IDE3NyAyMjhUMTMxIDI1NFQ5NyAyOTJUODQgMzQ3UTg0IDM3OCA5NyA0MDNUMTM0IDQ0OFQxOTAgNDc3VDI2MiA0ODhRMzE2IDQ4OCAzNTYgNDcyVDQyMCA0MzJRNDQ0IDQwOCA0NDQgMzg0UTQ0NCAzNzMgNDM5IDM2NlQ0MjYgMzU0VDQxMyAzNDlUNDA2IDM1MFEzODcgMzg3IDM0NyA0MTBUMjU3IDQzM1EyMDIgNDMzIDE3NSA0MDlUMTQ3IDM1NVExNDcgMzIwIDE3OSAzMDJUMjY1IDI2NFEyOTAgMjU1IDMxNSAyNDVUMzYwIDIxOVQzOTIgMTgzVDQwNSAxMzJRNDA1IDY2IDM1NyAyN1QyMjIgLTEyWk0xMDAgLTIzNFE5NyAtMjM3IDkxIC0yMzZUODAgLTIzMFQ3MiAtMjIyVDcwIC0yMTRMMTc3IC00N1ExNzggLTQ2IDE4NyAtNDdUMjA2IC01MlQyMjYgLTYzVDIzNSAtODNRMjM1IC0xMDUgMjEzIC0xMjhMMTAwIC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjA7IiBnbHlwaC1uYW1lPSJTY2Fyb24iIGhvcml6LWFkdi14PSI1NjciIGQ9Ik0yNjkgLTEyUTIwMSAtMTIgMTQ5IDlUNjUgNjFRNDggNzggMzggOTZUMjggMTMzUTI4IDE0NiAzNCAxNTRUNDggMTY2VDYzIDE3MFQ3MCAxNzBROTMgMTEzIDE0MyA4MFQyNzMgNDdRMzUxIDQ3IDM4OCA3OVQ0MjYgMTY4UTQyNiAxOTMgNDE1IDIxMlQzODUgMjQ1VDM0MCAyNzJUMjg0IDI5NlEyNTMgMzA5IDIyMyAzMjNUMTY5IDM1OVQxMzEgNDA5VDExNiA0ODBRMTE2IDUxNyAxMzEgNTUwVDE3NCA2MDdUMjQzIDY0NVQzMzMgNjU5UTQwMSA2NTkgNDQ4IDY0MFQ1MjEgNTk1UTU1MyA1NjMgNTUzIDUyOVE1NTMgNTE2IDU0NyA1MDlUNTM0IDQ5N1Q1MjAgNDkyVDUxMiA0OTNRNDkyIDU0MSA0NDggNTcwVDMzMCA2MDBRMjk4IDYwMCAyNzEgNTkyVDIyNSA1NjhUMTk2IDUzMlQxODUgNDg3UTE4NSA0NTkgMTk1IDQzOVQyMjUgNDA0VDI3MiAzNzZUMzMxIDM1MFEzNjEgMzM3IDM5MCAzMjNUNDQzIDI4OVQ0ODAgMjQyVDQ5NSAxNzRRNDk1IDEzMiA0ODAgOThUNDM3IDQwVDM2NiAyVDI2OSAtMTJaTTM2MyA3MDNRMzYyIDcwMyAzNTYgNzA4VDM0MCA3MjNUMzIxIDc0M1QzMDEgNzY3UTI3OSA3OTYgMjcxIDgxNFQyNjIgODQ0UTI2MiA4NTggMjY5IDg2NVQyODYgODczUTMwMiA4NzMgMzE5IDg0OFQzNzEgNzYxTDQyMiA4MTRRNDQ4IDg0MSA0NjkgODU3VDUwNCA4NzNRNTE0IDg3MyA1MTggODY4VDUyMyA4NTZRNTIzIDgzOSA1MDYgODE5VDQ1NiA3NzBRNDM5IDc1NiA0MjMgNzQ0VDM5NCA3MjNUMzczIDcwOVQzNjMgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYxOyIgZ2x5cGgtbmFtZT0ic2Nhcm9uIiBob3Jpei1hZHYteD0iNDgxIiBkPSJNMjIyIC0xMlExNjMgLTEyIDExNyA2VDQ1IDUwUTM0IDYxIDI4IDcyVDIxIDk1UTIxIDEwNiAyNiAxMTNUMzggMTI2VDUwIDEzMlQ1NyAxMzNRODAgOTUgMTIyIDY5VDIyNiA0M1EyODIgNDMgMzEyIDY1VDM0MiAxMjRRMzQyIDE1NyAzMTIgMTc0VDIyOCAyMDlRMjAyIDIxOCAxNzcgMjI4VDEzMSAyNTRUOTcgMjkyVDg0IDM0N1E4NCAzNzggOTcgNDAzVDEzNCA0NDhUMTkwIDQ3N1QyNjIgNDg4UTMxNiA0ODggMzU2IDQ3MlQ0MjAgNDMyUTQ0NCA0MDggNDQ0IDM4NFE0NDQgMzczIDQzOSAzNjZUNDI2IDM1NFQ0MTMgMzQ5VDQwNiAzNTBRMzg3IDM4NyAzNDcgNDEwVDI1NyA0MzNRMjAyIDQzMyAxNzUgNDA5VDE0NyAzNTVRMTQ3IDMyMCAxNzkgMzAyVDI2NSAyNjRRMjkwIDI1NSAzMTUgMjQ1VDM2MCAyMTlUMzkyIDE4M1Q0MDUgMTMyUTQwNSA2NiAzNTcgMjdUMjIyIC0xMlpNMjkwIDUzM1EyODkgNTMzIDI4MyA1MzhUMjY3IDU1M1QyNDggNTczVDIyOCA1OTdRMjA2IDYyNiAxOTggNjQ0VDE4OSA2NzRRMTg5IDY4OCAxOTYgNjk1VDIxMyA3MDNRMjI5IDcwMyAyNDYgNjc4VDI5OCA1OTFMMzQ5IDY0NFEzNzUgNjcxIDM5NiA2ODdUNDMxIDcwM1E0NDEgNzAzIDQ0NSA2OThUNDUwIDY4NlE0NTAgNjY5IDQzMyA2NDlUMzgzIDYwMFEzNjYgNTg2IDM1MCA1NzRUMzIxIDU1M1QzMDAgNTM5VDI5MCA1MzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjI7IiBnbHlwaC1uYW1lPSJUY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI2MTgiIGQ9Ik0zNTAgNTg1SDE1MVExMjAgNTg1IDEyMCA2MDJRMTIwIDYxMCAxMjQgNjIyVDEzMyA2NDBRMTM5IDY0NyAxNTkgNjQ3SDYyOFE2NTkgNjQ3IDY1OSA2MzBRNjU5IDYyMiA2NTUgNjEwVDY0NiA1OTJRNjQwIDU4NSA2MjAgNTg1SDQxOEwyOTMgMEgyMjZMMzUwIDU4NVpNMTQzIC0yMzRRMTQwIC0yMzcgMTM0IC0yMzZUMTIzIC0yMzBUMTE1IC0yMjJUMTEzIC0yMTRMMjIwIC00N1EyMjEgLTQ2IDIzMCAtNDdUMjQ5IC01MlQyNjkgLTYzVDI3OCAtODNRMjc4IC0xMDUgMjU2IC0xMjhMMTQzIC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjM7IiBnbHlwaC1uYW1lPSJ0Y29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSIzNzUiIGQ9Ik0yMDggLTEyUTE0MSAtMTIgMTA4IDMxVDkzIDE2MUwxNDcgNDE4SDc5UTc5IDQxOSA4MCA0MjJRODAgNDI0IDgwIDQyNlQ4MiA0MzRMOTAgNDY5UTkwIDQ3MSA5MCA0NzJUOTEgNDc0VjQ3NkgxNTlMMTY5IDUyM1ExNzcgNTYwIDE4OSA1NzVUMjIyIDU5MFEyMzIgNTkwIDIzOSA1ODdUMjQ3IDU4MkwyMjQgNDc2SDM3MlEzNzEgNDc1IDM3MSA0NzJRMzcwIDQ3MCAzNzAgNDY3VDM2OSA0NjBMMzYxIDQyNVEzNjAgNDIyIDM2MCA0MjBWNDE4SDIxMkwxNTcgMTYxUTE0MyA5NyAxNjAgNzFUMjE4IDQ0UTI0MCA0NCAyNTggNTNUMjg0IDczUTI4NiA3NSAyOTIgNjZUMjk5IDQzUTI5OSAyNiAyODUgMTJRMjc0IDEgMjU1IC01VDIwOCAtMTJaTTYxIC0yMzRRNTggLTIzNyA1MiAtMjM2VDQxIC0yMzBUMzMgLTIyMlQzMSAtMjE0TDEzOCAtNDdRMTM5IC00NiAxNDggLTQ3VDE2NyAtNTJUMTg3IC02M1QxOTYgLTgzUTE5NiAtMTA1IDE3NCAtMTI4TDYxIC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjQ7IiBnbHlwaC1uYW1lPSJUY2Fyb24iIGhvcml6LWFkdi14PSI2MTgiIGQ9Ik0zNTAgNTg1SDE1MVExMjAgNTg1IDEyMCA2MDJRMTIwIDYxMCAxMjQgNjIyVDEzMyA2NDBRMTM5IDY0NyAxNTkgNjQ3SDYyOFE2NTkgNjQ3IDY1OSA2MzBRNjU5IDYyMiA2NTUgNjEwVDY0NiA1OTJRNjQwIDU4NSA2MjAgNTg1SDQxOEwyOTMgMEgyMjZMMzUwIDU4NVpNMzk5IDY5OFEzOTggNjk4IDM5MiA3MDNUMzc2IDcxOFQzNTcgNzM4VDMzNyA3NjJRMzE1IDc5MSAzMDcgODA5VDI5OCA4MzlRMjk4IDg1MyAzMDUgODYwVDMyMiA4NjhRMzM4IDg2OCAzNTUgODQzVDQwNyA3NTZMNDU4IDgwOVE0ODQgODM2IDUwNSA4NTJUNTQwIDg2OFE1NTAgODY4IDU1NCA4NjNUNTU5IDg1MVE1NTkgODM0IDU0MiA4MTRUNDkyIDc2NVE0NzUgNzUxIDQ1OSA3MzlUNDMwIDcxOFQ0MDkgNzA0VDM5OSA2OThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjU7IiBnbHlwaC1uYW1lPSJ0Y2Fyb24iIGhvcml6LWFkdi14PSIzNzUiIGQ9Ik0yMDggLTEyUTE0MSAtMTIgMTA4IDMxVDkzIDE2MUwxNDcgNDE4SDc5UTc5IDQxOSA4MCA0MjJRODAgNDI0IDgwIDQyNlQ4MiA0MzRMOTAgNDY5UTkwIDQ3MSA5MCA0NzJUOTEgNDc0VjQ3NkgxNTlMMTY5IDUyM1ExNzcgNTYwIDE4OSA1NzVUMjIyIDU5MFEyMzIgNTkwIDIzOSA1ODdUMjQ3IDU4MkwyMjQgNDc2SDM3MlEzNzEgNDc1IDM3MSA0NzJRMzcwIDQ3MCAzNzAgNDY3VDM2OSA0NjBMMzYxIDQyNVEzNjAgNDIyIDM2MCA0MjBWNDE4SDIxMkwxNTcgMTYxUTE0MyA5NyAxNjAgNzFUMjE4IDQ0UTI0MCA0NCAyNTggNTNUMjg0IDczUTI4NiA3NSAyOTIgNjZUMjk5IDQzUTI5OSAyNiAyODUgMTJRMjc0IDEgMjU1IC01VDIwOCAtMTJaTTMwNiA1MTVRMzA0IDUxMiAyOTggNTEzVDI4NyA1MThUMjc4IDUyNlQyNzYgNTM1TDM5MiA3NTVRMzkzIDc1NiA0MDIgNzU2VDQyMyA3NTNUNDQ0IDc0MlQ0NTQgNzIyUTQ1NCA3MTEgNDUwIDcwMVQ0MzUgNjc3TDMwNiA1MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjY7IiBnbHlwaC1uYW1lPSJUYmFyIiBob3Jpei1hZHYteD0iNjE4IiBkPSJNMzUwIDU4NUgxNTFRMTIwIDU4NSAxMjAgNjAyUTEyMCA2MTAgMTI0IDYyMlQxMzMgNjQwUTEzOSA2NDcgMTU5IDY0N0g2MjhRNjU5IDY0NyA2NTkgNjMwUTY1OSA2MjIgNjU1IDYxMFQ2NDYgNTkyUTY0MCA1ODUgNjIwIDU4NUg0MThMMjkzIDBIMjI2TDM1MCA1ODVaTTIyMCAyOTVRMTg5IDI5NSAxODkgMzEzUTE4OSAzMjEgMTkyIDMzMlQyMDEgMzQ5UTIwOCAzNTcgMjI3IDM1N0g0NDdRNDc4IDM1NyA0NzggMzM5UTQ3OCAzMzEgNDc1IDMyMFQ0NjYgMzAzUTQ1OSAyOTUgNDQwIDI5NUgyMjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjc7IiBnbHlwaC1uYW1lPSJ0YmFyIiBob3Jpei1hZHYteD0iMzc1IiBkPSJNMjA4IC0xMlExNDEgLTEyIDEwOCAzMVQ5MyAxNjFMMTQ3IDQxOEg3OVE3OSA0MTkgODAgNDIyUTgwIDQyNCA4MCA0MjZUODIgNDM0TDkwIDQ2OVE5MCA0NzEgOTAgNDcyVDkxIDQ3NFY0NzZIMTU5TDE2OSA1MjNRMTc3IDU2MCAxODkgNTc1VDIyMiA1OTBRMjMyIDU5MCAyMzkgNTg3VDI0NyA1ODJMMjI0IDQ3NkgzNzJRMzcxIDQ3NSAzNzEgNDcyUTM3MCA0NzAgMzcwIDQ2N1QzNjkgNDYwTDM2MSA0MjVRMzYwIDQyMiAzNjAgNDIwVjQxOEgyMTJMMTU3IDE2MVExNDMgOTcgMTYwIDcxVDIxOCA0NFEyNDAgNDQgMjU4IDUzVDI4NCA3M1EyODYgNzUgMjkyIDY2VDI5OSA0M1EyOTkgMjYgMjg1IDEyUTI3NCAxIDI1NSAtNVQyMDggLTEyWk03MCAyMjJRMzkgMjIyIDM5IDI0MFEzOSAyNDggNDIgMjU5VDUxIDI3NlE1OCAyODQgNzcgMjg0SDI5N1EzMjggMjg0IDMyOCAyNjZRMzI4IDI1OCAzMjUgMjQ3VDMxNiAyMzBRMzA5IDIyMiAyOTAgMjIySDcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY4OyIgZ2x5cGgtbmFtZT0iVXRpbGRlIiBob3Jpei1hZHYteD0iNjczIiBkPSJNMzIxIC0xMlEyNTYgLTEyIDIwNyA3VDEyNyA2M1Q4OCAxNTVUOTUgMjg1TDE2NiA2MjBRMTcwIDYzNiAxNzcgNjQzVDIwMCA2NTFIMjA5UTIyNCA2NTEgMjMwIDY0MlQyMzMgNjE2TDE2MiAyODBRMTM4IDE2NCAxODAgMTA3VDMyNSA0OVE0ODMgNDkgNTI1IDI0N0w2MDQgNjIwUTYwOCA2MzYgNjE1IDY0M1Q2MzggNjUxSDY0NlE2NjEgNjUxIDY2NyA2NDJUNjcwIDYxNkw1ODkgMjMzUTU2MyAxMTIgNDk3IDUwVDMyMSAtMTJaTTUwNyA2NzNRNDgzIDY3MyA0NDUgNjk0VDM2OCA3NTNRMzYyIDc0MCAzNTYgNzI3VDM0MyA3MDRUMzI5IDY4N1QzMTQgNjgwUTMwMiA2ODAgMjk3IDY4NlQyOTEgNzAwUTI5MSA3MTcgMjk4IDczNFQzMTYgNzY1VDM0MSA3ODdUMzcxIDc5NlEzOTUgNzk2IDQzMyA3NzVUNTEwIDcxNlE1MTYgNzI5IDUyMiA3NDJUNTM1IDc2NVQ1NDkgNzgyVDU2NCA3ODlRNTc2IDc4OSA1ODEgNzgzVDU4NyA3NjlRNTg3IDc1MiA1ODAgNzM1VDU2MiA3MDRUNTM3IDY4MlQ1MDcgNjczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY5OyIgZ2x5cGgtbmFtZT0idXRpbGRlIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNNDU1IC04UTQxNyAtOCA0MDAgMTRUMzg4IDc5UTM2MiAzNiAzMjAgMTJUMjMwIC0xMlExODIgLTEyIDE0OCA0VDkzIDQ5VDY4IDExOVQ3MiAyMDdMMTI5IDQ3NkgxOTRMMTM2IDIwMlExMjIgMTM0IDE0OCA5MlQyMzkgNDlRMjk0IDQ5IDMzMyA3N1Q0MDYgMTY0TDQ3MiA0NzZINTM3TDQ1NyAxMDFRNDQ5IDY2IDQ1OCA1MlQ1MDAgMzdRNTAwIDM3IDUwMCAzMFQ0OTcgMTVUNDg0IC0xVDQ1NSAtOFpNNDI0IDU0OFE0MDAgNTQ4IDM2MiA1NjlUMjg1IDYyOFEyNzkgNjE1IDI3MyA2MDJUMjYwIDU3OVQyNDYgNTYyVDIzMSA1NTVRMjE5IDU1NSAyMTQgNTYxVDIwOCA1NzVRMjA4IDU5MiAyMTUgNjA5VDIzMyA2NDBUMjU4IDY2MlQyODggNjcxUTMxMiA2NzEgMzUwIDY1MFQ0MjcgNTkxUTQzMyA2MDQgNDM5IDYxN1Q0NTIgNjQwVDQ2NiA2NTdUNDgxIDY2NFE0OTMgNjY0IDQ5OCA2NThUNTA0IDY0NFE1MDQgNjI3IDQ5NyA2MTBUNDc5IDU3OVQ0NTQgNTU3VDQyNCA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBnbHlwaC1uYW1lPSJVbWFjcm9uIiBob3Jpei1hZHYteD0iNjczIiBkPSJNMzIxIC0xMlEyNTYgLTEyIDIwNyA3VDEyNyA2M1Q4OCAxNTVUOTUgMjg1TDE2NiA2MjBRMTcwIDYzNiAxNzcgNjQzVDIwMCA2NTFIMjA5UTIyNCA2NTEgMjMwIDY0MlQyMzMgNjE2TDE2MiAyODBRMTM4IDE2NCAxODAgMTA3VDMyNSA0OVE0ODMgNDkgNTI1IDI0N0w2MDQgNjIwUTYwOCA2MzYgNjE1IDY0M1Q2MzggNjUxSDY0NlE2NjEgNjUxIDY2NyA2NDJUNjcwIDYxNkw1ODkgMjMzUTU2MyAxMTIgNDk3IDUwVDMyMSAtMTJaTTMzMCA3MzNRMjk5IDczMyAyOTkgNzUxUTI5OSA3NTkgMzAyIDc3MFQzMTEgNzg3UTMxOCA3OTUgMzM3IDc5NUg1NTdRNTg4IDc5NSA1ODggNzc3UTU4OCA3NjkgNTg1IDc1OFQ1NzYgNzQxUTU2OSA3MzMgNTUwIDczM0gzMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkI7IiBnbHlwaC1uYW1lPSJ1bWFjcm9uIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNNDU1IC04UTQxNyAtOCA0MDAgMTRUMzg4IDc5UTM2MiAzNiAzMjAgMTJUMjMwIC0xMlExODIgLTEyIDE0OCA0VDkzIDQ5VDY4IDExOVQ3MiAyMDdMMTI5IDQ3NkgxOTRMMTM2IDIwMlExMjIgMTM0IDE0OCA5MlQyMzkgNDlRMjk0IDQ5IDMzMyA3N1Q0MDYgMTY0TDQ3MiA0NzZINTM3TDQ1NyAxMDFRNDQ5IDY2IDQ1OCA1MlQ1MDAgMzdRNTAwIDM3IDUwMCAzMFQ0OTcgMTVUNDg0IC0xVDQ1NSAtOFpNMjQ4IDU2OFEyMTcgNTY4IDIxNyA1ODZRMjE3IDU5NCAyMjAgNjA1VDIyOSA2MjJRMjM2IDYzMCAyNTUgNjMwSDQ3NVE1MDYgNjMwIDUwNiA2MTJRNTA2IDYwNCA1MDMgNTkzVDQ5NCA1NzZRNDg3IDU2OCA0NjggNTY4SDI0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QzsiIGdseXBoLW5hbWU9IlVicmV2ZSIgaG9yaXotYWR2LXg9IjY3MyIgZD0iTTMyMSAtMTJRMjU2IC0xMiAyMDcgN1QxMjcgNjNUODggMTU1VDk1IDI4NUwxNjYgNjIwUTE3MCA2MzYgMTc3IDY0M1QyMDAgNjUxSDIwOVEyMjQgNjUxIDIzMCA2NDJUMjMzIDYxNkwxNjIgMjgwUTEzOCAxNjQgMTgwIDEwN1QzMjUgNDlRNDgzIDQ5IDUyNSAyNDdMNjA0IDYyMFE2MDggNjM2IDYxNSA2NDNUNjM4IDY1MUg2NDZRNjYxIDY1MSA2NjcgNjQyVDY3MCA2MTZMNTg5IDIzM1E1NjMgMTEyIDQ5NyA1MFQzMjEgLTEyWk00MzkgNzEzUTQxNSA3MTMgMzkyIDcyM1QzNDkgNzQ5VDMxOCA3ODRUMzA2IDgyMFEzMDYgODMxIDMxMiA4MzlUMzMxIDg0N1EzNDcgODQ3IDM3MSA4MjhUNDM4IDc1NlE0ODUgODA1IDUxNCA4MjZUNTYzIDg0N1E1NzQgODQ3IDU4MSA4NDBUNTg4IDgyM1E1ODggODA4IDU3NSA3ODlUNTQxIDc1M1Q0OTMgNzI1VDQzOSA3MTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkQ7IiBnbHlwaC1uYW1lPSJ1YnJldmUiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik00NTUgLThRNDE3IC04IDQwMCAxNFQzODggNzlRMzYyIDM2IDMyMCAxMlQyMzAgLTEyUTE4MiAtMTIgMTQ4IDRUOTMgNDlUNjggMTE5VDcyIDIwN0wxMjkgNDc2SDE5NEwxMzYgMjAyUTEyMiAxMzQgMTQ4IDkyVDIzOSA0OVEyOTQgNDkgMzMzIDc3VDQwNiAxNjRMNDcyIDQ3Nkg1MzdMNDU3IDEwMVE0NDkgNjYgNDU4IDUyVDUwMCAzN1E1MDAgMzcgNTAwIDMwVDQ5NyAxNVQ0ODQgLTFUNDU1IC04Wk0zNDYgNTQ4UTMyMiA1NDggMjk5IDU1OFQyNTYgNTg0VDIyNSA2MTlUMjEzIDY1NVEyMTMgNjY2IDIxOSA2NzRUMjM4IDY4MlEyNTQgNjgyIDI3OCA2NjNUMzQ1IDU5MVEzOTIgNjQwIDQyMSA2NjFUNDcwIDY4MlE0ODEgNjgyIDQ4OCA2NzVUNDk1IDY1OFE0OTUgNjQzIDQ4MiA2MjRUNDQ4IDU4OFQ0MDAgNTYwVDM0NiA1NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkU7IiBnbHlwaC1uYW1lPSJVcmluZyIgaG9yaXotYWR2LXg9IjY3MyIgZD0iTTMyMSAtMTJRMjU2IC0xMiAyMDcgN1QxMjcgNjNUODggMTU1VDk1IDI4NUwxNjYgNjIwUTE3MCA2MzYgMTc3IDY0M1QyMDAgNjUxSDIwOVEyMjQgNjUxIDIzMCA2NDJUMjMzIDYxNkwxNjIgMjgwUTEzOCAxNjQgMTgwIDEwN1QzMjUgNDlRNDgzIDQ5IDUyNSAyNDdMNjA0IDYyMFE2MDggNjM2IDYxNSA2NDNUNjM4IDY1MUg2NDZRNjYxIDY1MSA2NjcgNjQyVDY3MCA2MTZMNTg5IDIzM1E1NjMgMTEyIDQ5NyA1MFQzMjEgLTEyWk00MzcgNzE1UTM4OCA3MTUgMzU4IDc0M1QzMjggODE2UTMyOCA4NDIgMzM3IDg2NlQzNjQgOTA5VDQwNSA5MzlUNDU4IDk1MFE1MDcgOTUwIDUzNyA5MjJUNTY3IDg0OVE1NjcgODIzIDU1OCA3OTlUNTMxIDc1NlQ0ODkgNzI2VDQzNyA3MTVaTTQzOSA3NjBRNDU3IDc2MCA0NzEgNzY3VDQ5NSA3ODdUNTEwIDgxNFQ1MTYgODQ1UTUxNiA4NzAgNDk5IDg4N1Q0NTYgOTA1UTQzOCA5MDUgNDI0IDg5OFQ0MDAgODc4VDM4NSA4NTFUMzc5IDgyMFEzNzkgNzk1IDM5NiA3NzhUNDM5IDc2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RjsiIGdseXBoLW5hbWU9InVyaW5nIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNNDU1IC04UTQxNyAtOCA0MDAgMTRUMzg4IDc5UTM2MiAzNiAzMjAgMTJUMjMwIC0xMlExODIgLTEyIDE0OCA0VDkzIDQ5VDY4IDExOVQ3MiAyMDdMMTI5IDQ3NkgxOTRMMTM2IDIwMlExMjIgMTM0IDE0OCA5MlQyMzkgNDlRMjk0IDQ5IDMzMyA3N1Q0MDYgMTY0TDQ3MiA0NzZINTM3TDQ1NyAxMDFRNDQ5IDY2IDQ1OCA1MlQ1MDAgMzdRNTAwIDM3IDUwMCAzMFQ0OTcgMTVUNDg0IC0xVDQ1NSAtOFpNMzQ2IDUzMFEyOTcgNTMwIDI2NyA1NThUMjM3IDYzMVEyMzcgNjU3IDI0NiA2ODFUMjczIDcyNFQzMTQgNzU0VDM2NyA3NjVRNDE2IDc2NSA0NDYgNzM3VDQ3NiA2NjRRNDc2IDYzOCA0NjcgNjE0VDQ0MCA1NzFUMzk4IDU0MVQzNDYgNTMwWk0zNDggNTc1UTM2NiA1NzUgMzgwIDU4MlQ0MDQgNjAyVDQxOSA2MjlUNDI1IDY2MFE0MjUgNjg1IDQwOCA3MDJUMzY1IDcyMFEzNDcgNzIwIDMzMyA3MTNUMzA5IDY5M1QyOTQgNjY2VDI4OCA2MzVRMjg4IDYxMCAzMDUgNTkzVDM0OCA1NzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBnbHlwaC1uYW1lPSJVaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNjczIiBkPSJNMzIxIC0xMlEyNTYgLTEyIDIwNyA3VDEyNyA2M1Q4OCAxNTVUOTUgMjg1TDE2NiA2MjBRMTcwIDYzNiAxNzcgNjQzVDIwMCA2NTFIMjA5UTIyNCA2NTEgMjMwIDY0MlQyMzMgNjE2TDE2MiAyODBRMTM4IDE2NCAxODAgMTA3VDMyNSA0OVE0ODMgNDkgNTI1IDI0N0w2MDQgNjIwUTYwOCA2MzYgNjE1IDY0M1Q2MzggNjUxSDY0NlE2NjEgNjUxIDY2NyA2NDJUNjcwIDYxNkw1ODkgMjMzUTU2MyAxMTIgNDk3IDUwVDMyMSAtMTJaTTQ3OSA3MTZRNDc3IDcxOCA0ODcgNzMyVDUxNiA3NjVUNTU3IDgwNVQ2MDQgODQ0UTYyOCA4NjIgNjUwIDg2MlE2NjIgODYyIDY3MSA4NTVUNjgwIDgzNVE2ODAgODEwIDY0MyA3ODVRNjE4IDc2OCA1OTAgNzU0VDUzOCA3MzFUNDk4IDcxOFQ0NzkgNzE2Wk0zMDAgNzE2UTI5OCA3MTggMzA4IDczMlQzMzcgNzY1VDM3OCA4MDVUNDI1IDg0NFE0NDkgODYyIDQ3MSA4NjJRNDgzIDg2MiA0OTIgODU1VDUwMSA4MzVRNTAxIDgxMCA0NjQgNzg1UTQzOSA3NjggNDExIDc1NFQzNTkgNzMxVDMxOSA3MThUMzAwIDcxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MTsiIGdseXBoLW5hbWU9InVodW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik00NTUgLThRNDE3IC04IDQwMCAxNFQzODggNzlRMzYyIDM2IDMyMCAxMlQyMzAgLTEyUTE4MiAtMTIgMTQ4IDRUOTMgNDlUNjggMTE5VDcyIDIwN0wxMjkgNDc2SDE5NEwxMzYgMjAyUTEyMiAxMzQgMTQ4IDkyVDIzOSA0OVEyOTQgNDkgMzMzIDc3VDQwNiAxNjRMNDcyIDQ3Nkg1MzdMNDU3IDEwMVE0NDkgNjYgNDU4IDUyVDUwMCAzN1E1MDAgMzcgNTAwIDMwVDQ5NyAxNVQ0ODQgLTFUNDU1IC04Wk0zNzMgNTUxUTM3MSA1NTMgMzgxIDU2N1Q0MTAgNjAwVDQ1MSA2NDBUNDk4IDY3OVE1MjIgNjk3IDU0NCA2OTdRNTU2IDY5NyA1NjUgNjkwVDU3NCA2NzBRNTc0IDY0NSA1MzcgNjIwUTUxMiA2MDMgNDg0IDU4OVQ0MzIgNTY2VDM5MiA1NTNUMzczIDU1MVpNMTk0IDU1MVExOTIgNTUzIDIwMiA1NjdUMjMxIDYwMFQyNzIgNjQwVDMxOSA2NzlRMzQzIDY5NyAzNjUgNjk3UTM3NyA2OTcgMzg2IDY5MFQzOTUgNjcwUTM5NSA2NDUgMzU4IDYyMFEzMzMgNjAzIDMwNSA1ODlUMjUzIDU2NlQyMTMgNTUzVDE5NCA1NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBnbHlwaC1uYW1lPSJVb2dvbmVrIiBob3Jpei1hZHYteD0iNjczIiBkPSJNMzIxIC0xMlEyNTYgLTEyIDIwNyA3VDEyNyA2M1Q4OCAxNTVUOTUgMjg1TDE2NiA2MjBRMTcwIDYzNiAxNzcgNjQzVDIwMCA2NTFIMjA5UTIyNCA2NTEgMjMwIDY0MlQyMzMgNjE2TDE2MiAyODBRMTM4IDE2NCAxODAgMTA3VDMyNSA0OVE0ODMgNDkgNTI1IDI0N0w2MDQgNjIwUTYwOCA2MzYgNjE1IDY0M1Q2MzggNjUxSDY0NlE2NjEgNjUxIDY2NyA2NDJUNjcwIDYxNkw1ODkgMjMzUTU1MyA2NSA0NDAgMTJRMzg0IC0yMCAzNjUgLTQ2VDM0NiAtOTJRMzQ2IC0xMDcgMzU1IC0xMTZUMzc5IC0xMjVRNDAxIC0xMjUgNDE2IC0xMDdRNDI2IC0xMDkgNDM0IC0xMTZUNDQyIC0xMzdRNDQyIC0xNTcgNDI0IC0xNzBUMzc0IC0xODNRMzM0IC0xODMgMzA5IC0xNjFUMjgzIC0xMDRRMjgzIC04MCAyOTYgLTU3VDMzNyAtMTFRMzMyIC0xMSAzMjkgLTExVDMyMSAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzM7IiBnbHlwaC1uYW1lPSJ1b2dvbmVrIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNNDE5IC0xUTM4MiAxNyAzODggNzlRMzYyIDM2IDMyMCAxMlQyMzAgLTEyUTE4MiAtMTIgMTQ4IDRUOTMgNDlUNjggMTE5VDcyIDIwN0wxMjkgNDc2SDE5NEwxMzYgMjAyUTEyMiAxMzQgMTQ4IDkyVDIzOSA0OVEyOTQgNDkgMzMzIDc3VDQwNiAxNjRMNDcyIDQ3Nkg1MzdMNDU3IDEwMVE0NDkgNjYgNDU4IDUyVDUwMCAzN1E1MDAgMzcgNTAwIDMyVDQ5OSAyMFQ0OTEgN1Q0NzYgLTRRNDE2IC0zOCAzOTcgLTY0VDM3NyAtMTEyUTM3NyAtMTI3IDM4NiAtMTM2VDQxMCAtMTQ1UTQzMiAtMTQ1IDQ0NyAtMTI3UTQ1NyAtMTI5IDQ2NSAtMTM2VDQ3MyAtMTU3UTQ3MyAtMTc3IDQ1NSAtMTkwVDQwNSAtMjAzUTM2NSAtMjAzIDM0MCAtMTgxVDMxNCAtMTI0UTMxNCAtOTEgMzM5IC01OVQ0MTkgLTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzQ7IiBnbHlwaC1uYW1lPSJXY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjkzOCIgZD0iTTE1NyA2MzdRMTU3IDY0MSAxNjggNjQ2VDE5MiA2NTJUMjE2IDY0MlQyMjcgNjA5TDIzNSA2MUw0NzggNTI5UTQ4NyA1NDcgNDk4IDU1NFQ1MzIgNTYyUTU2MSA1NjIgNTcxIDU1MFQ1ODMgNTE4TDYyNCA2M0w4ODUgNjQ5UTg4NSA2NDkgODk3IDY1MFQ5MTkgNjQ1VDkzMyA2MjJUOTIwIDU2N0w2NjAgMEg1NzBMNTI2IDQ5NUwyNjQgMEgxNzdMMTU3IDYzN1pNNDUwIDcwNFE0NDAgNzA0IDQzNiA3MDlUNDMxIDcyMVE0MzEgNzM4IDQ0OCA3NThUNDk4IDgwN1E1MTQgODIxIDUzMCA4MzNUNTYwIDg1NFQ1ODEgODY4VDU5MSA4NzRRNTkyIDg3NCA1OTggODY5VDYxMyA4NTRUNjMyIDgzNFQ2NTMgODEwUTY3NSA3ODEgNjgzIDc2M1Q2OTIgNzMzUTY5MiA3MTkgNjg1IDcxMlQ2NjggNzA0UTY1NSA3MDQgNjQzIDcxOFQ2MTIgNzY1TDU4MyA4MTZMNTMyIDc2M1E1MDYgNzM2IDQ4NSA3MjBUNDUwIDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NTsiIGdseXBoLW5hbWU9IndjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNzI5IiBkPSJNMTI3IDMzMFExMjcgMzYwIDEyMyAzNzlUMTEwIDQxMFQ4OCA0MjVUNTggNDMxUTU3IDQzMSA1NyA0MzhUNjEgNDU1VDc3IDQ3MlQxMDkgNDgwUTEzOCA0ODAgMTU3IDQ2MVExOTIgNDI2IDE5MCAzMjRMMTg2IDY5TDMzNyAzNzFRMzQ5IDM5NSAzNjIgNDAxVDM5NiA0MDhRNDQyIDQwOCA0NDYgMzYwTDQ3MiA2OEw2NjQgNDc5UTY2NCA0NzkgNjc1IDQ3OVQ2OTYgNDcyVDcwOSA0NDlUNjk3IDQwMUw1MDIgMEg0MjFMMzg0IDMyOUwyMTQgMEgxMjZMMTI3IDMzMFpNMzE0IDUzOVEzMDQgNTM5IDMwMCA1NDRUMjk1IDU1NlEyOTUgNTczIDMxMiA1OTNUMzYyIDY0MlEzNzggNjU2IDM5NCA2NjhUNDI0IDY4OVQ0NDUgNzAzVDQ1NSA3MDlRNDU2IDcwOSA0NjIgNzA0VDQ3NyA2ODlUNDk2IDY2OVQ1MTcgNjQ1UTUzOSA2MTYgNTQ3IDU5OFQ1NTYgNTY4UTU1NiA1NTQgNTQ5IDU0N1Q1MzIgNTM5UTUxOSA1MzkgNTA3IDU1M1Q0NzYgNjAwTDQ0NyA2NTFMMzk2IDU5OFEzNzAgNTcxIDM0OSA1NTVUMzE0IDUzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NjsiIGdseXBoLW5hbWU9IlljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTgzIiBkPSJNMjY1IDI3MkwxMTAgNjQ3SDE4MUwzMDggMzMxTDU4MSA2NTNRNTgxIDY1MyA1OTMgNjUxVDYxNCA2MzlUNjIyIDYxMlQ1OTMgNTY0TDMzMSAyNjVMMjc1IDBIMjA3TDI2NSAyNzJaTTI3MCA3MTRRMjYwIDcxNCAyNTYgNzE5VDI1MSA3MzFRMjUxIDc0OCAyNjggNzY4VDMxOCA4MTdRMzM0IDgzMSAzNTAgODQzVDM4MCA4NjRUNDAxIDg3OFQ0MTEgODg0UTQxMiA4ODQgNDE4IDg3OVQ0MzMgODY0VDQ1MiA4NDRUNDczIDgyMFE0OTUgNzkxIDUwMyA3NzNUNTEyIDc0M1E1MTIgNzI5IDUwNSA3MjJUNDg4IDcxNFE0NzUgNzE0IDQ2MyA3MjhUNDMyIDc3NUw0MDMgODI2TDM1MiA3NzNRMzI2IDc0NiAzMDUgNzMwVDI3MCA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzc7IiBnbHlwaC1uYW1lPSJ5Y2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTkgLTIwNFEtMTUgLTIwNCAtMzQgLTE5OVQtNjUgLTE4MVEtNzcgLTE2OSAtNzcgLTE1M1EtNzcgLTE0NSAtNzMgLTEzOVQtNjUgLTEyN1QtNTYgLTEyMFQtNTAgLTExOVEtNDAgLTEzMCAtMjMgLTEzN1Q1IC0xNDVRMjAgLTE0NSAzNSAtMTM5VDY4IC0xMTdUMTA5IC03MlQxNjIgMUwxNzggMjRRMTYxIDI2IDE1MyAzN1QxNDMgNjdMMTE1IDMzMFExMTAgMzgyIDkzIDQwNVQ0MCA0MjhRNDAgNDI4IDQwIDQzNlQ0MiA0NTRUNTcgNDcyVDkwIDQ4MFExMTYgNDgwIDEzNCA0NjJRMTcwIDQyNiAxNzkgMzI0TDIwMyA1OUw0NTcgNDc2SDUyOEwyMjUgLTEyUTE4OSAtNjkgMTYxIC0xMDZUMTA4IC0xNjVUNjAgLTE5NVQ5IC0yMDRaTTE5OSA1NDlRMTg5IDU0OSAxODUgNTU0VDE4MCA1NjZRMTgwIDU4MyAxOTcgNjAzVDI0NyA2NTJRMjYzIDY2NiAyNzkgNjc4VDMwOSA2OTlUMzMwIDcxM1QzNDAgNzE5UTM0MSA3MTkgMzQ3IDcxNFQzNjIgNjk5VDM4MSA2NzlUNDAyIDY1NVE0MjQgNjI2IDQzMiA2MDhUNDQxIDU3OFE0NDEgNTY0IDQzNCA1NTdUNDE3IDU0OVE0MDQgNTQ5IDM5MiA1NjNUMzYxIDYxMEwzMzIgNjYxTDI4MSA2MDhRMjU1IDU4MSAyMzQgNTY1VDE5OSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzg7IiBnbHlwaC1uYW1lPSJZZGllcmVzaXMiIGhvcml6LWFkdi14PSI1ODMiIGQ9Ik0yNjUgMjcyTDExMCA2NDdIMTgxTDMwOCAzMzFMNTgxIDY1M1E1ODEgNjUzIDU5MyA2NTFUNjE0IDYzOVQ2MjIgNjEyVDU5MyA1NjRMMzMxIDI2NUwyNzUgMEgyMDdMMjY1IDI3MlpNNDY3IDcwOFE0MTggNzA4IDQxOCA3NDZRNDE4IDc2OSA0MzAgNzg2VDQ2OSA4MDRRNTE4IDgwNCA1MTggNzY2UTUxOCA3NDMgNTA2IDcyNlQ0NjcgNzA4Wk0yOTkgNzA4UTI1MCA3MDggMjUwIDc0NlEyNTAgNzY5IDI2MiA3ODZUMzAxIDgwNFEzNTAgODA0IDM1MCA3NjZRMzUwIDc0MyAzMzggNzI2VDI5OSA3MDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzk7IiBnbHlwaC1uYW1lPSJaYWN1dGUiIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik0xMyA0OEwxNSA2MUw1MjEgNTg1SDE3MFExNDkgNTg1IDE0MSA1OTJUMTMyIDYxMFExMzIgNjIxIDEzOCA2MzRUMTQ3IDY0N0g2MjJMNjEyIDU5OUw2MDkgNTg2TDEwMyA2Mkg0NzVRNDk2IDYyIDUwNCA1NVQ1MTMgMzdRNTEzIDI2IDUwNyAxM1Q0OTggMEgyTDEzIDQ4Wk0yOTUgNzE2UTI5NCA3MTggMzA3IDczMlQzNDEgNzY1VDM4OCA4MDZUNDM5IDg0MlE0NjMgODU3IDQ4NSA4NTdRNDk4IDg1NyA1MDYgODQ5VDUxNCA4MjlRNTE0IDgwNSA0NzMgNzgxUTQ0NSA3NjUgNDE1IDc1MlQzNTggNzMwVDMxNCA3MThUMjk1IDcxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QTsiIGdseXBoLW5hbWU9InphY3V0ZSIgaG9yaXotYWR2LXg9IjUwNyIgZD0iTTEwIDQ5TDQwNiA0MjBIMTM4UTExOSA0MjAgMTEyIDQyNlQxMDQgNDQzUTEwNCA0NTMgMTA5IDQ2NFQxMTcgNDc2SDQ5MFY0MjdMOTQgNTZIMzcxUTM5MCA1NiAzOTcgNTBUNDA1IDMzUTQwNSAyMyA0MDAgMTJUMzkyIDBIMTBWNDlaTTIyNCA1NTFRMjIzIDU1MyAyMzYgNTY3VDI3MCA2MDBUMzE3IDY0MVQzNjggNjc3UTM5MiA2OTIgNDE0IDY5MlE0MjcgNjkyIDQzNSA2ODRUNDQzIDY2NFE0NDMgNjQwIDQwMiA2MTZRMzc0IDYwMCAzNDQgNTg3VDI4NyA1NjVUMjQzIDU1M1QyMjQgNTUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdCOyIgZ2x5cGgtbmFtZT0iWmRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjU5OCIgZD0iTTEzIDQ4TDE1IDYxTDUyMSA1ODVIMTcwUTE0OSA1ODUgMTQxIDU5MlQxMzIgNjEwUTEzMiA2MjEgMTM4IDYzNFQxNDcgNjQ3SDYyMkw2MTIgNTk5TDYwOSA1ODZMMTAzIDYySDQ3NVE0OTYgNjIgNTA0IDU1VDUxMyAzN1E1MTMgMjYgNTA3IDEzVDQ5OCAwSDJMMTMgNDhaTTM4NSA3MTRRMzMxIDcxNCAzMzEgNzU1UTMzMSA3NzkgMzQ0IDc5OFQzODcgODE4UTQ0MSA4MTggNDQxIDc3N1E0NDEgNzUzIDQyOCA3MzRUMzg1IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QzsiIGdseXBoLW5hbWU9Inpkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1MDciIGQ9Ik0xMCA0OUw0MDYgNDIwSDEzOFExMTkgNDIwIDExMiA0MjZUMTA0IDQ0M1ExMDQgNDUzIDEwOSA0NjRUMTE3IDQ3Nkg0OTBWNDI3TDk0IDU2SDM3MVEzOTAgNTYgMzk3IDUwVDQwNSAzM1E0MDUgMjMgNDAwIDEyVDM5MiAwSDEwVjQ5Wk0zMDEgNTQ5UTI0NyA1NDkgMjQ3IDU5MFEyNDcgNjE0IDI2MCA2MzNUMzAzIDY1M1EzNTcgNjUzIDM1NyA2MTJRMzU3IDU4OCAzNDQgNTY5VDMwMSA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0Q7IiBnbHlwaC1uYW1lPSJaY2Fyb24iIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik0xMyA0OEwxNSA2MUw1MjEgNTg1SDE3MFExNDkgNTg1IDE0MSA1OTJUMTMyIDYxMFExMzIgNjIxIDEzOCA2MzRUMTQ3IDY0N0g2MjJMNjEyIDU5OUw2MDkgNTg2TDEwMyA2Mkg0NzVRNDk2IDYyIDUwNCA1NVQ1MTMgMzdRNTEzIDI2IDUwNyAxM1Q0OTggMEgyTDEzIDQ4Wk0zODAgNzAzUTM3OSA3MDMgMzczIDcwOFQzNTcgNzIzVDMzOCA3NDNUMzE4IDc2N1EyOTYgNzk2IDI4OCA4MTRUMjc5IDg0NFEyNzkgODU4IDI4NiA4NjVUMzAzIDg3M1EzMTkgODczIDMzNiA4NDhUMzg4IDc2MUw0MzkgODE0UTQ2NSA4NDEgNDg2IDg1N1Q1MjEgODczUTUzMSA4NzMgNTM1IDg2OFQ1NDAgODU2UTU0MCA4MzkgNTIzIDgxOVQ0NzMgNzcwUTQ1NiA3NTYgNDQwIDc0NFQ0MTEgNzIzVDM5MCA3MDlUMzgwIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGdseXBoLW5hbWU9InpjYXJvbiIgaG9yaXotYWR2LXg9IjUwNyIgZD0iTTEwIDQ5TDQwNiA0MjBIMTM4UTExOSA0MjAgMTEyIDQyNlQxMDQgNDQzUTEwNCA0NTMgMTA5IDQ2NFQxMTcgNDc2SDQ5MFY0MjdMOTQgNTZIMzcxUTM5MCA1NiAzOTcgNTBUNDA1IDMzUTQwNSAyMyA0MDAgMTJUMzkyIDBIMTBWNDlaTTI5OSA1MzNRMjk4IDUzMyAyOTIgNTM4VDI3NiA1NTNUMjU3IDU3M1QyMzcgNTk3UTIxNSA2MjYgMjA3IDY0NFQxOTggNjc0UTE5OCA2ODggMjA1IDY5NVQyMjIgNzAzUTIzOCA3MDMgMjU1IDY3OFQzMDcgNTkxTDM1OCA2NDRRMzg0IDY3MSA0MDUgNjg3VDQ0MCA3MDNRNDUwIDcwMyA0NTQgNjk4VDQ1OSA2ODZRNDU5IDY2OSA0NDIgNjQ5VDM5MiA2MDBRMzc1IDU4NiAzNTkgNTc0VDMzMCA1NTNUMzA5IDUzOVQyOTkgNTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTkyOyIgZ2x5cGgtbmFtZT0iZmxvcmluIiBob3Jpei1hZHYteD0iMzY0IiBkPSJNOTQgLTRRODQgLTQgNzYgMVQ2OCA4TDE0NyAzNzhIODNRNTQgMzc4IDU0IDM5NFE1NCA0MDIgNTcgNDEzVDY2IDQyOVE3MyA0MzYgOTAgNDM2SDE1OUwxNzQgNTA1UTE5MSA1ODMgMjMwIDYyMVQzMjkgNjU5UTM2MSA2NTkgMzgwIDY1MlQ0MTMgNjMxUTQyNyA2MTcgNDI3IDU5OVE0MjcgNTkwIDQyNCA1ODRUNDE2IDU3M1Q0MDcgNTY2VDQwMiA1NjVRMzkyIDU3OSAzNzIgNTkwVDMyNiA2MDFRMjkyIDYwMSAyNzAgNTc3VDIzNSA0OTZMMjIyIDQzNkgzNDVRMzc0IDQzNiAzNzQgNDIwUTM3NCA0MTIgMzcxIDQwMVQzNjIgMzg1UTM1NSAzNzggMzM4IDM3OEgyMTBMMTQyIDUwUTEzNiAyMSAxMjUgOVQ5NCAtNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxODsiIGdseXBoLW5hbWU9IlNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU2NyIgZD0iTTI2OSAtMTJRMjAxIC0xMiAxNDkgOVQ2NSA2MVE0OCA3OCAzOCA5NlQyOCAxMzNRMjggMTQ2IDM0IDE1NFQ0OCAxNjZUNjMgMTcwVDcwIDE3MFE5MyAxMTMgMTQzIDgwVDI3MyA0N1EzNTEgNDcgMzg4IDc5VDQyNiAxNjhRNDI2IDE5MyA0MTUgMjEyVDM4NSAyNDVUMzQwIDI3MlQyODQgMjk2UTI1MyAzMDkgMjIzIDMyM1QxNjkgMzU5VDEzMSA0MDlUMTE2IDQ4MFExMTYgNTE3IDEzMSA1NTBUMTc0IDYwN1QyNDMgNjQ1VDMzMyA2NTlRNDAxIDY1OSA0NDggNjQwVDUyMSA1OTVRNTUzIDU2MyA1NTMgNTI5UTU1MyA1MTYgNTQ3IDUwOVQ1MzQgNDk3VDUyMCA0OTJUNTEyIDQ5M1E0OTIgNTQxIDQ0OCA1NzBUMzMwIDYwMFEyOTggNjAwIDI3MSA1OTJUMjI1IDU2OFQxOTYgNTMyVDE4NSA0ODdRMTg1IDQ1OSAxOTUgNDM5VDIyNSA0MDRUMjcyIDM3NlQzMzEgMzUwUTM2MSAzMzcgMzkwIDMyM1Q0NDMgMjg5VDQ4MCAyNDJUNDk1IDE3NFE0OTUgMTMyIDQ4MCA5OFQ0MzcgNDBUMzY2IDJUMjY5IC0xMlpNMTU3IC0yMzRRMTU0IC0yMzcgMTQ4IC0yMzZUMTM3IC0yMzBUMTI5IC0yMjJUMTI3IC0yMTRMMjM0IC00N1EyMzUgLTQ2IDI0NCAtNDdUMjYzIC01MlQyODMgLTYzVDI5MiAtODNRMjkyIC0xMDUgMjcwIC0xMjhMMTU3IC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTk7IiBnbHlwaC1uYW1lPSJzY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0ODEiIGQ9Ik0yMjIgLTEyUTE2MyAtMTIgMTE3IDZUNDUgNTBRMzQgNjEgMjggNzJUMjEgOTVRMjEgMTA2IDI2IDExM1QzOCAxMjZUNTAgMTMyVDU3IDEzM1E4MCA5NSAxMjIgNjlUMjI2IDQzUTI4MiA0MyAzMTIgNjVUMzQyIDEyNFEzNDIgMTU3IDMxMiAxNzRUMjI4IDIwOVEyMDIgMjE4IDE3NyAyMjhUMTMxIDI1NFQ5NyAyOTJUODQgMzQ3UTg0IDM3OCA5NyA0MDNUMTM0IDQ0OFQxOTAgNDc3VDI2MiA0ODhRMzE2IDQ4OCAzNTYgNDcyVDQyMCA0MzJRNDQ0IDQwOCA0NDQgMzg0UTQ0NCAzNzMgNDM5IDM2NlQ0MjYgMzU0VDQxMyAzNDlUNDA2IDM1MFEzODcgMzg3IDM0NyA0MTBUMjU3IDQzM1EyMDIgNDMzIDE3NSA0MDlUMTQ3IDM1NVExNDcgMzIwIDE3OSAzMDJUMjY1IDI2NFEyOTAgMjU1IDMxNSAyNDVUMzYwIDIxOVQzOTIgMTgzVDQwNSAxMzJRNDA1IDY2IDM1NyAyN1QyMjIgLTEyWk0xMTQgLTIzNFExMTEgLTIzNyAxMDUgLTIzNlQ5NCAtMjMwVDg2IC0yMjJUODQgLTIxNEwxOTEgLTQ3UTE5MiAtNDYgMjAxIC00N1QyMjAgLTUyVDI0MCAtNjNUMjQ5IC04M1EyNDkgLTEwNSAyMjcgLTEyOEwxMTQgLTIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxQTsiIGdseXBoLW5hbWU9InVuaTAyMUEiIGhvcml6LWFkdi14PSI2MTgiIGQ9Ik0zNTAgNTg1SDE1MVExMjAgNTg1IDEyMCA2MDJRMTIwIDYxMCAxMjQgNjIyVDEzMyA2NDBRMTM5IDY0NyAxNTkgNjQ3SDYyOFE2NTkgNjQ3IDY1OSA2MzBRNjU5IDYyMiA2NTUgNjEwVDY0NiA1OTJRNjQwIDU4NSA2MjAgNTg1SDQxOEwyOTMgMEgyMjZMMzUwIDU4NVpNMTQzIC0yMzRRMTQwIC0yMzcgMTM0IC0yMzZUMTIzIC0yMzBUMTE1IC0yMjJUMTEzIC0yMTRMMjIwIC00N1EyMjEgLTQ2IDIzMCAtNDdUMjQ5IC01MlQyNjkgLTYzVDI3OCAtODNRMjc4IC0xMDUgMjU2IC0xMjhMMTQzIC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMUI7IiBnbHlwaC1uYW1lPSJ1bmkwMjFCIiBob3Jpei1hZHYteD0iMzc1IiBkPSJNMjA4IC0xMlExNDEgLTEyIDEwOCAzMVQ5MyAxNjFMMTQ3IDQxOEg3OVE3OSA0MTkgODAgNDIyUTgwIDQyNCA4MCA0MjZUODIgNDM0TDkwIDQ2OVE5MCA0NzEgOTAgNDcyVDkxIDQ3NFY0NzZIMTU5TDE2OSA1MjNRMTc3IDU2MCAxODkgNTc1VDIyMiA1OTBRMjMyIDU5MCAyMzkgNTg3VDI0NyA1ODJMMjI0IDQ3NkgzNzJRMzcxIDQ3NSAzNzEgNDcyUTM3MCA0NzAgMzcwIDQ2N1QzNjkgNDYwTDM2MSA0MjVRMzYwIDQyMiAzNjAgNDIwVjQxOEgyMTJMMTU3IDE2MVExNDMgOTcgMTYwIDcxVDIxOCA0NFEyNDAgNDQgMjU4IDUzVDI4NCA3M1EyODYgNzUgMjkyIDY2VDI5OSA0M1EyOTkgMjYgMjg1IDEyUTI3NCAxIDI1NSAtNVQyMDggLTEyWk02MSAtMjM0UTU4IC0yMzcgNTIgLTIzNlQ0MSAtMjMwVDMzIC0yMjJUMzEgLTIxNEwxMzggLTQ3UTEzOSAtNDYgMTQ4IC00N1QxNjcgLTUyVDE4NyAtNjNUMTk2IC04M1ExOTYgLTEwNSAxNzQgLTEyOEw2MSAtMjM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM2OyIgZ2x5cGgtbmFtZT0iY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTIyNyA1NDlRMjE3IDU0OSAyMTMgNTU0VDIwOCA1NjZRMjA4IDU4MyAyMjUgNjAzVDI3NSA2NTJRMjkxIDY2NiAzMDcgNjc4VDMzNyA2OTlUMzU4IDcxM1QzNjggNzE5UTM2OSA3MTkgMzc1IDcxNFQzOTAgNjk5VDQwOSA2NzlUNDMwIDY1NVE0NTIgNjI2IDQ2MCA2MDhUNDY5IDU3OFE0NjkgNTY0IDQ2MiA1NTdUNDQ1IDU0OVE0MzIgNTQ5IDQyMCA1NjNUMzg5IDYxMEwzNjAgNjYxTDMwOSA2MDhRMjgzIDU4MSAyNjIgNTY1VDIyNyA1NDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzc7IiBnbHlwaC1uYW1lPSJjYXJvbiIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTMzMyA1MzNRMzMyIDUzMyAzMjYgNTM4VDMxMCA1NTNUMjkxIDU3M1QyNzEgNTk3UTI0OSA2MjYgMjQxIDY0NFQyMzIgNjc0UTIzMiA2ODggMjM5IDY5NVQyNTYgNzAzUTI3MiA3MDMgMjg5IDY3OFQzNDEgNTkxTDM5MiA2NDRRNDE4IDY3MSA0MzkgNjg3VDQ3NCA3MDNRNDg0IDcwMyA0ODggNjk4VDQ5MyA2ODZRNDkzIDY2OSA0NzYgNjQ5VDQyNiA2MDBRNDA5IDU4NiAzOTMgNTc0VDM2NCA1NTNUMzQzIDUzOVQzMzMgNTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM5OyIgZ2x5cGgtbmFtZT0ib3ZlcnNjb3JlIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMjMxIDU2OFEyMDAgNTY4IDIwMCA1ODZRMjAwIDU5NCAyMDMgNjA1VDIxMiA2MjJRMjE5IDYzMCAyMzggNjMwSDQ1OFE0ODkgNjMwIDQ4OSA2MTJRNDg5IDYwNCA0ODYgNTkzVDQ3NyA1NzZRNDcwIDU2OCA0NTEgNTY4SDIzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEODsiIGdseXBoLW5hbWU9ImJyZXZlIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzQ2IDU0OFEzMjIgNTQ4IDI5OSA1NThUMjU2IDU4NFQyMjUgNjE5VDIxMyA2NTVRMjEzIDY2NiAyMTkgNjc0VDIzOCA2ODJRMjU0IDY4MiAyNzggNjYzVDM0NSA1OTFRMzkyIDY0MCA0MjEgNjYxVDQ3MCA2ODJRNDgxIDY4MiA0ODggNjc1VDQ5NSA2NThRNDk1IDY0MyA0ODIgNjI0VDQ0OCA1ODhUNDAwIDU2MFQzNDYgNTQ4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ5OyIgZ2x5cGgtbmFtZT0iZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzQ0IDU0OVEyOTAgNTQ5IDI5MCA1OTBRMjkwIDYxNCAzMDMgNjMzVDM0NiA2NTNRNDAwIDY1MyA0MDAgNjEyUTQwMCA1ODggMzg3IDU2OVQzNDQgNTQ5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRBOyIgZ2x5cGgtbmFtZT0icmluZyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTM0OCA1NTBRMjk5IDU1MCAyNjkgNTc4VDIzOSA2NTFRMjM5IDY3NyAyNDggNzAxVDI3NSA3NDRUMzE2IDc3NFQzNjkgNzg1UTQxOCA3ODUgNDQ4IDc1N1Q0NzggNjg0UTQ3OCA2NTggNDY5IDYzNFQ0NDIgNTkxVDQwMCA1NjFUMzQ4IDU1MFpNMzUwIDU5NVEzNjggNTk1IDM4MiA2MDJUNDA2IDYyMlQ0MjEgNjQ5VDQyNyA2ODBRNDI3IDcwNSA0MTAgNzIyVDM2NyA3NDBRMzQ5IDc0MCAzMzUgNzMzVDMxMSA3MTNUMjk2IDY4NlQyOTAgNjU1UTI5MCA2MzAgMzA3IDYxM1QzNTAgNTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRCOyIgZ2x5cGgtbmFtZT0ib2dvbmVrIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMjgwIDJRMjQ4IC0xNSAyMjggLTMwVDE5NSAtNjBUMTc5IC04NlQxNzQgLTEwOVExNzQgLTEyNCAxODMgLTEzM1QyMDcgLTE0MlEyMjkgLTE0MiAyNDQgLTEyNFEyNTQgLTEyNiAyNjIgLTEzM1QyNzAgLTE1NFEyNzAgLTE3NCAyNTIgLTE4N1QyMDIgLTIwMFExNjIgLTIwMCAxMzcgLTE3OFQxMTEgLTEyMVExMTEgLTgwIDE0OSAtNDJUMjcyIDIzTDI4MCAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRDOyIgZ2x5cGgtbmFtZT0idGlsZGUiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik00MTQgNTQ4UTM5MCA1NDggMzUyIDU2OVQyNzUgNjI4UTI2OSA2MTUgMjYzIDYwMlQyNTAgNTc5VDIzNiA1NjJUMjIxIDU1NVEyMDkgNTU1IDIwNCA1NjFUMTk4IDU3NVExOTggNTkyIDIwNSA2MDlUMjIzIDY0MFQyNDggNjYyVDI3OCA2NzFRMzAyIDY3MSAzNDAgNjUwVDQxNyA1OTFRNDIzIDYwNCA0MjkgNjE3VDQ0MiA2NDBUNDU2IDY1N1Q0NzEgNjY0UTQ4MyA2NjQgNDg4IDY1OFQ0OTQgNjQ0UTQ5NCA2MjcgNDg3IDYxMFQ0NjkgNTc5VDQ0NCA1NTdUNDE0IDU0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJERDsiIGdseXBoLW5hbWU9Imh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTM2NSA1NTFRMzYzIDU1MyAzNzMgNTY3VDQwMiA2MDBUNDQzIDY0MFQ0OTAgNjc5UTUxNCA2OTcgNTM2IDY5N1E1NDggNjk3IDU1NyA2OTBUNTY2IDY3MFE1NjYgNjQ1IDUyOSA2MjBRNTA0IDYwMyA0NzYgNTg5VDQyNCA1NjZUMzg0IDU1M1QzNjUgNTUxWk0xODYgNTUxUTE4NCA1NTMgMTk0IDU2N1QyMjMgNjAwVDI2NCA2NDBUMzExIDY3OVEzMzUgNjk3IDM1NyA2OTdRMzY5IDY5NyAzNzggNjkwVDM4NyA2NzBRMzg3IDY0NSAzNTAgNjIwUTMyNSA2MDMgMjk3IDU4OVQyNDUgNTY2VDIwNSA1NTNUMTg2IDU1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDM5NDsiIGdseXBoLW5hbWU9ImluY3JlbWVudCIgaG9yaXotYWR2LXg9IjY0OSIgZD0iTTI5MyA3MDBIMzk2TDYzMyAwSDMwTDI5MyA3MDBaTTE0MCA3M0g0NjVMMzEwIDUyOEwxNDAgNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQTk7IiBnbHlwaC1uYW1lPSJPbWVnYSIgaG9yaXotYWR2LXg9Ijc2MCIgZD0iTTM4MCA2MDJRMzE4IDYwMiAyNzIgNTg1VDE5NiA1MzdUMTUwIDQ2N1QxMzUgMzgwUTEzNSAzMzUgMTQ5IDI5NFQxODggMjE2VDI0OSAxNDhUMzI1IDkzVjBINTFWOTNIMTg4UTExNCAxNTMgNzIgMjI1VDMwIDM4MFEzMCA0NDYgNTQgNTA0VDEyNCA2MDVUMjM1IDY3NFQzODAgNzAwUTQ2MCA3MDAgNTI1IDY3NVQ2MzUgNjA2VDcwNSA1MDRUNzMwIDM4MFE3MzAgMjk3IDY4OCAyMjVUNTcyIDkzSDcwOVYwSDQzNVY5M1E0NzYgMTE3IDUxMSAxNDhUNTcxIDIxNVQ2MTEgMjkzVDYyNSAzODBRNjI1IDQyNiA2MTAgNDY2VDU2NSA1MzdUNDg4IDU4NFQzODAgNjAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4M0JDOyIgZ2x5cGgtbmFtZT0ibXUiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik01MiAtMjk4UTcgLTI5OCAtOSAtMjcxVC0xNCAtMTkwTDEyOSA0NzZIMTk0TDEzNiAyMDJRMTIyIDEzNCAxNDggOTJUMjM5IDQ5UTI5NCA0OSAzMzMgNzdUNDA2IDE2NEw0NzIgNDc2SDUzN0w0NTcgMTAxUTQ0OSA2NiA0NTggNTJUNTAwIDM3VjMwUTUwMCAyMyA0OTcgMTVUNDg0IC0xVDQ1NSAtOFE0MTcgLTggNDAwIDE0VDM4OCA3OVEzNjIgMzYgMzIwIDEyVDIzMCAtMTJRMTgyIC0xMiAxNDcgNFExMTggMTcgMTAwIDQwTDUxIC0xODlRNDMgLTIyNCA1MiAtMjM4VDk5IC0yNTNWLTI2MFE5OSAtMjY3IDk1IC0yNzVUODEgLTI5MVQ1MiAtMjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4M0MwOyIgZ2x5cGgtbmFtZT0icGkiIGhvcml6LWFkdi14PSI3OTEiIGQ9Ik00MTMgLTEyUTM0MSAtMTIgMjgxIDEzVDE3NyA4MlQxMDkgMTg3VDg1IDMyMlE4NSAzOTQgMTEwIDQ1NlQxNzkgNTYzVDI4MyA2MzNUNDE0IDY1OVE0ODYgNjU5IDU0NiA2MzRUNjQ5IDU2NVQ3MTcgNDYwVDc0MiAzMjVRNzQyIDI1MyA3MTcgMTkxVDY0OCA4NFQ1NDQgMTRUNDEzIC0xMlpNNDE1IDM2UTQ3NSAzNiA1MjUgNTdUNjEyIDExNlQ2NjggMjA2VDY4OCAzMjNRNjg4IDM4NSA2NjcgNDM3VDYwOSA1MjhUNTIyIDU4OVQ0MTIgNjExUTM1MiA2MTEgMzAyIDU5MFQyMTUgNTMxVDE1OSA0NDFUMTM5IDMyNFExMzkgMjYyIDE2MCAyMTBUMjE4IDExOVQzMDUgNThUNDE1IDM2Wk0zMjYgMTM5UTMwMSAxMzkgMzAxIDE2N1Y0NTJRMzAxIDQ2NyAzMTAgNDc2VDMzMyA0ODZINDI5UTQ5NSA0ODYgNTMwIDQ1N1Q1NjYgMzczUTU2NiAzMTcgNTMyIDI4N1Q0MzIgMjU3SDM2MVYxNjdRMzYxIDEzOSAzMzUgMTM5SDMyNlpNNDMzIDMwNlE0NjkgMzA2IDQ4OCAzMjNUNTA3IDM3MlE1MDcgNDAzIDQ4NyA0MjBUNDI5IDQzN0gzNjBWMzA2SDQzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTM7IiBnbHlwaC1uYW1lPSJlbmRhc2giIGhvcml6LWFkdi14PSI1NTkiIGQ9Ik05MSAyMTNRNjIgMjEzIDYyIDIyOVE2MiAyMzcgNjUgMjQ4VDc0IDI2NFE4MSAyNzEgOTggMjcxSDQ3MVE1MDAgMjcxIDUwMCAyNTVRNTAwIDI0NyA0OTcgMjM2VDQ4OCAyMjBRNDgxIDIxMyA0NjQgMjEzSDkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxNDsiIGdseXBoLW5hbWU9ImVtZGFzaCIgaG9yaXotYWR2LXg9IjcyNyIgZD0iTTkxIDIxM1E2MiAyMTMgNjIgMjI5UTYyIDIzNyA2NSAyNDhUNzQgMjY0UTgxIDI3MSA5OCAyNzFINjM5UTY2OCAyNzEgNjY4IDI1NVE2NjggMjQ3IDY2NSAyMzZUNjU2IDIyMFE2NDkgMjEzIDYzMiAyMTNIOTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE4OyIgZ2x5cGgtbmFtZT0icXVvdGVsZWZ0IiBob3Jpei1hZHYteD0iMjM2IiBkPSJNMTY3IDQyNVExNjYgNDIzIDE1NyA0MjNUMTM2IDQyN1QxMTUgNDM4VDEwNSA0NThRMTA1IDQ2OSAxMDkgNDc5VDEyNCA1MDNMMjUzIDY2NVEyNTUgNjY4IDI2MSA2NjdUMjcyIDY2MlQyODEgNjU0VDI4MyA2NDVMMTY3IDQyNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBnbHlwaC1uYW1lPSJxdW90ZXJpZ2h0IiBob3Jpei1hZHYteD0iMjM2IiBkPSJNMTEzIDQyMlExMTEgNDE5IDEwNSA0MjBUOTQgNDI1VDg1IDQzM1Q4MyA0NDJMMTk5IDY2MlEyMDAgNjYzIDIwOSA2NjNUMjMwIDY2MFQyNTEgNjQ5VDI2MSA2MjlRMjYxIDYxOCAyNTcgNjA4VDI0MiA1ODRMMTEzIDQyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjI0MyIgZD0iTS0xNyAtMTQyUS0xOSAtMTQ1IC0yNSAtMTQ0VC0zNiAtMTM5VC00NSAtMTMxVC00NyAtMTIyTDY5IDk4UTcwIDk5IDc5IDk5VDEwMCA5NlQxMjEgODVUMTMxIDY1UTEzMSA1NCAxMjcgNDRUMTEyIDIwTC0xNyAtMTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQzsiIGdseXBoLW5hbWU9InF1b3RlZGJsbGVmdCIgaG9yaXotYWR2LXg9IjM4OSIgZD0iTTE2NyA0MjZRMTY2IDQyNCAxNTcgNDI0VDEzNiA0MjhUMTE1IDQzOVQxMDUgNDU5UTEwNSA0NzAgMTA5IDQ4MFQxMjQgNTA0TDI1MyA2NjZRMjU1IDY2OSAyNjEgNjY4VDI3MiA2NjNUMjgxIDY1NVQyODMgNjQ2TDE2NyA0MjZaTTMyMCA0MjVRMzE5IDQyMyAzMTAgNDIzVDI4OSA0MjdUMjY4IDQzOFQyNTggNDU4UTI1OCA0NjkgMjYyIDQ3OVQyNzcgNTAzTDQwNiA2NjVRNDA4IDY2OCA0MTQgNjY3VDQyNSA2NjJUNDM0IDY1NFQ0MzYgNjQ1TDMyMCA0MjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFEOyIgZ2x5cGgtbmFtZT0icXVvdGVkYmxyaWdodCIgaG9yaXotYWR2LXg9IjM4OSIgZD0iTTExMyA0MjJRMTExIDQxOSAxMDUgNDIwVDk0IDQyNVQ4NSA0MzNUODMgNDQyTDE5OSA2NjJRMjAwIDY2MyAyMDkgNjYzVDIzMCA2NjBUMjUxIDY0OVQyNjEgNjI5UTI2MSA2MTggMjU3IDYwOFQyNDIgNTg0TDExMyA0MjJaTTI2NiA0MjFRMjY0IDQxOCAyNTggNDE5VDI0NyA0MjRUMjM4IDQzMlQyMzYgNDQxTDM1MiA2NjFRMzUzIDY2MiAzNjIgNjYyVDM4MyA2NTlUNDA0IDY0OFQ0MTQgNjI4UTQxNCA2MTcgNDEwIDYwN1QzOTUgNTgzTDI2NiA0MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFFOyIgZ2x5cGgtbmFtZT0icXVvdGVkYmxiYXNlIiBob3Jpei1hZHYteD0iMzk2IiBkPSJNLTE3IC0xNDJRLTE5IC0xNDUgLTI1IC0xNDRULTM2IC0xMzlULTQ1IC0xMzFULTQ3IC0xMjJMNjkgOThRNzAgOTkgNzkgOTlUMTAwIDk2VDEyMSA4NVQxMzEgNjVRMTMxIDU0IDEyNyA0NFQxMTIgMjBMLTE3IC0xNDJaTTEzNiAtMTQzUTEzNCAtMTQ2IDEyOCAtMTQ1VDExNyAtMTQwVDEwOCAtMTMyVDEwNiAtMTIzTDIyMiA5N1EyMjMgOTggMjMyIDk4VDI1MyA5NVQyNzQgODRUMjg0IDY0UTI4NCA1MyAyODAgNDNUMjY1IDE5TDEzNiAtMTQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMDsiIGdseXBoLW5hbWU9ImRhZ2dlciIgaG9yaXotYWR2LXg9IjU0NCIgZD0iTTE5NCAtMTYwUTE3NSAtMTYwIDE3MCAtMTU0VDE2NyAtMTM3TDI0NSAyOThRMjQ4IDMxNSAyNTkgMzM4VDI4NyAzODFMMTIwIDM1OFE5NyAzNTUgODggMzYyVDc4IDM4NVE3OCAzOTUgODAgNDA1VDg4IDQyMlQxMDMgNDMzVDEyNyA0MzVMMjk0IDQxM0wzMTAgNjA5UTMxMiA2MzMgMzIyIDY0M1QzNTQgNjUzUTM3NyA2NTMgMzg5IDY0M1QzOTEgNjA0TDMyNiA0MTFMNDkzIDQzNFE1MTYgNDM3IDUyNSA0MzBUNTM1IDQwN1E1MzUgMzg2IDUyNSAzNzBUNDg2IDM1N0wzMTkgMzc5UTMyNyAzNTkgMzI4IDMzN1QzMjUgMjk4TDIxOCAtMTM4UTIxMyAtMTYwIDE5NiAtMTYwSDE5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjE7IiBnbHlwaC1uYW1lPSJkYWdnZXJkYmwiIGhvcml6LWFkdi14PSI1NDQiIGQ9Ik0xOTQgLTE2MFExNzUgLTE2MCAxNzAgLTE1NFQxNjcgLTEzN0wyMTAgMTA0TDYyIDgyUTM5IDc5IDMwIDg2VDIwIDEwOVEyMCAxMTkgMjIgMTI5VDMwIDE0NlQ0NSAxNTdUNjkgMTU5TDIxNiAxMzhMMjQ1IDI5OFEyNDggMzE1IDI1OSAzMzhUMjg3IDM4MUwxMjAgMzU4UTk3IDM1NSA4OCAzNjJUNzggMzg1UTc4IDM5NSA4MCA0MDVUODggNDIyVDEwMyA0MzNUMTI3IDQzNUwyOTQgNDEzTDMxMCA2MDlRMzEyIDYzMyAzMjIgNjQzVDM1NCA2NTNRMzc3IDY1MyAzODkgNjQzVDM5MSA2MDRMMzI2IDQxMUw0OTMgNDM0UTUxNiA0MzcgNTI1IDQzMFQ1MzUgNDA3UTUzNSAzODYgNTI1IDM3MFQ0ODYgMzU3TDMxOSAzNzlRMzI3IDM1OSAzMjggMzM3VDMyNSAyOThMMjg1IDEzNkw0MzUgMTU4UTQ1OCAxNjEgNDY3IDE1NFQ0NzcgMTMxUTQ3NyAxMTAgNDY3IDk0VDQyOCA4MUwyNzcgMTAyTDIxOCAtMTM4UTIxMyAtMTYwIDE5NiAtMTYwSDE5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjI7IiBnbHlwaC1uYW1lPSJidWxsZXQiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik0xODAgMTM5UTE1OSAxMzkgMTQwIDE0N1QxMDggMTY5VDg2IDIwMlQ3OCAyNDJRNzggMjYzIDg2IDI4MlQxMDcgMzE1VDE0MCAzMzhUMTgwIDM0NlEyMDEgMzQ2IDIyMCAzMzhUMjUyIDMxNlQyNzQgMjgyVDI4MiAyNDJRMjgyIDIyMSAyNzQgMjAyVDI1MyAxNjlUMjIwIDE0N1QxODAgMTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyNjsiIGdseXBoLW5hbWU9ImVsbGlwc2lzIiBob3Jpei1hZHYteD0iNjYxIiBkPSJNNDk2IC02UTQ3MyAtNiA0NjEgM1Q0NDggMjhRNDQ4IDY0IDQ2NCA4MFE0NzcgOTMgNTAxIDkzUTUyNCA5MyA1MzYgODRUNTQ5IDU5UTU0OSAyMyA1MzMgN1E1MjAgLTYgNDk2IC02Wk0yODcgLTZRMjY0IC02IDI1MiAzVDIzOSAyOFEyMzkgNjQgMjU1IDgwUTI2OCA5MyAyOTIgOTNRMzE1IDkzIDMyNyA4NFQzNDAgNTlRMzQwIDIzIDMyNCA3UTMxMSAtNiAyODcgLTZaTTc4IC02UTU1IC02IDQzIDNUMzAgMjhRMzAgNjQgNDYgODBRNTkgOTMgODMgOTNRMTA2IDkzIDExOCA4NFQxMzEgNTlRMTMxIDIzIDExNSA3UTEwMiAtNiA3OCAtNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzA7IiBnbHlwaC1uYW1lPSJwZXJ0aG91c2FuZCIgaG9yaXotYWR2LXg9IjExMTAiIGQ9Ik0yMzIgMzQ3UTIwNCAzNDcgMTc5IDM1NlQxMzYgMzg0VDEwNyA0MjdUOTYgNDg0UTk2IDUxOCAxMDggNTQ5VDE0MyA2MDVUMTk1IDY0M1QyNjIgNjU3UTI5MCA2NTcgMzE1IDY0OFQzNTggNjIwVDM4NyA1NzdUMzk4IDUyMFEzOTggNDg1IDM4NiA0NTRUMzUxIDM5OVQyOTkgMzYxVDIzMiAzNDdaTTY5IC05UTY4IC0xMCA2NCAtOVQ1NSAtNVQ0NiA0VDQyIDE4UTQyIDMxIDQ5IDQxVDc4IDcyTDczNCA2NjJRNzM1IDY2MyA3MzkgNjYyVDc0OCA2NThUNzU3IDY0OVQ3NjEgNjM1UTc2MSA2MjIgNzU0IDYxMlQ3MjUgNTgxTDY5IC05Wk04ODUgLTRRODU3IC00IDgzMiA1VDc4OSAzM1Q3NjAgNzZUNzQ5IDEzM1E3NDkgMTY3IDc2MSAxOThUNzk2IDI1NFQ4NDggMjkyVDkxNSAzMDZROTQzIDMwNiA5NjggMjk3VDEwMTEgMjY5VDEwNDAgMjI2VDEwNTEgMTY5UTEwNTEgMTM0IDEwMzkgMTAzVDEwMDQgNDhUOTUyIDEwVDg4NSAtNFpNNTQxIC00UTUxMyAtNCA0ODggNVQ0NDUgMzNUNDE2IDc2VDQwNSAxMzNRNDA1IDE2NyA0MTcgMTk4VDQ1MiAyNTRUNTA0IDI5MlQ1NzEgMzA2UTU5OSAzMDYgNjI0IDI5N1Q2NjcgMjY5VDY5NiAyMjZUNzA3IDE2OVE3MDcgMTM0IDY5NSAxMDNUNjYwIDQ4VDYwOCAxMFQ1NDEgLTRaTTIzNiAzOThRMjU4IDM5OCAyNzggNDA3VDMxMiA0MzNUMzM0IDQ3MVQzNDMgNTE3UTM0MyA1NTUgMzE5IDU4MFQyNTggNjA2UTIzNSA2MDYgMjE2IDU5N1QxODIgNTcxVDE2MCA1MzNUMTUxIDQ4N1ExNTEgNDQ5IDE3NiA0MjRUMjM2IDM5OFpNODg5IDQ3UTkxMSA0NyA5MzEgNTZUOTY1IDgyVDk4NyAxMjBUOTk2IDE2NlE5OTYgMjA0IDk3MiAyMjlUOTExIDI1NVE4ODggMjU1IDg2OSAyNDZUODM1IDIyMFQ4MTMgMTgyVDgwNCAxMzZRODA0IDk4IDgyOSA3M1Q4ODkgNDdaTTU0NSA0N1E1NjcgNDcgNTg3IDU2VDYyMSA4MlQ2NDMgMTIwVDY1MiAxNjZRNjUyIDIwNCA2MjggMjI5VDU2NyAyNTVRNTQ0IDI1NSA1MjUgMjQ2VDQ5MSAyMjBUNDY5IDE4MlQ0NjAgMTM2UTQ2MCA5OCA0ODUgNzNUNTQ1IDQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbGxlZnQiIGhvcml6LWFkdi14PSIzNDYiIGQ9Ik0yMjMgNzhRMjAzIDc4IDE4MCA5N1QxMzAgMTQ4UTExNiAxNjUgMTA0IDE4MlQ4MyAyMTNUNjkgMjM4VDY1IDI1MVE2NiAyNTMgNzUgMjYyVDk4IDI4NVQxMzEgMzE0VDE3MCAzNDVRMjAzIDM3MSAyMzUgMzg5VDI4NyA0MDhRMjk4IDQwOCAzMDQgNDAxVDMxMCAzODRRMzEwIDM3NiAzMDIgMzY1VDI3OSAzNDFUMjQ2IDMxM1QyMDUgMjg2UTE4NiAyNzUgMTY2IDI2MlQxMjQgMjM3UTE0MSAyMjMgMTU2IDIxMFQxODYgMTgzUTIyMSAxNTEgMjM1IDEzNFQyNTAgMTAxUTI1MCA5MiAyNDIgODVUMjIzIDc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzQTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbHJpZ2h0IiBob3Jpei1hZHYteD0iMzQ2IiBkPSJNNjMgNzhRNTIgNzggNDYgODVUNDAgMTAyUTQwIDEwOSA0OCAxMjBUNzAgMTQ1VDEwNCAxNzNUMTQ1IDIwMFExNjQgMjExIDE4NCAyMjRUMjI2IDI0OVEyMDkgMjYzIDE5NCAyNzZUMTY0IDMwM1ExMjkgMzM1IDExNSAzNTJUMTAwIDM4NVExMDAgMzk0IDEwOCA0MDFUMTI3IDQwOFExNDcgNDA4IDE3MCAzODlUMjIwIDMzOFEyMzMgMzIxIDI0NSAzMDRUMjY3IDI3M1QyODEgMjQ4VDI4NSAyMzVRMjg0IDIzMyAyNzUgMjI0VDI1MiAyMDFUMjE5IDE3MlQxODAgMTQxUTE0NyAxMTUgMTE1IDk3VDYzIDc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA0NDsiIGdseXBoLW5hbWU9InVuaTIwNDQiIGhvcml6LWFkdi14PSI2NTkiIGQ9Ik0yMyAtOFEyMiAtOSAxOCAtOFQ4IC00VC0xIDVULTUgMThRLTUgMzIgNCA0NlQzMCA3NUw2NzYgNjYxUTY3NyA2NjIgNjgxIDY2MVQ2OTEgNjU3VDcwMCA2NDhUNzA0IDYzNVE3MDQgNjIxIDY5NSA2MDdUNjY5IDU3OEwyMyAtOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwQUM7IiBnbHlwaC1uYW1lPSJFdXJvIiBob3Jpei1hZHYteD0iNjYwIiBkPSJNMTE2IDM3NlE4NyAzNzYgODcgMzkyUTg3IDQwMCA5MCA0MTFUOTkgNDI3UTEwNiA0MzQgMTIzIDQzNEgxOTRRMjEwIDQ3NSAyMzEgNTEyVDI4MiA1NzlRMzIyIDYxOSAzNjkgNjM5VDQ3NSA2NTlRNTI3IDY1OSA1NjMgNjQzVDYyNSA2MDJRNjQyIDU4NSA2NTEgNTY0VDY2MCA1MjJRNjYwIDUwNyA2NTMgNDk4VDYzOCA0ODVUNjIyIDQ3OVQ2MTQgNDgwUTU5OSA1NDQgNTYwIDU3M1Q0NjcgNjAyUTQyNSA2MDIgMzkxIDU4N1QzMjggNTQzUTMwNiA1MjEgMjkwIDQ5M1QyNjAgNDM0SDQ3NlE1MDUgNDM0IDUwNSA0MThRNTA1IDQxMCA1MDIgMzk5VDQ5MyAzODNRNDg2IDM3NiA0NjkgMzc2SDI0MFEyMzMgMzQ5IDIyOSAzMjRUMjIyIDI3Nkg0NDJRNDcxIDI3NiA0NzEgMjYwUTQ3MSAyNTIgNDY4IDI0MVQ0NTkgMjI1UTQ1MiAyMTggNDM1IDIxOEgyMjBRMjIzIDE4MiAyMzQgMTUxVDI2NiA5NlQzMTYgNTlUMzgxIDQ2UTQzMSA0NiA0NzAgNjlUNTQ1IDE0NFE1NDYgMTQ1IDU1MSAxNDRUNTYyIDEzOFQ1NzIgMTI3VDU3NyAxMTFRNTc3IDg2IDU0NSA1NFE1MzIgNDEgNTE0IDI5VDQ3NSA4VDQzMCAtNlQzODMgLTEyUTMyNyAtMTIgMjg1IDRUMjE0IDUxVDE3MCAxMjNUMTUyIDIxOEg4MlE1MyAyMTggNTMgMjM0UTUzIDI0MiA1NiAyNTNUNjUgMjY5UTcyIDI3NiA4OSAyNzZIMTU0UTE1NyAyOTkgMTYxIDMyNFQxNzQgMzc2SDExNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMTM7IiBnbHlwaC1uYW1lPSJhZmlpNjEyODkiIGhvcml6LWFkdi14PSI0MzQiIGQ9Ik0xOTkgMzQxUTIyOCAzNjUgMjUxIDM5NVQyOTEgNDU2VDMxNyA1MTNUMzI2IDU1OFEzMjYgNTg0IDMxNSA1ODRRMzA4IDU4NCAzMDAgNTczUTI5MSA1NjEgMjc4IDUzOVQyNTAgNDg2VDIyMiA0MTlUMTk5IDM0MVpNNDQgMTM4UTMwIDE1MSAxOSAxNzJUNyAyMjhRMjUgMjM3IDMzIDI0MFQ0OSAyNDZMNTkgMjUxUTYzIDMyMSA4MSAzODNUMTI2IDQ5N1QxODMgNTg4VDI0NSA2NTJRMjg1IDY4MyAzMjcgNjgzUTM2NyA2ODMgMzk1IDY1MlQ0MjMgNTU4UTQyMyA1MDkgNDAyIDQ2M1QzNDkgMzc1VDI3NiAyOTRUMTk2IDIyM1ExOTYgMjE4IDE5NiAyMTRUMTk1IDIwNFExOTUgMTU4IDIwNyAxMzNUMjM3IDEwN1EyNTQgMTA3IDI3MyAxMzNUMzEwIDIxN1EzMjIgMjIwIDMzNiAyMjBRMzU1IDIyMCAzNzMgMjEzVDQwNCAxODZRMzk3IDE0OSAzODIgMTE0VDM0NSA1MlQyOTMgOVQyMjggLThRMjA2IC04IDE4MiAxVDEzNSAzMFQ5NCA3OFQ2NiAxNDZMNDQgMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyMjsiIGdseXBoLW5hbWU9InRyYWRlbWFyayIgaG9yaXotYWR2LXg9IjcxMSIgZD0iTTQzNyAzNDFRNDE2IDM0MSA0MTYgMzY2VjYyMlE0MTYgNjUxIDQ0MiA2NTFINDY3UTQ4MSA2NTEgNDg2IDY0NlQ0OTcgNjI5TDU2MCA0NzNMNjIzIDYyOVE2MjggNjQxIDYzNCA2NDZUNjUzIDY1MUg2NzZRNzAyIDY1MSA3MDIgNjIyVjM2NlE3MDIgMzQxIDY4MCAzNDFINjczUTY1MiAzNDEgNjUyIDM2NlY1NzlMNTg3IDQxOFE1ODUgNDEyIDU4MSA0MDhUNTU5IDQwNFE1NDIgNDA0IDUzOCA0MDhUNTMyIDQxOEw0NjYgNTc4VjM2NlE0NjYgMzQxIDQ0NiAzNDFINDM3Wk0yMjcgMzQxUTIwNSAzNDEgMjA1IDM2NlY2MDBIMTI0UTEwMCA2MDAgMTAwIDYyMlY2MjZRMTAwIDY0OCAxMjQgNjQ4SDMzOFEzNjIgNjQ4IDM2MiA2MjZWNjIyUTM2MiA2MDAgMzM4IDYwMEgyNThWMzY2UTI1OCAzNDEgMjM0IDM0MUgyMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTI2OyIgZ2x5cGgtbmFtZT0idW5pMjEyNiIgaG9yaXotYWR2LXg9Ijc2MCIgZD0iTTM4MCA2MDJRMzE4IDYwMiAyNzIgNTg1VDE5NiA1MzdUMTUwIDQ2N1QxMzUgMzgwUTEzNSAzMzUgMTQ5IDI5NFQxODggMjE2VDI0OSAxNDhUMzI1IDkzVjBINTFWOTNIMTg4UTExNCAxNTMgNzIgMjI1VDMwIDM4MFEzMCA0NDYgNTQgNTA0VDEyNCA2MDVUMjM1IDY3NFQzODAgNzAwUTQ2MCA3MDAgNTI1IDY3NVQ2MzUgNjA2VDcwNSA1MDRUNzMwIDM4MFE3MzAgMjk3IDY4OCAyMjVUNTcyIDkzSDcwOVYwSDQzNVY5M1E0NzYgMTE3IDUxMSAxNDhUNTcxIDIxNVQ2MTEgMjkzVDYyNSAzODBRNjI1IDQyNiA2MTAgNDY2VDU2NSA1MzdUNDg4IDU4NFQzODAgNjAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyRTsiIGdseXBoLW5hbWU9ImVzdGltYXRlZCIgaG9yaXotYWR2LXg9IjgzMCIgZD0iTTQxNSA2NzFRNDkyIDY3MSA1NjAgNjQ1VDY4MSA1NzNUNzYzIDQ2M1Q3OTMgMzI0SDE4NVExNzUgMzI0IDE3NSAzMTNWMTE2UTIyMyA2NSAyODYgMzhUNDE1IDEwUTQ5MCAxMCA1NTUgNDNUNjY3IDEzMUg3MjRRNjY3IDYyIDU4NSAyNlQ0MTUgLTExUTM0MCAtMTEgMjcyIDE0VDE1MSA4NFQ2NyAxOTFUMzYgMzMwUTM2IDQwMyA2NiA0NjVUMTQ3IDU3NFQyNjggNjQ1VDQxNSA2NzFaTTQxNSA2NTBRMzQ1IDY1MCAyODIgNjIyVDE3NSA1NDNWMzU4UTE3NSAzNDcgMTg1IDM0N0g2NDZRNjU1IDM0NyA2NTUgMzU4VjU0MlE2MTAgNTk0IDU0NiA2MjJUNDE1IDY1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMDI7IiBnbHlwaC1uYW1lPSJwYXJ0aWFsZGlmZiIgaG9yaXotYWR2LXg9IjUzOCIgZD0iTTMwMyA0ODFRMzM1IDQ4MSAzNjEgNDcxVDQwNCA0NDVWNDY0UTQwNCA0OTkgMzk5IDUyOFQzODEgNTc4VDM0MyA2MTBUMjgyIDYyMlEyNDcgNjIyIDIwOCA2MTJMMTg5IDY3OVEyNzEgNzEwIDMzMiA3MTBRNDIxIDcxMCA0NjQgNjQ5VDUwOCA0NzVRNTA4IDM3MCA0ODEgMjgzVDQwOSAxMzNUMzExIDM1VDIwMSAwUTE2NSAwIDEzNCAxMFQ4MCA0NFQ0MyAxMDJUMzAgMTg3UTMwIDI1NiA1NSAzMTBUMTIwIDQwM1QyMDggNDYxVDMwMyA0ODFaTTIwNSAxMDVRMjI5IDEwNSAyNTYgMTIxVDMxMCAxNjdUMzU5IDI0M1QzOTMgMzQ5UTM4MiAzNjEgMzYwIDM3M1QzMDkgMzg2UTI3NSAzODYgMjQ0IDM3MVQxODggMzMxVDE0OSAyNzBUMTM0IDE5NFExMzQgMTU3IDE1MCAxMzFUMjA1IDEwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMDY7IiBnbHlwaC1uYW1lPSJ1bmkyMjA2IiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNMjkzIDcwMEgzOTZMNjMzIDBIMzBMMjkzIDcwMFpNMTQwIDczSDQ2NUwzMTAgNTI4TDE0MCA3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMEY7IiBnbHlwaC1uYW1lPSJwcm9kdWN0IiBob3Jpei1hZHYteD0iNjM0IiBkPSJNNDg0IDBWNjA3SDE1MFYwSDUwVjcwMEg1ODRWMEg0ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjExOyIgZ2x5cGgtbmFtZT0ic3VtbWF0aW9uIiBob3Jpei1hZHYteD0iNDc1IiBkPSJNMTEwIDgwSDQzN1YwSDI1Vjk2TDIwOSAzMjVMMjUgNTU0VjY1MEg0MzdWNTcwSDExNUwyODggMzUzVjMwMEwxMTAgODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjEyOyIgZ2x5cGgtbmFtZT0ibWludXMiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik0xMzQgMjM3UTExNiAyMzcgMTExIDI0M1QxMDkgMjY0TDExMSAyNzFRMTE1IDI4NSAxMjIgMjkxVDE0NyAyOThINTEwUTUyOCAyOTggNTM0IDI5MlQ1MzYgMjcxTDUzNCAyNjRRNTMwIDI1MCA1MjMgMjQ0VDQ5NyAyMzdIMTM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxNTsiIGdseXBoLW5hbWU9ImZyYWN0aW9uIiBob3Jpei1hZHYteD0iNjU5IiBkPSJNMjMgLThRMjIgLTkgMTggLThUOCAtNFQtMSA1VC01IDE4US01IDMyIDQgNDZUMzAgNzVMNjc2IDY2MVE2NzcgNjYyIDY4MSA2NjFUNjkxIDY1N1Q3MDAgNjQ4VDcwNCA2MzVRNzA0IDYyMSA2OTUgNjA3VDY2OSA1NzhMMjMgLThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE5OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjU1IiBkPSJNMTI3IDE5NFExMDQgMTk0IDkyIDIwM1Q3OSAyMjhRNzkgMjY0IDk1IDI4MFExMDggMjkzIDEzMiAyOTNRMTU1IDI5MyAxNjcgMjg0VDE4MCAyNTlRMTgwIDIyMyAxNjQgMjA3UTE1MSAxOTQgMTI3IDE5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMUE7IiBnbHlwaC1uYW1lPSJyYWRpY2FsIiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNMjU2IDUwMUwzNjkgMTcxTDU2NiA3MDBINjQ5TDM4NiAwSDI4M0wxMzYgNDMzSDMwVjUwMUgyNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjFFOyIgZ2x5cGgtbmFtZT0iaW5maW5pdHkiIGhvcml6LWFkdi14PSI3MzMiIGQ9Ik03MDMgMjcxUTcwMyAyMzEgNjkwIDIwM1Q2NTQgMTU2VDYwNCAxMjlUNTQ3IDEyMFE1MTggMTIwIDQ5MyAxMjhUNDQ3IDE1MFQ0MDUgMTgxVDM2NiAyMTdRMzQ3IDE5OSAzMjggMTgyVDI4NyAxNTFUMjQwIDEyOVQxODYgMTIwUTE1NyAxMjAgMTI5IDEyOVQ3OSAxNTZUNDQgMjAzVDMwIDI3MVEzMCAzMTAgNDMgMzM4VDc5IDM4NVQxMjkgNDEzVDE4NiA0MjJRMjE1IDQyMiAyNDAgNDE0VDI4NiAzOTJUMzI3IDM2MVQzNjYgMzI1UTM4NSAzNDMgNDA1IDM2MFQ0NDYgMzkxVDQ5MyA0MTNUNTQ3IDQyMlE1NzYgNDIyIDYwNCA0MTRUNjU0IDM4N1Q2ODkgMzQwVDcwMyAyNzFaTTE4NyAyMjJRMjIzIDIyMiAyNTIgMjM1VDMwOCAyNzFRMjgyIDI5MiAyNTMgMzA2VDE4NyAzMjBRMTY3IDMyMCAxNDkgMzA5VDEzMCAyNzFRMTMwIDI0NCAxNDggMjMzVDE4NyAyMjJaTTU0NiAzMjBRNTEwIDMyMCA0ODEgMzA2VDQyNSAyNzFRNDUxIDI0OSA0ODAgMjM2VDU0NiAyMjJRNTY2IDIyMiA1ODQgMjMzVDYwMyAyNzFRNjAzIDI5OCA1ODUgMzA5VDU0NiAzMjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjJCOyIgZ2x5cGgtbmFtZT0iaW50ZWdyYWwnIiBob3Jpei1hZHYteD0iMzk2IiBkPSJNMTY0IDU5NlExNzIgNjU0IDIwMSA2ODVRMjI4IDcxNCAyNzEgNzIzVDM3NSA3MjRWNjQ4UTMxNCA2NTMgMjg4IDY0MFQyNTUgNTg0TDE2OCAtMzJRMTU5IC05NSAxMjggLTEyNlExMDUgLTE0OSA3MCAtMTU1VC0xNSAtMTU1Vi04MVEyMiAtODQgNDUgLTc1VDc0IC0yNUwxNjQgNTk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI0ODsiIGdseXBoLW5hbWU9ImFwcHJveGVxdWFsIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzM5IDI1MlEzMTUgMjUyIDI3NyAyNzNUMjAwIDMzMlExOTQgMzE5IDE4OCAzMDZUMTc1IDI4M1QxNjEgMjY2VDE0NiAyNTlRMTM0IDI1OSAxMjkgMjY1VDEyMyAyNzlRMTIzIDI5NiAxMzAgMzEzVDE0OCAzNDRUMTczIDM2NlQyMDMgMzc1UTIyNyAzNzUgMjY1IDM1NFQzNDIgMjk1UTM0OCAzMDggMzU0IDMyMVQzNjcgMzQ0VDM4MSAzNjFUMzk2IDM2OFE0MDggMzY4IDQxMyAzNjJUNDE5IDM0OFE0MTkgMzMxIDQxMiAzMTRUMzk0IDI4M1QzNjkgMjYxVDMzOSAyNTJaTTMxNSA4MVEyOTEgODEgMjUzIDEwMlQxNzYgMTYxUTE3MCAxNDggMTY0IDEzNVQxNTEgMTEyVDEzNyA5NVQxMjIgODhRMTEwIDg4IDEwNSA5NFQ5OSAxMDhROTkgMTI1IDEwNiAxNDJUMTI0IDE3M1QxNDkgMTk1VDE3OSAyMDRRMjAzIDIwNCAyNDEgMTgzVDMxOCAxMjRRMzI0IDEzNyAzMzAgMTUwVDM0MyAxNzNUMzU3IDE5MFQzNzIgMTk3UTM4NCAxOTcgMzg5IDE5MVQzOTUgMTc3UTM5NSAxNjAgMzg4IDE0M1QzNzAgMTEyVDM0NSA5MFQzMTUgODFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjYwOyIgZ2x5cGgtbmFtZT0ibm90ZXF1YWwiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik0xNjIgMzQ2UTEzMSAzNDYgMTMxIDM2MlExMzEgMzcwIDEzNSAzODJUMTQ0IDQwMFExNTEgNDA3IDE2OSA0MDdIMzg3TDQ4NyA1NDlRNDk4IDU2NSA1MDggNTY4VDUyOCA1NjVMNTMzIDU2MlE1NDQgNTU1IDU0NSA1NDdUNTM2IDUyMkw0NTUgNDA3SDUyOVE1NjAgNDA3IDU2MCAzOTFRNTYwIDM4MyA1NTYgMzcxVDU0NyAzNTNRNTQwIDM0NiA1MjIgMzQ2SDQwOEwyOTEgMTgwSDQ4MFE1MTEgMTgwIDUxMSAxNjRRNTExIDE1NiA1MDcgMTQ0VDQ5OCAxMjZRNDkxIDExOSA0NzMgMTE5SDI1NEwxNTYgLTIyUTE0NSAtMzkgMTM1IC00MVQxMTUgLTM4TDExMCAtMzVROTkgLTI4IDk4IC0yMFQxMDcgNUwxODYgMTE5SDExM1E4MiAxMTkgODIgMTM1UTgyIDE0MyA4NiAxNTVUOTUgMTczUTEwMiAxODAgMTIwIDE4MEgyMzNMMzUwIDM0NkgxNjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY0OyIgZ2x5cGgtbmFtZT0ibGVzc2VxdWFsIiBob3Jpei1hZHYteD0iNjM0IiBkPSJNNDgwIDMyMVE1MDUgMzA3IDUxMyAyOTRUNTE5IDI3MFE1MTcgMjU0IDUwOCAyNDZUNDk1IDI0MEwxNzIgMzkyUTE0OCA0MDcgMTQ4IDQzMlExNDggNDQ5IDE1NiA0NjJUMTkwIDQ4OEw1NzkgNjI2UTU4MSA2MjcgNTkwIDYxOFQ2MDAgNTk0UTYwMSA1ODMgNTkzIDU3MlQ1NTcgNTQ3TDIyMiA0MzRMNDgwIDMyMVpNMTEzIDExOVE4MiAxMTkgODIgMTM1UTgyIDE0MyA4NiAxNTVUOTUgMTczUTEwMiAxODAgMTIwIDE4MEg0ODBRNTExIDE4MCA1MTEgMTY0UTUxMSAxNTYgNTA3IDE0NFQ0OTggMTI2UTQ5MSAxMTkgNDczIDExOUgxMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlcmVxdWFsIiBob3Jpei1hZHYteD0iNjM0IiBkPSJNMTEzIDI3M1ExMTIgMjg0IDEyMCAyOTZUMTU2IDMyMEw0OTEgNDMyTDIzMyA1NDZRMjA2IDU1NiAxOTkgNTcxVDE5NCA1OTdRMTk2IDYxMyAyMDUgNjIxVDIxOCA2MjdMNTQxIDQ3NVE1NTUgNDcwIDU2MCA0NTlUNTY1IDQzNVE1NjUgNDE4IDU1NyA0MDRUNTIzIDM3OUwxMzQgMjQxUTEzMiAyNDAgMTIzIDI0OVQxMTMgMjczWk0xMTMgMTE5UTgyIDExOSA4MiAxMzVRODIgMTQzIDg2IDE1NVQ5NSAxNzNRMTAyIDE4MCAxMjAgMTgwSDQ4MFE1MTEgMTgwIDUxMSAxNjRRNTExIDE1NiA1MDcgMTQ0VDQ5OCAxMjZRNDkxIDExOSA0NzMgMTE5SDExM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDI1Q0E7IiBnbHlwaC1uYW1lPSJsb3plbmdlIiBob3Jpei1hZHYteD0iNTIwIiBkPSJNMzAgMzg4TDIyNiA3NzZIMjk0TDQ5MCAzODhMMjk0IDBIMjI2TDMwIDM4OFpNMzcwIDM4OEwyNjAgNjE2TDE1MCAzODhMMjYwIDE1OUwzNzAgMzg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkIwMTsiIGdseXBoLW5hbWU9ImZpIiBob3Jpei1hZHYteD0iNTczIiBkPSJNMTY2IDQxOEg3MFE3MCA0MTkgNzEgNDIyUTcxIDQyNCA3MSA0MjZUNzMgNDM0TDgxIDQ2OVE4MSA0NzEgODEgNDcyVDgyIDQ3NFY0NzZIMTc4TDE5MSA1MzRRMjA4IDYxMiAyNDcgNjUwVDM0NiA2ODlRMzc3IDY4OSAzOTcgNjgyVDQzMCA2NjFRNDQ0IDY0NyA0NDQgNjI5UTQ0NCA2MjAgNDQxIDYxNFQ0MzMgNjAzVDQyNCA1OTZUNDE5IDU5NVE0MDkgNjA5IDM4OSA2MjBUMzQzIDYzMVEzMDkgNjMxIDI4NyA2MDdUMjUyIDUyNUwyNDEgNDc2SDM2NVEzNjQgNDc1IDM2NCA0NzJRMzYzIDQ3MCAzNjMgNDY3VDM2MiA0NjBMMzU0IDQyNVEzNTMgNDIyIDM1MyA0MjBWNDE4SDIzMEwxNDIgMEg3N0wxNjYgNDE4Wk00NTYgLThRNDExIC04IDM5NSAxOVQzOTAgMTAwTDQ3MCA0NzZINTM1TDQ1NSAxMDFRNDQ3IDY2IDQ1NiA1MlQ1MDMgMzdRNTAzIDM3IDUwMyAzMFQ0OTkgMTVUNDg1IC0xVDQ1NiAtOFpNNTM3IDU5NlE0OTMgNTk2IDQ5MyA2MjlRNDkzIDY0OSA1MDQgNjY0VDUzOSA2ODBRNTgzIDY4MCA1ODMgNjQ3UTU4MyA2MjcgNTcyIDYxMlQ1MzcgNTk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkIwMjsiIGdseXBoLW5hbWU9ImZsIiBob3Jpei1hZHYteD0iNTczIiBkPSJNMTY2IDQxOEg3MFE3MCA0MTkgNzEgNDIyUTcxIDQyNCA3MSA0MjZUNzMgNDM0TDgxIDQ2OVE4MSA0NzEgODEgNDcyVDgyIDQ3NFY0NzZIMTc4TDE5MSA1MzRRMjA4IDYxMiAyNDcgNjUwVDM0NiA2ODlRMzc3IDY4OSAzOTcgNjgyVDQzMCA2NjFRNDQ0IDY0NyA0NDQgNjI5UTQ0NCA2MjAgNDQxIDYxNFQ0MzMgNjAzVDQyNCA1OTZUNDE5IDU5NVE0MDkgNjA5IDM4OSA2MjBUMzQzIDYzMVEzMDkgNjMxIDI4NyA2MDdUMjUyIDUyNUwyNDEgNDc2SDM2NVEzNjQgNDc1IDM2NCA0NzJRMzYzIDQ3MCAzNjMgNDY3VDM2MiA0NjBMMzU0IDQyNVEzNTMgNDIyIDM1MyA0MjBWNDE4SDIzMEwxNDIgMEg3N0wxNjYgNDE4Wk00NTYgLThRNDExIC04IDM5NSAxOVQzOTAgMTAwTDUxMyA2NzdINTc4TDQ1NSAxMDFRNDQ3IDY2IDQ1NiA1MlQ1MDMgMzdRNTAzIDM3IDUwMyAzMFQ0OTkgMTVUNDg1IC0xVDQ1NiAtOFoiICAvPgorCis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkZDsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJDIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iTyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJRIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlQiIGs9IjEyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlUiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iViIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJXIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlkiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iXCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ2IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0ieSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGE5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gzYzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE1MjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDFjOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxZDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxODsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMTk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE3ODsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGRkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJYIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3gxNzg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMyOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxNjA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE2MTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImYW1wOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IikiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MmM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iLSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ii4iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSI6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJBIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iQyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iRyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iSiIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ik8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlMiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iVCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJhIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iYyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImQiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJlIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Im8iIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0icSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJzIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hlNzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hhOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDNjMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hlNjsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hhYjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hiYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGMwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGMzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQ1OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTUyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTUzOyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDM5OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwM2E7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDFlOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGMyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGMxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDQ7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDEzMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hkZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iLiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJWIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iVyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlgiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJZIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxNzg7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hmMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iLSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IkMiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iRyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Ik8iIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iUSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJUIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJjIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJmIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJpIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0icSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkNjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZTc7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkODsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZTY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDU7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDE1MjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MTUzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDEzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDE0OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQzOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkNDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDI7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iQSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IkoiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJUIiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGM0OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGM1OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGM2OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMwOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMzOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMyOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMxOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4ZGQ7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJXIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJYIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJZIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJnIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJqIiBrPSItMTUwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4MTc4OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iQSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzU7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM2OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMyOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJUIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IjEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJYIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iWiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSIxIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSI0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkciIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9Ik8iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IlEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSI0IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iNyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3hiMDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjEyMjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iNyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSI3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDJjOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSItIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Ii4iIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iMCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIxIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIzIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI0IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjUiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjkiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3hhMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAyNjsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxYTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxZTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MmM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iNyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDI2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDFhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDFlOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSImI3gyYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iLiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSI3IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMjY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMWE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSIxIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iMSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSI3IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImZ3Q7IiB1Mj0iNyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGRkOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSIqIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDJjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iLSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iLiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iQCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iUyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJUIiBrPSIxMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJWIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlciIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iWSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE3ODsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IiYjeGRkOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJWIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJZIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IiYjeDE3ODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4MTdkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJUIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IloiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iYSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJjIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImQiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iZSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJvIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZTc7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGU2OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxNTM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGRkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iViIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJXIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlgiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE3ODsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iYSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJjIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJvIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGU3OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZTY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDE1MzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTYxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkZDsiIGs9Ii0yNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiZhbXA7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDJjOyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Ii4iIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iLyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSI6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iQCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJBIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkoiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVCIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJZIiBrPSItMjUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJhIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJkIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImUiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJnIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJqIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iciIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJzIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ieCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InoiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hlNzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hlNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAyNjsiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzA7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDE3ODsiIGs9Ii0yNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMWE7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMWU7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MmM7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSIuIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJUIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iVyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJZIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIwMjY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gxNzg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIwMWE7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMDFlOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0iLyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSJ2IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSSIgdTI9InYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iSSIgdTI9InkiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IkEiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0ieSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGM2OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzA7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMzsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGMyOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzE7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hmMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTYwOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRkOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTdkOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiZhbXA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9Ii0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iQCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJDIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iTyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJRIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJUIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iViIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJZIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJaIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJmIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE1MjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDEzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDE0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNzg7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkZDsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJDIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iTyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJRIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlQiIGs9IjEyMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlUiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iViIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJXIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlkiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iXCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJ2IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0ieSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGE5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gzYzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE1MjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMDFjOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxZDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxODsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMTk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE3ODsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTSIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0ieSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0iLyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik4iIHUyPSJ2IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9Ik4iIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hkZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTdkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iLiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJUIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iVyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJYIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlkiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxNzg7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hkZDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxN2Q7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiZhbXA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDJjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSIuIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkEiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iSiIgaz0iODUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJWIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJZIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWiIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImYiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ0IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ2IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ3IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ4IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM0OyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNTsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM2OyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MjAyNjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzA7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMzOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyMDFhOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyMDFlOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMjsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzE7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGRkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ii8iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iViIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJXIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlgiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iWSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ODsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGRkOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJmFtcDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IkEiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iVCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJZIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJ2IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJ3IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJ5IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4MTc4OyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjMTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGRkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJYIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3gxNzg7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMyOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTYxOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZGQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiZhbXA7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDJjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSItIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Ii4iIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iOiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iQSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJDIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iSiIgaz0iODUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJPIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iWSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iWiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJcIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJhIiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImMiIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZCIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJlIiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJtIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im4iIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJwIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InEiIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iciIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJzIiBrPSIxMDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InUiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idiIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ3IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IngiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ieSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ6IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM0OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGU3OyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkODsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hlNjsiIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YmY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGFiOyIgaz0iMTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YmI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMjY7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMwOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE1MjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTUzOyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDEzOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDE0OyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxNzg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDM5OyIgaz0iMTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxYTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxZTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxMzE7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDJjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IkEiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0ieSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGM2OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzA7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjMzsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGMyOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzE7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNjA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNjE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGRkOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJmFtcDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iKSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MmM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Ii0iIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iLiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSI6IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iQSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJKIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlMiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlQiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJYIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJZIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJdIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJhIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iYyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJkIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJnIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im0iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJyIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ1IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ4IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ifSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM1OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hlNzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGU2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hhYjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YmI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMjY7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTUzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDEzOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDE0OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDM5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDNhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDFhOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDFlOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDEzMTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTYwOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTYxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImYW1wOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIpIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iLSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJHIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkoiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJRIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlMiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJYIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Il0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImEiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJjIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImQiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJmIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJpIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im0iIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibiIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJvIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InAiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJyIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InMiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ1IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ9IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hlNzsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZTY7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGFiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hiYjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNTM7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMTQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMzk7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwM2E7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTMxOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGRkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJmFtcDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iKSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJDIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IkciIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iTyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJRIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJZIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJdIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ1IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InYiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ieSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ifSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMwOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzM7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTUyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE3ODsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMyOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzE7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxMzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE2MDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE2MTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iKSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MmM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iLiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSI6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iQCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJBIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJHIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iSiIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJPIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iUSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlMiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlQiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlYiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Il0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImEiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iYyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJkIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImUiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJnIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJvIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0icSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJyIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InMiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ1IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ4IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ9IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjNDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGU3OyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM2OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkODsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gzYzA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGU2OyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhYjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YmI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTUyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE1MzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGYwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iQyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJHIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iTyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJRIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IlQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iYSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJlIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iaiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJxIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ2OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hlNzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hlNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNTsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTUyOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxNTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDM7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ0OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkMjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSImI3hkZDsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlYiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlciIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlgiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlkiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9ImciIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9ImoiIGs9Ii0xNTAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSImI3gxNzg7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3hkZDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iVCIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJWIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iWSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImoiIGs9Ii0xMzAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeDE3ODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iYSIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gxNjE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJzIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ4IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZCIgdTI9InYiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iZCIgdTI9InkiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGYwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImYW1wOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIpIiBrPSItNzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIqIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyYzsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIuIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ij8iIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IlwiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Il0iIGs9Ii03MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ieSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ifSIgaz0iLTcwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIxMjI7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YWI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGJiOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDI2OyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMWM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFkOyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxODsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTk7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDM5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDNhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFhOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFlOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iKSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iLyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iXSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iZyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iaiIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0idCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0ifSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iJiN4MjAxYzsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMWQ7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3gyMDE4OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iJiN4MjAxOTsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9Ij8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJqIiB1Mj0iaiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJqIiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJqIiB1Mj0ieSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJnIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iayIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ2IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ5IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJsIiB1Mj0idiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJsIiB1Mj0ieSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDE2MTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IngiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iJiN4MTYxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0icyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieCIgaz0iNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InEiIHUyPSJqIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ii8iIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iPyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZiIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ0IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ2IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ3IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ4IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ5IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDEzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZDsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE5OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MmM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSIuIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJ2IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJ4IiBrPSItNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9InkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMjY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxYzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMTg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFhOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxZTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idSIgdTI9InYiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idSIgdTI9InkiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSItIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9Ii4iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0idiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0idyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0ieSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDFkOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxODsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTk7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDFhOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDFlOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iLiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJ2IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJ5IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDI2OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDFjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxZDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMTg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDE5OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxYTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJhIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImMiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iZCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJlIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9Im8iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0icSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJ2IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3hlNzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gxNTM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDFkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxODsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTk7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDM5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InYiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InciIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InkiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAyNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDFjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE5OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0ibSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJuIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieiIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0icCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InIiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0idSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJ2IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJ5IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeGFiOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMzk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDEzMTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iJiN4ZGQ7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJXIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJYIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJZIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJnIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJqIiBrPSItMTUwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iJiN4MTc4OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZGQ7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iKiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDJjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSItIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ii4iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iQCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iVCIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlYiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJXIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iWSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNzg7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZGQ7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iKiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDJjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSItIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Ii4iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iQCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iVCIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlYiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJXIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iWSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNzg7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJhIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iYyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJlIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9Im8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJxIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZTY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4MTUzOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQxOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMTsiIHUyPSJ2IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQxOyIgdTI9InkiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4ZGQ7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTdkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IkoiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJUIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iViIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlciIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJYIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iWSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IloiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTc4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iQSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGM0OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzA7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTk7IiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGU5OyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTg7IiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZWE7IiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGVhOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZWI7IiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGViOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gxNjE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0icyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gxNjE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0icyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0ieCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gxNjE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0icyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0ieCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gxNjE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0icyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiMDsiIHUyPSI0IiBrPSI2NSIgLz4KKzxoa2VybiB1MT0iJiN4YTM7IiB1Mj0iMSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhMzsiIHUyPSI0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MTYxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9ImciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJzIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ4IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDFjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4ZGQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGM1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGMzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJhIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iYyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJlIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9Im8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJxIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZTY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4MTUzOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGRkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iVCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJXIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iWCIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlkiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE3ODsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTY7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9IngiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MTYxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ii4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IngiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IjMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IkMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJHIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iTyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJUIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJZIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNzg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTkyOyIgdTI9IjEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iVCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iWSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJUIiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IngiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJ6IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIxIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iViIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGMzOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE2MDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkZDsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSIqIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MmM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Ii0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iLiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJUIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iViIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlciIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJZIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ4IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hhZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gzYzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE3ODsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE2MDsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkZDsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSIqIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MmM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9Ii0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iLiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJUIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iViIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlciIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJZIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ4IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hhZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gzYzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE3ODsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGRkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iVCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJXIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iWCIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlkiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE3ODsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iYSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJjIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJvIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGU3OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZTY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeDE1MzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTM7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTdkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iMSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlgiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IloiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeDE3ZDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJYIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJaIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTYxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4ZGQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iQSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iSiIgaz0iMTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlQiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iVyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJZIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0idSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGU3OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGMwOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE2MDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkoiIGs9IjEyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJTIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJhIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJjIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJkIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJlIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJxIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGU3OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hlNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTUzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTYxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4ZGQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iQSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iSiIgaz0iMTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlQiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJZIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iYSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iYyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0icSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0icyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0idSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU3OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hlNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMwOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE2MDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkoiIGs9IjEyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJTIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJhIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJjIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJkIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJlIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJxIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGU3OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hlNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4MTUzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNjA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNjE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiZhbXA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IikiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ii4iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iOiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iQSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJDIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iRyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkoiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iTyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJTIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJUIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJYIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJdIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJhIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImMiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZCIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJlIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Im4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ibyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InEiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iciIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJzIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0idSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ifSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGM1OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNjsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YWI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ1OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDE1MjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNTM7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMzk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwM2E7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDQ7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGE0OyIgdTI9IjQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IiYjeGRkOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iVCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iWSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJUIiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0ieCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0ieiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIxIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iViIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iaiIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM1OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMyOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iNiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iOSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iQSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9Ik8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlQiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImoiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjNDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTYwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGRkOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IioiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iLSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSIuIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkAiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ik8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iUyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlQiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJWIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iVyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlkiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ0IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IngiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InoiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGE5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIxMjI7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDNjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMjY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDE4OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTc4OyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iQCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IlQiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iYSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJkIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJnIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJvIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0icSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZTc7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGU2OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeDE1MzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZGQ7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iKiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDJjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSItIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Ii4iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iQCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJTIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iVCIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlYiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJXIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iWSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ieiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQ2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YTk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNzg7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iVCIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJhIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iYyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJlIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9Im8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJxIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4ZTY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4MTUzOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJUIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJjIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iZCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImUiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iZyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0ibyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9InEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGU3OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hlNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3gxNTM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2Q7IiB1Mj0iLyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNkOyIgdTI9InYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2Q7IiB1Mj0ieSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjZTsiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hjZTsiIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNmOyIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSJ2IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNmOyIgdTI9InkiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2M7IiB1Mj0iLyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNjOyIgdTI9InYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2M7IiB1Mj0ieSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hkZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iLiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJWIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iVyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlgiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJZIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gxNzg7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeGRkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iVCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJXIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iWCIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlkiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE3ODsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4ZGQ7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTdkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IkoiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJUIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iViIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlciIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJYIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IloiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTc4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iQSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGM0OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzA7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iQSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM0OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4YzA7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSIuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iQSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0idiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSJ5IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGM0OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzA7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iMSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IjciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlgiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hkZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iLiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJWIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iVyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlgiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJZIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxNzg7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+CisKKzwvZm9udD4KKzwvZGVmcz4KKzx0ZXh0IHg9IjQwIiB5PSI0MCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQcOBw4DDgsOEw4XDg8OGIEPDhyBEw5AgRcOJw4jDisOLIEkgw40gw4wgw44gw48gTsORPC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjgwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID5Pw5PDksOUw5bDlcOYxZIgU8WgIFXDmsOZw5vDnCBZw53FuCBaxb0gw54gYcOhw6DDosOkw6XDo8OmIGPDpyBkw7AgZcOpw6jDqsOrIGkgxLEgw60gw6wgw64gw68gbsOxIG/Ds8Oyw7TDtsO1w7jFkyBzxaHDnyB1w7rDucO7w7wgecO9w78gesW+PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjEyMCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+w74gMTIzNDU2Nzg5MCDCvSDCvCDCviAlIOKAsCAkwqLCo8KlxpLigqzCpCDigKAg4oChIMKnIMK2ICMgXn7CtSArw5fCsSAmbHQ7ID0gJmd0OyDDt8KsICHCoT/CvyAmcXVvdDsgJmFtcDsgJmFwb3M7ICogwrAgLiAsIDogOyAoKSBbIFwgXSB7fSAvIHw8L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTYwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7CpiBfIOKAmiDigJ4g4oCmIOKAueKAuiDCq8K7IOKAmCDigJkg4oCcIOKAnSDigKIgwq0gLSDigJMg4oCUIEAgwqkgwq4g4oSiIMKqwrogwrnCssKzIMK0IGAgy4Ygy5wgwqggwq8gwrcgwrg8L3RleHQ+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJJdGFsaWMudHRmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkl0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmNzY3NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJJdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJJdGFsaWMud29mZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJJdGFsaWMud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBkOTBkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkl0YWxpYy53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodC5lb3QgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHQuZW90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGQxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHQuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodC5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjM5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHQuc3ZnCkBAIC0wLDAgKzEsMzg3MiBAQAorPD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCIgPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID4KKzxtZXRhZGF0YT4KKzx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKzxpZD48IVtDREFUQVtPbW5lc19BVFQgVzAyIExpZ2h0XV0+PC9pZD4KKzx2ZW5kb3I+TW9ub3R5cGUgSW1hZ2luZyBJbmMuPC92ZW5kb3I+Cis8Y3JlZGl0cz4KKzxuYW1lPkZvbnRzLmNvbSBXZWJGb250czwvbmFtZT4KKzxVUkw+aHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbTwvVVJMPgorPHJvbGU+SG9tZSBvZiB0aGUgV2ViIGZvbnRzPC9yb2xlPgorPC9jcmVkaXRzPgorPGxpY2Vuc2U+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb20vTGVnYWw8L1VSTD4KKzwvbGljZW5zZT4KKzxjb3B5cmlnaHQ+PCFbQ0RBVEFbR2VuZXJhdGVkIGluIDIwMTAgYnkgRm9udExhYiBTdHVkaW8uIENvcHlyaWdodCBpbmZvIHBlbmRpbmcuXV0+PC9jb3B5cmlnaHQ+Cis8dHJhZGVtYXJrPjwvdHJhZGVtYXJrPgorPGxpY2Vuc2VlPgorPG5hbWU+PC9uYW1lPgorPC9saWNlbnNlZT4KKzwvbWV0YWRhdGE+Cis8ZGVmcyA+Cis8Zm9udCBob3Jpei1hZHYteD0iNTQzIiBpZD0iT21uZXNfQVRUVzAyTGlnaHQiPgorPGZvbnQtZmFjZSBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBMaWdodCIgcGFub3NlLTE9IjAgMCAwIDAgMCAwIDAgMCAwIDAiIGFzY2VudD0iNzAwIiBkZXNjZW50PSItMzAwIiB1bml0cy1wZXItZW09IjEwMDAiIGFscGhhYmV0aWM9IjAiPgorPC9mb250LWZhY2U+Cis8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iMTc2IiAvPgorCis8Z2x5cGggdW5pY29kZT0iJiN4QTsiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDsiIC8+Cis8Z2x5cGggdW5pY29kZT0iICIgZ2x5cGgtbmFtZT0ic3BhY2UiIGhvcml6LWFkdi14PSIxNzYiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgZ2x5cGgtbmFtZT0iZXhjbGFtIiBob3Jpei1hZHYteD0iMjYyIiBkPSJNMTI4IDE3M1ExMTcgMTczIDExNyAxOTNMMTAxIDY0N0gxNjFMMTQ2IDE5M1ExNDUgMTgzIDE0NCAxNzhUMTM0IDE3M0gxMjhaTTEyNyAtNVE5MyAtNSA5MyAzMFYzN1E5MyA3MiAxMjcgNzJIMTM1UTE2OSA3MiAxNjkgMzdWMzBRMTY5IC01IDEzNSAtNUgxMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGdseXBoLW5hbWU9InF1b3RlZGJsIiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMTA5IDQxMFExMDIgNDEwIDEwMCA0MTVUOTYgNDMwTDgzIDY0N0gxNDNMMTI5IDQzMFExMjggNDIwIDEyNiA0MTVUMTE3IDQxMEgxMDlaTTI0NCA0MTBRMjM3IDQxMCAyMzUgNDE1VDIzMiA0MzBMMjE4IDY0N0gyNzhMMjY0IDQzMFEyNjMgNDIwIDI2MSA0MTVUMjUyIDQxMEgyNDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIjIiBnbHlwaC1uYW1lPSJudW1iZXJzaWduIiBob3Jpei1hZHYteD0iNjczIiBkPSJNMTQwIC0zUTEyNiAtMyAxMTggMTBUMTIxIDU3TDE2MCAxODRIMzRWMjI3SDE3MkwyMDIgMzIzUTIxNSAzNjUgMjMyIDQyMEgxMDhWNDYzSDI0NUwzMDEgNjQ4UTMwMyA2NTAgMzExIDY1MFEzMjUgNjUwIDMzMyA2MzdUMzMwIDU5MEwyOTEgNDYzSDQ2N0w1MjMgNjQ4UTUyNSA2NTAgNTMzIDY1MFE1NDcgNjUwIDU1NSA2MzdUNTUyIDU5MEw1MTMgNDYzSDYzOVY0MjBINTAwTDQ0MSAyMjdINTY1VjE4NEg0MjhMMzcyIC0xUTM3MCAtMyAzNjIgLTNRMzQ4IC0zIDM0MCAxMFQzNDMgNTdMMzgyIDE4NEgyMDZMMTUwIC0xUTE0OCAtMyAxNDAgLTNaTTM5NiAyMjZMNDU1IDQyMUgyNzdMMjE4IDIyNkgzOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIkIiBnbHlwaC1uYW1lPSJkb2xsYXIiIGhvcml6LWFkdi14PSI1NjUiIGQ9Ik0yODAgLTk2UTI2MCAtOTYgMjYwIC05NVYtOFExOTkgLTMgMTU2IDE2VDg3IDYxUTcwIDc4IDYzIDkzVDU2IDEyMFE1NiAxMjggNjAgMTM0VDcwIDE0M1Q4MCAxNDlUODYgMTUwUTk0IDEzMCAxMDkgMTEyVDE0NSA3N1QxOTYgNTFUMjYzIDM3VjMwOVEyMjcgMzE4IDE5MyAzMzBUMTMxIDM2MVQ4OCA0MTBUNzIgNDgzUTcyIDUxOCA4NiA1NDhUMTI2IDYwMVQxODYgNjM4VDI2MiA2NTVWNzM5UTI2MiA3NDAgMjgyIDc0MEgyODdRMzA2IDc0MCAzMDYgNzM5VjY1NlEzNjIgNjUyIDQwMiA2MzRUNDY1IDU5M1E0NzggNTgxIDQ4NSA1NjdUNDkzIDU0MlE0OTMgNTM0IDQ4OSA1MjhUNDc5IDUxOVQ0NjkgNTEzVDQ2MyA1MTJRNDQ2IDU0OCA0MDcgNTc3VDMwNCA2MTFWMzUwUTM0MiAzNDEgMzc4IDMyOVQ0NDQgMjk2VDQ5MCAyNDVUNTA4IDE2OFE1MDggMTMxIDQ5MyAxMDBUNDUxIDQ1VDM4NyA4VDMwNSAtOVYtOTVRMzA1IC05NiAyODUgLTk2SDI4MFpNMjY1IDYxMFEyMDIgNjA2IDE2MiA1NzJUMTIyIDQ4M1ExMjIgNDU0IDEzMiA0MzRUMTYyIDQwMVQyMDcgMzc4VDI2NSAzNjBWNjEwWk0zMDIgMzdRMzM3IDM4IDM2NiA0OFQ0MTUgNzVUNDQ3IDExNVQ0NTkgMTY2UTQ1OSAxOTggNDQ3IDIxOVQ0MTIgMjU2VDM2MiAyODFUMzAyIDI5OVYzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiUiIGdseXBoLW5hbWU9InBlcmNlbnQiIGhvcml6LWFkdi14PSI3MzgiIGQ9Ik0yMDAgMzU4UTE2OSAzNTggMTQzIDM2OVQ5OCA0MDBUNjcgNDQ2VDU2IDUwM1Y1MTBRNTYgNTQwIDY3IDU2NlQ5NyA2MTNUMTQzIDY0NFQyMDAgNjU2UTIzMSA2NTYgMjU3IDY0NVQzMDIgNjE0VDMzMiA1NjhUMzQzIDUxMlY1MDRRMzQzIDQ3NCAzMzIgNDQ4VDMwMiA0MDFUMjU2IDM3MFQyMDAgMzU4Wk0xMTggLTZRMTE3IC03IDExMyAtNlQxMDUgLTNUOTggNFQ5NCAxNVE5NCAyNiA5OCAzNFQxMTYgNTZMNjE3IDY1N1E2MTggNjU4IDYyMiA2NTdUNjMwIDY1NFQ2MzcgNjQ4VDY0MSA2MzZRNjQxIDYyMSA2MTggNTk1TDExOCAtNlpNNTM4IC01UTUwOCAtNSA0ODIgNlQ0MzYgMzdUNDA2IDgzVDM5NSAxNDBWMTQ3UTM5NSAxNzcgNDA2IDIwM1Q0MzYgMjUwVDQ4MiAyODFUNTM5IDI5M1E1NjkgMjkzIDU5NSAyODJUNjQxIDI1MVQ2NzEgMjA1VDY4MiAxNDlWMTQxUTY4MiAxMTEgNjcxIDg1VDY0MSAzOFQ1OTUgN1Q1MzggLTVaTTIwMCAzOTdRMjQ0IDM5NyAyNzIgNDI3VDMwMCA1MDJWNTEyUTMwMCA1MzQgMjkzIDU1M1QyNzIgNTg3VDI0MCA2MTBUMTk5IDYxOFExNTYgNjE4IDEyOCA1ODhUMTAwIDUxMlY1MDJRMTAwIDQ1NyAxMjggNDI3VDIwMCAzOTdaTTUzOSAzNFE1ODMgMzQgNjEwIDY0VDYzOCAxMzlWMTQ5UTYzOCAxOTQgNjEwIDIyNFQ1MzggMjU1UTQ5NCAyNTUgNDY3IDIyNVQ0MzkgMTQ5VjEzOVE0MzkgOTQgNDY3IDY0VDUzOSAzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBnbHlwaC1uYW1lPSJhbXBlcnNhbmQiIGhvcml6LWFkdi14PSI2NzEiIGQ9Ik0yNjAgLTEwUTIxMSAtMTAgMTcxIDNUMTAyIDQwVDU3IDk4VDQxIDE3N1E0MSAyMTYgNTQgMjQ3VDkxIDMwMVQxNDcgMzQyVDIxOCAzNzBRMTkyIDM5OSAxNzQgNDMyVDE1NiA1MDdRMTU2IDUzOCAxNjcgNTY1VDE5OSA2MTNUMjQ5IDY0NVQzMTMgNjU3UTM0NiA2NTcgMzczIDY0NlQ0MjEgNjE2VDQ1MiA1NzBUNDYzIDUxNVE0NjMgNDgzIDQ1MiA0NThUNDE4IDQxM1QzNjYgMzc5VDI5NyAzNTVMNDg4IDE3NlE1MTEgMjE1IDUzMCAyNjVUNTY0IDM4N0g2MTNRNjA3IDM1NSA1OTggMzIzVDU3NiAyNTlUNTUwIDE5OVQ1MjEgMTQ3TDY2MiAxOFE2NjQgMTYgNjU5IDdUNjM1IC0zUTYyNyAtMyA2MTkgLTFUNTk4IDEzTDQ5NCAxMDlRNDQ5IDU0IDM5MCAyMlQyNjAgLTEwWk0yNjMgMzNRMzI2IDMzIDM3NiA2MlQ0NjMgMTM5TDI0NiAzNDJRMjE0IDMzMiAxODYgMzE5VDEzOCAyODZUMTA1IDI0MFQ5MyAxNzlROTMgMTExIDEzOSA3MlQyNjMgMzNaTTI2NyAzODRRMzM3IDQwMSAzNzcgNDMwVDQxNyA1MTRRNDE3IDUzNSA0MTAgNTUzVDM4OSA1ODZUMzU2IDYwOFQzMTIgNjE2UTI2MCA2MTYgMjMyIDU4NVQyMDQgNTA4UTIwNCA0NzMgMjIxIDQ0M1QyNjcgMzg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFwb3M7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsZSIgaG9yaXotYWR2LXg9IjIyNiIgZD0iTTEwOSA0MTBRMTAyIDQxMCAxMDAgNDE1VDk2IDQzMEw4MyA2NDdIMTQzTDEyOSA0MzBRMTI4IDQyMCAxMjYgNDE1VDExNyA0MTBIMTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKCIgZ2x5cGgtbmFtZT0icGFyZW5sZWZ0IiBob3Jpei1hZHYteD0iMzgxIiBkPSJNMzM0IC0xOTVRMzEwIC0xOTUgMjc0IC0xODBUMjAwIC0xMjZRMTQzIC02OSAxMDggMjFUNzIgMjI4UTcyIDI4NCA4MiAzMzVUMTA5IDQzMlQxNDkgNTE0VDIwMCA1NzlRMjM4IDYxNyAyNzQgNjMzVDMzNCA2NTBRMzU2IDY1MCAzNTYgNjMzUTM1NiA2MjggMzU0IDYyMlQzNDkgNjE0UTI5OCA2MDMgMjU2IDU2OVQxODQgNDgzVDEzOCAzNjZUMTIyIDIyOVExMjIgMTU1IDEzOCA5MFQxODQgLTI4VDI1NiAtMTE0VDM0OSAtMTU5UTM1MSAtMTYwIDM1MyAtMTY2VDM1NiAtMTc4UTM1NiAtMTk1IDMzNCAtMTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKSIgZ2x5cGgtbmFtZT0icGFyZW5yaWdodCIgaG9yaXotYWR2LXg9IjM4MSIgZD0iTTQ3IC0xOTVRMjUgLTE5NSAyNSAtMTc4UTI1IC0xNzMgMjcgLTE2N1QzMiAtMTU5UTgzIC0xNDggMTI1IC0xMTRUMTk3IC0yOFQyNDMgODlUMjU5IDIyOVEyNTkgMzAxIDI0MyAzNjZUMTk3IDQ4MlQxMjUgNTY4VDMyIDYxNFEzMCA2MTUgMjggNjIxVDI1IDYzM1EyNSA2NTAgNDcgNjUwUTcyIDY1MCAxMDcgNjM0VDE4MSA1NzlRMjA4IDU1MiAyMzEgNTE1VDI3MiA0MzJUMjk5IDMzNlQzMDkgMjI4UTMwOSAxMTIgMjc0IDIyVDE4MSAtMTI2UTE0MyAtMTY0IDEwOCAtMTc5VDQ3IC0xOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBnbHlwaC1uYW1lPSJhc3RlcmlzayIgaG9yaXotYWR2LXg9IjQwNyIgZD0iTTEwNSAzNzJROTcgMzc4IDEwNiAzOTRMMTcxIDQ4N0w2NCA1MjZRNTEgNTMxIDUxIDU0MFE1MSA1NjUgNzUgNTU5TDE4NSA1MjdMMTg4IDY0MFExODggNjUyIDE5MiA2NTVUMjA1IDY1OVEyMTMgNjU5IDIxNyA2NTZUMjIyIDY0MEwyMjUgNTI3TDMzNCA1NTlRMzU5IDU2NSAzNTkgNTQwUTM1OSA1MzIgMzQ1IDUyNkwyMzkgNDg3TDMwMyAzOTRRMzEzIDM3OCAzMDUgMzcyUTI5NyAzNjUgMjkwIDM2NFQyNzUgMzc0TDIwNSA0NjNMMTM1IDM3NFExMjcgMzYzIDEyMCAzNjRUMTA1IDM3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IisiIGdseXBoLW5hbWU9InBsdXMiIGhvcml6LWFkdi14PSI1NTAiIGQ9Ik0yNzMgMzhRMjY0IDM4IDI1OSA0MlQyNTMgNjFWMjQ1SDgyUTY4IDI0NSA2MyAyNTBUNTggMjY0VjI2OVE1OCAyNzggNjMgMjgzVDgyIDI4OEgyNTNWNDYwUTI1MyA0ODMgMjczIDQ4M0gyNzdRMjk4IDQ4MyAyOTggNDYwVjI4OEg0NjlRNDkyIDI4OCA0OTIgMjY5VjI2NFE0OTIgMjQ1IDQ2OSAyNDVIMjk4VjYxUTI5OCA0NyAyOTMgNDNUMjc3IDM4SDI3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJjOyIgZ2x5cGgtbmFtZT0iY29tbWEiIGhvcml6LWFkdi14PSIyMjEiIGQ9Ik01NiAtMTI5UTU0IC0xMzIgNTAgLTEzM1Q0MCAtMTMzVDMyIC0xMjhUMzEgLTExOEw5MCA1MVE5NSA2NSAxMDAgNzFUMTE5IDc4SDEyM1ExMzIgNzggMTM4IDcyVDE0NSA1MlY0OVExNDUgNDMgMTQ0IDM1VDEzNCAxM0w1NiAtMTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgZ2x5cGgtbmFtZT0iaHlwaGVuIiBob3Jpei1hZHYteD0iMzgxIiBkPSJNNjAgMjcwSDMyMFYyMjZINjBWMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLiIgZ2x5cGgtbmFtZT0icGVyaW9kIiBob3Jpei1hZHYteD0iMjIxIiBkPSJNMTA3IC01UTcyIC01IDcyIDMwVjM3UTcyIDcyIDEwNyA3MkgxMTRRMTQ5IDcyIDE0OSAzN1YzMFExNDkgLTUgMTE0IC01SDEwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9Ii8iIGdseXBoLW5hbWU9InNsYXNoIiBob3Jpei1hZHYteD0iMzQ3IiBkPSJNMjczIDY0N0gzMjNMNjYgLTE5M0gxNkwyNzMgNjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgZ2x5cGgtbmFtZT0iemVybyIgaG9yaXotYWR2LXg9IjY1NSIgZD0iTTMyNiAtMTBRMjY4IC0xMCAyMjIgMTFUMTQyIDcxVDkyIDE2NlQ3NCAyOTFWMzU1UTc0IDQyNCA5MSA0ODBUMTQyIDU3NVQyMjIgNjM2VDMyNyA2NTdRMzg1IDY1NyA0MzIgNjM2VDUxMiA1NzZUNTYzIDQ4MVQ1ODEgMzU2VjI5M1E1ODEgMjI0IDU2MyAxNjhUNTEyIDczVDQzMiAxMlQzMjYgLTEwWk0zMjcgMzNRMzc1IDMzIDQxMiA1MVQ0NzYgMTAyVDUxNyAxODRUNTMxIDI5M1YzNTNRNTMxIDQxMyA1MTcgNDYxVDQ3NiA1NDRUNDEyIDU5NlQzMjcgNjE1UTI4MCA2MTUgMjQyIDU5N1QxNzggNTQ1VDEzOCA0NjNUMTI0IDM1NVYyOTRRMTI0IDIzNCAxMzggMTg2VDE3OCAxMDNUMjQyIDUxVDMyNyAzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGdseXBoLW5hbWU9Im9uZSIgaG9yaXotYWR2LXg9IjM2NiIgZD0iTTE4NiA1NjRRMTc0IDU0NCAxNTMgNTMzVDEwNSA1MjFRNjggNTIxIDQ4IDU0MVEzNiA1NTMgMzYgNTY5UTM2IDU4MiA0MyA1ODlUNTIgNTk2UTYwIDU4NSA3NCA1NzhUMTA5IDU3MVExNDMgNTcxIDE2NiA1OTRUMTkyIDY1MEgyMTNRMjM2IDY1MCAyMzYgNjI2VjBIMTg2VjU2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjIiIGdseXBoLW5hbWU9InR3byIgaG9yaXotYWR2LXg9IjU0NCIgZD0iTTkyIDBRNTggMCA1OCAzMlY1NVE1OCAxMDggNzUgMTQ2VDEyMCAyMTRUMTg2IDI2NVQyNjIgMzA3UTI5NyAzMjUgMzI4IDM0MVQzODQgMzc3VDQyMiA0MjFUNDM2IDQ3OFE0MzYgNTM3IDM5NSA1NzRUMjc2IDYxMlEyMzUgNjEyIDIwNCA2MDFUMTUxIDU3MFQxMTUgNTI1VDkzIDQ3MVE5MyA0NjkgODggNDY5VDc2IDQ3MlQ2NCA0ODBUNTkgNDk3UTU5IDUxMSA3MCA1MzhUMTA3IDU5MVExMzUgNjE5IDE3NyA2MzhUMjc5IDY1OFEzMjggNjU4IDM2NiA2NDVUNDMxIDYwOFQ0NzEgNTUxVDQ4NSA0NzdRNDg1IDQzNiA0NzAgNDA2VDQyOSAzNTNUMzY4IDMxMFQyOTMgMjcyUTI1NiAyNTQgMjIyIDIzNVQxNjMgMTkxVDEyMiAxMzZUMTA3IDYzVjQ2SDQ5NlYwSDkyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMyIgZ2x5cGgtbmFtZT0idGhyZWUiIGhvcml6LWFkdi14PSI1NTIiIGQ9Ik0yNTggLTEwUTE5MiAtMTAgMTQ1IDEwVDcyIDU3UTUxIDc4IDQyIDk3VDMyIDEyOVEzMiAxMzkgMzYgMTQ1VDQ1IDE1NFQ1NSAxNThUNjEgMTU4UTc4IDEwNCAxMzAgNjlUMjU5IDM0UTM0MyAzNCAzOTEgNzJUNDQwIDE3N1E0NDAgMjQ2IDM5MyAyODNUMjU4IDMyMEgxNjlWMzYzSDI2NVEzMzkgMzYzIDM3OSAzOTZUNDIwIDQ4OFE0MjAgNTQ1IDM3OCA1ODBUMjU5IDYxNVExOTUgNjE1IDE0OCA1ODVUODEgNTEwUTgwIDUwOSA3NiA1MTBUNjYgNTE1VDU2IDUyNFQ1MiA1MzhRNTIgNTQ3IDYwIDU2MVQ4MSA1ODlRMTA5IDYxNiAxNTQgNjM2VDI1OSA2NTdRMzU5IDY1NyA0MTUgNjEyVDQ3MSA0ODhRNDcxIDQzMSA0MzkgMzk1VDM1MCAzNDVRNDE1IDMyOCA0NTMgMjg2VDQ5MSAxNzdRNDkxIDEzNCA0NzUgMTAwVDQyOSA0MVQzNTUgM1QyNTggLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNCIgZ2x5cGgtbmFtZT0iZm91ciIgaG9yaXotYWR2LXg9IjU5NyIgZD0iTTM4OCAxOTNIODhRNzEgMTkzIDYyIDIwMFQ1MiAyMTlWMjM0UTUyIDI0NSA1NyAyNTRUNzMgMjc2TDM1MiA2MjJRMzY1IDYzOSAzNzMgNjQ1VDM5OCA2NTJRNDIwIDY1MiA0MjggNjQ0VDQzNyA2MTlWMjM4SDU1NVYxOTNINDM3VjBIMzg4VjE5M1pNMzkwIDIzOFY2MDRMOTcgMjM4SDM5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjUiIGdseXBoLW5hbWU9ImZpdmUiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik0yNjkgLTEwUTIwNiAtMTAgMTU4IDEwVDgwIDU5UTY2IDczIDU4IDg4VDQ5IDExNFE0OSAxMjIgNTMgMTI3VDYzIDEzNlQ3MyAxNDFUNzkgMTQxUTEwMiA5NCAxNTEgNjVUMjcxIDM1UTMxMyAzNSAzNDYgNDZUNDA0IDc4VDQ0MSAxMjlUNDU0IDE5N1E0NTQgMjMyIDQ0MiAyNjBUNDA3IDMwOVQzNTIgMzQxVDI4MSAzNTJRMTc5IDM1MiAxMTAgMzAyUTc3IDMwNiA3NyAzMzhWNjE3UTc3IDYzMCA4NSA2MzhUMTA3IDY0N0g0NjZWNjAySDEyNVYzNTlRMTYwIDM3OSAxOTkgMzg4VDI4MSAzOThRMzMxIDM5OCAzNzIgMzg0VDQ0MiAzNDRUNDg4IDI4MVQ1MDQgMTk5UTUwNCAxNTAgNDg4IDExMlQ0NDEgNDZUMzY3IDVUMjY5IC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjYiIGdseXBoLW5hbWU9InNpeCIgaG9yaXotYWR2LXg9IjYwNCIgZD0iTTEyMyAyOTlRMTUyIDMzOSAyMDQgMzY4VDMyNyAzOTdRMzc2IDM5NyA0MTYgMzgzVDQ4NSAzNDRUNTI5IDI4NFQ1NDUgMjA1VjIwMVE1NDUgMTU1IDUyOSAxMTdUNDgyIDUwVDQxMSA2VDMyMSAtMTBRMjYzIC0xMCAyMTcgMTBUMTQwIDY4VDkxIDE2MFQ3NCAyODJWMzU1UTc0IDQyNyA5MSA0ODNUMTQxIDU3N1QyMjAgNjM2VDMyNSA2NTdRMzg1IDY1NyA0MjYgNjQwVDQ5MCA2MDBRNTA0IDU4NiA1MTAgNTcyVDUxNyA1NDlRNTE3IDU0MiA1MTMgNTM3VDUwNCA1MjhUNDk1IDUyMlQ0OTAgNTIxUTQ2OSA1NTkgNDI5IDU4N1QzMjUgNjE1UTIzMSA2MTUgMTc3IDU0OVQxMjMgMzU4VjI5OVpNMzE4IDMzUTM1NyAzMyAzOTAgNDVUNDQ2IDc4VDQ4MyAxMzBUNDk2IDE5N1YyMDFRNDk2IDI3MyA0NTEgMzE0VDMyMiAzNTVRMjg5IDM1NSAyNTkgMzQ3VDIwMyAzMjRUMTU3IDI5MFQxMjUgMjQ4UTEzMyAxNDQgMTg0IDg5VDMxOCAzM1pNMTIzIDI2MlYyNjVWMjYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNyIgZ2x5cGgtbmFtZT0ic2V2ZW4iIGhvcml6LWFkdi14PSI1MzMiIGQ9Ik0xNjIgLTNRMTQ5IC0zIDE0MSA2VDEzNSAxN0w0NDEgNjAySDQ1VjY0N0g0NjdRNDg0IDY0NyA0OTAgNjQxVDQ5NiA2MjVWNjIwUTQ5NiA2MTAgNDgyIDU4NEwxODkgMTZRMTg0IDUgMTc3IDFUMTYyIC0zWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOCIgZ2x5cGgtbmFtZT0iZWlnaHQiIGhvcml6LWFkdi14PSI1OTYiIGQ9Ik0yOTggLTEwUTI0MiAtMTAgMTk4IDNUMTIzIDQwVDc1IDk3VDU4IDE3MVE1OCAyMjggOTYgMjczVDIwOCAzMzZRMTQyIDM1MiAxMTEgMzkxVDc5IDQ4NFE3OSA1MjIgOTQgNTUzVDEzOCA2MDhUMjA3IDY0NFQyOTggNjU3UTQwMSA2NTcgNDU4IDYxMFQ1MTYgNDg1UTUxNiA0MzIgNDg1IDM5M1QzODggMzM2UTQ2MyAzMjAgNTAwIDI3NVQ1MzcgMTcxUTUzNyAxMzIgNTIwIDk5VDQ3MiA0MVQzOTYgNFQyOTggLTEwWk0yOTkgMzU3UTM3OSAzNTcgNDIyIDM5MFQ0NjYgNDgzUTQ2NiA1NDEgNDIzIDU3OFQyOTggNjE1UTIxNSA2MTUgMTcyIDU3OVQxMjkgNDgzUTEyOSA0MjYgMTczIDM5MlQyOTkgMzU3Wk0yOTkgMzNRMzkyIDMzIDQzOSA3MFQ0ODcgMTczUTQ4NyAyMzYgNDM4IDI3NVQyOTggMzE0UTIwNyAzMTQgMTU4IDI3NVQxMDggMTczUTEwOCAxMTEgMTU4IDcyVDI5OSAzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjkiIGdseXBoLW5hbWU9Im5pbmUiIGhvcml6LWFkdi14PSI2MDQiIGQ9Ik0yNzcgMzNRMzc3IDMzIDQyOSA5NVQ0ODEgMjg5VjMzOFE0NjcgMzE5IDQ0NyAzMDFUNDAxIDI3MFQzNDQgMjQ4VDI3NyAyNDBRMjI3IDI0MCAxODcgMjU0VDExOSAyOTNUNzUgMzUzVDU5IDQzM1Y0MzlRNTkgNDg1IDc1IDUyNFQxMjIgNTkzVDE5MyA2NDBUMjgzIDY1N1EzMzggNjU3IDM4NCA2MzhUNDYyIDU4MlQ1MTIgNDkxVDUzMCAzNjVWMjkyUTUzMCAxNDIgNDY0IDY2VDI3NyAtMTBRMjE4IC0xMCAxNzYgNlQxMDkgNDdROTMgNjQgODcgNzhUODAgMTAyUTgwIDEwOSA4NCAxMTRUOTMgMTIzVDEwMiAxMjlUMTA4IDEzMFExMjggODkgMTY5IDYxVDI3NyAzM1pNMjgxIDI4MlEzMTQgMjgyIDM0NSAyOTBUNDAxIDMxNFQ0NDcgMzQ4VDQ4MCAzOTBRNDczIDQ5OSA0MjIgNTU3VDI4NSA2MTVRMjQ2IDYxNSAyMTQgNjAyVDE1OCA1NjZUMTIxIDUxMVQxMDggNDQzVjQzN1ExMDggMzY0IDE1MyAzMjNUMjgxIDI4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IjoiIGdseXBoLW5hbWU9ImNvbG9uIiBob3Jpei1hZHYteD0iMjQ1IiBkPSJNMTE5IDM0OVE4NCAzNDkgODQgMzgzVjM5MVE4NCA0MDcgOTMgNDE2VDExOSA0MjZIMTI2UTE0MyA0MjYgMTUyIDQxN1QxNjEgMzkxVjM4M1ExNjEgMzQ5IDEyNiAzNDlIMTE5Wk0xMTkgLTVRODQgLTUgODQgMzBWMzdRODQgNzIgMTE5IDcySDEyNlExNjEgNzIgMTYxIDM3VjMwUTE2MSAtNSAxMjYgLTVIMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOyIgZ2x5cGgtbmFtZT0ic2VtaWNvbG9uIiBob3Jpei1hZHYteD0iMjQ1IiBkPSJNMTE5IDM0OVE4NCAzNDkgODQgMzgzVjM5MVE4NCA0MDcgOTMgNDE2VDExOSA0MjZIMTI2UTE0MyA0MjYgMTUyIDQxN1QxNjEgMzkxVjM4M1ExNjEgMzQ5IDEyNiAzNDlIMTE5Wk02OCAtMTI5UTY2IC0xMzIgNjIgLTEzM1Q1MiAtMTMzVDQ0IC0xMjhUNDMgLTExOEwxMDIgNTFRMTA3IDY1IDExMiA3MVQxMzEgNzhIMTM1UTE0NCA3OCAxNTAgNzJUMTU3IDUyVjQ5UTE1NyA0MyAxNTYgMzVUMTQ2IDEzTDY4IC0xMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImbHQ7IiBnbHlwaC1uYW1lPSJsZXNzIiBob3Jpei1hZHYteD0iNDkxIiBkPSJNNzcgMjM0UTY5IDIzOSA2NiAyNDRUNjIgMjY2UTYyIDI4MiA2NSAyODdUNzcgMjk4TDQwNCA0NzlRNDA2IDQ4MCA0MTMgNDc0VDQyMSA0NTdRNDIyIDQ0OSA0MTYgNDQwVDM5MSA0MjBMMTA5IDI2NkwzOTEgMTEzUTQxMCAxMDIgNDE2IDkzVDQyMSA3NlE0MjAgNjUgNDE0IDU5VDQwNCA1M0w3NyAyMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI9IiBnbHlwaC1uYW1lPSJlcXVhbCIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTkyIDM0OVE2OSAzNDkgNjkgMzY5VjM3NFE2OSAzOTQgOTIgMzk0SDQ1OFE0NzIgMzk0IDQ3NiAzODlUNDgxIDM3NFYzNjlRNDgxIDM2MCA0NzcgMzU1VDQ1OCAzNDlIOTJaTTkyIDEyOFE2OSAxMjggNjkgMTQ4VjE1M1E2OSAxNzMgOTIgMTczSDQ1OFE0NzIgMTczIDQ3NiAxNjhUNDgxIDE1M1YxNDhRNDgxIDEzOCA0NzcgMTMzVDQ1OCAxMjhIOTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImZ3Q7IiBnbHlwaC1uYW1lPSJncmVhdGVyIiBob3Jpei1hZHYteD0iNDkwIiBkPSJNODUgNTNRODMgNTIgNzcgNThUNjkgNzZRNjggODQgNzQgOTNUOTkgMTEzTDM4MSAyNjZMOTkgNDIwUTgwIDQzMSA3NCA0NDBUNjkgNDU3UTcwIDQ2NyA3NiA0NzNUODUgNDc5TDQxMiAyOThRNDIwIDI5MyA0MjQgMjg4VDQyOCAyNjZRNDI4IDI1MCA0MjQgMjQ1VDQxMiAyMzRMODUgNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI/IiBnbHlwaC1uYW1lPSJxdWVzdGlvbiIgaG9yaXotYWR2LXg9IjQ4OCIgZD0iTTE5NiAxNzRRMTk3IDIyMSAyMDcgMjU0VDIzNCAzMTBUMjY5IDM1MFQzMDkgMzc5UTMyNSAzOTAgMzQwIDQwMVQzNjcgNDI1VDM4NiA0NTVUMzkzIDQ5NFEzOTMgNTQ4IDM1NiA1ODBUMjUzIDYxM1EyMTIgNjEzIDE4MyA2MDFUMTMzIDU2OVQxMDIgNTI0VDg3IDQ3MlE4NiA0NzEgODEgNDcxVDY5IDQ3NVQ1NyA0ODVUNTEgNTAyUTUxIDUxNSA2MSA1NDRUOTggNTk5UTEyNCA2MjQgMTYyIDY0MFQyNTQgNjU3UTI5NyA2NTcgMzMyIDY0NVQzOTEgNjEyVDQyOSA1NjJUNDQzIDQ5OFE0NDMgNDY5IDQzNSA0NDdUNDEyIDQwOFQzODEgMzc3VDM0NCAzNTFRMzI0IDMzNyAzMDUgMzIzVDI3MSAyODhUMjQ3IDI0MVQyMzggMTc0SDE5NlpNMjEzIC0zUTE4NCAtMyAxODQgMjZWNDFRMTg0IDU3IDE5MCA2M1QyMTMgNzBIMjI3UTI0NCA3MCAyNTAgNjRUMjU3IDQxVjI2UTI1NyAxMCAyNTEgNFQyMjcgLTNIMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQCIgZ2x5cGgtbmFtZT0iYXQiIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zOTcgLTEwUTMyMiAtMTAgMjYwIDE0VDE1NCA4MlQ4NiAxODdUNjIgMzIzUTYyIDM5NiA4NiA0NTdUMTUzIDU2M1QyNTUgNjMyVDM4NyA2NTdRNDYwIDY1NyA1MTkgNjM2VDYyMSA1NzZUNjg1IDQ4MVQ3MDggMzU2UTcwOCAyNjcgNjc0IDIxN1Q1NzQgMTY3UTUzNCAxNjcgNTA4IDE4OFQ0NzUgMjQ0UTQ2MSAyMDkgNDMzIDE4OVQzNjMgMTY4UTMzNCAxNjggMzEwIDE3OVQyNjcgMjEwVDIzOSAyNTdUMjI5IDMxN1EyMjkgMzUwIDIzOSAzNzdUMjY3IDQyNFQzMTAgNDU1VDM2NSA0NjZRNDAxIDQ2NiA0MjggNDQ4VDQ3MCA0MDVWNDYxSDUxN1YyOTdRNTE3IDI1MiA1MzIgMjI4VDU4MyAyMDRRNjA2IDIwNCA2MjIgMjE1VDY0OSAyNDdUNjY1IDI5NlQ2NzAgMzU2UTY3MCA0MTYgNjUwIDQ2NVQ1OTMgNTQ5VDUwNCA2MDNUMzg3IDYyMlEzMjMgNjIyIDI3MCA2MDBUMTc5IDUzOFQxMjAgNDQzVDk5IDMyM1E5OSAyNTggMTIxIDIwNFQxODIgMTEwVDI3NiA0OFQzOTcgMjZRNDQ5IDI2IDQ5NCA0MFQ1NjkgNzRRNTc1IDc5IDU4MSA4MVQ1OTUgODRRNjA1IDg0IDYxMSA3M1Q2MTUgNTlRNTk4IDQ2IDU3NSAzNFQ1MjQgMTJUNDY0IC00VDM5NyAtMTBaTTM3NCAyMTBRNDE1IDIxMCA0NDIgMjM3VDQ3MCAzMDRWMzUzUTQ1OCAzODMgNDM0IDQwNFQzNzUgNDI1UTMzMiA0MjUgMzA1IDM5NVQyNzggMzE3UTI3OCAyNzAgMzA1IDI0MFQzNzQgMjEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQSIgZ2x5cGgtbmFtZT0iQSIgaG9yaXotYWR2LXg9IjYyNyIgZD0iTTI3NiA2MzNRMjgwIDY0MiAyODggNjQ3VDMxMyA2NTJRMzMxIDY1MiAzMzkgNjQ3VDM1MSA2MzNMNjAxIDBINTQ1TDQ1NyAyMjRIMTY4TDc5IDBIMjZMMjc2IDYzM1pNNDQxIDI2OEwzMTMgNTk1TDE4NCAyNjhINDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQiIgZ2x5cGgtbmFtZT0iQiIgaG9yaXotYWR2LXg9IjYyNSIgZD0iTTk0IDYxN1E5NCA2MzAgMTAyIDYzOFQxMjMgNjQ3SDMyOFE0MzIgNjQ3IDQ4NSA2MDVUNTM4IDQ4MlE1MzggMzY5IDQxNCAzMzdRNDkyIDMyMyA1MzAgMjgyVDU2OCAxNzdRNTY4IDg2IDUxMSA0M1QzMzUgMEg5NFY2MTdaTTMzNCA0NVE0MjggNDUgNDcyIDc2VDUxNiAxNzlRNTE2IDMwOSAzMzYgMzA5SDE0NFY0NUgzMzRaTTMzMSAzNTNRNDA1IDM1MyA0NDUgMzg3VDQ4NiA0NzlRNDg2IDYwMiAzMjggNjAySDE0NFYzNTNIMzMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgZ2x5cGgtbmFtZT0iQyIgaG9yaXotYWR2LXg9IjY4NyIgZD0iTTM4MyAtMTBRMzExIC0xMCAyNTIgMTRUMTUyIDgzVDg3IDE4OFQ2NCAzMjJRNjQgMzk1IDg3IDQ1NlQxNTMgNTYyVDI1NCA2MzJUMzg0IDY1N1E0NjAgNjU3IDUxMSA2MzRUNTkxIDU4MVE2MDggNTY0IDYxNyA1NDdUNjI2IDUyMFE2MjYgNTExIDYyMiA1MDVUNjEyIDQ5NVQ2MDIgNDkwVDU5NiA0OTBRNTcwIDU0NCA1MTQgNTc5VDM4MyA2MTRRMzIzIDYxNCAyNzQgNTkzVDE5MCA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjAgMTM0IDIwN1QxODkgMTE2VDI3NSA1NVQzODUgMzNRNDMwIDMzIDQ2NiA0NFQ1MjkgNzVUNTc1IDEyMFQ2MDMgMTcyUTYwNCAxNzMgNjA5IDE3MlQ2MjAgMTY4VDYzMSAxNTlUNjM2IDE0M1E2MzYgMTMyIDYyNiAxMTBUNTkyIDY2UTU2MyAzNyA1MTAgMTRUMzgzIC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkQiIGdseXBoLW5hbWU9IkQiIGhvcml6LWFkdi14PSI2OTIiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0gyNzZRMzYwIDY0NyA0MjUgNjI1VDUzNiA1NjJUNjA1IDQ2MFQ2MjkgMzI1UTYyOSAyNDkgNjA1IDE4OVQ1MzQgODdUNDIyIDIzVDI3MSAwSDk0VjYxN1pNMjc0IDQ0UTQyMCA0NCA0OTggMTE4VDU3NyAzMjRRNTc3IDM4OSA1NTcgNDQwVDQ5OCA1MjhUNDAzIDU4M1QyNzYgNjAzSDE0NFY0NEgyNzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJFIiBnbHlwaC1uYW1lPSJFIiBob3Jpei1hZHYteD0iNTk0IiBkPSJNOTQgNjE3UTk0IDYzMCAxMDIgNjM4VDEyMyA2NDdINTMyVjYwMkgxNDRWMzU0SDQ0OVYzMTBIMTQ0VjQ2SDU0MVYwSDk0VjYxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IkYiIGdseXBoLW5hbWU9IkYiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0g1MTJWNjAySDE0NFYzMzNINDIyVjI4OUgxNDRWMEg5NFY2MTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJHIiBnbHlwaC1uYW1lPSJHIiBob3Jpei1hZHYteD0iNzI0IiBkPSJNMzY4IC0xMFEyOTggLTEwIDI0MiAxNVQxNDYgODRUODUgMTg5VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MiA1NjJUMjUyIDYzMlQzODIgNjU3UTQ1NiA2NTcgNTA3IDYzNFQ1ODYgNTgzUTYwNCA1NjUgNjEyIDU0OVQ2MjEgNTI0UTYyMSA1MTMgNjE3IDUwN1Q2MDcgNDk4VDU5NyA0OTVUNTkxIDQ5NVE1NzkgNTIwIDU1OSA1NDFUNTExIDU3OVQ0NTEgNjA0VDM4MCA2MTRRMzIxIDYxNCAyNzMgNTkzVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjEgMTMyIDIwOFQxODMgMTE2VDI2NSA1NVQzNzQgMzNRNDIyIDMzIDQ2MiA0N1Q1MzMgODhUNTgyIDE1MVQ2MDUgMjI5VjI3M0gzODFWMzE4SDYxMlE2MjkgMzE4IDYzOSAzMDhUNjQ5IDI4MFYyUTY0OSAxIDY0NSAtMVQ2MzMgLTNRNjIwIC0zIDYxMyA2VDYwNSA0NlYxMjZRNTc5IDYzIDUxNyAyN1QzNjggLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iSCIgZ2x5cGgtbmFtZT0iSCIgaG9yaXotYWR2LXg9IjcwMiIgZD0iTTk0IDYyN1E5NCA2NTAgMTE1IDY1MEgxMjJRMTQ0IDY1MCAxNDQgNjI3VjM0N0g1NThWNjI3UTU1OCA2NTAgNTc5IDY1MEg1ODZRNjA4IDY1MCA2MDggNjI3VjBINTU4VjMwMUgxNDRWMEg5NFY2MjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJJIiBnbHlwaC1uYW1lPSJJIiBob3Jpei1hZHYteD0iMjU3IiBkPSJNMTA0IDYyN1ExMDQgNjUwIDEyNSA2NTBIMTMyUTE1NCA2NTAgMTU0IDYyN1YwSDEwNFY2MjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJKIiBnbHlwaC1uYW1lPSJKIiBob3Jpei1hZHYteD0iNDY2IiBkPSJNMjAwIC0xMFExNjEgLTEwIDEzMiAxVDgyIDI3VDUxIDYwVDQwIDg4UTQwIDk1IDQ0IDEwMVQ1MyAxMTJUNjMgMTE3VDY5IDExOFE4NCA4MSAxMTggNTdUMjAwIDMzUTI3MCAzMyAzMDEgNzNUMzMzIDIwM1Y2NDdIMzgzVjIwM1EzODMgOTQgMzM5IDQyVDIwMCAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJLIiBnbHlwaC1uYW1lPSJLIiBob3Jpei1hZHYteD0iNTYyIiBkPSJNOTQgNjI3UTk0IDY1MCAxMTUgNjUwSDEyMlExNDQgNjUwIDE0NCA2MjdWMzM3TDQ1MSA2MzVRNDYzIDY0NyA0NzMgNjQ5VDQ5MSA2NDhUNTAyIDYzOFQ1MDUgNjI0TDE5OSAzMzJMNTE0IDIzUTUxNSAxNSA1MTAgOFQ0OTcgLTJUNDc5IC0zVDQ1OSA5TDE0NCAzMjVWMEg5NFY2MjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJMIiBnbHlwaC1uYW1lPSJMIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNOTQgNjI3UTk0IDY1MCAxMTUgNjUwSDEyMlExNDQgNjUwIDE0NCA2MjdWNDZINDYxUTQ4NCA0NiA0ODQgMjVWMjFRNDg0IDAgNDYxIDBIOTRWNjI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTSIgZ2x5cGgtbmFtZT0iTSIgaG9yaXotYWR2LXg9Ijc2NSIgZD0iTTk0IDYxOFE5NCA2MzIgMTAzIDY0MVQxMjkgNjUwSDE0MVExNjEgNjUwIDE2OCA2NDJUMTg1IDYxM0wzODMgMjIxTDU4MiA2MTNRNTkwIDYzMyA1OTggNjQxVDYyNSA2NTBINjM1UTY1MiA2NTAgNjYxIDY0MVQ2NzEgNjE4VjBINjIzVjU5M0w0MjUgMjA2UTQxOSAxOTIgNDEwIDE4NFQzODIgMTc1UTM2MyAxNzUgMzU0IDE4M1QzMzkgMjA2TDE0MSA1OTNWMEg5NFY2MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBnbHlwaC1uYW1lPSJOIiBob3Jpei1hZHYteD0iNzAzIiBkPSJNOTQgNjE2UTk0IDYzMCAxMDAgNjQwVDEyMSA2NTBIMTM0UTE0OCA2NTAgMTU2IDY0M1QxNzMgNjIzTDU2MyA3N1Y2NDdINjEwVjMwUTYxMCAxNiA2MDMgN1Q1ODQgLTNINTgwUTU2NiAtMyA1NjAgMlQ1NDYgMThMMTQxIDU4NVYwSDk0VjYxNloiICAvPgorPGdseXBoIHVuaWNvZGU9Ik8iIGdseXBoLW5hbWU9Ik8iIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zODIgLTEwUTMxMSAtMTAgMjUzIDE0VDE1MiA4M1Q4NyAxODhUNjQgMzIyUTY0IDM5NSA4NyA0NTZUMTUzIDU2MlQyNTQgNjMyVDM4NCA2NTdRNDU1IDY1NyA1MTMgNjMyVDYxMyA1NjNUNjc4IDQ1OFQ3MDEgMzI0UTcwMSAyNTEgNjc4IDE5MFQ2MTMgODVUNTEyIDE1VDM4MiAtMTBaTTM4MyAzM1E0NDMgMzMgNDkyIDU1VDU3NiAxMTVUNjMwIDIwN1Q2NTAgMzIzUTY1MCAzODUgNjMxIDQzOFQ1NzYgNTMxVDQ5MSA1OTJUMzgyIDYxNFEzMjIgNjE0IDI3MyA1OTJUMTg5IDUzMlQxMzUgNDQwVDExNSAzMjNRMTE1IDI2MCAxMzQgMjA3VDE4OSAxMTZUMjc0IDU1VDM4MyAzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGdseXBoLW5hbWU9IlAiIGhvcml6LWFkdi14PSI1NzYiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0gyODlRNDA0IDY0NyA0NjUgNTk3VDUyNyA0NTNRNTI3IDM1OCA0NjYgMzA3VDI4NCAyNTZIMTQ0VjBIOTRWNjE3Wk0yODggMzAwUTM4MiAzMDAgNDI4IDMzOVQ0NzUgNDUxUTQ3NSA1MjUgNDI5IDU2M1QyOTAgNjAySDE0NFYzMDBIMjg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUSIgZ2x5cGgtbmFtZT0iUSIgaG9yaXotYWR2LXg9Ijc2NSIgZD0iTTM4MiAtMTBRMzExIC0xMCAyNTMgMTRUMTUyIDgzVDg3IDE4OFQ2NCAzMjJRNjQgMzk1IDg3IDQ1NlQxNTMgNTYyVDI1NCA2MzJUMzg0IDY1N1E0NTUgNjU3IDUxMyA2MzJUNjEzIDU2M1Q2NzggNDU4VDcwMSAzMjRRNzAxIDI1NSA2NzkgMTk2VDYxNyA5Mkw2OTQgMTRRNjk2IDEyIDY4OSAyVDY2NSAtOVE2NTMgLTkgNjM5IDVMNTg0IDYxUTU0MyAyNyA0OTMgOVQzODIgLTEwWk0zODMgMzNRNDM0IDMzIDQ3NiA0OFQ1NTIgOTFMMzk5IDI0Nkw0MzAgMjc5TDU4NCAxMjNRNjE2IDE2MSA2MzMgMjEyVDY1MCAzMjNRNjUwIDM4NSA2MzEgNDM4VDU3NiA1MzFUNDkxIDU5MlQzODIgNjE0UTMyMiA2MTQgMjczIDU5MlQxODkgNTMyVDEzNSA0NDBUMTE1IDMyM1ExMTUgMjYwIDEzNCAyMDdUMTg5IDExNlQyNzQgNTVUMzgzIDMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgZ2x5cGgtbmFtZT0iUiIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTI4OCAyNzdMNTI4IDIxUTUzMCAxOCA1MjIgOFQ0OTggLTNRNDgyIC0zIDQ2NyAxNUwyMjQgMjc3SDE0M1YwSDk0VjYxN1E5NCA2MzAgMTAyIDYzOFQxMjMgNjQ3SDI5OFE0MTMgNjQ3IDQ3MiA2MDFUNTMxIDQ2M1E1MzEgMzczIDQ3MyAzMjVUMzEwIDI3N0gyODhaTTMwMyAzMjBRMzkzIDMyMCA0MzYgMzU4VDQ3OSA0NjFRNDc5IDUzMCA0MzUgNTY2VDMwMCA2MDJIMTQzVjMyMEgzMDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBnbHlwaC1uYW1lPSJTIiBob3Jpei1hZHYteD0iNTY1IiBkPSJNMjg4IC0xMFEyMTYgLTEwIDE2NiAxMVQ4NyA2MFE3MCA3NyA2MyA5MlQ1NSAxMTlRNTUgMTI3IDU5IDEzM1Q2OSAxNDNUNzkgMTQ4VDg1IDE0OVE5NSAxMjggMTEyIDEwN1QxNTMgNzBUMjExIDQzVDI4NyAzM1EzNjcgMzMgNDEyIDY4VDQ1OCAxNjZRNDU4IDIwMSA0NDMgMjI0VDQwMiAyNjJUMzQzIDI4N1QyNzIgMzA2UTIzNCAzMTUgMTk5IDMyNlQxMzUgMzU3VDg5IDQwN1Q3MiA0ODNRNzIgNTIxIDg4IDU1M1QxMzIgNjA4VDE5OSA2NDRUMjgzIDY1N1EzNDkgNjU3IDM5NCA2MzhUNDY0IDU5NVE0NzggNTgxIDQ4NSA1NjdUNDkyIDU0M1E0OTIgNTM1IDQ4OCA1MjlUNDc4IDUxOVQ0NjggNTEzVDQ2MiA1MTJRNDUzIDUzMiA0MzggNTUwVDQwMCA1ODNUMzQ4IDYwNVQyODMgNjE0UTI0OCA2MTQgMjE4IDYwNVQxNjcgNTc5VDEzMyA1MzhUMTIxIDQ4NFExMjEgNDUxIDEzNCA0MzBUMTcxIDM5NFQyMjcgMzcwVDI5NyAzNTJRMzM2IDM0MyAzNzMgMzMxVDQ0MSAyOThUNDg5IDI0NlQ1MDcgMTY4UTUwNyAxMjggNDkyIDk1VDQ0NyAzOVQzNzggM1QyODggLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVCIgZ2x5cGgtbmFtZT0iVCIgaG9yaXotYWR2LXg9IjU5OSIgZD0iTTI3NSA2MDJINjFRMzggNjAyIDM4IDYyMlY2MjZRMzggNjQ3IDYxIDY0N0g1MzhRNTYyIDY0NyA1NjIgNjI2VjYyMlE1NjIgNjAyIDUzOCA2MDJIMzI1VjBIMjc1VjYwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IlUiIGdseXBoLW5hbWU9IlUiIGhvcml6LWFkdi14PSI2NjEiIGQ9Ik0zMjkgLTEwUTIwOCAtMTAgMTQ2IDU2VDg0IDI1MlY2MjdRODQgNjUwIDEwNSA2NTBIMTEyUTEzNCA2NTAgMTM0IDYyN1YyNTZRMTM0IDM1IDMzMSAzNVE1MjggMzUgNTI4IDI1NlY2MjdRNTI4IDY1MCA1NDkgNjUwSDU1OFE1NzcgNjUwIDU3NyA2MjdWMjU0UTU3NyAxMjQgNTE0IDU3VDMyOSAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJWIiBnbHlwaC1uYW1lPSJWIiBob3Jpei1hZHYteD0iNjIzIiBkPSJNMzEgNjM1UTMwIDYzOCAzNyA2NDNUNTMgNjQ5VDczIDY0N1Q5MCA2MjZMMzEyIDUzTDUzNSA2MjZRNTQxIDY0MiA1NTEgNjQ2VDU3MCA2NTBUNTg2IDY0M1Q1OTIgNjM1TDM0MCAwSDI4NEwzMSA2MzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJXIiBnbHlwaC1uYW1lPSJXIiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjYgNjM5UTY2IDY0MiA3MyA2NDZUOTEgNjUwVDExMCA2NDNUMTI1IDYxN0wyNjAgNDVMNDE3IDUxOFE0MjIgNTMyIDQzMCA1MzlUNDU4IDU0N1E0NzggNTQ3IDQ4NSA1NDBUNDk3IDUxOEw2NTMgNDZMNzkxIDYxN1E3OTUgNjM2IDgwNCA2NDNUODIzIDY1MFQ4MzkgNjQ2VDg0NiA2MzlMNjg3IDBINjIwTDQ1OCA0OTdMMjkwIDBIMjI1TDY2IDYzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IlgiIGdseXBoLW5hbWU9IlgiIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik02MyAtM1E1MCAtMyA0MyA3VDM4IDIxTDI3MCAzMjlMNDcgNjQ3SDEwMUwzMDEgMzY0TDUwNSA2MzZRNTE3IDY1MiA1MzAgNjUyUTU0MyA2NTIgNTUwIDY0MlQ1NTUgNjI5TDMyOCAzMjhMNTU4IDIzUTU2MCAyMCA1NTMgMTBUNTMyIC0xUTUyNCAtMSA1MTcgMlQ1MDQgMTRMMjk4IDI5NUw4OCAxM1E3NiAtMyA2MyAtM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlkiIGdseXBoLW5hbWU9IlkiIGhvcml6LWFkdi14PSI1NjgiIGQ9Ik0yNTkgMjc3TDI0IDY0N0g3OUwyODQgMzIyTDQ4OSA2MzJRNDk4IDY0NiA1MDggNjQ4VDUyNiA2NDhUNTM5IDYzOVQ1NDQgNjI5TDMwOSAyNzdWMEgyNTlWMjc3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWiIgZ2x5cGgtbmFtZT0iWiIgaG9yaXotYWR2LXg9IjYxNSIgZD0iTTYxIDUzTDQ4OCA2MDJIODlRNjYgNjAyIDY2IDYyMlY2MjZRNjYgNjQ3IDg5IDY0N0g1NDNWNTk3TDExNSA0Nkg1MzNRNTU3IDQ2IDU1NyAyNVYyMVE1NTcgMCA1MzMgMEg2MVY1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlsiIGdseXBoLW5hbWU9ImJyYWNrZXRsZWZ0IiBob3Jpei1hZHYteD0iMzUyIiBkPSJNOTkgNjQ3SDI4N1EzMDEgNjQ3IDMwNSA2NDJUMzEwIDYyOFY2MjNRMzEwIDYxMyAzMDYgNjA5VDI4NyA2MDRIMTQ1Vi0xNDlIMjg3UTMwMSAtMTQ5IDMwNSAtMTU0VDMxMCAtMTY5Vi0xNzRRMzEwIC0xODMgMzA2IC0xODhUMjg3IC0xOTNIOTlWNjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgZ2x5cGgtbmFtZT0iYmFja3NsYXNoIiBob3Jpei1hZHYteD0iMzQ3IiBkPSJNMjMgNjQ3SDczTDMzMCAtMTkzSDI4MEwyMyA2NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJdIiBnbHlwaC1uYW1lPSJicmFja2V0cmlnaHQiIGhvcml6LWFkdi14PSIzNTIiIGQ9Ik02NSAtMTkzUTUxIC0xOTMgNDcgLTE4OFQ0MiAtMTc0Vi0xNjlRNDIgLTE1OSA0NiAtMTU0VDY1IC0xNDlIMjA3VjYwNEg2NVE1MSA2MDQgNDcgNjA4VDQyIDYyM1Y2MjhRNDIgNjM3IDQ2IDY0MlQ2NSA2NDdIMjUzVi0xOTNINjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJeIiBnbHlwaC1uYW1lPSJhc2NpaWNpcmN1bSIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTE2MSA0NTBRMTQ1IDQ1MCAxNDUgNDY3UTE0NSA0NzkgMTU4IDQ5N1QxOTYgNTQ0UTIyNSA1NzYgMjQ0IDU5MlQyNjUgNjA5UTI2NyA2MDkgMjg2IDU5M1QzMzIgNTQ2UTM1NyA1MTcgMzcwIDQ5OFQzODQgNDY3UTM4NCA0NTAgMzY5IDQ1MFEzNTkgNDUwIDM0NiA0NjJUMzA0IDUxM0wyNjQgNTY2TDIyNCA1MTFRMTk5IDQ3OCAxODUgNDY0VDE2MSA0NTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJfIiBnbHlwaC1uYW1lPSJ1bmRlcnNjb3JlIiBob3Jpei1hZHYteD0iNDgyIiBkPSJNNTEgLTQ2UTI4IC00NiAyOCAtMjVWLTIxUTI4IDAgNTEgMEg0MzFRNDU0IDAgNDU0IC0yMVYtMjVRNDU0IC00NiA0MzEgLTQ2SDUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgZ2x5cGgtbmFtZT0iZ3JhdmUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0zMzQgNTQ3UTMzMiA1NDUgMzIwIDU0OFQyODkgNTU5VDI0NCA1ODFUMTkyIDYxNVExNjkgNjMyIDE2MiA2NDFUMTU0IDY2MVExNTQgNjcwIDE2MCA2NzVUMTc1IDY4MVExODMgNjgxIDE5MyA2NzdUMjIwIDY1OVEyNDYgNjM5IDI2NyA2MjBUMzA0IDU4NVQzMjcgNTU5VDMzNCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJhIiBnbHlwaC1uYW1lPSJhIiBob3Jpei1hZHYteD0iNTMxIiBkPSJNMjE2IC0xMFExNDAgLTEwIDk2IDI1VDUyIDEyMFE1MiAyMDAgMTMzIDIzNlQzOTQgMjc1SDQwNFYyOTlRNDA0IDM2NiAzNjYgNDAyVDI1OSA0MzlRMTk3IDQzOSAxNTggNDEzVDk4IDM0OVE5OCAzNDkgOTQgMzUwVDg0IDM1NFQ3NSAzNjJUNzEgMzc3UTcxIDM4NSA3OCAzOThUOTggNDIzUTEyMSA0NDYgMTYxIDQ2NFQyNjIgNDgzUTM1MSA0ODMgNDAxIDQzNVQ0NTEgMzAwVjBINDA0Vjk0UTM4MSA0OCAzMzIgMTlUMjE2IC0xMFpNMjIwIDMwUTI1OSAzMCAyOTIgNDJUMzUwIDc2VDM4OSAxMjdUNDA0IDE5MFYyMzdIMzkxUTMxNCAyMzUgMjU5IDIyOFQxNjkgMjA3VDExOCAxNzJUMTAxIDEyMFExMDEgNzggMTMzIDU0VDIyMCAzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImIiIGdseXBoLW5hbWU9ImIiIGhvcml6LWFkdi14PSI1OTYiIGQ9Ik0zMTYgLTEwUTI4MCAtMTAgMjUwIC0xVDE5NyAyM1QxNTcgNTdUMTMxIDk2VjBIODRWNjczUTg0IDY3OCAxMDAgNjc4UTExMyA2NzggMTIyIDY2OVQxMzIgNjMxVjM3NlExNjEgNDI0IDIwNyA0NTNUMzE5IDQ4M1EzNjYgNDgzIDQwNyA0NjVUNDc4IDQxNVQ1MjYgMzM4VDU0NCAyMzhRNTQ0IDE4MyA1MjcgMTM4VDQ4MCA1OVQ0MDcgOFQzMTYgLTEwWk0zMTIgMzJRMzUzIDMyIDM4NyA0N1Q0NDUgODlUNDgyIDE1NFQ0OTYgMjM4UTQ5NiAyODIgNDgyIDMxOVQ0NDQgMzgzVDM4NyA0MjVUMzE0IDQ0MVEyNDUgNDQxIDIwMCA0MDZUMTMxIDMxMlYyMDNRMTMxIDE2NyAxNDUgMTM2VDE4MyA4MlQyNDEgNDZUMzEyIDMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgZ2x5cGgtbmFtZT0iYyIgaG9yaXotYWR2LXg9IjU0MiIgZD0iTTI5MyAtMTBRMjQwIC0xMCAxOTYgOVQxMjAgNjFUNzAgMTM5VDUyIDIzOFE1MiAyOTAgNzAgMzM1VDEyMCA0MTNUMTk2IDQ2NFQyOTMgNDgzUTM1MyA0ODMgMzkzIDQ2NVQ0NTcgNDIyUTQ3NiA0MDMgNDg0IDM4NVQ0OTMgMzU1UTQ5MyAzNDcgNDg5IDM0MlQ0NzkgMzM0VDQ2OCAzMzFUNDYyIDMzMVE0NTQgMzUyIDQ0MCAzNzJUNDA2IDQwN1QzNTggNDMyVDI5MyA0NDFRMjUxIDQ0MSAyMTYgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM4UTEwMCAxOTQgMTE0IDE1N1QxNTMgOTJUMjE0IDQ5VDI5MyAzM1EzMzAgMzMgMzU4IDQyVDQwNiA2NlQ0NDAgMTAxVDQ2MiAxNDJRNDYzIDE0MyA0NjggMTQzVDQ3OCAxNDBUNDg4IDEzMlQ0OTMgMTE4UTQ5MyAxMDcgNDg1IDg5VDQ1NiA1MFE0MzIgMjYgMzkyIDhUMjkzIC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGdseXBoLW5hbWU9ImQiIGhvcml6LWFkdi14PSI1OTYiIGQ9Ik0yNzcgLTEwUTIyOSAtMTAgMTg4IDhUMTE3IDU4VDY5IDEzNVQ1MiAyMzdRNTIgMjkxIDY5IDMzNlQxMTYgNDE0VDE4OSA0NjVUMjgwIDQ4M1EzMTQgNDgzIDM0MyA0NzVUMzk2IDQ1MlQ0MzcgNDIwVDQ2NCAzODFWNjczUTQ2NCA2NzggNDgwIDY3OFE0OTMgNjc4IDUwMiA2NjlUNTEyIDYzMVYwSDQ2NFY5NlE0MzggNDggMzkyIDE5VDI3NyAtMTBaTTI4MiAzMlEzMjAgMzIgMzUzIDQ1VDQxMSA4MlQ0NTAgMTM2VDQ2NCAyMDJWMzEzUTQ0MiAzNzEgMzk3IDQwNlQyODMgNDQxUTI0MyA0NDEgMjEwIDQyNlQxNTIgMzg0VDExNCAzMjBUMTAwIDIzOFExMDAgMTkzIDExMyAxNTVUMTUxIDkwVDIwOCA0OFQyODIgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJlIiBnbHlwaC1uYW1lPSJlIiBob3Jpei1hZHYteD0iNTU1IiBkPSJNMjk0IC0xMFEyNDAgLTEwIDE5NSA4VDExOSA1OVQ3MCAxMzdUNTIgMjM1UTUyIDI4OCA2OSAzMzNUMTE4IDQxMlQxOTMgNDY0VDI4OCA0ODNRMzM3IDQ4MyAzNzcgNDY3VDQ0NSA0MjBUNDg5IDM0N1Q1MDUgMjUyVjI0N1E1MDUgMjM2IDUwMCAyMzNUNDg0IDIzMEg5OVExMDAgMTg2IDExNCAxNTBUMTU0IDg4VDIxNSA0OFQyOTQgMzNRMzMxIDMzIDM1OCA0MVQ0MDYgNjJUNDQwIDkzVDQ2MyAxMjhRNDY0IDEyOSA0NjggMTI4VDQ3OCAxMjRUNDg3IDExNVQ0OTEgMTAwUTQ5MSA5MiA0ODQgNzlUNDYxIDQ5UTQzOSAyNyAzOTcgOVQyOTQgLTEwWk0yODggNDQxUTI1MSA0NDEgMjIwIDQyOVQxNjQgMzk0VDEyMyAzNDBUMTAxIDI3MUg0NTVRNDUzIDMwOSA0NDEgMzQwVDQwNyAzOTNUMzU1IDQyOFQyODggNDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZiIgZ2x5cGgtbmFtZT0iZiIgaG9yaXotYWR2LXg9IjM0MSIgZD0iTTEyNyA0MzBIMjhWNDczSDEyN1Y1MjRRMTI3IDYwNSAxNjEgNjQ2VDI1OSA2ODhRMjg4IDY4OCAzMDcgNjgxVDMzOCA2NjJRMzQ5IDY1MSAzNDkgNjM3UTM0OSA2MjUgMzQzIDYxOVQzMzUgNjE0UTMyNCA2MjggMzAzIDYzN1QyNTkgNjQ2UTIxNiA2NDYgMTk1IDYxN1QxNzMgNTIxVjQ3M0gyOThWNDMwSDE3NFYwSDEyN1Y0MzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJnIiBnbHlwaC1uYW1lPSJnIiBob3Jpei1hZHYteD0iNTk2IiBkPSJNMjkxIC0xOTdRMjI3IC0xOTcgMTgzIC0xNzlUMTEyIC0xMzRROTggLTEyMCA5MSAtMTA2VDgzIC04MlE4MyAtNzMgODcgLTY3VDk2IC01N1QxMDUgLTUyVDExMSAtNTJRMTIwIC03MiAxMzUgLTkwVDE3MyAtMTIzVDIyNCAtMTQ1VDI5MiAtMTU0UTQ2NCAtMTU0IDQ2NCAyNlYxMDdRNDM4IDYxIDM5MiAzNFQyNzcgNlEyMjcgNiAxODYgMjNUMTE1IDcxVDY5IDE0NlQ1MiAyNDRRNTIgMjk2IDY5IDMzOVQxMTggNDE1VDE5MCA0NjVUMjgwIDQ4M1EzNTAgNDgzIDM5NyA0NTRUNDY0IDM4NFY0NzNINTEyVjI2UTUxMiAtODYgNDU0IC0xNDFUMjkxIC0xOTdaTTI4MiA0N1EzMTkgNDcgMzUyIDU5VDQxMCA5NFQ0NDkgMTQ3VDQ2NCAyMTNWMzE0UTQ0MiAzNzIgMzk4IDQwNlQyODMgNDQxUTI0MyA0NDEgMjEwIDQyN1QxNTIgMzg2VDExNCAzMjNUMTAwIDI0NVExMDAgMjAwIDExMyAxNjRUMTUwIDEwMVQyMDcgNjFUMjgyIDQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaCIgZ2x5cGgtbmFtZT0iaCIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTg0IDY3M1E4NCA2NzggMTAwIDY3OFExMTMgNjc4IDEyMiA2NjlUMTMyIDYzMVYzODBRMTUzIDQyNiAxOTcgNDU0VDMwMCA0ODNRMzQ4IDQ4MyAzODMgNDY4VDQ0MyA0MjVUNDc5IDM1OVQ0OTEgMjcyVjBINDQzVjI2OVE0NDMgMzQ4IDQwNiAzOTNUMjk3IDQzOFEyNjIgNDM4IDIzMiA0MjZUMTc5IDM5M1QxNDUgMzQwVDEzMiAyNzJWMEg4NFY2NzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJpIiBnbHlwaC1uYW1lPSJpIiBob3Jpei1hZHYteD0iMjI2IiBkPSJNODkgNDUzUTg5IDQ2NyA5NSA0NzFUMTEwIDQ3NkgxMTZRMTI1IDQ3NiAxMzEgNDcyVDEzNyA0NTNWMEg4OVY0NTNaTTExMiA2MDFRODAgNjAxIDgwIDYzNFE4MCA2NjggMTE0IDY2OFExNDcgNjY4IDE0NyA2MzRRMTQ3IDYwMSAxMTIgNjAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaiIgZ2x5cGgtbmFtZT0iaiIgaG9yaXotYWR2LXg9IjIyNiIgZD0iTTE1IC0xOTBRLTExIC0xOTAgLTI5IC0xODRULTU4IC0xNjdRLTY4IC0xNTcgLTY4IC0xNDdRLTY4IC0xMzYgLTYyIC0xMjhULTU0IC0xMjBRLTQzIC0xMzEgLTI2IC0xMzlUMTUgLTE0OFE4OSAtMTQ4IDg5IC01MFY0NzNIMTM3Vi01M1ExMzcgLTExOSAxMDYgLTE1NFQxNSAtMTkwWk0xMTIgNjAxUTgwIDYwMSA4MCA2MzRRODAgNjY4IDExNCA2NjhRMTQ3IDY2OCAxNDcgNjM0UTE0NyA2MDEgMTEyIDYwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImsiIGdseXBoLW5hbWU9ImsiIGhvcml6LWFkdi14PSI0NTkiIGQ9Ik04NCA2NzNRODQgNjc4IDEwMCA2NzhRMTEzIDY3OCAxMjIgNjY5VDEzMiA2MzFWMjU1TDM0OCA0NTdRMzYzIDQ3MiAzNzQgNDc0VDM5MiA0NzRUNDAyIDQ2NFQ0MDUgNDUzTDE4NSAyNTJMNDMzIDIyUTQzMyAxOCA0MzAgMTFUNDIwIDBUNDAyIC0yVDM3NiAxNkwxMzIgMjQ0VjBIODRWNjczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgZ2x5cGgtbmFtZT0ibCIgaG9yaXotYWR2LXg9IjIyNiIgZD0iTTg5IDY3M1E4OSA2NzggMTA1IDY3OFExMTggNjc4IDEyNyA2NjlUMTM3IDYzMVYwSDg5VjY3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9Im0iIGdseXBoLW5hbWU9Im0iIGhvcml6LWFkdi14PSI4ODYiIGQ9Ik04NCA0NzFRODQgNDcyIDg4IDQ3NFQxMDAgNDc2UTExMyA0NzYgMTIyIDQ2N1QxMzEgNDI4VjM4N1ExNTQgNDMxIDE5NiA0NTdUMjg5IDQ4M1EzNTIgNDgzIDM5MyA0NTNUNDUyIDM3MlE0NzQgNDIyIDUxOCA0NTJUNjI0IDQ4M1E3MTIgNDgzIDc1OSA0MzFUODA2IDI3OVYwSDc1OFYyNzZRNzU4IDM1NCA3MjMgMzk2VDYyMSA0MzhRNTczIDQzOCA1MzEgNDEwVDQ2OSAzMjhWMEg0MjFWMjg3UTQyMSAzNTggMzg3IDM5OFQyODQgNDM4UTIzNyA0MzggMTk1IDQwOVQxMzIgMzI5VjBIODRWNDcxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgZ2x5cGgtbmFtZT0ibiIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTg0IDQ3MVE4NCA0NzIgODggNDc0VDEwMCA0NzZRMTEzIDQ3NiAxMjIgNDY3VDEzMSA0MjhWMzg1UTE1NSA0MjggMTk4IDQ1NVQzMDEgNDgzUTM0OCA0ODMgMzgzIDQ2OFQ0NDMgNDI1VDQ3OSAzNTlUNDkxIDI3MlYwSDQ0M1YyNjlRNDQzIDM0NyA0MDYgMzkyVDI5OSA0MzhRMjM5IDQzOCAxOTcgNDA4VDEzMiAzMjhWMEg4NFY0NzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJvIiBnbHlwaC1uYW1lPSJvIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjk0IC0xMFEyNDEgLTEwIDE5NyA5VDEyMCA2MVQ3MCAxMzlUNTIgMjM3UTUyIDI5MCA3MCAzMzVUMTIwIDQxM1QxOTYgNDY0VDI5NCA0ODNRMzQ2IDQ4MyAzOTAgNDY0VDQ2NyA0MTJUNTE3IDMzNFQ1MzUgMjM1UTUzNSAxODIgNTE3IDEzOFQ0NjcgNjBUMzkxIDlUMjk0IC0xMFpNMjk0IDMyUTMzNiAzMiAzNzEgNDdUNDMyIDkwVDQ3MiAxNTRUNDg3IDIzNVE0ODcgMjc4IDQ3MyAzMTZUNDMzIDM4MVQzNzIgNDI1VDI5NCA0NDFRMjUyIDQ0MSAyMTcgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM3UTEwMCAxOTMgMTE0IDE1NlQxNTUgOTFUMjE2IDQ4VDI5NCAzMloiICAvPgorPGdseXBoIHVuaWNvZGU9InAiIGdseXBoLW5hbWU9InAiIGhvcml6LWFkdi14PSI1OTYiIGQ9Ik04NCA0NzFRODQgNDcyIDg4IDQ3NFQxMDAgNDc2UTExMyA0NzYgMTIyIDQ2N1QxMzEgNDI4VjM3NlExNjAgNDI0IDIwNiA0NTNUMzE5IDQ4M1EzNjYgNDgzIDQwNyA0NjVUNDc4IDQxNVQ1MjYgMzM4VDU0NCAyMzhRNTQ0IDE4MyA1MjcgMTM4VDQ4MCA1OVQ0MDcgOFQzMTYgLTEwUTI4MCAtMTAgMjUxIC0xVDE5OCAyM1QxNTggNTdUMTMyIDk2Vi0xOTBIODRWNDcxWk0zMTIgMzJRMzUzIDMyIDM4NyA0N1Q0NDUgODlUNDgyIDE1NFQ0OTYgMjM4UTQ5NiAyODIgNDgyIDMxOVQ0NDQgMzgzVDM4NyA0MjVUMzE0IDQ0MVEyNDUgNDQxIDIwMCA0MDZUMTMxIDMxMlYyMDNRMTMxIDE2NyAxNDUgMTM2VDE4MyA4MlQyNDEgNDZUMzEyIDMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icSIgZ2x5cGgtbmFtZT0icSIgaG9yaXotYWR2LXg9IjU5NiIgZD0iTTQ2NCA5NVE0MzggNDggMzkyIDE5VDI3NyAtMTBRMjI5IC0xMCAxODggOFQxMTcgNThUNjkgMTM1VDUyIDIzN1E1MiAyOTEgNjkgMzM2VDExNiA0MTRUMTg5IDQ2NVQyODAgNDgzUTMxNSA0ODMgMzQ0IDQ3NVQzOTcgNDUyVDQzNyA0MTlUNDY0IDM4MFY0MjhRNDY0IDQ1NyA0NzMgNDY2VDQ5NSA0NzZRNTAyIDQ3NiA1MDcgNDc0VDUxMiA0NzFWLTE5MEg0NjRWOTVaTTI4MiAzMlEzMjAgMzIgMzUzIDQ1VDQxMSA4MlQ0NTAgMTM2VDQ2NCAyMDNWMzExUTQ0MiAzNzAgMzk3IDQwNVQyODMgNDQxUTI0MyA0NDEgMjEwIDQyNlQxNTIgMzg0VDExNCAzMjBUMTAwIDIzOFExMDAgMTkzIDExMyAxNTVUMTUxIDkwVDIwOCA0OFQyODIgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJyIiBnbHlwaC1uYW1lPSJyIiBob3Jpei1hZHYteD0iMzU4IiBkPSJNODQgNDcxUTg0IDQ3MiA4OCA0NzRUMTAwIDQ3NlExMTMgNDc2IDEyMiA0NjdUMTMxIDQyOFYzNjlRMTQ2IDQyOSAxODAgNDU2VDI2MiA0ODNRMjkwIDQ4MyAzMDkgNDcyVDMyOCA0NDNRMzI4IDQyOSAzMjIgNDIzVDMxNCA0MThRMzA1IDQyNiAyOTEgNDMxVDI1NyA0MzdRMTkzIDQzNyAxNjMgMzc5VDEzMiAyMjVWMEg4NFY0NzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJzIiBnbHlwaC1uYW1lPSJzIiBob3Jpei1hZHYteD0iNDc0IiBkPSJNMjM3IC0xMFExNzQgLTEwIDEzMyA2VDY5IDQ1UTU2IDU4IDUxIDY3VDQ2IDg0UTQ2IDkxIDUwIDk2VDU4IDEwNVQ2NyAxMDlUNzIgMTEwUTk0IDc2IDEzNSA1M1QyMzkgMzBRMzA0IDMwIDMzOSA1NlQzNzUgMTIyUTM3NSAxNDYgMzY1IDE2MVQzMzUgMTg3VDI4OCAyMDRUMjI4IDIxOFExOTkgMjI0IDE2OSAyMzFUMTE1IDI1M1Q3NiAyODlUNjAgMzQ2UTYwIDM3NiA3MiA0MDFUMTA4IDQ0NVQxNjQgNDczVDIzNyA0ODNRMjkzIDQ4MyAzMzEgNDY4VDM5MCA0MzFRNDA4IDQxMyA0MDggMzk2UTQwOCAzODkgNDA0IDM4NFQzOTYgMzc1VDM4NyAzNzFUMzgyIDM3MVEzNjQgNDAyIDMyNiA0MjJUMjM3IDQ0M1ExNzUgNDQzIDE0MSA0MThUMTA2IDM1M1ExMDYgMzMwIDExNiAzMTZUMTQ0IDI5MVQxODkgMjc0VDI0OCAyNjBRMjc4IDI1NCAzMDkgMjQ2VDM2NSAyMjRUNDA2IDE4N1Q0MjIgMTI5UTQyMiA2NyAzNzMgMjlUMjM3IC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InQiIGdseXBoLW5hbWU9InQiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0yMzcgLTEwUTE3NCAtMTAgMTQ0IDI2VDExMyAxMzdWNDMwSDM1VjQ3M0gxMTNWNTY1UTExMyA1NzkgMTE5IDU4NFQxMzQgNTg5SDE0MFExNDkgNTg5IDE1NCA1ODRUMTYwIDU2NVY0NzNIMzE3VjQzMEgxNjBWMTQyUTE2MCA4MyAxNzggNTdUMjM5IDMxUTI2NSAzMSAyODQgNDJUMzE2IDcyUTMxOCA3NCAzMjUgNjhUMzMyIDQ4UTMzMiA0MiAzMjkgMzRUMzE2IDE4UTMwNSA2IDI4NiAtMlQyMzcgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idSIgZ2x5cGgtbmFtZT0idSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTI2OSAtMTBRMjIyIC0xMCAxODcgNVQxMjggNDhUOTIgMTE0VDgwIDIwMVY0NzNIMTI4VjIwNFExMjggMTI2IDE2NSA4MVQyNzIgMzVRMzMyIDM1IDM3NCA2NVQ0MzkgMTQ2VjQ3M0g0ODdWMlE0ODcgMSA0ODIgLTFUNDcwIC0zUTQ1OCAtMyA0NDkgNlQ0NDAgNDVWODhRNDE2IDQ2IDM3MyAxOFQyNjkgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idiIgZ2x5cGgtbmFtZT0idiIgaG9yaXotYWR2LXg9IjQ5MSIgZD0iTTMwIDQ2MlEzMCA0NjYgMzYgNDcxVDUyIDQ3NlQ3MSA0NzFUODkgNDQ0TDI0NiA0M0w0MDQgNDQ0UTQxMSA0NjQgNDIxIDQ3MFQ0NDAgNDc2VDQ1NSA0NzBUNDYxIDQ2MkwyNzQgMEgyMThMMzAgNDYyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgZ2x5cGgtbmFtZT0idyIgaG9yaXotYWR2LXg9IjY5NCIgZD0iTTQ0IDQ2M1E0NCA0NjUgNTEgNDcwVDY3IDQ3NlQ4NiA0NzBUMTAxIDQ0MUwxOTggNDRMMzEyIDM3OVEzMTUgMzkwIDMyMiAzOTVUMzQ5IDQwMFEzNjcgNDAwIDM3NCAzOTVUMzg2IDM3OUw0OTkgNDRMNTk1IDQ0MVE2MDAgNDYzIDYwOSA0NzBUNjI4IDQ3NlQ2NDQgNDcwVDY1MSA0NjNMNTI5IDBINDcwTDM0OSAzNTNMMjI1IDBIMTY2TDQ0IDQ2M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IngiIGdseXBoLW5hbWU9IngiIGhvcml6LWFkdi14PSI0ODUiIGQ9Ik02NCAtM1E1MCAtMyA0NCA2VDM5IDE4TDIxMyAyMzdMNDIgNDU1UTQwIDQ1NyA0NiA0NjZUNjYgNDc2UTc5IDQ3NiA4NiA0NzBUMTAyIDQ1MkwyNDQgMjY3TDM4NCA0NTFRMzk1IDQ2NSA0MDMgNDcwVDQyMCA0NzZRNDM0IDQ3NiA0NDAgNDY3VDQ0NSA0NTVMMjcyIDIzN0w0NDMgMThRNDQ1IDE2IDQzOSA3VDQxOSAtM1E0MDYgLTMgMzk5IDNUMzgzIDIxTDI0MCAyMDhMMTAwIDIyUTkxIDEwIDgzIDRUNjQgLTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ5IiBnbHlwaC1uYW1lPSJ5IiBob3Jpei1hZHYteD0iNDg4IiBkPSJNMTgyIC0xOTNRMTcyIC0xOTMgMTY0IC0xODhUMTU3IC0xODBMMjQxIDI2UTIyOCAyNiAyMjIgMzBUMjExIDQ1TDI1IDQ3M0g3NUwyNTQgNTZMNDEzIDQ3M0g0NjRMMjE2IC0xNjFRMjA5IC0xODEgMjAxIC0xODdUMTgyIC0xOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ6IiBnbHlwaC1uYW1lPSJ6IiBob3Jpei1hZHYteD0iNDkwIiBkPSJNNTEgMzdMMzcwIDQzMkg3OFE2NCA0MzIgNTkgNDM2VDU0IDQ1MFY0NTVRNTQgNDY0IDU5IDQ2OFQ3OCA0NzNINDM0VjQ0MEwxMTIgNDFINDE2UTQ0MSA0MSA0NDEgMjNWMThRNDQxIDAgNDE2IDBINTFWMzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ7IiBnbHlwaC1uYW1lPSJicmFjZWxlZnQiIGhvcml6LWFkdi14PSI0MjQiIGQ9Ik0zNjkgLTE5NlEzNDYgLTE5NiAzMTMgLTE4MFQyNDYgLTEzMFEyMDggLTkyIDE4MSAtMjVUMTQ5IDEzOEw3NCAxODJRNTUgMTkyIDQ4IDIwMFQ0MSAyMjhRNDEgMjM4IDQyIDI0NFQ0OCAyNTZUNTggMjY1VDc0IDI3NEwxNDkgMzE4UTE1MyA0MTIgMTgwIDQ4MFQyNDYgNTg2UTI4MCA2MjAgMzEzIDYzNlQzNjkgNjUyUTM4OCA2NTIgMzg4IDYzMVEzODggNjI2IDM4NiA2MjBUMzgxIDYxMlEyODQgNTg1IDI0MyA1MDZUMTk3IDI5M0w4MyAyMjhMMTk3IDE2M1EyMDEgMjggMjQyIC01MVQzODEgLTE1N1EzODMgLTE1OCAzODUgLTE2NFQzODggLTE3NlEzODggLTE5NiAzNjkgLTE5NloiICAvPgorPGdseXBoIHVuaWNvZGU9InwiIGdseXBoLW5hbWU9ImJhciIgaG9yaXotYWR2LXg9IjI2MCIgZD0iTTEyNyAtMTkzUTExOCAtMTkzIDExMiAtMTg5VDEwNiAtMTcwVjYyN1ExMDYgNjQxIDExMiA2NDVUMTI3IDY1MEgxMzNRMTQyIDY1MCAxNDggNjQ2VDE1NCA2MjdWLTE3MFExNTQgLTE4NCAxNDggLTE4OFQxMzMgLTE5M0gxMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ9IiBnbHlwaC1uYW1lPSJicmFjZXJpZ2h0IiBob3Jpei1hZHYteD0iNDI0IiBkPSJNNTQgLTE5NlEzNSAtMTk2IDM1IC0xNzZRMzUgLTE3MSAzNyAtMTY1VDQyIC0xNTdRMTM5IC0xMzAgMTgwIC01MVQyMjYgMTYzTDM0MCAyMjhMMjI2IDI5M1EyMjIgNDI3IDE4MSA1MDZUNDIgNjEyUTQwIDYxMyAzOCA2MTlUMzUgNjMxUTM1IDY1MiA1NCA2NTJRNzcgNjUyIDExMCA2MzZUMTc3IDU4NlEyMTUgNTQ4IDI0MiA0ODBUMjc0IDMxOEwzNDkgMjc0UTM1OCAyNjkgMzY0IDI2NVQzNzUgMjU2VDM4MCAyNDVUMzgyIDIyOFEzODIgMjA4IDM3NSAyMDBUMzQ5IDE4MkwyNzQgMTM4UTI3MCA0MyAyNDMgLTI0VDE3NyAtMTMwUTE0MyAtMTY0IDExMCAtMTgwVDU0IC0xOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBnbHlwaC1uYW1lPSJhc2NpaXRpbGRlIiBob3Jpei1hZHYteD0iNTI5IiBkPSJNMzI1IDE2N1EzMDAgMTY3IDI4MiAxNzlUMjQ4IDIwOFEyMzMgMjIzIDIyMyAyMzBUMjAyIDIzN1ExODcgMjM3IDE4MCAyMjZUMTY4IDE5NVExNjUgMTg0IDE2MSAxNzlUMTQ3IDE3M1ExMzggMTczIDEyOSAxNzlRMTMyIDIyNCAxNTAgMjUxVDIwMyAyNzhRMjI5IDI3OCAyNDcgMjY2VDI4MCAyMzdRMjk1IDIyMSAzMDUgMjE0VDMyNyAyMDdRMzQxIDIwNyAzNDggMjE4VDM2MSAyNDlRMzY0IDI2MCAzNjggMjY2VDM4MiAyNzJRMzkyIDI3MiAzOTkgMjY1UTM5NyAyMjAgMzc5IDE5NFQzMjUgMTY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTA7IiBnbHlwaC1uYW1lPSJ1bmkwMEEwIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEExOyIgZ2x5cGgtbmFtZT0iZXhjbGFtZG93biIgaG9yaXotYWR2LXg9IjI2MiIgZD0iTTEzNCA0NzRRMTQ1IDQ3NCAxNDUgNDU0TDE2MSAwSDEwMUwxMTYgNDU0UTExNyA0NjQgMTE4IDQ2OVQxMjggNDc0SDEzNFpNMTM1IDY1MlExNjkgNjUyIDE2OSA2MTdWNjEwUTE2OSA1NzUgMTM1IDU3NUgxMjdROTMgNTc1IDkzIDYxMFY2MTdROTMgNjUyIDEyNyA2NTJIMTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTI7IiBnbHlwaC1uYW1lPSJjZW50IiBob3Jpei1hZHYteD0iNTYwIiBkPSJNMjk4IC05OFEyODkgLTk4IDI4NCAtOTRUMjc4IC03NVYzM1EyMjkgMzcgMTg5IDU2VDEyMCAxMDhUNzYgMTgzVDYwIDI4MVE2MCAzMzIgNzYgMzc1VDEyMiA0NTJUMTkxIDUwNVQyNzggNTMwVjYzNFEyNzggNjQ4IDI4MyA2NTJUMjk4IDY1N0gzMDJRMzEyIDY1NyAzMTcgNjUzVDMyMiA2MzRWNTMxUTM3NSA1MjggNDEyIDUxMVQ0NzMgNDY5UTQ4OCA0NTQgNDk2IDQzOVQ1MDQgNDE2UTUwNCA0MDggNTAwIDQwMlQ0OTIgMzkzVDQ4MyAzODhUNDc3IDM4N1E0NTcgNDI5IDQyMCA0NTZUMzIwIDQ4OFY3NVEzODMgNzcgNDIzIDEwN1Q0ODIgMTgzUTQ4MyAxODQgNDg3IDE4M1Q0OTcgMTc5VDUwNyAxNzFUNTExIDE1N1E1MTEgMTQ2IDUwMiAxMjlUNDc0IDkzUTQ1MSA3MCA0MTMgNTJUMzIyIDMyVi03NVEzMjIgLTg5IDMxNyAtOTNUMzAyIC05OEgyOThaTTI4MCA0ODhRMjQyIDQ4NSAyMTEgNDY5VDE1NyA0MjdUMTIyIDM2M1QxMDkgMjgxUTEwOSAyMzcgMTIxIDIwMlQxNTcgMTQwVDIxMSA5N1QyODAgNzdWNDg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTM7IiBnbHlwaC1uYW1lPSJzdGVybGluZyIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTYxIDBRMzggMCAzOCAyMVYyNVEzOCA0NiA2MSA0NkgxMjNMMTY0IDI2OEg3NFE1MSAyNjggNTEgMjg4VjI5M1E1MSAzMTMgNzQgMzEzSDE3MkwyMDAgNDYzUTIxNyA1NTkgMjYxIDYwOVQzODggNjU5UTQyOSA2NTkgNDU4IDY0N1Q1MDcgNjE0UTUyNSA1OTUgNTM0IDU3M1Q1NDMgNTMxUTU0MyA1MjAgNTM4IDUxNFQ1MjcgNTA2VDUxNSA1MDNUNTA4IDUwM1E1MDEgNTU1IDQ3MSA1ODVUMzg4IDYxNlEzMjQgNjE2IDI5NCA1NzhUMjQ4IDQ2MEwyMjEgMzEzSDQwNFE0MjcgMzEzIDQyNyAyOTNWMjg4UTQyNyAyNjggNDA0IDI2OEgyMTNMMTcyIDQ2SDUwOVE1MzIgNDYgNTMyIDI0VjIxUTUzMiAwIDUwOSAwSDYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBnbHlwaC1uYW1lPSJjdXJyZW5jeSIgaG9yaXotYWR2LXg9IjY1NSIgZD0iTTQwMiAtMTBRMjk5IC0xMCAyMzUgNTJUMTUzIDIyNkg3NVE2MSAyMjYgNTYgMjMwVDUxIDI0NVYyNDlRNTEgMjU5IDU2IDI2M1Q3NSAyNjhIMTQ4UTE0NyAyNzYgMTQ3IDI4NFQxNDcgMzAyVjM0N1ExNDcgMzU2IDE0NyAzNjVUMTQ4IDM4NEg3NVE2MSAzODQgNTYgMzg4VDUxIDQwM1Y0MDdRNTEgNDE3IDU2IDQyMlQ3NSA0MjdIMTU0UTE2MyA0ODAgMTg0IDUyMlQyMzYgNTk1VDMwOSA2NDFUMzk4IDY1N1E0NTcgNjU3IDQ5NyA2MzlUNTYxIDU5NlE1NzggNTc4IDU4NiA1NjFUNTk1IDUzMFE1OTUgNTIyIDU5MSA1MTdUNTgxIDUwOFQ1NzEgNTAzVDU2NSA1MDNRNTU2IDUyNSA1NDIgNTQ1VDUwNyA1ODFUNDU5IDYwNlQzOTUgNjE1UTMyMCA2MTUgMjcwIDU2NVQyMDIgNDI3SDQzM1E0NTYgNDI3IDQ1NiA0MDdWNDAzUTQ1NiAzODQgNDMzIDM4NEgxOTZRMTk1IDM3NSAxOTUgMzY2VDE5NSAzNDdWMzAwUTE5NSAyOTIgMTk1IDI4NFQxOTYgMjY4SDQzM1E0NTYgMjY4IDQ1NiAyNDlWMjQ1UTQ1NiAyMjYgNDMzIDIyNkgyMDJRMjE5IDEzOCAyNzAgODZUNDAwIDMzUTQzNiAzMyA0NjQgNDJUNTEyIDY4VDU0NyAxMDVUNTcwIDE1MVE1NzEgMTUyIDU3NSAxNTFUNTg1IDE0N1Q1OTUgMTM4VDYwMCAxMjNRNjAwIDEwOSA1OTEgOTBUNTYzIDUzUTUzNyAyNyA0OTcgOVQ0MDIgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTU7IiBnbHlwaC1uYW1lPSJ5ZW4iIGhvcml6LWFkdi14PSI1ODMiIGQ9Ik0yODggLTNRMjY4IC0zIDI2OCAyMFYxMjNIOTVRNzIgMTIzIDcyIDE0MlYxNDdRNzIgMTY2IDk1IDE2NkgyNjhWMjY1SDk1UTcyIDI2NSA3MiAyODRWMjg4UTcyIDMwNyA5NSAzMDdIMjUzTDQ5IDYyOVE0NyA2MzIgNTMgNjM4VDY5IDY0N1Q4OSA2NDlUMTA4IDYzM0wyOTEgMzI2TDQ3NyA2MzJRNDg2IDY0NyA0OTYgNjQ5VDUxNSA2NDhUNTI5IDYzOFQ1MzMgNjI5TDMyOSAzMDdINDg3UTUxMCAzMDcgNTEwIDI4OFYyODRRNTEwIDI2NSA0ODcgMjY1SDMxNFYxNjZINDg3UTUxMCAxNjYgNTEwIDE0N1YxNDJRNTEwIDEyMyA0ODcgMTIzSDMxNFYyMFEzMTQgLTMgMjkzIC0zSDI4OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE2OyIgZ2x5cGgtbmFtZT0iYnJva2VuYmFyIiBob3Jpei1hZHYteD0iMjYwIiBkPSJNMTI3IC0xOTNRMTE4IC0xOTMgMTEyIC0xODlUMTA2IC0xNzBWMTc3UTEwNiAxOTEgMTEyIDE5NVQxMjcgMjAwSDEzM1ExNDIgMjAwIDE0OCAxOTZUMTU0IDE3N1YtMTcwUTE1NCAtMTg0IDE0OCAtMTg4VDEzMyAtMTkzSDEyN1pNMTI3IDI1N1ExMTggMjU3IDExMiAyNjFUMTA2IDI4MFY2MjdRMTA2IDY0MSAxMTIgNjQ1VDEyNyA2NTBIMTMzUTE0MiA2NTAgMTQ4IDY0NlQxNTQgNjI3VjI4MFExNTQgMjY2IDE0OCAyNjJUMTMzIDI1N0gxMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNzsiIGdseXBoLW5hbWU9InNlY3Rpb24iIGhvcml6LWFkdi14PSI1MzEiIGQ9Ik0yNjEgLTE1N1ExOTIgLTE1NyAxNDcgLTEzOVQ3OSAtOTdRNjIgLTgwIDU1IC02NlQ0OCAtNDFRNDggLTMzIDUyIC0yN1Q2MSAtMThUNzAgLTEyVDc1IC0xMVE5NyAtNTYgMTQxIC04NFQyNjAgLTExM1EzMzIgLTExMyAzNzQgLTg2VDQxNyAtMTFRNDE3IDE4IDQwNSAzNlQzNzAgNjZUMzE3IDg2VDI0OCAxMDNRMjEyIDExMSAxNzcgMTIxVDExNCAxNDdUNjkgMTg5VDUyIDI1M1E1MiAzMDEgODQgMzMyVDE3MiAzNzhRMTI3IDM5NCA5OSA0MjJUNzAgNTA1UTcwIDUzOSA4NSA1NjdUMTI3IDYxNVQxOTAgNjQ2VDI2OCA2NTdRMzMxIDY1NyAzNzEgNjQwVDQzNSA1OTlRNDQ4IDU4NSA0NTQgNTcyVDQ2MSA1NTBRNDYxIDU0MiA0NTcgNTM3VDQ0OSA1MjdUNDQwIDUyMlQ0MzQgNTIxUTQxMiA1NjAgMzczIDU4NlQyNjggNjEzUTIzNyA2MTMgMjEwIDYwNlQxNjIgNTg2VDEzMCA1NTNUMTE4IDUxMVExMTggNDg0IDEzMCA0NjZUMTY0IDQzNVQyMTYgNDEzVDI4NCAzOTZRMzIwIDM4OCAzNTUgMzc4VDQxNyAzNTJUNDYyIDMxMFQ0ODAgMjQ3UTQ4MCAxOTkgNDQ5IDE2N1QzNjQgMTIwUTM4NSAxMTMgNDAzIDEwM1Q0MzUgNzdUNDU3IDQxVDQ2NSAtOFE0NjUgLTQxIDQ1MSAtNjhUNDA5IC0xMTVUMzQ1IC0xNDZUMjYxIC0xNTdaTTMwOCAxMzZRMzM1IDEzOSAzNTggMTQ4VDM5OCAxNzJUNDI0IDIwNVQ0MzQgMjQyUTQzNCAyNjkgNDIxIDI4N1QzODQgMzE3VDMyOSAzMzdUMjYzIDM1NEwyMjUgMzYyUTE5NyAzNTkgMTc0IDM0OVQxMzQgMzI1VDEwOCAyOTNUOTggMjU3UTk4IDIzMCAxMTEgMjEyVDE0OCAxODJUMjAzIDE2MVQyNjkgMTQ1TDMwOCAxMzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBODsiIGdseXBoLW5hbWU9ImRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMzQ1IDU0NVEzMDcgNTQ1IDMwNyA1ODNRMzA3IDYyMSAzNDQgNjIxUTM2MSA2MjEgMzcxIDYxMVQzODIgNTgzUTM4MiA1NjUgMzcyIDU1NVQzNDUgNTQ1Wk0xODYgNTQ1UTE2OSA1NDUgMTU5IDU1NVQxNDggNTgzUTE0OCA2MDEgMTU4IDYxMVQxODUgNjIxUTIyMyA2MjEgMjIzIDU4M1EyMjMgNTY1IDIxMyA1NTVUMTg2IDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE5OyIgZ2x5cGgtbmFtZT0iY29weXJpZ2h0IiBob3Jpei1hZHYteD0iNzc5IiBkPSJNMzg5IC0xMFEzMTcgLTEwIDI1OCAxNFQxNTUgODNUODggMTg4VDY0IDMyMlE2NCAzOTQgODggNDU1VDE1NiA1NjFUMjYwIDYzMVQzOTAgNjU3UTQ2MiA2NTcgNTIyIDYzM1Q2MjUgNTY0VDY5MiA0NTlUNzE2IDMyNVE3MTYgMjUzIDY5MiAxOTJUNjIzIDg2VDUxOSAxNlQzODkgLTEwWk0zOTEgMjZRNDU0IDI2IDUwNiA0OFQ1OTYgMTA5VDY1NSAyMDNUNjc2IDMyNFE2NzYgMzg4IDY1NSA0NDNUNTk1IDUzN1Q1MDQgNTk5VDM4OSA2MjJRMzI2IDYyMiAyNzQgNjAwVDE4NCA1MzlUMTI1IDQ0NFQxMDQgMzIzUTEwNCAyNTggMTI1IDIwNFQxODUgMTEwVDI3NSA0OFQzOTEgMjZaTTM5OCAxNDVRMzU5IDE0NSAzMjcgMTU4VDI3MiAxOTRUMjM3IDI1MFQyMjQgMzIyUTIyNCAzNjAgMjM3IDM5MlQyNzMgNDQ5VDMyOCA0ODZUMzk3IDUwMFE0MzYgNTAwIDQ2NCA0ODhUNTA4IDQ1OVE1MjkgNDM4IDUyOSA0MTlRNTI5IDQxMyA1MjYgNDA5VDUxOCA0MDFUNTA5IDM5N1Q1MDQgMzk2UTQ5MiA0MjMgNDY1IDQ0MVQzOTYgNDU5UTM2OSA0NTkgMzQ2IDQ0OVQzMDYgNDIwVDI4MCAzNzZUMjcwIDMyM1EyNzAgMjkzIDI3OSAyNjhUMzA2IDIyNVQzNDcgMTk3VDQwMCAxODZRNDQ2IDE4NiA0NzEgMjA3VDUwOCAyNTRRNTA5IDI1NSA1MTMgMjU0VDUyMSAyNTBUNTMwIDI0M1Q1MzQgMjMxUTUzNCAyMjQgNTI4IDIxMlQ1MDggMTg0UTQ5MyAxNjkgNDY1IDE1N1QzOTggMTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUE7IiBnbHlwaC1uYW1lPSJvcmRmZW1pbmluZSIgaG9yaXotYWR2LXg9IjQ0NiIgZD0iTTE4OSAyNjJRMTI1IDI2MiA4OCAyODlUNTAgMzY1UTUwIDM5MyA2MiA0MTVUMTA2IDQ1NFQxOTEgNDgwVDMyOCA0OTNWNTAzUTMyOCA1NTYgMzAwIDU4NlQyMTQgNjE3UTE2NyA2MTcgMTM4IDU5N1Q5MSA1NDdROTEgNTQ3IDg3IDU0N1Q3OSA1NTBUNzAgNTU4VDY2IDU3MVE2NiA1ODYgODkgNjExUTEwNyA2MjggMTM4IDY0MlQyMTcgNjU3UTI5NSA2NTcgMzM0IDYxNVQzNzMgNTAzVjI3MlEzNzMgMjcwIDM2OSAyNjlUMzU4IDI2N1EzNDYgMjY3IDMzOCAyNzVUMzI5IDMwOVYzNDBRMzExIDMwNSAyNzQgMjg0VDE4OSAyNjJaTTIxNSAtNVExODMgLTUgMTgzIDI3VjMzUTE4MyA2NSAyMTUgNjVIMjIxUTI1MyA2NSAyNTMgMzNWMjdRMjUzIC01IDIyMSAtNUgyMTVaTTE5NSAyOTlRMjIzIDI5OSAyNDcgMzA4VDI5MCAzMzJUMzE4IDM2N1QzMjkgNDA5VjQ2MFEyNTcgNDU3IDIxMiA0NTBUMTQxIDQzMFQxMDYgNDAyVDk2IDM2N1E5NiAzMzUgMTIyIDMxN1QxOTUgMjk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RsZWZ0IiBob3Jpei1hZHYteD0iNTE4IiBkPSJNNDM0IDgzUTQyMCA4MyAzOTcgOTlUMzM0IDE0OVEyOTIgMTg1IDI2OSAyMTFUMjQ1IDI0MlEyNDUgMjQ2IDI2OCAyNzFUMzMzIDMzM1EzNzIgMzY3IDM5NiAzODRUNDM0IDQwMVE0NDIgNDAxIDQ0NyAzOTZUNDUzIDM4M1E0NTMgMzcyIDQzMyAzNTNUMzY2IDI5OFEzNDYgMjgyIDMyOCAyNjlUMjkwIDI0MVEzMTAgMjI3IDMyOSAyMTRUMzY4IDE4M1E0MTMgMTQ4IDQzMyAxMzBUNDUzIDEwMFE0NTMgOTMgNDQ4IDg4VDQzNCA4M1pNMjM1IDk0UTIyMiA5NCAyMDEgMTA5VDE0MyAxNTVRMTAzIDE4OSA4MSAyMTNUNTkgMjQyUTU5IDI0NiA4MSAyNzBUMTQzIDMyOFExODAgMzYwIDIwMSAzNzRUMjM1IDM4OVEyNTEgMzg5IDI1MSAzNzJRMjUxIDM2NCAyMzQgMzQ3VDE3NSAyOTdRMTU2IDI4MiAxMzkgMjY5VDEwMSAyNDFRMTIxIDIyNyAxNDAgMjEzVDE3OSAxODNRMjE5IDE1MSAyMzUgMTM1VDI1MSAxMTFRMjUxIDk0IDIzNSA5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFDOyIgZ2x5cGgtbmFtZT0ibG9naWNhbG5vdCIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTQ5IDM4MEg1NDNWOTZINDUzVjI5N0g0OVYzODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRDsiIGdseXBoLW5hbWU9InVuaTAwQUQiIGhvcml6LWFkdi14PSIzODEiIGQ9Ik02MCAyNzBIMzIwVjIyNkg2MFYyNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRTsiIGdseXBoLW5hbWU9InJlZ2lzdGVyZWQiIGhvcml6LWFkdi14PSI3NzkiIGQ9Ik0zODkgLTEwUTMxNyAtMTAgMjU4IDE0VDE1NSA4M1Q4OCAxODhUNjQgMzIyUTY0IDM5NCA4OCA0NTVUMTU2IDU2MVQyNjAgNjMxVDM5MCA2NTdRNDYyIDY1NyA1MjIgNjMzVDYyNSA1NjRUNjkyIDQ1OVQ3MTYgMzI1UTcxNiAyNTMgNjkyIDE5MlQ2MjMgODZUNTE5IDE2VDM4OSAtMTBaTTM5MSAyNlE0NTQgMjYgNTA2IDQ4VDU5NiAxMDlUNjU1IDIwM1Q2NzYgMzI0UTY3NiAzODggNjU1IDQ0M1Q1OTUgNTM3VDUwNCA1OTlUMzg5IDYyMlEzMjYgNjIyIDI3NCA2MDBUMTg0IDUzOVQxMjUgNDQ0VDEwNCAzMjNRMTA0IDI1OCAxMjUgMjA0VDE4NSAxMTBUMjc1IDQ4VDM5MSAyNlpNNTI4IDM5NVE1MjggMzQ5IDQ5OCAzMjJUNDA4IDI5NEw1MjUgMTcyUTUyNyAxNjkgNTIwIDE2MVQ1MDEgMTUzUTQ5NCAxNTMgNDg2IDE1NlQ0NzAgMTY5TDM2MCAyOTFIMzE3VjE3NFEzMTcgMTUzIDI5OCAxNTNIMjkxUTI3MiAxNTMgMjcyIDE3NlY0NzJRMjcyIDQ5OSAyOTcgNDk5SDM5OFE0NjEgNDk5IDQ5NCA0NzNUNTI4IDM5NVpNMzk5IDMyOFE0NDEgMzI4IDQ2MiAzNDVUNDg0IDM5NVE0ODQgNDYxIDM5NyA0NjFIMzE2VjMyOEgzOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRjsiIGdseXBoLW5hbWU9InVuaTAwQUYiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xNjMgNTY3UTEzNCA1NjcgMTM0IDU4OFY1OTJRMTM0IDYxMiAxNjMgNjEySDM2N1EzOTYgNjEyIDM5NiA1OTJWNTg4UTM5NiA1NjcgMzY3IDU2N0gxNjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMDsiIGdseXBoLW5hbWU9ImRlZ3JlZSIgaG9yaXotYWR2LXg9IjQxMiIgZD0iTTIwNCAzNzBRMTc0IDM3MCAxNDkgMzgwVDEwNSA0MDlUNzcgNDU0VDY2IDUxMFY1MThRNjYgNTQ4IDc3IDU3NFQxMDcgNjE4VDE1MiA2NDhUMjA4IDY1OVEyMzggNjU5IDI2MyA2NDlUMzA3IDYxOVQzMzUgNTc1VDM0NiA1MTlWNTExUTM0NiA0ODEgMzM1IDQ1NVQzMDUgNDExVDI2MCAzODFUMjA0IDM3MFpNMjA2IDQwOVEyNDggNDA5IDI3NiA0MzhUMzA1IDUxMFY1MThRMzA1IDUzOSAyOTcgNTU4VDI3NiA1OTBUMjQ0IDYxMlQyMDUgNjIwUTE2MyA2MjAgMTM1IDU5MVQxMDcgNTE5VjUxMVExMDcgNDkwIDExNCA0NzFUMTM1IDQzOVQxNjcgNDE3VDIwNiA0MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMTsiIGdseXBoLW5hbWU9InBsdXNtaW51cyIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTMzNyA0NTBINDgyUTQ5NiA0NTAgNTAwIDQ0NlQ1MDUgNDMxVjQyNlE1MDUgNDE3IDUwMSA0MTJUNDgyIDQwN0gzMzdWMjUzUTMzNyAyMzkgMzMyIDIzNVQzMTcgMjMwSDMxM1EzMDMgMjMwIDI5OCAyMzRUMjkyIDI1M1Y0MDdIMTQ3UTEyNCA0MDcgMTI0IDQyNlY0MzFRMTI0IDQ1MCAxNDcgNDUwSDI5MlY1OTZRMjkyIDYxMCAyOTcgNjE1VDMxMyA2MjBIMzE3UTMyNiA2MjAgMzMxIDYxNVQzMzcgNTk2VjQ1MFpNMTMyIDEyOFExMTggMTI4IDExNCAxMzNUMTA5IDE0OFYxNTNRMTA5IDE2MyAxMTMgMTY4VDEzMiAxNzNINDk4UTUyMSAxNzMgNTIxIDE1M1YxNDhRNTIxIDEyOCA0OTggMTI4SDEzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIyOyIgZ2x5cGgtbmFtZT0idHdvc3VwZXJpb3IiIGhvcml6LWFkdi14PSIzNjYiIGQ9Ik05OCAzMjVIMjkzUTMxNSAzMjUgMzE1IDMwN1YzMDRRMzE1IDI4NSAyOTMgMjg1SDg4UTcxIDI4NSA2NSAyOTFUNTggMzExVjMyN1E1OCAzNTUgNjcgMzc2VDkyIDQxMlQxMjggNDQwVDE3MSA0NjNRMTkwIDQ3MiAyMDYgNDgwVDIzNSA0OTlUMjU1IDUyMFQyNjMgNTQ4UTI2MyA1NzcgMjQzIDU5NVQxODMgNjE0UTE0MSA2MTQgMTIwIDU5MlQ5MCA1NDBROTAgNTM5IDg1IDUzOVQ3MyA1NDFUNjIgNTQ4VDU3IDU2MlE1NyA1NzMgNjUgNTkwVDkxIDYyMVExMDggNjM1IDEzMSA2NDRUMTg3IDY1NFEyNDYgNjU0IDI3NyA2MjZUMzA5IDU0OVEzMDkgNTI1IDMwMSA1MDhUMjc4IDQ3OVQyNDUgNDU2VDIwNCA0MzVRMTgzIDQyNiAxNjQgNDE2VDEzMSAzOTRUMTA3IDM2NVQ5OCAzMjdWMzI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjM7IiBnbHlwaC1uYW1lPSJ0aHJlZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iMzY2IiBkPSJNMzEwIDM4NlEzMTAgMzM2IDI3NCAzMDhUMTc0IDI3OVExNDcgMjc5IDEyNiAyODVUODkgMzAxUTY2IDMxNCA1NCAzMzBUNDIgMzU4UTQyIDM2NyA0NiAzNzJUNTUgMzc5VDY1IDM4MlQ3MCAzODJRNzkgMzUzIDEwNSAzMzVUMTczIDMxNlEyMTUgMzE2IDI0MSAzMzZUMjY4IDM4OFEyNjggNDIwIDI0MyA0MzhUMTc2IDQ1N0gxNDRRMTIyIDQ1NyAxMjIgNDc0VjQ3N1ExMjIgNDkzIDE0NCA0OTNIMTgxUTIxNiA0OTMgMjM3IDUwOVQyNTggNTUzUTI1OCA1ODIgMjM1IDU5OVQxNzMgNjE2UTEzNyA2MTYgMTEzIDU5OVQ4MCA1NTlRODAgNTU5IDc2IDU1OVQ2NiA1NjJUNTcgNTcwVDUzIDU4M1E1MyA1OTQgNjIgNjA2VDg4IDYyOVExMDQgNjQwIDEyNiA2NDdUMTc0IDY1NFEyMzUgNjU0IDI2NyA2MjhUMzAwIDU1N1EzMDAgNTI1IDI4MyA1MDZUMjM2IDQ3OFEyNzEgNDY4IDI5MCA0NDVUMzEwIDM4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgZ2x5cGgtbmFtZT0iYWN1dGUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xOTYgNTQ3UTE5NSA1NDggMjAzIDU1OFQyMjYgNTg1VDI2MiA2MjBUMzEwIDY1OVEzMjcgNjcyIDMzNyA2NzZUMzU1IDY4MVEzNjQgNjgxIDM3MCA2NzZUMzc3IDY2MVEzNzcgNjUxIDM2OSA2NDJUMzM5IDYxNVEzMTIgNTk1IDI4NyA1ODJUMjQyIDU2MFQyMTAgNTQ4VDE5NiA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNTsiIGdseXBoLW5hbWU9InVuaTAwQjUiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik04MCA0NzNIMTI4VjIwNFExMjggMTI2IDE2NSA4MVQyNzIgMzVRMzMyIDM1IDM3NCA2NVQ0MzkgMTQ2VjQ3M0g0ODdWMlE0ODcgMSA0ODIgLTFUNDcwIC0zUTQ1OCAtMyA0NDkgNlQ0NDAgNDVWODhRNDE2IDQ2IDM3MyAxOFQyNjkgLTEwUTIyMiAtMTAgMTg3IDVUMTI4IDQ3Vi0yNjBIODBWNDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjY7IiBnbHlwaC1uYW1lPSJwYXJhZ3JhcGgiIGhvcml6LWFkdi14PSI2MTQiIGQ9Ik00OTIgLTNRNDcwIC0zIDQ3MCAyMFY2MjdRNDcwIDY1MCA0OTIgNjUwSDQ5OFE1MjAgNjUwIDUyMCA2MjdWMjBRNTIwIC0zIDQ5OCAtM0g0OTJaTTM5MSAtM1EzODAgLTMgMzc1IDNUMzY5IDIwVjMwNEgyODBRMTY4IDMwNCAxMDkgMzQ2VDUwIDQ3M1E1MCA1NTggMTA2IDYwM1QyNzUgNjQ4SDM4OFE0MDIgNjQ4IDQxMCA2NDBUNDE4IDYxOFYyMFE0MTggLTMgMzk3IC0zSDM5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI3OyIgZ2x5cGgtbmFtZT0idW5pMDBCNyIgaG9yaXotYWR2LXg9IjIzNiIgZD0iTTExNCAyMTBRODAgMjEwIDgwIDI0NFYyNTJRODAgMjg3IDExNCAyODdIMTIxUTE1NiAyODcgMTU2IDI1MlYyNDRRMTU2IDIxMCAxMjEgMjEwSDExNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI4OyIgZ2x5cGgtbmFtZT0iY2VkaWxsYSIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTIwOSAtMjEzUTIwNyAtMjE2IDIwMiAtMjE2VDE5MiAtMjE2VDE4NCAtMjExVDE4NCAtMjAxTDI0NiAtNzRRMjUxIC02MiAyNTYgLTU1VDI3NiAtNDhIMjgwUTI5MCAtNDggMjk3IC01NFQzMDUgLTcwVi03M1EzMDUgLTc5IDMwMCAtODZUMjg2IC0xMDVMMjA5IC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCOTsiIGdseXBoLW5hbWU9Im9uZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iMzY2IiBkPSJNODkgMjg1UTY3IDI4NSA2NyAzMDNWMzA1UTY3IDMyNSA4OSAzMjVIMTcyVjU4MlExNjMgNTcwIDE0OSA1NjRUMTE3IDU1N1ExMDYgNTU3IDk1IDU2MFQ3NyA1NzFRNjUgNTgwIDY1IDU5NFE2NSA2MDUgNzEgNjExVDgwIDYxN1E5MiA2MDAgMTIwIDYwMFExNDIgNjAwIDE1OSA2MTNUMTc4IDY1MEgxOTVRMjE3IDY1MCAyMTcgNjI3VjMyNUgyOTBRMzEyIDMyNSAzMTIgMzA1VjMwM1EzMTIgMjg1IDI5MCAyODVIODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQTsiIGdseXBoLW5hbWU9Im9yZG1hc2N1bGluZSIgaG9yaXotYWR2LXg9IjQ5NCIgZD0iTTI0NyAyNjFRMjA2IDI2MSAxNzEgMjc2VDExMCAzMTdUNzAgMzgwVDU1IDQ1OFE1NSA1MDAgNzAgNTM2VDExMSA1OTlUMTcyIDY0MVQyNDggNjU3UTI4OSA2NTcgMzI0IDY0MlQzODQgNjAxVDQyNCA1MzhUNDM5IDQ2MFE0MzkgNDE4IDQyNSAzODJUMzg0IDMxOVQzMjMgMjc3VDI0NyAyNjFaTTI0MyAtNVEyMTIgLTUgMjEyIDI3VjMzUTIxMiA2NSAyNDMgNjVIMjUwUTI4MiA2NSAyODIgMzNWMjdRMjgyIC01IDI1MCAtNUgyNDNaTTI0NyAzMDFRMjc5IDMwMSAzMDYgMzEzVDM1MyAzNDZUMzg0IDM5N1QzOTUgNDU5UTM5NSA0OTIgMzg0IDUyMVQzNTMgNTcxVDMwNiA2MDVUMjQ4IDYxN1EyMTYgNjE3IDE4OSA2MDVUMTQyIDU3MlQxMTEgNTIxVDEwMCA0NTlRMTAwIDQyNiAxMTEgMzk3VDE0MiAzNDdUMTg4IDMxNFQyNDcgMzAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RyaWdodCIgaG9yaXotYWR2LXg9IjUxOCIgZD0iTTg0IDgzUTc2IDgzIDcxIDg4VDY2IDEwMVE2NiAxMTIgODYgMTMxVDE1MiAxODZMMjI4IDI0M1EyMDggMjU3IDE4OSAyNzBUMTUwIDMwMFExMDUgMzM1IDg2IDM1NFQ2NiAzODRRNjYgMzkxIDcxIDM5NlQ4NCA0MDFROTggNDAxIDEyMSAzODVUMTg0IDMzNVEyMjYgMjk4IDI0OSAyNzNUMjczIDI0MlEyNzMgMjM3IDI1MCAyMTJUMTg1IDE1MFExNDYgMTE2IDEyMiAxMDBUODQgODNaTTI4MyA5NVEyNjcgOTUgMjY3IDExMVEyNjcgMTIwIDI4NCAxMzdUMzQzIDE4N1EzNjIgMjAyIDM3OSAyMTVUNDE3IDI0M1EzOTcgMjU3IDM3OCAyNzFUMzM5IDMwMVEzMDAgMzMzIDI4NCAzNDlUMjY3IDM3M1EyNjcgMzg5IDI4MyAzODlRMjk2IDM4OSAzMTcgMzc1VDM3NSAzMjlRNDE1IDI5NCA0MzcgMjcwVDQ2MCAyNDJRNDYwIDIzNyA0MzggMjE0VDM3NSAxNTVRMzM4IDEyNCAzMTcgMTEwVDI4MyA5NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJDOyIgZ2x5cGgtbmFtZT0ib25lcXVhcnRlciIgaG9yaXotYWR2LXg9IjgyMiIgZD0iTTg5IDI4NVE2NyAyODUgNjcgMzAzVjMwNVE2NyAzMjUgODkgMzI1SDE3MlY1ODJRMTYzIDU3MCAxNDkgNTY0VDExNyA1NTdRMTA2IDU1NyA5NSA1NjBUNzcgNTcxUTY1IDU4MCA2NSA1OTRRNjUgNjA1IDcxIDYxMVQ4MCA2MTdROTIgNjAwIDEyMCA2MDBRMTQyIDYwMCAxNTkgNjEzVDE3OCA2NTBIMTk1UTIxNyA2NTAgMjE3IDYyN1YzMjVIMjkwUTMxMiAzMjUgMzEyIDMwNVYzMDNRMzEyIDI4NSAyOTAgMjg1SDg5Wk02ODAgNjE2UTY4MCA2MDggNjc2IDU5OVQ2NjEgNTc2UTY1NiA1NjkgNjMyIDU0MFQ1NzUgNDcwVDUwNSAzODRUNDM4IDMwMlE0MTggMjc3IDM5MSAyNDNUMzM0IDE3M1QyNzcgMTAwVDIyNiAzNlQxODkgLTlUMTc1IC0yN1ExNzMgLTI5IDE2MyAtMjZUMTUzIC0xMVExNTMgMCAxNTYgN1QxNzEgMjlRMTc2IDM2IDIwMCA2NVQyNTggMTM1VDMyOCAyMjBUMzk1IDMwMlE0MTAgMzIxIDQyOSAzNDVUNDcwIDM5NVQ1MTMgNDUwVDU1NyA1MDRRNjA2IDU2NiA2NTggNjMyUTY1OCA2MzIgNjYxIDYzMlQ2NjkgNjMxVDY3NiA2MjZUNjgwIDYxNlpNNzAwIC0yUTY4MSAtMiA2ODEgMjBWMTAySDUyMlE1MDggMTAyIDUwMCAxMDhUNDkyIDEyM1YxMzNRNDkzIDE0MSA0OTYgMTQ3VDUwNiAxNjJMNjQ3IDM0NVE2NTUgMzU3IDY2MyAzNjFUNjg5IDM2NlE3MDggMzY2IDcxNSAzNTlUNzIzIDMzNVYxNDBINzcwUTc5MSAxNDAgNzkxIDEyMlYxMjBRNzkxIDEwMiA3NzAgMTAySDcyM1YyMFE3MjMgLTIgNzAzIC0ySDcwMFpNNTM0IDEzOUg2ODJMNjgxIDMyOUw1MzQgMTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkQ7IiBnbHlwaC1uYW1lPSJvbmVoYWxmIiBob3Jpei1hZHYteD0iODIyIiBkPSJNNTU0IDQwSDc0OVE3NzEgNDAgNzcxIDIyVjE5UTc3MSAwIDc0OSAwSDU0NFE1MjcgMCA1MjEgNlQ1MTQgMjZWNDJRNTE0IDcwIDUyMyA5MVQ1NDggMTI3VDU4NCAxNTVUNjI3IDE3OFE2NDYgMTg3IDY2MiAxOTVUNjkxIDIxNFQ3MTEgMjM1VDcxOSAyNjNRNzE5IDI5MiA2OTkgMzEwVDYzOSAzMjlRNTk3IDMyOSA1NzYgMzA3VDU0NiAyNTVRNTQ2IDI1NCA1NDEgMjU0VDUyOSAyNTZUNTE4IDI2M1Q1MTMgMjc3UTUxMyAyODggNTIxIDMwNVQ1NDcgMzM2UTU2NCAzNTAgNTg3IDM1OVQ2NDMgMzY5UTcwMiAzNjkgNzMzIDM0MVQ3NjUgMjY0UTc2NSAyNDAgNzU3IDIyM1Q3MzQgMTk0VDcwMSAxNzFUNjYwIDE1MFE2MzkgMTQxIDYyMCAxMzFUNTg3IDEwOVQ1NjMgODBUNTU0IDQyVjQwWk02NjAgNjE2UTY2MCA2MDggNjU2IDU5OVQ2NDEgNTc2UTYzNiA1NjkgNjEyIDU0MFQ1NTUgNDcwVDQ4NSAzODRUNDE4IDMwMlEzOTggMjc3IDM3MSAyNDNUMzE0IDE3M1QyNTcgMTAwVDIwNiAzNlQxNjkgLTlUMTU1IC0yN1ExNTMgLTI5IDE0MyAtMjZUMTMzIC0xMVExMzMgMCAxMzYgN1QxNTEgMjlRMTU2IDM2IDE4MCA2NVQyMzggMTM1VDMwOCAyMjBUMzc1IDMwMlEzOTAgMzIxIDQwOSAzNDVUNDUwIDM5NVQ0OTMgNDUwVDUzNyA1MDRRNTg2IDU2NiA2MzggNjMyUTYzOCA2MzIgNjQxIDYzMlQ2NDkgNjMxVDY1NiA2MjZUNjYwIDYxNlpNODkgMjg1UTY3IDI4NSA2NyAzMDNWMzA1UTY3IDMyNSA4OSAzMjVIMTcyVjU4MlExNjMgNTcwIDE0OSA1NjRUMTE3IDU1N1ExMDYgNTU3IDk1IDU2MFQ3NyA1NzFRNjUgNTgwIDY1IDU5NFE2NSA2MDUgNzEgNjExVDgwIDYxN1E5MiA2MDAgMTIwIDYwMFExNDIgNjAwIDE1OSA2MTNUMTc4IDY1MEgxOTVRMjE3IDY1MCAyMTcgNjI3VjMyNUgyOTBRMzEyIDMyNSAzMTIgMzA1VjMwM1EzMTIgMjg1IDI5MCAyODVIODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRTsiIGdseXBoLW5hbWU9InRocmVlcXVhcnRlcnMiIGhvcml6LWFkdi14PSI4MjIiIGQ9Ik03MDAgLTJRNjgxIC0yIDY4MSAyMFYxMDJINTIyUTUwOCAxMDIgNTAwIDEwOFQ0OTIgMTIzVjEzM1E0OTMgMTQxIDQ5NiAxNDdUNTA2IDE2Mkw2NDcgMzQ1UTY1NSAzNTcgNjYzIDM2MVQ2ODkgMzY2UTcwOCAzNjYgNzE1IDM1OVQ3MjMgMzM1VjE0MEg3NzBRNzkxIDE0MCA3OTEgMTIyVjEyMFE3OTEgMTAyIDc3MCAxMDJINzIzVjIwUTcyMyAtMiA3MDMgLTJINzAwWk0zMTAgMzg2UTMxMCAzMzYgMjc0IDMwOFQxNzQgMjc5UTE0NyAyNzkgMTI2IDI4NVQ4OSAzMDFRNjYgMzE0IDU0IDMzMFQ0MiAzNThRNDIgMzY3IDQ2IDM3MlQ1NSAzNzlUNjUgMzgyVDcwIDM4MlE3OSAzNTMgMTA1IDMzNVQxNzMgMzE2UTIxNSAzMTYgMjQxIDMzNlQyNjggMzg4UTI2OCA0MjAgMjQzIDQzOFQxNzYgNDU3SDE0NFExMjIgNDU3IDEyMiA0NzRWNDc3UTEyMiA0OTMgMTQ0IDQ5M0gxODFRMjE2IDQ5MyAyMzcgNTA5VDI1OCA1NTNRMjU4IDU4MiAyMzUgNTk5VDE3MyA2MTZRMTM3IDYxNiAxMTMgNTk5VDgwIDU1OVE4MCA1NTkgNzYgNTU5VDY2IDU2MlQ1NyA1NzBUNTMgNTgzUTUzIDU5NCA2MiA2MDZUODggNjI5UTEwNCA2NDAgMTI2IDY0N1QxNzQgNjU0UTIzNSA2NTQgMjY3IDYyOFQzMDAgNTU3UTMwMCA1MjUgMjgzIDUwNlQyMzYgNDc4UTI3MSA0NjggMjkwIDQ0NVQzMTAgMzg2Wk02ODAgNjE2UTY4MCA2MDggNjc2IDU5OVQ2NjEgNTc2UTY1NiA1NjkgNjMyIDU0MFQ1NzUgNDcwVDUwNSAzODRUNDM4IDMwMlE0MTggMjc3IDM5MSAyNDNUMzM0IDE3M1QyNzcgMTAwVDIyNiAzNlQxODkgLTlUMTc1IC0yN1ExNzMgLTI5IDE2MyAtMjZUMTUzIC0xMVExNTMgMCAxNTYgN1QxNzEgMjlRMTc2IDM2IDIwMCA2NVQyNTggMTM1VDMyOCAyMjBUMzk1IDMwMlE0MTAgMzIxIDQyOSAzNDVUNDcwIDM5NVQ1MTMgNDUwVDU1NyA1MDRRNjA2IDU2NiA2NTggNjMyUTY1OCA2MzIgNjYxIDYzMlQ2NjkgNjMxVDY3NiA2MjZUNjgwIDYxNlpNNTM0IDEzOUg2ODJMNjgxIDMyOUw1MzQgMTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkY7IiBnbHlwaC1uYW1lPSJxdWVzdGlvbmRvd24iIGhvcml6LWFkdi14PSI0ODgiIGQ9Ik0yNjEgNTc3UTI0NCA1NzcgMjM4IDU4M1QyMzEgNjA2VjYyMVEyMzEgNjM3IDIzNyA2NDNUMjYxIDY1MEgyNzVRMzA0IDY1MCAzMDQgNjIxVjYwNlEzMDQgNTkwIDI5OCA1ODRUMjc1IDU3N0gyNjFaTTIzNSAtMTBRMTkwIC0xMCAxNTUgMlQ5NSAzNlQ1OCA4N1Q0NSAxNDhRNDUgMTc4IDUzIDIwMFQ3NiAyMzlUMTA4IDI3MFQxNDQgMjk2UTE2NCAzMDkgMTgzIDMyM1QyMTcgMzU2VDI0MSA0MDBUMjUwIDQ2MVEyNTAgNDY5IDI1NiA0NzJUMjcxIDQ3NVEyOTIgNDc1IDI5MiA0NThRMjkxIDQxNiAyODEgMzg2VDI1NCAzMzRUMjE4IDI5N1QxNzkgMjY4UTE2MiAyNTcgMTQ3IDI0NlQxMjEgMjIyVDEwMiAxOTFUOTUgMTUyUTk1IDEwMSAxMzEgNjhUMjM3IDM0UTI3NyAzNCAzMDYgNDZUMzU1IDc4VDM4NiAxMjNUNDAxIDE3NVE0MDIgMTc2IDQwNyAxNzZUNDE5IDE3MlQ0MzEgMTYzVDQzNyAxNDZRNDM3IDEzMiA0MjcgMTA0VDM5MCA0OVEzNjQgMjMgMzI3IDdUMjM1IC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMwOyIgZ2x5cGgtbmFtZT0iQWdyYXZlIiBob3Jpei1hZHYteD0iNjI3IiBkPSJNMjc2IDYzM1EyODAgNjQyIDI4OCA2NDdUMzEzIDY1MlEzMzEgNjUyIDMzOSA2NDdUMzUxIDYzM0w2MDEgMEg1NDVMNDU3IDIyNEgxNjhMNzkgMEgyNkwyNzYgNjMzWk00NDEgMjY4TDMxMyA1OTVMMTg0IDI2OEg0NDFaTTM1MyA3MThRMzUxIDcxNiAzMzkgNzE5VDMwOCA3MzBUMjYzIDc1MlQyMTEgNzg2UTE4OCA4MDMgMTgxIDgxMlQxNzMgODMyUTE3MyA4NDEgMTc5IDg0NlQxOTQgODUyUTIwMiA4NTIgMjEyIDg0OFQyMzkgODMwUTI2NSA4MTAgMjg2IDc5MVQzMjMgNzU2VDM0NiA3MzBUMzUzIDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMxOyIgZ2x5cGgtbmFtZT0iQWFjdXRlIiBob3Jpei1hZHYteD0iNjI3IiBkPSJNMjc2IDYzM1EyODAgNjQyIDI4OCA2NDdUMzEzIDY1MlEzMzEgNjUyIDMzOSA2NDdUMzUxIDYzM0w2MDEgMEg1NDVMNDU3IDIyNEgxNjhMNzkgMEgyNkwyNzYgNjMzWk00NDEgMjY4TDMxMyA1OTVMMTg0IDI2OEg0NDFaTTI2MyA3MjFRMjYyIDcyMiAyNzAgNzMyVDI5MyA3NTlUMzI5IDc5NFQzNzcgODMzUTM5NCA4NDYgNDA0IDg1MFQ0MjIgODU1UTQzMSA4NTUgNDM3IDg1MFQ0NDQgODM1UTQ0NCA4MjUgNDM2IDgxNlQ0MDYgNzg5UTM3OSA3NjkgMzU0IDc1NlQzMDkgNzM0VDI3NyA3MjJUMjYzIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgZ2x5cGgtbmFtZT0iQWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MjciIGQ9Ik0yNzYgNjMzUTI4MCA2NDIgMjg4IDY0N1QzMTMgNjUyUTMzMSA2NTIgMzM5IDY0N1QzNTEgNjMzTDYwMSAwSDU0NUw0NTcgMjI0SDE2OEw3OSAwSDI2TDI3NiA2MzNaTTQ0MSAyNjhMMzEzIDU5NUwxODQgMjY4SDQ0MVpNMjA5IDcxMlExOTMgNzEyIDE5MyA3MjlRMTkzIDc0MCAyMDYgNzU4VDI0NCA4MDVRMjczIDgzNyAyOTIgODUzVDMxMyA4NzBRMzE1IDg3MCAzMzQgODU0VDM4MCA4MDdRNDA1IDc3OCA0MTggNzYwVDQzMiA3MjlRNDMyIDcxMiA0MTcgNzEyUTQwNyA3MTIgMzk0IDcyNFQzNTIgNzc0TDMxMiA4MjdMMjcyIDc3M1EyNDcgNzM5IDIzMyA3MjZUMjA5IDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMzOyIgZ2x5cGgtbmFtZT0iQXRpbGRlIiBob3Jpei1hZHYteD0iNjI3IiBkPSJNMjc2IDYzM1EyODAgNjQyIDI4OCA2NDdUMzEzIDY1MlEzMzEgNjUyIDMzOSA2NDdUMzUxIDYzM0w2MDEgMEg1NDVMNDU3IDIyNEgxNjhMNzkgMEgyNkwyNzYgNjMzWk00NDEgMjY4TDMxMyA1OTVMMTg0IDI2OEg0NDFaTTM3NyA3MTdRMzUyIDcxNyAzMzQgNzI5VDMwMCA3NThRMjg1IDc3MyAyNzUgNzgwVDI1NCA3ODdRMjM5IDc4NyAyMzIgNzc2VDIyMCA3NDVRMjE3IDczNCAyMTMgNzI4VDE5OSA3MjJRMTkxIDcyMiAxODEgNzI5UTE4NCA3NzQgMjAyIDgwMVQyNTUgODI4UTI4MSA4MjggMjk5IDgxNlQzMzIgNzg2UTM0NyA3NzEgMzU3IDc2NFQzNzkgNzU3UTM5MyA3NTcgNDAwIDc2OFQ0MTMgNzk5UTQxNiA4MTAgNDIwIDgxNlQ0MzQgODIyUTQ0MiA4MjIgNDUxIDgxNVE0NDkgNzcwIDQzMSA3NDRUMzc3IDcxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM0OyIgZ2x5cGgtbmFtZT0iQWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjI3IiBkPSJNMjc2IDYzM1EyODAgNjQyIDI4OCA2NDdUMzEzIDY1MlEzMzEgNjUyIDMzOSA2NDdUMzUxIDYzM0w2MDEgMEg1NDVMNDU3IDIyNEgxNjhMNzkgMEgyNkwyNzYgNjMzWk00NDEgMjY4TDMxMyA1OTVMMTg0IDI2OEg0NDFaTTM5MyA3MTZRMzU1IDcxNiAzNTUgNzU0UTM1NSA3OTIgMzkyIDc5MlE0MDkgNzkyIDQxOSA3ODJUNDMwIDc1NFE0MzAgNzM2IDQyMCA3MjZUMzkzIDcxNlpNMjM0IDcxNlEyMTcgNzE2IDIwNyA3MjZUMTk2IDc1NFExOTYgNzcyIDIwNiA3ODJUMjMzIDc5MlEyNzEgNzkyIDI3MSA3NTRRMjcxIDczNiAyNjEgNzI2VDIzNCA3MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNTsiIGdseXBoLW5hbWU9IkFyaW5nIiBob3Jpei1hZHYteD0iNjI3IiBkPSJNMjcyIDYyNFEyNDIgNjM1IDIyNCA2NjFUMjA2IDcyMlEyMDYgNzY5IDIzNiA4MDBUMzE0IDgzMVEzNjIgODMxIDM5MSA4MDBUNDIxIDcyMlE0MjEgNjg3IDQwMyA2NjFUMzU0IDYyNEw1OTcgMTJRNTk4IDkgNTkxIDRUNTc0IC0yVDU1NCAwVDUzOCAyMUw0NTcgMjI0SDE2OEw4NyAyMVE4MSA1IDcxIDFUNTIgLTNUMzYgNFQzMCAxMkwyNzIgNjI0Wk0zMTMgNjQ3UTM0NCA2NDcgMzY0IDY2OFQzODQgNzIyUTM4NCA3NTQgMzY0IDc3NlQzMTMgNzk4UTI4MiA3OTggMjYyIDc3NlQyNDIgNzIyUTI0MiA2OTAgMjYyIDY2OVQzMTMgNjQ3Wk00NDEgMjY4TDMxMyA1OTdMMTg0IDI2OEg0NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNjsiIGdseXBoLW5hbWU9IkFFIiBob3Jpei1hZHYteD0iODc0IiBkPSJNNTc1IDBRNTU2IDAgNTQ4IDdUNTMzIDI4TDQ1OCAyMjRIMTY3TDg3IDIxUTgxIDUgNzEgMVQ1MiAtM1QzNiA0VDMwIDEyTDI3MiA2MjRRMjc3IDYzNCAyODQgNjQwVDMwNSA2NDdIODA2VjYwMkgzNjFRMzY4IDU4MyAzNzYgNTYzUTM4MyA1NDYgMzkyIDUyNFQ0MTAgNDc4UTQzMSA0MjMgNDU5IDM1NUg3MzZWMzA5SDQ3OEw1ODIgNDZIODIwVjBINTc1Wk00NDEgMjY4TDMxMyA1OTVMMTg0IDI2OEg0NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNzsiIGdseXBoLW5hbWU9IkNjZWRpbGxhIiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzgzIC0xMFEzMTEgLTEwIDI1MiAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ2MCA2NTcgNTExIDYzNFQ1OTEgNTgxUTYwOCA1NjQgNjE3IDU0N1Q2MjYgNTIwUTYyNiA1MTEgNjIyIDUwNVQ2MTIgNDk1VDYwMiA0OTBUNTk2IDQ5MFE1NzAgNTQ0IDUxNCA1NzlUMzgzIDYxNFEzMjMgNjE0IDI3NCA1OTNUMTkwIDUzMlQxMzUgNDQwVDExNSAzMjNRMTE1IDI2MCAxMzQgMjA3VDE4OSAxMTZUMjc1IDU1VDM4NSAzM1E0MzAgMzMgNDY2IDQ0VDUyOSA3NVQ1NzUgMTIwVDYwMyAxNzJRNjA0IDE3MyA2MDkgMTcyVDYyMCAxNjhUNjMxIDE1OVQ2MzYgMTQzUTYzNiAxMzIgNjI2IDExMFQ1OTIgNjZRNTYzIDM3IDUxMCAxNFQzODMgLTEwWk0zMDggLTIxM1EzMDYgLTIxNiAzMDEgLTIxNlQyOTEgLTIxNlQyODMgLTIxMVQyODMgLTIwMUwzNDUgLTc0UTM1MCAtNjIgMzU1IC01NVQzNzUgLTQ4SDM3OVEzODkgLTQ4IDM5NiAtNTRUNDA0IC03MFYtNzNRNDA0IC03OSAzOTkgLTg2VDM4NSAtMTA1TDMwOCAtMjEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzg7IiBnbHlwaC1uYW1lPSJFZ3JhdmUiIGhvcml6LWFkdi14PSI1OTQiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0g1MzJWNjAySDE0NFYzNTRINDQ5VjMxMEgxNDRWNDZINTQxVjBIOTRWNjE3Wk0zODIgNzIxUTM4MCA3MTkgMzY4IDcyMlQzMzcgNzMzVDI5MiA3NTVUMjQwIDc4OVEyMTcgODA2IDIxMCA4MTVUMjAyIDgzNVEyMDIgODQ0IDIwOCA4NDlUMjIzIDg1NVEyMzEgODU1IDI0MSA4NTFUMjY4IDgzM1EyOTQgODEzIDMxNSA3OTRUMzUyIDc1OVQzNzUgNzMzVDM4MiA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDOTsiIGdseXBoLW5hbWU9IkVhY3V0ZSIgaG9yaXotYWR2LXg9IjU5NCIgZD0iTTk0IDYxN1E5NCA2MzAgMTAyIDYzOFQxMjMgNjQ3SDUzMlY2MDJIMTQ0VjM1NEg0NDlWMzEwSDE0NFY0Nkg1NDFWMEg5NFY2MTdaTTI0NiA3MjFRMjQ1IDcyMiAyNTMgNzMyVDI3NiA3NTlUMzEyIDc5NFQzNjAgODMzUTM3NyA4NDYgMzg3IDg1MFQ0MDUgODU1UTQxNCA4NTUgNDIwIDg1MFQ0MjcgODM1UTQyNyA4MjUgNDE5IDgxNlQzODkgNzg5UTM2MiA3NjkgMzM3IDc1NlQyOTIgNzM0VDI2MCA3MjJUMjQ2IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgZ2x5cGgtbmFtZT0iRWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1OTQiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0g1MzJWNjAySDE0NFYzNTRINDQ5VjMxMEgxNDRWNDZINTQxVjBIOTRWNjE3Wk0yMTMgNzE5UTE5NyA3MTkgMTk3IDczNlExOTcgNzQ3IDIxMCA3NjVUMjQ4IDgxMlEyNzcgODQ0IDI5NiA4NjBUMzE3IDg3N1EzMTkgODc3IDMzOCA4NjFUMzg0IDgxNFE0MDkgNzg1IDQyMiA3NjdUNDM2IDczNlE0MzYgNzE5IDQyMSA3MTlRNDExIDcxOSAzOTggNzMxVDM1NiA3ODFMMzE2IDgzNEwyNzYgNzgwUTI1MSA3NDYgMjM3IDczM1QyMTMgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0I7IiBnbHlwaC1uYW1lPSJFZGllcmVzaXMiIGhvcml6LWFkdi14PSI1OTQiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0g1MzJWNjAySDE0NFYzNTRINDQ5VjMxMEgxNDRWNDZINTQxVjBIOTRWNjE3Wk0zOTUgNzE5UTM1NyA3MTkgMzU3IDc1N1EzNTcgNzk1IDM5NCA3OTVRNDExIDc5NSA0MjEgNzg1VDQzMiA3NTdRNDMyIDczOSA0MjIgNzI5VDM5NSA3MTlaTTIzNiA3MTlRMjE5IDcxOSAyMDkgNzI5VDE5OCA3NTdRMTk4IDc3NSAyMDggNzg1VDIzNSA3OTVRMjczIDc5NSAyNzMgNzU3UTI3MyA3MzkgMjYzIDcyOVQyMzYgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0M7IiBnbHlwaC1uYW1lPSJJZ3JhdmUiIGhvcml6LWFkdi14PSIyNTciIGQ9Ik0xMDQgNjI3UTEwNCA2NTAgMTI1IDY1MEgxMzJRMTU0IDY1MCAxNTQgNjI3VjBIMTA0VjYyN1pNMTc2IDcxOFExNzQgNzE2IDE2MiA3MTlUMTMxIDczMFQ4NiA3NTJUMzQgNzg2UTExIDgwMyA0IDgxMlQtNCA4MzJRLTQgODQxIDIgODQ2VDE3IDg1MlEyNSA4NTIgMzUgODQ4VDYyIDgzMFE4OCA4MTAgMTA5IDc5MVQxNDYgNzU2VDE2OSA3MzBUMTc2IDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENEOyIgZ2x5cGgtbmFtZT0iSWFjdXRlIiBob3Jpei1hZHYteD0iMjU3IiBkPSJNMTA0IDYyN1ExMDQgNjUwIDEyNSA2NTBIMTMyUTE1NCA2NTAgMTU0IDYyN1YwSDEwNFY2MjdaTTgyIDcxOFE4MSA3MTkgODkgNzI5VDExMiA3NTZUMTQ4IDc5MVQxOTYgODMwUTIxMyA4NDMgMjIzIDg0N1QyNDEgODUyUTI1MCA4NTIgMjU2IDg0N1QyNjMgODMyUTI2MyA4MjIgMjU1IDgxM1QyMjUgNzg2UTE5OCA3NjYgMTczIDc1M1QxMjggNzMxVDk2IDcxOVQ4MiA3MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRTsiIGdseXBoLW5hbWU9IkljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjU3IiBkPSJNMTA0IDYyN1ExMDQgNjUwIDEyNSA2NTBIMTMyUTE1NCA2NTAgMTU0IDYyN1YwSDEwNFY2MjdaTTI1IDcxNlE5IDcxNiA5IDczM1E5IDc0NCAyMiA3NjJUNjAgODA5UTg5IDg0MSAxMDggODU3VDEyOSA4NzRRMTMxIDg3NCAxNTAgODU4VDE5NiA4MTFRMjIxIDc4MiAyMzQgNzY0VDI0OCA3MzNRMjQ4IDcxNiAyMzMgNzE2UTIyMyA3MTYgMjEwIDcyOFQxNjggNzc4TDEyOCA4MzFMODggNzc3UTYzIDc0MyA0OSA3MzBUMjUgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Y7IiBnbHlwaC1uYW1lPSJJZGllcmVzaXMiIGhvcml6LWFkdi14PSIyNTciIGQ9Ik0xMDQgNjI3UTEwNCA2NTAgMTI1IDY1MEgxMzJRMTU0IDY1MCAxNTQgNjI3VjBIMTA0VjYyN1pNMjA5IDcxOVExNzEgNzE5IDE3MSA3NTdRMTcxIDc5NSAyMDggNzk1UTIyNSA3OTUgMjM1IDc4NVQyNDYgNzU3UTI0NiA3MzkgMjM2IDcyOVQyMDkgNzE5Wk01MCA3MTlRMzMgNzE5IDIzIDcyOVQxMiA3NTdRMTIgNzc1IDIyIDc4NVQ0OSA3OTVRODcgNzk1IDg3IDc1N1E4NyA3MzkgNzcgNzI5VDUwIDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQwOyIgZ2x5cGgtbmFtZT0iRXRoIiBob3Jpei1hZHYteD0iNzQxIiBkPSJNMTY2IDBRMTUzIDAgMTQ1IDhUMTM2IDMwVjMwMkg2MFE0NiAzMDIgNDIgMzA3VDM3IDMyMVYzMjZRMzcgMzM1IDQxIDM0MFQ2MCAzNDZIMTM2VjYxN1ExMzYgNjMwIDE0NCA2MzhUMTY2IDY0N0gzMjJRNDA1IDY0NyA0NzEgNjI1VDU4MyA1NjFUNjUzIDQ2MFQ2NzggMzI1UTY3OCAyNTAgNjUzIDE5MFQ1ODEgODdUNDY4IDIzVDMxNyAwSDE2NlpNMzIzIDQ2UTQ2OSA0NiA1NDggMTE5VDYyNyAzMjRRNjI3IDM4OCA2MDcgNDM5VDU0OSA1MjdUNDU0IDU4MlQzMjYgNjAySDE4NlYzNDZINDEzUTQzNiAzNDYgNDM2IDMyNlYzMjFRNDM2IDMwMiA0MTMgMzAySDE4NlY0NkgzMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMTsiIGdseXBoLW5hbWU9Ik50aWxkZSIgaG9yaXotYWR2LXg9IjcwMyIgZD0iTTk0IDYxNlE5NCA2MzAgMTAwIDY0MFQxMjEgNjUwSDEzNFExNDggNjUwIDE1NiA2NDNUMTczIDYyM0w1NjMgNzdWNjQ3SDYxMFYzMFE2MTAgMTYgNjAzIDdUNTg0IC0zSDU4MFE1NjYgLTMgNTYwIDJUNTQ2IDE4TDE0MSA1ODVWMEg5NFY2MTZaTTQxNiA3MTNRMzkxIDcxMyAzNzMgNzI1VDMzOSA3NTRRMzI0IDc2OSAzMTQgNzc2VDI5MyA3ODNRMjc4IDc4MyAyNzEgNzcyVDI1OSA3NDFRMjU2IDczMCAyNTIgNzI0VDIzOCA3MThRMjMwIDcxOCAyMjAgNzI1UTIyMyA3NzAgMjQxIDc5N1QyOTQgODI0UTMyMCA4MjQgMzM4IDgxMlQzNzEgNzgyUTM4NiA3NjcgMzk2IDc2MFQ0MTggNzUzUTQzMiA3NTMgNDM5IDc2NFQ0NTIgNzk1UTQ1NSA4MDYgNDU5IDgxMlQ0NzMgODE4UTQ4MSA4MTggNDkwIDgxMVE0ODggNzY2IDQ3MCA3NDBUNDE2IDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQyOyIgZ2x5cGgtbmFtZT0iT2dyYXZlIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzgyIC0xMFEzMTEgLTEwIDI1MyAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ1NSA2NTcgNTEzIDYzMlQ2MTMgNTYzVDY3OCA0NThUNzAxIDMyNFE3MDEgMjUxIDY3OCAxOTBUNjEzIDg1VDUxMiAxNVQzODIgLTEwWk0zODMgMzNRNDQzIDMzIDQ5MiA1NVQ1NzYgMTE1VDYzMCAyMDdUNjUwIDMyM1E2NTAgMzg1IDYzMSA0MzhUNTc2IDUzMVQ0OTEgNTkyVDM4MiA2MTRRMzIyIDYxNCAyNzMgNTkyVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjAgMTM0IDIwN1QxODkgMTE2VDI3NCA1NVQzODMgMzNaTTQyNCA3MjFRNDIyIDcxOSA0MTAgNzIyVDM3OSA3MzNUMzM0IDc1NVQyODIgNzg5UTI1OSA4MDYgMjUyIDgxNVQyNDQgODM1UTI0NCA4NDQgMjUwIDg0OVQyNjUgODU1UTI3MyA4NTUgMjgzIDg1MVQzMTAgODMzUTMzNiA4MTMgMzU3IDc5NFQzOTQgNzU5VDQxNyA3MzNUNDI0IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQzOyIgZ2x5cGgtbmFtZT0iT2FjdXRlIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzgyIC0xMFEzMTEgLTEwIDI1MyAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ1NSA2NTcgNTEzIDYzMlQ2MTMgNTYzVDY3OCA0NThUNzAxIDMyNFE3MDEgMjUxIDY3OCAxOTBUNjEzIDg1VDUxMiAxNVQzODIgLTEwWk0zODMgMzNRNDQzIDMzIDQ5MiA1NVQ1NzYgMTE1VDYzMCAyMDdUNjUwIDMyM1E2NTAgMzg1IDYzMSA0MzhUNTc2IDUzMVQ0OTEgNTkyVDM4MiA2MTRRMzIyIDYxNCAyNzMgNTkyVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjAgMTM0IDIwN1QxODkgMTE2VDI3NCA1NVQzODMgMzNaTTMzNSA3MjFRMzM0IDcyMiAzNDIgNzMyVDM2NSA3NTlUNDAxIDc5NFQ0NDkgODMzUTQ2NiA4NDYgNDc2IDg1MFQ0OTQgODU1UTUwMyA4NTUgNTA5IDg1MFQ1MTYgODM1UTUxNiA4MjUgNTA4IDgxNlQ0NzggNzg5UTQ1MSA3NjkgNDI2IDc1NlQzODEgNzM0VDM0OSA3MjJUMzM1IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgZ2x5cGgtbmFtZT0iT2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zODIgLTEwUTMxMSAtMTAgMjUzIDE0VDE1MiA4M1Q4NyAxODhUNjQgMzIyUTY0IDM5NSA4NyA0NTZUMTUzIDU2MlQyNTQgNjMyVDM4NCA2NTdRNDU1IDY1NyA1MTMgNjMyVDYxMyA1NjNUNjc4IDQ1OFQ3MDEgMzI0UTcwMSAyNTEgNjc4IDE5MFQ2MTMgODVUNTEyIDE1VDM4MiAtMTBaTTM4MyAzM1E0NDMgMzMgNDkyIDU1VDU3NiAxMTVUNjMwIDIwN1Q2NTAgMzIzUTY1MCAzODUgNjMxIDQzOFQ1NzYgNTMxVDQ5MSA1OTJUMzgyIDYxNFEzMjIgNjE0IDI3MyA1OTJUMTg5IDUzMlQxMzUgNDQwVDExNSAzMjNRMTE1IDI2MCAxMzQgMjA3VDE4OSAxMTZUMjc0IDU1VDM4MyAzM1pNMjc2IDcxOVEyNjAgNzE5IDI2MCA3MzZRMjYwIDc0NyAyNzMgNzY1VDMxMSA4MTJRMzQwIDg0NCAzNTkgODYwVDM4MCA4NzdRMzgyIDg3NyA0MDEgODYxVDQ0NyA4MTRRNDcyIDc4NSA0ODUgNzY3VDQ5OSA3MzZRNDk5IDcxOSA0ODQgNzE5UTQ3NCA3MTkgNDYxIDczMVQ0MTkgNzgxTDM3OSA4MzRMMzM5IDc4MFEzMTQgNzQ2IDMwMCA3MzNUMjc2IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ1OyIgZ2x5cGgtbmFtZT0iT3RpbGRlIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzgyIC0xMFEzMTEgLTEwIDI1MyAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ1NSA2NTcgNTEzIDYzMlQ2MTMgNTYzVDY3OCA0NThUNzAxIDMyNFE3MDEgMjUxIDY3OCAxOTBUNjEzIDg1VDUxMiAxNVQzODIgLTEwWk0zODMgMzNRNDQzIDMzIDQ5MiA1NVQ1NzYgMTE1VDYzMCAyMDdUNjUwIDMyM1E2NTAgMzg1IDYzMSA0MzhUNTc2IDUzMVQ0OTEgNTkyVDM4MiA2MTRRMzIyIDYxNCAyNzMgNTkyVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjAgMTM0IDIwN1QxODkgMTE2VDI3NCA1NVQzODMgMzNaTTQ0MCA3MThRNDE1IDcxOCAzOTcgNzMwVDM2MyA3NTlRMzQ4IDc3NCAzMzggNzgxVDMxNyA3ODhRMzAyIDc4OCAyOTUgNzc3VDI4MyA3NDZRMjgwIDczNSAyNzYgNzI5VDI2MiA3MjNRMjU0IDcyMyAyNDQgNzMwUTI0NyA3NzUgMjY1IDgwMlQzMTggODI5UTM0NCA4MjkgMzYyIDgxN1QzOTUgNzg3UTQxMCA3NzIgNDIwIDc2NVQ0NDIgNzU4UTQ1NiA3NTggNDYzIDc2OVQ0NzYgODAwUTQ3OSA4MTEgNDgzIDgxN1Q0OTcgODIzUTUwNSA4MjMgNTE0IDgxNlE1MTIgNzcxIDQ5NCA3NDVUNDQwIDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ2OyIgZ2x5cGgtbmFtZT0iT2RpZXJlc2lzIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzgyIC0xMFEzMTEgLTEwIDI1MyAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ1NSA2NTcgNTEzIDYzMlQ2MTMgNTYzVDY3OCA0NThUNzAxIDMyNFE3MDEgMjUxIDY3OCAxOTBUNjEzIDg1VDUxMiAxNVQzODIgLTEwWk0zODMgMzNRNDQzIDMzIDQ5MiA1NVQ1NzYgMTE1VDYzMCAyMDdUNjUwIDMyM1E2NTAgMzg1IDYzMSA0MzhUNTc2IDUzMVQ0OTEgNTkyVDM4MiA2MTRRMzIyIDYxNCAyNzMgNTkyVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjAgMTM0IDIwN1QxODkgMTE2VDI3NCA1NVQzODMgMzNaTTQ2MCA3MTlRNDIyIDcxOSA0MjIgNzU3UTQyMiA3OTUgNDU5IDc5NVE0NzYgNzk1IDQ4NiA3ODVUNDk3IDc1N1E0OTcgNzM5IDQ4NyA3MjlUNDYwIDcxOVpNMzAxIDcxOVEyODQgNzE5IDI3NCA3MjlUMjYzIDc1N1EyNjMgNzc1IDI3MyA3ODVUMzAwIDc5NVEzMzggNzk1IDMzOCA3NTdRMzM4IDczOSAzMjggNzI5VDMwMSA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENzsiIGdseXBoLW5hbWU9Im11bHRpcGx5IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNMTEwIDk0UTEwNCAxMDAgMTAzIDEwOFQxMTEgMTI2TDI0NyAyNjVMMTExIDQwM1ExMDIgNDEyIDEwMyA0MjBUMTEwIDQzNEwxMTMgNDM3UTExOSA0NDMgMTI2IDQ0NFQxNDUgNDM0TDI3NyAyOTVMNDA5IDQzNFE0MjAgNDQ1IDQyNyA0NDRUNDQxIDQzN0w0NDQgNDM0UTQ1MCA0MjggNDUwIDQyMFQ0NDIgNDAzTDMwNyAyNjVMNDQyIDEyNlE0NTggMTA4IDQ0NCA5NEw0NDEgOTFRNDM1IDg1IDQyOCA4NFQ0MDkgOTRMMjc3IDIzNEwxNDUgOTRRMTM0IDgzIDEyNyA4NFQxMTMgOTFMMTEwIDk0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDg7IiBnbHlwaC1uYW1lPSJPc2xhc2giIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik04NiAtMzlRODUgLTQwIDgxIC0zOVQ3MyAtMzRUNjUgLTI1VDYxIC0xM1E2MSAtNiA2NSAzVDgwIDI0TDE0MiA5NVExMDQgMTQwIDg0IDE5N1Q2NCAzMjJRNjQgMzkyIDg3IDQ1M1QxNTEgNTYwVDI1MSA2MzFUMzgxIDY1N1E0NDEgNjU3IDQ5MSA2MzlUNTgwIDU4OUw2NTkgNjgwUTY2MCA2ODEgNjY0IDY4MFQ2NzIgNjc1VDY4MCA2NjZUNjg0IDY1NFE2ODQgNjQ2IDY4MCA2MzhUNjY1IDYxN0w2MTMgNTU3UTY1NCA1MTIgNjc1IDQ1M1Q2OTcgMzI0UTY5NyAyNTQgNjc0IDE5M1Q2MTAgODdUNTEwIDE2VDM3OSAtMTBRMzE4IC0xMCAyNjcgOFQxNzUgNjFRMTY4IDUzIDE2MSA0NVExNTQgMzggMTQ2IDI5VDEzMCAxMUw4NiAtMzlaTTU0NyA1NTRRNTE1IDU4MSA0NzMgNTk2VDM4MCA2MTJRMzE5IDYxMiAyNzAgNTkwVDE4NyA1MjlUMTMzIDQzN1QxMTQgMzIzUTExNCAyMDggMTc3IDEzMEw1NDcgNTU0Wk0zODEgMzVRNDQyIDM1IDQ5MSA1N1Q1NzQgMTE4VDYyOCAyMDlUNjQ3IDMyM1E2NDcgMzgyIDYzMCA0MzNUNTc4IDUyMlE0NzUgNDAzIDM5MyAzMTBMMjA3IDk4UTI0MSA2OCAyODUgNTJUMzgxIDM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDk7IiBnbHlwaC1uYW1lPSJVZ3JhdmUiIGhvcml6LWFkdi14PSI2NjEiIGQ9Ik0zMjkgLTEwUTIwOCAtMTAgMTQ2IDU2VDg0IDI1MlY2MjdRODQgNjUwIDEwNSA2NTBIMTEyUTEzNCA2NTAgMTM0IDYyN1YyNTZRMTM0IDM1IDMzMSAzNVE1MjggMzUgNTI4IDI1NlY2MjdRNTI4IDY1MCA1NDkgNjUwSDU1OFE1NzcgNjUwIDU3NyA2MjdWMjU0UTU3NyAxMjQgNTE0IDU3VDMyOSAtMTBaTTM4MyA3MTBRMzgxIDcwOCAzNjkgNzExVDMzOCA3MjJUMjkzIDc0NFQyNDEgNzc4UTIxOCA3OTUgMjExIDgwNFQyMDMgODI0UTIwMyA4MzMgMjA5IDgzOFQyMjQgODQ0UTIzMiA4NDQgMjQyIDg0MFQyNjkgODIyUTI5NSA4MDIgMzE2IDc4M1QzNTMgNzQ4VDM3NiA3MjJUMzgzIDcxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERBOyIgZ2x5cGgtbmFtZT0iVWFjdXRlIiBob3Jpei1hZHYteD0iNjYxIiBkPSJNMzI5IC0xMFEyMDggLTEwIDE0NiA1NlQ4NCAyNTJWNjI3UTg0IDY1MCAxMDUgNjUwSDExMlExMzQgNjUwIDEzNCA2MjdWMjU2UTEzNCAzNSAzMzEgMzVRNTI4IDM1IDUyOCAyNTZWNjI3UTUyOCA2NTAgNTQ5IDY1MEg1NThRNTc3IDY1MCA1NzcgNjI3VjI1NFE1NzcgMTI0IDUxNCA1N1QzMjkgLTEwWk0yNzkgNzEwUTI3OCA3MTEgMjg2IDcyMVQzMDkgNzQ4VDM0NSA3ODNUMzkzIDgyMlE0MTAgODM1IDQyMCA4MzlUNDM4IDg0NFE0NDcgODQ0IDQ1MyA4MzlUNDYwIDgyNFE0NjAgODE0IDQ1MiA4MDVUNDIyIDc3OFEzOTUgNzU4IDM3MCA3NDVUMzI1IDcyM1QyOTMgNzExVDI3OSA3MTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQjsiIGdseXBoLW5hbWU9IlVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjYxIiBkPSJNMzI5IC0xMFEyMDggLTEwIDE0NiA1NlQ4NCAyNTJWNjI3UTg0IDY1MCAxMDUgNjUwSDExMlExMzQgNjUwIDEzNCA2MjdWMjU2UTEzNCAzNSAzMzEgMzVRNTI4IDM1IDUyOCAyNTZWNjI3UTUyOCA2NTAgNTQ5IDY1MEg1NThRNTc3IDY1MCA1NzcgNjI3VjI1NFE1NzcgMTI0IDUxNCA1N1QzMjkgLTEwWk0yMjQgNzE1UTIwOCA3MTUgMjA4IDczMlEyMDggNzQzIDIyMSA3NjFUMjU5IDgwOFEyODggODQwIDMwNyA4NTZUMzI4IDg3M1EzMzAgODczIDM0OSA4NTdUMzk1IDgxMFE0MjAgNzgxIDQzMyA3NjNUNDQ3IDczMlE0NDcgNzE1IDQzMiA3MTVRNDIyIDcxNSA0MDkgNzI3VDM2NyA3NzdMMzI3IDgzMEwyODcgNzc2UTI2MiA3NDIgMjQ4IDcyOVQyMjQgNzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REM7IiBnbHlwaC1uYW1lPSJVZGllcmVzaXMiIGhvcml6LWFkdi14PSI2NjEiIGQ9Ik0zMjkgLTEwUTIwOCAtMTAgMTQ2IDU2VDg0IDI1MlY2MjdRODQgNjUwIDEwNSA2NTBIMTEyUTEzNCA2NTAgMTM0IDYyN1YyNTZRMTM0IDM1IDMzMSAzNVE1MjggMzUgNTI4IDI1NlY2MjdRNTI4IDY1MCA1NDkgNjUwSDU1OFE1NzcgNjUwIDU3NyA2MjdWMjU0UTU3NyAxMjQgNTE0IDU3VDMyOSAtMTBaTTQwOCA3MTZRMzcwIDcxNiAzNzAgNzU0UTM3MCA3OTIgNDA3IDc5MlE0MjQgNzkyIDQzNCA3ODJUNDQ1IDc1NFE0NDUgNzM2IDQzNSA3MjZUNDA4IDcxNlpNMjQ5IDcxNlEyMzIgNzE2IDIyMiA3MjZUMjExIDc1NFEyMTEgNzcyIDIyMSA3ODJUMjQ4IDc5MlEyODYgNzkyIDI4NiA3NTRRMjg2IDczNiAyNzYgNzI2VDI0OSA3MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERDsiIGdseXBoLW5hbWU9IllhY3V0ZSIgaG9yaXotYWR2LXg9IjU2OCIgZD0iTTI1OSAyNzdMMjQgNjQ3SDc5TDI4NCAzMjJMNDg5IDYzMlE0OTggNjQ2IDUwOCA2NDhUNTI2IDY0OFQ1MzkgNjM5VDU0NCA2MjlMMzA5IDI3N1YwSDI1OVYyNzdaTTIyNyA3MDhRMjI2IDcwOSAyMzQgNzE5VDI1NyA3NDZUMjkzIDc4MVQzNDEgODIwUTM1OCA4MzMgMzY4IDgzN1QzODYgODQyUTM5NSA4NDIgNDAxIDgzN1Q0MDggODIyUTQwOCA4MTIgNDAwIDgwM1QzNzAgNzc2UTM0MyA3NTYgMzE4IDc0M1QyNzMgNzIxVDI0MSA3MDlUMjI3IDcwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgZ2x5cGgtbmFtZT0iVGhvcm4iIGhvcml6LWFkdi14PSI1ODIiIGQ9Ik0xMTUgLTNROTQgLTMgOTQgMjBWNjI3UTk0IDY1MCAxMTUgNjUwSDEyMlExNDQgNjUwIDE0NCA2MjdWNTIxSDI5MFE0MDUgNTIxIDQ2NiA0NzBUNTI3IDMyOFE1MjcgMjM0IDQ2NyAxODRUMjg1IDEzM0gxNDRWMjBRMTQ0IC0zIDEyMiAtM0gxMTVaTTI4OSAxNzdRMzgzIDE3NyA0MjkgMjE1VDQ3NSAzMjZRNDc1IDM5OCA0MjkgNDM3VDI5MCA0NzZIMTQ0VjE3N0gyODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERjsiIGdseXBoLW5hbWU9Imdlcm1hbmRibHMiIGhvcml6LWFkdi14PSI1NDQiIGQ9Ik0zMTkgLTEwUTI3NSAtMTAgMjQ2IDFUMjAwIDI4UTE5MCAzOCAxODYgNDdUMTgxIDYyUTE4MSA3NiAxOTAgODRUMjAxIDkwUTIxNyA2NyAyNDQgNTBUMzIwIDMyUTM0NyAzMiAzNzAgNDJUNDEwIDcwVDQzNiAxMTNUNDQ2IDE2N1E0NDYgMTk2IDQzOCAyMjJUNDA5IDI2OVQzNTYgMzA4VDI3NSAzMzZRMjUxIDM0MiAyNDIgMzUxVDIzMyAzNzZRMjMzIDM4NyAyMzggMzk1VDI0NiA0MDZRMzI3IDQwOCAzNjggNDM1VDQxMCA1MjRRNDEwIDU3NiAzNzUgNjA5VDI3NyA2NDJRMjA4IDY0MiAxNzAgNTk5VDEzMiA0NjJWMEg4NFY0NjJRODQgNTc0IDEzNiA2MjlUMjc4IDY4NVEzMTggNjg1IDM1MSA2NzNUNDA4IDY0MFQ0NDQgNTkwVDQ1NyA1MjdRNDU3IDQ2MCA0MTcgNDIxVDI4OSAzNzVRMzQ2IDM2MiAzODUgMzQyVDQ0OCAyOTVUNDgzIDIzN1Q0OTQgMTY3UTQ5NCAxMjkgNDgxIDk3VDQ0NCA0MVQzODggNFQzMTkgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTA7IiBnbHlwaC1uYW1lPSJhZ3JhdmUiIGhvcml6LWFkdi14PSI1MzEiIGQ9Ik0yMTYgLTEwUTE0MCAtMTAgOTYgMjVUNTIgMTIwUTUyIDIwMCAxMzMgMjM2VDM5NCAyNzVINDA0VjI5OVE0MDQgMzY2IDM2NiA0MDJUMjU5IDQzOVExOTcgNDM5IDE1OCA0MTNUOTggMzQ5UTk4IDM0OSA5NCAzNTBUODQgMzU0VDc1IDM2MlQ3MSAzNzdRNzEgMzg1IDc4IDM5OFQ5OCA0MjNRMTIxIDQ0NiAxNjEgNDY0VDI2MiA0ODNRMzUxIDQ4MyA0MDEgNDM1VDQ1MSAzMDBWMEg0MDRWOTRRMzgxIDQ4IDMzMiAxOVQyMTYgLTEwWk0yMjAgMzBRMjU5IDMwIDI5MiA0MlQzNTAgNzZUMzg5IDEyN1Q0MDQgMTkwVjIzN0gzOTFRMzE0IDIzNSAyNTkgMjI4VDE2OSAyMDdUMTE4IDE3MlQxMDEgMTIwUTEwMSA3OCAxMzMgNTRUMjIwIDMwWk0zMzEgNTQ3UTMyOSA1NDUgMzE3IDU0OFQyODYgNTU5VDI0MSA1ODFUMTg5IDYxNVExNjYgNjMyIDE1OSA2NDFUMTUxIDY2MVExNTEgNjcwIDE1NyA2NzVUMTcyIDY4MVExODAgNjgxIDE5MCA2NzdUMjE3IDY1OVEyNDMgNjM5IDI2NCA2MjBUMzAxIDU4NVQzMjQgNTU5VDMzMSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMTsiIGdseXBoLW5hbWU9ImFhY3V0ZSIgaG9yaXotYWR2LXg9IjUzMSIgZD0iTTIxNiAtMTBRMTQwIC0xMCA5NiAyNVQ1MiAxMjBRNTIgMjAwIDEzMyAyMzZUMzk0IDI3NUg0MDRWMjk5UTQwNCAzNjYgMzY2IDQwMlQyNTkgNDM5UTE5NyA0MzkgMTU4IDQxM1Q5OCAzNDlROTggMzQ5IDk0IDM1MFQ4NCAzNTRUNzUgMzYyVDcxIDM3N1E3MSAzODUgNzggMzk4VDk4IDQyM1ExMjEgNDQ2IDE2MSA0NjRUMjYyIDQ4M1EzNTEgNDgzIDQwMSA0MzVUNDUxIDMwMFYwSDQwNFY5NFEzODEgNDggMzMyIDE5VDIxNiAtMTBaTTIyMCAzMFEyNTkgMzAgMjkyIDQyVDM1MCA3NlQzODkgMTI3VDQwNCAxOTBWMjM3SDM5MVEzMTQgMjM1IDI1OSAyMjhUMTY5IDIwN1QxMTggMTcyVDEwMSAxMjBRMTAxIDc4IDEzMyA1NFQyMjAgMzBaTTE5NiA1NDdRMTk1IDU0OCAyMDMgNTU4VDIyNiA1ODVUMjYyIDYyMFQzMTAgNjU5UTMyNyA2NzIgMzM3IDY3NlQzNTUgNjgxUTM2NCA2ODEgMzcwIDY3NlQzNzcgNjYxUTM3NyA2NTEgMzY5IDY0MlQzMzkgNjE1UTMxMiA1OTUgMjg3IDU4MlQyNDIgNTYwVDIxMCA1NDhUMTk2IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgZ2x5cGgtbmFtZT0iYWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MzEiIGQ9Ik0yMTYgLTEwUTE0MCAtMTAgOTYgMjVUNTIgMTIwUTUyIDIwMCAxMzMgMjM2VDM5NCAyNzVINDA0VjI5OVE0MDQgMzY2IDM2NiA0MDJUMjU5IDQzOVExOTcgNDM5IDE1OCA0MTNUOTggMzQ5UTk4IDM0OSA5NCAzNTBUODQgMzU0VDc1IDM2MlQ3MSAzNzdRNzEgMzg1IDc4IDM5OFQ5OCA0MjNRMTIxIDQ0NiAxNjEgNDY0VDI2MiA0ODNRMzUxIDQ4MyA0MDEgNDM1VDQ1MSAzMDBWMEg0MDRWOTRRMzgxIDQ4IDMzMiAxOVQyMTYgLTEwWk0yMjAgMzBRMjU5IDMwIDI5MiA0MlQzNTAgNzZUMzg5IDEyN1Q0MDQgMTkwVjIzN0gzOTFRMzE0IDIzNSAyNTkgMjI4VDE2OSAyMDdUMTE4IDE3MlQxMDEgMTIwUTEwMSA3OCAxMzMgNTRUMjIwIDMwWk0xNTkgNTQ1UTE0MyA1NDUgMTQzIDU2MlExNDMgNTczIDE1NiA1OTFUMTk0IDYzOFEyMjMgNjcwIDI0MiA2ODZUMjYzIDcwM1EyNjUgNzAzIDI4NCA2ODdUMzMwIDY0MFEzNTUgNjExIDM2OCA1OTNUMzgyIDU2MlEzODIgNTQ1IDM2NyA1NDVRMzU3IDU0NSAzNDQgNTU3VDMwMiA2MDdMMjYyIDY2MEwyMjIgNjA2UTE5NyA1NzIgMTgzIDU1OVQxNTkgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTM7IiBnbHlwaC1uYW1lPSJhdGlsZGUiIGhvcml6LWFkdi14PSI1MzEiIGQ9Ik0yMTYgLTEwUTE0MCAtMTAgOTYgMjVUNTIgMTIwUTUyIDIwMCAxMzMgMjM2VDM5NCAyNzVINDA0VjI5OVE0MDQgMzY2IDM2NiA0MDJUMjU5IDQzOVExOTcgNDM5IDE1OCA0MTNUOTggMzQ5UTk4IDM0OSA5NCAzNTBUODQgMzU0VDc1IDM2MlQ3MSAzNzdRNzEgMzg1IDc4IDM5OFQ5OCA0MjNRMTIxIDQ0NiAxNjEgNDY0VDI2MiA0ODNRMzUxIDQ4MyA0MDEgNDM1VDQ1MSAzMDBWMEg0MDRWOTRRMzgxIDQ4IDMzMiAxOVQyMTYgLTEwWk0yMjAgMzBRMjU5IDMwIDI5MiA0MlQzNTAgNzZUMzg5IDEyN1Q0MDQgMTkwVjIzN0gzOTFRMzE0IDIzNSAyNTkgMjI4VDE2OSAyMDdUMTE4IDE3MlQxMDEgMTIwUTEwMSA3OCAxMzMgNTRUMjIwIDMwWk0zMjMgNTQ0UTI5OCA1NDQgMjgwIDU1NlQyNDYgNTg1UTIzMSA2MDAgMjIxIDYwN1QyMDAgNjE0UTE4NSA2MTQgMTc4IDYwM1QxNjYgNTcyUTE2MyA1NjEgMTU5IDU1NVQxNDUgNTQ5UTEzNyA1NDkgMTI3IDU1NlExMzAgNjAxIDE0OCA2MjhUMjAxIDY1NVEyMjcgNjU1IDI0NSA2NDNUMjc4IDYxM1EyOTMgNTk4IDMwMyA1OTFUMzI1IDU4NFEzMzkgNTg0IDM0NiA1OTVUMzU5IDYyNlEzNjIgNjM3IDM2NiA2NDNUMzgwIDY0OVEzODggNjQ5IDM5NyA2NDJRMzk1IDU5NyAzNzcgNTcxVDMyMyA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNDsiIGdseXBoLW5hbWU9ImFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjUzMSIgZD0iTTIxNiAtMTBRMTQwIC0xMCA5NiAyNVQ1MiAxMjBRNTIgMjAwIDEzMyAyMzZUMzk0IDI3NUg0MDRWMjk5UTQwNCAzNjYgMzY2IDQwMlQyNTkgNDM5UTE5NyA0MzkgMTU4IDQxM1Q5OCAzNDlROTggMzQ5IDk0IDM1MFQ4NCAzNTRUNzUgMzYyVDcxIDM3N1E3MSAzODUgNzggMzk4VDk4IDQyM1ExMjEgNDQ2IDE2MSA0NjRUMjYyIDQ4M1EzNTEgNDgzIDQwMSA0MzVUNDUxIDMwMFYwSDQwNFY5NFEzODEgNDggMzMyIDE5VDIxNiAtMTBaTTIyMCAzMFEyNTkgMzAgMjkyIDQyVDM1MCA3NlQzODkgMTI3VDQwNCAxOTBWMjM3SDM5MVEzMTQgMjM1IDI1OSAyMjhUMTY5IDIwN1QxMTggMTcyVDEwMSAxMjBRMTAxIDc4IDEzMyA1NFQyMjAgMzBaTTM0NCA1NDVRMzA2IDU0NSAzMDYgNTgzUTMwNiA2MjEgMzQzIDYyMVEzNjAgNjIxIDM3MCA2MTFUMzgxIDU4M1EzODEgNTY1IDM3MSA1NTVUMzQ0IDU0NVpNMTg1IDU0NVExNjggNTQ1IDE1OCA1NTVUMTQ3IDU4M1ExNDcgNjAxIDE1NyA2MTFUMTg0IDYyMVEyMjIgNjIxIDIyMiA1ODNRMjIyIDU2NSAyMTIgNTU1VDE4NSA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNTsiIGdseXBoLW5hbWU9ImFyaW5nIiBob3Jpei1hZHYteD0iNTMxIiBkPSJNMjE2IC0xMFExNDAgLTEwIDk2IDI1VDUyIDEyMFE1MiAyMDAgMTMzIDIzNlQzOTQgMjc1SDQwNFYyOTlRNDA0IDM2NiAzNjYgNDAyVDI1OSA0MzlRMTk3IDQzOSAxNTggNDEzVDk4IDM0OVE5OCAzNDkgOTQgMzUwVDg0IDM1NFQ3NSAzNjJUNzEgMzc3UTcxIDM4NSA3OCAzOThUOTggNDIzUTEyMSA0NDYgMTYxIDQ2NFQyNjIgNDgzUTM1MSA0ODMgNDAxIDQzNVQ0NTEgMzAwVjBINDA0Vjk0UTM4MSA0OCAzMzIgMTlUMjE2IC0xMFpNMjIwIDMwUTI1OSAzMCAyOTIgNDJUMzUwIDc2VDM4OSAxMjdUNDA0IDE5MFYyMzdIMzkxUTMxNCAyMzUgMjU5IDIyOFQxNjkgMjA3VDExOCAxNzJUMTAxIDEyMFExMDEgNzggMTMzIDU0VDIyMCAzMFpNMjY0IDU0NFEyMTYgNTQ0IDE4NyA1NzRUMTU3IDY1MlExNTcgNjk5IDE4NyA3MzBUMjY1IDc2MVEzMTMgNzYxIDM0MiA3MzBUMzcyIDY1MlEzNzIgNjA2IDM0MiA1NzVUMjY0IDU0NFpNMjY0IDU3N1EyOTUgNTc3IDMxNSA1OThUMzM1IDY1MlEzMzUgNjg0IDMxNSA3MDZUMjY0IDcyOFEyMzMgNzI4IDIxMyA3MDZUMTkzIDY1MlExOTMgNjIwIDIxMyA1OTlUMjY0IDU3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU2OyIgZ2x5cGgtbmFtZT0iYWUiIGhvcml6LWFkdi14PSI4OTciIGQ9Ik0yMTYgLTEwUTE0MCAtMTAgOTYgMjVUNTIgMTIwUTUyIDE2MCA3MiAxODlUMTM0IDIzNlQyNDAgMjY0VDM5NCAyNzZINDA0VjI5N1E0MDQgMzY2IDM2NiA0MDJUMjU5IDQzOVExOTcgNDM5IDE1OCA0MTNUOTggMzQ5UTk4IDM0OSA5NCAzNTBUODQgMzU0VDc1IDM2MlQ3MSAzNzdRNzEgMzg1IDc4IDM5OFQ5OCA0MjNRMTIxIDQ0NiAxNjEgNDY0VDI2MiA0ODNRMzMzIDQ4MyAzNzcgNDUwVDQzNSAzNTRRNDYwIDQxNCA1MTEgNDQ4VDYzMSA0ODNRNjc5IDQ4MyA3MTggNDY2VDc4NiA0MTlUODMxIDM0NlQ4NDcgMjUxVjI0N1E4NDcgMjM2IDg0MiAyMzNUODI2IDIyOUg0NDVRNDQ2IDE4NSA0NjAgMTQ5VDUwMCA4OFQ1NjEgNDhUNjM4IDMzUTY3NCAzMyA3MDEgNDFUNzQ4IDYyVDc4MiA5M1Q4MDUgMTI4UTgwNiAxMjkgODEwIDEyOFQ4MjAgMTI0VDgyOSAxMTVUODMzIDEwMFE4MzMgOTIgODI2IDc5VDgwMyA0OVE3ODEgMjcgNzM5IDlUNjM4IC0xMFE1NTggLTEwIDUwMyAyOFQ0MjUgMTMxUTQxNSA5OSAzOTYgNzNUMzQ5IDI5VDI4NyAwVDIxNiAtMTBaTTIyMCAzMFEyNTkgMzAgMjkyIDQyVDM1MCA3NVQzODkgMTI1VDQwNCAxOTBWMjM4SDM5MlEzMTQgMjM2IDI1OSAyMjlUMTY5IDIwOFQxMTggMTcyVDEwMSAxMjBRMTAxIDc4IDEzMyA1NFQyMjAgMzBaTTYzMSA0NDFRNTk1IDQ0MSA1NjQgNDI5VDUwOCAzOTNUNDY4IDMzOVQ0NDcgMjcwSDc5N1E3OTMgMzQ3IDc0OCAzOTRUNjMxIDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU3OyIgZ2x5cGgtbmFtZT0iY2NlZGlsbGEiIGhvcml6LWFkdi14PSI1NDIiIGQ9Ik0yOTMgLTEwUTI0MCAtMTAgMTk2IDlUMTIwIDYxVDcwIDEzOVQ1MiAyMzhRNTIgMjkwIDcwIDMzNVQxMjAgNDEzVDE5NiA0NjRUMjkzIDQ4M1EzNTMgNDgzIDM5MyA0NjVUNDU3IDQyMlE0NzYgNDAzIDQ4NCAzODVUNDkzIDM1NVE0OTMgMzQ3IDQ4OSAzNDJUNDc5IDMzNFQ0NjggMzMxVDQ2MiAzMzFRNDU0IDM1MiA0NDAgMzcyVDQwNiA0MDdUMzU4IDQzMlQyOTMgNDQxUTI1MSA0NDEgMjE2IDQyNlQxNTUgMzgzVDExNSAzMThUMTAwIDIzOFExMDAgMTk0IDExNCAxNTdUMTUzIDkyVDIxNCA0OVQyOTMgMzNRMzMwIDMzIDM1OCA0MlQ0MDYgNjZUNDQwIDEwMVQ0NjIgMTQyUTQ2MyAxNDMgNDY4IDE0M1Q0NzggMTQwVDQ4OCAxMzJUNDkzIDExOFE0OTMgMTA3IDQ4NSA4OVQ0NTYgNTBRNDMyIDI2IDM5MiA4VDI5MyAtMTBaTTIzMCAtMjEzUTIyOCAtMjE2IDIyMyAtMjE2VDIxMyAtMjE2VDIwNSAtMjExVDIwNSAtMjAxTDI2NyAtNzRRMjcyIC02MiAyNzcgLTU1VDI5NyAtNDhIMzAxUTMxMSAtNDggMzE4IC01NFQzMjYgLTcwVi03M1EzMjYgLTc5IDMyMSAtODZUMzA3IC0xMDVMMjMwIC0yMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFODsiIGdseXBoLW5hbWU9ImVncmF2ZSIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTI5NCAtMTBRMjQwIC0xMCAxOTUgOFQxMTkgNTlUNzAgMTM3VDUyIDIzNVE1MiAyODggNjkgMzMzVDExOCA0MTJUMTkzIDQ2NFQyODggNDgzUTMzNyA0ODMgMzc3IDQ2N1Q0NDUgNDIwVDQ4OSAzNDdUNTA1IDI1MlYyNDdRNTA1IDIzNiA1MDAgMjMzVDQ4NCAyMzBIOTlRMTAwIDE4NiAxMTQgMTUwVDE1NCA4OFQyMTUgNDhUMjk0IDMzUTMzMSAzMyAzNTggNDFUNDA2IDYyVDQ0MCA5M1Q0NjMgMTI4UTQ2NCAxMjkgNDY4IDEyOFQ0NzggMTI0VDQ4NyAxMTVUNDkxIDEwMFE0OTEgOTIgNDg0IDc5VDQ2MSA0OVE0MzkgMjcgMzk3IDlUMjk0IC0xMFpNMjg4IDQ0MVEyNTEgNDQxIDIyMCA0MjlUMTY0IDM5NFQxMjMgMzQwVDEwMSAyNzFINDU1UTQ1MyAzMDkgNDQxIDM0MFQ0MDcgMzkzVDM1NSA0MjhUMjg4IDQ0MVpNMzM2IDU0N1EzMzQgNTQ1IDMyMiA1NDhUMjkxIDU1OVQyNDYgNTgxVDE5NCA2MTVRMTcxIDYzMiAxNjQgNjQxVDE1NiA2NjFRMTU2IDY3MCAxNjIgNjc1VDE3NyA2ODFRMTg1IDY4MSAxOTUgNjc3VDIyMiA2NTlRMjQ4IDYzOSAyNjkgNjIwVDMwNiA1ODVUMzI5IDU1OVQzMzYgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTk7IiBnbHlwaC1uYW1lPSJlYWN1dGUiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik0yOTQgLTEwUTI0MCAtMTAgMTk1IDhUMTE5IDU5VDcwIDEzN1Q1MiAyMzVRNTIgMjg4IDY5IDMzM1QxMTggNDEyVDE5MyA0NjRUMjg4IDQ4M1EzMzcgNDgzIDM3NyA0NjdUNDQ1IDQyMFQ0ODkgMzQ3VDUwNSAyNTJWMjQ3UTUwNSAyMzYgNTAwIDIzM1Q0ODQgMjMwSDk5UTEwMCAxODYgMTE0IDE1MFQxNTQgODhUMjE1IDQ4VDI5NCAzM1EzMzEgMzMgMzU4IDQxVDQwNiA2MlQ0NDAgOTNUNDYzIDEyOFE0NjQgMTI5IDQ2OCAxMjhUNDc4IDEyNFQ0ODcgMTE1VDQ5MSAxMDBRNDkxIDkyIDQ4NCA3OVQ0NjEgNDlRNDM5IDI3IDM5NyA5VDI5NCAtMTBaTTI4OCA0NDFRMjUxIDQ0MSAyMjAgNDI5VDE2NCAzOTRUMTIzIDM0MFQxMDEgMjcxSDQ1NVE0NTMgMzA5IDQ0MSAzNDBUNDA3IDM5M1QzNTUgNDI4VDI4OCA0NDFaTTIyNyA1NDdRMjI2IDU0OCAyMzQgNTU4VDI1NyA1ODVUMjkzIDYyMFQzNDEgNjU5UTM1OCA2NzIgMzY4IDY3NlQzODYgNjgxUTM5NSA2ODEgNDAxIDY3NlQ0MDggNjYxUTQwOCA2NTEgNDAwIDY0MlQzNzAgNjE1UTM0MyA1OTUgMzE4IDU4MlQyNzMgNTYwVDI0MSA1NDhUMjI3IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVBOyIgZ2x5cGgtbmFtZT0iZWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik0yOTQgLTEwUTI0MCAtMTAgMTk1IDhUMTE5IDU5VDcwIDEzN1Q1MiAyMzVRNTIgMjg4IDY5IDMzM1QxMTggNDEyVDE5MyA0NjRUMjg4IDQ4M1EzMzcgNDgzIDM3NyA0NjdUNDQ1IDQyMFQ0ODkgMzQ3VDUwNSAyNTJWMjQ3UTUwNSAyMzYgNTAwIDIzM1Q0ODQgMjMwSDk5UTEwMCAxODYgMTE0IDE1MFQxNTQgODhUMjE1IDQ4VDI5NCAzM1EzMzEgMzMgMzU4IDQxVDQwNiA2MlQ0NDAgOTNUNDYzIDEyOFE0NjQgMTI5IDQ2OCAxMjhUNDc4IDEyNFQ0ODcgMTE1VDQ5MSAxMDBRNDkxIDkyIDQ4NCA3OVQ0NjEgNDlRNDM5IDI3IDM5NyA5VDI5NCAtMTBaTTI4OCA0NDFRMjUxIDQ0MSAyMjAgNDI5VDE2NCAzOTRUMTIzIDM0MFQxMDEgMjcxSDQ1NVE0NTMgMzA5IDQ0MSAzNDBUNDA3IDM5M1QzNTUgNDI4VDI4OCA0NDFaTTE4MSA1NDVRMTY1IDU0NSAxNjUgNTYyUTE2NSA1NzMgMTc4IDU5MVQyMTYgNjM4UTI0NSA2NzAgMjY0IDY4NlQyODUgNzAzUTI4NyA3MDMgMzA2IDY4N1QzNTIgNjQwUTM3NyA2MTEgMzkwIDU5M1Q0MDQgNTYyUTQwNCA1NDUgMzg5IDU0NVEzNzkgNTQ1IDM2NiA1NTdUMzI0IDYwN0wyODQgNjYwTDI0NCA2MDZRMjE5IDU3MiAyMDUgNTU5VDE4MSA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGdseXBoLW5hbWU9ImVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTI5NCAtMTBRMjQwIC0xMCAxOTUgOFQxMTkgNTlUNzAgMTM3VDUyIDIzNVE1MiAyODggNjkgMzMzVDExOCA0MTJUMTkzIDQ2NFQyODggNDgzUTMzNyA0ODMgMzc3IDQ2N1Q0NDUgNDIwVDQ4OSAzNDdUNTA1IDI1MlYyNDdRNTA1IDIzNiA1MDAgMjMzVDQ4NCAyMzBIOTlRMTAwIDE4NiAxMTQgMTUwVDE1NCA4OFQyMTUgNDhUMjk0IDMzUTMzMSAzMyAzNTggNDFUNDA2IDYyVDQ0MCA5M1Q0NjMgMTI4UTQ2NCAxMjkgNDY4IDEyOFQ0NzggMTI0VDQ4NyAxMTVUNDkxIDEwMFE0OTEgOTIgNDg0IDc5VDQ2MSA0OVE0MzkgMjcgMzk3IDlUMjk0IC0xMFpNMjg4IDQ0MVEyNTEgNDQxIDIyMCA0MjlUMTY0IDM5NFQxMjMgMzQwVDEwMSAyNzFINDU1UTQ1MyAzMDkgNDQxIDM0MFQ0MDcgMzkzVDM1NSA0MjhUMjg4IDQ0MVpNMzY1IDU0NVEzMjcgNTQ1IDMyNyA1ODNRMzI3IDYyMSAzNjQgNjIxUTM4MSA2MjEgMzkxIDYxMVQ0MDIgNTgzUTQwMiA1NjUgMzkyIDU1NVQzNjUgNTQ1Wk0yMDYgNTQ1UTE4OSA1NDUgMTc5IDU1NVQxNjggNTgzUTE2OCA2MDEgMTc4IDYxMVQyMDUgNjIxUTI0MyA2MjEgMjQzIDU4M1EyNDMgNTY1IDIzMyA1NTVUMjA2IDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVDOyIgZ2x5cGgtbmFtZT0iaWdyYXZlIiBob3Jpei1hZHYteD0iMjI2IiBkPSJNODkgNDUzUTg5IDQ2NyA5NSA0NzFUMTEwIDQ3NkgxMTZRMTI1IDQ3NiAxMzEgNDcyVDEzNyA0NTNWMEg4OVY0NTNaTTE2NSA1NDdRMTYzIDU0NSAxNTEgNTQ4VDEyMCA1NTlUNzUgNTgxVDIzIDYxNVEwIDYzMiAtNyA2NDFULTE1IDY2MVEtMTUgNjcwIC05IDY3NVQ2IDY4MVExNCA2ODEgMjQgNjc3VDUxIDY1OVE3NyA2MzkgOTggNjIwVDEzNSA1ODVUMTU4IDU1OVQxNjUgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUQ7IiBnbHlwaC1uYW1lPSJpYWN1dGUiIGhvcml6LWFkdi14PSIyMjYiIGQ9Ik04OSA0NTNRODkgNDY3IDk1IDQ3MVQxMTAgNDc2SDExNlExMjUgNDc2IDEzMSA0NzJUMTM3IDQ1M1YwSDg5VjQ1M1pNNjggNTQ3UTY3IDU0OCA3NSA1NThUOTggNTg1VDEzNCA2MjBUMTgyIDY1OVExOTkgNjcyIDIwOSA2NzZUMjI3IDY4MVEyMzYgNjgxIDI0MiA2NzZUMjQ5IDY2MVEyNDkgNjUxIDI0MSA2NDJUMjExIDYxNVExODQgNTk1IDE1OSA1ODJUMTE0IDU2MFQ4MiA1NDhUNjggNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUU7IiBnbHlwaC1uYW1lPSJpY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjIyNiIgZD0iTTg5IDQ1M1E4OSA0NjcgOTUgNDcxVDExMCA0NzZIMTE2UTEyNSA0NzYgMTMxIDQ3MlQxMzcgNDUzVjBIODlWNDUzWk0xMiA1NDJRLTQgNTQyIC00IDU1OVEtNCA1NzAgOSA1ODhUNDcgNjM1UTc2IDY2NyA5NSA2ODNUMTE2IDcwMFExMTggNzAwIDEzNyA2ODRUMTgzIDYzN1EyMDggNjA4IDIyMSA1OTBUMjM1IDU1OVEyMzUgNTQyIDIyMCA1NDJRMjEwIDU0MiAxOTcgNTU0VDE1NSA2MDRMMTE1IDY1N0w3NSA2MDNRNTAgNTY5IDM2IDU1NlQxMiA1NDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRjsiIGdseXBoLW5hbWU9ImlkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjIyNiIgZD0iTTg5IDQ1M1E4OSA0NjcgOTUgNDcxVDExMCA0NzZIMTE2UTEyNSA0NzYgMTMxIDQ3MlQxMzcgNDUzVjBIODlWNDUzWk0xOTYgNTQ1UTE1OCA1NDUgMTU4IDU4M1ExNTggNjIxIDE5NSA2MjFRMjEyIDYyMSAyMjIgNjExVDIzMyA1ODNRMjMzIDU2NSAyMjMgNTU1VDE5NiA1NDVaTTM3IDU0NVEyMCA1NDUgMTAgNTU1VC0xIDU4M1EtMSA2MDEgOSA2MTFUMzYgNjIxUTc0IDYyMSA3NCA1ODNRNzQgNTY1IDY0IDU1NVQzNyA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMDsiIGdseXBoLW5hbWU9Im51bGwiIGhvcml6LWFkdi14PSI1ODMiIGQ9Ik0yODUgLTEwUTIzNCAtMTAgMTkyIDVUMTIwIDQ4VDc0IDExOFQ1NyAyMTBRNTcgMjYwIDc0IDMwMFQxMjEgMzY4VDE5NCA0MTFUMjg4IDQyNlEzMjAgNDI2IDM0OSA0MThUNDAyIDM5NlQ0NDUgMzY0VDQ3NSAzMjdRNDY3IDQwOCA0MzEgNDY5VDMzOSA1NzFMMjA4IDQ5NVExODggNDg0IDE4MCA1MDBMMTc4IDUwNFExNjcgNTE5IDE4OCA1MzJMMzAwIDU5NFEyNTcgNjE4IDIwOSA2MzFUMTExIDY0NlExMDkgNjQ2IDEwOSA2NTJUMTEyIDY2NVQxMjQgNjc5VDE0NyA2ODZRMTY0IDY4NiAxODcgNjgzVDIzNiA2NzFUMjkyIDY1MVQzNDkgNjE5TDQ2MyA2ODVRNDc1IDY5MiA0ODEgNjkwVDQ5MyA2ODBMNDk1IDY3OFE1MDAgNjcwIDQ5OCA2NjNUNDg0IDY0OUwzODMgNTkzUTQxMiA1NjkgNDM4IDUzN1Q0ODMgNDY2VDUxMyAzNzhUNTI0IDI3MlE1MjQgMjA1IDUwNyAxNTNUNDU5IDY0VDM4NCA5VDI4NSAtMTBaTTI4NSAzMlEzMzQgMzIgMzY5IDUwVDQyOCAxMDBUNDYzIDE3NlQ0NzUgMjc1UTQ2NiAyOTUgNDQ5IDMxNFQ0MDcgMzQ5VDM1MyAzNzRUMjkxIDM4NFEyMDMgMzg0IDE1NSAzNDBUMTA2IDIxMVExMDYgMTI1IDE1NSA3OVQyODUgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMTsiIGdseXBoLW5hbWU9Im50aWxkZSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTg0IDQ3MVE4NCA0NzIgODggNDc0VDEwMCA0NzZRMTEzIDQ3NiAxMjIgNDY3VDEzMSA0MjhWMzg1UTE1NSA0MjggMTk4IDQ1NVQzMDEgNDgzUTM0OCA0ODMgMzgzIDQ2OFQ0NDMgNDI1VDQ3OSAzNTlUNDkxIDI3MlYwSDQ0M1YyNjlRNDQzIDM0NyA0MDYgMzkyVDI5OSA0MzhRMjM5IDQzOCAxOTcgNDA4VDEzMiAzMjhWMEg4NFY0NzFaTTM0MiA1NDRRMzE3IDU0NCAyOTkgNTU2VDI2NSA1ODVRMjUwIDYwMCAyNDAgNjA3VDIxOSA2MTRRMjA0IDYxNCAxOTcgNjAzVDE4NSA1NzJRMTgyIDU2MSAxNzggNTU1VDE2NCA1NDlRMTU2IDU0OSAxNDYgNTU2UTE0OSA2MDEgMTY3IDYyOFQyMjAgNjU1UTI0NiA2NTUgMjY0IDY0M1QyOTcgNjEzUTMxMiA1OTggMzIyIDU5MVQzNDQgNTg0UTM1OCA1ODQgMzY1IDU5NVQzNzggNjI2UTM4MSA2MzcgMzg1IDY0M1QzOTkgNjQ5UTQwNyA2NDkgNDE2IDY0MlE0MTQgNTk3IDM5NiA1NzFUMzQyIDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYyOyIgZ2x5cGgtbmFtZT0ib2dyYXZlIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjk0IC0xMFEyNDEgLTEwIDE5NyA5VDEyMCA2MVQ3MCAxMzlUNTIgMjM3UTUyIDI5MCA3MCAzMzVUMTIwIDQxM1QxOTYgNDY0VDI5NCA0ODNRMzQ2IDQ4MyAzOTAgNDY0VDQ2NyA0MTJUNTE3IDMzNFQ1MzUgMjM1UTUzNSAxODIgNTE3IDEzOFQ0NjcgNjBUMzkxIDlUMjk0IC0xMFpNMjk0IDMyUTMzNiAzMiAzNzEgNDdUNDMyIDkwVDQ3MiAxNTRUNDg3IDIzNVE0ODcgMjc4IDQ3MyAzMTZUNDMzIDM4MVQzNzIgNDI1VDI5NCA0NDFRMjUyIDQ0MSAyMTcgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM3UTEwMCAxOTMgMTE0IDE1NlQxNTUgOTFUMjE2IDQ4VDI5NCAzMlpNMzQwIDU0N1EzMzggNTQ1IDMyNiA1NDhUMjk1IDU1OVQyNTAgNTgxVDE5OCA2MTVRMTc1IDYzMiAxNjggNjQxVDE2MCA2NjFRMTYwIDY3MCAxNjYgNjc1VDE4MSA2ODFRMTg5IDY4MSAxOTkgNjc3VDIyNiA2NTlRMjUyIDYzOSAyNzMgNjIwVDMxMCA1ODVUMzMzIDU1OVQzNDAgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjM7IiBnbHlwaC1uYW1lPSJvYWN1dGUiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yOTQgLTEwUTI0MSAtMTAgMTk3IDlUMTIwIDYxVDcwIDEzOVQ1MiAyMzdRNTIgMjkwIDcwIDMzNVQxMjAgNDEzVDE5NiA0NjRUMjk0IDQ4M1EzNDYgNDgzIDM5MCA0NjRUNDY3IDQxMlQ1MTcgMzM0VDUzNSAyMzVRNTM1IDE4MiA1MTcgMTM4VDQ2NyA2MFQzOTEgOVQyOTQgLTEwWk0yOTQgMzJRMzM2IDMyIDM3MSA0N1Q0MzIgOTBUNDcyIDE1NFQ0ODcgMjM1UTQ4NyAyNzggNDczIDMxNlQ0MzMgMzgxVDM3MiA0MjVUMjk0IDQ0MVEyNTIgNDQxIDIxNyA0MjZUMTU1IDM4M1QxMTUgMzE4VDEwMCAyMzdRMTAwIDE5MyAxMTQgMTU2VDE1NSA5MVQyMTYgNDhUMjk0IDMyWk0yNDcgNTQ3UTI0NiA1NDggMjU0IDU1OFQyNzcgNTg1VDMxMyA2MjBUMzYxIDY1OVEzNzggNjcyIDM4OCA2NzZUNDA2IDY4MVE0MTUgNjgxIDQyMSA2NzZUNDI4IDY2MVE0MjggNjUxIDQyMCA2NDJUMzkwIDYxNVEzNjMgNTk1IDMzOCA1ODJUMjkzIDU2MFQyNjEgNTQ4VDI0NyA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNDsiIGdseXBoLW5hbWU9Im9jaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjk0IC0xMFEyNDEgLTEwIDE5NyA5VDEyMCA2MVQ3MCAxMzlUNTIgMjM3UTUyIDI5MCA3MCAzMzVUMTIwIDQxM1QxOTYgNDY0VDI5NCA0ODNRMzQ2IDQ4MyAzOTAgNDY0VDQ2NyA0MTJUNTE3IDMzNFQ1MzUgMjM1UTUzNSAxODIgNTE3IDEzOFQ0NjcgNjBUMzkxIDlUMjk0IC0xMFpNMjk0IDMyUTMzNiAzMiAzNzEgNDdUNDMyIDkwVDQ3MiAxNTRUNDg3IDIzNVE0ODcgMjc4IDQ3MyAzMTZUNDMzIDM4MVQzNzIgNDI1VDI5NCA0NDFRMjUyIDQ0MSAyMTcgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM3UTEwMCAxOTMgMTE0IDE1NlQxNTUgOTFUMjE2IDQ4VDI5NCAzMlpNMTkwIDU0NVExNzQgNTQ1IDE3NCA1NjJRMTc0IDU3MyAxODcgNTkxVDIyNSA2MzhRMjU0IDY3MCAyNzMgNjg2VDI5NCA3MDNRMjk2IDcwMyAzMTUgNjg3VDM2MSA2NDBRMzg2IDYxMSAzOTkgNTkzVDQxMyA1NjJRNDEzIDU0NSAzOTggNTQ1UTM4OCA1NDUgMzc1IDU1N1QzMzMgNjA3TDI5MyA2NjBMMjUzIDYwNlEyMjggNTcyIDIxNCA1NTlUMTkwIDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY1OyIgZ2x5cGgtbmFtZT0ib3RpbGRlIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjk0IC0xMFEyNDEgLTEwIDE5NyA5VDEyMCA2MVQ3MCAxMzlUNTIgMjM3UTUyIDI5MCA3MCAzMzVUMTIwIDQxM1QxOTYgNDY0VDI5NCA0ODNRMzQ2IDQ4MyAzOTAgNDY0VDQ2NyA0MTJUNTE3IDMzNFQ1MzUgMjM1UTUzNSAxODIgNTE3IDEzOFQ0NjcgNjBUMzkxIDlUMjk0IC0xMFpNMjk0IDMyUTMzNiAzMiAzNzEgNDdUNDMyIDkwVDQ3MiAxNTRUNDg3IDIzNVE0ODcgMjc4IDQ3MyAzMTZUNDMzIDM4MVQzNzIgNDI1VDI5NCA0NDFRMjUyIDQ0MSAyMTcgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM3UTEwMCAxOTMgMTE0IDE1NlQxNTUgOTFUMjE2IDQ4VDI5NCAzMlpNMzU1IDU0NFEzMzAgNTQ0IDMxMiA1NTZUMjc4IDU4NVEyNjMgNjAwIDI1MyA2MDdUMjMyIDYxNFEyMTcgNjE0IDIxMCA2MDNUMTk4IDU3MlExOTUgNTYxIDE5MSA1NTVUMTc3IDU0OVExNjkgNTQ5IDE1OSA1NTZRMTYyIDYwMSAxODAgNjI4VDIzMyA2NTVRMjU5IDY1NSAyNzcgNjQzVDMxMCA2MTNRMzI1IDU5OCAzMzUgNTkxVDM1NyA1ODRRMzcxIDU4NCAzNzggNTk1VDM5MSA2MjZRMzk0IDYzNyAzOTggNjQzVDQxMiA2NDlRNDIwIDY0OSA0MjkgNjQyUTQyNyA1OTcgNDA5IDU3MVQzNTUgNTQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjY7IiBnbHlwaC1uYW1lPSJvZGllcmVzaXMiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yOTQgLTEwUTI0MSAtMTAgMTk3IDlUMTIwIDYxVDcwIDEzOVQ1MiAyMzdRNTIgMjkwIDcwIDMzNVQxMjAgNDEzVDE5NiA0NjRUMjk0IDQ4M1EzNDYgNDgzIDM5MCA0NjRUNDY3IDQxMlQ1MTcgMzM0VDUzNSAyMzVRNTM1IDE4MiA1MTcgMTM4VDQ2NyA2MFQzOTEgOVQyOTQgLTEwWk0yOTQgMzJRMzM2IDMyIDM3MSA0N1Q0MzIgOTBUNDcyIDE1NFQ0ODcgMjM1UTQ4NyAyNzggNDczIDMxNlQ0MzMgMzgxVDM3MiA0MjVUMjk0IDQ0MVEyNTIgNDQxIDIxNyA0MjZUMTU1IDM4M1QxMTUgMzE4VDEwMCAyMzdRMTAwIDE5MyAxMTQgMTU2VDE1NSA5MVQyMTYgNDhUMjk0IDMyWk0zNzQgNTQ1UTMzNiA1NDUgMzM2IDU4M1EzMzYgNjIxIDM3MyA2MjFRMzkwIDYyMSA0MDAgNjExVDQxMSA1ODNRNDExIDU2NSA0MDEgNTU1VDM3NCA1NDVaTTIxNSA1NDVRMTk4IDU0NSAxODggNTU1VDE3NyA1ODNRMTc3IDYwMSAxODcgNjExVDIxNCA2MjFRMjUyIDYyMSAyNTIgNTgzUTI1MiA1NjUgMjQyIDU1NVQyMTUgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjc7IiBnbHlwaC1uYW1lPSJkaXZpZGUiIGhvcml6LWFkdi14PSI2MzAiIGQ9Ik0xMjggMjQ0UTEwNSAyNDQgMTA1IDI2NFYyNjlRMTA1IDI4OSAxMjggMjg5SDUwMVE1MTUgMjg5IDUxOSAyODRUNTI0IDI2OVYyNjRRNTI0IDI1NSA1MjAgMjUwVDUwMSAyNDRIMTI4Wk0zMTEgMzc1UTI3NiAzNzUgMjc2IDQxMFY0MTdRMjc2IDQ1MiAzMTEgNDUySDMxOFEzNTMgNDUyIDM1MyA0MTdWNDEwUTM1MyAzNzUgMzE4IDM3NUgzMTFaTTMxMSA4MVEyNzYgODEgMjc2IDExNlYxMjNRMjc2IDE1OCAzMTEgMTU4SDMxOFEzNTMgMTU4IDM1MyAxMjNWMTE2UTM1MyA4MSAzMTggODFIMzExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjg7IiBnbHlwaC1uYW1lPSJvc2xhc2giIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik03OSAtMzJRNzcgLTM0IDY3IC0yOFQ1NiAtMTBRNTYgLTQgNTkgNFQ3MyAyM0wxMTcgNzFRODkgMTAzIDczIDE0NVQ1NyAyMzZRNTcgMjg3IDc1IDMzMlQxMjYgNDEwVDIwMiA0NjNUMjk3IDQ4M1EzNDAgNDgzIDM3OCA0NzBUNDQ2IDQzMUw1MTEgNTA0UTUxMyA1MDYgNTIzIDUwMFQ1MzMgNDgyUTUzMyA0NzUgNTMwIDQ2N1Q1MTYgNDQ4TDQ3NSA0MDNRNTA0IDM3MCA1MTkgMzI4VDUzNSAyMzdRNTM1IDE4NSA1MTcgMTQwVDQ2NiA2MlQzOTEgOVQyOTYgLTEwUTI1MiAtMTAgMjE0IDNUMTQ2IDQyTDc5IC0zMlpNNDE1IDM5NlEzOTEgNDE2IDM2MSA0MjhUMjk2IDQ0MFEyNTQgNDQwIDIyMCA0MjVUMTYwIDM4MlQxMjAgMzE3VDEwNiAyMzdRMTA2IDE5OSAxMTcgMTY1VDE1MCAxMDVMNDE1IDM5NlpNMjk3IDMzUTMzOCAzMyAzNzMgNDhUNDMzIDkxVDQ3MyAxNTZUNDg3IDIzNlE0ODcgMjc0IDQ3NSAzMDhUNDQxIDM2OUwxNzYgNzdRMjAxIDU3IDIzMSA0NVQyOTcgMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGOTsiIGdseXBoLW5hbWU9InVncmF2ZSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTI2OSAtMTBRMjIyIC0xMCAxODcgNVQxMjggNDhUOTIgMTE0VDgwIDIwMVY0NzNIMTI4VjIwNFExMjggMTI2IDE2NSA4MVQyNzIgMzVRMzMyIDM1IDM3NCA2NVQ0MzkgMTQ2VjQ3M0g0ODdWMlE0ODcgMSA0ODIgLTFUNDcwIC0zUTQ1OCAtMyA0NDkgNlQ0NDAgNDVWODhRNDE2IDQ2IDM3MyAxOFQyNjkgLTEwWk0zMzUgNTQ0UTMzMyA1NDIgMzIxIDU0NVQyOTAgNTU2VDI0NSA1NzhUMTkzIDYxMlExNzAgNjI5IDE2MyA2MzhUMTU1IDY1OFExNTUgNjY3IDE2MSA2NzJUMTc2IDY3OFExODQgNjc4IDE5NCA2NzRUMjIxIDY1NlEyNDcgNjM2IDI2OCA2MTdUMzA1IDU4MlQzMjggNTU2VDMzNSA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQTsiIGdseXBoLW5hbWU9InVhY3V0ZSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTI2OSAtMTBRMjIyIC0xMCAxODcgNVQxMjggNDhUOTIgMTE0VDgwIDIwMVY0NzNIMTI4VjIwNFExMjggMTI2IDE2NSA4MVQyNzIgMzVRMzMyIDM1IDM3NCA2NVQ0MzkgMTQ2VjQ3M0g0ODdWMlE0ODcgMSA0ODIgLTFUNDcwIC0zUTQ1OCAtMyA0NDkgNlQ0NDAgNDVWODhRNDE2IDQ2IDM3MyAxOFQyNjkgLTEwWk0yNDMgNTQ0UTI0MiA1NDUgMjUwIDU1NVQyNzMgNTgyVDMwOSA2MTdUMzU3IDY1NlEzNzQgNjY5IDM4NCA2NzNUNDAyIDY3OFE0MTEgNjc4IDQxNyA2NzNUNDI0IDY1OFE0MjQgNjQ4IDQxNiA2MzlUMzg2IDYxMlEzNTkgNTkyIDMzNCA1NzlUMjg5IDU1N1QyNTcgNTQ1VDI0MyA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGdseXBoLW5hbWU9InVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjY5IC0xMFEyMjIgLTEwIDE4NyA1VDEyOCA0OFQ5MiAxMTRUODAgMjAxVjQ3M0gxMjhWMjA0UTEyOCAxMjYgMTY1IDgxVDI3MiAzNVEzMzIgMzUgMzc0IDY1VDQzOSAxNDZWNDczSDQ4N1YyUTQ4NyAxIDQ4MiAtMVQ0NzAgLTNRNDU4IC0zIDQ0OSA2VDQ0MCA0NVY4OFE0MTYgNDYgMzczIDE4VDI2OSAtMTBaTTE4MyA1NDJRMTY3IDU0MiAxNjcgNTU5UTE2NyA1NzAgMTgwIDU4OFQyMTggNjM1UTI0NyA2NjcgMjY2IDY4M1QyODcgNzAwUTI4OSA3MDAgMzA4IDY4NFQzNTQgNjM3UTM3OSA2MDggMzkyIDU5MFQ0MDYgNTU5UTQwNiA1NDIgMzkxIDU0MlEzODEgNTQyIDM2OCA1NTRUMzI2IDYwNEwyODYgNjU3TDI0NiA2MDNRMjIxIDU2OSAyMDcgNTU2VDE4MyA1NDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQzsiIGdseXBoLW5hbWU9InVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTI2OSAtMTBRMjIyIC0xMCAxODcgNVQxMjggNDhUOTIgMTE0VDgwIDIwMVY0NzNIMTI4VjIwNFExMjggMTI2IDE2NSA4MVQyNzIgMzVRMzMyIDM1IDM3NCA2NVQ0MzkgMTQ2VjQ3M0g0ODdWMlE0ODcgMSA0ODIgLTFUNDcwIC0zUTQ1OCAtMyA0NDkgNlQ0NDAgNDVWODhRNDE2IDQ2IDM3MyAxOFQyNjkgLTEwWk0zNjcgNTQyUTMyOSA1NDIgMzI5IDU4MFEzMjkgNjE4IDM2NiA2MThRMzgzIDYxOCAzOTMgNjA4VDQwNCA1ODBRNDA0IDU2MiAzOTQgNTUyVDM2NyA1NDJaTTIwOCA1NDJRMTkxIDU0MiAxODEgNTUyVDE3MCA1ODBRMTcwIDU5OCAxODAgNjA4VDIwNyA2MThRMjQ1IDYxOCAyNDUgNTgwUTI0NSA1NjIgMjM1IDU1MlQyMDggNTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkQ7IiBnbHlwaC1uYW1lPSJ5YWN1dGUiIGhvcml6LWFkdi14PSI0ODgiIGQ9Ik0xODIgLTE5M1ExNzIgLTE5MyAxNjQgLTE4OFQxNTcgLTE4MEwyNDEgMjZRMjI4IDI2IDIyMiAzMFQyMTEgNDVMMjUgNDczSDc1TDI1NCA1Nkw0MTMgNDczSDQ2NEwyMTYgLTE2MVEyMDkgLTE4MSAyMDEgLTE4N1QxODIgLTE5M1pNMTk5IDUzNFExOTggNTM1IDIwNiA1NDVUMjI5IDU3MlQyNjUgNjA3VDMxMyA2NDZRMzMwIDY1OSAzNDAgNjYzVDM1OCA2NjhRMzY3IDY2OCAzNzMgNjYzVDM4MCA2NDhRMzgwIDYzOCAzNzIgNjI5VDM0MiA2MDJRMzE1IDU4MiAyOTAgNTY5VDI0NSA1NDdUMjEzIDUzNVQxOTkgNTM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBnbHlwaC1uYW1lPSJ0aG9ybiIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTEwNiAtMTkzUTg0IC0xOTMgODQgLTE3MFY2NzNRODQgNjc4IDEwMCA2NzhRMTEzIDY3OCAxMjIgNjY5VDEzMiA2MzFWMzc2UTE2MCA0MjQgMjA2IDQ1M1QzMTkgNDgzUTM2NiA0ODMgNDA3IDQ2NVQ0NzggNDE1VDUyNiAzMzhUNTQ0IDIzOFE1NDQgMTgzIDUyNyAxMzhUNDgwIDU5VDQwNyA4VDMxNiAtMTBRMjgwIC0xMCAyNTEgLTFUMTk4IDIzVDE1OCA1N1QxMzIgOTZWLTE3MFExMzIgLTE4MyAxMjYgLTE4OFQxMTEgLTE5M0gxMDZaTTMxMiAzMlEzNTMgMzIgMzg3IDQ3VDQ0NSA4OVQ0ODIgMTU0VDQ5NiAyMzhRNDk2IDI4MiA0ODIgMzE5VDQ0NCAzODNUMzg3IDQyNVQzMTQgNDQxUTI0NSA0NDEgMjAwIDQwNlQxMzEgMzEyVjIwM1ExMzEgMTY3IDE0NSAxMzZUMTgzIDgyVDI0MSA0NlQzMTIgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGRjsiIGdseXBoLW5hbWU9InlkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjQ4OCIgZD0iTTE4MiAtMTkzUTE3MiAtMTkzIDE2NCAtMTg4VDE1NyAtMTgwTDI0MSAyNlEyMjggMjYgMjIyIDMwVDIxMSA0NUwyNSA0NzNINzVMMjU0IDU2TDQxMyA0NzNINDY0TDIxNiAtMTYxUTIwOSAtMTgxIDIwMSAtMTg3VDE4MiAtMTkzWk0zMjYgNTQ1UTI4OCA1NDUgMjg4IDU4M1EyODggNjIxIDMyNSA2MjFRMzQyIDYyMSAzNTIgNjExVDM2MyA1ODNRMzYzIDU2NSAzNTMgNTU1VDMyNiA1NDVaTTE2NyA1NDVRMTUwIDU0NSAxNDAgNTU1VDEyOSA1ODNRMTI5IDYwMSAxMzkgNjExVDE2NiA2MjFRMjA0IDYyMSAyMDQgNTgzUTIwNCA1NjUgMTk0IDU1NVQxNjcgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAwOyIgZ2x5cGgtbmFtZT0iQW1hY3JvbiIgaG9yaXotYWR2LXg9IjYyNyIgZD0iTTI3NiA2MzNRMjgwIDY0MiAyODggNjQ3VDMxMyA2NTJRMzMxIDY1MiAzMzkgNjQ3VDM1MSA2MzNMNjAxIDBINTQ1TDQ1NyAyMjRIMTY4TDc5IDBIMjZMMjc2IDYzM1pNNDQxIDI2OEwzMTMgNTk1TDE4NCAyNjhINDQxWk0yMTEgNzQxUTE4MiA3NDEgMTgyIDc2MlY3NjZRMTgyIDc4NiAyMTEgNzg2SDQxNVE0NDQgNzg2IDQ0NCA3NjZWNzYyUTQ0NCA3NDEgNDE1IDc0MUgyMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDE7IiBnbHlwaC1uYW1lPSJhbWFjcm9uIiBob3Jpei1hZHYteD0iNTMxIiBkPSJNMjE2IC0xMFExNDAgLTEwIDk2IDI1VDUyIDEyMFE1MiAyMDAgMTMzIDIzNlQzOTQgMjc1SDQwNFYyOTlRNDA0IDM2NiAzNjYgNDAyVDI1OSA0MzlRMTk3IDQzOSAxNTggNDEzVDk4IDM0OVE5OCAzNDkgOTQgMzUwVDg0IDM1NFQ3NSAzNjJUNzEgMzc3UTcxIDM4NSA3OCAzOThUOTggNDIzUTEyMSA0NDYgMTYxIDQ2NFQyNjIgNDgzUTM1MSA0ODMgNDAxIDQzNVQ0NTEgMzAwVjBINDA0Vjk0UTM4MSA0OCAzMzIgMTlUMjE2IC0xMFpNMjIwIDMwUTI1OSAzMCAyOTIgNDJUMzUwIDc2VDM4OSAxMjdUNDA0IDE5MFYyMzdIMzkxUTMxNCAyMzUgMjU5IDIyOFQxNjkgMjA3VDExOCAxNzJUMTAxIDEyMFExMDEgNzggMTMzIDU0VDIyMCAzMFpNMTY2IDU2N1ExMzcgNTY3IDEzNyA1ODhWNTkyUTEzNyA2MTIgMTY2IDYxMkgzNzBRMzk5IDYxMiAzOTkgNTkyVjU4OFEzOTkgNTY3IDM3MCA1NjdIMTY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAyOyIgZ2x5cGgtbmFtZT0iQWJyZXZlIiBob3Jpei1hZHYteD0iNjI3IiBkPSJNMjc2IDYzM1EyODAgNjQyIDI4OCA2NDdUMzEzIDY1MlEzMzEgNjUyIDMzOSA2NDdUMzUxIDYzM0w2MDEgMEg1NDVMNDU3IDIyNEgxNjhMNzkgMEgyNkwyNzYgNjMzWk00NDEgMjY4TDMxMyA1OTVMMTg0IDI2OEg0NDFaTTMxNCA3MTlRMjgyIDcxOSAyNTcgNzMwVDIxNSA3NTlRMTk5IDc3NiAxOTIgNzkzVDE4NCA4MjBRMTg0IDgzMSAxOTAgODM5VDIxMyA4NDdRMjI2IDgwOSAyNTIgNzg2VDMxNCA3NjJRMzUwIDc2MiAzNzYgNzg1VDQxNSA4NDdRNDMyIDg0NyA0MzggODM5VDQ0NCA4MjBRNDQ0IDgxMCA0MzcgNzkzVDQxMyA3NTlRMzk2IDc0MiAzNzEgNzMxVDMxNCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDM7IiBnbHlwaC1uYW1lPSJhYnJldmUiIGhvcml6LWFkdi14PSI1MzEiIGQ9Ik0yMTYgLTEwUTE0MCAtMTAgOTYgMjVUNTIgMTIwUTUyIDIwMCAxMzMgMjM2VDM5NCAyNzVINDA0VjI5OVE0MDQgMzY2IDM2NiA0MDJUMjU5IDQzOVExOTcgNDM5IDE1OCA0MTNUOTggMzQ5UTk4IDM0OSA5NCAzNTBUODQgMzU0VDc1IDM2MlQ3MSAzNzdRNzEgMzg1IDc4IDM5OFQ5OCA0MjNRMTIxIDQ0NiAxNjEgNDY0VDI2MiA0ODNRMzUxIDQ4MyA0MDEgNDM1VDQ1MSAzMDBWMEg0MDRWOTRRMzgxIDQ4IDMzMiAxOVQyMTYgLTEwWk0yMjAgMzBRMjU5IDMwIDI5MiA0MlQzNTAgNzZUMzg5IDEyN1Q0MDQgMTkwVjIzN0gzOTFRMzE0IDIzNSAyNTkgMjI4VDE2OSAyMDdUMTE4IDE3MlQxMDEgMTIwUTEwMSA3OCAxMzMgNTRUMjIwIDMwWk0yNjYgNTQ1UTIzNCA1NDUgMjA5IDU1NlQxNjcgNTg1UTE1MSA2MDIgMTQ0IDYxOVQxMzYgNjQ2UTEzNiA2NTcgMTQyIDY2NVQxNjUgNjczUTE3OCA2MzUgMjA0IDYxMlQyNjYgNTg4UTMwMiA1ODggMzI4IDYxMVQzNjcgNjczUTM4NCA2NzMgMzkwIDY2NVQzOTYgNjQ2UTM5NiA2MzYgMzg5IDYxOVQzNjUgNTg1UTM0OCA1NjggMzIzIDU1N1QyNjYgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA0OyIgZ2x5cGgtbmFtZT0iQW9nb25layIgaG9yaXotYWR2LXg9IjYyNyIgZD0iTTI3NiA2MzNRMjgwIDY0MiAyODggNjQ3VDMxMyA2NTJRMzMxIDY1MiAzMzkgNjQ3VDM1MSA2MzNMNjAxIDBINTg0UTUzOCAtMzIgNTIxIC01OFQ1MDQgLTEwNVE1MDQgLTEyNCA1MTUgLTEzNlQ1NDQgLTE0OFE1NzEgLTE0OCA1ODQgLTEyOVE1OTIgLTEyOSA2MDAgLTEzNVQ2MDggLTE1NFE2MDggLTE3MCA1ODkgLTE4MFQ1NDMgLTE5MFE1MDYgLTE5MCA0ODMgLTE3MFQ0NjAgLTExNFE0NjAgLTg1IDQ3OSAtNTVUNTQ0IDNMNDU3IDIyNEgxNjhMNzkgMEgyNkwyNzYgNjMzWk00NDEgMjY4TDMxMyA1OTVMMTg0IDI2OEg0NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDU7IiBnbHlwaC1uYW1lPSJhb2dvbmVrIiBob3Jpei1hZHYteD0iNTMxIiBkPSJNMjE2IC0xMFExNDAgLTEwIDk2IDI1VDUyIDEyMFE1MiAyMDAgMTMzIDIzNlQzOTQgMjc1SDQwNFYyOTlRNDA0IDM2NiAzNjYgNDAyVDI1OSA0MzlRMTk3IDQzOSAxNTggNDEzVDk4IDM0OVE5OCAzNDkgOTQgMzUwVDg0IDM1NFQ3NSAzNjJUNzEgMzc3UTcxIDM4NSA3OCAzOThUOTggNDIzUTEyMSA0NDYgMTYxIDQ2NFQyNjIgNDgzUTM1MSA0ODMgNDAxIDQzNVQ0NTEgMzAwVjBINDQ2UTM5OCAtMzMgMzgwIC01OVQzNjIgLTEwOFEzNjIgLTEyNyAzNzMgLTEzOVQ0MDIgLTE1MVE0MjkgLTE1MSA0NDIgLTEzMlE0NTAgLTEzMiA0NTggLTEzOFQ0NjYgLTE1N1E0NjYgLTE3MyA0NDcgLTE4M1Q0MDEgLTE5M1EzNjQgLTE5MyAzNDEgLTE3M1QzMTggLTExN1EzMTggLTg4IDMzOCAtNThUNDA0IDFWOTRRMzgxIDQ4IDMzMiAxOVQyMTYgLTEwWk0yMjAgMzBRMjU5IDMwIDI5MiA0MlQzNTAgNzZUMzg5IDEyN1Q0MDQgMTkwVjIzN0gzOTFRMzE0IDIzNSAyNTkgMjI4VDE2OSAyMDdUMTE4IDE3MlQxMDEgMTIwUTEwMSA3OCAxMzMgNTRUMjIwIDMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA2OyIgZ2x5cGgtbmFtZT0iQ2FjdXRlIiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzgzIC0xMFEzMTEgLTEwIDI1MiAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ2MCA2NTcgNTExIDYzNFQ1OTEgNTgxUTYwOCA1NjQgNjE3IDU0N1Q2MjYgNTIwUTYyNiA1MTEgNjIyIDUwNVQ2MTIgNDk1VDYwMiA0OTBUNTk2IDQ5MFE1NzAgNTQ0IDUxNCA1NzlUMzgzIDYxNFEzMjMgNjE0IDI3NCA1OTNUMTkwIDUzMlQxMzUgNDQwVDExNSAzMjNRMTE1IDI2MCAxMzQgMjA3VDE4OSAxMTZUMjc1IDU1VDM4NSAzM1E0MzAgMzMgNDY2IDQ0VDUyOSA3NVQ1NzUgMTIwVDYwMyAxNzJRNjA0IDE3MyA2MDkgMTcyVDYyMCAxNjhUNjMxIDE1OVQ2MzYgMTQzUTYzNiAxMzIgNjI2IDExMFQ1OTIgNjZRNTYzIDM3IDUxMCAxNFQzODMgLTEwWk0zMzggNzIxUTMzNyA3MjIgMzQ1IDczMlQzNjggNzU5VDQwNCA3OTRUNDUyIDgzM1E0NjkgODQ2IDQ3OSA4NTBUNDk3IDg1NVE1MDYgODU1IDUxMiA4NTBUNTE5IDgzNVE1MTkgODI1IDUxMSA4MTZUNDgxIDc4OVE0NTQgNzY5IDQyOSA3NTZUMzg0IDczNFQzNTIgNzIyVDMzOCA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDc7IiBnbHlwaC1uYW1lPSJjYWN1dGUiIGhvcml6LWFkdi14PSI1NDIiIGQ9Ik0yOTMgLTEwUTI0MCAtMTAgMTk2IDlUMTIwIDYxVDcwIDEzOVQ1MiAyMzhRNTIgMjkwIDcwIDMzNVQxMjAgNDEzVDE5NiA0NjRUMjkzIDQ4M1EzNTMgNDgzIDM5MyA0NjVUNDU3IDQyMlE0NzYgNDAzIDQ4NCAzODVUNDkzIDM1NVE0OTMgMzQ3IDQ4OSAzNDJUNDc5IDMzNFQ0NjggMzMxVDQ2MiAzMzFRNDU0IDM1MiA0NDAgMzcyVDQwNiA0MDdUMzU4IDQzMlQyOTMgNDQxUTI1MSA0NDEgMjE2IDQyNlQxNTUgMzgzVDExNSAzMThUMTAwIDIzOFExMDAgMTk0IDExNCAxNTdUMTUzIDkyVDIxNCA0OVQyOTMgMzNRMzMwIDMzIDM1OCA0MlQ0MDYgNjZUNDQwIDEwMVQ0NjIgMTQyUTQ2MyAxNDMgNDY4IDE0M1Q0NzggMTQwVDQ4OCAxMzJUNDkzIDExOFE0OTMgMTA3IDQ4NSA4OVQ0NTYgNTBRNDMyIDI2IDM5MiA4VDI5MyAtMTBaTTI1MSA1NDdRMjUwIDU0OCAyNTggNTU4VDI4MSA1ODVUMzE3IDYyMFQzNjUgNjU5UTM4MiA2NzIgMzkyIDY3NlQ0MTAgNjgxUTQxOSA2ODEgNDI1IDY3NlQ0MzIgNjYxUTQzMiA2NTEgNDI0IDY0MlQzOTQgNjE1UTM2NyA1OTUgMzQyIDU4MlQyOTcgNTYwVDI2NSA1NDhUMjUxIDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGdseXBoLW5hbWU9IkNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzgzIC0xMFEzMTEgLTEwIDI1MiAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ2MCA2NTcgNTExIDYzNFQ1OTEgNTgxUTYwOCA1NjQgNjE3IDU0N1Q2MjYgNTIwUTYyNiA1MTEgNjIyIDUwNVQ2MTIgNDk1VDYwMiA0OTBUNTk2IDQ5MFE1NzAgNTQ0IDUxNCA1NzlUMzgzIDYxNFEzMjMgNjE0IDI3NCA1OTNUMTkwIDUzMlQxMzUgNDQwVDExNSAzMjNRMTE1IDI2MCAxMzQgMjA3VDE4OSAxMTZUMjc1IDU1VDM4NSAzM1E0MzAgMzMgNDY2IDQ0VDUyOSA3NVQ1NzUgMTIwVDYwMyAxNzJRNjA0IDE3MyA2MDkgMTcyVDYyMCAxNjhUNjMxIDE1OVQ2MzYgMTQzUTYzNiAxMzIgNjI2IDExMFQ1OTIgNjZRNTYzIDM3IDUxMCAxNFQzODMgLTEwWk0yNjcgNzE5UTI1MSA3MTkgMjUxIDczNlEyNTEgNzQ3IDI2NCA3NjVUMzAyIDgxMlEzMzEgODQ0IDM1MCA4NjBUMzcxIDg3N1EzNzMgODc3IDM5MiA4NjFUNDM4IDgxNFE0NjMgNzg1IDQ3NiA3NjdUNDkwIDczNlE0OTAgNzE5IDQ3NSA3MTlRNDY1IDcxOSA0NTIgNzMxVDQxMCA3ODFMMzcwIDgzNEwzMzAgNzgwUTMwNSA3NDYgMjkxIDczM1QyNjcgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA5OyIgZ2x5cGgtbmFtZT0iY2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NDIiIGQ9Ik0yOTMgLTEwUTI0MCAtMTAgMTk2IDlUMTIwIDYxVDcwIDEzOVQ1MiAyMzhRNTIgMjkwIDcwIDMzNVQxMjAgNDEzVDE5NiA0NjRUMjkzIDQ4M1EzNTMgNDgzIDM5MyA0NjVUNDU3IDQyMlE0NzYgNDAzIDQ4NCAzODVUNDkzIDM1NVE0OTMgMzQ3IDQ4OSAzNDJUNDc5IDMzNFQ0NjggMzMxVDQ2MiAzMzFRNDU0IDM1MiA0NDAgMzcyVDQwNiA0MDdUMzU4IDQzMlQyOTMgNDQxUTI1MSA0NDEgMjE2IDQyNlQxNTUgMzgzVDExNSAzMThUMTAwIDIzOFExMDAgMTk0IDExNCAxNTdUMTUzIDkyVDIxNCA0OVQyOTMgMzNRMzMwIDMzIDM1OCA0MlQ0MDYgNjZUNDQwIDEwMVQ0NjIgMTQyUTQ2MyAxNDMgNDY4IDE0M1Q0NzggMTQwVDQ4OCAxMzJUNDkzIDExOFE0OTMgMTA3IDQ4NSA4OVQ0NTYgNTBRNDMyIDI2IDM5MiA4VDI5MyAtMTBaTTE5MyA1NDVRMTc3IDU0NSAxNzcgNTYyUTE3NyA1NzMgMTkwIDU5MVQyMjggNjM4UTI1NyA2NzAgMjc2IDY4NlQyOTcgNzAzUTI5OSA3MDMgMzE4IDY4N1QzNjQgNjQwUTM4OSA2MTEgNDAyIDU5M1Q0MTYgNTYyUTQxNiA1NDUgNDAxIDU0NVEzOTEgNTQ1IDM3OCA1NTdUMzM2IDYwN0wyOTYgNjYwTDI1NiA2MDZRMjMxIDU3MiAyMTcgNTU5VDE5MyA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEE7IiBnbHlwaC1uYW1lPSJDZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzgzIC0xMFEzMTEgLTEwIDI1MiAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ2MCA2NTcgNTExIDYzNFQ1OTEgNTgxUTYwOCA1NjQgNjE3IDU0N1Q2MjYgNTIwUTYyNiA1MTEgNjIyIDUwNVQ2MTIgNDk1VDYwMiA0OTBUNTk2IDQ5MFE1NzAgNTQ0IDUxNCA1NzlUMzgzIDYxNFEzMjMgNjE0IDI3NCA1OTNUMTkwIDUzMlQxMzUgNDQwVDExNSAzMjNRMTE1IDI2MCAxMzQgMjA3VDE4OSAxMTZUMjc1IDU1VDM4NSAzM1E0MzAgMzMgNDY2IDQ0VDUyOSA3NVQ1NzUgMTIwVDYwMyAxNzJRNjA0IDE3MyA2MDkgMTcyVDYyMCAxNjhUNjMxIDE1OVQ2MzYgMTQzUTYzNiAxMzIgNjI2IDExMFQ1OTIgNjZRNTYzIDM3IDUxMCAxNFQzODMgLTEwWk0zNzcgNzIwUTM1NyA3MjAgMzQ3IDczMVQzMzYgNzYwUTMzNiA3NzcgMzQ3IDc4OFQzNzggNzk5UTM5NyA3OTkgNDA4IDc4OFQ0MTkgNzYwUTQxOSA3NDMgNDA4IDczMlQzNzcgNzIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBCOyIgZ2x5cGgtbmFtZT0iY2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjU0MiIgZD0iTTI5MyAtMTBRMjQwIC0xMCAxOTYgOVQxMjAgNjFUNzAgMTM5VDUyIDIzOFE1MiAyOTAgNzAgMzM1VDEyMCA0MTNUMTk2IDQ2NFQyOTMgNDgzUTM1MyA0ODMgMzkzIDQ2NVQ0NTcgNDIyUTQ3NiA0MDMgNDg0IDM4NVQ0OTMgMzU1UTQ5MyAzNDcgNDg5IDM0MlQ0NzkgMzM0VDQ2OCAzMzFUNDYyIDMzMVE0NTQgMzUyIDQ0MCAzNzJUNDA2IDQwN1QzNTggNDMyVDI5MyA0NDFRMjUxIDQ0MSAyMTYgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM4UTEwMCAxOTQgMTE0IDE1N1QxNTMgOTJUMjE0IDQ5VDI5MyAzM1EzMzAgMzMgMzU4IDQyVDQwNiA2NlQ0NDAgMTAxVDQ2MiAxNDJRNDYzIDE0MyA0NjggMTQzVDQ3OCAxNDBUNDg4IDEzMlQ0OTMgMTE4UTQ5MyAxMDcgNDg1IDg5VDQ1NiA1MFE0MzIgMjYgMzkyIDhUMjkzIC0xMFpNMzAwIDU0NlEyODAgNTQ2IDI3MCA1NTdUMjU5IDU4NlEyNTkgNjAzIDI3MCA2MTRUMzAxIDYyNVEzMjAgNjI1IDMzMSA2MTRUMzQyIDU4NlEzNDIgNTY5IDMzMSA1NThUMzAwIDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGdseXBoLW5hbWU9IkNjYXJvbiIgaG9yaXotYWR2LXg9IjY4NyIgZD0iTTM4MyAtMTBRMzExIC0xMCAyNTIgMTRUMTUyIDgzVDg3IDE4OFQ2NCAzMjJRNjQgMzk1IDg3IDQ1NlQxNTMgNTYyVDI1NCA2MzJUMzg0IDY1N1E0NjAgNjU3IDUxMSA2MzRUNTkxIDU4MVE2MDggNTY0IDYxNyA1NDdUNjI2IDUyMFE2MjYgNTExIDYyMiA1MDVUNjEyIDQ5NVQ2MDIgNDkwVDU5NiA0OTBRNTcwIDU0NCA1MTQgNTc5VDM4MyA2MTRRMzIzIDYxNCAyNzQgNTkzVDE5MCA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjAgMTM0IDIwN1QxODkgMTE2VDI3NSA1NVQzODUgMzNRNDMwIDMzIDQ2NiA0NFQ1MjkgNzVUNTc1IDEyMFQ2MDMgMTcyUTYwNCAxNzMgNjA5IDE3MlQ2MjAgMTY4VDYzMSAxNTlUNjM2IDE0M1E2MzYgMTMyIDYyNiAxMTBUNTkyIDY2UTU2MyAzNyA1MTAgMTRUMzgzIC0xMFpNMzgzIDcwM1EzODEgNzAzIDM2MiA3MTlUMzE2IDc2NlEyOTEgNzk1IDI3OCA4MTNUMjY0IDg0NFEyNjQgODYxIDI3OSA4NjFRMjg5IDg2MSAzMDIgODQ5VDM0NCA3OTlMMzg0IDc0Nkw0MjQgODAwUTQ0OSA4MzMgNDYzIDg0N1Q0ODcgODYxUTUwMyA4NjEgNTAzIDg0NFE1MDMgODMzIDQ5MCA4MTVUNDUyIDc2OFE0MjQgNzM2IDQwNSA3MjBUMzgzIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRDsiIGdseXBoLW5hbWU9ImNjYXJvbiIgaG9yaXotYWR2LXg9IjU0MiIgZD0iTTI5MyAtMTBRMjQwIC0xMCAxOTYgOVQxMjAgNjFUNzAgMTM5VDUyIDIzOFE1MiAyOTAgNzAgMzM1VDEyMCA0MTNUMTk2IDQ2NFQyOTMgNDgzUTM1MyA0ODMgMzkzIDQ2NVQ0NTcgNDIyUTQ3NiA0MDMgNDg0IDM4NVQ0OTMgMzU1UTQ5MyAzNDcgNDg5IDM0MlQ0NzkgMzM0VDQ2OCAzMzFUNDYyIDMzMVE0NTQgMzUyIDQ0MCAzNzJUNDA2IDQwN1QzNTggNDMyVDI5MyA0NDFRMjUxIDQ0MSAyMTYgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM4UTEwMCAxOTQgMTE0IDE1N1QxNTMgOTJUMjE0IDQ5VDI5MyAzM1EzMzAgMzMgMzU4IDQyVDQwNiA2NlQ0NDAgMTAxVDQ2MiAxNDJRNDYzIDE0MyA0NjggMTQzVDQ3OCAxNDBUNDg4IDEzMlQ0OTMgMTE4UTQ5MyAxMDcgNDg1IDg5VDQ1NiA1MFE0MzIgMjYgMzkyIDhUMjkzIC0xMFpNMjk4IDUyOVEyOTYgNTI5IDI3NyA1NDVUMjMxIDU5MlEyMDYgNjIxIDE5MyA2MzlUMTc5IDY3MFExNzkgNjg3IDE5NCA2ODdRMjA0IDY4NyAyMTcgNjc1VDI1OSA2MjVMMjk5IDU3MkwzMzkgNjI2UTM2NCA2NTkgMzc4IDY3M1Q0MDIgNjg3UTQxOCA2ODcgNDE4IDY3MFE0MTggNjU5IDQwNSA2NDFUMzY3IDU5NFEzMzkgNTYyIDMyMCA1NDZUMjk4IDUyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRTsiIGdseXBoLW5hbWU9IkRjYXJvbiIgaG9yaXotYWR2LXg9IjY5MiIgZD0iTTk0IDYxN1E5NCA2MzAgMTAyIDYzOFQxMjMgNjQ3SDI3NlEzNjAgNjQ3IDQyNSA2MjVUNTM2IDU2MlQ2MDUgNDYwVDYyOSAzMjVRNjI5IDI0OSA2MDUgMTg5VDUzNCA4N1Q0MjIgMjNUMjcxIDBIOTRWNjE3Wk0yNzQgNDRRNDIwIDQ0IDQ5OCAxMThUNTc3IDMyNFE1NzcgMzg5IDU1NyA0NDBUNDk4IDUyOFQ0MDMgNTgzVDI3NiA2MDNIMTQ0VjQ0SDI3NFpNMzAzIDcwM1EzMDEgNzAzIDI4MiA3MTlUMjM2IDc2NlEyMTEgNzk1IDE5OCA4MTNUMTg0IDg0NFExODQgODYxIDE5OSA4NjFRMjA5IDg2MSAyMjIgODQ5VDI2NCA3OTlMMzA0IDc0NkwzNDQgODAwUTM2OSA4MzMgMzgzIDg0N1Q0MDcgODYxUTQyMyA4NjEgNDIzIDg0NFE0MjMgODMzIDQxMCA4MTVUMzcyIDc2OFEzNDQgNzM2IDMyNSA3MjBUMzAzIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRjsiIGdseXBoLW5hbWU9ImRjYXJvbiIgaG9yaXotYWR2LXg9Ijc1MSIgZD0iTTI3NyAtMTBRMjI5IC0xMCAxODggOFQxMTcgNThUNjkgMTM1VDUyIDIzN1E1MiAyOTEgNjkgMzM2VDExNiA0MTRUMTg5IDQ2NVQyODAgNDgzUTMxNCA0ODMgMzQzIDQ3NVQzOTYgNDUyVDQzNyA0MjBUNDY0IDM4MVY2NzNRNDY0IDY3OCA0ODAgNjc4UTQ5MyA2NzggNTAyIDY2OVQ1MTIgNjMxVjBINDY0Vjk2UTQzOCA0OCAzOTIgMTlUMjc3IC0xMFpNMjgyIDMyUTMyMCAzMiAzNTMgNDVUNDExIDgyVDQ1MCAxMzZUNDY0IDIwMlYzMTNRNDQyIDM3MSAzOTcgNDA2VDI4MyA0NDFRMjQzIDQ0MSAyMTAgNDI2VDE1MiAzODRUMTE0IDMyMFQxMDAgMjM4UTEwMCAxOTMgMTEzIDE1NVQxNTEgOTBUMjA4IDQ4VDI4MiAzMlpNNjIwIDQ3MFE2MTggNDY3IDYxMyA0NjZUNjA0IDQ2NlQ1OTYgNDcyVDU5NSA0ODJMNjU0IDY1N1E2NTkgNjcxIDY2NCA2NzdUNjgzIDY4NEg2ODdRNjk2IDY4NCA3MDIgNjc3VDcwOSA2NThWNjU1UTcwOSA2NDkgNzA3IDY0MVQ2OTcgNjE5TDYyMCA0NzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTA7IiBnbHlwaC1uYW1lPSJEY3JvYXQiIGhvcml6LWFkdi14PSI3NDEiIGQ9Ik0xNjYgMFExNTMgMCAxNDUgOFQxMzYgMzBWMzAySDYwUTQ2IDMwMiA0MiAzMDdUMzcgMzIxVjMyNlEzNyAzMzUgNDEgMzQwVDYwIDM0NkgxMzZWNjE3UTEzNiA2MzAgMTQ0IDYzOFQxNjYgNjQ3SDMyMlE0MDUgNjQ3IDQ3MSA2MjVUNTgzIDU2MVQ2NTMgNDYwVDY3OCAzMjVRNjc4IDI1MCA2NTMgMTkwVDU4MSA4N1Q0NjggMjNUMzE3IDBIMTY2Wk0zMjMgNDZRNDY5IDQ2IDU0OCAxMTlUNjI3IDMyNFE2MjcgMzg4IDYwNyA0MzlUNTQ5IDUyN1Q0NTQgNTgyVDMyNiA2MDJIMTg2VjM0Nkg0MTNRNDM2IDM0NiA0MzYgMzI2VjMyMVE0MzYgMzAyIDQxMyAzMDJIMTg2VjQ2SDMyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMTsiIGdseXBoLW5hbWU9ImRjcm9hdCIgaG9yaXotYWR2LXg9IjU5NiIgZD0iTTI3NyAtMTBRMjI5IC0xMCAxODggOFQxMTcgNThUNjkgMTM1VDUyIDIzN1E1MiAyOTEgNjkgMzM2VDExNiA0MTRUMTg5IDQ2NVQyODAgNDgzUTMxNCA0ODMgMzQzIDQ3NVQzOTYgNDUyVDQzNyA0MjBUNDY0IDM4MVY1MzlIMzQ5UTMyMCA1MzkgMzIwIDU2MFY1NjNRMzIwIDU4NSAzNDkgNTg1SDQ2NFY2NzNRNDY0IDY3OCA0ODAgNjc4UTQ5MyA2NzggNTAyIDY2OVQ1MTIgNjMxVjU4NUg1NjJRNTkxIDU4NSA1OTEgNTYzVjU2MFE1OTEgNTM5IDU2MiA1MzlINTEyVjBINDY0Vjk2UTQzOCA0OCAzOTIgMTlUMjc3IC0xMFpNMjgyIDMyUTMyMCAzMiAzNTMgNDVUNDExIDgyVDQ1MCAxMzZUNDY0IDIwMlYzMTNRNDQyIDM3MSAzOTcgNDA2VDI4MyA0NDFRMjQzIDQ0MSAyMTAgNDI2VDE1MiAzODRUMTE0IDMyMFQxMDAgMjM4UTEwMCAxOTMgMTEzIDE1NVQxNTEgOTBUMjA4IDQ4VDI4MiAzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMjsiIGdseXBoLW5hbWU9IkVtYWNyb24iIGhvcml6LWFkdi14PSI1OTQiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0g1MzJWNjAySDE0NFYzNTRINDQ5VjMxMEgxNDRWNDZINTQxVjBIOTRWNjE3Wk0yMTIgNzQxUTE4MyA3NDEgMTgzIDc2MlY3NjZRMTgzIDc4NiAyMTIgNzg2SDQxNlE0NDUgNzg2IDQ0NSA3NjZWNzYyUTQ0NSA3NDEgNDE2IDc0MUgyMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTM7IiBnbHlwaC1uYW1lPSJlbWFjcm9uIiBob3Jpei1hZHYteD0iNTU1IiBkPSJNMjk0IC0xMFEyNDAgLTEwIDE5NSA4VDExOSA1OVQ3MCAxMzdUNTIgMjM1UTUyIDI4OCA2OSAzMzNUMTE4IDQxMlQxOTMgNDY0VDI4OCA0ODNRMzM3IDQ4MyAzNzcgNDY3VDQ0NSA0MjBUNDg5IDM0N1Q1MDUgMjUyVjI0N1E1MDUgMjM2IDUwMCAyMzNUNDg0IDIzMEg5OVExMDAgMTg2IDExNCAxNTBUMTU0IDg4VDIxNSA0OFQyOTQgMzNRMzMxIDMzIDM1OCA0MVQ0MDYgNjJUNDQwIDkzVDQ2MyAxMjhRNDY0IDEyOSA0NjggMTI4VDQ3OCAxMjRUNDg3IDExNVQ0OTEgMTAwUTQ5MSA5MiA0ODQgNzlUNDYxIDQ5UTQzOSAyNyAzOTcgOVQyOTQgLTEwWk0yODggNDQxUTI1MSA0NDEgMjIwIDQyOVQxNjQgMzk0VDEyMyAzNDBUMTAxIDI3MUg0NTVRNDUzIDMwOSA0NDEgMzQwVDQwNyAzOTNUMzU1IDQyOFQyODggNDQxWk0xODQgNTY3UTE1NSA1NjcgMTU1IDU4OFY1OTJRMTU1IDYxMiAxODQgNjEySDM4OFE0MTcgNjEyIDQxNyA1OTJWNTg4UTQxNyA1NjcgMzg4IDU2N0gxODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTQ7IiBnbHlwaC1uYW1lPSJFYnJldmUiIGhvcml6LWFkdi14PSI1OTQiIGQ9Ik05NCA2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0g1MzJWNjAySDE0NFYzNTRINDQ5VjMxMEgxNDRWNDZINTQxVjBIOTRWNjE3Wk0zMTUgNzE5UTI4MyA3MTkgMjU4IDczMFQyMTYgNzU5UTIwMCA3NzYgMTkzIDc5M1QxODUgODIwUTE4NSA4MzEgMTkxIDgzOVQyMTQgODQ3UTIyNyA4MDkgMjUzIDc4NlQzMTUgNzYyUTM1MSA3NjIgMzc3IDc4NVQ0MTYgODQ3UTQzMyA4NDcgNDM5IDgzOVQ0NDUgODIwUTQ0NSA4MTAgNDM4IDc5M1Q0MTQgNzU5UTM5NyA3NDIgMzcyIDczMVQzMTUgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE1OyIgZ2x5cGgtbmFtZT0iZWJyZXZlIiBob3Jpei1hZHYteD0iNTU1IiBkPSJNMjk0IC0xMFEyNDAgLTEwIDE5NSA4VDExOSA1OVQ3MCAxMzdUNTIgMjM1UTUyIDI4OCA2OSAzMzNUMTE4IDQxMlQxOTMgNDY0VDI4OCA0ODNRMzM3IDQ4MyAzNzcgNDY3VDQ0NSA0MjBUNDg5IDM0N1Q1MDUgMjUyVjI0N1E1MDUgMjM2IDUwMCAyMzNUNDg0IDIzMEg5OVExMDAgMTg2IDExNCAxNTBUMTU0IDg4VDIxNSA0OFQyOTQgMzNRMzMxIDMzIDM1OCA0MVQ0MDYgNjJUNDQwIDkzVDQ2MyAxMjhRNDY0IDEyOSA0NjggMTI4VDQ3OCAxMjRUNDg3IDExNVQ0OTEgMTAwUTQ5MSA5MiA0ODQgNzlUNDYxIDQ5UTQzOSAyNyAzOTcgOVQyOTQgLTEwWk0yODggNDQxUTI1MSA0NDEgMjIwIDQyOVQxNjQgMzk0VDEyMyAzNDBUMTAxIDI3MUg0NTVRNDUzIDMwOSA0NDEgMzQwVDQwNyAzOTNUMzU1IDQyOFQyODggNDQxWk0yOTAgNTQ1UTI1OCA1NDUgMjMzIDU1NlQxOTEgNTg1UTE3NSA2MDIgMTY4IDYxOVQxNjAgNjQ2UTE2MCA2NTcgMTY2IDY2NVQxODkgNjczUTIwMiA2MzUgMjI4IDYxMlQyOTAgNTg4UTMyNiA1ODggMzUyIDYxMVQzOTEgNjczUTQwOCA2NzMgNDE0IDY2NVQ0MjAgNjQ2UTQyMCA2MzYgNDEzIDYxOVQzODkgNTg1UTM3MiA1NjggMzQ3IDU1N1QyOTAgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE2OyIgZ2x5cGgtbmFtZT0iRWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjU5NCIgZD0iTTk0IDYxN1E5NCA2MzAgMTAyIDYzOFQxMjMgNjQ3SDUzMlY2MDJIMTQ0VjM1NEg0NDlWMzEwSDE0NFY0Nkg1NDFWMEg5NFY2MTdaTTMyMSA3MjBRMzAxIDcyMCAyOTEgNzMxVDI4MCA3NjBRMjgwIDc3NyAyOTEgNzg4VDMyMiA3OTlRMzQxIDc5OSAzNTIgNzg4VDM2MyA3NjBRMzYzIDc0MyAzNTIgNzMyVDMyMSA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTc7IiBnbHlwaC1uYW1lPSJlZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTU1IiBkPSJNMjk0IC0xMFEyNDAgLTEwIDE5NSA4VDExOSA1OVQ3MCAxMzdUNTIgMjM1UTUyIDI4OCA2OSAzMzNUMTE4IDQxMlQxOTMgNDY0VDI4OCA0ODNRMzM3IDQ4MyAzNzcgNDY3VDQ0NSA0MjBUNDg5IDM0N1Q1MDUgMjUyVjI0N1E1MDUgMjM2IDUwMCAyMzNUNDg0IDIzMEg5OVExMDAgMTg2IDExNCAxNTBUMTU0IDg4VDIxNSA0OFQyOTQgMzNRMzMxIDMzIDM1OCA0MVQ0MDYgNjJUNDQwIDkzVDQ2MyAxMjhRNDY0IDEyOSA0NjggMTI4VDQ3OCAxMjRUNDg3IDExNVQ0OTEgMTAwUTQ5MSA5MiA0ODQgNzlUNDYxIDQ5UTQzOSAyNyAzOTcgOVQyOTQgLTEwWk0yODggNDQxUTI1MSA0NDEgMjIwIDQyOVQxNjQgMzk0VDEyMyAzNDBUMTAxIDI3MUg0NTVRNDUzIDMwOSA0NDEgMzQwVDQwNyAzOTNUMzU1IDQyOFQyODggNDQxWk0yODUgNTQ2UTI2NSA1NDYgMjU1IDU1N1QyNDQgNTg2UTI0NCA2MDMgMjU1IDYxNFQyODYgNjI1UTMwNSA2MjUgMzE2IDYxNFQzMjcgNTg2UTMyNyA1NjkgMzE2IDU1OFQyODUgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE4OyIgZ2x5cGgtbmFtZT0iRW9nb25layIgaG9yaXotYWR2LXg9IjU5NCIgZD0iTTk0IDYxN1E5NCA2MzAgMTAyIDYzOFQxMjMgNjQ3SDUzMlY2MDJIMTQ0VjM1NEg0NDlWMzEwSDE0NFY0Nkg1NDFWMEg1MjlRNDgzIC0zMiA0NjYgLTU4VDQ0OSAtMTA1UTQ0OSAtMTI0IDQ2MCAtMTM2VDQ4OSAtMTQ4UTUxNiAtMTQ4IDUyOSAtMTI5UTUzNyAtMTI5IDU0NSAtMTM1VDU1MyAtMTU0UTU1MyAtMTcwIDUzNCAtMTgwVDQ4OCAtMTkwUTQ1MSAtMTkwIDQyOCAtMTcwVDQwNSAtMTE0UTQwNSAtODUgNDIzIC01NlQ0ODQgMEg5NFY2MTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTk7IiBnbHlwaC1uYW1lPSJlb2dvbmVrIiBob3Jpei1hZHYteD0iNTU1IiBkPSJNMjk0IC0xMFEyNDAgLTEwIDE5NSA4VDExOSA1OVQ3MCAxMzdUNTIgMjM1UTUyIDI4OCA2OSAzMzNUMTE4IDQxMlQxOTMgNDY0VDI4OCA0ODNRMzM3IDQ4MyAzNzcgNDY3VDQ0NSA0MjBUNDg5IDM0N1Q1MDUgMjUyVjI0N1E1MDUgMjM2IDUwMCAyMzNUNDg0IDIzMEg5OVExMDAgMTg2IDExNCAxNTBUMTU0IDg4VDIxNSA0OFQyOTQgMzNRMzMxIDMzIDM1OCA0MVQ0MDYgNjJUNDQwIDkzVDQ2MyAxMjhRNDY0IDEyOSA0NjggMTI4VDQ3OCAxMjRUNDg3IDExNVQ0OTEgMTAwUTQ5MSA5MiA0ODQgNzlUNDYxIDQ5UTQ1MyA0MSA0NDEgMzNUNDE1IDE3UTM2NyAtMTYgMzQ5IC00MlQzMzEgLTkxUTMzMSAtMTEwIDM0MiAtMTIyVDM3MSAtMTM0UTM5OCAtMTM0IDQxMSAtMTE1UTQxOSAtMTE1IDQyNyAtMTIxVDQzNSAtMTQwUTQzNSAtMTU2IDQxNiAtMTY2VDM3MCAtMTc2UTMzMyAtMTc2IDMxMCAtMTU2VDI4NyAtMTAwUTI4NyAtNzcgMjk5IC01NFQzMzggLTdRMzE3IC0xMCAyOTQgLTEwWk0yODggNDQxUTI1MSA0NDEgMjIwIDQyOVQxNjQgMzk0VDEyMyAzNDBUMTAxIDI3MUg0NTVRNDUzIDMwOSA0NDEgMzQwVDQwNyAzOTNUMzU1IDQyOFQyODggNDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFBOyIgZ2x5cGgtbmFtZT0iRWNhcm9uIiBob3Jpei1hZHYteD0iNTk0IiBkPSJNOTQgNjE3UTk0IDYzMCAxMDIgNjM4VDEyMyA2NDdINTMyVjYwMkgxNDRWMzU0SDQ0OVYzMTBIMTQ0VjQ2SDU0MVYwSDk0VjYxN1pNMzE3IDcwM1EzMTUgNzAzIDI5NiA3MTlUMjUwIDc2NlEyMjUgNzk1IDIxMiA4MTNUMTk4IDg0NFExOTggODYxIDIxMyA4NjFRMjIzIDg2MSAyMzYgODQ5VDI3OCA3OTlMMzE4IDc0NkwzNTggODAwUTM4MyA4MzMgMzk3IDg0N1Q0MjEgODYxUTQzNyA4NjEgNDM3IDg0NFE0MzcgODMzIDQyNCA4MTVUMzg2IDc2OFEzNTggNzM2IDMzOSA3MjBUMzE3IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQjsiIGdseXBoLW5hbWU9ImVjYXJvbiIgaG9yaXotYWR2LXg9IjU1NSIgZD0iTTI5NCAtMTBRMjQwIC0xMCAxOTUgOFQxMTkgNTlUNzAgMTM3VDUyIDIzNVE1MiAyODggNjkgMzMzVDExOCA0MTJUMTkzIDQ2NFQyODggNDgzUTMzNyA0ODMgMzc3IDQ2N1Q0NDUgNDIwVDQ4OSAzNDdUNTA1IDI1MlYyNDdRNTA1IDIzNiA1MDAgMjMzVDQ4NCAyMzBIOTlRMTAwIDE4NiAxMTQgMTUwVDE1NCA4OFQyMTUgNDhUMjk0IDMzUTMzMSAzMyAzNTggNDFUNDA2IDYyVDQ0MCA5M1Q0NjMgMTI4UTQ2NCAxMjkgNDY4IDEyOFQ0NzggMTI0VDQ4NyAxMTVUNDkxIDEwMFE0OTEgOTIgNDg0IDc5VDQ2MSA0OVE0MzkgMjcgMzk3IDlUMjk0IC0xMFpNMjg4IDQ0MVEyNTEgNDQxIDIyMCA0MjlUMTY0IDM5NFQxMjMgMzQwVDEwMSAyNzFINDU1UTQ1MyAzMDkgNDQxIDM0MFQ0MDcgMzkzVDM1NSA0MjhUMjg4IDQ0MVpNMjgzIDUyOVEyODEgNTI5IDI2MiA1NDVUMjE2IDU5MlExOTEgNjIxIDE3OCA2MzlUMTY0IDY3MFExNjQgNjg3IDE3OSA2ODdRMTg5IDY4NyAyMDIgNjc1VDI0NCA2MjVMMjg0IDU3MkwzMjQgNjI2UTM0OSA2NTkgMzYzIDY3M1QzODcgNjg3UTQwMyA2ODcgNDAzIDY3MFE0MDMgNjU5IDM5MCA2NDFUMzUyIDU5NFEzMjQgNTYyIDMwNSA1NDZUMjgzIDUyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQzsiIGdseXBoLW5hbWU9IkdjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNzI0IiBkPSJNMzY4IC0xMFEyOTggLTEwIDI0MiAxNVQxNDYgODRUODUgMTg5VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MiA1NjJUMjUyIDYzMlQzODIgNjU3UTQ1NiA2NTcgNTA3IDYzNFQ1ODYgNTgzUTYwNCA1NjUgNjEyIDU0OVQ2MjEgNTI0UTYyMSA1MTMgNjE3IDUwN1Q2MDcgNDk4VDU5NyA0OTVUNTkxIDQ5NVE1NzkgNTIwIDU1OSA1NDFUNTExIDU3OVQ0NTEgNjA0VDM4MCA2MTRRMzIxIDYxNCAyNzMgNTkzVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjEgMTMyIDIwOFQxODMgMTE2VDI2NSA1NVQzNzQgMzNRNDIyIDMzIDQ2MiA0N1Q1MzMgODhUNTgyIDE1MVQ2MDUgMjI5VjI3M0gzODFWMzE4SDYxMlE2MjkgMzE4IDYzOSAzMDhUNjQ5IDI4MFYyUTY0OSAxIDY0NSAtMVQ2MzMgLTNRNjIwIC0zIDYxMyA2VDYwNSA0NlYxMjZRNTc5IDYzIDUxNyAyN1QzNjggLTEwWk0yNjYgNzE5UTI1MCA3MTkgMjUwIDczNlEyNTAgNzQ3IDI2MyA3NjVUMzAxIDgxMlEzMzAgODQ0IDM0OSA4NjBUMzcwIDg3N1EzNzIgODc3IDM5MSA4NjFUNDM3IDgxNFE0NjIgNzg1IDQ3NSA3NjdUNDg5IDczNlE0ODkgNzE5IDQ3NCA3MTlRNDY0IDcxOSA0NTEgNzMxVDQwOSA3ODFMMzY5IDgzNEwzMjkgNzgwUTMwNCA3NDYgMjkwIDczM1QyNjYgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFEOyIgZ2x5cGgtbmFtZT0iZ2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1OTYiIGQ9Ik0yOTEgLTE5N1EyMjcgLTE5NyAxODMgLTE3OVQxMTIgLTEzNFE5OCAtMTIwIDkxIC0xMDZUODMgLTgyUTgzIC03MyA4NyAtNjdUOTYgLTU3VDEwNSAtNTJUMTExIC01MlExMjAgLTcyIDEzNSAtOTBUMTczIC0xMjNUMjI0IC0xNDVUMjkyIC0xNTRRNDY0IC0xNTQgNDY0IDI2VjEwN1E0MzggNjEgMzkyIDM0VDI3NyA2UTIyNyA2IDE4NiAyM1QxMTUgNzFUNjkgMTQ2VDUyIDI0NFE1MiAyOTYgNjkgMzM5VDExOCA0MTVUMTkwIDQ2NVQyODAgNDgzUTM1MCA0ODMgMzk3IDQ1NFQ0NjQgMzg0VjQ3M0g1MTJWMjZRNTEyIC04NiA0NTQgLTE0MVQyOTEgLTE5N1pNMjgyIDQ3UTMxOSA0NyAzNTIgNTlUNDEwIDk0VDQ0OSAxNDdUNDY0IDIxM1YzMTRRNDQyIDM3MiAzOTggNDA2VDI4MyA0NDFRMjQzIDQ0MSAyMTAgNDI3VDE1MiAzODZUMTE0IDMyM1QxMDAgMjQ1UTEwMCAyMDAgMTEzIDE2NFQxNTAgMTAxVDIwNyA2MVQyODIgNDdaTTE4NSA1NDVRMTY5IDU0NSAxNjkgNTYyUTE2OSA1NzMgMTgyIDU5MVQyMjAgNjM4UTI0OSA2NzAgMjY4IDY4NlQyODkgNzAzUTI5MSA3MDMgMzEwIDY4N1QzNTYgNjQwUTM4MSA2MTEgMzk0IDU5M1Q0MDggNTYyUTQwOCA1NDUgMzkzIDU0NVEzODMgNTQ1IDM3MCA1NTdUMzI4IDYwN0wyODggNjYwTDI0OCA2MDZRMjIzIDU3MiAyMDkgNTU5VDE4NSA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBnbHlwaC1uYW1lPSJHYnJldmUiIGhvcml6LWFkdi14PSI3MjQiIGQ9Ik0zNjggLTEwUTI5OCAtMTAgMjQyIDE1VDE0NiA4NFQ4NSAxODlUNjQgMzIyUTY0IDM5NSA4NyA0NTZUMTUyIDU2MlQyNTIgNjMyVDM4MiA2NTdRNDU2IDY1NyA1MDcgNjM0VDU4NiA1ODNRNjA0IDU2NSA2MTIgNTQ5VDYyMSA1MjRRNjIxIDUxMyA2MTcgNTA3VDYwNyA0OThUNTk3IDQ5NVQ1OTEgNDk1UTU3OSA1MjAgNTU5IDU0MVQ1MTEgNTc5VDQ1MSA2MDRUMzgwIDYxNFEzMjEgNjE0IDI3MyA1OTNUMTg5IDUzMlQxMzUgNDQwVDExNSAzMjNRMTE1IDI2MSAxMzIgMjA4VDE4MyAxMTZUMjY1IDU1VDM3NCAzM1E0MjIgMzMgNDYyIDQ3VDUzMyA4OFQ1ODIgMTUxVDYwNSAyMjlWMjczSDM4MVYzMThINjEyUTYyOSAzMTggNjM5IDMwOFQ2NDkgMjgwVjJRNjQ5IDEgNjQ1IC0xVDYzMyAtM1E2MjAgLTMgNjEzIDZUNjA1IDQ2VjEyNlE1NzkgNjMgNTE3IDI3VDM2OCAtMTBaTTM3NCA3MTlRMzQyIDcxOSAzMTcgNzMwVDI3NSA3NTlRMjU5IDc3NiAyNTIgNzkzVDI0NCA4MjBRMjQ0IDgzMSAyNTAgODM5VDI3MyA4NDdRMjg2IDgwOSAzMTIgNzg2VDM3NCA3NjJRNDEwIDc2MiA0MzYgNzg1VDQ3NSA4NDdRNDkyIDg0NyA0OTggODM5VDUwNCA4MjBRNTA0IDgxMCA0OTcgNzkzVDQ3MyA3NTlRNDU2IDc0MiA0MzEgNzMxVDM3NCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUY7IiBnbHlwaC1uYW1lPSJnYnJldmUiIGhvcml6LWFkdi14PSI1OTYiIGQ9Ik0yOTEgLTE5N1EyMjcgLTE5NyAxODMgLTE3OVQxMTIgLTEzNFE5OCAtMTIwIDkxIC0xMDZUODMgLTgyUTgzIC03MyA4NyAtNjdUOTYgLTU3VDEwNSAtNTJUMTExIC01MlExMjAgLTcyIDEzNSAtOTBUMTczIC0xMjNUMjI0IC0xNDVUMjkyIC0xNTRRNDY0IC0xNTQgNDY0IDI2VjEwN1E0MzggNjEgMzkyIDM0VDI3NyA2UTIyNyA2IDE4NiAyM1QxMTUgNzFUNjkgMTQ2VDUyIDI0NFE1MiAyOTYgNjkgMzM5VDExOCA0MTVUMTkwIDQ2NVQyODAgNDgzUTM1MCA0ODMgMzk3IDQ1NFQ0NjQgMzg0VjQ3M0g1MTJWMjZRNTEyIC04NiA0NTQgLTE0MVQyOTEgLTE5N1pNMjgyIDQ3UTMxOSA0NyAzNTIgNTlUNDEwIDk0VDQ0OSAxNDdUNDY0IDIxM1YzMTRRNDQyIDM3MiAzOTggNDA2VDI4MyA0NDFRMjQzIDQ0MSAyMTAgNDI3VDE1MiAzODZUMTE0IDMyM1QxMDAgMjQ1UTEwMCAyMDAgMTEzIDE2NFQxNTAgMTAxVDIwNyA2MVQyODIgNDdaTTI4OCA1NDVRMjU2IDU0NSAyMzEgNTU2VDE4OSA1ODVRMTczIDYwMiAxNjYgNjE5VDE1OCA2NDZRMTU4IDY1NyAxNjQgNjY1VDE4NyA2NzNRMjAwIDYzNSAyMjYgNjEyVDI4OCA1ODhRMzI0IDU4OCAzNTAgNjExVDM4OSA2NzNRNDA2IDY3MyA0MTIgNjY1VDQxOCA2NDZRNDE4IDYzNiA0MTEgNjE5VDM4NyA1ODVRMzcwIDU2OCAzNDUgNTU3VDI4OCA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjA7IiBnbHlwaC1uYW1lPSJHZG90YWNjZW50IiBob3Jpei1hZHYteD0iNzI0IiBkPSJNMzY4IC0xMFEyOTggLTEwIDI0MiAxNVQxNDYgODRUODUgMTg5VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MiA1NjJUMjUyIDYzMlQzODIgNjU3UTQ1NiA2NTcgNTA3IDYzNFQ1ODYgNTgzUTYwNCA1NjUgNjEyIDU0OVQ2MjEgNTI0UTYyMSA1MTMgNjE3IDUwN1Q2MDcgNDk4VDU5NyA0OTVUNTkxIDQ5NVE1NzkgNTIwIDU1OSA1NDFUNTExIDU3OVQ0NTEgNjA0VDM4MCA2MTRRMzIxIDYxNCAyNzMgNTkzVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjEgMTMyIDIwOFQxODMgMTE2VDI2NSA1NVQzNzQgMzNRNDIyIDMzIDQ2MiA0N1Q1MzMgODhUNTgyIDE1MVQ2MDUgMjI5VjI3M0gzODFWMzE4SDYxMlE2MjkgMzE4IDYzOSAzMDhUNjQ5IDI4MFYyUTY0OSAxIDY0NSAtMVQ2MzMgLTNRNjIwIC0zIDYxMyA2VDYwNSA0NlYxMjZRNTc5IDYzIDUxNyAyN1QzNjggLTEwWk0zNzYgNzIwUTM1NiA3MjAgMzQ2IDczMVQzMzUgNzYwUTMzNSA3NzcgMzQ2IDc4OFQzNzcgNzk5UTM5NiA3OTkgNDA3IDc4OFQ0MTggNzYwUTQxOCA3NDMgNDA3IDczMlQzNzYgNzIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIxOyIgZ2x5cGgtbmFtZT0iZ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjU5NiIgZD0iTTI5MSAtMTk3UTIyNyAtMTk3IDE4MyAtMTc5VDExMiAtMTM0UTk4IC0xMjAgOTEgLTEwNlQ4MyAtODJRODMgLTczIDg3IC02N1Q5NiAtNTdUMTA1IC01MlQxMTEgLTUyUTEyMCAtNzIgMTM1IC05MFQxNzMgLTEyM1QyMjQgLTE0NVQyOTIgLTE1NFE0NjQgLTE1NCA0NjQgMjZWMTA3UTQzOCA2MSAzOTIgMzRUMjc3IDZRMjI3IDYgMTg2IDIzVDExNSA3MVQ2OSAxNDZUNTIgMjQ0UTUyIDI5NiA2OSAzMzlUMTE4IDQxNVQxOTAgNDY1VDI4MCA0ODNRMzUwIDQ4MyAzOTcgNDU0VDQ2NCAzODRWNDczSDUxMlYyNlE1MTIgLTg2IDQ1NCAtMTQxVDI5MSAtMTk3Wk0yODIgNDdRMzE5IDQ3IDM1MiA1OVQ0MTAgOTRUNDQ5IDE0N1Q0NjQgMjEzVjMxNFE0NDIgMzcyIDM5OCA0MDZUMjgzIDQ0MVEyNDMgNDQxIDIxMCA0MjdUMTUyIDM4NlQxMTQgMzIzVDEwMCAyNDVRMTAwIDIwMCAxMTMgMTY0VDE1MCAxMDFUMjA3IDYxVDI4MiA0N1pNMjkxIDU0NlEyNzEgNTQ2IDI2MSA1NTdUMjUwIDU4NlEyNTAgNjAzIDI2MSA2MTRUMjkyIDYyNVEzMTEgNjI1IDMyMiA2MTRUMzMzIDU4NlEzMzMgNTY5IDMyMiA1NThUMjkxIDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMjsiIGdseXBoLW5hbWU9Ikdjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjcyNCIgZD0iTTM2OCAtMTBRMjk4IC0xMCAyNDIgMTVUMTQ2IDg0VDg1IDE4OVQ2NCAzMjJRNjQgMzk1IDg3IDQ1NlQxNTIgNTYyVDI1MiA2MzJUMzgyIDY1N1E0NTYgNjU3IDUwNyA2MzRUNTg2IDU4M1E2MDQgNTY1IDYxMiA1NDlUNjIxIDUyNFE2MjEgNTEzIDYxNyA1MDdUNjA3IDQ5OFQ1OTcgNDk1VDU5MSA0OTVRNTc5IDUyMCA1NTkgNTQxVDUxMSA1NzlUNDUxIDYwNFQzODAgNjE0UTMyMSA2MTQgMjczIDU5M1QxODkgNTMyVDEzNSA0NDBUMTE1IDMyM1ExMTUgMjYxIDEzMiAyMDhUMTgzIDExNlQyNjUgNTVUMzc0IDMzUTQyMiAzMyA0NjIgNDdUNTMzIDg4VDU4MiAxNTFUNjA1IDIyOVYyNzNIMzgxVjMxOEg2MTJRNjI5IDMxOCA2MzkgMzA4VDY0OSAyODBWMlE2NDkgMSA2NDUgLTFUNjMzIC0zUTYyMCAtMyA2MTMgNlQ2MDUgNDZWMTI2UTU3OSA2MyA1MTcgMjdUMzY4IC0xMFpNMzE5IC0yNzBRMzE3IC0yNzMgMzEyIC0yNzRUMzAzIC0yNzRUMjk1IC0yNjlUMjk0IC0yNTlMMzU2IC05NFEzNjEgLTgwIDM2NiAtNzRUMzg1IC02N0gzODlRMzk4IC02NyA0MDQgLTczVDQxMSAtOTNWLTk2UTQxMSAtMTAyIDQwOSAtMTEwVDM5OSAtMTMzTDMxOSAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIzOyIgZ2x5cGgtbmFtZT0iZ2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTk2IiBkPSJNMjkxIC0xOTdRMjI3IC0xOTcgMTgzIC0xNzlUMTEyIC0xMzRROTggLTEyMCA5MSAtMTA2VDgzIC04MlE4MyAtNzMgODcgLTY3VDk2IC01N1QxMDUgLTUyVDExMSAtNTJRMTIwIC03MiAxMzUgLTkwVDE3MyAtMTIzVDIyNCAtMTQ1VDI5MiAtMTU0UTQ2NCAtMTU0IDQ2NCAyNlYxMDdRNDM4IDYxIDM5MiAzNFQyNzcgNlEyMjcgNiAxODYgMjNUMTE1IDcxVDY5IDE0NlQ1MiAyNDRRNTIgMjk2IDY5IDMzOVQxMTggNDE1VDE5MCA0NjVUMjgwIDQ4M1EzNTAgNDgzIDM5NyA0NTRUNDY0IDM4NFY0NzNINTEyVjI2UTUxMiAtODYgNDU0IC0xNDFUMjkxIC0xOTdaTTI4MiA0N1EzMTkgNDcgMzUyIDU5VDQxMCA5NFQ0NDkgMTQ3VDQ2NCAyMTNWMzE0UTQ0MiAzNzIgMzk4IDQwNlQyODMgNDQxUTI0MyA0NDEgMjEwIDQyN1QxNTIgMzg2VDExNCAzMjNUMTAwIDI0NVExMDAgMjAwIDExMyAxNjRUMTUwIDEwMVQyMDcgNjFUMjgyIDQ3Wk0zMjIgNzM1UTMyNCA3MzggMzI5IDczOVQzMzggNzM5VDM0NiA3MzRUMzQ3IDcyNEwyODUgNTU5UTI4MCA1NDUgMjc1IDUzOVQyNTYgNTMySDI1MlEyNDMgNTMyIDIzNyA1MzhUMjMwIDU1OFY1NjFRMjMwIDU2NyAyMzIgNTc1VDI0MiA1OThMMzIyIDczNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNDsiIGdseXBoLW5hbWU9IkhjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNzAyIiBkPSJNOTQgNjI3UTk0IDY1MCAxMTUgNjUwSDEyMlExNDQgNjUwIDE0NCA2MjdWMzQ3SDU1OFY2MjdRNTU4IDY1MCA1NzkgNjUwSDU4NlE2MDggNjUwIDYwOCA2MjdWMEg1NThWMzAxSDE0NFYwSDk0VjYyN1pNMjQ3IDcxOVEyMzEgNzE5IDIzMSA3MzZRMjMxIDc0NyAyNDQgNzY1VDI4MiA4MTJRMzExIDg0NCAzMzAgODYwVDM1MSA4NzdRMzUzIDg3NyAzNzIgODYxVDQxOCA4MTRRNDQzIDc4NSA0NTYgNzY3VDQ3MCA3MzZRNDcwIDcxOSA0NTUgNzE5UTQ0NSA3MTkgNDMyIDczMVQzOTAgNzgxTDM1MCA4MzRMMzEwIDc4MFEyODUgNzQ2IDI3MSA3MzNUMjQ3IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNTsiIGdseXBoLW5hbWU9ImhjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNODQgNjczUTg0IDY3OCAxMDAgNjc4UTExMyA2NzggMTIyIDY2OVQxMzIgNjMxVjM4MFExNTMgNDI2IDE5NyA0NTRUMzAwIDQ4M1EzNDggNDgzIDM4MyA0NjhUNDQzIDQyNVQ0NzkgMzU5VDQ5MSAyNzJWMEg0NDNWMjY5UTQ0MyAzNDggNDA2IDM5M1QyOTcgNDM4UTI2MiA0MzggMjMyIDQyNlQxNzkgMzkzVDE0NSAzNDBUMTMyIDI3MlYwSDg0VjY3M1pNMSA3MTlRLTE1IDcxOSAtMTUgNzM2US0xNSA3NDcgLTIgNzY1VDM2IDgxMlE2NSA4NDQgODQgODYwVDEwNSA4NzdRMTA3IDg3NyAxMjYgODYxVDE3MiA4MTRRMTk3IDc4NSAyMTAgNzY3VDIyNCA3MzZRMjI0IDcxOSAyMDkgNzE5UTE5OSA3MTkgMTg2IDczMVQxNDQgNzgxTDEwNCA4MzRMNjQgNzgwUTM5IDc0NiAyNSA3MzNUMSA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjY7IiBnbHlwaC1uYW1lPSJIYmFyIiBob3Jpei1hZHYteD0iNzAyIiBkPSJNNTQgNDcwUTI1IDQ3MCAyNSA0OTBWNDk0UTI1IDUxMyA1NCA1MTNIOTRWNjI3UTk0IDY1MCAxMTUgNjUwSDEyMlExNDQgNjUwIDE0NCA2MjdWNTEzSDU1OFY2MjdRNTU4IDY1MCA1NzkgNjUwSDU4NlE2MDggNjUwIDYwOCA2MjdWNTEzSDY0N1E2NzYgNTEzIDY3NiA0OTRWNDkwUTY3NiA0NzAgNjQ3IDQ3MEg2MDhWMEg1NThWMzAxSDE0NFYwSDk0VjQ3MEg1NFpNNTU4IDM0N1Y0NzBIMTQ0VjM0N0g1NThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjc7IiBnbHlwaC1uYW1lPSJoYmFyIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMzQgNTM5UTUgNTM5IDUgNTYwVjU2NFE1IDU4NSAzNCA1ODVIODRWNjczUTg0IDY3OCAxMDAgNjc4UTExMyA2NzggMTIyIDY2OVQxMzIgNjMxVjU4NUgyNDdRMjc2IDU4NSAyNzYgNTY0VjU2MFEyNzYgNTM5IDI0NyA1MzlIMTMyVjM4MFExNTMgNDI2IDE5NyA0NTRUMzAwIDQ4M1EzNDggNDgzIDM4MyA0NjhUNDQzIDQyNVQ0NzkgMzU5VDQ5MSAyNzJWMEg0NDNWMjY5UTQ0MyAzNDggNDA2IDM5M1QyOTcgNDM4UTI2MiA0MzggMjMyIDQyNlQxNzkgMzkzVDE0NSAzNDBUMTMyIDI3MlYwSDg0VjUzOUgzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyODsiIGdseXBoLW5hbWU9Ikl0aWxkZSIgaG9yaXotYWR2LXg9IjI1NyIgZD0iTTEwNCA2MjdRMTA0IDY1MCAxMjUgNjUwSDEzMlExNTQgNjUwIDE1NCA2MjdWMEgxMDRWNjI3Wk0xOTAgNjY5UTE2NSA2NjkgMTQ3IDY4MVQxMTMgNzEwUTk4IDcyNSA4OCA3MzJUNjcgNzM5UTUyIDczOSA0NSA3MjhUMzMgNjk3UTMwIDY4NiAyNiA2ODBUMTIgNjc0UTQgNjc0IC02IDY4MVEtMyA3MjYgMTUgNzUzVDY4IDc4MFE5NCA3ODAgMTEyIDc2OFQxNDUgNzM4UTE2MCA3MjMgMTcwIDcxNlQxOTIgNzA5UTIwNiA3MDkgMjEzIDcyMFQyMjYgNzUxUTIyOSA3NjIgMjMzIDc2OFQyNDcgNzc0UTI1NSA3NzQgMjY0IDc2N1EyNjIgNzIyIDI0NCA2OTZUMTkwIDY2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyOTsiIGdseXBoLW5hbWU9Iml0aWxkZSIgaG9yaXotYWR2LXg9IjIyNiIgZD0iTTg5IDQ1M1E4OSA0NjcgOTUgNDcxVDExMCA0NzZIMTE2UTEyNSA0NzYgMTMxIDQ3MlQxMzcgNDUzVjBIODlWNDUzWk0xNzQgNTQ0UTE0OSA1NDQgMTMxIDU1NlQ5NyA1ODVRODIgNjAwIDcyIDYwN1Q1MSA2MTRRMzYgNjE0IDI5IDYwM1QxNyA1NzJRMTQgNTYxIDEwIDU1NVQtNCA1NDlRLTEyIDU0OSAtMjIgNTU2US0xOSA2MDEgLTEgNjI4VDUyIDY1NVE3OCA2NTUgOTYgNjQzVDEyOSA2MTNRMTQ0IDU5OCAxNTQgNTkxVDE3NiA1ODRRMTkwIDU4NCAxOTcgNTk1VDIxMCA2MjZRMjEzIDYzNyAyMTcgNjQzVDIzMSA2NDlRMjM5IDY0OSAyNDggNjQyUTI0NiA1OTcgMjI4IDU3MVQxNzQgNTQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJBOyIgZ2x5cGgtbmFtZT0iSW1hY3JvbiIgaG9yaXotYWR2LXg9IjI1NyIgZD0iTTEwNCA2MjdRMTA0IDY1MCAxMjUgNjUwSDEzMlExNTQgNjUwIDE1NCA2MjdWMEgxMDRWNjI3Wk0yNyA3NDFRLTIgNzQxIC0yIDc2MlY3NjZRLTIgNzg2IDI3IDc4NkgyMzFRMjYwIDc4NiAyNjAgNzY2Vjc2MlEyNjAgNzQxIDIzMSA3NDFIMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkI7IiBnbHlwaC1uYW1lPSJpbWFjcm9uIiBob3Jpei1hZHYteD0iMjI2IiBkPSJNODkgNDUzUTg5IDQ2NyA5NSA0NzFUMTEwIDQ3NkgxMTZRMTI1IDQ3NiAxMzEgNDcyVDEzNyA0NTNWMEg4OVY0NTNaTTExIDU2N1EtMTggNTY3IC0xOCA1ODhWNTkyUS0xOCA2MTIgMTEgNjEySDIxNVEyNDQgNjEyIDI0NCA1OTJWNTg4UTI0NCA1NjcgMjE1IDU2N0gxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRTsiIGdseXBoLW5hbWU9IklvZ29uZWsiIGhvcml6LWFkdi14PSIyNTciIGQ9Ik0xMDQgNjI5UTEwNCA2NTAgMTI1IDY1MEgxMzFRMTQzIDY1MCAxNDggNjQ0VDE1NCA2MjlWMEgxNDRROTYgLTMzIDc4IC01OVQ2MCAtMTA4UTYwIC0xMjcgNzEgLTEzOVQxMDAgLTE1MVExMjcgLTE1MSAxNDAgLTEzMlExNDggLTEzMiAxNTYgLTEzOFQxNjQgLTE1N1ExNjQgLTE3MyAxNDUgLTE4M1Q5OSAtMTkzUTYyIC0xOTMgMzkgLTE3M1QxNiAtMTE3UTE2IC04NyAzNiAtNTdUMTA0IDJWNjI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJGOyIgZ2x5cGgtbmFtZT0iaW9nb25layIgaG9yaXotYWR2LXg9IjIyNiIgZD0iTTEyNyAwUTc5IC0zMyA2MSAtNTlUNDMgLTEwOFE0MyAtMTI3IDU0IC0xMzlUODMgLTE1MVExMTAgLTE1MSAxMjMgLTEzMlExMzEgLTEzMiAxMzkgLTEzOFQxNDcgLTE1N1ExNDcgLTE3MyAxMjggLTE4M1Q4MiAtMTkzUTQ1IC0xOTMgMjIgLTE3M1QtMSAtMTE3US0xIC04NyAyMCAtNTZUODkgNFY0NTNRODkgNDY3IDk1IDQ3MVQxMTAgNDc2SDExNlExMjUgNDc2IDEzMSA0NzJUMTM3IDQ1M1YwSDEyN1pNMTEyIDYwMVE4MCA2MDEgODAgNjM0UTgwIDY2OCAxMTQgNjY4UTE0NyA2NjggMTQ3IDYzNFExNDcgNjAxIDExMiA2MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzA7IiBnbHlwaC1uYW1lPSJJZG90YWNjZW50IiBob3Jpei1hZHYteD0iMjU3IiBkPSJNMTA0IDYyN1ExMDQgNjUwIDEyNSA2NTBIMTMyUTE1NCA2NTAgMTU0IDYyN1YwSDEwNFY2MjdaTTEzMCA3MTlRMTEwIDcxOSAxMDAgNzMwVDg5IDc1OVE4OSA3NzYgMTAwIDc4N1QxMzEgNzk4UTE1MCA3OTggMTYxIDc4N1QxNzIgNzU5UTE3MiA3NDIgMTYxIDczMVQxMzAgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMxOyIgZ2x5cGgtbmFtZT0iZG90bGVzc2kiIGhvcml6LWFkdi14PSIyMjYiIGQ9Ik04OSA0NTNRODkgNDY3IDk1IDQ3MVQxMTAgNDc2SDExNlExMjUgNDc2IDEzMSA0NzJUMTM3IDQ1M1YwSDg5VjQ1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMjsiIGdseXBoLW5hbWU9IklKIiBob3Jpei1hZHYteD0iNzIzIiBkPSJNMTA0IDYyN1ExMDQgNjUwIDEyNSA2NTBIMTMyUTE1NCA2NTAgMTU0IDYyN1YwSDEwNFY2MjdaTTQ1NyAtMTBRNDE4IC0xMCAzODkgMVQzMzkgMjdUMzA4IDYwVDI5NyA4OFEyOTcgOTUgMzAxIDEwMVQzMTAgMTEyVDMyMCAxMTdUMzI2IDExOFEzNDEgODEgMzc1IDU3VDQ1NyAzM1E1MjcgMzMgNTU4IDczVDU5MCAyMDNWNjQ3SDY0MFYyMDNRNjQwIDk0IDU5NiA0MlQ0NTcgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMzOyIgZ2x5cGgtbmFtZT0iaWoiIGhvcml6LWFkdi14PSI0NTIiIGQ9Ik04OSA0NTNRODkgNDY3IDk1IDQ3MVQxMTAgNDc2SDExNlExMjUgNDc2IDEzMSA0NzJUMTM3IDQ1M1YwSDg5VjQ1M1pNMTEyIDYwMVE4MCA2MDEgODAgNjM0UTgwIDY2OCAxMTQgNjY4UTE0NyA2NjggMTQ3IDYzNFExNDcgNjAxIDExMiA2MDFaTTI0MSAtMTkwUTIxNSAtMTkwIDE5NyAtMTg0VDE2OCAtMTY3UTE1OCAtMTU3IDE1OCAtMTQ3UTE1OCAtMTM2IDE2NCAtMTI4VDE3MiAtMTIwUTE4MyAtMTMxIDIwMCAtMTM5VDI0MSAtMTQ4UTMxNSAtMTQ4IDMxNSAtNTBWNDczSDM2M1YtNTNRMzYzIC0xMTkgMzMyIC0xNTRUMjQxIC0xOTBaTTMzOCA2MDFRMzA2IDYwMSAzMDYgNjM0UTMwNiA2NjggMzQwIDY2OFEzNzMgNjY4IDM3MyA2MzRRMzczIDYwMSAzMzggNjAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgZ2x5cGgtbmFtZT0iSmNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI0NjYiIGQ9Ik0yMDAgLTEwUTE2MSAtMTAgMTMyIDFUODIgMjdUNTEgNjBUNDAgODhRNDAgOTUgNDQgMTAxVDUzIDExMlQ2MyAxMTdUNjkgMTE4UTg0IDgxIDExOCA1N1QyMDAgMzNRMjcwIDMzIDMwMSA3M1QzMzMgMjAzVjY0N0gzODNWMjAzUTM4MyA5NCAzMzkgNDJUMjAwIC0xMFpNMjQ5IDcxOVEyMzMgNzE5IDIzMyA3MzZRMjMzIDc0NyAyNDYgNzY1VDI4NCA4MTJRMzEzIDg0NCAzMzIgODYwVDM1MyA4NzdRMzU1IDg3NyAzNzQgODYxVDQyMCA4MTRRNDQ1IDc4NSA0NTggNzY3VDQ3MiA3MzZRNDcyIDcxOSA0NTcgNzE5UTQ0NyA3MTkgNDM0IDczMVQzOTIgNzgxTDM1MiA4MzRMMzEyIDc4MFEyODcgNzQ2IDI3MyA3MzNUMjQ5IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGdseXBoLW5hbWU9ImpjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjI2IiBkPSJNMTUgLTE5MFEtMTEgLTE5MCAtMjkgLTE4NFQtNTggLTE2N1EtNjggLTE1NyAtNjggLTE0N1EtNjggLTEzNiAtNjIgLTEyOFQtNTQgLTEyMFEtNDMgLTEzMSAtMjYgLTEzOVQxNSAtMTQ4UTg5IC0xNDggODkgLTUwVjQ3M0gxMzdWLTUzUTEzNyAtMTE5IDEwNiAtMTU0VDE1IC0xOTBaTTkgNTQ1US03IDU0NSAtNyA1NjJRLTcgNTczIDYgNTkxVDQ0IDYzOFE3MyA2NzAgOTIgNjg2VDExMyA3MDNRMTE1IDcwMyAxMzQgNjg3VDE4MCA2NDBRMjA1IDYxMSAyMTggNTkzVDIzMiA1NjJRMjMyIDU0NSAyMTcgNTQ1UTIwNyA1NDUgMTk0IDU1N1QxNTIgNjA3TDExMiA2NjBMNzIgNjA2UTQ3IDU3MiAzMyA1NTlUOSA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzY7IiBnbHlwaC1uYW1lPSJLY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1NjIiIGQ9Ik05NCA2MjdROTQgNjUwIDExNSA2NTBIMTIyUTE0NCA2NTAgMTQ0IDYyN1YzMzdMNDUxIDYzNVE0NjMgNjQ3IDQ3MyA2NDlUNDkxIDY0OFQ1MDIgNjM4VDUwNSA2MjRMMTk5IDMzMkw1MTQgMjNRNTE1IDE1IDUxMCA4VDQ5NyAtMlQ0NzkgLTNUNDU5IDlMMTQ0IDMyNVYwSDk0VjYyN1pNMjE0IC0yNzBRMjEyIC0yNzMgMjA3IC0yNzRUMTk4IC0yNzRUMTkwIC0yNjlUMTg5IC0yNTlMMjUxIC05NFEyNTYgLTgwIDI2MSAtNzRUMjgwIC02N0gyODRRMjkzIC02NyAyOTkgLTczVDMwNiAtOTNWLTk2UTMwNiAtMTAyIDMwNCAtMTEwVDI5NCAtMTMzTDIxNCAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM3OyIgZ2x5cGgtbmFtZT0ia2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNDU5IiBkPSJNODQgNjczUTg0IDY3OCAxMDAgNjc4UTExMyA2NzggMTIyIDY2OVQxMzIgNjMxVjI1NUwzNDggNDU3UTM2MyA0NzIgMzc0IDQ3NFQzOTIgNDc0VDQwMiA0NjRUNDA1IDQ1M0wxODUgMjUyTDQzMyAyMlE0MzMgMTggNDMwIDExVDQyMCAwVDQwMiAtMlQzNzYgMTZMMTMyIDI0NFYwSDg0VjY3M1pNMTczIC0yNzBRMTcxIC0yNzMgMTY2IC0yNzRUMTU3IC0yNzRUMTQ5IC0yNjlUMTQ4IC0yNTlMMjEwIC05NFEyMTUgLTgwIDIyMCAtNzRUMjM5IC02N0gyNDNRMjUyIC02NyAyNTggLTczVDI2NSAtOTNWLTk2UTI2NSAtMTAyIDI2MyAtMTEwVDI1MyAtMTMzTDE3MyAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM5OyIgZ2x5cGgtbmFtZT0iTGFjdXRlIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNOTQgNjI3UTk0IDY1MCAxMTUgNjUwSDEyMlExNDQgNjUwIDE0NCA2MjdWNDZINDYxUTQ4NCA0NiA0ODQgMjVWMjFRNDg0IDAgNDYxIDBIOTRWNjI3Wk0xMTAgNzIxUTEwOSA3MjIgMTE3IDczMlQxNDAgNzU5VDE3NiA3OTRUMjI0IDgzM1EyNDEgODQ2IDI1MSA4NTBUMjY5IDg1NVEyNzggODU1IDI4NCA4NTBUMjkxIDgzNVEyOTEgODI1IDI4MyA4MTZUMjUzIDc4OVEyMjYgNzY5IDIwMSA3NTZUMTU2IDczNFQxMjQgNzIyVDExMCA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0E7IiBnbHlwaC1uYW1lPSJsYWN1dGUiIGhvcml6LWFkdi14PSIyMjYiIGQ9Ik04OSA2NzNRODkgNjc4IDEwNSA2NzhRMTE4IDY3OCAxMjcgNjY5VDEzNyA2MzFWMEg4OVY2NzNaTTEwNCA3MjFRMTAzIDcyMiAxMTEgNzMyVDEzNCA3NTlUMTcwIDc5NFQyMTggODMzUTIzNSA4NDYgMjQ1IDg1MFQyNjMgODU1UTI3MiA4NTUgMjc4IDg1MFQyODUgODM1UTI4NSA4MjUgMjc3IDgxNlQyNDcgNzg5UTIyMCA3NjkgMTk1IDc1NlQxNTAgNzM0VDExOCA3MjJUMTA0IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQjsiIGdseXBoLW5hbWU9Ikxjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTk0IDYyN1E5NCA2NTAgMTE1IDY1MEgxMjJRMTQ0IDY1MCAxNDQgNjI3VjQ2SDQ2MVE0ODQgNDYgNDg0IDI1VjIxUTQ4NCAwIDQ2MSAwSDk0VjYyN1pNMjMwIC0yNzBRMjI4IC0yNzMgMjIzIC0yNzRUMjE0IC0yNzRUMjA2IC0yNjlUMjA1IC0yNTlMMjY3IC05NFEyNzIgLTgwIDI3NyAtNzRUMjk2IC02N0gzMDBRMzA5IC02NyAzMTUgLTczVDMyMiAtOTNWLTk2UTMyMiAtMTAyIDMyMCAtMTEwVDMxMCAtMTMzTDIzMCAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNDOyIgZ2x5cGgtbmFtZT0ibGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iMjI2IiBkPSJNODkgNjczUTg5IDY3OCAxMDUgNjc4UTExOCA2NzggMTI3IDY2OVQxMzcgNjMxVjBIODlWNjczWk00OSAtMjcwUTQ3IC0yNzMgNDIgLTI3NFQzMyAtMjc0VDI1IC0yNjlUMjQgLTI1OUw4NiAtOTRROTEgLTgwIDk2IC03NFQxMTUgLTY3SDExOVExMjggLTY3IDEzNCAtNzNUMTQxIC05M1YtOTZRMTQxIC0xMDIgMTM5IC0xMTBUMTI5IC0xMzNMNDkgLTI3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRDsiIGdseXBoLW5hbWU9IkxjYXJvbiIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTQ1NSA0MzZRNDUzIDQzMyA0NDggNDMyVDQzOSA0MzJUNDMxIDQzOFQ0MzAgNDQ4TDQ4OSA2MjNRNDk0IDYzNyA0OTkgNjQzVDUxOCA2NTBINTIyUTUzMSA2NTAgNTM3IDY0M1Q1NDQgNjI0VjYyMVE1NDQgNjE1IDU0MiA2MDdUNTMyIDU4NUw0NTUgNDM2Wk05NCA2MjdROTQgNjUwIDExNSA2NTBIMTIyUTE0NCA2NTAgMTQ0IDYyN1Y0Nkg0NjFRNDg0IDQ2IDQ4NCAyNVYyMVE0ODQgMCA0NjEgMEg5NFY2MjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0U7IiBnbHlwaC1uYW1lPSJsY2Fyb24iIGhvcml6LWFkdi14PSIzODQiIGQ9Ik0yNTMgNDY0UTI1MSA0NjEgMjQ2IDQ2MFQyMzcgNDYwVDIyOSA0NjZUMjI4IDQ3NkwyODcgNjUxUTI5MiA2NjUgMjk3IDY3MVQzMTYgNjc4SDMyMFEzMjkgNjc4IDMzNSA2NzFUMzQyIDY1MlY2NDlRMzQyIDY0MyAzNDAgNjM1VDMzMCA2MTNMMjUzIDQ2NFpNODkgNjczUTg5IDY3OCAxMDUgNjc4UTExOCA2NzggMTI3IDY2OVQxMzcgNjMxVjBIODlWNjczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNGOyIgZ2x5cGgtbmFtZT0iTGRvdCIgaG9yaXotYWR2LXg9IjU4NSIgZD0iTTk0IDYyN1E5NCA2NTAgMTE1IDY1MEgxMjJRMTQ0IDY1MCAxNDQgNjI3VjQ2SDQ2MVE0ODQgNDYgNDg0IDI1VjIxUTQ4NCAwIDQ2MSAwSDk0VjYyN1pNNTM1IDI4NlE1MDEgMjg2IDUwMSAzMjBWMzI4UTUwMSAzNjMgNTM1IDM2M0g1NDJRNTc3IDM2MyA1NzcgMzI4VjMyMFE1NzcgMjg2IDU0MiAyODZINTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQwOyIgZ2x5cGgtbmFtZT0ibGRvdCIgaG9yaXotYWR2LXg9IjMwMCIgZD0iTTg5IDY3M1E4OSA2NzggMTA1IDY3OFExMTggNjc4IDEyNyA2NjlUMTM3IDYzMVYwSDg5VjY3M1pNMjM5IDI2NlEyMDUgMjY2IDIwNSAzMDBWMzA4UTIwNSAzNDMgMjM5IDM0M0gyNDZRMjgxIDM0MyAyODEgMzA4VjMwMFEyODEgMjY2IDI0NiAyNjZIMjM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQxOyIgZ2x5cGgtbmFtZT0iQ1IiIGhvcml6LWFkdi14PSI1NTciIGQ9Ik0xNjUgMFExNTEgMCAxNDMgOFQxMzUgMzBWMjQ2TDQ4IDIxOFE0NiAyMTcgNDIgMjI0VDM3IDI0MFEzNyAyNDkgNDUgMjU3VDczIDI3MUwxMzUgMjkxVjYyN1ExMzUgNjUwIDE1NiA2NTBIMTYzUTE4NSA2NTAgMTg1IDYyN1YzMDdMMzk0IDM3NFEzOTYgMzc1IDQwMCAzNjhUNDA0IDM1MlE0MDQgMzQzIDM5NiAzMzVUMzY4IDMyMUwyNzYgMjkxUTI1OSAyODUgMjQzIDI4MFQyMTMgMjcwUTE5OCAyNjUgMTg1IDI2MVY0Nkg1MDFRNTI0IDQ2IDUyNCAyNFYyMVE1MjQgMCA1MDEgMEgxNjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDI7IiBnbHlwaC1uYW1lPSJsc2xhc2giIGhvcml6LWFkdi14PSIzNDYiIGQ9Ik0xNjggLTNRMTQ2IC0zIDE0NiAyMFYyNTdMNDUgMjI1UTQzIDIyNSAzOSAyMzNUMzUgMjQ4UTM1IDI1NiA0MiAyNjRUNzAgMjc4TDE0NiAzMDJWNjczUTE0NiA2NzUgMTUxIDY3NlQxNjMgNjc4UTE3NSA2NzggMTg0IDY2OVQxOTQgNjMxVjMxN0wzMDMgMzUxUTMwNSAzNTEgMzA5IDM0M1QzMTMgMzI4UTMxMyAzMjAgMzA2IDMxMlQyNzggMjk4UTI1NCAyOTEgMjM2IDI4NUwxOTQgMjcxVjIwUTE5NCAtMyAxNzMgLTNIMTY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgZ2x5cGgtbmFtZT0iTmFjdXRlIiBob3Jpei1hZHYteD0iNzAzIiBkPSJNOTQgNjE2UTk0IDYzMCAxMDAgNjQwVDEyMSA2NTBIMTM0UTE0OCA2NTAgMTU2IDY0M1QxNzMgNjIzTDU2MyA3N1Y2NDdINjEwVjMwUTYxMCAxNiA2MDMgN1Q1ODQgLTNINTgwUTU2NiAtMyA1NjAgMlQ1NDYgMThMMTQxIDU4NVYwSDk0VjYxNlpNMzE5IDcyMVEzMTggNzIyIDMyNiA3MzJUMzQ5IDc1OVQzODUgNzk0VDQzMyA4MzNRNDUwIDg0NiA0NjAgODUwVDQ3OCA4NTVRNDg3IDg1NSA0OTMgODUwVDUwMCA4MzVRNTAwIDgyNSA0OTIgODE2VDQ2MiA3ODlRNDM1IDc2OSA0MTAgNzU2VDM2NSA3MzRUMzMzIDcyMlQzMTkgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgZ2x5cGgtbmFtZT0ibmFjdXRlIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNODQgNDcxUTg0IDQ3MiA4OCA0NzRUMTAwIDQ3NlExMTMgNDc2IDEyMiA0NjdUMTMxIDQyOFYzODVRMTU1IDQyOCAxOTggNDU1VDMwMSA0ODNRMzQ4IDQ4MyAzODMgNDY4VDQ0MyA0MjVUNDc5IDM1OVQ0OTEgMjcyVjBINDQzVjI2OVE0NDMgMzQ3IDQwNiAzOTJUMjk5IDQzOFEyMzkgNDM4IDE5NyA0MDhUMTMyIDMyOFYwSDg0VjQ3MVpNMjQ1IDU0N1EyNDQgNTQ4IDI1MiA1NThUMjc1IDU4NVQzMTEgNjIwVDM1OSA2NTlRMzc2IDY3MiAzODYgNjc2VDQwNCA2ODFRNDEzIDY4MSA0MTkgNjc2VDQyNiA2NjFRNDI2IDY1MSA0MTggNjQyVDM4OCA2MTVRMzYxIDU5NSAzMzYgNTgyVDI5MSA1NjBUMjU5IDU0OFQyNDUgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ1OyIgZ2x5cGgtbmFtZT0iTmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNzAzIiBkPSJNOTQgNjE2UTk0IDYzMCAxMDAgNjQwVDEyMSA2NTBIMTM0UTE0OCA2NTAgMTU2IDY0M1QxNzMgNjIzTDU2MyA3N1Y2NDdINjEwVjMwUTYxMCAxNiA2MDMgN1Q1ODQgLTNINTgwUTU2NiAtMyA1NjAgMlQ1NDYgMThMMTQxIDU4NVYwSDk0VjYxNlpNMjk0IC0yNzBRMjkyIC0yNzMgMjg3IC0yNzRUMjc4IC0yNzRUMjcwIC0yNjlUMjY5IC0yNTlMMzMxIC05NFEzMzYgLTgwIDM0MSAtNzRUMzYwIC02N0gzNjRRMzczIC02NyAzNzkgLTczVDM4NiAtOTNWLTk2UTM4NiAtMTAyIDM4NCAtMTEwVDM3NCAtMTMzTDI5NCAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ2OyIgZ2x5cGgtbmFtZT0ibmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTcxIiBkPSJNODQgNDcxUTg0IDQ3MiA4OCA0NzRUMTAwIDQ3NlExMTMgNDc2IDEyMiA0NjdUMTMxIDQyOFYzODVRMTU1IDQyOCAxOTggNDU1VDMwMSA0ODNRMzQ4IDQ4MyAzODMgNDY4VDQ0MyA0MjVUNDc5IDM1OVQ0OTEgMjcyVjBINDQzVjI2OVE0NDMgMzQ3IDQwNiAzOTJUMjk5IDQzOFEyMzkgNDM4IDE5NyA0MDhUMTMyIDMyOFYwSDg0VjQ3MVpNMjIyIC0yNzBRMjIwIC0yNzMgMjE1IC0yNzRUMjA2IC0yNzRUMTk4IC0yNjlUMTk3IC0yNTlMMjU5IC05NFEyNjQgLTgwIDI2OSAtNzRUMjg4IC02N0gyOTJRMzAxIC02NyAzMDcgLTczVDMxNCAtOTNWLTk2UTMxNCAtMTAyIDMxMiAtMTEwVDMwMiAtMTMzTDIyMiAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ3OyIgZ2x5cGgtbmFtZT0iTmNhcm9uIiBob3Jpei1hZHYteD0iNzAzIiBkPSJNOTQgNjE2UTk0IDYzMCAxMDAgNjQwVDEyMSA2NTBIMTM0UTE0OCA2NTAgMTU2IDY0M1QxNzMgNjIzTDU2MyA3N1Y2NDdINjEwVjMwUTYxMCAxNiA2MDMgN1Q1ODQgLTNINTgwUTU2NiAtMyA1NjAgMlQ1NDYgMThMMTQxIDU4NVYwSDk0VjYxNlpNMzU2IDcwM1EzNTQgNzAzIDMzNSA3MTlUMjg5IDc2NlEyNjQgNzk1IDI1MSA4MTNUMjM3IDg0NFEyMzcgODYxIDI1MiA4NjFRMjYyIDg2MSAyNzUgODQ5VDMxNyA3OTlMMzU3IDc0NkwzOTcgODAwUTQyMiA4MzMgNDM2IDg0N1Q0NjAgODYxUTQ3NiA4NjEgNDc2IDg0NFE0NzYgODMzIDQ2MyA4MTVUNDI1IDc2OFEzOTcgNzM2IDM3OCA3MjBUMzU2IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGdseXBoLW5hbWU9Im5jYXJvbiIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTg0IDQ3MVE4NCA0NzIgODggNDc0VDEwMCA0NzZRMTEzIDQ3NiAxMjIgNDY3VDEzMSA0MjhWMzg1UTE1NSA0MjggMTk4IDQ1NVQzMDEgNDgzUTM0OCA0ODMgMzgzIDQ2OFQ0NDMgNDI1VDQ3OSAzNTlUNDkxIDI3MlYwSDQ0M1YyNjlRNDQzIDM0NyA0MDYgMzkyVDI5OSA0MzhRMjM5IDQzOCAxOTcgNDA4VDEzMiAzMjhWMEg4NFY0NzFaTTI4OCA1MjlRMjg2IDUyOSAyNjcgNTQ1VDIyMSA1OTJRMTk2IDYyMSAxODMgNjM5VDE2OSA2NzBRMTY5IDY4NyAxODQgNjg3UTE5NCA2ODcgMjA3IDY3NVQyNDkgNjI1TDI4OSA1NzJMMzI5IDYyNlEzNTQgNjU5IDM2OCA2NzNUMzkyIDY4N1E0MDggNjg3IDQwOCA2NzBRNDA4IDY1OSAzOTUgNjQxVDM1NyA1OTRRMzI5IDU2MiAzMTAgNTQ2VDI4OCA1MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDk7IiBnbHlwaC1uYW1lPSJuYXBvc3Ryb3BoZSIgaG9yaXotYWR2LXg9Ijc5MyIgZD0iTTc0IDQ0M1E3MiA0NDAgNjcgNDM5VDU4IDQzOVQ1MCA0NDVUNDkgNDU1TDEwOCA2MzBRMTEzIDY0NCAxMTggNjUwVDEzNyA2NTdIMTQxUTE1MCA2NTcgMTU2IDY1MFQxNjMgNjMxVjYyOFExNjMgNjIyIDE2MSA2MTRUMTUxIDU5Mkw3NCA0NDNaTTMwNiA0NzFRMzA2IDQ3MiAzMTAgNDc0VDMyMiA0NzZRMzM1IDQ3NiAzNDQgNDY3VDM1MyA0MjhWMzg1UTM3NyA0MjggNDIwIDQ1NVQ1MjMgNDgzUTU3MCA0ODMgNjA1IDQ2OFQ2NjUgNDI1VDcwMSAzNTlUNzEzIDI3MlYwSDY2NVYyNjlRNjY1IDM0NyA2MjggMzkyVDUyMSA0MzhRNDYxIDQzOCA0MTkgNDA4VDM1NCAzMjhWMEgzMDZWNDcxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRDOyIgZ2x5cGgtbmFtZT0iT21hY3JvbiIgaG9yaXotYWR2LXg9Ijc2NSIgZD0iTTM4MiAtMTBRMzExIC0xMCAyNTMgMTRUMTUyIDgzVDg3IDE4OFQ2NCAzMjJRNjQgMzk1IDg3IDQ1NlQxNTMgNTYyVDI1NCA2MzJUMzg0IDY1N1E0NTUgNjU3IDUxMyA2MzJUNjEzIDU2M1Q2NzggNDU4VDcwMSAzMjRRNzAxIDI1MSA2NzggMTkwVDYxMyA4NVQ1MTIgMTVUMzgyIC0xMFpNMzgzIDMzUTQ0MyAzMyA0OTIgNTVUNTc2IDExNVQ2MzAgMjA3VDY1MCAzMjNRNjUwIDM4NSA2MzEgNDM4VDU3NiA1MzFUNDkxIDU5MlQzODIgNjE0UTMyMiA2MTQgMjczIDU5MlQxODkgNTMyVDEzNSA0NDBUMTE1IDMyM1ExMTUgMjYwIDEzNCAyMDdUMTg5IDExNlQyNzQgNTVUMzgzIDMzWk0yOTUgNzQxUTI2NiA3NDEgMjY2IDc2MlY3NjZRMjY2IDc4NiAyOTUgNzg2SDQ5OVE1MjggNzg2IDUyOCA3NjZWNzYyUTUyOCA3NDEgNDk5IDc0MUgyOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEQ7IiBnbHlwaC1uYW1lPSJvbWFjcm9uIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjk0IC0xMFEyNDEgLTEwIDE5NyA5VDEyMCA2MVQ3MCAxMzlUNTIgMjM3UTUyIDI5MCA3MCAzMzVUMTIwIDQxM1QxOTYgNDY0VDI5NCA0ODNRMzQ2IDQ4MyAzOTAgNDY0VDQ2NyA0MTJUNTE3IDMzNFQ1MzUgMjM1UTUzNSAxODIgNTE3IDEzOFQ0NjcgNjBUMzkxIDlUMjk0IC0xMFpNMjk0IDMyUTMzNiAzMiAzNzEgNDdUNDMyIDkwVDQ3MiAxNTRUNDg3IDIzNVE0ODcgMjc4IDQ3MyAzMTZUNDMzIDM4MVQzNzIgNDI1VDI5NCA0NDFRMjUyIDQ0MSAyMTcgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM3UTEwMCAxOTMgMTE0IDE1NlQxNTUgOTFUMjE2IDQ4VDI5NCAzMlpNMjAwIDU2N1ExNzEgNTY3IDE3MSA1ODhWNTkyUTE3MSA2MTIgMjAwIDYxMkg0MDRRNDMzIDYxMiA0MzMgNTkyVjU4OFE0MzMgNTY3IDQwNCA1NjdIMjAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRFOyIgZ2x5cGgtbmFtZT0iT2JyZXZlIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzgyIC0xMFEzMTEgLTEwIDI1MyAxNFQxNTIgODNUODcgMTg4VDY0IDMyMlE2NCAzOTUgODcgNDU2VDE1MyA1NjJUMjU0IDYzMlQzODQgNjU3UTQ1NSA2NTcgNTEzIDYzMlQ2MTMgNTYzVDY3OCA0NThUNzAxIDMyNFE3MDEgMjUxIDY3OCAxOTBUNjEzIDg1VDUxMiAxNVQzODIgLTEwWk0zODMgMzNRNDQzIDMzIDQ5MiA1NVQ1NzYgMTE1VDYzMCAyMDdUNjUwIDMyM1E2NTAgMzg1IDYzMSA0MzhUNTc2IDUzMVQ0OTEgNTkyVDM4MiA2MTRRMzIyIDYxNCAyNzMgNTkyVDE4OSA1MzJUMTM1IDQ0MFQxMTUgMzIzUTExNSAyNjAgMTM0IDIwN1QxODkgMTE2VDI3NCA1NVQzODMgMzNaTTM5MCA3MTlRMzU4IDcxOSAzMzMgNzMwVDI5MSA3NTlRMjc1IDc3NiAyNjggNzkzVDI2MCA4MjBRMjYwIDgzMSAyNjYgODM5VDI4OSA4NDdRMzAyIDgwOSAzMjggNzg2VDM5MCA3NjJRNDI2IDc2MiA0NTIgNzg1VDQ5MSA4NDdRNTA4IDg0NyA1MTQgODM5VDUyMCA4MjBRNTIwIDgxMCA1MTMgNzkzVDQ4OSA3NTlRNDcyIDc0MiA0NDcgNzMxVDM5MCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEY7IiBnbHlwaC1uYW1lPSJvYnJldmUiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yOTQgLTEwUTI0MSAtMTAgMTk3IDlUMTIwIDYxVDcwIDEzOVQ1MiAyMzdRNTIgMjkwIDcwIDMzNVQxMjAgNDEzVDE5NiA0NjRUMjk0IDQ4M1EzNDYgNDgzIDM5MCA0NjRUNDY3IDQxMlQ1MTcgMzM0VDUzNSAyMzVRNTM1IDE4MiA1MTcgMTM4VDQ2NyA2MFQzOTEgOVQyOTQgLTEwWk0yOTQgMzJRMzM2IDMyIDM3MSA0N1Q0MzIgOTBUNDcyIDE1NFQ0ODcgMjM1UTQ4NyAyNzggNDczIDMxNlQ0MzMgMzgxVDM3MiA0MjVUMjk0IDQ0MVEyNTIgNDQxIDIxNyA0MjZUMTU1IDM4M1QxMTUgMzE4VDEwMCAyMzdRMTAwIDE5MyAxMTQgMTU2VDE1NSA5MVQyMTYgNDhUMjk0IDMyWk0zMDIgNTQ1UTI3MCA1NDUgMjQ1IDU1NlQyMDMgNTg1UTE4NyA2MDIgMTgwIDYxOVQxNzIgNjQ2UTE3MiA2NTcgMTc4IDY2NVQyMDEgNjczUTIxNCA2MzUgMjQwIDYxMlQzMDIgNTg4UTMzOCA1ODggMzY0IDYxMVQ0MDMgNjczUTQyMCA2NzMgNDI2IDY2NVQ0MzIgNjQ2UTQzMiA2MzYgNDI1IDYxOVQ0MDEgNTg1UTM4NCA1NjggMzU5IDU1N1QzMDIgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUwOyIgZ2x5cGgtbmFtZT0iT2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9Ijc2NSIgZD0iTTM4MiAtMTBRMzExIC0xMCAyNTMgMTRUMTUyIDgzVDg3IDE4OFQ2NCAzMjJRNjQgMzk1IDg3IDQ1NlQxNTMgNTYyVDI1NCA2MzJUMzg0IDY1N1E0NTUgNjU3IDUxMyA2MzJUNjEzIDU2M1Q2NzggNDU4VDcwMSAzMjRRNzAxIDI1MSA2NzggMTkwVDYxMyA4NVQ1MTIgMTVUMzgyIC0xMFpNMzgzIDMzUTQ0MyAzMyA0OTIgNTVUNTc2IDExNVQ2MzAgMjA3VDY1MCAzMjNRNjUwIDM4NSA2MzEgNDM4VDU3NiA1MzFUNDkxIDU5MlQzODIgNjE0UTMyMiA2MTQgMjczIDU5MlQxODkgNTMyVDEzNSA0NDBUMTE1IDMyM1ExMTUgMjYwIDEzNCAyMDdUMTg5IDExNlQyNzQgNTVUMzgzIDMzWk00MjUgNzIxUTQyNCA3MjIgNDMxIDczMlQ0NTQgNzU5VDQ5MCA3OTRUNTM4IDgzM1E1NTUgODQ2IDU2NSA4NTBUNTg0IDg1NVE1OTIgODU1IDU5OCA4NTBUNjA1IDgzNVE2MDUgODI1IDU5NyA4MTZUNTY3IDc4OVE1NDAgNzY5IDUxNSA3NTZUNDcxIDczNFQ0MzkgNzIyVDQyNSA3MjFaTTI2MiA3MjFRMjYxIDcyMiAyNjkgNzMyVDI5MiA3NTlUMzI4IDc5NFQzNzYgODMzUTM5MyA4NDYgNDAzIDg1MFQ0MjEgODU1UTQyOSA4NTUgNDM1IDg1MFQ0NDIgODM1UTQ0MiA4MjUgNDM1IDgxNlQ0MDQgNzg5UTM3NyA3NjkgMzUyIDc1NlQzMDggNzM0VDI3NiA3MjJUMjYyIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MTsiIGdseXBoLW5hbWU9Im9odW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yOTQgLTEwUTI0MSAtMTAgMTk3IDlUMTIwIDYxVDcwIDEzOVQ1MiAyMzdRNTIgMjkwIDcwIDMzNVQxMjAgNDEzVDE5NiA0NjRUMjk0IDQ4M1EzNDYgNDgzIDM5MCA0NjRUNDY3IDQxMlQ1MTcgMzM0VDUzNSAyMzVRNTM1IDE4MiA1MTcgMTM4VDQ2NyA2MFQzOTEgOVQyOTQgLTEwWk0yOTQgMzJRMzM2IDMyIDM3MSA0N1Q0MzIgOTBUNDcyIDE1NFQ0ODcgMjM1UTQ4NyAyNzggNDczIDMxNlQ0MzMgMzgxVDM3MiA0MjVUMjk0IDQ0MVEyNTIgNDQxIDIxNyA0MjZUMTU1IDM4M1QxMTUgMzE4VDEwMCAyMzdRMTAwIDE5MyAxMTQgMTU2VDE1NSA5MVQyMTYgNDhUMjk0IDMyWk0zMjMgNTQ3UTMyMiA1NDggMzI5IDU1OFQzNTIgNTg1VDM4OCA2MjBUNDM2IDY1OVE0NTMgNjcyIDQ2MyA2NzZUNDgyIDY4MVE0OTAgNjgxIDQ5NiA2NzZUNTAzIDY2MVE1MDMgNjUxIDQ5NSA2NDJUNDY1IDYxNVE0MzggNTk1IDQxMyA1ODJUMzY5IDU2MFQzMzcgNTQ4VDMyMyA1NDdaTTE2MCA1NDdRMTU5IDU0OCAxNjcgNTU4VDE5MCA1ODVUMjI2IDYyMFQyNzQgNjU5UTI5MSA2NzIgMzAxIDY3NlQzMTkgNjgxUTMyNyA2ODEgMzMzIDY3NlQzNDAgNjYxUTM0MCA2NTEgMzMzIDY0MlQzMDIgNjE1UTI3NSA1OTUgMjUwIDU4MlQyMDYgNTYwVDE3NCA1NDhUMTYwIDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MjsiIGdseXBoLW5hbWU9Ik9FIiBob3Jpei1hZHYteD0iMTA0NyIgZD0iTTM3OSAtOVEzMDkgLTkgMjUxIDE1VDE1MiA4NFQ4NyAxODhUNjQgMzIyUTY0IDM5NSA4NyA0NTZUMTUzIDU2MVQyNTMgNjMxVDM4MSA2NTZRNDIzIDY1NiA0NjEgNjQ3SDk4NFY2MDJINTYzUTYyMCA1NjIgNjU1IDQ5OVQ2OTYgMzU0SDkxMlYzMTBINjk3UTY5NCAyMjMgNjU5IDE1NlQ1NjMgNDZIOTkzVjBINDU5UTQyMSAtOSAzNzkgLTlaTTM4MSAzNFE0MzkgMzQgNDg4IDU1VDU3MiAxMTVUNjI2IDIwN1Q2NDYgMzIzUTY0NiAzODUgNjI3IDQzOFQ1NzIgNTMwVDQ4NyA1OTFUMzgwIDYxM1EzMjEgNjEzIDI3MyA1OTJUMTg5IDUzMVQxMzUgNDM5VDExNSAzMjNRMTE1IDI2MCAxMzQgMjA3VDE4OSAxMTZUMjczIDU2VDM4MSAzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MzsiIGdseXBoLW5hbWU9Im9lIiBob3Jpei1hZHYteD0iOTgxIiBkPSJNMjkyIC0xMFEyMzkgLTEwIDE5NSA5VDEyMCA2MVQ3MCAxMzlUNTIgMjM3UTUyIDI5MCA3MCAzMzVUMTIwIDQxM1QxOTYgNDY0VDI5MiA0ODNRMzY4IDQ4MyA0MjQgNDQyVDUwNiAzMzRRNTI5IDQwMiA1ODUgNDQyVDcxNiA0ODNRNzY0IDQ4MyA4MDMgNDY2VDg3MSA0MTlUOTE1IDM0NlQ5MzEgMjUyVjI0N1E5MzEgMjM2IDkyNiAyMzNUOTEwIDIzMEg1MjlRNTMwIDE4NiA1NDQgMTUwVDU4MyA4OFQ2NDQgNDhUNzIyIDMzUTc1OCAzMyA3ODUgNDFUODMyIDYyVDg2NiA5M1Q4ODkgMTI4UTg5MCAxMjkgODk0IDEyOFQ5MDQgMTI0VDkxMyAxMTVUOTE3IDEwMFE5MTcgOTIgOTEwIDc5VDg4NyA0OVE4NjUgMjcgODIzIDlUNzIyIC0xMFE2NDIgLTEwIDU4NSAyOVQ1MDQgMTM2UTQ4MCA3MCA0MjQgMzBUMjkyIC0xMFpNMjkyIDMyUTMzMyAzMiAzNjcgNDdUNDI3IDkwVDQ2NyAxNTRUNDgyIDIzNlE0ODIgMjc5IDQ2OCAzMTZUNDI4IDM4MVQzNjggNDI1VDI5MiA0NDFRMjUxIDQ0MSAyMTYgNDI2VDE1NSAzODNUMTE1IDMxOFQxMDAgMjM3UTEwMCAxOTMgMTE0IDE1NlQxNTQgOTFUMjE1IDQ4VDI5MiAzMlpNNzE2IDQ0MVE2ODAgNDQxIDY0OSA0MjlUNTkzIDM5NFQ1NTMgMzQwVDUzMSAyNzFIODgxUTg3OSAzMDkgODY3IDM0MFQ4MzMgMzkzVDc4MiA0MjhUNzE2IDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NDsiIGdseXBoLW5hbWU9IlJhY3V0ZSIgaG9yaXotYWR2LXg9IjU5MCIgZD0iTTI4OCAyNzdMNTI4IDIxUTUzMCAxOCA1MjIgOFQ0OTggLTNRNDgyIC0zIDQ2NyAxNUwyMjQgMjc3SDE0M1YwSDk0VjYxN1E5NCA2MzAgMTAyIDYzOFQxMjMgNjQ3SDI5OFE0MTMgNjQ3IDQ3MiA2MDFUNTMxIDQ2M1E1MzEgMzczIDQ3MyAzMjVUMzEwIDI3N0gyODhaTTMwMyAzMjBRMzkzIDMyMCA0MzYgMzU4VDQ3OSA0NjFRNDc5IDUzMCA0MzUgNTY2VDMwMCA2MDJIMTQzVjMyMEgzMDNaTTI0MCA3MjFRMjM5IDcyMiAyNDcgNzMyVDI3MCA3NTlUMzA2IDc5NFQzNTQgODMzUTM3MSA4NDYgMzgxIDg1MFQzOTkgODU1UTQwOCA4NTUgNDE0IDg1MFQ0MjEgODM1UTQyMSA4MjUgNDEzIDgxNlQzODMgNzg5UTM1NiA3NjkgMzMxIDc1NlQyODYgNzM0VDI1NCA3MjJUMjQwIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGdseXBoLW5hbWU9InJhY3V0ZSIgaG9yaXotYWR2LXg9IjM1OCIgZD0iTTg0IDQ3MVE4NCA0NzIgODggNDc0VDEwMCA0NzZRMTEzIDQ3NiAxMjIgNDY3VDEzMSA0MjhWMzY5UTE0NiA0MjkgMTgwIDQ1NlQyNjIgNDgzUTI5MCA0ODMgMzA5IDQ3MlQzMjggNDQzUTMyOCA0MjkgMzIyIDQyM1QzMTQgNDE4UTMwNSA0MjYgMjkxIDQzMVQyNTcgNDM3UTE5MyA0MzcgMTYzIDM3OVQxMzIgMjI1VjBIODRWNDcxWk0xNTAgNTQ3UTE0OSA1NDggMTU3IDU1OFQxODAgNTg1VDIxNiA2MjBUMjY0IDY1OVEyODEgNjcyIDI5MSA2NzZUMzA5IDY4MVEzMTggNjgxIDMyNCA2NzZUMzMxIDY2MVEzMzEgNjUxIDMyMyA2NDJUMjkzIDYxNVEyNjYgNTk1IDI0MSA1ODJUMTk2IDU2MFQxNjQgNTQ4VDE1MCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTY7IiBnbHlwaC1uYW1lPSJSY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik0yODggMjc3TDUyOCAyMVE1MzAgMTggNTIyIDhUNDk4IC0zUTQ4MiAtMyA0NjcgMTVMMjI0IDI3N0gxNDNWMEg5NFY2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0gyOThRNDEzIDY0NyA0NzIgNjAxVDUzMSA0NjNRNTMxIDM3MyA0NzMgMzI1VDMxMCAyNzdIMjg4Wk0zMDMgMzIwUTM5MyAzMjAgNDM2IDM1OFQ0NzkgNDYxUTQ3OSA1MzAgNDM1IDU2NlQzMDAgNjAySDE0M1YzMjBIMzAzWk0yMzMgLTI3MFEyMzEgLTI3MyAyMjYgLTI3NFQyMTcgLTI3NFQyMDkgLTI2OVQyMDggLTI1OUwyNzAgLTk0UTI3NSAtODAgMjgwIC03NFQyOTkgLTY3SDMwM1EzMTIgLTY3IDMxOCAtNzNUMzI1IC05M1YtOTZRMzI1IC0xMDIgMzIzIC0xMTBUMzEzIC0xMzNMMjMzIC0yNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTc7IiBnbHlwaC1uYW1lPSJyY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSIzNTgiIGQ9Ik04NCA0NzFRODQgNDcyIDg4IDQ3NFQxMDAgNDc2UTExMyA0NzYgMTIyIDQ2N1QxMzEgNDI4VjM2OVExNDYgNDI5IDE4MCA0NTZUMjYyIDQ4M1EyOTAgNDgzIDMwOSA0NzJUMzI4IDQ0M1EzMjggNDI5IDMyMiA0MjNUMzE0IDQxOFEzMDUgNDI2IDI5MSA0MzFUMjU3IDQzN1ExOTMgNDM3IDE2MyAzNzlUMTMyIDIyNVYwSDg0VjQ3MVpNNDAgLTI3MFEzOCAtMjczIDMzIC0yNzRUMjQgLTI3NFQxNiAtMjY5VDE1IC0yNTlMNzcgLTk0UTgyIC04MCA4NyAtNzRUMTA2IC02N0gxMTBRMTE5IC02NyAxMjUgLTczVDEzMiAtOTNWLTk2UTEzMiAtMTAyIDEzMCAtMTEwVDEyMCAtMTMzTDQwIC0yNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTg7IiBnbHlwaC1uYW1lPSJSY2Fyb24iIGhvcml6LWFkdi14PSI1OTAiIGQ9Ik0yODggMjc3TDUyOCAyMVE1MzAgMTggNTIyIDhUNDk4IC0zUTQ4MiAtMyA0NjcgMTVMMjI0IDI3N0gxNDNWMEg5NFY2MTdROTQgNjMwIDEwMiA2MzhUMTIzIDY0N0gyOThRNDEzIDY0NyA0NzIgNjAxVDUzMSA0NjNRNTMxIDM3MyA0NzMgMzI1VDMxMCAyNzdIMjg4Wk0zMDMgMzIwUTM5MyAzMjAgNDM2IDM1OFQ0NzkgNDYxUTQ3OSA1MzAgNDM1IDU2NlQzMDAgNjAySDE0M1YzMjBIMzAzWk0yODIgNzAzUTI4MCA3MDMgMjYxIDcxOVQyMTUgNzY2UTE5MCA3OTUgMTc3IDgxM1QxNjMgODQ0UTE2MyA4NjEgMTc4IDg2MVExODggODYxIDIwMSA4NDlUMjQzIDc5OUwyODMgNzQ2TDMyMyA4MDBRMzQ4IDgzMyAzNjIgODQ3VDM4NiA4NjFRNDAyIDg2MSA0MDIgODQ0UTQwMiA4MzMgMzg5IDgxNVQzNTEgNzY4UTMyMyA3MzYgMzA0IDcyMFQyODIgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU5OyIgZ2x5cGgtbmFtZT0icmNhcm9uIiBob3Jpei1hZHYteD0iMzU4IiBkPSJNODQgNDcxUTg0IDQ3MiA4OCA0NzRUMTAwIDQ3NlExMTMgNDc2IDEyMiA0NjdUMTMxIDQyOFYzNjlRMTQ2IDQyOSAxODAgNDU2VDI2MiA0ODNRMjkwIDQ4MyAzMDkgNDcyVDMyOCA0NDNRMzI4IDQyOSAzMjIgNDIzVDMxNCA0MThRMzA1IDQyNiAyOTEgNDMxVDI1NyA0MzdRMTkzIDQzNyAxNjMgMzc5VDEzMiAyMjVWMEg4NFY0NzFaTTIwMSA1MjlRMTk5IDUyOSAxODAgNTQ1VDEzNCA1OTJRMTA5IDYyMSA5NiA2MzlUODIgNjcwUTgyIDY4NyA5NyA2ODdRMTA3IDY4NyAxMjAgNjc1VDE2MiA2MjVMMjAyIDU3MkwyNDIgNjI2UTI2NyA2NTkgMjgxIDY3M1QzMDUgNjg3UTMyMSA2ODcgMzIxIDY3MFEzMjEgNjU5IDMwOCA2NDFUMjcwIDU5NFEyNDIgNTYyIDIyMyA1NDZUMjAxIDUyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QTsiIGdseXBoLW5hbWU9IlNhY3V0ZSIgaG9yaXotYWR2LXg9IjU2NSIgZD0iTTI4OCAtMTBRMjE2IC0xMCAxNjYgMTFUODcgNjBRNzAgNzcgNjMgOTJUNTUgMTE5UTU1IDEyNyA1OSAxMzNUNjkgMTQzVDc5IDE0OFQ4NSAxNDlROTUgMTI4IDExMiAxMDdUMTUzIDcwVDIxMSA0M1QyODcgMzNRMzY3IDMzIDQxMiA2OFQ0NTggMTY2UTQ1OCAyMDEgNDQzIDIyNFQ0MDIgMjYyVDM0MyAyODdUMjcyIDMwNlEyMzQgMzE1IDE5OSAzMjZUMTM1IDM1N1Q4OSA0MDdUNzIgNDgzUTcyIDUyMSA4OCA1NTNUMTMyIDYwOFQxOTkgNjQ0VDI4MyA2NTdRMzQ5IDY1NyAzOTQgNjM4VDQ2NCA1OTVRNDc4IDU4MSA0ODUgNTY3VDQ5MiA1NDNRNDkyIDUzNSA0ODggNTI5VDQ3OCA1MTlUNDY4IDUxM1Q0NjIgNTEyUTQ1MyA1MzIgNDM4IDU1MFQ0MDAgNTgzVDM0OCA2MDVUMjgzIDYxNFEyNDggNjE0IDIxOCA2MDVUMTY3IDU3OVQxMzMgNTM4VDEyMSA0ODRRMTIxIDQ1MSAxMzQgNDMwVDE3MSAzOTRUMjI3IDM3MFQyOTcgMzUyUTMzNiAzNDMgMzczIDMzMVQ0NDEgMjk4VDQ4OSAyNDZUNTA3IDE2OFE1MDcgMTI4IDQ5MiA5NVQ0NDcgMzlUMzc4IDNUMjg4IC0xMFpNMjI2IDcyMVEyMjUgNzIyIDIzMyA3MzJUMjU2IDc1OVQyOTIgNzk0VDM0MCA4MzNRMzU3IDg0NiAzNjcgODUwVDM4NSA4NTVRMzk0IDg1NSA0MDAgODUwVDQwNyA4MzVRNDA3IDgyNSAzOTkgODE2VDM2OSA3ODlRMzQyIDc2OSAzMTcgNzU2VDI3MiA3MzRUMjQwIDcyMlQyMjYgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVCOyIgZ2x5cGgtbmFtZT0ic2FjdXRlIiBob3Jpei1hZHYteD0iNDc0IiBkPSJNMjM3IC0xMFExNzQgLTEwIDEzMyA2VDY5IDQ1UTU2IDU4IDUxIDY3VDQ2IDg0UTQ2IDkxIDUwIDk2VDU4IDEwNVQ2NyAxMDlUNzIgMTEwUTk0IDc2IDEzNSA1M1QyMzkgMzBRMzA0IDMwIDMzOSA1NlQzNzUgMTIyUTM3NSAxNDYgMzY1IDE2MVQzMzUgMTg3VDI4OCAyMDRUMjI4IDIxOFExOTkgMjI0IDE2OSAyMzFUMTE1IDI1M1Q3NiAyODlUNjAgMzQ2UTYwIDM3NiA3MiA0MDFUMTA4IDQ0NVQxNjQgNDczVDIzNyA0ODNRMjkzIDQ4MyAzMzEgNDY4VDM5MCA0MzFRNDA4IDQxMyA0MDggMzk2UTQwOCAzODkgNDA0IDM4NFQzOTYgMzc1VDM4NyAzNzFUMzgyIDM3MVEzNjQgNDAyIDMyNiA0MjJUMjM3IDQ0M1ExNzUgNDQzIDE0MSA0MThUMTA2IDM1M1ExMDYgMzMwIDExNiAzMTZUMTQ0IDI5MVQxODkgMjc0VDI0OCAyNjBRMjc4IDI1NCAzMDkgMjQ2VDM2NSAyMjRUNDA2IDE4N1Q0MjIgMTI5UTQyMiA2NyAzNzMgMjlUMjM3IC0xMFpNMTg4IDU0N1ExODcgNTQ4IDE5NSA1NThUMjE4IDU4NVQyNTQgNjIwVDMwMiA2NTlRMzE5IDY3MiAzMjkgNjc2VDM0NyA2ODFRMzU2IDY4MSAzNjIgNjc2VDM2OSA2NjFRMzY5IDY1MSAzNjEgNjQyVDMzMSA2MTVRMzA0IDU5NSAyNzkgNTgyVDIzNCA1NjBUMjAyIDU0OFQxODggNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVDOyIgZ2x5cGgtbmFtZT0iU2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NjUiIGQ9Ik0yODggLTEwUTIxNiAtMTAgMTY2IDExVDg3IDYwUTcwIDc3IDYzIDkyVDU1IDExOVE1NSAxMjcgNTkgMTMzVDY5IDE0M1Q3OSAxNDhUODUgMTQ5UTk1IDEyOCAxMTIgMTA3VDE1MyA3MFQyMTEgNDNUMjg3IDMzUTM2NyAzMyA0MTIgNjhUNDU4IDE2NlE0NTggMjAxIDQ0MyAyMjRUNDAyIDI2MlQzNDMgMjg3VDI3MiAzMDZRMjM0IDMxNSAxOTkgMzI2VDEzNSAzNTdUODkgNDA3VDcyIDQ4M1E3MiA1MjEgODggNTUzVDEzMiA2MDhUMTk5IDY0NFQyODMgNjU3UTM0OSA2NTcgMzk0IDYzOFQ0NjQgNTk1UTQ3OCA1ODEgNDg1IDU2N1Q0OTIgNTQzUTQ5MiA1MzUgNDg4IDUyOVQ0NzggNTE5VDQ2OCA1MTNUNDYyIDUxMlE0NTMgNTMyIDQzOCA1NTBUNDAwIDU4M1QzNDggNjA1VDI4MyA2MTRRMjQ4IDYxNCAyMTggNjA1VDE2NyA1NzlUMTMzIDUzOFQxMjEgNDg0UTEyMSA0NTEgMTM0IDQzMFQxNzEgMzk0VDIyNyAzNzBUMjk3IDM1MlEzMzYgMzQzIDM3MyAzMzFUNDQxIDI5OFQ0ODkgMjQ2VDUwNyAxNjhRNTA3IDEyOCA0OTIgOTVUNDQ3IDM5VDM3OCAzVDI4OCAtMTBaTTE4NyA3MTlRMTcxIDcxOSAxNzEgNzM2UTE3MSA3NDcgMTg0IDc2NVQyMjIgODEyUTI1MSA4NDQgMjcwIDg2MFQyOTEgODc3UTI5MyA4NzcgMzEyIDg2MVQzNTggODE0UTM4MyA3ODUgMzk2IDc2N1Q0MTAgNzM2UTQxMCA3MTkgMzk1IDcxOVEzODUgNzE5IDM3MiA3MzFUMzMwIDc4MUwyOTAgODM0TDI1MCA3ODBRMjI1IDc0NiAyMTEgNzMzVDE4NyA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUQ7IiBnbHlwaC1uYW1lPSJzY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ3NCIgZD0iTTIzNyAtMTBRMTc0IC0xMCAxMzMgNlQ2OSA0NVE1NiA1OCA1MSA2N1Q0NiA4NFE0NiA5MSA1MCA5NlQ1OCAxMDVUNjcgMTA5VDcyIDExMFE5NCA3NiAxMzUgNTNUMjM5IDMwUTMwNCAzMCAzMzkgNTZUMzc1IDEyMlEzNzUgMTQ2IDM2NSAxNjFUMzM1IDE4N1QyODggMjA0VDIyOCAyMThRMTk5IDIyNCAxNjkgMjMxVDExNSAyNTNUNzYgMjg5VDYwIDM0NlE2MCAzNzYgNzIgNDAxVDEwOCA0NDVUMTY0IDQ3M1QyMzcgNDgzUTI5MyA0ODMgMzMxIDQ2OFQzOTAgNDMxUTQwOCA0MTMgNDA4IDM5NlE0MDggMzg5IDQwNCAzODRUMzk2IDM3NVQzODcgMzcxVDM4MiAzNzFRMzY0IDQwMiAzMjYgNDIyVDIzNyA0NDNRMTc1IDQ0MyAxNDEgNDE4VDEwNiAzNTNRMTA2IDMzMCAxMTYgMzE2VDE0NCAyOTFUMTg5IDI3NFQyNDggMjYwUTI3OCAyNTQgMzA5IDI0NlQzNjUgMjI0VDQwNiAxODdUNDIyIDEyOVE0MjIgNjcgMzczIDI5VDIzNyAtMTBaTTEzNyA1NDVRMTIxIDU0NSAxMjEgNTYyUTEyMSA1NzMgMTM0IDU5MVQxNzIgNjM4UTIwMSA2NzAgMjIwIDY4NlQyNDEgNzAzUTI0MyA3MDMgMjYyIDY4N1QzMDggNjQwUTMzMyA2MTEgMzQ2IDU5M1QzNjAgNTYyUTM2MCA1NDUgMzQ1IDU0NVEzMzUgNTQ1IDMyMiA1NTdUMjgwIDYwN0wyNDAgNjYwTDIwMCA2MDZRMTc1IDU3MiAxNjEgNTU5VDEzNyA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUU7IiBnbHlwaC1uYW1lPSJTY2VkaWxsYSIgaG9yaXotYWR2LXg9IjU2NSIgZD0iTTI4OCAtMTBRMjE2IC0xMCAxNjYgMTFUODcgNjBRNzAgNzcgNjMgOTJUNTUgMTE5UTU1IDEyNyA1OSAxMzNUNjkgMTQzVDc5IDE0OFQ4NSAxNDlROTUgMTI4IDExMiAxMDdUMTUzIDcwVDIxMSA0M1QyODcgMzNRMzY3IDMzIDQxMiA2OFQ0NTggMTY2UTQ1OCAyMDEgNDQzIDIyNFQ0MDIgMjYyVDM0MyAyODdUMjcyIDMwNlEyMzQgMzE1IDE5OSAzMjZUMTM1IDM1N1Q4OSA0MDdUNzIgNDgzUTcyIDUyMSA4OCA1NTNUMTMyIDYwOFQxOTkgNjQ0VDI4MyA2NTdRMzQ5IDY1NyAzOTQgNjM4VDQ2NCA1OTVRNDc4IDU4MSA0ODUgNTY3VDQ5MiA1NDNRNDkyIDUzNSA0ODggNTI5VDQ3OCA1MTlUNDY4IDUxM1Q0NjIgNTEyUTQ1MyA1MzIgNDM4IDU1MFQ0MDAgNTgzVDM0OCA2MDVUMjgzIDYxNFEyNDggNjE0IDIxOCA2MDVUMTY3IDU3OVQxMzMgNTM4VDEyMSA0ODRRMTIxIDQ1MSAxMzQgNDMwVDE3MSAzOTRUMjI3IDM3MFQyOTcgMzUyUTMzNiAzNDMgMzczIDMzMVQ0NDEgMjk4VDQ4OSAyNDZUNTA3IDE2OFE1MDcgMTI4IDQ5MiA5NVQ0NDcgMzlUMzc4IDNUMjg4IC0xMFpNMjE0IC0yMTNRMjEyIC0yMTYgMjA3IC0yMTZUMTk3IC0yMTZUMTg5IC0yMTFUMTg5IC0yMDFMMjUxIC03NFEyNTYgLTYyIDI2MSAtNTVUMjgxIC00OEgyODVRMjk1IC00OCAzMDIgLTU0VDMxMCAtNzBWLTczUTMxMCAtNzkgMzA1IC04NlQyOTEgLTEwNUwyMTQgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RjsiIGdseXBoLW5hbWU9InNjZWRpbGxhIiBob3Jpei1hZHYteD0iNDc0IiBkPSJNMjM3IC0xMFExNzQgLTEwIDEzMyA2VDY5IDQ1UTU2IDU4IDUxIDY3VDQ2IDg0UTQ2IDkxIDUwIDk2VDU4IDEwNVQ2NyAxMDlUNzIgMTEwUTk0IDc2IDEzNSA1M1QyMzkgMzBRMzA0IDMwIDMzOSA1NlQzNzUgMTIyUTM3NSAxNDYgMzY1IDE2MVQzMzUgMTg3VDI4OCAyMDRUMjI4IDIxOFExOTkgMjI0IDE2OSAyMzFUMTE1IDI1M1Q3NiAyODlUNjAgMzQ2UTYwIDM3NiA3MiA0MDFUMTA4IDQ0NVQxNjQgNDczVDIzNyA0ODNRMjkzIDQ4MyAzMzEgNDY4VDM5MCA0MzFRNDA4IDQxMyA0MDggMzk2UTQwOCAzODkgNDA0IDM4NFQzOTYgMzc1VDM4NyAzNzFUMzgyIDM3MVEzNjQgNDAyIDMyNiA0MjJUMjM3IDQ0M1ExNzUgNDQzIDE0MSA0MThUMTA2IDM1M1ExMDYgMzMwIDExNiAzMTZUMTQ0IDI5MVQxODkgMjc0VDI0OCAyNjBRMjc4IDI1NCAzMDkgMjQ2VDM2NSAyMjRUNDA2IDE4N1Q0MjIgMTI5UTQyMiA2NyAzNzMgMjlUMjM3IC0xMFpNMTY0IC0yMTNRMTYyIC0yMTYgMTU3IC0yMTZUMTQ3IC0yMTZUMTM5IC0yMTFUMTM5IC0yMDFMMjAxIC03NFEyMDYgLTYyIDIxMSAtNTVUMjMxIC00OEgyMzVRMjQ1IC00OCAyNTIgLTU0VDI2MCAtNzBWLTczUTI2MCAtNzkgMjU1IC04NlQyNDEgLTEwNUwxNjQgLTIxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGdseXBoLW5hbWU9IlNjYXJvbiIgaG9yaXotYWR2LXg9IjU2NSIgZD0iTTI4OCAtMTBRMjE2IC0xMCAxNjYgMTFUODcgNjBRNzAgNzcgNjMgOTJUNTUgMTE5UTU1IDEyNyA1OSAxMzNUNjkgMTQzVDc5IDE0OFQ4NSAxNDlROTUgMTI4IDExMiAxMDdUMTUzIDcwVDIxMSA0M1QyODcgMzNRMzY3IDMzIDQxMiA2OFQ0NTggMTY2UTQ1OCAyMDEgNDQzIDIyNFQ0MDIgMjYyVDM0MyAyODdUMjcyIDMwNlEyMzQgMzE1IDE5OSAzMjZUMTM1IDM1N1Q4OSA0MDdUNzIgNDgzUTcyIDUyMSA4OCA1NTNUMTMyIDYwOFQxOTkgNjQ0VDI4MyA2NTdRMzQ5IDY1NyAzOTQgNjM4VDQ2NCA1OTVRNDc4IDU4MSA0ODUgNTY3VDQ5MiA1NDNRNDkyIDUzNSA0ODggNTI5VDQ3OCA1MTlUNDY4IDUxM1Q0NjIgNTEyUTQ1MyA1MzIgNDM4IDU1MFQ0MDAgNTgzVDM0OCA2MDVUMjgzIDYxNFEyNDggNjE0IDIxOCA2MDVUMTY3IDU3OVQxMzMgNTM4VDEyMSA0ODRRMTIxIDQ1MSAxMzQgNDMwVDE3MSAzOTRUMjI3IDM3MFQyOTcgMzUyUTMzNiAzNDMgMzczIDMzMVQ0NDEgMjk4VDQ4OSAyNDZUNTA3IDE2OFE1MDcgMTI4IDQ5MiA5NVQ0NDcgMzlUMzc4IDNUMjg4IC0xMFpNMjg0IDcwM1EyODIgNzAzIDI2MyA3MTlUMjE3IDc2NlExOTIgNzk1IDE3OSA4MTNUMTY1IDg0NFExNjUgODYxIDE4MCA4NjFRMTkwIDg2MSAyMDMgODQ5VDI0NSA3OTlMMjg1IDc0NkwzMjUgODAwUTM1MCA4MzMgMzY0IDg0N1QzODggODYxUTQwNCA4NjEgNDA0IDg0NFE0MDQgODMzIDM5MSA4MTVUMzUzIDc2OFEzMjUgNzM2IDMwNiA3MjBUMjg0IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGdseXBoLW5hbWU9InNjYXJvbiIgaG9yaXotYWR2LXg9IjQ3NCIgZD0iTTIzNyAtMTBRMTc0IC0xMCAxMzMgNlQ2OSA0NVE1NiA1OCA1MSA2N1Q0NiA4NFE0NiA5MSA1MCA5NlQ1OCAxMDVUNjcgMTA5VDcyIDExMFE5NCA3NiAxMzUgNTNUMjM5IDMwUTMwNCAzMCAzMzkgNTZUMzc1IDEyMlEzNzUgMTQ2IDM2NSAxNjFUMzM1IDE4N1QyODggMjA0VDIyOCAyMThRMTk5IDIyNCAxNjkgMjMxVDExNSAyNTNUNzYgMjg5VDYwIDM0NlE2MCAzNzYgNzIgNDAxVDEwOCA0NDVUMTY0IDQ3M1QyMzcgNDgzUTI5MyA0ODMgMzMxIDQ2OFQzOTAgNDMxUTQwOCA0MTMgNDA4IDM5NlE0MDggMzg5IDQwNCAzODRUMzk2IDM3NVQzODcgMzcxVDM4MiAzNzFRMzY0IDQwMiAzMjYgNDIyVDIzNyA0NDNRMTc1IDQ0MyAxNDEgNDE4VDEwNiAzNTNRMTA2IDMzMCAxMTYgMzE2VDE0NCAyOTFUMTg5IDI3NFQyNDggMjYwUTI3OCAyNTQgMzA5IDI0NlQzNjUgMjI0VDQwNiAxODdUNDIyIDEyOVE0MjIgNjcgMzczIDI5VDIzNyAtMTBaTTIzMiA1MjlRMjMwIDUyOSAyMTEgNTQ1VDE2NSA1OTJRMTQwIDYyMSAxMjcgNjM5VDExMyA2NzBRMTEzIDY4NyAxMjggNjg3UTEzOCA2ODcgMTUxIDY3NVQxOTMgNjI1TDIzMyA1NzJMMjczIDYyNlEyOTggNjU5IDMxMiA2NzNUMzM2IDY4N1EzNTIgNjg3IDM1MiA2NzBRMzUyIDY1OSAzMzkgNjQxVDMwMSA1OTRRMjczIDU2MiAyNTQgNTQ2VDIzMiA1MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjI7IiBnbHlwaC1uYW1lPSJUY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1OTkiIGQ9Ik0yNzUgNjAySDYxUTM4IDYwMiAzOCA2MjJWNjI2UTM4IDY0NyA2MSA2NDdINTM4UTU2MiA2NDcgNTYyIDYyNlY2MjJRNTYyIDYwMiA1MzggNjAySDMyNVYwSDI3NVY2MDJaTTI0MCAtMjcwUTIzOCAtMjczIDIzMyAtMjc0VDIyNCAtMjc0VDIxNiAtMjY5VDIxNSAtMjU5TDI3NyAtOTRRMjgyIC04MCAyODcgLTc0VDMwNiAtNjdIMzEwUTMxOSAtNjcgMzI1IC03M1QzMzIgLTkzVi05NlEzMzIgLTEwMiAzMzAgLTExMFQzMjAgLTEzM0wyNDAgLTI3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MzsiIGdseXBoLW5hbWU9InRjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTIzNyAtMTBRMTc0IC0xMCAxNDQgMjZUMTEzIDEzN1Y0MzBIMzVWNDczSDExM1Y1NjVRMTEzIDU3OSAxMTkgNTg0VDEzNCA1ODlIMTQwUTE0OSA1ODkgMTU0IDU4NFQxNjAgNTY1VjQ3M0gzMTdWNDMwSDE2MFYxNDJRMTYwIDgzIDE3OCA1N1QyMzkgMzFRMjY1IDMxIDI4NCA0MlQzMTYgNzJRMzE4IDc0IDMyNSA2OFQzMzIgNDhRMzMyIDQyIDMyOSAzNFQzMTYgMThRMzA1IDYgMjg2IC0yVDIzNyAtMTBaTTE0OSAtMjcwUTE0NyAtMjczIDE0MiAtMjc0VDEzMyAtMjc0VDEyNSAtMjY5VDEyNCAtMjU5TDE4NiAtOTRRMTkxIC04MCAxOTYgLTc0VDIxNSAtNjdIMjE5UTIyOCAtNjcgMjM0IC03M1QyNDEgLTkzVi05NlEyNDEgLTEwMiAyMzkgLTExMFQyMjkgLTEzM0wxNDkgLTI3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGdseXBoLW5hbWU9IlRjYXJvbiIgaG9yaXotYWR2LXg9IjU5OSIgZD0iTTI3NSA2MDJINjFRMzggNjAyIDM4IDYyMlY2MjZRMzggNjQ3IDYxIDY0N0g1MzhRNTYyIDY0NyA1NjIgNjI2VjYyMlE1NjIgNjAyIDUzOCA2MDJIMzI1VjBIMjc1VjYwMlpNMjk5IDcwM1EyOTcgNzAzIDI3OCA3MTlUMjMyIDc2NlEyMDcgNzk1IDE5NCA4MTNUMTgwIDg0NFExODAgODYxIDE5NSA4NjFRMjA1IDg2MSAyMTggODQ5VDI2MCA3OTlMMzAwIDc0NkwzNDAgODAwUTM2NSA4MzMgMzc5IDg0N1Q0MDMgODYxUTQxOSA4NjEgNDE5IDg0NFE0MTkgODMzIDQwNiA4MTVUMzY4IDc2OFEzNDAgNzM2IDMyMSA3MjBUMjk5IDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NTsiIGdseXBoLW5hbWU9InRjYXJvbiIgaG9yaXotYWR2LXg9IjM5MSIgZD0iTTIzNyAtMTBRMTc0IC0xMCAxNDQgMjZUMTEzIDEzN1Y0MzBIMzVWNDczSDExM1Y1NjVRMTEzIDU3OSAxMTkgNTg0VDEzNCA1ODlIMTQwUTE0OSA1ODkgMTU0IDU4NFQxNjAgNTY1VjQ3M0gzMTdWNDMwSDE2MFYxNDJRMTYwIDgzIDE3OCA1N1QyMzkgMzFRMjY1IDMxIDI4NCA0MlQzMTYgNzJRMzE4IDc0IDMyNSA2OFQzMzIgNDhRMzMyIDQyIDMyOSAzNFQzMTYgMThRMzA1IDYgMjg2IC0yVDIzNyAtMTBaTTIzNiA1MjJRMjM0IDUxOSAyMzAgNTE5VDIyMiA1MTlUMjE1IDUyNFQyMTQgNTMzTDI2NiA2ODdRMjcxIDY5OSAyNzUgNzA0VDI5MiA3MTBIMjk1UTMwMyA3MTAgMzA5IDcwNVQzMTUgNjg4VjY4NVEzMTUgNjgwIDMxNCA2NzJUMzA0IDY1M0wyMzYgNTIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY2OyIgZ2x5cGgtbmFtZT0iVGJhciIgaG9yaXotYWR2LXg9IjU5OSIgZD0iTTI3NSA2MDJINjFRMzggNjAyIDM4IDYyMlY2MjZRMzggNjQ3IDYxIDY0N0g1MzhRNTYyIDY0NyA1NjIgNjI2VjYyMlE1NjIgNjAyIDUzOCA2MDJIMzI1VjBIMjc1VjYwMlpNMTk3IDMxNFExNjggMzE0IDE2OCAzMzVWMzM5UTE2OCAzNTkgMTk3IDM1OUg0MDFRNDMwIDM1OSA0MzAgMzM5VjMzNVE0MzAgMzE0IDQwMSAzMTRIMTk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY3OyIgZ2x5cGgtbmFtZT0idGJhciIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTIzNyAtMTBRMTc0IC0xMCAxNDQgMjZUMTEzIDEzN1Y0MzBIMzVWNDczSDExM1Y1NjVRMTEzIDU3OSAxMTkgNTg0VDEzNCA1ODlIMTQwUTE0OSA1ODkgMTU0IDU4NFQxNjAgNTY1VjQ3M0gzMTdWNDMwSDE2MFYxNDJRMTYwIDgzIDE3OCA1N1QyMzkgMzFRMjY1IDMxIDI4NCA0MlQzMTYgNzJRMzE4IDc0IDMyNSA2OFQzMzIgNDhRMzMyIDQyIDMyOSAzNFQzMTYgMThRMzA1IDYgMjg2IC0yVDIzNyAtMTBaTTU5IDIzM1EzMCAyMzMgMzAgMjU0VjI1OFEzMCAyNzggNTkgMjc4SDI2M1EyOTIgMjc4IDI5MiAyNThWMjU0UTI5MiAyMzMgMjYzIDIzM0g1OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2ODsiIGdseXBoLW5hbWU9IlV0aWxkZSIgaG9yaXotYWR2LXg9IjY2MSIgZD0iTTMyOSAtMTBRMjA4IC0xMCAxNDYgNTZUODQgMjUyVjYyN1E4NCA2NTAgMTA1IDY1MEgxMTJRMTM0IDY1MCAxMzQgNjI3VjI1NlExMzQgMzUgMzMxIDM1UTUyOCAzNSA1MjggMjU2VjYyN1E1MjggNjUwIDU0OSA2NTBINTU4UTU3NyA2NTAgNTc3IDYyN1YyNTRRNTc3IDEyNCA1MTQgNTdUMzI5IC0xMFpNMzkxIDY2OVEzNjYgNjY5IDM0OCA2ODFUMzE0IDcxMFEyOTkgNzI1IDI4OSA3MzJUMjY4IDczOVEyNTMgNzM5IDI0NiA3MjhUMjM0IDY5N1EyMzEgNjg2IDIyNyA2ODBUMjEzIDY3NFEyMDUgNjc0IDE5NSA2ODFRMTk4IDcyNiAyMTYgNzUzVDI2OSA3ODBRMjk1IDc4MCAzMTMgNzY4VDM0NiA3MzhRMzYxIDcyMyAzNzEgNzE2VDM5MyA3MDlRNDA3IDcwOSA0MTQgNzIwVDQyNyA3NTFRNDMwIDc2MiA0MzQgNzY4VDQ0OCA3NzRRNDU2IDc3NCA0NjUgNzY3UTQ2MyA3MjIgNDQ1IDY5NlQzOTEgNjY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY5OyIgZ2x5cGgtbmFtZT0idXRpbGRlIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjY5IC0xMFEyMjIgLTEwIDE4NyA1VDEyOCA0OFQ5MiAxMTRUODAgMjAxVjQ3M0gxMjhWMjA0UTEyOCAxMjYgMTY1IDgxVDI3MiAzNVEzMzIgMzUgMzc0IDY1VDQzOSAxNDZWNDczSDQ4N1YyUTQ4NyAxIDQ4MiAtMVQ0NzAgLTNRNDU4IC0zIDQ0OSA2VDQ0MCA0NVY4OFE0MTYgNDYgMzczIDE4VDI2OSAtMTBaTTM0NiA1NDRRMzIxIDU0NCAzMDMgNTU2VDI2OSA1ODVRMjU0IDYwMCAyNDQgNjA3VDIyMyA2MTRRMjA4IDYxNCAyMDEgNjAzVDE4OSA1NzJRMTg2IDU2MSAxODIgNTU1VDE2OCA1NDlRMTYwIDU0OSAxNTAgNTU2UTE1MyA2MDEgMTcxIDYyOFQyMjQgNjU1UTI1MCA2NTUgMjY4IDY0M1QzMDEgNjEzUTMxNiA1OTggMzI2IDU5MVQzNDggNTg0UTM2MiA1ODQgMzY5IDU5NVQzODIgNjI2UTM4NSA2MzcgMzg5IDY0M1Q0MDMgNjQ5UTQxMSA2NDkgNDIwIDY0MlE0MTggNTk3IDQwMCA1NzFUMzQ2IDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QTsiIGdseXBoLW5hbWU9IlVtYWNyb24iIGhvcml6LWFkdi14PSI2NjEiIGQ9Ik0zMjkgLTEwUTIwOCAtMTAgMTQ2IDU2VDg0IDI1MlY2MjdRODQgNjUwIDEwNSA2NTBIMTEyUTEzNCA2NTAgMTM0IDYyN1YyNTZRMTM0IDM1IDMzMSAzNVE1MjggMzUgNTI4IDI1NlY2MjdRNTI4IDY1MCA1NDkgNjUwSDU1OFE1NzcgNjUwIDU3NyA2MjdWMjU0UTU3NyAxMjQgNTE0IDU3VDMyOSAtMTBaTTIzOCA3NDFRMjA5IDc0MSAyMDkgNzYyVjc2NlEyMDkgNzg2IDIzOCA3ODZINDQyUTQ3MSA3ODYgNDcxIDc2NlY3NjJRNDcxIDc0MSA0NDIgNzQxSDIzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QjsiIGdseXBoLW5hbWU9InVtYWNyb24iIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik0yNjkgLTEwUTIyMiAtMTAgMTg3IDVUMTI4IDQ4VDkyIDExNFQ4MCAyMDFWNDczSDEyOFYyMDRRMTI4IDEyNiAxNjUgODFUMjcyIDM1UTMzMiAzNSAzNzQgNjVUNDM5IDE0NlY0NzNINDg3VjJRNDg3IDEgNDgyIC0xVDQ3MCAtM1E0NTggLTMgNDQ5IDZUNDQwIDQ1Vjg4UTQxNiA0NiAzNzMgMThUMjY5IC0xMFpNMTg4IDU2N1ExNTkgNTY3IDE1OSA1ODhWNTkyUTE1OSA2MTIgMTg4IDYxMkgzOTJRNDIxIDYxMiA0MjEgNTkyVjU4OFE0MjEgNTY3IDM5MiA1NjdIMTg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgZ2x5cGgtbmFtZT0iVWJyZXZlIiBob3Jpei1hZHYteD0iNjYxIiBkPSJNMzI5IC0xMFEyMDggLTEwIDE0NiA1NlQ4NCAyNTJWNjI3UTg0IDY1MCAxMDUgNjUwSDExMlExMzQgNjUwIDEzNCA2MjdWMjU2UTEzNCAzNSAzMzEgMzVRNTI4IDM1IDUyOCAyNTZWNjI3UTUyOCA2NTAgNTQ5IDY1MEg1NThRNTc3IDY1MCA1NzcgNjI3VjI1NFE1NzcgMTI0IDUxNCA1N1QzMjkgLTEwWk0zMzQgNzE5UTMwMiA3MTkgMjc3IDczMFQyMzUgNzU5UTIxOSA3NzYgMjEyIDc5M1QyMDQgODIwUTIwNCA4MzEgMjEwIDgzOVQyMzMgODQ3UTI0NiA4MDkgMjcyIDc4NlQzMzQgNzYyUTM3MCA3NjIgMzk2IDc4NVQ0MzUgODQ3UTQ1MiA4NDcgNDU4IDgzOVQ0NjQgODIwUTQ2NCA4MTAgNDU3IDc5M1Q0MzMgNzU5UTQxNiA3NDIgMzkxIDczMVQzMzQgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZEOyIgZ2x5cGgtbmFtZT0idWJyZXZlIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjY5IC0xMFEyMjIgLTEwIDE4NyA1VDEyOCA0OFQ5MiAxMTRUODAgMjAxVjQ3M0gxMjhWMjA0UTEyOCAxMjYgMTY1IDgxVDI3MiAzNVEzMzIgMzUgMzc0IDY1VDQzOSAxNDZWNDczSDQ4N1YyUTQ4NyAxIDQ4MiAtMVQ0NzAgLTNRNDU4IC0zIDQ0OSA2VDQ0MCA0NVY4OFE0MTYgNDYgMzczIDE4VDI2OSAtMTBaTTI3NiA1NDVRMjQ0IDU0NSAyMTkgNTU2VDE3NyA1ODVRMTYxIDYwMiAxNTQgNjE5VDE0NiA2NDZRMTQ2IDY1NyAxNTIgNjY1VDE3NSA2NzNRMTg4IDYzNSAyMTQgNjEyVDI3NiA1ODhRMzEyIDU4OCAzMzggNjExVDM3NyA2NzNRMzk0IDY3MyA0MDAgNjY1VDQwNiA2NDZRNDA2IDYzNiAzOTkgNjE5VDM3NSA1ODVRMzU4IDU2OCAzMzMgNTU3VDI3NiA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkU7IiBnbHlwaC1uYW1lPSJVcmluZyIgaG9yaXotYWR2LXg9IjY2MSIgZD0iTTMyOSAtMTBRMjA4IC0xMCAxNDYgNTZUODQgMjUyVjYyN1E4NCA2NTAgMTA1IDY1MEgxMTJRMTM0IDY1MCAxMzQgNjI3VjI1NlExMzQgMzUgMzMxIDM1UTUyOCAzNSA1MjggMjU2VjYyN1E1MjggNjUwIDU0OSA2NTBINTU4UTU3NyA2NTAgNTc3IDYyN1YyNTRRNTc3IDEyNCA1MTQgNTdUMzI5IC0xMFpNMzM3IDcxOFEyODkgNzE4IDI2MCA3NDhUMjMwIDgyNlEyMzAgODczIDI2MCA5MDRUMzM4IDkzNVEzODYgOTM1IDQxNSA5MDRUNDQ1IDgyNlE0NDUgNzgwIDQxNSA3NDlUMzM3IDcxOFpNMzM3IDc1MVEzNjggNzUxIDM4OCA3NzJUNDA4IDgyNlE0MDggODU4IDM4OCA4ODBUMzM3IDkwMlEzMDYgOTAyIDI4NiA4ODBUMjY2IDgyNlEyNjYgNzk0IDI4NiA3NzNUMzM3IDc1MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RjsiIGdseXBoLW5hbWU9InVyaW5nIiBob3Jpei1hZHYteD0iNTcxIiBkPSJNMjY5IC0xMFEyMjIgLTEwIDE4NyA1VDEyOCA0OFQ5MiAxMTRUODAgMjAxVjQ3M0gxMjhWMjA0UTEyOCAxMjYgMTY1IDgxVDI3MiAzNVEzMzIgMzUgMzc0IDY1VDQzOSAxNDZWNDczSDQ4N1YyUTQ4NyAxIDQ4MiAtMVQ0NzAgLTNRNDU4IC0zIDQ0OSA2VDQ0MCA0NVY4OFE0MTYgNDYgMzczIDE4VDI2OSAtMTBaTTI4NyA1MzVRMjM5IDUzNSAyMTAgNTY1VDE4MCA2NDNRMTgwIDY5MCAyMTAgNzIxVDI4OCA3NTJRMzM2IDc1MiAzNjUgNzIxVDM5NSA2NDNRMzk1IDU5NyAzNjUgNTY2VDI4NyA1MzVaTTI4NyA1NjhRMzE4IDU2OCAzMzggNTg5VDM1OCA2NDNRMzU4IDY3NSAzMzggNjk3VDI4NyA3MTlRMjU2IDcxOSAyMzYgNjk3VDIxNiA2NDNRMjE2IDYxMSAyMzYgNTkwVDI4NyA1NjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBnbHlwaC1uYW1lPSJVaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNjYxIiBkPSJNMzI5IC0xMFEyMDggLTEwIDE0NiA1NlQ4NCAyNTJWNjI3UTg0IDY1MCAxMDUgNjUwSDExMlExMzQgNjUwIDEzNCA2MjdWMjU2UTEzNCAzNSAzMzEgMzVRNTI4IDM1IDUyOCAyNTZWNjI3UTUyOCA2NTAgNTQ5IDY1MEg1NThRNTc3IDY1MCA1NzcgNjI3VjI1NFE1NzcgMTI0IDUxNCA1N1QzMjkgLTEwWk0zODIgNzIxUTM4MSA3MjIgMzg4IDczMlQ0MTEgNzU5VDQ0NyA3OTRUNDk1IDgzM1E1MTIgODQ2IDUyMiA4NTBUNTQxIDg1NVE1NDkgODU1IDU1NSA4NTBUNTYyIDgzNVE1NjIgODI1IDU1NCA4MTZUNTI0IDc4OVE0OTcgNzY5IDQ3MiA3NTZUNDI4IDczNFQzOTYgNzIyVDM4MiA3MjFaTTIxOSA3MjFRMjE4IDcyMiAyMjYgNzMyVDI0OSA3NTlUMjg1IDc5NFQzMzMgODMzUTM1MCA4NDYgMzYwIDg1MFQzNzggODU1UTM4NiA4NTUgMzkyIDg1MFQzOTkgODM1UTM5OSA4MjUgMzkyIDgxNlQzNjEgNzg5UTMzNCA3NjkgMzA5IDc1NlQyNjUgNzM0VDIzMyA3MjJUMjE5IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MTsiIGdseXBoLW5hbWU9InVodW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI1NzEiIGQ9Ik0yNjkgLTEwUTIyMiAtMTAgMTg3IDVUMTI4IDQ4VDkyIDExNFQ4MCAyMDFWNDczSDEyOFYyMDRRMTI4IDEyNiAxNjUgODFUMjcyIDM1UTMzMiAzNSAzNzQgNjVUNDM5IDE0NlY0NzNINDg3VjJRNDg3IDEgNDgyIC0xVDQ3MCAtM1E0NTggLTMgNDQ5IDZUNDQwIDQ1Vjg4UTQxNiA0NiAzNzMgMThUMjY5IC0xMFpNMzIwIDU0N1EzMTkgNTQ4IDMyNiA1NThUMzQ5IDU4NVQzODUgNjIwVDQzMyA2NTlRNDUwIDY3MiA0NjAgNjc2VDQ3OSA2ODFRNDg3IDY4MSA0OTMgNjc2VDUwMCA2NjFRNTAwIDY1MSA0OTIgNjQyVDQ2MiA2MTVRNDM1IDU5NSA0MTAgNTgyVDM2NiA1NjBUMzM0IDU0OFQzMjAgNTQ3Wk0xNTcgNTQ3UTE1NiA1NDggMTY0IDU1OFQxODcgNTg1VDIyMyA2MjBUMjcxIDY1OVEyODggNjcyIDI5OCA2NzZUMzE2IDY4MVEzMjQgNjgxIDMzMCA2NzZUMzM3IDY2MVEzMzcgNjUxIDMzMCA2NDJUMjk5IDYxNVEyNzIgNTk1IDI0NyA1ODJUMjAzIDU2MFQxNzEgNTQ4VDE1NyA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBnbHlwaC1uYW1lPSJVb2dvbmVrIiBob3Jpei1hZHYteD0iNjYxIiBkPSJNMzI5IC0xMFEyMDggLTEwIDE0NiA1NlQ4NCAyNTJWNjI3UTg0IDY1MCAxMDUgNjUwSDExMlExMzQgNjUwIDEzNCA2MjdWMjU2UTEzNCAzNSAzMzEgMzVRNTI4IDM1IDUyOCAyNTZWNjI3UTUyOCA2NTAgNTQ5IDY1MEg1NThRNTc3IDY1MCA1NzcgNjI3VjI1NFE1NzcgMTY5IDU1MCAxMTJUNDcxIDIzUTQyNiAtOSA0MTAgLTM0VDM5MyAtODBRMzkzIC05OSA0MDQgLTExMVQ0MzMgLTEyM1E0NjAgLTEyMyA0NzMgLTEwNFE0ODEgLTEwNCA0ODkgLTExMFQ0OTcgLTEyOVE0OTcgLTE0NSA0NzggLTE1NVQ0MzIgLTE2NVEzOTUgLTE2NSAzNzIgLTE0NVQzNDkgLTg5UTM0OSAtNjggMzU4IC00N1QzOTAgLTVRMzc2IC03IDM2MSAtOFQzMjkgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgZ2x5cGgtbmFtZT0idW9nb25layIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTI2OSAtMTBRMjIyIC0xMCAxODcgNVQxMjggNDhUOTIgMTE0VDgwIDIwMVY0NzNIMTI4VjIwNFExMjggMTI2IDE2NSA4MVQyNzIgMzVRMzMyIDM1IDM3NCA2NVQ0MzkgMTQ2VjQ3M0g0ODdWMlE0ODcgMSA0ODIgLTFRNDM0IC0zNCA0MTcgLTYwVDM5OSAtMTA4UTM5OSAtMTI3IDQxMCAtMTM5VDQzOSAtMTUxUTQ2NiAtMTUxIDQ3OSAtMTMyUTQ4NyAtMTMyIDQ5NSAtMTM4VDUwMyAtMTU3UTUwMyAtMTczIDQ4NCAtMTgzVDQzOCAtMTkzUTQwMSAtMTkzIDM3OCAtMTczVDM1NSAtMTE3UTM1NSAtODYgMzc2IC01NVQ0NDkgNlE0NDAgMTYgNDQwIDQ1Vjg4UTQxNiA0NiAzNzMgMThUMjY5IC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NDsiIGdseXBoLW5hbWU9IldjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iOTEyIiBkPSJNNjYgNjM5UTY2IDY0MiA3MyA2NDZUOTEgNjUwVDExMCA2NDNUMTI1IDYxN0wyNjAgNDVMNDE3IDUxOFE0MjIgNTMyIDQzMCA1MzlUNDU4IDU0N1E0NzggNTQ3IDQ4NSA1NDBUNDk3IDUxOEw2NTMgNDZMNzkxIDYxN1E3OTUgNjM2IDgwNCA2NDNUODIzIDY1MFQ4MzkgNjQ2VDg0NiA2MzlMNjg3IDBINjIwTDQ1OCA0OTdMMjkwIDBIMjI1TDY2IDYzOVpNMzU1IDcwNVEzMzkgNzA1IDMzOSA3MjJRMzM5IDczMyAzNTIgNzUxVDM5MCA3OThRNDE5IDgzMCA0MzggODQ2VDQ1OSA4NjNRNDYxIDg2MyA0ODAgODQ3VDUyNiA4MDBRNTUxIDc3MSA1NjQgNzUzVDU3OCA3MjJRNTc4IDcwNSA1NjMgNzA1UTU1MyA3MDUgNTQwIDcxN1Q0OTggNzY3TDQ1OCA4MjBMNDE4IDc2NlEzOTMgNzMyIDM3OSA3MTlUMzU1IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NTsiIGdseXBoLW5hbWU9IndjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjk0IiBkPSJNNDQgNDYzUTQ0IDQ2NSA1MSA0NzBUNjcgNDc2VDg2IDQ3MFQxMDEgNDQxTDE5OCA0NEwzMTIgMzc5UTMxNSAzOTAgMzIyIDM5NVQzNDkgNDAwUTM2NyA0MDAgMzc0IDM5NVQzODYgMzc5TDQ5OSA0NEw1OTUgNDQxUTYwMCA0NjMgNjA5IDQ3MFQ2MjggNDc2VDY0NCA0NzBUNjUxIDQ2M0w1MjkgMEg0NzBMMzQ5IDM1M0wyMjUgMEgxNjZMNDQgNDYzWk0yNDUgNTM4UTIyOSA1MzggMjI5IDU1NVEyMjkgNTY2IDI0MiA1ODRUMjgwIDYzMVEzMDkgNjYzIDMyOCA2NzlUMzQ5IDY5NlEzNTEgNjk2IDM3MCA2ODBUNDE2IDYzM1E0NDEgNjA0IDQ1NCA1ODZUNDY4IDU1NVE0NjggNTM4IDQ1MyA1MzhRNDQzIDUzOCA0MzAgNTUwVDM4OCA2MDBMMzQ4IDY1M0wzMDggNTk5UTI4MyA1NjUgMjY5IDU1MlQyNDUgNTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc2OyIgZ2x5cGgtbmFtZT0iWWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NjgiIGQ9Ik0yNTkgMjc3TDI0IDY0N0g3OUwyODQgMzIyTDQ4OSA2MzJRNDk4IDY0NiA1MDggNjQ4VDUyNiA2NDhUNTM5IDYzOVQ1NDQgNjI5TDMwOSAyNzdWMEgyNTlWMjc3Wk0xODIgNzE5UTE2NiA3MTkgMTY2IDczNlExNjYgNzQ3IDE3OSA3NjVUMjE3IDgxMlEyNDYgODQ0IDI2NSA4NjBUMjg2IDg3N1EyODggODc3IDMwNyA4NjFUMzUzIDgxNFEzNzggNzg1IDM5MSA3NjdUNDA1IDczNlE0MDUgNzE5IDM5MCA3MTlRMzgwIDcxOSAzNjcgNzMxVDMyNSA3ODFMMjg1IDgzNEwyNDUgNzgwUTIyMCA3NDYgMjA2IDczM1QxODIgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc3OyIgZ2x5cGgtbmFtZT0ieWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI0ODgiIGQ9Ik0xODIgLTE5M1ExNzIgLTE5MyAxNjQgLTE4OFQxNTcgLTE4MEwyNDEgMjZRMjI4IDI2IDIyMiAzMFQyMTEgNDVMMjUgNDczSDc1TDI1NCA1Nkw0MTMgNDczSDQ2NEwyMTYgLTE2MVEyMDkgLTE4MSAyMDEgLTE4N1QxODIgLTE5M1pNMTUxIDU0NVExMzUgNTQ1IDEzNSA1NjJRMTM1IDU3MyAxNDggNTkxVDE4NiA2MzhRMjE1IDY3MCAyMzQgNjg2VDI1NSA3MDNRMjU3IDcwMyAyNzYgNjg3VDMyMiA2NDBRMzQ3IDYxMSAzNjAgNTkzVDM3NCA1NjJRMzc0IDU0NSAzNTkgNTQ1UTM0OSA1NDUgMzM2IDU1N1QyOTQgNjA3TDI1NCA2NjBMMjE0IDYwNlExODkgNTcyIDE3NSA1NTlUMTUxIDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3ODsiIGdseXBoLW5hbWU9IllkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU2OCIgZD0iTTI1OSAyNzdMMjQgNjQ3SDc5TDI4NCAzMjJMNDg5IDYzMlE0OTggNjQ2IDUwOCA2NDhUNTI2IDY0OFQ1MzkgNjM5VDU0NCA2MjlMMzA5IDI3N1YwSDI1OVYyNzdaTTM2MyA3MTlRMzI1IDcxOSAzMjUgNzU3UTMyNSA3OTUgMzYyIDc5NVEzNzkgNzk1IDM4OSA3ODVUNDAwIDc1N1E0MDAgNzM5IDM5MCA3MjlUMzYzIDcxOVpNMjA0IDcxOVExODcgNzE5IDE3NyA3MjlUMTY2IDc1N1ExNjYgNzc1IDE3NiA3ODVUMjAzIDc5NVEyNDEgNzk1IDI0MSA3NTdRMjQxIDczOSAyMzEgNzI5VDIwNCA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzk7IiBnbHlwaC1uYW1lPSJaYWN1dGUiIGhvcml6LWFkdi14PSI2MTUiIGQ9Ik02MSA1M0w0ODggNjAySDg5UTY2IDYwMiA2NiA2MjJWNjI2UTY2IDY0NyA4OSA2NDdINTQzVjU5N0wxMTUgNDZINTMzUTU1NyA0NiA1NTcgMjVWMjFRNTU3IDAgNTMzIDBINjFWNTNaTTI2NCA3MjFRMjYzIDcyMiAyNzEgNzMyVDI5NCA3NTlUMzMwIDc5NFQzNzggODMzUTM5NSA4NDYgNDA1IDg1MFQ0MjMgODU1UTQzMiA4NTUgNDM4IDg1MFQ0NDUgODM1UTQ0NSA4MjUgNDM3IDgxNlQ0MDcgNzg5UTM4MCA3NjkgMzU1IDc1NlQzMTAgNzM0VDI3OCA3MjJUMjY0IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QTsiIGdseXBoLW5hbWU9InphY3V0ZSIgaG9yaXotYWR2LXg9IjQ5MCIgZD0iTTUxIDM3TDM3MCA0MzJINzhRNjQgNDMyIDU5IDQzNlQ1NCA0NTBWNDU1UTU0IDQ2NCA1OSA0NjhUNzggNDczSDQzNFY0NDBMMTEyIDQxSDQxNlE0NDEgNDEgNDQxIDIzVjE4UTQ0MSAwIDQxNiAwSDUxVjM3Wk0yMDkgNTQ3UTIwOCA1NDggMjE2IDU1OFQyMzkgNTg1VDI3NSA2MjBUMzIzIDY1OVEzNDAgNjcyIDM1MCA2NzZUMzY4IDY4MVEzNzcgNjgxIDM4MyA2NzZUMzkwIDY2MVEzOTAgNjUxIDM4MiA2NDJUMzUyIDYxNVEzMjUgNTk1IDMwMCA1ODJUMjU1IDU2MFQyMjMgNTQ4VDIwOSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBnbHlwaC1uYW1lPSJaZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjE1IiBkPSJNNjEgNTNMNDg4IDYwMkg4OVE2NiA2MDIgNjYgNjIyVjYyNlE2NiA2NDcgODkgNjQ3SDU0M1Y1OTdMMTE1IDQ2SDUzM1E1NTcgNDYgNTU3IDI1VjIxUTU1NyAwIDUzMyAwSDYxVjUzWk0zMDMgNzIwUTI4MyA3MjAgMjczIDczMVQyNjIgNzYwUTI2MiA3NzcgMjczIDc4OFQzMDQgNzk5UTMyMyA3OTkgMzM0IDc4OFQzNDUgNzYwUTM0NSA3NDMgMzM0IDczMlQzMDMgNzIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdDOyIgZ2x5cGgtbmFtZT0iemRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjQ5MCIgZD0iTTUxIDM3TDM3MCA0MzJINzhRNjQgNDMyIDU5IDQzNlQ1NCA0NTBWNDU1UTU0IDQ2NCA1OSA0NjhUNzggNDczSDQzNFY0NDBMMTEyIDQxSDQxNlE0NDEgNDEgNDQxIDIzVjE4UTQ0MSAwIDQxNiAwSDUxVjM3Wk0yNDkgNTQ2UTIyOSA1NDYgMjE5IDU1N1QyMDggNTg2UTIwOCA2MDMgMjE5IDYxNFQyNTAgNjI1UTI2OSA2MjUgMjgwIDYxNFQyOTEgNTg2UTI5MSA1NjkgMjgwIDU1OFQyNDkgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdEOyIgZ2x5cGgtbmFtZT0iWmNhcm9uIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNNjEgNTNMNDg4IDYwMkg4OVE2NiA2MDIgNjYgNjIyVjYyNlE2NiA2NDcgODkgNjQ3SDU0M1Y1OTdMMTE1IDQ2SDUzM1E1NTcgNDYgNTU3IDI1VjIxUTU1NyAwIDUzMyAwSDYxVjUzWk0zMDEgNzAzUTI5OSA3MDMgMjgwIDcxOVQyMzQgNzY2UTIwOSA3OTUgMTk2IDgxM1QxODIgODQ0UTE4MiA4NjEgMTk3IDg2MVEyMDcgODYxIDIyMCA4NDlUMjYyIDc5OUwzMDIgNzQ2TDM0MiA4MDBRMzY3IDgzMyAzODEgODQ3VDQwNSA4NjFRNDIxIDg2MSA0MjEgODQ0UTQyMSA4MzMgNDA4IDgxNVQzNzAgNzY4UTM0MiA3MzYgMzIzIDcyMFQzMDEgNzAzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdFOyIgZ2x5cGgtbmFtZT0iemNhcm9uIiBob3Jpei1hZHYteD0iNDkwIiBkPSJNNTEgMzdMMzcwIDQzMkg3OFE2NCA0MzIgNTkgNDM2VDU0IDQ1MFY0NTVRNTQgNDY0IDU5IDQ2OFQ3OCA0NzNINDM0VjQ0MEwxMTIgNDFINDE2UTQ0MSA0MSA0NDEgMjNWMThRNDQxIDAgNDE2IDBINTFWMzdaTTI0MCA1MjlRMjM4IDUyOSAyMTkgNTQ1VDE3MyA1OTJRMTQ4IDYyMSAxMzUgNjM5VDEyMSA2NzBRMTIxIDY4NyAxMzYgNjg3UTE0NiA2ODcgMTU5IDY3NVQyMDEgNjI1TDI0MSA1NzJMMjgxIDYyNlEzMDYgNjU5IDMyMCA2NzNUMzQ0IDY4N1EzNjAgNjg3IDM2MCA2NzBRMzYwIDY1OSAzNDcgNjQxVDMwOSA1OTRRMjgxIDU2MiAyNjIgNTQ2VDI0MCA1MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxOTI7IiBnbHlwaC1uYW1lPSJmbG9yaW4iIGhvcml6LWFkdi14PSI0MDUiIGQ9Ik05MCAtM1E3OSAtMyA3MyAxVDY3IDdMMTM2IDM4N0g2MVE0NyAzODcgNDMgMzkyVDM4IDQwNlY0MTFRMzggNDIwIDQyIDQyNVQ2MSA0MzBIMTQzTDE1NSA0OTdRMTY5IDU3NyAyMDcgNjE3VDMwNCA2NTdRMzI5IDY1NyAzNDcgNjUwVDM3NyA2MzJRMzkwIDYxOSAzOTAgNjA3UTM5MCA1OTQgMzgxIDU4NlQzNzEgNTc4UTM2MSA1OTMgMzQyIDYwM1QzMDAgNjEzUTI2MSA2MTMgMjM3IDU4NFQyMDIgNDg5TDE5MSA0MzBIMzE5UTMzMyA0MzAgMzM4IDQyNVQzNDMgNDExVjQwNlEzNDMgMzk3IDMzOCAzOTJUMzE5IDM4N0gxODRMMTIxIDM5UTExNSAtMyA5MCAtM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxODsiIGdseXBoLW5hbWU9IlNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU2NSIgZD0iTTI4OCAtMTBRMjE2IC0xMCAxNjYgMTFUODcgNjBRNzAgNzcgNjMgOTJUNTUgMTE5UTU1IDEyNyA1OSAxMzNUNjkgMTQzVDc5IDE0OFQ4NSAxNDlROTUgMTI4IDExMiAxMDdUMTUzIDcwVDIxMSA0M1QyODcgMzNRMzY3IDMzIDQxMiA2OFQ0NTggMTY2UTQ1OCAyMDEgNDQzIDIyNFQ0MDIgMjYyVDM0MyAyODdUMjcyIDMwNlEyMzQgMzE1IDE5OSAzMjZUMTM1IDM1N1Q4OSA0MDdUNzIgNDgzUTcyIDUyMSA4OCA1NTNUMTMyIDYwOFQxOTkgNjQ0VDI4MyA2NTdRMzQ5IDY1NyAzOTQgNjM4VDQ2NCA1OTVRNDc4IDU4MSA0ODUgNTY3VDQ5MiA1NDNRNDkyIDUzNSA0ODggNTI5VDQ3OCA1MTlUNDY4IDUxM1Q0NjIgNTEyUTQ1MyA1MzIgNDM4IDU1MFQ0MDAgNTgzVDM0OCA2MDVUMjgzIDYxNFEyNDggNjE0IDIxOCA2MDVUMTY3IDU3OVQxMzMgNTM4VDEyMSA0ODRRMTIxIDQ1MSAxMzQgNDMwVDE3MSAzOTRUMjI3IDM3MFQyOTcgMzUyUTMzNiAzNDMgMzczIDMzMVQ0NDEgMjk4VDQ4OSAyNDZUNTA3IDE2OFE1MDcgMTI4IDQ5MiA5NVQ0NDcgMzlUMzc4IDNUMjg4IC0xMFpNMjIyIC0yNzBRMjIwIC0yNzMgMjE1IC0yNzRUMjA2IC0yNzRUMTk4IC0yNjlUMTk3IC0yNTlMMjU5IC05NFEyNjQgLTgwIDI2OSAtNzRUMjg4IC02N0gyOTJRMzAxIC02NyAzMDcgLTczVDMxNCAtOTNWLTk2UTMxNCAtMTAyIDMxMiAtMTEwVDMwMiAtMTMzTDIyMiAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE5OyIgZ2x5cGgtbmFtZT0ic2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNDc0IiBkPSJNMjM3IC0xMFExNzQgLTEwIDEzMyA2VDY5IDQ1UTU2IDU4IDUxIDY3VDQ2IDg0UTQ2IDkxIDUwIDk2VDU4IDEwNVQ2NyAxMDlUNzIgMTEwUTk0IDc2IDEzNSA1M1QyMzkgMzBRMzA0IDMwIDMzOSA1NlQzNzUgMTIyUTM3NSAxNDYgMzY1IDE2MVQzMzUgMTg3VDI4OCAyMDRUMjI4IDIxOFExOTkgMjI0IDE2OSAyMzFUMTE1IDI1M1Q3NiAyODlUNjAgMzQ2UTYwIDM3NiA3MiA0MDFUMTA4IDQ0NVQxNjQgNDczVDIzNyA0ODNRMjkzIDQ4MyAzMzEgNDY4VDM5MCA0MzFRNDA4IDQxMyA0MDggMzk2UTQwOCAzODkgNDA0IDM4NFQzOTYgMzc1VDM4NyAzNzFUMzgyIDM3MVEzNjQgNDAyIDMyNiA0MjJUMjM3IDQ0M1ExNzUgNDQzIDE0MSA0MThUMTA2IDM1M1ExMDYgMzMwIDExNiAzMTZUMTQ0IDI5MVQxODkgMjc0VDI0OCAyNjBRMjc4IDI1NCAzMDkgMjQ2VDM2NSAyMjRUNDA2IDE4N1Q0MjIgMTI5UTQyMiA2NyAzNzMgMjlUMjM3IC0xMFpNMTU5IC0yNzBRMTU3IC0yNzMgMTUyIC0yNzRUMTQzIC0yNzRUMTM1IC0yNjlUMTM0IC0yNTlMMTk2IC05NFEyMDEgLTgwIDIwNiAtNzRUMjI1IC02N0gyMjlRMjM4IC02NyAyNDQgLTczVDI1MSAtOTNWLTk2UTI1MSAtMTAyIDI0OSAtMTEwVDIzOSAtMTMzTDE1OSAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjFBOyIgZ2x5cGgtbmFtZT0idW5pMDIxQSIgaG9yaXotYWR2LXg9IjU5OSIgZD0iTTI3NSA2MDJINjFRMzggNjAyIDM4IDYyMlY2MjZRMzggNjQ3IDYxIDY0N0g1MzhRNTYyIDY0NyA1NjIgNjI2VjYyMlE1NjIgNjAyIDUzOCA2MDJIMzI1VjBIMjc1VjYwMlpNMjQwIC0yNzBRMjM4IC0yNzMgMjMzIC0yNzRUMjI0IC0yNzRUMjE2IC0yNjlUMjE1IC0yNTlMMjc3IC05NFEyODIgLTgwIDI4NyAtNzRUMzA2IC02N0gzMTBRMzE5IC02NyAzMjUgLTczVDMzMiAtOTNWLTk2UTMzMiAtMTAyIDMzMCAtMTEwVDMyMCAtMTMzTDI0MCAtMjcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjFCOyIgZ2x5cGgtbmFtZT0idW5pMDIxQiIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTIzNyAtMTBRMTc0IC0xMCAxNDQgMjZUMTEzIDEzN1Y0MzBIMzVWNDczSDExM1Y1NjVRMTEzIDU3OSAxMTkgNTg0VDEzNCA1ODlIMTQwUTE0OSA1ODkgMTU0IDU4NFQxNjAgNTY1VjQ3M0gzMTdWNDMwSDE2MFYxNDJRMTYwIDgzIDE3OCA1N1QyMzkgMzFRMjY1IDMxIDI4NCA0MlQzMTYgNzJRMzE4IDc0IDMyNSA2OFQzMzIgNDhRMzMyIDQyIDMyOSAzNFQzMTYgMThRMzA1IDYgMjg2IC0yVDIzNyAtMTBaTTE0OSAtMjcwUTE0NyAtMjczIDE0MiAtMjc0VDEzMyAtMjc0VDEyNSAtMjY5VDEyNCAtMjU5TDE4NiAtOTRRMTkxIC04MCAxOTYgLTc0VDIxNSAtNjdIMjE5UTIyOCAtNjcgMjM0IC03M1QyNDEgLTkzVi05NlEyNDEgLTEwMiAyMzkgLTExMFQyMjkgLTEzM0wxNDkgLTI3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNjsiIGdseXBoLW5hbWU9ImNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xNjEgNTQ1UTE0NSA1NDUgMTQ1IDU2MlExNDUgNTczIDE1OCA1OTFUMTk2IDYzOFEyMjUgNjcwIDI0NCA2ODZUMjY1IDcwM1EyNjcgNzAzIDI4NiA2ODdUMzMyIDY0MFEzNTcgNjExIDM3MCA1OTNUMzg0IDU2MlEzODQgNTQ1IDM2OSA1NDVRMzU5IDU0NSAzNDYgNTU3VDMwNCA2MDdMMjY0IDY2MEwyMjQgNjA2UTE5OSA1NzIgMTg1IDU1OVQxNjEgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM3OyIgZ2x5cGgtbmFtZT0iY2Fyb24iIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0yNjUgNTI5UTI2MyA1MjkgMjQ0IDU0NVQxOTggNTkyUTE3MyA2MjEgMTYwIDYzOVQxNDYgNjcwUTE0NiA2ODcgMTYxIDY4N1ExNzEgNjg3IDE4NCA2NzVUMjI2IDYyNUwyNjYgNTcyTDMwNiA2MjZRMzMxIDY1OSAzNDUgNjczVDM2OSA2ODdRMzg1IDY4NyAzODUgNjcwUTM4NSA2NTkgMzcyIDY0MVQzMzQgNTk0UTMwNiA1NjIgMjg3IDU0NlQyNjUgNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM5OyIgZ2x5cGgtbmFtZT0ib3ZlcnNjb3JlIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMTYzIDU2N1ExMzQgNTY3IDEzNCA1ODhWNTkyUTEzNCA2MTIgMTYzIDYxMkgzNjdRMzk2IDYxMiAzOTYgNTkyVjU4OFEzOTYgNTY3IDM2NyA1NjdIMTYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ4OyIgZ2x5cGgtbmFtZT0iYnJldmUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0yNjUgNTQ1UTIzMyA1NDUgMjA4IDU1NlQxNjYgNTg1UTE1MCA2MDIgMTQzIDYxOVQxMzUgNjQ2UTEzNSA2NTcgMTQxIDY2NVQxNjQgNjczUTE3NyA2MzUgMjAzIDYxMlQyNjUgNTg4UTMwMSA1ODggMzI3IDYxMVQzNjYgNjczUTM4MyA2NzMgMzg5IDY2NVQzOTUgNjQ2UTM5NSA2MzYgMzg4IDYxOVQzNjQgNTg1UTM0NyA1NjggMzIyIDU1N1QyNjUgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ5OyIgZ2x5cGgtbmFtZT0iZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMjY1IDU0NlEyNDUgNTQ2IDIzNSA1NTdUMjI0IDU4NlEyMjQgNjAzIDIzNSA2MTRUMjY2IDYyNVEyODUgNjI1IDI5NiA2MTRUMzA3IDU4NlEzMDcgNTY5IDI5NiA1NThUMjY1IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQTsiIGdseXBoLW5hbWU9InJpbmciIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0yNjQgNTQ0UTIxNiA1NDQgMTg3IDU3NFQxNTcgNjUyUTE1NyA2OTkgMTg3IDczMFQyNjUgNzYxUTMxMyA3NjEgMzQyIDczMFQzNzIgNjUyUTM3MiA2MDYgMzQyIDU3NVQyNjQgNTQ0Wk0yNjQgNTc3UTI5NSA1NzcgMzE1IDU5OFQzMzUgNjUyUTMzNSA2ODQgMzE1IDcwNlQyNjQgNzI4UTIzMyA3MjggMjEzIDcwNlQxOTMgNjUyUTE5MyA2MjAgMjEzIDU5OVQyNjQgNTc3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRCOyIgZ2x5cGgtbmFtZT0ib2dvbmVrIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMzI2IDFRMjc3IC0zMyAyNTkgLTU5VDI0MCAtMTA4UTI0MCAtMTI3IDI1MSAtMTM5VDI4MCAtMTUxUTMwNyAtMTUxIDMyMCAtMTMyUTMyOCAtMTMyIDMzNiAtMTM4VDM0NCAtMTU3UTM0NCAtMTczIDMyNSAtMTgzVDI3OSAtMTkzUTI0MiAtMTkzIDIxOSAtMTczVDE5NiAtMTE3UTE5NiAtODIgMjI0IC00N1QzMTggMjFMMzI2IDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREM7IiBnbHlwaC1uYW1lPSJ0aWxkZSIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTMyNSA1NDRRMzAwIDU0NCAyODIgNTU2VDI0OCA1ODVRMjMzIDYwMCAyMjMgNjA3VDIwMiA2MTRRMTg3IDYxNCAxODAgNjAzVDE2OCA1NzJRMTY1IDU2MSAxNjEgNTU1VDE0NyA1NDlRMTM5IDU0OSAxMjkgNTU2UTEzMiA2MDEgMTUwIDYyOFQyMDMgNjU1UTIyOSA2NTUgMjQ3IDY0M1QyODAgNjEzUTI5NSA1OTggMzA1IDU5MVQzMjcgNTg0UTM0MSA1ODQgMzQ4IDU5NVQzNjEgNjI2UTM2NCA2MzcgMzY4IDY0M1QzODIgNjQ5UTM5MCA2NDkgMzk5IDY0MlEzOTcgNTk3IDM3OSA1NzFUMzI1IDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJERDsiIGdseXBoLW5hbWU9Imh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTI4NyA1NDdRMjg2IDU0OCAyOTMgNTU4VDMxNiA1ODVUMzUyIDYyMFQ0MDAgNjU5UTQxNyA2NzIgNDI3IDY3NlQ0NDYgNjgxUTQ1NCA2ODEgNDYwIDY3NlQ0NjcgNjYxUTQ2NyA2NTEgNDU5IDY0MlQ0MjkgNjE1UTQwMiA1OTUgMzc3IDU4MlQzMzMgNTYwVDMwMSA1NDhUMjg3IDU0N1pNMTI0IDU0N1ExMjMgNTQ4IDEzMSA1NThUMTU0IDU4NVQxOTAgNjIwVDIzOCA2NTlRMjU1IDY3MiAyNjUgNjc2VDI4MyA2ODFRMjkxIDY4MSAyOTcgNjc2VDMwNCA2NjFRMzA0IDY1MSAyOTcgNjQyVDI2NiA2MTVRMjM5IDU5NSAyMTQgNTgyVDE3MCA1NjBUMTM4IDU0OFQxMjQgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Mzk0OyIgZ2x5cGgtbmFtZT0iaW5jcmVtZW50IiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNMjkzIDcwMEgzOTZMNjMzIDBIMzBMMjkzIDcwMFpNMTQwIDczSDQ2NUwzMTAgNTI4TDE0MCA3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDNBOTsiIGdseXBoLW5hbWU9Ik9tZWdhIiBob3Jpei1hZHYteD0iNzYwIiBkPSJNMzgwIDYwMlEzMTggNjAyIDI3MiA1ODVUMTk2IDUzN1QxNTAgNDY3VDEzNSAzODBRMTM1IDMzNSAxNDkgMjk0VDE4OCAyMTZUMjQ5IDE0OFQzMjUgOTNWMEg1MVY5M0gxODhRMTE0IDE1MyA3MiAyMjVUMzAgMzgwUTMwIDQ0NiA1NCA1MDRUMTI0IDYwNVQyMzUgNjc0VDM4MCA3MDBRNDYwIDcwMCA1MjUgNjc1VDYzNSA2MDZUNzA1IDUwNFQ3MzAgMzgwUTczMCAyOTcgNjg4IDIyNVQ1NzIgOTNINzA5VjBINDM1VjkzUTQ3NiAxMTcgNTExIDE0OFQ1NzEgMjE1VDYxMSAyOTNUNjI1IDM4MFE2MjUgNDI2IDYxMCA0NjZUNTY1IDUzN1Q0ODggNTg0VDM4MCA2MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQkM7IiBnbHlwaC1uYW1lPSJtdSIgaG9yaXotYWR2LXg9IjU3MSIgZD0iTTgwIDQ3M0gxMjhWMjA0UTEyOCAxMjYgMTY1IDgxVDI3MiAzNVEzMzIgMzUgMzc0IDY1VDQzOSAxNDZWNDczSDQ4N1YyUTQ4NyAxIDQ4MiAtMVQ0NzAgLTNRNDU4IC0zIDQ0OSA2VDQ0MCA0NVY4OFE0MTYgNDYgMzczIDE4VDI2OSAtMTBRMjIyIC0xMCAxODcgNVQxMjggNDdWLTI2MEg4MFY0NzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQzA7IiBnbHlwaC1uYW1lPSJwaSIgaG9yaXotYWR2LXg9Ijc3OSIgZD0iTTM4OSAtMTBRMzE3IC0xMCAyNTggMTRUMTU1IDgzVDg4IDE4OFQ2NCAzMjJRNjQgMzk0IDg4IDQ1NVQxNTYgNTYxVDI2MCA2MzFUMzkwIDY1N1E0NjIgNjU3IDUyMiA2MzNUNjI1IDU2NFQ2OTIgNDU5VDcxNiAzMjVRNzE2IDI1MyA2OTIgMTkyVDYyMyA4NlQ1MTkgMTZUMzg5IC0xMFpNMzkxIDI2UTQ1NCAyNiA1MDYgNDhUNTk2IDEwOVQ2NTUgMjAzVDY3NiAzMjRRNjc2IDM4OCA2NTUgNDQzVDU5NSA1MzdUNTA0IDU5OVQzODkgNjIyUTMyNiA2MjIgMjc0IDYwMFQxODQgNTM5VDEyNSA0NDRUMTA0IDMyM1ExMDQgMjU4IDEyNSAyMDRUMTg1IDExMFQyNzUgNDhUMzkxIDI2Wk0zMDQgMTM5UTI4NiAxMzkgMjg2IDE2MFY0NTlRMjg2IDQ3MCAyOTIgNDc3VDMxMCA0ODVINDA0UTQ2OCA0ODUgNTAyIDQ1N1Q1MzcgMzc1UTUzNyAzMjEgNTA0IDI5M1Q0MDYgMjY0SDMzMFYxNjBRMzMwIDEzOSAzMTEgMTM5SDMwNFpNNDA3IDMwMFE0NTAgMzAwIDQ3MiAzMTlUNDk0IDM3NFE0OTQgNDA5IDQ3MiA0MjhUNDA0IDQ0OEgzMzBWMzAwSDQwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTM7IiBnbHlwaC1uYW1lPSJlbmRhc2giIGhvcml6LWFkdi14PSI1MzEiIGQ9Ik04MCAyMjdRNTcgMjI3IDU3IDI0NlYyNTBRNTcgMjcwIDgwIDI3MEg0NTFRNDY1IDI3MCA0NjkgMjY1VDQ3NCAyNTBWMjQ2UTQ3NCAyMzYgNDcwIDIzMlQ0NTEgMjI3SDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxNDsiIGdseXBoLW5hbWU9ImVtZGFzaCIgaG9yaXotYWR2LXg9IjY5NSIgZD0iTTgwIDIyN1E1NyAyMjcgNTcgMjQ2VjI1MFE1NyAyNzAgODAgMjcwSDYxNFE2MjggMjcwIDYzMyAyNjVUNjM4IDI1MFYyNDZRNjM4IDIzNiA2MzMgMjMyVDYxNCAyMjdIODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE4OyIgZ2x5cGgtbmFtZT0icXVvdGVsZWZ0IiBob3Jpei1hZHYteD0iMjIyIiBkPSJNODIgNDM5UTcyIDQzOSA2NiA0NDZUNTkgNDY1VjQ2OFE1OSA0NzQgNjEgNDgyVDcxIDUwNEwxNDggNjUzUTE0OSA2NTYgMTU0IDY1N1QxNjQgNjU3VDE3MiA2NTJUMTczIDY0MkwxMTUgNDY2UTExMCA0NTMgMTA1IDQ0NlQ4NSA0MzlIODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE5OyIgZ2x5cGgtbmFtZT0icXVvdGVyaWdodCIgaG9yaXotYWR2LXg9IjIyMiIgZD0iTTc0IDQ0M1E3MiA0NDAgNjcgNDM5VDU4IDQzOVQ1MCA0NDVUNDkgNDU1TDEwOCA2MzBRMTEzIDY0NCAxMTggNjUwVDEzNyA2NTdIMTQxUTE1MCA2NTcgMTU2IDY1MFQxNjMgNjMxVjYyOFExNjMgNjIyIDE2MSA2MTRUMTUxIDU5Mkw3NCA0NDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFBOyIgZ2x5cGgtbmFtZT0icXVvdGVzaW5nbGJhc2UiIGhvcml6LWFkdi14PSIyMTYiIGQ9Ik01NyAtMTM0UTU1IC0xMzcgNTEgLTEzOFQ0MSAtMTM4VDMzIC0xMzNUMzIgLTEyM0w5MSA1MlE5NiA2NiAxMDEgNzJUMTIwIDc5SDEyNFExMzMgNzkgMTM5IDczVDE0NiA1M1Y1MVExNDYgNDQgMTQ0IDM2VDEzNCAxNEw1NyAtMTM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQzsiIGdseXBoLW5hbWU9InF1b3RlZGJsbGVmdCIgaG9yaXotYWR2LXg9IjM2MCIgZD0iTTIyMCA0MzlRMjExIDQzOSAyMDQgNDQ2VDE5NyA0NjVWNDY4UTE5NyA0NzQgMTk5IDQ4MlQyMTAgNTA0TDI4NiA2NTNRMjg4IDY1NiAyOTMgNjU3VDMwMiA2NTdUMzEwIDY1MlQzMTEgNjQyTDI1MyA0NjZRMjQ4IDQ1MyAyNDMgNDQ2VDIyNCA0MzlIMjIwWk04MiA0MzlRNzMgNDM5IDY2IDQ0NlQ1OSA0NjVWNDY4UTU5IDQ3NCA2MSA0ODJUNzEgNTA0TDE0OCA2NTNRMTQ5IDY1NiAxNTQgNjU3VDE2NCA2NTdUMTcyIDY1MlQxNzMgNjQyTDExNSA0NjZRMTEwIDQ1MyAxMDUgNDQ2VDg2IDQzOUg4MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUQ7IiBnbHlwaC1uYW1lPSJxdW90ZWRibHJpZ2h0IiBob3Jpei1hZHYteD0iMzYwIiBkPSJNMjEyIDQ0M1EyMTAgNDQwIDIwNiA0MzlUMTk2IDQzOVQxODggNDQ1VDE4NyA0NTVMMjQ2IDYzMFEyNTEgNjQ0IDI1NiA2NTBUMjc1IDY1N0gyNzlRMjg4IDY1NyAyOTQgNjUwVDMwMSA2MzFWNjI4UTMwMSA2MjIgMzAwIDYxNFQyOTAgNTkyTDIxMiA0NDNaTTczIDQ0M1E3MSA0NDAgNjcgNDM5VDU3IDQzOVQ0OSA0NDVUNDggNDU1TDEwNyA2MzBRMTEyIDY0NCAxMTcgNjUwVDEzNiA2NTdIMTQwUTE0OSA2NTcgMTU1IDY1MFQxNjIgNjMxVjYyOFExNjIgNjIyIDE2MCA2MTRUMTUwIDU5Mkw3MyA0NDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDFFOyIgZ2x5cGgtbmFtZT0icXVvdGVkYmxiYXNlIiBob3Jpei1hZHYteD0iMzU1IiBkPSJNMTk2IC0xMzRRMTk0IC0xMzcgMTg5IC0xMzhUMTgwIC0xMzhUMTcyIC0xMzNUMTcxIC0xMjNMMjMwIDUyUTIzNSA2NiAyNDAgNzJUMjU5IDc5SDI2M1EyNzIgNzkgMjc4IDczVDI4NSA1M1Y1MVEyODUgNDQgMjgzIDM2VDI3MyAxNEwxOTYgLTEzNFpNNTYgLTEzNFE1NCAtMTM3IDUwIC0xMzhUNDEgLTEzOFQzMyAtMTMzVDMyIC0xMjNMOTAgNTJROTUgNjYgMTAwIDcyVDExOSA3OUgxMjNRMTMyIDc5IDEzOCA3M1QxNDUgNTNWNTFRMTQ1IDQ0IDE0NCAzNlQxMzQgMTRMNTYgLTEzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjA7IiBnbHlwaC1uYW1lPSJkYWdnZXIiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik0yNjEgLTE1NlEyNDkgLTE1NiAyNDYgLTE0OVQyNDIgLTEzMUwyMzggMzE2UTIzOCAzMzEgMjQxIDM0N1QyNDkgMzgwTDc1IDM3MlE1NSAzNzAgNDggMzc1VDQxIDM5NlE0MSA0MTMgNDggNDE4VDc1IDQyMUwyNDggNDEyTDIzOCA2MTdRMjM2IDYzNyAyNDEgNjQ0VDI2NCA2NTJRMjgxIDY1MiAyODYgNjQ1VDI5MCA2MTdMMjgwIDQxMkw0NTIgNDIxUTQ3MiA0MjMgNDc5IDQxOFQ0ODcgMzk2UTQ4NyAzODAgNDgwIDM3NVQ0NTIgMzcyTDI3OCAzODBRMjgzIDM2NCAyODYgMzQ4VDI5MCAzMTZMMjg2IC0xMzFRMjg2IC0xNDIgMjgyIC0xNDlUMjY2IC0xNTZIMjYxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMTsiIGdseXBoLW5hbWU9ImRhZ2dlcmRibCIgaG9yaXotYWR2LXg9IjUyNyIgZD0iTTI2MSAtMTU2UTI0OSAtMTU2IDI0NiAtMTQ5VDI0MiAtMTMxTDIzOSAxMDZMNzUgOThRNTUgOTYgNDggMTAxVDQxIDEyMlE0MSAxMzggNDggMTQzVDc1IDE0NkwyMzkgMTM4TDIzOCAzMTZRMjM4IDMzMSAyNDEgMzQ3VDI0OSAzODBMNzUgMzcyUTU1IDM3MCA0OCAzNzVUNDEgMzk2UTQxIDQxMyA0OCA0MThUNzUgNDIxTDI0OCA0MTJMMjM4IDYxN1EyMzYgNjM3IDI0MSA2NDRUMjY0IDY1MlEyODEgNjUyIDI4NiA2NDVUMjkwIDYxN0wyODAgNDEyTDQ1MiA0MjFRNDcyIDQyMyA0NzkgNDE4VDQ4NyAzOTZRNDg3IDM4MCA0ODAgMzc1VDQ1MiAzNzJMMjc4IDM4MFEyODMgMzY0IDI4NiAzNDhUMjkwIDMxNkwyODggMTM4TDQ1MiAxNDZRNDcyIDE0OCA0NzkgMTQzVDQ4NyAxMjJRNDg3IDEwNiA0ODAgMTAxVDQ1MiA5OEwyODggMTA2TDI4NiAtMTMxUTI4NiAtMTQyIDI4MiAtMTQ5VDI2NiAtMTU2SDI2MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjI7IiBnbHlwaC1uYW1lPSJidWxsZXQiIGhvcml6LWFkdi14PSIzMzAiIGQ9Ik0xNjUgMTYwUTEyOCAxNjAgMTAzIDE4NVQ3OCAyNDhRNzggMjg1IDEwMyAzMTBUMTY1IDMzNlEyMDIgMzM2IDIyNyAzMTFUMjUyIDI0OFEyNTIgMjExIDIyNyAxODZUMTY1IDE2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjY7IiBnbHlwaC1uYW1lPSJlbGxpcHNpcyIgaG9yaXotYWR2LXg9IjYwNCIgZD0iTTQ4OSAtNVE0NTUgLTUgNDU1IDMwVjM3UTQ1NSA3MiA0ODkgNzJINDk3UTUzMiA3MiA1MzIgMzdWMzBRNTMyIC01IDQ5NyAtNUg0ODlaTTI5OCAtNVEyNjQgLTUgMjY0IDMwVjM3UTI2NCA3MiAyOTggNzJIMzA1UTM0MCA3MiAzNDAgMzdWMzBRMzQwIC01IDMwNSAtNUgyOThaTTEwNyAtNVE3MiAtNSA3MiAzMFYzN1E3MiA3MiAxMDcgNzJIMTE0UTE0OSA3MiAxNDkgMzdWMzBRMTQ5IC01IDExNCAtNUgxMDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDMwOyIgZ2x5cGgtbmFtZT0icGVydGhvdXNhbmQiIGhvcml6LWFkdi14PSIxMDcxIiBkPSJNMjAwIDM1OFExNjkgMzU4IDE0MyAzNjlUOTggNDAwVDY3IDQ0NlQ1NiA1MDNWNTEwUTU2IDU0MCA2NyA1NjZUOTcgNjEzVDE0MyA2NDRUMjAwIDY1NlEyMzEgNjU2IDI1NyA2NDVUMzAyIDYxNFQzMzIgNTY4VDM0MyA1MTJWNTA0UTM0MyA0NzQgMzMyIDQ0OFQzMDIgNDAxVDI1NiAzNzBUMjAwIDM1OFpNMTE4IC02UTExNyAtNyAxMTMgLTZUMTA1IC0zVDk4IDRUOTQgMTVROTQgMjYgOTggMzRUMTE2IDU2TDYxNyA2NTdRNjE4IDY1OCA2MjIgNjU3VDYzMCA2NTRUNjM3IDY0OFQ2NDEgNjM2UTY0MSA2MjEgNjE4IDU5NUwxMTggLTZaTTg3NCAtNVE4NDQgLTUgODE4IDZUNzcyIDM3VDc0MiA4M1Q3MzEgMTQwVjE0N1E3MzEgMTc3IDc0MiAyMDNUNzcyIDI1MFQ4MTggMjgxVDg3NSAyOTNROTA1IDI5MyA5MzEgMjgyVDk3NyAyNTFUMTAwNyAyMDVUMTAxOCAxNDlWMTQxUTEwMTggMTExIDEwMDcgODVUOTc3IDM4VDkzMSA3VDg3NCAtNVpNNTM4IC01UTUwOCAtNSA0ODIgNlQ0MzYgMzdUNDA2IDgzVDM5NSAxNDBWMTQ3UTM5NSAxNzcgNDA2IDIwM1Q0MzYgMjUwVDQ4MiAyODFUNTM5IDI5M1E1NjkgMjkzIDU5NSAyODJUNjQxIDI1MVQ2NzEgMjA1VDY4MiAxNDlWMTQxUTY4MiAxMTEgNjcxIDg1VDY0MSAzOFQ1OTUgN1Q1MzggLTVaTTIwMCAzOTdRMjQ0IDM5NyAyNzIgNDI3VDMwMCA1MDJWNTEyUTMwMCA1MzQgMjkzIDU1M1QyNzIgNTg3VDI0MCA2MTBUMTk5IDYxOFExNTYgNjE4IDEyOCA1ODhUMTAwIDUxMlY1MDJRMTAwIDQ1NyAxMjggNDI3VDIwMCAzOTdaTTg3NSAzNFE5MTkgMzQgOTQ2IDY0VDk3NCAxMzlWMTQ5UTk3NCAxOTQgOTQ2IDIyNFQ4NzQgMjU1UTgzMCAyNTUgODAzIDIyNVQ3NzUgMTQ5VjEzOVE3NzUgOTQgODAzIDY0VDg3NSAzNFpNNTM5IDM0UTU4MyAzNCA2MTAgNjRUNjM4IDEzOVYxNDlRNjM4IDE5NCA2MTAgMjI0VDUzOCAyNTVRNDk0IDI1NSA0NjcgMjI1VDQzOSAxNDlWMTM5UTQzOSA5NCA0NjcgNjRUNTM5IDM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzOTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbGxlZnQiIGhvcml6LWFkdi14PSIzMzIiIGQ9Ik0yNDggODNRMjM0IDgzIDIxMSA5OVQxNDggMTQ5UTEwNiAxODUgODMgMjExVDU5IDI0MlE1OSAyNDYgODIgMjcxVDE0NyAzMzNRMTg2IDM2OCAyMTAgMzg0VDI0OCA0MDFRMjU2IDQwMSAyNjEgMzk2VDI2NyAzODNRMjY3IDM3MiAyNDcgMzUzVDE4MCAyOThMMTA0IDI0MVExMjQgMjI3IDE0MyAyMTRUMTgyIDE4M1EyMjcgMTQ4IDI0NyAxMzBUMjY3IDEwMFEyNjcgOTMgMjYyIDg4VDI0OCA4M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwM0E7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xyaWdodCIgaG9yaXotYWR2LXg9IjMzMiIgZD0iTTg0IDgzUTc2IDgzIDcxIDg4VDY2IDEwMVE2NiAxMTIgODYgMTMxVDE1MiAxODZMMjI4IDI0M1EyMDggMjU3IDE4OSAyNzBUMTUwIDMwMFExMDUgMzM1IDg2IDM1NFQ2NiAzODRRNjYgMzkxIDcxIDM5NlQ4NCA0MDFROTggNDAxIDEyMSAzODVUMTg0IDMzNVEyMjYgMjk4IDI0OSAyNzNUMjczIDI0MlEyNzMgMjM3IDI1MCAyMTJUMTg1IDE1MFExNDYgMTE2IDEyMiAxMDBUODQgODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgZ2x5cGgtbmFtZT0idW5pMjA0NCIgaG9yaXotYWR2LXg9IjY0OSIgZD0iTTYwIC03UTU4IC05IDQ4IC00VDM3IDEzUTM3IDI0IDQxIDMyVDU5IDU1TDU4OSA2NTlRNTkwIDY2MCA1OTQgNjU5VDYwMiA2NTZUNjA5IDY1MFQ2MTMgNjM4UTYxMyA2MjEgNTkwIDU5N0w2MCAtN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwQUM7IiBnbHlwaC1uYW1lPSJFdXJvIiBob3Jpei1hZHYteD0iNjU1IiBkPSJNNDAyIC0xMFEyOTkgLTEwIDIzNSA1MlQxNTMgMjI2SDc1UTYxIDIyNiA1NiAyMzBUNTEgMjQ1VjI0OVE1MSAyNTkgNTYgMjYzVDc1IDI2OEgxNDhRMTQ3IDI3NiAxNDcgMjg0VDE0NyAzMDJWMzQ3UTE0NyAzNTYgMTQ3IDM2NVQxNDggMzg0SDc1UTYxIDM4NCA1NiAzODhUNTEgNDAzVjQwN1E1MSA0MTcgNTYgNDIyVDc1IDQyN0gxNTRRMTYzIDQ4MCAxODQgNTIyVDIzNiA1OTVUMzA5IDY0MVQzOTggNjU3UTQ1NyA2NTcgNDk3IDYzOVQ1NjEgNTk2UTU3OCA1NzggNTg2IDU2MVQ1OTUgNTMwUTU5NSA1MjIgNTkxIDUxN1Q1ODEgNTA4VDU3MSA1MDNUNTY1IDUwM1E1NTYgNTI1IDU0MiA1NDVUNTA3IDU4MVQ0NTkgNjA2VDM5NSA2MTVRMzIwIDYxNSAyNzAgNTY1VDIwMiA0MjdINDMzUTQ1NiA0MjcgNDU2IDQwN1Y0MDNRNDU2IDM4NCA0MzMgMzg0SDE5NlExOTUgMzc1IDE5NSAzNjZUMTk1IDM0N1YzMDBRMTk1IDI5MiAxOTUgMjg0VDE5NiAyNjhINDMzUTQ1NiAyNjggNDU2IDI0OVYyNDVRNDU2IDIyNiA0MzMgMjI2SDIwMlEyMTkgMTM4IDI3MCA4NlQ0MDAgMzNRNDM2IDMzIDQ2NCA0MlQ1MTIgNjhUNTQ3IDEwNVQ1NzAgMTUxUTU3MSAxNTIgNTc1IDE1MVQ1ODUgMTQ3VDU5NSAxMzhUNjAwIDEyM1E2MDAgMTA5IDU5MSA5MFQ1NjMgNTNRNTM3IDI3IDQ5NyA5VDQwMiAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTEzOyIgZ2x5cGgtbmFtZT0iYWZpaTYxMjg5IiBob3Jpei1hZHYteD0iNDM0IiBkPSJNMTk5IDM0MVEyMjggMzY1IDI1MSAzOTVUMjkxIDQ1NlQzMTcgNTEzVDMyNiA1NThRMzI2IDU4NCAzMTUgNTg0UTMwOCA1ODQgMzAwIDU3M1EyOTEgNTYxIDI3OCA1MzlUMjUwIDQ4NlQyMjIgNDE5VDE5OSAzNDFaTTQ0IDEzOFEzMCAxNTEgMTkgMTcyVDcgMjI4UTI1IDIzNyAzMyAyNDBUNDkgMjQ2TDU5IDI1MVE2MyAzMjEgODEgMzgzVDEyNiA0OTdUMTgzIDU4OFQyNDUgNjUyUTI4NSA2ODMgMzI3IDY4M1EzNjcgNjgzIDM5NSA2NTJUNDIzIDU1OFE0MjMgNTA5IDQwMiA0NjNUMzQ5IDM3NVQyNzYgMjk0VDE5NiAyMjNRMTk2IDIxOCAxOTYgMjE0VDE5NSAyMDRRMTk1IDE1OCAyMDcgMTMzVDIzNyAxMDdRMjU0IDEwNyAyNzMgMTMzVDMxMCAyMTdRMzIyIDIyMCAzMzYgMjIwUTM1NSAyMjAgMzczIDIxM1Q0MDQgMTg2UTM5NyAxNDkgMzgyIDExNFQzNDUgNTJUMjkzIDlUMjI4IC04UTIwNiAtOCAxODIgMVQxMzUgMzBUOTQgNzhUNjYgMTQ2TDQ0IDEzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMjI7IiBnbHlwaC1uYW1lPSJ0cmFkZW1hcmsiIGhvcml6LWFkdi14PSI2ODMiIGQ9Ik0zNTUgMzQyUTMzOSAzNDIgMzM5IDM2MVY2MjhRMzM5IDY1MCAzNTkgNjUwSDM3N1EzODcgNjUwIDM5MSA2NDZUNDAwIDYzM0w0ODAgNDY1TDU1OSA2MzNRNTY0IDY0MyA1NjggNjQ2VDU4MiA2NTBINTk5UTYxOSA2NTAgNjE5IDYyOFYzNjFRNjE5IDM0MiA2MDIgMzQySDU5N1E1ODEgMzQyIDU4MSAzNjFWNTk3TDUwMSA0MjVRNDk5IDQyMCA0OTYgNDE3VDQ3OSA0MTRRNDY2IDQxNCA0NjMgNDE3VDQ1OCA0MjVMMzc3IDU5NlYzNjFRMzc3IDM0MiAzNjIgMzQySDM1NVpNMTU3IDM0MlExNDAgMzQyIDE0MCAzNjFWNjEySDUwUTMyIDYxMiAzMiA2MjhWNjMxUTMyIDY0OCA1MCA2NDhIMjcwUTI4OCA2NDggMjg4IDYzMVY2MjhRMjg4IDYxMiAyNzAgNjEySDE4MFYzNjFRMTgwIDM0MiAxNjIgMzQySDE1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMjY7IiBnbHlwaC1uYW1lPSJ1bmkyMTI2IiBob3Jpei1hZHYteD0iNzYwIiBkPSJNMzgwIDYwMlEzMTggNjAyIDI3MiA1ODVUMTk2IDUzN1QxNTAgNDY3VDEzNSAzODBRMTM1IDMzNSAxNDkgMjk0VDE4OCAyMTZUMjQ5IDE0OFQzMjUgOTNWMEg1MVY5M0gxODhRMTE0IDE1MyA3MiAyMjVUMzAgMzgwUTMwIDQ0NiA1NCA1MDRUMTI0IDYwNVQyMzUgNjc0VDM4MCA3MDBRNDYwIDcwMCA1MjUgNjc1VDYzNSA2MDZUNzA1IDUwNFQ3MzAgMzgwUTczMCAyOTcgNjg4IDIyNVQ1NzIgOTNINzA5VjBINDM1VjkzUTQ3NiAxMTcgNTExIDE0OFQ1NzEgMjE1VDYxMSAyOTNUNjI1IDM4MFE2MjUgNDI2IDYxMCA0NjZUNTY1IDUzN1Q0ODggNTg0VDM4MCA2MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTJFOyIgZ2x5cGgtbmFtZT0iZXN0aW1hdGVkIiBob3Jpei1hZHYteD0iODMwIiBkPSJNNDE1IDY3MVE0OTIgNjcxIDU2MCA2NDVUNjgxIDU3M1Q3NjMgNDYzVDc5MyAzMjRIMTg1UTE3NSAzMjQgMTc1IDMxM1YxMTZRMjIzIDY1IDI4NiAzOFQ0MTUgMTBRNDkwIDEwIDU1NSA0M1Q2NjcgMTMxSDcyNFE2NjcgNjIgNTg1IDI2VDQxNSAtMTFRMzQwIC0xMSAyNzIgMTRUMTUxIDg0VDY3IDE5MVQzNiAzMzBRMzYgNDAzIDY2IDQ2NVQxNDcgNTc0VDI2OCA2NDVUNDE1IDY3MVpNNDE1IDY1MFEzNDUgNjUwIDI4MiA2MjJUMTc1IDU0M1YzNThRMTc1IDM0NyAxODUgMzQ3SDY0NlE2NTUgMzQ3IDY1NSAzNThWNTQyUTYxMCA1OTQgNTQ2IDYyMlQ0MTUgNjUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIwMjsiIGdseXBoLW5hbWU9InBhcnRpYWxkaWZmIiBob3Jpei1hZHYteD0iNTM4IiBkPSJNMzAzIDQ4MVEzMzUgNDgxIDM2MSA0NzFUNDA0IDQ0NVY0NjRRNDA0IDQ5OSAzOTkgNTI4VDM4MSA1NzhUMzQzIDYxMFQyODIgNjIyUTI0NyA2MjIgMjA4IDYxMkwxODkgNjc5UTI3MSA3MTAgMzMyIDcxMFE0MjEgNzEwIDQ2NCA2NDlUNTA4IDQ3NVE1MDggMzcwIDQ4MSAyODNUNDA5IDEzM1QzMTEgMzVUMjAxIDBRMTY1IDAgMTM0IDEwVDgwIDQ0VDQzIDEwMlQzMCAxODdRMzAgMjU2IDU1IDMxMFQxMjAgNDAzVDIwOCA0NjFUMzAzIDQ4MVpNMjA1IDEwNVEyMjkgMTA1IDI1NiAxMjFUMzEwIDE2N1QzNTkgMjQzVDM5MyAzNDlRMzgyIDM2MSAzNjAgMzczVDMwOSAzODZRMjc1IDM4NiAyNDQgMzcxVDE4OCAzMzFUMTQ5IDI3MFQxMzQgMTk0UTEzNCAxNTcgMTUwIDEzMVQyMDUgMTA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIwNjsiIGdseXBoLW5hbWU9InVuaTIyMDYiIGhvcml6LWFkdi14PSI2NDkiIGQ9Ik0yOTMgNzAwSDM5Nkw2MzMgMEgzMEwyOTMgNzAwWk0xNDAgNzNINDY1TDMxMCA1MjhMMTQwIDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIwRjsiIGdseXBoLW5hbWU9InByb2R1Y3QiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik00ODQgMFY2MDdIMTUwVjBINTBWNzAwSDU4NFYwSDQ4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTE7IiBnbHlwaC1uYW1lPSJzdW1tYXRpb24iIGhvcml6LWFkdi14PSI0NzUiIGQ9Ik0xMTAgODBINDM3VjBIMjVWOTZMMjA5IDMyNUwyNSA1NTRWNjUwSDQzN1Y1NzBIMTE1TDI4OCAzNTNWMzAwTDExMCA4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTI7IiBnbHlwaC1uYW1lPSJtaW51cyIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTEyOCAyNDRRMTA1IDI0NCAxMDUgMjYzVjI2OVExMDUgMjg4IDEyOCAyODhINTAxUTUxNSAyODggNTE5IDI4M1Q1MjQgMjY5VjI2M1E1MjQgMjU0IDUyMCAyNDlUNTAxIDI0NEgxMjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE1OyIgZ2x5cGgtbmFtZT0iZnJhY3Rpb24iIGhvcml6LWFkdi14PSI2NDkiIGQ9Ik02MCAtN1E1OCAtOSA0OCAtNFQzNyAxM1EzNyAyNCA0MSAzMlQ1OSA1NUw1ODkgNjU5UTU5MCA2NjAgNTk0IDY1OVQ2MDIgNjU2VDYwOSA2NTBUNjEzIDYzOFE2MTMgNjIxIDU5MCA1OTdMNjAgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE5OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjM2IiBkPSJNMTE0IDIxMFE4MCAyMTAgODAgMjQ0VjI1MlE4MCAyODcgMTE0IDI4N0gxMjFRMTU2IDI4NyAxNTYgMjUyVjI0NFExNTYgMjEwIDEyMSAyMTBIMTE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxQTsiIGdseXBoLW5hbWU9InJhZGljYWwiIGhvcml6LWFkdi14PSI2NDkiIGQ9Ik0yNTYgNTAxTDM2OSAxNzFMNTY2IDcwMEg2NDlMMzg2IDBIMjgzTDEzNiA0MzNIMzBWNTAxSDI1NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMUU7IiBnbHlwaC1uYW1lPSJpbmZpbml0eSIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTcwMyAyNzFRNzAzIDIzMSA2OTAgMjAzVDY1NCAxNTZUNjA0IDEyOVQ1NDcgMTIwUTUxOCAxMjAgNDkzIDEyOFQ0NDcgMTUwVDQwNSAxODFUMzY2IDIxN1EzNDcgMTk5IDMyOCAxODJUMjg3IDE1MVQyNDAgMTI5VDE4NiAxMjBRMTU3IDEyMCAxMjkgMTI5VDc5IDE1NlQ0NCAyMDNUMzAgMjcxUTMwIDMxMCA0MyAzMzhUNzkgMzg1VDEyOSA0MTNUMTg2IDQyMlEyMTUgNDIyIDI0MCA0MTRUMjg2IDM5MlQzMjcgMzYxVDM2NiAzMjVRMzg1IDM0MyA0MDUgMzYwVDQ0NiAzOTFUNDkzIDQxM1Q1NDcgNDIyUTU3NiA0MjIgNjA0IDQxNFQ2NTQgMzg3VDY4OSAzNDBUNzAzIDI3MVpNMTg3IDIyMlEyMjMgMjIyIDI1MiAyMzVUMzA4IDI3MVEyODIgMjkyIDI1MyAzMDZUMTg3IDMyMFExNjcgMzIwIDE0OSAzMDlUMTMwIDI3MVExMzAgMjQ0IDE0OCAyMzNUMTg3IDIyMlpNNTQ2IDMyMFE1MTAgMzIwIDQ4MSAzMDZUNDI1IDI3MVE0NTEgMjQ5IDQ4MCAyMzZUNTQ2IDIyMlE1NjYgMjIyIDU4NCAyMzNUNjAzIDI3MVE2MDMgMjk4IDU4NSAzMDlUNTQ2IDMyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMkI7IiBnbHlwaC1uYW1lPSJpbnRlZ3JhbCciIGhvcml6LWFkdi14PSIzOTYiIGQ9Ik0xNjQgNTk2UTE3MiA2NTQgMjAxIDY4NVEyMjggNzE0IDI3MSA3MjNUMzc1IDcyNFY2NDhRMzE0IDY1MyAyODggNjQwVDI1NSA1ODRMMTY4IC0zMlExNTkgLTk1IDEyOCAtMTI2UTEwNSAtMTQ5IDcwIC0xNTVULTE1IC0xNTVWLTgxUTIyIC04NCA0NSAtNzVUNzQgLTI1TDE2NCA1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjQ4OyIgZ2x5cGgtbmFtZT0iYXBwcm94ZXF1YWwiIGhvcml6LWFkdi14PSI1MjkiIGQ9Ik0zMjUgMTIxUTMwMCAxMjEgMjgyIDEzM1QyNDggMTYyUTIzMyAxNzcgMjIzIDE4NFQyMDIgMTkxUTE4NyAxOTEgMTgwIDE4MFQxNjggMTQ5UTE2NSAxMzggMTYxIDEzM1QxNDcgMTI3UTEzOCAxMjcgMTI5IDEzM1ExMzIgMTc4IDE1MCAyMDVUMjAzIDIzMlEyMjkgMjMyIDI0NyAyMjBUMjgwIDE5MVEyOTUgMTc1IDMwNSAxNjhUMzI3IDE2MVEzNDEgMTYxIDM0OCAxNzJUMzYxIDIwM1EzNjQgMjE0IDM2OCAyMjBUMzgyIDIyNlEzOTIgMjI2IDM5OSAyMTlRMzk3IDE3NCAzNzkgMTQ4VDMyNSAxMjFaTTMyNSAyNjdRMzAwIDI2NyAyODIgMjc5VDI0OCAzMDhRMjMzIDMyMyAyMjMgMzMwVDIwMiAzMzdRMTg3IDMzNyAxODAgMzI2VDE2OCAyOTVRMTY1IDI4NCAxNjEgMjc5VDE0NyAyNzNRMTM4IDI3MyAxMjkgMjc5UTEzMiAzMjQgMTUwIDM1MVQyMDMgMzc4UTIyOSAzNzggMjQ3IDM2NlQyODAgMzM3UTI5NSAzMjEgMzA1IDMxNFQzMjcgMzA3UTM0MSAzMDcgMzQ4IDMxOFQzNjEgMzQ5UTM2NCAzNjAgMzY4IDM2NlQzODIgMzcyUTM5MiAzNzIgMzk5IDM2NVEzOTcgMzIwIDM3OSAyOTRUMzI1IDI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjA7IiBnbHlwaC1uYW1lPSJub3RlcXVhbCIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTEzMiAzNDlRMTE4IDM0OSAxMTQgMzU0VDEwOSAzNjlWMzc0UTEwOSAzODQgMTEzIDM4OVQxMzIgMzk0SDM1NUw0MTkgNTI0UTQzMCA1NDQgNDQ3IDUzNkw0NTIgNTM0UTQ2MCA1MjkgNDYzIDUyM1Q0NjAgNTA0TDQwNSAzOTRINDk4UTUyMSAzOTQgNTIxIDM3NFYzNjlRNTIxIDM0OSA0OTggMzQ5SDM4MEwyOTMgMTczSDQ5OFE1MjEgMTczIDUyMSAxNTNWMTQ4UTUyMSAxMjggNDk4IDEyOEgyNzRMMjA3IC0xMVEyMDAgLTI0IDE5NCAtMjZUMTc5IC0yNEwxNzQgLTIxUTE1NSAtMTMgMTY2IDlMMjI0IDEyOEgxMzJRMTE4IDEyOCAxMTQgMTMzVDEwOSAxNDhWMTUzUTEwOSAxNjMgMTEzIDE2OFQxMzIgMTczSDI1MEwzMzYgMzQ5SDEzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjQ7IiBnbHlwaC1uYW1lPSJsZXNzZXF1YWwiIGhvcml6LWFkdi14PSI2MzAiIGQ9Ik00ODQgMjg2UTQ5OSAyNzkgNTA3IDI2OVQ1MTQgMjQ5UTUxMyAyMzggNTA3IDIzMlQ0OTggMjI2TDEzMiAzODRRMTI0IDM4OSAxMjEgMzk0VDExNyA0MTdRMTE3IDQzMyAxMjAgNDM4VDEzMiA0NDlMNDk4IDYwN1E1MDAgNjA4IDUwNiA2MDJUNTE0IDU4NVE1MTcgNTc3IDUwOCA1NjZUNDg0IDU0OEwxNjMgNDE3TDQ4NCAyODZaTTEzMiAxMjdRMTE4IDEyNyAxMTQgMTMyVDEwOSAxNDZWMTUyUTEwOSAxNjEgMTEzIDE2NlQxMzIgMTcxSDQ5OFE1MjEgMTcxIDUyMSAxNTJWMTQ2UTUyMSAxMjcgNDk4IDEyN0gxMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjY1OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlcmVxdWFsIiBob3Jpei1hZHYteD0iNjMwIiBkPSJNMTE1IDI1MVExMTQgMjYxIDEyMyAyNzJUMTQ1IDI4OEw0NjYgNDE5TDE0NSA1NTFRMTMwIDU1OCAxMjEgNTY4VDExNSA1ODdRMTE2IDU5OCAxMjMgNjA0VDEzMiA2MTBMNDk3IDQ1MVE1MDUgNDQ2IDUwOSA0NDFUNTEzIDQxOVE1MTMgNDAyIDUwOSAzOTdUNDk3IDM4NkwxMzIgMjI4UTEyOSAyMjcgMTIzIDIzM1QxMTUgMjUxWk0xMzIgMTI5UTExOCAxMjkgMTE0IDEzNFQxMDkgMTQ5VjE1NFExMDkgMTYzIDExMyAxNjhUMTMyIDE3NEg0OThRNTIxIDE3NCA1MjEgMTU0VjE0OVE1MjEgMTI5IDQ5OCAxMjlIMTMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjVDQTsiIGdseXBoLW5hbWU9ImxvemVuZ2UiIGhvcml6LWFkdi14PSI1MjAiIGQ9Ik0zMCAzODhMMjI2IDc3NkgyOTRMNDkwIDM4OEwyOTQgMEgyMjZMMzAgMzg4Wk0zNzAgMzg4TDI2MCA2MTZMMTUwIDM4OEwyNjAgMTU5TDM3MCAzODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjAxOyIgZ2x5cGgtbmFtZT0iZmkiIGhvcml6LWFkdi14PSI1MzciIGQ9Ik0xMjcgNDMwSDI2VjQ3M0gxMjdWNTI0UTEyNyA2MDUgMTYxIDY0NlQyNTkgNjg4UTI4OCA2ODggMzA3IDY4MVQzMzggNjYyUTM0OSA2NTEgMzQ5IDYzN1EzNDkgNjI1IDM0MyA2MTlUMzM1IDYxNFEzMjQgNjI4IDMwMyA2MzdUMjU5IDY0NlEyMTYgNjQ2IDE5NSA2MTdUMTczIDUyMVY0NzNIMzAxVjQzMEgxNzRWMEgxMjdWNDMwWk00MDAgNDUzUTQwMCA0NjcgNDA2IDQ3MVQ0MjEgNDc2SDQyN1E0MzYgNDc2IDQ0MiA0NzJUNDQ4IDQ1M1YwSDQwMFY0NTNaTTQyNCA2MDFRMzkxIDYwMSAzOTEgNjM0UTM5MSA2NjggNDI2IDY2OFE0NTggNjY4IDQ1OCA2MzRRNDU4IDYwMSA0MjQgNjAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkIwMjsiIGdseXBoLW5hbWU9ImZsIiBob3Jpei1hZHYteD0iNTM3IiBkPSJNMTI3IDQzMEgyNlY0NzNIMTI3VjUyNFExMjcgNjA1IDE2MSA2NDZUMjU5IDY4OFEyODggNjg4IDMwNyA2ODFUMzM4IDY2MlEzNDkgNjUxIDM0OSA2MzdRMzQ5IDYyNSAzNDMgNjE5VDMzNSA2MTRRMzI0IDYyOCAzMDMgNjM3VDI1OSA2NDZRMjE2IDY0NiAxOTUgNjE3VDE3MyA1MjFWNDczSDMwMVY0MzBIMTc0VjBIMTI3VjQzMFpNNDAwIDY3M1E0MDAgNjc1IDQwNSA2NzZUNDE3IDY3OFE0MjkgNjc4IDQzOCA2NjlUNDQ4IDYzMVYwSDQwMFY2NzNaIiAgLz4KKworPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGQ7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkAiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJHIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9Ik8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iUSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJUIiBrPSIxMDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJVIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlYiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iVyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJZIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlwiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0idiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGFlOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hhOTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4M2MwOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzA7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMzsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ1OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gxNTI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxYzsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMWQ7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMTg7IiBrPSIxMDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDE5OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gxNzg7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMyOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzE7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQyOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkYTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hkZDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IkEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iViIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iWCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJZIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0ieSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGM0OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjNTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzY7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMzsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4MTc4OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzI7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE2MDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTYxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiZhbXA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iKSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iLiIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IjoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iQCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkEiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJDIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iRyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkoiIGs9IjczIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJPIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iUSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iVCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJhIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iYyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImQiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJlIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Im8iIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0icSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJzIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzQ7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzU7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZTc7IiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzY7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGU2OyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGFiOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzA7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzM7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDU7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTUyOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE1MzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDEzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDNhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMjsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkNDsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTdkOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IkEiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJKIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iVCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlYiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJXIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlkiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJaIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImMiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ4IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ5IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGM0OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGM1OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4YzY7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGMwOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGMzOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxNzg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDFlOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGMyOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGMxOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hmMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iLSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJBIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iQyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJHIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IkoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iTyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJRIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IlQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iYSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJlIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Im8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJxIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNDsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkNjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZTc7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM2OyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hlNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzA7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzM7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDU7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDE1MjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MTUzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDEzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDE0OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMjsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkMzsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDQ7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQyOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IkEiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJKIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iVCIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGM0OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGM1OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGM2OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMwOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMzOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMyOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGMxOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4ZGQ7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJXIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJYIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJZIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJnIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJqIiBrPSItMTUwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4MTc4OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iQSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzU7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM2OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMyOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iTyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJUIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxN2Q7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IjEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJBIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJYIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iWiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI0IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVCIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InIiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGM0OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMxOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSIxIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSI0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkciIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9Ik8iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IlEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSI0IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iNyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3hiMDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjEyMjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iJiN4MmM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9Ii4iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iNyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSI3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDJjOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSItIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Ii4iIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iMCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIxIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIzIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI0IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjUiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjkiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3hhMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAyNjsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxYTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxZTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MmM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iNyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDI2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDFhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDFlOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSImI3gyYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iLiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSI3IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMjY7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMWE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSIxIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IjciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iMSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSI3IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImZ3Q7IiB1Mj0iNyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iQSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGRkOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxN2Q7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IioiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MmM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSItIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSIuIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJAIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkEiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkMiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iRyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJKIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJPIiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlEiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iUyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJUIiBrPSIxMTQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJWIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlciIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iWCIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iWSIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJaIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ6IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNDsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGM1OyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDY7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjEyMjsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzY7IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkODsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4M2MwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzA7IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMzsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ1OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNTI7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjAxNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE3ODsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjAxYTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMjsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGMxOyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDM7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ0OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkMjsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGRkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iWSIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iYSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJjIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImQiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iZSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJvIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZTc7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGU2OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxNTM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeDE3ODsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGRkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJBIiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IkoiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iVCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJWIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJZIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IloiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjNDsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4YzU7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGM2OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjMDsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4YzM7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxNzg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGMyOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjMTsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IkAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iQyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IkciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJPIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iUSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IlQiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iYyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJkIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImUiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJnIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ibyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJxIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkODsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGU2OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkNTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3gxNTI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MTUzOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkMzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkNDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkMjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNjE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGRkOyIgaz0iLTI1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJmFtcDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MmM7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iLiIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSIvIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IjoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iSiIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJUIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJXIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlkiIGs9Ii0yNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImEiIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJjIiBrPSI1MyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImQiIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZSIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJmIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJpIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJvIiBrPSI1MyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0icSIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJyIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ1IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ4IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ieiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGU3OyIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGU2OyIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDI2OyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDE1MzsiIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTc4OyIgaz0iLTI1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxYTsiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxZTsiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGRkOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gxN2Q7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDJjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iLiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iVCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJWIiBrPSI3IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iVyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJZIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IloiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAyNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDE3ODsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAxYTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIwMWU7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSCIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSIvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSSIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJJIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGYwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNjA7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGQ7IiBrPSItMTQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxN2Q7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJmFtcDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iLSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJAIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkMiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iRyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJPIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlEiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iUyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlQiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJWIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJXIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlgiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWSIgaz0iLTE0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iYyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJkIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImUiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0ibyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJxIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0idSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGU3OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gzYzA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGU2OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTUyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNTM7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDIwMTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDIwMTQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE3ODsiIGs9Ii0xNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRkOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJAIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkEiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkMiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iRyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJPIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVCIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJWIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlciIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iWSIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJcIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJ2IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0ieSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGE5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gzYzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE1MjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMDFjOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxZDsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxODsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMTk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE3ODsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzI7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTSIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik0iIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTiIgdTI9Ii8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik4iIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGRkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJBIiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IkoiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iVCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJWIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iWCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJZIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IloiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImQiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ieCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjNDsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzU7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGU3OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGM2OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjMDsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzM7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxNzg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGMyOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjMTsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGRkOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MTdkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImYW1wOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iLiIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJBIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkoiIGs9Ijg1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iViIgaz0iLTI1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iVyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJYIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IloiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJmIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idiIgaz0iLTE4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ4IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InkiIGs9Ii0xOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM0OyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNTsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM2OyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MjAyNjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzA7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMzOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ODsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWE7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWU7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMyOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMTsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZGQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ii4iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iLyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IkEiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJUIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlYiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iVyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJYIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlkiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ4IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGM0OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hjNTsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzY7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMwOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hjMzsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzI7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMxOyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZGQ7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImYW1wOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJUIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeDE3ODsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGRkOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iQSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJWIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJYIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlkiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3gxNzg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE2MTsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGRkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTdkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImYW1wOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iLSIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSIuIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IjoiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJAIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkEiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iQyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJHIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkoiIGs9Ijg4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iTyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlQiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlkiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IloiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iXCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iYSIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJjIiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImQiIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZSIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImciIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibSIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJuIiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im8iIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icCIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJxIiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InIiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ1IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InYiIGs9IjczIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idyIgaz0iNjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ4IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InkiIGs9IjczIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ieiIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNDsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzU7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hlNzsiIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNjsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDNjMDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTY7IiBrPSI5NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGJmOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhYjsiIGs9IjExMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDI2OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMDsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzM7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxNTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE1MzsiIGs9Ijk1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxMzsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxNDsiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTc4OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAzOTsiIGs9IjExMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwM2E7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMWE7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMWU7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMyOyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMTsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkMjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTMxOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3gyYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iLiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSJKIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE2MDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE2MTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZGQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImYW1wOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSIpIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyYzsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iLSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSIuIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJBIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IkMiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iRyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJKIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iViIgdTI9Ik8iIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iUSIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJTIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJUIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJXIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iWSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iXSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iYSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJlIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJtIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im4iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJwIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iciIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJzIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ieCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9In0iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM0OyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjNTsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDY7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGU3OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjNjsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDg7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGU2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hhYjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YmI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMjY7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMwOyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMzsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDU7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE1MjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTUzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDEzOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDE0OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDM5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDNhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDFhOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDFlOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMjsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzE7IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQzOyIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkNDsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDI7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDEzMTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTYxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImYW1wOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIpIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iLSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkEiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJHIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkoiIGs9IjQ2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iTyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJRIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJYIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Il0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImEiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJjIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImQiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJmIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJpIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im0iIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibiIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJvIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InAiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icSIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJyIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InMiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ1IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ9IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNDsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzU7IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hlNzsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNjsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDg7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZTY7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGFiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hiYjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzA7IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMzOyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkNTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTUyOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNTM7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMTQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMzk7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwM2E7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMyOyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMTsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDM7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ0OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkMjsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTMxOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNjA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGRkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJmFtcDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iKSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJBIiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJDIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IkciIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iTyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJRIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlMiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iViIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJZIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJdIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ1IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9In0iIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM0OyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzU7IiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM2OyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDg7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjMDsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMzOyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDU7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE1MjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gyMDEzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gyMDE0OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNzg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjMjsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMxOyIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDM7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ0OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNjA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNjE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiZhbXA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IikiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ii4iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iOiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iQSIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJDIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkciIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iSiIgaz0iNzMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJPIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iUyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iVCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iViIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iYSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJjIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImQiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im8iIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0icCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJxIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0icyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM0OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjNTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGU3OyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM2OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hlNjsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YWI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzM7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ1OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNTI7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE1MzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzI7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMxOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQyOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGYwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkEiIGs9IjciIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJDIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkciIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJPIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IlEiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iVCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJhIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iYyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJkIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJnIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iaSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJqIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGM0OyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGM1OyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ2OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hlNzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzY7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDg7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGU2OyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMDsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMzsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNTsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTUyOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxNTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMyOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMxOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQzOyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDI7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iJiN4ZGQ7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJWIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJXIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJYIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJZIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJnIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJqIiBrPSItMTUwIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iJiN4MTc4OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZGQ7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlQiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iViIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJXIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlkiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJqIiBrPSItMTMwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3gxNzg7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9Ij8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MTYxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDJjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iOiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJmIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iZyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJzIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZjA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiZhbXA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IikiIGs9Ii03MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IioiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDJjOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSItIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ii4iIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iPyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iXCIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iXSIgaz0iLTcwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJnIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InIiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9In0iIGs9Ii03MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMTIyOyIgaz0iLTQ2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hiYjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAyNjsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDEzOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDE0OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxZDsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDE5OyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAzOTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAzYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxYTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxZTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iaCIgdTI9Ij8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iXCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iYSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJjIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImQiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iZSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJnIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iayIgdTI9Im8iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0icSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iayIgdTI9InciIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3hlNzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iJiN4ZTY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeDE1MzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iPyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InkiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSI/IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ2IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0ieSIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDE2MTsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iZiIgaz0iMiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9ImciIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0icyIgaz0iMiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IngiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDE2MTsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSIvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iZiIgaz0iMiIgLz4KKzxoa2VybiB1MT0icCIgdTI9ImciIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0icyIgaz0iMiIgLz4KKzxoa2VybiB1MT0icCIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0icCIgdTI9IngiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMTg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSItIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ii4iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSI/IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJhIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iYyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iciIgdTI9ImQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJlIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZiIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iciIgdTI9InQiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeGU3OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDEzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFjOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZDsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTg7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE5OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJzIiB1Mj0iYSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InMiIHUyPSJjIiBrPSItMiIgLz4KKzxoa2VybiB1MT0icyIgdTI9ImQiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJzIiB1Mj0iZSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InMiIHUyPSJvIiBrPSItMiIgLz4KKzxoa2VybiB1MT0icyIgdTI9InEiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJzIiB1Mj0iJiN4ZTc7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0icyIgdTI9IiYjeGU2OyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InMiIHUyPSImI3gxNTM7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDJjOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iLiIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iYSIgaz0iOCIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImMiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJkIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iZSIgaz0iOCIgLz4KKzxoa2VybiB1MT0idCIgdTI9Im8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJxIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0ieiIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3hlNzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3hlNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDI2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMWM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDE4OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxYTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMWU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iZiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJnIiBrPSItMiIgLz4KKzxoa2VybiB1MT0idiIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ0IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAyNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDFjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxZDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDE5OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MmM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9Ii4iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iYSIgaz0iMyIgLz4KKzxoa2VybiB1MT0idyIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJkIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iZSIgaz0iMyIgLz4KKzxoa2VybiB1MT0idyIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJxIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0idCIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDI2OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxYzsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWQ7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDE4OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxOTsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9Ii0iIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iYSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJjIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iZSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJnIiBrPSItMyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9Im8iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0icSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3hlNzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gxNTM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDFkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxODsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTk7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDM5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyYzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iLSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iZiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJnIiBrPSItMiIgLz4KKzxoa2VybiB1MT0ieSIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJ0IiBrPSItMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAyNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDFjOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE5OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iLSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImciIGs9IjkiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0idCIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeGFiOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMzk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IiYjeGRkOyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iViIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iVyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iWCIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iWSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iZyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iaiIgaz0iLTE1MCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IiYjeDE3ODsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTYwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGRkOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IioiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyYzsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iLSIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ii4iIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iQCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iQSIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkMiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJHIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iSiIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ik8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJRIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iUyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlQiIGs9IjQ5IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJWIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iVyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlgiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJZIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0idCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InciIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IngiIGs9Ii0xNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9InoiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNDsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjNTsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGFlOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YTk7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMTIyOyIgaz0iNDkiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGM2OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ4OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDNjMDsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzA7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzM7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTUyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTM7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxNDsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFjOyIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWQ7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxODsiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDE5OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE3ODsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFhOyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDFlOyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMjsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMTsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkMzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNDsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkMjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNjA7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZGQ7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iKiIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDJjOyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSItIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iLiIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJAIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJBIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iQyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkciIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJKIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iTyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJTIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iVCIgaz0iNDkiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlYiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJXIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iWCIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlkiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ0IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ2IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0idyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieCIgaz0iLTE0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ5IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieiIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGM0OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGM1OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ2OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YWU7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hhOTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIxMjI7IiBrPSI0OSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzY7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDg7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4M2MwOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDI2OyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMDsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMzsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNTI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxMzsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDE0OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWM7IiBrPSI0MiIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxZDsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDE4OyIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMTk7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTc4OyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWE7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWU7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMyOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMxOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQzOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ0OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IkAiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJUIiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImEiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJjIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iZCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImUiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJmIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJnIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJvIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0icSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InYiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJ5IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZTc7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YWU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YTk7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4M2MwOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGU2OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeDE1MzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMTsiIHUyPSIvIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDE7IiB1Mj0idiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDE7IiB1Mj0ieSIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTdkOyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDJjOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9Ii4iIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSIvIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iPyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IkEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJKIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iVCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlYiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJXIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iWCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJaIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iaCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iayIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ieCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ieiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzQ7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMjY7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzA7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxYzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDE4OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFhOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMWU7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzE7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MmM7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSIuIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSJKIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDI2OyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MjAxYTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDIwMWU7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSI/IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJcIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ0IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ2IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSJ5IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSImI3gyMTIyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IiYjeDIwMWM7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iJiN4MjAxODsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSI/IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJcIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ0IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ2IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSJ5IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSImI3gyMTIyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IiYjeDIwMWM7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iJiN4MjAxODsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSI/IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJcIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ0IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ2IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSJ5IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSImI3gyMTIyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IiYjeDIwMWM7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iJiN4MjAxODsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSI/IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJcIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ0IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ2IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSJ5IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSImI3gyMTIyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IiYjeDIwMWM7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iJiN4MjAxODsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ2IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlOTsiIHUyPSJ4IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZTk7IiB1Mj0ieSIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZTg7IiB1Mj0idiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZTg7IiB1Mj0ieCIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9InkiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGVhOyIgdTI9InYiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGVhOyIgdTI9IngiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ5IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ2IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hlYjsiIHUyPSJ4IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZWI7IiB1Mj0ieSIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iPyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iXCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0idCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0idiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iJiN4MjEyMjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSImI3gyMDFjOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IiYjeDIwMTg7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MmM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iLiIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9Ii8iIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IjoiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IjsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9Ij8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJcIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ2IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ4IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieSIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIxMjI7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAyNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDFjOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMTg7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxYTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDFlOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDJjOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ii4iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSIvIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSI6IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSI7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSI/IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iXCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0idiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0ieCIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InkiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InoiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMTIyOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMjY7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDE4OyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWE7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyYzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSIuIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iLyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iOiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iPyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IlwiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InYiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IngiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ5IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ6IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjEyMjsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDI2OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMWM7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxODsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFhOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMWU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MmM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iLiIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9Ii8iIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IjoiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IjsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9Ij8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJcIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ2IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ4IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieSIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieiIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIxMjI7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAyNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDFjOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMTg7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxYTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDFlOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGIwOyIgdTI9IjQiIGs9IjY1IiAvPgorPGhrZXJuIHUxPSImI3hhMzsiIHUyPSIxIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGEzOyIgdTI9IjQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gxNjE7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSIuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iLyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IjoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IlwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJmIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJnIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0icyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hkZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJUIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IlkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iQCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IkMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IkciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9Ik8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IlEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IlQiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iYSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJkIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iZSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJnIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJvIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0icSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZDY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hlNzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkODsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hlNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkNTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkMzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGQ0OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZDI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hkZDsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxN2Q7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iLiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Ii8iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSI/IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iQSIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IkoiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJUIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iViIgaz0iMTkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlciIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJYIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iWSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IloiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJhIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJiIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iZSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0icCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0idiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IngiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4YzQ7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4YzU7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hjNjsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4YzA7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4YzM7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTUzOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE3ODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4YzI7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4YzE7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGRkOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlQiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTY7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9IngiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MTYxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MmM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iLiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ii8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSI6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJcIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iZiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iZyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InMiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDE4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkZDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSIxIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSI3IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iQyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IkciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJPIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iUSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlQiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iVyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0idyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxOTI7IiB1Mj0iMSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSImI3hkZDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJUIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iViIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJZIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlQiIGs9IjExMCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0ieCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9InoiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjEiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjgiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJUIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJWIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MTYwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGRkOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IioiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyYzsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iLSIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Ii4iIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iQCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iQSIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkMiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJHIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iSiIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Ik8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJRIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iUyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlQiIGs9IjQ5IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJWIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iVyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlgiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJZIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InciIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IngiIGs9Ii0xNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InoiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNDsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNTsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGFlOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YTk7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMTIyOyIgaz0iNDkiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGM2OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ4OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDNjMDsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzA7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzM7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MTUyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMTM7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxNDsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFjOyIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMWQ7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxODsiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE5OyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE3ODsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFhOyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFlOyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMjsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMTsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkMzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkNDsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkMjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNjA7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZGQ7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iKiIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDJjOyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSItIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iLiIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJAIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJBIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iQyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkciIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJKIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iTyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJTIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iVCIgaz0iNDkiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlYiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJXIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iWCIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlkiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ0IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ2IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0idyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ieCIgaz0iLTE0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ5IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0ieiIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM0OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGM1OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ2OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YWU7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hhOTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIxMjI7IiBrPSI0OSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzY7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDg7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4M2MwOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDI2OyIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMDsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMzsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkNTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNTI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxMzsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE0OyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMWM7IiBrPSI0MiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxZDsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE4OyIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMTk7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MTc4OyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMWE7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMWU7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMyOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMxOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQzOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ0OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGRkOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE3ZDsiIGs9IjMxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyYzsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSIuIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iLyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Ij8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJBIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iSiIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlQiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJWIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iVyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlgiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJZIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iWiIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImIiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImgiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9ImwiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IngiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9InoiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGM0OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGM1OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4YzY7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDI2OyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMwOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMzOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMWM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxODsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxYTsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFlOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMxOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJAIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IkMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJHIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iTyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IlEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJUIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJhIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImMiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZCIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJlIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9Im8iIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0icSIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZTc7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDg7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hlNjsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4MTUyOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeDE1MzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDQ7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTM7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTdkOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iMSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iQSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlgiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IloiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeDE3ZDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJUIiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJWIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJYIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJaIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ2IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTYxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4ZGQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iQSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iSiIgaz0iMTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlQiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iVyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJZIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0idSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGU3OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGMwOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE2MDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IkoiIGs9IjEyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJTIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJhIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJjIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJkIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJlIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJxIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGU3OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hlNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTUzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTYxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4ZGQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iQSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iSiIgaz0iMTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlQiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJZIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iYSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iYyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0icSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iciIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0icyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0idSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU3OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hlNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMwOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE2MDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkoiIGs9IjEyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJTIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJhIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJjIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJkIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJlIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSJxIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGU3OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hlNjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4MTUzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNjA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNjE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiZhbXA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IikiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSItIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ii4iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iOiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkAiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iQSIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJDIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkciIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iSiIgaz0iNzMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJPIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlEiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iUyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iVCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iViIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iWCIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iYSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJjIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImQiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZSIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ibSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Im8iIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0icCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJxIiBrPSI1NSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0icyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGM0OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjNTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDY7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGU3OyIgaz0iNTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGM2OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkODsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNjsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YWI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzM7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ1OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNTI7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDE1MzsiIGs9IjU1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzI7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMxOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkMzsiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDQ7IiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQyOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAzOTsiIHUyPSImI3hkZDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iVCIgaz0iMTEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IlciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IngiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9InoiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iMCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iMSIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iNCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iNiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iOSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iQSIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IkciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Ik8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlQiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlYiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImoiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ2IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjNDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3gxNTI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkZDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjEiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjgiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjkiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJDIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJRIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJUIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJWIiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJqIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ibSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0icCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0idCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0idSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ieSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMwOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMzOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ1OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDE2MDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkZDsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSIqIiBrPSI0MiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MmM7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ii0iIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSIuIiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkAiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkEiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJDIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iRyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkoiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJPIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iUSIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJUIiBrPSI0OSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iViIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlciIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJYIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iWSIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InYiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ3IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ4IiBrPSItMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9InkiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ6IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzQ7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzU7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDY7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hhZTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGE5OyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjEyMjsiIGs9IjQ5IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjNjsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkODsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gzYzA7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMjY7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMwOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMzOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ1OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDE1MjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDEzOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTQ7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxYzsiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDFkOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTg7IiBrPSI0MiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxOTsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gxNzg7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzI7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzE7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDQ7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iQCIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IlQiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iYSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImMiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJkIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImYiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9Im8iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJxIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0idiIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9InkiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hlNzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hhZTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hhOTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3gzYzA7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZTY7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4MTUzOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDE2MDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkZDsiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSIqIiBrPSI0MiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MmM7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Ii0iIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSIuIiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkAiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkEiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJDIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iRyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkoiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJPIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iUSIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJUIiBrPSI0OSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iViIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlciIGs9IjM1IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJYIiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iWSIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InYiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ3IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ4IiBrPSItMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InkiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJ6IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzQ7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzU7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDY7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hhZTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGE5OyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjEyMjsiIGs9IjQ5IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNjsiIGs9Ii03IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkODsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gzYzA7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMjY7IiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMwOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGMzOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQ1OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDE1MjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDEzOyIgaz0iLTciIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTQ7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYzsiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFkOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTg7IiBrPSI0MiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxOTsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNzg7IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0yMSIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzI7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzE7IiBrPSItNyIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDQ7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iQCIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IlQiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iYSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImMiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJkIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iZSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImYiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9Im8iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJxIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0idiIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9InkiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hlNzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hhZTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hhOTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3gzYzA7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4ZTY7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4MTUzOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IkAiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJUIiBrPSItMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImEiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJjIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iZCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImUiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJmIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJnIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJvIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0icSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9InYiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJ5IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4ZTc7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4YWU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4YTk7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4M2MwOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGU2OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeDE1MzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hjZDsiIHUyPSIvIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2Q7IiB1Mj0idiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4Y2Q7IiB1Mj0ieSIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0iLyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGNlOyIgdTI9InYiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGNlOyIgdTI9InkiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGNmOyIgdTI9Ii8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSJ2IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSJ5IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hjYzsiIHUyPSIvIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2M7IiB1Mj0idiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4Y2M7IiB1Mj0ieSIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTdkOyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDJjOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Ii4iIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSIvIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iPyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IkEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJKIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iVCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlYiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJXIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iWCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJaIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iYiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iaCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iayIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ieCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0ieiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzQ7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hjNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMjY7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzA7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxYzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDE4OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDFhOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMWU7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4YzE7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTdkOyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDJjOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Ii4iIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSIvIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iPyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IkEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJKIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iVCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlYiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJXIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iWCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJaIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iaCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iayIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ieCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0ieiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzQ7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hjNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMjY7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzA7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDE4OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDFhOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMWU7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4YzE7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4ZGQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTdkOyIgaz0iMzEiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDJjOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9Ii4iIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSIvIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iPyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IkEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJKIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iVCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlYiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJXIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlkiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJaIiBrPSIzMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iYiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iaCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iayIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ieCIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ieiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzQ7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hjNjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMjY7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzA7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzM7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAxYzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDE4OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDE3ODsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDFhOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMWU7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4YzE7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MmM7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSIuIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSJKIiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyMDI2OyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MjAxYTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeDIwMWU7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyYzsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9Ii4iIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IkoiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeDIwMjY7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyMDFhOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4MjAxZTsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDJjOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iLiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iSiIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4MjAyNjsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeDIwMWE7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyMDFlOyIgaz0iNyIgLz4KKzxoa2VybiB1MT0iJiN4YTQ7IiB1Mj0iNCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGRkOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeDE3ZDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSIxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iVCIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJaIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGRkOyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ZDsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJBIiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iSiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlQiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJWIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iVyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlgiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJZIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWiIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJkIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJlIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJoIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJtIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJwIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJxIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJyIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ1IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ2IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjNDsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjNTsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGM2OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGU2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjMDsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjMzsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTc4OyIgaz0iMjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjMjsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjMTsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorCis8L2ZvbnQ+Cis8L2RlZnM+Cis8dGV4dCB4PSI0MCIgeT0iNDAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIExpZ2h0IiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQcOBw4DDgsOEw4XDg8OGIEPDhyBEw5AgRcOJw4jDisOLIEkgw40gw4wgw44gw48gTsORPC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjgwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBMaWdodCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPk/Dk8OSw5TDlsOVw5jFkiBTxaAgVcOaw5nDm8OcIFnDncW4IFrFvSDDniBhw6HDoMOiw6TDpcOjw6YgY8OnIGTDsCBlw6nDqMOqw6sgaSDEsSDDrSDDrCDDriDDryBuw7Egb8Ozw7LDtMO2w7XDuMWTIHPFocOfIHXDusO5w7vDvCB5w73DvyB6xb48L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTIwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBMaWdodCIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPsO+IDEyMzQ1Njc4OTAgwr0gwrwgwr4gJSDigLAgJMKiwqPCpcaS4oKswqQg4oCgIOKAoSDCpyDCtiAjIF5+wrUgK8OXwrEgJmx0OyA9ICZndDsgw7fCrCAhwqE/wr8gJnF1b3Q7ICZhbXA7ICZhcG9zOyAqIMKwIC4gLCA6IDsgKCkgWyBcIF0ge30gLyB8PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjE2MCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgTGlnaHQiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7CpiBfIOKAmiDigJ4g4oCmIOKAueKAuiDCq8K7IOKAmCDigJkg4oCcIOKAnSDigKIgwq0gLSDigJMg4oCUIEAgwqkgwq4g4oSiIMKqwrogwrnCssKzIMK0IGAgy4Ygy5wgwqggwq8gwrcgwrg8L3RleHQ+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodC50dGYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHQudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Mzc2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodC53b2ZmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkxpZ2h0LndvZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyMTIwYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodC53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodEl0YWxpYy5lb3QgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHRJdGFsaWMuZW90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTZhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHRJdGFsaWMuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodEl0YWxpYy5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHRJdGFsaWMuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjkzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHRJdGFsaWMuc3ZnCkBAIC0wLDAgKzEsMzAzMCBAQAorPD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCIgPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID4KKzxtZXRhZGF0YT4KKzx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKzxpZD48IVtDREFUQVtPbW5lc19BVFQgVzAyIExpZ2h0IEl0YWxpY11dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0dlbmVyYXRlZCBpbiAyMDEwIGJ5IEZvbnRMYWIgU3R1ZGlvLiBDb3B5cmlnaHQgaW5mbyBwZW5kaW5nLl1dPjwvY29weXJpZ2h0PgorPHRyYWRlbWFyaz48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjU0NiIgaWQ9Ik9tbmVzX0FUVFcwMkxpZ2h0SXRhbGljIj4KKzxmb250LWZhY2UgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgTGlnaHQgSXRhbGljIiBwYW5vc2UtMT0iMCAwIDAgMCAwIDAgMCAwIDAgMCIgYXNjZW50PSI3MDAiIGRlc2NlbnQ9Ii0zMDAiIHVuaXRzLXBlci1lbT0iMTAwMCIgYWxwaGFiZXRpYz0iMCI+Cis8L2ZvbnQtZmFjZT4KKzxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSIxNzYiIC8+CisKKzxnbHlwaCB1bmljb2RlPSImI3hBOyIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOyIgLz4KKzxnbHlwaCB1bmljb2RlPSIgIiBnbHlwaC1uYW1lPSJzcGFjZSIgaG9yaXotYWR2LXg9IjE3NiIgLz4KKzxnbHlwaCB1bmljb2RlPSIhIiBnbHlwaC1uYW1lPSJleGNsYW0iIGhvcml6LWFkdi14PSIyNjYiIGQ9Ik0xMjUgMTcyUTExNCAxNzIgMTExIDE3NlQxMDkgMTkzTDE4OSA2NDdIMjU0TDEzOCAxODdRMTM1IDE3MiAxMjUgMTcyWk04OCAtNVE1MSAtNSA1MSAyMlE1MSA1MCA2NCA2MlE3NCA3MiA5MiA3MlExMjkgNzIgMTI5IDQ2UTEyOSAxOCAxMTcgNVExMDcgLTUgODggLTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGdseXBoLW5hbWU9InF1b3RlZGJsIiBob3Jpei1hZHYteD0iMzY2IiBkPSJNMjkzIDQwOVEyODIgNDA5IDI3OCA0MTNUMjc2IDQzMUwzMDQgNjQ3SDM3M0wzMDkgNDI4UTMwMyA0MDkgMjkzIDQwOVpNMTU3IDQwOVExNDYgNDA5IDE0MiA0MTNUMTQwIDQzMUwxNjggNjQ3SDIzN0wxNzMgNDI4UTE2NyA0MDkgMTU3IDQwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiMiIGdseXBoLW5hbWU9Im51bWJlcnNpZ24iIGhvcml6LWFkdi14PSI2NTkiIGQ9Ik0xNTUgLTFRMTU1IC0yIDE0OCAtM1QxMzMgMFQxMjIgMThUMTI2IDU3TDE2NSAxODRIMzFRMzIgMTg1IDMyIDE4N1EzMiAxOTIgMzMgMTk2TDM5IDIyMlEzOSAyMjQgMzkgMjI0VDQwIDIyNlYyMjdIMTc4TDIzOCA0MjBIMTA1UTEwNiA0MjEgMTA2IDQyM1ExMDYgNDI4IDEwNyA0MzJMMTEzIDQ1OFExMTMgNDU5IDExMyA0NjBUMTE0IDQ2MlY0NjNIMjUwTDMwNyA2NDhRMzA3IDY0OSAzMTQgNjUwVDMyOSA2NDdUMzQwIDYyOVQzMzYgNTkwTDI5NyA0NjNINDcyTDUyOSA2NDhRNTI5IDY0OSA1MzYgNjUwVDU1MSA2NDdUNTYyIDYyOVQ1NTggNTkwTDUxOSA0NjNINjUyUTY1MSA0NjIgNjUxIDQ2MFE2NTEgNDU4IDY1MSA0NTZUNjUwIDQ1MUw2NDQgNDI1UTY0MyA0MjMgNjQzIDQyMVY0MjBINTA1TDQ0NiAyMjdINTc5UTU3OCAyMjYgNTc4IDIyNFE1NzggMjIyIDU3OCAyMjBUNTc3IDIxNUw1NzEgMTkwUTU3MCAxODggNTcwIDE4NVYxODRINDMzTDM3NyAtMVEzNzcgLTIgMzcwIC0zVDM1NSAwVDM0NCAxOFQzNDggNTdMMzg3IDE4NEgyMTJMMTU1IC0xWk00MDEgMjI2TDQ2MSA0MjFIMjgzTDIyMyAyMjZINDAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJCIgZ2x5cGgtbmFtZT0iZG9sbGFyIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNMjA3IC01UTE1OSAzIDEyNSAyMVQ2OSA2MVE1MiA3OCA0MiA5NlQzMiAxMzFRMzIgMTQwIDM2IDE0NlQ0NyAxNTVUNTggMTU4VDYzIDE1OFE3OCAxMTYgMTE1IDgzVDIxNyAzOEwyNzYgMzExUTI0NiAzMjMgMjE4IDMzN1QxNjkgMzcyVDEzNCA0MThUMTIxIDQ4MlExMjEgNTE5IDEzNiA1NTFUMTc4IDYwNlQyNDUgNjQzVDMzNCA2NTdIMzQ4TDM2NyA3NDJINDExTDM5MiA2NTNRNDM2IDY0NSA0NjYgNjMwVDUxNiA1OTRRNTMyIDU3OCA1NDAgNTYyVDU0OCA1MzJRNTQ4IDUyMyA1NDQgNTE3VDUzNCA1MDhUNTIzIDUwNVQ1MTcgNTA1UTUwMyA1NDEgNDcwIDU3MFQzODAgNjA5TDMyNCAzNDVRMzU3IDMzMiAzODcgMzE4VDQ0MCAyODNUNDc2IDIzNlQ0OTAgMTcyUTQ5MCA5MSA0MzMgNDFUMjY5IC0xMEgyNTBMMjMxIC05OEgxODdMMjA3IC01Wk0yNzIgMzNRMzU2IDMzIDM5OCA2OVQ0NDAgMTY3UTQ0MCAxOTIgNDMwIDIxMVQ0MDMgMjQ1VDM2MiAyNzJUMzExIDI5NkwyNTYgMzRRMjYwIDM0IDI2NCAzNFQyNzIgMzNaTTM0MiA2MTNRMzM4IDYxNCAzMzEgNjE0UTI5NSA2MTQgMjY2IDYwNVQyMTYgNTc4VDE4NCA1MzdUMTcyIDQ4N1ExNzIgNDYyIDE4MCA0NDNUMjA0IDQwOVQyNDEgMzgzVDI4OCAzNjBMMzQyIDYxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiUiIGdseXBoLW5hbWU9InBlcmNlbnQiIGhvcml6LWFkdi14PSI3NDIiIGQ9Ik0yMzUgMzU4UTIwOSAzNTggMTg2IDM2N1QxNDUgMzkzVDExNyA0MzVUMTA2IDQ4OVExMDYgNTIyIDExOCA1NTJUMTUxIDYwNlQyMDIgNjQyVDI2NiA2NTZRMjkzIDY1NiAzMTYgNjQ3VDM1NyA2MjFUMzg1IDU3OVQzOTUgNTI1UTM5NSA0OTIgMzgzIDQ2MlQzNTAgNDA4VDI5OSAzNzJUMjM1IDM1OFpNNjIgLTdRNjAgLTkgNTEgLTRUNDIgMTNRNDIgMjMgNDcgMzFUNjkgNTRMNzE4IDY1OFE3MjAgNjYwIDcyOCA2NTVUNzM3IDYzOFE3MzcgNjI5IDczMiA2MjFUNzEwIDU5OEw2MiAtN1pNNTE0IC01UTQ4OCAtNSA0NjUgNFQ0MjMgMzBUMzk1IDcyVDM4NCAxMjZRMzg0IDE1OSAzOTYgMTg5VDQyOSAyNDNUNDgwIDI3OVQ1NDQgMjkzUTU3MSAyOTMgNTk0IDI4NFQ2MzUgMjU4VDY2MyAyMTZUNjczIDE2MlE2NzMgMTI5IDY2MSA5OVQ2MjggNDVUNTc4IDlUNTE0IC01Wk0yMzggMzk2UTI2MyAzOTYgMjg0IDQwNlQzMjAgNDM0VDM0NSA0NzRUMzU0IDUyM1EzNTQgNTY1IDMyOCA1OTFUMjYzIDYxOFEyMzggNjE4IDIxNyA2MDhUMTgxIDU4MFQxNTYgNTQwVDE0NyA0OTFRMTQ3IDQ0OSAxNzQgNDIzVDIzOCAzOTZaTTUxNyAzM1E1NDEgMzMgNTYyIDQzVDU5OSA3MVQ2MjQgMTExVDYzMyAxNjBRNjMzIDIwMiA2MDYgMjI4VDU0MSAyNTVRNTE3IDI1NSA0OTYgMjQ1VDQ1OSAyMTdUNDM0IDE3N1Q0MjUgMTI4UTQyNSA4NiA0NTIgNjBUNTE3IDMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFtcDsiIGdseXBoLW5hbWU9ImFtcGVyc2FuZCIgaG9yaXotYWR2LXg9IjY3NSIgZD0iTTI0MCAtMTBRMTkyIC0xMCAxNTQgM1Q5MCAzOVQ1MCA5NVQzNiAxNjVRMzYgMjQ5IDkxIDMwMFQyNTIgMzc1UTIzNSA0MDAgMjI1IDQyOFQyMTUgNDg4UTIxNSA1MjIgMjI3IDU1MlQyNjIgNjA2VDMxNiA2NDNUMzg1IDY1N1E0NDggNjU3IDQ4NiA2MjBUNTI0IDUyNVE1MjQgNDUxIDQ3MyA0MTBUMzI1IDM1Mkw0ODEgMTQ3UTUyNyAyMDAgNTUwIDI1N1Q1ODAgMzc3SDYyNVE2MTkgMzA4IDU5MCAyNDFUNTA3IDExNEw1MjAgOTVRNTQ4IDU4IDU3MCA0NVQ2MjEgMzNRNjIyIDMzIDYyMiAyN1Q2MjEgMTVUNjEyIDJUNTg4IC00UTU1NyAtNCA1MzYgMTJUNDg4IDYzTDQ3NCA4MlE0MjggNDAgMzcwIDE1VDI0MCAtMTBaTTMwMCAzODVRMzQzIDM5MiAzNzYgNDAyVDQzMiA0MjhUNDY2IDQ2N1Q0NzggNTI0UTQ3OCA1NjUgNDUyIDU5MFQzODAgNjE2UTM1MyA2MTYgMzMyIDYwNlQyOTUgNTc4VDI3MSA1MzhUMjYzIDQ5MVEyNjMgNDYxIDI3MiA0MzdUMzAwIDM4NVpNMjQ2IDMzUTMwOSAzMyAzNTggNTRUNDQ5IDExNEwyNzUgMzQyUTE3OCAzMjQgMTMxIDI3OVQ4NCAxNjdRODQgMTQwIDk0IDExNlQxMjQgNzNUMTc0IDQ0VDI0NiAzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgZ2x5cGgtbmFtZT0icXVvdGVzaW5nbGUiIGhvcml6LWFkdi14PSIyMzAiIGQ9Ik0xNTcgNDA5UTE0NiA0MDkgMTQyIDQxM1QxNDAgNDMxTDE2OCA2NDdIMjM4TDE3MyA0MjhRMTY3IDQwOSAxNTcgNDA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKCIgZ2x5cGgtbmFtZT0icGFyZW5sZWZ0IiBob3Jpei1hZHYteD0iMzg1IiBkPSJNMjQ5IC0xOTdRMjMyIC0xOTcgMjA4IC0xODVUMTU3IC0xNDdRMTE1IC0xMDUgOTAgLTM4VDY0IDEyMFE2NCAxODIgNzYgMjQzVDExMCAzNjBUMTY1IDQ2N1QyMzcgNTU3UTI4NCA2MDQgMzMyIDYyN1Q0MTggNjUxUTQzMSA2NTEgNDM2IDY0NlQ0NDMgNjMzVDQ0MSA2MTlUNDM0IDYxMFEzOTIgNjA4IDM1MiA1ODhUMjY5IDUyNlEyMzIgNDg5IDIwNCA0NDJUMTU1IDM0MlQxMjUgMjMyVDExNCAxMjBRMTE0IDQ1IDEzNCAtMTVUMTk1IC0xMTVRMjEzIC0xMzMgMjMwIC0xNDNUMjY5IC0xNjBRMjcxIC0xNjEgMjcyIC0xNjdUMjczIC0xNzlUMjY3IC0xOTFUMjQ5IC0xOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIpIiBnbHlwaC1uYW1lPSJwYXJlbnJpZ2h0IiBob3Jpei1hZHYteD0iMzg1IiBkPSJNLTM2IC0xOTZRLTQ4IC0xOTYgLTUzIC0xOTFULTYwIC0xNzhULTU4IC0xNjRULTUxIC0xNTVRLTkgLTE1MyAzMSAtMTMzVDExNCAtNzFRMTUwIC0zNCAxNzkgMTNUMjI3IDExM1QyNTcgMjIyVDI2OCAzMzVRMjY4IDQxMCAyNDggNDcwVDE4OCA1NzBRMTcwIDU4OCAxNTMgNTk4VDExNCA2MTVRMTEyIDYxNiAxMTEgNjIxVDExMCA2MzRUMTE2IDY0NlQxMzQgNjUyUTE1MSA2NTIgMTc1IDY0MFQyMjYgNjAyUTI2NyA1NjAgMjkyIDQ5M1QzMTggMzM1UTMxOCAyNzMgMzA2IDIxMlQyNzIgOTVUMjE3IC0xMlQxNDUgLTEwMlE5OCAtMTQ5IDUwIC0xNzJULTM2IC0xOTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBnbHlwaC1uYW1lPSJhc3RlcmlzayIgaG9yaXotYWR2LXg9IjQxMSIgZD0iTTE2NyAzNzJRMTU5IDM3OCAxNjkgMzk0TDIzMyA0ODdMMTI2IDUyNlExMTMgNTMxIDExMyA1NDBRMTEzIDU2NSAxMzggNTU5TDI0NyA1MjdMMjUwIDY0MFEyNTEgNjUyIDI1NSA2NTVUMjY3IDY1OVEyNzUgNjU5IDI3OSA2NTZUMjg0IDY0MEwyODcgNTI3TDM5NiA1NTlRNDIxIDU2NSA0MjEgNTQwUTQyMSA1MzIgNDA3IDUyNkwzMDEgNDg3TDM2NSAzOTRRMzc1IDM3OCAzNjcgMzcyUTM2MCAzNjUgMzUzIDM2NFQzMzcgMzc0TDI2NyA0NjNMMTk3IDM3NFExODkgMzYzIDE4MiAzNjRUMTY3IDM3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IisiIGdseXBoLW5hbWU9InBsdXMiIGhvcml6LWFkdi14PSI1NTQiIGQ9Ik0yMzUgMzhRMjI3IDM4IDIyMSA0MlQyMTggNjFMMjU3IDI0NUg4OFE2NiAyNDUgNjYgMjU3UTY2IDI2MiA2OCAyNzBUNzUgMjgzUTgyIDI4OCA5MyAyODhIMjY2TDMwMyA0NjBRMzA3IDQ4MyAzMjQgNDgzSDMzMFEzMzggNDgzIDM0NCA0NzlUMzQ4IDQ2MEwzMTEgMjg4SDQ4MFE1MDIgMjg4IDUwMiAyNzZRNTAyIDI3MSA1MDAgMjYzVDQ5MyAyNTBRNDg4IDI0NSA0NzQgMjQ1SDMwMkwyNjMgNjFRMjU4IDM4IDI0MSAzOEgyMzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyYzsiIGdseXBoLW5hbWU9ImNvbW1hIiBob3Jpei1hZHYteD0iMjI1IiBkPSJNLTE4IC0xMzBRLTIwIC0xMzIgLTI0IC0xMzFULTMzIC0xMjhULTM5IC0xMjJULTQwIC0xMTVMNjQgNzhRNjUgNzkgNzIgNzlUODcgNzZUMTAyIDY4VDEwOSA1M1ExMDkgNDUgMTA2IDM4VDk1IDE5TC0xOCAtMTMwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgZ2x5cGgtbmFtZT0iaHlwaGVuIiBob3Jpei1hZHYteD0iMzg1IiBkPSJNNjAgMjI2UTYwIDIyNyA2MSAyMjlRNjEgMjMxIDYzIDIzOUw2OCAyNjRRNjggMjY2IDY4IDI2N1Q2OSAyNjlWMjcwSDMzMFEzMjkgMjY5IDMyOSAyNjdRMzI5IDI2NSAzMjkgMjYzVDMyOCAyNThMMzIyIDIzMlEzMjEgMjMwIDMyMSAyMjdWMjI2SDYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLiIgZ2x5cGgtbmFtZT0icGVyaW9kIiBob3Jpei1hZHYteD0iMjI1IiBkPSJNNjggLTVRMzEgLTUgMzEgMjJRMzEgNTAgNDMgNjJRNTMgNzIgNzIgNzJRMTA5IDcyIDEwOSA0NlExMDkgMTggOTYgNVE4NiAtNSA2OCAtNVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ii8iIGdseXBoLW5hbWU9InNsYXNoIiBob3Jpei1hZHYteD0iMzUxIiBkPSJNLTc2IC0xOTNMMzYxIDY0N0g0MTVMLTIyIC0xOTNILTc2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMCIgZ2x5cGgtbmFtZT0iemVybyIgaG9yaXotYWR2LXg9IjY1NiIgZD0iTTMxMyAtMTBRMjU2IC0xMCAyMTMgN1QxNDEgNTZUOTggMTMwVDgzIDIyNFE4MyAyNTkgODkgMjk2VDEwOCAzODdRMTIxIDQ0NSAxNDMgNDk0VDE5OCA1ODBUMjc1IDYzNlQzODAgNjU3UTQzNyA2NTcgNDgwIDY0MFQ1NTIgNTkxVDU5NSA1MTZUNjEwIDQyM1E2MTAgMzg4IDYwNCAzNTFUNTg1IDI1OVE1NzEgMjAyIDU1MCAxNTNUNDk2IDY3VDQxOCAxMVQzMTMgLTEwWk0zMTQgMzNRMzY0IDMzIDQwMSA1MVQ0NjQgMTAwVDUwOCAxNzRUNTM3IDI2NVE1NDkgMzE2IDU1NCAzNTRUNTYwIDQyM1E1NjAgNDY1IDU0OCA1MDBUNTEzIDU2MFQ0NTcgNjAwVDM4MCA2MTRRMzMwIDYxNCAyOTMgNTk2VDIyOSA1NDdUMTg1IDQ3M1QxNTYgMzgxUTE0NCAzMzAgMTM5IDI5M1QxMzMgMjI0UTEzMyAxODIgMTQ1IDE0N1QxODAgODdUMjM3IDQ3VDMxNCAzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGdseXBoLW5hbWU9Im9uZSIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTEzOCAwTDI1NiA1NThRMjQyIDU0MSAyMjAgNTMxVDE3NiA1MjFRMTUzIDUyMSAxNDAgNTI1VDExOCA1MzhRMTA4IDU0OCAxMDggNTYzUTEwOCA1NzkgMTE4IDU4OFQxMzAgNTk2UTEzNyA1ODUgMTUxIDU3OFQxODkgNTcxUTIyMSA1NzEgMjQ3IDU5NFQyODIgNjUwSDMwM1EzMjYgNjUwIDMyMCA2MjNMMTg4IDBIMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMiIgZ2x5cGgtbmFtZT0idHdvIiBob3Jpei1hZHYteD0iNTQ1IiBkPSJNMTI2IDE2OVExMDMgMTQ2IDkwIDExNlQ3NCA0Nkg0NTZMNDQ3IDBINTJRNDEgMCAzMyAxMVQyNCAzNVEyNCA4NiA0MSAxMjlUOTEgMjA0UTEyOSAyNDIgMTc4IDI2NlQyODQgMzEwUTMzNiAzMjkgMzc0IDM0NlQ0MzYgMzgzVDQ3MyA0MjhUNDg1IDQ4OFE0ODUgNTQyIDQ0NCA1NzdUMzI5IDYxMlEyNTkgNjEyIDIxNyA1NzdUMTUyIDQ5MVExNTEgNDkwIDE0NyA0OTBUMTM3IDQ5NFQxMjcgNTAzVDEyMiA1MTlRMTIyIDUzMCAxMzIgNTUwVDE2MiA1OTFRMTg5IDYxOCAyMzEgNjM3VDMzMSA2NTdRNDI3IDY1NyA0ODEgNjExVDUzNiA0ODhRNTM2IDQ0MSA1MjEgNDA4VDQ3NSAzNTBUNDAxIDMwNFQzMDAgMjYzUTI0MSAyNDIgMjAwIDIyMlQxMjYgMTY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMyIgZ2x5cGgtbmFtZT0idGhyZWUiIGhvcml6LWFkdi14PSI1NTMiIGQ9Ik0yMzggLTEwUTE3NyAtMTAgMTMwIDhUNTcgNTNRMzMgNzcgMjQgMTAwVDE0IDEzN1ExNCAxNDkgMTkgMTU2VDMwIDE2OFQ0MiAxNzJUNDggMTcyUTUyIDE0MyA2NyAxMThUMTA2IDczVDE2NCA0NFQyNDEgMzNRMjg2IDMzIDMyMCA0NlQzNzggODFUNDEzIDEzMlQ0MjUgMTkzUTQyNSAyNTAgMzg2IDI4NVQyNjggMzIwSDE4NUwxOTQgMzYzSDI3OVEzMzQgMzYzIDM3MCAzNzRUNDI5IDQwM1Q0NjEgNDQ3VDQ3MSA1MDBRNDcxIDUyNSA0NjAgNTQ2VDQyOSA1ODJUMzgyIDYwNlQzMjIgNjE1UTI2MyA2MTUgMjE2IDU4OFQxNDMgNTIyUTE0MiA1MjEgMTM4IDUyMlQxMzAgNTI2VDEyMiA1MzVUMTE4IDU0NlExMTggNTY1IDE0MiA1ODlRMTcxIDYxOCAyMTcgNjM3VDMyNSA2NTdRMzY3IDY1NyA0MDMgNjQ3VDQ2NiA2MTdUNTA4IDU2OFQ1MjQgNTAyUTUyNCA0MzkgNDg0IDM5M1QzNjUgMzM2UTQyMSAzMjEgNDQ5IDI4M1Q0NzcgMTk0UTQ3NyAxNTcgNDYzIDEyMVQ0MjAgNTVUMzQ2IDhUMjM4IC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjQiIGdseXBoLW5hbWU9ImZvdXIiIGhvcml6LWFkdi14PSI1OTQiIGQ9Ik0zMzQgMEwzNzQgMTkzSDYwUTU4IDE5MyA1MSAyMDRUNDMgMjI4UTQzIDI0MSA0OSAyNTFUNjkgMjc2TDQyNCA2MjNRNDQxIDYzOSA0NTIgNjQ1VDQ3OCA2NTJRNTAyIDY1MiA1MDkgNjQyVDUxMyA2MTVMNDMyIDIzOEg1NTNMNTQ0IDE5M0g0MjNMMzgyIDBIMzM0Wk0zODUgMjM4TDQ2MyA2MDRMOTIgMjM4SDM4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjUiIGdseXBoLW5hbWU9ImZpdmUiIGhvcml6LWFkdi14PSI1NTUiIGQ9Ik0xNTcgMzcxUTE4NyAzODUgMjE3IDM5MFQyODAgMzk2UTMzMCAzOTYgMzcwIDM4NFQ0MzggMzQ4VDQ4MSAyOTJUNDk2IDIyMFE0OTYgMTcyIDQ4MCAxMzFUNDMyIDU4VDM1NSA4VDI1MSAtMTBRMTg4IC0xMCAxNDIgOFQ2NiA1NlE0NyA3NiAzOSA5NFQzMSAxMjZRMzEgMTM1IDM1IDE0MVQ0NiAxNTBUNTcgMTU1VDYzIDE1NVE3NyAxMDMgMTI2IDY5VDI1MyAzNFEyOTggMzQgMzMzIDQ4VDM5MyA4OFQ0MzEgMTQ2VDQ0NCAyMTdRNDQ0IDI4MCA0MDIgMzE2VDI3NiAzNTJRMjMwIDM1MiAxOTUgMzQzVDEzMCAzMTdRMTEzIDMyMSAxMDggMzMwVDEwNSAzNTZMMTU5IDYxNVExNjcgNjQ3IDE5NyA2NDdINTU2TDU0NyA2MDJIMjA1TDE1NyAzNzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI2IiBnbHlwaC1uYW1lPSJzaXgiIGhvcml6LWFkdi14PSI2MDUiIGQ9Ik0zMDIgLTEwUTI1NCAtMTAgMjE0IDRUMTQ1IDQ2VDEwMCAxMTdUODMgMjE3UTgzIDI0OCA4OSAyOTZUMTExIDM5N1QxNTAgNTAwVDIxMCA1ODZRMjQ0IDYyMCAyODQgNjM4VDM5MCA2NTdRNDQ0IDY1NyA0ODEgNjQxVDU0MSA2MDJRNTU4IDU4NSA1NjUgNTY5VDU3MiA1NDNRNTcyIDUzNCA1NjggNTI4VDU1OCA1MThUNTQ4IDUxM1Q1NDIgNTEzUTUyNSA1NTkgNDg0IDU4N1QzODUgNjE1UTI4NiA2MTUgMjI4IDUzOVQxNDMgMzIzUTE3MiAzNTIgMjE4IDM3NFQzMzEgMzk2UTM3NyAzOTYgNDE1IDM4NFQ0ODAgMzUwVDUyMiAyOTVUNTM3IDIyMVE1MzcgMTc1IDUyMCAxMzNUNDcxIDYwVDM5NyA5VDMwMiAtMTBaTTMwMyAzNFEzNDUgMzQgMzc5IDQ4VDQzOCA4N1Q0NzYgMTQ1VDQ5MCAyMThRNDkwIDI3OSA0NDggMzE3VDMyNSAzNTVRMjU5IDM1NSAyMTIgMzMxVDEzNCAyNzJRMTMyIDI1NyAxMzEgMjQzVDEzMCAyMTZRMTMwIDEyNiAxNzYgODBUMzAzIDM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNyIgZ2x5cGgtbmFtZT0ic2V2ZW4iIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0xMjQgLTNRMTIzIC0zIDExNSAtMlQxMDAgNlQ5MyAyNVQxMTEgNjFMNTEzIDYwMkgxMTVMMTI0IDY0N0g1MzdRNTM4IDY0NyA1NDIgNjQ0VDU1MCA2MzZUNTU3IDYyNFQ1NjEgNjA3UTU2MSA1OTkgNTU4IDU5MFQ1NDMgNTY3TDEyNCAtM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGdseXBoLW5hbWU9ImVpZ2h0IiBob3Jpei1hZHYteD0iNjAwIiBkPSJNMjgwIC0xMFEyMjcgLTEwIDE4NCAyVDExMSAzNlQ2NCA4OVQ0NyAxNThRNDcgMTkyIDYwIDIyMlQ5OSAyNzdUMTU5IDMxOFQyMzggMzQyUTE4NyAzNTcgMTYxIDM4OVQxMzUgNDY5UTEzNSA1MDggMTUyIDU0MlQxOTkgNjAxVDI3MiA2NDJUMzY2IDY1N1E0MTEgNjU3IDQ0OSA2NDZUNTE0IDYxNVQ1NTcgNTY1VDU3MyA1MDFRNTczIDQ3MSA1NjIgNDQzVDUzMCAzOTNUNDc4IDM1NFQ0MDQgMzMwUTQ2NyAzMTIgNDk2IDI3M1Q1MjYgMTg2UTUyNiAxNDQgNTA5IDEwOVQ0NTkgNDdUMzgyIDVUMjgwIC0xMFpNMzQ3IDM1N1E0MzAgMzU3IDQ3NiAzOTVUNTIzIDQ5N1E1MjMgNTUxIDQ3OSA1ODNUMzU5IDYxNVEzMTkgNjE1IDI4NyA2MDRUMjMyIDU3NFQxOTcgNTI5VDE4NSA0NzFRMTg1IDQxOCAyMjggMzg4VDM0NyAzNTdaTTI4MiAzMlEzNzIgMzIgNDI0IDc1VDQ3NiAxODZRNDc2IDI0MSA0MjggMjc3VDI4OSAzMTRRMjQ3IDMxNCAyMTIgMzAzVDE1MiAyNzFUMTEyIDIyM1Q5NyAxNjFROTcgMTA0IDE0NiA2OFQyODIgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI5IiBnbHlwaC1uYW1lPSJuaW5lIiBob3Jpei1hZHYteD0iNjA1IiBkPSJNMjQ5IC0xMFExOTQgLTEwIDE1NyA3VDk3IDQ2UTgwIDYzIDczIDc5VDY2IDEwNlE2NiAxMTUgNzAgMTIxVDc5IDEzMVQ4OSAxMzVUOTUgMTM1UTExMyA4OSAxNTQgNjFUMjU1IDMzUTM1MyAzMyA0MTEgMTA2VDQ5NyAzMTRRNDY4IDI4NSA0MjEgMjYzVDMxMCAyNDFRMjE0IDI0MSAxNTkgMjg3VDEwNCA0MjFRMTA0IDQ2OSAxMjEgNTEyVDE3MCA1ODdUMjQ1IDYzOFQzNDAgNjU3UTM4OCA2NTcgNDI4IDY0M1Q0OTcgNjAxVDU0MiA1MzBUNTU5IDQzMFE1NTkgMzk5IDU1MyAzNTFUNTMxIDI1MVQ0OTIgMTQ4VDQzMSA2MlEzOTcgMjcgMzU2IDlUMjQ5IC0xMFpNMzE2IDI4MlEzNzkgMjgyIDQyNyAzMDZUNTA2IDM2NVE1MTIgNDAxIDUxMiA0MzFRNTEyIDUyMSA0NjYgNTY3VDMzOSA2MTNRMjk3IDYxMyAyNjMgNTk5VDIwMyA1NjBUMTY1IDUwMFQxNTEgNDI0UTE1MSAzNTggMTkxIDMyMFQzMTYgMjgyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOiIgZ2x5cGgtbmFtZT0iY29sb24iIGhvcml6LWFkdi14PSIyNDkiIGQ9Ik0xNTUgMzQ5UTExOCAzNDkgMTE4IDM3NlExMTggNDAyIDEzMCA0MTZRMTQwIDQyNiAxNTkgNDI2UTE5NiA0MjYgMTk2IDM5OVExOTYgMzcxIDE4MyAzNTlRMTczIDM0OSAxNTUgMzQ5Wk04MCAtNVE0MyAtNSA0MyAyMlE0MyA1MCA1NSA2MlE2NSA3MiA4NCA3MlExMjEgNzIgMTIxIDQ2UTEyMSAxOCAxMDggNVE5OCAtNSA4MCAtNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjsiIGdseXBoLW5hbWU9InNlbWljb2xvbiIgaG9yaXotYWR2LXg9IjI0OSIgZD0iTS02IC0xMzBRLTggLTEzMiAtMTIgLTEzMVQtMjEgLTEyOFQtMjcgLTEyMlQtMjggLTExNUw3NiA3OFE3NyA3OSA4NCA3OVQ5OSA3NlQxMTQgNjhUMTIxIDUzUTEyMSA0NSAxMTggMzhUMTA3IDE5TC02IC0xMzBaTTE1NSAzNDlRMTE4IDM0OSAxMTggMzc2UTExOCA0MDIgMTMwIDQxNlExNDAgNDI2IDE1OSA0MjZRMTk2IDQyNiAxOTYgMzk5UTE5NiAzNzEgMTgzIDM1OVExNzMgMzQ5IDE1NSAzNDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImbHQ7IiBnbHlwaC1uYW1lPSJsZXNzIiBob3Jpei1hZHYteD0iNDk1IiBkPSJNODYgMjMyUTY4IDI0MiA2OCAyNjJRNjggMjc0IDc0IDI4NFQ5OSAzMDRMNDU0IDQ3OVE0NTYgNDgwIDQ2MiA0NzRUNDcwIDQ1NlE0NzAgNDQ4IDQ2NCA0NDBUNDM3IDQyMUwxMTcgMjY0TDM2MyAxMTJRMzgxIDEwMiAzODcgOTNUMzkyIDc1UTM5MCA2NCAzODMgNThUMzc0IDUzTDg2IDIzMloiICAvPgorPGdseXBoIHVuaWNvZGU9Ij0iIGdseXBoLW5hbWU9ImVxdWFsIiBob3Jpei1hZHYteD0iNTU0IiBkPSJNMTIyIDM0OVE5OSAzNDkgOTkgMzYxUTk5IDM2NyAxMDEgMzc2VDEwOCAzODlRMTEzIDM5NCAxMjggMzk0SDQ5MFE1MTQgMzk0IDUxNCAzODJRNTE0IDM3NiA1MTEgMzY4VDUwNCAzNTVRNDk4IDM0OSA0ODUgMzQ5SDEyMlpNNzQgMTI4UTUxIDEyOCA1MSAxNDBRNTEgMTQ2IDU0IDE1NFQ2MSAxNjhRNjggMTczIDgwIDE3M0g0NDNRNDY2IDE3MyA0NjYgMTYxUTQ2NiAxNTUgNDY0IDE0NlQ0NTYgMTMzUTQ1MiAxMjggNDM3IDEyOEg3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZndDsiIGdseXBoLW5hbWU9ImdyZWF0ZXIiIGhvcml6LWFkdi14PSI0OTUiIGQ9Ik01MyA1M1E1MSA1MiA0NSA1OVQzOCA3N1EzNyA4NSA0MyA5M1Q3MCAxMTJMMzkxIDI2OUwxNDQgNDIwUTEyNiA0MzEgMTIwIDQ0MFQxMTYgNDU3UTExOCA0NjkgMTI0IDQ3NVQxMzQgNDc5TDQyMiAzMDFRNDQwIDI4OSA0NDAgMjcxUTQ0MCAyNTggNDM0IDI0OFQ0MDggMjI5TDUzIDUzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iPyIgZ2x5cGgtbmFtZT0icXVlc3Rpb24iIGhvcml6LWFkdi14PSI0OTIiIGQ9Ik0xODIgMjEwUTE4NyAyMzUgMTk1IDI1NFQyMTcgMjg5VDI1NCAzMThUMzE1IDM0NFEzNzggMzY2IDQxNCAzOThUNDUxIDQ4OVE0NTEgNTQzIDQxMyA1NzhUMzA3IDYxM1EyNDQgNjEzIDIwMiA1NzhUMTQxIDQ4OFExNDAgNDg3IDEzNSA0ODhUMTI0IDQ5MlQxMTQgNTAwVDEwOSA1MTVRMTA5IDUyOSAxMjAgNTUxVDE1MyA1OTVRMTgwIDYyMiAyMTkgNjM5VDMxMCA2NTdRMzUzIDY1NyAzODggNjQ1VDQ0OCA2MTBUNDg2IDU1NlQ1MDAgNDg5UTUwMCA0NDkgNDg3IDQyMFQ0NTEgMzY5VDQwMSAzMzRUMzQ1IDMxMFEzMTEgMjk4IDI5MCAyODhUMjU3IDI2NVQyMzggMjM4VDIyOCAyMDRMMjIxIDE3NEgxNzRMMTgyIDIxMFpNMTc4IC01UTE0MCAtNSAxNDAgMjJRMTQwIDUwIDE1MyA2MlExNjMgNzIgMTgxIDcyUTIxOSA3MiAyMTkgNDZRMjE5IDIwIDIwNiA1UTE5NiAtNSAxNzggLTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJAIiBnbHlwaC1uYW1lPSJhdCIgaG9yaXotYWR2LXg9Ijc2OSIgZD0iTTQwMCA0NzBRNDQwIDQ3MCA0NjcgNDUwVDUwNCA0MDFMNTE3IDQ2M0g1NjNMNTI2IDI4N1E1MTggMjQ3IDUzMSAyMjZUNTgwIDIwNFE2MDcgMjA0IDYyOSAyMThUNjY2IDI1OFQ2OTAgMzE3VDY5OSAzODlRNjk5IDQ0MSA2ODAgNDgzVDYyNyA1NTdUNTQ0IDYwNVQ0MzggNjIyUTM3MCA2MjIgMzEyIDU5NVQyMTEgNTIxVDE0NCA0MTNUMTE5IDI4MlExMTkgMjI2IDEzOCAxODBUMTkzIDk5VDI3OSA0NVQzOTMgMjZRNDQyIDI2IDQ4NyA0MFQ1NjEgNzRRNTY3IDc5IDU3MyA4MVQ1ODcgODRRNTk3IDg0IDYwMyA3M1Q2MDcgNTlRNTkxIDQ2IDU2OCAzNFQ1MTcgMTJUNDU2IC00VDM5MCAtMTBRMzE4IC0xMCAyNjEgMTFUMTY0IDcwVDEwMyAxNjJUODEgMjc5UTgxIDM1NiAxMDggNDI0VDE4NCA1NDVUMjk5IDYyN1Q0NDIgNjU3UTUwOSA2NTcgNTYzIDYzOFQ2NTYgNTg1VDcxNiA1MDFUNzM3IDM5MVE3MzcgMzQzIDcyNiAzMDJUNjkzIDIzMVQ2NDEgMTg0VDU3NCAxNjdRNTI4IDE2NyA1MDUgMTg3VDQ3OCAyMzhRNDM5IDE3MSAzNjAgMTcxUTMxMCAxNzEgMjc3IDIwM1QyNDMgMjkyUTI0MyAzMjUgMjU0IDM1N1QyODcgNDE0VDMzNyA0NTRUNDAwIDQ3MFpNMzcyIDIwOVEzOTMgMjA5IDQxMSAyMTdUNDQ1IDIzOFQ0NzAgMjY5VDQ4NCAzMDdMNDk0IDM1NFE0ODggMzg3IDQ2NiA0MDlUNDAzIDQzMVEzNzcgNDMxIDM1NyA0MjBUMzIxIDM4OVQyOTggMzQ2VDI5MCAyOTdRMjkwIDI1NiAzMTMgMjMzVDM3MiAyMDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJBIiBnbHlwaC1uYW1lPSJBIiBob3Jpei1hZHYteD0iNjMxIiBkPSJNLTI0IDBMMzU3IDYzNVEzNjIgNjQ0IDM2OSA2NDhUMzg5IDY1MlE0MDggNjUyIDQxNSA2NDZUNDI0IDYyOUw1NTMgMEg1MDFMNDU3IDIyNEgxNjZMMzQgMEgtMjRaTTQ0OCAyNjhMMzg0IDU5NUwxOTEgMjY4SDQ0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkIiIGdseXBoLW5hbWU9IkIiIGhvcml6LWFkdi14PSI2MjciIGQ9Ik0xNzUgNjE2UTE4MCA2NDcgMjEyIDY0N0gzOTFRNDg4IDY0NyA1MzYgNjExVDU4NSA1MDRRNTg1IDQ3NCA1NzcgNDQ3VDU1MSAzOTdUNTA1IDM1OFQ0MzUgMzMyUTQ5NSAzMTkgNTI4IDI4NVQ1NjEgMTk4UTU2MSAxNTcgNTQ4IDEyMVQ1MDYgNThUNDI4IDE2VDMwOSAwSDQ1TDE3NSA2MTZaTTMxMiA0NVE0MTkgNDUgNDY0IDg0VDUxMCAxOThRNTEwIDI1MiA0NjkgMjgwVDM1MiAzMDlIMTYwTDEwNCA0NUgzMTJaTTM1NiAzNTNRNDAxIDM1MyA0MzQgMzY0VDQ4OSAzOTRUNTIzIDQ0MFQ1MzQgNDk4UTUzMSA2MDIgMzg2IDYwMkgyMjNMMTY5IDM1M0gzNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJDIiBnbHlwaC1uYW1lPSJDIiBob3Jpei1hZHYteD0iNjgxIiBkPSJNMzY1IC0xMFEzMDAgLTEwIDI0OCA5VDE1OCA2NFQxMDAgMTUxVDc5IDI2NlE3OSAzNDUgMTA2IDQxNlQxODAgNTQwVDI5MyA2MjVUNDM0IDY1N1E1MDUgNjU3IDU1MCA2MzZUNjIzIDU4N1E2NDYgNTY0IDY1NiA1NDBUNjY2IDUwMVE2NjYgNDkxIDY2MiA0ODVUNjUyIDQ3NlQ2NDEgNDcxVDYzMyA0NzJRNjE1IDUzOCA1NjUgNTc2VDQzMSA2MTRRMzY2IDYxNCAzMTIgNTg3VDIxNyA1MTNUMTU1IDQwNFQxMzIgMjczUTEzMiAyMTggMTQ5IDE3NFQxOTYgOThUMjcwIDUxVDM2NSAzNFE0MDUgMzQgNDM4IDQzVDQ5OSA2OVQ1NDUgMTA2VDU3OSAxNTBRNTgwIDE1MSA1ODQgMTUwVDU5MiAxNDZUNjAwIDEzOFQ2MDQgMTI0UTYwNCAxMTUgNTk2IDk5VDU2OCA2M1E1MzggMzQgNDg1IDEyVDM2NSAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJEIiBnbHlwaC1uYW1lPSJEIiBob3Jpei1hZHYteD0iNjgyIiBkPSJNMTc2IDYxNlExODEgNjQ3IDIxMiA2NDdIMzE5UTQ3MSA2NDcgNTU0IDU3NlQ2MzggMzc2UTYzOCAyOTcgNjEzIDIyOVQ1MzcgMTA5VDQxMyAyOVQyMzkgMEg0NUwxNzYgNjE2Wk0yNDcgNDRRMzMyIDQ0IDM5NSA2OVQ1MDEgMTM5VDU2NCAyNDNUNTg1IDM2OVE1ODUgNDc5IDUxNiA1NDFUMzE2IDYwM0gyMjNMMTA1IDQ0SDI0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IkUiIGdseXBoLW5hbWU9IkUiIGhvcml6LWFkdi14PSI1OTUiIGQ9Ik0xNzYgNjE2UTE4MyA2NDcgMjEyIDY0N0g2MTVMNjA2IDYwMkgyMjNMMTcwIDM1NEg0NzFMNDYyIDMxMEgxNjFMMTA1IDQ2SDQ5OEw0ODggMEg0NUwxNzYgNjE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRiIgZ2x5cGgtbmFtZT0iRiIgaG9yaXotYWR2LXg9IjU1NyIgZD0iTTE3NiA2MTZRMTgxIDY0NyAyMTIgNjQ3SDU5OEw1ODkgNjAySDIyM0wxNjYgMzMzSDQ0NEw0MzUgMjg5SDE1Nkw5NCAwSDQ1TDE3NiA2MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJHIiBnbHlwaC1uYW1lPSJHIiBob3Jpei1hZHYteD0iNzI1IiBkPSJNMzYzIC0xMFEzMDEgLTEwIDI0OSA4VDE2MCA2MlQxMDEgMTUwVDgwIDI2OFE4MCAzNDQgMTA2IDQxNFQxNzkgNTM4VDI5MiA2MjRUNDM3IDY1N1E1MDkgNjU3IDU1OCA2MzVUNjM0IDU4NVE2NTMgNTY2IDY2MiA1NDZUNjcyIDUxMVE2NzIgNDk5IDY2NyA0OTJUNjU2IDQ4MlQ2NDUgNDc5VDYzOCA0NzlRNjMxIDUwNiA2MTQgNTMwVDU3MCA1NzNUNTEwIDYwMlQ0MzYgNjEzUTM2OSA2MTMgMzEzIDU4NVQyMTcgNTExVDE1NSA0MDJUMTMyIDI3M1ExMzIgMjE1IDE0OSAxNzBUMTk3IDk1VDI3MCA0OVQzNjQgMzNRNDE0IDMzIDQ1NiA0OVQ1MjkgOTdRNTQ2IDExMyA1NTggMTMwVDU3OSAxNjdUNTk2IDIxMlQ2MTEgMjczSDM4OUwzOTggMzE4SDYzMFE2NjYgMzE4IDY1OCAyODNMNTk4IDBRNTk4IC0zIDU4NyAtM1E1NzMgLTMgNTY2IDhUNTY0IDQ5TDU3NCA5OFE1NDggNTIgNDk0IDIxVDM2MyAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBnbHlwaC1uYW1lPSJIIiBob3Jpei1hZHYteD0iNjk0IiBkPSJNMTc4IDYyN1ExODQgNjUwIDIwMyA2NTBIMjEwUTIzMyA2NTAgMjI4IDYyNEwxNjkgMzQ3SDU3Mkw2MzEgNjI3UTYzNyA2NTAgNjU2IDY1MEg2NjNRNjg3IDY1MCA2ODEgNjI0TDU0OCAwSDQ5OUw1NjIgMzAxSDE1OUw5NSAwSDQ2TDE3OCA2MjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJJIiBnbHlwaC1uYW1lPSJJIiBob3Jpei1hZHYteD0iMjYxIiBkPSJNMTkwIDYyOFExOTQgNjUwIDIxNCA2NTBIMjIxUTIzMiA2NTAgMjM2IDY0M1QyMzkgNjIzTDEwNiAwSDU2TDE5MCA2MjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJKIiBnbHlwaC1uYW1lPSJKIiBob3Jpei1hZHYteD0iNDcwIiBkPSJNMTc2IC0xMFExMzEgLTEwIDk5IDRUNDYgMzhRMzEgNTQgMjUgNjZUMTkgODdRMTkgOTYgMjMgMTAyVDMyIDExMlQ0MiAxMTdUNDggMTE3UTYyIDgwIDk2IDU3VDE3NiAzM1EyMzggMzMgMjczIDcxVDMyNiAxOTJMNDIzIDY0N0g0NzJMMzc0IDE4NVEzNTMgODUgMzA1IDM4VDE3NiAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJLIiBnbHlwaC1uYW1lPSJLIiBob3Jpei1hZHYteD0iNTU5IiBkPSJNNDU2IC00UTQ0NCAtNCA0MzQgMFQ0MTIgMTNUMzg4IDM5VDM1NiA3OEwxNjUgMzI5TDk0IDBINDVMMTc4IDYyN1ExODMgNjUwIDIwMyA2NTBIMjEwUTIzMyA2NTAgMjI4IDYyNEwxNjggMzQyTDU1OSA2NTZRNTYwIDY1NiA1NjcgNjUzVDU3OSA2NDNUNTgxIDYyM1Q1NTYgNTk0TDIyMCAzMjlMNDAyIDk2UTQxOCA3NSA0MzAgNjJUNDUyIDQyVDQ3MiAzMlQ0OTQgMjlRNDk1IDI5IDQ5NSAyNFQ0OTIgMTNUNDgxIDFUNDU2IC00WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTCIgZ2x5cGgtbmFtZT0iTCIgaG9yaXotYWR2LXg9IjUyMCIgZD0iTTE3OCA2MjdRMTg0IDY1MCAyMDMgNjUwSDIxMFEyMzMgNjUwIDIyOCA2MjRMMTA1IDQ2SDQxOVE0NDIgNDYgNDQyIDMzUTQ0MiAyNyA0NDAgMTlUNDMyIDVRNDI4IDAgNDEyIDBINDVMMTc4IDYyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9Ik0iIGdseXBoLW5hbWU9Ik0iIGhvcml6LWFkdi14PSI3NjkiIGQ9Ik0xNzYgNjE2UTE4NCA2NTAgMjE3IDY1MEgyMjhRMjQ3IDY1MCAyNTMgNjQxVDI2NCA2MTNMMzc4IDIyMUw2NjEgNjEzUTY3NiA2MzUgNjg1IDY0MlQ3MTIgNjUwSDcyNVE3NDIgNjUwIDc0OSA2NDBUNzUzIDYxNUw2MjIgMEg1NzVMNzAxIDU5M0w0MTkgMjA0UTQwOCAxODggMzk4IDE4MlQzNzIgMTc1UTM1MiAxNzUgMzQ1IDE4NFQzMzMgMjEwTDIxOSA1OTNMOTIgMEg0NUwxNzYgNjE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iTiIgZ2x5cGgtbmFtZT0iTiIgaG9yaXotYWR2LXg9IjcwNCIgZD0iTTE3NiA2MTZRMTg0IDY1MCAyMTEgNjUwSDIyNFEyMzYgNjUwIDI0MiA2NDNUMjU2IDYyMkw1MjcgNzNMNjUwIDY0N0g2OTZMNTY0IDI3UTU2MSAxMyA1NTMgNVQ1MzIgLTNINTI2UTUxNSAtMyA1MDkgNFQ0OTQgMjVMMjE3IDU4OEw5MSAwSDQ1TDE3NiA2MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJPIiBnbHlwaC1uYW1lPSJPIiBob3Jpei1hZHYteD0iNzYxIiBkPSJNMzYzIC0xMFEyOTggLTEwIDI0NiAxMVQxNTYgNjlUOTkgMTU4VDc5IDI2OVE3OSAzNTMgMTA4IDQyNFQxODcgNTQ3VDMwMSA2MjhUNDM1IDY1N1E1MDEgNjU3IDU1MyA2MzZUNjQyIDU3OFQ2OTkgNDg5VDcxOSAzNzhRNzE5IDI5NCA2ODkgMjIzVDYxMCAxMDFUNDk2IDIwVDM2MyAtMTBaTTM2OCAzNFE0MjUgMzQgNDc5IDU5VDU3NCAxMzBUNjQxIDIzOFQ2NjYgMzc1UTY2NiA0MjUgNjUwIDQ2OFQ2MDQgNTQ0VDUzMCA1OTVUNDMwIDYxNFEzNzMgNjE0IDMyMCA1ODlUMjI0IDUxN1QxNTcgNDA5VDEzMiAyNzNRMTMyIDIyMyAxNDggMTc5VDE5NCAxMDNUMjY4IDUzVDM2OCAzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IlAiIGdseXBoLW5hbWU9IlAiIGhvcml6LWFkdi14PSI1NzgiIGQ9Ik0xNzYgNjE2UTE4MSA2NDcgMjEyIDY0N0gzNTdRNDYzIDY0NyA1MTggNjA0VDU3MyA0ODBRNTczIDM3NCA1MDcgMzE1VDMxNiAyNTZIMTQ5TDk0IDBINDVMMTc2IDYxNlpNMzI1IDMwMFE0MTkgMzAwIDQ3MCAzNDZUNTIyIDQ3NFE1MjIgNTM3IDQ4MSA1NjlUMzU0IDYwMkgyMjNMMTU5IDMwMEgzMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJRIiBnbHlwaC1uYW1lPSJRIiBob3Jpei1hZHYteD0iNzcwIiBkPSJNMzYwIC0xMFEyOTQgLTEwIDI0MiAxMVQxNTQgNjlUOTggMTU3VDc5IDI2OVE3OSAzNTMgMTA5IDQyNFQxODggNTQ3VDMwMyA2MjhUNDM4IDY1N1E1MDQgNjU3IDU1NiA2MzZUNjQ0IDU3OFQ3MDAgNDkwVDcxOSAzNzhRNzE5IDI4NyA2ODUgMjEyVDU5MiA4NUw2MDEgNzRRNjIzIDQ2IDYzOCAzN1Q2NzEgMjVRNjcyIDI1IDY3MiAyMFQ2NzEgOFQ2NjIgLTNUNjQzIC05UTYyMiAtOSA2MDcgMlQ1NjcgNDVMNTU4IDU2UTUxNCAyNCA0NjQgN1QzNjAgLTEwWk0zNjUgMzRRNDEwIDM0IDQ1MSA0OFQ1MzAgOTBMNDA2IDI1MEw0NDEgMjc4TDU2MyAxMjFRNjEwIDE2NiA2MzggMjMxVDY2NiAzNzVRNjY2IDQyNSA2NTEgNDY4VDYwNSA1NDRUNTMyIDU5NVQ0MzMgNjE0UTM3NSA2MTQgMzIxIDU4OVQyMjQgNTE3VDE1NyA0MDlUMTMyIDI3M1ExMzIgMjIzIDE0OCAxNzlUMTk0IDEwM1QyNjcgNTNUMzY1IDM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgZ2x5cGgtbmFtZT0iUiIgaG9yaXotYWR2LXg9IjU5MyIgZD0iTTI5OSAyNzdMNDE4IDk3UTQzMCA3OCA0NDAgNjZUNDYwIDQ2VDQ4MSAzNVQ1MDggMzJRNTA5IDMyIDUwOSAyN1Q1MDcgMTRUNDk2IDJUNDcwIC00UTQ1OCAtNCA0NDggLTFUNDI2IDExVDQwMyAzNlQzNzQgNzhMMjQzIDI3N0gxNTRMOTQgMEg0NUwxNzYgNjE2UTE4MSA2NDcgMjEyIDY0N0gzNjZRNDcxIDY0NyA1MjUgNjA3VDU4MCA0OTBRNTgwIDM5MCA1MTYgMzM0VDMzNSAyNzdIMjk5Wk0zMzYgMzIwUTQzMiAzMjAgNDgwIDM2NVQ1MjggNDg1UTUyOCA1NDIgNDg2IDU3MlQzNjMgNjAzSDIyM0wxNjMgMzIwSDMzNloiICAvPgorPGdseXBoIHVuaWNvZGU9IlMiIGdseXBoLW5hbWU9IlMiIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik0yNjkgLTEwUTIwMCAtMTAgMTQ5IDExVDY5IDYxUTUyIDc4IDQyIDk2VDMyIDEzMVEzMiAxNDAgMzYgMTQ2VDQ3IDE1NVQ1OCAxNThUNjMgMTU4UTcyIDEzMiA4OSAxMTBUMTMyIDcwVDE5MyA0M1QyNzIgMzNRMzU2IDMzIDM5OCA2OVQ0NDAgMTY3UTQ0MCAxOTUgNDI4IDIxNVQzOTYgMjUxVDM0OCAyNzlUMjg5IDMwNVEyNTcgMzE4IDIyNyAzMzJUMTc0IDM2N1QxMzYgNDE1VDEyMSA0ODJRMTIxIDUxOSAxMzYgNTUxVDE3OCA2MDZUMjQ1IDY0M1QzMzQgNjU3UTQwMSA2NTcgNDQ2IDYzOFQ1MTYgNTk0UTUzMiA1NzggNTQwIDU2MlQ1NDggNTMyUTU0OCA1MjMgNTQ0IDUxN1Q1MzQgNTA4VDUyMyA1MDVUNTE3IDUwNVE1MDkgNTI3IDQ5NCA1NDdUNDU1IDU4MlQ0MDIgNjA1VDMzMiA2MTRRMjk2IDYxNCAyNjcgNjA1VDIxNiA1NzhUMTg0IDUzN1QxNzIgNDg3UTE3MiA0NTggMTgzIDQzN1QyMTUgNDAwVDI2MyAzNzFUMzI0IDM0NVEzNTUgMzMyIDM4NSAzMThUNDM4IDI4NFQ0NzYgMjM3VDQ5MCAxNzJRNDkwIDkxIDQzMyA0MVQyNjkgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVCIgZ2x5cGgtbmFtZT0iVCIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTM1NSA2MDJIMTQ0UTEyMSA2MDIgMTIxIDYxNFExMjEgNjIwIDEyMyA2MjhUMTMxIDY0MlExMzUgNjQ3IDE1MSA2NDdINjI0UTY0NyA2NDcgNjQ3IDYzNVE2NDcgNjI5IDY0NSA2MjFUNjM3IDYwN1E2MzUgNjAzIDYzMCA2MDNUNjE3IDYwMkg0MDVMMjc3IDBIMjI3TDM1NSA2MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJVIiBnbHlwaC1uYW1lPSJVIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNMzE5IC0xMFEyNTUgLTEwIDIwNiA4VDEyOCA2MlQ4OSAxNTJUOTUgMjgwTDE2OSA2MjdRMTcyIDYzOSAxNzcgNjQ0VDE5NCA2NTBIMjAxUTIyNCA2NTAgMjE4IDYyNEwxNDUgMjc2UTExOSAxNTMgMTY2IDk0VDMyMiAzNVE0MDYgMzUgNDU4IDg2VDUzMSAyMzlMNjE0IDYyN1E2MTggNjUwIDYzOSA2NTBINjQ1UTY2OCA2NTAgNjYyIDYyNEw1NzkgMjI5UTU1MyAxMTEgNDg5IDUxVDMxOSAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJWIiBnbHlwaC1uYW1lPSJWIiBob3Jpei1hZHYteD0iNjI1IiBkPSJNMTE4IDYzNVExMTggNjM4IDEyNSA2NDNUMTQxIDY0OVQxNjAgNjQ2VDE3MiA2MjJMMjgxIDUzTDYyNyA2NTBRNjI4IDY1MCA2MzYgNjUwVDY1MiA2NDVUNjYxIDYyNlQ2NDggNTg4TDMwMCAwSDI0NEwxMTggNjM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVyIgZ2x5cGgtbmFtZT0iVyIgaG9yaXotYWR2LXg9IjkxMCIgZD0iTTE1NCA2NDBRMTU0IDY0MyAxNjIgNjQ3VDE3OSA2NTFUMTk3IDY0NFQyMDUgNjE5TDIyMSA0NUw0NzYgNTIxUTQ4MyA1MzUgNDkxIDU0MVQ1MTcgNTQ3UTUzOCA1NDcgNTQ1IDUzOFQ1NTUgNTEzTDYxMSA0Nkw4NzkgNjQ4UTg3OSA2NDkgODg4IDY0OVQ5MDUgNjQ2VDkxNSA2MjhUOTA1IDU4OEw2MzggMlE2MzggMSA2MzMgMVQ2MjIgMFQ2MTEgMFQ2MDYgMFE2MDUgMCA2MDAgMFQ1ODggMFQ1NzYgMFQ1NzAgMkw1MTIgNDk3TDI0MyAwSDE3OEwxNTQgNjQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWCIgZ2x5cGgtbmFtZT0iWCIgaG9yaXotYWR2LXg9IjU5NSIgZD0iTTQ5NyAtOVE0NjkgLTkgNDQ5IDEyVDQwNiA4M0wzMDcgMjkxTDIxIC05UTIxIC05IDEzIC03VC0yIDJULTggMjBUMTEgNTBMMjg1IDMyOUwxNDAgNjQ3SDE5NEwzMjIgMzU3TDYwNiA2NTZRNjA3IDY1NiA2MTUgNjU0VDYyOSA2NDVUNjM1IDYyN1Q2MTYgNTk3TDM0NSAzMTlMNDQ4IDEwNVE0NTkgODEgNDY4IDY3VDQ4OCA0NVQ1MDkgMzVUNTM0IDMzUTUzNSAzMyA1MzUgMjdUNTMzIDEyVDUyMiAtMlQ0OTcgLTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJZIiBnbHlwaC1uYW1lPSJZIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNMjcxIDI3OUwxMDggNjQ3SDE2MkwzMDMgMzIyTDU4NCA2NTFRNTg1IDY1MiA1OTMgNjUwVDYwOCA2NDJUNjE0IDYyMlQ1OTMgNTg2TDMyMCAyNzRMMjYyIDBIMjEyTDI3MSAyNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJaIiBnbHlwaC1uYW1lPSJaIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNNyAzNEw5IDQ0TDU0MiA2MDJIMTY1UTEzNiA2MDIgMTM2IDYyMFExMzYgNjI4IDE0MSA2MzdUMTQ3IDY0N0g2MTdMNjEwIDYxM0w2MDggNjAzTDc0IDQ2SDQ3MVE1MDAgNDYgNTAwIDI3UTUwMCAxOSA0OTUgMTBUNDg4IDBIMEw3IDM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWyIgZ2x5cGgtbmFtZT0iYnJhY2tldGxlZnQiIGhvcml6LWFkdi14PSIzNTYiIGQ9Ik0xODkgNjQ3SDM3NVEzOTcgNjQ3IDM5NyA2MzVRMzk3IDYzMCAzOTUgNjIyVDM4OCA2MDlRMzgzIDYwNCAzNjkgNjA0SDIyNUw2NSAtMTQ5SDIwNlEyMjggLTE0OSAyMjggLTE2MVEyMjggLTE2NyAyMjYgLTE3NVQyMTkgLTE4OFEyMTIgLTE5MyAyMDAgLTE5M0gxMEwxODkgNjQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgZ2x5cGgtbmFtZT0iYmFja3NsYXNoIiBob3Jpei1hZHYteD0iMzUxIiBkPSJNMTE0IDY0N0gxNjJMMjQwIC0xOTNIMTkyTDExNCA2NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJdIiBnbHlwaC1uYW1lPSJicmFja2V0cmlnaHQiIGhvcml6LWFkdi14PSIzNTYiIGQ9Ik0xNjMgLTE5M0gtMjNRLTQ1IC0xOTMgLTQ1IC0xODFRLTQ1IC0xNzYgLTQzIC0xNjhULTM2IC0xNTVRLTMwIC0xNDkgLTE3IC0xNDlIMTI3TDI4NyA2MDRIMTQ2UTEyNCA2MDQgMTI0IDYxNVExMjQgNjIxIDEyNiA2MjlUMTMzIDY0MlExMzggNjQ3IDE1MiA2NDdIMzQyTDE2MyAtMTkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXiIgZ2x5cGgtbmFtZT0iYXNjaWljaXJjdW0iIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yMTEgNDUwUTE5NyA0NTAgMTk3IDQ2M1ExOTcgNDc1IDIxMiA0OTNUMjYzIDU0NFEyOTggNTc2IDMyMSA1OTJUMzQ2IDYwOVEzNDggNjA5IDM2MyA1OTNUMzk5IDU0NlE0MjIgNTEyIDQyOSA0OTZUNDM3IDQ3MVE0MzcgNDYxIDQzMiA0NTZUNDE5IDQ1MFE0MDkgNDUwIDM5OSA0NjJUMzY5IDUxM0wzNDAgNTY2UTMyNiA1NTIgMzE2IDU0MFQyODggNTExUTI1NiA0NzggMjM5IDQ2NFQyMTEgNDUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXyIgZ2x5cGgtbmFtZT0idW5kZXJzY29yZSIgaG9yaXotYWR2LXg9IjQ4NiIgZD0iTS0zIC00NlEtMjYgLTQ2IC0yNiAtMzNRLTI2IC0yOCAtMjQgLTE5VC0xNyAtNlEtMTIgMCAzIDBIMzc5UTQwMiAwIDQwMiAtMTNRNDAyIC0xOCA0MDAgLTI2VDM5MyAtNDBRMzg3IC00NiAzNzMgLTQ2SC0zWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgZ2x5cGgtbmFtZT0iZ3JhdmUiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik00MDIgNTQ3UTQwMCA1NDUgMzg5IDU0OFQzNTkgNTYxVDMxNyA1ODRUMjcwIDYxOVEyNTAgNjM2IDI0NCA2NDVUMjM4IDY2NVEyMzggNjc0IDI0NSA2ODBUMjYxIDY4NlEyNjkgNjg2IDI3OSA2ODFUMzA0IDY2MVEzMjggNjQxIDM0NiA2MjFUMzc4IDU4NVQzOTcgNTU5VDQwMiA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJhIiBnbHlwaC1uYW1lPSJhIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMloiICAvPgorPGdseXBoIHVuaWNvZGU9ImIiIGdseXBoLW5hbWU9ImIiIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik0yOTAgLTEwUTI1NCAtMTAgMjI1IDBUMTcyIDI2VDEzMiA2NVQxMDcgMTEyTDkzIDQ2UTg3IDE5IDc4IDhUNTUgLTNRNDcgLTMgNDIgLTFUMzYgM0wxNzkgNjc0SDIyN0wxNjQgMzgyUTE5NiA0MjggMjQxIDQ1NVQzNDYgNDgzUTM4NiA0ODMgNDIyIDQ3MFQ0ODUgNDI5VDUyOSAzNjNUNTQ1IDI3M1E1NDUgMjE5IDUyNiAxNjhUNDc0IDc4VDM5MyAxNFQyOTAgLTEwWk0yOTMgMzJRMzQwIDMyIDM3OCA1MlQ0NDIgMTA3VDQ4MyAxODRUNDk3IDI3M1E0OTcgMzEyIDQ4NSAzNDNUNDUxIDM5NlQ0MDIgNDI5VDM0MSA0NDFRMzA5IDQ0MSAyODAgNDMxVDIyNyA0MDRUMTgzIDM2M1QxNTAgMzEyTDEyOSAyMThRMTIzIDE4NCAxMzEgMTUxVDE2MCA5MlQyMTQgNDlUMjkzIDMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgZ2x5cGgtbmFtZT0iYyIgZD0iTTI3MyAtMTBRMjI3IC0xMCAxODcgNFQxMTcgNDZUNzAgMTE0VDUzIDIwNlE1MyAyNjAgNzMgMzEwVDEyOCAzOThUMjEyIDQ2MFQzMTYgNDgzUTM3NCA0ODMgNDEyIDQ2NlQ0NzQgNDI0UTQ5NSA0MDMgNTA0IDM4MFQ1MTQgMzQxUTUxNCAzMzAgNTA5IDMyNFQ0OTcgMzE0VDQ4NSAzMTFUNDc4IDMxM1E0NzQgMzM5IDQ2MiAzNjJUNDMwIDQwMlQzODEgNDMwVDMxNyA0NDBRMjcwIDQ0MCAyMzEgNDIxVDE2MyAzNjlUMTE4IDI5NVQxMDIgMjA5UTEwMiAxNjggMTE1IDEzNlQxNTEgODFUMjA2IDQ2VDI3NyAzM1EzMzYgMzMgMzc1IDYxVDQzNyAxMjdRNDM4IDEyOCA0NDIgMTI3VDQ1MiAxMjRUNDYxIDExNlQ0NjUgMTA0UTQ2NSA4NCA0MzQgNTJRNDEwIDI5IDM2OSAxMFQyNzMgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZCIgZ2x5cGgtbmFtZT0iZCIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTQ5NiAtN1E0NjIgLTcgNDQ0IDE3VDQzNiA5MFE0MDMgNDIgMzU5IDE2VDI1NSAtMTBRMjE1IC0xMCAxNzkgNFQxMTYgNDRUNzMgMTEwVDU3IDIwMFE1NyAyNTQgNzUgMzA1VDEyOCAzOTVUMjA5IDQ1OVQzMTIgNDgzUTM4MiA0ODMgNDI4IDQ0OVQ0OTUgMzY1TDU2MSA2NzRINjA5TDQ4NSA5NVE0NzYgNTQgNDg4IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNjEgMzJRMjk4IDMyIDMzMSA0NlQzOTEgODNUNDM2IDEzOFQ0NjEgMjA1TDQ4MSAyOTZRNDY3IDM1OSA0MjQgNDAwVDMwOSA0NDFRMjYyIDQ0MSAyMjQgNDIxVDE2MCAzNjZUMTE5IDI4OVQxMDUgMjAwUTEwNSAxNjEgMTE3IDEzMFQxNTEgNzdUMjAwIDQ0VDI2MSAzMloiICAvPgorPGdseXBoIHVuaWNvZGU9ImUiIGdseXBoLW5hbWU9ImUiIGhvcml6LWFkdi14PSI1MzkiIGQ9Ik0yNTQgLTEwUTIwNCAtMTAgMTY3IDRUMTAzIDQzVDY0IDEwNFQ1MSAxODFRNTEgMjQ0IDczIDI5OVQxMzYgMzk1VDIyOSA0NTlUMzQ2IDQ4M1E0MjQgNDgzIDQ2NyA0NDlUNTEwIDM2NFE1MTAgMzMyIDQ5OCAzMDZUNDU0IDI2MFQzNjkgMjMxVDIzNSAyMjBRMjA2IDIyMCAxNzQgMjIxVDEwMyAyMjdRMTAwIDIwNiAxMDAgMTg0UTEwMCAxMTYgMTM5IDc0VDI1NiAzMVEzMTQgMzEgMzU0IDUyVDQyMiAxMTNRNDIzIDExNCA0MjcgMTEzVDQzNSAxMDlUNDQzIDEwMVQ0NDcgOTBRNDQ3IDgxIDQ0MyA3M1Q0MjQgNTFRMzk0IDIwIDM1MyA1VDI1NCAtMTBaTTM0MyA0NDFRMzAyIDQ0MSAyNjYgNDI4VDIwMCAzOTFUMTQ4IDMzN1QxMTMgMjY4UTE0NyAyNjMgMTc2IDI2MlQyMzEgMjYwUTMwMCAyNjAgMzQ0IDI2OVQ0MTUgMjkyVDQ1MSAzMjRUNDYxIDM2M1E0NjEgMzkyIDQzMiA0MTZUMzQzIDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImYiIGdseXBoLW5hbWU9ImYiIGhvcml6LWFkdi14PSIzNDUiIGQ9Ik03OSAwTDE3MCA0MzBINzNMODEgNDczSDE3OUwxOTIgNTMxUTIwNiA2MDAgMjQxIDY0MlQzMzkgNjg1UTM2OCA2ODUgMzg3IDY3OFQ0MTkgNjU4UTQzMSA2NDYgNDMxIDYzMVE0MzEgNjE4IDQyMyA2MTFUNDEyIDYwNlE0MDMgNjIyIDM4MyA2MzJUMzM2IDY0M1EyOTMgNjQzIDI3MSA2MTFUMjM3IDUyNEwyMjUgNDczSDM1MUwzNDIgNDMwSDIxN0wxMjYgMEg3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImciIGdseXBoLW5hbWU9ImciIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik0yMjUgLTE5N1ExNjIgLTE5NyAxMjAgLTE4MFQ1MyAtMTM3UTM0IC0xMTggMjcgLTEwMVQxOSAtNzJRMTkgLTYwIDI0IC01M1QzNSAtNDJUNDcgLTM4VDU0IC0zOFE2NiAtODYgMTA3IC0xMTlUMjI5IC0xNTNRMzgzIC0xNTMgNDE5IDE4TDQzOCAxMDVRNDA3IDU5IDM2MSAzMlQyNTQgNVEyMTUgNSAxODAgMThUMTE2IDU4VDcyIDEyM1Q1NSAyMTJRNTUgMjY0IDc0IDMxMlQxMjkgMzk5VDIxMSA0NjBUMzE1IDQ4M1EzNTAgNDgzIDM3OSA0NzRUNDMxIDQ0OFQ0NzAgNDExVDQ5NCAzNjZMNTE4IDQ3M0g1NjRMNDY3IDE0UTQ0NSAtODggMzg2IC0xNDJUMjI1IC0xOTdaTTI2MCA0N1EyOTcgNDcgMzMwIDYwVDM5MCA5NVQ0MzUgMTQ3VDQ2MSAyMTFMNDgwIDI5OFE0NjkgMzYxIDQyNSA0MDFUMzEyIDQ0MVEyNjYgNDQxIDIyOCA0MjJUMTYyIDM3MFQxMTkgMjk2VDEwNCAyMTJRMTA0IDE3MyAxMTcgMTQzVDE1MSA5MVQyMDEgNTlUMjYwIDQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaCIgZ2x5cGgtbmFtZT0iaCIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTE3NSA2NTRRMTc5IDY3NiAxOTkgNjc2SDIwNlEyMTcgNjc2IDIyMCA2NjlUMjIyIDY0OUwxNjMgMzc4UTE5MiA0MjYgMjM3IDQ1NFQzMzkgNDgzUTQxNCA0ODMgNDU3IDQ0MFQ1MDEgMzI2UTUwMSAyOTkgNDkzIDI2MVQ0NzMgMTc1UTQ2MiAxMzYgNDU2IDEwOFQ0NTAgNjZRNDUwIDQzIDQ2MiAzNlQ0OTQgMjZRNDk1IDI2IDQ5NSAyMVQ0OTIgMTBUNDgyIC0yVDQ2MiAtN1E0MzYgLTcgNDE5IDEwVDQwMiA1OVE0MDIgNzkgNDA4IDExMFQ0MjYgMTgxUTQzOCAyMjYgNDQ1IDI2MFQ0NTIgMzE4UTQ1MiAzNzUgNDIxIDQwNlQzMzMgNDM4UTI3MCA0MzggMjI3IDQwNVQxNTAgMzEzTDgzIDBIMzVMMTc1IDY1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImkiIGdseXBoLW5hbWU9ImkiIGhvcml6LWFkdi14PSIyMzAiIGQ9Ik0yMDAgNjAxUTE2NiA2MDEgMTY2IDYyN1ExNjYgNjQzIDE3NSA2NTVUMjAxIDY2N1EyMzUgNjY3IDIzNSA2NDFRMjM1IDYyNSAyMjYgNjEzVDIwMCA2MDFaTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxNDIgNDczSDE4OUwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1oiICAvPgorPGdseXBoIHVuaWNvZGU9ImoiIGdseXBoLW5hbWU9ImoiIGhvcml6LWFkdi14PSIyMzAiIGQ9Ik0yMDAgNjAxUTE2NiA2MDEgMTY2IDYyN1ExNjYgNjQzIDE3NSA2NTVUMjAxIDY2N1EyMzUgNjY3IDIzNSA2NDFRMjM1IDYyNSAyMjYgNjEzVDIwMCA2MDFaTS01OCAtMTk5US04OCAtMTk5IC0xMDcgLTE5MVQtMTM3IC0xNzNRLTE0OCAtMTYyIC0xNDggLTE1MVEtMTQ4IC0xMzcgLTEzOSAtMTI4VC0xMjggLTEyMVEtMTE3IC0xMzUgLTk5IC0xNDVULTU2IC0xNTZRLTI1IC0xNTYgLTUgLTEzNlQyNyAtNjVMMTQyIDQ3M0gxODlMNzMgLTczUTU5IC0xMzkgMjUgLTE2OVQtNTggLTE5OVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImsiIGdseXBoLW5hbWU9ImsiIGhvcml6LWFkdi14PSI0NjEiIGQ9Ik0zNjMgLTdRMzUwIC03IDM0MCAtNFQzMTggOVQyOTIgMzZUMjU4IDgzTDEzNiAyNDZMODMgMEgzNUwxNzkgNjc0SDIyN0wxMzggMjU3TDQzMyA0ODJRNDM0IDQ4MyA0NDEgNDgwVDQ1MyA0NjlUNDU0IDQ1MFQ0MzAgNDIyTDE5MCAyNDRMMzA0IDk3UTMyMCA3NCAzMzEgNjJUMzUzIDQzVDM3NSAzNlQ0MDEgMzRRNDAxIDM0IDQwMSAyOFQzOTkgMTRUMzg4IDBUMzYzIC03WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgZ2x5cGgtbmFtZT0ibCIgaG9yaXotYWR2LXg9IjIzMCIgZD0iTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxODUgNjc0SDIzMkwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1oiICAvPgorPGdseXBoIHVuaWNvZGU9Im0iIGdseXBoLW5hbWU9Im0iIGhvcml6LWFkdi14PSI4OTAiIGQ9Ik03ODQgLTdRNzU3IC03IDc0MSAxMFQ3MjQgNTlRNzI0IDc5IDczMCAxMTBUNzQ4IDE4MVE3NjAgMjMwIDc2NyAyNjNUNzc0IDMyMFE3NzQgMzc2IDc0NCA0MDdUNjY0IDQzOFE2MDMgNDM4IDU2MiA0MDhUNDg4IDMyMEw0MjAgMEgzNzJMNDMyIDI4MlE0MzkgMzE2IDQzNSAzNDVUNDE2IDM5NFQzNzkgNDI2VDMyOCA0MzhRMjY5IDQzOCAyMjggNDA5VDE1MiAzMjNMODMgMEgzNUwxMzcgNDczUTEzNyA0NzYgMTQ3IDQ3NlExNjEgNDc2IDE3MCA0NjZUMTczIDQyNEwxNjYgMzg5UTE5NyA0MzQgMjQwIDQ1OFQzMzQgNDgzUTM5MSA0ODMgNDMwIDQ1MlQ0NzkgMzY4UTUwOCA0MTggNTU1IDQ1MFQ2NzAgNDgzUTcwNCA0ODMgNzMyIDQ3MlQ3ODAgNDQwVDgxMiAzOTFUODI0IDMyOFE4MjQgMzAyIDgxNiAyNjRUNzk0IDE3NVE3ODMgMTM2IDc3NyAxMDhUNzcxIDY2UTc3MSA0MyA3ODMgMzZUODE2IDI2UTgxNiAyNiA4MTYgMjFUODE0IDEwVDgwNCAtMlQ3ODQgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJuIiBnbHlwaC1uYW1lPSJuIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNNDYyIC03UTQzNiAtNyA0MTkgMTBUNDAyIDU5UTQwMiA3OSA0MDggMTEwVDQyNiAxODFRNDM4IDIyNiA0NDUgMjYwVDQ1MiAzMThRNDUyIDM3NSA0MjEgNDA2VDMzMyA0MzhRMjcwIDQzOCAyMjcgNDA1VDE1MCAzMTNMODMgMEgzNUwxMzcgNDczUTEzNyA0NzYgMTQ3IDQ3NlExNjEgNDc2IDE3MCA0NjZUMTczIDQyNEwxNjMgMzc5UTE5MyA0MjcgMjM3IDQ1NVQzMzkgNDgzUTQxNCA0ODMgNDU3IDQ0MFQ1MDEgMzI2UTUwMSAyOTkgNDkzIDI2MVQ0NzMgMTc1UTQ2MiAxMzYgNDU2IDEwOFQ0NTAgNjZRNDUwIDQzIDQ2MiAzNlQ0OTQgMjZRNDk1IDI2IDQ5NSAyMVQ0OTIgMTBUNDgyIC0yVDQ2MiAtN1oiICAvPgorPGdseXBoIHVuaWNvZGU9Im8iIGdseXBoLW5hbWU9Im8iIGhvcml6LWFkdi14PSI1ODciIGQ9Ik0yNzAgLTEwUTIyNCAtMTAgMTg1IDZUMTE2IDUxVDcxIDExOVQ1NCAyMDdRNTQgMjYzIDc0IDMxM1QxMzAgNDAxVDIxNCA0NjFUMzE4IDQ4M1EzNjQgNDgzIDQwMyA0NjdUNDcyIDQyMlQ1MTcgMzU0VDUzNCAyNjZRNTM0IDIxMCA1MTQgMTYwVDQ1NyA3MlQzNzMgMTJUMjcwIC0xMFpNMjczIDMyUTMxNiAzMiAzNTQgNTBUNDIyIDEwMFQ0NjggMTc0VDQ4NSAyNjVRNDg1IDMwMyA0NzMgMzM1VDQzOCAzOTBUMzg0IDQyN1QzMTUgNDQxUTI3MiA0NDEgMjM0IDQyM1QxNjYgMzczVDExOSAyOTlUMTAyIDIwOFExMDIgMTcwIDExNSAxMzhUMTUwIDgzVDIwNCA0NlQyNzMgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJwIiBnbHlwaC1uYW1lPSJwIiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMTM3IDQ3M1ExMzcgNDc2IDE0NyA0NzZRMTYxIDQ3NiAxNzAgNDY2VDE3MyA0MjRMMTY0IDM4MlExOTYgNDI4IDI0MSA0NTVUMzQ2IDQ4M1EzODYgNDgzIDQyMiA0NzBUNDg1IDQyOVQ1MjkgMzYzVDU0NSAyNzNRNTQ1IDIxOSA1MjYgMTY4VDQ3NCA3OFQzOTMgMTRUMjkwIC0xMFEyNTMgLTEwIDIyMyAwVDE2OSAyOFQxMzAgNjdUMTA3IDExMkw0MyAtMTkwSC01TDEzNyA0NzNaTTI5MyAzMlEzNDAgMzIgMzc4IDUyVDQ0MiAxMDdUNDgzIDE4NFQ0OTcgMjczUTQ5NyAzMTIgNDg1IDM0M1Q0NTEgMzk2VDQwMiA0MjlUMzQxIDQ0MVEzMDkgNDQxIDI4MCA0MzFUMjI3IDQwNFQxODMgMzYzVDE1MCAzMTJMMTI5IDIxOFExMjMgMTg0IDEzMSAxNTFUMTYwIDkyVDIxNCA0OVQyOTMgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJxIiBnbHlwaC1uYW1lPSJxIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDM3IDkxUTQwNSA0NSAzNjAgMThUMjU1IC0xMFEyMTUgLTEwIDE3OSA0VDExNiA0NFQ3MyAxMTBUNTcgMjAwUTU3IDI1NCA3NSAzMDVUMTI4IDM5NVQyMDkgNDU5VDMxMiA0ODNRMzQ3IDQ4MyAzNzYgNDc0VDQyOSA0NDlUNDY5IDQxM1Q0OTYgMzY4TDUwOCA0MjZRNTE0IDQ1NCA1MjMgNDY1VDU0NyA0NzZRNTU1IDQ3NiA1NjAgNDc0VDU2NSA0NzBMNDI0IC0xOTBIMzc3TDQzNyA5MVpNMjYxIDMyUTI5OCAzMiAzMzEgNDZUMzkxIDgzVDQzNiAxMzhUNDYxIDIwNUw0ODEgMjk2UTQ2NyAzNTkgNDI3IDQwMFQzMDkgNDQxUTI2MiA0NDEgMjI0IDQyMVQxNjAgMzY2VDExOSAyODlUMTA1IDIwMFExMDUgMTYxIDExNyAxMzBUMTUxIDc3VDIwMCA0NFQyNjEgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJyIiBnbHlwaC1uYW1lPSJyIiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMTM3IDQ3M1ExMzcgNDc2IDE0NyA0NzZRMTYxIDQ3NiAxNzAgNDY2VDE3MyA0MjRMMTYzIDM3NVExODkgNDMxIDIyMyA0NTdUMzAyIDQ4M1EzMzEgNDgzIDM1MSA0NzFUMzcyIDQ0MlEzNzIgNDI1IDM2MyA0MThUMzUyIDQxMVEzNDMgNDIyIDMyOCA0MzBUMjg5IDQzOFEyNjAgNDM4IDIzNSA0MjJUMTkwIDM3NlQxNTUgMzA0VDEyOCAyMDlMODQgMEgzNkwxMzcgNDczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icyIgZ2x5cGgtbmFtZT0icyIgaG9yaXotYWR2LXg9IjQ3NSIgZD0iTTIxOCAtMTBRMTYxIC0xMCAxMTcgN1Q0NyA1MVEzNiA2MiAyOSA3M1QyMiA5NFEyMiAxMDIgMjYgMTA3VDM0IDExNlQ0MyAxMjFUNDkgMTIyUTY4IDg1IDExMiA1OFQyMjEgMzBRMjg0IDMwIDMxOCA1NVQzNTIgMTIyUTM1MiAxNDEgMzQzIDE1NFQzMTggMTc3VDI3OSAxOTZUMjMwIDIxNFEyMDMgMjIzIDE3NyAyMzNUMTMxIDI1OVQ5OCAyOTVUODUgMzQ4UTg1IDM3NiA5NyA0MDFUMTMyIDQ0NFQxODYgNDcyVDI1NyA0ODNRMzExIDQ4MyAzNTEgNDY3VDQxNSA0MjdRNDM4IDQwMiA0MzggMzgzUTQzOCAzNzUgNDM0IDM3MFQ0MjUgMzYxVDQxNiAzNTdUNDEwIDM1OFEzOTMgMzk1IDM1MSA0MTlUMjUzIDQ0M1EyMjMgNDQzIDIwMSA0MzZUMTYzIDQxNlQxNDAgMzg3VDEzMiAzNTRRMTMyIDMzNCAxNDIgMzE5VDE2OSAyOTNUMjA5IDI3M1QyNTggMjU0UTI4NCAyNDUgMzA5IDIzNVQzNTQgMjEwVDM4NiAxNzZUMzk4IDEyN1EzOTggNjUgMzUxIDI4VDIxOCAtMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ0IiBnbHlwaC1uYW1lPSJ0IiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMjAzIC0xMFExMzkgLTEwIDEwOSAzMVQ5NSAxNTZMMTUzIDQzMEg3N0w4NSA0NzNIMTYyTDE3NiA1MzlRMTgxIDU2NyAxOTAgNTc4VDIxNSA1ODlRMjIyIDU4OSAyMjcgNTg3VDIzMyA1ODNMMjEwIDQ3M0gzNjJMMzUzIDQzMEgyMDFMMTQyIDE1NlExMjggOTAgMTQ2IDYxVDIxMCAzMVEyMzIgMzEgMjUwIDQwVDI3OCA2M1EyODAgNjQgMjg1IDU4VDI5MCA0MFEyOTAgMjcgMjc4IDE1UTI1MyAtMTAgMjAzIC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InUiIGdseXBoLW5hbWU9InUiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik00NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhUNzIgMTE4VDc2IDIxMkwxMzEgNDczSDE3OUwxMjMgMjA5UTEwNSAxMjUgMTM5IDgwVDI0MSAzNVEzMDAgMzUgMzQxIDY1VDQxOCAxNTVMNDg1IDQ3M0g1MzNMNDUzIDk1UTQ0NCA1NCA0NTYgNDFUNDk2IDI3UTQ5NiAyNyA0OTYgMjJUNDk0IDEwVDQ4NCAtMVQ0NjMgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ2IiBnbHlwaC1uYW1lPSJ2IiBob3Jpei1hZHYteD0iNDg4IiBkPSJNMTE0IDM0M1ExMDYgMzk5IDg5IDQxOVQ0MCA0MzhRNDAgNDM4IDQwIDQ0NFQ0MSA0NTdUNTEgNDcxVDczIDQ3N1ExMDIgNDc3IDEyMiA0NTdRMTM3IDQ0MiAxNDYgNDEzVDE2MSAzMzlMMjAwIDQ4TDQ2MSA0NzVRNDYyIDQ3NiA0NzAgNDc2VDQ4NSA0NzBUNDkzIDQ1MlQ0ODAgNDE4TDIxOSAwSDE2MkwxMTQgMzQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgZ2x5cGgtbmFtZT0idyIgaG9yaXotYWR2LXg9IjcxMyIgZD0iTTEyNiAzNDFRMTI2IDM3MSAxMjIgMzkwVDEwOSA0MjBUODggNDM1VDYwIDQ0MFE1OSA0NDAgNTkgNDQ2VDYxIDQ1OFQ3MyA0NzFUOTcgNDc3UTEyNCA0NzcgMTQyIDQ1OVExNzMgNDI4IDE3MiAzMzhMMTY5IDUwTDM0MyAzNzJRMzUyIDM5MCAzNjIgMzk1VDM4NyA0MDBRNDIxIDQwMCA0MjUgMzYzTDQ1OSA1MEw2NjMgNDc1UTY2MyA0NzYgNjcxIDQ3NlQ2ODYgNDcxVDY5NiA0NTRUNjg3IDQxOEw0ODIgMEg0MjJMMzc5IDM0MkwxOTAgMEgxMjVMMTI2IDM0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IngiIGdseXBoLW5hbWU9IngiIGhvcml6LWFkdi14PSI0ODkiIGQ9Ik0zOTMgLTRRMzc4IC00IDM2NSAwVDM0MCAxN1QzMTQgNTBUMjg0IDEwNEwyMzQgMjAwTDI5IC03UTI4IC03IDIwIC01VDcgNFQzIDIzVDI0IDUzTDIxMCAyMzZMODggNDczSDE0NEwyNDUgMjYzTDQ2MCA0ODBRNDYxIDQ4MCA0NjkgNDc4VDQ4MiA0NjlUNDg2IDQ1MFQ0NjUgNDIwTDI2OSAyMjdMMzMyIDEwOVEzNDUgODUgMzU1IDcxVDM3NyA0OVQ0MDAgMzlUNDI5IDM3UTQyOSAzNyA0MjkgMzFUNDI4IDE3VDQxNyAzVDM5MyAtNFoiICAvPgorPGdseXBoIHVuaWNvZGU9InkiIGdseXBoLW5hbWU9InkiIGhvcml6LWFkdi14PSI0ODciIGQ9Ik0zIC0yMDBRLTQzIC0yMDAgLTY0IC0xNzdRLTczIC0xNjggLTczIC0xNTZRLTczIC0xNDQgLTY0IC0xMzdULTUzIC0xMzFRLTQ0IC0xNDIgLTI5IC0xNDlUMCAtMTU2UTE0IC0xNTYgMjggLTE1MVQ1OCAtMTMyVDkzIC05NVQxMzggLTM0TDE3OCAyNlExNTUgMjkgMTUyIDU4TDExMyAzNDNRMTA1IDM5NiA4OCA0MTdUMzkgNDM4UTM5IDQzOCAzOSA0NDRUNDEgNDU3VDUxIDQ3MVQ3NiA0NzdRMTAxIDQ3NyAxMTggNDU5UTEzMyA0NDQgMTQ0IDQxNVQxNjAgMzM5TDE5NiA1Mkw0NTkgNDczUTQ1OSA0NzMgNDY3IDQ3M1Q0ODUgNDczVDUwMiA0NzJUNTEwIDQ3MUwxODQgLTQ0UTE1NSAtOTEgMTMyIC0xMjFUODcgLTE2OFQ0NiAtMTkzVDMgLTIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InoiIGdseXBoLW5hbWU9InoiIGhvcml6LWFkdi14PSI0OTQiIGQ9Ik03IDM3TDQxOCA0MzJIMTI5UTEwMyA0MzIgMTAzIDQ0OVExMDMgNDU2IDEwNyA0NjRUMTEzIDQ3M0g0ODBWNDM3TDY4IDQxSDM2OFEzOTQgNDEgMzk0IDI0UTM5NCAxNyAzOTAgOVQzODQgMEg3VjM3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieyIgZ2x5cGgtbmFtZT0iYnJhY2VsZWZ0IiBob3Jpei1hZHYteD0iNDI4IiBkPSJNMjc5IC0xOTdRMjYyIC0xOTcgMjQyIC0xODdUMTk5IC0xNTNRMTUyIC0xMDUgMTM1IC0yOVQxMzEgMTM4TDY2IDE4OFE0OSAyMDEgNDQgMjEwVDQzIDIzOFE0NCAyNDYgNDYgMjUxVDUyIDI2MVQ2NCAyNzBUODUgMjgwTDE2OCAzMThRMTc5IDM2NiAxOTMgNDA0VDIyMiA0NzNUMjU1IDUyNlQyOTIgNTY4UTMzOCA2MTQgMzgxIDYzMlQ0NTAgNjUxUTQ2MSA2NTEgNDY2IDY0NlQ0NzIgNjMzVDQ3MCA2MTlUNDYzIDYxMFE0MjYgNjA0IDM4OCA1ODVUMzIxIDUzNlEyODIgNDk2IDI1NiA0MzZUMjEwIDI4OEw4NCAyMzRMMTgzIDE1OFExNTEgLTM4IDIzMiAtMTIwUTI0OSAtMTM2IDI2NCAtMTQ1VDI5OSAtMTYwUTMwMSAtMTYxIDMwMiAtMTY3VDMwMyAtMTc5VDI5NyAtMTkxVDI3OSAtMTk3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifCIgZ2x5cGgtbmFtZT0iYmFyIiBob3Jpei1hZHYteD0iMjY0IiBkPSJNMzkgLTE5M1ExNiAtMTkzIDIyIC0xNjdMMTkxIDYyN1ExOTUgNjUwIDIxNyA2NTBIMjIyUTI0NCA2NTAgMjM4IDYyNEw2OSAtMTcwUTY1IC0xOTMgNDMgLTE5M0gzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9In0iIGdseXBoLW5hbWU9ImJyYWNlcmlnaHQiIGhvcml6LWFkdi14PSI0MjgiIGQ9Ik0tMjcgLTE5N1EtMzkgLTE5NyAtNDQgLTE5MlQtNTAgLTE3OVQtNDggLTE2NVQtNDEgLTE1NlEtNCAtMTUwIDM0IC0xMzFUMTAyIC04MlExNDEgLTQyIDE2NyAxOFQyMTMgMTY2TDMzOSAyMjBMMjQwIDI5NlEyNTYgMzkzIDI0NCA0NjNUMTkwIDU3M1ExNzQgNTkwIDE1OSA1OTlUMTI0IDYxNFExMjIgNjE1IDEyMCA2MjBUMTE5IDYzM1QxMjYgNjQ1VDE0MyA2NTFRMTYwIDY1MSAxODAgNjQxVDIyMyA2MDdRMjcxIDU1OSAyODggNDgzVDI5MiAzMTZMMzU3IDI2NlEzNzQgMjUzIDM3OSAyNDRUMzgwIDIxNlEzNzggMjA4IDM3NyAyMDJUMzcxIDE5MlQzNTkgMTgzVDMzOCAxNzRMMjU1IDEzNlEyNDQgODggMjMwIDUwVDIwMSAtMTlUMTY3IC03MlQxMzAgLTExNFE4NSAtMTYwIDQyIC0xNzhULTI3IC0xOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBnbHlwaC1uYW1lPSJhc2NpaXRpbGRlIiBob3Jpei1hZHYteD0iNTMzIiBkPSJNMzE5IDE2N1EyOTQgMTY3IDI3OCAxNzlUMjQ3IDIwOFEyMzMgMjIzIDIyNCAyMzBUMjA0IDIzN1ExOTAgMjM3IDE4MSAyMjZUMTY1IDE5NVExNTggMTczIDE0MSAxNzNRMTMzIDE3MyAxMjQgMTc5UTEzMiAyMjQgMTUzIDI1MVQyMTAgMjc4UTIzNSAyNzggMjUxIDI2NlQyODIgMjM3UTI5NSAyMjEgMzA0IDIxNFQzMjUgMjA3UTMzOSAyMDcgMzQ4IDIxOFQzNjQgMjQ5UTM2OCAyNjAgMzczIDI2NlQzODcgMjcyUTM5NyAyNzIgNDA0IDI2NVEzOTYgMjIwIDM3NSAxOTRUMzE5IDE2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEwOyIgZ2x5cGgtbmFtZT0idW5pMDBBMCIgaG9yaXotYWR2LXg9IjE3MCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMTsiIGdseXBoLW5hbWU9ImV4Y2xhbWRvd24iIGhvcml6LWFkdi14PSIyNjYiIGQ9Ik0yMTIgNTc1UTE3NSA1NzUgMTc1IDYwMlExNzUgNjI5IDE4OCA2NDJRMTk4IDY1MiAyMTYgNjUyUTI1MyA2NTIgMjUzIDYyNVEyNTMgNTk3IDI0MSA1ODVRMjMxIDU3NSAyMTIgNTc1Wk05MSAtM1E3MiAtMyA2MyAyVDU5IDI4TDE2NiA0NjBRMTcwIDQ3NSAxODAgNDc1UTE5MSA0NzUgMTk0IDQ3MVQxOTUgNDU0TDExOSAyMlExMTcgNiAxMTAgMlQ5MSAtM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEyOyIgZ2x5cGgtbmFtZT0iY2VudCIgaG9yaXotYWR2LXg9IjU2MCIgZD0iTTIyOCAtOThRMjIwIC05OCAyMTQgLTk0VDIxMCAtNzVMMjIyIC0xN0wyMzQgNDFRMTk5IDQ5IDE3MCA2NlQxMTkgMTEwVDg1IDE3MlQ3MyAyNTFRNzMgMzA1IDkzIDM1NVQxNDggNDQzVDIzMiA1MDRUMzM4IDUyN0wzNjEgNjM0UTM2NSA2NTcgMzgxIDY1N0gzODZRMzk0IDY1NyA0MDAgNjUzVDQwNCA2MzRMMzgxIDUyNFE0MjAgNTE4IDQ0NyA1MDRUNDk0IDQ2OVE1MTUgNDQ4IDUyNCA0MjVUNTM0IDM4NlE1MzQgMzc0IDUyOSAzNjhUNTE4IDM1OVQ1MDUgMzU2VDQ5OCAzNThRNDkyIDQwNCA0NjAgNDM5VDM3MSA0ODNMMjg1IDc4UTI4OCA3OCAyOTEgNzhUMjk3IDc3UTM1NyA3NyAzOTYgMTA1VDQ1OCAxNzFRNDU5IDE3MiA0NjMgMTcyVDQ3MiAxNjlUNDgxIDE2MVQ0ODUgMTQ5UTQ4NSAxNDAgNDc4IDEyN1Q0NTQgOTdRNDMxIDc0IDM5MCA1NVQyOTMgMzVRMjg4IDM1IDI4NSAzNVQyNzcgMzZMMjU0IC03NVEyNDkgLTk4IDIzMyAtOThIMjI4Wk0zMzEgNDg1UTI4NCA0ODMgMjQ2IDQ2M1QxODEgNDExVDEzOCAzMzdUMTIzIDI1NFExMjMgMTg3IDE1NiAxNDNUMjQ2IDg0TDMzMSA0ODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMzsiIGdseXBoLW5hbWU9InN0ZXJsaW5nIiBob3Jpei1hZHYteD0iNTgwIiBkPSJNMzYgMFExMyAwIDEzIDEzUTEzIDE5IDE2IDI3VDIzIDQwUTI4IDQ2IDQzIDQ2SDEwNUwxNjkgMjY4SDgyUTU5IDI2OCA1OSAyODFRNTkgMjg2IDYxIDI5NFQ2OCAzMDdRNzUgMzEzIDg3IDMxM0gxODJMMjE3IDQzNVEyMzQgNDk1IDI1NCA1MzdUMjk5IDYwN1QzNTUgNjQ2VDQyNyA2NTlRNDY4IDY1OSA0OTcgNjQ3VDU0NiA2MTVRNTYyIDU5OCA1NjkgNTgwVDU3NyA1NTFRNTc3IDUzOSA1NzIgNTMyVDU2MSA1MjJUNTUwIDUxOVQ1NDMgNTE5UTUzMiA1NjcgNTAxIDU5MVQ0MjQgNjE2UTM2OCA2MTYgMzMxIDU3NFQyNjUgNDI5TDIzMSAzMTNINDE1UTQzOCAzMTMgNDM4IDMwMFE0MzggMjk1IDQzNiAyODdUNDI5IDI3NFE0MjEgMjY4IDQwOSAyNjhIMjE5TDE1NCA0Nkg0ODFRNDk3IDQ2IDUwMyA0MVQ1MDkgMjdRNTA5IDE5IDUwNSAxMFQ0OTggMEgzNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE0OyIgZ2x5cGgtbmFtZT0iY3VycmVuY3kiIGhvcml6LWFkdi14PSI2NTYiIGQ9Ik0xMTAgMzg0UTg4IDM4NCA4OCAzOTZRODggNDAxIDkwIDQwOVQ5NyA0MjFRMTAzIDQyNyAxMTYgNDI3SDE5M1EyMDkgNDY5IDIzMSA1MDhUMjg0IDU3OVEzMjMgNjE4IDM2OCA2MzdUNDcxIDY1N1E1MjIgNjU3IDU1NyA2NDJUNjE3IDYwMVE2MzQgNTg0IDY0MyA1NjNUNjUyIDUyNFE2NTIgNTEzIDY0NyA1MDdUNjM2IDQ5N1Q2MjUgNDkzVDYxOSA0OTRRNjA1IDU1MSA1NjcgNTgzVDQ2NiA2MTVRNDIxIDYxNSAzODUgNTk5VDMxOCA1NTJRMjkyIDUyNiAyNzQgNDk0VDI0MiA0MjdINDc0UTQ5NSA0MjcgNDk1IDQxNVE0OTUgNDA5IDQ5MyA0MDFUNDg2IDM4OVE0ODIgMzg0IDQ2OCAzODRIMjI4UTIxOSAzNTIgMjE0IDMyMlQyMDYgMjY4SDQ0MFE0NjEgMjY4IDQ2MSAyNTZRNDYxIDI1MSA0NTkgMjQzVDQ1MiAyMzFRNDQ4IDIyNiA0MzQgMjI2SDIwNVEyMDYgMTgzIDIxOCAxNDhUMjUzIDg3VDMwNiA0N1QzNzcgMzNRNDMyIDMzIDQ3NCA2MFQ1NDUgMTMzUTU0NiAxMzQgNTQ5IDEzM1Q1NTcgMTI4VDU2NSAxMjFUNTY5IDEwOVE1NjkgODcgNTM2IDU0UTUxMCAyOCA0NjggOVQzNzkgLTEwUTI3MiAtMTAgMjE1IDUzVDE1NSAyMjZINzZRNTQgMjI2IDU0IDIzN1E1NCAyNDMgNTYgMjUxVDYzIDI2M1E2OCAyNjggODIgMjY4SDE1N1ExNTkgMjkzIDE2NCAzMjJUMTc5IDM4NEgxMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGdseXBoLW5hbWU9InllbiIgaG9yaXotYWR2LXg9IjU4NyIgZD0iTTI0MSAtM1EyMjAgLTMgMjI1IDIwTDI0NyAxMjNINzdRNTUgMTIzIDU1IDEzNVE1NSAxNDAgNTcgMTQ4VDY0IDE2MVE3MSAxNjYgODIgMTY2SDI1NkwyNzYgMjY1SDEwNlE4NSAyNjUgODUgMjc2UTg1IDI4MiA4NyAyOTBUOTQgMzAyUTk4IDMwNyAxMTIgMzA3SDI3MUwxMzAgNjM0UTEzMCA2MzcgMTM2IDY0MlQxNTIgNjQ5VDE3MSA2NDdUMTg3IDYyOEwzMTEgMzI1TDU3MiA2NTFRNTczIDY1MiA1ODEgNjUxVDU5NiA2NDNUNjAyIDYyM1Q1ODEgNTg2TDM0OCAzMDdINTAzUTUyNCAzMDcgNTI0IDI5NlE1MjQgMjkwIDUyMiAyODJUNTE1IDI3MFE1MTEgMjY1IDQ5NyAyNjVIMzIzTDMwMiAxNjZINDczUTQ5NCAxNjYgNDk0IDE1NFE0OTQgMTQ5IDQ5MiAxNDFUNDg1IDEyOFE0ODEgMTIzIDQ2NyAxMjNIMjkzTDI3MSAyMFEyNjYgLTMgMjQ0IC0zSDI0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE2OyIgZ2x5cGgtbmFtZT0iYnJva2VuYmFyIiBob3Jpei1hZHYteD0iMjY0IiBkPSJNMzkgLTE5M1ExNiAtMTkzIDIyIC0xNjdMOTUgMTc3UTk5IDIwMCAxMjEgMjAwSDEyNlExNDggMjAwIDE0MiAxNzRMNjkgLTE3MFE2NSAtMTkzIDQzIC0xOTNIMzlaTTEzNSAyNTdRMTEyIDI1NyAxMTggMjgzTDE5MSA2MjdRMTk1IDY1MCAyMTcgNjUwSDIyMlEyNDQgNjUwIDIzOCA2MjRMMTY1IDI4MFExNjEgMjU3IDEzOSAyNTdIMTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTc7IiBnbHlwaC1uYW1lPSJzZWN0aW9uIiBob3Jpei1hZHYteD0iNTM1IiBkPSJNMjEzIC0xNTdRMTQ0IC0xNTcgOTggLTEzOVQyNyAtOTZRMTAgLTc4IDIgLTYyVC02IC0zM1EtNiAtMjQgLTIgLTE3VDggLTZUMTkgLTFUMjUgMFEzMiAtMjMgNDcgLTQ0VDg1IC04MFQxNDAgLTEwNVQyMTYgLTExNFEyODkgLTExNCAzMjcgLTgzVDM2NiAtM1EzNjYgMTkgMzU1IDM1VDMyNSA2M1QyODAgODZUMjIzIDEwN1ExOTEgMTE4IDE2MiAxMzBUMTEwIDE1OVQ3NCAxOThUNjAgMjUyUTYwIDI4MiA3MSAzMDVUMTAyIDM0NlQxNDggMzc1VDIwMiAzOTFRMTcwIDQwOSAxNTAgNDM0VDEzMCA1MDFRMTMwIDUzNCAxNDQgNTYyVDE4NCA2MTJUMjQ2IDY0NVQzMjkgNjU3UTM5NSA2NTcgNDM2IDYzOFQ0OTggNTk4UTUxMyA1ODMgNTIwIDU2N1Q1MjggNTQxUTUyOCA1MzIgNTI0IDUyNlQ1MTMgNTE1VDUwMiA1MTBUNDk2IDUxMVE0ODAgNTU1IDQzOCA1ODVUMzI1IDYxNVEyOTAgNjE1IDI2MyA2MDdUMjE4IDU4M1QxODkgNTQ5VDE3OSA1MDdRMTc5IDQ4NCAxOTAgNDY4VDIyMCA0MzhUMjY2IDQxNVQzMjMgMzkyUTM1NCAzODAgMzgyIDM2OFQ0MzMgMzQwVDQ2OCAzMDNUNDgyIDI1MVE0ODIgMjIwIDQ3MSAxOTZUNDQwIDE1NFQzOTUgMTI1VDM0MSAxMTBRMzczIDkzIDM5NCA2OFQ0MTUgM1E0MTUgLTMyIDQwMiAtNjFUMzYyIC0xMTJUMjk5IC0xNDVUMjEzIC0xNTdaTTI5NCAxMzFRMzIxIDEzMiAzNDYgMTQwVDM5MSAxNjNUNDIyIDE5OFQ0MzQgMjQyUTQzNCAyNjQgNDIzIDI4MFQzOTMgMzA5VDM0OCAzMzJUMjkyIDM1M1EyODAgMzU3IDI2OCAzNjFUMjQ1IDM3MFEyMTggMzY3IDE5MyAzNTlUMTQ5IDMzN1QxMTkgMzA1VDEwOCAyNjJRMTA4IDIzOCAxMTkgMjIxVDE0OSAxOTFUMTk2IDE2N1QyNTQgMTQ2UTI2NSAxNDMgMjc0IDEzOVQyOTQgMTMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTg7IiBnbHlwaC1uYW1lPSJkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTQxOSA1NDVRMzgyIDU0NSAzODIgNTc0UTM4MiA1OTIgMzkxIDYwNVQ0MjEgNjE5UTQ1OCA2MTkgNDU4IDU5MFE0NTggNTcyIDQ0OSA1NTlUNDE5IDU0NVpNMjYwIDU0NVEyMjMgNTQ1IDIyMyA1NzRRMjIzIDU5MiAyMzIgNjA1VDI2MSA2MTlRMjk5IDYxOSAyOTkgNTkwUTI5OSA1NzIgMjg5IDU1OVQyNjAgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTk7IiBnbHlwaC1uYW1lPSJjb3B5cmlnaHQiIGhvcml6LWFkdi14PSI3ODMiIGQ9Ik00MDkgLTEwUTMzNyAtMTAgMjc4IDE0VDE3NSA4M1QxMDggMTg4VDg0IDMyMlE4NCAzOTQgMTA4IDQ1NVQxNzYgNTYxVDI4MCA2MzFUNDEwIDY1N1E0ODIgNjU3IDU0MiA2MzNUNjQ1IDU2NFQ3MTIgNDU5VDczNiAzMjVRNzM2IDI1MyA3MTIgMTkyVDY0MyA4NlQ1MzkgMTZUNDA5IC0xMFpNNDExIDI2UTQ3NCAyNiA1MjYgNDhUNjE2IDEwOVQ2NzUgMjAzVDY5NiAzMjRRNjk2IDM4OCA2NzUgNDQzVDYxNSA1MzdUNTI0IDU5OVQ0MDkgNjIyUTM0NiA2MjIgMjk0IDYwMFQyMDQgNTM5VDE0NSA0NDRUMTI0IDMyM1ExMjQgMjU4IDE0NSAyMDRUMjA1IDExMFQyOTUgNDhUNDExIDI2Wk00MTkgMTQ1UTM4MCAxNDUgMzQ4IDE1OFQyOTMgMTk0VDI1OCAyNTBUMjQ1IDMyMlEyNDUgMzYwIDI1OCAzOTJUMjk0IDQ0OVQzNDggNDg2VDQxNyA1MDBRNDU2IDUwMCA0ODQgNDg4VDUyOCA0NTlRNTM5IDQ0OCA1NDQgNDM4VDU0OSA0MTlRNTQ5IDQxMyA1NDYgNDA5VDUzOCA0MDFUNTI5IDM5N1Q1MjQgMzk2UTUxMiA0MjMgNDg2IDQ0MVQ0MTcgNDU5UTM5MCA0NTkgMzY3IDQ0OVQzMjcgNDIwVDMwMCAzNzZUMjkwIDMyM1EyOTAgMjkzIDI5OSAyNjhUMzI2IDIyNVQzNjcgMTk3VDQyMCAxODZRNDY2IDE4NiA0OTIgMjA3VDUyOCAyNTRRNTI5IDI1NSA1MzMgMjU0VDU0MSAyNTBUNTUwIDI0M1Q1NTQgMjMxUTU1NCAyMjQgNTQ4IDIxMlQ1MjggMTg0UTUxMyAxNjkgNDg1IDE1N1Q0MTkgMTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUE7IiBnbHlwaC1uYW1lPSJvcmRmZW1pbmluZSIgaG9yaXotYWR2LXg9IjUwMyIgZD0iTTQ0MSAyNjVRNDExIDI2NSAzOTcgMjg1VDM5MSAzNDhWMzQ5UTM2NSAzMDYgMzI2IDI4NFQyNDEgMjYyUTIwOSAyNjIgMTgxIDI3M1QxMzIgMzA1VDk5IDM1NlQ4NiA0MjVRODYgNDY4IDEwMSA1MTBUMTQ1IDU4NVQyMTEgNjM4VDI5NiA2NThRMzUxIDY1OCAzODcgNjMxVDQzNyA1NjNMNDQ2IDYwN1E0NTEgNjMyIDQ1OSA2NDJUNDgzIDY1MlE0OTAgNjUyIDQ5NSA2NTBUNTAwIDY0Nkw0MzYgMzQ3UTQzMCAzMTYgNDM4IDMwNVQ0NzAgMjkyUTQ3MCAyOTIgNDcwIDI4OFQ0NjggMjc5VDQ1OSAyNjlUNDQxIDI2NVpNMjQ5IDMwMVEyODAgMzAxIDMwNyAzMTJUMzU1IDM0M1QzOTAgMzg4VDQxMSA0NDBMNDI1IDUwOVE0MTcgNTU3IDM4NSA1ODhUMjk1IDYxOVEyNTcgNjE5IDIyNyA2MDJUMTc2IDU1OFQxNDMgNDk3VDEzMSA0MjdRMTMxIDM2OCAxNjUgMzM1VDI0OSAzMDFaTTE5NSAtNVExNjEgLTUgMTYxIDIwUTE2MSA0MyAxNzIgNTZRMTgwIDY1IDE5OCA2NVEyMzIgNjUgMjMyIDQxUTIzMiAxNSAyMjAgNVEyMTEgLTUgMTk1IC01WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RsZWZ0IiBob3Jpei1hZHYteD0iNTIyIiBkPSJNMzk5IDkwUTM4NSA5MCAzNjcgMTA0VDMxNyAxNTRRMjg2IDE4OSAyNzAgMjEzVDI1MyAyNDNRMjUzIDI0NyAyODIgMjcyVDM1OSAzMzJRNDA1IDM2NSA0MzIgMzgxVDQ3MyAzOTdRNDgxIDM5NyA0ODUgMzkyVDQ5MCAzNzlRNDkwIDM1NiAzODUgMjg5UTM2MiAyNzUgMzQxIDI2MlQyOTcgMjM0UTMxNSAyMjAgMzI4IDIwOFQzNTggMTgwUTM3NiAxNjMgMzg4IDE1MlQ0MDcgMTMyVDQxNiAxMTlUNDE5IDEwN1E0MTkgMTAwIDQxMyA5NVQzOTkgOTBaTTIyNiA4N1EyMTIgODcgMTkyIDEwM1QxMzYgMTU3UTEwMiAxOTUgODQgMjIwVDY1IDI1MVE2NSAyNTQgODkgMjc2VDE2MiAzMzRRMjA3IDM2NyAyMzIgMzgxVDI3MSAzOTZRMjc5IDM5NiAyODMgMzkxVDI4OCAzNzhRMjg4IDM2NyAyNjYgMzQ4VDE5MyAyOTZRMTcxIDI4MiAxNTIgMjY5VDEwOSAyNDJRMTI3IDIyNyAxNDIgMjE0VDE3NiAxODNRMTk2IDE2NCAyMDkgMTUyVDIzMCAxMzFUMjQxIDExNlQyNDUgMTA0UTI0NiA5NyAyNDAgOTJUMjI2IDg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUM7IiBnbHlwaC1uYW1lPSJsb2dpY2Fsbm90IiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDkgMzgwSDU0M1Y5Nkg0NTNWMjk3SDQ5VjM4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFEOyIgZ2x5cGgtbmFtZT0idW5pMDBBRCIgaG9yaXotYWR2LXg9IjM4NSIgZD0iTTYwIDIyNlE2MCAyMjcgNjEgMjI5UTYxIDIzMSA2MyAyMzlMNjggMjY0UTY4IDI2NiA2OCAyNjdUNjkgMjY5VjI3MEgzMzBRMzI5IDI2OSAzMjkgMjY3UTMyOSAyNjUgMzI5IDI2M1QzMjggMjU4TDMyMiAyMzJRMzIxIDIzMCAzMjEgMjI3VjIyNkg2MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFFOyIgZ2x5cGgtbmFtZT0icmVnaXN0ZXJlZCIgaG9yaXotYWR2LXg9Ijc4MyIgZD0iTTQwOSAtMTBRMzM3IC0xMCAyNzggMTRUMTc1IDgzVDEwOCAxODhUODQgMzIyUTg0IDM5NCAxMDggNDU1VDE3NiA1NjFUMjgwIDYzMVQ0MTAgNjU3UTQ4MiA2NTcgNTQyIDYzM1Q2NDUgNTY0VDcxMiA0NTlUNzM2IDMyNVE3MzYgMjUzIDcxMiAxOTJUNjQzIDg2VDUzOSAxNlQ0MDkgLTEwWk00MTEgMjZRNDc0IDI2IDUyNiA0OFQ2MTYgMTA5VDY3NSAyMDNUNjk2IDMyNFE2OTYgMzg4IDY3NSA0NDNUNjE1IDUzN1Q1MjQgNTk5VDQwOSA2MjJRMzQ2IDYyMiAyOTQgNjAwVDIwNCA1MzlUMTQ1IDQ0NFQxMjQgMzIzUTEyNCAyNTggMTQ1IDIwNFQyMDUgMTEwVDI5NSA0OFQ0MTEgMjZaTTQyOCAyOTVMNTQ1IDE3MlE1NDcgMTY5IDU0MCAxNjFUNTIxIDE1M1E1MTUgMTUzIDUwNyAxNTZUNDkwIDE2OUwzODEgMjkxSDMzN1YxNzRRMzM3IDE1MyAzMTggMTUzSDMxMlEyOTMgMTUzIDI5MyAxNzZWNDcyUTI5MyA0OTkgMzE3IDQ5OUg0MThRNDgyIDQ5OSA1MTUgNDczVDU0OSAzOTVRNTQ5IDM2OCA1NDAgMzQ5VDUxNCAzMThUNDc3IDMwMVQ0MzMgMjk1SDQyOFpNNDIwIDMyOFE0NjIgMzI4IDQ4MyAzNDVUNTA0IDM5NVE1MDQgNDYxIDQxNyA0NjFIMzM2VjMyOEg0MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRjsiIGdseXBoLW5hbWU9InVuaTAwQUYiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yMzMgNTY3UTIxMCA1NjcgMjEwIDU4MFEyMTAgNTg1IDIxMiA1OTNUMjE5IDYwNlEyMjIgNjEwIDIyNyA2MTFUMjM5IDYxMkg0NTFRNDc1IDYxMiA0NzUgNTk5UTQ3NSA1OTQgNDczIDU4NlQ0NjYgNTcyUTQ2MyA1NjkgNDU4IDU2OFQ0NDYgNTY3SDIzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIwOyIgZ2x5cGgtbmFtZT0iZGVncmVlIiBob3Jpei1hZHYteD0iNDAyIiBkPSJNMjM2IDM3MVExODIgMzcxIDE0NyA0MDVUMTExIDQ5NlExMTEgNTI5IDEyMyA1NTlUMTU4IDYxMVQyMDggNjQ2VDI3MCA2NTlRMzI0IDY1OSAzNTkgNjI2VDM5NSA1MzVRMzk1IDUwMiAzODMgNDcyVDM0OCA0MjBUMjk4IDM4NFQyMzYgMzcxWk0yNDMgNDEwUTI2NiA0MTAgMjg2IDQyMFQzMjEgNDQ2VDM0NCA0ODVUMzUzIDUzMlEzNTMgNTcwIDMyOCA1OTVUMjYzIDYyMVEyNDAgNjIxIDIyMCA2MTFUMTg1IDU4NVQxNjIgNTQ2VDE1MyA0OTlRMTUzIDQ2MSAxNzggNDM2VDI0MyA0MTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMTsiIGdseXBoLW5hbWU9InBsdXNtaW51cyIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTM0NCAyNjBRMzM5IDIzNyAzMjIgMjM3SDMxNlEzMDggMjM3IDMwMiAyNDFUMjk5IDI2MEwzMzAgNDA3SDE4NlExNjQgNDA3IDE2NCA0MTlRMTY0IDQyNCAxNjYgNDMyVDE3MyA0NDRRMTc3IDQ1MCAxOTEgNDUwSDMzOEwzNzAgNTk2UTM3NiA2MjAgMzkxIDYyMEgzOThRNDA2IDYyMCA0MTIgNjE1VDQxNSA1OTZMMzg0IDQ1MEg1MjdRNTQ5IDQ1MCA1NDkgNDM4UTU0OSA0MzMgNTQ3IDQyNVQ1NDAgNDEzUTUzNCA0MDcgNTIyIDQwN0gzNzVMMzQ0IDI2MFpNMTEzIDEyOFE5MCAxMjggOTAgMTQwUTkwIDE0NiA5MiAxNTRUOTkgMTY3UTEwMyAxNzMgMTE4IDE3M0g0ODJRNTA1IDE3MyA1MDUgMTYxUTUwNSAxNTUgNTAyIDE0N1Q0OTUgMTM0UTQ5MCAxMjggNDc2IDEyOEgxMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMjsiIGdseXBoLW5hbWU9InR3b3N1cGVyaW9yIiBob3Jpei1hZHYteD0iMzcwIiBkPSJNMTA4IDM4M1E4NSAzNjAgODIgMzI0SDI3MFEyOTYgMzI0IDI5NiAzMDhRMjk2IDMwMCAyOTIgMjkzVDI4NiAyODVINTlRNTEgMjg1IDQ1IDI5M1Q0MCAzMTRRNDMgMzcwIDc5IDQwOFE5OSA0MjggMTI2IDQ0MVQxODMgNDY1UTIxMCA0NzQgMjMwIDQ4MlQyNjMgNTAxVDI4NCA1MjNUMjkxIDU1NFEyOTEgNTgwIDI3MCA1OTdUMjExIDYxNFExNzUgNjE0IDE1MyA1OTZUMTE5IDU1MFExMTkgNTQ5IDExNSA1NDlUMTA1IDU1MVQ5NSA1NTlUOTEgNTczUTkxIDU4MSA5NyA1OTNUMTE0IDYxN1ExMzEgNjMzIDE1NiA2NDNUMjE2IDY1NFEyNzIgNjU0IDMwNCA2MjhUMzM2IDU1NlEzMzYgNTMwIDMyNyA1MTJUMzAxIDQ3OVQyNjAgNDU0VDIwNiA0MzNRMTc0IDQyMiAxNTAgNDExVDEwOCAzODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMzsiIGdseXBoLW5hbWU9InRocmVlc3VwZXJpb3IiIGhvcml6LWFkdi14PSIzNzAiIGQ9Ik0xNjMgMjc5UTEyNyAyNzkgMTAwIDI4OVQ1NiAzMTVRNDMgMzI4IDM4IDM0MFQzMyAzNjFRMzMgMzcyIDM3IDM3OFQ0OCAzODdUNTkgMzkwVDY0IDM5MFE2OCAzNTkgOTMgMzM4VDE2NCAzMTdRMjA5IDMxNyAyMzMgMzQwVDI1NyAzOTZRMjU3IDQyMiAyMzggNDM5VDE4MSA0NTdIMTUzUTEzNSA0NTcgMTM1IDQ2OVExMzUgNDczIDEzNyA0NzlUMTQyIDQ4OFExNDcgNDkzIDE2MSA0OTNIMTkzUTI0NCA0OTMgMjYzIDUxMlQyODMgNTU5UTI4MyA1ODQgMjYyIDYwMFQyMDcgNjE2UTE3NCA2MTYgMTUwIDYwMVQxMTMgNTY1UTExMiA1NjUgMTA4IDU2NVQxMDAgNTY4VDkyIDU3NFQ4OCA1ODZRODggNjAwIDEwMyA2MTRRMTIwIDYzMiAxNDcgNjQzVDIxMCA2NTRRMjM1IDY1NCAyNTYgNjQ4VDI5NCA2MjlUMzIwIDYwMVQzMzAgNTY1UTMzMCA1MjcgMzA4IDUwNFQyNDIgNDcyUTI3MiA0NjMgMjg3IDQ0M1QzMDMgMzk0UTMwMyAzNzMgMjk1IDM1MlQyNzAgMzE1VDIyNyAyODlUMTYzIDI3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI0OyIgZ2x5cGgtbmFtZT0iYWN1dGUiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yNjUgNTQ3UTI2NCA1NDggMjczIDU1OVQzMDAgNTg1VDM0MiA2MjBUMzk0IDY1N1E0MTEgNjcwIDQyMSA2NzNUNDQwIDY3N1E0NDkgNjc3IDQ1NSA2NzFUNDYxIDY1N1E0NjEgNjQ3IDQ1MiA2MzhUNDE5IDYxMlEzODkgNTk0IDM2MiA1ODFUMzEzIDU1OVQyNzkgNTQ4VDI2NSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNTsiIGdseXBoLW5hbWU9InVuaTAwQjUiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik01NiAtMjY3UTE5IC0yNjcgMiAtMjQzVC01IC0xNjZMMTMxIDQ3M0gxNzlMMTIzIDIwOVExMDUgMTI1IDEzOSA4MFQyNDEgMzVRMzAwIDM1IDM0MSA2NVQ0MTggMTU1TDQ4NSA0NzNINTMzTDQ1MyA5NVE0NDQgNTQgNDU2IDQxVDQ5NiAyN1YyMVE0OTcgMTYgNDk0IDEwVDQ4NCAtMVQ0NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhMOTEgNjBMNDMgLTE2NVEzNSAtMjA2IDQ3IC0yMTlUOTAgLTIzM1YtMjM4UTkxIC0yNDQgODggLTI1MFQ3OCAtMjYxVDU2IC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGdseXBoLW5hbWU9InBhcmFncmFwaCIgaG9yaXotYWR2LXg9IjU5NyIgZD0iTTQzMSAtM1E0MjAgLTMgNDE2IDRUNDE0IDIzTDU0MiA2MjdRNTQ1IDYzOSA1NTAgNjQ0VDU2NyA2NTBINTczUTU5NyA2NTAgNTkxIDYyNEw0NjMgMjBRNDU3IC0zIDQzOCAtM0g0MzFaTTMyOSAtM1EzMTggLTMgMzE0IDRUMzEyIDIzTDM3MSAzMDRIMzA1UTIwMSAzMDQgMTQ3IDM0MFQ5MiA0NDhROTIgNDg5IDEwNSA1MjVUMTQ3IDU4OVQyMjIgNjMxVDMzNiA2NDdINDU4UTQ5NCA2NDcgNDg2IDYxMkwzNjEgMjBRMzU1IC0zIDMzNiAtM0gzMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNzsiIGdseXBoLW5hbWU9InVuaTAwQjciIGhvcml6LWFkdi14PSIyNDAiIGQ9Ik0xMjEgMjExUTg0IDIxMSA4NCAyMzdRODQgMjY1IDk3IDI3OFExMDYgMjg4IDEyNSAyODhRMTYyIDI4OCAxNjIgMjYxUTE2MiAyMzMgMTQ5IDIyMVExMzkgMjExIDEyMSAyMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCODsiIGdseXBoLW5hbWU9ImNlZGlsbGEiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0xMTIgLTIxOVExMTAgLTIyMiAxMDYgLTIyMVQ5NyAtMjE3VDkxIC0yMTFUOTAgLTIwNFExMTkgLTE2MCAxNDIgLTEyNVExNTIgLTExMSAxNjEgLTk3VDE3OCAtNzFRMTg3IC01OCAxOTQgLTQ2UTE5NSAtNDUgMjAxIC00NlQyMTYgLTUwVDIzMCAtNThUMjM3IC03M1EyMzcgLTkwIDIyMCAtMTA4TDExMiAtMjE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qjk7IiBnbHlwaC1uYW1lPSJvbmVzdXBlcmlvciIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTY0IDI4NVE0MyAyODUgNDYgMzAxUTQ2IDMwMyA0NiAzMDdUNDkgMzE0UTU0IDMyNSA3MiAzMjVIMTUzTDIwOSA1ODRRMTk4IDU3MiAxODIgNTY1VDE1MCA1NThRMTI5IDU1OCAxMTcgNTY3VDEwNCA1OTJRMTA0IDYwNyAxMTIgNjE0VDEyMiA2MjFRMTI3IDYxMiAxMzYgNjA2VDE2MyA1OTlRMTgzIDU5OSAyMDIgNjEzVDIyOSA2NTBIMjQ4UTI2OCA2NTAgMjY0IDYyN0wxOTcgMzI1SDI3M1EyODIgMzI1IDI4NyAzMjFUMjkxIDMwOVEyOTEgMzA3IDI5MCAzMDNUMjg3IDI5NlEyODMgMjg1IDI2NSAyODVINjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQTsiIGdseXBoLW5hbWU9Im9yZG1hc2N1bGluZSIgaG9yaXotYWR2LXg9IjQ3MyIgZD0iTTI2NCAyNjFRMjI2IDI2MSAxOTUgMjczVDE0MCAzMDlUMTAzIDM2NFQ5MCA0MzVROTAgNDgwIDEwNiA1MjBUMTUwIDU5MVQyMTggNjM5VDMwMiA2NTdRMzQwIDY1NyAzNzIgNjQ1VDQyNyA2MDlUNDY0IDU1NFQ0NzcgNDg0UTQ3NyA0MzkgNDYxIDM5OVQ0MTYgMzI4VDM0OCAyNzlUMjY0IDI2MVpNMTkwIC01UTE1NiAtNSAxNTYgMjBRMTU2IDQzIDE2NyA1NlExNzUgNjUgMTkzIDY1UTIyNyA2NSAyMjcgNDFRMjI3IDE1IDIxNSA1UTIwNiAtNSAxOTAgLTVaTTI2NyAzMDBRMzAwIDMwMCAzMzAgMzE0VDM4MiAzNTRUNDE4IDQxMlQ0MzEgNDgyUTQzMSA1MTEgNDIxIDUzNlQzOTQgNTc5VDM1MiA2MDdUMjk5IDYxOFEyNjUgNjE4IDIzNiA2MDRUMTg0IDU2NFQxNDggNTA2VDEzNSA0MzZRMTM1IDQwNyAxNDUgMzgyVDE3MiAzMzlUMjE0IDMxMVQyNjcgMzAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RyaWdodCIgaG9yaXotYWR2LXg9IjUyMiIgZD0iTTI1NCA4OFEyNDUgODggMjQxIDkzVDIzNyAxMDZRMjM3IDExNyAyNTggMTM2VDMzMSAxODhRMzUzIDIwMiAzNzIgMjE1VDQxNSAyNDJRMzk4IDI1NiAzODIgMjcwVDM0OCAzMDFRMzI4IDMyMCAzMTUgMzMyVDI5NCAzNTNUMjgzIDM2OFQyNzkgMzc5UTI3OSAzODYgMjg0IDM5MVQyOTggMzk2UTMxMiAzOTYgMzMyIDM4MVQzODggMzI3UTQyMiAyODkgNDQwIDI2NFQ0NTkgMjMzUTQ1OSAyMjkgNDM1IDIwN1QzNjIgMTQ5UTMxNyAxMTcgMjkzIDEwM1QyNTQgODhaTTUxIDg3UTQzIDg3IDM5IDkyVDM0IDEwNFEzNCAxMjggMTM5IDE5NFExNjIgMjA5IDE4MyAyMjJUMjI3IDI1MFEyMDkgMjY0IDE5NiAyNzZUMTY2IDMwNFExNDggMzIxIDEzNiAzMzJUMTE3IDM1MlQxMDggMzY1VDEwNSAzNzdRMTA1IDM4NCAxMTEgMzg5VDEyNSAzOTRRMTM5IDM5NCAxNTcgMzgwVDIwNyAzMzBRMjM4IDI5NSAyNTQgMjcwVDI3MSAyNDBRMjcxIDIzNyAyNDMgMjEyVDE2NSAxNTFRMTE5IDExOSA5MiAxMDNUNTEgODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGdseXBoLW5hbWU9Im9uZXF1YXJ0ZXIiIGhvcml6LWFkdi14PSI4MjYiIGQ9Ik02NCAyODVRNDMgMjg1IDQ2IDMwMVE0NiAzMDMgNDYgMzA3VDQ5IDMxNFE1NCAzMjUgNzIgMzI1SDE1M0wyMDkgNTg0UTE5OCA1NzIgMTgyIDU2NVQxNTAgNTU4UTEyOSA1NTggMTE3IDU2N1QxMDQgNTkyUTEwNCA2MDcgMTEyIDYxNFQxMjIgNjIxUTEyNyA2MTIgMTM2IDYwNlQxNjMgNTk5UTE4MyA1OTkgMjAyIDYxM1QyMjkgNjUwSDI0OFEyNjggNjUwIDI2NCA2MjdMMTk3IDMyNUgyNzNRMjgyIDMyNSAyODcgMzIxVDI5MSAzMDlRMjkxIDMwNyAyOTAgMzAzVDI4NyAyOTZRMjgzIDI4NSAyNjUgMjg1SDY0Wk0xMTQgLTIwUTExMyAtMjEgMTEwIC0yMFQxMDMgLTE2VDk3IC04VDk1IDNROTcgMTQgMTAyIDIxVDEyMiA0M1ExMjYgNDcgMTQzIDY0VDE4NiAxMDZUMjQyIDE1OVQzMDMgMjE3VDM2MSAyNzFUNDA2IDMxNVE0MTkgMzI4IDQ0MSAzNDlUNDg5IDM5NVQ1NDQgNDQ4VDYwMSA1MDNRNjY3IDU2NiA3NDMgNjM4UTc0OSA2MzcgNzUzIDYzM1E3NTcgNjMwIDc2MCA2MjZUNzYxIDYxNFE3NTkgNjA2IDc1NCA1OThUNzM0IDU3NVE3MzAgNTcwIDcxMiA1NTNUNjY5IDUxMlQ2MTIgNDU4VDU1MSAzOTlUNDk0IDM0NFQ0NDkgMzAxUTQzNSAyODggNDE0IDI2N1QzNjcgMjIxVDMxMiAxNjlUMjU1IDExNFExODkgNTEgMTE0IC0yMFpNNjczIC0yUTY2NCAtMiA2NTkgM1Q2NTcgMjFMNjc0IDEwMkg1MTFRNTA5IDEwMiA1MDMgMTEwVDQ5NyAxMzBRNDk3IDEzOSA1MDEgMTQ3VDUxNiAxNjdMNjkyIDM0NVE3MDMgMzU3IDcxMSAzNjFUNzM2IDM2NlE3NzQgMzY2IDc2NyAzMzJMNzI2IDE0MEg3NzFRNzkwIDE0MCA3OTAgMTI4UTc5MCAxMjQgNzg4IDExN1Q3ODIgMTA2UTc3OCAxMDIgNzY1IDEwMkg3MThMNzAwIDIwUTY5OCA3IDY5MyAzVDY3OSAtMkg2NzNaTTY4NSAxNDBMNzI0IDMyOUw1MzkgMTQwSDY4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEJEOyIgZ2x5cGgtbmFtZT0ib25laGFsZiIgaG9yaXotYWR2LXg9IjgyNiIgZD0iTTk0IC0yMFE5MyAtMjEgOTAgLTIwVDgzIC0xNlQ3NyAtOFQ3NSAzUTc3IDE0IDgyIDIxVDEwMiA0M1ExMDYgNDcgMTIzIDY0VDE2NiAxMDZUMjIyIDE1OVQyODMgMjE3VDM0MSAyNzFUMzg2IDMxNVEzOTkgMzI4IDQyMSAzNDlUNDY5IDM5NVQ1MjQgNDQ4VDU4MSA1MDNRNjQ3IDU2NiA3MjMgNjM4UTcyOSA2MzcgNzMzIDYzM1E3MzcgNjMwIDc0MCA2MjZUNzQxIDYxNFE3MzkgNjA2IDczNCA1OThUNzE0IDU3NVE3MTAgNTcwIDY5MiA1NTNUNjQ5IDUxMlQ1OTIgNDU4VDUzMSAzOTlUNDc0IDM0NFQ0MjkgMzAxUTQxNSAyODggMzk0IDI2N1QzNDcgMjIxVDI5MiAxNjlUMjM1IDExNFExNjkgNTEgOTQgLTIwWk01NjQgOThRNTQxIDc1IDUzOCAzOUg3MjZRNzUyIDM5IDc1MiAyM1E3NTIgMTUgNzQ4IDhUNzQyIDBINTE1UTUwNyAwIDUwMSA4VDQ5NiAyOVE0OTkgODUgNTM1IDEyM1E1NTUgMTQzIDU4MiAxNTZUNjM5IDE4MFE2NjYgMTg5IDY4NiAxOTdUNzE5IDIxNlQ3NDAgMjM4VDc0NyAyNjlRNzQ3IDI5NSA3MjYgMzEyVDY2NyAzMjlRNjMxIDMyOSA2MDkgMzExVDU3NSAyNjVRNTc1IDI2NCA1NzEgMjY0VDU2MSAyNjZUNTUxIDI3NFQ1NDcgMjg4UTU0NyAyOTYgNTUzIDMwOFQ1NzAgMzMyUTU4NyAzNDggNjEyIDM1OFQ2NzIgMzY5UTcyOCAzNjkgNzYwIDM0M1Q3OTIgMjcxUTc5MiAyNDUgNzgzIDIyN1Q3NTcgMTk0VDcxNiAxNjlUNjYyIDE0OFE2MzAgMTM3IDYwNiAxMjZUNTY0IDk4Wk02NCAyODVRNDMgMjg1IDQ2IDMwMVE0NiAzMDMgNDYgMzA3VDQ5IDMxNFE1NCAzMjUgNzIgMzI1SDE1M0wyMDkgNTg0UTE5OCA1NzIgMTgyIDU2NVQxNTAgNTU4UTEyOSA1NTggMTE3IDU2N1QxMDQgNTkyUTEwNCA2MDcgMTEyIDYxNFQxMjIgNjIxUTEyNyA2MTIgMTM2IDYwNlQxNjMgNTk5UTE4MyA1OTkgMjAyIDYxM1QyMjkgNjUwSDI0OFEyNjggNjUwIDI2NCA2MjdMMTk3IDMyNUgyNzNRMjgyIDMyNSAyODcgMzIxVDI5MSAzMDlRMjkxIDMwNyAyOTAgMzAzVDI4NyAyOTZRMjgzIDI4NSAyNjUgMjg1SDY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBnbHlwaC1uYW1lPSJ0aHJlZXF1YXJ0ZXJzIiBob3Jpei1hZHYteD0iODI2IiBkPSJNNjczIC0yUTY2NCAtMiA2NTkgM1Q2NTcgMjFMNjc0IDEwMkg1MTFRNTA5IDEwMiA1MDMgMTEwVDQ5NyAxMzBRNDk3IDEzOSA1MDEgMTQ3VDUxNiAxNjdMNjkyIDM0NVE3MDMgMzU3IDcxMSAzNjFUNzM2IDM2NlE3NzQgMzY2IDc2NyAzMzJMNzI2IDE0MEg3NzFRNzkwIDE0MCA3OTAgMTI4UTc5MCAxMjQgNzg4IDExN1Q3ODIgMTA2UTc3OCAxMDIgNzY1IDEwMkg3MThMNzAwIDIwUTY5OCA3IDY5MyAzVDY3OSAtMkg2NzNaTTExNCAtMjBRMTEzIC0yMSAxMTAgLTIwVDEwMyAtMTZUOTcgLThUOTUgM1E5NyAxNCAxMDIgMjFUMTIyIDQzUTEyNiA0NyAxNDMgNjRUMTg2IDEwNlQyNDIgMTU5VDMwMyAyMTdUMzYxIDI3MVQ0MDYgMzE1UTQxOSAzMjggNDQxIDM0OVQ0ODkgMzk1VDU0NCA0NDhUNjAxIDUwM1E2NjcgNTY2IDc0MyA2MzhRNzQ5IDYzNyA3NTMgNjMzUTc1NyA2MzAgNzYwIDYyNlQ3NjEgNjE0UTc1OSA2MDYgNzU0IDU5OFQ3MzQgNTc1UTczMCA1NzAgNzEyIDU1M1Q2NjkgNTEyVDYxMiA0NThUNTUxIDM5OVQ0OTQgMzQ0VDQ0OSAzMDFRNDM1IDI4OCA0MTQgMjY3VDM2NyAyMjFUMzEyIDE2OVQyNTUgMTE0UTE4OSA1MSAxMTQgLTIwWk0xNjMgMjc5UTEyNyAyNzkgMTAwIDI4OVQ1NiAzMTVRNDMgMzI4IDM4IDM0MFQzMyAzNjFRMzMgMzcyIDM3IDM3OFQ0OCAzODdUNTkgMzkwVDY0IDM5MFE2OCAzNTkgOTMgMzM4VDE2NCAzMTdRMjA5IDMxNyAyMzMgMzQwVDI1NyAzOTZRMjU3IDQyMiAyMzggNDM5VDE4MSA0NTdIMTUzUTEzNSA0NTcgMTM1IDQ2OVExMzUgNDczIDEzNyA0NzlUMTQyIDQ4OFExNDcgNDkzIDE2MSA0OTNIMTkzUTI0NCA0OTMgMjYzIDUxMlQyODMgNTU5UTI4MyA1ODQgMjYyIDYwMFQyMDcgNjE2UTE3NCA2MTYgMTUwIDYwMVQxMTMgNTY1UTExMiA1NjUgMTA4IDU2NVQxMDAgNTY4VDkyIDU3NFQ4OCA1ODZRODggNjAwIDEwMyA2MTRRMTIwIDYzMiAxNDcgNjQzVDIxMCA2NTRRMjM1IDY1NCAyNTYgNjQ4VDI5NCA2MjlUMzIwIDYwMVQzMzAgNTY1UTMzMCA1MjcgMzA4IDUwNFQyNDIgNDcyUTI3MiA0NjMgMjg3IDQ0M1QzMDMgMzk0UTMwMyAzNzMgMjk1IDM1MlQyNzAgMzE1VDIyNyAyODlUMTYzIDI3OVpNNjg1IDE0MEw3MjQgMzI5TDUzOSAxNDBINjg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkY7IiBnbHlwaC1uYW1lPSJxdWVzdGlvbmRvd24iIGhvcml6LWFkdi14PSI0OTIiIGQ9Ik0zNDYgNTczUTMwOCA1NzMgMzA4IDYwMFEzMDggNjI4IDMyMSA2NDBRMzMxIDY1MCAzNDkgNjUwUTM4NyA2NTAgMzg3IDYyNFEzODcgNTk4IDM3NCA1ODNRMzY0IDU3MyAzNDYgNTczWk0yMTcgLTEyUTE3MyAtMTIgMTM4IDFUNzkgMzZUNDEgOTBUMjcgMTU3UTI3IDE5NyA0MCAyMjZUNzUgMjc3VDEyNCAzMTJUMTgwIDMzNlEyMTQgMzQ4IDIzNyAzNTdUMjczIDM3NlQyOTIgMzk2VDI5OCA0MTdRMjk4IDQ0NyAyNjUgNDUzUTI2NCA0NTMgMjY0IDQ1N1QyNjcgNDY1VDI3NSA0NzJUMjkwIDQ3NlEzMTMgNDc2IDMyOSA0NjBUMzQ1IDQxOFEzNDUgMzc5IDMxNSAzNTNUMjExIDMwMlExNzkgMjkxIDE1NCAyNzhUMTEyIDI0OFQ4NiAyMDhUNzYgMTU3UTc2IDEwMyAxMTQgNjhUMjIwIDMzUTI4MiAzMyAzMjQgNjhUMzg2IDE1OFEzODcgMTU5IDM5MiAxNThUNDAzIDE1NFQ0MTMgMTQ2VDQxOCAxMzFRNDE4IDExNiA0MDcgOTRUMzc0IDUxUTM0NyAyNCAzMDggNlQyMTcgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzA7IiBnbHlwaC1uYW1lPSJBZ3JhdmUiIGhvcml6LWFkdi14PSI2MzEiIGQ9Ik0tMjQgMEwzNTcgNjM1UTM2MiA2NDQgMzY5IDY0OFQzODkgNjUyUTQwOCA2NTIgNDE1IDY0NlQ0MjQgNjI5TDU1MyAwSDUwMUw0NTcgMjI0SDE2NkwzNCAwSC0yNFpNNDQ4IDI2OEwzODQgNTk1TDE5MSAyNjhINDQ4Wk00MzQgNzIxUTQzMiA3MTkgNDIxIDcyMlQzOTEgNzM1VDM0OSA3NThUMzAyIDc5M1EyODIgODEwIDI3NiA4MTlUMjcwIDgzOVEyNzAgODQ4IDI3NyA4NTRUMjkzIDg2MFEzMDEgODYwIDMxMSA4NTVUMzM2IDgzNVEzNjAgODE1IDM3OCA3OTVUNDEwIDc1OVQ0MjkgNzMzVDQzNCA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMTsiIGdseXBoLW5hbWU9IkFhY3V0ZSIgaG9yaXotYWR2LXg9IjYzMSIgZD0iTS0yNCAwTDM1NyA2MzVRMzYyIDY0NCAzNjkgNjQ4VDM4OSA2NTJRNDA4IDY1MiA0MTUgNjQ2VDQyNCA2MjlMNTUzIDBINTAxTDQ1NyAyMjRIMTY2TDM0IDBILTI0Wk00NDggMjY4TDM4NCA1OTVMMTkxIDI2OEg0NDhaTTM1NiA3MjFRMzU1IDcyMiAzNjQgNzMzVDM5MSA3NTlUNDMzIDc5NFQ0ODUgODMxUTUwMiA4NDQgNTEyIDg0N1Q1MzEgODUxUTU0MCA4NTEgNTQ2IDg0NVQ1NTIgODMxUTU1MiA4MjEgNTQzIDgxMlQ1MTAgNzg2UTQ4MCA3NjggNDUzIDc1NVQ0MDQgNzMzVDM3MCA3MjJUMzU2IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgZ2x5cGgtbmFtZT0iQWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MzEiIGQ9Ik0tMjQgMEwzNTcgNjM1UTM2MiA2NDQgMzY5IDY0OFQzODkgNjUyUTQwOCA2NTIgNDE1IDY0NlQ0MjQgNjI5TDU1MyAwSDUwMUw0NTcgMjI0SDE2NkwzNCAwSC0yNFpNNDQ4IDI2OEwzODQgNTk1TDE5MSAyNjhINDQ4Wk0yOTEgNzE5UTI3NyA3MTkgMjc3IDczMVEyNzcgNzQzIDI5MiA3NjFUMzQzIDgxMlEzNzggODQ0IDQwMSA4NjBUNDI2IDg3N1E0MjggODc3IDQ0MyA4NjFUNDc5IDgxNFE1MDIgNzgwIDUwOSA3NjRUNTE2IDc0MFE1MTYgNzI5IDUxMSA3MjRUNDk5IDcxOVE0ODkgNzE5IDQ3OSA3MzFUNDQ5IDc4MVE0NDEgNzk1IDQzNSA4MDdUNDIwIDgzNEwzNjggNzgwUTMzNiA3NDYgMzE5IDczM1QyOTEgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzM7IiBnbHlwaC1uYW1lPSJBdGlsZGUiIGhvcml6LWFkdi14PSI2MzEiIGQ9Ik0tMjQgMEwzNTcgNjM1UTM2MiA2NDQgMzY5IDY0OFQzODkgNjUyUTQwOCA2NTIgNDE1IDY0NlQ0MjQgNjI5TDU1MyAwSDUwMUw0NTcgMjI0SDE2NkwzNCAwSC0yNFpNNDQ4IDI2OEwzODQgNTk1TDE5MSAyNjhINDQ4Wk00NjAgNzE4UTQzNSA3MTggNDE5IDczMFQzODggNzU5UTM3NCA3NzQgMzY1IDc4MVQzNDUgNzg4UTMzMCA3ODggMzIxIDc3N1QzMDYgNzQ2UTI5OCA3MjMgMjgyIDcyM1EyNzQgNzIzIDI2NSA3MzBRMjczIDc3NSAyOTQgODAyVDM1MSA4MjlRMzc2IDgyOSAzOTIgODE2VDQyMyA3ODdRNDM2IDc3MiA0NDUgNzY1VDQ2NiA3NThRNDgwIDc1OCA0ODkgNzY5VDUwNSA4MDBRNTA5IDgxMSA1MTQgODE3VDUyOCA4MjNRNTM2IDgyMyA1NDUgODE2UTUzNyA3NzEgNTE2IDc0NVQ0NjAgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzQ7IiBnbHlwaC1uYW1lPSJBZGllcmVzaXMiIGhvcml6LWFkdi14PSI2MzEiIGQ9Ik0tMjQgMEwzNTcgNjM1UTM2MiA2NDQgMzY5IDY0OFQzODkgNjUyUTQwOCA2NTIgNDE1IDY0NlQ0MjQgNjI5TDU1MyAwSDUwMUw0NTcgMjI0SDE2NkwzNCAwSC0yNFpNNDQ4IDI2OEwzODQgNTk1TDE5MSAyNjhINDQ4Wk00ODEgNzE5UTQ0NCA3MTkgNDQ0IDc0OFE0NDQgNzY2IDQ1MyA3NzlUNDgzIDc5M1E1MjAgNzkzIDUyMCA3NjRRNTIwIDc0NiA1MTEgNzMzVDQ4MSA3MTlaTTMyMiA3MTlRMjg1IDcxOSAyODUgNzQ4UTI4NSA3NjYgMjk0IDc3OVQzMjMgNzkzUTM2MSA3OTMgMzYxIDc2NFEzNjEgNzQ2IDM1MSA3MzNUMzIyIDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM1OyIgZ2x5cGgtbmFtZT0iQXJpbmciIGhvcml6LWFkdi14PSI2MzEiIGQ9Ik0zMyAtMlEzMyAtMiAyNCAtMlQ4IDNULTEgMjJUMTMgNjBMMzQzIDYxMUwzNTEgNjIyUTMyNCA2MzMgMzEwIDY1NlQyOTYgNzA2UTI5NiA3MzEgMzA1IDc1M1QzMzAgNzkzVDM2OCA4MjBUNDE2IDgzMVE0NjQgODMxIDQ5MCA4MDNUNTE3IDczN1E1MTcgNjk1IDQ5MSA2NjFUNDI2IDYxN1E0MjcgNjE1IDQyOCA2MTFUNDI5IDYwNEw1NTEgMTNRNTUxIDEwIDU0NCA1VDUyOCAtMVQ1MDkgMlQ0OTcgMjZMNDU3IDIyNUgxNjZMMzMgLTJaTTQ0OSAyNjlMMzg0IDU5NUwxOTIgMjY5SDQ0OVpNMzk4IDY0NlE0MTYgNjQ2IDQzMCA2NTNUNDU1IDY3M1Q0NzIgNzAxVDQ3OCA3MzRRNDc4IDc1OCA0NjIgNzc3VDQxNSA3OTdRMzk3IDc5NyAzODIgNzkwVDM1NyA3NzBUMzQwIDc0MlQzMzQgNzA5UTMzNCA2ODUgMzUxIDY2NlQzOTggNjQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzY7IiBnbHlwaC1uYW1lPSJBRSIgaG9yaXotYWR2LXg9Ijg3OCIgZD0iTTMzIC0yUTMyIC0yIDIzIC0yVDcgM1QtMiAyMlQxMiA2MEwzNDggNjIwUTM1NiA2MzMgMzY1IDY0MFQzOTIgNjQ3SDg4MFY2NDRRODgwIDY0MyA4NzggNjM1UTg3NyA2MjkgODc1IDYyMVQ4NzMgNjA3UTg3MiA2MDQgODcyIDYwM1E4NzIgNjAyIDg3MSA2MDJINDMwTDQ4MSAzNTRINzUyTDc0OSAzNDJMNzQ0IDMxNVE3NDMgMzEzIDc0MyAzMTFRNzQzIDMxMCA3NDIgMzEwSDQ5MEw1NDQgNDZINzcyUTc3MSA0NSA3NzEgNDNRNzcxIDQxIDc3MSAzOVQ3NzAgMzNRNzY5IDI3IDc2NyAxOVQ3NjQgNVE3NjQgMyA3NjQgM1Q3NjMgMVYwSDUzNlE1MTcgMCA1MDggN1Q0OTUgMzNMNDU3IDIyNEgxNjZMMzMgLTJaTTQ0OCAyNjhMMzg0IDU5NUwxOTEgMjY4SDQ0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM3OyIgZ2x5cGgtbmFtZT0iQ2NlZGlsbGEiIGhvcml6LWFkdi14PSI2ODEiIGQ9Ik0zNjUgLTEwUTMwMCAtMTAgMjQ4IDlUMTU4IDY0VDEwMCAxNTFUNzkgMjY2UTc5IDM0NSAxMDYgNDE2VDE4MCA1NDBUMjkzIDYyNVQ0MzQgNjU3UTUwNSA2NTcgNTUwIDYzNlQ2MjMgNTg3UTY0NiA1NjQgNjU2IDU0MFQ2NjYgNTAxUTY2NiA0OTEgNjYyIDQ4NVQ2NTIgNDc2VDY0MSA0NzFUNjMzIDQ3MlE2MTUgNTM4IDU2NSA1NzZUNDMxIDYxNFEzNjYgNjE0IDMxMiA1ODdUMjE3IDUxM1QxNTUgNDA0VDEzMiAyNzNRMTMyIDIxOCAxNDkgMTc0VDE5NiA5OFQyNzAgNTFUMzY1IDM0UTQwNSAzNCA0MzggNDNUNDk5IDY5VDU0NSAxMDZUNTc5IDE1MFE1ODAgMTUxIDU4NCAxNTBUNTkyIDE0NlQ2MDAgMTM4VDYwNCAxMjRRNjA0IDExNSA1OTYgOTlUNTY4IDYzUTUzOCAzNCA0ODUgMTJUMzY1IC0xMFpNMjQ2IC0yMTlRMjQ0IC0yMjIgMjQwIC0yMjFUMjMxIC0yMTdUMjI1IC0yMTFUMjI0IC0yMDRRMjUzIC0xNjAgMjc2IC0xMjVRMjg2IC0xMTEgMjk1IC05N1QzMTIgLTcxUTMyMSAtNTggMzI4IC00NlEzMjkgLTQ1IDMzNSAtNDZUMzUwIC01MFQzNjQgLTU4VDM3MSAtNzNRMzcxIC05MCAzNTQgLTEwOEwyNDYgLTIxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM4OyIgZ2x5cGgtbmFtZT0iRWdyYXZlIiBob3Jpei1hZHYteD0iNTk1IiBkPSJNMTc2IDYxNlExODMgNjQ3IDIxMiA2NDdINjE1TDYwNiA2MDJIMjIzTDE3MCAzNTRINDcxTDQ2MiAzMTBIMTYxTDEwNSA0Nkg0OThMNDg4IDBINDVMMTc2IDYxNlpNNDYzIDcyMVE0NjEgNzE5IDQ1MCA3MjJUNDIwIDczNVQzNzggNzU4VDMzMSA3OTNRMzExIDgxMCAzMDUgODE5VDI5OSA4MzlRMjk5IDg0OCAzMDYgODU0VDMyMiA4NjBRMzMwIDg2MCAzNDAgODU1VDM2NSA4MzVRMzg5IDgxNSA0MDcgNzk1VDQzOSA3NTlUNDU4IDczM1Q0NjMgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Qzk7IiBnbHlwaC1uYW1lPSJFYWN1dGUiIGhvcml6LWFkdi14PSI1OTUiIGQ9Ik0xNzYgNjE2UTE4MyA2NDcgMjEyIDY0N0g2MTVMNjA2IDYwMkgyMjNMMTcwIDM1NEg0NzFMNDYyIDMxMEgxNjFMMTA1IDQ2SDQ5OEw0ODggMEg0NUwxNzYgNjE2Wk0zNTUgNzIxUTM1NCA3MjIgMzYzIDczM1QzOTAgNzU5VDQzMiA3OTRUNDg0IDgzMVE1MDEgODQ0IDUxMSA4NDdUNTMwIDg1MVE1MzkgODUxIDU0NSA4NDVUNTUxIDgzMVE1NTEgODIxIDU0MiA4MTJUNTA5IDc4NlE0NzkgNzY4IDQ1MiA3NTVUNDAzIDczM1QzNjkgNzIyVDM1NSA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQTsiIGdseXBoLW5hbWU9IkVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTk1IiBkPSJNMTc2IDYxNlExODMgNjQ3IDIxMiA2NDdINjE1TDYwNiA2MDJIMjIzTDE3MCAzNTRINDcxTDQ2MiAzMTBIMTYxTDEwNSA0Nkg0OThMNDg4IDBINDVMMTc2IDYxNlpNMzEwIDcxOVEyOTYgNzE5IDI5NiA3MzFRMjk2IDc0MyAzMTEgNzYxVDM2MiA4MTJRMzk3IDg0NCA0MjAgODYwVDQ0NSA4NzdRNDQ3IDg3NyA0NjIgODYxVDQ5OCA4MTRRNTIxIDc4MCA1MjggNzY0VDUzNSA3NDBRNTM1IDcyOSA1MzAgNzI0VDUxOCA3MTlRNTA4IDcxOSA0OTggNzMxVDQ2OCA3ODFRNDYwIDc5NSA0NTQgODA3VDQzOSA4MzRMMzg3IDc4MFEzNTUgNzQ2IDMzOCA3MzNUMzEwIDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgZ2x5cGgtbmFtZT0iRWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTk1IiBkPSJNMTc2IDYxNlExODMgNjQ3IDIxMiA2NDdINjE1TDYwNiA2MDJIMjIzTDE3MCAzNTRINDcxTDQ2MiAzMTBIMTYxTDEwNSA0Nkg0OThMNDg4IDBINDVMMTc2IDYxNlpNNDk1IDcxOVE0NTggNzE5IDQ1OCA3NDhRNDU4IDc2NiA0NjcgNzc5VDQ5NyA3OTNRNTM0IDc5MyA1MzQgNzY0UTUzNCA3NDYgNTI1IDczM1Q0OTUgNzE5Wk0zMzYgNzE5UTI5OSA3MTkgMjk5IDc0OFEyOTkgNzY2IDMwOCA3NzlUMzM3IDc5M1EzNzUgNzkzIDM3NSA3NjRRMzc1IDc0NiAzNjUgNzMzVDMzNiA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDQzsiIGdseXBoLW5hbWU9IklncmF2ZSIgaG9yaXotYWR2LXg9IjI2MSIgZD0iTTE5MCA2MjhRMTk0IDY1MCAyMTQgNjUwSDIyMVEyMzIgNjUwIDIzNiA2NDNUMjM5IDYyM0wxMDYgMEg1NkwxOTAgNjI4Wk0yNjYgNzIxUTI2NCA3MTkgMjUzIDcyMlQyMjMgNzM1VDE4MSA3NThUMTM0IDc5M1ExMTQgODEwIDEwOCA4MTlUMTAyIDgzOVExMDIgODQ4IDEwOSA4NTRUMTI1IDg2MFExMzMgODYwIDE0MyA4NTVUMTY4IDgzNVExOTIgODE1IDIxMCA3OTVUMjQyIDc1OVQyNjEgNzMzVDI2NiA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRDsiIGdseXBoLW5hbWU9IklhY3V0ZSIgaG9yaXotYWR2LXg9IjI2MSIgZD0iTTE5MCA2MjhRMTk0IDY1MCAyMTQgNjUwSDIyMVEyMzIgNjUwIDIzNiA2NDNUMjM5IDYyM0wxMDYgMEg1NkwxOTAgNjI4Wk0xOTIgNzIxUTE5MSA3MjIgMjAwIDczM1QyMjcgNzU5VDI2OSA3OTRUMzIxIDgzMVEzMzggODQ0IDM0OCA4NDdUMzY3IDg1MVEzNzYgODUxIDM4MiA4NDVUMzg4IDgzMVEzODggODIxIDM3OSA4MTJUMzQ2IDc4NlEzMTYgNzY4IDI4OSA3NTVUMjQwIDczM1QyMDYgNzIyVDE5MiA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRTsiIGdseXBoLW5hbWU9IkljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjYxIiBkPSJNMTkwIDYyOFExOTQgNjUwIDIxNCA2NTBIMjIxUTIzMiA2NTAgMjM2IDY0M1QyMzkgNjIzTDEwNiAwSDU2TDE5MCA2MjhaTTEyNyA3MTlRMTEzIDcxOSAxMTMgNzMxUTExMyA3NDMgMTI4IDc2MVQxNzkgODEyUTIxNCA4NDQgMjM3IDg2MFQyNjIgODc3UTI2NCA4NzcgMjc5IDg2MVQzMTUgODE0UTMzOCA3ODAgMzQ1IDc2NFQzNTIgNzQwUTM1MiA3MjkgMzQ3IDcyNFQzMzUgNzE5UTMyNSA3MTkgMzE1IDczMVQyODUgNzgxUTI3NyA3OTUgMjcxIDgwN1QyNTYgODM0TDIwNCA3ODBRMTcyIDc0NiAxNTUgNzMzVDEyNyA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRjsiIGdseXBoLW5hbWU9IklkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjI2MSIgZD0iTTE5MCA2MjhRMTk0IDY1MCAyMTQgNjUwSDIyMVEyMzIgNjUwIDIzNiA2NDNUMjM5IDYyM0wxMDYgMEg1NkwxOTAgNjI4Wk0zMTYgNzE5UTI3OSA3MTkgMjc5IDc0OFEyNzkgNzY2IDI4OCA3NzlUMzE4IDc5M1EzNTUgNzkzIDM1NSA3NjRRMzU1IDc0NiAzNDYgNzMzVDMxNiA3MTlaTTE1NyA3MTlRMTIwIDcxOSAxMjAgNzQ4UTEyMCA3NjYgMTI5IDc3OVQxNTggNzkzUTE5NiA3OTMgMTk2IDc2NFExOTYgNzQ2IDE4NiA3MzNUMTU3IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQwOyIgZ2x5cGgtbmFtZT0iRXRoIiBob3Jpei1hZHYteD0iNzI2IiBkPSJNMTI1IDBRODkgMCA5NyAzNUwxNTMgMzAySDc4UTU2IDMwMiA1NiAzMTRRNTYgMzE5IDU4IDMyN1Q2NSAzNDBRNzAgMzQ1IDg0IDM0NUgxNjJMMjIwIDYxNlEyMjUgNjQ3IDI1NiA2NDdIMzYzUTUxNSA2NDcgNTk4IDU3NlQ2ODIgMzc2UTY4MiAyOTcgNjU3IDIyOVQ1ODEgMTA5VDQ1NyAyOVQyODMgMEgxMjVaTTI5MSA0NFEzNzYgNDQgNDM5IDY5VDU0NSAxMzlUNjA4IDI0M1Q2MjkgMzY5UTYyOSA0NzkgNTYwIDU0MVQzNjAgNjAzSDI2N0wyMTIgMzQ1SDQzNlE0NTggMzQ1IDQ1OCAzMzNRNDU4IDMyOCA0NTYgMzIwVDQ0OSAzMDdRNDQyIDMwMiA0MzEgMzAySDIwM0wxNDggNDRIMjkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDE7IiBnbHlwaC1uYW1lPSJOdGlsZGUiIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0xNzYgNjE2UTE4NCA2NTAgMjExIDY1MEgyMjRRMjM2IDY1MCAyNDIgNjQzVDI1NiA2MjJMNTI3IDczTDY1MCA2NDdINjk2TDU2NCAyN1E1NjEgMTMgNTUzIDVUNTMyIC0zSDUyNlE1MTUgLTMgNTA5IDRUNDk0IDI1TDIxNyA1ODhMOTEgMEg0NUwxNzYgNjE2Wk01MjIgNzE4UTQ5NyA3MTggNDgxIDczMFQ0NTAgNzU5UTQzNiA3NzQgNDI3IDc4MVQ0MDcgNzg4UTM5MiA3ODggMzgzIDc3N1QzNjggNzQ2UTM2MCA3MjMgMzQ0IDcyM1EzMzYgNzIzIDMyNyA3MzBRMzM1IDc3NSAzNTYgODAyVDQxMyA4MjlRNDM4IDgyOSA0NTQgODE2VDQ4NSA3ODdRNDk4IDc3MiA1MDcgNzY1VDUyOCA3NThRNTQyIDc1OCA1NTEgNzY5VDU2NyA4MDBRNTcxIDgxMSA1NzYgODE3VDU5MCA4MjNRNTk4IDgyMyA2MDcgODE2UTU5OSA3NzEgNTc4IDc0NVQ1MjIgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDI7IiBnbHlwaC1uYW1lPSJPZ3JhdmUiIGhvcml6LWFkdi14PSI3NjEiIGQ9Ik0zNjMgLTEwUTI5OCAtMTAgMjQ2IDExVDE1NiA2OVQ5OSAxNThUNzkgMjY5UTc5IDM1MyAxMDggNDI0VDE4NyA1NDdUMzAxIDYyOFQ0MzUgNjU3UTUwMSA2NTcgNTUzIDYzNlQ2NDIgNTc4VDY5OSA0ODlUNzE5IDM3OFE3MTkgMjk0IDY4OSAyMjNUNjEwIDEwMVQ0OTYgMjBUMzYzIC0xMFpNMzY4IDM0UTQyNSAzNCA0NzkgNTlUNTc0IDEzMFQ2NDEgMjM4VDY2NiAzNzVRNjY2IDQyNSA2NTAgNDY4VDYwNCA1NDRUNTMwIDU5NVQ0MzAgNjE0UTM3MyA2MTQgMzIwIDU4OVQyMjQgNTE3VDE1NyA0MDlUMTMyIDI3M1ExMzIgMjIzIDE0OCAxNzlUMTk0IDEwM1QyNjggNTNUMzY4IDM0Wk01MDkgNzIxUTUwNyA3MTkgNDk2IDcyMlQ0NjYgNzM1VDQyNCA3NThUMzc3IDc5M1EzNTcgODEwIDM1MSA4MTlUMzQ1IDgzOVEzNDUgODQ4IDM1MiA4NTRUMzY4IDg2MFEzNzYgODYwIDM4NiA4NTVUNDExIDgzNVE0MzUgODE1IDQ1MyA3OTVUNDg1IDc1OVQ1MDQgNzMzVDUwOSA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMzsiIGdseXBoLW5hbWU9Ik9hY3V0ZSIgaG9yaXotYWR2LXg9Ijc2MSIgZD0iTTM2MyAtMTBRMjk4IC0xMCAyNDYgMTFUMTU2IDY5VDk5IDE1OFQ3OSAyNjlRNzkgMzUzIDEwOCA0MjRUMTg3IDU0N1QzMDEgNjI4VDQzNSA2NTdRNTAxIDY1NyA1NTMgNjM2VDY0MiA1NzhUNjk5IDQ4OVQ3MTkgMzc4UTcxOSAyOTQgNjg5IDIyM1Q2MTAgMTAxVDQ5NiAyMFQzNjMgLTEwWk0zNjggMzRRNDI1IDM0IDQ3OSA1OVQ1NzQgMTMwVDY0MSAyMzhUNjY2IDM3NVE2NjYgNDI1IDY1MCA0NjhUNjA0IDU0NFQ1MzAgNTk1VDQzMCA2MTRRMzczIDYxNCAzMjAgNTg5VDIyNCA1MTdUMTU3IDQwOVQxMzIgMjczUTEzMiAyMjMgMTQ4IDE3OVQxOTQgMTAzVDI2OCA1M1QzNjggMzRaTTM4NyA3MjFRMzg2IDcyMiAzOTUgNzMzVDQyMiA3NTlUNDY0IDc5NFQ1MTYgODMxUTUzMyA4NDQgNTQzIDg0N1Q1NjIgODUxUTU3MSA4NTEgNTc3IDg0NVQ1ODMgODMxUTU4MyA4MjEgNTc0IDgxMlQ1NDEgNzg2UTUxMSA3NjggNDg0IDc1NVQ0MzUgNzMzVDQwMSA3MjJUMzg3IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgZ2x5cGgtbmFtZT0iT2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NjEiIGQ9Ik0zNjMgLTEwUTI5OCAtMTAgMjQ2IDExVDE1NiA2OVQ5OSAxNThUNzkgMjY5UTc5IDM1MyAxMDggNDI0VDE4NyA1NDdUMzAxIDYyOFQ0MzUgNjU3UTUwMSA2NTcgNTUzIDYzNlQ2NDIgNTc4VDY5OSA0ODlUNzE5IDM3OFE3MTkgMjk0IDY4OSAyMjNUNjEwIDEwMVQ0OTYgMjBUMzYzIC0xMFpNMzY4IDM0UTQyNSAzNCA0NzkgNTlUNTc0IDEzMFQ2NDEgMjM4VDY2NiAzNzVRNjY2IDQyNSA2NTAgNDY4VDYwNCA1NDRUNTMwIDU5NVQ0MzAgNjE0UTM3MyA2MTQgMzIwIDU4OVQyMjQgNTE3VDE1NyA0MDlUMTMyIDI3M1ExMzIgMjIzIDE0OCAxNzlUMTk0IDEwM1QyNjggNTNUMzY4IDM0Wk0zNTcgNzE5UTM0MyA3MTkgMzQzIDczMVEzNDMgNzQzIDM1OCA3NjFUNDA5IDgxMlE0NDQgODQ0IDQ2NyA4NjBUNDkyIDg3N1E0OTQgODc3IDUwOSA4NjFUNTQ1IDgxNFE1NjggNzgwIDU3NSA3NjRUNTgyIDc0MFE1ODIgNzI5IDU3NyA3MjRUNTY1IDcxOVE1NTUgNzE5IDU0NSA3MzFUNTE1IDc4MVE1MDcgNzk1IDUwMSA4MDdUNDg2IDgzNEw0MzQgNzgwUTQwMiA3NDYgMzg1IDczM1QzNTcgNzE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBnbHlwaC1uYW1lPSJPdGlsZGUiIGhvcml6LWFkdi14PSI3NjEiIGQ9Ik0zNjMgLTEwUTI5OCAtMTAgMjQ2IDExVDE1NiA2OVQ5OSAxNThUNzkgMjY5UTc5IDM1MyAxMDggNDI0VDE4NyA1NDdUMzAxIDYyOFQ0MzUgNjU3UTUwMSA2NTcgNTUzIDYzNlQ2NDIgNTc4VDY5OSA0ODlUNzE5IDM3OFE3MTkgMjk0IDY4OSAyMjNUNjEwIDEwMVQ0OTYgMjBUMzYzIC0xMFpNMzY4IDM0UTQyNSAzNCA0NzkgNTlUNTc0IDEzMFQ2NDEgMjM4VDY2NiAzNzVRNjY2IDQyNSA2NTAgNDY4VDYwNCA1NDRUNTMwIDU5NVQ0MzAgNjE0UTM3MyA2MTQgMzIwIDU4OVQyMjQgNTE3VDE1NyA0MDlUMTMyIDI3M1ExMzIgMjIzIDE0OCAxNzlUMTk0IDEwM1QyNjggNTNUMzY4IDM0Wk01MTAgNzE4UTQ4NSA3MTggNDY5IDczMFQ0MzggNzU5UTQyNCA3NzQgNDE1IDc4MVQzOTUgNzg4UTM4MCA3ODggMzcxIDc3N1QzNTYgNzQ2UTM0OCA3MjMgMzMyIDcyM1EzMjQgNzIzIDMxNSA3MzBRMzIzIDc3NSAzNDQgODAyVDQwMSA4MjlRNDI2IDgyOSA0NDIgODE2VDQ3MyA3ODdRNDg2IDc3MiA0OTUgNzY1VDUxNiA3NThRNTMwIDc1OCA1MzkgNzY5VDU1NSA4MDBRNTU5IDgxMSA1NjQgODE3VDU3OCA4MjNRNTg2IDgyMyA1OTUgODE2UTU4NyA3NzEgNTY2IDc0NVQ1MTAgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDY7IiBnbHlwaC1uYW1lPSJPZGllcmVzaXMiIGhvcml6LWFkdi14PSI3NjEiIGQ9Ik0zNjMgLTEwUTI5OCAtMTAgMjQ2IDExVDE1NiA2OVQ5OSAxNThUNzkgMjY5UTc5IDM1MyAxMDggNDI0VDE4NyA1NDdUMzAxIDYyOFQ0MzUgNjU3UTUwMSA2NTcgNTUzIDYzNlQ2NDIgNTc4VDY5OSA0ODlUNzE5IDM3OFE3MTkgMjk0IDY4OSAyMjNUNjEwIDEwMVQ0OTYgMjBUMzYzIC0xMFpNMzY4IDM0UTQyNSAzNCA0NzkgNTlUNTc0IDEzMFQ2NDEgMjM4VDY2NiAzNzVRNjY2IDQyNSA2NTAgNDY4VDYwNCA1NDRUNTMwIDU5NVQ0MzAgNjE0UTM3MyA2MTQgMzIwIDU4OVQyMjQgNTE3VDE1NyA0MDlUMTMyIDI3M1ExMzIgMjIzIDE0OCAxNzlUMTk0IDEwM1QyNjggNTNUMzY4IDM0Wk01NDUgNzE5UTUwOCA3MTkgNTA4IDc0OFE1MDggNzY2IDUxNyA3NzlUNTQ3IDc5M1E1ODQgNzkzIDU4NCA3NjRRNTg0IDc0NiA1NzUgNzMzVDU0NSA3MTlaTTM4NiA3MTlRMzQ5IDcxOSAzNDkgNzQ4UTM0OSA3NjYgMzU4IDc3OVQzODcgNzkzUTQyNSA3OTMgNDI1IDc2NFE0MjUgNzQ2IDQxNSA3MzNUMzg2IDcxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ3OyIgZ2x5cGgtbmFtZT0ibXVsdGlwbHkiIGhvcml6LWFkdi14PSI1NzMiIGQ9Ik0yOTIgMjM1TDEzMyA5OVExMjQgOTAgMTE1IDkxVDEwMCA5OVQ5NCAxMTVUMTA0IDEzM0wyNjUgMjcxTDE2MyA0MDlRMTU2IDQxOSAxNTcgNDI4VDE2NSA0NDJUMTgxIDQ0NlQxOTggNDM1TDI5OSAyOTlMNDU3IDQzNFE0NjYgNDQzIDQ3NSA0NDJUNDkwIDQzNFQ0OTUgNDE4VDQ4NiA0MDBMMzI2IDI2M0w0MjkgMTI0UTQzNiAxMTQgNDM1IDEwNVQ0MjcgOTFUNDExIDg3VDM5NCA5OEwyOTIgMjM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDg7IiBnbHlwaC1uYW1lPSJPc2xhc2giIGhvcml6LWFkdi14PSI3NjEiIGQ9Ik0zOSAtMjlRMzcgLTMxIDI4IC0yNFQxOSAtNVExOSAxNCA0MSAzNUwxMjYgMTExUTEwMyAxNDUgOTEgMTg1VDc5IDI2OVE3OSAzNTMgMTA4IDQyNFQxODcgNTQ3VDMwMSA2MjhUNDM1IDY1N1E0OTkgNjU3IDU1MCA2MzZUNjM5IDU3OEw3NDAgNjcwUTc0MiA2NzIgNzUxIDY2NFQ3NjEgNjQ1UTc2MSA2MzQgNzU2IDYyNlQ3MzkgNjA2TDY2OSA1NDJRNjkzIDUwOCA3MDYgNDY3VDcxOSAzNzhRNzE5IDI5NCA2ODkgMjIzVDYxMCAxMDFUNDk2IDIwVDM2MyAtMTBRMjk3IC0xMCAyNDQgMTNUMTUzIDc1TDM5IC0yOVpNNjAzIDU0NlE1NzQgNTc4IDUzMSA1OTZUNDMwIDYxNFEzNzMgNjE0IDMyMCA1ODlUMjI0IDUxN1QxNTcgNDA5VDEzMiAyNzNRMTMyIDIzNiAxNDAgMjA0VDE2NSAxNDRMNjAzIDU0NlpNMzY4IDM0UTQyNSAzNCA0NzkgNTlUNTc0IDEzMFQ2NDEgMjM4VDY2NiAzNzVRNjY2IDQ1MyA2MjkgNTEwTDE5MCAxMDdRMjE5IDczIDI2NCA1NFQzNjggMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGdseXBoLW5hbWU9IlVncmF2ZSIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTMxOSAtMTBRMjU1IC0xMCAyMDYgOFQxMjggNjJUODkgMTUyVDk1IDI4MEwxNjkgNjI3UTE3MiA2MzkgMTc3IDY0NFQxOTQgNjUwSDIwMVEyMjQgNjUwIDIxOCA2MjRMMTQ1IDI3NlExMTkgMTUzIDE2NiA5NFQzMjIgMzVRNDA2IDM1IDQ1OCA4NlQ1MzEgMjM5TDYxNCA2MjdRNjE4IDY1MCA2MzkgNjUwSDY0NVE2NjggNjUwIDY2MiA2MjRMNTc5IDIyOVE1NTMgMTExIDQ4OSA1MVQzMTkgLTEwWk00ODEgNzExUTQ3OSA3MDkgNDY4IDcxMlQ0MzggNzI1VDM5NiA3NDhUMzQ5IDc4M1EzMjkgODAwIDMyMyA4MDlUMzE3IDgyOVEzMTcgODM4IDMyNCA4NDRUMzQwIDg1MFEzNDggODUwIDM1OCA4NDVUMzgzIDgyNVE0MDcgODA1IDQyNSA3ODVUNDU3IDc0OVQ0NzYgNzIzVDQ4MSA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQTsiIGdseXBoLW5hbWU9IlVhY3V0ZSIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTMxOSAtMTBRMjU1IC0xMCAyMDYgOFQxMjggNjJUODkgMTUyVDk1IDI4MEwxNjkgNjI3UTE3MiA2MzkgMTc3IDY0NFQxOTQgNjUwSDIwMVEyMjQgNjUwIDIxOCA2MjRMMTQ1IDI3NlExMTkgMTUzIDE2NiA5NFQzMjIgMzVRNDA2IDM1IDQ1OCA4NlQ1MzEgMjM5TDYxNCA2MjdRNjE4IDY1MCA2MzkgNjUwSDY0NVE2NjggNjUwIDY2MiA2MjRMNTc5IDIyOVE1NTMgMTExIDQ4OSA1MVQzMTkgLTEwWk0zNjIgNzExUTM2MSA3MTIgMzcwIDcyM1QzOTcgNzQ5VDQzOSA3ODRUNDkxIDgyMVE1MDggODM0IDUxOCA4MzdUNTM3IDg0MVE1NDYgODQxIDU1MiA4MzVUNTU4IDgyMVE1NTggODExIDU0OSA4MDJUNTE2IDc3NlE0ODYgNzU4IDQ1OSA3NDVUNDEwIDcyM1QzNzYgNzEyVDM2MiA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQjsiIGdseXBoLW5hbWU9IlVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjY1IiBkPSJNMzE5IC0xMFEyNTUgLTEwIDIwNiA4VDEyOCA2MlQ4OSAxNTJUOTUgMjgwTDE2OSA2MjdRMTcyIDYzOSAxNzcgNjQ0VDE5NCA2NTBIMjAxUTIyNCA2NTAgMjE4IDYyNEwxNDUgMjc2UTExOSAxNTMgMTY2IDk0VDMyMiAzNVE0MDYgMzUgNDU4IDg2VDUzMSAyMzlMNjE0IDYyN1E2MTggNjUwIDYzOSA2NTBINjQ1UTY2OCA2NTAgNjYyIDYyNEw1NzkgMjI5UTU1MyAxMTEgNDg5IDUxVDMxOSAtMTBaTTMyNiA3MDlRMzEyIDcwOSAzMTIgNzIxUTMxMiA3MzMgMzI3IDc1MVQzNzggODAyUTQxMyA4MzQgNDM2IDg1MFQ0NjEgODY3UTQ2MyA4NjcgNDc4IDg1MVQ1MTQgODA0UTUzNyA3NzAgNTQ0IDc1NFQ1NTEgNzMwUTU1MSA3MTkgNTQ2IDcxNFQ1MzQgNzA5UTUyNCA3MDkgNTE0IDcyMVQ0ODQgNzcxUTQ3NiA3ODUgNDcwIDc5N1Q0NTUgODI0TDQwMyA3NzBRMzcxIDczNiAzNTQgNzIzVDMyNiA3MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQzsiIGdseXBoLW5hbWU9IlVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTMxOSAtMTBRMjU1IC0xMCAyMDYgOFQxMjggNjJUODkgMTUyVDk1IDI4MEwxNjkgNjI3UTE3MiA2MzkgMTc3IDY0NFQxOTQgNjUwSDIwMVEyMjQgNjUwIDIxOCA2MjRMMTQ1IDI3NlExMTkgMTUzIDE2NiA5NFQzMjIgMzVRNDA2IDM1IDQ1OCA4NlQ1MzEgMjM5TDYxNCA2MjdRNjE4IDY1MCA2MzkgNjUwSDY0NVE2NjggNjUwIDY2MiA2MjRMNTc5IDIyOVE1NTMgMTExIDQ4OSA1MVQzMTkgLTEwWk01MTUgNzA5UTQ3OCA3MDkgNDc4IDczOFE0NzggNzU2IDQ4NyA3NjlUNTE3IDc4M1E1NTQgNzgzIDU1NCA3NTRRNTU0IDczNiA1NDUgNzIzVDUxNSA3MDlaTTM1NiA3MDlRMzE5IDcwOSAzMTkgNzM4UTMxOSA3NTYgMzI4IDc2OVQzNTcgNzgzUTM5NSA3ODMgMzk1IDc1NFEzOTUgNzM2IDM4NSA3MjNUMzU2IDcwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEREOyIgZ2x5cGgtbmFtZT0iWWFjdXRlIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNMjcxIDI3OUwxMDggNjQ3SDE2MkwzMDMgMzIyTDU4NCA2NTFRNTg1IDY1MiA1OTMgNjUwVDYwOCA2NDJUNjE0IDYyMlQ1OTMgNTg2TDMyMCAyNzRMMjYyIDBIMjEyTDI3MSAyNzlaTTMyOCA3MDhRMzI3IDcwOSAzMzYgNzIwVDM2MyA3NDZUNDA1IDc4MVQ0NTcgODE4UTQ3NCA4MzEgNDg0IDgzNFQ1MDMgODM4UTUxMiA4MzggNTE4IDgzMlQ1MjQgODE4UTUyNCA4MDggNTE1IDc5OVQ0ODIgNzczUTQ1MiA3NTUgNDI1IDc0MlQzNzYgNzIwVDM0MiA3MDlUMzI4IDcwOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgZ2x5cGgtbmFtZT0iVGhvcm4iIGhvcml6LWFkdi14PSI1ODUiIGQ9Ik02OCAtM1E0NCAtMyA1MCAyM0wxNzggNjI3UTE4MyA2NTAgMjAzIDY1MEgyMTBRMjMzIDY1MCAyMjggNjI0TDIwNSA1MjFIMzMyUTQzOCA1MjEgNDkyIDQ3OFQ1NDcgMzU1UTU0NyAyNTMgNDgyIDE5M1QyOTEgMTMzSDEyM0w5OSAyMFE5NSAtMyA3NCAtM0g2OFpNMzAwIDE3N1EzOTcgMTc3IDQ0NiAyMjNUNDk2IDM0OFE0OTYgNDEwIDQ1NSA0NDNUMzI5IDQ3NkgxOTZMMTMyIDE3N0gzMDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERjsiIGdseXBoLW5hbWU9Imdlcm1hbmRibHMiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik0yODkgLTEwUTI0NyAtMTAgMjE5IDBUMTczIDI3UTE2MCA0MSAxNTYgNTJUMTUxIDcxUTE1MSA3OSAxNTQgODVUMTYyIDk1VDE3MSAxMDBUMTc2IDEwMVExODggNzUgMjE0IDU0VDI5MiAzMlEzMjMgMzIgMzQ5IDQ0VDM5NCA3OFQ0MjQgMTI5VDQzNSAxOTNRNDM1IDIzOSA0MDQgMjc1VDMwMSAzMzVRMjgxIDM0MiAyNzQgMzUwVDI2NiAzNjhRMjY2IDM4NSAyNzMgMzk1VDI4NSA0MDhRMzgyIDQwOCA0MjggNDM4VDQ3NCA1MzZRNDc0IDU4NCA0MzkgNjEzVDM0NSA2NDJRMjg2IDY0MiAyNDQgNjAwVDE4MiA0NjNMODQgMEgzNkwxMzYgNDY3UTE2MCA1ODAgMjE1IDYzMlQzNDYgNjg1UTQyOSA2ODUgNDc1IDY0NVQ1MjIgNTM5UTUyMiA0NjQgNDczIDQyMFQzMTggMzcwUTM5MyAzNTAgNDM4IDMwNlQ0ODMgMTk3UTQ4MyAxNTQgNDY5IDExNlQ0MjggNTBUMzY3IDZUMjg5IC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUwOyIgZ2x5cGgtbmFtZT0iYWdyYXZlIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMlpNNDA0IDU0N1E0MDIgNTQ1IDM5MSA1NDhUMzYxIDU2MVQzMTkgNTg0VDI3MiA2MTlRMjUyIDYzNiAyNDYgNjQ1VDI0MCA2NjVRMjQwIDY3NCAyNDcgNjgwVDI2MyA2ODZRMjcxIDY4NiAyODEgNjgxVDMwNiA2NjFRMzMwIDY0MSAzNDggNjIxVDM4MCA1ODVUMzk5IDU1OVQ0MDQgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBnbHlwaC1uYW1lPSJhYWN1dGUiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik00OTYgLTdRNDYxIC03IDQ0NCAxOFQ0MzcgOTRWOTZRNDA0IDQ0IDM1NSAxN1QyNTAgLTEwUTIwOSAtMTAgMTc0IDNUMTEyIDQzVDcwIDEwNlQ1NCAxOTNRNTQgMjQ4IDczIDMwMFQxMjggMzkyVDIxMSA0NThUMzE3IDQ4M1EzNTIgNDgzIDM4MSA0NzRUNDMzIDQ0OFQ0NzIgNDExVDQ5NiAzNjZMNTE5IDQ3M0g1NjZMNDg1IDk1UTQ3NyA1NCA0ODkgNDFUNTI5IDI3UTUyOSAyNyA1MjkgMjJUNTI3IDEwVDUxNyAtMVQ0OTYgLTdaTTI1NiAzMlEyOTUgMzIgMzI5IDQ3VDM5MSA4N1Q0MzcgMTQ0VDQ2MyAyMTJMNDgyIDI5OFE0NjkgMzYwIDQyOCA0MDBUMzE0IDQ0MVEyNjYgNDQxIDIyNyA0MjBUMTYxIDM2M1QxMTggMjg0VDEwMyAxOTRRMTAzIDE1NiAxMTUgMTI2VDE0NyA3NVQxOTYgNDNUMjU2IDMyWk0zMDMgNTQ3UTMwMiA1NDggMzExIDU1OVQzMzggNTg1VDM4MCA2MjBUNDMyIDY1N1E0NDkgNjcwIDQ1OSA2NzNUNDc4IDY3N1E0ODcgNjc3IDQ5MyA2NzFUNDk5IDY1N1E0OTkgNjQ3IDQ5MCA2MzhUNDU3IDYxMlE0MjcgNTk0IDQwMCA1ODFUMzUxIDU1OVQzMTcgNTQ4VDMwMyA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMjsiIGdseXBoLW5hbWU9ImFjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMlpNMjUyIDU0NVEyMzggNTQ1IDIzOCA1NTdRMjM4IDU2OSAyNTMgNTg3VDMwNCA2MzhRMzM5IDY3MCAzNjIgNjg2VDM4NyA3MDNRMzg5IDcwMyA0MDQgNjg3VDQ0MCA2NDBRNDYzIDYwNiA0NzAgNTkwVDQ3NyA1NjZRNDc3IDU1NSA0NzIgNTUwVDQ2MCA1NDVRNDUwIDU0NSA0NDAgNTU3VDQxMCA2MDdRNDAyIDYyMSAzOTYgNjMzVDM4MSA2NjBMMzI5IDYwNlEyOTcgNTcyIDI4MCA1NTlUMjUyIDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUzOyIgZ2x5cGgtbmFtZT0iYXRpbGRlIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMlpNNDE5IDU0NFEzOTQgNTQ0IDM3OCA1NTZUMzQ3IDU4NVEzMzMgNjAwIDMyNCA2MDdUMzA0IDYxNFEyODkgNjE0IDI4MCA2MDNUMjY1IDU3MlEyNTcgNTQ5IDI0MSA1NDlRMjMzIDU0OSAyMjQgNTU2UTIzMiA2MDEgMjUzIDYyOFQzMTAgNjU1UTMzNSA2NTUgMzUxIDY0MlQzODIgNjEzUTM5NSA1OTggNDA0IDU5MVQ0MjUgNTg0UTQzOSA1ODQgNDQ4IDU5NVQ0NjQgNjI2UTQ2OCA2MzcgNDczIDY0M1Q0ODcgNjQ5UTQ5NSA2NDkgNTA0IDY0MlE0OTYgNTk3IDQ3NSA1NzFUNDE5IDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU0OyIgZ2x5cGgtbmFtZT0iYWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMlpNNDQwIDU0NVE0MDMgNTQ1IDQwMyA1NzRRNDAzIDU5MiA0MTIgNjA1VDQ0MiA2MTlRNDc5IDYxOSA0NzkgNTkwUTQ3OSA1NzIgNDcwIDU1OVQ0NDAgNTQ1Wk0yODEgNTQ1UTI0NCA1NDUgMjQ0IDU3NFEyNDQgNTkyIDI1MyA2MDVUMjgyIDYxOVEzMjAgNjE5IDMyMCA1OTBRMzIwIDU3MiAzMTAgNTU5VDI4MSA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNTsiIGdseXBoLW5hbWU9ImFyaW5nIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMlpNMzY3IDU0NFEzMTkgNTQ0IDI5MyA1NzJUMjY2IDYzOFEyNjYgNjYzIDI3NSA2ODVUMzAwIDcyNVQzMzggNzUyVDM4NiA3NjNRNDM0IDc2MyA0NjAgNzM1VDQ4NyA2NjlRNDg3IDY0NCA0NzggNjIyVDQ1MyA1ODJUNDE0IDU1NFQzNjcgNTQ0Wk0zNjggNTc4UTM4NiA1NzggNDAwIDU4NVQ0MjYgNjA1VDQ0MyA2MzRUNDQ5IDY2N1E0NDkgNjkxIDQzMiA3MTBUMzg1IDczMFEzNjcgNzMwIDM1MyA3MjNUMzI3IDcwM1QzMTAgNjc0VDMwNCA2NDFRMzA0IDYxNyAzMjEgNTk4VDM2OCA1NzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNjsiIGdseXBoLW5hbWU9ImFlIiBob3Jpei1hZHYteD0iODg0IiBkPSJNMTk2IC0xMFExMjEgLTEwIDc2IDIxVDMwIDEwOFEzMCAxNjcgNjUgMjAyUTEwMiAyNDAgMTgyIDI1N1QzOTkgMjc1SDQxNEw0MTYgMjg0UTQzMSAzNTkgMzk0IDM5OVQyNzggNDQwUTIyMCA0NDAgMTgyIDQyMFQxMjAgMzY1UTExOSAzNjQgMTA5IDM3MFQ5OSAzOTFROTkgNDA3IDEyMSA0MjhRMTQyIDQ0OSAxODEgNDY2VDI4MyA0ODNRMzU4IDQ4MyA0MDYgNDQ5VDQ2MCAzNDdRNDk2IDQxMCA1NTUgNDQ2VDY5MiA0ODNRNzY5IDQ4MyA4MTEgNDQ5VDg1NCAzNjRRODU0IDMyNSA4MzcgMjk2VDc3NCAyNDhUNjUwIDIyM1Q0NTAgMjI2UTQ0NyAyMDUgNDQ3IDE4NFE0NDcgMTE2IDQ4NiA3NFQ2MDEgMzFRNjU4IDMxIDY5OCA1MlQ3NjYgMTEzUTc2NyAxMTQgNzcxIDExM1Q3ODAgMTA5VDc4OCAxMDFUNzkyIDkwUTc5MiA4MSA3ODcgNzNUNzY5IDUxUTcwOSAtMTAgNTk5IC0xMFE1MTggLTEwIDQ3MiAyN1Q0MTMgMTI0UTM4NSA2MSAzMjkgMjZUMTk2IC0xMFpNMjAzIDMwUTIzNiAzMCAyNjcgNDBUMzIzIDcxVDM2NyAxMTlUMzk0IDE4M0w0MDYgMjM3SDM3OVEzMTUgMjM1IDI3MCAyMzJUMTkyIDIyMVQxMzggMjA0VDEwMyAxODBRNzkgMTU1IDc5IDExMlE3OSA3NSAxMTMgNTNUMjAzIDMwWk02OTAgNDQxUTY0OSA0NDEgNjEzIDQyOFQ1NDcgMzkxVDQ5NSAzMzVUNDYwIDI2NlE1NjYgMjU4IDYzMyAyNjNUNzM4IDI4M1Q3OTEgMzE4VDgwNiAzNjNRODA2IDM5MiA3NzcgNDE2VDY5MCA0NDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNzsiIGdseXBoLW5hbWU9ImNjZWRpbGxhIiBkPSJNMjczIC0xMFEyMjcgLTEwIDE4NyA0VDExNyA0NlQ3MCAxMTRUNTMgMjA2UTUzIDI2MCA3MyAzMTBUMTI4IDM5OFQyMTIgNDYwVDMxNiA0ODNRMzc0IDQ4MyA0MTIgNDY2VDQ3NCA0MjRRNDk1IDQwMyA1MDQgMzgwVDUxNCAzNDFRNTE0IDMzMCA1MDkgMzI0VDQ5NyAzMTRUNDg1IDMxMVQ0NzggMzEzUTQ3NCAzMzkgNDYyIDM2MlQ0MzAgNDAyVDM4MSA0MzBUMzE3IDQ0MFEyNzAgNDQwIDIzMSA0MjFUMTYzIDM2OVQxMTggMjk1VDEwMiAyMDlRMTAyIDE2OCAxMTUgMTM2VDE1MSA4MVQyMDYgNDZUMjc3IDMzUTMzNiAzMyAzNzUgNjFUNDM3IDEyN1E0MzggMTI4IDQ0MiAxMjdUNDUyIDEyNFQ0NjEgMTE2VDQ2NSAxMDRRNDY1IDg0IDQzNCA1MlE0MTAgMjkgMzY5IDEwVDI3MyAtMTBaTTE1NyAtMjE5UTE1NSAtMjIyIDE1MSAtMjIxVDE0MiAtMjE3VDEzNiAtMjExVDEzNSAtMjA0UTE2NCAtMTYwIDE4NyAtMTI1UTE5NyAtMTExIDIwNiAtOTdUMjIzIC03MVEyMzIgLTU4IDIzOSAtNDZRMjQwIC00NSAyNDYgLTQ2VDI2MSAtNTBUMjc1IC01OFQyODIgLTczUTI4MiAtOTAgMjY1IC0xMDhMMTU3IC0yMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFODsiIGdseXBoLW5hbWU9ImVncmF2ZSIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1NCAtMTBRMjA0IC0xMCAxNjcgNFQxMDMgNDNUNjQgMTA0VDUxIDE4MVE1MSAyNDQgNzMgMjk5VDEzNiAzOTVUMjI5IDQ1OVQzNDYgNDgzUTQyNCA0ODMgNDY3IDQ0OVQ1MTAgMzY0UTUxMCAzMzIgNDk4IDMwNlQ0NTQgMjYwVDM2OSAyMzFUMjM1IDIyMFEyMDYgMjIwIDE3NCAyMjFUMTAzIDIyN1ExMDAgMjA2IDEwMCAxODRRMTAwIDExNiAxMzkgNzRUMjU2IDMxUTMxNCAzMSAzNTQgNTJUNDIyIDExM1E0MjMgMTE0IDQyNyAxMTNUNDM1IDEwOVQ0NDMgMTAxVDQ0NyA5MFE0NDcgODEgNDQzIDczVDQyNCA1MVEzOTQgMjAgMzUzIDVUMjU0IC0xMFpNMzQzIDQ0MVEzMDIgNDQxIDI2NiA0MjhUMjAwIDM5MVQxNDggMzM3VDExMyAyNjhRMTQ3IDI2MyAxNzYgMjYyVDIzMSAyNjBRMzAwIDI2MCAzNDQgMjY5VDQxNSAyOTJUNDUxIDMyNFQ0NjEgMzYzUTQ2MSAzOTIgNDMyIDQxNlQzNDMgNDQxWk0zOTcgNTQ3UTM5NSA1NDUgMzg0IDU0OFQzNTQgNTYxVDMxMiA1ODRUMjY1IDYxOVEyNDUgNjM2IDIzOSA2NDVUMjMzIDY2NVEyMzMgNjc0IDI0MCA2ODBUMjU2IDY4NlEyNjQgNjg2IDI3NCA2ODFUMjk5IDY2MVEzMjMgNjQxIDM0MSA2MjFUMzczIDU4NVQzOTIgNTU5VDM5NyA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFOTsiIGdseXBoLW5hbWU9ImVhY3V0ZSIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1NCAtMTBRMjA0IC0xMCAxNjcgNFQxMDMgNDNUNjQgMTA0VDUxIDE4MVE1MSAyNDQgNzMgMjk5VDEzNiAzOTVUMjI5IDQ1OVQzNDYgNDgzUTQyNCA0ODMgNDY3IDQ0OVQ1MTAgMzY0UTUxMCAzMzIgNDk4IDMwNlQ0NTQgMjYwVDM2OSAyMzFUMjM1IDIyMFEyMDYgMjIwIDE3NCAyMjFUMTAzIDIyN1ExMDAgMjA2IDEwMCAxODRRMTAwIDExNiAxMzkgNzRUMjU2IDMxUTMxNCAzMSAzNTQgNTJUNDIyIDExM1E0MjMgMTE0IDQyNyAxMTNUNDM1IDEwOVQ0NDMgMTAxVDQ0NyA5MFE0NDcgODEgNDQzIDczVDQyNCA1MVEzOTQgMjAgMzUzIDVUMjU0IC0xMFpNMzQzIDQ0MVEzMDIgNDQxIDI2NiA0MjhUMjAwIDM5MVQxNDggMzM3VDExMyAyNjhRMTQ3IDI2MyAxNzYgMjYyVDIzMSAyNjBRMzAwIDI2MCAzNDQgMjY5VDQxNSAyOTJUNDUxIDMyNFQ0NjEgMzYzUTQ2MSAzOTIgNDMyIDQxNlQzNDMgNDQxWk0yOTggNTQ3UTI5NyA1NDggMzA2IDU1OVQzMzMgNTg1VDM3NSA2MjBUNDI3IDY1N1E0NDQgNjcwIDQ1NCA2NzNUNDczIDY3N1E0ODIgNjc3IDQ4OCA2NzFUNDk0IDY1N1E0OTQgNjQ3IDQ4NSA2MzhUNDUyIDYxMlE0MjIgNTk0IDM5NSA1ODFUMzQ2IDU1OVQzMTIgNTQ4VDI5OCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQTsiIGdseXBoLW5hbWU9ImVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjU0IC0xMFEyMDQgLTEwIDE2NyA0VDEwMyA0M1Q2NCAxMDRUNTEgMTgxUTUxIDI0NCA3MyAyOTlUMTM2IDM5NVQyMjkgNDU5VDM0NiA0ODNRNDI0IDQ4MyA0NjcgNDQ5VDUxMCAzNjRRNTEwIDMzMiA0OTggMzA2VDQ1NCAyNjBUMzY5IDIzMVQyMzUgMjIwUTIwNiAyMjAgMTc0IDIyMVQxMDMgMjI3UTEwMCAyMDYgMTAwIDE4NFExMDAgMTE2IDEzOSA3NFQyNTYgMzFRMzE0IDMxIDM1NCA1MlQ0MjIgMTEzUTQyMyAxMTQgNDI3IDExM1Q0MzUgMTA5VDQ0MyAxMDFUNDQ3IDkwUTQ0NyA4MSA0NDMgNzNUNDI0IDUxUTM5NCAyMCAzNTMgNVQyNTQgLTEwWk0zNDMgNDQxUTMwMiA0NDEgMjY2IDQyOFQyMDAgMzkxVDE0OCAzMzdUMTEzIDI2OFExNDcgMjYzIDE3NiAyNjJUMjMxIDI2MFEzMDAgMjYwIDM0NCAyNjlUNDE1IDI5MlQ0NTEgMzI0VDQ2MSAzNjNRNDYxIDM5MiA0MzIgNDE2VDM0MyA0NDFaTTI1NyA1NDVRMjQzIDU0NSAyNDMgNTU3UTI0MyA1NjkgMjU4IDU4N1QzMDkgNjM4UTM0NCA2NzAgMzY3IDY4NlQzOTIgNzAzUTM5NCA3MDMgNDA5IDY4N1Q0NDUgNjQwUTQ2OCA2MDYgNDc1IDU5MFQ0ODIgNTY2UTQ4MiA1NTUgNDc3IDU1MFQ0NjUgNTQ1UTQ1NSA1NDUgNDQ1IDU1N1Q0MTUgNjA3UTQwNyA2MjEgNDAxIDYzM1QzODYgNjYwTDMzNCA2MDZRMzAyIDU3MiAyODUgNTU5VDI1NyA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGdseXBoLW5hbWU9ImVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1NCAtMTBRMjA0IC0xMCAxNjcgNFQxMDMgNDNUNjQgMTA0VDUxIDE4MVE1MSAyNDQgNzMgMjk5VDEzNiAzOTVUMjI5IDQ1OVQzNDYgNDgzUTQyNCA0ODMgNDY3IDQ0OVQ1MTAgMzY0UTUxMCAzMzIgNDk4IDMwNlQ0NTQgMjYwVDM2OSAyMzFUMjM1IDIyMFEyMDYgMjIwIDE3NCAyMjFUMTAzIDIyN1ExMDAgMjA2IDEwMCAxODRRMTAwIDExNiAxMzkgNzRUMjU2IDMxUTMxNCAzMSAzNTQgNTJUNDIyIDExM1E0MjMgMTE0IDQyNyAxMTNUNDM1IDEwOVQ0NDMgMTAxVDQ0NyA5MFE0NDcgODEgNDQzIDczVDQyNCA1MVEzOTQgMjAgMzUzIDVUMjU0IC0xMFpNMzQzIDQ0MVEzMDIgNDQxIDI2NiA0MjhUMjAwIDM5MVQxNDggMzM3VDExMyAyNjhRMTQ3IDI2MyAxNzYgMjYyVDIzMSAyNjBRMzAwIDI2MCAzNDQgMjY5VDQxNSAyOTJUNDUxIDMyNFQ0NjEgMzYzUTQ2MSAzOTIgNDMyIDQxNlQzNDMgNDQxWk00NDQgNTQ1UTQwNyA1NDUgNDA3IDU3NFE0MDcgNTkyIDQxNiA2MDVUNDQ2IDYxOVE0ODMgNjE5IDQ4MyA1OTBRNDgzIDU3MiA0NzQgNTU5VDQ0NCA1NDVaTTI4NSA1NDVRMjQ4IDU0NSAyNDggNTc0UTI0OCA1OTIgMjU3IDYwNVQyODYgNjE5UTMyNCA2MTkgMzI0IDU5MFEzMjQgNTcyIDMxNCA1NTlUMjg1IDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVDOyIgZ2x5cGgtbmFtZT0iaWdyYXZlIiBob3Jpei1hZHYteD0iMjMwIiBkPSJNMTIyIC03UTg1IC03IDY4IDE3VDYxIDk0TDE0MiA0NzNIMTg5TDEwOSA5NVExMDEgNTQgMTEzIDQxVDE1NiAyN1ExNTYgMjcgMTU2IDIyVDE1NCAxMFQxNDQgLTFUMTIyIC03Wk0yMjEgNTQ3UTIxOSA1NDUgMjA4IDU0OFQxNzggNTYxVDEzNiA1ODRUODkgNjE5UTY5IDYzNiA2MyA2NDVUNTcgNjY1UTU3IDY3NCA2NCA2ODBUODAgNjg2UTg4IDY4NiA5OCA2ODFUMTIzIDY2MVExNDcgNjQxIDE2NSA2MjFUMTk3IDU4NVQyMTYgNTU5VDIyMSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRDsiIGdseXBoLW5hbWU9ImlhY3V0ZSIgaG9yaXotYWR2LXg9IjIzMCIgZD0iTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxNDIgNDczSDE4OUwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1pNMTI0IDU0N1ExMjMgNTQ4IDEzMiA1NTlUMTU5IDU4NVQyMDEgNjIwVDI1MyA2NTdRMjcwIDY3MCAyODAgNjczVDI5OSA2NzdRMzA4IDY3NyAzMTQgNjcxVDMyMCA2NTdRMzIwIDY0NyAzMTEgNjM4VDI3OCA2MTJRMjQ4IDU5NCAyMjEgNTgxVDE3MiA1NTlUMTM4IDU0OFQxMjQgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUU7IiBnbHlwaC1uYW1lPSJpY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjIzMCIgZD0iTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxNDIgNDczSDE4OUwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1pNNzkgNTQ1UTY1IDU0NSA2NSA1NTdRNjUgNTY5IDgwIDU4N1QxMzEgNjM4UTE2NiA2NzAgMTg5IDY4NlQyMTQgNzAzUTIxNiA3MDMgMjMxIDY4N1QyNjcgNjQwUTI5MCA2MDYgMjk3IDU5MFQzMDQgNTY2UTMwNCA1NTUgMjk5IDU1MFQyODcgNTQ1UTI3NyA1NDUgMjY3IDU1N1QyMzcgNjA3UTIyOSA2MjEgMjIzIDYzM1QyMDggNjYwTDE1NiA2MDZRMTI0IDU3MiAxMDcgNTU5VDc5IDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVGOyIgZ2x5cGgtbmFtZT0iaWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMjMwIiBkPSJNMTIyIC03UTg1IC03IDY4IDE3VDYxIDk0TDE0MiA0NzNIMTg5TDEwOSA5NVExMDEgNTQgMTEzIDQxVDE1NiAyN1ExNTYgMjcgMTU2IDIyVDE1NCAxMFQxNDQgLTFUMTIyIC03Wk0yNjcgNTQ1UTIzMCA1NDUgMjMwIDU3NFEyMzAgNTkyIDIzOSA2MDVUMjY5IDYxOVEzMDYgNjE5IDMwNiA1OTBRMzA2IDU3MiAyOTcgNTU5VDI2NyA1NDVaTTEwOCA1NDVRNzEgNTQ1IDcxIDU3NFE3MSA1OTIgODAgNjA1VDEwOSA2MTlRMTQ3IDYxOSAxNDcgNTkwUTE0NyA1NzIgMTM3IDU1OVQxMDggNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjA7IiBnbHlwaC1uYW1lPSJudWxsIiBob3Jpei1hZHYteD0iNTcyIiBkPSJNMjU4IC0xMFEyMTIgLTEwIDE3MyAyVDEwNSAzOVQ2MCA5OFQ0NCAxNzhRNDQgMjI4IDYxIDI3MlQxMTEgMzQ5VDE4OCA0MDFUMjkwIDQyMVEzMjYgNDIxIDM1NyA0MTJUNDEzIDM4N1Q0NTYgMzUyVDQ4NCAzMTNRNDg1IDMyMSA0ODUgMzI5VDQ4NSAzNDZRNDg1IDQxOCA0NTkgNDczVDM4NyA1NjlMMjMxIDQ4MlEyMjkgNDgwIDIyMyA0ODZUMjE3IDUwNVEyMTcgNTEyIDIyMSA1MTlUMjQ1IDUzN0wzNTEgNTk0UTMxMyA2MjAgMjcxIDYzMVQxOTIgNjQ2UTE5MCA2NDYgMTkwIDY1MlQxOTMgNjY1VDIwNSA2NzlUMjI4IDY4NVEyNTcgNjg1IDMwNCA2NzBUMzk3IDYxOEw1MjQgNjg3UTUyNiA2ODkgNTMyIDY4M1Q1MzggNjY1UTUzOCA2NTcgNTM0IDY1MFQ1MTAgNjMyTDQzMCA1OTBRNDc1IDU0NSA1MDMgNDg0VDUzMiAzNDJRNTMyIDI4NiA1MTcgMjI0VDQ2OCAxMTBUMzgzIDI0VDI1OCAtMTBaTTI1NyAzMVEzMDYgMzEgMzQzIDUwVDQwNiAxMDBUNDQ5IDE3NFQ0NzQgMjYyUTQ2OCAyODEgNDUyIDMwMlQ0MTEgMzQwVDM1NSAzNjhUMjg5IDM3OVEyMzkgMzc5IDIwMyAzNjRUMTQxIDMyMVQxMDQgMjU2VDkyIDE3N1E5MiAxNDIgMTA0IDExNVQxMzkgNzBUMTkxIDQxVDI1NyAzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYxOyIgZ2x5cGgtbmFtZT0ibnRpbGRlIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNNDYyIC03UTQzNiAtNyA0MTkgMTBUNDAyIDU5UTQwMiA3OSA0MDggMTEwVDQyNiAxODFRNDM4IDIyNiA0NDUgMjYwVDQ1MiAzMThRNDUyIDM3NSA0MjEgNDA2VDMzMyA0MzhRMjcwIDQzOCAyMjcgNDA1VDE1MCAzMTNMODMgMEgzNUwxMzcgNDczUTEzNyA0NzYgMTQ3IDQ3NlExNjEgNDc2IDE3MCA0NjZUMTczIDQyNEwxNjMgMzc5UTE5MyA0MjcgMjM3IDQ1NVQzMzkgNDgzUTQxNCA0ODMgNDU3IDQ0MFQ1MDEgMzI2UTUwMSAyOTkgNDkzIDI2MVQ0NzMgMTc1UTQ2MiAxMzYgNDU2IDEwOFQ0NTAgNjZRNDUwIDQzIDQ2MiAzNlQ0OTQgMjZRNDk1IDI2IDQ5NSAyMVQ0OTIgMTBUNDgyIC0yVDQ2MiAtN1pNNDE1IDU0NFEzOTAgNTQ0IDM3NCA1NTZUMzQzIDU4NVEzMjkgNjAwIDMyMCA2MDdUMzAwIDYxNFEyODUgNjE0IDI3NiA2MDNUMjYxIDU3MlEyNTMgNTQ5IDIzNyA1NDlRMjI5IDU0OSAyMjAgNTU2UTIyOCA2MDEgMjQ5IDYyOFQzMDYgNjU1UTMzMSA2NTUgMzQ3IDY0MlQzNzggNjEzUTM5MSA1OTggNDAwIDU5MVQ0MjEgNTg0UTQzNSA1ODQgNDQ0IDU5NVQ0NjAgNjI2UTQ2NCA2MzcgNDY5IDY0M1Q0ODMgNjQ5UTQ5MSA2NDkgNTAwIDY0MlE0OTIgNTk3IDQ3MSA1NzFUNDE1IDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYyOyIgZ2x5cGgtbmFtZT0ib2dyYXZlIiBob3Jpei1hZHYteD0iNTg3IiBkPSJNMjcwIC0xMFEyMjQgLTEwIDE4NSA2VDExNiA1MVQ3MSAxMTlUNTQgMjA3UTU0IDI2MyA3NCAzMTNUMTMwIDQwMVQyMTQgNDYxVDMxOCA0ODNRMzY0IDQ4MyA0MDMgNDY3VDQ3MiA0MjJUNTE3IDM1NFQ1MzQgMjY2UTUzNCAyMTAgNTE0IDE2MFQ0NTcgNzJUMzczIDEyVDI3MCAtMTBaTTI3MyAzMlEzMTYgMzIgMzU0IDUwVDQyMiAxMDBUNDY4IDE3NFQ0ODUgMjY1UTQ4NSAzMDMgNDczIDMzNVQ0MzggMzkwVDM4NCA0MjdUMzE1IDQ0MVEyNzIgNDQxIDIzNCA0MjNUMTY2IDM3M1QxMTkgMjk5VDEwMiAyMDhRMTAyIDE3MCAxMTUgMTM4VDE1MCA4M1QyMDQgNDZUMjczIDMyWk0zODQgNTQ3UTM4MiA1NDUgMzcxIDU0OFQzNDEgNTYxVDI5OSA1ODRUMjUyIDYxOVEyMzIgNjM2IDIyNiA2NDVUMjIwIDY2NVEyMjAgNjc0IDIyNyA2ODBUMjQzIDY4NlEyNTEgNjg2IDI2MSA2ODFUMjg2IDY2MVEzMTAgNjQxIDMyOCA2MjFUMzYwIDU4NVQzNzkgNTU5VDM4NCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMzsiIGdseXBoLW5hbWU9Im9hY3V0ZSIgaG9yaXotYWR2LXg9IjU4NyIgZD0iTTI3MCAtMTBRMjI0IC0xMCAxODUgNlQxMTYgNTFUNzEgMTE5VDU0IDIwN1E1NCAyNjMgNzQgMzEzVDEzMCA0MDFUMjE0IDQ2MVQzMTggNDgzUTM2NCA0ODMgNDAzIDQ2N1Q0NzIgNDIyVDUxNyAzNTRUNTM0IDI2NlE1MzQgMjEwIDUxNCAxNjBUNDU3IDcyVDM3MyAxMlQyNzAgLTEwWk0yNzMgMzJRMzE2IDMyIDM1NCA1MFQ0MjIgMTAwVDQ2OCAxNzRUNDg1IDI2NVE0ODUgMzAzIDQ3MyAzMzVUNDM4IDM5MFQzODQgNDI3VDMxNSA0NDFRMjcyIDQ0MSAyMzQgNDIzVDE2NiAzNzNUMTE5IDI5OVQxMDIgMjA4UTEwMiAxNzAgMTE1IDEzOFQxNTAgODNUMjA0IDQ2VDI3MyAzMlpNMjg3IDU0N1EyODYgNTQ4IDI5NSA1NTlUMzIyIDU4NVQzNjQgNjIwVDQxNiA2NTdRNDMzIDY3MCA0NDMgNjczVDQ2MiA2NzdRNDcxIDY3NyA0NzcgNjcxVDQ4MyA2NTdRNDgzIDY0NyA0NzQgNjM4VDQ0MSA2MTJRNDExIDU5NCAzODQgNTgxVDMzNSA1NTlUMzAxIDU0OFQyODcgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjQ7IiBnbHlwaC1uYW1lPSJvY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU4NyIgZD0iTTI3MCAtMTBRMjI0IC0xMCAxODUgNlQxMTYgNTFUNzEgMTE5VDU0IDIwN1E1NCAyNjMgNzQgMzEzVDEzMCA0MDFUMjE0IDQ2MVQzMTggNDgzUTM2NCA0ODMgNDAzIDQ2N1Q0NzIgNDIyVDUxNyAzNTRUNTM0IDI2NlE1MzQgMjEwIDUxNCAxNjBUNDU3IDcyVDM3MyAxMlQyNzAgLTEwWk0yNzMgMzJRMzE2IDMyIDM1NCA1MFQ0MjIgMTAwVDQ2OCAxNzRUNDg1IDI2NVE0ODUgMzAzIDQ3MyAzMzVUNDM4IDM5MFQzODQgNDI3VDMxNSA0NDFRMjcyIDQ0MSAyMzQgNDIzVDE2NiAzNzNUMTE5IDI5OVQxMDIgMjA4UTEwMiAxNzAgMTE1IDEzOFQxNTAgODNUMjA0IDQ2VDI3MyAzMlpNMjQwIDU0NVEyMjYgNTQ1IDIyNiA1NTdRMjI2IDU2OSAyNDEgNTg3VDI5MiA2MzhRMzI3IDY3MCAzNTAgNjg2VDM3NSA3MDNRMzc3IDcwMyAzOTIgNjg3VDQyOCA2NDBRNDUxIDYwNiA0NTggNTkwVDQ2NSA1NjZRNDY1IDU1NSA0NjAgNTUwVDQ0OCA1NDVRNDM4IDU0NSA0MjggNTU3VDM5OCA2MDdRMzkwIDYyMSAzODQgNjMzVDM2OSA2NjBMMzE3IDYwNlEyODUgNTcyIDI2OCA1NTlUMjQwIDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY1OyIgZ2x5cGgtbmFtZT0ib3RpbGRlIiBob3Jpei1hZHYteD0iNTg3IiBkPSJNMjcwIC0xMFEyMjQgLTEwIDE4NSA2VDExNiA1MVQ3MSAxMTlUNTQgMjA3UTU0IDI2MyA3NCAzMTNUMTMwIDQwMVQyMTQgNDYxVDMxOCA0ODNRMzY0IDQ4MyA0MDMgNDY3VDQ3MiA0MjJUNTE3IDM1NFQ1MzQgMjY2UTUzNCAyMTAgNTE0IDE2MFQ0NTcgNzJUMzczIDEyVDI3MCAtMTBaTTI3MyAzMlEzMTYgMzIgMzU0IDUwVDQyMiAxMDBUNDY4IDE3NFQ0ODUgMjY1UTQ4NSAzMDMgNDczIDMzNVQ0MzggMzkwVDM4NCA0MjdUMzE1IDQ0MVEyNzIgNDQxIDIzNCA0MjNUMTY2IDM3M1QxMTkgMjk5VDEwMiAyMDhRMTAyIDE3MCAxMTUgMTM4VDE1MCA4M1QyMDQgNDZUMjczIDMyWk00MDcgNTQ0UTM4MiA1NDQgMzY2IDU1NlQzMzUgNTg1UTMyMSA2MDAgMzEyIDYwN1QyOTIgNjE0UTI3NyA2MTQgMjY4IDYwM1QyNTMgNTcyUTI0NSA1NDkgMjI5IDU0OVEyMjEgNTQ5IDIxMiA1NTZRMjIwIDYwMSAyNDEgNjI4VDI5OCA2NTVRMzIzIDY1NSAzMzkgNjQyVDM3MCA2MTNRMzgzIDU5OCAzOTIgNTkxVDQxMyA1ODRRNDI3IDU4NCA0MzYgNTk1VDQ1MiA2MjZRNDU2IDYzNyA0NjEgNjQzVDQ3NSA2NDlRNDgzIDY0OSA0OTIgNjQyUTQ4NCA1OTcgNDYzIDU3MVQ0MDcgNTQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjY7IiBnbHlwaC1uYW1lPSJvZGllcmVzaXMiIGhvcml6LWFkdi14PSI1ODciIGQ9Ik0yNzAgLTEwUTIyNCAtMTAgMTg1IDZUMTE2IDUxVDcxIDExOVQ1NCAyMDdRNTQgMjYzIDc0IDMxM1QxMzAgNDAxVDIxNCA0NjFUMzE4IDQ4M1EzNjQgNDgzIDQwMyA0NjdUNDcyIDQyMlQ1MTcgMzU0VDUzNCAyNjZRNTM0IDIxMCA1MTQgMTYwVDQ1NyA3MlQzNzMgMTJUMjcwIC0xMFpNMjczIDMyUTMxNiAzMiAzNTQgNTBUNDIyIDEwMFQ0NjggMTc0VDQ4NSAyNjVRNDg1IDMwMyA0NzMgMzM1VDQzOCAzOTBUMzg0IDQyN1QzMTUgNDQxUTI3MiA0NDEgMjM0IDQyM1QxNjYgMzczVDExOSAyOTlUMTAyIDIwOFExMDIgMTcwIDExNSAxMzhUMTUwIDgzVDIwNCA0NlQyNzMgMzJaTTQyOCA1NDVRMzkxIDU0NSAzOTEgNTc0UTM5MSA1OTIgNDAwIDYwNVQ0MzAgNjE5UTQ2NyA2MTkgNDY3IDU5MFE0NjcgNTcyIDQ1OCA1NTlUNDI4IDU0NVpNMjY5IDU0NVEyMzIgNTQ1IDIzMiA1NzRRMjMyIDU5MiAyNDEgNjA1VDI3MCA2MTlRMzA4IDYxOSAzMDggNTkwUTMwOCA1NzIgMjk4IDU1OVQyNjkgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjc7IiBnbHlwaC1uYW1lPSJkaXZpZGUiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik0zNTIgMzc1UTMxNCAzNzUgMzE0IDQwMlEzMTQgNDI5IDMyNyA0NDJRMzM3IDQ1MiAzNTUgNDUyUTM5MyA0NTIgMzkzIDQyNVEzOTMgMzk4IDM4MCAzODVRMzcwIDM3NSAzNTIgMzc1Wk0yODkgODFRMjUyIDgxIDI1MiAxMDhRMjUyIDEzNiAyNjUgMTQ4UTI3NCAxNTggMjkzIDE1OFEzMzAgMTU4IDMzMCAxMzJRMzMwIDEwNCAzMTcgOTFRMzA3IDgxIDI4OSA4MVpNMTMxIDI0NFExMDYgMjQ0IDExMiAyNjRMMTEzIDI2OVExMTYgMjgwIDEyMSAyODRUMTQxIDI4OUg1MTRRNTI4IDI4OSA1MzEgMjg1VDUzMyAyNjlMNTMxIDI2NFE1MjkgMjU0IDUyNCAyNDlUNTA0IDI0NEgxMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGODsiIGdseXBoLW5hbWU9Im9zbGFzaCIgaG9yaXotYWR2LXg9IjU4NyIgZD0iTTMzIC0yMlEzMSAtMjQgMjIgLTE3VDEyIDFRMTIgNyAxNyAxNVQzMyAzM0w5MCA4NFE1NCAxMzcgNTQgMjA3UTU0IDI2MyA3NCAzMTNUMTMwIDQwMVQyMTQgNDYxVDMxOCA0ODNRMzYzIDQ4MyA0MDIgNDY3VDQ3MSA0MjJMNTUwIDQ5NFE1NTIgNDk2IDU2MSA0ODlUNTcwIDQ3MVE1NzAgNDY0IDU2NiA0NTdUNTUwIDQzOEw0OTcgMzkxUTUxNCAzNjUgNTI0IDMzNFQ1MzQgMjY2UTUzNCAyMTAgNTE0IDE2MFQ0NTcgNzJUMzczIDEyVDI3MCAtMTBRMjI0IC0xMCAxODUgNlQxMTYgNTJMMzMgLTIyWk00MzcgMzkwUTQxNCA0MTQgMzgzIDQyN1QzMTUgNDQxUTI3MiA0NDEgMjM0IDQyM1QxNjYgMzczVDExOSAyOTlUMTAyIDIwOFExMDIgMTgyIDEwOSAxNThUMTI3IDExNEw0MzcgMzkwWk0yNzMgMzJRMzE2IDMyIDM1NCA1MFQ0MjIgMTAwVDQ2OCAxNzRUNDg1IDI2NVE0ODUgMzE4IDQ2MCAzNjBMMTQ5IDg0UTE3MiA2MCAyMDMgNDZUMjczIDMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjk7IiBnbHlwaC1uYW1lPSJ1Z3JhdmUiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik00NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhUNzIgMTE4VDc2IDIxMkwxMzEgNDczSDE3OUwxMjMgMjA5UTEwNSAxMjUgMTM5IDgwVDI0MSAzNVEzMDAgMzUgMzQxIDY1VDQxOCAxNTVMNDg1IDQ3M0g1MzNMNDUzIDk1UTQ0NCA1NCA0NTYgNDFUNDk2IDI3UTQ5NiAyNyA0OTYgMjJUNDk0IDEwVDQ4NCAtMVQ0NjMgLTdaTTM3OCA1NDRRMzc2IDU0MiAzNjUgNTQ1VDMzNSA1NThUMjkzIDU4MVQyNDYgNjE2UTIyNiA2MzMgMjIwIDY0MlQyMTQgNjYyUTIxNCA2NzEgMjIxIDY3N1QyMzcgNjgzUTI0NSA2ODMgMjU1IDY3OFQyODAgNjU4UTMwNCA2MzggMzIyIDYxOFQzNTQgNTgyVDM3MyA1NTZUMzc4IDU0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZBOyIgZ2x5cGgtbmFtZT0idWFjdXRlIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNNDYzIC03UTQyOSAtNyA0MTIgMTZUNDA0IDkwUTM3NSA0MiAzMzIgMTZUMjM0IC0xMFExODkgLTEwIDE1NSA1VDk5IDQ4VDcyIDExOFQ3NiAyMTJMMTMxIDQ3M0gxNzlMMTIzIDIwOVExMDUgMTI1IDEzOSA4MFQyNDEgMzVRMzAwIDM1IDM0MSA2NVQ0MTggMTU1TDQ4NSA0NzNINTMzTDQ1MyA5NVE0NDQgNTQgNDU2IDQxVDQ5NiAyN1E0OTYgMjcgNDk2IDIyVDQ5NCAxMFQ0ODQgLTFUNDYzIC03Wk0yODUgNTQ0UTI4NCA1NDUgMjkzIDU1NlQzMjAgNTgyVDM2MiA2MTdUNDE0IDY1NFE0MzEgNjY3IDQ0MSA2NzBUNDYwIDY3NFE0NjkgNjc0IDQ3NSA2NjhUNDgxIDY1NFE0ODEgNjQ0IDQ3MiA2MzVUNDM5IDYwOVE0MDkgNTkxIDM4MiA1NzhUMzMzIDU1NlQyOTkgNTQ1VDI4NSA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGdseXBoLW5hbWU9InVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTY5IiBkPSJNNDYzIC03UTQyOSAtNyA0MTIgMTZUNDA0IDkwUTM3NSA0MiAzMzIgMTZUMjM0IC0xMFExODkgLTEwIDE1NSA1VDk5IDQ4VDcyIDExOFQ3NiAyMTJMMTMxIDQ3M0gxNzlMMTIzIDIwOVExMDUgMTI1IDEzOSA4MFQyNDEgMzVRMzAwIDM1IDM0MSA2NVQ0MTggMTU1TDQ4NSA0NzNINTMzTDQ1MyA5NVE0NDQgNTQgNDU2IDQxVDQ5NiAyN1E0OTYgMjcgNDk2IDIyVDQ5NCAxMFQ0ODQgLTFUNDYzIC03Wk0yNDAgNTQyUTIyNiA1NDIgMjI2IDU1NFEyMjYgNTY2IDI0MSA1ODRUMjkyIDYzNVEzMjcgNjY3IDM1MCA2ODNUMzc1IDcwMFEzNzcgNzAwIDM5MiA2ODRUNDI4IDYzN1E0NTEgNjAzIDQ1OCA1ODdUNDY1IDU2M1E0NjUgNTUyIDQ2MCA1NDdUNDQ4IDU0MlE0MzggNTQyIDQyOCA1NTRUMzk4IDYwNFEzOTAgNjE4IDM4NCA2MzBUMzY5IDY1N0wzMTcgNjAzUTI4NSA1NjkgMjY4IDU1NlQyNDAgNTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkM7IiBnbHlwaC1uYW1lPSJ1ZGllcmVzaXMiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik00NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhUNzIgMTE4VDc2IDIxMkwxMzEgNDczSDE3OUwxMjMgMjA5UTEwNSAxMjUgMTM5IDgwVDI0MSAzNVEzMDAgMzUgMzQxIDY1VDQxOCAxNTVMNDg1IDQ3M0g1MzNMNDUzIDk1UTQ0NCA1NCA0NTYgNDFUNDk2IDI3UTQ5NiAyNyA0OTYgMjJUNDk0IDEwVDQ4NCAtMVQ0NjMgLTdaTTQyOCA1NDJRMzkxIDU0MiAzOTEgNTcxUTM5MSA1ODkgNDAwIDYwMlQ0MzAgNjE2UTQ2NyA2MTYgNDY3IDU4N1E0NjcgNTY5IDQ1OCA1NTZUNDI4IDU0MlpNMjY5IDU0MlEyMzIgNTQyIDIzMiA1NzFRMjMyIDU4OSAyNDEgNjAyVDI3MCA2MTZRMzA4IDYxNiAzMDggNTg3UTMwOCA1NjkgMjk4IDU1NlQyNjkgNTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkQ7IiBnbHlwaC1uYW1lPSJ5YWN1dGUiIGhvcml6LWFkdi14PSI0ODciIGQ9Ik0zIC0yMDBRLTQzIC0yMDAgLTY0IC0xNzdRLTczIC0xNjggLTczIC0xNTZRLTczIC0xNDQgLTY0IC0xMzdULTUzIC0xMzFRLTQ0IC0xNDIgLTI5IC0xNDlUMCAtMTU2UTE0IC0xNTYgMjggLTE1MVQ1OCAtMTMyVDkzIC05NVQxMzggLTM0TDE3OCAyNlExNTUgMjkgMTUyIDU4TDExMyAzNDNRMTA1IDM5NiA4OCA0MTdUMzkgNDM4UTM5IDQzOCAzOSA0NDRUNDEgNDU3VDUxIDQ3MVQ3NiA0NzdRMTAxIDQ3NyAxMTggNDU5UTEzMyA0NDQgMTQ0IDQxNVQxNjAgMzM5TDE5NiA1Mkw0NTkgNDczUTQ1OSA0NzMgNDY3IDQ3M1Q0ODUgNDczVDUwMiA0NzJUNTEwIDQ3MUwxODQgLTQ0UTE1NSAtOTEgMTMyIC0xMjFUODcgLTE2OFQ0NiAtMTkzVDMgLTIwMFpNMjU1IDUzNFEyNTQgNTM1IDI2MyA1NDZUMjkwIDU3MlQzMzIgNjA3VDM4NCA2NDRRNDAxIDY1NyA0MTEgNjYwVDQzMCA2NjRRNDM5IDY2NCA0NDUgNjU4VDQ1MSA2NDRRNDUxIDYzNCA0NDIgNjI1VDQwOSA1OTlRMzc5IDU4MSAzNTIgNTY4VDMwMyA1NDZUMjY5IDUzNVQyNTUgNTM0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBnbHlwaC1uYW1lPSJ0aG9ybiIgaG9yaXotYWR2LXg9IjU5OCIgZD0iTTE5IC0xOTZROSAtMTk2IDMgLTE5MlQtMSAtMTczTDE3NSA2NTVRMTc5IDY3OCAxOTcgNjc4SDIwM1EyMTIgNjc4IDIxOCA2NzRUMjIzIDY1NUwxNjQgMzgyUTE5NiA0MjggMjQxIDQ1NVQzNDYgNDgzUTM4NiA0ODMgNDIyIDQ3MFQ0ODUgNDI5VDUyOSAzNjNUNTQ1IDI3M1E1NDUgMjE5IDUyNiAxNjhUNDc0IDc4VDM5MyAxNFQyOTAgLTEwUTI1MyAtMTAgMjIzIDBUMTY5IDI4VDEzMCA2N1QxMDcgMTEyTDQ3IC0xNzNRNDIgLTE5NiAyNSAtMTk2SDE5Wk0yOTMgMzJRMzQwIDMyIDM3OCA1MlQ0NDIgMTA3VDQ4MyAxODRUNDk3IDI3M1E0OTcgMzEyIDQ4NSAzNDNUNDUxIDM5NlQ0MDIgNDI5VDM0MSA0NDFRMzA5IDQ0MSAyODAgNDMxVDIyNyA0MDRUMTgzIDM2M1QxNTAgMzEyTDEyOSAyMThRMTIzIDE4NCAxMzEgMTUxVDE2MCA5MlQyMTQgNDlUMjkzIDMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkY7IiBnbHlwaC1uYW1lPSJ5ZGllcmVzaXMiIGhvcml6LWFkdi14PSI0ODciIGQ9Ik0zIC0yMDBRLTQzIC0yMDAgLTY0IC0xNzdRLTczIC0xNjggLTczIC0xNTZRLTczIC0xNDQgLTY0IC0xMzdULTUzIC0xMzFRLTQ0IC0xNDIgLTI5IC0xNDlUMCAtMTU2UTE0IC0xNTYgMjggLTE1MVQ1OCAtMTMyVDkzIC05NVQxMzggLTM0TDE3OCAyNlExNTUgMjkgMTUyIDU4TDExMyAzNDNRMTA1IDM5NiA4OCA0MTdUMzkgNDM4UTM5IDQzOCAzOSA0NDRUNDEgNDU3VDUxIDQ3MVQ3NiA0NzdRMTAxIDQ3NyAxMTggNDU5UTEzMyA0NDQgMTQ0IDQxNVQxNjAgMzM5TDE5NiA1Mkw0NTkgNDczUTQ1OSA0NzMgNDY3IDQ3M1Q0ODUgNDczVDUwMiA0NzJUNTEwIDQ3MUwxODQgLTQ0UTE1NSAtOTEgMTMyIC0xMjFUODcgLTE2OFQ0NiAtMTkzVDMgLTIwMFpNMzgyIDU0NVEzNDUgNTQ1IDM0NSA1NzRRMzQ1IDU5MiAzNTQgNjA1VDM4NCA2MTlRNDIxIDYxOSA0MjEgNTkwUTQyMSA1NzIgNDEyIDU1OVQzODIgNTQ1Wk0yMjMgNTQ1UTE4NiA1NDUgMTg2IDU3NFExODYgNTkyIDE5NSA2MDVUMjI0IDYxOVEyNjIgNjE5IDI2MiA1OTBRMjYyIDU3MiAyNTIgNTU5VDIyMyA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDA7IiBnbHlwaC1uYW1lPSJBbWFjcm9uIiBob3Jpei1hZHYteD0iNjMxIiBkPSJNLTI0IDBMMzU3IDYzNVEzNjIgNjQ0IDM2OSA2NDhUMzg5IDY1MlE0MDggNjUyIDQxNSA2NDZUNDI0IDYyOUw1NTMgMEg1MDFMNDU3IDIyNEgxNjZMMzQgMEgtMjRaTTQ0OCAyNjhMMzg0IDU5NUwxOTEgMjY4SDQ0OFpNMzA0IDczNlEyODEgNzM2IDI4MSA3NDlRMjgxIDc1NCAyODMgNzYyVDI5MCA3NzVRMjkzIDc3OSAyOTggNzgwVDMxMCA3ODFINTIyUTU0NiA3ODEgNTQ2IDc2OFE1NDYgNzYzIDU0NCA3NTVUNTM3IDc0MVE1MzQgNzM4IDUyOSA3MzdUNTE3IDczNkgzMDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDE7IiBnbHlwaC1uYW1lPSJhbWFjcm9uIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMlpNMjY1IDU2N1EyNDIgNTY3IDI0MiA1ODBRMjQyIDU4NSAyNDQgNTkzVDI1MSA2MDZRMjU0IDYxMCAyNTkgNjExVDI3MSA2MTJINDgzUTUwNyA2MTIgNTA3IDU5OVE1MDcgNTk0IDUwNSA1ODZUNDk4IDU3MlE0OTUgNTY5IDQ5MCA1NjhUNDc4IDU2N0gyNjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDI7IiBnbHlwaC1uYW1lPSJBYnJldmUiIGhvcml6LWFkdi14PSI2MzEiIGQ9Ik0tMjQgMEwzNTcgNjM1UTM2MiA2NDQgMzY5IDY0OFQzODkgNjUyUTQwOCA2NTIgNDE1IDY0NlQ0MjQgNjI5TDU1MyAwSDUwMUw0NTcgMjI0SDE2NkwzNCAwSC0yNFpNNDQ4IDI2OEwzODQgNTk1TDE5MSAyNjhINDQ4Wk00MTUgNzE0UTM4MiA3MTQgMzU5IDcyNFQzMjEgNzQ4UTMwNCA3NjUgMjk3IDc4M1QyOTAgODE1UTI5MCA4MjYgMjk2IDgzNFQzMjAgODQyUTMyOSA4MDMgMzUzIDc4MFQ0MTYgNzU3UTQ1NCA3NTcgNDgwIDc4MFQ1MjEgODQyUTUzOCA4NDIgNTQ0IDgzNFQ1NTEgODE4UTU1MSA4MDcgNTQyIDc4OVQ1MTcgNzU1UTQ5OCA3MzYgNDcyIDcyNVQ0MTUgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAzOyIgZ2x5cGgtbmFtZT0iYWJyZXZlIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNDk2IC03UTQ2MSAtNyA0NDQgMThUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1E1MjkgMjcgNTI5IDIyVDUyNyAxMFQ1MTcgLTFUNDk2IC03Wk0yNTYgMzJRMjk1IDMyIDMyOSA0N1QzOTEgODdUNDM3IDE0NFQ0NjMgMjEyTDQ4MiAyOThRNDY5IDM2MCA0MjggNDAwVDMxNCA0NDFRMjY2IDQ0MSAyMjcgNDIwVDE2MSAzNjNUMTE4IDI4NFQxMDMgMTk0UTEwMyAxNTYgMTE1IDEyNlQxNDcgNzVUMTk2IDQzVDI1NiAzMlpNMzgwIDU0NVEzNDcgNTQ1IDMyNCA1NTVUMjg2IDU3OVEyNjkgNTk2IDI2MiA2MTRUMjU1IDY0NlEyNTUgNjU3IDI2MSA2NjVUMjg1IDY3M1EyOTQgNjM0IDMxOCA2MTFUMzgxIDU4OFE0MTkgNTg4IDQ0NSA2MTFUNDg2IDY3M1E1MDMgNjczIDUwOSA2NjVUNTE2IDY0OVE1MTYgNjM4IDUwNyA2MjBUNDgyIDU4NlE0NjMgNTY3IDQzNyA1NTZUMzgwIDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNDsiIGdseXBoLW5hbWU9IkFvZ29uZWsiIGhvcml6LWFkdi14PSI2MzEiIGQ9Ik0tMjQgMEwzNTcgNjM1UTM2MiA2NDQgMzY5IDY0OFQzODkgNjUyUTQwOCA2NTIgNDE1IDY0NlQ0MjQgNjI5TDU1MyAwSDUzN1E0NzIgLTMyIDQ0OSAtNjFUNDI2IC0xMTRRNDI2IC0xMzEgNDM3IC0xNDFUNDY1IC0xNTFRNDg2IC0xNTEgNTAyIC0xMzVRNTEwIC0xMzYgNTE1IC0xNDFUNTIxIC0xNTdRNTIxIC0xNzMgNTA0IC0xODNUNDYxIC0xOTRRNDI2IC0xOTQgNDAzIC0xNzRUMzgwIC0xMjJRMzgwIC04OCA0MDggLTU1VDUwMCA1TDQ1NyAyMjRIMTY2TDM0IDBILTI0Wk00NDggMjY4TDM4NCA1OTVMMTkxIDI2OEg0NDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDU7IiBnbHlwaC1uYW1lPSJhb2dvbmVrIiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNTI5IDI3UTUyOSAyNyA1MjkgMjNUNTI5IDE0VDUyMyAzVDUxMCAtNVE0NDYgLTM3IDQyNCAtNjVUNDAxIC0xMThRNDAxIC0xMzUgNDEyIC0xNDVUNDQwIC0xNTVRNDYxIC0xNTUgNDc3IC0xMzlRNDg1IC0xNDAgNDkwIC0xNDVUNDk2IC0xNjFRNDk2IC0xNzcgNDc5IC0xODdUNDM2IC0xOThRNDAxIC0xOTggMzc4IC0xNzhUMzU1IC0xMjZRMzU1IC05NCAzODEgLTYxVDQ2NyAtMlE0NDYgNiA0MzcgMzBUNDM3IDk0Vjk2UTQwNCA0NCAzNTUgMTdUMjUwIC0xMFEyMDkgLTEwIDE3NCAzVDExMiA0M1Q3MCAxMDZUNTQgMTkzUTU0IDI0OCA3MyAzMDBUMTI4IDM5MlQyMTEgNDU4VDMxNyA0ODNRMzUyIDQ4MyAzODEgNDc0VDQzMyA0NDhUNDcyIDQxMVQ0OTYgMzY2TDUxOSA0NzNINTY2TDQ4NSA5NVE0NzcgNTQgNDg5IDQxVDUyOSAyN1pNMjU2IDMyUTI5NSAzMiAzMjkgNDdUMzkxIDg3VDQzNyAxNDRUNDYzIDIxMkw0ODIgMjk4UTQ2OSAzNjAgNDI4IDQwMFQzMTQgNDQxUTI2NiA0NDEgMjI3IDQyMFQxNjEgMzYzVDExOCAyODRUMTAzIDE5NFExMDMgMTU2IDExNSAxMjZUMTQ3IDc1VDE5NiA0M1QyNTYgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDY7IiBnbHlwaC1uYW1lPSJDYWN1dGUiIGhvcml6LWFkdi14PSI2ODEiIGQ9Ik0zNjUgLTEwUTMwMCAtMTAgMjQ4IDlUMTU4IDY0VDEwMCAxNTFUNzkgMjY2UTc5IDM0NSAxMDYgNDE2VDE4MCA1NDBUMjkzIDYyNVQ0MzQgNjU3UTUwNSA2NTcgNTUwIDYzNlQ2MjMgNTg3UTY0NiA1NjQgNjU2IDU0MFQ2NjYgNTAxUTY2NiA0OTEgNjYyIDQ4NVQ2NTIgNDc2VDY0MSA0NzFUNjMzIDQ3MlE2MTUgNTM4IDU2NSA1NzZUNDMxIDYxNFEzNjYgNjE0IDMxMiA1ODdUMjE3IDUxM1QxNTUgNDA0VDEzMiAyNzNRMTMyIDIxOCAxNDkgMTc0VDE5NiA5OFQyNzAgNTFUMzY1IDM0UTQwNSAzNCA0MzggNDNUNDk5IDY5VDU0NSAxMDZUNTc5IDE1MFE1ODAgMTUxIDU4NCAxNTBUNTkyIDE0NlQ2MDAgMTM4VDYwNCAxMjRRNjA0IDExNSA1OTYgOTlUNTY4IDYzUTUzOCAzNCA0ODUgMTJUMzY1IC0xMFpNMzc5IDcxNlEzNzggNzE3IDM4NyA3MjhUNDE0IDc1NFQ0NTYgNzg5VDUwOCA4MjZRNTI1IDgzOSA1MzUgODQyVDU1NCA4NDZRNTYzIDg0NiA1NjkgODQwVDU3NSA4MjZRNTc1IDgxNiA1NjYgODA3VDUzMyA3ODFRNTAzIDc2MyA0NzYgNzUwVDQyNyA3MjhUMzkzIDcxN1QzNzkgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA3OyIgZ2x5cGgtbmFtZT0iY2FjdXRlIiBkPSJNMjczIC0xMFEyMjcgLTEwIDE4NyA0VDExNyA0NlQ3MCAxMTRUNTMgMjA2UTUzIDI2MCA3MyAzMTBUMTI4IDM5OFQyMTIgNDYwVDMxNiA0ODNRMzc0IDQ4MyA0MTIgNDY2VDQ3NCA0MjRRNDk1IDQwMyA1MDQgMzgwVDUxNCAzNDFRNTE0IDMzMCA1MDkgMzI0VDQ5NyAzMTRUNDg1IDMxMVQ0NzggMzEzUTQ3NCAzMzkgNDYyIDM2MlQ0MzAgNDAyVDM4MSA0MzBUMzE3IDQ0MFEyNzAgNDQwIDIzMSA0MjFUMTYzIDM2OVQxMTggMjk1VDEwMiAyMDlRMTAyIDE2OCAxMTUgMTM2VDE1MSA4MVQyMDYgNDZUMjc3IDMzUTMzNiAzMyAzNzUgNjFUNDM3IDEyN1E0MzggMTI4IDQ0MiAxMjdUNDUyIDEyNFQ0NjEgMTE2VDQ2NSAxMDRRNDY1IDg0IDQzNCA1MlE0MTAgMjkgMzY5IDEwVDI3MyAtMTBaTTI2NiA1NDdRMjY1IDU0OCAyNzQgNTU5VDMwMSA1ODVUMzQzIDYyMFQzOTUgNjU3UTQxMiA2NzAgNDIyIDY3M1Q0NDEgNjc3UTQ1MCA2NzcgNDU2IDY3MVQ0NjIgNjU3UTQ2MiA2NDcgNDUzIDYzOFQ0MjAgNjEyUTM5MCA1OTQgMzYzIDU4MVQzMTQgNTU5VDI4MCA1NDhUMjY2IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGdseXBoLW5hbWU9IkNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjgxIiBkPSJNMzY1IC0xMFEzMDAgLTEwIDI0OCA5VDE1OCA2NFQxMDAgMTUxVDc5IDI2NlE3OSAzNDUgMTA2IDQxNlQxODAgNTQwVDI5MyA2MjVUNDM0IDY1N1E1MDUgNjU3IDU1MCA2MzZUNjIzIDU4N1E2NDYgNTY0IDY1NiA1NDBUNjY2IDUwMVE2NjYgNDkxIDY2MiA0ODVUNjUyIDQ3NlQ2NDEgNDcxVDYzMyA0NzJRNjE1IDUzOCA1NjUgNTc2VDQzMSA2MTRRMzY2IDYxNCAzMTIgNTg3VDIxNyA1MTNUMTU1IDQwNFQxMzIgMjczUTEzMiAyMTggMTQ5IDE3NFQxOTYgOThUMjcwIDUxVDM2NSAzNFE0MDUgMzQgNDM4IDQzVDQ5OSA2OVQ1NDUgMTA2VDU3OSAxNTBRNTgwIDE1MSA1ODQgMTUwVDU5MiAxNDZUNjAwIDEzOFQ2MDQgMTI0UTYwNCAxMTUgNTk2IDk5VDU2OCA2M1E1MzggMzQgNDg1IDEyVDM2NSAtMTBaTTM0NCA3MTRRMzMwIDcxNCAzMzAgNzI2UTMzMCA3MzggMzQ1IDc1NlQzOTYgODA3UTQzMSA4MzkgNDU0IDg1NVQ0NzkgODcyUTQ4MSA4NzIgNDk2IDg1NlQ1MzIgODA5UTU1NSA3NzUgNTYyIDc1OVQ1NjkgNzM1UTU2OSA3MjQgNTY0IDcxOVQ1NTIgNzE0UTU0MiA3MTQgNTMyIDcyNlQ1MDIgNzc2UTQ5NCA3OTAgNDg4IDgwMlQ0NzMgODI5TDQyMSA3NzVRMzg5IDc0MSAzNzIgNzI4VDM0NCA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDk7IiBnbHlwaC1uYW1lPSJjY2lyY3VtZmxleCIgZD0iTTI3MyAtMTBRMjI3IC0xMCAxODcgNFQxMTcgNDZUNzAgMTE0VDUzIDIwNlE1MyAyNjAgNzMgMzEwVDEyOCAzOThUMjEyIDQ2MFQzMTYgNDgzUTM3NCA0ODMgNDEyIDQ2NlQ0NzQgNDI0UTQ5NSA0MDMgNTA0IDM4MFQ1MTQgMzQxUTUxNCAzMzAgNTA5IDMyNFQ0OTcgMzE0VDQ4NSAzMTFUNDc4IDMxM1E0NzQgMzM5IDQ2MiAzNjJUNDMwIDQwMlQzODEgNDMwVDMxNyA0NDBRMjcwIDQ0MCAyMzEgNDIxVDE2MyAzNjlUMTE4IDI5NVQxMDIgMjA5UTEwMiAxNjggMTE1IDEzNlQxNTEgODFUMjA2IDQ2VDI3NyAzM1EzMzYgMzMgMzc1IDYxVDQzNyAxMjdRNDM4IDEyOCA0NDIgMTI3VDQ1MiAxMjRUNDYxIDExNlQ0NjUgMTA0UTQ2NSA4NCA0MzQgNTJRNDEwIDI5IDM2OSAxMFQyNzMgLTEwWk0yMzEgNTQ1UTIxNyA1NDUgMjE3IDU1N1EyMTcgNTY5IDIzMiA1ODdUMjgzIDYzOFEzMTggNjcwIDM0MSA2ODZUMzY2IDcwM1EzNjggNzAzIDM4MyA2ODdUNDE5IDY0MFE0NDIgNjA2IDQ0OSA1OTBUNDU2IDU2NlE0NTYgNTU1IDQ1MSA1NTBUNDM5IDU0NVE0MjkgNTQ1IDQxOSA1NTdUMzg5IDYwN1EzODEgNjIxIDM3NSA2MzNUMzYwIDY2MEwzMDggNjA2UTI3NiA1NzIgMjU5IDU1OVQyMzEgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBBOyIgZ2x5cGgtbmFtZT0iQ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjY4MSIgZD0iTTM2NSAtMTBRMzAwIC0xMCAyNDggOVQxNTggNjRUMTAwIDE1MVQ3OSAyNjZRNzkgMzQ1IDEwNiA0MTZUMTgwIDU0MFQyOTMgNjI1VDQzNCA2NTdRNTA1IDY1NyA1NTAgNjM2VDYyMyA1ODdRNjQ2IDU2NCA2NTYgNTQwVDY2NiA1MDFRNjY2IDQ5MSA2NjIgNDg1VDY1MiA0NzZUNjQxIDQ3MVQ2MzMgNDcyUTYxNSA1MzggNTY1IDU3NlQ0MzEgNjE0UTM2NiA2MTQgMzEyIDU4N1QyMTcgNTEzVDE1NSA0MDRUMTMyIDI3M1ExMzIgMjE4IDE0OSAxNzRUMTk2IDk4VDI3MCA1MVQzNjUgMzRRNDA1IDM0IDQzOCA0M1Q0OTkgNjlUNTQ1IDEwNlQ1NzkgMTUwUTU4MCAxNTEgNTg0IDE1MFQ1OTIgMTQ2VDYwMCAxMzhUNjA0IDEyNFE2MDQgMTE1IDU5NiA5OVQ1NjggNjNRNTM4IDM0IDQ4NSAxMlQzNjUgLTEwWk00NTcgNzE1UTQxNiA3MTUgNDE2IDc0NlE0MTYgNzY1IDQyNiA3NzlUNDU4IDc5NFE1MDAgNzk0IDUwMCA3NjNRNTAwIDc0NCA0ODkgNzMwVDQ1NyA3MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEI7IiBnbHlwaC1uYW1lPSJjZG90YWNjZW50IiBkPSJNMjczIC0xMFEyMjcgLTEwIDE4NyA0VDExNyA0NlQ3MCAxMTRUNTMgMjA2UTUzIDI2MCA3MyAzMTBUMTI4IDM5OFQyMTIgNDYwVDMxNiA0ODNRMzc0IDQ4MyA0MTIgNDY2VDQ3NCA0MjRRNDk1IDQwMyA1MDQgMzgwVDUxNCAzNDFRNTE0IDMzMCA1MDkgMzI0VDQ5NyAzMTRUNDg1IDMxMVQ0NzggMzEzUTQ3NCAzMzkgNDYyIDM2MlQ0MzAgNDAyVDM4MSA0MzBUMzE3IDQ0MFEyNzAgNDQwIDIzMSA0MjFUMTYzIDM2OVQxMTggMjk1VDEwMiAyMDlRMTAyIDE2OCAxMTUgMTM2VDE1MSA4MVQyMDYgNDZUMjc3IDMzUTMzNiAzMyAzNzUgNjFUNDM3IDEyN1E0MzggMTI4IDQ0MiAxMjdUNDUyIDEyNFQ0NjEgMTE2VDQ2NSAxMDRRNDY1IDg0IDQzNCA1MlE0MTAgMjkgMzY5IDEwVDI3MyAtMTBaTTM0NiA1NDZRMzA1IDU0NiAzMDUgNTc3UTMwNSA1OTYgMzE1IDYxMFQzNDcgNjI1UTM4OSA2MjUgMzg5IDU5NFEzODkgNTc1IDM3OCA1NjFUMzQ2IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGdseXBoLW5hbWU9IkNjYXJvbiIgaG9yaXotYWR2LXg9IjY4MSIgZD0iTTM2NSAtMTBRMzAwIC0xMCAyNDggOVQxNTggNjRUMTAwIDE1MVQ3OSAyNjZRNzkgMzQ1IDEwNiA0MTZUMTgwIDU0MFQyOTMgNjI1VDQzNCA2NTdRNTA1IDY1NyA1NTAgNjM2VDYyMyA1ODdRNjQ2IDU2NCA2NTYgNTQwVDY2NiA1MDFRNjY2IDQ5MSA2NjIgNDg1VDY1MiA0NzZUNjQxIDQ3MVQ2MzMgNDcyUTYxNSA1MzggNTY1IDU3NlQ0MzEgNjE0UTM2NiA2MTQgMzEyIDU4N1QyMTcgNTEzVDE1NSA0MDRUMTMyIDI3M1ExMzIgMjE4IDE0OSAxNzRUMTk2IDk4VDI3MCA1MVQzNjUgMzRRNDA1IDM0IDQzOCA0M1Q0OTkgNjlUNTQ1IDEwNlQ1NzkgMTUwUTU4MCAxNTEgNTg0IDE1MFQ1OTIgMTQ2VDYwMCAxMzhUNjA0IDEyNFE2MDQgMTE1IDU5NiA5OVQ1NjggNjNRNTM4IDM0IDQ4NSAxMlQzNjUgLTEwWk00NDQgNjk4UTQ0MiA2OTggNDI3IDcxNFQzOTEgNzYxUTM2OCA3OTUgMzYxIDgxMVQzNTMgODM1UTM1MyA4NDYgMzU4IDg1MVQzNzEgODU2UTM4MSA4NTYgMzkxIDg0NFQ0MjEgNzk0UTQyOSA3ODAgNDM1IDc2OFQ0NTAgNzQxUTQ2NCA3NTUgNDc0IDc2NlQ1MDIgNzk1UTUzNCA4MjggNTUxIDg0MlQ1NzkgODU2UTU5MyA4NTYgNTkzIDg0M1E1OTMgODMxIDU3OCA4MTNUNTI3IDc2M1E0OTIgNzMxIDQ2OSA3MTVUNDQ0IDY5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRDsiIGdseXBoLW5hbWU9ImNjYXJvbiIgZD0iTTI3MyAtMTBRMjI3IC0xMCAxODcgNFQxMTcgNDZUNzAgMTE0VDUzIDIwNlE1MyAyNjAgNzMgMzEwVDEyOCAzOThUMjEyIDQ2MFQzMTYgNDgzUTM3NCA0ODMgNDEyIDQ2NlQ0NzQgNDI0UTQ5NSA0MDMgNTA0IDM4MFQ1MTQgMzQxUTUxNCAzMzAgNTA5IDMyNFQ0OTcgMzE0VDQ4NSAzMTFUNDc4IDMxM1E0NzQgMzM5IDQ2MiAzNjJUNDMwIDQwMlQzODEgNDMwVDMxNyA0NDBRMjcwIDQ0MCAyMzEgNDIxVDE2MyAzNjlUMTE4IDI5NVQxMDIgMjA5UTEwMiAxNjggMTE1IDEzNlQxNTEgODFUMjA2IDQ2VDI3NyAzM1EzMzYgMzMgMzc1IDYxVDQzNyAxMjdRNDM4IDEyOCA0NDIgMTI3VDQ1MiAxMjRUNDYxIDExNlQ0NjUgMTA0UTQ2NSA4NCA0MzQgNTJRNDEwIDI5IDM2OSAxMFQyNzMgLTEwWk0zMzYgNTI5UTMzNCA1MjkgMzE5IDU0NVQyODMgNTkyUTI2MCA2MjYgMjUzIDY0MlQyNDUgNjY2UTI0NSA2NzcgMjUwIDY4MlQyNjMgNjg3UTI3MyA2ODcgMjgzIDY3NVQzMTMgNjI1UTMyMSA2MTEgMzI3IDU5OVQzNDIgNTcyUTM1NiA1ODYgMzY2IDU5N1QzOTQgNjI2UTQyNiA2NTkgNDQzIDY3M1Q0NzEgNjg3UTQ4NSA2ODcgNDg1IDY3NFE0ODUgNjYyIDQ3MCA2NDRUNDE5IDU5NFEzODQgNTYyIDM2MSA1NDZUMzM2IDUyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRTsiIGdseXBoLW5hbWU9IkRjYXJvbiIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTE3NiA2MTZRMTgxIDY0NyAyMTIgNjQ3SDMxOVE0NzEgNjQ3IDU1NCA1NzZUNjM4IDM3NlE2MzggMjk3IDYxMyAyMjlUNTM3IDEwOVQ0MTMgMjlUMjM5IDBINDVMMTc2IDYxNlpNMjQ3IDQ0UTMzMiA0NCAzOTUgNjlUNTAxIDEzOVQ1NjQgMjQzVDU4NSAzNjlRNTg1IDQ3OSA1MTYgNTQxVDMxNiA2MDNIMjIzTDEwNSA0NEgyNDdaTTM5NSA2OThRMzkzIDY5OCAzNzggNzE0VDM0MiA3NjFRMzE5IDc5NSAzMTIgODExVDMwNCA4MzVRMzA0IDg0NiAzMDkgODUxVDMyMiA4NTZRMzMyIDg1NiAzNDIgODQ0VDM3MiA3OTRRMzgwIDc4MCAzODYgNzY4VDQwMSA3NDFRNDE1IDc1NSA0MjUgNzY2VDQ1MyA3OTVRNDg1IDgyOCA1MDIgODQyVDUzMCA4NTZRNTQ0IDg1NiA1NDQgODQzUTU0NCA4MzEgNTI5IDgxM1Q0NzggNzYzUTQ0MyA3MzEgNDIwIDcxNVQzOTUgNjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBGOyIgZ2x5cGgtbmFtZT0iZGNhcm9uIiBob3Jpei1hZHYteD0iNzY3IiBkPSJNNDk2IC03UTQ2MiAtNyA0NDQgMTdUNDM2IDkwUTQwMyA0MiAzNTkgMTZUMjU1IC0xMFEyMTUgLTEwIDE3OSA0VDExNiA0NFQ3MyAxMTBUNTcgMjAwUTU3IDI1NCA3NSAzMDVUMTI4IDM5NVQyMDkgNDU5VDMxMiA0ODNRMzgyIDQ4MyA0MjggNDQ5VDQ5NSAzNjVMNTYxIDY3NEg2MDlMNDg1IDk1UTQ3NiA1NCA0ODggNDFUNTI5IDI3UTUyOSAyNyA1MjkgMjJUNTI3IDEwVDUxNyAtMVQ0OTYgLTdaTTI2MSAzMlEyOTggMzIgMzMxIDQ2VDM5MSA4M1Q0MzYgMTM4VDQ2MSAyMDVMNDgxIDI5NlE0NjcgMzU5IDQyNCA0MDBUMzA5IDQ0MVEyNjIgNDQxIDIyNCA0MjFUMTYwIDM2NlQxMTkgMjg5VDEwNSAyMDBRMTA1IDE2MSAxMTcgMTMwVDE1MSA3N1QyMDAgNDRUMjYxIDMyWk02NDcgNDU0UTY0NSA0NTIgNjQxIDQ1M1Q2MzIgNDU2VDYyNSA0NjNUNjI0IDQ3MEw3MzQgNjc2UTczNSA2NzcgNzQyIDY3N1Q3NTcgNjc0VDc3MiA2NjZUNzc5IDY1MVE3NzkgNjQzIDc3NiA2MzVUNzY1IDYxNkw2NDcgNDU0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEwOyIgZ2x5cGgtbmFtZT0iRGNyb2F0IiBob3Jpei1hZHYteD0iNzI2IiBkPSJNMTI1IDBRODkgMCA5NyAzNUwxNTMgMzAySDc4UTU2IDMwMiA1NiAzMTRRNTYgMzE5IDU4IDMyN1Q2NSAzNDBRNzAgMzQ1IDg0IDM0NUgxNjJMMjIwIDYxNlEyMjUgNjQ3IDI1NiA2NDdIMzYzUTUxNSA2NDcgNTk4IDU3NlQ2ODIgMzc2UTY4MiAyOTcgNjU3IDIyOVQ1ODEgMTA5VDQ1NyAyOVQyODMgMEgxMjVaTTI5MSA0NFEzNzYgNDQgNDM5IDY5VDU0NSAxMzlUNjA4IDI0M1Q2MjkgMzY5UTYyOSA0NzkgNTYwIDU0MVQzNjAgNjAzSDI2N0wyMTIgMzQ1SDQzNlE0NTggMzQ1IDQ1OCAzMzNRNDU4IDMyOCA0NTYgMzIwVDQ0OSAzMDdRNDQyIDMwMiA0MzEgMzAySDIwM0wxNDggNDRIMjkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTExOyIgZ2x5cGgtbmFtZT0iZGNyb2F0IiBob3Jpei1hZHYteD0iNjAwIiBkPSJNNjQ3IDYwOVE2NzAgNjA5IDY3MCA1OTVRNjcwIDU5MCA2NjggNTgyVDY2MSA1NjlRNjU2IDU2MyA2NDEgNTYzSDU4NUw0ODUgOTVRNDc2IDU0IDQ4OCA0MVQ1MjkgMjdRNTI5IDI3IDUyOSAyMlQ1MjcgMTBUNTE3IC0xVDQ5NiAtN1E0NjIgLTcgNDQ0IDE3VDQzNiA5MFE0MDMgNDIgMzU5IDE2VDI1NSAtMTBRMjE1IC0xMCAxNzkgNFQxMTYgNDRUNzMgMTEwVDU3IDIwMFE1NyAyNTQgNzUgMzA1VDEyOCAzOTVUMjA5IDQ1OVQzMTIgNDgzUTM4MiA0ODMgNDI4IDQ0OVQ0OTUgMzY1TDUzNyA1NjNINDIwUTM5NyA1NjMgMzk3IDU3NlEzOTcgNTgyIDM5OSA1OTBUNDA2IDYwM1E0MTIgNjA5IDQyNiA2MDlINTQ3TDU2MSA2NzRINjA5TDU5NSA2MDlINjQ3Wk0yNjEgMzJRMjk4IDMyIDMzMSA0NlQzOTEgODNUNDM2IDEzOFQ0NjEgMjA1TDQ4MSAyOTZRNDY3IDM1OSA0MjQgNDAwVDMwOSA0NDFRMjYyIDQ0MSAyMjQgNDIxVDE2MCAzNjZUMTE5IDI4OVQxMDUgMjAwUTEwNSAxNjEgMTE3IDEzMFQxNTEgNzdUMjAwIDQ0VDI2MSAzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMjsiIGdseXBoLW5hbWU9IkVtYWNyb24iIGhvcml6LWFkdi14PSI1OTUiIGQ9Ik0xNzYgNjE2UTE4MyA2NDcgMjEyIDY0N0g2MTVMNjA2IDYwMkgyMjNMMTcwIDM1NEg0NzFMNDYyIDMxMEgxNjFMMTA1IDQ2SDQ5OEw0ODggMEg0NUwxNzYgNjE2Wk0zMTEgNzM2UTI4OCA3MzYgMjg4IDc0OVEyODggNzU0IDI5MCA3NjJUMjk3IDc3NVEzMDAgNzc5IDMwNSA3ODBUMzE3IDc4MUg1MjlRNTUzIDc4MSA1NTMgNzY4UTU1MyA3NjMgNTUxIDc1NVQ1NDQgNzQxUTU0MSA3MzggNTM2IDczN1Q1MjQgNzM2SDMxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMzsiIGdseXBoLW5hbWU9ImVtYWNyb24iIGhvcml6LWFkdi14PSI1MzkiIGQ9Ik0yNTQgLTEwUTIwNCAtMTAgMTY3IDRUMTAzIDQzVDY0IDEwNFQ1MSAxODFRNTEgMjQ0IDczIDI5OVQxMzYgMzk1VDIyOSA0NTlUMzQ2IDQ4M1E0MjQgNDgzIDQ2NyA0NDlUNTEwIDM2NFE1MTAgMzMyIDQ5OCAzMDZUNDU0IDI2MFQzNjkgMjMxVDIzNSAyMjBRMjA2IDIyMCAxNzQgMjIxVDEwMyAyMjdRMTAwIDIwNiAxMDAgMTg0UTEwMCAxMTYgMTM5IDc0VDI1NiAzMVEzMTQgMzEgMzU0IDUyVDQyMiAxMTNRNDIzIDExNCA0MjcgMTEzVDQzNSAxMDlUNDQzIDEwMVQ0NDcgOTBRNDQ3IDgxIDQ0MyA3M1Q0MjQgNTFRMzk0IDIwIDM1MyA1VDI1NCAtMTBaTTM0MyA0NDFRMzAyIDQ0MSAyNjYgNDI4VDIwMCAzOTFUMTQ4IDMzN1QxMTMgMjY4UTE0NyAyNjMgMTc2IDI2MlQyMzEgMjYwUTMwMCAyNjAgMzQ0IDI2OVQ0MTUgMjkyVDQ1MSAzMjRUNDYxIDM2M1E0NjEgMzkyIDQzMiA0MTZUMzQzIDQ0MVpNMjM4IDU2N1EyMTUgNTY3IDIxNSA1ODBRMjE1IDU4NSAyMTcgNTkzVDIyNCA2MDZRMjI3IDYxMCAyMzIgNjExVDI0NCA2MTJINDU2UTQ4MCA2MTIgNDgwIDU5OVE0ODAgNTk0IDQ3OCA1ODZUNDcxIDU3MlE0NjggNTY5IDQ2MyA1NjhUNDUxIDU2N0gyMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTQ7IiBnbHlwaC1uYW1lPSJFYnJldmUiIGhvcml6LWFkdi14PSI1OTUiIGQ9Ik0xNzYgNjE2UTE4MyA2NDcgMjEyIDY0N0g2MTVMNjA2IDYwMkgyMjNMMTcwIDM1NEg0NzFMNDYyIDMxMEgxNjFMMTA1IDQ2SDQ5OEw0ODggMEg0NUwxNzYgNjE2Wk00MTggNzE0UTM4NSA3MTQgMzYyIDcyNFQzMjQgNzQ4UTMwNyA3NjUgMzAwIDc4M1QyOTMgODE1UTI5MyA4MjYgMjk5IDgzNFQzMjMgODQyUTMzMiA4MDMgMzU2IDc4MFQ0MTkgNzU3UTQ1NyA3NTcgNDgzIDc4MFQ1MjQgODQyUTU0MSA4NDIgNTQ3IDgzNFQ1NTQgODE4UTU1NCA4MDcgNTQ1IDc4OVQ1MjAgNzU1UTUwMSA3MzYgNDc1IDcyNVQ0MTggNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE1OyIgZ2x5cGgtbmFtZT0iZWJyZXZlIiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjU0IC0xMFEyMDQgLTEwIDE2NyA0VDEwMyA0M1Q2NCAxMDRUNTEgMTgxUTUxIDI0NCA3MyAyOTlUMTM2IDM5NVQyMjkgNDU5VDM0NiA0ODNRNDI0IDQ4MyA0NjcgNDQ5VDUxMCAzNjRRNTEwIDMzMiA0OTggMzA2VDQ1NCAyNjBUMzY5IDIzMVQyMzUgMjIwUTIwNiAyMjAgMTc0IDIyMVQxMDMgMjI3UTEwMCAyMDYgMTAwIDE4NFExMDAgMTE2IDEzOSA3NFQyNTYgMzFRMzE0IDMxIDM1NCA1MlQ0MjIgMTEzUTQyMyAxMTQgNDI3IDExM1Q0MzUgMTA5VDQ0MyAxMDFUNDQ3IDkwUTQ0NyA4MSA0NDMgNzNUNDI0IDUxUTM5NCAyMCAzNTMgNVQyNTQgLTEwWk0zNDMgNDQxUTMwMiA0NDEgMjY2IDQyOFQyMDAgMzkxVDE0OCAzMzdUMTEzIDI2OFExNDcgMjYzIDE3NiAyNjJUMjMxIDI2MFEzMDAgMjYwIDM0NCAyNjlUNDE1IDI5MlQ0NTEgMzI0VDQ2MSAzNjNRNDYxIDM5MiA0MzIgNDE2VDM0MyA0NDFaTTM1MCA1NDVRMzE3IDU0NSAyOTQgNTU1VDI1NiA1NzlRMjM5IDU5NiAyMzIgNjE0VDIyNSA2NDZRMjI1IDY1NyAyMzEgNjY1VDI1NSA2NzNRMjY0IDYzNCAyODggNjExVDM1MSA1ODhRMzg5IDU4OCA0MTUgNjExVDQ1NiA2NzNRNDczIDY3MyA0NzkgNjY1VDQ4NiA2NDlRNDg2IDYzOCA0NzcgNjIwVDQ1MiA1ODZRNDMzIDU2NyA0MDcgNTU2VDM1MCA1NDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTY7IiBnbHlwaC1uYW1lPSJFZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTk1IiBkPSJNMTc2IDYxNlExODMgNjQ3IDIxMiA2NDdINjE1TDYwNiA2MDJIMjIzTDE3MCAzNTRINDcxTDQ2MiAzMTBIMTYxTDEwNSA0Nkg0OThMNDg4IDBINDVMMTc2IDYxNlpNNDEzIDcxNVEzNzIgNzE1IDM3MiA3NDZRMzcyIDc2NSAzODIgNzc5VDQxNCA3OTRRNDU2IDc5NCA0NTYgNzYzUTQ1NiA3NDQgNDQ1IDczMFQ0MTMgNzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE3OyIgZ2x5cGgtbmFtZT0iZWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjUzOSIgZD0iTTI1NCAtMTBRMjA0IC0xMCAxNjcgNFQxMDMgNDNUNjQgMTA0VDUxIDE4MVE1MSAyNDQgNzMgMjk5VDEzNiAzOTVUMjI5IDQ1OVQzNDYgNDgzUTQyNCA0ODMgNDY3IDQ0OVQ1MTAgMzY0UTUxMCAzMzIgNDk4IDMwNlQ0NTQgMjYwVDM2OSAyMzFUMjM1IDIyMFEyMDYgMjIwIDE3NCAyMjFUMTAzIDIyN1ExMDAgMjA2IDEwMCAxODRRMTAwIDExNiAxMzkgNzRUMjU2IDMxUTMxNCAzMSAzNTQgNTJUNDIyIDExM1E0MjMgMTE0IDQyNyAxMTNUNDM1IDEwOVQ0NDMgMTAxVDQ0NyA5MFE0NDcgODEgNDQzIDczVDQyNCA1MVEzOTQgMjAgMzUzIDVUMjU0IC0xMFpNMzQzIDQ0MVEzMDIgNDQxIDI2NiA0MjhUMjAwIDM5MVQxNDggMzM3VDExMyAyNjhRMTQ3IDI2MyAxNzYgMjYyVDIzMSAyNjBRMzAwIDI2MCAzNDQgMjY5VDQxNSAyOTJUNDUxIDMyNFQ0NjEgMzYzUTQ2MSAzOTIgNDMyIDQxNlQzNDMgNDQxWk0zNTEgNTQ2UTMxMCA1NDYgMzEwIDU3N1EzMTAgNTk2IDMyMCA2MTBUMzUyIDYyNVEzOTQgNjI1IDM5NCA1OTRRMzk0IDU3NSAzODMgNTYxVDM1MSA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTg7IiBnbHlwaC1uYW1lPSJFb2dvbmVrIiBob3Jpei1hZHYteD0iNTk1IiBkPSJNMTc2IDYxNlExODMgNjQ3IDIxMiA2NDdINjE1TDYwNiA2MDJIMjIzTDE3MCAzNTRINDcxTDQ2MiAzMTBIMTYxTDEwNSA0Nkg0OThMNDg4IDBINDgxUTQxNyAtMzIgMzk1IC02MFQzNzIgLTExM1EzNzIgLTEzMCAzODMgLTE0MFQ0MTEgLTE1MFE0MzIgLTE1MCA0NDggLTEzNFE0NTYgLTEzNSA0NjEgLTE0MFQ0NjcgLTE1NlE0NjcgLTE3MiA0NTAgLTE4MlQ0MDcgLTE5M1EzNzIgLTE5MyAzNDkgLTE3M1QzMjYgLTEyMVEzMjYgLTg5IDM1MCAtNThUNDMxIDBINDVMMTc2IDYxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExOTsiIGdseXBoLW5hbWU9ImVvZ29uZWsiIGhvcml6LWFkdi14PSI1MzkiIGQ9Ik0yNTQgLTEwUTIwNCAtMTAgMTY3IDRUMTAzIDQzVDY0IDEwNFQ1MSAxODFRNTEgMjQ0IDczIDI5OVQxMzYgMzk1VDIyOSA0NTlUMzQ2IDQ4M1E0MjQgNDgzIDQ2NyA0NDlUNTEwIDM2NFE1MTAgMzMyIDQ5OCAzMDZUNDU0IDI2MFQzNjkgMjMxVDIzNSAyMjBRMjA2IDIyMCAxNzQgMjIxVDEwMyAyMjdRMTAwIDIwNiAxMDAgMTg0UTEwMCAxMTYgMTM5IDc0VDI1NiAzMVEzMTQgMzEgMzU0IDUyVDQyMiAxMTNRNDIzIDExNCA0MjcgMTEzVDQzNSAxMDlUNDQzIDEwMVQ0NDcgOTBRNDQ3IDgxIDQ0MyA3M1Q0MjQgNTFRNDAxIDI3IDM2OCAxMVEzMDUgLTIxIDI4MyAtNDlUMjYwIC0xMDFRMjYwIC0xMTggMjcxIC0xMjhUMjk5IC0xMzhRMzIwIC0xMzggMzM2IC0xMjJRMzQ0IC0xMjMgMzQ5IC0xMjhUMzU1IC0xNDRRMzU1IC0xNjAgMzM4IC0xNzBUMjk1IC0xODFRMjYwIC0xODEgMjM3IC0xNjFUMjE0IC0xMDlRMjE0IC04MyAyMzAgLTU4VDI4MiAtOVEyNzUgLTkgMjY4IC05VDI1NCAtMTBaTTM0MyA0NDFRMzAyIDQ0MSAyNjYgNDI4VDIwMCAzOTFUMTQ4IDMzN1QxMTMgMjY4UTE0NyAyNjMgMTc2IDI2MlQyMzEgMjYwUTMwMCAyNjAgMzQ0IDI2OVQ0MTUgMjkyVDQ1MSAzMjRUNDYxIDM2M1E0NjEgMzkyIDQzMiA0MTZUMzQzIDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQTsiIGdseXBoLW5hbWU9IkVjYXJvbiIgaG9yaXotYWR2LXg9IjU5NSIgZD0iTTE3NiA2MTZRMTgzIDY0NyAyMTIgNjQ3SDYxNUw2MDYgNjAySDIyM0wxNzAgMzU0SDQ3MUw0NjIgMzEwSDE2MUwxMDUgNDZINDk4TDQ4OCAwSDQ1TDE3NiA2MTZaTTQwMyA2OThRNDAxIDY5OCAzODYgNzE0VDM1MCA3NjFRMzI3IDc5NSAzMjAgODExVDMxMiA4MzVRMzEyIDg0NiAzMTcgODUxVDMzMCA4NTZRMzQwIDg1NiAzNTAgODQ0VDM4MCA3OTRRMzg4IDc4MCAzOTQgNzY4VDQwOSA3NDFRNDIzIDc1NSA0MzMgNzY2VDQ2MSA3OTVRNDkzIDgyOCA1MTAgODQyVDUzOCA4NTZRNTUyIDg1NiA1NTIgODQzUTU1MiA4MzEgNTM3IDgxM1Q0ODYgNzYzUTQ1MSA3MzEgNDI4IDcxNVQ0MDMgNjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFCOyIgZ2x5cGgtbmFtZT0iZWNhcm9uIiBob3Jpei1hZHYteD0iNTM5IiBkPSJNMjU0IC0xMFEyMDQgLTEwIDE2NyA0VDEwMyA0M1Q2NCAxMDRUNTEgMTgxUTUxIDI0NCA3MyAyOTlUMTM2IDM5NVQyMjkgNDU5VDM0NiA0ODNRNDI0IDQ4MyA0NjcgNDQ5VDUxMCAzNjRRNTEwIDMzMiA0OTggMzA2VDQ1NCAyNjBUMzY5IDIzMVQyMzUgMjIwUTIwNiAyMjAgMTc0IDIyMVQxMDMgMjI3UTEwMCAyMDYgMTAwIDE4NFExMDAgMTE2IDEzOSA3NFQyNTYgMzFRMzE0IDMxIDM1NCA1MlQ0MjIgMTEzUTQyMyAxMTQgNDI3IDExM1Q0MzUgMTA5VDQ0MyAxMDFUNDQ3IDkwUTQ0NyA4MSA0NDMgNzNUNDI0IDUxUTM5NCAyMCAzNTMgNVQyNTQgLTEwWk0zNDMgNDQxUTMwMiA0NDEgMjY2IDQyOFQyMDAgMzkxVDE0OCAzMzdUMTEzIDI2OFExNDcgMjYzIDE3NiAyNjJUMjMxIDI2MFEzMDAgMjYwIDM0NCAyNjlUNDE1IDI5MlQ0NTEgMzI0VDQ2MSAzNjNRNDYxIDM5MiA0MzIgNDE2VDM0MyA0NDFaTTMzMyA1MjlRMzMxIDUyOSAzMTYgNTQ1VDI4MCA1OTJRMjU3IDYyNiAyNTAgNjQyVDI0MiA2NjZRMjQyIDY3NyAyNDcgNjgyVDI2MCA2ODdRMjcwIDY4NyAyODAgNjc1VDMxMCA2MjVRMzE4IDYxMSAzMjQgNTk5VDMzOSA1NzJRMzUzIDU4NiAzNjMgNTk3VDM5MSA2MjZRNDIzIDY1OSA0NDAgNjczVDQ2OCA2ODdRNDgyIDY4NyA0ODIgNjc0UTQ4MiA2NjIgNDY3IDY0NFQ0MTYgNTk0UTM4MSA1NjIgMzU4IDU0NlQzMzMgNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFDOyIgZ2x5cGgtbmFtZT0iR2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3MjUiIGQ9Ik0zNjMgLTEwUTMwMSAtMTAgMjQ5IDhUMTYwIDYyVDEwMSAxNTBUODAgMjY4UTgwIDM0NCAxMDYgNDE0VDE3OSA1MzhUMjkyIDYyNFQ0MzcgNjU3UTUwOSA2NTcgNTU4IDYzNVQ2MzQgNTg1UTY1MyA1NjYgNjYyIDU0NlQ2NzIgNTExUTY3MiA0OTkgNjY3IDQ5MlQ2NTYgNDgyVDY0NSA0NzlUNjM4IDQ3OVE2MzEgNTA2IDYxNCA1MzBUNTcwIDU3M1Q1MTAgNjAyVDQzNiA2MTNRMzY5IDYxMyAzMTMgNTg1VDIxNyA1MTFUMTU1IDQwMlQxMzIgMjczUTEzMiAyMTUgMTQ5IDE3MFQxOTcgOTVUMjcwIDQ5VDM2NCAzM1E0MTQgMzMgNDU2IDQ5VDUyOSA5N1E1NDYgMTEzIDU1OCAxMzBUNTc5IDE2N1Q1OTYgMjEyVDYxMSAyNzNIMzg5TDM5OCAzMThINjMwUTY2NiAzMTggNjU4IDI4M0w1OTggMFE1OTggLTMgNTg3IC0zUTU3MyAtMyA1NjYgOFQ1NjQgNDlMNTc0IDk4UTU0OCA1MiA0OTQgMjFUMzYzIC0xMFpNMzMyIDcxNFEzMTggNzE0IDMxOCA3MjZRMzE4IDczOCAzMzMgNzU2VDM4NCA4MDdRNDE5IDgzOSA0NDIgODU1VDQ2NyA4NzJRNDY5IDg3MiA0ODQgODU2VDUyMCA4MDlRNTQzIDc3NSA1NTAgNzU5VDU1NyA3MzVRNTU3IDcyNCA1NTIgNzE5VDU0MCA3MTRRNTMwIDcxNCA1MjAgNzI2VDQ5MCA3NzZRNDgyIDc5MCA0NzYgODAyVDQ2MSA4MjlMNDA5IDc3NVEzNzcgNzQxIDM2MCA3MjhUMzMyIDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRDsiIGdseXBoLW5hbWU9ImdjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMjI1IC0xOTdRMTYyIC0xOTcgMTIwIC0xODBUNTMgLTEzN1EzNCAtMTE4IDI3IC0xMDFUMTkgLTcyUTE5IC02MCAyNCAtNTNUMzUgLTQyVDQ3IC0zOFQ1NCAtMzhRNjYgLTg2IDEwNyAtMTE5VDIyOSAtMTUzUTM4MyAtMTUzIDQxOSAxOEw0MzggMTA1UTQwNyA1OSAzNjEgMzJUMjU0IDVRMjE1IDUgMTgwIDE4VDExNiA1OFQ3MiAxMjNUNTUgMjEyUTU1IDI2NCA3NCAzMTJUMTI5IDM5OVQyMTEgNDYwVDMxNSA0ODNRMzUwIDQ4MyAzNzkgNDc0VDQzMSA0NDhUNDcwIDQxMVQ0OTQgMzY2TDUxOCA0NzNINTY0TDQ2NyAxNFE0NDUgLTg4IDM4NiAtMTQyVDIyNSAtMTk3Wk0yNjAgNDdRMjk3IDQ3IDMzMCA2MFQzOTAgOTVUNDM1IDE0N1Q0NjEgMjExTDQ4MCAyOThRNDY5IDM2MSA0MjUgNDAxVDMxMiA0NDFRMjY2IDQ0MSAyMjggNDIyVDE2MiAzNzBUMTE5IDI5NlQxMDQgMjEyUTEwNCAxNzMgMTE3IDE0M1QxNTEgOTFUMjAxIDU5VDI2MCA0N1pNMjQ3IDU0NVEyMzMgNTQ1IDIzMyA1NTdRMjMzIDU2OSAyNDggNTg3VDI5OSA2MzhRMzM0IDY3MCAzNTcgNjg2VDM4MiA3MDNRMzg0IDcwMyAzOTkgNjg3VDQzNSA2NDBRNDU4IDYwNiA0NjUgNTkwVDQ3MiA1NjZRNDcyIDU1NSA0NjcgNTUwVDQ1NSA1NDVRNDQ1IDU0NSA0MzUgNTU3VDQwNSA2MDdRMzk3IDYyMSAzOTEgNjMzVDM3NiA2NjBMMzI0IDYwNlEyOTIgNTcyIDI3NSA1NTlUMjQ3IDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRTsiIGdseXBoLW5hbWU9IkdicmV2ZSIgaG9yaXotYWR2LXg9IjcyNSIgZD0iTTM2MyAtMTBRMzAxIC0xMCAyNDkgOFQxNjAgNjJUMTAxIDE1MFQ4MCAyNjhRODAgMzQ0IDEwNiA0MTRUMTc5IDUzOFQyOTIgNjI0VDQzNyA2NTdRNTA5IDY1NyA1NTggNjM1VDYzNCA1ODVRNjUzIDU2NiA2NjIgNTQ2VDY3MiA1MTFRNjcyIDQ5OSA2NjcgNDkyVDY1NiA0ODJUNjQ1IDQ3OVQ2MzggNDc5UTYzMSA1MDYgNjE0IDUzMFQ1NzAgNTczVDUxMCA2MDJUNDM2IDYxM1EzNjkgNjEzIDMxMyA1ODVUMjE3IDUxMVQxNTUgNDAyVDEzMiAyNzNRMTMyIDIxNSAxNDkgMTcwVDE5NyA5NVQyNzAgNDlUMzY0IDMzUTQxNCAzMyA0NTYgNDlUNTI5IDk3UTU0NiAxMTMgNTU4IDEzMFQ1NzkgMTY3VDU5NiAyMTJUNjExIDI3M0gzODlMMzk4IDMxOEg2MzBRNjY2IDMxOCA2NTggMjgzTDU5OCAwUTU5OCAtMyA1ODcgLTNRNTczIC0zIDU2NiA4VDU2NCA0OUw1NzQgOThRNTQ4IDUyIDQ5NCAyMVQzNjMgLTEwWk00NDkgNzE0UTQxNiA3MTQgMzkzIDcyNFQzNTUgNzQ4UTMzOCA3NjUgMzMxIDc4M1QzMjQgODE1UTMyNCA4MjYgMzMwIDgzNFQzNTQgODQyUTM2MyA4MDMgMzg3IDc4MFQ0NTAgNzU3UTQ4OCA3NTcgNTE0IDc4MFQ1NTUgODQyUTU3MiA4NDIgNTc4IDgzNFQ1ODUgODE4UTU4NSA4MDcgNTc2IDc4OVQ1NTEgNzU1UTUzMiA3MzYgNTA2IDcyNVQ0NDkgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFGOyIgZ2x5cGgtbmFtZT0iZ2JyZXZlIiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMjI1IC0xOTdRMTYyIC0xOTcgMTIwIC0xODBUNTMgLTEzN1EzNCAtMTE4IDI3IC0xMDFUMTkgLTcyUTE5IC02MCAyNCAtNTNUMzUgLTQyVDQ3IC0zOFQ1NCAtMzhRNjYgLTg2IDEwNyAtMTE5VDIyOSAtMTUzUTM4MyAtMTUzIDQxOSAxOEw0MzggMTA1UTQwNyA1OSAzNjEgMzJUMjU0IDVRMjE1IDUgMTgwIDE4VDExNiA1OFQ3MiAxMjNUNTUgMjEyUTU1IDI2NCA3NCAzMTJUMTI5IDM5OVQyMTEgNDYwVDMxNSA0ODNRMzUwIDQ4MyAzNzkgNDc0VDQzMSA0NDhUNDcwIDQxMVQ0OTQgMzY2TDUxOCA0NzNINTY0TDQ2NyAxNFE0NDUgLTg4IDM4NiAtMTQyVDIyNSAtMTk3Wk0yNjAgNDdRMjk3IDQ3IDMzMCA2MFQzOTAgOTVUNDM1IDE0N1Q0NjEgMjExTDQ4MCAyOThRNDY5IDM2MSA0MjUgNDAxVDMxMiA0NDFRMjY2IDQ0MSAyMjggNDIyVDE2MiAzNzBUMTE5IDI5NlQxMDQgMjEyUTEwNCAxNzMgMTE3IDE0M1QxNTEgOTFUMjAxIDU5VDI2MCA0N1pNMzYzIDU0NVEzMzAgNTQ1IDMwNyA1NTVUMjY5IDU3OVEyNTIgNTk2IDI0NSA2MTRUMjM4IDY0NlEyMzggNjU3IDI0NCA2NjVUMjY4IDY3M1EyNzcgNjM0IDMwMSA2MTFUMzY0IDU4OFE0MDIgNTg4IDQyOCA2MTFUNDY5IDY3M1E0ODYgNjczIDQ5MiA2NjVUNDk5IDY0OVE0OTkgNjM4IDQ5MCA2MjBUNDY1IDU4NlE0NDYgNTY3IDQyMCA1NTZUMzYzIDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMDsiIGdseXBoLW5hbWU9Ikdkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI3MjUiIGQ9Ik0zNjMgLTEwUTMwMSAtMTAgMjQ5IDhUMTYwIDYyVDEwMSAxNTBUODAgMjY4UTgwIDM0NCAxMDYgNDE0VDE3OSA1MzhUMjkyIDYyNFQ0MzcgNjU3UTUwOSA2NTcgNTU4IDYzNVQ2MzQgNTg1UTY1MyA1NjYgNjYyIDU0NlQ2NzIgNTExUTY3MiA0OTkgNjY3IDQ5MlQ2NTYgNDgyVDY0NSA0NzlUNjM4IDQ3OVE2MzEgNTA2IDYxNCA1MzBUNTcwIDU3M1Q1MTAgNjAyVDQzNiA2MTNRMzY5IDYxMyAzMTMgNTg1VDIxNyA1MTFUMTU1IDQwMlQxMzIgMjczUTEzMiAyMTUgMTQ5IDE3MFQxOTcgOTVUMjcwIDQ5VDM2NCAzM1E0MTQgMzMgNDU2IDQ5VDUyOSA5N1E1NDYgMTEzIDU1OCAxMzBUNTc5IDE2N1Q1OTYgMjEyVDYxMSAyNzNIMzg5TDM5OCAzMThINjMwUTY2NiAzMTggNjU4IDI4M0w1OTggMFE1OTggLTMgNTg3IC0zUTU3MyAtMyA1NjYgOFQ1NjQgNDlMNTc0IDk4UTU0OCA1MiA0OTQgMjFUMzYzIC0xMFpNNDQyIDcxNVE0MDEgNzE1IDQwMSA3NDZRNDAxIDc2NSA0MTEgNzc5VDQ0MyA3OTRRNDg1IDc5NCA0ODUgNzYzUTQ4NSA3NDQgNDc0IDczMFQ0NDIgNzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIxOyIgZ2x5cGgtbmFtZT0iZ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjU5OCIgZD0iTTIyNSAtMTk3UTE2MiAtMTk3IDEyMCAtMTgwVDUzIC0xMzdRMzQgLTExOCAyNyAtMTAxVDE5IC03MlExOSAtNjAgMjQgLTUzVDM1IC00MlQ0NyAtMzhUNTQgLTM4UTY2IC04NiAxMDcgLTExOVQyMjkgLTE1M1EzODMgLTE1MyA0MTkgMThMNDM4IDEwNVE0MDcgNTkgMzYxIDMyVDI1NCA1UTIxNSA1IDE4MCAxOFQxMTYgNThUNzIgMTIzVDU1IDIxMlE1NSAyNjQgNzQgMzEyVDEyOSAzOTlUMjExIDQ2MFQzMTUgNDgzUTM1MCA0ODMgMzc5IDQ3NFQ0MzEgNDQ4VDQ3MCA0MTFUNDk0IDM2Nkw1MTggNDczSDU2NEw0NjcgMTRRNDQ1IC04OCAzODYgLTE0MlQyMjUgLTE5N1pNMjYwIDQ3UTI5NyA0NyAzMzAgNjBUMzkwIDk1VDQzNSAxNDdUNDYxIDIxMUw0ODAgMjk4UTQ2OSAzNjEgNDI1IDQwMVQzMTIgNDQxUTI2NiA0NDEgMjI4IDQyMlQxNjIgMzcwVDExOSAyOTZUMTA0IDIxMlExMDQgMTczIDExNyAxNDNUMTUxIDkxVDIwMSA1OVQyNjAgNDdaTTM1MSA1NDZRMzEwIDU0NiAzMTAgNTc3UTMxMCA1OTYgMzIwIDYxMFQzNTIgNjI1UTM5NCA2MjUgMzk0IDU5NFEzOTQgNTc1IDM4MyA1NjFUMzUxIDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMjsiIGdseXBoLW5hbWU9Ikdjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjcyNSIgZD0iTTM2MyAtMTBRMzAxIC0xMCAyNDkgOFQxNjAgNjJUMTAxIDE1MFQ4MCAyNjhRODAgMzQ0IDEwNiA0MTRUMTc5IDUzOFQyOTIgNjI0VDQzNyA2NTdRNTA5IDY1NyA1NTggNjM1VDYzNCA1ODVRNjUzIDU2NiA2NjIgNTQ2VDY3MiA1MTFRNjcyIDQ5OSA2NjcgNDkyVDY1NiA0ODJUNjQ1IDQ3OVQ2MzggNDc5UTYzMSA1MDYgNjE0IDUzMFQ1NzAgNTczVDUxMCA2MDJUNDM2IDYxM1EzNjkgNjEzIDMxMyA1ODVUMjE3IDUxMVQxNTUgNDAyVDEzMiAyNzNRMTMyIDIxNSAxNDkgMTcwVDE5NyA5NVQyNzAgNDlUMzY0IDMzUTQxNCAzMyA0NTYgNDlUNTI5IDk3UTU0NiAxMTMgNTU4IDEzMFQ1NzkgMTY3VDU5NiAyMTJUNjExIDI3M0gzODlMMzk4IDMxOEg2MzBRNjY2IDMxOCA2NTggMjgzTDU5OCAwUTU5OCAtMyA1ODcgLTNRNTczIC0zIDU2NiA4VDU2NCA0OUw1NzQgOThRNTQ4IDUyIDQ5NCAyMVQzNjMgLTEwWk0yNDMgLTI2N1EyNDEgLTI2OSAyMzcgLTI2OFQyMjggLTI2NVQyMjEgLTI1OVQyMjAgLTI1MkwzMjcgLTYzUTMyOCAtNjIgMzM1IC02MlQzNTAgLTY1VDM2NSAtNzNUMzcyIC04OFEzNzIgLTk2IDM2OSAtMTA0VDM1OCAtMTIzTDI0MyAtMjY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIzOyIgZ2x5cGgtbmFtZT0iZ2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMjI1IC0xOTdRMTYyIC0xOTcgMTIwIC0xODBUNTMgLTEzN1EzNCAtMTE4IDI3IC0xMDFUMTkgLTcyUTE5IC02MCAyNCAtNTNUMzUgLTQyVDQ3IC0zOFQ1NCAtMzhRNjYgLTg2IDEwNyAtMTE5VDIyOSAtMTUzUTM4MyAtMTUzIDQxOSAxOEw0MzggMTA1UTQwNyA1OSAzNjEgMzJUMjU0IDVRMjE1IDUgMTgwIDE4VDExNiA1OFQ3MiAxMjNUNTUgMjEyUTU1IDI2NCA3NCAzMTJUMTI5IDM5OVQyMTEgNDYwVDMxNSA0ODNRMzUwIDQ4MyAzNzkgNDc0VDQzMSA0NDhUNDcwIDQxMVQ0OTQgMzY2TDUxOCA0NzNINTY0TDQ2NyAxNFE0NDUgLTg4IDM4NiAtMTQyVDIyNSAtMTk3Wk0yNjAgNDdRMjk3IDQ3IDMzMCA2MFQzOTAgOTVUNDM1IDE0N1Q0NjEgMjExTDQ4MCAyOThRNDY5IDM2MSA0MjUgNDAxVDMxMiA0NDFRMjY2IDQ0MSAyMjggNDIyVDE2MiAzNzBUMTE5IDI5NlQxMDQgMjEyUTEwNCAxNzMgMTE3IDE0M1QxNTEgOTFUMjAxIDU5VDI2MCA0N1pNNDA3IDcxN1E0MDkgNzE5IDQxMyA3MThUNDIyIDcxNVQ0MjggNzA5VDQzMCA3MDJMMzIzIDUxM1EzMjIgNTEyIDMxNSA1MTJUMzAwIDUxNVQyODUgNTIzVDI3OCA1MzhRMjc4IDU0NiAyODEgNTU0VDI5MiA1NzNMNDA3IDcxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNDsiIGdseXBoLW5hbWU9IkhjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjk0IiBkPSJNMTc4IDYyN1ExODQgNjUwIDIwMyA2NTBIMjEwUTIzMyA2NTAgMjI4IDYyNEwxNjkgMzQ3SDU3Mkw2MzEgNjI3UTYzNyA2NTAgNjU2IDY1MEg2NjNRNjg3IDY1MCA2ODEgNjI0TDU0OCAwSDQ5OUw1NjIgMzAxSDE1OUw5NSAwSDQ2TDE3OCA2MjdaTTMyNiA3MTRRMzEyIDcxNCAzMTIgNzI2UTMxMiA3MzggMzI3IDc1NlQzNzggODA3UTQxMyA4MzkgNDM2IDg1NVQ0NjEgODcyUTQ2MyA4NzIgNDc4IDg1NlQ1MTQgODA5UTUzNyA3NzUgNTQ0IDc1OVQ1NTEgNzM1UTU1MSA3MjQgNTQ2IDcxOVQ1MzQgNzE0UTUyNCA3MTQgNTE0IDcyNlQ0ODQgNzc2UTQ3NiA3OTAgNDcwIDgwMlQ0NTUgODI5TDQwMyA3NzVRMzcxIDc0MSAzNTQgNzI4VDMyNiA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjU7IiBnbHlwaC1uYW1lPSJoY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTE3NSA2NTRRMTc5IDY3NiAxOTkgNjc2SDIwNlEyMTcgNjc2IDIyMCA2NjlUMjIyIDY0OUwxNjMgMzc4UTE5MiA0MjYgMjM3IDQ1NFQzMzkgNDgzUTQxNCA0ODMgNDU3IDQ0MFQ1MDEgMzI2UTUwMSAyOTkgNDkzIDI2MVQ0NzMgMTc1UTQ2MiAxMzYgNDU2IDEwOFQ0NTAgNjZRNDUwIDQzIDQ2MiAzNlQ0OTQgMjZRNDk1IDI2IDQ5NSAyMVQ0OTIgMTBUNDgyIC0yVDQ2MiAtN1E0MzYgLTcgNDE5IDEwVDQwMiA1OVE0MDIgNzkgNDA4IDExMFQ0MjYgMTgxUTQzOCAyMjYgNDQ1IDI2MFQ0NTIgMzE4UTQ1MiAzNzUgNDIxIDQwNlQzMzMgNDM4UTI3MCA0MzggMjI3IDQwNVQxNTAgMzEzTDgzIDBIMzVMMTc1IDY1NFpNMjA5IDczNVExOTUgNzM1IDE5NSA3NDdRMTk1IDc1OSAyMTAgNzc3VDI2MSA4MjhRMjk2IDg2MCAzMTkgODc2VDM0NCA4OTNRMzQ2IDg5MyAzNjEgODc3VDM5NyA4MzBRNDIwIDc5NiA0MjcgNzgwVDQzNCA3NTZRNDM0IDc0NSA0MjkgNzQwVDQxNyA3MzVRNDA3IDczNSAzOTcgNzQ3VDM2NyA3OTdRMzU5IDgxMSAzNTMgODIzVDMzOCA4NTBMMjg2IDc5NlEyNTQgNzYyIDIzNyA3NDlUMjA5IDczNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNjsiIGdseXBoLW5hbWU9IkhiYXIiIGhvcml6LWFkdi14PSI2OTQiIGQ9Ik05MSA0NzJRNjcgNDcyIDY3IDQ4NVE2NyA0OTkgNzYgNTEwUTc5IDUxNCA4NCA1MTVUOTYgNTE2SDE1NEwxNzggNjI3UTE4NCA2NTAgMjAzIDY1MEgyMTBRMjMzIDY1MCAyMjggNjI0TDIwNSA1MTZINjA3TDYzMSA2MjdRNjM3IDY1MCA2NTYgNjUwSDY2M1E2ODcgNjUwIDY4MSA2MjRMNjU4IDUxNkg3MTBRNzMzIDUxNiA3MzMgNTAzUTczMyA0OTggNzMxIDQ5MVQ3MjQgNDc4UTcxOSA0NzIgNzA0IDQ3Mkg2NDhMNTQ4IDBINDk5TDU2MiAzMDFIMTU5TDk1IDBINDZMMTQ1IDQ3Mkg5MVpNNTcyIDM0N0w1OTggNDcySDE5NUwxNjkgMzQ3SDU3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNzsiIGdseXBoLW5hbWU9ImhiYXIiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik00NjIgLTdRNDM2IC03IDQxOSAxMFQ0MDIgNTlRNDAyIDc5IDQwOCAxMTBUNDI2IDE4MVE0MzggMjI2IDQ0NSAyNjBUNDUyIDMxOFE0NTIgMzc1IDQyMSA0MDZUMzMzIDQzOFEyNzAgNDM4IDIyNyA0MDVUMTUwIDMxM0w4MyAwSDM1TDE1NSA1NjNIMTAyUTc5IDU2MyA3OSA1NzZRNzkgNTgyIDgxIDU5MFQ4OCA2MDNROTQgNjA5IDEwOCA2MDlIMTY1TDE3OSA2NzRIMjI3TDIxMyA2MDlIMzI5UTM1MyA2MDkgMzUzIDU5NVEzNTMgNTkwIDM1MSA1ODJUMzQ0IDU2OVEzNDEgNTY1IDMzNiA1NjRUMzI0IDU2M0gyMDNMMTYzIDM3OFExOTIgNDI2IDIzNyA0NTRUMzM5IDQ4M1E0MTQgNDgzIDQ1NyA0NDBUNTAxIDMyNlE1MDEgMjk5IDQ5MyAyNjFUNDczIDE3NVE0NjIgMTM2IDQ1NiAxMDhUNDUwIDY2UTQ1MCA0MyA0NjIgMzZUNDk0IDI2UTQ5NSAyNiA0OTUgMjFUNDkyIDEwVDQ4MiAtMlQ0NjIgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjg7IiBnbHlwaC1uYW1lPSJJdGlsZGUiIGhvcml6LWFkdi14PSIyNjEiIGQ9Ik0xOTAgNjI4UTE5NCA2NTAgMjE0IDY1MEgyMjFRMjMyIDY1MCAyMzYgNjQzVDIzOSA2MjNMMTA2IDBINTZMMTkwIDYyOFpNMjkwIDY2OVEyNjUgNjY5IDI0OSA2ODFUMjE4IDcxMFEyMDQgNzI1IDE5NSA3MzJUMTc1IDczOVExNjAgNzM5IDE1MSA3MjhUMTM2IDY5N1ExMjggNjc0IDExMiA2NzRRMTA0IDY3NCA5NSA2ODFRMTAzIDcyNiAxMjQgNzUzVDE4MSA3ODBRMjA2IDc4MCAyMjIgNzY3VDI1MyA3MzhRMjY2IDcyMyAyNzUgNzE2VDI5NiA3MDlRMzEwIDcwOSAzMTkgNzIwVDMzNSA3NTFRMzM5IDc2MiAzNDQgNzY4VDM1OCA3NzRRMzY2IDc3NCAzNzUgNzY3UTM2NyA3MjIgMzQ2IDY5NlQyOTAgNjY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI5OyIgZ2x5cGgtbmFtZT0iaXRpbGRlIiBob3Jpei1hZHYteD0iMjMwIiBkPSJNMTIyIC03UTg1IC03IDY4IDE3VDYxIDk0TDE0MiA0NzNIMTg5TDEwOSA5NVExMDEgNTQgMTEzIDQxVDE1NiAyN1ExNTYgMjcgMTU2IDIyVDE1NCAxMFQxNDQgLTFUMTIyIC03Wk0yNDYgNTQ0UTIyMSA1NDQgMjA1IDU1NlQxNzQgNTg1UTE2MCA2MDAgMTUxIDYwN1QxMzEgNjE0UTExNiA2MTQgMTA3IDYwM1Q5MiA1NzJRODQgNTQ5IDY4IDU0OVE2MCA1NDkgNTEgNTU2UTU5IDYwMSA4MCA2MjhUMTM3IDY1NVExNjIgNjU1IDE3OCA2NDJUMjA5IDYxM1EyMjIgNTk4IDIzMSA1OTFUMjUyIDU4NFEyNjYgNTg0IDI3NSA1OTVUMjkxIDYyNlEyOTUgNjM3IDMwMCA2NDNUMzE0IDY0OVEzMjIgNjQ5IDMzMSA2NDJRMzIzIDU5NyAzMDIgNTcxVDI0NiA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkE7IiBnbHlwaC1uYW1lPSJJbWFjcm9uIiBob3Jpei1hZHYteD0iMjYxIiBkPSJNMTkwIDYyOFExOTQgNjUwIDIxNCA2NTBIMjIxUTIzMiA2NTAgMjM2IDY0M1QyMzkgNjIzTDEwNiAwSDU2TDE5MCA2MjhaTTEzNiA3MzZRMTEzIDczNiAxMTMgNzQ5UTExMyA3NTQgMTE1IDc2MlQxMjIgNzc1UTEyNSA3NzkgMTMwIDc4MFQxNDIgNzgxSDM1NFEzNzggNzgxIDM3OCA3NjhRMzc4IDc2MyAzNzYgNzU1VDM2OSA3NDFRMzY2IDczOCAzNjEgNzM3VDM0OSA3MzZIMTM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJCOyIgZ2x5cGgtbmFtZT0iaW1hY3JvbiIgaG9yaXotYWR2LXg9IjIzMCIgZD0iTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxNDIgNDczSDE4OUwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1pNNzggNTY3UTU1IDU2NyA1NSA1ODBRNTUgNTg1IDU3IDU5M1Q2NCA2MDZRNjcgNjEwIDcyIDYxMVQ4NCA2MTJIMjk2UTMyMCA2MTIgMzIwIDU5OVEzMjAgNTk0IDMxOCA1ODZUMzExIDU3MlEzMDggNTY5IDMwMyA1NjhUMjkxIDU2N0g3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRTsiIGdseXBoLW5hbWU9IklvZ29uZWsiIGhvcml6LWFkdi14PSIyNjEiIGQ9Ik0xOTAgNjI4UTE5NCA2NTAgMjE0IDY1MEgyMjFRMjMyIDY1MCAyMzYgNjQzVDIzOSA2MjNMMTA2IDBIOThRMzIgLTMzIDkgLTYyVC0xNSAtMTE1US0xNSAtMTMyIC00IC0xNDJUMjQgLTE1MlE0NSAtMTUyIDYxIC0xMzZRNjkgLTEzNyA3NCAtMTQyVDgwIC0xNThRODAgLTE3NCA2MyAtMTg0VDIwIC0xOTVRLTE1IC0xOTUgLTM4IC0xNzVULTYxIC0xMjNRLTYxIC05MCAtMzQgLTU3VDU2IDNMMTkwIDYyOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRjsiIGdseXBoLW5hbWU9ImlvZ29uZWsiIGhvcml6LWFkdi14PSIyMzAiIGQ9Ik0xNTYgMjdRMTU2IDI3IDE1NiAyM1QxNTUgMTNUMTQ3IDJUMTMyIC02UTcyIC0zOCA1MSAtNjVUMjkgLTExNlEyOSAtMTMzIDQwIC0xNDNUNjggLTE1M1E4OSAtMTUzIDEwNSAtMTM3UTExMyAtMTM4IDExOCAtMTQzVDEyNCAtMTU5UTEyNCAtMTc1IDEwNyAtMTg1VDY0IC0xOTZRMjkgLTE5NiA2IC0xNzZULTE3IC0xMjRRLTE3IC05MiA4IC02MFQ5MSAtMVE2OSA3IDYxIDMwVDYxIDk0TDE0MiA0NzNIMTg5TDEwOSA5NVExMDEgNTQgMTEzIDQxVDE1NiAyN1pNMjAwIDYwMVExNjYgNjAxIDE2NiA2MjdRMTY2IDY0MyAxNzUgNjU1VDIwMSA2NjdRMjM1IDY2NyAyMzUgNjQxUTIzNSA2MjUgMjI2IDYxM1QyMDAgNjAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMwOyIgZ2x5cGgtbmFtZT0iSWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjI2MSIgZD0iTTE5MCA2MjhRMTk0IDY1MCAyMTQgNjUwSDIyMVEyMzIgNjUwIDIzNiA2NDNUMjM5IDYyM0wxMDYgMEg1NkwxOTAgNjI4Wk0yNDAgNzE1UTE5OSA3MTUgMTk5IDc0NlExOTkgNzY1IDIwOSA3NzlUMjQxIDc5NFEyODMgNzk0IDI4MyA3NjNRMjgzIDc0NCAyNzIgNzMwVDI0MCA3MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzE7IiBnbHlwaC1uYW1lPSJkb3RsZXNzaSIgaG9yaXotYWR2LXg9IjIzMCIgZD0iTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxNDIgNDczSDE4OUwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMjsiIGdseXBoLW5hbWU9IklKIiBob3Jpei1hZHYteD0iNzMxIiBkPSJNMTkwIDYyOFExOTQgNjUwIDIxNCA2NTBIMjIxUTIzMiA2NTAgMjM2IDY0M1QyMzkgNjIzTDEwNiAwSDU2TDE5MCA2MjhaTTQzNyAtMTBRMzkyIC0xMCAzNjAgNFQzMDcgMzhRMjkyIDU0IDI4NiA2NlQyODAgODdRMjgwIDk2IDI4NCAxMDJUMjkzIDExMlQzMDMgMTE3VDMwOSAxMTdRMzIzIDgwIDM1NyA1N1Q0MzcgMzNRNDk5IDMzIDUzNCA3MVQ1ODcgMTkyTDY4NCA2NDdINzMzTDYzNSAxODVRNjE0IDg1IDU2NiAzOFQ0MzcgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMzOyIgZ2x5cGgtbmFtZT0iaWoiIGhvcml6LWFkdi14PSI0NjAiIGQ9Ik0yMDAgNjAxUTE2NiA2MDEgMTY2IDYyN1ExNjYgNjQzIDE3NSA2NTVUMjAxIDY2N1EyMzUgNjY3IDIzNSA2NDFRMjM1IDYyNSAyMjYgNjEzVDIwMCA2MDFaTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxNDIgNDczSDE4OUwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1pNNDMwIDYwMVEzOTYgNjAxIDM5NiA2MjdRMzk2IDY0MyA0MDUgNjU1VDQzMSA2NjdRNDY1IDY2NyA0NjUgNjQxUTQ2NSA2MjUgNDU2IDYxM1Q0MzAgNjAxWk0xNzIgLTE5OVExNDIgLTE5OSAxMjMgLTE5MVQ5MyAtMTczUTgyIC0xNjIgODIgLTE1MVE4MiAtMTM3IDkxIC0xMjhUMTAyIC0xMjFRMTEzIC0xMzUgMTMxIC0xNDVUMTc0IC0xNTZRMjA1IC0xNTYgMjI1IC0xMzZUMjU3IC02NUwzNzIgNDczSDQxOUwzMDMgLTczUTI4OSAtMTM5IDI1NSAtMTY5VDE3MiAtMTk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM0OyIgZ2x5cGgtbmFtZT0iSmNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI0NzAiIGQ9Ik0xNzYgLTEwUTEzMSAtMTAgOTkgNFQ0NiAzOFEzMSA1NCAyNSA2NlQxOSA4N1ExOSA5NiAyMyAxMDJUMzIgMTEyVDQyIDExN1Q0OCAxMTdRNjIgODAgOTYgNTdUMTc2IDMzUTIzOCAzMyAyNzMgNzFUMzI2IDE5Mkw0MjMgNjQ3SDQ3MkwzNzQgMTg1UTM1MyA4NSAzMDUgMzhUMTc2IC0xMFpNMzU2IDcxNFEzNDIgNzE0IDM0MiA3MjZRMzQyIDczOCAzNTcgNzU2VDQwOCA4MDdRNDQzIDgzOSA0NjYgODU1VDQ5MSA4NzJRNDkzIDg3MiA1MDggODU2VDU0NCA4MDlRNTY3IDc3NSA1NzQgNzU5VDU4MSA3MzVRNTgxIDcyNCA1NzYgNzE5VDU2NCA3MTRRNTU0IDcxNCA1NDQgNzI2VDUxNCA3NzZRNTA2IDc5MCA1MDAgODAyVDQ4NSA4MjlMNDMzIDc3NVE0MDEgNzQxIDM4NCA3MjhUMzU2IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNTsiIGdseXBoLW5hbWU9ImpjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iMjMwIiBkPSJNNzkgNTQ1UTY1IDU0NSA2NSA1NTdRNjUgNTY5IDgwIDU4N1QxMzEgNjM4UTE2NiA2NzAgMTg5IDY4NlQyMTQgNzAzUTIxNiA3MDMgMjMxIDY4N1QyNjcgNjQwUTI5MCA2MDYgMjk3IDU5MFQzMDQgNTY2UTMwNCA1NTUgMjk5IDU1MFQyODcgNTQ1UTI3NyA1NDUgMjY3IDU1N1QyMzcgNjA3UTIyOSA2MjEgMjIzIDYzM1QyMDggNjYwTDE1NiA2MDZRMTI0IDU3MiAxMDcgNTU5VDc5IDU0NVpNLTU4IC0xOTlRLTg4IC0xOTkgLTEwNyAtMTkxVC0xMzcgLTE3M1EtMTQ4IC0xNjIgLTE0OCAtMTUxUS0xNDggLTEzNyAtMTM5IC0xMjhULTEyOCAtMTIxUS0xMTcgLTEzNSAtOTkgLTE0NVQtNTYgLTE1NlEtMjUgLTE1NiAtNSAtMTM2VDI3IC02NUwxNDEgNDcySDE0NVExNDcgNDcyIDE0OCA0NzJUMTUyIDQ3M0gxNjNIMTY5UTE3MCA0NzMgMTc5IDQ3M1QxODkgNDcyTDczIC03M1E1OSAtMTM5IDI1IC0xNjlULTU4IC0xOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzY7IiBnbHlwaC1uYW1lPSJLY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1NTkiIGQ9Ik00NTYgLTRRNDQ0IC00IDQzNCAwVDQxMiAxM1QzODggMzlUMzU2IDc4TDE2NSAzMjlMOTQgMEg0NUwxNzggNjI3UTE4MyA2NTAgMjAzIDY1MEgyMTBRMjMzIDY1MCAyMjggNjI0TDE2OCAzNDJMNTU5IDY1NlE1NjAgNjU2IDU2NyA2NTNUNTc5IDY0M1Q1ODEgNjIzVDU1NiA1OTRMMjIwIDMyOUw0MDIgOTZRNDE4IDc1IDQzMCA2MlQ0NTIgNDJUNDcyIDMyVDQ5NCAyOVE0OTUgMjkgNDk1IDI0VDQ5MiAxM1Q0ODEgMVQ0NTYgLTRaTTEyNyAtMjY3UTEyNSAtMjY5IDEyMSAtMjY4VDExMiAtMjY1VDEwNSAtMjU5VDEwNCAtMjUyTDIxMSAtNjNRMjEyIC02MiAyMTkgLTYyVDIzNCAtNjVUMjQ5IC03M1QyNTYgLTg4UTI1NiAtOTYgMjUzIC0xMDRUMjQyIC0xMjNMMTI3IC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzc7IiBnbHlwaC1uYW1lPSJrY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0NjEiIGQ9Ik0zNjMgLTdRMzUwIC03IDM0MCAtNFQzMTggOVQyOTIgMzZUMjU4IDgzTDEzNiAyNDZMODMgMEgzNUwxNzkgNjc0SDIyN0wxMzggMjU3TDQzMyA0ODJRNDM0IDQ4MyA0NDEgNDgwVDQ1MyA0NjlUNDU0IDQ1MFQ0MzAgNDIyTDE5MCAyNDRMMzA0IDk3UTMyMCA3NCAzMzEgNjJUMzUzIDQzVDM3NSAzNlQ0MDEgMzRRNDAxIDM0IDQwMSAyOFQzOTkgMTRUMzg4IDBUMzYzIC03Wk04NiAtMjY3UTg0IC0yNjkgODAgLTI2OFQ3MSAtMjY1VDY0IC0yNTlUNjMgLTI1MkwxNzAgLTYzUTE3MSAtNjIgMTc4IC02MlQxOTMgLTY1VDIwOCAtNzNUMjE1IC04OFEyMTUgLTk2IDIxMiAtMTA0VDIwMSAtMTIzTDg2IC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzk7IiBnbHlwaC1uYW1lPSJMYWN1dGUiIGhvcml6LWFkdi14PSI1MjAiIGQ9Ik0xNzggNjI3UTE4NCA2NTAgMjAzIDY1MEgyMTBRMjMzIDY1MCAyMjggNjI0TDEwNSA0Nkg0MTlRNDQyIDQ2IDQ0MiAzM1E0NDIgMjcgNDQwIDE5VDQzMiA1UTQyOCAwIDQxMiAwSDQ1TDE3OCA2MjdaTTIwNSA3MTZRMjA0IDcxNyAyMTMgNzI4VDI0MCA3NTRUMjgyIDc4OVQzMzQgODI2UTM1MSA4MzkgMzYxIDg0MlQzODAgODQ2UTM4OSA4NDYgMzk1IDg0MFQ0MDEgODI2UTQwMSA4MTYgMzkyIDgwN1QzNTkgNzgxUTMyOSA3NjMgMzAyIDc1MFQyNTMgNzI4VDIxOSA3MTdUMjA1IDcxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQTsiIGdseXBoLW5hbWU9ImxhY3V0ZSIgaG9yaXotYWR2LXg9IjIzMCIgZD0iTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxODUgNjc0SDIzMkwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1pNMTk1IDcxNlExOTQgNzE3IDIwMyA3MjhUMjMwIDc1NFQyNzIgNzg5VDMyNCA4MjZRMzQxIDgzOSAzNTEgODQyVDM3MCA4NDZRMzc5IDg0NiAzODUgODQwVDM5MSA4MjZRMzkxIDgxNiAzODIgODA3VDM0OSA3ODFRMzE5IDc2MyAyOTIgNzUwVDI0MyA3MjhUMjA5IDcxN1QxOTUgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNCOyIgZ2x5cGgtbmFtZT0iTGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTIwIiBkPSJNMTc4IDYyN1ExODQgNjUwIDIwMyA2NTBIMjEwUTIzMyA2NTAgMjI4IDYyNEwxMDUgNDZINDE5UTQ0MiA0NiA0NDIgMzNRNDQyIDI3IDQ0MCAxOVQ0MzIgNVE0MjggMCA0MTIgMEg0NUwxNzggNjI3Wk0xMzAgLTI2N1ExMjggLTI2OSAxMjQgLTI2OFQxMTUgLTI2NVQxMDggLTI1OVQxMDcgLTI1MkwyMTQgLTYzUTIxNSAtNjIgMjIyIC02MlQyMzcgLTY1VDI1MiAtNzNUMjU5IC04OFEyNTkgLTk2IDI1NiAtMTA0VDI0NSAtMTIzTDEzMCAtMjY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNDOyIgZ2x5cGgtbmFtZT0ibGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iMjMwIiBkPSJNMTIyIC03UTg1IC03IDY4IDE3VDYxIDk0TDE4NSA2NzRIMjMyTDEwOSA5NVExMDEgNTQgMTEzIDQxVDE1NiAyN1ExNTYgMjcgMTU2IDIyVDE1NCAxMFQxNDQgLTFUMTIyIC03Wk0tMTEgLTI2N1EtMTMgLTI2OSAtMTcgLTI2OFQtMjYgLTI2NVQtMzMgLTI1OVQtMzQgLTI1Mkw3MyAtNjNRNzQgLTYyIDgxIC02MlQ5NiAtNjVUMTExIC03M1QxMTggLTg4UTExOCAtOTYgMTE1IC0xMDRUMTA0IC0xMjNMLTExIC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Q7IiBnbHlwaC1uYW1lPSJMY2Fyb24iIGhvcml6LWFkdi14PSI2MTYiIGQ9Ik00OTUgNDM2UTQ5MyA0MzQgNDg5IDQzNVQ0ODAgNDM4VDQ3MyA0NDVUNDcyIDQ1Mkw1ODIgNjU4UTU4MyA2NTkgNTkwIDY1OVQ2MDUgNjU2VDYyMCA2NDhUNjI3IDYzM1E2MjcgNjI1IDYyNCA2MTdUNjEzIDU5OEw0OTUgNDM2Wk0xNzggNjI3UTE4NCA2NTAgMjAzIDY1MEgyMTBRMjMzIDY1MCAyMjggNjI0TDEwNSA0Nkg0MTlRNDQyIDQ2IDQ0MiAzM1E0NDIgMjcgNDQwIDE5VDQzMiA1UTQyOCAwIDQxMiAwSDQ1TDE3OCA2MjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0U7IiBnbHlwaC1uYW1lPSJsY2Fyb24iIGhvcml6LWFkdi14PSIzOTIiIGQ9Ik0yNzIgNDUzUTI3MCA0NTEgMjY2IDQ1MlQyNTcgNDU1VDI1MCA0NjJUMjQ5IDQ2OUwzNTkgNjc1UTM2MCA2NzYgMzY3IDY3NlQzODIgNjczVDM5NyA2NjVUNDA0IDY1MFE0MDQgNjQyIDQwMSA2MzRUMzkwIDYxNUwyNzIgNDUzWk0xMjIgLTdRODUgLTcgNjggMTdUNjEgOTRMMTg1IDY3NEgyMzJMMTA5IDk1UTEwMSA1NCAxMTMgNDFUMTU2IDI3UTE1NiAyNyAxNTYgMjJUMTU0IDEwVDE0NCAtMVQxMjIgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBnbHlwaC1uYW1lPSJMZG90IiBob3Jpei1hZHYteD0iNjA2IiBkPSJNMTc4IDYyN1ExODQgNjUwIDIwMyA2NTBIMjEwUTIzMyA2NTAgMjI4IDYyNEwxMDUgNDZINDE5UTQ0MiA0NiA0NDIgMzNRNDQyIDI3IDQ0MCAxOVQ0MzIgNVE0MjggMCA0MTIgMEg0NUwxNzggNjI3Wk01MzQgMjgxUTQ5NyAyODEgNDk3IDMwN1E0OTcgMzM1IDUxMCAzNDhRNTE5IDM1OCA1MzggMzU4UTU3NSAzNTggNTc1IDMzMVE1NzUgMzAzIDU2MiAyOTFRNTUyIDI4MSA1MzQgMjgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQwOyIgZ2x5cGgtbmFtZT0ibGRvdCIgaG9yaXotYWR2LXg9IjM2OCIgZD0iTTEyMiAtN1E4NSAtNyA2OCAxN1Q2MSA5NEwxODUgNjc0SDIzMkwxMDkgOTVRMTAxIDU0IDExMyA0MVQxNTYgMjdRMTU2IDI3IDE1NiAyMlQxNTQgMTBUMTQ0IC0xVDEyMiAtN1pNMjg5IDIyNFEyNTIgMjI0IDI1MiAyNTBRMjUyIDI3OCAyNjUgMjkxUTI3NCAzMDEgMjkzIDMwMVEzMzAgMzAxIDMzMCAyNzRRMzMwIDI0NiAzMTcgMjM0UTMwNyAyMjQgMjg5IDIyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MTsiIGdseXBoLW5hbWU9IkNSIiBob3Jpei1hZHYteD0iNTc2IiBkPSJNMTIzIDBRODcgMCA5NSAzNUwxMzkgMjQ0TDUxIDIxN1E0OSAyMTYgNDUgMjIzVDQwIDIzOVE0MCAyNDggNDggMjU2VDc2IDI3MEwxNDkgMjkzTDIyMCA2MjdRMjI2IDY1MCAyNDUgNjUwSDI1MlEyNzUgNjUwIDI3MCA2MjRMMjAyIDMwOEw0MTYgMzcyUTQxOCAzNzMgNDIyIDM2NlQ0MjYgMzUwUTQyNiAzNDEgNDE4IDMzM1QzOTAgMzE5TDE5MiAyNTlMMTQ3IDQ2SDQ2MVE0ODQgNDYgNDg0IDMzUTQ4NCAyNyA0ODIgMTlUNDc0IDVRNDcwIDAgNDU0IDBIMTIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQyOyIgZ2x5cGgtbmFtZT0ibHNsYXNoIiBob3Jpei1hZHYteD0iMzUwIiBkPSJNMTc5IC03UTE0MiAtNyAxMjUgMTdUMTE4IDk0TDE1MyAyNTVMNDkgMjI1UTQ3IDIyNSA0MyAyMzNUMzkgMjQ4UTM5IDI1NiA0NiAyNjRUNzUgMjc4TDE2MyAzMDRMMjM4IDY1NVEyNDIgNjc4IDI2MCA2NzhIMjY2UTI3NSA2NzggMjgxIDY3NFQyODYgNjU1TDIxNCAzMThMMzI1IDM1MVEzMjcgMzUxIDMzMSAzNDNUMzM2IDMyOFEzMzYgMzIwIDMyOSAzMTJUMzAwIDI5OEwyMDQgMjcwTDE2NiA5NVExNTggNTQgMTcwIDQxVDIxNCAyN1EyMTQgMjcgMjE0IDIyVDIxMSAxMFQyMDEgLTFUMTc5IC03WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgZ2x5cGgtbmFtZT0iTmFjdXRlIiBob3Jpei1hZHYteD0iNzA0IiBkPSJNMTc2IDYxNlExODQgNjUwIDIxMSA2NTBIMjI0UTIzNiA2NTAgMjQyIDY0M1QyNTYgNjIyTDUyNyA3M0w2NTAgNjQ3SDY5Nkw1NjQgMjdRNTYxIDEzIDU1MyA1VDUzMiAtM0g1MjZRNTE1IC0zIDUwOSA0VDQ5NCAyNUwyMTcgNTg4TDkxIDBINDVMMTc2IDYxNlpNNDAxIDcxNlE0MDAgNzE3IDQwOSA3MjhUNDM2IDc1NFQ0NzggNzg5VDUzMCA4MjZRNTQ3IDgzOSA1NTcgODQyVDU3NiA4NDZRNTg1IDg0NiA1OTEgODQwVDU5NyA4MjZRNTk3IDgxNiA1ODggODA3VDU1NSA3ODFRNTI1IDc2MyA0OTggNzUwVDQ0OSA3MjhUNDE1IDcxN1Q0MDEgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgZ2x5cGgtbmFtZT0ibmFjdXRlIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNNDYyIC03UTQzNiAtNyA0MTkgMTBUNDAyIDU5UTQwMiA3OSA0MDggMTEwVDQyNiAxODFRNDM4IDIyNiA0NDUgMjYwVDQ1MiAzMThRNDUyIDM3NSA0MjEgNDA2VDMzMyA0MzhRMjcwIDQzOCAyMjcgNDA1VDE1MCAzMTNMODMgMEgzNUwxMzcgNDczUTEzNyA0NzYgMTQ3IDQ3NlExNjEgNDc2IDE3MCA0NjZUMTczIDQyNEwxNjMgMzc5UTE5MyA0MjcgMjM3IDQ1NVQzMzkgNDgzUTQxNCA0ODMgNDU3IDQ0MFQ1MDEgMzI2UTUwMSAyOTkgNDkzIDI2MVQ0NzMgMTc1UTQ2MiAxMzYgNDU2IDEwOFQ0NTAgNjZRNDUwIDQzIDQ2MiAzNlQ0OTQgMjZRNDk1IDI2IDQ5NSAyMVQ0OTIgMTBUNDgyIC0yVDQ2MiAtN1pNMjc5IDU0N1EyNzggNTQ4IDI4NyA1NTlUMzE0IDU4NVQzNTYgNjIwVDQwOCA2NTdRNDI1IDY3MCA0MzUgNjczVDQ1NCA2NzdRNDYzIDY3NyA0NjkgNjcxVDQ3NSA2NTdRNDc1IDY0NyA0NjYgNjM4VDQzMyA2MTJRNDAzIDU5NCAzNzYgNTgxVDMyNyA1NTlUMjkzIDU0OFQyNzkgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ1OyIgZ2x5cGgtbmFtZT0iTmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNzA0IiBkPSJNMTc2IDYxNlExODQgNjUwIDIxMSA2NTBIMjI0UTIzNiA2NTAgMjQyIDY0M1QyNTYgNjIyTDUyNyA3M0w2NTAgNjQ3SDY5Nkw1NjQgMjdRNTYxIDEzIDU1MyA1VDUzMiAtM0g1MjZRNTE1IC0zIDUwOSA0VDQ5NCAyNUwyMTcgNTg4TDkxIDBINDVMMTc2IDYxNlpNMjAxIC0yNjdRMTk5IC0yNjkgMTk1IC0yNjhUMTg2IC0yNjVUMTc5IC0yNTlUMTc4IC0yNTJMMjg1IC02M1EyODYgLTYyIDI5MyAtNjJUMzA4IC02NVQzMjMgLTczVDMzMCAtODhRMzMwIC05NiAzMjcgLTEwNFQzMTYgLTEyM0wyMDEgLTI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NjsiIGdseXBoLW5hbWU9Im5jb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTQ2MiAtN1E0MzYgLTcgNDE5IDEwVDQwMiA1OVE0MDIgNzkgNDA4IDExMFQ0MjYgMTgxUTQzOCAyMjYgNDQ1IDI2MFQ0NTIgMzE4UTQ1MiAzNzUgNDIxIDQwNlQzMzMgNDM4UTI3MCA0MzggMjI3IDQwNVQxNTAgMzEzTDgzIDBIMzVMMTM3IDQ3M1ExMzcgNDc2IDE0NyA0NzZRMTYxIDQ3NiAxNzAgNDY2VDE3MyA0MjRMMTYzIDM3OVExOTMgNDI3IDIzNyA0NTVUMzM5IDQ4M1E0MTQgNDgzIDQ1NyA0NDBUNTAxIDMyNlE1MDEgMjk5IDQ5MyAyNjFUNDczIDE3NVE0NjIgMTM2IDQ1NiAxMDhUNDUwIDY2UTQ1MCA0MyA0NjIgMzZUNDk0IDI2UTQ5NSAyNiA0OTUgMjFUNDkyIDEwVDQ4MiAtMlQ0NjIgLTdaTTE1MiAtMjY3UTE1MCAtMjY5IDE0NiAtMjY4VDEzNyAtMjY1VDEzMCAtMjU5VDEyOSAtMjUyTDIzNiAtNjNRMjM3IC02MiAyNDQgLTYyVDI1OSAtNjVUMjc0IC03M1QyODEgLTg4UTI4MSAtOTYgMjc4IC0xMDRUMjY3IC0xMjNMMTUyIC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDc7IiBnbHlwaC1uYW1lPSJOY2Fyb24iIGhvcml6LWFkdi14PSI3MDQiIGQ9Ik0xNzYgNjE2UTE4NCA2NTAgMjExIDY1MEgyMjRRMjM2IDY1MCAyNDIgNjQzVDI1NiA2MjJMNTI3IDczTDY1MCA2NDdINjk2TDU2NCAyN1E1NjEgMTMgNTUzIDVUNTMyIC0zSDUyNlE1MTUgLTMgNTA5IDRUNDk0IDI1TDIxNyA1ODhMOTEgMEg0NUwxNzYgNjE2Wk00NDUgNjk4UTQ0MyA2OTggNDI4IDcxNFQzOTIgNzYxUTM2OSA3OTUgMzYyIDgxMVQzNTQgODM1UTM1NCA4NDYgMzU5IDg1MVQzNzIgODU2UTM4MiA4NTYgMzkyIDg0NFQ0MjIgNzk0UTQzMCA3ODAgNDM2IDc2OFQ0NTEgNzQxUTQ2NSA3NTUgNDc1IDc2NlQ1MDMgNzk1UTUzNSA4MjggNTUyIDg0MlQ1ODAgODU2UTU5NCA4NTYgNTk0IDg0M1E1OTQgODMxIDU3OSA4MTNUNTI4IDc2M1E0OTMgNzMxIDQ3MCA3MTVUNDQ1IDY5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGdseXBoLW5hbWU9Im5jYXJvbiIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTQ2MiAtN1E0MzYgLTcgNDE5IDEwVDQwMiA1OVE0MDIgNzkgNDA4IDExMFQ0MjYgMTgxUTQzOCAyMjYgNDQ1IDI2MFQ0NTIgMzE4UTQ1MiAzNzUgNDIxIDQwNlQzMzMgNDM4UTI3MCA0MzggMjI3IDQwNVQxNTAgMzEzTDgzIDBIMzVMMTM3IDQ3M1ExMzcgNDc2IDE0NyA0NzZRMTYxIDQ3NiAxNzAgNDY2VDE3MyA0MjRMMTYzIDM3OVExOTMgNDI3IDIzNyA0NTVUMzM5IDQ4M1E0MTQgNDgzIDQ1NyA0NDBUNTAxIDMyNlE1MDEgMjk5IDQ5MyAyNjFUNDczIDE3NVE0NjIgMTM2IDQ1NiAxMDhUNDUwIDY2UTQ1MCA0MyA0NjIgMzZUNDk0IDI2UTQ5NSAyNiA0OTUgMjFUNDkyIDEwVDQ4MiAtMlQ0NjIgLTdaTTM0OCA1MjlRMzQ2IDUyOSAzMzEgNTQ1VDI5NSA1OTJRMjcyIDYyNiAyNjUgNjQyVDI1NyA2NjZRMjU3IDY3NyAyNjIgNjgyVDI3NSA2ODdRMjg1IDY4NyAyOTUgNjc1VDMyNSA2MjVRMzMzIDYxMSAzMzkgNTk5VDM1NCA1NzJRMzY4IDU4NiAzNzggNTk3VDQwNiA2MjZRNDM4IDY1OSA0NTUgNjczVDQ4MyA2ODdRNDk3IDY4NyA0OTcgNjc0UTQ5NyA2NjIgNDgyIDY0NFQ0MzEgNTk0UTM5NiA1NjIgMzczIDU0NlQzNDggNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ5OyIgZ2x5cGgtbmFtZT0ibmFwb3N0cm9waGUiIGhvcml6LWFkdi14PSI3OTUiIGQ9Ik0xMTcgNDM2UTExNSA0MzQgMTExIDQzNVQxMDIgNDM4VDk1IDQ0NVQ5NCA0NTJMMjA0IDY1OFEyMDUgNjU5IDIxMiA2NTlUMjI3IDY1NlQyNDIgNjQ4VDI0OSA2MzNRMjQ5IDYyNSAyNDYgNjE3VDIzNSA1OThMMTE3IDQzNlpNNjg4IC03UTY2MiAtNyA2NDUgMTBUNjI4IDU5UTYyOCA3OSA2MzQgMTEwVDY1MiAxODFRNjY0IDIyNiA2NzEgMjYwVDY3OCAzMThRNjc4IDM3NSA2NDcgNDA2VDU1OSA0MzhRNDk2IDQzOCA0NTMgNDA1VDM3NiAzMTNMMzA5IDBIMjYxTDM2MyA0NzNRMzYzIDQ3NiAzNzMgNDc2UTM4NyA0NzYgMzk2IDQ2NlQzOTkgNDI0TDM4OSAzNzlRNDE5IDQyNyA0NjMgNDU1VDU2NSA0ODNRNjQwIDQ4MyA2ODMgNDQwVDcyNyAzMjZRNzI3IDI5OSA3MTkgMjYxVDY5OSAxNzVRNjg4IDEzNiA2ODIgMTA4VDY3NiA2NlE2NzYgNDMgNjg4IDM2VDcyMCAyNlE3MjEgMjYgNzIxIDIxVDcxOCAxMFQ3MDggLTJUNjg4IC03WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRDOyIgZ2x5cGgtbmFtZT0iT21hY3JvbiIgaG9yaXotYWR2LXg9Ijc2MSIgZD0iTTM2MyAtMTBRMjk4IC0xMCAyNDYgMTFUMTU2IDY5VDk5IDE1OFQ3OSAyNjlRNzkgMzUzIDEwOCA0MjRUMTg3IDU0N1QzMDEgNjI4VDQzNSA2NTdRNTAxIDY1NyA1NTMgNjM2VDY0MiA1NzhUNjk5IDQ4OVQ3MTkgMzc4UTcxOSAyOTQgNjg5IDIyM1Q2MTAgMTAxVDQ5NiAyMFQzNjMgLTEwWk0zNjggMzRRNDI1IDM0IDQ3OSA1OVQ1NzQgMTMwVDY0MSAyMzhUNjY2IDM3NVE2NjYgNDI1IDY1MCA0NjhUNjA0IDU0NFQ1MzAgNTk1VDQzMCA2MTRRMzczIDYxNCAzMjAgNTg5VDIyNCA1MTdUMTU3IDQwOVQxMzIgMjczUTEzMiAyMjMgMTQ4IDE3OVQxOTQgMTAzVDI2OCA1M1QzNjggMzRaTTM0NyA3MzZRMzI0IDczNiAzMjQgNzQ5UTMyNCA3NTQgMzI2IDc2MlQzMzMgNzc1UTMzNiA3NzkgMzQxIDc4MFQzNTMgNzgxSDU2NVE1ODkgNzgxIDU4OSA3NjhRNTg5IDc2MyA1ODcgNzU1VDU4MCA3NDFRNTc3IDczOCA1NzIgNzM3VDU2MCA3MzZIMzQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTREOyIgZ2x5cGgtbmFtZT0ib21hY3JvbiIgaG9yaXotYWR2LXg9IjU4NyIgZD0iTTI3MCAtMTBRMjI0IC0xMCAxODUgNlQxMTYgNTFUNzEgMTE5VDU0IDIwN1E1NCAyNjMgNzQgMzEzVDEzMCA0MDFUMjE0IDQ2MVQzMTggNDgzUTM2NCA0ODMgNDAzIDQ2N1Q0NzIgNDIyVDUxNyAzNTRUNTM0IDI2NlE1MzQgMjEwIDUxNCAxNjBUNDU3IDcyVDM3MyAxMlQyNzAgLTEwWk0yNzMgMzJRMzE2IDMyIDM1NCA1MFQ0MjIgMTAwVDQ2OCAxNzRUNDg1IDI2NVE0ODUgMzAzIDQ3MyAzMzVUNDM4IDM5MFQzODQgNDI3VDMxNSA0NDFRMjcyIDQ0MSAyMzQgNDIzVDE2NiAzNzNUMTE5IDI5OVQxMDIgMjA4UTEwMiAxNzAgMTE1IDEzOFQxNTAgODNUMjA0IDQ2VDI3MyAzMlpNMjMzIDU2N1EyMTAgNTY3IDIxMCA1ODBRMjEwIDU4NSAyMTIgNTkzVDIxOSA2MDZRMjIyIDYxMCAyMjcgNjExVDIzOSA2MTJINDUxUTQ3NSA2MTIgNDc1IDU5OVE0NzUgNTk0IDQ3MyA1ODZUNDY2IDU3MlE0NjMgNTY5IDQ1OCA1NjhUNDQ2IDU2N0gyMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEU7IiBnbHlwaC1uYW1lPSJPYnJldmUiIGhvcml6LWFkdi14PSI3NjEiIGQ9Ik0zNjMgLTEwUTI5OCAtMTAgMjQ2IDExVDE1NiA2OVQ5OSAxNThUNzkgMjY5UTc5IDM1MyAxMDggNDI0VDE4NyA1NDdUMzAxIDYyOFQ0MzUgNjU3UTUwMSA2NTcgNTUzIDYzNlQ2NDIgNTc4VDY5OSA0ODlUNzE5IDM3OFE3MTkgMjk0IDY4OSAyMjNUNjEwIDEwMVQ0OTYgMjBUMzYzIC0xMFpNMzY4IDM0UTQyNSAzNCA0NzkgNTlUNTc0IDEzMFQ2NDEgMjM4VDY2NiAzNzVRNjY2IDQyNSA2NTAgNDY4VDYwNCA1NDRUNTMwIDU5NVQ0MzAgNjE0UTM3MyA2MTQgMzIwIDU4OVQyMjQgNTE3VDE1NyA0MDlUMTMyIDI3M1ExMzIgMjIzIDE0OCAxNzlUMTk0IDEwM1QyNjggNTNUMzY4IDM0Wk00NjggNzE0UTQzNSA3MTQgNDEyIDcyNFQzNzQgNzQ4UTM1NyA3NjUgMzUwIDc4M1QzNDMgODE1UTM0MyA4MjYgMzQ5IDgzNFQzNzMgODQyUTM4MiA4MDMgNDA2IDc4MFQ0NjkgNzU3UTUwNyA3NTcgNTMzIDc4MFQ1NzQgODQyUTU5MSA4NDIgNTk3IDgzNFQ2MDQgODE4UTYwNCA4MDcgNTk1IDc4OVQ1NzAgNzU1UTU1MSA3MzYgNTI1IDcyNVQ0NjggNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRGOyIgZ2x5cGgtbmFtZT0ib2JyZXZlIiBob3Jpei1hZHYteD0iNTg3IiBkPSJNMjcwIC0xMFEyMjQgLTEwIDE4NSA2VDExNiA1MVQ3MSAxMTlUNTQgMjA3UTU0IDI2MyA3NCAzMTNUMTMwIDQwMVQyMTQgNDYxVDMxOCA0ODNRMzY0IDQ4MyA0MDMgNDY3VDQ3MiA0MjJUNTE3IDM1NFQ1MzQgMjY2UTUzNCAyMTAgNTE0IDE2MFQ0NTcgNzJUMzczIDEyVDI3MCAtMTBaTTI3MyAzMlEzMTYgMzIgMzU0IDUwVDQyMiAxMDBUNDY4IDE3NFQ0ODUgMjY1UTQ4NSAzMDMgNDczIDMzNVQ0MzggMzkwVDM4NCA0MjdUMzE1IDQ0MVEyNzIgNDQxIDIzNCA0MjNUMTY2IDM3M1QxMTkgMjk5VDEwMiAyMDhRMTAyIDE3MCAxMTUgMTM4VDE1MCA4M1QyMDQgNDZUMjczIDMyWk0zNDAgNTQ1UTMwNyA1NDUgMjg0IDU1NVQyNDYgNTc5UTIyOSA1OTYgMjIyIDYxNFQyMTUgNjQ2UTIxNSA2NTcgMjIxIDY2NVQyNDUgNjczUTI1NCA2MzQgMjc4IDYxMVQzNDEgNTg4UTM3OSA1ODggNDA1IDYxMVQ0NDYgNjczUTQ2MyA2NzMgNDY5IDY2NVQ0NzYgNjQ5UTQ3NiA2MzggNDY3IDYyMFQ0NDIgNTg2UTQyMyA1NjcgMzk3IDU1NlQzNDAgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUwOyIgZ2x5cGgtbmFtZT0iT2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9Ijc2MSIgZD0iTTM2MyAtMTBRMjk4IC0xMCAyNDYgMTFUMTU2IDY5VDk5IDE1OFQ3OSAyNjlRNzkgMzUzIDEwOCA0MjRUMTg3IDU0N1QzMDEgNjI4VDQzNSA2NTdRNTAxIDY1NyA1NTMgNjM2VDY0MiA1NzhUNjk5IDQ4OVQ3MTkgMzc4UTcxOSAyOTQgNjg5IDIyM1Q2MTAgMTAxVDQ5NiAyMFQzNjMgLTEwWk0zNjggMzRRNDI1IDM0IDQ3OSA1OVQ1NzQgMTMwVDY0MSAyMzhUNjY2IDM3NVE2NjYgNDI1IDY1MCA0NjhUNjA0IDU0NFQ1MzAgNTk1VDQzMCA2MTRRMzczIDYxNCAzMjAgNTg5VDIyNCA1MTdUMTU3IDQwOVQxMzIgMjczUTEzMiAyMjMgMTQ4IDE3OVQxOTQgMTAzVDI2OCA1M1QzNjggMzRaTTQ5OCA3MTZRNDk3IDcxNyA1MDUgNzI3VDUyOCA3NTNUNTY1IDc4OFQ2MTQgODI4UTYzMiA4NDEgNjQyIDg0NVQ2NjAgODUwUTY2OSA4NTAgNjc1IDg0NVQ2ODIgODMwUTY4MiA4MjEgNjc0IDgxMVQ2NDMgNzg0UTYxNSA3NjQgNTkwIDc1MVQ1NDQgNzI5VDUxMiA3MTdUNDk4IDcxNlpNMzM2IDcxNlEzMzQgNzE3IDM0MiA3MjdUMzY1IDc1M1Q0MDMgNzg4VDQ1MiA4MjhRNDY5IDg0MSA0NzkgODQ1VDQ5OCA4NTBRNTA2IDg1MCA1MTIgODQ1VDUxOSA4MzBRNTE5IDgyMSA1MTEgODExVDQ4MCA3ODRRNDUyIDc2NCA0MjcgNzUxVDM4MiA3MjlUMzUwIDcxN1QzMzYgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUxOyIgZ2x5cGgtbmFtZT0ib2h1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjU4NyIgZD0iTTI3MCAtMTBRMjI0IC0xMCAxODUgNlQxMTYgNTFUNzEgMTE5VDU0IDIwN1E1NCAyNjMgNzQgMzEzVDEzMCA0MDFUMjE0IDQ2MVQzMTggNDgzUTM2NCA0ODMgNDAzIDQ2N1Q0NzIgNDIyVDUxNyAzNTRUNTM0IDI2NlE1MzQgMjEwIDUxNCAxNjBUNDU3IDcyVDM3MyAxMlQyNzAgLTEwWk0yNzMgMzJRMzE2IDMyIDM1NCA1MFQ0MjIgMTAwVDQ2OCAxNzRUNDg1IDI2NVE0ODUgMzAzIDQ3MyAzMzVUNDM4IDM5MFQzODQgNDI3VDMxNSA0NDFRMjcyIDQ0MSAyMzQgNDIzVDE2NiAzNzNUMTE5IDI5OVQxMDIgMjA4UTEwMiAxNzAgMTE1IDEzOFQxNTAgODNUMjA0IDQ2VDI3MyAzMlpNMzc3IDU0N1EzNzYgNTQ4IDM4NCA1NThUNDA3IDU4NFQ0NDQgNjE5VDQ5MyA2NTlRNTExIDY3MiA1MjEgNjc2VDUzOSA2ODFRNTQ4IDY4MSA1NTQgNjc2VDU2MSA2NjFRNTYxIDY1MiA1NTMgNjQyVDUyMiA2MTVRNDk0IDU5NSA0NjkgNTgyVDQyMyA1NjBUMzkxIDU0OFQzNzcgNTQ3Wk0yMTUgNTQ3UTIxMyA1NDggMjIxIDU1OFQyNDQgNTg0VDI4MiA2MTlUMzMxIDY1OVEzNDggNjcyIDM1OCA2NzZUMzc3IDY4MVEzODUgNjgxIDM5MSA2NzZUMzk4IDY2MVEzOTggNjUyIDM5MCA2NDJUMzU5IDYxNVEzMzEgNTk1IDMwNiA1ODJUMjYxIDU2MFQyMjkgNTQ4VDIxNSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTI7IiBnbHlwaC1uYW1lPSJPRSIgaG9yaXotYWR2LXg9IjEwNDQiIGQ9Ik0zNjEgLThRMjk2IC04IDI0NCAxM1QxNTUgNzFUOTkgMTU5VDc5IDI3MFE3OSAzNTQgMTA4IDQyNFQxODcgNTQ2VDMwMCA2MjdUNDMyIDY1NlE0NzAgNjU2IDUwNSA2NDdIMTA1NFExMDUzIDY0NiAxMDUzIDY0NFExMDUzIDY0MiAxMDUzIDY0MFQxMDUyIDYzNUwxMDQ2IDYwN0wxMDQ1IDYwMkg1OTVRNjUxIDU2OSA2ODIgNTExVDcxNCAzNzhWMzU0SDkyMlE5MjEgMzUzIDkyMSAzNTFROTIxIDM0OSA5MjEgMzQ3VDkyMCAzNDJMOTE0IDMxNVE5MTMgMzEzIDkxMyAzMTFWMzEwSDcwOFE3MDEgMjY1IDY4NCAyMjVUNjQzIDE1MlQ1ODkgOTFUNTI0IDQ2SDkzOVE5MzggNDUgOTM4IDQzUTkzOCA0MSA5MzggMzlUOTM3IDMzTDkzMSA1UTkzMCAzIDkzMCAxVjBINDI3UTM5MiAtOCAzNjEgLThaTTM2NiAzNVE0MjMgMzUgNDc2IDYwVDU3MCAxMzFUNjM2IDIzOVQ2NjEgMzc1UTY2MSA0MjUgNjQ2IDQ2OFQ2MDAgNTQ0VDUyNyA1OTRUNDI3IDYxM1EzNzAgNjEzIDMxNyA1ODhUMjIzIDUxN1QxNTcgNDA5VDEzMiAyNzNRMTMyIDIyMyAxNDcgMTgwVDE5MyAxMDRUMjY2IDU0VDM2NiAzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MzsiIGdseXBoLW5hbWU9Im9lIiBob3Jpei1hZHYteD0iOTYwIiBkPSJNMjY2IC0xMFEyMjEgLTEwIDE4MyA1VDExNiA0OVQ3MSAxMTZUNTQgMjA1UTU0IDI2MiA3NCAzMTJUMTI5IDQwMVQyMTEgNDYxVDMxNSA0ODNRMzUzIDQ4MyAzODYgNDcyVDQ0NiA0MzlUNDkxIDM4OFQ1MTcgMzIxUTUzNCAzNTcgNTYwIDM4NlQ2MTggNDM3VDY4OSA0NzFUNzY4IDQ4M1E4NDUgNDgzIDg4NyA0NDlUOTMwIDM2NFE5MzAgMzMyIDkxOCAzMDZUODc1IDI2MVQ3OTQgMjMxVDY2NiAyMjBRNjM1IDIyMCA2MDEgMjIxVDUyNiAyMjZRNTIzIDIwNSA1MjMgMTg0UTUyMyAxMTYgNTYyIDc0VDY3NyAzMVE3MzQgMzEgNzc0IDUyVDg0MiAxMTNRODQzIDExNCA4NDcgMTEzVDg1NSAxMDlUODYzIDEwMVQ4NjcgOTBRODY3IDgxIDg2MyA3M1Q4NDUgNTFRNzg1IC0xMCA2NzUgLTEwUTU5NyAtMTAgNTUwIDI4VDQ4OSAxMzBRNDU3IDY3IDM5OSAyOVQyNjYgLTEwWk0yNzEgMzJRMzE0IDMyIDM1MiA1MFQ0MTkgMTAxVDQ2NCAxNzVUNDgxIDI2N1E0ODEgMzA0IDQ2OSAzMzZUNDM0IDM5MVQzODEgNDI4VDMxNCA0NDFRMjcwIDQ0MSAyMzEgNDIzVDE2NCAzNzJUMTE5IDI5OFQxMDIgMjA2UTEwMiAxNjggMTE1IDEzN1QxNTAgODJUMjA0IDQ1VDI3MSAzMlpNNzY1IDQ0MVE3MjUgNDQxIDY4OSA0MjhUNjI0IDM5MVQ1NzIgMzM2VDUzNyAyNjhRNTcyIDI2NCA2MDMgMjYzVDY2MSAyNjFRNzI3IDI2MSA3NjkgMjcwVDgzNyAyOTNUODcyIDMyNVQ4ODIgMzYzUTg4MiAzNzggODc1IDM5MlQ4NTMgNDE3VDgxNiA0MzRUNzY1IDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NDsiIGdseXBoLW5hbWU9IlJhY3V0ZSIgaG9yaXotYWR2LXg9IjU5MyIgZD0iTTI5OSAyNzdMNDE4IDk3UTQzMCA3OCA0NDAgNjZUNDYwIDQ2VDQ4MSAzNVQ1MDggMzJRNTA5IDMyIDUwOSAyN1Q1MDcgMTRUNDk2IDJUNDcwIC00UTQ1OCAtNCA0NDggLTFUNDI2IDExVDQwMyAzNlQzNzQgNzhMMjQzIDI3N0gxNTRMOTQgMEg0NUwxNzYgNjE2UTE4MSA2NDcgMjEyIDY0N0gzNjZRNDcxIDY0NyA1MjUgNjA3VDU4MCA0OTBRNTgwIDM5MCA1MTYgMzM0VDMzNSAyNzdIMjk5Wk0zMzYgMzIwUTQzMiAzMjAgNDgwIDM2NVQ1MjggNDg1UTUyOCA1NDIgNDg2IDU3MlQzNjMgNjAzSDIyM0wxNjMgMzIwSDMzNlpNMzE3IDcxNlEzMTYgNzE3IDMyNSA3MjhUMzUyIDc1NFQzOTQgNzg5VDQ0NiA4MjZRNDYzIDgzOSA0NzMgODQyVDQ5MiA4NDZRNTAxIDg0NiA1MDcgODQwVDUxMyA4MjZRNTEzIDgxNiA1MDQgODA3VDQ3MSA3ODFRNDQxIDc2MyA0MTQgNzUwVDM2NSA3MjhUMzMxIDcxN1QzMTcgNzE2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU1OyIgZ2x5cGgtbmFtZT0icmFjdXRlIiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMTM3IDQ3M1ExMzcgNDc2IDE0NyA0NzZRMTYxIDQ3NiAxNzAgNDY2VDE3MyA0MjRMMTYzIDM3NVExODkgNDMxIDIyMyA0NTdUMzAyIDQ4M1EzMzEgNDgzIDM1MSA0NzFUMzcyIDQ0MlEzNzIgNDI1IDM2MyA0MThUMzUyIDQxMVEzNDMgNDIyIDMyOCA0MzBUMjg5IDQzOFEyNjAgNDM4IDIzNSA0MjJUMTkwIDM3NlQxNTUgMzA0VDEyOCAyMDlMODQgMEgzNkwxMzcgNDczWk0xOTEgNTQ3UTE5MCA1NDggMTk5IDU1OVQyMjYgNTg1VDI2OCA2MjBUMzIwIDY1N1EzMzcgNjcwIDM0NyA2NzNUMzY2IDY3N1EzNzUgNjc3IDM4MSA2NzFUMzg3IDY1N1EzODcgNjQ3IDM3OCA2MzhUMzQ1IDYxMlEzMTUgNTk0IDI4OCA1ODFUMjM5IDU1OVQyMDUgNTQ4VDE5MSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTY7IiBnbHlwaC1uYW1lPSJSY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1OTMiIGQ9Ik0yOTkgMjc3TDQxOCA5N1E0MzAgNzggNDQwIDY2VDQ2MCA0NlQ0ODEgMzVUNTA4IDMyUTUwOSAzMiA1MDkgMjdUNTA3IDE0VDQ5NiAyVDQ3MCAtNFE0NTggLTQgNDQ4IC0xVDQyNiAxMVQ0MDMgMzZUMzc0IDc4TDI0MyAyNzdIMTU0TDk0IDBINDVMMTc2IDYxNlExODEgNjQ3IDIxMiA2NDdIMzY2UTQ3MSA2NDcgNTI1IDYwN1Q1ODAgNDkwUTU4MCAzOTAgNTE2IDMzNFQzMzUgMjc3SDI5OVpNMzM2IDMyMFE0MzIgMzIwIDQ4MCAzNjVUNTI4IDQ4NVE1MjggNTQyIDQ4NiA1NzJUMzYzIDYwM0gyMjNMMTYzIDMyMEgzMzZaTTE0OCAtMjY3UTE0NiAtMjY5IDE0MiAtMjY4VDEzMyAtMjY1VDEyNiAtMjU5VDEyNSAtMjUyTDIzMiAtNjNRMjMzIC02MiAyNDAgLTYyVDI1NSAtNjVUMjcwIC03M1QyNzcgLTg4UTI3NyAtOTYgMjc0IC0xMDRUMjYzIC0xMjNMMTQ4IC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTc7IiBnbHlwaC1uYW1lPSJyY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0xMzcgNDczUTEzNyA0NzYgMTQ3IDQ3NlExNjEgNDc2IDE3MCA0NjZUMTczIDQyNEwxNjMgMzc1UTE4OSA0MzEgMjIzIDQ1N1QzMDIgNDgzUTMzMSA0ODMgMzUxIDQ3MVQzNzIgNDQyUTM3MiA0MjUgMzYzIDQxOFQzNTIgNDExUTM0MyA0MjIgMzI4IDQzMFQyODkgNDM4UTI2MCA0MzggMjM1IDQyMlQxOTAgMzc2VDE1NSAzMDRUMTI4IDIwOUw4NCAwSDM2TDEzNyA0NzNaTS00OSAtMjY3US01MSAtMjY5IC01NSAtMjY4VC02NCAtMjY1VC03MSAtMjU5VC03MiAtMjUyTDM1IC02M1EzNiAtNjIgNDMgLTYyVDU4IC02NVQ3MyAtNzNUODAgLTg4UTgwIC05NiA3NyAtMTA0VDY2IC0xMjNMLTQ5IC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTg7IiBnbHlwaC1uYW1lPSJSY2Fyb24iIGhvcml6LWFkdi14PSI1OTMiIGQ9Ik0yOTkgMjc3TDQxOCA5N1E0MzAgNzggNDQwIDY2VDQ2MCA0NlQ0ODEgMzVUNTA4IDMyUTUwOSAzMiA1MDkgMjdUNTA3IDE0VDQ5NiAyVDQ3MCAtNFE0NTggLTQgNDQ4IC0xVDQyNiAxMVQ0MDMgMzZUMzc0IDc4TDI0MyAyNzdIMTU0TDk0IDBINDVMMTc2IDYxNlExODEgNjQ3IDIxMiA2NDdIMzY2UTQ3MSA2NDcgNTI1IDYwN1Q1ODAgNDkwUTU4MCAzOTAgNTE2IDMzNFQzMzUgMjc3SDI5OVpNMzM2IDMyMFE0MzIgMzIwIDQ4MCAzNjVUNTI4IDQ4NVE1MjggNTQyIDQ4NiA1NzJUMzYzIDYwM0gyMjNMMTYzIDMyMEgzMzZaTTM3MiA2OThRMzcwIDY5OCAzNTUgNzE0VDMxOSA3NjFRMjk2IDc5NSAyODkgODExVDI4MSA4MzVRMjgxIDg0NiAyODYgODUxVDI5OSA4NTZRMzA5IDg1NiAzMTkgODQ0VDM0OSA3OTRRMzU3IDc4MCAzNjMgNzY4VDM3OCA3NDFRMzkyIDc1NSA0MDIgNzY2VDQzMCA3OTVRNDYyIDgyOCA0NzkgODQyVDUwNyA4NTZRNTIxIDg1NiA1MjEgODQzUTUyMSA4MzEgNTA2IDgxM1Q0NTUgNzYzUTQyMCA3MzEgMzk3IDcxNVQzNzIgNjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU5OyIgZ2x5cGgtbmFtZT0icmNhcm9uIiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMTM3IDQ3M1ExMzcgNDc2IDE0NyA0NzZRMTYxIDQ3NiAxNzAgNDY2VDE3MyA0MjRMMTYzIDM3NVExODkgNDMxIDIyMyA0NTdUMzAyIDQ4M1EzMzEgNDgzIDM1MSA0NzFUMzcyIDQ0MlEzNzIgNDI1IDM2MyA0MThUMzUyIDQxMVEzNDMgNDIyIDMyOCA0MzBUMjg5IDQzOFEyNjAgNDM4IDIzNSA0MjJUMTkwIDM3NlQxNTUgMzA0VDEyOCAyMDlMODQgMEgzNkwxMzcgNDczWk0yNDcgNTI5UTI0NSA1MjkgMjMwIDU0NVQxOTQgNTkyUTE3MSA2MjYgMTY0IDY0MlQxNTYgNjY2UTE1NiA2NzcgMTYxIDY4MlQxNzQgNjg3UTE4NCA2ODcgMTk0IDY3NVQyMjQgNjI1UTIzMiA2MTEgMjM4IDU5OVQyNTMgNTcyUTI2NyA1ODYgMjc3IDU5N1QzMDUgNjI2UTMzNyA2NTkgMzU0IDY3M1QzODIgNjg3UTM5NiA2ODcgMzk2IDY3NFEzOTYgNjYyIDM4MSA2NDRUMzMwIDU5NFEyOTUgNTYyIDI3MiA1NDZUMjQ3IDUyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QTsiIGdseXBoLW5hbWU9IlNhY3V0ZSIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTI2OSAtMTBRMjAwIC0xMCAxNDkgMTFUNjkgNjFRNTIgNzggNDIgOTZUMzIgMTMxUTMyIDE0MCAzNiAxNDZUNDcgMTU1VDU4IDE1OFQ2MyAxNThRNzIgMTMyIDg5IDExMFQxMzIgNzBUMTkzIDQzVDI3MiAzM1EzNTYgMzMgMzk4IDY5VDQ0MCAxNjdRNDQwIDE5NSA0MjggMjE1VDM5NiAyNTFUMzQ4IDI3OVQyODkgMzA1UTI1NyAzMTggMjI3IDMzMlQxNzQgMzY3VDEzNiA0MTVUMTIxIDQ4MlExMjEgNTE5IDEzNiA1NTFUMTc4IDYwNlQyNDUgNjQzVDMzNCA2NTdRNDAxIDY1NyA0NDYgNjM4VDUxNiA1OTRRNTMyIDU3OCA1NDAgNTYyVDU0OCA1MzJRNTQ4IDUyMyA1NDQgNTE3VDUzNCA1MDhUNTIzIDUwNVQ1MTcgNTA1UTUwOSA1MjcgNDk0IDU0N1Q0NTUgNTgyVDQwMiA2MDVUMzMyIDYxNFEyOTYgNjE0IDI2NyA2MDVUMjE2IDU3OFQxODQgNTM3VDE3MiA0ODdRMTcyIDQ1OCAxODMgNDM3VDIxNSA0MDBUMjYzIDM3MVQzMjQgMzQ1UTM1NSAzMzIgMzg1IDMxOFQ0MzggMjg0VDQ3NiAyMzdUNDkwIDE3MlE0OTAgOTEgNDMzIDQxVDI2OSAtMTBaTTMxNSA3MTZRMzE0IDcxNyAzMjMgNzI4VDM1MCA3NTRUMzkyIDc4OVQ0NDQgODI2UTQ2MSA4MzkgNDcxIDg0MlQ0OTAgODQ2UTQ5OSA4NDYgNTA1IDg0MFQ1MTEgODI2UTUxMSA4MTYgNTAyIDgwN1Q0NjkgNzgxUTQzOSA3NjMgNDEyIDc1MFQzNjMgNzI4VDMyOSA3MTdUMzE1IDcxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QjsiIGdseXBoLW5hbWU9InNhY3V0ZSIgaG9yaXotYWR2LXg9IjQ3NSIgZD0iTTIxOCAtMTBRMTYxIC0xMCAxMTcgN1Q0NyA1MVEzNiA2MiAyOSA3M1QyMiA5NFEyMiAxMDIgMjYgMTA3VDM0IDExNlQ0MyAxMjFUNDkgMTIyUTY4IDg1IDExMiA1OFQyMjEgMzBRMjg0IDMwIDMxOCA1NVQzNTIgMTIyUTM1MiAxNDEgMzQzIDE1NFQzMTggMTc3VDI3OSAxOTZUMjMwIDIxNFEyMDMgMjIzIDE3NyAyMzNUMTMxIDI1OVQ5OCAyOTVUODUgMzQ4UTg1IDM3NiA5NyA0MDFUMTMyIDQ0NFQxODYgNDcyVDI1NyA0ODNRMzExIDQ4MyAzNTEgNDY3VDQxNSA0MjdRNDM4IDQwMiA0MzggMzgzUTQzOCAzNzUgNDM0IDM3MFQ0MjUgMzYxVDQxNiAzNTdUNDEwIDM1OFEzOTMgMzk1IDM1MSA0MTlUMjUzIDQ0M1EyMjMgNDQzIDIwMSA0MzZUMTYzIDQxNlQxNDAgMzg3VDEzMiAzNTRRMTMyIDMzNCAxNDIgMzE5VDE2OSAyOTNUMjA5IDI3M1QyNTggMjU0UTI4NCAyNDUgMzA5IDIzNVQzNTQgMjEwVDM4NiAxNzZUMzk4IDEyN1EzOTggNjUgMzUxIDI4VDIxOCAtMTBaTTIzNSA1NDdRMjM0IDU0OCAyNDMgNTU5VDI3MCA1ODVUMzEyIDYyMFQzNjQgNjU3UTM4MSA2NzAgMzkxIDY3M1Q0MTAgNjc3UTQxOSA2NzcgNDI1IDY3MVQ0MzEgNjU3UTQzMSA2NDcgNDIyIDYzOFQzODkgNjEyUTM1OSA1OTQgMzMyIDU4MVQyODMgNTU5VDI0OSA1NDhUMjM1IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QzsiIGdseXBoLW5hbWU9IlNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNMjY5IC0xMFEyMDAgLTEwIDE0OSAxMVQ2OSA2MVE1MiA3OCA0MiA5NlQzMiAxMzFRMzIgMTQwIDM2IDE0NlQ0NyAxNTVUNTggMTU4VDYzIDE1OFE3MiAxMzIgODkgMTEwVDEzMiA3MFQxOTMgNDNUMjcyIDMzUTM1NiAzMyAzOTggNjlUNDQwIDE2N1E0NDAgMTk1IDQyOCAyMTVUMzk2IDI1MVQzNDggMjc5VDI4OSAzMDVRMjU3IDMxOCAyMjcgMzMyVDE3NCAzNjdUMTM2IDQxNVQxMjEgNDgyUTEyMSA1MTkgMTM2IDU1MVQxNzggNjA2VDI0NSA2NDNUMzM0IDY1N1E0MDEgNjU3IDQ0NiA2MzhUNTE2IDU5NFE1MzIgNTc4IDU0MCA1NjJUNTQ4IDUzMlE1NDggNTIzIDU0NCA1MTdUNTM0IDUwOFQ1MjMgNTA1VDUxNyA1MDVRNTA5IDUyNyA0OTQgNTQ3VDQ1NSA1ODJUNDAyIDYwNVQzMzIgNjE0UTI5NiA2MTQgMjY3IDYwNVQyMTYgNTc4VDE4NCA1MzdUMTcyIDQ4N1ExNzIgNDU4IDE4MyA0MzdUMjE1IDQwMFQyNjMgMzcxVDMyNCAzNDVRMzU1IDMzMiAzODUgMzE4VDQzOCAyODRUNDc2IDIzN1Q0OTAgMTcyUTQ5MCA5MSA0MzMgNDFUMjY5IC0xMFpNMjY4IDcxNFEyNTQgNzE0IDI1NCA3MjZRMjU0IDczOCAyNjkgNzU2VDMyMCA4MDdRMzU1IDgzOSAzNzggODU1VDQwMyA4NzJRNDA1IDg3MiA0MjAgODU2VDQ1NiA4MDlRNDc5IDc3NSA0ODYgNzU5VDQ5MyA3MzVRNDkzIDcyNCA0ODggNzE5VDQ3NiA3MTRRNDY2IDcxNCA0NTYgNzI2VDQyNiA3NzZRNDE4IDc5MCA0MTIgODAyVDM5NyA4MjlMMzQ1IDc3NVEzMTMgNzQxIDI5NiA3MjhUMjY4IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RDsiIGdseXBoLW5hbWU9InNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNDc1IiBkPSJNMjE4IC0xMFExNjEgLTEwIDExNyA3VDQ3IDUxUTM2IDYyIDI5IDczVDIyIDk0UTIyIDEwMiAyNiAxMDdUMzQgMTE2VDQzIDEyMVQ0OSAxMjJRNjggODUgMTEyIDU4VDIyMSAzMFEyODQgMzAgMzE4IDU1VDM1MiAxMjJRMzUyIDE0MSAzNDMgMTU0VDMxOCAxNzdUMjc5IDE5NlQyMzAgMjE0UTIwMyAyMjMgMTc3IDIzM1QxMzEgMjU5VDk4IDI5NVQ4NSAzNDhRODUgMzc2IDk3IDQwMVQxMzIgNDQ0VDE4NiA0NzJUMjU3IDQ4M1EzMTEgNDgzIDM1MSA0NjdUNDE1IDQyN1E0MzggNDAyIDQzOCAzODNRNDM4IDM3NSA0MzQgMzcwVDQyNSAzNjFUNDE2IDM1N1Q0MTAgMzU4UTM5MyAzOTUgMzUxIDQxOVQyNTMgNDQzUTIyMyA0NDMgMjAxIDQzNlQxNjMgNDE2VDE0MCAzODdUMTMyIDM1NFExMzIgMzM0IDE0MiAzMTlUMTY5IDI5M1QyMDkgMjczVDI1OCAyNTRRMjg0IDI0NSAzMDkgMjM1VDM1NCAyMTBUMzg2IDE3NlQzOTggMTI3UTM5OCA2NSAzNTEgMjhUMjE4IC0xMFpNMTg5IDU0NVExNzUgNTQ1IDE3NSA1NTdRMTc1IDU2OSAxOTAgNTg3VDI0MSA2MzhRMjc2IDY3MCAyOTkgNjg2VDMyNCA3MDNRMzI2IDcwMyAzNDEgNjg3VDM3NyA2NDBRNDAwIDYwNiA0MDcgNTkwVDQxNCA1NjZRNDE0IDU1NSA0MDkgNTUwVDM5NyA1NDVRMzg3IDU0NSAzNzcgNTU3VDM0NyA2MDdRMzM5IDYyMSAzMzMgNjMzVDMxOCA2NjBMMjY2IDYwNlEyMzQgNTcyIDIxNyA1NTlUMTg5IDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RTsiIGdseXBoLW5hbWU9IlNjZWRpbGxhIiBob3Jpei1hZHYteD0iNTY0IiBkPSJNMjY5IC0xMFEyMDAgLTEwIDE0OSAxMVQ2OSA2MVE1MiA3OCA0MiA5NlQzMiAxMzFRMzIgMTQwIDM2IDE0NlQ0NyAxNTVUNTggMTU4VDYzIDE1OFE3MiAxMzIgODkgMTEwVDEzMiA3MFQxOTMgNDNUMjcyIDMzUTM1NiAzMyAzOTggNjlUNDQwIDE2N1E0NDAgMTk1IDQyOCAyMTVUMzk2IDI1MVQzNDggMjc5VDI4OSAzMDVRMjU3IDMxOCAyMjcgMzMyVDE3NCAzNjdUMTM2IDQxNVQxMjEgNDgyUTEyMSA1MTkgMTM2IDU1MVQxNzggNjA2VDI0NSA2NDNUMzM0IDY1N1E0MDEgNjU3IDQ0NiA2MzhUNTE2IDU5NFE1MzIgNTc4IDU0MCA1NjJUNTQ4IDUzMlE1NDggNTIzIDU0NCA1MTdUNTM0IDUwOFQ1MjMgNTA1VDUxNyA1MDVRNTA5IDUyNyA0OTQgNTQ3VDQ1NSA1ODJUNDAyIDYwNVQzMzIgNjE0UTI5NiA2MTQgMjY3IDYwNVQyMTYgNTc4VDE4NCA1MzdUMTcyIDQ4N1ExNzIgNDU4IDE4MyA0MzdUMjE1IDQwMFQyNjMgMzcxVDMyNCAzNDVRMzU1IDMzMiAzODUgMzE4VDQzOCAyODRUNDc2IDIzN1Q0OTAgMTcyUTQ5MCA5MSA0MzMgNDFUMjY5IC0xMFpNMTMxIC0yMTlRMTI5IC0yMjIgMTI1IC0yMjFUMTE2IC0yMTdUMTEwIC0yMTFUMTA5IC0yMDRRMTM4IC0xNjAgMTYxIC0xMjVRMTcxIC0xMTEgMTgwIC05N1QxOTcgLTcxUTIwNiAtNTggMjEzIC00NlEyMTQgLTQ1IDIyMCAtNDZUMjM1IC01MFQyNDkgLTU4VDI1NiAtNzNRMjU2IC05MCAyMzkgLTEwOEwxMzEgLTIxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RjsiIGdseXBoLW5hbWU9InNjZWRpbGxhIiBob3Jpei1hZHYteD0iNDc1IiBkPSJNMjE4IC0xMFExNjEgLTEwIDExNyA3VDQ3IDUxUTM2IDYyIDI5IDczVDIyIDk0UTIyIDEwMiAyNiAxMDdUMzQgMTE2VDQzIDEyMVQ0OSAxMjJRNjggODUgMTEyIDU4VDIyMSAzMFEyODQgMzAgMzE4IDU1VDM1MiAxMjJRMzUyIDE0MSAzNDMgMTU0VDMxOCAxNzdUMjc5IDE5NlQyMzAgMjE0UTIwMyAyMjMgMTc3IDIzM1QxMzEgMjU5VDk4IDI5NVQ4NSAzNDhRODUgMzc2IDk3IDQwMVQxMzIgNDQ0VDE4NiA0NzJUMjU3IDQ4M1EzMTEgNDgzIDM1MSA0NjdUNDE1IDQyN1E0MzggNDAyIDQzOCAzODNRNDM4IDM3NSA0MzQgMzcwVDQyNSAzNjFUNDE2IDM1N1Q0MTAgMzU4UTM5MyAzOTUgMzUxIDQxOVQyNTMgNDQzUTIyMyA0NDMgMjAxIDQzNlQxNjMgNDE2VDE0MCAzODdUMTMyIDM1NFExMzIgMzM0IDE0MiAzMTlUMTY5IDI5M1QyMDkgMjczVDI1OCAyNTRRMjg0IDI0NSAzMDkgMjM1VDM1NCAyMTBUMzg2IDE3NlQzOTggMTI3UTM5OCA2NSAzNTEgMjhUMjE4IC0xMFpNODcgLTIxOVE4NSAtMjIyIDgxIC0yMjFUNzIgLTIxN1Q2NiAtMjExVDY1IC0yMDRROTQgLTE2MCAxMTcgLTEyNVExMjcgLTExMSAxMzYgLTk3VDE1MyAtNzFRMTYyIC01OCAxNjkgLTQ2UTE3MCAtNDUgMTc2IC00NlQxOTEgLTUwVDIwNSAtNThUMjEyIC03M1EyMTIgLTkwIDE5NSAtMTA4TDg3IC0yMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjA7IiBnbHlwaC1uYW1lPSJTY2Fyb24iIGhvcml6LWFkdi14PSI1NjQiIGQ9Ik0yNjkgLTEwUTIwMCAtMTAgMTQ5IDExVDY5IDYxUTUyIDc4IDQyIDk2VDMyIDEzMVEzMiAxNDAgMzYgMTQ2VDQ3IDE1NVQ1OCAxNThUNjMgMTU4UTcyIDEzMiA4OSAxMTBUMTMyIDcwVDE5MyA0M1QyNzIgMzNRMzU2IDMzIDM5OCA2OVQ0NDAgMTY3UTQ0MCAxOTUgNDI4IDIxNVQzOTYgMjUxVDM0OCAyNzlUMjg5IDMwNVEyNTcgMzE4IDIyNyAzMzJUMTc0IDM2N1QxMzYgNDE1VDEyMSA0ODJRMTIxIDUxOSAxMzYgNTUxVDE3OCA2MDZUMjQ1IDY0M1QzMzQgNjU3UTQwMSA2NTcgNDQ2IDYzOFQ1MTYgNTk0UTUzMiA1NzggNTQwIDU2MlQ1NDggNTMyUTU0OCA1MjMgNTQ0IDUxN1Q1MzQgNTA4VDUyMyA1MDVUNTE3IDUwNVE1MDkgNTI3IDQ5NCA1NDdUNDU1IDU4MlQ0MDIgNjA1VDMzMiA2MTRRMjk2IDYxNCAyNjcgNjA1VDIxNiA1NzhUMTg0IDUzN1QxNzIgNDg3UTE3MiA0NTggMTgzIDQzN1QyMTUgNDAwVDI2MyAzNzFUMzI0IDM0NVEzNTUgMzMyIDM4NSAzMThUNDM4IDI4NFQ0NzYgMjM3VDQ5MCAxNzJRNDkwIDkxIDQzMyA0MVQyNjkgLTEwWk0zNjEgNzAzUTM1OSA3MDMgMzQ0IDcxOVQzMDggNzY2UTI4NSA4MDAgMjc4IDgxNlQyNzAgODQwUTI3MCA4NTEgMjc1IDg1NlQyODggODYxUTI5OCA4NjEgMzA4IDg0OVQzMzggNzk5UTM0NiA3ODUgMzUyIDc3M1QzNjcgNzQ2UTM4MSA3NjAgMzkxIDc3MVQ0MTkgODAwUTQ1MSA4MzMgNDY4IDg0N1Q0OTYgODYxUTUxMCA4NjEgNTEwIDg0OFE1MTAgODM2IDQ5NSA4MThUNDQ0IDc2OFE0MDkgNzM2IDM4NiA3MjBUMzYxIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGdseXBoLW5hbWU9InNjYXJvbiIgaG9yaXotYWR2LXg9IjQ3NSIgZD0iTTIxOCAtMTBRMTYxIC0xMCAxMTcgN1Q0NyA1MVEzNiA2MiAyOSA3M1QyMiA5NFEyMiAxMDIgMjYgMTA3VDM0IDExNlQ0MyAxMjFUNDkgMTIyUTY4IDg1IDExMiA1OFQyMjEgMzBRMjg0IDMwIDMxOCA1NVQzNTIgMTIyUTM1MiAxNDEgMzQzIDE1NFQzMTggMTc3VDI3OSAxOTZUMjMwIDIxNFEyMDMgMjIzIDE3NyAyMzNUMTMxIDI1OVQ5OCAyOTVUODUgMzQ4UTg1IDM3NiA5NyA0MDFUMTMyIDQ0NFQxODYgNDcyVDI1NyA0ODNRMzExIDQ4MyAzNTEgNDY3VDQxNSA0MjdRNDM4IDQwMiA0MzggMzgzUTQzOCAzNzUgNDM0IDM3MFQ0MjUgMzYxVDQxNiAzNTdUNDEwIDM1OFEzOTMgMzk1IDM1MSA0MTlUMjUzIDQ0M1EyMjMgNDQzIDIwMSA0MzZUMTYzIDQxNlQxNDAgMzg3VDEzMiAzNTRRMTMyIDMzNCAxNDIgMzE5VDE2OSAyOTNUMjA5IDI3M1QyNTggMjU0UTI4NCAyNDUgMzA5IDIzNVQzNTQgMjEwVDM4NiAxNzZUMzk4IDEyN1EzOTggNjUgMzUxIDI4VDIxOCAtMTBaTTI4OSA1MjlRMjg3IDUyOSAyNzIgNTQ1VDIzNiA1OTJRMjEzIDYyNiAyMDYgNjQyVDE5OCA2NjZRMTk4IDY3NyAyMDMgNjgyVDIxNiA2ODdRMjI2IDY4NyAyMzYgNjc1VDI2NiA2MjVRMjc0IDYxMSAyODAgNTk5VDI5NSA1NzJRMzA5IDU4NiAzMTkgNTk3VDM0NyA2MjZRMzc5IDY1OSAzOTYgNjczVDQyNCA2ODdRNDM4IDY4NyA0MzggNjc0UTQzOCA2NjIgNDIzIDY0NFQzNzIgNTk0UTMzNyA1NjIgMzE0IDU0NlQyODkgNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYyOyIgZ2x5cGgtbmFtZT0iVGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjAzIiBkPSJNMzU1IDYwMkgxNDRRMTIxIDYwMiAxMjEgNjE0UTEyMSA2MjAgMTIzIDYyOFQxMzEgNjQyUTEzNSA2NDcgMTUxIDY0N0g2MjRRNjQ3IDY0NyA2NDcgNjM1UTY0NyA2MjkgNjQ1IDYyMVQ2MzcgNjA3UTYzNSA2MDMgNjMwIDYwM1Q2MTcgNjAySDQwNUwyNzcgMEgyMjdMMzU1IDYwMlpNMTM1IC0yNjdRMTMzIC0yNjkgMTI5IC0yNjhUMTIwIC0yNjVUMTEzIC0yNTlUMTEyIC0yNTJMMjE5IC02M1EyMjAgLTYyIDIyNyAtNjJUMjQyIC02NVQyNTcgLTczVDI2NCAtODhRMjY0IC05NiAyNjEgLTEwNFQyNTAgLTEyM0wxMzUgLTI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MzsiIGdseXBoLW5hbWU9InRjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTIwMyAtMTBRMTM5IC0xMCAxMDkgMzFUOTUgMTU2TDE1MyA0MzBINzdMODUgNDczSDE2MkwxNzYgNTM5UTE4MSA1NjcgMTkwIDU3OFQyMTUgNTg5UTIyMiA1ODkgMjI3IDU4N1QyMzMgNTgzTDIxMCA0NzNIMzYyTDM1MyA0MzBIMjAxTDE0MiAxNTZRMTI4IDkwIDE0NiA2MVQyMTAgMzFRMjMyIDMxIDI1MCA0MFQyNzggNjNRMjgwIDY0IDI4NSA1OFQyOTAgNDBRMjkwIDI3IDI3OCAxNVEyNTMgLTEwIDIwMyAtMTBaTTU1IC0yNjdRNTMgLTI2OSA0OSAtMjY4VDQwIC0yNjVUMzMgLTI1OVQzMiAtMjUyTDEzOSAtNjNRMTQwIC02MiAxNDcgLTYyVDE2MiAtNjVUMTc3IC03M1QxODQgLTg4UTE4NCAtOTYgMTgxIC0xMDRUMTcwIC0xMjNMNTUgLTI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGdseXBoLW5hbWU9IlRjYXJvbiIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTM1NSA2MDJIMTQ0UTEyMSA2MDIgMTIxIDYxNFExMjEgNjIwIDEyMyA2MjhUMTMxIDY0MlExMzUgNjQ3IDE1MSA2NDdINjI0UTY0NyA2NDcgNjQ3IDYzNVE2NDcgNjI5IDY0NSA2MjFUNjM3IDYwN1E2MzUgNjAzIDYzMCA2MDNUNjE3IDYwMkg0MDVMMjc3IDBIMjI3TDM1NSA2MDJaTTM5MSA2OThRMzg5IDY5OCAzNzQgNzE0VDMzOCA3NjFRMzE1IDc5NSAzMDggODExVDMwMCA4MzVRMzAwIDg0NiAzMDUgODUxVDMxOCA4NTZRMzI4IDg1NiAzMzggODQ0VDM2OCA3OTRRMzc2IDc4MCAzODIgNzY4VDM5NyA3NDFRNDExIDc1NSA0MjEgNzY2VDQ0OSA3OTVRNDgxIDgyOCA0OTggODQyVDUyNiA4NTZRNTQwIDg1NiA1NDAgODQzUTU0MCA4MzEgNTI1IDgxM1Q0NzQgNzYzUTQzOSA3MzEgNDE2IDcxNVQzOTEgNjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY1OyIgZ2x5cGgtbmFtZT0idGNhcm9uIiBob3Jpei1hZHYteD0iMzYyIiBkPSJNMjAzIC0xMFExMzkgLTEwIDEwOSAzMVQ5NSAxNTZMMTUzIDQzMEg3N0w4NSA0NzNIMTYyTDE3NiA1MzlRMTgxIDU2NyAxOTAgNTc4VDIxNSA1ODlRMjIyIDU4OSAyMjcgNTg3VDIzMyA1ODNMMjEwIDQ3M0gzNjJMMzUzIDQzMEgyMDFMMTQyIDE1NlExMjggOTAgMTQ2IDYxVDIxMCAzMVEyMzIgMzEgMjUwIDQwVDI3OCA2M1EyODAgNjQgMjg1IDU4VDI5MCA0MFEyOTAgMjcgMjc4IDE1UTI1MyAtMTAgMjAzIC0xMFpNMjkxIDUwOVEyODkgNTA3IDI4NSA1MDhUMjc2IDUxMVQyNjkgNTE4VDI2OCA1MjVMMzc4IDczMVEzNzkgNzMyIDM4NiA3MzJUNDAxIDcyOVQ0MTYgNzIxVDQyMyA3MDZRNDIzIDY5OCA0MjAgNjkwVDQwOSA2NzFMMjkxIDUwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NjsiIGdseXBoLW5hbWU9IlRiYXIiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik0zNTUgNjAySDE0NFExMjEgNjAyIDEyMSA2MTRRMTIxIDYyMCAxMjMgNjI4VDEzMSA2NDJRMTM1IDY0NyAxNTEgNjQ3SDYyNFE2NDcgNjQ3IDY0NyA2MzVRNjQ3IDYyOSA2NDUgNjIxVDYzNyA2MDdRNjM1IDYwMyA2MzAgNjAzVDYxNyA2MDJINDA1TDI3NyAwSDIyN0wzNTUgNjAyWk0yMTkgMzIyUTE5NiAzMjIgMTk2IDMzNVExOTYgMzQwIDE5OCAzNDhUMjA1IDM2MVEyMDggMzY1IDIxMyAzNjZUMjI1IDM2N0g0MzdRNDYxIDM2NyA0NjEgMzU0UTQ2MSAzNDkgNDU5IDM0MVQ0NTIgMzI3UTQ0OSAzMjQgNDQ0IDMyM1Q0MzIgMzIySDIxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NzsiIGdseXBoLW5hbWU9InRiYXIiIGhvcml6LWFkdi14PSIzNjIiIGQ9Ik0yMDMgLTEwUTEzOSAtMTAgMTA5IDMxVDk1IDE1NkwxNTMgNDMwSDc3TDg1IDQ3M0gxNjJMMTc2IDUzOVExODEgNTY3IDE5MCA1NzhUMjE1IDU4OVEyMjIgNTg5IDIyNyA1ODdUMjMzIDU4M0wyMTAgNDczSDM2MkwzNTMgNDMwSDIwMUwxNDIgMTU2UTEyOCA5MCAxNDYgNjFUMjEwIDMxUTIzMiAzMSAyNTAgNDBUMjc4IDYzUTI4MCA2NCAyODUgNThUMjkwIDQwUTI5MCAyNyAyNzggMTVRMjUzIC0xMCAyMDMgLTEwWk02MCAyMzVRMzcgMjM1IDM3IDI0OFEzNyAyNTMgMzkgMjYxVDQ2IDI3NFE0OSAyNzggNTQgMjc5VDY2IDI4MEgyNzhRMzAyIDI4MCAzMDIgMjY3UTMwMiAyNjIgMzAwIDI1NFQyOTMgMjQwUTI5MCAyMzcgMjg1IDIzNlQyNzMgMjM1SDYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY4OyIgZ2x5cGgtbmFtZT0iVXRpbGRlIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNMzE5IC0xMFEyNTUgLTEwIDIwNiA4VDEyOCA2MlQ4OSAxNTJUOTUgMjgwTDE2OSA2MjdRMTcyIDYzOSAxNzcgNjQ0VDE5NCA2NTBIMjAxUTIyNCA2NTAgMjE4IDYyNEwxNDUgMjc2UTExOSAxNTMgMTY2IDk0VDMyMiAzNVE0MDYgMzUgNDU4IDg2VDUzMSAyMzlMNjE0IDYyN1E2MTggNjUwIDYzOSA2NTBINjQ1UTY2OCA2NTAgNjYyIDYyNEw1NzkgMjI5UTU1MyAxMTEgNDg5IDUxVDMxOSAtMTBaTTQ4NiA2NjlRNDYxIDY2OSA0NDUgNjgxVDQxNCA3MTBRNDAwIDcyNSAzOTEgNzMyVDM3MSA3MzlRMzU2IDczOSAzNDcgNzI4VDMzMiA2OTdRMzI0IDY3NCAzMDggNjc0UTMwMCA2NzQgMjkxIDY4MVEyOTkgNzI2IDMyMCA3NTNUMzc3IDc4MFE0MDIgNzgwIDQxOCA3NjdUNDQ5IDczOFE0NjIgNzIzIDQ3MSA3MTZUNDkyIDcwOVE1MDYgNzA5IDUxNSA3MjBUNTMxIDc1MVE1MzUgNzYyIDU0MCA3NjhUNTU0IDc3NFE1NjIgNzc0IDU3MSA3NjdRNTYzIDcyMiA1NDIgNjk2VDQ4NiA2NjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjk7IiBnbHlwaC1uYW1lPSJ1dGlsZGUiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik00NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhUNzIgMTE4VDc2IDIxMkwxMzEgNDczSDE3OUwxMjMgMjA5UTEwNSAxMjUgMTM5IDgwVDI0MSAzNVEzMDAgMzUgMzQxIDY1VDQxOCAxNTVMNDg1IDQ3M0g1MzNMNDUzIDk1UTQ0NCA1NCA0NTYgNDFUNDk2IDI3UTQ5NiAyNyA0OTYgMjJUNDk0IDEwVDQ4NCAtMVQ0NjMgLTdaTTQxMCA1NDRRMzg1IDU0NCAzNjkgNTU2VDMzOCA1ODVRMzI0IDYwMCAzMTUgNjA3VDI5NSA2MTRRMjgwIDYxNCAyNzEgNjAzVDI1NiA1NzJRMjQ4IDU0OSAyMzIgNTQ5UTIyNCA1NDkgMjE1IDU1NlEyMjMgNjAxIDI0NCA2MjhUMzAxIDY1NVEzMjYgNjU1IDM0MiA2NDJUMzczIDYxM1EzODYgNTk4IDM5NSA1OTFUNDE2IDU4NFE0MzAgNTg0IDQzOSA1OTVUNDU1IDYyNlE0NTkgNjM3IDQ2NCA2NDNUNDc4IDY0OVE0ODYgNjQ5IDQ5NSA2NDJRNDg3IDU5NyA0NjYgNTcxVDQxMCA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBnbHlwaC1uYW1lPSJVbWFjcm9uIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNMzE5IC0xMFEyNTUgLTEwIDIwNiA4VDEyOCA2MlQ4OSAxNTJUOTUgMjgwTDE2OSA2MjdRMTcyIDYzOSAxNzcgNjQ0VDE5NCA2NTBIMjAxUTIyNCA2NTAgMjE4IDYyNEwxNDUgMjc2UTExOSAxNTMgMTY2IDk0VDMyMiAzNVE0MDYgMzUgNDU4IDg2VDUzMSAyMzlMNjE0IDYyN1E2MTggNjUwIDYzOSA2NTBINjQ1UTY2OCA2NTAgNjYyIDYyNEw1NzkgMjI5UTU1MyAxMTEgNDg5IDUxVDMxOSAtMTBaTTMyOCA3MzZRMzA1IDczNiAzMDUgNzQ5UTMwNSA3NTQgMzA3IDc2MlQzMTQgNzc1UTMxNyA3NzkgMzIyIDc4MFQzMzQgNzgxSDU0NlE1NzAgNzgxIDU3MCA3NjhRNTcwIDc2MyA1NjggNzU1VDU2MSA3NDFRNTU4IDczOCA1NTMgNzM3VDU0MSA3MzZIMzI4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZCOyIgZ2x5cGgtbmFtZT0idW1hY3JvbiIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTQ2MyAtN1E0MjkgLTcgNDEyIDE2VDQwNCA5MFEzNzUgNDIgMzMyIDE2VDIzNCAtMTBRMTg5IC0xMCAxNTUgNVQ5OSA0OFQ3MiAxMThUNzYgMjEyTDEzMSA0NzNIMTc5TDEyMyAyMDlRMTA1IDEyNSAxMzkgODBUMjQxIDM1UTMwMCAzNSAzNDEgNjVUNDE4IDE1NUw0ODUgNDczSDUzM0w0NTMgOTVRNDQ0IDU0IDQ1NiA0MVQ0OTYgMjdRNDk2IDI3IDQ5NiAyMlQ0OTQgMTBUNDg0IC0xVDQ2MyAtN1pNMjQ2IDU2N1EyMjMgNTY3IDIyMyA1ODBRMjIzIDU4NSAyMjUgNTkzVDIzMiA2MDZRMjM1IDYxMCAyNDAgNjExVDI1MiA2MTJINDY0UTQ4OCA2MTIgNDg4IDU5OVE0ODggNTk0IDQ4NiA1ODZUNDc5IDU3MlE0NzYgNTY5IDQ3MSA1NjhUNDU5IDU2N0gyNDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkM7IiBnbHlwaC1uYW1lPSJVYnJldmUiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik0zMTkgLTEwUTI1NSAtMTAgMjA2IDhUMTI4IDYyVDg5IDE1MlQ5NSAyODBMMTY5IDYyN1ExNzIgNjM5IDE3NyA2NDRUMTk0IDY1MEgyMDFRMjI0IDY1MCAyMTggNjI0TDE0NSAyNzZRMTE5IDE1MyAxNjYgOTRUMzIyIDM1UTQwNiAzNSA0NTggODZUNTMxIDIzOUw2MTQgNjI3UTYxOCA2NTAgNjM5IDY1MEg2NDVRNjY4IDY1MCA2NjIgNjI0TDU3OSAyMjlRNTUzIDExMSA0ODkgNTFUMzE5IC0xMFpNNDM2IDcxNFE0MDMgNzE0IDM4MCA3MjRUMzQyIDc0OFEzMjUgNzY1IDMxOCA3ODNUMzExIDgxNVEzMTEgODI2IDMxNyA4MzRUMzQxIDg0MlEzNTAgODAzIDM3NCA3ODBUNDM3IDc1N1E0NzUgNzU3IDUwMSA3ODBUNTQyIDg0MlE1NTkgODQyIDU2NSA4MzRUNTcyIDgxOFE1NzIgODA3IDU2MyA3ODlUNTM4IDc1NVE1MTkgNzM2IDQ5MyA3MjVUNDM2IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RDsiIGdseXBoLW5hbWU9InVicmV2ZSIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTQ2MyAtN1E0MjkgLTcgNDEyIDE2VDQwNCA5MFEzNzUgNDIgMzMyIDE2VDIzNCAtMTBRMTg5IC0xMCAxNTUgNVQ5OSA0OFQ3MiAxMThUNzYgMjEyTDEzMSA0NzNIMTc5TDEyMyAyMDlRMTA1IDEyNSAxMzkgODBUMjQxIDM1UTMwMCAzNSAzNDEgNjVUNDE4IDE1NUw0ODUgNDczSDUzM0w0NTMgOTVRNDQ0IDU0IDQ1NiA0MVQ0OTYgMjdRNDk2IDI3IDQ5NiAyMlQ0OTQgMTBUNDg0IC0xVDQ2MyAtN1pNMzQ0IDU0NVEzMTEgNTQ1IDI4OCA1NTVUMjUwIDU3OVEyMzMgNTk2IDIyNiA2MTRUMjE5IDY0NlEyMTkgNjU3IDIyNSA2NjVUMjQ5IDY3M1EyNTggNjM0IDI4MiA2MTFUMzQ1IDU4OFEzODMgNTg4IDQwOSA2MTFUNDUwIDY3M1E0NjcgNjczIDQ3MyA2NjVUNDgwIDY0OVE0ODAgNjM4IDQ3MSA2MjBUNDQ2IDU4NlE0MjcgNTY3IDQwMSA1NTZUMzQ0IDU0NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RTsiIGdseXBoLW5hbWU9IlVyaW5nIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNMzE5IC0xMFEyNTUgLTEwIDIwNiA4VDEyOCA2MlQ4OSAxNTJUOTUgMjgwTDE2OSA2MjdRMTcyIDYzOSAxNzcgNjQ0VDE5NCA2NTBIMjAxUTIyNCA2NTAgMjE4IDYyNEwxNDUgMjc2UTExOSAxNTMgMTY2IDk0VDMyMiAzNVE0MDYgMzUgNDU4IDg2VDUzMSAyMzlMNjE0IDYyN1E2MTggNjUwIDYzOSA2NTBINjQ1UTY2OCA2NTAgNjYyIDYyNEw1NzkgMjI5UTU1MyAxMTEgNDg5IDUxVDMxOSAtMTBaTTQzNSA3MDRRMzg3IDcwNCAzNjEgNzMyVDMzNCA3OThRMzM0IDgyMyAzNDMgODQ1VDM2OCA4ODVUNDA2IDkxMlQ0NTQgOTIzUTUwMiA5MjMgNTI4IDg5NVQ1NTUgODI5UTU1NSA4MDQgNTQ2IDc4MlQ1MjEgNzQyVDQ4MiA3MTRUNDM1IDcwNFpNNDM2IDczOFE0NTQgNzM4IDQ2OCA3NDVUNDk0IDc2NVQ1MTEgNzk0VDUxNyA4MjdRNTE3IDg1MSA1MDAgODcwVDQ1MyA4OTBRNDM1IDg5MCA0MjEgODgzVDM5NSA4NjNUMzc4IDgzNFQzNzIgODAxUTM3MiA3NzcgMzg5IDc1OFQ0MzYgNzM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZGOyIgZ2x5cGgtbmFtZT0idXJpbmciIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik00NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhUNzIgMTE4VDc2IDIxMkwxMzEgNDczSDE3OUwxMjMgMjA5UTEwNSAxMjUgMTM5IDgwVDI0MSAzNVEzMDAgMzUgMzQxIDY1VDQxOCAxNTVMNDg1IDQ3M0g1MzNMNDUzIDk1UTQ0NCA1NCA0NTYgNDFUNDk2IDI3UTQ5NiAyNyA0OTYgMjJUNDk0IDEwVDQ4NCAtMVQ0NjMgLTdaTTM0NiA1MzBRMjk4IDUzMCAyNzIgNTU4VDI0NSA2MjRRMjQ1IDY0OSAyNTQgNjcxVDI3OSA3MTFUMzE3IDczOFQzNjUgNzQ5UTQxMyA3NDkgNDM5IDcyMVQ0NjYgNjU1UTQ2NiA2MzAgNDU3IDYwOFQ0MzIgNTY4VDM5MyA1NDBUMzQ2IDUzMFpNMzQ3IDU2NFEzNjUgNTY0IDM3OSA1NzFUNDA1IDU5MVQ0MjIgNjIwVDQyOCA2NTNRNDI4IDY3NyA0MTEgNjk2VDM2NCA3MTZRMzQ2IDcxNiAzMzIgNzA5VDMwNiA2ODlUMjg5IDY2MFQyODMgNjI3UTI4MyA2MDMgMzAwIDU4NFQzNDcgNTY0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcwOyIgZ2x5cGgtbmFtZT0iVWh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTMxOSAtMTBRMjU1IC0xMCAyMDYgOFQxMjggNjJUODkgMTUyVDk1IDI4MEwxNjkgNjI3UTE3MiA2MzkgMTc3IDY0NFQxOTQgNjUwSDIwMVEyMjQgNjUwIDIxOCA2MjRMMTQ1IDI3NlExMTkgMTUzIDE2NiA5NFQzMjIgMzVRNDA2IDM1IDQ1OCA4NlQ1MzEgMjM5TDYxNCA2MjdRNjE4IDY1MCA2MzkgNjUwSDY0NVE2NjggNjUwIDY2MiA2MjRMNTc5IDIyOVE1NTMgMTExIDQ4OSA1MVQzMTkgLTEwWk00NzAgNzE2UTQ2OSA3MTcgNDc3IDcyN1Q1MDAgNzUzVDUzNyA3ODhUNTg2IDgyOFE2MDQgODQxIDYxNCA4NDVUNjMyIDg1MFE2NDEgODUwIDY0NyA4NDVUNjU0IDgzMFE2NTQgODIxIDY0NiA4MTFUNjE1IDc4NFE1ODcgNzY0IDU2MiA3NTFUNTE2IDcyOVQ0ODQgNzE3VDQ3MCA3MTZaTTMwOCA3MTZRMzA2IDcxNyAzMTQgNzI3VDMzNyA3NTNUMzc1IDc4OFQ0MjQgODI4UTQ0MSA4NDEgNDUxIDg0NVQ0NzAgODUwUTQ3OCA4NTAgNDg0IDg0NVQ0OTEgODMwUTQ5MSA4MjEgNDgzIDgxMVQ0NTIgNzg0UTQyNCA3NjQgMzk5IDc1MVQzNTQgNzI5VDMyMiA3MTdUMzA4IDcxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3MTsiIGdseXBoLW5hbWU9InVodW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik00NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhUNzIgMTE4VDc2IDIxMkwxMzEgNDczSDE3OUwxMjMgMjA5UTEwNSAxMjUgMTM5IDgwVDI0MSAzNVEzMDAgMzUgMzQxIDY1VDQxOCAxNTVMNDg1IDQ3M0g1MzNMNDUzIDk1UTQ0NCA1NCA0NTYgNDFUNDk2IDI3UTQ5NiAyNyA0OTYgMjJUNDk0IDEwVDQ4NCAtMVQ0NjMgLTdaTTM3MiA1NDdRMzcxIDU0OCAzNzkgNTU4VDQwMiA1ODRUNDM5IDYxOVQ0ODggNjU5UTUwNiA2NzIgNTE2IDY3NlQ1MzQgNjgxUTU0MyA2ODEgNTQ5IDY3NlQ1NTYgNjYxUTU1NiA2NTIgNTQ4IDY0MlQ1MTcgNjE1UTQ4OSA1OTUgNDY0IDU4MlQ0MTggNTYwVDM4NiA1NDhUMzcyIDU0N1pNMjEwIDU0N1EyMDggNTQ4IDIxNiA1NThUMjM5IDU4NFQyNzcgNjE5VDMyNiA2NTlRMzQzIDY3MiAzNTMgNjc2VDM3MiA2ODFRMzgwIDY4MSAzODYgNjc2VDM5MyA2NjFRMzkzIDY1MiAzODUgNjQyVDM1NCA2MTVRMzI2IDU5NSAzMDEgNTgyVDI1NiA1NjBUMjI0IDU0OFQyMTAgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcyOyIgZ2x5cGgtbmFtZT0iVW9nb25layIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTTMxOSAtMTBRMjU1IC0xMCAyMDYgOFQxMjggNjJUODkgMTUyVDk1IDI4MEwxNjkgNjI3UTE3MiA2MzkgMTc3IDY0NFQxOTQgNjUwSDIwMVEyMjQgNjUwIDIxOCA2MjRMMTQ1IDI3NlExMTkgMTUzIDE2NiA5NFQzMjIgMzVRNDA2IDM1IDQ1OCA4NlQ1MzEgMjM5TDYxNCA2MjdRNjE4IDY1MCA2MzkgNjUwSDY0NVE2NjggNjUwIDY2MiA2MjRMNTc5IDIyOVE1NDQgNjkgNDM4IDE1UTM3MyAtMTcgMzUwIC00NlQzMjYgLTk5UTMyNiAtMTE2IDMzNyAtMTI2VDM2NSAtMTM2UTM4NiAtMTM2IDQwMiAtMTIwUTQxMCAtMTIxIDQxNSAtMTI2VDQyMSAtMTQyUTQyMSAtMTU4IDQwNCAtMTY4VDM2MSAtMTc5UTMyNiAtMTc5IDMwMyAtMTU5VDI4MCAtMTA3UTI4MCAtODIgMjk1IC01N1QzNDUgLTlRMzM4IC05IDMzMiAtOVQzMTkgLTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgZ2x5cGgtbmFtZT0idW9nb25layIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTMyNSAtMTI0UTMyNSAtOTIgMzUwIC02MFQ0MzMgLTFRNDEzIDcgNDA1IDI5VDQwNCA5MFEzNzUgNDIgMzMyIDE2VDIzNCAtMTBRMTg5IC0xMCAxNTUgNVQ5OSA0OFQ3MiAxMThUNzYgMjEyTDEzMSA0NzNIMTc5TDEyMyAyMDlRMTA1IDEyNSAxMzkgODBUMjQxIDM1UTMwMCAzNSAzNDEgNjVUNDE4IDE1NUw0ODUgNDczSDUzM0w0NTMgOTVRNDQ0IDU0IDQ1NiA0MVQ0OTYgMjdRNDk2IDI3IDQ5NiAyM1Q0OTUgMTRUNDg5IDNUNDc1IC01UTQxNCAtMzcgMzkzIC02NVQzNzEgLTExNlEzNzEgLTEzMyAzODIgLTE0M1Q0MTAgLTE1M1E0MzEgLTE1MyA0NDcgLTEzN1E0NTUgLTEzOCA0NjAgLTE0M1Q0NjYgLTE1OVE0NjYgLTE3NSA0NDkgLTE4NVQ0MDYgLTE5NlEzNzEgLTE5NiAzNDggLTE3NlQzMjUgLTEyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NDsiIGdseXBoLW5hbWU9IldjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iOTEwIiBkPSJNMTU0IDY0MFExNTQgNjQzIDE2MiA2NDdUMTc5IDY1MVQxOTcgNjQ0VDIwNSA2MTlMMjIxIDQ1TDQ3NiA1MjFRNDgzIDUzNSA0OTEgNTQxVDUxNyA1NDdRNTM4IDU0NyA1NDUgNTM4VDU1NSA1MTNMNjExIDQ2TDg3OSA2NDhRODc5IDY0OSA4ODggNjQ5VDkwNSA2NDZUOTE1IDYyOFQ5MDUgNTg4TDYzOCAyUTYzOCAxIDYzMyAxVDYyMiAwVDYxMSAwVDYwNiAwUTYwNSAwIDYwMCAwVDU4OCAwVDU3NiAwVDU3MCAyTDUxMiA0OTdMMjQzIDBIMTc4TDE1NCA2NDBaTTQ0MSA3MDRRNDI3IDcwNCA0MjcgNzE2UTQyNyA3MjggNDQyIDc0NlQ0OTMgNzk3UTUyOCA4MjkgNTUxIDg0NVQ1NzYgODYyUTU3OCA4NjIgNTkzIDg0NlQ2MjkgNzk5UTY1MiA3NjUgNjU5IDc0OVQ2NjYgNzI1UTY2NiA3MTQgNjYxIDcwOVQ2NDkgNzA0UTYzOSA3MDQgNjI5IDcxNlQ1OTkgNzY2UTU5MSA3ODAgNTg1IDc5MlQ1NzAgODE5TDUxOCA3NjVRNDg2IDczMSA0NjkgNzE4VDQ0MSA3MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzU7IiBnbHlwaC1uYW1lPSJ3Y2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjcxMyIgZD0iTTEyNiAzNDFRMTI2IDM3MSAxMjIgMzkwVDEwOSA0MjBUODggNDM1VDYwIDQ0MFE1OSA0NDAgNTkgNDQ2VDYxIDQ1OFQ3MyA0NzFUOTcgNDc3UTEyNCA0NzcgMTQyIDQ1OVExNzMgNDI4IDE3MiAzMzhMMTY5IDUwTDM0MyAzNzJRMzUyIDM5MCAzNjIgMzk1VDM4NyA0MDBRNDIxIDQwMCA0MjUgMzYzTDQ1OSA1MEw2NjMgNDc1UTY2MyA0NzYgNjcxIDQ3NlQ2ODYgNDcxVDY5NiA0NTRUNjg3IDQxOEw0ODIgMEg0MjJMMzc5IDM0MkwxOTAgMEgxMjVMMTI2IDM0MVpNMzA5IDUzMlEyOTUgNTMyIDI5NSA1NDRRMjk1IDU1NiAzMTAgNTc0VDM2MSA2MjVRMzk2IDY1NyA0MTkgNjczVDQ0NCA2OTBRNDQ2IDY5MCA0NjEgNjc0VDQ5NyA2MjdRNTIwIDU5MyA1MjcgNTc3VDUzNCA1NTNRNTM0IDU0MiA1MjkgNTM3VDUxNyA1MzJRNTA3IDUzMiA0OTcgNTQ0VDQ2NyA1OTRRNDU5IDYwOCA0NTMgNjIwVDQzOCA2NDdMMzg2IDU5M1EzNTQgNTU5IDMzNyA1NDZUMzA5IDUzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3NjsiIGdseXBoLW5hbWU9IlljaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTY5IiBkPSJNMjcxIDI3OUwxMDggNjQ3SDE2MkwzMDMgMzIyTDU4NCA2NTFRNTg1IDY1MiA1OTMgNjUwVDYwOCA2NDJUNjE0IDYyMlQ1OTMgNTg2TDMyMCAyNzRMMjYyIDBIMjEyTDI3MSAyNzlaTTI2OCA3MTRRMjU0IDcxNCAyNTQgNzI2UTI1NCA3MzggMjY5IDc1NlQzMjAgODA3UTM1NSA4MzkgMzc4IDg1NVQ0MDMgODcyUTQwNSA4NzIgNDIwIDg1NlQ0NTYgODA5UTQ3OSA3NzUgNDg2IDc1OVQ0OTMgNzM1UTQ5MyA3MjQgNDg4IDcxOVQ0NzYgNzE0UTQ2NiA3MTQgNDU2IDcyNlQ0MjYgNzc2UTQxOCA3OTAgNDEyIDgwMlQzOTcgODI5TDM0NSA3NzVRMzEzIDc0MSAyOTYgNzI4VDI2OCA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzc7IiBnbHlwaC1uYW1lPSJ5Y2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ4NyIgZD0iTTMgLTIwMFEtNDMgLTIwMCAtNjQgLTE3N1EtNzMgLTE2OCAtNzMgLTE1NlEtNzMgLTE0NCAtNjQgLTEzN1QtNTMgLTEzMVEtNDQgLTE0MiAtMjkgLTE0OVQwIC0xNTZRMTQgLTE1NiAyOCAtMTUxVDU4IC0xMzJUOTMgLTk1VDEzOCAtMzRMMTc4IDI2UTE1NSAyOSAxNTIgNThMMTEzIDM0M1ExMDUgMzk2IDg4IDQxN1QzOSA0MzhRMzkgNDM4IDM5IDQ0NFQ0MSA0NTdUNTEgNDcxVDc2IDQ3N1ExMDEgNDc3IDExOCA0NTlRMTMzIDQ0NCAxNDQgNDE1VDE2MCAzMzlMMTk2IDUyTDQ1OSA0NzNRNDU5IDQ3MyA0NjcgNDczVDQ4NSA0NzNUNTAyIDQ3MlQ1MTAgNDcxTDE4NCAtNDRRMTU1IC05MSAxMzIgLTEyMVQ4NyAtMTY4VDQ2IC0xOTNUMyAtMjAwWk0xOTcgNTQ1UTE4MyA1NDUgMTgzIDU1N1ExODMgNTY5IDE5OCA1ODdUMjQ5IDYzOFEyODQgNjcwIDMwNyA2ODZUMzMyIDcwM1EzMzQgNzAzIDM0OSA2ODdUMzg1IDY0MFE0MDggNjA2IDQxNSA1OTBUNDIyIDU2NlE0MjIgNTU1IDQxNyA1NTBUNDA1IDU0NVEzOTUgNTQ1IDM4NSA1NTdUMzU1IDYwN1EzNDcgNjIxIDM0MSA2MzNUMzI2IDY2MEwyNzQgNjA2UTI0MiA1NzIgMjI1IDU1OVQxOTcgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc4OyIgZ2x5cGgtbmFtZT0iWWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTY5IiBkPSJNMjcxIDI3OUwxMDggNjQ3SDE2MkwzMDMgMzIyTDU4NCA2NTFRNTg1IDY1MiA1OTMgNjUwVDYwOCA2NDJUNjE0IDYyMlQ1OTMgNTg2TDMyMCAyNzRMMjYyIDBIMjEyTDI3MSAyNzlaTTQ1MyA3MDlRNDE2IDcwOSA0MTYgNzM4UTQxNiA3NTYgNDI1IDc2OVQ0NTUgNzgzUTQ5MiA3ODMgNDkyIDc1NFE0OTIgNzM2IDQ4MyA3MjNUNDUzIDcwOVpNMjk0IDcwOVEyNTcgNzA5IDI1NyA3MzhRMjU3IDc1NiAyNjYgNzY5VDI5NSA3ODNRMzMzIDc4MyAzMzMgNzU0UTMzMyA3MzYgMzIzIDcyM1QyOTQgNzA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc5OyIgZ2x5cGgtbmFtZT0iWmFjdXRlIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNNyAzNEw5IDQ0TDU0MiA2MDJIMTY1UTEzNiA2MDIgMTM2IDYyMFExMzYgNjI4IDE0MSA2MzdUMTQ3IDY0N0g2MTdMNjEwIDYxM0w2MDggNjAzTDc0IDQ2SDQ3MVE1MDAgNDYgNTAwIDI3UTUwMCAxOSA0OTUgMTBUNDg4IDBIMEw3IDM0Wk0zMDggNzE2UTMwNyA3MTcgMzE2IDcyOFQzNDMgNzU0VDM4NSA3ODlUNDM3IDgyNlE0NTQgODM5IDQ2NCA4NDJUNDgzIDg0NlE0OTIgODQ2IDQ5OCA4NDBUNTA0IDgyNlE1MDQgODE2IDQ5NSA4MDdUNDYyIDc4MVE0MzIgNzYzIDQwNSA3NTBUMzU2IDcyOFQzMjIgNzE3VDMwOCA3MTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0E7IiBnbHlwaC1uYW1lPSJ6YWN1dGUiIGhvcml6LWFkdi14PSI0OTQiIGQ9Ik03IDM3TDQxOCA0MzJIMTI5UTEwMyA0MzIgMTAzIDQ0OVExMDMgNDU2IDEwNyA0NjRUMTEzIDQ3M0g0ODBWNDM3TDY4IDQxSDM2OFEzOTQgNDEgMzk0IDI0UTM5NCAxNyAzOTAgOVQzODQgMEg3VjM3Wk0yMzEgNTQ3UTIzMCA1NDggMjM5IDU1OVQyNjYgNTg1VDMwOCA2MjBUMzYwIDY1N1EzNzcgNjcwIDM4NyA2NzNUNDA2IDY3N1E0MTUgNjc3IDQyMSA2NzFUNDI3IDY1N1E0MjcgNjQ3IDQxOCA2MzhUMzg1IDYxMlEzNTUgNTk0IDMyOCA1ODFUMjc5IDU1OVQyNDUgNTQ4VDIzMSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBnbHlwaC1uYW1lPSJaZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTkxIiBkPSJNNyAzNEw5IDQ0TDU0MiA2MDJIMTY1UTEzNiA2MDIgMTM2IDYyMFExMzYgNjI4IDE0MSA2MzdUMTQ3IDY0N0g2MTdMNjEwIDYxM0w2MDggNjAzTDc0IDQ2SDQ3MVE1MDAgNDYgNTAwIDI3UTUwMCAxOSA0OTUgMTBUNDg4IDBIMEw3IDM0Wk0zODMgNzE1UTM0MiA3MTUgMzQyIDc0NlEzNDIgNzY1IDM1MiA3NzlUMzg0IDc5NFE0MjYgNzk0IDQyNiA3NjNRNDI2IDc0NCA0MTUgNzMwVDM4MyA3MTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0M7IiBnbHlwaC1uYW1lPSJ6ZG90YWNjZW50IiBob3Jpei1hZHYteD0iNDk0IiBkPSJNNyAzN0w0MTggNDMySDEyOVExMDMgNDMyIDEwMyA0NDlRMTAzIDQ1NiAxMDcgNDY0VDExMyA0NzNINDgwVjQzN0w2OCA0MUgzNjhRMzk0IDQxIDM5NCAyNFEzOTQgMTcgMzkwIDlUMzg0IDBIN1YzN1pNMjk3IDU0NlEyNTYgNTQ2IDI1NiA1NzdRMjU2IDU5NiAyNjYgNjEwVDI5OCA2MjVRMzQwIDYyNSAzNDAgNTk0UTM0MCA1NzUgMzI5IDU2MVQyOTcgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdEOyIgZ2x5cGgtbmFtZT0iWmNhcm9uIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNNyAzNEw5IDQ0TDU0MiA2MDJIMTY1UTEzNiA2MDIgMTM2IDYyMFExMzYgNjI4IDE0MSA2MzdUMTQ3IDY0N0g2MTdMNjEwIDYxM0w2MDggNjAzTDc0IDQ2SDQ3MVE1MDAgNDYgNTAwIDI3UTUwMCAxOSA0OTUgMTBUNDg4IDBIMEw3IDM0Wk0zNjIgNzAzUTM2MCA3MDMgMzQ1IDcxOVQzMDkgNzY2UTI4NiA4MDAgMjc5IDgxNlQyNzEgODQwUTI3MSA4NTEgMjc2IDg1NlQyODkgODYxUTI5OSA4NjEgMzA5IDg0OVQzMzkgNzk5UTM0NyA3ODUgMzUzIDc3M1QzNjggNzQ2UTM4MiA3NjAgMzkyIDc3MVQ0MjAgODAwUTQ1MiA4MzMgNDY5IDg0N1Q0OTcgODYxUTUxMSA4NjEgNTExIDg0OFE1MTEgODM2IDQ5NiA4MThUNDQ1IDc2OFE0MTAgNzM2IDM4NyA3MjBUMzYyIDcwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGdseXBoLW5hbWU9InpjYXJvbiIgaG9yaXotYWR2LXg9IjQ5NCIgZD0iTTcgMzdMNDE4IDQzMkgxMjlRMTAzIDQzMiAxMDMgNDQ5UTEwMyA0NTYgMTA3IDQ2NFQxMTMgNDczSDQ4MFY0MzdMNjggNDFIMzY4UTM5NCA0MSAzOTQgMjRRMzk0IDE3IDM5MCA5VDM4NCAwSDdWMzdaTTI5NSA1MjlRMjkzIDUyOSAyNzggNTQ1VDI0MiA1OTJRMjE5IDYyNiAyMTIgNjQyVDIwNCA2NjZRMjA0IDY3NyAyMDkgNjgyVDIyMiA2ODdRMjMyIDY4NyAyNDIgNjc1VDI3MiA2MjVRMjgwIDYxMSAyODYgNTk5VDMwMSA1NzJRMzE1IDU4NiAzMjUgNTk3VDM1MyA2MjZRMzg1IDY1OSA0MDIgNjczVDQzMCA2ODdRNDQ0IDY4NyA0NDQgNjc0UTQ0NCA2NjIgNDI5IDY0NFQzNzggNTk0UTM0MyA1NjIgMzIwIDU0NlQyOTUgNTI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTkyOyIgZ2x5cGgtbmFtZT0iZmxvcmluIiBob3Jpei1hZHYteD0iMzcyIiBkPSJNOTEgLTNRODMgLTMgNzcgMFQ3MiA2TDE1MyAzODdINzZRNTQgMzg3IDU0IDM5OVE1NCA0MDQgNTYgNDEyVDYzIDQyNVE2OCA0MzAgODIgNDMwSDE2MkwxNzggNTAzUTE5MiA1NzIgMjI3IDYxNFQzMjUgNjU3UTM1NSA2NTcgMzc0IDY1MFQ0MDYgNjMwUTQxOCA2MTggNDE4IDYwM1E0MTggNTkwIDQxMCA1ODNUMzk5IDU3OFEzODkgNTk0IDM2OSA2MDRUMzIzIDYxNVEyNzkgNjE1IDI1NyA1ODNUMjIzIDQ5NkwyMDkgNDMwSDMzOVEzNjEgNDMwIDM2MSA0MThRMzYxIDQxMyAzNTkgNDA1VDM1MiAzOTNRMzQ2IDM4NyAzMzMgMzg3SDIwMEwxMjcgMzhRMTIyIDE1IDExNCA2VDkxIC0zWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE4OyIgZ2x5cGgtbmFtZT0iU2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTY0IiBkPSJNMjY5IC0xMFEyMDAgLTEwIDE0OSAxMVQ2OSA2MVE1MiA3OCA0MiA5NlQzMiAxMzFRMzIgMTQwIDM2IDE0NlQ0NyAxNTVUNTggMTU4VDYzIDE1OFE3MiAxMzIgODkgMTEwVDEzMiA3MFQxOTMgNDNUMjcyIDMzUTM1NiAzMyAzOTggNjlUNDQwIDE2N1E0NDAgMTk1IDQyOCAyMTVUMzk2IDI1MVQzNDggMjc5VDI4OSAzMDVRMjU3IDMxOCAyMjcgMzMyVDE3NCAzNjdUMTM2IDQxNVQxMjEgNDgyUTEyMSA1MTkgMTM2IDU1MVQxNzggNjA2VDI0NSA2NDNUMzM0IDY1N1E0MDEgNjU3IDQ0NiA2MzhUNTE2IDU5NFE1MzIgNTc4IDU0MCA1NjJUNTQ4IDUzMlE1NDggNTIzIDU0NCA1MTdUNTM0IDUwOFQ1MjMgNTA1VDUxNyA1MDVRNTA5IDUyNyA0OTQgNTQ3VDQ1NSA1ODJUNDAyIDYwNVQzMzIgNjE0UTI5NiA2MTQgMjY3IDYwNVQyMTYgNTc4VDE4NCA1MzdUMTcyIDQ4N1ExNzIgNDU4IDE4MyA0MzdUMjE1IDQwMFQyNjMgMzcxVDMyNCAzNDVRMzU1IDMzMiAzODUgMzE4VDQzOCAyODRUNDc2IDIzN1Q0OTAgMTcyUTQ5MCA5MSA0MzMgNDFUMjY5IC0xMFpNMTQ5IC0yNjdRMTQ3IC0yNjkgMTQzIC0yNjhUMTM0IC0yNjVUMTI3IC0yNTlUMTI2IC0yNTJMMjMzIC02M1EyMzQgLTYyIDI0MSAtNjJUMjU2IC02NVQyNzEgLTczVDI3OCAtODhRMjc4IC05NiAyNzUgLTEwNFQyNjQgLTEyM0wxNDkgLTI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxOTsiIGdseXBoLW5hbWU9InNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjQ3NSIgZD0iTTIxOCAtMTBRMTYxIC0xMCAxMTcgN1Q0NyA1MVEzNiA2MiAyOSA3M1QyMiA5NFEyMiAxMDIgMjYgMTA3VDM0IDExNlQ0MyAxMjFUNDkgMTIyUTY4IDg1IDExMiA1OFQyMjEgMzBRMjg0IDMwIDMxOCA1NVQzNTIgMTIyUTM1MiAxNDEgMzQzIDE1NFQzMTggMTc3VDI3OSAxOTZUMjMwIDIxNFEyMDMgMjIzIDE3NyAyMzNUMTMxIDI1OVQ5OCAyOTVUODUgMzQ4UTg1IDM3NiA5NyA0MDFUMTMyIDQ0NFQxODYgNDcyVDI1NyA0ODNRMzExIDQ4MyAzNTEgNDY3VDQxNSA0MjdRNDM4IDQwMiA0MzggMzgzUTQzOCAzNzUgNDM0IDM3MFQ0MjUgMzYxVDQxNiAzNTdUNDEwIDM1OFEzOTMgMzk1IDM1MSA0MTlUMjUzIDQ0M1EyMjMgNDQzIDIwMSA0MzZUMTYzIDQxNlQxNDAgMzg3VDEzMiAzNTRRMTMyIDMzNCAxNDIgMzE5VDE2OSAyOTNUMjA5IDI3M1QyNTggMjU0UTI4NCAyNDUgMzA5IDIzNVQzNTQgMjEwVDM4NiAxNzZUMzk4IDEyN1EzOTggNjUgMzUxIDI4VDIxOCAtMTBaTTEwNSAtMjY3UTEwMyAtMjY5IDk5IC0yNjhUOTAgLTI2NVQ4MyAtMjU5VDgyIC0yNTJMMTg5IC02M1ExOTAgLTYyIDE5NyAtNjJUMjEyIC02NVQyMjcgLTczVDIzNCAtODhRMjM0IC05NiAyMzEgLTEwNFQyMjAgLTEyM0wxMDUgLTI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxQTsiIGdseXBoLW5hbWU9InVuaTAyMUEiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik0zNTUgNjAySDE0NFExMjEgNjAyIDEyMSA2MTRRMTIxIDYyMCAxMjMgNjI4VDEzMSA2NDJRMTM1IDY0NyAxNTEgNjQ3SDYyNFE2NDcgNjQ3IDY0NyA2MzVRNjQ3IDYyOSA2NDUgNjIxVDYzNyA2MDdRNjM1IDYwMyA2MzAgNjAzVDYxNyA2MDJINDA1TDI3NyAwSDIyN0wzNTUgNjAyWk0xMzUgLTI2N1ExMzMgLTI2OSAxMjkgLTI2OFQxMjAgLTI2NVQxMTMgLTI1OVQxMTIgLTI1MkwyMTkgLTYzUTIyMCAtNjIgMjI3IC02MlQyNDIgLTY1VDI1NyAtNzNUMjY0IC04OFEyNjQgLTk2IDI2MSAtMTA0VDI1MCAtMTIzTDEzNSAtMjY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjFCOyIgZ2x5cGgtbmFtZT0idW5pMDIxQiIgaG9yaXotYWR2LXg9IjM2MiIgZD0iTTIwMyAtMTBRMTM5IC0xMCAxMDkgMzFUOTUgMTU2TDE1MyA0MzBINzdMODUgNDczSDE2MkwxNzYgNTM5UTE4MSA1NjcgMTkwIDU3OFQyMTUgNTg5UTIyMiA1ODkgMjI3IDU4N1QyMzMgNTgzTDIxMCA0NzNIMzYyTDM1MyA0MzBIMjAxTDE0MiAxNTZRMTI4IDkwIDE0NiA2MVQyMTAgMzFRMjMyIDMxIDI1MCA0MFQyNzggNjNRMjgwIDY0IDI4NSA1OFQyOTAgNDBRMjkwIDI3IDI3OCAxNVEyNTMgLTEwIDIwMyAtMTBaTTU1IC0yNjdRNTMgLTI2OSA0OSAtMjY4VDQwIC0yNjVUMzMgLTI1OVQzMiAtMjUyTDEzOSAtNjNRMTQwIC02MiAxNDcgLTYyVDE2MiAtNjVUMTc3IC03M1QxODQgLTg4UTE4NCAtOTYgMTgxIC0xMDRUMTcwIC0xMjNMNTUgLTI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNjsiIGdseXBoLW5hbWU9ImNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yMzEgNTQ1UTIxNyA1NDUgMjE3IDU1N1EyMTcgNTY5IDIzMiA1ODdUMjgzIDYzOFEzMTggNjcwIDM0MSA2ODZUMzY2IDcwM1EzNjggNzAzIDM4MyA2ODdUNDE5IDY0MFE0NDIgNjA2IDQ0OSA1OTBUNDU2IDU2NlE0NTYgNTU1IDQ1MSA1NTBUNDM5IDU0NVE0MjkgNTQ1IDQxOSA1NTdUMzg5IDYwN1EzODEgNjIxIDM3NSA2MzNUMzYwIDY2MEwzMDggNjA2UTI3NiA1NzIgMjU5IDU1OVQyMzEgNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM3OyIgZ2x5cGgtbmFtZT0iY2Fyb24iIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0zMzEgNTI5UTMyOSA1MjkgMzE0IDU0NVQyNzggNTkyUTI1NSA2MjYgMjQ4IDY0MlQyNDAgNjY2UTI0MCA2NzcgMjQ1IDY4MlQyNTggNjg3UTI2OCA2ODcgMjc4IDY3NVQzMDggNjI1UTMxNiA2MTEgMzIyIDU5OVQzMzcgNTcyUTM1MSA1ODYgMzYxIDU5N1QzODkgNjI2UTQyMSA2NTkgNDM4IDY3M1Q0NjYgNjg3UTQ4MCA2ODcgNDgwIDY3NFE0ODAgNjYyIDQ2NSA2NDRUNDE0IDU5NFEzNzkgNTYyIDM1NiA1NDZUMzMxIDUyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDOTsiIGdseXBoLW5hbWU9Im92ZXJzY29yZSIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTIzMyA1NjdRMjEwIDU2NyAyMTAgNTgwUTIxMCA1ODUgMjEyIDU5M1QyMTkgNjA2UTIyMiA2MTAgMjI3IDYxMVQyMzkgNjEySDQ1MVE0NzUgNjEyIDQ3NSA1OTlRNDc1IDU5NCA0NzMgNTg2VDQ2NiA1NzJRNDYzIDU2OSA0NTggNTY4VDQ0NiA1NjdIMjMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ4OyIgZ2x5cGgtbmFtZT0iYnJldmUiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0zNDggNTQ1UTMxNSA1NDUgMjkyIDU1NVQyNTQgNTc5UTIzNyA1OTYgMjMwIDYxNFQyMjMgNjQ2UTIyMyA2NTcgMjI5IDY2NVQyNTMgNjczUTI2MiA2MzQgMjg2IDYxMVQzNDkgNTg4UTM4NyA1ODggNDEzIDYxMVQ0NTQgNjczUTQ3MSA2NzMgNDc3IDY2NVQ0ODQgNjQ5UTQ4NCA2MzggNDc1IDYyMFQ0NTAgNTg2UTQzMSA1NjcgNDA1IDU1NlQzNDggNTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ5OyIgZ2x5cGgtbmFtZT0iZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzQxIDU0NlEzMDAgNTQ2IDMwMCA1NzdRMzAwIDU5NiAzMTAgNjEwVDM0MiA2MjVRMzg0IDYyNSAzODQgNTk0UTM4NCA1NzUgMzczIDU2MVQzNDEgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRBOyIgZ2x5cGgtbmFtZT0icmluZyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTM0NiA1NDRRMjk4IDU0NCAyNzIgNTcyVDI0NSA2MzhRMjQ1IDY2MyAyNTQgNjg1VDI3OSA3MjVUMzE3IDc1MlQzNjUgNzYzUTQxMyA3NjMgNDM5IDczNVQ0NjYgNjY5UTQ2NiA2NDQgNDU3IDYyMlQ0MzIgNTgyVDM5MyA1NTRUMzQ2IDU0NFpNMzQ3IDU3OFEzNjUgNTc4IDM3OSA1ODVUNDA1IDYwNVQ0MjIgNjM0VDQyOCA2NjdRNDI4IDY5MSA0MTEgNzEwVDM2NCA3MzBRMzQ2IDczMCAzMzIgNzIzVDMwNiA3MDNUMjg5IDY3NFQyODMgNjQxUTI4MyA2MTcgMzAwIDU5OFQzNDcgNTc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRCOyIgZ2x5cGgtbmFtZT0ib2dvbmVrIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMjc5IDFRMjEzIC0zMiAxOTAgLTYxVDE2NiAtMTE0UTE2NiAtMTMxIDE3NyAtMTQxVDIwNSAtMTUxUTIyNiAtMTUxIDI0MiAtMTM1UTI1MCAtMTM2IDI1NSAtMTQxVDI2MSAtMTU3UTI2MSAtMTczIDI0NCAtMTgzVDIwMSAtMTk0UTE2NiAtMTk0IDE0MyAtMTc0VDEyMCAtMTIyUTEyMCAtODQgMTU2IC00N1QyNzMgMThMMjc5IDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREM7IiBnbHlwaC1uYW1lPSJ0aWxkZSIgaG9yaXotYWR2LXg9IjUzMyIgZD0iTTM5OCA1NDRRMzczIDU0NCAzNTcgNTU2VDMyNiA1ODVRMzEyIDYwMCAzMDMgNjA3VDI4MyA2MTRRMjY4IDYxNCAyNTkgNjAzVDI0NCA1NzJRMjM2IDU0OSAyMjAgNTQ5UTIxMiA1NDkgMjAzIDU1NlEyMTEgNjAxIDIzMiA2MjhUMjg5IDY1NVEzMTQgNjU1IDMzMCA2NDJUMzYxIDYxM1EzNzQgNTk4IDM4MyA1OTFUNDA0IDU4NFE0MTggNTg0IDQyNyA1OTVUNDQzIDYyNlE0NDcgNjM3IDQ1MiA2NDNUNDY2IDY0OVE0NzQgNjQ5IDQ4MyA2NDJRNDc1IDU5NyA0NTQgNTcxVDM5OCA1NDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREQ7IiBnbHlwaC1uYW1lPSJodW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0zNTYgNTQ3UTM1NSA1NDggMzYzIDU1OFQzODYgNTg0VDQyMyA2MTlUNDcyIDY1OVE0OTAgNjcyIDUwMCA2NzZUNTE4IDY4MVE1MjcgNjgxIDUzMyA2NzZUNTQwIDY2MVE1NDAgNjUyIDUzMiA2NDJUNTAxIDYxNVE0NzMgNTk1IDQ0OCA1ODJUNDAyIDU2MFQzNzAgNTQ4VDM1NiA1NDdaTTE5NCA1NDdRMTkyIDU0OCAyMDAgNTU4VDIyMyA1ODRUMjYxIDYxOVQzMTAgNjU5UTMyNyA2NzIgMzM3IDY3NlQzNTYgNjgxUTM2NCA2ODEgMzcwIDY3NlQzNzcgNjYxUTM3NyA2NTIgMzY5IDY0MlQzMzggNjE1UTMxMCA1OTUgMjg1IDU4MlQyNDAgNTYwVDIwOCA1NDhUMTk0IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDM5NDsiIGdseXBoLW5hbWU9ImluY3JlbWVudCIgaG9yaXotYWR2LXg9IjY0OSIgZD0iTTI5MyA3MDBIMzk2TDYzMyAwSDMwTDI5MyA3MDBaTTE0MCA3M0g0NjVMMzEwIDUyOEwxNDAgNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQTk7IiBnbHlwaC1uYW1lPSJPbWVnYSIgaG9yaXotYWR2LXg9Ijc2MCIgZD0iTTM4MCA2MDJRMzE4IDYwMiAyNzIgNTg1VDE5NiA1MzdUMTUwIDQ2N1QxMzUgMzgwUTEzNSAzMzUgMTQ5IDI5NFQxODggMjE2VDI0OSAxNDhUMzI1IDkzVjBINTFWOTNIMTg4UTExNCAxNTMgNzIgMjI1VDMwIDM4MFEzMCA0NDYgNTQgNTA0VDEyNCA2MDVUMjM1IDY3NFQzODAgNzAwUTQ2MCA3MDAgNTI1IDY3NVQ2MzUgNjA2VDcwNSA1MDRUNzMwIDM4MFE3MzAgMjk3IDY4OCAyMjVUNTcyIDkzSDcwOVYwSDQzNVY5M1E0NzYgMTE3IDUxMSAxNDhUNTcxIDIxNVQ2MTEgMjkzVDYyNSAzODBRNjI1IDQyNiA2MTAgNDY2VDU2NSA1MzdUNDg4IDU4NFQzODAgNjAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4M0JDOyIgZ2x5cGgtbmFtZT0ibXUiIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik01NiAtMjY3UTE5IC0yNjcgMiAtMjQzVC01IC0xNjZMMTMxIDQ3M0gxNzlMMTIzIDIwOVExMDUgMTI1IDEzOSA4MFQyNDEgMzVRMzAwIDM1IDM0MSA2NVQ0MTggMTU1TDQ4NSA0NzNINTMzTDQ1MyA5NVE0NDQgNTQgNDU2IDQxVDQ5NiAyN1YyMVE0OTcgMTYgNDk0IDEwVDQ4NCAtMVQ0NjMgLTdRNDI5IC03IDQxMiAxNlQ0MDQgOTBRMzc1IDQyIDMzMiAxNlQyMzQgLTEwUTE4OSAtMTAgMTU1IDVUOTkgNDhMOTEgNjBMNDMgLTE2NVEzNSAtMjA2IDQ3IC0yMTlUOTAgLTIzM1YtMjM4UTkxIC0yNDQgODggLTI1MFQ3OCAtMjYxVDU2IC0yNjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQzA7IiBnbHlwaC1uYW1lPSJwaSIgaG9yaXotYWR2LXg9Ijc4MyIgZD0iTTQwOSAtMTBRMzM3IC0xMCAyNzggMTRUMTc1IDgzVDEwOCAxODhUODQgMzIyUTg0IDM5NCAxMDggNDU1VDE3NiA1NjFUMjgwIDYzMVQ0MTAgNjU3UTQ4MiA2NTcgNTQyIDYzM1Q2NDUgNTY0VDcxMiA0NTlUNzM2IDMyNVE3MzYgMjUzIDcxMiAxOTJUNjQzIDg2VDUzOSAxNlQ0MDkgLTEwWk00MTEgMjZRNDc0IDI2IDUyNiA0OFQ2MTYgMTA5VDY3NSAyMDNUNjk2IDMyNFE2OTYgMzg4IDY3NSA0NDNUNjE1IDUzN1Q1MjQgNTk5VDQwOSA2MjJRMzQ2IDYyMiAyOTQgNjAwVDIwNCA1MzlUMTQ1IDQ0NFQxMjQgMzIzUTEyNCAyNTggMTQ1IDIwNFQyMDUgMTEwVDI5NSA0OFQ0MTEgMjZaTTMyNSAxMzlRMzA2IDEzOSAzMDYgMTYwVjQ1OVEzMDYgNDcwIDMxMyA0NzdUMzMxIDQ4NUg0MjRRNDg5IDQ4NSA1MjMgNDU3VDU1OCAzNzVRNTU4IDMyMSA1MjQgMjkzVDQyNiAyNjRIMzUxVjE2MFEzNTEgMTM5IDMzMSAxMzlIMzI1Wk00MjcgMzAwUTQ3MCAzMDAgNDkyIDMxOVQ1MTQgMzc0UTUxNCA0MDkgNDkyIDQyOFQ0MjQgNDQ4SDM1MFYzMDBINDI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxMzsiIGdseXBoLW5hbWU9ImVuZGFzaCIgaG9yaXotYWR2LXg9IjUzNSIgZD0iTTgzIDIyN1E2MSAyMjcgNjEgMjM5UTYxIDI0NCA2MyAyNTJUNzAgMjY0UTc2IDI3MCA4OCAyNzBINDU4UTQ4MCAyNzAgNDgwIDI1OFE0ODAgMjUyIDQ3OCAyNDRUNDcxIDIzMlE0NjYgMjI3IDQ1MyAyMjdIODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE0OyIgZ2x5cGgtbmFtZT0iZW1kYXNoIiBob3Jpei1hZHYteD0iNjk5IiBkPSJNODMgMjI3UTYxIDIyNyA2MSAyMzlRNjEgMjQ0IDYzIDI1MlQ3MCAyNjRRNzYgMjcwIDg4IDI3MEg2MjJRNjQzIDI3MCA2NDMgMjU4UTY0MyAyNTIgNjQxIDI0NFQ2MzQgMjMyUTYzMCAyMjcgNjE2IDIyN0g4M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTg7IiBnbHlwaC1uYW1lPSJxdW90ZWxlZnQiIGhvcml6LWFkdi14PSIyMjYiIGQ9Ik0xNTQgNDM4UTE1MyA0MzcgMTQ2IDQzN1QxMzEgNDQwVDExNSA0NDhUMTA4IDQ2M1ExMDggNDcxIDExMSA0NzlUMTIzIDQ5OEwyNDEgNjYwUTI0MyA2NjIgMjQ3IDY2MVQyNTYgNjU4VDI2MiA2NTFUMjY0IDY0NEwxNTQgNDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxOTsiIGdseXBoLW5hbWU9InF1b3RlcmlnaHQiIGhvcml6LWFkdi14PSIyMjYiIGQ9Ik0xMTcgNDM2UTExNSA0MzQgMTExIDQzNVQxMDIgNDM4VDk1IDQ0NVQ5NCA0NTJMMjA0IDY1OFEyMDUgNjU5IDIxMiA2NTlUMjI3IDY1NlQyNDIgNjQ4VDI0OSA2MzNRMjQ5IDYyNSAyNDYgNjE3VDIzNSA1OThMMTE3IDQzNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjIyNSIgZD0iTS0yMyAtMTQ0US0yNSAtMTQ2IC0yOSAtMTQ1VC0zOCAtMTQyVC00NSAtMTM1VC00NiAtMTI4TDY0IDc4UTY1IDc5IDcyIDc5VDg3IDc2VDEwMiA2OFQxMDkgNTNRMTA5IDQ1IDEwNiAzOFQ5NSAxOUwtMjMgLTE0NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUM7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGxlZnQiIGhvcml6LWFkdi14PSIzNjQiIGQ9Ik0xNTQgNDM5UTE1MyA0MzggMTQ2IDQzOFQxMzEgNDQxVDExNSA0NDlUMTA4IDQ2NFExMDggNDcyIDExMSA0ODBUMTIzIDQ5OUwyNDEgNjYxUTI0MyA2NjMgMjQ3IDY2MlQyNTYgNjU5VDI2MiA2NTJUMjY0IDY0NUwxNTQgNDM5Wk0yOTIgNDM4UTI5MiA0MzcgMjg1IDQzN1QyNjkgNDQwVDI1NCA0NDhUMjQ3IDQ2M1EyNDcgNDcxIDI1MCA0NzlUMjYyIDQ5OEwzODAgNjYwUTM4MSA2NjIgMzg1IDY2MVQzOTQgNjU4VDQwMSA2NTFUNDAyIDY0NEwyOTIgNDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRDsiIGdseXBoLW5hbWU9InF1b3RlZGJscmlnaHQiIGhvcml6LWFkdi14PSIzNjQiIGQ9Ik0xMTcgNDM2UTExNSA0MzQgMTExIDQzNVQxMDIgNDM4VDk1IDQ0NVQ5NCA0NTJMMjA0IDY1OFEyMDUgNjU5IDIxMiA2NTlUMjI3IDY1NlQyNDIgNjQ4VDI0OSA2MzNRMjQ5IDYyNSAyNDYgNjE3VDIzNSA1OThMMTE3IDQzNlpNMjU1IDQzNVEyNTMgNDMzIDI0OSA0MzRUMjQwIDQzN1QyMzQgNDQ0VDIzMyA0NTFRMjY0IDUwOCAyODggNTU0UTI5OCA1NzMgMzA3IDU5MlQzMjUgNjI1UTMzNCA2NDIgMzQyIDY1N1EzNDMgNjU4IDM1MCA2NThUMzY1IDY1NVQzODEgNjQ3VDM4OCA2MzJRMzg4IDYyNCAzODUgNjE2VDM3MyA1OTdMMjU1IDQzNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUU7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGJhc2UiIGhvcml6LWFkdi14PSIzNjQiIGQ9Ik0tMjMgLTE0NFEtMjUgLTE0NiAtMjkgLTE0NVQtMzggLTE0MlQtNDUgLTEzNVQtNDYgLTEyOEw2NCA3OFE2NSA3OSA3MiA3OVQ4NyA3NlQxMDIgNjhUMTA5IDUzUTEwOSA0NSAxMDYgMzhUOTUgMTlMLTIzIC0xNDRaTTExNSAtMTQ1UTExMyAtMTQ3IDEwOSAtMTQ2VDEwMSAtMTQzVDk0IC0xMzZUOTMgLTEyOUwyMDMgNzdRMjAzIDc4IDIxMCA3OFQyMjYgNzVUMjQxIDY3VDI0OCA1MlEyNDggMzcgMjMzIDE4TDExNSAtMTQ1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMDsiIGdseXBoLW5hbWU9ImRhZ2dlciIgaG9yaXotYWR2LXg9IjUzMSIgZD0iTTE4MyAtMTU2UTE2OSAtMTU2IDE2NiAtMTUxVDE2NCAtMTM4TDI1NSAzMDlRMjU4IDMyMyAyNjUgMzQ0VDI4MSAzODFMMTA4IDM3MlE5MSAzNzAgODQgMzczVDc2IDM4OFE3NiA0MDQgODMgNDEzVDExMiA0MjFMMjg4IDQxM0wzMjAgNjE5UTMyMiA2MzcgMzI3IDY0NFQzNDkgNjUyUTM4MyA2NTIgMzczIDYxNkwzMTkgNDExTDQ5MyA0MjFRNTEwIDQyMyA1MTcgNDIwVDUyNCA0MDRRNTI0IDM4OSA1MTcgMzc5VDQ4OCAzNzFMMzEzIDM4MFEzMTMgMzYzIDMxMiAzNDNUMzA3IDMwOUwyMDggLTEzOVEyMDUgLTE1NiAxOTIgLTE1NkgxODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIxOyIgZ2x5cGgtbmFtZT0iZGFnZ2VyZGJsIiBob3Jpei1hZHYteD0iNTMxIiBkPSJNMTgzIC0xNTZRMTY5IC0xNTYgMTY2IC0xNTFUMTY0IC0xMzhMMjE0IDEwN0w1MCA5OFExOCA5NCAxOCAxMTRRMTggMTI5IDI1IDEzOVQ1NCAxNDdMMjIwIDEzOEwyNTUgMzA5UTI1OCAzMjMgMjY1IDM0NFQyODEgMzgxTDEwOCAzNzJROTEgMzcwIDg0IDM3M1Q3NiAzODhRNzYgNDA0IDgzIDQxM1QxMTIgNDIxTDI4OCA0MTNMMzIwIDYxOVEzMjIgNjM3IDMyNyA2NDRUMzQ5IDY1MlEzODMgNjUyIDM3MyA2MTZMMzE5IDQxMUw0OTMgNDIxUTUxMCA0MjMgNTE3IDQyMFQ1MjQgNDA0UTUyNCAzODkgNTE3IDM3OVQ0ODggMzcxTDMxMyAzODBRMzEzIDM2MyAzMTIgMzQzVDMwNyAzMDlMMjY5IDEzN0w0MzUgMTQ2UTQ2NyAxNTAgNDY3IDEzMFE0NjcgMTE1IDQ2MCAxMDVUNDMxIDk3TDI2MyAxMDZMMjA4IC0xMzlRMjA1IC0xNTYgMTkyIC0xNTZIMTgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGdseXBoLW5hbWU9ImJ1bGxldCIgaG9yaXotYWR2LXg9IjMzNCIgZD0iTTE3MCAxNjBRMTMzIDE2MCAxMDggMTg1VDgzIDI0OFE4MyAyODUgMTA4IDMxMFQxNzAgMzM2UTIwNiAzMzYgMjMxIDMxMVQyNTYgMjQ4UTI1NiAyMTEgMjMxIDE4NlQxNzAgMTYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyNjsiIGdseXBoLW5hbWU9ImVsbGlwc2lzIiBob3Jpei1hZHYteD0iNjA4IiBkPSJNNDUwIC01UTQxMyAtNSA0MTMgMjJRNDEzIDUwIDQyNiA2MlE0MzYgNzIgNDU0IDcyUTQ5MSA3MiA0OTEgNDZRNDkxIDE4IDQ3OSA1UTQ2OSAtNSA0NTAgLTVaTTI1OSAtNVEyMjIgLTUgMjIyIDIyUTIyMiA1MCAyMzUgNjJRMjQ1IDcyIDI2MyA3MlEzMDAgNzIgMzAwIDQ2UTMwMCAxOCAyODcgNVEyNzggLTUgMjU5IC01Wk02OCAtNVEzMSAtNSAzMSAyMlEzMSA1MCA0MyA2MlE1MyA3MiA3MiA3MlExMDkgNzIgMTA5IDQ2UTEwOSAxOCA5NiA1UTg2IC01IDY4IC01WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzMDsiIGdseXBoLW5hbWU9InBlcnRob3VzYW5kIiBob3Jpei1hZHYteD0iMTA3MSIgZD0iTTIzNSAzNThRMjA5IDM1OCAxODYgMzY3VDE0NSAzOTNUMTE3IDQzNVQxMDYgNDg5UTEwNiA1MjIgMTE4IDU1MlQxNTEgNjA2VDIwMiA2NDJUMjY2IDY1NlEyOTMgNjU2IDMxNiA2NDdUMzU3IDYyMVQzODUgNTc5VDM5NSA1MjVRMzk1IDQ5MiAzODMgNDYyVDM1MCA0MDhUMjk5IDM3MlQyMzUgMzU4Wk02MiAtN1E2MCAtOSA1MSAtNFQ0MiAxM1E0MiAyMyA0NyAzMVQ2OSA1NEw3MTggNjU4UTcyMCA2NjAgNzI4IDY1NVQ3MzcgNjM4UTczNyA2MjkgNzMyIDYyMVQ3MTAgNTk4TDYyIC03Wk04NDMgLTVRODE3IC01IDc5NCA0VDc1MiAzMFQ3MjQgNzJUNzEzIDEyNlE3MTMgMTU5IDcyNSAxODlUNzU4IDI0M1Q4MDkgMjc5VDg3MyAyOTNROTAwIDI5MyA5MjMgMjg0VDk2NCAyNThUOTkyIDIxNlQxMDAyIDE2MlExMDAyIDEyOSA5OTAgOTlUOTU3IDQ1VDkwNyA5VDg0MyAtNVpNNTE0IC01UTQ4OCAtNSA0NjUgNFQ0MjMgMzBUMzk1IDcyVDM4NCAxMjZRMzg0IDE1OSAzOTYgMTg5VDQyOSAyNDNUNDgwIDI3OVQ1NDQgMjkzUTU3MSAyOTMgNTk0IDI4NFQ2MzUgMjU4VDY2MyAyMTZUNjczIDE2MlE2NzMgMTI5IDY2MSA5OVQ2MjggNDVUNTc4IDlUNTE0IC01Wk0yMzggMzk2UTI2MyAzOTYgMjg0IDQwNlQzMjAgNDM0VDM0NSA0NzRUMzU0IDUyM1EzNTQgNTY1IDMyOCA1OTFUMjYzIDYxOFEyMzggNjE4IDIxNyA2MDhUMTgxIDU4MFQxNTYgNTQwVDE0NyA0OTFRMTQ3IDQ0OSAxNzQgNDIzVDIzOCAzOTZaTTg0NiAzM1E4NzAgMzMgODkxIDQzVDkyOCA3MVQ5NTMgMTExVDk2MiAxNjBROTYyIDIwMiA5MzUgMjI4VDg3MCAyNTVRODQ2IDI1NSA4MjUgMjQ1VDc4OCAyMTdUNzYzIDE3N1Q3NTQgMTI4UTc1NCA4NiA3ODEgNjBUODQ2IDMzWk01MTcgMzNRNTQxIDMzIDU2MiA0M1Q1OTkgNzFUNjI0IDExMVQ2MzMgMTYwUTYzMyAyMDIgNjA2IDIyOFQ1NDEgMjU1UTUxNyAyNTUgNDk2IDI0NVQ0NTkgMjE3VDQzNCAxNzdUNDI1IDEyOFE0MjUgODYgNDUyIDYwVDUxNyAzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzk7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xsZWZ0IiBob3Jpei1hZHYteD0iMzM2IiBkPSJNMjE5IDgzUTIwNSA4MyAxODYgOTlUMTMyIDE1M1E5OSAxOTAgODEgMjE2VDYzIDI0N1E2NCAyNTEgOTIgMjc2VDE2OSAzMzZRMjE1IDM2OSAyNDIgMzg1VDI4MyA0MDFRMjkxIDQwMSAyOTUgMzk2VDMwMCAzODNRMzAwIDM1OSAxOTUgMjkzUTE3MiAyNzggMTUxIDI2NVQxMDcgMjM4UTEyNSAyMjMgMTQwIDIwOVQxNzMgMTc5UTE5MyAxNjAgMjA1IDE0OFQyMjUgMTI3VDIzNiAxMTJUMjM5IDEwMFEyMzkgOTMgMjM0IDg4VDIxOSA4M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwM0E7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xyaWdodCIgaG9yaXotYWR2LXg9IjMzNiIgZD0iTTU3IDgzUTQ5IDgzIDQ1IDg4VDQwIDEwMVE0MCAxMjQgMTQ0IDE5MVExNjggMjA2IDE4OCAyMTlUMjMyIDI0NlEyMTUgMjYxIDIwMCAyNzRUMTY3IDMwNVExMjcgMzQyIDExNCAzNTdUMTAwIDM4NFExMDAgMzkxIDEwNiAzOTZUMTIwIDQwMVExMzQgNDAxIDE1NCAzODVUMjA3IDMzMVEyNDEgMjkzIDI1OSAyNjdUMjc3IDIzNlEyNzUgMjMzIDI0NyAyMDhUMTcwIDE0OFExMjUgMTE1IDk4IDk5VDU3IDgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjA0NDsiIGdseXBoLW5hbWU9InVuaTIwNDQiIGhvcml6LWFkdi14PSI2NTMiIGQ9Ik0xNSAtN1ExMyAtOSA2IC03VC00IDNULTQgMjNUMjAgNTRMNjc4IDY1OVE2ODAgNjYwIDY4NiA2NThUNjk2IDY0OFQ2OTYgNjI4VDY3MiA1OTdMMTUgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMEFDOyIgZ2x5cGgtbmFtZT0iRXVybyIgaG9yaXotYWR2LXg9IjY1NiIgZD0iTTExMCAzODRRODggMzg0IDg4IDM5NlE4OCA0MDEgOTAgNDA5VDk3IDQyMVExMDMgNDI3IDExNiA0MjdIMTkzUTIwOSA0NjkgMjMxIDUwOFQyODQgNTc5UTMyMyA2MTggMzY4IDYzN1Q0NzEgNjU3UTUyMiA2NTcgNTU3IDY0MlQ2MTcgNjAxUTYzNCA1ODQgNjQzIDU2M1Q2NTIgNTI0UTY1MiA1MTMgNjQ3IDUwN1Q2MzYgNDk3VDYyNSA0OTNUNjE5IDQ5NFE2MDUgNTUxIDU2NyA1ODNUNDY2IDYxNVE0MjEgNjE1IDM4NSA1OTlUMzE4IDU1MlEyOTIgNTI2IDI3NCA0OTRUMjQyIDQyN0g0NzRRNDk1IDQyNyA0OTUgNDE1UTQ5NSA0MDkgNDkzIDQwMVQ0ODYgMzg5UTQ4MiAzODQgNDY4IDM4NEgyMjhRMjE5IDM1MiAyMTQgMzIyVDIwNiAyNjhINDQwUTQ2MSAyNjggNDYxIDI1NlE0NjEgMjUxIDQ1OSAyNDNUNDUyIDIzMVE0NDggMjI2IDQzNCAyMjZIMjA1UTIwNiAxODMgMjE4IDE0OFQyNTMgODdUMzA2IDQ3VDM3NyAzM1E0MzIgMzMgNDc0IDYwVDU0NSAxMzNRNTQ2IDEzNCA1NDkgMTMzVDU1NyAxMjhUNTY1IDEyMVQ1NjkgMTA5UTU2OSA4NyA1MzYgNTRRNTEwIDI4IDQ2OCA5VDM3OSAtMTBRMjcyIC0xMCAyMTUgNTNUMTU1IDIyNkg3NlE1NCAyMjYgNTQgMjM3UTU0IDI0MyA1NiAyNTFUNjMgMjYzUTY4IDI2OCA4MiAyNjhIMTU3UTE1OSAyOTMgMTY0IDMyMlQxNzkgMzg0SDExMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMTM7IiBnbHlwaC1uYW1lPSJhZmlpNjEyODkiIGhvcml6LWFkdi14PSI0MzQiIGQ9Ik0xOTkgMzQxUTIyOCAzNjUgMjUxIDM5NVQyOTEgNDU2VDMxNyA1MTNUMzI2IDU1OFEzMjYgNTg0IDMxNSA1ODRRMzA4IDU4NCAzMDAgNTczUTI5MSA1NjEgMjc4IDUzOVQyNTAgNDg2VDIyMiA0MTlUMTk5IDM0MVpNNDQgMTM4UTMwIDE1MSAxOSAxNzJUNyAyMjhRMjUgMjM3IDMzIDI0MFQ0OSAyNDZMNTkgMjUxUTYzIDMyMSA4MSAzODNUMTI2IDQ5N1QxODMgNTg4VDI0NSA2NTJRMjg1IDY4MyAzMjcgNjgzUTM2NyA2ODMgMzk1IDY1MlQ0MjMgNTU4UTQyMyA1MDkgNDAyIDQ2M1QzNDkgMzc1VDI3NiAyOTRUMTk2IDIyM1ExOTYgMjE4IDE5NiAyMTRUMTk1IDIwNFExOTUgMTU4IDIwNyAxMzNUMjM3IDEwN1EyNTQgMTA3IDI3MyAxMzNUMzEwIDIxN1EzMjIgMjIwIDMzNiAyMjBRMzU1IDIyMCAzNzMgMjEzVDQwNCAxODZRMzk3IDE0OSAzODIgMTE0VDM0NSA1MlQyOTMgOVQyMjggLThRMjA2IC04IDE4MiAxVDEzNSAzMFQ5NCA3OFQ2NiAxNDZMNDQgMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyMjsiIGdseXBoLW5hbWU9InRyYWRlbWFyayIgaG9yaXotYWR2LXg9IjY4NyIgZD0iTTQxNiAzNDJRNDAwIDM0MiA0MDAgMzYxVjYyOFE0MDAgNjUwIDQyMCA2NTBINDM4UTQ0OCA2NTAgNDUyIDY0NlQ0NjEgNjMzTDU0MSA0NjVMNjIwIDYzM1E2MjUgNjQzIDYyOSA2NDZUNjQzIDY1MEg2NjBRNjgwIDY1MCA2ODAgNjI4VjM2MVE2ODAgMzQyIDY2MyAzNDJINjU4UTY0MiAzNDIgNjQyIDM2MVY1OTdMNTYyIDQyNVE1NjAgNDIwIDU1NyA0MTdUNTQwIDQxNFE1MjcgNDE0IDUyNCA0MTdUNTE5IDQyNUw0MzggNTk2VjM2MVE0MzggMzQyIDQyMyAzNDJINDE2Wk0yMTggMzQyUTIwMSAzNDIgMjAxIDM2MVY2MTJIMTExUTkzIDYxMiA5MyA2MjhWNjMxUTkzIDY0OCAxMTEgNjQ4SDMzMVEzNDkgNjQ4IDM0OSA2MzFWNjI4UTM0OSA2MTIgMzMxIDYxMkgyNDFWMzYxUTI0MSAzNDIgMjIzIDM0MkgyMThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTI2OyIgZ2x5cGgtbmFtZT0idW5pMjEyNiIgaG9yaXotYWR2LXg9Ijc2MCIgZD0iTTM4MCA2MDJRMzE4IDYwMiAyNzIgNTg1VDE5NiA1MzdUMTUwIDQ2N1QxMzUgMzgwUTEzNSAzMzUgMTQ5IDI5NFQxODggMjE2VDI0OSAxNDhUMzI1IDkzVjBINTFWOTNIMTg4UTExNCAxNTMgNzIgMjI1VDMwIDM4MFEzMCA0NDYgNTQgNTA0VDEyNCA2MDVUMjM1IDY3NFQzODAgNzAwUTQ2MCA3MDAgNTI1IDY3NVQ2MzUgNjA2VDcwNSA1MDRUNzMwIDM4MFE3MzAgMjk3IDY4OCAyMjVUNTcyIDkzSDcwOVYwSDQzNVY5M1E0NzYgMTE3IDUxMSAxNDhUNTcxIDIxNVQ2MTEgMjkzVDYyNSAzODBRNjI1IDQyNiA2MTAgNDY2VDU2NSA1MzdUNDg4IDU4NFQzODAgNjAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyRTsiIGdseXBoLW5hbWU9ImVzdGltYXRlZCIgaG9yaXotYWR2LXg9IjgzMCIgZD0iTTQxNSA2NzFRNDkyIDY3MSA1NjAgNjQ1VDY4MSA1NzNUNzYzIDQ2M1Q3OTMgMzI0SDE4NVExNzUgMzI0IDE3NSAzMTNWMTE2UTIyMyA2NSAyODYgMzhUNDE1IDEwUTQ5MCAxMCA1NTUgNDNUNjY3IDEzMUg3MjRRNjY3IDYyIDU4NSAyNlQ0MTUgLTExUTM0MCAtMTEgMjcyIDE0VDE1MSA4NFQ2NyAxOTFUMzYgMzMwUTM2IDQwMyA2NiA0NjVUMTQ3IDU3NFQyNjggNjQ1VDQxNSA2NzFaTTQxNSA2NTBRMzQ1IDY1MCAyODIgNjIyVDE3NSA1NDNWMzU4UTE3NSAzNDcgMTg1IDM0N0g2NDZRNjU1IDM0NyA2NTUgMzU4VjU0MlE2MTAgNTk0IDU0NiA2MjJUNDE1IDY1MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMDI7IiBnbHlwaC1uYW1lPSJwYXJ0aWFsZGlmZiIgaG9yaXotYWR2LXg9IjUzOCIgZD0iTTMwMyA0ODFRMzM1IDQ4MSAzNjEgNDcxVDQwNCA0NDVWNDY0UTQwNCA0OTkgMzk5IDUyOFQzODEgNTc4VDM0MyA2MTBUMjgyIDYyMlEyNDcgNjIyIDIwOCA2MTJMMTg5IDY3OVEyNzEgNzEwIDMzMiA3MTBRNDIxIDcxMCA0NjQgNjQ5VDUwOCA0NzVRNTA4IDM3MCA0ODEgMjgzVDQwOSAxMzNUMzExIDM1VDIwMSAwUTE2NSAwIDEzNCAxMFQ4MCA0NFQ0MyAxMDJUMzAgMTg3UTMwIDI1NiA1NSAzMTBUMTIwIDQwM1QyMDggNDYxVDMwMyA0ODFaTTIwNSAxMDVRMjI5IDEwNSAyNTYgMTIxVDMxMCAxNjdUMzU5IDI0M1QzOTMgMzQ5UTM4MiAzNjEgMzYwIDM3M1QzMDkgMzg2UTI3NSAzODYgMjQ0IDM3MVQxODggMzMxVDE0OSAyNzBUMTM0IDE5NFExMzQgMTU3IDE1MCAxMzFUMjA1IDEwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMDY7IiBnbHlwaC1uYW1lPSJ1bmkyMjA2IiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNMjkzIDcwMEgzOTZMNjMzIDBIMzBMMjkzIDcwMFpNMTQwIDczSDQ2NUwzMTAgNTI4TDE0MCA3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMEY7IiBnbHlwaC1uYW1lPSJwcm9kdWN0IiBob3Jpei1hZHYteD0iNjM0IiBkPSJNNDg0IDBWNjA3SDE1MFYwSDUwVjcwMEg1ODRWMEg0ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjExOyIgZ2x5cGgtbmFtZT0ic3VtbWF0aW9uIiBob3Jpei1hZHYteD0iNDc1IiBkPSJNMTEwIDgwSDQzN1YwSDI1Vjk2TDIwOSAzMjVMMjUgNTU0VjY1MEg0MzdWNTcwSDExNUwyODggMzUzVjMwMEwxMTAgODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjEyOyIgZ2x5cGgtbmFtZT0ibWludXMiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik0xMzEgMjQ0UTEwNiAyNDQgMTEyIDI2M0wxMTMgMjY5UTExNiAyNzkgMTIxIDI4M1QxNDAgMjg4SDUxM1E1MjcgMjg4IDUzMSAyODRUNTMzIDI2OUw1MzEgMjYzUTUyNyAyNDQgNTA0IDI0NEgxMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE1OyIgZ2x5cGgtbmFtZT0iZnJhY3Rpb24iIGhvcml6LWFkdi14PSI2NTMiIGQ9Ik0xNSAtN1ExMyAtOSA2IC03VC00IDNULTQgMjNUMjAgNTRMNjc4IDY1OVE2ODAgNjYwIDY4NiA2NThUNjk2IDY0OFQ2OTYgNjI4VDY3MiA1OTdMMTUgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE5OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjQwIiBkPSJNMTIxIDIxMVE4NCAyMTEgODQgMjM3UTg0IDI2NSA5NyAyNzhRMTA2IDI4OCAxMjUgMjg4UTE2MiAyODggMTYyIDI2MVExNjIgMjMzIDE0OSAyMjFRMTM5IDIxMSAxMjEgMjExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxQTsiIGdseXBoLW5hbWU9InJhZGljYWwiIGhvcml6LWFkdi14PSI2NDkiIGQ9Ik0yNTYgNTAxTDM2OSAxNzFMNTY2IDcwMEg2NDlMMzg2IDBIMjgzTDEzNiA0MzNIMzBWNTAxSDI1NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMUU7IiBnbHlwaC1uYW1lPSJpbmZpbml0eSIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTcwMyAyNzFRNzAzIDIzMSA2OTAgMjAzVDY1NCAxNTZUNjA0IDEyOVQ1NDcgMTIwUTUxOCAxMjAgNDkzIDEyOFQ0NDcgMTUwVDQwNSAxODFUMzY2IDIxN1EzNDcgMTk5IDMyOCAxODJUMjg3IDE1MVQyNDAgMTI5VDE4NiAxMjBRMTU3IDEyMCAxMjkgMTI5VDc5IDE1NlQ0NCAyMDNUMzAgMjcxUTMwIDMxMCA0MyAzMzhUNzkgMzg1VDEyOSA0MTNUMTg2IDQyMlEyMTUgNDIyIDI0MCA0MTRUMjg2IDM5MlQzMjcgMzYxVDM2NiAzMjVRMzg1IDM0MyA0MDUgMzYwVDQ0NiAzOTFUNDkzIDQxM1Q1NDcgNDIyUTU3NiA0MjIgNjA0IDQxNFQ2NTQgMzg3VDY4OSAzNDBUNzAzIDI3MVpNMTg3IDIyMlEyMjMgMjIyIDI1MiAyMzVUMzA4IDI3MVEyODIgMjkyIDI1MyAzMDZUMTg3IDMyMFExNjcgMzIwIDE0OSAzMDlUMTMwIDI3MVExMzAgMjQ0IDE0OCAyMzNUMTg3IDIyMlpNNTQ2IDMyMFE1MTAgMzIwIDQ4MSAzMDZUNDI1IDI3MVE0NTEgMjQ5IDQ4MCAyMzZUNTQ2IDIyMlE1NjYgMjIyIDU4NCAyMzNUNjAzIDI3MVE2MDMgMjk4IDU4NSAzMDlUNTQ2IDMyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMkI7IiBnbHlwaC1uYW1lPSJpbnRlZ3JhbCciIGhvcml6LWFkdi14PSIzOTYiIGQ9Ik0xNjQgNTk2UTE3MiA2NTQgMjAxIDY4NVEyMjggNzE0IDI3MSA3MjNUMzc1IDcyNFY2NDhRMzE0IDY1MyAyODggNjQwVDI1NSA1ODRMMTY4IC0zMlExNTkgLTk1IDEyOCAtMTI2UTEwNSAtMTQ5IDcwIC0xNTVULTE1IC0xNTVWLTgxUTIyIC04NCA0NSAtNzVUNzQgLTI1TDE2NCA1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjQ4OyIgZ2x5cGgtbmFtZT0iYXBwcm94ZXF1YWwiIGhvcml6LWFkdi14PSI1MzMiIGQ9Ik0zMTAgMTE0UTI4NSAxMTQgMjY5IDEyNlQyMzggMTU1UTIyNCAxNzAgMjE1IDE3N1QxOTUgMTg0UTE4MSAxODQgMTcyIDE3M1QxNTYgMTQyUTE0OSAxMjAgMTMyIDEyMFExMjQgMTIwIDExNSAxMjZRMTIzIDE3MSAxNDQgMTk4VDIwMSAyMjVRMjI2IDIyNSAyNDIgMjEzVDI3MyAxODRRMjg2IDE2OCAyOTUgMTYxVDMxNiAxNTRRMzMwIDE1NCAzMzkgMTY1VDM1NSAxOTZRMzU5IDIwNyAzNjQgMjEzVDM3OCAyMTlRMzg4IDIxOSAzOTUgMjEyUTM4NyAxNjcgMzY2IDE0MVQzMTAgMTE0Wk0zNTEgMjY3UTMyNiAyNjcgMzEwIDI3OVQyNzkgMzA4UTI2NSAzMjMgMjU2IDMzMFQyMzYgMzM3UTIyMiAzMzcgMjEzIDMyNlQxOTcgMjk1UTE5MCAyNzMgMTczIDI3M1ExNjUgMjczIDE1NiAyNzlRMTY0IDMyNCAxODUgMzUxVDI0MiAzNzhRMjY3IDM3OCAyODMgMzY2VDMxNCAzMzdRMzI3IDMyMSAzMzYgMzE0VDM1NyAzMDdRMzcxIDMwNyAzODAgMzE4VDM5NiAzNDlRNDAwIDM2MCA0MDUgMzY2VDQxOSAzNzJRNDI5IDM3MiA0MzYgMzY1UTQyOCAzMjAgNDA3IDI5NFQzNTEgMjY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2MDsiIGdseXBoLW5hbWU9Im5vdGVxdWFsIiBob3Jpei1hZHYteD0iNjM0IiBkPSJNMTYwIDM0OVExMzcgMzQ5IDEzNyAzNjFRMTM3IDM2NyAxNDAgMzc1VDE0NiAzODhRMTUyIDM5NCAxNjUgMzk0SDM4OUw0OTAgNTM3UTQ5MyA1NDAgNTAwIDUzOFE1MTUgNTM4IDUyMCA1MjZUNTExIDQ5NEw0NDAgMzk0SDUyOVE1NTIgMzk0IDU1MiAzODJRNTUyIDM3NiA1NTAgMzY4VDU0MyAzNTVRNTM3IDM0OSA1MjQgMzQ5SDQwNUwyODEgMTczSDQ4MlE1MDUgMTczIDUwNSAxNjFRNTA1IDE1NSA1MDIgMTQ3VDQ5NSAxMzRRNDkwIDEyOCA0NzYgMTI4SDI1MkwxNDcgLTI0UTE0NiAtMjYgMTQzIC0yNlQxMzcgLTI2UTEyMiAtMjUgMTE3IC0xM1QxMjYgMTlMMjAyIDEyOEgxMTNROTAgMTI4IDkwIDE0MFE5MCAxNDYgOTIgMTU0VDk5IDE2N1ExMDMgMTczIDExOCAxNzNIMjM3TDM2MiAzNDlIMTYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGdseXBoLW5hbWU9Imxlc3NlcXVhbCIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTQ4NyAzMDBRNTA2IDI4OSA1MTIgMjgwVDUxNiAyNjJRNTE0IDI1MSA1MDcgMjQ1VDQ5OCAyNDBMMTczIDM5M1ExNTMgNDA1IDE1NSA0MjNRMTU1IDQzNiAxNjEgNDQ2VDE4NiA0NjVMNTc3IDYwN1E1NzkgNjA4IDU4NSA2MDJUNTkzIDU4NFE1OTQgNTc2IDU4OCA1NjhUNTYxIDU0OUwyMDggNDI0TDQ4NyAzMDBaTTExMyAxMjhROTAgMTI4IDkwIDE0MFE5MCAxNDYgOTIgMTU0VDk5IDE2N1ExMDMgMTczIDExOCAxNzNINDgyUTUwNSAxNzMgNTA1IDE2MVE1MDUgMTU1IDUwMiAxNDdUNDk1IDEzNFE0OTAgMTI4IDQ3NiAxMjhIMTEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NTsiIGdseXBoLW5hbWU9ImdyZWF0ZXJlcXVhbCIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTIyMyA1NDhRMjAzIDU1NiAxOTggNTY3VDE5NCA1ODZRMTk2IDU5NyAyMDIgNjAzVDIxMiA2MDhMNTM3IDQ1NVE1NDggNDUxIDU1MSA0NDNUNTU1IDQyNVE1NTUgNDEzIDU0OSA0MDJUNTI0IDM4M0wxMzMgMjQxUTEzMSAyNDAgMTI1IDI0NlQxMTcgMjY0UTExNyAyNzIgMTIzIDI4MVQxNDkgMjk5TDUwMiA0MjRMMjIzIDU0OFpNMTEzIDEyOFE5MCAxMjggOTAgMTQwUTkwIDE0NiA5MiAxNTRUOTkgMTY3UTEwMyAxNzMgMTE4IDE3M0g0ODJRNTA1IDE3MyA1MDUgMTYxUTUwNSAxNTUgNTAyIDE0N1Q0OTUgMTM0UTQ5MCAxMjggNDc2IDEyOEgxMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyNUNBOyIgZ2x5cGgtbmFtZT0ibG96ZW5nZSIgaG9yaXotYWR2LXg9IjUyMCIgZD0iTTMwIDM4OEwyMjYgNzc2SDI5NEw0OTAgMzg4TDI5NCAwSDIyNkwzMCAzODhaTTM3MCAzODhMMjYwIDYxNkwxNTAgMzg4TDI2MCAxNTlMMzcwIDM4OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCMDE7IiBnbHlwaC1uYW1lPSJmaSIgaG9yaXotYWR2LXg9IjU0MSIgZD0iTTE3MCA0MzBINzNWNDMzUTczIDQzNCA3NSA0NDJMODAgNDY4UTgwIDQ3MCA4MCA0NzBUODEgNDcyVjQ3M0gxNzlMMTkyIDUzMVEyMDYgNjAwIDI0MSA2NDJUMzM5IDY4NVEzNjggNjg1IDM4NyA2NzhUNDE5IDY1OFE0MzEgNjQ2IDQzMSA2MzFRNDMxIDYxOCA0MjMgNjExVDQxMiA2MDZRNDAzIDYyMiAzODMgNjMyVDMzNiA2NDNRMjkzIDY0MyAyNzEgNjExVDIzNyA1MjRMMjI1IDQ3M0gzNTFRMzUwIDQ3MiAzNTAgNDcwUTM1MCA0NjggMzUwIDQ2NlQzNDkgNDYxTDM0MyA0MzZRMzQyIDQzNCAzNDIgNDMxVjQzMEgyMTdMMTI2IDBINzlMMTcwIDQzMFpNNDMzIC03UTM5NiAtNyAzNzkgMTdUMzcyIDk0TDQ1MyA0NzNINTAxTDQyMCA5NVE0MTIgNTQgNDI0IDQxVDQ2OCAyN1E0NjggMjcgNDY4IDIyVDQ2NSAxMFQ0NTUgLTFUNDMzIC03Wk01MTIgNjAxUTQ3NyA2MDEgNDc3IDYyN1E0NzcgNjQzIDQ4NiA2NTVUNTEzIDY2N1E1NDcgNjY3IDU0NyA2NDFRNTQ3IDYyNSA1MzggNjEzVDUxMiA2MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjAyOyIgZ2x5cGgtbmFtZT0iZmwiIGhvcml6LWFkdi14PSI1NDEiIGQ9Ik0xNzAgNDMwSDczVjQzM1E3MyA0MzQgNzUgNDQyTDgwIDQ2OFE4MCA0NzAgODAgNDcwVDgxIDQ3MlY0NzNIMTc5TDE5MiA1MzFRMjA2IDYwMCAyNDEgNjQyVDMzOSA2ODVRMzY4IDY4NSAzODcgNjc4VDQxOSA2NThRNDMxIDY0NiA0MzEgNjMxUTQzMSA2MTggNDIzIDYxMVQ0MTIgNjA2UTQwMyA2MjIgMzgzIDYzMlQzMzYgNjQzUTI5MyA2NDMgMjcxIDYxMVQyMzcgNTI0TDIyNSA0NzNIMzUxUTM1MCA0NzIgMzUwIDQ3MFEzNTAgNDY4IDM1MCA0NjZUMzQ5IDQ2MUwzNDMgNDM2UTM0MiA0MzQgMzQyIDQzMVY0MzBIMjE3TDEyNiAwSDc5TDE3MCA0MzBaTTQzMyAtN1EzOTYgLTcgMzc5IDE3VDM3MiA5NEw0OTYgNjc0SDU0NEw0MjAgOTVRNDEyIDU0IDQyNCA0MVQ0NjggMjdRNDY4IDI3IDQ2OCAyMlQ0NjUgMTBUNDU1IC0xVDQzMyAtN1oiICAvPgorCis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkZDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJBIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkMiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iRyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJPIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iVCIgaz0iMzkiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJVIiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iViIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJXIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iXCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJhIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iYyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJlIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0ibyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ2IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ5IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGM0OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNTsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGU3OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGFlOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hhOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjEyMjsiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzY7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gzYzA7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGU2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMwOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMzsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE1MjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTUzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMWQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMTk7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE3ODsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzI7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMxOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkMzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkYTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkYjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkOTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hkZDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJBIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJWIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlgiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iWSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9InYiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0ieSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjNDsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGM1OyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzY7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMDsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMzOyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4MTc4OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMyOyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzE7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGRkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDE3ZDsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyYzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSIuIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iLyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ij8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IkoiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJUIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iViIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJYIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJZIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWiIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImEiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImMiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImQiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Im0iIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Im4iIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Im8iIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InAiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InEiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InIiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InYiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ3IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGU3OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZTY7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDI2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDE1MzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDE4OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTc4OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWE7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxZTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxMzE7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZjA7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iLSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJBIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iQyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJHIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJPIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IlEiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iVCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IlYiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iYSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iYyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJkIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImUiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImoiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Im0iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJuIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJwIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0icSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJyIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0idSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InYiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ieSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM1OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ2OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hlNzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MjEyMjsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ4OyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hlNjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzA7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDU7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDE1MjsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MTUzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDEzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDE0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkMzsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDQ7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxMzE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IiYjeGRkOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJBIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iSiIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iVCIgaz0iOTIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iViIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJXIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlgiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzQ7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzU7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzY7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzA7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4YzM7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4MTc4OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMjsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMTsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IiYjeGRkOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iViIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJXIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlgiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iKCIgdTI9ImciIGs9Ii02IiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iaiIgaz0iLTQ1IiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4MTc4OyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iQSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzU7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM2OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzM7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMyOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIwIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iMSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI4IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJBIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iQyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJPIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iUSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlQiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJVIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJWIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iWSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im0iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im4iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InAiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InIiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InQiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ1IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ5IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNTsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGU3OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzY7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDg7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZTY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMzsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNTI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTUzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTc4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMyOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMxOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ0OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQyOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRhOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZGI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDEzMTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTdkOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IjEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSI3IiBrPSI5IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iQSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJUIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlYiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iVyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJYIiBrPSI5IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iWSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJaIiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iYSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJkIiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iZSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJxIiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0idiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IngiIGs9IjkiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGM0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjNTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4ZTc7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMwOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeDE3ODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMxOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iMCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSIxIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iNiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjgiIGs9IjUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iQSIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJDIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iTyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJRIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlQiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlkiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iYSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJkIiBrPSI2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iZSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im0iIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJuIiBrPSI2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InAiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iciIgaz0iNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InQiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InYiIGs9IjkiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ieSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGM0OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjNTsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGU3OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGM2OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkODsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZTY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzA7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMzOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTUyOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNTM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTc4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMjsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzE7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNDsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRhOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRiOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ5OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDEzMTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSIxIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJDIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkciIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iTyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJRIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJjIiBrPSIzIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJnIiBrPSIzIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZTc7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDg7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQ1OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQyOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyYzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iLiIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSI3IiBrPSI2IiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAyNjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iJiN4MjAxZTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iLSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IjQiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSImI3gyMDEzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTQ7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MmM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iLiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IjciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyMDI2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMWE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iJiN4MjAxZTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSI3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4YjA7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeDIxMjI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDJjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNSIgdTI9Ii4iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSI3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iJiN4MjAyNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDFhOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MmM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iLiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IjciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyMDI2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMWE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAxZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3gyYzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iLSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIuIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjAiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSIxIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjMiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iNCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI1IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3hhMjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjEyMjsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMjY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMTM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMTQ7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMWE7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMWU7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDJjOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9Ii4iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSI3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAyNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSImI3gyMDFhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDIwMWU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MmM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iLiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IjciIGs9IjE0IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAyNjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSImI3gyMDFhOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iOSIgdTI9IiYjeDIwMWU7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZGQ7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iMSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IjciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJUIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlYiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJXIiBrPSI2IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iWSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJjIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3gxNzg7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4ZGQ7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iMSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IjciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJUIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlYiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJXIiBrPSI2IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iWSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJjIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3gxNzg7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImZ3Q7IiB1Mj0iNyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hkZDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJBIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iVCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IlciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJZIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzQ7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzA7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4MTc4OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMyOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMxOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE2MDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iKiIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyYzsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iLSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSIuIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkAiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJBIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkMiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iRyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJKIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iTyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJRIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJUIiBrPSIxMzQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJWIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlciIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iWCIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJZIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImEiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJjIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iZCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJtIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ibiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Im8iIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJwIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0icSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InIiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ0IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieCIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieiIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzU7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hlNzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hhZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hhOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMTIyOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDg7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDNjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hlNjsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDI2OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ1OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNTI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE1MzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDEzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFjOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFkOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTk7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MTc4OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFhOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFlOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzE7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkNDsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDEzMTsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSImI3hkZDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJWIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlkiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSImI3gxNzg7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4MTdkOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IlQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJWIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iWiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImEiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iYyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJkIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImUiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ibyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJxIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InQiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ2IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InkiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZTc7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGU2OyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxNTM7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGRkOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxN2Q7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDJjOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSIuIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Ii8iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iPyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IkoiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iVCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJWIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlkiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWiIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJhIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImMiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJkIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iZSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im0iIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJuIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InAiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJxIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iciIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InciIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU3OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU2OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMjY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE1MzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFjOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMTg7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTc4OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFhOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFlOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxMzE7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MTYxOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IkAiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJUIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImEiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iYyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJkIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImUiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImciIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJtIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ibiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9Im8iIGs9IjExIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0icCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InEiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iciIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ0IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0idSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InYiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ5IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZTc7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGFlOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGE5OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDNjMDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hlNjsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MTUzOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3gxMzE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTYxOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkZDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJmFtcDsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MmM7IiBrPSIyNyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Ii0iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iLiIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSIvIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IjoiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSI7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iQCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkEiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iSiIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJUIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJYIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlkiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJkIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImUiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImciIGs9IjkiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im0iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibiIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJvIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InAiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0icSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJyIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InMiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InUiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idiIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ3IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ieCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ5IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InoiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzQ7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM1OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hlNzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YWU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YTk7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjEyMjsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gzYzA7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4ZTY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGFiOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGJiOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMjY7IiBrPSIyNyIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMwOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTUzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDEzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDE0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNzg7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMzk7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAzYTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDFhOyIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDFlOyIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzE7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDEzMTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MTQxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hkZDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hkZTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MmM7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9Ii4iIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iQSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJCIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IkMiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iRCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJFIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IkYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iRyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJIIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IkkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iSyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJMIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9Ik0iIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iTiIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJPIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlAiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iUSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJSIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJWIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iVyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iWSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9ImEiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iYyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJkIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9ImUiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0ibSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJuIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9Im8iIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0icCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJxIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InIiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InUiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGM0OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hjNTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4Yzk7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGQxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hkNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4ZTc7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIxMjI7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4YzY7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGQ4OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hlNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAyNjsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hkNTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MTUyOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gxNTM7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDE3ODsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMDFhOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMDFlOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4Y2E7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGMxOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hjYjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4Yzg7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGNkOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hjZTsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4Y2Y7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGNjOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3hkMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4ZDQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGQyOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gxMzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGQwOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSIvIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0idiIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSJ5IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iSSIgdTI9Ii8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSJ2IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iSSIgdTI9InkiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4MmM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iLiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IkEiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iSiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSiIgdTI9InYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0ieSIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNDsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzU7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGM2OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDI2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGMwOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMzsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4MjAxYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDFlOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGMyOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMTsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZjA7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTYwOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRkOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxN2Q7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJmFtcDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSItIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkAiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJDIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iRyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9Ik8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJRIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iUyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlQiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWSIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJaIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iYSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImMiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJkIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImYiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJnIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0ibyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InEiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0idiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InkiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hhZTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hhOTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkODsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gzYzA7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZTY7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTUyOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE1MzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDEzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDE0OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNzg7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ0OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQyOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRhOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRiOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ5OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRkOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJAIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkEiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJHIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Ik8iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iUSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJUIiBrPSIzOSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJWIiBrPSIyNyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlciIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iWSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJcIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJjIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iZCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJvIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0icSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InYiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InkiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzQ7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM1OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZGM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZTc7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YWU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGE5OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMTIyOyIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNjsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDNjMDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZTY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzA7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMzOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUyOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gxNTM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxZDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxOTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTc4OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMjsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzE7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQzOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRhOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRiOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ5OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iTSIgdTI9Ii8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ik0iIHUyPSJ2IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iTSIgdTI9InkiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0iLyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iTiIgdTI9InYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0ieSIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hkZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTdkOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyYzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iLiIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSIvIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Ij8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJKIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iViIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJXIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJZIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IloiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJjIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iZCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJtIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im8iIGs9IjIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJwIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0icSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InIiIGs9IjIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ1IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ3IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hlNzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hlNjsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDI2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxNTM7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxYzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDE4OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxZTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTMxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGRkOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImYW1wOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDJjOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSIuIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkEiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iQyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJHIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkoiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iTyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJRIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlYiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iVyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlgiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IloiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InQiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idiIgaz0iLTE3IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ4IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InkiIGs9Ii0xNyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM0OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNTsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZDY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM2OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hkODsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZTY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MjAyNjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzA7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMzOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hkNTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MTUyOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MTc4OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWE7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWU7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMyOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMTsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZDM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGQ0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hkMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZGQ7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ZDsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MmM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ii4iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iLyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ij8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJKIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iViIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJXIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJZIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IloiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJjIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iZCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJtIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im8iIGs9IjIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJwIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0icSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InIiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ1IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ3IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hlNzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hlNjsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gyMDI2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxNTM7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gyMDE4OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxZTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTMxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGRkOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImYW1wOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJBIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJUIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iViIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJYIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlkiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0idiIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJ3IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9InkiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzQ7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGM1OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjNjsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzA7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGMzOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3gxNzg7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGMyOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjMTsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4ZGQ7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iQSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iViIgaz0iMyIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJYIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iUyIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzQ7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNTsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM2OyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzA7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMzsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeDE3ODsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMjsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMxOyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTYxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkZDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTdkOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiZhbXA7IiBrPSI1MiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDJjOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSItIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Ii4iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iOiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkAiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJBIiBrPSI2NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJHIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iSiIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJPIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iUSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlQiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iViIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJXIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlgiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iWSIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJaIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iXCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJhIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImMiIGs9IjI5IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZCIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJlIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJnIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im0iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJvIiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InAiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icSIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJyIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InMiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InUiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idiIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ3IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IngiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ieSIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ6IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM0OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTc7IiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGFlOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGE5OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIxMjI7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDg7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4M2MwOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGU2OyIgaz0iMjkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hiZjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YWI7IiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGJiOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDI2OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ1OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE1MjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxNTM7IiBrPSIyOSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTM7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTQ7IiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE3ODsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAzOTsiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAzYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxYTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxZTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMxOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkMzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkMjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxMzE7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDJjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVSIgdTI9Ii4iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSJBIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IkoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSJ2IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iVSIgdTI9InkiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzQ7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGM1OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjNjsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAyNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjMDsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzM7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDIwMWE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAxZTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjMjsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzE7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE2MDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTYxOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkZDsiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE3ZDsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJmFtcDsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iKSIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyYzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iLSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSIuIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IjoiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iQSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IkoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iUyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJUIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlYiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iVyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlgiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iWSIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iWiIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJdIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImEiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iYyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImQiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJlIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImciIGs9IjExIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im4iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJvIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9InEiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJyIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9InYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ieSIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ9IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM0OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM1OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGU3OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIxMjI7IiBrPSItMTgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjNjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hlNjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YmI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAyNjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzA7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTUzOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTM7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTQ7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE3ODsiIGs9Ii0xMSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMzk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwM2E7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAxYTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAxZTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzI7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzE7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTMxOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDE2MDsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTYxOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkZDsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTdkOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImYW1wOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IikiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MmM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iLSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIuIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iOiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJAIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJHIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iSiIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJPIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iUSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlMiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iVCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJWIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iVyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJZIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IloiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iXSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJhIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImMiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJkIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJnIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJpIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im4iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJvIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InEiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJyIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ0IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IngiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ5IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InoiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ9IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM0OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM1OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGU3OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGFlOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGE5OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIxMjI7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkODsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gzYzA7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZTY7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YWI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGJiOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMjY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzA7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTUyOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDE1MzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDEzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDE0OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNzg7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMzk7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwM2E7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAxYTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDFlOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMyOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMxOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ0OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQyOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDEzMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNjA7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGRkOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImYW1wOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IikiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ii0iIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJBIiBrPSItMTciIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJDIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iRyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ik8iIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJRIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iUyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJUIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlgiIGs9Ii0xNCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlkiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iXSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iYSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJkIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJtIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJwIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InYiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ifSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzQ7IiBrPSItMTciIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjNTsiIGs9Ii0xNyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIxMjI7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjNjsiIGs9Ii0xNyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ4OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMwOyIgaz0iLTE3IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzM7IiBrPSItMTciIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNTI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MjAxNDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNzg7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMyOyIgaz0iLTE3IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzE7IiBrPSItMTciIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxMzE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTYwOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNjE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGRkOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImYW1wOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IikiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDJjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSItIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iOiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJAIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iQSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkMiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iRyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJKIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ik8iIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iUSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJTIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlQiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iViIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iVyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJYIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IlkiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iXSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iYSIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJjIiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImQiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZSIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJmIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJtIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im4iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJwIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InEiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iciIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJzIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ1IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InYiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ieCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InkiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ6IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ifSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzQ7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDY7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGU3OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhZTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhOTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMTIyOyIgaz0iLTE4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDg7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDNjMDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hlNjsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YWI7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGJiOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDI2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNTsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTUyOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNTM7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMTM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMTQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE3ODsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzOTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxYTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxZTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDM7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ0OyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMjsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTMxOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hmMDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSItIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJDIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkciIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iSiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Ik8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iUSIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJUIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iViIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJhIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJjIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImQiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJmIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImgiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJpIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iaiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im4iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJvIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InAiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJxIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InIiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ1IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ5IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzQ7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzU7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDY7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGU3OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gyMTIyOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDg7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGU2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNTsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTUyOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxNTM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDIwMTQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMyOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMxOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQzOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNDsiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDEzMTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSImI3hkZDsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlYiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iVyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJYIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJZIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSJnIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iWyIgdTI9ImoiIGs9Ii00NSIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IiYjeDE3ODsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGRkOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJUIiBrPSIyNyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlYiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iVyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJZIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJjIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJqIiBrPSItMzkiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3gxNzg7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9Ij8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYSIgdTI9InYiIGs9IjIiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ5IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0ieiIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSImI3gyMTIyOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMWM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iJiN4MjAxODsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gxNjE7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDJjOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ii4iIGs9IjYiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSIvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iOiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSI/IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InMiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InYiIGs9IjIiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ3IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InkiIGs9IjIiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ6IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjEyMjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSImI3gyMDI2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMTg7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxZTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9ImQiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iZCIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0idiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iZSIgdTI9IngiIGs9IjUiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ5IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZjA7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJmFtcDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIpIiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIqIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDJjOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSItIiBrPSI5IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSIvIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IjoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iPyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iQCIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJcIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJdIiBrPSItMjEiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im4iIGs9IjIiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0icCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJyIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0idSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InYiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InciIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ieSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ifSIgaz0iLTIxIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZTc7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YWU7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGE5OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMTIyOyIgaz0iLTI3IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4M2MwOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hhYjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YmI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAyNjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxNDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFjOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFkOyIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxODsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxOTsiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMzk7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwM2E7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxYTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxZTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTMxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IikiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iLyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSJdIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iZyIgdTI9ImciIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iaiIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0idCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSJ9IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMWM7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMWQ7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3gyMDE4OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3gyMDE5OyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iPyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0idiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InkiIGs9IjIiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ6IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIxMjI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iJiN4MjAxYzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSImI3gyMDE4OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iaSIgdTI9InYiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJpIiB1Mj0idyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9ImkiIHUyPSJ5IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iaiIgdTI9ImoiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJqIiB1Mj0idiIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9ImoiIHUyPSJ5IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJjIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJnIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iayIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ2IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iayIgdTI9IngiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0ieSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJsIiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9ImwiIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0ibSIgdTI9Ij8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InYiIGs9IjIiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSJ5IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0ieiIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ibSIgdTI9IiYjeDIwMWM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iJiN4MjAxODsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSI/IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ2IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0ieSIgaz0iMiIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InoiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iJiN4MjEyMjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSImI3gyMDFjOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMTg7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MTYxOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSImI3gyYzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSIuIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iLyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IjoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iPyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJzIiBrPSItMiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ2IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IngiIGs9IjIiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ5IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0ieiIgaz0iNSIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIxMjI7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MjAyNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSImI3gyMDFjOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSImI3gyMDE4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSImI3gyMDFhOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iJiN4MTYxOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyYzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSIuIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iLyIgaz0iMyIgLz4KKzxoa2VybiB1MT0icCIgdTI9IjoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iPyIgaz0iNiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IlwiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJzIiBrPSItMiIgLz4KKzxoa2VybiB1MT0icCIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ2IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0idyIgaz0iNiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IngiIGs9IjIiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ5IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieiIgaz0iNSIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIxMjI7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iJiN4MjAyNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFjOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDE4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFhOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJxIiB1Mj0iaiIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSI/IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iciIgdTI9ImYiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iZyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iciIgdTI9InQiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0idiIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0idyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ4IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iciIgdTI9InkiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iciIgdTI9InoiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDI2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDEzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTQ7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxYzsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZDsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTg7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTk7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFhOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFlOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9InMiIHUyPSJ2IiBrPSItMiIgLz4KKzxoa2VybiB1MT0icyIgdTI9InkiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MmM7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9Ii4iIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iYSIgaz0iMiIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImMiIGs9IjIiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJkIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iZSIgaz0iMiIgLz4KKzxoa2VybiB1MT0idCIgdTI9Im8iIGs9IjIiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJxIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0idiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJ3IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9IngiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0ieSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJ6IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeGU3OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeGU2OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMjY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDE1MzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFjOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDE4OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFhOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFlOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InUiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idSIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MTYxOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iLSIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iYSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJjIiBrPSItMiIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImQiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iZSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJvIiBrPSItMiIgLz4KKzxoa2VybiB1MT0idiIgdTI9InEiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0icyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ0IiBrPSItMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9InYiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0idiIgdTI9InciIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0ieSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0ieiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3hlNzsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4ZTY7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMjY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDE1MzsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxMzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDE0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWM7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWQ7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTg7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTk7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDJjOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0idyIgdTI9Ii4iIGs9IjkiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJ2IiBrPSItNiIgLz4KKzxoa2VybiB1MT0idyIgdTI9InkiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAyNjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDFjOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDFkOyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDE4OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDE5OyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDFhOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWU7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iLSIgaz0iOSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJjIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iZCIgaz0iNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImUiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJvIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0icSIgaz0iNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9InYiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0ieCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJ5IiBrPSItOSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9InoiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4YWI7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDEzOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTQ7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxYzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxZDsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxODsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxOTsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAzOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MTYxOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyYzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iLSIgaz0iMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iYSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJjIiBrPSItMiIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImQiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iZSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJvIiBrPSItMiIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InEiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0icyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJ0IiBrPSItMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InYiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InciIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0ieSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0ieiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hlNzsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4ZTY7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMjY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDE1MzsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxMzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE0OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWM7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWQ7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTg7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTk7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWU7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0ieiIgdTI9Ii0iIGs9IjkiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJhIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iYyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJlIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iZyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ieiIgdTI9Im0iIGs9IjUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJuIiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0ibyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InAiIGs9IjUiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iciIgaz0iNSIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InQiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0idSIgaz0iNSIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InYiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0ieSIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hlNzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hlNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hhYjsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MTUzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTM7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MjAxNDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDM5OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iJiN4ZGQ7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJWIiBrPSItOSIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IlciIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iWCIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iWSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iZyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJqIiBrPSItNDUiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSImI3gxNzg7IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGIwOyIgdTI9IjQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhMzsiIHUyPSIxIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YTM7IiB1Mj0iNCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MTYxOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDJjOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iLiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iLyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iOiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iPyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iXCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iZyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0icyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InYiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IngiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InkiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InoiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIxMjI7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDI2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxYzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDE4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMWE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDFlOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4ZGQ7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJBIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJUIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJXIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJZIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGM1OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4MTc4OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGRkOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iQSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iVCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iWSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzQ7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGM2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzA7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeDE3ODsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGMyOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gxNjE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJAIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJUIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iYSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImMiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJkIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iZSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImciIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9Im0iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9Im4iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9Im8iIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJwIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJxIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iciIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0icyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0idCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0idSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0idiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0ieSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZTc7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4YWU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hhOTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDNjMDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGU2OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MzsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gxMzE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hkZDsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxN2Q7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MmM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iLiIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Ii8iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSI/IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJKIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iVCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlYiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJXIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iWCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iWSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IloiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJhIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJiIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJjIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJkIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJlIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJoIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJrIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJsIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJtIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJuIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJvIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJwIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJxIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJyIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ1IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ2IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0idyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9InkiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJ6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hlNzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGU2OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAyNjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxNTM7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFjOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxODsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE3ODsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFhOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWU7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTMxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGRkOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IkEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJUIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjNDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjNTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3gxNzg7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ2IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ4IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ5IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gxNjE7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MmM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSIuIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSIvIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSI6IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSI/IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJcIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJzIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0idiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0idyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0ieiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjEyMjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMjY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDFjOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMTg7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxYTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkZDsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSIxIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IjciIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IkMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IkciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9Ik8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlQiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJWIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iVyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iWSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InYiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDg7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeDE1MjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeDE3ODsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkMzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ0OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZDI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxOTI7IiB1Mj0iMSIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IiYjeGRkOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlQiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJWIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJXIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJZIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iJiN4MTc4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IiYjeGRkOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlQiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJWIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iVyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlkiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0ieiIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IiYjeDE3ODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRkOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iMCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iMSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iNCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iNiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI4IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IjkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iQSIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iQyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iRyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iTyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iUSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iVSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJWIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJXIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IlkiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9ImEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iYyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJkIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9ImUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ibSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJuIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9Im8iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0icCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InIiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0idSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJ2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ieSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGM1OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZTc7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGM2OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDg7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hlNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzA7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMzsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ1OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTUyOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTUzOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNzg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMjsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGMxOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkNDsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQyOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGE7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRiOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkOTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4MTMxOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeDE2MTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJAIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iVCIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJhIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImMiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZCIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJlIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJnIiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0ibSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9Im4iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJvIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InAiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJxIiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InIiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJzIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0idCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJ2IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0ieSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGU3OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhZTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hhOTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gzYzA7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZTY7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeDE1MzsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4MTMxOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InYiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ4IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTM7IiB1Mj0ieSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeDE3ZDsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iMSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSI3IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IkEiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlQiIGs9IjIxIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlYiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlgiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iWSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iWiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJhIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iZCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJlIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0icSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ2IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IngiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0ieSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ6IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzU7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hlNzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hlNjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzA7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeDE1MzsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTc4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGRkOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTdkOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSIxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IjciIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iQSIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iVCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iViIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iVyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iWCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJZIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJaIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iYyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJkIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ibyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJxIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ieCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9InoiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzQ7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNTsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGU2OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjMDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMzOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3gxNzg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjMjsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMxOyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTYxOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hkZDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IkEiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IkoiIGs9IjMzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlQiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlYiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlciIGs9Ii02IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlgiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlkiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImEiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJkIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9ImUiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJuIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9Im8iIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJxIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InIiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJ1IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGM0OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzU7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzA7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDE1MzsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTc4OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDEzMTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTYwOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJDIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJHIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJKIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJPIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJRIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJTIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImMiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9ImUiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9Im8iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9InEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZTc7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkODsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGU2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDU7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3gxNTI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3gxNTM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkMzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ0OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNjE7IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGRkOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iQSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iSiIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iViIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVyIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iWCIgaz0iLTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iWSIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iYSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJjIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImQiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iZSIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJnIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJtIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9Im4iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJwIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InEiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iciIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJzIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzQ7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU3OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU2OyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMDsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTUzOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNzg7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMxOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTMxOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3gxNjA7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkMiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkoiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9Ik8iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlEiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0ibyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0icSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hlNzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZTY7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MzsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDQ7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkMjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYwOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNjE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGRkOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImYW1wOyIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IikiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDJjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSItIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ii4iIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iOiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IjsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJAIiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iQSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkMiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iRyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJKIiBrPSIyMSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ik8iIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iUSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJTIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlQiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iViIgaz0iLTExIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iVyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJYIiBrPSItNiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IlkiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iXSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iYSIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJjIiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImQiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZSIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJmIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJtIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Im4iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ibyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJwIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InEiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iciIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJzIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ1IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InYiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InkiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ6IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ifSIgaz0iLTE1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzQ7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzU7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDY7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGU3OyIgaz0iMTciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhZTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhOTsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyMTIyOyIgaz0iLTE4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDg7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDNjMDsiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hlNjsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YWI7IiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGJiOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyMDI2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkNTsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTUyOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxNTM7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMTM7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMTQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDE3ODsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzOTsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxYTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxZTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzI7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDM7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ0OyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkMjsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTMxOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iJiN4ZGQ7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAzOTsiIHUyPSJUIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAzOTsiIHUyPSJWIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iWSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMzk7IiB1Mj0iJiN4MTc4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iJiN4ZGQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJUIiBrPSIzMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJWIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJXIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJZIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJ4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSJ6IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAzYTsiIHUyPSImI3gxNzg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IjAiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IjEiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IjQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IjYiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iOCIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IkEiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IkMiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IkciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Ik8iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlEiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlQiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iViIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJZIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJhIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImMiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iZCIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJlIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImoiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9Im0iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0ibiIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJvIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InAiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0icSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJyIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InQiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InUiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0idiIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InkiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzQ7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjNTsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGU3OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjNjsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZTY7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMwOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzM7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDE1MzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4MTc4OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzI7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hjMTsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQzOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDQ7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkMjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRhOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkYjsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDk7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeDEzMTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGQ7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSIwIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSIxIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSI0IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSI2IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IjgiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iOSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJBIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJDIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJHIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJPIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJRIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJUIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJVIiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlYiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlciIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iWSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iYSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJjIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImQiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iZSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJqIiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJtIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9Im4iIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0ibyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJwIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InEiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iciIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ0IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ1IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InYiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ5IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM0OyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzU7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRjOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hlNzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzY7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkODsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGU2OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hjMDsiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMzOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDU7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNTI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxNTM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeDE3ODsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMyOyIgaz0iLTkiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzE7IiBrPSItOSIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkMzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ0OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkYTsiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGI7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ5OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3gxMzE7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hhNDsiIHUyPSI0IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hkZDsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3gxN2Q7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSIxIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSI3IiBrPSI5IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJBIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iVCIgaz0iMjEiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlYiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJXIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWCIgaz0iOSIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWSIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IloiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImMiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImUiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9Im8iIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InEiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IngiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InkiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InoiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGM0OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGM1OyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGU3OyIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzY7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4ZTY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMDsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMzsiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3gxNTM7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3gxNzg7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzI7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzE7IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZGQ7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTdkOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDJjOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ii4iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSIvIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iPyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iSiIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlQiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJWIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iVyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlkiIGs9IjExIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJaIiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iYSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iYiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iYyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iZCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iZSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iaCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iayIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibCIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0icCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0icSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iciIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0idSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0idiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9InciIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ4IiBrPSIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ5IiBrPSItMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieiIgaz0iMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZTc7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hlNjsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMjY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTUzOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxYzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMTg7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gxNzg7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFlOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDEzMTsiIGs9IjIiIC8+CisKKzwvZm9udD4KKzwvZGVmcz4KKzx0ZXh0IHg9IjQwIiB5PSI0MCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgTGlnaHQgSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQcOBw4DDgsOEw4XDg8OGIEPDhyBEw5AgRcOJw4jDisOLIEkgw40gw4wgw44gw48gTsORPC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjgwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBMaWdodCBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID5Pw5PDksOUw5bDlcOYxZIgU8WgIFXDmsOZw5vDnCBZw53FuCBaxb0gw54gYcOhw6DDosOkw6XDo8OmIGPDpyBkw7AgZcOpw6jDqsOrIGkgxLEgw60gw6wgw64gw68gbsOxIG/Ds8Oyw7TDtsO1w7jFkyBzxaHDnyB1w7rDucO7w7wgecO9w78gesW+PC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjEyMCIgZm9udC1mYW1pbHk9Ik9tbmVzX0FUVCBXMDIgTGlnaHQgSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+w74gMTIzNDU2Nzg5MCDCvSDCvCDCviAlIOKAsCAkwqLCo8KlxpLigqzCpCDigKAg4oChIMKnIMK2ICMgXn7CtSArw5fCsSAmbHQ7ID0gJmd0OyDDt8KsICHCoT/CvyAmcXVvdDsgJmFtcDsgJmFwb3M7ICogwrAgLiAsIDogOyAoKSBbIFwgXSB7fSAvIHw8L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTYwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBMaWdodCBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7CpiBfIOKAmiDigJ4g4oCmIOKAueKAuiDCq8K7IOKAmCDigJkg4oCcIOKAnSDigKIgwq0gLSDigJMg4oCUIEAgwqkgwq4g4oSiIMKqwrogwrnCssKzIMK0IGAgy4Ygy5wgwqggwq8gwrcgwrg8L3RleHQ+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodEl0YWxpYy50dGYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHRJdGFsaWMudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNTNjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTGlnaHRJdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodEl0YWxpYy53b2ZmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMkxpZ2h0SXRhbGljLndvZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5OTkzYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJMaWdodEl0YWxpYy53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW0uZW90IGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bS5lb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjNzE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW0uZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW0uc3ZnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3MmQwYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW0uc3ZnCkBAIC0wLDAgKzEsMjQ3MyBAQAorPD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCIgPgorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciID4KKzxtZXRhZGF0YT4KKzx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKzxpZD48IVtDREFUQVtPbW5lc19BVFQgVzAyIE1lZGl1bV1dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0dlbmVyYXRlZCBpbiAyMDEwIGJ5IEZvbnRMYWIgU3R1ZGlvLiBDb3B5cmlnaHQgaW5mbyBwZW5kaW5nLl1dPjwvY29weXJpZ2h0PgorPHRyYWRlbWFyaz48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjU2NSIgaWQ9Ik9tbmVzX0FUVFcwMk1lZGl1bSI+Cis8Zm9udC1mYWNlIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIE1lZGl1bSIgcGFub3NlLTE9IjAgMCAwIDAgMCAwIDAgMCAwIDAiIGFzY2VudD0iNzAwIiBkZXNjZW50PSItMzAwIiB1bml0cy1wZXItZW09IjEwMDAiIGFscGhhYmV0aWM9IjAiPgorPC9mb250LWZhY2U+Cis8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iMTcwIiAvPgorCis8Z2x5cGggdW5pY29kZT0iJiN4QTsiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDsiIC8+Cis8Z2x5cGggdW5pY29kZT0iICIgZ2x5cGgtbmFtZT0ic3BhY2UiIGhvcml6LWFkdi14PSIxNzAiIC8+Cis8Z2x5cGggdW5pY29kZT0iISIgZ2x5cGgtbmFtZT0iZXhjbGFtIiBob3Jpei1hZHYteD0iMjkwIiBkPSJNMTM5IDE4OFExMjggMTg4IDEyMyAxOTZUMTE1IDIyMkw4MSA2NDdIMjEwTDE3NSAyMjJRMTczIDIwNSAxNjggMTk3VDE1MCAxODhIMTM5Wk0xMzggLTdRODQgLTcgODQgNDdWNTlRODQgMTE0IDEzOCAxMTRIMTUxUTIwNiAxMTQgMjA2IDU5VjQ3UTIwNiAtNyAxNTEgLTdIMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJnF1b3Q7IiBnbHlwaC1uYW1lPSJxdW90ZWRibCIgaG9yaXotYWR2LXg9IjQxOSIgZD0iTTExOSAzNzVRMTA3IDM3NSAxMDIgMzgyVDk1IDQwNkw2MyA2NDdIMTg3TDE1NiA0MDZRMTU0IDM5MCAxNDkgMzgzVDEzMiAzNzVIMTE5Wk0yODcgMzc1UTI3NSAzNzUgMjcwIDM4MlQyNjMgNDA2TDIzMSA2NDdIMzU1TDMyNCA0MDZRMzIyIDM5MCAzMTcgMzgzVDMwMCAzNzVIMjg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgZ2x5cGgtbmFtZT0ibnVtYmVyc2lnbiIgaG9yaXotYWR2LXg9IjY5MyIgZD0iTTM0IDI0MkgxNjhMMjE4IDQwNUgxMDlWNDg0SDI0MkwyOTMgNjUwUTI5MyA2NTQgMzA2IDY1NFEzMTMgNjU0IDMyMSA2NTFUMzM3IDY0MlQzNDkgNjI2VDM1NCA2MDFRMzU0IDU4OSAzNDYgNTYzTDMyMSA0ODRINDcwTDUyMSA2NTBRNTIzIDY1NCA1MzUgNjU0UTU0OSA2NTQgNTY1IDY0MlQ1ODIgNjAxUTU4MiA1ODkgNTc0IDU2M0w1NTAgNDg0SDY1OVY0MDVINTI1TDQ3NSAyNDJINTg0VjE2M0g0NTFMNDAxIC0zUTM5OSAtNyAzODcgLTdRMzczIC03IDM1NyA1VDM0MCA0NlEzNDAgNTMgMzQyIDYzVDM0NyA4NEwzNzEgMTYzSDIyM0wxNzIgLTNRMTcyIC03IDE1OSAtN1ExNTIgLTcgMTQ0IC00VDEyOCA1VDExNiAyMVQxMTEgNDZRMTExIDYwIDExOSA4NEwxNDMgMTYzSDM0VjI0MlpNMjQ1IDI0MEgzOTdMNDQ4IDQwN0gyOTZMMjQ1IDI0MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiQiIGdseXBoLW5hbWU9ImRvbGxhciIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTI0NSAtNlExOTkgLTEgMTYzIDEyVDEwMiA0M1Q2NCA4MVQ1MCAxMjBRNTAgMTMzIDU2IDE0M1Q3MSAxNjFUODcgMTcxVDk1IDE3M1ExMTggMTM5IDE1NyAxMTRUMjQ5IDgwVjI5MVEyMTYgMjk5IDE4MyAzMTFUMTI0IDM0NFQ4MiAzOTVUNjYgNDcxUTY2IDUwNiA3OSA1MzZUMTE2IDU4OVQxNzMgNjI5VDI0NyA2NTFWNzQ3SDMzNFY2NTNRMzc3IDY0OSA0MTAgNjM3VDQ2NyA2MTBUNTAyIDU3NlQ1MTQgNTQxUTUxNCA1MjcgNTA3IDUxN1Q0OTIgNDk5VDQ3NiA0ODlUNDY4IDQ4NlE0NDYgNTE3IDQxMCA1MzlUMzI5IDU2OFYzNjVRMzY0IDM1NiAzOTkgMzQ0VDQ2MyAzMTBUNTA5IDI1OFQ1MjcgMTgwUTUyNyAxMDUgNDc0IDU1VDMzMiAtNVYtMTAzSDI0NVYtNlpNNDI2IDE3NlE0MjYgMjE3IDM5OCAyMzdUMzI2IDI3MlY3OVEzNzIgODcgMzk5IDExM1Q0MjYgMTc2Wk0xNjQgNDczUTE2NCA0MzUgMTg3IDQxNlQyNTIgMzg0VjU2NlEyMTIgNTU3IDE4OCA1MzJUMTY0IDQ3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiUiIGdseXBoLW5hbWU9InBlcmNlbnQiIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0xOTkgMzQ0UTE2NiAzNDQgMTM4IDM1NVQ4OCAzODdUNTYgNDM1VDQ0IDQ5NVY1MDRRNDQgNTM2IDU2IDU2NFQ4OSA2MTJUMTM4IDY0NVQyMDAgNjU3UTIzNCA2NTcgMjYyIDY0NlQzMTIgNjE0VDM0NCA1NjZUMzU2IDUwNlY0OTdRMzU2IDQ2NSAzNDQgNDM3VDMxMSAzODlUMjYxIDM1NlQxOTkgMzQ0Wk0xMzcgLTlRMTM1IC0xMSAxMjggLTEwVDExMyAtM1Q5OCA5VDkxIDI4UTkxIDQyIDk3IDUzVDEyMCA4MUw2MjMgNjYwUTYyNCA2NjEgNjMxIDY2MFQ2NDcgNjU1VDY2MiA2NDJUNjY5IDYyM1E2NjkgNjEyIDY2MyA1OTlUNjQxIDU2OUwxMzcgLTlaTTU2NSAtNlE1MzEgLTYgNTAzIDVUNDUzIDM3VDQyMSA4NVQ0MDkgMTQ1VjE1NFE0MDkgMTg2IDQyMSAyMTRUNDU0IDI2MlQ1MDQgMjk1VDU2NiAzMDdRNTk5IDMwNyA2MjcgMjk2VDY3NyAyNjRUNzA5IDIxNlQ3MjEgMTU2VjE0N1E3MjEgMTE1IDcwOSA4N1Q2NzYgMzlUNjI3IDZUNTY1IC02Wk0yMDAgNDA3UTIzNSA0MDcgMjU3IDQzMVQyNzkgNDkzVjUwOFEyNzkgNTQ2IDI1NyA1NzBUMTk5IDU5NVExNjQgNTk1IDE0MiA1NzFUMTIwIDUwOFY0OTNRMTIwIDQ1NSAxNDIgNDMxVDIwMCA0MDdaTTU2NiA1N1E2MDAgNTcgNjIyIDgxVDY0NSAxNDNWMTU4UTY0NSAxOTYgNjIzIDIyMFQ1NjUgMjQ1UTUzMCAyNDUgNTA4IDIyMVQ0ODYgMTU4VjE0M1E0ODYgMTA1IDUwOCA4MVQ1NjYgNTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImYW1wOyIgZ2x5cGgtbmFtZT0iYW1wZXJzYW5kIiBob3Jpei1hZHYteD0iNjk3IiBkPSJNMjcwIC0xM1EyMTcgLTEzIDE3NCAwVDEwMSAzN1Q1MyA5OFQzNiAxODJRMzYgMjU0IDc5IDI5OVQxOTggMzY4UTE3NCAzOTQgMTU4IDQyNlQxNDEgNDk5UTE0MSA1MzMgMTU0IDU2MlQxOTEgNjEzVDI0OCA2NDdUMzIyIDY2MFEzNTkgNjYwIDM4OSA2NDlUNDQyIDYxN1Q0NzcgNTY5VDQ5MCA1MDhRNDkwIDQ1MSA0NTEgNDEyVDMzOSAzNTBMNDkxIDIxNFE1MDEgMjMwIDUxMiAyNTJUNTM1IDMwMFQ1NTUgMzUxVDU3MSA0MDFINjU3UTY1MiAzNzIgNjQxIDM0MFQ2MTUgMjc0VDU4MyAyMTFUNTUxIDE1OUw2ODcgMzdRNjg4IDM2IDY4NiAzMFQ2NzggMTZUNjYwIDJUNjMyIC01UTYxOSAtNSA2MDMgMFQ1NjcgMjVMNDk4IDkxUTQ1MyA0MSAzOTYgMTRUMjcwIC0xM1pNMjc3IDY1UTMyNiA2NSAzNjcgODdUNDQwIDE0NUwyNDYgMzIwUTE5NSAzMDMgMTY0IDI3M1QxMzIgMTkwUTEzMiAxMzAgMTcyIDk4VDI3NyA2NVpNMjM0IDQ5OVEyMzQgNDY3IDI0NyA0NDNUMjg2IDM5NFEzNDggNDExIDM3NiA0MzdUNDA1IDUwM1E0MDUgNTM4IDM4MiA1NjJUMzIxIDU4NlEyNzggNTg2IDI1NiA1NjFUMjM0IDQ5OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhcG9zOyIgZ2x5cGgtbmFtZT0icXVvdGVzaW5nbGUiIGhvcml6LWFkdi14PSIyNTIiIGQ9Ik0xMTkgMzc1UTEwNyAzNzUgMTAyIDM4MlQ5NSA0MDZMNjMgNjQ3SDE4N0wxNTYgNDA2UTE1NCAzOTAgMTQ5IDM4M1QxMzIgMzc1SDExOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IigiIGdseXBoLW5hbWU9InBhcmVubGVmdCIgaG9yaXotYWR2LXg9IjQwNSIgZD0iTTMzOSAtMTk4UTI5MiAtMTk4IDI0MyAtMTY4VDE1MiAtODJUODUgNTJUNTggMjI3UTU4IDMyMCA4NCAzOThUMTUyIDUzM1QyNDIgNjIwVDMzOSA2NTJRMzg1IDY1MiAzODUgNjEyUTM4NSA2MDAgMzc5IDU5MFQzNzAgNTc3UTMyMCA1NjYgMjgxIDUzNFQyMTQgNDU1VDE3MyAzNTBUMTU5IDIyOFExNTkgMTYyIDE3MyAxMDRUMjE0IC0yVDI4MCAtODBUMzcwIC0xMjRRMzcyIC0xMjUgMzc4IC0xMzVUMzg1IC0xNThRMzg1IC0xOTggMzM5IC0xOThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIpIiBnbHlwaC1uYW1lPSJwYXJlbnJpZ2h0IiBob3Jpei1hZHYteD0iNDA1IiBkPSJNNjYgLTE5OFEyMCAtMTk4IDIwIC0xNThRMjAgLTE0NiAyNiAtMTM2VDM1IC0xMjRRODUgLTExMiAxMjQgLTgxVDE5MSAtMlQyMzIgMTAzVDI0NiAyMjhRMjQ2IDI5MSAyMzIgMzQ5VDE5MSA0NTRUMTI1IDUzM1QzNSA1NzdRMzMgNTc5IDI3IDU4OVQyMCA2MTJRMjAgNjUyIDY2IDY1MlExMTIgNjUyIDE2MiA2MjFUMjUzIDUzM1QzMjAgMzk5VDM0NyAyMjdRMzQ3IDEzMSAzMjEgNTNUMjUzIC04MVQxNjIgLTE2N1Q2NiAtMTk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKiIgZ2x5cGgtbmFtZT0iYXN0ZXJpc2siIGhvcml6LWFkdi14PSI0MjIiIGQ9Ik0xMDIgMzMxUTkxIDMzNyA4OSAzNDZUOTYgMzczTDE0OCA0NThMNTggNDk2UTQxIDUwNCAzOCA1MTFUMzggNTMzTDM5IDUzN1E0MyA1NDkgNTEgNTUzVDc3IDU1NUwxNzQgNTMxTDE4MiA2MjhRMTg0IDY0OCAxOTEgNjUzVDIxMSA2NTlIMjE1UTIyNyA2NTkgMjM0IDY1NFQyNDQgNjI4TDI1MCA1MzFMMzQ3IDU1NVEzNjUgNTU4IDM3MyA1NTNUMzg2IDUzN0wzODcgNTMzUTM5MSA1MTkgMzg4IDUxMlQzNjcgNDk2TDI3NSA0NThMMzI4IDM3M1EzMzggMzU2IDMzNSAzNDdUMzIyIDMzMUwzMTkgMzI5UTMxMCAzMjIgMzAxIDMyMlQyNzggMzM3TDIxMiA0MTRMMTQ3IDMzN1ExMzMgMzIzIDEyNSAzMjNUMTA1IDMyOUwxMDIgMzMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iKyIgZ2x5cGgtbmFtZT0icGx1cyIgaG9yaXotYWR2LXg9IjU2OCIgZD0iTTk3IDIyNFE3MyAyMjQgNjQgMjM0VDU0IDI2MVYyNjdRNTQgMjg0IDYzIDI5NFQ5NyAzMDRIMjQyVjQ1MlEyNDIgNDc1IDI1MiA0ODVUMjgwIDQ5NUgyODhRMzA1IDQ5NSAzMTUgNDg1VDMyNiA0NTJWMzA0SDQ3MVE0OTUgMzA0IDUwNCAyOTRUNTE0IDI2N1YyNjFRNTE0IDI0NCA1MDUgMjM0VDQ3MSAyMjRIMzI2VjY3UTMyNiA0NCAzMTYgMzRUMjg4IDI0SDI4MFEyNjMgMjQgMjUzIDM0VDI0MiA2N1YyMjRIOTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyYzsiIGdseXBoLW5hbWU9ImNvbW1hIiBob3Jpei1hZHYteD0iMjUyIiBkPSJNNzggLTEyMlE3MyAtMTI4IDY0IC0xMjlUNDUgLTEyOFQzMSAtMTE4VDI4IC05OUw4MiA3MVE4OSA5NCA5OCAxMDZUMTMzIDExOEgxNDJRMTYxIDExOCAxNzIgMTA2VDE4NCA3MVY2NlExODQgNTMgMTgwIDM5VDE2MSA2TDc4IC0xMjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSItIiBnbHlwaC1uYW1lPSJoeXBoZW4iIGhvcml6LWFkdi14PSI0MjMiIGQ9Ik01NiAyODlIMzY3VjE5OEg1NlYyODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIuIiBnbHlwaC1uYW1lPSJwZXJpb2QiIGhvcml6LWFkdi14PSIyNTIiIGQ9Ik0xMTkgLTdRNjUgLTcgNjUgNDdWNTlRNjUgMTE0IDExOSAxMTRIMTMyUTE4NyAxMTQgMTg3IDU5VjQ3UTE4NyAtNyAxMzIgLTdIMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLyIgZ2x5cGgtbmFtZT0ic2xhc2giIGhvcml6LWFkdi14PSIzNjkiIGQ9Ik0xIC0yMDJRNyAtMTgzIDEyIC0xNjVRMTcgLTE1MSAyMSAtMTM3VDI3IC0xMTZMMjY2IDY1NEgzNTlRMzUyIDYzNCAzNDcgNjE3UTM0MiA2MDMgMzM4IDU4OVQzMzIgNTY4TDk0IC0yMDJIMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjAiIGdseXBoLW5hbWU9Inplcm8iIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik0zMzIgLTEzUTI2OSAtMTMgMjE5IDhUMTM1IDY4VDgyIDE2NFQ2MyAyOTBWMzU2UTYzIDQyNiA4MSA0ODJUMTM1IDU3OFQyMjAgNjM5VDMzMiA2NjBRMzk1IDY2MCA0NDUgNjM5VDUzMCA1NzlUNTgzIDQ4M1Q2MDIgMzU3VjI5MlE2MDIgMjIyIDU4NCAxNjZUNTMwIDcwVDQ0NSA5VDMzMiAtMTNaTTMzMiA3NFE0MTMgNzQgNDU2IDEyOVQ0OTkgMjg3VjM1OVE0OTkgNDYyIDQ1NSA1MThUMzMyIDU3NVEyNTMgNTc1IDIxMCA1MjBUMTY3IDM2MVYyODhRMTY3IDE4NSAyMTAgMTMwVDMzMiA3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IjEiIGdseXBoLW5hbWU9Im9uZSIgaG9yaXotYWR2LXg9IjM5NiIgZD0iTTE4MiA1MDZRMTU1IDQ3OSAxMTUgNDc5UTgwIDQ3OSA1OCA0OThUMzUgNTQ4UTM1IDU2MSAzOSA1NzBUNDggNTg3VDU4IDU5N1Q2NCA1OTlRNzUgNTg4IDg5IDU4MlQxMjMgNTc2UTE1NSA1NzYgMTc3IDU5OFQyMDQgNjUySDIzOVEyODQgNjUyIDI4NCA2MDVWMEgxODJWNTA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMiIgZ2x5cGgtbmFtZT0idHdvIiBkPSJNMzI1IDI2MFEyODkgMjQ0IDI1OCAyMjhUMjAyIDE5MVQxNjQgMTQ2VDE0OSA4OEg1MTVWMEgxMTdRODMgMCA2OCAxMlQ1MyA1NlY4MVE1MyAxMzEgNzAgMTY4VDExNiAyMzNUMTgxIDI4MlQyNTMgMzIxUTI4NSAzMzcgMzE0IDM1MVQzNjUgMzgyVDQwMSA0MTlUNDE0IDQ2NVE0MTQgNTE2IDM4MCA1NDRUMjgyIDU3MlEyNDYgNTcyIDIyMCA1NjJUMTc0IDUzNVQxNDMgNDk2VDEyNCA0NDhRMTI0IDQ0NyAxMTQgNDQ3VDkwIDQ1MVQ2NyA0NjdUNTYgNDk4UTU2IDUyMyA3MSA1NTFUMTE1IDYwNFQxODggNjQ0VDI4OSA2NjBRMzk1IDY2MCA0NTUgNjA5VDUxNSA0NjdRNTE1IDQyMyA0OTkgMzkyVDQ1NyAzMzdUMzk2IDI5NVQzMjUgMjYwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMyIgZ2x5cGgtbmFtZT0idGhyZWUiIGhvcml6LWFkdi14PSI1NzYiIGQ9Ik01MjAgMTgxUTUyMCA5MCA0NTQgMzlUMjY5IC0xM1EyMTAgLTEzIDE2NiAxVDkxIDM3VDQ2IDg0VDMxIDEzMlEzMSAxNTIgNDAgMTYzVDYwIDE4MFQ4MSAxODVUOTEgMTg1UTExMCAxMjkgMTU3IDEwMFQyNjkgNzFRMzM4IDcxIDM3OCAxMDFUNDE5IDE4NVE0MTkgMjk5IDI3MSAyOTlIMTc3VjM3OUgyODNRMzQzIDM3OSAzNzMgNDA1VDQwNCA0NzdRNDA0IDUyNCAzNjggNTUwVDI2OCA1NzdRMjA1IDU3NyAxNjcgNTQ5VDExMCA0NzlRMTA5IDQ3NyAxMDAgNDc4VDc5IDQ4NFQ1OSA1MDFUNTAgNTMwUTUwIDU1MSA2NSA1NzNUMTA5IDYxNVQxNzggNjQ3VDI2OSA2NjBRMzgxIDY2MCA0NDIgNjE1VDUwNCA0ODVRNTA0IDM4MCAzOTQgMzQ3UTQ1NSAzMjcgNDg3IDI4NFQ1MjAgMTgxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNCIgZ2x5cGgtbmFtZT0iZm91ciIgaG9yaXotYWR2LXg9IjYyNCIgZD0iTTM3NiAxNzNIMTExUTgyIDE3MyA2NSAxODZUNDggMjIxVjI0M1E0OCAyNjAgNTUgMjczVDc3IDMwN0wzMDggNjA2UTMxOCA2MTkgMzI2IDYyOFQzNDMgNjQyVDM2NSA2NTBUMzk2IDY1MlE0MzggNjUyIDQ1NSA2MzdUNDczIDU4NVYyNTdINTg5VjE3M0g0NzNWMEgzNzZWMTczWk0xNDEgMjU1SDM4MFY1NjhMMTQxIDI1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjUiIGdseXBoLW5hbWU9ImZpdmUiIGhvcml6LWFkdi14PSI1NjgiIGQ9Ik0xNTggMzc0UTE4NyAzODcgMjIwIDM5NVQyOTEgNDAzUTM0MyA0MDMgMzg2IDM4OVQ0NTkgMzQ4VDUwNiAyODRUNTIzIDE5OVE1MjMgMTUxIDUwNiAxMTJUNDU2IDQ1VDM3NyAyVDI3MiAtMTNRMjE5IC0xMyAxNzcgLTFUMTA0IDMwVDU4IDcxVDQxIDExNVE0MSAxMjggNDggMTM4VDY0IDE1NVQ4MSAxNjVUOTAgMTY2UTExNyAxMjEgMTYzIDk2VDI3MiA3MFEzNDQgNzAgMzg1IDEwNFQ0MjcgMTk4UTQyNyAyNTcgMzg5IDI5MFQyODEgMzIzUTIyOCAzMjMgMTkyIDMxMVQxMzAgMjc5UTY3IDI4MyA2NyAzNDNWNTg5UTY3IDYxNSA4MSA2MzFUMTIwIDY0N0g0OTNWNTU5SDE1OFYzNzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI2IiBnbHlwaC1uYW1lPSJzaXgiIGhvcml6LWFkdi14PSI2MTciIGQ9Ik0zNDAgNTc1UTI1NSA1NzUgMjEwIDUxOVQxNjUgMzU3VjMzN1ExOTcgMzY2IDI0NCAzODdUMzQ5IDQwOFEzOTggNDA4IDQzOCAzOTVUNTA4IDM1NlQ1NTIgMjk1VDU2OCAyMTNWMjA4UTU2OCAxNjAgNTUwIDEyMFQ1MDEgNTBUNDI1IDRUMzI4IC0xM1EyNjMgLTEzIDIxNCA4VDEzMSA2OVQ4MCAxNjRUNjMgMjg3VjM1M1E2MyA0MjUgODIgNDgxVDEzNiA1NzhUMjIyIDYzOVQzMzUgNjYwUTM4NiA2NjAgNDI0IDY0OVQ0ODkgNjIyVDUyOCA1ODVUNTQxIDU0NVE1NDEgNTMwIDUzMyA1MjBUNTE2IDUwNFQ0OTggNDk2VDQ4OSA0OTVRNDY2IDUzMCA0MzEgNTUyVDM0MCA1NzVaTTMyNyAzMzFRMjgwIDMzMSAyMzggMzEwVDE2NiAyNTdRMTcxIDE2OCAyMTEgMTE5VDMyNCA2OVEzODggNjkgNDI4IDEwNVQ0NjkgMjAwVjIwNlE0NjkgMjY2IDQzMyAyOThUMzI3IDMzMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjciIGdseXBoLW5hbWU9InNldmVuIiBob3Jpei1hZHYteD0iNTYwIiBkPSJNMzcgNTU1VjY0N0g0NjFRNDgxIDY0NyA0OTMgNjQzVDUxMyA2MzJUNTIyIDYxN1Q1MjUgNTk4VjU5MFE1MjUgNTczIDUxNiA1NTRUNDk1IDUxNUwyMzQgMzFRMjIzIDEwIDIwOSAzVDE4MSAtNVExNjggLTUgMTU3IDBUMTM4IDEyVDEyNiAyNVQxMjQgMzRMNDExIDU1NUgzN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGdseXBoLW5hbWU9ImVpZ2h0IiBob3Jpei1hZHYteD0iNjEzIiBkPSJNMzA2IC0xMlEyNDcgLTEyIDIwMCAxVDEyMCAzOFQ3MCA5NlQ1MiAxNzJRNTIgMjI5IDg1IDI3MFQxODMgMzMzUTEyNiAzNTIgOTkgMzg5VDcxIDQ3OVE3MSA1MTkgODggNTUyVDEzNSA2MTBUMjA5IDY0N1QzMDcgNjYwUTQxNiA2NjAgNDc4IDYxMlQ1NDAgNDgxUTU0MCA0MjkgNTEzIDM5MlQ0MjkgMzM0UTQ5NSAzMTQgNTI3IDI3MlQ1NjAgMTcyUTU2MCAxMzEgNTQyIDk4VDQ5MSA0MFQ0MTAgMlQzMDYgLTEyWk0zMDcgNjdRMzgyIDY3IDQyMCA5N1Q0NTkgMTgwUTQ1OSAyMzIgNDE5IDI2M1QzMDYgMjk1UTIzMyAyOTUgMTkzIDI2NFQxNTMgMTgwUTE1MyAxMzAgMTkzIDk5VDMwNyA2N1pNMzA3IDM2OVEzNzIgMzY5IDQwNyAzOTZUNDQyIDQ3M1E0NDIgNTIxIDQwNyA1NTFUMzA2IDU4MVEyMzggNTgxIDIwNCA1NTJUMTcwIDQ3M1ExNzAgNDI2IDIwNiAzOThUMzA3IDM2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjkiIGdseXBoLW5hbWU9Im5pbmUiIGhvcml6LWFkdi14PSI2MTciIGQ9Ik00NTIgMzAyUTQyMSAyNzMgMzczIDI1M1QyNjkgMjMyUTE2OSAyMzIgMTEwIDI4M1Q1MCA0MjdWNDMxUTUwIDQ3OSA2OCA1MjBUMTE3IDU5M1QxOTMgNjQxVDI5MCA2NTlRMzUxIDY1OSA0MDAgNjM5VDQ4MyA1ODBUNTM2IDQ4N1Q1NTQgMzYxVjI5MlE1NTQgMTQwIDQ4MyA2NFQyNzcgLTEzUTIyNiAtMTMgMTg4IC0zVDEyNCAyNFQ4NSA1OVQ3MiA5N1E3MiAxMTEgNzggMTIxVDkzIDEzOFQxMDcgMTQ3VDExNSAxNDlRMTQxIDExNCAxNzkgOTNUMjczIDcxUTM2NCA3MSA0MDggMTIzVDQ1MyAyODhMNDUyIDMwMlpNMjkwIDMwOVEzMzcgMzA5IDM3OSAzMzBUNDUwIDM4M1E0NDcgNDc1IDQwOCA1MjZUMjkzIDU3OFEyNjEgNTc4IDIzNSA1NjdUMTkwIDUzOFQxNjAgNDk0VDE0OSA0MzlWNDM0UTE0OSAzNzQgMTg1IDM0MlQyOTAgMzA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOiIgZ2x5cGgtbmFtZT0iY29sb24iIGhvcml6LWFkdi14PSIyNzYiIGQ9Ik0xMzEgMzE4UTc3IDMxOCA3NyAzNzJWMzg0UTc3IDQzOCAxMzEgNDM4SDE0NFExOTkgNDM4IDE5OSAzODRWMzcyUTE5OSAzMTggMTQ0IDMxOEgxMzFaTTEzMSAtN1E3NyAtNyA3NyA0N1Y1OVE3NyAxMTQgMTMxIDExNEgxNDRRMTk5IDExNCAxOTkgNTlWNDdRMTk5IC03IDE0NCAtN0gxMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBnbHlwaC1uYW1lPSJzZW1pY29sb24iIGhvcml6LWFkdi14PSIyNzYiIGQ9Ik0xMzEgMzE4UTc3IDMxOCA3NyAzNzJWMzg0UTc3IDQzOCAxMzEgNDM4SDE0NFExOTkgNDM4IDE5OSAzODRWMzcyUTE5OSAzMTggMTQ0IDMxOEgxMzFaTTkwIC0xMjJRODUgLTEyOCA3NiAtMTI5VDU3IC0xMjhUNDMgLTExOFQ0MCAtOTlMOTQgNzFRMTAxIDk0IDExMCAxMDZUMTQ1IDExOEgxNTRRMTczIDExOCAxODQgMTA2VDE5NiA3MVY2NlExOTYgNTMgMTkyIDM5VDE3MyA2TDkwIC0xMjJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImbHQ7IiBnbHlwaC1uYW1lPSJsZXNzIiBob3Jpei1hZHYteD0iNDk0IiBkPSJNMzg1IDE0OFE0MTUgMTMyIDQyNSAxMTZUNDM0IDg1UTQzMiA2NCA0MjEgNTFUNDA2IDM5TDg5IDIwOVE3NSAyMTcgNjcgMjI4VDU5IDI2NFE1OSAyODkgNjcgMzAwVDg5IDMxOUw0MDYgNDkwUTQwNyA0OTAgNDExIDQ4N1Q0MjAgNDc3VDQyOSA0NjNUNDM0IDQ0NFE0MzUgNDI5IDQyNSA0MTNUMzg1IDM4MkwxNTcgMjY0TDM4NSAxNDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI9IiBnbHlwaC1uYW1lPSJlcXVhbCIgaG9yaXotYWR2LXg9IjU2OCIgZD0iTTEwOSAzMzRRODUgMzM0IDc2IDM0NVQ2NiAzNzNWMzgyUTY2IDM5OSA3NSA0MTBUMTA5IDQyMUg0NTlRNDgzIDQyMSA0OTIgNDEwVDUwMiAzODJWMzczUTUwMiAzNTYgNDkzIDM0NVQ0NTkgMzM0SDEwOVpNMTA5IDEwMFE4NSAxMDAgNzYgMTExVDY2IDEzOVYxNDlRNjYgMTY2IDc1IDE3N1QxMDkgMTg4SDQ1OVE0ODMgMTg4IDQ5MiAxNzdUNTAyIDE0OVYxMzlRNTAyIDEyMiA0OTMgMTExVDQ1OSAxMDBIMTA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmd0OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlciIgaG9yaXotYWR2LXg9IjQ5MyIgZD0iTTU5IDg1UTU4IDEwMCA2OCAxMTZUMTA4IDE0OEwzMzUgMjY0TDEwOCAzODJRNzkgMzk3IDY5IDQxM1Q1OSA0NDRRNjEgNDY0IDcyIDQ3N1Q4OCA0OTBMNDA0IDMxOVE0MTggMzExIDQyNiAzMDBUNDM0IDI2NFE0MzQgMjM5IDQyNiAyMjhUNDA0IDIwOUw4OCAzOVE4MyAzNyA3MiA1MFQ1OSA4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij8iIGdseXBoLW5hbWU9InF1ZXN0aW9uIiBob3Jpei1hZHYteD0iNTA5IiBkPSJNMTg4IDE5N1YxOThRMTg4IDE5OSAxODggMjAxVDE4OCAyMDlRMTkyIDI1NSAyMDcgMjg2VDI0MiAzMzhUMjg0IDM3NVQzMjYgNDA1VDM1NyA0MzdUMzcwIDQ4MVEzNzAgNTI0IDM0MSA1NDlUMjU3IDU3NVEyMjEgNTc1IDE5NiA1NjRUMTU0IDUzNVQxMjggNDk0VDExNSA0NDhRMTE1IDQ0NyAxMDQgNDQ3VDgwIDQ1M1Q1NiA0NjlUNDUgNTAxUTQ1IDUyMyA1NyA1NTBUOTYgNjAyVDE2MyA2NDJUMjU5IDY1OVEzMDggNjU5IDM0NiA2NDdUNDEyIDYxMlQ0NTMgNTU4VDQ2OCA0ODlRNDY4IDQ0OCA0NTQgNDIwVDQxNyAzNzJUMzcwIDMzNFQzMjIgMjk5VDI4NiAyNTZUMjcxIDE5N0gxODhaTTIyNSAtN1ExNzEgLTcgMTcxIDQ3VjU5UTE3MSAxMTQgMjI1IDExNEgyMzlRMjk0IDExNCAyOTQgNTlWNDdRMjk0IC03IDIzOSAtN0gyMjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJAIiBnbHlwaC1uYW1lPSJhdCIgaG9yaXotYWR2LXg9Ijc3MyIgZD0iTTM1NiAxNjVRMzI2IDE2NSAzMDIgMTc2VDI2MCAyMDhUMjMyIDI1NlQyMjIgMzE3UTIyMiAzNTEgMjMyIDM3OFQyNjAgNDI2VDMwMyA0NTdUMzU4IDQ2OFEzODkgNDY4IDQxMyA0NTRUNDUyIDQxOVY0NjZINTI4VjI5OFE1MjggMjYwIDU0MSAyNDBUNTg2IDIyMFE2MjQgMjIwIDY0MyAyNThUNjYzIDM1OVE2NjMgNDE0IDY0NSA0NTlUNTkxIDUzOFQ1MDYgNTg5VDM5MSA2MDdRMzMwIDYwNyAyNzkgNTg2VDE5MiA1MjhUMTM1IDQzOFQxMTQgMzIzUTExNCAyNjEgMTM1IDIxMFQxOTQgMTIwVDI4NCA2MVQzOTkgNDBRNDQ5IDQwIDQ5MSA1NFQ1NjMgODlRNTcxIDk1IDU3OSA5OFQ1OTcgMTAyUTYwNSAxMDIgNjExIDk3VDYyMiA4NlQ2MjcgNzNUNjI4IDY2UTU5MiAzNCA1MzIgMTFUMzk5IC0xM1EzMjIgLTEzIDI2MCAxMVQxNTMgODBUODQgMTg2VDU5IDMyM1E1OSAzOTcgODMgNDU5VDE1MiA1NjVUMjU3IDYzNVQzOTEgNjYwUTQ2NyA2NjAgNTI3IDYzOVQ2MzAgNTc4VDY5NSA0ODNUNzE4IDM2MFE3MTggMjY1IDY3OSAyMTVUNTY2IDE2NFE1MjQgMTY0IDQ5NiAxODFUNDU5IDIyOFE0NDMgMTk5IDQxNyAxODJUMzU2IDE2NVpNMzc2IDIzMVE0MDcgMjMxIDQyOSAyNTBUNDUxIDMwMlYzNTFRNDQxIDM3NCA0MjMgMzg4VDM3NyA0MDJRMzQyIDQwMiAzMjIgMzc5VDMwMSAzMTdRMzAxIDI3OCAzMjIgMjU1VDM3NiAyMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJBIiBnbHlwaC1uYW1lPSJBIiBob3Jpei1hZHYteD0iNjYwIiBkPSJNNDU3IDE5MEgxOThMMTI1IDBIMjBMMjU4IDYyMFEyNjQgNjM2IDI3OSA2NDRUMzI5IDY1M1EzNjUgNjUzIDM3OSA2NDVUNDAwIDYyMEw2NDIgMEg1MzFMNDU3IDE5MFpNMjIzIDI3M0g0MzFMMzI3IDU0N0wyMjMgMjczWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQiIgZ2x5cGgtbmFtZT0iQiIgaG9yaXotYWR2LXg9IjY0OCIgZD0iTTg0IDU4OVE4NCA2MTUgOTkgNjMxVDEzOSA2NDdIMzUyUTQ1OCA2NDcgNTE0IDYwNFQ1NzAgNDc5UTU3MCA0MjYgNTQxIDM5MlQ0NTYgMzQwUTUyOCAzMjMgNTYyIDI4MVQ1OTYgMTgxUTU5NiA5MCA1MzcgNDVUMzUwIDBIODRWNTg5Wk0zNDMgODNRNDIxIDgzIDQ1NSAxMDdUNDkwIDE4OVE0OTAgMjkxIDM0NiAyOTFIMTg2VjgzSDM0M1pNMzM5IDM2NVEzOTYgMzY1IDQyOSAzOTJUNDYzIDQ2N1E0NjMgNTY0IDMzNyA1NjRIMTg2VjM2NUgzMzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJDIiBnbHlwaC1uYW1lPSJDIiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNTAgODBUODMgMTg2VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODggNjYwUTQ0OSA2NjAgNDk0IDY0NVQ1NzAgNjA5VDYxNiA1NjRUNjMyIDUyM1E2MzIgNTA1IDYyMyA0OTRUNjAzIDQ3NlQ1ODMgNDY3VDU3MiA0NjdRNTQ0IDUxNiA0OTQgNTQxVDM4OSA1NjdRMzQwIDU2NyAyOTkgNTUwVDIyOSA1MDBUMTgzIDQyM1QxNjYgMzI0UTE2NiAyNzAgMTgzIDIyNlQyMzAgMTQ5VDMwMSA5OFQzOTEgODBRNDU3IDgwIDUwNyAxMTBUNTc4IDE5M1E1NzkgMTk1IDU4OSAxOTRUNjExIDE4NlQ2MzIgMTY4VDY0MiAxMzhRNjQyIDEyMCA2MjYgOTRUNTc4IDQ1VDQ5OCA0VDM4NSAtMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJEIiBnbHlwaC1uYW1lPSJEIiBob3Jpei1hZHYteD0iNzA3IiBkPSJNODQgNTg5UTg0IDYxNSAxMDAgNjMxVDEzOSA2NDdIMjk3UTM3OSA2NDcgNDQ0IDYyNVQ1NTUgNTYyVDYyNCA0NjFUNjQ4IDMyNVE2NDggMjQ5IDYyNCAxODlUNTUzIDg3VDQ0MSAyM1QyOTIgMEg4NFY1ODlaTTI5NCA4OVE0MTMgODkgNDc4IDE1MFQ1NDQgMzI0UTU0NCA0MzUgNDc5IDQ5NlQyOTUgNTU4SDE4NlY4OUgyOTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJFIiBnbHlwaC1uYW1lPSJFIiBob3Jpei1hZHYteD0iNjE3IiBkPSJNODQgNTg5UTg0IDYxNSA5OSA2MzFUMTM5IDY0N0g1NjJWNTU1SDE4N1YzNzRINDg4VjI4N0gxODdWOTFINTY3VjBIODRWNTg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRiIgZ2x5cGgtbmFtZT0iRiIgaG9yaXotYWR2LXg9IjU3MyIgZD0iTTg0IDU4OVE4NCA2MTUgOTkgNjMxVDEzOSA2NDdINTM2VjU1NkgxODZWMzUwSDQ1OFYyNjNIMTg4VjBIODRWNTg5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iRyIgZ2x5cGgtbmFtZT0iRyIgaG9yaXotYWR2LXg9Ijc0MiIgZD0iTTYzNiAtNFE2MjUgLTQgNjE1IC0xVDU5NyAxMlQ1ODUgMzdUNTgwIDc5VjkxUTU1MCA0MyA0OTUgMTZUMzY1IC0xMlEyOTUgLTEyIDIzOSAxM1QxNDIgODJUODEgMTg4VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MSA1NjVUMjU2IDYzNVQzOTEgNjYwUTQ1MCA2NjAgNDk1IDY0NlQ1NzIgNjEyVDYyMCA1NjhUNjM2IDUyNlE2MzYgNTA4IDYyOCA0OTdUNjA5IDQ4MFQ1OTAgNDczVDU4MCA0NzNRNTUwIDUyMSA0OTkgNTQ2VDM5MyA1NzFRMzQzIDU3MSAzMDEgNTUzVDIyOSA1MDFUMTgyIDQyMlQxNjUgMzIxUTE2NSAyNjcgMTgwIDIyMVQyMjMgMTQyVDI5MyA5MFQzODUgNzFRNDI0IDcxIDQ1NyA4MVQ1MTYgMTExVDU1OCAxNTdUNTc5IDIxNlYyNTdIMzc1VjM0MUg2MTVRNjQzIDM0MSA2NTYgMzI1VDY3MCAyODJWNlE2NzAgNCA2NjAgMFQ2MzYgLTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBnbHlwaC1uYW1lPSJIIiBob3Jpei1hZHYteD0iNzE1IiBkPSJNODQgNjA0UTg0IDY1MSAxMjcgNjUxSDE0MlExODcgNjUxIDE4NyA2MDRWMzY5SDUyOFY2MDRRNTI4IDY1MSA1NzEgNjUxSDU4NlE2MzEgNjUxIDYzMSA2MDRWMEg1MjhWMjc5SDE4N1YwSDg0VjYwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkkiIGdseXBoLW5hbWU9IkkiIGhvcml6LWFkdi14PSIyODkiIGQ9Ik05MyA2MDRROTMgNjUxIDEzNiA2NTFIMTUxUTE5NiA2NTEgMTk2IDYwNFYwSDkzVjYwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkoiIGdseXBoLW5hbWU9IkoiIGhvcml6LWFkdi14PSI0OTQiIGQ9Ik0yMTAgLTEzUTE3MSAtMTMgMTM5IC00VDg1IDIxVDUwIDU0VDM4IDkxUTM4IDEwNiA0NSAxMTdUNjAgMTM1VDc2IDE0NVQ4NSAxNDdRMTAyIDExNSAxMzIgOTZUMjAyIDc2UTI2MiA3NiAyODcgMTA4VDMxMyAyMTlWNjQ3SDQxNlYyMThRNDE2IDEwMCAzNjYgNDRUMjEwIC0xM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IksiIGdseXBoLW5hbWU9IksiIGhvcml6LWFkdi14PSI2MTIiIGQ9Ik04NCA2MDRRODQgNjUxIDEyNyA2NTFIMTQyUTE4NyA2NTEgMTg3IDYwNFYzNDRMNDQ2IDYxOFE0NjMgNjM4IDQ3NiA2NDRUNTAzIDY1MVE1MTkgNjUxIDUzMCA2NDVUNTQ4IDYzMFQ1NTcgNjE0VDU1OSA2MDVMMzAxIDMzMUw1NjYgNDFRNTY3IDM5IDU2NSAzMlQ1NTUgMTdUNTM2IDNUNTA3IC00UTQ5MCAtNCA0NzcgMlQ0NTEgMjVMMTg3IDMxM1YwSDg0VjYwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkwiIGdseXBoLW5hbWU9IkwiIGhvcml6LWFkdi14PSI1NTgiIGQ9Ik04NCA2MDRRODQgNjUxIDEyNyA2NTFIMTQyUTE4NyA2NTEgMTg3IDYwNFY5M0g0NjhRNTE2IDkzIDUxNiA0OVY0NVE1MTYgMCA0NjggMEg4NFY2MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJNIiBnbHlwaC1uYW1lPSJNIiBob3Jpei1hZHYteD0iNzc5IiBkPSJNODQgNTk0UTg0IDYyMCAxMDAgNjM1VDE0MyA2NTFIMTcwUTIwMCA2NTEgMjEyIDYzOVQyMzcgNTk5TDM5MCAyNTRMNTQ0IDU5OVE1NTYgNjI4IDU2OCA2MzlUNjEwIDY1MUg2MzVRNjYzIDY1MSA2NzkgNjM2VDY5NiA1OTRWMEg1OThWNTE4TDQ1NSAxOTZRNDQ3IDE3NiA0MzUgMTY0VDM4OSAxNTJRMzcyIDE1MiAzNjIgMTU1VDM0NCAxNjRUMzMyIDE3OFQzMjMgMTk2TDE4MiA1MTVWMEg4NFY1OTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJOIiBnbHlwaC1uYW1lPSJOIiBob3Jpei1hZHYteD0iNzEyIiBkPSJNODQgNTkzUTg0IDYxOSA5NiA2MzVUMTMzIDY1MUgxNTBRMTczIDY1MSAxODUgNjQyVDIxMiA2MTJMNTMyIDE1OFY2NDdINjI5VjU0UTYyOSAyNyA2MTcgMTJUNTgxIC00SDU3M1E1NTAgLTQgNTQwIDNUNTE4IDI3TDE4MSA1MDRWMEg4NFY1OTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJPIiBnbHlwaC1uYW1lPSJPIiBob3Jpei1hZHYteD0iNzcxIiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNDkgODBUODIgMTg2VDU4IDMyMlE1OCAzOTYgODIgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODYgNjYwUTQ1OCA2NjAgNTE4IDYzNlQ2MjIgNTY3VDY4OSA0NjBUNzEzIDMyNFE3MTMgMjUwIDY4OSAxODhUNjIxIDgyVDUxNyAxMlQzODUgLTEzWk0zODYgNzhRNDM1IDc4IDQ3NiA5NlQ1NDYgMTQ2VDU5MiAyMjNUNjA5IDMyMlE2MDkgMzc2IDU5MyA0MjFUNTQ2IDQ5OVQ0NzUgNTUwVDM4NSA1NjlRMzM2IDU2OSAyOTUgNTUxVDIyNSA1MDFUMTc5IDQyNFQxNjIgMzI0UTE2MiAyNzAgMTc4IDIyNVQyMjUgMTQ3VDI5NiA5NlQzODYgNzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJQIiBnbHlwaC1uYW1lPSJQIiBob3Jpei1hZHYteD0iNTk5IiBkPSJNODQgNTg5UTg0IDYxNSA5OSA2MzFUMTM5IDY0N0gzMDZRNDI3IDY0NyA0OTIgNTk0VDU1NyA0NDFRNTU3IDMzOCA0OTMgMjg2VDMwMiAyMzNIMTg3VjBIODRWNTg5Wk0xODYgMzE2SDMwNFEzNzkgMzE2IDQxNiAzNDdUNDU0IDQzOVE0NTQgNTYyIDMwNSA1NjJIMTg2VjMxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IlEiIGdseXBoLW5hbWU9IlEiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik02NTcgLTEzUTY0MyAtMTMgNjI4IC01VDU5NyAyMEw1NzIgNDVRNTMzIDE3IDQ4NiAyVDM4NSAtMTNRMzEzIC0xMyAyNTMgMTFUMTUwIDgwVDgyIDE4NlQ1OCAzMjJRNTggMzk2IDgyIDQ1OFQxNTAgNTY1VDI1NCA2MzVUMzg3IDY2MFE0NTkgNjYwIDUxOSA2MzZUNjIyIDU2N1Q2ODkgNDYwVDcxMyAzMjRRNzEzIDI2MSA2OTQgMjA2VDYzOSAxMDdMNzE2IDI4UTcxNyAyNiA3MTQgMjBUNzAzIDZUNjg0IC03VDY1NyAtMTNaTTM4NyA3OFE0NTcgNzggNTEwIDExMUwzODMgMjQxTDQ0NiAzMDFMNTcxIDE3M1E2MTEgMjMzIDYxMSAzMjJRNjExIDM3NiA1OTUgNDIxVDU0OCA0OTlUNDc3IDU1MFQzODYgNTY5UTMzNiA1NjkgMjk1IDU1MVQyMjUgNTAxVDE3OSA0MjNUMTYyIDMyNFExNjIgMjcwIDE3OCAyMjVUMjI1IDE0N1QyOTYgOTZUMzg3IDc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iUiIgZ2x5cGgtbmFtZT0iUiIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTUwMSAtNFE0ODEgLTQgNDY2IDVUNDM0IDM2TDI1NyAyNTNIMTg2VjBIODRWNTg5UTg0IDYxNSA5OSA2MzFUMTM5IDY0N0gzMjNRNDQyIDY0NyA1MDMgNTk5VDU2NSA0NTNRNTY1IDM3MCA1MTYgMzIxVDM3MiAyNjNMNTYxIDM4UTU2MyAzNiA1NjAgMjlUNTQ5IDE1VDUyOSAyVDUwMSAtNFpNMTg1IDMzNEgzMjFRMzkzIDMzNCA0MjcgMzY0VDQ2MSA0NDhRNDYxIDU2MiAzMTggNTYySDE4NVYzMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBnbHlwaC1uYW1lPSJTIiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMjkwIC0xM1EyMzEgLTEzIDE4NiAtMVQxMTAgMzFUNjMgNzNUNDcgMTE2UTQ3IDEyOSA1NCAxMzlUNjkgMTU3VDg1IDE2OFQ5NCAxNzFRMTIyIDEzMCAxNzIgMTAxVDI4OSA3MlEzNTcgNzIgMzkzIDk4VDQzMCAxNzNRNDMwIDIwMCA0MTcgMjE4VDM4MiAyNDhUMzMwIDI2N1QyNjggMjgzUTIzMCAyOTIgMTk0IDMwNFQxMjkgMzM3VDgyIDM5MFQ2NCA0NzJRNjQgNTEzIDgxIDU0N1QxMjggNjA3VDIwMiA2NDZUMjk3IDY2MFEzNTEgNjYwIDM5MiA2NDlUNDYyIDYyMFQ1MDQgNTgzVDUxOSA1NDVRNTE5IDUzMSA1MTIgNTIwVDQ5NiA1MDJUNDgwIDQ5MVQ0NzEgNDg4UTQ0NSA1MjUgNDAwIDU1MFQyOTggNTc1UTIzNyA1NzUgMjAxIDU0OFQxNjQgNDc2UTE2NCA0NDkgMTc1IDQzM1QyMDYgNDA2VDI1NSAzODhUMzE3IDM3M1EzNTggMzY0IDM5NyAzNTBUNDY2IDMxNFQ1MTQgMjYwVDUzMyAxODBRNTMzIDkwIDQ2OSAzOVQyOTAgLTEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVCIgZ2x5cGgtbmFtZT0iVCIgaG9yaXotYWR2LXg9IjYyMyIgZD0iTTgzIDU1NVEzNSA1NTUgMzUgNTk5VjYwNFEzNSA2NDcgODMgNjQ3SDU0MVE1ODggNjQ3IDU4OCA2MDRWNTk5UTU4OCA1NTUgNTQxIDU1NUgzNjRWMEgyNjBWNTU1SDgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iVSIgZ2x5cGgtbmFtZT0iVSIgaG9yaXotYWR2LXg9IjY4MCIgZD0iTTMzOSAtMTJRMjA5IC0xMiAxNDMgNTdUNzYgMjYzVjYwNFE3NiA2NTEgMTIwIDY1MUgxMzRRMTc5IDY1MSAxNzkgNjA0VjI2NlExNzkgNzkgMzQwIDc5UTUwMSA3OSA1MDEgMjY3VjYwNFE1MDEgNjUxIDU0NSA2NTFINTYxUTYwNCA2NTEgNjA0IDYwNFYyNjVRNjA0IDEyOSA1MzcgNTlUMzM5IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9IlYiIGdseXBoLW5hbWU9IlYiIGhvcml6LWFkdi14PSI2NTAiIGQ9Ik05MSA2NTFRMTExIDY1MSAxMjcgNjQwVDE1MSA2MDRMMzI3IDExMUw1MDMgNjA0UTUxMiA2MzAgNTI3IDY0MFQ1NjAgNjUxUTU3MiA2NTEgNTgzIDY0N1Q2MDMgNjM4VDYxNiA2MjdUNjIwIDYxOEwzNzYgMEgyNzVMMzAgNjE4UTI4IDYyMSAzMyA2MjdUNDYgNjM4VDY3IDY0N1Q5MSA2NTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJXIiBnbHlwaC1uYW1lPSJXIiBob3Jpei1hZHYteD0iOTU1IiBkPSJNNjMgNjIyUTYyIDYyNiA3OCA2MzhUMTI0IDY1MVExNDQgNjUxIDE2MCA2MzhUMTg0IDU5MUwyODkgMTE1TDQxMiA1MjJRNDE4IDU0NSA0MzQgNTU3VDQ4MCA1NjlRNTEwIDU2OSA1MjUgNTU3VDU0OCA1MjJMNjY5IDExN0w3NzYgNTkyUTc4MyA2MjQgNzk3IDYzN1Q4MzMgNjUxUTg0NyA2NTEgODU4IDY0N1Q4NzYgNjM4VDg4OCA2MjlUODkxIDYyMkw3MzIgMEg2MTVMNDgwIDQ1M0wzMzkgMEgyMjRMNjMgNjIyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iWCIgZ2x5cGgtbmFtZT0iWCIgaG9yaXotYWR2LXg9IjYzNiIgZD0iTTI2IDY0N0gxNDRMMzIwIDM4N0w0ODQgNjE4UTQ5NiA2MzcgNTA5IDY0NVQ1MzcgNjUzUTU1MCA2NTMgNTYxIDY0OFQ1ODEgNjM1VDU5MyA2MjBUNTk1IDYxMEwzODQgMzI0TDU5NSA0MFE1OTcgMzcgNTkzIDMwVDU4MSAxNlQ1NjEgM1Q1MzUgLTNRNTIwIC0zIDUwNSA1VDQ3OCAzMUwzMTUgMjY0TDE0OSAzMFExMzYgMTAgMTIzIDNUOTYgLTVRODMgLTUgNzIgMFQ1MiAxM1Q0MCAyOFQzOCAzOEwyNTEgMzI1TDI2IDY0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlkiIGdseXBoLW5hbWU9IlkiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik0yNTAgMjY1TDI0IDY0N0gxMzlMMzAyIDM1MUw0NjggNjE1UTQ4MCA2MzUgNDkzIDY0M1Q1MTkgNjUxUTUzNiA2NTEgNTQ4IDY0NlQ1NjggNjMzVDU3OSA2MThUNTgxIDYwOUwzNTMgMjY1VjBIMjUwVjI2NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IloiIGdseXBoLW5hbWU9IloiIGhvcml6LWFkdi14PSI2MzkiIGQ9Ik02MyA5Mkw0NDUgNTU3SDExMlE2NiA1NTcgNjYgNTk5VjYwNVE2NiA2NDcgMTEyIDY0N0g1NjlWNTYxTDE4NSA5MEg1MzhRNTg0IDkwIDU4NCA0OFY0MlE1ODQgMCA1MzggMEg2M1Y5MloiICAvPgorPGdseXBoIHVuaWNvZGU9IlsiIGdseXBoLW5hbWU9ImJyYWNrZXRsZWZ0IiBob3Jpei1hZHYteD0iMzc1IiBkPSJNODUgNjUwSDI5NFEzMjAgNjUwIDMzMCA2NDFUMzQxIDYxMlY2MDVRMzQxIDU4NSAzMzEgNTc2VDI5NCA1NjZIMTc4Vi0xMTRIMjk0UTMyMCAtMTE0IDMzMSAtMTIzVDM0MiAtMTUyVi0xNThRMzQyIC0xNzggMzMxIC0xODhUMjk0IC0xOThIODVWNjUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXCIgZ2x5cGgtbmFtZT0iYmFja3NsYXNoIiBob3Jpei1hZHYteD0iMzY5IiBkPSJNMzY4IC0yMDJIMjc1TDM3IDU2OFEzNSA1NzQgMzEgNTg4VDIyIDYxN1ExNyA2MzQgMTAgNjU0SDEwM0wzNDIgLTExNlEzNDQgLTEyMiAzNDggLTEzNlQzNTcgLTE2NVEzNjIgLTE4MyAzNjggLTIwMloiICAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGdseXBoLW5hbWU9ImJyYWNrZXRyaWdodCIgaG9yaXotYWR2LXg9IjM3NSIgZD0iTTgxIC0xOThRNTUgLTE5OCA0NCAtMTg4VDMzIC0xNThWLTE1MlEzMyAtMTMyIDQ0IC0xMjNUODEgLTExNEgxOTdWNTY2SDgyUTU2IDU2NiA0NSA1NzVUMzQgNjA1VjYxMlEzNCA2MzIgNDUgNjQxVDgyIDY1MEgyOTBWLTE5OEg4MVoiICAvPgorPGdseXBoIHVuaWNvZGU9Il4iIGdseXBoLW5hbWU9ImFzY2lpY2lyY3VtIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMTU3IDQ0NFExNDMgNDQ0IDEzNCA0NTNUMTI1IDQ3NlExMjUgNDk2IDE0NCA1MjFUMTg3IDU2OVQyMzQgNjA3VDI2NSA2MjVRMjcyIDYyMyAyOTUgNjA4VDM0MiA1NzBUMzg1IDUyMlQ0MDQgNDc2UTQwNCA0NjIgMzk2IDQ1M1QzNzMgNDQ0UTM1MiA0NDQgMzI3IDQ2OVQyNjQgNTUxUTIyNiA0OTQgMjAyIDQ2OVQxNTcgNDQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXyIgZ2x5cGgtbmFtZT0idW5kZXJzY29yZSIgaG9yaXotYWR2LXg9IjUwOSIgZD0iTTcxIC04MlEyOCAtODIgMjggLTQ0Vi0zOVEyOCAtMjEgMzkgLTExVDcxIDBINDM4UTQ1OSAwIDQ3MCAtMTBUNDgxIC0zOVYtNDRRNDgxIC04MiA0MzggLTgySDcxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYCIgZ2x5cGgtbmFtZT0iZ3JhdmUiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xNjggNjA5UTEyNSA2MzUgMTI1IDY3MFExMjUgNjg3IDEzOCA2OThUMTcwIDcwOVExOTUgNzA5IDIxOCA2OTJRMjQyIDY3NiAyNjUgNjU0VDMwNSA2MTBUMzMxIDU3NFQzMzkgNTU1UTMzNyA1NTIgMzIwIDU1M1QyNzggNTYxVDIyNCA1NzlUMTY4IDYwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImEiIGdseXBoLW5hbWU9ImEiIGhvcml6LWFkdi14PSI1NTMiIGQ9Ik0yMTIgLTExUTEzNCAtMTEgOTEgMjZUNDggMTI2UTQ4IDIxMCAxMjcgMjQ4VDM3MSAyODlIMzg0VjI5OVEzODQgMzU0IDM1NCAzODNUMjY1IDQxMlEyMTAgNDEyIDE3NyAzODhUMTI3IDMzMFExMjcgMzMwIDExOCAzMzBUOTcgMzM1VDc2IDM1MFQ2NiAzNzhRNjYgMzk1IDc5IDQxNVQxMTggNDUyVDE4MiA0ODFUMjcyIDQ5M1EzNzUgNDkzIDQyOCA0NDNUNDgyIDMwMVYwSDM4NVYxNFY3MlEzNTcgMzMgMzEyIDExVDIxMiAtMTFaTTIzNiA2MFEyNjggNjAgMjk1IDY5VDM0MiA5NlQzNzMgMTM3VDM4NCAxOTBWMjI3TDM1NyAyMjZRMjUxIDIyMiAxOTggMjAxVDE0NSAxMzBRMTQ1IDk4IDE2OSA3OVQyMzYgNjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJiIiBnbHlwaC1uYW1lPSJiIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMzQwIC0xM1EyNzkgLTEzIDIzNyAxMlQxNzQgNzJWMEg3NlY2NzZRNzYgNjc4IDg2IDY4MlQxMTIgNjg3UTEyMyA2ODcgMTM0IDY4NFQxNTUgNjcxVDE2OSA2NDVUMTc1IDYwMlY0MDZRMjA0IDQ0NyAyNDUgNDcwVDM0MyA0OTNRMzkxIDQ5MyA0MzIgNDc1VDUwNCA0MjRUNTUxIDM0NVQ1NjggMjQxUTU2OCAxODQgNTUxIDEzOFQ1MDQgNThUNDMyIDZUMzQwIC0xM1pNMzIyIDY5UTM5MCA2OSA0MzEgMTE2VDQ3MiAyNDBRNDcyIDI3NyA0NjEgMzA4VDQzMSAzNjNUMzg0IDM5OFQzMjQgNDExUTI2OCA0MTEgMjMxIDM4NFQxNzQgMzExVjIwNFExNzUgMTc1IDE4NyAxNTBUMjIwIDEwN1QyNjYgNzlUMzIyIDY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iYyIgZ2x5cGgtbmFtZT0iYyIgaG9yaXotYWR2LXg9IjU0NiIgZD0iTTI5NyAtMTNRMjQzIC0xMyAxOTcgNlQxMTggNThUNjYgMTM4VDQ3IDI0MVE0NyAyOTYgNjYgMzQyVDExOCA0MjFUMTk3IDQ3NFQyOTcgNDkzUTM1MSA0OTMgMzg5IDQ3OVQ0NTMgNDQ0VDQ5MSA0MDBUNTAzIDM2MFE1MDMgMzQ1IDQ5NCAzMzZUNDc1IDMyMVQ0NTUgMzE1VDQ0NCAzMTZRNDI3IDM1NiAzOTQgMzgzVDI5OSA0MTBRMjY1IDQxMCAyMzYgMzk4VDE4NiAzNjNUMTUzIDMwOVQxNDEgMjQxUTE0MSAyMDQgMTUzIDE3M1QxODYgMTE5VDIzNiA4M1QyOTkgNzBRMzYwIDcwIDM5MyA5N1Q0NDQgMTY0UTQ0NSAxNjYgNDU0IDE2NVQ0NzQgMTYwVDQ5NCAxNDVUNTAzIDExOVE1MDMgMTAyIDQ5MSA4MFQ0NTQgMzdUMzg5IDJUMjk3IC0xM1oiICAvPgorPGdseXBoIHVuaWNvZGU9ImQiIGdseXBoLW5hbWU9ImQiIGhvcml6LWFkdi14PSI2MTUiIGQ9Ik0yNzIgLTEzUTIyNCAtMTMgMTgzIDVUMTExIDU2VDY0IDEzNlQ0NyAyNDBRNDcgMjk3IDY0IDM0M1QxMTEgNDIzVDE4MyA0NzVUMjc1IDQ5M1EzMzQgNDkzIDM3NiA0NzBUNDQwIDQxNFY2NzZRNDQwIDY3OCA0NTEgNjgyVDQ3NiA2ODdRNDg4IDY4NyA0OTkgNjg0VDUxOSA2NzFUNTMzIDY0NVQ1MzkgNjAyVjBINDQxVjgwUTQxMiAzNiAzNzEgMTJUMjcyIC0xM1pNMjkxIDY5UTMyMSA2OSAzNDggNzlUMzk2IDEwOFQ0MjkgMTUzVDQ0MSAyMTBWMzEyUTQyMiAzNTggMzg2IDM4NFQyOTMgNDExUTIyNSA0MTEgMTg0IDM2NVQxNDMgMjQwUTE0MyAyMDIgMTU0IDE3MVQxODQgMTE3VDIzMSA4MlQyOTEgNjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJlIiBnbHlwaC1uYW1lPSJlIiBob3Jpei1hZHYteD0iNTcwIiBkPSJNMzAxIC0xM1EyNDQgLTEzIDE5NyA1VDExNyA1NlQ2NiAxMzVUNDcgMjM4UTQ3IDI5MyA2NSAzMzlUMTE3IDQyMFQxOTUgNDczVDI5MyA0OTNRMzQ1IDQ5MyAzODcgNDc2VDQ2MCA0MjZUNTA3IDM1MFQ1MjQgMjUxVjI0M1E1MjQgMjI3IDUxOCAyMjFUNDk0IDIxNEgxMzlRMTQyIDE4MSAxNTUgMTU0VDE4OSAxMDdUMjQwIDc2VDMwMyA2NVEzMzQgNjUgMzU4IDcxVDQwMSA4OVQ0MzIgMTE0VDQ1NCAxNDVRNDU1IDE0NiA0NjMgMTQ0VDQ4MCAxMzdUNDk4IDEyMlQ1MDYgOTZRNTA2IDgwIDQ5MyA2MVQ0NTMgMjZUMzg4IC0yVDMwMSAtMTNaTTI5MiA0MThRMjYyIDQxOCAyMzcgNDA4VDE5MSAzODBUMTU4IDMzNlQxNDAgMjgxSDQyOFE0MjQgMzQ0IDM4OCAzODFUMjkyIDQxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImYiIGdseXBoLW5hbWU9ImYiIGhvcml6LWFkdi14PSIzODMiIGQ9Ik0yMyA0ODFIMTIzVjUxN1ExMjMgNjA4IDE2MyA2NTFUMjc2IDY5NFEzMzIgNjk0IDM1OCA2NzVUMzg0IDYyOVEzODQgNjE4IDM4MSA2MTBUMzczIDU5N1QzNjUgNTg4VDM2MCA1ODZRMzQ5IDU5NyAzMzAgNjA1VDI4OCA2MTRRMjUyIDYxNCAyMzYgNTkxVDIxOSA1MTZWNDgxSDM0M1Y0MDBIMjIxVjBIMTIzVjQwMEgyM1Y0ODFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJnIiBnbHlwaC1uYW1lPSJnIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMjk1IC0xOTlRMjQyIC0xOTkgMjAyIC0xODdUMTM0IC0xNTdUOTMgLTExOFQ3OSAtNzlRNzkgLTY0IDg2IC01NFQxMDEgLTM3VDExNiAtMjlUMTI1IC0yOFExNDggLTY2IDE4NyAtOTBUMjkyIC0xMTVRNDQwIC0xMTUgNDQwIDMzVjk2UTQxMSA1NCAzNzAgMzJUMjcxIDlRMjIxIDkgMTgwIDI2VDExMCA3NFQ2NCAxNDlUNDcgMjUwUTQ3IDMwMyA2NCAzNDdUMTEyIDQyNFQxODQgNDc1VDI3NSA0OTNRMzMzIDQ5MyAzNzYgNDcxVDQ0MiA0MTdWNDgxSDUzOVYzNVE1MzkgLTg0IDQ3NyAtMTQxVDI5NSAtMTk5Wk0yOTEgODhRMzIwIDg4IDM0NiA5N1QzOTMgMTI0VDQyNiAxNjZUNDQxIDIxOVYzMThRNDIxIDM2MiAzODQgMzg3VDI5MyA0MTJRMjU5IDQxMiAyMzIgNDAwVDE4NSAzNjdUMTU0IDMxNVQxNDMgMjUwUTE0MyAxNzYgMTgzIDEzMlQyOTEgODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJoIiBnbHlwaC1uYW1lPSJoIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNMTc1IDQwNVExOTkgNDQzIDIzOCA0NjhUMzM0IDQ5M1EzODIgNDkzIDQxNyA0NzhUNDc1IDQzNFQ1MDkgMzY4VDUyMCAyODVWMEg0MjFWMjc0UTQyMSAzMzcgMzkyIDM3MVQzMTAgNDA2UTI0OCA0MDYgMjEyIDM2OVQxNzUgMjY1VjBINzZWNjc2UTc2IDY3OCA4NiA2ODJUMTEyIDY4N1ExMjMgNjg3IDEzNCA2ODRUMTU1IDY3MVQxNjkgNjQ1VDE3NSA2MDJWNDA1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iaSIgZ2x5cGgtbmFtZT0iaSIgaG9yaXotYWR2LXg9IjI2MCIgZD0iTTgwIDQzOFE4MCA0NjUgOTIgNDc1VDEyNSA0ODZIMTM1UTE1NSA0ODYgMTY3IDQ3NlQxNzkgNDM4VjBIODBWNDM4Wk0xMzAgNTg0UTEwMiA1ODQgODcgNTk4VDcxIDYzOVE3MSA2NjYgODYgNjgwVDEzMSA2OTVRMTg5IDY5NSAxODkgNjM5UTE4OSA1ODQgMTMwIDU4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImoiIGdseXBoLW5hbWU9ImoiIGhvcml6LWFkdi14PSIyNjAiIGQ9Ik0zNSAtMjAwUS0xMyAtMjAwIC00MCAtMTgyVC02NyAtMTM2US02NyAtMTI2IC02NCAtMTE3VC01NiAtMTAyVC00OSAtOTNULTQ0IC05MFEtMzMgLTEwMSAtMTcgLTEwOVQyMCAtMTE4UTUyIC0xMTggNjYgLTEwMFQ4MCAtNDFWNDgxSDE3OVYtNDdRMTc5IC0xMjEgMTQzIC0xNjBUMzUgLTIwMFpNMTMwIDU4NFExMDIgNTg0IDg3IDU5OFQ3MSA2MzlRNzEgNjY2IDg2IDY4MFQxMzEgNjk1UTE4OSA2OTUgMTg5IDYzOVExODkgNTg0IDEzMCA1ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJrIiBnbHlwaC1uYW1lPSJrIiBob3Jpei1hZHYteD0iNTA0IiBkPSJNNzYgNjc2UTc2IDY3OCA4NiA2ODJUMTEyIDY4N1ExMjMgNjg3IDEzNCA2ODRUMTU1IDY3MVQxNjkgNjQ1VDE3NSA2MDJWMjY1TDM0MiA0NTJRMzU3IDQ3MSAzNzIgNDc4VDQwMSA0ODZRNDE0IDQ4NiA0MjQgNDgxVDQ0MSA0NjlUNDUwIDQ1NlQ0NTIgNDQ3TDI3NyAyNTRMNDc5IDM1UTQ4MCAzMyA0NzcgMjdUNDY2IDEzVDQ0OSAxVDQyNSAtNVE0MTEgLTUgMzk3IDJUMzY2IDI5TDE3NSAyMzVWMEg3NlY2NzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJsIiBnbHlwaC1uYW1lPSJsIiBob3Jpei1hZHYteD0iMjYwIiBkPSJNODAgNjc2UTgwIDY3OCA5MSA2ODJUMTE2IDY4N1ExMjggNjg3IDEzOSA2ODRUMTU5IDY3MVQxNzMgNjQ1VDE3OSA2MDJWMEg4MFY2NzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJtIiBnbHlwaC1uYW1lPSJtIiBob3Jpei1hZHYteD0iODk5IiBkPSJNMTEyIDQ4NlExMzMgNDg2IDE1MiA0NzJUMTc0IDQxMlExOTkgNDQ3IDIzNiA0NzBUMzIzIDQ5M1EzODIgNDkzIDQyMSA0NjdUNDgwIDM5MlE1MDUgNDM0IDU0NiA0NjNUNjQ3IDQ5M1E3MzkgNDkzIDc4MyA0NDFUODI4IDI5NVYwSDcyOVYyODNRNzI5IDQwNiA2MjMgNDA2UTU4NSA0MDYgNTUzIDM4NFQ1MDEgMzI2VjBINDAyVjI3OVE0MDIgNDA2IDI5NiA0MDZRMjU4IDQwNiAyMjYgMzg0VDE3NSAzMjZWMEg3NlY0NzVRNzYgNDc3IDg2IDQ4MVQxMTIgNDg2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgZ2x5cGgtbmFtZT0ibiIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTExMiA0ODZRMTM0IDQ4NiAxNTMgNDcxVDE3NCA0MDhRMTk5IDQ0NSAyMzggNDY5VDMzNCA0OTNRMzgyIDQ5MyA0MTcgNDc4VDQ3NSA0MzVUNTA5IDM3MFQ1MjAgMjg3VjBINDIxVjI3NVE0MjEgMzM2IDM5MiAzNzFUMzEwIDQwNlEyNjIgNDA2IDIyOCAzODNUMTc1IDMyMlYwSDc2VjQ3NVE3NiA0NzcgODYgNDgxVDExMiA0ODZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJvIiBnbHlwaC1uYW1lPSJvIiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMjk5IC0xM1EyNDMgLTEzIDE5NyA1VDExNyA1OFQ2NiAxMzhUNDcgMjQxUTQ3IDI5NiA2NSAzNDJUMTE3IDQyMlQxOTcgNDc0VDMwMCA0OTNRMzU1IDQ5MyA0MDEgNDc0VDQ4MCA0MjJUNTMyIDM0MVQ1NTEgMjM5UTU1MSAxODQgNTMzIDEzOFQ0ODEgNThUNDAxIDZUMjk5IC0xM1pNMjk5IDY4UTMzMyA2OCAzNjIgODFUNDEzIDExN1Q0NDcgMTcxVDQ1OSAyMzlRNDU5IDI3NiA0NDcgMzA4VDQxNCAzNjNUMzY0IDM5OVQyOTkgNDEyUTI2NCA0MTIgMjM1IDM5OVQxODQgMzY0VDE1MCAzMTBUMTM4IDI0MVExMzggMjA0IDE1MCAxNzNUMTg0IDExOFQyMzUgODFUMjk5IDY4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icCIgZ2x5cGgtbmFtZT0icCIgaG9yaXotYWR2LXg9IjYxNSIgZD0iTTc2IDQ3NVE3NiA0NzcgODYgNDgxVDExMiA0ODZRMTIzIDQ4NiAxMzQgNDgzVDE1MyA0NzBUMTY4IDQ0NFQxNzQgNDAyUTIwMiA0NDUgMjQzIDQ2OVQzNDMgNDkzUTM5MSA0OTMgNDMyIDQ3NVQ1MDQgNDI0VDU1MSAzNDVUNTY4IDI0MVE1NjggMTg0IDU1MSAxMzhUNTA0IDU4VDQzMiA2VDM0MCAtMTNRMjgwIC0xMyAyMzggMTRUMTc1IDc3Vi0xOTBINzZWNDc1Wk0zMjIgNjlRMzkwIDY5IDQzMSAxMTZUNDcyIDI0MFE0NzIgMjc3IDQ2MSAzMDhUNDMxIDM2M1QzODQgMzk4VDMyNCA0MTFRMjY4IDQxMSAyMzEgMzg0VDE3NCAzMTFWMjEwUTE3NCAxODAgMTg2IDE1NFQyMTggMTA5VDI2NSA4MFQzMjIgNjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJxIiBnbHlwaC1uYW1lPSJxIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNNDQwIDc4UTQxMSAzNSAzNzAgMTFUMjcyIC0xM1EyMjQgLTEzIDE4MyA1VDExMSA1NlQ2NCAxMzZUNDcgMjQwUTQ3IDI5NyA2NCAzNDNUMTExIDQyM1QxODMgNDc1VDI3NSA0OTNRMzM1IDQ5MyAzNzcgNDY5VDQ0MSA0MTJRNDQyIDQzNCA0NDggNDQ4VDQ2MiA0NzFUNDgxIDQ4M1Q1MDMgNDg2UTUxOCA0ODYgNTI4IDQ4MlQ1MzkgNDc1Vi0xOTFINDQwVjc4Wk0yOTEgNjlRMzIxIDY5IDM0OCA4MFQzOTYgMTEwVDQyOSAxNTVUNDQxIDIxMVYzMTFRNDIyIDM1NiAzODYgMzgzVDI5MyA0MTFRMjI1IDQxMSAxODQgMzY1VDE0MyAyNDBRMTQzIDIwMiAxNTQgMTcxVDE4NCAxMTdUMjMxIDgyVDI5MSA2OVoiICAvPgorPGdseXBoIHVuaWNvZGU9InIiIGdseXBoLW5hbWU9InIiIGhvcml6LWFkdi14PSI0MDIiIGQ9Ik0xMTIgNDg2UTEyMyA0ODYgMTM0IDQ4M1QxNTMgNDcwVDE2OCA0NDRUMTc0IDQwMlEyMDYgNDkzIDI5NiA0OTNRMzM0IDQ5MyAzNTQgNDc2VDM3NSA0MjlRMzc1IDQxNSAzNzEgNDA1VDM2MSAzODlUMzUxIDM4MFQzNDUgMzc4UTMzNCAzODcgMzE5IDM5M1QyODQgMzk5UTI1NSAzOTkgMjM0IDM4NlQyMDAgMzQ3VDE4MSAyODhUMTc1IDIxMlYwSDc2VjQ3NVE3NiA0NzcgODYgNDgxVDExMiA0ODZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJzIiBnbHlwaC1uYW1lPSJzIiBob3Jpei1hZHYteD0iNDk0IiBkPSJNMjQ0IC0xMlExOTQgLTEyIDE1NiAtM1Q5MyAyMlQ1NCA1NVQ0MSA5MFE0MSAxMDIgNDYgMTEwVDU5IDEyNVQ3MiAxMzNUODAgMTM1UTEwNCAxMDQgMTQ0IDg0VDI0MiA2M1EyOTMgNjMgMzIwIDgwVDM0OCAxMjhRMzQ4IDE0NiAzNDAgMTU4VDMxNiAxNzdUMjc3IDE5MVQyMjQgMjAzUTE5NyAyMDkgMTY4IDIxN1QxMTMgMjQwVDcyIDI3OVQ1NSAzNDJRNTUgNDEwIDEwNyA0NTFUMjQ3IDQ5M1EyOTMgNDkzIDMyNyA0ODRUMzg1IDQ2MVQ0MjAgNDMwVDQzMiAzOTZRNDMyIDM4NCA0MjYgMzc1VDQxMyAzNjBUMzk5IDM1MlQzOTIgMzUwUTM2OSAzODAgMzMzIDM5OVQyNTEgNDE4UTIwMCA0MTggMTc0IDQwMFQxNDcgMzUyUTE0NyAzMzUgMTU1IDMyNVQxNzggMzA3VDIxNSAyOTNUMjY3IDI4MVEyOTUgMjc1IDMyNiAyNjdUMzgzIDI0M1Q0MjYgMjAzVDQ0NCAxMzlRNDQ0IDcwIDM5MSAyOVQyNDQgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idCIgZ2x5cGgtbmFtZT0idCIgaG9yaXotYWR2LXg9IjQwMSIgZD0iTTM0IDQ4MUgxMTJWNTU1UTExMiA1ODEgMTI0IDU5MVQxNTYgNjAySDE2NlExODYgNjAyIDE5NyA1OTNUMjA5IDU1NVY0ODFIMzYwVjQwMEgyMDhWMTU3UTIwOCAxMTIgMjIyIDkwVDI3MiA2OFEyOTUgNjggMzEyIDc3VDM0MCAxMDJRMzQxIDEwMyAzNDUgMTAxVDM1NSA5NFQzNjQgODBUMzY4IDYwUTM2OCAzMiAzMzkgMTBUMjU2IC0xM1ExODEgLTEzIDE0NyAyN1QxMTIgMTQ2VjQwMEgzNFY0ODFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ1IiBnbHlwaC1uYW1lPSJ1IiBob3Jpei1hZHYteD0iNTkxIiBkPSJNNDgwIC00UTQ2OSAtNCA0NTggLTFUNDM4IDEwVDQyNCAzNFQ0MTcgNzJRMzkxIDM1IDM1MiAxMlQyNTcgLTEyUTIwOSAtMTIgMTc1IDNUMTE3IDQ2VDgzIDExMVQ3MiAxOTRWNDgxSDE3MFYyMDZRMTcwIDE0MyAyMDAgMTA5VDI4NSA3NFEzMzAgNzQgMzY0IDk3VDQxNyAxNTlWNDgxSDUxNVY3UTUxNSA1IDUwNSAxVDQ4MCAtNFoiICAvPgorPGdseXBoIHVuaWNvZGU9InYiIGdseXBoLW5hbWU9InYiIGhvcml6LWFkdi14PSI1MjkiIGQ9Ik0zODkgNDI3UTQwMiA0NjIgNDE2IDQ3NFQ0NTAgNDg2UTQ2MiA0ODYgNDcxIDQ4MlQ0ODggNDczVDQ5OCA0NjRUNTAxIDQ1N0wzMTYgMEgyMTVMMjggNDU3UTI2IDQ2MiA0MSA0NzRUODAgNDg2UTEwMSA0ODYgMTE1IDQ3NFQxNDMgNDI3TDI2NCA4OEwzODkgNDI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0idyIgZ2x5cGgtbmFtZT0idyIgaG9yaXotYWR2LXg9Ijc0MCIgZD0iTTM1IDQ1N1EzNCA0NTkgMzkgNDY0VDUyIDQ3NFQ3MiA0ODJUOTQgNDg2UTExMCA0ODYgMTI1IDQ3NVQxNDYgNDMzTDIyMSA5NkwzMTMgMzg3UTMxOCA0MDUgMzMyIDQxM1QzNzQgNDIyUTQwMSA0MjIgNDE1IDQxNFQ0MzQgMzg3TDUyMyA5OEw1OTcgNDMzUTYwMiA0NjQgNjE3IDQ3NVQ2NDggNDg2UTY1OSA0ODYgNjY5IDQ4MlQ2ODggNDczVDcwMCA0NjRUNzA1IDQ1N0w1NzYgMEg0NzVMMzcyIDMyMEwyNjYgMEgxNjVMMzUgNDU3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieCIgZ2x5cGgtbmFtZT0ieCIgaG9yaXotYWR2LXg9IjUxOSIgZD0iTTQ3OSAzMlE0ODAgMzAgNDc3IDI0VDQ2NyAxMlQ0NTAgMFQ0MjUgLTVRNDA1IC01IDM5MSA1VDM2NCAzNkwyNTcgMTg4TDE1MyAzN1ExMjcgLTUgOTEgLTVRNzggLTUgNjggMFQ1MCAxMlQzOSAyNFQzNyAzMkwxOTYgMjQwTDM5IDQ1MFEzOCA0NTIgNDEgNDU4VDUxIDQ3MFQ2OCA0ODFUOTIgNDg2UTExMiA0ODYgMTI2IDQ3NlQxNTQgNDQ1TDI2MSAyOTJMMzY2IDQ0NVEzODAgNDY4IDM5NiA0NzdUNDI3IDQ4NlE0NDAgNDg2IDQ1MSA0ODFUNDY5IDQ3MFQ0NzkgNDU3VDQ4MiA0NTBMMzIzIDI0MEw0NzkgMzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ5IiBnbHlwaC1uYW1lPSJ5IiBob3Jpei1hZHYteD0iNTI4IiBkPSJNMjE0IC0xOTVRMjAzIC0xOTUgMTk0IC0xOTJUMTc3IC0xODRUMTY1IC0xNzVUMTYyIC0xNjhMMjQyIDI3UTIyNSAyOSAyMTYgMzRUMjAwIDU1TDE4IDQ4MUgxMjBMMjczIDk4TDQwOSA0ODFINTEwTDI3NSAtMTQwUTI2MyAtMTcyIDI0NyAtMTgzVDIxNCAtMTk1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieiIgZ2x5cGgtbmFtZT0ieiIgaG9yaXotYWR2LXg9IjUxMiIgZD0iTTUwIDY2TDMzMCA0MDJIOTVRNTIgNDAyIDUyIDQzOFY0NDVRNTIgNDgxIDk1IDQ4MUg0NTdWNDE4TDE3MyA4MEg0MjJRNDY1IDgwIDQ2NSA0M1YzN1E0NjUgMCA0MjIgMEg1MFY2NloiICAvPgorPGdseXBoIHVuaWNvZGU9InsiIGdseXBoLW5hbWU9ImJyYWNlbGVmdCIgaG9yaXotYWR2LXg9IjQ2MyIgZD0iTTM4NCAtMTk5UTM0OCAtMTk5IDMwOSAtMTgxVDIzNyAtMTI0VDE4MCAtMjZUMTUyIDExN0w5NyAxNDdRODAgMTU2IDY5IDE2M1Q1MSAxNzhUNDIgMTk4VDM5IDIyN1EzOSAyNDQgNDIgMjU1VDUxIDI3NVQ2OSAyOTFUOTcgMzA3TDE1MiAzMzdRMTU3IDQxOSAxODAgNDc5VDIzNyA1NzdUMzEwIDYzNFQzODUgNjUzUTQwNiA2NTMgNDE4IDY0MlQ0MzEgNjEwUTQzMSA1OTcgNDI1IDU4N1Q0MTYgNTc2UTM2OSA1NjcgMzM4IDU0NVQyODYgNDg4VDI1NyA0MDNUMjQ2IDI5MUwxMjcgMjI3TDI0NSAxNjNRMjQ3IDEwMCAyNTYgNTFUMjg1IC0zM1QzMzYgLTkxVDQxNSAtMTIyUTQxOCAtMTIzIDQyNCAtMTMzVDQzMSAtMTU2UTQzMSAtMTc2IDQxOCAtMTg3VDM4NCAtMTk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifCIgZ2x5cGgtbmFtZT0iYmFyIiBob3Jpei1hZHYteD0iMjg2IiBkPSJNMTM4IC0xOThRMTE4IC0xOTggMTA2IC0xODhUOTMgLTE1MFY2MDZROTMgNjMzIDEwNSA2NDNUMTM4IDY1M0gxNDhRMTY4IDY1MyAxODAgNjQzVDE5MiA2MDZWLTE1MFExOTIgLTE3NyAxODAgLTE4N1QxNDggLTE5OEgxMzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ9IiBnbHlwaC1uYW1lPSJicmFjZXJpZ2h0IiBob3Jpei1hZHYteD0iNDYzIiBkPSJNNzggLTE5OVE1NyAtMTk5IDQ1IC0xODhUMzIgLTE1NlEzMiAtMTQzIDM4IC0xMzNUNDcgLTEyMlE5NCAtMTEzIDEyNSAtOTFUMTc3IC0zNFQyMDYgNTFUMjE3IDE2M0wzMzUgMjI3TDIxNyAyOTFRMjE1IDM1NCAyMDYgNDAzVDE3NyA0ODdUMTI2IDU0NVQ0NyA1NzZRNDQgNTc3IDM4IDU4N1QzMSA2MTBRMzEgNjMwIDQzIDY0MVQ3NyA2NTNRMTEzIDY1MyAxNTIgNjM1VDIyNSA1NzhUMjgxIDQ3OVQzMTAgMzM3TDM2NiAzMDdRMzgyIDI5OCAzOTMgMjkxVDQxMSAyNzZUNDIxIDI1NlQ0MjQgMjI3UTQyNCAyMTAgNDIyIDE5OVQ0MTIgMTc5VDM5NCAxNjNUMzY2IDE0N0wzMTEgMTE3UTMwNiAzNCAyODMgLTI1VDIyNiAtMTIzVDE1NCAtMTgwVDc4IC0xOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBnbHlwaC1uYW1lPSJhc2NpaXRpbGRlIiBob3Jpei1hZHYteD0iNTI5IiBkPSJNMTQ2IDE2NVExMjkgMTY1IDEyMCAxNzRUMTExIDIwMFExMTEgMjE5IDExNyAyMzZUMTMzIDI2N1QxNTggMjg4VDE4OSAyOTZRMjE2IDI5NiAyNTQgMjc3VDMzMyAyMjFRMzQxIDI0NyAzNTQgMjY4VDM4NCAyOTBRNDAxIDI5MCA0MTAgMjgxVDQxOSAyNTRRNDE5IDIzNSA0MTMgMjE4VDM5NyAxODhUMzcyIDE2N1QzNDEgMTU5UTMxMyAxNTkgMjc1IDE3OFQxOTcgMjM0UTE4OCAyMDggMTc2IDE4N1QxNDYgMTY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTA7IiBnbHlwaC1uYW1lPSJ1bmkwMEEwIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEExOyIgZ2x5cGgtbmFtZT0iZXhjbGFtZG93biIgaG9yaXotYWR2LXg9IjI5MCIgZD0iTTE1MSA0NTlRMTYyIDQ1OSAxNjcgNDUxVDE3NSA0MjVMMjA5IDBIODBMMTE1IDQyNVExMTcgNDQyIDEyMiA0NTBUMTQwIDQ1OUgxNTFaTTE1MiA2NTRRMjA2IDY1NCAyMDYgNjAwVjU4OFEyMDYgNTMzIDE1MiA1MzNIMTM5UTg0IDUzMyA4NCA1ODhWNjAwUTg0IDY1NCAxMzkgNjU0SDE1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEyOyIgZ2x5cGgtbmFtZT0iY2VudCIgZD0iTTMwNCAtOTlRMjg0IC05OSAyNzQgLTg5VDI2NCAtNTJWMjlRMTY1IDQzIDEwOSAxMDhUNTMgMjgyUTUzIDMzMiA2OCAzNzVUMTExIDQ1MVQxNzcgNTA1VDI2MyA1MzVWNjEyUTI2MyA2MzggMjczIDY0OVQzMDQgNjYwSDMwOVEzMjkgNjYwIDMzOSA2NDlUMzQ5IDYxMlY1MzhRMzkxIDUzNCA0MjMgNTIyVDQ3NiA0OTNUNTA3IDQ1OFQ1MTggNDIzUTUxOCA0MDggNTEwIDM5OFQ0OTMgMzgxVDQ3NSAzNzNUNDY1IDM3M1E0NDUgNDA5IDQxNyA0MzBUMzQ1IDQ1NlYxMDhRNDMzIDExOCA0NzEgMjAwUTQ3MiAyMDEgNDgxIDIwMFQ1MDAgMTkzVDUxOCAxNzhUNTI2IDE1M1E1MjYgMTM1IDUxNSAxMTVUNDgxIDc2VDQyNiA0NFQzNTAgMjZWLTUyUTM1MCAtNzggMzQwIC04OFQzMDkgLTk5SDMwNFpNMTQ5IDI4MlExNDkgMjE0IDE4MSAxNzFUMjY4IDExM1Y0NTNRMjEzIDQ0MCAxODEgMzk2VDE0OSAyODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMzsiIGdseXBoLW5hbWU9InN0ZXJsaW5nIiBob3Jpei1hZHYteD0iNjA5IiBkPSJNODggMjU3UTQ4IDI1NyA0OCAyOTJWMzAxUTQ4IDMxOCA1OSAzMjdUODggMzM3SDE2NEwxODkgNDcwUTIwNiA1NjEgMjU2IDYxMFQzOTIgNjYwUTQzNiA2NjAgNDY5IDY0OFQ1MjMgNjE3VDU1NiA1NzVUNTY3IDUyOVE1NjcgNTA4IDU1OCA0OTdUNTM3IDQ4MlQ1MTUgNDc3VDUwNSA0NzhRNDk1IDUyNCA0NjkgNTUwVDM5NSA1NzZRMzQzIDU3NiAzMTggNTQ4VDI4MSA0NjBMMjU4IDMzN0g0MDlRNDQ5IDMzNyA0NDkgMzAxVjI5MlE0NDkgMjU3IDQwOSAyNTdIMjQ0TDIxMyA4Nkg1MTFRNTU3IDg2IDU1NyA0NlY0MFE1NTcgMCA1MTEgMEg3N1EzMSAwIDMxIDQwVjQ3UTMxIDg2IDc3IDg2SDExOUwxNTAgMjU3SDg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBnbHlwaC1uYW1lPSJjdXJyZW5jeSIgaG9yaXotYWR2LXg9IjY1OCIgZD0iTTg1IDM2NlE2MyAzNjYgNTQgMzc0VDQ1IDM5OFY0MDZRNDUgNDIwIDU0IDQyOFQ4NSA0MzdIMTQzUTE2NCA1NDAgMjMyIDU5OVQ0MDEgNjU5UTQ1MCA2NTkgNDg4IDY0N1Q1NTMgNjE3VDU5NCA1NzZUNjA4IDUzM1E2MDggNTE4IDYwMCA1MDhUNTgzIDQ5MVQ1NjUgNDgzVDU1NSA0ODJRNTI5IDUyNyA0OTMgNTUwVDM5OSA1NzRRMzQwIDU3NCAzMDAgNTM4VDI0MiA0MzdINDMzUTQ1NSA0MzcgNDYzIDQyOVQ0NzIgNDA2VjM5OFE0NzIgMzgzIDQ2NCAzNzVUNDMzIDM2NkgyMzJWMjg1SDQzM1E0NTUgMjg1IDQ2MyAyNzZUNDcyIDI1M1YyNDVRNDcyIDIzMSA0NjQgMjIyVDQzMyAyMTNIMjQyUTI1OSAxNDggMzAxIDExMVQ0MDQgNzNRNDYyIDczIDQ5NyA5OVQ1NTcgMTczUTU1OCAxNzUgNTY2IDE3M1Q1ODUgMTY1VDYwMyAxNDdUNjExIDEyMVE2MTEgMTAxIDU5OCA3OFQ1NTggMzVUNDkzIDFUNDA1IC0xM1EyOTkgLTEzIDIzMSA0NlQxNDIgMjEzSDg1UTYzIDIxMyA1NCAyMjJUNDUgMjQ1VjI1M1E0NSAyNjcgNTQgMjc2VDg1IDI4NUgxMzVWMzY2SDg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTU7IiBnbHlwaC1uYW1lPSJ5ZW4iIGhvcml6LWFkdi14PSI2MTkiIGQ9Ik0xMTEgMjU1UTg4IDI1NSA3OSAyNjRUNzAgMjg4VjI5NlE3MCAzMTEgNzkgMzIwVDExMSAzMjlIMjMzTDU3IDYwOFE1NSA2MTEgNTggNjE4VDcwIDYzMlQ5MCA2NDZUMTIwIDY1MlExNTIgNjUyIDE3MCA2MTZMMzA5IDM2MUw0NTMgNjE1UTQ2NCA2MzUgNDc3IDY0M1Q1MDQgNjUyUTUxOSA2NTIgNTMwIDY0NlQ1NDkgNjMzVDU1OSA2MThUNTYxIDYwOEwzODYgMzI5SDUwN1E1MzAgMzI5IDUzOSAzMjBUNTQ4IDI5NlYyODhRNTQ4IDI3MyA1MzkgMjY0VDUwNyAyNTVIMzU2VjE4N0g1MDdRNTMwIDE4NyA1MzkgMTc4VDU0OCAxNTRWMTQ2UTU0OCAxMzEgNTM5IDEyMlQ1MDcgMTEzSDM1NlY0MlEzNTYgMTkgMzQ3IDdUMzE0IC01SDMwM1EyNjMgLTUgMjYzIDQyVjExM0gxMTFRODggMTEzIDc5IDEyMlQ3MCAxNDZWMTU0UTcwIDE2OSA3OSAxNzhUMTExIDE4N0gyNjNWMjU1SDExMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE2OyIgZ2x5cGgtbmFtZT0iYnJva2VuYmFyIiBob3Jpei1hZHYteD0iMjg2IiBkPSJNMTM4IDI1MlExMTggMjUyIDEwNiAyNjJUOTMgMzAwVjYwNlE5MyA2MzMgMTA1IDY0M1QxMzggNjUzSDE0OFExNjggNjUzIDE4MCA2NDNUMTkyIDYwNlYzMDBRMTkyIDI3MyAxODAgMjYzVDE0OCAyNTJIMTM4Wk0xMzggLTE5OFExMTggLTE5OCAxMDYgLTE4OFQ5MyAtMTUwVjE1NlE5MyAxODMgMTA1IDE5M1QxMzggMjAzSDE0OFExNjggMjAzIDE4MCAxOTNUMTkyIDE1NlYtMTUwUTE5MiAtMTc3IDE4MCAtMTg3VDE0OCAtMTk4SDEzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE3OyIgZ2x5cGgtbmFtZT0ic2VjdGlvbiIgaG9yaXotYWR2LXg9IjU3MiIgZD0iTTI3NiAtMTcwUTIxNiAtMTcwIDE3MyAtMTU4VDEwMiAtMTI4VDYxIC04OFQ0NyAtNDdRNDcgLTM1IDUzIC0yNlQ2NyAtOVQ4MSAxVDg5IDNRMTE2IC00MCAxNjMgLTY1VDI3NiAtOTBRMzM5IC05MCAzNzMgLTcwVDQwNyAtMTRRNDA3IDggMzk3IDIxVDM2NyA0NFQzMjAgNjFUMjU3IDc2UTIyMSA4NCAxODUgOTRUMTE4IDEyM1Q2OSAxNjhUNTAgMjM3UTUwIDI4NSA3OCAzMTdUMTU2IDM2N1ExMTggMzg0IDk1IDQxM1Q3MSA0OTNRNzEgNTMwIDg3IDU2MFQxMzMgNjEzVDIwMiA2NDdUMjkwIDY1OVEzNDYgNjU5IDM4NSA2NDhUNDQ5IDYxOVQ0ODUgNTgyVDQ5NyA1NDdRNDk3IDUzNCA0OTEgNTI0VDQ3NyA1MDhUNDYyIDQ5OFQ0NTQgNDk2UTQyNSA1MzUgMzg2IDU1N1QyOTMgNTgwUTI0MiA1ODAgMjA2IDU2MVQxNzAgNTAzUTE3MCA0NjQgMjEwIDQ0NVQzMjEgNDEwUTM1NiA0MDEgMzkyIDM5MVQ0NTcgMzYzVDUwNCAzMTlUNTIzIDI1MVE1MjMgMjAzIDQ5NSAxNzFUNDE4IDEyMVE0NTYgMTA0IDQ4MCA3NlQ1MDUgLTZRNTA1IC00MyA0ODkgLTczVDQ0MyAtMTI0VDM3MSAtMTU4VDI3NiAtMTcwWk0yNjkgMzM1UTI1OSAzMzYgMjQ2IDM0MFExOTcgMzMyIDE2OCAzMDZUMTM5IDI1MVExMzkgMjI3IDE1MiAyMTFUMTg5IDE4NVQyNDIgMTY3VDMwNiAxNTJMMzMxIDE0NlEzNzYgMTUzIDQwNCAxNzlUNDMzIDIzN1E0MzMgMjYxIDQyMCAyNzZUMzg1IDMwMlQzMzMgMzIwVDI2OSAzMzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBODsiIGdseXBoLW5hbWU9ImRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMzU4IDU0NlEzMjkgNTQ2IDMxMyA1NjFUMjk3IDYwNVEyOTcgNjM0IDMxMyA2NDlUMzU2IDY2NVEzODMgNjY1IDM5OSA2NTBUNDE2IDYwNVE0MTYgNTc3IDQwMCA1NjJUMzU4IDU0NlpNMTc0IDU0NlExNDcgNTQ2IDEzMSA1NjFUMTE0IDYwNVExMTQgNjM0IDEzMCA2NDlUMTcyIDY2NVEyMDEgNjY1IDIxNyA2NTBUMjMzIDYwNVEyMzMgNTc3IDIxNyA1NjJUMTc0IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE5OyIgZ2x5cGgtbmFtZT0iY29weXJpZ2h0IiBob3Jpei1hZHYteD0iNzgyIiBkPSJNMzkxIC0xM1EzMTggLTEzIDI1OCAxMlQxNTMgODFUODUgMTg3VDYwIDMyMlE2MCAzOTUgODUgNDU3VDE1NCA1NjRUMjU5IDYzNFQzOTIgNjYwUTQ2NSA2NjAgNTI1IDYzNVQ2MjkgNTY2VDY5NyA0NjBUNzIyIDMyNVE3MjIgMjUyIDY5NyAxOTBUNjI4IDgzVDUyNCAxM1QzOTEgLTEzWk0zOTIgNDFRNDUyIDQxIDUwMiA2MVQ1ODggMTE5VDY0MyAyMDhUNjYzIDMyM1E2NjMgMzg0IDY0MyA0MzZUNTg2IDUyNVQ0OTkgNTg0VDM5MCA2MDZRMzMwIDYwNiAyODAgNTg2VDE5NCA1MjhUMTM5IDQzOVQxMTkgMzI0UTExOSAyNjMgMTM5IDIxMVQxOTYgMTIyVDI4MyA2M1QzOTIgNDFaTTQwMCAxNDJRMzYxIDE0MiAzMjggMTU1VDI3MSAxOTJUMjM0IDI0OVQyMjAgMzIyUTIyMCAzNjEgMjM0IDM5NFQyNzIgNDUxVDMyOCA0ODhUMzk5IDUwMlE0NDEgNTAyIDQ3MCA0ODlUNTE0IDQ2MVE1MzMgNDQyIDUzMyA0MjFRNTMzIDQxMSA1MjcgNDAzVDUxNCAzOTBUNTAwIDM4M1Q0OTMgMzgzUTQ2MyA0MzMgNDAwIDQzM1EzNzkgNDMzIDM2MSA0MjVUMzI4IDQwMlQzMDUgMzY3VDI5NyAzMjNRMjk3IDI5OSAzMDUgMjc5VDMyOCAyNDNUMzYxIDIyMFQ0MDMgMjEyUTQzNyAyMTIgNDYwIDIyNlQ0OTYgMjY2UTQ5NyAyNjcgNTAzIDI2NlQ1MTcgMjU5VDUzMSAyNDZUNTM3IDIyN1E1MzcgMjA4IDUxNCAxODNRNTAwIDE2OCA0NzEgMTU1VDQwMCAxNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQTsiIGdseXBoLW5hbWU9Im9yZGZlbWluaW5lIiBob3Jpei1hZHYteD0iNDY1IiBkPSJNMTg3IDI1NVExMjEgMjU1IDg0IDI4NFQ0NiAzNjNRNDYgMzkyIDU3IDQxNVQ5OSA0NTVUMTgwIDQ4MlQzMTIgNDk3UTMxMiA1NDIgMjkwIDU2NlQyMTggNTkwUTE3NyA1OTAgMTUyIDU3MVQxMTMgNTI2UTExMyA1MjUgMTA1IDUyNlQ4NyA1MzBUNjkgNTQyVDYxIDU2NFE2MSA1NzggNzAgNTk1VDEwMCA2MjZUMTUxIDY1MFQyMjQgNjYwUTMxNCA2NjAgMzU1IDYxN1QzOTcgNDk3VjI2OVEzOTcgMjY2IDM4OCAyNjNUMzY2IDI2MFEzNDYgMjYwIDMzMiAyNzFUMzE1IDMxOFEyOTUgMjg5IDI2MSAyNzJUMTg3IDI1NVpNMjE5IC03UTE3MCAtNyAxNzAgNDJWNTJRMTcwIDEwMSAyMTkgMTAxSDIzMFEyODAgMTAxIDI4MCA1MlY0MlEyODAgLTcgMjMwIC03SDIxOVpNMjA5IDMxN1EyMzEgMzE3IDI1MCAzMjRUMjgzIDM0M1QzMDUgMzcwVDMxMyA0MDJWNDQ3UTI1NiA0NDMgMjIwIDQzNlQxNjQgNDIwVDEzNiAzOTdUMTI5IDM2OVExMjkgMzQ1IDE1MCAzMzFUMjA5IDMxN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFCOyIgZ2x5cGgtbmFtZT0iZ3VpbGxlbW90bGVmdCIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTQ1MiA3MlE0MjggNzIgMzk1IDk2VDMzMyAxNTJUMjgyIDIxMFQyNjEgMjQ0UTI2MSAyNDggMjcwIDI2MlQyOTYgMjk1VDMzMiAzMzVUMzc0IDM3NVQ0MTUgNDA0VDQ1MiA0MTZINDU0UTQ3MSA0MTYgNDgwIDQwNlQ0OTAgMzgxVjM3OFE0OTAgMzY2IDQ3NyAzNTBUNDQzIDMxN1QzOTYgMjgwVDM0MyAyNDNRMzcwIDIyNSAzOTYgMjA3VDQ0MyAxNzFUNDc3IDEzOFQ0OTAgMTEwVjEwNlE0OTAgOTIgNDgxIDgyVDQ1NCA3Mkg0NTJaTTIyOSA4OVEyMTQgODkgMTk2IDk5VDE1OCAxMjZUMTIxIDE2MVQ4OCAxOTdUNjQgMjI3VDU1IDI0NFE1NSAyNDcgNjQgMjYwVDg3IDI5MFQxMjAgMzI3VDE1OCAzNjJUMTk1IDM4OFQyMjkgMzk5SDIzMVEyNDUgMzk5IDI1NCAzOTBUMjYzIDM2N1YzNjVRMjYzIDM1NCAyNTIgMzQwVDIyMiAzMDlUMTgwIDI3NlQxMzIgMjQzUTE1NiAyMjcgMTc5IDIxMVQyMjEgMTc4VDI1MSAxNDhUMjYzIDEyMlYxMjFRMjYzIDEwNyAyNTQgOThUMjMxIDg5SDIyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFDOyIgZ2x5cGgtbmFtZT0ibG9naWNhbG5vdCIgaG9yaXotYWR2LXg9IjYwMCIgZD0iTTQ5IDM4MEg1NDNWOTZINDUzVjI5N0g0OVYzODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRDsiIGdseXBoLW5hbWU9InVuaTAwQUQiIGhvcml6LWFkdi14PSI0MjMiIGQ9Ik01NiAyODlIMzY3VjE5OEg1NlYyODlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRTsiIGdseXBoLW5hbWU9InJlZ2lzdGVyZWQiIGhvcml6LWFkdi14PSI3ODIiIGQ9Ik0zOTEgLTEzUTMxOCAtMTMgMjU4IDEyVDE1MyA4MVQ4NSAxODdUNjAgMzIyUTYwIDM5NSA4NSA0NTdUMTU0IDU2NFQyNTkgNjM0VDM5MiA2NjBRNDY1IDY2MCA1MjUgNjM1VDYyOSA1NjZUNjk3IDQ2MFQ3MjIgMzI1UTcyMiAyNTIgNjk3IDE5MFQ2MjggODNUNTI0IDEzVDM5MSAtMTNaTTM5MiA0MVE0NTIgNDEgNTAyIDYxVDU4OCAxMTlUNjQzIDIwOFQ2NjMgMzIzUTY2MyAzODQgNjQzIDQzNlQ1ODYgNTI1VDQ5OSA1ODRUMzkwIDYwNlEzMzAgNjA2IDI4MCA1ODZUMTk0IDUyOFQxMzkgNDM5VDExOSAzMjRRMTE5IDI2MyAxMzkgMjExVDE5NiAxMjJUMjgzIDYzVDM5MiA0MVpNNDk3IDE0OFE0ODYgMTQ4IDQ3MyAxNTRUNDQ5IDE3NkwzNzMgMjc2SDMzM1YxODRRMzMzIDE0OSAzMDEgMTQ5SDI5MFEyNzQgMTQ5IDI2NiAxNjBUMjU4IDE5MVY0NTdRMjU4IDQ5OSAyOTggNDk5SDQwNFE0NzIgNDk5IDUwNyA0NzJUNTQzIDM4OVE1NDMgMzQ3IDUxOSAzMjBUNDUwIDI4NUw1MzkgMTc3UTU0MCAxNzUgNTM3IDE3MVQ1MjkgMTYxVDUxNSAxNTJUNDk3IDE0OFpNMzMyIDMzNEg0MDNRNDM1IDMzNCA0NTEgMzQ4VDQ2OCAzODZRNDY4IDQzOCA0MDAgNDM4SDMzMlYzMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRjsiIGdseXBoLW5hbWU9InVuaTAwQUYiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0xNTggNTYyUTEwOCA1NjIgMTA4IDYwMVY2MDdRMTA4IDYyNSAxMjEgNjM0VDE1OCA2NDRIMzcyUTQyMiA2NDQgNDIyIDYwN1Y2MDFRNDIyIDU2MiAzNzIgNTYySDE1OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIwOyIgZ2x5cGgtbmFtZT0iZGVncmVlIiBob3Jpei1hZHYteD0iNDI5IiBkPSJNMjEzIDM0M1ExNzkgMzQzIDE1MSAzNTRUMTAyIDM4NlQ3MCA0MzVUNTggNDk3VjUwNlE1OCA1NDAgNzAgNTY4VDEwMyA2MTdUMTUzIDY0OVQyMTYgNjYxUTI1MCA2NjEgMjc4IDY1MFQzMjcgNjE4VDM1OSA1NjlUMzcxIDUwN1Y0OThRMzcxIDQ2NCAzNTkgNDM2VDMyNiAzODdUMjc2IDM1NVQyMTMgMzQzWk0yMTYgNDA2UTI1MiA0MDYgMjc2IDQzMVQzMDEgNDk2VjUwN1EzMDEgNTQ3IDI3NiA1NzJUMjE0IDU5OFExNzcgNTk4IDE1MyA1NzNUMTI4IDUwOFY0OTdRMTI4IDQ1NyAxNTQgNDMyVDIxNiA0MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMTsiIGdseXBoLW5hbWU9InBsdXNtaW51cyIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTE0MyAzOTVRMTIwIDM5NSAxMTAgNDA1VDEwMCA0MzJWNDM4UTEwMCA0NTUgMTEwIDQ2NVQxNDMgNDc1SDI3M1Y2MDNRMjczIDYyNiAyODMgNjM2VDMxMSA2NDZIMzE4UTMzNSA2NDYgMzQ1IDYzNlQzNTYgNjAzVjQ3NUg0ODZRNTA5IDQ3NSA1MTkgNDY1VDUyOSA0MzhWNDMyUTUyOSA0MTUgNTE5IDQwNVQ0ODYgMzk1SDM1NlYyNjRRMzU2IDI0MSAzNDYgMjMxVDMxOCAyMjFIMzExUTI5NCAyMjEgMjg0IDIzMVQyNzMgMjY0VjM5NUgxNDNaTTEzMyA5NVExMTAgOTUgMTAwIDEwNVQ5MCAxMzJWMTQwUTkwIDE1NyAxMDAgMTY3VDEzMyAxNzdINDk2UTUxOSAxNzcgNTI5IDE2N1Q1MzkgMTQwVjEzMlE1MzkgMTE1IDUyOSAxMDVUNDk2IDk1SDEzM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIyOyIgZ2x5cGgtbmFtZT0idHdvc3VwZXJpb3IiIGhvcml6LWFkdi14PSIzNjYiIGQ9Ik0yMTcgNDI5UTE5OCA0MjEgMTgxIDQxNFQxNTAgMzk4VDEyNyAzNzhUMTE1IDM1MUgyODZRMzI0IDM1MSAzMjQgMzIwVjMxN1EzMjQgMjg1IDI4NiAyODVIOThRNjkgMjg1IDU5IDI5NFQ0OSAzMjZWMzQzUTQ5IDM3MCA1OCAzOTBUODIgNDI0VDExNyA0NTBUMTYwIDQ3MlExOTQgNDg5IDIxOCA1MDJUMjQzIDU0MVEyNDMgNTY0IDIyNyA1NzdUMTgxIDU5MVExNDYgNTkxIDEyOCA1NzFUMTA0IDUyNlExMDQgNTI1IDk2IDUyNVQ3NyA1MjhUNTkgNTM5VDUwIDU2MlE1MCA1NzggNTkgNTk0VDg1IDYyNFQxMjggNjQ2VDE4NyA2NTVRMjUwIDY1NSAyODUgNjI2VDMyMCA1NDNRMzIwIDUxOCAzMTIgNTAwVDI4OSA0NzBUMjU2IDQ0OFQyMTcgNDI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjM7IiBnbHlwaC1uYW1lPSJ0aHJlZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iMzY2IiBkPSJNMzIxIDM4OFEzMjEgMzM2IDI4MyAzMDdUMTczIDI3OFExNDAgMjc4IDExNSAyODVUNzEgMzA1VDQ0IDMzMVQzNSAzNjBRMzUgMzc1IDQyIDM4M1Q1OCAzOTZUNzQgNDAwVDgzIDM5OFE5MSAzNzAgMTE0IDM1NVQxNzIgMzQwUTIwNiAzNDAgMjI3IDM1NFQyNDggMzkzUTI0OCA0MTggMjMwIDQzMVQxNzkgNDQ0SDE1OVExMzkgNDQ0IDEzMSA0NTFUMTIyIDQ3MVY0NzZRMTIyIDUwMyAxNTggNTAzSDE4NlEyMTEgNTAzIDIyNiA1MTRUMjQyIDU0NlEyNDIgNTY3IDIyMiA1ODBUMTcxIDU5M1ExMzYgNTkzIDExOCA1NzdUOTEgNTQwUTkxIDUzOSA4NCA1MzlUNjcgNTQzVDUxIDU1NVQ0NCA1NzhRNDQgNjA3IDc4IDYzMVQxNzMgNjU1UTI0MiA2NTUgMjc3IDYyOVQzMTMgNTU1UTMxMyA0OTcgMjUxIDQ3OVEzMjEgNDU2IDMyMSAzODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNDsiIGdseXBoLW5hbWU9ImFjdXRlIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMTkxIDU1NVExODkgNTU4IDE5OCA1NzNUMjI1IDYxMFQyNjQgNjUzVDMxMSA2OTJRMzM3IDcwOSAzNTkgNzA5UTM3OCA3MDkgMzkxIDY5OFQ0MDQgNjcwUTQwNCA2NTMgMzk0IDYzOFQzNjIgNjA5UTMzNSA1OTEgMzA2IDU4MFQyNTIgNTYxVDIxMCA1NTNUMTkxIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI1OyIgZ2x5cGgtbmFtZT0idW5pMDBCNSIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NCAzUTE3MyA0IDE3MSA1Vi0zMTJINzJWNDgxSDE3MFYyMDZRMTcwIDE0MyAyMDAgMTA5VDI4NSA3NFEzMzAgNzQgMzY0IDk3VDQxNyAxNTlWNDgxSDUxNVY3UTUxNSA1IDUwNSAxVDQ4MCAtNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI2OyIgZ2x5cGgtbmFtZT0icGFyYWdyYXBoIiBob3Jpei1hZHYteD0iNjUwIiBkPSJNNTIxIC01UTQ4OCAtNSA0ODggMzFWNjE2UTQ4OCA2NTIgNTIxIDY1Mkg1MzJRNTY3IDY1MiA1NjcgNjE2VjMxUTU2NyAtNSA1MzIgLTVINTIxWk0zODcgLTVRMzcwIC01IDM2MiA1VDM1MyAzMVYyODVIMjc4UTE2MyAyODUgMTAzIDMzMFQ0MyA0NjVRNDMgNTU2IDEwMSA2MDNUMjc0IDY1MEgzODdRNDA3IDY1MCA0MTkgNjM4VDQzMSA2MDZWMzFRNDMxIC01IDM5OCAtNUgzODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNzsiIGdseXBoLW5hbWU9InVuaTAwQjciIGhvcml6LWFkdi14PSIyNjIiIGQ9Ik0xMjMgMTg0UTY5IDE4NCA2OSAyMzdWMjQ5UTY5IDMwNCAxMjMgMzA0SDEzN1ExOTIgMzA0IDE5MiAyNDlWMjM3UTE5MiAxODQgMTM3IDE4NEgxMjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCODsiIGdseXBoLW5hbWU9ImNlZGlsbGEiIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0yMTggLTIyNFEyMTIgLTIyOSAyMDIgLTIzMFQxODMgLTIyOVQxNjkgLTIyMFQxNjggLTIwNUwyMjEgLTg3UTIyOSAtNjggMjM4IC01OFQyNzQgLTQ4SDI4M1EzMDMgLTQ4IDMxNiAtNTdUMzI5IC04M1YtODhRMzI5IC05OCAzMjEgLTEwOFQyOTcgLTEzNEwyMTggLTIyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI5OyIgZ2x5cGgtbmFtZT0ib25lc3VwZXJpb3IiIGhvcml6LWFkdi14PSIzNjYiIGQ9Ik05NSAyODVRNTggMjg1IDU4IDMxN1YzMThRNTggMzUyIDk1IDM1MkgxNThWNTUxUTEzOCA1MzQgMTExIDUzNFE4OSA1MzQgNzIgNTQ3VDU0IDU4MlE1NCA1OTIgNTcgNTk5VDY1IDYxMlQ3MyA2MjBUNzggNjIyUTg2IDYxNCA5NCA2MTBUMTE2IDYwNlExMzYgNjA2IDE1MSA2MThUMTcwIDY1MUgxOTdRMjMzIDY1MSAyMzMgNjEzVjM1MkgyODNRMzIxIDM1MiAzMjEgMzE4VjMxN1EzMjEgMjg1IDI4MyAyODVIOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQTsiIGdseXBoLW5hbWU9Im9yZG1hc2N1bGluZSIgaG9yaXotYWR2LXg9IjUwOCIgZD0iTTI1NCAyNTRRMjEwIDI1NCAxNzMgMjY5VDExMCAzMTJUNjggMzc2VDUzIDQ1NlE1MyA0OTggNjggNTM1VDExMSA2MDBUMTc1IDY0NFQyNTUgNjYwUTI5OCA2NjAgMzM1IDY0NVQzOTggNjAyVDQ0MCA1MzdUNDU1IDQ1N1E0NTUgNDE0IDQ0MCAzNzdUMzk3IDMxM1QzMzQgMjcwVDI1NCAyNTRaTTI0NyAtN1ExOTggLTcgMTk4IDQyVjUyUTE5OCAxMDEgMjQ3IDEwMUgyNThRMzA4IDEwMSAzMDggNTJWNDJRMzA4IC03IDI1OCAtN0gyNDdaTTI1NSAzMjZRMjgxIDMyNiAzMDMgMzM2VDM0MSAzNjNUMzY2IDQwNVQzNzUgNDU3UTM3NSA0ODUgMzY2IDUwOVQzNDEgNTUwVDMwMiA1NzhUMjU1IDU4OFEyMjkgNTg4IDIwNyA1NzhUMTY4IDU1MVQxNDIgNTA5VDEzMyA0NTdRMTMzIDQzMCAxNDIgNDA2VDE2OCAzNjRUMjA3IDMzNlQyNTUgMzI2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RyaWdodCIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTMxOCA4OVEzMDMgODkgMjk1IDk4VDI4NiAxMjFWMTIzUTI4NiAxMzQgMjk3IDE0OFQzMjcgMTc5VDM2OSAyMTJUNDE2IDI0NVEzOTIgMjYxIDM2OSAyNzdUMzI4IDMxMFQyOTggMzQwVDI4NiAzNjZWMzY3UTI4NiAzODEgMjk0IDM5MFQzMTggMzk5SDMxOVEzMzQgMzk5IDM1MiAzODlUMzkwIDM2MlQ0MjggMzI3VDQ2MSAyOTFUNDg1IDI2MFQ0OTQgMjQ0UTQ5NCAyNDAgNDg1IDIyOFQ0NjIgMTk4VDQyOSAxNjFUMzkxIDEyNlQzNTMgMTAwVDMxOSA4OUgzMThaTTk1IDcyUTc4IDcyIDY5IDgyVDU5IDEwN1YxMTBRNTkgMTIyIDcyIDEzOFQxMDYgMTcxVDE1MyAyMDhUMjA2IDI0NVExNzkgMjYzIDE1MyAyODFUMTA2IDMxN1Q3MiAzNTBUNTkgMzc4VjM4MlE1OSAzOTYgNjggNDA2VDk1IDQxNkg5NlExMTIgNDE2IDEzMiA0MDVUMTc0IDM3NVQyMTYgMzM2VDI1MiAyOTZUMjc3IDI2M1QyODcgMjQ0UTI4NyAyNDAgMjc4IDIyNlQyNTIgMTkzVDIxNiAxNTNUMTc1IDExM1QxMzMgODRUOTYgNzJIOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGdseXBoLW5hbWU9Im9uZXF1YXJ0ZXIiIGhvcml6LWFkdi14PSI4MjIiIGQ9Ik05NSAyODVRNTggMjg1IDU4IDMxN1YzMThRNTggMzUyIDk1IDM1MkgxNThWNTUxUTEzOCA1MzQgMTExIDUzNFE4OSA1MzQgNzIgNTQ3VDU0IDU4MlE1NCA1OTIgNTcgNTk5VDY1IDYxMlQ3MyA2MjBUNzggNjIyUTg2IDYxNCA5NCA2MTBUMTE2IDYwNlExMzYgNjA2IDE1MSA2MThUMTcwIDY1MUgxOTdRMjMzIDY1MSAyMzMgNjEzVjM1MkgyODNRMzIxIDM1MiAzMjEgMzE4VjMxN1EzMjEgMjg1IDI4MyAyODVIOTVaTTE2MCAwUTE2MCAxNCAxNjQgMjNUMTgzIDUyUTE4OSA1OSAyMTAgODVUMjYyIDE0N1QzMjYgMjIzVDM5MCAzMDJRNDA1IDMyMSA0MjQgMzQ1VDQ2NSAzOTVUNTA4IDQ1MFQ1NTIgNTA1UTYwMSA1NjcgNjU0IDYzNFE2NTUgNjM1IDY2MCA2MzVUNjcyIDYzMlQ2ODQgNjIzVDY5MCA2MDZRNjkwIDU5NSA2ODUgNTgzVDY2NSA1NTRRNjU5IDU0NiA2MzggNTIwVDU4NyA0NThUNTIzIDM4MVQ0NTkgMzAyUTQ0NCAyODMgNDI1IDI1OVQzODQgMjA4VDM0MCAxNTNUMjk3IDk5UTI0OCAzNyAxOTYgLTI5UTE5NCAtMzEgMTg5IC0zMVQxNzcgLTI3VDE2NSAtMTdUMTYwIDBaTTY5NyAtNFE2ODAgLTQgNjcyIDZUNjY0IDM0VjkwSDUzMFE1MDggOTAgNDk2IDk5VDQ4MyAxMjRWMTM4UTQ4NCAxNDkgNDg4IDE1OFQ1MDEgMTgxTDYxMSAzMzVRNjIyIDM1NSA2MzUgMzYwVDY3OSAzNjZRNzEwIDM2NiA3MjIgMzU1VDczNSAzMTRWMTUxSDc2NFE3OTkgMTUxIDc5OSAxMjJWMTE5UTc5OSA5MCA3NjQgOTBINzM1VjM0UTczNSAtNCA3MDEgLTRINjk3Wk01NTIgMTUwSDY2N0w2NjYgMzEwTDU1MiAxNTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRDsiIGdseXBoLW5hbWU9Im9uZWhhbGYiIGhvcml6LWFkdi14PSI4MjIiIGQ9Ik02NzMgMTQ0UTY1NCAxMzYgNjM3IDEyOVQ2MDYgMTEzVDU4MyA5M1Q1NzEgNjZINzQyUTc4MCA2NiA3ODAgMzVWMzJRNzgwIDAgNzQyIDBINTU0UTUyNSAwIDUxNSA5VDUwNSA0MVY1OFE1MDUgODUgNTE0IDEwNVQ1MzggMTM5VDU3MyAxNjVUNjE2IDE4N1E2NTAgMjA0IDY3NCAyMTdUNjk5IDI1NlE2OTkgMjc5IDY4MyAyOTJUNjM3IDMwNlE2MDIgMzA2IDU4NCAyODZUNTYwIDI0MVE1NjAgMjQwIDU1MiAyNDBUNTMzIDI0M1Q1MTUgMjU0VDUwNiAyNzdRNTA2IDI5MyA1MTUgMzA5VDU0MSAzMzlUNTg0IDM2MVQ2NDMgMzcwUTcwNiAzNzAgNzQxIDM0MVQ3NzYgMjU4UTc3NiAyMzMgNzY4IDIxNVQ3NDUgMTg1VDcxMiAxNjNUNjczIDE0NFpNOTUgMjg1UTU4IDI4NSA1OCAzMTdWMzE4UTU4IDM1MiA5NSAzNTJIMTU4VjU1MVExMzggNTM0IDExMSA1MzRRODkgNTM0IDcyIDU0N1Q1NCA1ODJRNTQgNTkyIDU3IDU5OVQ2NSA2MTJUNzMgNjIwVDc4IDYyMlE4NiA2MTQgOTQgNjEwVDExNiA2MDZRMTM2IDYwNiAxNTEgNjE4VDE3MCA2NTFIMTk3UTIzMyA2NTEgMjMzIDYxM1YzNTJIMjgzUTMyMSAzNTIgMzIxIDMxOFYzMTdRMzIxIDI4NSAyODMgMjg1SDk1Wk0xMzIgMFExMzIgMTQgMTM2IDIzVDE1NSA1MlExNjEgNTkgMTgyIDg1VDIzNCAxNDdUMjk4IDIyM1QzNjIgMzAyUTM3NyAzMjEgMzk2IDM0NVQ0MzcgMzk1VDQ4MCA0NTBUNTI0IDUwNVE1NzMgNTY3IDYyNiA2MzRRNjI3IDYzNSA2MzIgNjM1VDY0NCA2MzJUNjU2IDYyM1Q2NjIgNjA2UTY2MiA1OTUgNjU3IDU4M1Q2MzcgNTU0UTYzMSA1NDYgNjEwIDUyMFQ1NTkgNDU4VDQ5NSAzODFUNDMxIDMwMlE0MTYgMjgzIDM5NyAyNTlUMzU2IDIwOFQzMTIgMTUzVDI2OSA5OVEyMjAgMzcgMTY4IC0yOVExNjYgLTMxIDE2MSAtMzFUMTQ5IC0yN1QxMzcgLTE3VDEzMiAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBnbHlwaC1uYW1lPSJ0aHJlZXF1YXJ0ZXJzIiBob3Jpei1hZHYteD0iODIyIiBkPSJNNjk3IC00UTY4MCAtNCA2NzIgNlQ2NjQgMzRWOTBINTMwUTUwOCA5MCA0OTYgOTlUNDgzIDEyNFYxMzhRNDg0IDE0OSA0ODggMTU4VDUwMSAxODFMNjExIDMzNVE2MjIgMzU1IDYzNSAzNjBUNjc5IDM2NlE3MTAgMzY2IDcyMiAzNTVUNzM1IDMxNFYxNTFINzY0UTc5OSAxNTEgNzk5IDEyMlYxMTlRNzk5IDkwIDc2NCA5MEg3MzVWMzRRNzM1IC00IDcwMSAtNEg2OTdaTTMyMSAzODhRMzIxIDMzNiAyODMgMzA3VDE3MyAyNzhRMTQwIDI3OCAxMTUgMjg1VDcxIDMwNVQ0NCAzMzFUMzUgMzYwUTM1IDM3NSA0MiAzODNUNTggMzk2VDc0IDQwMFQ4MyAzOThROTEgMzcwIDExNCAzNTVUMTcyIDM0MFEyMDYgMzQwIDIyNyAzNTRUMjQ4IDM5M1EyNDggNDE4IDIzMCA0MzFUMTc5IDQ0NEgxNTlRMTM5IDQ0NCAxMzEgNDUxVDEyMiA0NzFWNDc2UTEyMiA1MDMgMTU4IDUwM0gxODZRMjExIDUwMyAyMjYgNTE0VDI0MiA1NDZRMjQyIDU2NyAyMjIgNTgwVDE3MSA1OTNRMTM2IDU5MyAxMTggNTc3VDkxIDU0MFE5MSA1MzkgODQgNTM5VDY3IDU0M1Q1MSA1NTVUNDQgNTc4UTQ0IDYwNyA3OCA2MzFUMTczIDY1NVEyNDIgNjU1IDI3NyA2MjlUMzEzIDU1NVEzMTMgNDk3IDI1MSA0NzlRMzIxIDQ1NiAzMjEgMzg4Wk0xNTggMFExNTggMTQgMTYyIDIzVDE4MSA1MlExODcgNTkgMjA4IDg1VDI2MCAxNDdUMzI0IDIyM1QzODggMzAyUTQwMyAzMjEgNDIyIDM0NVQ0NjMgMzk1VDUwNiA0NTBUNTUwIDUwNVE1OTkgNTY3IDY1MiA2MzRRNjUzIDYzNSA2NTggNjM1VDY3MCA2MzJUNjgyIDYyM1Q2ODggNjA2UTY4OCA1OTUgNjgzIDU4M1Q2NjMgNTU0UTY1NyA1NDYgNjM2IDUyMFQ1ODUgNDU4VDUyMSAzODFUNDU3IDMwMlE0NDIgMjgzIDQyMyAyNTlUMzgyIDIwOFQzMzggMTUzVDI5NSA5OVEyNDYgMzcgMTk0IC0yOVExOTIgLTMxIDE4NyAtMzFUMTc1IC0yN1QxNjMgLTE3VDE1OCAwWk01NTIgMTUwSDY2N0w2NjYgMzEwTDU1MiAxNTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRjsiIGdseXBoLW5hbWU9InF1ZXN0aW9uZG93biIgaG9yaXotYWR2LXg9IjUwOSIgZD0iTTMyMSA0NTBWNDQ4VjQzOFEzMTcgMzkyIDMwMiAzNjFUMjY3IDMwOVQyMjUgMjcyVDE4MyAyNDJUMTUyIDIxMFQxMzkgMTY2UTEzOSAxMjMgMTY4IDk4VDI1MiA3MlEyODggNzIgMzEzIDgzVDM1NSAxMTJUMzgxIDE1M1QzOTQgMTk5UTM5NCAyMDAgNDA1IDIwMFQ0MjkgMTk0VDQ1MyAxNzhUNDY0IDE0NlE0NjQgMTIzIDQ1MiA5NlQ0MTMgNDRUMzQ2IDRUMjUwIC0xMlEyMDEgLTEyIDE2MyAwVDk3IDM1VDU2IDg5VDQxIDE1OFE0MSAxOTkgNTUgMjI3VDkyIDI3NVQxMzkgMzEzVDE4NyAzNDhUMjIzIDM5MVQyMzggNDUwSDMyMVpNMjg0IDY1NFEzMzggNjU0IDMzOCA2MDBWNTg4UTMzOCA1MzMgMjg0IDUzM0gyNzBRMjE1IDUzMyAyMTUgNTg4VjYwMFEyMTUgNjU0IDI3MCA2NTRIMjg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzA7IiBnbHlwaC1uYW1lPSJBZ3JhdmUiIGhvcml6LWFkdi14PSI2NjAiIGQ9Ik00NTcgMTkwSDE5OEwxMjUgMEgyMEwyNTggNjIwUTI2NCA2MzYgMjc5IDY0NFQzMjkgNjUzUTM2NSA2NTMgMzc5IDY0NVQ0MDAgNjIwTDY0MiAwSDUzMUw0NTcgMTkwWk0yMjMgMjczSDQzMUwzMjcgNTQ3TDIyMyAyNzNaTTIwOCA3NzVRMTY1IDgwMSAxNjUgODM2UTE2NSA4NTMgMTc4IDg2NFQyMTAgODc1UTIzNSA4NzUgMjU4IDg1OFEyODIgODQyIDMwNSA4MjBUMzQ1IDc3NlQzNzEgNzQwVDM3OSA3MjFRMzc3IDcxOCAzNjAgNzE5VDMxOCA3MjdUMjY0IDc0NVQyMDggNzc1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzE7IiBnbHlwaC1uYW1lPSJBYWN1dGUiIGhvcml6LWFkdi14PSI2NjAiIGQ9Ik00NTcgMTkwSDE5OEwxMjUgMEgyMEwyNTggNjIwUTI2NCA2MzYgMjc5IDY0NFQzMjkgNjUzUTM2NSA2NTMgMzc5IDY0NVQ0MDAgNjIwTDY0MiAwSDUzMUw0NTcgMTkwWk0yMjMgMjczSDQzMUwzMjcgNTQ3TDIyMyAyNzNaTTI3MSA3MjFRMjY5IDcyNCAyNzggNzM5VDMwNSA3NzZUMzQ0IDgxOVQzOTEgODU4UTQxNyA4NzUgNDM5IDg3NVE0NTggODc1IDQ3MSA4NjRUNDg0IDgzNlE0ODQgODE5IDQ3NCA4MDRUNDQyIDc3NVE0MTUgNzU3IDM4NiA3NDZUMzMyIDcyN1QyOTAgNzE5VDI3MSA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMjsiIGdseXBoLW5hbWU9IkFjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjYwIiBkPSJNNDU3IDE5MEgxOThMMTI1IDBIMjBMMjU4IDYyMFEyNjQgNjM2IDI3OSA2NDRUMzI5IDY1M1EzNjUgNjUzIDM3OSA2NDVUNDAwIDYyMEw2NDIgMEg1MzFMNDU3IDE5MFpNMjIzIDI3M0g0MzFMMzI3IDU0N0wyMjMgMjczWk0yMjEgNzEzUTIwNyA3MTMgMTk4IDcyMlQxODkgNzQ1UTE4OSA3NjUgMjA4IDc5MFQyNTEgODM4VDI5OCA4NzZUMzI5IDg5NFEzMzYgODkyIDM1OSA4NzdUNDA2IDgzOVQ0NDkgNzkxVDQ2OCA3NDVRNDY4IDczMSA0NjAgNzIyVDQzNyA3MTNRNDE2IDcxMyAzOTEgNzM4VDMyOCA4MjBRMjkwIDc2MyAyNjYgNzM4VDIyMSA3MTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDMzsiIGdseXBoLW5hbWU9IkF0aWxkZSIgaG9yaXotYWR2LXg9IjY2MCIgZD0iTTQ1NyAxOTBIMTk4TDEyNSAwSDIwTDI1OCA2MjBRMjY0IDYzNiAyNzkgNjQ0VDMyOSA2NTNRMzY1IDY1MyAzNzkgNjQ1VDQwMCA2MjBMNjQyIDBINTMxTDQ1NyAxOTBaTTIyMyAyNzNINDMxTDMyNyA1NDdMMjIzIDI3M1pNMjE1IDcxOFExOTggNzE4IDE4OSA3MjdUMTgwIDc1M1ExODAgNzcyIDE4NiA3ODlUMjAyIDgyMFQyMjcgODQxVDI1OCA4NDlRMjg1IDg0OSAzMjMgODMwVDQwMiA3NzRRNDEwIDgwMCA0MjMgODIxVDQ1MyA4NDNRNDcwIDg0MyA0NzkgODM0VDQ4OCA4MDdRNDg4IDc4OCA0ODIgNzcxVDQ2NiA3NDFUNDQxIDcyMFQ0MTAgNzEyUTM4MiA3MTIgMzQ0IDczMVQyNjYgNzg3UTI1NyA3NjEgMjQ1IDc0MFQyMTUgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzQ7IiBnbHlwaC1uYW1lPSJBZGllcmVzaXMiIGhvcml6LWFkdi14PSI2NjAiIGQ9Ik00NTcgMTkwSDE5OEwxMjUgMEgyMEwyNTggNjIwUTI2NCA2MzYgMjc5IDY0NFQzMjkgNjUzUTM2NSA2NTMgMzc5IDY0NVQ0MDAgNjIwTDY0MiAwSDUzMUw0NTcgMTkwWk0yMjMgMjczSDQzMUwzMjcgNTQ3TDIyMyAyNzNaTTQyMiA3MTJRMzkzIDcxMiAzNzcgNzI3VDM2MSA3NzFRMzYxIDgwMCAzNzcgODE1VDQyMCA4MzFRNDQ3IDgzMSA0NjMgODE2VDQ4MCA3NzFRNDgwIDc0MyA0NjQgNzI4VDQyMiA3MTJaTTIzOCA3MTJRMjExIDcxMiAxOTUgNzI3VDE3OCA3NzFRMTc4IDgwMCAxOTQgODE1VDIzNiA4MzFRMjY1IDgzMSAyODEgODE2VDI5NyA3NzFRMjk3IDc0MyAyODEgNzI4VDIzOCA3MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNTsiIGdseXBoLW5hbWU9IkFyaW5nIiBob3Jpei1hZHYteD0iNjYwIiBkPSJNNDUwIDcyMFE0NTAgNjg4IDQzNiA2NjNUMzk3IDYyMkwzOTkgNjIwTDYzMiAyNlE2MzMgMjMgNjI5IDE4VDYxNiA4VDU5OCAtMVQ1NzUgLTVRNTU4IC01IDU0MiA1VDUxNCA0M0w0NTcgMTkwSDE5OEwxNDEgNDJRMTMxIDE1IDExNiA1VDg0IC01UTYxIC01IDQ0IDdUMjggMjZMMjU4IDYyMFEyNTggNjIxIDI2MCA2MjNRMjM2IDYzNyAyMjMgNjYyVDIwOSA3MjBRMjA5IDc0NSAyMTggNzY3VDI0MyA4MDVUMjgxIDgzMVQzMzAgODQwUTM4MyA4NDAgNDE2IDgwNlQ0NTAgNzIwWk0yMjMgMjczSDQzMkwzMjcgNTQ5TDIyMyAyNzNaTTMyOSA2NTVRMzU1IDY1NSAzNzIgNjczVDM5MCA3MjBRMzkwIDc0OSAzNzMgNzY4VDMyOSA3ODdRMzAzIDc4NyAyODUgNzY4VDI2NyA3MjBRMjY3IDY5MyAyODUgNjc0VDMyOSA2NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDNjsiIGdseXBoLW5hbWU9IkFFIiBob3Jpei1hZHYteD0iODg4IiBkPSJNNDU3IDE5MEgxOThMMTQxIDQyUTEzMCAxNSAxMTYgNVQ4NCAtNVE2MSAtNSA0NCA3VDI4IDI2TDI1NCA2MDhRMjYwIDYyNSAyNzQgNjM2VDMyMCA2NDdINzg1UTgzMyA2NDcgODMzIDYwNFY1OThRODMzIDU1NSA3ODUgNTU1SDQyMVE0MjYgNTQyIDQzMiA1MjdRNDM3IDUxNCA0NDMgNDk4VDQ1NiA0NjVRNDcxIDQyNSA0OTEgMzc1SDcxMVE3NTkgMzc1IDc1OSAzMzRWMzI5UTc1OSAyODcgNzExIDI4N0g1MjdMNjAzIDkxSDc5MVE4MzggOTEgODM4IDUwVjQ1UTgzOCAwIDc5MSAwSDU4N1E1NTQgMCA1MzcgMTFUNTA5IDUyTDQ1NyAxOTBaTTIyMyAyNzNINDMyTDMyNyA1NDdMMjIzIDI3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM3OyIgZ2x5cGgtbmFtZT0iQ2NlZGlsbGEiIGhvcml6LWFkdi14PSI2ODciIGQ9Ik0zODUgLTEzUTMxMyAtMTMgMjUzIDExVDE1MCA4MFQ4MyAxODZUNTkgMzIyUTU5IDM5NiA4MyA0NThUMTUwIDU2NVQyNTQgNjM1VDM4OCA2NjBRNDQ5IDY2MCA0OTQgNjQ1VDU3MCA2MDlUNjE2IDU2NFQ2MzIgNTIzUTYzMiA1MDUgNjIzIDQ5NFQ2MDMgNDc2VDU4MyA0NjdUNTcyIDQ2N1E1NDQgNTE2IDQ5NCA1NDFUMzg5IDU2N1EzNDAgNTY3IDI5OSA1NTBUMjI5IDUwMFQxODMgNDIzVDE2NiAzMjRRMTY2IDI3MCAxODMgMjI2VDIzMCAxNDlUMzAxIDk4VDM5MSA4MFE0NTcgODAgNTA3IDExMFQ1NzggMTkzUTU3OSAxOTUgNTg5IDE5NFQ2MTEgMTg2VDYzMiAxNjhUNjQyIDEzOFE2NDIgMTIwIDYyNiA5NFQ1NzggNDVUNDk4IDRUMzg1IC0xM1pNMzIyIC0yMjRRMzE2IC0yMjkgMzA2IC0yMzBUMjg3IC0yMjlUMjczIC0yMjBUMjcyIC0yMDVMMzI1IC04N1EzMzMgLTY4IDM0MiAtNThUMzc4IC00OEgzODdRNDA3IC00OCA0MjAgLTU3VDQzMyAtODNWLTg4UTQzMyAtOTggNDI1IC0xMDhUNDAxIC0xMzRMMzIyIC0yMjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDODsiIGdseXBoLW5hbWU9IkVncmF2ZSIgaG9yaXotYWR2LXg9IjYxNyIgZD0iTTg0IDU4OVE4NCA2MTUgOTkgNjMxVDEzOSA2NDdINTYyVjU1NUgxODdWMzc0SDQ4OFYyODdIMTg3VjkxSDU2N1YwSDg0VjU4OVpNMjMxIDc3NVExODggODAxIDE4OCA4MzZRMTg4IDg1MyAyMDEgODY0VDIzMyA4NzVRMjU4IDg3NSAyODEgODU4UTMwNSA4NDIgMzI4IDgyMFQzNjggNzc2VDM5NCA3NDBUNDAyIDcyMVE0MDAgNzE4IDM4MyA3MTlUMzQxIDcyN1QyODcgNzQ1VDIzMSA3NzVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDOTsiIGdseXBoLW5hbWU9IkVhY3V0ZSIgaG9yaXotYWR2LXg9IjYxNyIgZD0iTTg0IDU4OVE4NCA2MTUgOTkgNjMxVDEzOSA2NDdINTYyVjU1NUgxODdWMzc0SDQ4OFYyODdIMTg3VjkxSDU2N1YwSDg0VjU4OVpNMjQwIDcyMVEyMzggNzI0IDI0NyA3MzlUMjc0IDc3NlQzMTMgODE5VDM2MCA4NThRMzg2IDg3NSA0MDggODc1UTQyNyA4NzUgNDQwIDg2NFQ0NTMgODM2UTQ1MyA4MTkgNDQzIDgwNFQ0MTEgNzc1UTM4NCA3NTcgMzU1IDc0NlQzMDEgNzI3VDI1OSA3MTlUMjQwIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgZ2x5cGgtbmFtZT0iRWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MTciIGQ9Ik04NCA1ODlRODQgNjE1IDk5IDYzMVQxMzkgNjQ3SDU2MlY1NTVIMTg3VjM3NEg0ODhWMjg3SDE4N1Y5MUg1NjdWMEg4NFY1ODlaTTIxNiA3MTNRMjAyIDcxMyAxOTMgNzIyVDE4NCA3NDVRMTg0IDc2NSAyMDMgNzkwVDI0NiA4MzhUMjkzIDg3NlQzMjQgODk0UTMzMSA4OTIgMzU0IDg3N1Q0MDEgODM5VDQ0NCA3OTFUNDYzIDc0NVE0NjMgNzMxIDQ1NSA3MjJUNDMyIDcxM1E0MTEgNzEzIDM4NiA3MzhUMzIzIDgyMFEyODUgNzYzIDI2MSA3MzhUMjE2IDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgZ2x5cGgtbmFtZT0iRWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjE3IiBkPSJNODQgNTg5UTg0IDYxNSA5OSA2MzFUMTM5IDY0N0g1NjJWNTU1SDE4N1YzNzRINDg4VjI4N0gxODdWOTFINTY3VjBIODRWNTg5Wk00MTcgNzEyUTM4OCA3MTIgMzcyIDcyN1QzNTYgNzcxUTM1NiA4MDAgMzcyIDgxNVQ0MTUgODMxUTQ0MiA4MzEgNDU4IDgxNlQ0NzUgNzcxUTQ3NSA3NDMgNDU5IDcyOFQ0MTcgNzEyWk0yMzMgNzEyUTIwNiA3MTIgMTkwIDcyN1QxNzMgNzcxUTE3MyA4MDAgMTg5IDgxNVQyMzEgODMxUTI2MCA4MzEgMjc2IDgxNlQyOTIgNzcxUTI5MiA3NDMgMjc2IDcyOFQyMzMgNzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0M7IiBnbHlwaC1uYW1lPSJJZ3JhdmUiIGhvcml6LWFkdi14PSIyODkiIGQ9Ik05MyA2MDRROTMgNjUxIDEzNiA2NTFIMTUxUTE5NiA2NTEgMTk2IDYwNFYwSDkzVjYwNFpNMzUgNzc1US04IDgwMSAtOCA4MzZRLTggODUzIDUgODY0VDM3IDg3NVE2MiA4NzUgODUgODU4UTEwOSA4NDIgMTMyIDgyMFQxNzIgNzc2VDE5OCA3NDBUMjA2IDcyMVEyMDQgNzE4IDE4NyA3MTlUMTQ1IDcyN1Q5MSA3NDVUMzUgNzc1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Q7IiBnbHlwaC1uYW1lPSJJYWN1dGUiIGhvcml6LWFkdi14PSIyODkiIGQ9Ik05MyA2MDRROTMgNjUxIDEzNiA2NTFIMTUxUTE5NiA2NTEgMTk2IDYwNFYwSDkzVjYwNFpNODIgNzIxUTgwIDcyNCA4OSA3MzlUMTE2IDc3NlQxNTUgODE5VDIwMiA4NThRMjI4IDg3NSAyNTAgODc1UTI2OSA4NzUgMjgyIDg2NFQyOTUgODM2UTI5NSA4MTkgMjg1IDgwNFQyNTMgNzc1UTIyNiA3NTcgMTk3IDc0NlQxNDMgNzI3VDEwMSA3MTlUODIgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0U7IiBnbHlwaC1uYW1lPSJJY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjI4OSIgZD0iTTkzIDYwNFE5MyA2NTEgMTM2IDY1MUgxNTFRMTk2IDY1MSAxOTYgNjA0VjBIOTNWNjA0Wk0zNiA3MTNRMjIgNzEzIDEzIDcyMlQ0IDc0NVE0IDc2NSAyMyA3OTBUNjYgODM4VDExMyA4NzZUMTQ0IDg5NFExNTEgODkyIDE3NCA4NzdUMjIxIDgzOVQyNjQgNzkxVDI4MyA3NDVRMjgzIDczMSAyNzUgNzIyVDI1MiA3MTNRMjMxIDcxMyAyMDYgNzM4VDE0MyA4MjBRMTA1IDc2MyA4MSA3MzhUMzYgNzEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0Y7IiBnbHlwaC1uYW1lPSJJZGllcmVzaXMiIGhvcml6LWFkdi14PSIyODkiIGQ9Ik05MyA2MDRROTMgNjUxIDEzNiA2NTFIMTUxUTE5NiA2NTEgMTk2IDYwNFYwSDkzVjYwNFpNMjM3IDcxMlEyMDggNzEyIDE5MiA3MjdUMTc2IDc3MVExNzYgODAwIDE5MiA4MTVUMjM1IDgzMVEyNjIgODMxIDI3OCA4MTZUMjk1IDc3MVEyOTUgNzQzIDI3OSA3MjhUMjM3IDcxMlpNNTMgNzEyUTI2IDcxMiAxMCA3MjdULTcgNzcxUS03IDgwMCA5IDgxNVQ1MSA4MzFRODAgODMxIDk2IDgxNlQxMTIgNzcxUTExMiA3NDMgOTYgNzI4VDUzIDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQwOyIgZ2x5cGgtbmFtZT0iRXRoIiBob3Jpei1hZHYteD0iNzUxIiBkPSJNNjcgMjg0UTQ1IDI4NCAzNyAyOTRUMjggMzIwVjMyOVEyOCAzNDQgMzYgMzU0VDY3IDM2NEgxMjBWNTg5UTEyMCA2MTUgMTM2IDYzMVQxNzUgNjQ3SDMzN1E0MTkgNjQ3IDQ4NSA2MjVUNTk3IDU2MVQ2NjcgNDYwVDY5MiAzMjVRNjkyIDI1MCA2NjcgMTkwVDU5NSA4N1Q0ODIgMjNUMzMyIDBIMTc3UTE1MyAwIDEzNyAxN1QxMjAgNTdWMjg0SDY3Wk0zMzggOTFRNDU5IDkxIDUyNCAxNTFUNTg5IDMyNFE1ODkgNDM0IDUyNCA0OTVUMzM5IDU1NkgyMjJWMzY0SDM5N1E0MTkgMzY0IDQyOCAzNTRUNDM3IDMyOVYzMjBRNDM3IDMwNCA0MjggMjk0VDM5NyAyODRIMjIyVjkxSDMzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQxOyIgZ2x5cGgtbmFtZT0iTnRpbGRlIiBob3Jpei1hZHYteD0iNzEyIiBkPSJNODQgNTkzUTg0IDYxOSA5NiA2MzVUMTMzIDY1MUgxNTBRMTczIDY1MSAxODUgNjQyVDIxMiA2MTJMNTMyIDE1OFY2NDdINjI5VjU0UTYyOSAyNyA2MTcgMTJUNTgxIC00SDU3M1E1NTAgLTQgNTQwIDNUNTE4IDI3TDE4MSA1MDRWMEg4NFY1OTNaTTIzNyA3MThRMjIwIDcxOCAyMTEgNzI3VDIwMiA3NTNRMjAyIDc3MiAyMDggNzg5VDIyNCA4MjBUMjQ5IDg0MVQyODAgODQ5UTMwNyA4NDkgMzQ1IDgzMFQ0MjQgNzc0UTQzMiA4MDAgNDQ1IDgyMVQ0NzUgODQzUTQ5MiA4NDMgNTAxIDgzNFQ1MTAgODA3UTUxMCA3ODggNTA0IDc3MVQ0ODggNzQxVDQ2MyA3MjBUNDMyIDcxMlE0MDQgNzEyIDM2NiA3MzFUMjg4IDc4N1EyNzkgNzYxIDI2NyA3NDBUMjM3IDcxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQyOyIgZ2x5cGgtbmFtZT0iT2dyYXZlIiBob3Jpei1hZHYteD0iNzcxIiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNDkgODBUODIgMTg2VDU4IDMyMlE1OCAzOTYgODIgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODYgNjYwUTQ1OCA2NjAgNTE4IDYzNlQ2MjIgNTY3VDY4OSA0NjBUNzEzIDMyNFE3MTMgMjUwIDY4OSAxODhUNjIxIDgyVDUxNyAxMlQzODUgLTEzWk0zODYgNzhRNDM1IDc4IDQ3NiA5NlQ1NDYgMTQ2VDU5MiAyMjNUNjA5IDMyMlE2MDkgMzc2IDU5MyA0MjFUNTQ2IDQ5OVQ0NzUgNTUwVDM4NSA1NjlRMzM2IDU2OSAyOTUgNTUxVDIyNSA1MDFUMTc5IDQyNFQxNjIgMzI0UTE2MiAyNzAgMTc4IDIyNVQyMjUgMTQ3VDI5NiA5NlQzODYgNzhaTTI3MiA3NzVRMjI5IDgwMSAyMjkgODM2UTIyOSA4NTMgMjQyIDg2NFQyNzQgODc1UTI5OSA4NzUgMzIyIDg1OFEzNDYgODQyIDM2OSA4MjBUNDA5IDc3NlQ0MzUgNzQwVDQ0MyA3MjFRNDQxIDcxOCA0MjQgNzE5VDM4MiA3MjdUMzI4IDc0NVQyNzIgNzc1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDM7IiBnbHlwaC1uYW1lPSJPYWN1dGUiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zODUgLTEzUTMxMyAtMTMgMjUzIDExVDE0OSA4MFQ4MiAxODZUNTggMzIyUTU4IDM5NiA4MiA0NThUMTUwIDU2NVQyNTQgNjM1VDM4NiA2NjBRNDU4IDY2MCA1MTggNjM2VDYyMiA1NjdUNjg5IDQ2MFQ3MTMgMzI0UTcxMyAyNTAgNjg5IDE4OFQ2MjEgODJUNTE3IDEyVDM4NSAtMTNaTTM4NiA3OFE0MzUgNzggNDc2IDk2VDU0NiAxNDZUNTkyIDIyM1Q2MDkgMzIyUTYwOSAzNzYgNTkzIDQyMVQ1NDYgNDk5VDQ3NSA1NTBUMzg1IDU2OVEzMzYgNTY5IDI5NSA1NTFUMjI1IDUwMVQxNzkgNDI0VDE2MiAzMjRRMTYyIDI3MCAxNzggMjI1VDIyNSAxNDdUMjk2IDk2VDM4NiA3OFpNMzIzIDcyMVEzMjEgNzI0IDMzMCA3MzlUMzU3IDc3NlQzOTYgODE5VDQ0MyA4NThRNDY5IDg3NSA0OTEgODc1UTUxMCA4NzUgNTIzIDg2NFQ1MzYgODM2UTUzNiA4MTkgNTI2IDgwNFQ0OTQgNzc1UTQ2NyA3NTcgNDM4IDc0NlQzODQgNzI3VDM0MiA3MTlUMzIzIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ0OyIgZ2x5cGgtbmFtZT0iT2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zODUgLTEzUTMxMyAtMTMgMjUzIDExVDE0OSA4MFQ4MiAxODZUNTggMzIyUTU4IDM5NiA4MiA0NThUMTUwIDU2NVQyNTQgNjM1VDM4NiA2NjBRNDU4IDY2MCA1MTggNjM2VDYyMiA1NjdUNjg5IDQ2MFQ3MTMgMzI0UTcxMyAyNTAgNjg5IDE4OFQ2MjEgODJUNTE3IDEyVDM4NSAtMTNaTTM4NiA3OFE0MzUgNzggNDc2IDk2VDU0NiAxNDZUNTkyIDIyM1Q2MDkgMzIyUTYwOSAzNzYgNTkzIDQyMVQ1NDYgNDk5VDQ3NSA1NTBUMzg1IDU2OVEzMzYgNTY5IDI5NSA1NTFUMjI1IDUwMVQxNzkgNDI0VDE2MiAzMjRRMTYyIDI3MCAxNzggMjI1VDIyNSAxNDdUMjk2IDk2VDM4NiA3OFpNMjc3IDcxM1EyNjMgNzEzIDI1NCA3MjJUMjQ1IDc0NVEyNDUgNzY1IDI2NCA3OTBUMzA3IDgzOFQzNTQgODc2VDM4NSA4OTRRMzkyIDg5MiA0MTUgODc3VDQ2MiA4MzlUNTA1IDc5MVQ1MjQgNzQ1UTUyNCA3MzEgNTE2IDcyMlQ0OTMgNzEzUTQ3MiA3MTMgNDQ3IDczOFQzODQgODIwUTM0NiA3NjMgMzIyIDczOFQyNzcgNzEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBnbHlwaC1uYW1lPSJPdGlsZGUiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zODUgLTEzUTMxMyAtMTMgMjUzIDExVDE0OSA4MFQ4MiAxODZUNTggMzIyUTU4IDM5NiA4MiA0NThUMTUwIDU2NVQyNTQgNjM1VDM4NiA2NjBRNDU4IDY2MCA1MTggNjM2VDYyMiA1NjdUNjg5IDQ2MFQ3MTMgMzI0UTcxMyAyNTAgNjg5IDE4OFQ2MjEgODJUNTE3IDEyVDM4NSAtMTNaTTM4NiA3OFE0MzUgNzggNDc2IDk2VDU0NiAxNDZUNTkyIDIyM1Q2MDkgMzIyUTYwOSAzNzYgNTkzIDQyMVQ1NDYgNDk5VDQ3NSA1NTBUMzg1IDU2OVEzMzYgNTY5IDI5NSA1NTFUMjI1IDUwMVQxNzkgNDI0VDE2MiAzMjRRMTYyIDI3MCAxNzggMjI1VDIyNSAxNDdUMjk2IDk2VDM4NiA3OFpNMjY3IDcxOFEyNTAgNzE4IDI0MSA3MjdUMjMyIDc1M1EyMzIgNzcyIDIzOCA3ODlUMjU0IDgyMFQyNzkgODQxVDMxMCA4NDlRMzM3IDg0OSAzNzUgODMwVDQ1NCA3NzRRNDYyIDgwMCA0NzUgODIxVDUwNSA4NDNRNTIyIDg0MyA1MzEgODM0VDU0MCA4MDdRNTQwIDc4OCA1MzQgNzcxVDUxOCA3NDFUNDkzIDcyMFQ0NjIgNzEyUTQzNCA3MTIgMzk2IDczMVQzMTggNzg3UTMwOSA3NjEgMjk3IDc0MFQyNjcgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDY7IiBnbHlwaC1uYW1lPSJPZGllcmVzaXMiIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zODUgLTEzUTMxMyAtMTMgMjUzIDExVDE0OSA4MFQ4MiAxODZUNTggMzIyUTU4IDM5NiA4MiA0NThUMTUwIDU2NVQyNTQgNjM1VDM4NiA2NjBRNDU4IDY2MCA1MTggNjM2VDYyMiA1NjdUNjg5IDQ2MFQ3MTMgMzI0UTcxMyAyNTAgNjg5IDE4OFQ2MjEgODJUNTE3IDEyVDM4NSAtMTNaTTM4NiA3OFE0MzUgNzggNDc2IDk2VDU0NiAxNDZUNTkyIDIyM1Q2MDkgMzIyUTYwOSAzNzYgNTkzIDQyMVQ1NDYgNDk5VDQ3NSA1NTBUMzg1IDU2OVEzMzYgNTY5IDI5NSA1NTFUMjI1IDUwMVQxNzkgNDI0VDE2MiAzMjRRMTYyIDI3MCAxNzggMjI1VDIyNSAxNDdUMjk2IDk2VDM4NiA3OFpNNDc4IDcxMlE0NDkgNzEyIDQzMyA3MjdUNDE3IDc3MVE0MTcgODAwIDQzMyA4MTVUNDc2IDgzMVE1MDMgODMxIDUxOSA4MTZUNTM2IDc3MVE1MzYgNzQzIDUyMCA3MjhUNDc4IDcxMlpNMjk0IDcxMlEyNjcgNzEyIDI1MSA3MjdUMjM0IDc3MVEyMzQgODAwIDI1MCA4MTVUMjkyIDgzMVEzMjEgODMxIDMzNyA4MTZUMzUzIDc3MVEzNTMgNzQzIDMzNyA3MjhUMjk0IDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ3OyIgZ2x5cGgtbmFtZT0ibXVsdGlwbHkiIGhvcml6LWFkdi14PSI1NzYiIGQ9Ik0xMTAgODNROTggOTQgOTggMTA4VDExNCAxNDBMMjM0IDI2MkwxMTQgMzgyUTk3IDM5OSA5OCA0MTRUMTEwIDQ0MEwxMTYgNDQ2UTEyNyA0NTggMTQyIDQ1OFQxNzQgNDQxTDI5MCAzMTlMNDA1IDQ0MVE0MjIgNDU5IDQzNyA0NTlUNDY0IDQ0Nkw0NjkgNDQwUTQ4MSA0MjkgNDgyIDQxNFQ0NjYgMzgyTDM0NiAyNjJMNDY2IDE0MFE0ODMgMTIzIDQ4MiAxMDlUNDY5IDgzTDQ2MyA3N1E0NTIgNjYgNDM3IDY1VDQwNSA4MkwyOTAgMjA0TDE3NCA4MlExNTcgNjQgMTQyIDY1VDExNiA3N0wxMTAgODNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEODsiIGdseXBoLW5hbWU9Ik9zbGFzaCIgaG9yaXotYWR2LXg9Ijc3MSIgZD0iTTEwMiAtNDNRMTAwIC00NSA5MyAtNDNUNzggLTM1VDY0IC0yMVQ1NyAtMVE1NyA5IDYyIDIwVDgxIDQ4TDEzMSAxMDNROTYgMTQ3IDc4IDIwMlQ1OSAzMjJRNTkgMzk0IDgzIDQ1NVQxNTAgNTYyVDI1NCA2MzRUMzg3IDY2MFE0NDQgNjYwIDQ5MyA2NDRUNTgyIDU5OUw2NTkgNjg0UTY2MCA2ODYgNjY3IDY4NFQ2ODIgNjc2VDY5NiA2NjJUNzAzIDY0MlE3MDMgNjMyIDY5OSA2MjFUNjgwIDU5M0w2MzcgNTQ2UTY3MyA1MDIgNjkzIDQ0NlQ3MTMgMzI0UTcxMyAyNTIgNjg5IDE5MVQ2MjIgODRUNTE4IDEzVDM4NSAtMTNRMzI2IC0xMyAyNzYgM1QxODYgNTBMMTAyIC00M1pNMzg3IDc4UTQzOSA3OCA0ODEgOTZUNTUzIDE0N1Q1OTkgMjI0VDYxNSAzMjJRNjE1IDQxMSA1NzAgNDc2TDI1MCAxMjBRMjc4IDEwMCAzMTIgODlUMzg3IDc4Wk0xNTcgMzI0UTE1NyAyODAgMTY4IDI0M1QxOTkgMTc0TDUxOCA1MjhRNDkwIDU0OCA0NTcgNTU4VDM4NSA1NjlRMzMzIDU2OSAyOTEgNTUxVDIxOSA1MDBUMTczIDQyMlQxNTcgMzI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDk7IiBnbHlwaC1uYW1lPSJVZ3JhdmUiIGhvcml6LWFkdi14PSI2ODAiIGQ9Ik0zMzkgLTEyUTIwOSAtMTIgMTQzIDU3VDc2IDI2M1Y2MDRRNzYgNjUxIDEyMCA2NTFIMTM0UTE3OSA2NTEgMTc5IDYwNFYyNjZRMTc5IDc5IDM0MCA3OVE1MDEgNzkgNTAxIDI2N1Y2MDRRNTAxIDY1MSA1NDUgNjUxSDU2MVE2MDQgNjUxIDYwNCA2MDRWMjY1UTYwNCAxMjkgNTM3IDU5VDMzOSAtMTJaTTIzMyA3NjdRMTkwIDc5MyAxOTAgODI4UTE5MCA4NDUgMjAzIDg1NlQyMzUgODY3UTI2MCA4NjcgMjgzIDg1MFEzMDcgODM0IDMzMCA4MTJUMzcwIDc2OFQzOTYgNzMyVDQwNCA3MTNRNDAyIDcxMCAzODUgNzExVDM0MyA3MTlUMjg5IDczN1QyMzMgNzY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REE7IiBnbHlwaC1uYW1lPSJVYWN1dGUiIGhvcml6LWFkdi14PSI2ODAiIGQ9Ik0zMzkgLTEyUTIwOSAtMTIgMTQzIDU3VDc2IDI2M1Y2MDRRNzYgNjUxIDEyMCA2NTFIMTM0UTE3OSA2NTEgMTc5IDYwNFYyNjZRMTc5IDc5IDM0MCA3OVE1MDEgNzkgNTAxIDI2N1Y2MDRRNTAxIDY1MSA1NDUgNjUxSDU2MVE2MDQgNjUxIDYwNCA2MDRWMjY1UTYwNCAxMjkgNTM3IDU5VDMzOSAtMTJaTTI4MCA3MTNRMjc4IDcxNiAyODcgNzMxVDMxNCA3NjhUMzUzIDgxMVQ0MDAgODUwUTQyNiA4NjcgNDQ4IDg2N1E0NjcgODY3IDQ4MCA4NTZUNDkzIDgyOFE0OTMgODExIDQ4MyA3OTZUNDUxIDc2N1E0MjQgNzQ5IDM5NSA3MzhUMzQxIDcxOVQyOTkgNzExVDI4MCA3MTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQjsiIGdseXBoLW5hbWU9IlVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjgwIiBkPSJNMzM5IC0xMlEyMDkgLTEyIDE0MyA1N1Q3NiAyNjNWNjA0UTc2IDY1MSAxMjAgNjUxSDEzNFExNzkgNjUxIDE3OSA2MDRWMjY2UTE3OSA3OSAzNDAgNzlRNTAxIDc5IDUwMSAyNjdWNjA0UTUwMSA2NTEgNTQ1IDY1MUg1NjFRNjA0IDY1MSA2MDQgNjA0VjI2NVE2MDQgMTI5IDUzNyA1OVQzMzkgLTEyWk0yMzAgNzEzUTIxNiA3MTMgMjA3IDcyMlQxOTggNzQ1UTE5OCA3NjUgMjE3IDc5MFQyNjAgODM4VDMwNyA4NzZUMzM4IDg5NFEzNDUgODkyIDM2OCA4NzdUNDE1IDgzOVQ0NTggNzkxVDQ3NyA3NDVRNDc3IDczMSA0NjkgNzIyVDQ0NiA3MTNRNDI1IDcxMyA0MDAgNzM4VDMzNyA4MjBRMjk5IDc2MyAyNzUgNzM4VDIzMCA3MTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQzsiIGdseXBoLW5hbWU9IlVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjY4MCIgZD0iTTMzOSAtMTJRMjA5IC0xMiAxNDMgNTdUNzYgMjYzVjYwNFE3NiA2NTEgMTIwIDY1MUgxMzRRMTc5IDY1MSAxNzkgNjA0VjI2NlExNzkgNzkgMzQwIDc5UTUwMSA3OSA1MDEgMjY3VjYwNFE1MDEgNjUxIDU0NSA2NTFINTYxUTYwNCA2NTEgNjA0IDYwNFYyNjVRNjA0IDEyOSA1MzcgNTlUMzM5IC0xMlpNNDMxIDcxMlE0MDIgNzEyIDM4NiA3MjdUMzcwIDc3MVEzNzAgODAwIDM4NiA4MTVUNDI5IDgzMVE0NTYgODMxIDQ3MiA4MTZUNDg5IDc3MVE0ODkgNzQzIDQ3MyA3MjhUNDMxIDcxMlpNMjQ3IDcxMlEyMjAgNzEyIDIwNCA3MjdUMTg3IDc3MVExODcgODAwIDIwMyA4MTVUMjQ1IDgzMVEyNzQgODMxIDI5MCA4MTZUMzA2IDc3MVEzMDYgNzQzIDI5MCA3MjhUMjQ3IDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEREOyIgZ2x5cGgtbmFtZT0iWWFjdXRlIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNMjUwIDI2NUwyNCA2NDdIMTM5TDMwMiAzNTFMNDY4IDYxNVE0ODAgNjM1IDQ5MyA2NDNUNTE5IDY1MVE1MzYgNjUxIDU0OCA2NDZUNTY4IDYzM1Q1NzkgNjE4VDU4MSA2MDlMMzUzIDI2NVYwSDI1MFYyNjVaTTIzNSA3MTNRMjMzIDcxNiAyNDIgNzMxVDI2OSA3NjhUMzA4IDgxMVQzNTUgODUwUTM4MSA4NjcgNDAzIDg2N1E0MjIgODY3IDQzNSA4NTZUNDQ4IDgyOFE0NDggODExIDQzOCA3OTZUNDA2IDc2N1EzNzkgNzQ5IDM1MCA3MzhUMjk2IDcxOVQyNTQgNzExVDIzNSA3MTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERTsiIGdseXBoLW5hbWU9IlRob3JuIiBob3Jpei1hZHYteD0iNjA1IiBkPSJNMTI3IC00UTg0IC00IDg0IDQzVjYwNFE4NCA2NTEgMTI3IDY1MUgxNDJRMTg3IDY1MSAxODcgNjA0VjUzMUgzMDVRNDI2IDUzMSA0OTEgNDc5VDU1NiAzMjdRNTU2IDIyNiA0OTIgMTc0VDMwMSAxMjFIMTg3VjQzUTE4NyAtNCAxNDIgLTRIMTI3Wk0xODcgNDQ2VjIwNEgzMDRRMzc5IDIwNCA0MTYgMjM1VDQ1NCAzMjVRNDU0IDQ0NiAzMDYgNDQ2SDE4N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERGOyIgZ2x5cGgtbmFtZT0iZ2VybWFuZGJscyIgaG9yaXotYWR2LXg9IjU4MiIgZD0iTTUwNCA1MzFRNTA0IDQwMiAzNjEgMzg0UTQxMCAzNzEgNDQ0IDM1MVQ1MDAgMzAzVDUzMiAyNDRUNTQyIDE3NFE1NDIgMTM1IDUyOCAxMDFUNDg4IDQxVDQyOSAyVDM1NSAtMTNRMjg2IC0xMyAyNTIgMTFUMjE3IDY0UTIxNyA3NCAyMjEgODNUMjMxIDk4VDI0MSAxMDhUMjQ3IDExMVEyNjMgOTMgMjg0IDgxVDM0NCA2OFEzNjUgNjggMzgzIDc2VDQxNiA5OVQ0MzggMTMzVDQ0NiAxNzRRNDQ2IDE5NiA0NDAgMjE3VDQxOSAyNTZUMzc3IDI4OFQzMTEgMzE0UTI4MCAzMjMgMjY2IDMzN1QyNTIgMzc3UTI1MiAzOTcgMjYyIDQxMlQyNzMgNDI3UTM0MCA0MjYgMzc0IDQ0N1Q0MDkgNTIwUTQwOSA1NjQgMzc5IDU4OFQyOTggNjEzUTIzOCA2MTMgMjA3IDU3OFQxNzUgNDY3VjBINzZWNDYyUTc2IDU4MCAxMzMgNjM3VDI5OSA2OTRRMzQ2IDY5NCAzODQgNjgzVDQ0OCA2NTBUNDg5IDU5OFQ1MDQgNTMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTA7IiBnbHlwaC1uYW1lPSJhZ3JhdmUiIGhvcml6LWFkdi14PSI1NTMiIGQ9Ik0yMTIgLTExUTEzNCAtMTEgOTEgMjZUNDggMTI2UTQ4IDIxMCAxMjcgMjQ4VDM3MSAyODlIMzg0VjI5OVEzODQgMzU0IDM1NCAzODNUMjY1IDQxMlEyMTAgNDEyIDE3NyAzODhUMTI3IDMzMFExMjcgMzMwIDExOCAzMzBUOTcgMzM1VDc2IDM1MFQ2NiAzNzhRNjYgMzk1IDc5IDQxNVQxMTggNDUyVDE4MiA0ODFUMjcyIDQ5M1EzNzUgNDkzIDQyOCA0NDNUNDgyIDMwMVYwSDM4NVYxNFY3MlEzNTcgMzMgMzEyIDExVDIxMiAtMTFaTTIzNiA2MFEyNjggNjAgMjk1IDY5VDM0MiA5NlQzNzMgMTM3VDM4NCAxOTBWMjI3TDM1NyAyMjZRMjUxIDIyMiAxOTggMjAxVDE0NSAxMzBRMTQ1IDk4IDE2OSA3OVQyMzYgNjBaTTE4MSA2MDlRMTM4IDYzNSAxMzggNjcwUTEzOCA2ODcgMTUxIDY5OFQxODMgNzA5UTIwOCA3MDkgMjMxIDY5MlEyNTUgNjc2IDI3OCA2NTRUMzE4IDYxMFQzNDQgNTc0VDM1MiA1NTVRMzUwIDU1MiAzMzMgNTUzVDI5MSA1NjFUMjM3IDU3OVQxODEgNjA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBnbHlwaC1uYW1lPSJhYWN1dGUiIGhvcml6LWFkdi14PSI1NTMiIGQ9Ik0yMTIgLTExUTEzNCAtMTEgOTEgMjZUNDggMTI2UTQ4IDIxMCAxMjcgMjQ4VDM3MSAyODlIMzg0VjI5OVEzODQgMzU0IDM1NCAzODNUMjY1IDQxMlEyMTAgNDEyIDE3NyAzODhUMTI3IDMzMFExMjcgMzMwIDExOCAzMzBUOTcgMzM1VDc2IDM1MFQ2NiAzNzhRNjYgMzk1IDc5IDQxNVQxMTggNDUyVDE4MiA0ODFUMjcyIDQ5M1EzNzUgNDkzIDQyOCA0NDNUNDgyIDMwMVYwSDM4NVYxNFY3MlEzNTcgMzMgMzEyIDExVDIxMiAtMTFaTTIzNiA2MFEyNjggNjAgMjk1IDY5VDM0MiA5NlQzNzMgMTM3VDM4NCAxOTBWMjI3TDM1NyAyMjZRMjUxIDIyMiAxOTggMjAxVDE0NSAxMzBRMTQ1IDk4IDE2OSA3OVQyMzYgNjBaTTIwMCA1NTVRMTk4IDU1OCAyMDcgNTczVDIzNCA2MTBUMjczIDY1M1QzMjAgNjkyUTM0NiA3MDkgMzY4IDcwOVEzODcgNzA5IDQwMCA2OThUNDEzIDY3MFE0MTMgNjUzIDQwMyA2MzhUMzcxIDYwOVEzNDQgNTkxIDMxNSA1ODBUMjYxIDU2MVQyMTkgNTUzVDIwMCA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMjsiIGdseXBoLW5hbWU9ImFjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTUzIiBkPSJNMjEyIC0xMVExMzQgLTExIDkxIDI2VDQ4IDEyNlE0OCAyMTAgMTI3IDI0OFQzNzEgMjg5SDM4NFYyOTlRMzg0IDM1NCAzNTQgMzgzVDI2NSA0MTJRMjEwIDQxMiAxNzcgMzg4VDEyNyAzMzBRMTI3IDMzMCAxMTggMzMwVDk3IDMzNVQ3NiAzNTBUNjYgMzc4UTY2IDM5NSA3OSA0MTVUMTE4IDQ1MlQxODIgNDgxVDI3MiA0OTNRMzc1IDQ5MyA0MjggNDQzVDQ4MiAzMDFWMEgzODVWMTRWNzJRMzU3IDMzIDMxMiAxMVQyMTIgLTExWk0yMzYgNjBRMjY4IDYwIDI5NSA2OVQzNDIgOTZUMzczIDEzN1QzODQgMTkwVjIyN0wzNTcgMjI2UTI1MSAyMjIgMTk4IDIwMVQxNDUgMTMwUTE0NSA5OCAxNjkgNzlUMjM2IDYwWk0xNjggNTQ3UTE1NCA1NDcgMTQ1IDU1NlQxMzYgNTc5UTEzNiA1OTkgMTU1IDYyNFQxOTggNjcyVDI0NSA3MTBUMjc2IDcyOFEyODMgNzI2IDMwNiA3MTFUMzUzIDY3M1QzOTYgNjI1VDQxNSA1NzlRNDE1IDU2NSA0MDcgNTU2VDM4NCA1NDdRMzYzIDU0NyAzMzggNTcyVDI3NSA2NTRRMjM3IDU5NyAyMTMgNTcyVDE2OCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMzsiIGdseXBoLW5hbWU9ImF0aWxkZSIgaG9yaXotYWR2LXg9IjU1MyIgZD0iTTIxMiAtMTFRMTM0IC0xMSA5MSAyNlQ0OCAxMjZRNDggMjEwIDEyNyAyNDhUMzcxIDI4OUgzODRWMjk5UTM4NCAzNTQgMzU0IDM4M1QyNjUgNDEyUTIxMCA0MTIgMTc3IDM4OFQxMjcgMzMwUTEyNyAzMzAgMTE4IDMzMFQ5NyAzMzVUNzYgMzUwVDY2IDM3OFE2NiAzOTUgNzkgNDE1VDExOCA0NTJUMTgyIDQ4MVQyNzIgNDkzUTM3NSA0OTMgNDI4IDQ0M1Q0ODIgMzAxVjBIMzg1VjE0VjcyUTM1NyAzMyAzMTIgMTFUMjEyIC0xMVpNMjM2IDYwUTI2OCA2MCAyOTUgNjlUMzQyIDk2VDM3MyAxMzdUMzg0IDE5MFYyMjdMMzU3IDIyNlEyNTEgMjIyIDE5OCAyMDFUMTQ1IDEzMFExNDUgOTggMTY5IDc5VDIzNiA2MFpNMTU2IDU1MlExMzkgNTUyIDEzMCA1NjFUMTIxIDU4N1ExMjEgNjA2IDEyNyA2MjNUMTQzIDY1NFQxNjggNjc1VDE5OSA2ODNRMjI2IDY4MyAyNjQgNjY0VDM0MyA2MDhRMzUxIDYzNCAzNjQgNjU1VDM5NCA2NzdRNDExIDY3NyA0MjAgNjY4VDQyOSA2NDFRNDI5IDYyMiA0MjMgNjA1VDQwNyA1NzVUMzgyIDU1NFQzNTEgNTQ2UTMyMyA1NDYgMjg1IDU2NVQyMDcgNjIxUTE5OCA1OTUgMTg2IDU3NFQxNTYgNTUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTQ7IiBnbHlwaC1uYW1lPSJhZGllcmVzaXMiIGhvcml6LWFkdi14PSI1NTMiIGQ9Ik0yMTIgLTExUTEzNCAtMTEgOTEgMjZUNDggMTI2UTQ4IDIxMCAxMjcgMjQ4VDM3MSAyODlIMzg0VjI5OVEzODQgMzU0IDM1NCAzODNUMjY1IDQxMlEyMTAgNDEyIDE3NyAzODhUMTI3IDMzMFExMjcgMzMwIDExOCAzMzBUOTcgMzM1VDc2IDM1MFQ2NiAzNzhRNjYgMzk1IDc5IDQxNVQxMTggNDUyVDE4MiA0ODFUMjcyIDQ5M1EzNzUgNDkzIDQyOCA0NDNUNDgyIDMwMVYwSDM4NVYxNFY3MlEzNTcgMzMgMzEyIDExVDIxMiAtMTFaTTIzNiA2MFEyNjggNjAgMjk1IDY5VDM0MiA5NlQzNzMgMTM3VDM4NCAxOTBWMjI3TDM1NyAyMjZRMjUxIDIyMiAxOTggMjAxVDE0NSAxMzBRMTQ1IDk4IDE2OSA3OVQyMzYgNjBaTTM2NyA1NDZRMzM4IDU0NiAzMjIgNTYxVDMwNiA2MDVRMzA2IDYzNCAzMjIgNjQ5VDM2NSA2NjVRMzkyIDY2NSA0MDggNjUwVDQyNSA2MDVRNDI1IDU3NyA0MDkgNTYyVDM2NyA1NDZaTTE4MyA1NDZRMTU2IDU0NiAxNDAgNTYxVDEyMyA2MDVRMTIzIDYzNCAxMzkgNjQ5VDE4MSA2NjVRMjEwIDY2NSAyMjYgNjUwVDI0MiA2MDVRMjQyIDU3NyAyMjYgNTYyVDE4MyA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNTsiIGdseXBoLW5hbWU9ImFyaW5nIiBob3Jpei1hZHYteD0iNTUzIiBkPSJNMjEyIC0xMVExMzQgLTExIDkxIDI2VDQ4IDEyNlE0OCAyMTAgMTI3IDI0OFQzNzEgMjg5SDM4NFYyOTlRMzg0IDM1NCAzNTQgMzgzVDI2NSA0MTJRMjEwIDQxMiAxNzcgMzg4VDEyNyAzMzBRMTI3IDMzMCAxMTggMzMwVDk3IDMzNVQ3NiAzNTBUNjYgMzc4UTY2IDM5NSA3OSA0MTVUMTE4IDQ1MlQxODIgNDgxVDI3MiA0OTNRMzc1IDQ5MyA0MjggNDQzVDQ4MiAzMDFWMEgzODVWMTRWNzJRMzU3IDMzIDMxMiAxMVQyMTIgLTExWk0yMzYgNjBRMjY4IDYwIDI5NSA2OVQzNDIgOTZUMzczIDEzN1QzODQgMTkwVjIyN0wzNTcgMjI2UTI1MSAyMjIgMTk4IDIwMVQxNDUgMTMwUTE0NSA5OCAxNjkgNzlUMjM2IDYwWk0yNzMgNTQ2UTI0NiA1NDYgMjI0IDU1NVQxODcgNTgwVDE2MiA2MTdUMTUzIDY2NVExNTMgNjkwIDE2MiA3MTJUMTg3IDc1MFQyMjUgNzc2VDI3NCA3ODVRMzI4IDc4NSAzNjEgNzUxVDM5NCA2NjVRMzk0IDY0MCAzODUgNjE4VDM2MCA1ODBUMzIyIDU1NVQyNzMgNTQ2Wk0yNzMgNjAwUTMwMCA2MDAgMzE3IDYxOFQzMzUgNjY1UTMzNSA2OTQgMzE3IDcxM1QyNzMgNzMyUTI0NyA3MzIgMjMwIDcxM1QyMTIgNjY1UTIxMiA2MzggMjI5IDYxOVQyNzMgNjAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTY7IiBnbHlwaC1uYW1lPSJhZSIgaG9yaXotYWR2LXg9Ijg5NyIgZD0iTTIxMyAtMTFRMTM1IC0xMSA5MiAyNlQ0OCAxMjZRNDggMjEwIDEyNyAyNDhUMzcxIDI4OUgzODRWMjk5UTM4NCAzNTQgMzU0IDM4M1QyNjUgNDEzUTIxMCA0MTMgMTc3IDM4OFQxMjcgMzMwUTEyNyAzMzAgMTE4IDMzMFQ5NyAzMzVUNzYgMzUwVDY2IDM3OFE2NiAzOTUgNzkgNDE1VDExNyA0NTJUMTc5IDQ4MVQyNjcgNDkzUTMzMCA0OTMgMzczIDQ3MFQ0MzkgNDA1UTQ2OSA0NDcgNTE1IDQ3MFQ2MjAgNDkzUTY3MiA0OTMgNzE1IDQ3NlQ3ODggNDI2VDgzNSAzNTBUODUyIDI1MVYyNDNRODUxIDIyNyA4NDUgMjIxVDgyMiAyMTRINDY2UTQ2OSAxODEgNDgyIDE1NFQ1MTYgMTA3VDU2NyA3NlQ2MzAgNjVRNjYxIDY1IDY4NSA3MVQ3MjggODlUNzU5IDExNFQ3ODIgMTQ1UTc4MiAxNDYgNzkwIDE0NFQ4MDcgMTM3VDgyNSAxMjJUODMzIDk2UTgzMyA4MCA4MjAgNjFUNzgwIDI2VDcxNiAtMlQ2MjggLTEzUTU1MCAtMTMgNDk3IDE3VDQxNiAxMDRRMzkwIDUzIDMzNyAyMVQyMTMgLTExWk0yMzYgNjBRMjY4IDYwIDI5NSA2OVQzNDIgOTZUMzczIDEzN1QzODQgMTkwVjIyN0wzNTcgMjI2UTI1MSAyMjIgMTk4IDIwMVQxNDUgMTMwUTE0NSA5OCAxNjkgNzlUMjM2IDYwWk02MjAgNDE4UTU2MCA0MTggNTE5IDM4MFQ0NjggMjgxSDc1NVE3NTEgMzQ0IDcxNiAzODFUNjIwIDQxOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU3OyIgZ2x5cGgtbmFtZT0iY2NlZGlsbGEiIGhvcml6LWFkdi14PSI1NDYiIGQ9Ik0yOTcgLTEzUTI0MyAtMTMgMTk3IDZUMTE4IDU4VDY2IDEzOFQ0NyAyNDFRNDcgMjk2IDY2IDM0MlQxMTggNDIxVDE5NyA0NzRUMjk3IDQ5M1EzNTEgNDkzIDM4OSA0NzlUNDUzIDQ0NFQ0OTEgNDAwVDUwMyAzNjBRNTAzIDM0NSA0OTQgMzM2VDQ3NSAzMjFUNDU1IDMxNVQ0NDQgMzE2UTQyNyAzNTYgMzk0IDM4M1QyOTkgNDEwUTI2NSA0MTAgMjM2IDM5OFQxODYgMzYzVDE1MyAzMDlUMTQxIDI0MVExNDEgMjA0IDE1MyAxNzNUMTg2IDExOVQyMzYgODNUMjk5IDcwUTM2MCA3MCAzOTMgOTdUNDQ0IDE2NFE0NDUgMTY2IDQ1NCAxNjVUNDc0IDE2MFQ0OTQgMTQ1VDUwMyAxMTlRNTAzIDEwMiA0OTEgODBUNDU0IDM3VDM4OSAyVDI5NyAtMTNaTTI0MyAtMjI0UTIzNyAtMjI5IDIyNyAtMjMwVDIwOCAtMjI5VDE5NCAtMjIwVDE5MyAtMjA1TDI0NiAtODdRMjU0IC02OCAyNjMgLTU4VDI5OSAtNDhIMzA4UTMyOCAtNDggMzQxIC01N1QzNTQgLTgzVi04OFEzNTQgLTk4IDM0NiAtMTA4VDMyMiAtMTM0TDI0MyAtMjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTg7IiBnbHlwaC1uYW1lPSJlZ3JhdmUiIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0zMDEgLTEzUTI0NCAtMTMgMTk3IDVUMTE3IDU2VDY2IDEzNVQ0NyAyMzhRNDcgMjkzIDY1IDMzOVQxMTcgNDIwVDE5NSA0NzNUMjkzIDQ5M1EzNDUgNDkzIDM4NyA0NzZUNDYwIDQyNlQ1MDcgMzUwVDUyNCAyNTFWMjQzUTUyNCAyMjcgNTE4IDIyMVQ0OTQgMjE0SDEzOVExNDIgMTgxIDE1NSAxNTRUMTg5IDEwN1QyNDAgNzZUMzAzIDY1UTMzNCA2NSAzNTggNzFUNDAxIDg5VDQzMiAxMTRUNDU0IDE0NVE0NTUgMTQ2IDQ2MyAxNDRUNDgwIDEzN1Q0OTggMTIyVDUwNiA5NlE1MDYgODAgNDkzIDYxVDQ1MyAyNlQzODggLTJUMzAxIC0xM1pNMjkyIDQxOFEyNjIgNDE4IDIzNyA0MDhUMTkxIDM4MFQxNTggMzM2VDE0MCAyODFINDI4UTQyNCAzNDQgMzg4IDM4MVQyOTIgNDE4Wk0xODMgNjA5UTE0MCA2MzUgMTQwIDY3MFExNDAgNjg3IDE1MyA2OThUMTg1IDcwOVEyMTAgNzA5IDIzMyA2OTJRMjU3IDY3NiAyODAgNjU0VDMyMCA2MTBUMzQ2IDU3NFQzNTQgNTU1UTM1MiA1NTIgMzM1IDU1M1QyOTMgNTYxVDIzOSA1NzlUMTgzIDYwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU5OyIgZ2x5cGgtbmFtZT0iZWFjdXRlIiBob3Jpei1hZHYteD0iNTcwIiBkPSJNMzAxIC0xM1EyNDQgLTEzIDE5NyA1VDExNyA1NlQ2NiAxMzVUNDcgMjM4UTQ3IDI5MyA2NSAzMzlUMTE3IDQyMFQxOTUgNDczVDI5MyA0OTNRMzQ1IDQ5MyAzODcgNDc2VDQ2MCA0MjZUNTA3IDM1MFQ1MjQgMjUxVjI0M1E1MjQgMjI3IDUxOCAyMjFUNDk0IDIxNEgxMzlRMTQyIDE4MSAxNTUgMTU0VDE4OSAxMDdUMjQwIDc2VDMwMyA2NVEzMzQgNjUgMzU4IDcxVDQwMSA4OVQ0MzIgMTE0VDQ1NCAxNDVRNDU1IDE0NiA0NjMgMTQ0VDQ4MCAxMzdUNDk4IDEyMlQ1MDYgOTZRNTA2IDgwIDQ5MyA2MVQ0NTMgMjZUMzg4IC0yVDMwMSAtMTNaTTI5MiA0MThRMjYyIDQxOCAyMzcgNDA4VDE5MSAzODBUMTU4IDMzNlQxNDAgMjgxSDQyOFE0MjQgMzQ0IDM4OCAzODFUMjkyIDQxOFpNMjE2IDU1NVEyMTQgNTU4IDIyMyA1NzNUMjUwIDYxMFQyODkgNjUzVDMzNiA2OTJRMzYyIDcwOSAzODQgNzA5UTQwMyA3MDkgNDE2IDY5OFQ0MjkgNjcwUTQyOSA2NTMgNDE5IDYzOFQzODcgNjA5UTM2MCA1OTEgMzMxIDU4MFQyNzcgNTYxVDIzNSA1NTNUMjE2IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVBOyIgZ2x5cGgtbmFtZT0iZWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0zMDEgLTEzUTI0NCAtMTMgMTk3IDVUMTE3IDU2VDY2IDEzNVQ0NyAyMzhRNDcgMjkzIDY1IDMzOVQxMTcgNDIwVDE5NSA0NzNUMjkzIDQ5M1EzNDUgNDkzIDM4NyA0NzZUNDYwIDQyNlQ1MDcgMzUwVDUyNCAyNTFWMjQzUTUyNCAyMjcgNTE4IDIyMVQ0OTQgMjE0SDEzOVExNDIgMTgxIDE1NSAxNTRUMTg5IDEwN1QyNDAgNzZUMzAzIDY1UTMzNCA2NSAzNTggNzFUNDAxIDg5VDQzMiAxMTRUNDU0IDE0NVE0NTUgMTQ2IDQ2MyAxNDRUNDgwIDEzN1Q0OTggMTIyVDUwNiA5NlE1MDYgODAgNDkzIDYxVDQ1MyAyNlQzODggLTJUMzAxIC0xM1pNMjkyIDQxOFEyNjIgNDE4IDIzNyA0MDhUMTkxIDM4MFQxNTggMzM2VDE0MCAyODFINDI4UTQyNCAzNDQgMzg4IDM4MVQyOTIgNDE4Wk0xODQgNTQ3UTE3MCA1NDcgMTYxIDU1NlQxNTIgNTc5UTE1MiA1OTkgMTcxIDYyNFQyMTQgNjcyVDI2MSA3MTBUMjkyIDcyOFEyOTkgNzI2IDMyMiA3MTFUMzY5IDY3M1Q0MTIgNjI1VDQzMSA1NzlRNDMxIDU2NSA0MjMgNTU2VDQwMCA1NDdRMzc5IDU0NyAzNTQgNTcyVDI5MSA2NTRRMjUzIDU5NyAyMjkgNTcyVDE4NCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQjsiIGdseXBoLW5hbWU9ImVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjU3MCIgZD0iTTMwMSAtMTNRMjQ0IC0xMyAxOTcgNVQxMTcgNTZUNjYgMTM1VDQ3IDIzOFE0NyAyOTMgNjUgMzM5VDExNyA0MjBUMTk1IDQ3M1QyOTMgNDkzUTM0NSA0OTMgMzg3IDQ3NlQ0NjAgNDI2VDUwNyAzNTBUNTI0IDI1MVYyNDNRNTI0IDIyNyA1MTggMjIxVDQ5NCAyMTRIMTM5UTE0MiAxODEgMTU1IDE1NFQxODkgMTA3VDI0MCA3NlQzMDMgNjVRMzM0IDY1IDM1OCA3MVQ0MDEgODlUNDMyIDExNFQ0NTQgMTQ1UTQ1NSAxNDYgNDYzIDE0NFQ0ODAgMTM3VDQ5OCAxMjJUNTA2IDk2UTUwNiA4MCA0OTMgNjFUNDUzIDI2VDM4OCAtMlQzMDEgLTEzWk0yOTIgNDE4UTI2MiA0MTggMjM3IDQwOFQxOTEgMzgwVDE1OCAzMzZUMTQwIDI4MUg0MjhRNDI0IDM0NCAzODggMzgxVDI5MiA0MThaTTM4NSA1NDZRMzU2IDU0NiAzNDAgNTYxVDMyNCA2MDVRMzI0IDYzNCAzNDAgNjQ5VDM4MyA2NjVRNDEwIDY2NSA0MjYgNjUwVDQ0MyA2MDVRNDQzIDU3NyA0MjcgNTYyVDM4NSA1NDZaTTIwMSA1NDZRMTc0IDU0NiAxNTggNTYxVDE0MSA2MDVRMTQxIDYzNCAxNTcgNjQ5VDE5OSA2NjVRMjI4IDY2NSAyNDQgNjUwVDI2MCA2MDVRMjYwIDU3NyAyNDQgNTYyVDIwMSA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFQzsiIGdseXBoLW5hbWU9ImlncmF2ZSIgaG9yaXotYWR2LXg9IjI2MCIgZD0iTTgwIDQzOFE4MCA0NjUgOTIgNDc1VDEyNSA0ODZIMTM1UTE1NSA0ODYgMTY3IDQ3NlQxNzkgNDM4VjBIODBWNDM4Wk0yNCA2MDlRLTE5IDYzNSAtMTkgNjcwUS0xOSA2ODcgLTYgNjk4VDI2IDcwOVE1MSA3MDkgNzQgNjkyUTk4IDY3NiAxMjEgNjU0VDE2MSA2MTBUMTg3IDU3NFQxOTUgNTU1UTE5MyA1NTIgMTc2IDU1M1QxMzQgNTYxVDgwIDU3OVQyNCA2MDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFRDsiIGdseXBoLW5hbWU9ImlhY3V0ZSIgaG9yaXotYWR2LXg9IjI2MCIgZD0iTTgwIDQzOFE4MCA0NjUgOTIgNDc1VDEyNSA0ODZIMTM1UTE1NSA0ODYgMTY3IDQ3NlQxNzkgNDM4VjBIODBWNDM4Wk03MSA1NTVRNjkgNTU4IDc4IDU3M1QxMDUgNjEwVDE0NCA2NTNUMTkxIDY5MlEyMTcgNzA5IDIzOSA3MDlRMjU4IDcwOSAyNzEgNjk4VDI4NCA2NzBRMjg0IDY1MyAyNzQgNjM4VDI0MiA2MDlRMjE1IDU5MSAxODYgNTgwVDEzMiA1NjFUOTAgNTUzVDcxIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVFOyIgZ2x5cGgtbmFtZT0iaWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIyNjAiIGQ9Ik04MCA0MzhRODAgNDY1IDkyIDQ3NVQxMjUgNDg2SDEzNVExNTUgNDg2IDE2NyA0NzZUMTc5IDQzOFYwSDgwVjQzOFpNMjUgNTQ3UTExIDU0NyAyIDU1NlQtNyA1NzlRLTcgNTk5IDEyIDYyNFQ1NSA2NzJUMTAyIDcxMFQxMzMgNzI4UTE0MCA3MjYgMTYzIDcxMVQyMTAgNjczVDI1MyA2MjVUMjcyIDU3OVEyNzIgNTY1IDI2NCA1NTZUMjQxIDU0N1EyMjAgNTQ3IDE5NSA1NzJUMTMyIDY1NFE5NCA1OTcgNzAgNTcyVDI1IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVGOyIgZ2x5cGgtbmFtZT0iaWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMjYwIiBkPSJNODAgNDM4UTgwIDQ2NSA5MiA0NzVUMTI1IDQ4NkgxMzVRMTU1IDQ4NiAxNjcgNDc2VDE3OSA0MzhWMEg4MFY0MzhaTTIyNiA1NDZRMTk3IDU0NiAxODEgNTYxVDE2NSA2MDVRMTY1IDYzNCAxODEgNjQ5VDIyNCA2NjVRMjUxIDY2NSAyNjcgNjUwVDI4NCA2MDVRMjg0IDU3NyAyNjggNTYyVDIyNiA1NDZaTTQyIDU0NlExNSA1NDYgLTEgNTYxVC0xOCA2MDVRLTE4IDYzNCAtMiA2NDlUNDAgNjY1UTY5IDY2NSA4NSA2NTBUMTAxIDYwNVExMDEgNTc3IDg1IDU2MlQ0MiA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGMDsiIGdseXBoLW5hbWU9Im51bGwiIGhvcml6LWFkdi14PSI2MTAiIGQ9Ik0yMjQgNDk1UTIwNSA0ODQgMTkyIDQ4OFQxNzIgNTA2TDE3MCA1MTFRMTYyIDUyNSAxNjYgNTM3VDE5MCA1NjFMMjY0IDYwMVExOTUgNjMwIDExNiA2MzZRMTEzIDYzNiAxMTQgNjQ2VDEyMiA2NjlUMTQ2IDY5MlQxODkgNzAyUTIyOCA3MDIgMjcyIDY4OVQzNjEgNjUwTDQ2NiA3MDhRNDg2IDcxOSA0OTggNzE1VDUxOCA2OTZMNTIxIDY5M1E1NDAgNjY0IDUwMCA2NDNMNDI1IDYwM1E0ODIgNTUxIDUxOSA0NzJUNTU2IDI4M1E1NTYgMjEzIDUzNyAxNThUNDg0IDY1VDQwMyA3VDI5NyAtMTNRMjQyIC0xMyAxOTcgM1QxMjAgNDlUNzEgMTIyVDUzIDIxOVE1MyAyNjkgNzAgMzEwVDExOCAzODFUMTkyIDQyN1QyODggNDQzUTM0NSA0NDMgMzg5IDQxOVQ0NTYgMzYyUTQ0NSA0MjUgNDE0IDQ3NFQzMzcgNTU4TDIyNCA0OTVaTTI5OCA2OFEzMzUgNjggMzY0IDgyVDQxNCAxMjBUNDQ0IDE3OVQ0NTUgMjUyVjI4NVE0NDYgMzAwIDQzMSAzMTVUMzk2IDM0MVQzNTMgMzYwVDMwNSAzNjdRMjMwIDM2NyAxOTAgMzI5VDE1MCAyMjBRMTUwIDE0OCAxOTAgMTA4VDI5OCA2OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYxOyIgZ2x5cGgtbmFtZT0ibnRpbGRlIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNMTEyIDQ4NlExMzQgNDg2IDE1MyA0NzFUMTc0IDQwOFExOTkgNDQ1IDIzOCA0NjlUMzM0IDQ5M1EzODIgNDkzIDQxNyA0NzhUNDc1IDQzNVQ1MDkgMzcwVDUyMCAyODdWMEg0MjFWMjc1UTQyMSAzMzYgMzkyIDM3MVQzMTAgNDA2UTI2MiA0MDYgMjI4IDM4M1QxNzUgMzIyVjBINzZWNDc1UTc2IDQ3NyA4NiA0ODFUMTEyIDQ4NlpNMTc0IDU1MlExNTcgNTUyIDE0OCA1NjFUMTM5IDU4N1ExMzkgNjA2IDE0NSA2MjNUMTYxIDY1NFQxODYgNjc1VDIxNyA2ODNRMjQ0IDY4MyAyODIgNjY0VDM2MSA2MDhRMzY5IDYzNCAzODIgNjU1VDQxMiA2NzdRNDI5IDY3NyA0MzggNjY4VDQ0NyA2NDFRNDQ3IDYyMiA0NDEgNjA1VDQyNSA1NzVUNDAwIDU1NFQzNjkgNTQ2UTM0MSA1NDYgMzAzIDU2NVQyMjUgNjIxUTIxNiA1OTUgMjA0IDU3NFQxNzQgNTUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjI7IiBnbHlwaC1uYW1lPSJvZ3JhdmUiIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik0yOTkgLTEzUTI0MyAtMTMgMTk3IDVUMTE3IDU4VDY2IDEzOFQ0NyAyNDFRNDcgMjk2IDY1IDM0MlQxMTcgNDIyVDE5NyA0NzRUMzAwIDQ5M1EzNTUgNDkzIDQwMSA0NzRUNDgwIDQyMlQ1MzIgMzQxVDU1MSAyMzlRNTUxIDE4NCA1MzMgMTM4VDQ4MSA1OFQ0MDEgNlQyOTkgLTEzWk0yOTkgNjhRMzMzIDY4IDM2MiA4MVQ0MTMgMTE3VDQ0NyAxNzFUNDU5IDIzOVE0NTkgMjc2IDQ0NyAzMDhUNDE0IDM2M1QzNjQgMzk5VDI5OSA0MTJRMjY0IDQxMiAyMzUgMzk5VDE4NCAzNjRUMTUwIDMxMFQxMzggMjQxUTEzOCAyMDQgMTUwIDE3M1QxODQgMTE4VDIzNSA4MVQyOTkgNjhaTTE4OCA2MDlRMTQ1IDYzNSAxNDUgNjcwUTE0NSA2ODcgMTU4IDY5OFQxOTAgNzA5UTIxNSA3MDkgMjM4IDY5MlEyNjIgNjc2IDI4NSA2NTRUMzI1IDYxMFQzNTEgNTc0VDM1OSA1NTVRMzU3IDU1MiAzNDAgNTUzVDI5OCA1NjFUMjQ0IDU3OVQxODggNjA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjM7IiBnbHlwaC1uYW1lPSJvYWN1dGUiIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik0yOTkgLTEzUTI0MyAtMTMgMTk3IDVUMTE3IDU4VDY2IDEzOFQ0NyAyNDFRNDcgMjk2IDY1IDM0MlQxMTcgNDIyVDE5NyA0NzRUMzAwIDQ5M1EzNTUgNDkzIDQwMSA0NzRUNDgwIDQyMlQ1MzIgMzQxVDU1MSAyMzlRNTUxIDE4NCA1MzMgMTM4VDQ4MSA1OFQ0MDEgNlQyOTkgLTEzWk0yOTkgNjhRMzMzIDY4IDM2MiA4MVQ0MTMgMTE3VDQ0NyAxNzFUNDU5IDIzOVE0NTkgMjc2IDQ0NyAzMDhUNDE0IDM2M1QzNjQgMzk5VDI5OSA0MTJRMjY0IDQxMiAyMzUgMzk5VDE4NCAzNjRUMTUwIDMxMFQxMzggMjQxUTEzOCAyMDQgMTUwIDE3M1QxODQgMTE4VDIzNSA4MVQyOTkgNjhaTTI0MyA1NTVRMjQxIDU1OCAyNTAgNTczVDI3NyA2MTBUMzE2IDY1M1QzNjMgNjkyUTM4OSA3MDkgNDExIDcwOVE0MzAgNzA5IDQ0MyA2OThUNDU2IDY3MFE0NTYgNjUzIDQ0NiA2MzhUNDE0IDYwOVEzODcgNTkxIDM1OCA1ODBUMzA0IDU2MVQyNjIgNTUzVDI0MyA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNDsiIGdseXBoLW5hbWU9Im9jaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMjk5IC0xM1EyNDMgLTEzIDE5NyA1VDExNyA1OFQ2NiAxMzhUNDcgMjQxUTQ3IDI5NiA2NSAzNDJUMTE3IDQyMlQxOTcgNDc0VDMwMCA0OTNRMzU1IDQ5MyA0MDEgNDc0VDQ4MCA0MjJUNTMyIDM0MVQ1NTEgMjM5UTU1MSAxODQgNTMzIDEzOFQ0ODEgNThUNDAxIDZUMjk5IC0xM1pNMjk5IDY4UTMzMyA2OCAzNjIgODFUNDEzIDExN1Q0NDcgMTcxVDQ1OSAyMzlRNDU5IDI3NiA0NDcgMzA4VDQxNCAzNjNUMzY0IDM5OVQyOTkgNDEyUTI2NCA0MTIgMjM1IDM5OVQxODQgMzY0VDE1MCAzMTBUMTM4IDI0MVExMzggMjA0IDE1MCAxNzNUMTg0IDExOFQyMzUgODFUMjk5IDY4Wk0xOTMgNTQ3UTE3OSA1NDcgMTcwIDU1NlQxNjEgNTc5UTE2MSA1OTkgMTgwIDYyNFQyMjMgNjcyVDI3MCA3MTBUMzAxIDcyOFEzMDggNzI2IDMzMSA3MTFUMzc4IDY3M1Q0MjEgNjI1VDQ0MCA1NzlRNDQwIDU2NSA0MzIgNTU2VDQwOSA1NDdRMzg4IDU0NyAzNjMgNTcyVDMwMCA2NTRRMjYyIDU5NyAyMzggNTcyVDE5MyA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNTsiIGdseXBoLW5hbWU9Im90aWxkZSIgaG9yaXotYWR2LXg9IjU5OCIgZD0iTTI5OSAtMTNRMjQzIC0xMyAxOTcgNVQxMTcgNThUNjYgMTM4VDQ3IDI0MVE0NyAyOTYgNjUgMzQyVDExNyA0MjJUMTk3IDQ3NFQzMDAgNDkzUTM1NSA0OTMgNDAxIDQ3NFQ0ODAgNDIyVDUzMiAzNDFUNTUxIDIzOVE1NTEgMTg0IDUzMyAxMzhUNDgxIDU4VDQwMSA2VDI5OSAtMTNaTTI5OSA2OFEzMzMgNjggMzYyIDgxVDQxMyAxMTdUNDQ3IDE3MVQ0NTkgMjM5UTQ1OSAyNzYgNDQ3IDMwOFQ0MTQgMzYzVDM2NCAzOTlUMjk5IDQxMlEyNjQgNDEyIDIzNSAzOTlUMTg0IDM2NFQxNTAgMzEwVDEzOCAyNDFRMTM4IDIwNCAxNTAgMTczVDE4NCAxMThUMjM1IDgxVDI5OSA2OFpNMTgzIDU1MlExNjYgNTUyIDE1NyA1NjFUMTQ4IDU4N1ExNDggNjA2IDE1NCA2MjNUMTcwIDY1NFQxOTUgNjc1VDIyNiA2ODNRMjUzIDY4MyAyOTEgNjY0VDM3MCA2MDhRMzc4IDYzNCAzOTEgNjU1VDQyMSA2NzdRNDM4IDY3NyA0NDcgNjY4VDQ1NiA2NDFRNDU2IDYyMiA0NTAgNjA1VDQzNCA1NzVUNDA5IDU1NFQzNzggNTQ2UTM1MCA1NDYgMzEyIDU2NVQyMzQgNjIxUTIyNSA1OTUgMjEzIDU3NFQxODMgNTUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjY7IiBnbHlwaC1uYW1lPSJvZGllcmVzaXMiIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik0yOTkgLTEzUTI0MyAtMTMgMTk3IDVUMTE3IDU4VDY2IDEzOFQ0NyAyNDFRNDcgMjk2IDY1IDM0MlQxMTcgNDIyVDE5NyA0NzRUMzAwIDQ5M1EzNTUgNDkzIDQwMSA0NzRUNDgwIDQyMlQ1MzIgMzQxVDU1MSAyMzlRNTUxIDE4NCA1MzMgMTM4VDQ4MSA1OFQ0MDEgNlQyOTkgLTEzWk0yOTkgNjhRMzMzIDY4IDM2MiA4MVQ0MTMgMTE3VDQ0NyAxNzFUNDU5IDIzOVE0NTkgMjc2IDQ0NyAzMDhUNDE0IDM2M1QzNjQgMzk5VDI5OSA0MTJRMjY0IDQxMiAyMzUgMzk5VDE4NCAzNjRUMTUwIDMxMFQxMzggMjQxUTEzOCAyMDQgMTUwIDE3M1QxODQgMTE4VDIzNSA4MVQyOTkgNjhaTTM5NCA1NDZRMzY1IDU0NiAzNDkgNTYxVDMzMyA2MDVRMzMzIDYzNCAzNDkgNjQ5VDM5MiA2NjVRNDE5IDY2NSA0MzUgNjUwVDQ1MiA2MDVRNDUyIDU3NyA0MzYgNTYyVDM5NCA1NDZaTTIxMCA1NDZRMTgzIDU0NiAxNjcgNTYxVDE1MCA2MDVRMTUwIDYzNCAxNjYgNjQ5VDIwOCA2NjVRMjM3IDY2NSAyNTMgNjUwVDI2OSA2MDVRMjY5IDU3NyAyNTMgNTYyVDIxMCA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGNzsiIGdseXBoLW5hbWU9ImRpdmlkZSIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTMwOCAzNzhRMjU3IDM3OCAyNTcgNDI5VjQ0MFEyNTcgNDY0IDI3MCA0NzdUMzA4IDQ5MUgzMjBRMzQ2IDQ5MSAzNTkgNDc4VDM3MiA0NDBWNDI5UTM3MiAzNzggMzIwIDM3OEgzMDhaTTMwOCAzOFEyNTcgMzggMjU3IDg5VjEwMFEyNTcgMTUxIDMwOCAxNTFIMzIwUTM3MiAxNTEgMzcyIDEwMFY4OVEzNzIgMzggMzIwIDM4SDMwOFpNMTMzIDIyM1ExMTAgMjIzIDEwMCAyMzNUOTAgMjYxVjI2OFE5MCAyODUgMTAwIDI5NVQxMzMgMzA2SDQ5NlE1MTkgMzA2IDUyOSAyOTZUNTM5IDI2OFYyNjFRNTM5IDI0MyA1MjkgMjMzVDQ5NiAyMjNIMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjg7IiBnbHlwaC1uYW1lPSJvc2xhc2giIGhvcml6LWFkdi14PSI1OTgiIGQ9Ik04OSAtNDZRODcgLTQ4IDgxIC00NlQ2NiAtMzlUNTIgLTI3VDQ2IC05UTQ2IDAgNTEgMTFUNjkgMzZMMTA3IDc4UTgxIDExMCA2NyAxNTFUNTMgMjM5UTUzIDI5MiA3MiAzMzhUMTI1IDQxOVQyMDQgNDczVDMwMyA0OTNRMzQ0IDQ5MyAzNzkgNDgxVDQ0NSA0NDlMNTE0IDUyNlE1MTUgNTI3IDUyMiA1MjZUNTM3IDUxOVQ1NTEgNTA3VDU1NyA0ODlRNTU3IDQ4MSA1NTIgNDcwVDUzNSA0NDVMNDk2IDQwM1E1MjIgMzcwIDUzNiAzMjlUNTUxIDI0MVE1NTEgMTg4IDUzMiAxNDJUNDc5IDYxVDQwMCA3VDMwMSAtMTNRMjYwIC0xMyAyMjUgLTJUMTU5IDMxTDg5IC00NlpNMzAyIDY4UTMzNiA2OCAzNjUgODFUNDE2IDExN1Q0NDkgMTcxVDQ2MSAyNDBRNDYxIDI5NyA0MzIgMzQwTDIxMyA5OVEyMzIgODUgMjU0IDc3VDMwMiA2OFpNMzkxIDM4MlEzNTIgNDEyIDMwMiA0MTJRMjY3IDQxMiAyMzggMzk5VDE4OCAzNjNUMTU1IDMwOVQxNDMgMjQwUTE0MyAyMTIgMTUwIDE4N1QxNzIgMTQxTDM5MSAzODJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGOTsiIGdseXBoLW5hbWU9InVncmF2ZSIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaTTE4MiA2MDlRMTM5IDYzNSAxMzkgNjcwUTEzOSA2ODcgMTUyIDY5OFQxODQgNzA5UTIwOSA3MDkgMjMyIDY5MlEyNTYgNjc2IDI3OSA2NTRUMzE5IDYxMFQzNDUgNTc0VDM1MyA1NTVRMzUxIDU1MiAzMzQgNTUzVDI5MiA1NjFUMjM4IDU3OVQxODIgNjA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkE7IiBnbHlwaC1uYW1lPSJ1YWN1dGUiIGhvcml6LWFkdi14PSI1OTEiIGQ9Ik00ODAgLTRRNDY5IC00IDQ1OCAtMVQ0MzggMTBUNDI0IDM0VDQxNyA3MlEzOTEgMzUgMzUyIDEyVDI1NyAtMTJRMjA5IC0xMiAxNzUgM1QxMTcgNDZUODMgMTExVDcyIDE5NFY0ODFIMTcwVjIwNlExNzAgMTQzIDIwMCAxMDlUMjg1IDc0UTMzMCA3NCAzNjQgOTdUNDE3IDE1OVY0ODFINTE1VjdRNTE1IDUgNTA1IDFUNDgwIC00Wk0yNDUgNTU1UTI0MyA1NTggMjUyIDU3M1QyNzkgNjEwVDMxOCA2NTNUMzY1IDY5MlEzOTEgNzA5IDQxMyA3MDlRNDMyIDcwOSA0NDUgNjk4VDQ1OCA2NzBRNDU4IDY1MyA0NDggNjM4VDQxNiA2MDlRMzg5IDU5MSAzNjAgNTgwVDMwNiA1NjFUMjY0IDU1M1QyNDUgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkI7IiBnbHlwaC1uYW1lPSJ1Y2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaTTE4OCA1NDdRMTc0IDU0NyAxNjUgNTU2VDE1NiA1NzlRMTU2IDU5OSAxNzUgNjI0VDIxOCA2NzJUMjY1IDcxMFQyOTYgNzI4UTMwMyA3MjYgMzI2IDcxMVQzNzMgNjczVDQxNiA2MjVUNDM1IDU3OVE0MzUgNTY1IDQyNyA1NTZUNDA0IDU0N1EzODMgNTQ3IDM1OCA1NzJUMjk1IDY1NFEyNTcgNTk3IDIzMyA1NzJUMTg4IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZDOyIgZ2x5cGgtbmFtZT0idWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNNDgwIC00UTQ2OSAtNCA0NTggLTFUNDM4IDEwVDQyNCAzNFQ0MTcgNzJRMzkxIDM1IDM1MiAxMlQyNTcgLTEyUTIwOSAtMTIgMTc1IDNUMTE3IDQ2VDgzIDExMVQ3MiAxOTRWNDgxSDE3MFYyMDZRMTcwIDE0MyAyMDAgMTA5VDI4NSA3NFEzMzAgNzQgMzY0IDk3VDQxNyAxNTlWNDgxSDUxNVY3UTUxNSA1IDUwNSAxVDQ4MCAtNFpNMzkwIDU0NlEzNjEgNTQ2IDM0NSA1NjFUMzI5IDYwNVEzMjkgNjM0IDM0NSA2NDlUMzg4IDY2NVE0MTUgNjY1IDQzMSA2NTBUNDQ4IDYwNVE0NDggNTc3IDQzMiA1NjJUMzkwIDU0NlpNMjA2IDU0NlExNzkgNTQ2IDE2MyA1NjFUMTQ2IDYwNVExNDYgNjM0IDE2MiA2NDlUMjA0IDY2NVEyMzMgNjY1IDI0OSA2NTBUMjY1IDYwNVEyNjUgNTc3IDI0OSA1NjJUMjA2IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZEOyIgZ2x5cGgtbmFtZT0ieWFjdXRlIiBob3Jpei1hZHYteD0iNTI4IiBkPSJNMjE0IC0xOTVRMjAzIC0xOTUgMTk0IC0xOTJUMTc3IC0xODRUMTY1IC0xNzVUMTYyIC0xNjhMMjQyIDI3UTIyNSAyOSAyMTYgMzRUMjAwIDU1TDE4IDQ4MUgxMjBMMjczIDk4TDQwOSA0ODFINTEwTDI3NSAtMTQwUTI2MyAtMTcyIDI0NyAtMTgzVDIxNCAtMTk1Wk0yMDYgNTQ3UTIwNCA1NTAgMjEzIDU2NVQyNDAgNjAyVDI3OSA2NDVUMzI2IDY4NFEzNTIgNzAxIDM3NCA3MDFRMzkzIDcwMSA0MDYgNjkwVDQxOSA2NjJRNDE5IDY0NSA0MDkgNjMwVDM3NyA2MDFRMzUwIDU4MyAzMjEgNTcyVDI2NyA1NTNUMjI1IDU0NVQyMDYgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBnbHlwaC1uYW1lPSJ0aG9ybiIgaG9yaXotYWR2LXg9IjYyMyIgZD0iTTM0MCAtMTNRMjgyIC0xMyAyNDAgMTJUMTc1IDcxVi0xNDlRMTc1IC0xNzYgMTYzIC0xODZUMTMxIC0xOTZIMTIwUTEwMCAtMTk2IDg4IC0xODZUNzYgLTE0OVY2NzZRNzYgNjc4IDg2IDY4MlQxMTIgNjg3UTEyMyA2ODcgMTM0IDY4NFQxNTUgNjcxVDE2OSA2NDVUMTc1IDYwMlY0MDJRMjA0IDQ0NCAyNDYgNDY4VDM0MyA0OTNRMzkxIDQ5MyA0MzIgNDc1VDUwNCA0MjRUNTUxIDM0NVQ1NjggMjQxUTU2OCAxODQgNTUxIDEzN1Q1MDQgNTdUNDMyIDVUMzQwIC0xM1pNMzIyIDY5UTM5MCA2OSA0MzEgMTE2VDQ3MiAyNDBRNDcyIDI3NyA0NjEgMzA4VDQzMSAzNjNUMzg0IDM5OFQzMjQgNDExUTI2OSA0MTEgMjMyIDM4NVQxNzUgMzE0VjE5MlExNzggMTY1IDE5MSAxNDNUMjI0IDEwNFQyNjkgNzhUMzIyIDY5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkY7IiBnbHlwaC1uYW1lPSJ5ZGllcmVzaXMiIGhvcml6LWFkdi14PSI1MjgiIGQ9Ik0yMTQgLTE5NVEyMDMgLTE5NSAxOTQgLTE5MlQxNzcgLTE4NFQxNjUgLTE3NVQxNjIgLTE2OEwyNDIgMjdRMjI1IDI5IDIxNiAzNFQyMDAgNTVMMTggNDgxSDEyMEwyNzMgOThMNDA5IDQ4MUg1MTBMMjc1IC0xNDBRMjYzIC0xNzIgMjQ3IC0xODNUMjE0IC0xOTVaTTM2MSA1NDZRMzMyIDU0NiAzMTYgNTYxVDMwMCA2MDVRMzAwIDYzNCAzMTYgNjQ5VDM1OSA2NjVRMzg2IDY2NSA0MDIgNjUwVDQxOSA2MDVRNDE5IDU3NyA0MDMgNTYyVDM2MSA1NDZaTTE3NyA1NDZRMTUwIDU0NiAxMzQgNTYxVDExNyA2MDVRMTE3IDYzNCAxMzMgNjQ5VDE3NSA2NjVRMjA0IDY2NSAyMjAgNjUwVDIzNiA2MDVRMjM2IDU3NyAyMjAgNTYyVDE3NyA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDA7IiBnbHlwaC1uYW1lPSJBbWFjcm9uIiBob3Jpei1hZHYteD0iNjYwIiBkPSJNNDU3IDE5MEgxOThMMTI1IDBIMjBMMjU4IDYyMFEyNjQgNjM2IDI3OSA2NDRUMzI5IDY1M1EzNjUgNjUzIDM3OSA2NDVUNDAwIDYyMEw2NDIgMEg1MzFMNDU3IDE5MFpNMjIzIDI3M0g0MzFMMzI3IDU0N0wyMjMgMjczWk0yMjIgNzI3UTE3MiA3MjcgMTcyIDc2NlY3NzJRMTcyIDc5MCAxODUgNzk5VDIyMiA4MDlINDM2UTQ4NiA4MDkgNDg2IDc3MlY3NjZRNDg2IDcyNyA0MzYgNzI3SDIyMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMTsiIGdseXBoLW5hbWU9ImFtYWNyb24iIGhvcml6LWFkdi14PSI1NTMiIGQ9Ik0yMTIgLTExUTEzNCAtMTEgOTEgMjZUNDggMTI2UTQ4IDIxMCAxMjcgMjQ4VDM3MSAyODlIMzg0VjI5OVEzODQgMzU0IDM1NCAzODNUMjY1IDQxMlEyMTAgNDEyIDE3NyAzODhUMTI3IDMzMFExMjcgMzMwIDExOCAzMzBUOTcgMzM1VDc2IDM1MFQ2NiAzNzhRNjYgMzk1IDc5IDQxNVQxMTggNDUyVDE4MiA0ODFUMjcyIDQ5M1EzNzUgNDkzIDQyOCA0NDNUNDgyIDMwMVYwSDM4NVYxNFY3MlEzNTcgMzMgMzEyIDExVDIxMiAtMTFaTTIzNiA2MFEyNjggNjAgMjk1IDY5VDM0MiA5NlQzNzMgMTM3VDM4NCAxOTBWMjI3TDM1NyAyMjZRMjUxIDIyMiAxOTggMjAxVDE0NSAxMzBRMTQ1IDk4IDE2OSA3OVQyMzYgNjBaTTE3OCA1NjJRMTI4IDU2MiAxMjggNjAxVjYwN1ExMjggNjI1IDE0MSA2MzRUMTc4IDY0NEgzOTJRNDQyIDY0NCA0NDIgNjA3VjYwMVE0NDIgNTYyIDM5MiA1NjJIMTc4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAyOyIgZ2x5cGgtbmFtZT0iQWJyZXZlIiBob3Jpei1hZHYteD0iNjYwIiBkPSJNNDU3IDE5MEgxOThMMTI1IDBIMjBMMjU4IDYyMFEyNjQgNjM2IDI3OSA2NDRUMzI5IDY1M1EzNjUgNjUzIDM3OSA2NDVUNDAwIDYyMEw2NDIgMEg1MzFMNDU3IDE5MFpNMjIzIDI3M0g0MzFMMzI3IDU0N0wyMjMgMjczWk0zMzAgNzExUTMwNSA3MTEgMjc5IDcyMlQyMzAgNzQ5VDE5MyA3ODVUMTc4IDgyMlExNzggODM5IDE4OCA4NDlUMjE2IDg2MFEyMjUgODYwIDIzOCA4NTJUMjY4IDgzMFQzMDAgODAxVDMzMiA3NjlRMzQ2IDc4NSAzNjEgODAxVDM5MiA4MzBUNDIxIDg1MVQ0NDQgODYwUTQ2MiA4NjAgNDcyIDg1MFQ0ODIgODIyUTQ4MiA4MDQgNDY3IDc4NVQ0MzAgNzQ5VDM4MSA3MjJUMzMwIDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwMzsiIGdseXBoLW5hbWU9ImFicmV2ZSIgaG9yaXotYWR2LXg9IjU1MyIgZD0iTTIxMiAtMTFRMTM0IC0xMSA5MSAyNlQ0OCAxMjZRNDggMjEwIDEyNyAyNDhUMzcxIDI4OUgzODRWMjk5UTM4NCAzNTQgMzU0IDM4M1QyNjUgNDEyUTIxMCA0MTIgMTc3IDM4OFQxMjcgMzMwUTEyNyAzMzAgMTE4IDMzMFQ5NyAzMzVUNzYgMzUwVDY2IDM3OFE2NiAzOTUgNzkgNDE1VDExOCA0NTJUMTgyIDQ4MVQyNzIgNDkzUTM3NSA0OTMgNDI4IDQ0M1Q0ODIgMzAxVjBIMzg1VjE0VjcyUTM1NyAzMyAzMTIgMTFUMjEyIC0xMVpNMjM2IDYwUTI2OCA2MCAyOTUgNjlUMzQyIDk2VDM3MyAxMzdUMzg0IDE5MFYyMjdMMzU3IDIyNlEyNTEgMjIyIDE5OCAyMDFUMTQ1IDEzMFExNDUgOTggMTY5IDc5VDIzNiA2MFpNMjgzIDU0NlEyNTggNTQ2IDIzMiA1NTdUMTgzIDU4NFQxNDYgNjIwVDEzMSA2NTdRMTMxIDY3NCAxNDEgNjg0VDE2OSA2OTVRMTc4IDY5NSAxOTEgNjg3VDIyMSA2NjVUMjUzIDYzNlQyODUgNjA0UTI5OSA2MjAgMzE0IDYzNlQzNDUgNjY1VDM3NCA2ODZUMzk3IDY5NVE0MTUgNjk1IDQyNSA2ODVUNDM1IDY1N1E0MzUgNjM5IDQyMCA2MjBUMzgzIDU4NFQzMzQgNTU3VDI4MyA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDQ7IiBnbHlwaC1uYW1lPSJBb2dvbmVrIiBob3Jpei1hZHYteD0iNjYwIiBkPSJNNDU3IDE5MEgxOThMMTI1IDBIMjBMMjU4IDYyMFEyNjQgNjM2IDI3OSA2NDRUMzI5IDY1M1EzNjUgNjUzIDM3OSA2NDVUNDAwIDYyMEw2NDIgMEg2MDZRNTY4IC0zMSA1NTUgLTUzVDU0MSAtOTJRNTQxIC0xMDggNTUwIC0xMTdUNTc0IC0xMjdRNTk5IC0xMjcgNjExIC0xMDdRNjIzIC0xMDggNjMzIC0xMThUNjQ0IC0xNDVRNjQ0IC0xNjggNjI0IC0xODJUNTY2IC0xOTZRNTIwIC0xOTYgNDkzIC0xNzRUNDY1IC0xMTFRNDY1IC04MiA0ODQgLTUzVDU0MiAwSDUzMUw0NTcgMTkwWk0yMjMgMjczSDQzMUwzMjcgNTQ3TDIyMyAyNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDU7IiBnbHlwaC1uYW1lPSJhb2dvbmVrIiBob3Jpei1hZHYteD0iNTUzIiBkPSJNMjEyIC0xMVExMzQgLTExIDkxIDI2VDQ4IDEyNlE0OCAyMTAgMTI3IDI0OFQzNzEgMjg5SDM4NFYyOTlRMzg0IDM1NCAzNTQgMzgzVDI2NSA0MTJRMjEwIDQxMiAxNzcgMzg4VDEyNyAzMzBRMTI3IDMzMCAxMTggMzMwVDk3IDMzNVQ3NiAzNTBUNjYgMzc4UTY2IDM5NSA3OSA0MTVUMTE4IDQ1MlQxODIgNDgxVDI3MiA0OTNRMzc1IDQ5MyA0MjggNDQzVDQ4MiAzMDFWMEg0NzVRNDMyIC0zNCA0MTcgLTU3VDQwMSAtOTlRNDAxIC0xMTUgNDEwIC0xMjRUNDM0IC0xMzRRNDU5IC0xMzQgNDcxIC0xMTRRNDgzIC0xMTUgNDkzIC0xMjVUNTA0IC0xNTJRNTA0IC0xNzUgNDg0IC0xODlUNDI2IC0yMDNRMzgwIC0yMDMgMzUzIC0xODFUMzI1IC0xMThRMzI1IC04NiAzNDcgLTU1VDQxMyAwSDM4NVYxNFY3MlEzNTcgMzMgMzEyIDExVDIxMiAtMTFaTTIzNiA2MFEyNjggNjAgMjk1IDY5VDM0MiA5NlQzNzMgMTM3VDM4NCAxOTBWMjI3TDM1NyAyMjZRMjUxIDIyMiAxOTggMjAxVDE0NSAxMzBRMTQ1IDk4IDE2OSA3OVQyMzYgNjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDY7IiBnbHlwaC1uYW1lPSJDYWN1dGUiIGhvcml6LWFkdi14PSI2ODciIGQ9Ik0zODUgLTEzUTMxMyAtMTMgMjUzIDExVDE1MCA4MFQ4MyAxODZUNTkgMzIyUTU5IDM5NiA4MyA0NThUMTUwIDU2NVQyNTQgNjM1VDM4OCA2NjBRNDQ5IDY2MCA0OTQgNjQ1VDU3MCA2MDlUNjE2IDU2NFQ2MzIgNTIzUTYzMiA1MDUgNjIzIDQ5NFQ2MDMgNDc2VDU4MyA0NjdUNTcyIDQ2N1E1NDQgNTE2IDQ5NCA1NDFUMzg5IDU2N1EzNDAgNTY3IDI5OSA1NTBUMjI5IDUwMFQxODMgNDIzVDE2NiAzMjRRMTY2IDI3MCAxODMgMjI2VDIzMCAxNDlUMzAxIDk4VDM5MSA4MFE0NTcgODAgNTA3IDExMFQ1NzggMTkzUTU3OSAxOTUgNTg5IDE5NFQ2MTEgMTg2VDYzMiAxNjhUNjQyIDEzOFE2NDIgMTIwIDYyNiA5NFQ1NzggNDVUNDk4IDRUMzg1IC0xM1pNMzI0IDcyMFEzMjIgNzIzIDMzMSA3MzhUMzU4IDc3NVQzOTcgODE4VDQ0NCA4NTdRNDcwIDg3NCA0OTIgODc0UTUxMSA4NzQgNTI0IDg2M1Q1MzcgODM1UTUzNyA4MTggNTI3IDgwM1Q0OTUgNzc0UTQ2OCA3NTYgNDM5IDc0NVQzODUgNzI2VDM0MyA3MThUMzI0IDcyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNzsiIGdseXBoLW5hbWU9ImNhY3V0ZSIgaG9yaXotYWR2LXg9IjU0NiIgZD0iTTI5NyAtMTNRMjQzIC0xMyAxOTcgNlQxMTggNThUNjYgMTM4VDQ3IDI0MVE0NyAyOTYgNjYgMzQyVDExOCA0MjFUMTk3IDQ3NFQyOTcgNDkzUTM1MSA0OTMgMzg5IDQ3OVQ0NTMgNDQ0VDQ5MSA0MDBUNTAzIDM2MFE1MDMgMzQ1IDQ5NCAzMzZUNDc1IDMyMVQ0NTUgMzE1VDQ0NCAzMTZRNDI3IDM1NiAzOTQgMzgzVDI5OSA0MTBRMjY1IDQxMCAyMzYgMzk4VDE4NiAzNjNUMTUzIDMwOVQxNDEgMjQxUTE0MSAyMDQgMTUzIDE3M1QxODYgMTE5VDIzNiA4M1QyOTkgNzBRMzYwIDcwIDM5MyA5N1Q0NDQgMTY0UTQ0NSAxNjYgNDU0IDE2NVQ0NzQgMTYwVDQ5NCAxNDVUNTAzIDExOVE1MDMgMTAyIDQ5MSA4MFQ0NTQgMzdUMzg5IDJUMjk3IC0xM1pNMjMzIDU1NVEyMzEgNTU4IDI0MCA1NzNUMjY3IDYxMFQzMDYgNjUzVDM1MyA2OTJRMzc5IDcwOSA0MDEgNzA5UTQyMCA3MDkgNDMzIDY5OFQ0NDYgNjcwUTQ0NiA2NTMgNDM2IDYzOFQ0MDQgNjA5UTM3NyA1OTEgMzQ4IDU4MFQyOTQgNTYxVDI1MiA1NTNUMjMzIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGdseXBoLW5hbWU9IkNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNTAgODBUODMgMTg2VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODggNjYwUTQ0OSA2NjAgNDk0IDY0NVQ1NzAgNjA5VDYxNiA1NjRUNjMyIDUyM1E2MzIgNTA1IDYyMyA0OTRUNjAzIDQ3NlQ1ODMgNDY3VDU3MiA0NjdRNTQ0IDUxNiA0OTQgNTQxVDM4OSA1NjdRMzQwIDU2NyAyOTkgNTUwVDIyOSA1MDBUMTgzIDQyM1QxNjYgMzI0UTE2NiAyNzAgMTgzIDIyNlQyMzAgMTQ5VDMwMSA5OFQzOTEgODBRNDU3IDgwIDUwNyAxMTBUNTc4IDE5M1E1NzkgMTk1IDU4OSAxOTRUNjExIDE4NlQ2MzIgMTY4VDY0MiAxMzhRNjQyIDEyMCA2MjYgOTRUNTc4IDQ1VDQ5OCA0VDM4NSAtMTNaTTI2NiA3MTJRMjUyIDcxMiAyNDMgNzIxVDIzNCA3NDRRMjM0IDc2NCAyNTMgNzg5VDI5NiA4MzdUMzQzIDg3NVQzNzQgODkzUTM4MSA4OTEgNDA0IDg3NlQ0NTEgODM4VDQ5NCA3OTBUNTEzIDc0NFE1MTMgNzMwIDUwNSA3MjFUNDgyIDcxMlE0NjEgNzEyIDQzNiA3MzdUMzczIDgxOVEzMzUgNzYyIDMxMSA3MzdUMjY2IDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwOTsiIGdseXBoLW5hbWU9ImNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTQ2IiBkPSJNMjk3IC0xM1EyNDMgLTEzIDE5NyA2VDExOCA1OFQ2NiAxMzhUNDcgMjQxUTQ3IDI5NiA2NiAzNDJUMTE4IDQyMVQxOTcgNDc0VDI5NyA0OTNRMzUxIDQ5MyAzODkgNDc5VDQ1MyA0NDRUNDkxIDQwMFQ1MDMgMzYwUTUwMyAzNDUgNDk0IDMzNlQ0NzUgMzIxVDQ1NSAzMTVUNDQ0IDMxNlE0MjcgMzU2IDM5NCAzODNUMjk5IDQxMFEyNjUgNDEwIDIzNiAzOThUMTg2IDM2M1QxNTMgMzA5VDE0MSAyNDFRMTQxIDIwNCAxNTMgMTczVDE4NiAxMTlUMjM2IDgzVDI5OSA3MFEzNjAgNzAgMzkzIDk3VDQ0NCAxNjRRNDQ1IDE2NiA0NTQgMTY1VDQ3NCAxNjBUNDk0IDE0NVQ1MDMgMTE5UTUwMyAxMDIgNDkxIDgwVDQ1NCAzN1QzODkgMlQyOTcgLTEzWk0xOTUgNTQ3UTE4MSA1NDcgMTcyIDU1NlQxNjMgNTc5UTE2MyA1OTkgMTgyIDYyNFQyMjUgNjcyVDI3MiA3MTBUMzAzIDcyOFEzMTAgNzI2IDMzMyA3MTFUMzgwIDY3M1Q0MjMgNjI1VDQ0MiA1NzlRNDQyIDU2NSA0MzQgNTU2VDQxMSA1NDdRMzkwIDU0NyAzNjUgNTcyVDMwMiA2NTRRMjY0IDU5NyAyNDAgNTcyVDE5NSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEE7IiBnbHlwaC1uYW1lPSJDZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNTAgODBUODMgMTg2VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODggNjYwUTQ0OSA2NjAgNDk0IDY0NVQ1NzAgNjA5VDYxNiA1NjRUNjMyIDUyM1E2MzIgNTA1IDYyMyA0OTRUNjAzIDQ3NlQ1ODMgNDY3VDU3MiA0NjdRNTQ0IDUxNiA0OTQgNTQxVDM4OSA1NjdRMzQwIDU2NyAyOTkgNTUwVDIyOSA1MDBUMTgzIDQyM1QxNjYgMzI0UTE2NiAyNzAgMTgzIDIyNlQyMzAgMTQ5VDMwMSA5OFQzOTEgODBRNDU3IDgwIDUwNyAxMTBUNTc4IDE5M1E1NzkgMTk1IDU4OSAxOTRUNjExIDE4NlQ2MzIgMTY4VDY0MiAxMzhRNjQyIDEyMCA2MjYgOTRUNTc4IDQ1VDQ5OCA0VDM4NSAtMTNaTTM4MyA3MTJRMzUyIDcxMiAzMzUgNzI5VDMxNyA3NzRRMzE3IDgwMSAzMzUgODE5VDM4NCA4MzdRNDE0IDgzNyA0MzEgODE5VDQ0OSA3NzRRNDQ5IDc0NyA0MzIgNzMwVDM4MyA3MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEI7IiBnbHlwaC1uYW1lPSJjZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTQ2IiBkPSJNMjk3IC0xM1EyNDMgLTEzIDE5NyA2VDExOCA1OFQ2NiAxMzhUNDcgMjQxUTQ3IDI5NiA2NiAzNDJUMTE4IDQyMVQxOTcgNDc0VDI5NyA0OTNRMzUxIDQ5MyAzODkgNDc5VDQ1MyA0NDRUNDkxIDQwMFQ1MDMgMzYwUTUwMyAzNDUgNDk0IDMzNlQ0NzUgMzIxVDQ1NSAzMTVUNDQ0IDMxNlE0MjcgMzU2IDM5NCAzODNUMjk5IDQxMFEyNjUgNDEwIDIzNiAzOThUMTg2IDM2M1QxNTMgMzA5VDE0MSAyNDFRMTQxIDIwNCAxNTMgMTczVDE4NiAxMTlUMjM2IDgzVDI5OSA3MFEzNjAgNzAgMzkzIDk3VDQ0NCAxNjRRNDQ1IDE2NiA0NTQgMTY1VDQ3NCAxNjBUNDk0IDE0NVQ1MDMgMTE5UTUwMyAxMDIgNDkxIDgwVDQ1NCAzN1QzODkgMlQyOTcgLTEzWk0zMDYgNTQ3UTI3NSA1NDcgMjU4IDU2NFQyNDAgNjA5UTI0MCA2MzYgMjU4IDY1NFQzMDcgNjcyUTMzNyA2NzIgMzU0IDY1NFQzNzIgNjA5UTM3MiA1ODIgMzU1IDU2NVQzMDYgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBDOyIgZ2x5cGgtbmFtZT0iQ2Nhcm9uIiBob3Jpei1hZHYteD0iNjg3IiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNTAgODBUODMgMTg2VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODggNjYwUTQ0OSA2NjAgNDk0IDY0NVQ1NzAgNjA5VDYxNiA1NjRUNjMyIDUyM1E2MzIgNTA1IDYyMyA0OTRUNjAzIDQ3NlQ1ODMgNDY3VDU3MiA0NjdRNTQ0IDUxNiA0OTQgNTQxVDM4OSA1NjdRMzQwIDU2NyAyOTkgNTUwVDIyOSA1MDBUMTgzIDQyM1QxNjYgMzI0UTE2NiAyNzAgMTgzIDIyNlQyMzAgMTQ5VDMwMSA5OFQzOTEgODBRNDU3IDgwIDUwNyAxMTBUNTc4IDE5M1E1NzkgMTk1IDU4OSAxOTRUNjExIDE4NlQ2MzIgMTY4VDY0MiAxMzhRNjQyIDEyMCA2MjYgOTRUNTc4IDQ1VDQ5OCA0VDM4NSAtMTNaTTQ5NCA4NzlRNTA4IDg3OSA1MTYgODcwVDUyNSA4NDZRNTI1IDgyNiA1MDYgODAxVDQ2MyA3NTRUNDE2IDcxNVQzODYgNjk3UTM3OCA2OTggMzU2IDcxNFQzMDkgNzUzVDI2NiA4MDFUMjQ3IDg0NlEyNDcgODYwIDI1NSA4NjlUMjc4IDg3OVEyOTkgODc5IDMyMyA4NTRUMzg2IDc3MVE0MjQgODI4IDQ0OCA4NTNUNDk0IDg3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRDsiIGdseXBoLW5hbWU9ImNjYXJvbiIgaG9yaXotYWR2LXg9IjU0NiIgZD0iTTI5NyAtMTNRMjQzIC0xMyAxOTcgNlQxMTggNThUNjYgMTM4VDQ3IDI0MVE0NyAyOTYgNjYgMzQyVDExOCA0MjFUMTk3IDQ3NFQyOTcgNDkzUTM1MSA0OTMgMzg5IDQ3OVQ0NTMgNDQ0VDQ5MSA0MDBUNTAzIDM2MFE1MDMgMzQ1IDQ5NCAzMzZUNDc1IDMyMVQ0NTUgMzE1VDQ0NCAzMTZRNDI3IDM1NiAzOTQgMzgzVDI5OSA0MTBRMjY1IDQxMCAyMzYgMzk4VDE4NiAzNjNUMTUzIDMwOVQxNDEgMjQxUTE0MSAyMDQgMTUzIDE3M1QxODYgMTE5VDIzNiA4M1QyOTkgNzBRMzYwIDcwIDM5MyA5N1Q0NDQgMTY0UTQ0NSAxNjYgNDU0IDE2NVQ0NzQgMTYwVDQ5NCAxNDVUNTAzIDExOVE1MDMgMTAyIDQ5MSA4MFQ0NTQgMzdUMzg5IDJUMjk3IC0xM1pNNDEwIDcxNFE0MjQgNzE0IDQzMiA3MDVUNDQxIDY4MVE0NDEgNjYxIDQyMiA2MzZUMzc5IDU4OVQzMzIgNTUwVDMwMiA1MzJRMjk0IDUzMyAyNzIgNTQ5VDIyNSA1ODhUMTgyIDYzNlQxNjMgNjgxUTE2MyA2OTUgMTcxIDcwNFQxOTQgNzE0UTIxNSA3MTQgMjM5IDY4OVQzMDIgNjA2UTM0MCA2NjMgMzY0IDY4OFQ0MTAgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBFOyIgZ2x5cGgtbmFtZT0iRGNhcm9uIiBob3Jpei1hZHYteD0iNzA3IiBkPSJNODQgNTg5UTg0IDYxNSAxMDAgNjMxVDEzOSA2NDdIMjk3UTM3OSA2NDcgNDQ0IDYyNVQ1NTUgNTYyVDYyNCA0NjFUNjQ4IDMyNVE2NDggMjQ5IDYyNCAxODlUNTUzIDg3VDQ0MSAyM1QyOTIgMEg4NFY1ODlaTTI5NCA4OVE0MTMgODkgNDc4IDE1MFQ1NDQgMzI0UTU0NCA0MzUgNDc5IDQ5NlQyOTUgNTU4SDE4NlY4OUgyOTRaTTQzMiA4NzlRNDQ2IDg3OSA0NTQgODcwVDQ2MyA4NDZRNDYzIDgyNiA0NDQgODAxVDQwMSA3NTRUMzU0IDcxNVQzMjQgNjk3UTMxNiA2OTggMjk0IDcxNFQyNDcgNzUzVDIwNCA4MDFUMTg1IDg0NlExODUgODYwIDE5MyA4NjlUMjE2IDg3OVEyMzcgODc5IDI2MSA4NTRUMzI0IDc3MVEzNjIgODI4IDM4NiA4NTNUNDMyIDg3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwRjsiIGdseXBoLW5hbWU9ImRjYXJvbiIgaG9yaXotYWR2LXg9IjgwNCIgZD0iTTI3MiAtMTNRMjI0IC0xMyAxODMgNVQxMTEgNTZUNjQgMTM2VDQ3IDI0MFE0NyAyOTcgNjQgMzQzVDExMSA0MjNUMTgzIDQ3NVQyNzUgNDkzUTMzNCA0OTMgMzc2IDQ3MFQ0NDAgNDE0VjY3NlE0NDAgNjc4IDQ1MSA2ODJUNDc2IDY4N1E0ODggNjg3IDQ5OSA2ODRUNTE5IDY3MVQ1MzMgNjQ1VDUzOSA2MDJWMEg0NDFWODBRNDEyIDM2IDM3MSAxMlQyNzIgLTEzWk0yOTEgNjlRMzIxIDY5IDM0OCA3OVQzOTYgMTA4VDQyOSAxNTNUNDQxIDIxMFYzMTJRNDIyIDM1OCAzODYgMzg0VDI5MyA0MTFRMjI1IDQxMSAxODQgMzY1VDE0MyAyNDBRMTQzIDIwMiAxNTQgMTcxVDE4NCAxMTdUMjMxIDgyVDI5MSA2OVpNNjY1IDQ1MlE2NjAgNDQ1IDY1MCA0NDRUNjMxIDQ0NVQ2MTcgNDU1VDYxNSA0NzRMNjY4IDY0NFE2NzYgNjY4IDY4NSA2NzlUNzIwIDY5MUg3MjlRNzQ4IDY5MSA3NTkgNjc5VDc3MSA2NDRWNjQwUTc3MSA2MTAgNzQ4IDU3OUw2NjUgNDUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEwOyIgZ2x5cGgtbmFtZT0iRGNyb2F0IiBob3Jpei1hZHYteD0iNzUxIiBkPSJNNjcgMjg0UTQ1IDI4NCAzNyAyOTRUMjggMzIwVjMyOVEyOCAzNDQgMzYgMzU0VDY3IDM2NEgxMjBWNTg5UTEyMCA2MTUgMTM2IDYzMVQxNzUgNjQ3SDMzN1E0MTkgNjQ3IDQ4NSA2MjVUNTk3IDU2MVQ2NjcgNDYwVDY5MiAzMjVRNjkyIDI1MCA2NjcgMTkwVDU5NSA4N1Q0ODIgMjNUMzMyIDBIMTc3UTE1MyAwIDEzNyAxN1QxMjAgNTdWMjg0SDY3Wk0zMzggOTFRNDU5IDkxIDUyNCAxNTFUNTg5IDMyNFE1ODkgNDM0IDUyNCA0OTVUMzM5IDU1NkgyMjJWMzY0SDM5N1E0MTkgMzY0IDQyOCAzNTRUNDM3IDMyOVYzMjBRNDM3IDMwNCA0MjggMjk0VDM5NyAyODRIMjIyVjkxSDMzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMTsiIGdseXBoLW5hbWU9ImRjcm9hdCIgaG9yaXotYWR2LXg9IjYxNSIgZD0iTTI3MiAtMTNRMjI0IC0xMyAxODMgNVQxMTEgNTZUNjQgMTM2VDQ3IDI0MFE0NyAyOTcgNjQgMzQzVDExMSA0MjNUMTgzIDQ3NVQyNzUgNDkzUTMzNCA0OTMgMzc2IDQ3MFQ0NDAgNDE0VjUzOEgzNTdRMzE4IDUzOCAzMTggNTY2VjU3M1EzMTggNjAyIDM1NyA2MDJINDQwVjY3NlE0NDAgNjc4IDQ1MSA2ODJUNDc2IDY4N1E0ODggNjg3IDQ5OSA2ODRUNTE5IDY3MVQ1MzMgNjQ1VDUzOSA2MDJINTc2UTYxNSA2MDIgNjE1IDU3M1Y1NjZRNjE1IDU1MiA2MDUgNTQ1VDU3NiA1MzhINTM5VjBINDQxVjgwUTQxMiAzNiAzNzEgMTJUMjcyIC0xM1pNMjkxIDY5UTMyMSA2OSAzNDggNzlUMzk2IDEwOFQ0MjkgMTUzVDQ0MSAyMTBWMzEyUTQyMiAzNTggMzg2IDM4NFQyOTMgNDExUTIyNSA0MTEgMTg0IDM2NVQxNDMgMjQwUTE0MyAyMDIgMTU0IDE3MVQxODQgMTE3VDIzMSA4MlQyOTEgNjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTI7IiBnbHlwaC1uYW1lPSJFbWFjcm9uIiBob3Jpei1hZHYteD0iNjE3IiBkPSJNODQgNTg5UTg0IDYxNSA5OSA2MzFUMTM5IDY0N0g1NjJWNTU1SDE4N1YzNzRINDg4VjI4N0gxODdWOTFINTY3VjBIODRWNTg5Wk0yMTUgNzI3UTE2NSA3MjcgMTY1IDc2NlY3NzJRMTY1IDc5MCAxNzggNzk5VDIxNSA4MDlINDI5UTQ3OSA4MDkgNDc5IDc3MlY3NjZRNDc5IDcyNyA0MjkgNzI3SDIxNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExMzsiIGdseXBoLW5hbWU9ImVtYWNyb24iIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0zMDEgLTEzUTI0NCAtMTMgMTk3IDVUMTE3IDU2VDY2IDEzNVQ0NyAyMzhRNDcgMjkzIDY1IDMzOVQxMTcgNDIwVDE5NSA0NzNUMjkzIDQ5M1EzNDUgNDkzIDM4NyA0NzZUNDYwIDQyNlQ1MDcgMzUwVDUyNCAyNTFWMjQzUTUyNCAyMjcgNTE4IDIyMVQ0OTQgMjE0SDEzOVExNDIgMTgxIDE1NSAxNTRUMTg5IDEwN1QyNDAgNzZUMzAzIDY1UTMzNCA2NSAzNTggNzFUNDAxIDg5VDQzMiAxMTRUNDU0IDE0NVE0NTUgMTQ2IDQ2MyAxNDRUNDgwIDEzN1Q0OTggMTIyVDUwNiA5NlE1MDYgODAgNDkzIDYxVDQ1MyAyNlQzODggLTJUMzAxIC0xM1pNMjkyIDQxOFEyNjIgNDE4IDIzNyA0MDhUMTkxIDM4MFQxNTggMzM2VDE0MCAyODFINDI4UTQyNCAzNDQgMzg4IDM4MVQyOTIgNDE4Wk0xODUgNTYyUTEzNSA1NjIgMTM1IDYwMVY2MDdRMTM1IDYyNSAxNDggNjM0VDE4NSA2NDRIMzk5UTQ0OSA2NDQgNDQ5IDYwN1Y2MDFRNDQ5IDU2MiAzOTkgNTYySDE4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNDsiIGdseXBoLW5hbWU9IkVicmV2ZSIgaG9yaXotYWR2LXg9IjYxNyIgZD0iTTg0IDU4OVE4NCA2MTUgOTkgNjMxVDEzOSA2NDdINTYyVjU1NUgxODdWMzc0SDQ4OFYyODdIMTg3VjkxSDU2N1YwSDg0VjU4OVpNMzI0IDcxMVEyOTkgNzExIDI3MyA3MjJUMjI0IDc0OVQxODcgNzg1VDE3MiA4MjJRMTcyIDgzOSAxODIgODQ5VDIxMCA4NjBRMjE5IDg2MCAyMzIgODUyVDI2MiA4MzBUMjk0IDgwMVQzMjYgNzY5UTM0MCA3ODUgMzU1IDgwMVQzODYgODMwVDQxNSA4NTFUNDM4IDg2MFE0NTYgODYwIDQ2NiA4NTBUNDc2IDgyMlE0NzYgODA0IDQ2MSA3ODVUNDI0IDc0OVQzNzUgNzIyVDMyNCA3MTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTU7IiBnbHlwaC1uYW1lPSJlYnJldmUiIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0zMDEgLTEzUTI0NCAtMTMgMTk3IDVUMTE3IDU2VDY2IDEzNVQ0NyAyMzhRNDcgMjkzIDY1IDMzOVQxMTcgNDIwVDE5NSA0NzNUMjkzIDQ5M1EzNDUgNDkzIDM4NyA0NzZUNDYwIDQyNlQ1MDcgMzUwVDUyNCAyNTFWMjQzUTUyNCAyMjcgNTE4IDIyMVQ0OTQgMjE0SDEzOVExNDIgMTgxIDE1NSAxNTRUMTg5IDEwN1QyNDAgNzZUMzAzIDY1UTMzNCA2NSAzNTggNzFUNDAxIDg5VDQzMiAxMTRUNDU0IDE0NVE0NTUgMTQ2IDQ2MyAxNDRUNDgwIDEzN1Q0OTggMTIyVDUwNiA5NlE1MDYgODAgNDkzIDYxVDQ1MyAyNlQzODggLTJUMzAxIC0xM1pNMjkyIDQxOFEyNjIgNDE4IDIzNyA0MDhUMTkxIDM4MFQxNTggMzM2VDE0MCAyODFINDI4UTQyNCAzNDQgMzg4IDM4MVQyOTIgNDE4Wk0yOTMgNTQ2UTI2OCA1NDYgMjQyIDU1N1QxOTMgNTg0VDE1NiA2MjBUMTQxIDY1N1ExNDEgNjc0IDE1MSA2ODRUMTc5IDY5NVExODggNjk1IDIwMSA2ODdUMjMxIDY2NVQyNjMgNjM2VDI5NSA2MDRRMzA5IDYyMCAzMjQgNjM2VDM1NSA2NjVUMzg0IDY4NlQ0MDcgNjk1UTQyNSA2OTUgNDM1IDY4NVQ0NDUgNjU3UTQ0NSA2MzkgNDMwIDYyMFQzOTMgNTg0VDM0NCA1NTdUMjkzIDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNjsiIGdseXBoLW5hbWU9IkVkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI2MTciIGQ9Ik04NCA1ODlRODQgNjE1IDk5IDYzMVQxMzkgNjQ3SDU2MlY1NTVIMTg3VjM3NEg0ODhWMjg3SDE4N1Y5MUg1NjdWMEg4NFY1ODlaTTMzMCA3MTJRMjk5IDcxMiAyODIgNzI5VDI2NCA3NzRRMjY0IDgwMSAyODIgODE5VDMzMSA4MzdRMzYxIDgzNyAzNzggODE5VDM5NiA3NzRRMzk2IDc0NyAzNzkgNzMwVDMzMCA3MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTc7IiBnbHlwaC1uYW1lPSJlZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTcwIiBkPSJNMzAxIC0xM1EyNDQgLTEzIDE5NyA1VDExNyA1NlQ2NiAxMzVUNDcgMjM4UTQ3IDI5MyA2NSAzMzlUMTE3IDQyMFQxOTUgNDczVDI5MyA0OTNRMzQ1IDQ5MyAzODcgNDc2VDQ2MCA0MjZUNTA3IDM1MFQ1MjQgMjUxVjI0M1E1MjQgMjI3IDUxOCAyMjFUNDk0IDIxNEgxMzlRMTQyIDE4MSAxNTUgMTU0VDE4OSAxMDdUMjQwIDc2VDMwMyA2NVEzMzQgNjUgMzU4IDcxVDQwMSA4OVQ0MzIgMTE0VDQ1NCAxNDVRNDU1IDE0NiA0NjMgMTQ0VDQ4MCAxMzdUNDk4IDEyMlQ1MDYgOTZRNTA2IDgwIDQ5MyA2MVQ0NTMgMjZUMzg4IC0yVDMwMSAtMTNaTTI5MiA0MThRMjYyIDQxOCAyMzcgNDA4VDE5MSAzODBUMTU4IDMzNlQxNDAgMjgxSDQyOFE0MjQgMzQ0IDM4OCAzODFUMjkyIDQxOFpNMjg4IDU0N1EyNTcgNTQ3IDI0MCA1NjRUMjIyIDYwOVEyMjIgNjM2IDI0MCA2NTRUMjg5IDY3MlEzMTkgNjcyIDMzNiA2NTRUMzU0IDYwOVEzNTQgNTgyIDMzNyA1NjVUMjg4IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExODsiIGdseXBoLW5hbWU9IkVvZ29uZWsiIGhvcml6LWFkdi14PSI2MTciIGQ9Ik04NCA1ODlRODQgNjE1IDk5IDYzMVQxMzkgNjQ3SDU2MlY1NTVIMTg3VjM3NEg0ODhWMjg3SDE4N1Y5MUg1NjdWMEg1NDFRNTAzIC0zMiA0ODkgLTUzVDQ3NSAtOTNRNDc1IC0xMDkgNDg0IC0xMThUNTA4IC0xMjhRNTMzIC0xMjggNTQ1IC0xMDhRNTU3IC0xMDkgNTY3IC0xMTlUNTc4IC0xNDZRNTc4IC0xNjkgNTU4IC0xODNUNTAwIC0xOTdRNDU0IC0xOTcgNDI3IC0xNzVUMzk5IC0xMTJRMzk5IC04MiA0MTggLTUzVDQ3NyAwSDg0VjU4OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExOTsiIGdseXBoLW5hbWU9ImVvZ29uZWsiIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0zMDEgLTEzUTI0NCAtMTMgMTk3IDVUMTE3IDU2VDY2IDEzNVQ0NyAyMzhRNDcgMjkzIDY1IDMzOVQxMTcgNDIwVDE5NSA0NzNUMjkzIDQ5M1EzNDUgNDkzIDM4NyA0NzZUNDYwIDQyNlQ1MDcgMzUwVDUyNCAyNTFWMjQzUTUyNCAyMjcgNTE4IDIyMVQ0OTQgMjE0SDEzOVExNDIgMTgxIDE1NSAxNTRUMTg5IDEwN1QyNDAgNzZUMzAzIDY1UTMzNCA2NSAzNTggNzFUNDAxIDg5VDQzMiAxMTRUNDU0IDE0NVE0NTUgMTQ2IDQ2MyAxNDRUNDgwIDEzN1Q0OTggMTIyVDUwNiA5NlE1MDYgNzcgNDg3IDU1VDQzMyAxNFEzOTIgLTE4IDM3OCAtNDBUMzYzIC04MVEzNjMgLTk3IDM3MiAtMTA2VDM5NiAtMTE2UTQyMSAtMTE2IDQzMyAtOTZRNDQ1IC05NyA0NTUgLTEwN1Q0NjYgLTEzNFE0NjYgLTE1NyA0NDYgLTE3MVQzODggLTE4NVEzNDIgLTE4NSAzMTUgLTE2M1QyODcgLTEwMFEyODcgLTc3IDI5OCAtNTRUMzMzIC0xMVEzMjUgLTEyIDMxNyAtMTJUMzAxIC0xM1pNMjkyIDQxOFEyNjIgNDE4IDIzNyA0MDhUMTkxIDM4MFQxNTggMzM2VDE0MCAyODFINDI4UTQyNCAzNDQgMzg4IDM4MVQyOTIgNDE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFBOyIgZ2x5cGgtbmFtZT0iRWNhcm9uIiBob3Jpei1hZHYteD0iNjE3IiBkPSJNODQgNTg5UTg0IDYxNSA5OSA2MzFUMTM5IDY0N0g1NjJWNTU1SDE4N1YzNzRINDg4VjI4N0gxODdWOTFINTY3VjBIODRWNTg5Wk00MzQgODc5UTQ0OCA4NzkgNDU2IDg3MFQ0NjUgODQ2UTQ2NSA4MjYgNDQ2IDgwMVQ0MDMgNzU0VDM1NiA3MTVUMzI2IDY5N1EzMTggNjk4IDI5NiA3MTRUMjQ5IDc1M1QyMDYgODAxVDE4NyA4NDZRMTg3IDg2MCAxOTUgODY5VDIxOCA4NzlRMjM5IDg3OSAyNjMgODU0VDMyNiA3NzFRMzY0IDgyOCAzODggODUzVDQzNCA4NzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUI7IiBnbHlwaC1uYW1lPSJlY2Fyb24iIGhvcml6LWFkdi14PSI1NzAiIGQ9Ik0zMDEgLTEzUTI0NCAtMTMgMTk3IDVUMTE3IDU2VDY2IDEzNVQ0NyAyMzhRNDcgMjkzIDY1IDMzOVQxMTcgNDIwVDE5NSA0NzNUMjkzIDQ5M1EzNDUgNDkzIDM4NyA0NzZUNDYwIDQyNlQ1MDcgMzUwVDUyNCAyNTFWMjQzUTUyNCAyMjcgNTE4IDIyMVQ0OTQgMjE0SDEzOVExNDIgMTgxIDE1NSAxNTRUMTg5IDEwN1QyNDAgNzZUMzAzIDY1UTMzNCA2NSAzNTggNzFUNDAxIDg5VDQzMiAxMTRUNDU0IDE0NVE0NTUgMTQ2IDQ2MyAxNDRUNDgwIDEzN1Q0OTggMTIyVDUwNiA5NlE1MDYgODAgNDkzIDYxVDQ1MyAyNlQzODggLTJUMzAxIC0xM1pNMjkyIDQxOFEyNjIgNDE4IDIzNyA0MDhUMTkxIDM4MFQxNTggMzM2VDE0MCAyODFINDI4UTQyNCAzNDQgMzg4IDM4MVQyOTIgNDE4Wk0zOTYgNzE0UTQxMCA3MTQgNDE4IDcwNVQ0MjcgNjgxUTQyNyA2NjEgNDA4IDYzNlQzNjUgNTg5VDMxOCA1NTBUMjg4IDUzMlEyODAgNTMzIDI1OCA1NDlUMjExIDU4OFQxNjggNjM2VDE0OSA2ODFRMTQ5IDY5NSAxNTcgNzA0VDE4MCA3MTRRMjAxIDcxNCAyMjUgNjg5VDI4OCA2MDZRMzI2IDY2MyAzNTAgNjg4VDM5NiA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUM7IiBnbHlwaC1uYW1lPSJHY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9Ijc0MiIgZD0iTTYzNiAtNFE2MjUgLTQgNjE1IC0xVDU5NyAxMlQ1ODUgMzdUNTgwIDc5VjkxUTU1MCA0MyA0OTUgMTZUMzY1IC0xMlEyOTUgLTEyIDIzOSAxM1QxNDIgODJUODEgMTg4VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MSA1NjVUMjU2IDYzNVQzOTEgNjYwUTQ1MCA2NjAgNDk1IDY0NlQ1NzIgNjEyVDYyMCA1NjhUNjM2IDUyNlE2MzYgNTA4IDYyOCA0OTdUNjA5IDQ4MFQ1OTAgNDczVDU4MCA0NzNRNTUwIDUyMSA0OTkgNTQ2VDM5MyA1NzFRMzQzIDU3MSAzMDEgNTUzVDIyOSA1MDFUMTgyIDQyMlQxNjUgMzIxUTE2NSAyNjcgMTgwIDIyMVQyMjMgMTQyVDI5MyA5MFQzODUgNzFRNDI0IDcxIDQ1NyA4MVQ1MTYgMTExVDU1OCAxNTdUNTc5IDIxNlYyNTdIMzc1VjM0MUg2MTVRNjQzIDM0MSA2NTYgMzI1VDY3MCAyODJWNlE2NzAgNCA2NjAgMFQ2MzYgLTRaTTI3MCA3MTJRMjU2IDcxMiAyNDcgNzIxVDIzOCA3NDRRMjM4IDc2NCAyNTcgNzg5VDMwMCA4MzdUMzQ3IDg3NVQzNzggODkzUTM4NSA4OTEgNDA4IDg3NlQ0NTUgODM4VDQ5OCA3OTBUNTE3IDc0NFE1MTcgNzMwIDUwOSA3MjFUNDg2IDcxMlE0NjUgNzEyIDQ0MCA3MzdUMzc3IDgxOVEzMzkgNzYyIDMxNSA3MzdUMjcwIDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRDsiIGdseXBoLW5hbWU9ImdjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMjk1IC0xOTlRMjQyIC0xOTkgMjAyIC0xODdUMTM0IC0xNTdUOTMgLTExOFQ3OSAtNzlRNzkgLTY0IDg2IC01NFQxMDEgLTM3VDExNiAtMjlUMTI1IC0yOFExNDggLTY2IDE4NyAtOTBUMjkyIC0xMTVRNDQwIC0xMTUgNDQwIDMzVjk2UTQxMSA1NCAzNzAgMzJUMjcxIDlRMjIxIDkgMTgwIDI2VDExMCA3NFQ2NCAxNDlUNDcgMjUwUTQ3IDMwMyA2NCAzNDdUMTEyIDQyNFQxODQgNDc1VDI3NSA0OTNRMzMzIDQ5MyAzNzYgNDcxVDQ0MiA0MTdWNDgxSDUzOVYzNVE1MzkgLTg0IDQ3NyAtMTQxVDI5NSAtMTk5Wk0yOTEgODhRMzIwIDg4IDM0NiA5N1QzOTMgMTI0VDQyNiAxNjZUNDQxIDIxOVYzMThRNDIxIDM2MiAzODQgMzg3VDI5MyA0MTJRMjU5IDQxMiAyMzIgNDAwVDE4NSAzNjdUMTU0IDMxNVQxNDMgMjUwUTE0MyAxNzYgMTgzIDEzMlQyOTEgODhaTTE5MiA1NDdRMTc4IDU0NyAxNjkgNTU2VDE2MCA1NzlRMTYwIDU5OSAxNzkgNjI0VDIyMiA2NzJUMjY5IDcxMFQzMDAgNzI4UTMwNyA3MjYgMzMwIDcxMVQzNzcgNjczVDQyMCA2MjVUNDM5IDU3OVE0MzkgNTY1IDQzMSA1NTZUNDA4IDU0N1EzODcgNTQ3IDM2MiA1NzJUMjk5IDY1NFEyNjEgNTk3IDIzNyA1NzJUMTkyIDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRTsiIGdseXBoLW5hbWU9IkdicmV2ZSIgaG9yaXotYWR2LXg9Ijc0MiIgZD0iTTYzNiAtNFE2MjUgLTQgNjE1IC0xVDU5NyAxMlQ1ODUgMzdUNTgwIDc5VjkxUTU1MCA0MyA0OTUgMTZUMzY1IC0xMlEyOTUgLTEyIDIzOSAxM1QxNDIgODJUODEgMTg4VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MSA1NjVUMjU2IDYzNVQzOTEgNjYwUTQ1MCA2NjAgNDk1IDY0NlQ1NzIgNjEyVDYyMCA1NjhUNjM2IDUyNlE2MzYgNTA4IDYyOCA0OTdUNjA5IDQ4MFQ1OTAgNDczVDU4MCA0NzNRNTUwIDUyMSA0OTkgNTQ2VDM5MyA1NzFRMzQzIDU3MSAzMDEgNTUzVDIyOSA1MDFUMTgyIDQyMlQxNjUgMzIxUTE2NSAyNjcgMTgwIDIyMVQyMjMgMTQyVDI5MyA5MFQzODUgNzFRNDI0IDcxIDQ1NyA4MVQ1MTYgMTExVDU1OCAxNTdUNTc5IDIxNlYyNTdIMzc1VjM0MUg2MTVRNjQzIDM0MSA2NTYgMzI1VDY3MCAyODJWNlE2NzAgNCA2NjAgMFQ2MzYgLTRaTTM3OCA3MTFRMzUzIDcxMSAzMjcgNzIyVDI3OCA3NDlUMjQxIDc4NVQyMjYgODIyUTIyNiA4MzkgMjM2IDg0OVQyNjQgODYwUTI3MyA4NjAgMjg2IDg1MlQzMTYgODMwVDM0OCA4MDFUMzgwIDc2OVEzOTQgNzg1IDQwOSA4MDFUNDQwIDgzMFQ0NjkgODUxVDQ5MiA4NjBRNTEwIDg2MCA1MjAgODUwVDUzMCA4MjJRNTMwIDgwNCA1MTUgNzg1VDQ3OCA3NDlUNDI5IDcyMlQzNzggNzExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFGOyIgZ2x5cGgtbmFtZT0iZ2JyZXZlIiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMjk1IC0xOTlRMjQyIC0xOTkgMjAyIC0xODdUMTM0IC0xNTdUOTMgLTExOFQ3OSAtNzlRNzkgLTY0IDg2IC01NFQxMDEgLTM3VDExNiAtMjlUMTI1IC0yOFExNDggLTY2IDE4NyAtOTBUMjkyIC0xMTVRNDQwIC0xMTUgNDQwIDMzVjk2UTQxMSA1NCAzNzAgMzJUMjcxIDlRMjIxIDkgMTgwIDI2VDExMCA3NFQ2NCAxNDlUNDcgMjUwUTQ3IDMwMyA2NCAzNDdUMTEyIDQyNFQxODQgNDc1VDI3NSA0OTNRMzMzIDQ5MyAzNzYgNDcxVDQ0MiA0MTdWNDgxSDUzOVYzNVE1MzkgLTg0IDQ3NyAtMTQxVDI5NSAtMTk5Wk0yOTEgODhRMzIwIDg4IDM0NiA5N1QzOTMgMTI0VDQyNiAxNjZUNDQxIDIxOVYzMThRNDIxIDM2MiAzODQgMzg3VDI5MyA0MTJRMjU5IDQxMiAyMzIgNDAwVDE4NSAzNjdUMTU0IDMxNVQxNDMgMjUwUTE0MyAxNzYgMTgzIDEzMlQyOTEgODhaTTMwMSA1NDZRMjc2IDU0NiAyNTAgNTU3VDIwMSA1ODRUMTY0IDYyMFQxNDkgNjU3UTE0OSA2NzQgMTU5IDY4NFQxODcgNjk1UTE5NiA2OTUgMjA5IDY4N1QyMzkgNjY1VDI3MSA2MzZUMzAzIDYwNFEzMTcgNjIwIDMzMiA2MzZUMzYzIDY2NVQzOTIgNjg2VDQxNSA2OTVRNDMzIDY5NSA0NDMgNjg1VDQ1MyA2NTdRNDUzIDYzOSA0MzggNjIwVDQwMSA1ODRUMzUyIDU1N1QzMDEgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIwOyIgZ2x5cGgtbmFtZT0iR2RvdGFjY2VudCIgaG9yaXotYWR2LXg9Ijc0MiIgZD0iTTYzNiAtNFE2MjUgLTQgNjE1IC0xVDU5NyAxMlQ1ODUgMzdUNTgwIDc5VjkxUTU1MCA0MyA0OTUgMTZUMzY1IC0xMlEyOTUgLTEyIDIzOSAxM1QxNDIgODJUODEgMTg4VDU5IDMyMlE1OSAzOTYgODMgNDU4VDE1MSA1NjVUMjU2IDYzNVQzOTEgNjYwUTQ1MCA2NjAgNDk1IDY0NlQ1NzIgNjEyVDYyMCA1NjhUNjM2IDUyNlE2MzYgNTA4IDYyOCA0OTdUNjA5IDQ4MFQ1OTAgNDczVDU4MCA0NzNRNTUwIDUyMSA0OTkgNTQ2VDM5MyA1NzFRMzQzIDU3MSAzMDEgNTUzVDIyOSA1MDFUMTgyIDQyMlQxNjUgMzIxUTE2NSAyNjcgMTgwIDIyMVQyMjMgMTQyVDI5MyA5MFQzODUgNzFRNDI0IDcxIDQ1NyA4MVQ1MTYgMTExVDU1OCAxNTdUNTc5IDIxNlYyNTdIMzc1VjM0MUg2MTVRNjQzIDM0MSA2NTYgMzI1VDY3MCAyODJWNlE2NzAgNCA2NjAgMFQ2MzYgLTRaTTM4MiA3MTJRMzUxIDcxMiAzMzQgNzI5VDMxNiA3NzRRMzE2IDgwMSAzMzQgODE5VDM4MyA4MzdRNDEzIDgzNyA0MzAgODE5VDQ0OCA3NzRRNDQ4IDc0NyA0MzEgNzMwVDM4MiA3MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjE7IiBnbHlwaC1uYW1lPSJnZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjE1IiBkPSJNMjk1IC0xOTlRMjQyIC0xOTkgMjAyIC0xODdUMTM0IC0xNTdUOTMgLTExOFQ3OSAtNzlRNzkgLTY0IDg2IC01NFQxMDEgLTM3VDExNiAtMjlUMTI1IC0yOFExNDggLTY2IDE4NyAtOTBUMjkyIC0xMTVRNDQwIC0xMTUgNDQwIDMzVjk2UTQxMSA1NCAzNzAgMzJUMjcxIDlRMjIxIDkgMTgwIDI2VDExMCA3NFQ2NCAxNDlUNDcgMjUwUTQ3IDMwMyA2NCAzNDdUMTEyIDQyNFQxODQgNDc1VDI3NSA0OTNRMzMzIDQ5MyAzNzYgNDcxVDQ0MiA0MTdWNDgxSDUzOVYzNVE1MzkgLTg0IDQ3NyAtMTQxVDI5NSAtMTk5Wk0yOTEgODhRMzIwIDg4IDM0NiA5N1QzOTMgMTI0VDQyNiAxNjZUNDQxIDIxOVYzMThRNDIxIDM2MiAzODQgMzg3VDI5MyA0MTJRMjU5IDQxMiAyMzIgNDAwVDE4NSAzNjdUMTU0IDMxNVQxNDMgMjUwUTE0MyAxNzYgMTgzIDEzMlQyOTEgODhaTTI5OSA1NDdRMjY4IDU0NyAyNTEgNTY0VDIzMyA2MDlRMjMzIDYzNiAyNTEgNjU0VDMwMCA2NzJRMzMwIDY3MiAzNDcgNjU0VDM2NSA2MDlRMzY1IDU4MiAzNDggNTY1VDI5OSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjI7IiBnbHlwaC1uYW1lPSJHY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI3NDIiIGQ9Ik02MzYgLTRRNjI1IC00IDYxNSAtMVQ1OTcgMTJUNTg1IDM3VDU4MCA3OVY5MVE1NTAgNDMgNDk1IDE2VDM2NSAtMTJRMjk1IC0xMiAyMzkgMTNUMTQyIDgyVDgxIDE4OFQ1OSAzMjJRNTkgMzk2IDgzIDQ1OFQxNTEgNTY1VDI1NiA2MzVUMzkxIDY2MFE0NTAgNjYwIDQ5NSA2NDZUNTcyIDYxMlQ2MjAgNTY4VDYzNiA1MjZRNjM2IDUwOCA2MjggNDk3VDYwOSA0ODBUNTkwIDQ3M1Q1ODAgNDczUTU1MCA1MjEgNDk5IDU0NlQzOTMgNTcxUTM0MyA1NzEgMzAxIDU1M1QyMjkgNTAxVDE4MiA0MjJUMTY1IDMyMVExNjUgMjY3IDE4MCAyMjFUMjIzIDE0MlQyOTMgOTBUMzg1IDcxUTQyNCA3MSA0NTcgODFUNTE2IDExMVQ1NTggMTU3VDU3OSAyMTZWMjU3SDM3NVYzNDFINjE1UTY0MyAzNDEgNjU2IDMyNVQ2NzAgMjgyVjZRNjcwIDQgNjYwIDBUNjM2IC00Wk0zMzcgLTI0MlEzMzEgLTI0OCAzMjIgLTI0OVQzMDMgLTI0N1QyODkgLTIzN1QyODcgLTIxOEwzNDAgLTkxUTM0OCAtNjkgMzU3IC01N1QzOTMgLTQ1SDQwMlE0MjIgLTQ1IDQzNSAtNTZUNDQ4IC04N1YtOTJRNDQ4IC0xMDUgNDQwIC0xMTdUNDE2IC0xNDZMMzM3IC0yNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjM7IiBnbHlwaC1uYW1lPSJnY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI2MTUiIGQ9Ik0yOTUgLTE5OVEyNDIgLTE5OSAyMDIgLTE4N1QxMzQgLTE1N1Q5MyAtMTE4VDc5IC03OVE3OSAtNjQgODYgLTU0VDEwMSAtMzdUMTE2IC0yOVQxMjUgLTI4UTE0OCAtNjYgMTg3IC05MFQyOTIgLTExNVE0NDAgLTExNSA0NDAgMzNWOTZRNDExIDU0IDM3MCAzMlQyNzEgOVEyMjEgOSAxODAgMjZUMTEwIDc0VDY0IDE0OVQ0NyAyNTBRNDcgMzAzIDY0IDM0N1QxMTIgNDI0VDE4NCA0NzVUMjc1IDQ5M1EzMzMgNDkzIDM3NiA0NzFUNDQyIDQxN1Y0ODFINTM5VjM1UTUzOSAtODQgNDc3IC0xNDFUMjk1IC0xOTlaTTI5MSA4OFEzMjAgODggMzQ2IDk3VDM5MyAxMjRUNDI2IDE2NlQ0NDEgMjE5VjMxOFE0MjEgMzYyIDM4NCAzODdUMjkzIDQxMlEyNTkgNDEyIDIzMiA0MDBUMTg1IDM2N1QxNTQgMzE1VDE0MyAyNTBRMTQzIDE3NiAxODMgMTMyVDI5MSA4OFpNMzE3IDcxOVEzMjMgNzI1IDMzMiA3MjZUMzUxIDcyNFQzNjUgNzE0VDM2NyA2OTVMMzE0IDU2OFEzMDYgNTQ2IDI5NyA1MzRUMjYxIDUyMkgyNTJRMjMyIDUyMiAyMTkgNTMzVDIwNiA1NjRWNTY5UTIwNiA1ODIgMjE0IDU5NFQyMzggNjIzTDMxNyA3MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjQ7IiBnbHlwaC1uYW1lPSJIY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjcxNSIgZD0iTTg0IDYwNFE4NCA2NTEgMTI3IDY1MUgxNDJRMTg3IDY1MSAxODcgNjA0VjM2OUg1MjhWNjA0UTUyOCA2NTEgNTcxIDY1MUg1ODZRNjMxIDY1MSA2MzEgNjA0VjBINTI4VjI3OUgxODdWMEg4NFY2MDRaTTI0OSA3MTJRMjM1IDcxMiAyMjYgNzIxVDIxNyA3NDRRMjE3IDc2NCAyMzYgNzg5VDI3OSA4MzdUMzI2IDg3NVQzNTcgODkzUTM2NCA4OTEgMzg3IDg3NlQ0MzQgODM4VDQ3NyA3OTBUNDk2IDc0NFE0OTYgNzMwIDQ4OCA3MjFUNDY1IDcxMlE0NDQgNzEyIDQxOSA3MzdUMzU2IDgxOVEzMTggNzYyIDI5NCA3MzdUMjQ5IDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNTsiIGdseXBoLW5hbWU9ImhjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTkxIiBkPSJNMTc1IDQwNVExOTkgNDQzIDIzOCA0NjhUMzM0IDQ5M1EzODIgNDkzIDQxNyA0NzhUNDc1IDQzNFQ1MDkgMzY4VDUyMCAyODVWMEg0MjFWMjc0UTQyMSAzMzcgMzkyIDM3MVQzMTAgNDA2UTI0OCA0MDYgMjEyIDM2OVQxNzUgMjY1VjBINzZWNjc2UTc2IDY3OCA4NiA2ODJUMTEyIDY4N1ExMjMgNjg3IDEzNCA2ODRUMTU1IDY3MVQxNjkgNjQ1VDE3NSA2MDJWNDA1Wk0xMSA3MThRLTMgNzE4IC0xMiA3MjdULTIxIDc1MFEtMjEgNzcwIC0yIDc5NVQ0MSA4NDNUODggODgxVDExOSA4OTlRMTI2IDg5NyAxNDkgODgyVDE5NiA4NDRUMjM5IDc5NlQyNTggNzUwUTI1OCA3MzYgMjUwIDcyN1QyMjcgNzE4UTIwNiA3MTggMTgxIDc0M1QxMTggODI1UTgwIDc2OCA1NiA3NDNUMTEgNzE4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI2OyIgZ2x5cGgtbmFtZT0iSGJhciIgaG9yaXotYWR2LXg9IjcxNSIgZD0iTTM5IDQ2NlExNyA0NzEgMTcgNDkyVjQ5OVExNyA1MTggMzkgNTIzVjYwNFEzOSA2NTEgODIgNjUxSDk3UTE0MiA2NTEgMTQyIDYwNFY1MjVINDgzVjYwNFE0ODMgNjUxIDUyNiA2NTFINTQxUTU4NiA2NTEgNTg2IDYwNFY1MjVINjU5UTY5OCA1MjUgNjk4IDQ5OVY0OTJRNjk4IDQ3NyA2ODggNDcxVDY1OSA0NjVINTg2VjBINDgzVjI3OUgxNDJWMEgzOVY0NjZaTTQ4MyAzNjlWNDY1SDE0MlYzNjlINDgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI3OyIgZ2x5cGgtbmFtZT0iaGJhciIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTI1OCA2MDJRMjk3IDYwMiAyOTcgNTc0VjU2N1EyOTcgNTM4IDI1OCA1MzhIMTc1VjQwNVExOTkgNDQzIDIzOCA0NjhUMzM0IDQ5M1EzODIgNDkzIDQxNyA0NzhUNDc1IDQzNFQ1MDkgMzY4VDUyMCAyODVWMEg0MjFWMjc0UTQyMSAzMzcgMzkyIDM3MVQzMTAgNDA2UTI0OCA0MDYgMjEyIDM2OVQxNzUgMjY1VjBINzZWNTM4SDM5UTAgNTM4IDAgNTY3VjU3NFEwIDU4OCAxMCA1OTVUMzkgNjAySDc2VjY3NlE3NiA2NzggODYgNjgyVDExMiA2ODdRMTIzIDY4NyAxMzQgNjg0VDE1NSA2NzFUMTY5IDY0NVQxNzUgNjAySDI1OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyODsiIGdseXBoLW5hbWU9Ikl0aWxkZSIgaG9yaXotYWR2LXg9IjI4OSIgZD0iTTkzIDYwNFE5MyA2NTEgMTM2IDY1MUgxNTFRMTk2IDY1MSAxOTYgNjA0VjBIOTNWNjA0Wk0yNiA2NzdROSA2NzcgMCA2ODZULTkgNzEyUS05IDczMSAtMyA3NDhUMTMgNzc5VDM4IDgwMFQ2OSA4MDhROTYgODA4IDEzNCA3ODlUMjEzIDczM1EyMjEgNzU5IDIzNCA3ODBUMjY0IDgwMlEyODEgODAyIDI5MCA3OTNUMjk5IDc2NlEyOTkgNzQ3IDI5MyA3MzBUMjc3IDcwMFQyNTIgNjc5VDIyMSA2NzFRMTkzIDY3MSAxNTUgNjkwVDc3IDc0NlE2OCA3MjAgNTYgNjk5VDI2IDY3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyOTsiIGdseXBoLW5hbWU9Iml0aWxkZSIgaG9yaXotYWR2LXg9IjI2MCIgZD0iTTgwIDQzOFE4MCA0NjUgOTIgNDc1VDEyNSA0ODZIMTM1UTE1NSA0ODYgMTY3IDQ3NlQxNzkgNDM4VjBIODBWNDM4Wk0xMSA1NTJRLTYgNTUyIC0xNSA1NjFULTI0IDU4N1EtMjQgNjA2IC0xOCA2MjNULTIgNjU0VDIzIDY3NVQ1NCA2ODNRODEgNjgzIDExOSA2NjRUMTk4IDYwOFEyMDYgNjM0IDIxOSA2NTVUMjQ5IDY3N1EyNjYgNjc3IDI3NSA2NjhUMjg0IDY0MVEyODQgNjIyIDI3OCA2MDVUMjYyIDU3NVQyMzcgNTU0VDIwNiA1NDZRMTc4IDU0NiAxNDAgNTY1VDYyIDYyMVE1MyA1OTUgNDEgNTc0VDExIDU1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyQTsiIGdseXBoLW5hbWU9IkltYWNyb24iIGhvcml6LWFkdi14PSIyODkiIGQ9Ik05MyA2MDRROTMgNjUxIDEzNiA2NTFIMTUxUTE5NiA2NTEgMTk2IDYwNFYwSDkzVjYwNFpNMzggNzI3US0xMiA3MjcgLTEyIDc2NlY3NzJRLTEyIDc5MCAxIDc5OVQzOCA4MDlIMjUyUTMwMiA4MDkgMzAyIDc3MlY3NjZRMzAyIDcyNyAyNTIgNzI3SDM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJCOyIgZ2x5cGgtbmFtZT0iaW1hY3JvbiIgaG9yaXotYWR2LXg9IjI2MCIgZD0iTTgwIDQzOFE4MCA0NjUgOTIgNDc1VDEyNSA0ODZIMTM1UTE1NSA0ODYgMTY3IDQ3NlQxNzkgNDM4VjBIODBWNDM4Wk0yMyA1NjJRLTI3IDU2MiAtMjcgNjAxVjYwN1EtMjcgNjI1IC0xNCA2MzRUMjMgNjQ0SDIzN1EyODcgNjQ0IDI4NyA2MDdWNjAxUTI4NyA1NjIgMjM3IDU2MkgyM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRTsiIGdseXBoLW5hbWU9IklvZ29uZWsiIGhvcml6LWFkdi14PSIyODkiIGQ9Ik05MyA2MDhROTMgNjI2IDEwMyA2MzhUMTMxIDY1MUgxNTVRMTc0IDY1MSAxODUgNjQwVDE5NiA2MDhWMEgxNzVRMTMzIC0zMyAxMTkgLTU2VDEwNCAtOTdRMTA0IC0xMTMgMTEzIC0xMjJUMTM3IC0xMzJRMTYyIC0xMzIgMTc0IC0xMTJRMTg2IC0xMTMgMTk2IC0xMjNUMjA3IC0xNTBRMjA3IC0xNzMgMTg3IC0xODdUMTI5IC0yMDFRODMgLTIwMSA1NiAtMTc5VDI4IC0xMTZRMjggLTg1IDQ5IC01NVQxMTMgMEg5M1Y2MDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMkY7IiBnbHlwaC1uYW1lPSJpb2dvbmVrIiBob3Jpei1hZHYteD0iMjYwIiBkPSJNODAgNDM4UTgwIDQ2NSA5MiA0NzVUMTI1IDQ4NkgxMzVRMTU1IDQ4NiAxNjcgNDc2VDE3OSA0MzhWMEgxNTlRMTE3IC0zMyAxMDMgLTU2VDg4IC05N1E4OCAtMTEzIDk3IC0xMjJUMTIxIC0xMzJRMTQ2IC0xMzIgMTU4IC0xMTJRMTcwIC0xMTMgMTgwIC0xMjNUMTkxIC0xNTBRMTkxIC0xNzMgMTcxIC0xODdUMTEzIC0yMDFRNjcgLTIwMSA0MCAtMTc5VDEyIC0xMTZRMTIgLTg1IDMzIC01NVQ5NyAwSDgwVjQzOFpNMTMwIDU4NFExMDIgNTg0IDg3IDU5OFQ3MSA2MzlRNzEgNjY2IDg2IDY4MFQxMzEgNjk1UTE4OSA2OTUgMTg5IDYzOVExODkgNTg0IDEzMCA1ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzA7IiBnbHlwaC1uYW1lPSJJZG90YWNjZW50IiBob3Jpei1hZHYteD0iMjg5IiBkPSJNOTMgNjA0UTkzIDY1MSAxMzYgNjUxSDE1MVExOTYgNjUxIDE5NiA2MDRWMEg5M1Y2MDRaTTE0NSA3MTJRMTE0IDcxMiA5NyA3MjlUNzkgNzc0UTc5IDgwMSA5NyA4MTlUMTQ2IDgzN1ExNzYgODM3IDE5MyA4MTlUMjExIDc3NFEyMTEgNzQ3IDE5NCA3MzBUMTQ1IDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMTsiIGdseXBoLW5hbWU9ImRvdGxlc3NpIiBob3Jpei1hZHYteD0iMjYwIiBkPSJNODAgNDM4UTgwIDQ2NSA5MiA0NzVUMTI1IDQ4NkgxMzVRMTU1IDQ4NiAxNjcgNDc2VDE3OSA0MzhWMEg4MFY0MzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzI7IiBnbHlwaC1uYW1lPSJJSiIgaG9yaXotYWR2LXg9Ijc4MyIgZD0iTTkzIDYwNFE5MyA2NTEgMTM2IDY1MUgxNTFRMTk2IDY1MSAxOTYgNjA0VjBIOTNWNjA0Wk00OTkgLTEzUTQ2MCAtMTMgNDI4IC00VDM3NCAyMVQzMzkgNTRUMzI3IDkxUTMyNyAxMDYgMzM0IDExN1QzNDkgMTM1VDM2NSAxNDVUMzc0IDE0N1EzOTEgMTE1IDQyMSA5NlQ0OTEgNzZRNTUxIDc2IDU3NiAxMDhUNjAyIDIxOVY2NDdINzA1VjIxOFE3MDUgMTAwIDY1NSA0NFQ0OTkgLTEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTMzOyIgZ2x5cGgtbmFtZT0iaWoiIGhvcml6LWFkdi14PSI1MjAiIGQ9Ik04MCA0MzhRODAgNDY1IDkyIDQ3NVQxMjUgNDg2SDEzNVExNTUgNDg2IDE2NyA0NzZUMTc5IDQzOFYwSDgwVjQzOFpNMTMwIDU4NFExMDIgNTg0IDg3IDU5OFQ3MSA2MzlRNzEgNjY2IDg2IDY4MFQxMzEgNjk1UTE4OSA2OTUgMTg5IDYzOVExODkgNTg0IDEzMCA1ODRaTTI5NSAtMjAwUTI0NyAtMjAwIDIyMCAtMTgyVDE5MyAtMTM2UTE5MyAtMTI2IDE5NiAtMTE3VDIwNCAtMTAyVDIxMSAtOTNUMjE2IC05MFEyMjcgLTEwMSAyNDMgLTEwOVQyODAgLTExOFEzMTIgLTExOCAzMjYgLTEwMFQzNDAgLTQxVjQ4MUg0MzlWLTQ3UTQzOSAtMTIxIDQwMyAtMTYwVDI5NSAtMjAwWk0zOTAgNTg0UTM2MiA1ODQgMzQ3IDU5OFQzMzEgNjM5UTMzMSA2NjYgMzQ2IDY4MFQzOTEgNjk1UTQ0OSA2OTUgNDQ5IDYzOVE0NDkgNTg0IDM5MCA1ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzQ7IiBnbHlwaC1uYW1lPSJKY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ5NCIgZD0iTTIxMCAtMTNRMTcxIC0xMyAxMzkgLTRUODUgMjFUNTAgNTRUMzggOTFRMzggMTA2IDQ1IDExN1Q2MCAxMzVUNzYgMTQ1VDg1IDE0N1ExMDIgMTE1IDEzMiA5NlQyMDIgNzZRMjYyIDc2IDI4NyAxMDhUMzEzIDIxOVY2NDdINDE2VjIxOFE0MTYgMTAwIDM2NiA0NFQyMTAgLTEzWk0yNTEgNzEyUTIzNyA3MTIgMjI4IDcyMVQyMTkgNzQ0UTIxOSA3NjQgMjM4IDc4OVQyODEgODM3VDMyOCA4NzVUMzU5IDg5M1EzNjYgODkxIDM4OSA4NzZUNDM2IDgzOFQ0NzkgNzkwVDQ5OCA3NDRRNDk4IDczMCA0OTAgNzIxVDQ2NyA3MTJRNDQ2IDcxMiA0MjEgNzM3VDM1OCA4MTlRMzIwIDc2MiAyOTYgNzM3VDI1MSA3MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzU7IiBnbHlwaC1uYW1lPSJqY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjI2MCIgZD0iTTM1IC0yMDBRLTEzIC0yMDAgLTQwIC0xODJULTY3IC0xMzZRLTY3IC0xMjYgLTY0IC0xMTdULTU2IC0xMDJULTQ5IC05M1QtNDQgLTkwUS0zMyAtMTAxIC0xNyAtMTA5VDIwIC0xMThRNTIgLTExOCA2NiAtMTAwVDgwIC00MVY0ODFIMTc5Vi00N1ExNzkgLTEyMSAxNDMgLTE2MFQzNSAtMjAwWk0yMiA1NDdROCA1NDcgLTEgNTU2VC0xMCA1NzlRLTEwIDU5OSA5IDYyNFQ1MiA2NzJUOTkgNzEwVDEzMCA3MjhRMTM3IDcyNiAxNjAgNzExVDIwNyA2NzNUMjUwIDYyNVQyNjkgNTc5UTI2OSA1NjUgMjYxIDU1NlQyMzggNTQ3UTIxNyA1NDcgMTkyIDU3MlQxMjkgNjU0UTkxIDU5NyA2NyA1NzJUMjIgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM2OyIgZ2x5cGgtbmFtZT0iS2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjEyIiBkPSJNODQgNjA0UTg0IDY1MSAxMjcgNjUxSDE0MlExODcgNjUxIDE4NyA2MDRWMzQ0TDQ0NiA2MThRNDYzIDYzOCA0NzYgNjQ0VDUwMyA2NTFRNTE5IDY1MSA1MzAgNjQ1VDU0OCA2MzBUNTU3IDYxNFQ1NTkgNjA1TDMwMSAzMzFMNTY2IDQxUTU2NyAzOSA1NjUgMzJUNTU1IDE3VDUzNiAzVDUwNyAtNFE0OTAgLTQgNDc3IDJUNDUxIDI1TDE4NyAzMTNWMEg4NFY2MDRaTTI0NyAtMjQyUTI0MSAtMjQ4IDIzMiAtMjQ5VDIxMyAtMjQ3VDE5OSAtMjM3VDE5NyAtMjE4TDI1MCAtOTFRMjU4IC02OSAyNjcgLTU3VDMwMyAtNDVIMzEyUTMzMiAtNDUgMzQ1IC01NlQzNTggLTg3Vi05MlEzNTggLTEwNSAzNTAgLTExN1QzMjYgLTE0NkwyNDcgLTI0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNzsiIGdseXBoLW5hbWU9Imtjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjUwNCIgZD0iTTc2IDY3NlE3NiA2NzggODYgNjgyVDExMiA2ODdRMTIzIDY4NyAxMzQgNjg0VDE1NSA2NzFUMTY5IDY0NVQxNzUgNjAyVjI2NUwzNDIgNDUyUTM1NyA0NzEgMzcyIDQ3OFQ0MDEgNDg2UTQxNCA0ODYgNDI0IDQ4MVQ0NDEgNDY5VDQ1MCA0NTZUNDUyIDQ0N0wyNzcgMjU0TDQ3OSAzNVE0ODAgMzMgNDc3IDI3VDQ2NiAxM1Q0NDkgMVQ0MjUgLTVRNDExIC01IDM5NyAyVDM2NiAyOUwxNzUgMjM1VjBINzZWNjc2Wk0yMTAgLTI0MlEyMDQgLTI0OCAxOTUgLTI0OVQxNzYgLTI0N1QxNjIgLTIzN1QxNjAgLTIxOEwyMTMgLTkxUTIyMSAtNjkgMjMwIC01N1QyNjYgLTQ1SDI3NVEyOTUgLTQ1IDMwOCAtNTZUMzIxIC04N1YtOTJRMzIxIC0xMDUgMzEzIC0xMTdUMjg5IC0xNDZMMjEwIC0yNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzk7IiBnbHlwaC1uYW1lPSJMYWN1dGUiIGhvcml6LWFkdi14PSI1NTgiIGQ9Ik04NCA2MDRRODQgNjUxIDEyNyA2NTFIMTQyUTE4NyA2NTEgMTg3IDYwNFY5M0g0NjhRNTE2IDkzIDUxNiA0OVY0NVE1MTYgMCA0NjggMEg4NFY2MDRaTTEwNiA3MjBRMTA0IDcyMyAxMTMgNzM4VDE0MCA3NzVUMTc5IDgxOFQyMjYgODU3UTI1MiA4NzQgMjc0IDg3NFEyOTMgODc0IDMwNiA4NjNUMzE5IDgzNVEzMTkgODE4IDMwOSA4MDNUMjc3IDc3NFEyNTAgNzU2IDIyMSA3NDVUMTY3IDcyNlQxMjUgNzE4VDEwNiA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0E7IiBnbHlwaC1uYW1lPSJsYWN1dGUiIGhvcml6LWFkdi14PSIyNjAiIGQ9Ik04MCA2NzZRODAgNjc4IDkxIDY4MlQxMTYgNjg3UTEyOCA2ODcgMTM5IDY4NFQxNTkgNjcxVDE3MyA2NDVUMTc5IDYwMlYwSDgwVjY3NlpNMTAwIDczMVE5OCA3MzQgMTA3IDc0OVQxMzQgNzg2VDE3MyA4MjlUMjIwIDg2OFEyNDYgODg1IDI2OCA4ODVRMjg3IDg4NSAzMDAgODc0VDMxMyA4NDZRMzEzIDgyOSAzMDMgODE0VDI3MSA3ODVRMjQ0IDc2NyAyMTUgNzU2VDE2MSA3MzdUMTE5IDcyOVQxMDAgNzMxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNCOyIgZ2x5cGgtbmFtZT0iTGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTU4IiBkPSJNODQgNjA0UTg0IDY1MSAxMjcgNjUxSDE0MlExODcgNjUxIDE4NyA2MDRWOTNINDY4UTUxNiA5MyA1MTYgNDlWNDVRNTE2IDAgNDY4IDBIODRWNjA0Wk0yNTIgLTI0MlEyNDYgLTI0OCAyMzcgLTI0OVQyMTggLTI0N1QyMDQgLTIzN1QyMDIgLTIxOEwyNTUgLTkxUTI2MyAtNjkgMjcyIC01N1QzMDggLTQ1SDMxN1EzMzcgLTQ1IDM1MCAtNTZUMzYzIC04N1YtOTJRMzYzIC0xMDUgMzU1IC0xMTdUMzMxIC0xNDZMMjUyIC0yNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0M7IiBnbHlwaC1uYW1lPSJsY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSIyNjAiIGQ9Ik04MCA2NzZRODAgNjc4IDkxIDY4MlQxMTYgNjg3UTEyOCA2ODcgMTM5IDY4NFQxNTkgNjcxVDE3MyA2NDVUMTc5IDYwMlYwSDgwVjY3NlpNNzcgLTI0MlE3MSAtMjQ4IDYyIC0yNDlUNDMgLTI0N1QyOSAtMjM3VDI3IC0yMThMODAgLTkxUTg4IC02OSA5NyAtNTdUMTMzIC00NUgxNDJRMTYyIC00NSAxNzUgLTU2VDE4OCAtODdWLTkyUTE4OCAtMTA1IDE4MCAtMTE3VDE1NiAtMTQ2TDc3IC0yNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Q7IiBnbHlwaC1uYW1lPSJMY2Fyb24iIGhvcml6LWFkdi14PSI2MTUiIGQ9Ik00OTkgNDEzUTQ5NCA0MDYgNDg0IDQwNVQ0NjUgNDA2VDQ1MSA0MTZUNDQ5IDQzNUw1MDIgNjA1UTUxMCA2MjkgNTE5IDY0MFQ1NTQgNjUySDU2M1E1ODIgNjUyIDU5MyA2NDBUNjA1IDYwNVY2MDFRNjA1IDU3MSA1ODIgNTQwTDQ5OSA0MTNaTTg0IDYwNFE4NCA2NTEgMTI3IDY1MUgxNDJRMTg3IDY1MSAxODcgNjA0VjkzSDQ2OFE1MTYgOTMgNTE2IDQ5VjQ1UTUxNiAwIDQ2OCAwSDg0VjYwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRTsiIGdseXBoLW5hbWU9ImxjYXJvbiIgaG9yaXotYWR2LXg9IjQ0NCIgZD0iTTMwNiA0NTBRMzAxIDQ0MyAyOTEgNDQyVDI3MiA0NDNUMjU4IDQ1M1QyNTYgNDcyTDMwOSA2NDJRMzE3IDY2NiAzMjYgNjc3VDM2MSA2ODlIMzcwUTM4OSA2ODkgNDAwIDY3N1Q0MTIgNjQyVjYzOFE0MTIgNjA4IDM4OSA1NzdMMzA2IDQ1MFpNODAgNjc2UTgwIDY3OCA5MSA2ODJUMTE2IDY4N1ExMjggNjg3IDEzOSA2ODRUMTU5IDY3MVQxNzMgNjQ1VDE3OSA2MDJWMEg4MFY2NzZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Y7IiBnbHlwaC1uYW1lPSJMZG90IiBob3Jpei1hZHYteD0iNjU1IiBkPSJNODQgNjA0UTg0IDY1MSAxMjcgNjUxSDE0MlExODcgNjUxIDE4NyA2MDRWOTNINDY4UTUxNiA5MyA1MTYgNDlWNDVRNTE2IDAgNDY4IDBIODRWNjA0Wk01NjggMjY2UTUxNCAyNjYgNTE0IDMxOVYzMzFRNTE0IDM4NiA1NjggMzg2SDU4MlE2MzcgMzg2IDYzNyAzMzFWMzE5UTYzNyAyNjYgNTgyIDI2Nkg1NjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDA7IiBnbHlwaC1uYW1lPSJsZG90IiBob3Jpei1hZHYteD0iMzg3IiBkPSJNODAgNjc2UTgwIDY3OCA5MSA2ODJUMTE2IDY4N1ExMjggNjg3IDEzOSA2ODRUMTU5IDY3MVQxNzMgNjQ1VDE3OSA2MDJWMEg4MFY2NzZaTTI5NyAyNTBRMjQzIDI1MCAyNDMgMzAzVjMxNVEyNDMgMzcwIDI5NyAzNzBIMzExUTM2NiAzNzAgMzY2IDMxNVYzMDNRMzY2IDI1MCAzMTEgMjUwSDI5N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MTsiIGdseXBoLW5hbWU9IkNSIiBob3Jpei1hZHYteD0iNTc4IiBkPSJNNDkgMjAzUTQ1IDIwMSAzNyAyMTRUMjkgMjQ1UTI5IDI2MiA0MCAyNzZUODggMzAxTDEyMCAzMTFWNjA0UTEyMCA2NTEgMTYzIDY1MUgxNzhRMjIzIDY1MSAyMjMgNjA0VjM0Mkw0MDUgMzk4UTQxMCAzOTkgNDE3IDM4NlQ0MjUgMzU2UTQyNSAzMzkgNDEzIDMyNVQzNjYgMzAwTDIyMyAyNTZWOTJINDk2UTU0NCA5MiA1NDQgNDhWNDRRNTQ0IDAgNDk2IDBIMTc1UTE1MCAwIDEzNSAxNVQxMjAgNTdWMjI0TDQ5IDIwM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MjsiIGdseXBoLW5hbWU9ImxzbGFzaCIgaG9yaXotYWR2LXg9IjM2NiIgZD0iTTQ4IDIwOFE0NCAyMDcgMzYgMjIxVDI4IDI1MVEyOCAyNjcgMzkgMjgwVDg2IDMwNUwxMzEgMzE4VjY3NlExMzEgNjc4IDE0MiA2ODJUMTY3IDY4N1ExNzkgNjg3IDE5MCA2ODRUMjEwIDY3MVQyMjQgNjQ1VDIzMCA2MDJWMzQ5TDMxOSAzNzZRMzIzIDM3NyAzMzEgMzYzVDMzOSAzMzNRMzM5IDMxNyAzMjcgMzA0VDI4MCAyNzlMMjMwIDI2M1Y0MlEyMzAgMTUgMjE4IDVUMTg2IC01SDE3NlExNTYgLTUgMTQ0IDVUMTMxIDQyVjIzM0w0OCAyMDhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDM7IiBnbHlwaC1uYW1lPSJOYWN1dGUiIGhvcml6LWFkdi14PSI3MTIiIGQ9Ik04NCA1OTNRODQgNjE5IDk2IDYzNVQxMzMgNjUxSDE1MFExNzMgNjUxIDE4NSA2NDJUMjEyIDYxMkw1MzIgMTU4VjY0N0g2MjlWNTRRNjI5IDI3IDYxNyAxMlQ1ODEgLTRINTczUTU1MCAtNCA1NDAgM1Q1MTggMjdMMTgxIDUwNFYwSDg0VjU5M1pNMzE1IDcyMFEzMTMgNzIzIDMyMiA3MzhUMzQ5IDc3NVQzODggODE4VDQzNSA4NTdRNDYxIDg3NCA0ODMgODc0UTUwMiA4NzQgNTE1IDg2M1Q1MjggODM1UTUyOCA4MTggNTE4IDgwM1Q0ODYgNzc0UTQ1OSA3NTYgNDMwIDc0NVQzNzYgNzI2VDMzNCA3MThUMzE1IDcyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NDsiIGdseXBoLW5hbWU9Im5hY3V0ZSIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTExMiA0ODZRMTM0IDQ4NiAxNTMgNDcxVDE3NCA0MDhRMTk5IDQ0NSAyMzggNDY5VDMzNCA0OTNRMzgyIDQ5MyA0MTcgNDc4VDQ3NSA0MzVUNTA5IDM3MFQ1MjAgMjg3VjBINDIxVjI3NVE0MjEgMzM2IDM5MiAzNzFUMzEwIDQwNlEyNjIgNDA2IDIyOCAzODNUMTc1IDMyMlYwSDc2VjQ3NVE3NiA0NzcgODYgNDgxVDExMiA0ODZaTTI0NCA1NTVRMjQyIDU1OCAyNTEgNTczVDI3OCA2MTBUMzE3IDY1M1QzNjQgNjkyUTM5MCA3MDkgNDEyIDcwOVE0MzEgNzA5IDQ0NCA2OThUNDU3IDY3MFE0NTcgNjUzIDQ0NyA2MzhUNDE1IDYwOVEzODggNTkxIDM1OSA1ODBUMzA1IDU2MVQyNjMgNTUzVDI0NCA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDU7IiBnbHlwaC1uYW1lPSJOY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI3MTIiIGQ9Ik04NCA1OTNRODQgNjE5IDk2IDYzNVQxMzMgNjUxSDE1MFExNzMgNjUxIDE4NSA2NDJUMjEyIDYxMkw1MzIgMTU4VjY0N0g2MjlWNTRRNjI5IDI3IDYxNyAxMlQ1ODEgLTRINTczUTU1MCAtNCA1NDAgM1Q1MTggMjdMMTgxIDUwNFYwSDg0VjU5M1pNMzA3IC0yNDJRMzAxIC0yNDggMjkyIC0yNDlUMjczIC0yNDdUMjU5IC0yMzdUMjU3IC0yMThMMzEwIC05MVEzMTggLTY5IDMyNyAtNTdUMzYzIC00NUgzNzJRMzkyIC00NSA0MDUgLTU2VDQxOCAtODdWLTkyUTQxOCAtMTA1IDQxMCAtMTE3VDM4NiAtMTQ2TDMwNyAtMjQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ2OyIgZ2x5cGgtbmFtZT0ibmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNTkxIiBkPSJNMTEyIDQ4NlExMzQgNDg2IDE1MyA0NzFUMTc0IDQwOFExOTkgNDQ1IDIzOCA0NjlUMzM0IDQ5M1EzODIgNDkzIDQxNyA0NzhUNDc1IDQzNVQ1MDkgMzcwVDUyMCAyODdWMEg0MjFWMjc1UTQyMSAzMzYgMzkyIDM3MVQzMTAgNDA2UTI2MiA0MDYgMjI4IDM4M1QxNzUgMzIyVjBINzZWNDc1UTc2IDQ3NyA4NiA0ODFUMTEyIDQ4NlpNMjQyIC0yNDJRMjM2IC0yNDggMjI3IC0yNDlUMjA4IC0yNDdUMTk0IC0yMzdUMTkyIC0yMThMMjQ1IC05MVEyNTMgLTY5IDI2MiAtNTdUMjk4IC00NUgzMDdRMzI3IC00NSAzNDAgLTU2VDM1MyAtODdWLTkyUTM1MyAtMTA1IDM0NSAtMTE3VDMyMSAtMTQ2TDI0MiAtMjQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ3OyIgZ2x5cGgtbmFtZT0iTmNhcm9uIiBob3Jpei1hZHYteD0iNzEyIiBkPSJNODQgNTkzUTg0IDYxOSA5NiA2MzVUMTMzIDY1MUgxNTBRMTczIDY1MSAxODUgNjQyVDIxMiA2MTJMNTMyIDE1OFY2NDdINjI5VjU0UTYyOSAyNyA2MTcgMTJUNTgxIC00SDU3M1E1NTAgLTQgNTQwIDNUNTE4IDI3TDE4MSA1MDRWMEg4NFY1OTNaTTQ2NiA4NzlRNDgwIDg3OSA0ODggODcwVDQ5NyA4NDZRNDk3IDgyNiA0NzggODAxVDQzNSA3NTRUMzg4IDcxNVQzNTggNjk3UTM1MCA2OTggMzI4IDcxNFQyODEgNzUzVDIzOCA4MDFUMjE5IDg0NlEyMTkgODYwIDIyNyA4NjlUMjUwIDg3OVEyNzEgODc5IDI5NSA4NTRUMzU4IDc3MVEzOTYgODI4IDQyMCA4NTNUNDY2IDg3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0ODsiIGdseXBoLW5hbWU9Im5jYXJvbiIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTExMiA0ODZRMTM0IDQ4NiAxNTMgNDcxVDE3NCA0MDhRMTk5IDQ0NSAyMzggNDY5VDMzNCA0OTNRMzgyIDQ5MyA0MTcgNDc4VDQ3NSA0MzVUNTA5IDM3MFQ1MjAgMjg3VjBINDIxVjI3NVE0MjEgMzM2IDM5MiAzNzFUMzEwIDQwNlEyNjIgNDA2IDIyOCAzODNUMTc1IDMyMlYwSDc2VjQ3NVE3NiA0NzcgODYgNDgxVDExMiA0ODZaTTQwNCA3MTRRNDE4IDcxNCA0MjYgNzA1VDQzNSA2ODFRNDM1IDY2MSA0MTYgNjM2VDM3MyA1ODlUMzI2IDU1MFQyOTYgNTMyUTI4OCA1MzMgMjY2IDU0OVQyMTkgNTg4VDE3NiA2MzZUMTU3IDY4MVExNTcgNjk1IDE2NSA3MDRUMTg4IDcxNFEyMDkgNzE0IDIzMyA2ODlUMjk2IDYwNlEzMzQgNjYzIDM1OCA2ODhUNDA0IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0OTsiIGdseXBoLW5hbWU9Im5hcG9zdHJvcGhlIiBob3Jpei1hZHYteD0iODM3IiBkPSJNODkgNDIxUTg0IDQxNCA3NCA0MTNUNTUgNDE0VDQxIDQyNFQzOSA0NDNMOTIgNjEzUTEwMCA2MzcgMTA5IDY0OFQxNDQgNjYwSDE1M1ExNzIgNjYwIDE4MyA2NDhUMTk1IDYxM1Y2MDlRMTk1IDU3OSAxNzIgNTQ4TDg5IDQyMVpNMzU4IDQ4NlEzODAgNDg2IDM5OSA0NzFUNDIwIDQwOFE0NDUgNDQ1IDQ4NCA0NjlUNTgwIDQ5M1E2MjggNDkzIDY2MyA0NzhUNzIxIDQzNVQ3NTUgMzcwVDc2NiAyODdWMEg2NjdWMjc1UTY2NyAzMzYgNjM4IDM3MVQ1NTYgNDA2UTUwOCA0MDYgNDc0IDM4M1Q0MjEgMzIyVjBIMzIyVjQ3NVEzMjIgNDc3IDMzMiA0ODFUMzU4IDQ4NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QzsiIGdseXBoLW5hbWU9Ik9tYWNyb24iIGhvcml6LWFkdi14PSI3NzEiIGQ9Ik0zODUgLTEzUTMxMyAtMTMgMjUzIDExVDE0OSA4MFQ4MiAxODZUNTggMzIyUTU4IDM5NiA4MiA0NThUMTUwIDU2NVQyNTQgNjM1VDM4NiA2NjBRNDU4IDY2MCA1MTggNjM2VDYyMiA1NjdUNjg5IDQ2MFQ3MTMgMzI0UTcxMyAyNTAgNjg5IDE4OFQ2MjEgODJUNTE3IDEyVDM4NSAtMTNaTTM4NiA3OFE0MzUgNzggNDc2IDk2VDU0NiAxNDZUNTkyIDIyM1Q2MDkgMzIyUTYwOSAzNzYgNTkzIDQyMVQ1NDYgNDk5VDQ3NSA1NTBUMzg1IDU2OVEzMzYgNTY5IDI5NSA1NTFUMjI1IDUwMVQxNzkgNDI0VDE2MiAzMjRRMTYyIDI3MCAxNzggMjI1VDIyNSAxNDdUMjk2IDk2VDM4NiA3OFpNMjkyIDcyN1EyNDIgNzI3IDI0MiA3NjZWNzcyUTI0MiA3OTAgMjU1IDc5OVQyOTIgODA5SDUwNlE1NTYgODA5IDU1NiA3NzJWNzY2UTU1NiA3MjcgNTA2IDcyN0gyOTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNEQ7IiBnbHlwaC1uYW1lPSJvbWFjcm9uIiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMjk5IC0xM1EyNDMgLTEzIDE5NyA1VDExNyA1OFQ2NiAxMzhUNDcgMjQxUTQ3IDI5NiA2NSAzNDJUMTE3IDQyMlQxOTcgNDc0VDMwMCA0OTNRMzU1IDQ5MyA0MDEgNDc0VDQ4MCA0MjJUNTMyIDM0MVQ1NTEgMjM5UTU1MSAxODQgNTMzIDEzOFQ0ODEgNThUNDAxIDZUMjk5IC0xM1pNMjk5IDY4UTMzMyA2OCAzNjIgODFUNDEzIDExN1Q0NDcgMTcxVDQ1OSAyMzlRNDU5IDI3NiA0NDcgMzA4VDQxNCAzNjNUMzY0IDM5OVQyOTkgNDEyUTI2NCA0MTIgMjM1IDM5OVQxODQgMzY0VDE1MCAzMTBUMTM4IDI0MVExMzggMjA0IDE1MCAxNzNUMTg0IDExOFQyMzUgODFUMjk5IDY4Wk0yMDEgNTYyUTE1MSA1NjIgMTUxIDYwMVY2MDdRMTUxIDYyNSAxNjQgNjM0VDIwMSA2NDRINDE1UTQ2NSA2NDQgNDY1IDYwN1Y2MDFRNDY1IDU2MiA0MTUgNTYySDIwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RTsiIGdseXBoLW5hbWU9Ik9icmV2ZSIgaG9yaXotYWR2LXg9Ijc3MSIgZD0iTTM4NSAtMTNRMzEzIC0xMyAyNTMgMTFUMTQ5IDgwVDgyIDE4NlQ1OCAzMjJRNTggMzk2IDgyIDQ1OFQxNTAgNTY1VDI1NCA2MzVUMzg2IDY2MFE0NTggNjYwIDUxOCA2MzZUNjIyIDU2N1Q2ODkgNDYwVDcxMyAzMjRRNzEzIDI1MCA2ODkgMTg4VDYyMSA4MlQ1MTcgMTJUMzg1IC0xM1pNMzg2IDc4UTQzNSA3OCA0NzYgOTZUNTQ2IDE0NlQ1OTIgMjIzVDYwOSAzMjJRNjA5IDM3NiA1OTMgNDIxVDU0NiA0OTlUNDc1IDU1MFQzODUgNTY5UTMzNiA1NjkgMjk1IDU1MVQyMjUgNTAxVDE3OSA0MjRUMTYyIDMyNFExNjIgMjcwIDE3OCAyMjVUMjI1IDE0N1QyOTYgOTZUMzg2IDc4Wk0zOTEgNzExUTM2NiA3MTEgMzQwIDcyMlQyOTEgNzQ5VDI1NCA3ODVUMjM5IDgyMlEyMzkgODM5IDI0OSA4NDlUMjc3IDg2MFEyODYgODYwIDI5OSA4NTJUMzI5IDgzMFQzNjEgODAxVDM5MyA3NjlRNDA3IDc4NSA0MjIgODAxVDQ1MyA4MzBUNDgyIDg1MVQ1MDUgODYwUTUyMyA4NjAgNTMzIDg1MFQ1NDMgODIyUTU0MyA4MDQgNTI4IDc4NVQ0OTEgNzQ5VDQ0MiA3MjJUMzkxIDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RjsiIGdseXBoLW5hbWU9Im9icmV2ZSIgaG9yaXotYWR2LXg9IjU5OCIgZD0iTTI5OSAtMTNRMjQzIC0xMyAxOTcgNVQxMTcgNThUNjYgMTM4VDQ3IDI0MVE0NyAyOTYgNjUgMzQyVDExNyA0MjJUMTk3IDQ3NFQzMDAgNDkzUTM1NSA0OTMgNDAxIDQ3NFQ0ODAgNDIyVDUzMiAzNDFUNTUxIDIzOVE1NTEgMTg0IDUzMyAxMzhUNDgxIDU4VDQwMSA2VDI5OSAtMTNaTTI5OSA2OFEzMzMgNjggMzYyIDgxVDQxMyAxMTdUNDQ3IDE3MVQ0NTkgMjM5UTQ1OSAyNzYgNDQ3IDMwOFQ0MTQgMzYzVDM2NCAzOTlUMjk5IDQxMlEyNjQgNDEyIDIzNSAzOTlUMTg0IDM2NFQxNTAgMzEwVDEzOCAyNDFRMTM4IDIwNCAxNTAgMTczVDE4NCAxMThUMjM1IDgxVDI5OSA2OFpNMzA3IDU0NlEyODIgNTQ2IDI1NiA1NTdUMjA3IDU4NFQxNzAgNjIwVDE1NSA2NTdRMTU1IDY3NCAxNjUgNjg0VDE5MyA2OTVRMjAyIDY5NSAyMTUgNjg3VDI0NSA2NjVUMjc3IDYzNlQzMDkgNjA0UTMyMyA2MjAgMzM4IDYzNlQzNjkgNjY1VDM5OCA2ODZUNDIxIDY5NVE0MzkgNjk1IDQ0OSA2ODVUNDU5IDY1N1E0NTkgNjM5IDQ0NCA2MjBUNDA3IDU4NFQzNTggNTU3VDMwNyA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTA7IiBnbHlwaC1uYW1lPSJPaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNzcxIiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNDkgODBUODIgMTg2VDU4IDMyMlE1OCAzOTYgODIgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODYgNjYwUTQ1OCA2NjAgNTE4IDYzNlQ2MjIgNTY3VDY4OSA0NjBUNzEzIDMyNFE3MTMgMjUwIDY4OSAxODhUNjIxIDgyVDUxNyAxMlQzODUgLTEzWk0zODYgNzhRNDM1IDc4IDQ3NiA5NlQ1NDYgMTQ2VDU5MiAyMjNUNjA5IDMyMlE2MDkgMzc2IDU5MyA0MjFUNTQ2IDQ5OVQ0NzUgNTUwVDM4NSA1NjlRMzM2IDU2OSAyOTUgNTUxVDIyNSA1MDFUMTc5IDQyNFQxNjIgMzI0UTE2MiAyNzAgMTc4IDIyNVQyMjUgMTQ3VDI5NiA5NlQzODYgNzhaTTQzMyA3MjBRNDMxIDcyMyA0NDAgNzM4VDQ2NyA3NzVUNTA2IDgxOFQ1NTMgODU3UTU3OSA4NzQgNjAxIDg3NFE2MjAgODc0IDYzMyA4NjNUNjQ2IDgzNVE2NDYgODE4IDYzNiA4MDNUNjA0IDc3NFE1NzcgNzU2IDU0OCA3NDVUNDk0IDcyNlQ0NTIgNzE4VDQzMyA3MjBaTTIzNiA3MjBRMjM0IDcyMyAyNDMgNzM4VDI2OSA3NzVUMzA5IDgxOFQzNTYgODU3UTM4MiA4NzQgNDA0IDg3NFE0MjMgODc0IDQzNiA4NjNUNDQ5IDgzNVE0NDkgODE4IDQzOSA4MDNUNDA3IDc3NFEzODAgNzU2IDM1MSA3NDVUMjk3IDcyNlQyNTUgNzE4VDIzNiA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTE7IiBnbHlwaC1uYW1lPSJvaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNTk4IiBkPSJNMjk5IC0xM1EyNDMgLTEzIDE5NyA1VDExNyA1OFQ2NiAxMzhUNDcgMjQxUTQ3IDI5NiA2NSAzNDJUMTE3IDQyMlQxOTcgNDc0VDMwMCA0OTNRMzU1IDQ5MyA0MDEgNDc0VDQ4MCA0MjJUNTMyIDM0MVQ1NTEgMjM5UTU1MSAxODQgNTMzIDEzOFQ0ODEgNThUNDAxIDZUMjk5IC0xM1pNMjk5IDY4UTMzMyA2OCAzNjIgODFUNDEzIDExN1Q0NDcgMTcxVDQ1OSAyMzlRNDU5IDI3NiA0NDcgMzA4VDQxNCAzNjNUMzY0IDM5OVQyOTkgNDEyUTI2NCA0MTIgMjM1IDM5OVQxODQgMzY0VDE1MCAzMTBUMTM4IDI0MVExMzggMjA0IDE1MCAxNzNUMTg0IDExOFQyMzUgODFUMjk5IDY4Wk0zMTYgNTU1UTMxNCA1NTggMzIzIDU3M1QzNTAgNjEwVDM4OSA2NTNUNDM2IDY5MlE0NjIgNzA5IDQ4NCA3MDlRNTAzIDcwOSA1MTYgNjk4VDUyOSA2NzBRNTI5IDY1MyA1MTkgNjM4VDQ4NyA2MDlRNDYwIDU5MSA0MzEgNTgwVDM3NyA1NjFUMzM1IDU1M1QzMTYgNTU1Wk0xMTkgNTU1UTExNyA1NTggMTI2IDU3M1QxNTIgNjEwVDE5MiA2NTNUMjM5IDY5MlEyNjUgNzA5IDI4NyA3MDlRMzA2IDcwOSAzMTkgNjk4VDMzMiA2NzBRMzMyIDY1MyAzMjIgNjM4VDI5MCA2MDlRMjYzIDU5MSAyMzQgNTgwVDE4MCA1NjFUMTM4IDU1M1QxMTkgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTUyOyIgZ2x5cGgtbmFtZT0iT0UiIGhvcml6LWFkdi14PSIxMDYxIiBkPSJNMzg1IC0xM1EzMTMgLTEzIDI1MyAxMVQxNDkgODBUODIgMTg2VDU4IDMyMlE1OCAzOTYgODIgNDU4VDE1MCA1NjVUMjU0IDYzNVQzODYgNjYwUTQxMiA2NjAgNDM2IDY1N1Q0ODMgNjQ3SDk1OFExMDA2IDY0NyAxMDA2IDYwNFY1OThRMTAwNiA1NTUgOTU4IDU1NUg2MjFRNjU4IDUyMyA2ODAgNDc4VDcwOCAzNzRIODg0UTkzMiAzNzQgOTMyIDMzM1YzMzBROTMyIDI4NyA4ODQgMjg3SDcwOVE3MDYgMjI1IDY4MyAxNzZUNjIwIDkxSDk2NFExMDExIDkxIDEwMTEgNTBWNDVRMTAxMSAwIDk2NCAwSDQ4M1E0NjAgLTYgNDM2IC05VDM4NSAtMTNaTTM4NiA3OFE0MzUgNzggNDc2IDk2VDU0NiAxNDZUNTkyIDIyM1Q2MDkgMzIyUTYwOSAzNzYgNTkzIDQyMVQ1NDYgNDk5VDQ3NSA1NTBUMzg1IDU2OVEzMzYgNTY5IDI5NSA1NTFUMjI1IDUwMVQxNzkgNDI0VDE2MiAzMjRRMTYyIDI3MCAxNzggMjI1VDIyNSAxNDdUMjk2IDk2VDM4NiA3OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MzsiIGdseXBoLW5hbWU9Im9lIiBob3Jpei1hZHYteD0iOTgyIiBkPSJNMjk5IC0xM1EyNDMgLTEzIDE5NyA1VDExNyA1OFQ2NiAxMzhUNDcgMjQxUTQ3IDI5NiA2NSAzNDJUMTE3IDQyMlQxOTcgNDc0VDMwMCA0OTNRMzY4IDQ5MyA0MjAgNDYzVDUwMyAzODJRNTM0IDQzNCA1ODYgNDYzVDcwNSA0OTNRNzU3IDQ5MyA3OTkgNDc2VDg3MiA0MjZUOTE5IDM1MFQ5MzYgMjUxVjI0M1E5MzYgMjI3IDkzMCAyMjFUOTA2IDIxNEg1NTFRNTU0IDE4MSA1NjcgMTU0VDYwMSAxMDdUNjUyIDc2VDcxNSA2NVE3NDYgNjUgNzcwIDcxVDgxMyA4OVQ4NDQgMTE0VDg2NiAxNDVRODY3IDE0NiA4NzUgMTQ0VDg5MiAxMzdUOTEwIDEyMlQ5MTggOTZROTE4IDgwIDkwNSA2MVQ4NjUgMjZUODAwIC0yVDcxMyAtMTNRNjM5IC0xMyA1ODUgMTVUNTAwIDk1UTQ2OSA0NSA0MTggMTZUMjk5IC0xM1pNMjk5IDY4UTMzMyA2OCAzNjIgODFUNDEzIDExN1Q0NDcgMTcxVDQ1OSAyMzlRNDU5IDI3NiA0NDcgMzA4VDQxNCAzNjNUMzY0IDM5OVQyOTkgNDEyUTI2NCA0MTIgMjM1IDM5OVQxODQgMzY0VDE1MCAzMTBUMTM4IDI0MVExMzggMjA0IDE1MCAxNzNUMTg0IDExOFQyMzUgODFUMjk5IDY4Wk03MDQgNDE4UTY3NCA0MTggNjQ5IDQwOFQ2MDMgMzgwVDU3MCAzMzZUNTUyIDI4MUg4NDBRODM2IDM0NCA4MDAgMzgxVDcwNCA0MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTQ7IiBnbHlwaC1uYW1lPSJSYWN1dGUiIGhvcml6LWFkdi14PSI2MTkiIGQ9Ik01MDEgLTRRNDgxIC00IDQ2NiA1VDQzNCAzNkwyNTcgMjUzSDE4NlYwSDg0VjU4OVE4NCA2MTUgOTkgNjMxVDEzOSA2NDdIMzIzUTQ0MiA2NDcgNTAzIDU5OVQ1NjUgNDUzUTU2NSAzNzAgNTE2IDMyMVQzNzIgMjYzTDU2MSAzOFE1NjMgMzYgNTYwIDI5VDU0OSAxNVQ1MjkgMlQ1MDEgLTRaTTE4NSAzMzRIMzIxUTM5MyAzMzQgNDI3IDM2NFQ0NjEgNDQ4UTQ2MSA1NjIgMzE4IDU2MkgxODVWMzM0Wk0yMzkgNzIwUTIzNyA3MjMgMjQ2IDczOFQyNzMgNzc1VDMxMiA4MThUMzU5IDg1N1EzODUgODc0IDQwNyA4NzRRNDI2IDg3NCA0MzkgODYzVDQ1MiA4MzVRNDUyIDgxOCA0NDIgODAzVDQxMCA3NzRRMzgzIDc1NiAzNTQgNzQ1VDMwMCA3MjZUMjU4IDcxOFQyMzkgNzIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU1OyIgZ2x5cGgtbmFtZT0icmFjdXRlIiBob3Jpei1hZHYteD0iNDAyIiBkPSJNMTEyIDQ4NlExMjMgNDg2IDEzNCA0ODNUMTUzIDQ3MFQxNjggNDQ0VDE3NCA0MDJRMjA2IDQ5MyAyOTYgNDkzUTMzNCA0OTMgMzU0IDQ3NlQzNzUgNDI5UTM3NSA0MTUgMzcxIDQwNVQzNjEgMzg5VDM1MSAzODBUMzQ1IDM3OFEzMzQgMzg3IDMxOSAzOTNUMjg0IDM5OVEyNTUgMzk5IDIzNCAzODZUMjAwIDM0N1QxODEgMjg4VDE3NSAyMTJWMEg3NlY0NzVRNzYgNDc3IDg2IDQ4MVQxMTIgNDg2Wk0xNTYgNTU1UTE1NCA1NTggMTYzIDU3M1QxOTAgNjEwVDIyOSA2NTNUMjc2IDY5MlEzMDIgNzA5IDMyNCA3MDlRMzQzIDcwOSAzNTYgNjk4VDM2OSA2NzBRMzY5IDY1MyAzNTkgNjM4VDMyNyA2MDlRMzAwIDU5MSAyNzEgNTgwVDIxNyA1NjFUMTc1IDU1M1QxNTYgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU2OyIgZ2x5cGgtbmFtZT0iUmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjE5IiBkPSJNNTAxIC00UTQ4MSAtNCA0NjYgNVQ0MzQgMzZMMjU3IDI1M0gxODZWMEg4NFY1ODlRODQgNjE1IDk5IDYzMVQxMzkgNjQ3SDMyM1E0NDIgNjQ3IDUwMyA1OTlUNTY1IDQ1M1E1NjUgMzcwIDUxNiAzMjFUMzcyIDI2M0w1NjEgMzhRNTYzIDM2IDU2MCAyOVQ1NDkgMTVUNTI5IDJUNTAxIC00Wk0xODUgMzM0SDMyMVEzOTMgMzM0IDQyNyAzNjRUNDYxIDQ0OFE0NjEgNTYyIDMxOCA1NjJIMTg1VjMzNFpNMjU3IC0yNDJRMjUxIC0yNDggMjQyIC0yNDlUMjIzIC0yNDdUMjA5IC0yMzdUMjA3IC0yMThMMjYwIC05MVEyNjggLTY5IDI3NyAtNTdUMzEzIC00NUgzMjJRMzQyIC00NSAzNTUgLTU2VDM2OCAtODdWLTkyUTM2OCAtMTA1IDM2MCAtMTE3VDMzNiAtMTQ2TDI1NyAtMjQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTU3OyIgZ2x5cGgtbmFtZT0icmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNDAyIiBkPSJNMTEyIDQ4NlExMjMgNDg2IDEzNCA0ODNUMTUzIDQ3MFQxNjggNDQ0VDE3NCA0MDJRMjA2IDQ5MyAyOTYgNDkzUTMzNCA0OTMgMzU0IDQ3NlQzNzUgNDI5UTM3NSA0MTUgMzcxIDQwNVQzNjEgMzg5VDM1MSAzODBUMzQ1IDM3OFEzMzQgMzg3IDMxOSAzOTNUMjg0IDM5OVEyNTUgMzk5IDIzNCAzODZUMjAwIDM0N1QxODEgMjg4VDE3NSAyMTJWMEg3NlY0NzVRNzYgNDc3IDg2IDQ4MVQxMTIgNDg2Wk02NiAtMjQyUTYwIC0yNDggNTEgLTI0OVQzMiAtMjQ3VDE4IC0yMzdUMTYgLTIxOEw2OSAtOTFRNzcgLTY5IDg2IC01N1QxMjIgLTQ1SDEzMVExNTEgLTQ1IDE2NCAtNTZUMTc3IC04N1YtOTJRMTc3IC0xMDUgMTY5IC0xMTdUMTQ1IC0xNDZMNjYgLTI0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1ODsiIGdseXBoLW5hbWU9IlJjYXJvbiIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTUwMSAtNFE0ODEgLTQgNDY2IDVUNDM0IDM2TDI1NyAyNTNIMTg2VjBIODRWNTg5UTg0IDYxNSA5OSA2MzFUMTM5IDY0N0gzMjNRNDQyIDY0NyA1MDMgNTk5VDU2NSA0NTNRNTY1IDM3MCA1MTYgMzIxVDM3MiAyNjNMNTYxIDM4UTU2MyAzNiA1NjAgMjlUNTQ5IDE1VDUyOSAyVDUwMSAtNFpNMTg1IDMzNEgzMjFRMzkzIDMzNCA0MjcgMzY0VDQ2MSA0NDhRNDYxIDU2MiAzMTggNTYySDE4NVYzMzRaTTQwNSA4NzlRNDE5IDg3OSA0MjcgODcwVDQzNiA4NDZRNDM2IDgyNiA0MTcgODAxVDM3NCA3NTRUMzI3IDcxNVQyOTcgNjk3UTI4OSA2OTggMjY3IDcxNFQyMjAgNzUzVDE3NyA4MDFUMTU4IDg0NlExNTggODYwIDE2NiA4NjlUMTg5IDg3OVEyMTAgODc5IDIzNCA4NTRUMjk3IDc3MVEzMzUgODI4IDM1OSA4NTNUNDA1IDg3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1OTsiIGdseXBoLW5hbWU9InJjYXJvbiIgaG9yaXotYWR2LXg9IjQwMiIgZD0iTTExMiA0ODZRMTIzIDQ4NiAxMzQgNDgzVDE1MyA0NzBUMTY4IDQ0NFQxNzQgNDAyUTIwNiA0OTMgMjk2IDQ5M1EzMzQgNDkzIDM1NCA0NzZUMzc1IDQyOVEzNzUgNDE1IDM3MSA0MDVUMzYxIDM4OVQzNTEgMzgwVDM0NSAzNzhRMzM0IDM4NyAzMTkgMzkzVDI4NCAzOTlRMjU1IDM5OSAyMzQgMzg2VDIwMCAzNDdUMTgxIDI4OFQxNzUgMjEyVjBINzZWNDc1UTc2IDQ3NyA4NiA0ODFUMTEyIDQ4NlpNMzMzIDcxNFEzNDcgNzE0IDM1NSA3MDVUMzY0IDY4MVEzNjQgNjYxIDM0NSA2MzZUMzAyIDU4OVQyNTUgNTUwVDIyNSA1MzJRMjE3IDUzMyAxOTUgNTQ5VDE0OCA1ODhUMTA1IDYzNlQ4NiA2ODFRODYgNjk1IDk0IDcwNFQxMTcgNzE0UTEzOCA3MTQgMTYyIDY4OVQyMjUgNjA2UTI2MyA2NjMgMjg3IDY4OFQzMzMgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVBOyIgZ2x5cGgtbmFtZT0iU2FjdXRlIiBob3Jpei1hZHYteD0iNTg0IiBkPSJNMjkwIC0xM1EyMzEgLTEzIDE4NiAtMVQxMTAgMzFUNjMgNzNUNDcgMTE2UTQ3IDEyOSA1NCAxMzlUNjkgMTU3VDg1IDE2OFQ5NCAxNzFRMTIyIDEzMCAxNzIgMTAxVDI4OSA3MlEzNTcgNzIgMzkzIDk4VDQzMCAxNzNRNDMwIDIwMCA0MTcgMjE4VDM4MiAyNDhUMzMwIDI2N1QyNjggMjgzUTIzMCAyOTIgMTk0IDMwNFQxMjkgMzM3VDgyIDM5MFQ2NCA0NzJRNjQgNTEzIDgxIDU0N1QxMjggNjA3VDIwMiA2NDZUMjk3IDY2MFEzNTEgNjYwIDM5MiA2NDlUNDYyIDYyMFQ1MDQgNTgzVDUxOSA1NDVRNTE5IDUzMSA1MTIgNTIwVDQ5NiA1MDJUNDgwIDQ5MVQ0NzEgNDg4UTQ0NSA1MjUgNDAwIDU1MFQyOTggNTc1UTIzNyA1NzUgMjAxIDU0OFQxNjQgNDc2UTE2NCA0NDkgMTc1IDQzM1QyMDYgNDA2VDI1NSAzODhUMzE3IDM3M1EzNTggMzY0IDM5NyAzNTBUNDY2IDMxNFQ1MTQgMjYwVDUzMyAxODBRNTMzIDkwIDQ2OSAzOVQyOTAgLTEzWk0yMjAgNzIwUTIxOCA3MjMgMjI3IDczOFQyNTQgNzc1VDI5MyA4MThUMzQwIDg1N1EzNjYgODc0IDM4OCA4NzRRNDA3IDg3NCA0MjAgODYzVDQzMyA4MzVRNDMzIDgxOCA0MjMgODAzVDM5MSA3NzRRMzY0IDc1NiAzMzUgNzQ1VDI4MSA3MjZUMjM5IDcxOFQyMjAgNzIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVCOyIgZ2x5cGgtbmFtZT0ic2FjdXRlIiBob3Jpei1hZHYteD0iNDk0IiBkPSJNMjQ0IC0xMlExOTQgLTEyIDE1NiAtM1Q5MyAyMlQ1NCA1NVQ0MSA5MFE0MSAxMDIgNDYgMTEwVDU5IDEyNVQ3MiAxMzNUODAgMTM1UTEwNCAxMDQgMTQ0IDg0VDI0MiA2M1EyOTMgNjMgMzIwIDgwVDM0OCAxMjhRMzQ4IDE0NiAzNDAgMTU4VDMxNiAxNzdUMjc3IDE5MVQyMjQgMjAzUTE5NyAyMDkgMTY4IDIxN1QxMTMgMjQwVDcyIDI3OVQ1NSAzNDJRNTUgNDEwIDEwNyA0NTFUMjQ3IDQ5M1EyOTMgNDkzIDMyNyA0ODRUMzg1IDQ2MVQ0MjAgNDMwVDQzMiAzOTZRNDMyIDM4NCA0MjYgMzc1VDQxMyAzNjBUMzk5IDM1MlQzOTIgMzUwUTM2OSAzODAgMzMzIDM5OVQyNTEgNDE4UTIwMCA0MTggMTc0IDQwMFQxNDcgMzUyUTE0NyAzMzUgMTU1IDMyNVQxNzggMzA3VDIxNSAyOTNUMjY3IDI4MVEyOTUgMjc1IDMyNiAyNjdUMzgzIDI0M1Q0MjYgMjAzVDQ0NCAxMzlRNDQ0IDcwIDM5MSAyOVQyNDQgLTEyWk0xODcgNTU1UTE4NSA1NTggMTk0IDU3M1QyMjEgNjEwVDI2MCA2NTNUMzA3IDY5MlEzMzMgNzA5IDM1NSA3MDlRMzc0IDcwOSAzODcgNjk4VDQwMCA2NzBRNDAwIDY1MyAzOTAgNjM4VDM1OCA2MDlRMzMxIDU5MSAzMDIgNTgwVDI0OCA1NjFUMjA2IDU1M1QxODcgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVDOyIgZ2x5cGgtbmFtZT0iU2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0yOTAgLTEzUTIzMSAtMTMgMTg2IC0xVDExMCAzMVQ2MyA3M1Q0NyAxMTZRNDcgMTI5IDU0IDEzOVQ2OSAxNTdUODUgMTY4VDk0IDE3MVExMjIgMTMwIDE3MiAxMDFUMjg5IDcyUTM1NyA3MiAzOTMgOThUNDMwIDE3M1E0MzAgMjAwIDQxNyAyMThUMzgyIDI0OFQzMzAgMjY3VDI2OCAyODNRMjMwIDI5MiAxOTQgMzA0VDEyOSAzMzdUODIgMzkwVDY0IDQ3MlE2NCA1MTMgODEgNTQ3VDEyOCA2MDdUMjAyIDY0NlQyOTcgNjYwUTM1MSA2NjAgMzkyIDY0OVQ0NjIgNjIwVDUwNCA1ODNUNTE5IDU0NVE1MTkgNTMxIDUxMiA1MjBUNDk2IDUwMlQ0ODAgNDkxVDQ3MSA0ODhRNDQ1IDUyNSA0MDAgNTUwVDI5OCA1NzVRMjM3IDU3NSAyMDEgNTQ4VDE2NCA0NzZRMTY0IDQ0OSAxNzUgNDMzVDIwNiA0MDZUMjU1IDM4OFQzMTcgMzczUTM1OCAzNjQgMzk3IDM1MFQ0NjYgMzE0VDUxNCAyNjBUNTMzIDE4MFE1MzMgOTAgNDY5IDM5VDI5MCAtMTNaTTE5MSA3MTJRMTc3IDcxMiAxNjggNzIxVDE1OSA3NDRRMTU5IDc2NCAxNzggNzg5VDIyMSA4MzdUMjY4IDg3NVQyOTkgODkzUTMwNiA4OTEgMzI5IDg3NlQzNzYgODM4VDQxOSA3OTBUNDM4IDc0NFE0MzggNzMwIDQzMCA3MjFUNDA3IDcxMlEzODYgNzEyIDM2MSA3MzdUMjk4IDgxOVEyNjAgNzYyIDIzNiA3MzdUMTkxIDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RDsiIGdseXBoLW5hbWU9InNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNDk0IiBkPSJNMjQ0IC0xMlExOTQgLTEyIDE1NiAtM1Q5MyAyMlQ1NCA1NVQ0MSA5MFE0MSAxMDIgNDYgMTEwVDU5IDEyNVQ3MiAxMzNUODAgMTM1UTEwNCAxMDQgMTQ0IDg0VDI0MiA2M1EyOTMgNjMgMzIwIDgwVDM0OCAxMjhRMzQ4IDE0NiAzNDAgMTU4VDMxNiAxNzdUMjc3IDE5MVQyMjQgMjAzUTE5NyAyMDkgMTY4IDIxN1QxMTMgMjQwVDcyIDI3OVQ1NSAzNDJRNTUgNDEwIDEwNyA0NTFUMjQ3IDQ5M1EyOTMgNDkzIDMyNyA0ODRUMzg1IDQ2MVQ0MjAgNDMwVDQzMiAzOTZRNDMyIDM4NCA0MjYgMzc1VDQxMyAzNjBUMzk5IDM1MlQzOTIgMzUwUTM2OSAzODAgMzMzIDM5OVQyNTEgNDE4UTIwMCA0MTggMTc0IDQwMFQxNDcgMzUyUTE0NyAzMzUgMTU1IDMyNVQxNzggMzA3VDIxNSAyOTNUMjY3IDI4MVEyOTUgMjc1IDMyNiAyNjdUMzgzIDI0M1Q0MjYgMjAzVDQ0NCAxMzlRNDQ0IDcwIDM5MSAyOVQyNDQgLTEyWk0xNDEgNTQ3UTEyNyA1NDcgMTE4IDU1NlQxMDkgNTc5UTEwOSA1OTkgMTI4IDYyNFQxNzEgNjcyVDIxOCA3MTBUMjQ5IDcyOFEyNTYgNzI2IDI3OSA3MTFUMzI2IDY3M1QzNjkgNjI1VDM4OCA1NzlRMzg4IDU2NSAzODAgNTU2VDM1NyA1NDdRMzM2IDU0NyAzMTEgNTcyVDI0OCA2NTRRMjEwIDU5NyAxODYgNTcyVDE0MSA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUU7IiBnbHlwaC1uYW1lPSJTY2VkaWxsYSIgaG9yaXotYWR2LXg9IjU4NCIgZD0iTTI5MCAtMTNRMjMxIC0xMyAxODYgLTFUMTEwIDMxVDYzIDczVDQ3IDExNlE0NyAxMjkgNTQgMTM5VDY5IDE1N1Q4NSAxNjhUOTQgMTcxUTEyMiAxMzAgMTcyIDEwMVQyODkgNzJRMzU3IDcyIDM5MyA5OFQ0MzAgMTczUTQzMCAyMDAgNDE3IDIxOFQzODIgMjQ4VDMzMCAyNjdUMjY4IDI4M1EyMzAgMjkyIDE5NCAzMDRUMTI5IDMzN1Q4MiAzOTBUNjQgNDcyUTY0IDUxMyA4MSA1NDdUMTI4IDYwN1QyMDIgNjQ2VDI5NyA2NjBRMzUxIDY2MCAzOTIgNjQ5VDQ2MiA2MjBUNTA0IDU4M1Q1MTkgNTQ1UTUxOSA1MzEgNTEyIDUyMFQ0OTYgNTAyVDQ4MCA0OTFUNDcxIDQ4OFE0NDUgNTI1IDQwMCA1NTBUMjk4IDU3NVEyMzcgNTc1IDIwMSA1NDhUMTY0IDQ3NlExNjQgNDQ5IDE3NSA0MzNUMjA2IDQwNlQyNTUgMzg4VDMxNyAzNzNRMzU4IDM2NCAzOTcgMzUwVDQ2NiAzMTRUNTE0IDI2MFQ1MzMgMTgwUTUzMyA5MCA0NjkgMzlUMjkwIC0xM1pNMjI4IC0yMjRRMjIyIC0yMjkgMjEyIC0yMzBUMTkzIC0yMjlUMTc5IC0yMjBUMTc4IC0yMDVMMjMxIC04N1EyMzkgLTY4IDI0OCAtNThUMjg0IC00OEgyOTNRMzEzIC00OCAzMjYgLTU3VDMzOSAtODNWLTg4UTMzOSAtOTggMzMxIC0xMDhUMzA3IC0xMzRMMjI4IC0yMjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUY7IiBnbHlwaC1uYW1lPSJzY2VkaWxsYSIgaG9yaXotYWR2LXg9IjQ5NCIgZD0iTTI0NCAtMTJRMTk0IC0xMiAxNTYgLTNUOTMgMjJUNTQgNTVUNDEgOTBRNDEgMTAyIDQ2IDExMFQ1OSAxMjVUNzIgMTMzVDgwIDEzNVExMDQgMTA0IDE0NCA4NFQyNDIgNjNRMjkzIDYzIDMyMCA4MFQzNDggMTI4UTM0OCAxNDYgMzQwIDE1OFQzMTYgMTc3VDI3NyAxOTFUMjI0IDIwM1ExOTcgMjA5IDE2OCAyMTdUMTEzIDI0MFQ3MiAyNzlUNTUgMzQyUTU1IDQxMCAxMDcgNDUxVDI0NyA0OTNRMjkzIDQ5MyAzMjcgNDg0VDM4NSA0NjFUNDIwIDQzMFQ0MzIgMzk2UTQzMiAzODQgNDI2IDM3NVQ0MTMgMzYwVDM5OSAzNTJUMzkyIDM1MFEzNjkgMzgwIDMzMyAzOTlUMjUxIDQxOFEyMDAgNDE4IDE3NCA0MDBUMTQ3IDM1MlExNDcgMzM1IDE1NSAzMjVUMTc4IDMwN1QyMTUgMjkzVDI2NyAyODFRMjk1IDI3NSAzMjYgMjY3VDM4MyAyNDNUNDI2IDIwM1Q0NDQgMTM5UTQ0NCA3MCAzOTEgMjlUMjQ0IC0xMlpNMTgxIC0yMjRRMTc1IC0yMjkgMTY1IC0yMzBUMTQ2IC0yMjlUMTMyIC0yMjBUMTMxIC0yMDVMMTg0IC04N1ExOTIgLTY4IDIwMSAtNThUMjM3IC00OEgyNDZRMjY2IC00OCAyNzkgLTU3VDI5MiAtODNWLTg4UTI5MiAtOTggMjg0IC0xMDhUMjYwIC0xMzRMMTgxIC0yMjRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjA7IiBnbHlwaC1uYW1lPSJTY2Fyb24iIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0yOTAgLTEzUTIzMSAtMTMgMTg2IC0xVDExMCAzMVQ2MyA3M1Q0NyAxMTZRNDcgMTI5IDU0IDEzOVQ2OSAxNTdUODUgMTY4VDk0IDE3MVExMjIgMTMwIDE3MiAxMDFUMjg5IDcyUTM1NyA3MiAzOTMgOThUNDMwIDE3M1E0MzAgMjAwIDQxNyAyMThUMzgyIDI0OFQzMzAgMjY3VDI2OCAyODNRMjMwIDI5MiAxOTQgMzA0VDEyOSAzMzdUODIgMzkwVDY0IDQ3MlE2NCA1MTMgODEgNTQ3VDEyOCA2MDdUMjAyIDY0NlQyOTcgNjYwUTM1MSA2NjAgMzkyIDY0OVQ0NjIgNjIwVDUwNCA1ODNUNTE5IDU0NVE1MTkgNTMxIDUxMiA1MjBUNDk2IDUwMlQ0ODAgNDkxVDQ3MSA0ODhRNDQ1IDUyNSA0MDAgNTUwVDI5OCA1NzVRMjM3IDU3NSAyMDEgNTQ4VDE2NCA0NzZRMTY0IDQ0OSAxNzUgNDMzVDIwNiA0MDZUMjU1IDM4OFQzMTcgMzczUTM1OCAzNjQgMzk3IDM1MFQ0NjYgMzE0VDUxNCAyNjBUNTMzIDE4MFE1MzMgOTAgNDY5IDM5VDI5MCAtMTNaTTQwNSA4ODBRNDE5IDg4MCA0MjcgODcxVDQzNiA4NDdRNDM2IDgyNyA0MTcgODAyVDM3NCA3NTVUMzI3IDcxNlQyOTcgNjk4UTI4OSA2OTkgMjY3IDcxNVQyMjAgNzU0VDE3NyA4MDJUMTU4IDg0N1ExNTggODYxIDE2NiA4NzBUMTg5IDg4MFEyMTAgODgwIDIzNCA4NTVUMjk3IDc3MlEzMzUgODI5IDM1OSA4NTRUNDA1IDg4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MTsiIGdseXBoLW5hbWU9InNjYXJvbiIgaG9yaXotYWR2LXg9IjQ5NCIgZD0iTTI0NCAtMTJRMTk0IC0xMiAxNTYgLTNUOTMgMjJUNTQgNTVUNDEgOTBRNDEgMTAyIDQ2IDExMFQ1OSAxMjVUNzIgMTMzVDgwIDEzNVExMDQgMTA0IDE0NCA4NFQyNDIgNjNRMjkzIDYzIDMyMCA4MFQzNDggMTI4UTM0OCAxNDYgMzQwIDE1OFQzMTYgMTc3VDI3NyAxOTFUMjI0IDIwM1ExOTcgMjA5IDE2OCAyMTdUMTEzIDI0MFQ3MiAyNzlUNTUgMzQyUTU1IDQxMCAxMDcgNDUxVDI0NyA0OTNRMjkzIDQ5MyAzMjcgNDg0VDM4NSA0NjFUNDIwIDQzMFQ0MzIgMzk2UTQzMiAzODQgNDI2IDM3NVQ0MTMgMzYwVDM5OSAzNTJUMzkyIDM1MFEzNjkgMzgwIDMzMyAzOTlUMjUxIDQxOFEyMDAgNDE4IDE3NCA0MDBUMTQ3IDM1MlExNDcgMzM1IDE1NSAzMjVUMTc4IDMwN1QyMTUgMjkzVDI2NyAyODFRMjk1IDI3NSAzMjYgMjY3VDM4MyAyNDNUNDI2IDIwM1Q0NDQgMTM5UTQ0NCA3MCAzOTEgMjlUMjQ0IC0xMlpNMzQ5IDcxNFEzNjMgNzE0IDM3MSA3MDVUMzgwIDY4MVEzODAgNjYxIDM2MSA2MzZUMzE4IDU4OVQyNzEgNTUwVDI0MSA1MzJRMjMzIDUzMyAyMTEgNTQ5VDE2NCA1ODhUMTIxIDYzNlQxMDIgNjgxUTEwMiA2OTUgMTEwIDcwNFQxMzMgNzE0UTE1NCA3MTQgMTc4IDY4OVQyNDEgNjA2UTI3OSA2NjMgMzAzIDY4OFQzNDkgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYyOyIgZ2x5cGgtbmFtZT0iVGNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNjIzIiBkPSJNODMgNTU1UTM1IDU1NSAzNSA1OTlWNjA0UTM1IDY0NyA4MyA2NDdINTQxUTU4OCA2NDcgNTg4IDYwNFY1OTlRNTg4IDU1NSA1NDEgNTU1SDM2NFYwSDI2MFY1NTVIODNaTTI2MyAtMjQyUTI1NyAtMjQ4IDI0OCAtMjQ5VDIyOSAtMjQ3VDIxNSAtMjM3VDIxMyAtMjE4TDI2NiAtOTFRMjc0IC02OSAyODMgLTU3VDMxOSAtNDVIMzI4UTM0OCAtNDUgMzYxIC01NlQzNzQgLTg3Vi05MlEzNzQgLTEwNSAzNjYgLTExN1QzNDIgLTE0NkwyNjMgLTI0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MzsiIGdseXBoLW5hbWU9InRjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjQwMSIgZD0iTTM0IDQ4MUgxMTJWNTU1UTExMiA1ODEgMTI0IDU5MVQxNTYgNjAySDE2NlExODYgNjAyIDE5NyA1OTNUMjA5IDU1NVY0ODFIMzYwVjQwMEgyMDhWMTU3UTIwOCAxMTIgMjIyIDkwVDI3MiA2OFEyOTUgNjggMzEyIDc3VDM0MCAxMDJRMzQxIDEwMyAzNDUgMTAxVDM1NSA5NFQzNjQgODBUMzY4IDYwUTM2OCAzMiAzMzkgMTBUMjU2IC0xM1ExODEgLTEzIDE0NyAyN1QxMTIgMTQ2VjQwMEgzNFY0ODFaTTE3MyAtMjQyUTE2NyAtMjQ4IDE1OCAtMjQ5VDEzOSAtMjQ3VDEyNSAtMjM3VDEyMyAtMjE4TDE3NiAtOTFRMTg0IC02OSAxOTMgLTU3VDIyOSAtNDVIMjM4UTI1OCAtNDUgMjcxIC01NlQyODQgLTg3Vi05MlEyODQgLTEwNSAyNzYgLTExN1QyNTIgLTE0NkwxNzMgLTI0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NDsiIGdseXBoLW5hbWU9IlRjYXJvbiIgaG9yaXotYWR2LXg9IjYyMyIgZD0iTTgzIDU1NVEzNSA1NTUgMzUgNTk5VjYwNFEzNSA2NDcgODMgNjQ3SDU0MVE1ODggNjQ3IDU4OCA2MDRWNTk5UTU4OCA1NTUgNTQxIDU1NUgzNjRWMEgyNjBWNTU1SDgzWk00MTkgODc5UTQzMyA4NzkgNDQxIDg3MFQ0NTAgODQ2UTQ1MCA4MjYgNDMxIDgwMVQzODggNzU0VDM0MSA3MTVUMzExIDY5N1EzMDMgNjk4IDI4MSA3MTRUMjM0IDc1M1QxOTEgODAxVDE3MiA4NDZRMTcyIDg2MCAxODAgODY5VDIwMyA4NzlRMjI0IDg3OSAyNDggODU0VDMxMSA3NzFRMzQ5IDgyOCAzNzMgODUzVDQxOSA4NzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjU7IiBnbHlwaC1uYW1lPSJ0Y2Fyb24iIGhvcml6LWFkdi14PSI0MjAiIGQ9Ik0zNCA0ODFIMTEyVjU1NVExMTIgNTgxIDEyNCA1OTFUMTU2IDYwMkgxNjZRMTg2IDYwMiAxOTcgNTkzVDIwOSA1NTVWNDgxSDM2MFY0MDBIMjA4VjE1N1EyMDggMTEyIDIyMiA5MFQyNzIgNjhRMjk1IDY4IDMxMiA3N1QzNDAgMTAyUTM0MSAxMDMgMzQ1IDEwMVQzNTUgOTRUMzY0IDgwVDM2OCA2MFEzNjggMzIgMzM5IDEwVDI1NiAtMTNRMTgxIC0xMyAxNDcgMjdUMTEyIDE0NlY0MDBIMzRWNDgxWk0yOTkgNTM4UTI5NCA1MzIgMjg2IDUzMVQyNzAgNTMyVDI1OCA1NDFUMjU2IDU1N0wzMDIgNzA0UTMwOCA3MjUgMzE2IDczNVQzNDcgNzQ1SDM1NFEzNzEgNzQ1IDM4MSA3MzVUMzkxIDcwNFY3MDFRMzkxIDY3NCAzNzEgNjQ4TDI5OSA1MzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjY7IiBnbHlwaC1uYW1lPSJUYmFyIiBob3Jpei1hZHYteD0iNjIzIiBkPSJNODMgNTU1UTM1IDU1NSAzNSA1OTlWNjA0UTM1IDY0NyA4MyA2NDdINTQxUTU4OCA2NDcgNTg4IDYwNFY1OTlRNTg4IDU1NSA1NDEgNTU1SDM2NFYwSDI2MFY1NTVIODNaTTIwNCAyOTZRMTU0IDI5NiAxNTQgMzM1VjM0MVExNTQgMzU5IDE2NyAzNjhUMjA0IDM3OEg0MThRNDY4IDM3OCA0NjggMzQxVjMzNVE0NjggMjk2IDQxOCAyOTZIMjA0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY3OyIgZ2x5cGgtbmFtZT0idGJhciIgaG9yaXotYWR2LXg9IjQwMSIgZD0iTTM0IDQ4MUgxMTJWNTU1UTExMiA1ODEgMTI0IDU5MVQxNTYgNjAySDE2NlExODYgNjAyIDE5NyA1OTNUMjA5IDU1NVY0ODFIMzYwVjQwMEgyMDhWMTU3UTIwOCAxMTIgMjIyIDkwVDI3MiA2OFEyOTUgNjggMzEyIDc3VDM0MCAxMDJRMzQxIDEwMyAzNDUgMTAxVDM1NSA5NFQzNjQgODBUMzY4IDYwUTM2OCAzMiAzMzkgMTBUMjU2IC0xM1ExODEgLTEzIDE0NyAyN1QxMTIgMTQ2VjQwMEgzNFY0ODFaTTg0IDIwOVEzNCAyMDkgMzQgMjQ4VjI1NFEzNCAyNzIgNDcgMjgxVDg0IDI5MUgyOThRMzQ4IDI5MSAzNDggMjU0VjI0OFEzNDggMjA5IDI5OCAyMDlIODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjg7IiBnbHlwaC1uYW1lPSJVdGlsZGUiIGhvcml6LWFkdi14PSI2ODAiIGQ9Ik0zMzkgLTEyUTIwOSAtMTIgMTQzIDU3VDc2IDI2M1Y2MDRRNzYgNjUxIDEyMCA2NTFIMTM0UTE3OSA2NTEgMTc5IDYwNFYyNjZRMTc5IDc5IDM0MCA3OVE1MDEgNzkgNTAxIDI2N1Y2MDRRNTAxIDY1MSA1NDUgNjUxSDU2MVE2MDQgNjUxIDYwNCA2MDRWMjY1UTYwNCAxMjkgNTM3IDU5VDMzOSAtMTJaTTIyMSA2NzdRMjA0IDY3NyAxOTUgNjg2VDE4NiA3MTJRMTg2IDczMSAxOTIgNzQ4VDIwOCA3NzlUMjMzIDgwMFQyNjQgODA4UTI5MSA4MDggMzI5IDc4OVQ0MDggNzMzUTQxNiA3NTkgNDI5IDc4MFQ0NTkgODAyUTQ3NiA4MDIgNDg1IDc5M1Q0OTQgNzY2UTQ5NCA3NDcgNDg4IDczMFQ0NzIgNzAwVDQ0NyA2NzlUNDE2IDY3MVEzODggNjcxIDM1MCA2OTBUMjcyIDc0NlEyNjMgNzIwIDI1MSA2OTlUMjIxIDY3N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2OTsiIGdseXBoLW5hbWU9InV0aWxkZSIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaTTE3NiA1NTJRMTU5IDU1MiAxNTAgNTYxVDE0MSA1ODdRMTQxIDYwNiAxNDcgNjIzVDE2MyA2NTRUMTg4IDY3NVQyMTkgNjgzUTI0NiA2ODMgMjg0IDY2NFQzNjMgNjA4UTM3MSA2MzQgMzg0IDY1NVQ0MTQgNjc3UTQzMSA2NzcgNDQwIDY2OFQ0NDkgNjQxUTQ0OSA2MjIgNDQzIDYwNVQ0MjcgNTc1VDQwMiA1NTRUMzcxIDU0NlEzNDMgNTQ2IDMwNSA1NjVUMjI3IDYyMVEyMTggNTk1IDIwNiA1NzRUMTc2IDU1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2QTsiIGdseXBoLW5hbWU9IlVtYWNyb24iIGhvcml6LWFkdi14PSI2ODAiIGQ9Ik0zMzkgLTEyUTIwOSAtMTIgMTQzIDU3VDc2IDI2M1Y2MDRRNzYgNjUxIDEyMCA2NTFIMTM0UTE3OSA2NTEgMTc5IDYwNFYyNjZRMTc5IDc5IDM0MCA3OVE1MDEgNzkgNTAxIDI2N1Y2MDRRNTAxIDY1MSA1NDUgNjUxSDU2MVE2MDQgNjUxIDYwNCA2MDRWMjY1UTYwNCAxMjkgNTM3IDU5VDMzOSAtMTJaTTI0MSA3MjdRMTkxIDcyNyAxOTEgNzY2Vjc3MlExOTEgNzkwIDIwNCA3OTlUMjQxIDgwOUg0NTVRNTA1IDgwOSA1MDUgNzcyVjc2NlE1MDUgNzI3IDQ1NSA3MjdIMjQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZCOyIgZ2x5cGgtbmFtZT0idW1hY3JvbiIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaTTE5MSA1NjJRMTQxIDU2MiAxNDEgNjAxVjYwN1ExNDEgNjI1IDE1NCA2MzRUMTkxIDY0NEg0MDVRNDU1IDY0NCA0NTUgNjA3VjYwMVE0NTUgNTYyIDQwNSA1NjJIMTkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgZ2x5cGgtbmFtZT0iVWJyZXZlIiBob3Jpei1hZHYteD0iNjgwIiBkPSJNMzM5IC0xMlEyMDkgLTEyIDE0MyA1N1Q3NiAyNjNWNjA0UTc2IDY1MSAxMjAgNjUxSDEzNFExNzkgNjUxIDE3OSA2MDRWMjY2UTE3OSA3OSAzNDAgNzlRNTAxIDc5IDUwMSAyNjdWNjA0UTUwMSA2NTEgNTQ1IDY1MUg1NjFRNjA0IDY1MSA2MDQgNjA0VjI2NVE2MDQgMTI5IDUzNyA1OVQzMzkgLTEyWk0zNDQgNzExUTMxOSA3MTEgMjkzIDcyMlQyNDQgNzQ5VDIwNyA3ODVUMTkyIDgyMlExOTIgODM5IDIwMiA4NDlUMjMwIDg2MFEyMzkgODYwIDI1MiA4NTJUMjgyIDgzMFQzMTQgODAxVDM0NiA3NjlRMzYwIDc4NSAzNzUgODAxVDQwNiA4MzBUNDM1IDg1MVQ0NTggODYwUTQ3NiA4NjAgNDg2IDg1MFQ0OTYgODIyUTQ5NiA4MDQgNDgxIDc4NVQ0NDQgNzQ5VDM5NSA3MjJUMzQ0IDcxMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2RDsiIGdseXBoLW5hbWU9InVicmV2ZSIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaTTI4NyA1NDZRMjYyIDU0NiAyMzYgNTU3VDE4NyA1ODRUMTUwIDYyMFQxMzUgNjU3UTEzNSA2NzQgMTQ1IDY4NFQxNzMgNjk1UTE4MiA2OTUgMTk1IDY4N1QyMjUgNjY1VDI1NyA2MzZUMjg5IDYwNFEzMDMgNjIwIDMxOCA2MzZUMzQ5IDY2NVQzNzggNjg2VDQwMSA2OTVRNDE5IDY5NSA0MjkgNjg1VDQzOSA2NTdRNDM5IDYzOSA0MjQgNjIwVDM4NyA1ODRUMzM4IDU1N1QyODcgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZFOyIgZ2x5cGgtbmFtZT0iVXJpbmciIGhvcml6LWFkdi14PSI2ODAiIGQ9Ik0zMzkgLTEyUTIwOSAtMTIgMTQzIDU3VDc2IDI2M1Y2MDRRNzYgNjUxIDEyMCA2NTFIMTM0UTE3OSA2NTEgMTc5IDYwNFYyNjZRMTc5IDc5IDM0MCA3OVE1MDEgNzkgNTAxIDI2N1Y2MDRRNTAxIDY1MSA1NDUgNjUxSDU2MVE2MDQgNjUxIDYwNCA2MDRWMjY1UTYwNCAxMjkgNTM3IDU5VDMzOSAtMTJaTTM0NyA3MTFRMzIwIDcxMSAyOTggNzIwVDI2MSA3NDVUMjM2IDc4MlQyMjcgODMwUTIyNyA4NTUgMjM2IDg3N1QyNjEgOTE1VDI5OSA5NDFUMzQ4IDk1MFE0MDIgOTUwIDQzNSA5MTZUNDY4IDgzMFE0NjggODA1IDQ1OSA3ODNUNDM0IDc0NVQzOTYgNzIwVDM0NyA3MTFaTTM0NyA3NjVRMzc0IDc2NSAzOTEgNzgzVDQwOSA4MzBRNDA5IDg1OSAzOTEgODc4VDM0NyA4OTdRMzIxIDg5NyAzMDQgODc4VDI4NiA4MzBRMjg2IDgwMyAzMDMgNzg0VDM0NyA3NjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkY7IiBnbHlwaC1uYW1lPSJ1cmluZyIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaTTI5NyA1MzNRMjcwIDUzMyAyNDggNTQyVDIxMSA1NjdUMTg2IDYwNFQxNzcgNjUyUTE3NyA2NzcgMTg2IDY5OVQyMTEgNzM3VDI0OSA3NjNUMjk4IDc3MlEzNTIgNzcyIDM4NSA3MzhUNDE4IDY1MlE0MTggNjI3IDQwOSA2MDVUMzg0IDU2N1QzNDYgNTQyVDI5NyA1MzNaTTI5NyA1ODdRMzI0IDU4NyAzNDEgNjA1VDM1OSA2NTJRMzU5IDY4MSAzNDEgNzAwVDI5NyA3MTlRMjcxIDcxOSAyNTQgNzAwVDIzNiA2NTJRMjM2IDYyNSAyNTMgNjA2VDI5NyA1ODdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzA7IiBnbHlwaC1uYW1lPSJVaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNjgwIiBkPSJNMzM5IC0xMlEyMDkgLTEyIDE0MyA1N1Q3NiAyNjNWNjA0UTc2IDY1MSAxMjAgNjUxSDEzNFExNzkgNjUxIDE3OSA2MDRWMjY2UTE3OSA3OSAzNDAgNzlRNTAxIDc5IDUwMSAyNjdWNjA0UTUwMSA2NTEgNTQ1IDY1MUg1NjFRNjA0IDY1MSA2MDQgNjA0VjI2NVE2MDQgMTI5IDUzNyA1OVQzMzkgLTEyWk0zOTAgNzIwUTM4OCA3MjMgMzk3IDczOFQ0MjQgNzc1VDQ2MyA4MThUNTEwIDg1N1E1MzYgODc0IDU1OCA4NzRRNTc3IDg3NCA1OTAgODYzVDYwMyA4MzVRNjAzIDgxOCA1OTMgODAzVDU2MSA3NzRRNTM0IDc1NiA1MDUgNzQ1VDQ1MSA3MjZUNDA5IDcxOFQzOTAgNzIwWk0xOTMgNzIwUTE5MSA3MjMgMjAwIDczOFQyMjYgNzc1VDI2NiA4MThUMzEzIDg1N1EzMzkgODc0IDM2MSA4NzRRMzgwIDg3NCAzOTMgODYzVDQwNiA4MzVRNDA2IDgxOCAzOTYgODAzVDM2NCA3NzRRMzM3IDc1NiAzMDggNzQ1VDI1NCA3MjZUMjEyIDcxOFQxOTMgNzIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcxOyIgZ2x5cGgtbmFtZT0idWh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTQ4MCAtNFE0NjkgLTQgNDU4IC0xVDQzOCAxMFQ0MjQgMzRUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaTTMzMCA1NTVRMzI4IDU1OCAzMzcgNTczVDM2NCA2MTBUNDAzIDY1M1Q0NTAgNjkyUTQ3NiA3MDkgNDk4IDcwOVE1MTcgNzA5IDUzMCA2OThUNTQzIDY3MFE1NDMgNjUzIDUzMyA2MzhUNTAxIDYwOVE0NzQgNTkxIDQ0NSA1ODBUMzkxIDU2MVQzNDkgNTUzVDMzMCA1NTVaTTEzMyA1NTVRMTMxIDU1OCAxNDAgNTczVDE2NiA2MTBUMjA2IDY1M1QyNTMgNjkyUTI3OSA3MDkgMzAxIDcwOVEzMjAgNzA5IDMzMyA2OThUMzQ2IDY3MFEzNDYgNjUzIDMzNiA2MzhUMzA0IDYwOVEyNzcgNTkxIDI0OCA1ODBUMTk0IDU2MVQxNTIgNTUzVDEzMyA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzI7IiBnbHlwaC1uYW1lPSJVb2dvbmVrIiBob3Jpei1hZHYteD0iNjgwIiBkPSJNMzM5IC0xMlEyMDkgLTEyIDE0MyA1N1Q3NiAyNjNWNjA0UTc2IDY1MSAxMjAgNjUxSDEzNFExNzkgNjUxIDE3OSA2MDRWMjY2UTE3OSA3OSAzNDAgNzlRNTAxIDc5IDUwMSAyNjdWNjA0UTUwMSA2NTEgNTQ1IDY1MUg1NjFRNjA0IDY1MSA2MDQgNjA0VjI2NVE2MDQgMTgxIDU3OCAxMjJUNTAxIDMwUTQ2MCAtMiA0NDYgLTI1VDQzMSAtNjZRNDMxIC04MiA0NDAgLTkxVDQ2NCAtMTAxUTQ4OSAtMTAxIDUwMSAtODFRNTEzIC04MiA1MjMgLTkyVDUzNCAtMTE5UTUzNCAtMTQyIDUxNCAtMTU2VDQ1NiAtMTcwUTQxMCAtMTcwIDM4MyAtMTQ4VDM1NSAtODVRMzU1IC00NSAzODggLTlRMzY1IC0xMiAzMzkgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgZ2x5cGgtbmFtZT0idW9nb25layIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTUxNCA1UTQ2OSAtMzAgNDUzIC01NFQ0MzYgLTk3UTQzNiAtMTEzIDQ0NSAtMTIyVDQ2OSAtMTMyUTQ5NCAtMTMyIDUwNiAtMTEyUTUxOCAtMTEzIDUyOCAtMTIzVDUzOSAtMTUwUTUzOSAtMTczIDUxOSAtMTg3VDQ2MSAtMjAxUTQxNSAtMjAxIDM4OCAtMTc5VDM2MCAtMTE2UTM2MCAtODQgMzgyIC01M1Q0NDkgMlE0MzYgOSA0MjcgMjVUNDE3IDcyUTM5MSAzNSAzNTIgMTJUMjU3IC0xMlEyMDkgLTEyIDE3NSAzVDExNyA0NlQ4MyAxMTFUNzIgMTk0VjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MTMgNUg1MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzQ7IiBnbHlwaC1uYW1lPSJXY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9Ijk1NSIgZD0iTTYzIDYyMlE2MiA2MjYgNzggNjM4VDEyNCA2NTFRMTQ0IDY1MSAxNjAgNjM4VDE4NCA1OTFMMjg5IDExNUw0MTIgNTIyUTQxOCA1NDUgNDM0IDU1N1Q0ODAgNTY5UTUxMCA1NjkgNTI1IDU1N1Q1NDggNTIyTDY2OSAxMTdMNzc2IDU5MlE3ODMgNjI0IDc5NyA2MzdUODMzIDY1MVE4NDcgNjUxIDg1OCA2NDdUODc2IDYzOFQ4ODggNjI5VDg5MSA2MjJMNzMyIDBINjE1TDQ4MCA0NTNMMzM5IDBIMjI0TDYzIDYyMlpNMzcyIDY5NlEzNTggNjk2IDM0OSA3MDVUMzQwIDcyOFEzNDAgNzQ4IDM1OSA3NzNUNDAyIDgyMVQ0NDkgODU5VDQ4MCA4NzdRNDg3IDg3NSA1MTAgODYwVDU1NyA4MjJUNjAwIDc3NFQ2MTkgNzI4UTYxOSA3MTQgNjExIDcwNVQ1ODggNjk2UTU2NyA2OTYgNTQyIDcyMVQ0NzkgODAzUTQ0MSA3NDYgNDE3IDcyMVQzNzIgNjk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc1OyIgZ2x5cGgtbmFtZT0id2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NDAiIGQ9Ik0zNSA0NTdRMzQgNDU5IDM5IDQ2NFQ1MiA0NzRUNzIgNDgyVDk0IDQ4NlExMTAgNDg2IDEyNSA0NzVUMTQ2IDQzM0wyMjEgOTZMMzEzIDM4N1EzMTggNDA1IDMzMiA0MTNUMzc0IDQyMlE0MDEgNDIyIDQxNSA0MTRUNDM0IDM4N0w1MjMgOThMNTk3IDQzM1E2MDIgNDY0IDYxNyA0NzVUNjQ4IDQ4NlE2NTkgNDg2IDY2OSA0ODJUNjg4IDQ3M1Q3MDAgNDY0VDcwNSA0NTdMNTc2IDBINDc1TDM3MiAzMjBMMjY2IDBIMTY1TDM1IDQ1N1pNMjY0IDUzOVEyNTAgNTM5IDI0MSA1NDhUMjMyIDU3MVEyMzIgNTkxIDI1MSA2MTZUMjk0IDY2NFQzNDEgNzAyVDM3MiA3MjBRMzc5IDcxOCA0MDIgNzAzVDQ0OSA2NjVUNDkyIDYxN1Q1MTEgNTcxUTUxMSA1NTcgNTAzIDU0OFQ0ODAgNTM5UTQ1OSA1MzkgNDM0IDU2NFQzNzEgNjQ2UTMzMyA1ODkgMzA5IDU2NFQyNjQgNTM5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc2OyIgZ2x5cGgtbmFtZT0iWWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MDMiIGQ9Ik0yNTAgMjY1TDI0IDY0N0gxMzlMMzAyIDM1MUw0NjggNjE1UTQ4MCA2MzUgNDkzIDY0M1Q1MTkgNjUxUTUzNiA2NTEgNTQ4IDY0NlQ1NjggNjMzVDU3OSA2MThUNTgxIDYwOUwzNTMgMjY1VjBIMjUwVjI2NVpNMTk3IDcxMlExODMgNzEyIDE3NCA3MjFUMTY1IDc0NFExNjUgNzY0IDE4NCA3ODlUMjI3IDgzN1QyNzQgODc1VDMwNSA4OTNRMzEyIDg5MSAzMzUgODc2VDM4MiA4MzhUNDI1IDc5MFQ0NDQgNzQ0UTQ0NCA3MzAgNDM2IDcyMVQ0MTMgNzEyUTM5MiA3MTIgMzY3IDczN1QzMDQgODE5UTI2NiA3NjIgMjQyIDczN1QxOTcgNzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc3OyIgZ2x5cGgtbmFtZT0ieWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MjgiIGQ9Ik0yMTQgLTE5NVEyMDMgLTE5NSAxOTQgLTE5MlQxNzcgLTE4NFQxNjUgLTE3NVQxNjIgLTE2OEwyNDIgMjdRMjI1IDI5IDIxNiAzNFQyMDAgNTVMMTggNDgxSDEyMEwyNzMgOThMNDA5IDQ4MUg1MTBMMjc1IC0xNDBRMjYzIC0xNzIgMjQ3IC0xODNUMjE0IC0xOTVaTTE2NCA1NDdRMTUwIDU0NyAxNDEgNTU2VDEzMiA1NzlRMTMyIDU5OSAxNTEgNjI0VDE5NCA2NzJUMjQxIDcxMFQyNzIgNzI4UTI3OSA3MjYgMzAyIDcxMVQzNDkgNjczVDM5MiA2MjVUNDExIDU3OVE0MTEgNTY1IDQwMyA1NTZUMzgwIDU0N1EzNTkgNTQ3IDMzNCA1NzJUMjcxIDY1NFEyMzMgNTk3IDIwOSA1NzJUMTY0IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3ODsiIGdseXBoLW5hbWU9IllkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjYwMyIgZD0iTTI1MCAyNjVMMjQgNjQ3SDEzOUwzMDIgMzUxTDQ2OCA2MTVRNDgwIDYzNSA0OTMgNjQzVDUxOSA2NTFRNTM2IDY1MSA1NDggNjQ2VDU2OCA2MzNUNTc5IDYxOFQ1ODEgNjA5TDM1MyAyNjVWMEgyNTBWMjY1Wk0zOTQgNzEyUTM2NSA3MTIgMzQ5IDcyN1QzMzMgNzcxUTMzMyA4MDAgMzQ5IDgxNVQzOTIgODMxUTQxOSA4MzEgNDM1IDgxNlQ0NTIgNzcxUTQ1MiA3NDMgNDM2IDcyOFQzOTQgNzEyWk0yMTAgNzEyUTE4MyA3MTIgMTY3IDcyN1QxNTAgNzcxUTE1MCA4MDAgMTY2IDgxNVQyMDggODMxUTIzNyA4MzEgMjUzIDgxNlQyNjkgNzcxUTI2OSA3NDMgMjUzIDcyOFQyMTAgNzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc5OyIgZ2x5cGgtbmFtZT0iWmFjdXRlIiBob3Jpei1hZHYteD0iNjM5IiBkPSJNNjMgOTJMNDQ1IDU1N0gxMTJRNjYgNTU3IDY2IDU5OVY2MDVRNjYgNjQ3IDExMiA2NDdINTY5VjU2MUwxODUgOTBINTM4UTU4NCA5MCA1ODQgNDhWNDJRNTg0IDAgNTM4IDBINjNWOTJaTTI2NSA3MjBRMjYzIDcyMyAyNzIgNzM4VDI5OSA3NzVUMzM4IDgxOFQzODUgODU3UTQxMSA4NzQgNDMzIDg3NFE0NTIgODc0IDQ2NSA4NjNUNDc4IDgzNVE0NzggODE4IDQ2OCA4MDNUNDM2IDc3NFE0MDkgNzU2IDM4MCA3NDVUMzI2IDcyNlQyODQgNzE4VDI2NSA3MjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0E7IiBnbHlwaC1uYW1lPSJ6YWN1dGUiIGhvcml6LWFkdi14PSI1MTIiIGQ9Ik01MCA2NkwzMzAgNDAySDk1UTUyIDQwMiA1MiA0MzhWNDQ1UTUyIDQ4MSA5NSA0ODFINDU3VjQxOEwxNzMgODBINDIyUTQ2NSA4MCA0NjUgNDNWMzdRNDY1IDAgNDIyIDBINTBWNjZaTTIwNSA1NTVRMjAzIDU1OCAyMTIgNTczVDIzOSA2MTBUMjc4IDY1M1QzMjUgNjkyUTM1MSA3MDkgMzczIDcwOVEzOTIgNzA5IDQwNSA2OThUNDE4IDY3MFE0MTggNjUzIDQwOCA2MzhUMzc2IDYwOVEzNDkgNTkxIDMyMCA1ODBUMjY2IDU2MVQyMjQgNTUzVDIwNSA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0I7IiBnbHlwaC1uYW1lPSJaZG90YWNjZW50IiBob3Jpei1hZHYteD0iNjM5IiBkPSJNNjMgOTJMNDQ1IDU1N0gxMTJRNjYgNTU3IDY2IDU5OVY2MDVRNjYgNjQ3IDExMiA2NDdINTY5VjU2MUwxODUgOTBINTM4UTU4NCA5MCA1ODQgNDhWNDJRNTg0IDAgNTM4IDBINjNWOTJaTTMyMCA3MTJRMjg5IDcxMiAyNzIgNzI5VDI1NCA3NzRRMjU0IDgwMSAyNzIgODE5VDMyMSA4MzdRMzUxIDgzNyAzNjggODE5VDM4NiA3NzRRMzg2IDc0NyAzNjkgNzMwVDMyMCA3MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0M7IiBnbHlwaC1uYW1lPSJ6ZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTEyIiBkPSJNNTAgNjZMMzMwIDQwMkg5NVE1MiA0MDIgNTIgNDM4VjQ0NVE1MiA0ODEgOTUgNDgxSDQ1N1Y0MThMMTczIDgwSDQyMlE0NjUgODAgNDY1IDQzVjM3UTQ2NSAwIDQyMiAwSDUwVjY2Wk0yNjUgNTQ3UTIzNCA1NDcgMjE3IDU2NFQxOTkgNjA5UTE5OSA2MzYgMjE3IDY1NFQyNjYgNjcyUTI5NiA2NzIgMzEzIDY1NFQzMzEgNjA5UTMzMSA1ODIgMzE0IDU2NVQyNjUgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdEOyIgZ2x5cGgtbmFtZT0iWmNhcm9uIiBob3Jpei1hZHYteD0iNjM5IiBkPSJNNjMgOTJMNDQ1IDU1N0gxMTJRNjYgNTU3IDY2IDU5OVY2MDVRNjYgNjQ3IDExMiA2NDdINTY5VjU2MUwxODUgOTBINTM4UTU4NCA5MCA1ODQgNDhWNDJRNTg0IDAgNTM4IDBINjNWOTJaTTQyMCA4ODBRNDM0IDg4MCA0NDIgODcxVDQ1MSA4NDdRNDUxIDgyNyA0MzIgODAyVDM4OSA3NTVUMzQyIDcxNlQzMTIgNjk4UTMwNCA2OTkgMjgyIDcxNVQyMzUgNzU0VDE5MiA4MDJUMTczIDg0N1ExNzMgODYxIDE4MSA4NzBUMjA0IDg4MFEyMjUgODgwIDI0OSA4NTVUMzEyIDc3MlEzNTAgODI5IDM3NCA4NTRUNDIwIDg4MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGdseXBoLW5hbWU9InpjYXJvbiIgaG9yaXotYWR2LXg9IjUxMiIgZD0iTTUwIDY2TDMzMCA0MDJIOTVRNTIgNDAyIDUyIDQzOFY0NDVRNTIgNDgxIDk1IDQ4MUg0NTdWNDE4TDE3MyA4MEg0MjJRNDY1IDgwIDQ2NSA0M1YzN1E0NjUgMCA0MjIgMEg1MFY2NlpNMzU5IDcxNFEzNzMgNzE0IDM4MSA3MDVUMzkwIDY4MVEzOTAgNjYxIDM3MSA2MzZUMzI4IDU4OVQyODEgNTUwVDI1MSA1MzJRMjQzIDUzMyAyMjEgNTQ5VDE3NCA1ODhUMTMxIDYzNlQxMTIgNjgxUTExMiA2OTUgMTIwIDcwNFQxNDMgNzE0UTE2NCA3MTQgMTg4IDY4OVQyNTEgNjA2UTI4OSA2NjMgMzEzIDY4OFQzNTkgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTkyOyIgZ2x5cGgtbmFtZT0iZmxvcmluIiBob3Jpei1hZHYteD0iNDQzIiBkPSJNODUgMzUxUTYxIDM1MSA1MSAzNjBUNDEgMzg4VjM5NVE0MSA0MTMgNTEgNDIyVDg1IDQzMkgxNDVMMTU2IDQ5M1ExNzEgNTc4IDIxMiA2MThUMzE4IDY1OVEzNjkgNjU5IDM5OCA2NDBUNDI3IDU5MVE0MjcgNTc5IDQyMiA1NjlUNDExIDU1M1Q0MDAgNTQzVDM5NCA1NDBRMzg1IDU1MyAzNjggNTYzVDMyNSA1NzRRMjk0IDU3NCAyNzcgNTUyVDI1MSA0NzlMMjQyIDQzMkgzNDBRMzYzIDQzMiAzNzMgNDIzVDM4MyAzOTRWMzg3UTM4MyAzNjkgMzczIDM2MFQzNDAgMzUxSDIzMUwxNzkgNjdRMTcxIDI1IDE1NCA5VDExNCAtOFE5NCAtOCA4MSAtMVQ2OSA5TDEzMCAzNTFIODVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTg7IiBnbHlwaC1uYW1lPSJTY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI1ODQiIGQ9Ik0yOTAgLTEzUTIzMSAtMTMgMTg2IC0xVDExMCAzMVQ2MyA3M1Q0NyAxMTZRNDcgMTI5IDU0IDEzOVQ2OSAxNTdUODUgMTY4VDk0IDE3MVExMjIgMTMwIDE3MiAxMDFUMjg5IDcyUTM1NyA3MiAzOTMgOThUNDMwIDE3M1E0MzAgMjAwIDQxNyAyMThUMzgyIDI0OFQzMzAgMjY3VDI2OCAyODNRMjMwIDI5MiAxOTQgMzA0VDEyOSAzMzdUODIgMzkwVDY0IDQ3MlE2NCA1MTMgODEgNTQ3VDEyOCA2MDdUMjAyIDY0NlQyOTcgNjYwUTM1MSA2NjAgMzkyIDY0OVQ0NjIgNjIwVDUwNCA1ODNUNTE5IDU0NVE1MTkgNTMxIDUxMiA1MjBUNDk2IDUwMlQ0ODAgNDkxVDQ3MSA0ODhRNDQ1IDUyNSA0MDAgNTUwVDI5OCA1NzVRMjM3IDU3NSAyMDEgNTQ4VDE2NCA0NzZRMTY0IDQ0OSAxNzUgNDMzVDIwNiA0MDZUMjU1IDM4OFQzMTcgMzczUTM1OCAzNjQgMzk3IDM1MFQ0NjYgMzE0VDUxNCAyNjBUNTMzIDE4MFE1MzMgOTAgNDY5IDM5VDI5MCAtMTNaTTIzOCAtMjQyUTIzMiAtMjQ4IDIyMyAtMjQ5VDIwNCAtMjQ3VDE5MCAtMjM3VDE4OCAtMjE4TDI0MSAtOTFRMjQ5IC02OSAyNTggLTU3VDI5NCAtNDVIMzAzUTMyMyAtNDUgMzM2IC01NlQzNDkgLTg3Vi05MlEzNDkgLTEwNSAzNDEgLTExN1QzMTcgLTE0NkwyMzggLTI0MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxOTsiIGdseXBoLW5hbWU9InNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjQ5NCIgZD0iTTI0NCAtMTJRMTk0IC0xMiAxNTYgLTNUOTMgMjJUNTQgNTVUNDEgOTBRNDEgMTAyIDQ2IDExMFQ1OSAxMjVUNzIgMTMzVDgwIDEzNVExMDQgMTA0IDE0NCA4NFQyNDIgNjNRMjkzIDYzIDMyMCA4MFQzNDggMTI4UTM0OCAxNDYgMzQwIDE1OFQzMTYgMTc3VDI3NyAxOTFUMjI0IDIwM1ExOTcgMjA5IDE2OCAyMTdUMTEzIDI0MFQ3MiAyNzlUNTUgMzQyUTU1IDQxMCAxMDcgNDUxVDI0NyA0OTNRMjkzIDQ5MyAzMjcgNDg0VDM4NSA0NjFUNDIwIDQzMFQ0MzIgMzk2UTQzMiAzODQgNDI2IDM3NVQ0MTMgMzYwVDM5OSAzNTJUMzkyIDM1MFEzNjkgMzgwIDMzMyAzOTlUMjUxIDQxOFEyMDAgNDE4IDE3NCA0MDBUMTQ3IDM1MlExNDcgMzM1IDE1NSAzMjVUMTc4IDMwN1QyMTUgMjkzVDI2NyAyODFRMjk1IDI3NSAzMjYgMjY3VDM4MyAyNDNUNDI2IDIwM1Q0NDQgMTM5UTQ0NCA3MCAzOTEgMjlUMjQ0IC0xMlpNMTc0IC0yNDJRMTY4IC0yNDggMTU5IC0yNDlUMTQwIC0yNDdUMTI2IC0yMzdUMTI0IC0yMThMMTc3IC05MVExODUgLTY5IDE5NCAtNTdUMjMwIC00NUgyMzlRMjU5IC00NSAyNzIgLTU2VDI4NSAtODdWLTkyUTI4NSAtMTA1IDI3NyAtMTE3VDI1MyAtMTQ2TDE3NCAtMjQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjFBOyIgZ2x5cGgtbmFtZT0idW5pMDIxQSIgaG9yaXotYWR2LXg9IjYyMyIgZD0iTTgzIDU1NVEzNSA1NTUgMzUgNTk5VjYwNFEzNSA2NDcgODMgNjQ3SDU0MVE1ODggNjQ3IDU4OCA2MDRWNTk5UTU4OCA1NTUgNTQxIDU1NUgzNjRWMEgyNjBWNTU1SDgzWk0yNjMgLTI0MlEyNTcgLTI0OCAyNDggLTI0OVQyMjkgLTI0N1QyMTUgLTIzN1QyMTMgLTIxOEwyNjYgLTkxUTI3NCAtNjkgMjgzIC01N1QzMTkgLTQ1SDMyOFEzNDggLTQ1IDM2MSAtNTZUMzc0IC04N1YtOTJRMzc0IC0xMDUgMzY2IC0xMTdUMzQyIC0xNDZMMjYzIC0yNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMUI7IiBnbHlwaC1uYW1lPSJ1bmkwMjFCIiBob3Jpei1hZHYteD0iNDAxIiBkPSJNMzQgNDgxSDExMlY1NTVRMTEyIDU4MSAxMjQgNTkxVDE1NiA2MDJIMTY2UTE4NiA2MDIgMTk3IDU5M1QyMDkgNTU1VjQ4MUgzNjBWNDAwSDIwOFYxNTdRMjA4IDExMiAyMjIgOTBUMjcyIDY4UTI5NSA2OCAzMTIgNzdUMzQwIDEwMlEzNDEgMTAzIDM0NSAxMDFUMzU1IDk0VDM2NCA4MFQzNjggNjBRMzY4IDMyIDMzOSAxMFQyNTYgLTEzUTE4MSAtMTMgMTQ3IDI3VDExMiAxNDZWNDAwSDM0VjQ4MVpNMTczIC0yNDJRMTY3IC0yNDggMTU4IC0yNDlUMTM5IC0yNDdUMTI1IC0yMzdUMTIzIC0yMThMMTc2IC05MVExODQgLTY5IDE5MyAtNTdUMjI5IC00NUgyMzhRMjU4IC00NSAyNzEgLTU2VDI4NCAtODdWLTkyUTI4NCAtMTA1IDI3NiAtMTE3VDI1MiAtMTQ2TDE3MyAtMjQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM2OyIgZ2x5cGgtbmFtZT0iY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTE1NyA1NDdRMTQzIDU0NyAxMzQgNTU2VDEyNSA1NzlRMTI1IDU5OSAxNDQgNjI0VDE4NyA2NzJUMjM0IDcxMFQyNjUgNzI4UTI3MiA3MjYgMjk1IDcxMVQzNDIgNjczVDM4NSA2MjVUNDA0IDU3OVE0MDQgNTY1IDM5NiA1NTZUMzczIDU0N1EzNTIgNTQ3IDMyNyA1NzJUMjY0IDY1NFEyMjYgNTk3IDIwMiA1NzJUMTU3IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNzsiIGdseXBoLW5hbWU9ImNhcm9uIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMzczIDcxNFEzODcgNzE0IDM5NSA3MDVUNDA0IDY4MVE0MDQgNjYxIDM4NSA2MzZUMzQyIDU4OVQyOTUgNTUwVDI2NSA1MzJRMjU3IDUzMyAyMzUgNTQ5VDE4OCA1ODhUMTQ1IDYzNlQxMjYgNjgxUTEyNiA2OTUgMTM0IDcwNFQxNTcgNzE0UTE3OCA3MTQgMjAyIDY4OVQyNjUgNjA2UTMwMyA2NjMgMzI3IDY4OFQzNzMgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkM5OyIgZ2x5cGgtbmFtZT0ib3ZlcnNjb3JlIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMTU4IDU2MlExMDggNTYyIDEwOCA2MDFWNjA3UTEwOCA2MjUgMTIxIDYzNFQxNTggNjQ0SDM3MlE0MjIgNjQ0IDQyMiA2MDdWNjAxUTQyMiA1NjIgMzcyIDU2MkgxNThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyRDg7IiBnbHlwaC1uYW1lPSJicmV2ZSIgaG9yaXotYWR2LXg9IjUzMCIgZD0iTTI2NSA1NDZRMjQwIDU0NiAyMTQgNTU3VDE2NSA1ODRUMTI4IDYyMFQxMTMgNjU3UTExMyA2NzQgMTIzIDY4NFQxNTEgNjk1UTE2MCA2OTUgMTczIDY4N1QyMDMgNjY1VDIzNSA2MzZUMjY3IDYwNFEyODEgNjIwIDI5NiA2MzZUMzI3IDY2NVQzNTYgNjg2VDM3OSA2OTVRMzk3IDY5NSA0MDcgNjg1VDQxNyA2NTdRNDE3IDYzOSA0MDIgNjIwVDM2NSA1ODRUMzE2IDU1N1QyNjUgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ5OyIgZ2x5cGgtbmFtZT0iZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMjY1IDU0N1EyMzQgNTQ3IDIxNyA1NjRUMTk5IDYwOVExOTkgNjM2IDIxNyA2NTRUMjY2IDY3MlEyOTYgNjcyIDMxMyA2NTRUMzMxIDYwOVEzMzEgNTgyIDMxNCA1NjVUMjY1IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQTsiIGdseXBoLW5hbWU9InJpbmciIGhvcml6LWFkdi14PSI1MzAiIGQ9Ik0yNjQgNTQ2UTIzNyA1NDYgMjE1IDU1NVQxNzggNTgwVDE1MyA2MTdUMTQ0IDY2NVExNDQgNjkwIDE1MyA3MTJUMTc4IDc1MFQyMTYgNzc2VDI2NSA3ODVRMzE5IDc4NSAzNTIgNzUxVDM4NSA2NjVRMzg1IDY0MCAzNzYgNjE4VDM1MSA1ODBUMzEzIDU1NVQyNjQgNTQ2Wk0yNjQgNjAwUTI5MSA2MDAgMzA4IDYxOFQzMjYgNjY1UTMyNiA2OTQgMzA4IDcxM1QyNjQgNzMyUTIzOCA3MzIgMjIxIDcxM1QyMDMgNjY1UTIwMyA2MzggMjIwIDYxOVQyNjQgNjAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRCOyIgZ2x5cGgtbmFtZT0ib2dvbmVrIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMzM4IDVRMjkzIC0zMCAyNzcgLTU0VDI2MCAtOTdRMjYwIC0xMTMgMjY5IC0xMjJUMjkzIC0xMzJRMzE4IC0xMzIgMzMwIC0xMTJRMzQyIC0xMTMgMzUyIC0xMjNUMzYzIC0xNTBRMzYzIC0xNzMgMzQzIC0xODdUMjg1IC0yMDFRMjM5IC0yMDEgMjEyIC0xNzlUMTg0IC0xMTZRMTg0IC03NyAyMTggLTQwVDMxOSAyM0wzMzggNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJEQzsiIGdseXBoLW5hbWU9InRpbGRlIiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMTQ2IDU1MlExMjkgNTUyIDEyMCA1NjFUMTExIDU4N1ExMTEgNjA2IDExNyA2MjNUMTMzIDY1NFQxNTggNjc1VDE4OSA2ODNRMjE2IDY4MyAyNTQgNjY0VDMzMyA2MDhRMzQxIDYzNCAzNTQgNjU1VDM4NCA2NzdRNDAxIDY3NyA0MTAgNjY4VDQxOSA2NDFRNDE5IDYyMiA0MTMgNjA1VDM5NyA1NzVUMzcyIDU1NFQzNDEgNTQ2UTMxMyA1NDYgMjc1IDU2NVQxOTcgNjIxUTE4OCA1OTUgMTc2IDU3NFQxNDYgNTUyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkREOyIgZ2x5cGgtbmFtZT0iaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNTMwIiBkPSJNMjk1IDU1NVEyOTMgNTU4IDMwMiA1NzNUMzI5IDYxMFQzNjggNjUzVDQxNSA2OTJRNDQxIDcwOSA0NjMgNzA5UTQ4MiA3MDkgNDk1IDY5OFQ1MDggNjcwUTUwOCA2NTMgNDk4IDYzOFQ0NjYgNjA5UTQzOSA1OTEgNDEwIDU4MFQzNTYgNTYxVDMxNCA1NTNUMjk1IDU1NVpNOTggNTU1UTk2IDU1OCAxMDUgNTczVDEzMSA2MTBUMTcxIDY1M1QyMTggNjkyUTI0NCA3MDkgMjY2IDcwOVEyODUgNzA5IDI5OCA2OThUMzExIDY3MFEzMTEgNjUzIDMwMSA2MzhUMjY5IDYwOVEyNDIgNTkxIDIxMyA1ODBUMTU5IDU2MVQxMTcgNTUzVDk4IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDM5NDsiIGdseXBoLW5hbWU9ImluY3JlbWVudCIgaG9yaXotYWR2LXg9IjY0OSIgZD0iTTI5MyA3MDBIMzk2TDYzMyAwSDMwTDI5MyA3MDBaTTE0MCA3M0g0NjVMMzEwIDUyOEwxNDAgNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQTk7IiBnbHlwaC1uYW1lPSJPbWVnYSIgaG9yaXotYWR2LXg9Ijc2MCIgZD0iTTM4MCA2MDJRMzE4IDYwMiAyNzIgNTg1VDE5NiA1MzdUMTUwIDQ2N1QxMzUgMzgwUTEzNSAzMzUgMTQ5IDI5NFQxODggMjE2VDI0OSAxNDhUMzI1IDkzVjBINTFWOTNIMTg4UTExNCAxNTMgNzIgMjI1VDMwIDM4MFEzMCA0NDYgNTQgNTA0VDEyNCA2MDVUMjM1IDY3NFQzODAgNzAwUTQ2MCA3MDAgNTI1IDY3NVQ2MzUgNjA2VDcwNSA1MDRUNzMwIDM4MFE3MzAgMjk3IDY4OCAyMjVUNTcyIDkzSDcwOVYwSDQzNVY5M1E0NzYgMTE3IDUxMSAxNDhUNTcxIDIxNVQ2MTEgMjkzVDYyNSAzODBRNjI1IDQyNiA2MTAgNDY2VDU2NSA1MzdUNDg4IDU4NFQzODAgNjAyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4M0JDOyIgZ2x5cGgtbmFtZT0ibXUiIGhvcml6LWFkdi14PSI1OTEiIGQ9Ik00ODAgLTRRNDY5IC00IDQ1OCAtMVQ0MzggMTBUNDI0IDM0VDQxNyA3MlEzOTEgMzUgMzUyIDEyVDI1NyAtMTJRMjA5IC0xMiAxNzQgM1ExNzMgNCAxNzEgNVYtMzEySDcyVjQ4MUgxNzBWMjA2UTE3MCAxNDMgMjAwIDEwOVQyODUgNzRRMzMwIDc0IDM2NCA5N1Q0MTcgMTU5VjQ4MUg1MTVWN1E1MTUgNSA1MDUgMVQ0ODAgLTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQzA7IiBnbHlwaC1uYW1lPSJwaSIgaG9yaXotYWR2LXg9Ijc4MiIgZD0iTTM5MSAtMTNRMzE4IC0xMyAyNTggMTJUMTUzIDgxVDg1IDE4N1Q2MCAzMjJRNjAgMzk1IDg1IDQ1N1QxNTQgNTY0VDI1OSA2MzRUMzkyIDY2MFE0NjUgNjYwIDUyNSA2MzVUNjI5IDU2NlQ2OTcgNDYwVDcyMiAzMjVRNzIyIDI1MiA2OTcgMTkwVDYyOCA4M1Q1MjQgMTNUMzkxIC0xM1pNMzkyIDQxUTQ1MiA0MSA1MDIgNjFUNTg4IDExOVQ2NDMgMjA4VDY2MyAzMjNRNjYzIDM4NCA2NDMgNDM2VDU4NiA1MjVUNDk5IDU4NFQzOTAgNjA2UTMzMCA2MDYgMjgwIDU4NlQxOTQgNTI4VDEzOSA0MzlUMTE5IDMyNFExMTkgMjYzIDEzOSAyMTFUMTk2IDEyMlQyODMgNjNUMzkyIDQxWk0zMDIgMTM4UTI3MCAxMzggMjcwIDE3MlY0NDVRMjcwIDQ2NSAyODEgNDc2VDMxMCA0ODdINDA1UTQ3NCA0ODcgNTExIDQ1N1Q1NDggMzcwUTU0OCAzMTIgNTEzIDI4MVQ0MDkgMjUwSDM0NlYxNzJRMzQ2IDEzOCAzMTMgMTM4SDMwMlpNMzQ0IDMwOUg0MDhRNDQxIDMwOSA0NTggMzI1VDQ3NSAzNjlRNDc1IDM5NyA0NTggNDEyVDQwNSA0MjhIMzQ0VjMwOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTM7IiBnbHlwaC1uYW1lPSJlbmRhc2giIGhvcml6LWFkdi14PSI1NjkiIGQ9Ik05OSAyMDFRNzYgMjAxIDY2IDIxMVQ1NiAyMzlWMjQ4UTU2IDI2NSA2NiAyNzVUOTkgMjg2SDQ2OFE0OTEgMjg2IDUwMSAyNzZUNTExIDI0OFYyMzlRNTExIDIyMiA1MDEgMjEyVDQ2OCAyMDFIOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDE0OyIgZ2x5cGgtbmFtZT0iZW1kYXNoIiBob3Jpei1hZHYteD0iNzM1IiBkPSJNOTkgMjAxUTc2IDIwMSA2NiAyMTFUNTYgMjM5VjI0OFE1NiAyNjUgNjYgMjc1VDk5IDI4Nkg2MzZRNjU5IDI4NiA2NjkgMjc2VDY3OSAyNDhWMjM5UTY3OSAyMjIgNjY5IDIxMlQ2MzYgMjAxSDk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGdseXBoLW5hbWU9InF1b3RlbGVmdCIgaG9yaXotYWR2LXg9IjI0NiIgZD0iTTk0IDQxMlE3NSA0MTIgNjMgNDI0VDUxIDQ1OVY0NjNRNTEgNDc2IDU2IDQ5MFQ3NSA1MjRMMTU3IDY1MVExNjIgNjU4IDE3MiA2NTlUMTkxIDY1OFQyMDUgNjQ4VDIwNyA2MjlMMTU1IDQ1OVExNDcgNDM2IDEzOCA0MjRUMTAzIDQxMkg5NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMTk7IiBnbHlwaC1uYW1lPSJxdW90ZXJpZ2h0IiBob3Jpei1hZHYteD0iMjQ2IiBkPSJNODkgNDIxUTg0IDQxNCA3NCA0MTNUNTUgNDE0VDQxIDQyNFQzOSA0NDNMOTIgNjEzUTEwMCA2MzcgMTA5IDY0OFQxNDQgNjYwSDE1M1ExNzIgNjYwIDE4MyA2NDhUMTk1IDYxM1Y2MDlRMTk1IDU3OSAxNzIgNTQ4TDg5IDQyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUE7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsYmFzZSIgaG9yaXotYWR2LXg9IjI0NiIgZD0iTTgxIC0xMjBRNzYgLTEyNyA2NiAtMTI4VDQ3IC0xMjdUMzMgLTExN1QzMSAtOThMODQgNzJROTIgOTYgMTAxIDEwN1QxMzYgMTE5SDE0NVExNjQgMTE5IDE3NSAxMDdUMTg3IDcyVjY4UTE4NyAzOCAxNjQgN0w4MSAtMTIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQzsiIGdseXBoLW5hbWU9InF1b3RlZGJsbGVmdCIgaG9yaXotYWR2LXg9IjQyMSIgZD0iTTI2OCA0MTJRMjUwIDQxMiAyMzggNDI0VDIyNiA0NTlWNDYzUTIyNiA0OTIgMjUwIDUyNEwzMzIgNjUxUTMzOCA2NTggMzQ3IDY1OVQzNjUgNjU4VDM3OSA2NDhUMzgyIDYyOUwzMjkgNDU5UTMyMiA0MzUgMzEzIDQyNFQyNzcgNDEySDI2OFpNOTMgNDEyUTc1IDQxMiA2MyA0MjRUNTEgNDU5VjQ2M1E1MSA0NzggNTcgNDkzVDc1IDUyNEwxNTcgNjUxUTE2MyA2NTggMTcyIDY1OVQxOTEgNjU4VDIwNSA2NDhUMjA3IDYyOUwxNTQgNDU5UTE0NyA0MzUgMTM4IDQyNFQxMDMgNDEySDkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRDsiIGdseXBoLW5hbWU9InF1b3RlZGJscmlnaHQiIGhvcml6LWFkdi14PSI0MjEiIGQ9Ik0yNjQgNDIxUTI1OSA0MTQgMjQ5IDQxM1QyMzAgNDE0VDIxNiA0MjRUMjEzIDQ0M0wyNjcgNjEzUTI3NCA2MzcgMjgzIDY0OFQzMTggNjYwSDMyOFEzNDYgNjYwIDM1NyA2NDhUMzY5IDYxM1Y2MDlRMzY5IDU4MCAzNDYgNTQ4TDI2NCA0MjFaTTg4IDQyMVE4MyA0MTQgNzQgNDEzVDU1IDQxNFQ0MSA0MjRUMzggNDQzTDkyIDYxM1E5OSA2MzcgMTA4IDY0OFQxNDMgNjYwSDE1MlExNzEgNjYwIDE4MiA2NDhUMTk0IDYxM1Y2MDlRMTk0IDU3OSAxNzEgNTQ4TDg4IDQyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMUU7IiBnbHlwaC1uYW1lPSJxdW90ZWRibGJhc2UiIGhvcml6LWFkdi14PSI0MjEiIGQ9Ik0yNTYgLTEyMFEyNTEgLTEyNyAyNDEgLTEyOFQyMjIgLTEyN1QyMDggLTExN1QyMDUgLTk4TDI1OSA3MlEyNjYgOTYgMjc1IDEwN1QzMTAgMTE5SDMyMFEzMzggMTE5IDM0OSAxMDdUMzYxIDcyVjY4UTM2MSAzOSAzMzggN0wyNTYgLTEyMFpNODAgLTEyMFE3NSAtMTI3IDY2IC0xMjhUNDcgLTEyN1QzMyAtMTE3VDMwIC05OEw4NCA3MlE5MSA5NiAxMDAgMTA3VDEzNSAxMTlIMTQ0UTE2MyAxMTkgMTc0IDEwN1QxODYgNzJWNjhRMTg2IDM4IDE2MyA3TDgwIC0xMjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIwOyIgZ2x5cGgtbmFtZT0iZGFnZ2VyIiBob3Jpei1hZHYteD0iNTQ4IiBkPSJNMjY2IC0xNTlRMjUwIC0xNTkgMjQ0IC0xNTNUMjM2IC0xMzBMMjIyIDI3N1EyMjAgMzAwIDIyNiAzMjRUMjQ5IDM3MEw5NCAzNDVRNjUgMzM5IDUzIDM1NFQ0MCAzOTZRNDAgNDI1IDUxIDQzOVQ5NCA0NDhMMjQ5IDQyMkwyMjIgNjAxUTIxNyA2MzEgMjMwIDY0M1QyNzQgNjU1UTMwNiA2NTUgMzE4IDY0M1QzMjYgNjAxTDMwMCA0MjNMNDU0IDQ0OFE0ODMgNDUzIDQ5NSA0MzlUNTA4IDM5NlE1MDggMzY5IDQ5NiAzNTRUNDU0IDM0NUwyOTkgMzcwUTMxNSAzNDkgMzIxIDMyNVQzMjYgMjc3TDMxMiAtMTMwUTMxMCAtMTQ2IDMwNCAtMTUyVDI4MyAtMTU5SDI2NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjE7IiBnbHlwaC1uYW1lPSJkYWdnZXJkYmwiIGhvcml6LWFkdi14PSI1NDgiIGQ9Ik0yNjYgLTE1OVEyNTAgLTE1OSAyNDQgLTE1M1QyMzYgLTEzMEwyMjkgODdMOTQgNjRRNjMgNTggNTIgNzJUNDAgMTE2UTQwIDE0MyA1MiAxNThUOTQgMTY3TDIyNyAxNDVMMjIyIDI4MVEyMjAgMzA0IDIyNyAzMjlUMjUxIDM3NEw5NCAzNDlRNjUgMzQzIDUzIDM1OFQ0MCA0MDBRNDAgNDI5IDUxIDQ0M1Q5NCA0NTJMMjQ4IDQyN0wyMjIgNjAxUTIxNyA2MzEgMjMwIDY0M1QyNzQgNjU1UTMwNiA2NTUgMzE4IDY0M1QzMjYgNjAxTDMwMCA0MjdMNDU0IDQ1MlE0ODMgNDU3IDQ5NSA0NDNUNTA4IDQwMFE1MDggMzczIDQ5NiAzNThUNDU0IDM0OUwyOTggMzc0UTMxNCAzNTQgMzIxIDMyOVQzMjYgMjgxTDMyMSAxNDVMNDU0IDE2N1E0ODMgMTczIDQ5NSAxNThUNTA4IDExNlE1MDggODggNDk2IDc0VDQ1NCA2NEwzMTkgODdMMzEyIC0xMzBRMzEwIC0xNDYgMzA0IC0xNTJUMjgzIC0xNTlIMjY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMjsiIGdseXBoLW5hbWU9ImJ1bGxldCIgaG9yaXotYWR2LXg9IjM2NCIgZD0iTTE4MiAxMjlRMTU4IDEyOSAxMzggMTM4VDEwMiAxNjJUNzggMTk4VDY5IDI0M1E2OSAyNjcgNzcgMjg4VDEwMSAzMjVUMTM3IDM1MFQxODIgMzU5UTIwNiAzNTkgMjI3IDM1MFQyNjMgMzI1VDI4NyAyODhUMjk2IDI0M1EyOTYgMjE5IDI4NyAxOTlUMjYzIDE2M1QyMjcgMTM4VDE4MiAxMjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDI2OyIgZ2x5cGgtbmFtZT0iZWxsaXBzaXMiIGhvcml6LWFkdi14PSI2OTciIGQ9Ik01NjMgLTdRNTA5IC03IDUwOSA0N1Y1OVE1MDkgMTE0IDU2MyAxMTRINTc2UTYzMiAxMTQgNjMyIDU5VjQ3UTYzMiAtNyA1NzYgLTdINTYzWk0zNDEgLTdRMjg3IC03IDI4NyA0N1Y1OVEyODcgMTE0IDM0MSAxMTRIMzU0UTQwOSAxMTQgNDA5IDU5VjQ3UTQwOSAtNyAzNTQgLTdIMzQxWk0xMTkgLTdRNjUgLTcgNjUgNDdWNTlRNjUgMTE0IDExOSAxMTRIMTMyUTE4NyAxMTQgMTg3IDU5VjQ3UTE4NyAtNyAxMzIgLTdIMTE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzMDsiIGdseXBoLW5hbWU9InBlcnRob3VzYW5kIiBob3Jpei1hZHYteD0iMTEyNiIgZD0iTTE5OSAzNDRRMTY2IDM0NCAxMzggMzU1VDg4IDM4N1Q1NiA0MzVUNDQgNDk1VjUwNFE0NCA1MzYgNTYgNTY0VDg5IDYxMlQxMzggNjQ1VDIwMCA2NTdRMjM0IDY1NyAyNjIgNjQ2VDMxMiA2MTRUMzQ0IDU2NlQzNTYgNTA2VjQ5N1EzNTYgNDY1IDM0NCA0MzdUMzExIDM4OVQyNjEgMzU2VDE5OSAzNDRaTTEzNyAtOVExMzUgLTExIDEyOCAtMTBUMTEzIC0zVDk4IDlUOTEgMjhROTEgNDIgOTcgNTNUMTIwIDgxTDYyMyA2NjBRNjI0IDY2MSA2MzEgNjYwVDY0NyA2NTVUNjYyIDY0MlQ2NjkgNjIzUTY2OSA2MTIgNjYzIDU5OVQ2NDEgNTY5TDEzNyAtOVpNOTI2IC02UTg5MiAtNiA4NjQgNVQ4MTQgMzdUNzgyIDg1VDc3MCAxNDVWMTU0UTc3MCAxODYgNzgyIDIxNFQ4MTUgMjYyVDg2NSAyOTVUOTI3IDMwN1E5NjEgMzA3IDk4OSAyOTZUMTAzOCAyNjRUMTA3MCAyMTZUMTA4MiAxNTZWMTQ3UTEwODIgMTE1IDEwNzAgODdUMTAzNyAzOVQ5ODggNlQ5MjYgLTZaTTU2NSAtNlE1MzEgLTYgNTAzIDVUNDUzIDM3VDQyMSA4NVQ0MDkgMTQ1VjE1NFE0MDkgMTg2IDQyMSAyMTRUNDU0IDI2MlQ1MDQgMjk1VDU2NiAzMDdRNTk5IDMwNyA2MjcgMjk2VDY3NyAyNjRUNzA5IDIxNlQ3MjEgMTU2VjE0N1E3MjEgMTE1IDcwOSA4N1Q2NzYgMzlUNjI3IDZUNTY1IC02Wk0yMDAgNDA3UTIzNSA0MDcgMjU3IDQzMVQyNzkgNDkzVjUwOFEyNzkgNTQ2IDI1NyA1NzBUMTk5IDU5NVExNjQgNTk1IDE0MiA1NzFUMTIwIDUwOFY0OTNRMTIwIDQ1NSAxNDIgNDMxVDIwMCA0MDdaTTkyNyA1N1E5NjIgNTcgOTg0IDgxVDEwMDYgMTQzVjE1OFExMDA2IDE5NiA5ODQgMjIwVDkyNiAyNDVRODkxIDI0NSA4NjkgMjIxVDg0NyAxNThWMTQzUTg0NyAxMDUgODY5IDgxVDkyNyA1N1pNNTY2IDU3UTYwMCA1NyA2MjIgODFUNjQ1IDE0M1YxNThRNjQ1IDE5NiA2MjMgMjIwVDU2NSAyNDVRNTMwIDI0NSA1MDggMjIxVDQ4NiAxNThWMTQzUTQ4NiAxMDUgNTA4IDgxVDU2NiA1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzk7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xsZWZ0IiBob3Jpei1hZHYteD0iMzQ1IiBkPSJNMjg2IDExMFYxMDZRMjg2IDkyIDI3NyA4MlQyNTAgNzJIMjQ4UTIzMiA3MiAyMTIgODNUMTcwIDExM1QxMjggMTUyVDkxIDE5MlQ2NSAyMjVUNTUgMjQ0UTU1IDI0OCA2NSAyNjJUOTEgMjk1VDEyNyAzMzVUMTY5IDM3NVQyMTEgNDA0VDI0OCA0MTZIMjUwUTI2NyA0MTYgMjc2IDQwNlQyODYgMzgxVjM3OFEyODYgMzY2IDI3MyAzNTBUMjM5IDMxNlQxOTIgMjgwVDEzOSAyNDNRMTY2IDIyNSAxOTIgMjA3VDIzOSAxNzFUMjczIDEzOFQyODYgMTEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAzQTsiIGdseXBoLW5hbWU9Imd1aWxzaW5nbHJpZ2h0IiBob3Jpei1hZHYteD0iMzQ1IiBkPSJNNjAgMTEwUTYwIDEyMiA3MyAxMzdUMTA2IDE3MFQxNTMgMjA2VDIwNyAyNDNRMTgwIDI2MSAxNTQgMjc5VDEwNyAzMTZUNzMgMzUwVDYwIDM3OFYzODFRNjAgMzk1IDY5IDQwNVQ5NSA0MTZIOTZRMTEyIDQxNiAxMzMgNDA1VDE3NSAzNzVUMjE3IDMzNlQyNTQgMjk1VDI4MCAyNjJUMjkwIDI0NFEyOTAgMjQwIDI4MCAyMjZUMjU0IDE5MlQyMTggMTUyVDE3NiAxMTNUMTMzIDg0VDk2IDcySDk1UTc4IDcyIDY5IDgyVDYwIDEwNlYxMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgZ2x5cGgtbmFtZT0idW5pMjA0NCIgaG9yaXotYWR2LXg9IjY4MSIgZD0iTTkxIC04UTg5IC0xMCA4MiAtOVQ2NiAtNFQ1MCA3VDQzIDI2UTQzIDQwIDQ5IDUxVDcxIDc5TDU4NyA2NjBRNTg5IDY2MiA1OTYgNjYyVDYxMiA2NTdUNjI4IDY0NVQ2MzUgNjI1UTYzNSA2MTUgNjI5IDYwMlQ2MDcgNTcyTDkxIC04WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjBBQzsiIGdseXBoLW5hbWU9IkV1cm8iIGhvcml6LWFkdi14PSI2NTgiIGQ9Ik04NSAzNjZRNjMgMzY2IDU0IDM3NFQ0NSAzOThWNDA2UTQ1IDQyMCA1NCA0MjhUODUgNDM3SDE0M1ExNjQgNTQwIDIzMiA1OTlUNDAxIDY1OVE0NTAgNjU5IDQ4OCA2NDdUNTUzIDYxN1Q1OTQgNTc2VDYwOCA1MzNRNjA4IDUxOCA2MDAgNTA4VDU4MyA0OTFUNTY1IDQ4M1Q1NTUgNDgyUTUyOSA1MjcgNDkzIDU1MFQzOTkgNTc0UTM0MCA1NzQgMzAwIDUzOFQyNDIgNDM3SDQzM1E0NTUgNDM3IDQ2MyA0MjlUNDcyIDQwNlYzOThRNDcyIDM4MyA0NjQgMzc1VDQzMyAzNjZIMjMyVjI4NUg0MzNRNDU1IDI4NSA0NjMgMjc2VDQ3MiAyNTNWMjQ1UTQ3MiAyMzEgNDY0IDIyMlQ0MzMgMjEzSDI0MlEyNTkgMTQ4IDMwMSAxMTFUNDA0IDczUTQ2MiA3MyA0OTcgOTlUNTU3IDE3M1E1NTggMTc1IDU2NiAxNzNUNTg1IDE2NVQ2MDMgMTQ3VDYxMSAxMjFRNjExIDEwMSA1OTggNzhUNTU4IDM1VDQ5MyAxVDQwNSAtMTNRMjk5IC0xMyAyMzEgNDZUMTQyIDIxM0g4NVE2MyAyMTMgNTQgMjIyVDQ1IDI0NVYyNTNRNDUgMjY3IDU0IDI3NlQ4NSAyODVIMTM1VjM2Nkg4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMTM7IiBnbHlwaC1uYW1lPSJhZmlpNjEyODkiIGhvcml6LWFkdi14PSI0MzQiIGQ9Ik0xOTkgMzQxUTIyOCAzNjUgMjUxIDM5NVQyOTEgNDU2VDMxNyA1MTNUMzI2IDU1OFEzMjYgNTg0IDMxNSA1ODRRMzA4IDU4NCAzMDAgNTczUTI5MSA1NjEgMjc4IDUzOVQyNTAgNDg2VDIyMiA0MTlUMTk5IDM0MVpNNDQgMTM4UTMwIDE1MSAxOSAxNzJUNyAyMjhRMjUgMjM3IDMzIDI0MFQ0OSAyNDZMNTkgMjUxUTYzIDMyMSA4MSAzODNUMTI2IDQ5N1QxODMgNTg4VDI0NSA2NTJRMjg1IDY4MyAzMjcgNjgzUTM2NyA2ODMgMzk1IDY1MlQ0MjMgNTU4UTQyMyA1MDkgNDAyIDQ2M1QzNDkgMzc1VDI3NiAyOTRUMTk2IDIyM1ExOTYgMjE4IDE5NiAyMTRUMTk1IDIwNFExOTUgMTU4IDIwNyAxMzNUMjM3IDEwN1EyNTQgMTA3IDI3MyAxMzNUMzEwIDIxN1EzMjIgMjIwIDMzNiAyMjBRMzU1IDIyMCAzNzMgMjEzVDQwNCAxODZRMzk3IDE0OSAzODIgMTE0VDM0NSA1MlQyOTMgOVQyMjggLThRMjA2IC04IDE4MiAxVDEzNSAzMFQ5NCA3OFQ2NiAxNDZMNDQgMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyMjsiIGdseXBoLW5hbWU9InRyYWRlbWFyayIgaG9yaXotYWR2LXg9IjcxMyIgZD0iTTM3OCAzMzZRMzUxIDMzNiAzNTEgMzY4VjYxN1EzNTEgNjUxIDM4MSA2NTFINDA4UTQyNCA2NTEgNDMwIDY0NlQ0NDIgNjI4TDUwMiA0ODFMNTYyIDYyOFE1NjcgNjQyIDU3NCA2NDZUNTk1IDY1MUg2MjFRNjUxIDY1MSA2NTEgNjE3VjM2OFE2NTEgMzUzIDY0NSAzNDVUNjI0IDMzNkg2MTVRNTg4IDMzNiA1ODggMzY4VjU1N0w1MzMgNDE2UTUzMSA0MDkgNTI2IDQwNVQ1MDEgNDAwUTQ4MSA0MDAgNDc3IDQwNFQ0NzAgNDE2TDQxNCA1NTZWMzY4UTQxNCAzNTMgNDA5IDM0NVQzODkgMzM2SDM3OFpNNjMgNTg4UTMyIDU4OCAzMiA2MTdWNjIwUTMyIDY0OCA2MyA2NDhIMjc0UTMwNCA2NDggMzA0IDYyMFY2MTdRMzA0IDU4OCAyNzQgNTg4SDIwMlYzNjhRMjAyIDMzNiAxNzIgMzM2SDE2M1ExMzUgMzM2IDEzNSAzNjhWNTg4SDYzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyNjsiIGdseXBoLW5hbWU9InVuaTIxMjYiIGhvcml6LWFkdi14PSI3NjAiIGQ9Ik0zODAgNjAyUTMxOCA2MDIgMjcyIDU4NVQxOTYgNTM3VDE1MCA0NjdUMTM1IDM4MFExMzUgMzM1IDE0OSAyOTRUMTg4IDIxNlQyNDkgMTQ4VDMyNSA5M1YwSDUxVjkzSDE4OFExMTQgMTUzIDcyIDIyNVQzMCAzODBRMzAgNDQ2IDU0IDUwNFQxMjQgNjA1VDIzNSA2NzRUMzgwIDcwMFE0NjAgNzAwIDUyNSA2NzVUNjM1IDYwNlQ3MDUgNTA0VDczMCAzODBRNzMwIDI5NyA2ODggMjI1VDU3MiA5M0g3MDlWMEg0MzVWOTNRNDc2IDExNyA1MTEgMTQ4VDU3MSAyMTVUNjExIDI5M1Q2MjUgMzgwUTYyNSA0MjYgNjEwIDQ2NlQ1NjUgNTM3VDQ4OCA1ODRUMzgwIDYwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMkU7IiBnbHlwaC1uYW1lPSJlc3RpbWF0ZWQiIGhvcml6LWFkdi14PSI4MzAiIGQ9Ik00MTUgNjcxUTQ5MiA2NzEgNTYwIDY0NVQ2ODEgNTczVDc2MyA0NjNUNzkzIDMyNEgxODVRMTc1IDMyNCAxNzUgMzEzVjExNlEyMjMgNjUgMjg2IDM4VDQxNSAxMFE0OTAgMTAgNTU1IDQzVDY2NyAxMzFINzI0UTY2NyA2MiA1ODUgMjZUNDE1IC0xMVEzNDAgLTExIDI3MiAxNFQxNTEgODRUNjcgMTkxVDM2IDMzMFEzNiA0MDMgNjYgNDY1VDE0NyA1NzRUMjY4IDY0NVQ0MTUgNjcxWk00MTUgNjUwUTM0NSA2NTAgMjgyIDYyMlQxNzUgNTQzVjM1OFExNzUgMzQ3IDE4NSAzNDdINjQ2UTY1NSAzNDcgNjU1IDM1OFY1NDJRNjEwIDU5NCA1NDYgNjIyVDQxNSA2NTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjAyOyIgZ2x5cGgtbmFtZT0icGFydGlhbGRpZmYiIGhvcml6LWFkdi14PSI1MzgiIGQ9Ik0zMDMgNDgxUTMzNSA0ODEgMzYxIDQ3MVQ0MDQgNDQ1VjQ2NFE0MDQgNDk5IDM5OSA1MjhUMzgxIDU3OFQzNDMgNjEwVDI4MiA2MjJRMjQ3IDYyMiAyMDggNjEyTDE4OSA2NzlRMjcxIDcxMCAzMzIgNzEwUTQyMSA3MTAgNDY0IDY0OVQ1MDggNDc1UTUwOCAzNzAgNDgxIDI4M1Q0MDkgMTMzVDMxMSAzNVQyMDEgMFExNjUgMCAxMzQgMTBUODAgNDRUNDMgMTAyVDMwIDE4N1EzMCAyNTYgNTUgMzEwVDEyMCA0MDNUMjA4IDQ2MVQzMDMgNDgxWk0yMDUgMTA1UTIyOSAxMDUgMjU2IDEyMVQzMTAgMTY3VDM1OSAyNDNUMzkzIDM0OVEzODIgMzYxIDM2MCAzNzNUMzA5IDM4NlEyNzUgMzg2IDI0NCAzNzFUMTg4IDMzMVQxNDkgMjcwVDEzNCAxOTRRMTM0IDE1NyAxNTAgMTMxVDIwNSAxMDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjA2OyIgZ2x5cGgtbmFtZT0idW5pMjIwNiIgaG9yaXotYWR2LXg9IjY0OSIgZD0iTTI5MyA3MDBIMzk2TDYzMyAwSDMwTDI5MyA3MDBaTTE0MCA3M0g0NjVMMzEwIDUyOEwxNDAgNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjBGOyIgZ2x5cGgtbmFtZT0icHJvZHVjdCIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTQ4NCAwVjYwN0gxNTBWMEg1MFY3MDBINTg0VjBINDg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxMTsiIGdseXBoLW5hbWU9InN1bW1hdGlvbiIgaG9yaXotYWR2LXg9IjQ3NSIgZD0iTTExMCA4MEg0MzdWMEgyNVY5NkwyMDkgMzI1TDI1IDU1NFY2NTBINDM3VjU3MEgxMTVMMjg4IDM1M1YzMDBMMTEwIDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxMjsiIGdseXBoLW5hbWU9Im1pbnVzIiBob3Jpei1hZHYteD0iNjMwIiBkPSJNMTMzIDIyMVExMTAgMjIxIDEwMCAyMzFUOTAgMjYwVjI2N1E5MCAyODUgMTAwIDI5NVQxMzMgMzA2SDQ5NlE1MTkgMzA2IDUyOSAyOTZUNTM5IDI2N1YyNjBRNTM5IDI0MiA1MjkgMjMyVDQ5NiAyMjFIMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxNTsiIGdseXBoLW5hbWU9ImZyYWN0aW9uIiBob3Jpei1hZHYteD0iNjgxIiBkPSJNOTEgLThRODkgLTEwIDgyIC05VDY2IC00VDUwIDdUNDMgMjZRNDMgNDAgNDkgNTFUNzEgNzlMNTg3IDY2MFE1ODkgNjYyIDU5NiA2NjJUNjEyIDY1N1Q2MjggNjQ1VDYzNSA2MjVRNjM1IDYxNSA2MjkgNjAyVDYwNyA1NzJMOTEgLThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE5OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjYyIiBkPSJNMTIzIDE4NFE2OSAxODQgNjkgMjM3VjI0OVE2OSAzMDQgMTIzIDMwNEgxMzdRMTkyIDMwNCAxOTIgMjQ5VjIzN1ExOTIgMTg0IDEzNyAxODRIMTIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxQTsiIGdseXBoLW5hbWU9InJhZGljYWwiIGhvcml6LWFkdi14PSI2NDkiIGQ9Ik0yNTYgNTAxTDM2OSAxNzFMNTY2IDcwMEg2NDlMMzg2IDBIMjgzTDEzNiA0MzNIMzBWNTAxSDI1NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMUU7IiBnbHlwaC1uYW1lPSJpbmZpbml0eSIgaG9yaXotYWR2LXg9IjczMyIgZD0iTTcwMyAyNzFRNzAzIDIzMSA2OTAgMjAzVDY1NCAxNTZUNjA0IDEyOVQ1NDcgMTIwUTUxOCAxMjAgNDkzIDEyOFQ0NDcgMTUwVDQwNSAxODFUMzY2IDIxN1EzNDcgMTk5IDMyOCAxODJUMjg3IDE1MVQyNDAgMTI5VDE4NiAxMjBRMTU3IDEyMCAxMjkgMTI5VDc5IDE1NlQ0NCAyMDNUMzAgMjcxUTMwIDMxMCA0MyAzMzhUNzkgMzg1VDEyOSA0MTNUMTg2IDQyMlEyMTUgNDIyIDI0MCA0MTRUMjg2IDM5MlQzMjcgMzYxVDM2NiAzMjVRMzg1IDM0MyA0MDUgMzYwVDQ0NiAzOTFUNDkzIDQxM1Q1NDcgNDIyUTU3NiA0MjIgNjA0IDQxNFQ2NTQgMzg3VDY4OSAzNDBUNzAzIDI3MVpNMTg3IDIyMlEyMjMgMjIyIDI1MiAyMzVUMzA4IDI3MVEyODIgMjkyIDI1MyAzMDZUMTg3IDMyMFExNjcgMzIwIDE0OSAzMDlUMTMwIDI3MVExMzAgMjQ0IDE0OCAyMzNUMTg3IDIyMlpNNTQ2IDMyMFE1MTAgMzIwIDQ4MSAzMDZUNDI1IDI3MVE0NTEgMjQ5IDQ4MCAyMzZUNTQ2IDIyMlE1NjYgMjIyIDU4NCAyMzNUNjAzIDI3MVE2MDMgMjk4IDU4NSAzMDlUNTQ2IDMyMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMkI7IiBnbHlwaC1uYW1lPSJpbnRlZ3JhbCciIGhvcml6LWFkdi14PSIzOTYiIGQ9Ik0xNjQgNTk2UTE3MiA2NTQgMjAxIDY4NVEyMjggNzE0IDI3MSA3MjNUMzc1IDcyNFY2NDhRMzE0IDY1MyAyODggNjQwVDI1NSA1ODRMMTY4IC0zMlExNTkgLTk1IDEyOCAtMTI2UTEwNSAtMTQ5IDcwIC0xNTVULTE1IC0xNTVWLTgxUTIyIC04NCA0NSAtNzVUNzQgLTI1TDE2NCA1OTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjQ4OyIgZ2x5cGgtbmFtZT0iYXBwcm94ZXF1YWwiIGhvcml6LWFkdi14PSI1MjkiIGQ9Ik0xNDYgODlRMTI5IDg5IDEyMCA5OFQxMTEgMTI0UTExMSAxNDMgMTE3IDE2MFQxMzMgMTkxVDE1OCAyMTJUMTg5IDIyMFEyMTYgMjIwIDI1NCAyMDFUMzMzIDE0NVEzNDEgMTcxIDM1NCAxOTJUMzg0IDIxNFE0MDEgMjE0IDQxMCAyMDVUNDE5IDE3OFE0MTkgMTU5IDQxMyAxNDJUMzk3IDExMlQzNzIgOTFUMzQxIDgzUTMxMyA4MyAyNzUgMTAyVDE5NyAxNThRMTg4IDEzMiAxNzYgMTExVDE0NiA4OVpNMTQ2IDI2NVExMjkgMjY1IDEyMCAyNzRUMTExIDMwMFExMTEgMzE5IDExNyAzMzZUMTMzIDM2N1QxNTggMzg4VDE4OSAzOTZRMjE2IDM5NiAyNTQgMzc3VDMzMyAzMjFRMzQxIDM0NyAzNTQgMzY4VDM4NCAzOTBRNDAxIDM5MCA0MTAgMzgxVDQxOSAzNTRRNDE5IDMzNSA0MTMgMzE4VDM5NyAyODhUMzcyIDI2N1QzNDEgMjU5UTMxMyAyNTkgMjc1IDI3OFQxOTcgMzM0UTE4OCAzMDggMTc2IDI4N1QxNDYgMjY1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2MDsiIGdseXBoLW5hbWU9Im5vdGVxdWFsIiBob3Jpei1hZHYteD0iNjMwIiBkPSJNMTMzIDMzN1ExMTAgMzM3IDEwMCAzNDdUOTAgMzc0VjM4MVE5MCAzOTggMTAwIDQwOFQxMzMgNDE4SDM0MUw0MDIgNTU0UTQxMyA1ODAgNDI0IDU4NVQ0NDkgNTg1TDQ2MCA1ODFRNDc0IDU3NSA0NzggNTYzVDQ3MiA1MjRMNDI0IDQxOEg0OTZRNTE5IDQxOCA1MjkgNDA4VDUzOSAzODFWMzc0UTUzOSAzNTcgNTI5IDM0N1Q0OTYgMzM3SDM4MkwzMTMgMTg1SDQ5NlE1MTkgMTg1IDUyOSAxNzVUNTM5IDE0OFYxNDBRNTM5IDEyMyA1MjkgMTEzVDQ5NiAxMDNIMjgyTDIyMyAtMzNRMjEyIC01OSAyMDEgLTY1VDE3NiAtNjVMMTY1IC02MFExNTEgLTU1IDE0NyAtNDJUMTUzIC0zTDE5OSAxMDNIMTMzUTExMCAxMDMgMTAwIDExM1Q5MCAxNDBWMTQ4UTkwIDE2NSAxMDAgMTc1VDEzMyAxODVIMjQyTDMxMSAzMzdIMTMzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NDsiIGdseXBoLW5hbWU9Imxlc3NlcXVhbCIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTEwMSA0MjBRMTAxIDQ0NSAxMDggNDU2VDEyOSA0NzRMNTAxIDYzMFE1MDUgNjMxIDUxNiA2MThUNTI5IDU4NVE1MzIgNTcwIDUxOSA1NTNUNDgwIDUyNkwyMDUgNDIwTDQ4MCAzMTZRNTA2IDMwNyA1MTggMjkxVDUyOSAyNTdRNTI4IDIzNiA1MTcgMjIzVDUwMSAyMTJMMTI5IDM2NlExMTUgMzczIDEwOCAzODNUMTAxIDQyMFpNMTM2IDk0UTExMyA5NCAxMDMgMTA0VDkzIDEzMVYxMzhROTMgMTU1IDEwMyAxNjVUMTM2IDE3NUg0OTNRNTE2IDE3NSA1MjYgMTY1VDUzNiAxMzhWMTMxUTUzNiAxMTQgNTI2IDEwNFQ0OTMgOTRIMTM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NTsiIGdseXBoLW5hbWU9ImdyZWF0ZXJlcXVhbCIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTEwMCA1ODdRMTAxIDU5NyAxMDUgNjA1VDExMyA2MjBUMTIyIDYyOVQxMjggNjMyTDUwMSA0NzZRNTE1IDQ2OSA1MjIgNDU5VDUyOSA0MjJRNTI5IDM5NyA1MjIgMzg2VDUwMSAzNjlMMTI4IDIxNFExMjQgMjEyIDExMyAyMjVUMTAwIDI1OVE5OSAyNzYgMTEyIDI5M1QxNDkgMzE5TDQyNSA0MjJMMTQ5IDUyOFExMjMgNTM4IDExMCA1NTVUMTAwIDU4N1pNMTM2IDk2UTExMyA5NiAxMDMgMTA2VDkzIDEzM1YxNDFROTMgMTU4IDEwMyAxNjhUMTM2IDE3OEg0OTNRNTE2IDE3OCA1MjYgMTY4VDUzNiAxNDFWMTMzUTUzNiAxMTYgNTI2IDEwNlQ0OTMgOTZIMTM2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjVDQTsiIGdseXBoLW5hbWU9ImxvemVuZ2UiIGhvcml6LWFkdi14PSI1MjAiIGQ9Ik0zMCAzODhMMjI2IDc3NkgyOTRMNDkwIDM4OEwyOTQgMEgyMjZMMzAgMzg4Wk0zNzAgMzg4TDI2MCA2MTZMMTUwIDM4OEwyNjAgMTU5TDM3MCAzODhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjAxOyIgZ2x5cGgtbmFtZT0iZmkiIGhvcml6LWFkdi14PSI2MTIiIGQ9Ik0yMyA0ODFIMTIzVjUxN1ExMjMgNjA4IDE2MyA2NTFUMjc2IDY5NFEzMzIgNjk0IDM1OCA2NzVUMzg0IDYyOVEzODQgNjE4IDM4MSA2MTBUMzczIDU5N1QzNjUgNTg4VDM2MCA1ODZRMzQ5IDU5NyAzMzAgNjA1VDI4OCA2MTRRMjUyIDYxNCAyMzYgNTkxVDIxOSA1MTZWNDgxSDM0M1Y0MDBIMjIxVjBIMTIzVjQwMEgyM1Y0ODFaTTQzMyA0MzhRNDMzIDQ2NSA0NDUgNDc1VDQ3NyA0ODZINDg4UTUwOCA0ODYgNTIwIDQ3NlQ1MzIgNDM4VjBINDMzVjQzOFpNNDgzIDU4NFE0NTUgNTg0IDQ0MCA1OThUNDI0IDYzOVE0MjQgNjY2IDQzOSA2ODBUNDgzIDY5NVE1NDIgNjk1IDU0MiA2MzlRNTQyIDYxMiA1MjcgNTk4VDQ4MyA1ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjAyOyIgZ2x5cGgtbmFtZT0iZmwiIGhvcml6LWFkdi14PSI2MTIiIGQ9Ik0yMyA0ODFIMTIzVjUxN1ExMjMgNjA4IDE2MyA2NTFUMjc2IDY5NFEzMzIgNjk0IDM1OCA2NzVUMzg0IDYyOVEzODQgNjE4IDM4MSA2MTBUMzczIDU5N1QzNjUgNTg4VDM2MCA1ODZRMzQ5IDU5NyAzMzAgNjA1VDI4OCA2MTRRMjUyIDYxNCAyMzYgNTkxVDIxOSA1MTZWNDgxSDM0M1Y0MDBIMjIxVjBIMTIzVjQwMEgyM1Y0ODFaTTQzMyA2NzZRNDMzIDY3OCA0NDQgNjgyVDQ2OSA2ODdRNDgxIDY4NyA0OTIgNjg0VDUxMiA2NzFUNTI2IDY0NVQ1MzIgNjAyVjBINDMzVjY3NloiICAvPgorCis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkZDsiIGs9IjgzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTdkOyIgaz0iLTEiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSIqIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9Ij8iIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iQCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJBIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJDIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkciIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iSiIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJPIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlEiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iVCIgaz0iOTkiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJVIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlYiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iVyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJZIiBrPSI4MyIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IloiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iXCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJhIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImMiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iZCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJlIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9Im8iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0icSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ2IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InciIGs9IjE0IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0ieSIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDY7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hlNzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGE5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gzYzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGU2OyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hhYjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDU7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE1MjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTUzOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDFjOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxZDsiIGs9IjYyIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAxODsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDIwMTk7IiBrPSI2MiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE3ODsiIGs9IjgzIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MjAzOTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDM7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ0OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkMjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRiOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4ZGQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJBIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlYiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iVyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iWSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3gxNzg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSIpIiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDJjOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ii0iIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSIuIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iLyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IjoiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iQCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkEiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJDIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iRyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkoiIGs9Ijc0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJPIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iUSIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlMiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iVCIgaz0iLTIyIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJWIiBrPSItMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlgiIGs9Ii0xOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJhIiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iYyIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImQiIGs9IjU5IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJlIiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJtIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Im8iIGs9IjU5IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJwIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0icSIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJzIiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzQ7IiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzU7IiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDY7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZTc7IiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzY7IiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDg7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGU2OyIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGFiOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzA7IiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzM7IiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDU7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MTUyOyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE1MzsiIGs9IjU5IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDEzOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMTQ7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDNhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMjsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMTsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMzsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkNDsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMjsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTdkOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDJjOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ii4iIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSIvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iPyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IkEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJKIiBrPSIzOSIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iVCIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJXIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWCIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlkiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJaIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iaCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGM2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAyNjsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDFjOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTc4OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWE7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxZTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hjMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iLSIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJBIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IkMiIGs9IjM3IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iRyIgaz0iMzciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJKIiBrPSI2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iTyIgaz0iMzciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJRIiBrPSIzNyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IlQiIGs9IjciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJhIiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iYyIgaz0iMzQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJkIiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImUiIGs9IjM0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJnIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImgiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJqIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibyIgaz0iMzQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InEiIGs9IjM0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDY7IiBrPSIzNyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGU3OyIgaz0iMzQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDg7IiBrPSIzNyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGU2OyIgaz0iMzQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ1OyIgaz0iMzciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxNTI7IiBrPSIzNyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDE1MzsiIGs9IjM0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MjAxMzsiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MjAxNDsiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkMzsiIGs9IjM3IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDQ7IiBrPSIzNyIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQyOyIgaz0iMzciIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iISIgdTI9ImEiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiEiIHUyPSJjIiBrPSIyIiAvPgorPGhrZXJuIHUxPSIhIiB1Mj0iZCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iISIgdTI9ImUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiEiIHUyPSJvIiBrPSIyIiAvPgorPGhrZXJuIHUxPSIhIiB1Mj0icSIgaz0iMiIgLz4KKzxoa2VybiB1MT0iISIgdTI9IiYjeGU3OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iISIgdTI9IiYjeGU2OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iISIgdTI9IiYjeDE1MzsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iJiN4ZGQ7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iSiIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlQiIGs9IjcwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlYiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlciIGs9IjIyIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlgiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJZIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNDsiIGs9Ii0zNSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNTsiIGs9Ii0zNSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNjsiIGs9Ii0zNSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMDsiIGs9Ii0zNSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMzsiIGs9Ii0zNSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3gxNzg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMjsiIGs9Ii0zNSIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMTsiIGs9Ii0zNSIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IjciIGs9Ii00IiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iSiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlYiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlciIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlgiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IlkiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9ImciIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iKCIgdTI9ImoiIGs9Ii0xNTAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSImI3gxNzg7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSJBIiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IkoiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iVCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNDsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzU7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM2OyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMDsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzM7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMyOyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMTsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIwIiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iMSIgaz0iNjciIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjIiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIzIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iNCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjUiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI2IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iNyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iOCIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkEiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iQyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkciIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJPIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iUSIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlQiIGs9IjY2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJVIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iViIgaz0iNjIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlciIGs9IjIyIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJZIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJuIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ1IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ5IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM1OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNjsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDg7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMzOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNTI7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQzOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ0OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQyOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iMSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSI3IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlQiIGs9IjY2IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iViIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlgiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJaIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0ieCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9InoiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSIwIiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjEiIGs9IjY3IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iMiIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSIzIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iNSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI2IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjciIGs9IjIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI4IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJBIiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJDIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkciIGs9IjM4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iTyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJRIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlQiIGs9IjY2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJWIiBrPSI2MiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlciIGs9IjIyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iWSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJtIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im4iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJwIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iciIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjNTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ2OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkYzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGM2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDg7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMDsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMzOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDU7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDE1MjsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMyOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkMzsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDQ7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQyOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjEiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjIiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iMyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSI0IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IjUiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iNyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJCIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkMiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iRCIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJFIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkYiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iRyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJIIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkkiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iSiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJLIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkwiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iTSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJOIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9Ik8iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iUCIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJRIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IlIiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJjIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJnIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hjOTsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDE7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQ2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDg7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4MTUyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGNhOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hjYjsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4Yzg7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGNkOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hjZTsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4Y2Y7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGNjOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSI3IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDIwMjY7IiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDIwMWE7IiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDIwMWU7IiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iMSIgdTI9IjciIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIxIiB1Mj0iJiN4MjAyNjsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIxIiB1Mj0iJiN4MjAxYTsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIxIiB1Mj0iJiN4MjAxZTsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iNCIgaz0iMjIiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSImI3gyMDEzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSImI3gyMDE0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSI3IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMWE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IjciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4YjA7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeDIxMjI7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeDIwMjY7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeDIwMWM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjAxZDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3gyMDE4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IiYjeDIwMTk7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjAxYTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjAxZTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iNyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMjY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IjciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAyNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyMDFhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMWU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjkiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI/IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Il0iIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0ifSIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSImI3hhMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAyNjsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxYTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4MjAxZTsiIGs9IjgwIiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAyNjsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAxYTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAxZTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAyNjsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAxYTsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MjAxZTsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJUIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJZIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0ibyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGU3OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IkEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iVCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJWIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iVyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJYIiBrPSI2IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iWSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJnIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGM0OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4MTc4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJHIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iSiIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJPIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iUSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlMiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iVCIgaz0iMTA0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iViIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJXIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlgiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iWSIgaz0iNTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJhIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImMiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJkIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iZSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJnIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ibSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Im4iIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJvIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0icCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InEiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJyIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0icyIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ0IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InYiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ4IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InkiIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieiIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNDsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzU7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGU3OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGFlOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGE5OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIxMjI7IiBrPSIxNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGM2OyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkODsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gzYzA7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZTY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjAyNjsiIGs9Ii02IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzA7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGMzOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkNTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNTI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MTUzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTM7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMTQ7IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWQ7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjAxODsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MjAxOTsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNzg7IiBrPSIxMSIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWE7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWU7IiBrPSItNiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGMyOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMTsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDQ7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MTMxOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlYiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJXIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iQiIgdTI9ImEiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iYyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJkIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQiIgdTI9ImUiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0ibyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJxIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iQiIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJ3IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0ieSIgaz0iMyIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IiYjeGU3OyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSImI3hlNjsiIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iJiN4MTUzOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJHIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iTyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IlEiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJYIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJZIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJhIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iZCIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJlIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9Im8iIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0icSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ0IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InciIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ5IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ieiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hkNjsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hlNzsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZDg7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4ZTY7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGQ1OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeDE1MjsiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxNTM7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeDE3ODsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGQzOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGQ0OyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGQyOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IkoiIGs9IjM5IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iVCIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlciIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWCIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJZIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IloiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMjY7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE3ODsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MjAxYTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MjAxZTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iRyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IkoiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iTyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IlEiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJUIiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJWIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IlciIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImIiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJjIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImQiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJoIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iayIgaz0iMSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImwiIGs9IjEiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJtIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0ibiIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9Im8iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0icCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iciIgaz0iMiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InUiIGs9IjIiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ2IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZDY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZTc7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hhOTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZDg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4M2MwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hlNjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4YWI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZDU7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MTUyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDE1MzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4MjAzOTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkMzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hkMjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3gxMzE7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJmFtcDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iRyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkoiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iTyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJUIiBrPSItMjYiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJWIiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJXIiBrPSItNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlkiIGs9Ii0yNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImEiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJjIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImQiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJmIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImciIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJpIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJvIiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0icSIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJyIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ1IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ4IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InkiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ieiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGQ2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGU3OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hhZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIxMjI7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkODsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGU2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hhYjsiIGs9IjciIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDI2OyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGQ1OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDE1MjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxNTM7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMTM7IiBrPSI0NiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMTQ7IiBrPSI0NiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDE3ODsiIGs9Ii0yNSIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDIwMzk7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxYTsiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxZTsiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzI7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMxOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkMzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkNDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkMjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlQiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iViIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJXIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlkiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ2IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ5IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIwMjY7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gxNzg7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeDIwMWE7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMDFlOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkgiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSSIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJJIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyMDFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImYW1wOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJPIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iUyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlQiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJWIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJXIiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlgiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImEiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZiIgaz0iNSIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImciIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0idiIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJ3IiBrPSI1IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0ieCIgaz0iMiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InkiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGRjOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4YWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkODsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDU7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE1MjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDEzOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gyMDE0OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNzg7IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQyOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJPIiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlEiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVCIgaz0iOTkiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJVIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlYiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iVyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJZIiBrPSI4MyIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IloiIGs9Ii0xIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iXCIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJhIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImMiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iZCIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJlIiBrPSIxOCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Im8iIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0icSIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJ2IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InciIGs9IjE0IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0ieSIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM1OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDY7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRjOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hlNzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGE5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjNjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ4OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gzYzA7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGU2OyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hhYjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMzOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDU7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE1MjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUzOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gyMDFjOyIgaz0iMTAwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxZDsiIGs9IjYyIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAxODsiIGs9IjEwMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMTk7IiBrPSI2MiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE3ODsiIGs9IjgzIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MjAzOTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMjsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMxOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDM7IiBrPSI0NSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQ0OyIgaz0iNDUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkMjsiIGs9IjQ1IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZGE7IiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRiOyIgaz0iMTUiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkOTsiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik0iIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTiIgdTI9InYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJUIiBrPSIyNyIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iVyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJYIiBrPSIyNiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlkiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iWiIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ4IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InoiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGM1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAyNjsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTc4OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDFhOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDFlOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hjMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImYW1wOyIgaz0iMTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJUIiBrPSItMiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlYiIGs9Ii0xOSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlciIGs9Ii0yIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWCIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJZIiBrPSItMTMiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJaIiBrPSIyNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJvIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ2IiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ3IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ4IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InkiIGs9Ii0xNSIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM0OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNTsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM2OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MjAyNjsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzA7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMzOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxNTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ODsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWE7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMWU7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMyOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMTsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iVCIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlciIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iWCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJZIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IloiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ieCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGM0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hjNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMjY7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3hjMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMTg7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ODsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYTsiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxZTsiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJmFtcDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJWIiBrPSItMTUiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJXIiBrPSIzIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iWCIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iWSIgaz0iLTEzIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDY7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDg7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4ZDU7IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4MTUyOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeDE3ODsiIGs9Ii0xMyIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGQzOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGQ0OyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGQyOyIgaz0iMSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlYiIGs9Ii05IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iVyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlgiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iWSIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzQ7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM1OyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzA7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMzOyIgaz0iLTUiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3gxNzg7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMjsiIGs9Ii01IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzE7IiBrPSItNSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiZhbXA7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlYiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlgiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlkiIGs9Ii0yMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IloiIGs9IjkiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJcIiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJhIiBrPSI4NSIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImMiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZCIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJlIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZyIgaz0iOTUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJtIiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im4iIGs9IjY4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibyIgaz0iOTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJwIiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InEiIGs9IjkwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iciIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJzIiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idSIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ2IiBrPSI1OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ieCIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ5IiBrPSI1OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InoiIGs9IjY4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzQ7IiBrPSI2NyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM1OyIgaz0iNjciIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNjsiIGs9IjI3IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTc7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGFlOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhOTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzY7IiBrPSI2NyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ4OyIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gzYzA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGU2OyIgaz0iODUiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hiZjsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YWI7IiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hiYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAyNjsiIGs9IjY2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzA7IiBrPSI2NyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMzOyIgaz0iNjciIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNTsiIGs9IjI3IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTUyOyIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxNTM7IiBrPSI5MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTM7IiBrPSI2NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMTQ7IiBrPSI2NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE3ODsiIGs9Ii0yMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMzk7IiBrPSIxMTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDNhOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFhOyIgaz0iNjYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyMDFlOyIgaz0iNjYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMjsiIGs9IjY3IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzE7IiBrPSI2NyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQzOyIgaz0iMjciIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNDsiIGs9IjI3IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDI7IiBrPSIyNyIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDEzMTsiIGs9IjY4IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzQ7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzU7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAyNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzA7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAxYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAxZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJmFtcDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iVyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlgiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlkiIGs9Ii0yOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Il0iIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImEiIGs9IjQyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJjIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImQiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZSIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImciIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJrIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImwiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibSIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJuIiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im8iIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJxIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InIiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0icyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InUiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IngiIGs9IjI1IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ieSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ9IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjNDsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzU7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQ2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hlNzsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YWU7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YTk7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzY7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQ4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gzYzA7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZTY7IiBrPSI0MiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hiYjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MjAyNjsiIGs9IjYyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzA7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMzOyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNTM7IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMTQ7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDE3ODsiIGs9Ii0yOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMzk7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwM2E7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWE7IiBrPSI2MiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMWU7IiBrPSI2MiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMyOyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMTsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTMxOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImYW1wOyIgaz0iMzMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJYIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Il0iIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImEiIGs9IjQ3IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJjIiBrPSI0OSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImQiIGs9IjQ5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZSIgaz0iNDkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJmIiBrPSIxNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImciIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJpIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImoiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im0iIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibiIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJvIiBrPSI0OSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InAiIGs9IjM1IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icSIgaz0iNDkiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJyIiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InMiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ1IiBrPSIzNSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InYiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ4IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ9IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNDsiIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzU7IiBrPSI1MyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ2OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hlNzsiIGs9IjQ5IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGE5OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjNjsiIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDg7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDNjMDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZTY7IiBrPSI0NyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGFiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hiYjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MjAyNjsiIGs9IjIyIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzA7IiBrPSI1MyIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMzOyIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkNTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTUyOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gxNTM7IiBrPSI0OSIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMTM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMTQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMzk7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwM2E7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMWE7IiBrPSIyMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMWU7IiBrPSIyMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMyOyIgaz0iNTMiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMTsiIGs9IjUzIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDM7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ0OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkMjsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTMxOyIgaz0iMzUiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImYW1wOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJZIiBrPSItMTgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJdIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJhIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJlIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImYiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJuIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0icCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InIiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ1IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InYiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ5IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9In0iIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzU7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNjsiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGFlOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGE5OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDg7IiBrPSIyNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDNjMDsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hlNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzA7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ1OyIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxNTI7IiBrPSIyNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MjAxMzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MjAxNDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTc4OyIgaz0iLTE4IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzI7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQzOyIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkNDsiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDI7IiBrPSIyNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJmFtcDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iXSIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iYSIgaz0iNTciIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJjIiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImQiIGs9IjU5IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZSIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJmIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImciIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im8iIGs9IjU5IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0icCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJxIiBrPSI1OSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InIiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0icyIgaz0iNTEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ0IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InUiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IngiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ieSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ6IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9In0iIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM0OyIgaz0iNTEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjNTsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDY7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGU3OyIgaz0iNTkiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhZTsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM2OyIgaz0iNTEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkODsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4M2MwOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hlNjsiIGs9IjU3IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YWI7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGJiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMDsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzM7IiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ1OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxNTI7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE1MzsiIGs9IjU5IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxMzsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxNDsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzOTsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzI7IiBrPSI1MSIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMxOyIgaz0iNTEiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMzsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDQ7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQyOyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxMzE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iYiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJjIiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImQiIGs9IjM0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZSIgaz0iMzQiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJmIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImciIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iaCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJpIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImoiIGs9IjE1IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iayIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJsIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im0iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJvIiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InAiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0icSIgaz0iMzQiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJyIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idiIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ3IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InkiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGM1OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNjsiIGs9IjM3IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZTc7IiBrPSIzNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkODsiIGs9IjM3IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZTY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDU7IiBrPSIzNyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDE1MjsiIGs9IjM3IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTUzOyIgaz0iMzQiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gyMDEzOyIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gyMDE0OyIgaz0iNDIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQzOyIgaz0iMzciIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkNDsiIGs9IjM3IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDI7IiBrPSIzNyIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDEzMTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iZyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iaiIgaz0iLTE1MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IiYjeDE3ODsiIGs9Ii01MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImEiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iYyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImUiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iaiIgaz0iLTEzMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0icSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3hlNzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4ZTY7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeDE1MzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4MTc4OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJmIiBrPSIxIiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ2IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0ieSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9ImYiIGs9IjIiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ0IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0idiIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ3IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieCIgaz0iMTciIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ5IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0iYiIgdTI9InoiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjEyMjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxYzsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxODsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJjIiB1Mj0iJiN4YWI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJjIiB1Mj0iJiN4MjAzOTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJmIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0idCIgaz0iMSIgLz4KKzxoa2VybiB1MT0iZSIgdTI9InYiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0idyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iZSIgdTI9IngiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0ieSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImYW1wOyIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJnIiBrPSIyIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iaCIgaz0iLTMiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJrIiBrPSItMyIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImwiIGs9Ii0zIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJvIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJxIiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ0IiBrPSItMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ9IiBrPSItNzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hlNzsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YWU7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGE5OyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMTIyOyIgaz0iLTQyIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4M2MwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hlNjsiIGs9IjE5IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4YWI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGJiOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDI2OyIgaz0iNzQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gxNTM7IiBrPSIxOSIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTM7IiBrPSIyNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTQ7IiBrPSIyNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMWM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFkOyIgaz0iLTUwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxODsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTk7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDM5OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDNhOyIgaz0iMTQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFhOyIgaz0iNzQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFlOyIgaz0iNzQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0idCIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ2IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0ieSIgaz0iNiIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIwMWM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIwMTg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iayIgdTI9Im8iIGs9IjExIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0icSIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ2IiBrPSIxIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0ieSIgaz0iMSIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeGU3OyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3hlNjsiIGs9IjExIiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iJiN4YWI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iJiN4MTUzOyIgaz0iMTEiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSImI3gyMDM5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InQiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0idiIgaz0iNiIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InkiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDFjOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ0IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InYiIGs9IjYiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ5IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iJiN4MjEyMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iJiN4MjAxODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idCIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibyIgdTI9InYiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IngiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0ieSIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ6IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWM7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMTg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0icCIgdTI9InQiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ2IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0icCIgdTI9InciIGs9IjMiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ4IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0icCIgdTI9InkiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMTIyOyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDI2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFjOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDE4OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFhOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImYW1wOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0iciIgdTI9InQiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iciIgdTI9IngiIGs9IjEiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3hlNzsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3hlNjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDI2OyIgaz0iNTgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gxNTM7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxMzsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxNDsiIGs9IjE4IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxYzsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMWQ7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE4OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxOTsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMWE7IiBrPSI1OCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMWU7IiBrPSI1OCIgLz4KKzxoa2VybiB1MT0idCIgdTI9InYiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4ZTc7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4ZTY7IiBrPSI3IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAyNjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDE1MzsiIGs9IjciIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFjOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxODsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0idCIgdTI9IiYjeDIwMWE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDFlOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0idyIgaz0iMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IngiIGs9IjQiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4ZTc7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU2OyIgaz0iMTMiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3hhYjsiIGs9IjYiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDI2OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gxNTM7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTQ7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDFkOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxODsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTk7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDM5OyIgaz0iNiIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IngiIGs9IjMiIC8+Cis8aGtlcm4gdTE9InciIHUyPSJ5IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4ZTc7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4ZTY7IiBrPSIzIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4YWI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAyNjsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MTUzOyIgaz0iMyIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWM7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDFkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxODsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMTk7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDM5OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWE7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMWU7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9InkiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3hlNzsiIGs9IjE3IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTY7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGFiOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gxNTM7IiBrPSIxNyIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTM7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDFkOyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAxODsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTk7IiBrPSItMjAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDM5OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3hlNzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4ZTY7IiBrPSIxMyIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeGFiOyIgaz0iNiIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMjY7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDE1MzsiIGs9IjEzIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxNDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxYzsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMWQ7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE4OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxOTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMzk7IiBrPSI2IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxYTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZTsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hhYjsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDEzOyIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDE0OyIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gyMDM5OyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSImI3gxNzg7IiBrPSItNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGM1OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hlNzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGFlOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGE5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIxMjI7IiBrPSI3MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDNjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hlNjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMjY7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTUyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE1MzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTQ7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWM7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxZDsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDE4OyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTk7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTc4OyIgaz0iNTEiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWU7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMyOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTMxOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZTc7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hhZTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hhOTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMTIyOyIgaz0iNzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGM2OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gzYzA7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZTY7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDI2OyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMDsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDE3ODsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGQ2OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZTc7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YWU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YTk7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZDg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZTY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YWI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hkNTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeDE1MjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeDE1MzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3gyMDM5OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZDM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSImI3hkNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGQyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4MTMxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMjY7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDE3ODsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFhOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMWU7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDI2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGMwOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDFhOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeDIwMWU7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGU3OyIgdTI9IiYjeGFiOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTc7IiB1Mj0iJiN4MjAzOTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IiYjeDIxMjI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iJiN4MjAxYzsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSImI3gyMDE4OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDFjOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMTg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDFjOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMTg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFjOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMTg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDFjOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMTg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIxMjI7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAyNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDFjOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMTg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxYTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDFlOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGM2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMwOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMzsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3gxNzg7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZDg7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gzYzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZTY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4YWI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkNTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MjsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeDE1MzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gyMDM5OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZDM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hkNDsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IiYjeGQyOyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4MTMxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDI2OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMwOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gxNzg7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxYTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFlOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMDsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzM7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeDE3ODsiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzI7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGMxOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMjY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxYzsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDE4OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxZTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNTsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNTI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4MTUzOyIgaz0iLTIiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeDE3ODsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hhMTsiIHUyPSImI3gxNzg7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSImI3gxNzg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iJiN4MTc4OyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzA7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzM7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDU7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTI7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMjsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMTsiIGs9Ii0zMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkMzsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ0OyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDI7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGRiOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDk7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxMzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzM7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE3ODsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ1OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE1MjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNTM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDEzOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFjOyIgaz0iNjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMWQ7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxODsiIGs9IjYwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDE5OyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE3ODsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFhOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFlOyIgaz0iLTMwIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ0OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDEzMTsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMWM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxODsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxNzg7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxYTsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFlOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMyOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gxNTM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeDIwMzk7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDM7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDQ7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4ZDI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4MTMxOyIgaz0iMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3gxNzg7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjMTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3gxNzg7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDEzMTsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGMyOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4YzE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiZhbXA7IiBrPSIzMCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMzk7IiBrPSI2MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwM2E7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMWE7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMWU7IiBrPSI1MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMyOyIgaz0iNTEiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMTsiIGs9IjUxIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDM7IiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ0OyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkMjsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDM7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQyOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzI7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzE7IiBrPSItMzAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDM7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQyOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGE7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkYjsiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ5OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTMxOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMxOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3hkMzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGQ0OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZDI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSImI3gxMzE7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNDsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxMzE7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hkMzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGQ0OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iJiN4ZDI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3gxMzE7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hkMzsiIGs9IjUiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IiYjeGQ0OyIgaz0iNSIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4ZDI7IiBrPSI1IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3gxMzE7IiBrPSIyIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSIxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iNyIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IkEiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iVCIgaz0iNjYiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlYiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJXIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWCIgaz0iMzAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlkiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJaIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iYSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9ImMiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJkIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iZSIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9Im8iIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJxIiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0idiIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IngiIGs9IjMwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJ5IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0ieiIgaz0iMjYiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGM0OyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjNTsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4ZTc7IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzY7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGU2OyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGMwOyIgaz0iLTEwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMzsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4MTUzOyIgaz0iMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeDE3ODsiIGs9IjUwIiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjMjsiIGs9Ii0xMCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzE7IiBrPSItMTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGRkOyIgaz0iMjMiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ZDsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyYzsiIGs9IjM4IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSIuIiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iLyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ij8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJBIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iSiIgaz0iMzkiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlQiIGs9IjI3IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJWIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iVyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlgiIGs9IjI2IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJZIiBrPSIyMyIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWiIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9ImwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IngiIGs9IjEwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJ6IiBrPSIxMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzQ7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzU7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hjNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMjY7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzA7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxYzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDE4OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ODsiIGs9IjIzIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFhOyIgaz0iMzgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMWU7IiBrPSIzOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzI7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4YzE7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKworPC9mb250PgorPC9kZWZzPgorPHRleHQgeD0iNDAiIHk9IjQwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBNZWRpdW0iIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID5BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBBw4HDgMOCw4TDhcODw4YgQ8OHIETDkCBFw4nDiMOKw4sgSSDDjSDDjCDDjiDDjyBOw5E8L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iODAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIE1lZGl1bSIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPk/Dk8OSw5TDlsOVw5jFkiBTxaAgVcOaw5nDm8OcIFnDncW4IFrFvSDDniBhw6HDoMOiw6TDpcOjw6YgY8OnIGTDsCBlw6nDqMOqw6sgaSDEsSDDrSDDrCDDriDDryBuw7Egb8Ozw7LDtMO2w7XDuMWTIHPFocOfIHXDusO5w7vDvCB5w73DvyB6xb48L3RleHQ+Cis8dGV4dCB4PSI0MCIgeT0iMTIwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBNZWRpdW0iIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7DviAxMjM0NTY3ODkwIMK9IMK8IMK+ICUg4oCwICTCosKjwqXGkuKCrMKkIOKAoCDigKEgwqcgwrYgIyBefsK1ICvDl8KxICZsdDsgPSAmZ3Q7IMO3wqwgIcKhP8K/ICZxdW90OyAmYW1wOyAmYXBvczsgKiDCsCAuICwgOiA7ICgpIFsgXCBdIHt9IC8gfDwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxNjAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIE1lZGl1bSIgZm9udC1zaXplPSIzMCIgZmlsbD0iIzkzMyIgPsKmIF8g4oCaIOKAniDigKYg4oC54oC6IMKrwrsg4oCYIOKAmSDigJwg4oCdIOKAoiDCrSAtIOKAkyDigJQgQCDCqSDCriDihKIgwqrCuiDCucKywrMgwrQgYCDLhiDLnCDCqCDCryDCtyDCuDwvdGV4dD4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bS50dGYgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtLnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQwNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bS50dGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bS53b2ZmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bS53b2ZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZmY2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtLndvZmYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bUl0YWxpYy5lb3QgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtSXRhbGljLmVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGJhNGFjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bUl0YWxpYy5lb3QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bUl0YWxpYy5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvT21uZXNfQVRUVzAyTWVkaXVtSXRhbGljLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2E4ZjczCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bUl0YWxpYy5zdmcKQEAgLTAsMCArMSwzODM3IEBACis8P3htbCAgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIiA+Cis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgPgorPG1ldGFkYXRhPgorPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorPGlkPjwhW0NEQVRBW09tbmVzX0FUVCBXMDIgTWVkaXVtIEl0YWxpY11dPjwvaWQ+Cis8dmVuZG9yPk1vbm90eXBlIEltYWdpbmcgSW5jLjwvdmVuZG9yPgorPGNyZWRpdHM+Cis8bmFtZT5Gb250cy5jb20gV2ViRm9udHM8L25hbWU+Cis8VVJMPmh0dHA6Ly93ZWJmb250cy5mb250cy5jb208L1VSTD4KKzxyb2xlPkhvbWUgb2YgdGhlIFdlYiBmb250czwvcm9sZT4KKzwvY3JlZGl0cz4KKzxsaWNlbnNlPgorPFVSTD5odHRwOi8vd2ViZm9udHMuZm9udHMuY29tL0xlZ2FsPC9VUkw+Cis8L2xpY2Vuc2U+Cis8Y29weXJpZ2h0PjwhW0NEQVRBW0dlbmVyYXRlZCBpbiAyMDEwIGJ5IEZvbnRMYWIgU3R1ZGlvLiBDb3B5cmlnaHQgaW5mbyBwZW5kaW5nLl1dPjwvY29weXJpZ2h0PgorPHRyYWRlbWFyaz48L3RyYWRlbWFyaz4KKzxsaWNlbnNlZT4KKzxuYW1lPjwvbmFtZT4KKzwvbGljZW5zZWU+Cis8L21ldGFkYXRhPgorPGRlZnMgPgorPGZvbnQgaG9yaXotYWR2LXg9IjU2NyIgaWQ9Ik9tbmVzX0FUVFcwMk1lZGl1bUl0YWxpYyI+Cis8Zm9udC1mYWNlIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIE1lZGl1bSBJdGFsaWMiIHBhbm9zZS0xPSIwIDAgMCAwIDAgMCAwIDAgMCAwIiBhc2NlbnQ9IjcwMCIgZGVzY2VudD0iLTMwMCIgdW5pdHMtcGVyLWVtPSIxMDAwIiBhbHBoYWJldGljPSIwIj4KKzwvZm9udC1mYWNlPgorPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjE3MCIgLz4KKworPGdseXBoIHVuaWNvZGU9IiYjeEE7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIGdseXBoLW5hbWU9InNwYWNlIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiEiIGdseXBoLW5hbWU9ImV4Y2xhbSIgaG9yaXotYWR2LXg9IjI5NCIgZD0iTTE0MyAxODdRMTI0IDE4NyAxMTggMTk1VDExMyAyMjVMMTY5IDY0OUgyOTlMMTcyIDIxNlExNjcgMjAxIDE2MSAxOTRUMTQzIDE4N1pNMTAyIC03UTQ1IC03IDQ1IDM1UTQ1IDU0IDQ5IDcwVDY1IDk4UTczIDEwNiA4NCAxMTBUMTE0IDExNFExNzEgMTE0IDE3MSA3MlExNzEgNTMgMTY2IDM3VDE1MCA5UTE0MiAxIDEzMiAtM1QxMDIgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImcXVvdDsiIGdseXBoLW5hbWU9InF1b3RlZGJsIiBob3Jpei1hZHYteD0iNDI1IiBkPSJNMTY1IDM3NFExNDYgMzc0IDEzOCAzODBUMTMyIDQwOUwxNjEgNjQ4SDI4MEwxOTQgNDAzUTE4OSAzODggMTgzIDM4MVQxNjUgMzc0Wk0zMzEgMzc0UTMxMyAzNzQgMzA2IDM4MFQzMDAgNDA5TDMzMCA2NDhINDQ5TDM2MSA0MDNRMzUxIDM3NCAzMzEgMzc0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iIyIgZ2x5cGgtbmFtZT0ibnVtYmVyc2lnbiIgaG9yaXotYWR2LXg9IjY3MyIgZD0iTTE2NyAtN1ExNTIgLTcgMTM1IDRUMTE3IDQzUTExNyA1OCAxMjUgODJMMTUwIDE2M0gyMVEyMSAxNjUgMjIgMTY5UTIzIDE3MiAyNCAxNzdUMjcgMTg4TDM2IDIzMlEzOCAyMzggMzggMjQwVjI0MkgxNzRMMjI0IDQwNUg5OFE5OCA0MDcgOTkgNDExUTEwMCA0MTQgMTAwIDQxOVQxMDMgNDMwTDExMiA0NzRRMTEzIDQ3NiAxMTMgNDc4VDExNCA0ODJRMTE0IDQ4NCAxMTUgNDg0SDI0OEwyOTkgNjUwUTMwMSA2NTQgMzEzIDY1NFEzMjggNjU0IDM0NSA2NDNUMzYzIDYwNFEzNjMgNTkxIDM1NSA1NjVMMzMwIDQ4NEg0NzdMNTI4IDY1MFE1MjggNjU0IDU0MSA2NTRRNTU3IDY1NCA1NzQgNjQzVDU5MSA2MDRRNTkxIDU5MSA1ODMgNTY1TDU1OCA0ODRINjg3UTY4NiA0ODEgNjg1IDQ3N1E2ODQgNDc0IDY4NCA0NzBUNjgxIDQ1OUw2NzIgNDE1UTY3MSA0MTIgNjcxIDQxMVQ2NzAgNDA3VjQwNUg1MzRMNDg0IDI0Mkg2MTBRNjEwIDIzOSA2MDkgMjM1UTYwOCAyMzIgNjA3IDIyOFQ2MDUgMjE3TDU5NiAxNzNRNTk1IDE3MCA1OTUgMTY5VDU5NCAxNjVMNTkzIDE2M0g0NTlMNDA5IC0zUTQwOSAtNSA0MDUgLTZUMzk1IC03UTM4MCAtNyAzNjMgNFQzNDYgNDNRMzQ2IDUxIDM0NyA2MVQzNTMgODJMMzc4IDE2M0gyMzJMMTgxIC0zUTE3OSAtNyAxNjcgLTdaTTQwNSAyNDBMNDU2IDQwN0gzMDNMMjUyIDI0MEg0MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIkIiBnbHlwaC1uYW1lPSJkb2xsYXIiIGhvcml6LWFkdi14PSI1NzciIGQ9Ik0xOTEgMVExNTAgOSAxMTggMjVUNjMgNjVRMjUgMTAzIDI1IDE0MVEyNSAxNTYgMzIgMTY2VDQ3IDE4MlQ2MyAxOTBUNzIgMTkwUTkyIDE0OCAxMjkgMTIwVDIxMiA4MEwyNTggMjk1UTIzMSAzMDcgMjA1IDMyMVQxNTggMzU2VDEyNSA0MDVUMTEyIDQ3MVExMTIgNTA4IDEyNiA1NDFUMTY5IDU5OFQyMzggNjM4VDMzMiA2NTRMMzUyIDc0N0g0MzlMNDE3IDY0NlE0NTUgNjM4IDQ4NCA2MjRUNTM1IDU4OVE1NTEgNTczIDU1OSA1NTZUNTY3IDUyMVE1NjcgNTA1IDU2MCA0OTRUNTQ0IDQ3N1Q1MjcgNDY5VDUxOCA0NjlRNTAwIDUwNCA0NjkgNTI5VDM5NiA1NjZMMzUxIDM1NVEzODEgMzQyIDQwOSAzMjhUNDYwIDI5M1Q0OTcgMjQ2VDUxMSAxODJRNTExIDE0MSA0OTcgMTA3VDQ1MyA0N1QzODAgOFQyNzYgLTZMMjU3IC0xMDRIMTcwTDE5MSAxWk00MDQgMTc2UTQwNCAyMDggMzgzIDIyOFQzMjkgMjY0TDI4OCA3NFEzNDggNzcgMzc2IDEwNVQ0MDQgMTc2Wk0yMTMgNDc4UTIxMyA0NDUgMjMxIDQyNVQyODEgMzg3TDMyMCA1NzNRMjY5IDU2OCAyNDEgNTQyVDIxMyA0NzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIlIiBnbHlwaC1uYW1lPSJwZXJjZW50IiBob3Jpei1hZHYteD0iNzc0IiBkPSJNMjMxIDM0NVExNjkgMzQ1IDEzMCAzODJUOTAgNDgyUTkwIDUxNyAxMDIgNTQ5VDEzNiA2MDVUMTg5IDY0M1QyNTkgNjU3UTMyMiA2NTcgMzYxIDYyMFQ0MDEgNTE5UTQwMSA0ODQgMzg5IDQ1M1QzNTUgMzk3VDMwMSAzNTlUMjMxIDM0NVpNODQgLTEwUTgyIC0xMiA3NiAtMTBUNjMgLTNUNTEgOVQ0NSAyN1E0NSA0MCA1MiA1MVQ3OSA4MEw3MjUgNjYxUTcyNiA2NjIgNzMyIDY2MVQ3NDYgNjU0VDc1OSA2NDJUNzY1IDYyNFE3NjUgNjExIDc1OCA2MDBUNzMwIDU3MUw4NCAtMTBaTTU1MSAtNVE0ODggLTUgNDQ5IDMyVDQwOSAxMzJRNDA5IDE2NyA0MjEgMTk5VDQ1NSAyNTVUNTA5IDI5M1Q1NzkgMzA3UTY0MiAzMDcgNjgxIDI3MFQ3MjAgMTY5UTcyMCAxMzQgNzA4IDEwM1Q2NzQgNDdUNjIxIDlUNTUxIC01Wk0yMzYgNDA3UTI1NiA0MDcgMjczIDQxNVQzMDMgNDM5VDMyMyA0NzRUMzMwIDUxNlEzMzAgNTUwIDMwOSA1NzJUMjU1IDU5NVEyMzUgNTk1IDIxOCA1ODdUMTg3IDU2M1QxNjcgNTI4VDE2MCA0ODZRMTYwIDQ1MiAxODIgNDMwVDIzNiA0MDdaTTU1NSA1N1E1NzUgNTcgNTkyIDY1VDYyMiA4OVQ2NDIgMTI0VDY0OSAxNjZRNjQ5IDIwMCA2MjggMjIyVDU3NCAyNDVRNTU0IDI0NSA1MzcgMjM3VDUwNyAyMTNUNDg3IDE3OFQ0ODAgMTM2UTQ4MCAxMDIgNTAyIDgwVDU1NSA1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiZhbXA7IiBnbHlwaC1uYW1lPSJhbXBlcnNhbmQiIGhvcml6LWFkdi14PSI3MDUiIGQ9Ik0yNDkgLTEyUTE5NiAtMTIgMTU2IDFUODggMzhUNDYgOTRUMzEgMTY2UTMxIDIxMCA0NSAyNDNUODUgMzAyVDE0NyAzNDRUMjI5IDM3NFEyMTUgMzk1IDIwNiA0MjFUMTk3IDQ3OVExOTcgNTE1IDIxMCA1NDhUMjQ5IDYwNlQzMDkgNjQ1VDM4OCA2NjBRNDIyIDY2MCA0NTEgNjUwVDUwMiA2MjBUNTM2IDU3NVQ1NDggNTE2UTU0OCA0NDUgNTAxIDQwNFQzNjQgMzQzTDQ5MCAxODRRNTI3IDIyNiA1NDkgMjc1VDU3OSAzNjlINjcxUTY1MyAzMDAgNjI0IDI0MFQ1NDQgMTI1TDU0OSAxMTlRNTczIDg5IDU5NCA3NFQ2NTEgNThRNjUyIDU4IDY1MiA0OFQ2NDkgMjZUNjMyIDRUNTk0IC02UTU1NiAtNiA1MzMgMTJUNDgzIDYyTDQ3NyA2OVE0MzIgMzEgMzc4IDEwVDI0OSAtMTJaTTMyMCAzOTZRMzkxIDQxMCA0MjcgNDM0VDQ2MyA1MTJRNDYzIDU0NSA0NDEgNTY1VDM4MyA1ODZRMzYxIDU4NiAzNDQgNTc4VDMxNCA1NTVUMjk2IDUyM1QyODkgNDg2UTI4OSA0NTkgMjk2IDQzOVQzMjAgMzk2Wk0yNjAgNjZRMzE0IDY2IDM1MyA4MVQ0MjcgMTI3TDI3MiAzMTlRMjAxIDMwMiAxNjMgMjY4VDEyNCAxNzVRMTI0IDE1MyAxMzIgMTM0VDE1NiA5OVQxOTkgNzVUMjYwIDY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmFwb3M7IiBnbHlwaC1uYW1lPSJxdW90ZXNpbmdsZSIgaG9yaXotYWR2LXg9IjI1NiIgZD0iTTE2NSAzNzRRMTQ2IDM3NCAxMzggMzgwVDEzMiA0MDlMMTYxIDY0OEgyODBMMTk0IDQwM1ExODkgMzg4IDE4MyAzODFUMTY1IDM3NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IigiIGdseXBoLW5hbWU9InBhcmVubGVmdCIgaG9yaXotYWR2LXg9IjQwOSIgZD0iTTI1NyAtMjAwUTIzMCAtMjAwIDIwMiAtMTg3VDE0OCAtMTQ3UTEwNSAtMTA0IDc4IC0zNFQ1MSAxMjlRNTEgMTg3IDYyIDI0NVQ5NiAzNTlUMTUwIDQ2M1QyMjMgNTU0UTI2OCA1OTkgMzE4IDYyNVQ0MTggNjUyUTQ0MSA2NTIgNDU0IDY0MVQ0NjggNjEwUTQ2OCA1OTYgNDYwIDU4NVQ0NTAgNTczUTQwOCA1NzAgMzcwIDU1M1QyOTAgNDkzUTI1NSA0NTggMjI5IDQxNVQxODYgMzIzVDE2MCAyMjVUMTUxIDEyN1ExNTEgNjEgMTY5IDdUMjI2IC04NVEyNTggLTExNSAyOTcgLTEyN1EyOTkgLTEyOCAzMDIgLTEzNlQzMDYgLTE1NVEzMDYgLTE3NSAyOTQgLTE4N1QyNTcgLTIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IikiIGdseXBoLW5hbWU9InBhcmVucmlnaHQiIGhvcml6LWFkdi14PSI0MDkiIGQ9Ik0tMTQgLTE5OVEtMzYgLTE5OSAtNDkgLTE4OFQtNjMgLTE1N1EtNjMgLTE0MyAtNTUgLTEzMlQtNDUgLTExOVEtMyAtMTE3IDM1IC05OVQxMTUgLTQwUTE1MCAtNSAxNzYgMzhUMjE5IDEzMFQyNDQgMjI4VDI1MyAzMjZRMjUzIDM5MiAyMzUgNDQ2VDE3OSA1MzhRMTQ4IDU2OCAxMDggNTgxUTEwNiA1ODIgMTAzIDU5MFQ5OSA2MDhROTkgNjI4IDExMSA2NDBUMTQ4IDY1M1EyMDQgNjUzIDI1NyA2MDBRMjk5IDU1NyAzMjYgNDg3VDM1NCAzMjRRMzU0IDI2NiAzNDMgMjA4VDMwOSA5NFQyNTUgLTEwVDE4MiAtMTAxUTEzNyAtMTQ2IDg3IC0xNzJULTE0IC0xOTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIqIiBnbHlwaC1uYW1lPSJhc3RlcmlzayIgaG9yaXotYWR2LXg9IjQyNiIgZD0iTTE1NyAzMzFRMTQ2IDMzNyAxNDQgMzQ2VDE1MiAzNzNMMjA2IDQ2MEwxMTMgNDk2UTk2IDUwNCA5MyA1MTFUOTQgNTMzTDk1IDUzN1E5OCA1NDkgMTA2IDU1M1QxMzMgNTU1TDIzMSA1MzBMMjM4IDYyOFEyNDAgNjQ4IDI0NyA2NTNUMjY2IDY1OUgyNzBRMjgyIDY1OSAyODkgNjU0VDI5OSA2MjhMMzA1IDUzMEw0MDIgNTU1UTQyMSA1NTggNDI5IDU1NFQ0NDEgNTM3TDQ0MiA1MzNRNDQ2IDUxOSA0NDMgNTEyVDQyMiA0OTZMMzMwIDQ1OUwzODQgMzczUTM5MyAzNTYgMzkwIDM0N1QzNzggMzMxTDM3NSAzMjlRMzY2IDMyMiAzNTcgMzIyVDMzMyAzMzdMMjY3IDQxNkwyMDIgMzM3UTE4OSAzMjMgMTgxIDMyM1QxNjEgMzI5TDE1NyAzMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIrIiBnbHlwaC1uYW1lPSJwbHVzIiBob3Jpei1hZHYteD0iNTcyIiBkPSJNMjQwIDI1UTIyMyAyNSAyMTMgMzVUMjA4IDY5TDI0MSAyMjRIOTlRNTkgMjI0IDU5IDI1MFE1OSAyNTkgNjMgMjcyVDc0IDI5M1E4NSAzMDQgMTA4IDMwNEgyNThMMjkwIDQ1M1EyOTUgNDc2IDMwNSA0ODVUMzMwIDQ5NUgzNDBRMzU3IDQ5NSAzNjcgNDg1VDM3MyA0NTFMMzQxIDMwNEg0ODRRNTIzIDMwNCA1MjMgMjc4UTUyMyAyNjkgNTIwIDI1NlQ1MDkgMjM1UTUwMyAyMzAgNDk2IDIyN1Q0NzQgMjI0SDMyNUwyOTEgNjdRMjg2IDQ0IDI3NiAzNVQyNTEgMjVIMjQwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MmM7IiBnbHlwaC1uYW1lPSJjb21tYSIgaG9yaXotYWR2LXg9IjI1OCIgZD0iTTggLTEyN1E0IC0xMzEgLTUgLTEzMFQtMjIgLTEyNVQtMzYgLTExM1QtMzggLTk4TDY4IDExOFE2OSAxMTkgODIgMTE5VDExMiAxMTVUMTQxIDEwMVQxNTQgNzNRMTU0IDU4IDE0OCA0NlQxMjYgMTRMOCAtMTI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLSIgZ2x5cGgtbmFtZT0iaHlwaGVuIiBob3Jpei1hZHYteD0iNDI3IiBkPSJNNDggMTk4UTQ5IDIwMiA1MCAyMDhRNTEgMjE3IDU2IDIzNkw1OSAyNTBRNjEgMjU4IDYyIDI2NVQ2NSAyNzhRNjYgMjg0IDY3IDI4OUgzNzhRMzc3IDI4NCAzNzYgMjc4UTM3NSAyNzMgMzc0IDI2NlQzNzAgMjUwTDM2NyAyMzZRMzYyIDIxNyAzNjEgMjA4UTM2MCAyMDIgMzU5IDE5OEg0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ii4iIGdseXBoLW5hbWU9InBlcmlvZCIgaG9yaXotYWR2LXg9IjI1NiIgZD0iTTgyIC03UTI1IC03IDI1IDM1UTI1IDU0IDMwIDcwVDQ2IDk4UTU0IDEwNiA2NCAxMTBUOTQgMTE0UTE1MSAxMTQgMTUxIDcyUTE1MSA1MyAxNDcgMzdUMTMxIDlRMTIzIDEgMTEyIC0zVDgyIC03WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iLyIgZ2x5cGgtbmFtZT0ic2xhc2giIGhvcml6LWFkdi14PSIzNzMiIGQ9Ik0tOTEgLTIwMkwzNTQgNjUySDQ1M1E0NDMgNjMxIDQzNCA2MTNRNDI2IDU5NyA0MTggNTgyVDQwNiA1NThMOCAtMjAySC05MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjAiIGdseXBoLW5hbWU9Inplcm8iIGhvcml6LWFkdi14PSI2NjkiIGQ9Ik0zMTYgLTEzUTI1NiAtMTMgMjExIDRUMTM1IDUzVDg4IDEyOFQ3MiAyMjNRNzIgMjU4IDc4IDI5OVQ5NyAzODhRMTExIDQ0NyAxMzMgNDk2VDE5MSA1ODJUMjc0IDYzOFQzODkgNjU5UTQ0OSA2NTkgNDk0IDY0MlQ1NzAgNTkzVDYxNyA1MThUNjMzIDQyM1E2MzMgMzg4IDYyNiAzNDdUNjA4IDI1OFE1OTQgMTk5IDU3MiAxNTBUNTE0IDY0VDQzMSA4VDMxNiAtMTNaTTMyMyA3MlEzNjcgNzIgMzk3IDg3VDQ0OSAxMjlUNDgzIDE4OVQ1MDYgMjYyUTUxOCAzMTAgNTI0IDM1MVQ1MzAgNDIyUTUzMCA0OTAgNDkxIDUzMlQzODIgNTc0UTMzOCA1NzQgMzA4IDU1OVQyNTYgNTE3VDIyMiA0NTdUMTk5IDM4NVExODcgMzM3IDE4MSAyOTVUMTc1IDIyNFExNzUgMTU2IDIxNCAxMTRUMzIzIDcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iMSIgZ2x5cGgtbmFtZT0ib25lIiBob3Jpei1hZHYteD0iNDAwIiBkPSJNMjQwIDUwNVEyMjYgNDkyIDIwOSA0ODZUMTc0IDQ3OVExMzMgNDc5IDExNiA0OThRMTAxIDUxMSAxMDEgNTM3UTEwMSA1NTMgMTA3IDU2NVQxMjAgNTg1VDEzMyA1OTdUMTQwIDYwMFExNTkgNTc2IDIwMiA1NzZRMjM0IDU3NiAyNTggNTk4VDI5MyA2NTJIMzI2UTM3NSA2NTIgMzYzIDYwMkwyMzYgMEgxMzRMMjQwIDUwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjIiIGdseXBoLW5hbWU9InR3byIgaG9yaXotYWR2LXg9IjU2OSIgZD0iTTQ3IDBRMzMgMCAyMiAxNFQxMSA0NlExMSA5NCAyOCAxNDFUNzggMjIwUTk3IDIzOSAxMTcgMjUzVDE2MiAyODFUMjE3IDMwNVQyODcgMzI5UTMyMyAzNDEgMzU1IDM1M1Q0MTIgMzgyVDQ1MSA0MjJUNDY2IDQ3N1E0NjYgNTIwIDQzMyA1NDdUMzM5IDU3NFEyNzYgNTc0IDIzNyA1NDNUMTc0IDQ2M1ExNzMgNDYxIDE2NCA0NjJUMTQ1IDQ2OVQxMjYgNDg0VDExNyA1MTNRMTE3IDUzMCAxMjcgNTUxVDE1NiA1OTFRMTg1IDYyMCAyMzEgNjQwVDM0MiA2NjBRMzk0IDY2MCA0MzYgNjQ3VDUwNyA2MTFUNTUxIDU1NFQ1NjcgNDgwUTU2NyA0MjggNTUwIDM5MlQ1MDIgMzMwVDQyNSAyODRUMzIyIDI0NlEyODggMjM1IDI2MyAyMjZUMjE3IDIwOFQxODIgMTg5VDE1NCAxNjZRMTIzIDEzMyAxMTcgODZINDk2UTQ5NSA4MiA0OTQgNzdRNDkzIDcyIDQ5MiA2NlQ0ODggNTFRNDg2IDQyIDQ4NSAzNFQ0ODEgMTdRNDc5IDggNDc4IDBINDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSIzIiBnbHlwaC1uYW1lPSJ0aHJlZSIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTI1MCAtMTJRMTgxIC0xMiAxMzEgNlQ1NSA1MlEzMiA3NCAyNCA5NVQxNSAxMzNRMTUgMTU2IDI1IDE2OVQ0NyAxODlUNzAgMTk2VDgxIDE5NVE5MiAxMzUgMTM1IDEwM1QyNTMgNzFRMjkyIDcxIDMyMSA4MVQzNjkgMTA5VDM5NyAxNTBUNDA3IDIwMFE0MDcgMjQ1IDM3NSAyNzJUMjc4IDI5OUgxOTJMMTk4IDMyNlEyMDAgMzM1IDIwMiAzNDhUMjA3IDM2OVEyMDggMzcyIDIwOCAzNzNUMjA5IDM3N1YzNzlIMzAwUTM0NyAzNzkgMzc3IDM4OFQ0MjQgNDEyVDQ0OCA0NDZUNDU1IDQ4NlE0NTUgNTA3IDQ0NiA1MjNUNDIwIDU1MlQzODAgNTcwVDMzMCA1NzdRMjcxIDU3NyAyMzAgNTUxVDE2NiA0ODdRMTY1IDQ4NSAxNTcgNDg2VDEzOCA0OTJUMTIwIDUwN1QxMTIgNTMyUTExMiA1NDcgMTE5IDU2MVQxNDEgNTkwUTE3MiA2MjIgMjIwIDY0MVQzMzUgNjYwUTM4MyA2NjAgNDI0IDY1MFQ0OTUgNjE5VDU0MSA1NjhUNTU4IDQ5N1E1NTggNDY4IDU0OSA0NDFUNTIyIDM5MlQ0NzYgMzU1VDQwOSAzMzNRNDYxIDMxNSA0ODUgMjc4VDUxMCAxOTZRNTEwIDE2MCA0OTcgMTIzVDQ1NCA1NlQzNzQgN1QyNTAgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNCIgZ2x5cGgtbmFtZT0iZm91ciIgaG9yaXotYWR2LXg9IjYyMCIgZD0iTTM1OCAxNzRINzJRNzAgMTc0IDY1IDE3OVQ1NSAxOTNUNDYgMjEzVDQyIDIzN1E0MiAyNTggNTEgMjc0VDgzIDMxNkwzNzQgNjA2UTM4NyA2MTkgMzk3IDYyOFQ0MTggNjQyVDQ0MSA2NDlUNDcxIDY1MlE1MTYgNjUyIDUzMiA2MzVUNTQwIDU4MUw0NzEgMjU4SDU4NlE1ODYgMjU1IDU4NSAyNTFRNTg0IDI0NyA1ODMgMjQyVDU4MSAyMzFMNTcxIDE4NFE1NjkgMTc2IDU2OSAxNzZMNTY4IDE3NEg0NTVMNDE4IDBIMzIyTDM1OCAxNzRaTTM3OSAyNTZMNDQ1IDU2OEwxMzYgMjU2SDM3OVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjUiIGdseXBoLW5hbWU9ImZpdmUiIGhvcml6LWFkdi14PSI1NzIiIGQ9Ik0xOTAgMzgzUTI0MCA0MDIgMjk4IDQwMlE0MDQgNDAyIDQ2MSAzNTNUNTE4IDIyMlE1MTggMTcwIDUwMCAxMjdUNDQ3IDUzVDM2NSA1VDI1NiAtMTJRMTgxIC0xMiAxMzIgNlQ1NSA1M1EyMyA4NiAyMyAxMjRRMjMgMTM5IDMwIDE1MFQ0NyAxNjhUNjUgMTc3VDc0IDE3OFE5NSAxMjkgMTM5IDEwMFQyNTcgNzBRMzMwIDcwIDM3MyAxMTBUNDE3IDIxNVE0MTcgMjY3IDM4NCAyOTVUMjgwIDMyNFEyMzIgMzI0IDIwMCAzMTRUMTQzIDI5MFE4MyAzMDMgOTYgMzYyTDE0MyA1OTBRMTU1IDY0NyAyMTAgNjQ3SDU3N1E1NzYgNjQzIDU3NSA2MzlRNTc0IDYzNSA1NzMgNjMwVDU3MSA2MTdRNTY5IDYwNyA1NjcgNTk3VDU2MiA1NzlRNTU5IDU2OSA1NTggNTU5SDIyOEwxOTAgMzgzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iNiIgZ2x5cGgtbmFtZT0ic2l4IiBob3Jpei1hZHYteD0iNjIxIiBkPSJNMzA5IC0xMlEyNTYgLTEyIDIxMyA0VDEzOCA1MFQ5MCAxMjVUNzMgMjI2UTczIDI1OSA3OSAzMDZUMTAxIDQwM1QxNDAgNTAxVDE5OCA1ODNRMjMzIDYxOSAyNzggNjM5VDM5OCA2NjBRNDU4IDY2MCA1MDEgNjQyVDU2OCA2MDFRNTg0IDU4NCA1OTEgNTY5VDU5OCA1MzlRNTk4IDUyMSA1OTAgNTEwVDU3MSA0OTNUNTUxIDQ4NlQ1NDEgNDg2UTUyMSA1MjkgNDgzIDU1MlQzOTYgNTc1UTMxNCA1NzUgMjY0IDUxOFQxODkgMzUxUTIxOSAzNzMgMjU5IDM4OVQzNjAgNDA1UTQwNSA0MDUgNDQyIDM5M1Q1MDcgMzU5VDU0OSAzMDRUNTY0IDIyOVE1NjQgMTgyIDU0NiAxMzlUNDk1IDYyVDQxNSA4VDMwOSAtMTJaTTMxMyA3MFEzNDkgNzAgMzc3IDgyVDQyNSAxMTRUNDU1IDE2MVQ0NjYgMjIwUTQ2NiAyNzEgNDMyIDMwMVQzMzEgMzMyUTI3OCAzMzIgMjQyIDMxNVQxNzYgMjcyUTE3MyAyNTggMTcyIDI0NlQxNzEgMjIyUTE2OSAxNTAgMjA2IDExMFQzMTMgNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI3IiBnbHlwaC1uYW1lPSJzZXZlbiIgaG9yaXotYWR2LXg9IjU2NCIgZD0iTTE2MCAtNVExNjAgLTYgMTUwIC02VDEyNyAtMVQxMDUgMTRUOTUgNDNROTUgNjAgMTAzIDczVDEyOSAxMDhMNDc3IDU1NUgxMDVRMTA1IDU1OSAxMDcgNTY1UTEwOCA1NzAgMTEwIDU3N1QxMTQgNTkzUTExNiA2MDEgMTE3IDYxMVQxMjEgNjI5UTEyMyA2MzkgMTI1IDY0N0g1NDVRNTQ3IDY0NyA1NTMgNjQyVDU2NiA2MjdUNTc4IDYwNlQ1ODMgNTc4UTU4MyA1NjAgNTc2IDU0NFQ1NDkgNTAyTDE2MCAtNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IjgiIGdseXBoLW5hbWU9ImVpZ2h0IiBob3Jpei1hZHYteD0iNjE3IiBkPSJNMjkyIC0xMlEyMzUgLTEyIDE4OSAwVDExMCAzNVQ1OSA5MFQ0MSAxNjNRNDEgMjI1IDg1IDI3M1QyMTEgMzQwUTE3MCAzNTcgMTQ4IDM4OFQxMjUgNDY0UTEyNSA1MDUgMTQzIDU0MFQxOTMgNjAyVDI3MSA2NDRUMzY5IDY1OVE0MTkgNjU5IDQ2MCA2NDdUNTMyIDYxNFQ1NzggNTYyVDU5NSA0OTZRNTk1IDQzNiA1NTggMzkwVDQ0NiAzMjVRNDk2IDMwNSA1MjIgMjcwVDU0OSAxODdRNTQ5IDE0NSA1MzEgMTA5VDQ4MCA0NlQ0MDAgNFQyOTIgLTEyWk0zNTYgMzY3UTQyMiAzNjcgNDU5IDM5OVQ0OTYgNDg0UTQ5NiA1MjkgNDU5IDU1NFQzNjIgNTgwUTI5OCA1ODAgMjYxIDU0N1QyMjMgNDYyUTIyMyA0MTggMjU5IDM5M1QzNTYgMzY3Wk0yOTYgNjZRMzY4IDY2IDQwOCAxMDJUNDQ5IDE5MlE0NDkgMjM4IDQwOCAyNjZUMjk0IDI5NVEyNjMgMjk1IDIzNiAyODZUMTg4IDI2MVQxNTYgMjIzVDE0NCAxNzJRMTQ0IDEyNSAxODUgOTZUMjk2IDY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iOSIgZ2x5cGgtbmFtZT0ibmluZSIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTI1OSAtMTJRMTk0IC0xMiAxNTMgNFQ4OCA0NVE3MyA2MSA2NiA3N1Q1OSAxMDdRNTkgMTI0IDY3IDEzNVQ4NSAxNTJUMTAzIDE1OVQxMTMgMTYwUTEzNCAxMTcgMTczIDk1VDI2MCA3MlEzNDEgNzIgMzkwIDEyN1Q0NjUgMjg2UTQzNSAyNjUgMzkzIDI0OVQyOTYgMjMzUTI1MCAyMzMgMjEzIDI0NFQxNDggMjc4VDEwNyAzMzVUOTIgNDEzUTkyIDQ2MiAxMTAgNTA3VDE2MSA1ODVUMjQyIDYzOVQzNDcgNjU5UTQ1NiA2NTkgNTIwIDU5N1Q1ODQgNDIxUTU4NCAzODggNTc4IDM0MVQ1NTYgMjQ0VDUxOCAxNDZUNDYwIDY0UTQ0MiA0NiA0MjMgMzJUMzgwIDlUMzI3IC02VDI1OSAtMTJaTTMyNCAzMDZRMzc1IDMwNiA0MTIgMzIzVDQ3OSAzNjZRNDg1IDM5NyA0ODUgNDI0UTQ4NyA0OTcgNDUxIDUzN1QzNDUgNTc4UTMwOSA1NzggMjgwIDU2NlQyMzEgNTMzVDIwMSA0ODRUMTkwIDQyMlExOTAgMzY4IDIyMiAzMzdUMzI0IDMwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IjoiIGdseXBoLW5hbWU9ImNvbG9uIiBob3Jpei1hZHYteD0iMjU4IiBkPSJNMTY1IDMxOFExMDggMzE4IDEwOCAzNjBRMTA4IDM3OCAxMTIgMzk1VDEyOCA0MjNRMTM2IDQzMSAxNDcgNDM0VDE3NyA0MzhRMjM0IDQzOCAyMzQgMzk2UTIzNCAzNzggMjMwIDM2MVQyMTQgMzMzUTIwNiAzMjUgMTk1IDMyMlQxNjUgMzE4Wk05NCAtN1EzNyAtNyAzNyAzNVEzNyA1NCA0MiA3MFQ1OCA5OFE2NiAxMDYgNzYgMTEwVDEwNiAxMTRRMTYzIDExNCAxNjMgNzJRMTYzIDUzIDE1OSAzN1QxNDMgOVExMzUgMSAxMjQgLTNUOTQgLTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSI7IiBnbHlwaC1uYW1lPSJzZW1pY29sb24iIGhvcml6LWFkdi14PSIyODIiIGQ9Ik0xNjUgMzE4UTEwOCAzMTggMTA4IDM2MFExMDggMzc4IDExMiAzOTVUMTI4IDQyM1ExMzYgNDMxIDE0NyA0MzRUMTc3IDQzOFEyMzQgNDM4IDIzNCAzOTZRMjM0IDM3OCAyMzAgMzYxVDIxNCAzMzNRMjA2IDMyNSAxOTUgMzIyVDE2NSAzMThaTTIwIC0xMjdRMTYgLTEzMSA3IC0xMzBULTEwIC0xMjVULTI0IC0xMTNULTI2IC05OEw4MCAxMThRODEgMTE5IDk0IDExOVQxMjQgMTE1VDE1MyAxMDFUMTY2IDczUTE2NiA1OCAxNjAgNDZUMTM4IDE0TDIwIC0xMjdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImbHQ7IiBnbHlwaC1uYW1lPSJsZXNzIiBob3Jpei1hZHYteD0iNDk4IiBkPSJNOTUgMjA3UTgxIDIxNiA3MiAyMjlUNjMgMjYwUTY0IDI4MCA3NSAyOTZUMTEyIDMyNUw0NTMgNDkwUTQ1NCA0OTAgNDU4IDQ4N1Q0NjcgNDc3VDQ3NSA0NjFUNDc5IDQ0MlE0ODAgNDI3IDQ2OSA0MTJUNDI4IDM4M0wxNjUgMjYxTDM2MCAxNDhRMzg5IDEzMSAzOTggMTE1VDQwNiA4NFE0MDUgNzMgNDAxIDY1VDM5MSA1MFQzODIgNDFUMzc1IDM5TDk1IDIwN1oiICAvPgorPGdseXBoIHVuaWNvZGU9Ij0iIGdseXBoLW5hbWU9ImVxdWFsIiBob3Jpei1hZHYteD0iNTcyIiBkPSJNMTM4IDMzNFE5NSAzMzQgOTUgMzYxUTk1IDM3MCA5OSAzODZUMTEyIDQxMFExMjIgNDIxIDE1MCA0MjFINDkyUTUzNiA0MjEgNTM2IDM5NFE1MzYgMzg0IDUzMSAzNjhUNTE4IDM0NFE1MTMgMzM5IDUwNSAzMzdUNDgxIDMzNEgxMzhaTTg4IDEwMFE0NSAxMDAgNDUgMTI3UTQ1IDEzNyA0OSAxNTNUNjIgMTc3UTY3IDE4MiA3NSAxODVUMTAwIDE4OEg0NDJRNDg1IDE4OCA0ODUgMTYxUTQ4NSAxNTEgNDgxIDEzNVQ0NjggMTExUTQ2MyAxMDUgNDU1IDEwM1Q0MzAgMTAwSDg4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJmd0OyIgZ2x5cGgtbmFtZT0iZ3JlYXRlciIgaG9yaXotYWR2LXg9IjQ5OCIgZD0iTTU1IDM5UTUzIDM5IDQ5IDQyVDQxIDUyVDMzIDY4VDI5IDg3UTI4IDEwMiAzOSAxMTdUODAgMTQ2TDM0MyAyNjhMMTQ4IDM4MVExMTkgMzk4IDExMCA0MTRUMTAyIDQ0NVExMDMgNDU1IDEwNyA0NjRUMTE3IDQ3OVQxMjYgNDg4VDEzMyA0OTBMNDEzIDMyMlE0MjcgMzEzIDQzNiAzMDBUNDQ1IDI2OVE0NDQgMjQ5IDQzMyAyMzNUMzk2IDIwNEw1NSAzOVoiICAvPgorPGdseXBoIHVuaWNvZGU9Ij8iIGdseXBoLW5hbWU9InF1ZXN0aW9uIiBob3Jpei1hZHYteD0iNTEzIiBkPSJNMTYyIDE4M1ExNjIgMTg2IDE2NCAxOTJRMTY2IDE5NyAxNjcgMjA2VDE3MyAyMzJRMTgyIDI3NSAyMDkgMzEwVDI5OSAzNjdRMzI4IDM3NyAzNTAgMzg3VDM4OCA0MTBUNDExIDQzOVQ0MTkgNDc5UTQxOSA1MjAgMzg5IDU0OFQzMDQgNTc2UTI1MCA1NzYgMjEzIDU0NVQxNTggNDY2UTE1OCA0NjQgMTQ5IDQ2NVQxMjkgNDcyVDEwOSA0ODZUMTAwIDUxMlExMDAgNTMzIDExMSA1NTRUMTQxIDU5NVExNzAgNjI0IDIxMSA2NDJUMzEwIDY2MFEzNTggNjYwIDM5NyA2NDdUNDYzIDYwOVQ1MDYgNTUzVDUyMSA0ODJRNTIxIDQzOCA1MDYgNDA4VDQ2NyAzNThUNDE1IDMyNlQzNjEgMzA1UTMxMCAyODggMjg4IDI2NVQyNjEgMjIzUTI1OSAyMTcgMjU4IDIxMFQyNTUgMTk3UTI1MyAxOTAgMjUyIDE4M0gxNjJaTTE4OSAtN1ExMzIgLTcgMTMyIDM1UTEzMiA1NCAxMzYgNzBUMTUyIDk4UTE2MCAxMDYgMTcxIDExMFQyMDEgMTE0UTI1OCAxMTQgMjU4IDcyUTI1OCA1MyAyNTMgMzdUMjM3IDlRMjI5IDEgMjE5IC0zVDE4OSAtN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IkAiIGdseXBoLW5hbWU9ImF0IiBob3Jpei1hZHYteD0iNzc3IiBkPSJNMzkzIC0xM1EzMjEgLTEzIDI2MyA4VDE2MyA2N1QxMDAgMTYwVDc4IDI4MVE3OCAzNjAgMTA2IDQyOVQxODMgNTUwVDMwMCA2MzBUNDQ1IDY2MFE1MTIgNjYwIDU2NyA2NDFUNjYzIDU4NlQ3MjQgNTAyVDc0NiAzOTFRNzQ2IDMzOCA3MzQgMjk2VDY5OCAyMjVUNjQzIDE3OVQ1NzAgMTYzUTUxNyAxNjMgNDkzIDE4M1Q0NjIgMjMyUTQyNSAxNjggMzQ5IDE2OFEzMDEgMTY4IDI2OSAxOTlUMjM3IDI4N1EyMzcgMzIxIDI0OSAzNTRUMjgyIDQxNFQzMzIgNDU2VDM5NiA0NzJRNDI3IDQ3MiA0NTIgNDU4VDQ5MCA0MThRNDk0IDQzMiA0OTcgNDQxVDUwMiA0NTZRNTA0IDQ2MyA1MDUgNDY3SDU3N0w1NDAgMjkxUTUzMiAyNTggNTQyIDI0MFQ1ODQgMjIxUTYzMyAyMjEgNjYyIDI2NVQ2OTEgMzg5UTY5MSA0MzcgNjczIDQ3N1Q2MjEgNTQ3VDU0MSA1OTJUNDM5IDYwOFEzNzUgNjA4IDMyMCA1ODNUMjIzIDUxNVQxNTggNDEyVDEzNCAyODVRMTM0IDIzMSAxNTMgMTg2VDIwNiAxMDlUMjkwIDU4VDM5OCA0MFE0NDIgNDAgNDgzIDUzVDU1NCA4NlE1NjIgOTIgNTY5IDk1VDU4OCA5OVE1OTYgOTkgNjAyIDk0VDYxMyA4M1Q2MTggNzFUNjE5IDY0UTU4NCAzMiA1MjYgMTBUMzkzIC0xM1pNMzc0IDIzMFE0MDggMjMwIDQzNCAyNTRUNDY4IDMxNEw0NzYgMzU1UTQ2OCAzODAgNDUxIDM5NVQ0MDUgNDEwUTM4NCA0MTAgMzY3IDQwMFQzMzggMzc0VDMyMCAzMzhUMzEzIDI5N1EzMTMgMjY2IDMzMCAyNDhUMzc0IDIzMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkEiIGdseXBoLW5hbWU9IkEiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik0tMzMgMEwzMzkgNjIyUTM0OSA2MzkgMzYyIDY0NlQ0MDUgNjU0UTQ0MSA2NTQgNDU0IDY0NFQ0NzEgNjE2TDU5MyAwSDQ4OEw0NTEgMTkwSDE5MUw4MiAwSC0zM1pNNDQxIDI3M0wzOTEgNTQ2TDIzMyAyNzNINDQxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQiIgZ2x5cGgtbmFtZT0iQiIgaG9yaXotYWR2LXg9IjY1MiIgZD0iTTE2MCA1OTBRMTY5IDY0NyAyMjcgNjQ3SDQxN1E1MTYgNjQ3IDU2NiA2MTBUNjE3IDUwMVE2MTcgNDQzIDU4NyAzOTlUNDc5IDMzMlE1MzcgMzE2IDU2NSAyODJUNTkzIDIwMVE1OTMgMTU5IDU4MCAxMjNUNTM1IDU5VDQ1MyAxNlQzMjggMEgzNEwxNjAgNTkwWk0zMjkgODNRNDE1IDgzIDQ1MSAxMTNUNDg4IDIwNVE0ODggMjQ1IDQ1NyAyNjhUMzYyIDI5MUgxOTlMMTU0IDgzSDMyOVpNMzY3IDM2NVE0MzUgMzY1IDQ3MyAzOTdUNTExIDQ4M1E1MDggNTY0IDM5MyA1NjRIMjU3TDIxNCAzNjVIMzY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iQyIgZ2x5cGgtbmFtZT0iQyIgaG9yaXotYWR2LXg9IjY4MyIgZD0iTTM3MSAtMTJRMzAzIC0xMiAyNDggN1QxNTQgNjNUOTQgMTUyVDcyIDI3MFE3MiAzNDggOTkgNDE5VDE3NSA1NDNUMjkwIDYyN1Q0MzUgNjU5UTUxMCA2NTkgNTU4IDYzOFQ2MzQgNTg4UTY1NiA1NjcgNjY2IDU0NVQ2NzYgNTA3UTY3NiA0ODcgNjY2IDQ3NVQ2NDQgNDU3VDYyMSA0NTBUNjA4IDQ1MFE1NjQgNTY4IDQzNCA1NjhRMzgwIDU2OCAzMzQgNTQ1VDI1MyA0ODNUMjAwIDM5M1QxODAgMjgzUTE4MCAyMzYgMTk0IDE5OVQyMzQgMTM1VDI5NiA5NVQzNzUgODBRNDM4IDgwIDQ4NSAxMDVUNTYxIDE3NVE1NjIgMTc2IDU3MCAxNzRUNTg4IDE2NlQ2MDUgMTUwVDYxMyAxMjRRNjEzIDk2IDU4MSA2NFE1NTEgMzQgNDk2IDExVDM3MSAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJEIiBnbHlwaC1uYW1lPSJEIiBob3Jpei1hZHYteD0iNzAwIiBkPSJNMTYwIDU5MFExNjkgNjQ3IDIyNyA2NDdIMzQzUTQ5MyA2NDcgNTc2IDU3N1Q2NjAgMzc4UTY2MCAzMDEgNjM1IDIzMlQ1NjAgMTEyVDQzNCAzMFQyNTcgMEgzNEwxNjAgNTkwWk0yNzIgODlRMzQ0IDg5IDM5NyAxMTFUNDg2IDE3MVQ1MzggMjU4VDU1NSAzNjRRNTU1IDQ1NSA0OTggNTA2VDMzNCA1NThIMjU1TDE1NiA4OUgyNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJFIiBnbHlwaC1uYW1lPSJFIiBob3Jpei1hZHYteD0iNjIxIiBkPSJNMTYwIDU5MFExNzEgNjQ3IDIyNyA2NDdINjUwUTY0OSA2NDEgNjQ3IDYzM1E2NDUgNjI2IDY0NCA2MThUNjQxIDYwMVE2MzcgNTgxIDYzMSA1NTZIMjU2TDIxNyAzNzRINTIxTDUwMyAyODdIMTk4TDE1NyA5MUg1MzhMNTE5IDBIMzRMMTYwIDU5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkYiIGdseXBoLW5hbWU9IkYiIGhvcml6LWFkdi14PSI1NzciIGQ9Ik0xNjAgNTkwUTE2OSA2NDcgMjI3IDY0N0g2MjVRNjE3IDYxMiA2MTQgNTk0VDYwOCA1NjdMNjA2IDU1NkgyNTVMMjExIDM1MEg0ODVRNDg0IDM0MyA0ODIgMzM2UTQ4MCAzMzAgNDc5IDMyMlQ0NzYgMzA2UTQ3MiAyODcgNDY2IDI2M0gxOTRMMTM5IDBIMzVMMTYwIDU5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IkciIGdseXBoLW5hbWU9IkciIGhvcml6LWFkdi14PSI3NDUiIGQ9Ik01OTUgLTRRNTcwIC00IDU1NSAxMlQ1NDYgNjlRNTE4IDMzIDQ3MCAxMVQzNTggLTEyUTI5NCAtMTIgMjQxIDdUMTUxIDYxVDkzIDE0OFQ3MiAyNjVRNzIgMzQzIDk5IDQxNFQxNzYgNTQwVDI5MyA2MjdUNDQyIDY2MFE1MTcgNjYwIDU3MSA2MzdUNjU0IDU4NFE2NzIgNTY3IDY4MSA1NDhUNjkxIDUxMlE2OTEgNDkxIDY4MSA0NzlUNjU5IDQ2MlQ2MzYgNDU3VDYyNCA0NThRNjA1IDUwNiA1NTcgNTM4VDQ0MyA1NzBRMzg2IDU3MCAzMzggNTQ3VDI1NCA0ODNUMTk5IDM4OFQxNzkgMjc0UTE3OSAxNzcgMjMyIDEyNFQzNzYgNzFRNDI0IDcxIDQ1OCA4NFQ1MTggMTIyUTUzMCAxMzQgNTM5IDE0NFQ1NTUgMTY5VDU2OSAyMDRUNTgzIDI1N0gzODJMNDAwIDM0MUg2MzhRNjk0IDM0MSA2ODIgMjg0TDYyMiAzUTYyMiAxIDYxNCAtMVQ1OTUgLTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJIIiBnbHlwaC1uYW1lPSJIIiBob3Jpei1hZHYteD0iNzA5IiBkPSJNMTYzIDYwNFExNjggNjI4IDE3OSA2MzlUMjE0IDY1MUgyMjhRMjUxIDY1MSAyNjEgNjM4VDI2NSA2MDFMMjE3IDM2OUg1NDdMNTk3IDYwNFE2MDIgNjI4IDYxMyA2MzlUNjQ4IDY1MUg2NjNRNjg1IDY1MSA2OTUgNjM4VDcwMCA2MDBMNTcxIDBINDY5TDUyOCAyNzlIMTk4TDEzNyAwSDM0TDE2MyA2MDRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJJIiBnbHlwaC1uYW1lPSJJIiBob3Jpei1hZHYteD0iMjkzIiBkPSJNMTQ3IDBINDRMMTczIDYwNFExNzggNjI4IDE4OSA2MzlUMjI0IDY1MUgyMzhRMjYxIDY1MSAyNzEgNjM4VDI3NSA2MDFMMTQ3IDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJKIiBnbHlwaC1uYW1lPSJKIiBob3Jpei1hZHYteD0iNDk1IiBkPSJNMTg1IC0xMlExMzYgLTEyIDEwMiAyVDQ2IDM4UTMyIDUyIDI2IDY0VDIwIDg5UTIwIDEwNyAyNyAxMTlUNDQgMTM4VDYyIDE0N1Q3MSAxNDhRODcgMTE2IDExNiA5NlQxODMgNzZRMjM2IDc2IDI2NSAxMDhUMzEwIDIxNEw0MDMgNjQ3SDUwNUw0MTAgMTk4UTM4NyA5MiAzMzQgNDBUMTg1IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9IksiIGdseXBoLW5hbWU9IksiIGhvcml6LWFkdi14PSI2MDgiIGQ9Ik00NzggLTZRNDYwIC02IDQ0NSAwVDQxNiAxOVQzODcgNTJUMzUzIDEwMEwyMDQgMzEzTDEzOCAwSDM1TDE2MyA2MDRRMTY4IDYyOSAxNzkgNjQwVDIxNCA2NTFIMjI4UTI1MSA2NTEgMjYxIDYzOFQyNjUgNjAwTDIxMyAzNTRMNTY4IDY2MFE1NjggNjYwIDU3NyA2NThUNTk2IDY1MFQ2MTQgNjM1VDYyMyA2MTBRNjIzIDU5MyA2MTQgNTc5VDU4MiA1NDdMMzA4IDMyMkw0NDggMTMxUTQ2NCAxMDkgNDc2IDk1VDQ5OSA3MlQ1MjAgNTlUNTQ1IDU0UTU0NiA1NCA1NDYgNDVUNTQwIDI0VDUyMCA0VDQ3OCAtNloiICAvPgorPGdseXBoIHVuaWNvZGU9IkwiIGdseXBoLW5hbWU9IkwiIGhvcml6LWFkdi14PSI1NDYiIGQ9Ik0xNjMgNjA0UTE2OCA2MjggMTc5IDYzOVQyMTQgNjUxSDIyOFEyNTEgNjUxIDI2MSA2MzhUMjY1IDYwMUwxNTcgOTJINDMzUTQ3OCA5MiA0NzggNjNRNDc4IDUzIDQ3NCAzN1Q0NjAgMTFRNDU1IDUgNDQ2IDNUNDIwIDBIMzRMMTYzIDYwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9Ik0iIGdseXBoLW5hbWU9Ik0iIGhvcml6LWFkdi14PSI3ODMiIGQ9Ik0xNjAgNTkyUTE2NiA2MjAgMTgzIDYzNVQyMjkgNjUxSDI1NVEyODQgNjUxIDI5NSA2MzlUMzExIDU5OEwzOTAgMjU0TDYxOCA2MDBRNjI4IDYxNSA2MzYgNjI1VDY1MyA2NDFUNjcxIDY0OVQ2OTQgNjUxSDcyNFE3NTMgNjUxIDc2NCA2MzRUNzcxIDU5MEw2NDUgMEg1NDhMNjU4IDUxOEw0NDUgMTk0UTQzMSAxNzMgNDE4IDE2M1QzNzUgMTUyUTMzOSAxNTIgMzI5IDE2NVQzMTQgMTk5TDI0MiA1MTVMMTMxIDBIMzRMMTYwIDU5MloiICAvPgorPGdseXBoIHVuaWNvZGU9Ik4iIGdseXBoLW5hbWU9Ik4iIGhvcml6LWFkdi14PSI3MTYiIGQ9Ik0xNjAgNTkyUTE3MiA2NTEgMjIzIDY1MUgyNDBRMjYwIDY1MSAyNzIgNjQyVDI5NSA2MTBMNTE2IDE1NUw2MjEgNjQ3SDcxN0w1OTAgNTFRNTc5IC00IDUzMSAtNEg1MjNRNTAzIC00IDQ5MiA1VDQ2OCAzN0wyMzkgNTA5TDEzMSAwSDM1TDE2MCA1OTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJPIiBnbHlwaC1uYW1lPSJPIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzY2IC0xMVEyOTYgLTExIDI0MiAxMVQxNTAgNzFUOTMgMTYwVDczIDI3MVE3MyAzNTQgMTAyIDQyNVQxODAgNTQ4VDI5NSA2MzBUNDM0IDY2MFE1MDMgNjYwIDU1NyA2MzhUNjQ5IDU3OFQ3MDcgNDg4VDcyNyAzNzdRNzI3IDI5NCA2OTggMjIzVDYyMCAxMDBUNTA1IDE5VDM2NiAtMTFaTTM3NCA3OVE0MjAgNzkgNDY0IDEwMFQ1NDQgMTYwVDYwMCAyNTJUNjIxIDM3MFE2MjEgNDExIDYwOCA0NDdUNTcxIDUxMVQ1MTAgNTUzVDQyNiA1NjlRMzc5IDU2OSAzMzUgNTQ4VDI1NSA0ODhUMTk5IDM5NlQxNzggMjc4UTE3OCAyMzcgMTkxIDIwMVQyMjkgMTM3VDI5MCA5NVQzNzQgNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJQIiBnbHlwaC1uYW1lPSJQIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNMTYwIDU5MFExNjkgNjQ3IDIyNyA2NDdIMzc1UTQ4NSA2NDcgNTQzIDYwMlQ2MDIgNDcyUTYwMiAzNjAgNTM0IDI5N1QzMzEgMjMzSDE4OEwxMzcgMEgzNEwxNjAgNTkwWk0zNDMgMzE2UTQxNSAzMTYgNDU2IDM1M1Q0OTggNDYwUTQ5OCA1MTAgNDY2IDUzNlQzNjYgNTYySDI1N0wyMDUgMzE2SDM0M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlEiIGdseXBoLW5hbWU9IlEiIGhvcml6LWFkdi14PSI3NzQiIGQ9Ik02MzUgLTEzUTYwNyAtMTMgNTkwIC0yVDU0NyA0M1E1MDUgMTcgNDU5IDNUMzYyIC0xMVEyOTEgLTExIDIzOCAxMFQxNDcgNzBUOTIgMTU5VDczIDI3MVE3MyAzNTQgMTAyIDQyNVQxODAgNTQ4VDI5NiA2MzBUNDM3IDY2MFE1MDcgNjYwIDU2MSA2MzlUNjUyIDU3OVQ3MDggNDg5VDcyNyAzNzdRNzI3IDI5MyA2OTggMjIzVDYxNyAxMDBMNjIxIDk1UTYzOSA3MSA2NTQgNTlUNjg1IDQxUTY4NiA0MSA2ODYgMzNUNjgwIDE0VDY2NSAtNFQ2MzUgLTEzWk0zNzEgNzlRNDM1IDc5IDQ5MCAxMTRMMzkxIDI0N1EzOTEgMjQ3IDQwMSAyNTZUNDIzIDI3NlQ0NDUgMjk3VDQ1NiAzMDVMNTU2IDE3M1E1ODcgMjExIDYwNSAyNjBUNjIzIDM3MFE2MjMgNDExIDYxMCA0NDdUNTczIDUxMVQ1MTIgNTUzVDQzMCA1NjlRMzgyIDU2OSAzMzcgNTQ4VDI1NiA0ODhUMTk5IDM5NlQxNzggMjc4UTE3OCAyMzcgMTkxIDIwMVQyMjggMTM3VDI4OSA5NVQzNzEgNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJSIiBnbHlwaC1uYW1lPSJSIiBob3Jpei1hZHYteD0iNjIxIiBkPSJNNjEzIDQ3OVE2MTMgMzc5IDU1MSAzMjFUMzc2IDI2MEw0NTEgMTMzUTQ2MyAxMTMgNDcyIDk5VDQ5MiA3NlQ1MTYgNjNUNTQ2IDU4UTU0NyA1OCA1NDcgNDhUNTQxIDI2VDUyMSA0VDQ3OCAtNlE0NjEgLTYgNDQ3IC0yVDQxOCAxNFQzOTAgNDZUMzU3IDk5TDI3MSAyNTNIMTkxTDEzOCAwSDM1TDE2MCA1OTBRMTY5IDY0NyAyMjcgNjQ3SDM4NlE0OTggNjQ3IDU1NSA2MDVUNjEzIDQ3OVpNMzU1IDMzNFE0MjkgMzM0IDQ2OCAzNjlUNTA3IDQ2OFE1MDcgNTE1IDQ3NCA1MzlUMzc3IDU2M0gyNTZMMjA3IDMzNEgzNTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJTIiBnbHlwaC1uYW1lPSJTIiBob3Jpei1hZHYteD0iNTgwIiBkPSJNMjcyIC0xMlExOTkgLTEyIDE0NSA4VDU5IDYwUTQyIDc4IDMyIDk2VDIyIDEzNVEyMiAxNTAgMjkgMTYxVDQ2IDE3OFQ2MyAxODdUNzIgMTg4UTk4IDEzNiAxNDkgMTA0VDI3NCA3MlEzNDIgNzIgMzc0IDk5VDQwNyAxNzRRNDA3IDE5NiAzOTcgMjExVDM2OSAyMzlUMzI4IDI2MlQyNzcgMjg0UTI0NyAyOTYgMjE3IDMxMVQxNjMgMzQ3VDEyNSAzOTdUMTEwIDQ2OFExMTAgNTA3IDEyNSA1NDJUMTcwIDYwM1QyNDMgNjQ0VDM0MyA2NTlRNDE1IDY1OSA0NjQgNjQxVDU0MSA1OTRRNTczIDU2MiA1NzMgNTI2UTU3MyA1MDkgNTY2IDQ5OFQ1NDkgNDgxVDUzMSA0NzJUNTIxIDQ3MlE0OTggNTE5IDQ1MyA1NDdUMzQwIDU3NVEyODMgNTc1IDI0OCA1NDhUMjEzIDQ3OVEyMTMgNDU1IDIyMyA0MzlUMjUxIDQwOVQyOTQgMzg1VDM0OSAzNjFRMzgwIDM0OSA0MTAgMzM1VDQ2MyAzMDBUNTAxIDI1MlQ1MTYgMTg0UTUxNiAxNDEgNTAxIDEwNVQ0NTUgNDNUMzc4IDNUMjcyIC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9IlQiIGdseXBoLW5hbWU9IlQiIGhvcml6LWFkdi14PSI2MjciIGQ9Ik0zMzAgNTU1SDE1N1ExMTIgNTU1IDExMiA1ODRRMTEyIDU5NCAxMTYgNjEwVDEzMCA2MzZRMTM1IDY0MiAxNDQgNjQ0VDE3MCA2NDdINjI0UTY2OSA2NDcgNjY5IDYxOFE2NjkgNjA4IDY2NCA1OTJUNjUxIDU2NlE2NDUgNTYwIDYzNyA1NThUNjExIDU1NUg0MzNMMzE1IDBIMjEzTDMzMCA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJVIiBnbHlwaC1uYW1lPSJVIiBob3Jpei1hZHYteD0iNjgyIiBkPSJNMzIzIC0xMlExODQgLTEyIDEyMCA2NFQ4OCAyOTFMMTU0IDYwNFExNjAgNjI4IDE3MSA2MzlUMjA2IDY1MUgyMjBRMjQzIDY1MSAyNTIgNjM4VDI1NyA2MDBMMTkwIDI4M1ExNjkgMTgxIDIwNSAxMzBUMzMyIDc5UTQ2OSA3OSA1MDYgMjU0TDU4MSA2MDRRNTg2IDYyOCA1OTcgNjM5VDYzMiA2NTFINjQ1UTY2NyA2NTEgNjc3IDYzOFQ2ODIgNjAxTDYwNiAyNDFRNTUyIC0xMiAzMjMgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iViIgZ2x5cGgtbmFtZT0iViIgaG9yaXotYWR2LXg9IjY1MyIgZD0iTTExNCA2MThRMTEzIDYyMSAxMTggNjI3VDEzMSA2MzhUMTUxIDY0N1QxNzUgNjUxUTE5NSA2NTEgMjA4IDYzOFQyMjYgNTk5TDMwNiAxMjBMNjA0IDY1MlE2MDQgNjUzIDYxNSA2NTNUNjQxIDY0OFQ2NjcgNjMyVDY3OSA1OTlRNjc5IDU4NyA2NzQgNTc0VDY1NCA1MzdMMzM0IDBIMjMzTDExNCA2MThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJXIiBnbHlwaC1uYW1lPSJXIiBob3Jpei1hZHYteD0iOTU4IiBkPSJNMTQ4IDYyN1ExNDggNjMzIDE2NSA2NDJUMjA0IDY1MlEyMzAgNjUyIDI0MyA2MzZUMjU1IDU5MkwyNjAgMTEzTDQ3MiA1MjdRNDgzIDU1MCA0OTkgNTU5VDU0MiA1NjlRNTc2IDU2OSA1OTAgNTU1VDYwNyA1MTZMNjQwIDExM0w4NzcgNjUwUTg3NyA2NTEgODg5IDY1MVQ5MTYgNjQ4VDk0MyA2MzNUOTU2IDYwMFE5NTYgNTg5IDk1MiA1NzZUOTM3IDU0MEw2ODMgMEg1NjVMNTI3IDQ1M0wyODcgMEgxNzFMMTQ4IDYyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IlgiIGdseXBoLW5hbWU9IlgiIGhvcml6LWFkdi14PSI2MzAiIGQ9Ik00OTUgLTExUTQ1OCAtMTEgNDMzIDE3VDM4MyAxMDVMMzE2IDI1OUw2NCAtMTFRNjQgLTEyIDU0IC0xMFQzMyAtMlQxMyAxNFQzIDQxUTMgNjYgMzYgOThMMjY5IDMzMkwxMjEgNjQ3SDIzMEwzNDYgMzg1TDYwMSA2NTlRNjAxIDY1OSA2MTEgNjU3VDYzMiA2NTBUNjUyIDYzNFQ2NjIgNjA3UTY2MiA1ODIgNjI5IDU0OUwzOTIgMzEyTDQ3MCAxNDVRNDgyIDExOCA0OTIgMTAyVDUxMiA3NlQ1MzUgNjRUNTYyIDYwUTU2MyA2MCA1NjMgNDlUNTU3IDI1VDUzNyAwVDQ5NSAtMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJZIiBnbHlwaC1uYW1lPSJZIiBob3Jpei1hZHYteD0iNjA1IiBkPSJNMjU4IDI2N0w4OCA2NDdIMTk2TDMyMiAzNTFMNTc4IDY1NVE1NzggNjU1IDU4OCA2NTRUNjA5IDY0N1Q2MzAgNjMyVDY0MCA2MDNRNjQwIDU4OSA2MzMgNTc1VDYwNSA1MzhMMzYwIDI2MkwzMDUgMEgyMDFMMjU4IDI2N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IloiIGdseXBoLW5hbWU9IloiIGhvcml6LWFkdi14PSI2MDUiIGQ9Ik0xIDBRMyA4IDUgMTlRNyAyNyA5IDM4VDE0IDYxUTE5IDgzIDI4IDk4VDYwIDEzNkw0ODcgNTU3SDE4MVExMjUgNTU3IDEyNSA1OTRRMTI1IDYwMyAxMjggNjEyVDEzNCA2MjlUMTQxIDY0MlQxNDYgNjQ3SDYyN1E2MjUgNjM4IDYyMyA2MjhRNjIxIDYxOSA2MTkgNjA4VDYxNCA1ODZRNjA5IDU2NCA2MDEgNTQ5VDU2OSA1MTFMMTQzIDkwSDQ3MFE1MjYgOTAgNTI2IDUzUTUyNiA0NCA1MjMgMzVUNTE3IDE4VDUxMCA1VDUwNSAwSDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJbIiBnbHlwaC1uYW1lPSJicmFja2V0bGVmdCIgaG9yaXotYWR2LXg9IjM3OSIgZD0iTS02IC0xOThRLTUgLTE5MSAtMiAtMTgxUTAgLTE3MyAyIC0xNjFUOSAtMTMxTDE2MyA1OTNRMTY1IDYwNyAxNjcgNjE3VDE3MiA2MzVMMTc1IDY1MEgzODNRNDI0IDY1MCA0MjQgNjI0UTQyNCA2MTUgNDIwIDYwMFQ0MDcgNTc2UTQwMiA1NzEgMzk0IDU2OVQzNzEgNTY2SDI0OUwxMDUgLTExM0gyMjJRMjYzIC0xMTMgMjYzIC0xNDBRMjYzIC0xNDkgMjU5IC0xNjRUMjQ3IC0xODdRMjQxIC0xOTIgMjMzIC0xOTVUMjEwIC0xOThILTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJcIiBnbHlwaC1uYW1lPSJiYWNrc2xhc2giIGhvcml6LWFkdi14PSIzNzMiIGQ9Ik0xMDEgNjUzSDE5MEwyNzQgLTIwM0gxODZMMTAxIDY1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9Il0iIGdseXBoLW5hbWU9ImJyYWNrZXRyaWdodCIgaG9yaXotYWR2LXg9IjM3OSIgZD0iTTM3OSA2NTBRMzc3IDY0MyAzNzUgNjMzUTM3MyA2MjUgMzcxIDYxM1QzNjQgNTgzTDIxMCAtMTQxUTIwNyAtMTU1IDIwNSAtMTY1VDIwMSAtMTgzTDE5OCAtMTk4SC0xMFEtNTEgLTE5OCAtNTEgLTE3MlEtNTEgLTE2MyAtNDcgLTE0OFQtMzQgLTEyNFEtMjkgLTExOSAtMjEgLTExN1QyIC0xMTRIMTI0TDI2OCA1NjVIMTUxUTExMCA1NjUgMTEwIDU5MlExMTAgNjAxIDExNCA2MTZUMTI2IDYzOVExMzIgNjQ0IDE0MCA2NDdUMTYzIDY1MEgzNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJeIiBnbHlwaC1uYW1lPSJhc2NpaWNpcmN1bSIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTIwOCA0NDRRMTk0IDQ0NCAxODcgNDUyVDE3OSA0NzJRMTc5IDQ5MSAxOTYgNTEyVDI0NSA1NjBRMjYxIDU3MyAyNzcgNTg0VDMwOCA2MDVUMzMyIDYxOVQzNDggNjI1UTM1NSA2MjMgMzc2IDYwNVQ0MTcgNTYyUTQzOSA1MzYgNDQ4IDUxN1Q0NTggNDgzUTQ1OCA0NjUgNDQ4IDQ1NVQ0MjMgNDQ0UTQwNyA0NDQgMzkzIDQ1OFQzNjEgNTA0UTM1NiA1MTQgMzUwIDUyNVQzMzYgNTUwUTMyNSA1MzcgMzE1IDUyNlQyOTMgNTAzUTI2OCA0NzUgMjQ3IDQ2MFQyMDggNDQ0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iXyIgZ2x5cGgtbmFtZT0idW5kZXJzY29yZSIgaG9yaXotYWR2LXg9IjUxMyIgZD0iTTEwIC04MlEtMzEgLTgyIC0zMSAtNTdRLTMxIC00OCAtMjcgLTM0VC0xNSAtMTFRLTkgLTUgLTIgLTNUMjEgMEgzODRRNDI1IDAgNDI1IC0yNlE0MjUgLTM0IDQyMSAtNDlUNDA5IC03MlE0MDMgLTc3IDM5NiAtNzlUMzczIC04MkgxMFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImAiIGdseXBoLW5hbWU9ImdyYXZlIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNNDA4IDU1NVE0MDUgNTUyIDM4OSA1NTNUMzUwIDU2MlQyOTkgNTgyVDI0NiA2MTNRMjA5IDY0MCAyMDkgNjcyUTIwOSA2OTAgMjIyIDcwMlQyNTQgNzE1UTI2NiA3MTUgMjc5IDcxMFQzMDMgNjk1UTMyNSA2NzggMzQ1IDY1NVQzODAgNjExVDQwMiA1NzRUNDA4IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImEiIGdseXBoLW5hbWU9ImEiIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik00OTUgLTlRNDQ4IC05IDQyOSAxN1Q0MTQgOTBRMzgzIDQwIDMzNiAxNFQyMzQgLTEyUTE5NSAtMTIgMTYxIDFUMTAxIDQwVDYxIDEwM1Q0NiAxODlRNDYgMjQ2IDY2IDMwMFQxMjEgMzk3VDIwNiA0NjZUMzE1IDQ5M1EzNzEgNDkzIDQxNCA0NjhUNDc4IDQwMFE0ODMgNDIzIDQ4NyA0MzhUNDkzIDQ2NFE0OTYgNDc1IDQ5NyA0ODFINTkzTDUxNSAxMTBRNTA3IDcyIDUxNSA1N1Q1NTQgMzhRNTU1IDM4IDU1NCAzMVQ1NDggMTVUNTMwIC0xVDQ5NSAtOVpNMjYxIDcwUTI5NCA3MCAzMjQgODJUMzc4IDExN1Q0MTggMTY4VDQ0MiAyMzFMNDU4IDMwNlE0NDMgMzU1IDQxMCAzODRUMzIxIDQxM1EyODAgNDEzIDI0NyAzOTRUMTkxIDM0NVQxNTYgMjc2VDE0NCAxOThRMTQ0IDEzNyAxNzggMTA0VDI2MSA3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImIiIGdseXBoLW5hbWU9ImIiIGhvcml6LWFkdi14PSI2MTciIGQ9Ik0zMTMgLTEyUTI1NCAtMTIgMjEwIDE1VDE0MyA4OFY4NVExMzIgMzYgMTE0IDE2VDY0IC00UTQ5IC00IDM4IDFUMjggOEwxNjkgNjkwSDI2OEwyMTEgNDA1UTI0MSA0NDcgMjgxIDQ3MFQzNzcgNDkzUTQxNSA0OTMgNDUwIDQ4MFQ1MTIgNDQwVDU1NSAzNzRUNTcxIDI4M1E1NzEgMjI3IDU1MyAxNzRUNTAwIDgwVDQxOSAxM1QzMTMgLTEyWk0zNTAgNDEyUTMwMSA0MTIgMjU5IDM4NVQxOTEgMzE0TDE3NCAyMzBRMTY4IDE5OCAxNzQgMTY5VDE5NyAxMThUMjQyIDgzVDMwNiA2OVEzNDYgNjkgMzc3IDg3VDQyOSAxMzRUNDYyIDIwMFQ0NzMgMjc1UTQ3MyAzMDcgNDYzIDMzMlQ0MzcgMzc1VDM5OCA0MDJUMzUwIDQxMloiICAvPgorPGdseXBoIHVuaWNvZGU9ImMiIGdseXBoLW5hbWU9ImMiIGhvcml6LWFkdi14PSI1NTAiIGQ9Ik0yNzcgLTEyUTIyNyAtMTIgMTg1IDNUMTExIDQ2VDYyIDExNlQ0NCAyMTBRNDQgMjY2IDY1IDMxN1QxMjMgNDA3VDIxMCA0NjlUMzE4IDQ5M1EzNzkgNDkzIDQyMCA0NzZUNDg3IDQzMlE1MDcgNDEyIDUxNiAzOTFUNTI2IDM1MlE1MjYgMzMxIDUxNiAzMjBUNDk0IDMwM1Q0NzEgMjk4VDQ2MCAzMDFRNDUxIDM0OSA0MTYgMzc5VDMyMSA0MTBRMjgwIDQxMCAyNDcgMzk0VDE5MCAzNTBUMTUzIDI4OFQxNDAgMjE3UTE0MCAxNTIgMTc5IDExMlQyODYgNzFRMzM1IDcxIDM2OCA5M1Q0MjUgMTUyUTQyNiAxNTMgNDM0IDE1MlQ0NTEgMTQ2VDQ2NyAxMzJUNDc1IDEwOVE0NzUgODIgNDQzIDUwUTQxNyAyNSAzNzUgN1QyNzcgLTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZCIgZ2x5cGgtbmFtZT0iZCIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTQ5NSAtOVE0NTAgLTkgNDMwIDE1VDQxMyA4M1EzODIgMzcgMzQxIDEzVDI0MyAtMTJRMjA0IC0xMiAxNjkgMVQxMDggNDJUNjUgMTA4VDQ5IDE5OFE0OSAyNTQgNjcgMzA3VDEyMCA0MDFUMjAxIDQ2OFQzMDcgNDkzUTM2NCA0OTMgNDA4IDQ2OVQ0NzcgNDAwTDUzOCA2OTBINjM1TDUxNSAxMTBRNTA2IDcyIDUxNCA1N1Q1NTQgMzhRNTU1IDM4IDU1NCAzMVQ1NDggMTVUNTMwIC0xVDQ5NSAtOVpNMjY5IDcwUTMwMCA3MCAzMjggODFUMzc4IDExM1Q0MTcgMTYxVDQ0MCAyMjNMNDU3IDMwM1E0MzkgMzU0IDQwOCAzODNUMzE1IDQxM1EyNzQgNDEzIDI0MyAzOTVUMTkwIDM0OFQxNTcgMjgxVDE0NiAyMDZRMTQ2IDE3NCAxNTYgMTQ5VDE4MyAxMDZUMjIyIDc5VDI2OSA3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImUiIGdseXBoLW5hbWU9ImUiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0yNjIgLTEyUTIwNyAtMTIgMTY2IDNUOTggNDVUNTYgMTA4VDQyIDE4OFE0MiAyNTQgNjUgMzA5VDEzMCA0MDZUMjI2IDQ3MFQzNDUgNDkzUTQzMiA0OTMgNDc5IDQ1N1Q1MjYgMzYwUTUyNiAzMjQgNTEzIDI5NVQ0NjcgMjQ2VDM4MiAyMTVUMjQ3IDIwNFEyMjEgMjA0IDE5MyAyMDVUMTMyIDIwOVYxOTFRMTMyIDEzNCAxNjUgOTlUMjY0IDY0UTMxNyA2NCAzNTQgODNUNDE4IDEzOVE0MTkgMTQwIDQyNiAxMzlUNDQxIDEzM1Q0NTYgMTIwVDQ2MyA5OFE0NjMgODMgNDU4IDczVDQzOSA0OFE0MDkgMTkgMzY2IDRUMjYyIC0xMlpNMzQxIDQxOVEzMDggNDE5IDI3OCA0MDhUMjI0IDM3OVQxODAgMzM0VDE0OCAyNzhRMTc0IDI3NSAxOTYgMjc0VDIzOCAyNzNRMjk2IDI3MyAzMzQgMjgwVDM5NSAyOThUNDI3IDMyNVQ0MzYgMzU3UTQzNiAzODEgNDEzIDQwMFQzNDEgNDE5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iZiIgZ2x5cGgtbmFtZT0iZiIgaG9yaXotYWR2LXg9IjM4NyIgZD0iTTE1NyA0MDBINThRNTggNDAzIDU5IDQwN1E2MCA0MTAgNjAgNDE0VDYzIDQyNlE2NSA0MzQgNjggNDQ4VDczIDQ3MVE3MyA0NzMgNzMgNDc1VDc0IDQ3OVE3NCA0ODEgNzUgNDgxSDE3NEwxODUgNTI4UTIwMyA2MTYgMjQ3IDY1NVQzNTYgNjk0UTQyMCA2OTQgNDQ4IDY2NFE0NjQgNjQ4IDQ2NCA2MjdRNDY0IDYxNiA0NjAgNjA3VDQ1MCA1OTJUNDM5IDU4M1Q0MzMgNTgxUTQyMyA1OTUgNDA0IDYwNFQzNjEgNjE0UTMzMCA2MTQgMzEwIDU5M1QyNzggNTIyTDI2OSA0ODFIMzk4UTM5NyA0NzggMzk2IDQ3NFEzOTUgNDcxIDM5NSA0NjdUMzkyIDQ1NkwzODMgNDEwUTM4MiA0MDcgMzgyIDQwNlQzODEgNDAyVjQwMEgyNTVMMTcxIDBINzJMMTU3IDQwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImciIGdseXBoLW5hbWU9ImciIGhvcml6LWFkdi14PSI2MTkiIGQ9Ik0yMzEgLTIwMFExNjMgLTIwMCAxMjAgLTE4MlQ1MCAtMTM4UTMyIC0xMjAgMjQgLTEwM1QxNiAtNzFRMTYgLTUyIDI0IC00MFQ0MyAtMjBUNjIgLTExVDcyIC0xMVE4OSAtNTkgMTI3IC04N1QyMzcgLTExNlEzMDEgLTExNiAzNDIgLTgxVDM5OCAyNkw0MTIgOTRRMzgwIDUyIDMzOSAzMFQyNDQgOFEyMDUgOCAxNzAgMjFUMTA4IDYxVDY1IDEyN1Q0OSAyMTZRNDkgMjY4IDY4IDMxN1QxMjMgNDA2VDIwNyA0NjlUMzE0IDQ5M1EzNjkgNDkzIDQxMiA0NjhUNDc4IDQwMUw0OTcgNDgxSDU5M0w0OTYgMjFRNDczIC04NiA0MDkgLTE0M1QyMzEgLTIwMFpNMjcwIDg4UTMwMCA4OCAzMjggOThUMzc5IDEyN1Q0MTggMTcxVDQ0MSAyMjhMNDU4IDMwOFE0NDQgMzU2IDQxMCAzODRUMzIxIDQxMlEyODIgNDEyIDI1MCAzOTZUMTk0IDM1MlQxNTkgMjkxVDE0NiAyMjJRMTQ2IDE5MCAxNTYgMTY2VDE4MyAxMjRUMjIyIDk3VDI3MCA4OFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImgiIGdseXBoLW5hbWU9ImgiIGhvcml6LWFkdi14PSI1OTEiIGQ9Ik0yMTAgNDAxUTIzNiA0NDQgMjc4IDQ2OFQzNzAgNDkzUTQwOCA0OTMgNDM4IDQ4MVQ0ODkgNDQ4VDUyMSAzOThUNTMyIDMzNFE1MzIgMzA4IDUyNCAyNzBUNTAzIDE4OVE0OTIgMTUyIDQ4NiAxMjRUNDc5IDgxUTQ3OSA2MSA0ODkgNTJUNTIwIDQxUTUyMSA0MSA1MjAgMzNUNTEzIDE2VDQ5NCAtMVQ0NTkgLTlRNDIwIC05IDQwMCAxMlQzODAgNjlRMzgwIDkwIDM4NyAxMjFUNDA1IDE5M1E0MTYgMjI5IDQyMiAyNjBUNDI5IDMwOVE0MjkgMzU1IDQwNSAzODFUMzMzIDQwN1EyODYgNDA3IDI1MyAzODRUMTkxIDMxMUwxMjUgMEgyNkwxNjAgNjQ3UTE2NSA2NzEgMTc2IDY4MlQyMTAgNjk0SDIyNFEyNzAgNjk0IDI1OCA2NDRMMjEwIDQwMVoiICAvPgorPGdseXBoIHVuaWNvZGU9ImkiIGdseXBoLW5hbWU9ImkiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik0xMzUgLTlRODAgLTkgNjIgMjNUNTUgMTExTDEzNCA0ODFIMjMyTDE1NCAxMTBRMTQ2IDcyIDE1NCA1NlQxOTcgMzhRMTk4IDM4IDE5NyAzMVQxOTAgMTVUMTcxIC0xVDEzNSAtOVpNMjE2IDU4NFExODcgNTg0IDE3MiA1OTZUMTU3IDYzMFExNTcgNjU2IDE3MyA2NzVUMjE5IDY5NFEyNDggNjk0IDI2MyA2ODJUMjc4IDY0OVEyNzggNjIyIDI2MiA2MDNUMjE2IDU4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImoiIGdseXBoLW5hbWU9ImoiIGhvcml6LWFkdi14PSIyNjgiIGQ9Ik0tMzAgLTIwMlEtNjQgLTIwMiAtODYgLTE5NFQtMTIxIC0xNzNRLTEzNyAtMTU3IC0xMzcgLTEzOFEtMTM3IC0xMjcgLTEzMyAtMTE4VC0xMjQgLTEwMlQtMTE0IC05MVQtMTA5IC04OFEtOTkgLTEwMiAtODEgLTExMVQtNDEgLTEyMVEtMTUgLTEyMSAxIC0xMDVUMjYgLTQ2TDEzOCA0ODFIMjM2TDEyMiAtNjBRMTA2IC0xMzUgNjggLTE2OFQtMzAgLTIwMlpNMjIwIDU4NFExOTEgNTg0IDE3NyA1OTZUMTYyIDYzMFExNjIgNjU2IDE3OCA2NzVUMjI0IDY5NFEyNTMgNjk0IDI2NyA2ODJUMjgyIDY0OVEyODIgNjIyIDI2NiA2MDNUMjIwIDU4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9ImsiIGdseXBoLW5hbWU9ImsiIGhvcml6LWFkdi14PSI1MDYiIGQ9Ik0zODAgLTlRMzYyIC05IDM0OSAtNVQzMjIgMTJUMjk0IDQ1VDI1OSAxMDFMMTc1IDIzOVExNzEgMjIwIDE2NyAyMDFRMTU5IDE2NiAxNTAgMTE5UTEzOSA2NiAxMjUgMEgyNkwxNjkgNjkwSDI2OEwxODMgMjc0TDQ0NCA0OTNRNDQ0IDQ5NCA0NTIgNDkyVDQ2OSA0ODVUNDg2IDQ2OVQ0OTQgNDQzUTQ5NCA0MTYgNDU2IDM4NkwyNzQgMjQxTDM0NSAxMzJRMzYwIDEwOCAzNzEgOTRUMzkyIDcyVDQxNSA2MVQ0NDQgNTdRNDQ1IDU3IDQ0NSA0N1Q0MzkgMjRUNDIwIDJUMzgwIC05WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibCIgZ2x5cGgtbmFtZT0ibCIgaG9yaXotYWR2LXg9IjI2NyIgZD0iTTEzNSAtOVE4MCAtOSA2MiAyM1Q1NSAxMTFMMTc2IDY5MEgyNzRMMTU0IDExMFExNDYgNzIgMTU0IDU2VDE5NyAzOFExOTggMzggMTk3IDMxVDE5MCAxNVQxNzEgLTFUMTM1IC05WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibSIgZ2x5cGgtbmFtZT0ibSIgaG9yaXotYWR2LXg9IjkwNSIgZD0iTTc3MyAtOVE3MzUgLTkgNzE1IDEyVDY5NSA2OVE2OTUgOTAgNzAyIDEyMVQ3MjAgMTkzUTczMCAyMjkgNzM2IDI2MFQ3NDMgMzA5UTc0MyAzNTUgNzE5IDM4MVQ2NTUgNDA3UTYxMSA0MDcgNTgwIDM4N1Q1MTkgMzIxTDQ1MiAwSDM1M0w0MTAgMjczUTQyMyAzMzMgNDAwIDM3MFQzMjggNDA3UTI4NCA0MDcgMjU0IDM4N1QxOTMgMzIwTDEyNSAwSDI2TDEyOCA0ODBRMTMwIDQ4NSAxNTMgNDg1UTE2NSA0ODUgMTc2IDQ4MlQxOTUgNDcwVDIwNyA0NDdUMjA4IDQxMFEyMzcgNDUxIDI3NyA0NzJUMzY0IDQ5M1E0MTkgNDkzIDQ1NyA0NjVUNTA5IDM4OVE1MzkgNDM1IDU4MyA0NjRUNjkwIDQ5M1E3MjUgNDkzIDc1NCA0ODFUODAzIDQ0OFQ4MzUgMzk3VDg0NiAzMzRRODQ2IDMwOCA4MzggMjcwVDgxOCAxODlRODA3IDE1MiA4MDEgMTI0VDc5NCA4MVE3OTQgNjEgODA0IDUyVDgzNSA0MVE4MzYgNDEgODM1IDMzVDgyNyAxNlQ4MDggLTFUNzczIC05WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ibiIgZ2x5cGgtbmFtZT0ibiIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTE1MyA0ODVRMTY1IDQ4NSAxNzYgNDgyVDE5NiA0NjlUMjA4IDQ0M1QyMDggNDAzUTIzNiA0NDUgMjc3IDQ2OVQzNjkgNDkzUTQwOCA0OTMgNDM4IDQ4MVQ0ODkgNDQ4VDUyMSAzOThUNTMyIDMzNFE1MzIgMzA4IDUyNCAyNzBUNTAzIDE4OVE0OTIgMTUyIDQ4NiAxMjRUNDc5IDgxUTQ3OSA2MSA0ODkgNTJUNTIwIDQxUTUyMSA0MSA1MjAgMzNUNTEzIDE2VDQ5NCAtMVQ0NTkgLTlRNDIwIC05IDQwMCAxMlQzODAgNjlRMzgwIDkwIDM4NyAxMjFUNDA1IDE5M1E0MTYgMjI5IDQyMiAyNjBUNDI5IDMwOVE0MjkgMzU1IDQwNSAzODFUMzMzIDQwN1EyODYgNDA3IDI1MyAzODRUMTkxIDMxMUwxMjUgMEgyNkwxMjggNDgwUTEzMCA0ODUgMTUzIDQ4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9Im8iIGdseXBoLW5hbWU9Im8iIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzEgLTEyUTIyMSAtMTIgMTgwIDRUMTA5IDUwVDYzIDEyMVQ0NiAyMTBRNDYgMjY2IDY1IDMxN1QxMjEgNDA3VDIwNyA0NjlUMzE4IDQ5M1EzNjcgNDkzIDQwOCA0NzdUNDgwIDQzMVQ1MjYgMzYwVDU0MyAyNzFRNTQzIDIxNSA1MjQgMTY0VDQ2OCA3NFQzODIgMTJUMjcxIC0xMlpNMjc1IDY3UTMxMyA2NyAzNDUgODNUNDAxIDEyN1Q0MzggMTkxVDQ1MiAyNjdRNDUyIDI5OSA0NDIgMzI2VDQxMyAzNzJUMzY5IDQwM1QzMTQgNDE0UTI3NiA0MTQgMjQ0IDM5OFQxODggMzU0VDE1MSAyOTBUMTM3IDIxNFExMzcgMTgyIDE0NyAxNTVUMTc2IDEwOVQyMjAgNzhUMjc1IDY3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icCIgZ2x5cGgtbmFtZT0icCIgaG9yaXotYWR2LXg9IjYxNyIgZD0iTTEyOCA0ODBRMTMwIDQ4NSAxNTMgNDg1UTE2NiA0ODUgMTc3IDQ4MVQxOTcgNDY4VDIwOCA0NDJUMjA3IDQwMFEyMzggNDQ1IDI3OSA0NjlUMzc3IDQ5M1E0MTUgNDkzIDQ1MCA0ODBUNTEyIDQ0MFQ1NTUgMzc0VDU3MSAyODNRNTcxIDIyNyA1NTMgMTc0VDUwMCA4MFQ0MTkgMTNUMzEzIC0xMlEyNTAgLTEyIDIwNyAxN1QxNDQgODlMODUgLTE5MEgtMTNMMTI4IDQ4MFpNMzUwIDQxMlEzMDEgNDEyIDI2MCAzODVUMTkyIDMxNEwxNzQgMjMwUTE2OCAxOTggMTc0IDE2OVQxOTcgMTE4VDI0MiA4M1QzMDYgNjlRMzQ2IDY5IDM3NyA4N1Q0MjkgMTM0VDQ2MiAyMDBUNDczIDI3NVE0NzMgMzA3IDQ2MyAzMzJUNDM3IDM3NVQzOTggNDAyVDM1MCA0MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJxIiBnbHlwaC1uYW1lPSJxIiBob3Jpei1hZHYteD0iNjE5IiBkPSJNNDA4IDc1UTM3NiAzMyAzMzcgMTFUMjQzIC0xMlEyMDQgLTEyIDE2OSAxVDEwOCA0MlQ2NSAxMDhUNDkgMTk4UTQ5IDI1NCA2NyAzMDdUMTIwIDQwMVQyMDEgNDY4VDMwNyA0OTNRMzY0IDQ5MyA0MDggNDY5VDQ3OCA0MDBRNDg5IDQ0NyA1MDYgNDY2VDU1NiA0ODVRNTcxIDQ4NSA1ODEgNDgwVDU5MiA0NzNMNDUxIC0xOTBIMzUyTDQwOCA3NVpNMjY5IDcwUTMwMCA3MCAzMjggODFUMzc4IDExM1Q0MTcgMTYxVDQ0MCAyMjNMNDU3IDMwM1E0MzkgMzU0IDQwOCAzODNUMzE1IDQxM1EyNzQgNDEzIDI0MyAzOTVUMTkwIDM0OFQxNTcgMjgxVDE0NiAyMDZRMTQ2IDE3NCAxNTYgMTQ5VDE4MyAxMDZUMjIyIDc5VDI2OSA3MFoiICAvPgorPGdseXBoIHVuaWNvZGU9InIiIGdseXBoLW5hbWU9InIiIGhvcml6LWFkdi14PSI0MDYiIGQ9Ik0xNTMgNDg1UTE2NSA0ODUgMTc2IDQ4MVQxOTYgNDY4VDIwOCA0NDJUMjA3IDQwMFEyMzEgNDQ1IDI2MyA0NjlUMzM5IDQ5M1EzNzEgNDkzIDM5MyA0NzlUNDE2IDQzOFE0MTYgNDIwIDQxMCA0MDdUMzk1IDM4N1QzODEgMzc2VDM3MyAzNzRRMzYzIDM4NSAzNDggMzkzVDMwOSA0MDFRMjgyIDQwMSAyNjAgMzg2VDIyMCAzNDRUMTg5IDI3OVQxNjYgMTk2TDEyNSAwSDI2TDEyOCA0ODBRMTMwIDQ4NSAxNTMgNDg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0icyIgZ2x5cGgtbmFtZT0icyIgaG9yaXotYWR2LXg9IjQ5MCIgZD0iTTIyOCAtMTJRMTY1IC0xMiAxMTcgNlQ0MiA1MVEzMSA2MiAyNCA3NVQxNyAxMDFRMTcgMTE0IDIzIDEyNFQzNiAxNDBUNTAgMTQ4VDU4IDE1MFE4MiAxMTQgMTI0IDg5VDIyNCA2M1EyNzIgNjMgMjk3IDgxVDMyMiAxMzBRMzIyIDE1NyAyOTYgMTcxVDIyNCAyMDJRMTk4IDIxMSAxNzMgMjIyVDEyNyAyNDlUOTQgMjg3VDgxIDM0M1E4MSAzNzYgOTQgNDAzVDEzMSA0NTFUMTkwIDQ4MlQyNjggNDkzUTMyNCA0OTMgMzY3IDQ3N1Q0MzUgNDM0UTQ2MCA0MTAgNDYwIDM4NFE0NjAgMzcwIDQ1NCAzNjBUNDM5IDM0NFQ0MjMgMzM2VDQxNSAzMzZRMzk1IDM3MSAzNTUgMzk0VDI2NyA0MThRMjIwIDQxOCAxOTcgMzk5VDE3NCAzNTNRMTc0IDMyNCAyMDIgMzA5VDI3OCAyNzVRMzA1IDI2NSAzMzAgMjU0VDM3NiAyMjhUNDA4IDE5MVQ0MjEgMTM4UTQyMSA3MCAzNzEgMjlUMjI4IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9InQiIGdseXBoLW5hbWU9InQiIGhvcml6LWFkdi14PSI0MDAiIGQ9Ik0yMTggLTEzUTE0MyAtMTMgMTA5IDMyVDkzIDE2NkwxNDIgNDAwSDY0UTY0IDQwMyA2NSA0MDdRNjYgNDEwIDY2IDQxNFQ2OSA0MjZRNzEgNDM0IDc0IDQ0OFQ3OSA0NzFRNzkgNDczIDc5IDQ3NVQ4MCA0NzlRODAgNDgxIDgxIDQ4MUgxNTlMMTY3IDUyMFExNzYgNTY1IDE5MyA1ODNUMjQzIDYwMlEyNTkgNjAyIDI3MCA1OTdUMjgwIDU5MEwyNTcgNDgxSDQwNlE0MDUgNDc4IDQwNCA0NzRRNDAzIDQ3MSA0MDMgNDY3VDQwMCA0NTZMMzkxIDQxMFEzOTAgNDA3IDM5MCA0MDZUMzg5IDQwMlY0MDBIMjM5TDE4OSAxNjhRMTc4IDExMyAxOTMgOTBUMjQ0IDY2UTI2NCA2NiAyODEgNzVUMzA3IDk0UTMwOSA5NiAzMTcgODZUMzI2IDU4UTMyNiAzNSAzMDcgMTZRMjk0IDMgMjcyIC01VDIxOCAtMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ1IiBnbHlwaC1uYW1lPSJ1IiBob3Jpei1hZHYteD0iNTkyIiBkPSJNNDYzIC05UTQxOCAtOSAzOTkgMTRUMzgxIDgwUTM1MyAzNiAzMTIgMTJUMjE5IC0xMlExNzIgLTEyIDEzOSA0VDg2IDQ5VDYxIDExOVQ2NiAyMDlMMTIzIDQ4MUgyMjJMMTY1IDIxMFExNTEgMTUwIDE3NCAxMTJUMjU0IDc0UTMwMiA3NCAzMzUgOThUMzk3IDE3MEw0NjMgNDgxSDU2MUw0ODMgMTEwUTQ3NSA3MiA0ODMgNTdUNTIyIDM4UTUyMyAzOCA1MjIgMzFUNTE2IDE1VDQ5OCAtMVQ0NjMgLTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ2IiBnbHlwaC1uYW1lPSJ2IiBob3Jpei1hZHYteD0iNTI1IiBkPSJNMTE1IDMyOFExMDcgMzg1IDkwIDQwNVQ0MCA0MjZRMzkgNDI2IDQwIDQzNVQ0NyA0NTZUNjYgNDc3VDEwNCA0ODdRMTQxIDQ4NyAxNjUgNDY0UTE4NCA0NDQgMTkzIDQxMVQyMDggMzI3TDIzMyAxMDNMNDU2IDQ4NlE0NTYgNDg3IDQ2NyA0ODdUNDkwIDQ4MlQ1MTMgNDY3VDUyNCA0MzhRNTI0IDQyNSA1MTkgNDEzVDUwMSAzODBMMjYzIDBIMTYxTDExNSAzMjhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ3IiBnbHlwaC1uYW1lPSJ3IiBob3Jpei1hZHYteD0iNzU4IiBkPSJNMTIzIDMzMFExMjIgMzg3IDEwNSA0MDZUNTUgNDI5UTUzIDQyOSA1NCA0MzhUNjEgNDU4VDgyIDQ3OFQxMjEgNDg3UTE1NiA0ODcgMTc4IDQ2NVEyMTMgNDMwIDIxMiAzMjhMMjA5IDEwNEwzNDYgMzgxUTM1OSA0MDcgMzc0IDQxNFQ0MTMgNDIyUTQ0MiA0MjIgNDU3IDQxMFQ0NzUgMzY4TDQ5NyAxMDNMNjc0IDQ4NlE2NzQgNDg2IDY4NCA0ODZUNzA3IDQ4MlQ3MjkgNDY4VDc0MiA0NDBRNzQ0IDQyOSA3NDAgNDE3VDcyNSAzODVMNTMwIDBINDMwTDM5NyAzMDZMMjM1IDBIMTI3TDEyMyAzMzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ4IiBnbHlwaC1uYW1lPSJ4IiBob3Jpei1hZHYteD0iNTIzIiBkPSJNNjEgLTEwUTYxIC0xMCA1MyAtOFQzNCAwVDE2IDE1VDcgNDBRNyA1NiAxNSA2OVQ0NCAxMDBMMTk1IDI0NEw3NCA0ODFIMTgxTDI2OSAyOTFMNDY0IDQ5MVE0NjUgNDkxIDQ3MyA0ODlUNDkyIDQ4MVQ1MTAgNDY2VDUxOCA0NDFRNTE4IDQyNSA1MTAgNDEyVDQ4MSAzODFMMzE3IDIyNEwzNTcgMTQ1UTM3MCAxMTkgMzgxIDEwM1Q0MDQgNzlUNDI5IDY4VDQ2MCA2NFE0NjEgNjQgNDYxIDUzVDQ1NSAzMFQ0MzUgNlQzOTYgLTVRMzc4IC01IDM2MiAwVDMzMSAxOVQzMDEgNTdUMjY5IDEyMEwyNDQgMTc3TDYxIC0xMFoiICAvPgorPGdseXBoIHVuaWNvZGU9InkiIGdseXBoLW5hbWU9InkiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik0zNyAtMjAzUS0yMSAtMjAzIC00NiAtMTc3US02MiAtMTYyIC02MiAtMTQwUS02MiAtMTMxIC01OCAtMTIzVC00OSAtMTA4VC00MCAtOTlULTM0IC05N1EtMjUgLTEwOCAtOCAtMTE0VDIxIC0xMjFRMzUgLTEyMSA0OSAtMTE2VDgwIC05NlQxMTcgLTU3VDE2NSA3TDE3OSAyOFExNDggMzQgMTQyIDc1TDExNCAzMjhRMTA4IDM4MSA5MCA0MDNUNDAgNDI2UTM5IDQyNiAzOSA0MzVUNDYgNDU2VDY3IDQ3N1QxMDggNDg3UTE1MCA0ODcgMTc0IDQ1MFQyMDcgMzI3TDIyNyA5OUw0NDcgNDgxSDU0NkwyNTEgLTIxUTE5NSAtMTE2IDE0NSAtMTU5VDM3IC0yMDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ6IiBnbHlwaC1uYW1lPSJ6IiBob3Jpei1hZHYteD0iNTE4IiBkPSJNMTAgMFExMSA3IDEzIDE2UTE1IDIzIDE2IDMyVDIwIDUwUTI0IDY4IDMwIDgxVDU3IDExM0wzNzQgNDAySDE0OFE5OCA0MDIgOTggNDM1UTk4IDQ0MiAxMDAgNDUwVDEwNiA0NjVUMTEyIDQ3NlQxMTYgNDgxSDUwMlE1MDAgNDczIDQ5OCA0NjVRNDk2IDQ1OCA0OTUgNDQ5VDQ5MSA0MzFRNDg3IDQxMyA0ODEgNDAwVDQ1NCAzNjlMMTM4IDc5SDM3NVE0MjUgNzkgNDI1IDQ2UTQyNSAzOCA0MjMgMzBUNDE3IDE2VDQxMSA1VDQwNyAwSDEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ieyIgZ2x5cGgtbmFtZT0iYnJhY2VsZWZ0IiBob3Jpei1hZHYteD0iNDY3IiBkPSJNMjk3IC0yMDBRMjQ0IC0yMDAgMTk5IC0xNTVRMTU2IC0xMTEgMTM4IC00MVQxMjkgMTE3TDgwIDE1M1E1NCAxNzIgNDYgMTgzVDM4IDIxM1EzOCAyMzAgNDMgMjUxVDYzIDI4N1E3MCAyOTQgNzkgMjk5VDExNCAzMTNMMTc1IDMzN1ExOTUgNDI1IDIyNiA0ODBUMjk1IDU3NFEzMzggNjE4IDM4MCA2MzVUNDYxIDY1MlE0ODQgNjUyIDQ5NyA2NDFUNTExIDYxMFE1MTEgNTk2IDUwMyA1ODVUNDkzIDU3M1E0NTYgNTcxIDQxOSA1NTVUMzU2IDUxMVEzMTkgNDc1IDI5OCA0MjFUMjU4IDI4NUwxMjggMjMxTDIzMSAxNTdRMjAzIC0yMiAyNzAgLTg5UTI4MyAtMTAxIDI5OSAtMTEwVDM0MSAtMTI1UTM0MyAtMTI2IDM0NiAtMTMzVDM0OSAtMTUxUTM0OSAtMTc0IDMzNiAtMTg3VDI5NyAtMjAwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0ifCIgZ2x5cGgtbmFtZT0iYmFyIiBob3Jpei1hZHYteD0iMjkwIiBkPSJNNDcgLTE5OFEyNyAtMTk4IDE4IC0xODVUMTMgLTE0N0wxNzMgNjA2UTE3OCA2MzAgMTg5IDY0MVQyMjQgNjUzSDIzNlEyNTYgNjUzIDI2NiA2NDBUMjcxIDYwM0wxMTEgLTE1MFExMDYgLTE3NSA5NCAtMTg2VDU5IC0xOThINDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ9IiBnbHlwaC1uYW1lPSJicmFjZXJpZ2h0IiBob3Jpei1hZHYteD0iNDY3IiBkPSJNLTEgLTIwMFEtMjQgLTIwMCAtMzcgLTE4OVQtNTAgLTE1OFEtNTAgLTE0MyAtNDMgLTEzMlQtMzMgLTEyMVE1IC0xMTkgNDEgLTEwMlQxMDUgLTU5UTE0MSAtMjIgMTYyIDMyVDIwMyAxNjdMMzMzIDIyMUwyMjkgMjk2UTI1NyA0NzQgMTkwIDU0MVExNjcgNTY1IDEyMCA1NzhRMTE4IDU3OSAxMTUgNTg1VDExMSA2MDNRMTExIDYyNiAxMjQgNjM5VDE2NCA2NTJRMjE2IDY1MiAyNjEgNjA3UTMwNSA1NjQgMzIyIDQ5NFQzMzEgMzM1TDM4MCAzMDBRNDA3IDI4MSA0MTQgMjcwVDQyMiAyMzlRNDIyIDIyMiA0MTcgMjAxVDM5OCAxNjVRMzkxIDE1OCAzODIgMTUzVDM0NyAxMzlMMjg2IDExNlEyNjUgMjggMjM0IC0yOFQxNjUgLTEyMlExMjIgLTE2NSA4MCAtMTgyVC0xIC0yMDBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSJ+IiBnbHlwaC1uYW1lPSJhc2NpaXRpbGRlIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzMzIDE1OVEzMDYgMTU5IDI3MCAxNzhUMTk4IDIzNFExODYgMjA4IDE3MSAxODdUMTM5IDE2NVExMjMgMTY1IDExNSAxNzRUMTA3IDE5NFExMDcgMjEzIDExNSAyMzFUMTM1IDI2NFQxNjQgMjg3VDE5NyAyOTZRMjI0IDI5NiAyNjAgMjc3VDMzMiAyMjFRMzQ0IDI0NyAzNTkgMjY4VDM5MSAyOTBRNDA3IDI5MCA0MTUgMjgxVDQyMyAyNjFRNDIzIDI0MSA0MTUgMjIzVDM5NSAxOTFUMzY2IDE2OFQzMzMgMTU5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTA7IiBnbHlwaC1uYW1lPSJ1bmkwMEEwIiBob3Jpei1hZHYteD0iMTcwIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEExOyIgZ2x5cGgtbmFtZT0iZXhjbGFtZG93biIgaG9yaXotYWR2LXg9IjI5NCIgZD0iTTE4OCA0NjBRMjA3IDQ2MCAyMTMgNDUyVDIxOCA0MjJMMTYyIC0ySDMyTDE1OSA0MzFRMTY0IDQ0NiAxNzAgNDUzVDE4OCA0NjBaTTIyOSA2NTRRMjg2IDY1NCAyODYgNjEyUTI4NiA1OTMgMjgyIDU3N1QyNjYgNTQ5UTI1OCA1NDEgMjQ3IDUzN1QyMTcgNTMzUTE2MCA1MzMgMTYwIDU3NVExNjAgNTk0IDE2NSA2MTBUMTgxIDYzOFExODkgNjQ2IDE5OSA2NTBUMjI5IDY1NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEEyOyIgZ2x5cGgtbmFtZT0iY2VudCIgaG9yaXotYWR2LXg9IjU3NCIgZD0iTTI0NCAtOTlRMjI3IC05OSAyMTQgLTkwVDIwNiAtNTJMMjI0IDM3UTE1NCA1NyAxMTEgMTExVDY3IDI1MVE2NyAzMDYgODcgMzU2VDE0MiA0NDVUMjI1IDUwOFQzMzAgNTM2TDM0NyA2MTJRMzUyIDYzOSAzNjIgNjQ5VDM4OSA2NjBIMzk0UTQxMSA2NjAgNDI0IDY1MFQ0MzMgNjEyTDQxNSA1MjlRNDQ5IDUyMSA0NzQgNTA3VDUxNyA0NzVRNTM3IDQ1NSA1NDYgNDM0VDU1NiAzOTNRNTU2IDM3MiA1NDUgMzYxVDUyMSAzNDZUNDk3IDM0MVQ0ODYgMzQ1UTQ3OCAzODIgNDU1IDQwOFQzOTQgNDQ2TDMyMiAxMTBRMzY3IDExMyAzOTggMTM0VDQ1MCAxOTFRNDUxIDE5MiA0NTkgMTkxVDQ3NyAxODRUNDk1IDE3MFQ1MDMgMTQ2UTUwMyAxMzQgNDk2IDEyMFQ0NzIgODlRNDQ4IDY0IDQwNiA0NlQzMDggMjdMMjkyIC01MlEyODYgLTc4IDI3NiAtODhUMjUwIC05OUgyNDRaTTE2MyAyNThRMTYzIDIxMCAxODUgMTc0VDI0NyAxMjFMMzE3IDQ1MFEyODIgNDQ0IDI1NCA0MjZUMjA1IDM4MlQxNzQgMzIzVDE2MyAyNThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBMzsiIGdseXBoLW5hbWU9InN0ZXJsaW5nIiBob3Jpei1hZHYteD0iNTk1IiBkPSJNNTEgMFE5IDAgOSAyN1E5IDM2IDEzIDUxVDI2IDc1UTM2IDg2IDYxIDg2SDEwNEwxNTQgMjU3SDkwUTU0IDI1NyA1NCAyODFRNTQgMjkwIDU4IDMwNFQ3MCAzMjZRNzYgMzMyIDgzIDMzNFQxMDUgMzM3SDE3N0wyMDcgNDQwUTIyNCA0OTkgMjQ1IDU0MFQyOTMgNjA4VDM1NCA2NDdUNDMxIDY2MFE0NzcgNjYwIDUxMCA2NDdUNTY0IDYxMlE1ODEgNTk2IDU4OCA1NzhUNTk2IDU0NFE1OTYgNTIzIDU4NyA1MTJUNTY3IDQ5NFQ1NDYgNDg3VDUzNiA0ODhRNTI1IDUzMyA0OTggNTU0VDQyOCA1NzZRNDA1IDU3NiAzODcgNTY5VDM1MiA1NDNUMzIzIDQ5NlQyOTYgNDIyTDI3MSAzMzdINDE5UTQ1OCAzMzcgNDU4IDMxMVE0NTggMzAzIDQ1NSAyODlUNDQzIDI2N1E0MzcgMjYyIDQzMCAyNjBUNDA4IDI1N0gyNDdMMTk4IDg2SDQ4NFE1MTMgODYgNTI1IDc3VDUzNyA1MFE1MzcgMzMgNTI5IDE3VDUxOCAwSDUxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTQ7IiBnbHlwaC1uYW1lPSJjdXJyZW5jeSIgaG9yaXotYWR2LXg9IjY2MiIgZD0iTTExNyAzNjdRODAgMzY3IDgwIDM5MFE4MCAzOTkgODMgNDEwVDkzIDQyOFExMDMgNDM4IDEyNSA0MzhIMTg1UTIwMCA0NzcgMjIwIDUxMlQyNjggNTc1UTMxMSA2MTggMzYwIDYzOVQ0NzMgNjYwUTUyNyA2NjAgNTY2IDY0NFQ2MzIgNjAxUTY0OSA1ODQgNjU3IDU2M1Q2NjYgNTIyUTY2NiA1MDIgNjU3IDQ5MFQ2MzcgNDcyVDYxNyA0NjVUNjA2IDQ2NVE1ODkgNTIyIDU1MyA1NDhUNDYzIDU3NFE0MjQgNTc0IDM5NCA1NjFUMzM4IDUyMlEzMjEgNTA1IDMwOSA0ODRUMjg1IDQzOEg0NzRRNTExIDQzOCA1MTEgNDE2UTUxMSA0MDYgNTA4IDM5NVQ0OTcgMzc3UTQ4NyAzNjcgNDY2IDM2N0gyNjBRMjU0IDM0NCAyNTAgMzIzVDI0NCAyODRINDQxUTQ3OCAyODQgNDc4IDI2MVE0NzggMjUxIDQ3NCAyNDBUNDY0IDIyMlE0NTQgMjEyIDQzMyAyMTJIMjQyUTI1MCAxNTIgMjg2IDExM1QzODggNzNRNDM2IDczIDQ3MiA5NFQ1NDIgMTYxUTU0MyAxNjIgNTUwIDE2MFQ1NjUgMTUxVDU3OSAxMzZUNTg2IDExNFE1ODYgODUgNTU0IDUzUTUyNiAyNiA0ODEgN1QzODQgLTEyUTI3MiAtMTIgMjEwIDQ5VDE0MiAyMTJIODNRNDcgMjEyIDQ3IDIzNVE0NyAyNDQgNTAgMjU1VDYwIDI3NFE3MiAyODQgOTIgMjg0SDE0NVExNDggMzAzIDE1MiAzMjNUMTYyIDM2N0gxMTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBNTsiIGdseXBoLW5hbWU9InllbiIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTEyMCAyNTVRODIgMjU1IDgyIDI3OVE4MiAyODkgODUgMzAwVDk2IDMxOVExMDYgMzI5IDEyOSAzMjlIMjUzTDEyOSA2MTZRMTI4IDYxOSAxMzIgNjI0VDE0NCA2MzZUMTYzIDY0NlQxODggNjUxUTIwNCA2NTEgMjE3IDY0MlQyMzkgNjA5TDMzMyAzNjBMNTYzIDY1NVE1NjMgNjU1IDU3MyA2NTRUNTk0IDY0OFQ2MTUgNjMyVDYyNSA2MDRRNjI1IDU5MSA2MTggNTc2VDU5MCA1MzhMNDA5IDMyOUg1MjVRNTYzIDMyOSA1NjMgMzA2UTU2MyAyOTYgNTYwIDI4NFQ1NDkgMjY1UTUzOSAyNTUgNTE2IDI1NUgzNjFMMzQ2IDE4N0g0OTVRNTMzIDE4NyA1MzMgMTYzUTUzMyAxNTMgNTMwIDE0MlQ1MTkgMTIzUTUwOSAxMTMgNDg2IDExM0gzMzFMMzE2IDQzUTMxMSAxNyAyOTggN1QyNjMgLTRIMjU5UTIzOCAtNCAyMjkgN1QyMjQgNDRMMjM4IDExM0g5MFE1MiAxMTMgNTIgMTM2UTUyIDE0NiA1NSAxNThUNjYgMTc3UTc2IDE4NyA5OSAxODdIMjU0TDI2OCAyNTVIMTIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTY7IiBnbHlwaC1uYW1lPSJicm9rZW5iYXIiIGhvcml6LWFkdi14PSIyOTAiIGQ9Ik0xNDMgMjU2UTEyMyAyNTYgMTE0IDI2OVQxMDkgMzA3TDE3MyA2MDZRMTc4IDYzMCAxODkgNjQxVDIyNCA2NTNIMjM2UTI1NiA2NTMgMjY2IDY0MFQyNzEgNjAzTDIwNyAzMDRRMjAyIDI3OSAxOTAgMjY4VDE1NSAyNTZIMTQzWk00NyAtMTk4UTI3IC0xOTggMTggLTE4NVQxMyAtMTQ3TDc3IDE1MlE4MiAxNzYgOTMgMTg3VDEyOCAxOTlIMTQwUTE2MCAxOTkgMTcwIDE4NlQxNzUgMTQ5TDExMSAtMTUwUTEwNiAtMTc1IDk0IC0xODZUNTkgLTE5OEg0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEE3OyIgZ2x5cGgtbmFtZT0ic2VjdGlvbiIgaG9yaXotYWR2LXg9IjU3NiIgZD0iTTIyNiAtMTY4UTE0OCAtMTY4IDk4IC0xNTBUMjEgLTEwNFE1IC04OCAtMSAtNzNULTggLTQ0US04IC0yOSAtMSAtMThUMTUgMFQzMSAxMFQ0MCAxMlE2MiAtMzEgMTEwIC02MFQyMzMgLTkwUTI5MyAtOTAgMzIzIC02OFQzNTQgLThRMzU0IDkgMzQ0IDIxVDMxNyA0NFQyNzYgNjNUMjI3IDgyUTE5NyA5MiAxNjYgMTA0VDExMCAxMzRUNzAgMTc1VDU0IDIzM1E1NCAyNjQgNjQgMjg4VDkzIDMzMlQxMzUgMzY0VDE4OCAzODRRMTYyIDQwMSAxNDYgNDI2VDEyOSA0ODlRMTI5IDUyNiAxNDQgNTU3VDE4OCA2MTFUMjU4IDY0NlQzNDkgNjU5UTQyMSA2NTkgNDY1IDY0MVQ1MzQgNTk5UTU0OCA1ODUgNTU1IDU3MFQ1NjIgNTQ0UTU2MiA1MjkgNTU1IDUxOFQ1MzggNTAwVDUyMCA0OTFUNTExIDQ5MFE0ODggNTMxIDQ0NyA1NTZUMzQ2IDU4MVEyODkgNTgxIDI1OSA1NjBUMjI4IDUwNFEyMjggNDg2IDIzOCA0NzNUMjY1IDQ0OFQzMDYgNDI4VDM1NyA0MDhRMzg3IDM5NyA0MTcgMzg1VDQ3MSAzNTZUNTEwIDMxNlQ1MjUgMjYxUTUyNSAyMjkgNTE1IDIwNFQ0ODYgMTYwVDQ0NCAxMjlUMzkyIDEwOVE0MTkgOTMgNDM2IDY5VDQ1NCA2UTQ1NCAtMzIgNDM5IC02M1QzOTUgLTExOFQzMjQgLTE1NVQyMjYgLTE2OFpNMzE4IDE0M1EzNDEgMTQ0IDM2MSAxNTFUMzk4IDE3MVQ0MjMgMjAxVDQzMiAyMzhRNDMyIDI1OCA0MjIgMjcyVDM5NCAyOTZUMzUzIDMxNlQzMDIgMzM0UTI5MSAzMzggMjgwIDM0MVQyNTcgMzUwUTIxMSAzNDMgMTc5IDMxOVQxNDcgMjU3UTE0NyAyMzYgMTU3IDIyMVQxODYgMTk1VDIyOCAxNzRUMjgxIDE1NUwzMTggMTQzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QTg7IiBnbHlwaC1uYW1lPSJkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTQzNCA1NDZRNDA1IDU0NiAzOTAgNTU4VDM3NSA1OTRRMzc1IDYyMyAzOTIgNjQzVDQzOCA2NjNRNDY3IDY2MyA0ODIgNjUxVDQ5NyA2MTVRNDk3IDU4NiA0ODAgNTY2VDQzNCA1NDZaTTI1MSA1NDZRMjIyIDU0NiAyMDcgNTU4VDE5MiA1OTRRMTkyIDYyMyAyMDkgNjQzVDI1NSA2NjNRMjg0IDY2MyAyOTggNjUxVDMxMyA2MTVRMzEzIDU4NiAyOTcgNTY2VDI1MSA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBOTsiIGdseXBoLW5hbWU9ImNvcHlyaWdodCIgaG9yaXotYWR2LXg9Ijc4OCIgZD0iTTQxMSAtMTNRMzM4IC0xMyAyNzggMTJUMTc0IDgxVDEwNiAxODdUODEgMzIyUTgxIDM5NSAxMDYgNDU3VDE3NSA1NjRUMjc5IDYzNFQ0MTIgNjYwUTQ4NSA2NjAgNTQ1IDYzNVQ2NDkgNTY2VDcxNyA0NjBUNzQyIDMyNVE3NDIgMjUyIDcxNyAxOTBUNjQ4IDgzVDU0NCAxM1Q0MTEgLTEzWk00MTMgNDFRNDczIDQxIDUyMyA2MVQ2MDggMTE5VDY2NCAyMDhUNjg0IDMyM1E2ODQgMzg0IDY2NCA0MzZUNjA3IDUyNVQ1MjAgNTg0VDQxMCA2MDZRMzUwIDYwNiAzMDAgNTg2VDIxNSA1MjhUMTU5IDQzOVQxMzkgMzI0UTEzOSAyNjMgMTU5IDIxMVQyMTYgMTIyVDMwMyA2M1Q0MTMgNDFaTTQyMCAxNDJRMzgxIDE0MiAzNDggMTU1VDI5MSAxOTJUMjU0IDI0OVQyNDEgMzIyUTI0MSAzNjEgMjU1IDM5NFQyOTMgNDUxVDM0OSA0ODhUNDIwIDUwMlE0NjIgNTAyIDQ5MSA0ODlUNTM1IDQ2MVE1NTMgNDQxIDU1MyA0MjFRNTUzIDQxMSA1NDcgNDAzVDUzNCAzOTBUNTIwIDM4M1Q1MTMgMzgzUTQ4MyA0MzMgNDIwIDQzM1EzOTkgNDMzIDM4MSA0MjVUMzQ4IDQwMlQzMjYgMzY3VDMxNyAzMjNRMzE3IDI5OSAzMjUgMjc5VDM0OCAyNDNUMzgxIDIyMFQ0MjMgMjEyUTQ1NyAyMTIgNDgwIDIyNlQ1MTYgMjY2UTUxNyAyNjcgNTIzIDI2NlQ1MzcgMjU5VDU1MSAyNDZUNTU3IDIyN1E1NTcgMjA2IDUzNSAxODNRNTIwIDE2OCA0OTEgMTU1VDQyMCAxNDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQTsiIGdseXBoLW5hbWU9Im9yZGZlbWluaW5lIiBob3Jpei1hZHYteD0iNTM1IiBkPSJNNDM5IDI1N1E0MDIgMjU3IDM4NiAyNzhUMzcxIDMzNFEzNDcgMjk2IDMxMCAyNzVUMjI5IDI1NFExOTcgMjU0IDE3MCAyNjVUMTIzIDI5NlQ5MSAzNDdUNzkgNDE2UTc5IDQ2MSA5NSA1MDVUMTM5IDU4M1QyMDcgNjM5VDI5NCA2NjBRMzM4IDY2MCAzNzIgNjQxVDQyMyA1ODZRNDMxIDYyMyA0NDcgNjM4VDQ5MCA2NTRRNTAzIDY1NCA1MTIgNjUwVDUyMSA2NDNMNDYwIDM1NFE0NTMgMzI0IDQ1OSAzMTFUNDkwIDI5NVE0OTEgMjk1IDQ5MCAyODlUNDg0IDI3NlQ0NjkgMjYzVDQzOSAyNTdaTTI1NSAzMjZRMjgwIDMyNiAzMDMgMzM2VDM0NCAzNjJUMzc1IDQwMVQzOTQgNDUwTDQwNiA1MDlRMzk0IDU0NyAzNjkgNTY5VDMwMSA1OTFRMjY5IDU5MSAyNDQgNTc3VDIwMSA1MzhUMTc0IDQ4NVQxNjQgNDI1UTE2NCAzNzggMTkwIDM1MlQyNTUgMzI2Wk0yMDQgLTdRMTUzIC03IDE1MyAzMVExNTMgNDggMTU3IDYyVDE3MSA4N1ExNzkgOTUgMTg4IDk4VDIxNSAxMDJRMjY2IDEwMiAyNjYgNjRRMjY2IDQ3IDI2MiAzM1QyNDcgN1EyMzkgMCAyMzAgLTNUMjA0IC03WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RsZWZ0IiBob3Jpei1hZHYteD0iNTUzIiBkPSJNMjI2IDc5UTIwMyA3OSAxNzggOTlUMTI2IDE1MVExMTIgMTY4IDEwMSAxODVUODAgMjE3VDY2IDI0MlQ2MSAyNTZRNjEgMjU5IDY4IDI2N1Q4NyAyODlUMTE1IDMxN1QxNTIgMzQ4UTE4NCAzNzQgMjE0IDM5MlQyNjYgNDEwUTI4MyA0MTAgMjkxIDQwMVQzMDAgMzc3UTMwMCAzNTggMjc2IDMzNFQyMTMgMjg3UTE5NyAyNzcgMTc5IDI2NlQxNDEgMjQ0UTE3MiAyMjIgMjAyIDE5M1EyMzQgMTY0IDI0OCAxNDdUMjY0IDExM1EyNjUgOTkgMjU0IDg5VDIyNiA3OVpNNDE3IDgwUTM5NCA4MCAzNzEgOTlUMzI2IDE0OFEzMTQgMTYzIDMwNCAxNzlUMjg3IDIwOVQyNzUgMjMzVDI3MSAyNDZRMjcxIDI0OSAyNzkgMjU4VDMwMiAyODJUMzM0IDMxMlQzNzIgMzQ0UTQwNSAzNzEgNDM3IDM5MVQ0OTMgNDExUTUxMCA0MTEgNTE5IDQwMlQ1MjggMzc4UTUyOCAzNTggNDk5IDMzMVQ0MjcgMjc4UTQxMCAyNjcgMzkxIDI1NlQzNTEgMjM0UTM4MyAyMTEgNDA1IDE5MFE0MzIgMTY0IDQ0NSAxNDhUNDU4IDExNlE0NTggMTAxIDQ0NyA5MVQ0MTcgODBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBQzsiIGdseXBoLW5hbWU9ImxvZ2ljYWxub3QiIGhvcml6LWFkdi14PSI2MDAiIGQ9Ik00OSAzODBINTQzVjk2SDQ1M1YyOTdINDlWMzgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QUQ7IiBnbHlwaC1uYW1lPSJ1bmkwMEFEIiBob3Jpei1hZHYteD0iNDI3IiBkPSJNNDggMTk4UTQ5IDIwMiA1MCAyMDhRNTEgMjE3IDU2IDIzNkw1OSAyNTBRNjEgMjU4IDYyIDI2NVQ2NSAyNzhRNjYgMjg0IDY3IDI4OUgzNzhRMzc3IDI4NCAzNzYgMjc4UTM3NSAyNzMgMzc0IDI2NlQzNzAgMjUwTDM2NyAyMzZRMzYyIDIxNyAzNjEgMjA4UTM2MCAyMDIgMzU5IDE5OEg0OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEFFOyIgZ2x5cGgtbmFtZT0icmVnaXN0ZXJlZCIgaG9yaXotYWR2LXg9Ijc4OCIgZD0iTTQxMSAtMTNRMzM4IC0xMyAyNzggMTJUMTc0IDgxVDEwNiAxODdUODEgMzIyUTgxIDM5NSAxMDYgNDU3VDE3NSA1NjRUMjc5IDYzNFQ0MTIgNjYwUTQ4NSA2NjAgNTQ1IDYzNVQ2NDkgNTY2VDcxNyA0NjBUNzQyIDMyNVE3NDIgMjUyIDcxNyAxOTBUNjQ4IDgzVDU0NCAxM1Q0MTEgLTEzWk00MTMgNDFRNDczIDQxIDUyMyA2MVQ2MDggMTE5VDY2NCAyMDhUNjg0IDMyM1E2ODQgMzg0IDY2NCA0MzZUNjA3IDUyNVQ1MjAgNTg0VDQxMCA2MDZRMzUwIDYwNiAzMDAgNTg2VDIxNSA1MjhUMTU5IDQzOVQxMzkgMzI0UTEzOSAyNjMgMTU5IDIxMVQyMTYgMTIyVDMwMyA2M1Q0MTMgNDFaTTU2NCAzODlRNTY0IDM0MSA1MzYgMzE2VDQ3MCAyODVMNTU5IDE3N1E1NjAgMTc1IDU1OCAxNzFUNTQ5IDE2MVQ1MzUgMTUyVDUxNyAxNDhRNTA2IDE0OCA0OTMgMTU0VDQ2OSAxNzZMMzkzIDI3NkgzNTRWMTg0UTM1NCAxNDkgMzIxIDE0OUgzMTFRMjk1IDE0OSAyODcgMTYwVDI3OSAxOTFWNDU3UTI3OSA0NzcgMjg5IDQ4OFQzMTggNDk5SDQyNFE0OTMgNDk5IDUyOCA0NzJUNTY0IDM4OVpNNDIzIDMzNFE0NTUgMzM0IDQ3MiAzNDhUNDg5IDM4NlE0ODkgNDM4IDQyMCA0MzhIMzUyVjMzNEg0MjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hBRjsiIGdseXBoLW5hbWU9InVuaTAwQUYiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yMjcgNTYyUTE4NyA1NjIgMTg3IDU4OFExODcgNTk3IDE5MCA2MTFUMjAyIDYzNFEyMTIgNjQ0IDIzOCA2NDRINDYyUTUwMyA2NDQgNTAzIDYxOFE1MDMgNjEwIDQ5OSA1OTZUNDg3IDU3M1E0NzcgNTYyIDQ1MSA1NjJIMjI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjA7IiBnbHlwaC1uYW1lPSJkZWdyZWUiIGhvcml6LWFkdi14PSI0MjEiIGQ9Ik0yMzggMzQ1UTE3NyAzNDUgMTM3IDM4MVQ5NiA0ODBROTYgNTE2IDEwOSA1NDlUMTQ1IDYwN1QyMDEgNjQ2VDI3MyA2NjFRMzAzIDY2MSAzMjkgNjUyVDM3NCA2MjRUNDA0IDU4MVQ0MTUgNTI1UTQxNSA0ODkgNDAyIDQ1N1QzNjYgMzk5VDMxMCAzNjBUMjM4IDM0NVpNMjQ3IDQwN1EyNjggNDA3IDI4NSA0MTZUMzE2IDQ0MlQzMzYgNDc4VDM0NCA1MjFRMzQ0IDU1NCAzMjIgNTc2VDI2NCA1OTlRMjQzIDU5OSAyMjYgNTkwVDE5NSA1NjRUMTc1IDUyOFQxNjcgNDg1UTE2NyA0NTIgMTg5IDQzMFQyNDcgNDA3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QjE7IiBnbHlwaC1uYW1lPSJwbHVzbWludXMiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik0xODEgMzk1UTE0MSAzOTUgMTQxIDQyMVExNDEgNDMwIDE0NSA0NDNUMTU2IDQ2NFExNjcgNDc1IDE5MCA0NzVIMzI1TDM1MiA2MDRRMzU3IDYyNyAzNjcgNjM2VDM5MiA2NDZINDAyUTQxOSA2NDYgNDI5IDYzNlQ0MzUgNjAyTDQwOCA0NzVINTM1UTU3NCA0NzUgNTc0IDQ0OVE1NzQgNDQwIDU3MSA0MjdUNTU5IDQwNlE1NDggMzk1IDUyNSAzOTVIMzkxTDM2NSAyNzFRMzYwIDI0OCAzNDkgMjM5VDMyNCAyMjlIMzE0UTI5NyAyMjkgMjg3IDIzOVQyODIgMjczTDMwOCAzOTVIMTgxWk0xMTAgOTVRNjkgOTUgNjkgMTIxUTY5IDEzMSA3MyAxNDVUODUgMTY2UTk2IDE3NyAxMjAgMTc3SDQ3N1E1MTggMTc3IDUxOCAxNTFRNTE4IDE0MSA1MTQgMTI3VDUwMiAxMDZRNDkxIDk1IDQ2NyA5NUgxMTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCMjsiIGdseXBoLW5hbWU9InR3b3N1cGVyaW9yIiBob3Jpei1hZHYteD0iMzcwIiBkPSJNMTIxIDM4M1ExMDcgMzY5IDEwMyAzNDlIMjY5UTMxMCAzNDkgMzEwIDMyMlEzMTAgMzA5IDMwMyAyOTdUMjk1IDI4NUg2M1E0NiAyODUgMzkgMjk4VDMzIDMzMlEzOSAzODYgNzIgNDIxUTkyIDQ0MiAxMTggNDU0VDE3MyA0NzZRMTk1IDQ4MyAyMTMgNDkwVDI0MyA1MDRUMjYyIDUyMlQyNjkgNTQ2UTI2OSA1NjYgMjUyIDU3OFQyMDYgNTkwUTE3NCA1OTAgMTU1IDU3M1QxMjUgNTMxUTEyNSA1MzEgMTE4IDUzMVQxMDIgNTM0VDg2IDU0NVQ3OSA1NjhRNzkgNTgwIDg1IDU5M1QxMDMgNjE3UTEyMCA2MzQgMTQ5IDY0NFQyMTYgNjU1UTI3NiA2NTUgMzExIDYyN1QzNDYgNTUxUTM0NiA1MjIgMzM2IDUwM1QzMDkgNDY5VDI2OSA0NDZUMjE4IDQyOFExODUgNDE3IDE2MSA0MDhUMTIxIDM4M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEIzOyIgZ2x5cGgtbmFtZT0idGhyZWVzdXBlcmlvciIgaG9yaXotYWR2LXg9IjM3MCIgZD0iTTMxNSAzOTVRMzE1IDM3NCAzMDcgMzUzVDI4MSAzMTZUMjM0IDI4OVQxNjMgMjc4UTEyMSAyNzggOTIgMjg4VDQ4IDMxNFEzNSAzMjYgMzEgMzM3VDI2IDM2MFEyNiAzNzcgMzMgMzg2VDUwIDQwMFQ2OCA0MDVUNzYgNDA0UTgxIDM3NCAxMDMgMzU3VDE2MyAzNDBRMjAxIDM0MCAyMTkgMzU3VDIzOCA0MDBRMjM4IDQyMCAyMjQgNDMyVDE4MSA0NDRIMTYzUTEzNCA0NDQgMTM0IDQ2NlExMzQgNDcyIDEzNiA0ODBUMTQ0IDQ5NFExNDkgNTAwIDE1NiA1MDFUMTc4IDUwM0gyMDBRMjM5IDUwMyAyNTIgNTE3VDI2NiA1NTBRMjY2IDU2OSAyNDkgNTgxVDIwMyA1OTNRMTcwIDU5MyAxNTAgNTc4VDExOSA1NDRRMTE5IDU0MyAxMTIgNTQzVDk3IDU0NlQ4MyA1NTdUNzYgNTc3UTc2IDU5NyA5NCA2MTVRMTEyIDYzMyAxNDEgNjQ0VDIwOCA2NTVRMjY2IDY1NSAzMDQgNjMwVDM0MyA1NjJRMzQzIDUyNyAzMjMgNTAzVDI2MCA0NzBRMjg4IDQ1OSAzMDEgNDQwVDMxNSAzOTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNDsiIGdseXBoLW5hbWU9ImFjdXRlIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMjYwIDU1NVEyNTggNTU4IDI2OSA1NzRUMzAxIDYxMVQzNDYgNjUzVDM5NiA2OTBRNDIwIDcwNSA0NDUgNzA1UTQ2NSA3MDUgNDc2IDY5M1Q0ODggNjYzUTQ4OCA2NDcgNDc2IDYzM1Q0NDIgNjA1UTQxMyA1ODggMzgyIDU3N1QzMjQgNTYwVDI4MCA1NTNUMjYwIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI1OyIgZ2x5cGgtbmFtZT0idW5pMDBCNSIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTczIC0yNjNRMTggLTI2MyAwIC0yMzFULTcgLTE0M0wxMjMgNDgxSDIyMkwxNjEgMTkyUTE1NCAxNDQgMTc0IDExMlExOTcgNzQgMjU0IDc0UTMwMiA3NCAzMzUgOThUMzk3IDE3MEw0NjMgNDgxSDU2MUw0ODMgMTEwUTQ3NSA3MiA0ODMgNTdUNTIyIDM4UTUyMyAzOCA1MjIgMzFUNTE2IDE1VDQ5OCAtMVQ0NjMgLTlRNDE4IC05IDM5OSAxNFQzODEgODBRMzUzIDM2IDMxMiAxMlQyMTkgLTEyUTE3MiAtMTIgMTM4IDRRMTMxIDcgMTI0IDExTDkyIC0xNDRRODQgLTE4MiA5MiAtMTk4VDEzNSAtMjE2UTEzNiAtMjE2IDEzNSAtMjIzVDEyOCAtMjM5VDEwOSAtMjU1VDczIC0yNjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCNjsiIGdseXBoLW5hbWU9InBhcmFncmFwaCIgaG9yaXotYWR2LXg9IjYzMCIgZD0iTTQ1OSAtNFE0NDIgLTQgNDM0IDZUNDMxIDM2TDU1NCA2MTRRNTYxIDY1MCA1OTMgNjUwSDYwNFE2NDAgNjUwIDYzMiA2MTBMNTA5IDMyUTUwNCAxMiA0OTUgNFQ0NjkgLTRINDU5Wk0zMjQgLTRRMzA3IC00IDI5OSA2VDI5NiAzNkwzNDggMjgzSDI5N1ExOTEgMjgzIDEzNSAzMjFUNzkgNDM3UTc5IDQ4MCA5MyA1MThUMTM3IDU4NVQyMTYgNjMwVDMzMiA2NDdINDUzUTQ3NyA2NDcgNDg4IDYzNFQ0OTQgNTk3TDM3NCAzMlEzNjkgMTIgMzYwIDRUMzM0IC00SDMyNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEI3OyIgZ2x5cGgtbmFtZT0idW5pMDBCNyIgaG9yaXotYWR2LXg9IjI2NiIgZD0iTTEyOCAxODRRNzEgMTg0IDcxIDIyNlE3MSAyNDUgNzYgMjYxVDkyIDI4OVExMDAgMjk3IDExMCAzMDFUMTQwIDMwNVExOTcgMzA1IDE5NyAyNjNRMTk3IDI0NCAxOTMgMjI4VDE3NyAyMDBRMTY5IDE5MiAxNTggMTg4VDEyOCAxODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCODsiIGdseXBoLW5hbWU9ImNlZGlsbGEiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0xMzAgLTIzNFExMjUgLTIzOCAxMTcgLTIzNlQxMDIgLTIzMFQ5MCAtMjE5VDg5IC0yMDdMMTkxIC00NVExOTIgLTQ0IDIwNCAtNDRUMjMwIC00OVQyNTUgLTYzVDI2NyAtODhRMjY3IC0xMDMgMjYwIC0xMTVUMjM1IC0xNDJMMTMwIC0yMzRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCOTsiIGdseXBoLW5hbWU9Im9uZXN1cGVyaW9yIiBob3Jpei1hZHYteD0iMzcwIiBkPSJNNzIgMjg1UTM4IDI4NSA0MCAzMTFRNDAgMzE1IDQyIDMyM1Q0OSAzMzdRNTQgMzQ1IDYxIDM0OFQ4NCAzNTJIMTQzTDE5MCA1NTdRMTY3IDUzNiAxMzkgNTM2UTExNiA1MzYgMTA0IDU0OFQ5MSA1NzlROTEgNTkxIDk1IDYwMFQxMDQgNjE1VDExMyA2MjNUMTE5IDYyNlExMjUgNjE4IDEzNSA2MTJUMTYyIDYwNVExNzkgNjA1IDE5NiA2MTdUMjIxIDY1MUgyNTFRMjg1IDY1MSAyNzggNjEzTDIxOCAzNTJIMjczUTMwNyAzNTIgMzA0IDMyNlEzMDQgMzIyIDMwMiAzMTRUMjk1IDMwMFEyODggMjg1IDI2MSAyODVINzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQTsiIGdseXBoLW5hbWU9Im9yZG1hc2N1bGluZSIgaG9yaXotYWR2LXg9IjQ4MSIgZD0iTTI2NSAyNTRRMjI0IDI1NCAxOTEgMjY3VDEzNCAzMDNUOTcgMzYwVDg0IDQzM1E4NCA0NzcgOTkgNTE4VDE0MyA1OTBUMjEyIDY0MVQzMDEgNjYwUTM0MiA2NjAgMzc1IDY0N1Q0MzMgNjExVDQ3MCA1NTRUNDg0IDQ4MVE0ODQgNDM2IDQ2OSAzOTVUNDI0IDMyM1QzNTUgMjczVDI2NSAyNTRaTTE5MCAtN1ExMzkgLTcgMTM5IDMxUTEzOSA0OCAxNDMgNjJUMTU3IDg3UTE2NSA5NSAxNzUgOThUMjAyIDEwMlEyNTMgMTAyIDI1MyA2NFEyNTMgNDcgMjQ5IDMzVDIzNCA3UTIyNiAwIDIxNyAtM1QxOTAgLTdaTTI2OCAzMjNRMjk3IDMyMyAzMjIgMzM1VDM2NSAzNjlUMzkzIDQxOVQ0MDQgNDc4UTQwNCA1MDIgMzk2IDUyMlQzNzQgNTU4VDM0MCA1ODFUMjk4IDU5MFEyNjkgNTkwIDI0NCA1NzhUMjAxIDU0NFQxNzMgNDk0VDE2MyA0MzVRMTYzIDQxMSAxNzEgMzkxVDE5MyAzNTVUMjI3IDMzMlQyNjggMzIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkI7IiBnbHlwaC1uYW1lPSJndWlsbGVtb3RyaWdodCIgaG9yaXotYWR2LXg9IjU1MyIgZD0iTTI4OCA3OFEyNzIgNzggMjY0IDg3VDI1NSAxMTFRMjU1IDEzMCAyNzkgMTU0VDM0MiAyMDFRMzU4IDIxMSAzNzYgMjIyVDQxNCAyNDRRMzk3IDI1NiAzODIgMjY4VDM1MiAyOTRRMzIwIDMyMyAzMDYgMzQwVDI5MSAzNzVRMjkwIDM4OSAzMDEgMzk5VDMyOSA0MDlRMzUyIDQwOSAzNzcgMzg5VDQyOCAzMzdRNDQxIDMyMCA0NTMgMzAzVDQ3NCAyNzFUNDg4IDI0NlQ0OTMgMjMyUTQ5MyAyMjkgNDg2IDIyMVQ0NjcgMTk5VDQzOSAxNzFUNDAzIDE0MFEzNzEgMTE0IDM0MSA5NlQyODggNzhaTTYyIDc3UTQ1IDc3IDM2IDg2VDI3IDExMFEyNyAxMzAgNTYgMTU3VDEyNyAyMTBRMTQ1IDIyMCAxNjQgMjMxVDIwMyAyNTRRMTg2IDI2NiAxNzQgMjc2VDE1MCAyOThRMTIyIDMyNCAxMTAgMzQwVDk3IDM3MlE5NyAzODcgMTA4IDM5N1QxMzcgNDA3UTE2MCA0MDcgMTgzIDM4OFQyMjggMzQwUTI0MCAzMjQgMjUwIDMwOFQyNjcgMjc5VDI3OSAyNTVUMjg0IDI0MlEyODQgMjM5IDI3NiAyMzBUMjUzIDIwNlQyMjEgMTc2VDE4MyAxNDNRMTUwIDExNyAxMTcgOTdUNjIgNzdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCQzsiIGdseXBoLW5hbWU9Im9uZXF1YXJ0ZXIiIGhvcml6LWFkdi14PSI4MjYiIGQ9Ik03MiAyODVRMzggMjg1IDQwIDMxMVE0MCAzMTUgNDIgMzIzVDQ5IDMzN1E1NCAzNDUgNjEgMzQ4VDg0IDM1MkgxNDNMMTkwIDU1N1ExNjcgNTM2IDEzOSA1MzZRMTE2IDUzNiAxMDQgNTQ4VDkxIDU3OVE5MSA1OTEgOTUgNjAwVDEwNCA2MTVUMTEzIDYyM1QxMTkgNjI2UTEyNSA2MTggMTM1IDYxMlQxNjIgNjA1UTE3OSA2MDUgMTk2IDYxN1QyMjEgNjUxSDI1MVEyODUgNjUxIDI3OCA2MTNMMjE4IDM1MkgyNzNRMzA3IDM1MiAzMDQgMzI2UTMwNCAzMjIgMzAyIDMxNFQyOTUgMzAwUTI4OCAyODUgMjYxIDI4NUg3MlpNNzI5IDYzNFE3MzAgNjM1IDczNSA2MzNUNzQ3IDYyN1Q3NTcgNjE1VDc1OSA1OTZRNzU3IDU4NSA3NDkgNTczVDcyMyA1NDRRNzE1IDUzNiA2ODggNTEwVDYyNCA0NDhUNTQ0IDM3MVQ0NjMgMjkyUTQ0NCAyNzMgNDIwIDI1MFQzNjggMjAwVDMxMyAxNDdUMjU5IDk0UTE5NyAzNCAxMzIgLTI5UTEzMCAtMzEgMTI0IC0yOVQxMTIgLTIyVDEwMiAtOVQxMDAgMTBRMTAzIDI0IDExMCAzM1QxMzYgNjJRMTQzIDY5IDE3MCA5NVQyMzQgMTU3VDMxMyAyMzNUMzk1IDMxMlE0MTQgMzMxIDQzOCAzNTRUNDkwIDQwNFQ1NDYgNDU3VDYwMSA1MTBRNjYzIDU3MCA3MjkgNjM0Wk02NzIgLTRRNjU3IC00IDY0OCA0VDY0NCAzNUw2NTUgOTBINTE1UTUxMiA5MCA1MDIgMTAyVDQ5MSAxMzVRNDkxIDE0OSA0OTggMTYxVDUyMSAxOTFMNjU1IDMzNVE2NzEgMzUzIDY4MyAzNTlUNzIzIDM2NlE3NTYgMzY2IDc2OSAzNTRUNzc1IDMxMkw3NDEgMTUySDc2OVE3OTkgMTUyIDc5OSAxMzFRNzk5IDEyNSA3OTYgMTE1VDc4NyA5OFE3ODMgOTQgNzc4IDkyVDc2MCA5MEg3MjhMNzE2IDM0UTcxMSAxMiA3MDQgNFQ2ODIgLTRINjcyWk01NTkgMTUxSDY3Mkw3MDUgMzA5TDU1OSAxNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRDsiIGdseXBoLW5hbWU9Im9uZWhhbGYiIGhvcml6LWFkdi14PSI4MjYiIGQ9Ik01NzcgOThRNTYzIDg0IDU1OSA2NEg3MjVRNzY2IDY0IDc2NiAzN1E3NjYgMjQgNzU5IDEyVDc1MSAwSDUxOVE1MDIgMCA0OTUgMTNUNDg5IDQ3UTQ5NSAxMDEgNTI4IDEzNlE1NDggMTU3IDU3NCAxNjlUNjI5IDE5MVE2NTEgMTk4IDY2OSAyMDVUNjk5IDIxOVQ3MTggMjM3VDcyNSAyNjFRNzI1IDI4MSA3MDggMjkzVDY2MiAzMDVRNjMwIDMwNSA2MTEgMjg4VDU4MSAyNDZRNTgxIDI0NiA1NzQgMjQ2VDU1OCAyNDlUNTQyIDI2MFQ1MzUgMjgzUTUzNSAyOTUgNTQxIDMwOFQ1NTkgMzMyUTU3NiAzNDkgNjA1IDM1OVQ2NzIgMzcwUTczMiAzNzAgNzY3IDM0MlQ4MDIgMjY2UTgwMiAyMzcgNzkyIDIxOFQ3NjUgMTg0VDcyNSAxNjFUNjc0IDE0M1E2NDEgMTMyIDYxNyAxMjNUNTc3IDk4Wk03MDEgNjM0UTcwMiA2MzUgNzA3IDYzM1Q3MTkgNjI3VDcyOSA2MTVUNzMxIDU5NlE3MjkgNTg1IDcyMSA1NzNUNjk1IDU0NFE2ODcgNTM2IDY2MCA1MTBUNTk2IDQ0OFQ1MTYgMzcxVDQzNSAyOTJRNDE2IDI3MyAzOTIgMjUwVDM0MCAyMDBUMjg1IDE0N1QyMzEgOTRRMTY5IDM0IDEwNCAtMjlRMTAyIC0zMSA5NiAtMjlUODQgLTIyVDc0IC05VDcyIDEwUTc1IDI0IDgyIDMzVDEwOCA2MlExMTUgNjkgMTQyIDk1VDIwNiAxNTdUMjg1IDIzM1QzNjcgMzEyUTM4NiAzMzEgNDEwIDM1NFQ0NjIgNDA0VDUxOCA0NTdUNTczIDUxMFE2MzUgNTcwIDcwMSA2MzRaTTcyIDI4NVEzOCAyODUgNDAgMzExUTQwIDMxNSA0MiAzMjNUNDkgMzM3UTU0IDM0NSA2MSAzNDhUODQgMzUySDE0M0wxOTAgNTU3UTE2NyA1MzYgMTM5IDUzNlExMTYgNTM2IDEwNCA1NDhUOTEgNTc5UTkxIDU5MSA5NSA2MDBUMTA0IDYxNVQxMTMgNjIzVDExOSA2MjZRMTI1IDYxOCAxMzUgNjEyVDE2MiA2MDVRMTc5IDYwNSAxOTYgNjE3VDIyMSA2NTFIMjUxUTI4NSA2NTEgMjc4IDYxM0wyMTggMzUySDI3M1EzMDcgMzUyIDMwNCAzMjZRMzA0IDMyMiAzMDIgMzE0VDI5NSAzMDBRMjg4IDI4NSAyNjEgMjg1SDcyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QkU7IiBnbHlwaC1uYW1lPSJ0aHJlZXF1YXJ0ZXJzIiBob3Jpei1hZHYteD0iODI2IiBkPSJNNjcyIC00UTY1NyAtNCA2NDggNFQ2NDQgMzVMNjU1IDkwSDUxNVE1MTIgOTAgNTAyIDEwMlQ0OTEgMTM1UTQ5MSAxNDkgNDk4IDE2MVQ1MjEgMTkxTDY1NSAzMzVRNjcxIDM1MyA2ODMgMzU5VDcyMyAzNjZRNzU2IDM2NiA3NjkgMzU0VDc3NSAzMTJMNzQxIDE1Mkg3NjlRNzk5IDE1MiA3OTkgMTMxUTc5OSAxMjUgNzk2IDExNVQ3ODcgOThRNzgzIDk0IDc3OCA5MlQ3NjAgOTBINzI4TDcxNiAzNFE3MTEgMTIgNzA0IDRUNjgyIC00SDY3MlpNMzE1IDM5NVEzMTUgMzc0IDMwNyAzNTNUMjgxIDMxNlQyMzQgMjg5VDE2MyAyNzhRMTIxIDI3OCA5MiAyODhUNDggMzE0UTM1IDMyNiAzMSAzMzdUMjYgMzYwUTI2IDM3NyAzMyAzODZUNTAgNDAwVDY4IDQwNVQ3NiA0MDRRODEgMzc0IDEwMyAzNTdUMTYzIDM0MFEyMDEgMzQwIDIxOSAzNTdUMjM4IDQwMFEyMzggNDIwIDIyNCA0MzJUMTgxIDQ0NEgxNjNRMTM0IDQ0NCAxMzQgNDY2UTEzNCA0NzIgMTM2IDQ4MFQxNDQgNDk0UTE0OSA1MDAgMTU2IDUwMVQxNzggNTAzSDIwMFEyMzkgNTAzIDI1MiA1MTdUMjY2IDU1MFEyNjYgNTY5IDI0OSA1ODFUMjAzIDU5M1ExNzAgNTkzIDE1MCA1NzhUMTE5IDU0NFExMTkgNTQzIDExMiA1NDNUOTcgNTQ2VDgzIDU1N1Q3NiA1NzdRNzYgNTk3IDk0IDYxNVExMTIgNjMzIDE0MSA2NDRUMjA4IDY1NVEyNjYgNjU1IDMwNCA2MzBUMzQzIDU2MlEzNDMgNTI3IDMyMyA1MDNUMjYwIDQ3MFEyODggNDU5IDMwMSA0NDBUMzE1IDM5NVpNNzI1IDYzNFE3MjYgNjM1IDczMSA2MzNUNzQzIDYyN1Q3NTMgNjE1VDc1NSA1OTZRNzUzIDU4NSA3NDUgNTczVDcxOSA1NDRRNzExIDUzNiA2ODQgNTEwVDYyMCA0NDhUNTQwIDM3MVQ0NTkgMjkyUTQ0MCAyNzMgNDE2IDI1MFQzNjQgMjAwVDMwOSAxNDdUMjU1IDk0UTE5MyAzNCAxMjggLTI5UTEyNiAtMzEgMTIwIC0yOVQxMDggLTIyVDk4IC05VDk2IDEwUTk5IDI0IDEwNiAzM1QxMzIgNjJRMTM5IDY5IDE2NiA5NVQyMzAgMTU3VDMwOSAyMzNUMzkxIDMxMlE0MTAgMzMxIDQzNCAzNTRUNDg2IDQwNFQ1NDIgNDU3VDU5NyA1MTBRNjU5IDU3MCA3MjUgNjM0Wk01NTkgMTUxSDY3Mkw3MDUgMzA5TDU1OSAxNTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hCRjsiIGdseXBoLW5hbWU9InF1ZXN0aW9uZG93biIgaG9yaXotYWR2LXg9IjUxMyIgZD0iTTM4NCA0NjJRMzg0IDQ1OSAzODIgNDUzUTM3OSA0NDEgMzczIDQxM1EzNjQgMzY5IDMzNyAzMzRUMjQ3IDI3OFEyMTggMjY4IDE5NiAyNThUMTU4IDIzNVQxMzUgMjA2VDEyNyAxNjZRMTI3IDEyNSAxNTcgOTdUMjQyIDY5UTI5NiA2OSAzMzMgMTAwVDM4OCAxNzlRMzg4IDE4MCAzOTcgMTc5VDQxNyAxNzNUNDM3IDE1OVQ0NDYgMTMzUTQ0NiAxMTIgNDM1IDkxVDQwNSA1MFEzNzYgMjEgMzM1IDNUMjM2IC0xNVExODggLTE1IDE0OSAtMlQ4MyAzNlQ0MCA5MlQyNSAxNjNRMjUgMjA3IDQwIDIzN1Q3OSAyODdUMTMxIDMxOVQxODUgMzQwUTIzNiAzNTcgMjU4IDM4MFQyODUgNDIyUTI4NiA0MjggMjg3IDQzNVQyOTEgNDQ4UTI5MyA0NTUgMjk0IDQ2MkgzODRaTTM1NyA2NTJRNDE0IDY1MiA0MTQgNjEwUTQxNCA1OTEgNDEwIDU3NVQzOTQgNTQ3UTM4NiA1MzkgMzc1IDUzNVQzNDUgNTMxUTI4OCA1MzEgMjg4IDU3M1EyODggNTkyIDI5MyA2MDhUMzA5IDYzNlEzMTcgNjQ0IDMyNyA2NDhUMzU3IDY1MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMwOyIgZ2x5cGgtbmFtZT0iQWdyYXZlIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNLTMzIDBMMzM5IDYyMlEzNDkgNjM5IDM2MiA2NDZUNDA1IDY1NFE0NDEgNjU0IDQ1NCA2NDRUNDcxIDYxNkw1OTMgMEg0ODhMNDUxIDE5MEgxOTFMODIgMEgtMzNaTTQ0MSAyNzNMMzkxIDU0NkwyMzMgMjczSDQ0MVpNNDYzIDcyMVE0NjAgNzE4IDQ0NCA3MTlUNDA1IDcyOFQzNTQgNzQ4VDMwMSA3NzlRMjY0IDgwNiAyNjQgODM4UTI2NCA4NTYgMjc3IDg2OFQzMDkgODgxUTMyMSA4ODEgMzM0IDg3NlQzNTggODYxUTM4MCA4NDQgNDAwIDgyMVQ0MzUgNzc3VDQ1NyA3NDBUNDYzIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMxOyIgZ2x5cGgtbmFtZT0iQWFjdXRlIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNLTMzIDBMMzM5IDYyMlEzNDkgNjM5IDM2MiA2NDZUNDA1IDY1NFE0NDEgNjU0IDQ1NCA2NDRUNDcxIDYxNkw1OTMgMEg0ODhMNDUxIDE5MEgxOTFMODIgMEgtMzNaTTQ0MSAyNzNMMzkxIDU0NkwyMzMgMjczSDQ0MVpNMzU5IDcyMVEzNTcgNzI0IDM2OCA3NDBUNDAwIDc3N1Q0NDUgODE5VDQ5NSA4NTZRNTE5IDg3MSA1NDQgODcxUTU2NCA4NzEgNTc1IDg1OVQ1ODcgODI5UTU4NyA4MTMgNTc1IDc5OVQ1NDEgNzcxUTUxMiA3NTQgNDgxIDc0M1Q0MjMgNzI2VDM3OSA3MTlUMzU5IDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMyOyIgZ2x5cGgtbmFtZT0iQWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik0tMzMgMEwzMzkgNjIyUTM0OSA2MzkgMzYyIDY0NlQ0MDUgNjU0UTQ0MSA2NTQgNDU0IDY0NFQ0NzEgNjE2TDU5MyAwSDQ4OEw0NTEgMTkwSDE5MUw4MiAwSC0zM1pNNDQxIDI3M0wzOTEgNTQ2TDIzMyAyNzNINDQxWk0zMDUgNzEzUTI5MSA3MTMgMjg0IDcyMVQyNzYgNzQxUTI3NiA3NjAgMjkzIDc4MVQzNDIgODI5UTM1OCA4NDIgMzc0IDg1M1Q0MDUgODc0VDQyOSA4ODhUNDQ1IDg5NFE0NTIgODkyIDQ3MyA4NzRUNTE0IDgzMVE1MzYgODA1IDU0NSA3ODZUNTU1IDc1MlE1NTUgNzM0IDU0NSA3MjRUNTIwIDcxM1E1MDQgNzEzIDQ5MCA3MjdUNDU4IDc3M1E0NTMgNzgzIDQ0NyA3OTRUNDMzIDgxOVE0MjIgODA2IDQxMiA3OTVUMzkwIDc3MlEzNjUgNzQ0IDM0NCA3MjlUMzA1IDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEMzOyIgZ2x5cGgtbmFtZT0iQXRpbGRlIiBob3Jpei1hZHYteD0iNjY1IiBkPSJNLTMzIDBMMzM5IDYyMlEzNDkgNjM5IDM2MiA2NDZUNDA1IDY1NFE0NDEgNjU0IDQ1NCA2NDRUNDcxIDYxNkw1OTMgMEg0ODhMNDUxIDE5MEgxOTFMODIgMEgtMzNaTTQ0MSAyNzNMMzkxIDU0NkwyMzMgMjczSDQ0MVpNNDg5IDcxMlE0NjIgNzEyIDQyNiA3MzFUMzU0IDc4N1EzNDIgNzYxIDMyNyA3NDBUMjk1IDcxOFEyNzkgNzE4IDI3MSA3MjdUMjYzIDc0N1EyNjMgNzY2IDI3MSA3ODRUMjkxIDgxN1QzMjAgODQwVDM1MyA4NDlRMzgwIDg0OSA0MTYgODMwVDQ4OCA3NzRRNTAwIDgwMCA1MTUgODIxVDU0NyA4NDNRNTYzIDg0MyA1NzEgODM0VDU3OSA4MTRRNTc5IDc5NCA1NzEgNzc2VDU1MSA3NDRUNTIyIDcyMVQ0ODkgNzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzQ7IiBnbHlwaC1uYW1lPSJBZGllcmVzaXMiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik0tMzMgMEwzMzkgNjIyUTM0OSA2MzkgMzYyIDY0NlQ0MDUgNjU0UTQ0MSA2NTQgNDU0IDY0NFQ0NzEgNjE2TDU5MyAwSDQ4OEw0NTEgMTkwSDE5MUw4MiAwSC0zM1pNNDQxIDI3M0wzOTEgNTQ2TDIzMyAyNzNINDQxWk01MTAgNzEyUTQ4MSA3MTIgNDY2IDcyNFQ0NTEgNzYwUTQ1MSA3ODkgNDY4IDgwOVQ1MTQgODI5UTU0MyA4MjkgNTU4IDgxN1Q1NzMgNzgxUTU3MyA3NTIgNTU2IDczMlQ1MTAgNzEyWk0zMjcgNzEyUTI5OCA3MTIgMjgzIDcyNFQyNjggNzYwUTI2OCA3ODkgMjg1IDgwOVQzMzEgODI5UTM2MCA4MjkgMzc0IDgxN1QzODkgNzgxUTM4OSA3NTIgMzczIDczMlQzMjcgNzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4QzU7IiBnbHlwaC1uYW1lPSJBcmluZyIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTS0zMyAwTDMyNSA1OTlRMzI1IDYwMCAzMjYgNjAxTDMzOSA2MjJRMzM5IDYyMiAzNDEgNjI0UTMwMCA2NTIgMzAwIDcwNVEzMDAgNzMyIDMxMCA3NTZUMzM3IDc5OVQzNzkgODI5VDQzMyA4NDBRNDg0IDg0MCA1MTUgODEyVDU0NyA3MzhRNTQ3IDY5OSA1MjYgNjY2VDQ3MSA2MTVMNDc2IDU5Mkg0NzVMNTkzIDBINDg4TDQ1MSAxOTBIMTkxTDgyIDBILTMzWk00MTYgNjU0UTQzMiA2NTQgNDQ1IDY2MFQ0NjcgNjc4VDQ4MSA3MDNUNDg2IDczMVE0ODYgNzU0IDQ3MSA3NzBUNDMxIDc4NlE0MTUgNzg2IDQwMiA3ODBUMzgwIDc2MlQzNjYgNzM3VDM2MSA3MDlRMzYxIDY4NiAzNzYgNjcwVDQxNiA2NTRaTTQ0MSAyNzNMMzkxIDU0NkwyMzMgMjczSDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM2OyIgZ2x5cGgtbmFtZT0iQUUiIGhvcml6LWFkdi14PSI4OTMiIGQ9Ik04MCAtNVE4MCAtNiA2OSAtNlQ0NCAtMlQxOSAxM1Q3IDQ1UTcgNTkgMTIgNzJUMzEgMTA4TDMyOSA2MDVRMzQxIDYyNSAzNTcgNjM2VDQwNSA2NDdIODY0UTkwOSA2NDcgOTA5IDYxOFE5MDkgNjA4IDkwNCA1OTJUODkxIDU2N1E4ODUgNTYwIDg3NyA1NThUODUxIDU1Nkg0ODFMNTE4IDM3NEg3NDBRNzgyIDM3NCA3ODIgMzQ3UTc4MiAzMzggNzc4IDMyMlQ3NjYgMjk4UTc2MCAyOTMgNzUyIDI5MFQ3MjggMjg3SDUzNUw1NzQgOTFINzYyUTgwNyA5MSA4MDcgNjNRODA3IDUyIDgwMiAzNlQ3ODkgMTFRNzc4IDAgNzQ5IDBINTQ2UTUxMyAwIDQ5NyAxMVQ0NzYgNTVMNDUxIDE5MEgxOTFMODAgLTVaTTQ0MSAyNzNMMzkxIDU0NkwyMzMgMjczSDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM3OyIgZ2x5cGgtbmFtZT0iQ2NlZGlsbGEiIGhvcml6LWFkdi14PSI2ODMiIGQ9Ik0zNzEgLTEyUTMwMyAtMTIgMjQ4IDdUMTU0IDYzVDk0IDE1MlQ3MiAyNzBRNzIgMzQ4IDk5IDQxOVQxNzUgNTQzVDI5MCA2MjdUNDM1IDY1OVE1MTAgNjU5IDU1OCA2MzhUNjM0IDU4OFE2NTYgNTY3IDY2NiA1NDVUNjc2IDUwN1E2NzYgNDg3IDY2NiA0NzVUNjQ0IDQ1N1Q2MjEgNDUwVDYwOCA0NTBRNTY0IDU2OCA0MzQgNTY4UTM4MCA1NjggMzM0IDU0NVQyNTMgNDgzVDIwMCAzOTNUMTgwIDI4M1ExODAgMjM2IDE5NCAxOTlUMjM0IDEzNVQyOTYgOTVUMzc1IDgwUTQzOCA4MCA0ODUgMTA1VDU2MSAxNzVRNTYyIDE3NiA1NzAgMTc0VDU4OCAxNjZUNjA1IDE1MFQ2MTMgMTI0UTYxMyA5NiA1ODEgNjRRNTUxIDM0IDQ5NiAxMVQzNzEgLTEyWk0yNzAgLTIzNFEyNjUgLTIzOCAyNTcgLTIzNlQyNDIgLTIzMFQyMzAgLTIxOVQyMjkgLTIwN0wzMzEgLTQ1UTMzMiAtNDQgMzQ0IC00NFQzNzAgLTQ5VDM5NSAtNjNUNDA3IC04OFE0MDcgLTEwMyA0MDAgLTExNVQzNzUgLTE0MkwyNzAgLTIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM4OyIgZ2x5cGgtbmFtZT0iRWdyYXZlIiBob3Jpei1hZHYteD0iNjIxIiBkPSJNMTYwIDU5MFExNzEgNjQ3IDIyNyA2NDdINjUwUTY0OSA2NDEgNjQ3IDYzM1E2NDUgNjI2IDY0NCA2MThUNjQxIDYwMVE2MzcgNTgxIDYzMSA1NTZIMjU2TDIxNyAzNzRINTIxTDUwMyAyODdIMTk4TDE1NyA5MUg1MzhMNTE5IDBIMzRMMTYwIDU5MFpNNDkxIDcyMVE0ODggNzE4IDQ3MiA3MTlUNDMzIDcyOFQzODIgNzQ4VDMyOSA3NzlRMjkyIDgwNiAyOTIgODM4UTI5MiA4NTYgMzA1IDg2OFQzMzcgODgxUTM0OSA4ODEgMzYyIDg3NlQzODYgODYxUTQwOCA4NDQgNDI4IDgyMVQ0NjMgNzc3VDQ4NSA3NDBUNDkxIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEM5OyIgZ2x5cGgtbmFtZT0iRWFjdXRlIiBob3Jpei1hZHYteD0iNjIxIiBkPSJNMTYwIDU5MFExNzEgNjQ3IDIyNyA2NDdINjUwUTY0OSA2NDEgNjQ3IDYzM1E2NDUgNjI2IDY0NCA2MThUNjQxIDYwMVE2MzcgNTgxIDYzMSA1NTZIMjU2TDIxNyAzNzRINTIxTDUwMyAyODdIMTk4TDE1NyA5MUg1MzhMNTE5IDBIMzRMMTYwIDU5MFpNMzUzIDcyMVEzNTEgNzI0IDM2MiA3NDBUMzk0IDc3N1Q0MzkgODE5VDQ4OSA4NTZRNTEzIDg3MSA1MzggODcxUTU1OCA4NzEgNTY5IDg1OVQ1ODEgODI5UTU4MSA4MTMgNTY5IDc5OVQ1MzUgNzcxUTUwNiA3NTQgNDc1IDc0M1Q0MTcgNzI2VDM3MyA3MTlUMzUzIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENBOyIgZ2x5cGgtbmFtZT0iRWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik0xNjAgNTkwUTE3MSA2NDcgMjI3IDY0N0g2NTBRNjQ5IDY0MSA2NDcgNjMzUTY0NSA2MjYgNjQ0IDYxOFQ2NDEgNjAxUTYzNyA1ODEgNjMxIDU1NkgyNTZMMjE3IDM3NEg1MjFMNTAzIDI4N0gxOThMMTU3IDkxSDUzOEw1MTkgMEgzNEwxNjAgNTkwWk0zMTYgNzEzUTMwMiA3MTMgMjk1IDcyMVQyODcgNzQxUTI4NyA3NjAgMzA0IDc4MVQzNTMgODI5UTM2OSA4NDIgMzg1IDg1M1Q0MTYgODc0VDQ0MCA4ODhUNDU2IDg5NFE0NjMgODkyIDQ4NCA4NzRUNTI1IDgzMVE1NDcgODA1IDU1NiA3ODZUNTY2IDc1MlE1NjYgNzM0IDU1NiA3MjRUNTMxIDcxM1E1MTUgNzEzIDUwMSA3MjdUNDY5IDc3M1E0NjQgNzgzIDQ1OCA3OTRUNDQ0IDgxOVE0MzMgODA2IDQyMyA3OTVUNDAxIDc3MlEzNzYgNzQ0IDM1NSA3MjlUMzE2IDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENCOyIgZ2x5cGgtbmFtZT0iRWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjIxIiBkPSJNMTYwIDU5MFExNzEgNjQ3IDIyNyA2NDdINjUwUTY0OSA2NDEgNjQ3IDYzM1E2NDUgNjI2IDY0NCA2MThUNjQxIDYwMVE2MzcgNTgxIDYzMSA1NTZIMjU2TDIxNyAzNzRINTIxTDUwMyAyODdIMTk4TDE1NyA5MUg1MzhMNTE5IDBIMzRMMTYwIDU5MFpNNTEzIDcxMlE0ODQgNzEyIDQ2OSA3MjRUNDU0IDc2MFE0NTQgNzg5IDQ3MSA4MDlUNTE3IDgyOVE1NDYgODI5IDU2MSA4MTdUNTc2IDc4MVE1NzYgNzUyIDU1OSA3MzJUNTEzIDcxMlpNMzMwIDcxMlEzMDEgNzEyIDI4NiA3MjRUMjcxIDc2MFEyNzEgNzg5IDI4OCA4MDlUMzM0IDgyOVEzNjMgODI5IDM3NyA4MTdUMzkyIDc4MVEzOTIgNzUyIDM3NiA3MzJUMzMwIDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENDOyIgZ2x5cGgtbmFtZT0iSWdyYXZlIiBob3Jpei1hZHYteD0iMjkzIiBkPSJNMTQ3IDBINDRMMTczIDYwNFExNzggNjI4IDE4OSA2MzlUMjI0IDY1MUgyMzhRMjYxIDY1MSAyNzEgNjM4VDI3NSA2MDFMMTQ3IDBaTTI5MiA3MjFRMjg5IDcxOCAyNzMgNzE5VDIzNCA3MjhUMTgzIDc0OFQxMzAgNzc5UTkzIDgwNiA5MyA4MzhROTMgODU2IDEwNiA4NjhUMTM4IDg4MVExNTAgODgxIDE2MyA4NzZUMTg3IDg2MVEyMDkgODQ0IDIyOSA4MjFUMjY0IDc3N1QyODYgNzQwVDI5MiA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hDRDsiIGdseXBoLW5hbWU9IklhY3V0ZSIgaG9yaXotYWR2LXg9IjI5MyIgZD0iTTE0NyAwSDQ0TDE3MyA2MDRRMTc4IDYyOCAxODkgNjM5VDIyNCA2NTFIMjM4UTI2MSA2NTEgMjcxIDYzOFQyNzUgNjAxTDE0NyAwWk0xOTMgNzIxUTE5MSA3MjQgMjAyIDc0MFQyMzQgNzc3VDI3OSA4MTlUMzI5IDg1NlEzNTMgODcxIDM3OCA4NzFRMzk4IDg3MSA0MDkgODU5VDQyMSA4MjlRNDIxIDgxMyA0MDkgNzk5VDM3NSA3NzFRMzQ2IDc1NCAzMTUgNzQzVDI1NyA3MjZUMjEzIDcxOVQxOTMgNzIxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Q0U7IiBnbHlwaC1uYW1lPSJJY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjI5MyIgZD0iTTE0NyAwSDQ0TDE3MyA2MDRRMTc4IDYyOCAxODkgNjM5VDIyNCA2NTFIMjM4UTI2MSA2NTEgMjcxIDYzOFQyNzUgNjAxTDE0NyAwWk0xMzggNzEzUTEyNCA3MTMgMTE3IDcyMVQxMDkgNzQxUTEwOSA3NjAgMTI2IDc4MVQxNzUgODI5UTE5MSA4NDIgMjA3IDg1M1QyMzggODc0VDI2MiA4ODhUMjc4IDg5NFEyODUgODkyIDMwNiA4NzRUMzQ3IDgzMVEzNjkgODA1IDM3OCA3ODZUMzg4IDc1MlEzODggNzM0IDM3OCA3MjRUMzUzIDcxM1EzMzcgNzEzIDMyMyA3MjdUMjkxIDc3M1EyODYgNzgzIDI4MCA3OTRUMjY2IDgxOVEyNTUgODA2IDI0NSA3OTVUMjIzIDc3MlExOTggNzQ0IDE3NyA3MjlUMTM4IDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeENGOyIgZ2x5cGgtbmFtZT0iSWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMjkzIiBkPSJNMTQ3IDBINDRMMTczIDYwNFExNzggNjI4IDE4OSA2MzlUMjI0IDY1MUgyMzhRMjYxIDY1MSAyNzEgNjM4VDI3NSA2MDFMMTQ3IDBaTTM0MyA3MTJRMzE0IDcxMiAyOTkgNzI0VDI4NCA3NjBRMjg0IDc4OSAzMDEgODA5VDM0NyA4MjlRMzc2IDgyOSAzOTEgODE3VDQwNiA3ODFRNDA2IDc1MiAzODkgNzMyVDM0MyA3MTJaTTE2MCA3MTJRMTMxIDcxMiAxMTYgNzI0VDEwMSA3NjBRMTAxIDc4OSAxMTggODA5VDE2NCA4MjlRMTkzIDgyOSAyMDcgODE3VDIyMiA3ODFRMjIyIDc1MiAyMDYgNzMyVDE2MCA3MTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMDsiIGdseXBoLW5hbWU9IkV0aCIgaG9yaXotYWR2LXg9IjczOSIgZD0iTTE0MCAwUTcyIDAgODYgNjdMMTMzIDI4NUg4MVE0NiAyODUgNDYgMzA5UTQ2IDMxOCA0OSAzMzJUNjEgMzU0UTY2IDM1OSA3MyAzNjFUOTMgMzYzSDE0OUwxOTggNTkwUTIwNyA2NDcgMjY1IDY0N0gzODJRNTMzIDY0NyA2MTYgNTc3VDcwMCAzNzhRNzAwIDMwMSA2NzUgMjMyVDYwMCAxMTJUNDczIDMwVDI5NiAwSDE0MFpNMzExIDg5UTM4MyA4OSA0MzYgMTExVDUyNSAxNzFUNTc3IDI1OFQ1OTQgMzY0UTU5NCA0NTUgNTM3IDUwNlQzNzQgNTU4SDI5M0wyNTIgMzYzSDQyMVE0NTkgMzYzIDQ1OSAzMzlRNDU5IDMzMSA0NTYgMzE3VDQ0NCAyOTVRNDM5IDI5MCA0MzIgMjg4VDQxMCAyODVIMjM1TDE5NCA4OUgzMTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEMTsiIGdseXBoLW5hbWU9Ik50aWxkZSIgaG9yaXotYWR2LXg9IjcxNiIgZD0iTTE2MCA1OTJRMTcyIDY1MSAyMjMgNjUxSDI0MFEyNjAgNjUxIDI3MiA2NDJUMjk1IDYxMEw1MTYgMTU1TDYyMSA2NDdINzE3TDU5MCA1MVE1NzkgLTQgNTMxIC00SDUyM1E1MDMgLTQgNDkyIDVUNDY4IDM3TDIzOSA1MDlMMTMxIDBIMzVMMTYwIDU5MlpNNTM5IDcxMlE1MTIgNzEyIDQ3NiA3MzFUNDA0IDc4N1EzOTIgNzYxIDM3NyA3NDBUMzQ1IDcxOFEzMjkgNzE4IDMyMSA3MjdUMzEzIDc0N1EzMTMgNzY2IDMyMSA3ODRUMzQxIDgxN1QzNzAgODQwVDQwMyA4NDlRNDMwIDg0OSA0NjYgODMwVDUzOCA3NzRRNTUwIDgwMCA1NjUgODIxVDU5NyA4NDNRNjEzIDg0MyA2MjEgODM0VDYyOSA4MTRRNjI5IDc5NCA2MjEgNzc2VDYwMSA3NDRUNTcyIDcyMVQ1MzkgNzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDI7IiBnbHlwaC1uYW1lPSJPZ3JhdmUiIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zNjYgLTExUTI5NiAtMTEgMjQyIDExVDE1MCA3MVQ5MyAxNjBUNzMgMjcxUTczIDM1NCAxMDIgNDI1VDE4MCA1NDhUMjk1IDYzMFQ0MzQgNjYwUTUwMyA2NjAgNTU3IDYzOFQ2NDkgNTc4VDcwNyA0ODhUNzI3IDM3N1E3MjcgMjk0IDY5OCAyMjNUNjIwIDEwMFQ1MDUgMTlUMzY2IC0xMVpNMzc0IDc5UTQyMCA3OSA0NjQgMTAwVDU0NCAxNjBUNjAwIDI1MlQ2MjEgMzcwUTYyMSA0MTEgNjA4IDQ0N1Q1NzEgNTExVDUxMCA1NTNUNDI2IDU2OVEzNzkgNTY5IDMzNSA1NDhUMjU1IDQ4OFQxOTkgMzk2VDE3OCAyNzhRMTc4IDIzNyAxOTEgMjAxVDIyOSAxMzdUMjkwIDk1VDM3NCA3OVpNNTIzIDcyMVE1MjAgNzE4IDUwNCA3MTlUNDY1IDcyOFQ0MTQgNzQ4VDM2MSA3NzlRMzI0IDgwNiAzMjQgODM4UTMyNCA4NTYgMzM3IDg2OFQzNjkgODgxUTM4MSA4ODEgMzk0IDg3NlQ0MTggODYxUTQ0MCA4NDQgNDYwIDgyMVQ0OTUgNzc3VDUxNyA3NDBUNTIzIDcyMVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQzOyIgZ2x5cGgtbmFtZT0iT2FjdXRlIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzY2IC0xMVEyOTYgLTExIDI0MiAxMVQxNTAgNzFUOTMgMTYwVDczIDI3MVE3MyAzNTQgMTAyIDQyNVQxODAgNTQ4VDI5NSA2MzBUNDM0IDY2MFE1MDMgNjYwIDU1NyA2MzhUNjQ5IDU3OFQ3MDcgNDg4VDcyNyAzNzdRNzI3IDI5NCA2OTggMjIzVDYyMCAxMDBUNTA1IDE5VDM2NiAtMTFaTTM3NCA3OVE0MjAgNzkgNDY0IDEwMFQ1NDQgMTYwVDYwMCAyNTJUNjIxIDM3MFE2MjEgNDExIDYwOCA0NDdUNTcxIDUxMVQ1MTAgNTUzVDQyNiA1NjlRMzc5IDU2OSAzMzUgNTQ4VDI1NSA0ODhUMTk5IDM5NlQxNzggMjc4UTE3OCAyMzcgMTkxIDIwMVQyMjkgMTM3VDI5MCA5NVQzNzQgNzlaTTM3NSA3MjFRMzczIDcyNCAzODQgNzQwVDQxNiA3NzdUNDYxIDgxOVQ1MTEgODU2UTUzNSA4NzEgNTYwIDg3MVE1ODAgODcxIDU5MSA4NTlUNjAzIDgyOVE2MDMgODEzIDU5MSA3OTlUNTU3IDc3MVE1MjggNzU0IDQ5NyA3NDNUNDM5IDcyNlQzOTUgNzE5VDM3NSA3MjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hENDsiIGdseXBoLW5hbWU9Ik9jaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzY2IC0xMVEyOTYgLTExIDI0MiAxMVQxNTAgNzFUOTMgMTYwVDczIDI3MVE3MyAzNTQgMTAyIDQyNVQxODAgNTQ4VDI5NSA2MzBUNDM0IDY2MFE1MDMgNjYwIDU1NyA2MzhUNjQ5IDU3OFQ3MDcgNDg4VDcyNyAzNzdRNzI3IDI5NCA2OTggMjIzVDYyMCAxMDBUNTA1IDE5VDM2NiAtMTFaTTM3NCA3OVE0MjAgNzkgNDY0IDEwMFQ1NDQgMTYwVDYwMCAyNTJUNjIxIDM3MFE2MjEgNDExIDYwOCA0NDdUNTcxIDUxMVQ1MTAgNTUzVDQyNiA1NjlRMzc5IDU2OSAzMzUgNTQ4VDI1NSA0ODhUMTk5IDM5NlQxNzggMjc4UTE3OCAyMzcgMTkxIDIwMVQyMjkgMTM3VDI5MCA5NVQzNzQgNzlaTTM1MiA3MTNRMzM4IDcxMyAzMzEgNzIxVDMyMyA3NDFRMzIzIDc2MCAzNDAgNzgxVDM4OSA4MjlRNDA1IDg0MiA0MjEgODUzVDQ1MiA4NzRUNDc2IDg4OFQ0OTIgODk0UTQ5OSA4OTIgNTIwIDg3NFQ1NjEgODMxUTU4MyA4MDUgNTkyIDc4NlQ2MDIgNzUyUTYwMiA3MzQgNTkyIDcyNFQ1NjcgNzEzUTU1MSA3MTMgNTM3IDcyN1Q1MDUgNzczUTUwMCA3ODMgNDk0IDc5NFQ0ODAgODE5UTQ2OSA4MDYgNDU5IDc5NVQ0MzcgNzcyUTQxMiA3NDQgMzkxIDcyOVQzNTIgNzEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDU7IiBnbHlwaC1uYW1lPSJPdGlsZGUiIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zNjYgLTExUTI5NiAtMTEgMjQyIDExVDE1MCA3MVQ5MyAxNjBUNzMgMjcxUTczIDM1NCAxMDIgNDI1VDE4MCA1NDhUMjk1IDYzMFQ0MzQgNjYwUTUwMyA2NjAgNTU3IDYzOFQ2NDkgNTc4VDcwNyA0ODhUNzI3IDM3N1E3MjcgMjk0IDY5OCAyMjNUNjIwIDEwMFQ1MDUgMTlUMzY2IC0xMVpNMzc0IDc5UTQyMCA3OSA0NjQgMTAwVDU0NCAxNjBUNjAwIDI1MlQ2MjEgMzcwUTYyMSA0MTEgNjA4IDQ0N1Q1NzEgNTExVDUxMCA1NTNUNDI2IDU2OVEzNzkgNTY5IDMzNSA1NDhUMjU1IDQ4OFQxOTkgMzk2VDE3OCAyNzhRMTc4IDIzNyAxOTEgMjAxVDIyOSAxMzdUMjkwIDk1VDM3NCA3OVpNNTI5IDcxMlE1MDIgNzEyIDQ2NiA3MzFUMzk0IDc4N1EzODIgNzYxIDM2NyA3NDBUMzM1IDcxOFEzMTkgNzE4IDMxMSA3MjdUMzAzIDc0N1EzMDMgNzY2IDMxMSA3ODRUMzMxIDgxN1QzNjAgODQwVDM5MyA4NDlRNDIwIDg0OSA0NTYgODMwVDUyOCA3NzRRNTQwIDgwMCA1NTUgODIxVDU4NyA4NDNRNjAzIDg0MyA2MTEgODM0VDYxOSA4MTRRNjE5IDc5NCA2MTEgNzc2VDU5MSA3NDRUNTYyIDcyMVQ1MjkgNzEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RDY7IiBnbHlwaC1uYW1lPSJPZGllcmVzaXMiIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zNjYgLTExUTI5NiAtMTEgMjQyIDExVDE1MCA3MVQ5MyAxNjBUNzMgMjcxUTczIDM1NCAxMDIgNDI1VDE4MCA1NDhUMjk1IDYzMFQ0MzQgNjYwUTUwMyA2NjAgNTU3IDYzOFQ2NDkgNTc4VDcwNyA0ODhUNzI3IDM3N1E3MjcgMjk0IDY5OCAyMjNUNjIwIDEwMFQ1MDUgMTlUMzY2IC0xMVpNMzc0IDc5UTQyMCA3OSA0NjQgMTAwVDU0NCAxNjBUNjAwIDI1MlQ2MjEgMzcwUTYyMSA0MTEgNjA4IDQ0N1Q1NzEgNTExVDUxMCA1NTNUNDI2IDU2OVEzNzkgNTY5IDMzNSA1NDhUMjU1IDQ4OFQxOTkgMzk2VDE3OCAyNzhRMTc4IDIzNyAxOTEgMjAxVDIyOSAxMzdUMjkwIDk1VDM3NCA3OVpNNTU5IDcxMlE1MzAgNzEyIDUxNSA3MjRUNTAwIDc2MFE1MDAgNzg5IDUxNyA4MDlUNTYzIDgyOVE1OTIgODI5IDYwNyA4MTdUNjIyIDc4MVE2MjIgNzUyIDYwNSA3MzJUNTU5IDcxMlpNMzc2IDcxMlEzNDcgNzEyIDMzMiA3MjRUMzE3IDc2MFEzMTcgNzg5IDMzNCA4MDlUMzgwIDgyOVE0MDkgODI5IDQyMyA4MTdUNDM4IDc4MVE0MzggNzUyIDQyMiA3MzJUMzc2IDcxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ3OyIgZ2x5cGgtbmFtZT0ibXVsdGlwbHkiIGhvcml6LWFkdi14PSI1ODAiIGQ9Ik00MTUgNjRRMzk1IDY0IDM4MSA4M0wyOTAgMjAzTDE0NyA4MlExMzEgNjcgMTEzIDY3UTEwNyA2NyAxMDAgNzFUODggODJUNzggOTZUNzQgMTA4UTc0IDEyOSA5MyAxNDVMMjQwIDI2OUwxNDggMzg5UTEzNiA0MDUgMTM2IDQxOVExMzYgNDMxIDE1MCA0NDVUMTc5IDQ1OVExOTggNDU5IDIxMyA0NDBMMzAyIDMyMEw0NDUgNDQxUTQ2MSA0NTYgNDc5IDQ1NlE0ODUgNDU2IDQ5MiA0NTJUNTA0IDQ0MVQ1MTQgNDI3VDUxOCA0MTVRNTE4IDQwNSA1MTQgMzk2VDQ5OSAzNzhMMzUzIDI1NUw0NDUgMTM0UTQ1OCAxMTcgNDU4IDEwNFE0NTggOTIgNDQ0IDc4VDQxNSA2NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEQ4OyIgZ2x5cGgtbmFtZT0iT3NsYXNoIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNNTAgLTM0UTQ4IC0zNiA0MiAtMzNUMjkgLTI1VDE3IC0xMVQxMSA3UTExIDIxIDE4IDMyVDQwIDU4TDExMyAxMjJRNzMgMTkwIDczIDI3MVE3MyAzNTQgMTAyIDQyNVQxODAgNTQ4VDI5NSA2MzBUNDM0IDY2MFE0OTcgNjYwIDU0OCA2NDFUNjM3IDU4Nkw3MzcgNjc2UTczOSA2NzcgNzQ1IDY3NVQ3NTggNjY2VDc3MCA2NTJUNzc2IDYzNFE3NzYgNjIwIDc2OSA2MDlUNzQ3IDU4M0w2ODUgNTI4UTcyNyA0NjAgNzI3IDM3N1E3MjcgMjk0IDY5OCAyMjNUNjIwIDEwMFQ1MDUgMTlUMzY2IC0xMVEzMDEgLTExIDI1MCA5VDE2MCA2NEw1MCAtMzRaTTM3NCA3N1E0MjEgNzcgNDY2IDk4VDU0NiAxNTlUNjAyIDI1MlQ2MjMgMzcwUTYyMyA0MjAgNjA1IDQ2MUwyMzMgMTI4UTI1OCAxMDQgMjkzIDkxVDM3NCA3N1pNMTc2IDI3OFExNzYgMjI4IDE5MiAxODlMNTY0IDUyMlE1MzkgNTQ1IDUwNSA1NThUNDI2IDU3MVEzNzggNTcxIDMzMyA1NTBUMjUzIDQ4OVQxOTcgMzk2VDE3NiAyNzhaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEOTsiIGdseXBoLW5hbWU9IlVncmF2ZSIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTMyMyAtMTJRMTg0IC0xMiAxMjAgNjRUODggMjkxTDE1NCA2MDRRMTYwIDYyOCAxNzEgNjM5VDIwNiA2NTFIMjIwUTI0MyA2NTEgMjUyIDYzOFQyNTcgNjAwTDE5MCAyODNRMTY5IDE4MSAyMDUgMTMwVDMzMiA3OVE0NjkgNzkgNTA2IDI1NEw1ODEgNjA0UTU4NiA2MjggNTk3IDYzOVQ2MzIgNjUxSDY0NVE2NjcgNjUxIDY3NyA2MzhUNjgyIDYwMUw2MDYgMjQxUTU1MiAtMTIgMzIzIC0xMlpNNTAwIDcxM1E0OTcgNzEwIDQ4MSA3MTFUNDQyIDcyMFQzOTEgNzQwVDMzOCA3NzFRMzAxIDc5OCAzMDEgODMwUTMwMSA4NDggMzE0IDg2MFQzNDYgODczUTM1OCA4NzMgMzcxIDg2OFQzOTUgODUzUTQxNyA4MzYgNDM3IDgxM1Q0NzIgNzY5VDQ5NCA3MzJUNTAwIDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERBOyIgZ2x5cGgtbmFtZT0iVWFjdXRlIiBob3Jpei1hZHYteD0iNjgyIiBkPSJNMzIzIC0xMlExODQgLTEyIDEyMCA2NFQ4OCAyOTFMMTU0IDYwNFExNjAgNjI4IDE3MSA2MzlUMjA2IDY1MUgyMjBRMjQzIDY1MSAyNTIgNjM4VDI1NyA2MDBMMTkwIDI4M1ExNjkgMTgxIDIwNSAxMzBUMzMyIDc5UTQ2OSA3OSA1MDYgMjU0TDU4MSA2MDRRNTg2IDYyOCA1OTcgNjM5VDYzMiA2NTFINjQ1UTY2NyA2NTEgNjc3IDYzOFQ2ODIgNjAxTDYwNiAyNDFRNTUyIC0xMiAzMjMgLTEyWk0zNTMgNzEzUTM1MSA3MTYgMzYyIDczMlQzOTQgNzY5VDQzOSA4MTFUNDg5IDg0OFE1MTMgODYzIDUzOCA4NjNRNTU4IDg2MyA1NjkgODUxVDU4MSA4MjFRNTgxIDgwNSA1NjkgNzkxVDUzNSA3NjNRNTA2IDc0NiA0NzUgNzM1VDQxNyA3MThUMzczIDcxMVQzNTMgNzEzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4REI7IiBnbHlwaC1uYW1lPSJVY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTMyMyAtMTJRMTg0IC0xMiAxMjAgNjRUODggMjkxTDE1NCA2MDRRMTYwIDYyOCAxNzEgNjM5VDIwNiA2NTFIMjIwUTI0MyA2NTEgMjUyIDYzOFQyNTcgNjAwTDE5MCAyODNRMTY5IDE4MSAyMDUgMTMwVDMzMiA3OVE0NjkgNzkgNTA2IDI1NEw1ODEgNjA0UTU4NiA2MjggNTk3IDYzOVQ2MzIgNjUxSDY0NVE2NjcgNjUxIDY3NyA2MzhUNjgyIDYwMUw2MDYgMjQxUTU1MiAtMTIgMzIzIC0xMlpNMzI4IDcwNVEzMTQgNzA1IDMwNyA3MTNUMjk5IDczM1EyOTkgNzUyIDMxNiA3NzNUMzY1IDgyMVEzODEgODM0IDM5NyA4NDVUNDI4IDg2NlQ0NTIgODgwVDQ2OCA4ODZRNDc1IDg4NCA0OTYgODY2VDUzNyA4MjNRNTU5IDc5NyA1NjggNzc4VDU3OCA3NDRRNTc4IDcyNiA1NjggNzE2VDU0MyA3MDVRNTI3IDcwNSA1MTMgNzE5VDQ4MSA3NjVRNDc2IDc3NSA0NzAgNzg2VDQ1NiA4MTFRNDQ1IDc5OCA0MzUgNzg3VDQxMyA3NjRRMzg4IDczNiAzNjcgNzIxVDMyOCA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hEQzsiIGdseXBoLW5hbWU9IlVkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTMyMyAtMTJRMTg0IC0xMiAxMjAgNjRUODggMjkxTDE1NCA2MDRRMTYwIDYyOCAxNzEgNjM5VDIwNiA2NTFIMjIwUTI0MyA2NTEgMjUyIDYzOFQyNTcgNjAwTDE5MCAyODNRMTY5IDE4MSAyMDUgMTMwVDMzMiA3OVE0NjkgNzkgNTA2IDI1NEw1ODEgNjA0UTU4NiA2MjggNTk3IDYzOVQ2MzIgNjUxSDY0NVE2NjcgNjUxIDY3NyA2MzhUNjgyIDYwMUw2MDYgMjQxUTU1MiAtMTIgMzIzIC0xMlpNNTM0IDcwNFE1MDUgNzA0IDQ5MCA3MTZUNDc1IDc1MlE0NzUgNzgxIDQ5MiA4MDFUNTM4IDgyMVE1NjcgODIxIDU4MiA4MDlUNTk3IDc3M1E1OTcgNzQ0IDU4MCA3MjRUNTM0IDcwNFpNMzUxIDcwNFEzMjIgNzA0IDMwNyA3MTZUMjkyIDc1MlEyOTIgNzgxIDMwOSA4MDFUMzU1IDgyMVEzODQgODIxIDM5OCA4MDlUNDEzIDc3M1E0MTMgNzQ0IDM5NyA3MjRUMzUxIDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEREOyIgZ2x5cGgtbmFtZT0iWWFjdXRlIiBob3Jpei1hZHYteD0iNjA1IiBkPSJNMjU4IDI2N0w4OCA2NDdIMTk2TDMyMiAzNTFMNTc4IDY1NVE1NzggNjU1IDU4OCA2NTRUNjA5IDY0N1Q2MzAgNjMyVDY0MCA2MDNRNjQwIDU4OSA2MzMgNTc1VDYwNSA1MzhMMzYwIDI2MkwzMDUgMEgyMDFMMjU4IDI2N1pNMzI3IDcxM1EzMjUgNzE2IDMzNiA3MzJUMzY4IDc2OVQ0MTMgODExVDQ2MyA4NDhRNDg3IDg2MyA1MTIgODYzUTUzMiA4NjMgNTQzIDg1MVQ1NTUgODIxUTU1NSA4MDUgNTQzIDc5MVQ1MDkgNzYzUTQ4MCA3NDYgNDQ5IDczNVQzOTEgNzE4VDM0NyA3MTFUMzI3IDcxM1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeERFOyIgZ2x5cGgtbmFtZT0iVGhvcm4iIGhvcml6LWFkdi14PSI2MDkiIGQ9Ik04MSAtNFE1OSAtNCA0OSA4VDQ0IDQ3TDE2MiA2MDRRMTY4IDYyOCAxNzkgNjM5VDIxNCA2NTFIMjMwUTI1MSA2NTEgMjYxIDYzOVQyNjYgNjA1TDI1MCA1MzFIMzUwUTQ2MSA1MzEgNTE5IDQ4N1Q1NzcgMzU3UTU3NyAyNDUgNTA5IDE4M1QzMDggMTIxSDE2M0wxNDYgMzlRMTQxIDE2IDEzMCA2VDk2IC00SDgxWk0zMjAgMjA0UTM5NSAyMDQgNDM1IDI0MVQ0NzUgMzQ1UTQ3NSA0NDYgMzQzIDQ0NkgyMzJMMTgxIDIwNEgzMjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hERjsiIGdseXBoLW5hbWU9Imdlcm1hbmRibHMiIGhvcml6LWFkdi14PSI1ODYiIGQ9Ik0zMjQgLTEyUTI0MyAtMTIgMjA1IDI2UTE5NCAzNyAxOTAgNDdUMTg1IDY5UTE4NSA4MyAxOTEgOTNUMjA0IDExMFQyMTggMTE5VDIyNSAxMjFRMjM3IDEwMSAyNTggODVUMzE5IDY5UTM0MyA2OSAzNjQgNzhUNDAxIDEwNVQ0MjYgMTQ2VDQzNSAxOTlRNDM1IDIzNCA0MTMgMjYyVDMzMiAzMTFRMzA3IDMyMSAyOTYgMzMyVDI4NCAzNjRRMjg0IDM4OSAyOTQgNDA1VDMxMyA0MjdRMzk0IDQyNyA0MzIgNDQ5VDQ3MSA1MjlRNDcxIDU2NyA0NDEgNTkwVDM2MSA2MTNRMzExIDYxMyAyNzYgNTc4VDIyNCA0NjRMMTI2IDBIMjdMMTI3IDQ2OVExNTIgNTg3IDIxMSA2NDBUMzYzIDY5NFE0NjEgNjk0IDUxNCA2NTFUNTY4IDUzOVE1NjggNDY4IDUyMyA0MjVUMzgzIDM3NFE0NDggMzU2IDQ4OSAzMTNUNTMxIDIwNlE1MzEgMTU5IDUxNSAxMTlUNDcxIDUwVDQwNSA1VDMyNCAtMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMDsiIGdseXBoLW5hbWU9ImFncmF2ZSIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTQ5NSAtOVE0NDggLTkgNDI5IDE3VDQxNCA5MFEzODMgNDAgMzM2IDE0VDIzNCAtMTJRMTk1IC0xMiAxNjEgMVQxMDEgNDBUNjEgMTAzVDQ2IDE4OVE0NiAyNDYgNjYgMzAwVDEyMSAzOTdUMjA2IDQ2NlQzMTUgNDkzUTM3MSA0OTMgNDE0IDQ2OFQ0NzggNDAwUTQ4MyA0MjMgNDg3IDQzOFQ0OTMgNDY0UTQ5NiA0NzUgNDk3IDQ4MUg1OTNMNTE1IDExMFE1MDcgNzIgNTE1IDU3VDU1NCAzOFE1NTUgMzggNTU0IDMxVDU0OCAxNVQ1MzAgLTFUNDk1IC05Wk0yNjEgNzBRMjk0IDcwIDMyNCA4MlQzNzggMTE3VDQxOCAxNjhUNDQyIDIzMUw0NTggMzA2UTQ0MyAzNTUgNDEwIDM4NFQzMjEgNDEzUTI4MCA0MTMgMjQ3IDM5NFQxOTEgMzQ1VDE1NiAyNzZUMTQ0IDE5OFExNDQgMTM3IDE3OCAxMDRUMjYxIDcwWk00MjUgNTU1UTQyMiA1NTIgNDA2IDU1M1QzNjcgNTYyVDMxNiA1ODJUMjYzIDYxM1EyMjYgNjQwIDIyNiA2NzJRMjI2IDY5MCAyMzkgNzAyVDI3MSA3MTVRMjgzIDcxNSAyOTYgNzEwVDMyMCA2OTVRMzQyIDY3OCAzNjIgNjU1VDM5NyA2MTFUNDE5IDU3NFQ0MjUgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTE7IiBnbHlwaC1uYW1lPSJhYWN1dGUiIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik00OTUgLTlRNDQ4IC05IDQyOSAxN1Q0MTQgOTBRMzgzIDQwIDMzNiAxNFQyMzQgLTEyUTE5NSAtMTIgMTYxIDFUMTAxIDQwVDYxIDEwM1Q0NiAxODlRNDYgMjQ2IDY2IDMwMFQxMjEgMzk3VDIwNiA0NjZUMzE1IDQ5M1EzNzEgNDkzIDQxNCA0NjhUNDc4IDQwMFE0ODMgNDIzIDQ4NyA0MzhUNDkzIDQ2NFE0OTYgNDc1IDQ5NyA0ODFINTkzTDUxNSAxMTBRNTA3IDcyIDUxNSA1N1Q1NTQgMzhRNTU1IDM4IDU1NCAzMVQ1NDggMTVUNTMwIC0xVDQ5NSAtOVpNMjYxIDcwUTI5NCA3MCAzMjQgODJUMzc4IDExN1Q0MTggMTY4VDQ0MiAyMzFMNDU4IDMwNlE0NDMgMzU1IDQxMCAzODRUMzIxIDQxM1EyODAgNDEzIDI0NyAzOTRUMTkxIDM0NVQxNTYgMjc2VDE0NCAxOThRMTQ0IDEzNyAxNzggMTA0VDI2MSA3MFpNMjk5IDU1NVEyOTcgNTU4IDMwOCA1NzRUMzQwIDYxMVQzODUgNjUzVDQzNSA2OTBRNDU5IDcwNSA0ODQgNzA1UTUwNCA3MDUgNTE1IDY5M1Q1MjcgNjYzUTUyNyA2NDcgNTE1IDYzM1Q0ODEgNjA1UTQ1MiA1ODggNDIxIDU3N1QzNjMgNTYwVDMxOSA1NTNUMjk5IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEUyOyIgZ2x5cGgtbmFtZT0iYWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik00OTUgLTlRNDQ4IC05IDQyOSAxN1Q0MTQgOTBRMzgzIDQwIDMzNiAxNFQyMzQgLTEyUTE5NSAtMTIgMTYxIDFUMTAxIDQwVDYxIDEwM1Q0NiAxODlRNDYgMjQ2IDY2IDMwMFQxMjEgMzk3VDIwNiA0NjZUMzE1IDQ5M1EzNzEgNDkzIDQxNCA0NjhUNDc4IDQwMFE0ODMgNDIzIDQ4NyA0MzhUNDkzIDQ2NFE0OTYgNDc1IDQ5NyA0ODFINTkzTDUxNSAxMTBRNTA3IDcyIDUxNSA1N1Q1NTQgMzhRNTU1IDM4IDU1NCAzMVQ1NDggMTVUNTMwIC0xVDQ5NSAtOVpNMjYxIDcwUTI5NCA3MCAzMjQgODJUMzc4IDExN1Q0MTggMTY4VDQ0MiAyMzFMNDU4IDMwNlE0NDMgMzU1IDQxMCAzODRUMzIxIDQxM1EyODAgNDEzIDI0NyAzOTRUMTkxIDM0NVQxNTYgMjc2VDE0NCAxOThRMTQ0IDEzNyAxNzggMTA0VDI2MSA3MFpNMjY0IDU0N1EyNTAgNTQ3IDI0MyA1NTVUMjM1IDU3NVEyMzUgNTk0IDI1MiA2MTVUMzAxIDY2M1EzMTcgNjc2IDMzMyA2ODdUMzY0IDcwOFQzODggNzIyVDQwNCA3MjhRNDExIDcyNiA0MzIgNzA4VDQ3MyA2NjVRNDk1IDYzOSA1MDQgNjIwVDUxNCA1ODZRNTE0IDU2OCA1MDQgNTU4VDQ3OSA1NDdRNDYzIDU0NyA0NDkgNTYxVDQxNyA2MDdRNDEyIDYxNyA0MDYgNjI4VDM5MiA2NTNRMzgxIDY0MCAzNzEgNjI5VDM0OSA2MDZRMzI0IDU3OCAzMDMgNTYzVDI2NCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFMzsiIGdseXBoLW5hbWU9ImF0aWxkZSIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTQ5NSAtOVE0NDggLTkgNDI5IDE3VDQxNCA5MFEzODMgNDAgMzM2IDE0VDIzNCAtMTJRMTk1IC0xMiAxNjEgMVQxMDEgNDBUNjEgMTAzVDQ2IDE4OVE0NiAyNDYgNjYgMzAwVDEyMSAzOTdUMjA2IDQ2NlQzMTUgNDkzUTM3MSA0OTMgNDE0IDQ2OFQ0NzggNDAwUTQ4MyA0MjMgNDg3IDQzOFQ0OTMgNDY0UTQ5NiA0NzUgNDk3IDQ4MUg1OTNMNTE1IDExMFE1MDcgNzIgNTE1IDU3VDU1NCAzOFE1NTUgMzggNTU0IDMxVDU0OCAxNVQ1MzAgLTFUNDk1IC05Wk0yNjEgNzBRMjk0IDcwIDMyNCA4MlQzNzggMTE3VDQxOCAxNjhUNDQyIDIzMUw0NTggMzA2UTQ0MyAzNTUgNDEwIDM4NFQzMjEgNDEzUTI4MCA0MTMgMjQ3IDM5NFQxOTEgMzQ1VDE1NiAyNzZUMTQ0IDE5OFExNDQgMTM3IDE3OCAxMDRUMjYxIDcwWk00NDcgNTQ2UTQyMCA1NDYgMzg0IDU2NVQzMTIgNjIxUTMwMCA1OTUgMjg1IDU3NFQyNTMgNTUyUTIzNyA1NTIgMjI5IDU2MVQyMjEgNTgxUTIyMSA2MDAgMjI5IDYxOFQyNDkgNjUxVDI3OCA2NzRUMzExIDY4M1EzMzggNjgzIDM3NCA2NjRUNDQ2IDYwOFE0NTggNjM0IDQ3MyA2NTVUNTA1IDY3N1E1MjEgNjc3IDUyOSA2NjhUNTM3IDY0OFE1MzcgNjI4IDUyOSA2MTBUNTA5IDU3OFQ0ODAgNTU1VDQ0NyA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hFNDsiIGdseXBoLW5hbWU9ImFkaWVyZXNpcyIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTQ5NSAtOVE0NDggLTkgNDI5IDE3VDQxNCA5MFEzODMgNDAgMzM2IDE0VDIzNCAtMTJRMTk1IC0xMiAxNjEgMVQxMDEgNDBUNjEgMTAzVDQ2IDE4OVE0NiAyNDYgNjYgMzAwVDEyMSAzOTdUMjA2IDQ2NlQzMTUgNDkzUTM3MSA0OTMgNDE0IDQ2OFQ0NzggNDAwUTQ4MyA0MjMgNDg3IDQzOFQ0OTMgNDY0UTQ5NiA0NzUgNDk3IDQ4MUg1OTNMNTE1IDExMFE1MDcgNzIgNTE1IDU3VDU1NCAzOFE1NTUgMzggNTU0IDMxVDU0OCAxNVQ1MzAgLTFUNDk1IC05Wk0yNjEgNzBRMjk0IDcwIDMyNCA4MlQzNzggMTE3VDQxOCAxNjhUNDQyIDIzMUw0NTggMzA2UTQ0MyAzNTUgNDEwIDM4NFQzMjEgNDEzUTI4MCA0MTMgMjQ3IDM5NFQxOTEgMzQ1VDE1NiAyNzZUMTQ0IDE5OFExNDQgMTM3IDE3OCAxMDRUMjYxIDcwWk00NjkgNTQ2UTQ0MCA1NDYgNDI1IDU1OFQ0MTAgNTk0UTQxMCA2MjMgNDI3IDY0M1Q0NzMgNjYzUTUwMiA2NjMgNTE3IDY1MVQ1MzIgNjE1UTUzMiA1ODYgNTE1IDU2NlQ0NjkgNTQ2Wk0yODYgNTQ2UTI1NyA1NDYgMjQyIDU1OFQyMjcgNTk0UTIyNyA2MjMgMjQ0IDY0M1QyOTAgNjYzUTMxOSA2NjMgMzMzIDY1MVQzNDggNjE1UTM0OCA1ODYgMzMyIDU2NlQyODYgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTU7IiBnbHlwaC1uYW1lPSJhcmluZyIgaG9yaXotYWR2LXg9IjYyMiIgZD0iTTQ5NSAtOVE0NDggLTkgNDI5IDE3VDQxNCA5MFEzODMgNDAgMzM2IDE0VDIzNCAtMTJRMTk1IC0xMiAxNjEgMVQxMDEgNDBUNjEgMTAzVDQ2IDE4OVE0NiAyNDYgNjYgMzAwVDEyMSAzOTdUMjA2IDQ2NlQzMTUgNDkzUTM3MSA0OTMgNDE0IDQ2OFQ0NzggNDAwUTQ4MyA0MjMgNDg3IDQzOFQ0OTMgNDY0UTQ5NiA0NzUgNDk3IDQ4MUg1OTNMNTE1IDExMFE1MDcgNzIgNTE1IDU3VDU1NCAzOFE1NTUgMzggNTU0IDMxVDU0OCAxNVQ1MzAgLTFUNDk1IC05Wk0yNjEgNzBRMjk0IDcwIDMyNCA4MlQzNzggMTE3VDQxOCAxNjhUNDQyIDIzMUw0NTggMzA2UTQ0MyAzNTUgNDEwIDM4NFQzMjEgNDEzUTI4MCA0MTMgMjQ3IDM5NFQxOTEgMzQ1VDE1NiAyNzZUMTQ0IDE5OFExNDQgMTM3IDE3OCAxMDRUMjYxIDcwWk0zODEgNTQ4UTMzMCA1NDggMjk5IDU3N1QyNjggNjUxUTI2OCA2NzggMjc4IDcwMlQzMDUgNzQ1VDM0NyA3NzVUNDAxIDc4N1E0NTIgNzg3IDQ4MyA3NThUNTE0IDY4NFE1MTQgNjU3IDUwNCA2MzNUNDc3IDU4OVQ0MzUgNTU5VDM4MSA1NDhaTTM4MyA2MDFRNDE2IDYwMSA0MzUgNjI1VDQ1NCA2NzhRNDU0IDcwMSA0MzkgNzE3VDM5OCA3MzRRMzgyIDczNCAzNjkgNzI4VDM0NyA3MTBUMzMzIDY4NVQzMjggNjU3UTMyOCA2MzQgMzQzIDYxOFQzODMgNjAxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RTY7IiBnbHlwaC1uYW1lPSJhZSIgaG9yaXotYWR2LXg9Ijg4NSIgZD0iTTE5OCAtMTJRMTE3IC0xMiA3MiAyMFQyNiAxMTBRMjYgMTU2IDQ1IDE4OVQxMDggMjQzVDIxOSAyNzVUMzg0IDI4OEgzOTZMMzk3IDI5MlE0MDggMzQ5IDM4MCAzODFUMjgzIDQxM1EyMjggNDEzIDE5NSAzOTZUMTM4IDM0MVExMzggMzQxIDEzMSAzNDJUMTE0IDM0OFQ5OCAzNjJUOTAgMzg2UTkwIDQwMSAxMDEgNDIwVDEzNyA0NTVUMTk5IDQ4MlQyODkgNDkzUTM2MCA0OTMgNDA2IDQ2NlQ0NjYgMzg3UTUwNCA0MzggNTU4IDQ2NVQ2ODEgNDkzUTc2OCA0OTMgODE1IDQ1N1Q4NjIgMzYwUTg2MiAzMjQgODQ5IDI5NVQ4MDMgMjQ2VDcxOCAyMTVUNTgzIDIwNFE1NTcgMjA0IDUyOSAyMDVUNDY4IDIwOVYxOTFRNDY4IDEzNCA1MDEgOTlUNjAwIDY0UTY1MyA2NCA2OTAgODNUNzU0IDEzOVE3NTUgMTQwIDc2MiAxMzlUNzc3IDEzM1Q3OTIgMTIwVDc5OSA5OFE3OTkgODMgNzk0IDczVDc3NSA0OFE3NDUgMTkgNzAyIDRUNTk5IC0xMlE1MjAgLTEyIDQ3NCAxOFQ0MDggOTdRMzc4IDQ2IDMyNiAxN1QxOTggLTEyWk0yMTggNTlRMjQ2IDU5IDI3MiA2OFQzMTggOTNUMzUzIDEzMlQzNzQgMTgxTDM4NCAyMjhMMzU2IDIyN1EyODcgMjI1IDI0MiAyMThUMTcwIDE5N1QxMzQgMTY1VDEyMyAxMjFRMTIzIDk0IDE0OCA3N1QyMTggNTlaTTY3NyA0MTlRNjQ0IDQxOSA2MTQgNDA4VDU2MCAzNzlUNTE2IDMzNFQ0ODQgMjc4UTUxMCAyNzUgNTMyIDI3NFQ1NzQgMjczUTYzMiAyNzMgNjcwIDI4MFQ3MzEgMjk4VDc2MyAzMjVUNzcyIDM1N1E3NzIgMzgxIDc0OSA0MDBUNjc3IDQxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU3OyIgZ2x5cGgtbmFtZT0iY2NlZGlsbGEiIGhvcml6LWFkdi14PSI1NTAiIGQ9Ik0yNzcgLTEyUTIyNyAtMTIgMTg1IDNUMTExIDQ2VDYyIDExNlQ0NCAyMTBRNDQgMjY2IDY1IDMxN1QxMjMgNDA3VDIxMCA0NjlUMzE4IDQ5M1EzNzkgNDkzIDQyMCA0NzZUNDg3IDQzMlE1MDcgNDEyIDUxNiAzOTFUNTI2IDM1MlE1MjYgMzMxIDUxNiAzMjBUNDk0IDMwM1Q0NzEgMjk4VDQ2MCAzMDFRNDUxIDM0OSA0MTYgMzc5VDMyMSA0MTBRMjgwIDQxMCAyNDcgMzk0VDE5MCAzNTBUMTUzIDI4OFQxNDAgMjE3UTE0MCAxNTIgMTc5IDExMlQyODYgNzFRMzM1IDcxIDM2OCA5M1Q0MjUgMTUyUTQyNiAxNTMgNDM0IDE1MlQ0NTEgMTQ2VDQ2NyAxMzJUNDc1IDEwOVE0NzUgODIgNDQzIDUwUTQxNyAyNSAzNzUgN1QyNzcgLTEyWk0xNzggLTIzNFExNzMgLTIzOCAxNjUgLTIzNlQxNTAgLTIzMFQxMzggLTIxOVQxMzcgLTIwN0wyMzkgLTQ1UTI0MCAtNDQgMjUyIC00NFQyNzggLTQ5VDMwMyAtNjNUMzE1IC04OFEzMTUgLTEwMyAzMDggLTExNVQyODMgLTE0MkwxNzggLTIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU4OyIgZ2x5cGgtbmFtZT0iZWdyYXZlIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMjYyIC0xMlEyMDcgLTEyIDE2NiAzVDk4IDQ1VDU2IDEwOFQ0MiAxODhRNDIgMjU0IDY1IDMwOVQxMzAgNDA2VDIyNiA0NzBUMzQ1IDQ5M1E0MzIgNDkzIDQ3OSA0NTdUNTI2IDM2MFE1MjYgMzI0IDUxMyAyOTVUNDY3IDI0NlQzODIgMjE1VDI0NyAyMDRRMjIxIDIwNCAxOTMgMjA1VDEzMiAyMDlWMTkxUTEzMiAxMzQgMTY1IDk5VDI2NCA2NFEzMTcgNjQgMzU0IDgzVDQxOCAxMzlRNDE5IDE0MCA0MjYgMTM5VDQ0MSAxMzNUNDU2IDEyMFQ0NjMgOThRNDYzIDgzIDQ1OCA3M1Q0MzkgNDhRNDA5IDE5IDM2NiA0VDI2MiAtMTJaTTM0MSA0MTlRMzA4IDQxOSAyNzggNDA4VDIyNCAzNzlUMTgwIDMzNFQxNDggMjc4UTE3NCAyNzUgMTk2IDI3NFQyMzggMjczUTI5NiAyNzMgMzM0IDI4MFQzOTUgMjk4VDQyNyAzMjVUNDM2IDM1N1E0MzYgMzgxIDQxMyA0MDBUMzQxIDQxOVpNNDE0IDU1NVE0MTEgNTUyIDM5NSA1NTNUMzU2IDU2MlQzMDUgNTgyVDI1MiA2MTNRMjE1IDY0MCAyMTUgNjcyUTIxNSA2OTAgMjI4IDcwMlQyNjAgNzE1UTI3MiA3MTUgMjg1IDcxMFQzMDkgNjk1UTMzMSA2NzggMzUxIDY1NVQzODYgNjExVDQwOCA1NzRUNDE0IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEU5OyIgZ2x5cGgtbmFtZT0iZWFjdXRlIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMjYyIC0xMlEyMDcgLTEyIDE2NiAzVDk4IDQ1VDU2IDEwOFQ0MiAxODhRNDIgMjU0IDY1IDMwOVQxMzAgNDA2VDIyNiA0NzBUMzQ1IDQ5M1E0MzIgNDkzIDQ3OSA0NTdUNTI2IDM2MFE1MjYgMzI0IDUxMyAyOTVUNDY3IDI0NlQzODIgMjE1VDI0NyAyMDRRMjIxIDIwNCAxOTMgMjA1VDEzMiAyMDlWMTkxUTEzMiAxMzQgMTY1IDk5VDI2NCA2NFEzMTcgNjQgMzU0IDgzVDQxOCAxMzlRNDE5IDE0MCA0MjYgMTM5VDQ0MSAxMzNUNDU2IDEyMFQ0NjMgOThRNDYzIDgzIDQ1OCA3M1Q0MzkgNDhRNDA5IDE5IDM2NiA0VDI2MiAtMTJaTTM0MSA0MTlRMzA4IDQxOSAyNzggNDA4VDIyNCAzNzlUMTgwIDMzNFQxNDggMjc4UTE3NCAyNzUgMTk2IDI3NFQyMzggMjczUTI5NiAyNzMgMzM0IDI4MFQzOTUgMjk4VDQyNyAzMjVUNDM2IDM1N1E0MzYgMzgxIDQxMyA0MDBUMzQxIDQxOVpNMjg2IDU1NVEyODQgNTU4IDI5NSA1NzRUMzI3IDYxMVQzNzIgNjUzVDQyMiA2OTBRNDQ2IDcwNSA0NzEgNzA1UTQ5MSA3MDUgNTAyIDY5M1Q1MTQgNjYzUTUxNCA2NDcgNTAyIDYzM1Q0NjggNjA1UTQzOSA1ODggNDA4IDU3N1QzNTAgNTYwVDMwNiA1NTNUMjg2IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVBOyIgZ2x5cGgtbmFtZT0iZWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0yNjIgLTEyUTIwNyAtMTIgMTY2IDNUOTggNDVUNTYgMTA4VDQyIDE4OFE0MiAyNTQgNjUgMzA5VDEzMCA0MDZUMjI2IDQ3MFQzNDUgNDkzUTQzMiA0OTMgNDc5IDQ1N1Q1MjYgMzYwUTUyNiAzMjQgNTEzIDI5NVQ0NjcgMjQ2VDM4MiAyMTVUMjQ3IDIwNFEyMjEgMjA0IDE5MyAyMDVUMTMyIDIwOVYxOTFRMTMyIDEzNCAxNjUgOTlUMjY0IDY0UTMxNyA2NCAzNTQgODNUNDE4IDEzOVE0MTkgMTQwIDQyNiAxMzlUNDQxIDEzM1Q0NTYgMTIwVDQ2MyA5OFE0NjMgODMgNDU4IDczVDQzOSA0OFE0MDkgMTkgMzY2IDRUMjYyIC0xMlpNMzQxIDQxOVEzMDggNDE5IDI3OCA0MDhUMjI0IDM3OVQxODAgMzM0VDE0OCAyNzhRMTc0IDI3NSAxOTYgMjc0VDIzOCAyNzNRMjk2IDI3MyAzMzQgMjgwVDM5NSAyOThUNDI3IDMyNVQ0MzYgMzU3UTQzNiAzODEgNDEzIDQwMFQzNDEgNDE5Wk0yNTQgNTQ3UTI0MCA1NDcgMjMzIDU1NVQyMjUgNTc1UTIyNSA1OTQgMjQyIDYxNVQyOTEgNjYzUTMwNyA2NzYgMzIzIDY4N1QzNTQgNzA4VDM3OCA3MjJUMzk0IDcyOFE0MDEgNzI2IDQyMiA3MDhUNDYzIDY2NVE0ODUgNjM5IDQ5NCA2MjBUNTA0IDU4NlE1MDQgNTY4IDQ5NCA1NThUNDY5IDU0N1E0NTMgNTQ3IDQzOSA1NjFUNDA3IDYwN1E0MDIgNjE3IDM5NiA2MjhUMzgyIDY1M1EzNzEgNjQwIDM2MSA2MjlUMzM5IDYwNlEzMTQgNTc4IDI5MyA1NjNUMjU0IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVCOyIgZ2x5cGgtbmFtZT0iZWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMjYyIC0xMlEyMDcgLTEyIDE2NiAzVDk4IDQ1VDU2IDEwOFQ0MiAxODhRNDIgMjU0IDY1IDMwOVQxMzAgNDA2VDIyNiA0NzBUMzQ1IDQ5M1E0MzIgNDkzIDQ3OSA0NTdUNTI2IDM2MFE1MjYgMzI0IDUxMyAyOTVUNDY3IDI0NlQzODIgMjE1VDI0NyAyMDRRMjIxIDIwNCAxOTMgMjA1VDEzMiAyMDlWMTkxUTEzMiAxMzQgMTY1IDk5VDI2NCA2NFEzMTcgNjQgMzU0IDgzVDQxOCAxMzlRNDE5IDE0MCA0MjYgMTM5VDQ0MSAxMzNUNDU2IDEyMFQ0NjMgOThRNDYzIDgzIDQ1OCA3M1Q0MzkgNDhRNDA5IDE5IDM2NiA0VDI2MiAtMTJaTTM0MSA0MTlRMzA4IDQxOSAyNzggNDA4VDIyNCAzNzlUMTgwIDMzNFQxNDggMjc4UTE3NCAyNzUgMTk2IDI3NFQyMzggMjczUTI5NiAyNzMgMzM0IDI4MFQzOTUgMjk4VDQyNyAzMjVUNDM2IDM1N1E0MzYgMzgxIDQxMyA0MDBUMzQxIDQxOVpNNDU5IDU0NlE0MzAgNTQ2IDQxNSA1NThUNDAwIDU5NFE0MDAgNjIzIDQxNyA2NDNUNDYzIDY2M1E0OTIgNjYzIDUwNyA2NTFUNTIyIDYxNVE1MjIgNTg2IDUwNSA1NjZUNDU5IDU0NlpNMjc2IDU0NlEyNDcgNTQ2IDIzMiA1NThUMjE3IDU5NFEyMTcgNjIzIDIzNCA2NDNUMjgwIDY2M1EzMDkgNjYzIDMyMyA2NTFUMzM4IDYxNVEzMzggNTg2IDMyMiA1NjZUMjc2IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVDOyIgZ2x5cGgtbmFtZT0iaWdyYXZlIiBob3Jpei1hZHYteD0iMjY0IiBkPSJNMTM1IC05UTgwIC05IDYyIDIzVDU1IDExMUwxMzQgNDgxSDIzMkwxNTQgMTEwUTE0NiA3MiAxNTQgNTZUMTk3IDM4UTE5OCAzOCAxOTcgMzFUMTkwIDE1VDE3MSAtMVQxMzUgLTlaTTI1NyA1NTVRMjU0IDU1MiAyMzggNTUzVDE5OSA1NjJUMTQ4IDU4MlQ5NSA2MTNRNTggNjQwIDU4IDY3MlE1OCA2OTAgNzEgNzAyVDEwMyA3MTVRMTE1IDcxNSAxMjggNzEwVDE1MiA2OTVRMTc0IDY3OCAxOTQgNjU1VDIyOSA2MTFUMjUxIDU3NFQyNTcgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RUQ7IiBnbHlwaC1uYW1lPSJpYWN1dGUiIGhvcml6LWFkdi14PSIyNjQiIGQ9Ik0xMzUgLTlRODAgLTkgNjIgMjNUNTUgMTExTDEzNCA0ODFIMjMyTDE1NCAxMTBRMTQ2IDcyIDE1NCA1NlQxOTcgMzhRMTk4IDM4IDE5NyAzMVQxOTAgMTVUMTcxIC0xVDEzNSAtOVpNMTI3IDU1NVExMjUgNTU4IDEzNiA1NzRUMTY4IDYxMVQyMTMgNjUzVDI2MyA2OTBRMjg3IDcwNSAzMTIgNzA1UTMzMiA3MDUgMzQzIDY5M1QzNTUgNjYzUTM1NSA2NDcgMzQzIDYzM1QzMDkgNjA1UTI4MCA1ODggMjQ5IDU3N1QxOTEgNTYwVDE0NyA1NTNUMTI3IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVFOyIgZ2x5cGgtbmFtZT0iaWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIyNjQiIGQ9Ik0xMzUgLTlRODAgLTkgNjIgMjNUNTUgMTExTDEzNCA0ODFIMjMyTDE1NCAxMTBRMTQ2IDcyIDE1NCA1NlQxOTcgMzhRMTk4IDM4IDE5NyAzMVQxOTAgMTVUMTcxIC0xVDEzNSAtOVpNOTQgNTQ3UTgwIDU0NyA3MyA1NTVUNjUgNTc1UTY1IDU5NCA4MiA2MTVUMTMxIDY2M1ExNDcgNjc2IDE2MyA2ODdUMTk0IDcwOFQyMTggNzIyVDIzNCA3MjhRMjQxIDcyNiAyNjIgNzA4VDMwMyA2NjVRMzI1IDYzOSAzMzQgNjIwVDM0NCA1ODZRMzQ0IDU2OCAzMzQgNTU4VDMwOSA1NDdRMjkzIDU0NyAyNzkgNTYxVDI0NyA2MDdRMjQyIDYxNyAyMzYgNjI4VDIyMiA2NTNRMjExIDY0MCAyMDEgNjI5VDE3OSA2MDZRMTU0IDU3OCAxMzMgNTYzVDk0IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEVGOyIgZ2x5cGgtbmFtZT0iaWRpZXJlc2lzIiBob3Jpei1hZHYteD0iMjY0IiBkPSJNMTM1IC05UTgwIC05IDYyIDIzVDU1IDExMUwxMzQgNDgxSDIzMkwxNTQgMTEwUTE0NiA3MiAxNTQgNTZUMTk3IDM4UTE5OCAzOCAxOTcgMzFUMTkwIDE1VDE3MSAtMVQxMzUgLTlaTTI5OSA1NDZRMjcwIDU0NiAyNTUgNTU4VDI0MCA1OTRRMjQwIDYyMyAyNTcgNjQzVDMwMyA2NjNRMzMyIDY2MyAzNDcgNjUxVDM2MiA2MTVRMzYyIDU4NiAzNDUgNTY2VDI5OSA1NDZaTTExNiA1NDZRODcgNTQ2IDcyIDU1OFQ1NyA1OTRRNTcgNjIzIDc0IDY0M1QxMjAgNjYzUTE0OSA2NjMgMTYzIDY1MVQxNzggNjE1UTE3OCA1ODYgMTYyIDU2NlQxMTYgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjA7IiBnbHlwaC1uYW1lPSJudWxsIiBob3Jpei1hZHYteD0iNTk3IiBkPSJNMjM1IDQ3NlEyMzIgNDc0IDIyMyA0ODRUMjE0IDUxNFEyMTQgNTI4IDIyMSA1NDBUMjUzIDU2NEwzMjkgNjAxUTI2OCA2MzQgMTk1IDYzOVExOTMgNjM5IDE5NCA2NDhUMjAxIDY3MFQyMjIgNjkxVDI2MiA3MDFRMjk3IDcwMSAzMzkgNjg2VDQyMSA2NDFMNTQyIDcwMVE1NDUgNzAzIDU1NCA2OTNUNTYzIDY2M1E1NjMgNjQ5IDU1NiA2MzdUNTI0IDYxM0w0NzYgNTkwUTUwMCA1NjMgNTE5IDUzMFQ1NDkgNDU4VDU2MyAzNzNUNTU3IDI3NlE1NDkgMjE4IDUyOCAxNjRUNDU1IDU4UTQyNCAyNyAzODAgOFQyNzYgLTEyUTIyNSAtMTIgMTgyIDFUMTA3IDM5VDU4IDEwMlQ0MCAxODdRNDAgMjM3IDU3IDI4MVQxMDcgMzYwVDE4NSA0MTNUMjg3IDQzM1EzNTYgNDMzIDQwMyA0MDVUNDcwIDM0MFE0NzMgNDExIDQ1MiA0NjRUMzkyIDU1NkwyMzUgNDc2Wk0yNzEgNjZRMzA2IDY2IDMzNCA3OFQzODcgMTEzUTQxMyAxMzkgNDMwIDE3OFQ0NTUgMjYzUTQ0OSAyODAgNDM2IDI5N1Q0MDIgMzI3VDM1NyAzNDlUMzAzIDM1OFEyNjAgMzU4IDIyOSAzNDVUMTc3IDMwOFQxNDYgMjUzVDEzNiAxODZRMTM2IDEyOSAxNzQgOThUMjcxIDY2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjE7IiBnbHlwaC1uYW1lPSJudGlsZGUiIGhvcml6LWFkdi14PSI1OTEiIGQ9Ik0xNTMgNDg1UTE2NSA0ODUgMTc2IDQ4MlQxOTYgNDY5VDIwOCA0NDNUMjA4IDQwM1EyMzYgNDQ1IDI3NyA0NjlUMzY5IDQ5M1E0MDggNDkzIDQzOCA0ODFUNDg5IDQ0OFQ1MjEgMzk4VDUzMiAzMzRRNTMyIDMwOCA1MjQgMjcwVDUwMyAxODlRNDkyIDE1MiA0ODYgMTI0VDQ3OSA4MVE0NzkgNjEgNDg5IDUyVDUyMCA0MVE1MjEgNDEgNTIwIDMzVDUxMyAxNlQ0OTQgLTFUNDU5IC05UTQyMCAtOSA0MDAgMTJUMzgwIDY5UTM4MCA5MCAzODcgMTIxVDQwNSAxOTNRNDE2IDIyOSA0MjIgMjYwVDQyOSAzMDlRNDI5IDM1NSA0MDUgMzgxVDMzMyA0MDdRMjg2IDQwNyAyNTMgMzg0VDE5MSAzMTFMMTI1IDBIMjZMMTI4IDQ4MFExMzAgNDg1IDE1MyA0ODVaTTQ0MCA1NDZRNDEzIDU0NiAzNzcgNTY1VDMwNSA2MjFRMjkzIDU5NSAyNzggNTc0VDI0NiA1NTJRMjMwIDU1MiAyMjIgNTYxVDIxNCA1ODFRMjE0IDYwMCAyMjIgNjE4VDI0MiA2NTFUMjcxIDY3NFQzMDQgNjgzUTMzMSA2ODMgMzY3IDY2NFQ0MzkgNjA4UTQ1MSA2MzQgNDY2IDY1NVQ0OTggNjc3UTUxNCA2NzcgNTIyIDY2OFQ1MzAgNjQ4UTUzMCA2MjggNTIyIDYxMFQ1MDIgNTc4VDQ3MyA1NTVUNDQwIDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYyOyIgZ2x5cGgtbmFtZT0ib2dyYXZlIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjcxIC0xMlEyMjEgLTEyIDE4MCA0VDEwOSA1MFQ2MyAxMjFUNDYgMjEwUTQ2IDI2NiA2NSAzMTdUMTIxIDQwN1QyMDcgNDY5VDMxOCA0OTNRMzY3IDQ5MyA0MDggNDc3VDQ4MCA0MzFUNTI2IDM2MFQ1NDMgMjcxUTU0MyAyMTUgNTI0IDE2NFQ0NjggNzRUMzgyIDEyVDI3MSAtMTJaTTI3NSA2N1EzMTMgNjcgMzQ1IDgzVDQwMSAxMjdUNDM4IDE5MVQ0NTIgMjY3UTQ1MiAyOTkgNDQyIDMyNlQ0MTMgMzcyVDM2OSA0MDNUMzE0IDQxNFEyNzYgNDE0IDI0NCAzOThUMTg4IDM1NFQxNTEgMjkwVDEzNyAyMTRRMTM3IDE4MiAxNDcgMTU1VDE3NiAxMDlUMjIwIDc4VDI3NSA2N1pNNDAyIDU1NVEzOTkgNTUyIDM4MyA1NTNUMzQ0IDU2MlQyOTMgNTgyVDI0MCA2MTNRMjAzIDY0MCAyMDMgNjcyUTIwMyA2OTAgMjE2IDcwMlQyNDggNzE1UTI2MCA3MTUgMjczIDcxMFQyOTcgNjk1UTMxOSA2NzggMzM5IDY1NVQzNzQgNjExVDM5NiA1NzRUNDAyIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEYzOyIgZ2x5cGgtbmFtZT0ib2FjdXRlIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjcxIC0xMlEyMjEgLTEyIDE4MCA0VDEwOSA1MFQ2MyAxMjFUNDYgMjEwUTQ2IDI2NiA2NSAzMTdUMTIxIDQwN1QyMDcgNDY5VDMxOCA0OTNRMzY3IDQ5MyA0MDggNDc3VDQ4MCA0MzFUNTI2IDM2MFQ1NDMgMjcxUTU0MyAyMTUgNTI0IDE2NFQ0NjggNzRUMzgyIDEyVDI3MSAtMTJaTTI3NSA2N1EzMTMgNjcgMzQ1IDgzVDQwMSAxMjdUNDM4IDE5MVQ0NTIgMjY3UTQ1MiAyOTkgNDQyIDMyNlQ0MTMgMzcyVDM2OSA0MDNUMzE0IDQxNFEyNzYgNDE0IDI0NCAzOThUMTg4IDM1NFQxNTEgMjkwVDEzNyAyMTRRMTM3IDE4MiAxNDcgMTU1VDE3NiAxMDlUMjIwIDc4VDI3NSA2N1pNMjc3IDU1NVEyNzUgNTU4IDI4NiA1NzRUMzE4IDYxMVQzNjMgNjUzVDQxMyA2OTBRNDM3IDcwNSA0NjIgNzA1UTQ4MiA3MDUgNDkzIDY5M1Q1MDUgNjYzUTUwNSA2NDcgNDkzIDYzM1Q0NTkgNjA1UTQzMCA1ODggMzk5IDU3N1QzNDEgNTYwVDI5NyA1NTNUMjc3IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY0OyIgZ2x5cGgtbmFtZT0ib2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzEgLTEyUTIyMSAtMTIgMTgwIDRUMTA5IDUwVDYzIDEyMVQ0NiAyMTBRNDYgMjY2IDY1IDMxN1QxMjEgNDA3VDIwNyA0NjlUMzE4IDQ5M1EzNjcgNDkzIDQwOCA0NzdUNDgwIDQzMVQ1MjYgMzYwVDU0MyAyNzFRNTQzIDIxNSA1MjQgMTY0VDQ2OCA3NFQzODIgMTJUMjcxIC0xMlpNMjc1IDY3UTMxMyA2NyAzNDUgODNUNDAxIDEyN1Q0MzggMTkxVDQ1MiAyNjdRNDUyIDI5OSA0NDIgMzI2VDQxMyAzNzJUMzY5IDQwM1QzMTQgNDE0UTI3NiA0MTQgMjQ0IDM5OFQxODggMzU0VDE1MSAyOTBUMTM3IDIxNFExMzcgMTgyIDE0NyAxNTVUMTc2IDEwOVQyMjAgNzhUMjc1IDY3Wk0yMzggNTQ3UTIyNCA1NDcgMjE3IDU1NVQyMDkgNTc1UTIwOSA1OTQgMjI2IDYxNVQyNzUgNjYzUTI5MSA2NzYgMzA3IDY4N1QzMzggNzA4VDM2MiA3MjJUMzc4IDcyOFEzODUgNzI2IDQwNiA3MDhUNDQ3IDY2NVE0NjkgNjM5IDQ3OCA2MjBUNDg4IDU4NlE0ODggNTY4IDQ3OCA1NThUNDUzIDU0N1E0MzcgNTQ3IDQyMyA1NjFUMzkxIDYwN1EzODYgNjE3IDM4MCA2MjhUMzY2IDY1M1EzNTUgNjQwIDM0NSA2MjlUMzIzIDYwNlEyOTggNTc4IDI3NyA1NjNUMjM4IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEY1OyIgZ2x5cGgtbmFtZT0ib3RpbGRlIiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjcxIC0xMlEyMjEgLTEyIDE4MCA0VDEwOSA1MFQ2MyAxMjFUNDYgMjEwUTQ2IDI2NiA2NSAzMTdUMTIxIDQwN1QyMDcgNDY5VDMxOCA0OTNRMzY3IDQ5MyA0MDggNDc3VDQ4MCA0MzFUNTI2IDM2MFQ1NDMgMjcxUTU0MyAyMTUgNTI0IDE2NFQ0NjggNzRUMzgyIDEyVDI3MSAtMTJaTTI3NSA2N1EzMTMgNjcgMzQ1IDgzVDQwMSAxMjdUNDM4IDE5MVQ0NTIgMjY3UTQ1MiAyOTkgNDQyIDMyNlQ0MTMgMzcyVDM2OSA0MDNUMzE0IDQxNFEyNzYgNDE0IDI0NCAzOThUMTg4IDM1NFQxNTEgMjkwVDEzNyAyMTRRMTM3IDE4MiAxNDcgMTU1VDE3NiAxMDlUMjIwIDc4VDI3NSA2N1pNNDIzIDU0NlEzOTYgNTQ2IDM2MCA1NjVUMjg4IDYyMVEyNzYgNTk1IDI2MSA1NzRUMjI5IDU1MlEyMTMgNTUyIDIwNSA1NjFUMTk3IDU4MVExOTcgNjAwIDIwNSA2MThUMjI1IDY1MVQyNTQgNjc0VDI4NyA2ODNRMzE0IDY4MyAzNTAgNjY0VDQyMiA2MDhRNDM0IDYzNCA0NDkgNjU1VDQ4MSA2NzdRNDk3IDY3NyA1MDUgNjY4VDUxMyA2NDhRNTEzIDYyOCA1MDUgNjEwVDQ4NSA1NzhUNDU2IDU1NVQ0MjMgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RjY7IiBnbHlwaC1uYW1lPSJvZGllcmVzaXMiIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzEgLTEyUTIyMSAtMTIgMTgwIDRUMTA5IDUwVDYzIDEyMVQ0NiAyMTBRNDYgMjY2IDY1IDMxN1QxMjEgNDA3VDIwNyA0NjlUMzE4IDQ5M1EzNjcgNDkzIDQwOCA0NzdUNDgwIDQzMVQ1MjYgMzYwVDU0MyAyNzFRNTQzIDIxNSA1MjQgMTY0VDQ2OCA3NFQzODIgMTJUMjcxIC0xMlpNMjc1IDY3UTMxMyA2NyAzNDUgODNUNDAxIDEyN1Q0MzggMTkxVDQ1MiAyNjdRNDUyIDI5OSA0NDIgMzI2VDQxMyAzNzJUMzY5IDQwM1QzMTQgNDE0UTI3NiA0MTQgMjQ0IDM5OFQxODggMzU0VDE1MSAyOTBUMTM3IDIxNFExMzcgMTgyIDE0NyAxNTVUMTc2IDEwOVQyMjAgNzhUMjc1IDY3Wk00NDMgNTQ2UTQxNCA1NDYgMzk5IDU1OFQzODQgNTk0UTM4NCA2MjMgNDAxIDY0M1Q0NDcgNjYzUTQ3NiA2NjMgNDkxIDY1MVQ1MDYgNjE1UTUwNiA1ODYgNDg5IDU2NlQ0NDMgNTQ2Wk0yNjAgNTQ2UTIzMSA1NDYgMjE2IDU1OFQyMDEgNTk0UTIwMSA2MjMgMjE4IDY0M1QyNjQgNjYzUTI5MyA2NjMgMzA3IDY1MVQzMjIgNjE1UTMyMiA1ODYgMzA2IDU2NlQyNjAgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjc7IiBnbHlwaC1uYW1lPSJkaXZpZGUiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik0zNTIgMzc4UTI5OSAzNzggMjk5IDQxN1EyOTkgNDM1IDMwMyA0NTBUMzE4IDQ3NlEzMjYgNDg0IDMzNiA0ODdUMzYzIDQ5MVE0MTYgNDkxIDQxNiA0NTJRNDE2IDQzNCA0MTIgNDE5VDM5NyAzOTNRMzg5IDM4NSAzNzkgMzgyVDM1MiAzNzhaTTI4MCAzOFEyMjcgMzggMjI3IDc4UTIyNyA5NSAyMzEgMTEwVDI0NiAxMzZRMjU0IDE0NCAyNjQgMTQ3VDI5MSAxNTFRMzQ0IDE1MSAzNDQgMTEyUTM0NCA5NCAzNDAgNzlUMzI1IDUzUTMxNyA0NSAzMDcgNDJUMjgwIDM4Wk0xMzMgMjI0UTkwIDIyNCA5NiAyNThROTYgMjYxIDk4IDI2OFQxMDMgMjc5UTEwOCAyOTIgMTE4IDI5OFQxNDggMzA1SDUxMVE1MzQgMzA1IDU0MiAyOTdUNTQ3IDI3MVE1NDcgMjY3IDU0NSAyNjBUNTQwIDI1MFE1MzUgMjM3IDUyNiAyMzFUNDk2IDIyNEgxMzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGODsiIGdseXBoLW5hbWU9Im9zbGFzaCIgaG9yaXotYWR2LXg9IjU4OCIgZD0iTTQxIC0zNVEzOSAtMzcgMzMgLTM1VDIwIC0yN1Q4IC0xM1QyIDRRMiAxMyA4IDI0VDI4IDQ4TDc4IDkyUTYzIDExOCA1NSAxNDdUNDYgMjEwUTQ2IDI2NiA2NSAzMTdUMTIxIDQwN1QyMDcgNDY5VDMxOCA0OTNRMzYwIDQ5MyAzOTcgNDc5VDQ2NCA0NDFMNTQ0IDUxNVE1NDYgNTE2IDU1MiA1MTRUNTY1IDUwN1Q1NzcgNDk0VDU4MyA0NzdRNTgzIDQ2NyA1NzcgNDU2VDU1NyA0MzJMNTEwIDM4OVE1NDMgMzM2IDU0MyAyNzFRNTQzIDIxNSA1MjQgMTY0VDQ2OCA3NFQzODIgMTJUMjcxIC0xMlEyMjggLTEyIDE5MSAxVDEyNCA0MEw0MSAtMzVaTTI3NiA2NVEzMTQgNjUgMzQ2IDgxVDQwMiAxMjZUNDM5IDE5MFQ0NTMgMjY3UTQ1MyAzMDEgNDQwIDMzMkwxODMgMTAxUTIyMSA2NSAyNzYgNjVaTTEzNiAyMTRRMTM2IDE3OCAxNDkgMTQ5TDQwNSAzODFRMzg2IDM5OCAzNjMgNDA3VDMxMyA0MTZRMjc1IDQxNiAyNDMgNDAwVDE4NyAzNTVUMTUwIDI5MVQxMzYgMjE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Rjk7IiBnbHlwaC1uYW1lPSJ1Z3JhdmUiIGhvcml6LWFkdi14PSI1OTIiIGQ9Ik00NjMgLTlRNDE4IC05IDM5OSAxNFQzODEgODBRMzUzIDM2IDMxMiAxMlQyMTkgLTEyUTE3MiAtMTIgMTM5IDRUODYgNDlUNjEgMTE5VDY2IDIwOUwxMjMgNDgxSDIyMkwxNjUgMjEwUTE1MSAxNTAgMTc0IDExMlQyNTQgNzRRMzAyIDc0IDMzNSA5OFQzOTcgMTcwTDQ2MyA0ODFINTYxTDQ4MyAxMTBRNDc1IDcyIDQ4MyA1N1Q1MjIgMzhRNTIzIDM4IDUyMiAzMVQ1MTYgMTVUNDk4IC0xVDQ2MyAtOVpNNDAyIDU1NVEzOTkgNTUyIDM4MyA1NTNUMzQ0IDU2MlQyOTMgNTgyVDI0MCA2MTNRMjAzIDY0MCAyMDMgNjcyUTIwMyA2OTAgMjE2IDcwMlQyNDggNzE1UTI2MCA3MTUgMjczIDcxMFQyOTcgNjk1UTMxOSA2NzggMzM5IDY1NVQzNzQgNjExVDM5NiA1NzRUNDAyIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZBOyIgZ2x5cGgtbmFtZT0idWFjdXRlIiBob3Jpei1hZHYteD0iNTkyIiBkPSJNNDYzIC05UTQxOCAtOSAzOTkgMTRUMzgxIDgwUTM1MyAzNiAzMTIgMTJUMjE5IC0xMlExNzIgLTEyIDEzOSA0VDg2IDQ5VDYxIDExOVQ2NiAyMDlMMTIzIDQ4MUgyMjJMMTY1IDIxMFExNTEgMTUwIDE3NCAxMTJUMjU0IDc0UTMwMiA3NCAzMzUgOThUMzk3IDE3MEw0NjMgNDgxSDU2MUw0ODMgMTEwUTQ3NSA3MiA0ODMgNTdUNTIyIDM4UTUyMyAzOCA1MjIgMzFUNTE2IDE1VDQ5OCAtMVQ0NjMgLTlaTTI4NCA1NTVRMjgyIDU1OCAyOTMgNTc0VDMyNSA2MTFUMzcwIDY1M1Q0MjAgNjkwUTQ0NCA3MDUgNDY5IDcwNVE0ODkgNzA1IDUwMCA2OTNUNTEyIDY2M1E1MTIgNjQ3IDUwMCA2MzNUNDY2IDYwNVE0MzcgNTg4IDQwNiA1NzdUMzQ4IDU2MFQzMDQgNTUzVDI4NCA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjsiIGdseXBoLW5hbWU9InVjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNTkyIiBkPSJNNDYzIC05UTQxOCAtOSAzOTkgMTRUMzgxIDgwUTM1MyAzNiAzMTIgMTJUMjE5IC0xMlExNzIgLTEyIDEzOSA0VDg2IDQ5VDYxIDExOVQ2NiAyMDlMMTIzIDQ4MUgyMjJMMTY1IDIxMFExNTEgMTUwIDE3NCAxMTJUMjU0IDc0UTMwMiA3NCAzMzUgOThUMzk3IDE3MEw0NjMgNDgxSDU2MUw0ODMgMTEwUTQ3NSA3MiA0ODMgNTdUNTIyIDM4UTUyMyAzOCA1MjIgMzFUNTE2IDE1VDQ5OCAtMVQ0NjMgLTlaTTI0NSA1NDdRMjMxIDU0NyAyMjQgNTU1VDIxNiA1NzVRMjE2IDU5NCAyMzMgNjE1VDI4MiA2NjNRMjk4IDY3NiAzMTQgNjg3VDM0NSA3MDhUMzY5IDcyMlQzODUgNzI4UTM5MiA3MjYgNDEzIDcwOFQ0NTQgNjY1UTQ3NiA2MzkgNDg1IDYyMFQ0OTUgNTg2UTQ5NSA1NjggNDg1IDU1OFQ0NjAgNTQ3UTQ0NCA1NDcgNDMwIDU2MVQzOTggNjA3UTM5MyA2MTcgMzg3IDYyOFQzNzMgNjUzUTM2MiA2NDAgMzUyIDYyOVQzMzAgNjA2UTMwNSA1NzggMjg0IDU2M1QyNDUgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkM7IiBnbHlwaC1uYW1lPSJ1ZGllcmVzaXMiIGhvcml6LWFkdi14PSI1OTIiIGQ9Ik00NjMgLTlRNDE4IC05IDM5OSAxNFQzODEgODBRMzUzIDM2IDMxMiAxMlQyMTkgLTEyUTE3MiAtMTIgMTM5IDRUODYgNDlUNjEgMTE5VDY2IDIwOUwxMjMgNDgxSDIyMkwxNjUgMjEwUTE1MSAxNTAgMTc0IDExMlQyNTQgNzRRMzAyIDc0IDMzNSA5OFQzOTcgMTcwTDQ2MyA0ODFINTYxTDQ4MyAxMTBRNDc1IDcyIDQ4MyA1N1Q1MjIgMzhRNTIzIDM4IDUyMiAzMVQ1MTYgMTVUNDk4IC0xVDQ2MyAtOVpNNDUwIDU0NlE0MjEgNTQ2IDQwNiA1NThUMzkxIDU5NFEzOTEgNjIzIDQwOCA2NDNUNDU0IDY2M1E0ODMgNjYzIDQ5OCA2NTFUNTEzIDYxNVE1MTMgNTg2IDQ5NiA1NjZUNDUwIDU0NlpNMjY3IDU0NlEyMzggNTQ2IDIyMyA1NThUMjA4IDU5NFEyMDggNjIzIDIyNSA2NDNUMjcxIDY2M1EzMDAgNjYzIDMxNCA2NTFUMzI5IDYxNVEzMjkgNTg2IDMxMyA1NjZUMjY3IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZEOyIgZ2x5cGgtbmFtZT0ieWFjdXRlIiBob3Jpei1hZHYteD0iNTI3IiBkPSJNMzcgLTIwM1EtMjEgLTIwMyAtNDYgLTE3N1EtNjIgLTE2MiAtNjIgLTE0MFEtNjIgLTEzMSAtNTggLTEyM1QtNDkgLTEwOFQtNDAgLTk5VC0zNCAtOTdRLTI1IC0xMDggLTggLTExNFQyMSAtMTIxUTM1IC0xMjEgNDkgLTExNlQ4MCAtOTZUMTE3IC01N1QxNjUgN0wxNzkgMjhRMTQ4IDM0IDE0MiA3NUwxMTQgMzI4UTEwOCAzODEgOTAgNDAzVDQwIDQyNlEzOSA0MjYgMzkgNDM1VDQ2IDQ1NlQ2NyA0NzdUMTA4IDQ4N1ExNTAgNDg3IDE3NCA0NTBUMjA3IDMyN0wyMjcgOTlMNDQ3IDQ4MUg1NDZMMjUxIC0yMVExOTUgLTExNiAxNDUgLTE1OVQzNyAtMjAzWk0yNjAgNTQ3UTI1OCA1NTAgMjY5IDU2NlQzMDEgNjAzVDM0NiA2NDVUMzk2IDY4MlE0MjAgNjk3IDQ0NSA2OTdRNDY1IDY5NyA0NzYgNjg1VDQ4OCA2NTVRNDg4IDYzOSA0NzYgNjI1VDQ0MiA1OTdRNDEzIDU4MCAzODIgNTY5VDMyNCA1NTJUMjgwIDU0NVQyNjAgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4RkU7IiBnbHlwaC1uYW1lPSJ0aG9ybiIgaG9yaXotYWR2LXg9IjYxNyIgZD0iTTMxMyAtMTJRMjUzIC0xMiAyMDkgMTZUMTQzIDg5TDkzIC0xNDlRODggLTE3NSA3OCAtMTg1VDQ4IC0xOTZIMzdRMTcgLTE5NiAzIC0xODZULTUgLTE0OUwxNjIgNjQwUTE2OCA2NjYgMTc4IDY3NlQyMDcgNjg3SDIxOVEyMzggNjg3IDI1MiA2NzdUMjYxIDY0MEwyMTEgNDA1UTI0MSA0NDcgMjgxIDQ3MFQzNzcgNDkzUTQxNSA0OTMgNDUwIDQ4MFQ1MTIgNDQwVDU1NSAzNzRUNTcxIDI4M1E1NzEgMjI3IDU1MyAxNzRUNTAwIDgwVDQxOSAxM1QzMTMgLTEyWk0zNTEgNDEyUTMwMSA0MTIgMjU5IDM4NVQxOTEgMzE0TDE3NCAyMzBRMTY4IDE5OCAxNzQgMTY5VDE5NyAxMThUMjQyIDgyVDMwNSA2OVEzNDUgNjkgMzc2IDg3VDQyOSAxMzRUNDYyIDIwMFQ0NzMgMjc2UTQ3MyAzMDggNDYzIDMzM1Q0MzcgMzc2VDM5OCA0MDNUMzUxIDQxMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZGOyIgZ2x5cGgtbmFtZT0ieWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNTI3IiBkPSJNMzcgLTIwM1EtMjEgLTIwMyAtNDYgLTE3N1EtNjIgLTE2MiAtNjIgLTE0MFEtNjIgLTEzMSAtNTggLTEyM1QtNDkgLTEwOFQtNDAgLTk5VC0zNCAtOTdRLTI1IC0xMDggLTggLTExNFQyMSAtMTIxUTM1IC0xMjEgNDkgLTExNlQ4MCAtOTZUMTE3IC01N1QxNjUgN0wxNzkgMjhRMTQ4IDM0IDE0MiA3NUwxMTQgMzI4UTEwOCAzODEgOTAgNDAzVDQwIDQyNlEzOSA0MjYgMzkgNDM1VDQ2IDQ1NlQ2NyA0NzdUMTA4IDQ4N1ExNTAgNDg3IDE3NCA0NTBUMjA3IDMyN0wyMjcgOTlMNDQ3IDQ4MUg1NDZMMjUxIC0yMVExOTUgLTExNiAxNDUgLTE1OVQzNyAtMjAzWk00MTUgNTQ2UTM4NiA1NDYgMzcxIDU1OFQzNTYgNTk0UTM1NiA2MjMgMzczIDY0M1Q0MTkgNjYzUTQ0OCA2NjMgNDYzIDY1MVQ0NzggNjE1UTQ3OCA1ODYgNDYxIDU2NlQ0MTUgNTQ2Wk0yMzIgNTQ2UTIwMyA1NDYgMTg4IDU1OFQxNzMgNTk0UTE3MyA2MjMgMTkwIDY0M1QyMzYgNjYzUTI2NSA2NjMgMjc5IDY1MVQyOTQgNjE1UTI5NCA1ODYgMjc4IDU2NlQyMzIgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTAwOyIgZ2x5cGgtbmFtZT0iQW1hY3JvbiIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTS0zMyAwTDMzOSA2MjJRMzQ5IDYzOSAzNjIgNjQ2VDQwNSA2NTRRNDQxIDY1NCA0NTQgNjQ0VDQ3MSA2MTZMNTkzIDBINDg4TDQ1MSAxOTBIMTkxTDgyIDBILTMzWk00NDEgMjczTDM5MSA1NDZMMjMzIDI3M0g0NDFaTTMxMyA3MjFRMjczIDcyMSAyNzMgNzQ3UTI3MyA3NTYgMjc2IDc3MFQyODggNzkzUTI5OCA4MDMgMzI0IDgwM0g1NDhRNTg5IDgwMyA1ODkgNzc3UTU4OSA3NjkgNTg1IDc1NVQ1NzMgNzMyUTU2MyA3MjEgNTM3IDcyMUgzMTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDE7IiBnbHlwaC1uYW1lPSJhbWFjcm9uIiBob3Jpei1hZHYteD0iNjIyIiBkPSJNNDk1IC05UTQ0OCAtOSA0MjkgMTdUNDE0IDkwUTM4MyA0MCAzMzYgMTRUMjM0IC0xMlExOTUgLTEyIDE2MSAxVDEwMSA0MFQ2MSAxMDNUNDYgMTg5UTQ2IDI0NiA2NiAzMDBUMTIxIDM5N1QyMDYgNDY2VDMxNSA0OTNRMzcxIDQ5MyA0MTQgNDY4VDQ3OCA0MDBRNDgzIDQyMyA0ODcgNDM4VDQ5MyA0NjRRNDk2IDQ3NSA0OTcgNDgxSDU5M0w1MTUgMTEwUTUwNyA3MiA1MTUgNTdUNTU0IDM4UTU1NSAzOCA1NTQgMzFUNTQ4IDE1VDUzMCAtMVQ0OTUgLTlaTTI2MSA3MFEyOTQgNzAgMzI0IDgyVDM3OCAxMTdUNDE4IDE2OFQ0NDIgMjMxTDQ1OCAzMDZRNDQzIDM1NSA0MTAgMzg0VDMyMSA0MTNRMjgwIDQxMyAyNDcgMzk0VDE5MSAzNDVUMTU2IDI3NlQxNDQgMTk4UTE0NCAxMzcgMTc4IDEwNFQyNjEgNzBaTTI3MCA1NjJRMjMwIDU2MiAyMzAgNTg4UTIzMCA1OTcgMjMzIDYxMVQyNDUgNjM0UTI1NSA2NDQgMjgxIDY0NEg1MDVRNTQ2IDY0NCA1NDYgNjE4UTU0NiA2MTAgNTQyIDU5NlQ1MzAgNTczUTUyMCA1NjIgNDk0IDU2MkgyNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDI7IiBnbHlwaC1uYW1lPSJBYnJldmUiIGhvcml6LWFkdi14PSI2NjUiIGQ9Ik0tMzMgMEwzMzkgNjIyUTM0OSA2MzkgMzYyIDY0NlQ0MDUgNjU0UTQ0MSA2NTQgNDU0IDY0NFQ0NzEgNjE2TDU5MyAwSDQ4OEw0NTEgMTkwSDE5MUw4MiAwSC0zM1pNNDQxIDI3M0wzOTEgNTQ2TDIzMyAyNzNINDQxWk00MzEgNzA1UTQwNCA3MDUgMzc4IDcxNVQzMzIgNzQyVDI5OSA3NzhUMjg3IDgxN1EyODcgODMxIDI5NiA4NDJUMzIyIDg1NFEzNDIgODU0IDM2OCA4MzRUNDMwIDc2M1E0NzMgODExIDUwMyA4MzJUNTU2IDg1NFE1NzIgODU0IDU4MiA4NDVUNTkyIDgyMVE1OTIgODA0IDU3OCA3ODRUNTQyIDc0N1Q0OTAgNzE3VDQzMSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDM7IiBnbHlwaC1uYW1lPSJhYnJldmUiIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik00OTUgLTlRNDQ4IC05IDQyOSAxN1Q0MTQgOTBRMzgzIDQwIDMzNiAxNFQyMzQgLTEyUTE5NSAtMTIgMTYxIDFUMTAxIDQwVDYxIDEwM1Q0NiAxODlRNDYgMjQ2IDY2IDMwMFQxMjEgMzk3VDIwNiA0NjZUMzE1IDQ5M1EzNzEgNDkzIDQxNCA0NjhUNDc4IDQwMFE0ODMgNDIzIDQ4NyA0MzhUNDkzIDQ2NFE0OTYgNDc1IDQ5NyA0ODFINTkzTDUxNSAxMTBRNTA3IDcyIDUxNSA1N1Q1NTQgMzhRNTU1IDM4IDU1NCAzMVQ1NDggMTVUNTMwIC0xVDQ5NSAtOVpNMjYxIDcwUTI5NCA3MCAzMjQgODJUMzc4IDExN1Q0MTggMTY4VDQ0MiAyMzFMNDU4IDMwNlE0NDMgMzU1IDQxMCAzODRUMzIxIDQxM1EyODAgNDEzIDI0NyAzOTRUMTkxIDM0NVQxNTYgMjc2VDE0NCAxOThRMTQ0IDEzNyAxNzggMTA0VDI2MSA3MFpNMzg5IDU0NlEzNjIgNTQ2IDMzNiA1NTZUMjkwIDU4M1QyNTcgNjE5VDI0NSA2NThRMjQ1IDY3MiAyNTQgNjgzVDI4MCA2OTVRMzAwIDY5NSAzMjYgNjc1VDM4OCA2MDRRNDMxIDY1MiA0NjEgNjczVDUxNCA2OTVRNTMwIDY5NSA1NDAgNjg2VDU1MCA2NjJRNTUwIDY0NSA1MzYgNjI1VDUwMCA1ODhUNDQ4IDU1OFQzODkgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA0OyIgZ2x5cGgtbmFtZT0iQW9nb25layIgaG9yaXotYWR2LXg9IjY2NSIgZD0iTS0zMyAwTDMzOSA2MjJRMzQ5IDYzOSAzNjIgNjQ2VDQwNSA2NTRRNDQxIDY1NCA0NTQgNjQ0VDQ3MSA2MTZMNTkzIDBINTU1UTQ5OSAtMzIgNDgwIC01N1Q0NjEgLTEwMlE0NjEgLTEzMyA0OTIgLTEzM1E1MTMgLTEzMyA1MjcgLTExNlE1MzggLTExOCA1NDYgLTEyNlQ1NTQgLTE0OVE1NTQgLTE3MiA1MzQgLTE4N1Q0NzcgLTIwMlE0MzUgLTIwMiA0MDggLTE4MFQzODEgLTEyMFEzODEgLTg2IDQwNyAtNTRUNDg4IDFMNDUxIDE5MEgxOTFMODIgMEgtMzNaTTQ0MSAyNzNMMzkxIDU0NkwyMzMgMjczSDQ0MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwNTsiIGdseXBoLW5hbWU9ImFvZ29uZWsiIGhvcml6LWFkdi14PSI2MjIiIGQ9Ik01NTQgMzhRNTU0IDM4IDU1NCAzNFQ1NTEgMjJUNTQyIDhUNTI2IC0zUTQ2OCAtMzYgNDQ5IC02MVQ0MjkgLTEwN1E0MjkgLTEzOCA0NjAgLTEzOFE0ODEgLTEzOCA0OTUgLTEyMVE1MDYgLTEyMyA1MTQgLTEzMVQ1MjIgLTE1NFE1MjIgLTE3NyA1MDIgLTE5MlQ0NDUgLTIwN1E0MDMgLTIwNyAzNzYgLTE4NVQzNDkgLTEyNVEzNDkgLTkwIDM3NiAtNThUNDU4IC0zUTQzMiA3IDQyMSAzMVQ0MTQgOTBRMzgzIDQwIDMzNiAxNFQyMzQgLTEyUTE5NSAtMTIgMTYxIDFUMTAxIDQwVDYxIDEwM1Q0NiAxODlRNDYgMjQ2IDY2IDMwMFQxMjEgMzk3VDIwNiA0NjZUMzE1IDQ5M1EzNzEgNDkzIDQxNCA0NjhUNDc4IDQwMFE0ODMgNDIzIDQ4NyA0MzhUNDkzIDQ2NFE0OTYgNDc1IDQ5NyA0ODFINTkzTDUxNSAxMTBRNTA3IDcyIDUxNSA1N1Q1NTQgMzhaTTI2MSA3MFEyOTQgNzAgMzI0IDgyVDM3OCAxMTdUNDE4IDE2OFQ0NDIgMjMxTDQ1OCAzMDZRNDQzIDM1NSA0MTAgMzg0VDMyMSA0MTNRMjgwIDQxMyAyNDcgMzk0VDE5MSAzNDVUMTU2IDI3NlQxNDQgMTk4UTE0NCAxMzcgMTc4IDEwNFQyNjEgNzBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDY7IiBnbHlwaC1uYW1lPSJDYWN1dGUiIGhvcml6LWFkdi14PSI2ODMiIGQ9Ik0zNzEgLTEyUTMwMyAtMTIgMjQ4IDdUMTU0IDYzVDk0IDE1MlQ3MiAyNzBRNzIgMzQ4IDk5IDQxOVQxNzUgNTQzVDI5MCA2MjdUNDM1IDY1OVE1MTAgNjU5IDU1OCA2MzhUNjM0IDU4OFE2NTYgNTY3IDY2NiA1NDVUNjc2IDUwN1E2NzYgNDg3IDY2NiA0NzVUNjQ0IDQ1N1Q2MjEgNDUwVDYwOCA0NTBRNTY0IDU2OCA0MzQgNTY4UTM4MCA1NjggMzM0IDU0NVQyNTMgNDgzVDIwMCAzOTNUMTgwIDI4M1ExODAgMjM2IDE5NCAxOTlUMjM0IDEzNVQyOTYgOTVUMzc1IDgwUTQzOCA4MCA0ODUgMTA1VDU2MSAxNzVRNTYyIDE3NiA1NzAgMTc0VDU4OCAxNjZUNjA1IDE1MFQ2MTMgMTI0UTYxMyA5NiA1ODEgNjRRNTUxIDM0IDQ5NiAxMVQzNzEgLTEyWk0zNjUgNzE0UTM2MyA3MTcgMzc0IDczM1Q0MDYgNzcwVDQ1MSA4MTJUNTAxIDg0OVE1MjUgODY0IDU1MCA4NjRRNTcwIDg2NCA1ODEgODUyVDU5MyA4MjJRNTkzIDgwNiA1ODEgNzkyVDU0NyA3NjRRNTE4IDc0NyA0ODcgNzM2VDQyOSA3MTlUMzg1IDcxMlQzNjUgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTA3OyIgZ2x5cGgtbmFtZT0iY2FjdXRlIiBob3Jpei1hZHYteD0iNTUwIiBkPSJNMjc3IC0xMlEyMjcgLTEyIDE4NSAzVDExMSA0NlQ2MiAxMTZUNDQgMjEwUTQ0IDI2NiA2NSAzMTdUMTIzIDQwN1QyMTAgNDY5VDMxOCA0OTNRMzc5IDQ5MyA0MjAgNDc2VDQ4NyA0MzJRNTA3IDQxMiA1MTYgMzkxVDUyNiAzNTJRNTI2IDMzMSA1MTYgMzIwVDQ5NCAzMDNUNDcxIDI5OFQ0NjAgMzAxUTQ1MSAzNDkgNDE2IDM3OVQzMjEgNDEwUTI4MCA0MTAgMjQ3IDM5NFQxOTAgMzUwVDE1MyAyODhUMTQwIDIxN1ExNDAgMTUyIDE3OSAxMTJUMjg2IDcxUTMzNSA3MSAzNjggOTNUNDI1IDE1MlE0MjYgMTUzIDQzNCAxNTJUNDUxIDE0NlQ0NjcgMTMyVDQ3NSAxMDlRNDc1IDgyIDQ0MyA1MFE0MTcgMjUgMzc1IDdUMjc3IC0xMlpNMjU4IDU1NVEyNTYgNTU4IDI2NyA1NzRUMjk5IDYxMVQzNDQgNjUzVDM5NCA2OTBRNDE4IDcwNSA0NDMgNzA1UTQ2MyA3MDUgNDc0IDY5M1Q0ODYgNjYzUTQ4NiA2NDcgNDc0IDYzM1Q0NDAgNjA1UTQxMSA1ODggMzgwIDU3N1QzMjIgNTYwVDI3OCA1NTNUMjU4IDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwODsiIGdseXBoLW5hbWU9IkNjaXJjdW1mbGV4IiBob3Jpei1hZHYteD0iNjgzIiBkPSJNMzcxIC0xMlEzMDMgLTEyIDI0OCA3VDE1NCA2M1Q5NCAxNTJUNzIgMjcwUTcyIDM0OCA5OSA0MTlUMTc1IDU0M1QyOTAgNjI3VDQzNSA2NTlRNTEwIDY1OSA1NTggNjM4VDYzNCA1ODhRNjU2IDU2NyA2NjYgNTQ1VDY3NiA1MDdRNjc2IDQ4NyA2NjYgNDc1VDY0NCA0NTdUNjIxIDQ1MFQ2MDggNDUwUTU2NCA1NjggNDM0IDU2OFEzODAgNTY4IDMzNCA1NDVUMjUzIDQ4M1QyMDAgMzkzVDE4MCAyODNRMTgwIDIzNiAxOTQgMTk5VDIzNCAxMzVUMjk2IDk1VDM3NSA4MFE0MzggODAgNDg1IDEwNVQ1NjEgMTc1UTU2MiAxNzYgNTcwIDE3NFQ1ODggMTY2VDYwNSAxNTBUNjEzIDEyNFE2MTMgOTYgNTgxIDY0UTU1MSAzNCA0OTYgMTFUMzcxIC0xMlpNMzQzIDcwNlEzMjkgNzA2IDMyMiA3MTRUMzE0IDczNFEzMTQgNzUzIDMzMSA3NzRUMzgwIDgyMlEzOTYgODM1IDQxMiA4NDZUNDQzIDg2N1Q0NjcgODgxVDQ4MyA4ODdRNDkwIDg4NSA1MTEgODY3VDU1MiA4MjRRNTc0IDc5OCA1ODMgNzc5VDU5MyA3NDVRNTkzIDcyNyA1ODMgNzE3VDU1OCA3MDZRNTQyIDcwNiA1MjggNzIwVDQ5NiA3NjZRNDkxIDc3NiA0ODUgNzg3VDQ3MSA4MTJRNDYwIDc5OSA0NTAgNzg4VDQyOCA3NjVRNDAzIDczNyAzODIgNzIyVDM0MyA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMDk7IiBnbHlwaC1uYW1lPSJjY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU1MCIgZD0iTTI3NyAtMTJRMjI3IC0xMiAxODUgM1QxMTEgNDZUNjIgMTE2VDQ0IDIxMFE0NCAyNjYgNjUgMzE3VDEyMyA0MDdUMjEwIDQ2OVQzMTggNDkzUTM3OSA0OTMgNDIwIDQ3NlQ0ODcgNDMyUTUwNyA0MTIgNTE2IDM5MVQ1MjYgMzUyUTUyNiAzMzEgNTE2IDMyMFQ0OTQgMzAzVDQ3MSAyOThUNDYwIDMwMVE0NTEgMzQ5IDQxNiAzNzlUMzIxIDQxMFEyODAgNDEwIDI0NyAzOTRUMTkwIDM1MFQxNTMgMjg4VDE0MCAyMTdRMTQwIDE1MiAxNzkgMTEyVDI4NiA3MVEzMzUgNzEgMzY4IDkzVDQyNSAxNTJRNDI2IDE1MyA0MzQgMTUyVDQ1MSAxNDZUNDY3IDEzMlQ0NzUgMTA5UTQ3NSA4MiA0NDMgNTBRNDE3IDI1IDM3NSA3VDI3NyAtMTJaTTIyOSA1NDdRMjE1IDU0NyAyMDggNTU1VDIwMCA1NzVRMjAwIDU5NCAyMTcgNjE1VDI2NiA2NjNRMjgyIDY3NiAyOTggNjg3VDMyOSA3MDhUMzUzIDcyMlQzNjkgNzI4UTM3NiA3MjYgMzk3IDcwOFQ0MzggNjY1UTQ2MCA2MzkgNDY5IDYyMFQ0NzkgNTg2UTQ3OSA1NjggNDY5IDU1OFQ0NDQgNTQ3UTQyOCA1NDcgNDE0IDU2MVQzODIgNjA3UTM3NyA2MTcgMzcxIDYyOFQzNTcgNjUzUTM0NiA2NDAgMzM2IDYyOVQzMTQgNjA2UTI4OSA1NzggMjY4IDU2M1QyMjkgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBBOyIgZ2x5cGgtbmFtZT0iQ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjY4MyIgZD0iTTM3MSAtMTJRMzAzIC0xMiAyNDggN1QxNTQgNjNUOTQgMTUyVDcyIDI3MFE3MiAzNDggOTkgNDE5VDE3NSA1NDNUMjkwIDYyN1Q0MzUgNjU5UTUxMCA2NTkgNTU4IDYzOFQ2MzQgNTg4UTY1NiA1NjcgNjY2IDU0NVQ2NzYgNTA3UTY3NiA0ODcgNjY2IDQ3NVQ2NDQgNDU3VDYyMSA0NTBUNjA4IDQ1MFE1NjQgNTY4IDQzNCA1NjhRMzgwIDU2OCAzMzQgNTQ1VDI1MyA0ODNUMjAwIDM5M1QxODAgMjgzUTE4MCAyMzYgMTk0IDE5OVQyMzQgMTM1VDI5NiA5NVQzNzUgODBRNDM4IDgwIDQ4NSAxMDVUNTYxIDE3NVE1NjIgMTc2IDU3MCAxNzRUNTg4IDE2NlQ2MDUgMTUwVDYxMyAxMjRRNjEzIDk2IDU4MSA2NFE1NTEgMzQgNDk2IDExVDM3MSAtMTJaTTQ1NSA3MDZRNDIzIDcwNiA0MDcgNzIwVDM5MSA3NTdRMzkxIDc4NyA0MDkgODA5VDQ1OSA4MzFRNDkxIDgzMSA1MDYgODE3VDUyMiA3ODBRNTIyIDc1MCA1MDUgNzI4VDQ1NSA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEI7IiBnbHlwaC1uYW1lPSJjZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTUwIiBkPSJNMjc3IC0xMlEyMjcgLTEyIDE4NSAzVDExMSA0NlQ2MiAxMTZUNDQgMjEwUTQ0IDI2NiA2NSAzMTdUMTIzIDQwN1QyMTAgNDY5VDMxOCA0OTNRMzc5IDQ5MyA0MjAgNDc2VDQ4NyA0MzJRNTA3IDQxMiA1MTYgMzkxVDUyNiAzNTJRNTI2IDMzMSA1MTYgMzIwVDQ5NCAzMDNUNDcxIDI5OFQ0NjAgMzAxUTQ1MSAzNDkgNDE2IDM3OVQzMjEgNDEwUTI4MCA0MTAgMjQ3IDM5NFQxOTAgMzUwVDE1MyAyODhUMTQwIDIxN1ExNDAgMTUyIDE3OSAxMTJUMjg2IDcxUTMzNSA3MSAzNjggOTNUNDI1IDE1MlE0MjYgMTUzIDQzNCAxNTJUNDUxIDE0NlQ0NjcgMTMyVDQ3NSAxMDlRNDc1IDgyIDQ0MyA1MFE0MTcgMjUgMzc1IDdUMjc3IC0xMlpNMzUwIDU0N1EzMTggNTQ3IDMwMiA1NjFUMjg2IDU5OFEyODYgNjI4IDMwNCA2NTBUMzU0IDY3MlEzODYgNjcyIDQwMSA2NThUNDE3IDYyMVE0MTcgNTkxIDQwMCA1NjlUMzUwIDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEwQzsiIGdseXBoLW5hbWU9IkNjYXJvbiIgaG9yaXotYWR2LXg9IjY4MyIgZD0iTTM3MSAtMTJRMzAzIC0xMiAyNDggN1QxNTQgNjNUOTQgMTUyVDcyIDI3MFE3MiAzNDggOTkgNDE5VDE3NSA1NDNUMjkwIDYyN1Q0MzUgNjU5UTUxMCA2NTkgNTU4IDYzOFQ2MzQgNTg4UTY1NiA1NjcgNjY2IDU0NVQ2NzYgNTA3UTY3NiA0ODcgNjY2IDQ3NVQ2NDQgNDU3VDYyMSA0NTBUNjA4IDQ1MFE1NjQgNTY4IDQzNCA1NjhRMzgwIDU2OCAzMzQgNTQ1VDI1MyA0ODNUMjAwIDM5M1QxODAgMjgzUTE4MCAyMzYgMTk0IDE5OVQyMzQgMTM1VDI5NiA5NVQzNzUgODBRNDM4IDgwIDQ4NSAxMDVUNTYxIDE3NVE1NjIgMTc2IDU3MCAxNzRUNTg4IDE2NlQ2MDUgMTUwVDYxMyAxMjRRNjEzIDk2IDU4MSA2NFE1NTEgMzQgNDk2IDExVDM3MSAtMTJaTTQ0MSA2OTNRNDM0IDY5NSA0MTMgNzEzVDM3MiA3NTZRMzUwIDc4MiAzNDEgODEwVDMzMSA4NTFRMzMxIDg3MCAzNDEgODcyVDM2NiA4NzVRMzk1IDg3NSA0MjggODE0UTQzMyA4MDUgNDM5IDc5NFQ0NTMgNzY4TDQ5NiA4MTZRNTIxIDg0MyA1NDIgODU5VDU4MSA4NzVRNTk1IDg3NSA2MDIgODY3VDYxMCA4NDdRNjEwIDgyNyA1OTMgODA2VDU0NCA3NThRNTI4IDc0NSA1MTIgNzM0VDQ4MSA3MTRUNDU3IDcwMFQ0NDEgNjkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTBEOyIgZ2x5cGgtbmFtZT0iY2Nhcm9uIiBob3Jpei1hZHYteD0iNTUwIiBkPSJNMjc3IC0xMlEyMjcgLTEyIDE4NSAzVDExMSA0NlQ2MiAxMTZUNDQgMjEwUTQ0IDI2NiA2NSAzMTdUMTIzIDQwN1QyMTAgNDY5VDMxOCA0OTNRMzc5IDQ5MyA0MjAgNDc2VDQ4NyA0MzJRNTA3IDQxMiA1MTYgMzkxVDUyNiAzNTJRNTI2IDMzMSA1MTYgMzIwVDQ5NCAzMDNUNDcxIDI5OFQ0NjAgMzAxUTQ1MSAzNDkgNDE2IDM3OVQzMjEgNDEwUTI4MCA0MTAgMjQ3IDM5NFQxOTAgMzUwVDE1MyAyODhUMTQwIDIxN1ExNDAgMTUyIDE3OSAxMTJUMjg2IDcxUTMzNSA3MSAzNjggOTNUNDI1IDE1MlE0MjYgMTUzIDQzNCAxNTJUNDUxIDE0NlQ0NjcgMTMyVDQ3NSAxMDlRNDc1IDgyIDQ0MyA1MFE0MTcgMjUgMzc1IDdUMjc3IC0xMlpNMzM4IDUzMlEzMzEgNTM0IDMxMCA1NTJUMjY5IDU5NVEyNDcgNjIxIDIzOCA2NDlUMjI4IDY5MFEyMjggNzA5IDIzOCA3MTFUMjYzIDcxNFEyOTIgNzE0IDMyNSA2NTNRMzMwIDY0NCAzMzYgNjMzVDM1MCA2MDdMMzkzIDY1NVE0MTggNjgyIDQzOSA2OThUNDc4IDcxNFE0OTIgNzE0IDQ5OSA3MDZUNTA3IDY4NlE1MDcgNjY2IDQ5MCA2NDVUNDQxIDU5N1E0MjUgNTg0IDQwOSA1NzNUMzc4IDU1M1QzNTQgNTM5VDMzOCA1MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEU7IiBnbHlwaC1uYW1lPSJEY2Fyb24iIGhvcml6LWFkdi14PSI3MDAiIGQ9Ik0xNjAgNTkwUTE2OSA2NDcgMjI3IDY0N0gzNDNRNDkzIDY0NyA1NzYgNTc3VDY2MCAzNzhRNjYwIDMwMSA2MzUgMjMyVDU2MCAxMTJUNDM0IDMwVDI1NyAwSDM0TDE2MCA1OTBaTTI3MiA4OVEzNDQgODkgMzk3IDExMVQ0ODYgMTcxVDUzOCAyNThUNTU1IDM2NFE1NTUgNDU1IDQ5OCA1MDZUMzM0IDU1OEgyNTVMMTU2IDg5SDI3MlpNNDA2IDY5MVEzOTkgNjkzIDM3OCA3MTFUMzM3IDc1NFEzMTUgNzgwIDMwNiA4MDhUMjk2IDg0OVEyOTYgODY4IDMwNiA4NzBUMzMxIDg3M1EzNjAgODczIDM5MyA4MTJRMzk4IDgwMyA0MDQgNzkyVDQxOCA3NjZMNDYxIDgxNFE0ODYgODQxIDUwNyA4NTdUNTQ2IDg3M1E1NjAgODczIDU2NyA4NjVUNTc1IDg0NVE1NzUgODI1IDU1OCA4MDRUNTA5IDc1NlE0OTMgNzQzIDQ3NyA3MzJUNDQ2IDcxMlQ0MjIgNjk4VDQwNiA2OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMEY7IiBnbHlwaC1uYW1lPSJkY2Fyb24iIGhvcml6LWFkdi14PSI4MDUiIGQ9Ik00OTUgLTlRNDUwIC05IDQzMCAxNVQ0MTMgODNRMzgyIDM3IDM0MSAxM1QyNDMgLTEyUTIwNCAtMTIgMTY5IDFUMTA4IDQyVDY1IDEwOFQ0OSAxOThRNDkgMjU0IDY3IDMwN1QxMjAgNDAxVDIwMSA0NjhUMzA3IDQ5M1EzNjQgNDkzIDQwOCA0NjlUNDc3IDQwMEw1MzggNjkwSDYzNUw1MTUgMTEwUTUwNiA3MiA1MTQgNTdUNTU0IDM4UTU1NSAzOCA1NTQgMzFUNTQ4IDE1VDUzMCAtMVQ0OTUgLTlaTTI2OSA3MFEzMDAgNzAgMzI4IDgxVDM3OCAxMTNUNDE3IDE2MVQ0NDAgMjIzTDQ1NyAzMDNRNDM5IDM1NCA0MDggMzgzVDMxNSA0MTNRMjc0IDQxMyAyNDMgMzk1VDE5MCAzNDhUMTU3IDI4MVQxNDYgMjA2UTE0NiAxNzQgMTU2IDE0OVQxODMgMTA2VDIyMiA3OVQyNjkgNzBaTTY4MSA0MjlRNjc3IDQyNSA2NjggNDI2VDY1MSA0MzFUNjM4IDQ0M1Q2MzYgNDU4TDc0NiA2ODFRNzQ3IDY4MyA3NjAgNjgzVDc5MCA2NzlUODE5IDY2NVQ4MzIgNjM3UTgzMiA2MjIgODI2IDYwOVQ4MDQgNTc4TDY4MSA0MjlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTA7IiBnbHlwaC1uYW1lPSJEY3JvYXQiIGhvcml6LWFkdi14PSI3MzkiIGQ9Ik0xNDAgMFE3MiAwIDg2IDY3TDEzMyAyODVIODFRNDYgMjg1IDQ2IDMwOVE0NiAzMTggNDkgMzMyVDYxIDM1NFE2NiAzNTkgNzMgMzYxVDkzIDM2M0gxNDlMMTk4IDU5MFEyMDcgNjQ3IDI2NSA2NDdIMzgyUTUzMyA2NDcgNjE2IDU3N1Q3MDAgMzc4UTcwMCAzMDEgNjc1IDIzMlQ2MDAgMTEyVDQ3MyAzMFQyOTYgMEgxNDBaTTMxMSA4OVEzODMgODkgNDM2IDExMVQ1MjUgMTcxVDU3NyAyNThUNTk0IDM2NFE1OTQgNDU1IDUzNyA1MDZUMzc0IDU1OEgyOTNMMjUyIDM2M0g0MjFRNDU5IDM2MyA0NTkgMzM5UTQ1OSAzMzEgNDU2IDMxN1Q0NDQgMjk1UTQzOSAyOTAgNDMyIDI4OFQ0MTAgMjg1SDIzNUwxOTQgODlIMzExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTExOyIgZ2x5cGgtbmFtZT0iZGNyb2F0IiBob3Jpei1hZHYteD0iNjIyIiBkPSJNNDk1IC05UTQ1MCAtOSA0MzAgMTVUNDEzIDgzUTM4MiAzNyAzNDEgMTNUMjQzIC0xMlEyMDQgLTEyIDE2OSAxVDEwOCA0MlQ2NSAxMDhUNDkgMTk4UTQ5IDI1NCA2NyAzMDdUMTIwIDQwMVQyMDEgNDY4VDMwNyA0OTNRMzY0IDQ5MyA0MDggNDY5VDQ3NyA0MDBMNTExIDU2M0g0MjBRMzg5IDU2MyAzODkgNTgxUTM4OSA1ODkgMzkzIDYwMVQ0MDIgNjE5UTQwOSA2MjcgNDI4IDYyN0g1MjVMNTM4IDY5MEg2MzVMNjIyIDYyN0g2NjdRNjk4IDYyNyA2OTggNjA5UTY5OCA2MDEgNjk1IDU4OVQ2ODYgNTcxUTY3OSA1NjMgNjYwIDU2M0g2MDhMNTE1IDExMFE1MDYgNzIgNTE0IDU3VDU1NCAzOFE1NTUgMzggNTU0IDMxVDU0OCAxNVQ1MzAgLTFUNDk1IC05Wk0yNjkgNzBRMzAwIDcwIDMyOCA4MVQzNzggMTEzVDQxNyAxNjFUNDQwIDIyM0w0NTcgMzAzUTQzOSAzNTQgNDA4IDM4M1QzMTUgNDEzUTI3NCA0MTMgMjQzIDM5NVQxOTAgMzQ4VDE1NyAyODFUMTQ2IDIwNlExNDYgMTc0IDE1NiAxNDlUMTgzIDEwNlQyMjIgNzlUMjY5IDcwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTEyOyIgZ2x5cGgtbmFtZT0iRW1hY3JvbiIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTE2MCA1OTBRMTcxIDY0NyAyMjcgNjQ3SDY1MFE2NDkgNjQxIDY0NyA2MzNRNjQ1IDYyNiA2NDQgNjE4VDY0MSA2MDFRNjM3IDU4MSA2MzEgNTU2SDI1NkwyMTcgMzc0SDUyMUw1MDMgMjg3SDE5OEwxNTcgOTFINTM4TDUxOSAwSDM0TDE2MCA1OTBaTTMxOSA3MjFRMjc5IDcyMSAyNzkgNzQ3UTI3OSA3NTYgMjgyIDc3MFQyOTQgNzkzUTMwNCA4MDMgMzMwIDgwM0g1NTRRNTk1IDgwMyA1OTUgNzc3UTU5NSA3NjkgNTkxIDc1NVQ1NzkgNzMyUTU2OSA3MjEgNTQzIDcyMUgzMTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTM7IiBnbHlwaC1uYW1lPSJlbWFjcm9uIiBob3Jpei1hZHYteD0iNTQ5IiBkPSJNMjYyIC0xMlEyMDcgLTEyIDE2NiAzVDk4IDQ1VDU2IDEwOFQ0MiAxODhRNDIgMjU0IDY1IDMwOVQxMzAgNDA2VDIyNiA0NzBUMzQ1IDQ5M1E0MzIgNDkzIDQ3OSA0NTdUNTI2IDM2MFE1MjYgMzI0IDUxMyAyOTVUNDY3IDI0NlQzODIgMjE1VDI0NyAyMDRRMjIxIDIwNCAxOTMgMjA1VDEzMiAyMDlWMTkxUTEzMiAxMzQgMTY1IDk5VDI2NCA2NFEzMTcgNjQgMzU0IDgzVDQxOCAxMzlRNDE5IDE0MCA0MjYgMTM5VDQ0MSAxMzNUNDU2IDEyMFQ0NjMgOThRNDYzIDgzIDQ1OCA3M1Q0MzkgNDhRNDA5IDE5IDM2NiA0VDI2MiAtMTJaTTM0MSA0MTlRMzA4IDQxOSAyNzggNDA4VDIyNCAzNzlUMTgwIDMzNFQxNDggMjc4UTE3NCAyNzUgMTk2IDI3NFQyMzggMjczUTI5NiAyNzMgMzM0IDI4MFQzOTUgMjk4VDQyNyAzMjVUNDM2IDM1N1E0MzYgMzgxIDQxMyA0MDBUMzQxIDQxOVpNMjMyIDU2MlExOTIgNTYyIDE5MiA1ODhRMTkyIDU5NyAxOTUgNjExVDIwNyA2MzRRMjE3IDY0NCAyNDMgNjQ0SDQ2N1E1MDggNjQ0IDUwOCA2MThRNTA4IDYxMCA1MDQgNTk2VDQ5MiA1NzNRNDgyIDU2MiA0NTYgNTYySDIzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNDsiIGdseXBoLW5hbWU9IkVicmV2ZSIgaG9yaXotYWR2LXg9IjYyMSIgZD0iTTE2MCA1OTBRMTcxIDY0NyAyMjcgNjQ3SDY1MFE2NDkgNjQxIDY0NyA2MzNRNjQ1IDYyNiA2NDQgNjE4VDY0MSA2MDFRNjM3IDU4MSA2MzEgNTU2SDI1NkwyMTcgMzc0SDUyMUw1MDMgMjg3SDE5OEwxNTcgOTFINTM4TDUxOSAwSDM0TDE2MCA1OTBaTTQyNiA3MDVRMzk5IDcwNSAzNzMgNzE1VDMyNyA3NDJUMjk0IDc3OFQyODIgODE3UTI4MiA4MzEgMjkxIDg0MlQzMTcgODU0UTMzNyA4NTQgMzYzIDgzNFQ0MjUgNzYzUTQ2OCA4MTEgNDk4IDgzMlQ1NTEgODU0UTU2NyA4NTQgNTc3IDg0NVQ1ODcgODIxUTU4NyA4MDQgNTczIDc4NFQ1MzcgNzQ3VDQ4NSA3MTdUNDI2IDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNTsiIGdseXBoLW5hbWU9ImVicmV2ZSIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTI2MiAtMTJRMjA3IC0xMiAxNjYgM1Q5OCA0NVQ1NiAxMDhUNDIgMTg4UTQyIDI1NCA2NSAzMDlUMTMwIDQwNlQyMjYgNDcwVDM0NSA0OTNRNDMyIDQ5MyA0NzkgNDU3VDUyNiAzNjBRNTI2IDMyNCA1MTMgMjk1VDQ2NyAyNDZUMzgyIDIxNVQyNDcgMjA0UTIyMSAyMDQgMTkzIDIwNVQxMzIgMjA5VjE5MVExMzIgMTM0IDE2NSA5OVQyNjQgNjRRMzE3IDY0IDM1NCA4M1Q0MTggMTM5UTQxOSAxNDAgNDI2IDEzOVQ0NDEgMTMzVDQ1NiAxMjBUNDYzIDk4UTQ2MyA4MyA0NTggNzNUNDM5IDQ4UTQwOSAxOSAzNjYgNFQyNjIgLTEyWk0zNDEgNDE5UTMwOCA0MTkgMjc4IDQwOFQyMjQgMzc5VDE4MCAzMzRUMTQ4IDI3OFExNzQgMjc1IDE5NiAyNzRUMjM4IDI3M1EyOTYgMjczIDMzNCAyODBUMzk1IDI5OFQ0MjcgMzI1VDQzNiAzNTdRNDM2IDM4MSA0MTMgNDAwVDM0MSA0MTlaTTM0OSA1NDZRMzIyIDU0NiAyOTYgNTU2VDI1MCA1ODNUMjE3IDYxOVQyMDUgNjU4UTIwNSA2NzIgMjE0IDY4M1QyNDAgNjk1UTI2MCA2OTUgMjg2IDY3NVQzNDggNjA0UTM5MSA2NTIgNDIxIDY3M1Q0NzQgNjk1UTQ5MCA2OTUgNTAwIDY4NlQ1MTAgNjYyUTUxMCA2NDUgNDk2IDYyNVQ0NjAgNTg4VDQwOCA1NThUMzQ5IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExNjsiIGdseXBoLW5hbWU9IkVkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik0xNjAgNTkwUTE3MSA2NDcgMjI3IDY0N0g2NTBRNjQ5IDY0MSA2NDcgNjMzUTY0NSA2MjYgNjQ0IDYxOFQ2NDEgNjAxUTYzNyA1ODEgNjMxIDU1NkgyNTZMMjE3IDM3NEg1MjFMNTAzIDI4N0gxOThMMTU3IDkxSDUzOEw1MTkgMEgzNEwxNjAgNTkwWk00MjYgNzA2UTM5NCA3MDYgMzc4IDcyMFQzNjIgNzU3UTM2MiA3ODcgMzgwIDgwOVQ0MzAgODMxUTQ2MiA4MzEgNDc3IDgxN1Q0OTMgNzgwUTQ5MyA3NTAgNDc2IDcyOFQ0MjYgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTE3OyIgZ2x5cGgtbmFtZT0iZWRvdGFjY2VudCIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTI2MiAtMTJRMjA3IC0xMiAxNjYgM1Q5OCA0NVQ1NiAxMDhUNDIgMTg4UTQyIDI1NCA2NSAzMDlUMTMwIDQwNlQyMjYgNDcwVDM0NSA0OTNRNDMyIDQ5MyA0NzkgNDU3VDUyNiAzNjBRNTI2IDMyNCA1MTMgMjk1VDQ2NyAyNDZUMzgyIDIxNVQyNDcgMjA0UTIyMSAyMDQgMTkzIDIwNVQxMzIgMjA5VjE5MVExMzIgMTM0IDE2NSA5OVQyNjQgNjRRMzE3IDY0IDM1NCA4M1Q0MTggMTM5UTQxOSAxNDAgNDI2IDEzOVQ0NDEgMTMzVDQ1NiAxMjBUNDYzIDk4UTQ2MyA4MyA0NTggNzNUNDM5IDQ4UTQwOSAxOSAzNjYgNFQyNjIgLTEyWk0zNDEgNDE5UTMwOCA0MTkgMjc4IDQwOFQyMjQgMzc5VDE4MCAzMzRUMTQ4IDI3OFExNzQgMjc1IDE5NiAyNzRUMjM4IDI3M1EyOTYgMjczIDMzNCAyODBUMzk1IDI5OFQ0MjcgMzI1VDQzNiAzNTdRNDM2IDM4MSA0MTMgNDAwVDM0MSA0MTlaTTM2MCA1NDdRMzI4IDU0NyAzMTIgNTYxVDI5NiA1OThRMjk2IDYyOCAzMTQgNjUwVDM2NCA2NzJRMzk2IDY3MiA0MTEgNjU4VDQyNyA2MjFRNDI3IDU5MSA0MTAgNTY5VDM2MCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMTg7IiBnbHlwaC1uYW1lPSJFb2dvbmVrIiBob3Jpei1hZHYteD0iNjIxIiBkPSJNMTYwIDU5MFExNzEgNjQ3IDIyNyA2NDdINjUwUTY0OSA2NDEgNjQ3IDYzM1E2NDUgNjI2IDY0NCA2MThUNjQxIDYwMVE2MzcgNTgxIDYzMSA1NTZIMjU2TDIxNyAzNzRINTIxTDUwMyAyODdIMTk4TDE1NyA5MUg1MzhMNTE5IDBINDk3UTQ0MSAtMzIgNDIyIC01N1Q0MDMgLTEwMlE0MDMgLTEzMyA0MzQgLTEzM1E0NTUgLTEzMyA0NjkgLTExNlE0ODAgLTExOCA0ODggLTEyNlQ0OTYgLTE0OVE0OTYgLTE3MiA0NzYgLTE4N1Q0MTkgLTIwMlEzNzcgLTIwMiAzNTAgLTE4MFQzMjMgLTEyMFEzMjMgLTg2IDM0OSAtNTVUNDI3IDBIMzRMMTYwIDU5MFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExOTsiIGdseXBoLW5hbWU9ImVvZ29uZWsiIGhvcml6LWFkdi14PSI1NDkiIGQ9Ik0yNjIgLTEyUTIwNyAtMTIgMTY2IDNUOTggNDVUNTYgMTA4VDQyIDE4OFE0MiAyNTQgNjUgMzA5VDEzMCA0MDZUMjI2IDQ3MFQzNDUgNDkzUTQzMiA0OTMgNDc5IDQ1N1Q1MjYgMzYwUTUyNiAzMjQgNTEzIDI5NVQ0NjcgMjQ2VDM4MiAyMTVUMjQ3IDIwNFEyMjEgMjA0IDE5MyAyMDVUMTMyIDIwOVYxOTFRMTMyIDEzNCAxNjUgOTlUMjY0IDY0UTMxNyA2NCAzNTQgODNUNDE4IDEzOVE0MTkgMTQwIDQyNiAxMzlUNDQxIDEzM1Q0NTYgMTIwVDQ2MyA5OFE0NjMgODMgNDU4IDczVDQzOSA0OFE0MjIgMzEgMzk4IDE4UTM2NyAxIDM0NyAtMTRUMzE2IC00MlQzMDAgLTY3VDI5NSAtODlRMjk1IC0xMjAgMzI2IC0xMjBRMzQ3IC0xMjAgMzYxIC0xMDNRMzcyIC0xMDUgMzgwIC0xMTNUMzg4IC0xMzZRMzg4IC0xNTkgMzY4IC0xNzRUMzExIC0xODlRMjY5IC0xODkgMjQyIC0xNjdUMjE1IC0xMDdRMjE1IC04MSAyMzAgLTU3VDI3NCAtMTJIMjYyWk0zNDEgNDE5UTMwOCA0MTkgMjc4IDQwOFQyMjQgMzc5VDE4MCAzMzRUMTQ4IDI3OFExNzQgMjc1IDE5NiAyNzRUMjM4IDI3M1EyOTYgMjczIDMzNCAyODBUMzk1IDI5OFQ0MjcgMzI1VDQzNiAzNTdRNDM2IDM4MSA0MTMgNDAwVDM0MSA0MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUE7IiBnbHlwaC1uYW1lPSJFY2Fyb24iIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik0xNjAgNTkwUTE3MSA2NDcgMjI3IDY0N0g2NTBRNjQ5IDY0MSA2NDcgNjMzUTY0NSA2MjYgNjQ0IDYxOFQ2NDEgNjAxUTYzNyA1ODEgNjMxIDU1NkgyNTZMMjE3IDM3NEg1MjFMNTAzIDI4N0gxOThMMTU3IDkxSDUzOEw1MTkgMEgzNEwxNjAgNTkwWk00MTEgNjkxUTQwNCA2OTMgMzgzIDcxMVQzNDIgNzU0UTMyMCA3ODAgMzExIDgwOFQzMDEgODQ5UTMwMSA4NjggMzExIDg3MFQzMzYgODczUTM2NSA4NzMgMzk4IDgxMlE0MDMgODAzIDQwOSA3OTJUNDIzIDc2Nkw0NjYgODE0UTQ5MSA4NDEgNTEyIDg1N1Q1NTEgODczUTU2NSA4NzMgNTcyIDg2NVQ1ODAgODQ1UTU4MCA4MjUgNTYzIDgwNFQ1MTQgNzU2UTQ5OCA3NDMgNDgyIDczMlQ0NTEgNzEyVDQyNyA2OThUNDExIDY5MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExQjsiIGdseXBoLW5hbWU9ImVjYXJvbiIgaG9yaXotYWR2LXg9IjU0OSIgZD0iTTI2MiAtMTJRMjA3IC0xMiAxNjYgM1Q5OCA0NVQ1NiAxMDhUNDIgMTg4UTQyIDI1NCA2NSAzMDlUMTMwIDQwNlQyMjYgNDcwVDM0NSA0OTNRNDMyIDQ5MyA0NzkgNDU3VDUyNiAzNjBRNTI2IDMyNCA1MTMgMjk1VDQ2NyAyNDZUMzgyIDIxNVQyNDcgMjA0UTIyMSAyMDQgMTkzIDIwNVQxMzIgMjA5VjE5MVExMzIgMTM0IDE2NSA5OVQyNjQgNjRRMzE3IDY0IDM1NCA4M1Q0MTggMTM5UTQxOSAxNDAgNDI2IDEzOVQ0NDEgMTMzVDQ1NiAxMjBUNDYzIDk4UTQ2MyA4MyA0NTggNzNUNDM5IDQ4UTQwOSAxOSAzNjYgNFQyNjIgLTEyWk0zNDEgNDE5UTMwOCA0MTkgMjc4IDQwOFQyMjQgMzc5VDE4MCAzMzRUMTQ4IDI3OFExNzQgMjc1IDE5NiAyNzRUMjM4IDI3M1EyOTYgMjczIDMzNCAyODBUMzk1IDI5OFQ0MjcgMzI1VDQzNiAzNTdRNDM2IDM4MSA0MTMgNDAwVDM0MSA0MTlaTTMzOCA1MzJRMzMxIDUzNCAzMTAgNTUyVDI2OSA1OTVRMjQ3IDYyMSAyMzggNjQ5VDIyOCA2OTBRMjI4IDcwOSAyMzggNzExVDI2MyA3MTRRMjkyIDcxNCAzMjUgNjUzUTMzMCA2NDQgMzM2IDYzM1QzNTAgNjA3TDM5MyA2NTVRNDE4IDY4MiA0MzkgNjk4VDQ3OCA3MTRRNDkyIDcxNCA0OTkgNzA2VDUwNyA2ODZRNTA3IDY2NiA0OTAgNjQ1VDQ0MSA1OTdRNDI1IDU4NCA0MDkgNTczVDM3OCA1NTNUMzU0IDUzOVQzMzggNTMyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFDOyIgZ2x5cGgtbmFtZT0iR2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NDUiIGQ9Ik01OTUgLTRRNTcwIC00IDU1NSAxMlQ1NDYgNjlRNTE4IDMzIDQ3MCAxMVQzNTggLTEyUTI5NCAtMTIgMjQxIDdUMTUxIDYxVDkzIDE0OFQ3MiAyNjVRNzIgMzQzIDk5IDQxNFQxNzYgNTQwVDI5MyA2MjdUNDQyIDY2MFE1MTcgNjYwIDU3MSA2MzdUNjU0IDU4NFE2NzIgNTY3IDY4MSA1NDhUNjkxIDUxMlE2OTEgNDkxIDY4MSA0NzlUNjU5IDQ2MlQ2MzYgNDU3VDYyNCA0NThRNjA1IDUwNiA1NTcgNTM4VDQ0MyA1NzBRMzg2IDU3MCAzMzggNTQ3VDI1NCA0ODNUMTk5IDM4OFQxNzkgMjc0UTE3OSAxNzcgMjMyIDEyNFQzNzYgNzFRNDI0IDcxIDQ1OCA4NFQ1MTggMTIyUTUzMCAxMzQgNTM5IDE0NFQ1NTUgMTY5VDU2OSAyMDRUNTgzIDI1N0gzODJMNDAwIDM0MUg2MzhRNjk0IDM0MSA2ODIgMjg0TDYyMiAzUTYyMiAxIDYxNCAtMVQ1OTUgLTRaTTMzNiA3MDZRMzIyIDcwNiAzMTUgNzE0VDMwNyA3MzRRMzA3IDc1MyAzMjQgNzc0VDM3MyA4MjJRMzg5IDgzNSA0MDUgODQ2VDQzNiA4NjdUNDYwIDg4MVQ0NzYgODg3UTQ4MyA4ODUgNTA0IDg2N1Q1NDUgODI0UTU2NyA3OTggNTc2IDc3OVQ1ODYgNzQ1UTU4NiA3MjcgNTc2IDcxN1Q1NTEgNzA2UTUzNSA3MDYgNTIxIDcyMFQ0ODkgNzY2UTQ4NCA3NzYgNDc4IDc4N1Q0NjQgODEyUTQ1MyA3OTkgNDQzIDc4OFQ0MjEgNzY1UTM5NiA3MzcgMzc1IDcyMlQzMzYgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTFEOyIgZ2x5cGgtbmFtZT0iZ2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI2MTkiIGQ9Ik0yMzEgLTIwMFExNjMgLTIwMCAxMjAgLTE4MlQ1MCAtMTM4UTMyIC0xMjAgMjQgLTEwM1QxNiAtNzFRMTYgLTUyIDI0IC00MFQ0MyAtMjBUNjIgLTExVDcyIC0xMVE4OSAtNTkgMTI3IC04N1QyMzcgLTExNlEzMDEgLTExNiAzNDIgLTgxVDM5OCAyNkw0MTIgOTRRMzgwIDUyIDMzOSAzMFQyNDQgOFEyMDUgOCAxNzAgMjFUMTA4IDYxVDY1IDEyN1Q0OSAyMTZRNDkgMjY4IDY4IDMxN1QxMjMgNDA2VDIwNyA0NjlUMzE0IDQ5M1EzNjkgNDkzIDQxMiA0NjhUNDc4IDQwMUw0OTcgNDgxSDU5M0w0OTYgMjFRNDczIC04NiA0MDkgLTE0M1QyMzEgLTIwMFpNMjcwIDg4UTMwMCA4OCAzMjggOThUMzc5IDEyN1Q0MTggMTcxVDQ0MSAyMjhMNDU4IDMwOFE0NDQgMzU2IDQxMCAzODRUMzIxIDQxMlEyODIgNDEyIDI1MCAzOTZUMTk0IDM1MlQxNTkgMjkxVDE0NiAyMjJRMTQ2IDE5MCAxNTYgMTY2VDE4MyAxMjRUMjIyIDk3VDI3MCA4OFpNMjUwIDU0N1EyMzYgNTQ3IDIyOSA1NTVUMjIxIDU3NVEyMjEgNTk0IDIzOCA2MTVUMjg3IDY2M1EzMDMgNjc2IDMxOSA2ODdUMzUwIDcwOFQzNzQgNzIyVDM5MCA3MjhRMzk3IDcyNiA0MTggNzA4VDQ1OSA2NjVRNDgxIDYzOSA0OTAgNjIwVDUwMCA1ODZRNTAwIDU2OCA0OTAgNTU4VDQ2NSA1NDdRNDQ5IDU0NyA0MzUgNTYxVDQwMyA2MDdRMzk4IDYxNyAzOTIgNjI4VDM3OCA2NTNRMzY3IDY0MCAzNTcgNjI5VDMzNSA2MDZRMzEwIDU3OCAyODkgNTYzVDI1MCA1NDdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMUU7IiBnbHlwaC1uYW1lPSJHYnJldmUiIGhvcml6LWFkdi14PSI3NDUiIGQ9Ik01OTUgLTRRNTcwIC00IDU1NSAxMlQ1NDYgNjlRNTE4IDMzIDQ3MCAxMVQzNTggLTEyUTI5NCAtMTIgMjQxIDdUMTUxIDYxVDkzIDE0OFQ3MiAyNjVRNzIgMzQzIDk5IDQxNFQxNzYgNTQwVDI5MyA2MjdUNDQyIDY2MFE1MTcgNjYwIDU3MSA2MzdUNjU0IDU4NFE2NzIgNTY3IDY4MSA1NDhUNjkxIDUxMlE2OTEgNDkxIDY4MSA0NzlUNjU5IDQ2MlQ2MzYgNDU3VDYyNCA0NThRNjA1IDUwNiA1NTcgNTM4VDQ0MyA1NzBRMzg2IDU3MCAzMzggNTQ3VDI1NCA0ODNUMTk5IDM4OFQxNzkgMjc0UTE3OSAxNzcgMjMyIDEyNFQzNzYgNzFRNDI0IDcxIDQ1OCA4NFQ1MTggMTIyUTUzMCAxMzQgNTM5IDE0NFQ1NTUgMTY5VDU2OSAyMDRUNTgzIDI1N0gzODJMNDAwIDM0MUg2MzhRNjk0IDM0MSA2ODIgMjg0TDYyMiAzUTYyMiAxIDYxNCAtMVQ1OTUgLTRaTTQ1MiA3MDVRNDI1IDcwNSAzOTkgNzE1VDM1MyA3NDJUMzIwIDc3OFQzMDggODE3UTMwOCA4MzEgMzE3IDg0MlQzNDMgODU0UTM2MyA4NTQgMzg5IDgzNFQ0NTEgNzYzUTQ5NCA4MTEgNTI0IDgzMlQ1NzcgODU0UTU5MyA4NTQgNjAzIDg0NVQ2MTMgODIxUTYxMyA4MDQgNTk5IDc4NFQ1NjMgNzQ3VDUxMSA3MTdUNDUyIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDExRjsiIGdseXBoLW5hbWU9ImdicmV2ZSIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTIzMSAtMjAwUTE2MyAtMjAwIDEyMCAtMTgyVDUwIC0xMzhRMzIgLTEyMCAyNCAtMTAzVDE2IC03MVExNiAtNTIgMjQgLTQwVDQzIC0yMFQ2MiAtMTFUNzIgLTExUTg5IC01OSAxMjcgLTg3VDIzNyAtMTE2UTMwMSAtMTE2IDM0MiAtODFUMzk4IDI2TDQxMiA5NFEzODAgNTIgMzM5IDMwVDI0NCA4UTIwNSA4IDE3MCAyMVQxMDggNjFUNjUgMTI3VDQ5IDIxNlE0OSAyNjggNjggMzE3VDEyMyA0MDZUMjA3IDQ2OVQzMTQgNDkzUTM2OSA0OTMgNDEyIDQ2OFQ0NzggNDAxTDQ5NyA0ODFINTkzTDQ5NiAyMVE0NzMgLTg2IDQwOSAtMTQzVDIzMSAtMjAwWk0yNzAgODhRMzAwIDg4IDMyOCA5OFQzNzkgMTI3VDQxOCAxNzFUNDQxIDIyOEw0NTggMzA4UTQ0NCAzNTYgNDEwIDM4NFQzMjEgNDEyUTI4MiA0MTIgMjUwIDM5NlQxOTQgMzUyVDE1OSAyOTFUMTQ2IDIyMlExNDYgMTkwIDE1NiAxNjZUMTgzIDEyNFQyMjIgOTdUMjcwIDg4Wk0zNjcgNTQ2UTM0MCA1NDYgMzE0IDU1NlQyNjggNTgzVDIzNSA2MTlUMjIzIDY1OFEyMjMgNjcyIDIzMiA2ODNUMjU4IDY5NVEyNzggNjk1IDMwNCA2NzVUMzY2IDYwNFE0MDkgNjUyIDQzOSA2NzNUNDkyIDY5NVE1MDggNjk1IDUxOCA2ODZUNTI4IDY2MlE1MjggNjQ1IDUxNCA2MjVUNDc4IDU4OFQ0MjYgNTU4VDM2NyA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjA7IiBnbHlwaC1uYW1lPSJHZG90YWNjZW50IiBob3Jpei1hZHYteD0iNzQ1IiBkPSJNNTk1IC00UTU3MCAtNCA1NTUgMTJUNTQ2IDY5UTUxOCAzMyA0NzAgMTFUMzU4IC0xMlEyOTQgLTEyIDI0MSA3VDE1MSA2MVQ5MyAxNDhUNzIgMjY1UTcyIDM0MyA5OSA0MTRUMTc2IDU0MFQyOTMgNjI3VDQ0MiA2NjBRNTE3IDY2MCA1NzEgNjM3VDY1NCA1ODRRNjcyIDU2NyA2ODEgNTQ4VDY5MSA1MTJRNjkxIDQ5MSA2ODEgNDc5VDY1OSA0NjJUNjM2IDQ1N1Q2MjQgNDU4UTYwNSA1MDYgNTU3IDUzOFQ0NDMgNTcwUTM4NiA1NzAgMzM4IDU0N1QyNTQgNDgzVDE5OSAzODhUMTc5IDI3NFExNzkgMTc3IDIzMiAxMjRUMzc2IDcxUTQyNCA3MSA0NTggODRUNTE4IDEyMlE1MzAgMTM0IDUzOSAxNDRUNTU1IDE2OVQ1NjkgMjA0VDU4MyAyNTdIMzgyTDQwMCAzNDFINjM4UTY5NCAzNDEgNjgyIDI4NEw2MjIgM1E2MjIgMSA2MTQgLTFUNTk1IC00Wk00NTIgNzA2UTQyMCA3MDYgNDA0IDcyMFQzODggNzU3UTM4OCA3ODcgNDA2IDgwOVQ0NTYgODMxUTQ4OCA4MzEgNTAzIDgxN1Q1MTkgNzgwUTUxOSA3NTAgNTAyIDcyOFQ0NTIgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIxOyIgZ2x5cGgtbmFtZT0iZ2RvdGFjY2VudCIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTIzMSAtMjAwUTE2MyAtMjAwIDEyMCAtMTgyVDUwIC0xMzhRMzIgLTEyMCAyNCAtMTAzVDE2IC03MVExNiAtNTIgMjQgLTQwVDQzIC0yMFQ2MiAtMTFUNzIgLTExUTg5IC01OSAxMjcgLTg3VDIzNyAtMTE2UTMwMSAtMTE2IDM0MiAtODFUMzk4IDI2TDQxMiA5NFEzODAgNTIgMzM5IDMwVDI0NCA4UTIwNSA4IDE3MCAyMVQxMDggNjFUNjUgMTI3VDQ5IDIxNlE0OSAyNjggNjggMzE3VDEyMyA0MDZUMjA3IDQ2OVQzMTQgNDkzUTM2OSA0OTMgNDEyIDQ2OFQ0NzggNDAxTDQ5NyA0ODFINTkzTDQ5NiAyMVE0NzMgLTg2IDQwOSAtMTQzVDIzMSAtMjAwWk0yNzAgODhRMzAwIDg4IDMyOCA5OFQzNzkgMTI3VDQxOCAxNzFUNDQxIDIyOEw0NTggMzA4UTQ0NCAzNTYgNDEwIDM4NFQzMjEgNDEyUTI4MiA0MTIgMjUwIDM5NlQxOTQgMzUyVDE1OSAyOTFUMTQ2IDIyMlExNDYgMTkwIDE1NiAxNjZUMTgzIDEyNFQyMjIgOTdUMjcwIDg4Wk0zNjUgNTQ3UTMzMyA1NDcgMzE3IDU2MVQzMDEgNTk4UTMwMSA2MjggMzE5IDY1MFQzNjkgNjcyUTQwMSA2NzIgNDE2IDY1OFQ0MzIgNjIxUTQzMiA1OTEgNDE1IDU2OVQzNjUgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTIyOyIgZ2x5cGgtbmFtZT0iR2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNzQ1IiBkPSJNNTk1IC00UTU3MCAtNCA1NTUgMTJUNTQ2IDY5UTUxOCAzMyA0NzAgMTFUMzU4IC0xMlEyOTQgLTEyIDI0MSA3VDE1MSA2MVQ5MyAxNDhUNzIgMjY1UTcyIDM0MyA5OSA0MTRUMTc2IDU0MFQyOTMgNjI3VDQ0MiA2NjBRNTE3IDY2MCA1NzEgNjM3VDY1NCA1ODRRNjcyIDU2NyA2ODEgNTQ4VDY5MSA1MTJRNjkxIDQ5MSA2ODEgNDc5VDY1OSA0NjJUNjM2IDQ1N1Q2MjQgNDU4UTYwNSA1MDYgNTU3IDUzOFQ0NDMgNTcwUTM4NiA1NzAgMzM4IDU0N1QyNTQgNDgzVDE5OSAzODhUMTc5IDI3NFExNzkgMTc3IDIzMiAxMjRUMzc2IDcxUTQyNCA3MSA0NTggODRUNTE4IDEyMlE1MzAgMTM0IDUzOSAxNDRUNTU1IDE2OVQ1NjkgMjA0VDU4MyAyNTdIMzgyTDQwMCAzNDFINjM4UTY5NCAzNDEgNjgyIDI4NEw2MjIgM1E2MjIgMSA2MTQgLTFUNTk1IC00Wk0yNjQgLTI1M1EyNTkgLTI1OCAyNTEgLTI1N1QyMzQgLTI1MFQyMjAgLTIzOFQyMTggLTIyNEwzMjEgLTQzUTMyMiAtNDIgMzM1IC00MlQzNjMgLTQ3VDM5MSAtNjJUNDA0IC05MFE0MDQgLTEwNiAzOTggLTExOVQzNzQgLTE0OUwyNjQgLTI1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyMzsiIGdseXBoLW5hbWU9Imdjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTIzMSAtMjAwUTE2MyAtMjAwIDEyMCAtMTgyVDUwIC0xMzhRMzIgLTEyMCAyNCAtMTAzVDE2IC03MVExNiAtNTIgMjQgLTQwVDQzIC0yMFQ2MiAtMTFUNzIgLTExUTg5IC01OSAxMjcgLTg3VDIzNyAtMTE2UTMwMSAtMTE2IDM0MiAtODFUMzk4IDI2TDQxMiA5NFEzODAgNTIgMzM5IDMwVDI0NCA4UTIwNSA4IDE3MCAyMVQxMDggNjFUNjUgMTI3VDQ5IDIxNlE0OSAyNjggNjggMzE3VDEyMyA0MDZUMjA3IDQ2OVQzMTQgNDkzUTM2OSA0OTMgNDEyIDQ2OFQ0NzggNDAxTDQ5NyA0ODFINTkzTDQ5NiAyMVE0NzMgLTg2IDQwOSAtMTQzVDIzMSAtMjAwWk0yNzAgODhRMzAwIDg4IDMyOCA5OFQzNzkgMTI3VDQxOCAxNzFUNDQxIDIyOEw0NTggMzA4UTQ0NCAzNTYgNDEwIDM4NFQzMjEgNDEyUTI4MiA0MTIgMjUwIDM5NlQxOTQgMzUyVDE1OSAyOTFUMTQ2IDIyMlExNDYgMTkwIDE1NiAxNjZUMTgzIDEyNFQyMjIgOTdUMjcwIDg4Wk00MDggNzE1UTQxMiA3MTkgNDIxIDcxOFQ0MzggNzEyVDQ1MiA3MDBUNDU0IDY4NkwzNTEgNTA1UTM1MCA1MDMgMzM3IDUwNFQzMDkgNTA5VDI4MSA1MjRUMjY4IDU1MlEyNjggNTY4IDI3NCA1ODFUMjk4IDYxMUw0MDggNzE1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI0OyIgZ2x5cGgtbmFtZT0iSGNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3MDkiIGQ9Ik0xNjMgNjA0UTE2OCA2MjggMTc5IDYzOVQyMTQgNjUxSDIyOFEyNTEgNjUxIDI2MSA2MzhUMjY1IDYwMUwyMTcgMzY5SDU0N0w1OTcgNjA0UTYwMiA2MjggNjEzIDYzOVQ2NDggNjUxSDY2M1E2ODUgNjUxIDY5NSA2MzhUNzAwIDYwMEw1NzEgMEg0NjlMNTI4IDI3OUgxOThMMTM3IDBIMzRMMTYzIDYwNFpNMzI5IDcwNlEzMTUgNzA2IDMwOCA3MTRUMzAwIDczNFEzMDAgNzUzIDMxNyA3NzRUMzY2IDgyMlEzODIgODM1IDM5OCA4NDZUNDI5IDg2N1Q0NTMgODgxVDQ2OSA4ODdRNDc2IDg4NSA0OTcgODY3VDUzOCA4MjRRNTYwIDc5OCA1NjkgNzc5VDU3OSA3NDVRNTc5IDcyNyA1NjkgNzE3VDU0NCA3MDZRNTI4IDcwNiA1MTQgNzIwVDQ4MiA3NjZRNDc3IDc3NiA0NzEgNzg3VDQ1NyA4MTJRNDQ2IDc5OSA0MzYgNzg4VDQxNCA3NjVRMzg5IDczNyAzNjggNzIyVDMyOSA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMjU7IiBnbHlwaC1uYW1lPSJoY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTIxMCA0MDFRMjM2IDQ0NCAyNzggNDY4VDM3MCA0OTNRNDA4IDQ5MyA0MzggNDgxVDQ4OSA0NDhUNTIxIDM5OFQ1MzIgMzM0UTUzMiAzMDggNTI0IDI3MFQ1MDMgMTg5UTQ5MiAxNTIgNDg2IDEyNFQ0NzkgODFRNDc5IDYxIDQ4OSA1MlQ1MjAgNDFRNTIxIDQxIDUyMCAzM1Q1MTMgMTZUNDk0IC0xVDQ1OSAtOVE0MjAgLTkgNDAwIDEyVDM4MCA2OVEzODAgOTAgMzg3IDEyMVQ0MDUgMTkzUTQxNiAyMjkgNDIyIDI2MFQ0MjkgMzA5UTQyOSAzNTUgNDA1IDM4MVQzMzMgNDA3UTI4NiA0MDcgMjUzIDM4NFQxOTEgMzExTDEyNSAwSDI2TDE2MCA2NDdRMTY1IDY3MSAxNzYgNjgyVDIxMCA2OTRIMjI0UTI3MCA2OTQgMjU4IDY0NEwyMTAgNDAxWk0xMTcgNzE2UTEwMyA3MTYgOTYgNzI0VDg4IDc0NFE4OCA3NjMgMTA1IDc4NFQxNTQgODMyUTE3MCA4NDUgMTg2IDg1NlQyMTcgODc3VDI0MSA4OTFUMjU3IDg5N1EyNjQgODk1IDI4NSA4NzdUMzI2IDgzNFEzNDggODA4IDM1NyA3ODlUMzY3IDc1NVEzNjcgNzM3IDM1NyA3MjdUMzMyIDcxNlEzMTYgNzE2IDMwMiA3MzBUMjcwIDc3NlEyNjUgNzg2IDI1OSA3OTdUMjQ1IDgyMlEyMzQgODA5IDIyNCA3OThUMjAyIDc3NVExNzcgNzQ3IDE1NiA3MzJUMTE3IDcxNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNjsiIGdseXBoLW5hbWU9IkhiYXIiIGhvcml6LWFkdi14PSI3MDkiIGQ9Ik05MiA0NzJRNjEgNDcyIDYxIDQ5MFE2MSA0OTggNjQgNTA5VDczIDUyNlE4MCA1MzQgOTkgNTM0SDE0OEwxNjMgNjA0UTE2OCA2MjggMTc5IDYzOVQyMTQgNjUxSDIyOFEyNTEgNjUxIDI2MSA2MzhUMjY1IDYwMUwyNTEgNTM0SDU4Mkw1OTcgNjA0UTYwMiA2MjggNjEzIDYzOVQ2NDggNjUxSDY2M1E2ODUgNjUxIDY5NSA2MzhUNzAwIDYwMEw2ODYgNTM0SDcyOFE3NTkgNTM0IDc1OSA1MTZRNzU5IDUwOCA3NTUgNDk3VDc0NiA0ODBRNzM5IDQ3MiA3MjAgNDcySDY3Mkw1NzEgMEg0NjlMNTI4IDI3OUgxOThMMTM3IDBIMzRMMTM1IDQ3Mkg5MlpNNTQ3IDM2OUw1NjkgNDcySDIzOEwyMTcgMzY5SDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyNzsiIGdseXBoLW5hbWU9ImhiYXIiIGhvcml6LWFkdi14PSI1OTEiIGQ9Ik0xMDIgNTYzUTcxIDU2MyA3MSA1ODFRNzEgNTg5IDc1IDYwMVQ4NCA2MTlROTEgNjI3IDExMCA2MjdIMTU2TDE2OSA2OTBRMTcwIDY5NSAxODMgNjkzVDIxNCA2OTBIMjI2UTI0NiA2OTAgMjU3IDY5MlQyNjggNjkwTDI1NSA2MjdIMzQ5UTM4MCA2MjcgMzgwIDYwOVEzODAgNjAxIDM3NyA1ODlUMzY4IDU3MVEzNjEgNTYzIDM0MiA1NjNIMjQyTDIxMCA0MDFRMjM2IDQ0NCAyNzggNDY4VDM3MCA0OTNRNDA4IDQ5MyA0MzggNDgxVDQ4OSA0NDhUNTIxIDM5OFQ1MzIgMzM0UTUzMiAzMDggNTI0IDI3MFQ1MDMgMTg5UTQ5MiAxNTIgNDg2IDEyNFQ0NzkgODFRNDc5IDYxIDQ4OSA1MlQ1MjAgNDFRNTIxIDQxIDUyMCAzM1Q1MTMgMTZUNDk0IC0xVDQ1OSAtOVE0MjAgLTkgNDAwIDEyVDM4MCA2OVEzODAgOTAgMzg3IDEyMVQ0MDUgMTkzUTQxNiAyMjkgNDIyIDI2MFQ0MjkgMzA5UTQyOSAzNTUgNDA1IDM4MVQzMzMgNDA3UTI4NiA0MDcgMjUzIDM4NFQxOTEgMzExTDEyNSAwSDY4UTQ4IDAgMzcgLTJUMjYgMEwxNDIgNTYzSDEwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyODsiIGdseXBoLW5hbWU9Ikl0aWxkZSIgaG9yaXotYWR2LXg9IjI5MyIgZD0iTTE0NyAwSDQ0TDE3MyA2MDRRMTc4IDYyOCAxODkgNjM5VDIyNCA2NTFIMjM4UTI2MSA2NTEgMjcxIDYzOFQyNzUgNjAxTDE0NyAwWk0zMjUgNjcxUTI5OCA2NzEgMjYyIDY5MFQxOTAgNzQ2UTE3OCA3MjAgMTYzIDY5OVQxMzEgNjc3UTExNSA2NzcgMTA3IDY4NlQ5OSA3MDZROTkgNzI1IDEwNyA3NDNUMTI3IDc3NlQxNTYgNzk5VDE4OSA4MDhRMjE2IDgwOCAyNTIgNzg5VDMyNCA3MzNRMzM2IDc1OSAzNTEgNzgwVDM4MyA4MDJRMzk5IDgwMiA0MDcgNzkzVDQxNSA3NzNRNDE1IDc1MyA0MDcgNzM1VDM4NyA3MDNUMzU4IDY4MFQzMjUgNjcxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTI5OyIgZ2x5cGgtbmFtZT0iaXRpbGRlIiBob3Jpei1hZHYteD0iMjY0IiBkPSJNMTM1IC05UTgwIC05IDYyIDIzVDU1IDExMUwxMzQgNDgxSDIzMkwxNTQgMTEwUTE0NiA3MiAxNTQgNTZUMTk3IDM4UTE5OCAzOCAxOTcgMzFUMTkwIDE1VDE3MSAtMVQxMzUgLTlaTTI4MSA1NDZRMjU0IDU0NiAyMTggNTY1VDE0NiA2MjFRMTM0IDU5NSAxMTkgNTc0VDg3IDU1MlE3MSA1NTIgNjMgNTYxVDU1IDU4MVE1NSA2MDAgNjMgNjE4VDgzIDY1MVQxMTIgNjc0VDE0NSA2ODNRMTcyIDY4MyAyMDggNjY0VDI4MCA2MDhRMjkyIDYzNCAzMDcgNjU1VDMzOSA2NzdRMzU1IDY3NyAzNjMgNjY4VDM3MSA2NDhRMzcxIDYyOCAzNjMgNjEwVDM0MyA1NzhUMzE0IDU1NVQyODEgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJBOyIgZ2x5cGgtbmFtZT0iSW1hY3JvbiIgaG9yaXotYWR2LXg9IjI5MyIgZD0iTTE0NyAwSDQ0TDE3MyA2MDRRMTc4IDYyOCAxODkgNjM5VDIyNCA2NTFIMjM4UTI2MSA2NTEgMjcxIDYzOFQyNzUgNjAxTDE0NyAwWk0xNDIgNzIxUTEwMiA3MjEgMTAyIDc0N1ExMDIgNzU2IDEwNSA3NzBUMTE3IDc5M1ExMjcgODAzIDE1MyA4MDNIMzc3UTQxOCA4MDMgNDE4IDc3N1E0MTggNzY5IDQxNCA3NTVUNDAyIDczMlEzOTIgNzIxIDM2NiA3MjFIMTQyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJCOyIgZ2x5cGgtbmFtZT0iaW1hY3JvbiIgaG9yaXotYWR2LXg9IjI2NCIgZD0iTTEzNSAtOVE4MCAtOSA2MiAyM1Q1NSAxMTFMMTM0IDQ4MUgyMzJMMTU0IDExMFExNDYgNzIgMTU0IDU2VDE5NyAzOFExOTggMzggMTk3IDMxVDE5MCAxNVQxNzEgLTFUMTM1IC05Wk04NyA1NjJRNDcgNTYyIDQ3IDU4OFE0NyA1OTcgNTAgNjExVDYyIDYzNFE3MiA2NDQgOTggNjQ0SDMyMlEzNjMgNjQ0IDM2MyA2MThRMzYzIDYxMCAzNTkgNTk2VDM0NyA1NzNRMzM3IDU2MiAzMTEgNTYySDg3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTJFOyIgZ2x5cGgtbmFtZT0iSW9nb25layIgaG9yaXotYWR2LXg9IjI5MyIgZD0iTTE0NyAwSDEyOFE3MCAtMzMgNTEgLTU4VDMxIC0xMDRRMzEgLTEzNSA2MiAtMTM1UTgzIC0xMzUgOTcgLTExOFExMDggLTEyMCAxMTYgLTEyOFQxMjQgLTE1MVExMjQgLTE3NCAxMDQgLTE4OVQ0NyAtMjA0UTUgLTIwNCAtMjIgLTE4MlQtNDkgLTEyMlEtNDkgLTg3IC0yMiAtNTVUNjAgMEg0NEwxNzMgNjA0UTE3OCA2MjggMTg5IDYzOVQyMjQgNjUxSDIzOFEyNjEgNjUxIDI3MSA2MzhUMjc1IDYwMUwxNDcgMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEyRjsiIGdseXBoLW5hbWU9ImlvZ29uZWsiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik0xOTcgMzhRMTk3IDM4IDE5NyAzM1QxOTMgMjJUMTg0IDhUMTY1IC00UTEwOSAtMzYgOTAgLTYxVDcxIC0xMDZRNzEgLTEzNyAxMDIgLTEzN1ExMjMgLTEzNyAxMzcgLTEyMFExNDggLTEyMiAxNTYgLTEzMFQxNjQgLTE1M1ExNjQgLTE3NiAxNDQgLTE5MVQ4NyAtMjA2UTQ1IC0yMDYgMTggLTE4NFQtOSAtMTI0US05IC05MCAxNyAtNThUOTYgLTNRNjQgOCA1NSAzN1Q1NSAxMTFMMTM0IDQ4MUgyMzJMMTU0IDExMFExNDYgNzIgMTU0IDU2VDE5NyAzOFpNMjE2IDU4NFExODcgNTg0IDE3MiA1OTZUMTU3IDYzMFExNTcgNjU2IDE3MyA2NzVUMjE5IDY5NFEyNDggNjk0IDI2MyA2ODJUMjc4IDY0OVEyNzggNjIyIDI2MiA2MDNUMjE2IDU4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMDsiIGdseXBoLW5hbWU9Iklkb3RhY2NlbnQiIGhvcml6LWFkdi14PSIyOTMiIGQ9Ik0xNDcgMEg0NEwxNzMgNjA0UTE3OCA2MjggMTg5IDYzOVQyMjQgNjUxSDIzOFEyNjEgNjUxIDI3MSA2MzhUMjc1IDYwMUwxNDcgMFpNMjU0IDcwNlEyMjIgNzA2IDIwNiA3MjBUMTkwIDc1N1ExOTAgNzg3IDIwOCA4MDlUMjU4IDgzMVEyOTAgODMxIDMwNSA4MTdUMzIxIDc4MFEzMjEgNzUwIDMwNCA3MjhUMjU0IDcwNloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMTsiIGdseXBoLW5hbWU9ImRvdGxlc3NpIiBob3Jpei1hZHYteD0iMjY0IiBkPSJNMTM1IC05UTgwIC05IDYyIDIzVDU1IDExMUwxMzQgNDgxSDIzMkwxNTQgMTEwUTE0NiA3MiAxNTQgNTZUMTk3IDM4UTE5OCAzOCAxOTcgMzFUMTkwIDE1VDE3MSAtMVQxMzUgLTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzI7IiBnbHlwaC1uYW1lPSJJSiIgaG9yaXotYWR2LXg9Ijc4OCIgZD0iTTE0NyAwSDQ0TDE3MyA2MDRRMTc4IDYyOCAxODkgNjM5VDIyNCA2NTFIMjM4UTI2MSA2NTEgMjcxIDYzOFQyNzUgNjAxTDE0NyAwWk00NzggLTEyUTQyOSAtMTIgMzk1IDJUMzM5IDM4UTMyNSA1MiAzMTkgNjRUMzEzIDg5UTMxMyAxMDcgMzIwIDExOVQzMzcgMTM4VDM1NSAxNDdUMzY0IDE0OFEzODAgMTE2IDQwOSA5NlQ0NzYgNzZRNTI5IDc2IDU1OCAxMDhUNjAzIDIxNEw2OTYgNjQ3SDc5OEw3MDMgMTk4UTY4MCA5MiA2MjcgNDBUNDc4IC0xMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzMzsiIGdseXBoLW5hbWU9ImlqIiBob3Jpei1hZHYteD0iNTM1IiBkPSJNMTM1IC05UTgwIC05IDYyIDIzVDU1IDExMUwxMzQgNDgxSDIzMkwxNTQgMTEwUTE0NiA3MiAxNTQgNTZUMTk3IDM4UTE5OCAzOCAxOTcgMzFUMTkwIDE1VDE3MSAtMVQxMzUgLTlaTTIxNiA1ODRRMTg3IDU4NCAxNzIgNTk2VDE1NyA2MzBRMTU3IDY1NiAxNzMgNjc1VDIxOSA2OTRRMjQ4IDY5NCAyNjMgNjgyVDI3OCA2NDlRMjc4IDYyMiAyNjIgNjAzVDIxNiA1ODRaTTIzNyAtMjAyUTIwMyAtMjAyIDE4MSAtMTk0VDE0NiAtMTczUTEzMCAtMTU3IDEzMCAtMTM4UTEzMCAtMTI3IDEzNCAtMTE4VDE0MyAtMTAyVDE1MyAtOTFUMTU4IC04OFExNjggLTEwMiAxODYgLTExMVQyMjYgLTEyMVEyNTIgLTEyMSAyNjggLTEwNVQyOTMgLTQ2TDQwNSA0ODFINTAzTDM4OSAtNjBRMzczIC0xMzUgMzM1IC0xNjhUMjM3IC0yMDJaTTQ4NyA1ODRRNDU4IDU4NCA0NDQgNTk2VDQyOSA2MzBRNDI5IDY1NiA0NDUgNjc1VDQ5MSA2OTRRNTIwIDY5NCA1MzQgNjgyVDU0OSA2NDlRNTQ5IDYyMiA1MzMgNjAzVDQ4NyA1ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxMzQ7IiBnbHlwaC1uYW1lPSJKY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjQ5NSIgZD0iTTE4NSAtMTJRMTM2IC0xMiAxMDIgMlQ0NiAzOFEzMiA1MiAyNiA2NFQyMCA4OVEyMCAxMDcgMjcgMTE5VDQ0IDEzOFQ2MiAxNDdUNzEgMTQ4UTg3IDExNiAxMTYgOTZUMTgzIDc2UTIzNiA3NiAyNjUgMTA4VDMxMCAyMTRMNDAzIDY0N0g1MDVMNDEwIDE5OFEzODcgOTIgMzM0IDQwVDE4NSAtMTJaTTM1NyA3MDZRMzQzIDcwNiAzMzYgNzE0VDMyOCA3MzRRMzI4IDc1MyAzNDUgNzc0VDM5NCA4MjJRNDEwIDgzNSA0MjYgODQ2VDQ1NyA4NjdUNDgxIDg4MVQ0OTcgODg3UTUwNCA4ODUgNTI1IDg2N1Q1NjYgODI0UTU4OCA3OTggNTk3IDc3OVQ2MDcgNzQ1UTYwNyA3MjcgNTk3IDcxN1Q1NzIgNzA2UTU1NiA3MDYgNTQyIDcyMFQ1MTAgNzY2UTUwNSA3NzYgNDk5IDc4N1Q0ODUgODEyUTQ3NCA3OTkgNDY0IDc4OFQ0NDIgNzY1UTQxNyA3MzcgMzk2IDcyMlQzNTcgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM1OyIgZ2x5cGgtbmFtZT0iamNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSIyNjgiIGQ9Ik0tMzAgLTIwMlEtNjQgLTIwMiAtODYgLTE5NFQtMTIxIC0xNzNRLTEzNyAtMTU3IC0xMzcgLTEzOFEtMTM3IC0xMjcgLTEzMyAtMTE4VC0xMjQgLTEwMlQtMTE0IC05MVQtMTA5IC04OFEtOTkgLTEwMiAtODEgLTExMVQtNDEgLTEyMVEtMTUgLTEyMSAxIC0xMDVUMjYgLTQ2TDEzOCA0ODFIMjM2TDEyMiAtNjBRMTA2IC0xMzUgNjggLTE2OFQtMzAgLTIwMlpNOTkgNTQ3UTg1IDU0NyA3OCA1NTVUNzAgNTc1UTcwIDU5NCA4NyA2MTVUMTM2IDY2M1ExNTIgNjc2IDE2OCA2ODdUMTk5IDcwOFQyMjMgNzIyVDIzOSA3MjhRMjQ2IDcyNiAyNjcgNzA4VDMwOCA2NjVRMzMwIDYzOSAzMzkgNjIwVDM0OSA1ODZRMzQ5IDU2OCAzMzkgNTU4VDMxNCA1NDdRMjk4IDU0NyAyODQgNTYxVDI1MiA2MDdRMjQ3IDYxNyAyNDEgNjI4VDIyNyA2NTNRMjE2IDY0MCAyMDYgNjI5VDE4NCA2MDZRMTU5IDU3OCAxMzggNTYzVDk5IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNjsiIGdseXBoLW5hbWU9Iktjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjYwOCIgZD0iTTQ3OCAtNlE0NjAgLTYgNDQ1IDBUNDE2IDE5VDM4NyA1MlQzNTMgMTAwTDIwNCAzMTNMMTM4IDBIMzVMMTYzIDYwNFExNjggNjI5IDE3OSA2NDBUMjE0IDY1MUgyMjhRMjUxIDY1MSAyNjEgNjM4VDI2NSA2MDBMMjEzIDM1NEw1NjggNjYwUTU2OCA2NjAgNTc3IDY1OFQ1OTYgNjUwVDYxNCA2MzVUNjIzIDYxMFE2MjMgNTkzIDYxNCA1NzlUNTgyIDU0N0wzMDggMzIyTDQ0OCAxMzFRNDY0IDEwOSA0NzYgOTVUNDk5IDcyVDUyMCA1OVQ1NDUgNTRRNTQ2IDU0IDU0NiA0NVQ1NDAgMjRUNTIwIDRUNDc4IC02Wk0xNjMgLTI1M1ExNTggLTI1OCAxNTAgLTI1N1QxMzMgLTI1MFQxMTkgLTIzOFQxMTcgLTIyNEwyMjAgLTQzUTIyMSAtNDIgMjM0IC00MlQyNjIgLTQ3VDI5MCAtNjJUMzAzIC05MFEzMDMgLTEwNiAyOTcgLTExOVQyNzMgLTE0OUwxNjMgLTI1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzNzsiIGdseXBoLW5hbWU9Imtjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjUwNiIgZD0iTTM4MCAtOVEzNjIgLTkgMzQ5IC01VDMyMiAxMlQyOTQgNDVUMjU5IDEwMUwxNzUgMjM5UTE3MSAyMjAgMTY3IDIwMVExNTkgMTY2IDE1MCAxMTlRMTM5IDY2IDEyNSAwSDI2TDE2OSA2OTBIMjY4TDE4MyAyNzRMNDQ0IDQ5M1E0NDQgNDk0IDQ1MiA0OTJUNDY5IDQ4NVQ0ODYgNDY5VDQ5NCA0NDNRNDk0IDQxNiA0NTYgMzg2TDI3NCAyNDFMMzQ1IDEzMlEzNjAgMTA4IDM3MSA5NFQzOTIgNzJUNDE1IDYxVDQ0NCA1N1E0NDUgNTcgNDQ1IDQ3VDQzOSAyNFQ0MjAgMlQzODAgLTlaTTExNiAtMjUzUTExMSAtMjU4IDEwMyAtMjU3VDg2IC0yNTBUNzIgLTIzOFQ3MCAtMjI0TDE3MyAtNDNRMTc0IC00MiAxODcgLTQyVDIxNSAtNDdUMjQzIC02MlQyNTYgLTkwUTI1NiAtMTA2IDI1MCAtMTE5VDIyNiAtMTQ5TDExNiAtMjUzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTM5OyIgZ2x5cGgtbmFtZT0iTGFjdXRlIiBob3Jpei1hZHYteD0iNTQ2IiBkPSJNMTYzIDYwNFExNjggNjI4IDE3OSA2MzlUMjE0IDY1MUgyMjhRMjUxIDY1MSAyNjEgNjM4VDI2NSA2MDFMMTU3IDkySDQzM1E0NzggOTIgNDc4IDYzUTQ3OCA1MyA0NzQgMzdUNDYwIDExUTQ1NSA1IDQ0NiAzVDQyMCAwSDM0TDE2MyA2MDRaTTIwMCA3MTRRMTk4IDcxNyAyMDkgNzMzVDI0MSA3NzBUMjg2IDgxMlQzMzYgODQ5UTM2MCA4NjQgMzg1IDg2NFE0MDUgODY0IDQxNiA4NTJUNDI4IDgyMlE0MjggODA2IDQxNiA3OTJUMzgyIDc2NFEzNTMgNzQ3IDMyMiA3MzZUMjY0IDcxOVQyMjAgNzEyVDIwMCA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0E7IiBnbHlwaC1uYW1lPSJsYWN1dGUiIGhvcml6LWFkdi14PSIyNjciIGQ9Ik0xMzUgLTlRODAgLTkgNjIgMjNUNTUgMTExTDE3NiA2OTBIMjc0TDE1NCAxMTBRMTQ2IDcyIDE1NCA1NlQxOTcgMzhRMTk4IDM4IDE5NyAzMVQxOTAgMTVUMTcxIC0xVDEzNSAtOVpNMTk0IDcyN1ExOTIgNzMwIDIwMyA3NDZUMjM1IDc4M1QyODAgODI1VDMzMCA4NjJRMzU0IDg3NyAzNzkgODc3UTM5OSA4NzcgNDEwIDg2NVQ0MjIgODM1UTQyMiA4MTkgNDEwIDgwNVQzNzYgNzc3UTM0NyA3NjAgMzE2IDc0OVQyNTggNzMyVDIxNCA3MjVUMTk0IDcyN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQjsiIGdseXBoLW5hbWU9Ikxjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU0NiIgZD0iTTE0NiA2MDRRMTUxIDYyOCAxNjIgNjM5VDE5NyA2NTFIMjExUTIzNCA2NTEgMjQ0IDYzOFQyNDggNjAxTDE0MCA5Mkg0MTZRNDYxIDkyIDQ2MSA2M1E0NjEgNTMgNDU3IDM3VDQ0MyAxMVE0MzggNSA0MjkgM1Q0MDMgMEgxN0wxNDYgNjA0Wk0xNTAgLTI1M1ExNDUgLTI1OCAxMzcgLTI1N1QxMjAgLTI1MFQxMDYgLTIzOFQxMDQgLTIyNEwyMDcgLTQzUTIwOCAtNDIgMjIxIC00MlQyNDkgLTQ3VDI3NyAtNjJUMjkwIC05MFEyOTAgLTEwNiAyODQgLTExOVQyNjAgLTE0OUwxNTAgLTI1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzQzsiIGdseXBoLW5hbWU9Imxjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjI2NyIgZD0iTTEzNSAtOVE4MCAtOSA2MiAyM1Q1NSAxMTFMMTc2IDY5MEgyNzRMMTU0IDExMFExNDYgNzIgMTU0IDU2VDE5NyAzOFExOTggMzggMTk3IDMxVDE5MCAxNVQxNzEgLTFUMTM1IC05Wk0xMCAtMjUzUTUgLTI1OCAtMyAtMjU3VC0yMCAtMjUwVC0zNCAtMjM4VC0zNiAtMjI0TDY3IC00M1E2OCAtNDIgODEgLTQyVDEwOSAtNDdUMTM3IC02MlQxNTAgLTkwUTE1MCAtMTA2IDE0NCAtMTE5VDEyMCAtMTQ5TDEwIC0yNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxM0Q7IiBnbHlwaC1uYW1lPSJMY2Fyb24iIGhvcml6LWFkdi14PSI2NTUiIGQ9Ik01MzUgNDA3UTUzMSA0MDMgNTIyIDQwNFQ1MDUgNDA5VDQ5MiA0MjFUNDkwIDQzNkw2MDAgNjU5UTYwMSA2NjEgNjE0IDY2MVQ2NDQgNjU3VDY3MyA2NDNUNjg2IDYxNVE2ODYgNjAwIDY4MCA1ODdUNjU4IDU1Nkw1MzUgNDA3Wk0xNDYgNjA0UTE1MSA2MjggMTYyIDYzOVQxOTcgNjUxSDIxMVEyMzQgNjUxIDI0NCA2MzhUMjQ4IDYwMUwxNDAgOTJINDE2UTQ2MSA5MiA0NjEgNjNRNDYxIDUzIDQ1NyAzN1Q0NDMgMTFRNDM4IDUgNDI5IDNUNDAzIDBIMTdMMTQ2IDYwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDEzRTsiIGdseXBoLW5hbWU9ImxjYXJvbiIgaG9yaXotYWR2LXg9IjQ0NSIgZD0iTTMyMSA0MjlRMzE3IDQyNSAzMDggNDI2VDI5MSA0MzFUMjc4IDQ0M1QyNzYgNDU4TDM4NiA2ODFRMzg3IDY4MyA0MDAgNjgzVDQzMCA2NzlUNDU5IDY2NVQ0NzIgNjM3UTQ3MiA2MjIgNDY2IDYwOVQ0NDQgNTc4TDMyMSA0MjlaTTEzNSAtOVE4MCAtOSA2MiAyM1Q1NSAxMTFMMTc2IDY5MEgyNzRMMTU0IDExMFExNDYgNzIgMTU0IDU2VDE5NyAzOFExOTggMzggMTk3IDMxVDE5MCAxNVQxNzEgLTFUMTM1IC05WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTNGOyIgZ2x5cGgtbmFtZT0iTGRvdCIgaG9yaXotYWR2LXg9IjY2NiIgZD0iTTE0NiA2MDRRMTUxIDYyOCAxNjIgNjM5VDE5NyA2NTFIMjExUTIzNCA2NTEgMjQ0IDYzOFQyNDggNjAxTDE0MCA5Mkg0MTZRNDYxIDkyIDQ2MSA2M1E0NjEgNTMgNDU3IDM3VDQ0MyAxMVE0MzggNSA0MjkgM1Q0MDMgMEgxN0wxNDYgNjA0Wk01NzkgMjY1UTUyMiAyNjUgNTIyIDMwN1E1MjIgMzI2IDUyNyAzNDJUNTQzIDM3MFE1NTEgMzc4IDU2MSAzODJUNTkxIDM4NlE2NDggMzg2IDY0OCAzNDRRNjQ4IDMyNSA2NDQgMzA5VDYyOCAyODFRNjIwIDI3MyA2MDkgMjY5VDU3OSAyNjVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDA7IiBnbHlwaC1uYW1lPSJsZG90IiBob3Jpei1hZHYteD0iNDU1IiBkPSJNMTM1IC05UTgwIC05IDYyIDIzVDU1IDExMUwxNzYgNjkwSDI3NEwxNTQgMTEwUTE0NiA3MiAxNTQgNTZUMTk3IDM4UTE5OCAzOCAxOTcgMzFUMTkwIDE1VDE3MSAtMVQxMzUgLTlaTTM0NyAyMDBRMjkwIDIwMCAyOTAgMjQyUTI5MCAyNjEgMjk1IDI3N1QzMTEgMzA1UTMxOSAzMTMgMzI5IDMxN1QzNTkgMzIxUTQxNiAzMjEgNDE2IDI3OVE0MTYgMjYwIDQxMiAyNDRUMzk2IDIxNlEzODggMjA4IDM3NyAyMDRUMzQ3IDIwMFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0MTsiIGdseXBoLW5hbWU9IkNSIiBob3Jpei1hZHYteD0iNjAzIiBkPSJNMTQzIDBRNzUgMCA4OSA2N0wxMjIgMjIzTDQ5IDIwM1E0NyAyMDEgNDAgMjE0VDMyIDI0NlEzMiAyNjMgNDQgMjc2VDkxIDMwMEwxNDIgMzE1TDIwMyA2MDRRMjA5IDYyOCAyMjAgNjM5VDI1NSA2NTFIMjY5UTI5MSA2NTEgMzAxIDYzOFQzMDYgNjAxTDI1MiAzNDVMNDM5IDM5OFE0NDIgMzk5IDQ0OSAzODdUNDU2IDM1NFE0NTYgMzM3IDQ0NCAzMjRUMzk3IDMwMEwyMzIgMjU0TDE5OCA5Mkg0NzRRNTE5IDkyIDUxOSA2M1E1MTkgNTMgNTE0IDM3VDUwMSAxMVE0OTYgNSA0ODcgM1Q0NjEgMEgxNDNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDI7IiBnbHlwaC1uYW1lPSJsc2xhc2giIGhvcml6LWFkdi14PSIzNzgiIGQ9Ik0xODkgLTlRMTM0IC05IDExNiAyM1QxMDkgMTExTDEzNiAyMzNMNDcgMjA5UTQ2IDIwOSA0NCAyMTNUMzggMjIzVDMzIDIzNlQzMSAyNTFRMzEgMjY4IDQyIDI4MlQ4NiAzMDRMMTU1IDMyNEwyMjIgNjQwUTIyNyA2NjYgMjM4IDY3NlQyNjcgNjg3SDI3OVEyOTkgNjg3IDMxMiA2NzdUMzIxIDY0MEwyNTkgMzQ5TDM1NCAzNzVRMzU1IDM3NSAzNTcgMzcyVDM2MyAzNjJUMzY4IDM0OVQzNzAgMzM0UTM3MCAzMTcgMzU5IDMwM1QzMTUgMjgwTDI0MCAyNTlMMjA4IDExMFEyMDAgNzIgMjA4IDU2VDI1MiAzOFEyNTIgMzggMjUxIDMxVDI0NCAxNVQyMjUgLTFUMTg5IC05WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQzOyIgZ2x5cGgtbmFtZT0iTmFjdXRlIiBob3Jpei1hZHYteD0iNzE2IiBkPSJNMTYwIDU5MlExNzIgNjUxIDIyMyA2NTFIMjQwUTI2MCA2NTEgMjcyIDY0MlQyOTUgNjEwTDUxNiAxNTVMNjIxIDY0N0g3MTdMNTkwIDUxUTU3OSAtNCA1MzEgLTRINTIzUTUwMyAtNCA0OTIgNVQ0NjggMzdMMjM5IDUwOUwxMzEgMEgzNUwxNjAgNTkyWk0zOTAgNzE0UTM4OCA3MTcgMzk5IDczM1Q0MzEgNzcwVDQ3NiA4MTJUNTI2IDg0OVE1NTAgODY0IDU3NSA4NjRRNTk1IDg2NCA2MDYgODUyVDYxOCA4MjJRNjE4IDgwNiA2MDYgNzkyVDU3MiA3NjRRNTQzIDc0NyA1MTIgNzM2VDQ1NCA3MTlUNDEwIDcxMlQzOTAgNzE0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ0OyIgZ2x5cGgtbmFtZT0ibmFjdXRlIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNMTUzIDQ4NVExNjUgNDg1IDE3NiA0ODJUMTk2IDQ2OVQyMDggNDQzVDIwOCA0MDNRMjM2IDQ0NSAyNzcgNDY5VDM2OSA0OTNRNDA4IDQ5MyA0MzggNDgxVDQ4OSA0NDhUNTIxIDM5OFQ1MzIgMzM0UTUzMiAzMDggNTI0IDI3MFQ1MDMgMTg5UTQ5MiAxNTIgNDg2IDEyNFQ0NzkgODFRNDc5IDYxIDQ4OSA1MlQ1MjAgNDFRNTIxIDQxIDUyMCAzM1Q1MTMgMTZUNDk0IC0xVDQ1OSAtOVE0MjAgLTkgNDAwIDEyVDM4MCA2OVEzODAgOTAgMzg3IDEyMVQ0MDUgMTkzUTQxNiAyMjkgNDIyIDI2MFQ0MjkgMzA5UTQyOSAzNTUgNDA1IDM4MVQzMzMgNDA3UTI4NiA0MDcgMjUzIDM4NFQxOTEgMzExTDEyNSAwSDI2TDEyOCA0ODBRMTMwIDQ4NSAxNTMgNDg1Wk0yNzUgNTU1UTI3MyA1NTggMjg0IDU3NFQzMTYgNjExVDM2MSA2NTNUNDExIDY5MFE0MzUgNzA1IDQ2MCA3MDVRNDgwIDcwNSA0OTEgNjkzVDUwMyA2NjNRNTAzIDY0NyA0OTEgNjMzVDQ1NyA2MDVRNDI4IDU4OCAzOTcgNTc3VDMzOSA1NjBUMjk1IDU1M1QyNzUgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ1OyIgZ2x5cGgtbmFtZT0iTmNvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNzE2IiBkPSJNMTYwIDU5MlExNzIgNjUxIDIyMyA2NTFIMjQwUTI2MCA2NTEgMjcyIDY0MlQyOTUgNjEwTDUxNiAxNTVMNjIxIDY0N0g3MTdMNTkwIDUxUTU3OSAtNCA1MzEgLTRINTIzUTUwMyAtNCA0OTIgNVQ0NjggMzdMMjM5IDUwOUwxMzEgMEgzNUwxNjAgNTkyWk0yMTYgLTI1M1EyMTEgLTI1OCAyMDMgLTI1N1QxODYgLTI1MFQxNzIgLTIzOFQxNzAgLTIyNEwyNzMgLTQzUTI3NCAtNDIgMjg3IC00MlQzMTUgLTQ3VDM0MyAtNjJUMzU2IC05MFEzNTYgLTEwNiAzNTAgLTExOVQzMjYgLTE0OUwyMTYgLTI1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0NjsiIGdseXBoLW5hbWU9Im5jb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU5MSIgZD0iTTE1MyA0ODVRMTY1IDQ4NSAxNzYgNDgyVDE5NiA0NjlUMjA4IDQ0M1QyMDggNDAzUTIzNiA0NDUgMjc3IDQ2OVQzNjkgNDkzUTQwOCA0OTMgNDM4IDQ4MVQ0ODkgNDQ4VDUyMSAzOThUNTMyIDMzNFE1MzIgMzA4IDUyNCAyNzBUNTAzIDE4OVE0OTIgMTUyIDQ4NiAxMjRUNDc5IDgxUTQ3OSA2MSA0ODkgNTJUNTIwIDQxUTUyMSA0MSA1MjAgMzNUNTEzIDE2VDQ5NCAtMVQ0NTkgLTlRNDIwIC05IDQwMCAxMlQzODAgNjlRMzgwIDkwIDM4NyAxMjFUNDA1IDE5M1E0MTYgMjI5IDQyMiAyNjBUNDI5IDMwOVE0MjkgMzU1IDQwNSAzODFUMzMzIDQwN1EyODYgNDA3IDI1MyAzODRUMTkxIDMxMUwxMjUgMEgyNkwxMjggNDgwUTEzMCA0ODUgMTUzIDQ4NVpNMTcyIC0yNTNRMTY3IC0yNTggMTU5IC0yNTdUMTQyIC0yNTBUMTI4IC0yMzhUMTI2IC0yMjRMMjI5IC00M1EyMzAgLTQyIDI0MyAtNDJUMjcxIC00N1QyOTkgLTYyVDMxMiAtOTBRMzEyIC0xMDYgMzA2IC0xMTlUMjgyIC0xNDlMMTcyIC0yNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNDc7IiBnbHlwaC1uYW1lPSJOY2Fyb24iIGhvcml6LWFkdi14PSI3MTYiIGQ9Ik0xNjAgNTkyUTE3MiA2NTEgMjIzIDY1MUgyNDBRMjYwIDY1MSAyNzIgNjQyVDI5NSA2MTBMNTE2IDE1NUw2MjEgNjQ3SDcxN0w1OTAgNTFRNTc5IC00IDUzMSAtNEg1MjNRNTAzIC00IDQ5MiA1VDQ2OCAzN0wyMzkgNTA5TDEzMSAwSDM1TDE2MCA1OTJaTTQ0NiA2OTFRNDM5IDY5MyA0MTggNzExVDM3NyA3NTRRMzU1IDc4MCAzNDYgODA4VDMzNiA4NDlRMzM2IDg2OCAzNDYgODcwVDM3MSA4NzNRNDAwIDg3MyA0MzMgODEyUTQzOCA4MDMgNDQ0IDc5MlQ0NTggNzY2TDUwMSA4MTRRNTI2IDg0MSA1NDcgODU3VDU4NiA4NzNRNjAwIDg3MyA2MDcgODY1VDYxNSA4NDVRNjE1IDgyNSA1OTggODA0VDU0OSA3NTZRNTMzIDc0MyA1MTcgNzMyVDQ4NiA3MTJUNDYyIDY5OFQ0NDYgNjkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTQ4OyIgZ2x5cGgtbmFtZT0ibmNhcm9uIiBob3Jpei1hZHYteD0iNTkxIiBkPSJNMTUzIDQ4NVExNjUgNDg1IDE3NiA0ODJUMTk2IDQ2OVQyMDggNDQzVDIwOCA0MDNRMjM2IDQ0NSAyNzcgNDY5VDM2OSA0OTNRNDA4IDQ5MyA0MzggNDgxVDQ4OSA0NDhUNTIxIDM5OFQ1MzIgMzM0UTUzMiAzMDggNTI0IDI3MFQ1MDMgMTg5UTQ5MiAxNTIgNDg2IDEyNFQ0NzkgODFRNDc5IDYxIDQ4OSA1MlQ1MjAgNDFRNTIxIDQxIDUyMCAzM1Q1MTMgMTZUNDk0IC0xVDQ1OSAtOVE0MjAgLTkgNDAwIDEyVDM4MCA2OVEzODAgOTAgMzg3IDEyMVQ0MDUgMTkzUTQxNiAyMjkgNDIyIDI2MFQ0MjkgMzA5UTQyOSAzNTUgNDA1IDM4MVQzMzMgNDA3UTI4NiA0MDcgMjUzIDM4NFQxOTEgMzExTDEyNSAwSDI2TDEyOCA0ODBRMTMwIDQ4NSAxNTMgNDg1Wk0zNTEgNTMyUTM0NCA1MzQgMzIzIDU1MlQyODIgNTk1UTI2MCA2MjEgMjUxIDY0OVQyNDEgNjkwUTI0MSA3MDkgMjUxIDcxMVQyNzYgNzE0UTMwNSA3MTQgMzM4IDY1M1EzNDMgNjQ0IDM0OSA2MzNUMzYzIDYwN0w0MDYgNjU1UTQzMSA2ODIgNDUyIDY5OFQ0OTEgNzE0UTUwNSA3MTQgNTEyIDcwNlQ1MjAgNjg2UTUyMCA2NjYgNTAzIDY0NVQ0NTQgNTk3UTQzOCA1ODQgNDIyIDU3M1QzOTEgNTUzVDM2NyA1MzlUMzUxIDUzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0OTsiIGdseXBoLW5hbWU9Im5hcG9zdHJvcGhlIiBob3Jpei1hZHYteD0iODQxIiBkPSJNMTI2IDQwOVExMjIgNDA1IDExMyA0MDZUOTYgNDExVDgzIDQyM1Q4MSA0MzhMMTkxIDY2MVExOTIgNjYzIDIwNSA2NjNUMjM1IDY1OVQyNjQgNjQ1VDI3NyA2MTdRMjc3IDYwMiAyNzEgNTg5VDI0OSA1NThMMTI2IDQwOVpNNDAzIDQ4NVE0MTUgNDg1IDQyNiA0ODJUNDQ2IDQ2OVQ0NTggNDQzVDQ1OCA0MDNRNDg2IDQ0NSA1MjcgNDY5VDYxOSA0OTNRNjU4IDQ5MyA2ODggNDgxVDczOSA0NDhUNzcxIDM5OFQ3ODIgMzM0UTc4MiAzMDggNzc0IDI3MFQ3NTMgMTg5UTc0MiAxNTIgNzM2IDEyNFQ3MjkgODFRNzI5IDYxIDczOSA1MlQ3NzAgNDFRNzcxIDQxIDc3MCAzM1Q3NjMgMTZUNzQ0IC0xVDcwOSAtOVE2NzAgLTkgNjUwIDEyVDYzMCA2OVE2MzAgOTAgNjM3IDEyMVQ2NTUgMTkzUTY2NiAyMjkgNjcyIDI2MFQ2NzkgMzA5UTY3OSAzNTUgNjU1IDM4MVQ1ODMgNDA3UTUzNiA0MDcgNTAzIDM4NFQ0NDEgMzExTDM3NSAwSDI3NkwzNzggNDgwUTM4MCA0ODUgNDAzIDQ4NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0QzsiIGdseXBoLW5hbWU9Ik9tYWNyb24iIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zNjYgLTExUTI5NiAtMTEgMjQyIDExVDE1MCA3MVQ5MyAxNjBUNzMgMjcxUTczIDM1NCAxMDIgNDI1VDE4MCA1NDhUMjk1IDYzMFQ0MzQgNjYwUTUwMyA2NjAgNTU3IDYzOFQ2NDkgNTc4VDcwNyA0ODhUNzI3IDM3N1E3MjcgMjk0IDY5OCAyMjNUNjIwIDEwMFQ1MDUgMTlUMzY2IC0xMVpNMzc0IDc5UTQyMCA3OSA0NjQgMTAwVDU0NCAxNjBUNjAwIDI1MlQ2MjEgMzcwUTYyMSA0MTEgNjA4IDQ0N1Q1NzEgNTExVDUxMCA1NTNUNDI2IDU2OVEzNzkgNTY5IDMzNSA1NDhUMjU1IDQ4OFQxOTkgMzk2VDE3OCAyNzhRMTc4IDIzNyAxOTEgMjAxVDIyOSAxMzdUMjkwIDk1VDM3NCA3OVpNMzM4IDcyMVEyOTggNzIxIDI5OCA3NDdRMjk4IDc1NiAzMDEgNzcwVDMxMyA3OTNRMzIzIDgwMyAzNDkgODAzSDU3M1E2MTQgODAzIDYxNCA3NzdRNjE0IDc2OSA2MTAgNzU1VDU5OCA3MzJRNTg4IDcyMSA1NjIgNzIxSDMzOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RDsiIGdseXBoLW5hbWU9Im9tYWNyb24iIGhvcml6LWFkdi14PSI1ODgiIGQ9Ik0yNzEgLTEyUTIyMSAtMTIgMTgwIDRUMTA5IDUwVDYzIDEyMVQ0NiAyMTBRNDYgMjY2IDY1IDMxN1QxMjEgNDA3VDIwNyA0NjlUMzE4IDQ5M1EzNjcgNDkzIDQwOCA0NzdUNDgwIDQzMVQ1MjYgMzYwVDU0MyAyNzFRNTQzIDIxNSA1MjQgMTY0VDQ2OCA3NFQzODIgMTJUMjcxIC0xMlpNMjc1IDY3UTMxMyA2NyAzNDUgODNUNDAxIDEyN1Q0MzggMTkxVDQ1MiAyNjdRNDUyIDI5OSA0NDIgMzI2VDQxMyAzNzJUMzY5IDQwM1QzMTQgNDE0UTI3NiA0MTQgMjQ0IDM5OFQxODggMzU0VDE1MSAyOTBUMTM3IDIxNFExMzcgMTgyIDE0NyAxNTVUMTc2IDEwOVQyMjAgNzhUMjc1IDY3Wk0yMjQgNTYyUTE4NCA1NjIgMTg0IDU4OFExODQgNTk3IDE4NyA2MTFUMTk5IDYzNFEyMDkgNjQ0IDIzNSA2NDRINDU5UTUwMCA2NDQgNTAwIDYxOFE1MDAgNjEwIDQ5NiA1OTZUNDg0IDU3M1E0NzQgNTYyIDQ0OCA1NjJIMjI0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTRFOyIgZ2x5cGgtbmFtZT0iT2JyZXZlIiBob3Jpei1hZHYteD0iNzY1IiBkPSJNMzY2IC0xMVEyOTYgLTExIDI0MiAxMVQxNTAgNzFUOTMgMTYwVDczIDI3MVE3MyAzNTQgMTAyIDQyNVQxODAgNTQ4VDI5NSA2MzBUNDM0IDY2MFE1MDMgNjYwIDU1NyA2MzhUNjQ5IDU3OFQ3MDcgNDg4VDcyNyAzNzdRNzI3IDI5NCA2OTggMjIzVDYyMCAxMDBUNTA1IDE5VDM2NiAtMTFaTTM3NCA3OVE0MjAgNzkgNDY0IDEwMFQ1NDQgMTYwVDYwMCAyNTJUNjIxIDM3MFE2MjEgNDExIDYwOCA0NDdUNTcxIDUxMVQ1MTAgNTUzVDQyNiA1NjlRMzc5IDU2OSAzMzUgNTQ4VDI1NSA0ODhUMTk5IDM5NlQxNzggMjc4UTE3OCAyMzcgMTkxIDIwMVQyMjkgMTM3VDI5MCA5NVQzNzQgNzlaTTQ2MyA3MDVRNDM2IDcwNSA0MTAgNzE1VDM2NCA3NDJUMzMxIDc3OFQzMTkgODE3UTMxOSA4MzEgMzI4IDg0MlQzNTQgODU0UTM3NCA4NTQgNDAwIDgzNFQ0NjIgNzYzUTUwNSA4MTEgNTM1IDgzMlQ1ODggODU0UTYwNCA4NTQgNjE0IDg0NVQ2MjQgODIxUTYyNCA4MDQgNjEwIDc4NFQ1NzQgNzQ3VDUyMiA3MTdUNDYzIDcwNVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE0RjsiIGdseXBoLW5hbWU9Im9icmV2ZSIgaG9yaXotYWR2LXg9IjU4OCIgZD0iTTI3MSAtMTJRMjIxIC0xMiAxODAgNFQxMDkgNTBUNjMgMTIxVDQ2IDIxMFE0NiAyNjYgNjUgMzE3VDEyMSA0MDdUMjA3IDQ2OVQzMTggNDkzUTM2NyA0OTMgNDA4IDQ3N1Q0ODAgNDMxVDUyNiAzNjBUNTQzIDI3MVE1NDMgMjE1IDUyNCAxNjRUNDY4IDc0VDM4MiAxMlQyNzEgLTEyWk0yNzUgNjdRMzEzIDY3IDM0NSA4M1Q0MDEgMTI3VDQzOCAxOTFUNDUyIDI2N1E0NTIgMjk5IDQ0MiAzMjZUNDEzIDM3MlQzNjkgNDAzVDMxNCA0MTRRMjc2IDQxNCAyNDQgMzk4VDE4OCAzNTRUMTUxIDI5MFQxMzcgMjE0UTEzNyAxODIgMTQ3IDE1NVQxNzYgMTA5VDIyMCA3OFQyNzUgNjdaTTMzNSA1NDZRMzA4IDU0NiAyODIgNTU2VDIzNiA1ODNUMjAzIDYxOVQxOTEgNjU4UTE5MSA2NzIgMjAwIDY4M1QyMjYgNjk1UTI0NiA2OTUgMjcyIDY3NVQzMzQgNjA0UTM3NyA2NTIgNDA3IDY3M1Q0NjAgNjk1UTQ3NiA2OTUgNDg2IDY4NlQ0OTYgNjYyUTQ5NiA2NDUgNDgyIDYyNVQ0NDYgNTg4VDM5NCA1NThUMzM1IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1MDsiIGdseXBoLW5hbWU9Ik9odW5nYXJ1bWxhdXQiIGhvcml6LWFkdi14PSI3NjUiIGQ9Ik0zNjYgLTExUTI5NiAtMTEgMjQyIDExVDE1MCA3MVQ5MyAxNjBUNzMgMjcxUTczIDM1NCAxMDIgNDI1VDE4MCA1NDhUMjk1IDYzMFQ0MzQgNjYwUTUwMyA2NjAgNTU3IDYzOFQ2NDkgNTc4VDcwNyA0ODhUNzI3IDM3N1E3MjcgMjk0IDY5OCAyMjNUNjIwIDEwMFQ1MDUgMTlUMzY2IC0xMVpNMzc0IDc5UTQyMCA3OSA0NjQgMTAwVDU0NCAxNjBUNjAwIDI1MlQ2MjEgMzcwUTYyMSA0MTEgNjA4IDQ0N1Q1NzEgNTExVDUxMCA1NTNUNDI2IDU2OVEzNzkgNTY5IDMzNSA1NDhUMjU1IDQ4OFQxOTkgMzk2VDE3OCAyNzhRMTc4IDIzNyAxOTEgMjAxVDIyOSAxMzdUMjkwIDk1VDM3NCA3OVpNNDk3IDcxNFE0OTUgNzE3IDUwNCA3MzJUNTMxIDc2OVQ1NzEgODEyVDYxOCA4NTFRNjQzIDg2OCA2NjYgODY4UTY4NCA4NjggNjk3IDg1N1Q3MTEgODI5UTcxMSA3OTQgNjY4IDc2OFE2NDEgNzUwIDYxMiA3MzlUNTU4IDcyMFQ1MTYgNzEyVDQ5NyA3MTRaTTMwMCA3MTRRMjk4IDcxNyAzMDcgNzMyVDMzNCA3NjlUMzczIDgxMlQ0MjAgODUxUTQ0NiA4NjggNDY4IDg2OFE0ODcgODY4IDUwMCA4NTdUNTEzIDgyOVE1MTMgODEyIDUwMyA3OTdUNDcxIDc2OFE0NDQgNzUwIDQxNSA3MzlUMzYxIDcyMFQzMTkgNzEyVDMwMCA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTE7IiBnbHlwaC1uYW1lPSJvaHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNTg4IiBkPSJNMjcxIC0xMlEyMjEgLTEyIDE4MCA0VDEwOSA1MFQ2MyAxMjFUNDYgMjEwUTQ2IDI2NiA2NSAzMTdUMTIxIDQwN1QyMDcgNDY5VDMxOCA0OTNRMzY3IDQ5MyA0MDggNDc3VDQ4MCA0MzFUNTI2IDM2MFQ1NDMgMjcxUTU0MyAyMTUgNTI0IDE2NFQ0NjggNzRUMzgyIDEyVDI3MSAtMTJaTTI3NSA2N1EzMTMgNjcgMzQ1IDgzVDQwMSAxMjdUNDM4IDE5MVQ0NTIgMjY3UTQ1MiAyOTkgNDQyIDMyNlQ0MTMgMzcyVDM2OSA0MDNUMzE0IDQxNFEyNzYgNDE0IDI0NCAzOThUMTg4IDM1NFQxNTEgMjkwVDEzNyAyMTRRMTM3IDE4MiAxNDcgMTU1VDE3NiAxMDlUMjIwIDc4VDI3NSA2N1pNMzczIDU1NVEzNzEgNTU4IDM4MCA1NzNUNDA3IDYxMFQ0NDcgNjUzVDQ5NCA2OTJRNTE5IDcwOSA1NDIgNzA5UTU2MCA3MDkgNTczIDY5OFQ1ODcgNjcwUTU4NyA2MzUgNTQ0IDYwOVE1MTcgNTkxIDQ4OCA1ODBUNDM0IDU2MVQzOTIgNTUzVDM3MyA1NTVaTTE3NiA1NTVRMTc0IDU1OCAxODMgNTczVDIxMCA2MTBUMjQ5IDY1M1QyOTYgNjkyUTMyMiA3MDkgMzQ0IDcwOVEzNjMgNzA5IDM3NiA2OThUMzg5IDY3MFEzODkgNjUzIDM3OSA2MzhUMzQ3IDYwOVEzMjAgNTkxIDI5MSA1ODBUMjM3IDU2MVQxOTUgNTUzVDE3NiA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTI7IiBnbHlwaC1uYW1lPSJPRSIgaG9yaXotYWR2LXg9IjEwNTciIGQ9Ik0zNjYgLTExUTI5NiAtMTEgMjQyIDExVDE1MCA3MVQ5MyAxNjBUNzMgMjcxUTczIDM1NCAxMDIgNDI1VDE4MCA1NDhUMjk1IDYzMFQ0MzQgNjYwUTQ1OSA2NjAgNDgyIDY1N1Q1MjcgNjQ3SDEwMzRRMTA3OSA2NDcgMTA3OSA2MThRMTA3OSA2MDggMTA3NCA1OTJUMTA2MSA1NjdRMTA1NSA1NjAgMTA0NyA1NThUMTAyMSA1NTZINjY2UTY5NSA1MTkgNzExIDQ3NFQ3MjcgMzc3VjM3NEg5MDVROTQ3IDM3NCA5NDcgMzQ3UTk0NyAzMzggOTQzIDMyMlQ5MzEgMjk4UTkyNSAyOTMgOTE3IDI5MFQ4OTMgMjg3SDcxNlE3MDMgMjI4IDY3NSAxNzlUNjA3IDkxSDkyMlE5NjcgOTEgOTY3IDYzUTk2NyA1MiA5NjIgMzZUOTQ5IDExUTkzOCAwIDkwOSAwSDQ0OFE0MDYgLTExIDM2NiAtMTFaTTM3NCA3OVE0MjAgNzkgNDY0IDEwMFQ1NDQgMTYwVDYwMCAyNTJUNjIxIDM3MFE2MjEgNDExIDYwOCA0NDdUNTcxIDUxMVQ1MTAgNTUzVDQyNiA1NjlRMzc5IDU2OSAzMzUgNTQ4VDI1NSA0ODhUMTk5IDM5NlQxNzggMjc4UTE3OCAyMzcgMTkxIDIwMVQyMjkgMTM3VDI5MCA5NVQzNzQgNzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTM7IiBnbHlwaC1uYW1lPSJvZSIgaG9yaXotYWR2LXg9Ijk1OCIgZD0iTTUxNiAzNjFRNTU0IDQyMiA2MTUgNDU3VDc1NSA0OTNRODQxIDQ5MyA4ODcgNDU3VDkzNCAzNjBROTM0IDMyNCA5MjEgMjk1VDg3NiAyNDZUNzkwIDIxNVQ2NTUgMjA0UTYyOSAyMDQgNjAxIDIwNVQ1NDAgMjA5VjE5MVE1NDAgMTM0IDU3MyA5OVQ2NzMgNjRRNzI2IDY0IDc2MiA4M1Q4MjYgMTM5UTgyNyAxNDAgODM0IDEzOVQ4NDkgMTMzVDg2NSAxMjBUODcyIDk4UTg3MiA4MyA4NjcgNzNUODQ3IDQ4UTgxOCAxOSA3NzUgNFQ2NzEgLTEyUTU5OSAtMTIgNTUwIDE4VDQ4MCAxMDBRNDQ1IDUwIDM5MSAxOVQyNjggLTEyUTIxOSAtMTIgMTc5IDRUMTA5IDQ5VDYzIDExOVQ0NiAyMTBRNDYgMjY2IDY1IDMxN1QxMjAgNDA3VDIwNCA0NjlUMzE0IDQ5M1EzODYgNDkzIDQzOSA0NTlUNTE2IDM2MVpNMjc1IDY3UTMxMyA2NyAzNDUgODNUNDAxIDEyN1Q0MzggMTkxVDQ1MiAyNjdRNDUyIDI5OSA0NDIgMzI2VDQxMyAzNzJUMzY5IDQwM1QzMTQgNDE0UTI3NiA0MTQgMjQ0IDM5OFQxODggMzU0VDE1MSAyOTBUMTM3IDIxNFExMzcgMTgyIDE0NyAxNTVUMTc2IDEwOVQyMjAgNzhUMjc1IDY3Wk03NDkgNDE5UTcxNiA0MTkgNjg3IDQwOFQ2MzIgMzc5VDU4OCAzMzRUNTU2IDI3OFE1ODIgMjc1IDYwNCAyNzRUNjQ2IDI3M1E3MDQgMjczIDc0MiAyODBUODAzIDI5OFQ4MzUgMzI1VDg0NCAzNTdRODQ0IDM4MSA4MjEgNDAwVDc0OSA0MTlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTQ7IiBnbHlwaC1uYW1lPSJSYWN1dGUiIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik02MTMgNDc5UTYxMyAzNzkgNTUxIDMyMVQzNzYgMjYwTDQ1MSAxMzNRNDYzIDExMyA0NzIgOTlUNDkyIDc2VDUxNiA2M1Q1NDYgNThRNTQ3IDU4IDU0NyA0OFQ1NDEgMjZUNTIxIDRUNDc4IC02UTQ2MSAtNiA0NDcgLTJUNDE4IDE0VDM5MCA0NlQzNTcgOTlMMjcxIDI1M0gxOTFMMTM4IDBIMzVMMTYwIDU5MFExNjkgNjQ3IDIyNyA2NDdIMzg2UTQ5OCA2NDcgNTU1IDYwNVQ2MTMgNDc5Wk0zNTUgMzM0UTQyOSAzMzQgNDY4IDM2OVQ1MDcgNDY4UTUwNyA1MTUgNDc0IDUzOVQzNzcgNTYzSDI1NkwyMDcgMzM0SDM1NVpNMzE2IDcxNFEzMTQgNzE3IDMyNSA3MzNUMzU3IDc3MFQ0MDIgODEyVDQ1MiA4NDlRNDc2IDg2NCA1MDEgODY0UTUyMSA4NjQgNTMyIDg1MlQ1NDQgODIyUTU0NCA4MDYgNTMyIDc5MlQ0OTggNzY0UTQ2OSA3NDcgNDM4IDczNlQzODAgNzE5VDMzNiA3MTJUMzE2IDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1NTsiIGdseXBoLW5hbWU9InJhY3V0ZSIgaG9yaXotYWR2LXg9IjQwNiIgZD0iTTE1MyA0ODVRMTY1IDQ4NSAxNzYgNDgxVDE5NiA0NjhUMjA4IDQ0MlQyMDcgNDAwUTIzMSA0NDUgMjYzIDQ2OVQzMzkgNDkzUTM3MSA0OTMgMzkzIDQ3OVQ0MTYgNDM4UTQxNiA0MjAgNDEwIDQwN1QzOTUgMzg3VDM4MSAzNzZUMzczIDM3NFEzNjMgMzg1IDM0OCAzOTNUMzA5IDQwMVEyODIgNDAxIDI2MCAzODZUMjIwIDM0NFQxODkgMjc5VDE2NiAxOTZMMTI1IDBIMjZMMTI4IDQ4MFExMzAgNDg1IDE1MyA0ODVaTTE5MyA1NTVRMTkxIDU1OCAyMDIgNTc0VDIzNCA2MTFUMjc5IDY1M1QzMjkgNjkwUTM1MyA3MDUgMzc4IDcwNVEzOTggNzA1IDQwOSA2OTNUNDIxIDY2M1E0MjEgNjQ3IDQwOSA2MzNUMzc1IDYwNVEzNDYgNTg4IDMxNSA1NzdUMjU3IDU2MFQyMTMgNTUzVDE5MyA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTY7IiBnbHlwaC1uYW1lPSJSY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik02MTMgNDc5UTYxMyAzNzkgNTUxIDMyMVQzNzYgMjYwTDQ1MSAxMzNRNDYzIDExMyA0NzIgOTlUNDkyIDc2VDUxNiA2M1Q1NDYgNThRNTQ3IDU4IDU0NyA0OFQ1NDEgMjZUNTIxIDRUNDc4IC02UTQ2MSAtNiA0NDcgLTJUNDE4IDE0VDM5MCA0NlQzNTcgOTlMMjcxIDI1M0gxOTFMMTM4IDBIMzVMMTYwIDU5MFExNjkgNjQ3IDIyNyA2NDdIMzg2UTQ5OCA2NDcgNTU1IDYwNVQ2MTMgNDc5Wk0zNTUgMzM0UTQyOSAzMzQgNDY4IDM2OVQ1MDcgNDY4UTUwNyA1MTUgNDc0IDUzOVQzNzcgNTYzSDI1NkwyMDcgMzM0SDM1NVpNMTc1IC0yNTNRMTcwIC0yNTggMTYyIC0yNTdUMTQ1IC0yNTBUMTMxIC0yMzhUMTI5IC0yMjRMMjMyIC00M1EyMzMgLTQyIDI0NiAtNDJUMjc0IC00N1QzMDIgLTYyVDMxNSAtOTBRMzE1IC0xMDYgMzA5IC0xMTlUMjg1IC0xNDlMMTc1IC0yNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTc7IiBnbHlwaC1uYW1lPSJyY29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0MDYiIGQ9Ik0xNTMgNDg1UTE2NSA0ODUgMTc2IDQ4MVQxOTYgNDY4VDIwOCA0NDJUMjA3IDQwMFEyMzEgNDQ1IDI2MyA0NjlUMzM5IDQ5M1EzNzEgNDkzIDM5MyA0NzlUNDE2IDQzOFE0MTYgNDIwIDQxMCA0MDdUMzk1IDM4N1QzODEgMzc2VDM3MyAzNzRRMzYzIDM4NSAzNDggMzkzVDMwOSA0MDFRMjgyIDQwMSAyNjAgMzg2VDIyMCAzNDRUMTg5IDI3OVQxNjYgMTk2TDEyNSAwSDI2TDEyOCA0ODBRMTMwIDQ4NSAxNTMgNDg1Wk0tMjIgLTI1M1EtMjcgLTI1OCAtMzUgLTI1N1QtNTIgLTI1MFQtNjYgLTIzOFQtNjggLTIyNEwzNSAtNDNRMzYgLTQyIDQ5IC00MlQ3NyAtNDdUMTA1IC02MlQxMTggLTkwUTExOCAtMTA2IDExMiAtMTE5VDg4IC0xNDlMLTIyIC0yNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTg7IiBnbHlwaC1uYW1lPSJSY2Fyb24iIGhvcml6LWFkdi14PSI2MjEiIGQ9Ik02MTMgNDc5UTYxMyAzNzkgNTUxIDMyMVQzNzYgMjYwTDQ1MSAxMzNRNDYzIDExMyA0NzIgOTlUNDkyIDc2VDUxNiA2M1Q1NDYgNThRNTQ3IDU4IDU0NyA0OFQ1NDEgMjZUNTIxIDRUNDc4IC02UTQ2MSAtNiA0NDcgLTJUNDE4IDE0VDM5MCA0NlQzNTcgOTlMMjcxIDI1M0gxOTFMMTM4IDBIMzVMMTYwIDU5MFExNjkgNjQ3IDIyNyA2NDdIMzg2UTQ5OCA2NDcgNTU1IDYwNVQ2MTMgNDc5Wk0zNTUgMzM0UTQyOSAzMzQgNDY4IDM2OVQ1MDcgNDY4UTUwNyA1MTUgNDc0IDUzOVQzNzcgNTYzSDI1NkwyMDcgMzM0SDM1NVpNMzg0IDY5MVEzNzcgNjkzIDM1NiA3MTFUMzE1IDc1NFEyOTMgNzgwIDI4NCA4MDhUMjc0IDg0OVEyNzQgODY4IDI4NCA4NzBUMzA5IDg3M1EzMzggODczIDM3MSA4MTJRMzc2IDgwMyAzODIgNzkyVDM5NiA3NjZMNDM5IDgxNFE0NjQgODQxIDQ4NSA4NTdUNTI0IDg3M1E1MzggODczIDU0NSA4NjVUNTUzIDg0NVE1NTMgODI1IDUzNiA4MDRUNDg3IDc1NlE0NzEgNzQzIDQ1NSA3MzJUNDI0IDcxMlQ0MDAgNjk4VDM4NCA2OTFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNTk7IiBnbHlwaC1uYW1lPSJyY2Fyb24iIGhvcml6LWFkdi14PSI0MDYiIGQ9Ik0xNTMgNDg1UTE2NSA0ODUgMTc2IDQ4MVQxOTYgNDY4VDIwOCA0NDJUMjA3IDQwMFEyMzEgNDQ1IDI2MyA0NjlUMzM5IDQ5M1EzNzEgNDkzIDM5MyA0NzlUNDE2IDQzOFE0MTYgNDIwIDQxMCA0MDdUMzk1IDM4N1QzODEgMzc2VDM3MyAzNzRRMzYzIDM4NSAzNDggMzkzVDMwOSA0MDFRMjgyIDQwMSAyNjAgMzg2VDIyMCAzNDRUMTg5IDI3OVQxNjYgMTk2TDEyNSAwSDI2TDEyOCA0ODBRMTMwIDQ4NSAxNTMgNDg1Wk0yNjUgNTMyUTI1OCA1MzQgMjM3IDU1MlQxOTYgNTk1UTE3NCA2MjEgMTY1IDY0OVQxNTUgNjkwUTE1NSA3MDkgMTY1IDcxMVQxOTAgNzE0UTIxOSA3MTQgMjUyIDY1M1EyNTcgNjQ0IDI2MyA2MzNUMjc3IDYwN0wzMjAgNjU1UTM0NSA2ODIgMzY2IDY5OFQ0MDUgNzE0UTQxOSA3MTQgNDI2IDcwNlQ0MzQgNjg2UTQzNCA2NjYgNDE3IDY0NVQzNjggNTk3UTM1MiA1ODQgMzM2IDU3M1QzMDUgNTUzVDI4MSA1MzlUMjY1IDUzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1QTsiIGdseXBoLW5hbWU9IlNhY3V0ZSIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTI3MiAtMTJRMTk5IC0xMiAxNDUgOFQ1OSA2MFE0MiA3OCAzMiA5NlQyMiAxMzVRMjIgMTUwIDI5IDE2MVQ0NiAxNzhUNjMgMTg3VDcyIDE4OFE5OCAxMzYgMTQ5IDEwNFQyNzQgNzJRMzQyIDcyIDM3NCA5OVQ0MDcgMTc0UTQwNyAxOTYgMzk3IDIxMVQzNjkgMjM5VDMyOCAyNjJUMjc3IDI4NFEyNDcgMjk2IDIxNyAzMTFUMTYzIDM0N1QxMjUgMzk3VDExMCA0NjhRMTEwIDUwNyAxMjUgNTQyVDE3MCA2MDNUMjQzIDY0NFQzNDMgNjU5UTQxNSA2NTkgNDY0IDY0MVQ1NDEgNTk0UTU3MyA1NjIgNTczIDUyNlE1NzMgNTA5IDU2NiA0OThUNTQ5IDQ4MVQ1MzEgNDcyVDUyMSA0NzJRNDk4IDUxOSA0NTMgNTQ3VDM0MCA1NzVRMjgzIDU3NSAyNDggNTQ4VDIxMyA0NzlRMjEzIDQ1NSAyMjMgNDM5VDI1MSA0MDlUMjk0IDM4NVQzNDkgMzYxUTM4MCAzNDkgNDEwIDMzNVQ0NjMgMzAwVDUwMSAyNTJUNTE2IDE4NFE1MTYgMTQxIDUwMSAxMDVUNDU1IDQzVDM3OCAzVDI3MiAtMTJaTTMwOCA3MTRRMzA2IDcxNyAzMTcgNzMzVDM0OSA3NzBUMzk0IDgxMlQ0NDQgODQ5UTQ2OCA4NjQgNDkzIDg2NFE1MTMgODY0IDUyNCA4NTJUNTM2IDgyMlE1MzYgODA2IDUyNCA3OTJUNDkwIDc2NFE0NjEgNzQ3IDQzMCA3MzZUMzcyIDcxOVQzMjggNzEyVDMwOCA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUI7IiBnbHlwaC1uYW1lPSJzYWN1dGUiIGhvcml6LWFkdi14PSI0OTAiIGQ9Ik0yMjggLTEyUTE2NSAtMTIgMTE3IDZUNDIgNTFRMzEgNjIgMjQgNzVUMTcgMTAxUTE3IDExNCAyMyAxMjRUMzYgMTQwVDUwIDE0OFQ1OCAxNTBRODIgMTE0IDEyNCA4OVQyMjQgNjNRMjcyIDYzIDI5NyA4MVQzMjIgMTMwUTMyMiAxNTcgMjk2IDE3MVQyMjQgMjAyUTE5OCAyMTEgMTczIDIyMlQxMjcgMjQ5VDk0IDI4N1Q4MSAzNDNRODEgMzc2IDk0IDQwM1QxMzEgNDUxVDE5MCA0ODJUMjY4IDQ5M1EzMjQgNDkzIDM2NyA0NzdUNDM1IDQzNFE0NjAgNDEwIDQ2MCAzODRRNDYwIDM3MCA0NTQgMzYwVDQzOSAzNDRUNDIzIDMzNlQ0MTUgMzM2UTM5NSAzNzEgMzU1IDM5NFQyNjcgNDE4UTIyMCA0MTggMTk3IDM5OVQxNzQgMzUzUTE3NCAzMjQgMjAyIDMwOVQyNzggMjc1UTMwNSAyNjUgMzMwIDI1NFQzNzYgMjI4VDQwOCAxOTFUNDIxIDEzOFE0MjEgNzAgMzcxIDI5VDIyOCAtMTJaTTIzOCA1NTVRMjM2IDU1OCAyNDcgNTc0VDI3OSA2MTFUMzI0IDY1M1QzNzQgNjkwUTM5OCA3MDUgNDIzIDcwNVE0NDMgNzA1IDQ1NCA2OTNUNDY2IDY2M1E0NjYgNjQ3IDQ1NCA2MzNUNDIwIDYwNVEzOTEgNTg4IDM2MCA1NzdUMzAyIDU2MFQyNTggNTUzVDIzOCA1NTVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNUM7IiBnbHlwaC1uYW1lPSJTY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTI3MiAtMTJRMTk5IC0xMiAxNDUgOFQ1OSA2MFE0MiA3OCAzMiA5NlQyMiAxMzVRMjIgMTUwIDI5IDE2MVQ0NiAxNzhUNjMgMTg3VDcyIDE4OFE5OCAxMzYgMTQ5IDEwNFQyNzQgNzJRMzQyIDcyIDM3NCA5OVQ0MDcgMTc0UTQwNyAxOTYgMzk3IDIxMVQzNjkgMjM5VDMyOCAyNjJUMjc3IDI4NFEyNDcgMjk2IDIxNyAzMTFUMTYzIDM0N1QxMjUgMzk3VDExMCA0NjhRMTEwIDUwNyAxMjUgNTQyVDE3MCA2MDNUMjQzIDY0NFQzNDMgNjU5UTQxNSA2NTkgNDY0IDY0MVQ1NDEgNTk0UTU3MyA1NjIgNTczIDUyNlE1NzMgNTA5IDU2NiA0OThUNTQ5IDQ4MVQ1MzEgNDcyVDUyMSA0NzJRNDk4IDUxOSA0NTMgNTQ3VDM0MCA1NzVRMjgzIDU3NSAyNDggNTQ4VDIxMyA0NzlRMjEzIDQ1NSAyMjMgNDM5VDI1MSA0MDlUMjk0IDM4NVQzNDkgMzYxUTM4MCAzNDkgNDEwIDMzNVQ0NjMgMzAwVDUwMSAyNTJUNTE2IDE4NFE1MTYgMTQxIDUwMSAxMDVUNDU1IDQzVDM3OCAzVDI3MiAtMTJaTTI3MSA3MDZRMjU3IDcwNiAyNTAgNzE0VDI0MiA3MzRRMjQyIDc1MyAyNTkgNzc0VDMwOCA4MjJRMzI0IDgzNSAzNDAgODQ2VDM3MSA4NjdUMzk1IDg4MVQ0MTEgODg3UTQxOCA4ODUgNDM5IDg2N1Q0ODAgODI0UTUwMiA3OTggNTExIDc3OVQ1MjEgNzQ1UTUyMSA3MjcgNTExIDcxN1Q0ODYgNzA2UTQ3MCA3MDYgNDU2IDcyMFQ0MjQgNzY2UTQxOSA3NzYgNDEzIDc4N1QzOTkgODEyUTM4OCA3OTkgMzc4IDc4OFQzNTYgNzY1UTMzMSA3MzcgMzEwIDcyMlQyNzEgNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVEOyIgZ2x5cGgtbmFtZT0ic2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI0OTAiIGQ9Ik0yMjggLTEyUTE2NSAtMTIgMTE3IDZUNDIgNTFRMzEgNjIgMjQgNzVUMTcgMTAxUTE3IDExNCAyMyAxMjRUMzYgMTQwVDUwIDE0OFQ1OCAxNTBRODIgMTE0IDEyNCA4OVQyMjQgNjNRMjcyIDYzIDI5NyA4MVQzMjIgMTMwUTMyMiAxNTcgMjk2IDE3MVQyMjQgMjAyUTE5OCAyMTEgMTczIDIyMlQxMjcgMjQ5VDk0IDI4N1Q4MSAzNDNRODEgMzc2IDk0IDQwM1QxMzEgNDUxVDE5MCA0ODJUMjY4IDQ5M1EzMjQgNDkzIDM2NyA0NzdUNDM1IDQzNFE0NjAgNDEwIDQ2MCAzODRRNDYwIDM3MCA0NTQgMzYwVDQzOSAzNDRUNDIzIDMzNlQ0MTUgMzM2UTM5NSAzNzEgMzU1IDM5NFQyNjcgNDE4UTIyMCA0MTggMTk3IDM5OVQxNzQgMzUzUTE3NCAzMjQgMjAyIDMwOVQyNzggMjc1UTMwNSAyNjUgMzMwIDI1NFQzNzYgMjI4VDQwOCAxOTFUNDIxIDEzOFE0MjEgNzAgMzcxIDI5VDIyOCAtMTJaTTE5NSA1NDdRMTgxIDU0NyAxNzQgNTU1VDE2NiA1NzVRMTY2IDU5NCAxODMgNjE1VDIzMiA2NjNRMjQ4IDY3NiAyNjQgNjg3VDI5NSA3MDhUMzE5IDcyMlQzMzUgNzI4UTM0MiA3MjYgMzYzIDcwOFQ0MDQgNjY1UTQyNiA2MzkgNDM1IDYyMFQ0NDUgNTg2UTQ0NSA1NjggNDM1IDU1OFQ0MTAgNTQ3UTM5NCA1NDcgMzgwIDU2MVQzNDggNjA3UTM0MyA2MTcgMzM3IDYyOFQzMjMgNjUzUTMxMiA2NDAgMzAyIDYyOVQyODAgNjA2UTI1NSA1NzggMjM0IDU2M1QxOTUgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTVFOyIgZ2x5cGgtbmFtZT0iU2NlZGlsbGEiIGhvcml6LWFkdi14PSI1ODAiIGQ9Ik0yNzIgLTEyUTE5OSAtMTIgMTQ1IDhUNTkgNjBRNDIgNzggMzIgOTZUMjIgMTM1UTIyIDE1MCAyOSAxNjFUNDYgMTc4VDYzIDE4N1Q3MiAxODhROTggMTM2IDE0OSAxMDRUMjc0IDcyUTM0MiA3MiAzNzQgOTlUNDA3IDE3NFE0MDcgMTk2IDM5NyAyMTFUMzY5IDIzOVQzMjggMjYyVDI3NyAyODRRMjQ3IDI5NiAyMTcgMzExVDE2MyAzNDdUMTI1IDM5N1QxMTAgNDY4UTExMCA1MDcgMTI1IDU0MlQxNzAgNjAzVDI0MyA2NDRUMzQzIDY1OVE0MTUgNjU5IDQ2NCA2NDFUNTQxIDU5NFE1NzMgNTYyIDU3MyA1MjZRNTczIDUwOSA1NjYgNDk4VDU0OSA0ODFUNTMxIDQ3MlQ1MjEgNDcyUTQ5OCA1MTkgNDUzIDU0N1QzNDAgNTc1UTI4MyA1NzUgMjQ4IDU0OFQyMTMgNDc5UTIxMyA0NTUgMjIzIDQzOVQyNTEgNDA5VDI5NCAzODVUMzQ5IDM2MVEzODAgMzQ5IDQxMCAzMzVUNDYzIDMwMFQ1MDEgMjUyVDUxNiAxODRRNTE2IDE0MSA1MDEgMTA1VDQ1NSA0M1QzNzggM1QyNzIgLTEyWk0xNTIgLTIzNFExNDcgLTIzOCAxMzkgLTIzNlQxMjQgLTIzMFQxMTIgLTIxOVQxMTEgLTIwN0wyMTMgLTQ1UTIxNCAtNDQgMjI2IC00NFQyNTIgLTQ5VDI3NyAtNjNUMjg5IC04OFEyODkgLTEwMyAyODIgLTExNVQyNTcgLTE0MkwxNTIgLTIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE1RjsiIGdseXBoLW5hbWU9InNjZWRpbGxhIiBob3Jpei1hZHYteD0iNDkwIiBkPSJNMjI4IC0xMlExNjUgLTEyIDExNyA2VDQyIDUxUTMxIDYyIDI0IDc1VDE3IDEwMVExNyAxMTQgMjMgMTI0VDM2IDE0MFQ1MCAxNDhUNTggMTUwUTgyIDExNCAxMjQgODlUMjI0IDYzUTI3MiA2MyAyOTcgODFUMzIyIDEzMFEzMjIgMTU3IDI5NiAxNzFUMjI0IDIwMlExOTggMjExIDE3MyAyMjJUMTI3IDI0OVQ5NCAyODdUODEgMzQzUTgxIDM3NiA5NCA0MDNUMTMxIDQ1MVQxOTAgNDgyVDI2OCA0OTNRMzI0IDQ5MyAzNjcgNDc3VDQzNSA0MzRRNDYwIDQxMCA0NjAgMzg0UTQ2MCAzNzAgNDU0IDM2MFQ0MzkgMzQ0VDQyMyAzMzZUNDE1IDMzNlEzOTUgMzcxIDM1NSAzOTRUMjY3IDQxOFEyMjAgNDE4IDE5NyAzOTlUMTc0IDM1M1ExNzQgMzI0IDIwMiAzMDlUMjc4IDI3NVEzMDUgMjY1IDMzMCAyNTRUMzc2IDIyOFQ0MDggMTkxVDQyMSAxMzhRNDIxIDcwIDM3MSAyOVQyMjggLTEyWk0xMTggLTIzNFExMTMgLTIzOCAxMDUgLTIzNlQ5MCAtMjMwVDc4IC0yMTlUNzcgLTIwN0wxNzkgLTQ1UTE4MCAtNDQgMTkyIC00NFQyMTggLTQ5VDI0MyAtNjNUMjU1IC04OFEyNTUgLTEwMyAyNDggLTExNVQyMjMgLTE0MkwxMTggLTIzNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MDsiIGdseXBoLW5hbWU9IlNjYXJvbiIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTI3MiAtMTJRMTk5IC0xMiAxNDUgOFQ1OSA2MFE0MiA3OCAzMiA5NlQyMiAxMzVRMjIgMTUwIDI5IDE2MVQ0NiAxNzhUNjMgMTg3VDcyIDE4OFE5OCAxMzYgMTQ5IDEwNFQyNzQgNzJRMzQyIDcyIDM3NCA5OVQ0MDcgMTc0UTQwNyAxOTYgMzk3IDIxMVQzNjkgMjM5VDMyOCAyNjJUMjc3IDI4NFEyNDcgMjk2IDIxNyAzMTFUMTYzIDM0N1QxMjUgMzk3VDExMCA0NjhRMTEwIDUwNyAxMjUgNTQyVDE3MCA2MDNUMjQzIDY0NFQzNDMgNjU5UTQxNSA2NTkgNDY0IDY0MVQ1NDEgNTk0UTU3MyA1NjIgNTczIDUyNlE1NzMgNTA5IDU2NiA0OThUNTQ5IDQ4MVQ1MzEgNDcyVDUyMSA0NzJRNDk4IDUxOSA0NTMgNTQ3VDM0MCA1NzVRMjgzIDU3NSAyNDggNTQ4VDIxMyA0NzlRMjEzIDQ1NSAyMjMgNDM5VDI1MSA0MDlUMjk0IDM4NVQzNDkgMzYxUTM4MCAzNDkgNDEwIDMzNVQ0NjMgMzAwVDUwMSAyNTJUNTE2IDE4NFE1MTYgMTQxIDUwMSAxMDVUNDU1IDQzVDM3OCAzVDI3MiAtMTJaTTM3MSA2OThRMzY0IDcwMCAzNDMgNzE4VDMwMiA3NjFRMjgwIDc4NyAyNzEgODE1VDI2MSA4NTZRMjYxIDg3NSAyNzEgODc3VDI5NiA4ODBRMzI1IDg4MCAzNTggODE5UTM2MyA4MTAgMzY5IDc5OVQzODMgNzczTDQyNiA4MjFRNDUxIDg0OCA0NzIgODY0VDUxMSA4ODBRNTI1IDg4MCA1MzIgODcyVDU0MCA4NTJRNTQwIDgzMiA1MjMgODExVDQ3NCA3NjNRNDU4IDc1MCA0NDIgNzM5VDQxMSA3MTlUMzg3IDcwNVQzNzEgNjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTYxOyIgZ2x5cGgtbmFtZT0ic2Nhcm9uIiBob3Jpei1hZHYteD0iNDkwIiBkPSJNMjI4IC0xMlExNjUgLTEyIDExNyA2VDQyIDUxUTMxIDYyIDI0IDc1VDE3IDEwMVExNyAxMTQgMjMgMTI0VDM2IDE0MFQ1MCAxNDhUNTggMTUwUTgyIDExNCAxMjQgODlUMjI0IDYzUTI3MiA2MyAyOTcgODFUMzIyIDEzMFEzMjIgMTU3IDI5NiAxNzFUMjI0IDIwMlExOTggMjExIDE3MyAyMjJUMTI3IDI0OVQ5NCAyODdUODEgMzQzUTgxIDM3NiA5NCA0MDNUMTMxIDQ1MVQxOTAgNDgyVDI2OCA0OTNRMzI0IDQ5MyAzNjcgNDc3VDQzNSA0MzRRNDYwIDQxMCA0NjAgMzg0UTQ2MCAzNzAgNDU0IDM2MFQ0MzkgMzQ0VDQyMyAzMzZUNDE1IDMzNlEzOTUgMzcxIDM1NSAzOTRUMjY3IDQxOFEyMjAgNDE4IDE5NyAzOTlUMTc0IDM1M1ExNzQgMzI0IDIwMiAzMDlUMjc4IDI3NVEzMDUgMjY1IDMzMCAyNTRUMzc2IDIyOFQ0MDggMTkxVDQyMSAxMzhRNDIxIDcwIDM3MSAyOVQyMjggLTEyWk0zMDAgNTMyUTI5MyA1MzQgMjcyIDU1MlQyMzEgNTk1UTIwOSA2MjEgMjAwIDY0OVQxOTAgNjkwUTE5MCA3MDkgMjAwIDcxMVQyMjUgNzE0UTI1NCA3MTQgMjg3IDY1M1EyOTIgNjQ0IDI5OCA2MzNUMzEyIDYwN0wzNTUgNjU1UTM4MCA2ODIgNDAxIDY5OFQ0NDAgNzE0UTQ1NCA3MTQgNDYxIDcwNlQ0NjkgNjg2UTQ2OSA2NjYgNDUyIDY0NVQ0MDMgNTk3UTM4NyA1ODQgMzcxIDU3M1QzNDAgNTUzVDMxNiA1MzlUMzAwIDUzMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2MjsiIGdseXBoLW5hbWU9IlRjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjYyNyIgZD0iTTMzMCA1NTVIMTU3UTExMiA1NTUgMTEyIDU4NFExMTIgNTk0IDExNiA2MTBUMTMwIDYzNlExMzUgNjQyIDE0NCA2NDRUMTcwIDY0N0g2MjRRNjY5IDY0NyA2NjkgNjE4UTY2OSA2MDggNjY0IDU5MlQ2NTEgNTY2UTY0NSA1NjAgNjM3IDU1OFQ2MTEgNTU1SDQzM0wzMTUgMEgyMTNMMzMwIDU1NVpNMTU2IC0yNTNRMTUxIC0yNTggMTQzIC0yNTdUMTI2IC0yNTBUMTEyIC0yMzhUMTEwIC0yMjRMMjEzIC00M1EyMTQgLTQyIDIyNyAtNDJUMjU1IC00N1QyODMgLTYyVDI5NiAtOTBRMjk2IC0xMDYgMjkwIC0xMTlUMjY2IC0xNDlMMTU2IC0yNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjM7IiBnbHlwaC1uYW1lPSJ0Y29tbWFhY2NlbnQiIGhvcml6LWFkdi14PSI0MDAiIGQ9Ik0yMTggLTEzUTE0MyAtMTMgMTA5IDMyVDkzIDE2NkwxNDIgNDAwSDY0UTY0IDQwMyA2NSA0MDdRNjYgNDEwIDY2IDQxNFQ2OSA0MjZRNzEgNDM0IDc0IDQ0OFQ3OSA0NzFRNzkgNDczIDc5IDQ3NVQ4MCA0NzlRODAgNDgxIDgxIDQ4MUgxNTlMMTY3IDUyMFExNzYgNTY1IDE5MyA1ODNUMjQzIDYwMlEyNTkgNjAyIDI3MCA1OTdUMjgwIDU5MEwyNTcgNDgxSDQwNlE0MDUgNDc4IDQwNCA0NzRRNDAzIDQ3MSA0MDMgNDY3VDQwMCA0NTZMMzkxIDQxMFEzOTAgNDA3IDM5MCA0MDZUMzg5IDQwMlY0MDBIMjM5TDE4OSAxNjhRMTc4IDExMyAxOTMgOTBUMjQ0IDY2UTI2NCA2NiAyODEgNzVUMzA3IDk0UTMwOSA5NiAzMTcgODZUMzI2IDU4UTMyNiAzNSAzMDcgMTZRMjk0IDMgMjcyIC01VDIxOCAtMTNaTTg0IC0yNTNRNzkgLTI1OCA3MSAtMjU3VDU0IC0yNTBUNDAgLTIzOFQzOCAtMjI0TDE0MSAtNDNRMTQyIC00MiAxNTUgLTQyVDE4MyAtNDdUMjExIC02MlQyMjQgLTkwUTIyNCAtMTA2IDIxOCAtMTE5VDE5NCAtMTQ5TDg0IC0yNTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjQ7IiBnbHlwaC1uYW1lPSJUY2Fyb24iIGhvcml6LWFkdi14PSI2MjciIGQ9Ik0zMzAgNTU1SDE1N1ExMTIgNTU1IDExMiA1ODRRMTEyIDU5NCAxMTYgNjEwVDEzMCA2MzZRMTM1IDY0MiAxNDQgNjQ0VDE3MCA2NDdINjI0UTY2OSA2NDcgNjY5IDYxOFE2NjkgNjA4IDY2NCA1OTJUNjUxIDU2NlE2NDUgNTYwIDYzNyA1NThUNjExIDU1NUg0MzNMMzE1IDBIMjEzTDMzMCA1NTVaTTQwMiA2OTFRMzk1IDY5MyAzNzQgNzExVDMzMyA3NTRRMzExIDc4MCAzMDIgODA4VDI5MiA4NDlRMjkyIDg2OCAzMDIgODcwVDMyNyA4NzNRMzU2IDg3MyAzODkgODEyUTM5NCA4MDMgNDAwIDc5MlQ0MTQgNzY2TDQ1NyA4MTRRNDgyIDg0MSA1MDMgODU3VDU0MiA4NzNRNTU2IDg3MyA1NjMgODY1VDU3MSA4NDVRNTcxIDgyNSA1NTQgODA0VDUwNSA3NTZRNDg5IDc0MyA0NzMgNzMyVDQ0MiA3MTJUNDE4IDY5OFQ0MDIgNjkxWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY1OyIgZ2x5cGgtbmFtZT0idGNhcm9uIiBob3Jpei1hZHYteD0iNDAwIiBkPSJNMjE4IC0xM1ExNDMgLTEzIDEwOSAzMlQ5MyAxNjZMMTQyIDQwMEg2NFE2NCA0MDMgNjUgNDA3UTY2IDQxMCA2NiA0MTRUNjkgNDI2UTcxIDQzNCA3NCA0NDhUNzkgNDcxUTc5IDQ3MyA3OSA0NzVUODAgNDc5UTgwIDQ4MSA4MSA0ODFIMTU5TDE2NyA1MjBRMTc2IDU2NSAxOTMgNTgzVDI0MyA2MDJRMjU5IDYwMiAyNzAgNTk3VDI4MCA1OTBMMjU3IDQ4MUg0MDZRNDA1IDQ3OCA0MDQgNDc0UTQwMyA0NzEgNDAzIDQ2N1Q0MDAgNDU2TDM5MSA0MTBRMzkwIDQwNyAzOTAgNDA2VDM4OSA0MDJWNDAwSDIzOUwxODkgMTY4UTE3OCAxMTMgMTkzIDkwVDI0NCA2NlEyNjQgNjYgMjgxIDc1VDMwNyA5NFEzMDkgOTYgMzE3IDg2VDMyNiA1OFEzMjYgMzUgMzA3IDE2UTI5NCAzIDI3MiAtNVQyMTggLTEzWk0zNTMgNTIwUTM0OSA1MTYgMzQwIDUxN1QzMjMgNTIyVDMxMCA1MzRUMzA4IDU0OUw0MTggNzcyUTQxOSA3NzQgNDMyIDc3NFQ0NjIgNzcwVDQ5MSA3NTZUNTA0IDcyOFE1MDQgNzEzIDQ5OCA3MDBUNDc2IDY2OUwzNTMgNTIwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTY2OyIgZ2x5cGgtbmFtZT0iVGJhciIgaG9yaXotYWR2LXg9IjYyNyIgZD0iTTIxOSAzMTBRMTc5IDMxMCAxNzkgMzM2UTE3OSAzNDUgMTgyIDM1OVQxOTQgMzgyUTIwNCAzOTIgMjMwIDM5MkgyOTVMMzMwIDU1NUgxNTdRMTEyIDU1NSAxMTIgNTg0UTExMiA1OTQgMTE2IDYxMFQxMzAgNjM2UTEzNSA2NDIgMTQ0IDY0NFQxNzAgNjQ3SDYyNFE2NjkgNjQ3IDY2OSA2MThRNjY5IDYwOCA2NjQgNTkyVDY1MSA1NjZRNjQ1IDU2MCA2MzcgNTU4VDYxMSA1NTVINDMzTDM5OCAzOTJINDU0UTQ5NSAzOTIgNDk1IDM2NlE0OTUgMzU4IDQ5MSAzNDRUNDc5IDMyMVE0NjkgMzEwIDQ0MyAzMTBIMzgxTDMxNSAwSDIxM0wyNzggMzEwSDIxOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2NzsiIGdseXBoLW5hbWU9InRiYXIiIGhvcml6LWFkdi14PSI0MDAiIGQ9Ik02MSAyMTNRMjEgMjEzIDIxIDIzOVEyMSAyNDggMjQgMjYyVDM2IDI4NVE0NiAyOTUgNzIgMjk1SDEyMEwxNDIgNDAwSDY0UTY0IDQwMyA2NSA0MDdRNjYgNDEwIDY2IDQxNFQ2OSA0MjZRNzEgNDM0IDc0IDQ0OFQ3OSA0NzFRNzkgNDczIDc5IDQ3NVQ4MCA0NzlRODAgNDgxIDgxIDQ4MUgxNTlMMTY3IDUyMFExNzYgNTY1IDE5MyA1ODNUMjQzIDYwMlEyNTkgNjAyIDI3MCA1OTdUMjgwIDU5MEwyNTcgNDgxSDQwNlE0MDUgNDc4IDQwNCA0NzRRNDAzIDQ3MSA0MDMgNDY3VDQwMCA0NTZMMzkxIDQxMEwzODkgNDA1UTM4OSA0MDQgMzg5IDQwMlY0MDBIMjM5TDIxNiAyOTVIMjk2UTMzNyAyOTUgMzM3IDI2OVEzMzcgMjYxIDMzMyAyNDdUMzIxIDIyNFEzMTEgMjEzIDI4NSAyMTNIMTk4TDE4OSAxNjhRMTc4IDExMyAxOTMgOTBUMjQ0IDY2UTI2NCA2NiAyODEgNzVUMzA3IDk0UTMwOSA5NiAzMTcgODZUMzI2IDU4UTMyNiAzNSAzMDcgMTZRMjk0IDMgMjcyIC01VDIxOCAtMTNRMTQzIC0xMyAxMDkgMzJUOTMgMTY2TDEwMyAyMTNINjFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNjg7IiBnbHlwaC1uYW1lPSJVdGlsZGUiIGhvcml6LWFkdi14PSI2ODIiIGQ9Ik0zMjMgLTEyUTE4NCAtMTIgMTIwIDY0VDg4IDI5MUwxNTQgNjA0UTE2MCA2MjggMTcxIDYzOVQyMDYgNjUxSDIyMFEyNDMgNjUxIDI1MiA2MzhUMjU3IDYwMEwxOTAgMjgzUTE2OSAxODEgMjA1IDEzMFQzMzIgNzlRNDY5IDc5IDUwNiAyNTRMNTgxIDYwNFE1ODYgNjI4IDU5NyA2MzlUNjMyIDY1MUg2NDVRNjY3IDY1MSA2NzcgNjM4VDY4MiA2MDFMNjA2IDI0MVE1NTIgLTEyIDMyMyAtMTJaTTUwOSA2NzFRNDgyIDY3MSA0NDYgNjkwVDM3NCA3NDZRMzYyIDcyMCAzNDcgNjk5VDMxNSA2NzdRMjk5IDY3NyAyOTEgNjg2VDI4MyA3MDZRMjgzIDcyNSAyOTEgNzQzVDMxMSA3NzZUMzQwIDc5OVQzNzMgODA4UTQwMCA4MDggNDM2IDc4OVQ1MDggNzMzUTUyMCA3NTkgNTM1IDc4MFQ1NjcgODAyUTU4MyA4MDIgNTkxIDc5M1Q1OTkgNzczUTU5OSA3NTMgNTkxIDczNVQ1NzEgNzAzVDU0MiA2ODBUNTA5IDY3MVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE2OTsiIGdseXBoLW5hbWU9InV0aWxkZSIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTQ2MyAtOVE0MTggLTkgMzk5IDE0VDM4MSA4MFEzNTMgMzYgMzEyIDEyVDIxOSAtMTJRMTcyIC0xMiAxMzkgNFQ4NiA0OVQ2MSAxMTlUNjYgMjA5TDEyMyA0ODFIMjIyTDE2NSAyMTBRMTUxIDE1MCAxNzQgMTEyVDI1NCA3NFEzMDIgNzQgMzM1IDk4VDM5NyAxNzBMNDYzIDQ4MUg1NjFMNDgzIDExMFE0NzUgNzIgNDgzIDU3VDUyMiAzOFE1MjMgMzggNTIyIDMxVDUxNiAxNVQ0OTggLTFUNDYzIC05Wk00MzkgNTQ2UTQxMiA1NDYgMzc2IDU2NVQzMDQgNjIxUTI5MiA1OTUgMjc3IDU3NFQyNDUgNTUyUTIyOSA1NTIgMjIxIDU2MVQyMTMgNTgxUTIxMyA2MDAgMjIxIDYxOFQyNDEgNjUxVDI3MCA2NzRUMzAzIDY4M1EzMzAgNjgzIDM2NiA2NjRUNDM4IDYwOFE0NTAgNjM0IDQ2NSA2NTVUNDk3IDY3N1E1MTMgNjc3IDUyMSA2NjhUNTI5IDY0OFE1MjkgNjI4IDUyMSA2MTBUNTAxIDU3OFQ0NzIgNTU1VDQzOSA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkE7IiBnbHlwaC1uYW1lPSJVbWFjcm9uIiBob3Jpei1hZHYteD0iNjgyIiBkPSJNMzIzIC0xMlExODQgLTEyIDEyMCA2NFQ4OCAyOTFMMTU0IDYwNFExNjAgNjI4IDE3MSA2MzlUMjA2IDY1MUgyMjBRMjQzIDY1MSAyNTIgNjM4VDI1NyA2MDBMMTkwIDI4M1ExNjkgMTgxIDIwNSAxMzBUMzMyIDc5UTQ2OSA3OSA1MDYgMjU0TDU4MSA2MDRRNTg2IDYyOCA1OTcgNjM5VDYzMiA2NTFINjQ1UTY2NyA2NTEgNjc3IDYzOFQ2ODIgNjAxTDYwNiAyNDFRNTUyIC0xMiAzMjMgLTEyWk0zMjcgNzIxUTI4NyA3MjEgMjg3IDc0N1EyODcgNzU2IDI5MCA3NzBUMzAyIDc5M1EzMTIgODAzIDMzOCA4MDNINTYyUTYwMyA4MDMgNjAzIDc3N1E2MDMgNzY5IDU5OSA3NTVUNTg3IDczMlE1NzcgNzIxIDU1MSA3MjFIMzI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZCOyIgZ2x5cGgtbmFtZT0idW1hY3JvbiIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTQ2MyAtOVE0MTggLTkgMzk5IDE0VDM4MSA4MFEzNTMgMzYgMzEyIDEyVDIxOSAtMTJRMTcyIC0xMiAxMzkgNFQ4NiA0OVQ2MSAxMTlUNjYgMjA5TDEyMyA0ODFIMjIyTDE2NSAyMTBRMTUxIDE1MCAxNzQgMTEyVDI1NCA3NFEzMDIgNzQgMzM1IDk4VDM5NyAxNzBMNDYzIDQ4MUg1NjFMNDgzIDExMFE0NzUgNzIgNDgzIDU3VDUyMiAzOFE1MjMgMzggNTIyIDMxVDUxNiAxNVQ0OTggLTFUNDYzIC05Wk0yNTAgNTYyUTIxMCA1NjIgMjEwIDU4OFEyMTAgNTk3IDIxMyA2MTFUMjI1IDYzNFEyMzUgNjQ0IDI2MSA2NDRINDg1UTUyNiA2NDQgNTI2IDYxOFE1MjYgNjEwIDUyMiA1OTZUNTEwIDU3M1E1MDAgNTYyIDQ3NCA1NjJIMjUwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZDOyIgZ2x5cGgtbmFtZT0iVWJyZXZlIiBob3Jpei1hZHYteD0iNjgyIiBkPSJNMzIzIC0xMlExODQgLTEyIDEyMCA2NFQ4OCAyOTFMMTU0IDYwNFExNjAgNjI4IDE3MSA2MzlUMjA2IDY1MUgyMjBRMjQzIDY1MSAyNTIgNjM4VDI1NyA2MDBMMTkwIDI4M1ExNjkgMTgxIDIwNSAxMzBUMzMyIDc5UTQ2OSA3OSA1MDYgMjU0TDU4MSA2MDRRNTg2IDYyOCA1OTcgNjM5VDYzMiA2NTFINjQ1UTY2NyA2NTEgNjc3IDYzOFQ2ODIgNjAxTDYwNiAyNDFRNTUyIC0xMiAzMjMgLTEyWk00NDEgNzA1UTQxNCA3MDUgMzg4IDcxNVQzNDIgNzQyVDMwOSA3NzhUMjk3IDgxN1EyOTcgODMxIDMwNiA4NDJUMzMyIDg1NFEzNTIgODU0IDM3OCA4MzRUNDQwIDc2M1E0ODMgODExIDUxMyA4MzJUNTY2IDg1NFE1ODIgODU0IDU5MiA4NDVUNjAyIDgyMVE2MDIgODA0IDU4OCA3ODRUNTUyIDc0N1Q1MDAgNzE3VDQ0MSA3MDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkQ7IiBnbHlwaC1uYW1lPSJ1YnJldmUiIGhvcml6LWFkdi14PSI1OTIiIGQ9Ik00NjMgLTlRNDE4IC05IDM5OSAxNFQzODEgODBRMzUzIDM2IDMxMiAxMlQyMTkgLTEyUTE3MiAtMTIgMTM5IDRUODYgNDlUNjEgMTE5VDY2IDIwOUwxMjMgNDgxSDIyMkwxNjUgMjEwUTE1MSAxNTAgMTc0IDExMlQyNTQgNzRRMzAyIDc0IDMzNSA5OFQzOTcgMTcwTDQ2MyA0ODFINTYxTDQ4MyAxMTBRNDc1IDcyIDQ4MyA1N1Q1MjIgMzhRNTIzIDM4IDUyMiAzMVQ1MTYgMTVUNDk4IC0xVDQ2MyAtOVpNMzU0IDU0NlEzMjcgNTQ2IDMwMSA1NTZUMjU1IDU4M1QyMjIgNjE5VDIxMCA2NThRMjEwIDY3MiAyMTkgNjgzVDI0NSA2OTVRMjY1IDY5NSAyOTEgNjc1VDM1MyA2MDRRMzk2IDY1MiA0MjYgNjczVDQ3OSA2OTVRNDk1IDY5NSA1MDUgNjg2VDUxNSA2NjJRNTE1IDY0NSA1MDEgNjI1VDQ2NSA1ODhUNDEzIDU1OFQzNTQgNTQ2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTZFOyIgZ2x5cGgtbmFtZT0iVXJpbmciIGhvcml6LWFkdi14PSI2ODIiIGQ9Ik0zMjMgLTEyUTE4NCAtMTIgMTIwIDY0VDg4IDI5MUwxNTQgNjA0UTE2MCA2MjggMTcxIDYzOVQyMDYgNjUxSDIyMFEyNDMgNjUxIDI1MiA2MzhUMjU3IDYwMEwxOTAgMjgzUTE2OSAxODEgMjA1IDEzMFQzMzIgNzlRNDY5IDc5IDUwNiAyNTRMNTgxIDYwNFE1ODYgNjI4IDU5NyA2MzlUNjMyIDY1MUg2NDVRNjY3IDY1MSA2NzcgNjM4VDY4MiA2MDFMNjA2IDI0MVE1NTIgLTEyIDMyMyAtMTJaTTQ0MSA3MDdRMzkwIDcwNyAzNTkgNzM2VDMyOCA4MTBRMzI4IDgzNyAzMzggODYxVDM2NSA5MDRUNDA3IDkzNFQ0NjEgOTQ2UTUxMiA5NDYgNTQzIDkxN1Q1NzQgODQzUTU3NCA4MTYgNTY0IDc5MlQ1MzcgNzQ4VDQ5NSA3MThUNDQxIDcwN1pNNDQzIDc2MFE0NzYgNzYwIDQ5NSA3ODRUNTE0IDgzN1E1MTQgODYwIDQ5OSA4NzZUNDU4IDg5M1E0NDIgODkzIDQyOSA4ODdUNDA3IDg2OVQzOTMgODQ0VDM4OCA4MTZRMzg4IDc5MyA0MDMgNzc3VDQ0MyA3NjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNkY7IiBnbHlwaC1uYW1lPSJ1cmluZyIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTQ2MyAtOVE0MTggLTkgMzk5IDE0VDM4MSA4MFEzNTMgMzYgMzEyIDEyVDIxOSAtMTJRMTcyIC0xMiAxMzkgNFQ4NiA0OVQ2MSAxMTlUNjYgMjA5TDEyMyA0ODFIMjIyTDE2NSAyMTBRMTUxIDE1MCAxNzQgMTEyVDI1NCA3NFEzMDIgNzQgMzM1IDk4VDM5NyAxNzBMNDYzIDQ4MUg1NjFMNDgzIDExMFE0NzUgNzIgNDgzIDU3VDUyMiAzOFE1MjMgMzggNTIyIDMxVDUxNiAxNVQ0OTggLTFUNDYzIC05Wk0zNTQgNTMyUTMwMyA1MzIgMjcyIDU2MVQyNDEgNjM1UTI0MSA2NjIgMjUxIDY4NlQyNzggNzI5VDMyMCA3NTlUMzc0IDc3MVE0MjUgNzcxIDQ1NiA3NDJUNDg3IDY2OFE0ODcgNjQxIDQ3NyA2MTdUNDUwIDU3M1Q0MDggNTQzVDM1NCA1MzJaTTM1NiA1ODVRMzg5IDU4NSA0MDggNjA5VDQyNyA2NjJRNDI3IDY4NSA0MTIgNzAxVDM3MSA3MThRMzU1IDcxOCAzNDIgNzEyVDMyMCA2OTRUMzA2IDY2OVQzMDEgNjQxUTMwMSA2MTggMzE2IDYwMlQzNTYgNTg1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcwOyIgZ2x5cGgtbmFtZT0iVWh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTMyMyAtMTJRMTg0IC0xMiAxMjAgNjRUODggMjkxTDE1NCA2MDRRMTYwIDYyOCAxNzEgNjM5VDIwNiA2NTFIMjIwUTI0MyA2NTEgMjUyIDYzOFQyNTcgNjAwTDE5MCAyODNRMTY5IDE4MSAyMDUgMTMwVDMzMiA3OVE0NjkgNzkgNTA2IDI1NEw1ODEgNjA0UTU4NiA2MjggNTk3IDYzOVQ2MzIgNjUxSDY0NVE2NjcgNjUxIDY3NyA2MzhUNjgyIDYwMUw2MDYgMjQxUTU1MiAtMTIgMzIzIC0xMlpNNDc4IDcxNFE0NzYgNzE3IDQ4NSA3MzJUNTEyIDc2OVQ1NTIgODEyVDU5OSA4NTFRNjI0IDg2OCA2NDcgODY4UTY2NSA4NjggNjc4IDg1N1Q2OTIgODI5UTY5MiA3OTQgNjQ5IDc2OFE2MjIgNzUwIDU5MyA3MzlUNTM5IDcyMFQ0OTcgNzEyVDQ3OCA3MTRaTTI4MSA3MTRRMjc5IDcxNyAyODggNzMyVDMxNSA3NjlUMzU0IDgxMlQ0MDEgODUxUTQyNyA4NjggNDQ5IDg2OFE0NjggODY4IDQ4MSA4NTdUNDk0IDgyOVE0OTQgODEyIDQ4NCA3OTdUNDUyIDc2OFE0MjUgNzUwIDM5NiA3MzlUMzQyIDcyMFQzMDAgNzEyVDI4MSA3MTRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzE7IiBnbHlwaC1uYW1lPSJ1aHVuZ2FydW1sYXV0IiBob3Jpei1hZHYteD0iNTkyIiBkPSJNNDYzIC05UTQxOCAtOSAzOTkgMTRUMzgxIDgwUTM1MyAzNiAzMTIgMTJUMjE5IC0xMlExNzIgLTEyIDEzOSA0VDg2IDQ5VDYxIDExOVQ2NiAyMDlMMTIzIDQ4MUgyMjJMMTY1IDIxMFExNTEgMTUwIDE3NCAxMTJUMjU0IDc0UTMwMiA3NCAzMzUgOThUMzk3IDE3MEw0NjMgNDgxSDU2MUw0ODMgMTEwUTQ3NSA3MiA0ODMgNTdUNTIyIDM4UTUyMyAzOCA1MjIgMzFUNTE2IDE1VDQ5OCAtMVQ0NjMgLTlaTTM4MiA1NTVRMzgwIDU1OCAzODkgNTczVDQxNiA2MTBUNDU2IDY1M1Q1MDMgNjkyUTUyOCA3MDkgNTUxIDcwOVE1NjkgNzA5IDU4MiA2OThUNTk2IDY3MFE1OTYgNjM1IDU1MyA2MDlRNTI2IDU5MSA0OTcgNTgwVDQ0MyA1NjFUNDAxIDU1M1QzODIgNTU1Wk0xODUgNTU1UTE4MyA1NTggMTkyIDU3M1QyMTkgNjEwVDI1OCA2NTNUMzA1IDY5MlEzMzEgNzA5IDM1MyA3MDlRMzcyIDcwOSAzODUgNjk4VDM5OCA2NzBRMzk4IDY1MyAzODggNjM4VDM1NiA2MDlRMzI5IDU5MSAzMDAgNTgwVDI0NiA1NjFUMjA0IDU1M1QxODUgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTcyOyIgZ2x5cGgtbmFtZT0iVW9nb25layIgaG9yaXotYWR2LXg9IjY4MiIgZD0iTTMyMyAtMTJRMTg0IC0xMiAxMjAgNjRUODggMjkxTDE1NCA2MDRRMTYwIDYyOCAxNzEgNjM5VDIwNiA2NTFIMjIwUTI0MyA2NTEgMjUyIDYzOFQyNTcgNjAwTDE5MCAyODNRMTY5IDE4MSAyMDUgMTMwVDMzMiA3OVE0NjkgNzkgNTA2IDI1NEw1ODEgNjA0UTU4NiA2MjggNTk3IDYzOVQ2MzIgNjUxSDY0NVE2NjcgNjUxIDY3NyA2MzhUNjgyIDYwMUw2MDYgMjQxUTU3MCA3NyA0NjAgMThRNDMyIDIgNDE0IC0xMlQzODYgLTM4VDM3MSAtNjJUMzY3IC04M1EzNjcgLTExNCAzOTggLTExNFE0MTkgLTExNCA0MzMgLTk3UTQ0NCAtOTkgNDUyIC0xMDdUNDYwIC0xMzBRNDYwIC0xNTMgNDQwIC0xNjhUMzgzIC0xODNRMzQxIC0xODMgMzE0IC0xNjFUMjg3IC0xMDFRMjg3IC03OCAyOTkgLTU1VDMzOCAtMTJIMzIzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTczOyIgZ2x5cGgtbmFtZT0idW9nb25layIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTUwNCAyUTUwMiAxIDUwMiAxTDQ5NyAtMlE0NDAgLTM1IDQyMSAtNjBUNDAxIC0xMDVRNDAxIC0xMzYgNDMyIC0xMzZRNDUzIC0xMzYgNDY3IC0xMTlRNDc4IC0xMjEgNDg2IC0xMjlUNDk0IC0xNTJRNDk0IC0xNzUgNDc0IC0xOTBUNDE3IC0yMDVRMzc1IC0yMDUgMzQ4IC0xODNUMzIxIC0xMjNRMzIxIC04OSAzNDYgLTU4VDQyNSAtM1EzNzYgMTUgMzgxIDgwUTM1MyAzNiAzMTIgMTJUMjE5IC0xMlExNzIgLTEyIDEzOSA0VDg2IDQ5VDYxIDExOVQ2NiAyMDlMMTIzIDQ4MUgyMjJMMTY1IDIxMFExNTEgMTUwIDE3NCAxMTJUMjU0IDc0UTMwMiA3NCAzMzUgOThUMzk3IDE3MEw0NjMgNDgxSDU2MUw0ODMgMTEwUTQ3NSA3MiA0ODMgNTdUNTIyIDM4UTUyMyAzOCA1MjEgMjZUNTA0IDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzQ7IiBnbHlwaC1uYW1lPSJXY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9Ijk1OCIgZD0iTTE0OCA2MjdRMTQ4IDYzMyAxNjUgNjQyVDIwNCA2NTJRMjMwIDY1MiAyNDMgNjM2VDI1NSA1OTJMMjYwIDExM0w0NzIgNTI3UTQ4MyA1NTAgNDk5IDU1OVQ1NDIgNTY5UTU3NiA1NjkgNTkwIDU1NVQ2MDcgNTE2TDY0MCAxMTNMODc3IDY1MFE4NzcgNjUxIDg4OSA2NTFUOTE2IDY0OFQ5NDMgNjMzVDk1NiA2MDBROTU2IDU4OSA5NTIgNTc2VDkzNyA1NDBMNjgzIDBINTY1TDUyNyA0NTNMMjg3IDBIMTcxTDE0OCA2MjdaTTQ2MiA2OThRNDQ4IDY5OCA0NDEgNzA2VDQzMyA3MjZRNDMzIDc0NSA0NTAgNzY2VDQ5OSA4MTRRNTE1IDgyNyA1MzEgODM4VDU2MiA4NTlUNTg2IDg3M1Q2MDIgODc5UTYwOSA4NzcgNjMwIDg1OVQ2NzEgODE2UTY5MyA3OTAgNzAyIDc3MVQ3MTIgNzM3UTcxMiA3MTkgNzAyIDcwOVQ2NzcgNjk4UTY2MSA2OTggNjQ3IDcxMlQ2MTUgNzU4UTYxMCA3NjggNjA0IDc3OVQ1OTAgODA0UTU3OSA3OTEgNTY5IDc4MFQ1NDcgNzU3UTUyMiA3MjkgNTAxIDcxNFQ0NjIgNjk4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc1OyIgZ2x5cGgtbmFtZT0id2NpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI3NTgiIGQ9Ik0xMjMgMzMwUTEyMiAzODcgMTA1IDQwNlQ1NSA0MjlRNTMgNDI5IDU0IDQzOFQ2MSA0NThUODIgNDc4VDEyMSA0ODdRMTU2IDQ4NyAxNzggNDY1UTIxMyA0MzAgMjEyIDMyOEwyMDkgMTA0TDM0NiAzODFRMzU5IDQwNyAzNzQgNDE0VDQxMyA0MjJRNDQyIDQyMiA0NTcgNDEwVDQ3NSAzNjhMNDk3IDEwM0w2NzQgNDg2UTY3NCA0ODYgNjg0IDQ4NlQ3MDcgNDgyVDcyOSA0NjhUNzQyIDQ0MFE3NDQgNDI5IDc0MCA0MTdUNzI1IDM4NUw1MzAgMEg0MzBMMzk3IDMwNkwyMzUgMEgxMjdMMTIzIDMzMFpNMzMyIDUzOVEzMTggNTM5IDMxMSA1NDdUMzAzIDU2N1EzMDMgNTg2IDMyMCA2MDdUMzY5IDY1NVEzODUgNjY4IDQwMSA2NzlUNDMyIDcwMFQ0NTYgNzE0VDQ3MiA3MjBRNDc5IDcxOCA1MDAgNzAwVDU0MSA2NTdRNTYzIDYzMSA1NzIgNjEyVDU4MiA1NzhRNTgyIDU2MCA1NzIgNTUwVDU0NyA1MzlRNTMxIDUzOSA1MTcgNTUzVDQ4NSA1OTlRNDgwIDYwOSA0NzQgNjIwVDQ2MCA2NDVRNDQ5IDYzMiA0MzkgNjIxVDQxNyA1OThRMzkyIDU3MCAzNzEgNTU1VDMzMiA1MzlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxNzY7IiBnbHlwaC1uYW1lPSJZY2lyY3VtZmxleCIgaG9yaXotYWR2LXg9IjYwNSIgZD0iTTI1OCAyNjdMODggNjQ3SDE5NkwzMjIgMzUxTDU3OCA2NTVRNTc4IDY1NSA1ODggNjU0VDYwOSA2NDdUNjMwIDYzMlQ2NDAgNjAzUTY0MCA1ODkgNjMzIDU3NVQ2MDUgNTM4TDM2MCAyNjJMMzA1IDBIMjAxTDI1OCAyNjdaTTI3OCA3MDZRMjY0IDcwNiAyNTcgNzE0VDI0OSA3MzRRMjQ5IDc1MyAyNjYgNzc0VDMxNSA4MjJRMzMxIDgzNSAzNDcgODQ2VDM3OCA4NjdUNDAyIDg4MVQ0MTggODg3UTQyNSA4ODUgNDQ2IDg2N1Q0ODcgODI0UTUwOSA3OTggNTE4IDc3OVQ1MjggNzQ1UTUyOCA3MjcgNTE4IDcxN1Q0OTMgNzA2UTQ3NyA3MDYgNDYzIDcyMFQ0MzEgNzY2UTQyNiA3NzYgNDIwIDc4N1Q0MDYgODEyUTM5NSA3OTkgMzg1IDc4OFQzNjMgNzY1UTMzOCA3MzcgMzE3IDcyMlQyNzggNzA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc3OyIgZ2x5cGgtbmFtZT0ieWNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MjciIGQ9Ik0zNyAtMjAzUS0yMSAtMjAzIC00NiAtMTc3US02MiAtMTYyIC02MiAtMTQwUS02MiAtMTMxIC01OCAtMTIzVC00OSAtMTA4VC00MCAtOTlULTM0IC05N1EtMjUgLTEwOCAtOCAtMTE0VDIxIC0xMjFRMzUgLTEyMSA0OSAtMTE2VDgwIC05NlQxMTcgLTU3VDE2NSA3TDE3OSAyOFExNDggMzQgMTQyIDc1TDExNCAzMjhRMTA4IDM4MSA5MCA0MDNUNDAgNDI2UTM5IDQyNiAzOSA0MzVUNDYgNDU2VDY3IDQ3N1QxMDggNDg3UTE1MCA0ODcgMTc0IDQ1MFQyMDcgMzI3TDIyNyA5OUw0NDcgNDgxSDU0NkwyNTEgLTIxUTE5NSAtMTE2IDE0NSAtMTU5VDM3IC0yMDNaTTIxMiA1NDdRMTk4IDU0NyAxOTEgNTU1VDE4MyA1NzVRMTgzIDU5NCAyMDAgNjE1VDI0OSA2NjNRMjY1IDY3NiAyODEgNjg3VDMxMiA3MDhUMzM2IDcyMlQzNTIgNzI4UTM1OSA3MjYgMzgwIDcwOFQ0MjEgNjY1UTQ0MyA2MzkgNDUyIDYyMFQ0NjIgNTg2UTQ2MiA1NjggNDUyIDU1OFQ0MjcgNTQ3UTQxMSA1NDcgMzk3IDU2MVQzNjUgNjA3UTM2MCA2MTcgMzU0IDYyOFQzNDAgNjUzUTMyOSA2NDAgMzE5IDYyOVQyOTcgNjA2UTI3MiA1NzggMjUxIDU2M1QyMTIgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTc4OyIgZ2x5cGgtbmFtZT0iWWRpZXJlc2lzIiBob3Jpei1hZHYteD0iNjA1IiBkPSJNMjU4IDI2N0w4OCA2NDdIMTk2TDMyMiAzNTFMNTc4IDY1NVE1NzggNjU1IDU4OCA2NTRUNjA5IDY0N1Q2MzAgNjMyVDY0MCA2MDNRNjQwIDU4OSA2MzMgNTc1VDYwNSA1MzhMMzYwIDI2MkwzMDUgMEgyMDFMMjU4IDI2N1pNNDg0IDcwNFE0NTUgNzA0IDQ0MCA3MTZUNDI1IDc1MlE0MjUgNzgxIDQ0MiA4MDFUNDg4IDgyMVE1MTcgODIxIDUzMiA4MDlUNTQ3IDc3M1E1NDcgNzQ0IDUzMCA3MjRUNDg0IDcwNFpNMzAxIDcwNFEyNzIgNzA0IDI1NyA3MTZUMjQyIDc1MlEyNDIgNzgxIDI1OSA4MDFUMzA1IDgyMVEzMzQgODIxIDM0OCA4MDlUMzYzIDc3M1EzNjMgNzQ0IDM0NyA3MjRUMzAxIDcwNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3OTsiIGdseXBoLW5hbWU9IlphY3V0ZSIgaG9yaXotYWR2LXg9IjYwNSIgZD0iTTEgMFEzIDggNSAxOVE3IDI3IDkgMzhUMTQgNjFRMTkgODMgMjggOThUNjAgMTM2TDQ4NyA1NTdIMTgxUTEyNSA1NTcgMTI1IDU5NFExMjUgNjAzIDEyOCA2MTJUMTM0IDYyOVQxNDEgNjQyVDE0NiA2NDdINjI3UTYyNSA2MzggNjIzIDYyOFE2MjEgNjE5IDYxOSA2MDhUNjE0IDU4NlE2MDkgNTY0IDYwMSA1NDlUNTY5IDUxMUwxNDMgOTBINDcwUTUyNiA5MCA1MjYgNTNRNTI2IDQ0IDUyMyAzNVQ1MTcgMThUNTEwIDVUNTA1IDBIMVpNMjkxIDcxNFEyODkgNzE3IDMwMCA3MzNUMzMyIDc3MFQzNzcgODEyVDQyNyA4NDlRNDUxIDg2NCA0NzYgODY0UTQ5NiA4NjQgNTA3IDg1MlQ1MTkgODIyUTUxOSA4MDYgNTA3IDc5MlQ0NzMgNzY0UTQ0NCA3NDcgNDEzIDczNlQzNTUgNzE5VDMxMSA3MTJUMjkxIDcxNFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QTsiIGdseXBoLW5hbWU9InphY3V0ZSIgaG9yaXotYWR2LXg9IjUxOCIgZD0iTTEwIDBRMTEgNyAxMyAxNlExNSAyMyAxNiAzMlQyMCA1MFEyNCA2OCAzMCA4MVQ1NyAxMTNMMzc0IDQwMkgxNDhROTggNDAyIDk4IDQzNVE5OCA0NDIgMTAwIDQ1MFQxMDYgNDY1VDExMiA0NzZUMTE2IDQ4MUg1MDJRNTAwIDQ3MyA0OTggNDY1UTQ5NiA0NTggNDk1IDQ0OVQ0OTEgNDMxUTQ4NyA0MTMgNDgxIDQwMFQ0NTQgMzY5TDEzOCA3OUgzNzVRNDI1IDc5IDQyNSA0NlE0MjUgMzggNDIzIDMwVDQxNyAxNlQ0MTEgNVQ0MDcgMEgxMFpNMjIyIDU1NVEyMjAgNTU4IDIzMSA1NzRUMjYzIDYxMVQzMDggNjUzVDM1OCA2OTBRMzgyIDcwNSA0MDcgNzA1UTQyNyA3MDUgNDM4IDY5M1Q0NTAgNjYzUTQ1MCA2NDcgNDM4IDYzM1Q0MDQgNjA1UTM3NSA1ODggMzQ0IDU3N1QyODYgNTYwVDI0MiA1NTNUMjIyIDU1NVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3QjsiIGdseXBoLW5hbWU9Ilpkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI2MDUiIGQ9Ik0xIDBRMyA4IDUgMTlRNyAyNyA5IDM4VDE0IDYxUTE5IDgzIDI4IDk4VDYwIDEzNkw0ODcgNTU3SDE4MVExMjUgNTU3IDEyNSA1OTRRMTI1IDYwMyAxMjggNjEyVDEzNCA2MjlUMTQxIDY0MlQxNDYgNjQ3SDYyN1E2MjUgNjM4IDYyMyA2MjhRNjIxIDYxOSA2MTkgNjA4VDYxNCA1ODZRNjA5IDU2NCA2MDEgNTQ5VDU2OSA1MTFMMTQzIDkwSDQ3MFE1MjYgOTAgNTI2IDUzUTUyNiA0NCA1MjMgMzVUNTE3IDE4VDUxMCA1VDUwNSAwSDFaTTM4NyA3MDZRMzU1IDcwNiAzMzkgNzIwVDMyMyA3NTdRMzIzIDc4NyAzNDEgODA5VDM5MSA4MzFRNDIzIDgzMSA0MzggODE3VDQ1NCA3ODBRNDU0IDc1MCA0MzcgNzI4VDM4NyA3MDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxN0M7IiBnbHlwaC1uYW1lPSJ6ZG90YWNjZW50IiBob3Jpei1hZHYteD0iNTE4IiBkPSJNMTAgMFExMSA3IDEzIDE2UTE1IDIzIDE2IDMyVDIwIDUwUTI0IDY4IDMwIDgxVDU3IDExM0wzNzQgNDAySDE0OFE5OCA0MDIgOTggNDM1UTk4IDQ0MiAxMDAgNDUwVDEwNiA0NjVUMTEyIDQ3NlQxMTYgNDgxSDUwMlE1MDAgNDczIDQ5OCA0NjVRNDk2IDQ1OCA0OTUgNDQ5VDQ5MSA0MzFRNDg3IDQxMyA0ODEgNDAwVDQ1NCAzNjlMMTM4IDc5SDM3NVE0MjUgNzkgNDI1IDQ2UTQyNSAzOCA0MjMgMzBUNDE3IDE2VDQxMSA1VDQwNyAwSDEwWk0zMDcgNTQ3UTI3NSA1NDcgMjU5IDU2MVQyNDMgNTk4UTI0MyA2MjggMjYxIDY1MFQzMTEgNjcyUTM0MyA2NzIgMzU4IDY1OFQzNzQgNjIxUTM3NCA1OTEgMzU3IDU2OVQzMDcgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MTdEOyIgZ2x5cGgtbmFtZT0iWmNhcm9uIiBob3Jpei1hZHYteD0iNjA1IiBkPSJNMSAwUTMgOCA1IDE5UTcgMjcgOSAzOFQxNCA2MVExOSA4MyAyOCA5OFQ2MCAxMzZMNDg3IDU1N0gxODFRMTI1IDU1NyAxMjUgNTk0UTEyNSA2MDMgMTI4IDYxMlQxMzQgNjI5VDE0MSA2NDJUMTQ2IDY0N0g2MjdRNjI1IDYzOCA2MjMgNjI4UTYyMSA2MTkgNjE5IDYwOFQ2MTQgNTg2UTYwOSA1NjQgNjAxIDU0OVQ1NjkgNTExTDE0MyA5MEg0NzBRNTI2IDkwIDUyNiA1M1E1MjYgNDQgNTIzIDM1VDUxNyAxOFQ1MTAgNVQ1MDUgMEgxWk0zNzkgNjk4UTM3MiA3MDAgMzUxIDcxOFQzMTAgNzYxUTI4OCA3ODcgMjc5IDgxNVQyNjkgODU2UTI2OSA4NzUgMjc5IDg3N1QzMDQgODgwUTMzMyA4ODAgMzY2IDgxOVEzNzEgODEwIDM3NyA3OTlUMzkxIDc3M0w0MzQgODIxUTQ1OSA4NDggNDgwIDg2NFQ1MTkgODgwUTUzMyA4ODAgNTQwIDg3MlQ1NDggODUyUTU0OCA4MzIgNTMxIDgxMVQ0ODIgNzYzUTQ2NiA3NTAgNDUwIDczOVQ0MTkgNzE5VDM5NSA3MDVUMzc5IDY5OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDE3RTsiIGdseXBoLW5hbWU9InpjYXJvbiIgaG9yaXotYWR2LXg9IjUxOCIgZD0iTTEwIDBRMTEgNyAxMyAxNlExNSAyMyAxNiAzMlQyMCA1MFEyNCA2OCAzMCA4MVQ1NyAxMTNMMzc0IDQwMkgxNDhROTggNDAyIDk4IDQzNVE5OCA0NDIgMTAwIDQ1MFQxMDYgNDY1VDExMiA0NzZUMTE2IDQ4MUg1MDJRNTAwIDQ3MyA0OTggNDY1UTQ5NiA0NTggNDk1IDQ0OVQ0OTEgNDMxUTQ4NyA0MTMgNDgxIDQwMFQ0NTQgMzY5TDEzOCA3OUgzNzVRNDI1IDc5IDQyNSA0NlE0MjUgMzggNDIzIDMwVDQxNyAxNlQ0MTEgNVQ0MDcgMEgxMFpNMzA0IDUzMlEyOTcgNTM0IDI3NiA1NTJUMjM1IDU5NVEyMTMgNjIxIDIwNCA2NDlUMTk0IDY5MFExOTQgNzA5IDIwNCA3MTFUMjI5IDcxNFEyNTggNzE0IDI5MSA2NTNRMjk2IDY0NCAzMDIgNjMzVDMxNiA2MDdMMzU5IDY1NVEzODQgNjgyIDQwNSA2OThUNDQ0IDcxNFE0NTggNzE0IDQ2NSA3MDZUNDczIDY4NlE0NzMgNjY2IDQ1NiA2NDVUNDA3IDU5N1EzOTEgNTg0IDM3NSA1NzNUMzQ0IDU1M1QzMjAgNTM5VDMwNCA1MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gxOTI7IiBnbHlwaC1uYW1lPSJmbG9yaW4iIGhvcml6LWFkdi14PSIzOTQiIGQ9Ik0xMDkgLThROTIgLTggODAgLTFUNjggOUwxNDEgMzUxSDkwUTUxIDM1MSA1MSAzNzZRNTEgMzg1IDU0IDM5OVQ2NiA0MjJRNzEgNDI3IDc5IDQyOVQxMDEgNDMySDE1OEwxNzIgNDkzUTE5MCA1ODEgMjM0IDYyMFQzNDMgNjU5UTM3NyA2NTkgMzk5IDY1MVQ0MzUgNjI4UTQ1MiA2MTEgNDUyIDU5MFE0NTIgNTc5IDQ0OCA1NzBUNDM3IDU1NFQ0MjYgNTQ0VDQyMCA1NDJRNDEwIDU1NiAzOTEgNTY1VDM0NyA1NzVRMzE2IDU3NSAyOTYgNTU1VDI2NSA0ODRMMjUzIDQzMkgzNTdRMzk2IDQzMiAzOTYgNDA2UTM5NiAzOTggMzkzIDM4NFQzODEgMzYxUTM3NiAzNTYgMzY4IDM1NFQzNDYgMzUxSDIzOUwxODAgNjdRMTcxIDIzIDE1MyA4VDEwOSAtOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxODsiIGdseXBoLW5hbWU9IlNjb21tYWFjY2VudCIgaG9yaXotYWR2LXg9IjU4MCIgZD0iTTI3MiAtMTJRMTk5IC0xMiAxNDUgOFQ1OSA2MFE0MiA3OCAzMiA5NlQyMiAxMzVRMjIgMTUwIDI5IDE2MVQ0NiAxNzhUNjMgMTg3VDcyIDE4OFE5OCAxMzYgMTQ5IDEwNFQyNzQgNzJRMzQyIDcyIDM3NCA5OVQ0MDcgMTc0UTQwNyAxOTYgMzk3IDIxMVQzNjkgMjM5VDMyOCAyNjJUMjc3IDI4NFEyNDcgMjk2IDIxNyAzMTFUMTYzIDM0N1QxMjUgMzk3VDExMCA0NjhRMTEwIDUwNyAxMjUgNTQyVDE3MCA2MDNUMjQzIDY0NFQzNDMgNjU5UTQxNSA2NTkgNDY0IDY0MVQ1NDEgNTk0UTU3MyA1NjIgNTczIDUyNlE1NzMgNTA5IDU2NiA0OThUNTQ5IDQ4MVQ1MzEgNDcyVDUyMSA0NzJRNDk4IDUxOSA0NTMgNTQ3VDM0MCA1NzVRMjgzIDU3NSAyNDggNTQ4VDIxMyA0NzlRMjEzIDQ1NSAyMjMgNDM5VDI1MSA0MDlUMjk0IDM4NVQzNDkgMzYxUTM4MCAzNDkgNDEwIDMzNVQ0NjMgMzAwVDUwMSAyNTJUNTE2IDE4NFE1MTYgMTQxIDUwMSAxMDVUNDU1IDQzVDM3OCAzVDI3MiAtMTJaTTE3MyAtMjUzUTE2OCAtMjU4IDE2MCAtMjU3VDE0MyAtMjUwVDEyOSAtMjM4VDEyNyAtMjI0TDIzMCAtNDNRMjMxIC00MiAyNDQgLTQyVDI3MiAtNDdUMzAwIC02MlQzMTMgLTkwUTMxMyAtMTA2IDMwNyAtMTE5VDI4MyAtMTQ5TDE3MyAtMjUzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjE5OyIgZ2x5cGgtbmFtZT0ic2NvbW1hYWNjZW50IiBob3Jpei1hZHYteD0iNDkwIiBkPSJNMjI4IC0xMlExNjUgLTEyIDExNyA2VDQyIDUxUTMxIDYyIDI0IDc1VDE3IDEwMVExNyAxMTQgMjMgMTI0VDM2IDE0MFQ1MCAxNDhUNTggMTUwUTgyIDExNCAxMjQgODlUMjI0IDYzUTI3MiA2MyAyOTcgODFUMzIyIDEzMFEzMjIgMTU3IDI5NiAxNzFUMjI0IDIwMlExOTggMjExIDE3MyAyMjJUMTI3IDI0OVQ5NCAyODdUODEgMzQzUTgxIDM3NiA5NCA0MDNUMTMxIDQ1MVQxOTAgNDgyVDI2OCA0OTNRMzI0IDQ5MyAzNjcgNDc3VDQzNSA0MzRRNDYwIDQxMCA0NjAgMzg0UTQ2MCAzNzAgNDU0IDM2MFQ0MzkgMzQ0VDQyMyAzMzZUNDE1IDMzNlEzOTUgMzcxIDM1NSAzOTRUMjY3IDQxOFEyMjAgNDE4IDE5NyAzOTlUMTc0IDM1M1ExNzQgMzI0IDIwMiAzMDlUMjc4IDI3NVEzMDUgMjY1IDMzMCAyNTRUMzc2IDIyOFQ0MDggMTkxVDQyMSAxMzhRNDIxIDcwIDM3MSAyOVQyMjggLTEyWk0xMjkgLTI1M1ExMjQgLTI1OCAxMTYgLTI1N1Q5OSAtMjUwVDg1IC0yMzhUODMgLTIyNEwxODYgLTQzUTE4NyAtNDIgMjAwIC00MlQyMjggLTQ3VDI1NiAtNjJUMjY5IC05MFEyNjkgLTEwNiAyNjMgLTExOVQyMzkgLTE0OUwxMjkgLTI1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxQTsiIGdseXBoLW5hbWU9InVuaTAyMUEiIGhvcml6LWFkdi14PSI2MjciIGQ9Ik0zMzAgNTU1SDE1N1ExMTIgNTU1IDExMiA1ODRRMTEyIDU5NCAxMTYgNjEwVDEzMCA2MzZRMTM1IDY0MiAxNDQgNjQ0VDE3MCA2NDdINjI0UTY2OSA2NDcgNjY5IDYxOFE2NjkgNjA4IDY2NCA1OTJUNjUxIDU2NlE2NDUgNTYwIDYzNyA1NThUNjExIDU1NUg0MzNMMzE1IDBIMjEzTDMzMCA1NTVaTTE1NiAtMjUzUTE1MSAtMjU4IDE0MyAtMjU3VDEyNiAtMjUwVDExMiAtMjM4VDExMCAtMjI0TDIxMyAtNDNRMjE0IC00MiAyMjcgLTQyVDI1NSAtNDdUMjgzIC02MlQyOTYgLTkwUTI5NiAtMTA2IDI5MCAtMTE5VDI2NiAtMTQ5TDE1NiAtMjUzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjFCOyIgZ2x5cGgtbmFtZT0idW5pMDIxQiIgaG9yaXotYWR2LXg9IjQwMCIgZD0iTTIxOCAtMTNRMTQzIC0xMyAxMDkgMzJUOTMgMTY2TDE0MiA0MDBINjRRNjQgNDAzIDY1IDQwN1E2NiA0MTAgNjYgNDE0VDY5IDQyNlE3MSA0MzQgNzQgNDQ4VDc5IDQ3MVE3OSA0NzMgNzkgNDc1VDgwIDQ3OVE4MCA0ODEgODEgNDgxSDE1OUwxNjcgNTIwUTE3NiA1NjUgMTkzIDU4M1QyNDMgNjAyUTI1OSA2MDIgMjcwIDU5N1QyODAgNTkwTDI1NyA0ODFINDA2UTQwNSA0NzggNDA0IDQ3NFE0MDMgNDcxIDQwMyA0NjdUNDAwIDQ1NkwzOTEgNDEwUTM5MCA0MDcgMzkwIDQwNlQzODkgNDAyVjQwMEgyMzlMMTg5IDE2OFExNzggMTEzIDE5MyA5MFQyNDQgNjZRMjY0IDY2IDI4MSA3NVQzMDcgOTRRMzA5IDk2IDMxNyA4NlQzMjYgNThRMzI2IDM1IDMwNyAxNlEyOTQgMyAyNzIgLTVUMjE4IC0xM1pNODQgLTI1M1E3OSAtMjU4IDcxIC0yNTdUNTQgLTI1MFQ0MCAtMjM4VDM4IC0yMjRMMTQxIC00M1ExNDIgLTQyIDE1NSAtNDJUMTgzIC00N1QyMTEgLTYyVDIyNCAtOTBRMjI0IC0xMDYgMjE4IC0xMTlUMTk0IC0xNDlMODQgLTI1M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNjsiIGdseXBoLW5hbWU9ImNpcmN1bWZsZXgiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yMjkgNTQ3UTIxNSA1NDcgMjA4IDU1NVQyMDAgNTc1UTIwMCA1OTQgMjE3IDYxNVQyNjYgNjYzUTI4MiA2NzYgMjk4IDY4N1QzMjkgNzA4VDM1MyA3MjJUMzY5IDcyOFEzNzYgNzI2IDM5NyA3MDhUNDM4IDY2NVE0NjAgNjM5IDQ2OSA2MjBUNDc5IDU4NlE0NzkgNTY4IDQ2OSA1NThUNDQ0IDU0N1E0MjggNTQ3IDQxNCA1NjFUMzgyIDYwN1EzNzcgNjE3IDM3MSA2MjhUMzU3IDY1M1EzNDYgNjQwIDMzNiA2MjlUMzE0IDYwNlEyODkgNTc4IDI2OCA1NjNUMjI5IDU0N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJDNzsiIGdseXBoLW5hbWU9ImNhcm9uIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzMyIDUzMlEzMjUgNTM0IDMwNCA1NTJUMjYzIDU5NVEyNDEgNjIxIDIzMiA2NDlUMjIyIDY5MFEyMjIgNzA5IDIzMiA3MTFUMjU3IDcxNFEyODYgNzE0IDMxOSA2NTNRMzI0IDY0NCAzMzAgNjMzVDM0NCA2MDdMMzg3IDY1NVE0MTIgNjgyIDQzMyA2OThUNDcyIDcxNFE0ODYgNzE0IDQ5MyA3MDZUNTAxIDY4NlE1MDEgNjY2IDQ4NCA2NDVUNDM1IDU5N1E0MTkgNTg0IDQwMyA1NzNUMzcyIDU1M1QzNDggNTM5VDMzMiA1MzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyQzk7IiBnbHlwaC1uYW1lPSJvdmVyc2NvcmUiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yMjcgNTYyUTE4NyA1NjIgMTg3IDU4OFExODcgNTk3IDE5MCA2MTFUMjAyIDYzNFEyMTIgNjQ0IDIzOCA2NDRINDYyUTUwMyA2NDQgNTAzIDYxOFE1MDMgNjEwIDQ5OSA1OTZUNDg3IDU3M1E0NzcgNTYyIDQ1MSA1NjJIMjI3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkQ4OyIgZ2x5cGgtbmFtZT0iYnJldmUiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0zNDYgNTQ2UTMxOSA1NDYgMjkzIDU1NlQyNDcgNTgzVDIxNCA2MTlUMjAyIDY1OFEyMDIgNjcyIDIxMSA2ODNUMjM3IDY5NVEyNTcgNjk1IDI4MyA2NzVUMzQ1IDYwNFEzODggNjUyIDQxOCA2NzNUNDcxIDY5NVE0ODcgNjk1IDQ5NyA2ODZUNTA3IDY2MlE1MDcgNjQ1IDQ5MyA2MjVUNDU3IDU4OFQ0MDUgNTU4VDM0NiA1NDZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyRDk7IiBnbHlwaC1uYW1lPSJkb3RhY2NlbnQiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0zNDQgNTQ3UTMxMiA1NDcgMjk2IDU2MVQyODAgNTk4UTI4MCA2MjggMjk4IDY1MFQzNDggNjcyUTM4MCA2NzIgMzk1IDY1OFQ0MTEgNjIxUTQxMSA1OTEgMzk0IDU2OVQzNDQgNTQ3WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MkRBOyIgZ2x5cGgtbmFtZT0icmluZyIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTM0OCA1NDhRMjk3IDU0OCAyNjYgNTc3VDIzNSA2NTFRMjM1IDY3OCAyNDUgNzAyVDI3MiA3NDVUMzE0IDc3NVQzNjggNzg3UTQxOSA3ODcgNDUwIDc1OFQ0ODEgNjg0UTQ4MSA2NTcgNDcxIDYzM1Q0NDQgNTg5VDQwMiA1NTlUMzQ4IDU0OFpNMzUwIDYwMVEzODMgNjAxIDQwMiA2MjVUNDIxIDY3OFE0MjEgNzAxIDQwNiA3MTdUMzY1IDczNFEzNDkgNzM0IDMzNiA3MjhUMzE0IDcxMFQzMDAgNjg1VDI5NSA2NTdRMjk1IDYzNCAzMTAgNjE4VDM1MCA2MDFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREI7IiBnbHlwaC1uYW1lPSJvZ29uZWsiIGhvcml6LWFkdi14PSI1MzQiIGQ9Ik0yODkgNVEyNTggLTEyIDIzOCAtMjdUMjA3IC01NVQxOTEgLTgwVDE4NiAtMTAyUTE4NiAtMTMzIDIxNyAtMTMzUTIzOCAtMTMzIDI1MiAtMTE2UTI2MyAtMTE4IDI3MSAtMTI2VDI3OSAtMTQ5UTI3OSAtMTcyIDI1OSAtMTg3VDIwMiAtMjAyUTE2MCAtMjAyIDEzMyAtMTgwVDEwNiAtMTIwUTEwNiAtNzggMTQ3IC0zOVQyNzEgMjBMMjg5IDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyREM7IiBnbHlwaC1uYW1lPSJ0aWxkZSIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTQxNCA1NDZRMzg3IDU0NiAzNTEgNTY1VDI3OSA2MjFRMjY3IDU5NSAyNTIgNTc0VDIyMCA1NTJRMjA0IDU1MiAxOTYgNTYxVDE4OCA1ODFRMTg4IDYwMCAxOTYgNjE4VDIxNiA2NTFUMjQ1IDY3NFQyNzggNjgzUTMwNSA2ODMgMzQxIDY2NFQ0MTMgNjA4UTQyNSA2MzQgNDQwIDY1NVQ0NzIgNjc3UTQ4OCA2NzcgNDk2IDY2OFQ1MDQgNjQ4UTUwNCA2MjggNDk2IDYxMFQ0NzYgNTc4VDQ0NyA1NTVUNDE0IDU0NloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDJERDsiIGdseXBoLW5hbWU9Imh1bmdhcnVtbGF1dCIgaG9yaXotYWR2LXg9IjUzNCIgZD0iTTM2NiA1NTVRMzY0IDU1OCAzNzMgNTczVDQwMCA2MTBUNDQwIDY1M1Q0ODcgNjkyUTUxMiA3MDkgNTM1IDcwOVE1NTMgNzA5IDU2NiA2OThUNTgwIDY3MFE1ODAgNjM1IDUzNyA2MDlRNTEwIDU5MSA0ODEgNTgwVDQyNyA1NjFUMzg1IDU1M1QzNjYgNTU1Wk0xNjkgNTU1UTE2NyA1NTggMTc2IDU3M1QyMDMgNjEwVDI0MiA2NTNUMjg5IDY5MlEzMTUgNzA5IDMzNyA3MDlRMzU2IDcwOSAzNjkgNjk4VDM4MiA2NzBRMzgyIDY1MyAzNzIgNjM4VDM0MCA2MDlRMzEzIDU5MSAyODQgNTgwVDIzMCA1NjFUMTg4IDU1M1QxNjkgNTU1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4Mzk0OyIgZ2x5cGgtbmFtZT0iaW5jcmVtZW50IiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNMjkzIDcwMEgzOTZMNjMzIDBIMzBMMjkzIDcwMFpNMTQwIDczSDQ2NUwzMTAgNTI4TDE0MCA3M1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDNBOTsiIGdseXBoLW5hbWU9Ik9tZWdhIiBob3Jpei1hZHYteD0iNzYwIiBkPSJNMzgwIDYwMlEzMTggNjAyIDI3MiA1ODVUMTk2IDUzN1QxNTAgNDY3VDEzNSAzODBRMTM1IDMzNSAxNDkgMjk0VDE4OCAyMTZUMjQ5IDE0OFQzMjUgOTNWMEg1MVY5M0gxODhRMTE0IDE1MyA3MiAyMjVUMzAgMzgwUTMwIDQ0NiA1NCA1MDRUMTI0IDYwNVQyMzUgNjc0VDM4MCA3MDBRNDYwIDcwMCA1MjUgNjc1VDYzNSA2MDZUNzA1IDUwNFQ3MzAgMzgwUTczMCAyOTcgNjg4IDIyNVQ1NzIgOTNINzA5VjBINDM1VjkzUTQ3NiAxMTcgNTExIDE0OFQ1NzEgMjE1VDYxMSAyOTNUNjI1IDM4MFE2MjUgNDI2IDYxMCA0NjZUNTY1IDUzN1Q0ODggNTg0VDM4MCA2MDJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQkM7IiBnbHlwaC1uYW1lPSJtdSIgaG9yaXotYWR2LXg9IjU5MiIgZD0iTTczIC0yNjNRMTggLTI2MyAwIC0yMzFULTcgLTE0M0wxMjMgNDgxSDIyMkwxNjEgMTkyUTE1NCAxNDQgMTc0IDExMlExOTcgNzQgMjU0IDc0UTMwMiA3NCAzMzUgOThUMzk3IDE3MEw0NjMgNDgxSDU2MUw0ODMgMTEwUTQ3NSA3MiA0ODMgNTdUNTIyIDM4UTUyMyAzOCA1MjIgMzFUNTE2IDE1VDQ5OCAtMVQ0NjMgLTlRNDE4IC05IDM5OSAxNFQzODEgODBRMzUzIDM2IDMxMiAxMlQyMTkgLTEyUTE3MiAtMTIgMTM4IDRRMTMxIDcgMTI0IDExTDkyIC0xNDRRODQgLTE4MiA5MiAtMTk4VDEzNSAtMjE2UTEzNiAtMjE2IDEzNSAtMjIzVDEyOCAtMjM5VDEwOSAtMjU1VDczIC0yNjNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gzQzA7IiBnbHlwaC1uYW1lPSJwaSIgaG9yaXotYWR2LXg9Ijc4OCIgZD0iTTQxMSAtMTNRMzM4IC0xMyAyNzggMTJUMTc0IDgxVDEwNiAxODdUODEgMzIyUTgxIDM5NSAxMDYgNDU3VDE3NSA1NjRUMjc5IDYzNFQ0MTIgNjYwUTQ4NSA2NjAgNTQ1IDYzNVQ2NDkgNTY2VDcxNyA0NjBUNzQyIDMyNVE3NDIgMjUyIDcxNyAxOTBUNjQ4IDgzVDU0NCAxM1Q0MTEgLTEzWk00MTMgNDFRNDczIDQxIDUyMyA2MVQ2MDggMTE5VDY2NCAyMDhUNjg0IDMyM1E2ODQgMzg0IDY2NCA0MzZUNjA3IDUyNVQ1MjAgNTg0VDQxMCA2MDZRMzUwIDYwNiAzMDAgNTg2VDIxNSA1MjhUMTU5IDQzOVQxMzkgMzI0UTEzOSAyNjMgMTU5IDIxMVQyMTYgMTIyVDMwMyA2M1Q0MTMgNDFaTTMyMiAxMzhRMjkxIDEzOCAyOTEgMTcyVjQ0NVEyOTEgNDY1IDMwMSA0NzZUMzMwIDQ4N0g0MjZRNDk1IDQ4NyA1MzIgNDU3VDU2OSAzNzBRNTY5IDMxMiA1MzMgMjgxVDQyOSAyNTBIMzY2VjE3MlEzNjYgMTM4IDMzMyAxMzhIMzIyWk00MjkgMzA5UTQ2MSAzMDkgNDc4IDMyNVQ0OTYgMzY5UTQ5NiAzOTcgNDc4IDQxMlQ0MjUgNDI4SDM2NVYzMDlINDI5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxMzsiIGdseXBoLW5hbWU9ImVuZGFzaCIgaG9yaXotYWR2LXg9IjU3MiIgZD0iTTk5IDIwMVE1NyAyMDEgNTcgMjI4UTU3IDIzNyA2MSAyNTJUNzMgMjc1UTc5IDI4MCA4NyAyODNUMTEwIDI4Nkg0NzZRNTE4IDI4NiA1MTggMjU5UTUxOCAyNTAgNTE0IDIzNVQ1MDEgMjExUTQ5NiAyMDYgNDg4IDIwNFQ0NjQgMjAxSDk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxNDsiIGdseXBoLW5hbWU9ImVtZGFzaCIgaG9yaXotYWR2LXg9IjczOSIgZD0iTTk5IDIwMVE1NyAyMDEgNTcgMjI4UTU3IDIzNyA2MSAyNTJUNzMgMjc1UTc5IDI4MCA4NyAyODNUMTEwIDI4Nkg2NDJRNjg0IDI4NiA2ODQgMjU5UTY4NCAyNTAgNjgwIDIzNVQ2NjggMjExUTY2MiAyMDYgNjU0IDIwNFQ2MzEgMjAxSDk5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxODsiIGdseXBoLW5hbWU9InF1b3RlbGVmdCIgaG9yaXotYWR2LXg9IjI1MCIgZD0iTTE4NSA0MTFRMTg0IDQwOSAxNzEgNDA5VDE0MSA0MTNUMTEyIDQyN1Q5OSA0NTVROTkgNDcwIDEwNSA0ODNUMTI3IDUxNEwyNTAgNjYzUTI1NCA2NjcgMjYyIDY2NlQyNzkgNjYxVDI5MyA2NDlUMjk1IDYzNEwxODUgNDExWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxOTsiIGdseXBoLW5hbWU9InF1b3RlcmlnaHQiIGhvcml6LWFkdi14PSIyNTAiIGQ9Ik0xMjYgNDA5UTEyMiA0MDUgMTEzIDQwNlQ5NiA0MTFUODMgNDIzVDgxIDQzOEwxOTEgNjYxUTE5MiA2NjMgMjA1IDY2M1QyMzUgNjU5VDI2NCA2NDVUMjc3IDYxN1EyNzcgNjAyIDI3MSA1ODlUMjQ5IDU1OEwxMjYgNDA5WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQTsiIGdseXBoLW5hbWU9InF1b3Rlc2luZ2xiYXNlIiBob3Jpei1hZHYteD0iMjU4IiBkPSJNNSAtMTM1UTEgLTEzOSAtOCAtMTM4VC0yNSAtMTMzVC0zOCAtMTIxVC00MCAtMTA2TDcwIDExOFE3MSAxMTkgODQgMTE5VDExNCAxMTVUMTQzIDEwMVQxNTYgNzNRMTU2IDU4IDE1MCA0NlQxMjggMTRMNSAtMTM1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxQzsiIGdseXBoLW5hbWU9InF1b3RlZGJsbGVmdCIgaG9yaXotYWR2LXg9IjQyNSIgZD0iTTE4MiA0MTNRMTgxIDQxMSAxNjggNDExVDE0MCA0MTVUMTEyIDQyOVQ5OSA0NTdROTkgNDcyIDEwNSA0ODVUMTI3IDUxNkwyNTIgNjY2UTI1NiA2NzAgMjY0IDY2OVQyODEgNjY0VDI5NSA2NTJUMjk2IDYzN0wxODIgNDEzWk0zNTkgNDEwUTM1OCA0MDggMzQ1IDQwOFQzMTYgNDEyVDI4NyA0MjdUMjc0IDQ1NVEyNzQgNDY5IDI3OSA0ODJUMzAxIDUxM0w0MjMgNjYyUTQyNyA2NjYgNDM2IDY2NVQ0NTMgNjYwVDQ2NyA2NDhUNDY5IDYzM0wzNTkgNDEwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRDsiIGdseXBoLW5hbWU9InF1b3RlZGJscmlnaHQiIGhvcml6LWFkdi14PSI0MjUiIGQ9Ik0xMjcgNDEwUTEyMyA0MDYgMTE0IDQwN1Q5NyA0MTJUODMgNDI0VDgxIDQzOUwxOTEgNjYyUTE5MiA2NjQgMjA1IDY2NFQyMzQgNjYwVDI2MyA2NDVUMjc2IDYxN1EyNzYgNjAzIDI3MSA1OTBUMjQ5IDU1OUwxMjcgNDEwWk0yOTggNDA2UTI5NCA0MDIgMjg2IDQwM1QyNjkgNDA4VDI1NSA0MjBUMjU0IDQzNUwzNjggNjYwUTM2OSA2NjEgMzgyIDY2MVQ0MTAgNjU3VDQzOCA2NDNUNDUxIDYxNVE0NTEgNjAwIDQ0NSA1ODdUNDIzIDU1NkwyOTggNDA2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAxRTsiIGdseXBoLW5hbWU9InF1b3RlZGJsYmFzZSIgaG9yaXotYWR2LXg9IjQzMCIgZD0iTTQgLTEzNFEwIC0xMzggLTkgLTEzN1QtMjYgLTEzMlQtNDAgLTEyMFQtNDIgLTEwNUw2OCAxMThRNjkgMTIwIDgyIDEyMFQxMTEgMTE2VDE0MCAxMDFUMTUzIDczUTE1MyA1OSAxNDcgNDZUMTI2IDE1TDQgLTEzNFpNMTc1IC0xMzhRMTcxIC0xNDIgMTYyIC0xNDFUMTQ1IC0xMzZUMTMyIC0xMjRUMTMxIC0xMDlMMjQ0IDExNVEyNDUgMTE3IDI1OCAxMTdUMjg3IDExM1QzMTUgOTlUMzI4IDcxUTMyOCA1NiAzMjIgNDNUMjk5IDEyTDE3NSAtMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMDsiIGdseXBoLW5hbWU9ImRhZ2dlciIgaG9yaXotYWR2LXg9IjU1MiIgZD0iTTE5MyAtMTU5UTE3MiAtMTU5IDE2NSAtMTUyVDE2MCAtMTI5TDIzMSAyNzNRMjM1IDI5NiAyNDYgMzIyVDI4MCAzNzFMMTIyIDM0NVE5NiAzNDAgODUgMzUwVDc0IDM4MFE3NCAzOTMgNzcgNDA3VDg2IDQzMVQxMDQgNDQ2VDEzMiA0NDlMMjkwIDQyM0wzMDEgNjA1UTMwMiA2NTUgMzU1IDY1NVEzODggNjU1IDQwMiA2NDJUNDA0IDU5OEwzNDEgNDIyTDQ5OCA0NDhRNTI0IDQ1MyA1MzQgNDQzVDU0NSA0MTNRNTQ1IDM5OSA1NDMgMzg2VDUzMyAzNjJUNTE1IDM0NlQ0ODggMzQ0TDMyOSAzNzBRMzQwIDM0OCAzNDEgMzI0VDMzNiAyNzdMMjM2IC0xMzBRMjI5IC0xNTkgMjA0IC0xNTlIMTkzWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAyMTsiIGdseXBoLW5hbWU9ImRhZ2dlcmRibCIgaG9yaXotYWR2LXg9IjU1MiIgZD0iTTE5MyAtMTU5UTE3MiAtMTU5IDE2NSAtMTUyVDE2MCAtMTI5TDE5OCA4N0w2MyA2NFEzNyA1OSAyNiA2OVQxNSA5OVExNSAxMTIgMTcgMTI2VDI3IDE1MFQ0NSAxNjVUNzMgMTY4TDIwOCAxNDVMMjMyIDI3N1EyMzYgMzAwIDI0NyAzMjZUMjgxIDM3NUwxMjMgMzQ5UTk3IDM0NCA4NiAzNTRUNzUgMzg0UTc1IDM5NyA3OCA0MTFUODcgNDM1VDEwNSA0NTBUMTMzIDQ1M0wyOTAgNDI4TDMwMSA2MDVRMzAyIDY1NSAzNTUgNjU1UTM4OCA2NTUgNDAyIDY0MlQ0MDQgNTk4TDM0MyA0MjZMNDk4IDQ1MlE1MjQgNDU3IDUzNSA0NDdUNTQ2IDQxN1E1NDYgNDAzIDU0NCAzOTBUNTM0IDM2NlQ1MTYgMzUwVDQ4OCAzNDhMMzMwIDM3NFEzNDEgMzUyIDM0MSAzMjhUMzM3IDI4MUwzMDMgMTQ1TDQzOCAxNjdRNDY0IDE3MiA0NzUgMTYyVDQ4NiAxMzJRNDg2IDExOCA0ODQgMTA1VDQ3NCA4MVQ0NTYgNjZUNDI4IDYzTDI4OSA4NkwyMzYgLTEzMFEyMjkgLTE1OSAyMDQgLTE1OUgxOTNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDIyOyIgZ2x5cGgtbmFtZT0iYnVsbGV0IiBob3Jpei1hZHYteD0iMzY4IiBkPSJNMTg1IDEyOVExNjEgMTI5IDE0MCAxMzhUMTA0IDE2MlQ4MCAxOThUNzEgMjQzUTcxIDI2NyA4MCAyODhUMTA0IDMyNVQxNDAgMzUwVDE4NSAzNTlRMjA5IDM1OSAyMzAgMzUwVDI2NiAzMjVUMjkwIDI4OFQyOTkgMjQzUTI5OSAyMTkgMjkwIDE5OVQyNjYgMTYzVDIzMCAxMzhUMTg1IDEyOVoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMjY7IiBnbHlwaC1uYW1lPSJlbGxpcHNpcyIgaG9yaXotYWR2LXg9IjcwMSIgZD0iTTUyNyAtN1E0NzAgLTcgNDcwIDM1UTQ3MCA1NCA0NzQgNzBUNDkwIDk4UTQ5OCAxMDYgNTA5IDExMFQ1MzkgMTE0UTU5NiAxMTQgNTk2IDcyUTU5NiA1MyA1OTEgMzdUNTc1IDlRNTY3IDEgNTU3IC0zVDUyNyAtN1pNMzA1IC03UTI0OCAtNyAyNDggMzVRMjQ4IDU0IDI1MiA3MFQyNjggOThRMjc2IDEwNiAyODcgMTEwVDMxNyAxMTRRMzc0IDExNCAzNzQgNzJRMzc0IDUzIDM2OSAzN1QzNTMgOVEzNDUgMSAzMzUgLTNUMzA1IC03Wk04MiAtN1EyNSAtNyAyNSAzNVEyNSA1NCAzMCA3MFQ0NiA5OFE1NCAxMDYgNjQgMTEwVDk0IDExNFExNTEgMTE0IDE1MSA3MlExNTEgNTMgMTQ3IDM3VDEzMSA5UTEyMyAxIDExMiAtM1Q4MiAtN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMzA7IiBnbHlwaC1uYW1lPSJwZXJ0aG91c2FuZCIgaG9yaXotYWR2LXg9IjExMjEiIGQ9Ik0yMzEgMzQ1UTE2OSAzNDUgMTMwIDM4MlQ5MCA0ODJROTAgNTE3IDEwMiA1NDlUMTM2IDYwNVQxODkgNjQzVDI1OSA2NTdRMzIyIDY1NyAzNjEgNjIwVDQwMSA1MTlRNDAxIDQ4NCAzODkgNDUzVDM1NSAzOTdUMzAxIDM1OVQyMzEgMzQ1Wk04NCAtMTBRODIgLTEyIDc2IC0xMFQ2MyAtM1Q1MSA5VDQ1IDI3UTQ1IDQwIDUyIDUxVDc5IDgwTDcyNSA2NjFRNzI2IDY2MiA3MzIgNjYxVDc0NiA2NTRUNzU5IDY0MlQ3NjUgNjI0UTc2NSA2MTEgNzU4IDYwMFQ3MzAgNTcxTDg0IC0xMFpNODk3IC01UTgzNSAtNSA3OTYgMzJUNzU2IDEzMlE3NTYgMTY3IDc2OCAxOTlUODAyIDI1NVQ4NTUgMjkzVDkyNSAzMDdROTg4IDMwNyAxMDI3IDI3MFQxMDY3IDE2OVExMDY3IDEzNCAxMDU1IDEwM1QxMDIxIDQ3VDk2NyA5VDg5NyAtNVpNNTUxIC01UTQ4OCAtNSA0NDkgMzJUNDA5IDEzMlE0MDkgMTY3IDQyMSAxOTlUNDU1IDI1NVQ1MDkgMjkzVDU3OSAzMDdRNjQyIDMwNyA2ODEgMjcwVDcyMCAxNjlRNzIwIDEzNCA3MDggMTAzVDY3NCA0N1Q2MjEgOVQ1NTEgLTVaTTIzNiA0MDdRMjU2IDQwNyAyNzMgNDE1VDMwMyA0MzlUMzIzIDQ3NFQzMzAgNTE2UTMzMCA1NTAgMzA5IDU3MlQyNTUgNTk1UTIzNSA1OTUgMjE4IDU4N1QxODcgNTYzVDE2NyA1MjhUMTYwIDQ4NlExNjAgNDUyIDE4MiA0MzBUMjM2IDQwN1pNOTAyIDU3UTkyMiA1NyA5MzkgNjVUOTY5IDg5VDk4OSAxMjRUOTk2IDE2NlE5OTYgMjAwIDk3NSAyMjJUOTIxIDI0NVE5MDEgMjQ1IDg4NCAyMzdUODUzIDIxM1Q4MzMgMTc4VDgyNiAxMzZRODI2IDEwMiA4NDggODBUOTAyIDU3Wk01NTUgNTdRNTc1IDU3IDU5MiA2NVQ2MjIgODlUNjQyIDEyNFQ2NDkgMTY2UTY0OSAyMDAgNjI4IDIyMlQ1NzQgMjQ1UTU1NCAyNDUgNTM3IDIzN1Q1MDcgMjEzVDQ4NyAxNzhUNDgwIDEzNlE0ODAgMTAyIDUwMiA4MFQ1NTUgNTdaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDM5OyIgZ2x5cGgtbmFtZT0iZ3VpbHNpbmdsbGVmdCIgaG9yaXotYWR2LXg9IjM0OSIgZD0iTTIxOSA3MlExOTYgNzIgMTcxIDkzVDEyMCAxNDdRMTA3IDE2NCA5NiAxODFUNzYgMjEzVDYzIDIzOFQ1OSAyNTFRNjAgMjU0IDY4IDI2M1Q5MCAyODdUMTIyIDMxN1QxNjAgMzQ5UTE5NCAzNzYgMjI3IDM5NlQyODMgNDE2UTMwMCA0MTYgMzA5IDQwN1QzMTggMzgzUTMxOCAzNjMgMjkwIDMzNlQyMjEgMjg0UTIwMyAyNzMgMTgzIDI2MVQxNDEgMjM4UTE3NCAyMTUgMjAyIDE4N1EyMzMgMTU4IDI0NiAxNDFUMjYwIDEwN1EyNjAgOTMgMjQ5IDgzVDIxOSA3MloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwM0E7IiBnbHlwaC1uYW1lPSJndWlsc2luZ2xyaWdodCIgaG9yaXotYWR2LXg9IjM0OSIgZD0iTTY4IDcyUTUxIDcyIDQyIDgxVDMzIDEwNVEzMyAxMjUgNjEgMTUyVDEzMSAyMDRRMTQ5IDIxNSAxNjkgMjI3VDIxMCAyNTBRMTkzIDI2MiAxNzggMjc0VDE0OSAzMDFRMTE5IDMzMCAxMDYgMzQ3VDkyIDM4MVE5MiAzOTUgMTAzIDQwNVQxMzMgNDE2UTE1NiA0MTYgMTgxIDM5NVQyMzIgMzQxUTI0NSAzMjQgMjU2IDMwN1QyNzUgMjc2VDI4OCAyNTFUMjkzIDIzN1EyOTIgMjM0IDI4NCAyMjVUMjYxIDIwMVQyMjkgMTcxVDE5MSAxMzlRMTU4IDExMiAxMjUgOTJUNjggNzJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDQ0OyIgZ2x5cGgtbmFtZT0idW5pMjA0NCIgaG9yaXotYWR2LXg9IjY4NSIgZD0iTTQ4IC04UTQ2IC0xMCAzOSAtOVQyNCAtNFQxMCA4VDQgMjZRNCA0MCAxMyA1M1QzNyA4MUw2NzMgNjYwUTY3NSA2NjIgNjgyIDY2MVQ2OTcgNjU1VDcxMSA2NDNUNzE3IDYyNlE3MTcgNjEyIDcwOCA1OTlUNjg0IDU3MUw0OCAtOFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwQUM7IiBnbHlwaC1uYW1lPSJFdXJvIiBob3Jpei1hZHYteD0iNjYyIiBkPSJNMTE3IDM2N1E4MCAzNjcgODAgMzkwUTgwIDM5OSA4MyA0MTBUOTMgNDI4UTEwMyA0MzggMTI1IDQzOEgxODVRMjAwIDQ3NyAyMjAgNTEyVDI2OCA1NzVRMzExIDYxOCAzNjAgNjM5VDQ3MyA2NjBRNTI3IDY2MCA1NjYgNjQ0VDYzMiA2MDFRNjQ5IDU4NCA2NTcgNTYzVDY2NiA1MjJRNjY2IDUwMiA2NTcgNDkwVDYzNyA0NzJUNjE3IDQ2NVQ2MDYgNDY1UTU4OSA1MjIgNTUzIDU0OFQ0NjMgNTc0UTQyNCA1NzQgMzk0IDU2MVQzMzggNTIyUTMyMSA1MDUgMzA5IDQ4NFQyODUgNDM4SDQ3NFE1MTEgNDM4IDUxMSA0MTZRNTExIDQwNiA1MDggMzk1VDQ5NyAzNzdRNDg3IDM2NyA0NjYgMzY3SDI2MFEyNTQgMzQ0IDI1MCAzMjNUMjQ0IDI4NEg0NDFRNDc4IDI4NCA0NzggMjYxUTQ3OCAyNTEgNDc0IDI0MFQ0NjQgMjIyUTQ1NCAyMTIgNDMzIDIxMkgyNDJRMjUwIDE1MiAyODYgMTEzVDM4OCA3M1E0MzYgNzMgNDcyIDk0VDU0MiAxNjFRNTQzIDE2MiA1NTAgMTYwVDU2NSAxNTFUNTc5IDEzNlQ1ODYgMTE0UTU4NiA4NSA1NTQgNTNRNTI2IDI2IDQ4MSA3VDM4NCAtMTJRMjcyIC0xMiAyMTAgNDlUMTQyIDIxMkg4M1E0NyAyMTIgNDcgMjM1UTQ3IDI0NCA1MCAyNTVUNjAgMjc0UTcyIDI4NCA5MiAyODRIMTQ1UTE0OCAzMDMgMTUyIDMyM1QxNjIgMzY3SDExN1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMTM7IiBnbHlwaC1uYW1lPSJhZmlpNjEyODkiIGhvcml6LWFkdi14PSI0MzQiIGQ9Ik0xOTkgMzQxUTIyOCAzNjUgMjUxIDM5NVQyOTEgNDU2VDMxNyA1MTNUMzI2IDU1OFEzMjYgNTg0IDMxNSA1ODRRMzA4IDU4NCAzMDAgNTczUTI5MSA1NjEgMjc4IDUzOVQyNTAgNDg2VDIyMiA0MTlUMTk5IDM0MVpNNDQgMTM4UTMwIDE1MSAxOSAxNzJUNyAyMjhRMjUgMjM3IDMzIDI0MFQ0OSAyNDZMNTkgMjUxUTYzIDMyMSA4MSAzODNUMTI2IDQ5N1QxODMgNTg4VDI0NSA2NTJRMjg1IDY4MyAzMjcgNjgzUTM2NyA2ODMgMzk1IDY1MlQ0MjMgNTU4UTQyMyA1MDkgNDAyIDQ2M1QzNDkgMzc1VDI3NiAyOTRUMTk2IDIyM1ExOTYgMjE4IDE5NiAyMTRUMTk1IDIwNFExOTUgMTU4IDIwNyAxMzNUMjM3IDEwN1EyNTQgMTA3IDI3MyAxMzNUMzEwIDIxN1EzMjIgMjIwIDMzNiAyMjBRMzU1IDIyMCAzNzMgMjEzVDQwNCAxODZRMzk3IDE0OSAzODIgMTE0VDM0NSA1MlQyOTMgOVQyMjggLThRMjA2IC04IDE4MiAxVDEzNSAzMFQ5NCA3OFQ2NiAxNDZMNDQgMTM4WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyMjsiIGdseXBoLW5hbWU9InRyYWRlbWFyayIgaG9yaXotYWR2LXg9IjcyMSIgZD0iTTQ0MCAzMzZRNDEzIDMzNiA0MTMgMzY4VjYxN1E0MTMgNjUxIDQ0NCA2NTFINDcxUTQ4NiA2NTEgNDkyIDY0NlQ1MDQgNjI4TDU2NCA0ODFMNjI0IDYyOFE2MzAgNjQyIDYzNyA2NDZUNjU4IDY1MUg2ODNRNzEzIDY1MSA3MTMgNjE3VjM2OFE3MTMgMzUzIDcwNyAzNDVUNjg2IDMzNkg2NzdRNjUwIDMzNiA2NTAgMzY4VjU1N0w1OTUgNDE2UTU5MyA0MDkgNTg5IDQwNVQ1NjMgNDAwUTU0MyA0MDAgNTM5IDQwNFQ1MzMgNDE2TDQ3NiA1NTZWMzY4UTQ3NiAzNTMgNDcxIDM0NVQ0NTEgMzM2SDQ0MFpNMjI1IDMzNlExOTggMzM2IDE5OCAzNjhWNTg4SDEyNVE5NSA1ODggOTUgNjE3VjYyMFE5NSA2NDggMTI1IDY0OEgzMzZRMzY2IDY0OCAzNjYgNjIwVjYxN1EzNjYgNTg4IDMzNiA1ODhIMjY0VjM2OFEyNjQgMzM2IDIzNCAzMzZIMjI1WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjEyNjsiIGdseXBoLW5hbWU9InVuaTIxMjYiIGhvcml6LWFkdi14PSI3NjAiIGQ9Ik0zODAgNjAyUTMxOCA2MDIgMjcyIDU4NVQxOTYgNTM3VDE1MCA0NjdUMTM1IDM4MFExMzUgMzM1IDE0OSAyOTRUMTg4IDIxNlQyNDkgMTQ4VDMyNSA5M1YwSDUxVjkzSDE4OFExMTQgMTUzIDcyIDIyNVQzMCAzODBRMzAgNDQ2IDU0IDUwNFQxMjQgNjA1VDIzNSA2NzRUMzgwIDcwMFE0NjAgNzAwIDUyNSA2NzVUNjM1IDYwNlQ3MDUgNTA0VDczMCAzODBRNzMwIDI5NyA2ODggMjI1VDU3MiA5M0g3MDlWMEg0MzVWOTNRNDc2IDExNyA1MTEgMTQ4VDU3MSAyMTVUNjExIDI5M1Q2MjUgMzgwUTYyNSA0MjYgNjEwIDQ2NlQ1NjUgNTM3VDQ4OCA1ODRUMzgwIDYwMloiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIxMkU7IiBnbHlwaC1uYW1lPSJlc3RpbWF0ZWQiIGhvcml6LWFkdi14PSI4MzAiIGQ9Ik00MTUgNjcxUTQ5MiA2NzEgNTYwIDY0NVQ2ODEgNTczVDc2MyA0NjNUNzkzIDMyNEgxODVRMTc1IDMyNCAxNzUgMzEzVjExNlEyMjMgNjUgMjg2IDM4VDQxNSAxMFE0OTAgMTAgNTU1IDQzVDY2NyAxMzFINzI0UTY2NyA2MiA1ODUgMjZUNDE1IC0xMVEzNDAgLTExIDI3MiAxNFQxNTEgODRUNjcgMTkxVDM2IDMzMFEzNiA0MDMgNjYgNDY1VDE0NyA1NzRUMjY4IDY0NVQ0MTUgNjcxWk00MTUgNjUwUTM0NSA2NTAgMjgyIDYyMlQxNzUgNTQzVjM1OFExNzUgMzQ3IDE4NSAzNDdINjQ2UTY1NSAzNDcgNjU1IDM1OFY1NDJRNjEwIDU5NCA1NDYgNjIyVDQxNSA2NTBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjAyOyIgZ2x5cGgtbmFtZT0icGFydGlhbGRpZmYiIGhvcml6LWFkdi14PSI1MzgiIGQ9Ik0zMDMgNDgxUTMzNSA0ODEgMzYxIDQ3MVQ0MDQgNDQ1VjQ2NFE0MDQgNDk5IDM5OSA1MjhUMzgxIDU3OFQzNDMgNjEwVDI4MiA2MjJRMjQ3IDYyMiAyMDggNjEyTDE4OSA2NzlRMjcxIDcxMCAzMzIgNzEwUTQyMSA3MTAgNDY0IDY0OVQ1MDggNDc1UTUwOCAzNzAgNDgxIDI4M1Q0MDkgMTMzVDMxMSAzNVQyMDEgMFExNjUgMCAxMzQgMTBUODAgNDRUNDMgMTAyVDMwIDE4N1EzMCAyNTYgNTUgMzEwVDEyMCA0MDNUMjA4IDQ2MVQzMDMgNDgxWk0yMDUgMTA1UTIyOSAxMDUgMjU2IDEyMVQzMTAgMTY3VDM1OSAyNDNUMzkzIDM0OVEzODIgMzYxIDM2MCAzNzNUMzA5IDM4NlEyNzUgMzg2IDI0NCAzNzFUMTg4IDMzMVQxNDkgMjcwVDEzNCAxOTRRMTM0IDE1NyAxNTAgMTMxVDIwNSAxMDVaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjA2OyIgZ2x5cGgtbmFtZT0idW5pMjIwNiIgaG9yaXotYWR2LXg9IjY0OSIgZD0iTTI5MyA3MDBIMzk2TDYzMyAwSDMwTDI5MyA3MDBaTTE0MCA3M0g0NjVMMzEwIDUyOEwxNDAgNzNaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjBGOyIgZ2x5cGgtbmFtZT0icHJvZHVjdCIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTQ4NCAwVjYwN0gxNTBWMEg1MFY3MDBINTg0VjBINDg0WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxMTsiIGdseXBoLW5hbWU9InN1bW1hdGlvbiIgaG9yaXotYWR2LXg9IjQ3NSIgZD0iTTExMCA4MEg0MzdWMEgyNVY5NkwyMDkgMzI1TDI1IDU1NFY2NTBINDM3VjU3MEgxMTVMMjg4IDM1M1YzMDBMMTEwIDgwWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxMjsiIGdseXBoLW5hbWU9Im1pbnVzIiBob3Jpei1hZHYteD0iNjM0IiBkPSJNMTMxIDIyMVE4NyAyMjEgOTYgMjYwTDk4IDI2N1ExMDMgMjg2IDExNCAyOTZUMTQ5IDMwNkg1MTFRNTM1IDMwNiA1NDMgMjk2VDU0NyAyNjdMNTQ1IDI2MFE1NDAgMjQxIDUyOSAyMzFUNDkzIDIyMUgxMzFaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE1OyIgZ2x5cGgtbmFtZT0iZnJhY3Rpb24iIGhvcml6LWFkdi14PSI2ODUiIGQ9Ik00OCAtOFE0NiAtMTAgMzkgLTlUMjQgLTRUMTAgOFQ0IDI2UTQgNDAgMTMgNTNUMzcgODFMNjczIDY2MFE2NzUgNjYyIDY4MiA2NjFUNjk3IDY1NVQ3MTEgNjQzVDcxNyA2MjZRNzE3IDYxMiA3MDggNTk5VDY4NCA1NzFMNDggLThaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjE5OyIgZ2x5cGgtbmFtZT0ibWlkZG90IiBob3Jpei1hZHYteD0iMjY2IiBkPSJNMTI4IDE4NFE3MSAxODQgNzEgMjI2UTcxIDI0NSA3NiAyNjFUOTIgMjg5UTEwMCAyOTcgMTEwIDMwMVQxNDAgMzA1UTE5NyAzMDUgMTk3IDI2M1ExOTcgMjQ0IDE5MyAyMjhUMTc3IDIwMFExNjkgMTkyIDE1OCAxODhUMTI4IDE4NFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMUE7IiBnbHlwaC1uYW1lPSJyYWRpY2FsIiBob3Jpei1hZHYteD0iNjQ5IiBkPSJNMjU2IDUwMUwzNjkgMTcxTDU2NiA3MDBINjQ5TDM4NiAwSDI4M0wxMzYgNDMzSDMwVjUwMUgyNTZaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjFFOyIgZ2x5cGgtbmFtZT0iaW5maW5pdHkiIGhvcml6LWFkdi14PSI3MzMiIGQ9Ik03MDMgMjcxUTcwMyAyMzEgNjkwIDIwM1Q2NTQgMTU2VDYwNCAxMjlUNTQ3IDEyMFE1MTggMTIwIDQ5MyAxMjhUNDQ3IDE1MFQ0MDUgMTgxVDM2NiAyMTdRMzQ3IDE5OSAzMjggMTgyVDI4NyAxNTFUMjQwIDEyOVQxODYgMTIwUTE1NyAxMjAgMTI5IDEyOVQ3OSAxNTZUNDQgMjAzVDMwIDI3MVEzMCAzMTAgNDMgMzM4VDc5IDM4NVQxMjkgNDEzVDE4NiA0MjJRMjE1IDQyMiAyNDAgNDE0VDI4NiAzOTJUMzI3IDM2MVQzNjYgMzI1UTM4NSAzNDMgNDA1IDM2MFQ0NDYgMzkxVDQ5MyA0MTNUNTQ3IDQyMlE1NzYgNDIyIDYwNCA0MTRUNjU0IDM4N1Q2ODkgMzQwVDcwMyAyNzFaTTE4NyAyMjJRMjIzIDIyMiAyNTIgMjM1VDMwOCAyNzFRMjgyIDI5MiAyNTMgMzA2VDE4NyAzMjBRMTY3IDMyMCAxNDkgMzA5VDEzMCAyNzFRMTMwIDI0NCAxNDggMjMzVDE4NyAyMjJaTTU0NiAzMjBRNTEwIDMyMCA0ODEgMzA2VDQyNSAyNzFRNDUxIDI0OSA0ODAgMjM2VDU0NiAyMjJRNTY2IDIyMiA1ODQgMjMzVDYwMyAyNzFRNjAzIDI5OCA1ODUgMzA5VDU0NiAzMjBaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjJCOyIgZ2x5cGgtbmFtZT0iaW50ZWdyYWwnIiBob3Jpei1hZHYteD0iMzk2IiBkPSJNMTY0IDU5NlExNzIgNjU0IDIwMSA2ODVRMjI4IDcxNCAyNzEgNzIzVDM3NSA3MjRWNjQ4UTMxNCA2NTMgMjg4IDY0MFQyNTUgNTg0TDE2OCAtMzJRMTU5IC05NSAxMjggLTEyNlExMDUgLTE0OSA3MCAtMTU1VC0xNSAtMTU1Vi04MVEyMiAtODQgNDUgLTc1VDc0IC0yNUwxNjQgNTk2WiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI0ODsiIGdseXBoLW5hbWU9ImFwcHJveGVxdWFsIiBob3Jpei1hZHYteD0iNTM0IiBkPSJNMzI5IDEwNlEzMDIgMTA2IDI2NiAxMjVUMTk0IDE4MVExODIgMTU1IDE2NyAxMzRUMTM1IDExMlExMTkgMTEyIDExMSAxMjFUMTAzIDE0MVExMDMgMTYwIDExMSAxNzhUMTMxIDIxMVQxNjAgMjM0VDE5MyAyNDNRMjIwIDI0MyAyNTYgMjI0VDMyOCAxNjhRMzQwIDE5NCAzNTUgMjE1VDM4NyAyMzdRNDAzIDIzNyA0MTEgMjI4VDQxOSAyMDhRNDE5IDE4OCA0MTEgMTcwVDM5MSAxMzhUMzYyIDExNVQzMjkgMTA2Wk0zNTUgMjQ5UTMyOCAyNDkgMjkyIDI2OFQyMjAgMzI0UTIwOCAyOTggMTkzIDI3N1QxNjEgMjU1UTE0NSAyNTUgMTM3IDI2NFQxMjkgMjg0UTEyOSAzMDMgMTM3IDMyMVQxNTcgMzU0VDE4NiAzNzdUMjE5IDM4NlEyNDYgMzg2IDI4MiAzNjdUMzU0IDMxMVEzNjYgMzM3IDM4MSAzNThUNDEzIDM4MFE0MjkgMzgwIDQzNyAzNzFUNDQ1IDM1MVE0NDUgMzMxIDQzNyAzMTNUNDE3IDI4MVQzODggMjU4VDM1NSAyNDlaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMjYwOyIgZ2x5cGgtbmFtZT0ibm90ZXF1YWwiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik0xNTcgMzM3UTE0MCAzMzcgMTMxIDM0M1QxMjEgMzYxUTEyMSAzNzEgMTI1IDM4NlQxMzcgNDA4UTE0NyA0MTggMTcyIDQxOEgzODFMNDcyIDU1NlE0ODcgNTgxIDUwMCA1ODZUNTI2IDU4NUw1MzQgNTgxUTU0NiA1NzMgNTQ4IDU2MlQ1MzQgNTI0TDQ2NCA0MThINTI5UTU3MCA0MTggNTcwIDM5NFE1NzAgMzg1IDU2NiAzNzBUNTUzIDM0N1E1NDQgMzM3IDUxOSAzMzdINDA1TDMwMiAxODRINDgwUTUyMCAxODQgNTIwIDE1OVE1MjAgMTUwIDUxNiAxMzZUNTA0IDExM1E0OTQgMTAzIDQ2OSAxMDNIMjU1TDE2NiAtMzVRMTUxIC02MSAxMzggLTY2VDExMyAtNjRMMTA0IC01OVE5MiAtNTIgOTAgLTQwVDEwNCAtM0wxNzIgMTAzSDEwOFE3MSAxMDMgNzEgMTI3UTcxIDEzNyA3NSAxNTFUODggMTc0UTk3IDE4NCAxMjIgMTg0SDIzMUwzMzQgMzM3SDE1N1oiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjQ7IiBnbHlwaC1uYW1lPSJsZXNzZXF1YWwiIGhvcml6LWFkdi14PSI2MzQiIGQ9Ik00ODAgMzMzUTUxMCAzMTggNTE5IDMwMlQ1MjggMjcwUTUyNyAyNjAgNTIzIDI1MlQ1MTMgMjM3VDUwMyAyMjlUNDk2IDIyN0wxNjggMzc5UTE1NCAzODcgMTQ2IDM5OFQxMzggNDI3UTEzOCA0NDcgMTQ4IDQ2M1QxODUgNDkxTDU3OCA2MzFRNTgwIDYzMiA1ODQgNjI5VDU5MiA2MTlUNjAxIDYwNFQ2MDUgNTg1UTYwNiA1NzEgNTk1IDU1NlQ1NTEgNTI3TDI0OSA0MzBMNDgwIDMzM1pNMTEyIDk1UTcxIDk1IDcxIDEyMVE3MSAxMzEgNzUgMTQ1VDg3IDE2NlE5OCAxNzcgMTIyIDE3N0g0NzVRNTE2IDE3NyA1MTYgMTUxUTUxNiAxNDEgNTEyIDEyN1Q1MDAgMTA2UTQ4OSA5NSA0NjUgOTVIMTEyWiIgIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjI2NTsiIGdseXBoLW5hbWU9ImdyZWF0ZXJlcXVhbCIgaG9yaXotYWR2LXg9IjYzNCIgZD0iTTEwMyAyNzNRMTAzIDI4OCAxMTMgMzAzVDE1OCAzMzFMNDYxIDQzMEwyMjggNTI3UTIxMiA1MzMgMjAzIDU0MFQxODggNTU2VDE4MiA1NzJUMTgxIDU4OFExODMgNjA5IDE5NSA2MjFUMjEzIDYzMUw1NDAgNDgwUTU1NyA0NzMgNTYzIDQ2MVQ1NzAgNDMyUTU3MCA0MTIgNTYwIDM5NlQ1MjQgMzY4TDEzMCAyMjlRMTI4IDIyOCAxMjQgMjMxVDExNiAyNDBUMTA3IDI1NFQxMDMgMjczWk0xMTIgOTVRNzEgOTUgNzEgMTIxUTcxIDEzMSA3NSAxNDVUODcgMTY2UTk4IDE3NyAxMjIgMTc3SDQ3NVE1MTYgMTc3IDUxNiAxNTFRNTE2IDE0MSA1MTIgMTI3VDUwMCAxMDZRNDg5IDk1IDQ2NSA5NUgxMTJaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyNUNBOyIgZ2x5cGgtbmFtZT0ibG96ZW5nZSIgaG9yaXotYWR2LXg9IjUyMCIgZD0iTTMwIDM4OEwyMjYgNzc2SDI5NEw0OTAgMzg4TDI5NCAwSDIyNkwzMCAzODhaTTM3MCAzODhMMjYwIDYxNkwxNTAgMzg4TDI2MCAxNTlMMzcwIDM4OFoiICAvPgorPGdseXBoIHVuaWNvZGU9IiYjeEZCMDE7IiBnbHlwaC1uYW1lPSJmaSIgaG9yaXotYWR2LXg9IjYxOSIgZD0iTTE1NyA0MDBINThRNTggNDAzIDU5IDQwN1E2MCA0MTAgNjAgNDE0VDYzIDQyNlE2NSA0MzQgNjggNDQ4VDczIDQ3MVE3MyA0NzMgNzMgNDc1VDc0IDQ3OVE3NCA0ODEgNzUgNDgxSDE3NEwxODUgNTI4UTIwMyA2MTYgMjQ3IDY1NVQzNTYgNjk0UTQyMCA2OTQgNDQ4IDY2NFE0NjQgNjQ4IDQ2NCA2MjdRNDY0IDYxNiA0NjAgNjA3VDQ1MCA1OTJUNDM5IDU4M1Q0MzMgNTgxUTQyMyA1OTUgNDA0IDYwNFQzNjEgNjE0UTMzMCA2MTQgMzEwIDU5M1QyNzggNTIyTDI2OSA0ODFIMzk4UTM5NyA0NzggMzk2IDQ3NFEzOTUgNDcxIDM5NSA0NjdUMzkyIDQ1NkwzODMgNDEwUTM4MiA0MDcgMzgyIDQwNlQzODEgNDAyVjQwMEgyNTVMMTcxIDBINzJMMTU3IDQwMFpNNDg4IC05UTQzMyAtOSA0MTUgMjNUNDA4IDExMUw0ODcgNDgxSDU4NUw1MDcgMTEwUTQ5OSA3MiA1MDcgNTZUNTUwIDM4UTU1MSAzOCA1NTAgMzFUNTQzIDE1VDUyNCAtMVQ0ODggLTlaTTU2OSA1ODRRNTQwIDU4NCA1MjUgNTk2VDUxMCA2MzBRNTEwIDY1NiA1MjYgNjc1VDU3MiA2OTRRNjAxIDY5NCA2MTYgNjgyVDYzMSA2NDlRNjMxIDYyMiA2MTUgNjAzVDU2OSA1ODRaIiAgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hGQjAyOyIgZ2x5cGgtbmFtZT0iZmwiIGhvcml6LWFkdi14PSI2MTkiIGQ9Ik0xNTcgNDAwSDU4UTU4IDQwMyA1OSA0MDdRNjAgNDEwIDYwIDQxNFQ2MyA0MjZRNjUgNDM0IDY4IDQ0OFQ3MyA0NzFRNzMgNDczIDczIDQ3NVQ3NCA0NzlRNzQgNDgxIDc1IDQ4MUgxNzRMMTg1IDUyOFEyMDMgNjE2IDI0NyA2NTVUMzU2IDY5NFE0MjAgNjk0IDQ0OCA2NjRRNDY0IDY0OCA0NjQgNjI3UTQ2NCA2MTYgNDYwIDYwN1Q0NTAgNTkyVDQzOSA1ODNUNDMzIDU4MVE0MjMgNTk1IDQwNCA2MDRUMzYxIDYxNFEzMzAgNjE0IDMxMCA1OTNUMjc4IDUyMkwyNjkgNDgxSDM5OFEzOTcgNDc4IDM5NiA0NzRRMzk1IDQ3MSAzOTUgNDY3VDM5MiA0NTZMMzgzIDQxMFEzODIgNDA3IDM4MiA0MDZUMzgxIDQwMlY0MDBIMjU1TDE3MSAwSDcyTDE1NyA0MDBaTTQ4NyAtOVE0MzIgLTkgNDE0IDIzVDQwNyAxMTFMNTI5IDY4M0g2MjdMNTA2IDExMFE0OTggNzIgNTA2IDU2VDU0OSAzOFE1NTAgMzggNTQ5IDMxVDU0MiAxNVQ1MjMgLTFUNDg3IC05WiIgIC8+CisKKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRkOyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJAIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkEiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IkMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iRyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJPIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iVCIgaz0iOTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJVIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlYiIGs9IjcyIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iVyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJZIiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IlwiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iYSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJjIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9ImQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iZSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJvIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9InEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0idiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0ieSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGM1OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGRjOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hlNzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGE5OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMTIyOyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjNjsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gzYzA7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGU2OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hjMDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMzOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeDE1MjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4MTUzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDFjOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDFkOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDE4OyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gyMDE5OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3gxNzg7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4YzE7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZDQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE0MTsiIHUyPSImI3hkYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3gxNDE7IiB1Mj0iJiN4ZGI7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTQxOyIgdTI9IiYjeGQ5OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hkZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJBIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSJXIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IlgiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iWSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGM0OyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjNTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4YzY7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMzsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3gxNjA7IiB1Mj0iJiN4MTc4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTYwOyIgdTI9IiYjeGMyOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeDE2MDsiIHUyPSImI3hjMTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxNjA7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE2MTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImYW1wOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IikiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iLSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSI6IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IkAiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJBIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iQyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iRyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iSiIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Ik8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlMiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iVCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJWIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IlgiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iXSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJhIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iYyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9ImQiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJlIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iZyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9Im0iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJuIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ibyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InAiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJxIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iciIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ0IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0idSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ4IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0ieSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9InoiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSJ9IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGM0OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGM1OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQ2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZTc7IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YWU7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YTk7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YzY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDg7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gzYzA7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZTY7IiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YWI7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4YmI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkNTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE1MjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDE1MzsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDEzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMTQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAzOTsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gyMDNhOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hjMTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3hkMzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRkOyIgdTI9IiYjeGQ0OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGQ7IiB1Mj0iJiN4ZDI7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZDsiIHUyPSImI3gxMzE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4ZGQ7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTdkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDJjOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9Ii4iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSIvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IkoiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJUIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iViIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IlciIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJYIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iWSIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IloiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJiIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJsIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSJ6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAyNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gyMDFjOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMTg7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MTc4OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGRlOyIgdTI9IiYjeDIwMWE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGU7IiB1Mj0iJiN4MjAxZTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkZTsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZjA7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Ii0iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iQSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IkMiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iRyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJKIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iTyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJRIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IlQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJhIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJjIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImQiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iZSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJmIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9ImkiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iaiIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9Im0iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ibiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJvIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InAiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0icSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJyIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9InUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0idiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0ieSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjNTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkNjsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZTc7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGM2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQ4OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hlNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4YzM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDU7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeDE1MjsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4MTUzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDEzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gyMDE0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hjMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3hkMzsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3gxN2Q7IiB1Mj0iJiN4ZDQ7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4MTdkOyIgdTI9IiYjeGQyOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ZDsiIHUyPSImI3gxMzE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hkZDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IkEiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJKIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiZhbXA7IiB1Mj0iVCIgaz0iMTIwIiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImYW1wOyIgdTI9IlgiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSJZIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNDsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNTsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjNjsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMDsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMzsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3gxNzg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMjsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iJmFtcDsiIHUyPSImI3hjMTsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iKCIgdTI9IiYjeGRkOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iViIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iVyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJYIiBrPSItMzIiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJZIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJnIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IigiIHUyPSJqIiBrPSItMTIwIiAvPgorPGhrZXJuIHUxPSIoIiB1Mj0iJiN4MTc4OyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iQSIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjNDsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzU7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGM2OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMDsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSIqIiB1Mj0iJiN4YzM7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iKiIgdTI9IiYjeGMyOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IioiIHUyPSImI3hjMTsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkZDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSIwIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iMSIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSI2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iOCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IjkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkEiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iQyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IkciIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJPIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iUSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlQiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJVIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJWIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iVyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJhIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iYyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9ImQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJlIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ibSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9Im4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJvIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0icCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJyIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9InUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSJ2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0ieSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGM0OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZGM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hlNzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjNjsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZTY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzA7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGMzOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkNTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3gxNTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4MTUzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hjMjsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4YzE7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQ0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeGRhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MmM7IiB1Mj0iJiN4ZGI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyYzsiIHUyPSImI3hkOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDJjOyIgdTI9IiYjeDEzMTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeDE3ZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSIxIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IjciIGs9IjI0IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iQSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJUIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iVyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJYIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iWiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ4IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSJ6IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjNTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4ZTc7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii0iIHUyPSImI3hjMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSItIiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLSIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkZDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iMCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSIxIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iNiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSI4IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IjkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJBIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IkciIGs9IjMyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iTyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlQiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IlYiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iVyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJZIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iYyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJkIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9ImUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0ibSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJuIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9Im8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0icCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJxIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InIiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSJ1IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InYiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzQ7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjNTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hlNzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzY7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZTY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGMwOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4MTUyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3gxNTM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4YzI7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hjMTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ii4iIHUyPSImI3hkNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSIuIiB1Mj0iJiN4ZDI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGRiOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeGQ5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLiIgdTI9IiYjeDEzMTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iMSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iNCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJDIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IkciIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iTyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJRIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSJnIiBrPSI4IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0ibyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9InEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZTc7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDg7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQ1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3gxNTI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ii8iIHUyPSImI3hkMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSIvIiB1Mj0iJiN4ZDQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iLyIgdTI9IiYjeGQyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSImI3gyYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSIwIiB1Mj0iLiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IjAiIHUyPSI3IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDIwMjY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDIwMWE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iMCIgdTI9IiYjeDIwMWU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iMiIgdTI9Ii0iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjIiIHUyPSI0IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iMiIgdTI9IiYjeDIwMTM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSIyIiB1Mj0iJiN4MjAxNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSImI3gyYzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSIzIiB1Mj0iLiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IjMiIHUyPSI3IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMWE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iMyIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iNCIgdTI9IjciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjQiIHUyPSImI3hiMDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSI0IiB1Mj0iJiN4MjEyMjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iJiN4MmM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iLiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IjciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjUiIHUyPSImI3gyMDI2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iNSIgdTI9IiYjeDIwMWE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSI1IiB1Mj0iJiN4MjAxZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSIuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iNyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iNiIgdTI9IiYjeDIwMjY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSI2IiB1Mj0iJiN4MjAxYTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjYiIHUyPSImI3gyMDFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDJjOyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSItIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9Ii4iIGs9IjY0IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iMCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjEiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjMiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjQiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iNSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iOSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IjciIHUyPSI6IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI3IiB1Mj0iJiN4YTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMjY7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMTM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMTQ7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMWE7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iNyIgdTI9IiYjeDIwMWU7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IiYjeDJjOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IjgiIHUyPSIuIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iOCIgdTI9IjciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAyNjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAxYTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSI4IiB1Mj0iJiN4MjAxZTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iJiN4MmM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iOSIgdTI9Ii4iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSI5IiB1Mj0iNyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSImI3gyMDI2OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSImI3gyMDFhOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IjkiIHUyPSImI3gyMDFlOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hkZDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iMCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSIxIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IjQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iNiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSI4IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IjkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJBIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IkciIGs9IjMyIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iTyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlQiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IlYiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iVyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJZIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iYyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJkIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9ImUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0ibSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJuIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9Im8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0icCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJxIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9InIiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0idCIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSJ1IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9InYiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4YzQ7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hjNTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hkYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hlNzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4YzY7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hkODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZTY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGMwOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4YzM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hkNTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4MTUyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3gxNTM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4YzI7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hjMTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGQzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IjoiIHUyPSImI3hkNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSI6IiB1Mj0iJiN4ZDI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGRhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGRiOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeGQ5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOiIgdTI9IiYjeDEzMTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iJiN4ZGQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IjEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iNyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJUIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IlYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iVyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJZIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSJvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSI7IiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGU3OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iOyIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IjsiIHUyPSImI3gxNzg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJmd0OyIgdTI9IjciIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iJiN4ZGQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IkEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSJUIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJAIiB1Mj0iWSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3hjMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkAiIHUyPSImI3gxNzg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQCIgdTI9IiYjeGMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE2MDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZGQ7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IioiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4MmM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSItIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Ii4iIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJBIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IkMiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iRyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJKIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iTyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iVCIgaz0iMTEyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iViIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJXIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IlkiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0idiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0ieSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSJ6IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjNTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIxMjI7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGM2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4M2MwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMjY7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hjMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQ1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDEzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFjOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFkOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE4OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDE5OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxNzg7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeDIwMWE7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gyMDFlOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3hkMzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJBIiB1Mj0iJiN4ZDQ7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iQSIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkEiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iJiN4ZGQ7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkIiIHUyPSJXIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iQiIgdTI9IlkiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJCIiB1Mj0iJiN4MTc4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3gxN2Q7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iVCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJWIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJYIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IloiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJhIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9ImMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iZCIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJlIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9Im8iIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0icSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ0IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0idiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9InciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSJ5IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iQyIgdTI9IiYjeGU3OyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkMiIHUyPSImI3hlNjsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJDIiB1Mj0iJiN4MTUzOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3hkZDsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iJiN4MTdkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iLiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSIvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iSiIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJUIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlYiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iVyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJYIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IlkiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iWiIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9ImgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJEIiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMjY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDFjOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gyMDE4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkQiIHUyPSImI3gxNzg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDIwMWU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRCIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJAIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IlQiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9ImciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0idiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSJ5IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IkUiIHUyPSImI3hhZTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4YTk7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDNjMDsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJFIiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iRSIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTYxOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hkZDsiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiZhbXA7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDJjOyIgaz0iNzIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSItIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Ii4iIGs9IjcyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iLyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSI6IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iQCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJBIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IkoiIGs9IjcyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVCIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iViIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iVyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJYIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IlkiIGs9Ii0yMCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImMiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJlIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iZyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iaSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9ImoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9Im0iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ibiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InAiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0icSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJyIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InMiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ1IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0idyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSJ4IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9InkiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0ieiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGU3OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hhZTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YTk7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGM2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gzYzA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGU2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gyMDI2OyIgaz0iNzIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3hjMDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeDE1MzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MTc4OyIgaz0iLTIwIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxYTsiIGs9IjcyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4MjAxZTsiIGs9IjcyIiAvPgorPGhrZXJuIHUxPSJGIiB1Mj0iJiN4YzI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRiIgdTI9IiYjeGMxOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IkYiIHUyPSImI3gxMzE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IiYjeGRkOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyYzsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9Ii4iIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iViIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9IlciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iWSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iRyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMTIyOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMDI2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MTc4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkciIHUyPSImI3gyMDFhOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJHIiB1Mj0iJiN4MjAxZTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iSCIgdTI9Ii8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0idiIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJIIiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJJIiB1Mj0iLyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSJ2IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkkiIHUyPSJ5IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3gyYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSIuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iQSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iSiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSiIgdTI9InYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iSiIgdTI9InkiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGM0OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzU7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjNjsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMjY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4YzA7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMzsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeDIwMWE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJKIiB1Mj0iJiN4MjAxZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkoiIHUyPSImI3hjMjsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iSiIgdTI9IiYjeGMxOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZjA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE2MDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkZDsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE3ZDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImYW1wOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSItIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IkAiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iQyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJHIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9Ik8iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iUSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJTIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVCIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJVIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iViIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iVyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IlgiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWSIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iWiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iYyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJkIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iZiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9ImciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSJvIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9InYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0ieSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkNjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZTc7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGFlOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hhOTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDNjMDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZTY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ1OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3gxNTI7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeDE1MzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MjAxMzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MjAxNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4MTc4OyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iSyIgdTI9IiYjeGQ0OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IksiIHUyPSImI3hkMjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZGI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJLIiB1Mj0iJiN4ZDk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZGQ7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IkAiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iQyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJHIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Ik8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iUSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJUIiBrPSI5NiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlUiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iViIgaz0iNzIiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJXIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IlkiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iXCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJhIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9ImMiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iZCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJlIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9Im8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0icSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJ2IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSJ5IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM0OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzU7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZGM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGU3OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hhZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YTk7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIxMjI7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGM2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDNjMDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZTY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGMwOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzM7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4MTUyOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3gxNTM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMWM7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMWQ7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMTg7IiBrPSI4MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDIwMTk7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeDE3ODsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4YzI7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hjMTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGQzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTCIgdTI9IiYjeGRhOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IkwiIHUyPSImI3hkYjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJMIiB1Mj0iJiN4ZDk7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iTSIgdTI9Ii8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0idiIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJNIiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJOIiB1Mj0iLyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ik4iIHUyPSJ2IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9Ik4iIHUyPSJ5IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3hkZDsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iJiN4MTdkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iLiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSIvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iSiIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJUIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlYiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iVyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJYIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IlkiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iWiIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9ImgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJPIiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMjY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDFjOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gyMDE4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Ik8iIHUyPSImI3gxNzg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMWE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDIwMWU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iTyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hkZDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gxN2Q7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiZhbXA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDJjOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSIuIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IkEiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iSiIgaz0iNjgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJWIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IlciIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWCIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJZIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iWiIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJhIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iYyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9ImQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJlIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iZiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idiIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0idyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSJ4IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9InkiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGM0OyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjNTsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4ZTc7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzY7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDIwMjY7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeGMwOyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMzsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUCIgdTI9IiYjeDE3ODsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyMDFhOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3gyMDFlOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlAiIHUyPSImI3hjMjsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJQIiB1Mj0iJiN4YzE7IiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeGRkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSImI3gxN2Q7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDJjOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSIuIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Ii8iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJKIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iViIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJXIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IlgiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iWSIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJaIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJiIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iaCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9ImsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJsIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IngiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlEiIHUyPSJ6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAyNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMWM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDIwMTg7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iUSIgdTI9IiYjeDE3ODsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxYTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MjAxZTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJRIiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGRkOyIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJmFtcDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iQSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iSiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJWIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSJYIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IlkiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9InYiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iUiIgdTI9InciIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0ieSIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzQ7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjNTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGM2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzA7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlIiIHUyPSImI3hjMzsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeDE3ODsiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iUiIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJSIiB1Mj0iJiN4YzE7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hkZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJBIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSJXIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IlgiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iWSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGM0OyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjNTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4YzY7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMzsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJTIiB1Mj0iJiN4MTc4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iUyIgdTI9IiYjeGMyOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlMiIHUyPSImI3hjMTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTYxOyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkZDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE3ZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImYW1wOyIgaz0iNTAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gyYzsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iLSIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSIuIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IjoiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJAIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkEiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iQyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IkciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJKIiBrPSI2OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Ik8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJRIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iVCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJWIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJYIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IlkiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IloiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJcIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImEiIGs9Ijc2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iYyIgaz0iNzYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJkIiBrPSI3NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImUiIGs9Ijc2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9ImciIGs9Ijc2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ibSIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJuIiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9Im8iIGs9Ijc2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icCIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJxIiBrPSI3NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InIiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0icyIgaz0iODAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ0IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9InUiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0idiIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ3IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IngiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0ieSIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSJ6IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGM0OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjNTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTc7IiBrPSI3NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGFlOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhOTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGQ4OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDNjMDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZTY7IiBrPSI3NiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGJmOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hhYjsiIGs9Ijg4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YmI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDIwMjY7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMwOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hjMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4ZDU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTUyOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeDE1MzsiIGs9Ijc2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxMzsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxNDsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MTc4OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAzOTsiIGs9Ijg4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAzYTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxYTsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4MjAxZTsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJUIiB1Mj0iJiN4YzI7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iVCIgdTI9IiYjeGMxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3hkMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlQiIHUyPSImI3gxMzE7IiBrPSI2NCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeDJjOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9Ii4iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSJBIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSJKIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0idiIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzQ7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjNTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGM2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAyNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3hjMDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGMzOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4MjAxYTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlUiIHUyPSImI3gyMDFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVSIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJVIiB1Mj0iJiN4YzE7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNjA7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNjE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGRkOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJmFtcDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iKSIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MmM7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Ii0iIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iLiIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSI6IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iQSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJKIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlMiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlQiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IlciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJYIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJZIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJdIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJhIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJjIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImQiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iZyIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iViIgdTI9ImwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJtIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iViIgdTI9Im4iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ibyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJwIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InEiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iciIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJzIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iViIgdTI9InQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ1IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iViIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ieCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0ifSIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGM1OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hlNzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGU2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hhYjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YmI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDIwMjY7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeGMwOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4MTUzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDEzOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDE0OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gxNzg7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDM5OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDNhOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDFhOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3gyMDFlOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlYiIHUyPSImI3hjMjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJWIiB1Mj0iJiN4YzE7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iViIgdTI9IiYjeDEzMTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTYwOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTYxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImYW1wOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSIpIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDJjOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSItIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Ii4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iOiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkAiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iQSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJDIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IkciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iSiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJPIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iUyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iViIgaz0iNCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IlgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJdIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImEiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImMiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZCIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJlIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImYiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iZyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iaSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJqIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9ImsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJsIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ibSIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJuIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9Im8iIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icCIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJxIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InIiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0icyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ0IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9InUiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0idiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ3IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IngiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0ieSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSJ6IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9In0iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGM1OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkNjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZTc7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGFlOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hhOTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQ4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gzYzA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGU2OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hhYjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YmI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGMwOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDE1MjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4MTUzOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDEzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDE0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDM5OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDNhOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDFhOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3gyMDFlOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hjMjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4YzE7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeGQzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlciIHUyPSImI3hkNDsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJXIiB1Mj0iJiN4ZDI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iVyIgdTI9IiYjeDEzMTsiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTYwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkZDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiZhbXA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IikiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ii0iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iQSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iQyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJHIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Ik8iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iUSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJTIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlQiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iViIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iVyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IlgiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iWSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iXSIgaz0iLTMyIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iYSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImMiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJkIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iZSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJtIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ibiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9Im8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJwIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9InkiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0ifSIgaz0iLTMyIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzQ7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjNTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ2OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hlNzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjNjsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQ4OyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hlNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hjMDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMzOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDU7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE1MjsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDIwMTQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeDE3ODsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4YzE7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3hkMzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJYIiB1Mj0iJiN4ZDQ7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iWCIgdTI9IiYjeGQyOyIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IlgiIHUyPSImI3gxMzE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTYwOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTYxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImYW1wOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSIpIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iLSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IjoiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJAIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iQyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IkciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJKIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Ik8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJRIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iUyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iVCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iViIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iWCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iXSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iYSIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJjIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9ImQiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZSIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iZyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJtIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9Im4iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ibyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJwIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InEiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iciIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJzIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0idSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ2IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ4IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9InkiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0ieiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSJ9IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjNDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzU7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGQ2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGU3OyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhZTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YTk7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGM2OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkODsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gzYzA7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGU2OyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hhYjsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YmI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMwOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hjMzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4ZDU7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MTUyOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeDE1MzsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzOTsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAzYTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJZIiB1Mj0iJiN4YzI7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iWSIgdTI9IiYjeGMxOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkNDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3hkMjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IlkiIHUyPSImI3gxMzE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGYwOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSItIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJDIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IkciIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iSiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Ik8iIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iUSIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJUIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iYSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJiIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iYyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJkIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImUiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iZiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJnIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJpIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImoiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9ImwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJtIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9Im4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0ibyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJwIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InEiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iciIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSJ1IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InYiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDY7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGU3OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hjNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkODsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZTY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGMzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ1OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3gxNTI7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeDE1MzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4YzE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4ZDM7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iWiIgdTI9IiYjeGQ0OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IloiIHUyPSImI3hkMjsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSJaIiB1Mj0iJiN4MTMxOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IlsiIHUyPSImI3hkZDsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlYiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IlciIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iWCIgaz0iLTMyIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iWSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iZyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJbIiB1Mj0iaiIgaz0iLTEyMCIgLz4KKzxoa2VybiB1MT0iWyIgdTI9IiYjeDE3ODsiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IiYjeGRkOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJUIiBrPSI3MiIgLz4KKzxoa2VybiB1MT0iXCIgdTI9IlYiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iVyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJZIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSJqIiBrPSItMTA0IiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0ibyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iXCIgdTI9InEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3hlNzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3hlNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IlwiIHUyPSImI3gxNTM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJcIiB1Mj0iJiN4MTc4OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSI/IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9InQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImEiIHUyPSJ2IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJhIiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIxMjI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMWM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iYSIgdTI9IiYjeDIwMTg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDE2MTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iJiN4MmM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9Ii4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iLyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJcIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0icyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0idiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJiIiB1Mj0ieSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9ImIiIHUyPSJ6IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIxMjI7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMTg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iYiIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iZCIgdTI9InYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJkIiB1Mj0ieSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJlIiB1Mj0ieCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9ImUiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZjA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiZhbXA7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IikiIGs9Ii01NiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IioiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDJjOyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSItIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ii4iIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iLyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSI6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Ij8iIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IlwiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Il0iIGs9Ii01NiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9Im8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0idiIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0ifSIgaz0iLTU2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4ZTc7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjEyMjsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeGFiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3hiYjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAyNjsiIGs9IjY0IiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMWM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFkOyIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSJmIiB1Mj0iJiN4MjAxODsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iZiIgdTI9IiYjeDIwMTk7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDM5OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDNhOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFhOyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gyMDFlOyIgaz0iNjQiIC8+Cis8aGtlcm4gdTE9ImYiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iKSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iLyIgaz0iLTMyIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iXSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iZyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSJqIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSJ0IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iZyIgdTI9In0iIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMWM7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9ImciIHUyPSImI3gyMDFkOyIgaz0iLTMyIiAvPgorPGhrZXJuIHUxPSJnIiB1Mj0iJiN4MjAxODsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iZyIgdTI9IiYjeDIwMTk7IiBrPSItMzIiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSI/IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9InQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImgiIHUyPSJ2IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJoIiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIxMjI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIwMWM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iaCIgdTI9IiYjeDIwMTg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iaiIgdTI9ImoiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iaiIgdTI9InYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iaiIgdTI9InkiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iayIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJnIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iayIgdTI9Im8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJxIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJrIiB1Mj0idiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9ImsiIHUyPSJ5IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeGU3OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iayIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9ImwiIHUyPSJ2IiBrPSItOCIgLz4KKzxoa2VybiB1MT0ibCIgdTI9InkiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0iPyIgaz0iOCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9IlwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJtIiB1Mj0idiIgaz0iNCIgLz4KKzxoa2VybiB1MT0ibSIgdTI9InkiIGs9IjQiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMTIyOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDFjOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9Im0iIHUyPSImI3gyMDE4OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSI/IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9InQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Im4iIHUyPSJ2IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJuIiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIxMjI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMWM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0ibiIgdTI9IiYjeDIwMTg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDE2MTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iJiN4MmM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9Ii4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iLyIgaz0iOCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJcIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0icyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0idiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJvIiB1Mj0ieSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9Im8iIHUyPSJ6IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIxMjI7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMTg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ibyIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDE2MTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iJiN4MmM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0icCIgdTI9Ii4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iLyIgaz0iOCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJcIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0icyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0idiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJwIiB1Mj0ieSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9InAiIHUyPSJ6IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIxMjI7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMTg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0icCIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0icSIgdTI9ImoiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSItIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iciIgdTI9Ii4iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iLyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSI/IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJmIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJnIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0idCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0idiIgaz0iLTMyIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0idyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0ieCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSJ5IiBrPSItMzIiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDI2OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDEzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE0OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDFjOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZDsiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0iciIgdTI9IiYjeDIwMTg7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9InIiIHUyPSImI3gyMDE5OyIgaz0iLTMyIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJyIiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MmM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0idCIgdTI9Ii4iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0idCIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0idCIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0idiIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0ieCIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSJ5IiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gyMDI2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InQiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxYzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxODsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxYTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ0IiB1Mj0iJiN4MjAxZTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ1IiB1Mj0idiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InUiIHUyPSJ5IiBrPSItOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDJjOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSItIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iLiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJhIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iYyIgaz0iOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9ImQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJlIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0ibyIgaz0iOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9InEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ2IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSJ3IiBrPSItOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9InkiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU3OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDEzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMTQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxYzsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWQ7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9InYiIHUyPSImI3gyMDE4OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJ2IiB1Mj0iJiN4MjAxOTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWE7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0idiIgdTI9IiYjeDIwMWU7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDJjOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9InciIHUyPSIuIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0idyIgdTI9InYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0ieSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDI2OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDFjOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxZDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0idyIgdTI9IiYjeDIwMTg7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9InciIHUyPSImI3gyMDE5OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxYTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJ3IiB1Mj0iJiN4MjAxZTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iLSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJhIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ieCIgdTI9ImMiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iZCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJlIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ieCIgdTI9Im8iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0icSIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJ2IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSJ5IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3hlNzsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4ZTY7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeGFiOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gxNTM7IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMTQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0ieCIgdTI9IiYjeDIwMWQ7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDE4OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IngiIHUyPSImI3gyMDE5OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSJ4IiB1Mj0iJiN4MjAzOTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MmM7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9Ii0iIGs9IjgiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSJvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InYiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9InciIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0ieSIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4ZTc7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4ZTY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAyNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxNDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDFjOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZDsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0ieSIgdTI9IiYjeDIwMTg7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9InkiIHUyPSImI3gyMDE5OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJ5IiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iLSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJhIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImMiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iZCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJlIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9ImciIGs9IjgiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJtIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9Im4iIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0ibyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJwIiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iciIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSJ1IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9InYiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0ieSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3hlNzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSJ6IiB1Mj0iJiN4ZTY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeGFiOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9InoiIHUyPSImI3gxNTM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTM7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMTQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDIwMzk7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0ieiIgdTI9IiYjeDEzMTsiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSJ7IiB1Mj0iJiN4ZGQ7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJWIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSJXIiBrPSItOCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IlgiIGs9Ii0zMiIgLz4KKzxoa2VybiB1MT0ieyIgdTI9IlkiIGs9Ii00MCIgLz4KKzxoa2VybiB1MT0ieyIgdTI9ImciIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0ieyIgdTI9ImoiIGs9Ii0xMjAiIC8+Cis8aGtlcm4gdTE9InsiIHUyPSImI3gxNzg7IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDE2MDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkZDsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSIqIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MmM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ii0iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSIuIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iRyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IkoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9Ik8iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iUyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlQiIGs9IjcyIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJWIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iVyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IlkiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ0IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ieCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSJ5IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0ieiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGM1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YWU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hhOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIxMjI7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4YzY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4M2MwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDI2OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hjMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3hkNTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gxNTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDE0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWM7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MjAxZDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjNDsiIHUyPSImI3gyMDE4OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMTk7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzQ7IiB1Mj0iJiN4MTc4OyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWE7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDIwMWU7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQ0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM0OyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDE2MDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkZDsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSIqIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MmM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Ii0iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSIuIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iRyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IkoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9Ik8iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iUyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlQiIGs9IjcyIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJWIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iVyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IlkiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ0IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSJ5IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0ieiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGM1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YWU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hhOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIxMjI7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4YzY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4M2MwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDI2OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hjMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3hkNTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gxNTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDE0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWM7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MjAxZDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjNTsiIHUyPSImI3gyMDE4OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMTk7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzU7IiB1Mj0iJiN4MTc4OyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWE7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDIwMWU7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQ0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGM1OyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IkAiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJUIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJnIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9InYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjOTsiIHUyPSJ5IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4YTk7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Yzk7IiB1Mj0iJiN4M2MwOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM5OyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hkMTsiIHUyPSIvIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDE7IiB1Mj0idiIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkMTsiIHUyPSJ5IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeGRkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDE3ZDsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSIuIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iLyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJKIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iVCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlYiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJXIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iWCIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IlkiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSJaIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iaCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ieCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMjY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MjAxYzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDE4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDE3ODsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkNjsiIHUyPSImI3gyMDFhOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ2OyIgdTI9IiYjeDIwMWU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDY7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MmM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSIuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSJBIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IkoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9InYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjNDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzU7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGM2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDI2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4YzA7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGMzOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3gyMDFhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGM7IiB1Mj0iJiN4MjAxZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRjOyIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYzsiIHUyPSImI3hjMTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iPyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0idiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTE7IiB1Mj0iJiN4MjEyMjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hlMTsiIHUyPSImI3gyMDFjOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGUxOyIgdTI9IiYjeDIwMTg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iPyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0idiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTA7IiB1Mj0iJiN4MjEyMjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hlMDsiIHUyPSImI3gyMDFjOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGUwOyIgdTI9IiYjeDIwMTg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iPyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0idiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTI7IiB1Mj0iJiN4MjEyMjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hlMjsiIHUyPSImI3gyMDFjOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGUyOyIgdTI9IiYjeDIwMTg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iPyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0idiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0ieSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTQ7IiB1Mj0iJiN4MjEyMjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hlNDsiIHUyPSImI3gyMDFjOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGU0OyIgdTI9IiYjeDIwMTg7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZTk7IiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZTk7IiB1Mj0ieCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGU5OyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU4OyIgdTI9IngiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hlODsiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ2IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hlYTsiIHUyPSJ4IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZWE7IiB1Mj0ieSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZWI7IiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZWI7IiB1Mj0ieCIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGViOyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9Ij8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IlwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9InQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9InYiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9InkiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGYxOyIgdTI9IiYjeDIxMjI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjE7IiB1Mj0iJiN4MjAxYzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hmMTsiIHUyPSImI3gyMDE4OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDE2MTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyYzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSIuIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iLyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iOiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IlwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSJ2IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0ieSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9InoiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMTIyOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hmMzsiIHUyPSImI3gyMDE4OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGYzOyIgdTI9IiYjeDIwMWE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjM7IiB1Mj0iJiN4MjAxZTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gxNjE7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MmM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iLiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ii8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJcIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJzIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0idiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IngiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9InkiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSJ6IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjEyMjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDI2OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZjQ7IiB1Mj0iJiN4MjAxODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hmNDsiIHUyPSImI3gyMDFhOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY0OyIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MTYxOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDJjOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9Ii4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSIvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSI6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSI/IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iXCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0icyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9InYiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ4IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSJ5IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0ieiIgaz0iMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIxMjI7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAyNjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFjOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGY2OyIgdTI9IiYjeDIwMTg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZjY7IiB1Mj0iJiN4MjAxYTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmNjsiIHUyPSImI3gyMDFlOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDE2MTsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyYzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSIuIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iLyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iOiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IlwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ0IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSJ2IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0ieSIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9InoiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMTIyOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMjY7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hmNTsiIHUyPSImI3gyMDE4OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGY1OyIgdTI9IiYjeDIwMWE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZjU7IiB1Mj0iJiN4MjAxZTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hiMDsiIHUyPSI0IiBrPSI1MiIgLz4KKzxoa2VybiB1MT0iJiN4YTM7IiB1Mj0iMSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGEzOyIgdTI9IjQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gxNjE7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MmM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iLiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9Ii8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJcIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJnIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJzIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0idiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IngiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9InkiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSJ6IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjEyMjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDI2OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMWM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZGY7IiB1Mj0iJiN4MjAxODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkZjsiIHUyPSImI3gyMDFhOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRmOyIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4ZGQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iQSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iVCIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSJZIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjNTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGM2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWU7IiB1Mj0iJiN4YzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeDE3ODsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hhZTsiIHUyPSImI3hjMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFlOyIgdTI9IiYjeGMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4ZGQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iQSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iVCIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSJZIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjNTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGM2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YTk7IiB1Mj0iJiN4YzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeDE3ODsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hhOTsiIHUyPSImI3hjMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGE5OyIgdTI9IiYjeGMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iQCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9IlQiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9ImciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0idiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM2OyIgdTI9InkiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hhZTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3hhOTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjNjsiIHUyPSImI3gzYzA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4YzY7IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeGRkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE3ZDsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSIuIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iLyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJKIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iVCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlYiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJXIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iWCIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IlkiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSJaIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iaCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ieCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMjY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MjAxYzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDE4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDE3ODsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkODsiIHUyPSImI3gyMDFhOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ4OyIgdTI9IiYjeDIwMWU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDg7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IiYjeGRkOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJBIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iVCIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSJXIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4M2MwOyIgdTI9IlkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzQ7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4YzM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gzYzA7IiB1Mj0iJiN4MTc4OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDNjMDsiIHUyPSImI3hjMTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGU2OyIgdTI9IngiIGs9IjEyIiAvPgorPGhrZXJuIHUxPSImI3hlNjsiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gxNjE7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MmM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iLiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ii8iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IjoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJcIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJzIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0idCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0idiIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IngiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9InkiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSJ6IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjEyMjsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDI2OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4Zjg7IiB1Mj0iJiN4MjAxODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hmODsiIHUyPSImI3gyMDFhOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGY4OyIgdTI9IiYjeDIwMWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4ZGQ7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iMSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IjMiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSI3IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iQyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IkciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJPIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iUSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlQiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJWIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iVyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IlkiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSJ2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0idyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IngiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkODsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3hkNTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hiZjsiIHUyPSImI3gxNTI7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YmY7IiB1Mj0iJiN4MTc4OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQ0OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGJmOyIgdTI9IiYjeGQyOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE5MjsiIHUyPSIxIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IiYjeGRkOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlQiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSJWIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YWI7IiB1Mj0iVyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGFiOyIgdTI9IlkiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hhYjsiIHUyPSImI3gxNzg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iVCIgaz0iODgiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IlYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJXIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iWSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGJiOyIgdTI9IngiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hiYjsiIHUyPSJ6IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YmI7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIwIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSIxIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI4IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSI5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IkEiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJHIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJPIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJUIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSJVIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IlYiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9ImEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9ImMiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9ImQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9ImUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9Im0iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9Im4iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9Im8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InAiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InIiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InQiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InYiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0ieSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzQ7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzU7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZTc7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjNjsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGU2OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzA7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4YzM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNTM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxNzg7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMjsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hjMTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkMzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZDI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3hkYTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMjY7IiB1Mj0iJiN4ZGI7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDI2OyIgdTI9IiYjeGQ5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAyNjsiIHUyPSImI3gxMzE7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MTYwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGRkOyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IioiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyYzsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iLSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Ii4iIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iQCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iQSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IkMiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJHIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iSiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iTyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlEiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJTIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iVCIgaz0iNzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IlYiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJXIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iWSIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InYiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ4IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSJ6IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzU7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hhZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjEyMjsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hjNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hkODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gzYzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMjY7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGMwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGMzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeGQ1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDE1MjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDEzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMTQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxYzsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gyMDFkOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMwOyIgdTI9IiYjeDIwMTg7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxOTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjMDsiIHUyPSImI3gxNzg7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4YzE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDQ7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4ZDI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzA7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MTYwOyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGRkOyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IioiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyYzsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iLSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9Ii4iIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iQCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iQSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IkMiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJHIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iSiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iTyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlEiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJTIiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iVCIgaz0iNzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IlYiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJXIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iWSIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InYiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ4IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSJ6IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzU7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hhZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGE5OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjEyMjsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hjNjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hkODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gzYzA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMjY7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGMzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeGQ1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDE1MjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDEzOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMTQ7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxYzsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gyMDFkOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMzOyIgdTI9IiYjeDIwMTg7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxOTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjMzsiIHUyPSImI3gxNzg7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxYTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MjAxZTsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4YzE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDQ7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4ZDI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzM7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4ZGQ7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MTdkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDJjOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9Ii4iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSIvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IkoiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJUIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iViIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IlciIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJYIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iWSIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IloiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJiIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJsIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSJ6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAyNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gyMDFjOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMTg7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MTc4OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ1OyIgdTI9IiYjeDIwMWE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDU7IiB1Mj0iJiN4MjAxZTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkNTsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iQCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJUIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJnIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9InYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0ieSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3gxNTI7IiB1Mj0iJiN4YWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGE5OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gzYzA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTUyOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MjsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE1MzsiIHUyPSJ4IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MTUzOyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3gxN2Q7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IjEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IjciIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IkEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlQiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlYiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlciIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlgiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IloiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iYSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJjIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9ImQiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iZSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJvIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ4IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSJ5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9InoiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzU7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hlNzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hlNjsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzA7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDEzOyIgdTI9IiYjeDE1MzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTM7IiB1Mj0iJiN4YzI7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxMzsiIHUyPSImI3hjMTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGRkOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4MTdkOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSIxIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSI3IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJBIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJUIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJWIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJXIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJYIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJZIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJaIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9ImEiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iYyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJkIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9ImUiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ibyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJxIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9InYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ieCIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0ieSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSJ6IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3hjNDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGM1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4ZTc7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGM2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4ZTY7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMwOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxNDsiIHUyPSImI3gxNTM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeDE3ODsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE0OyIgdTI9IiYjeGMyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTQ7IiB1Mj0iJiN4YzE7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxNjE7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hkZDsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJBIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJKIiBrPSI4OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJUIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJWIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iVyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IlgiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJZIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iYyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZCIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iZyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0ibSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9Im8iIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9InAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0icSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iciIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJzIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSJ1IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGM0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hlNzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGM2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4ZTY7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3hjMDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGMzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTUzOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4MTc4OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFjOyIgdTI9IiYjeGMyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWM7IiB1Mj0iJiN4YzE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYzsiIHUyPSImI3gxMzE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeDE2MDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iQyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iRyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iSiIgaz0iOTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iTyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iUSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iUyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJhIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJjIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJkIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJlIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSJxIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGU3OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hlNjsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQ1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTUyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4MTUzOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWQ7IiB1Mj0iJiN4ZDM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZDsiIHUyPSImI3hkNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFkOyIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTYxOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4ZGQ7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iQSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iSiIgaz0iODgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iVCIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iViIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IlciIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJYIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iWSIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImMiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImQiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImUiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9ImciIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9Im0iIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0ibiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJvIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSJwIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9InIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0icyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0idSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGM1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4ZTc7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGU2OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4YzA7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDE1MzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeDE3ODsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxODsiIHUyPSImI3hjMjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE4OyIgdTI9IiYjeGMxOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTg7IiB1Mj0iJiN4MTMxOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3gxNjA7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkMiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkciIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IkoiIGs9Ijk2IiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9Ik8iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlEiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IlMiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iYyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iZSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0ibyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0icSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hlNzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQ4OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZTY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkNTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeDE1MzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDE5OyIgdTI9IiYjeGQzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMTk7IiB1Mj0iJiN4ZDQ7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxOTsiIHUyPSImI3hkMjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYwOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTYxOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImYW1wOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSIpIiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gyYzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iLSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSIuIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IjoiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJAIiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkEiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iQyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IkciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJKIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Ik8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJRIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iUyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iVCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iViIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iWCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iXSIgaz0iLTQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iYSIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJjIiBrPSI0NCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9ImQiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZSIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iZyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJtIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9Im4iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ibyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJwIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InEiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iciIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJzIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0idSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ2IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ4IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9InkiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0ieiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSJ9IiBrPSItNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjNDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzU7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGQ2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGU3OyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhZTsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YTk7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGM2OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkODsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gzYzA7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGU2OyIgaz0iNDQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hhYjsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YmI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDIwMjY7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMwOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hjMzsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4ZDU7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MTUyOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeDE1MzsiIGs9IjQ0IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxMzsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxNDsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzOTsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAzYTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxYTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4MjAxZTsiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gxNzg7IiB1Mj0iJiN4YzI7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MTc4OyIgdTI9IiYjeGMxOyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkMzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkNDsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3hkMjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeDE3ODsiIHUyPSImI3gxMzE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAzOTsiIHUyPSImI3hkZDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlQiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IlkiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDM5OyIgdTI9IiYjeDE3ODsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDNhOyIgdTI9IiYjeGRkOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iVCIgaz0iODgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iViIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iVyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iWSIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0ieCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0ieiIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwM2E7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIwIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSIxIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI4IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSI5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IkEiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJHIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJPIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJUIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJVIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlYiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImMiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9ImoiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJtIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJuIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJvIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJwIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJxIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJyIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ0IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ1IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM0OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGM1OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGU3OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzY7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hlNjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMwOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGMzOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQ1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4MTUyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4MTUzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzI7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4YzE7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZDM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4ZGE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFhOyIgdTI9IiYjeGRiOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxYTsiIHUyPSImI3hkOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWE7IiB1Mj0iJiN4MTMxOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGQ7IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSIwIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSIxIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSI0IiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSI2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSI4IiBrPSIxMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSI5IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IkEiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJHIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJPIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJUIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJVIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlYiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlciIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IlkiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImMiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImQiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImUiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9ImoiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJtIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJuIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJvIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJwIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJxIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJyIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ0IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ1IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSJ3IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9InkiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM0OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGM1OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGU3OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzY7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hlNjsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMwOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGMzOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQ1OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTUyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTUzOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzI7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4YzE7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZDM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4ZGE7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3gyMDFlOyIgdTI9IiYjeGRiOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4MjAxZTsiIHUyPSImI3hkOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeDIwMWU7IiB1Mj0iJiN4MTMxOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDE2MDsiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkZDsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSIqIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MmM7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ii0iIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSIuIiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkAiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkEiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJDIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iRyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IkoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9Ik8iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJRIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iUyIgaz0iLTQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlQiIGs9IjcyIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJWIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iVyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IlkiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ0IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ2IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0idyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ieCIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSJ5IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0ieiIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGM0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGM1OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YWU7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hhOTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIxMjI7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4YzY7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZDg7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4M2MwOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDI2OyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hjMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3hkNTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gxNTI7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxMzsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDE0OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWM7IiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MjAxZDsiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hjMjsiIHUyPSImI3gyMDE4OyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMTk7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzI7IiB1Mj0iJiN4MTc4OyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWE7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDIwMWU7IiBrPSItMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQzOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQ0OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeGQyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMyOyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IkAiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJUIiBrPSItMTIiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJjIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iZCIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9ImUiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJmIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJnIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJvIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0icSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9InYiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjYTsiIHUyPSJ5IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4ZTc7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4YWU7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4YTk7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2E7IiB1Mj0iJiN4M2MwOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeGU2OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNhOyIgdTI9IiYjeDE1MzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxNjA7IiBrPSItNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZGQ7IiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iKiIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDJjOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSItIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iLiIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJAIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJBIiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iQyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IkciIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJKIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJPIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iUSIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlMiIGs9Ii00IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJUIiBrPSI3MiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iViIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IlciIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSJZIiBrPSI1NiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0idCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0idiIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InciIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IngiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0ieSIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9InoiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjNTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGFlOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YTk7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMTIyOyIgaz0iNTYiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGM2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGQ4OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDNjMDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAyNjsiIGs9Ii0yNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzA7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4YzM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4ZDU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MTUyOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMTM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxNDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFjOyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDIwMWQ7IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YzE7IiB1Mj0iJiN4MjAxODsiIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDE5OyIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGMxOyIgdTI9IiYjeDE3ODsiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFhOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gyMDFlOyIgaz0iLTI0IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjMjsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hjMTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkNDsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3hkMjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hjMTsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJAIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iVCIgaz0iLTEyIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJhIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iYyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9ImQiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJlIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iZiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0iZyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0ibyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9InEiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSJ2IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2I7IiB1Mj0ieSIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGU3OyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGFlOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeGE5OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNiOyIgdTI9IiYjeDNjMDsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3hlNjsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjYjsiIHUyPSImI3gxNTM7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iQCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9IlQiIGs9Ii0xMiIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iYSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImMiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJkIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iZSIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImYiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9ImciIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9Im8iIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSJxIiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0idiIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGM4OyIgdTI9InkiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hlNzsiIGs9IjIwIiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hhZTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3hhOTsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjODsiIHUyPSImI3gzYzA7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4ZTY7IiBrPSIyMCIgLz4KKzxoa2VybiB1MT0iJiN4Yzg7IiB1Mj0iJiN4MTUzOyIgaz0iMjAiIC8+Cis8aGtlcm4gdTE9IiYjeGNkOyIgdTI9Ii8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjZDsiIHUyPSJ2IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNkOyIgdTI9InkiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0iLyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNlOyIgdTI9InYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2U7IiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSIvIiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4Y2Y7IiB1Mj0idiIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hjZjsiIHUyPSJ5IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNjOyIgdTI9Ii8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hjYzsiIHUyPSJ2IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGNjOyIgdTI9InkiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4ZGQ7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTdkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDJjOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9Ii4iIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSIvIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iPyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IkoiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJUIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iViIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IlciIGs9IjQ4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJYIiBrPSIyOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iWSIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IloiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJhIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJiIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJjIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJkIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJlIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJoIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJrIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJsIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJtIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJuIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJvIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJwIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJxIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJyIiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ1IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ4IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSJ6IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3hlNzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeGU2OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAyNjsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gxNTM7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gyMDFjOyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMTg7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MTc4OyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQzOyIgdTI9IiYjeDIwMWE7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDM7IiB1Mj0iJiN4MjAxZTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMzsiIHUyPSImI3gxMzE7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3hkZDsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gxN2Q7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MmM7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iLiIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Ii8iIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSI/IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iSiIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlQiIGs9IjQwIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJWIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iVyIgaz0iNDgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IlgiIGs9IjI4IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSJZIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iWiIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImIiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImMiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImQiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImgiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9ImwiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im0iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im4iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9Im8iIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InAiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InEiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InIiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InUiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IngiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9InoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeGU3OyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4ZTY7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDI2OyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDE1MzsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDIwMWM7IiBrPSIxNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAxODsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gxNzg7IiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDQ7IiB1Mj0iJiN4MjAxYTsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkNDsiIHUyPSImI3gyMDFlOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQ0OyIgdTI9IiYjeDEzMTsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeGRkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDE3ZDsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSIuIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iLyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJKIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iVCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlYiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJXIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iWCIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IlkiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSJaIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iaCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ieCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMjY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MjAxYzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDE4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDE3ODsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMjsiIHUyPSImI3gyMDFhOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQyOyIgdTI9IiYjeDIwMWU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDI7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MmM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSIuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSJBIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IkoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9InYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjNDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzU7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGM2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyMDI2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4YzA7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGMzOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3gyMDFhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGE7IiB1Mj0iJiN4MjAxZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRhOyIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYTsiIHUyPSImI3hjMTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4MmM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSIuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSJBIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IkoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9InYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3hjNDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4YzU7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGM2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyMDI2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4YzA7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMzOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3gyMDFhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZGI7IiB1Mj0iJiN4MjAxZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGRiOyIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkYjsiIHUyPSImI3hjMTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4MmM7IiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSIuIiBrPSI4IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSJBIiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IkoiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9InYiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0ieSIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3hjNDsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzU7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGM2OyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyMDI2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4YzA7IiBrPSItMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMzOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3gyMDFhOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDk7IiB1Mj0iJiN4MjAxZTsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQ5OyIgdTI9IiYjeGMyOyIgaz0iLTE2IiAvPgorPGhrZXJuIHUxPSImI3hkOTsiIHUyPSImI3hjMTsiIGs9Ii0xNiIgLz4KKzxoa2VybiB1MT0iJiN4YTQ7IiB1Mj0iNCIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGRkOyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeDE3ZDsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IjEiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSI3IiBrPSIyNCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iQSIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlQiIGs9IjU2IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJWIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iVyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IlgiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSJZIiBrPSI0MCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iWiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iYSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iYyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iZCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iZSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0ibyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0icSIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0idiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0ieCIgaz0iMjQiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InkiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9InoiIGs9IjI0IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjNDsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hjNTsiIGs9Ii04IiAvPgorPGhrZXJuIHUxPSImI3hhZDsiIHUyPSImI3hlNzsiIGs9IjgiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGM2OyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGU2OyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzA7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4YzM7IiBrPSItOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4MTUzOyIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4YWQ7IiB1Mj0iJiN4MTc4OyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGMyOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGFkOyIgdTI9IiYjeGMxOyIgaz0iLTgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeGRkOyIgaz0iMzYiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ZDsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyYzsiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSIuIiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iLyIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9Ij8iIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJKIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iVCIgaz0iNDAiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlYiIGs9IjMyIiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJXIiBrPSI0OCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iWCIgaz0iMjgiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IlkiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSJaIiBrPSIzNiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iYSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iYiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iYyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iZCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iZSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iaCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iayIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibiIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ibyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0icCIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0icSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iciIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0idSIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieCIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0ieiIgaz0iOCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4ZTc7IiBrPSI0IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3hlNjsiIGs9IjQiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMjY7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTUzOyIgaz0iNCIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MjAxYzsiIGs9IjE2IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDE4OyIgaz0iMTYiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDE3ODsiIGs9IjM2IiAvPgorPGhrZXJuIHUxPSImI3hkMDsiIHUyPSImI3gyMDFhOyIgaz0iMzIiIC8+Cis8aGtlcm4gdTE9IiYjeGQwOyIgdTI9IiYjeDIwMWU7IiBrPSIzMiIgLz4KKzxoa2VybiB1MT0iJiN4ZDA7IiB1Mj0iJiN4MTMxOyIgaz0iNCIgLz4KKworPC9mb250PgorPC9kZWZzPgorPHRleHQgeD0iNDAiIHk9IjQwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQcOBw4DDgsOEw4XDg8OGIEPDhyBEw5AgRcOJw4jDisOLIEkgw40gw4wgw44gw48gTsORPC90ZXh0PgorPHRleHQgeD0iNDAiIHk9IjgwIiBmb250LWZhbWlseT0iT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljIiBmb250LXNpemU9IjMwIiBmaWxsPSIjOTMzIiA+T8OTw5LDlMOWw5XDmMWSIFPFoCBVw5rDmcObw5wgWcOdxbggWsW9IMOeIGHDocOgw6LDpMOlw6PDpiBjw6cgZMOwIGXDqcOow6rDqyBpIMSxIMOtIMOsIMOuIMOvIG7DsSBvw7PDssO0w7bDtcO4xZMgc8Whw58gdcO6w7nDu8O8IHnDvcO/IHrFvjwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxMjAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIE1lZGl1bSBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7DviAxMjM0NTY3ODkwIMK9IMK8IMK+ICUg4oCwICTCosKjwqXGkuKCrMKkIOKAoCDigKEgwqcgwrYgIyBefsK1ICvDl8KxICZsdDsgPSAmZ3Q7IMO3wqwgIcKhP8K/ICZxdW90OyAmYW1wOyAmYXBvczsgKiDCsCAuICwgOiA7ICgpIFsgXCBdIHt9IC8gfDwvdGV4dD4KKzx0ZXh0IHg9IjQwIiB5PSIxNjAiIGZvbnQtZmFtaWx5PSJPbW5lc19BVFQgVzAyIE1lZGl1bSBJdGFsaWMiIGZvbnQtc2l6ZT0iMzAiIGZpbGw9IiM5MzMiID7CpiBfIOKAmiDigJ4g4oCmIOKAueKAuiDCq8K7IOKAmCDigJkg4oCcIOKAnSDigKIgwq0gLSDigJMg4oCUIEAgwqkgwq4g4oSiIMKqwrogwrnCssKzIMK0IGAgy4Ygy5wgwqggwq8gwrcgwrg8L3RleHQ+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW1JdGFsaWMudHRmIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bUl0YWxpYy50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiZmQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW1JdGFsaWMudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW1JdGFsaWMud29mZiBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9PbW5lc19BVFRXMDJNZWRpdW1JdGFsaWMud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQxOWVkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL09tbmVzX0FUVFcwMk1lZGl1bUl0YWxpYy53b2ZmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9kZW1vLWFzeW5jLmh0bSBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9kZW1vLWFzeW5jLmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2E0M2U2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ZvbnRzL09tbmVzQVRUL2RlbW8tYXN5bmMuaHRtCkBAIC0wLDAgKzEsMTY5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKyAgICA8dGl0bGU+V2ViZm9udHMgRGVtbzwvdGl0bGU+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKwkgICAgYm9keSwgdGV4dGFyZWEgeyBmb250LWZhbWlseTpBcmlhbCwgU2Fucy1TZXJpZjsgbGluZS1oZWlnaHQ6MS42ZW07IGZvbnQtc2l6ZToxM3B4OyB9CisJICAgIGgxIHsgZm9udC1zaXplOjNlbTsgfQorCSAgICBoMiwgaDMgeyBjb2xvcjojOTk5OyB9CisJICAgIC5jb250ZW50IHsgd2lkdGg6NzgwcHg7IG1hcmdpbjogMjBweCBhdXRvIDQwcHg7IH0KKwkgICAgLmRlbW8geyBmb250LXdlaWdodDpib2xkOyBmb250LXN0eWxlOm5vcm1hbDsgY29sb3I6ICM5OTkgfQorCSAgICAuZm9udGRpc3BsYXkge2ZvbnQtc2l6ZToyZW07bGluZS1oZWlnaHQ6MTUwJTttYXJnaW46IDEwcHggNDBweCAwcHggMHB4O30KKwkgICAgLmd1aWRlbGluZXMgeyBjb2xvcjojMzMzOyB9CisJICAgIHByZSB7IHBhZGRpbmc6MCAwIDAgMjBweDsgfQorCSAgICBociB7IGJvcmRlcjowOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTM3MDk0OyBtYXJnaW46MjBweCAwOyB9CisJICAgIC5saW5rIHsgY29sb3I6ICM1MzcwOTQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7IGZvbnQtd2VpZ2h0OmJvbGQ7fQorCSAgICAudWMge3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIiOworc3JjOnVybCgiRm9udHMvMDJiMmFmNmQtYTRjMS00YzRiLThmMTEtYmFlZTQ0NTQ1MTQwLmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzAyYjJhZjZkLWE0YzEtNGM0Yi04ZjExLWJhZWU0NDU0NTE0MC5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzL2FmNDY0YzI5LTljZWEtNGI4ZC04MWNjLTAwY2QwOGZhYmZlNy53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy8yMDA1OGE0NS1mMDM4LTRkOWUtYmNlMC0xYzljY2M0MzJiYWQudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvMmM0ZDAwNjQtNTI4NS00ZDdmLTlkNzMtOWM1YjNkYWZmN2QwLnN2ZyMyYzRkMDA2NC01Mjg1LTRkN2YtOWQ3My05YzViM2RhZmY3ZDAiKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMiOworc3JjOnVybCgiRm9udHMvOWY3Y2M4Y2MtOWUxNC00ZjA5LTllNmMtNjIzMjQ1MWE2NGMwLmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzlmN2NjOGNjLTllMTQtNGYwOS05ZTZjLTYyMzI0NTFhNjRjMC5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzLzBkZjk4NGUwLTU2NWItNDE2YS1hYmRhLTIyMDY5YjllZjdiMS53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy83YTlkYTc4Yi03ZGU2LTQ0YjAtYTc0Yy0wYzYxMzg3NWRmOTIudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvZTdhNTY5NjYtMzc1Yi00NzAwLWI0N2YtNzRkZWYwZGIxNTJmLnN2ZyNlN2E1Njk2Ni0zNzViLTQ3MDAtYjQ3Zi03NGRlZjBkYjE1MmYiKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc19BVFQgVzAyIEl0YWxpYyI7CitzcmM6dXJsKCJGb250cy82YTVjMDJhNC1lZGQ5LTQ0NTQtYTIzMS0xYjY4ZTFjOGNhYjkuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvNmE1YzAyYTQtZWRkOS00NDU0LWEyMzEtMWI2OGUxYzhjYWI5LmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvYmIzZGRmYTgtMzEzMS00MDk0LWE2MGQtMTY3N2VkMmRlOWEyLndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzLzdhMWRmMzIwLTczZjAtNDg3Ny05NWRkLTNkYjUzYzk3OWM2NC50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy9iZDZhNDUzMi1kMWM2LTQyMDAtOTlmYy02NjNmNDZhNWM4NDIuc3ZnI2JkNmE0NTMyLWQxYzYtNDIwMC05OWZjLTY2M2Y0NmE1Yzg0MiIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTGlnaHQgSXRhbGljIjsKK3NyYzp1cmwoIkZvbnRzLzMwMjFhOWJiLTc5MzItNDg0NS1iNTk3LThhYmQyOTg5NWE0Yi5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy8zMDIxYTliYi03OTMyLTQ4NDUtYjU5Ny04YWJkMjk4OTVhNGIuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9lMDg1ZjA2Ny0wYjBiLTRlNzItODc1Yi0yYzRlOTI4ZWQyMzcud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvZGIwYjhkM2QtNDJmNS00NTYwLTlkZTAtMDg1YjBjYjQ5MTY0LnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzL2NkYTgxMTBjLTBlODEtNDI4ZC05ODgyLTM3MjVmNTQzYjA0Ny5zdmcjY2RhODExMGMtMGU4MS00MjhkLTk4ODItMzcyNWY1NDNiMDQ3IikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBCb2xkIjsKK3NyYzp1cmwoIkZvbnRzL2Y2YTllODFkLTk1NGUtNDE0Yi05ZjBiLTIzZTg1NDAzNmU4Zi5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9mNmE5ZTgxZC05NTRlLTQxNGItOWYwYi0yM2U4NTQwMzZlOGYuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9lMmQ2ZDMwMC0xMTFiLTRjYWEtOGZmOC0xOTIzODFkYThiMmIud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvMTMwNDE4YTUtYjFiZi00ZDE0LTljNzktZjZjOGZkY2EyZTU1LnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzgxNzdhZDY1LTBhOTItNGRlYy04NjQ4LWUwZjczNDYxZjU3Mi5zdmcjODE3N2FkNjUtMGE5Mi00ZGVjLTg2NDgtZTBmNzM0NjFmNTcyIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljIjsKK3NyYzp1cmwoIkZvbnRzL2M2ZGRmNDBlLTI1OGItNGY2Yy05MmNhLWY4YmFjZGZlNjg4My5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9jNmRkZjQwZS0yNThiLTRmNmMtOTJjYS1mOGJhY2RmZTY4ODMuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9iZDcwYTljMi1hYWUyLTRkMjUtOGM0OS0wOTEzZDQxNDQwZmEud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvYTRjMzlkMTgtYWJiZS00MzEwLThhZDctYjFjOWEyOTY3NWQyLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzk0YTllYmYzLTQwMGUtNDJkMS05MjBjLWFjMjA1YjVlYTU2MC5zdmcjOTRhOWViZjMtNDAwZS00MmQxLTkyMGMtYWMyMDViNWVhNTYwIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBMaWdodCI7CitzcmM6dXJsKCJGb250cy83NGMyMTljNy1hZWIzLTQzZGUtODI4Zi00ZjNlMDZjZDJhMTYuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvNzRjMjE5YzctYWViMy00M2RlLTgyOGYtNGYzZTA2Y2QyYTE2LmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvZTBkOGU4MWItNTMyNS00MjRjLThmMDQtYjBkYzAyOGJhNjM1LndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzLzZjYmVlNDU5LWY2NDItNDNlOS1iZjhiLTM4OTk0NWI4YzlkMS50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy8xNDE0MzI2NC05Mzg0LTQ2MDktOTA3Yi0yODI0YjQ4OTI1ODcuc3ZnIzE0MTQzMjY0LTkzODQtNDYwOS05MDdiLTI4MjRiNDg5MjU4NyIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTWVkaXVtIjsKK3NyYzp1cmwoIkZvbnRzL2UyYmVkMmM1LTNkNmUtNDk5Zi1iODc1LWM0YTkwZWY1NGRkNC5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9lMmJlZDJjNS0zZDZlLTQ5OWYtYjg3NS1jNGE5MGVmNTRkZDQuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9iN2Y1ZjJmZC01MzBhLTQ3N2ItOTI4My1iYjE4MmIyM2JhYTQud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvYmI1OTRhYzgtN2Y3Ni00N2M1LTk5NTQtYTdkYTA1MjA4YzJlLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzgyMmY1ZGU0LWViMjMtNDhmYi1hYTNlLTczMDRiNDMyYTM4ZC5zdmcjODIyZjVkZTQtZWIyMy00OGZiLWFhM2UtNzMwNGI0MzJhMzhkIikgZm9ybWF0KCJzdmciKTsKK30KKzwvc3R5bGU+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cit2YXIgTVRJUHJvamVjdElkPSdmMDE3NzI4YS1mZGYxLTQ4N2MtYmMwYS04YjkxNjY3MDZhMGEnOworIChmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIG10aVRyYWNraW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisgICAgICAgIG10aVRyYWNraW5nLnR5cGU9J3RleHQvamF2YXNjcmlwdCc7CisgICAgICAgIG10aVRyYWNraW5nLmFzeW5jPSd0cnVlJzsKKyAgICAgICAgbXRpVHJhY2tpbmcuc3JjPSgnaHR0cHM6Jz09ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w/J2h0dHBzOic6J2h0dHA6JykrJy8vZmFzdC5mb250cy5uZXQvdC90cmFja2luZ0NvZGUuanMnOworICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXXx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSkuYXBwZW5kQ2hpbGQoIG10aVRyYWNraW5nICk7CisgICB9KSgpOworPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKyAgICAgICAgPGgxIGNsYXNzPSJkZW1vIj5Gb250cy5jb20gV2ViIGZvbnRzPC9oMT4KKyAgICAgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6IC0xMHB4OyBmb250LXNpemU6IDEuNWVtOyBjb2xvcjogIzY2NiI+PGI+QGZvbnQtZmFjZSBpbXBsZW1lbnRhdGlvbiBpbnN0cnVjdGlvbnM8L2I+PC9wPgorICAgICAgICA8cD5UaGUgYXN5bmNocm9ub3VzIHNjcmlwdCBsb2FkcyBpbiB0aGUgYmFja2dyb3VuZCBhbGxvd2luZyB0aGUgb3RoZXIgZWxlbWVudHMgb2YgeW91ciB3ZWJzaXRlIHRvIGxvYWQgZmlyc3QgYW5kIHVuZGV0ZXJyZWQuPC9wPgorICAgICAgICA8aHIgLz4KKyAgICAgICAgPHAgY2xhc3M9InVjIj5UaGUgZm9udHMgY29udGFpbmVkIGluIHRoaXMga2l0IGFyZTo8L3A+CisgICAgICAgIDxkaXYgY2xhc3M9ImZvbnRkaXNwbGF5Ij4KKyAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc19BVFQgVzAyIEl0YWxpYyc7Ij4gT21uZXNfQVRUIFcwMiBJdGFsaWMgPC9kaXY+Cis8ZGl2IHN0eWxlPSJmb250LWZhbWlseTonT21uZXNfQVRUIFcwMiBMaWdodCc7Ij4gT21uZXNfQVRUIFcwMiBMaWdodCA8L2Rpdj4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc19BVFQgVzAyIExpZ2h0IEl0YWxpYyc7Ij4gT21uZXNfQVRUIFcwMiBMaWdodCBJdGFsaWMgPC9kaXY+Cis8ZGl2IHN0eWxlPSJmb250LWZhbWlseTonT21uZXNfQVRUIFcwMiBNZWRpdW0nOyI+IE9tbmVzX0FUVCBXMDIgTWVkaXVtIDwvZGl2PgorPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6J09tbmVzX0FUVCBXMDIgTWVkaXVtIEl0YWxpYyc7Ij4gT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljIDwvZGl2PgorPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6J09tbmVzX0FUVCBXMDInOyI+IE9tbmVzX0FUVCBXMDIgUmVndWxhciA8L2Rpdj4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc19BVFQgVzAyIEJvbGQnOyI+IE9tbmVzX0FUVCBXMDIgQm9sZCA8L2Rpdj4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMnOyI+IE9tbmVzX0FUVCBXMDIgQm9sZCBJdGFsaWMgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxociAvPgorICAgICAgICBDbGljayBoZXJlIGZvciA8YSBjbGFzcz0ibGluayB1YyIgaHJlZj0iZGVtby5odG0iPmNzcyBvbmx5PC9hPiB3ZWIgZm9udHMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgPGhyIC8+CisgICAgICAgIDxkaXYgY2xhc3M9Imd1aWRlbGluZXMiPgorICAgICAgICAgICAgPGgyPkNTUyBJbXBsZW1lbnRhdGlvbiBHdWlkZWxpbmVzPC9oMj4KKyAgICAgICAgICAgIDxwPllvdSBhbmQgYW55IHRoaXJkIHBhcnR5IHdlYiBmb250IGhvc3Rpbmcgc2VydmljZSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGZvbnQgc29mdHdhcmUgaW4gdGhlIHNlbGYtaG9zdGluZyBraXQsIGluIGl0cyBvcmlnaW5hbCBmb3JtYXQsIGNhbiBvbmx5IGJlIHVzZWQgb24gdGhlIFdlYiBTaXRlcyBmb3Igd2hpY2ggdGhlIHNlbGYtaG9zdGluZyBraXQgd2FzIGRvd25sb2FkZWQgYW5kIGNhbm5vdCBiZSB1c2VkIG9yIHJlZmVyZW5jZWQgYnkgYW55IG90aGVyIHdlYiBzaXRlLiBUaGlzIGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8gaW5zdGFsbGluZyBhZGVxdWF0ZSB0ZWNobmljYWwgcHJvdGVjdGlvbiBtZWFzdXJlcyB0aGF0IHJlc3RyaWN0IHRoZSB1c2UgYW5kL29yIGFjY2VzcyB0byB0aGUgZm9udCBzb2Z0d2FyZSwgZm9yIGluc3RhbmNlIGJ5IHV0aWxpemluZyBKYXZhU2NyaXB0IG9yIGFjY2VzcyBjb250cm9sIG1lY2hhbmlzbSBmb3IgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHNoYXJpbmcgYW5kIHByb3RlY3RpbmcgYWdhaW5zdCB1c2Ugb24gd2ViIHNpdGVzIG90aGVyIHRoYW4gdGhlIFdlYiBTaXRlcyBmb3Igd2hpY2ggdGhlIHNlbGYtaG9zdGluZyBraXQgd2FzIGRvd25sb2FkZWQgYnkgcmVzdHJpY3RpbmcgZG9tYWluIGFjY2VzcyBvbmx5IHRvIHN1Y2ggV2ViIFNpdGVzLiBZb3UgbXVzdCBhbHNvIHJldGFpbiB0aGUgcGFnZXZpZXcgdHJhY2tpbmcgY29kZSBvbiBhbnkgV2ViIFNpdGUgdGhhdCB5b3Ugc2VsZi1ob3N0LiBJbiB0aGUgZXZlbnQgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlcyBmb3IgYW55IHJlYXNvbiwgdGhlIGZvbnQgc29mdHdhcmUgaW5jbHVkZWQgd2l0aCB0aGUgc2VsZi1ob3N0aW5nIGtpdCBtdXN0IGJlIGRlbGV0ZWQgZnJvbSB0aGUgc2VydmVyIGFuZCBhbGwgY29waWVzIG11c3QgYmUgZGVzdHJveWVkIG9yIHJldHVybmVkIHRvIE1vbm90eXBlIEltYWdpbmcuPC9wPgorICAgICAgICAgICAgPHA+VmlldyA8YSBjbGFzcz0ibGluayIgaHJlZj0iaHR0cDovL25ldy5mb250cy5jb20vaW5mby9sZWdhbC9ldWxhL3dlYi1mb250cyIgdGFyZ2V0PSJfYmxhbmsiPiJXRUIgRk9OVCBTT0ZUV0FSRSIgTElDRU5TRSBBR1JFRU1FTlQ8L2E+PC9wPgorICAgICAgICAgICAgPGgyPkFzeW5jaHJvbm91cyBJbXBsZW1lbnRhdGlvbiAoUmVxdWlyZXMgSmF2YVNjcmlwdCk8L2gyPgorICAgICAgICAgICAgPHA+Rm9udCBmaWxlIG5hbWVzIGhhdmUgYmVlbiBvYmZ1c2NhdGVkIHRvIHByb3RlY3QgdGhlIGZvbnQgc29mdHdhcmUuIFlvdSBjYW4gaWRlbnRpZnkgZm9udCBmb3JtYXQgYmFzZWQgb24gZmlsZSBlbmRpbmc6PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT4xIC0gVHJ1ZVR5cGUgKHR0Zik8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4yIC0gRW1iZWRkZWQgT3BlblR5cGUgKGVvdCk8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4zIC0gV2ViIE9wZW4gRm9udCBGb3JtYXQgKHdvZmYpPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+NCAtIFNjYWxhYmxlIFZlY3RvciBHcmFwaGljcyAoc3ZnKTwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgPHAgY2xhc3M9InVjIiBzdHlsZT0ibWFyZ2luOiAyMHB4IDBweCAtMjBweDsiPjxiPkNvcHkgYW5kIHBhc3RlIGZvbGxvd2luZyBjb2RlIGluIGhlYWQgc2VjdGlvbiBvZiB0aGUgcGFnZTwvYj48L3A+CisgICAgICAgICAgICA8aHIgLz4KKyAgICAgICAgICAgIDx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6IDgzMHB4OyBoZWlnaHQ6IDM1MHB4OyBib3JkZXI6IDEgI2ZmZiBzb2xpZDsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmNmYzsiPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIiOworc3JjOnVybCgiRm9udHMvMDJiMmFmNmQtYTRjMS00YzRiLThmMTEtYmFlZTQ0NTQ1MTQwLmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzAyYjJhZjZkLWE0YzEtNGM0Yi04ZjExLWJhZWU0NDU0NTE0MC5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzL2FmNDY0YzI5LTljZWEtNGI4ZC04MWNjLTAwY2QwOGZhYmZlNy53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy8yMDA1OGE0NS1mMDM4LTRkOWUtYmNlMC0xYzljY2M0MzJiYWQudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvMmM0ZDAwNjQtNTI4NS00ZDdmLTlkNzMtOWM1YjNkYWZmN2QwLnN2ZyMyYzRkMDA2NC01Mjg1LTRkN2YtOWQ3My05YzViM2RhZmY3ZDAiKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMiOworc3JjOnVybCgiRm9udHMvOWY3Y2M4Y2MtOWUxNC00ZjA5LTllNmMtNjIzMjQ1MWE2NGMwLmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzlmN2NjOGNjLTllMTQtNGYwOS05ZTZjLTYyMzI0NTFhNjRjMC5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzLzBkZjk4NGUwLTU2NWItNDE2YS1hYmRhLTIyMDY5YjllZjdiMS53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy83YTlkYTc4Yi03ZGU2LTQ0YjAtYTc0Yy0wYzYxMzg3NWRmOTIudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvZTdhNTY5NjYtMzc1Yi00NzAwLWI0N2YtNzRkZWYwZGIxNTJmLnN2ZyNlN2E1Njk2Ni0zNzViLTQ3MDAtYjQ3Zi03NGRlZjBkYjE1MmYiKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc19BVFQgVzAyIEl0YWxpYyI7CitzcmM6dXJsKCJGb250cy82YTVjMDJhNC1lZGQ5LTQ0NTQtYTIzMS0xYjY4ZTFjOGNhYjkuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvNmE1YzAyYTQtZWRkOS00NDU0LWEyMzEtMWI2OGUxYzhjYWI5LmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvYmIzZGRmYTgtMzEzMS00MDk0LWE2MGQtMTY3N2VkMmRlOWEyLndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzLzdhMWRmMzIwLTczZjAtNDg3Ny05NWRkLTNkYjUzYzk3OWM2NC50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy9iZDZhNDUzMi1kMWM2LTQyMDAtOTlmYy02NjNmNDZhNWM4NDIuc3ZnI2JkNmE0NTMyLWQxYzYtNDIwMC05OWZjLTY2M2Y0NmE1Yzg0MiIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTGlnaHQgSXRhbGljIjsKK3NyYzp1cmwoIkZvbnRzLzMwMjFhOWJiLTc5MzItNDg0NS1iNTk3LThhYmQyOTg5NWE0Yi5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy8zMDIxYTliYi03OTMyLTQ4NDUtYjU5Ny04YWJkMjk4OTVhNGIuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9lMDg1ZjA2Ny0wYjBiLTRlNzItODc1Yi0yYzRlOTI4ZWQyMzcud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvZGIwYjhkM2QtNDJmNS00NTYwLTlkZTAtMDg1YjBjYjQ5MTY0LnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzL2NkYTgxMTBjLTBlODEtNDI4ZC05ODgyLTM3MjVmNTQzYjA0Ny5zdmcjY2RhODExMGMtMGU4MS00MjhkLTk4ODItMzcyNWY1NDNiMDQ3IikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBCb2xkIjsKK3NyYzp1cmwoIkZvbnRzL2Y2YTllODFkLTk1NGUtNDE0Yi05ZjBiLTIzZTg1NDAzNmU4Zi5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9mNmE5ZTgxZC05NTRlLTQxNGItOWYwYi0yM2U4NTQwMzZlOGYuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9lMmQ2ZDMwMC0xMTFiLTRjYWEtOGZmOC0xOTIzODFkYThiMmIud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvMTMwNDE4YTUtYjFiZi00ZDE0LTljNzktZjZjOGZkY2EyZTU1LnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzgxNzdhZDY1LTBhOTItNGRlYy04NjQ4LWUwZjczNDYxZjU3Mi5zdmcjODE3N2FkNjUtMGE5Mi00ZGVjLTg2NDgtZTBmNzM0NjFmNTcyIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljIjsKK3NyYzp1cmwoIkZvbnRzL2M2ZGRmNDBlLTI1OGItNGY2Yy05MmNhLWY4YmFjZGZlNjg4My5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9jNmRkZjQwZS0yNThiLTRmNmMtOTJjYS1mOGJhY2RmZTY4ODMuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9iZDcwYTljMi1hYWUyLTRkMjUtOGM0OS0wOTEzZDQxNDQwZmEud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvYTRjMzlkMTgtYWJiZS00MzEwLThhZDctYjFjOWEyOTY3NWQyLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzk0YTllYmYzLTQwMGUtNDJkMS05MjBjLWFjMjA1YjVlYTU2MC5zdmcjOTRhOWViZjMtNDAwZS00MmQxLTkyMGMtYWMyMDViNWVhNTYwIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBMaWdodCI7CitzcmM6dXJsKCJGb250cy83NGMyMTljNy1hZWIzLTQzZGUtODI4Zi00ZjNlMDZjZDJhMTYuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvNzRjMjE5YzctYWViMy00M2RlLTgyOGYtNGYzZTA2Y2QyYTE2LmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvZTBkOGU4MWItNTMyNS00MjRjLThmMDQtYjBkYzAyOGJhNjM1LndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzLzZjYmVlNDU5LWY2NDItNDNlOS1iZjhiLTM4OTk0NWI4YzlkMS50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy8xNDE0MzI2NC05Mzg0LTQ2MDktOTA3Yi0yODI0YjQ4OTI1ODcuc3ZnIzE0MTQzMjY0LTkzODQtNDYwOS05MDdiLTI4MjRiNDg5MjU4NyIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTWVkaXVtIjsKK3NyYzp1cmwoIkZvbnRzL2UyYmVkMmM1LTNkNmUtNDk5Zi1iODc1LWM0YTkwZWY1NGRkNC5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9lMmJlZDJjNS0zZDZlLTQ5OWYtYjg3NS1jNGE5MGVmNTRkZDQuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9iN2Y1ZjJmZC01MzBhLTQ3N2ItOTI4My1iYjE4MmIyM2JhYTQud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvYmI1OTRhYzgtN2Y3Ni00N2M1LTk5NTQtYTdkYTA1MjA4YzJlLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzgyMmY1ZGU0LWViMjMtNDhmYi1hYTNlLTczMDRiNDMyYTM4ZC5zdmcjODIyZjVkZTQtZWIyMy00OGZiLWFhM2UtNzMwNGI0MzJhMzhkIikgZm9ybWF0KCJzdmciKTsKK30KKzwvc3R5bGU+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cit2YXIgTVRJUHJvamVjdElkPSdmMDE3NzI4YS1mZGYxLTQ4N2MtYmMwYS04YjkxNjY3MDZhMGEnOworIChmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIG10aVRyYWNraW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisgICAgICAgIG10aVRyYWNraW5nLnR5cGU9J3RleHQvamF2YXNjcmlwdCc7CisgICAgICAgIG10aVRyYWNraW5nLmFzeW5jPSd0cnVlJzsKKyAgICAgICAgbXRpVHJhY2tpbmcuc3JjPSgnaHR0cHM6Jz09ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w/J2h0dHBzOic6J2h0dHA6JykrJy8vZmFzdC5mb250cy5uZXQvdC90cmFja2luZ0NvZGUuanMnOworICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXXx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSkuYXBwZW5kQ2hpbGQoIG10aVRyYWNraW5nICk7CisgICB9KSgpOworPC9zY3JpcHQ+PC90ZXh0YXJlYT4KKyAgICAgICAgICAgIDxoMz5MaWNlbnNpbmcgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGluY2x1ZGVkIHdpdGhpbiB0aGUgQ1NTPC9oMz4KKzxwcmU+LyoKK1RoaXMgQ1NTIHJlc291cmNlIGluY29ycG9yYXRlcyBsaW5rcyB0byBmb250IHNvZnR3YXJlIHdoaWNoIGlzIHRoZSB2YWx1YWJsZSBjb3B5cmlnaHRlZAorcHJvcGVydHkgb2YgTW9ub3R5cGUgSW1hZ2luZyBhbmQvb3IgaXRzIHN1cHBsaWVycy4gWW91IG1heSBub3QgYXR0ZW1wdCB0byBjb3B5LCBpbnN0YWxsLAorcmVkaXN0cmlidXRlLCBjb252ZXJ0LCBtb2RpZnkgb3IgcmV2ZXJzZSBlbmdpbmVlciB0aGlzIGZvbnQgc29mdHdhcmUuIFBsZWFzZSBjb250YWN0IE1vbm90eXBlCitJbWFnaW5nIHdpdGggYW55IHF1ZXN0aW9ucyByZWdhcmRpbmcgV2ViIEZvbnRzOiAgaHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbQorKi88L3ByZT4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvZGVtby5odG0gYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9udHMvT21uZXNBVFQvZGVtby5odG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNjJhZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9mb250cy9PbW5lc0FUVC9kZW1vLmh0bQpAQCAtMCwwICsxLDE1NSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+CisgICAgPHRpdGxlPldlYmZvbnRzIERlbW88L3RpdGxlPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisJICAgIGJvZHksIHRleHRhcmVhIHsgZm9udC1mYW1pbHk6QXJpYWwsIFNhbnMtU2VyaWY7IGxpbmUtaGVpZ2h0OjEuNmVtOyBmb250LXNpemU6MTNweDsgfQorCSAgICBoMSB7IGZvbnQtc2l6ZTozZW07IH0KKwkgICAgaDIsIGgzIHsgY29sb3I6Izk5OTsgfQorCSAgICAuY29udGVudCB7IHdpZHRoOjc4MHB4OyBtYXJnaW46IDIwcHggYXV0byA0MHB4OyB9CisJICAgIC5kZW1vIHsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udC1zdHlsZTpub3JtYWw7IGNvbG9yOiAjOTk5IH0KKwkgICAgLmZvbnRkaXNwbGF5IHtmb250LXNpemU6MmVtO2xpbmUtaGVpZ2h0OjE1MCU7bWFyZ2luOiAxMHB4IDQwcHggMHB4IDBweDt9CisJICAgIC5ndWlkZWxpbmVzIHsgY29sb3I6IzMzMzsgfQorCSAgICBwcmUgeyBwYWRkaW5nOjAgMCAwIDIwcHg7IH0KKwkgICAgaHIgeyBib3JkZXI6MDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzUzNzA5NDsgbWFyZ2luOjIwcHggMDsgfQorCSAgICAubGluayB7IGNvbG9yOiAjNTM3MDk0O3RleHQtZGVjb3JhdGlvbjpub25lOyBmb250LXdlaWdodDpib2xkO30KKwkgICAgLnVjIHt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorCitAaW1wb3J0IHVybCgiaHR0cDovL2Zhc3QuZm9udHMubmV0L3QvMS5jc3M/YXBpVHlwZT1jc3MmcHJvamVjdGlkPWYwMTc3MjhhLWZkZjEtNDg3Yy1iYzBhLThiOTE2NjcwNmEwYSIpOworQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc19BVFQgVzAyIjsKK3NyYzp1cmwoIkZvbnRzLzAyYjJhZjZkLWE0YzEtNGM0Yi04ZjExLWJhZWU0NDU0NTE0MC5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy8wMmIyYWY2ZC1hNGMxLTRjNGItOGYxMS1iYWVlNDQ1NDUxNDAuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9hZjQ2NGMyOS05Y2VhLTRiOGQtODFjYy0wMGNkMDhmYWJmZTcud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvMjAwNThhNDUtZjAzOC00ZDllLWJjZTAtMWM5Y2NjNDMyYmFkLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzJjNGQwMDY0LTUyODUtNGQ3Zi05ZDczLTljNWIzZGFmZjdkMC5zdmcjMmM0ZDAwNjQtNTI4NS00ZDdmLTlkNzMtOWM1YjNkYWZmN2QwIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNBVFQgVzAyIEJvbGQgSXRhbGljIjsKK3NyYzp1cmwoIkZvbnRzLzlmN2NjOGNjLTllMTQtNGYwOS05ZTZjLTYyMzI0NTFhNjRjMC5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy85ZjdjYzhjYy05ZTE0LTRmMDktOWU2Yy02MjMyNDUxYTY0YzAuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy8wZGY5ODRlMC01NjViLTQxNmEtYWJkYS0yMjA2OWI5ZWY3YjEud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvN2E5ZGE3OGItN2RlNi00NGIwLWE3NGMtMGM2MTM4NzVkZjkyLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzL2U3YTU2OTY2LTM3NWItNDcwMC1iNDdmLTc0ZGVmMGRiMTUyZi5zdmcjZTdhNTY5NjYtMzc1Yi00NzAwLWI0N2YtNzRkZWYwZGIxNTJmIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBJdGFsaWMiOworc3JjOnVybCgiRm9udHMvNmE1YzAyYTQtZWRkOS00NDU0LWEyMzEtMWI2OGUxYzhjYWI5LmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzZhNWMwMmE0LWVkZDktNDQ1NC1hMjMxLTFiNjhlMWM4Y2FiOS5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzL2JiM2RkZmE4LTMxMzEtNDA5NC1hNjBkLTE2NzdlZDJkZTlhMi53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy83YTFkZjMyMC03M2YwLTQ4NzctOTVkZC0zZGI1M2M5NzljNjQudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvYmQ2YTQ1MzItZDFjNi00MjAwLTk5ZmMtNjYzZjQ2YTVjODQyLnN2ZyNiZDZhNDUzMi1kMWM2LTQyMDAtOTlmYy02NjNmNDZhNWM4NDIiKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc19BVFQgVzAyIExpZ2h0IEl0YWxpYyI7CitzcmM6dXJsKCJGb250cy8zMDIxYTliYi03OTMyLTQ4NDUtYjU5Ny04YWJkMjk4OTVhNGIuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvMzAyMWE5YmItNzkzMi00ODQ1LWI1OTctOGFiZDI5ODk1YTRiLmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvZTA4NWYwNjctMGIwYi00ZTcyLTg3NWItMmM0ZTkyOGVkMjM3LndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzL2RiMGI4ZDNkLTQyZjUtNDU2MC05ZGUwLTA4NWIwY2I0OTE2NC50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy9jZGE4MTEwYy0wZTgxLTQyOGQtOTg4Mi0zNzI1ZjU0M2IwNDcuc3ZnI2NkYTgxMTBjLTBlODEtNDI4ZC05ODgyLTM3MjVmNTQzYjA0NyIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgQm9sZCI7CitzcmM6dXJsKCJGb250cy9mNmE5ZTgxZC05NTRlLTQxNGItOWYwYi0yM2U4NTQwMzZlOGYuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvZjZhOWU4MWQtOTU0ZS00MTRiLTlmMGItMjNlODU0MDM2ZThmLmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvZTJkNmQzMDAtMTExYi00Y2FhLThmZjgtMTkyMzgxZGE4YjJiLndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzLzEzMDQxOGE1LWIxYmYtNGQxNC05Yzc5LWY2YzhmZGNhMmU1NS50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy84MTc3YWQ2NS0wYTkyLTRkZWMtODY0OC1lMGY3MzQ2MWY1NzIuc3ZnIzgxNzdhZDY1LTBhOTItNGRlYy04NjQ4LWUwZjczNDYxZjU3MiIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTWVkaXVtIEl0YWxpYyI7CitzcmM6dXJsKCJGb250cy9jNmRkZjQwZS0yNThiLTRmNmMtOTJjYS1mOGJhY2RmZTY4ODMuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvYzZkZGY0MGUtMjU4Yi00ZjZjLTkyY2EtZjhiYWNkZmU2ODgzLmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvYmQ3MGE5YzItYWFlMi00ZDI1LThjNDktMDkxM2Q0MTQ0MGZhLndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzL2E0YzM5ZDE4LWFiYmUtNDMxMC04YWQ3LWIxYzlhMjk2NzVkMi50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy85NGE5ZWJmMy00MDBlLTQyZDEtOTIwYy1hYzIwNWI1ZWE1NjAuc3ZnIzk0YTllYmYzLTQwMGUtNDJkMS05MjBjLWFjMjA1YjVlYTU2MCIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTGlnaHQiOworc3JjOnVybCgiRm9udHMvNzRjMjE5YzctYWViMy00M2RlLTgyOGYtNGYzZTA2Y2QyYTE2LmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzc0YzIxOWM3LWFlYjMtNDNkZS04MjhmLTRmM2UwNmNkMmExNi5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzL2UwZDhlODFiLTUzMjUtNDI0Yy04ZjA0LWIwZGMwMjhiYTYzNS53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy82Y2JlZTQ1OS1mNjQyLTQzZTktYmY4Yi0zODk5NDViOGM5ZDEudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvMTQxNDMyNjQtOTM4NC00NjA5LTkwN2ItMjgyNGI0ODkyNTg3LnN2ZyMxNDE0MzI2NC05Mzg0LTQ2MDktOTA3Yi0yODI0YjQ4OTI1ODciKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc19BVFQgVzAyIE1lZGl1bSI7CitzcmM6dXJsKCJGb250cy9lMmJlZDJjNS0zZDZlLTQ5OWYtYjg3NS1jNGE5MGVmNTRkZDQuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvZTJiZWQyYzUtM2Q2ZS00OTlmLWI4NzUtYzRhOTBlZjU0ZGQ0LmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvYjdmNWYyZmQtNTMwYS00NzdiLTkyODMtYmIxODJiMjNiYWE0LndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzL2JiNTk0YWM4LTdmNzYtNDdjNS05OTU0LWE3ZGEwNTIwOGMyZS50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy84MjJmNWRlNC1lYjIzLTQ4ZmItYWEzZS03MzA0YjQzMmEzOGQuc3ZnIzgyMmY1ZGU0LWViMjMtNDhmYi1hYTNlLTczMDRiNDMyYTM4ZCIpIGZvcm1hdCgic3ZnIik7Cit9CisKKyAgICA8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgICAgIDxoMSBjbGFzcz0iZGVtbyI+Rm9udHMuY29tIFdlYiBmb250czwvaDE+CisgICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOi0xMHB4OyBmb250LXNpemU6MS41ZW07Y29sb3I6IzY2NiI+PGI+QGZvbnQtZmFjZSBpbXBsZW1lbnRhdGlvbiBpbnN0cnVjdGlvbnM8L2I+PC9wPgorICAgICAgICA8aHIgLz4KKyAgICAgICAgPHAgY2xhc3M9InVjIj5UaGUgZm9udHMgY29udGFpbmVkIGluIHRoaXMga2l0IGFyZTo8L3A+CisgICAgICAgIDxkaXYgY2xhc3M9ImZvbnRkaXNwbGF5Ij4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc19BVFQgVzAyIEl0YWxpYyc7Ij4gT21uZXNfQVRUIFcwMiBJdGFsaWMgPC9kaXY+Cis8ZGl2IHN0eWxlPSJmb250LWZhbWlseTonT21uZXNfQVRUIFcwMiBMaWdodCc7Ij4gT21uZXNfQVRUIFcwMiBMaWdodCA8L2Rpdj4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc19BVFQgVzAyIExpZ2h0IEl0YWxpYyc7Ij4gT21uZXNfQVRUIFcwMiBMaWdodCBJdGFsaWMgPC9kaXY+Cis8ZGl2IHN0eWxlPSJmb250LWZhbWlseTonT21uZXNfQVRUIFcwMiBNZWRpdW0nOyI+IE9tbmVzX0FUVCBXMDIgTWVkaXVtIDwvZGl2PgorPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6J09tbmVzX0FUVCBXMDIgTWVkaXVtIEl0YWxpYyc7Ij4gT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljIDwvZGl2PgorPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6J09tbmVzX0FUVCBXMDInOyI+IE9tbmVzX0FUVCBXMDIgUmVndWxhciA8L2Rpdj4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc19BVFQgVzAyIEJvbGQnOyI+IE9tbmVzX0FUVCBXMDIgQm9sZCA8L2Rpdj4KKzxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OidPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMnOyI+IE9tbmVzX0FUVCBXMDIgQm9sZCBJdGFsaWMgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxociAvPgorICAgICAgICBDbGljayBoZXJlIGZvciA8YSBjbGFzcz0ibGluayB1YyIgaHJlZj0iZGVtby1hc3luYy5odG0iPmFzeW5jaHJvbm91czwvYT4gd2ViIGZvbnRzIGltcGxlbWVudGF0aW9uCisgICAgICAgIDxociAvPgorICAgICAgICA8ZGl2IGNsYXNzPSJndWlkZWxpbmVzIj4KKyAgICAgICAgICAgIDxoMj5DU1MgSW1wbGVtZW50YXRpb24gR3VpZGVsaW5lczwvaDI+CisgICAgICAgICAgICA8cD5Zb3UgYW5kIGFueSB0aGlyZCBwYXJ0eSB3ZWIgZm9udCBob3N0aW5nIHNlcnZpY2UgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBmb250IHNvZnR3YXJlIGluIHRoZSBzZWxmLWhvc3Rpbmcga2l0LCBpbiBpdHMgb3JpZ2luYWwgZm9ybWF0LCBjYW4gb25seSBiZSB1c2VkIG9uIHRoZSBXZWIgU2l0ZXMgZm9yIHdoaWNoIHRoZSBzZWxmLWhvc3Rpbmcga2l0IHdhcyBkb3dubG9hZGVkIGFuZCBjYW5ub3QgYmUgdXNlZCBvciByZWZlcmVuY2VkIGJ5IGFueSBvdGhlciB3ZWIgc2l0ZS4gVGhpcyBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvIGluc3RhbGxpbmcgYWRlcXVhdGUgdGVjaG5pY2FsIHByb3RlY3Rpb24gbWVhc3VyZXMgdGhhdCByZXN0cmljdCB0aGUgdXNlIGFuZC9vciBhY2Nlc3MgdG8gdGhlIGZvbnQgc29mdHdhcmUsIGZvciBpbnN0YW5jZSBieSB1dGlsaXppbmcgSmF2YVNjcmlwdCBvciBhY2Nlc3MgY29udHJvbCBtZWNoYW5pc20gZm9yIGNyb3NzLW9yaWdpbiByZXNvdXJjZSBzaGFyaW5nIGFuZCBwcm90ZWN0aW5nIGFnYWluc3QgdXNlIG9uIHdlYiBzaXRlcyBvdGhlciB0aGFuIHRoZSBXZWIgU2l0ZXMgZm9yIHdoaWNoIHRoZSBzZWxmLWhvc3Rpbmcga2l0IHdhcyBkb3dubG9hZGVkIGJ5IHJlc3RyaWN0aW5nIGRvbWFpbiBhY2Nlc3Mgb25seSB0byBzdWNoIFdlYiBTaXRlcy4gWW91IG11c3QgYWxzbyByZXRhaW4gdGhlIHBhZ2V2aWV3IHRyYWNraW5nIGNvZGUgb24gYW55IFdlYiBTaXRlIHRoYXQgeW91IHNlbGYtaG9zdC4gSW4gdGhlIGV2ZW50IHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZXMgZm9yIGFueSByZWFzb24sIHRoZSBmb250IHNvZnR3YXJlIGluY2x1ZGVkIHdpdGggdGhlIHNlbGYtaG9zdGluZyBraXQgbXVzdCBiZSBkZWxldGVkIGZyb20gdGhlIHNlcnZlciBhbmQgYWxsIGNvcGllcyBtdXN0IGJlIGRlc3Ryb3llZCBvciByZXR1cm5lZCB0byBNb25vdHlwZSBJbWFnaW5nLjwvcD4KKyAgICAgICAgICAgIDxwPlZpZXcgPGEgY2xhc3M9ImxpbmsiIGhyZWY9Imh0dHA6Ly9uZXcuZm9udHMuY29tL2luZm8vbGVnYWwvZXVsYS93ZWItZm9udHMiIHRhcmdldD0iX2JsYW5rIj4iV0VCIEZPTlQgU09GVFdBUkUiIExJQ0VOU0UgQUdSRUVNRU5UPC9hPjwvcD4KKyAgICAgICAgICAgIDxwPkZvbnQgZmlsZSBuYW1lcyBoYXZlIGJlZW4gb2JmdXNjYXRlZCB0byBwcm90ZWN0IHRoZSBmb250IHNvZnR3YXJlLiBZb3UgY2FuIGlkZW50aWZ5IGZvbnQgZm9ybWF0IGJhc2VkIG9uIGZpbGUgZW5kaW5nOjwvcD4KKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+MSAtIFRydWVUeXBlICh0dGYpPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+MiAtIEVtYmVkZGVkIE9wZW5UeXBlIChlb3QpPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+MyAtIFdlYiBPcGVuIEZvbnQgRm9ybWF0ICh3b2ZmKTwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjQgLSBTY2FsYWJsZSBWZWN0b3IgR3JhcGhpY3MgKHN2Zyk8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDxwIGNsYXNzPSJ1YyIgc3R5bGU9Im1hcmdpbjogMjBweCAwcHggLTIwcHg7Ij48Yj5Db3B5IGFuZCBwYXN0ZSBmb2xsb3dpbmcgY29kZSBpbiBoZWFkIHNlY3Rpb24gb2YgdGhlIHBhZ2U8L2I+PC9wPgorICAgICAgICAgICAgPGhyIC8+CisgICAgICAgICAgICA8dGV4dGFyZWEgc3R5bGU9IndpZHRoOjgzMHB4OyBoZWlnaHQ6MzUwcHg7IGJvcmRlcjoxICNmZmYgc29saWQ7IGJhY2tncm91bmQtY29sb3I6I2ZjZmNmYzsiPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisKK0BpbXBvcnQgdXJsKCJodHRwOi8vZmFzdC5mb250cy5uZXQvdC8xLmNzcz9hcGlUeXBlPWNzcyZwcm9qZWN0aWQ9ZjAxNzcyOGEtZmRmMS00ODdjLWJjMGEtOGI5MTY2NzA2YTBhIik7CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIiOworc3JjOnVybCgiRm9udHMvMDJiMmFmNmQtYTRjMS00YzRiLThmMTEtYmFlZTQ0NTQ1MTQwLmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzAyYjJhZjZkLWE0YzEtNGM0Yi04ZjExLWJhZWU0NDU0NTE0MC5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzL2FmNDY0YzI5LTljZWEtNGI4ZC04MWNjLTAwY2QwOGZhYmZlNy53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy8yMDA1OGE0NS1mMDM4LTRkOWUtYmNlMC0xYzljY2M0MzJiYWQudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvMmM0ZDAwNjQtNTI4NS00ZDdmLTlkNzMtOWM1YjNkYWZmN2QwLnN2ZyMyYzRkMDA2NC01Mjg1LTRkN2YtOWQ3My05YzViM2RhZmY3ZDAiKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc0FUVCBXMDIgQm9sZCBJdGFsaWMiOworc3JjOnVybCgiRm9udHMvOWY3Y2M4Y2MtOWUxNC00ZjA5LTllNmMtNjIzMjQ1MWE2NGMwLmVvdD8jaWVmaXgiKTsKK3NyYzp1cmwoIkZvbnRzLzlmN2NjOGNjLTllMTQtNGYwOS05ZTZjLTYyMzI0NTFhNjRjMC5lb3Q/I2llZml4IikgZm9ybWF0KCJlb3QiKSx1cmwoIkZvbnRzLzBkZjk4NGUwLTU2NWItNDE2YS1hYmRhLTIyMDY5YjllZjdiMS53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksdXJsKCJGb250cy83YTlkYTc4Yi03ZGU2LTQ0YjAtYTc0Yy0wYzYxMzg3NWRmOTIudHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybCgiRm9udHMvZTdhNTY5NjYtMzc1Yi00NzAwLWI0N2YtNzRkZWYwZGIxNTJmLnN2ZyNlN2E1Njk2Ni0zNzViLTQ3MDAtYjQ3Zi03NGRlZjBkYjE1MmYiKSBmb3JtYXQoInN2ZyIpOworfQorQGZvbnQtZmFjZXsKK2ZvbnQtZmFtaWx5OiJPbW5lc19BVFQgVzAyIEl0YWxpYyI7CitzcmM6dXJsKCJGb250cy82YTVjMDJhNC1lZGQ5LTQ0NTQtYTIzMS0xYjY4ZTFjOGNhYjkuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvNmE1YzAyYTQtZWRkOS00NDU0LWEyMzEtMWI2OGUxYzhjYWI5LmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvYmIzZGRmYTgtMzEzMS00MDk0LWE2MGQtMTY3N2VkMmRlOWEyLndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzLzdhMWRmMzIwLTczZjAtNDg3Ny05NWRkLTNkYjUzYzk3OWM2NC50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy9iZDZhNDUzMi1kMWM2LTQyMDAtOTlmYy02NjNmNDZhNWM4NDIuc3ZnI2JkNmE0NTMyLWQxYzYtNDIwMC05OWZjLTY2M2Y0NmE1Yzg0MiIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTGlnaHQgSXRhbGljIjsKK3NyYzp1cmwoIkZvbnRzLzMwMjFhOWJiLTc5MzItNDg0NS1iNTk3LThhYmQyOTg5NWE0Yi5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy8zMDIxYTliYi03OTMyLTQ4NDUtYjU5Ny04YWJkMjk4OTVhNGIuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9lMDg1ZjA2Ny0wYjBiLTRlNzItODc1Yi0yYzRlOTI4ZWQyMzcud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvZGIwYjhkM2QtNDJmNS00NTYwLTlkZTAtMDg1YjBjYjQ5MTY0LnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzL2NkYTgxMTBjLTBlODEtNDI4ZC05ODgyLTM3MjVmNTQzYjA0Ny5zdmcjY2RhODExMGMtMGU4MS00MjhkLTk4ODItMzcyNWY1NDNiMDQ3IikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBCb2xkIjsKK3NyYzp1cmwoIkZvbnRzL2Y2YTllODFkLTk1NGUtNDE0Yi05ZjBiLTIzZTg1NDAzNmU4Zi5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9mNmE5ZTgxZC05NTRlLTQxNGItOWYwYi0yM2U4NTQwMzZlOGYuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9lMmQ2ZDMwMC0xMTFiLTRjYWEtOGZmOC0xOTIzODFkYThiMmIud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvMTMwNDE4YTUtYjFiZi00ZDE0LTljNzktZjZjOGZkY2EyZTU1LnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzgxNzdhZDY1LTBhOTItNGRlYy04NjQ4LWUwZjczNDYxZjU3Mi5zdmcjODE3N2FkNjUtMGE5Mi00ZGVjLTg2NDgtZTBmNzM0NjFmNTcyIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBNZWRpdW0gSXRhbGljIjsKK3NyYzp1cmwoIkZvbnRzL2M2ZGRmNDBlLTI1OGItNGY2Yy05MmNhLWY4YmFjZGZlNjg4My5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9jNmRkZjQwZS0yNThiLTRmNmMtOTJjYS1mOGJhY2RmZTY4ODMuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9iZDcwYTljMi1hYWUyLTRkMjUtOGM0OS0wOTEzZDQxNDQwZmEud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvYTRjMzlkMTgtYWJiZS00MzEwLThhZDctYjFjOWEyOTY3NWQyLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzk0YTllYmYzLTQwMGUtNDJkMS05MjBjLWFjMjA1YjVlYTU2MC5zdmcjOTRhOWViZjMtNDAwZS00MmQxLTkyMGMtYWMyMDViNWVhNTYwIikgZm9ybWF0KCJzdmciKTsKK30KK0Bmb250LWZhY2V7Citmb250LWZhbWlseToiT21uZXNfQVRUIFcwMiBMaWdodCI7CitzcmM6dXJsKCJGb250cy83NGMyMTljNy1hZWIzLTQzZGUtODI4Zi00ZjNlMDZjZDJhMTYuZW90PyNpZWZpeCIpOworc3JjOnVybCgiRm9udHMvNzRjMjE5YzctYWViMy00M2RlLTgyOGYtNGYzZTA2Y2QyYTE2LmVvdD8jaWVmaXgiKSBmb3JtYXQoImVvdCIpLHVybCgiRm9udHMvZTBkOGU4MWItNTMyNS00MjRjLThmMDQtYjBkYzAyOGJhNjM1LndvZmYiKSBmb3JtYXQoIndvZmYiKSx1cmwoIkZvbnRzLzZjYmVlNDU5LWY2NDItNDNlOS1iZjhiLTM4OTk0NWI4YzlkMS50dGYiKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKCJGb250cy8xNDE0MzI2NC05Mzg0LTQ2MDktOTA3Yi0yODI0YjQ4OTI1ODcuc3ZnIzE0MTQzMjY0LTkzODQtNDYwOS05MDdiLTI4MjRiNDg5MjU4NyIpIGZvcm1hdCgic3ZnIik7Cit9CitAZm9udC1mYWNleworZm9udC1mYW1pbHk6Ik9tbmVzX0FUVCBXMDIgTWVkaXVtIjsKK3NyYzp1cmwoIkZvbnRzL2UyYmVkMmM1LTNkNmUtNDk5Zi1iODc1LWM0YTkwZWY1NGRkNC5lb3Q/I2llZml4Iik7CitzcmM6dXJsKCJGb250cy9lMmJlZDJjNS0zZDZlLTQ5OWYtYjg3NS1jNGE5MGVmNTRkZDQuZW90PyNpZWZpeCIpIGZvcm1hdCgiZW90IiksdXJsKCJGb250cy9iN2Y1ZjJmZC01MzBhLTQ3N2ItOTI4My1iYjE4MmIyM2JhYTQud29mZiIpIGZvcm1hdCgid29mZiIpLHVybCgiRm9udHMvYmI1OTRhYzgtN2Y3Ni00N2M1LTk5NTQtYTdkYTA1MjA4YzJlLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKSx1cmwoIkZvbnRzLzgyMmY1ZGU0LWViMjMtNDhmYi1hYTNlLTczMDRiNDMyYTM4ZC5zdmcjODIyZjVkZTQtZWIyMy00OGZiLWFhM2UtNzMwNGI0MzJhMzhkIikgZm9ybWF0KCJzdmciKTsKK30KKworPC9zdHlsZT4KKworPC90ZXh0YXJlYT4KKyAgICAgICAgICAgIDxoMz5MaWNlbnNpbmcgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGluY2x1ZGVkIHdpdGhpbiB0aGUgQ1NTPC9oMz4KKzxwcmU+LyoKK1RoaXMgQ1NTIHJlc291cmNlIGluY29ycG9yYXRlcyBsaW5rcyB0byBmb250IHNvZnR3YXJlIHdoaWNoIGlzIHRoZSB2YWx1YWJsZSBjb3B5cmlnaHRlZAorcHJvcGVydHkgb2YgTW9ub3R5cGUgSW1hZ2luZyBhbmQvb3IgaXRzIHN1cHBsaWVycy4gWW91IG1heSBub3QgYXR0ZW1wdCB0byBjb3B5LCBpbnN0YWxsLAorcmVkaXN0cmlidXRlLCBjb252ZXJ0LCBtb2RpZnkgb3IgcmV2ZXJzZSBlbmdpbmVlciB0aGlzIGZvbnQgc29mdHdhcmUuIFBsZWFzZSBjb250YWN0IE1vbm90eXBlCitJbWFnaW5nIHdpdGggYW55IHF1ZXN0aW9ucyByZWdhcmRpbmcgV2ViIEZvbnRzOiAgaHR0cDovL3dlYmZvbnRzLmZvbnRzLmNvbQorKi88L3ByZT4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZm9ybS1lbGVtZW50cy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2Zvcm0tZWxlbWVudHMubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjgxNDZkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2Zvcm0tZWxlbWVudHMubGVzcwpAQCAtMCwwICsxLDE5OSBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3JtCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy53LXNkYy1mb3JtIHsKKyAgICBwYWRkaW5nOiAwOworCisgICAgLnctc2RjLWZvcm0tYWN0aW9ucy1jb250YWluZXIgeworICAgICAgICBtYXJnaW46IDIwcHggYXV0bzsgLy8gLTEwcHg7CisgICAgICAgIHdpZHRoOiAxMDAlOyAvLyAzMjBweDsKKyAgICB9CisKKyAgICAudy1zZGMtZm9ybS1jb2x1bW5zLXdyYXBwZXIgeworCisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKworICAgICAgICAudy1zZGMtZm9ybS1jb2x1bW4geworICAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgICAgICBwYWRkaW5nOiAwIDYlIDAgMDsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisKKyAgICAgICAgICAgICY6bGFzdC1jaGlsZCB7CisgICAgICAgICAgICAgICAgcGFkZGluZzogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgIH0KKworICAgIC5pLXNkYy1mb3JtLWl0ZW0geworICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisKKyAgICAgICAgJi5lcnJvciB7CisgICAgICAgICAgICBpbnB1dFt0eXBlPSJ0ZXh0Il0sCisgICAgICAgICAgICBpbnB1dFt0eXBlPSJ1cmwiXSwKKyAgICAgICAgICAgIGlucHV0W3R5cGU9Im51bWJlciJdLAorICAgICAgICAgICAgaW5wdXRbdHlwZT0icGFzc3dvcmQiXSwKKyAgICAgICAgICAgIHNlbGVjdCwKKyAgICAgICAgICAgIHRleHRhcmVhIHsKKyAgICAgICAgICAgICAgICAuaF8xOworICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogQG1haW5fY29sb3JfZzsKKyAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisKKyAgICAgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICAgICAgLmhfMTsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiBAbWFpbl9jb2xvcl9nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhYmVsIHsKKyAgICAgICAgICAgICAgICAubV8xNF9tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGFiZWwgeworICAgICAgICAgICAgLm1fMTRfbTsKKyAgICAgICAgICAgIG1hcmdpbjogMCAwIDJweCAwOworICAgICAgICAgICAgcGFkZGluZzogMDsKKyAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworCisgICAgICAgICAgICAmLnJlcXVpcmVkOjpiZWZvcmUgeworICAgICAgICAgICAgICAgIGNvbG9yOiAjZjMzOworICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcqJzsKKyAgICAgICAgICAgICAgICBtYXJnaW46IDAgNHB4IDAgMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlucHV0W3R5cGU9InRleHQiXSwKKyAgICAgICAgaW5wdXRbdHlwZT0idXJsIl0sCisgICAgICAgIGlucHV0W3R5cGU9Im51bWJlciJdLAorICAgICAgICBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLAorICAgICAgICBzZWxlY3QsCisgICAgICAgIHRleHRhcmVhIHsKKyAgICAgICAgICAgIC5tXzE0X3I7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9wOworICAgICAgICAgICAgLmJvcmRlci1yYWRpdXMoMnB4KTsKKyAgICAgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgICAgIHBhZGRpbmc6IDA7CisgICAgICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbl9jb2xvcl9vOworICAgICAgICAgICAgaGVpZ2h0OiAzMHB4OworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKworICAgICAgICAgICAgJjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfSAvKiBTYWZhcmksIENocm9tZSBhbmQgT3BlcmEgKi8KKyAgICAgICAgICAgICY6LW1vei1wbGFjZWhvbGRlciB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfSAvKiBGaXJlZm94IDE4LSAqLworICAgICAgICAgICAgJjo6LW1vei1wbGFjZWhvbGRlciB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfSAvKiBGaXJlZm94IDE5KyAqLworICAgICAgICAgICAgJjotbXMtaW5wdXQtcGxhY2Vob2xkZXIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0gLyogSUUgMTArICovCisgICAgICAgICAgICAmOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfSAvKiBFZGdlICovCisKKyAgICAgICAgICAgICY6ZGlzYWJsZWQgeworICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICYudmlldy1tb2RlIHsKKyAgICAgICAgICAgICAgICBvcGFjaXR5OiAxOworICAgICAgICAgICAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluX2NvbG9yX287CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmOCAhaW1wb3J0YW50OworICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOworICAgICAgICAgICAgICAgIGN1cnNvcjogYXV0bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRbdHlwZT0idGV4dCJdLAorICAgICAgICBpbnB1dFt0eXBlPSJ1cmwiXSwKKyAgICAgICAgaW5wdXRbdHlwZT0ibnVtYmVyIl0sCisgICAgICAgIGlucHV0W3R5cGU9InBhc3N3b3JkIl0gIHsgcGFkZGluZzogNHB4IDEwcHg7fQorICAgICAgICBzZWxlY3QgICAgICAgICAgICAgICAgICB7IHBhZGRpbmc6IDRweCA3cHg7fQorICAgICAgICB0ZXh0YXJlYSAgICAgICAgICAgICAgICB7IHBhZGRpbmc6IDZweCAxMHB4O30KKworICAgICAgICBzZWxlY3QgeworICAgICAgICAgICAgb3B0Z3JvdXAgeworICAgICAgICAgICAgICAgIGNvbG9yOiBAY29sb3JfYTsKKyAgICAgICAgICAgICAgICBvcHRpb24geworICAgICAgICAgICAgICAgICAgICBjb2xvcjogQGNvbG9yX2I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZXh0YXJlYSB7CisgICAgICAgICAgICBtaW4taGVpZ2h0OiAxMTBweDsKKyAgICAgICAgICAgIHJlc2l6ZTogbm9uZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLmktc2RjLWZvcm0taXRlbS1lcnJvci1pY29uIHsKKyAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgLmV4Y2xhbWF0aW9uLW1hcmstcmVkLWljb247CisgICAgICAgIHdpZHRoOiAxM3B4OworICAgICAgICBoZWlnaHQ6IDExcHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKworICAgICAgICAuaS1zZGMtZm9ybS1pdGVtLWVycm9yLW1lc3NhZ2UgeworICAgICAgICAgICAgLmJnX2g7CisgICAgICAgICAgICAuY18zOworICAgICAgICAgICAgY3Vyc29yOiBkZWZhdWx0OworICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgdG9wOiAtMTBweDsKKyAgICAgICAgICAgIGxlZnQ6IC04cHg7CisgICAgICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICAgICAgICBwYWRkaW5nOiA2cHggMTBweCA2cHggMzBweDsKKyAgICAgICAgICAgIHotaW5kZXg6IDk5OTsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgICAgICAuYm9yZGVyLXJhZGl1cy10b3AtcmlnaHQoNHB4KTsKKyAgICAgICAgICAgIC5ib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodCg0cHgpOworICAgICAgICAgICAgLmJveC1zaGFkb3coMHB4IDFweCAxcHggMHB4IHJnYmEoMjQsIDI0LCAyNSwgMC40MykpOworCisgICAgICAgICAgICAmOmJlZm9yZSB7CisgICAgICAgICAgICAgICAgLmFycm93KDVweCwgQGNvbG9yX2gpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcGFuIHsKKyAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcGFuLmVycm9yIHsKKyAgICAgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgICAgIC5leGNsYW1hdGlvbi1tYXJrLXJlZC1pY29uOworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgICAgICB0b3A6IDlweDsKKyAgICAgICAgICAgICAgICBsZWZ0OiA4cHg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwYW4ub2sgeworICAgICAgICAgICAgICAgIC5jXzM7CisgICAgICAgICAgICAgICAgLmhhbmQ7CisgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICAgICAgICAgIHJpZ2h0OiAxMHB4OworICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAuaS1zZGMtZm9ybS1pdGVtLWVycm9yLWljb24tb3BlbiB7CisgICAgICAgICAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgICAgICAgICAuZXhjbGFtYXRpb24tbWFyay13aGl0ZS1pY29uOworICAgICAgICAgICAgICAgIHdpZHRoOiAxM3B4OworICAgICAgICAgICAgICAgIGhlaWdodDogMTFweDsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICAgICAgdG9wOiA5cHg7CisgICAgICAgICAgICAgICAgbGVmdDogOHB4OworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC5pbnB1dC1lcnJvciB7CisgICAgICAgIC5xXzEyX207CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgfQorCisgICAgLmlucHV0LWVycm9yLWZpbGUtdXBsb2FkIHsKKyAgICAgICAgLmlucHV0LWVycm9yOworICAgICAgICBtYXJnaW4tdG9wOiAtMTBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZ2xvYmFsLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvZ2xvYmFsLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZjRhZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9nbG9iYWwubGVzcwpAQCAtMCwwICsxLDUyIEBACitodG1sIHsKKyAgICBoZWlnaHQ6IDEwMCU7Cit9CisKK2JvZHkgeworICAgIC5iXzc7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIG1hcmdpbjogYXV0bzsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyogeworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgbWFyZ2luOiAwOworfQorCitodG1sLCBib2R5IHsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworYSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCitjYW52YXMgeworICAgIG91dGxpbmU6IG5vbmU7Cit9CisKKy5kb3dubG9hZC1hcnRpZmFjdCB7CisgICAgLmhhbmQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYm9vdHN0cmFwIG92ZXJyaWRlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitodG1sIHsKKworICAgIC53LXNkYy1yZXNvdXJjZS1jb250YWluZXIgeworICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CisgICAgfQorCisgICAgLy8gSG92ZXIgb24gbm90aWZpY2F0aW9uIHNob3VsZCBrZWVwIGl0IHdpdGggb3BhY2l0eSAxLgorICAgIC51aS1ub3RpZmljYXRpb24geworICAgICAgICAmLmNsaWNrYWJsZSB7CisgICAgICAgICAgICAmOmhvdmVyIHsKKyAgICAgICAgICAgICAgICBvcGFjaXR5OiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL2Fub255bW91cy5qcGcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL2Fub255bW91cy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYWYzNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvYW5vbnltb3VzLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL2F0dF9sb2dvX3doaXRlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvYXR0X2xvZ29fd2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjFiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL2F0dF9sb2dvX3doaXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9BdHRhY2hlc1RvLnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL0F0dGFjaGVzVG8uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjU3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9BdHRhY2hlc1RvLnN2ZwpAQCAtMCwwICsxLDM3IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiB3aWR0aD0iMjUiIGhlaWdodD0iMjUiIHZpZXdCb3g9IjAgMCAyNSAyNSI+CisgIDxkZWZzPgorICAgIDxzdHlsZT4KKyAgICAgIC5jbHMtMSB7CisgICAgICAgIGZpbGw6ICMzYjdiOWI7CisgICAgICB9CisKKyAgICAgIC5jbHMtMiB7CisgICAgICAgIGZpbGw6ICNmZmY7CisgICAgICAgIHN0cm9rZTogI2ZmZjsKKyAgICAgICAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKKyAgICAgICAgc3Ryb2tlLXdpZHRoOiAycHg7CisgICAgICAgIGZpbHRlcjogdXJsKCNkcm9wLXNoYWRvdy0xKTsKKyAgICAgICAgZmlsbC1vcGFjaXR5OiAwOworICAgICAgfQorICAgIDwvc3R5bGU+CisKKyAgICA8ZmlsdGVyIGlkPSJkcm9wLXNoYWRvdy0xIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiPgorICAgICAgPGZlT2Zmc2V0IGR4PSIxLjcxNCIgZHk9IjEuMDMiIGluPSJTb3VyY2VBbHBoYSIvPgorICAgICAgPGZlR2F1c3NpYW5CbHVyIHJlc3VsdD0iZHJvcEJsdXIiLz4KKyAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiLz4KKyAgICAgIDxmZUNvbXBvc2l0ZSBvcGVyYXRvcj0iaW4iIGluMj0iZHJvcEJsdXIiIHJlc3VsdD0iZHJvcFNoYWRvd0NvbXAiLz4KKyAgICAgIDxmZUNvbXBvc2l0ZSBpbj0iU291cmNlR3JhcGhpYyIgcmVzdWx0PSJzaGFkb3dlZCIvPgorICAgIDwvZmlsdGVyPgorICA8L2RlZnM+CisgIDxnPgorICAgIDxjaXJjbGUgY3g9IjEyLjU3OCIgY3k9IjEyLjEwOSIgcj0iMTEuNDIyIiBjbGFzcz0iY2xzLTEiLz4KKyAgICA8ZyBzdHlsZT0iZmlsbDogI2ZmZjsgZmlsdGVyOiB1cmwoI2Ryb3Atc2hhZG93LTEpIj4KKyAgICAgIDxjaXJjbGUgY3g9IjE1LjUiIGN5PSIxMi41IiByPSIyLjUiIGlkPSJjaXJjbGUtMSIgc3R5bGU9InN0cm9rZTogaW5oZXJpdDsgZmlsdGVyOiBub25lOyBmaWxsOiBpbmhlcml0IiBjbGFzcz0iY2xzLTIiLz4KKyAgICA8L2c+CisgICAgPHVzZSB4bGluazpocmVmPSIjY2lyY2xlLTEiIHN0eWxlPSJzdHJva2U6ICNmZmY7IGZpbHRlcjogbm9uZTsgZmlsbDogbm9uZSIvPgorICAgIDxnIHN0eWxlPSJmaWxsOiAjZmZmOyBmaWx0ZXI6IHVybCgjZHJvcC1zaGFkb3ctMSkiPgorICAgICAgPGNpcmNsZSBjeD0iOS41IiBjeT0iMTIuNSIgcj0iMi41IiBpZD0iY2lyY2xlLTIiIHN0eWxlPSJzdHJva2U6IGluaGVyaXQ7IGZpbHRlcjogbm9uZTsgZmlsbDogaW5oZXJpdCIgY2xhc3M9ImNscy0yIi8+CisgICAgPC9nPgorICAgIDx1c2UgeGxpbms6aHJlZj0iI2NpcmNsZS0yIiBzdHlsZT0ic3Ryb2tlOiAjZmZmOyBmaWx0ZXI6IG5vbmU7IGZpbGw6IG5vbmUiLz4KKyAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9CaW5kc1RvLnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL0JpbmRzVG8uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTY0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9CaW5kc1RvLnN2ZwpAQCAtMCwwICsxLDE5IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiB3aWR0aD0iMjUiIGhlaWdodD0iMjUiIHZpZXdCb3g9IjAgMCAyNSAyNSI+CisgIDxkZWZzPgorICAgIDxzdHlsZT4KKyAgICAgIC5jbHMtMSB7CisgICAgICAgIGZpbGw6ICMzYjdiOWI7CisgICAgICB9CisKKyAgICAgIC5jbHMtMiB7CisgICAgICAgIGZpbGw6ICNmZmY7CisgICAgICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2RlZnM+CisgIDxnPgorICAgIDxjaXJjbGUgY3g9IjEyLjU3OCIgY3k9IjEyLjczNCIgcj0iMTEuNDIyIiBjbGFzcz0iY2xzLTEiLz4KKyAgICA8cGF0aCBkPSJNMTcuNTAwLDE0LjAwMCBDMTYuNjcyLDE0LjAwMCAxNi4wMDAsMTMuMzI4IDE2LjAwMCwxMi41MDAgQzE2LjAwMCwxMS42NzIgMTYuNjcyLDExLjAwMCAxNy41MDAsMTEuMDAwIEMxOC4zMjgsMTEuMDAwIDE5LjAwMCwxMS42NzIgMTkuMDAwLDEyLjUwMCBDMTkuMDAwLDEzLjMyOCAxOC4zMjgsMTQuMDAwIDE3LjUwMCwxNC4wMDAgWk0xMi41MDAsMTQuMDAwIEMxMS42NzIsMTQuMDAwIDExLjAwMCwxMy4zMjggMTEuMDAwLDEyLjUwMCBDMTEuMDAwLDExLjY3MiAxMS42NzIsMTEuMDAwIDEyLjUwMCwxMS4wMDAgQzEzLjMyOCwxMS4wMDAgMTQuMDAwLDExLjY3MiAxNC4wMDAsMTIuNTAwIEMxNC4wMDAsMTMuMzI4IDEzLjMyOCwxNC4wMDAgMTIuNTAwLDE0LjAwMCBaTTcuNTAwLDE0LjAwMCBDNi42NzIsMTQuMDAwIDYuMDAwLDEzLjMyOCA2LjAwMCwxMi41MDAgQzYuMDAwLDExLjY3MiA2LjY3MiwxMS4wMDAgNy41MDAsMTEuMDAwIEM4LjMyOCwxMS4wMDAgOS4wMDAsMTEuNjcyIDkuMDAwLDEyLjUwMCBDOS4wMDAsMTMuMzI4IDguMzI4LDE0LjAwMCA3LjUwMCwxNC4wMDAgWiIgY2xhc3M9ImNscy0yIi8+CisgICAgPHBhdGggZD0iTTYuMDAwLDE3LjAwMCBMNi4wMDAsMTYuMDAwIEwxOS4wMDAsMTYuMDAwIEwxOS4wMDAsMTcuMDAwIEw2LjAwMCwxNy4wMDAgWk02LjAwMCw4LjAwMCBMMTkuMDAwLDguMDAwIEwxOS4wMDAsOS4wMDAgTDYuMDAwLDkuMDAwIEw2LjAwMCw4LjAwMCBaIiBjbGFzcz0iY2xzLTIiLz4KKyAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9Db25uZWN0ZWRUby5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9Db25uZWN0ZWRUby5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNzY3MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL0Nvbm5lY3RlZFRvLnN2ZwpAQCAtMCwwICsxLDE5IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiB3aWR0aD0iMjUiIGhlaWdodD0iMjUiIHZpZXdCb3g9IjAgMCAyNSAyNSI+CisgIDxkZWZzPgorICAgIDxzdHlsZT4KKyAgICAgIC5jbHMtMSB7CisgICAgICAgIGZpbGw6ICMzYjdiOWI7CisgICAgICB9CisKKyAgICAgIC5jbHMtMiB7CisgICAgICAgIGZpbGw6ICNmZmY7CisgICAgICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2RlZnM+CisgIDxnPgorICAgIDxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxMi41IiByPSIxMS41IiBjbGFzcz0iY2xzLTEiLz4KKyAgICA8cGF0aCBkPSJNMTYuMDE2LDE0LjgxMyBDMTQuNzQ3LDE0LjgxMyAxMy43MTksMTMuNzc3IDEzLjcxOSwxMi41MDAgQzEzLjcxOSwxMS4yMjMgMTQuNzQ3LDEwLjE4NyAxNi4wMTYsMTAuMTg3IEMxNy4yODQsMTAuMTg3IDE4LjMxMywxMS4yMjMgMTguMzEzLDEyLjUwMCBDMTguMzEzLDEzLjc3NyAxNy4yODQsMTQuODEzIDE2LjAxNiwxNC44MTMgWk03Ljk4NCwxNC44MTMgQzYuNzE2LDE0LjgxMyA1LjY4NywxMy43NzcgNS42ODcsMTIuNTAwIEM1LjY4NywxMS4yMjMgNi43MTYsMTAuMTg3IDcuOTg0LDEwLjE4NyBDOS4yNTMsMTAuMTg3IDEwLjI4MSwxMS4yMjMgMTAuMjgxLDEyLjUwMCBDMTAuMjgxLDEzLjc3NyA5LjI1MywxNC44MTMgNy45ODQsMTQuODEzIFoiIGNsYXNzPSJjbHMtMiIvPgorICAgIDxwYXRoIGQ9Ik03LjQzMCwxMi45NTcgTDcuNDMwLDEyLjAzNiBMMTcuNTU2LDEyLjAzNiBMMTcuNTU2LDEyLjk1NyBMNy40MzAsMTIuOTU3IFoiIGNsYXNzPSJjbHMtMiIvPgorICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL0RlcGVuZHNPbi5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9EZXBlbmRzT24uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODgwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9EZXBlbmRzT24uc3ZnCkBAIC0wLDAgKzEsMzQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyNSIgdmlld0JveD0iMCAwIDI1IDI1Ij4KKyAgPGRlZnM+CisgICAgPHN0eWxlPgorICAgICAgLmNscy0xLCAuY2xzLTIgeworICAgICAgICBmaWxsOiAjM2I3YjliOworICAgICAgfQorCisgICAgICAuY2xzLTEgeworICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CisgICAgICB9CisKKyAgICAgIC5jbHMtMywgLmNscy00IHsKKyAgICAgICAgZmlsbDogI2ZmZjsKKyAgICAgICAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKKyAgICAgICAgc3Ryb2tlLXdpZHRoOiAycHg7CisgICAgICB9CisKKyAgICAgIC5jbHMtMyB7CisgICAgICAgIHN0cm9rZTogI2ZmZjsKKyAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjAxOworICAgICAgfQorCisgICAgICAuY2xzLTQgeworICAgICAgICBzdHJva2U6ICMzYjdiOWI7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9kZWZzPgorICA8Zz4KKyAgICA8cGF0aCBkPSJNMTYuNDc4LC0xMS40OTkgTDEwLjkxMSwtOC4wMTkgQzEwLjI1MywtNy42MTIgOS45MDQsLTguMjU1IDkuOTA0LC05LjAwMyBMOS45MDQsLTE1Ljg5MyBDOS45MDQsLTE2LjY0MSAxMC4yNTMsLTE3LjI4MyAxMC45MTEsLTE2Ljg3NyBMMTYuNDc4LC0xMi45NzcgQzE3LjEzNiwtMTIuNTcxIDE3LjEzNiwtMTEuOTA2IDE2LjQ3OCwtMTEuNDk5IFoiIGNsYXNzPSJjbHMtMSIvPgorICAgIDxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxMi42MDkiIHI9IjExLjUiIGNsYXNzPSJjbHMtMiIvPgorICAgIDxjaXJjbGUgY3g9IjEyLjAzMSIgY3k9IjEyLjE1NiIgcj0iNS41MzEiIGNsYXNzPSJjbHMtMyIvPgorICAgIDxlbGxpcHNlIGN4PSIxNi4xODgiIGN5PSIxNS4zNDQiIHJ4PSIzLjIxOSIgcnk9IjMuMTg4IiBjbGFzcz0iY2xzLTQiLz4KKyAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9Ib3N0ZWRPbi5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9Ib3N0ZWRPbi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhZjg0YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL0hvc3RlZE9uLnN2ZwpAQCAtMCwwICsxLDI1IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiB3aWR0aD0iMjUiIGhlaWdodD0iMjUiIHZpZXdCb3g9IjAgMCAyNSAyNSI+CisgIDxkZWZzPgorICAgIDxzdHlsZT4KKyAgICAgIC5jbHMtMSB7CisgICAgICAgIGZpbGw6ICMzYjdiOWI7CisgICAgICB9CisKKyAgICAgIC5jbHMtMiwgLmNscy0zIHsKKyAgICAgICAgZmlsbDogI2ZmZjsKKyAgICAgIH0KKworICAgICAgLmNscy0zIHsKKyAgICAgICAgc3Ryb2tlOiAjZmZmOworICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOworICAgICAgICBzdHJva2Utd2lkdGg6IDJweDsKKyAgICAgICAgZmlsbC1vcGFjaXR5OiAwOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvZGVmcz4KKyAgPGc+CisgICAgPGVsbGlwc2UgY3g9IjEyLjU3OCIgY3k9IjEyLjUxNiIgcng9IjExLjQyMiIgcnk9IjExLjI2NiIgY2xhc3M9ImNscy0xIi8+CisgICAgPGNpcmNsZSBjeD0iMTIuNTk0IiBjeT0iMTIuNTk0IiByPSIzLjUiIGNsYXNzPSJjbHMtMiIvPgorICAgIDxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxMi41IiByPSI3LjUiIGNsYXNzPSJjbHMtMyIvPgorICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL0xpbmtzVG8uc3ZnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvTGlua3NUby5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0YzY4NwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL0xpbmtzVG8uc3ZnCkBAIC0wLDAgKzEsMjIgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyNSIgdmlld0JveD0iMCAwIDI1IDI1Ij4KKyAgPGRlZnM+CisgICAgPHN0eWxlPgorICAgICAgLmNscy0xIHsKKyAgICAgICAgZmlsbDogIzNiN2I5YjsKKyAgICAgIH0KKworICAgICAgLmNscy0yIHsKKyAgICAgICAgZmlsbDogI2ZmZjsKKyAgICAgICAgc3Ryb2tlOiAjZmZmOworICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOworICAgICAgICBzdHJva2Utd2lkdGg6IDJweDsKKyAgICAgICAgZmlsbC1vcGFjaXR5OiAwOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvZGVmcz4KKyAgPGc+CisgICAgPGNpcmNsZSBjeD0iMTIuNSIgY3k9IjEyLjUiIHI9IjExLjUiIGNsYXNzPSJjbHMtMSIvPgorICAgIDxjaXJjbGUgY3g9IjE1LjE1NiIgY3k9IjEyLjEyNSIgcj0iNC44MTMiIGNsYXNzPSJjbHMtMiIvPgorICAgIDxlbGxpcHNlIGN4PSI5LjY4OCIgY3k9IjEyLjEyNSIgcng9IjQuODEzIiByeT0iNC41OTQiIGNsYXNzPSJjbHMtMiIvPgorICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL1JvdXRlc1RvLnN2ZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL1JvdXRlc1RvLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNjYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvUm91dGVzVG8uc3ZnCkBAIC0wLDAgKzEsMTkgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIHdpZHRoPSIyNSIgaGVpZ2h0PSIyNSIgdmlld0JveD0iMCAwIDI1IDI1Ij4KKyAgPGRlZnM+CisgICAgPHN0eWxlPgorICAgICAgLmNscy0xIHsKKyAgICAgICAgZmlsbDogIzNiN2I5YjsKKyAgICAgIH0KKworICAgICAgLmNscy0yIHsKKyAgICAgICAgZmlsbDogI2ZmZjsKKyAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvZGVmcz4KKyAgPGc+CisgICAgPGNpcmNsZSBjeD0iMTIuNSIgY3k9IjEyLjUiIHI9IjExLjUiIGNsYXNzPSJjbHMtMSIvPgorICAgIDxwYXRoIGQ9Ik03LjQzMCwxMi45NTcgTDcuNDMwLDEyLjAzNyBMMTcuNTU2LDEyLjAzNyBMMTcuNTU2LDEyLjk1NyBMNy40MzAsMTIuOTU3IFoiIGNsYXNzPSJjbHMtMiIvPgorICAgIDxwYXRoIGQ9Ik0xOS4xNzksMTMuMDA1IEwxNi4wNjQsMTYuNDIwIEMxNS44MDcsMTYuNzAyIDE1LjM4NywxNi43MDIgMTUuMTMwLDE2LjQyMCBDMTQuODczLDE2LjEzOSAxNC44MTEsMTUuNjI2IDE0Ljk5MiwxNS4yODAgTDE2LjEyNiwxMy4xMjEgQzE2LjMwNywxMi43NzYgMTYuMzA3LDEyLjIxMSAxNi4xMjYsMTEuODY2IEwxNC45OTIsOS43MDYgQzE0LjgxMSw5LjM2MSAxNC44NzMsOC44NDggMTUuMTMwLDguNTY2IEwxNS4xMzAsOC41NjYgQzE1LjM4Nyw4LjI4NSAxNS44MDcsOC4yODQgMTYuMDY0LDguNTY2IEwxOS4xNzksMTEuOTgxIEMxOS40MzYsMTIuMjYzIDE5LjQzNiwxMi43MjQgMTkuMTc5LDEzLjAwNSBaTTkuOTQ4LDE1LjI4OCBDMTAuMTI4LDE1LjYzMyAxMC4wNjcsMTYuMTQ2IDkuODExLDE2LjQyOCBMOS44MTEsMTYuNDI4IEM5LjU1NSwxNi43MDkgOS4xMzcsMTYuNzEwIDguODgyLDE2LjQyOCBMNS43ODMsMTMuMDEzIEM1LjUyNywxMi43MzEgNS41MjcsMTIuMjcxIDUuNzgzLDExLjk4OSBMOC44ODIsOC41NzQgQzkuMTM3LDguMjkyIDkuNTU1LDguMjkyIDkuODExLDguNTc0IEMxMC4wNjcsOC44NTYgMTAuMTI4LDkuMzY5IDkuOTQ4LDkuNzE0IEw4LjgyMCwxMS44NzMgQzguNjM5LDEyLjIxOCA4LjYzOSwxMi43ODMgOC44MjAsMTMuMTI4IEw5Ljk0OCwxNS4yODggWiIgY2xhc3M9ImNscy0yIi8+CisgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvYXJyb3cucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvYXJyb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzBlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9hcnJvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvYXJyb3cuc3ZnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvYXJyb3cuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTZlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9hcnJvdy5zdmcKQEAgLTAsMCArMSwxMSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCIgd2lkdGg9IjciIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDcgOSI+CisgIDxkZWZzPgorICAgIDxzdHlsZT4KKyAgICAgIC5jbHMtMSB7CisgICAgICAgIGZpbGw6ICMzYjdiOWI7CisgICAgICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2RlZnM+CisgIDxwYXRoIGQ9Ik02LjAwMCw5LjAwMCBMMC40NzEsNS4wMzcgQy0wLjE4Myw0LjYyNSAtMC4xODMsMy45NDkgMC40NzEsMy41MzYgTDYuMDAwLC0wLjAwMCBDNi42NTMsLTAuNDEzIDcuMDAwLDAuMjQwIDcuMDAwLDEuMDAwIEw3LjAwMCw4LjAwMCBDNy4wMDAsOC43NjAgNi42NTMsOS40MTMgNi4wMDAsOS4wMDAgWiIgY2xhc3M9ImNscy0xIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2Fycm93X2Nvbm5lY3Rpb25fcmlnaHQuc3ZnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvYXJyb3dfY29ubmVjdGlvbl9yaWdodC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyZDlmMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2Fycm93X2Nvbm5lY3Rpb25fcmlnaHQuc3ZnCkBAIC0wLDAgKzEsMTEgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIHdpZHRoPSI3IiBoZWlnaHQ9IjkiIHZpZXdCb3g9IjAgMCA3IDkiPgorICA8ZGVmcz4KKyAgICA8c3R5bGU+CisgICAgICAuY2xzLTEgeworICAgICAgICBmaWxsOiAjM2I3YjliOworICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9kZWZzPgorICA8cGF0aCBkPSJNNi41MjksNS40MzggTDEuMDAwLDguODc4IEMwLjM0Nyw5LjI4MSAwLjAwMCw4LjY0NSAwLjAwMCw3LjkwNSBMMC4wMDAsMS4wOTUgQzAuMDAwLDAuMzU1IDAuMzQ3LC0wLjI4MCAxLjAwMCwwLjEyMiBMNi41MjksMy45NzcgQzcuMTgzLDQuMzc5IDcuMTgzLDUuMDM2IDYuNTI5LDUuNDM4IFoiIGNsYXNzPSJjbHMtMSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9hdHRhY2gucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvYXR0YWNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFlYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvYXR0YWNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9iaW5kaW5nLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2JpbmRpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MzA3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9iaW5kaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9jb25lY3RlZC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9jb25lY3RlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0MzE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2NvbmVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9jb25lY3RlZC5zdmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9jb25lY3RlZC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNzY3MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2NvbmVjdGVkLnN2ZwpAQCAtMCwwICsxLDE5IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiB3aWR0aD0iMjUiIGhlaWdodD0iMjUiIHZpZXdCb3g9IjAgMCAyNSAyNSI+CisgIDxkZWZzPgorICAgIDxzdHlsZT4KKyAgICAgIC5jbHMtMSB7CisgICAgICAgIGZpbGw6ICMzYjdiOWI7CisgICAgICB9CisKKyAgICAgIC5jbHMtMiB7CisgICAgICAgIGZpbGw6ICNmZmY7CisgICAgICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2RlZnM+CisgIDxnPgorICAgIDxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxMi41IiByPSIxMS41IiBjbGFzcz0iY2xzLTEiLz4KKyAgICA8cGF0aCBkPSJNMTYuMDE2LDE0LjgxMyBDMTQuNzQ3LDE0LjgxMyAxMy43MTksMTMuNzc3IDEzLjcxOSwxMi41MDAgQzEzLjcxOSwxMS4yMjMgMTQuNzQ3LDEwLjE4NyAxNi4wMTYsMTAuMTg3IEMxNy4yODQsMTAuMTg3IDE4LjMxMywxMS4yMjMgMTguMzEzLDEyLjUwMCBDMTguMzEzLDEzLjc3NyAxNy4yODQsMTQuODEzIDE2LjAxNiwxNC44MTMgWk03Ljk4NCwxNC44MTMgQzYuNzE2LDE0LjgxMyA1LjY4NywxMy43NzcgNS42ODcsMTIuNTAwIEM1LjY4NywxMS4yMjMgNi43MTYsMTAuMTg3IDcuOTg0LDEwLjE4NyBDOS4yNTMsMTAuMTg3IDEwLjI4MSwxMS4yMjMgMTAuMjgxLDEyLjUwMCBDMTAuMjgxLDEzLjc3NyA5LjI1MywxNC44MTMgNy45ODQsMTQuODEzIFoiIGNsYXNzPSJjbHMtMiIvPgorICAgIDxwYXRoIGQ9Ik03LjQzMCwxMi45NTcgTDcuNDMwLDEyLjAzNiBMMTcuNTU2LDEyLjAzNiBMMTcuNTU2LDEyLjk1NyBMNy40MzAsMTIuOTU3IFoiIGNsYXNzPSJjbHMtMiIvPgorICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2RlcGVuZGVuY3kucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvZGVwZW5kZW5jeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZDNlNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2RlcGVuZGVuY3kucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2hvc3QucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvaG9zdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzMTRkMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2hvc3QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2xpbmsucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvbGluay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4MWE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2xpbmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2xvY2FsX3N0b3JhZ2UucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvbG9jYWxfc3RvcmFnZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxZWJkOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2xvY2FsX3N0b3JhZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2xvY2FsX3N0b3JhZ2Uuc3ZnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvbG9jYWxfc3RvcmFnZS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1NWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVsYXRpb25zaGlwLWljb25zL2xvY2FsX3N0b3JhZ2Uuc3ZnCkBAIC0wLDAgKzEsMzcgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIHdpZHRoPSIyMyIgaGVpZ2h0PSIyMyIgdmlld0JveD0iMCAwIDIzIDIzIj4KKyAgPGRlZnM+CisgICAgPHN0eWxlPgorICAgICAgLmNscy0xIHsKKyAgICAgICAgZmlsbDogIzNiN2I5YjsKKyAgICAgIH0KKworICAgICAgLmNscy0yIHsKKyAgICAgICAgZmlsbDogI2ZmZjsKKyAgICAgICAgc3Ryb2tlOiAjZmZmOworICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOworICAgICAgICBzdHJva2Utd2lkdGg6IDJweDsKKyAgICAgICAgZmlsdGVyOiB1cmwoI2Ryb3Atc2hhZG93LTEpOworICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CisgICAgICB9CisgICAgPC9zdHlsZT4KKworICAgIDxmaWx0ZXIgaWQ9ImRyb3Atc2hhZG93LTEiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CisgICAgICA8ZmVPZmZzZXQgZHg9IjEuNzE0IiBkeT0iMS4wMyIgaW49IlNvdXJjZUFscGhhIi8+CisgICAgICA8ZmVHYXVzc2lhbkJsdXIgcmVzdWx0PSJkcm9wQmx1ciIvPgorICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIvPgorICAgICAgPGZlQ29tcG9zaXRlIG9wZXJhdG9yPSJpbiIgaW4yPSJkcm9wQmx1ciIgcmVzdWx0PSJkcm9wU2hhZG93Q29tcCIvPgorICAgICAgPGZlQ29tcG9zaXRlIGluPSJTb3VyY2VHcmFwaGljIiByZXN1bHQ9InNoYWRvd2VkIi8+CisgICAgPC9maWx0ZXI+CisgIDwvZGVmcz4KKyAgPGc+CisgICAgPGVsbGlwc2UgY3g9IjExLjU3OCIgY3k9IjExLjEwOSIgcng9IjExLjQyMiIgcnk9IjExLjI2NiIgY2xhc3M9ImNscy0xIi8+CisgICAgPGcgc3R5bGU9ImZpbGw6ICNmZmY7IGZpbHRlcjogdXJsKCNkcm9wLXNoYWRvdy0xKSI+CisgICAgICA8Y2lyY2xlIGN4PSIxNC41IiBjeT0iMTEuNSIgcj0iMi41IiBpZD0iY2lyY2xlLTEiIHN0eWxlPSJzdHJva2U6IGluaGVyaXQ7IGZpbHRlcjogbm9uZTsgZmlsbDogaW5oZXJpdCIgY2xhc3M9ImNscy0yIi8+CisgICAgPC9nPgorICAgIDx1c2UgeGxpbms6aHJlZj0iI2NpcmNsZS0xIiBzdHlsZT0ic3Ryb2tlOiAjZmZmOyBmaWx0ZXI6IG5vbmU7IGZpbGw6IG5vbmUiLz4KKyAgICA8ZyBzdHlsZT0iZmlsbDogI2ZmZjsgZmlsdGVyOiB1cmwoI2Ryb3Atc2hhZG93LTEpIj4KKyAgICAgIDxjaXJjbGUgY3g9IjguNSIgY3k9IjExLjUiIHI9IjIuNSIgaWQ9ImNpcmNsZS0yIiBzdHlsZT0ic3Ryb2tlOiBpbmhlcml0OyBmaWx0ZXI6IG5vbmU7IGZpbGw6IGluaGVyaXQiIGNsYXNzPSJjbHMtMiIvPgorICAgIDwvZz4KKyAgICA8dXNlIHhsaW5rOmhyZWY9IiNjaXJjbGUtMiIgc3R5bGU9InN0cm9rZTogI2ZmZjsgZmlsdGVyOiBub25lOyBmaWxsOiBub25lIi8+CisgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvcm91dC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3JlbGF0aW9uc2hpcC1pY29ucy9yb3V0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTNhZWZhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZWxhdGlvbnNoaXAtaWNvbnMvcm91dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZWRfUExVU19IT1ZFUi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1JlZF9QTFVTX0hPVkVSLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjYyM2IwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZWRfUExVU19IT1ZFUi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9DT0xMQUJPUkFUSU9OLS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX0NPTExBQk9SQVRJT04tLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRlNzZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9DT0xMQUJPUkFUSU9OLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9DT01QVVRFLUFTLVNFUlZJQ0UtLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfQ09NUFVURS1BUy1TRVJWSUNFLS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNzIzYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfQ09NUFVURS1BUy1TRVJWSUNFLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9NRVNTQUdJTkctLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfTUVTU0FHSU5HLS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NWUyMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfTUVTU0FHSU5HLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9NT0JJTElUWS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX01PQklMSVRZLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkzZmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9NT0JJTElUWS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9ORVRXT1JLLS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX05FVFdPUkstLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjdhMjUxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9ORVRXT1JLLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9ORVRXT1JLLUNMT1VELS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX05FVFdPUkstQ0xPVUQtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDYwOTM3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9ORVRXT1JLLUNMT1VELS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9ORVRXT1JLLUwtMS0zLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfTkVUV09SSy1MLTEtMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmODc2YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfTkVUV09SSy1MLTEtMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9ORVRXT1JLLUwtNC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX05FVFdPUkstTC00LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTAyM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9ORVRXT1JLLUwtNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9OT1RJRklDQVRJT04tLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfTk9USUZJQ0FUSU9OLS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhMjFkNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvUmVzb3VyY2VfSWNvbnNfTkJfTk9USUZJQ0FUSU9OLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9PUlBIQU4ucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9PUlBIQU4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjE5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX09SUEhBTi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9QTEFURk9STS1BUy1TRVJWSUNFLS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX1BMQVRGT1JNLUFTLVNFUlZJQ0UtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc2MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9QTEFURk9STS1BUy1TRVJWSUNFLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9TRUNVUklUWS0ucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9TRUNVUklUWS0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTVmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX1NFQ1VSSVRZLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9TRVRUSU5HLS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX1NFVFRJTkctLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWRiM2NlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9TRVRUSU5HLS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9hdmF0ZXIucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19OQl9hdmF0ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOWU2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX05CX2F2YXRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19TVE9SQUdFLUFTLVNFUlZJQ0UucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9SZXNvdXJjZV9JY29uc19TVE9SQUdFLUFTLVNFUlZJQ0UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTExZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL1Jlc291cmNlX0ljb25zX1NUT1JBR0UtQVMtU0VSVklDRS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9hbGNhdGVsTHVjZW50LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYWxjYXRlbEx1Y2VudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5MDk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYWxjYXRlbEx1Y2VudC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9hcHBsaWNhdGlvblNlcnZlci5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2FwcGxpY2F0aW9uU2VydmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBiMzkyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9hcHBsaWNhdGlvblNlcnZlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9hcmljZW50LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYXJpY2VudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjMzZmNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYXJpY2VudC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9hdHQucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9hdHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTgxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2F0dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9ib3JkZXJFbGVtZW50LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYm9yZGVyRWxlbWVudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1MjVjMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYm9yZGVyRWxlbWVudC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9icm9hZHNvZnQucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9icm9hZHNvZnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzlkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2Jyb2Fkc29mdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9icm9jYWRlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYnJvY2FkZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliNzEzMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvYnJvY2FkZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jYWxsX2NvbnRyb2xsLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY2FsbF9jb250cm9sbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZGFjNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY2FsbF9jb250cm9sbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jYW52YXNQbHVzSWNvbi1yZWQucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jYW52YXNQbHVzSWNvbi1yZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTZkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2NhbnZhc1BsdXNJY29uLXJlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jYW52YXNQbHVzSWNvbi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2NhbnZhc1BsdXNJY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmMyODljCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jYW52YXNQbHVzSWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jaXNjby5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2Npc2NvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNjNzcxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jaXNjby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jbG9zZU1vZHVsZS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2Nsb3NlTW9kdWxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRjZjJjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jbG9zZU1vZHVsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jbG9zZU1vZHVsZUhvdmVyLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY2xvc2VNb2R1bGVIb3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmN2NiMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY2xvc2VNb2R1bGVIb3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jbG91ZC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2Nsb3VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRjNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jbG91ZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jbG91ZGVwLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY2xvdWRlcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhYWRiZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY2xvdWRlcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jb21wdXRlLXVuY2VydGlmaWVkLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY29tcHV0ZS11bmNlcnRpZmllZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyNTRkMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY29tcHV0ZS11bmNlcnRpZmllZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jb21wdXRlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY29tcHV0ZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlYjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvY29tcHV0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jb25uZWN0b3IucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jb25uZWN0b3IucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzllZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2Nvbm5lY3Rvci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jcC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2NwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM3ZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9jcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kYXRhYmFzZS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RhdGFiYXNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU3Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kYXRhYmFzZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX2FuYWx5dGljcy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RjYWVfYW5hbHl0aWNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDcxODA0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX2FuYWx5dGljcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX2NvbGxlY3Rvci5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RjYWVfY29sbGVjdG9yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODcwMzYyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX2NvbGxlY3Rvci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX2RhdGFiYXNlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvZGNhZV9kYXRhYmFzZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlNzY4NAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvZGNhZV9kYXRhYmFzZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX21pY3Jvc2VydmljZS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RjYWVfbWljcm9zZXJ2aWNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzNhYmIxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX21pY3Jvc2VydmljZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX3BvbGljeS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RjYWVfcG9saWN5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZiNjVlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX3BvbGljeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX3NvdXJjZS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RjYWVfc291cmNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGJmYTM0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX3NvdXJjZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX3V0aWx0eS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RjYWVfdXRpbHR5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDY4ZWJmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kY2FlX3V0aWx0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kZWZhdWx0LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2MTllMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kZWZhdWx0aWNvbi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2RlZmF1bHRpY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjg4NTlkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9kZWZhdWx0aWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9lcmljc3Nvbi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2VyaWNzc29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTMxNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9lcmljc3Nvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9maXJld2FsbC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2ZpcmV3YWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjUwZjIyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9maXJld2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9mb3J0aW5ldC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2ZvcnRpbmV0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU1MmJlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9mb3J0aW5ldC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9nYXRld2F5LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvZ2F0ZXdheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4YTNhZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvZ2F0ZXdheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9qdW5pcGVyLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvanVuaXBlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5YjE4MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvanVuaXBlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9sb2FkQmFsYW5jZXIucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9sb2FkQmFsYW5jZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWU1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL2xvYWRCYWxhbmNlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9tZXRhc3dpdGNoLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvbWV0YXN3aXRjaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwZGZkZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvbWV0YXN3aXRjaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9tb2R1bGUucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9tb2R1bGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTc0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL21vZHVsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9teXNxbC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL215c3FsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2VlYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9teXNxbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9uZXR3b3JrLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvbmV0d29yay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4ZWVmMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvbmV0d29yay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9uZXR3b3JrcnVsZXMucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9uZXR3b3JrcnVsZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTkxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL25ldHdvcmtydWxlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9ub2tpYV9zaWVtZW5zLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvbm9raWFfc2llbWVucy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhNzAyZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvbm9raWFfc2llbWVucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vYmplY3RTdG9yYWdlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvb2JqZWN0U3RvcmFnZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyMTJiNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvb2JqZWN0U3RvcmFnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vcGVuTW9kdWxlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvb3Blbk1vZHVsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxZDBjMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvb3Blbk1vZHVsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vcGVuTW9kdWxlSG92ZXIucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vcGVuTW9kdWxlSG92ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDZjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL29wZW5Nb2R1bGVIb3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vcmFjbGUucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vcmFjbGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL29yYWNsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vc3NlcC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL29zc2VwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkyMWRiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9vc3NlcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9wZXJzb25lcC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3BlcnNvbmVwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjc0M2I2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9wZXJzb25lcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9wb3J0LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvcG9ydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyODViNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvcG9ydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9wcmVtaXNlc2VwLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvcHJlbWlzZXNlcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkZDgyMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvcHJlbWlzZXNlcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9yb3V0ZXIucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9yb3V0ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDQ4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3JvdXRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWN1cml0eXJ1bGVzLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvc2VjdXJpdHlydWxlcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYWIyNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvc2VjdXJpdHlydWxlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZENQSW5zdGFuY2UucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZENQSW5zdGFuY2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjMwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3NlbGVjdGVkQ1BJbnN0YW5jZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZEluc3RhbmNlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvc2VsZWN0ZWRJbnN0YW5jZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmNWM5MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvc2VsZWN0ZWRJbnN0YW5jZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZFVjcGVJbnN0YW5jZS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3NlbGVjdGVkVWNwZUluc3RhbmNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY4OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZFVjcGVJbnN0YW5jZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZFZMSW5zdGFuY2UucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZWxlY3RlZFZMSW5zdGFuY2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDA3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3NlbGVjdGVkVkxJbnN0YW5jZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZXJ2ZXIucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy9zZXJ2ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTMwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3NlcnZlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy90cm9wby5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3Ryb3BvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE1ZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy90cm9wby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy91Y3BlLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvdWNwZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4ZTQzMAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvdWNwZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy91bmNlcnRpZmllZC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3VuY2VydGlmaWVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWQ3NDdhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy91bmNlcnRpZmllZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy92ZncucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy92ZncucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWRjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3Zmdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy92bC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Jlc291cmNlLWljb25zL3ZsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIyZmMwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy92bC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy92cm91dGVyLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvdnJvdXRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlODllNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvdnJvdXRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9yZXNvdXJjZS1pY29ucy93YW54LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvd2FueC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhNDkzYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvcmVzb3VyY2UtaWNvbnMvd2FueC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2NhbGxfY29udHJvbGwucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2NhbGxfY29udHJvbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMWQ5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3NlcnZpY2UtaWNvbnMvY2FsbF9jb250cm9sbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2NvbGxhYm9yYXRpb24ucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2NvbGxhYm9yYXRpb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzRiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3NlcnZpY2UtaWNvbnMvY29sbGFib3JhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2NvbGxhYm9yYXRpb24xLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9jb2xsYWJvcmF0aW9uMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4MDkzMQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9jb2xsYWJvcmF0aW9uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2NvbXB1dGUucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2NvbXB1dGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMmIxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3NlcnZpY2UtaWNvbnMvY29tcHV0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL2RlZmF1bHRpY29uLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9kZWZhdWx0aWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmZWFkMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9kZWZhdWx0aWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL21lc3NhZ2luZy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3NlcnZpY2UtaWNvbnMvbWVzc2FnaW5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjVmMTRkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL21lc3NhZ2luZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL21vYmlsaXR5LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9tb2JpbGl0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YzQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9tb2JpbGl0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL25ldHdvcmtfbF8xLTMucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL25ldHdvcmtfbF8xLTMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGMyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3NlcnZpY2UtaWNvbnMvbmV0d29ya19sXzEtMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL25ldHdvcmtfbF80LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9uZXR3b3JrX2xfNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwNWUxYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9uZXR3b3JrX2xfNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL25vdGlmaWNhdGlvbi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3NlcnZpY2UtaWNvbnMvbm90aWZpY2F0aW9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWRlMzRjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL25vdGlmaWNhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL3BsYXRmb3JtLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9wbGF0Zm9ybS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0ZWFlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy9wbGF0Zm9ybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL3N0b3JhZ2UucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL3N0b3JhZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmZkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3NlcnZpY2UtaWNvbnMvc3RvcmFnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zZXJ2aWNlLWljb25zL3VuY2VydGlmaWVkLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy91bmNlcnRpZmllZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkNzQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc2VydmljZS1pY29ucy91bmNlcnRpZmllZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwtb2xkLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc3ByaXRlcy9zcHJpdGUtZ2xvYmFsLW9sZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwMTRmNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc3ByaXRlcy9zcHJpdGUtZ2xvYmFsLW9sZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMjMzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLWdsb2JhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1wcm9kdWN0LWljb25zLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc3ByaXRlcy9zcHJpdGUtcHJvZHVjdC1pY29ucy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NDY3YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvc3ByaXRlcy9zcHJpdGUtcHJvZHVjdC1pY29ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1yZXNvdXJjZS1pY29ucy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLXJlc291cmNlLWljb25zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk4OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1yZXNvdXJjZS1pY29ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1zZXJ2aWNlcy1pY29ucy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLXNlcnZpY2VzLWljb25zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE5ZmExCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1zZXJ2aWNlcy1pY29ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Rsdi1zcHJpdGUucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy9zcHJpdGVzL3Rsdi1zcHJpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTFjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3Nwcml0ZXMvdGx2LXNwcml0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzEwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTJkNDhmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzExLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzRmOGFlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzEzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMzNWRkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFiYzlmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjcyMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTAwNWJkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI4NzVlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xNy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xOC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI5YjVhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xOC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xOS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzE5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM3NDkyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8xOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxNDFiZAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg0OWIwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTYwYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDRhNzFjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzIzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU0ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlmYTI4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MThjZjRhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQ4ODVlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM3Mzc4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yNy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yOC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGM1YWRhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yOC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yOS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzI5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTA3MDEwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8yOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8zLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxYTg2YgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8zMC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3R1dG9yaWFsLzMwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjgzZGIwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC8zMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC80LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjMTQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC81LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4ZTUyNQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC82LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczZGM1NQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC83LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzMTM3NgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvNy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy90dXRvcmlhbC84LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvOC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmOTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvdHV0b3JpYWwvOC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzNGEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL1NEJkNfV2VsY29tZTE1LmpwZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9TRCZDX1dlbGNvbWUxNS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzYjIyOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9TRCZDX1dlbGNvbWUxNS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL1NEJkNfV2VsY29tZTE1X2IuanBnIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL1NEJkNfV2VsY29tZTE1X2IuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTQyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvU0QmQ19XZWxjb21lMTVfYi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMS5qcGcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvMDAxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJjNzZiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMi5qcGcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvMDAyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDVmYzJlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvMDAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U3YTdjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvMDAzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzNiMTRmCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwNC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvMDA0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODU3OGJiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnLzAwNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2JnMDIucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2JnMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTBhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvYmcwMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2JnMDMucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2JnMDMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmU5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvYmcwMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2Nvbm5lY3Rpb24wMi5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvY29ubmVjdGlvbjAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdhY2JhCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2Nvbm5lY3Rpb24wMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2Nvbm5lY3Rpb24wMy5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvY29ubmVjdGlvbjAzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWYyMWZjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2Nvbm5lY3Rpb24wMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2Nvbm5lY3Rpb24wNC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvY29ubmVjdGlvbjA0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzRkYmZlCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2Nvbm5lY3Rpb24wNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2dsb2JhbC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvZ2xvYmFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWIzNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL2dsb2JhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDIucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDAwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvc2hhcGUwMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDMucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjM4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvc2hhcGUwMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDQucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NzU5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvc2hhcGUwNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDUucG5nIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjQxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvYmcvc2hhcGUwNS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2xhcHRvcC5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvbGFwdG9wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBlNzQzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2xhcHRvcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL2xvZ29fYXR0LnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9sb2dvX2F0dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0NWExYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9sb2dvX2F0dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL3Nwcml0ZS5wbmcgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvaW1hZ2VzL3dlbGNvbWUvc3ByaXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmI3NTQyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL3Nwcml0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL3NzLTAxLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9zcy0wMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkNGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9zcy0wMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL3NzLTAyLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9zcy0wMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkMDAzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9zcy0wMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2ltYWdlcy93ZWxjb21lL3NzLTAzLnBuZyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9zcy0wMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyNTljYQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9pbWFnZXMvd2VsY29tZS9zcy0wMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL2xheW91dC9oZWFkZXIubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9sYXlvdXQvaGVhZGVyLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlOTVlOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9sYXlvdXQvaGVhZGVyLmxlc3MKQEAgLTAsMCArMSw3OCBAQAorLnctc2RjLWhlYWRlciB7CisgICAgLmJnX2o7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfYzsKKyAgICBoZWlnaHQ6IDk0cHg7CisgICAgd2lkdGg6IDEwMCU7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworfQorCisudy1zZGMtaGVhZGVyLWxvZ28geworICAgIC5iZ19pOworICAgIC5oYW5kOworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2E7CisgICAgaGVpZ2h0OiA5NHB4OworICAgIHdpZHRoOiAyNDBweDsKKyAgICBwYWRkaW5nOiAyOHB4OworICAgIC5mbGV4LWZpeGVkKDI0MHB4KTsKKyAgICB6LWluZGV4OiAxMDIwOworfQorCisudy1zZGMtaGVhZGVyLWxvZ28taWNvbiB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIG1hcmdpbi1yaWdodDogOHB4OworICAgIHZlcnRpY2FsLWFsaWduOiAtNnB4OworfQorCithLnctc2RjLWhlYWRlci1sb2dvLWxpbmsgeworICAgIC5jXzU7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisudy1zZGMtaGVhZGVyLXZlcnNpb257CisgICAgLmNfMTY7CisgICAgLm9wYWNpdHkoMC42KTsKK30KKworLmktc2RjLWhlYWRlci1jYXB0aW9uIHsKKyAgICBtaW4td2lkdGg6IDE3NXB4OworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgY3Vyc29yOiBkZWZhdWx0OworICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgZmxleC1ncm93OiAxMDsKKyAgICBwYWRkaW5nLWxlZnQ6IDI3cHg7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKworICAgIC5pLXNkYy1oZWFkZXItY2FwdGlvbi10ZXh0IHsKKyAgICAgICAgLmlfMTE7CisgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworCisgICAgfQorCisgICAgLmktc2RjLWhlYWRlci1oZWxwIHsKKyAgICAgICAgLmlfMTsKKyAgICAgICAgLmhhbmQ7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAyNnB4OworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKworICAgICAgICAmOjpiZWZvcmUgeworICAgICAgICAgICAgLmJnX2E7CisgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CisgICAgICAgICAgICBjb2xvcjogQGNvbG9yX2M7CisgICAgICAgICAgICBjb250ZW50OiAnPyc7CisgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgICAgIGhlaWdodDogMjBweDsKKyAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgICAgIGxlZnQ6IC0yNnB4OworICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICAgICAgd2lkdGg6IDIwcHg7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy5zZGMtZXJyb3ItNDAzLWNvbnRhaW5lci10aXRsZSB7CisgICAgLmJfMTE7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbGF5b3V0L21haW4ubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9sYXlvdXQvbWFpbi5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWRhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbGF5b3V0L21haW4ubGVzcwpAQCAtMCwwICsxLDEyNCBAQAorLmZ1bGwtaGVpZ2h0IHsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW5fY29sb3JfbAorfQorCisudy1zZGMtbWFpbi1jb250YWluZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IEBoZWFkZXJfaGVpZ2h0ICsgQHRvcF9uYXZfaGVpZ2h0OworICAgIGxlZnQ6IDA7CisgICAgcmlnaHQ6IDA7CisgICAgYm90dG9tOiAwOworCisgICAgLnctc2RjLW1haW4tcmlnaHQtY29udGFpbmVyIHsKKyAgICAgICAgLmJnX247CisgICAgICAgIGJvdHRvbTogMDsKKyAgICAgICAgcGFkZGluZzogMjJweCAxMnB4OworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIGxlZnQ6IDI0MHB4OworICAgICAgICByaWdodDogMDsKKyAgICAgICAgdG9wOiAwOworICAgICAgICBvdmVyZmxvdzogaGlkZGVuOworCisKKyAgICAgICAgJiA+IGRpdjpmaXJzdC1jaGlsZCB7IC8qIHNjcm9sbCBmaXggKi8KKyAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiA4MHB4OworICAgICAgICB9CisgICAgfQorfQorCisuc2RjLWxvYWRpbmctcGFnZSB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGhlaWdodDogMTAwJTsKKyAgICB3aWR0aDogMTAwJTsKKworICAgIC5jYXB0aW9uMSB7CisgICAgICAgIC5wXzI0OworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgfQorCisgICAgLmNhcHRpb24yIHsKKyAgICAgICAgLnBfMTZfbTsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgfQorfQorCisubWFpbi1sb2FkZXIgeworICAgIEBncmVlbjogI2NjY2NjYzsKKyAgICBAYmx1ZTogI2RkZGRkZDsKKyAgICBAcmVkOiAjZWVlZWVlOworICAgIEB5ZWxsb3c6ICNiYmJiYmI7CisgICAgQHdoaXRlOiAjZmZmZmZmOworCisgICAgQHdpZHRoOiA4MHB4OworCisgICAgLmxvYWRlciB7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgbWFyZ2luOiAwcHggYXV0bzsKKyAgICAgICAgd2lkdGg6IEB3aWR0aDsKKyAgICAgICAgJjpiZWZvcmUgeworICAgICAgICAgICAgY29udGVudDonJzsKKyAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICAgICAgcGFkZGluZy10b3A6IDEwMCU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuY2lyY3VsYXIgeworICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7CisgICAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAwOyBib3R0b206IDA7IGxlZnQ6IDA7IHJpZ2h0OiAwOworICAgICAgICBtYXJnaW46IGF1dG87CisgICAgfQorCisKKyAgICAucGF0aCB7CisgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEsMjAwOworICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDsKKyAgICAgICAgYW5pbWF0aW9uOgorICAgICAgICBkYXNoIDEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUsCisgICAgICAgIGNvbG9yIDZzIGVhc2UtaW4tb3V0IGluZmluaXRlOworICAgICAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7CisgICAgfQorCisgICAgQGtleWZyYW1lcyByb3RhdGV7CisgICAgICAgIDEwMCV7CisgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOworICAgICAgICB9CisgICAgfQorICAgIEBrZXlmcmFtZXMgZGFzaHsKKyAgICAgICAgMCV7CisgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLDIwMDsKKyAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwOworICAgICAgICB9CisgICAgICAgIDUwJXsKKyAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDg5LDIwMDsKKyAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtMzVweDsKKyAgICAgICAgfQorICAgICAgICAxMDAleworICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogODksMjAwOworICAgICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IC0xMjRweDsKKyAgICAgICAgfQorICAgIH0KKyAgICBAa2V5ZnJhbWVzIGNvbG9yeworICAgICAgICAxMDAlLCAwJXsKKyAgICAgICAgICAgIHN0cm9rZTogQHJlZDsKKyAgICAgICAgfQorICAgICAgICA0MCV7CisgICAgICAgICAgICBzdHJva2U6IEBibHVlOworICAgICAgICB9CisgICAgICAgIDY2JXsKKyAgICAgICAgICAgIHN0cm9rZTogQGdyZWVuOworICAgICAgICB9CisgICAgICAgIDgwJSwgOTAleworICAgICAgICAgICAgc3Ryb2tlOiBAeWVsbG93OworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbGF5b3V0L3NpZGViYXIubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9sYXlvdXQvc2lkZWJhci5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGRjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbGF5b3V0L3NpZGViYXIubGVzcwpAQCAtMCwwICsxLDE2MyBAQAorLnctc2RjLWxlZnQtc2lkZWJhciB7CisgICAgd2lkdGg6IDI0MnB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW5fY29sb3JfcDsKKyAgICAuYm94LXNoYWRvdygxcHggMHB4IDRweCAwcHggcmdiYSgyNCwgMjQsIDI1LCAwLjE3KSk7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGxlZnQ6IDA7CisgICAgdG9wOiAwOworICAgIGJvdHRvbTogMDsKKyAgICBwYWRkaW5nOiAxMnB4IDE4cHg7CisgICAgei1pbmRleDogMTsKK30KKworLnctc2RjLWxlZnQtc2lkZWJhci1tZW51IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKworICAgIHVsIHsKKyAgICAgICAgbWFyZ2luOiAwOworICAgICAgICBwYWRkaW5nOiAwOworICAgIH0KK30KKworLyogQ2F0YWxvZyAqLworLmktc2RjLWxlZnQtc2lkZWJhci1uYXYtaXRlbSB7CisgICAgLmNfNjsKKyAgICAuaGFuZDsKKyAgICAuYm9yZGVyLXJhZGl1cyg0cHgpOworICAgIHdpZHRoOiAyMjBweDsKKyAgICBoZWlnaHQ6IDYwcHg7CisgICAgbGluZS1oZWlnaHQ6IDE5cHg7CisgICAgbWFyZ2luOiAwIGF1dG8gMTBweDsKKyAgICBwYWRkaW5nOiAyMHB4IDEwcHggMjBweCA2MHB4OworICAgIGJveC1zaGFkb3c6IDAgMCAycHggMCByZ2JhKDAsIDAsIDAsIC4zKTsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworCisgICAgJjo6YmVmb3JlIHsKKyAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgY29udGVudDogJyc7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgbGVmdDogNTBweDsKKyAgICAgICAgdG9wOiAxOHB4OworICAgIH0KKworICAgICYuY2F0YWxvZyB7CisgICAgICAgIC5jXzQ7CisgICAgICAgIC5iZ19hOworICAgICAgICAudXBwZXJjYXNlOworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIHRleHQtaW5kZW50OiAyMHB4OworCisgICAgICAgICY6aG92ZXIgICAgIHsgLmJnX2FfaG92ZXI7IH0KKyAgICAgICAgJjo6YmVmb3JlICAgey5zcHJpdGUuY2F0YWxvZzt9CisgICAgfQorCisgICAgJi5kaXN0cmlidXRpb24geworICAgICAgICAuYmdfbzsKKyAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIH0KKyAgICAmLmRpc3RyaWJ1dGlvbjo6YmVmb3JlIHsKKyAgICAgICAgLnNwcml0ZS5kaXN0cmlidXRpb247CisgICAgfQorCisgICAgJi5zdXBwb3J0IHsKKyAgICAgICAgLmJnX2E7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB9CisKKyAgICAmLnN1cHBvcnQ6OmJlZm9yZSB7CisgICAgICAgIC5zcHJpdGUuc3VwcG9ydDsKKworICAgIH0KK30KKworCisvKiAgKi8KKy5pLXNkYy1sZWZ0LXNpZGViYXItbmF2LWl0ZW0taGllcmFjaHkgeworICAgICAuY182OworICAgIC5oYW5kOworICAgIC5ib3JkZXItcmFkaXVzKDRweCk7CisgICAgd2lkdGg6IDIyMHB4OworICAgIGhlaWdodDogNjBweDsKKyAgICBsaW5lLWhlaWdodDogMTlweDsKKyAgICBtYXJnaW46IDAgYXV0byAxMHB4OworICAgIHBhZGRpbmc6IDIwcHggMTBweCAyMHB4IDYwcHg7CisgICAgYm94LXNoYWRvdzogMCAwIDJweCAwIHJnYmEoMCwgMCwgMCwgLjMpOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisKKyAgICAmOjpiZWZvcmUgeworICAgICAgICAuc3ByaXRlOworICAgICAgICBjb250ZW50OiAnJzsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICBsZWZ0OiA1MHB4OworICAgICAgICB0b3A6IDE4cHg7CisgICAgfQorCisgICAgJi5jYXRhbG9nIHsKKyAgICAgICAgLmNfNDsKKyAgICAgICAgLmJnX2E7CisgICAgICAgIC51cHBlcmNhc2U7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdGV4dC1pbmRlbnQ6IDIwcHg7CisKKyAgICAgICAgJjpob3ZlciAgICAgeyAuYmdfYV9ob3ZlcjsgfQorICAgICAgICAmOjpiZWZvcmUgICB7LnNwcml0ZS5jYXRhbG9nO30KKyAgICB9CisKKyAgICAmLmRpc3RyaWJ1dGlvbiB7CisgICAgICAgIC5iZ19vOworICAgICAgICBkaXNwbGF5OiBub25lOworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgfQorICAgICYuZGlzdHJpYnV0aW9uOjpiZWZvcmUgeworICAgICAgICAuc3ByaXRlLmRpc3RyaWJ1dGlvbjsKKyAgICB9CisKKyAgICAmLnN1cHBvcnQgeworICAgICAgICAuYmdfYTsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIH0KKworICAgICYuc3VwcG9ydDo6YmVmb3JlIHsKKyAgICAgICAgLnNwcml0ZS5zdXBwb3J0OworCisgICAgfQorfQorCisvKiBEYXNoYm9hcmQgKE5vbiBDYXRhbG9nKSAqLworLmktc2RjLWxlZnQtc2lkZWJhci1pdGVtIHsKKyAgICBsaXN0LXN0eWxlOiBub25lOworICAgIC5tXzE0X3I7CisgICAgbGluZS1oZWlnaHQ6IDI0cHg7CisKKyAgICAmLmNhdGVnb3J5LXRpdGxlIHsKKyAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgICAgICAgLmxfMTRfbTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDMwcHg7CisgICAgfQorCisgICAgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CisgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHN1YjsKKyAgICB9CisKKyAgICAvKiYuc2VsZWN0ZWRMaW5rIHsKKyAgICAgICAgLmNfNzsKKyAgICB9Ki8KKworICAgIC5pLXNkYy1sZWZ0LXNpZGViYXItaXRlbS1zdGF0ZS1jb3VudCB7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICB9CisKKyAgICAuc2RjLWVsZW1lbnQtY2hlY2tib3ggeworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKKyAgICB9CisKK30KKworLmktc2RjLWxlZnQtc2lkZWJhci1pdGVtLXNlcGVyYXRvciB7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBmdW5jX2NvbG9yX3I7CisgICAgd2lkdGg6IDIwOHB4OworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL21peGlucy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL21peGlucy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDQxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbWl4aW5zLmxlc3MKQEAgLTAsMCArMSwyMTcgQEAKK0BpbXBvcnQgInZhcmlhYmxlcyI7CisKKy5mLWNvbG9yIHsKKyAgICAuYSB7Y29sb3I6ICBAbWFpbl9jb2xvcl9hO30KKyAgICAuYiB7Y29sb3I6ICBAbWFpbl9jb2xvcl9iO30KKyAgICAuYyB7Y29sb3I6ICBAbWFpbl9jb2xvcl9jO30KKyAgICAuZCB7Y29sb3I6ICBAbWFpbl9jb2xvcl9kO30KKyAgICAuZSB7Y29sb3I6ICBAbWFpbl9jb2xvcl9lO30KKyAgICAuZiB7Y29sb3I6ICBAbWFpbl9jb2xvcl9mO30KKyAgICAuZyB7Y29sb3I6ICBAbWFpbl9jb2xvcl9nO30KKyAgICAuaCB7Y29sb3I6ICBAbWFpbl9jb2xvcl9oO30KKyAgICAuaSB7Y29sb3I6ICBAbWFpbl9jb2xvcl9pO30KKyAgICAuaiB7Y29sb3I6ICBAbWFpbl9jb2xvcl9qO30KKyAgICAuayB7Y29sb3I6ICBAbWFpbl9jb2xvcl9rO30KKyAgICAubCB7Y29sb3I6ICBAbWFpbl9jb2xvcl9sO30KKyAgICAubSB7Y29sb3I6ICBAbWFpbl9jb2xvcl9tO30KKyAgICAubiB7Y29sb3I6ICBAbWFpbl9jb2xvcl9uO30KKyAgICAubyB7Y29sb3I6ICBAbWFpbl9jb2xvcl9vO30KKyAgICAucCB7Y29sb3I6ICBAbWFpbl9jb2xvcl9wO30KKworICAgIC5xIHtjb2xvcjogIEBmdW5jX2NvbG9yX3E7fQorICAgIC5yIHtjb2xvcjogIEBmdW5jX2NvbG9yX3I7fQorICAgIC5zIHtjb2xvcjogIEBmdW5jX2NvbG9yX3M7fQorCisgICAgLnQge2NvbG9yOiAgQHRsdl9jb2xvcl90O30KKyAgICAudSB7Y29sb3I6ICBAdGx2X2NvbG9yX3U7fQorICAgIC52IHtjb2xvcjogIEB0bHZfY29sb3Jfdjt9CisKKworfQorCisuZi10eXBlIHsKKyAgICAuXzM2IHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLWxpZ2h0OworICAgICAgICBmb250LXNpemU6IDM2cHg7CisgICAgfQorICAgIC5fMjQgeworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtbGlnaHQ7CisgICAgICAgIGZvbnQtc2l6ZTogMjRweDsKKyAgICB9CisgICAgLl8xOF9yIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLXJlZ3VsYXI7CisgICAgICAgIGZvbnQtc2l6ZTogMThweDsKKyAgICB9CisgICAgLl8xOF9tIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAxOHB4OworICAgIH0KKyAgICAuXzE2X3IgeworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtcmVndWxhcjsKKyAgICAgICAgZm9udC1zaXplOiAxNnB4OworICAgIH0KKyAgICAuXzE2X20geworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtbWVkaXVtOworICAgICAgICBmb250LXNpemU6IDE2cHg7CisgICAgfQorICAgIC5fMTRfciB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1yZWd1bGFyOworICAgICAgICBmb250LXNpemU6IDE0cHg7CisgICAgfQorICAgIC5fMTRfbSB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1tZWRpdW07CisgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICB9CisgICAgLl8xNF9pIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bS1pdGFsaWM7CisgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICB9CisgICAgLl8xM19yIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLXJlZ3VsYXI7CisgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKKyAgICB9CisgICAgLl8xM19tIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAxM3B4OworICAgIH0KKyAgICAuXzEzX2kgeworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtbWVkaXVtLWl0YWxpYzsKKyAgICAgICAgZm9udC1zaXplOiAxM3B4OworICAgIH0KKyAgICAuXzEyX3IgeworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtcmVndWxhcjsKKyAgICAgICAgZm9udC1zaXplOiAxMnB4OworICAgIH0KKyAgICAuXzEyX20geworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtbWVkaXVtOworICAgICAgICBmb250LXNpemU6IDEycHg7CisgICAgfQorICAgIC5fMTJfaSB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1tZWRpdW0taXRhbGljOworICAgICAgICBmb250LXNpemU6IDEycHg7CisgICAgfQorfQorCisuYnVpbGRGb3JDb2xvcihhKTsKKy5idWlsZEZvckNvbG9yKGIpOworLmJ1aWxkRm9yQ29sb3IoYyk7CisuYnVpbGRGb3JDb2xvcihkKTsKKy5idWlsZEZvckNvbG9yKGUpOworLmJ1aWxkRm9yQ29sb3IoZik7CisuYnVpbGRGb3JDb2xvcihnKTsKKy5idWlsZEZvckNvbG9yKGgpOworLmJ1aWxkRm9yQ29sb3IoaSk7CisuYnVpbGRGb3JDb2xvcihqKTsKKy5idWlsZEZvckNvbG9yKGspOworLmJ1aWxkRm9yQ29sb3IobCk7CisuYnVpbGRGb3JDb2xvcihtKTsKKy5idWlsZEZvckNvbG9yKG4pOworLmJ1aWxkRm9yQ29sb3Iobyk7CisuYnVpbGRGb3JDb2xvcihwKTsKKworLmJ1aWxkRm9yRnVuY0NvbG9yKHEpOworLmJ1aWxkRm9yRnVuY0NvbG9yKHIpOworLmJ1aWxkRm9yRnVuY0NvbG9yKHMpOworCisuYnVpbGRGb3JUbHZDb2xvcih0KTsKKy5idWlsZEZvclRsdkNvbG9yKHUpOworLmJ1aWxkRm9yVGx2Q29sb3Iodik7CisKKworLmJ1aWxkRm9yQ29sb3IoQGMpeworICAgIC5Ae2N9XzM2ICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8zNjt9CisgICAgLkB7Y31fMjQgIHsgY29sb3I6ICB+IkB7bWFpbl9jb2xvcl9Ae2N9fSI7IC5mLXR5cGUgPiAuXzI0O30KKyAgICAuQHtjfV8xOF9yICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xOF9yO30KKyAgICAuQHtjfV8xOF9tICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xOF9tO30KKyAgICAuQHtjfV8xNl9yICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xNl9yO30KKyAgICAuQHtjfV8xNl9tICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xNl9tO30KKyAgICAuQHtjfV8xNF9yICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xNF9yO30KKyAgICAuQHtjfV8xNF9tICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xNF9tO30KKyAgICAuQHtjfV8xNF9pICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xNF9pO30KKyAgICAuQHtjfV8xM19yICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xM19yO30KKyAgICAuQHtjfV8xM19tICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xM19tO30KKyAgICAuQHtjfV8xM19pICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xM19pO30KKyAgICAuQHtjfV8xMl9yICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xMl9yO30KKyAgICAuQHtjfV8xMl9tICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xMl9tO30KKyAgICAuQHtjfV8xMl9pICB7IGNvbG9yOiAgfiJAe21haW5fY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xMl9pO30KK30KKworLmJ1aWxkRm9yRnVuY0NvbG9yKEBjKXsKKyAgICAuQHtjfV8zNiAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMzY7fQorICAgIC5Ae2N9XzI0ICB7IGNvbG9yOiAgfiJAe2Z1bmNfY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8yNDt9CisgICAgLkB7Y31fMThfciAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMThfcjt9CisgICAgLkB7Y31fMThfbSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMThfbTt9CisgICAgLkB7Y31fMTZfciAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTZfcjt9CisgICAgLkB7Y31fMTZfbSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTZfbTt9CisgICAgLkB7Y31fMTRfciAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTRfcjt9CisgICAgLkB7Y31fMTRfbSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTRfbTt9CisgICAgLkB7Y31fMTRfaSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTRfaTt9CisgICAgLkB7Y31fMTNfciAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTNfcjt9CisgICAgLkB7Y31fMTNfbSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTNfbTt9CisgICAgLkB7Y31fMTNfaSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTNfaTt9CisgICAgLkB7Y31fMTJfciAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTJfcjt9CisgICAgLkB7Y31fMTJfbSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTJfbTt9CisgICAgLkB7Y31fMTJfaSAgeyBjb2xvcjogIH4iQHtmdW5jX2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTJfaTt9Cit9CisKKworLmJ1aWxkRm9yVGx2Q29sb3IoQGMpeworICAgIC5Ae2N9XzM2ICB7IGNvbG9yOiAgfiJAe3Rsdl9jb2xvcl9Ae2N9fSI7IC5mLXR5cGUgPiAuXzM2O30KKyAgICAuQHtjfV8yNCAgeyBjb2xvcjogIH4iQHt0bHZfY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8yNDt9CisgICAgLkB7Y31fMThfciAgeyBjb2xvcjogIH4iQHt0bHZfY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xOF9yO30KKyAgICAuQHtjfV8xOF9tICB7IGNvbG9yOiAgfiJAe3Rsdl9jb2xvcl9Ae2N9fSI7IC5mLXR5cGUgPiAuXzE4X207fQorICAgIC5Ae2N9XzE2X3IgIHsgY29sb3I6ICB+IkB7dGx2X2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTZfcjt9CisgICAgLkB7Y31fMTZfbSAgeyBjb2xvcjogIH4iQHt0bHZfY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xNl9tO30KKyAgICAuQHtjfV8xNF9yICB7IGNvbG9yOiAgfiJAe3Rsdl9jb2xvcl9Ae2N9fSI7IC5mLXR5cGUgPiAuXzE0X3I7fQorICAgIC5Ae2N9XzE0X20gIHsgY29sb3I6ICB+IkB7dGx2X2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTRfbTt9CisgICAgLkB7Y31fMTRfaSAgeyBjb2xvcjogIH4iQHt0bHZfY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xNF9pO30KKyAgICAuQHtjfV8xM19yICB7IGNvbG9yOiAgfiJAe3Rsdl9jb2xvcl9Ae2N9fSI7IC5mLXR5cGUgPiAuXzEzX3I7fQorICAgIC5Ae2N9XzEzX20gIHsgY29sb3I6ICB+IkB7dGx2X2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTNfbTt9CisgICAgLkB7Y31fMTNfaSAgeyBjb2xvcjogIH4iQHt0bHZfY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xM19pO30KKyAgICAuQHtjfV8xMl9yICB7IGNvbG9yOiAgfiJAe3Rsdl9jb2xvcl9Ae2N9fSI7IC5mLXR5cGUgPiAuXzEyX3I7fQorICAgIC5Ae2N9XzEyX20gIHsgY29sb3I6ICB+IkB7dGx2X2NvbG9yX0B7Y319IjsgLmYtdHlwZSA+IC5fMTJfbTt9CisgICAgLkB7Y31fMTJfaSAgeyBjb2xvcjogIH4iQHt0bHZfY29sb3JfQHtjfX0iOyAuZi10eXBlID4gLl8xMl9pO30KK30KKworLmRpc2FibGVkIHsKKyAgICBvcGFjaXR5OiAwLjQgIWltcG9ydGFudDsKKyAgICBjdXJzb3I6IGF1dG87CisgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cit9CisKKy8qIEknbSBub3QgdXNpbmcgaGlkZGVuIG5hbWUsIGNhbiBub3Qgb3ZlcnJpZGUgYm93ZXJfY29tcG9uZW50cy9ib290c3RyYXAvZGlzdC9jc3MvbGVzcy9yZXNwb25zaXZlLXV0aWxpdGllcy5sZXNzICovCisuaGlkZW1lIHsKKyAgICB2aXNpYmlsaXR5OiBoaWRkZW47Cit9CisKKy52aWV3LW1vZGUgeworICAgIG9wYWNpdHk6IDE7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW5fY29sb3JfbzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OworICAgIGN1cnNvcjogYXV0bzsKKworICAgICYgKyAmOm5vdCguaWNvbnMtdGV4dCksICYubm8tYm9yZGVyLXRvcCB7CisgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKKyAgICB9Cit9CisKKy5uby1wb2ludGVyLWV2ZW50cyB7CisgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cit9CisKKy51bnNlbGVjdGFibGUgeworICAgIC1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTsKKyAgICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CisgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CisgICAgdXNlci1zZWxlY3Q6IG5vbmU7Cit9CisKKy5zZWxlY3RhYmxlIHsKKyAgICAtbW96LXVzZXItc2VsZWN0OiB0ZXh0OworICAgIC1raHRtbC11c2VyLXNlbGVjdDogdGV4dDsKKyAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0OworICAgIC1tcy11c2VyLXNlbGVjdDogdGV4dDsKKyAgICB1c2VyLXNlbGVjdDogdGV4dDsKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9taXhpbnNfb2xkLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbWl4aW5zX29sZC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNGY2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbWl4aW5zX29sZC5sZXNzCkBAIC0wLDAgKzEsNTU4IEBACitAaW1wb3J0ICJ2YXJpYWJsZXMiOworCisuZm9udC1jb2xvciB7CisgICAgLmEge2NvbG9yOiAgQGNvbG9yX2E7fQorICAgIC5iIHtjb2xvcjogIEBjb2xvcl9iO30KKyAgICAuYyB7Y29sb3I6ICBAY29sb3JfYzt9CisgICAgLmQge2NvbG9yOiAgQGNvbG9yX2Q7fQorICAgIC5lIHtjb2xvcjogIEBjb2xvcl9lO30KKyAgICAuZiB7Y29sb3I6ICBAY29sb3JfZjt9CisgICAgLmcge2NvbG9yOiAgQGNvbG9yX2c7fQorICAgIC5oIHtjb2xvcjogIEBjb2xvcl9oO30KKyAgICAuaSB7Y29sb3I6ICBAY29sb3JfaTt9CisgICAgLmoge2NvbG9yOiAgQGNvbG9yX2o7fQorICAgIC5rIHtjb2xvcjogIEBjb2xvcl9rO30KKyAgICAubCB7Y29sb3I6ICBAY29sb3JfbDt9CisgICAgLm0ge2NvbG9yOiAgQGNvbG9yX207fQorICAgIC5uIHtjb2xvcjogIEBjb2xvcl9uO30KKyAgICAubyB7Y29sb3I6ICBAY29sb3Jfbzt9CisgICAgLnAge2NvbG9yOiAgQGNvbG9yX3A7fQorICAgIC5xIHtjb2xvcjogIEBjb2xvcl9xO30KKyAgICAuciB7Y29sb3I6ICBAY29sb3Jfcjt9CisgICAgLnMge2NvbG9yOiAgQGNvbG9yX3M7fQorICAgIC50IHtjb2xvcjogIEBjb2xvcl90O30KKyAgICAudSB7Y29sb3I6ICBAY29sb3JfdDt9CisgICAgLnYge2NvbG9yOiAgQGNvbG9yX3Q7fQorICAgIC53IHtjb2xvcjogIEBjb2xvcl90O30KKyAgICAueCB7Y29sb3I6ICBAY29sb3JfdDt9CisgICAgLnkge2NvbG9yOiAgQGNvbG9yX3Q7fQorICAgIC56IHtjb2xvcjogIEBjb2xvcl96O30KKyAgICAuenoge2NvbG9yOiAgQGNvbG9yX3p6O30KKworICAgIC5ob3ZlciB7CisgICAgICAgIC5hIHtjb2xvcjogQGNvbG9yX2FfaG92ZXI7fQorICAgICAgICAuYiB7Y29sb3I6IEBjb2xvcl9iX2hvdmVyO30KKyAgICAgICAgLmMge2NvbG9yOiBAY29sb3JfY19ob3Zlcjt9CisgICAgICAgIC5kIHtjb2xvcjogQGNvbG9yX2RfaG92ZXI7fQorICAgICAgICAuZSB7Y29sb3I6IEBjb2xvcl9lX2hvdmVyO30KKyAgICAgICAgLmYge2NvbG9yOiBAY29sb3JfZl9ob3Zlcjt9CisgICAgICAgIC5nIHtjb2xvcjogQGNvbG9yX2dfaG92ZXI7fQorICAgICAgICAuaCB7Y29sb3I6IEBjb2xvcl9oX2hvdmVyO30KKyAgICAgICAgLmkge2NvbG9yOiBAY29sb3JfaV9ob3Zlcjt9CisgICAgICAgIC5qIHtjb2xvcjogQGNvbG9yX2pfaG92ZXI7fQorICAgICAgICAuayB7Y29sb3I6IEBjb2xvcl9rX2hvdmVyO30KKyAgICAgICAgLmwge2NvbG9yOiBAY29sb3JfbF9ob3Zlcjt9CisgICAgICAgIC5tIHtjb2xvcjogQGNvbG9yX21faG92ZXI7fQorICAgICAgICAubiB7Y29sb3I6IEBjb2xvcl9uX2hvdmVyO30KKyAgICAgICAgLm8ge2NvbG9yOiBAY29sb3Jfb19ob3Zlcjt9CisgICAgICAgIC5wIHtjb2xvcjogQGNvbG9yX3BfaG92ZXI7fQorICAgICAgICAucSB7Y29sb3I6IEBjb2xvcl9xX2hvdmVyO30KKyAgICAgICAgLnIge2NvbG9yOiBAY29sb3Jfcl9ob3Zlcjt9CisgICAgICAgIC5zIHtjb2xvcjogQGNvbG9yX3NfaG92ZXI7fQorICAgICAgICAudCB7Y29sb3I6IEBjb2xvcl90X2hvdmVyO30KKyAgICAgICAgLnUge2NvbG9yOiBAY29sb3JfdV9ob3Zlcjt9CisgICAgICAgIC52IHtjb2xvcjogQGNvbG9yX3ZfaG92ZXI7fQorICAgICAgICAudyB7Y29sb3I6IEBjb2xvcl93X2hvdmVyO30KKyAgICAgICAgLngge2NvbG9yOiBAY29sb3JfeF9ob3Zlcjt9CisgICAgICAgIC55IHtjb2xvcjogQGNvbG9yX3lfaG92ZXI7fQorICAgICAgICAueiB7Y29sb3I6IEBjb2xvcl96X2hvdmVyO30KKyAgICAgICAgLnp6IHtjb2xvcjogQGNvbG9yX3p6X2hvdmVyO30KKyAgICB9Cit9CisKKy5mb250LXR5cGUgeworICAgIC5fMSB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1yZWd1bGFyOworICAgICAgICBmb250LXNpemU6IDE0cHg7CisgICAgfQorICAgIC5fMiB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1yZWd1bGFyOworICAgICAgICBmb250LXNpemU6IDIwcHg7CisgICAgfQorICAgIC5fMyB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1yZWd1bGFyOworICAgICAgICBmb250LXNpemU6IDEycHg7CisgICAgfQorICAgIC5fNCB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1yZWd1bGFyOworICAgICAgICBmb250LXNpemU6IDE2cHg7CisgICAgfQorICAgIC5fNSB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1tZWRpdW07CisgICAgICAgIGZvbnQtc2l6ZTogMzBweDsKKyAgICB9CisgICAgLl82IHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAxNnB4OworICAgIH0KKyAgICAuXzcgeworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtbWVkaXVtOworICAgICAgICBmb250LXNpemU6IDE0cHg7CisgICAgfQorICAgIC5fOCB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1yZWd1bGFyOworICAgICAgICBmb250LXNpemU6IDExcHg7CisgICAgfQorICAgIC5fOSB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1yZWd1bGFyOworICAgICAgICBmb250LXNpemU6IDEzcHg7CisgICAgfQorICAgIC5fMTAgeworICAgICAgICBmb250LWZhbWlseTogQGZvbnQtb21uZXMtcmVndWxhcjsKKyAgICAgICAgZm9udC1zaXplOiAxOHB4OworICAgIH0KKyAgICAuXzExIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAyMHB4OworICAgIH0KKyAgICAuXzEyIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAxN3B4OworICAgIH0KKyAgICAuXzEzIHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAxMnB4OworICAgIH0KKyAgICAuXzE0IHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAxMXB4OworICAgIH0KKyAgICAuXzE1IHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLW1lZGl1bTsKKyAgICAgICAgZm9udC1zaXplOiAyNHB4OworICAgIH0KKyAgICAuXzE2IHsKKyAgICAgICAgZm9udC1mYW1pbHk6IEBmb250LW9tbmVzLXJlZ3VsYXI7CisgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKKyAgICB9CisgICAgLl8xNyB7CisgICAgICAgIGZvbnQtZmFtaWx5OiAgQGZvbnQtb21uZXMtbWVkaXVtOworICAgICAgICBmb250LXNpemU6IDE1cHg7CisgICAgfQorICAgIC5fMTggeworICAgICAgICBmb250LWZhbWlseTogIEBmb250LW9tbmVzLXJlZ3VsYXI7CisgICAgICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgICB9CisgICAgLl8xOSB7CisgICAgICAgIGZvbnQtZmFtaWx5OiBAZm9udC1vbW5lcy1tZWRpdW07CisgICAgICAgIGZvbnQtc2l6ZTogMThweDsKKyAgICB9Cit9CisKKy5hXzEgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl8xO30KKy5hXzIgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl8yO30KKy5hXzMgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl8zO30KKy5hXzQgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl80O30KKy5hXzUgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl81O30KKy5hXzYgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl82O30KKy5hXzcgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl83O30KKy5hXzggIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl84O30KKy5hXzkgIHsuZm9udC1jb2xvciA+IC5hOyAuZm9udC10eXBlID4gLl85O30KKy5hXzEwICB7LmZvbnQtY29sb3IgPiAuYTsgLmZvbnQtdHlwZSA+IC5fMTA7fQorLmFfMTUgey5mb250LWNvbG9yID4gLmE7IC5mb250LXR5cGUgPiAuXzE1O30KKworLmJfMSAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzE7fQorLmJfMyAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzM7fQorLmJfNCAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzQ7fQorLmJfNSAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzU7fQorLmJfNiAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzY7fQorLmJfNyAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzc7fQorLmJfOSAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzk7fQorLmJfMTAgIHsuZm9udC1jb2xvciA+IC5iOyAuZm9udC10eXBlID4gLl8xMDt9CisuYl8xMSAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzExO30KKy5iXzEzICB7LmZvbnQtY29sb3IgPiAuYjsgLmZvbnQtdHlwZSA+IC5fMTM7fQorLmJfMTUgIHsuZm9udC1jb2xvciA+IC5iOyAuZm9udC10eXBlID4gLl8xNTt9CisuYl8xNyAgey5mb250LWNvbG9yID4gLmI7IC5mb250LXR5cGUgPiAuXzE3O30KKy5iXzE5ICB7LmZvbnQtY29sb3IgPiAuYjsgLmZvbnQtdHlwZSA+IC5fMTk7fQorCisuY18xICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fMTt9CisuY18yICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fMjt9CisuY18zICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fMzt9CisuY180ICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fNDt9CisuY181ICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fNTt9CisuY182ICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fNjt9CisuY183ICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fNzt9CisuY184ICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fODt9CisuY185ICB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fOTt9CisuY18xMCB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fMTA7fQorLmNfMTEgey5mb250LWNvbG9yID4gLmM7IC5mb250LXR5cGUgPiAuXzExO30KKy5jXzE1IHsuZm9udC1jb2xvciA+IC5jOyAuZm9udC10eXBlID4gLl8xNTt9CisuY18xNiB7LmZvbnQtY29sb3IgPiAuYzsgLmZvbnQtdHlwZSA+IC5fMTY7fQorLmNfMTcgey5mb250LWNvbG9yID4gLmM7IC5mb250LXR5cGUgPiAuXzE3O30KKy5jXzE4IHsuZm9udC1jb2xvciA+IC5jOyAuZm9udC10eXBlID4gLl8xODt9CisKKy5kXzEgIHsuZm9udC1jb2xvciA+IC5kOyAuZm9udC10eXBlID4gLl8xO30KKy5kXzIgIHsuZm9udC1jb2xvciA+IC5kOyAuZm9udC10eXBlID4gLl8yO30KKy5kXzMgIHsuZm9udC1jb2xvciA+IC5kOyAuZm9udC10eXBlID4gLl8zO30KKy5kXzQgIHsuZm9udC1jb2xvciA+IC5kOyAuZm9udC10eXBlID4gLl80O30KKy5kXzUgIHsuZm9udC1jb2xvciA+IC5kOyAuZm9udC10eXBlID4gLl81O30KKy5kXzYgIHsuZm9udC1jb2xvciA+IC5kOyAuZm9udC10eXBlID4gLl82O30KKy5kXzEyICB7LmZvbnQtY29sb3IgPiAuZDsgLmZvbnQtdHlwZSA+IC5fMTI7fQorCisuZV8xICB7LmZvbnQtY29sb3IgPiAuZTsgLmZvbnQtdHlwZSA+IC5fMTt9CisuZV8yICB7LmZvbnQtY29sb3IgPiAuZTsgLmZvbnQtdHlwZSA+IC5fMjt9CisuZV8zICB7LmZvbnQtY29sb3IgPiAuZTsgLmZvbnQtdHlwZSA+IC5fMzt9CisuZV80ICB7LmZvbnQtY29sb3IgPiAuZTsgLmZvbnQtdHlwZSA+IC5fNDt9CisuZV81ICB7LmZvbnQtY29sb3IgPiAuZTsgLmZvbnQtdHlwZSA+IC5fNTt9CisuZV82ICB7LmZvbnQtY29sb3IgPiAuZTsgLmZvbnQtdHlwZSA+IC5fNjt9CisuZV83ICB7LmZvbnQtY29sb3IgPiAuZTsgLmZvbnQtdHlwZSA+IC5fNzt9CisKKy5mXzEgIHsuZm9udC1jb2xvciA+IC5mOyAuZm9udC10eXBlID4gLl8xO30KKy5mXzIgIHsuZm9udC1jb2xvciA+IC5mOyAuZm9udC10eXBlID4gLl8yO30KKworLmdfMSAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzE7fQorLmdfMiAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzI7fQorLmdfMyAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzM7fQorLmdfNCAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzQ7fQorLmdfNSAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzU7fQorLmdfNiAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzY7fQorLmdfNyAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzc7fQorLmdfOCAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzg7fQorLmdfOSAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzk7fQorLmdfMTAgey5mb250LWNvbG9yID4gLmc7IC5mb250LXR5cGUgPiAuXzEwO30KKy5nXzEzIHsuZm9udC1jb2xvciA+IC5nOyAuZm9udC10eXBlID4gLl8xMzt9CisuZ18xNCB7LmZvbnQtY29sb3IgPiAuZzsgLmZvbnQtdHlwZSA+IC5fMTQ7fQorCisuaF8xICB7LmZvbnQtY29sb3IgPiAuaDsgLmZvbnQtdHlwZSA+IC5fMTt9CisuaF83ICB7LmZvbnQtY29sb3IgPiAuaDsgLmZvbnQtdHlwZSA+IC5fNzt9CisuaF85ICB7LmZvbnQtY29sb3IgPiAuaDsgLmZvbnQtdHlwZSA+IC5fOTt9CisKKy5pXzEgIHsuZm9udC1jb2xvciA+IC5pOyAuZm9udC10eXBlID4gLl8xO30KKy5pXzYgey5mb250LWNvbG9yID4gLmk7IC5mb250LXR5cGUgPiAuXzY7fQorLmlfMTEgey5mb250LWNvbG9yID4gLmk7IC5mb250LXR5cGUgPiAuXzExO30KKy5pXzE3IHsuZm9udC1jb2xvciA+IC5pOyAuZm9udC10eXBlID4gLl8xNzt9CisKKy5sXzEgIHsuZm9udC1jb2xvciA+IC5sOyAuZm9udC10eXBlID4gLl8xO30KKy5sXzkgIHsuZm9udC1jb2xvciA+IC5sOyAuZm9udC10eXBlID4gLl85O30KKworLm1fNCAgey5mb250LWNvbG9yID4gLm07IC5mb250LXR5cGUgPiAuXzQ7fQorLm1fNyAgey5mb250LWNvbG9yID4gLm07IC5mb250LXR5cGUgPiAuXzc7fQorCisucF8xICB7LmZvbnQtY29sb3IgPiAucDsgLmZvbnQtdHlwZSA+IC5fMTt9CisucF8zICB7LmZvbnQtY29sb3IgPiAucDsgLmZvbnQtdHlwZSA+IC5fMzt9CisucF85ICB7LmZvbnQtY29sb3IgPiAucDsgLmZvbnQtdHlwZSA+IC5fOTt9CisKKy5xXzcgIHsuZm9udC1jb2xvciA+IC5xOyAuZm9udC10eXBlID4gLl83O30KKy5xXzkgIHsuZm9udC1jb2xvciA+IC5xOyAuZm9udC10eXBlID4gLl85O30KKy5xXzExIHsuZm9udC1jb2xvciA+IC5xOyAuZm9udC10eXBlID4gLl8xMTt9CisKKy5yXzEyIHsuZm9udC1jb2xvciA+IC5yOyAuZm9udC10eXBlID4gLl8xMjt9CisKKy50XzEgIHsuZm9udC1jb2xvciA+IC50OyAuZm9udC10eXBlID4gLl8xO30KKy50XzcgIHsuZm9udC1jb2xvciA+IC50OyAuZm9udC10eXBlID4gLl83O30KKy50XzE1IHsuZm9udC1jb2xvciA+IC50OyAuZm9udC10eXBlID4gLl8xNTt9CisKKy8qIEFkZGVkIGJ5IGlrcmFtIC0gKi8KKy5zXzEyIHsuZm9udC1jb2xvciA+IC5zOyAuZm9udC10eXBlID4gLl8xMjt9CisKKy56XzkgIHsuZm9udC1jb2xvciA+IC56OyAuZm9udC10eXBlID4gLl85O30KKy5iYWNrZ3JvdW5kQ29sb3IgeworICAgIC5hIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2E7fQorICAgIC5iIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2I7fQorICAgIC5jIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2M7fQorICAgIC5kIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2Q7fQorICAgIC5lIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2U7fQorICAgIC5mIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2Y7fQorICAgIC5nIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2c7fQorICAgIC5oIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2g7fQorICAgIC5pIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2k7fQorICAgIC5qIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2o7fQorICAgIC5rIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2s7fQorICAgIC5sIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX2w7fQorICAgIC5tIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX207fQorICAgIC5uIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX247fQorICAgIC5vIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX287fQorICAgIC5wIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3A7fQorICAgIC5xIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3E7fQorICAgIC5yIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3I7fQorICAgIC5zIHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3M7fQorICAgIC50IHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3Q7fQorICAgIC51IHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3U7fQorICAgIC52IHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3Y7fQorICAgIC53IHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3c7fQorICAgIC54IHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3g7fQorICAgIC55IHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3k7fQorICAgIC56IHtiYWNrZ3JvdW5kLWNvbG9yOiAgQGNvbG9yX3o7fQorICAgIC56eiB7YmFja2dyb3VuZC1jb2xvcjogIEBjb2xvcl96ejt9CisKKyAgICAuaG92ZXIgeworICAgICAgICAuYSB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2FfaG92ZXI7fQorICAgICAgICAuYiB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2JfaG92ZXI7fQorICAgICAgICAuYyB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2NfaG92ZXI7fQorICAgICAgICAuZCB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2RfaG92ZXI7fQorICAgICAgICAuZSB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2VfaG92ZXI7fQorICAgICAgICAuZiB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2ZfaG92ZXI7fQorICAgICAgICAuZyB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2dfaG92ZXI7fQorICAgICAgICAuaCB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2hfaG92ZXI7fQorICAgICAgICAuaSB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2lfaG92ZXI7fQorICAgICAgICAuaiB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2pfaG92ZXI7fQorICAgICAgICAuayB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2tfaG92ZXI7fQorICAgICAgICAubCB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX2xfaG92ZXI7fQorICAgICAgICAubSB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX21faG92ZXI7fQorICAgICAgICAubiB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX25faG92ZXI7fQorICAgICAgICAubyB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX29faG92ZXI7fQorICAgICAgICAucCB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3BfaG92ZXI7fQorICAgICAgICAucSB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3FfaG92ZXI7fQorICAgICAgICAuciB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3JfaG92ZXI7fQorICAgICAgICAucyB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3NfaG92ZXI7fQorICAgICAgICAudCB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3RfaG92ZXI7fQorICAgICAgICAudSB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3VfaG92ZXI7fQorICAgICAgICAudiB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3ZfaG92ZXI7fQorICAgICAgICAudyB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3dfaG92ZXI7fQorICAgICAgICAueCB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3hfaG92ZXI7fQorICAgICAgICAueSB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3lfaG92ZXI7fQorICAgICAgICAueiB7YmFja2dyb3VuZC1jb2xvcjogQGNvbG9yX3pfaG92ZXI7fQorICAgICAgICAuenoge2JhY2tncm91bmQtY29sb3I6IEBjb2xvcl96el9ob3Zlcjt9CisgICAgfQorfQorCisuYmdfYSB7LmJhY2tncm91bmRDb2xvciA+IC5hO30KKy5iZ19iIHsuYmFja2dyb3VuZENvbG9yID4gLmI7fQorLmJnX2Mgey5iYWNrZ3JvdW5kQ29sb3IgPiAuYzt9CisuYmdfZCB7LmJhY2tncm91bmRDb2xvciA+IC5kO30KKy5iZ19lIHsuYmFja2dyb3VuZENvbG9yID4gLmU7fQorLmJnX2Ygey5iYWNrZ3JvdW5kQ29sb3IgPiAuZjt9CisuYmdfZyB7LmJhY2tncm91bmRDb2xvciA+IC5nO30KKy5iZ19oIHsuYmFja2dyb3VuZENvbG9yID4gLmg7fQorLmJnX2kgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaTt9CisuYmdfaiB7LmJhY2tncm91bmRDb2xvciA+IC5qO30KKy5iZ19rIHsuYmFja2dyb3VuZENvbG9yID4gLms7fQorLmJnX2wgey5iYWNrZ3JvdW5kQ29sb3IgPiAubDt9CisuYmdfbSB7LmJhY2tncm91bmRDb2xvciA+IC5tO30KKy5iZ19uIHsuYmFja2dyb3VuZENvbG9yID4gLm47fQorLmJnX28gey5iYWNrZ3JvdW5kQ29sb3IgPiAubzt9CisuYmdfcCB7LmJhY2tncm91bmRDb2xvciA+IC5wO30KKy5iZ19xIHsuYmFja2dyb3VuZENvbG9yID4gLnE7fQorLmJnX3Igey5iYWNrZ3JvdW5kQ29sb3IgPiAucjt9CisuYmdfcyB7LmJhY2tncm91bmRDb2xvciA+IC5zO30KKy5iZ190IHsuYmFja2dyb3VuZENvbG9yID4gLnQ7fQorLmJnX3Ugey5iYWNrZ3JvdW5kQ29sb3IgPiAudTt9CisuYmdfdiB7LmJhY2tncm91bmRDb2xvciA+IC52O30KKy5iZ193IHsuYmFja2dyb3VuZENvbG9yID4gLnc7fQorLmJnX3ggey5iYWNrZ3JvdW5kQ29sb3IgPiAueDt9CisuYmdfeSB7LmJhY2tncm91bmRDb2xvciA+IC55O30KKy5iZ196IHsuYmFja2dyb3VuZENvbG9yID4gLno7fQorLmJnX3p6IHsuYmFja2dyb3VuZENvbG9yID4gLnp6O30KKworLmJnX2FfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAuYTt9CisuYmdfYl9ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC5iO30KKy5iZ19jX2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLmM7fQorLmJnX2RfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAuZDt9CisuYmdfZV9ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC5lO30KKy5iZ19mX2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLmY7fQorLmJnX2dfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAuZzt9CisuYmdfaF9ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC5oO30KKy5iZ19pX2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLmk7fQorLmJnX2pfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAuajt9CisuYmdfbF9ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC5sO30KKy5iZ19tX2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLm07fQorLmJnX25faG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAubjt9CisuYmdfb19ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC5vO30KKy5iZ19wX2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLnA7fQorLmJnX3FfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAucTt9CisuYmdfcl9ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC5yO30KKy5iZ19zX2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLnM7fQorLmJnX3RfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAudDt9CisuYmdfdV9ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC51O30KKy5iZ192X2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLnY7fQorLmJnX3dfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAudzt9CisuYmdfeF9ob3ZlciB7LmJhY2tncm91bmRDb2xvciA+IC5ob3ZlciA+IC54O30KKy5iZ195X2hvdmVyIHsuYmFja2dyb3VuZENvbG9yID4gLmhvdmVyID4gLnk7fQorLmJnX3pfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAuejt9CisuYmdfenpfaG92ZXIgey5iYWNrZ3JvdW5kQ29sb3IgPiAuaG92ZXIgPiAueno7fQorCisuY2VudGVyICAgICAgICAge21hcmdpbjogMCBhdXRvO30KKy52Y2VudGVyICAgICAgICB7ZGlzcGxheTogdGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30KKy5sZWZ0ICAgICAgICAgICB7ZmxvYXQ6IGxlZnQ7fQorLnJpZ2h0ICAgICAgICAgIHtmbG9hdDogcmlnaHQ7fQorLmhhbmQgICAgICAgICAgIHtjdXJzb3I6IHBvaW50ZXI7fQorLmRlZmF1bHQtcG9pbnRlciB7Y3Vyc29yOiBkZWZhdWx0O30KKy50ZXh0LWNlbnRlciAgICB7dGV4dC1hbGlnbjogY2VudGVyO30KKy5kaXNwbGF5LW5vbmUgICB7ZGlzcGxheTogbm9uZTt9Cisubm93cmFwICAgICAgICAge3doaXRlLXNwYWNlOiBub3dyYXA7fQorLmJvbGQgICAgICAgICAgIHtmb250LXdlaWdodDogYm9sZDt9CisuZnVsbC1oZWlnaHQgICAge2hlaWdodDogMTAwJTt9CisudXBwZXJjYXNlICAgICAge3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7fQorLmNhcGl0YWxpemUgICAgIHt0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTt9CisuZGlzYWJsZWQgICAgICAgeworICAgIC8vYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsKKyAgICAvL2JvcmRlci1jb2xvcjogI2Q4ZDhkODsKKyAgICAvL2JhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQUVDQVlBQUFDcDhaNStBQUFBSWtsRVFWUUlXMk5rUUFLclZxMzZ6d2pqZ3poaFlXR01ZQUVZQjhSbVJPYUFCQURlT1E4Q1hsL3hmZ0FBQUFCSlJVNUVya0pnZ2c9PSkgcmVwZWF0OworICAgIC8vY29sb3I6IEBjb2xvcl9tOworfQorCisuYm9yZGVyLXJhZGl1cyhAcmFkaXVzKSB7CisgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiBAcmFkaXVzOworICAgIC1tb3otYm9yZGVyLXJhZGl1czogQHJhZGl1czsKKyAgICBib3JkZXItcmFkaXVzOiBAcmFkaXVzOworfQorCisuYm9yZGVyLXJhZGl1cy10b3AtbGVmdChAcmFkaXVzKSB7CisgICAgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBAcmFkaXVzOworICAgIC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiBAcmFkaXVzOworICAgIC1raHRtbC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBAcmFkaXVzOworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IEByYWRpdXM7Cit9CisKKy5ib3JkZXItcmFkaXVzLXRvcC1yaWdodChAcmFkaXVzKSB7CisgICAgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogQHJhZGl1czsKKyAgICAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IEByYWRpdXM7CisgICAgLWtodG1sLWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBAcmFkaXVzOworICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBAcmFkaXVzOworfQorCisuYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdChAcmFkaXVzKSB7CisgICAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiBAcmFkaXVzOworICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiBAcmFkaXVzOworICAgIC1raHRtbC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiBAcmFkaXVzOworICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IEByYWRpdXM7Cit9CisKKy5ib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodChAcmFkaXVzKSB7CisgICAgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogQHJhZGl1czsKKyAgICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IEByYWRpdXM7CisgICAgLWtodG1sLWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiBAcmFkaXVzOworICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiBAcmFkaXVzOworfQorCisub3BhY2l0eShAb3BhY2l0eTogMC41KSB7CisgICAgLW1vei1vcGFjaXR5OiBAb3BhY2l0eTsKKyAgICAta2h0bWwtb3BhY2l0eTogQG9wYWNpdHk7CisgICAgLXdlYmtpdC1vcGFjaXR5OiBAb3BhY2l0eTsKKyAgICBvcGFjaXR5OiBAb3BhY2l0eTsKK30KKworLmJveC1zaGFkb3coQGFyZ3VtZW50cykgeworICAgIC13ZWJraXQtYm94LXNoYWRvdzogQGFyZ3VtZW50czsKKyAgICAtbW96LWJveC1zaGFkb3c6IEBhcmd1bWVudHM7CisgICAgYm94LXNoYWRvdzogQGFyZ3VtZW50czsKK30KKworLnNxdWFyZShAc2l6ZSkgeworICAgIHdpZHRoOiBAc2l6ZTsKKyAgICBoZWlnaHQ6IEBzaXplOworfQorCisuc2VsZkNsZWFyOmFmdGVyIHsKKyAgICBjb250ZW50OiAiLiI7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgaGVpZ2h0OiAwcHg7CisgICAgY2xlYXI6IGJvdGg7CisgICAgdmlzaWJpbGl0eTogaGlkZGVuOworfQorLnNlbGZDbGVhciB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworfQorCisuY2xlYXJmaXg6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICIuIjsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBjbGVhcjogYm90aDsKKyAgICB2aXNpYmlsaXR5OiBoaWRkZW47CisgICAgbGluZS1oZWlnaHQ6IDA7CisgICAgaGVpZ2h0OiAwOworfQorCisuY2xlYXJmaXggeworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBjbGVhcjogYm90aDsKK30KKworLmdyYWRpZW50KEBkOyBAc3Q7IEBzdF9vOyBAZWM7IEBlY18wOyl7CisgICAgYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoQGQsIEBzdCBAc3RfbywgQGVjIEBlY18wKTsKKyAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChAZCwgQHN0IEBzdF9vLCBAZWMgQGVjXzApOworICAgIGJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChAZCwgQHN0IEBzdF9vLCBAZWMgQGVjXzApOworICAgIGJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQoQGQsIEBzdCBAc3RfbywgQGVjIEBlY18wKTsKKyAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoQGQsIEBzdCBAc3RfbywgQGVjIEBlY18wKTsKK30KKworLmh5cGhlbmF0ZSB7CisgICAgLW1zLXdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKKyAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CisKKyAgICAvLyBOb24gc3RhbmRhcmQgZm9yIHdlYmtpdAorICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CisKKyAgICAtd2Via2l0LWh5cGhlbnM6IGF1dG87CisgICAgLW1vei1oeXBoZW5zOiBhdXRvOworICAgIGh5cGhlbnM6IGF1dG87Cit9CisKKy51c2VyLXNlbGVjdCAoQHZhbDspIHsKKyAgICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7CisgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogQHZhbDsKKyAgICAta2h0bWwtdXNlci1zZWxlY3Q6IEB2YWw7CisgICAgLW1vei11c2VyLXNlbGVjdDogQHZhbDsKKyAgICAtbXMtdXNlci1zZWxlY3Q6IEB2YWw7CisgICAgdXNlci1zZWxlY3Q6IEB2YWw7Cit9CisKKy5mbGV4LWZpeGVkIChAd2lkdGgpIHsKKyAgICBmbGV4LWJhc2lzOiBAd2lkdGg7CisgICAgZmxleC1ncm93OiAwOworICAgIGZsZXgtc2hyaW5rOiAwOworfQorCisucGVyZmVjdC1zY3JvbGxiYXIgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworfQorCisubm9zZWxlY3QgeworICAgIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKKyAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOworICAgIC1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOworICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKKyAgICB1c2VyLXNlbGVjdDogbm9uZTsKK30KKworLmFycm93KEBzaXplLCBAY29sb3IpeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDUwJTsKKyAgICByaWdodDogMTAwJTsKKyAgICBtYXJnaW4tdG9wOiAtQHNpemU7CisgICAgd2lkdGg6IDA7CisgICAgaGVpZ2h0OiAwOworICAgIGJvcmRlci1yaWdodDogQHNpemUgc29saWQgQGNvbG9yOworICAgIGJvcmRlci10b3A6IEBzaXplIHNvbGlkIHRyYW5zcGFyZW50OworICAgIGJvcmRlci1ib3R0b206IEBzaXplIHNvbGlkIHRyYW5zcGFyZW50OworfQorCisuY2lyY2xlKEBzaXplLCBAY29sb3IpeworICAgIGJhY2tncm91bmQtY29sb3I6IEBjb2xvcjsKKyAgICAuYm9yZGVyLXJhZGl1cyg1MCUpOworICAgIGNvbG9yOiBAY29sb3JfYzsKKyAgICBjb250ZW50OiAnJzsKKyAgICBoZWlnaHQ6IEBzaXplOworICAgIHdpZHRoOiBAc2l6ZTsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZGlzcGxheTogYmxvY2s7Cit9CisKKy5zZGMtZWxsaXBzaXN7CisgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgfQorCisvLyBXb3JrcyB3aXRoIGFuaW1hdGUuY3NzCisuYW5pbWF0aW9uLWR1cmF0aW9uKEBzZWNvbmRzKSB7CisgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiBAc2Vjb25kczsgLy8zcworICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiBAc2Vjb25kczsKKyAgICAtbW96LWFuaW1hdGlvbi1kdXJhdGlvbjogQHNlY29uZHM7Cit9CisKKy5hbmltYXRpb24tZGVsYXkoQHNlY29uZHMpIHsKKyAgICBhbmltYXRpb24tZGVsYXk6IEBzZWNvbmRzOyAvLzNzCisgICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IEBzZWNvbmRzOworICAgIC1tb3otYW5pbWF0aW9uLWRlbGF5OiBAc2Vjb25kczsKK30KKworLmFuaW1hdGlvbi1pdGVyYXRpb25zKEBpdGVyYXRpb25zKSB7CisgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogQGl0ZXJhdGlvbnM7ICAgICAvLyBpbmZpbml0ZTsKKyAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IEBpdGVyYXRpb25zOworICAgIC1tb3otYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogQGl0ZXJhdGlvbnM7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbW9kYWwubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9tb2RhbC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGJjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvbW9kYWwubGVzcwpAQCAtMCwwICsxLDM1NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK09WRVJSSURFIEJPT1RTVFJBUCBUTyBDRU5URVIgTU9EQUwgVkVSVElDQUxMWS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisubW9kYWwgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBwYWRkaW5nOiAwIWltcG9ydGFudDsKK30KKworLm1vZGFsOmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIGhlaWdodDogMTAwJTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIG1hcmdpbi1yaWdodDogLTRweDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01PREFMIFNJWkVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLm1vZGFsLWRpYWxvZy5tb2RhbC1zZGMteGwgeworICAgIHdpZHRoOiAxMjAwcHg7Cit9CisKKy5tb2RhbC1kaWFsb2cubW9kYWwtc2RjLWwgeworICAgIHdpZHRoOiA4NzVweDsKK30KKworLm1vZGFsLWRpYWxvZy5tb2RhbC1zZGMtbWQgeworICAgIHdpZHRoOiA2NTBweDsKK30KKworLm1vZGFsLWRpYWxvZy5tb2RhbC1zZGMtc20geworICAgIHdpZHRoOiA1NTJweDsKK30KKworLm1vZGFsLWRpYWxvZy5tb2RhbC1zZGMteHNtIHsKKyAgICB3aWR0aDogNDMycHg7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNT0RBTCBXUkFQUEVSCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLm1vZGFsLWRpYWxvZyB7CisgICAgLyoKKyAgICBtYXJnaW4tdG9wOiAxMTBweDsKKyAgICB3aWR0aDogMTAwMHB4OworICAgICovCisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLm1vZGFsLWNvbnRlbnQgeworICAgIC8qLmJvcmRlci1yYWRpdXMoNHB4KTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgI2ZmZmZmZjsKKyAgICBib3gtc2hhZG93OiAwcHggMHB4IDZweCAwcHggcmdiYSgwLCAwLCAwLCAwLjUpOworICAgIG1pbi1oZWlnaHQ6IDIwMHB4OyovCit9CisKKy5tb2RhbC1iYWNrZHJvcC5pbiB7CisgICAgLy8gb3BhY2l0eTogLjg7Cit9CisKKy5tb2RhbC1iYWNrZHJvcCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzExMTkyMjsgLy9UT0RPOiBSZXBsYWNlIHRoZSBjb2xvcgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJFVklPVVMgTU9EQUwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKi53LXNkYy1tb2RhbCwKKy5tb2RhbC1kaWFsb2csCisudy1zZGMtbW9kYWwtY29uZmlybWF0aW9uIHsKKworICAgIC53LXNkYy1tb2RhbC1oZWFkIHsKKyAgICAgICAgLnNfMThfcjsKKyAgICAgICAgaGVpZ2h0OiA0OHB4OworICAgICAgICBsaW5lLWhlaWdodDogNDhweDsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIH0KKworICAgIC53LXNkYy1tb2RhbC1ib2R5IHsKKyAgICAgICAgaGVpZ2h0OiBhdXRvOworICAgICAgICBwYWRkaW5nOiAyMHB4IDQwcHggMjBweCA0MHB4OworICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGNvbG9yX2E7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB9CisKKyAgICAudy1zZGMtbW9kYWwtYm9keS1jb250ZW50IHsKKyAgICAgICAgLmJfMTsKKyAgICAgICAgcGFkZGluZzogMTBweCAwIDAgMDsKKyAgICB9CisKKyAgICAudy1zZGMtbW9kYWwtaWNvbiB7CisgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB9CisKKyAgICAudy1zZGMtbW9kYWwtaWNvbi1ERUJVRyB7IC5zcHJpdGU7IC5tZXNzYWdlLURFQlVHO30KKyAgICAudy1zZGMtbW9kYWwtaWNvbi1JTkZPIHsgLnNwcml0ZTsgLm1lc3NhZ2UtSU5GTzt9CisgICAgLnctc2RjLW1vZGFsLWljb24tV0FSTklORyB7IC5zcHJpdGU7IC5tZXNzYWdlLVdBUk5JTkc7fQorICAgIC53LXNkYy1tb2RhbC1pY29uLUVSUk9SIHsgLnNwcml0ZTsgLm1lc3NhZ2UtRVJST1I7fQorCisgICAgLnctc2RjLW1vZGFsLWNhcHRpb24geworICAgICAgICAuYV82OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIHBhZGRpbmc6IDAgMCAwIDI1cHg7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgfQorCisgICAgLnctc2RjLW1vZGFsLWFjdGlvbiB7CisgICAgICAgIGhlaWdodDogOTlweDsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgICAgICBsaW5lLWhlaWdodDogMTA1cHg7CisgICAgfQorCisgICAgLnNkYy1yZXNvdXJjZS12aWV3ZXItbW9kYWwtaGVhZCB7CisgICAgICAgIC5jXzI7CisgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOworICAgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4OworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgfQorCisgICAgLnctc2RjLW1vZGFsLWNsb3NlIHsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQU5DQVlBQUFDZEtZOUNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1ERTBJRGM1TGpFMU5qYzVOeXdnTWpBeE5DOHdPQzh5TUMwd09UbzFNem93TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFFnS0ZkcGJtUnZkM01wSWlCNGJYQk5UVHBKYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2taRFFVTTFNVVZGTURnMU5ERXhSVFZCTXpkQlEwSXhNek0yT1RZd05qTTJJaUI0YlhCTlRUcEViMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1pEUVVNMU1VVkdNRGcxTkRFeFJUVkJNemRCUTBJeE16TTJPVFl3TmpNMklqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZSa05CUXpVeFJVTXdPRFUwTVRGRk5VRXpOMEZEUWpFek16WTVOakEyTXpZaUlITjBVbVZtT21SdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlJrTkJRelV4UlVRd09EVTBNVEZGTlVFek4wRkRRakV6TXpZNU5qQTJNellpTHo0Z1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0lEd3ZjbVJtT2xKRVJqNGdQQzk0T25odGNHMWxkR0UrSUR3L2VIQmhZMnRsZENCbGJtUTlJbklpUHo0RUdSRDBBQUFBaEVsRVFWUjQybUw4Lys4ZkF4QUlBdkY3QnZ3QXJJWUpTS1FCOFYwZ05zYWpHS0VHYU1NWklQNFB4TytBMkJoa0l4cE9nOHFEY0FkSVFCQ1BKbVRGTThIT2gwcGcwNFNoR0ZrRE5rMFlpdEUxd0RUZFJWSzhDdDFQK0R5SU5TQVk4SGdRYTBEZ0RBMWNvWWRMTWM3UVE0NjRtVmdpRFYwVFBPTEtjU2hHMWdSV0F4QmdBQ09ieUdJMXRyK2VBQUFBQUVsRlRrU3VRbUNDJyk7CisgICAgICAgIGNvbG9yOiAjMzQ5OUY3OyAvL1RPRE86IFJlcGxhY2UgdGhlIGNvbG9yLCBzaG91bGQgYmUgc3ByaXRlCisgICAgICAgIC5oYW5kOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHJpZ2h0OiAyMHB4OworICAgICAgICB0b3A6IDIwcHg7CisgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICBoZWlnaHQ6IDEzcHg7CisgICAgICAgIHdpZHRoOiAxMnB4OworICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CisgICAgfQorCisgICAgLnctc2RjLXJlc291cmNlLXZpZXdlci1tb2RhbC1jbG9zZSB7CisgICAgICAgIGNvbG9yOiAjMzQ5OUY3OyAvL1RPRE86IFJlcGxhY2UgdGhlIGNvbG9yLCBzaG91bGQgYmUgc3ByaXRlCisgICAgICAgIC5oYW5kOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHJpZ2h0OiAyMHB4OworICAgICAgICB0b3A6IDVweDsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CisgICAgICAgIGZvbnQtc2l6ZTogMThweDsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgfQorCit9Ki8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05FVyBERVNJR04gTU9EQUwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisubW9kYWwtdHlwZS1zdGFuZGFyZC53LXNkYy1jbGFzc2ljLW1vZGFsIHsKKyAgICAudy1zZGMtbW9kYWwtaGVhZCB7CisgICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDNweCBAbWFpbl9jb2xvcl9hOworICAgIH0KK30KKy5tb2RhbC10eXBlLWVycm9yLnctc2RjLWNsYXNzaWMtbW9kYWwgeworICAgIC53LXNkYy1tb2RhbC1oZWFkIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgM3B4IEBmdW5jX2NvbG9yX3E7CisgICAgfQorfQorLm1vZGFsLXR5cGUtYWxlcnQudy1zZGMtY2xhc3NpYy1tb2RhbCB7CisgICAgLnctc2RjLW1vZGFsLWhlYWQgeworICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAzcHggQG1haW5fY29sb3JfaDsKKyAgICB9Cit9CisKKy53LXNkYy1jbGFzc2ljLW1vZGFsIHsKKworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgICAuYm9yZGVyLXJhZGl1cyg0cHgpOworICAgIGJhY2tncm91bmQtY29sb3I6ICAjZmZmZmZmOworICAgIGJveC1zaGFkb3c6IDBweCAwcHggNnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuNSk7CisgICAgbWluLWhlaWdodDogMTY1cHg7CisgICAgbWluLXdpZHRoOiA0MzBweDsKKworICAgIC53LXNkYy1tb2RhbC1oZWFkIHsKKyAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAuc18xOF9tOworICAgICAgICBoZWlnaHQ6IDQ4cHg7CisgICAgICAgIGxpbmUtaGVpZ2h0OiA0OHB4OworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAzcHggQG1haW5fY29sb3JfYTsKKyAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKworICAgICAgICAudy1zZGMtbW9kYWwtaGVhZC10ZXh0IHsKKyAgICAgICAgICAgIC5zXzE4X207CisgICAgICAgICAgICBmbGV4LWdyb3c6IDk5OTsKKyAgICAgICAgfQorCisgICAgICAgIC53LXNkYy1tb2RhbC1jbG9zZSB7CisgICAgICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgLnNwcml0ZS54LWJ0bi1ibGFjazsKKyAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC53LXNkYy1tb2RhbC1ib2R5IHsKKyAgICAgICAgZmxleC1ncm93OiA5OTk7CisgICAgICAgIC5tXzE0X3I7CisgICAgICAgIHBhZGRpbmctdG9wOiAyMHB4OworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7CisgICAgfQorCisgICAgLnctc2RjLW1vZGFsLWZvb3RlciB7CisgICAgICAgIGNsZWFyOiBib3RoOworICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CisgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsKKworICAgICAgICBidXR0b24geworICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDExcHg7CisgICAgICAgIH0KKworICAgICAgICBidXR0b246bGFzdC1jaGlsZCB7CisgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7CisgICAgICAgIH0KKworICAgIH0KKworfQorCisudy1zZGMtY2xhc3NpYy10b3AtbGluZS1tb2RhbCB7CisKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgICAgYmFja2dyb3VuZC1jb2xvcjogICNmZmZmZmY7CisgICAgYm94LXNoYWRvdzogMHB4IDBweCA2cHggMHB4IHJnYmEoMCwgMCwgMCwgMC41KTsKKyAgICBtaW4taGVpZ2h0OiAxNjVweDsKKyAgICBtaW4td2lkdGg6IDQzMHB4OworICAgIGJvcmRlci10b3A6IHNvbGlkIDNweCBAbWFpbl9jb2xvcl9hOworCisgICAgLnctc2RjLW1vZGFsLWhlYWQgeworICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIC5zXzE4X3I7CisgICAgICAgIGhlaWdodDogNDhweDsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisKKyAgICAgICAgLnctc2RjLW1vZGFsLWhlYWQtdGV4dCB7CisgICAgICAgICAgICAuc18xOF9tOworICAgICAgICAgICAgZmxleC1ncm93OiA5OTk7CisgICAgICAgIH0KKworICAgICAgICAudy1zZGMtbW9kYWwtY2xvc2UgeworICAgICAgICAgICAgZmxleC1ncm93OiAxOworICAgICAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgICAgIC5zcHJpdGUueC1idG4tYmxhY2s7CisgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAudy1zZGMtbW9kYWwtYm9keSB7CisgICAgICAgIGZsZXgtZ3JvdzogOTk5OworICAgICAgICAubV8xNF9yOworICAgICAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgICAgICBib3JkZXItYm90dG9tOiBub25lOworICAgIH0KKworICAgIC53LXNkYy1tb2RhbC1mb290ZXIgeworICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CisKKyAgICAgICAgYnV0dG9uIHsKKyAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOworICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMXB4OworICAgICAgICB9CisKKyAgICAgICAgYnV0dG9uOmxhc3QtY2hpbGQgeworICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwOworICAgICAgICB9CisKKyAgICB9CisKK30KKworLm1vZGFsLXNkYy14bCB7CisgICAgLnctc2RjLWNsYXNzaWMtbW9kYWwgeworICAgICAgICBwYWRkaW5nOiAwIDQwcHg7CisKKyAgICAgICAgLnctc2RjLW1vZGFsLWhlYWQgeworICAgICAgICAgICAgLmJfMTU7CisgICAgICAgICAgICBoZWlnaHQ6IDYwcHg7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogNjBweDsKKworICAgICAgICAgICAgLnctc2RjLW1vZGFsLWhlYWQtdGV4dCB7CisgICAgICAgICAgICAgICAgZmxleC1ncm93OiA5OTk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC53LXNkYy1tb2RhbC1jbG9zZSB7CisgICAgICAgICAgICAgICAgdG9wOiAyN3B4OworICAgICAgICAgICAgICAgIHJpZ2h0OiA0MXB4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLnctc2RjLW1vZGFsLWZvb3RlciB7CisgICAgICAgICAgICBoZWlnaHQ6IDgwcHg7CisgICAgICAgICAgICBtYXJnaW46IDAgLTQwcHg7CisgICAgICAgICAgICBwYWRkaW5nOiAwIDQwcHg7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOworICAgICAgICB9CisKKyAgICB9Cit9CisKKy5tb2RhbC1zZGMteGwsCisubW9kYWwtc2RjLWwsCisubW9kYWwtc2RjLW1kLAorLm1vZGFsLXNkYy1zbSwKKy5tb2RhbC1zZGMteHNtIHsKKworICAgIC53LXNkYy1jbGFzc2ljLXRvcC1saW5lLW1vZGFsIHsKKyAgICAgICAgcGFkZGluZzogMCAzMHB4OworCisgICAgICAgIC53LXNkYy1tb2RhbC1mb290ZXIgeworICAgICAgICAgICAgbWFyZ2luOiAwIC0zMHB4OworICAgICAgICAgICAgcGFkZGluZzogMTdweCAzMHB4OworICAgICAgICB9CisgICAgfQorCisgICAgLnctc2RjLWNsYXNzaWMtbW9kYWwgeworICAgICAgICBwYWRkaW5nOiAwIDMwcHg7CisKKyAgICAgICAgLnctc2RjLW1vZGFsLWhlYWQgeworICAgICAgICAgICAgLmJfMTk7CisgICAgICAgICAgICBoZWlnaHQ6IDUwcHg7CisgICAgICAgICAgICBsaW5lLWhlaWdodDogNTBweDsKKworICAgICAgICAgICAgLnctc2RjLW1vZGFsLWNsb3NlIHsKKyAgICAgICAgICAgICAgICB0b3A6IDIxcHg7CisgICAgICAgICAgICAgICAgcmlnaHQ6IDMwcHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAudy1zZGMtbW9kYWwtZm9vdGVyIHsKKyAgICAgICAgICAgIG1hcmdpbjogMCAtMzBweDsKKyAgICAgICAgICAgIHBhZGRpbmc6IDE3cHggMzBweDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zY3JvbGxlci5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Njcm9sbGVyLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkYWYxMgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zY3JvbGxlci5sZXNzCkBAIC0wLDAgKzEsMTUgQEAKKy8vIEluc2lkZQorLnBzLWNvbnRhaW5lciA+IC5wcy1zY3JvbGxiYXIteS1yYWlsID4gLnBzLXNjcm9sbGJhci15IHsKKyAgICAuYmdfYjsKKyAgICAuYm9yZGVyLXJhZGl1cygwcHgpOworICAgIG9wYWNpdHk6IDE7CisgICAgd2lkdGg6IDZweDsKKyAgICBtYXJnaW46IDAgMnB4OworfQorLy8gT3V0c2lkZQorLnBzLWNvbnRhaW5lciA+IC5wcy1zY3JvbGxiYXIteS1yYWlseworICAgIC5ib3JkZXItcmFkaXVzKDBweCk7CisgICAgd2lkdGg6IDEwcHggOworICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC41KTsKKyAgICB6LWluZGV4OiAxMDAwOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Nwcml0ZS1vbGQubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zcHJpdGUtb2xkLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZGMyZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zcHJpdGUtb2xkLmxlc3MKQEAgLTAsMCArMSwxMzIgQEAKKy5zcHJpdGUgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ltYWdlcy9zcHJpdGVzL3Nwcml0ZS1nbG9iYWwtb2xkLnBuZycpOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cit9CisKKy5zcHJpdGUubG9nbyAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggIC0xMDBweDsgd2lkdGg6IDM5cHg7IGhlaWdodDogMzJweDt9Cisuc3ByaXRlLndoaXRlLWFycm93LWRvd24gICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4ICAtMjAwcHg7IHdpZHRoOiAxNXB4OyBoZWlnaHQ6IDlweDt9Cisuc3ByaXRlLndoaXRlLWFycm93LXVwICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDBweCAtMjAwcHg7IHdpZHRoOiAxNXB4OyBoZWlnaHQ6IDlweDt9CisuYXJyb3ctbGVmdCAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNjJweCAtNDA0MXB4OyB3aWR0aDogMTFweDsgaGVpZ2h0OiAxMHB4O30KKy5zcHJpdGUudGFiLWluZm8gICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggLTMwMHB4OyAgd2lkdGg6IDE4cHg7IGhlaWdodDogMjBweDt9Cisuc3ByaXRlLmVkaXQgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC02ODlweDsgIHdpZHRoOiAzMXB4OyBoZWlnaHQ6IDMwcHg7fQorLnNwcml0ZS5kZXRhaWxzICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtOTAwcHg7ICB3aWR0aDogMTlweDsgaGVpZ2h0OiAxOXB4O30KKy5zcHJpdGUuc3RydWN0dXJlICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMnB4IC0zODgwcHg7IHdpZHRoOiAyM3B4OyBoZWlnaHQ6IDIxcHg7fQorLnNwcml0ZS5hcnRpZmFjdHMgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtMTA5OHB4OyB3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4O30KKy5zcHJpdGUubWVudSAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggLTEyMDBweDsgd2lkdGg6IDE3cHg7IGhlaWdodDogMTRweDt9Cisuc3ByaXRlLmNhdGFsb2cgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01M3B4IC0xMzAzcHg7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7fQorLnNwcml0ZS5kaXN0cmlidXRpb24gICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtMTQwMHB4OyB3aWR0aDogMjRweDsgaGVpZ2h0OiAxNHB4O30KKy5zcHJpdGUuc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggLTE1MDBweDsgd2lkdGg6IDIycHg7IGhlaWdodDogMjJweDt9Cisuc3ByaXRlLmZpbHRlciAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4IC0xNjAwcHg7IHdpZHRoOiAxNXB4OyBoZWlnaHQ6IDE2cHg7fQorLnNwcml0ZS5jYXJkLW1lbnUgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtMjAwMHB4OyB3aWR0aDogNHB4OyAgaGVpZ2h0OiAxNnB4O30KKy5zcHJpdGUucmVsYXRpb25zaGlwcyAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggLTIwOTdweDsgd2lkdGg6IDI2cHg7IGhlaWdodDogMTlweDt9Cisuc3ByaXRlLmxpZmVjeWNsZSAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4IC0yMjAwcHg7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7fQorLnNwcml0ZS5wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtMjMwMHB4OyB3aWR0aDogMTlweDsgaGVpZ2h0OiAxOXB4O30KKy5zcHJpdGUuZS1zZGMtc21hbGwtaWNvbi1kZWxldGUgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTI3NzFweDsgd2lkdGg6IDExcHg7IGhlaWdodDogMTNweDt9Cisuc3ByaXRlLm1hZ25pZmljYXRpb24tZ2xhc3MgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OXB4IC0zMTM4cHg7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDEycHg7fQorLnNwcml0ZS5jbGVhci10ZXh0ICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTA0cHggLTQwNDBweDsgd2lkdGg6IDEwcHg7IGhlaWdodDogMTFweDt9CisvKm5ldyB0YWJzIGljb25zKi8KKy5zcHJpdGUuaW5mbyAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwNXB4IC0zNTgzcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7fQorLnNwcml0ZS5pbmZvcm1hdGlvbi1hcnRpZmFjdHMgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTA1cHggLTM2MzJweDsgd2lkdGg6IDIwcHg7IGhlaWdodDogMjFweDt9Cisuc3ByaXRlLmRlcGxveW1lbnQtYXJ0aWZhY3RzICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDVweCAtMzY4MnB4OyB3aWR0aDogMTlweDsgaGVpZ2h0OiAxOXB4O30KKy5zcHJpdGUucHJvcGVydGllcyAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwNXB4IC0zNzMzcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7fQorLnNwcml0ZS5yZWxhdGlvbnMgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTA1cHggLTM3ODFweDsgd2lkdGg6IDIwcHg7ICBoZWlnaHQ6IDIwcHg7fQorLnNwcml0ZS5pbnB1dHMgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTA0cHggLTM4ODdweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMTRweDt9Cisuc3ByaXRlLmFwaSAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDRweCAtMzkzMHB4OyB3aWR0aDogMjVweDsgaGVpZ2h0OiAyMXB4O30KKworLnNwcml0ZS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTRweCAtMjg4N3B4OyB3aWR0aDogMTNweDsgaGVpZ2h0OiAxM3B4O30KKy5zcHJpdGUuQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTU0cHggLTI5MzRweDsgd2lkdGg6IDEzcHg7IGhlaWdodDogMTZweDt9Cisuc3ByaXRlLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4IC0yOTg1cHg7IHdpZHRoOiAxM3B4OyBoZWlnaHQ6IDE1cHg7fQorLnNwcml0ZS5DRVJUSUZJRUQgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTRweCAtMzAzNHB4OyB3aWR0aDogMTNweDsgaGVpZ2h0OiAxNnB4O30KKy5zcHJpdGUuUkVBRFlfRk9SX0NFUlRJRklDQVRJT04gICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ5cHggLTMwODdweDsgd2lkdGg6IDIzcHg7IGhlaWdodDogMTZweDt9CisKKy5tZXNzYWdlLURFQlVHICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUxcHggLTMxODdweDsgd2lkdGg6IDQ3cHg7IGhlaWdodDogNDdweDt9CisubWVzc2FnZS1JTkZPICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC0zMTg3cHg7IHdpZHRoOiA0N3B4OyBoZWlnaHQ6IDQ3cHg7fQorLm1lc3NhZ2UtV0FSTklORyAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTFweCAtMzE4N3B4OyB3aWR0aDogNDdweDsgaGVpZ2h0OiA0N3B4O30KKy5tZXNzYWdlLUVSUk9SICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUxcHggLTMxODdweDsgd2lkdGg6IDQ3cHg7IGhlaWdodDogNDdweDt9CisKKy5lLXNkYy1zbWFsbC1pY29uLWV5ZSAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTYwcHggLTI3MjJweDsgd2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDt9CisuZS1zZGMtc21hbGwtaWNvbi1wZW5jaWwgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC0zMzM5cHg7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDEycHg7fQorLmUtc2RjLXNtYWxsLWljb24tcGFkICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTU3cHggLTI3NzJweDsgd2lkdGg6IDE1cHg7IGhlaWdodDogMTJweDt9Cisuc3ByaXRlLmUtc2RjLXNtYWxsLWljb24tdHJhc2ggICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0zMDBweDsgIHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7fQorLnNwcml0ZS5lLXNkYy1zbWFsbC1jaGVjayAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMzk5cHg7ICB3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4O30KKy5zcHJpdGUuZS1zZGMtc21hbGwtY2xvbmUgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ5cHggLTUwMXB4OyAgd2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDt9Cisuc3ByaXRlLmUtc2RjLXNtYWxsLXByaW50LXNjcmVlbiAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OXB4IC0zNTFweDsgIHdpZHRoOiAxOXB4OyBoZWlnaHQ6IDIwcHg7fQorLnNwcml0ZS5lLXNkYy1zbWFsbC1jZXJ0aWZpY2F0aW9uICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNjAycHg7ICB3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4O30KKy5zcHJpdGUuZS1zZGMtc21hbGwtZG93bmxvYWQgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUxcHggLTMzOTBweDsgd2lkdGg6IDEycHg7IGhlaWdodDogMTFweDt9Cisuc3ByaXRlLmUtc2RjLWNsb3VkICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC0zMjc4cHg7IHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDIzcHg7fQorLnNwcml0ZS5lLXNkYy1wZW5jaWwgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTNweCAtMjQwNHB4OyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4O30KKy5zcHJpdGUuZS1zZGMtZ3JlZW4tc2F2ZSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE1N3B4IC00MDg5cHg7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDEycHg7fQorCisvKiBjYW52YXMgaXRlbXMgbm9uLWNlcnRpZmllZCBpbmRpY2F0b3IgKi8KKy5zLXNkYy1zdGF0ZS1ub24tY2VydGlmaWVkICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE1N3B4IC0zMzg2cHg7IHdpZHRoOiAxNXB4OyBoZWlnaHQ6IDE1cHg7fQorCisvKiBkYXNoYm9hcmQgY2FyZCBtYWluIGljb25zICovCisucy1zZGMtc2VydmljZSAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC02MHB4IC0yNjU0cHg7IHdpZHRoOiAxNHB4OyBoZWlnaHQ6IDE3cHg7fQorLnMtc2RjLXJlc291cmNlICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTRweCAtMjU4NXB4OyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4O30KKworLyogZGFzaGJvYXJkIGNhcmQgc3RhdHVzZXMgaWNvbnMgKi8KKy5zLXNkYy1zdGF0ZS5OT1RfQ0VSVElGSUVEX0NIRUNLSU4gICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ3cHggLTI4MzlweDsgd2lkdGg6IDIwcHg7IGhlaWdodDogMTlweDt9Cisucy1zZGMtc3RhdGUuTk9UX0NFUlRJRklFRF9DSEVDS0lOLmdyZWVuICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC0yODM5cHg7fQorLnMtc2RjLXN0YXRlLk5PVF9DRVJUSUZJRURfQ0hFQ0tJTi5yZWQgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTNweCAtMjgzOXB4O30KKworLnMtc2RjLXN0YXRlLk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTNweCAtMjg4OXB4OyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4O30KKy5zLXNkYy1zdGF0ZS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VULmdyZWVuICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc2cHggLTI4ODlweDt9Cisucy1zZGMtc3RhdGUuTk9UX0NFUlRJRklFRF9DSEVDS09VVC5yZWQgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC05OXB4IC0yODg5cHg7fQorCisucy1zZGMtc3RhdGUuQ0VSVElGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01M3B4IC0zMDM0cHg7IHdpZHRoOiAxNHB4OyBoZWlnaHQ6IDE2cHg7fQorLnMtc2RjLXN0YXRlLkNFUlRJRklFRC5ncmVlbiAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzZweCAtMzAzNHB4O30KKy5zLXNkYy1zdGF0ZS5DRVJUSUZJRUQucmVkICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk5cHggLTMwMzRweDt9CisKKy5zLXNkYy1zdGF0ZS5SRUFEWV9GT1JfQ0VSVElGSUNBVElPTiAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUzcHggLTI5ODVweDsgd2lkdGg6IDE0cHg7IGhlaWdodDogMTZweDt9Cisucy1zZGMtc3RhdGUuUkVBRFlfRk9SX0NFUlRJRklDQVRJT04uZ3JlZW4gICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03NnB4IC0yOTg1cHg7fQorLnMtc2RjLXN0YXRlLlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OLnJlZCAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTlweCAtMjk4NXB4O30KKworLnMtc2RjLXN0YXRlLkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTNweCAtMjkzNHB4OyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNnB4O30KKy5zLXNkYy1zdGF0ZS5DRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTLmdyZWVuICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc2cHggLTI5MzRweDt9Cisucy1zZGMtc3RhdGUuQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUy5yZWQgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC05OXB4IC0yOTM0cHg7IH0KKworLnMtc2RjLXN0YXRlLkRJU1RSSUJVVEVEICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDNweCAtMzA4N3B4OyB3aWR0aDogMjRweDsgaGVpZ2h0OiAxNHB4O30KKy5zLXNkYy1zdGF0ZS5ESVNUUklCVVRFRC5ncmVlbiAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc2cHggLTMwODdweDt9Cisucy1zZGMtc3RhdGUuRElTVFJJQlVURUQucmVkICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTNweCAtMzA4N3B4O30KKworLnNwcml0ZS5lLXNkYy1zbWFsbC1ibHVlLWRvd24tYXJyb3cgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTFweCAtMzI2MnB4OyAgd2lkdGg6IDEwcHg7IGhlaWdodDogN3B4O30KKy5zcHJpdGUuZS1zZGMtc21hbGwtYmx1ZS11cC1hcnJvdyAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMXB4IC0zMjYycHg7IHdpZHRoOiAxMHB4OyBoZWlnaHQ6IDdweDt9CisKKy5lLWNoZWNrYm94LXVuY2hlY2tlZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogIC01MXB4IC0zNDkwcHg7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDExcHg7fQorLmUtY2hlY2tib3gtY2hlY2tlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTAzcHggLTM0OTBweDsgd2lkdGg6IDEycHg7IGhlaWdodDogMTFweDt9CisuZS1jaGVja2JveC11bmNoZWNrZWQtZGlzYWJsZWQgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNjVweCAtMzQ5MHB4OyB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMXB4O30KKworLyogdmlld2VyIG1vZGFsICovCisuc3ByaXRlLngtYnRuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4IC0zNDM4cHg7ICB3aWR0aDogMTRweDsgaGVpZ2h0OiAxM3B4O30KKy5zcHJpdGUueC1idG46aG92ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwM3B4IC0zNDM4cHg7IHdpZHRoOiAxNHB4OyBoZWlnaHQ6IDEzcHg7fQorLnNwcml0ZS54LWJ0bi13aGl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTU3cHggLTM0MzdweDsgd2lkdGg6IDE0cHg7IGhlaWdodDogMTNweDt9Cisuc3ByaXRlLngtYnRuLXdoaXRlOmhvdmVyICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTFweCAtMzQzOHB4OyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxM3B4O30KKy5zcHJpdGUueC1idG4tYmxhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUycHggLTQwNDFweDsgd2lkdGg6IDEwcHg7IGhlaWdodDogMTFweDt9Cisuc3ByaXRlLngtYnRuLWJsYWNrOmhvdmVyICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDRweCAtNDA0MXB4OyB3aWR0aDogMTBweDsgaGVpZ2h0OiAxMXB4O30KKy5zcHJpdGUuc21hbGwteC1idG4tYmxhY2sgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE1N3B4IC00MDQ0cHg7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4O30KKy5zcHJpdGUuc21hbGwteC1idG4tYmxhY2s6aG92ZXIgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMXB4IC00MDQ0cHg7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4O30KKworCisvKiBpbnB1dCBmaWxlIHVwbG9hZCBpY29ucyAqLworLnNwcml0ZS51cGxvYWQtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTFweCAtMzI4NnB4OyAgd2lkdGg6IDE2cHg7IGhlaWdodDogMTVweDsgfQorLnNwcml0ZS51cGxvYWQtaWNvbi1ob3ZlciAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTA0cHggLTMyODZweDsgfQorLnNwcml0ZS51cGxvYWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQzcHggLTMyODNweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgfQorLnNwcml0ZS5jaGFuZ2UtZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjYxcHggLTMyODVweDsgd2lkdGg6IDIycHg7IGhlaWdodDogMTZweDsgfQorLnNwcml0ZS5jaGFuZ2UtZmlsZS1ob3ZlciAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjExcHggLTMyODVweDsgfQorLnNwcml0ZS5lLXNkYy1zbWFsbC1pY29uLXVwbG9hZCAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTA0cHggLTQxODhweDsgd2lkdGg6IDEycHg7IGhlaWdodDogMTNweDsgfQorCisvKiBlcnJvciBtZXNzYWdlcyBpY29ucyAqLworLmV4Y2xhbWF0aW9uLW1hcmstd2hpdGUtaWNvbiAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTFweCAgLTM5OTBweDsgIHdpZHRoOiAxM3B4OyBoZWlnaHQ6IDExcHg7IH0KKy5leGNsYW1hdGlvbi1tYXJrLXJlZC1pY29uICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMnB4IC0zOTkwcHg7ICB3aWR0aDogMTNweDsgaGVpZ2h0OiAxMXB4OyB9CisucXVlc3Rpb24tbWVzc2FnZS1pY29uLWdyYXkgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDRweCAtMzk4N3B4OyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OyB9CisucXVlc3Rpb24tbWVzc2FnZS1pY29uLXdoaXRlICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNThweCAtMzk4N3B4OyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OyB9CisKKy8qIHdpemFyZCBpY29ucyAqLworLnNwcml0ZS50YWJsZS1hcnJvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTdweCAtNDI0MXB4OyB3aWR0aDogN3B4OyBoZWlnaHQ6IDEwcHg7IH0KKy5zcHJpdGUudGFibGUtYXJyb3cub3BlbmVkICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTU0cHggLTQyOTVweDsgd2lkdGg6IDEwcHg7IGhlaWdodDogNnB4OyB9CisKKy5zcHJpdGUtZ3JlZW4tdGljayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE1N3B4IC0zMjkwcHg7IHdpZHRoOiAxNXB4OyBoZWlnaHQ6IDExcHg7IH0KKworLyogdGFncyBjYXRlZ29yeSByZWxhdGlvbiBpY29uKi8KKy5zcHJpdGUucmVsYXRpb24taWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogIC0xMDBweCAtNDM1MXB4OyB3aWR0aDogMjRweDsgaGVpZ2h0OiAyNHB4OyB9Cisuc3ByaXRlLnJlbGF0aW9uLWljb24taG92ZXIgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTJweCAtNDM1MXB4OyB3aWR0aDogMjRweDsgaGVpZ2h0OiAyNHB4OyB9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvc3ByaXRlLXByb2R1Y3QtaWNvbnMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zcHJpdGUtcHJvZHVjdC1pY29ucy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODVlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvc3ByaXRlLXByb2R1Y3QtaWNvbnMubGVzcwpAQCAtMCwwICsxLDcxIEBACisuc3ByaXRlLXByb2R1Y3QtaWNvbnMgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnaW1hZ2VzL3Nwcml0ZXMvc3ByaXRlLXByb2R1Y3QtaWNvbnMucG5nJyk7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworfQorCisuc3ByaXRlLXByb2R1Y3QtaWNvbnMuZGlzYWJsZSAgICAgICAgICAgICAgIHsgb3BhY2l0eTowLjU7fQorCisuc3ByaXRlLXByb2R1Y3QtaWNvbnMuc2V0dGluZyAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI5MXB4IC0xMDJweDsgIHdpZHRoOiA2MXB4OyBoZWlnaHQ6IDY3cHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLnNldHRpbmcuc21hbGwgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTdweCAtMTQycHg7ICB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5zZXR0aW5nLm1lZGl1bSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ4cHggLTEzMHB4OyAgd2lkdGg6IDQxcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMuc2V0dGluZy5sYXJnZSAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc3cHggLTExMHB4OyAgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5jbG91ZCAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjkwcHggLTIxNXB4OyB3aWR0aDogNjRweDsgaGVpZ2h0OiA0M3B4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5jbG91ZC5zbWFsbCAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjE3cHggLTIzMnB4OyB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5jbG91ZC5tZWRpdW0gICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ4cHggLTIyMHB4OyB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5jbG91ZC5sYXJnZSAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzdweCAtMjAwcHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXByb2R1Y3QtaWNvbnMuc2VjdXJpdHkgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4OXB4IC0yOTNweDsgIHdpZHRoOiA1MHB4OyBoZWlnaHQ6IDU3cHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLnNlY3VyaXR5LnNtYWxsICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTdweCAtMzIxcHg7ICB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5zZWN1cml0eS5tZWRpdW0gICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ4cHggLTMxMHB4OyAgd2lkdGg6IDQxcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMuc2VjdXJpdHkubGFyZ2UgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc3cHggLTI5MHB4OyAgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5uZXR3b3JrICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjkwcHggLTM4M3B4OyAgd2lkdGg6IDU2cHg7IGhlaWdodDogNTdweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMubmV0d29yay5zbWFsbCAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxN3B4IC00MTFweDsgIHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLm5ldHdvcmsubWVkaXVtICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDhweCAtMzk5cHg7ICB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5uZXR3b3JrLmxhcmdlICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzdweCAtMzgwcHg7ICB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1wcm9kdWN0LWljb25zLm9ycGhhbiAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yOTBweCAtNDc4cHg7ICB3aWR0aDogNTJweDsgaGVpZ2h0OiA1MnB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5vcnBoYW4uc21hbGwgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjE3cHggLTUwMHB4OyB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOXB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5vcnBoYW4ubWVkaXVtICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ4cHggLTQ4OHB4OyB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5vcnBoYW4ubGFyZ2UgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzdweCAtNDcwcHg7ICB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1wcm9kdWN0LWljb25zLmRlZmF1bHRpY29uICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yOTBweCAtNDc4cHg7ICB3aWR0aDogNTJweDsgaGVpZ2h0OiA1MnB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5kZWZhdWx0aWNvbi5zbWFsbCAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjE3cHggLTUwMHB4OyB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOXB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5kZWZhdWx0aWNvbi5tZWRpdW0gICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ4cHggLTQ4OHB4OyB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5kZWZhdWx0aWNvbi5sYXJnZSAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzdweCAtNDcwcHg7ICB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1wcm9kdWN0LWljb25zLnZmdyAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODlweCAtNTQ4cHg7ICB3aWR0aDogNzNweDsgaGVpZ2h0OiA3M3B4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy52Zncuc21hbGwgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjE3cHggLTU5MXB4OyAgd2lkdGg6IDI5cHg7IGhlaWdodDogMjlweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMudmZ3Lm1lZGl1bSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0OHB4IC01ODBweDsgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLnZmdy5sYXJnZSAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03N3B4IC01NjBweDsgIHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYxcHg7fQorCisuc3ByaXRlLXByb2R1Y3QtaWNvbnMud2FueCAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI5MHB4IC02NjRweDsgIHdpZHRoOiA1OXB4OyBoZWlnaHQ6IDQ3cHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLndhbnguc21hbGwgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTdweCAtNjgxcHg7ICB3aWR0aDogMzBweDsgaGVpZ2h0OiAzMHB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy53YW54Lm1lZGl1bSAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ4cHggLTY3MHB4OyAgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLndhbngubGFyZ2UgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03N3B4IC02NTFweDsgIHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXByb2R1Y3QtaWNvbnMudnJvdXRlciAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4OXB4IC03NThweDsgIHdpZHRoOiA2OXB4OyBoZWlnaHQ6IDQzcHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLnZyb3V0ZXIuc21hbGwgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTdweCAtNzcycHg7ICB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOXB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy52cm91dGVyLm1lZGl1bSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ4cHggLTc2MHB4OyAgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMudnJvdXRlci5sYXJnZSAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc3cHggLTc0MXB4OyAgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcHJvZHVjdC1pY29ucy51Y3BlICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjg5cHggLTgzMnB4OyAgd2lkdGg6IDU5cHg7IGhlaWdodDogNjBweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMudWNwZS5zbWFsbCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxN3B4IC04NjJweDsgIHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLnVjcGUubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDhweCAtODQ5cHg7ICB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy51Y3BlLmxhcmdlICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzdweCAtODMxcHg7ICB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MXB4O30KKworLnNwcml0ZS1wcm9kdWN0LWljb25zLm1vYmlsaXR5ICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODhweCAtOTE5cHg7ICB3aWR0aDogNjRweDsgaGVpZ2h0OiA2MnB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy5tb2JpbGl0eS5zbWFsbCAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjE2cHggLTk1MnB4OyAgd2lkdGg6IDI5cHg7IGhlaWdodDogMjlweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMubW9iaWxpdHkubWVkaXVtICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0N3B4IC05NDBweDsgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLm1vYmlsaXR5LmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03NnB4IC05MjFweDsgIHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXByb2R1Y3QtaWNvbnMud2FueF9jdXN0b21lcl9tYW5hZ2VkICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjkwcHggLTEwMjRweDsgIHdpZHRoOiA1OHB4OyBoZWlnaHQ6IDYycHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLndhbnguc21hbGxfY3VzdG9tZXJfbWFuYWdlZCAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxN3B4IC0xMDQxcHg7ICB3aWR0aDogMzBweDsgaGVpZ2h0OiAzOHB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy53YW54Lm1lZGl1bV9jdXN0b21lcl9tYW5hZ2VkICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDhweCAtMTAzMHB4OyAgIHdpZHRoOiA0MnB4OyBoZWlnaHQ6IDQ3cHg7fQorLnNwcml0ZS1wcm9kdWN0LWljb25zLndhbngubGFyZ2VfY3VzdG9tZXJfbWFuYWdlZCAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc3cHggLTEwMTFweDsgIHdpZHRoOiA2MXB4OyBoZWlnaHQ6IDY2cHg7fQorCisuc3ByaXRlLXByb2R1Y3QtaWNvbnMud2FueF9hdHRyX21hbmFnZWQgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yOTBweCAtMTExNHB4OyAgd2lkdGg6IDU5cHg7IGhlaWdodDogNjJweDt9Cisuc3ByaXRlLXByb2R1Y3QtaWNvbnMud2FueC5zbWFsbF9hdHRfbWFuYWdlZCAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxOHB4IC0xMTMxcHg7ICB3aWR0aDogMzFweDsgaGVpZ2h0OiAzNnB4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy53YW54Lm1lZGl1bV9hdHRfbWFuYWdlZCAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ5cHggLTExMjBweDsgICB3aWR0aDogNDJweDsgaGVpZ2h0OiA0N3B4O30KKy5zcHJpdGUtcHJvZHVjdC1pY29ucy53YW54LmxhcmdlX2F0dF9tYW5hZ2VkICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzdweCAtMTEwMXB4OyAgd2lkdGg6IDYwcHg7IGhlaWdodDogNjdweDt9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvc3ByaXRlLXJlc291cmNlLWljb25zLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvc3ByaXRlLXJlc291cmNlLWljb25zLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNjUyNwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zcHJpdGUtcmVzb3VyY2UtaWNvbnMubGVzcwpAQCAtMCwwICsxLDI1OCBAQAorLnNwcml0ZS1yZXNvdXJjZS1pY29ucyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdpbWFnZXMvc3ByaXRlcy9zcHJpdGUtcmVzb3VyY2UtaWNvbnMucG5nJyk7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworfQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmRpc2FibGUgICAgICAgICAgICAgICAgICB7IG9wYWNpdHk6MC41O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5ib3JkZXJFbGVtZW50ICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTQxcHg7ICB3aWR0aDogNjZweDsgaGVpZ2h0OiA1OHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYm9yZGVyRWxlbWVudC5zbWFsbCAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC03MXB4OyAgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmJvcmRlckVsZW1lbnQubWVkaXVtICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNTlweDsgIHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5ib3JkZXJFbGVtZW50LmxhcmdlICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTM5cHg7ICB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5yb3V0ZXIgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTEwOXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucm91dGVyLnNtYWxsICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0xNDFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnJvdXRlci5tZWRpdW0gICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMTI5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5yb3V0ZXIubGFyZ2UgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTEwOXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kYXRhYmFzZSAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTE4MHB4OyB3aWR0aDogNjNweDsgaGVpZ2h0OiA1NnB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGF0YWJhc2Uuc21hbGwgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0yMTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRhdGFiYXNlLm1lZGl1bSAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMTk5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kYXRhYmFzZS5sYXJnZSAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTE3OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5uZXR3b3JrICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTI1MnB4OyB3aWR0aDogNTdweDsgaGVpZ2h0OiA1N3B4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMubmV0d29yay5zbWFsbCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0yODFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm5ldHdvcmsubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMjY5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5uZXR3b3JrLmxhcmdlICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTI0OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5hcHBsaWNhdGlvblNlcnZlciAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTMyN3B4OyB3aWR0aDogMzdweDsgaGVpZ2h0OiA1MXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYXBwbGljYXRpb25TZXJ2ZXIuc21hbGwgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0zNTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmFwcGxpY2F0aW9uU2VydmVyLm1lZGl1bSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMzM5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5hcHBsaWNhdGlvblNlcnZlci5sYXJnZSAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTMxOXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5zZXJ2ZXIgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTM5OHB4OyB3aWR0aDogMzFweDsgaGVpZ2h0OiA1MXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuc2VydmVyLnNtYWxsICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00MjFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnNlcnZlci5tZWRpdW0gICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNDA5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5zZXJ2ZXIubGFyZ2UgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTM4OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5wb3J0ICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgxcHggLTQ4NHB4OyB3aWR0aDogNDFweDsgaGVpZ2h0OiAzNXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucG9ydC5zbWFsbCAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00OTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnBvcnQubWVkaXVtICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNDc5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5wb3J0LmxhcmdlICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTQ1OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5sb2FkQmFsYW5jZXIgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTUzOXB4OyB3aWR0aDogNDVweDsgaGVpZ2h0OiA0OXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMubG9hZEJhbGFuY2VyLnNtYWxsICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC01NjFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmxvYWRCYWxhbmNlci5tZWRpdW0gICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNTQ5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5sb2FkQmFsYW5jZXIubGFyZ2UgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTUyOXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5vYmplY3RTdG9yYWdlICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTYxMXB4OyB3aWR0aDogNTBweDsgaGVpZ2h0OiA0N3B4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMub2JqZWN0U3RvcmFnZS5zbWFsbCAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC02MzFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm9iamVjdFN0b3JhZ2UubWVkaXVtICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNjE5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5vYmplY3RTdG9yYWdlLmxhcmdlICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTU5OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jb21wdXRlICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTY4M3B4OyB3aWR0aDogNDVweDsgaGVpZ2h0OiA0NXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY29tcHV0ZS5zbWFsbCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC03MDFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmNvbXB1dGUubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDFweCAtNjg4cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jb21wdXRlLmxhcmdlICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTY2OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5nYXRld2F5ICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTc1OHB4OyB3aWR0aDogNDVweDsgaGVpZ2h0OiA0MXB4fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5nYXRld2F5LnNtYWxsICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTc3MnB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyN3B4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZ2F0ZXdheS5tZWRpdW0gICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC03NTlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmdhdGV3YXkubGFyZ2UgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtNzM5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmNvbm5lY3RvciAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtODMwcHg7IHdpZHRoOiA0NHB4OyBoZWlnaHQ6IDM4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jb25uZWN0b3Iuc21hbGwgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTg0MnB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyN3B4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY29ubmVjdG9yLm1lZGl1bSAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC04MjlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmNvbm5lY3Rvci5sYXJnZSAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtODA5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmJyb2NhZGUgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtOTIycHg7IHdpZHRoOiA5MXB4OyBoZWlnaHQ6IDE2cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5icm9jYWRlLnNtYWxsICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTkxMXB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYnJvY2FkZS5tZWRpdW0gICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC04OTlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmJyb2NhZGUubGFyZ2UgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtODc5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmNpc2NvICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtOTc1cHg7IHdpZHRoOiA2M3B4OyBoZWlnaHQ6IDMzcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jaXNjby5zbWFsbCAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTk4MXB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY2lzY28ubWVkaXVtICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC05NjlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmNpc2NvLmxhcmdlICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtOTQ5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmVyaWNzc29uICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtMTA1OXB4OyB3aWR0aDogMTAxcHg7IGhlaWdodDogMjBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmVyaWNzc29uLnNtYWxsICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMTA1MXB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZXJpY3Nzb24ubWVkaXVtICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0xMDM5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5lcmljc3Nvbi5sYXJnZSAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTEwMTlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMudHJvcG8gICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0xMTA5cHg7IHdpZHRoOiA0OHB4OyBoZWlnaHQ6IDM5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy50cm9wby5zbWFsbCAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTExMjFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnRyb3BvLm1lZGl1bSAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMTEwOXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMudHJvcG8ubGFyZ2UgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0xMDg5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLm15U3FsICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtMTE3MnB4OyB3aWR0aDogODlweDsgaGVpZ2h0OiA0NnB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMubXlTcWwuc21hbGwgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0xMTkxcHg7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5teVNxbC5tZWRpdW0gICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTExNzlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm15U3FsLmxhcmdlICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtMTE1OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5vcmFjbGUgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTEyNzdweDsgd2lkdGg6IDk3cHg7IGhlaWdodDogMTFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm9yYWNsZS5zbWFsbCAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMTI2MXB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMub3JhY2xlLm1lZGl1bSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0xMjQ5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5vcmFjbGUubGFyZ2UgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTEyMjlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGVmYXVsdGljb24gICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0yMDY5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kZWZhdWx0aWNvbi5zbWFsbCAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTIxMDFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRlZmF1bHRpY29uLm1lZGl1bSAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDFweCAtMjA4OXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGVmYXVsdGljb24ubGFyZ2UgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggLTIwNjlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZm9ydGluZXQgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0xNDE5cHg7IHdpZHRoOiA5NHB4OyBoZWlnaHQ6IDEwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5mb3J0aW5ldC5zbWFsbCAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTE0MDFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmZvcnRpbmV0Lm1lZGl1bSAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMTM4OXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZm9ydGluZXQubGFyZ2UgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0xMzY5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLm5va2lhX3NpZW1lbnMgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODFweCAtMTQ3NHB4OyB3aWR0aDogODlweDsgaGVpZ2h0OiAyNXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMubm9raWFfc2llbWVucy5zbWFsbCAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0xNDcxcHg7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5ub2tpYV9zaWVtZW5zLm1lZGl1bSAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTE0NTlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm5va2lhX3NpZW1lbnMubGFyZ2UgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtMTQzOXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5hdHQgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgxcHggLTE1MzhweDsgd2lkdGg6IDc3cHg7IGhlaWdodDogMzFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmF0dC5zbWFsbCAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMTU0MXB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYXR0Lm1lZGl1bSAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0xNTI5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5hdHQubGFyZ2UgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTE1MDlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuanVuaXBlciAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MXB4IC0xNjA5cHg7IHdpZHRoOiA5M3B4OyBoZWlnaHQ6IDMxcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5qdW5pcGVyLnNtYWxsICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTE2MTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmp1bmlwZXIubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMTU5OXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuanVuaXBlci5sYXJnZSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0xNTc5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmNsb3VkICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODFweCAtMTY2NHB4OyB3aWR0aDogNDRweDsgaGVpZ2h0OiA0NXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY2xvdWQuc21hbGwgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0xNjgxcHg7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jbG91ZC5tZWRpdW0gICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTE2NjlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmNsb3VkLmxhcmdlICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtMTY0OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jYWxsX2NvbnRyb2xsICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjc4cHggLTE3MzlweDsgd2lkdGg6IDM1cHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmNhbGxfY29udHJvbGwuc21hbGwgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMTc1MXB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY2FsbF9jb250cm9sbC5tZWRpdW0gICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0xNzM5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jYWxsX2NvbnRyb2xsLmxhcmdlICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTE3MTlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYnJvYWRzb2Z0ICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0xODI0cHg7IHdpZHRoOiAxMDhweDsgaGVpZ2h0OiAyMnB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYnJvYWRzb2Z0LnNtYWxsICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0xODIxcHg7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5icm9hZHNvZnQubWVkaXVtICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTE4MDlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmJyb2Fkc29mdC5sYXJnZSAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtMTc4OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5hbGNhdGVsTHVjZW50ICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgxcHggLTE5MDFweDsgd2lkdGg6IDExOHB4OyBoZWlnaHQ6IDI1cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5hbGNhdGVsTHVjZW50LnNtYWxsICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTE4OTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmFsY2F0ZWxMdWNlbnQubWVkaXVtICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMTg3OXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYWxjYXRlbEx1Y2VudC5sYXJnZSAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0xODU5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLm1ldGFzd2l0Y2ggICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtMTk2MXB4OyB3aWR0aDogMTE1cHg7IGhlaWdodDogMjdweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm1ldGFzd2l0Y2guc21hbGwgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMTk2MXB4OyB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMubWV0YXN3aXRjaC5tZWRpdW0gICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0xOTQ5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5tZXRhc3dpdGNoLmxhcmdlICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTE5MjlweDsgd2lkdGg6IDYxcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYXJpY2VudCAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0yMDQ2cHg7IHdpZHRoOiA5M3B4OyBoZWlnaHQ6IDEzcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5hcmljZW50LnNtYWxsICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTIwMzFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmFyaWNlbnQubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMjAxOXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuYXJpY2VudC5sYXJnZSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0xOTk5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmNwICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC05MHB4IC00MDM4cHg7IHdpZHRoOiAyMXB4OyBoZWlnaHQ6IDIxcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jcC5zbWFsbCAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTBweCAtNDAzOHB4OyB3aWR0aDogMjFweDsgaGVpZ2h0OiAyMXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY3AubWVkaXVtICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE1MXB4IC00MDQ4cHg7IHdpZHRoOiAyMXB4OyBoZWlnaHQ6IDIxcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jcC5sYXJnZSAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTk0cHggLTQwMzRweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMudmwgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0yNTkxcHg7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy52bC5zbWFsbCAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTI1OTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnZsLm1lZGl1bSAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDFweCAtMjU3OXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMudmwubGFyZ2UgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggLTI1NjBweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY2xvdWRlcCAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0yMjI1cHg7IHdpZHRoOiA2M3B4OyBoZWlnaHQ6IDQzcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5jbG91ZGVwLnNtYWxsICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA5cHggLTIyNDFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmNsb3VkZXAubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDFweCAtMjIyOXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuY2xvdWRlcC5sYXJnZSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggLTIyMDlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucGVyc29uZXAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0yMjkycHg7IHdpZHRoOiA0N3B4OyBoZWlnaHQ6IDQ3cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5wZXJzb25lcC5zbWFsbCAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTIzMTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnBlcnNvbmVwLm1lZGl1bSAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDFweCAtMjI5OXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucGVyc29uZXAubGFyZ2UgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggLTIyNzlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucHJlbWlzZXNlcCAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MXB4IC0yMzYwcHg7IHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDUwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5wcmVtaXNlc2VwLnNtYWxsICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTIzODBweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnByZW1pc2VzZXAubWVkaXVtICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDFweCAtMjM2OHB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucHJlbWlzZXNlcC5sYXJnZSAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggLTIzNDlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMub3NzZXAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MXB4IC0yNDIwcHg7IHdpZHRoOiA2N3B4OyBoZWlnaHQ6IDU5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5vc3NlcC5zbWFsbCAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTI0NTFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm9zc2VwLm1lZGl1bSAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDFweCAtMjQzOXB4OyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMub3NzZXAubGFyZ2UgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogIC03MHB4IC0yNDE5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmZpcmV3YWxsICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtMzI1N3B4OyB3aWR0aDogNzNweDsgaGVpZ2h0OiA3NHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZmlyZXdhbGwuc21hbGwgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0zMzAxcHg7IHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5maXJld2FsbC5tZWRpdW0gICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTMyODlweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmZpcmV3YWxsLmxhcmdlICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246ICAtNzBweCAtMzI3MHB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy52ZncgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTMyNTdweDsgd2lkdGg6IDczcHg7IGhlaWdodDogNzRweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnZmdy5zbWFsbCAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMzMwMXB4OyB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMudmZ3Lm1lZGl1bSAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MXB4IC0zMjg5cHg7IHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy52ZncubGFyZ2UgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAgLTcwcHggLTMyNzBweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMudWNwZSAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0zMTIwcHg7IHdpZHRoOiA1OXB4OyBoZWlnaHQ6IDYwcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy51Y3BlLnNtYWxsICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAgLTIxMHB4IC0zMTUwcHg7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy51Y3BlLm1lZGl1bSAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTMxMzdweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnVjcGUubGFyZ2UgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC0zMTE5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLnZyb3V0ZXIgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtMzA2NnB4OyB3aWR0aDogNjlweDsgaGVpZ2h0OiA0M3B4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMudnJvdXRlci5zbWFsbCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0zMDgwcHg7IHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy52cm91dGVyLm1lZGl1bSAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTMwNjhweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnZyb3V0ZXIubGFyZ2UgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246ICAtNzBweCAtMzA0OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy53YW54ICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODNweCAtMjk5MnB4OyB3aWR0aDogNThweDsgaGVpZ2h0OiA0N3B4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMud2FueC5zbWFsbCAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTMwMDlweDsgd2lkdGg6IDMwcHg7IGhlaWdodDogMzBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLndhbngubWVkaXVtICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MXB4IC0yOTk4cHg7IHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy53YW54LmxhcmdlICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC0yOTc5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisvLy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucm9sZXMgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtMjA2OXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKy8vLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5yb2xlcy5zbWFsbCAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTIxMDFweDsgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9CisvLy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMucm9sZXMubWVkaXVtICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MXB4IC0yMDg5cHg7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7fQorLy8uc3ByaXRlLXJlc291cmNlLWljb25zLnJvbGVzLmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC0yMDY5cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLm5ldHdvcmtydWxlcyAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTQ3MzFweDsgd2lkdGg6IDQ5cHg7IGhlaWdodDogNThweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm5ldHdvcmtydWxlcy5zbWFsbCAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTQ3NDlweDsgd2lkdGg6IDMxcHg7IGhlaWdodDogMzZweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm5ldHdvcmtydWxlcy5tZWRpdW0gICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTQ3MzdweDsgd2lkdGg6IDQycHg7IGhlaWdodDogNDdweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLm5ldHdvcmtydWxlcy5sYXJnZSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAtNDcxOHB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2N3B4O30KKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5zZWN1cml0eXJ1bGVzICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtNDY1MXB4OyB3aWR0aDogNDlweDsgaGVpZ2h0OiA1OHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuc2VjdXJpdHlydWxlcy5zbWFsbCAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTQ2NjlweDsgd2lkdGg6IDMxcHg7IGhlaWdodDogMzZweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLnNlY3VyaXR5cnVsZXMubWVkaXVtICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MXB4IC00NjU3cHg7IHdpZHRoOiA0MnB4OyBoZWlnaHQ6IDQ3cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5zZWN1cml0eXJ1bGVzLmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC00NjM4cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDY3cHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfc291cmNlICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtNDU2M3B4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGNhZV9zb3VyY2Uuc21hbGwgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00NTg4cHg7IHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kY2FlX3NvdXJjZS5tZWRpdW0gICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTQ1NzZweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfc291cmNlLmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC00NTU4cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfY29sbGVjdG9yICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODBweCAtNDUwMHB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGNhZV9jb2xsZWN0b3Iuc21hbGwgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00NTA4cHg7IHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kY2FlX2NvbGxlY3Rvci5tZWRpdW0gICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTQ0OTZweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfY29sbGVjdG9yLmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC02OXB4IC00NDc3cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfdXRpbHR5ICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODNweCAtNDI0NnB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGNhZV91dGlsdHkuc21hbGwgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00MjY4cHg7IHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kY2FlX3V0aWx0eS5tZWRpdW0gICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTQyNTZweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfdXRpbHR5LmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC00MjM4cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfbWljcm9zZXJ2aWNlICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODFweCAtNDE2N3B4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGNhZV9taWNyb3NlcnZpY2Uuc21hbGwgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00MTg4cHg7IHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kY2FlX21pY3Jvc2VydmljZS5tZWRpdW0gICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTQxNzZweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfbWljcm9zZXJ2aWNlLmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MXB4IC00MTU3cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfYW5hbHl0aWNzICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtNDQwOXB4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGNhZV9hbmFseXRpY3Muc21hbGwgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00NDI0cHg7IHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kY2FlX2FuYWx5dGljcy5tZWRpdW0gICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQxcHggLTQ0MTNweDsgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfYW5hbHl0aWNzLmxhcmdlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4IC00Mzk0cHg7IHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfZGF0YWJhc2UgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0xODBweDsgd2lkdGg6IDYzcHg7IGhlaWdodDogNTZweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfZGF0YWJhc2Uuc21hbGwgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0yMTFweDsgd2lkdGg6IDI5cHg7IGhlaWdodDogMjlweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfZGF0YWJhc2UubWVkaXVtICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0xOTlweDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfZGF0YWJhc2UubGFyZ2UgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0xNzlweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKworLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kY2FlX3BvbGljeSAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTQzMzJweDsgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9Cisuc3ByaXRlLXJlc291cmNlLWljb25zLmRjYWVfcG9saWN5LnNtYWxsICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtNDM0OHB4OyB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOXB4O30KKy5zcHJpdGUtcmVzb3VyY2UtaWNvbnMuZGNhZV9wb2xpY3kubWVkaXVtICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MXB4IC00MzM2cHg7IHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1yZXNvdXJjZS1pY29ucy5kY2FlX3BvbGljeS5sYXJnZSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAtNDMxN3B4OyB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Nwcml0ZS1zZXJ2aWNlcy1pY29ucy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Nwcml0ZS1zZXJ2aWNlcy1pY29ucy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTY2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvc3ByaXRlLXNlcnZpY2VzLWljb25zLmxlc3MKQEAgLTAsMCArMSw2NiBAQAorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdpbWFnZXMvc3ByaXRlcy9zcHJpdGUtc2VydmljZXMtaWNvbnMucG5nJyk7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworfQorCisuc3ByaXRlLXNlcnZpY2VzLWljb25zLmRpc2FibGUgICAgICAgICAgICAgICAgICB7IG9wYWNpdHk6MC41O30KKworLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5jb21wdXRlICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTQ2cHg7ICB3aWR0aDogNTVweDsgaGVpZ2h0OiA1M3B4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuY29tcHV0ZS5zbWFsbCAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC03MXB4OyAgd2lkdGg6IDI5cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLmNvbXB1dGUubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNTlweDsgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQwcHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5jb21wdXRlLmxhcmdlICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTQxcHg7ICB3aWR0aDogNjFweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5wbGF0Zm9ybSAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTEyMnB4OyAgd2lkdGg6IDU1cHg7IGhlaWdodDogNDVweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLnBsYXRmb3JtLnNtYWxsICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMTQwcHg7ICB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOXB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMucGxhdGZvcm0ubWVkaXVtICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0xMjhweDsgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5wbGF0Zm9ybS5sYXJnZSAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTEwOXB4OyAgd2lkdGg6IDYxcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuc3RvcmFnZSAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC0xOTRweDsgIHdpZHRoOiA1NXB4OyBoZWlnaHQ6IDQ0cHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5zdG9yYWdlLnNtYWxsICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTIxMHB4OyAgd2lkdGg6IDI5cHg7IGhlaWdodDogMjlweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLnN0b3JhZ2UubWVkaXVtICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtMTk4cHg7ICB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuc3RvcmFnZS5sYXJnZSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0xNzhweDsgIHdpZHRoOiA2MXB4OyBoZWlnaHQ6IDYxcHg7fQorCisuc3ByaXRlLXNlcnZpY2VzLWljb25zLmNhbGxfY29udHJvbGwgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtMjY4cHg7ICB3aWR0aDogMzZweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuY2FsbF9jb250cm9sbC5zbWFsbCAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0yODBweDsgIHdpZHRoOiAyOXB4OyBoZWlnaHQ6IDI5cHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5jYWxsX2NvbnRyb2xsLm1lZGl1bSAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTI2OHB4OyAgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLmNhbGxfY29udHJvbGwubGFyZ2UgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtMjQ4cHg7ICB3aWR0aDogNjFweDsgaGVpZ2h0OiA2MXB4O30KKworLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5jb2xsYWJvcmF0aW9uICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTMzNXB4OyAgd2lkdGg6IDQzcHg7IGhlaWdodDogNDRweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLmNvbGxhYm9yYXRpb24uc21hbGwgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtMzUwcHg7ICB3aWR0aDogMjlweDsgaGVpZ2h0OiAyOXB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuY29sbGFib3JhdGlvbi5tZWRpdW0gICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC0zMzhweDsgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5jb2xsYWJvcmF0aW9uLmxhcmdlICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTMxOHB4OyAgd2lkdGg6IDYxcHg7IGhlaWdodDogNjFweDt9CisKKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuY29sbGFib3JhdGlvbjEgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MHB4IC00MTdweDsgIHdpZHRoOiA0OXB4OyBoZWlnaHQ6IDMycHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5jb2xsYWJvcmF0aW9uMS5zbWFsbCAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA5cHggLTQxOXB4OyAgd2lkdGg6IDI5cHg7IGhlaWdodDogMjlweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLmNvbGxhYm9yYXRpb24xLm1lZGl1bSAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNDA4cHg7ICB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuY29sbGFib3JhdGlvbjEubGFyZ2UgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC0zODhweDsgIHdpZHRoOiA2MXB4OyBoZWlnaHQ6IDYxcHg7fQorCisuc3ByaXRlLXNlcnZpY2VzLWljb25zLm1lc3NhZ2luZyAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtNDgycHg7ICB3aWR0aDogNDNweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMubWVzc2FnaW5nLnNtYWxsICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC00OTFweDsgIHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5tZXNzYWdpbmcubWVkaXVtICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTQ3OHB4OyAgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLm1lc3NhZ2luZy5sYXJnZSAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtNDU4cHg7ICB3aWR0aDogNjFweDsgaGVpZ2h0OiA2MXB4O30KKworLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5ub3RpZmljYXRpb24gICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjgycHggLTUzOHB4OyAgd2lkdGg6IDQzcHg7IGhlaWdodDogNTJweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLm5vdGlmaWNhdGlvbi5zbWFsbCAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtNTYxcHg7ICB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMubm90aWZpY2F0aW9uLm1lZGl1bSAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC01NDhweDsgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5ub3RpZmljYXRpb24ubGFyZ2UgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTUyOHB4OyAgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CisKKy5zcHJpdGUtc2VydmljZXMtaWNvbnMubW9iaWxpdHkgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI4MnB4IC01OThweDsgIHdpZHRoOiA2NHB4OyBoZWlnaHQ6IDYycHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5tb2JpbGl0eS5zbWFsbCAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjEwcHggLTYzMHB4OyAgd2lkdGg6IDI5cHg7IGhlaWdodDogMjlweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLm1vYmlsaXR5Lm1lZGl1bSAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNjE4cHg7ICB3aWR0aDogNDFweDsgaGVpZ2h0OiA0MXB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMubW9iaWxpdHkubGFyZ2UgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggIC02MDFweDsgIHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorCisuc3ByaXRlLXNlcnZpY2VzLWljb25zLm5ldHdvcmtfbF8xLTMgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yODJweCAtNjcycHg7ICB3aWR0aDogNjNweDsgaGVpZ2h0OiA1N3B4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMubmV0d29ya19sXzEtMy5zbWFsbCAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC03MDFweDsgIHdpZHRoOiAyOHB4OyBoZWlnaHQ6IDI4cHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5uZXR3b3JrX2xfMS0zLm1lZGl1bSAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTM5cHggLTY4OHB4OyAgd2lkdGg6IDQxcHg7IGhlaWdodDogNDFweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLm5ldHdvcmtfbF8xLTMubGFyZ2UgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC03MHB4ICAtNjcxcHg7ICB3aWR0aDogNjBweDsgaGVpZ2h0OiA2MHB4O30KKworLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5uZXR3b3JrX2xfNCAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjg2cHggLTc0NHB4OyAgd2lkdGg6IDYzcHg7IGhlaWdodDogNTdweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLm5ldHdvcmtfbF80LnNtYWxsICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMTBweCAtNzcxcHg7ICB3aWR0aDogMjhweDsgaGVpZ2h0OiAyOHB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMubmV0d29ya19sXzQubWVkaXVtICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC03NThweDsgIHdpZHRoOiA0MXB4OyBoZWlnaHQ6IDQxcHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5uZXR3b3JrX2xfNC5sYXJnZSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzBweCAgLTc0MHB4OyAgd2lkdGg6IDYxcHg7IGhlaWdodDogNjFweDt9CisKKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuZGVmYXVsdGljb24gICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI3MHB4IC04MTBweDsgIHdpZHRoOiA2MHB4OyBoZWlnaHQ6IDYwcHg7fQorLnNwcml0ZS1zZXJ2aWNlcy1pY29ucy5kZWZhdWx0aWNvbi5zbWFsbCAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjIwcHggLTg0MnB4OyAgd2lkdGg6IDI4cHg7IGhlaWdodDogMjhweDt9Cisuc3ByaXRlLXNlcnZpY2VzLWljb25zLmRlZmF1bHRpY29uLm1lZGl1bSAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjlweCAtODMwcHg7ICB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4O30KKy5zcHJpdGUtc2VydmljZXMtaWNvbnMuZGVmYXVsdGljb24ubGFyZ2UgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwcHggLTgwOXB4OyAgd2lkdGg6IDYwcHg7IGhlaWdodDogNjBweDt9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvc3ByaXRlLmh0bWwgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvc3ByaXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1YzI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zcHJpdGUuaHRtbApAQCAtMCwwICsxLDY1IEBACis8IWRvY3R5cGUgaHRtbD4KKzxodG1sPgorCisgICAgPGhlYWQ+CisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYXBwLmNzcyI+CisgICAgPC9oZWFkPgorCisgICAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KKworICAgICAgICA8aDE+U3ByaXRlIGljb25zPC9oMT4KKworICAgICAgICA8dGFibGU+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGg+PHNwYW4gY2xhc3M9InNwcml0ZS1uZXcgY2hlY2tib3hfY2hlY2tlZCI+PC9zcGFuPjwvdGg+CisgICAgICAgICAgICAgICAgPHRkPmNoZWNrYm94X2NoZWNrZWQ8L3RkPgorCisgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IGNoZWNrYm94X3VuY2hlY2tlZCI+PC9zcGFuPjwvdGg+CisgICAgICAgICAgICAgICAgPHRkPmNoZWNrYm94X3VuY2hlY2tlZDwvdGQ+CisKKyAgICAgICAgICAgICAgICA8dGg+PHNwYW4gY2xhc3M9InNwcml0ZS1uZXcgY2hlY2tib3hfZGlzYWJsZWQiPjwvc3Bhbj48L3RoPgorICAgICAgICAgICAgICAgIDx0ZD5jaGVja2JveF9kaXNhYmxlZDwvdGQ+CisKKyAgICAgICAgICAgICAgICA8dGg+PHNwYW4gY2xhc3M9InNwcml0ZS1uZXcgY2hlY2tib3hfZm9jdXMiPjwvc3Bhbj48L3RoPgorICAgICAgICAgICAgICAgIDx0ZD5jaGVja2JveF9mb2N1czwvdGQ+CisgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IGFkZC1pY29uIj48L3NwYW4+PC90aD4KKyAgICAgICAgICAgICAgICA8dGQ+YWRkLWljb248L3RkPgorCisgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IGltcG9ydC1pY29uIj48L3NwYW4+PC90aD4KKyAgICAgICAgICAgICAgICA8dGQ+aW1wb3J0LWljb248L3RkPgorICAgICAgICAgICAgPC90cj4KKworICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0aD48c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyB2aWRlby1pY29uIj48L3NwYW4+PC90aD4KKyAgICAgICAgICAgICAgICA8dGQ+dmlkZW8taWNvbjwvdGQ+CisKKyAgICAgICAgICAgICAgICA8dGg+PHNwYW4gY2xhc3M9InNwcml0ZS1uZXcgdmlkZW8taWNvbl8xIj48L3NwYW4+PC90aD4KKyAgICAgICAgICAgICAgICA8dGQ+dmlkZW8taWNvbl8xPC90ZD4KKworICAgICAgICAgICAgICAgIDx0aD48c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyB2aWRlby1pY29uXzIiPjwvc3Bhbj48L3RoPgorICAgICAgICAgICAgICAgIDx0ZD52aWRlby1pY29uXzI8L3RkPgorCisgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IHZpZGVvLWljb25fZGlzYWJsZWQiPjwvc3Bhbj48L3RoPgorICAgICAgICAgICAgICAgIDx0ZD52aWRlby1pY29uX2Rpc2FibGVkPC90ZD4KKworICAgICAgICAgICAgICAgIDx0aD48c3BhbiBjbGFzcz0ic3ByaXRlLW5ldyB2aWRlby1pY29uX2ZvY3VzIj48L3NwYW4+PC90aD4KKyAgICAgICAgICAgICAgICA8dGQ+dmlkZW8taWNvbl9mb2N1czwvdGQ+CisgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRoPjxzcGFuIGNsYXNzPSJzcHJpdGUtbmV3IGluZm8taWNvbiI+PC9zcGFuPjwvdGg+CisgICAgICAgICAgICAgICAgPHRkPmluZm8taWNvbjwvdGQ+CisKKyAgICAgICAgICAgICAgICA8dGg+PHNwYW4gY2xhc3M9InNwcml0ZS1uZXcgaW5mby1pY29uXzEiPjwvc3Bhbj48L3RoPgorICAgICAgICAgICAgICAgIDx0ZD5pbmZvLWljb25fMTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorCisgICAgICAgIDwvdGFibGU+CisKKyAgICA8L2JvZHk+CisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zcHJpdGUubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy9zcHJpdGUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2MwMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Nwcml0ZS5sZXNzCkBAIC0wLDAgKzEsMjEyIEBACisuc3ByaXRlLW5ldyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdpbWFnZXMvc3ByaXRlcy9zcHJpdGUtZ2xvYmFsLnBuZycpOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKK30KKworLmFkZC1pY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4ICAtNzdweDsgd2lkdGg6IDIzcHg7IGhlaWdodDogMjNweDt9CisuYWRkLWljb24taG92ZXIgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE1MHB4IC03N3B4OyB3aWR0aDogMjNweDsgaGVpZ2h0OiAyM3B4O30KKy5pbXBvcnQtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTAwcHggLTgxcHg7IHdpZHRoOiAyM3B4OyBoZWlnaHQ6IDIzcHg7fQorCisuYWRkLWljb24tYmx1ZSAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM1MHB4IC0xMjVweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDt9CisuYWRkLWljb24tYmx1ZS1ob3ZlciAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQwMHB4IC0xMjVweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDt9CisKKy52aWRlby1pY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTRweCAgLTExM3B4OyB3aWR0aDogMzNweDsgaGVpZ2h0OiAyNnB4O30KKy52aWRlby1pY29uXzEgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTA0cHggLTExM3B4OyB3aWR0aDogMzNweDsgaGVpZ2h0OiAyNnB4O30KKy52aWRlby1pY29uXzIgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTU0cHggLTExM3B4OyB3aWR0aDogMzNweDsgaGVpZ2h0OiAyNnB4O30KKy52aWRlby1pY29uX2Rpc2FibGVkICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA0cHggLTExM3B4OyB3aWR0aDogMzNweDsgaGVpZ2h0OiAyNnB4O30KKy52aWRlby1pY29uX2ZvY3VzICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjUwcHggLTExMXB4OyB3aWR0aDogNDFweDsgaGVpZ2h0OiAzMnB4O30KKworLnZzcC1saXN0LWljb24gICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4ICAtMTQzcHg7IHdpZHRoOiAyNnB4OyBoZWlnaHQ6IDI5cHg7fQorLnZzcC1saXN0LWljb24tYWN0aXZlICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDRweCAtMTQzcHg7IHdpZHRoOiAyNnB4OyBoZWlnaHQ6IDI5cHg7fQorLnZzcC1saXN0LWljb246YWN0aXZlOm5vdCguZGlzYWJsZSkgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDRweCAtMTQzcHg7IHdpZHRoOiAyNnB4OyBoZWlnaHQ6IDI5cHg7fQorLnZzcC1saXN0LWljb24taG92ZXIgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNTRweCAtMTQzcHg7IHdpZHRoOiAyNnB4OyBoZWlnaHQ6IDI5cHg7fQorLnZzcC1saXN0LWljb246aG92ZXI6bm90KC5kaXNhYmxlKSAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNTRweCAtMTQzcHg7IHdpZHRoOiAyNnB4OyBoZWlnaHQ6IDI5cHg7fQorLnZzcC1saXN0LWljb24uZGlzYWJsZSAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDRweCAtMTQzcHg7IHdpZHRoOiAyNnB4OyBoZWlnaHQ6IDI5cHg7fQorCisuaW5mby1pY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggIC0xNzlweDsgd2lkdGg6IDE0cHg7IGhlaWdodDogMTRweDt9CisuaW5mby1pY29uXzEgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwMHB4IC0xNzlweDsgd2lkdGg6IDE0cHg7IGhlaWdodDogMTRweDt9CisKKy5wbHVzLWljb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAgLTIzMXB4OyB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4O30KKy5wbHVzLWljb24taG92ZXIgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTAwcHggLTIzMXB4OyB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4O30KKworLmRlbGV0ZS1pY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY1MHB4IC0yMzFweDsgd2lkdGg6IDExcHg7IGhlaWdodDogMTNweDt9CisuZGVsZXRlLWljb24taG92ZXIgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzAycHggLTIzMXB4OyB3aWR0aDogMTFweDsgaGVpZ2h0OiAxM3B4O30KKworLmFycm93LXVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNTBweCAtMjM2cHg7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDdweDt9CisuYXJyb3ctdXAtaG92ZXIgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQwMHB4IC0yMzZweDsgd2lkdGg6IDEycHg7IGhlaWdodDogN3B4O30KKworLmFycm93LXVwLXNtYWxsICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNTBweCAtMjM3cHg7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDZweDt9CisuYXJyb3ctdXAtc21hbGwtaG92ZXIgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMwMHB4IC0yMzdweDsgd2lkdGg6IDEycHg7IGhlaWdodDogNnB4O30KKworLnNvcnQtYXJyb3dzICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00NTBweCAtMjMxcHg7IHdpZHRoOiA4cHg7IGhlaWdodDogMTJweDt9Cisuc29ydC1hcnJvd3MtaG92ZXIgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwMHB4IC0yMzFweDsgd2lkdGg6IDhweDsgaGVpZ2h0OiAxMnB4O30KKworLmFycm93LXJpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NTBweCAtMjM1cHg7ICB3aWR0aDogNXB4OyAgaGVpZ2h0OiA4cHg7fQorLmFycm93LXJpZ2h0LWhvdmVyICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC02MDBweCAtMjM1cHg7ICB3aWR0aDogNXB4OyAgaGVpZ2h0OiA4cHg7fQorCisubWVudS1vcGVuLWxlZnQgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM1MHB4IC0yODNweDsgIHdpZHRoOiA2cHg7ICBoZWlnaHQ6IDEwcHg7fQorLm1lbnUtb3Blbi1yaWdodCAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00MDBweCAtMjgzcHg7ICB3aWR0aDogNnB4OyAgaGVpZ2h0OiAxMHB4O30KKworCisucHJpdmF0ZS1zdGF0dXMtaWNvbiAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggIC0zMjZweDsgd2lkdGg6IDIxcHg7IGhlaWdodDogMTdweDt9CisuaW4tZGVzaWduLXN0YXR1cy1pY29uICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMwN3B4IC0zMjdweDsgd2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDt9CisuY2hlY2tvdXQtZWRpdGFibGUtc3RhdHVzLWljb24gICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwMHB4IC0zMjZweDsgd2lkdGg6IDI0cHg7IGhlaWdodDogMTdweDt9CisuY2hlY2tpbi1zdGF0dXMtaWNvbiAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwMHB4IC0zMjZweDsgd2lkdGg6IDI0cHg7IGhlaWdodDogMTdweDt9CisuY2hlY2tvdXQtbm90LWVkaXRhYmxlLXN0YXR1cy1pY29uICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE1MHB4IC0zMjZweDsgd2lkdGg6IDI0cHg7IGhlaWdodDogMTdweDt9CisKKworLy93b3Jrc3BhY2UgYnV0dG9ucworLngtYnRuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtNDE5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDsgIH0KKy54LWJ0bjpob3ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggLTQ0N3B4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7ICB9CisueC1idG46YWN0aXZlICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4IC00NzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4OyAgfQorCisuZGVsZXRlLWJ0biAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNDE5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDsgIH0KKy5kZWxldGUtYnRuOmhvdmVyOm5vdCguZGlzYWJsZSkgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0MHB4IC00NDdweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4OyAgfQorLmRlbGV0ZS1idG46YWN0aXZlOm5vdCguZGlzYWJsZSkgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQwcHggLTQ3OXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7ICB9CisuZGVsZXRlLWJ0bi5kaXNhYmxlICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDBweCAtNTM5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDsgIH0KKworLnNhdmUtYnRuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjMwcHggLTQxOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7ICB9Cisuc2F2ZS1idG46aG92ZXI6bm90KC5kaXNhYmxlKSAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMzBweCAtNDQ3cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDsgIH0KKy5zYXZlLWJ0bjphY3RpdmU6bm90KC5kaXNhYmxlKSAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIzMHB4IC00NzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4OyAgfQorLnNhdmUtYnRuLmRpc2FibGUgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjMwcHggLTUzOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7ICB9CisKKy5yZXZlcnQtYnRuICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwMHB4IC00MTlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4OyAgfQorLnJldmVydC1idG46aG92ZXI6bm90KC5kaXNhYmxlKSAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjAwcHggLTQ0N3B4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7ICB9CisucmV2ZXJ0LWJ0bjphY3RpdmU6bm90KC5kaXNhYmxlKSAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDBweCAtNDc5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDsgIH0KKy5yZXZlcnQtYnRuLmRpc2FibGUgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwMHB4IC01MzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4OyAgfQorCisuc3VjY2Vzcy1jaXJjbGUgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4ICAtNzAzcHg7ICB3aWR0aDogMjBweDsgIGhlaWdodDogMjBweDsgIH0KKy5zdWNjZXNzLWNpcmNsZS1zbWFsbCAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3MHB4IC03MDZweDsgIHdpZHRoOiAxMnB4OyAgaGVpZ2h0OiAxMnB4OyAgfQorLnNkYy1zdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTAxcHggLTcwN3B4OyAgd2lkdGg6IDEwcHg7ICBoZWlnaHQ6IDEwcHg7ICB9Cisuc2RjLWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNTFweCAtNzA3cHg7ICB3aWR0aDogMTBweDsgIGhlaWdodDogMTBweDsgIH0KKworLnByaW50LXNjcmVlbi1idG4gICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjU5cHggLTQxOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7ICB9CisucHJpbnQtc2NyZWVuLWJ0bjpob3Zlcjpub3QoLmRpc2FibGUpICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNTlweCAtNDQ3cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDsgIH0KKy5wcmludC1zY3JlZW4tYnRuOmFjdGl2ZTpub3QoLmRpc2FibGUpICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI1OXB4IC00NzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4OyAgfQorLnByaW50LXNjcmVlbi1idG4uZGlzYWJsZSAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjU5cHggLTUzOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7ICB9CisKKy51cmwtYnRuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjM2cHggLTQyNHB4OyAgd2lkdGg6IDE5cHg7ICBoZWlnaHQ6IDE5cHg7ICB9CisudXJsLWJ0bjpob3ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTYzNnB4IC00MjRweDsgIHdpZHRoOiAxOXB4OyAgaGVpZ2h0OiAxOXB4OyAgfQorLnVybC1idG46YWN0aXZlICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02MzZweCAtNDgycHg7ICB3aWR0aDogMTlweDsgIGhlaWdodDogMTlweDsgIH0KKworCisKKworLypuZXcgdGFicyBpY29ucyovCisuc3ByaXRlLW5ldy5pbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC02MzFweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDt9Cisuc3ByaXRlLW5ldy5pbmZvOmFjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC02NjlweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDt9CisuYWN0aXZlID4gLnNwcml0ZS1uZXcuaW5mbyAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC02NjlweDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDt9CisKKworLnNwcml0ZS1uZXcuc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDFweCAtNjMwcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE3cHg7fQorLnNwcml0ZS1uZXcuc3RydWN0dXJlOmFjdGl2ZSAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDFweCAtNjY4cHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE3cHg7fQorLmFjdGl2ZSA+IC5zcHJpdGUtbmV3LnN0cnVjdHVyZSAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMDFweCAtNjY4cHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE3cHg7fQorCisKKy5zcHJpdGUtbmV3LmRlcGxveW1lbnQtYXJ0aWZhY3RzICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTUwcHggLTYyOXB4OyB3aWR0aDogMTdweDsgaGVpZ2h0OiAxOXB4O30KKy5zcHJpdGUtbmV3LmRlcGxveW1lbnQtYXJ0aWZhY3RzOmFjdGl2ZSAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTUwcHggLTY2N3B4OyB3aWR0aDogMTdweDsgaGVpZ2h0OiAxOXB4O30KKy5hY3RpdmUgPiAuZGVwbG95bWVudC1hcnRpZmFjdHMgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTUwcHggLTY2N3B4OyB3aWR0aDogMTdweDsgaGVpZ2h0OiAxOXB4O30KKworLnNwcml0ZS1uZXcuaW5wdXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDBweCAtNjM0cHg7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDEycHg7fQorLnNwcml0ZS1uZXcuaW5wdXRzOmFjdGl2ZSAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDBweCAtNjcycHg7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDEycHg7fQorLmFjdGl2ZSA+IC5zcHJpdGUtbmV3LmlucHV0cyAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDBweCAtNjcycHg7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDEycHg7fQorCisKKy5zcHJpdGUtbmV3LmluZm9ybWF0aW9uLWFydGlmYWN0cyAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI1MHB4IC02MzFweDsgd2lkdGg6IDE3cHg7IGhlaWdodDogMTlweDt9Cisuc3ByaXRlLW5ldy5pbmZvcm1hdGlvbi1hcnRpZmFjdHM6YWN0aXZlICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNTBweCAtNjY5cHg7IHdpZHRoOiAxN3B4OyBoZWlnaHQ6IDE5cHg7fQorLmFjdGl2ZSA+IC5zcHJpdGUtbmV3LmluZm9ybWF0aW9uLWFydGlmYWN0cyAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjUwcHggLTY2OXB4OyB3aWR0aDogMTdweDsgaGVpZ2h0OiAxOXB4O30KKworLnNwcml0ZS1uZXcucmVsYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzAwcHggLTYzMnB4OyB3aWR0aDogMjBweDsgIGhlaWdodDogMjBweDt9Cisuc3ByaXRlLW5ldy5yZWxhdGlvbnM6YWN0aXZlICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMDBweCAtNjMycHg7IHdpZHRoOiAyMHB4OyAgaGVpZ2h0OiAyMHB4O30KKy5hY3RpdmUgPiAuc3ByaXRlLW5ldy5yZWxhdGlvbnMgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMwMHB4IC02MzJweDsgd2lkdGg6IDIwcHg7ICBoZWlnaHQ6IDIwcHg7fQorCisKKy5zcHJpdGUtbmV3LmFwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQwMHB4IC02MzFweDsgd2lkdGg6IDIzcHg7ICBoZWlnaHQ6IDE5cHg7fQorLnNwcml0ZS1uZXcuYXBpOmFjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDAwcHggLTY3MXB4OyB3aWR0aDogMjNweDsgIGhlaWdodDogMTlweDt9CisuYWN0aXZlID4gLnNwcml0ZS1uZXcuYXBpICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00MDBweCAtNjcxcHg7IHdpZHRoOiAyM3B4OyAgaGVpZ2h0OiAxOXB4O30KKworLnNwcml0ZS1uZXcucHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzUwcHggLTYzMXB4OyB3aWR0aDogMTlweDsgIGhlaWdodDogMTlweDt9Cisuc3ByaXRlLW5ldy5wcm9wZXJ0aWVzOmFjdGl2ZSAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNTBweCAtNjcxcHg7IHdpZHRoOiAxOXB4OyAgaGVpZ2h0OiAxOXB4O30KKy5hY3RpdmUgPiAuc3ByaXRlLW5ldy5wcm9wZXJ0aWVzICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM1MHB4IC02NzFweDsgd2lkdGg6IDE5cHg7ICBoZWlnaHQ6IDE5cHg7fQorCisuc3ByaXRlLW5ldy5kaXN0cmlidXRpb24tYnRoICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zOTlweCAtNzE2cHg7IHdpZHRoOiA1NXB4OyAgaGVpZ2h0OiAyMXB4O30KKy5zcHJpdGUtbmV3LmRpc3RyaWJ1dGlvbi1idGguZGlzYWJsZSAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ2NHB4IC03MTZweDsgd2lkdGg6IDU1cHg7ICBoZWlnaHQ6IDIxcHg7fQorCisuRGlzdHJpYnV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NDdweCAtNzE4cHg7IHdpZHRoOiAxNnB4OyAgaGVpZ2h0OiAxNnB4O30KKy5EZXBsb3llZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTU3M3B4IC03MThweDsgd2lkdGg6IDE2cHg7ICBoZWlnaHQ6IDE2cHg7fQorCisuZXJyb3ItaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MXB4IC03NTFweDsgd2lkdGg6IDEzcHg7ICBoZWlnaHQ6IDExcHg7fQorLmFzZGMtd2FybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTAwcHggLTc0OHB4OyB3aWR0aDogMTdweDsgIGhlaWdodDogMTVweDt9CisKKy5saW5rLWJ0biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02MzZweCAtNDI0cHg7ICB3aWR0aDogMTlweDsgIGhlaWdodDogMTlweDt9CisubGluay1idG46aG92ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjM2cHggLTQ1M3B4OyAgd2lkdGg6IDE5cHg7ICBoZWlnaHQ6IDE5cHg7fQorLmxpbmstYnRuOmFjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTYzNnB4IC00ODJweDsgIHdpZHRoOiAxOXB4OyAgaGVpZ2h0OiAxOXB4O30KKworLnJlZnJlc2gtYnRuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI5M3B4IC00MTlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5yZWZyZXNoLWJ0bjpob3Zlcjpub3QoLmRpc2FibGUpICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0yOTNweCAtNDQ3cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisucmVmcmVzaC1idG46YWN0aXZlOm5vdCguZGlzYWJsZSkgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjkzcHggLTQ3OXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorLnJlZnJlc2gtYnRuLmZvY3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI5M3B4IC01MDhweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5yZWZyZXNoLWJ0bi5kaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0yOTNweCAtNTM5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisKKy5kb3dubG9hZC1idG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC01MzBweCAtNDE5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisuZG93bmxvYWQtYnRuOmhvdmVyOm5vdCguZGlzYWJsZSkgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTMwcHggLTQ0OHB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorLmRvd25sb2FkLWJ0bjphY3RpdmU6bm90KC5kaXNhYmxlKSAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUzMHB4IC00NzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5kb3dubG9hZC1idG4uZm9jdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC01MzBweCAtNTA4cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisuZG93bmxvYWQtYnRuLmRpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTMwcHggLTUzOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorCisuZXhwYW5kLWNvbGxhcHNlLXBsdXMtaWNvbiAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMzRweCAtODg4cHg7ICB3aWR0aDogMTRweDsgIGhlaWdodDogMTRweDt9CisuZXhwYW5kLWNvbGxhcHNlLXBsdXMtaWNvbi5ob3ZlciAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00MjJweCAtODg4cHg7ICB3aWR0aDogMTRweDsgIGhlaWdodDogMTRweDt9CisuZXhwYW5kLWNvbGxhcHNlLW1pbnVzLWljb24gICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zNzhweCAtODg4cHg7ICB3aWR0aDogMTRweDsgIGhlaWdodDogMTRweDt9CisuZXhwYW5kLWNvbGxhcHNlLW1pbnVzLWljb24uaG92ZXIgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC00NjZweCAtODg4cHg7ICB3aWR0aDogMTRweDsgIGhlaWdodDogMTRweDt9CisKKworLy90YWJzCisuY2xvc2Utb3Blbi1sZWZ0LWFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MDdweCAtOTQycHg7ICB3aWR0aDogNnB4OyAgaGVpZ2h0OiAxMHB4O30KKy5jbG9zZS1vcGVuLXJpZ2h0LWFycm93ICAgICAgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwNnB4IC05MjJweDsgIHdpZHRoOiA2cHg7ICBoZWlnaHQ6IDEwcHg7fQorCisuaGllcmFyY2h5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01NjBweCAtODg3cHg7ICB3aWR0aDogMjFweDsgIGhlaWdodDogMTVweDt9CisuaGllcmFyY2h5LmhvdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MDBweCAtODg3cHg7ICB3aWR0aDogMjFweDsgIGhlaWdodDogMTVweDt9CisuaGllcmFyY2h5LmRpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MzFweCAtODg3cHg7ICB3aWR0aDogMjFweDsgIGhlaWdodDogMTVweDt9CisuaGllcmFyY2h5LnNlbGVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IC01MDBweCAtODg3cHg7ICB3aWR0aDogMjFweDsgIGhlaWdodDogMTVweDt9CisKKy5yZWZyZXNoLXNtYWxsLWJ0biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC01OThweCAtNDE5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisucmVmcmVzaC1zbWFsbC1idG46aG92ZXI6bm90KC5kaXNhYmxlKSAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTk4cHggLTQ0OHB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorLnJlZnJlc2gtc21hbGwtYnRuOmFjdGl2ZTpub3QoLmRpc2FibGUpICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTU5OHB4IC00NzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5yZWZyZXNoLXNtYWxsLWJ0bi5mb2N1cyAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC01OThweCAtNTA4cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisucmVmcmVzaC1zbWFsbC1idG4uZGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTk4cHggLTUzOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorCisuZG93bmxvYWQtZmlsZS1idG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02NzNweCAtNDE5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisuZG93bmxvYWQtZmlsZS1idG46aG92ZXI6bm90KC5kaXNhYmxlKSAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02NzNweCAtNDQ4cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisuZG93bmxvYWQtZmlsZS1idG46YWN0aXZlOm5vdCguZGlzYWJsZSkgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02NzNweCAtNDc5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisuZG93bmxvYWQtZmlsZS1idG4uZm9jdXMgICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02NzNweCAtNTA4cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisuZG93bmxvYWQtZmlsZS1idG4uZGlzYWJsZSAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02NzNweCAtNTM5cHg7ICB3aWR0aDogMjRweDsgIGhlaWdodDogMjRweDt9CisKKy5yZWZyZXNoLWZpbGUtYnRuICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwN3B4IC00MTlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5yZWZyZXNoLWZpbGUtYnRuOmhvdmVyOm5vdCguZGlzYWJsZSkgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwN3B4IC00NDhweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5yZWZyZXNoLWZpbGUtYnRuOmFjdGl2ZTpub3QoLmRpc2FibGUpICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwN3B4IC00NzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5yZWZyZXNoLWZpbGUtYnRuLmZvY3VzICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwN3B4IC01MDhweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKy5yZWZyZXNoLWZpbGUtYnRuLmRpc2FibGUgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTcwN3B4IC01MzlweDsgIHdpZHRoOiAyNHB4OyAgaGVpZ2h0OiAyNHB4O30KKworLmltcG9ydC1maWxlLWJ0biAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzQ1cHggLTQxOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorLmltcG9ydC1maWxlLWJ0bjpob3Zlcjpub3QoLmRpc2FibGUpICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzQ1cHggLTQ0OHB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorLmltcG9ydC1maWxlLWJ0bjphY3RpdmU6bm90KC5kaXNhYmxlKSAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzQ1cHggLTQ3OXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorLmltcG9ydC1maWxlLWJ0bi5mb2N1cyAgICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzQ1cHggLTUwOHB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorLmltcG9ydC1maWxlLWJ0bi5kaXNhYmxlICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNzQ1cHggLTUzOXB4OyAgd2lkdGg6IDI0cHg7ICBoZWlnaHQ6IDI0cHg7fQorCisubGVmdC1hcnJvdyAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTU5MHB4IC04NzZweDsgIHdpZHRoOiAyNnB4OyAgaGVpZ2h0OiAyNnB4O30KKy5sZWZ0LWFycm93OmhvdmVyICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjYycHggLTg3NnB4OyAgd2lkdGg6IDI2cHg7ICBoZWlnaHQ6IDI2cHg7fQorLnJpZ2h0LWFycm93ICAgICAgICAgICAgICAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC02MjZweCAtODc2cHg7ICB3aWR0aDogMjZweDsgIGhlaWdodDogMjZweDt9CisucmlnaHQtYXJyb3c6aG92ZXIgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY5OHB4IC04NzZweDsgIHdpZHRoOiAyNnB4OyAgaGVpZ2h0OiAyNnB4O30KKy5zZWFyY2gtd2hpdGUtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQzNHB4IC0xMjhweDsgIHdpZHRoOiAxNHB4OyAgaGVpZ2h0OiAxNHB4O30KKworLmJsdWUtcmlnaHQtYXJyb3ctY2lyY2xlICAgICAgICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjUwcHggLTYxOXB4OyAgd2lkdGg6IDI5cHg7ICBoZWlnaHQ6IDI5cHg7fQorLmJsdWUtcmlnaHQtYXJyb3ctY2lyY2xlOmhvdmVyICAgICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjg5cHggLTYxOXB4OyAgd2lkdGg6IDI5cHg7ICBoZWlnaHQ6IDI5cHg7fQorCisuc21hbGwteC1idXR0b24gICAgICAgICAgICB7ICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkwcHggLTI4MnB4OyAgd2lkdGg6IDExcHg7ICBoZWlnaHQ6IDExcHg7fQorLnNtYWxsLXgtYnV0dG9uOmhvdmVyICAgICAgeyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIxMHB4IC0yODNweDsgIHdpZHRoOiAxMXB4OyAgaGVpZ2h0OiAxMXB4O30KKy5jbG9zZS1pbmZvLXRvb2x0aXAtYnV0dG9uIHsuc21hbGwteC1idXR0b259CisuY2xvc2UtaW5mby10b29sdGlwLWJ1dHRvbjpob3ZlciAgICAgIHsgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMzBweCAtMjgzcHg7ICB3aWR0aDogMTFweDsgIGhlaWdodDogMTFweDt9CisuZXhwYW5kLWFsbCB7ICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTAwcHggLTQyMHB4OyAgd2lkdGg6IDIwcHg7ICBoZWlnaHQ6IDIycHg7fQorLmV4cGFuZC1hbGw6aG92ZXIgeyAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwMHB4IC00NDlweDsgIHdpZHRoOiAyMHB4OyAgaGVpZ2h0OiAyMnB4O30KKy5jb2xsYXBzZS1hbGwgeyAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ2NXB4IC00MjBweDsgIHdpZHRoOiAyMHB4OyAgaGVpZ2h0OiAyMnB4O30KKy5jb2xsYXBzZS1hbGw6aG92ZXIgeyAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ2NXB4IC00NDlweDsgIHdpZHRoOiAyMHB4OyAgaGVpZ2h0OiAyMnB4O30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy90YWJsZS1mbGV4Lmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdGFibGUtZmxleC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzAxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdGFibGUtZmxleC5sZXNzCkBAIC0wLDAgKzEsMTc4IEBACisudGFibGUtY29udGFpbmVyLWZsZXggeworICAgIC8qIGhlaWdodDogNjUwcHg7ICovCisgICAgbWFyZ2luLXRvcDogMzVweDsKKyAgICBjbGVhcjogYm90aDsKKyAgICAudGFibGUgeworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgLmhlYWQgeworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VhZWFlYTsKKyAgICAgICAgICAgIC5oZWFkLXJvdyB7CisgICAgICAgICAgICAgICAgY29sb3I6ICMzMzMzMzM7CisgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZDsKKyAgICAgICAgICAgICAgICBwYWRkaW5nOiA4cHggMTVweDsKKworICAgICAgICAgICAgICAgICY6bGFzdC1jaGlsZCB7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAudGFibGUtaGVhZGVyLXNvcnQtYXJyb3cgeworICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjQUFBOworICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDhweCAwIDAgNXB4OworICAgICAgICAgICAgICAgICAgICAmLnVwIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDVweCBzb2xpZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAmLmRvd24geworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogNXB4IHNvbGlkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC5ib2R5IHsKKyAgICAgICAgICAgIC5zY3JvbGxiYXItY29udGFpbmVyIHsKKyAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0OiA0MzBweDsKKyAgICAgICAgICAgICAgICAucGVyZmVjdC1zY3JvbGxiYXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAuYl85OworCisgICAgICAgICAgICAuZGF0YS1yb3cgeworICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Q7CisgICAgICAgICAgICAgICAgZGl2IHsKKworICAgICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yX2Q7CisKKworICAgICAgICAgICAgICAgICAgICAmOmxhc3QtY2hpbGQgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLnRhYmxlLXJvbGUtc2VsZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAudGFibGUtcm9sZS1sYWJlbCB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDo0cHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICYuc2VsZWN0ZWQgeworICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgI2U2ZjZmYjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAmICsgZGl2Lml0ZW0tb3BlbmVkIHsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3JfZDsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMTBweCAyM3B4OworICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgICAgICAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLmRhdGEtcm93OmhvdmVyIHsKKyAgICAgICAgICAgICAgICAuYmdfajsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBidXR0b24uYWRkLWJ1dHRvbiB7CisgICAgICAgICAgICAgICAgbWFyZ2luOiAxMHB4IGF1dG87CisgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgICAgICAgYm9yZGVyOiAgMXB4IHNvbGlkICNlYWVhZWE7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIEBmdW5jX2NvbG9yX3I7CisgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMHB4IDFweCAxcHggMHB4IHJnYmEoMjQsIDI0LCAyNSwgMC4wNSk7CisgICAgICAgICAgICAgICAgd2lkdGg6IDI5N3B4OworICAgICAgICAgICAgICAgIGhlaWdodDogMzlweDsKKyAgICAgICAgICAgICAgICBjb2xvcjogICM2NjY2NjY7CisgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4OworICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworCisgICAgICAgICAgICAgICAgJjpiZWZvcmUgeworICAgICAgICAgICAgICAgICAgICAuc3ByaXRlLW5ldzsKKyAgICAgICAgICAgICAgICAgICAgLmFkZC1pY29uLWJsdWU7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0OiBsZWZ0OworICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogNXB4OworICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAubm8tcm93LXRleHR7CisgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgICAgICBtYXJnaW4tdG9wOjI1cHg7CisKKyAgICAgICAgICAgIGEgeworICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC50YWJsZS1idG4tY29sIHsKKworICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDBweDsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgICAgIC50YWJsZS1kZWxldGUtYnRuIHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgICAgICAgICAuc3ByaXRlLmUtc2RjLXNtYWxsLWljb24tZGVsZXRlOworICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuODsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgLnRhYmxlLWVkaXQtYnRuIHsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICAgICAgLnNwcml0ZTsKKyAgICAgICAgICAgICAgICAuZS1zZGMtc21hbGwtaWNvbi1wZW5jaWw7CisgICAgICAgICAgICAgICAgb3BhY2l0eTogMC44OworICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC50YWJsZS1zYXZlLWJ0biB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgICAgIC5zcHJpdGU7CisgICAgICAgICAgICAgICAgLnNwcml0ZS5lLXNkYy1ncmVlbi1zYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLnRhYmxlLWRvd25sb2FkLWJ0biB7CisgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgICAgIC5oYW5kOworICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OworICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuODsKKyAgICAgICAgICAgICAgICAuc3ByaXRlOworICAgICAgICAgICAgICAgIC5zcHJpdGUuZS1zZGMtc21hbGwtZG93bmxvYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC5uby1yb3ctdGV4dCB7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgZm9udC1zaXplOiAxNXB4OworICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICAgICAgd2lkdGg6IDMwMHB4OworICAgICAgICBtYXJnaW46IDI2cHggYXV0bzsKKyAgICAgICAgcGFkZGluZy1ib3R0b206IDIycHg7CisgICAgfQorCisgICAgLmZsZXgtY29udGFpbmVyIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICB9CisKKyAgICAuZmxleC1pdGVtIHsKKyAgICAgICAgd2lkdGg6MTBweDsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDI1cHg7CisgICAgICAgIHBhZGRpbmc6IDVweCAxNXB4OworICAgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy90bHYtYnV0dG9ucy5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Rsdi1idXR0b25zLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU0MmE5MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy90bHYtYnV0dG9ucy5sZXNzCkBAIC0wLDAgKzEsMjM0IEBACisudGx2LWJ0biB7CisgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgY3Vyc29yOiBwb2ludGVyOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIGZvbnQtZmFtaWx5OiBvbW5lcy1tZWRpdW0sIFNhbnMtU2VyaWY7CisgIGhlaWdodDogMzJweDsKKyAgbWluLXdpZHRoOiA5NnB4OworICBsaW5lLWhlaWdodDogMzBweDsKKyAgcGFkZGluZzogMCAxNnB4OworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgIGZvbnQtc2l6ZTogMTRweDsKKworICAmOmRpc2FibGVkIHsKKyAgICBvcGFjaXR5OiAuNDsKKyAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKKyAgfQorCisgICYuYmx1ZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwOWZkYjsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjMDA5MWM4OworICAgIGNvbG9yOiAjZmZmOworCisgICAgJjpob3ZlciB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWVjMmZmOworICAgIH0KKworICAgICY6YWN0aXZlIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDkxYzc7CisgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDA2MTg2OworICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisKKyAgICAmOmZvY3VzIHsKKyAgICAgIGJvcmRlci1jb2xvcjogIzAwOWZkYjsKKyAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCAjZmZmOworICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisgIH0KKworICAmLndoaXRlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICAgIGJvcmRlcjogMXB4IHNvbGlkICNkOGQ4ZDg7CisgICAgY29sb3I6IEBtYWluX2NvbG9yX247CisKKyAgICAmOmhvdmVyIHsKKyAgICAgIGJvcmRlci1jb2xvcjogIzk1OTU5NTsKKyAgICB9CisKKyAgICAmOmFjdGl2ZSB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOworICAgICAgYm9yZGVyOiAxcHggc29saWQgIzU5NTk1OTsKKyAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgfQorCisgICAgJjpmb2N1cyB7CisgICAgICBib3JkZXItY29sb3I6ICM5NTk1OTU7CisgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggI2ZmZiwgaW5zZXQgMCAwIDAgMnB4ICM5NTk1OTU7CisgICAgICBvdXRsaW5lOiBub25lOworCisgICAgfQorCisgIH0KKworICAmLmdyZXkgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2Q4ZDhkODsKKyAgICBjb2xvcjogIzAwMDsKKworICAgICY6aG92ZXIgeworICAgICAgYm9yZGVyLWNvbG9yOiAjOTU5NTk1OworICAgIH0KKworICAgICY6YWN0aXZlIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkN2Q3ZDc7CisgICAgICBib3JkZXI6IDFweCBzb2xpZCAjNTk1OTU5OworICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisKKyAgICAmOmZvY3VzIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0bHZfY29sb3JfdDsKKyAgICAgIGJvcmRlci1jb2xvcjogQG1haW5fY29sb3JfbjsKKyAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBAbWFpbl9jb2xvcl9wLCBpbnNldCAwIDAgMCAycHggQG1haW5fY29sb3JfbjsKKyAgICAgIG91dGxpbmU6IG5vbmU7CisKKyAgICB9CisKKyAgfQorCisKKyAgJi5ncmVlbiB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzRjYTkwYzsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjNDVhMDA2OworICAgIGNvbG9yOiAjZmZmOworCisgICAgJjpob3ZlciB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWVjNjE2OworICAgIH0KKworICAgICY6YWN0aXZlIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICMzZjhjMGE7CisgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMmM2NjA0OworICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisKKyAgICAmOmZvY3VzIHsKKyAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCAjZmZmOworICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisgIH0KKworICAmLnJlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZjMjcyNzsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjYTAxYTFhOworICAgIGNvbG9yOiAjZmZmOworCisgICAgJjpob3ZlciB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmMyNzI3OworICAgIH0KKworICAgICY6YWN0aXZlIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhMDFhMWE7CisgICAgICBib3JkZXI6IDFweCBzb2xpZCAjNzMwMjAyOworICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisKKyAgICAmOmZvY3VzIHsKKyAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBAbWFpbl9jb2xvcl9wOworICAgICAgb3V0bGluZTogbm9uZTsKKyAgICB9CisgIH0KKworCisgICYub3V0bGluZSB7CisgICAgJi5ibHVlIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDA5ZmRiOworICAgICAgY29sb3I6ICMwMDlmZGI7CisKKyAgICAgICY6aG92ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVmNWZiOworICAgICAgfQorCisgICAgICAmOmFjdGl2ZSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNiMmUyZjQ7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDlmZGI7CisgICAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgICB9CisKKyAgICAgICY6Zm9jdXMgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICAgICAgICBib3JkZXItY29sb3I6ICMwMDlmZGI7CisgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCAjZmZmLCBpbnNldCAwIDAgMCAycHggIzAwOWZkYjsKKyAgICAgICAgb3V0bGluZTogbm9uZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAmLmdyZXkgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM5NTk1OTU7CisgICAgICBjb2xvcjogIzVhNWE1YTsKKworICAgICAgJjpob3ZlciB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7CisgICAgICAgIGJvcmRlci1jb2xvcjogIzk1OTU5NTsKKyAgICAgIH0KKworICAgICAgJjphY3RpdmUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZkZmRmOworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTU5NTk1OworICAgICAgICBvdXRsaW5lOiBub25lOworICAgICAgfQorCisgICAgICAmOmZvY3VzIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKKyAgICAgICAgYm9yZGVyLWNvbG9yOiAjOTU5NTk1OworICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggI2ZmZiwgaW5zZXQgMCAwIDAgMnB4ICM5NTk1OTU7CisgICAgICAgIG91dGxpbmU6IG5vbmU7CisKKyAgICAgIH0KKworICAgIH0KKworCisgICAgJi5ncmVlbiB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgICAgYm9yZGVyOiAxcHggc29saWQgIzRjYTkwYzsKKyAgICAgIGNvbG9yOiAjNGNhOTBjOworCisgICAgICAmOmhvdmVyIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VkZjZlNjsKKyAgICAgICAgYm9yZGVyLWNvbG9yOiAjNGNhOTBjOworICAgICAgfQorCisgICAgICAmOmFjdGl2ZSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjOWU1YjY7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0Y2E5MGM7CisgICAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgICB9CisKKyAgICAgICY6Zm9jdXMgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICAgICAgICBib3JkZXItY29sb3I6ICM0Y2E5MGM7CisgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCAjZmZmLCBpbnNldCAwIDAgMCAycHggIzRjYTkwYzsKKyAgICAgICAgb3V0bGluZTogbm9uZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAmLnJlZCB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NmMmEyYTsKKyAgICAgIGNvbG9yOiAjY2YyYTJhOworCisgICAgICAmOmhvdmVyIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZTllOTsKKyAgICAgICAgYm9yZGVyLWNvbG9yOiAjY2YyYTJhOworICAgICAgfQorCisgICAgICAmOmFjdGl2ZSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjOWU1YjY7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZjJhMmE7CisgICAgICAgIG91dGxpbmU6IG5vbmU7CisgICAgICB9CisKKyAgICAgICY6Zm9jdXMgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICAgICAgICBib3JkZXItY29sb3I6ICNjZjJhMmE7CisgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCAjZmZmLCBpbnNldCAwIDAgMCAycHggI2NmMmEyYTsKKyAgICAgICAgb3V0bGluZTogbm9uZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Rsdi1jaGVja2JveC5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Rsdi1jaGVja2JveC5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDU4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdGx2LWNoZWNrYm94Lmxlc3MKQEAgLTAsMCArMSw4NyBAQAorLnRsdi1jaGVja2JveCB7CisgIGZvbnQtZmFtaWx5OiBjbGVhcnZpZXctYm9vaywgU2Fucy1TZXJpZjsKKyAgZm9udC1zaXplOiAxNHB4OworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisKKyAgLnRsdi1jaGVja2JveC1pIHsKKyAgICBoZWlnaHQ6IDA7CisgICAgLyp2aXNpYmlsaXR5OiBoaWRkZW47Ki8KKyAgICBkaXNwbGF5OiBub25lOworICAgIHdpZHRoOiAwOworCisgICAgJjpjaGVja2VkIH4gLnRsdi1jaGVja2JveC1sYWJlbCwKKyAgICAmOmNoZWNrZWQ6aG92ZXIgfiAudGx2LWNoZWNrYm94LWxhYmVseworICAgICAgICAmOjpiZWZvcmUgeworICAgICAgICAgIC50bHYtc3ByaXRlOworICAgICAgICAgIC5jaGVja2JveC1jaGVja2VkOworICAgICAgICB9CisgICAgfQorCisgICAgJjpkaXNhYmxlZCB+IC50bHYtY2hlY2tib3gtbGFiZWx7CisgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKKyAgICB9CisKKyAgICAmOmhvdmVyIH4gLnRsdi1jaGVja2JveC1sYWJlbHsKKyAgICAgICY6OmJlZm9yZSB7CisgICAgICAgIC50bHYtc3ByaXRlOworICAgICAgICAuY2hlY2tib3gtaG92ZXI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLnRsdi1jaGVja2JveC1sYWJlbCB7CisgICAgLypkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ki8KKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworCisgICAgJjo6YmVmb3JlIHsKKyAgICAgIC50bHYtc3ByaXRlOworICAgICAgLmNoZWNrYm94OworICAgICAgY29udGVudDogJyc7CisgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICBtYXJnaW4tcmlnaHQ6IDRweDsKKyAgICAgIG1hcmdpbi10b3A6IC0ycHg7CisgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIH0KKyAgfQorfQorCisKKy50bHYtcmFkaW8geworICBmb250LXNpemU6IDE0cHg7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKworICAudGx2LXJhZGlvLWkgeworICAgIGhlaWdodDogMDsKKyAgICB2aXNpYmlsaXR5OiBoaWRkZW47CisgICAgd2lkdGg6IDA7CisKKyAgICAmOmNoZWNrZWQgfiAudGx2LXJhZGlvLWxhYmVseworICAgICAgJjo6YmVmb3JlIHsKKyAgICAgICAgLnRsdi1zcHJpdGU7CisgICAgICAgIC5yYWRpby1jaGVja2VkOworCisgICAgICB9CisgICAgfQorCisgICAgJjpkaXNhYmxlZCB+IC50bHYtcmFkaW8tbGFiZWx7CisgICAgICBvcGFjaXR5OiAuNjsKKyAgICB9CisgIH0KKworICAudGx2LXJhZGlvLWxhYmVsIHsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgIG1hcmdpbi1ib3R0b206IDA7CisKKyAgICAmOjpiZWZvcmUgeworICAgICAgLnRsdi1zcHJpdGU7CisgICAgICAucmFkaW87CisgICAgICBjb250ZW50OiAnJzsKKyAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgIG1hcmdpbi1yaWdodDogNHB4OworICAgICAgbWFyZ2luLXRvcDogLTJweDsKKyAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdGx2LWxvYWRlci5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Rsdi1sb2FkZXIubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmUzOTkxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Rsdi1sb2FkZXIubGVzcwpAQCAtMCwwICsxLDE2NCBAQAorLnRsdi1sb2FkZXIgeworICAgIGhlaWdodDogNjNweDsKKyAgICB3aWR0aDogNjNweDsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiA1MCU7CisgICAgbGVmdDogNTAlOworfQorCisudGx2LWxvYWRlci5zbWFsbCB7CisgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjI2KTsKKyAgICBtYXJnaW4tdG9wOiAtMzYuNXB4OworICAgIG1hcmdpbi1sZWZ0OiAtMzYuNXB4OworfQorCisudGx2LWxvYWRlci5tZWRpdW0geworICAgIHRyYW5zZm9ybTogc2NhbGUoMC41KTsKKyAgICBtYXJnaW4tdG9wOiAtMjYuNXB4OworICAgIG1hcmdpbi1sZWZ0OiAtMjYuNXB4OworfQorCisudGx2LWxvYWRlci5sYXJnZSB7CisgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKKyAgICBtYXJnaW4tdG9wOiAtMTAuNXB4OworICAgIG1hcmdpbi1sZWZ0OiAtMTAuNXB4OworfQorCisudGx2LWxvYWRlcjo6YmVmb3JlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWFlYWVhOworICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgICBib3gtc2hhZG93OiAyMXB4IDIxcHggMHB4IDBweCAjZWFlYWVhLCAwcHggNDJweCAwcHggMHB4ICNlYWVhZWEsIC0yMXB4IDIxcHggMHB4IDBweCAjZWFlYWVhOworICAgIGNvbnRlbnQ6ICcnOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGhlaWdodDogMjFweDsKKyAgICB3aWR0aDogMjFweDsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgbGVmdDogNTAlOworICAgIG1hcmdpbi1sZWZ0OiAtMTAuNXB4OworfQorCisudGx2LWxvYWRlcjo6YWZ0ZXIgeworICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgICBjb250ZW50OiAnJzsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgaGVpZ2h0OiAyMXB4OworICAgIHdpZHRoOiAyMXB4OworICAgIGFuaW1hdGlvbjogZG90LW1vdmUtMiA0LjVzIGluZmluaXRlIGVhc2UtaW47Cit9CisKK0BrZXlmcmFtZXMgZG90LW1vdmUgeworICAgIDAlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNiYjJkZjsKKyAgICAgICAgbGVmdDogMjFweDsKKyAgICAgICAgdG9wOiAwOworICAgIH0KKyAgICAyNSUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiODFjOworICAgICAgICBsZWZ0OiA0MnB4OworICAgICAgICB0b3A6IDIxcHg7CisgICAgfQorICAgIDUwJSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjYWEyZGQ7CisgICAgICAgIGxlZnQ6IDIxcHg7CisgICAgICAgIHRvcDogNDJweDsKKyAgICB9CisgICAgNzUlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZTUxYzsKKyAgICAgICAgbGVmdDogMDsKKyAgICAgICAgdG9wOiAyMXB4OworICAgIH0KKyAgICAxMDAlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNiYjJkZjsKKyAgICAgICAgbGVmdDogMjFweDsKKyAgICAgICAgdG9wOiAwOworICAgIH0KK30KKworQGtleWZyYW1lcyBkb3QtbW92ZS0yIHsKKyAgICAwJSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMzYmIyZGY7CisgICAgICAgIGxlZnQ6IDIxcHg7CisgICAgICAgIHRvcDogMDsKKyAgICB9CisgICAgNi4yNSUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2JiMmRmOworICAgICAgICBsZWZ0OiA0MnB4OworICAgICAgICB0b3A6IDIxcHg7CisgICAgfQorICAgIDEyLjUlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNiYjJkZjsKKyAgICAgICAgbGVmdDogMjFweDsKKyAgICAgICAgdG9wOiA0MnB4OworICAgIH0KKyAgICAxOC43NSUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2JiMmRmOworICAgICAgICBsZWZ0OiAwOworICAgICAgICB0b3A6IDIxcHg7CisgICAgfQorICAgIDI1JSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmI4MWM7CisgICAgICAgIGxlZnQ6IDIxcHg7CisgICAgICAgIHRvcDogMDsKKyAgICB9CisgICAgMzEuMjUlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYjgxYzsKKyAgICAgICAgbGVmdDogNDJweDsKKyAgICAgICAgdG9wOiAyMXB4OworICAgIH0KKyAgICAzNy41JSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmI4MWM7CisgICAgICAgIGxlZnQ6IDIxcHg7CisgICAgICAgIHRvcDogNDJweDsKKyAgICB9CisgICAgNDMuNzUlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYjgxYzsKKyAgICAgICAgbGVmdDogMDsKKyAgICAgICAgdG9wOiAyMXB4OworICAgIH0KKyAgICA1MCUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2FhMmRkOworICAgICAgICBsZWZ0OiAyMXB4OworICAgICAgICB0b3A6IDA7CisgICAgfQorICAgIDU2LjI1JSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjYWEyZGQ7CisgICAgICAgIGxlZnQ6IDQycHg7CisgICAgICAgIHRvcDogMjFweDsKKyAgICB9CisgICAgNjIuNSUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2FhMmRkOworICAgICAgICBsZWZ0OiAyMXB4OworICAgICAgICB0b3A6IDQycHg7CisgICAgfQorICAgIDY4Ljc1JSB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjYWEyZGQ7CisgICAgICAgIGxlZnQ6IDA7CisgICAgICAgIHRvcDogMjFweDsKKyAgICB9CisgICAgNzUlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZTUxYzsKKyAgICAgICAgbGVmdDogMjFweDsKKyAgICAgICAgdG9wOiAwOworICAgIH0KKyAgICA4MS4yNSUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllNTFjOworICAgICAgICBsZWZ0OiA0MnB4OworICAgICAgICB0b3A6IDIxcHg7CisgICAgfQorICAgIDg3LjUlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZTUxYzsKKyAgICAgICAgbGVmdDogMjFweDsKKyAgICAgICAgdG9wOiA0MnB4OworICAgIH0KKyAgICA5My43NSUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllNTFjOworICAgICAgICBsZWZ0OiAwOworICAgICAgICB0b3A6IDIxcHg7CisgICAgfQorICAgIDEwMCUgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2JiMmRmOworICAgICAgICBsZWZ0OiAyMXB4OworICAgICAgICB0b3A6IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3Rsdi1zcHJpdGUubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy90bHYtc3ByaXRlLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyZTJmYgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy90bHYtc3ByaXRlLmxlc3MKQEAgLTAsMCArMSwxMzggQEAKKy50bHYtc3ByaXRlIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImltYWdlcy9zcHJpdGVzL3Rsdi1zcHJpdGUucG5nIik7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisKKyAgICAmLmxvZ28tYmx1ZSB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMHB4IC0yMHB4OworICAgICAgICB3aWR0aDogMjhweDsKKyAgICAgICAgaGVpZ2h0OiAyOHB4OworICAgIH0KKworICAgICYudXNlciB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC01MHB4IC0yMHB4OworICAgICAgICB3aWR0aDogMTVweDsKKyAgICAgICAgaGVpZ2h0OiAyMHB4OworICAgIH0KKworICAgIC5mYWNlYm9vayB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMHB4IC0yNjBweDsKKyAgICAgICAgd2lkdGg6IDM2cHg7CisgICAgICAgIGhlaWdodDogMzZweDsKKyAgICB9CisKKyAgICAuZmFjZWJvb2staG92ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTBweCAtMzAwcHg7CisgICAgICAgIHdpZHRoOiAzNnB4OworICAgICAgICBoZWlnaHQ6IDM2cHg7CisgICAgfQorCisgICAgLnR3aXR0ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtMjYwcHg7CisgICAgICAgIHdpZHRoOiAzNnB4OworICAgICAgICBoZWlnaHQ6IDM2cHg7CisgICAgfQorCisgICAgLnR3aXR0ZXItaG92ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtMzAwcHg7CisgICAgICAgIHdpZHRoOiAzNnB4OworICAgICAgICBoZWlnaHQ6IDM2cHg7CisgICAgfQorCisgICAgLmxpbmtlZGluIHsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTg5cHggLTI2MHB4OworICAgICAgICB3aWR0aDogMzZweDsKKyAgICAgICAgaGVpZ2h0OiAzNnB4OworICAgIH0KKworICAgIC5saW5rZWRpbi1ob3ZlciB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04OXB4IC0zMDBweDsKKyAgICAgICAgd2lkdGg6IDM2cHg7CisgICAgICAgIGhlaWdodDogMzZweDsKKyAgICB9CisKKyAgICAueW91dHViZSB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMzBweCAtMjYwcHg7CisgICAgICAgIHdpZHRoOiAzNnB4OworICAgICAgICBoZWlnaHQ6IDM2cHg7CisgICAgfQorCisgICAgLnlvdXR1YmUtaG92ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTMwcHggLTMwMHB4OworICAgICAgICB3aWR0aDogMzZweDsKKyAgICAgICAgaGVpZ2h0OiAzNnB4OworICAgIH0KKworICAgIC5mb290ZXItb3BlbiB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNTBweCAtNTlweDsKKyAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgIGhlaWdodDogMTBweDsKKyAgICB9CisKKyAgICAuZm9vdGVyLW9wZW4taG92ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjUwcHggLTc5cHg7CisgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICBoZWlnaHQ6IDEwcHg7CisgICAgfQorCisgICAgLmZvb3Rlci1jbG9zZSB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMzBweCAtNTlweDsKKyAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgIGhlaWdodDogMTBweDsKKyAgICB9CisKKyAgICAuZm9vdGVyLWNsb3NlLWhvdmVyIHsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIzMHB4IC03OXB4OworICAgICAgICB3aWR0aDogMTRweDsKKyAgICAgICAgaGVpZ2h0OiAxMHB4OworICAgIH0KKworICAgIC5jaGVja2JveC1kaXNhZGJsZWQgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTBweCAtNjBweDsKKyAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgIGhlaWdodDogMTRweDsKKyAgICB9CisKKyAgICAuY2hlY2tib3ggeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTBweCAtNjBweDsKKyAgICAgICAgd2lkdGg6IDE0cHg7CisgICAgICAgIGhlaWdodDogMTRweDsKKyAgICB9CisKKyAgICAuY2hlY2tib3gtaG92ZXIgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTBweCAtMTAwcHg7CisgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICBoZWlnaHQ6IDE0cHg7CisgICAgfQorCisgICAgLmNoZWNrYm94LWNoZWNrZWQgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTBweCAtMTIwcHg7CisgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICBoZWlnaHQ6IDE0cHg7CisgICAgfQorCisgICAgLnJhZGlvLWRpc2FibGVkIHsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggLTYwcHg7CisgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICBoZWlnaHQ6IDE0cHg7CisgICAgfQorCisgICAgLnJhZGlvIHsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwcHggLTgwcHg7CisgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICBoZWlnaHQ6IDE0cHg7CisgICAgfQorCisgICAgLnJhZGlvLWNoZWNrZWQgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTBweCAtMTIwcHg7CisgICAgICAgIHdpZHRoOiAxNHB4OworICAgICAgICBoZWlnaHQ6IDE0cHg7CisgICAgfQorfQorCisudGx2LXgtYnRuLCAudGx2LXgtYnRuOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTdweCAtMTQ3cHg7CisgICAgd2lkdGg6IDEwcHg7CisgICAgaGVpZ2h0OiAxMHB4OworfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdG9vbHRpcHMubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy90b29sdGlwcy5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzYxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdG9vbHRpcHMubGVzcwpAQCAtMCwwICsxLDExMCBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0b29sdGlwcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkaXYudG9vbHRpcHMgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBkaXNwbGF5OiBpbmxpbmU7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIHotaW5kZXg6IDE7CisgICAgdG9wOiAzMHB4OworICAgIGxlZnQ6IDg1cHg7CisKKyAgICBzcGFuIHsKKyAgICAgICAgLmJnX3M7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgd2lkdGg6IDIzMHB4OworICAgICAgICBjb2xvcjogQGNvbG9yX2M7CisgICAgICAgIGhlaWdodDogMzBweDsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDMwcHg7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OworICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CisKKyAgICAgICAgJjphZnRlciB7CisgICAgICAgICAgICAuYXJyb3coOHB4LCBAY29sb3Jfcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXRpcAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisucXRpcC1jdXN0b20geworICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OworICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OworICAgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoODAsOTksMTEzKTsKKyAgICBib3JkZXItY29sb3I6cmdiKDgwLDk5LDExMyk7CisgICAgY29sb3I6d2hpdGU7CisgICAgZm9udC1zaXplOjE0cHg7CisKK30KKworCisudG9vbHRpcC1jdXN0b20geworICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoODAsIDk5LCAxMTMsIDAuOSk7CisgICAgei1pbmRleDogMTEwMDsKKyAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDsKKyAgICAtbW96LWJvcmRlci1yYWRpdXM6IDJweDsKKyAgICBib3JkZXItcmFkaXVzOiAycHg7CisgICAgbWF4LXdpZHRoOiAyODBweDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgd29yZC1icmVhazogbm9ybWFsOworICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworICAgIHBhZGRpbmctbGVmdDogMTBweDsKK30KKworLl83MjBrYi10b29sdGlwLWNhcmV0OmJlZm9yZQorICAgIHsKKyAgICAgIGJvcmRlcjogNnB4IHNvbGlkIHJnYmEoODAsIDk5LCAxMTMsIDAuOSk7CisKKyAgICB9CisKKy50b29sdGlwLXJpZ2h0c2lkZXsKKyAgICByaWdodDogMnB4OworICAgIGxlZnQ6IGluaXRpYWwgIWltcG9ydGFudDsKKworICAgIC5fNzIwa2ItdG9vbHRpcC1jYXJldDpiZWZvcmV7CisgICAgICAgIHJpZ2h0OiAyMXB4OworICAgICAgICBsZWZ0OiBpbml0aWFsOworICAgIH0KK30KKworLnRhYi10b29sdGlweworICAgIG1heC13aWR0aDogMjIwcHg7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKy5icmVhay13b3JkLXRvb2x0aXB7CisgICAgd29yZC1icmVhazogYnJlYWstYWxsOworICAgIG1hcmdpbi1yaWdodDogMnB4OworfQorCisuaWNvbi10b29sdGlweworICAgIG1hcmdpbi1sZWZ0OiAxMnB4OworICAgIHJpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7CisKKyAgICAuXzcyMGtiLXRvb2x0aXAtY2FyZXQ6YmVmb3JleworICAgICAgICBsZWZ0OiA0NHB4OworICAgICAgICByaWdodDogaW5pdGlhbDsKKyAgICB9Cit9CisKKy51aWItY3VzdG9tLXRvb2x0aXAgeworICAgIHotaW5kZXg6IDk5OTk5OTsKKworICAgIC50b29sdGlwLWlubmVyIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg4MCwgOTksIDExMywgMC45KTsKKyAgICAgICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7CisgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgICAgICAgfQorfQorLnRvb2x0aXAgeworICAgICYuYm90dG9tIC50b29sdGlwLWFycm93IHsKKworICAgICAgICBtYXJnaW4tbGVmdDogLTZweCAhaW1wb3J0YW50OworICAgICAgICBib3JkZXItd2lkdGg6IDAgNnB4IDZweCAhaW1wb3J0YW50OworICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDgwLCA5OSwgMTEzLCAwLjkpICFpbXBvcnRhbnQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdmFyaWFibGVzLW9sZC5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3ZhcmlhYmxlcy1vbGQubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWViNjFkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3ZhcmlhYmxlcy1vbGQubGVzcwpAQCAtMCwwICsxLDc3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgR2VuZXJhbCAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0BpbWFnZXM6ICJpbWFnZXMiOworCisvLyBDb2xvcnMKK0Bjb2xvcl9hOiAjM2I3YjliOyAvLyBwcm9kdWN0IGNhdGVnb3J5CitAY29sb3JfYjogIzY2NjY2NjsKK0Bjb2xvcl9jOiAjZmZmZmZmOworQGNvbG9yX2Q6ICMxZDlhOTU7IC8vIGRhc2hib2FyZCBzZXJ2aWNlIChTIGF0IHRoZSB0b3AgbGVmdCBvZiB0aGUgY2FyZCkKK0Bjb2xvcl9lOiAjY2RjZGNkOworQGNvbG9yX2Y6ICM1MDY0NzI7IC8vICNlMGU1ZTkgY29tcG9zaXRpb24gcmlnaHQgc2lkZSB0YWJzCitAY29sb3JfZzogIzI2M2Q0ZDsgLy8gZGFzaGJvYXJkIGxlZnQgc2lkZWJhciBjYXRlZ29yaWVzCitAY29sb3JfaDogI2RhMWYzZDsgLy8gbm90IHZhbGlkCitAY29sb3JfaTogIzQ0NTY2MzsgLy8gZGFzaGJvYXJkIGxlZnQgc2lkZWJhcgorQGNvbG9yX2o6ICNEM0RCRTA7IC8vIGRhc2hib2FyZCBoZWFkZXIgfCB2aWV3IGxlZnQgc2lkZQorQGNvbG9yX2s6ICNlMWU3ZWM7IC8vIGNvbXBvc2l0aW9uIGl0ZW0gfCBjb21wb3NpdGlvbiByaWdodCBzaWRlIGJhY2tncm91bmQKK0Bjb2xvcl9sOiAjMWU5YTMzOyAvLyB2YWxpZAorQGNvbG9yX206ICNhOGIzYjk7IC8vIGNvbXBvc2l0aW9uIHN1YiBjYXRlZ29yeQorQGNvbG9yX246ICNFQ0VGRjM7IC8vIGRhc2hib2FyZCBtYWluIHNlY3Rpb24KK0Bjb2xvcl9vOiAjNzk4OTk2OyAvLyBjb21wb3NpdGlvbiBjYXRlZ29yeQorQGNvbG9yX3A6ICM4YzhjOGM7IC8vIGNvbXBvc2l0aW9uIHJlbGF0aW9uIHRhYj8KK0Bjb2xvcl9xOiAjYjViNWI1OyAvLyBMaXogcGxlYXNlIGNoYW5nZSBmcm9tIGI2YjViNSB0byBiNWI1YjUKK0Bjb2xvcl9yOiAjZTg1ODU4OyAvLyBkYXNoYm9hcmQgcmVzb3VyY2UgKFIgYXQgdGhlIHRvcCBsZWZ0IG9mIHRoZSBjYXJkKQorQGNvbG9yX3M6ICMwMDAwMDA7IC8vICM2MjcyN2YKK0Bjb2xvcl90OiAjMzE5NmM5OyAvLyAjMzQ2ZDhhCitAY29sb3JfdTogIzIzYWE2MzsKK0Bjb2xvcl92OiAjMTk4NjgyOworQGNvbG9yX3c6ICMzODQ3NTI7CitAY29sb3JfeDogI2M5MWQzOTsKK0Bjb2xvcl95OiAjNjk3YTg3OworQGNvbG9yX3o6ICMyOGJkNmU7CitAY29sb3Jfeno6ICM5M2RlYjY7CisKKworLy8gQ29sb3IgaG92ZXIKK0Bjb2xvcl9hX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2EsIDEwLjAlKTsKK0Bjb2xvcl9iX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2IsIDEwLjAlKTsKK0Bjb2xvcl9jX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2MsIDEwLjAlKTsKK0Bjb2xvcl9kX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2QsIDEwLjAlKTsKK0Bjb2xvcl9lX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2UsIDEwLjAlKTsKK0Bjb2xvcl9mX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2YsIDEwLjAlKTsKK0Bjb2xvcl9nX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2csIDEwLjAlKTsKK0Bjb2xvcl9oX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2gsIDEwLjAlKTsKK0Bjb2xvcl9pX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2ksIDEwLjAlKTsKK0Bjb2xvcl9qX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2osIDEwLjAlKTsKK0Bjb2xvcl9rX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2ssIDEwLjAlKTsKK0Bjb2xvcl9sX2hvdmVyOiBkYXJrZW4oQGNvbG9yX2wsIDEwLjAlKTsKK0Bjb2xvcl9tX2hvdmVyOiBkYXJrZW4oQGNvbG9yX20sIDEwLjAlKTsKK0Bjb2xvcl9uX2hvdmVyOiBkYXJrZW4oQGNvbG9yX24sIDEwLjAlKTsKK0Bjb2xvcl9vX2hvdmVyOiBkYXJrZW4oQGNvbG9yX28sIDEwLjAlKTsKK0Bjb2xvcl9xX2hvdmVyOiBkYXJrZW4oQGNvbG9yX3EsIDEwLjAlKTsKK0Bjb2xvcl9wX2hvdmVyOiBkYXJrZW4oQGNvbG9yX3AsIDEwLjAlKTsKK0Bjb2xvcl9yX2hvdmVyOiBkYXJrZW4oQGNvbG9yX3IsIDEwLjAlKTsKK0Bjb2xvcl9zX2hvdmVyOiBkYXJrZW4oQGNvbG9yX3MsIDEwLjAlKTsKK0Bjb2xvcl90X2hvdmVyOiBkYXJrZW4oQGNvbG9yX3QsIDEwLjAlKTsKK0Bjb2xvcl91X2hvdmVyOiBkYXJrZW4oQGNvbG9yX3UsIDEwLjAlKTsKK0Bjb2xvcl92X2hvdmVyOiBkYXJrZW4oQGNvbG9yX3YsIDEwLjAlKTsKK0Bjb2xvcl93X2hvdmVyOiBkYXJrZW4oQGNvbG9yX3csIDEwLjAlKTsKK0Bjb2xvcl94X2hvdmVyOiBkYXJrZW4oQGNvbG9yX3gsIDEwLjAlKTsKK0Bjb2xvcl95X2hvdmVyOiBkYXJrZW4oQGNvbG9yX3ksIDEwLjAlKTsKK0Bjb2xvcl96X2hvdmVyOiBkYXJrZW4oQGNvbG9yX3osIDEwLjAlKTsKK0Bjb2xvcl96el9ob3ZlcjogZGFya2VuKEBjb2xvcl96eiwgMTAuMCUpOworCisvKiB0byBjaGVjayBpZiBjYW4gZGVsZXRlICovCitAYm9yZGVyX2NvbG9yX2E6ICMxRDNBNTI7CitAYm9yZGVyX2NvbG9yX2M6ICNDMUNERDU7CitAYm9yZGVyX2NvbG9yX2Q6IHJnYmEoMTIwLCAxMzYsIDE0OCwgMC4yNik7CitAYm9yZGVyX2NvbG9yX2U6IHJnYmEoNTksIDEyMywgMTU1LCAwLjUpOworQGJvcmRlcl9jb2xvcl9mOiAjY2ZjZmNmOworQGJvcmRlcl9jb2xvcl9nOiBAY29sb3JfYTsKK0Bib3JkZXJfY29sb3Jfdmlldy1tb2RlOiAjZWRlZGVkOworCisvLyBGb250cworQGZvbnQtb21uZXMtbGlnaHQ6IG9tbmVzLWxpZ2h0LCBzYW5zLXNlcmlmOworQGZvbnQtb21uZXMtcmVndWxhcjogb21uZXMtcmVndWxhciwgc2Fucy1zZXJpZjsKK0Bmb250LW9tbmVzLW1lZGl1bTogb21uZXMtbWVkaXVtLCBzYW5zLXNlcmlmOworQGZvbnQtb21uZXMtbWVkaXVtLWl0YWxpYzogb21uZXMtbWVkaXVtLWl0YWxpYywgc2Fucy1zZXJpZjsKK0Bmb250LW9tbmVzLWJvbGQ6IG9tbmVzLWJvbGQsIHNhbnMtc2VyaWY7CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdmFyaWFibGVzLmxlc3MgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvdmFyaWFibGVzLmxlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4ODU0YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy92YXJpYWJsZXMubGVzcwpAQCAtMCwwICsxLDQ4IEBACisvLyBGb250cworQGZvbnQtb21uZXMtbGlnaHQ6IG9tbmVzLWxpZ2h0LCBzYW5zLXNlcmlmOworQGZvbnQtb21uZXMtcmVndWxhcjogb21uZXMtcmVndWxhciwgc2Fucy1zZXJpZjsKK0Bmb250LW9tbmVzLW1lZGl1bTogb21uZXMtbWVkaXVtLCBzYW5zLXNlcmlmOworQGZvbnQtb21uZXMtbWVkaXVtLWl0YWxpYzogb21uZXMtbWVkaXVtLWl0YWxpYywgc2Fucy1zZXJpZjsKK0Bmb250LW9tbmVzLWJvbGQ6IG9tbmVzLWJvbGQsIHNhbnMtc2VyaWY7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICBHZW5lcmFsICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQGltYWdlczogImltYWdlcyI7CisKKy8vIE1haW4gQ29sb3JzCitAbWFpbl9jb2xvcl9hOiAjMDA5ZmRiOworQG1haW5fY29sb3JfYjogIzA1NmJhZTsKK0BtYWluX2NvbG9yX2M6ICM3MWM1ZWI7CitAbWFpbl9jb2xvcl9kOiAjNGNhOTBjOworQG1haW5fY29sb3JfZTogIzAwN2EzZTsKK0BtYWluX2NvbG9yX2Y6ICNiNWJkMDA7CitAbWFpbl9jb2xvcl9nOiAjZWE3NDk5OworQG1haW5fY29sb3JfaDogI2ZmYjgxYzsKK0BtYWluX2NvbG9yX2k6ICM3MDJmOGE7CitAbWFpbl9jb2xvcl9qOiAjOTA2M2NkOworQG1haW5fY29sb3JfazogI2NhYTJkZDsKK0BtYWluX2NvbG9yX2w6ICMwMDAwMDA7CitAbWFpbl9jb2xvcl9tOiAjNWE1YTVhOworQG1haW5fY29sb3JfbjogIzk1OTU5NTsKK0BtYWluX2NvbG9yX286ICNkMmQyZDI7CitAbWFpbl9jb2xvcl9wOiAjZmZmZmZmOworCisvLyBGdW5jdGlvbmFsIENvbG9ycworQGZ1bmNfY29sb3JfcTogI2NmMmEyYTsKK0BmdW5jX2NvbG9yX3I6ICNmMmYyZjI7CitAZnVuY19jb2xvcl9zOiAjMTkxOTE5OworQGZ1bmNfY29sb3JfYjogIzA1NjhhZTsKK0BmdW5jX2NvbG9yX2U6ICMwMDdhM2U7CitAZnVuY19jb2xvcl9oOiAjZmZiODFjOworCisvLyBUbHYgQ29sb3JzCitAdGx2X2NvbG9yX3Q6ICNmOGY4Zjg7CitAdGx2X2NvbG9yX3U6ICNlYWVhZWE7CitAdGx2X2NvbG9yX3Y6ICNlNmY2ZmI7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQGhlYWRlcl9oZWlnaHQ6IDBweDsKK0B0b3BfbmF2X2hlaWdodDogNTBweDsKK0B0b3BfbmF2X2FkbWluX2hlaWdodDogNDRweDsKK0BhY3Rpb25fbmF2X2hlaWdodDogNTNweDsKKworQGJvcmRlcl9jb2xvcl92aWV3LW1vZGU6ICNlZGVkZWQ7CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvd2VsY29tZS1zcHJpdGUubGVzcyBiL2NhdGFsb2ctdWkvYXBwL3N0eWxlcy93ZWxjb21lLXNwcml0ZS5sZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGQzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvd2VsY29tZS1zcHJpdGUubGVzcwpAQCAtMCwwICsxLDU3IEBACisuc3ByaXRlLXdlbGNvbWUgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvd2VsY29tZS9zcHJpdGUucG5nKTsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKworICAgICYubG9nbyB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsKKyAgICAgICAgd2lkdGg6IDE0OXB4OworICAgICAgICBoZWlnaHQ6IDQ3cHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAyNXB4OworICAgICAgICBsZWZ0OiAyMHB4OworICAgIH0KKworICAgICYucGxheSB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTYwcHg7CisgICAgICAgIHdpZHRoOiAxMjBweDsKKyAgICAgICAgaGVpZ2h0OiAxMjBweDsKKyAgICB9CisKKyAgICAmLmNsb3NlIHsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2NnB4IC0xMXB4OworICAgICAgICB3aWR0aDogMjVweDsKKyAgICAgICAgaGVpZ2h0OiAyNXB4OworICAgIH0KKworICAgICYuY2xvc2Vfd2hpdGUgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTY2cHggLTM3cHg7CisgICAgICAgIHdpZHRoOiAyNXB4OworICAgICAgICBoZWlnaHQ6IDI1cHg7CisgICAgfQorCisgICAgJi5yZWN5Y2xlIHsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyNXB4IC02MHB4OworICAgICAgICB3aWR0aDogMjRweDsKKyAgICAgICAgaGVpZ2h0OiAyNHB4OworICAgIH0KKworICAgICYuaWRlYSB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNTlweCAtNTdweDsKKyAgICAgICAgd2lkdGg6IDIzcHg7CisgICAgICAgIGhlaWdodDogMjVweDsKKyAgICB9CisKKyAgICAmLmppZ3NhdyB7CisgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjVweCAtOTRweDsKKyAgICAgICAgd2lkdGg6IDI1cHg7CisgICAgICAgIGhlaWdodDogMjVweDsKKyAgICB9CisKKyAgICAmLmJhbGwgeworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTU5cHggLTk1cHg7CisgICAgICAgIHdpZHRoOiAyM3B4OworICAgICAgICBoZWlnaHQ6IDIzcHg7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC9zdHlsZXMvd2VsY29tZS1zdHlsZS5sZXNzIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3dlbGNvbWUtc3R5bGUubGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDk2OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvc3R5bGVzL3dlbGNvbWUtc3R5bGUubGVzcwpAQCAtMCwwICsxLDY1MSBAQAorQHpvb20taW4tYW5pbWF0aW9uLXBsYXk6IDJzOworQHpvb20taW4tYW5pbWF0aW9uOiAzczsKK0BzbGlkZS1mYWRlLWluLXRleHQtbWFpbi1hbmltYXRpb246IDJzOworCitodG1sLAorYm9keSB7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIC8qb3ZlcmZsb3cteDogaGlkZGVuOyovCit9CisKKyogeworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cit9CisKK2JvZHkgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvd2VsY29tZS9iZy9nbG9iYWwucG5nKTsKK30KKworLnNkYy13ZWxjb21lLW5ldy1wYWdlIHsKKworICAgIG9wYWNpdHk6IDE7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluX2NvbG9yX2w7CisKKyAgICAub3Mtd2VsY29tZSB7CisgICAgICAgIHRvcDogNDclOworICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CisgICAgICAgIGxlZnQ6IDQyJTsKKyAgICAgICAgZm9udC1zaXplOiA0MHB4OworICAgIH0KKworICAgICNzbGlkZS0yLCAjc2xpZGUtMywgI3NsaWRlLTQsICNzbGlkZS01IHsKKyAgICAgICAgcGFkZGluZzogMCA1MHB4IDAgMzBweDsKKyAgICB9CisKKyAgICAudmlzaWJsZSB7CisgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1jbG9zZSB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgcmlnaHQ6IDM4cHg7CisgICAgICAgIHRvcDogMzBweDsKKyAgICAgICAgei1pbmRleDogMTAxOworICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CisKKyAgICAgICAgLnNwcml0ZS13ZWxjb21lOworICAgICAgICAuc3ByaXRlLXdlbGNvbWUuY2xvc2U7CisKKyAgICAgICAgJjpob3ZlciB7CisgICAgICAgICAgICAuc3ByaXRlLXdlbGNvbWUuY2xvc2Vfd2hpdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lIHsKKyAgICAgICAgaGVpZ2h0OiAxMDB2aDsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wIHsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy93ZWxjb21lL2JnLzAwMi5qcGcpOworICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyOworCisgICAgICAgIC5hc2RjLXdoYXRzLW5ldyB7CisKKyAgICAgICAgICAgIHotaW5kZXg6IDE7CisKKyAgICAgICAgICAgIC5uZXdzLWl0ZW1zLXJvdyB7CisgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OworCisgICAgICAgICAgICAgICAgLm5ld3MtaXRlbS13cmFwcGVyIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI1MHB4OworICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDM0M3B4OworICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbl9jb2xvcl9wOworICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDE2cHg7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDQwcHggMjBweCAyMHB4IDIwcHg7CisgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMDsKKworICAgICAgICAgICAgICAgICAgICB1bCB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDE3cHg7CisgICAgICAgICAgICAgICAgICAgICAgICBsaSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogZGlzYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG9sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMTJweDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICYuYmctMSB7Ym9yZGVyLWJvdHRvbTogc29saWQgNXB4IEBtYWluX2NvbG9yX2E7fQorICAgICAgICAgICAgICAgICAgICAmLmJnLTIge2JvcmRlci1ib3R0b206IHNvbGlkIDVweCBAbWFpbl9jb2xvcl9qO30KKyAgICAgICAgICAgICAgICAgICAgJi5iZy0zIHtib3JkZXItYm90dG9tOiBzb2xpZCA1cHggQG1haW5fY29sb3JfZDt9CisgICAgICAgICAgICAgICAgICAgICYuYmctNCB7Ym9yZGVyLWJvdHRvbTogc29saWQgNXB4IEBtYWluX2NvbG9yX2k7fQorICAgICAgICAgICAgICAgICAgICAmLmJnLTUge2JvcmRlci1ib3R0b206IHNvbGlkIDVweCBAbWFpbl9jb2xvcl9lO30KKyAgICAgICAgICAgICAgICAgICAgJi5iZy02IHtib3JkZXItYm90dG9tOiBzb2xpZCA1cHggQGZ1bmNfY29sb3JfYjt9CisgICAgICAgICAgICAgICAgICAgICYuYmctNyB7Ym9yZGVyLWJvdHRvbTogc29saWQgNXB4IEBtYWluX2NvbG9yX2M7fQorICAgICAgICAgICAgICAgICAgICAmLmJnLTgge2JvcmRlci1ib3R0b206IHNvbGlkIDVweCBAbWFpbl9jb2xvcl9rO30KKworICAgICAgICAgICAgICAgICAgICAubmV3cy1ib2R5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tXzE0X3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLm5ld3MtdGl0bGUgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zXzE4X207CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wMSB7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvd2VsY29tZS9iZy8wMDIucG5nKTsKKyAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTAyIC5hc2RjLXdlbGNvbWUtc2xpZGUtaW1hZ2UtYm94IHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICByaWdodDogMTEuNnZ3OworICAgICAgICB0b3A6IDEwLjV2dzsKKyAgICAgICAgei1pbmRleDogMTsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTAyIC5hc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3ggeworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMzMlOworICAgICAgICBsZWZ0OiAxMCU7CisgICAgICAgIHotaW5kZXg6IDE7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wMiAuYXNkYy13ZWxjb21lLWZyYW1lLXNoYXBlIHsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDIucG5nKTsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICBoZWlnaHQ6IDE5dnc7CisgICAgICAgIHdpZHRoOiAxOXZ3OworICAgICAgICB0b3A6IDIuMXZ3OworICAgICAgICBsZWZ0OiAzMi4xdnc7CisgICAgICAgIC8qIG9wYWNpdHk6IC4zOyAqLworICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CisgICAgICAgIC8qIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7ICovCisgICAgICAgIHotaW5kZXg6IDA7CisgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKworICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICAgICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTAyIC5hc2RjLXdlbGNvbWUtZnJhbWUtY29ubmVjdGlvbiB7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvd2VsY29tZS9iZy9jb25uZWN0aW9uMDIucG5nKTsKKyAgICAgICAgd2lkdGg6IDU2cHg7CisgICAgICAgIGhlaWdodDogMjd2dzsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICBib3R0b206IDA7CisgICAgICAgIHJpZ2h0OiAyOTVweDsKKyAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMHB4IDM1dnc7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wMyAuYXNkYy13ZWxjb21lLXNsaWRlLWltYWdlLWJveCB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgbGVmdDogNiU7CisgICAgICAgIHRvcDogMjAlOworICAgICAgICB6LWluZGV4OiAxOworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtZnJhbWUuZnJhbWUtMDMgLmFzZGMtd2VsY29tZS1zbGlkZS10ZXh0LWJveCB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAzOCU7CisgICAgICAgIHJpZ2h0OiAxNC4ydnc7CisgICAgICAgIHotaW5kZXg6IDE7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wMyAuYXNkYy13ZWxjb21lLWZyYW1lLXNoYXBlIHsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy93ZWxjb21lL2JnL3NoYXBlMDMucG5nKTsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICBoZWlnaHQ6IDM3OHB4OworICAgICAgICB3aWR0aDogMjUycHg7CisgICAgICAgIHRvcDogMHZ3OworICAgICAgICByaWdodDogMTk1cHg7CisgICAgICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsKKyAgICAgICAgei1pbmRleDogMDsKKyAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOworCisgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogQHpvb20taW4tYW5pbWF0aW9uOworICAgICAgICAtbW96LWFuaW1hdGlvbi1kdXJhdGlvbjogQHpvb20taW4tYW5pbWF0aW9uOworICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogQHpvb20taW4tYW5pbWF0aW9uOworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtZnJhbWUuZnJhbWUtMDMgLmFzZGMtd2VsY29tZS1mcmFtZS1jb25uZWN0aW9uIHsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy93ZWxjb21lL2JnL2Nvbm5lY3Rpb24wMy5wbmcpOworICAgICAgICB3aWR0aDogMjA0cHg7CisgICAgICAgIGhlaWdodDogMzcxcHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgYm90dG9tOiAtMTA5cHg7CisgICAgICAgIHJpZ2h0OiA1OTBweDsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTA0IC5hc2RjLXdlbGNvbWUtc2xpZGUtaW1hZ2UtYm94IHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICByaWdodDogMTAlOworICAgICAgICB0b3A6IDIwJTsKKyAgICAgICAgei1pbmRleDogNTsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTA0IC5hc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3ggeworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMzQlOworICAgICAgICBsZWZ0OiA4JTsKKyAgICAgICAgei1pbmRleDogNTsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTA0IC5hc2RjLXdlbGNvbWUtZnJhbWUtY29ubmVjdGlvbiB7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvd2VsY29tZS9iZy9jb25uZWN0aW9uMDQucG5nKTsKKyAgICAgICAgd2lkdGg6IDU2cHg7CisgICAgICAgIGhlaWdodDogNzUycHg7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgYm90dG9tOiAtMTQzcHg7CisgICAgICAgIHJpZ2h0OiA5NDZweDsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTA0IC5hc2RjLXdlbGNvbWUtZnJhbWUtc2hhcGUgeworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3dlbGNvbWUvYmcvc2hhcGUwNC5wbmcpOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIGhlaWdodDogNDEycHg7CisgICAgICAgIHdpZHRoOiAzNTVweDsKKyAgICAgICAgdG9wOiAwOworICAgICAgICByaWdodDogNzM0cHg7CisgICAgICAgIHotaW5kZXg6IDE7CisgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKworICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICAgICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTA1IC5hc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3ggeworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIHRvcDogMjklOworICAgICAgICByaWdodDogMTAlOworICAgICAgICB6LWluZGV4OiA1OworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtZnJhbWUuZnJhbWUtMDUgLmFzZGMtd2VsY29tZS1mcmFtZS1zaGFwZSB7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvd2VsY29tZS9iZy9zaGFwZTA1LnBuZyk7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgaGVpZ2h0OiA3OTRweDsKKyAgICAgICAgd2lkdGg6IDU5N3B4OworICAgICAgICB0b3A6IDA7CisgICAgICAgIHJpZ2h0OiA0MCU7CisgICAgICAgIHotaW5kZXg6IDE7CisgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKworICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICAgICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTA2IHsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy93ZWxjb21lL2JnLzAwNC5wbmcpOworICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyOworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtZnJhbWUuZnJhbWUtMDYgLmFzZGMtd2VsY29tZS1tYWluIHsKKyAgICAgICAgYm90dG9tOiAzMCU7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1oZWFkZXIgeworICAgICAgICAvKmJhY2tncm91bmQtY29sb3I6IHJnYmEoMTcsIDIxLCAzMywgMC41Mik7Ki8KKyAgICAgICAgaGVpZ2h0OiA3MHB4OworICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgcGFkZGluZzogNTVweCAwIDAgNjVweDsKKyAgICAgICAgY29sb3I6ICNmZmY7CisgICAgICAgIHotaW5kZXg6IDE7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgbGVmdDogMDsKKyAgICAgICAgdG9wOiAwOworICAgIH0KKworICAgIC53ZWxjb21lLW5hdiB7CisgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKyAgICB9CisKKyAgICAud2VsY29tZS1sb2dvIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgIH0KKworICAgICNzZGMtd2VsY29tZS12aWRlby13cmFwcGVyIHsKKyAgICAgICAgb3BhY2l0eTogMDsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLXZpZGVvLWNsb3NlIHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDMwcHg7CisgICAgICAgIHJpZ2h0OiAzMHB4OworICAgICAgICB6LWluZGV4OiAxOworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtdmlkZW8geworICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CisgICAgICAgIHRvcDogNTAlOworICAgICAgICBsZWZ0OiA1MCU7CisgICAgICAgIG1pbi13aWR0aDogMTAwJTsKKyAgICAgICAgbWluLWhlaWdodDogMTAwJTsKKyAgICAgICAgd2lkdGg6IGF1dG87CisgICAgICAgIGhlaWdodDogYXV0bzsKKyAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKTsKKyAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS12aWRlby1pY29uIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICAvKm1hcmdpbi1ib3R0b206IDgwcHg7Ki8KKyAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOworICAgICAgICB3aWR0aDogMTQwcHg7CisgICAgICAgIG1hcmdpbjogMCBhdXRvOworICAgICAgICByaWdodDogLTI0cHg7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKworICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEB6b29tLWluLWFuaW1hdGlvbi1wbGF5OworICAgICAgICAtbW96LWFuaW1hdGlvbi1kdXJhdGlvbjogQHpvb20taW4tYW5pbWF0aW9uLXBsYXk7CisgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiBAem9vbS1pbi1hbmltYXRpb24tcGxheTsKKworICAgICAgICAuYXNkYy13ZWxjb21lLXZpZGVvLWljb24tcGxheSB7CisgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgICAgICB0b3A6IC0xMXB4OworICAgICAgICAgICAgbGVmdDogLTExcHg7CisgICAgICAgICAgICB6LWluZGV4OiAxOworICAgICAgICB9CisKKyAgICAgICAgLmFzZGMtd2VsY29tZS12aWRlby1pY29uLXBsYXk6aG92ZXIgKyAuYXNkYy13ZWxjb21lLWlubmVyLWNpcmNsZSB7CisgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1wbGF5LXN0YXRlOiBydW5uaW5nOworICAgICAgICAgICAgLW1vei1hbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZzsKKyAgICAgICAgICAgIGFuaW1hdGlvbi1wbGF5LXN0YXRlOiBydW5uaW5nOworCisgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CisgICAgICAgICAgICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CisgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOworCisgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjp0dXJuaW5nX2FjdyAzczsKKyAgICAgICAgICAgIC1tb3otYW5pbWF0aW9uOnR1cm5pbmdfYWN3IDNzOworICAgICAgICAgICAgYW5pbWF0aW9uOnR1cm5pbmdfYWN3IDNzOworCisgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDk5OworICAgICAgICAgICAgLW1vei1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiA5OTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDk5OworICAgICAgICB9CisKKyAgICAgICAgLmFzZGMtd2VsY29tZS1pbm5lci1jaXJjbGUgeworICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgI0VDRUJGQTsKKyAgICAgICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiM2NjY2NjY7CisgICAgICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6Izk5OTk5OTsKKyAgICAgICAgICAgIC5vcGFjaXR5KDAuNSk7CisKKyAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKKyAgICAgICAgICAgIC1tb3otdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CisKKyAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOworCisgICAgICAgICAgICB3aWR0aDogOTZweDsKKyAgICAgICAgICAgIGhlaWdodDogOTZweDsKKworICAgICAgICAgICAgLmJvcmRlci1yYWRpdXMoOTZweCk7CisKKyAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOnR1cm5pbmdfYWN3IDNzOworICAgICAgICAgICAgLW1vei1hbmltYXRpb246dHVybmluZ19hY3cgM3M7CisgICAgICAgICAgICBhbmltYXRpb246dHVybmluZ19hY3cgM3M7CisKKyAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMzsKKyAgICAgICAgICAgIC1tb3otYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMzsKKyAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKkAtd2Via2l0LWtleWZyYW1lcyB0dXJuaW5nX2FjdyB7CisgICAgICAgIDAleworICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CisgICAgICAgIDEwMCV7CisgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CisgICAgfQorCisgICAgQC1tb3ota2V5ZnJhbWVzIHR1cm5pbmdfYWN3IHsKKyAgICAgICAgMCV7CisgICAgICAgICAgICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KKyAgICAgICAgMTAwJXsKKyAgICAgICAgICAgIC1tb3otdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KKyAgICB9Ki8KKworICAgIEBrZXlmcmFtZXMgdHVybmluZ19hY3cgeworICAgICAgICAwJXsKKyAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KKyAgICAgICAgMTAwJXsKKyAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS10aXRsZSB7CisgICAgICAgIGNvbG9yOiAjMzczZjUxOworICAgICAgICBmb250LXNpemU6IDIuNHZ3OworICAgICAgICBmb250LWZhbWlseTogb21uZXMtbGlnaHQ7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjBlbTsKKyAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1tYWluIHsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgIGJvdHRvbTogNDAlOworICAgICAgICB6LWluZGV4OiAxOworICAgICAgICBjb2xvcjogI2ZmZjsKKyAgICAgICAgbGVmdDogMDsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgfQorCisgICAgLndoYXRzLW5ldyB7CisgICAgICAgIC5wXzE2X3I7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgbGVmdDogMjA1cHg7CisgICAgICAgIHRvcDogNDVweDsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgfQorCisgICAgLmFzZGMtd2VsY29tZS1tYWluLXRpdGxlIHsKKyAgICAgICAgY29sb3I6ICNmZmY7CisgICAgICAgIGZvbnQtc2l6ZTogNjJweDsKKyAgICAgICAgZm9udC1mYW1pbHk6IG9tbmVzLWxpZ2h0OworICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CisgICAgICAgIGhlaWdodDogNzJweDsKKworICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEBzbGlkZS1mYWRlLWluLXRleHQtbWFpbi1hbmltYXRpb247CisgICAgICAgIC1tb3otYW5pbWF0aW9uLWR1cmF0aW9uOiBAc2xpZGUtZmFkZS1pbi10ZXh0LW1haW4tYW5pbWF0aW9uOworICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogQHNsaWRlLWZhZGUtaW4tdGV4dC1tYWluLWFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLW1haW4tbWVzc2FnZSB7CisgICAgICAgIGZvbnQtc2l6ZTogMjhweDsKKyAgICAgICAgZm9udC1mYW1pbHk6IG9tbmVzLWxpZ2h0OworICAgICAgICBsaW5lLWhlaWdodDogMS44ZW07CisgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKworICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEBzbGlkZS1mYWRlLWluLXRleHQtbWFpbi1hbmltYXRpb247CisgICAgICAgIC1tb3otYW5pbWF0aW9uLWR1cmF0aW9uOiBAc2xpZGUtZmFkZS1pbi10ZXh0LW1haW4tYW5pbWF0aW9uOworICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogQHNsaWRlLWZhZGUtaW4tdGV4dC1tYWluLWFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLW1haW4tYmFjay1idG4tcGggeworICAgICAgICBtYXJnaW46IDI0cHggMCA3MHB4OworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtbWFpbi1iYWNrLWJ0biB7CisgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKKyAgICAgICAgY29sb3I6ICMwMDlmZGI7CisgICAgICAgIGZvbnQtZmFtaWx5OiBvbW5lcy1tZWRpdW07CisgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkOworICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OworICAgICAgICBtaW4td2lkdGg6IDI0MnB4OworICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKyAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworCisgICAgICAgICY6aG92ZXIgeworICAgICAgICAgICAgY29sb3I6ICMzM2JmZWM7CisgICAgICAgICAgICBib3JkZXItY29sb3I6ICMzM2JmZWM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLWNvdmVyIHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IDBweDsKKyAgICAgICAgcmlnaHQ6IDA7CisgICAgICAgIGxlZnQ6IDA7CisgICAgICAgIGJvdHRvbTogMDsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxNCwgMTMsIDEyLCAwLjgpOworICAgICAgICB6LWluZGV4OiAwOworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3ggeworICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICAgICAgICBwYWRkaW5nOiAxMHB4OworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtc2xpZGUtdGV4dC1ib3gtdGl0bGUgeworICAgICAgICBjb2xvcjogIzM3M2Y1MTsKKyAgICAgICAgZm9udC1zaXplOiAyLjR2dzsKKyAgICAgICAgZm9udC1mYW1pbHk6IG9tbmVzLWxpZ2h0OworICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDE1ZW07CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjA0ZW07CisgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKworICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEBzbGlkZS1mYWRlLWluLXRleHQtbWFpbi1hbmltYXRpb247CisgICAgICAgIC1tb3otYW5pbWF0aW9uLWR1cmF0aW9uOiBAc2xpZGUtZmFkZS1pbi10ZXh0LW1haW4tYW5pbWF0aW9uOworICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogQHNsaWRlLWZhZGUtaW4tdGV4dC1tYWluLWFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAuYXNkYy13ZWxjb21lLXNsaWRlLXRleHQtYm94LWNvbnRlbnQgeworICAgICAgICBjb2xvcjogIzczN2I4MTsKKyAgICAgICAgZm9udC1zaXplOiAxdnc7CisgICAgICAgIGZvbnQtZmFtaWx5OiBvbW5lcy1saWdodDsKKyAgICAgICAgcGFkZGluZy10b3A6IC41dnc7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTsKKyAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOworCisgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogQHNsaWRlLWZhZGUtaW4tdGV4dC1tYWluLWFuaW1hdGlvbjsKKyAgICAgICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IEBzbGlkZS1mYWRlLWluLXRleHQtbWFpbi1hbmltYXRpb247CisgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiBAc2xpZGUtZmFkZS1pbi10ZXh0LW1haW4tYW5pbWF0aW9uOworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtc2xpZGUtaW1hZ2UtYm94IHsKKyAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKKyAgICAgICAgaGVpZ2h0OiAyOS42dnc7CisgICAgICAgIHdpZHRoOiA0MHZ3OworICAgIH0KKworICAgIC5hc2RjLXdlbGNvbWUtc2xpZGUtaW1hZ2UgeworICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgIH0KKworICAgIC8qLmFzZGMtd2VsY29tZS1mcmFtZS1jb250ZW50IHsqLworICAgIC8qZGlzcGxheTogZmxleDsqLworICAgIC8qanVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ki8KKyAgICAvKmFsaWduLWl0ZW1zOiBjZW50ZXI7Ki8KKyAgICAvKn0qLworICAgIC8qLmFzZGMtd2VsY29tZS1mcmFtZS1jb250ZW50LXRleHQgeyovCisgICAgLypjb2xvcjogIzY2NjsqLworICAgIC8qZm9udC1zaXplOiAxNnB4OyovCisgICAgLypmb250LWZhbWlseTogb21uZXMtbGlnaHQ7Ki8KKyAgICAvKm1hcmdpbi10b3A6IDMwcHg7Ki8KKyAgICAvKmxpbmUtaGVpZ2h0OiAxLjZlbTsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnQtdGV4dC1wIHsqLworICAgIC8qcG9zaXRpb246IHJlbGF0aXZlOyovCisgICAgLyp9Ki8KKyAgICAvKi5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC10ZXh0LXAtaWNvbiB7Ki8KKyAgICAvKnBvc2l0aW9uOiBhYnNvbHV0ZTsqLworICAgIC8qaGVpZ2h0OiAyNXB4OyovCisgICAgLyp3aWR0aDogMjVweDsqLworICAgIC8qbGVmdDogLTQwcHg7Ki8KKyAgICAvKnRvcDogMTBweDsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTAyIC5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC1yaWdodCwqLworICAgIC8qLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wNCAuYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnQtcmlnaHQgeyovCisgICAgLyptYXgtd2lkdGg6IDMwJTsqLworICAgIC8qZmxleDogMTsqLworICAgIC8qbWFyZ2luLWxlZnQ6IDUlOyovCisgICAgLyp9Ki8KKyAgICAvKi5hc2RjLXdlbGNvbWUtZnJhbWUuZnJhbWUtMDIgLmFzZGMtd2VsY29tZS1mcmFtZS1jb250ZW50LWxlZnQsKi8KKyAgICAvKi5hc2RjLXdlbGNvbWUtZnJhbWUuZnJhbWUtMDQgLmFzZGMtd2VsY29tZS1mcmFtZS1jb250ZW50LWxlZnQgeyovCisgICAgLyptYXgtd2lkdGg6IDU1JTsqLworICAgIC8qZmxleDogMTsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTA0IC5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC1pbWcgeyovCisgICAgLyp3aWR0aDogMzZ2dzsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTAzIC5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC1sZWZ0IHsqLworICAgIC8qbWF4LXdpZHRoOiAzMCU7Ki8KKyAgICAvKmZsZXg6IDE7Ki8KKyAgICAvKm1hcmdpbi1yaWdodDogNSU7Ki8KKyAgICAvKn0qLworICAgIC8qLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wMyAuYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnQtcmlnaHQgeyovCisgICAgLyptYXgtd2lkdGg6IDU1JTsqLworICAgIC8qZmxleDogMTsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTAzIC5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC1pbWcgeyovCisgICAgLypsZWZ0OiAwOyovCisgICAgLypyaWdodDogYXV0bzsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLmZyYW1lLTAzIC5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC1pbWctYnViYmxlIHsqLworICAgIC8qbGVmdDogYXV0bzsqLworICAgIC8qdG9wOiAwOyovCisgICAgLypwb3NpdGlvbjogYWJzb2x1dGU7Ki8KKyAgICAvKnJpZ2h0OiAwOyovCisgICAgLyp0b3A6IC03dmg7Ki8KKyAgICAvKn0qLworICAgIC8qLmFzZGMtd2VsY29tZS1mcmFtZS5mcmFtZS0wNSAuYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnR7Ki8KKyAgICAvKmNvbG9yOiAjZmZmOyovCisgICAgLypmb250LXNpemU6IDM3cHg7Ki8KKyAgICAvKmZvbnQtZmFtaWx5OiBvbW5lcy1saWdodDsqLworICAgIC8qZmxleC1kaXJlY3Rpb246IGNvbHVtbjsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnQtaW1nLXBoIHsqLworICAgIC8qcG9zaXRpb246IHJlbGF0aXZlOyovCisgICAgLyohKndpZHRoOiA0MiUqISovCisgICAgLyohKndpZHRoOiA4NDBweDsqISovCisgICAgLyohKmhlaWdodDogNjc0cHg7KiEqLworICAgIC8qd2lkdGg6IDUydnc7Ki8KKyAgICAvKmhlaWdodDogMzl2dzsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnQtaW1nIHsqLworICAgIC8qd2lkdGg6IDQ1dnc7Ki8KKyAgICAvKnBvc2l0aW9uOiBhYnNvbHV0ZTsqLworICAgIC8qei1pbmRleDogMTsqLworICAgIC8qcmlnaHQ6IDA7Ki8KKyAgICAvKmJvdHRvbTogMDsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnQtaW1nLWJ1YmJsZSB7Ki8KKyAgICAvKmJvcmRlci1yYWRpdXM6IDUwJTsqLworICAgIC8qaGVpZ2h0OiAzOHZ3OyovCisgICAgLyp3aWR0aDogMzh2dzsqLworICAgIC8qcG9zaXRpb246IGFic29sdXRlOyovCisgICAgLypsZWZ0OiAwOyovCisgICAgLyp0b3A6IDA7Ki8KKyAgICAvKnBvc2l0aW9uOiBhYnNvbHV0ZTsqLworICAgIC8qcmlnaHQ6IDA7Ki8KKyAgICAvKnRvcDogLTd2aDsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWZyYW1lLWNvbnRlbnQtaW1nLWJ1YmJsZS5ibHVlIHsqLworICAgIC8qYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjMDY3YWI0IDAlLCAjNDRjOGY1IDEwMCUpOyovCisgICAgLyp9Ki8KKyAgICAvKi5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC1pbWctYnViYmxlLmdyZWVuIHsqLworICAgIC8qYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjNzdiZTQ2IDAlLCAjZDJlMTVmIDEwMCUpOyovCisgICAgLyp9Ki8KKyAgICAvKi5hc2RjLXdlbGNvbWUtZnJhbWUtY29udGVudC1pbWctYnViYmxlLnB1cnBsZSB7Ki8KKyAgICAvKmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzhhNTU5ZiAwJSwgI2Q2YjdlNSAxMDAlKTsqLworICAgIC8qfSovCisgICAgLyouYXNkYy13ZWxjb21lLWJ1dHRvbiB7Ki8KKyAgICAvKmZvbnQtZmFtaWx5OiBvbW5lcy1tZWRpdW07Ki8KKyAgICAvKmZvbnQtc2l6ZTogMTRweDsqLworICAgIC8qYmFja2dyb3VuZC1jb2xvcjogIzAwOWZkYjsqLworICAgIC8qdGV4dC1kZWNvcmF0aW9uOiBub25lOyovCisgICAgLypib3JkZXI6IDA7Ki8KKyAgICAvKmJvcmRlci1yYWRpdXM6IDRweDsqLworICAgIC8qY29sb3I6ICNmZmY7Ki8KKyAgICAvKnRleHQtYWxpZ246IGNlbnRlcjsqLworICAgIC8qbGluZS1oZWlnaHQ6IDMwcHg7Ki8KKyAgICAvKm1pbi13aWR0aDogMjAwcHg7Ki8KKyAgICAvKm1hcmdpbi10b3A6IDUwcHg7Ki8KKyAgICAvKn0qLworICAgIC5hc2RjLXdlbGNvbWUtZm9vdGVyIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICBib3R0b206IDA7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICBmb250LXNpemU6IDEycHg7CisgICAgICAgIHBhZGRpbmc6IDIwcHggMTAlOworICAgICAgICBsZWZ0OiAwOworICAgICAgICBjb2xvcjogI2ZmZjsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvUHVuY2hPdXRSZWdpc3RyeS5qcyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L1B1bmNoT3V0UmVnaXN0cnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5MzQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L1B1bmNoT3V0UmVnaXN0cnkuanMKQEAgLTAsMCArMSw5OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisoZnVuY3Rpb24od2luZG93KSB7CisgICAgInVzZSBzdHJpY3QiOworCisgICAgaWYgKHdpbmRvdy5QdW5jaE91dFJlZ2lzdHJ5KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgcXVldWVkRmFjdG9yeVJlcXVlc3RzID0gbmV3IE1hcCgpOworICAgIHZhciBmYWN0b3J5UHJvbWlzZXMgPSBuZXcgTWFwKCk7CisgICAgdmFyIGluc3RhbmNlUHJvbWlzZXMgPSBuZXcgTWFwKCk7CisKKyAgICBmdW5jdGlvbiByZWdpc3RlckZhY3RvcnkobmFtZSwgZmFjdG9yeSkgeworICAgICAgICBpZiAoZmFjdG9yeVByb21pc2VzLmhhcyhuYW1lKSAmJiAhcXVldWVkRmFjdG9yeVJlcXVlc3RzLmhhcyhuYW1lKSkgeworICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUHVuY2hPdXQgXCIiICsgbmFtZSArICJcIiBoYXMgYmVlbiBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocXVldWVkRmFjdG9yeVJlcXVlc3RzLmhhcyhuYW1lKSkgeworICAgICAgICAgICAgdmFyIGZhY3RvcnlSZXF1ZXN0ID0gcXVldWVkRmFjdG9yeVJlcXVlc3RzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGZhY3RvcnlSZXF1ZXN0KGZhY3RvcnkpOworICAgICAgICAgICAgcXVldWVkRmFjdG9yeVJlcXVlc3RzLmRlbGV0ZShuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhY3RvcnlQcm9taXNlcy5zZXQobmFtZSwgUHJvbWlzZS5yZXNvbHZlKGZhY3RvcnkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGdldEZhY3RvcnlQcm9taXNlKG5hbWUpIHsKKyAgICAgICAgdmFyIGZhY3RvcnlQcm9taXNlID0gZmFjdG9yeVByb21pc2VzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFmYWN0b3J5UHJvbWlzZSkgeworICAgICAgICAgICAgZmFjdG9yeVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZUZhY3RvcnkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZWRGYWN0b3J5UmVxdWVzdHMuc2V0KG5hbWUsIHJlc29sdmVGYWN0b3J5KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmFjdG9yeVByb21pc2VzLnNldChuYW1lLCBmYWN0b3J5UHJvbWlzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhY3RvcnlQcm9taXNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIGdldEluc3RhbmNlUHJvbWlzZShuYW1lLCBlbGVtZW50KSB7CisgICAgICAgIHZhciBmYWN0b3J5UHJvbWlzZTsKKyAgICAgICAgdmFyIGluc3RhbmNlUHJvbWlzZSA9IGluc3RhbmNlUHJvbWlzZXMuZ2V0KGVsZW1lbnQpOworICAgICAgICBpZiAoIWluc3RhbmNlUHJvbWlzZSkgeworICAgICAgICAgICAgaW5zdGFuY2VQcm9taXNlID0gZ2V0RmFjdG9yeVByb21pc2UobmFtZSkudGhlbihmdW5jdGlvbihmYWN0b3J5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaW5zdGFuY2VQcm9taXNlcy5zZXQoZWxlbWVudCwgaW5zdGFuY2VQcm9taXNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2VQcm9taXNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIHJlbmRlclB1bmNoT3V0KHBhcmFtcywgZWxlbWVudCkgeworICAgICAgICB2YXIgbmFtZSA9IHBhcmFtcy5uYW1lOworICAgICAgICB2YXIgb3B0aW9ucyA9IHBhcmFtcy5vcHRpb25zIHx8IHt9OworICAgICAgICB2YXIgb25FdmVudCA9IHBhcmFtcy5vbkV2ZW50IHx8IGZ1bmN0aW9uICgpIHt9OworCisgICAgICAgIGdldEluc3RhbmNlUHJvbWlzZShuYW1lLCBlbGVtZW50KS50aGVuKGZ1bmN0aW9uIChwdW5jaE91dCkgeworICAgICAgICAgICAgcHVuY2hPdXQucmVuZGVyKHtvcHRpb25zOiBvcHRpb25zLCBvbkV2ZW50OiBvbkV2ZW50fSwgZWxlbWVudCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIHVubW91bnRQdW5jaE91dChlbGVtZW50KSB7CisgICAgICAgIGlmICghaW5zdGFuY2VQcm9taXNlcy5oYXMoZWxlbWVudCkpIHsKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRoZXJlIGlzIG5vIFB1bmNoT3V0IGluIGVsZW1lbnQiLCBlbGVtZW50KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnN0YW5jZVByb21pc2VzLmdldChlbGVtZW50KS50aGVuKGZ1bmN0aW9uKHB1bmNoT3V0KSB7CisgICAgICAgICAgICBwdW5jaE91dC51bm1vdW50KGVsZW1lbnQpOworICAgICAgICB9KTsKKyAgICAgICAgaW5zdGFuY2VQcm9taXNlcy5kZWxldGUoZWxlbWVudCk7CisgICAgfQorCisgICAgdmFyIFB1bmNoT3V0UmVnaXN0cnkgPSBPYmplY3QuZnJlZXplKHsKKyAgICAgICAgcmVnaXN0ZXI6IHJlZ2lzdGVyRmFjdG9yeSwKKyAgICAgICAgcmVuZGVyOiByZW5kZXJQdW5jaE91dCwKKyAgICAgICAgdW5tb3VudDogdW5tb3VudFB1bmNoT3V0CisgICAgfSk7CisKKyAgICB3aW5kb3cuUHVuY2hPdXRSZWdpc3RyeSA9IFB1bmNoT3V0UmVnaXN0cnk7CisKK30pKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsLy5ucG1pZ25vcmUgYi9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvLm5wbWlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2JkMDkyCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsLy5ucG1pZ25vcmUKQEAgLTAsMCArMSwzIEBACitjb21waWxlLyoKK25vZGVfbW9kdWxlcworLnRtcApkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsLy50cmF2aXMueW1sIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTVjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvLnRyYXZpcy55bWwKQEAgLTAsMCArMSwxMiBAQAorbGFuZ3VhZ2U6IG5vZGVfanMKK25vZGVfanM6CisgIC0gMC4xMAorCitpbnN0YWxsOgorICAtIG5wbSBpbnN0YWxsCisKK2JlZm9yZV9zY3JpcHQ6CisgIC0gbnBtIGluc3RhbGwgLWcgZ3J1bnQtY2xpCisKK3NjcmlwdDoKKyAgLSBncnVudCB0ZXN0OnByb3RyYWN0b3ItdHJhdmlzCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvR3J1bnRmaWxlLmNvZmZlZSBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9HcnVudGZpbGUuY29mZmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Yjk0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvR3J1bnRmaWxlLmNvZmZlZQpAQCAtMCwwICsxLDExMCBAQAorbW9kdWxlLmV4cG9ydHMgPSAoZ3J1bnQpIC0+CisgIGdydW50LmxvYWROcG1UYXNrcyAnZ3J1bnQtY29mZmVlbGludCcKKyAgZ3J1bnQubG9hZE5wbVRhc2tzICdncnVudC1jb250cmliLWNsZWFuJworICBncnVudC5sb2FkTnBtVGFza3MgJ2dydW50LWNvbnRyaWItY29mZmVlJworICBncnVudC5sb2FkTnBtVGFza3MgJ2dydW50LWNvbnRyaWItY29uY2F0JworICBncnVudC5sb2FkTnBtVGFza3MgJ2dydW50LWNvbnRyaWItY29ubmVjdCcKKyAgZ3J1bnQubG9hZE5wbVRhc2tzICdncnVudC1jb250cmliLXVnbGlmeScKKyAgZ3J1bnQubG9hZE5wbVRhc2tzICdncnVudC1wcm90cmFjdG9yLXJ1bm5lcicKKworICBzYXVjZVVzZXIgPSAncG9tZXJhbnRzZXZwJworICBzYXVjZUtleSA9ICc0OTdhYjA0ZS1mMzFiLTRhN2ItOWIxOC1hZTNmYmUwMjMyMjInCisKKyAgZ3J1bnQuaW5pdENvbmZpZworICAgIHBrZzogZ3J1bnQuZmlsZS5yZWFkSlNPTiAncGFja2FnZS5qc29uJworICAgIG1ldGE6CisgICAgICBiYW5uZXI6ICcvKiA8JT0gcGtnLm5hbWUgJT4gLSB2PCU9IHBrZy52ZXJzaW9uICU+IC0gPCU9IGdydW50LnRlbXBsYXRlLnRvZGF5KCJ5eXl5LW1tLWRkIikgJT4gKi9cbicKKyAgICBjb2ZmZWVsaW50OgorICAgICAgc3JjOiAnc3JjLyoqLyouY29mZmVlJworICAgICAgb3B0aW9uczoKKyAgICAgICAgbWF4X2xpbmVfbGVuZ3RoOgorICAgICAgICAgIGxldmVsOiAnaWdub3JlJworICAgICAgICBsaW5lX2VuZGluZ3M6CisgICAgICAgICAgdmFsdWU6ICd1bml4JworICAgICAgICAgIGxldmVsOiAnZXJyb3InCisgICAgICAgIG5vX3N0YW5kX2Fsb25lX2F0OgorICAgICAgICAgIGxldmVsOiAnZXJyb3InCisgICAgY2xlYW46CisgICAgICBvcHRpb25zOgorICAgICAgICBmb3JjZTogdHJ1ZQorICAgICAgYnVpbGQ6IFsiY29tcGlsZS8qKiIsICJidWlsZC8qKiJdCisgICAgY29mZmVlOgorICAgICAgY29tcGlsZToKKyAgICAgICAgZmlsZXM6IFsKKyAgICAgICAgICB7CisgICAgICAgICAgICBleHBhbmQ6IHRydWUKKyAgICAgICAgICAgIGN3ZDogJ3NyYy8nCisgICAgICAgICAgICBzcmM6ICcqKi8qLmNvZmZlZScKKyAgICAgICAgICAgIGRlc3Q6ICdjb21waWxlLycKKyAgICAgICAgICAgIGV4dDogJy5qcycKKyAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgIG9wdGlvbnM6CisgICAgICAgICAgYmFyZTogdHJ1ZQorICAgIGNvbmNhdDoKKyAgICAgIG9wdGlvbnM6CisgICAgICAgIGJhbm5lcjogJzwlPSBtZXRhLmJhbm5lciAlPicKKyAgICAgIGRpc3Q6CisgICAgICAgIHNyYzogJ2NvbXBpbGUvKiovKi5qcycKKyAgICAgICAgZGVzdDogJ2J1aWxkL25nLWluZmluaXRlLXNjcm9sbC5qcycKKyAgICB1Z2xpZnk6CisgICAgICBvcHRpb25zOgorICAgICAgICBiYW5uZXI6ICc8JT0gbWV0YS5iYW5uZXIgJT4nCisgICAgICBkaXN0OgorICAgICAgICBzcmM6IFsnYnVpbGQvbmctaW5maW5pdGUtc2Nyb2xsLmpzJ10KKyAgICAgICAgZGVzdDogJ2J1aWxkL25nLWluZmluaXRlLXNjcm9sbC5taW4uanMnCisgICAgY29ubmVjdDoKKyAgICAgIHRlc3RzZXJ2ZXI6CisgICAgICAgIG9wdGlvbnM6CisgICAgICAgICAgcG9ydDogODAwMAorICAgICAgICAgIGhvc3RuYW1lOiAnMC4wLjAuMCcKKyAgICAgICAgICBtaWRkbGV3YXJlOiAoY29ubmVjdCwgb3B0aW9ucykgLT4KKyAgICAgICAgICAgIGJhc2UgPSBpZiBBcnJheS5pc0FycmF5KG9wdGlvbnMuYmFzZSkgdGhlbiBvcHRpb25zLmJhc2Vbb3B0aW9ucy5iYXNlLmxlbmd0aCAtIDFdIGVsc2Ugb3B0aW9ucy5iYXNlCisgICAgICAgICAgICBbY29ubmVjdC5zdGF0aWMoYmFzZSldCisgICAgcHJvdHJhY3RvcjoKKyAgICAgIGxvY2FsOgorICAgICAgICBvcHRpb25zOgorICAgICAgICAgIGNvbmZpZ0ZpbGU6ICd0ZXN0L3Byb3RyYWN0b3ItbG9jYWwuY29uZi5qcycKKyAgICAgICAgICBhcmdzOgorICAgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgICB0ZXN0VGhyb3R0bGVWYWx1ZTogNTAwCisgICAgICB0cmF2aXM6CisgICAgICAgIG9wdGlvbnM6CisgICAgICAgICAgY29uZmlnRmlsZTogJ3Rlc3QvcHJvdHJhY3Rvci10cmF2aXMuY29uZi5qcycKKyAgICAgICAgICBhcmdzOgorICAgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgICAjIFdoZW4gdXNpbmcgU2F1Y2UgQ29ubmVjdCwgd2Ugc2hvdWxkIHVzZSBhIGxhcmdlIHRpbWVvdXQKKyAgICAgICAgICAgICAgIyBzaW5jZSBldmVyeXRoaW5nIGlzIGdlbmVyYWxseSBtdWNoIHNsb3dlciB0aGFuIHdoZW4gdGVzdGluZyBsb2NhbGx5LgorICAgICAgICAgICAgICB0ZXN0VGhyb3R0bGVWYWx1ZTogMTAwMDAKKyAgICAgICAgICAgIHNhdWNlVXNlcjogc2F1Y2VVc2VyCisgICAgICAgICAgICBzYXVjZUtleTogc2F1Y2VLZXkKKworICBncnVudC5yZWdpc3RlclRhc2sgJ3dlYmRyaXZlcicsICgpIC0+CisgICAgZG9uZSA9IHRoaXMuYXN5bmMoKQorICAgIHAgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuc3Bhd24oJ25vZGUnLCBbJ25vZGVfbW9kdWxlcy9wcm90cmFjdG9yL2Jpbi93ZWJkcml2ZXItbWFuYWdlcicsICd1cGRhdGUnXSkKKyAgICBwLnN0ZG91dC5waXBlKHByb2Nlc3Muc3Rkb3V0KQorICAgIHAuc3RkZXJyLnBpcGUocHJvY2Vzcy5zdGRlcnIpCisgICAgcC5vbiAnZXhpdCcsIChjb2RlKSAtPgorICAgICAgaWYgY29kZSBpc250IDAgdGhlbiBncnVudC5mYWlsLndhcm4oJ1dlYmRyaXZlciBmYWlsZWQgdG8gdXBkYXRlJykKKyAgICAgIGRvbmUoKQorCisgIGdydW50LnJlZ2lzdGVyVGFzayAnc2F1Y2UtY29ubmVjdCcsICgpIC0+CisgICAgZG9uZSA9IHRoaXMuYXN5bmMoKQorICAgIHJlcXVpcmUoJ3NhdWNlLWNvbm5lY3QtbGF1bmNoZXInKSh7dXNlcm5hbWU6IHNhdWNlVXNlciwgYWNjZXNzS2V5OiBzYXVjZUtleX0sIChlcnIsIHNhdWNlQ29ubmVjdFByb2Nlc3MpIC0+CisgICAgICBpZiBlcnIgdGhlbiBjb25zb2xlLmVycm9yKGVyci5tZXNzYWdlKQorICAgICAgZWxzZSBkb25lKCkKKyAgICApCisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrICdkZWZhdWx0JywgWydjb2ZmZWVsaW50JywgJ2NsZWFuJywgJ2NvZmZlZScsICdjb25jYXQnLCAndWdsaWZ5J10KKyAgZ3J1bnQucmVnaXN0ZXJUYXNrICd0ZXN0OnByb3RyYWN0b3ItbG9jYWwnLCBbCisgICAgJ2RlZmF1bHQnLAorICAgICd3ZWJkcml2ZXInLAorICAgICdjb25uZWN0OnRlc3RzZXJ2ZXInLAorICAgICdwcm90cmFjdG9yOmxvY2FsJworICBdCisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrICd0ZXN0OnByb3RyYWN0b3ItdHJhdmlzJywgWworICAgICdjb25uZWN0OnRlc3RzZXJ2ZXInLAorICAgICdzYXVjZS1jb25uZWN0JywKKyAgICAncHJvdHJhY3Rvcjp0cmF2aXMnCisgIF0KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9MSUNFTlNFIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhZTJiZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9MSUNFTlNFCkBAIC0wLDAgKzEsMjIgQEAKK0NvcHlyaWdodCAoYykgMjAxMiBNaWNoZWxsZSBUaWxsZXkKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KK29idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCitmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CityZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKK2NvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKK1NvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCitjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKK0hPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCitGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvUkVBRE1FLm1kIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThkODYzCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL1JFQURNRS5tZApAQCAtMCwwICsxLDcxIEBACitbKipNYWludGFpbmVyIGhlbHAgbmVlZGVkKio6IEknbSBsb29raW5nIGZvciBmZWxsb3dzIHRoYXQgYXJlIHdpbGxpbmcgdG8gaGVscCBtZSBtYWludGFpbiBhbmQgaW1wcm92ZSB0aGlzIHByb2plY3QuXShodHRwczovL2dpdGh1Yi5jb20vc3JvemUvbmdJbmZpbml0ZVNjcm9sbC9pc3N1ZXMvMjY3KQorCistLS0KKworIVtsb2dvXShodHRwOi8vc3JvemUuZ2l0aHViLmNvbS9uZ0luZmluaXRlU2Nyb2xsL2ltYWdlcy9sb2dvLXJlc2l6ZWQucG5nKQorCitbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9zcm96ZS9uZ0luZmluaXRlU2Nyb2xsLnBuZz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL3Nyb3plL25nSW5maW5pdGVTY3JvbGwpCisKK25nSW5maW5pdGVTY3JvbGwgaXMgYSBkaXJlY3RpdmUgZm9yIFtBbmd1bGFySlNdKGh0dHA6Ly9hbmd1bGFyanMub3JnLykgdG8gZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiB3aGVuIHRoZSBib3R0b20gb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgYXBwcm9hY2hlcyB0aGUgYm90dG9tIG9mIHRoZSBicm93c2VyIHdpbmRvdywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGluZmluaXRlIHNjcm9sbGluZy4KKworRGVtb3MKKy0tLS0tCisKK0NoZWNrIG91dCB0aGUgcnVubmluZyBkZW1vcyBbYXQgdGhlIG5nSW5maW5pdGVTY3JvbGwgd2ViIHNpdGVdKGh0dHA6Ly9zcm96ZS5naXRodWIuY29tL25nSW5maW5pdGVTY3JvbGwvZGVtb3MuaHRtbCkuCisKK1ZlcnNpb24gTnVtYmVycworLS0tLS0tLS0tLS0tLS0tCisKK25nSW5maW5pdGUgU2Nyb2xsIGZvbGxvd3MgW3NlbWFudGljIHZlcnNpb25pbmddKGh0dHA6Ly9zZW12ZXIub3JnLykgYW5kIHVzZXMgdGhlIGZvbGxvd2luZyB2ZXJzaW9uaW5nIHNjaGVtZToKKworICogVmVyc2lvbnMgc3RhcnRpbmcgd2l0aCAwIChlLmcuIDAuMS4wLCAwLjIuMCwgZXRjLikgYXJlIGZvciBpbml0aWFsIGRldmVsb3BtZW50LCBhbmQgdGhlIEFQSSBpcyBub3Qgc3RhYmxlCisgKiBWZXJzaW9ucyB3aXRoIGFuIGV2ZW4gbWlub3IgdmVyc2lvbiAoMS4wLjAsIDEuNC4wLCAyLjIuMCwgZXRjLikgYXJlIHN0YWJsZSByZWxlYXNlcworICogVmVyc2lvbnMgd2l0aCBhbiBvZGQgbWlub3IgdmVyc2lvbiAoMS4xLjAsIDEuMy4wLCAyLjEuMCwgZXRjLikgYXJlIGRldmVsb3BtZW50IHJlbGVhc2VzCisKK1RoZSBbZG93bmxvYWQgcGFnZV0oaHR0cDovL3Nyb3plLmdpdGh1Yi5jb20vbmdJbmZpbml0ZVNjcm9sbC8jZG93bmxvYWQpIGFsbG93cyB5b3UgdG8gcGljayBhbW9uZyB2YXJpb3VzIHZlcnNpb25zIGFuZCBzcGVjaWZ5IHdoaWNoIHJlbGVhc2VzIGFyZSBzdGFibGUgKG5vdCBpbmNsdWRpbmcgcHJlLXJlbGVhc2UgYnVpbGRzKS4KKworR2V0dGluZyBTdGFydGVkCistLS0tLS0tLS0tLS0tLS0KKworICogRG93bmxvYWQgbmdJbmZpbml0ZVNjcm9sbCBmcm9tIFt0aGUgZG93bmxvYWQgcGFnZSBvbiB0aGUgbmdJbmZpbml0ZVNjcm9sbCB3ZWIgc2l0ZV0oaHR0cDovL3Nyb3plLmdpdGh1Yi5jb20vbmdJbmZpbml0ZVNjcm9sbC8jZG93bmxvYWQpIG9yIGluc3RhbGwgaXQgd2l0aDoKKyAgICogW0Jvd2VyXShodHRwOi8vYm93ZXIuaW8vKSB2aWEgYGJvd2VyIGluc3RhbGwgbmdJbmZpbml0ZVNjcm9sbGAKKyAgICogW05QTV0oaHR0cHM6Ly93d3cubnBtanMuY29tKSB2aWEgYG5wbSBpbnN0YWxsIC0tc2F2ZSBuZy1pbmZpbml0ZS1zY3JvbGxgCisgICAqIFtOdWdldF0oaHR0cHM6Ly93d3cubnVnZXQub3JnKSB2aWEgYFBNPiBJbnN0YWxsLVBhY2thZ2UgbmctaW5maW5pdGUtc2Nyb2xsYAorICogSW5jbHVkZSB0aGUgc2NyaXB0IHRhZyBvbiB5b3VyIHBhZ2UgYWZ0ZXIgdGhlIEFuZ3VsYXJKUyBzY3JpcHQgdGFnIChuZ0luZmluaXRlU2Nyb2xsICpkb2Vzbid0KiByZXF1aXJlIGpRdWVyeSkKKworICAgICAgICA8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCcgc3JjPSdwYXRoL3RvL2FuZ3VsYXIubWluLmpzJz48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0ncGF0aC90by9uZy1pbmZpbml0ZS1zY3JvbGwubWluLmpzJz48L3NjcmlwdD4KKworICogRW5zdXJlIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBtb2R1bGUgc3BlY2lmaWVzIGBpbmZpbml0ZS1zY3JvbGxgIGFzIGEgZGVwZW5kZW5jeToKKworICAgICAgICBhbmd1bGFyLm1vZHVsZSgnbXlBcHBsaWNhdGlvbicsIFsnaW5maW5pdGUtc2Nyb2xsJ10pOworCisgKiBVc2UgdGhlIGRpcmVjdGl2ZSBieSBzcGVjaWZ5aW5nIGFuIGBpbmZpbml0ZS1zY3JvbGxgIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LgorCisgICAgICAgIDxkaXYgaW5maW5pdGUtc2Nyb2xsPSJteVBhZ2luZ0Z1bmN0aW9uKCkiIGluZmluaXRlLXNjcm9sbC1kaXN0YW5jZT0iMyI+PC9kaXY+CisKK05vdGUgdGhhdCBuZWl0aGVyIHRoZSBtb2R1bGUgbm9yIHRoZSBkaXJlY3RpdmUgdXNlIHRoZSBgbmdgIHByZWZpeCwgYXMgdGhhdCBwcmVmaXggaXMgcmVzZXJ2ZWQgZm9yIHRoZSBjb3JlIEFuZ3VsYXIgbW9kdWxlLgorCitEZXRhaWxlZCBEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25nSW5maW5pdGVTY3JvbGwgYWNjZXB0cyBzZXZlcmFsIGF0dHJpYnV0ZXMgdG8gY3VzdG9taXplIHRoZSBiZWhhdmlvciBvZiB0aGUgZGlyZWN0aXZlOyBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgY2FuIGJlIGZvdW5kIFtvbiB0aGUgbmdJbmZpbml0ZVNjcm9sbCB3ZWIgc2l0ZV0oaHR0cDovL3Nyb3plLmdpdGh1Yi5jb20vbmdJbmZpbml0ZVNjcm9sbC9kb2N1bWVudGF0aW9uLmh0bWwpLgorCitQb3J0cworLS0tLS0KKworSWYgeW91IHVzZSBbQW5ndWxhckRhcnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuZGFydCksIEp1aGEgS29tdWxhaW5lbiBoYXMgW2EgcG9ydCBvZiB0aGUgcHJvamVjdF0oaHR0cDovL3B1Yi5kYXJ0bGFuZy5vcmcvcGFja2FnZXMvbmdfaW5maW5pdGVfc2Nyb2xsKSB5b3UgY2FuIHVzZS4KKworTGljZW5zZQorLS0tLS0tLQorCituZ0luZmluaXRlU2Nyb2xsIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4KKworVGVzdGluZworLS0tLS0tLQorCituZ0luZmluaXRlU2Nyb2xsIHVzZXMgUHJvdHJhY3RvciBmb3IgdGVzdGluZy4gTm90ZSB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBDaHJvbWUgYnJvd3NlciwgYW5kIHRoZSBgZ3J1bnQtY2xpYCBucG0gcGFja2FnZSBpbnN0YWxsZWQgZ2xvYmFsbHkgaWYgeW91IHdpc2ggdG8gdXNlIGdydW50IChgbnBtIGluc3RhbGwgLWcgZ3J1bnQtY2xpYCkuIFRoZW4sIGluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyB3aXRoIGBucG0gaW5zdGFsbGAuCisKKyogYGdydW50IHRlc3Q6cHJvdHJhY3Rvci1sb2NhbGAgLSBydW4gdGVzdHMKKworVGhhbmsgeW91IHZlcnkgbXVjaCBAcG9tZXJhbnRzZXYgZm9yIHlvdXIgd29yayBvbiB0aGVzZSBQcm90cmFjdG9yIHRlc3RzLgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL2Jvd2VyLmpzb24gYi9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvYm93ZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTcxYzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL2Jvd2VyLmpzb24KQEAgLTAsMCArMSwxNiBAQAoreworICAgICJuYW1lIjogIm5nSW5maW5pdGVTY3JvbGwiLAorICAgICJtYWluIjogImJ1aWxkL25nLWluZmluaXRlLXNjcm9sbC5qcyIsCisgICAgImlnbm9yZSI6IFsKKyAgICAgICAgIioqLy4qIiwKKyAgICAgICAgIl8qIiwKKyAgICAgICAgIm5vZGVfbW9kdWxlcyIsCisgICAgICAgICJjb21waWxlIiwKKyAgICAgICAgInRlc3QiLAorICAgICAgICAiR3J1bnRmaWxlLmNvZmZlZSIsCisgICAgICAgICIuKiIKKyAgICBdLAorICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbmd1bGFyIjogIj49MS4yLjAiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL2J1aWxkL25nLWluZmluaXRlLXNjcm9sbC5qcyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9idWlsZC9uZy1pbmZpbml0ZS1zY3JvbGwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4NTAwNAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9idWlsZC9uZy1pbmZpbml0ZS1zY3JvbGwuanMKQEAgLTAsMCArMSwyMDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogbmctaW5maW5pdGUtc2Nyb2xsIC0gdjEuMy4wIC0gMjAxNi0wNi0zMCAqLworYW5ndWxhci5tb2R1bGUoJ2luZmluaXRlLXNjcm9sbCcsIFtdKS52YWx1ZSgnVEhST1RUTEVfTUlMTElTRUNPTkRTJywgbnVsbCkuZGlyZWN0aXZlKCdpbmZpbml0ZVNjcm9sbCcsIFsKKyAgJyRyb290U2NvcGUnLCAnJHdpbmRvdycsICckaW50ZXJ2YWwnLCAnVEhST1RUTEVfTUlMTElTRUNPTkRTJywgZnVuY3Rpb24oJHJvb3RTY29wZSwgJHdpbmRvdywgJGludGVydmFsLCBUSFJPVFRMRV9NSUxMSVNFQ09ORFMpIHsKKyAgICByZXR1cm4geworICAgICAgc2NvcGU6IHsKKyAgICAgICAgaW5maW5pdGVTY3JvbGw6ICcmJywKKyAgICAgICAgaW5maW5pdGVTY3JvbGxDb250YWluZXI6ICc9JywKKyAgICAgICAgaW5maW5pdGVTY3JvbGxEaXN0YW5jZTogJz0nLAorICAgICAgICBpbmZpbml0ZVNjcm9sbERpc2FibGVkOiAnPScsCisgICAgICAgIGluZmluaXRlU2Nyb2xsVXNlRG9jdW1lbnRCb3R0b206ICc9JywKKyAgICAgICAgaW5maW5pdGVTY3JvbGxMaXN0ZW5Gb3JFdmVudDogJ0AnCisgICAgICB9LAorICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW0sIGF0dHJzKSB7CisgICAgICAgIHZhciBjaGFuZ2VDb250YWluZXIsIGNoZWNrSW50ZXJ2YWwsIGNoZWNrV2hlbkVuYWJsZWQsIGNvbnRhaW5lciwgaGFuZGxlSW5maW5pdGVTY3JvbGxDb250YWluZXIsIGhhbmRsZUluZmluaXRlU2Nyb2xsRGlzYWJsZWQsIGhhbmRsZUluZmluaXRlU2Nyb2xsRGlzdGFuY2UsIGhhbmRsZUluZmluaXRlU2Nyb2xsVXNlRG9jdW1lbnRCb3R0b20sIGhhbmRsZXIsIGhlaWdodCwgaW1tZWRpYXRlQ2hlY2ssIG9mZnNldFRvcCwgcGFnZVlPZmZzZXQsIHNjcm9sbERpc3RhbmNlLCBzY3JvbGxFbmFibGVkLCB0aHJvdHRsZSwgdW5yZWdpc3RlckV2ZW50TGlzdGVuZXIsIHVzZURvY3VtZW50Qm90dG9tLCB3aW5kb3dFbGVtZW50OworICAgICAgICB3aW5kb3dFbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KCR3aW5kb3cpOworICAgICAgICBzY3JvbGxEaXN0YW5jZSA9IG51bGw7CisgICAgICAgIHNjcm9sbEVuYWJsZWQgPSBudWxsOworICAgICAgICBjaGVja1doZW5FbmFibGVkID0gbnVsbDsKKyAgICAgICAgY29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgaW1tZWRpYXRlQ2hlY2sgPSB0cnVlOworICAgICAgICB1c2VEb2N1bWVudEJvdHRvbSA9IGZhbHNlOworICAgICAgICB1bnJlZ2lzdGVyRXZlbnRMaXN0ZW5lciA9IG51bGw7CisgICAgICAgIGNoZWNrSW50ZXJ2YWwgPSBmYWxzZTsKKyAgICAgICAgaGVpZ2h0ID0gZnVuY3Rpb24oZWxlbSkgeworICAgICAgICAgIGVsZW0gPSBlbGVtWzBdIHx8IGVsZW07CisgICAgICAgICAgaWYgKGlzTmFOKGVsZW0ub2Zmc2V0SGVpZ2h0KSkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0ub2Zmc2V0SGVpZ2h0OworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgb2Zmc2V0VG9wID0gZnVuY3Rpb24oZWxlbSkgeworICAgICAgICAgIGlmICghZWxlbVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgfHwgZWxlbS5jc3MoJ25vbmUnKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gZWxlbVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBwYWdlWU9mZnNldChlbGVtKTsKKyAgICAgICAgfTsKKyAgICAgICAgcGFnZVlPZmZzZXQgPSBmdW5jdGlvbihlbGVtKSB7CisgICAgICAgICAgZWxlbSA9IGVsZW1bMF0gfHwgZWxlbTsKKyAgICAgICAgICBpZiAoaXNOYU4od2luZG93LnBhZ2VZT2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5wYWdlWU9mZnNldDsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGhhbmRsZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgY29udGFpbmVyQm90dG9tLCBjb250YWluZXJUb3BPZmZzZXQsIGVsZW1lbnRCb3R0b20sIHJlbWFpbmluZywgc2hvdWxkU2Nyb2xsOworICAgICAgICAgIGlmIChjb250YWluZXIgPT09IHdpbmRvd0VsZW1lbnQpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lckJvdHRvbSA9IGhlaWdodChjb250YWluZXIpICsgcGFnZVlPZmZzZXQoY29udGFpbmVyWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgICBlbGVtZW50Qm90dG9tID0gb2Zmc2V0VG9wKGVsZW0pICsgaGVpZ2h0KGVsZW0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250YWluZXJCb3R0b20gPSBoZWlnaHQoY29udGFpbmVyKTsKKyAgICAgICAgICAgIGNvbnRhaW5lclRvcE9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAob2Zmc2V0VG9wKGNvbnRhaW5lcikgIT09IHZvaWQgMCkgeworICAgICAgICAgICAgICBjb250YWluZXJUb3BPZmZzZXQgPSBvZmZzZXRUb3AoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW1lbnRCb3R0b20gPSBvZmZzZXRUb3AoZWxlbSkgLSBjb250YWluZXJUb3BPZmZzZXQgKyBoZWlnaHQoZWxlbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh1c2VEb2N1bWVudEJvdHRvbSkgeworICAgICAgICAgICAgZWxlbWVudEJvdHRvbSA9IGhlaWdodCgoZWxlbVswXS5vd25lckRvY3VtZW50IHx8IGVsZW1bMF0uZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJlbWFpbmluZyA9IGVsZW1lbnRCb3R0b20gLSBjb250YWluZXJCb3R0b207CisgICAgICAgICAgc2hvdWxkU2Nyb2xsID0gcmVtYWluaW5nIDw9IGhlaWdodChjb250YWluZXIpICogc2Nyb2xsRGlzdGFuY2UgKyAxOworICAgICAgICAgIGlmIChzaG91bGRTY3JvbGwpIHsKKyAgICAgICAgICAgIGNoZWNrV2hlbkVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKHNjcm9sbEVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgaWYgKHNjb3BlLiQkcGhhc2UgfHwgJHJvb3RTY29wZS4kJHBoYXNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmluZmluaXRlU2Nyb2xsKCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLiRhcHBseShzY29wZS5pbmZpbml0ZVNjcm9sbCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNoZWNrSW50ZXJ2YWwpIHsKKyAgICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbChjaGVja0ludGVydmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGVja1doZW5FbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0aHJvdHRsZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHsKKyAgICAgICAgICB2YXIgbGF0ZXIsIHByZXZpb3VzLCB0aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQgPSBudWxsOworICAgICAgICAgIHByZXZpb3VzID0gMDsKKyAgICAgICAgICBsYXRlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcHJldmlvdXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwodGltZW91dCk7CisgICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwoKTsKKyAgICAgICAgICB9OworICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBub3csIHJlbWFpbmluZzsKKyAgICAgICAgICAgIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICAgICAgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7CisgICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKKyAgICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbCh0aW1lb3V0KTsKKyAgICAgICAgICAgICAgdGltZW91dCA9IG51bGw7CisgICAgICAgICAgICAgIHByZXZpb3VzID0gbm93OworICAgICAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoIXRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGltZW91dCA9ICRpbnRlcnZhbChsYXRlciwgcmVtYWluaW5nLCAxKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH07CisgICAgICAgIGlmIChUSFJPVFRMRV9NSUxMSVNFQ09ORFMgIT0gbnVsbCkgeworICAgICAgICAgIGhhbmRsZXIgPSB0aHJvdHRsZShoYW5kbGVyLCBUSFJPVFRMRV9NSUxMSVNFQ09ORFMpOworICAgICAgICB9CisgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBjb250YWluZXIudW5iaW5kKCdzY3JvbGwnLCBoYW5kbGVyKTsKKyAgICAgICAgICBpZiAodW5yZWdpc3RlckV2ZW50TGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdW5yZWdpc3RlckV2ZW50TGlzdGVuZXIoKTsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJFdmVudExpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNoZWNrSW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIHJldHVybiAkaW50ZXJ2YWwuY2FuY2VsKGNoZWNrSW50ZXJ2YWwpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGhhbmRsZUluZmluaXRlU2Nyb2xsRGlzdGFuY2UgPSBmdW5jdGlvbih2KSB7CisgICAgICAgICAgcmV0dXJuIHNjcm9sbERpc3RhbmNlID0gcGFyc2VGbG9hdCh2KSB8fCAwOworICAgICAgICB9OworICAgICAgICBzY29wZS4kd2F0Y2goJ2luZmluaXRlU2Nyb2xsRGlzdGFuY2UnLCBoYW5kbGVJbmZpbml0ZVNjcm9sbERpc3RhbmNlKTsKKyAgICAgICAgaGFuZGxlSW5maW5pdGVTY3JvbGxEaXN0YW5jZShzY29wZS5pbmZpbml0ZVNjcm9sbERpc3RhbmNlKTsKKyAgICAgICAgaGFuZGxlSW5maW5pdGVTY3JvbGxEaXNhYmxlZCA9IGZ1bmN0aW9uKHYpIHsKKyAgICAgICAgICBzY3JvbGxFbmFibGVkID0gIXY7CisgICAgICAgICAgaWYgKHNjcm9sbEVuYWJsZWQgJiYgY2hlY2tXaGVuRW5hYmxlZCkgeworICAgICAgICAgICAgY2hlY2tXaGVuRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNjb3BlLiR3YXRjaCgnaW5maW5pdGVTY3JvbGxEaXNhYmxlZCcsIGhhbmRsZUluZmluaXRlU2Nyb2xsRGlzYWJsZWQpOworICAgICAgICBoYW5kbGVJbmZpbml0ZVNjcm9sbERpc2FibGVkKHNjb3BlLmluZmluaXRlU2Nyb2xsRGlzYWJsZWQpOworICAgICAgICBoYW5kbGVJbmZpbml0ZVNjcm9sbFVzZURvY3VtZW50Qm90dG9tID0gZnVuY3Rpb24odikgeworICAgICAgICAgIHJldHVybiB1c2VEb2N1bWVudEJvdHRvbSA9IHY7CisgICAgICAgIH07CisgICAgICAgIHNjb3BlLiR3YXRjaCgnaW5maW5pdGVTY3JvbGxVc2VEb2N1bWVudEJvdHRvbScsIGhhbmRsZUluZmluaXRlU2Nyb2xsVXNlRG9jdW1lbnRCb3R0b20pOworICAgICAgICBoYW5kbGVJbmZpbml0ZVNjcm9sbFVzZURvY3VtZW50Qm90dG9tKHNjb3BlLmluZmluaXRlU2Nyb2xsVXNlRG9jdW1lbnRCb3R0b20pOworICAgICAgICBjaGFuZ2VDb250YWluZXIgPSBmdW5jdGlvbihuZXdDb250YWluZXIpIHsKKyAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci51bmJpbmQoJ3Njcm9sbCcsIGhhbmRsZXIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250YWluZXIgPSBuZXdDb250YWluZXI7CisgICAgICAgICAgaWYgKG5ld0NvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmJpbmQoJ3Njcm9sbCcsIGhhbmRsZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgY2hhbmdlQ29udGFpbmVyKHdpbmRvd0VsZW1lbnQpOworICAgICAgICBpZiAoc2NvcGUuaW5maW5pdGVTY3JvbGxMaXN0ZW5Gb3JFdmVudCkgeworICAgICAgICAgIHVucmVnaXN0ZXJFdmVudExpc3RlbmVyID0gJHJvb3RTY29wZS4kb24oc2NvcGUuaW5maW5pdGVTY3JvbGxMaXN0ZW5Gb3JFdmVudCwgaGFuZGxlcik7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlSW5maW5pdGVTY3JvbGxDb250YWluZXIgPSBmdW5jdGlvbihuZXdDb250YWluZXIpIHsKKyAgICAgICAgICBpZiAoKG5ld0NvbnRhaW5lciA9PSBudWxsKSB8fCBuZXdDb250YWluZXIubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuZXdDb250YWluZXIubm9kZVR5cGUgJiYgbmV3Q29udGFpbmVyLm5vZGVUeXBlID09PSAxKSB7CisgICAgICAgICAgICBuZXdDb250YWluZXIgPSBhbmd1bGFyLmVsZW1lbnQobmV3Q29udGFpbmVyKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXdDb250YWluZXIuYXBwZW5kID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICBuZXdDb250YWluZXIgPSBhbmd1bGFyLmVsZW1lbnQobmV3Q29udGFpbmVyW25ld0NvbnRhaW5lci5sZW5ndGggLSAxXSk7CisgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV3Q29udGFpbmVyID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgbmV3Q29udGFpbmVyID0gYW5ndWxhci5lbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobmV3Q29udGFpbmVyKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuZXdDb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNoYW5nZUNvbnRhaW5lcihuZXdDb250YWluZXIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5maW5pdGUtc2Nyb2xsLWNvbnRhaW5lciBhdHRyaWJ1dGUuIik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzY29wZS4kd2F0Y2goJ2luZmluaXRlU2Nyb2xsQ29udGFpbmVyJywgaGFuZGxlSW5maW5pdGVTY3JvbGxDb250YWluZXIpOworICAgICAgICBoYW5kbGVJbmZpbml0ZVNjcm9sbENvbnRhaW5lcihzY29wZS5pbmZpbml0ZVNjcm9sbENvbnRhaW5lciB8fCBbXSk7CisgICAgICAgIGlmIChhdHRycy5pbmZpbml0ZVNjcm9sbFBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgY2hhbmdlQ29udGFpbmVyKGFuZ3VsYXIuZWxlbWVudChlbGVtLnBhcmVudCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzLmluZmluaXRlU2Nyb2xsSW1tZWRpYXRlQ2hlY2sgIT0gbnVsbCkgeworICAgICAgICAgIGltbWVkaWF0ZUNoZWNrID0gc2NvcGUuJGV2YWwoYXR0cnMuaW5maW5pdGVTY3JvbGxJbW1lZGlhdGVDaGVjayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoZWNrSW50ZXJ2YWwgPSAkaW50ZXJ2YWwoKGZ1bmN0aW9uKCkgeworICAgICAgICAgIGlmIChpbW1lZGlhdGVDaGVjaykgeworICAgICAgICAgICAgaGFuZGxlcigpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gJGludGVydmFsLmNhbmNlbChjaGVja0ludGVydmFsKTsKKyAgICAgICAgfSkpOworICAgICAgfQorICAgIH07CisgIH0KK10pOworCitpZiAodHlwZW9mIG1vZHVsZSAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIGV4cG9ydHMgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZS5leHBvcnRzID09PSBleHBvcnRzKSB7CisgIG1vZHVsZS5leHBvcnRzID0gJ2luZmluaXRlLXNjcm9sbCc7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvYnVpbGQvbmctaW5maW5pdGUtc2Nyb2xsLm1pbi5qcyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9idWlsZC9uZy1pbmZpbml0ZS1zY3JvbGwubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTMwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvYnVpbGQvbmctaW5maW5pdGUtc2Nyb2xsLm1pbi5qcwpAQCAtMCwwICsxLDIyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIG5nLWluZmluaXRlLXNjcm9sbCAtIHYxLjMuMCAtIDIwMTYtMDYtMzAgKi8KK2FuZ3VsYXIubW9kdWxlKCJpbmZpbml0ZS1zY3JvbGwiLFtdKS52YWx1ZSgiVEhST1RUTEVfTUlMTElTRUNPTkRTIixudWxsKS5kaXJlY3RpdmUoImluZmluaXRlU2Nyb2xsIixbIiRyb290U2NvcGUiLCIkd2luZG93IiwiJGludGVydmFsIiwiVEhST1RUTEVfTUlMTElTRUNPTkRTIixmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm57c2NvcGU6e2luZmluaXRlU2Nyb2xsOiImIixpbmZpbml0ZVNjcm9sbENvbnRhaW5lcjoiPSIsaW5maW5pdGVTY3JvbGxEaXN0YW5jZToiPSIsaW5maW5pdGVTY3JvbGxEaXNhYmxlZDoiPSIsaW5maW5pdGVTY3JvbGxVc2VEb2N1bWVudEJvdHRvbToiPSIsaW5maW5pdGVTY3JvbGxMaXN0ZW5Gb3JFdmVudDoiQCJ9LGxpbms6ZnVuY3Rpb24oZSxmLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgseSx6O3JldHVybiB6PWFuZ3VsYXIuZWxlbWVudChiKSx1PW51bGwsdj1udWxsLGo9bnVsbCxrPW51bGwscj0hMCx5PSExLHg9bnVsbCxpPSExLHE9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YVswXXx8YSxpc05hTihhLm9mZnNldEhlaWdodCk/YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OmEub2Zmc2V0SGVpZ2h0fSxzPWZ1bmN0aW9uKGEpe2lmKGFbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYhYS5jc3MoIm5vbmUiKSlyZXR1cm4gYVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ArdChhKX0sdD1mdW5jdGlvbihhKXtyZXR1cm4gYT1hWzBdfHxhLGlzTmFOKHdpbmRvdy5wYWdlWU9mZnNldCk/YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOmEub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5wYWdlWU9mZnNldH0scD1mdW5jdGlvbigpe3ZhciBiLGQsZyxoLGw7cmV0dXJuIGs9PT16PyhiPXEoaykrdChrWzBdLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksZz1zKGYpK3EoZikpOihiPXEoayksZD0wLHZvaWQgMCE9PXMoaykmJihkPXMoaykpLGc9cyhmKS1kK3EoZikpLHkmJihnPXEoKGZbMF0ub3duZXJEb2N1bWVudHx8ZlswXS5kb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50KSksaD1nLWIsbD1oPD1xKGspKnUrMSxsPyhqPSEwLHY/ZS4kJHBoYXNlfHxhLiQkcGhhc2U/ZS5pbmZpbml0ZVNjcm9sbCgpOmUuJGFwcGx5KGUuaW5maW5pdGVTY3JvbGwpOnZvaWQgMCk6KGkmJmMuY2FuY2VsKGkpLGo9ITEpfSx3PWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmO3JldHVybiBmPW51bGwsZT0wLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZT0obmV3IERhdGUpLmdldFRpbWUoKSxjLmNhbmNlbChmKSxmPW51bGwsYS5jYWxsKCl9LGZ1bmN0aW9uKCl7dmFyIGcsaDtyZXR1cm4gZz0obmV3IERhdGUpLmdldFRpbWUoKSxoPWItKGctZSksaDw9MD8oYy5jYW5jZWwoZiksZj1udWxsLGU9ZyxhLmNhbGwoKSk6Zj92b2lkIDA6Zj1jKGQsaCwxKX19LG51bGwhPWQmJihwPXcocCxkKSksZS4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe2lmKGsudW5iaW5kKCJzY3JvbGwiLHApLG51bGwhPXgmJih4KCkseD1udWxsKSxpKXJldHVybiBjLmNhbmNlbChpKX0pLG49ZnVuY3Rpb24oYSl7cmV0dXJuIHU9cGFyc2VGbG9hdChhKXx8MH0sZS4kd2F0Y2goImluZmluaXRlU2Nyb2xsRGlzdGFuY2UiLG4pLG4oZS5pbmZpbml0ZVNjcm9sbERpc3RhbmNlKSxtPWZ1bmN0aW9uKGEpe2lmKHY9IWEsdiYmailyZXR1cm4gaj0hMSxwKCl9LGUuJHdhdGNoKCJpbmZpbml0ZVNjcm9sbERpc2FibGVkIixtKSxtKGUuaW5maW5pdGVTY3JvbGxEaXNhYmxlZCksbz1mdW5jdGlvbihhKXtyZXR1cm4geT1hfSxlLiR3YXRjaCgiaW5maW5pdGVTY3JvbGxVc2VEb2N1bWVudEJvdHRvbSIsbyksbyhlLmluZmluaXRlU2Nyb2xsVXNlRG9jdW1lbnRCb3R0b20pLGg9ZnVuY3Rpb24oYSl7aWYobnVsbCE9ayYmay51bmJpbmQoInNjcm9sbCIscCksaz1hLG51bGwhPWEpcmV0dXJuIGsuYmluZCgic2Nyb2xsIixwKX0saCh6KSxlLmluZmluaXRlU2Nyb2xsTGlzdGVuRm9yRXZlbnQmJih4PWEuJG9uKGUuaW5maW5pdGVTY3JvbGxMaXN0ZW5Gb3JFdmVudCxwKSksbD1mdW5jdGlvbihhKXtpZihudWxsIT1hJiYwIT09YS5sZW5ndGgpe2lmKGEubm9kZVR5cGUmJjE9PT1hLm5vZGVUeXBlP2E9YW5ndWxhci5lbGVtZW50KGEpOiJmdW5jdGlvbiI9PXR5cGVvZiBhLmFwcGVuZD9hPWFuZ3VsYXIuZWxlbWVudChhW2EubGVuZ3RoLTFdKToic3RyaW5nIj09dHlwZW9mIGEmJihhPWFuZ3VsYXIuZWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGEpKSksbnVsbCE9YSlyZXR1cm4gaChhKTt0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5maW5pdGUtc2Nyb2xsLWNvbnRhaW5lciBhdHRyaWJ1dGUuIil9fSxlLiR3YXRjaCgiaW5maW5pdGVTY3JvbGxDb250YWluZXIiLGwpLGwoZS5pbmZpbml0ZVNjcm9sbENvbnRhaW5lcnx8W10pLG51bGwhPWcuaW5maW5pdGVTY3JvbGxQYXJlbnQmJmgoYW5ndWxhci5lbGVtZW50KGYucGFyZW50KCkpKSxudWxsIT1nLmluZmluaXRlU2Nyb2xsSW1tZWRpYXRlQ2hlY2smJihyPWUuJGV2YWwoZy5pbmZpbml0ZVNjcm9sbEltbWVkaWF0ZUNoZWNrKSksaT1jKGZ1bmN0aW9uKCl7cmV0dXJuIHImJnAoKSxjLmNhbmNlbChpKX0pfX19XSksInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cyYmbW9kdWxlLmV4cG9ydHM9PT1leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9ImluZmluaXRlLXNjcm9sbCIpOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3BhY2thZ2UuanNvbiBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9wYWNrYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1OWZhZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC9wYWNrYWdlLmpzb24KQEAgLTAsMCArMSw4MCBAQAoreworICAibmFtZSI6ICJuZy1pbmZpbml0ZS1zY3JvbGwiLAorICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICJkZXNjcmlwdGlvbiI6ICJJbmZpbml0ZSBzY3JvbGxpbmcgZm9yIEFuZ3VsYXJKUyIsCisgICJyZXBvc2l0b3J5IjogeworICAgICJ0eXBlIjogImdpdCIsCisgICAgInVybCI6ICJnaXQ6Ly9naXRodWIuY29tL3Nyb3plL25nSW5maW5pdGVTY3JvbGwuZ2l0IgorICB9LAorICAibWFpbiI6ICJidWlsZC9uZy1pbmZpbml0ZS1zY3JvbGwuanMiLAorICAiYnJvd3NlciI6ICJidWlsZC9uZy1pbmZpbml0ZS1zY3JvbGwuanMiLAorICAic2NyaXB0cyI6IHsKKyAgICAidGVzdCI6ICJncnVudCB0ZXN0OnByb3RyYWN0b3ItbG9jYWwiCisgIH0sCisgICJhdXRob3IiOiB7CisgICAgIm5hbWUiOiAiTWljaGVsbGUgVGlsbGV5IiwKKyAgICAiZW1haWwiOiAibWljaGVsbGVAbWljaGVsbGV0aWxsZXkubmV0IiwKKyAgICAidXJsIjogImh0dHA6Ly9taWNoZWxsZXRpbGxleS5uZXQiCisgIH0sCisgICJjb250cmlidXRvcnMiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiU2FtdWVsIFJPWkUiLAorICAgICAgImVtYWlsIjogInNhbXVlbC5yb3plQGdtYWlsLmNvbSIsCisgICAgICAidXJsIjogImh0dHA6Ly9zcm96ZS5pbyIKKyAgICB9CisgIF0sCisgICJsaWNlbnNlIjogIk1JVCIsCisgICJkZXZEZXBlbmRlbmNpZXMiOiB7CisgICAgImNvZmZlZS1zY3JpcHQiOiAifjEuOC4wIiwKKyAgICAiZ3J1bnQiOiAifjAuNC41IiwKKyAgICAiZ3J1bnQtY29mZmVlbGludCI6ICJ+MC4wLjEzIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jbGVhbiI6ICJ+MC42LjAiLAorICAgICJncnVudC1jb250cmliLWNvZmZlZSI6ICJ+MC4xMi4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiAifjAuNS4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25uZWN0IjogIjAuOC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi11Z2xpZnkiOiAifjAuNi4wIiwKKyAgICAiZ3J1bnQtcHJvdHJhY3Rvci1ydW5uZXIiOiAiMS4xLjQiLAorICAgICJta2RpcnAiOiAiMC41LjAiLAorICAgICJwcm90cmFjdG9yIjogIjEuNC4wIiwKKyAgICAic2F1Y2UtY29ubmVjdC1sYXVuY2hlciI6ICIwLjkuMCIKKyAgfSwKKyAgImdpdEhlYWQiOiAiNmZiZjRiNDE5NDdmOWEzMDIzYjRhYmEwZTYxMzIzMTk1MGNjYzRhMSIsCisgICJidWdzIjogeworICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nyb3plL25nSW5maW5pdGVTY3JvbGwvaXNzdWVzIgorICB9LAorICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nyb3plL25nSW5maW5pdGVTY3JvbGwjcmVhZG1lIiwKKyAgIl9pZCI6ICJuZy1pbmZpbml0ZS1zY3JvbGxAMS4zLjAiLAorICAiX3NoYXN1bSI6ICJjMmU5OGQ4ZmQxMzRiMDUyNWE0ZDJjZjU4Yzk1ZDliNTgzNzU1MTEyIiwKKyAgIl9mcm9tIjogIm5nLWluZmluaXRlLXNjcm9sbEA+PTEuMy4wIDwyLjAuMCIsCisgICJfbnBtVmVyc2lvbiI6ICIzLjkuNSIsCisgICJfbm9kZVZlcnNpb24iOiAiNi4yLjIiLAorICAiX25wbVVzZXIiOiB7CisgICAgIm5hbWUiOiAiZ3JhaW5nZXJ0IiwKKyAgICAiZW1haWwiOiAidGFncmFpbkBnbWFpbC5jb20iCisgIH0sCisgICJkaXN0IjogeworICAgICJzaGFzdW0iOiAiYzJlOThkOGZkMTM0YjA1MjVhNGQyY2Y1OGM5NWQ5YjU4Mzc1NTExMiIsCisgICAgInRhcmJhbGwiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmctaW5maW5pdGUtc2Nyb2xsLy0vbmctaW5maW5pdGUtc2Nyb2xsLTEuMy4wLnRneiIKKyAgfSwKKyAgIm1haW50YWluZXJzIjogWworICAgIHsKKyAgICAgICJuYW1lIjogImJpbmFyeW11c2UiLAorICAgICAgImVtYWlsIjogIm1pY2hlbGxlQG1pY2hlbGxldGlsbGV5Lm5ldCIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogImdyYWluZ2VydCIsCisgICAgICAiZW1haWwiOiAidGFncmFpbkBnbWFpbC5jb20iCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJzcm96ZSIsCisgICAgICAiZW1haWwiOiAic2FtdWVsLnJvemVAZ21haWwuY29tIgorICAgIH0KKyAgXSwKKyAgIl9ucG1PcGVyYXRpb25hbEludGVybmFsIjogeworICAgICJob3N0IjogInBhY2thZ2VzLTEyLXdlc3QuaW50ZXJuYWwubnBtanMuY29tIiwKKyAgICAidG1wIjogInRtcC9uZy1pbmZpbml0ZS1zY3JvbGwtMS4zLjAudGd6XzE0NjczMDIzNzU2MDVfMC44MTkyNjU5NTYwNTkwOTgyIgorICB9LAorICAiZGlyZWN0b3JpZXMiOiB7fSwKKyAgIl9yZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uZy1pbmZpbml0ZS1zY3JvbGwvLS9uZy1pbmZpbml0ZS1zY3JvbGwtMS4zLjAudGd6IiwKKyAgInJlYWRtZSI6ICJFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhIgorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3NyYy9pbmZpbml0ZS1zY3JvbGwuY29mZmVlIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3NyYy9pbmZpbml0ZS1zY3JvbGwuY29mZmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmY5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvc3JjL2luZmluaXRlLXNjcm9sbC5jb2ZmZWUKQEAgLTAsMCArMSwyMDkgQEAKK2FuZ3VsYXIubW9kdWxlKCdpbmZpbml0ZS1zY3JvbGwnLCBbXSkKKyAgLnZhbHVlKCdUSFJPVFRMRV9NSUxMSVNFQ09ORFMnLCBudWxsKQorICAuZGlyZWN0aXZlICdpbmZpbml0ZVNjcm9sbCcsIFsKKyAgICAnJHJvb3RTY29wZScsICckd2luZG93JywgJyRpbnRlcnZhbCcsICdUSFJPVFRMRV9NSUxMSVNFQ09ORFMnLAorKCRyb290U2NvcGUsICR3aW5kb3csICRpbnRlcnZhbCwgVEhST1RUTEVfTUlMTElTRUNPTkRTKSAtPgorICBzY29wZToKKyAgICBpbmZpbml0ZVNjcm9sbDogJyYnCisgICAgaW5maW5pdGVTY3JvbGxDb250YWluZXI6ICc9JworICAgIGluZmluaXRlU2Nyb2xsRGlzdGFuY2U6ICc9JworICAgIGluZmluaXRlU2Nyb2xsRGlzYWJsZWQ6ICc9JworICAgIGluZmluaXRlU2Nyb2xsVXNlRG9jdW1lbnRCb3R0b206ICc9JywKKyAgICBpbmZpbml0ZVNjcm9sbExpc3RlbkZvckV2ZW50OiAnQCcKKworICBsaW5rOiAoc2NvcGUsIGVsZW0sIGF0dHJzKSAtPgorICAgIHdpbmRvd0VsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoJHdpbmRvdykKKworICAgIHNjcm9sbERpc3RhbmNlID0gbnVsbAorICAgIHNjcm9sbEVuYWJsZWQgPSBudWxsCisgICAgY2hlY2tXaGVuRW5hYmxlZCA9IG51bGwKKyAgICBjb250YWluZXIgPSBudWxsCisgICAgaW1tZWRpYXRlQ2hlY2sgPSB0cnVlCisgICAgdXNlRG9jdW1lbnRCb3R0b20gPSBmYWxzZQorICAgIHVucmVnaXN0ZXJFdmVudExpc3RlbmVyID0gbnVsbAorICAgIGNoZWNrSW50ZXJ2YWwgPSBmYWxzZQorCisgICAgaGVpZ2h0ID0gKGVsZW0pIC0+CisgICAgICBlbGVtID0gZWxlbVswXSBvciBlbGVtCisKKyAgICAgIGlmIGlzTmFOKGVsZW0ub2Zmc2V0SGVpZ2h0KSB0aGVuIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCBlbHNlIGVsZW0ub2Zmc2V0SGVpZ2h0CisKKyAgICBvZmZzZXRUb3AgPSAoZWxlbSkgLT4KKyAgICAgIGlmIG5vdCBlbGVtWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCBvciBlbGVtLmNzcygnbm9uZScpCisgICAgICAgIHJldHVybgorCisgICAgICBlbGVtWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHBhZ2VZT2Zmc2V0KGVsZW0pCisKKyAgICBwYWdlWU9mZnNldCA9IChlbGVtKSAtPgorICAgICAgZWxlbSA9IGVsZW1bMF0gb3IgZWxlbQorCisgICAgICBpZiBpc05hTih3aW5kb3cucGFnZVlPZmZzZXQpIHRoZW4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIGVsc2UgZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnBhZ2VZT2Zmc2V0CisKKyAgICAjIGluZmluaXRlLXNjcm9sbCBzcGVjaWZpZXMgYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHdpbmRvdywKKyAgICAjIG9yIHNvbWUgb3RoZXIgY29udGFpbmVyIHNwZWNpZmllZCBieSBpbmZpbml0ZS1zY3JvbGwtY29udGFpbmVyLAorICAgICMgaXMgc2Nyb2xsZWQgd2l0aGluIGEgY2VydGFpbiByYW5nZSBmcm9tIHRoZSBib3R0b20gb2YgdGhlCisgICAgIyBkb2N1bWVudC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGluZmluaXRlLXNjcm9sbC1kaXNhYmxlZAorICAgICMgd2l0aCBhIGJvb2xlYW4gdGhhdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBmdW5jdGlvbiBpcworICAgICMgY2FsbGVkIGluIG9yZGVyIHRvIHRocm90dGxlIHRoZSBmdW5jdGlvbiBjYWxsLgorICAgIGhhbmRsZXIgPSAtPgorICAgICAgaWYgY29udGFpbmVyID09IHdpbmRvd0VsZW1lbnQKKyAgICAgICAgY29udGFpbmVyQm90dG9tID0gaGVpZ2h0KGNvbnRhaW5lcikgKyBwYWdlWU9mZnNldChjb250YWluZXJbMF0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KQorICAgICAgICBlbGVtZW50Qm90dG9tID0gb2Zmc2V0VG9wKGVsZW0pICsgaGVpZ2h0KGVsZW0pCisgICAgICBlbHNlCisgICAgICAgIGNvbnRhaW5lckJvdHRvbSA9IGhlaWdodChjb250YWluZXIpCisgICAgICAgIGNvbnRhaW5lclRvcE9mZnNldCA9IDAKKyAgICAgICAgaWYgb2Zmc2V0VG9wKGNvbnRhaW5lcikgIT0gdW5kZWZpbmVkCisgICAgICAgICAgY29udGFpbmVyVG9wT2Zmc2V0ID0gb2Zmc2V0VG9wKGNvbnRhaW5lcikKKyAgICAgICAgZWxlbWVudEJvdHRvbSA9IG9mZnNldFRvcChlbGVtKSAtIGNvbnRhaW5lclRvcE9mZnNldCArIGhlaWdodChlbGVtKQorCisgICAgICBpZih1c2VEb2N1bWVudEJvdHRvbSkKKyAgICAgICAgZWxlbWVudEJvdHRvbSA9IGhlaWdodCgoZWxlbVswXS5vd25lckRvY3VtZW50IHx8IGVsZW1bMF0uZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudCkKKworICAgICAgcmVtYWluaW5nID0gZWxlbWVudEJvdHRvbSAtIGNvbnRhaW5lckJvdHRvbQorICAgICAgc2hvdWxkU2Nyb2xsID0gcmVtYWluaW5nIDw9IGhlaWdodChjb250YWluZXIpICogc2Nyb2xsRGlzdGFuY2UgKyAxCisKKyAgICAgIGlmIHNob3VsZFNjcm9sbAorICAgICAgICBjaGVja1doZW5FbmFibGVkID0gdHJ1ZQorCisgICAgICAgIGlmIHNjcm9sbEVuYWJsZWQKKyAgICAgICAgICBpZiBzY29wZS4kJHBoYXNlIHx8ICRyb290U2NvcGUuJCRwaGFzZQorICAgICAgICAgICAgc2NvcGUuaW5maW5pdGVTY3JvbGwoKQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNjb3BlLiRhcHBseShzY29wZS5pbmZpbml0ZVNjcm9sbCkKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgY2hlY2tJbnRlcnZhbCB0aGVuICRpbnRlcnZhbC5jYW5jZWwgY2hlY2tJbnRlcnZhbAorICAgICAgICBjaGVja1doZW5FbmFibGVkID0gZmFsc2UKKworICAgICMgVGhlIG9wdGlvbmFsIFRIUk9UVExFX01JTExJU0VDT05EUyBjb25maWd1cmF0aW9uIHZhbHVlIHNwZWNpZmllcworICAgICMgYSBtaW5pbXVtIHRpbWUgdGhhdCBzaG91bGQgZWxhcHNlIGJldHdlZW4gZWFjaCBjYWxsIHRvIHRoZQorICAgICMgaGFuZGxlci4gTi5iLiB0aGUgZmlyc3QgY2FsbCB0aGUgaGFuZGxlciB3aWxsIGJlIHJ1bgorICAgICMgaW1tZWRpYXRlbHksIGFuZCB0aGUgZmluYWwgY2FsbCB3aWxsIGFsd2F5cyByZXN1bHQgaW4gdGhlCisgICAgIyBoYW5kbGVyIGJlaW5nIGNhbGxlZCBhZnRlciB0aGUgYHdhaXRgIHBlcmlvZCBlbGFwc2VzLgorICAgICMgQSBzbGltbWVkIGRvd24gdmVyc2lvbiBvZiB1bmRlcnNjb3JlJ3MgaW1wbGVtZW50YXRpb24uCisgICAgdGhyb3R0bGUgPSAoZnVuYywgd2FpdCkgLT4KKyAgICAgIHRpbWVvdXQgPSBudWxsCisgICAgICBwcmV2aW91cyA9IDAKKyAgICAgIGxhdGVyID0gLT4KKyAgICAgICAgcHJldmlvdXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKQorICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKHRpbWVvdXQpCisgICAgICAgIHRpbWVvdXQgPSBudWxsCisgICAgICAgIGZ1bmMuY2FsbCgpCisKKyAgICAgIHJldHVybiAtPgorICAgICAgICBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKQorICAgICAgICByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKQorICAgICAgICBpZiByZW1haW5pbmcgPD0gMAorICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwodGltZW91dCkKKyAgICAgICAgICB0aW1lb3V0ID0gbnVsbAorICAgICAgICAgIHByZXZpb3VzID0gbm93CisgICAgICAgICAgZnVuYy5jYWxsKCkKKyAgICAgICAgZWxzZSB0aW1lb3V0ID0gJGludGVydmFsKGxhdGVyLCByZW1haW5pbmcsIDEpIHVubGVzcyB0aW1lb3V0CisKKyAgICBpZiBUSFJPVFRMRV9NSUxMSVNFQ09ORFM/CisgICAgICBoYW5kbGVyID0gdGhyb3R0bGUoaGFuZGxlciwgVEhST1RUTEVfTUlMTElTRUNPTkRTKQorCisgICAgc2NvcGUuJG9uICckZGVzdHJveScsIC0+CisgICAgICBjb250YWluZXIudW5iaW5kICdzY3JvbGwnLCBoYW5kbGVyCisgICAgICBpZiB1bnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcj8KKyAgICAgICAgdW5yZWdpc3RlckV2ZW50TGlzdGVuZXIoKQorICAgICAgICB1bnJlZ2lzdGVyRXZlbnRMaXN0ZW5lciA9IG51bGwKKyAgICAgIGlmIGNoZWNrSW50ZXJ2YWwKKyAgICAgICAgJGludGVydmFsLmNhbmNlbCBjaGVja0ludGVydmFsCisKKyAgICAjIGluZmluaXRlLXNjcm9sbC1kaXN0YW5jZSBzcGVjaWZpZXMgaG93IGNsb3NlIHRvIHRoZSBib3R0b20gb2YgdGhlIHBhZ2UKKyAgICAjIHRoZSB3aW5kb3cgaXMgYWxsb3dlZCB0byBiZSBiZWZvcmUgd2UgdHJpZ2dlciBhIG5ldyBzY3JvbGwuIFRoZSB2YWx1ZQorICAgICMgcHJvdmlkZWQgaXMgbXVsdGlwbGllZCBieSB0aGUgY29udGFpbmVyIGhlaWdodDsgZm9yIGV4YW1wbGUsIHRvIGxvYWQKKyAgICAjIG1vcmUgd2hlbiB0aGUgYm90dG9tIG9mIHRoZSBwYWdlIGlzIGxlc3MgdGhhbiAzIGNvbnRhaW5lciBoZWlnaHRzIGF3YXksCisgICAgIyBzcGVjaWZ5IGEgdmFsdWUgb2YgMy4gRGVmYXVsdHMgdG8gMC4KKyAgICBoYW5kbGVJbmZpbml0ZVNjcm9sbERpc3RhbmNlID0gKHYpIC0+CisgICAgICBzY3JvbGxEaXN0YW5jZSA9IHBhcnNlRmxvYXQodikgb3IgMAorCisgICAgc2NvcGUuJHdhdGNoICdpbmZpbml0ZVNjcm9sbERpc3RhbmNlJywgaGFuZGxlSW5maW5pdGVTY3JvbGxEaXN0YW5jZQorICAgICMgSWYgSSBkb24ndCBleHBsaWNpdGx5IGNhbGwgdGhlIGhhbmRsZXIgaGVyZSwgdGVzdHMgZmFpbC4gRG9uJ3Qga25vdyB3aHkgeWV0LgorICAgIGhhbmRsZUluZmluaXRlU2Nyb2xsRGlzdGFuY2Ugc2NvcGUuaW5maW5pdGVTY3JvbGxEaXN0YW5jZQorCisgICAgIyBpbmZpbml0ZS1zY3JvbGwtZGlzYWJsZWQgc3BlY2lmaWVzIGEgYm9vbGVhbiB0aGF0IHdpbGwga2VlcCB0aGUKKyAgICAjIGluZm5pdGUgc2Nyb2xsIGZ1bmN0aW9uIGZyb20gYmVpbmcgY2FsbGVkOyB0aGlzIGlzIHVzZWZ1bCBmb3IKKyAgICAjIGRlYm91bmNpbmcgb3IgdGhyb3R0bGluZyB0aGUgZnVuY3Rpb24gY2FsbC4gSWYgYW4gaW5maW5pdGUKKyAgICAjIHNjcm9sbCBpcyB0cmlnZ2VyZWQgYnV0IHRoaXMgdmFsdWUgZXZhbHVhdGVzIHRvIHRydWUsIHRoZW4KKyAgICAjIG9uY2UgaXQgc3dpdGNoZXMgYmFjayB0byBmYWxzZSB0aGUgaW5maW5pdGUgc2Nyb2xsIGZ1bmN0aW9uCisgICAgIyB3aWxsIGJlIHRyaWdnZXJlZCBhZ2Fpbi4KKyAgICBoYW5kbGVJbmZpbml0ZVNjcm9sbERpc2FibGVkID0gKHYpIC0+CisgICAgICBzY3JvbGxFbmFibGVkID0gIXYKKyAgICAgIGlmIHNjcm9sbEVuYWJsZWQgJiYgY2hlY2tXaGVuRW5hYmxlZAorICAgICAgICBjaGVja1doZW5FbmFibGVkID0gZmFsc2UKKyAgICAgICAgaGFuZGxlcigpCisKKyAgICBzY29wZS4kd2F0Y2ggJ2luZmluaXRlU2Nyb2xsRGlzYWJsZWQnLCBoYW5kbGVJbmZpbml0ZVNjcm9sbERpc2FibGVkCisgICAgIyBJZiBJIGRvbid0IGV4cGxpY2l0bHkgY2FsbCB0aGUgaGFuZGxlciBoZXJlLCB0ZXN0cyBmYWlsLiBEb24ndCBrbm93IHdoeSB5ZXQuCisgICAgaGFuZGxlSW5maW5pdGVTY3JvbGxEaXNhYmxlZCBzY29wZS5pbmZpbml0ZVNjcm9sbERpc2FibGVkCisKKyAgICAjIHVzZSB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50J3MgYm90dG9tLgorICAgICMgVGhpcyB1c2VmdWwgd2hlbiB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgaGVpZ2h0IGR1ZSB0byBpdHMKKyAgICAjIGNoaWxkcmVuIGJlaW5nIGFic29sdXRlIHBvc2l0aW9uZWQuCisgICAgaGFuZGxlSW5maW5pdGVTY3JvbGxVc2VEb2N1bWVudEJvdHRvbSA9ICh2KSAtPgorICAgICAgdXNlRG9jdW1lbnRCb3R0b20gPSB2CisKKyAgICBzY29wZS4kd2F0Y2ggJ2luZmluaXRlU2Nyb2xsVXNlRG9jdW1lbnRCb3R0b20nLCBoYW5kbGVJbmZpbml0ZVNjcm9sbFVzZURvY3VtZW50Qm90dG9tCisgICAgaGFuZGxlSW5maW5pdGVTY3JvbGxVc2VEb2N1bWVudEJvdHRvbSBzY29wZS5pbmZpbml0ZVNjcm9sbFVzZURvY3VtZW50Qm90dG9tCisKKyAgICAjIGluZmluaXRlLXNjcm9sbC1jb250YWluZXIgc2V0cyB0aGUgY29udGFpbmVyIHdoaWNoIHdlIHdhbnQgdG8gYmUKKyAgICAjIGluZmludGUgc2Nyb2xsZWQsIGluc3RlYWQgb2YgdGhlIHdob2xlIHdpbmRvdy4gTXVzdCBiZSBhbgorICAgICMgQW5ndWxhciBvciBqUXVlcnkgZWxlbWVudCwgb3IsIGlmIGpRdWVyeSBpcyBsb2FkZWQsCisgICAgIyBhIGpRdWVyeSBzZWxlY3RvciBhcyBhIHN0cmluZy4KKyAgICBjaGFuZ2VDb250YWluZXIgPSAobmV3Q29udGFpbmVyKSAtPgorICAgICAgaWYgY29udGFpbmVyPworICAgICAgICBjb250YWluZXIudW5iaW5kICdzY3JvbGwnLCBoYW5kbGVyCisKKyAgICAgIGNvbnRhaW5lciA9IG5ld0NvbnRhaW5lcgorICAgICAgaWYgbmV3Q29udGFpbmVyPworICAgICAgICBjb250YWluZXIuYmluZCAnc2Nyb2xsJywgaGFuZGxlcgorCisgICAgY2hhbmdlQ29udGFpbmVyIHdpbmRvd0VsZW1lbnQKKworICAgIGlmIHNjb3BlLmluZmluaXRlU2Nyb2xsTGlzdGVuRm9yRXZlbnQKKyAgICAgIHVucmVnaXN0ZXJFdmVudExpc3RlbmVyID0gJHJvb3RTY29wZS4kb24gc2NvcGUuaW5maW5pdGVTY3JvbGxMaXN0ZW5Gb3JFdmVudCwgaGFuZGxlcgorCisgICAgaGFuZGxlSW5maW5pdGVTY3JvbGxDb250YWluZXIgPSAobmV3Q29udGFpbmVyKSAtPgorICAgICAgIyBUT0RPOiBGb3Igc29tZSByZWFzb24gbmV3Q29udGFpbmVyIGlzIHNvbWV0aW1lcyBudWxsIGluc3RlYWQKKyAgICAgICMgb2YgdGhlIGVtcHR5IGFycmF5LCB3aGljaCBBbmd1bGFyIGlzIHN1cHBvc2VkIHRvIHBhc3Mgd2hlbiB0aGUKKyAgICAgICMgZWxlbWVudCBpcyBub3QgZGVmaW5lZAorICAgICAgIyAoaHR0cHM6Ly9naXRodWIuY29tL3Nyb3plL25nSW5maW5pdGVTY3JvbGwvcHVsbC83I2NvbW1pdGNvbW1lbnQtNTc0ODQzMSkuCisgICAgICAjIFNvIEkgbGVhdmUgYm90aCBjaGVja3MuCisgICAgICBpZiAobm90IG5ld0NvbnRhaW5lcj8pIG9yIG5ld0NvbnRhaW5lci5sZW5ndGggPT0gMAorICAgICAgICByZXR1cm4KKworICAgICAgaWYgbmV3Q29udGFpbmVyLm5vZGVUeXBlICYmIG5ld0NvbnRhaW5lci5ub2RlVHlwZSA9PSAxCisgICAgICAgIG5ld0NvbnRhaW5lciA9IGFuZ3VsYXIuZWxlbWVudCBuZXdDb250YWluZXIKKyAgICAgIGVsc2UgaWYgdHlwZW9mIG5ld0NvbnRhaW5lci5hcHBlbmQgPT0gJ2Z1bmN0aW9uJworICAgICAgICBuZXdDb250YWluZXIgPSBhbmd1bGFyLmVsZW1lbnQgbmV3Q29udGFpbmVyW25ld0NvbnRhaW5lci5sZW5ndGggLSAxXQorICAgICAgZWxzZSBpZiB0eXBlb2YgbmV3Q29udGFpbmVyID09ICdzdHJpbmcnCisgICAgICAgIG5ld0NvbnRhaW5lciA9IGFuZ3VsYXIuZWxlbWVudCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5ld0NvbnRhaW5lcgorCisgICAgICBpZiBuZXdDb250YWluZXI/CisgICAgICAgIGNoYW5nZUNvbnRhaW5lciBuZXdDb250YWluZXIKKyAgICAgIGVsc2UKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGluZmluaXRlLXNjcm9sbC1jb250YWluZXIgYXR0cmlidXRlLiIpCisKKyAgICBzY29wZS4kd2F0Y2ggJ2luZmluaXRlU2Nyb2xsQ29udGFpbmVyJywgaGFuZGxlSW5maW5pdGVTY3JvbGxDb250YWluZXIKKyAgICBoYW5kbGVJbmZpbml0ZVNjcm9sbENvbnRhaW5lcihzY29wZS5pbmZpbml0ZVNjcm9sbENvbnRhaW5lciBvciBbXSkKKworICAgICMgaW5maW5pdGUtc2Nyb2xsLXBhcmVudCBlc3RhYmxpc2hlcyB0aGlzIGVsZW1lbnQncyBwYXJlbnQgYXMgdGhlCisgICAgIyBjb250YWluZXIgaW5maW5pdGVseSBzY3JvbGxlZCBpbnN0ZWFkIG9mIHRoZSB3aG9sZSB3aW5kb3cuCisgICAgaWYgYXR0cnMuaW5maW5pdGVTY3JvbGxQYXJlbnQ/CisgICAgICBjaGFuZ2VDb250YWluZXIgYW5ndWxhci5lbGVtZW50IGVsZW0ucGFyZW50KCkKKworICAgICMgaW5maW50ZS1zY29sbC1pbW1lZGlhdGUtY2hlY2sgc2V0cyB3aGV0aGVyIG9yIG5vdCBydW4gdGhlCisgICAgIyBleHByZXNzaW9uIHBhc3NlZCBvbiBpbmZpbml0ZS1zY3JvbGwgZm9yIHRoZSBmaXJzdCB0aW1lIHdoZW4gdGhlCisgICAgI8KgZGlyZWN0aXZlIGZpcnN0IGxvYWRzLCBiZWZvcmUgYW55IGFjdHVhbCBzY3JvbGwuCisgICAgaWYgYXR0cnMuaW5maW5pdGVTY3JvbGxJbW1lZGlhdGVDaGVjaz8KKyAgICAgIGltbWVkaWF0ZUNoZWNrID0gc2NvcGUuJGV2YWwoYXR0cnMuaW5maW5pdGVTY3JvbGxJbW1lZGlhdGVDaGVjaykKKworICAgIGNoZWNrSW50ZXJ2YWwgPSAkaW50ZXJ2YWwgKC0+CisgICAgICBpZiBpbW1lZGlhdGVDaGVjaworICAgICAgICBoYW5kbGVyKCkKKyAgICAgICRpbnRlcnZhbC5jYW5jZWwgY2hlY2tJbnRlcnZhbAorICAgICkKK10KK2lmIHR5cGVvZiBtb2R1bGUgIT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIGV4cG9ydHMgIT0gInVuZGVmaW5lZCIgJiYgbW9kdWxlLmV4cG9ydHMgPT0gZXhwb3J0cworICBtb2R1bGUuZXhwb3J0cyA9ICdpbmZpbml0ZS1zY3JvbGwnCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvdGVzdC9wcm90cmFjdG9yLWxvY2FsLmNvbmYuanMgYi9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvdGVzdC9wcm90cmFjdG9yLWxvY2FsLmNvbmYuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0YzcyMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC90ZXN0L3Byb3RyYWN0b3ItbG9jYWwuY29uZi5qcwpAQCAtMCwwICsxLDI3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3ZhciBjb25maWcgPSByZXF1aXJlKCcuL3Byb3RyYWN0b3Itc2hhcmVkLmNvbmYnKS5jb25maWc7CisKK2NvbmZpZy5tdWx0aUNhcGFiaWxpdGllcyA9IFsKKyAgeyBicm93c2VyTmFtZTogJ2Nocm9tZScgfQorXTsKKworZXhwb3J0cy5jb25maWcgPSBjb25maWc7CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvdGVzdC9wcm90cmFjdG9yLXNoYXJlZC5jb25mLmpzIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3Rlc3QvcHJvdHJhY3Rvci1zaGFyZWQuY29uZi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU1NjdkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3Rlc3QvcHJvdHJhY3Rvci1zaGFyZWQuY29uZi5qcwpAQCAtMCwwICsxLDI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK2V4cG9ydHMuY29uZmlnID0geworICBzcGVjczogWycqKi8qLnNwZWMuY29mZmVlJ10sCisgIGJhc2VVcmw6ICdodHRwOi8vbG9jYWxob3N0OjgwMDAvJywKKyAgYWxsU2NyaXB0c1RpbWVvdXQ6IDMwMDAwLAorICBnZXRQYWdlVGltZW91dDogMzAwMDAKK307CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2FwcC90aGlyZC1wYXJ0eS9uZy1pbmZpbml0ZS1zY3JvbGwvdGVzdC9wcm90cmFjdG9yLXRyYXZpcy5jb25mLmpzIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3Rlc3QvcHJvdHJhY3Rvci10cmF2aXMuY29uZi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZlMGJkCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3Rlc3QvcHJvdHJhY3Rvci10cmF2aXMuY29uZi5qcwpAQCAtMCwwICsxLDMyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3ZhciBjb25maWcgPSByZXF1aXJlKCcuL3Byb3RyYWN0b3Itc2hhcmVkLmNvbmYnKS5jb25maWc7CisKKy8vIEFsbCBhdmFpbGFibGUgcGxhdGZvcm0gLyBicm93c2VyIGNvbWJpbmF0aW9ucyBjYW4gYmUgZm91bmQgb24gaHR0cHM6Ly9zYXVjZWxhYnMuY29tL3BsYXRmb3JtcworY29uZmlnLm11bHRpQ2FwYWJpbGl0aWVzID0gWworICB7CisgICAgYnJvd3Nlck5hbWU6ICdjaHJvbWUnLAorICAgIHBsYXRmb3JtOiAnT1MgWCAxMC4xMCcsCisgICAgdmVyc2lvbjogJzM3JworICB9CitdOworCitleHBvcnRzLmNvbmZpZyA9IGNvbmZpZzsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC90ZXN0L3NwZWMvbmctaW5maW5pdGUtc2Nyb2xsLnNwZWMuY29mZmVlIGIvY2F0YWxvZy11aS9hcHAvdGhpcmQtcGFydHkvbmctaW5maW5pdGUtc2Nyb2xsL3Rlc3Qvc3BlYy9uZy1pbmZpbml0ZS1zY3JvbGwuc3BlYy5jb2ZmZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlNmZlYwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYXBwL3RoaXJkLXBhcnR5L25nLWluZmluaXRlLXNjcm9sbC90ZXN0L3NwZWMvbmctaW5maW5pdGUtc2Nyb2xsLnNwZWMuY29mZmVlCkBAIC0wLDAgKzEsMjIxIEBACitmcyA9IHJlcXVpcmUgImZzIgorbWtkaXJwID0gcmVxdWlyZSAibWtkaXJwIgorCitnZXRUZW1wbGF0ZSA9IChhbmd1bGFyVmVyc2lvbiwgY29udGFpbmVyLCBhdHRycywgdGhyb3R0bGUpIC0+CisgICIiIgorICAgIDwhZG9jdHlwZSBodG1sPgorICAgIDxoZWFkPgorICAgICAgPHN0eWxlPgorICAgICAgICBodG1sLCBib2R5IHsKKyAgICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIH0KKyAgICAgIDwvc3R5bGU+CisgICAgICA8c2NyaXB0IHNyYz0naHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2FuZ3VsYXJqcy8je2FuZ3VsYXJWZXJzaW9ufS9hbmd1bGFyLm1pbi5qcyc+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHNyYz0iLi4vLi4vYnVpbGQvbmctaW5maW5pdGUtc2Nyb2xsLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQ+CisgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdhcHAnLCBbJ2luZmluaXRlLXNjcm9sbCddKQorICAgICAgICAgIC5jb25maWcoZnVuY3Rpb24gKCRwcm92aWRlKSB7CisgICAgICAgICAgICAkcHJvdmlkZS52YWx1ZSgnVEhST1RUTEVfTUlMTElTRUNPTkRTJywgI3t0aHJvdHRsZX0pOworICAgICAgICAgIH0pCisgICAgICAgICAgLnJ1bihmdW5jdGlvbiAoJHJvb3RTY29wZSkgeworICAgICAgICAgICAgJHJvb3RTY29wZS5pdGVtcyA9IFtdOworICAgICAgICAgICAgJHJvb3RTY29wZS5sb2FkTW9yZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgW10ucHVzaC5hcHBseSgkcm9vdFNjb3BlLml0ZW1zLCBuZXcgQXJyYXkoMTAwKSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAkcm9vdFNjb3BlLmJ1c3kgPSB0cnVlOworCisgICAgICAgICAgICAkcm9vdFNjb3BlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgJHJvb3RTY29wZS5idXN5ID0gZmFsc2U7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAkcm9vdFNjb3BlLnRyaWdnZXJFdmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgJHJvb3RTY29wZS4kZW1pdCgnYW5FdmVudCcpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICB9KTsKKyAgICAgIDwvc2NyaXB0PgorICAgIDwvaGVhZD4KKyAgICA8Ym9keSBuZy1hcHA9ImFwcCI+CisgICAgICA8YSBpZD0iYWN0aW9uIiBuZy1jbGljaz0iZW5hYmxlKCkiPkVuYWJsZTwvYT4KKyAgICAgIDxhIGlkPSJmb3JjZSIgbmctY2xpY2s9ImxvYWRNb3JlKCkiPkZvcmNlPC9hPgorICAgICAgPGEgaWQ9InRyaWdnZXIiIG5nLWNsaWNrPSJ0cmlnZ2VyRXZlbnQoKSI+VHJpZ2dlcjwvYT4KKyAgICAgICN7Y29udGFpbmVyc1tjb250YWluZXJdLnN0YXJ0fQorICAgICAgICA8ZGl2IGluZmluaXRlLXNjcm9sbD0ibG9hZE1vcmUoKSIgI3tjb250YWluZXJzW2NvbnRhaW5lcl0uYXR0cn0gI3thdHRyc30+CisgICAgICAgICAgPHAgbmctcmVwZWF0PSdpdGVtIGluIGl0ZW1zIHRyYWNrIGJ5ICRpbmRleCc+CisgICAgICAgICAgICB7eyRpbmRleH19CisgICAgICAgICAgPC9wPgorICAgICAgICA8L2Rpdj4KKyAgICAgICN7Y29udGFpbmVyc1tjb250YWluZXJdLmVuZH0KKyAgICA8L2JvZHk+CisgICIiIgorCitjb250YWluZXJzID0KKyAgd2luZG93OgorICAgIHN0YXJ0OiAiIgorICAgIGVuZDogIiIKKyAgICBhdHRyOiAiIgorICBwYXJlbnQ6CisgICAgc3RhcnQ6ICI8ZGl2IGlkPSdwYXJlbnQnIHN0eWxlPSdoZWlnaHQ6IDUwJTsgb3ZlcmZsb3c6IGF1dG87Jz4iCisgICAgZW5kOiAiPC9kaXY+IgorICAgIGF0dHI6ICJpbmZpbml0ZS1zY3JvbGwtcGFyZW50IgorICBhbmNlc3RvcjoKKyAgICBzdGFydDogIjxkaXYgaWQ9J2FuY2VzdG9yJyBzdHlsZT0naGVpZ2h0OiA1MCU7IG92ZXJmbG93OiBhdXRvOyc+PGRpdj4iCisgICAgZW5kOiAiPC9kaXY+PC9kaXY+IgorICAgIGF0dHI6ICJpbmZpbml0ZS1zY3JvbGwtY29udGFpbmVyPSdcIiNhbmNlc3RvclwiJyIKKworZ2V0RWxlbWVudEJ5SWRTY3JpcHQgPSAoaWQpIC0+CisgICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnI3tpZH0nKSIKKworY2FsY3VsYXRlQ2hpbGRyZW5IZWlnaHRTY3JpcHQgPSAoaWQpIC0+CisgICIiIgorICAgIFtdLmNvbmNhdC5hcHBseShbXSwgI3tnZXRFbGVtZW50QnlJZFNjcmlwdChpZCl9LmNoaWxkTm9kZXMpCisgICAgICAubWFwKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0ID8gZWwub2Zmc2V0SGVpZ2h0IDogMDsgfSkKKyAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKGN1ciwgcHJldikgeyByZXR1cm4gcHJldiArIGN1cjsgfSwgMCkKKyAgIiIiCisKK3Njcm9sbFRvQm90dG9tU2NyaXB0ID0gKGNvbnRhaW5lcikgLT4KKyAgaWYgY29udGFpbmVyIGlzICJ3aW5kb3ciCisgICAgIndpbmRvdy5zY3JvbGxUbygwLCBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCkiCisgIGVsc2UKKyAgICAiI3tnZXRFbGVtZW50QnlJZFNjcmlwdChjb250YWluZXIpfS5zY3JvbGxUb3AgPSAje2NhbGN1bGF0ZUNoaWxkcmVuSGVpZ2h0U2NyaXB0KGNvbnRhaW5lcil9IgorCitzY3JvbGxUb0xhc3RTY3JlZW5TY3JpcHQgPSAoY29udGFpbmVyLCBvZmZzZXQpIC0+CisgICMgMiAqIHdpbmRvdy5pbm5lckhlaWdodCBtZWFucyB0aGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiBzaG91bGQgYmUgc29tZXdoZXJlIGNsb3NlIHRvCisgICMgYm9keSBoZWlnaHQgLSB3aW5kb3cgaGVpZ2h0LiBUaGF0IG1lYW5zIHRoYXQgdGhlIHRvcCBvZiB0aGUgd2luZG93IGlzIGJvZHkgaGVpZ2h0IC0gMiAqIHdpbmRvdyBoZWlnaHQuCisgIGlmIGNvbnRhaW5lciBpcyAid2luZG93IgorICAgICJ3aW5kb3cuc2Nyb2xsVG8oMCwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgLSAyICogd2luZG93LmlubmVySGVpZ2h0ICsgI3tvZmZzZXR9KSIKKyAgZWxzZQorICAgICIiIgorICAgICAgI3tnZXRFbGVtZW50QnlJZFNjcmlwdChjb250YWluZXIpfS5zY3JvbGxUb3AgPQorICAgICAgICAje2NhbGN1bGF0ZUNoaWxkcmVuSGVpZ2h0U2NyaXB0KGNvbnRhaW5lcil9IC0gMiAqICN7Z2V0RWxlbWVudEJ5SWRTY3JpcHQoY29udGFpbmVyKX0ub2Zmc2V0SGVpZ2h0ICsgI3tvZmZzZXR9CisgICAgIiIiCisKK2NvbGxhcHNlSXRlbXNTY3JpcHQgPSAoY29udGFpbmVyKSAtPgorICAiIiIKKyAgdmFyIGl0ZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3AnKQorICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKKyAgICBpdGVtc1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnCisgIH0KKyAgIiIiCisKK2dldEl0ZW1zID0gLT4KKyAgZWxlbWVudC5hbGwoQnkucmVwZWF0ZXIgIml0ZW0gaW4gaXRlbXMiKQorCit0bXBEaXIgPSAiLnRtcCIKK3BhdGhUb0RvY3VtZW50ID0gIiN7dG1wRGlyfS9pbmRleC5odG1sIgorCitkZXNjcmliZSAibmctaW5maW5pdGUtc2Nyb2xsIiwgLT4KKyAgZm9yIGFuZ3VsYXJWZXJzaW9uIGluIFsiMS4yLjAiLCAiMS4zLjQiXQorICAgIGRlc2NyaWJlICJ3aXRoIEFuZ3VsYXIgI3thbmd1bGFyVmVyc2lvbn0iLCAtPgorICAgICAgZm9yIGNvbnRhaW5lciBpbiBbIndpbmRvdyIsICJhbmNlc3RvciIsICJwYXJlbnQiXQorICAgICAgICBkZXNjcmliZSAid2l0aCAje2NvbnRhaW5lcn0gYXMgY29udGFpbmVyIiwgLT4KKworICAgICAgICAgIHJlcGxhY2VJbmRleEZpbGUgPSAoYXR0cnMsIHRocm90dGxlKSAtPgorICAgICAgICAgICAgbWtkaXJwIHRtcERpcgorICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoVG9Eb2N1bWVudCwgZ2V0VGVtcGxhdGUoYW5ndWxhclZlcnNpb24sIGNvbnRhaW5lciwgYXR0cnMsIHRocm90dGxlKSkKKworICAgICAgICAgIGRlc2NyaWJlICJ3aXRob3V0IHRocm90dGxpbmciLCAtPgorCisgICAgICAgICAgICB0aHJvdHRsZSA9IG51bGwKKworICAgICAgICAgICAgaXQgInNob3VsZCBiZSB0cmlnZ2VyZWQgaW1tZWRpYXRlbHkgYW5kIHdoZW4gY29udGFpbmVyIGlzIHNjcm9sbGVkIHRvIHRoZSBib3R0b20iLCAtPgorICAgICAgICAgICAgICByZXBsYWNlSW5kZXhGaWxlICIiLCB0aHJvdHRsZQorICAgICAgICAgICAgICBicm93c2VyLmdldCBwYXRoVG9Eb2N1bWVudAorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDEwMAorICAgICAgICAgICAgICBicm93c2VyLmRyaXZlci5leGVjdXRlU2NyaXB0KHNjcm9sbFRvQm90dG9tU2NyaXB0KGNvbnRhaW5lcikpCisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMjAwCisKKyAgICAgICAgICAgIGl0ICJkb2VzIG5vdCB0cmlnZ2VyIGltbWVkaWF0ZWx5IHdoZW4gaW5maW5pdGUtc2Nyb2xsLWltbWVkaWF0ZS1jaGVjayBpcyBmYWxzZSIsIC0+CisgICAgICAgICAgICAgIHJlcGxhY2VJbmRleEZpbGUgImluZmluaXRlLXNjcm9sbC1pbW1lZGlhdGUtY2hlY2s9J2ZhbHNlJyIsIHRocm90dGxlCisgICAgICAgICAgICAgIGJyb3dzZXIuZ2V0IHBhdGhUb0RvY3VtZW50CisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMAorICAgICAgICAgICAgICBlbGVtZW50KEJ5LmlkKCJmb3JjZSIpKS5jbGljaygpCisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMTAwCisgICAgICAgICAgICAgIGJyb3dzZXIuZHJpdmVyLmV4ZWN1dGVTY3JpcHQoc2Nyb2xsVG9Cb3R0b21TY3JpcHQoY29udGFpbmVyKSkKKyAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAyMDAKKworICAgICAgICAgICAgaXQgInJlc3BlY3RzIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUiLCAtPgorICAgICAgICAgICAgICByZXBsYWNlSW5kZXhGaWxlICJpbmZpbml0ZS1zY3JvbGwtZGlzYWJsZWQ9J2J1c3knIiwgdGhyb3R0bGUKKyAgICAgICAgICAgICAgYnJvd3Nlci5nZXQgcGF0aFRvRG9jdW1lbnQKKyAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAwCisgICAgICAgICAgICAgIGVsZW1lbnQoQnkuaWQoImFjdGlvbiIpKS5jbGljaygpCisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMTAwCisKKyAgICAgICAgICAgIGl0ICJyZXNwZWN0cyB0aGUgaW5maW5pdGUtc2Nyb2xsLWRpc3RhbmNlIGF0dHJpYnV0ZSIsIC0+CisgICAgICAgICAgICAgIHJlcGxhY2VJbmRleEZpbGUgImluZmluaXRlLXNjcm9sbC1kaXN0YW5jZT0nMSciLCB0aHJvdHRsZQorICAgICAgICAgICAgICBicm93c2VyLmdldCBwYXRoVG9Eb2N1bWVudAorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDEwMAorICAgICAgICAgICAgICBicm93c2VyLmRyaXZlci5leGVjdXRlU2NyaXB0KHNjcm9sbFRvTGFzdFNjcmVlblNjcmlwdChjb250YWluZXIsIC0yMCkpCisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMTAwCisgICAgICAgICAgICAgIGJyb3dzZXIuZHJpdmVyLmV4ZWN1dGVTY3JpcHQoc2Nyb2xsVG9MYXN0U2NyZWVuU2NyaXB0KGNvbnRhaW5lciwgMjApKQorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDIwMAorCisgICAgICAgICAgICBkZXNjcmliZSAid2l0aCBhbiBldmVudCBoYW5kbGVyIiwgLT4KKworICAgICAgICAgICAgICBpdCAiY2FsbHMgdGhlIGV2ZW50IGhhbmRsZXIgb24gYW4gZXZlbnQiLCAtPgorICAgICAgICAgICAgICAgIHJlcGxhY2VJbmRleEZpbGUgImluZmluaXRlLXNjcm9sbC1saXN0ZW4tZm9yLWV2ZW50PSdhbkV2ZW50JyIsIHRocm90dGxlCisgICAgICAgICAgICAgICAgYnJvd3Nlci5nZXQgcGF0aFRvRG9jdW1lbnQKKyAgICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDEwMAorICAgICAgICAgICAgICAgIGJyb3dzZXIuZHJpdmVyLmV4ZWN1dGVTY3JpcHQoY29sbGFwc2VJdGVtc1NjcmlwdChjb250YWluZXIpKQorICAgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMTAwCisgICAgICAgICAgICAgICAgZWxlbWVudChCeS5pZCgidHJpZ2dlciIpKS5jbGljaygpCisgICAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAyMDAKKworICAgICAgICAgIGRlc2NyaWJlICJ3aXRoIHRocm90dGxpbmciLCAtPgorCisgICAgICAgICAgICB0aHJvdHRsZSA9IGJyb3dzZXIucGFyYW1zLnRlc3RUaHJvdHRsZVZhbHVlCisKKyAgICAgICAgICAgIGl0ICJzaG91bGQgYmUgdHJpZ2dlcmVkIGltbWVkaWF0ZWx5IGFuZCB3aGVuIGNvbnRhaW5lciBpcyBzY3JvbGxlZCB0byB0aGUgYm90dG9tIiwgLT4KKyAgICAgICAgICAgICAgcmVwbGFjZUluZGV4RmlsZSAiIiwgdGhyb3R0bGUKKyAgICAgICAgICAgICAgYnJvd3Nlci5nZXQgcGF0aFRvRG9jdW1lbnQKKyAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAxMDAKKyAgICAgICAgICAgICAgYnJvd3Nlci5kcml2ZXIuZXhlY3V0ZVNjcmlwdChzY3JvbGxUb0JvdHRvbVNjcmlwdChjb250YWluZXIpKQorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDEwMAorICAgICAgICAgICAgICBicm93c2VyLnNsZWVwKHRocm90dGxlKQorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDIwMAorCisgICAgICAgICAgICBpdCAiZG9lcyBub3QgdHJpZ2dlciBpbW1lZGlhdGVseSB3aGVuIGluZmluaXRlLXNjcm9sbC1pbW1lZGlhdGUtY2hlY2sgaXMgZmFsc2UiLCAtPgorICAgICAgICAgICAgICByZXBsYWNlSW5kZXhGaWxlICJpbmZpbml0ZS1zY3JvbGwtaW1tZWRpYXRlLWNoZWNrPSdmYWxzZSciLCB0aHJvdHRsZQorICAgICAgICAgICAgICBicm93c2VyLmdldCBwYXRoVG9Eb2N1bWVudAorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDAKKyAgICAgICAgICAgICAgZWxlbWVudChCeS5pZCgiZm9yY2UiKSkuY2xpY2soKQorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDEwMAorCisgICAgICAgICAgICBpdCAicmVzcGVjdHMgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgaXMgdGhyb3R0bGVkIHdoZW4gcGFnZSBsb2FkcyIsIC0+CisgICAgICAgICAgICAgIHJlcGxhY2VJbmRleEZpbGUgImluZmluaXRlLXNjcm9sbC1kaXNhYmxlZD0nYnVzeSciLCB0aHJvdHRsZQorICAgICAgICAgICAgICBicm93c2VyLmdldCBwYXRoVG9Eb2N1bWVudAorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDAKKyAgICAgICAgICAgICAgZWxlbWVudChCeS5pZCgiYWN0aW9uIikpLmNsaWNrKCkKKyAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAwCisgICAgICAgICAgICAgIGJyb3dzZXIuc2xlZXAodGhyb3R0bGUpCisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMTAwCisKKyAgICAgICAgICAgIGl0ICJpcyBub3QgdGhyb3R0bGVkIHdoZW4gcmUtZW5hYmxlZCBpZiB0aGUgdGhyb3R0bGUgdGltZSBoYXMgYWxyZWFkeSBlbGFwc2VkIiwgLT4KKyAgICAgICAgICAgICAgcmVwbGFjZUluZGV4RmlsZSAiaW5maW5pdGUtc2Nyb2xsLWRpc2FibGVkPSdidXN5JyIsIHRocm90dGxlCisgICAgICAgICAgICAgIGJyb3dzZXIuZ2V0IHBhdGhUb0RvY3VtZW50CisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMAorICAgICAgICAgICAgICBicm93c2VyLnNsZWVwKHRocm90dGxlKQorICAgICAgICAgICAgICBlbGVtZW50KEJ5LmlkKCJhY3Rpb24iKSkuY2xpY2soKQorICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDEwMAorCisgICAgICAgICAgICBpdCAicmVzcGVjdHMgdGhlIGluZmluaXRlLXNjcm9sbC1kaXN0YW5jZSBhdHRyaWJ1dGUiLCAtPgorICAgICAgICAgICAgICByZXBsYWNlSW5kZXhGaWxlICJpbmZpbml0ZS1zY3JvbGwtZGlzdGFuY2U9JzEnIiwgdGhyb3R0bGUKKyAgICAgICAgICAgICAgYnJvd3Nlci5nZXQgcGF0aFRvRG9jdW1lbnQKKyAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAxMDAKKyAgICAgICAgICAgICAgYnJvd3Nlci5kcml2ZXIuZXhlY3V0ZVNjcmlwdChzY3JvbGxUb0xhc3RTY3JlZW5TY3JpcHQoY29udGFpbmVyLCAyMCkpCisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMTAwCisgICAgICAgICAgICAgIGJyb3dzZXIuc2xlZXAodGhyb3R0bGUpCisgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMjAwCisKKyAgICAgICAgICAgIGRlc2NyaWJlICJ3aXRoIGFuIGV2ZW50IGhhbmRsZXIiLCAtPgorCisgICAgICAgICAgICAgIGl0ICJjYWxscyB0aGUgZXZlbnQgaGFuZGxlciBvbiBhbiBldmVudCIsIC0+CisgICAgICAgICAgICAgICAgcmVwbGFjZUluZGV4RmlsZSAiaW5maW5pdGUtc2Nyb2xsLWxpc3Rlbi1mb3ItZXZlbnQ9J2FuRXZlbnQnIiwgdGhyb3R0bGUKKyAgICAgICAgICAgICAgICBicm93c2VyLmdldCBwYXRoVG9Eb2N1bWVudAorICAgICAgICAgICAgICAgIGV4cGVjdChnZXRJdGVtcygpLmNvdW50KCkpLnRvQmUgMTAwCisgICAgICAgICAgICAgICAgYnJvd3Nlci5kcml2ZXIuZXhlY3V0ZVNjcmlwdChjb2xsYXBzZUl0ZW1zU2NyaXB0KGNvbnRhaW5lcikpCisgICAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAxMDAKKyAgICAgICAgICAgICAgICBlbGVtZW50KEJ5LmlkKCJ0cmlnZ2VyIikpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBleHBlY3QoZ2V0SXRlbXMoKS5jb3VudCgpKS50b0JlIDEwMAorICAgICAgICAgICAgICAgIGJyb3dzZXIuc2xlZXAodGhyb3R0bGUpCisgICAgICAgICAgICAgICAgZXhwZWN0KGdldEl0ZW1zKCkuY291bnQoKSkudG9CZSAyMDAKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvYm93ZXIgZGVwZW5kZWNpZXMgYi9jYXRhbG9nLXVpL2Jvd2VyIGRlcGVuZGVjaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjFiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2Jvd2VyIGRlcGVuZGVjaWVzCkBAIC0wLDAgKzEsMjkgQEAKK3sKKyAgIm5hbWUiOiAiY2F0YWxvZy11aSIsCisgICJwcml2YXRlIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiYW5ndWxhciI6ICJ+MS4zLngiLAorICAgICJhbmd1bGFyLWJhc2U2NCI6ICJ+Mi4wLjUiLCAvL2ZvciB0cmFuc2xhdGUgYmFzZSA2NAorICAgICJhbmd1bGFyLWJhc2U2NC11cGxvYWQiOiAifjAuMS44IiwgLy91cGxvYWQgZmlsZSBiYXNlIDY0CisgICAgImFuZ3VsYXItYm9vdHN0cmFwIjogIn4wLjEzLjAiLAorICAgICJhbmd1bGFyLWRyYWdkcm9wIjogIn4xLjAuMTEiLCAvL2ZvciBkcmFnICYgZHJvcCBlbGVtZW50cyBpbiBjYW52YXMKKyAgICAiYW5ndWxhci1maWx0ZXIiOiAifjAuNS42IiwgLy8gZm9yIGZpbHRlciBjYXRlZ29yaWVzCisgICAgImFuZ3VsYXItbWQ1IjogIn4wLjEuNyIsIC8vdHJhbnNsYXRlIGZyb20gJiB0byBtZDUKKyAgICAiYW5ndWxhci1wZXJmZWN0LXNjcm9sbGJhciI6ICJ+MC4wLjQiLCAvLyBmaXIgZGVzaWduIGNyb3NzIGJyb3dzZXIgc2Nyb2xsYmFyCisgICAgImFuZ3VsYXItcXRpcDItZGlyZWN0aXZlIjogIn4wLjEuMiIsIC8vIGZvciBkZXNpZ24gdG9vbHRpcHMKKyAgICAiYW5ndWxhci1yZXNvdXJjZSI6ICJ+MS4zLjE1IiwgLy8gZm9yIHJlc3RmdWxseSBBcGkKKyAgICAiYW5ndWxhci1zYW5pdGl6ZSI6ICJ+MS40LjQiLCAvL2h0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZ1Nhbml0aXplL3NlcnZpY2UvJHNhbml0aXplCisgICAgImFuZ3VsYXItdWktcm91dGVyIjogIn4wLjIuMTQiLAorICAgICJhbmd1bGFyLXV1aWQ0IjogIn4wLjMuMCIsCisgICAgImJvb3RzdHJhcCI6ICIzLjMuNCIsIC8vIGRlcGVuZGVuY3kgZm9yIGFuZ3VsYXIgYm9vdHN0cmFwCisgICAgImNoZWNrbGlzdC1tb2RlbCI6ICJ+MC4yLjQiLCAvLyBmb3IgY2F0ZWdvcmllcyBjaGVjayBsaXN0IG1vZGVsCisgICAgImpxdWVyeSI6ICJ+MS4xMS4xIiwKKyAgICAibG9kYXNoIjogIn4zLjcuMCIsIC8vIGpzIHV0aWxzIGZ1bmN0aW9ucworICAgICJhbmd1bGFyLXRyYW5zbGF0ZSI6ICJ+Mi44LjAiLCAvLyBkZXBlbmRlbmNpZXMgZm9yICBsYW5ndWFnZSAgc3VwcG9ydAorICAgICJhbmd1bGFyLXRyYW5zbGF0ZS1sb2FkZXItc3RhdGljLWZpbGVzIjogIn4yLjguMCIgLy8gZm9yIGxhbmd1YWdlICBzdXBwb3J0CisgIH0sCisgICJyZXNvbHV0aW9ucyI6IHsKKyAgICAiYW5ndWxhciI6ICJ+MS4zLngiLAorICAgICJqcXVlcnkiOiAifjIuMC4zIgorICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2Jvd2VyLmpzb24gYi9jYXRhbG9nLXVpL2Jvd2VyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0MWYxNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvYm93ZXIuanNvbgpAQCAtMCwwICsxLDQyIEBACit7CisgICJuYW1lIjogImNhdGFsb2ctdWkiLAorICAicHJpdmF0ZSI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImFuZ3VsYXIiOiAiMS41LjAiLAorICAgICJhbmd1bGFyLWJhc2U2NCI6ICIyLjAuNSIsCisgICAgImFuZ3VsYXItYmFzZTY0LXVwbG9hZCI6ICIwLjEuMTkiLAorICAgICJhbmd1bGFyLWJvb3RzdHJhcCI6ICIwLjE0LjMiLAorICAgICJhbmd1bGFyLWRyYWdkcm9wIjogImh0dHBzOi8vZ2l0aHViLmNvbS9kaW1raW52L2FuZ3VsYXItZHJhZ2Ryb3AuZ2l0IzEuMC4xNCIsCisgICAgImFuZ3VsYXItZmlsdGVyIjogIjAuNS4xNCIsCisgICAgImFuZ3VsYXItbW9ja3MiOiAiMS41LjAiLAorICAgICJhbmd1bGFyLXBlcmZlY3Qtc2Nyb2xsYmFyIjogIjAuMC40IiwKKyAgICAiYW5ndWxhci1yZXNvdXJjZSI6ICIxLjUuMTEiLAorICAgICJhbmd1bGFyLXNhbml0aXplIjogIjEuNC40IiwKKyAgICAiYW5ndWxhci10b29sdGlwcyI6ICIwLjEuMjMiLAorICAgICJhbmd1bGFyLXRyYW5zbGF0ZSI6ICIyLjguMCIsCisgICAgImFuZ3VsYXItdHJhbnNsYXRlLWxvYWRlci1zdGF0aWMtZmlsZXMiOiAiMi44LjAiLAorICAgICJhbmd1bGFyLXVpLXJvdXRlciI6ICIwLjIuMTQiLAorICAgICJhbmd1bGFyLXV1aWQ0IjogIjAuMy4wIiwKKyAgICAiYm9vdHN0cmFwIjogIjMuMy40IiwKKyAgICAiY2hlY2tsaXN0LW1vZGVsIjogIjAuMi40IiwKKyAgICAianF1ZXJ5IjogIjIuMi40IiwKKyAgICAianNwZGYiOiAiMS4wLjI3MiIsCisgICAgImFuaW1hdGUuY3NzIjogIn4zLjUuMSIsCisgICAgImFuZ3VsYXItY2xpcGJvYXJkIjogIjEuNS4wIiwKKyAgICAidWktYm9vdHN0cmFwIjogIjEuMy4zIiwKKyAgICAiYW5ndWxhci1yZXNpemFibGUiOiAiMS4yLjAiLAorICAgICJhbmd1bGFyLXVpLW5vdGlmaWNhdGlvbiI6ICIwLjIuMCIsCisgICAgImpzLW1kNSI6ICJtZDUjMC40LjEiLAorICAgICJjeXRvc2NhcGUiOiAiXjIuNy4xMCIsCisgICAgImxvZGFzaCI6ICJeNC4xNy4yIiwKKyAgICAicmVzdGFuZ3VsYXIiOiAiXjEuNS4yIiwKKyAgICAiY3l0b3NjYXBlLWV4cGFuZC1jb2xsYXBzZSI6ICJodHRwczovL2dpdGh1Yi5jb20vYmFyZGl0L2N5dG9zY2FwZS5qcy1leHBhbmQtY29sbGFwc2UuZ2l0IiwKKyAgICAiY3l0b3NjYXBlLXF0aXAiOiAiaHR0cHM6Ly9naXRodWIuY29tL2JhcmRpdC9jeXRvc2NhcGUuanMtcXRpcC5naXQiLAorICAgICJxdGlwMiI6ICJeMi4yLjEiCisgIH0sCisgICJyZXNvbHV0aW9ucyI6IHsKKyAgICAiYW5ndWxhciI6ICIxLjUuMCIsCisgICAgImpxdWVyeSI6ICIyLjIuNCIsCisgICAgImFuZ3VsYXItdHJhbnNsYXRlIjogIjIuOC4xIgorICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2J1aWxkX2NhdGFsb2dfdWkuYmF0IGIvY2F0YWxvZy11aS9idWlsZF9jYXRhbG9nX3VpLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTE1M2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9idWlsZF9jYXRhbG9nX3VpLmJhdApAQCAtMCwwICsxLDI5IEBACisKK3JlbSBudm13IHVzZSB2MC4xMi40CisKK2VjaG8gIm5wbSBpbnN0YWxsIgorY2FsbCBucG0gaW5zdGFsbAorCitpZiAlZXJyb3JsZXZlbCUgTkVRIDAgR09UTyBCQURfRVhJVAorCitlY2hvICJib3dlciBpbnN0YWxsIgorY2FsbCBib3dlciBpbnN0YWxsCitpZiAlZXJyb3JsZXZlbCUgTkVRIDAgR09UTyBCQURfRVhJVAorCisKK2VjaG8gImJ1aWxkIC0tdiIKK2dydW50IGJ1aWxkIC0tdgorCitpZiAlZXJyb3JsZXZlbCUgTkVRIDAgR09UTyBCQURfRVhJVAorCitHT1RPIFNNT09USAorCisKKzpCQURfRVhJVAorZWNobyBCT08KK2V4aXQvIGIgMQorCisKKzpTTU9PVEgKK2VjaG8gIk9LLiIKK2V4aXQgL2IgMApkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9idWlsZF9jYXRhbG9nX3VpLnNoIGIvY2F0YWxvZy11aS9idWlsZF9jYXRhbG9nX3VpLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWU3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2J1aWxkX2NhdGFsb2dfdWkuc2gKQEAgLTAsMCArMSw4NCBAQAorCisjIS9iaW4vc2gKKworIyMjIFNldCB0aGUgbm9kZSBlbnZpcm9ubWVudC4KKyNOT0RFX1ZFUlNJT049InY2LjIuMiIKKworI2VjaG8gIlNldCB0aGUgbm9kZSBlbnZpcm9ubWVudC4iCisjLiAiJE5WTV9ESVIvbnZtLnNoIgorI2VjaG8gIk9LLiIKKyNlY2hvICIiCisKKworCisjIyMgQWRkIG5ld2VyIGMrKyBjb21waWxlci4KKyNpZiBbIC1mIC9vcHQvcmgvZGV2dG9vbHNldC00L2VuYWJsZSBdOyB0aGVuCisjICAuIC9vcHQvcmgvZGV2dG9vbHNldC00L2VuYWJsZQorI2ZpCisKKworCisKKyMjIyBTZXQgdGhlIG5vZGUgdmVyc2lvbiBtYW5hZ2VyIHZlcnNpb24uCisjZWNobyAiU2V0IHRoZSBub2RlIHZlcnNpb24gbWFuYWdlciB2ZXJzaW9uLiIKKyNudm0gdXNlICR7Tk9ERV9WRVJTSU9OfQorI2VjaG8gIk9LLiIKKyNlY2hvICIiCisKKworIyMjIFJ1biBpbnN0YWxsIGJvd2VyLgorZWNobyAiUnVuIGluc3RhbGwgYm93ZXIuIgorI2lmIFsgLWUgJE5WTV9ESVIvdmVyc2lvbnMvbm9kZS8ke05PREVfVkVSU0lPTn0vbGliL25vZGVfbW9kdWxlcy9ib3dlci9iaW4vYm93ZXIgXTsgdGhlbgorIwllY2hvICIgLSBib3dlciBpcyBhbHJlYWR5IGluc3RhbGxlZC4iCisjZWxzZQorbnBtIGluc3RhbGwgYm93ZXIKKyNmaQorI2VjaG8gIk9LLiIKKyNlY2hvICIiCisKKworCisjIyMgUnVuIGluc3RhbGwgZ3J1bnQtY2xpLgorZWNobyAiUnVuIGluc3RhbGwgZ3J1bnQtY2xpLiIKKyNpZiBbIC1lICROVk1fRElSL3ZlcnNpb25zL25vZGUvJHtOT0RFX1ZFUlNJT059L2xpYi9ub2RlX21vZHVsZXMvZ3J1bnQtY2xpL2Jpbi9ncnVudCBdOyB0aGVuCisjCWVjaG8gIiAtIGdydW50LWNsaSBpcyBhbHJlYWR5IGluc3RhbGxlZC4iCisjZWxzZQorbnBtIGluc3RhbGwgZ3J1bnQtY2xpCisjZmkKKyNlY2hvICJPSy4iCisjZWNobyAiIgorCisKKworIyMjIENsZWFuIHRoZSBOb2RlIGNhY2hlLgorI2VjaG8gIkNsZWFuIHRoZSBOb2RlIGNhY2hlIC0gaWYgc3R1Y2suIgorI25wbSBjYWNoZSBjbGVhbgorI2VjaG8gIk9LLiIKKyNlY2hvICIiCisKKworCisjIyMgUnVuIHRoZSBOb2RlIHBhY2thZ2UgbWFuYWdlciAoTlBNKS4KK2VjaG8gIlJ1biB0aGUgTm9kZSBwYWNrYWdlIG1hbmFnZXIgKE5QTSkuIgorI25wbSBjb25maWcgc2V0IHByb3h5IGh0dHA6Ly9vbmUucHJveHkuYXR0LmNvbTo4MDgwCisjbnBtIGNvbmZpZyBzZXQgaHR0cHMtcHJveHkgaHR0cDovL29uZS5wcm94eS5hdHQuY29tOjgwODAKKyNucG0gY29uZmlnIHNldCByZWdpc3RyeSBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZworCitucG0gaW5zdGFsbAorZWNobyAiT0suIgorZWNobyAiIgorCisKKworIyMjIEluc3RhbGwgdGhlIEJvd2VyIGNvbXBvbmVudHMuCitlY2hvICJJbnN0YWxsIHRoZSBCb3dlciBjb21wb25lbnRzLiIKK2Jvd2VyIGluc3RhbGwKK2VjaG8gIk9LLiIKK2VjaG8gIiIKKworCisKKyMjIyBCdWlsZCB0aGUgYXBwbGljYXRpb24uCitlY2hvICJCdWlsZCB0aGUgYXBwbGljYXRpb24uIgorZ3J1bnQgYnVpbGQKKwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9jb25maWd1cmF0aW9ucy9NZW51UmVhZE1lLnR4dCBiL2NhdGFsb2ctdWkvY29uZmlndXJhdGlvbnMvTWVudVJlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwNDI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvY29uZmlndXJhdGlvbnMvTWVudVJlYWRNZS50eHQKQEAgLTAsMCArMSw2MCBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKiAgICAgICAgICAgICBFeHBsYW5hdGlvbiBhYm91dCBtZW51Lmpzb24gICAgICAgICAgICAgKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitUaGUgbWVudS5qc29uIGRlZmluZXMgdGhlIG1lbnUgdG8gc2hvdyBmb3IgZWFjaCB0eXBlIG9mICJyb2xlcyI6CisKK1N1cHBvcnRlZCByb2xlczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBRE1JTgorREVTSUdORVIKK1BST0RVQ1RfU1RSQVRFR0lTVAorUFJPRFVDVF9NQU5BR0VSCitURVNURVIKK09QUworR09WRVJOT1IKKworVGhlIEpTT04gaXMgc2VwYXJhdGVkIHRvIHJvbGVzLCBhbmQgZm9yIGVhY2ggcm9sZSB3ZSBkZWZpbmUgInN0YXRlcyIsCit3aGF0IG1lbnUgdG8gc2hvdyB0aGUgdXNlciBmb3IgZWFjaCBzdGF0ZSBvZiB0aGUgY29tcG9uZW50OgorCitTdXBwb3J0ZWQgc3RhdGVzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05PVF9DRVJUSUZJRURfQ0hFQ0tPVVQKK05PVF9DRVJUSUZJRURfQ0hFQ0tJTgorUkVBRFlfRk9SX0NFUlRJRklDQVRJT04KK0NFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MKK0NFUlRJRklFRAorCitGb3IgZWFjaCBzdGF0ZSB3ZSBjYW4gZGVmaW5lIHRoZSB1c2VyIHRoYXQgd2lsbCBzZWUgdGhpcyBtZW51LCB0aGUgYXZhaWxhYmxlIHBhcmFtZXRlcnMgYXJlOgorCitTdXBwb3J0ZWQgdXNlcnM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQU5ZCitOT1RfT1dORVIKKworRXhhbXBsZToKK0ZvciBkZXNpZ25lciwgaWYgdGhlIGNvbXBvbmVudCBzdGF0ZSBpcyBjaGVja291dCBhbmQgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBieSBvdGhlciB1c2VyLCB0aGUgTk9UX09XTkVSIHdpbGwgYmUgdXNlZC4KKworIkRFU0lHTkVSIjp7CisgICAgICAgICAgICAic3RhdGVzIjp7CisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiRWRpdCIgICAgLCJhY3Rpb24iOiJnb1RvRW50aXR5In0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJDaGVjayBpbiIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImxpZmVjeWNsZVN0YXRlL0NIRUNLSU4iLCAiY29uZmlybWF0aW9uTW9kYWwiOiAibGlmZWN5Y2xlU3RhdGUvQ0hFQ0tJTiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiU3VibWl0IGZvciBUZXN0aW5nIiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoibGlmZWN5Y2xlU3RhdGUvY2VydGlmaWNhdGlvblJlcXVlc3QiLCAiZW1haWxNb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DRVJUSUZJQ0FUSU9OUkVRVUVTVCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAiTk9UX09XTkVSIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorCisKK0RlZmluaXRpb24gb2YgdGhlIG1lbnUgaXRlbToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZXh0ICAgICAgICAgICAgICAgIC0gVGhlIHRleHQgdG8gc2hvdworYWN0aW9uICAgICAgICAgICAgICAtIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBwcmVzc2luZyBvbiB0aGUgbWVudSBpdGVtCit1cmwgICAgICAgICAgICAgICAgIC0gRGF0YSBhZGRlZCB0byBtZW51IGl0ZW0sIGluIGNhc2UgdGhlIGZ1bmN0aW9uIG5lZWQgdG8gdXNlIGl0LCBleGFtcGxlOiBmb3IgZnVuY3Rpb24gImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgSSBuZWVkIHRvIHBhc3MgYWxzbyB0aGUgdXJsICJsaWZlY3ljbGVTdGF0ZS9DSEVDS09VVCIgdGhhdCBJIHdhbnQgdGhlIHN0YXRlIHRvIGNoYW5nZSB0by4KK2NvbmZpcm1hdGlvbk1vZGFsICAgLSBPcGVuIGNvbmZpcm1hdGlvbiBtb2RhbCAodXNlciBzaG91bGQgc2VsZWN0ICJPSyIgb3IgIkNhbmNlbCIpLCBhbmQgY29udGludWUgd2l0aCB0aGUgYWN0aW9uLgorZW1haWxNb2RhbCAgICAgICAgICAtIE9wZW4gZW1haWwgbW9kYWwgKHVzZXIgc2hvdWxkIGZpbGwgZW1haWwgZGV0YWlscyksIGFuZCBjb250aW51ZSB3aXRoIHRoZSBhY3Rpb24uCitibG9ja2VkRm9yVHlwZXMgICAgIC0gVGhpcyBpdGVtIHdpbGwgbm90IGJlIHNob3duIGZvciBzcGVjaWZpYyBjb21wb25lbnRzIHR5cGVzLgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9jb25maWd1cmF0aW9ucy9kZXYuanNvbiBiL2NhdGFsb2ctdWkvY29uZmlndXJhdGlvbnMvZGV2Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjMDlkMwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvY29uZmlndXJhdGlvbnMvZGV2Lmpzb24KQEAgLTAsMCArMSw0MzAgQEAKK3sKKyAgICAgICAgImVudmlyb25tZW50IjogImRldiIsCisgICAgICAgICJhcGkiOiB7CisgICAgICAgICAgICAiR0VUX2NvbXBvbmVudCI6ICIvdjEvY2F0YWxvZy86dHlwZS86aWQiLAorICAgICAgICAgICAgIlBVVF9jb21wb25lbnQiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmlkL21ldGFkYXRhIiwKKyAgICAgICAgICAgICJHRVRfY29tcG9uZW50X3ZhbGlkYXRlX25hbWUiOiAiL3YxL2NhdGFsb2cvOnR5cGUvdmFsaWRhdGUtbmFtZS86bmFtZSIsCisgICAgICAgICAgICAiUE9TVF9jaGFuZ2VMaWZlY3ljbGVTdGF0ZSI6ICIvdjEvY2F0YWxvZy8iLAorICAgICAgICAgICAgImNvbXBvbmVudF9hcGlfcm9vdCI6ICIvdjEvY2F0YWxvZy8iLAorICAgICAgICAgICAgIndlbGNvbWVfcGFnZV92aWRlb191cmwiOiAiaHR0cDovLzAuMC4wLjA6ODI4Mi9tb3RpL21vdmllIiwKKworICAgICAgICAgICAgIkdFVF91c2VyIjogIi92MS91c2VyLzppZCIsCisgICAgICAgICAgICAiR0VUX3VzZXJfYXV0aG9yaXplIjogIi92MS91c2VyL2F1dGhvcml6ZSIsCisgICAgICAgICAgICAiR0VUX2FsbF91c2VycyI6ICIvdjEvdXNlci91c2VycyIsCisgICAgICAgICAgICAiUE9TVF9jcmVhdGVfdXNlciI6ICIvdjEvdXNlciIsCisgICAgICAgICAgICAiREVMRVRFX2RlbGV0ZV91c2VyIjogIi92MS91c2VyLzppZCIsCisgICAgICAgICAgICAiUE9TVF9lZGl0X3VzZXJfcm9sZSI6ICIvdjEvdXNlci86aWQvcm9sZSIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlIjogIi92MS9jYXRhbG9nL3Jlc291cmNlcy86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZXNfbGF0ZXN0dmVyc2lvbl9ub3RhYnN0cmFjdCI6Ii92MS9jYXRhbG9nLzp0eXBlL2xhdGVzdHZlcnNpb24vbm90YWJzdHJhY3QvOmlkIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VzX2NlcnRpZmllZF9ub3RfYWJzdHJhY3QiOiAiL3YxL2NhdGFsb2cvcmVzb3VyY2VzL2NlcnRpZmllZC9ub3RhYnN0cmFjdC86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZXNfY2VydGlmaWVkX2Fic3RyYWN0IjogIi92MS9jYXRhbG9nL3Jlc291cmNlcy9jZXJ0aWZpZWQvYWJzdHJhY3QvOmlkIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfcHJvcGVydHkiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL3Byb3BlcnRpZXMvOmlkIiwKKyAgICAgICAgICAgICJQVVRfcmVzb3VyY2UiOiAiL3YxL2NhdGFsb2cvcmVzb3VyY2VzLzppZC9tZXRhZGF0YSIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlX2FydGlmYWN0IjogIi92MS9jYXRhbG9nLzp0eXBlLzplbnRpdHlJZC9hcnRpZmFjdHMvOmlkIiwKKyAgICAgICAgICAgICJHRVRfZG93bmxvYWRfaW5zdGFuY2VfYXJ0aWZhY3QiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL3Jlc291cmNlSW5zdGFuY2VzLzppbnN0YW5jZUlkL2FydGlmYWN0cy86aWQiLAorICAgICAgICAgICAgIlBPU1RfaW5zdGFuY2VfYXJ0aWZhY3QiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL3Jlc291cmNlSW5zdGFuY2UvOmluc3RhbmNlSWQvYXJ0aWZhY3RzLzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlX2FkZGl0aW9uYWxfaW5mb3JtYXRpb24iOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL2FkZGl0aW9uYWxpbmZvLzppZCIsCisgICAgICAgICAgICAiR0VUX3NlcnZpY2VfYXJ0aWZhY3QiOiAiL3YxL2NhdGFsb2cvc2VydmljZXMvOnNlcnZpY2VJZC9hcnRpZmFjdHMvOmlkIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfaW50ZXJmYWNlX2FydGlmYWN0IjogIi92MS9jYXRhbG9nLzp0eXBlLzplbnRpdHlJZC9zdGFuZGFyZC86b3BlcmF0aW9uL2FydGlmYWN0cy86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9hcGlfYXJ0aWZhY3QiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL2FydGlmYWN0cy9hcGkvOmlkIiwKKyAgICAgICAgICAgICJHRVRfY29uZmlndXJhdGlvbl91aSI6ICIvdjEvY29uZmlndXJhdGlvbi91aSIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlX3ZhbGlkYXRlX25hbWUiOiAiL3YxL2NhdGFsb2cvcmVzb3VyY2VzL3ZhbGlkYXRlLW5hbWUvOm5hbWUiLAorICAgICAgICAgICAgIkdFVF9hY3Rpdml0eV9sb2ciOiAiL3YxL2NhdGFsb2cvYXVkaXQtcmVjb3Jkcy86dHlwZS86aWQiLAorICAgICAgICAgICAgIkdFVF9zZXJ2aWNlIjogIi92MS9jYXRhbG9nL3NlcnZpY2VzLzppZCIsCisgICAgICAgICAgICAiR0VUX3NlcnZpY2VfdmFsaWRhdGVfbmFtZSI6ICIvdjEvY2F0YWxvZy9zZXJ2aWNlcy92YWxpZGF0ZS1uYW1lLzpuYW1lIiwKKyAgICAgICAgICAgICJHRVRfc2VydmljZV9kaXN0cmlidXRpb25zIjoiL3YxL2NhdGFsb2cvc2VydmljZXMvOnV1aWQvZGlzdHJpYnV0aW9uIiwKKyAgICAgICAgICAgICJHRVRfc2VydmljZV9kaXN0cmlidXRpb25zX2NvbXBvbmVudHMiOiIvdjEvY2F0YWxvZy9zZXJ2aWNlcy9kaXN0cmlidXRpb24vOmRpc3RyaWJ1dGlvbklkIiwKKyAgICAgICAgICAgICJQT1NUX3NlcnZpY2VfZGlzdHJpYnV0aW9uX2RlcGxveSIgOiAiL3YxL2NhdGFsb2cvc2VydmljZXMvOnNlcnZpY2VJZC9kaXN0cmlidXRpb24vOmRpc3RyaWJ1dGlvbklkL21hcmtEZXBsb3llZCIsCisgICAgICAgICAgICAiR0VUX2VsZW1lbnQiOiAiL3YxL2ZvbGxvd2VkIiwKKyAgICAgICAgICAgICJHRVRfY2F0YWxvZyI6ICIvdjEvc2NyZWVuIiwKKyAgICAgICAgICAgICJHRVRfZWNvbXBfbWVudV9pdGVtcyI6ICIvdjEvdXNlci86dXNlcklkL2Z1bmN0aW9uYWxtZW51IiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfY2F0ZWdvcnkiOiAiL3YxL3Jlc291cmNlQ2F0ZWdvcmllcyIsCisgICAgICAgICAgICAiR0VUX3NlcnZpY2VfY2F0ZWdvcnkiOiAiL3YxL3NlcnZpY2VDYXRlZ29yaWVzIiwKKyAgICAgICAgICAgICJyZXNvdXJjZV9pbnN0YW5jZSI6ICIvdjEvY2F0YWxvZy86ZW50aXR5VHlwZS86ZW50aXR5SWQvcmVzb3VyY2VJbnN0YW5jZS86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9pbnN0YW5jZV9wcm9wZXJ0eSI6ICIvdjEvY2F0YWxvZy86dHlwZS86ZW50aXR5SWQvcmVzb3VyY2VJbnN0YW5jZS86Y29tcG9uZW50SW5zdGFuY2VJZC9wcm9wZXJ0eS86cHJvcGVydHlWYWx1ZUlkIiwKKyAgICAgICAgICAgICJHRVRfcmVsYXRpb25zaGlwIjogIi92MS9jYXRhbG9nLzplbnRpdHlUeXBlLzplbnRpdHlJZC9yZXNvdXJjZUluc3RhbmNlLzphY3Rpb24iLAorICAgICAgICAgICAgIkdFVF9saWZlY3ljbGVfc3RhdGVfcmVzb3VyY2UiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmlkL2xpZmVjeWNsZVN0YXRlLzphY3Rpb24iLAorICAgICAgICAgICAgIkdFVF9saWZlY3ljbGVfc3RhdGVfQ0hFQ0tJTiI6ImxpZmVjeWNsZVN0YXRlL0NIRUNLSU4iLAorICAgICAgICAgICAgIkdFVF9saWZlY3ljbGVfc3RhdGVfQ0VSVElGSUNBVElPTlJFUVVFU1QiOiJsaWZlY3ljbGVTdGF0ZS9DRVJUSUZJQ0FUSU9OUkVRVUVTVCIsCisgICAgICAgICAgICAiR0VUX2xpZmVjeWNsZV9zdGF0ZV9VTkRPQ0hFQ0tPVVQiOiJsaWZlY3ljbGVTdGF0ZS9VTkRPQ0hFQ0tPVVQiLAorICAgICAgICAgICAgInJvb3QiOiAiaHR0cDovL2ZlSG9zdDo4MTgxL3NkYzEvZmVQcm94eS9yZXN0IiwKKyAgICAgICAgICAgICJQVVRfc2VydmljZSI6ICIvdjEvY2F0YWxvZy9zZXJ2aWNlcy86aWQvbWV0YWRhdGEiLAorICAgICAgICAgICAgIkdFVF9kb3dubG9hZF9hcnRpZmFjdCI6ICIvdjEvY2F0YWxvZy8iLAorICAgICAgICAgICAgIkdFVF9TRENfVmVyc2lvbiI6ICIvdmVyc2lvbiIsCisgICAgICAgICAgICAiR0VUX2NhdGVnb3JpZXMiOiAiL3YxL2NhdGVnb3JpZXMvOnR5cGVzIiwKKyAgICAgICAgICAgICJQT1NUX2NhdGVnb3J5IjogIi92MS9jYXRlZ29yeS86dHlwZXMvOmNhdGVnb3J5SWQiLAorICAgICAgICAgICAgIlBPU1Rfc3ViY2F0ZWdvcnkiOiAiL3YxL2NhdGVnb3J5Lzp0eXBlcy86Y2F0ZWdvcnlJZC9zdWJDYXRlZ29yeS86c3ViQ2F0ZWdvcnlJZCIsCisgICAgICAgICAgICAiUE9TVF9jaGFuZ2VfaW5zdGFuY2VfdmVyc2lvbiI6ICIvdjEvY2F0YWxvZy86ZW50aXR5VHlwZS86ZW50aXR5SWQvcmVzb3VyY2VJbnN0YW5jZS86aWQvY2hhbmdlVmVyc2lvbiIsCisgICAgICAgICAgICAiR0VUX3JlcXVpcmVtZW50c19jYXBhYmlsaXRpZXMiOiAiL3YxL2NhdGFsb2cvcmVxdWlybWVudHNDYXBhYmlsaXRpZXMvOnR5cGUvOmlkIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfYXJ0aWZhY3RfdHlwZXMiOiAiL3YxL2FydGlmYWN0VHlwZXMiLAorICAgICAgICAgICAgIkdFVF9wcm9kdWN0X2NhdGFsb2ciOiAiL3YxL3Byb2R1Y3RTY3JlZW4iLAorICAgICAgICAgICAgIkdFVF9wcm9kdWN0X2NhdGVnb3J5IjogIi92MS9wcm9kdWN0Q2F0ZWdvcmllcyIsCisgICAgICAgICAgICAiR0VUX3Byb2R1Y3RfY2F0ZWdvcnlfdGVtcCI6ICIvdjEvYXJ0aWZhY3RUeXBlcyIsCisgICAgICAgICAgICAiUE9TVF9wcm9kdWN0IjogIi92MS9jYXRhbG9nL3Byb2R1Y3RzLzppZC9tZXRhZGF0YSIsCisgICAgICAgICAgICAiR0VUX3Byb2R1Y3RfdmFsaWRhdGVfbmFtZSI6ICIvdjEvY2F0YWxvZy9zZXJ2aWNlcy92YWxpZGF0ZS1uYW1lLzpuYW1lIiwKKyAgICAgICAgICAgICJHRVRfcHJvZHVjdCI6ICIvdjEvY2F0YWxvZy9wcm9kdWN0cy86aWQiLAorICAgICAgICAgICAgIkdFVF9wcm9kdWN0X3N1Yl9jYXRlZ29yeSI6ICIvdjEvcHJvZHVjdFN1YkNhdGVnb3JpZXMiLAorICAgICAgICAgICAgIkdFVF9vbmJvYXJkaW5nIjogImh0dHA6Ly9mZWhvc3Q6ODE4MS9zZGMxL2ZlUHJveHkvb25ib2FyZGluZy1hcGkvdjEuMC92ZW5kb3Itc29mdHdhcmUtcHJvZHVjdHMvcGFja2FnZXMiLAorICAgICAgICAgICAgIkdFVF9jb21wb25lbnRfZnJvbV9jc2FyX3V1aWQiOiAiL3YxL2NhdGFsb2cvcmVzb3VyY2VzL2NzYXIvOmNzYXJfdXVpZCIsCisgICAgICAgICAgICAia2liYW5hIjogIi9zZGMxL2tpYmFuYVByb3h5LyIKKyAgICAgICAgfSwKKyAgICAgICAgInJlc291cmNlVHlwZXNGaWx0ZXIiOnsKKyAgICAgICAgICAgICJyZXNvdXJjZSI6WyJDUCIsIlZGQyJdLAorICAgICAgICAgICAgInNlcnZpY2UiOlsiQ1AiLCJWRiJdLAorICAgICAgICAgICAgInByb2R1Y3QiOltdCisgICAgICAgIH0sCisgICAgICAgICJsb2dDb25maWciOiB7CisgICAgICAgICAgICAibWluTG9nTGV2ZWwiOiAiZGVidWciLAorICAgICAgICAgICAgInByZWZpeCI6ICJzZGNBcHAiCisgICAgICAgIH0sCisgICAgICAgICJjb29raWUiOiB7CisgICAgICAgICAgICAianVuY3Rpb25OYW1lIjogIklWX0pDVCIsCisgICAgICAgICAgICAicHJlZml4IjogIkFNV0VCSkNUISIsCisgICAgICAgICAgICAidXNlcklkU3VmZml4IjogIlVTRVJfSUQiLAorICAgICAgICAgICAgInVzZXJGaXJzdE5hbWUiOiAiSFRUUF9DU1BfRklSU1ROQU1FIiwKKyAgICAgICAgICAgICJ1c2VyTGFzdE5hbWUiOiAiSFRUUF9DU1BfTEFTVE5BTUUiLAorICAgICAgICAgICAgInVzZXJFbWFpbCI6ICJIVFRQX0NTUF9FTUFJTCIsCisgICAgICAgICAgICAieEVjb21wUmVxdWVzdElkIjogIiBYLUVDT01QLVJlcXVlc3RJRCIKKyAgICAgICAgfSwKKyAgICAgICAgImltYWdlc1BhdGgiOiAiIiwKKyAgICAgICAgImNwRW5kUG9pbnRJbnN0YW5jZXMiIDogWyJjbG91ZGVwIiwib3NzZXAiLCJwZXJzb25lcCIsInByZW1pc2VzZXAiXSwKKyAgICAgICAgInRvc2NhRmlsZUV4dGVuc2lvbiI6InlhbWwseW1sIiwKKyAgICAgICAgImNzYXJGaWxlRXh0ZW5zaW9uIjoiY3NhciIsCisgICAgICAgICJvcGVuU291cmNlIjogdHJ1ZSwKKyAgICAgICAgImNhdGVnb3JpZXMiOiB7fSwKKyAgICAgICAgInRlc3RlcnMiOiB7CisgICAgICAgICAgICAiUkVTT1VSQ0UiOiB7CisgICAgICAgICAgICAgICAgIk5ldHdvcmsgTDItMyI6ICJETC1BU0RDTDEtM1Jlc291cmNlQ2VydGlmaWNhdGlvblRlYW0iLAorICAgICAgICAgICAgICAgICJOZXR3b3JrIEw0KyI6ICJETC1BU0RDTDQtN1Jlc291cmNlQ2VydGlmaWNhdGlvblRlYW0iLAorICAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiBMNCsiOiAiREwtQVNEQ0w0LTdSZXNvdXJjZUNlcnRpZmljYXRpb25UZWFtIiwKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJETC1BU0RDTDEtM1Jlc291cmNlQ2VydGlmaWNhdGlvblRlYW07REwtQVNEQ0w0LTdSZXNvdXJjZUNlcnRpZmljYXRpb25UZWFtIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJTRVJWSUNFIjogeworICAgICAgICAgICAgICAgICJOZXR3b3JrIEwxLTMiOiAiREwtQVNEQ0wxLTRTZXJ2aWNlQ2VydGlmaWNhdGlvblRlYW0iLAorICAgICAgICAgICAgICAgICJOZXR3b3JrIEw0KyI6ICJETC1BU0RDTDQtN1NlcnZpY2VDZXJ0aWZpY2F0aW9uVGVhbSIsCisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiREwtQVNEQ0wxLTRTZXJ2aWNlQ2VydGlmaWNhdGlvblRlYW07REwtQVNEQ0w0LTdTZXJ2aWNlQ2VydGlmaWNhdGlvblRlYW0iCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJyb2xlcyI6IFsiQURNSU4iLCAiVEVTVEVSIiwgIkdPVkVSTk9SIiwgIk9QUyIsICJERVNJR05FUiIsICJQUk9EVUNUX01BTkFHRVIiLCAiUFJPRFVDVF9TVFJBVEVHSVNUIl0sCisgICAgICAgICJ0dXRvcmlhbCI6IHsKKyAgICAgICAgICAgICJ0YWJzIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxLAorICAgICAgICAgICAgICAgICAgICAibmFtZSI6IlRVVFJJQUxfR0VORVJBTF9UQUJfMSIsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0UGFnZSI6MQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjIsCisgICAgICAgICAgICAgICAgICAgICJuYW1lIjoiVFVUUklBTF9HRU5FUkFMX1RBQl8yIiwKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRQYWdlIjo5CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MywKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiJUVVRSSUFMX0dFTkVSQUxfVEFCXzMiLAorICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdFBhZ2UiOjEyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJwYWdlcyI6CisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjEsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJ0ZXh0LXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDEsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMV9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMV9URVhUIgorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMSwKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyX1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UyX1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yLWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MywKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDEsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFM19USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFM19URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMy1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjQsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAxLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTRfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTRfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTQtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjo1LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMSwKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0U1X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0U1X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS01LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6NiwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDEsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFNl9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFNl9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtNi1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjcsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAxLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTdfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTdfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTctaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjo4LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMSwKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0U4X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0U4X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS04LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6OSwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogInRleHQtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMiwKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0U5X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0U5X1RFWFQiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxMCwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDIsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTBfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTEwX1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0xMC1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjExLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMiwKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UxMV9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMTFfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTExLWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MTIsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJ0ZXh0LXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTJfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTEyX1RFWFQiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxMywKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTNfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTEzX1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0xMy1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjE0LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UxNF9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMTRfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTE0LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MTUsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTE1X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UxNV9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMTUtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxNiwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTZfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTE2X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0xNi1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjE3LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UxN19USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMTdfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTE3LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MTgsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTE4X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UxOF9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMTgtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxOSwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTlfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTE5X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0xOS1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjIwLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyMF9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMjBfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTIwLWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MjEsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTIxX1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UyMV9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMjEtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyMiwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMjJfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTIyX1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yMi1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjIzLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyM19USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMjNfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTIzLWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MjQsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTI0X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UyNF9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMjQtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyNSwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMjVfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTI1X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yNS1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjI2LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyNl9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMjZfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTI2LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MjcsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTI3X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UyN19URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMjctaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyOCwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMjhfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTI4X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yOC1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjI5LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyOV9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMjlfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTI5LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MzAsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTMwX1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UzMF9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMzAtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF0KKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9jb25maWd1cmF0aW9ucy9tZW51Lmpzb24gYi9jYXRhbG9nLXVpL2NvbmZpZ3VyYXRpb25zL21lbnUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQ1MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9jb25maWd1cmF0aW9ucy9tZW51Lmpzb24KQEAgLTAsMCArMSw1NzYgQEAKK3sKKyAgICAicm9sZXMiOnsKKyAgICAgICAgIkFETUlOIjp7CisgICAgICAgICAgICAidGl0bGUiOiAiQWRtaW4ncyBXb3Jrc3BhY2UiLAorICAgICAgICAgICAgInBhZ2VzIjpbXSwKKyAgICAgICAgICAgICJzdGF0ZXMiOnsKKyAgICAgICAgICAgICAgICAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCI6eworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJTdWJtaXQgZm9yIFRlc3RpbmciLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jZXJ0aWZpY2F0aW9uUmVxdWVzdCIgLCAiZW1haWxNb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DRVJUSUZJQ0FUSU9OUkVRVUVTVCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiTk9UX0NFUlRJRklFRF9DSEVDS0lOIjogeworICAgICAgICAgICAgICAgICAgICAiQU5ZIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlN1Ym1pdCBmb3IgVGVzdGluZyIsICJhY3Rpb24iOiAiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjogImxpZmVjeWNsZVN0YXRlL2NlcnRpZmljYXRpb25SZXF1ZXN0IiwgImVtYWlsTW9kYWwiOiAibGlmZWN5Y2xlU3RhdGUvQ0VSVElGSUNBVElPTlJFUVVFU1QifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6ICJWaWV3IiwiYWN0aW9uIjogIm9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI6IHsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUVEIjp7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIkRFU0lHTkVSIjp7CisgICAgICAgICAgICAidGl0bGUiOiAiRGVzaWduZXIncyBXb3Jrc3BhY2UiLAorICAgICAgICAgICAgInBhZ2VzIjpbXSwKKyAgICAgICAgICAgICJkYXNoYm9hcmQiOiB7CisgICAgICAgICAgICAgICAgInNob3dDcmVhdGVOZXciOiB0cnVlLAorICAgICAgICAgICAgICAgICJzaG93Q3JlYXRlTmV3UHJvZHVjdCI6IGZhbHNlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucyI6eworICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIjp7ICAic3VibWl0Rm9yVGVzdGluZyI6IHsidGV4dCI6IlN1Ym1pdCBmb3IgVGVzdGluZyIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jZXJ0aWZpY2F0aW9uUmVxdWVzdCIsICJlbWFpbE1vZGFsIjogImxpZmVjeWNsZVN0YXRlL0NFUlRJRklDQVRJT05SRVFVRVNUIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja0luIjogICAgICAgICAgeyJ0ZXh0IjoiQ2hlY2sgaW4iLCAgInVybCI6ImxpZmVjeWNsZVN0YXRlL0NIRUNLSU4iLCAiY29uZmlybWF0aW9uTW9kYWwiOiAibGlmZWN5Y2xlU3RhdGUvQ0hFQ0tJTiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRlVmVyc2lvbiI6ICAgIHsidGV4dCI6IkRlbGV0ZSBWZXJzaW9uIiwgInVybCI6ImxpZmVjeWNsZVN0YXRlL1VORE9DSEVDS09VVCIsICJhbGVydE1vZGFsIjogImxpZmVjeWNsZVN0YXRlL1VORE9DSEVDS09VVCJ9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUVEIjp7ICAgICAgICAgICAgICAgImNoZWNrT3V0IjogICAgICAgICB7InRleHQiOiJDaGVjayBPdXQiLCAgInVybCI6ImxpZmVjeWNsZVN0YXRlL0NIRUNLT1VUIn0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iOnsgICAic3VibWl0Rm9yVGVzdGluZyI6IHsidGV4dCI6IlN1Ym1pdCBmb3IgVGVzdGluZyIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jZXJ0aWZpY2F0aW9uUmVxdWVzdCIsICJlbWFpbE1vZGFsIjogImxpZmVjeWNsZVN0YXRlL0NFUlRJRklDQVRJT05SRVFVRVNUIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja091dCI6ICAgICAgICAgeyJ0ZXh0IjoiQ2hlY2sgT3V0IiwgICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9DSEVDS09VVCJ9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJzdGF0ZXMiOnsKKyAgICAgICAgICAgICAgICAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCI6eworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJTdWJtaXQgZm9yIFRlc3RpbmciLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jZXJ0aWZpY2F0aW9uUmVxdWVzdCIsICJlbWFpbE1vZGFsIjogImxpZmVjeWNsZVN0YXRlL0NFUlRJRklDQVRJT05SRVFVRVNUIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iOiB7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiU3VibWl0IGZvciBUZXN0aW5nIiwgImFjdGlvbiI6ICJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiAibGlmZWN5Y2xlU3RhdGUvY2VydGlmaWNhdGlvblJlcXVlc3QiLCAiZW1haWxNb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DRVJUSUZJQ0FUSU9OUkVRVUVTVCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIjogeworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiVmlldyIsImFjdGlvbiI6ICJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyI6eworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJDRVJUSUZJRUQiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJmb2xkZXIiOlsKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQWN0aXZlIFByb2plY3RzIiwgICAgICJncm91cG5hbWUiOiAiSU5fUFJPR1JFU1MiIH0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkNoZWNrIE91dCIsICAgICAgICAgImdyb3VwIjogIklOX1BST0dSRVNTIiwgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQifSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQ2hlY2sgSW4iLCAgICAgICAgICAiZ3JvdXAiOiAiSU5fUFJPR1JFU1MiLCAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS0lOIn0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkZvbGxvd2VkIFByb2plY3RzIiwgICAiZ3JvdXBuYW1lIjogIkZPTExPV0lORyIgfSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiUmVhZHkgRm9yIFRlc3RpbmciLCAgICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiUkVBRFlfRk9SX0NFUlRJRklDQVRJT04ifSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiSW4gVGVzdGluZyIsICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJDZXJ0aWZpZWQiLCAgICAgICAgICAgImdyb3VwIjogIkZPTExPV0lORyIsICJzdGF0ZSI6ICJDRVJUSUZJRUQifQorICAgICAgICAgICAgXQorCisgICAgICAgIH0sCisgICAgICAgICJQUk9EVUNUX1NUUkFURUdJU1QiOnsKKyAgICAgICAgICAgICJ0aXRsZSI6ICJQcm9kdWN0IFN0cmF0ZWdpc3QncyBXb3Jrc3BhY2UiLAorICAgICAgICAgICAgInBhZ2VzIjpbXSwKKyAgICAgICAgICAgICJkYXNoYm9hcmQiOiB7CisgICAgICAgICAgICAgICAgInNob3dDcmVhdGVOZXciOiBmYWxzZSwKKyAgICAgICAgICAgICAgICAic2hvd0NyZWF0ZU5ld1Byb2R1Y3QiOiBmYWxzZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjaGFuZ2VMaWZlY3ljbGVTdGF0ZUJ1dHRvbnMiOnt9LAorCisgICAgICAgICAgICAic3RhdGVzIjp7CisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiTk9UX0NFUlRJRklFRF9DSEVDS0lOIjogeworICAgICAgICAgICAgICAgICAgICAiQU5ZIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIjogeworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiVmlldyIsImFjdGlvbiI6ICJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyI6eworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJDRVJUSUZJRUQiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJmb2xkZXIiOlsKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQWN0aXZlIFByb2plY3RzIiwgICAgICJncm91cG5hbWUiOiAiSU5fUFJPR1JFU1MiIH0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkNoZWNrIE91dCIsICAgICAgICAgImdyb3VwIjogIklOX1BST0dSRVNTIiwgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQifSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQ2hlY2sgSW4iLCAgICAgICAgICAiZ3JvdXAiOiAiSU5fUFJPR1JFU1MiLCAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS0lOIn0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkZvbGxvd2VkIFByb2plY3RzIiwgICAiZ3JvdXBuYW1lIjogIkZPTExPV0lORyIgfSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiUmVhZHkgRm9yIFRlc3RpbmciLCAgICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiUkVBRFlfRk9SX0NFUlRJRklDQVRJT04ifSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiSW4gVGVzdGluZyIsICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJDZXJ0aWZpZWQiLCAgICAgICAgICAgImdyb3VwIjogIkZPTExPV0lORyIsICJzdGF0ZSI6ICJDRVJUSUZJRUQifQorICAgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICAiUFJPRFVDVF9NQU5BR0VSIjp7CisgICAgICAgICAgICAidGl0bGUiOiAiUHJvZHVjdCBNYW5hZ2VyIFdvcmtzcGFjZSIsCisgICAgICAgICAgICAicGFnZXMiOltdLAorICAgICAgICAgICAgImRhc2hib2FyZCI6IHsKKyAgICAgICAgICAgICAgICAic2hvd0NyZWF0ZU5ldyI6IGZhbHNlLAorICAgICAgICAgICAgICAgICJzaG93Q3JlYXRlTmV3UHJvZHVjdCI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2hhbmdlTGlmZWN5Y2xlU3RhdGVCdXR0b25zIjp7CisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiOnsgICJjaGVja0luIjogICAgICB7InRleHQiOiJDaGVjayBpbiIsICAidXJsIjoibGlmZWN5Y2xlU3RhdGUvQ0hFQ0tJTiIsICJjb25maXJtYXRpb25Nb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DSEVDS0lOIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWxldGVWZXJzaW9uIjp7InRleHQiOiJEZWxldGUgVmVyc2lvbiIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9VTkRPQ0hFQ0tPVVQiLCAiYWxlcnRNb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9VTkRPQ0hFQ0tPVVQifQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiI6eyAgICJjaGVja091dCI6ICAgICB7InRleHQiOiJDaGVjayBPdXQiLCAgInVybCI6ImxpZmVjeWNsZVN0YXRlL0NIRUNLT1VUIn0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInN0YXRlcyI6eworICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIjp7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiI6IHsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6ICJWaWV3IiwiYWN0aW9uIjogIm9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI6IHsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUVEIjp7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZm9sZGVyIjpbCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkFjdGl2ZSBQcm9qZWN0cyIsICAgICAiZ3JvdXBuYW1lIjogIklOX1BST0dSRVNTIiB9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJDaGVjayBPdXQiLCAgICAgICAgICJncm91cCI6ICJJTl9QUk9HUkVTUyIsICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIn0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkNoZWNrIEluIiwgICAgICAgICAgImdyb3VwIjogIklOX1BST0dSRVNTIiwgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJGb2xsb3dlZCBQcm9qZWN0cyIsICAgImdyb3VwbmFtZSI6ICJGT0xMT1dJTkciIH0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlJlYWR5IEZvciBUZXN0aW5nIiwgICAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIn0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkluIFRlc3RpbmciLCAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MifSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQ2VydGlmaWVkIiwgICAgICAgICAgICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiQ0VSVElGSUVEIn0KKyAgICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgIlRFU1RFUiI6eworICAgICAgICAgICAgInRpdGxlIjogIlRlc3RlcidzIFdvcmtzcGFjZSIsCisgICAgICAgICAgICAicGFnZXMiOltdLAorICAgICAgICAgICAgImRhc2hib2FyZCI6IHsKKyAgICAgICAgICAgICAgICAic2hvd0NyZWF0ZU5ldyI6IGZhbHNlLAorICAgICAgICAgICAgICAgICJzaG93Q3JlYXRlTmV3UHJvZHVjdCI6IGZhbHNlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucyI6eworICAgICAgICAgICAgICAgICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI6eyAgICAgInN0YXJ0VGVzdGluZyI6IHsidGV4dCI6IlN0YXJ0IFRlc3RpbmciLCAgInVybCI6ImxpZmVjeWNsZVN0YXRlL3N0YXJ0Q2VydGlmaWNhdGlvbiJ9CisKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIjp7ICAgImFjY2VwdCI6ICAgICAgIHsidGV4dCI6IkFjY2VwdCIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jZXJ0aWZ5IiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImxpZmVjeWNsZVN0YXRlL2NlcnRpZnkifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWplY3QiOiAgICAgICB7InRleHQiOiJSZWplY3QiLCAidXJsIjoibGlmZWN5Y2xlU3RhdGUvZmFpbENlcnRpZmljYXRpb24iLCAiY29uZmlybWF0aW9uTW9kYWwiOiAibGlmZWN5Y2xlU3RhdGUvZmFpbENlcnRpZmljYXRpb24ifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5jZWwiOiAgICAgICB7InRleHQiOiJDYW5jZWwiLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jYW5jZWxDZXJ0aWZpY2F0aW9uIiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImxpZmVjeWNsZVN0YXRlL2NhbmNlbCJ9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJzdGF0ZXMiOiB7CisgICAgICAgICAgICAgICAgIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIjp7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJTdGFydCBUZXN0aW5nIiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoibGlmZWN5Y2xlU3RhdGUvc3RhcnRDZXJ0aWZpY2F0aW9uIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJBY2NlcHQiLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jZXJ0aWZ5IiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImxpZmVjeWNsZVN0YXRlL2NlcnRpZnkifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlJlamVjdCIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImxpZmVjeWNsZVN0YXRlL2ZhaWxDZXJ0aWZpY2F0aW9uIiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImxpZmVjeWNsZVN0YXRlL2ZhaWxDZXJ0aWZpY2F0aW9uIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJDYW5jZWwiLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJsaWZlY3ljbGVTdGF0ZS9jYW5jZWxDZXJ0aWZpY2F0aW9uIiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImxpZmVjeWNsZVN0YXRlL2NhbmNlbCIgfQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJmb2xkZXIiOlsKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQWN0aXZlIFByb2plY3RzIiwgICAgICJncm91cG5hbWUiOiAiRk9MTE9XSU5HIiB9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJSZWFkeSBGb3IgVGVzdGluZyIsICAgImdyb3VwIjogIkZPTExPV0lORyIsICJzdGF0ZSI6ICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJJbiBUZXN0aW5nIiwgImdyb3VwIjogIkZPTExPV0lORyIsICJzdGF0ZSI6ICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIn0KKyAgICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgIk9QUyI6eworICAgICAgICAgICAgInRpdGxlIjogIk9wZXJhdGlvbnMgV29ya3NwYWNlIiwKKyAgICAgICAgICAgICJwYWdlcyI6W10sCisgICAgICAgICAgICAiZGFzaGJvYXJkIjogeworICAgICAgICAgICAgICAgICJzaG93Q3JlYXRlTmV3IjogZmFsc2UsCisgICAgICAgICAgICAgICAgInNob3dDcmVhdGVOZXdQcm9kdWN0IjogZmFsc2UKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2hhbmdlTGlmZWN5Y2xlU3RhdGVCdXR0b25zIjp7CisgICAgICAgICAgICAgICAgIkRJU1RSSUJVVElPTl9BUFBST1ZFRCI6eyAgICJkaXN0cmlidXRlIjogICB7InRleHQiOiJEaXN0cmlidXRlIiwgICJ1cmwiOiJkaXN0cmlidXRpb24vUFJPRC9hY3RpdmF0ZSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9uaXRvciI6ICAgICAgeyJ0ZXh0IjoiTW9uaXRvciIsICJkaXNhYmxlZCI6dHJ1ZX0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJESVNUUklCVVRFRCI6eyAgICAgICAgICAgICAicmVkaXN0cmlidXRlIjogeyJ0ZXh0IjoiUmVkaXN0cmlidXRlIiwgInVybCI6ImRpc3RyaWJ1dGlvbi9QUk9EL2FjdGl2YXRlIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb25pdG9yIjogICAgICB7InRleHQiOiJNb25pdG9yIiwgInVybCI6ImRpc3RyaWJ1dGlvbi1zdGF0ZS9tb25pdG9yIn0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInN0YXRlcyI6IHsKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUVEIjogeworICAgICAgICAgICAgICAgICAgICAiRElTVFJJQlVUSU9OX0FQUFJPVkVEIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiRGlzdHJpYnV0ZSIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImRpc3RyaWJ1dGlvbi9QUk9EL2FjdGl2YXRlIn0KKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgIkRJU1RSSUJVVEVEIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiTW9uaXRvciIsImFjdGlvbiI6Im9wZW5EaXN0cmlidXRpb25Nb2RhbCIsICJ1cmwiOiJkaXN0cmlidXRpb24tc3RhdGUvbW9uaXRvciJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlJlZGlzdHJpYnV0ZSIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImRpc3RyaWJ1dGlvbi9QUk9EL2FjdGl2YXRlIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZm9sZGVyIjpbCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkFjdGl2ZSBQcm9qZWN0cyIsICAgICAgICAgImdyb3VwbmFtZSI6ICJGT0xMT1dJTkciIH0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIldhaXRpbmcgRm9yIERpc3RyaWJ1dGlvbiIsICAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIkNFUlRJRklFRCIsICJkaXN0IjogIkRJU1RSSUJVVElPTl9BUFBST1ZFRCJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJEaXN0cmlidXRlZCIsICAgICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiQ0VSVElGSUVEIiwgImRpc3QiOiAiRElTVFJJQlVURUQifQorICAgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICAiR09WRVJOT1IiOnsKKyAgICAgICAgICAgICJ0aXRsZSI6ICJHb3Zlcm5hbmNlIFJlcCdzIFdvcmtzcGFjZSIsCisgICAgICAgICAgICAicGFnZXMiOltdLAorICAgICAgICAgICAgImRhc2hib2FyZCI6IHsKKyAgICAgICAgICAgICAgICAic2hvd0NyZWF0ZU5ldyI6IGZhbHNlLAorICAgICAgICAgICAgICAgICJzaG93Q3JlYXRlTmV3UHJvZHVjdCI6IGZhbHNlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNoYW5nZUxpZmVjeWNsZVN0YXRlQnV0dG9ucyI6eworICAgICAgICAgICAgICAgICJESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEIjp7ICAgImFwcHJvdmUiOiAgeyJ0ZXh0IjoiQXBwcm92ZSIsICJ1cmwiOiJkaXN0cmlidXRpb24tc3RhdGUvYXBwcm92ZSIsICJjb25maXJtYXRpb25Nb2RhbCI6ICJkaXN0cmlidXRpb24tc3RhdGUvYXBwcm92ZSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlamVjdCI6ICAgeyJ0ZXh0IjoiUmVqZWN0IiwgInVybCI6ImRpc3RyaWJ1dGlvbi1zdGF0ZS9yZWplY3QiLCAiY29uZmlybWF0aW9uTW9kYWwiOiAiZGlzdHJpYnV0aW9uLXN0YXRlL3JlamVjdCJ9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiRElTVFJJQlVUSU9OX0FQUFJPVkVEIjp7ICAgICAgICJyZWplY3QiOiAgIHsidGV4dCI6IlJlamVjdCIsICJ1cmwiOiJkaXN0cmlidXRpb24tc3RhdGUvcmVqZWN0IiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImRpc3RyaWJ1dGlvbi1zdGF0ZS9yZWplY3QifQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkRJU1RSSUJVVEVEIjogeyAgICAgICAgICAgICAgICAicmVqZWN0IjogICB7InRleHQiOiJSZWplY3QiLCAidXJsIjoiZGlzdHJpYnV0aW9uLXN0YXRlL3JlamVjdCIsICJjb25maXJtYXRpb25Nb2RhbCI6ICJkaXN0cmlidXRpb24tc3RhdGUvcmVqZWN0In0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJESVNUUklCVVRJT05fUkVKRUNURUQiOiB7ICAgICAgImFwcHJvdmUiOiAgeyJ0ZXh0IjogIkFwcHJvdmUiLCAidXJsIjogImRpc3RyaWJ1dGlvbi1zdGF0ZS9hcHByb3ZlIiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImRpc3RyaWJ1dGlvbi1zdGF0ZS9hcHByb3ZlIn0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInN0YXRlcyI6IHsKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUVEIjogeworICAgICAgICAgICAgICAgICAgICAiRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6ICJWaWV3IiwiYWN0aW9uIjogIm9wZW5WaWV3ZXJNb2RhbCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiQXBwcm92ZSIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImRpc3RyaWJ1dGlvbi1zdGF0ZS9hcHByb3ZlIiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImRpc3RyaWJ1dGlvbi1zdGF0ZS9hcHByb3ZlIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJSZWplY3QiLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJkaXN0cmlidXRpb24tc3RhdGUvcmVqZWN0IiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImRpc3RyaWJ1dGlvbi1zdGF0ZS9yZWplY3QifQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAiRElTVFJJQlVUSU9OX0FQUFJPVkVEIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJSZWplY3QiLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJkaXN0cmlidXRpb24tc3RhdGUvcmVqZWN0IiwgImNvbmZpcm1hdGlvbk1vZGFsIjogImRpc3RyaWJ1dGlvbi1zdGF0ZS9yZWplY3QifQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAiRElTVFJJQlVURUQiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiVmlldyIsImFjdGlvbiI6ICJvcGVuVmlld2VyTW9kYWwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlJlamVjdCIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImRpc3RyaWJ1dGlvbi1zdGF0ZS9yZWplY3QiLCAiY29uZmlybWF0aW9uTW9kYWwiOiAiZGlzdHJpYnV0aW9uLXN0YXRlL3JlamVjdCJ9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJESVNUUklCVVRJT05fUkVKRUNURUQiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiVmlldyIsImFjdGlvbiI6ICJvcGVuVmlld2VyTW9kYWwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IkFwcHJvdmUiLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJkaXN0cmlidXRpb24tc3RhdGUvYXBwcm92ZSIsICJjb25maXJtYXRpb25Nb2RhbCI6ICJkaXN0cmlidXRpb24tc3RhdGUvYXBwcm92ZSJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImZvbGRlciI6WworICAgICAgICAgICAgICAgIHsidGV4dCI6ICJBY3RpdmUgUHJvamVjdHMiLCAgImdyb3VwbmFtZSI6ICJGT0xMT1dJTkciIH0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIldhaXRpbmcgRm9yIEFwcHJvdmFsIiwgICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiQ0VSVElGSUVEIiwgImRpc3QiOiAiRElTVFJJQlVUSU9OX05PVF9BUFBST1ZFRCJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJEaXN0cmlidXRpb24gUmVqZWN0ZWQiLCAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIkNFUlRJRklFRCIsICJkaXN0IjogIkRJU1RSSUJVVElPTl9SRUpFQ1RFRCJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJEaXN0cmlidXRpb24gQXBwcm92ZWQiLCAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIkNFUlRJRklFRCIsICJkaXN0IjogIkRJU1RSSUJVVElPTl9BUFBST1ZFRCxESVNUUklCVVRFRCJ9CisKKyAgICAgICAgICAgIF0KKyAgICAgICAgfQorICAgIH0sCisgICAgImNvbmZpcm1hdGlvbk1lc3NhZ2VzIjogeworICAgICAgICAibGlmZWN5Y2xlU3RhdGUvQ0hFQ0tJTiI6IHsic2hvd0NvbW1lbnQiOnRydWUsICJ0aXRsZSI6ICJDaGVjayBpbiBjb25maXJtYXRpb24iLCAibWVzc2FnZSI6ICJQbGVhc2UgYWRkIGNvbW1lbnQgYW5kIGNvbmZpcm0gdGhlIGNoZWNrIGluLiJ9LAorICAgICAgICAibGlmZWN5Y2xlU3RhdGUvQ0hFQ0tPVVQiOiB7InNob3dDb21tZW50Ijp0cnVlLCAidGl0bGUiOiAiQ2hlY2sgb3V0IGNvbmZpcm1hdGlvbiIsICJtZXNzYWdlIjogIlBsZWFzZSBhZGQgY29tbWVudCBhbmQgY29uZmlybSB0aGUgY2hlY2sgb3V0LiJ9LAorICAgICAgICAibGlmZWN5Y2xlU3RhdGUvY2VydGlmeSI6IHsic2hvd0NvbW1lbnQiOnRydWUsICJ0aXRsZSI6ICJEaXN0cmlidXRpb24gY29uZmlybWF0aW9uIiwgIm1lc3NhZ2UiOiAiUGxlYXNlIGFkZCBjb21tZW50IGFuZCBjb25maXJtIHRlc3QgcmVzdWx0cy4ifSwKKyAgICAgICAgImxpZmVjeWNsZVN0YXRlL2NhbmNlbCI6IHsic2hvd0NvbW1lbnQiOnRydWUsICJ0aXRsZSI6ICJDYW5jZWwgdGVzdCIsICJtZXNzYWdlIjogIlBsZWFzZSBhZGQgY29tbWVudCBhbmQgY2FuY2VsIHRlc3QuIn0sCisgICAgICAgICJsaWZlY3ljbGVTdGF0ZS9mYWlsQ2VydGlmaWNhdGlvbiI6IHsic2hvd0NvbW1lbnQiOnRydWUsICJ0aXRsZSI6ICJSZWplY3Rpb24gY29uZmlybWF0aW9uIiwgIm1lc3NhZ2UiOiAiUGxlYXNlIGFkZCBjb21tZW50IGFuZCBjb25maXJtIHRlc3QgcmVzdWx0cy4ifSwKKyAgICAgICAgImxpZmVjeWNsZVN0YXRlL0NFUlRJRklDQVRJT05SRVFVRVNUIjogeyJzaG93Q29tbWVudCI6dHJ1ZSwgInRpdGxlIjogIlN1Ym1pdCBmb3IgdGVzdGluZyIsICJtZXNzYWdlIjogIlBsZWFzZSBhZGQgY29tbWVudCBhbmQgc3VibWl0IGZvciB0ZXN0aW5nLiJ9LAorICAgICAgICAiZGlzdHJpYnV0aW9uLXN0YXRlL2FwcHJvdmUiOiB7InNob3dDb21tZW50Ijp0cnVlLCAidGl0bGUiOiAiRGlzdHJpYnV0aW9uIGNvbmZpcm1hdGlvbiIsICJtZXNzYWdlIjogIlBsZWFzZSBhZGQgY29tbWVudCBhbmQgY29uZmlybSAlMSBhcHByb3ZhbCBmb3IgZGlzdHJpYnV0aW9uLiJ9LAorICAgICAgICAiZGlzdHJpYnV0aW9uLXN0YXRlL3JlamVjdCI6IHsic2hvd0NvbW1lbnQiOnRydWUsICJ0aXRsZSI6ICJSZWplY3Rpb24gY29uZmlybWF0aW9uIiwgIm1lc3NhZ2UiOiAiUGxlYXNlIGFkZCBjb21tZW50IGFuZCBjb25maXJtICUxIHJlamVjdGlvbiBmb3IgZGlzdHJpYnV0aW9uLiJ9LAorICAgICAgICAidXBkYXRlVGVtcGxhdGUiOiB7InNob3dDb21tZW50IjpmYWxzZSwgInRpdGxlIjogIlVwZGF0ZSBUZW1wbGF0ZSBDb25maXJtYXRpb24iLCAibWVzc2FnZSI6ICJNb2RpZnlpbmcgdGhlIFRlbXBsYXRlIG1pZ2h0IGNhdXNlIGxvc2luZyBvZiBwcmV2aW91cyBpbmZvcm1hdGlvbiJ9CisgICAgfSwKKyAgICAiYWxlcnRNZXNzYWdlcyI6IHsKKyAgICAgICAgImxpZmVjeWNsZVN0YXRlL1VORE9DSEVDS09VVCI6IHsidGl0bGUiOiAiRGVsZXRlIFZlcnNpb24gQ29uZmlybWF0aW9uIiwgIm1lc3NhZ2UiOiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHZlcnNpb24/In0sCisgICAgICAgICJleGl0V2l0aG91dFNhdmluZyI6IHsidGl0bGUiOiAiRXhpdCBXaXRob3V0IFNhdmluZyBDb25maXJtYXRpb24iLCAibWVzc2FnZSI6ICJBbGwgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGV4aXQgdGhpcyBwYWdlPyJ9LAorICAgICAgICAiZGVsZXRlSW5zdGFuY2UiOiB7InRpdGxlIjogIkRlbGV0ZSBDb25maXJtYXRpb24iLCAibWVzc2FnZSI6ICJBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlICUxID8ifSwKKyAgICAgICAgImRlbGV0ZUlucHV0IjogeyJ0aXRsZSI6ICJEZWxldGUgQ29uZmlybWF0aW9uIiwgIm1lc3NhZ2UiOiAiQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSAlMSA/In0KKyAgICB9LAorICAgICJzdGF0dXNlcyI6IHsKKyAgICAgICAgImluRGVzaWduIjogeworICAgICAgICAgICAgIm5hbWUiOiAiSW4gRGVzaWduIiwKKyAgICAgICAgICAgICJ2YWx1ZXMiOiBbCisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iCisgICAgICAgICAgICBdCisgICAgICAgIH0sCisgICAgICAgICJyZWFkeUZvckNlcnRpZmljYXRpb24iOiB7CisgICAgICAgICAgICAibmFtZSI6ICJSZWFkeSBGb3IgVGVzdGluZyIsCisgICAgICAgICAgICAidmFsdWVzIjogWyJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiJdCisgICAgICAgIH0sCisgICAgICAgICJpbkNlcnRpZmljYXRpb24iOiB7CisgICAgICAgICAgICAibmFtZSI6ICJJbiBUZXN0aW5nIiwKKyAgICAgICAgICAgICJ2YWx1ZXMiOiBbIkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MiXQorICAgICAgICB9LAorICAgICAgICAiY2VydGlmaWVkIjogeworICAgICAgICAgICAgIm5hbWUiOiAiQ2VydGlmaWVkIiwKKyAgICAgICAgICAgICJ2YWx1ZXMiOiBbIkNFUlRJRklFRCJdCisgICAgICAgIH0sCisgICAgICAgICJkaXN0cmlidXRlZCI6IHsKKyAgICAgICAgICAgICJuYW1lIjogIkRpc3RyaWJ1dGVkIiwKKyAgICAgICAgICAgICJ2YWx1ZXMiOiBbIkRJU1RSSUJVVEVEIl0KKyAgICAgICAgfQorICAgIH0sCisgICAgImNhdGVnb3JpZXNEaWN0aW9uYXJ5IjogeworICAgICAgICAiTW9iaWxpdHkiOiAiQXBwbGljYXRpb24gTGF5ZXIgNCsiLAorICAgICAgICAiTmV0d29yayBMMS0zIjogIk5ldHdvcmsgTGF5ZXIgMi0zIiwKKyAgICAgICAgIk5ldHdvcmsgTDQiOiAiTmV0d29yayBMYXllciA0KyIsCisgICAgICAgICJWb0lQIENhbGwgQ29udHJvbCI6ICJBcHBsaWNhdGlvbiBMYXllciA0KyIKKyAgICB9LAorICAgICJjYXRhbG9nTWVudUl0ZW0iOnsKKyAgICAgICAgIkRFU0lHTkVSIjp7CisgICAgICAgICAgICAic3RhdGVzIjp7CisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiU3VibWl0IGZvciBUZXN0aW5nIiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoibGlmZWN5Y2xlU3RhdGUvY2VydGlmaWNhdGlvblJlcXVlc3QiLCAiZW1haWxNb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DRVJUSUZJQ0FUSU9OUkVRVUVTVCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAiTk9UX09XTkVSIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iOiB7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiU3VibWl0IGZvciBUZXN0aW5nIiwgImFjdGlvbiI6ICJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiAibGlmZWN5Y2xlU3RhdGUvY2VydGlmaWNhdGlvblJlcXVlc3QiLCAiZW1haWxNb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DRVJUSUZJQ0FUSU9OUkVRVUVTVCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIjogeworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiVmlldyIsImFjdGlvbiI6ICJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyI6eworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJDRVJUSUZJRUQiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJQUk9EVUNUX01BTkFHRVIiOnsKKyAgICAgICAgICAgICJzdGF0ZXMiOnsKKyAgICAgICAgICAgICAgICAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCI6eworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICJOT1RfT1dORVIiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiI6IHsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6ICJWaWV3IiwiYWN0aW9uIjogIm9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI6IHsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlZpZXciLCJhY3Rpb24iOiAib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUVEIjp7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZm9sZGVyIjpbCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkFjdGl2ZSBQcm9qZWN0cyIsICAgICAiZ3JvdXBuYW1lIjogIklOX1BST0dSRVNTIiB9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJDaGVjayBPdXQiLCAgICAgICAgICJncm91cCI6ICJJTl9QUk9HUkVTUyIsICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIn0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkNoZWNrIEluIiwgICAgICAgICAgImdyb3VwIjogIklOX1BST0dSRVNTIiwgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJGb2xsb3dlZCBQcm9qZWN0cyIsICAgImdyb3VwbmFtZSI6ICJGT0xMT1dJTkciIH0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIlJlYWR5IEZvciBUZXN0aW5nIiwgICAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIn0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkluIFRlc3RpbmciLCAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIkNFUlRJRklDQVRJT05fSU5fUFJPR1JFU1MifSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQ2VydGlmaWVkIiwgICAgICAgICAgICJncm91cCI6ICJGT0xMT1dJTkciLCAic3RhdGUiOiAiQ0VSVElGSUVEIn0KKyAgICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgIlBST0RVQ1RfU1RSQVRFR0lTVCI6eworICAgICAgICAgICAgInRpdGxlIjogIlByb2R1Y3QgU3RyYXRlZ2lzdCdzIFdvcmtzcGFjZSIsCisgICAgICAgICAgICAicGFnZXMiOltdLAorICAgICAgICAgICAgImRhc2hib2FyZCI6IHsKKyAgICAgICAgICAgICAgICAic2hvd0NyZWF0ZU5ldyI6IGZhbHNlLAorICAgICAgICAgICAgICAgICJzaG93Q3JlYXRlTmV3UHJvZHVjdCI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAic3RhdGVzIjp7CisgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAiTk9UX09XTkVSIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iOiB7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOiBbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiAiVmlldyIsImFjdGlvbiI6ICJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiUkVBRFlfRk9SX0NFUlRJRklDQVRJT04iOiB7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6ICJWaWV3IiwiYWN0aW9uIjogIm9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIjp7CisgICAgICAgICAgICAgICAgICAgICJBTlkiOlsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkNFUlRJRklFRCI6eworICAgICAgICAgICAgICAgICAgICAiQU5ZIjpbCisgICAgICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJWaWV3IiAgICAsImFjdGlvbiI6Im9wZW5WaWV3ZXJNb2RhbCJ9CisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImZvbGRlciI6WworICAgICAgICAgICAgICAgIHsidGV4dCI6ICJBY3RpdmUgUHJvamVjdHMiLCAgICAgImdyb3VwbmFtZSI6ICJJTl9QUk9HUkVTUyIgfSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiQ2hlY2sgT3V0IiwgICAgICAgICAiZ3JvdXAiOiAiSU5fUFJPR1JFU1MiLCAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJDaGVjayBJbiIsICAgICAgICAgICJncm91cCI6ICJJTl9QUk9HUkVTUyIsICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4ifSwKKyAgICAgICAgICAgICAgICB7InRleHQiOiAiRm9sbG93ZWQgUHJvamVjdHMiLCAgICJncm91cG5hbWUiOiAiRk9MTE9XSU5HIiB9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJSZWFkeSBGb3IgVGVzdGluZyIsICAgImdyb3VwIjogIkZPTExPV0lORyIsICJzdGF0ZSI6ICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiJ9LAorICAgICAgICAgICAgICAgIHsidGV4dCI6ICJJbiBUZXN0aW5nIiwgImdyb3VwIjogIkZPTExPV0lORyIsICJzdGF0ZSI6ICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIn0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0IjogIkNlcnRpZmllZCIsICAgICAgICAgICAiZ3JvdXAiOiAiRk9MTE9XSU5HIiwgInN0YXRlIjogIkNFUlRJRklFRCJ9CisgICAgICAgICAgICBdCisgICAgICAgIH0sCisgICAgICAgICJPVEhFUiI6eworICAgICAgICAgICAgInN0YXRlcyI6eworICAgICAgICAgICAgICAgICJBTlkiOnsKKyAgICAgICAgICAgICAgICAgICAgIkFOWSI6WworICAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICAiTGlmZUN5Y2xlU3RhdHVzZXMiOnsKKyAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiOiAgICB7ICJ0ZXh0IjoiSW4gRGVzaWduIENoZWNrIE91dCIsICJpY29uIjogImNoZWNrb3V0LWVkaXRhYmxlLXN0YXR1cy1pY29uIn0sCisgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iIDogICAgeyAidGV4dCI6IkluIERlc2lnbiBDaGVjayBJbiIsICJpY29uIjogImNoZWNraW4tc3RhdHVzLWljb24gIn0sCisgICAgICAgICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI6ICAgeyAidGV4dCI6IlJlYWR5IGZvciB0ZXN0aW5nIn0sCisgICAgICAgICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIjogeyAidGV4dCI6IkluIFRlc3RpbmcifSwKKyAgICAgICAgIkNFUlRJRklFRCI6ICAgICAgICAgICAgICAgICB7ICJ0ZXh0IjoiQ2VydGlmaWVkIiwgImljb24iOiAiY2hlY2tpbi1zdGF0dXMtaWNvbiAifQorICAgIH0sCisgICAgIkRpc3RyaWJ1dGlvblN0YXR1c2VzIjp7CisgICAgICAgICJESVNUUklCVVRJT05fTk9UX0FQUFJPVkVEIjogeyAidGV4dCI6IldhaXRpbmcgRm9yIERpc3RyaWJ1dGlvbiJ9LAorICAgICAgICAiRElTVFJJQlVUSU9OX0FQUFJPVkVEIiA6ICAgIHsgInRleHQiOiJEaXN0cmlidXRpb24gQXBwcm92ZWQifSwKKyAgICAgICAgIkRJU1RSSUJVVElPTl9SRUpFQ1RFRCI6ICAgICB7ICJ0ZXh0IjoiRGlzdHJpYnV0aW9uIFJlamVjdGVkIn0sCisgICAgICAgICJESVNUUklCVVRFRCI6ICAgICAgICAgICAgICAgeyAidGV4dCI6IkRpc3RyaWJ1dGVkIn0KKyAgICB9LAorICAgICJjYW52YXNfYnV0dG9ucyI6eworICAgICAgICAiY2hlY2tJbiI6ICAgICAgICAgIHsidGV4dCI6IkNoZWNrIGluIiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoibGlmZWN5Y2xlU3RhdGUvQ0hFQ0tJTiIsICJjb25maXJtYXRpb25Nb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DSEVDS0lOIn0sCisgICAgICAgICJzdWJtaXRGb3JUZXN0aW5nIjogeyJ0ZXh0IjoiU3VibWl0IGZvciBUZXN0aW5nIiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoibGlmZWN5Y2xlU3RhdGUvY2VydGlmaWNhdGlvblJlcXVlc3QiLCAiZW1haWxNb2RhbCI6ICJsaWZlY3ljbGVTdGF0ZS9DRVJUSUZJQ0FUSU9OUkVRVUVTVCJ9LAorICAgICAgICAiZGVsZXRlVmVyc2lvbiI6ICAgIHsidGV4dCI6IkRlbGV0ZSBWZXJzaW9uIiwgImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImxpZmVjeWNsZVN0YXRlL1VORE9DSEVDS09VVCIsICJhbGVydE1vZGFsIjogImxpZmVjeWNsZVN0YXRlL1VORE9DSEVDS09VVCJ9CisgICAgfSwKKworICAgICJjb21wb25lbnRfd29ya3NwYWNlX21lbnVfb3B0aW9uIjogeworICAgICAgICAiVkZDIjpbCisgICAgICAgICAgICB7InRleHQiOiJHZW5lcmFsIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5nZW5lcmFsIn0sCisgICAgICAgICAgICB7InRleHQiOiJJY29uIiwgICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaWNvbnMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkluZm9ybWF0aW9uIEFydGlmYWN0IiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5pbmZvcm1hdGlvbl9hcnRpZmFjdHMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IlRPU0NBIEFydGlmYWN0cyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UudG9zY2FfYXJ0aWZhY3RzIn0sCisgICAgICAgICAgICB7InRleHQiOiJQcm9wZXJ0aWVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5wcm9wZXJ0aWVzIn0sCisgICAgICAgICAgICB7InRleHQiOiJBdHRyaWJ1dGVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5hdHRyaWJ1dGVzIn0sCisgICAgICAgICAgICB7InRleHQiOiJSZXEuICYgQ2FwYWJpbGl0aWVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5yZXFBbmRDYXAifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkFjdGl2aXR5IExvZyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuYWN0aXZpdHlfbG9nIn0KKyAgICAgICAgXSwKKyAgICAgICAgIlZMIjpbCisgICAgICAgICAgICB7InRleHQiOiJHZW5lcmFsIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5nZW5lcmFsIn0sCisgICAgICAgICAgICB7InRleHQiOiJJY29uIiwgICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaWNvbnMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkluZm9ybWF0aW9uIEFydGlmYWN0IiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5pbmZvcm1hdGlvbl9hcnRpZmFjdHMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IlRPU0NBIEFydGlmYWN0cyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UudG9zY2FfYXJ0aWZhY3RzIn0sCisgICAgICAgICAgICB7InRleHQiOiJQcm9wZXJ0aWVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5wcm9wZXJ0aWVzIn0sCisgICAgICAgICAgICB7InRleHQiOiJBdHRyaWJ1dGVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5hdHRyaWJ1dGVzIn0sCisgICAgICAgICAgICB7InRleHQiOiJSZXEuICYgQ2FwYWJpbGl0aWVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5yZXFBbmRDYXAifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkFjdGl2aXR5IExvZyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuYWN0aXZpdHlfbG9nIn0KKyAgICAgICAgXSwKKyAgICAgICAgIkNQIjpbCisgICAgICAgICAgICB7InRleHQiOiJHZW5lcmFsIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5nZW5lcmFsIn0sCisgICAgICAgICAgICB7InRleHQiOiJJY29uIiwgICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaWNvbnMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkluZm9ybWF0aW9uIEFydGlmYWN0IiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5pbmZvcm1hdGlvbl9hcnRpZmFjdHMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IlRPU0NBIEFydGlmYWN0cyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UudG9zY2FfYXJ0aWZhY3RzIn0sCisgICAgICAgICAgICB7InRleHQiOiJQcm9wZXJ0aWVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5wcm9wZXJ0aWVzIn0sCisgICAgICAgICAgICB7InRleHQiOiJBdHRyaWJ1dGVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5hdHRyaWJ1dGVzIn0sCisgICAgICAgICAgICB7InRleHQiOiJSZXEuICYgQ2FwYWJpbGl0aWVzIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5yZXFBbmRDYXAifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkFjdGl2aXR5IExvZyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuYWN0aXZpdHlfbG9nIn0KKyAgICAgICAgXSwKKyAgICAgICAgIlZGIjpbCisgICAgICAgICAgICB7InRleHQiOiJHZW5lcmFsIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5nZW5lcmFsIn0sCisgICAgICAgICAgICB7InRleHQiOiJJY29uIiwgICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaWNvbnMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkRlcGxveW1lbnQgQXJ0aWZhY3QiLCAiYWN0aW9uIjoib25NZW51SXRlbVByZXNzZWQiLCAic3RhdGUiOiAid29ya3NwYWNlLmRlcGxveW1lbnRfYXJ0aWZhY3RzIn0sCisgICAgICAgICAgICB7InRleHQiOiJJbmZvcm1hdGlvbiBBcnRpZmFjdCIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaW5mb3JtYXRpb25fYXJ0aWZhY3RzIn0sCisgICAgICAgICAgICB7InRleHQiOiJUT1NDQSBBcnRpZmFjdHMiLCAiYWN0aW9uIjoib25NZW51SXRlbVByZXNzZWQiLCAic3RhdGUiOiAid29ya3NwYWNlLnRvc2NhX2FydGlmYWN0cyJ9LAorICAgICAgICAgICAgeyJ0ZXh0IjoiUHJvcGVydGllcyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UucHJvcGVydGllcyJ9LAorICAgICAgICAgICAgeyJ0ZXh0IjoiQ29tcG9zaXRpb24iLCAiYWN0aW9uIjoib25NZW51SXRlbVByZXNzZWQiLCAic3RhdGUiOiAid29ya3NwYWNlLmNvbXBvc2l0aW9uLmRldGFpbHMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkFjdGl2aXR5IExvZyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuYWN0aXZpdHlfbG9nIn0sCisgICAgICAgICAgICB7InRleHQiOiJEZXBsb3ltZW50IiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5kZXBsb3ltZW50In0sCisgICAgICAgICAgICB7InRleHQiOiJJbnB1dHMiLCAiYWN0aW9uIjoib25NZW51SXRlbVByZXNzZWQiLCAic3RhdGUiOiAid29ya3NwYWNlLnJlc291cmNlX2lucHV0cyJ9CisgICAgICAgIF0sCisgICAgICAgICJTRVJWSUNFIjpbCisgICAgICAgICAgICB7InRleHQiOiJHZW5lcmFsIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5nZW5lcmFsIn0sCisgICAgICAgICAgICB7InRleHQiOiJJY29uIiwgICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaWNvbnMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IlRPU0NBIEFydGlmYWN0cyIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UudG9zY2FfYXJ0aWZhY3RzIn0sCisgICAgICAgICAgICB7InRleHQiOiJDb21wb3NpdGlvbiIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuY29tcG9zaXRpb24uZGV0YWlscyJ9LAorICAgICAgICAgICAgeyJ0ZXh0IjoiQWN0aXZpdHkgTG9nIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5hY3Rpdml0eV9sb2cifSwKKyAgICAgICAgICAgIHsidGV4dCI6Ik1hbmFnZW1lbnQgV29ya2Zsb3ciLCAiYWN0aW9uIjoib25NZW51SXRlbVByZXNzZWQiLCAic3RhdGUiOiAid29ya3NwYWNlLm1hbmFnZW1lbnRfd29ya2Zsb3cifSwKKyAgICAgICAgICAgIHsidGV4dCI6Ik5ldHdvcmsgQ2FsbCBGbG93ICIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UubmV0d29ya19jYWxsX2Zsb3cifSwKKyAgICAgICAgICAgIHsidGV4dCI6Ik1vbml0b3IgIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5kaXN0cmlidXRpb24iLCAiZGlzYWJsZWRSb2xlcyI6IFsiQURNSU4iLCAiVEVTVEVSIiwgIkdPVkVSTk9SIiwgIkRFU0lHTkVSIiwgIlBST0RVQ1RfTUFOQUdFUiIsICJQUk9EVUNUX1NUUkFURUdJU1QiXX0sCisgICAgICAgICAgICB7InRleHQiOiJEZXBsb3ltZW50IiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5kZXBsb3ltZW50In0sCisgICAgICAgICAgICB7InRleHQiOiJJbnB1dHMiLCAiYWN0aW9uIjoib25NZW51SXRlbVByZXNzZWQiLCAic3RhdGUiOiAid29ya3NwYWNlLnNlcnZpY2VfaW5wdXRzIn0KKyAgICAgICAgXSwKKyAgICAgICAgIlBST0RVQ1QiOlsKKyAgICAgICAgICAgIHsidGV4dCI6IkdlbmVyYWwiLCAiYWN0aW9uIjoib25NZW51SXRlbVByZXNzZWQiLCAic3RhdGUiOiAid29ya3NwYWNlLmdlbmVyYWwifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkhpZXJhcmNoeSIsICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaGllcmFyY2h5In0sCisgICAgICAgICAgICB7InRleHQiOiJJY29uIiwgICJhY3Rpb24iOiJvbk1lbnVJdGVtUHJlc3NlZCIsICJzdGF0ZSI6ICJ3b3Jrc3BhY2UuaWNvbnMifSwKKyAgICAgICAgICAgIHsidGV4dCI6IkNvbXBvc2l0aW9uIiwgImFjdGlvbiI6Im9uTWVudUl0ZW1QcmVzc2VkIiwgInN0YXRlIjogIndvcmtzcGFjZS5jb21wb3NpdGlvbi5kZXRhaWxzIn0KKyAgICAgICAgXQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2NvbmZpZ3VyYXRpb25zL21vY2suanNvbiBiL2NhdGFsb2ctdWkvY29uZmlndXJhdGlvbnMvbW9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODM2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2NvbmZpZ3VyYXRpb25zL21vY2suanNvbgpAQCAtMCwwICsxLDE5MiBAQAoreworICAgICJzZGNDb25maWciOiB7CisgICAgICAgICJhcGkiOiB7CisgICAgICAgICAgICAiR0VUX3VzZXIiOiAiL3YxL3VzZXIvOmlkIiwKKyAgICAgICAgICAgICJHRVRfdXNlcl9hdXRob3JpemUiOiAiL3YxL3VzZXIvYXV0aG9yaXplIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2UiOiAiL3YxL3Jlc291cmNlLzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlc19jZXJ0aWZpZWRfbm90X2Fic3RyYWN0IjogIi92MS9jYXRhbG9nL3Jlc291cmNlcy9jZXJ0aWZpZWQvbm90YWJzdHJhY3QvOmlkIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VzX2NlcnRpZmllZF9hYnN0cmFjdCI6ICIvdjEvY2F0YWxvZy9yZXNvdXJjZXMvY2VydGlmaWVkL2Fic3RyYWN0LzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlX3Byb3BlcnR5IjogIi92MS86dHlwZS86ZW50aXR5SWQvcHJvcGVydHkvOmlkIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfYXJ0aWZhY3QiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL2FydGlmYWN0cy86aWQiLAorICAgICAgICAgICAgIkdFVF9zZXJ2aWNlX2FydGlmYWN0IjogIi92MS9jYXRhbG9nL3NlcnZpY2VzLzpzZXJ2aWNlSWQvYXJ0aWZhY3RzLzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlX2FydGlmYWN0X3R5cGVzIjogIi92MS9hcnRpZmFjdFR5cGVzIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfdmFsaWRhdGVfbmFtZSI6ICIvdjEvcmVzb3VyY2UvdmFsaWRhdGUtbmFtZS86bmFtZSIsCisgICAgICAgICAgICAiR0VUX3NlcnZpY2UiOiAiL3YxL2NhdGFsb2cvc2VydmljZXMvOmlkIiwKKyAgICAgICAgICAgICJHRVRfc2VydmljZV92YWxpZGF0ZV9uYW1lIjogIi92MS9jYXRhbG9nL3NlcnZpY2VzL3ZhbGlkYXRlLW5hbWUvOm5hbWUiLAorICAgICAgICAgICAgIkdFVF9zZXJ2aWNlX2Rpc3RyaWJ1dGlvbnMiOiIvdjEvY2F0YWxvZy9zZXJ2aWNlcy86dXVpZC9kaXN0cmlidXRpb24iLAorICAgICAgICAgICAgIkdFVF9zZXJ2aWNlX2Rpc3RyaWJ1dGlvbnNfY29tcG9uZW50cyI6Ii92MS9jYXRhbG9nL3NlcnZpY2VzL2Rpc3RyaWJ1dGlvbi86ZGlzdHJpYnV0aW9uSWQiLAorICAgICAgICAgICAgIlBPU1Rfc2VydmljZV9kaXN0cmlidXRpb25fZGVwbG95IiA6ICIvdjEvY2F0YWxvZy9zZXJ2aWNlcy86c2VydmljZUlkL2Rpc3RyaWJ1dGlvbi86ZGlzdHJpYnV0aW9uSWQvbWFya0RlcGxveWVkIiwKKyAgICAgICAgICAgICJHRVRfZWxlbWVudCI6ICIvdjEvZm9sbG93ZWQiLAorICAgICAgICAgICAgIkdFVF9jYXRhbG9nIjogIi92MS9zY3JlZW4iLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9jYXRlZ29yeSI6ICIvdjEvcmVzb3VyY2VDYXRlZ29yaWVzIiwKKyAgICAgICAgICAgICJHRVRfc2VydmljZV9jYXRlZ29yeSI6ICIvdjEvc2VydmljZUNhdGVnb3JpZXMiLAorICAgICAgICAgICAgInJlc291cmNlX2luc3RhbmNlIjogIi92MS9jYXRhbG9nL3NlcnZpY2VzLzpzZXJ2aWNlSWQvcmVzb3VyY2VJbnN0YW5jZS86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9pbnN0YW5jZV9wcm9wZXJ0eSI6ICIvdjEvY2F0YWxvZy9zZXJ2aWNlcy86c2VydmljZUlkL3Jlc291cmNlSW5zdGFuY2UvOnJlc291cmNlSW5zdGFuY2VJZC9wcm9wZXJ0eS86cHJvcGVydHlWYWx1ZUlkIiwKKyAgICAgICAgICAgICJHRVRfcmVsYXRpb25zaGlwIjogIi92MS9jYXRhbG9nL3NlcnZpY2VzLzpzZXJ2aWNlSWQvcmVzb3VyY2VJbnN0YW5jZS86YWN0aW9uIiwKKyAgICAgICAgICAgICJHRVRfbGlmZWN5Y2xlX3N0YXRlX3Jlc291cmNlIjogIi92MS9jYXRhbG9nLzp0eXBlLzppZC9saWZlY3ljbGVTdGF0ZS86YWN0aW9uIiwKKyAgICAgICAgICAgICJHRVRfbGlmZWN5Y2xlX3N0YXRlX0NIRUNLSU4iOiJsaWZlY3ljbGVTdGF0ZS9DSEVDS0lOIiwKKyAgICAgICAgICAgICJHRVRfbGlmZWN5Y2xlX3N0YXRlX0NFUlRJRklDQVRJT05SRVFVRVNUIjoibGlmZWN5Y2xlU3RhdGUvQ0VSVElGSUNBVElPTlJFUVVFU1QiLAorICAgICAgICAgICAgIkdFVF9saWZlY3ljbGVfc3RhdGVfVU5ET0NIRUNLT1VUIjoibGlmZWN5Y2xlU3RhdGUvVU5ET0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJyb290IjogImh0dHA6Ly9sb2NhbGhvc3Q6OTk5OSIKKyAgICAgICAgfSwKKyAgICAgICAgImxvZ0NvbmZpZyI6IHsKKyAgICAgICAgICAgICJtaW5Mb2dMZXZlbCI6ICJkZWJ1ZyIsCisgICAgICAgICAgICAicHJlZml4IjogInNkY0FwcCIKKyAgICAgICAgfSwKKyAgICAgICAgImNvb2tpZSI6IHsKKyAgICAgICAgICAgICJqdW5jdGlvbk5hbWUiOiAiSVZfSkNUIiwKKyAgICAgICAgICAgICJwcmVmaXgiOiAiQU1XRUJKQ1QhIiwKKyAgICAgICAgICAgICJ1c2VySWRTdWZmaXgiOiAiVVNFUl9JRCIsCisgICAgICAgICAgICAidXNlckZpcnN0TmFtZSI6ICJIVFRQX0NTUF9GSVJTVE5BTUUiLAorICAgICAgICAgICAgInVzZXJMYXN0TmFtZSI6ICJIVFRQX0NTUF9MQVNUTkFNRSIsCisgICAgICAgICAgICAidXNlckVtYWlsIjogIkhUVFBfQ1NQX0VNQUlMIiwKKyAgICAgICAgICAgICJ4RWNvbXBSZXF1ZXN0SWQiOiAiIFgtRUNPTVAtUmVxdWVzdElEIgorICAgICAgICB9LAorICAgICAgICAidXNlclR5cGVzIjogeworICAgICAgICAgICAgImFkbWluIjogeworICAgICAgICAgICAgICAgICJ1c2VySWQiOiAiamgwMDAzIiwKKyAgICAgICAgICAgICAgICAiZW1haWwiOiAibWFpbEBnbWFpbC5jb20iLAorICAgICAgICAgICAgICAgICJmaXJzdE5hbWUiOiAiSmltbXkiLAorICAgICAgICAgICAgICAgICJsYXN0TmFtZSI6ICJIZW5kcml4IiwKKyAgICAgICAgICAgICAgICAieEVjb21wUmVxdWVzdElkIjogImNjY2NjIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJkZXNpZ25lciI6IHsKKyAgICAgICAgICAgICAgICAidXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgImVtYWlsIjogImRlc2lnbmVyQHNkYy5jb20iLAorICAgICAgICAgICAgICAgICJmaXJzdE5hbWUiOiAiQ2FybG9zIiwKKyAgICAgICAgICAgICAgICAibGFzdE5hbWUiOiAiU2FudGFuYSIsCisgICAgICAgICAgICAgICAgInhFY29tcFJlcXVlc3RJZCI6ICJjY2NjYyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidGVzdGVyIjogeworICAgICAgICAgICAgICAgICJ1c2VySWQiOiAia2IwMDA0IiwKKyAgICAgICAgICAgICAgICAiZW1haWwiOiAidGVzdGVyQHNkYy5jb20iLAorICAgICAgICAgICAgICAgICJmaXJzdE5hbWUiOiAiS2F0ZSIsCisgICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIkJ1c2giLAorICAgICAgICAgICAgICAgICJ4RWNvbXBSZXF1ZXN0SWQiOiAiY2NjY2MiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImdvdmVybm9yIjogeworICAgICAgICAgICAgICAgICJ1c2VySWQiOiAiZ3YwMDAxIiwKKyAgICAgICAgICAgICAgICAiZW1haWwiOiAiZ292ZXJub3JAc2RjLmNvbSIsCisgICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJnb3ZlciIsCisgICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIm5vciIsCisgICAgICAgICAgICAgICAgInhFY29tcFJlcXVlc3RJZCI6ICJjY2NjYyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAib3BzIjogeworICAgICAgICAgICAgICAgICJ1c2VySWQiOiAib3AwMDAxIiwKKyAgICAgICAgICAgICAgICAiZW1haWwiOiAib3BzQHNkYy5jb20iLAorICAgICAgICAgICAgICAgICJmaXJzdE5hbWUiOiAib3AiLAorICAgICAgICAgICAgICAgICJsYXN0TmFtZSI6ICJzcyIsCisgICAgICAgICAgICAgICAgInhFY29tcFJlcXVlc3RJZCI6ICJjY2NjYyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicHJvZHVjdF9zdHJhdGVnaXN0IjogeworCQkJCSJ1c2VySWQiOiAicHMwMDAxIiwKKwkJCQkiZW1haWwiOiAicHJvZHVjdF9zdHJhdGVnaXN0QHNkYy5jb20iLAorCQkJCSJmaXJzdE5hbWUiOiAiT3JpdCIsCisJCQkJImxhc3ROYW1lIjogIkJhcmRhIiwKKwkJCQkieEVjb21wUmVxdWVzdElkIjogImNjY2NjIgorCQkJfSwKKyAgICAgICAgICAgICJwcm9kdWN0X21hbmFnZXIiOiB7CisgICAgICAgICAgICAgICAgInVzZXJJZCI6ICJwbTAwMDEiLAorICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwcm9kdWN0X21hbmFnZXJAc2RjLmNvbSIsCisgICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJPcml0IiwKKyAgICAgICAgICAgICAgICAibGFzdE5hbWUiOiAiQmFyZGEiLAorICAgICAgICAgICAgICAgICJ4RWNvbXBSZXF1ZXN0SWQiOiAiY2NjY2MiCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdGF0dXNlcyI6IHsKKyAgICAgICAgICAgICJpbkRlc2lnbiI6IHsKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJJbiBEZXNpZ24iLAorICAgICAgICAgICAgICAgICJ2YWx1ZXMiOiBbCisgICAgICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAgICAgIk5PVF9DRVJUSUZJRURfQ0hFQ0tJTiIKKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlYWR5Rm9yQ2VydGlmaWNhdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJSZWFkeSBmb3IgY2VydGlmaWNhdGlvbiIsCisgICAgICAgICAgICAgICAgInZhbHVlcyI6ICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiaW5DZXJ0aWZpY2F0aW9uIjogeworICAgICAgICAgICAgICAgICJuYW1lIjogIkluIENlcnRpZmljYXRpb24iLAorICAgICAgICAgICAgICAgICJ2YWx1ZXMiOiAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2VydGlmaWVkIjogeworICAgICAgICAgICAgICAgICJuYW1lIjogIkNlcnRpZmllZCIsCisgICAgICAgICAgICAgICAgInZhbHVlcyI6ICJDRVJUSUZJRUQiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImRpc3RyaWJ1dGVkIjogeworICAgICAgICAgICAgICAgICJuYW1lIjogIkRpc3RyaWJ1dGVkIiwKKyAgICAgICAgICAgICAgICAidmFsdWVzIjogIlRCRCIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImltYWdlc1BhdGgiOiAiIgorICAgIH0sCisgICAgInJvbGVzIjp7CisgICAgICAgICJBRE1JTiI6eworICAgICAgICAgICAgInBhZ2VzIjpbXSwKKyAgICAgICAgICAgICJzdGF0ZXMiOnsKKyAgICAgICAgICAgICAgICAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCI6WworICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJDaGVjayBpbiIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6IkNIRUNLSU4ifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiRWRpdCIgICAgLCJhY3Rpb24iOiJnb1RvRW50aXR5In0KKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iOlsKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiQ2hlY2sgb3V0IiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoiQ0hFQ0tPVVQifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiU3VibWl0IGZvciBUZXN0aW5nIiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoiY2VydGlmaWNhdGlvblJlcXVlc3QifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiUkVBRFlfRk9SX0NFUlRJRklDQVRJT04iOltdLAorICAgICAgICAgICAgICAgICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIjpbXSwKKyAgICAgICAgICAgICAgICAiQ0VSVElGSUVEIjpbXQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiREVTSUdORVIiOnsKKyAgICAgICAgICAgICJwYWdlcyI6WworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJzdGF0ZXMiOnsKKyAgICAgICAgICAgICAgICAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCI6WworICAgICAgICAgICAgICAgICAgICB7InRleHQiOiJFZGl0IiAgICAsImFjdGlvbiI6ImdvVG9FbnRpdHkifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiQ2hlY2sgaW4iLCJhY3Rpb24iOiJjaGFuZ2VMaWZlY3ljbGVTdGF0ZSIsICJ1cmwiOiJDSEVDS0lOIn0sCisgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlN1Ym1pdCBmb3IgVGVzdGluZyIsImFjdGlvbiI6ImNoYW5nZUxpZmVjeWNsZVN0YXRlIiwgInVybCI6ImNlcnRpZmljYXRpb25SZXF1ZXN0In0sCisgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJOT1RfQ0VSVElGSUVEX0NIRUNLSU4iOlsKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiQ2hlY2sgb3V0IiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoiQ0hFQ0tPVVQifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiU3VibWl0IGZvciBUZXN0aW5nIiwiYWN0aW9uIjoiY2hhbmdlTGlmZWN5Y2xlU3RhdGUiLCAidXJsIjoiY2VydGlmaWNhdGlvblJlcXVlc3QifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIjpbCisgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIjpbCisgICAgICAgICAgICAgICAgICAgIHsidGV4dCI6IlZpZXciICAgICwiYWN0aW9uIjoib3BlblZpZXdlck1vZGFsIn0KKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJDRVJUSUZJRUQiOlsKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXh0IjoiVmlldyIgICAgLCJhY3Rpb24iOiJvcGVuVmlld2VyTW9kYWwifQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorICAgICAgICAiVEVTVEVSIjp7CisgICAgICAgICAgICAicGFnZXMiOltdLAorICAgICAgICAgICAgIlJFQURZX0ZPUl9DRVJUSUZJQ0FUSU9OIjpbXSwKKyAgICAgICAgICAgICJDRVJUSUZJQ0FUSU9OX0lOX1BST0dSRVNTIjpbXSwKKyAgICAgICAgICAgICJDRVJUSUZJRUQiOltdCisKKyAgICAgICAgfSwKKyAgICAgICAgIk9QUyI6eworICAgICAgICAgICAgInBhZ2VzIjpbXSwKKyAgICAgICAgICAgICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI6W10sCisgICAgICAgICAgICAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyI6W10sCisgICAgICAgICAgICAiQ0VSVElGSUVEIjpbXQorCisgICAgICAgIH0sCisgICAgICAgICJHT1ZFUk5PUiI6eworICAgICAgICAgICAgInBhZ2VzIjpbXSwKKyAgICAgICAgICAgICJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiI6W10sCisgICAgICAgICAgICAiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyI6W10sCisgICAgICAgICAgICAiQ0VSVElGSUVEIjpbXQorCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL2NvbmZpZ3VyYXRpb25zL3Byb2QuanNvbiBiL2NhdGFsb2ctdWkvY29uZmlndXJhdGlvbnMvcHJvZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZTU3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL2NvbmZpZ3VyYXRpb25zL3Byb2QuanNvbgpAQCAtMCwwICsxLDQzMiBAQAoreworICAgICAgICAiZW52aXJvbm1lbnQiOiAicHJvZCIsCisgICAgICAgICJhcGkiOiB7CisKKyAgICAgICAgICAgICJHRVRfY29tcG9uZW50IjogIi92MS9jYXRhbG9nLzp0eXBlLzppZCIsCisgICAgICAgICAgICAiUFVUX2NvbXBvbmVudCI6ICIvdjEvY2F0YWxvZy86dHlwZS86aWQvbWV0YWRhdGEiLAorICAgICAgICAgICAgIkdFVF9jb21wb25lbnRfdmFsaWRhdGVfbmFtZSI6ICIvdjEvY2F0YWxvZy86dHlwZS92YWxpZGF0ZS1uYW1lLzpuYW1lIiwKKyAgICAgICAgICAgICJQT1NUX2NoYW5nZUxpZmVjeWNsZVN0YXRlIjogIi92MS9jYXRhbG9nLyIsCisgICAgICAgICAgICAiY29tcG9uZW50X2FwaV9yb290IjogIi92MS9jYXRhbG9nLyIsCisgICAgICAgICAgICAid2VsY29tZV9wYWdlX3ZpZGVvX3VybCI6ICJodHRwOi8vMC4wLjAuMDo4MjgyL21vdGkvbW92aWUiLAorCisgICAgICAgICAgICAiR0VUX3VzZXIiOiAiL3YxL3VzZXIvOmlkIiwKKyAgICAgICAgICAgICJHRVRfdXNlcl9hdXRob3JpemUiOiAiL3YxL3VzZXIvYXV0aG9yaXplIiwKKyAgICAgICAgICAgICJHRVRfYWxsX3VzZXJzIjogIi92MS91c2VyL3VzZXJzIiwKKyAgICAgICAgICAgICJQT1NUX2NyZWF0ZV91c2VyIjogIi92MS91c2VyIiwKKyAgICAgICAgICAgICJERUxFVEVfZGVsZXRlX3VzZXIiOiAiL3YxL3VzZXIvOmlkIiwKKyAgICAgICAgICAgICJQT1NUX2VkaXRfdXNlcl9yb2xlIjogIi92MS91c2VyLzppZC9yb2xlIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2UiOiAiL3YxL2NhdGFsb2cvcmVzb3VyY2VzLzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlc19sYXRlc3R2ZXJzaW9uX25vdGFic3RyYWN0IjoiL3YxL2NhdGFsb2cvOnR5cGUvbGF0ZXN0dmVyc2lvbi9ub3RhYnN0cmFjdC86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZXNfY2VydGlmaWVkX25vdF9hYnN0cmFjdCI6ICIvdjEvY2F0YWxvZy9yZXNvdXJjZXMvY2VydGlmaWVkL25vdGFic3RyYWN0LzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlc19jZXJ0aWZpZWRfYWJzdHJhY3QiOiAiL3YxL2NhdGFsb2cvcmVzb3VyY2VzL2NlcnRpZmllZC9hYnN0cmFjdC86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9wcm9wZXJ0eSI6ICIvdjEvY2F0YWxvZy86dHlwZS86ZW50aXR5SWQvcHJvcGVydGllcy86aWQiLAorICAgICAgICAgICAgIlBVVF9yZXNvdXJjZSI6ICIvdjEvY2F0YWxvZy9yZXNvdXJjZXMvOmlkL21ldGFkYXRhIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfYXJ0aWZhY3QiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL2FydGlmYWN0cy86aWQiLAorICAgICAgICAgICAgIkdFVF9kb3dubG9hZF9pbnN0YW5jZV9hcnRpZmFjdCI6ICIvdjEvY2F0YWxvZy86dHlwZS86ZW50aXR5SWQvcmVzb3VyY2VJbnN0YW5jZXMvOmluc3RhbmNlSWQvYXJ0aWZhY3RzLzppZCIsCisgICAgICAgICAgICAiUE9TVF9pbnN0YW5jZV9hcnRpZmFjdCI6ICIvdjEvY2F0YWxvZy86dHlwZS86ZW50aXR5SWQvcmVzb3VyY2VJbnN0YW5jZS86aW5zdGFuY2VJZC9hcnRpZmFjdHMvOmlkIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfYWRkaXRpb25hbF9pbmZvcm1hdGlvbiI6ICIvdjEvY2F0YWxvZy86dHlwZS86ZW50aXR5SWQvYWRkaXRpb25hbGluZm8vOmlkIiwKKyAgICAgICAgICAgICJHRVRfc2VydmljZV9hcnRpZmFjdCI6ICIvdjEvY2F0YWxvZy9zZXJ2aWNlcy86c2VydmljZUlkL2FydGlmYWN0cy86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9pbnRlcmZhY2VfYXJ0aWZhY3QiOiAiL3YxL2NhdGFsb2cvOnR5cGUvOmVudGl0eUlkL3N0YW5kYXJkLzpvcGVyYXRpb24vYXJ0aWZhY3RzLzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlX2FwaV9hcnRpZmFjdCI6ICIvdjEvY2F0YWxvZy86dHlwZS86ZW50aXR5SWQvYXJ0aWZhY3RzL2FwaS86aWQiLAorICAgICAgICAgICAgIkdFVF9jb25maWd1cmF0aW9uX3VpIjogIi92MS9jb25maWd1cmF0aW9uL3VpIiwKKyAgICAgICAgICAgICJHRVRfcmVzb3VyY2VfdmFsaWRhdGVfbmFtZSI6ICIvdjEvY2F0YWxvZy9yZXNvdXJjZXMvdmFsaWRhdGUtbmFtZS86bmFtZSIsCisgICAgICAgICAgICAiR0VUX2FjdGl2aXR5X2xvZyI6ICIvdjEvY2F0YWxvZy9hdWRpdC1yZWNvcmRzLzp0eXBlLzppZCIsCisgICAgICAgICAgICAiR0VUX3NlcnZpY2UiOiAiL3YxL2NhdGFsb2cvc2VydmljZXMvOmlkIiwKKyAgICAgICAgICAgICJHRVRfc2VydmljZV92YWxpZGF0ZV9uYW1lIjogIi92MS9jYXRhbG9nL3NlcnZpY2VzL3ZhbGlkYXRlLW5hbWUvOm5hbWUiLAorICAgICAgICAgICAgIkdFVF9zZXJ2aWNlX2Rpc3RyaWJ1dGlvbnMiOiIvdjEvY2F0YWxvZy9zZXJ2aWNlcy86dXVpZC9kaXN0cmlidXRpb24iLAorICAgICAgICAgICAgIkdFVF9zZXJ2aWNlX2Rpc3RyaWJ1dGlvbnNfY29tcG9uZW50cyI6Ii92MS9jYXRhbG9nL3NlcnZpY2VzL2Rpc3RyaWJ1dGlvbi86ZGlzdHJpYnV0aW9uSWQiLAorICAgICAgICAgICAgIlBPU1Rfc2VydmljZV9kaXN0cmlidXRpb25fZGVwbG95IiA6ICIvdjEvY2F0YWxvZy9zZXJ2aWNlcy86c2VydmljZUlkL2Rpc3RyaWJ1dGlvbi86ZGlzdHJpYnV0aW9uSWQvbWFya0RlcGxveWVkIiwKKyAgICAgICAgICAgICJHRVRfZWxlbWVudCI6ICIvdjEvZm9sbG93ZWQiLAorICAgICAgICAgICAgIkdFVF9jYXRhbG9nIjogIi92MS9zY3JlZW4iLAorICAgICAgICAgICAgIkdFVF9lY29tcF9tZW51X2l0ZW1zIjogIi92MS91c2VyLzp1c2VySWQvZnVuY3Rpb25hbG1lbnUiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9jYXRlZ29yeSI6ICIvdjEvcmVzb3VyY2VDYXRlZ29yaWVzIiwKKyAgICAgICAgICAgICJHRVRfc2VydmljZV9jYXRlZ29yeSI6ICIvdjEvc2VydmljZUNhdGVnb3JpZXMiLAorICAgICAgICAgICAgInJlc291cmNlX2luc3RhbmNlIjogIi92MS9jYXRhbG9nLzplbnRpdHlUeXBlLzplbnRpdHlJZC9yZXNvdXJjZUluc3RhbmNlLzppZCIsCisgICAgICAgICAgICAiR0VUX3Jlc291cmNlX2luc3RhbmNlX3Byb3BlcnR5IjogIi92MS9jYXRhbG9nLzp0eXBlLzplbnRpdHlJZC9yZXNvdXJjZUluc3RhbmNlLzpjb21wb25lbnRJbnN0YW5jZUlkL3Byb3BlcnR5Lzpwcm9wZXJ0eVZhbHVlSWQiLAorICAgICAgICAgICAgIkdFVF9yZWxhdGlvbnNoaXAiOiAiL3YxL2NhdGFsb2cvOmVudGl0eVR5cGUvOmVudGl0eUlkL3Jlc291cmNlSW5zdGFuY2UvOmFjdGlvbiIsCisgICAgICAgICAgICAiR0VUX2xpZmVjeWNsZV9zdGF0ZV9yZXNvdXJjZSI6ICIvdjEvY2F0YWxvZy86dHlwZS86aWQvbGlmZWN5Y2xlU3RhdGUvOmFjdGlvbiIsCisgICAgICAgICAgICAiR0VUX2xpZmVjeWNsZV9zdGF0ZV9DSEVDS0lOIjoibGlmZWN5Y2xlU3RhdGUvQ0hFQ0tJTiIsCisgICAgICAgICAgICAiR0VUX2xpZmVjeWNsZV9zdGF0ZV9DRVJUSUZJQ0FUSU9OUkVRVUVTVCI6ImxpZmVjeWNsZVN0YXRlL0NFUlRJRklDQVRJT05SRVFVRVNUIiwKKyAgICAgICAgICAgICJHRVRfbGlmZWN5Y2xlX3N0YXRlX1VORE9DSEVDS09VVCI6ImxpZmVjeWNsZVN0YXRlL1VORE9DSEVDS09VVCIsCisgICAgICAgICAgICAicm9vdCI6ICIvc2RjMS9mZVByb3h5L3Jlc3QiLAorICAgICAgICAgICAgIlBVVF9zZXJ2aWNlIjogIi92MS9jYXRhbG9nL3NlcnZpY2VzLzppZC9tZXRhZGF0YSIsCisgICAgICAgICAgICAiR0VUX2Rvd25sb2FkX2FydGlmYWN0IjogIi92MS9jYXRhbG9nLyIsCisgICAgICAgICAgICAiR0VUX1NEQ19WZXJzaW9uIjogIi92ZXJzaW9uIiwKKyAgICAgICAgICAgICJHRVRfY2F0ZWdvcmllcyI6ICIvdjEvY2F0ZWdvcmllcy86dHlwZXMiLAorICAgICAgICAgICAgIlBPU1RfY2F0ZWdvcnkiOiAiL3YxL2NhdGVnb3J5Lzp0eXBlcy86Y2F0ZWdvcnlJZCIsCisgICAgICAgICAgICAiUE9TVF9zdWJjYXRlZ29yeSI6ICIvdjEvY2F0ZWdvcnkvOnR5cGVzLzpjYXRlZ29yeUlkL3N1YkNhdGVnb3J5LzpzdWJDYXRlZ29yeUlkIiwKKyAgICAgICAgICAgICJQT1NUX2NoYW5nZV9pbnN0YW5jZV92ZXJzaW9uIjogIi92MS9jYXRhbG9nLzplbnRpdHlUeXBlLzplbnRpdHlJZC9yZXNvdXJjZUluc3RhbmNlLzppZC9jaGFuZ2VWZXJzaW9uIiwKKyAgICAgICAgICAgICJHRVRfcmVxdWlyZW1lbnRzX2NhcGFiaWxpdGllcyI6ICIvdjEvY2F0YWxvZy9yZXF1aXJtZW50c0NhcGFiaWxpdGllcy86dHlwZS86aWQiLAorICAgICAgICAgICAgIkdFVF9yZXNvdXJjZV9hcnRpZmFjdF90eXBlcyI6ICIvdjEvYXJ0aWZhY3RUeXBlcyIsCisgICAgICAgICAgICAiR0VUX3Byb2R1Y3RfY2F0YWxvZyI6ICIvdjEvcHJvZHVjdFNjcmVlbiIsCisgICAgICAgICAgICAiR0VUX3Byb2R1Y3RfY2F0ZWdvcnkiOiAiL3YxL3Byb2R1Y3RDYXRlZ29yaWVzIiwKKyAgICAgICAgICAgICJHRVRfcHJvZHVjdF9jYXRlZ29yeV90ZW1wIjogIi92MS9hcnRpZmFjdFR5cGVzIiwKKyAgICAgICAgICAgICJQT1NUX3Byb2R1Y3QiOiAiL3YxL2NhdGFsb2cvcHJvZHVjdHMvOmlkL21ldGFkYXRhIiwKKyAgICAgICAgICAgICJHRVRfcHJvZHVjdF92YWxpZGF0ZV9uYW1lIjogIi92MS9jYXRhbG9nL3NlcnZpY2VzL3ZhbGlkYXRlLW5hbWUvOm5hbWUiLAorICAgICAgICAgICAgIkdFVF9wcm9kdWN0IjogIi92MS9jYXRhbG9nL3Byb2R1Y3RzLzppZCIsCisgICAgICAgICAgICAiR0VUX3Byb2R1Y3Rfc3ViX2NhdGVnb3J5IjogIi92MS9wcm9kdWN0U3ViQ2F0ZWdvcmllcyIsCisgICAgICAgICAgICAiR0VUX29uYm9hcmRpbmciOiAiL3NkYzEvZmVQcm94eS9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cy9wYWNrYWdlcyIsCisgICAgICAgICAgICAiR0VUX2NvbXBvbmVudF9mcm9tX2NzYXJfdXVpZCI6ICIvdjEvY2F0YWxvZy9yZXNvdXJjZXMvY3Nhci86Y3Nhcl91dWlkIiwKKyAgICAgICAgICAgICJraWJhbmEiOiAiL3NkYzEva2liYW5hUHJveHkvIgorICAgICAgICB9LAorICAgICAgICAicmVzb3VyY2VUeXBlc0ZpbHRlciI6eworICAgICAgICAgICAgInJlc291cmNlIjpbIkNQIiwiVkZDIl0sCisgICAgICAgICAgICAic2VydmljZSI6WyJDUCIsIlZGIl0sCisgICAgICAgICAgICAicHJvZHVjdCI6W10KKyAgICAgICAgfSwKKyAgICAgICAgImxvZ0NvbmZpZyI6IHsKKyAgICAgICAgICAgICJtaW5Mb2dMZXZlbCI6ICJkZWJ1ZyIsCisgICAgICAgICAgICAicHJlZml4IjogInNkY0FwcCIKKyAgICAgICAgfSwKKyAgICAgICAgImNvb2tpZSI6IHsKKyAgICAgICAgICAgICJqdW5jdGlvbk5hbWUiOiAiSVZfSkNUIiwKKyAgICAgICAgICAgICJwcmVmaXgiOiAiQU1XRUJKQ1QhIiwKKyAgICAgICAgICAgICJ1c2VySWRTdWZmaXgiOiAiVVNFUl9JRCIsCisgICAgICAgICAgICAidXNlckZpcnN0TmFtZSI6ICJIVFRQX0NTUF9GSVJTVE5BTUUiLAorICAgICAgICAgICAgInVzZXJMYXN0TmFtZSI6ICJIVFRQX0NTUF9MQVNUTkFNRSIsCisgICAgICAgICAgICAidXNlckVtYWlsIjogIkhUVFBfQ1NQX0VNQUlMIiwKKyAgICAgICAgICAgICJ4RWNvbXBSZXF1ZXN0SWQiOiAiIFgtRUNPTVAtUmVxdWVzdElEIgorICAgICAgICB9LAorICAgICAgICAiaW1hZ2VzUGF0aCI6ICIvc2RjMSIsCisgICAgICAgICJjcEVuZFBvaW50SW5zdGFuY2VzIiA6IFsiY2xvdWRlcCIsIm9zc2VwIiwicGVyc29uZXAiLCJwcmVtaXNlc2VwIl0sCisgICAgICAgICJ0b3NjYUZpbGVFeHRlbnNpb24iOiJ5YW1sLHltbCIsCisgICAgICAgICJjc2FyRmlsZUV4dGVuc2lvbiI6ImNzYXIiLAorICAgICAgICAib3BlblNvdXJjZSI6IHRydWUsCisgICAgICAgICJjYXRlZ29yaWVzIjoge30sCisgICAgICAgICJ0ZXN0ZXJzIjogeworICAgICAgICAgICAgIlJFU09VUkNFIjogeworICAgICAgICAgICAgICAgICJOZXR3b3JrIEwyLTMiOiAiREwtQVNEQ0wxLTNSZXNvdXJjZUNlcnRpZmljYXRpb25UZWFtIiwKKyAgICAgICAgICAgICAgICAiTmV0d29yayBMNCsiOiAiREwtQVNEQ0w0LTdSZXNvdXJjZUNlcnRpZmljYXRpb25UZWFtIiwKKyAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gTDQrIjogIkRMLUFTRENMNC03UmVzb3VyY2VDZXJ0aWZpY2F0aW9uVGVhbSIsCisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiREwtQVNEQ0wxLTNSZXNvdXJjZUNlcnRpZmljYXRpb25UZWFtO0RMLUFTRENMNC03UmVzb3VyY2VDZXJ0aWZpY2F0aW9uVGVhbSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiU0VSVklDRSI6IHsKKyAgICAgICAgICAgICAgICAiTmV0d29yayBMMS0zIjogIkRMLUFTRENMMS00U2VydmljZUNlcnRpZmljYXRpb25UZWFtIiwKKyAgICAgICAgICAgICAgICAiTmV0d29yayBMNCsiOiAiREwtQVNEQ0w0LTdTZXJ2aWNlQ2VydGlmaWNhdGlvblRlYW0iLAorICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIkRMLUFTRENMMS00U2VydmljZUNlcnRpZmljYXRpb25UZWFtO0RMLUFTRENMNC03U2VydmljZUNlcnRpZmljYXRpb25UZWFtIgorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAicm9sZXMiOiBbIkFETUlOIiwgIlRFU1RFUiIsICJHT1ZFUk5PUiIsICJPUFMiLCAiREVTSUdORVIiLCAiUFJPRFVDVF9NQU5BR0VSIiwgIlBST0RVQ1RfU1RSQVRFR0lTVCJdLAorICAgICAgICAidHV0b3JpYWwiOiB7CisgICAgICAgICAgICAidGFicyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MSwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiJUVVRSSUFMX0dFTkVSQUxfVEFCXzEiLAorICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdFBhZ2UiOjEKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyLAorICAgICAgICAgICAgICAgICAgICAibmFtZSI6IlRVVFJJQUxfR0VORVJBTF9UQUJfMiIsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0UGFnZSI6OQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjMsCisgICAgICAgICAgICAgICAgICAgICJuYW1lIjoiVFVUUklBTF9HRU5FUkFMX1RBQl8zIiwKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRQYWdlIjoxMgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAicGFnZXMiOgorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAidGV4dC10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAxLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTFfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTFfVEVYVCIKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MiwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDEsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMl9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMl9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMi1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjMsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAxLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTNfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTNfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTMtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjo0LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMSwKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0U0X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0U0X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS00LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6NSwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDEsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFNV9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFNV9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtNS1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjYsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAxLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTZfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTZfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTYtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjo3LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMSwKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0U3X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0U3X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS03LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6OCwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDEsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFOF9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFOF9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtOC1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjksCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJ0ZXh0LXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDIsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFOV9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFOV9URVhUIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MTAsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAyLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTEwX1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UxMF9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMTAtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxMSwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDIsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTFfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTExX1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0xMS1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjEyLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAidGV4dC10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTEyX1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UxMl9URVhUIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MTMsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTEzX1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UxM19URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMTMtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxNCwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTRfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTE0X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0xNC1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjE1LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UxNV9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMTVfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTE1LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MTYsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTE2X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UxNl9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMTYtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoxNywKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMTdfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTE3X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0xNy1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjE4LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UxOF9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMThfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTE4LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MTksCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTE5X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UxOV9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMTktaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyMCwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMjBfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTIwX1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yMC1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjIxLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyMV9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMjFfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTIxLWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MjIsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTIyX1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UyMl9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMjItaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyMywKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMjNfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTIzX1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yMy1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjI0LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyNF9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMjRfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTI0LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MjUsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTI1X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UyNV9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMjUtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyNiwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMjZfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTI2X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yNi1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjI3LAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UyN19USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMjdfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTI3LWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpZCI6MjgsCisgICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZSI6ICJpbWFnZS10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ0YWIiOiAzLAorICAgICAgICAgICAgICAgICAgICAiZGF0YSI6eworICAgICAgICAgICAgICAgICAgICAgICAgInRpdGxlIjoiVFVUT1JJQUxfUEFHRTI4X1RJVExFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IlRVVE9SSUFMX1BBR0UyOF9URVhUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZUNsYXNzIjoic2RjLXR1dG9yaWFsLXBhZ2UtMjgtaW1hZ2UiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImlkIjoyOSwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBsYXRlIjogImltYWdlLXRlbXBsYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInRhYiI6IDMsCisgICAgICAgICAgICAgICAgICAgICJkYXRhIjp7CisgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiJUVVRPUklBTF9QQUdFMjlfVElUTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjoiVFVUT1JJQUxfUEFHRTI5X1RFWFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlQ2xhc3MiOiJzZGMtdHV0b3JpYWwtcGFnZS0yOS1pbWFnZSIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaWQiOjMwLAorICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiOiAiaW1hZ2UtdGVtcGxhdGUiLAorICAgICAgICAgICAgICAgICAgICAidGFiIjogMywKKyAgICAgICAgICAgICAgICAgICAgImRhdGEiOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IlRVVE9SSUFMX1BBR0UzMF9USVRMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiJUVVRPUklBTF9QQUdFMzBfVEVYVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2VDbGFzcyI6InNkYy10dXRvcmlhbC1wYWdlLTMwLWltYWdlIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBdCisgICAgICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9kb2NzL2NvbG9ycy5qcGcgYi9jYXRhbG9nLXVpL2RvY3MvY29sb3JzLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGMwMzhjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9kb2NzL2NvbG9ycy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9ub25fYm93ZXJfY29tcG9uZW50cy9jeXRvc2NhcGUuanMtZWRnZS1lZGl0YXRpb24vQ3l0b3NjYXBlRWRnZUVkaXRhdGlvbi5qcyBiL2NhdGFsb2ctdWkvbm9uX2Jvd2VyX2NvbXBvbmVudHMvY3l0b3NjYXBlLmpzLWVkZ2UtZWRpdGF0aW9uL0N5dG9zY2FwZUVkZ2VFZGl0YXRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3ZjE5YwotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvbm9uX2Jvd2VyX2NvbXBvbmVudHMvY3l0b3NjYXBlLmpzLWVkZ2UtZWRpdGF0aW9uL0N5dG9zY2FwZUVkZ2VFZGl0YXRpb24uanMKQEAgLTAsMCArMSw1NTQgQEAKKyhmdW5jdGlvbiAoc2NvcGUpIHsKKyAgICB2YXIgQ2xhc3MgPSBmdW5jdGlvbiAocGFyYW0xLCBwYXJhbTIpIHsKKworICAgICAgICB2YXIgZXh0ZW5kLCBtaXhpbnMsIGRlZmluaXRpb247CisgICAgICAgIGlmIChwYXJhbTIpIHsgICAgIC8vdHdvIHBhcmFtZXRlcnMgcGFzc2VkLCBmaXJzdCBpcyBleHRlbmRzLCBzZWNvbmQgZGVmaW5pdGlvbiBvYmplY3QKKyAgICAgICAgICAgIGV4dGVuZCA9IEFycmF5LmlzQXJyYXkocGFyYW0xKSA/IHBhcmFtMVswXSA6IHBhcmFtMTsKKyAgICAgICAgICAgIG1peGlucyA9IEFycmF5LmlzQXJyYXkocGFyYW0xKSA/IHBhcmFtMS5zbGljZSgxKSA6IG51bGw7CisgICAgICAgICAgICBkZWZpbml0aW9uID0gcGFyYW0yOworICAgICAgICB9IGVsc2UgeyAgICAgIC8vb25seSBvbmUgcGFyYW1ldGVyIHBhc3NlZCA9PiBubyBleHRlbmQsIG9ubHkgZGVmaW5pdGlvbgorICAgICAgICAgICAgZXh0ZW5kID0gbnVsbDsKKyAgICAgICAgICAgIGRlZmluaXRpb24gPSBwYXJhbTE7CisgICAgICAgIH0KKworCisgICAgICAgIHZhciBEZWZpbml0aW9uID0gZGVmaW5pdGlvbi5oYXNPd25Qcm9wZXJ0eSgiY29uc3RydWN0b3IiKSA/IGRlZmluaXRpb24uY29uc3RydWN0b3IgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIH07CisKKyAgICAgICAgRGVmaW5pdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGV4dGVuZCA/IGV4dGVuZC5wcm90b3R5cGUgOiBudWxsKTsKKyAgICAgICAgdmFyIHByb3BlcnRpZXNPYmplY3QgPSBkZWZpbml0aW9uLnByb3BlcnRpZXNPYmplY3QgPyBkZWZpbml0aW9uLnByb3BlcnRpZXNPYmplY3QgOiB7fTsKKyAgICAgICAgaWYgKG1peGlucykgeworICAgICAgICAgICAgdmFyIGksIGkyOworICAgICAgICAgICAgZm9yIChpIGluIG1peGlucykgeworICAgICAgICAgICAgICAgIGZvciAoaTIgaW4gbWl4aW5zW2ldLnByb3RvdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uLnByb3RvdHlwZVtpMl0gPSBtaXhpbnNbaV0ucHJvdG90eXBlW2kyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaTIgaW4gbWl4aW5zW2ldLnByb3RvdHlwZS5wcm9wZXJ0aWVzT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNPYmplY3RbaTJdID0gbWl4aW5zW2ldLnByb3RvdHlwZS5wcm9wZXJ0aWVzT2JqZWN0W2kyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBEZWZpbml0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzT2JqZWN0ID0gcHJvcGVydGllc09iamVjdDsKKworICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhEZWZpbml0aW9uLnByb3RvdHlwZSwgcHJvcGVydGllc09iamVjdCk7CisKKyAgICAgICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHsKKyAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBEZWZpbml0aW9uLnByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRGVmaW5pdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEZWZpbml0aW9uOworCisgICAgICAgIHJldHVybiBEZWZpbml0aW9uOworICAgIH07CisKKworICAgIHZhciBJbnRlcmZhY2UgPSBmdW5jdGlvbiAocHJvcGVydGllcykgeworICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgIH07CisKKyAgICB2YXIgSW50ZXJmYWNlRXhjZXB0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gIkludGVyZmFjZUV4Y2VwdGlvbiI7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgIiI7CisgICAgfTsKKworICAgIEludGVyZmFjZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKKworICAgIEludGVyZmFjZS5wcm90b3R5cGUuaW1wbGVtZW50cyA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKKyAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLnByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXRbdGhpcy5wcm9wZXJ0aWVzW2ldXSA9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJmYWNlRXhjZXB0aW9uKCJNaXNzaW5nIHByb3BlcnR5ICIgKyB0aGlzLnByb3BlcnRpZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH07CisKKyAgICBJbnRlcmZhY2UucHJvdG90eXBlLmRvZXNJbXBsZW1lbnQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7CisgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5wcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0W3RoaXMucHJvcGVydGllc1tpXV0gPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgdmFyIFZlY3Rvck1hdGggPSB7CisgICAgICAgIGRpc3RhbmNlOiBmdW5jdGlvbiAodmVjdG9yMSwgdmVjdG9yMikgeworICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh2ZWN0b3IxLnggLSB2ZWN0b3IyLngsIDIpICsgTWF0aC5wb3codmVjdG9yMS55IC0gdmVjdG9yMi55LCAyKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdmFyIEV2ZW50RGlzcGF0Y2hlciA9IENsYXNzKHsKKyAgICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRoaXMuZXZlbnRzID0ge307CisgICAgICAgIH0sCisgICAgICAgIG9uOiBmdW5jdGlvbiAobmFtZSwgbGlzdGVuZXIsIGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuZXZlbnRzW25hbWVdID0gdGhpcy5ldmVudHNbbmFtZV0gPyB0aGlzLmV2ZW50c1tuYW1lXSA6IFtdOworICAgICAgICAgICAgdGhpcy5ldmVudHNbbmFtZV0ucHVzaCh7CisgICAgICAgICAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLAorICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQKKyAgICAgICAgICAgIH0pCisgICAgICAgIH0sCisgICAgICAgIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBsaXN0ZW5lciwgY29udGV4dCkgeworICAgICAgICAgICAgdGhpcy5vZmYobmFtZSwgbGlzdGVuZXIsIGNvbnRleHQpOworICAgICAgICAgICAgdGhpcy5vbihuYW1lLCBsaXN0ZW5lciwgY29udGV4dCk7CisgICAgICAgIH0sCisgICAgICAgIG9mZjogZnVuY3Rpb24gKG5hbWUsIGxpc3RlbmVyLCBjb250ZXh0KSB7CisgICAgICAgICAgICAvL25vIGV2ZW50IHdpdGggdGhpcyBuYW1lIHJlZ2lzdGVyZWQ/ID0+IGZpbmlzaAorICAgICAgICAgICAgaWYgKCF0aGlzLmV2ZW50c1tuYW1lXSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgewkJLy9zZWFyY2hpbmcgb25seSBmb3IgY2VydGFpbnMgbGlzdGVuZXJzCisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmV2ZW50c1tuYW1lXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ldmVudHNbbmFtZV1baV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQgfHwgdGhpcy5ldmVudHNbbmFtZV1baV0uY29udGV4dCA9PT0gY29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzW25hbWVdLnNwbGljZShpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzW25hbWVdOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbiAobmFtZSkgeworICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuZXZlbnRzW25hbWVdOworCisgICAgICAgICAgICBmb3IgKHZhciBpIGluIGxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5saXN0ZW5lci5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHNjb3BlLkN5dG9zY2FwZUVkZ2VFZGl0YXRpb24gPSBDbGFzcyh7CisKKyAgICAgICAgaW5pdDogZnVuY3Rpb24gKGN5LCBoYW5kbGVTaXplKSB7CisgICAgICAgICAgICB0aGlzLkRPVUJMRV9DTElDS19JTlRFUlZBTCA9IDMwMDsKKyAgICAgICAgICAgIHRoaXMuSEFORExFX1NJWkUgPSBoYW5kbGVTaXplID8gaGFuZGxlU2l6ZSA6IDU7CisgICAgICAgICAgICB0aGlzLkFSUk9XX0VORF9JRCA9ICJBUlJPV19FTkRfSUQiOworCisgICAgICAgICAgICB0aGlzLl9oYW5kbGVzID0ge307CisgICAgICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5faG92ZXIgPSBudWxsOworCisKKyAgICAgICAgICAgIHRoaXMuX2N5ID0gY3k7CisgICAgICAgICAgICB0aGlzLl8kY29udGFpbmVyID0gJChjeS5jb250YWluZXIoKSk7CisKKyAgICAgICAgICAgIHRoaXMuX2N5Lm9uKCdtb3VzZW92ZXIgdGFwJywgJ25vZGUnLCB0aGlzLl9tb3VzZU92ZXIuYmluZCh0aGlzKSk7CisgICAgICAgICAgICB0aGlzLl9jeS5vbignbW91c2VvdXQnLCAnbm9kZScsIHRoaXMuX21vdXNlT3V0LmJpbmQodGhpcykpOworCisgICAgICAgICAgICB0aGlzLl8kY29udGFpbmVyLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVybWFuZW50SGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLl9jbGVhcigpOworICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTsKKworICAgICAgICAgICAgdGhpcy5fJGNvbnRhaW5lci5vbignbW91c2VvdmVyJywgZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5faG92ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW91c2VPdmVyKHtjeVRhcmdldDogdGhpcy5faG92ZXJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LmJpbmQodGhpcykpOworCisgICAgICAgICAgICB0aGlzLl9jeS5vbigic2VsZWN0IiwgIm5vZGUiLCB0aGlzLl9yZWRyYXcuYmluZCh0aGlzKSkKKworICAgICAgICAgICAgdGhpcy5fY3kub24oIm1vdXNlZG93biIsICJub2RlIiwgZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIHRoaXMuX25vZGVDbGlja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CisKKyAgICAgICAgICAgIHRoaXMuX2N5Lm9uKCJtb3VzZXVwIiwgIm5vZGUiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fbm9kZUNsaWNrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CisKKyAgICAgICAgICAgIHRoaXMuX2N5Lm9uKCJyZW1vdmUiLCAibm9kZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9ob3ZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyKCk7CisgICAgICAgICAgICB9LmJpbmQodGhpcykpOworCisgICAgICAgICAgICB0aGlzLl9jeS5vbignc2hvd2hhbmRsZScsIGZ1bmN0aW9uIChjeSwgdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5wZXJtYW5lbnRIYW5kbGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dIYW5kbGVzKHRhcmdldCk7CisgICAgICAgICAgICB9LmJpbmQodGhpcykpOworCisgICAgICAgICAgICB0aGlzLl9jeS5vbignaGlkZWhhbmRsZXMnLCB0aGlzLl9oaWRlSGFuZGxlcy5iaW5kKHRoaXMpKTsKKworICAgICAgICAgICAgdGhpcy5fY3kuYmluZCgnem9vbSBwYW4nLCB0aGlzLl9yZWRyYXcuYmluZCh0aGlzKSk7CisKKworICAgICAgICAgICAgdGhpcy5fJGNhbnZhcyA9ICQoJzxjYW52YXM+PC9jYW52YXM+Jyk7CisgICAgICAgICAgICB0aGlzLl8kY2FudmFzLmNzcygidG9wIiwgMCk7CisgICAgICAgICAgICB0aGlzLl8kY2FudmFzLm9uKCJtb3VzZWRvd24iLCB0aGlzLl9tb3VzZURvd24uYmluZCh0aGlzKSk7CisgICAgICAgICAgICB0aGlzLl8kY2FudmFzLm9uKCJtb3VzZW1vdmUiLCB0aGlzLl9tb3VzZU1vdmUuYmluZCh0aGlzKSk7CisKKyAgICAgICAgICAgIHRoaXMuX2N0eCA9IHRoaXMuXyRjYW52YXNbMF0uZ2V0Q29udGV4dCgnMmQnKTsKKyAgICAgICAgICAgIHRoaXMuXyRjb250YWluZXIuY2hpbGRyZW4oImRpdiIpLmFwcGVuZCh0aGlzLl8kY2FudmFzKTsKKworICAgICAgICAgICAgJCh3aW5kb3cpLmJpbmQoJ21vdXNldXAnLCB0aGlzLl9tb3VzZVVwLmJpbmQodGhpcykpOworCisgICAgICAgICAgICAvKiQod2luZG93KS5iaW5kKCdyZXNpemUnLCB0aGlzLl9yZXNpemVDYW52YXMuYmluZCh0aGlzKSk7CisgICAgICAgICAgICAgJCh3aW5kb3cpLmJpbmQoJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUNhbnZhcy5iaW5kKHRoaXMpKTsqLworCisgICAgICAgICAgICB0aGlzLl9jeS5vbigicmVzaXplIiwgdGhpcy5fcmVzaXplQ2FudmFzLmJpbmQodGhpcykpOworCisgICAgICAgICAgICB0aGlzLl8kY29udGFpbmVyLmJpbmQoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVDYW52YXMoKTsKKyAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CisKKyAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZUNhbnZhcygpOworCisgICAgICAgICAgICB0aGlzLl9hcnJvd0VuZCA9IHRoaXMuX2N5LmFkZCh7CisgICAgICAgICAgICAgICAgZ3JvdXA6ICJub2RlcyIsCisgICAgICAgICAgICAgICAgZGF0YTogeworICAgICAgICAgICAgICAgICAgICAiaWQiOiB0aGlzLkFSUk9XX0VORF9JRCwKKyAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uIjoge3g6IDE1MCwgeTogMTUwfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0aGlzLl9hcnJvd0VuZC5jc3MoeworICAgICAgICAgICAgICAgICJvcGFjaXR5IjogMCwKKyAgICAgICAgICAgICAgICAnd2lkdGgnOiAwLjAwMDEsCisgICAgICAgICAgICAgICAgJ2hlaWdodCc6IDAuMDAwMQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfSwKKyAgICAgICAgcmVnaXN0ZXJIYW5kbGU6IGZ1bmN0aW9uIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGlmIChoYW5kbGUubm9kZVR5cGVOYW1lcykgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gaGFuZGxlLm5vZGVUeXBlTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVUeXBlTmFtZSA9IGhhbmRsZS5ub2RlVHlwZU5hbWVzW2ldOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVzW25vZGVUeXBlTmFtZV0gPSB0aGlzLl9oYW5kbGVzW25vZGVUeXBlTmFtZV0gfHwgW107CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZXNbbm9kZVR5cGVOYW1lXS5wdXNoKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVzWyIqIl0gPSB0aGlzLl9oYW5kbGVzWyIqIl0gfHwgW107CisgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlc1siKiJdLnB1c2goaGFuZGxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorICAgICAgICBfc2hvd0hhbmRsZXM6IGZ1bmN0aW9uICh0YXJnZXQpIHsKKyAgICAgICAgICAgIHZhciBub2RlVHlwZU5hbWUgPSB0YXJnZXQuZGF0YSgpLnR5cGU7CisgICAgICAgICAgICBpZiAobm9kZVR5cGVOYW1lKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgaGFuZGxlcyA9IHRoaXMuX2hhbmRsZXNbbm9kZVR5cGVOYW1lXSA/IHRoaXMuX2hhbmRsZXNbbm9kZVR5cGVOYW1lXSA6IHRoaXMuX2hhbmRsZXNbIioiXTsKKworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gaGFuZGxlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlc1tpXS50eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdIYW5kbGUoaGFuZGxlc1tpXSwgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorICAgICAgICBfY2xlYXI6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHcgPSB0aGlzLl8kY29udGFpbmVyLndpZHRoKCk7CisgICAgICAgICAgICB2YXIgaCA9IHRoaXMuXyRjb250YWluZXIuaGVpZ2h0KCk7CisgICAgICAgICAgICB0aGlzLl9jdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpOworICAgICAgICB9LAorICAgICAgICBfZHJhd0hhbmRsZTogZnVuY3Rpb24gKGhhbmRsZSwgdGFyZ2V0KSB7CisKKyAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuX2dldEhhbmRsZVBvc2l0aW9uKGhhbmRsZSwgdGFyZ2V0KTsKKworICAgICAgICAgICAgdGhpcy5fY3R4LmJlZ2luUGF0aCgpOworCisgICAgICAgICAgICBpZiAoaGFuZGxlLmltYWdlVXJsKSB7CisgICAgICAgICAgICAgICAgdmFyIGJhc2VfaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICBiYXNlX2ltYWdlLnNyYyA9IGhhbmRsZS5pbWFnZVVybDsKKyAgICAgICAgICAgICAgICB0aGlzLl9jdHguZHJhd0ltYWdlKGJhc2VfaW1hZ2UsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHRoaXMuSEFORExFX1NJWkUsIHRoaXMuSEFORExFX1NJWkUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9jdHguYXJjKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHRoaXMuSEFORExFX1NJWkUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IGhhbmRsZS5jb2xvcjsKKyAgICAgICAgICAgICAgICB0aGlzLl9jdHguc3Ryb2tlU3R5bGUgPSAid2hpdGUiOworICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5saW5lV2lkdGggPSAwOworICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5maWxsKCk7CisgICAgICAgICAgICAgICAgdGhpcy5fY3R4LnN0cm9rZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisgICAgICAgIF9kcmF3QXJyb3c6IGZ1bmN0aW9uIChmcm9tTm9kZSwgdG9Qb3NpdGlvbiwgaGFuZGxlKSB7CisgICAgICAgICAgICB2YXIgdG9Ob2RlOworICAgICAgICAgICAgaWYgKHRoaXMuX2hvdmVyKSB7CisgICAgICAgICAgICAgICAgdG9Ob2RlID0gdGhpcy5faG92ZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuX2Fycm93RW5kLnJlbmRlcmVkUG9zaXRpb24odG9Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgdG9Ob2RlID0gdGhpcy5fYXJyb3dFbmQ7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHRoaXMuX2VkZ2UpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9lZGdlLnJlbW92ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLl9lZGdlID0gdGhpcy5fY3kuYWRkKHsKKyAgICAgICAgICAgICAgICBncm91cDogImVkZ2VzIiwKKyAgICAgICAgICAgICAgICBkYXRhOiB7CisgICAgICAgICAgICAgICAgICAgIGlkOiAiZWRnZSIsCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnJvbU5vZGUuaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0b05vZGUuaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RlbXBvcmFyeS1saW5rJworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgY3NzOiAkLmV4dGVuZCgKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RWRnZUNTU0J5SGFuZGxlKGhhbmRsZSksCisgICAgICAgICAgICAgICAgICAgIHtvcGFjaXR5OiAwLjV9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfSwKKyAgICAgICAgX2NsZWFyQXJyb3c6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9lZGdlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fZWRnZS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9lZGdlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgX3Jlc2l6ZUNhbnZhczogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdGhpcy5fJGNhbnZhcworICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLl8kY29udGFpbmVyLmhlaWdodCgpKQorICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuXyRjb250YWluZXIud2lkdGgoKSkKKyAgICAgICAgICAgICAgICAuY3NzKHsKKyAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2Fic29sdXRlJywKKyAgICAgICAgICAgICAgICAgICAgJ3otaW5kZXgnOiAnOTk5JworICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9LAorICAgICAgICBfbW91c2VEb3duOiBmdW5jdGlvbiAoZSkgeworICAgICAgICAgICAgdGhpcy5faGl0ID0gdGhpcy5faGl0VGVzdEhhbmRsZXMoZSk7CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9oaXQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9sYXN0Q2xpY2sgPSBEYXRlLm5vdygpOworICAgICAgICAgICAgICAgIHRoaXMuX2RyYWdnaW5nID0gdGhpcy5faG92ZXI7CisgICAgICAgICAgICAgICAgdGhpcy5faG92ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIF9oaWRlSGFuZGxlczogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdGhpcy5wZXJtYW5lbnRIYW5kbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuX2NsZWFyKCk7CisKKyAgICAgICAgICAgIGlmKHRoaXMuX2hvdmVyKXsKKyAgICAgICAgICAgICAgICB0aGlzLl9zaG93SGFuZGxlcyh0aGlzLl9ob3Zlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIF9tb3VzZVVwOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5faG92ZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5faGl0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgY3VzdG9tIGxpc3RlbmVyIHdhcyBwYXNzZWQsIGlmIHNvIHRyaWdnZXIgaXQgYW5kIGRvIG5vdCBhZGQgZWRnZQorICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fY3kuX3ByaXZhdGUubGlzdGVuZXJzOworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS50eXBlID09PSAnYWRkZWRnZW1vdXNldXAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3kudHJpZ2dlcignYWRkZWRnZW1vdXNldXAnLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5fZHJhZ2dpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcy5faG92ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2U6IHRoaXMuX2VkZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2RyYWdnaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2NsZWFyQXJyb3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5faGl0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGVkZ2VUb1JlbW92ZSA9IHRoaXMuX2NoZWNrU2luZ2xlRWRnZSh0aGlzLl9oaXQuaGFuZGxlLCB0aGlzLl9kcmFnZ2luZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlZGdlVG9SZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N5LnJlbW92ZSgiIyIgKyBlZGdlVG9SZW1vdmUuaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIGVkZ2UgPSB0aGlzLl9jeS5hZGQoeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5fZHJhZ2dpbmcuaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRoaXMuX2hvdmVyLmlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5faGl0LmhhbmRsZS50eXBlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0RWRnZUV2ZW50cyhlZGdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl9jeS50cmlnZ2VyKCdoYW5kbGVtb3VzZW91dCcsIHsKKyAgICAgICAgICAgICAgICBub2RlOiB0aGlzLl9ob3ZlcgorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAkKCJib2R5IikuY3NzKCJjdXJzb3IiLCAiaW5oZXJpdCIpOworICAgICAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuX2NsZWFyQXJyb3coKTsKKyAgICAgICAgfSwKKyAgICAgICAgX21vdXNlTW92ZTogZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl9ob3ZlcikgeworICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZHJhZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGhpdCA9IHRoaXMuX2hpdFRlc3RIYW5kbGVzKGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jeS50cmlnZ2VyKCdoYW5kbGVtb3VzZW92ZXInLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogdGhpcy5faG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgJCgiYm9keSIpLmNzcygiY3Vyc29yIiwgInBvaW50ZXIiKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3kudHJpZ2dlcignaGFuZGxlbW91c2VvdXQnLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogdGhpcy5faG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgJCgiYm9keSIpLmNzcygiY3Vyc29yIiwgImluaGVyaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJCgiYm9keSIpLmNzcygiY3Vyc29yIiwgImluaGVyaXQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdnaW5nICYmIHRoaXMuX2hpdC5oYW5kbGUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9kcmF3QXJyb3codGhpcy5fZHJhZ2dpbmcsIHRoaXMuX2dldFJlbGF0aXZlUG9zaXRpb24oZSksIHRoaXMuX2hpdC5oYW5kbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5fbm9kZUNsaWNrZWQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBfbW91c2VPdmVyOiBmdW5jdGlvbiAoZSkgeworCisgICAgICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAoIChlLmN5VGFyZ2V0LmlkKCkgIT0gdGhpcy5fZHJhZ2dpbmcuaWQoKSkgJiYgZS5jeVRhcmdldC5kYXRhKCkuYWxsb3dDb25uZWN0aW9uIHx8IHRoaXMuX2hpdC5oYW5kbGUuYWxsb3dMb29wKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hvdmVyID0gZS5jeVRhcmdldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuX2hvdmVyID0gZS5jeVRhcmdldDsKKyAgICAgICAgICAgICAgICB0aGlzLl9zaG93SGFuZGxlcyh0aGlzLl9ob3Zlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIF9tb3VzZU91dDogZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIGlmKCF0aGlzLl9kcmFnZ2luZykgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlcm1hbmVudEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuX2hvdmVyID0gbnVsbDsKKyAgICAgICAgfSwKKyAgICAgICAgX3JlbW92ZUVkZ2U6IGZ1bmN0aW9uIChlZGdlKSB7CisgICAgICAgICAgICBlZGdlLm9mZigibW91c2Vkb3duIik7CisgICAgICAgICAgICB0aGlzLl9jeS5yZW1vdmUoIiMiICsgZWRnZS5pZCgpKTsKKyAgICAgICAgfSwKKyAgICAgICAgX2luaXRFZGdlRXZlbnRzOiBmdW5jdGlvbiAoZWRnZSkgeworICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgICAgICAgZWRnZS5vbigibW91c2Vkb3duIiwgZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIGlmIChzZWxmLl9fbGFzdENsaWNrICYmIERhdGUubm93KCkgLSBzZWxmLl9fbGFzdENsaWNrIDwgc2VsZi5ET1VCTEVfQ0xJQ0tfSU5URVJWQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVtb3ZlRWRnZSh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5fX2xhc3RDbGljayA9IERhdGUubm93KCk7CisgICAgICAgICAgICB9KQorICAgICAgICB9LAorICAgICAgICBfaGl0VGVzdEhhbmRsZXM6IGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICB2YXIgbW91c2VQb2lzaXRpb24gPSB0aGlzLl9nZXRSZWxhdGl2ZVBvc2l0aW9uKGUpOworCisgICAgICAgICAgICBpZiAodGhpcy5faG92ZXIpIHsKKyAgICAgICAgICAgICAgICB2YXIgbm9kZVR5cGVOYW1lID0gdGhpcy5faG92ZXIuZGF0YSgpLnR5cGU7CisgICAgICAgICAgICAgICAgaWYgKG5vZGVUeXBlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlcyA9IHRoaXMuX2hhbmRsZXNbbm9kZVR5cGVOYW1lXSA/IHRoaXMuX2hhbmRsZXNbbm9kZVR5cGVOYW1lXSA6IHRoaXMuX2hhbmRsZXNbIioiXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGhhbmRsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBoYW5kbGVzW2ldOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl9nZXRIYW5kbGVQb3NpdGlvbihoYW5kbGUsIHRoaXMuX2hvdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWZWN0b3JNYXRoLmRpc3RhbmNlKHBvc2l0aW9uLCBtb3VzZVBvaXNpdGlvbikgPCB0aGlzLkhBTkRMRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIF9nZXRIYW5kbGVQb3NpdGlvbjogZnVuY3Rpb24gKGhhbmRsZSwgdGFyZ2V0KSB7CisgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0YXJnZXQucmVuZGVyZWRQb3NpdGlvbigpOworICAgICAgICAgICAgdmFyIHdpZHRoID0gdGFyZ2V0LnJlbmRlcmVkT3V0ZXJXaWR0aCgpOworICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRhcmdldC5yZW5kZXJlZE91dGVySGVpZ2h0KCk7CisgICAgICAgICAgICB2YXIgeHBvcyA9IG51bGw7CisgICAgICAgICAgICB2YXIgeXBvcyA9IG51bGw7CisKKyAgICAgICAgICAgIHN3aXRjaCAoaGFuZGxlLnBvc2l0aW9uWCkgeworICAgICAgICAgICAgICAgIGNhc2UgImxlZnQiOgorICAgICAgICAgICAgICAgICAgICB4cG9zID0gcG9zaXRpb24ueCAtIHdpZHRoIC8gMiArIHRoaXMuSEFORExFX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgInJpZ2h0IjoKKyAgICAgICAgICAgICAgICAgICAgeHBvcyA9IHBvc2l0aW9uLnggKyB3aWR0aCAvIDIgLSB0aGlzLkhBTkRMRV9TSVpFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJjZW50ZXIiOgorICAgICAgICAgICAgICAgICAgICB4cG9zID0gcG9zaXRpb24ueDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoaGFuZGxlLnBvc2l0aW9uWSkgeworICAgICAgICAgICAgICAgIGNhc2UgInRvcCI6CisgICAgICAgICAgICAgICAgICAgIHlwb3MgPSBwb3NpdGlvbi55IC0gaGVpZ2h0IC8gMiArIHRoaXMuSEFORExFX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgImNlbnRlciI6CisgICAgICAgICAgICAgICAgICAgIHlwb3MgPSBwb3NpdGlvbi55OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJib3R0b20iOgorICAgICAgICAgICAgICAgICAgICB5cG9zID0gcG9zaXRpb24ueSArIGhlaWdodCAvIDIgLSB0aGlzLkhBTkRMRV9TSVpFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG9mZnNldFggPSBoYW5kbGUub2Zmc2V0WCA/IGhhbmRsZS5vZmZzZXRYIDogMDsKKyAgICAgICAgICAgIHZhciBvZmZzZXRZID0gaGFuZGxlLm9mZnNldFkgPyBoYW5kbGUub2Zmc2V0WSA6IDA7CisgICAgICAgICAgICByZXR1cm4ge3g6IHhwb3MgKyBvZmZzZXRYLCB5OiB5cG9zICsgb2Zmc2V0WX07CisgICAgICAgIH0sCisgICAgICAgIF9nZXRFZGdlQ1NTQnlIYW5kbGU6IGZ1bmN0aW9uIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHZhciBjb2xvciA9IGhhbmRsZS5saW5lQ29sb3IgPyBoYW5kbGUubGluZUNvbG9yIDogaGFuZGxlLmNvbG9yOworICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAibGluZS1jb2xvciI6IGNvbG9yLAorICAgICAgICAgICAgICAgICJ0YXJnZXQtYXJyb3ctY29sb3IiOiBjb2xvciwKKyAgICAgICAgICAgICAgICAibGluZS1zdHlsZSI6IGhhbmRsZS5saW5lU3R5bGU/IGhhbmRsZS5saW5lU3R5bGU6ICdzb2xpZCcsCisgICAgICAgICAgICAgICAgIndpZHRoIjogaGFuZGxlLndpZHRoPyBoYW5kbGUud2lkdGggOiAzCisgICAgICAgICAgICB9OworICAgICAgICB9LAorICAgICAgICBfZ2V0SGFuZGxlQnlUeXBlOiBmdW5jdGlvbiAodHlwZSkgeworICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9oYW5kbGVzKSB7CisgICAgICAgICAgICAgICAgdmFyIGJ5Tm9kZVR5cGUgPSB0aGlzLl9oYW5kbGVzW2ldOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkyIGluIGJ5Tm9kZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGJ5Tm9kZVR5cGVbaTJdOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgX2dldFJlbGF0aXZlUG9zaXRpb246IGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICB2YXIgY29udGFpbmVyUG9zaXRpb24gPSB0aGlzLl8kY29udGFpbmVyLm9mZnNldCgpOworICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICB4OiBlLnBhZ2VYIC0gY29udGFpbmVyUG9zaXRpb24ubGVmdCwKKyAgICAgICAgICAgICAgICB5OiBlLnBhZ2VZIC0gY29udGFpbmVyUG9zaXRpb24udG9wCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIF9jaGVja1NpbmdsZUVkZ2U6IGZ1bmN0aW9uIChoYW5kbGUsIG5vZGUpIHsKKworICAgICAgICAgICAgaWYgKGhhbmRsZS5ub011bHRpZ3JhcGgpIHsKKyAgICAgICAgICAgICAgICB2YXIgZWRnZXMgPSB0aGlzLl9jeS5lZGdlcygiW3NvdXJjZT0nIiArIHRoaXMuX2hvdmVyLmlkKCkgKyAiJ11bdGFyZ2V0PSciICsgbm9kZS5pZCgpICsgIiddLFtzb3VyY2U9JyIgKyBub2RlLmlkKCkgKyAiJ11bdGFyZ2V0PSciICsgdGhpcy5faG92ZXIuaWQoKSArICInXSIpOworCisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWRnZXNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuc2luZ2xlID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFyIGVkZ2VzID0gdGhpcy5fY3kuZWRnZXMoIltzb3VyY2U9JyIgKyBub2RlLmlkKCkgKyAiJ10iKTsKKworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VzW2ldLmRhdGEoKVsidHlwZSJdID09IGhhbmRsZS50eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWRnZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIF9yZWRyYXc6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRoaXMuX2NsZWFyKCk7CisgICAgICAgICAgICBpZiAodGhpcy5faG92ZXIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9zaG93SGFuZGxlcyh0aGlzLl9ob3Zlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKKworfSkodGhpcyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9ub25fYm93ZXJfY29tcG9uZW50cy9jeXRvc2NhcGUuanMtZWRnZS1lZGl0YXRpb24vUkVBRE1FLm1kIGIvY2F0YWxvZy11aS9ub25fYm93ZXJfY29tcG9uZW50cy9jeXRvc2NhcGUuanMtZWRnZS1lZGl0YXRpb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWRjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL25vbl9ib3dlcl9jb21wb25lbnRzL2N5dG9zY2FwZS5qcy1lZGdlLWVkaXRhdGlvbi9SRUFETUUubWQKQEAgLTAsMCArMSw1OCBAQAorIyBjeXRvc2NhcGUuanMtZWRnZS1lZGl0YXRpb24KK0V4dGVuc2lvbiBmb3IgQ3l0b3NjYXBlLmpzLCB3aGljaCBhZGRzIGhhbmRsZXMgdG8gbm9kZXMgYW5kIGFsbG93cyB0byBjcmVhdGUgZGlmZmVyZW50IHR5cGVzIG9mIGVkZ2VzCisKKworIyMgRGVwZW5kZW5jaWVzCisKK0V4dGVuc2lvbiB3YXMgdGVzdGVkIHdpdGggdGhlc2UgdmVyc2lvbnMgb2YgbGlicmFyaWVzOgorCisqIGpRdWVyeSAyLjEuMQorKiBDeXRvc2NhcGUuanMgMi42LjAKKworIyMgSW5zdGFsbAorCitVc2UgZ2l0IGNsb25lIG9yIGRpcmVjdCB6aXAgZG93bmxvYWQgYW5kIHVucGFjayBhcmNoaXZlIGludG8geW91ciBwcm9qZWN0LiBUaGVuLCBzaW1wbHkgaW5zZXJ0IFw8c2NyaXB0XD4gdGFnIGFmdGVyCitDeXRvc2NhcGUuanMgYW5kIGpRdWVyeToKKworYGBgaHRtbAorPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjIuMC5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImN5dG9zY2FwZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iQ3l0b3NjYXBlRWRnZUVkaXRhdGlvbi5qcyI+PC9zY3JpcHQ+CitgYGAKKworIyMgSG93IHRvIHVzZQorCitGaXJzdCwgeW91IG5lZWQgdG8gaW5pdGlhbGl6ZSBleHRlbnNpb24uIEFmdGVyIGluaXRpYWxpemluZyBDeXRvc2NhcGUuanM6CisKK2BgYGpzCit2YXIgY3kgPSBjeXRvc2NhcGUoey4uLn0pOwordmFyIGhhbmRsZXMgPSBuZXcgQ3l0b3NjYXBlRWRnZUVkaXRhdGlvbjsKK2hhbmRsZXMuaW5pdChjeSk7CitgYGAKKworVGhlbiwgeW91IG5lZWQgdG8gcmVnaXN0ZXIgaGFuZGxlcyB0byBjZXJ0YWluIG5vZGUgdHlwZXM6CisKK2BgYGpzCitoYW5kbGVzLnJlZ2lzdGVySGFuZGxlKHsKKyAgICBwb3NpdGlvblg6ICJsZWZ0IiwgICAgICAgICAgLy9ob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgIChsZWZ0IHwgY2VudGVyIHwgcmlnaHQpCisgICAgcG9zaXRpb25ZOiAiY2VudGVyIiwgICAgICAgIC8vdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIGhhbmRsZSAgKHRvcCB8IGNlbnRlciB8IGJvdHRvbSkKKyAgICBjb2xvcjogIiM0OEZGMDAiLCAgICAgICAgICAgLy9jb2xvciBvZiB0aGUgaGFuZGxlIAorICAgIHR5cGU6ICJzb21lX3R5cGUiLCAgICAgICAgICAvL3N0b3JlZCBhcyBkYXRhKCkgYXR0cmlidXRlLCBjYW4gYmUgdXNlZCBmb3Igc3R5bGluZyAgICAgICAgICAgIAorICAgIHNpbmdsZTogdHJ1ZSwgICAgICAgICAgICAgICAvL3doZXRlciBvbmx5IG9uZSBlZGdlIG9mIHRoaXMgdHlwZSBjYW4gc3RhcnQgZnJvbSBzYW1lIG5vZGUgKGRlZmF1bHQgZmFsc2UpIAorICAgIG5vZGVUeXBlTmFtZXM6IFsidHlwZTIiXSAgICAvL3doaWNoIHR5cGVzIG9mIG5vZGVzIHdpbGwgY29udGFpbiB0aGlzIGhhbmRsZQorICAgIG5vTXVsdGlncmFwaDogZmFsc2UgICAgICAgICAvL3doZXJldGVyIHR3byBub2RlcyBjYW4ndCBiZSBjb25uZWN0ZWQgd2l0aCBtdWx0aXBsZSBlZGdlcyAoZG9lcyBub3QgY29uc2lkZXIgb3JpZW50YXRpb24pIAorfSk7CisKK2hhbmRsZXMucmVnaXN0ZXJIYW5kbGUoey4uLn0pOworaGFuZGxlcy5yZWdpc3RlckhhbmRsZSh7Li4ufSk7CitgYGAKKworVHlwZSBvZiBub2RlIGlzIHN0b3JlZCBpbiBkYXRhIHNlY3Rpb246CisKK2BgYGpzCitjeS5hZGQoeworICAgIGRhdGE6IHsgaWQ6ICduNCcsIHR5cGU6ICJ0eXBlMiJ9LAorfSk7CitgYGAKKyFbU2NyZWVuc2hvdF0oaHR0cDovL2kuaW1nYm94LmNvbS9kckN1WFFxdS5wbmcpCishW1NjcmVlbnNob3RdKGh0dHA6Ly9pLmltZ2JveC5jb20vMjNqcjdxUGEucG5nKQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9ub25fYm93ZXJfY29tcG9uZW50cy9jeXRvc2NhcGUuanMtZWRnZS1lZGl0YXRpb24vaW5kZXguaHRtbCBiL2NhdGFsb2ctdWkvbm9uX2Jvd2VyX2NvbXBvbmVudHMvY3l0b3NjYXBlLmpzLWVkZ2UtZWRpdGF0aW9uL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5ZmQzNgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvbm9uX2Jvd2VyX2NvbXBvbmVudHMvY3l0b3NjYXBlLmpzLWVkZ2UtZWRpdGF0aW9uL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwxNjkgQEAKKzwhZG9jdHlwZSBodG1sPgorPGh0bWwgbGFuZz0iY3MiPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgorICAgIDx0aXRsZT5DeXRvc2NhcGVFZGdlRWRpdGF0aW9uPC90aXRsZT4KKyAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMi4wLm1pbi5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9ImJvd2VyX2NvbXBvbmVudHMvY3l0b3NjYXBlL2Rpc3QvY3l0b3NjYXBlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iQ3l0b3NjYXBlRWRnZUVkaXRhdGlvbi5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdD4KKyAgICAgICAgJChmdW5jdGlvbigpeworICAgICAgICAgICAgLy9JTklUSUFMSVpBVElPTgorICAgICAgICAgICAgdmFyIGRvbUNvbnRhaW5lciA9ICQoIi5jeSIpOworICAgICAgICAgICAgdmFyIGN5ID0gY3l0b3NjYXBlKHsKKyAgICAgICAgICAgICAgICBjb250YWluZXI6IGRvbUNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBzdHlsZTogWworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT0idHlwZTEiXScsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyNGRkVCMTInLAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT0idHlwZTIiXScsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMyQ0U4RjInLAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2VkZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctc2hhcGUnOiAndHJpYW5nbGUnCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPSJkZWZhdWx0Il0nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGluZS1jb2xvcic6ICdncmVlbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICdncmVlbicsCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPSJ5ZXMiXScsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyM0OEZGMDAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzQ4RkYwMCcsCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPSJubyJdJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmUtY29sb3InOiAnI0VEMTAwMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjRUQxMDAwJywKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0pOworCisKKyAgICAgICAgICAgIHZhciBoYW5kbGVzID0gbmV3IEN5dG9zY2FwZUVkZ2VFZGl0YXRpb247CisgICAgICAgICAgICBoYW5kbGVzLmluaXQoY3kpOworCisgICAgICAgICAgICBoYW5kbGVzLnJlZ2lzdGVySGFuZGxlKHsKKyAgICAgICAgICAgICAgICBwb3NpdGlvblg6ICJjZW50ZXIiLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uWTogImJvdHRvbSIsCisgICAgICAgICAgICAgICAgY29sb3I6ICJncmVlbiIsCisgICAgICAgICAgICAgICAgdHlwZTogImRlZmF1bHQiLAorICAgICAgICAgICAgICAgIHNpbmdsZTogZmFsc2UsCisgICAgICAgICAgICAgICAgbm9kZVR5cGVOYW1lczogWyJ0eXBlMSJdCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaGFuZGxlcy5yZWdpc3RlckhhbmRsZSh7CisgICAgICAgICAgICAgICAgcG9zaXRpb25YOiAiY2VudGVyIiwKKyAgICAgICAgICAgICAgICBwb3NpdGlvblk6ICJ0b3AiLAorICAgICAgICAgICAgICAgIGNvbG9yOiAiZ3JlZW4iLAorICAgICAgICAgICAgICAgIHR5cGU6ICJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIG5vZGVUeXBlTmFtZXM6IFsidHlwZTEiXQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGhhbmRsZXMucmVnaXN0ZXJIYW5kbGUoeworICAgICAgICAgICAgICAgIHBvc2l0aW9uWDogImxlZnQiLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uWTogImNlbnRlciIsCisgICAgICAgICAgICAgICAgY29sb3I6ICJncmVlbiIsCisgICAgICAgICAgICAgICAgdHlwZTogImRlZmF1bHQiLAorICAgICAgICAgICAgICAgIHNpbmdsZTogZmFsc2UsCisgICAgICAgICAgICAgICAgbm9kZVR5cGVOYW1lczogWyJ0eXBlMSJdCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaGFuZGxlcy5yZWdpc3RlckhhbmRsZSh7CisgICAgICAgICAgICAgICAgcG9zaXRpb25YOiAicmlnaHQiLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uWTogImNlbnRlciIsCisgICAgICAgICAgICAgICAgY29sb3I6ICJncmVlbiIsCisgICAgICAgICAgICAgICAgdHlwZTogImRlZmF1bHQiLAorICAgICAgICAgICAgICAgIHNpbmdsZTogZmFsc2UsCisgICAgICAgICAgICAgICAgbm9kZVR5cGVOYW1lczogWyJ0eXBlMSJdCisgICAgICAgICAgICAgICAgLy8gIG5vTXVsdGlncmFwaDogdHJ1ZQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGhhbmRsZXMucmVnaXN0ZXJIYW5kbGUoeworICAgICAgICAgICAgICAgIHBvc2l0aW9uWDogImxlZnQiLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uWTogImNlbnRlciIsCisgICAgICAgICAgICAgICAgY29sb3I6ICIjNDhGRjAwIiwKKyAgICAgICAgICAgICAgICB0eXBlOiAieWVzIiwKKyAgICAgICAgICAgICAgICBzaW5nbGU6IHRydWUsCisgICAgICAgICAgICAgICAgbm9kZVR5cGVOYW1lczogWyJ0eXBlMiJdCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaGFuZGxlcy5yZWdpc3RlckhhbmRsZSh7CisgICAgICAgICAgICAgICAgcG9zaXRpb25YOiAicmlnaHQiLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uWTogImNlbnRlciIsCisgICAgICAgICAgICAgICAgY29sb3I6ICIjRUQxMDAwIiwKKyAgICAgICAgICAgICAgICB0eXBlOiAibm8iLAorICAgICAgICAgICAgICAgIHNpbmdsZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICBub2RlVHlwZU5hbWVzOiBbInR5cGUyIl0KKyAgICAgICAgICAgIH0pOworCisKKyAgICAgICAgICAgIC8vQUREIE5PREVTCisgICAgICAgICAgICBjeS5hZGQoeworICAgICAgICAgICAgICAgIGRhdGE6IHsgaWQ6ICduMScsIHR5cGU6ICJ0eXBlMSJ9LAorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGN5LmFkZCh7CisgICAgICAgICAgICAgICAgZGF0YTogeyBpZDogJ24yJywgdHlwZTogInR5cGUxIn0sCisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgY3kuYWRkKHsKKyAgICAgICAgICAgICAgICBkYXRhOiB7IGlkOiAnbjMnLCB0eXBlOiAidHlwZTEifSwKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBjeS5hZGQoeworICAgICAgICAgICAgICAgIGRhdGE6IHsgaWQ6ICduNCcsIHR5cGU6ICJ0eXBlMiJ9LAorICAgICAgICAgICAgfSk7CisKKworICAgICAgICAgICAgLy9BREpVU1QgSEVJR0hUCisgICAgICAgICAgICB2YXIgcmVzaXplVmlld3BvcnQgPSBmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICQoIi5jeSIpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGN5LnJlc2l6ZSgpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgJCh3aW5kb3cpLnJlc2l6ZShyZXNpemVWaWV3cG9ydCk7CisgICAgICAgICAgICByZXNpemVWaWV3cG9ydCgpOworCisgICAgICAgICAgICAvL0xBWU9VVAorICAgICAgICAgICAgY3kubGF5b3V0KHsKKyAgICAgICAgICAgICAgICBuYW1lOiAncmFuZG9tJywKKyAgICAgICAgICAgICAgICBmaXQ6IHRydWUsCisgICAgICAgICAgICAgICAgcGFkZGluZzogNDAsCisgICAgICAgICAgICAgICAgYm91bmRpbmdCb3g6ICB7eDE6IC0yMDAsIHkxOi0yMDAsIHgyOjMwMCwgeTI6IDIwMH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICA8L3NjcmlwdD4KKyAgICA8c3R5bGU+CisgICAgICAgICogeworICAgICAgICAgICAgcGFkZGluZzogMDsKKyAgICAgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgfQorICAgICAgICAuY3kgeworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKKyAgICAgICAgfQorICAgIDwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2IGNsYXNzPSJjeSI+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9wYWNrYWdlLmpzb24gYi9jYXRhbG9nLXVpL3BhY2thZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIyYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9wYWNrYWdlLmpzb24KQEAgLTAsMCArMSw2NyBAQAoreworICAibmFtZSI6ICJjYXRhbG9nLXVpIiwKKyAgImRlc2NyaXB0aW9uIjogIkFTREMgU2luZ2xlIHBhZ2UgYXBwbGljYXRpb24iLAorICAicmVwb3NpdG9yeSI6IHsKKyAgICAidHlwZSI6ICJnaXQiLAorICAgICJ1cmwiOiAiZ2l0QGdpdGxhYjpyb290L0QyLVNEbkMuZ2l0IgorICB9LAorICAiZGV2RGVwZW5kZW5jaWVzIjogeworICAgICJhcGFjaGUtc2VydmVyLWNvbmZpZ3MiOiAiXjIuNy4xIiwKKyAgICAiY29ycyI6ICIyLjcuMSIsCisgICAgImdydW50IjogIjEuMC4xIiwKKyAgICAiZ3J1bnQtYW5ndWxhci10ZW1wbGF0ZXMiOiAiMS4xLjAiLAorICAgICJncnVudC1hdXRvcHJlZml4ZXIiOiAiMy4wLjQiLAorICAgICJncnVudC1jb25jdXJyZW50IjogIjAuNS4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jbGVhbiI6ICIxLjAuMCIsCisgICAgImdydW50LWNvbnRyaWItY29uY2F0IjogIjEuMC4xIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25uZWN0IjogIjAuMTAuMSIsCisgICAgImdydW50LWNvbnRyaWItY29weSI6ICIxLjAuMCIsCisgICAgImdydW50LWNvbnRyaWItY3NzbWluIjogIjAuMTAuMCIsCisgICAgImdydW50LWNvbnRyaWItaHRtbG1pbiI6ICIyLjEuMCIsCisgICAgImdydW50LWNvbnRyaWItaW1hZ2VtaW4iOiAiMS4wLjEiLAorICAgICJncnVudC1jb250cmliLWpzaGludCI6ICIxLjEuMCIsCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogIjIuMC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi13YXRjaCI6ICIxLjAuMCIsCisgICAgImdydW50LWluY2x1ZGUtc291cmNlIjogIjEuMC4wIiwKKyAgICAiZ3J1bnQta2FybWEiOiAiMi4wLjAiLAorICAgICJncnVudC1tb2NoYSI6ICIxLjAuMiIsCisgICAgImdydW50LW5ld2VyIjogIjAuNy4wIiwKKyAgICAiZ3J1bnQtbmctY29uc3RhbnQiOiAiMS4xLjAiLAorICAgICJncnVudC1yZXYiOiAiMC4xLjAiLAorICAgICJncnVudC1zdmdtaW4iOiAiNC4wLjAiLAorICAgICJncnVudC10ZXh0LXJlcGxhY2UiOiAiMC40LjAiLAorICAgICJncnVudC10c2xpbnQiOiAiXjMuMy4wIiwKKyAgICAiZ3J1bnQtdXNlbWluIjogIjMuMS4xIiwKKyAgICAiZ3J1bnQtd2lyZWRlcCI6ICIyLjAuMCIsCisgICAgImh0dHAtcHJveHktbWlkZGxld2FyZSI6ICJeMC4xNC4wIiwKKyAgICAiamFzbWluZS1jb3JlIjogIjIuNS4yIiwKKyAgICAianNoaW50LXN0eWxpc2giOiAiMi4yLjEiLAorICAgICJrYXJtYSI6ICIxLjQuMCIsCisgICAgImthcm1hLWNocm9tZS1sYXVuY2hlciI6ICIwLjIuMiIsCisgICAgImthcm1hLWNvdmVyYWdlIjogIjEuMS4xIiwKKyAgICAia2FybWEtamFzbWluZSI6ICIxLjEuMCIsCisgICAgImthcm1hLWp1bml0LXJlcG9ydGVyIjogIjAuMy44IiwKKyAgICAia2FybWEtbW9jaGEtcmVwb3J0ZXIiOiAiMi4yLjIiLAorICAgICJrYXJtYS1uZy1odG1sMmpzLXByZXByb2Nlc3NvciI6ICIxLjAuMCIsCisgICAgImthcm1hLW5nLXNjZW5hcmlvIjogIjEuMC4wIiwKKyAgICAia2FybWEtcGhhbnRvbWpzLWxhdW5jaGVyIjogIjAuMi4xIiwKKyAgICAibG9hZC1ncnVudC10YXNrcyI6ICIzLjUuMiIsCisgICAgInBoYW50b21qcyI6ICIyLjEuNyIsCisgICAgInRpbWUtZ3J1bnQiOiAiMS40LjAiLAorICAgICJ0c2xpbnQiOiAiXjMuMTUuMSIKKyAgfSwKKyAgImVuZ2luZXMiOiB7CisgICAgIm5vZGUiOiAiPj02LjkuNCIKKyAgfSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiY3l0b3NjYXBlLmpzLXVuZG8tcmVkbyI6ICJeMS4wLjEiLAorICAgICJleHByZXNzIjogIjQuMTQuMCIsCisgICAgImdydW50LWFzc2V0LWluamVjdG9yIjogIjAuMS4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1sZXNzIjogIjEuNC4wIiwKKyAgICAiZ3J1bnQtZXhwcmVzcy1zZXJ2ZXIiOiAiMC41LjMiLAorICAgICJncnVudC10cyI6ICI1LjUuMSIsCisgICAgImdydW50LWh0bWwyanMiOiAiMC4zLjYiLAorICAgICJtdWx0ZXIiOiAiMS4yLjEiLAorICAgICJuZy1odG1sMmpzIjogIjIuMC4wIgorICB9Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3BvbS54bWwgYi9jYXRhbG9nLXVpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkMDQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvcG9tLnhtbApAQCAtMCwwICsxLDIzMSBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCTxhcnRpZmFjdElkPmNhdGFsb2ctdWk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNkYy1tYWluPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCisKKwk8YnVpbGQ+CisJCTxwbHVnaW5zPgorCisJCQk8IS0tICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQk8IS0tICBDbGVhbiB3ZWJhcHBzIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisJCQk8IS0tICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQk8cGx1Z2luPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWNsZWFuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjYuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jbGVhbi5mZS53ZWJhcHAuZm9sZGVyPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5pbml0aWFsaXplPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jbGVhbjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5wYXJlbnQuYmFzZWRpcn0vY2F0YWxvZy1mZS9zcmMvbWFpbi93ZWJhcHA8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+V0VCLUlORi8qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb2xsb3dTeW1saW5rcz5mYWxzZTwvZm9sbG93U3ltbGlua3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKworCisJCQk8cGx1Z2luPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPGlkPmNvcHktcmVzb3VyY2VzPC9pZD4KKwkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5jb3B5LXJlc291cmNlczwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5wYXJlbnQuYmFzZWRpcn0vY2F0YWxvZy1mZS9zcmMvbWFpbi93ZWJhcHA8L291dHB1dERpcmVjdG9yeT4KKwkJCQkJCQk8cmVzb3VyY2VzPgorCQkJCQkJCQk8cmVzb3VyY2U+CisJCQkJCQkJCQk8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS9hcHAvZGlzdDwvZGlyZWN0b3J5PgorCQkJCQkJCQkJPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorCQkJCQkJCQk8L3Jlc291cmNlPgorCQkJCQkJCTwvcmVzb3VyY2VzPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+CisKKworCisJPHByb2ZpbGVzPgorCQk8cHJvZmlsZT4KKwkJCTxpZD5DSTwvaWQ+CisJCQk8YWN0aXZhdGlvbj4KKwkJCQk8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisJCQk8L2FjdGl2YXRpb24+CisKKwkJCTxidWlsZD4KKwkJCQk8cGx1Z2lucz4KKwkJCQkJPHBsdWdpbj4KKwkJCQkJCTxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQk8dmVyc2lvbj4yLjc8L3ZlcnNpb24+CisJCQkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJCQk8aWQ+Y29weS1yZXNvdXJjZXM8L2lkPgorCQkJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJCTxnb2FsPmNvcHktcmVzb3VyY2VzPC9nb2FsPgorCQkJCQkJCQk8L2dvYWxzPgorCisJCQkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCQkJPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QucGFyZW50LmJhc2VkaXJ9L2NhdGFsb2ctZmUvc3JjL21haW4vd2ViYXBwPC9vdXRwdXREaXJlY3Rvcnk+CisJCQkJCQkJCQk8cmVzb3VyY2VzPgorCQkJCQkJCQkJCTxyZXNvdXJjZT4KKwkJCQkJCQkJCQkJPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vYXBwL2Rpc3Q8L2RpcmVjdG9yeT4KKwkJCQkJCQkJCQkJPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorCQkJCQkJCQkJCTwvcmVzb3VyY2U+CisJCQkJCQkJCQk8L3Jlc291cmNlcz4KKwkJCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQkJCTwvZXhlY3V0aW9uPgorCQkJCQkJPC9leGVjdXRpb25zPgorCQkJCQk8L3BsdWdpbj4KKworCisKKwkJCQkJPCEtLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJCQk8IS0tICBCdWlsZCB0aGUgVUkgbW9kdWxlIG5vZGUgY29kZSAgICAgICAgICAgICAgICAgLS0+CisJCQkJCTwhLS0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCQkJPHBsdWdpbj4KKwkJCQkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorCQkJCQkJPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQk8dmVyc2lvbj4xLjQuMDwvdmVyc2lvbj4KKwkJCQkJCTxleGVjdXRpb25zPgorCQkJCQkJCTxleGVjdXRpb24+CisJCQkJCQkJCTxpZD5leGVjdXRlIGdyYW50IGJ1aWxkPC9pZD4KKwkJCQkJCQkJPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorCQkJCQkJCQk8Z29hbHM+CisJCQkJCQkJCQk8Z29hbD5leGVjPC9nb2FsPgorCQkJCQkJCQk8L2dvYWxzPgorCisJCQkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCQkJPGV4ZWN1dGFibGU+Li9idWlsZF9jYXRhbG9nX3VpLnNoPC9leGVjdXRhYmxlPgorCQkJCQkJCQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC93b3JraW5nRGlyZWN0b3J5PgorCQkJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQkJPC9leGVjdXRpb24+CisJCQkJCQk8L2V4ZWN1dGlvbnM+CisJCQkJCTwvcGx1Z2luPgorCQkJCTwvcGx1Z2lucz4KKwkJCTwvYnVpbGQ+CisJCTwvcHJvZmlsZT4KKworCisKKwkJPHByb2ZpbGU+CisJCQk8aWQ+V0lORE9XU19PTkxZPC9pZD4KKwkJCTxhY3RpdmF0aW9uPgorCQkJCTxvcz4KKwkJCQkJPGZhbWlseT5XaW5kb3dzPC9mYW1pbHk+CisJCQkJPC9vcz4KKwkJCTwvYWN0aXZhdGlvbj4KKworCQkJPGJ1aWxkPgorCQkJCTxwbHVnaW5zPgorCQkJCQk8cGx1Z2luPgorCQkJCQkgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQkgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4wPC92ZXJzaW9uPgorCQkJCQkgIDxleGVjdXRpb25zPgorCQkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCSAgPGlkPmV4ZWN1dGUgZ3JhbnQgYnVpbGQ8L2lkPgorCQkJCQkJICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+CisJCQkJCQkgIDxnb2Fscz4KKwkJCQkJCQk8Z29hbD5leGVjPC9nb2FsPgorCQkJCQkJICA8L2dvYWxzPgorCQkJCQkJICA8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8ZXhlY3V0YWJsZT5idWlsZF9jYXRhbG9nX3VpLmJhdDwvZXhlY3V0YWJsZT4KKwkJCQkJCQk8d29ya2luZ0RpcmVjdG9yeT4ke2Jhc2VkaXJ9PC93b3JraW5nRGlyZWN0b3J5PgorCQkJCQkJICA8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQkJICA8L2V4ZWN1dGlvbnM+CisJCQkJCTwvcGx1Z2luPgorCQkJCTwvcGx1Z2lucz4KKwkJCTwvYnVpbGQ+CisJCTwvcHJvZmlsZT4KKworCisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm5vdC1taW5pZmllZDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisKKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjc8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1yZXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHktcmVzb3VyY2VzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LnBhcmVudC5iYXNlZGlyfS9jYXRhbG9nLWZlL3NyYy9tYWluL3dlYmFwcDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9L2FwcDwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5sYW5ndWFnZXMvKio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5zY3JpcHRzLyoqPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+c3R5bGVzLyoqPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+dGhpcmQtcGFydHkvKio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5pbmRleC5odG1sPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+cm9ib3RzLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmZhdmljb24ucG5nPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmJvd2VyX2NvbXBvbmVudHMvKio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCTwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL2FydGlmYWN0L2FydGlmYWN0LXR5cGVzLmpzb24gYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS9hcnRpZmFjdC9hcnRpZmFjdC10eXBlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Y2RhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS9hcnRpZmFjdC9hcnRpZmFjdC10eXBlcy5qc29uCkBAIC0wLDAgKzEsMjMgQEAKK1sKKyAgeworICAgICJuYW1lIjogIkNIRUYiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJQVVBQRVQiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJTSEVMTCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIllBTkciCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJIRUFUIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiQlBFTCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIkRHLVhNTCIKKyAgfQorXQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9tb2NrLWRhdGEvY2F0ZWdvcnkvY2F0ZWdvcnkuanNvbiBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL2NhdGVnb3J5L2NhdGVnb3J5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhYmI1MAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL2NhdGVnb3J5L2NhdGVnb3J5Lmpzb24KQEAgLTAsMCArMSw2NSBAQAorWworICB7CisgICAgIm5hbWUiOiAiSW5mcmFzdHJ1Y3R1cmUiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJEYXRhYmFzZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJXZWIgU2VydmVycyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIldlYiBBcHBsaWNhdGlvbnMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJOZXR3b3JrIEVsZW1lbnRzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiVm9JUCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIklNUyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIlNlY3VyaXR5IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiVmlkZW8iCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJNb2JpbGl0eSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIklvVCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIkJpZyBEYXRhIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiV0FOIENvbm5lY3Rpdml0eSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIkxBTiBDb25uZWN0aXZpdHkiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJDb21wdXRlIGFzIGEgU2VydmljZSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIlBsYXRmb3JtIGFzIGEgU2VydmljZSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIlN0b3JhZ2UgYXMgYSBTZXJ2aWNlIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiQ2FsbCBDb250cm9sIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiQ29sbGFib3JhdGlvbiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIk1lc3NhZ2luZyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIkFic3RyYWN0IgorICB9CitdCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS9lbGVtZW50L2VsZW1lbnQuanNvbiBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL2VsZW1lbnQvZWxlbWVudC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MWMwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS9lbGVtZW50L2VsZW1lbnQuanNvbgpAQCAtMCwwICsxLDI5MTUgQEAKK3sKKyAgICAicmVzb3VyY2VzIjogWworICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX2hnZGdnLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogImhnZGdnIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzU4MjU2NTI5NDYsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM1ODI1NjUyOTQ2LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImhmaGRnZmRnZmgiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJoZ2RnZyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuV2ViQXBwbGljYXRpb24iCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiYXBwX2VuZHBvaW50IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMud2ViYXBwbGljYXRpb24uMS4wLmFwcF9lbmRwb2ludCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLlJvb3QiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImhvc3QiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMud2ViYXBwbGljYXRpb24uMS4wLmhvc3QiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuV2ViU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJmaGdnaGYiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAiZmdnZiIsCisgICAgICAgICAgICAiY29udGFjdElkIjogImhnMTIzNCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19tYXJ0aW4yMjMuMC4xIiwKKyAgICAgICAgICAgICJyZXNvdXJjZU5hbWUiOiAibWFydGluMjIzIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzU4NDI0NjAwNTcsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM1ODQyNDYwMDU3LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2MiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJtYXJ0aW4yMjMiLAorICAgICAgICAgICAgICAgICJ0YWciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkRhdGFiYXNlcyIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLlJvb3QiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiT3JhY2xlIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMi41IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiQWwxMjM0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX21scmx2LjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogIm1scmx2IiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwNzk5MTYxNzIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MDc5OTE2MTcyLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIuKCrMKB4oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLCjcW9wo/CkOKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk8Kdxb7FuCDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqwtwq7Cr8KwwrHCssKzwrTCtcK24oCiwrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/IiwKKyAgICAgICAgICAgICJpY29uIjogImljb24tcmVkMiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAibWxybHZ0YWciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkRhdGFiYXNlcyIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLlJvb3QiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiT3JhY2xlIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMi40IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiQWwxMjM0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzXyUmKy0uMC4xIiwKKyAgICAgICAgICAgICJyZXNvdXJjZU5hbWUiOiAiJSYrLSIsCisgICAgICAgICAgICAicmVzb3VyY2VWZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MDc5OTc1NDQ1LAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA3OTk3NTQ0NSwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICIlJistJSYrLSUmKy0lJistJSYrLSUmKy0iLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICIlJistJSYrLSIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiRGF0YWJhc2VzIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuUm9vdCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImludGVyZmFjZXMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2FwYWJpbGl0aWVzIjogeworICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLlJvb3QiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICIlJistIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogIiUmKy0iLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJBbDEyMzQiLAorICAgICAgICAgICAgImFic3RyYWN0IjogZmFsc2UsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfMS4wLjEiLAorICAgICAgICAgICAgInJlc291cmNlTmFtZSI6ICIxIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwODAwMDIwOTEsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MDgwMDAyMDkxLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIjEiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICIxMSIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiRGF0YWJhc2VzIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuUm9vdCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImludGVyZmFjZXMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2FwYWJpbGl0aWVzIjogeworICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLlJvb3QiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICIxIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEiLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJBbDEyMzQiLAorICAgICAgICAgICAgImFic3RyYWN0IjogZmFsc2UsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfampqampqLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogImpqampqaiIsCisgICAgICAgICAgICAicmVzb3VyY2VWZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MDgwNDI1NDc1LAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA4MDQyNTQ3NSwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJoIiwKKyAgICAgICAgICAgICJpY29uIjogImljb24tcmVkMiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiampqampqIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDb2xsYWJvcmF0aW9uIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuV2ViU2VydmVyIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisgICAgICAgICAgICAgICAgIjEwIG51bWJlcnMgbGltaXQgcmVhY2hlZCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19qampqamouMC4xLjEwIG51bWJlcnMgbGltaXQgcmVhY2hlZCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiQ0hFRiIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiMTAgbnVtYmVycyBsaW1pdCByZWFjaGVkLnBuZyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwODEwMzg0MTcsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYwODEwMzg0MTcsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInJlc19qampqamouMC4xOjEwIG51bWJlcnMgbGltaXQgcmVhY2hlZC5wbmciLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAiMTAgbnVtYmVycyBsaW1pdCByZWFjaGVkIiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRzZnNkZnMiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLndlYnNlcnZlci4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImFkbWluX2VuZHBvaW50IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMud2Vic2VydmVyLjEuMC5hZG1pbl9lbmRwb2ludCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImRhdGFfZW5kcG9pbnQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy53ZWJzZXJ2ZXIuMS4wLmRhdGFfZW5kcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAgICAgICAgICAgImRlcGVuZGVuY3kiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZGVwZW5kZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJnIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogImYiLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJhYTEyMzQiLAorICAgICAgICAgICAgImFic3RyYWN0IjogZmFsc2UsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfcWZkc3kuMC4xIiwKKyAgICAgICAgICAgICJyZXNvdXJjZU5hbWUiOiAicWZkc3kiLAorICAgICAgICAgICAgInJlc291cmNlVmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjA4NDc0MzgyMSwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYwODQ3NDM4MjEsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi4oKswoHigJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFksKNxb3Cj8KQ4oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWTwp3FvsW4IMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrC3CrsKvwrDCscKywrPCtMK1wrbigKLCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w78iLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJxZmRzeXRhZyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiTWVzc2FnaW5nIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuUm9vdCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImludGVyZmFjZXMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2FwYWJpbGl0aWVzIjogeworICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLlJvb3QiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJPcmFjbGUiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAiMS4yLjQiLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJBbDEyMzQiLAorICAgICAgICAgICAgImFic3RyYWN0IjogZmFsc2UsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfbnFzdHcuMC4xIiwKKyAgICAgICAgICAgICJyZXNvdXJjZU5hbWUiOiAibnFzdHciLAorICAgICAgICAgICAgInJlc291cmNlVmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjA4NDc5ODk5OSwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYwODQ3OTg5OTksCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAi4oKswoHigJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFksKNxb3Cj8KQ4oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWTwp3FvsW4IMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrC3CrsKvwrDCscKywrPCtMK1wrbigKLCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w78iLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJucXN0d3RhZyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiV0FOIENvbm5lY3Rpdml0eSIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLlJvb3QiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiT3JhY2xlIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMi40IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiQWwxMjM0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3JmcGp4LjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogInJmcGp4IiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwODQ4NDQxNzksCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MDg0ODQ0MTc5LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIuKCrMKB4oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLCjcW9wo/CkOKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk8Kdxb7FuCDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqwtwq7Cr8KwwrHCssKzwrTCtcK24oCiwrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/IiwKKyAgICAgICAgICAgICJpY29uIjogImljb24tcmVkMiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAicmZwanh0YWciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIk1lc3NhZ2luZyIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLlJvb3QiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiT3JhY2xlIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMi40IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiQWwxMjM0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX21hcnRpbjIyLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogIm1hcnRpbjIyIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwOTM4NDczMTQsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MDkzODQ3MzE0LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2MiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJtYXJ0aW4yMiIsCisgICAgICAgICAgICAgICAgIm1hcnRpbjIydGFnIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJTZWN1cml0eSIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLlJvb3QiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKyAgICAgICAgICAgICAgICAiZ2l6bW9yYW1ibyI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19tYXJ0aW4yMi4wLjEuZ2l6bW9yYW1ibyIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiWUFORyIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiZ2l6bW9yYW1iby5qcGciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MDkzODU2OTMzLAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MDkzODU2OTMzLAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJyZXNfbWFydGluMjIuMC4xOmdpem1vcmFtYm8uanBnIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogImdpem1vcmFtYm8iLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQmxhQmxhIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAiVGVzdDEiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfbWFydGluMjIuMC4xLlRlc3QxIiwKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiOiAiMTAiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQmxhQmxhIiwKKyAgICAgICAgICAgICAgICAgICAgImNvbnN0cmFpbnRzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZU1pblZhbHVlIjogIjEwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlTWF4VmFsdWUiOiAiOTkwIgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiT3JhY2xlIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMi41IiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiQWwxMjM0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX2pramsuMC4xIiwKKyAgICAgICAgICAgICJyZXNvdXJjZU5hbWUiOiAiamtqayIsCisgICAgICAgICAgICAicmVzb3VyY2VWZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MDk1Mjg4NTQ4LAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA5NTI4ODU0OCwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJqa2praiIsCisgICAgICAgICAgICAiaWNvbiI6ICJpY29uLXJlZDIiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImpramsiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkJpZyBEYXRhIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuQ29udGFpbmVyLlJ1bnRpbWUiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLmNvbnRhaW5lci5ydW50aW1lLjEuMC5ob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJzY2FsYWJsZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLmNvbnRhaW5lci5ydW50aW1lLjEuMC5zY2FsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLlJvb3QiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImhvc3QiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMuc29mdHdhcmVjb21wb25lbnQuMS4wLmhvc3QiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuQ29tcHV0ZSIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiZ2dnZyIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJmZmZmZiIsCisgICAgICAgICAgICAiY29udGFjdElkIjogImZmMTIzNCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19idmJ2Y3hiLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogImJ2YnZjeGIiLAorICAgICAgICAgICAgInJlc291cmNlVmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjE2NDE4Mjg5MCwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYxNjQxODI4OTAsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAidmNiY3YiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJidmJ2Y3hiIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLndlYnNlcnZlci4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImFkbWluX2VuZHBvaW50IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMud2Vic2VydmVyLjEuMC5hZG1pbl9lbmRwb2ludCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImRhdGFfZW5kcG9pbnQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy53ZWJzZXJ2ZXIuMS4wLmRhdGFfZW5kcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAgICAgICAgICAgImRlcGVuZGVuY3kiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZGVwZW5kZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJ2Y2J4Y3ZiIiwKKyAgICAgICAgICAgICJ2ZW5kb3JSZWxlYXNlIjogImN2YnZjIiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAicXcxMjM0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3NkLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogInNkIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNTU0NDAwNDAsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MjU1NDQwMDQwLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlIiwKKyAgICAgICAgICAgICJpY29uIjogImljb24tcmVkMyIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAic2RkZSIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuUm9vdCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImludGVyZmFjZXMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2FwYWJpbGl0aWVzIjogeworICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLlJvb3QiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJkZWQiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAiZWRlIiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiZGQyMjIyIiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX21hcnRpbjIyMS4wLjEiLAorICAgICAgICAgICAgInJlc291cmNlTmFtZSI6ICJtYXJ0aW4yMjEiLAorICAgICAgICAgICAgInJlc291cmNlVmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI3NTMxMDkxMiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzUzMTA5MTIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzYyIsCisgICAgICAgICAgICAiaWNvbiI6ICJpY29uLXJlZDIiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgIm1hcnRpbjIyMSIsCisgICAgICAgICAgICAgICAgIm1hcnRpbjIyMXRhZyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiU2VjdXJpdHkiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLndlYnNlcnZlci4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImFkbWluX2VuZHBvaW50IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMud2Vic2VydmVyLjEuMC5hZG1pbl9lbmRwb2ludCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImRhdGFfZW5kcG9pbnQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy53ZWJzZXJ2ZXIuMS4wLmRhdGFfZW5kcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAgICAgICAgICAgImRlcGVuZGVuY3kiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZGVwZW5kZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJPcmFjbGUiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAiMS4yLjUiLAorICAgICAgICAgICAgImNvbnRhY3RJZCI6ICJBbDEyMzQiLAorICAgICAgICAgICAgImFic3RyYWN0IjogZmFsc2UsCisgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfZ2ZuZmdmLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogImdmbmZnZiIsCisgICAgICAgICAgICAicmVzb3VyY2VWZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2Mjc1NjU0MjUyLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI3NTY1NDI1MiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJoZmdoZmdoIiwKKyAgICAgICAgICAgICJpY29uIjogImljb24tcmVkMiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiZ2ZuZmdmIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLndlYnNlcnZlci4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImFkbWluX2VuZHBvaW50IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMud2Vic2VydmVyLjEuMC5hZG1pbl9lbmRwb2ludCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImRhdGFfZW5kcG9pbnQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy53ZWJzZXJ2ZXIuMS4wLmRhdGFfZW5kcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAgICAgICAgICAgImRlcGVuZGVuY3kiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZGVwZW5kZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJnZmhnZiIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJnZmhnZiIsCisgICAgICAgICAgICAiY29udGFjdElkIjogImdnMTIzNCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19kZGQuMC4xIiwKKyAgICAgICAgICAgICJyZXNvdXJjZU5hbWUiOiAiZGRkIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzMzgxMDU3MTEsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzM4MTA1NzExLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRzZmYiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQxIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJzZGRkIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJCaWcgRGF0YSIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiaW50ZXJmYWNlcyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXBhYmlsaXRpZXMiOiB7CisgICAgICAgICAgICAgICAgImZlYXR1cmUiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5mZWF0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAgICAgICAgICAgImRlcGVuZGVuY3kiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZGVwZW5kZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJzYWRmYXNkZiIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJhZHNmYWRzZiIsCisgICAgICAgICAgICAiY29udGFjdElkIjogImRzMjAwcCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19oaGRmZC4wLjEiLAorICAgICAgICAgICAgInJlc291cmNlTmFtZSI6ICJoaGRmZCIsCisgICAgICAgICAgICAicmVzb3VyY2VWZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzQyNDI0MDI1LAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM0MjQyNDAyNSwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJmZGhkZmZoIiwKKyAgICAgICAgICAgICJpY29uIjogImljb24tcmVkMiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiaGhkZmQiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkJpZyBEYXRhIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICAgICAgICAgICAidG9zY2Eubm9kZXMuUm9vdCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImludGVyZmFjZXMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2FwYWJpbGl0aWVzIjogeworICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmRlcGVuZGVuY3kiLAorICAgICAgICAgICAgICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLlJvb3QiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuRGVwZW5kc09uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJmZGhmZGRmaCIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJmZGhkZiIsCisgICAgICAgICAgICAiY29udGFjdElkIjogImZnMTIzNCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19pbmZvYmFlLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogImluZm9iYWUiLAorICAgICAgICAgICAgInJlc291cmNlVmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM0NjE4NTc0MywKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNDYxODU3NDMsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZXMgZWwiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJpbmZvYmFlIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJCaWcgRGF0YSIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLldlYkFwcGxpY2F0aW9uIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiaW50ZXJmYWNlcyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXBhYmlsaXRpZXMiOiB7CisgICAgICAgICAgICAgICAgImFwcF9lbmRwb2ludCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLndlYmFwcGxpY2F0aW9uLjEuMC5hcHBfZW5kcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJob3N0IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLndlYmFwcGxpY2F0aW9uLjEuMC5ob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLldlYlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiZmZmZiIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJmZmZmIiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAic3MxMjM0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX2RmLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogImRmIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNTI5ODA1NjQsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzUyOTgwNTY0LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogInNkZiIsCisgICAgICAgICAgICAiaWNvbiI6ICJpY29uLXJlZDIiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImRmc2RmIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJNZXNzYWdpbmciLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLndlYnNlcnZlci4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImFkbWluX2VuZHBvaW50IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMud2Vic2VydmVyLjEuMC5hZG1pbl9lbmRwb2ludCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImRhdGFfZW5kcG9pbnQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy53ZWJzZXJ2ZXIuMS4wLmRhdGFfZW5kcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAgICAgICAgICAgImRlcGVuZGVuY3kiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZGVwZW5kZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJzZGYiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAic2RmIiwKKyAgICAgICAgICAgICJjb250YWN0SWQiOiAiamg3NjU0IiwKKyAgICAgICAgICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX2RkZGRkLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogImRkZGRkIiwKKyAgICAgICAgICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNTMwMjE2MzcsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzUzMDIxNjM3LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRkc2QiLAorICAgICAgICAgICAgImljb24iOiAiaWNvbi1yZWQyIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJkZGRkZCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ29tcHV0ZSBhcyBhIFNlcnZpY2UiLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5Sb290IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisgICAgICAgICAgICAgICAgIm1pc2RldmljZXMiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfZGRkZGQuMC4xLm1pc2RldmljZXMiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlBVUFBFVCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAibWlzZGV2aWNlcy5kb2N4IiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM1MzAzNjE2MSwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM1MzAzNjE2MSwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAicmVzX2RkZGRkLjAuMTptaXNkZXZpY2VzLmRvY3giLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAibWlzZGV2aWNlcyIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJlZWVlZWUiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiZGZzZCIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICJkZGRkZCIsCisgICAgICAgICAgICAiY29udGFjdElkIjogInNzMTIzNCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc195by4wLjEiLAorICAgICAgICAgICAgInJlc291cmNlTmFtZSI6ICJ5byIsCisgICAgICAgICAgICAicmVzb3VyY2VWZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzY5MTQ1MzgyLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM2OTE0NTM4MiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZGRkIiwKKyAgICAgICAgICAgICJpY29uIjogImljb24tcmVkMiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAieW8iCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkNvbGxhYm9yYXRpb24iLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJTZXJ2ZXIiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJpbnRlcmZhY2VzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLndlYnNlcnZlci4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5XZWJBcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImFkbWluX2VuZHBvaW50IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMud2Vic2VydmVyLjEuMC5hZG1pbl9lbmRwb2ludCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJmZWF0dXJlIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS5yZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZmVhdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImRhdGFfZW5kcG9pbnQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy53ZWJzZXJ2ZXIuMS4wLmRhdGFfZW5kcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAgICAgICAgICAgImRlcGVuZGVuY3kiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXNfdG9zY2Eubm9kZXMucm9vdC4xLjAuZGVwZW5kZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICJyZWxhdGlvbnNoaXAiOiAidG9zY2EucmVsYXRpb25zaGlwcy5EZXBlbmRzT24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJkZHMiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAic3NzcyIsCisgICAgICAgICAgICAiY29udGFjdElkIjogInNzMTIzNCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc19tYXJ0aW4yMjEzLjAuMSIsCisgICAgICAgICAgICAicmVzb3VyY2VOYW1lIjogIm1hcnRpbjIyMTMiLAorICAgICAgICAgICAgInJlc291cmNlVmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM2OTIzMTU4MSwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNjkyMzE1ODEsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzYyIsCisgICAgICAgICAgICAiaWNvbiI6ICJpY29uLXJlZDIiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgIm1hcnRpbjIyMTMiLAorICAgICAgICAgICAgICAgICJtYXJ0aW4yMjEzdGFnIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJNZXNzYWdpbmciLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgICAgICAgICAgICJ0b3NjYS5ub2Rlcy5EQk1TIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiaW50ZXJmYWNlcyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXBhYmlsaXRpZXMiOiB7CisgICAgICAgICAgICAgICAgImhvc3QiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnJlc190b3NjYS5ub2Rlcy5kYm1zLjEuMC5ob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICAgICAgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICAgICAgICAgICAgICAgInRvc2NhLm5vZGVzLkRhdGFiYXNlIgorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiZmVhdHVyZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkucmVzX3Rvc2NhLm5vZGVzLnJvb3QuMS4wLmZlYXR1cmUiLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuTm9kZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICAgICAgICAgICAiZGVwZW5kZW5jeSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInJlc190b3NjYS5ub2Rlcy5yb290LjEuMC5kZXBlbmRlbmN5IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLk5vZGUiLAorICAgICAgICAgICAgICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Sb290IiwKKyAgICAgICAgICAgICAgICAgICAgInJlbGF0aW9uc2hpcCI6ICJ0b3NjYS5yZWxhdGlvbnNoaXBzLkRlcGVuZHNPbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJob3N0IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAicmVzX3Rvc2NhLm5vZGVzLnNvZnR3YXJlY29tcG9uZW50LjEuMC5ob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICAgICAgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLkNvbXB1dGUiLAorICAgICAgICAgICAgICAgICAgICAicmVsYXRpb25zaGlwIjogInRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24iCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJ2ZW5kb3JOYW1lIjogIk9yYWNsZSIsCisgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjIuNSIsCisgICAgICAgICAgICAiY29udGFjdElkIjogIkFsMTIzNCIsCisgICAgICAgICAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgfQorICAgIF0sCisgICAgInNlcnZpY2VzIjogWworICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfd2R1bWEuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJ3ZHVtYSIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjA4MTU4NzUwMCwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MDgxNTg3NTAwLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCTGEgQkxhIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJ3ZHVtYSIsCisgICAgICAgICAgICAgICAgICAgICJ3ZHVtYXRhZyIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJEYXRhYmFzZXMiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAid2R1bWEiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwODE1ODc1MDAsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkJMYSBCTGEiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgIndkdW1hIiwKKyAgICAgICAgICAgICAgICAid2R1bWF0YWciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y193ZHVtYS4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA4MTU4NzUwMCwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfci4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInIiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwODM0MzQxNzIsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA4MzQzNDE3MiwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiciIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAicnJyciIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJJb1QiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAiciIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjA4MzQzNDE3MiwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiciIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAicnJyciIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX3IuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYwODM0MzQxNzIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX290ZGl6LjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAib3RkaXoiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwOTQ4MTk2MTAsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA5NDgxOTYxMCwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQkxhIEJMYSIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAib3RkaXoiLAorICAgICAgICAgICAgICAgICAgICAib3RkaXp0YWciCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiUGxhdGZvcm0gYXMgYSBTZXJ2aWNlIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogIm90ZGl6IiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MDk0ODE5NjEwLAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCTGEgQkxhIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJvdGRpeiIsCisgICAgICAgICAgICAgICAgIm90ZGl6dGFnIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfb3RkaXouMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYwOTQ4MTk2MTAsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2d4a3ZsLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiZ3hrdmwiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwOTQ5OTI5NzIsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA5NDk5Mjk3MiwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQkxhIEJMYSIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiZ3hrdmwiLAorICAgICAgICAgICAgICAgICAgICAiZ3hrdmx0YWciCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiU2VjdXJpdHkiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAiZ3hrdmwiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwOTQ5OTI5NzIsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkJMYSBCTGEiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImd4a3ZsIiwKKyAgICAgICAgICAgICAgICAiZ3hrdmx0YWciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19neGt2bC4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA5NDk5Mjk3MiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfdGVzdHNlcnZpY2UuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJ0ZXN0U2VydmljZSIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjA5ODE1ODk0MiwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MDk4MTU4OTQyLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAidGFnMSIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm15SUNPTi5qcGciLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworICAgICAgICAgICAgICAgICJpbnN0YWxsX2FwYWNoZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y190ZXN0c2VydmljZS4wLjEuaW5zdGFsbF9hcGFjaGUiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlNIRUxMIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJpbnN0YWxsX2FwYWNoZS5zaCIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwOTgxOTUzMjgsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYwOTgxOTUzMjgsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y190ZXN0c2VydmljZS4wLjE6aW5zdGFsbF9hcGFjaGUuc2giLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAiaW5zdGFsbF9hcGFjaGUiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJEYXRhYmFzZXMiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAidGVzdFNlcnZpY2UiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYwOTgxNTg5NDIsCisgICAgICAgICAgICAiaWNvbiI6ICJteUlDT04uanBnIiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgInRhZzEiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y190ZXN0c2VydmljZS4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjA5ODE1ODk0MiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbmV3dGVzdHNlcnZpY2U1LjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibmV3VGVzdFNlcnZpY2U1IiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTExNDEyNjYwLAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYxMTE0MTI2NjAsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogInNlcnZpY2UgRGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgIm5ld1Rlc3RTZXJ2aWNlNSIsCisgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlVGFnIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkJpZyBEYXRhIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogIm5ld1Rlc3RTZXJ2aWNlNSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjExMTQxMjY2MCwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAic2VydmljZSBEZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAibmV3VGVzdFNlcnZpY2U1IiwKKyAgICAgICAgICAgICAgICAic2VydmljZVRhZyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX25ld3Rlc3RzZXJ2aWNlNS4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjExMTQxMjY2MCwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbmV3dGVzdHNlcnZpY2UuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJuZXdUZXN0U2VydmljZSIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjExNDQ2MzY2MCwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTE0NDYzNjYwLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJzZXJ2aWNlIERlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlVGFnIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibXlJY29uLmpwZyIsCisgICAgICAgICAgICAgICAgInZlbmRvck5hbWUiOiAiT3JhY2xlIiwKKyAgICAgICAgICAgICAgICAidmVuZG9yUmVsZWFzZSI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjb250YWN0SWQiOiAiYWwxOTc2IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJCaWcgRGF0YSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJuZXdUZXN0U2VydmljZSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjExNDQ2MzY2MCwKKyAgICAgICAgICAgICJpY29uIjogIm15SWNvbi5qcGciLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJzZXJ2aWNlIERlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJzZXJ2aWNlVGFnIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbmV3dGVzdHNlcnZpY2UuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYxMTQ0NjM2NjAsCisgICAgICAgICAgICAiY29udGFjdElkIjogImFsMTk3NiIsCisgICAgICAgICAgICAidmVuZG9yTmFtZSI6ICJPcmFjbGUiLAorICAgICAgICAgICAgInZlbmRvclJlbGVhc2UiOiAiMC4xIiwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfw6nDuMOiwqbCuS4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIsOpw7jDgsKmwrkiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYxNjg0ODE3MTIsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjE2ODQ4MTcxMiwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAic2VydmljZSBEZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiw6nDuMOCwqbCuSIsCisgICAgICAgICAgICAgICAgICAgICLDqcO4w4LCpsK5c2VydmljZVRhZyIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJCaWcgRGF0YSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICLDqcO4w4LCpsK5IiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTY4NDgxNzEyLAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJzZXJ2aWNlIERlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICLDqcO4w4LCpsK5IiwKKyAgICAgICAgICAgICAgICAiw6nDuMOCwqbCuXNlcnZpY2VUYWciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y1/DqcO4w6LCpsK5LjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTY4NDgxNzEyLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tbW1tLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibW1tbSIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjE3NTcyMTk4MCwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTc1NzIxOTgwLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJqampqIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJtbW1tIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworICAgICAgICAgICAgICAgICJTdWJ0aXRsZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tbW1tLjAuMS5TdWJ0aXRsZSIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiU0hFTEwiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogIlN1YnRpdGxlLnBuZyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYxODA0NDY4ODIsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYxODA0NDY4ODIsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19tbW1tLjAuMTpTdWJ0aXRsZS5wbmciLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAiU3VidGl0bGUiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGZkc3Nmc2QiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiMTAgbnVtYmVycyBsaW1pdCByZWFjaGVkIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX21tbW0uMC4xLjEwIG51bWJlcnMgbGltaXQgcmVhY2hlZCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiU0hFTEwiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogIjEwIG51bWJlcnMgbGltaXQgcmVhY2hlZC5wbmciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTc4MzIyMDk0LAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTc4MzIyMDk0LAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfbW1tbS4wLjE6MTAgbnVtYmVycyBsaW1pdCByZWFjaGVkLnBuZyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICIxMCBudW1iZXJzIGxpbWl0IHJlYWNoZWQiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiaGRmaGRmaGRkZiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJTY3JlZW5zaG90XzIwMTQtMDktMDgtMTMtMDctNDkiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbW1tbS4wLjEuU2NyZWVuc2hvdF8yMDE0LTA5LTA4LTEzLTA3LTQ5IiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJTSEVMTCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiU2NyZWVuc2hvdF8yMDE0LTA5LTA4LTEzLTA3LTQ5LnBuZyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYxODAzOTQ0ODYsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYxODAzOTQ0ODYsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19tbW1tLjAuMTpTY3JlZW5zaG90XzIwMTQtMDktMDgtMTMtMDctNDkucG5nIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIlNjcmVlbnNob3RfMjAxNC0wOS0wOC0xMy0wNy00OSIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJmZGdmZGdmZGciCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiU2xvdyB1cGxvYWQgIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX21tbW0uMC4xLlNsb3cgdXBsb2FkICIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiU0hFTEwiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogIlNsb3cgdXBsb2FkIC5wbmciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTgwNDkwNDY3LAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTgwNDkwNDY3LAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfbW1tbS4wLjE6U2xvdyB1cGxvYWQgLnBuZyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJTbG93IHVwbG9hZCAiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAic2RmZmRzZmRzIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgImltZzAwOSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tbW1tLjAuMS5pbWcwMDkiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlBVUFBFVCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiaW1nMDA5LmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYxNzgxMzU4NDMsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYxNzgxMzU4NDMsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19tbW1tLjAuMTppbWcwMDkuanBnIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogImltZzAwOSIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJoaGhoaCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJjYXNhMSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tbW1tLjAuMS5jYXNhMSIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiSEVBVCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiY2FzYTEuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjE4MDQyNDE1OSwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjE4MDQyNDE1OSwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX21tbW0uMC4xOmNhc2ExLkpQRyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJjYXNhMSIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJmZ3NkZnNkc2RmIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogIm1tbW0iLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYxNzU3MjE5ODAsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImpqamoiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgIm1tbW0iCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tbW1tLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTc1NzIxOTgwLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZ2ZkZ2RmZy4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImZnZmRnZGZnIiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTg5NzUwOTEzLAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYxODk3NTA5MTMsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZnZGZnZGYiLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImZnZmRnZGZnIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkRhdGFiYXNlcyIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJmZ2ZkZ2RmZyIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjE4OTc1MDkxMywKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmdkZmdkZiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiZmdmZGdkZmciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZ2ZkZ2RmZy4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjE4OTc1MDkxMywKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfanVqdXkuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJqdWp1eSIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjE5MDUxNTE1MSwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTkwNTE1MTUxLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJnZmhkZiIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAianVqdXlnZ2ciCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfMS0zIiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKyAgICAgICAgICAgICAgICAiU2VydmljZVBhbmVsIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2p1anV5LjAuMS5TZXJ2aWNlUGFuZWwiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlNIRUxMIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJTZXJ2aWNlUGFuZWwuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjE5MTEwOTMxNCwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjE5MTEwOTMxNCwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX2p1anV5LjAuMTpTZXJ2aWNlUGFuZWwuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIlNlcnZpY2VQYW5lbCIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZGRkZGRkZGRkZGRkZGRkZGRkIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIkljb25FbmQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfanVqdXkuMC4xLkljb25FbmQiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlBVUFBFVCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiSWNvbkVuZC5KUEciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTkwNTI4ODUyLAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTkwNTI4ODUyLAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfanVqdXkuMC4xOkljb25FbmQuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIkljb25FbmQiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmZmZmZmZiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJJY29uQ2VudGVyIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2p1anV5LjAuMS5JY29uQ2VudGVyIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJTSEVMTCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiSWNvbkNlbnRlci5KUEciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTkwNTg0NDQxLAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTkwNTg0NDQxLAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfanVqdXkuMC4xOkljb25DZW50ZXIuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIkljb25DZW50ZXIiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmZmZmYiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAidWRhdGVyZXNvdXJjZSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19qdWp1eS4wLjEudWRhdGVyZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiWUFORyIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAidWRhdGVyZXNvdXJjZS5KUEciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTkxMTMxMzEzLAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTkxMTMxMzEzLAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfanVqdXkuMC4xOnVkYXRlcmVzb3VyY2UuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogInVkYXRlcmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGRkZCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ0b29ib2xhciI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19qdWp1eS4wLjEudG9vYm9sYXIiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlNIRUxMIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJ0b29ib2xhci5KUEciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTkxMTQ2NDcxLAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTkxMTQ2NDcxLAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfanVqdXkuMC4xOnRvb2JvbGFyLkpQRyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJ0b29ib2xhciIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJzc3Nzc3Nzc3Nzc3Nzc3MiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDb2xsYWJvcmF0aW9uIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogImp1anV5IiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MTkwNTE1MTUxLAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzEtMyIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImdmaGRmIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJqdWp1eWdnZyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2p1anV5LjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MTkwNTE1MTUxLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tYXJ0aW4zOS4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1hcnRpbjM5IiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MjUyMzcxMDQxLAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNTIzNzEwNDEsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZmZmZmZmYiLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgIm1hcnRpbjM5IgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworICAgICAgICAgICAgICAgICJ0b29ib2xhciI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tYXJ0aW4zOS4wLjEudG9vYm9sYXIiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlNIRUxMIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJ0b29ib2xhci5KUEciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MjUyNDM0NDE1LAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MjUyNDM0NDE1LAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfbWFydGluMzkuMC4xOnRvb2JvbGFyLkpQRyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJ0b29ib2xhciIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJmZmZmIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ29tcHV0ZSBhcyBhIFNlcnZpY2UiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAibWFydGluMzkiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNTIzNzEwNDEsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZmZmZmZmYiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgIm1hcnRpbjM5IgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbWFydGluMzkuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNTIzNzEwNDEsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FzZGFzZC4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImFzZGFzZCIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI1MzE3NzY2OCwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MjUzMTc3NjY4LAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJhc2Rhc2QiLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImFzZGFzZCIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDb2xsYWJvcmF0aW9uIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogImFzZGFzZCIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI1MzE3NzY2OCwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiYXNkYXNkIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJhc2Rhc2QiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19hc2Rhc2QuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNTMxNzc2NjgsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2ZnZGZnZmQuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJmZ2RmZ2ZkIiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MjU1MjU4NDgxLAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNTUyNTg0ODEsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRmZ2RmZyIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiZmdkZmdmZCIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDb21wdXRlIGFzIGEgU2VydmljZSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJmZ2RmZ2ZkIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MjU1MjU4NDgxLAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZmdkZmciLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImZnZGZnZmQiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZ2RmZ2ZkLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MjU1MjU4NDgxLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZGdkLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiZmRnZCIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI1NzQyNzgyMSwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MjU3NDI3ODIxLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJmZGciLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImZkZ2QiCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJjYWxsX2NvbnRyb2xsIiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKyAgICAgICAgICAgICAgICAidG9vYm9sYXIiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfZmRnZC4wLjEudG9vYm9sYXIiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlNIRUxMIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJ0b29ib2xhci5KUEciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MjU3NjE0NzQ3LAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MjU3NjE0NzQ3LAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfZmRnZC4wLjE6dG9vYm9sYXIuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogInRvb2JvbGFyIiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRmc2Rmc2QiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDb21wdXRlIGFzIGEgU2VydmljZSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJmZGdkIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MjU3NDI3ODIxLAorICAgICAgICAgICAgImljb24iOiAiY2FsbF9jb250cm9sbCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZkZyIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiZmRnZCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2ZkZ2QuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNTc0Mjc4MjEsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2ZkZ2RmZ2ZkLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiZmRnZGZnZmQiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNjY2NTM3OTcsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI2NjY1Mzc5NywKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmRmZGdmIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJmZGdkZmdmZCIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKyAgICAgICAgICAgICAgICAiSU1HXzIwMTQxMjIyXzA3MjAyNyI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZGdkZmdmZC4wLjEuSU1HXzIwMTQxMjIyXzA3MjAyNyIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiU0hFTEwiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogIklNR18yMDE0MTIyMl8wNzIwMjcuanBnIiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI2Nzk3MDk5OSwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI2Nzk3MDk5OSwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX2ZkZ2RmZ2ZkLjAuMTpJTUdfMjAxNDEyMjJfMDcyMDI3LmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJJTUdfMjAxNDEyMjJfMDcyMDI3IiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkZFREYiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAiZmRnZGZnZmQiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNjY2NTM3OTcsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZkZmRnZiIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiZmRnZGZnZmQiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZGdkZmdmZC4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI2NjY1Mzc5NywKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfZmJndmRmYi4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImZiZ3ZkZmIiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNjczOTQ1OTYsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI2NzM5NDU5NiwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAic2RiZGJzIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJmYmd2ZGZiIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworICAgICAgICAgICAgICAgICJJTUdfMjAxNDA0MTNfMTg1NjIxIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2ZiZ3ZkZmIuMC4xLklNR18yMDE0MDQxM18xODU2MjEiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIllBTkciLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogIklNR18yMDE0MDQxM18xODU2MjEuanBnIiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI2NzcwMTQ2MSwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI2NzcwMTQ2MSwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX2ZiZ3ZkZmIuMC4xOklNR18yMDE0MDQxM18xODU2MjEuanBnIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIklNR18yMDE0MDQxM18xODU2MjEiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQUNTQ0EiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAiSU1HXzIwMTQwNDEzXzE4NTY0MyI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mYmd2ZGZiLjAuMS5JTUdfMjAxNDA0MTNfMTg1NjQzIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJDSEVGIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJJTUdfMjAxNDA0MTNfMTg1NjQzLmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNjc4NzE2MjgsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNjc4NzE2MjgsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19mYmd2ZGZiLjAuMTpJTUdfMjAxNDA0MTNfMTg1NjQzLmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJJTUdfMjAxNDA0MTNfMTg1NjQzIiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFTREZBV1NFIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogImZiZ3ZkZmIiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNjczOTQ1OTYsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogInNkYmRicyIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiZmJndmRmYiIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2ZiZ3ZkZmIuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNjczOTQ1OTYsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FzZGFzZHMuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJhc2Rhc2RzIiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MjY4OTcyMDU3LAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNjg5NzIwNTcsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImFzZGFzZGFzZCIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiYXNkYXNkcyIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDb2xsYWJvcmF0aW9uIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogImFzZGFzZHMiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNjg5NzIwNTcsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImFzZGFzZGFzZCIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiYXNkYXNkcyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FzZGFzZHMuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNjg5NzIwNTcsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2tra2trLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAia2tra2siLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNzE4NDg0MTYsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI3MTg0ODQxNiwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiaGdnaCIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAia2tra2siCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisgICAgICAgICAgICAgICAgImRlc3NhcGVyIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2tra2trLjAuMS5kZXNzYXBlciIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiU0hFTEwiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogImRlc3NhcGVyLkpQRyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNzE4NjYwMjUsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzE4NjYwMjUsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19ra2tray4wLjE6ZGVzc2FwZXIuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogImRlc3NhcGVyIiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZnZGYiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAia2tra2siLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNzE4NDg0MTYsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImhnZ2giLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImtra2trIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfa2tra2suMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzE4NDg0MTYsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FsZXguMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJhbGV4IiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2Mjc2NDgyOTc0LAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzY0ODI5NzQsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkJsYSBCbGEiLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImFsZXgiLAorICAgICAgICAgICAgICAgICAgICAiZGRkIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworICAgICAgICAgICAgICAgICJwZW5jaWwiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfYWxleC4wLjEucGVuY2lsIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJDSEVGIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJwZW5jaWwuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI3NjgxMDg5OCwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI3NjgxMDg5OCwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX2FsZXguMC4xOnBlbmNpbC5KUEciLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAicGVuY2lsIiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIm5rIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIldlYiBBY2Nlc3NpYmlsaXR5IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FsZXguMC4xLldlYiBBY2Nlc3NpYmlsaXR5IiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJIRUFUIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJXZWIgQWNjZXNzaWJpbGl0eS5wcHR4IiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI3NjY4OTk4NCwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI3NjY4OTk4NCwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX2FsZXguMC4xOldlYiBBY2Nlc3NpYmlsaXR5LnBwdHgiLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAiV2ViIEFjY2Vzc2liaWxpdHkiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGZoZ2YiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAidG9vYm9sYXIiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfYWxleC4wLjEudG9vYm9sYXIiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIkNIRUYiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogInRvb2JvbGFyLkpQRyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNzY4MjExODYsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzY4MjExODYsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19hbGV4LjAuMTp0b29ib2xhci5KUEciLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAidG9vYm9sYXIiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGdydCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhdGVnb3J5IjogIklvVCIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJhbGV4IiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2Mjc2NDgyOTc0LAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJCbGEgQmxhIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJhbGV4IiwKKyAgICAgICAgICAgICAgICAiZGRkIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfYWxleC4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI3NjQ4Mjk3NCwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbWFydGluMzkyLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAibWFydGluMzkyIiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2Mjc2OTg2MTA0LAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzY5ODYxMDQsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRkZGRkIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJtYXJ0aW4zOTIiCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ29sbGFib3JhdGlvbiIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJtYXJ0aW4zOTIiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNzY5ODYxMDQsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRkZGRkIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJtYXJ0aW4zOTIiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19tYXJ0aW4zOTIuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzY5ODYxMDQsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FsZXgxLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiQWxleDEiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNzcwMzQ0OTksCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI3NzAzNDQ5OSwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAidnZnIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJBbGV4MSIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF8xLTMiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhdGVnb3J5IjogIklvVCIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJBbGV4MSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI3NzAzNDQ5OSwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF8xLTMiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJ2dmciLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgIkFsZXgxIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfYWxleDEuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYyNzcwMzQ0OTksCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FsZXgyLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiQWxleDIiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYyNzcwNzEyMzUsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjI3NzA3MTIzNSwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAic2FzIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJBbGV4MiIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJCaWcgRGF0YSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJBbGV4MiIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjI3NzA3MTIzNSwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAic2FzIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJBbGV4MiIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2FsZXgyLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2Mjc3MDcxMjM1LAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19nZmhnZmhmZy4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImdmaGdmaGZnIiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzM3NDI1ODAwLAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzMzc0MjU4MDAsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZnaGciLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImdmaGdmaGdmZ2ZoZmciCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfMS0zIiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKyAgICAgICAgICAgICAgICAiRm9vdGVyX21lbnUiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfZ2ZoZ2ZoZmcuMC4xLkZvb3Rlcl9tZW51IiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJTSEVMTCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiRm9vdGVyX21lbnUuSlBHIiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjMzNzQ2MDEwOCwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjMzNzQ2MDEwOCwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX2dmaGdmaGZnLjAuMTpGb290ZXJfbWVudS5KUEciLAorICAgICAgICAgICAgICAgICAgICAibG9naWNhbE5hbWUiOiAiRm9vdGVyX21lbnUiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZ2ZoZ2ZoIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogImdmaGdmaGZnIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzM3NDI1ODAwLAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzEtMyIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZnaGciLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImdmaGdmaGdmZ2ZoZmciCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19nZmhnZmhmZy4wLjEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjMzNzQyNTgwMCwKKyAgICAgICAgICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiY29tcG9uZW50TWV0YWRhdGFEZWZpbml0aW9uIjogeworICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfZmZmZmZkZC4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImZmZmZmZGQiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNDI1MTYzMjEsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM0MjUxNjMyMSwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmRnZyIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiZmZmZmZkZCIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAiZmZmZmZkZCIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM0MjUxNjMyMSwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmRnZyIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiZmZmZmZkZCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2ZmZmZmZGQuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNDI1MTYzMjEsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX21hcnRpbi4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm1hcnRpbiIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM0Mjg1NzAzNiwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQyODU3MDM2LAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJnZ2dnIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJtYXJ0aW4iCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogIm1hcnRpbiIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM0Mjg1NzAzNiwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZ2dnZyIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAibWFydGluIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbWFydGluLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQyODU3MDM2LAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZ2hqLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiZmdoaiIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM0MzIwMTY1NSwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQzMjAxNjU1LAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJmZ2hqZmhqIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJmZ2hqIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNhdGVnb3J5IjogIkJpZyBEYXRhIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogImZnaGoiLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNDMyMDE2NTUsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImZnaGpmaGoiLAorICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgImZnaGoiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19mZ2hqLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQzMjAxNjU1LAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19sb2wuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJsb2wiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNDMzODAyMDgsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM0MzM4MDIwOCwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dwb3BvcG9kZGRkc3Nzc3Nzc3NzcyIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAibG9sIgorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgICAgICJoaWdoZXN0VmVyc2lvbiI6IHRydWUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJ0aWZhY3RzIjogeworICAgICAgICAgICAgICAgICIxMCBudW1iZXJzIGxpbWl0IHJlYWNoZWQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbG9sLjAuMS4xMCBudW1iZXJzIGxpbWl0IHJlYWNoZWQiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3RUeXBlIjogIlNIRUxMIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICIxMCBudW1iZXJzIGxpbWl0IHJlYWNoZWQucG5nIiwKKyAgICAgICAgICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImNzMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM0NDk1MDE2NiwKKyAgICAgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM0NDk1MDE2NiwKKyAgICAgICAgICAgICAgICAgICAgImVzSWQiOiAic3ZjX2xvbC4wLjE6MTAgbnVtYmVycyBsaW1pdCByZWFjaGVkLnBuZyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICIxMCBudW1iZXJzIGxpbWl0IHJlYWNoZWQiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAieXl5eXl5eSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJBZGRwcm9wZXJ0eSI6IHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19sb2wuMC4xLkFkZHByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJQVVBQRVQiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogIkFkZHByb3BlcnR5LkpQRyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNDQ5Mzk4MDAsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNDQ5Mzk4MDAsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19sb2wuMC4xOkFkZHByb3BlcnR5LkpQRyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJBZGRwcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJoaGhoaGhoIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIklNR18yMDE0MDQxOF8xNDI2MTQiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbG9sLjAuMS5JTUdfMjAxNDA0MThfMTQyNjE0IiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJTSEVMTCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiSU1HXzIwMTQwNDE4XzE0MjYxNC5qcGciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzQ0ODk1NjI1LAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQ0ODk1NjI1LAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfbG9sLjAuMTpJTUdfMjAxNDA0MThfMTQyNjE0LmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJJTUdfMjAxNDA0MThfMTQyNjE0IiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImJiYmJiYiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJJTUdfMjAxNDA2MThfMTk1MDE0IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2xvbC4wLjEuSU1HXzIwMTQwNjE4XzE5NTAxNCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiQ0hFRiIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAiSU1HXzIwMTQwNjE4XzE5NTAxNC5qcGciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzQ0OTEyMzc4LAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQ0OTEyMzc4LAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfbG9sLjAuMTpJTUdfMjAxNDA2MThfMTk1MDE0LmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsTmFtZSI6ICJJTUdfMjAxNDA2MThfMTk1MDE0IiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImJiYmJiIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgIklNR18yMDE2MTIxM18yMjIwNDEiOiB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbG9sLjAuMS5JTUdfMjAxNjEyMTNfMjIyMDQxIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJIRUFUIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJJTUdfMjAxNjEyMTNfMjIyMDQxLmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNDM2OTMwNDksCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNDM2OTMwNDksCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19sb2wuMC4xOklNR18yMDE2MTIxM18yMjIwNDEuanBnIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIklNR18yMDE2MTIxM18yMjIwNDEiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqampqampqampqampqampqamRmampqampqampqampqampqampqampqampkZmpqampqampqampqampqampqampqampqZGZqampqampqNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJJTUdfMjAxNDA0MThfMTQyNjM0IjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2xvbC4wLjEuSU1HXzIwMTQwNDE4XzE0MjYzNCIsCisgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAiUFVQUEVUIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJJTUdfMjAxNDA0MThfMTQyNjM0LmpwZyIsCisgICAgICAgICAgICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJjczAwMDgiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zICBTYW50YW5hIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNDQ4NzgyODAsCisgICAgICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNDQ4NzgyODAsCisgICAgICAgICAgICAgICAgICAgICJlc0lkIjogInN2Y19sb2wuMC4xOklNR18yMDE0MDQxOF8xNDI2MzQuanBnIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIklNR18yMDE0MDQxOF8xNDI2MzQiLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiYmJiYmJiIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiV2ViIFNlcnZlcnMiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAibG9sIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzQzMzgwMjA4LAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3BvcG9wb2RkZGRzc3Nzc3Nzc3NzIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJsb2wiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19sb2wuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNDMzODAyMDgsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2NsYXJpbi4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogImNsYXJpbiIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM0NjE0NDQyMSwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQ2MTQ0NDIxLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJzb3kgeW8iLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNsYXJpbiIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICAgICAgICAgICAiY3JlYXRvclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJzZXJ2aWNlTmFtZSI6ICJjbGFyaW4iLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNDYxNDQ0MjEsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogInNveSB5byIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiY2xhcmluIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfY2xhcmluLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzQ2MTQ0NDIxLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19qa2hramguMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJqa2hramgiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNTYyOTIzMjksCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM1NjI5MjMyOSwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAia2pobGsiLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImpraGtqaCIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKyAgICAgICAgICAgICAgICAiU2NyZWVuc2hvdF8xIjogeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2praGtqaC4wLjEuU2NyZWVuc2hvdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJQVVBQRVQiLAorICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogIlNjcmVlbnNob3RfMS5wbmciLAorICAgICAgICAgICAgICAgICAgICAidXNlcklkTGFzdFVwZGF0ZXIiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJDYXJsb3MgIFNhbnRhbmEiLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkNhcmxvcyAgU2FudGFuYSIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzU2NDg0MjEyLAorICAgICAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzU2NDg0MjEyLAorICAgICAgICAgICAgICAgICAgICAiZXNJZCI6ICJzdmNfamtoa2poLjAuMTpTY3JlZW5zaG90XzEucG5nIiwKKyAgICAgICAgICAgICAgICAgICAgImxvZ2ljYWxOYW1lIjogIlNjcmVlbnNob3RfMSIsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJ6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGh6ZnZiZ3NhZGZnc2Roc2RnaHNkaGRzZ2hzZGgiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAicmVzb3VyY2VJbnN0YW5jZXMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2praGtqaC4wLjEucmVzX3Rvc2NhLm5vZGVzLmNvbXB1dGUuMS4wLmNvbXB1dGVfMSIsCisgICAgICAgICAgICAgICAgICAgICJuYW1lIjogImNvbXB1dGVfMSIsCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZVVpZCI6ICJyZXNfdG9zY2Eubm9kZXMuY29tcHV0ZS4xLjAiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25UaW1lIjogMTQzNjM1NjYwMjYwOCwKKyAgICAgICAgICAgICAgICAgICAgIm1vZGlmaWNhdGlvblRpbWUiOiAxNDM2MzU2NjAyNjA4LAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIHJlYWwgb3IgdmlydHVhbCBtYWNoaW5lIG9yIHNlcnZlci4gSW5mb3JtYXRpb24gc3BlY2lmaWVkIG9uIHRoZSBDb21wdXRlXHJcdCAgICAgIG5vZGUgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIG1hY2hpbmUgdGhhdCBmaXRzIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgaW4gdGhlIGNsb3VkXHJcdCAgICAgIGF2YWlsYWJsZSBtYWNoaW5lcy4gSWYgbm8gc2l6aW5nIGluZm9ybWF0aW9uIGFyZSBzcGVjaWZpZWQgdGhlIGNsb3VkIHByb3ZpZGVyIGRlZmF1bHRcclx0ICAgICAgbWFjaGluZSB3aWxsIGJlIHVzZWQuIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHNwZWNpZnkgdGhlIHJlcXVpcmVkICBDUFVzIGFuZCBtZW1vcnlcclx0ICAgICAgYXQgbGVhc3QuIiwKKyAgICAgICAgICAgICAgICAgICAgInBvc1giOiAiNzgxIiwKKyAgICAgICAgICAgICAgICAgICAgInBvc1kiOiAiMjQxIiwKKyAgICAgICAgICAgICAgICAgICAgImljb24iOiAiZGVmYXVsdGljb24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfamtoa2poLjAuMS5yZXNfdG9zY2Eubm9kZXMuY29tcHV0ZS4xLjAuY29tcHV0ZV8yIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29tcHV0ZV8yIiwKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlVWlkIjogInJlc190b3NjYS5ub2Rlcy5jb21wdXRlLjEuMCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvblRpbWUiOiAxNDM2MzU2Nzg5NDQ1LAorICAgICAgICAgICAgICAgICAgICAibW9kaWZpY2F0aW9uVGltZSI6IDE0MzYzNTY3ODk0NDUsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgcmVhbCBvciB2aXJ0dWFsIG1hY2hpbmUgb3Igc2VydmVyLiBJbmZvcm1hdGlvbiBzcGVjaWZpZWQgb24gdGhlIENvbXB1dGVcclx0ICAgICAgbm9kZSB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgbWFjaGluZSB0aGF0IGZpdHMgdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBpbiB0aGUgY2xvdWRcclx0ICAgICAgYXZhaWxhYmxlIG1hY2hpbmVzLiBJZiBubyBzaXppbmcgaW5mb3JtYXRpb24gYXJlIHNwZWNpZmllZCB0aGUgY2xvdWQgcHJvdmlkZXIgZGVmYXVsdFxyXHQgICAgICBtYWNoaW5lIHdpbGwgYmUgdXNlZC4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gc3BlY2lmeSB0aGUgcmVxdWlyZWQgIENQVXMgYW5kIG1lbW9yeVxyXHQgICAgICBhdCBsZWFzdC4iLAorICAgICAgICAgICAgICAgICAgICAicG9zWCI6ICI2OTUiLAorICAgICAgICAgICAgICAgICAgICAicG9zWSI6ICIyMDQiLAorICAgICAgICAgICAgICAgICAgICAiaWNvbiI6ICJkZWZhdWx0aWNvbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19qa2hramguMC4xLnJlc190b3NjYS5ub2Rlcy5uZXR3b3JrLm5ldHdvcmsuMS4wLm5ldHdvcmtfMyIsCisgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIm5ldHdvcmtfMyIsCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZVVpZCI6ICJyZXNfdG9zY2Eubm9kZXMubmV0d29yay5uZXR3b3JrLjEuMCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvblRpbWUiOiAxNDM2MzU2NzkyMjE1LAorICAgICAgICAgICAgICAgICAgICAibW9kaWZpY2F0aW9uVGltZSI6IDE0MzYzNTY3OTIyMTUsCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc2ltcGxlICwgbG9naWNhbCBuZXR3b3JrIHNlcnZpY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgInBvc1giOiAiNzA2IiwKKyAgICAgICAgICAgICAgICAgICAgInBvc1kiOiAiMzgxIiwKKyAgICAgICAgICAgICAgICAgICAgImljb24iOiAiZGVmYXVsdGljb24iCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfamtoa2poLjAuMS5yZXNfdG9zY2Eubm9kZXMubmV0d29yay5wb3J0LjEuMC5wb3J0XzQiLAorICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJwb3J0XzQiLAorICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VVaWQiOiAicmVzX3Rvc2NhLm5vZGVzLm5ldHdvcmsucG9ydC4xLjAiLAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25UaW1lIjogMTQzNjM1Njc5Mzg0MCwKKyAgICAgICAgICAgICAgICAgICAgIm1vZGlmaWNhdGlvblRpbWUiOiAxNDM2MzU2NzkzODQwLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUmVwcmVzZW50cyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgYXNzb2NpYXRlcyBiZXR3ZWVuIENvbXB1dGUgYW5kIE5ldHdvcmsgbm9ybWF0aXZlIHR5cGVzLiIsCisgICAgICAgICAgICAgICAgICAgICJwb3NYIjogIjY2MiIsCisgICAgICAgICAgICAgICAgICAgICJwb3NZIjogIjU1MiIsCisgICAgICAgICAgICAgICAgICAgICJpY29uIjogImRlZmF1bHRpY29uIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAicmVzb3VyY2VJbnN0YW5jZXNSZWxhdGlvbnMiOiBbCisKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAic2VydmljZU5hbWUiOiAiamtoa2poIiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzU2MjkyMzI5LAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzQiLAorICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJramhsayIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiamtoa2poIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfamtoa2poLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzU2MjkyMzI5LAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19yZXNydy4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogInJlc3J3IiwKKyAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzU4NzIxODkzLAorICAgICAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNTg3MjE4OTMsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogInJlciIsCisgICAgICAgICAgICAgICAgInN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiLAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAicmVzcndyZXIiLAorICAgICAgICAgICAgICAgICAgICAibGtsa2wiCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfMS0zIiwKKyAgICAgICAgICAgICAgICAiaGlnaGVzdFZlcnNpb24iOiB0cnVlCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFydGlmYWN0cyI6IHsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJjYXRlZ29yeSI6ICJDYWxsIENvbnRyb2wiLAorICAgICAgICAgICAgImNyZWF0b3JVc2VySWQiOiAiY3MwMDA4IiwKKyAgICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJDYXJsb3MgU2FudGFuYSIsCisgICAgICAgICAgICAicmVzb3VyY2VJbnN0YW5jZXMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX3Jlc3J3LjAuMS5yZXNfdG9zY2Eubm9kZXMuY29tcHV0ZS4xLjAuY29tcHV0ZV8xIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29tcHV0ZV8xIiwKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlVWlkIjogInJlc190b3NjYS5ub2Rlcy5jb21wdXRlLjEuMCIsCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGlvblRpbWUiOiAxNDM2MzU4NzI1NzU5LAorICAgICAgICAgICAgICAgICAgICAibW9kaWZpY2F0aW9uVGltZSI6IDE0MzYzNTg3MjU3NTksCisgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgcmVhbCBvciB2aXJ0dWFsIG1hY2hpbmUgb3Igc2VydmVyLiBJbmZvcm1hdGlvbiBzcGVjaWZpZWQgb24gdGhlIENvbXB1dGVcclx0ICAgICAgbm9kZSB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgbWFjaGluZSB0aGF0IGZpdHMgdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBpbiB0aGUgY2xvdWRcclx0ICAgICAgYXZhaWxhYmxlIG1hY2hpbmVzLiBJZiBubyBzaXppbmcgaW5mb3JtYXRpb24gYXJlIHNwZWNpZmllZCB0aGUgY2xvdWQgcHJvdmlkZXIgZGVmYXVsdFxyXHQgICAgICBtYWNoaW5lIHdpbGwgYmUgdXNlZC4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gc3BlY2lmeSB0aGUgcmVxdWlyZWQgIENQVXMgYW5kIG1lbW9yeVxyXHQgICAgICBhdCBsZWFzdC4iLAorICAgICAgICAgICAgICAgICAgICAicG9zWCI6ICIyMjEiLAorICAgICAgICAgICAgICAgICAgICAicG9zWSI6ICIyNTEiLAorICAgICAgICAgICAgICAgICAgICAiaWNvbiI6ICJkZWZhdWx0aWNvbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19yZXNydy4wLjEucmVzX3Rvc2NhLm5vZGVzLm5ldHdvcmsubmV0d29yay4xLjAubmV0d29ya18yIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAibmV0d29ya18yIiwKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlVWlkIjogInJlc190b3NjYS5ub2Rlcy5uZXR3b3JrLm5ldHdvcmsuMS4wIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uVGltZSI6IDE0MzYzNTg3MjczMjksCisgICAgICAgICAgICAgICAgICAgICJtb2RpZmljYXRpb25UaW1lIjogMTQzNjM1ODcyNzMyOSwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBzaW1wbGUgLCBsb2dpY2FsIG5ldHdvcmsgc2VydmljZS4iLAorICAgICAgICAgICAgICAgICAgICAicG9zWCI6ICI2MjYiLAorICAgICAgICAgICAgICAgICAgICAicG9zWSI6ICIzNDAiLAorICAgICAgICAgICAgICAgICAgICAiaWNvbiI6ICJkZWZhdWx0aWNvbiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19yZXNydy4wLjEucmVzX3Rvc2NhLm5vZGVzLm5ldHdvcmsucG9ydC4xLjAucG9ydF8zIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAicG9ydF8zIiwKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlVWlkIjogInJlc190b3NjYS5ub2Rlcy5uZXR3b3JrLnBvcnQuMS4wIiwKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW9uVGltZSI6IDE0MzYzNTg3Mjk0NjYsCisgICAgICAgICAgICAgICAgICAgICJtb2RpZmljYXRpb25UaW1lIjogMTQzNjM1ODcyOTQ2NiwKKyAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBsb2dpY2FsIGVudGl0eSB0aGF0IGFzc29jaWF0ZXMgYmV0d2VlbiBDb21wdXRlIGFuZCBOZXR3b3JrIG5vcm1hdGl2ZSB0eXBlcy4iLAorICAgICAgICAgICAgICAgICAgICAicG9zWCI6ICI1NTgiLAorICAgICAgICAgICAgICAgICAgICAicG9zWSI6ICIyNzUiLAorICAgICAgICAgICAgICAgICAgICAiaWNvbiI6ICJkZWZhdWx0aWNvbiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInJlc291cmNlSW5zdGFuY2VzUmVsYXRpb25zIjogWworCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogInJlc3J3IiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDM2MzU4NzIxODkzLAorICAgICAgICAgICAgImljb24iOiAibmV0d29ya19sXzEtMyIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogInJlciIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAicmVzcndyZXIiLAorICAgICAgICAgICAgICAgICJsa2xrbCIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX3Jlc3J3LjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzU4NzIxODkzLAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19jb2NvLjAuMSIsCisgICAgICAgICAgICAgICAgIm5hbWUiOiAiY29jbyIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM2MjY1MzcyMiwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzYyNjUzNzIyLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJoaGgiLAorICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJOT1RfQ0VSVElGSUVEX0NIRUNLT1VUIiwKKyAgICAgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNvY28iCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogImNvY28iLAorICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNjI2NTM3MjIsCisgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImhoaCIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAiY29jbyIKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX2NvY28uMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNjI2NTM3MjIsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImNvbXBvbmVudE1ldGFkYXRhRGVmaW5pdGlvbiI6IHsKKyAgICAgICAgICAgICAgICAidW5pcXVlSWQiOiAic3ZjX25lcm1hcnRpbi4wLjEiLAorICAgICAgICAgICAgICAgICJuYW1lIjogIm5lck1hcnRpbiIsCisgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMC4xIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM2NjY3MDQ4OCwKKyAgICAgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzY2NjcwNDg4LAorICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJnZ2dnZ2dnZ2dnIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJuZXJNYXJ0aW4iCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiSU1TIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogIm5lck1hcnRpbiIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM2NjY3MDQ4OCwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZ2dnZ2dnZ2dnZyIsCisgICAgICAgICAgICAidGFncyI6IFsKKyAgICAgICAgICAgICAgICAibmVyTWFydGluIgorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJzdmNfbmVybWFydGluLjAuMSIsCisgICAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDM2MzY2NjcwNDg4LAorICAgICAgICAgICAgImxpZmVjeWNsZVN0YXRlIjogIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJjb21wb25lbnRNZXRhZGF0YURlZmluaXRpb24iOiB7CisgICAgICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19zdXNhbmEuMC4xIiwKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJzdXNhbmEiLAorICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzYzNjcyMzk2MjUsCisgICAgICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzNjM2NzIzOTYyNSwKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmZmIiwKKyAgICAgICAgICAgICAgICAic3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIsCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJzdXNhbmEiCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiaWNvbiI6ICJuZXR3b3JrX2xfNCIsCisgICAgICAgICAgICAgICAgImhpZ2hlc3RWZXJzaW9uIjogdHJ1ZQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcnRpZmFjdHMiOiB7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY2F0ZWdvcnkiOiAiQ2FsbCBDb250cm9sIiwKKyAgICAgICAgICAgICJjcmVhdG9yVXNlcklkIjogImNzMDAwOCIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkNhcmxvcyBTYW50YW5hIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJjczAwMDgiLAorICAgICAgICAgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiQ2FybG9zIFNhbnRhbmEiLAorICAgICAgICAgICAgInNlcnZpY2VOYW1lIjogInN1c2FuYSIsCisgICAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzNjM2NzIzOTYyNSwKKyAgICAgICAgICAgICJpY29uIjogIm5ldHdvcmtfbF80IiwKKyAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZmZmIiwKKyAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICJzdXNhbmEiCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgInVuaXF1ZUlkIjogInN2Y19zdXNhbmEuMC4xIiwKKyAgICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzYzNjcyMzk2MjUsCisgICAgICAgICAgICAibGlmZWN5Y2xlU3RhdGUiOiAiTk9UX0NFUlRJRklFRF9DSEVDS09VVCIKKyAgICAgICAgfQorICAgIF0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL3Jlc291cmNlL3Byb3BlcnRpZXMuanNvbiBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL3Jlc291cmNlL3Byb3BlcnRpZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ3ZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9tb2NrLWRhdGEvcmVzb3VyY2UvcHJvcGVydGllcy5qc29uCkBAIC0wLDAgKzEsMzUgQEAKK1sKKyAgeworICAgICAgInVuaXF1ZUlkIjogInVuaXF1ZUlkXzEiLAorICAgICAgIm5hbWUiOiAiZGlza19zaXplIiwKKyAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgInJlcXVpcmVkIjogZmFsc2UsCisgICAgICAiZGVmYXVsdFZhbHVlIjogIjEwIiwKKyAgICAgICJkZXNjcmlwdGlvbiI6ICJTaXplIG9mIHRoZSBsb2NhbCBkaXNrLCBpbiBHaWdhYnl0ZXMgKEdCKSwgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBDb21wdXRlIG5vZGUuIiwKKyAgICAgICJjb25zdHJhaW50cyI6IFsKKyAgICAgICAgICB7CisgICAgICAgICAgICAgICJpblJhbmdlIjogWworICAgICAgICAgICAgICAgICAgIjEwMCIKKyAgICAgICAgICAgICAgXQorICAgICAgICAgIH0KKyAgICAgIF0sCisgICAgICAiaXNQYXNzd29yZCI6IGZhbHNlCisgIH0sCisgIHsKKyAgICAgICJ1bmlxdWVJZCI6ICJ1bmlxdWVJZF8yIiwKKyAgICAgICJuYW1lIjogIm51bV9jcHVzIiwKKyAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgInJlcXVpcmVkIjogZmFsc2UsCisgICAgICAiZGVmYXVsdFZhbHVlIjogIjIiLAorICAgICAgImRlc2NyaXB0aW9uIjogIk51bWJlciBvZiAoYWN0dWFsIG9yIHZpcnR1YWwpIENQVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDb21wdXRlIG5vZGUuIiwKKyAgICAgICJjb25zdHJhaW50cyI6IFsKKyAgICAgICAgICB7CisgICAgICAgICAgICAgICJpblJhbmdlIjogWworICAgICAgICAgICAgICAgICAgIjEiLAorICAgICAgICAgICAgICAgICAgIjQiCisgICAgICAgICAgICAgIF0KKyAgICAgICAgICB9CisgICAgICBdLAorICAgICAgImlzUGFzc3dvcmQiOiBmYWxzZQorICB9CitdCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS9yZXNvdXJjZS9yZXNvdXJjZS5qc29uIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9tb2NrLWRhdGEvcmVzb3VyY2UvcmVzb3VyY2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzA0ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9tb2NrLWRhdGEvcmVzb3VyY2UvcmVzb3VyY2UuanNvbgpAQCAtMCwwICsxLDE1MyBAQAoreworICAgICJ1bmlxdWVJZCI6ICJteS1yZXNvdXJjZS4xLjAuMCIsCisgICAgImlzQWJzdHJhY3QiOiBmYWxzZSwKKyAgICAicmVzb3VyY2VOYW1lIjogIm15LXJlc291cmNlIiwKKyAgICAicmVzb3VyY2VWZXJzaW9uIjogIjEuMC4wIiwKKyAgICAiaXNIaWdoZXN0VmVyc2lvbiI6IGZhbHNlLAorICAgICJ2ZW5kb3JOYW1lIjogInZlbmRvck5hbWUiLAorICAgICJ2ZW5kb3JSZWxlYXNlIjogInZlbmRvclJlbGVhc2UiLAorICAgICJjb250YWN0SWQiOiAiY29udGFjdElkIiwKKyAgICAib2xkZXJWZXJzaW9ucyI6IFsKKyAgICAgICAgImJsYSIKKyAgICBdLAorICAgICJyZXNvdXJjZUljb25TcmMiOiAiaW1hZ2VzL3Jlc291cmNlLWljb25zL2ZpcmV3YWxsLnBuZyIsCisgICAgImljb24iOiJpY29uLXJlZDIiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzMjIiLAorICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkpIYXZhbCBKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMTUyNTE4NDM3OSwKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMxNTI1MTg0Mzk0LAorICAgICJkZXNjcmlwdGlvbiI6ICJEZXNjcmlwdGlvbiBibGEgYmxhIiwKKyAgICAidGFncyI6IFsKKyAgICAgICAgInNvbWUgdGFnIiwKKyAgICAgICAgInRhZzIiLAorICAgICAgICAidGFnMyIsCisgICAgICAgICJ0YWc0IgorICAgIF0sCisgICAgImNhdGVnb3J5IjogIkluZnJhc3RydWN0dXJlIiwKKyAgICAibGlmZWN5Y2xlU3RhdGUiOiAiQ0VSVElGSUVEIiwKKyAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAgICJ0ZW1wbGF0ZTEiCisgICAgXSwKKyAgICAiYXJ0aWZhY3RzIjogeworICAgICAgICAiZGJfY29udGVudCI6IHsKKyAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJteS1yZXNvdXJjZS4xLjAuMC5kYl9jb250ZW50IiwKKyAgICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAicHVwcGV0IiwKKyAgICAgICAgICAgICJhcnRpZmFjdFJlZiI6ICJodHRwOi8vc3dpZnQgT1IgQ0FUQUxPRyBGRSAvbXlmaWxlIiwKKyAgICAgICAgICAgICJhcnRpZmFjdE5hbWUiOiAic29tZSBBcnRpZmFjdCBOYW1lMSIsCisgICAgICAgICAgICAiYXJ0aWZhY3RSZXBvc2l0b3J5IjogIlNXSUZUIiwKKyAgICAgICAgICAgICJhcnRpZmFjdERhdGEiOiAiYmFzZSA2NCBkYWpmdnNkIGZzZGZzZnMgcz09IiwKKyAgICAgICAgICAgICJhcnRpZmFjdENoZWNrc3VtIjogImJhc2UgNjQgZHNkc2Q9PSIsCisgICAgICAgICAgICAidXNlcklkQ3JlYXRvciI6ICJqaDAwMDMiLAorICAgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImpoMDAwMyIsCisgICAgICAgICAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkppbW15IEhlbmRyaXgiLAorICAgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDMxNTI1MTg0Mzc3LAorICAgICAgICAgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzMTUyNTE4NDM3NworICAgICAgICB9LAorICAgICAgICAiZGJfY29udGVudF8yIjogeworICAgICAgICAgICJ1bmlxdWVJZCI6ICJteS1yZXNvdXJjZS4xLjAuMC5kYl9jb250ZW50XzIiLAorICAgICAgICAgICJhcnRpZmFjdFR5cGUiOiAicHVwcGV0IiwKKyAgICAgICAgICAiYXJ0aWZhY3RSZWYiOiAiaHR0cDovL3N3aWZ0IE9SIENBVEFMT0cgRkUgL215ZmlsZSIsCisgICAgICAgICAgImFydGlmYWN0TmFtZSI6ICJzb21lIEFydGlmYWN0IE5hbWUyIiwKKyAgICAgICAgICAiYXJ0aWZhY3RSZXBvc2l0b3J5IjogIlNXSUZUIiwKKyAgICAgICAgICAiYXJ0aWZhY3REYXRhIjogImJhc2UgNjQgZGFqZnZzZCBmc2Rmc2ZzIHM9PSIsCisgICAgICAgICAgImFydGlmYWN0Q2hlY2tzdW0iOiAiYmFzZSA2NCBkc2RzZD09IiwKKyAgICAgICAgICAidXNlcklkQ3JlYXRvciI6ICJqaDAwMDMiLAorICAgICAgICAgICJ1c2VySWRMYXN0VXBkYXRlciI6ICJqaDAwMDMiLAorICAgICAgICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgICAgICAgInVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAgICAgICAiY3JlYXRpb25EYXRlIjogMTQzMTUyNTE4NDM3NywKKyAgICAgICAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMxNTI1MTg0Mzc3CisgICAgICAgIH0sCisgICAgICAgICJkYl9jb250ZW50XzMiOiB7CisgICAgICAgICAgInVuaXF1ZUlkIjogIm15LXJlc291cmNlLjEuMC4wLmRiX2NvbnRlbnRfMyIsCisgICAgICAgICAgImFydGlmYWN0VHlwZSI6ICJwdXBwZXQiLAorICAgICAgICAgICJhcnRpZmFjdFJlZiI6ICJodHRwOi8vc3dpZnQgT1IgQ0FUQUxPRyBGRSAvbXlmaWxlIiwKKyAgICAgICAgICAiYXJ0aWZhY3ROYW1lIjogInNvbWUgQXJ0aWZhY3QgTmFtZTMiLAorICAgICAgICAgICJhcnRpZmFjdFJlcG9zaXRvcnkiOiAiU1dJRlQiLAorICAgICAgICAgICJhcnRpZmFjdERhdGEiOiAiYmFzZSA2NCBkYWpmdnNkIGZzZGZzZnMgcz09IiwKKyAgICAgICAgICAiYXJ0aWZhY3RDaGVja3N1bSI6ICJiYXNlIDY0IGRzZHNkPT0iLAorICAgICAgICAgICJ1c2VySWRDcmVhdG9yIjogImpoMDAwMyIsCisgICAgICAgICAgInVzZXJJZExhc3RVcGRhdGVyIjogImpoMDAwMyIsCisgICAgICAgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAgICAgICAidXBkYXRlckZ1bGxOYW1lIjogIkppbW15IEhlbmRyaXgiLAorICAgICAgICAgICJjcmVhdGlvbkRhdGUiOiAxNDMxNTI1MTg0Mzc3LAorICAgICAgICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzE1MjUxODQzNzcKKyAgICAgICAgfQorICAgIH0sCisgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJkaXNrX3NpemUiOiB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAidW5pcXVlSWRfMSIsCisgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSI6ICIxMCIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2l6ZSBvZiB0aGUgbG9jYWwgZGlzaywgaW4gR2lnYWJ5dGVzIChHQiksIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGUgQ29tcHV0ZSBub2RlLiIsCisgICAgICAgICAgICAiY29uc3RyYWludHMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaW5SYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICIxMDAiCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImlzUGFzc3dvcmQiOiBmYWxzZQorICAgICAgICB9LAorICAgICAgICAibnVtX2NwdXMiOiB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAidW5pcXVlSWRfMiIsCisgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAgICAgImRlZmF1bHRWYWx1ZSI6ICIyIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2YgKGFjdHVhbCBvciB2aXJ0dWFsKSBDUFVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ29tcHV0ZSBub2RlLiIsCisgICAgICAgICAgICAiY29uc3RyYWludHMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaW5SYW5nZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICI0IgorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJpc1Bhc3N3b3JkIjogZmFsc2UKKyAgICAgICAgfQorICAgIH0sCisgICAgImF0dHJpYnV0ZXMiOiB7CisgICAgICAgICJ0bXAiOiB7fQorICAgIH0sCisgICAgImludGVyZmFjZXMiOiB7CisgICAgICAgICJ0bXAiOiB7CisgICAgICAgICAgICAib3BlcmF0aW9ucyI6IHt9CisgICAgICAgIH0KKyAgICB9LAorICAiY2FwYWJpbGl0aWVzIjogeworICAgICJob3N0IjogeworICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwKKyAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICBdCisgICAgfQorICB9LAorICAicmVxdWlyZW1lbnRzIjogeworICAgICJob3N0IjogeworICAgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50LjEuMC5ob3N0IiwKKyAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuQ29tcHV0ZSIsCisgICAgICAicmVxdWlyZW1lbnRJbXBsIjogeworICAgICAgICAidW5pcXVlSWQiOiAicmVxdWlyZW1lbnRJbXBsLm15LXJlc291cmNlLjEuMC5ob3N0IiwKKyAgICAgICAgIm5vZGVJZCI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlLjEuMCIsCisgICAgICAgICJyZXF1aXJlbWVudFByb3BlcnRpZXMiOiB7CisgICAgICAgICAgImhvc3QiOiB7CisgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eUluc3QucmVxdWlyZW1lbnRJbXBsLm15LXJlc291cmNlLjEuMC5ob3N0Lmhvc3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICJkaXNrX3NpemUiOiAiMTAiLAorICAgICAgICAgICAgICAibnVtX2NwdXMiOiAiMiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sCisgICAgImRlZmF1bHRDYXBhYmlsaXRpZXMiOiBbCisgICAgICAgICJkZWZhdWx0Q2FwYWJpbGl0aWVzIgorICAgIF0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL3Jlc291cmNlcy9yZXNvdXJjZXNBYnN0cmFjdC5qc29uIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9tb2NrLWRhdGEvcmVzb3VyY2VzL3Jlc291cmNlc0Fic3RyYWN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3OGVhOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL3Jlc291cmNlcy9yZXNvdXJjZXNBYnN0cmFjdC5qc29uCkBAIC0wLDAgKzEsMjg0IEBACitbCisgIHsKKyAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMucm9vdC4xLjAiLAorICAgICJyZXNvdXJjZU5hbWUiOiAidG9zY2Eubm9kZXMucm9vdCIsCisgICAgInJlc291cmNlVmVyc2lvbiI6ICIxLjAiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzIiwKKyAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMzQxMjU0NjM5NiwKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMzNDEyNTQ2Mzk2LAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDEiLAorICAgICJ0YWdzIjogWworICAgICAgIlJvb3QiCisgICAgXSwKKyAgICAiY2F0ZWdvcnkiOiAiQWJzdHJhY3QiLAorICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJDRVJUSUZJRUQiLAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogdHJ1ZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZQorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLnNvZnR3YXJlY29tcG9uZW50LjEuMCIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudCIsCisgICAgInJlc291cmNlVmVyc2lvbiI6ICIxLjAiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzIiwKKyAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMzQxMjU0Nzg0MSwKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMzNDEyNTQ3ODQxLAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgZ2VuZXJpYyBzb2Z0d2FyZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgQ29tcHV0ZSBOb2RlIFR5cGUuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDIiLAorICAgICJ0YWdzIjogWworICAgICAgIlNvZnR3YXJlIENvbXBvbmVudCIKKyAgICBdLAorICAgICJjYXRlZ29yeSI6ICJBYnN0cmFjdCIsCisgICAgImxpZmVjeWNsZVN0YXRlIjogIkNFUlRJRklFRCIsCisgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgInRvc2NhLm5vZGVzLnJvb3QiCisgICAgXSwKKyAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICJjb21wb25lbnRfdmVyc2lvbiI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLnNvZnR3YXJlY29tcG9uZW50LjEuMC5jb21wb25lbnRfdmVyc2lvbiIsCisgICAgICAgICJ0eXBlIjogInZlcnNpb24iLAorICAgICAgICAicmVxdWlyZWQiOiBmYWxzZSwKKyAgICAgICAgImRlZmluaXRpb24iOiB0cnVlLAorICAgICAgICAicGFzc3dvcmQiOiBmYWxzZQorICAgICAgfSwKKyAgICAgICJhZG1pbl9jcmVkZW50aWFsIjogeworICAgICAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMuc29mdHdhcmVjb21wb25lbnQuMS4wLmFkbWluX2NyZWRlbnRpYWwiLAorICAgICAgICAidHlwZSI6ICJ0b3NjYS5kYXRhdHlwZXMuQ3JlZGVudGlhbCIsCisgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICB9CisgICAgfSwKKyAgICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICAgInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIsCisgICAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAgICJhYnN0cmFjdCI6IHRydWUsCisgICAgImhpZ2hlc3RWZXJzaW9uIjogZmFsc2UKKyAgfSwKKyAgeworICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy53ZWJzZXJ2ZXIuMS4wIiwKKyAgICAicmVzb3VyY2VOYW1lIjogInRvc2NhLm5vZGVzLndlYnNlcnZlciIsCisgICAgInJlc291cmNlVmVyc2lvbiI6ICIxLjAiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzIiwKKyAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMzQxMjU0ODE0MCwKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMzNDEyNTQ4MTQwLAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGFuIGFic3RyYWN0IHNvZnR3YXJlIGNvbXBvbmVudCBvciBzZXJ2aWNlIHRoYXQgaXMgY2FwYWJsZSBvZiBob3N0aW5nIGFuZCBwcm92aWRpbmcgbWFuYWdlbWVudCBvcGVyYXRpb25zIGZvciBvbmUgb3IgbW9yZSBXZWIgQXBwbGljYXRpb24gbm9kZXMuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDEiLAorICAgICJ0YWdzIjogWworICAgICAgIldlYiBTZXJ2ZXIiCisgICAgXSwKKyAgICAiY2F0ZWdvcnkiOiAiQWJzdHJhY3QiLAorICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJDRVJUSUZJRUQiLAorICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICJ0b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudCIKKyAgICBdLAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogdHJ1ZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZQorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLndlYmFwcGxpY2F0aW9uLjEuMCIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy53ZWJhcHBsaWNhdGlvbiIsCisgICAgInJlc291cmNlVmVyc2lvbiI6ICIxLjAiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzIiwKKyAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMzQxMjU0ODM4MiwKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMzNDEyNTQ4MzgyLAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgc29mdHdhcmUgYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgbWFuYWdlZCBhbmQgcnVuIGJ5IGEgV2ViIFNlcnZlciBub2RlLiAgU3BlY2lmaWMgdHlwZXMgb2Ygd2ViIGFwcGxpY2F0aW9ucyBzdWNoIGFzIEphdmEsIGV0Yy4gY291bGQgYmUgZGVyaXZlZCBmcm9tIHRoaXMgdHlwZS4iLAorICAgICJpY29uIjogImljb24tcmVkMyIsCisgICAgInRhZ3MiOiBbCisgICAgICAiV2ViIEFwcGxpY2F0aW9uIgorICAgIF0sCisgICAgImNhdGVnb3J5IjogIkFic3RyYWN0IiwKKyAgICAibGlmZWN5Y2xlU3RhdGUiOiAiQ0VSVElGSUVEIiwKKyAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAidG9zY2Eubm9kZXMucm9vdCIKKyAgICBdLAorICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgImNvbnRleHRfcm9vdCI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLndlYmFwcGxpY2F0aW9uLjEuMC5jb250ZXh0X3Jvb3QiLAorICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAicmVxdWlyZWQiOiBmYWxzZSwKKyAgICAgICAgImRlZmluaXRpb24iOiB0cnVlLAorICAgICAgICAicGFzc3dvcmQiOiBmYWxzZQorICAgICAgfQorICAgIH0sCisgICAgInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiLAorICAgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgICAiYWJzdHJhY3QiOiB0cnVlLAorICAgICJoaWdoZXN0VmVyc2lvbiI6IGZhbHNlCisgIH0sCisgIHsKKyAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMuZGJtcy4xLjAiLAorICAgICJyZXNvdXJjZU5hbWUiOiAidG9zY2Eubm9kZXMuZGJtcyIsCisgICAgInJlc291cmNlVmVyc2lvbiI6ICIxLjAiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzIiwKKyAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMzQxMjU0ODYwNywKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMzNDEyNTQ4NjA3LAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgdHlwaWNhbCByZWxhdGlvbmFsLCBTUUwgRGF0YWJhc2UgTWFuYWdlbWVudCBTeXN0ZW0gc29mdHdhcmUgY29tcG9uZW50IG9yIHNlcnZpY2UuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDQiLAorICAgICJ0YWdzIjogWworICAgICAgIkRCTVMiCisgICAgXSwKKyAgICAiY2F0ZWdvcnkiOiAiQWJzdHJhY3QiLAorICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJDRVJUSUZJRUQiLAorICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICJ0b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudCIKKyAgICBdLAorICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgInBvcnQiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5kYm1zLjEuMC5wb3J0IiwKKyAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAidGhlIHBvcnQgdGhlIERCTVMgc2VydmljZSB3aWxsIGxpc3RlbiB0byBmb3IgZGF0YSBhbmQgcmVxdWVzdHMiLAorICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICB9LAorICAgICAgInJvb3RfcGFzc3dvcmQiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5kYm1zLjEuMC5yb290X3Bhc3N3b3JkIiwKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKKyAgICAgICAgInJlcXVpcmVkIjogZmFsc2UsCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJ0aGUgb3B0aW9uYWwgcm9vdCBwYXNzd29yZCBmb3IgdGhlIERCTVMgc2VydmljZSIsCisgICAgICAgICJkZWZpbml0aW9uIjogdHJ1ZSwKKyAgICAgICAgInBhc3N3b3JkIjogZmFsc2UKKyAgICAgIH0KKyAgICB9LAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogdHJ1ZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZQorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLmRhdGFiYXNlLjEuMCIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5kYXRhYmFzZSIsCisgICAgInJlc291cmNlVmVyc2lvbiI6ICIxLjAiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzIiwKKyAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMzQxMjU0ODgzNiwKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMzNDEyNTQ4ODM2LAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGEgbG9naWNhbCBkYXRhYmFzZSB0aGF0IGNhbiBiZSBtYW5hZ2VkIGFuZCBob3N0ZWQgYnkgYSBEQk1TIG5vZGUuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDMiLAorICAgICJ0YWdzIjogWworICAgICAgIkRhdGFiYXNlIgorICAgIF0sCisgICAgImNhdGVnb3J5IjogIkFic3RyYWN0IiwKKyAgICAibGlmZWN5Y2xlU3RhdGUiOiAiQ0VSVElGSUVEIiwKKyAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAidG9zY2Eubm9kZXMucm9vdCIKKyAgICBdLAorICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgInBvcnQiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5kYXRhYmFzZS4xLjAucG9ydCIsCisgICAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgICAicmVxdWlyZWQiOiBmYWxzZSwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogInRoZSBwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHNlcnZpY2Ugd2lsbCBsaXN0ZW4gdG8gZm9yIGRhdGEiLAorICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICB9LAorICAgICAgIm5hbWUiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5kYXRhYmFzZS4xLjAubmFtZSIsCisgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAidGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZGF0YWJhc2UiLAorICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICB9LAorICAgICAgInVzZXIiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5kYXRhYmFzZS4xLjAudXNlciIsCisgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAidGhlIG9wdGlvbmFsIHVzZXIgYWNjb3VudCBuYW1lIGZvciBEQiBhZG1pbmlzdHJhdGlvbiIsCisgICAgICAgICJkZWZpbml0aW9uIjogdHJ1ZSwKKyAgICAgICAgInBhc3N3b3JkIjogZmFsc2UKKyAgICAgIH0sCisgICAgICAicGFzc3dvcmQiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5kYXRhYmFzZS4xLjAucGFzc3dvcmQiLAorICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAicmVxdWlyZWQiOiBmYWxzZSwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogInRoZSBvcHRpb25hbCBwYXNzd29yZCBmb3IgdGhlIERCIHVzZXIgYWNjb3VudCIsCisgICAgICAgICJkZWZpbml0aW9uIjogdHJ1ZSwKKyAgICAgICAgInBhc3N3b3JkIjogZmFsc2UKKyAgICAgIH0KKyAgICB9LAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogdHJ1ZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZQorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLmNvbnRhaW5lci5ydW50aW1lLjEuMCIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5jb250YWluZXIucnVudGltZSIsCisgICAgInJlc291cmNlVmVyc2lvbiI6ICIxLjAiLAorICAgICJjcmVhdG9yVXNlcklkIjogImpoMDAwMyIsCisgICAgImNyZWF0b3JGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAibGFzdFVwZGF0ZXJVc2VySWQiOiAiamgwMDAzIiwKKyAgICAibGFzdFVwZGF0ZXJGdWxsTmFtZSI6ICJKaW1teSBIZW5kcml4IiwKKyAgICAiY3JlYXRpb25EYXRlIjogMTQzMzQxMjU0OTUzMiwKKyAgICAibGFzdFVwZGF0ZURhdGUiOiAxNDMzNDEyNTQ5NTMyLAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIG9wZXJhdGluZyBzeXN0ZW0tbGV2ZWwgdmlydHVhbGl6YXRpb24gdGVjaG5vbG9neSB1c2VkIHRvIHJ1biBtdWx0aXBsZSBhcHBsaWNhdGlvbiBzZXJ2aWNlcyBvbiBhIHNpbmdsZSBDb21wdXRlIGhvc3QuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDEyIiwKKyAgICAidGFncyI6IFsKKyAgICAgICJDb250YWluZXIiCisgICAgXSwKKyAgICAiY2F0ZWdvcnkiOiAiQWJzdHJhY3QiLAorICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJDRVJUSUZJRUQiLAorICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICJ0b3NjYS5ub2Rlcy5zb2Z0d2FyZWNvbXBvbmVudCIKKyAgICBdLAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogdHJ1ZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZQorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLmNvbnRhaW5lci5hcHBsaWNhdGlvbi4xLjAiLAorICAgICJyZXNvdXJjZU5hbWUiOiAidG9zY2Eubm9kZXMuY29udGFpbmVyLmFwcGxpY2F0aW9uIiwKKyAgICAicmVzb3VyY2VWZXJzaW9uIjogIjEuMCIsCisgICAgImNyZWF0b3JVc2VySWQiOiAiamgwMDAzIiwKKyAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkppbW15IEhlbmRyaXgiLAorICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJqaDAwMDMiLAorICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkppbW15IEhlbmRyaXgiLAorICAgICJjcmVhdGlvbkRhdGUiOiAxNDMzNDEyNTQ5NzA5LAorICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzM0MTI1NDk3MDksCisgICAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYW4gYXBwbGljYXRpb24gdGhhdCByZXF1aXJlcyBDb250YWluZXItbGV2ZWwgdmlydHVhbGl6YXRpb24gdGVjaG5vbG9neS4iLAorICAgICJpY29uIjogImljb24tcmVkNCIsCisgICAgInRhZ3MiOiBbCisgICAgICAiQ29udGFpbmVyIEFwcGxpY2F0aW9uIgorICAgIF0sCisgICAgImNhdGVnb3J5IjogIkFic3RyYWN0IiwKKyAgICAibGlmZWN5Y2xlU3RhdGUiOiAiQ0VSVElGSUVEIiwKKyAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAidG9zY2Eubm9kZXMucm9vdCIKKyAgICBdLAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogdHJ1ZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZQorICB9CitdCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS9yZXNvdXJjZXMvcmVzb3VyY2VzTm90QWJzdHJhY3QuanNvbiBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL3Jlc291cmNlcy9yZXNvdXJjZXNOb3RBYnN0cmFjdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjMyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS9yZXNvdXJjZXMvcmVzb3VyY2VzTm90QWJzdHJhY3QuanNvbgpAQCAtMCwwICsxLDUxMCBAQAorWworICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLmNvbXB1dGUuMS4wIiwKKyAgICAicmVzb3VyY2VOYW1lIjogInRvc2NhLm5vZGVzLmNvbXB1dGUiLAorICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMS4wIiwKKyAgICAiY3JlYXRvclVzZXJJZCI6ICJqaDAwMDMiLAorICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImpoMDAwMyIsCisgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzM0MTI1NDc1NjYsCisgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzMzQxMjU0NzU2NiwKKyAgICAiY29vcmRpbmF0ZXMiOiB7CisgICAgICAieCI6MTUwLAorICAgICAgInkiOjI1MAorICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSByZWFsIG9yIHZpcnR1YWwgbWFjaGluZSBvciBzZXJ2ZXIuIEluZm9ybWF0aW9uIHNwZWNpZmllZCBvbiB0aGUgQ29tcHV0ZVx0ICAgICAgbm9kZSB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgbWFjaGluZSB0aGF0IGZpdHMgdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBpbiB0aGUgY2xvdWRcdCAgICAgIGF2YWlsYWJsZSBtYWNoaW5lcy4gSWYgbm8gc2l6aW5nIGluZm9ybWF0aW9uIGFyZSBzcGVjaWZpZWQgdGhlIGNsb3VkIHByb3ZpZGVyIGRlZmF1bHRcdCAgICAgIG1hY2hpbmUgd2lsbCBiZSB1c2VkLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzcGVjaWZ5IHRoZSByZXF1aXJlZCAgQ1BVcyBhbmQgbWVtb3J5XHQgICAgICBhdCBsZWFzdC4iLAorICAgICJpY29uIjogImljb24tcmVkMiIsCisgICAgInRhZ3MiOiBbCisgICAgICAiQ29tcHV0ZSIKKyAgICBdLAorICAgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICAgImxpZmVjeWNsZVN0YXRlIjogIkNFUlRJRklFRCIsCisgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgInRvc2NhLm5vZGVzLnJvb3QiCisgICAgXSwKKyAgICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICAgInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIsCisgICAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICJoaWdoZXN0VmVyc2lvbiI6IGZhbHNlLAorICAgICJjYXBhYmlsaXRpZXMiOiB7CisgICAgICAiaG9zdCI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICAgIF0KKyAgICAgIH0sCisgICAgICAiZGIxIjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfSwKKyAgICAgICJsaW51eDEiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnRvc2NhLm5vZGVzLkNvbXB1dGUuMS4wLmhvc3QiLAorICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwKKyAgICAgICAgInZhbGlkU291cmNlVHlwZXMiOiBbCisgICAgICAgICAgInRvc2NhLm5vZGVzLlNDIgorICAgICAgICBdCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgImhvc3QiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgInJlcXVpcmVtZW50SW1wbCI6IHsKKyAgICAgICAgICAidW5pcXVlSWQiOiAicmVxdWlyZW1lbnRJbXBsLm15LXJlc291cmNlLjEuMC5ob3N0IiwKKyAgICAgICAgICAibm9kZUlkIjogInRvc2NhLm5vZGVzLkNvbXB1dGUuMS4wIiwKKyAgICAgICAgICAicmVxdWlyZW1lbnRQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImhvc3QiOiB7CisgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5SW5zdC5yZXF1aXJlbWVudEltcGwubXktcmVzb3VyY2UuMS4wLmhvc3QuaG9zdCIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICJkaXNrX3NpemUiOiAiMTAiLAorICAgICAgICAgICAgICAgICJudW1fY3B1cyI6ICIyIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLm9iamVjdHN0b3JhZ2UuMS4wIiwKKyAgICAicmVzb3VyY2VOYW1lIjogInRvc2NhLm5vZGVzLm9iamVjdHN0b3JhZ2UiLAorICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMS4wIiwKKyAgICAiY3JlYXRvclVzZXJJZCI6ICJqaDAwMDMiLAorICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImpoMDAwMyIsCisgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzM0MTI1NDkwOTEsCisgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzMzQxMjU0OTA5MSwKKyAgICAiY29vcmRpbmF0ZXMiOiB7CisgICAgICAieCI6MTUwLAorICAgICAgInkiOjI1MAorICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgc3RvcmFnZSB0aGF0IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHN0b3JlIGRhdGEgYXMgb2JqZWN0cyAob3IgQkxPQnMgb2YgZGF0YSkgd2l0aG91dCBjb25zaWRlcmF0aW9uIGZvciB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIG9yIGRldmljZXMuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDEiLAorICAgICJ0YWdzIjogWworICAgICAgIk9iamVjdFN0b3JhZ2UiCisgICAgXSwKKyAgICAiY2F0ZWdvcnkiOiAiSW5mcmFzdHJ1Y3R1cmUiLAorICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJDRVJUSUZJRUQiLAorICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICJ0b3NjYS5ub2Rlcy5yb290IgorICAgIF0sCisgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAibWF4c2l6ZSI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLm9iamVjdHN0b3JhZ2UuMS4wLm1heHNpemUiLAorICAgICAgICAidHlwZSI6ICJzY2FsYXItdW5pdC5zaXplIiwKKyAgICAgICAgInJlcXVpcmVkIjogZmFsc2UsCisgICAgICAgICJjb25zdHJhaW50cyI6IFsKKyAgICAgICAgICB7CisKKyAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJkZWZpbml0aW9uIjogdHJ1ZSwKKyAgICAgICAgInBhc3N3b3JkIjogZmFsc2UKKyAgICAgIH0sCisgICAgICAibmFtZSI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLm9iamVjdHN0b3JhZ2UuMS4wLm5hbWUiLAorICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAicmVxdWlyZWQiOiBmYWxzZSwKKyAgICAgICAgImRlZmluaXRpb24iOiB0cnVlLAorICAgICAgICAicGFzc3dvcmQiOiBmYWxzZQorICAgICAgfSwKKyAgICAgICJzaXplIjogeworICAgICAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMub2JqZWN0c3RvcmFnZS4xLjAuc2l6ZSIsCisgICAgICAgICJ0eXBlIjogInNjYWxhci11bml0LnNpemUiLAorICAgICAgICAicmVxdWlyZWQiOiBmYWxzZSwKKyAgICAgICAgImNvbnN0cmFpbnRzIjogWworICAgICAgICAgIHsKKworICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgImRlZmluaXRpb24iOiB0cnVlLAorICAgICAgICAicGFzc3dvcmQiOiBmYWxzZQorICAgICAgfQorICAgIH0sCisgICAgInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiLAorICAgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZSwKKyAgICAiY2FwYWJpbGl0aWVzIjogeworICAgICAgImhvc3QyIjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfSwKKyAgICAgICJkYiI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICAgIF0KKyAgICAgIH0sCisgICAgICAibGludXgyIjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfQorICAgIH0sCisgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICJkYiI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50LjEuMC5ob3N0IiwKKyAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLkNvbXB1dGUiLAorICAgICAgICAicmVxdWlyZW1lbnRJbXBsIjogeworICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXF1aXJlbWVudEltcGwubXktcmVzb3VyY2UuMS4wLmhvc3QiLAorICAgICAgICAgICJub2RlSWQiOiAidG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAiLAorICAgICAgICAgICJyZXF1aXJlbWVudFByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHlJbnN0LnJlcXVpcmVtZW50SW1wbC5teS1yZXNvdXJjZS4xLjAuaG9zdC5ob3N0IiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICAgImRpc2tfc2l6ZSI6ICIxMCIsCisgICAgICAgICAgICAgICAgIm51bV9jcHVzIjogIjIiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sCisgIHsKKyAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMuYmxvY2tzdG9yYWdlLjEuMCIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy5ibG9ja3N0b3JhZ2UiLAorICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMS4wIiwKKyAgICAiY3JlYXRvclVzZXJJZCI6ICJqaDAwMDMiLAorICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImpoMDAwMyIsCisgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzM0MTI1NDkzMjcsCisgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzMzQxMjU0OTMyNywKKyAgICAiY29vcmRpbmF0ZXMiOiB7CisgICAgICAieCI6MTUwLAorICAgICAgInkiOjI1MAorICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIlJlcHJlc2VudHMgYSBzZXJ2ZXItbG9jYWwgYmxvY2sgc3RvcmFnZSBkZXZpY2UgKGkuZS4sIG5vdCBzaGFyZWQpIG9mZmVyaW5nIGV2ZW5seSBzaXplZCBibG9ja3Mgb2YgZGF0YSBmcm9tIHdoaWNoIHJhdyBzdG9yYWdlIHZvbHVtZXMgY2FuIGJlIGNyZWF0ZWQuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDMiLAorICAgICJ0YWdzIjogWworICAgICAgIkJsb2NrU3RvcmFnZSIKKyAgICBdLAorICAgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICAgImxpZmVjeWNsZVN0YXRlIjogIkNFUlRJRklFRCIsCisgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgInRvc2NhLm5vZGVzLnJvb3QiCisgICAgXSwKKyAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICJ2b2x1bWVfaWQiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5ibG9ja3N0b3JhZ2UuMS4wLnZvbHVtZV9pZCIsCisgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICB9LAorICAgICAgInNuYXBzaG90X2lkIjogeworICAgICAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMuYmxvY2tzdG9yYWdlLjEuMC5zbmFwc2hvdF9pZCIsCisgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICB9LAorICAgICAgInNpemUiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5ibG9ja3N0b3JhZ2UuMS4wLnNpemUiLAorICAgICAgICAidHlwZSI6ICJzY2FsYXItdW5pdC5zaXplIiwKKyAgICAgICAgInJlcXVpcmVkIjogZmFsc2UsCisgICAgICAgICJjb25zdHJhaW50cyI6IFsKKyAgICAgICAgICB7CisKKyAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJkZWZpbml0aW9uIjogdHJ1ZSwKKyAgICAgICAgInBhc3N3b3JkIjogZmFsc2UKKyAgICAgIH0KKyAgICB9LAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogZmFsc2UsCisgICAgImhpZ2hlc3RWZXJzaW9uIjogZmFsc2UsCisgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICJob3N0MyI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICAgIF0KKyAgICAgIH0sCisgICAgICAiZGIzIjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfSwKKyAgICAgICJsaW51eCI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICAgIF0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAibGludXgiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgInJlcXVpcmVtZW50SW1wbCI6IHsKKyAgICAgICAgICAidW5pcXVlSWQiOiAicmVxdWlyZW1lbnRJbXBsLm15LXJlc291cmNlLjEuMC5ob3N0IiwKKyAgICAgICAgICAibm9kZUlkIjogInRvc2NhLm5vZGVzLkNvbXB1dGUuMS4wIiwKKyAgICAgICAgICAicmVxdWlyZW1lbnRQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImhvc3QiOiB7CisgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5SW5zdC5yZXF1aXJlbWVudEltcGwubXktcmVzb3VyY2UuMS4wLmhvc3QuaG9zdCIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICJkaXNrX3NpemUiOiAiMTAiLAorICAgICAgICAgICAgICAgICJudW1fY3B1cyI6ICIyIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLmxvYWRiYWxhbmNlci4xLjAiLAorICAgICJyZXNvdXJjZU5hbWUiOiAidG9zY2Eubm9kZXMubG9hZGJhbGFuY2VyIiwKKyAgICAicmVzb3VyY2VWZXJzaW9uIjogIjEuMCIsCisgICAgImNyZWF0b3JVc2VySWQiOiAiamgwMDAzIiwKKyAgICAiY3JlYXRvckZ1bGxOYW1lIjogIkppbW15IEhlbmRyaXgiLAorICAgICJsYXN0VXBkYXRlclVzZXJJZCI6ICJqaDAwMDMiLAorICAgICJsYXN0VXBkYXRlckZ1bGxOYW1lIjogIkppbW15IEhlbmRyaXgiLAorICAgICJjcmVhdGlvbkRhdGUiOiAxNDMzNDEyNTQ5ODc4LAorICAgICJsYXN0VXBkYXRlRGF0ZSI6IDE0MzM0MTI1NDk4NzgsCisgICAgImNvb3JkaW5hdGVzIjogeworICAgICAgIngiOjE1MCwKKyAgICAgICJ5IjoyNTAKKyAgICB9LAorICAgICJkZXNjcmlwdGlvbiI6ICJSZXByZXNlbnRzIGxvZ2ljYWwgZnVuY3Rpb24gdGhhdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBGbG9hdGluZyBBZGRyZXNzIHRvIGRpc3RyaWJ1dGUgYW4gYXBwbGljYXRpb27igJlzIHRyYWZmaWMgKGxvYWQpIGFjcm9zcyBhIG51bWJlciBvZiBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIChlLmcuLCBmb3IgYSBjbHVzdGVyZWQgb3Igc2NhbGVkIGFwcGxpY2F0aW9uKS4iLAorICAgICJpY29uIjogImljb24tcmVkNCIsCisgICAgInRhZ3MiOiBbCisgICAgICAiTG9hZCBCYWxhbmNlciIKKyAgICBdLAorICAgICJjYXRlZ29yeSI6ICJJbmZyYXN0cnVjdHVyZSIsCisgICAgImxpZmVjeWNsZVN0YXRlIjogIkNFUlRJRklFRCIsCisgICAgImRlcml2ZWRGcm9tIjogWworICAgICAgInRvc2NhLm5vZGVzLnJvb3QiCisgICAgXSwKKyAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICJhbGdvcml0aG0iOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5sb2FkYmFsYW5jZXIuMS4wLmFsZ29yaXRobSIsCisgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICJyZXF1aXJlZCI6IGZhbHNlLAorICAgICAgICAiZGVmaW5pdGlvbiI6IHRydWUsCisgICAgICAgICJwYXNzd29yZCI6IGZhbHNlCisgICAgICB9CisgICAgfSwKKyAgICAidmVuZG9yTmFtZSI6ICJBVFQgKFRvc2NhKSIsCisgICAgInZlbmRvclJlbGVhc2UiOiAiMS4wLjAud2QwMyIsCisgICAgImNvbnRhY3RJZCI6ICJqaDAwMDMiLAorICAgICJhYnN0cmFjdCI6IGZhbHNlLAorICAgICJoaWdoZXN0VmVyc2lvbiI6IGZhbHNlLAorICAgICJjYXBhYmlsaXRpZXMiOiB7CisgICAgICAiaG9zdCI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICAgIF0KKyAgICAgIH0sCisgICAgICAiZGI0IjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfSwKKyAgICAgICJsaW51eDQiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnRvc2NhLm5vZGVzLkNvbXB1dGUuMS4wLmhvc3QiLAorICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwKKyAgICAgICAgInZhbGlkU291cmNlVHlwZXMiOiBbCisgICAgICAgICAgInRvc2NhLm5vZGVzLlNDIgorICAgICAgICBdCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWlyZW1lbnRzIjogeworICAgICAgImxpbnV4IjogeworICAgICAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnQuMS4wLmhvc3QiLAorICAgICAgICAiY2FwYWJpbGl0eSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwKKyAgICAgICAgIm5vZGUiOiAidG9zY2Eubm9kZXMuQ29tcHV0ZSIsCisgICAgICAgICJyZXF1aXJlbWVudEltcGwiOiB7CisgICAgICAgICAgInVuaXF1ZUlkIjogInJlcXVpcmVtZW50SW1wbC5teS1yZXNvdXJjZS4xLjAuaG9zdCIsCisgICAgICAgICAgIm5vZGVJZCI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlLjEuMCIsCisgICAgICAgICAgInJlcXVpcmVtZW50UHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJob3N0IjogeworICAgICAgICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eUluc3QucmVxdWlyZW1lbnRJbXBsLm15LXJlc291cmNlLjEuMC5ob3N0Lmhvc3QiLAorICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAiZGlza19zaXplIjogIjEwIiwKKyAgICAgICAgICAgICAgICAibnVtX2NwdXMiOiAiMiIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwKKyAgeworICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy50aXRhbi4xLjAiLAorICAgICJyZXNvdXJjZU5hbWUiOiAidG9zY2Eubm9kZXMudGl0YW4iLAorICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMS4wIiwKKyAgICAiY3JlYXRvclVzZXJJZCI6ICJqaDAwMDMiLAorICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImpoMDAwMyIsCisgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzM0MTI1NTAwNDYsCisgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzMzQxMjU1MDA0NiwKKyAgICAiY29vcmRpbmF0ZXMiOiB7CisgICAgICAieCI6MTUwLAorICAgICAgInkiOjI1MAorICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIlRpdGFuIGlzIGEgc2NhbGFibGUgZ3JhcGggZGF0YWJhc2Ugb3B0aW1pemVkIGZvciBzdG9yaW5nIGFuZCBxdWVyeWluZyBncmFwaHMgY29udGFpbmluZyBodW5kcmVkcyBvZiBiaWxsaW9ucyBvZiB2ZXJ0aWNlcyBhbmQgZWRnZXMgZGlzdHJpYnV0ZWQgYWNyb3NzIGEgbXVsdGktbWFjaGluZSBjbHVzdGVyLiBUaXRhbiBpcyBhIHRyYW5zYWN0aW9uYWwgZGF0YWJhc2UgdGhhdCBjYW4gc3VwcG9ydCB0aG91c2FuZHMgb2YgY29uY3VycmVudCB1c2VycyBleGVjdXRpbmcgY29tcGxleCBncmFwaCB0cmF2ZXJzYWxzIGluIHJlYWwgdGltZS4iLAorICAgICJpY29uIjogImljb24tcmVkNCIsCisgICAgInRhZ3MiOiBbCisgICAgICAiVGl0YW4iCisgICAgXSwKKyAgICAiY2F0ZWdvcnkiOiAiQmlnIERhdGEiLAorICAgICJsaWZlY3ljbGVTdGF0ZSI6ICJDRVJUSUZJRUQiLAorICAgICJkZXJpdmVkRnJvbSI6IFsKKyAgICAgICJ0b3NjYS5ub2Rlcy5yb290IgorICAgIF0sCisgICAgInZlbmRvck5hbWUiOiAiQVRUIChUb3NjYSkiLAorICAgICJ2ZW5kb3JSZWxlYXNlIjogIjEuMC4wLndkMDMiLAorICAgICJjb250YWN0SWQiOiAiamgwMDAzIiwKKyAgICAiYWJzdHJhY3QiOiBmYWxzZSwKKyAgICAiaGlnaGVzdFZlcnNpb24iOiBmYWxzZSwKKyAgICAiY2FwYWJpbGl0aWVzIjogeworICAgICAgImhvc3Q1IjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfSwKKyAgICAgICJkYiI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICAgIF0KKyAgICAgIH0sCisgICAgICAibGludXg1IjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfQorICAgIH0sCisgICAgInJlcXVpcmVtZW50cyI6IHsKKyAgICAgICJsaW51eCI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogInRvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50LjEuMC5ob3N0IiwKKyAgICAgICAgImNhcGFiaWxpdHkiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJub2RlIjogInRvc2NhLm5vZGVzLkNvbXB1dGUiLAorICAgICAgICAicmVxdWlyZW1lbnRJbXBsIjogeworICAgICAgICAgICJ1bmlxdWVJZCI6ICJyZXF1aXJlbWVudEltcGwubXktcmVzb3VyY2UuMS4wLmhvc3QiLAorICAgICAgICAgICJub2RlSWQiOiAidG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAiLAorICAgICAgICAgICJyZXF1aXJlbWVudFByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAiaG9zdCI6IHsKKyAgICAgICAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHlJbnN0LnJlcXVpcmVtZW50SW1wbC5teS1yZXNvdXJjZS4xLjAuaG9zdC5ob3N0IiwKKyAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICAgImRpc2tfc2l6ZSI6ICIxMCIsCisgICAgICAgICAgICAgICAgIm51bV9jcHVzIjogIjIiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sCisgIHsKKyAgICAidW5pcXVlSWQiOiAidG9zY2Eubm9kZXMudGFzLjEuMCIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0b3NjYS5ub2Rlcy50YXMiLAorICAgICJyZXNvdXJjZVZlcnNpb24iOiAiMS4wIiwKKyAgICAiY3JlYXRvclVzZXJJZCI6ICJqaDAwMDMiLAorICAgICJjcmVhdG9yRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImxhc3RVcGRhdGVyVXNlcklkIjogImpoMDAwMyIsCisgICAgImxhc3RVcGRhdGVyRnVsbE5hbWUiOiAiSmltbXkgSGVuZHJpeCIsCisgICAgImNyZWF0aW9uRGF0ZSI6IDE0MzM0MTI1NTAxOTcsCisgICAgImxhc3RVcGRhdGVEYXRlIjogMTQzMzQxMjU1MDE5NywKKyAgICAiY29vcmRpbmF0ZXMiOiB7CisgICAgICAieCI6MTUwLAorICAgICAgInkiOjI1MAorICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIlRlbGVwaG9ueSBhcHBsaWNhdGlvbiBzZXJ2ZXIuIiwKKyAgICAiaWNvbiI6ICJpY29uLXJlZDEiLAorICAgICJ0YWdzIjogWworICAgICAgIlRBUyIKKyAgICBdLAorICAgICJjYXRlZ29yeSI6ICJWb0lQIiwKKyAgICAibGlmZWN5Y2xlU3RhdGUiOiAiQ0VSVElGSUVEIiwKKyAgICAiZGVyaXZlZEZyb20iOiBbCisgICAgICAidG9zY2Eubm9kZXMucm9vdCIKKyAgICBdLAorICAgICJ2ZW5kb3JOYW1lIjogIkFUVCAoVG9zY2EpIiwKKyAgICAidmVuZG9yUmVsZWFzZSI6ICIxLjAuMC53ZDAzIiwKKyAgICAiY29udGFjdElkIjogImpoMDAwMyIsCisgICAgImFic3RyYWN0IjogZmFsc2UsCisgICAgImhpZ2hlc3RWZXJzaW9uIjogZmFsc2UsCisgICAgImNhcGFiaWxpdGllcyI6IHsKKyAgICAgICJob3N0IjogeworICAgICAgICAidW5pcXVlSWQiOiAiY2FwYWJpbGl0eS50b3NjYS5ub2Rlcy5Db21wdXRlLjEuMC5ob3N0IiwKKyAgICAgICAgInR5cGUiOiAidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIsCisgICAgICAgICJ2YWxpZFNvdXJjZVR5cGVzIjogWworICAgICAgICAgICJ0b3NjYS5ub2Rlcy5TQyIKKyAgICAgICAgXQorICAgICAgfSwKKyAgICAgICJkYjYiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5LnRvc2NhLm5vZGVzLkNvbXB1dGUuMS4wLmhvc3QiLAorICAgICAgICAidHlwZSI6ICJ0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyIiwKKyAgICAgICAgInZhbGlkU291cmNlVHlwZXMiOiBbCisgICAgICAgICAgInRvc2NhLm5vZGVzLlNDIgorICAgICAgICBdCisgICAgICB9LAorICAgICAgImxpbnV4NiI6IHsKKyAgICAgICAgInVuaXF1ZUlkIjogImNhcGFiaWxpdHkudG9zY2Eubm9kZXMuQ29tcHV0ZS4xLjAuaG9zdCIsCisgICAgICAgICJ0eXBlIjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAidmFsaWRTb3VyY2VUeXBlcyI6IFsKKyAgICAgICAgICAidG9zY2Eubm9kZXMuU0MiCisgICAgICAgIF0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXJlbWVudHMiOiB7CisgICAgICAiZGIiOiB7CisgICAgICAgICJ1bmlxdWVJZCI6ICJ0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudC4xLjAuaG9zdCIsCisgICAgICAgICJjYXBhYmlsaXR5IjogInRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIiLAorICAgICAgICAibm9kZSI6ICJ0b3NjYS5ub2Rlcy5Db21wdXRlIiwKKyAgICAgICAgInJlcXVpcmVtZW50SW1wbCI6IHsKKyAgICAgICAgICAidW5pcXVlSWQiOiAicmVxdWlyZW1lbnRJbXBsLm15LXJlc291cmNlLjEuMC5ob3N0IiwKKyAgICAgICAgICAibm9kZUlkIjogInRvc2NhLm5vZGVzLkNvbXB1dGUuMS4wIiwKKyAgICAgICAgICAicmVxdWlyZW1lbnRQcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImhvc3QiOiB7CisgICAgICAgICAgICAgICJ1bmlxdWVJZCI6ICJjYXBhYmlsaXR5SW5zdC5yZXF1aXJlbWVudEltcGwubXktcmVzb3VyY2UuMS4wLmhvc3QuaG9zdCIsCisgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICJkaXNrX3NpemUiOiAiMTAiLAorICAgICAgICAgICAgICAgICJudW1fY3B1cyI6ICIyIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CitdCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS90ZW1wbGF0ZS90ZW1wbGF0ZS5qc29uIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9tb2NrLWRhdGEvdGVtcGxhdGUvdGVtcGxhdGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQ3NDkxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9tb2NrLWRhdGEvdGVtcGxhdGUvdGVtcGxhdGUuanNvbgpAQCAtMCwwICsxLDM3IEBACitbCisgIHsKKyAgInVuaXF1ZUlkIjogIjEiLAorICAicmVzb3VyY2VOYW1lIjogInRlbXBsYXRlMSIsCisgICAiZGVzY3JpcHRpb24iOiJkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiAiCisgIH0sCisgIHsKKyAgICAidW5pcXVlSWQiOiAiMiIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0ZW1wbGF0ZTIiLAorICAgICJkZXNjcmlwdGlvbiI6ImRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uICIKKyAgfSwKKyAgeworICAgICJ1bmlxdWVJZCI6ICIzIiwKKyAgICAicmVzb3VyY2VOYW1lIjogInRlbXBsYXRlMyIsCisgICAgImRlc2NyaXB0aW9uIjoiZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gIgorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogIjQiLAorICAgICJyZXNvdXJjZU5hbWUiOiAidGVtcGxhdGU0IiwKKyAgICAiZGVzY3JpcHRpb24iOiJkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiAiCisgIH0sCisgIHsKKyAgICAidW5pcXVlSWQiOiAiNSIsCisgICAgInJlc291cmNlTmFtZSI6ICJ0ZW1wbGF0ZTUiLAorICAgICJkZXNjcmlwdGlvbiI6ImRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uICIKKyAgfSwKKyAgeworICAgICJ1bmlxdWVJZCI6ICI2IiwKKyAgICAicmVzb3VyY2VOYW1lIjogInRlbXBsYXRlNiIsCisgICAgImRlc2NyaXB0aW9uIjoiZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gIgorICB9LAorICB7CisgICAgInVuaXF1ZUlkIjogIjciLAorICAgICJyZXNvdXJjZU5hbWUiOiAidGVtcGxhdGU3IiwKKyAgICAiZGVzY3JpcHRpb24iOiJkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiAiCisgIH0KKyBdCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS91c2VyL3VzZXIuanNvbiBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1kYXRhL3VzZXIvdXNlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzkzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stZGF0YS91c2VyL3VzZXIuanNvbgpAQCAtMCwwICsxLDcgQEAKK3sKKyAgImZpcnN0TmFtZSI6ICJKYW1lcyIsCisgICJsYXN0TmFtZSI6ICJCcm93biIsCisgICJ1c2VySWQiOiAiamIxMjM0dSIsCisgICJlbWFpbCI6ICJqYjEyMzR1QHNkYy5jb20iLAorICAicm9sZSI6ICJBRE1JTiIKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svbW9jay1zZXJ2ZXIuanMgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stc2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGM4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL21vY2stc2VydmVyLmpzCkBAIC0wLDAgKzEsMTQwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCit2YXIgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTsKK3ZhciBtb2NrQXBpcyA9IHJlcXVpcmUoJy4uL2NvbmZpZ3VyYXRpb25zL21vY2suanNvbicpLnNkY0NvbmZpZzsKKy8vdmFyIG1vY2tVcmlzID0gcmVxdWlyZSgnLi4vY29uZmlndXJhdGlvbnMvbW9jay5qc29uJyk7Cit2YXIgY29ycyA9IHJlcXVpcmUoJ2NvcnMnKTsKK3ZhciBtdWx0ZXIgID0gcmVxdWlyZSgnbXVsdGVyJykKK3ZhciBiYXNlUGF0aFRvTW9ja0RhdGEgPSAnLi9tb2NrLWRhdGEvJzsKK3ZhciBhcHAgPSBleHByZXNzKCk7CisKK3ZhciBhbGxvd2VkSGVhZGVycyA9ICdDb250ZW50LVR5cGUsQXV0aG9yaXphdGlvbixJZi1Nb2RpZmllZC1TaW5jZSwnOworYWxsb3dlZEhlYWRlcnMgKz0gbW9ja0FwaXMuY29va2llLnVzZXJJZFN1ZmZpeDsKK2FsbG93ZWRIZWFkZXJzICs9ICcsJyttb2NrQXBpcy5jb29raWUudXNlckVtYWlsOworYWxsb3dlZEhlYWRlcnMgKz0gJywnK21vY2tBcGlzLmNvb2tpZS51c2VyRmlyc3ROYW1lOworYWxsb3dlZEhlYWRlcnMgKz0gJywnK21vY2tBcGlzLmNvb2tpZS51c2VyTGFzdE5hbWU7CithbGxvd2VkSGVhZGVycyArPSAnLCcrbW9ja0FwaXMuY29va2llLnhFY29tcFJlcXVlc3RJZDsKKworCisKK2FwcC51c2UoY29ycyh7CisgICAgLy8gb3JpZ2luOiAnKicsCisgICAgb3JpZ2luOiBmdW5jdGlvbihvcmlnaW4sIGNhbGxiYWNrKSB7CisgICAgICBjYWxsYmFjayhudWxsLCB0cnVlKTsKKyAgICB9LAorICAgIG1ldGhvZHM6ICdHRVQsIFBPU1QsIFBVVCwgREVMRVRFJywKKyAgICBhbGxvd2VkSGVhZGVyczogYWxsb3dlZEhlYWRlcnMsCisgICAgY3JlZGVudGlhbHM6IHRydWUKK30pKTsKKworLy9zZXQgY29va2llIG1pZGRsZXdhcmUKK2FwcC51c2UoZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHsKKworICByZXMuY29va2llKG1vY2tBcGlzLmNvb2tpZS51c2VySWRTdWZmaXgsIHJlcS5oZWFkZXJzW21vY2tBcGlzLmNvb2tpZS51c2VySWRTdWZmaXhdIHx8IG1vY2tBcGlzLnVzZXJUeXBlcy5kZXNpZ25lci51c2VySWQgKTsKKyAgcmVzLmNvb2tpZShtb2NrQXBpcy5jb29raWUudXNlckVtYWlsLCByZXEuaGVhZGVyc1ttb2NrQXBpcy5jb29raWUudXNlckVtYWlsXSB8fCAgbW9ja0FwaXMudXNlclR5cGVzLmRlc2lnbmVyLmVtYWlsKTsKKyAgcmVzLmNvb2tpZShtb2NrQXBpcy5jb29raWUudXNlckZpcnN0TmFtZSwgcmVxLmhlYWRlcnNbbW9ja0FwaXMuY29va2llLnVzZXJGaXJzdE5hbWVdIHx8ICBtb2NrQXBpcy51c2VyVHlwZXMuZGVzaWduZXIuZmlyc3ROYW1lKTsKKyAgcmVzLmNvb2tpZShtb2NrQXBpcy5jb29raWUudXNlckxhc3ROYW1lLCByZXEuaGVhZGVyc1ttb2NrQXBpcy5jb29raWUudXNlckxhc3ROYW1lXSB8fCAgbW9ja0FwaXMudXNlclR5cGVzLmRlc2lnbmVyLmxhc3ROYW1lKTsKKyAgcmVzLmNvb2tpZShtb2NrQXBpcy5jb29raWUueEVjb21wUmVxdWVzdElkLCByZXEuaGVhZGVyc1ttb2NrQXBpcy5jb29raWUueEVjb21wUmVxdWVzdElkXSB8fCAgbW9ja0FwaXMudXNlclR5cGVzLmRlc2lnbmVyLmxhc3ROYW1lKTsKKyAgbmV4dCgpOworfSk7CisKK3ZhciB1c2VyUm91dGVzID0gcmVxdWlyZSgnLi9yb3V0ZXMvdXNlcicpOworYXBwLnVzZSgnL3YxL3VzZXInLCB1c2VyUm91dGVzKTsKK3ZhciByZXNvdXJjZVJvdXRlcyA9IHJlcXVpcmUoJy4vcm91dGVzL3Jlc291cmNlJyk7CithcHAudXNlKCcvdjEvcmVzb3VyY2UnLCByZXNvdXJjZVJvdXRlcyk7Cit2YXIgdGVtcGxhdGVSb3V0ZXMgPSByZXF1aXJlKCcuL3JvdXRlcy90ZW1wbGF0ZScpOworYXBwLnVzZSgnL3YxL3RlbXBsYXRlJywgdGVtcGxhdGVSb3V0ZXMpOwordmFyIHByb3BlcnR5Um91dGVzID0gcmVxdWlyZSgnLi9yb3V0ZXMvcHJvcGVydHknKTsKK2FwcC51c2UoJy92MS9yZXNvdXJjZS86cmVzb3VyY2VJZC9wcm9wZXJ0eScsIHByb3BlcnR5Um91dGVzKTsKK3ZhciByZXNvdXJjZXNSb3V0ZXMgPSByZXF1aXJlKCcuL3JvdXRlcy9yZXNvdXJjZXMnKTsKK2FwcC51c2UoJy92MS9jYXRhbG9nL3Jlc291cmNlcycsIHJlc291cmNlc1JvdXRlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1PQ0tTIEVOUE9JTlRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBnZXQgdXNlciBkZXRhaWxzICovCisvLyBhcHAuZ2V0KG1vY2tBcGlzLmFwaS5HRVRfdXNlciwgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisvLyAgIHZhciB1c2VyID0gcmVxdWlyZShiYXNlUGF0aFRvTW9ja0RhdGErJ3VzZXIvdXNlci5qc29uJyk7CisvLyAgIHJlcy5zZW5kKHVzZXIpOworLy8gfSk7CisKKy8qIGdldCBlbGVtZW50cyAqLworYXBwLmdldChtb2NrQXBpcy5hcGkuR0VUX2VsZW1lbnQsIGZ1bmN0aW9uIChyZXEsIHJlcykgeworCisgIHZhciBlbGVtZW50ID0gcmVxdWlyZShiYXNlUGF0aFRvTW9ja0RhdGErJ2VsZW1lbnQvZWxlbWVudC5qc29uJyk7CisgIHJlcy5zZW5kKGVsZW1lbnQpOworfSk7CisKKy8qIGdldCBlbGVtZW50cyAqLworYXBwLmdldChtb2NrQXBpcy5hcGkuR0VUX2NhdGFsb2csIGZ1bmN0aW9uIChyZXEsIHJlcykgeworCisgIHZhciBlbGVtZW50ID0gcmVxdWlyZShiYXNlUGF0aFRvTW9ja0RhdGErJ2VsZW1lbnQvZWxlbWVudC5qc29uJyk7CisgIHJlcy5zZW5kKGVsZW1lbnQpOworfSk7CisKKy8qIGdldCBjYXRlZ29yaWVzICovCithcHAuZ2V0KG1vY2tBcGlzLmFwaS5HRVRfY2F0ZWdvcnksIGZ1bmN0aW9uIChyZXEsIHJlcykgeworCisgIHZhciBjYXRlZ29yaWVzID0gcmVxdWlyZShiYXNlUGF0aFRvTW9ja0RhdGErJ2NhdGVnb3J5L2NhdGVnb3J5Lmpzb24nKTsKKyAgcmVzLnNlbmQoY2F0ZWdvcmllcyk7Cit9KTsKKworCisvKiBnZXQgY2F0ZWdvcmllcyAqLworYXBwLmdldChtb2NrQXBpcy5hcGkuR0VUX2NvbmZpZ3VyYXRpb25fdWksIGZ1bmN0aW9uIChyZXEsIHJlcykgeworCisgIHZhciBjYXRlZ29yaWVzID0gcmVxdWlyZShiYXNlUGF0aFRvTW9ja0RhdGErJ2FydGlmYWN0L2FydGlmYWN0LXR5cGVzLmpzb24nKTsKKyAgcmVzLnNlbmQoY2F0ZWdvcmllcyk7Cit9KTsKKworCisKKworCisKKworCisvL3VwbG9hZCBhcnRpZmFjdCBmaWxlCithcHAudXNlKG11bHRlcih7IGRlc3Q6ICcuL3VwbG9hZHMvJywKKyAgcmVuYW1lOiBmdW5jdGlvbiAoZmllbGRuYW1lLCBmaWxlbmFtZSkgeworICAgIHJldHVybiBmaWxlbmFtZStEYXRlLm5vdygpOworICB9LAorICBvbkZpbGVVcGxvYWRTdGFydDogZnVuY3Rpb24gKGZpbGUpIHsKKyAgICBjb25zb2xlLmxvZyhmaWxlLm9yaWdpbmFsbmFtZSArICcgaXMgc3RhcnRpbmcgLi4uJykKKyAgfSwKKyAgb25GaWxlVXBsb2FkQ29tcGxldGU6IGZ1bmN0aW9uIChmaWxlKSB7CisgICAgY29uc29sZS5sb2coZmlsZS5maWVsZG5hbWUgKyAnIHVwbG9hZGVkIHRvICAnICsgZmlsZS5wYXRoKQorICAgIGRvbmU9dHJ1ZTsKKyAgfQorfSkpOworCit2YXIgZG9uZT1mYWxzZTsKK2FwcC5wb3N0KG1vY2tBcGlzLmFwaS5HRVRfcmVzb3VyY2VfYXJ0aWZhY3QsZnVuY3Rpb24ocmVxLHJlcyl7CisgIGlmKGRvbmU9PXRydWUpeworICAgIGNvbnNvbGUubG9nKHJlcS5maWxlcyk7CisgICAgcmVzLmVuZCgiRmlsZSB1cGxvYWRlZC4iKTsKKyAgfQorfSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordmFyIHNlcnZlciA9IGFwcC5saXN0ZW4oOTk5OSwgZnVuY3Rpb24gKCkgeworICAgIGNvbnNvbGUubG9nKCdtb2NrIHNlcnZlciBsaXN0ZW5pbmcgb24gcG9ydCAlZCcsIHNlcnZlci5hZGRyZXNzKCkucG9ydCk7Cit9KTsKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svcm91dGVzL3Byb3BlcnR5LmpzIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9yb3V0ZXMvcHJvcGVydHkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1NjAxOAotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svcm91dGVzL3Byb3BlcnR5LmpzCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordmFyIGV4cHJlc3MgPSByZXF1aXJlKCdleHByZXNzJyk7Cit2YXIgcHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL21vY2stZGF0YS9yZXNvdXJjZS9wcm9wZXJ0aWVzLmpzb24nKTsKKwordmFyIHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7CisKK3JvdXRlci5nZXQoJy8nLCBmdW5jdGlvbiAocmVxLCByZXMpIHsKKyAgY29uc29sZS5sb2coJ3F1ZXJ5Jyk7CisgIHJlcy5zZW5kKHByb3BlcnRpZXMpOworfSk7CisKK3JvdXRlci5wb3N0KCcvOmlkJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIGNvbnNvbGUubG9nKCJwb3N0IC86aWQiLCByZXEpOworICByZXMuc2VuZChwcm9wZXJ0aWVzWzBdKTsKK30pOworCityb3V0ZXIuZ2V0KCcvOmlkJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIHJlcy5zZW5kKHByb3BlcnRpZXNbMF0pOworfSk7CisKKworcm91dGVyLnBvc3QoJy8nLCBmdW5jdGlvbiAocmVxLCByZXMpIHsKKyAgY29uc29sZS5sb2coInBvc3QgIiwgcmVxKTsKKyAgcmVzLnNlbmQocHJvcGVydGllc1swXSk7Cit9KTsKK21vZHVsZS5leHBvcnRzPSByb3V0ZXI7CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL3JvdXRlcy9yZXNvdXJjZS5qcyBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svcm91dGVzL3Jlc291cmNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMmI2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL3JvdXRlcy9yZXNvdXJjZS5qcwpAQCAtMCwwICsxLDYwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3ZhciBleHByZXNzID0gcmVxdWlyZSgnZXhwcmVzcycpOwordmFyIHJlc291cmNlID0gcmVxdWlyZSgnLi4vbW9jay1kYXRhL3Jlc291cmNlL3Jlc291cmNlLmpzb24nKTsKKwordmFyIHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7CisKK3JvdXRlci5nZXQoJy8nLCBmdW5jdGlvbiAocmVxLCByZXMpIHsKKyAgY29uc29sZS5sb2coJ3F1ZXJ5Jyk7CisgIHJlcy5zZW5kKFtyZXNvdXJjZV0pOworfSk7CisKK3JvdXRlci5wb3N0KCcvOmlkJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIGNvbnNvbGUubG9nKCJwb3N0IC86aWQiKTsKKyAgcmVzLnNlbmQocmVzb3VyY2UpOworfSk7CisKK3JvdXRlci5nZXQoJy86aWQnLCBmdW5jdGlvbiAocmVxLCByZXMpIHsKKyAgY29uc29sZS5sb2coInBvc3QgIik7CisgIHJlcy5zZW5kKHJlc291cmNlKTsKK30pOworCisKK3JvdXRlci5wb3N0KCcvJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIGNvbnNvbGUubG9nKCJwb3N0ICIpOworICByZXMuc2VuZChyZXNvdXJjZSk7Cit9KTsKKworcm91dGVyLmdldCgnL3ZhbGlkYXRlLW5hbWUvOm5hbWUnLCBmdW5jdGlvbiAocmVxLCByZXMpIHsKKworICB2YXIgbmFtZSA9IHJlcS5wYXJhbXMubmFtZTsKKyAgdmFyIHJlc3BvbnNlID0geydpc1ZhbGlkJzp0cnVlfTsKKyAgaWYgKG5hbWU9PT0nZXhpc3QnKXsKKyAgICByZXNwb25zZSA9IHsnaXNWYWxpZCc6ZmFsc2V9OworICB9CisgIHJlcy5zZW5kKHJlc3BvbnNlKTsKKworfSk7CisKKworCittb2R1bGUuZXhwb3J0cz0gcm91dGVyOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9yb3V0ZXMvcmVzb3VyY2VzLmpzIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9yb3V0ZXMvcmVzb3VyY2VzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTg0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL3JvdXRlcy9yZXNvdXJjZXMuanMKQEAgLTAsMCArMSwzOCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCit2YXIgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTsKK3ZhciByZXNvdXJjZXNOb3RBYnN0cmFjdCA9IHJlcXVpcmUoJy4uL21vY2stZGF0YS9yZXNvdXJjZXMvcmVzb3VyY2VzTm90QWJzdHJhY3QuanNvbicpOwordmFyIHJlc291cmNlc0Fic3RyYWN0ID0gcmVxdWlyZSgnLi4vbW9jay1kYXRhL3Jlc291cmNlcy9yZXNvdXJjZXNBYnN0cmFjdC5qc29uJyk7CisKK3ZhciByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpOworCityb3V0ZXIuZ2V0KCcvY2VydGlmaWVkL25vdGFic3RyYWN0JywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIHJlcy5zZW5kKHJlc291cmNlc05vdEFic3RyYWN0KTsKK30pOworCisKK3JvdXRlci5nZXQoJy9jZXJ0aWZpZWQvYWJzdHJhY3QnLCBmdW5jdGlvbiAocmVxLCByZXMpIHsKKyAgcmVzLnNlbmQocmVzb3VyY2VzQWJzdHJhY3QpOworfSk7CisKKworCittb2R1bGUuZXhwb3J0cz0gcm91dGVyOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9yb3V0ZXMvdGVtcGxhdGUuanMgYi9jYXRhbG9nLXVpL3NlcnZlci1tb2NrL3JvdXRlcy90ZW1wbGF0ZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc2NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9yb3V0ZXMvdGVtcGxhdGUuanMKQEAgLTAsMCArMSw0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCit2YXIgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTsKK3ZhciB0ZW1wbGF0ZXMgPSByZXF1aXJlKCcuLi9tb2NrLWRhdGEvdGVtcGxhdGUvdGVtcGxhdGUuanNvbicpOworCit2YXIgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTsKKworcm91dGVyLmdldCgnLycsIGZ1bmN0aW9uIChyZXEsIHJlcykgeworICBjb25zb2xlLmxvZygncXVlcnknKTsKKyAgcmVzLnNlbmQodGVtcGxhdGVzKTsKK30pOworCityb3V0ZXIucG9zdCgnLzppZCcsIGZ1bmN0aW9uIChyZXEsIHJlcykgeworICBjb25zb2xlLmxvZygicG9zdCAvOmlkIiwgcmVxKTsKKyAgcmVzLnNlbmQodGVtcGxhdGVzWzBdKTsKK30pOworCityb3V0ZXIuZ2V0KCcvOmlkJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIHJlcy5zZW5kKHRlbXBsYXRlc1swXSk7Cit9KTsKKworCityb3V0ZXIucG9zdCgnLycsIGZ1bmN0aW9uIChyZXEsIHJlcykgeworICBjb25zb2xlLmxvZygicG9zdCAiLCByZXEpOworICByZXMuc2VuZCh0ZW1wbGF0ZXNbMF0pOworfSk7Cittb2R1bGUuZXhwb3J0cz0gcm91dGVyOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS9zZXJ2ZXItbW9jay9yb3V0ZXMvdXNlci5qcyBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svcm91dGVzL3VzZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxZjQzOQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvc2VydmVyLW1vY2svcm91dGVzL3VzZXIuanMKQEAgLTAsMCArMSw0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCit2YXIgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTsKK3ZhciB1c2VyID0gcmVxdWlyZSgnLi4vbW9jay1kYXRhL3VzZXIvdXNlci5qc29uJyk7CisKK3ZhciByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpOworCityb3V0ZXIuZ2V0KCcvJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIGNvbnNvbGUubG9nKCdxdWVyeScpOworICByZXMuc2VuZChbdXNlcl0pOworfSk7CisKK3JvdXRlci5wb3N0KCcvOmlkJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIGNvbnNvbGUubG9nKCJwb3N0IC86aWQiLCByZXEpOworICByZXMuc2VuZCh1c2VyKTsKK30pOworCityb3V0ZXIuZ2V0KCcvOmlkJywgZnVuY3Rpb24gKHJlcSwgcmVzKSB7CisgIHJlcy5zZW5kKHVzZXIpOworfSk7CisKKworcm91dGVyLnBvc3QoJy8nLCBmdW5jdGlvbiAocmVxLCByZXMpIHsKKyAgY29uc29sZS5sb2coInBvc3QgIiwgcmVxKTsKKyAgcmVzLnNlbmQodXNlcik7Cit9KTsKK21vZHVsZS5leHBvcnRzPSByb3V0ZXI7CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3Rlc3RzL2thcm1hLnVuaXQuY29uZi5qcyBiL2NhdGFsb2ctdWkvdGVzdHMva2FybWEudW5pdC5jb25mLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODI3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3Rlc3RzL2thcm1hLnVuaXQuY29uZi5qcwpAQCAtMCwwICsxLDE0OSBAQAorLy8gS2FybWEgY29uZmlndXJhdGlvbgorCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjb25maWcpIHsKKyAgICBjb25maWcuc2V0KHsKKworICAgICAgICAvLyBiYXNlIHBhdGgsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlc29sdmUgZmlsZXMgYW5kIGV4Y2x1ZGUKKyAgICAgICAgYmFzZVBhdGg6ICcuLi8nLAorCisKKyAgICAgICAgLy8gZnJhbWV3b3JrcyB0byB1c2UKKyAgICAgICAgZnJhbWV3b3JrczogWydqYXNtaW5lJ10sCisKKyAgICAgICAgLy8gbGlzdCBvZiBmaWxlcyAvIHBhdHRlcm5zIHRvIGxvYWQgaW4gdGhlIGJyb3dzZXIKKyAgICAgICAgZmlsZXM6IFsKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyL2FuZ3VsYXIuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1iYXNlNjQvYW5ndWxhci1iYXNlNjQuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1iYXNlNjQtdXBsb2FkL3NyYy9hbmd1bGFyLWJhc2U2NC11cGxvYWQuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1ib290c3RyYXAvdWktYm9vdHN0cmFwLXRwbHMuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5LXVpL2pxdWVyeS11aS5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLWRyYWdkcm9wL3NyYy9hbmd1bGFyLWRyYWdkcm9wLmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItZmlsdGVyL2Rpc3QvYW5ndWxhci1maWx0ZXIubWluLmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItbWQ1L2FuZ3VsYXItbWQ1LmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL3BlcmZlY3Qtc2Nyb2xsYmFyL3NyYy9wZXJmZWN0LXNjcm9sbGJhci5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXBlcmZlY3Qtc2Nyb2xsYmFyL3NyYy9hbmd1bGFyLXBlcmZlY3Qtc2Nyb2xsYmFyLmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItbW9ja3MvYW5ndWxhci1tb2Nrcy5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXJlc291cmNlL2FuZ3VsYXItcmVzb3VyY2UuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1zYW5pdGl6ZS9hbmd1bGFyLXNhbml0aXplLmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdG9vbHRpcHMvZGlzdC9hbmd1bGFyLXRvb2x0aXBzLm1pbi5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXRyYW5zbGF0ZS9hbmd1bGFyLXRyYW5zbGF0ZS5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXRyYW5zbGF0ZS1sb2FkZXItc3RhdGljLWZpbGVzL2FuZ3VsYXItdHJhbnNsYXRlLWxvYWRlci1zdGF0aWMtZmlsZXMuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci11aS1yb3V0ZXIvcmVsZWFzZS9hbmd1bGFyLXVpLXJvdXRlci5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXV1aWQ0L2FuZ3VsYXItdXVpZDQuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL2NoZWNrbGlzdC1tb2RlbC9jaGVja2xpc3QtbW9kZWwuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1jbGlwYm9hcmQvYW5ndWxhci1jbGlwYm9hcmQuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1yZXNpemFibGUvc3JjL2FuZ3VsYXItcmVzaXphYmxlLmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdWktbm90aWZpY2F0aW9uL3NyYy9hbmd1bGFyLXVpLW5vdGlmaWNhdGlvbi5qcycsCisgICAgICAgICAgICAnYm93ZXJfY29tcG9uZW50cy9sb2Rhc2gvbG9kYXNoLmpzJywKKyAgICAgICAgICAgICdib3dlcl9jb21wb25lbnRzL3Jlc3Rhbmd1bGFyL2Rpc3QvcmVzdGFuZ3VsYXIuanMnLAorICAgICAgICAgICAgJ2Jvd2VyX2NvbXBvbmVudHMvanNwZGYvZGlzdC9qc3BkZi5taW4uanMnLAorICAgICAgICAgICAgJ2FwcC9zY3JpcHRzL3V0aWxzLyoqLyouanMnLAorICAgICAgICAgICAgJ2FwcC9zY3JpcHRzL3NlcnZpY2VzLyoqLyouanMnLAorICAgICAgICAgICAgJ2FwcC9zY3JpcHRzL21vZGVscy8qKi8qLmpzJywKKyAgICAgICAgICAgICdhcHAvc2NyaXB0cy92aWV3LW1vZGVscy8qKi8qLmpzJywKKyAgICAgICAgICAgICdhcHAvc2NyaXB0cy9maWx0ZXJzLyoqLyouanMnLAorICAgICAgICAgICAgJ2FwcC9zY3JpcHRzL2RpcmVjdGl2ZXMvKiovKi5qcycsCisgICAgICAgICAgICAnYXBwL3NjcmlwdHMvbW9kdWxlcy8qKi8qLmpzJywKKworICAgICAgICAgICAgJ2FwcC9zY3JpcHRzL2FwcC5qcycsCisgICAgICAgICAgICAnYXBwL2xhbmd1YWdlcy8qKi8qLmpzJywKKworICAgICAgICAgICAgJ2FwcC9zY3JpcHRzL3RlbXBsYXRlcy5qcycsCisKKworCisKKworICAgICAgICAgICAgLy8nYXBwL3NjcmlwdHMvdmlldy1tb2RlbHMvZGFzaGJvYXJkL2Rhc2hib2FyZC12aWV3LW1vZGVsLXRlc3RzLmpzJywKKworCisgICAgICAgICAgICAnYXBwL3NjcmlwdHMvKiovKi10ZXN0cy5qcycsCisgICAgICAgICAgICAvLydhcHAvc2NyaXB0cy9hcHAuanMnLAorCisKKyAgICAgICAgICAgIC8vZGVmaW5pdGlvbiB0byBhbGxvdyB0byBkZWJ1ZyBUUyB0ZXN0cyAgZmlsZSBpbiBicm93c2VyCisgICAgICAgICAgICB7cGF0dGVybjogJ2FwcC9zY3JpcHRzLyoqLyotdGVzdHMudHMnLCBpbmNsdWRlZDogZmFsc2V9LAorICAgICAgICAgICAge3BhdHRlcm46ICdhcHAvc2NyaXB0cy8qKi8qLXRlc3RzLmpzLm1hcCcsIGluY2x1ZGVkOiBmYWxzZX0sCisKKworICAgICAgICAgICAgLy9kZWZpbml0aW9uIHRvIGFsbG93IHRvIGRlYnVnIFRTIHNvdXJjZXMgZmlsZXMgaW4gYnJvd3NlcgorICAgICAgICAgICAge3BhdHRlcm46ICdhcHAvc2NyaXB0cy8qKi8qLnRzJywgaW5jbHVkZWQ6IGZhbHNlfSwKKyAgICAgICAgICAgIHtwYXR0ZXJuOiAnYXBwL3NjcmlwdHMvKiovKi5qcy5tYXAnLCBpbmNsdWRlZDogZmFsc2V9CisKKyAgICAgICAgXSwKKworICAgICAgICAvLyBsaXN0IG9mIGZpbGVzIHRvIGV4Y2x1ZGUKKyAgICAgICAgZXhjbHVkZTogWworCisgICAgICAgIF0sCisKKyAgICAgICAganVuaXRSZXBvcnRlcjogeworICAgICAgICAgICAgb3V0cHV0RmlsZTogJ3Rlc3RzL3Rlc3RPdXRwdXQueG1sJywKKyAgICAgICAgICAgIHN1aXRlOiAnJworICAgICAgICB9LAorCisgICAgICAgIC8vTk9URTogVGhpcyBpcyBoYW5kbGVkIGZyb20gZ3J1bnRmaWxlLmpzCisgICAgICAgIGNvdmVyYWdlUmVwb3J0ZXIgOiB7CisgICAgICAgICAgICB0eXBlIDogJ2h0bWwnLAorICAgICAgICAgICAgZGlyOiAndGVzdHMvQ292ZXJhZ2UnCisgICAgICAgIH0sCisgICAgICAgIC8vIHRlc3QgcmVzdWx0cyByZXBvcnRlciB0byB1c2UKKyAgICAgICAgLy8gcG9zc2libGUgdmFsdWVzOiAnZG90cycsICdwcm9ncmVzcycsICdqdW5pdCcsICdncm93bCcsICdjb3ZlcmFnZScKKyAgICAgICAgcmVwb3J0ZXJzOiBbCisgICAgICAgICAgICAnbW9jaGEnLC8vdW5jb21tZW50IHRoaXMgbGluZSBpZiB5b3UgbmVlZCB0byBkZWJ1ZyB5b3VyIHVuaXQgdGVzdCBhbmQgcHJpbnQgb3V0IHRoZSAnZGVzY3JpYmUnIG9mIHRoZSB0ZXN0CisgICAgICAgICAgICAnanVuaXQnLAorICAgICAgICAgICAgJ2RvdHMnLAorICAgICAgICAgICAgJ3Byb2dyZXNzJywKKyAgICAgICAgICAgICdjb3ZlcmFnZScKKyAgICAgICAgXSwKKworICAgICAgICAvLyB3ZWIgc2VydmVyIHBvcnQKKyAgICAgICAgcG9ydDogOTg3NiwKKworCisgICAgICAgIC8vIGVuYWJsZSAvIGRpc2FibGUgY29sb3JzIGluIHRoZSBvdXRwdXQgKHJlcG9ydGVycyBhbmQgbG9ncykKKyAgICAgICAgY29sb3JzOiB0cnVlLAorCisKKyAgICAgICAgLy8gbGV2ZWwgb2YgbG9nZ2luZworICAgICAgICAvLyBwb3NzaWJsZSB2YWx1ZXM6IGNvbmZpZy5MT0dfRElTQUJMRSB8fCBjb25maWcuTE9HX0VSUk9SIHx8IGNvbmZpZy5MT0dfV0FSTiB8fCBjb25maWcuTE9HX0lORk8gfHwgY29uZmlnLkxPR19ERUJVRworICAgICAgLy8gIGxvZ0xldmVsOiBjb25maWcuTE9HX0lORk8sCisKKworICAgICAgICAvLyBlbmFibGUgLyBkaXNhYmxlIHdhdGNoaW5nIGZpbGUgYW5kIGV4ZWN1dGluZyB0ZXN0cyB3aGVuZXZlciBhbnkgZmlsZSBjaGFuZ2VzCisgICAgICAgIGF1dG9XYXRjaDogdHJ1ZSwKKworICAgICAgICBwcmVwcm9jZXNzb3JzOiB7CisgICAgICAgICAgICAnKiovKi5odG1sJzogJ2h0bWwyanMnLAorICAgICAgICAgICAgJ2FwcC9zY3JpcHRzLyoqLyEoKi10ZXN0c3wqVGVzdHN8KlRlc3QpLmpzJzogJ2NvdmVyYWdlJworICAgICAgICB9LAorCisgICAgICAgIC8vbmdIdG1sMkpzUHJlcHJvY2Vzc29yOiB7CisgICAgICAgIC8vICAgIHN0cmlwUHJlZml4OiAnY2xpZW50LycKKyAgICAgICAgLy99LAorCisgICAgICAgIC8vIFN0YXJ0IHRoZXNlIGJyb3dzZXJzLCBjdXJyZW50bHkgYXZhaWxhYmxlOgorICAgICAgICAvLyAtIENocm9tZQorICAgICAgICAvLyAtIENocm9tZUNhbmFyeQorICAgICAgICAvLyAtIEZpcmVmb3gKKyAgICAgICAgLy8gLSBPcGVyYSAoaGFzIHRvIGJlIGluc3RhbGxlZCB3aXRoIGBucG0gaW5zdGFsbCBrYXJtYS1vcGVyYS1sYXVuY2hlcmApCisgICAgICAgIC8vIC0gU2FmYXJpIChvbmx5IE1hYzsgaGFzIHRvIGJlIGluc3RhbGxlZCB3aXRoIGBucG0gaW5zdGFsbCBrYXJtYS1zYWZhcmktbGF1bmNoZXJgKQorICAgICAgICAvLyAtIFBoYW50b21KUworICAgICAgICAvLyAtIElFIChvbmx5IFdpbmRvd3M7IGhhcyB0byBiZSBpbnN0YWxsZWQgd2l0aCBgbnBtIGluc3RhbGwga2FybWEtaWUtbGF1bmNoZXJgKQorCisgICAgICAgIC8vTk9URTogVGhpcyBpcyBoYW5kbGVkIGZyb20gZ3J1bnRmaWxlLmpzCisKKyAgICAgICAgIGJyb3dzZXJzOiBbJ0Nocm9tZSddLAorCisKKyAgICAgICAgLy8gSWYgYnJvd3NlciBkb2VzIG5vdCBjYXB0dXJlIGluIGdpdmVuIHRpbWVvdXQgW21zXSwga2lsbCBpdAorICAgICAgICBjYXB0dXJlVGltZW91dDogNjAwMDAsCisKKworICAgICAgICAvLyBDb250aW51b3VzIEludGVncmF0aW9uIG1vZGUKKyAgICAgICAgLy8gaWYgdHJ1ZSwgaXQgY2FwdHVyZSBicm93c2VycywgcnVuIHRlc3RzIGFuZCBleGl0CisgICAgICAgIHNpbmdsZVJ1bjogZmFsc2UKKyAgICB9KTsKK307CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3RzZC5qc29uIGIvY2F0YWxvZy11aS90c2QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhmZmVjCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90c2QuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJ2ZXJzaW9uIjogInY0IiwKKyAgInJlcG8iOiAiYm9yaXN5YW5rb3YvRGVmaW5pdGVseVR5cGVkIiwKKyAgInJlZiI6ICJtYXN0ZXIiLAorICAicGF0aCI6ICJ0eXBpbmdzIiwKKyAgImJ1bmRsZSI6ICJ0eXBpbmdzL3RzZC5kLnRzIiwKKyAgImluc3RhbGxlZCI6IHsKKyAgICAibm90aWZ5anMvbm90aWZ5anMuZC50cyI6IHsKKyAgICAgICJjb21taXQiOiAiNTgxNTYzYzQ2ODRkNDA1YWZlYzE0MjYwYmE3OWE4OWE1MjY2NmMwOSIKKyAgICB9LAorICAgICJqYXNtaW5lL2phc21pbmUuZC50cyI6IHsKKyAgICAgICJjb21taXQiOiAiMTRhYjcwM2Y0MzUzNzUxOTQzNjBjZGJhM2FiYWI2MWFmYzg3OWMxOCIKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvdHNsaW50Lmpzb24gYi9jYXRhbG9nLXVpL3RzbGludC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDJkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3RzbGludC5qc29uCkBAIC0wLDAgKzEsNTggQEAKK3sKKyAgICAicnVsZXMiOiB7CisgICAgICAgICJjbGFzcy1uYW1lIjogdHJ1ZSwKKyAgICAgICAgImNvbW1lbnQtZm9ybWF0IjogWworICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAiY2hlY2stc3BhY2UiCisgICAgICAgIF0sCisgICAgICAgICJpbmRlbnQiOiBbCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgInNwYWNlcyIKKyAgICAgICAgXSwKKyAgICAgICAgIm5vLWR1cGxpY2F0ZS12YXJpYWJsZSI6IHRydWUsCisgICAgICAgICJuby1ldmFsIjogdHJ1ZSwKKyAgICAgICAgIm5vLWludGVybmFsLW1vZHVsZSI6IHRydWUsCisgICAgICAgICJuby10cmFpbGluZy13aGl0ZXNwYWNlIjogdHJ1ZSwKKyAgICAgICAgIm5vLXVuc2FmZS1maW5hbGx5IjogdHJ1ZSwKKyAgICAgICAgIm5vLXZhci1rZXl3b3JkIjogdHJ1ZSwKKyAgICAgICAgIm9uZS1saW5lIjogWworICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICJjaGVjay1vcGVuLWJyYWNlIiwKKyAgICAgICAgICAgICJjaGVjay13aGl0ZXNwYWNlIgorICAgICAgICBdLAorICAgICAgICAicXVvdGVtYXJrIjogWworICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAic2luZ2xlIgorICAgICAgICBdLAorICAgICAgICAic2VtaWNvbG9uIjogWworICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICJhbHdheXMiCisgICAgICAgIF0sCisgICAgICAgICJ0cmlwbGUtZXF1YWxzIjogWworICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICJhbGxvdy1udWxsLWNoZWNrIgorICAgICAgICBdLAorICAgICAgICAidHlwZWRlZi13aGl0ZXNwYWNlIjogWworICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY2FsbC1zaWduYXR1cmUiOiAibm9zcGFjZSIsCisgICAgICAgICAgICAgICAgImluZGV4LXNpZ25hdHVyZSI6ICJub3NwYWNlIiwKKyAgICAgICAgICAgICAgICAicGFyYW1ldGVyIjogIm5vc3BhY2UiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0eS1kZWNsYXJhdGlvbiI6ICJub3NwYWNlIiwKKyAgICAgICAgICAgICAgICAidmFyaWFibGUtZGVjbGFyYXRpb24iOiAibm9zcGFjZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgInZhcmlhYmxlLW5hbWUiOiBbCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgImJhbi1rZXl3b3JkcyIKKyAgICAgICAgXSwKKyAgICAgICAgIndoaXRlc3BhY2UiOiBbCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICJjaGVjay1icmFuY2giLAorICAgICAgICAgICAgImNoZWNrLWRlY2wiLAorICAgICAgICAgICAgImNoZWNrLW9wZXJhdG9yIiwKKyAgICAgICAgICAgICJjaGVjay1zZXBhcmF0b3IiLAorICAgICAgICAgICAgImNoZWNrLXR5cGUiCisgICAgICAgIF0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXItdWktYm9vdHN0cmFwL2FuZ3VsYXItdWktYm9vdHN0cmFwLmQudHMgYi9jYXRhbG9nLXVpL3R5cGluZ3MvYW5ndWxhci11aS1ib290c3RyYXAvYW5ndWxhci11aS1ib290c3RyYXAuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDYyZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXItdWktYm9vdHN0cmFwL2FuZ3VsYXItdWktYm9vdHN0cmFwLmQudHMKQEAgLTAsMCArMSw2NTggQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyBUeXBlIGRlZmluaXRpb25zIGZvciBBbmd1bGFyIFVJIEJvb3RzdHJhcCAwLjExLjAKKy8vIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyLXVpL2Jvb3RzdHJhcAorLy8gRGVmaW5pdGlvbnMgYnk6IEJyaWFuIFN1cm93aWVjIDxodHRwczovL2dpdGh1Yi5jb20veHQwcnRlZD4KKy8vIERlZmluaXRpb25zOiBodHRwczovL2dpdGh1Yi5jb20vYm9yaXN5YW5rb3YvRGVmaW5pdGVseVR5cGVkCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL2FuZ3VsYXJqcy9hbmd1bGFyLmQudHMiIC8+CisKK2RlY2xhcmUgbW9kdWxlIGFuZ3VsYXIudWkuYm9vdHN0cmFwIHsKKworICAgIGludGVyZmFjZSBJQWNjb3JkaW9uQ29uZmlnIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnRyb2xzIHdoZXRoZXIgZXhwYW5kaW5nIGFuIGl0ZW0gd2lsbCBjYXVzZSB0aGUgb3RoZXIgaXRlbXMgdG8gY2xvc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IHRydWUKKyAgICAgICAgICovCisgICAgICAgIGNsb3NlT3RoZXJzPzogYm9vbGVhbjsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBJQnV0dG9uQ29uZmlnIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBkZWZhdWx0OiAnYWN0aXZlJworICAgICAgICAgKi8KKyAgICAgICAgYWN0aXZlQ2xhc3M/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBkZWZhdWx0OiAnQ2xpY2snCisgICAgICAgICAqLworICAgICAgICB0b2dnbGVFdmVudD86IHN0cmluZzsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBJRGF0ZXBpY2tlckNvbmZpZyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3JtYXQgb2YgZGF5IGluIG1vbnRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAnZGQnCisgICAgICAgICAqLworICAgICAgICBkYXlGb3JtYXQ/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcm1hdCBvZiBtb250aCBpbiB5ZWFyLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAnTU1NJworICAgICAgICAgKi8KKyAgICAgICAgbW9udGhGb3JtYXQ/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcm1hdCBvZiB5ZWFyIGluIHllYXIgcmFuZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0ICd5eXl5JworICAgICAgICAgKi8KKyAgICAgICAgeWVhckZvcm1hdD86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9ybWF0IG9mIGRheSBpbiB3ZWVrIGhlYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgJ0VFRScKKyAgICAgICAgICovCisgICAgICAgIGRheUhlYWRlckZvcm1hdD86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9ybWF0IG9mIHRpdGxlIHdoZW4gc2VsZWN0aW5nIGRheS4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgJ01NTSB5eXl5JworICAgICAgICAgKi8KKyAgICAgICAgZGF5VGl0bGVGb3JtYXQ/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcm1hdCBvZiB0aXRsZSB3aGVuIHNlbGVjdGluZyBtb250aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgJ3l5eXknCisgICAgICAgICAqLworICAgICAgICBtb250aFRpdGxlRm9ybWF0Pzogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgd2VlayBudW1iZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCB0cnVlCisgICAgICAgICAqLworICAgICAgICBzaG93V2Vla3M/OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydGluZyBkYXkgb2YgdGhlIHdlZWsgZnJvbSAwLTYgd2hlcmUgMD1TdW5kYXkgYW5kIDY9U2F0dXJkYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IDAKKyAgICAgICAgICovCisgICAgICAgIHN0YXJ0aW5nRGF5PzogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOdW1iZXIgb2YgeWVhcnMgZGlzcGxheWVkIGluIHllYXIgc2VsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAyMAorICAgICAgICAgKi8KKyAgICAgICAgeWVhclJhbmdlPzogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZpbmVzIHRoZSBtaW5pbXVtIGF2YWlsYWJsZSBkYXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCBudWxsCisgICAgICAgICAqLworICAgICAgICBtaW5EYXRlPzogYW55OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZpbmVzIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBkYXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCBudWxsCisgICAgICAgICAqLworICAgICAgICBtYXhEYXRlPzogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBJRGF0ZXBpY2tlclBvcHVwQ29uZmlnIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmb3JtYXQgZm9yIGRpc3BsYXllZCBkYXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgJ3l5eXktTU0tZGQnCisgICAgICAgICAqLworICAgICAgICBkYXRlRm9ybWF0Pzogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgY3VycmVudCBkYXkgYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAnVG9kYXknCisgICAgICAgICAqLworICAgICAgICBjdXJyZW50VGV4dD86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRleHQgdG8gZGlzcGxheSBmb3IgdGhlIHRvZ2dsaW5nIHdlZWsgbnVtYmVycyBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0ICdXZWVrcycKKyAgICAgICAgICovCisgICAgICAgIHRvZ2dsZVdlZWtzVGV4dD86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRleHQgdG8gZGlzcGxheSBmb3IgdGhlIGNsZWFyIGJ1dHRvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgJ0NsZWFyJworICAgICAgICAgKi8KKyAgICAgICAgY2xlYXJUZXh0Pzogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgY2xvc2UgYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAnRG9uZScKKyAgICAgICAgICovCisgICAgICAgIGNsb3NlVGV4dD86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0byBjbG9zZSBjYWxlbmRhciB3aGVuIGEgZGF0ZSBpcyBjaG9zZW4uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IHRydWUKKyAgICAgICAgICovCisgICAgICAgIGNsb3NlT25EYXRlU2VsZWN0aW9uPzogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwZW5kIHRoZSBkYXRlcGlja2VyIHBvcHVwIGVsZW1lbnQgdG8gYGJvZHlgLCByYXRoZXIgdGhhbiBpbnNlcnRpbmcgYWZ0ZXIgYGRhdGVwaWNrZXItcG9wdXBgLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZQorICAgICAgICAgKi8KKyAgICAgICAgYXBwZW5kVG9Cb2R5PzogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0byBkaXNwbGF5IGEgYnV0dG9uIGJhciB1bmRlcm5lYXRoIHRoZSBkYXRlcGlja2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCB0cnVlCisgICAgICAgICAqLworICAgICAgICBzaG93QnV0dG9uQmFyPzogYm9vbGVhbjsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBJTW9kYWxTZXJ2aWNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSB7SU1vZGFsU2V0dGluZ3N9IG9wdGlvbnMKKyAgICAgICAgICogQHJldHVybnMge0lNb2RhbFNlcnZpY2VJbnN0YW5jZX0KKyAgICAgICAgICovCisgICAgICAgIG9wZW4ob3B0aW9uczogSU1vZGFsU2V0dGluZ3MpOiBJTW9kYWxTZXJ2aWNlSW5zdGFuY2U7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElNb2RhbFNlcnZpY2VJbnN0YW5jZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNsb3NlIGEgbW9kYWwsIHBhc3NpbmcgYSByZXN1bHQKKyAgICAgICAgICovCisgICAgICAgIGNsb3NlKHJlc3VsdD86IGFueSk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlzbWlzcyBhIG1vZGFsLCBwYXNzaW5nIGEgcmVhc29uCisgICAgICAgICAqLworICAgICAgICBkaXNtaXNzKHJlYXNvbj86IGFueSk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYSBtb2RhbCBpcyBjbG9zZWQgYW5kIHJlamVjdGVkIHdoZW4gYSBtb2RhbCBpcyBkaXNtaXNzZWQKKyAgICAgICAgICovCisgICAgICAgIHJlc3VsdDogYW5ndWxhci5JUHJvbWlzZTxhbnk+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGEgbW9kYWwgZ2V0cyBvcGVuZWQgYWZ0ZXIgZG93bmxvYWRpbmcgY29udGVudCdzIHRlbXBsYXRlIGFuZCByZXNvbHZpbmcgYWxsIHZhcmlhYmxlcworICAgICAgICAgKi8KKyAgICAgICAgb3BlbmVkOiBhbmd1bGFyLklQcm9taXNlPGFueT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIElNb2RhbFNjb3BlIGV4dGVuZHMgYW5ndWxhci5JU2NvcGUgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhvc2UgbWV0aG9kcyBtYWtlIGl0IGVhc3kgdG8gY2xvc2UgYSBtb2RhbCB3aW5kb3cgd2l0aG91dCBhIG5lZWQgdG8gY3JlYXRlIGEgZGVkaWNhdGVkIGNvbnRyb2xsZXIKKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc21pc3MgdGhlIGRpYWxvZyB3aXRob3V0IGFzc2lnbmluZyBhIHZhbHVlIHRvIHRoZSBwcm9taXNlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgJGRpc21pc3MocmVhc29uPzogYW55KTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhlIGRpYWxvZyByZXNvbHZpbmcgdGhlIHByb21pc2UgdG8gdGhlIGdpdmVuIHZhbHVlCisgICAgICAgICAqLworICAgICAgICAkY2xvc2UocmVzdWx0PzogYW55KTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSU1vZGFsU2V0dGluZ3MgeworICAgICAgICAvKioKKyAgICAgICAgICogYSBwYXRoIHRvIGEgdGVtcGxhdGUgcmVwcmVzZW50aW5nIG1vZGFsJ3MgY29udGVudAorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGVVcmw/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGlubGluZSB0ZW1wbGF0ZSByZXByZXNlbnRpbmcgdGhlIG1vZGFsJ3MgY29udGVudAorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGEgc2NvcGUgaW5zdGFuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIG1vZGFsJ3MgY29udGVudCAoYWN0dWFsbHkgdGhlICRtb2RhbCBzZXJ2aWNlIGlzIGdvaW5nIHRvIGNyZWF0ZSBhIGNoaWxkIHNjb3BlIG9mIGEgcHJvdmlkZWQgc2NvcGUpLgorICAgICAgICAgKiBEZWZhdWx0cyB0byBgJHJvb3RTY29wZWAuCisgICAgICAgICAqLworICAgICAgICBzY29wZT86IGFuZ3VsYXIuSVNjb3BlfElNb2RhbFNjb3BlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBhIGNvbnRyb2xsZXIgZm9yIGEgbW9kYWwgaW5zdGFuY2UgLSBpdCBjYW4gaW5pdGlhbGl6ZSBzY29wZSB1c2VkIGJ5IG1vZGFsLgorICAgICAgICAgKiBBIGNvbnRyb2xsZXIgY2FuIGJlIGluamVjdGVkIHdpdGggYCRtb2RhbEluc3RhbmNlYAorICAgICAgICAgKi8KKyAgICAgICAgY29udHJvbGxlcj86IGFueTsKKworICAgICAgICAvKioKKyAgICAgICAgICogIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBjb250cm9sbGVyLWFzIHN5bnRheCwgbWF0Y2hpbmcgdGhlIEFQSSBvZiBkaXJlY3RpdmUgZGVmaW5pdGlvbnMuCisgICAgICAgICAqICBSZXF1aXJlcyB0aGUgY29udHJvbGxlciBvcHRpb24gdG8gYmUgcHJvdmlkZWQgYXMgd2VsbAorICAgICAgICAgKi8KKyAgICAgICAgY29udHJvbGxlckFzPzogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBtZW1iZXJzIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhbmQgcGFzc2VkIHRvIHRoZSBjb250cm9sbGVyIGFzIGxvY2FsczsgaXQgaXMgZXF1aXZhbGVudCBvZiB0aGUgYHJlc29sdmVgIHByb3BlcnR5IGZvciBBbmd1bGFySlMgcm91dGVzCisgICAgICAgICAqLworICAgICAgICByZXNvbHZlPzogYW55OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBjb250cm9scyB0aGUgcHJlc2VuY2Ugb2YgYSBiYWNrZHJvcAorICAgICAgICAgKiBBbGxvd2VkIHZhbHVlczoKKyAgICAgICAgICogICAtIHRydWUgKGRlZmF1bHQpCisgICAgICAgICAqICAgLSBmYWxzZSAobm8gYmFja2Ryb3ApCisgICAgICAgICAqICAgLSAnc3RhdGljJyBiYWNrZHJvcCBpcyBwcmVzZW50IGJ1dCBtb2RhbCB3aW5kb3cgaXMgbm90IGNsb3NlZCB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIG1vZGFsIHdpbmRvdworICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCB0cnVlCisgICAgICAgICAqLworICAgICAgICBiYWNrZHJvcD86IGFueTsKKworICAgICAgICAvKioKKyAgICAgICAgICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgY2xvc2FibGUgYnkgaGl0dGluZyB0aGUgRVNDIGtleSwgZGVmYXVsdHMgdG8gdHJ1ZQorICAgICAgICAgKi8KKyAgICAgICAga2V5Ym9hcmQ/OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBhZGRpdGlvbmFsIENTUyBjbGFzcyhlcykgdG8gYmUgYWRkZWQgdG8gYSBtb2RhbCB3aW5kb3cgdGVtcGxhdGUKKyAgICAgICAgICovCisgICAgICAgIHdpbmRvd0NsYXNzPzogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBvcHRpb25hbCBzaXplIG9mIG1vZGFsIHdpbmRvdy4gQWxsb3dlZCB2YWx1ZXM6ICdzbScgKHNtYWxsKSBvciAnbGcnIChsYXJnZSkuIFJlcXVpcmVzIEJvb3RzdHJhcCAzLjEuMCBvciBsYXRlcgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZT86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogYSBwYXRoIHRvIGEgdGVtcGxhdGUgb3ZlcnJpZGluZyBtb2RhbCdzIHdpbmRvdyB0ZW1wbGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgd2luZG93VGVtcGxhdGVVcmw/OiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElNb2RhbFN0YWNrU2VydmljZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBPcGVucyBhIG5ldyBtb2RhbCBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIG9wZW4obW9kYWxJbnN0YW5jZTogSU1vZGFsU2VydmljZUluc3RhbmNlLCBtb2RhbDogYW55KTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2VzIGEgbW9kYWwgaW5zdGFuY2Ugd2l0aCBhbiBvcHRpb25hbCByZXN1bHQuCisgICAgICAgICAqLworICAgICAgICBjbG9zZShtb2RhbEluc3RhbmNlOiBJTW9kYWxTZXJ2aWNlSW5zdGFuY2UsIHJlc3VsdD86IGFueSk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc21pc3NlcyBhIG1vZGFsIGluc3RhbmNlIHdpdGggYW4gb3B0aW9uYWwgcmVhc29uLgorICAgICAgICAgKi8KKyAgICAgICAgZGlzbWlzcyhtb2RhbEluc3RhbmNlOiBJTW9kYWxTZXJ2aWNlSW5zdGFuY2UsIHJlYXNvbj86IGFueSk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc21pc3MgYWxsIG9wZW4gbW9kYWwgaW5zdGFuY2VzIHdpdGggYW4gb3B0aW9uYWwgcmVhc29uIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gZWFjaCBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIGRpc21pc3NBbGwocmVhc29uPzogYW55KTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdG9wbW9zdCBtb2RhbCBpbnN0YW5jZSB0aGF0IGlzIG9wZW4uCisgICAgICAgICAqLworICAgICAgICBnZXRUb3AoKTogSU1vZGFsU3RhY2tlZE1hcEtleVZhbHVlUGFpcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSU1vZGFsU3RhY2tlZE1hcEtleVZhbHVlUGFpciB7CisgICAgICAgIGtleTogSU1vZGFsU2VydmljZUluc3RhbmNlOworICAgICAgICB2YWx1ZTogYW55OworICAgIH0KKworCisgICAgaW50ZXJmYWNlIElQYWdpbmF0aW9uQ29uZmlnIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEN1cnJlbnQgcGFnZSBudW1iZXIuIEZpcnN0IHBhZ2UgaXMgMS4KKyAgICAgICAgICovCisgICAgICAgIHBhZ2U/OiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiBhbGwgcGFnZXMuCisgICAgICAgICAqLworICAgICAgICB0b3RhbEl0ZW1zPzogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyBwZXIgcGFnZS4gQSB2YWx1ZSBsZXNzIHRoYW4gb25lIGluZGljYXRlcyBhbGwgaXRlbXMgb24gb25lIHBhZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IDEwCisgICAgICAgICAqLworICAgICAgICBpdGVtc1BlclBhZ2U/OiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExpbWl0IG51bWJlciBmb3IgcGFnaW5hdGlvbiBzaXplLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdDogbnVsbAorICAgICAgICAgKi8KKyAgICAgICAgbWF4U2l6ZT86IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiBhc3NpZ25lZCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHRvIGRpc3BsYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IGFuZ3VsYXIubm9vcAorICAgICAgICAgKi8KKyAgICAgICAgbnVtUGFnZXM/OiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdG8ga2VlcCBjdXJyZW50IHBhZ2UgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdmlzaWJsZSBvbmVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCB0cnVlCisgICAgICAgICAqLworICAgICAgICByb3RhdGU/OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBvcHRpb25hbCBleHByZXNzaW9uIGNhbGxlZCB3aGVuIGEgcGFnZSBpcyBzZWxlY3RlZCBoYXZpbmcgdGhlIHBhZ2UgbnVtYmVyIGFzIGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCBudWxsCisgICAgICAgICAqLworICAgICAgICBvblNlbGVjdFBhZ2U/KHBhZ2U6IG51bWJlcik6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdG8gZGlzcGxheSBQcmV2aW91cyAvIE5leHQgYnV0dG9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgdHJ1ZQorICAgICAgICAgKi8KKyAgICAgICAgZGlyZWN0aW9uTGlua3M/OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXh0IGZvciBQcmV2aW91cyBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0ICdQcmV2aW91cycKKyAgICAgICAgICovCisgICAgICAgIHByZXZpb3VzVGV4dD86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGV4dCBmb3IgTmV4dCBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0ICdOZXh0JworICAgICAgICAgKi8KKyAgICAgICAgbmV4dFRleHQ/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdG8gZGlzcGxheSBGaXJzdCAvIExhc3QgYnV0dG9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgZmFsc2UKKyAgICAgICAgICovCisgICAgICAgIGJvdW5kYXJ5TGlua3M/OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXh0IGZvciBGaXJzdCBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0ICdGaXJzdCcKKyAgICAgICAgICovCisgICAgICAgIGZpcnN0VGV4dD86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGV4dCBmb3IgTGFzdCBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0ICdMYXN0JworICAgICAgICAgKi8KKyAgICAgICAgbGFzdFRleHQ/OiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElQYWdlckNvbmZpZyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHRvIGFsaWduIGVhY2ggbGluayB0byB0aGUgc2lkZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IHRydWUKKyAgICAgICAgICovCisgICAgICAgIGFsaWduPzogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3VycmVudCBwYWdlIG51bWJlci4gRmlyc3QgcGFnZSBpcyAxLgorICAgICAgICAgKi8KKyAgICAgICAgcGFnZT86IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIGFsbCBwYWdlcy4KKyAgICAgICAgICovCisgICAgICAgIHRvdGFsSXRlbXM/OiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHBlciBwYWdlLiBBIHZhbHVlIGxlc3MgdGhhbiBvbmUgaW5kaWNhdGVzIGFsbCBpdGVtcyBvbiBvbmUgcGFnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgMTAKKyAgICAgICAgICovCisgICAgICAgIGl0ZW1zUGVyUGFnZT86IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiBhc3NpZ25lZCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHRvIGRpc3BsYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IGFuZ3VsYXIubm9vcAorICAgICAgICAgKi8KKyAgICAgICAgbnVtUGFnZXM/OiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIG9wdGlvbmFsIGV4cHJlc3Npb24gY2FsbGVkIHdoZW4gYSBwYWdlIGlzIHNlbGVjdGVkIGhhdmluZyB0aGUgcGFnZSBudW1iZXIgYXMgYXJndW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IG51bGwKKyAgICAgICAgICovCisgICAgICAgIG9uU2VsZWN0UGFnZT8ocGFnZTogbnVtYmVyKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGV4dCBmb3IgUHJldmlvdXMgYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAnwqsgUHJldmlvdXMnCisgICAgICAgICAqLworICAgICAgICBwcmV2aW91c1RleHQ/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRleHQgZm9yIE5leHQgYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAnTmV4dCDCuycKKyAgICAgICAgICovCisgICAgICAgIG5leHRUZXh0Pzogc3RyaW5nOworICAgIH0KKworCisgICAgaW50ZXJmYWNlIElQb3NpdGlvbkNvb3JkaW5hdGVzIHsKKyAgICAgICAgd2lkdGg/OiBudW1iZXI7CisgICAgICAgIGhlaWdodD86IG51bWJlcjsKKyAgICAgICAgdG9wPzogbnVtYmVyOworICAgICAgICBsZWZ0PzogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBJUG9zaXRpb25TZXJ2aWNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb3ZpZGVzIGEgcmVhZC1vbmx5IGVxdWl2YWxlbnQgb2YgalF1ZXJ5J3MgcG9zaXRpb24gZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwb3NpdGlvbihlbGVtZW50OiBKUXVlcnkpOiBJUG9zaXRpb25Db29yZGluYXRlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvdmlkZXMgYSByZWFkLW9ubHkgZXF1aXZhbGVudCBvZiBqUXVlcnkncyBvZmZzZXQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBvZmZzZXQoZWxlbWVudDogSlF1ZXJ5KTogSVBvc2l0aW9uQ29vcmRpbmF0ZXM7CisgICAgfQorCisKKyAgICBpbnRlcmZhY2UgSVByb2dyZXNzQ29uZmlnIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgYmFycyB1c2UgdHJhbnNpdGlvbnMgdG8gYWNoaWV2ZSB0aGUgd2lkdGggY2hhbmdlLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdDogdHJ1ZQorICAgICAgICAgKi8KKyAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbnVtYmVyIHRoYXQgc3BlY2lmaWVzIHRoZSB0b3RhbCB2YWx1ZSBvZiBiYXJzIHRoYXQgaXMgcmVxdWlyZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0OiAxMDAKKyAgICAgICAgICovCisgICAgICAgIG1heD86IG51bWJlcjsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBJUmF0aW5nQ29uZmlnIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoYW5nZXMgdGhlIG51bWJlciBvZiBpY29ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQ6IDUKKyAgICAgICAgICovCisgICAgICAgIG1heD86IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSB2YXJpYWJsZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZSB0byBzcGVjaWZ5IHRoZSBzdGF0ZSBmb3Igc2VsZWN0ZWQgaWNvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0OiBudWxsCisgICAgICAgICAqLworICAgICAgICBzdGF0ZU9uPzogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHZhcmlhYmxlIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRvIHNwZWNpZnkgdGhlIHN0YXRlIGZvciB1bnNlbGVjdGVkIGljb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdDogbnVsbAorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGVPZmY/OiBzdHJpbmc7CisgICAgfQorCisKKyAgICBpbnRlcmZhY2UgSVRpbWVwaWNrZXJDb25maWcgeworICAgICAgICAvKioKKyAgICAgICAgICogTnVtYmVyIG9mIGhvdXJzIHRvIGluY3JlYXNlIG9yIGRlY3JlYXNlIHdoZW4gdXNpbmcgYSBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IDEKKyAgICAgICAgICovCisgICAgICAgIGhvdXJTdGVwPzogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOdW1iZXIgb2YgbWludXRlcyB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSB3aGVuIHVzaW5nIGEgYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCAxCisgICAgICAgICAqLworICAgICAgICBtaW51dGVTdGVwPzogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgMTJIIG9yIDI0SCBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCB0cnVlCisgICAgICAgICAqLworICAgICAgICBzaG93TWVyaWRpYW4/OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXJpZGlhbiBsYWJlbHMgYmFzZWQgb24gbG9jYWxlLiBUbyBvdmVycmlkZSB5b3UgbXVzdCBzdXBwbHkgYW4gYXJyYXkgbGlrZSBbJ0FNJywgJ1BNJ10uCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IG51bGwKKyAgICAgICAgICovCisgICAgICAgIG1lcmlkaWFucz86IEFycmF5PHN0cmluZz47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgY2FuIHR5cGUgaW5zaWRlIHRoZSBob3VycyAmIG1pbnV0ZXMgaW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IGZhbHNlCisgICAgICAgICAqLworICAgICAgICByZWFkb25seUlucHV0PzogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0aGUgdXNlciBjYW4gc2Nyb2xsIGluc2lkZSB0aGUgaG91cnMgJiBtaW51dGVzIGlucHV0IHRvIGluY3JlYXNlIG9yIGRlY3JlYXNlIGl0J3MgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVmYXVsdCB0cnVlCisgICAgICAgICAqLworICAgICAgICBtb3VzZXdoZWVsPzogYm9vbGVhbjsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBJVG9vbHRpcE9wdGlvbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogV2hlcmUgdG8gcGxhY2UgaXQ/IERlZmF1bHRzIHRvICd0b3AnLCBidXQgYWxzbyBhY2NlcHRzICdyaWdodCcsICdib3R0b20nLCBvciAnbGVmdCcuCisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0ICd0b3AnCisgICAgICAgICAqLworICAgICAgICBwbGFjZW1lbnQ/OiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNob3VsZCBpdCBmYWRlIGluIGFuZCBvdXQ/CisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IHRydWUKKyAgICAgICAgICovCisgICAgICAgIGFuaW1hdGlvbj86IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciBob3cgbG9uZyBzaG91bGQgdGhlIHVzZXIgaGF2ZSB0byBoYXZlIHRoZSBtb3VzZSBvdmVyIHRoZSBlbGVtZW50IGJlZm9yZSB0aGUgdG9vbHRpcCBzaG93cyAoaW4gbWlsbGlzZWNvbmRzKT8KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlZmF1bHQgMAorICAgICAgICAgKi8KKyAgICAgICAgcG9wdXBEZWxheT86IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2hvdWxkIHRoZSB0b29sdGlwIGJlIGFwcGVuZGVkIHRvIGAkYm9keWAgaW5zdGVhZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQ/CisgICAgICAgICAqCisgICAgICAgICAqIEBkZWZhdWx0IGZhbHNlCisgICAgICAgICAqLworICAgICAgICBhcHBlbmR0b0JvZHk/OiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBJVG9vbHRpcFByb3ZpZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb3ZpZGUgYSBzZXQgb2YgZGVmYXVsdHMgZm9yIGNlcnRhaW4gdG9vbHRpcCBhbmQgcG9wb3ZlciBhdHRyaWJ1dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgb3B0aW9ucyh2YWx1ZTogSVRvb2x0aXBPcHRpb25zKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXh0ZW5kcyB0aGUgZGVmYXVsdCB0cmlnZ2VyIG1hcHBpbmdzIHdpdGggbWFwcGluZ3Mgb2YgeW91ciBvd24uIEUuZy4gYHsgJ29wZW5UcmlnZ2VyJzogJ2Nsb3NlVHJpZ2dlcicgfWAuCisgICAgICAgICAqLworICAgICAgICBzZXRUcmlnZ2Vycyh0cmlnZ2VyczogT2JqZWN0KTogdm9pZDsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBJVHJhbnNpdGlvblNlcnZpY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGJyb3dzZXIgc3BlY2lmaWMgYW5pbWF0aW9uIGV2ZW50IG5hbWUuCisgICAgICAgICAqLworICAgICAgICBhbmltYXRpb25FbmRFdmVudE5hbWU6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGJyb3dzZXIgc3BlY2lmaWMgdHJhbnNpdGlvbiBldmVudCBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgdHJhbnNpdGlvbkVuZEV2ZW50TmFtZTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm92aWRlcyBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHRvIHRyaWdnZXIgQ1NTIDMgdHJhbnNpdGlvbnMgYW5kIHRvIGJlIGluZm9ybWVkIHdoZW4gdGhleSBjb21wbGV0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTUVsZW1lbnQgdGhhdCB3aWxsIGJlIGFuaW1hdGVkCisgICAgICAgICAqIEBwYXJhbSB0cmlnZ2VyIFRoZSB0aGluZyB0aGF0IHdpbGwgY2F1c2UgdGhlIHRyYW5zaXRpb24gdG8gc3RhcnQ6CisgICAgICAgICAqICAgLSBBcyBhIHN0cmluZywgaXQgcmVwcmVzZW50cyB0aGUgY3NzIGNsYXNzIHRvIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50LgorICAgICAgICAgKiAgIC0gQXMgYW4gb2JqZWN0LCBpdCByZXByZXNlbnRzIGEgaGFzaCBvZiBzdHlsZSBhdHRyaWJ1dGVzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgLSBBcyBhIGZ1bmN0aW9uLCBpdCByZXByZXNlbnRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRoYXQgd2lsbCBjYXVzZSB0aGUgdHJhbnNpdGlvbiB0byBvY2N1ci4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgc2V0dGluZ3MgZm9yIHRoZSB0cmFuc2l0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHRyYW5zaXRpb24gZmluaXNoZXMuCisgICAgICAgICAqLworICAgICAgICAoZWxlbWVudDogYW5ndWxhci5JQXVnbWVudGVkSlF1ZXJ5LCB0cmlnZ2VyOiBhbnksIG9wdGlvbnM/OiBJVHJhbnNpdGlvblNlcnZpY2VPcHRpb25zKTogYW5ndWxhci5JUHJvbWlzZTxhbmd1bGFyLklBdWdtZW50ZWRKUXVlcnk+OworICAgIH0KKworICAgIGludGVyZmFjZSBJVHJhbnNpdGlvblNlcnZpY2VPcHRpb25zIHsKKyAgICAgICAgYW5pbWF0aW9uPzogYm9vbGVhbjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvdHlwaW5ncy9hbmd1bGFyLXVpLXJvdXRlci9hbmd1bGFyLXVpLXJvdXRlci5kLnRzIGIvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXItdWktcm91dGVyL2FuZ3VsYXItdWktcm91dGVyLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3NDI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvdHlwaW5ncy9hbmd1bGFyLXVpLXJvdXRlci9hbmd1bGFyLXVpLXJvdXRlci5kLnRzCkBAIC0wLDAgKzEsMjA3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8gVHlwZSBkZWZpbml0aW9ucyBmb3IgQW5ndWxhciBKUyAxLjEuNSsgKHVpLnJvdXRlciBtb2R1bGUpCisvLyBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci11aS91aS1yb3V0ZXIKKy8vIERlZmluaXRpb25zIGJ5OiBNaWNoZWwgU2FsaWIgPGh0dHBzOi8vZ2l0aHViLmNvbS9taWNoZWxzYWxpYj4KKy8vIERlZmluaXRpb25zOiBodHRwczovL2dpdGh1Yi5jb20vYm9yaXN5YW5rb3YvRGVmaW5pdGVseVR5cGVkCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL2FuZ3VsYXJqcy9hbmd1bGFyLmQudHMiIC8+CisKK2RlY2xhcmUgbW9kdWxlIGFuZ3VsYXIudWkgeworCisgICAgaW50ZXJmYWNlIElTdGF0ZSB7CisgICAgICAgIG5hbWU/OiBzdHJpbmc7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTdHJpbmcgSFRNTCBjb250ZW50LCBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gSFRNTCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPzogc3RyaW5nIHwgeygpOiBzdHJpbmd9OworICAgICAgICAvKioKKyAgICAgICAgICogU3RyaW5nIFVSTCBwYXRoIHRvIHRlbXBsYXRlIGZpbGUgT1IgRnVuY3Rpb24sIHJldHVybnMgVVJMIHBhdGggc3RyaW5nCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyB8IHsoKTogc3RyaW5nfTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZ1bmN0aW9uLCByZXR1cm5zIEhUTUwgY29udGVudCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlUHJvdmlkZXI/OiBGdW5jdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgY29udHJvbGxlciBwYWlyZWQgdG8gdGhlIHN0YXRlLiBGdW5jdGlvbiBPUiBuYW1lIGFzIFN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgY29udHJvbGxlcj86IEZ1bmN0aW9uIHwgc3RyaW5nOworICAgICAgICBjb250cm9sbGVyQXM/OiBzdHJpbmc7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGdW5jdGlvbiAoaW5qZWN0YWJsZSksIHJldHVybnMgdGhlIGFjdHVhbCBjb250cm9sbGVyIGZ1bmN0aW9uIG9yIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIGNvbnRyb2xsZXJQcm92aWRlcj86IEZ1bmN0aW9uOworICAgICAgICByZXNvbHZlPzoge307CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHVybCB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMuIFdoZW4gYSBzdGF0ZSBpcyBuYXZpZ2F0ZWQgb3IgdHJhbnNpdGlvbmVkIHRvLCB0aGUgJHN0YXRlUGFyYW1zIHNlcnZpY2Ugd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbnkgcGFyYW1ldGVycyB0aGF0IHdlcmUgcGFzc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgdXJsPzogc3RyaW5nOworICAgICAgICAvKioKKyAgICAgICAgICogQSBtYXAgd2hpY2ggb3B0aW9uYWxseSBjb25maWd1cmVzIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIHVybCwgb3IgZGVmaW5lcyBhZGRpdGlvbmFsIG5vbi11cmwgcGFyYW1ldGVycy4gT25seSB1c2UgdGhpcyB3aXRoaW4gYSBzdGF0ZSBpZiB5b3UgYXJlIG5vdCB1c2luZyB1cmwuIE90aGVyd2lzZSB5b3UgY2FuIHNwZWNpZnkgeW91ciBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdXJsLiBXaGVuIGEgc3RhdGUgaXMgbmF2aWdhdGVkIG9yIHRyYW5zaXRpb25lZCB0bywgdGhlICRzdGF0ZVBhcmFtcyBzZXJ2aWNlIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYW55IHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHBhc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHBhcmFtcz86IGFueTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB0aGUgdmlld3MgcHJvcGVydHkgdG8gc2V0IHVwIG11bHRpcGxlIHZpZXdzLiBJZiB5b3UgZG9uJ3QgbmVlZCBtdWx0aXBsZSB2aWV3cyB3aXRoaW4gYSBzaW5nbGUgc3RhdGUgdGhpcyBwcm9wZXJ0eSBpcyBub3QgbmVlZGVkLiBUaXA6IHJlbWVtYmVyIHRoYXQgb2Z0ZW4gbmVzdGVkIHZpZXdzIGFyZSBtb3JlIHVzZWZ1bCBhbmQgcG93ZXJmdWwgdGhhbiBtdWx0aXBsZSBzaWJsaW5nIHZpZXdzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlld3M/OiB7fTsKKyAgICAgICAgYWJzdHJhY3Q/OiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gYSBzdGF0ZSBpcyBlbnRlcmVkLiBHb29kIHdheSB0byB0cmlnZ2VyIGFuIGFjdGlvbiBvciBkaXNwYXRjaCBhbiBldmVudCwgc3VjaCBhcyBvcGVuaW5nIGEgZGlhbG9nLgorICAgICAgICAgKiBJZiBtaW5pZnlpbmcgeW91ciBzY3JpcHRzLCBtYWtlIHN1cmUgdG8gZXhwbGljdGx5IGFubm90YXRlIHRoaXMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgd29uJ3QgYmUgYXV0b21hdGljYWxseSBhbm5vdGF0ZWQgYnkgeW91ciBidWlsZCB0b29scy4KKyAgICAgICAgICovCisgICAgICAgIG9uRW50ZXI/OiBGdW5jdGlvbnwoc3RyaW5nfEZ1bmN0aW9uKVtdOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciB3aGVuIGEgc3RhdGUgaXMgZW50ZXJlZCBhbmQgZXhpdGVkLiBHb29kIHdheSB0byB0cmlnZ2VyIGFuIGFjdGlvbiBvciBkaXNwYXRjaCBhbiBldmVudCwgc3VjaCBhcyBvcGVuaW5nIGEgZGlhbG9nLgorICAgICAgICAgKiBJZiBtaW5pZnlpbmcgeW91ciBzY3JpcHRzLCBtYWtlIHN1cmUgdG8gZXhwbGljdGx5IGFubm90YXRlIHRoaXMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgd29uJ3QgYmUgYXV0b21hdGljYWxseSBhbm5vdGF0ZWQgYnkgeW91ciBidWlsZCB0b29scy4KKyAgICAgICAgICovCisgICAgICAgIG9uRXhpdD86IEZ1bmN0aW9ufChzdHJpbmd8RnVuY3Rpb24pW107CisgICAgICAgIC8qKgorICAgICAgICAgKiBBcmJpdHJhcnkgZGF0YSBvYmplY3QsIHVzZWZ1bCBmb3IgY3VzdG9tIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBkYXRhPzogYW55OworICAgICAgICAvKioKKyAgICAgICAgICogQm9vbGVhbiAoZGVmYXVsdCB0cnVlKS4gSWYgZmFsc2Ugd2lsbCBub3QgcmV0cmlnZ2VyIHRoZSBzYW1lIHN0YXRlIGp1c3QgYmVjYXVzZSBhIHNlYXJjaC9xdWVyeSBwYXJhbWV0ZXIgaGFzIGNoYW5nZWQuIFVzZWZ1bCBmb3Igd2hlbiB5b3UnZCBsaWtlIHRvIG1vZGlmeSAkbG9jYXRpb24uc2VhcmNoKCkgd2l0aG91dCB0cmlnZ2VyaW5nIGEgcmVsb2FkLgorICAgICAgICAgKi8KKyAgICAgICAgcmVsb2FkT25TZWFyY2g/OiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBJU3RhdGVQcm92aWRlciBleHRlbmRzIG5nLklTZXJ2aWNlUHJvdmlkZXIgeworICAgICAgICBzdGF0ZShuYW1lOnN0cmluZywgY29uZmlnOklTdGF0ZSk6IElTdGF0ZVByb3ZpZGVyOworICAgICAgICBzdGF0ZShjb25maWc6SVN0YXRlKTogSVN0YXRlUHJvdmlkZXI7CisgICAgICAgIGRlY29yYXRvcihuYW1lPzogc3RyaW5nLCBkZWNvcmF0b3I/OiAoc3RhdGU6IElTdGF0ZSwgcGFyZW50OiBGdW5jdGlvbikgPT4gYW55KTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBJVXJsTWF0Y2hlciB7CisgICAgICAgIGNvbmNhdChwYXR0ZXJuOiBzdHJpbmcpOiBJVXJsTWF0Y2hlcjsKKyAgICAgICAgZXhlYyhwYXRoOiBzdHJpbmcsIHNlYXJjaFBhcmFtczoge30pOiB7fTsKKyAgICAgICAgcGFyYW1ldGVycygpOiBzdHJpbmdbXTsKKyAgICAgICAgZm9ybWF0KHZhbHVlczoge30pOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElVcmxNYXRjaGVyRmFjdG9yeSB7CisgICAgICAgIGNvbXBpbGUocGF0dGVybjogc3RyaW5nKTogSVVybE1hdGNoZXI7CisgICAgICAgIGlzTWF0Y2hlcihvOiBhbnkpOiBib29sZWFuOworICAgICAgICB0eXBlKG5hbWU6IHN0cmluZywgZGVmaW5pdGlvbjogYW55LCBkZWZpbml0aW9uRm4/OiBhbnkpOiBhbnk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElVcmxSb3V0ZXJQcm92aWRlciBleHRlbmRzIG5nLklTZXJ2aWNlUHJvdmlkZXIgeworICAgICAgICB3aGVuKHdoZW5QYXRoOiBSZWdFeHAsIGhhbmRsZXI6IEZ1bmN0aW9uKTogSVVybFJvdXRlclByb3ZpZGVyOworICAgICAgICB3aGVuKHdoZW5QYXRoOiBSZWdFeHAsIGhhbmRsZXI6IGFueVtdKTogSVVybFJvdXRlclByb3ZpZGVyOworICAgICAgICB3aGVuKHdoZW5QYXRoOiBSZWdFeHAsIHRvUGF0aDogc3RyaW5nKTogSVVybFJvdXRlclByb3ZpZGVyOworICAgICAgICB3aGVuKHdoZW5QYXRoOiBJVXJsTWF0Y2hlciwgaGFubGRlcjogRnVuY3Rpb24pOiBJVXJsUm91dGVyUHJvdmlkZXI7CisgICAgICAgIHdoZW4od2hlblBhdGg6IElVcmxNYXRjaGVyLCBoYW5kbGVyOiBhbnlbXSk6IElVcmxSb3V0ZXJQcm92aWRlcjsKKyAgICAgICAgd2hlbih3aGVuUGF0aDogSVVybE1hdGNoZXIsIHRvUGF0aDogc3RyaW5nKTogSVVybFJvdXRlclByb3ZpZGVyOworICAgICAgICB3aGVuKHdoZW5QYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogSVVybFJvdXRlclByb3ZpZGVyOworICAgICAgICB3aGVuKHdoZW5QYXRoOiBzdHJpbmcsIGhhbmRsZXI6IGFueVtdKTogSVVybFJvdXRlclByb3ZpZGVyOworICAgICAgICB3aGVuKHdoZW5QYXRoOiBzdHJpbmcsIHRvUGF0aDogc3RyaW5nKTogSVVybFJvdXRlclByb3ZpZGVyOworICAgICAgICBvdGhlcndpc2UoaGFuZGxlcjogRnVuY3Rpb24pOiBJVXJsUm91dGVyUHJvdmlkZXI7CisgICAgICAgIG90aGVyd2lzZShoYW5kbGVyOiBhbnlbXSk6IElVcmxSb3V0ZXJQcm92aWRlcjsKKyAgICAgICAgb3RoZXJ3aXNlKHBhdGg6IHN0cmluZyk6IElVcmxSb3V0ZXJQcm92aWRlcjsKKyAgICAgICAgcnVsZShoYW5kbGVyOiBGdW5jdGlvbik6IElVcmxSb3V0ZXJQcm92aWRlcjsKKyAgICAgICAgcnVsZShoYW5kbGVyOiBhbnlbXSk6IElVcmxSb3V0ZXJQcm92aWRlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSVN0YXRlT3B0aW9ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiB7Ym9vbGVhbj10cnVlfHN0cmluZz19IC0gSWYgdHJ1ZSB3aWxsIHVwZGF0ZSB0aGUgdXJsIGluIHRoZSBsb2NhdGlvbiBiYXIsIGlmIGZhbHNlIHdpbGwgbm90LiBJZiBzdHJpbmcsIG11c3QgYmUgInJlcGxhY2UiLCB3aGljaCB3aWxsIHVwZGF0ZSB1cmwgYW5kIGFsc28gcmVwbGFjZSBsYXN0IGhpc3RvcnkgcmVjb3JkLgorICAgICAgICAgKi8KKyAgICAgICAgbG9jYXRpb24/OiBib29sZWFuIHwgc3RyaW5nOworICAgICAgICAvKioKKyAgICAgICAgICogIHtib29sZWFuPXRydWV9LCBJZiB0cnVlIHdpbGwgaW5oZXJpdCB1cmwgcGFyYW1ldGVycyBmcm9tIGN1cnJlbnQgdXJsLgorICAgICAgICAgKi8KKyAgICAgICAgaW5oZXJpdD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiB7b2JqZWN0PSRzdGF0ZS4kY3VycmVudH0sIFdoZW4gdHJhbnNpdGlvbmluZyB3aXRoIHJlbGF0aXZlIHBhdGggKGUuZyAnXicpLCBkZWZpbmVzIHdoaWNoIHN0YXRlIHRvIGJlIHJlbGF0aXZlIGZyb20uCisgICAgICAgICAqLworICAgICAgICByZWxhdGl2ZT86IElTdGF0ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtib29sZWFuPXRydWV9LCBJZiB0cnVlIHdpbGwgYnJvYWRjYXN0ICRzdGF0ZUNoYW5nZVN0YXJ0IGFuZCAkc3RhdGVDaGFuZ2VTdWNjZXNzIGV2ZW50cy4KKyAgICAgICAgICovCisgICAgICAgIG5vdGlmeT86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiB7Ym9vbGVhbj1mYWxzZX0sIElmIHRydWUgd2lsbCBmb3JjZSB0cmFuc2l0aW9uIGV2ZW4gaWYgdGhlIHN0YXRlIG9yIHBhcmFtcyBoYXZlIG5vdCBjaGFuZ2VkLCBha2EgYSByZWxvYWQgb2YgdGhlIHNhbWUgc3RhdGUuIEl0IGRpZmZlcnMgZnJvbSByZWxvYWRPblNlYXJjaCBiZWNhdXNlIHlvdSdkIHVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gZm9yY2UgYSByZWxvYWQgd2hlbiBldmVyeXRoaW5nIGlzIHRoZSBzYW1lLCBpbmNsdWRpbmcgc2VhcmNoIHBhcmFtcy4KKyAgICAgICAgICovCisgICAgICAgIHJlbG9hZD86IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIElIcmVmT3B0aW9ucyB7CisgICAgICAgIGxvc3N5PzogYm9vbGVhbjsKKyAgICAgICAgaW5oZXJpdD86IGJvb2xlYW47CisgICAgICAgIHJlbGF0aXZlPzogSVN0YXRlOworICAgICAgICBhYnNvbHV0ZT86IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIElTdGF0ZVNlcnZpY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB0cmFuc2l0aW9uaW5nIHRvIGEgbmV3IHN0YXRlLiAkc3RhdGUuZ28gY2FsbHMgJHN0YXRlLnRyYW5zaXRpb25UbyBpbnRlcm5hbGx5IGJ1dCBhdXRvbWF0aWNhbGx5IHNldHMgb3B0aW9ucyB0byB7IGxvY2F0aW9uOiB0cnVlLCBpbmhlcml0OiB0cnVlLCByZWxhdGl2ZTogJHN0YXRlLiRjdXJyZW50LCBub3RpZnk6IHRydWUgfS4gVGhpcyBhbGxvd3MgeW91IHRvIGVhc2lseSB1c2UgYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gcGF0aCBhbmQgc3BlY2lmeSBvbmx5IHRoZSBwYXJhbWV0ZXJzIHlvdSdkIGxpa2UgdG8gdXBkYXRlICh3aGlsZSBsZXR0aW5nIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW5oZXJpdCBmcm9tIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFuY2VzdG9yIHN0YXRlcykuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0byBBYnNvbHV0ZSBzdGF0ZSBuYW1lIG9yIHJlbGF0aXZlIHN0YXRlIHBhdGguIFNvbWUgZXhhbXBsZXM6CisgICAgICAgICAqCisgICAgICAgICAqICRzdGF0ZS5nbygnY29udGFjdC5kZXRhaWwnKSAtIHdpbGwgZ28gdG8gdGhlIGNvbnRhY3QuZGV0YWlsIHN0YXRlCisgICAgICAgICAqICRzdGF0ZS5nbygnXicpIC0gd2lsbCBnbyB0byBhIHBhcmVudCBzdGF0ZQorICAgICAgICAgKiAkc3RhdGUuZ28oJ14uc2libGluZycpIC0gd2lsbCBnbyB0byBhIHNpYmxpbmcgc3RhdGUKKyAgICAgICAgICogJHN0YXRlLmdvKCcuY2hpbGQuZ3JhbmRjaGlsZCcpIC0gd2lsbCBnbyB0byBncmFuZGNoaWxkIHN0YXRlCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgQSBtYXAgb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHN0YXRlLCB3aWxsIHBvcHVsYXRlICRzdGF0ZVBhcmFtcy4gQW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCB3aWxsIGJlIGluaGVyaXRlZCBmcm9tIGN1cnJlbnRseSBkZWZpbmVkIHBhcmFtZXRlcnMuIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgZ29pbmcgdG8gYSBzaWJsaW5nIHN0YXRlIHRoYXQgc2hhcmVzIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIGEgcGFyZW50IHN0YXRlLiBQYXJhbWV0ZXIgaW5oZXJpdGFuY2Ugb25seSB3b3JrcyBiZXR3ZWVuIGNvbW1vbiBhbmNlc3RvciBzdGF0ZXMsIEkuZS4gdHJhbnNpdGlvbmluZyB0byBhIHNpYmxpbmcgd2lsbCBnZXQgeW91IHRoZSBwYXJhbWV0ZXJzIGZvciBhbGwgcGFyZW50cywgdHJhbnNpdGlvbmluZyB0byBhIGNoaWxkIHdpbGwgZ2V0IHlvdSBhbGwgY3VycmVudCBwYXJhbWV0ZXJzLCBldGMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgZ28odG86IHN0cmluZywgcGFyYW1zPzoge30sIG9wdGlvbnM/OiBJU3RhdGVPcHRpb25zKTogbmcuSVByb21pc2U8YW55PjsKKyAgICAgICAgdHJhbnNpdGlvblRvKHN0YXRlOiBzdHJpbmcsIHBhcmFtcz86IHt9LCB1cGRhdGVMb2NhdGlvbj86IGJvb2xlYW4pOiB2b2lkOworICAgICAgICB0cmFuc2l0aW9uVG8oc3RhdGU6IHN0cmluZywgcGFyYW1zPzoge30sIG9wdGlvbnM/OiBJU3RhdGVPcHRpb25zKTogdm9pZDsKKyAgICAgICAgaW5jbHVkZXMoc3RhdGU6IHN0cmluZywgcGFyYW1zPzoge30pOiBib29sZWFuOworICAgICAgICBpcyhzdGF0ZTpzdHJpbmcsIHBhcmFtcz86IHt9KTogYm9vbGVhbjsKKyAgICAgICAgaXMoc3RhdGU6IElTdGF0ZSwgcGFyYW1zPzoge30pOiBib29sZWFuOworICAgICAgICBocmVmKHN0YXRlOiBJU3RhdGUsIHBhcmFtcz86IHt9LCBvcHRpb25zPzogSUhyZWZPcHRpb25zKTogc3RyaW5nOworICAgICAgICBocmVmKHN0YXRlOiBzdHJpbmcsIHBhcmFtcz86IHt9LCBvcHRpb25zPzogSUhyZWZPcHRpb25zKTogc3RyaW5nOworICAgICAgICBnZXQoc3RhdGU6IHN0cmluZyk6IElTdGF0ZTsKKyAgICAgICAgZ2V0KCk6IElTdGF0ZVtdOworICAgICAgICBjdXJyZW50OiBJU3RhdGU7CisgICAgICAgIHBhcmFtczogSVN0YXRlUGFyYW1zU2VydmljZTsKKyAgICAgICAgcmVsb2FkKCk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElTdGF0ZVBhcmFtc1NlcnZpY2UgeworICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElVcmxSb3V0ZXJTZXJ2aWNlIHsKKyAgICAJLyoKKyAgICAJICogVHJpZ2dlcnMgYW4gdXBkYXRlOyB0aGUgc2FtZSB1cGRhdGUgdGhhdCBoYXBwZW5zIHdoZW4gdGhlIGFkZHJlc3MgYmFyCisgICAgCSAqIHVybCBjaGFuZ2VzLCBha2EgJGxvY2F0aW9uQ2hhbmdlU3VjY2Vzcy4KKyAgICAJICoKKyAgICAJICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gdXNlIHByZXZlbnREZWZhdWx0KCkgb24gdGhlCisgICAgCSAqICRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MgZXZlbnQsIHBlcmZvcm0gc29tZSBjdXN0b20gbG9naWMgKHJvdXRlIHByb3RlY3Rpb24sCisgICAgCSAqIGF1dGgsIGNvbmZpZywgcmVkaXJlY3Rpb24sIGV0YykgYW5kIHRoZW4gZmluYWxseSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zaXRpb24KKyAgICAJICogYnkgY2FsbGluZyAkdXJsUm91dGVyLnN5bmMoKS4KKyAgICAJICoKKyAgICAJICovCisgICAgICAgIHN5bmMoKTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSVVpVmlld1Njcm9sbFByb3ZpZGVyIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV2ZXJ0cyBiYWNrIHRvIHVzaW5nIHRoZSBjb3JlICRhbmNob3JTY3JvbGwgc2VydmljZSBmb3Igc2Nyb2xsaW5nCisgICAgICAgICAqIGJhc2VkIG9uIHRoZSB1cmwgYW5jaG9yLgorICAgICAgICAgKi8KKyAgICAgICAgdXNlQW5jaG9yU2Nyb2xsKCk6IHZvaWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXJqcy9hbmd1bGFyLW1vY2tzLmQudHMgYi9jYXRhbG9nLXVpL3R5cGluZ3MvYW5ndWxhcmpzL2FuZ3VsYXItbW9ja3MuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWIwYWMxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXJqcy9hbmd1bGFyLW1vY2tzLmQudHMKQEAgLTAsMCArMSwzMzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyBUeXBlIGRlZmluaXRpb25zIGZvciBBbmd1bGFyIEpTIDEuMyAobmdNb2NrLCBuZ01vY2tFMkUgbW9kdWxlKQorLy8gUHJvamVjdDogaHR0cDovL2FuZ3VsYXJqcy5vcmcKKy8vIERlZmluaXRpb25zIGJ5OiBEaWVnbyBWaWxhciA8aHR0cDovL2dpdGh1Yi5jb20vZGllZ292aWxhcj4sIFRvbnkgQ3VydGlzIDxodHRwOi8vZ2l0aHViLmNvbS9kYWx0aW4+CisvLyBEZWZpbml0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292L0RlZmluaXRlbHlUeXBlZAorCisvLy8gPHJlZmVyZW5jZSBwYXRoPSJhbmd1bGFyLmQudHMiIC8+CisKK2RlY2xhcmUgbW9kdWxlICJhbmd1bGFyLW1vY2tzL25nTW9jayIgeworICAgIHZhciBfOiBzdHJpbmc7CisgICAgZXhwb3J0ID0gXzsKK30KKworZGVjbGFyZSBtb2R1bGUgImFuZ3VsYXItbW9ja3MvbmdNb2NrRTJFIiB7CisgICAgdmFyIF86IHN0cmluZzsKKyAgICBleHBvcnQgPSBfOworfQorCitkZWNsYXJlIG1vZHVsZSAiYW5ndWxhci1tb2Nrcy9uZ0FuaW1hdGVNb2NrIiB7CisgICAgdmFyIF86IHN0cmluZzsKKyAgICBleHBvcnQgPSBfOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBuZ01vY2sgbW9kdWxlIChhbmd1bGFyLW1vY2tzLmpzKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworZGVjbGFyZSBtb2R1bGUgYW5ndWxhciB7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBBbmd1bGFyU3RhdGljCisgICAgLy8gV2UgcmVvcGVuIGl0IHRvIGFkZCB0aGUgTW9ja1N0YXRpYyBkZWZpbml0aW9uCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElBbmd1bGFyU3RhdGljIHsKKyAgICAgICAgbW9jazogSU1vY2tTdGF0aWM7CisgICAgfQorICAgIAorICAgIC8vIHNlZSBodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmdNb2NrL2Z1bmN0aW9uL2FuZ3VsYXIubW9jay5pbmplY3QKKyAgICBpbnRlcmZhY2UgSUluamVjdFN0YXRpYyB7CisgICAgICAgICguLi5mbnM6IEZ1bmN0aW9uW10pOiBhbnk7CisgICAgICAgICguLi5pbmxpbmVBbm5vdGF0ZWRDb25zdHJ1Y3RvcjogYW55W10pOiBhbnk7IC8vIHRoaXMgb3ZlcmxvYWQgaXMgdW5kb2N1bWVudGVkLCBidXQgd29ya3MKKyAgICAgICAgc3RyaWN0RGkodmFsPzogYm9vbGVhbik6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElNb2NrU3RhdGljIHsKKyAgICAgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZ01vY2svZnVuY3Rpb24vYW5ndWxhci5tb2NrLmR1bXAKKyAgICAgICAgZHVtcChvYmo6IGFueSk6IHN0cmluZzsKKworICAgICAgICBpbmplY3Q6IElJbmplY3RTdGF0aWMKKworICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nTW9jay9mdW5jdGlvbi9hbmd1bGFyLm1vY2subW9kdWxlCisgICAgICAgIG1vZHVsZSguLi5tb2R1bGVzOiBhbnlbXSk6IGFueTsKKworICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nTW9jay90eXBlL2FuZ3VsYXIubW9jay5UekRhdGUKKyAgICAgICAgVHpEYXRlKG9mZnNldDogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlcik6IERhdGU7CisgICAgICAgIFR6RGF0ZShvZmZzZXQ6IG51bWJlciwgdGltZXN0YW1wOiBzdHJpbmcpOiBEYXRlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEV4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZ01vY2svc2VydmljZS8kZXhjZXB0aW9uSGFuZGxlcgorICAgIC8vIHNlZSBodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmdNb2NrL3Byb3ZpZGVyLyRleGNlcHRpb25IYW5kbGVyUHJvdmlkZXIKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUV4Y2VwdGlvbkhhbmRsZXJQcm92aWRlciBleHRlbmRzIElTZXJ2aWNlUHJvdmlkZXIgeworICAgICAgICBtb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gVGltZW91dFNlcnZpY2UKKyAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nTW9jay9zZXJ2aWNlLyR0aW1lb3V0CisgICAgLy8gQXVnbWVudHMgdGhlIG9yaWdpbmFsIHNlcnZpY2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSVRpbWVvdXRTZXJ2aWNlIHsKKyAgICAgICAgZmx1c2goZGVsYXk/OiBudW1iZXIpOiB2b2lkOworICAgICAgICBmbHVzaE5leHQoZXhwZWN0ZWREZWxheT86IG51bWJlcik6IHZvaWQ7CisgICAgICAgIHZlcmlmeU5vUGVuZGluZ1Rhc2tzKCk6IHZvaWQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW50ZXJ2YWxTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZ01vY2svc2VydmljZS8kaW50ZXJ2YWwKKyAgICAvLyBBdWdtZW50cyB0aGUgb3JpZ2luYWwgc2VydmljZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJSW50ZXJ2YWxTZXJ2aWNlIHsKKyAgICAgICAgZmx1c2gobWlsbGlzPzogbnVtYmVyKTogbnVtYmVyOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIExvZ1NlcnZpY2UKKyAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nTW9jay9zZXJ2aWNlLyRsb2cKKyAgICAvLyBBdWdtZW50cyB0aGUgb3JpZ2luYWwgc2VydmljZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJTG9nU2VydmljZSB7CisgICAgICAgIGFzc2VydEVtcHR5KCk6IHZvaWQ7CisgICAgICAgIHJlc2V0KCk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElMb2dDYWxsIHsKKyAgICAgICAgbG9nczogc3RyaW5nW107CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSHR0cEJhY2tlbmRTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZ01vY2svc2VydmljZS8kaHR0cEJhY2tlbmQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUh0dHBCYWNrZW5kU2VydmljZSB7CisgICAgICAgIC8qKgorICAgICAgICAgICogRmx1c2hlcyBhbGwgcGVuZGluZyByZXF1ZXN0cyB1c2luZyB0aGUgdHJhaW5lZCByZXNwb25zZXMuCisgICAgICAgICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHJlc3BvbnNlcyB0byBmbHVzaCAoaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlZCkuIElmIHVuZGVmaW5lZCwgYWxsIHBlbmRpbmcgcmVxdWVzdHMgd2lsbCBiZSBmbHVzaGVkLiAKKyAgICAgICAgICAqLworICAgICAgICBmbHVzaChjb3VudD86IG51bWJlcik6IHZvaWQ7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICAqIFJlc2V0cyBhbGwgcmVxdWVzdCBleHBlY3RhdGlvbnMsIGJ1dCBwcmVzZXJ2ZXMgYWxsIGJhY2tlbmQgZGVmaW5pdGlvbnMuCisgICAgICAgICAgKi8KKyAgICAgICAgcmVzZXRFeHBlY3RhdGlvbnMoKTogdm9pZDsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgICogVmVyaWZpZXMgdGhhdCBhbGwgb2YgdGhlIHJlcXVlc3RzIGRlZmluZWQgdmlhIHRoZSBleHBlY3QgYXBpIHdlcmUgbWFkZS4gSWYgYW55IG9mIHRoZSByZXF1ZXN0cyB3ZXJlIG5vdCBtYWRlLCB2ZXJpZnlOb091dHN0YW5kaW5nRXhwZWN0YXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICB2ZXJpZnlOb091dHN0YW5kaW5nRXhwZWN0YXRpb24oKTogdm9pZDsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgICogVmVyaWZpZXMgdGhhdCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgdGhhdCBuZWVkIHRvIGJlIGZsdXNoZWQuCisgICAgICAgICAgKi8KKyAgICAgICAgdmVyaWZ5Tm9PdXRzdGFuZGluZ1JlcXVlc3QoKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgcmVxdWVzdCBleHBlY3RhdGlvbi4gCisgICAgICAgICAgKiBUaHJvd3MgYSBwcmVmb3JtYXR0ZWQgZXJyb3IgaWYgZXhwZWN0YXRpb24ocykgZG9uJ3QgbWF0Y2ggc3VwcGxpZWQgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24sIG9iamVjdCwgb3IgaWYgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKyAgICAgICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcmVzcG9uZCBtZXRob2QgdGhhdCBjb250cm9scyBob3cgYSBtYXRjaGVkIHJlcXVlc3QgaXMgaGFuZGxlZC4KKyAgICAgICAgICAqIEBwYXJhbSBtZXRob2QgSFRUUCBtZXRob2QuCisgICAgICAgICAgKiBAcGFyYW0gdXJsIEhUVFAgdXJsIHN0cmluZywgcmVndWxhciBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSB1cmwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdXJsIG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhwY3RhdGlvbi4KKyAgICAgICAgICAqIEBwYXJhbSBkYXRhIEhUVFAgcmVxdWVzdCBib2R5IHN0cmluZywganNvbiBvYmplY3QsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGRhdGEgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgaGVhZGVycyBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgaGVhZGVycyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBoZWFkZXJzIG1hdGNoIHRoZSBjdXJyZW50IGV4cGVjdGF0aW9uLgorICAgICAgICAgICovCisgICAgICAgIGV4cGVjdChtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSwgZGF0YT86IHN0cmluZyB8IFJlZ0V4cCB8IE9iamVjdCB8ICgoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuKSwgaGVhZGVycz86IE9iamVjdCB8ICgob2JqZWN0OiBPYmplY3QpID0+IGJvb2xlYW4pKSA6bW9jay5JUmVxdWVzdEhhbmRsZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IHJlcXVlc3QgZXhwZWN0YXRpb24gZm9yIERFTEVURSByZXF1ZXN0cy4KKyAgICAgICAgICAqIFRocm93cyBhIHByZWZvcm1hdHRlZCBlcnJvciBpZiBleHBlY3RhdGlvbihzKSBkb24ndCBtYXRjaCBzdXBwbGllZCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb2JqZWN0LCBvciBpZiBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIHVybCBIVFRQIHVybCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgdXJsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHVybCBpcyBhcyBleHBlY3RlZC4KKyAgICAgICAgICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgaGVhZGVycyBvYmplY3QgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGUgSFRUUCBoZWFkZXJzIGluIHRoZSByZXF1ZXN0LgorICAgICAgICAqLworICAgICAgICBleHBlY3RERUxFVEUodXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSwgaGVhZGVycz86IE9iamVjdCk6IG1vY2suSVJlcXVlc3RIYW5kbGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyByZXF1ZXN0IGV4cGVjdGF0aW9uIGZvciBHRVQgcmVxdWVzdHMuCisgICAgICAgICAgKiBUaHJvd3MgYSBwcmVmb3JtYXR0ZWQgZXJyb3IgaWYgZXhwZWN0YXRpb24ocykgZG9uJ3QgbWF0Y2ggc3VwcGxpZWQgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24sIG9iamVjdCwgb3IgaWYgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKyAgICAgICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcmVzcG9uZCBtZXRob2QgdGhhdCBjb250cm9scyBob3cgYSBtYXRjaGVkIHJlcXVlc3QgaXMgaGFuZGxlZC4KKyAgICAgICAgICAqIEBwYXJhbSB1cmwgSFRUUCB1cmwgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHVybCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSB1cmwgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBjdGF0aW9uLgorICAgICAgICAgICogQHBhcmFtIGhlYWRlcnMgSFRUUCBoZWFkZXJzIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBIVFRQIGhlYWRlcnMgaW4gdGhlIHJlcXVlc3QuCisgICAgICAgICAgKi8KKyAgICAgICAgZXhwZWN0R0VUKHVybDogc3RyaW5nIHwgUmVnRXhwIHwgKCh1cmw6IHN0cmluZykgPT4gYm9vbGVhbiksIGhlYWRlcnM/OiBPYmplY3QpOiBtb2NrLklSZXF1ZXN0SGFuZGxlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgcmVxdWVzdCBleHBlY3RhdGlvbiBmb3IgSEVBRCByZXF1ZXN0cy4KKyAgICAgICAgICAqIFRocm93cyBhIHByZWZvcm1hdHRlZCBlcnJvciBpZiBleHBlY3RhdGlvbihzKSBkb24ndCBtYXRjaCBzdXBwbGllZCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb2JqZWN0LCBvciBpZiBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIHVybCBIVFRQIHVybCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgdXJsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHVybCBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIGhlYWRlcnMgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGggdGhlIEhUVFAgaGVhZGVycyBpbiB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAqLworICAgICAgICBleHBlY3RIRUFEKHVybDogc3RyaW5nIHwgUmVnRXhwIHwgKCh1cmw6IHN0cmluZykgPT4gYm9vbGVhbiksIGhlYWRlcnM/OiBPYmplY3QpOiBtb2NrLklSZXF1ZXN0SGFuZGxlcjsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyByZXF1ZXN0IGV4cGVjdGF0aW9uIGZvciBKU09OUCByZXF1ZXN0cy4KKyAgICAgICAgICAqIFRocm93cyBhIHByZWZvcm1hdHRlZCBlcnJvciBpZiBleHBlY3RhdGlvbihzKSBkb24ndCBtYXRjaCBzdXBwbGllZCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgaWYgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKyAgICAgICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcmVzcG9uZCBtZXRob2QgdGhhdCBjb250cm9scyBob3cgYSBtYXRjaGVkIHJlcXVlc3QgaXMgaGFuZGxlZC4KKyAgICAgICAgICAqIEBwYXJhbSB1cmwgSFRUUCB1cmwgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHVybCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSB1cmwgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBjdGF0aW9uLgorICAgICAgICAgICovICAgICAgICAKKyAgICAgICAgZXhwZWN0SlNPTlAodXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSk6IG1vY2suSVJlcXVlc3RIYW5kbGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyByZXF1ZXN0IGV4cGVjdGF0aW9uIGZvciBQQVRDSCByZXF1ZXN0cy4gCisgICAgICAgICAgKiBUaHJvd3MgYSBwcmVmb3JtYXR0ZWQgZXJyb3IgaWYgZXhwZWN0YXRpb24ocykgZG9uJ3QgbWF0Y2ggc3VwcGxpZWQgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24sIG9iamVjdCwgb3IgaWYgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKyAgICAgICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcmVzcG9uZCBtZXRob2QgdGhhdCBjb250cm9scyBob3cgYSBtYXRjaGVkIHJlcXVlc3QgaXMgaGFuZGxlZC4KKyAgICAgICAgICAqIEBwYXJhbSB1cmwgSFRUUCB1cmwgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHVybCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSB1cmwgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBjdGF0aW9uLgorICAgICAgICAgICogQHBhcmFtIGRhdGEgSFRUUCByZXF1ZXN0IGJvZHkgc3RyaW5nLCBqc29uIG9iamVjdCwgcmVndWxhciBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YSBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGVjdGF0aW9uLgorICAgICAgICAgICogQHBhcmFtIGhlYWRlcnMgSFRUUCBoZWFkZXJzIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSBoZWFkZXJzIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGhlYWRlcnMgbWF0Y2ggdGhlIGN1cnJlbnQgZXhwZWN0YXRpb24uCisgICAgICAgICAgKi8KKyAgICAgICAgZXhwZWN0UEFUQ0godXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSwgZGF0YT86IHN0cmluZyB8IFJlZ0V4cCB8IE9iamVjdCB8ICgoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuKSwgaGVhZGVycz86IE9iamVjdCk6IG1vY2suSVJlcXVlc3RIYW5kbGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyByZXF1ZXN0IGV4cGVjdGF0aW9uIGZvciBQT1NUIHJlcXVlc3RzLiAKKyAgICAgICAgICAqIFRocm93cyBhIHByZWZvcm1hdHRlZCBlcnJvciBpZiBleHBlY3RhdGlvbihzKSBkb24ndCBtYXRjaCBzdXBwbGllZCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb2JqZWN0LCBvciBpZiBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIHVybCBIVFRQIHVybCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgdXJsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHVybCBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gZGF0YSBIVFRQIHJlcXVlc3QgYm9keSBzdHJpbmcsIGpzb24gb2JqZWN0LCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhwZWN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIGhlYWRlcnMgb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGhlYWRlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGVhZGVycyBtYXRjaCB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICBleHBlY3RQT1NUKHVybDogc3RyaW5nIHwgUmVnRXhwIHwgKCh1cmw6IHN0cmluZykgPT4gYm9vbGVhbiksIGRhdGE/OiBzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3QgfCAoKGRhdGE6IHN0cmluZykgPT4gYm9vbGVhbiksIGhlYWRlcnM/OiBPYmplY3QpOiBtb2NrLklSZXF1ZXN0SGFuZGxlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgcmVxdWVzdCBleHBlY3RhdGlvbiBmb3IgUFVUIHJlcXVlc3RzLiAKKyAgICAgICAgICAqIFRocm93cyBhIHByZWZvcm1hdHRlZCBlcnJvciBpZiBleHBlY3RhdGlvbihzKSBkb24ndCBtYXRjaCBzdXBwbGllZCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb2JqZWN0LCBvciBpZiBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIHVybCBIVFRQIHVybCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgdXJsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHVybCBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gZGF0YSBIVFRQIHJlcXVlc3QgYm9keSBzdHJpbmcsIGpzb24gb2JqZWN0LCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhwZWN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIGhlYWRlcnMgb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGhlYWRlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGVhZGVycyBtYXRjaCB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICBleHBlY3RQVVQodXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSwgZGF0YT86IHN0cmluZyB8IFJlZ0V4cCB8IE9iamVjdCB8ICgoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuKSwgaGVhZGVycz86IE9iamVjdCk6IG1vY2suSVJlcXVlc3RIYW5kbGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBiYWNrZW5kIGRlZmluaXRpb24uIAorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIG1ldGhvZCBIVFRQIG1ldGhvZC4KKyAgICAgICAgICAqIEBwYXJhbSB1cmwgSFRUUCB1cmwgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHVybCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSB1cmwgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBjdGF0aW9uLgorICAgICAgICAgICogQHBhcmFtIGRhdGEgSFRUUCByZXF1ZXN0IGJvZHkgc3RyaW5nLCBqc29uIG9iamVjdCwgcmVndWxhciBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGRhdGEgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YSBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGVjdGF0aW9uLgorICAgICAgICAgICogQHBhcmFtIGhlYWRlcnMgSFRUUCBoZWFkZXJzIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSBoZWFkZXJzIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGhlYWRlcnMgbWF0Y2ggdGhlIGN1cnJlbnQgZXhwZWN0YXRpb24uCisgICAgICAgICAgKi8KKyAgICAgICAgd2hlbihtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSwgZGF0YT86IHN0cmluZyB8IFJlZ0V4cCB8IE9iamVjdCB8ICgoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuKSwgaGVhZGVycz86IE9iamVjdCB8ICgob2JqZWN0OiBPYmplY3QpID0+IGJvb2xlYW4pKTogbW9jay5JUmVxdWVzdEhhbmRsZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGJhY2tlbmQgZGVmaW5pdGlvbiBmb3IgREVMRVRFIHJlcXVlc3RzLiAKKyAgICAgICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcmVzcG9uZCBtZXRob2QgdGhhdCBjb250cm9scyBob3cgYSBtYXRjaGVkIHJlcXVlc3QgaXMgaGFuZGxlZC4KKyAgICAgICAgICAqIEBwYXJhbSB1cmwgSFRUUCB1cmwgc3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHVybCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSB1cmwgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBjdGF0aW9uLgorICAgICAgICAgICogQHBhcmFtIGhlYWRlcnMgSFRUUCBoZWFkZXJzIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSBoZWFkZXJzIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGhlYWRlcnMgbWF0Y2ggdGhlIGN1cnJlbnQgZXhwZWN0YXRpb24uCisgICAgICAgICAgKi8KKyAgICAgICAgd2hlbkRFTEVURSh1cmw6IHN0cmluZyB8IFJlZ0V4cCB8ICgodXJsOiBzdHJpbmcpID0+IGJvb2xlYW4pLCBoZWFkZXJzPzogT2JqZWN0IHwgKChvYmplY3Q6IE9iamVjdCkgPT4gYm9vbGVhbikpOiBtb2NrLklSZXF1ZXN0SGFuZGxlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYmFja2VuZCBkZWZpbml0aW9uIGZvciBHRVQgcmVxdWVzdHMuIAorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIHVybCBIVFRQIHVybCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgdXJsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHVybCBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIGhlYWRlcnMgb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGhlYWRlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGVhZGVycyBtYXRjaCB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICB3aGVuR0VUKHVybDogc3RyaW5nIHwgUmVnRXhwIHwgKCh1cmw6IHN0cmluZykgPT4gYm9vbGVhbiksIGhlYWRlcnM/OiBPYmplY3QgfCAoKG9iamVjdDogT2JqZWN0KSA9PiBib29sZWFuKSk6IG1vY2suSVJlcXVlc3RIYW5kbGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBiYWNrZW5kIGRlZmluaXRpb24gZm9yIEhFQUQgcmVxdWVzdHMuIAorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIHVybCBIVFRQIHVybCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgdXJsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHVybCBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIGhlYWRlcnMgb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGhlYWRlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGVhZGVycyBtYXRjaCB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICB3aGVuSEVBRCh1cmw6IHN0cmluZyB8IFJlZ0V4cCB8ICgodXJsOiBzdHJpbmcpID0+IGJvb2xlYW4pLCBoZWFkZXJzPzogT2JqZWN0IHwgKChvYmplY3Q6IE9iamVjdCkgPT4gYm9vbGVhbikpOiBtb2NrLklSZXF1ZXN0SGFuZGxlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYmFja2VuZCBkZWZpbml0aW9uIGZvciBKU09OUCByZXF1ZXN0cy4gCisgICAgICAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHJlc3BvbmQgbWV0aG9kIHRoYXQgY29udHJvbHMgaG93IGEgbWF0Y2hlZCByZXF1ZXN0IGlzIGhhbmRsZWQuCisgICAgICAgICAgKiBAcGFyYW0gdXJsIEhUVFAgdXJsIHN0cmluZywgcmVndWxhciBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSB1cmwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdXJsIG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhwY3RhdGlvbi4KKyAgICAgICAgICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgaGVhZGVycyBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgaGVhZGVycyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBoZWFkZXJzIG1hdGNoIHRoZSBjdXJyZW50IGV4cGVjdGF0aW9uLgorICAgICAgICAgICovCisgICAgICAgIHdoZW5KU09OUCh1cmw6IHN0cmluZyB8IFJlZ0V4cCB8ICgodXJsOiBzdHJpbmcpID0+IGJvb2xlYW4pKTogbW9jay5JUmVxdWVzdEhhbmRsZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGJhY2tlbmQgZGVmaW5pdGlvbiBmb3IgUEFUQ0ggcmVxdWVzdHMuIAorICAgICAgICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXNwb25kIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGhvdyBhIG1hdGNoZWQgcmVxdWVzdCBpcyBoYW5kbGVkLgorICAgICAgICAgICogQHBhcmFtIHVybCBIVFRQIHVybCBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgdXJsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHVybCBtYXRjaGVzIHRoZSBjdXJyZW50IGV4cGN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gZGF0YSBIVFRQIHJlcXVlc3QgYm9keSBzdHJpbmcsIGpzb24gb2JqZWN0LCByZWd1bGFyIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgZGF0YSBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhwZWN0YXRpb24uCisgICAgICAgICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIGhlYWRlcnMgb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIGhlYWRlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGVhZGVycyBtYXRjaCB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqLworICAgICAgICB3aGVuUEFUQ0godXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSwgZGF0YT86IHN0cmluZyB8IFJlZ0V4cCB8IE9iamVjdCB8ICgoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuKSwgaGVhZGVycz86IE9iamVjdCB8ICgob2JqZWN0OiBPYmplY3QpID0+IGJvb2xlYW4pKTogbW9jay5JUmVxdWVzdEhhbmRsZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGJhY2tlbmQgZGVmaW5pdGlvbiBmb3IgUE9TVCByZXF1ZXN0cy4gCisgICAgICAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHJlc3BvbmQgbWV0aG9kIHRoYXQgY29udHJvbHMgaG93IGEgbWF0Y2hlZCByZXF1ZXN0IGlzIGhhbmRsZWQuCisgICAgICAgICAgKiBAcGFyYW0gdXJsIEhUVFAgdXJsIHN0cmluZywgcmVndWxhciBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSB1cmwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdXJsIG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhwY3RhdGlvbi4KKyAgICAgICAgICAqIEBwYXJhbSBkYXRhIEhUVFAgcmVxdWVzdCBib2R5IHN0cmluZywganNvbiBvYmplY3QsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGRhdGEgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgaGVhZGVycyBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgaGVhZGVycyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBoZWFkZXJzIG1hdGNoIHRoZSBjdXJyZW50IGV4cGVjdGF0aW9uLgorICAgICAgICAgICovCisgICAgICAgIHdoZW5QT1NUKHVybDogc3RyaW5nIHwgUmVnRXhwIHwgKCh1cmw6IHN0cmluZykgPT4gYm9vbGVhbiksIGRhdGE/OiBzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3QgfCAoKGRhdGE6IHN0cmluZykgPT4gYm9vbGVhbiksIGhlYWRlcnM/OiBPYmplY3QgfCAoKG9iamVjdDogT2JqZWN0KSA9PiBib29sZWFuKSk6IG1vY2suSVJlcXVlc3RIYW5kbGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBiYWNrZW5kIGRlZmluaXRpb24gZm9yIFBVVCByZXF1ZXN0cy4gCisgICAgICAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHJlc3BvbmQgbWV0aG9kIHRoYXQgY29udHJvbHMgaG93IGEgbWF0Y2hlZCByZXF1ZXN0IGlzIGhhbmRsZWQuCisgICAgICAgICAgKiBAcGFyYW0gdXJsIEhUVFAgdXJsIHN0cmluZywgcmVndWxhciBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSB1cmwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdXJsIG1hdGNoZXMgdGhlIGN1cnJlbnQgZXhwY3RhdGlvbi4KKyAgICAgICAgICAqIEBwYXJhbSBkYXRhIEhUVFAgcmVxdWVzdCBib2R5IHN0cmluZywganNvbiBvYmplY3QsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSBkYXRhIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGRhdGEgbWF0Y2hlcyB0aGUgY3VycmVudCBleHBlY3RhdGlvbi4KKyAgICAgICAgICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgaGVhZGVycyBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgaGVhZGVycyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBoZWFkZXJzIG1hdGNoIHRoZSBjdXJyZW50IGV4cGVjdGF0aW9uLgorICAgICAgICAgICovCisgICAgICAgIHdoZW5QVVQodXJsOiBzdHJpbmcgfCBSZWdFeHAgfCAoKHVybDogc3RyaW5nKSA9PiBib29sZWFuKSwgZGF0YT86IHN0cmluZyB8IFJlZ0V4cCB8IE9iamVjdCB8ICgoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuKSwgaGVhZGVycz86IE9iamVjdCB8ICgob2JqZWN0OiBPYmplY3QpID0+IGJvb2xlYW4pKTogbW9jay5JUmVxdWVzdEhhbmRsZXI7CisgICAgfQorCisgICAgZXhwb3J0IG1vZHVsZSBtb2NrIHsKKyAgICAgICAgLy8gcmV0dXJuZWQgaW50ZXJmYWNlIGJ5IHRoZSB0aGUgbW9ja2VkIEh0dHBCYWNrZW5kU2VydmljZSBleHBlY3Qvd2hlbiBtZXRob2RzCisgICAgICAgIGludGVyZmFjZSBJUmVxdWVzdEhhbmRsZXIgeworICAgICAgICAgIAorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICogQ29udHJvbHMgdGhlIHJlc3BvbnNlIGZvciBhIG1hdGNoZWQgcmVxdWVzdCB1c2luZyBhIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCB0aGUgcmVzcG9uc2UuIAorICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIFJlcXVlc3RIYW5kbGVyIG9iamVjdCBmb3IgcG9zc2libGUgb3ZlcnJpZGVzLgorICAgICAgICAgICAgICAqIEBwYXJhbSBmdW5jIEZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIHJlcXVlc3QgSFRUUCBtZXRob2QsIHVybCwgZGF0YSwgYW5kIGhlYWRlcnMgYW5kIHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyByZXNwb25zZSBzdGF0dXMgKG51bWJlciksIGRhdGEsIGhlYWRlcnMsIGFuZCBzdGF0dXMgdGV4dC4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlc3BvbmQoZnVuYzogKChtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IE9iamVjdCwgaGVhZGVyczogT2JqZWN0KSA9PiBbbnVtYmVyLCBzdHJpbmcgfCBPYmplY3QsIE9iamVjdCwgc3RyaW5nXSkpOiBJUmVxdWVzdEhhbmRsZXI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAqIENvbnRyb2xzIHRoZSByZXNwb25zZSBmb3IgYSBtYXRjaGVkIHJlcXVlc3QgdXNpbmcgc3VwcGxpZWQgc3RhdGljIGRhdGEgdG8gY29uc3RydWN0IHRoZSByZXNwb25zZS4gCisgICAgICAgICAgICAgICogUmV0dXJucyB0aGUgUmVxdWVzdEhhbmRsZXIgb2JqZWN0IGZvciBwb3NzaWJsZSBvdmVycmlkZXMuCisgICAgICAgICAgICAgICogQHBhcmFtIHN0YXR1cyBIVFRQIHN0YXR1cyBjb2RlIHRvIGFkZCB0byB0aGUgcmVzcG9uc2UuCisgICAgICAgICAgICAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBhZGQgdG8gdGhlIHJlc3BvbnNlLgorICAgICAgICAgICAgICAqIEBwYXJhbSBoZWFkZXJzIEhlYWRlcnMgb2JqZWN0IHRvIGFkZCB0byB0aGUgcmVzcG9uc2UuCisgICAgICAgICAgICAgICogQHBhcmFtIHJlc3BvbnNlVGV4dCBSZXNwb25zZSB0ZXh0IHRvIGFkZCB0byB0aGUgcmVzcG9uc2UuCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXNwb25kKHN0YXR1czogbnVtYmVyLCBkYXRhOiBzdHJpbmcgfCBPYmplY3QsIGhlYWRlcnM/OiBPYmplY3QsIHJlc3BvbnNlVGV4dD86IHN0cmluZyk6IElSZXF1ZXN0SGFuZGxlcjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICogQ29udHJvbHMgdGhlIHJlc3BvbnNlIGZvciBhIG1hdGNoZWQgcmVxdWVzdCB1c2luZyB0aGUgSFRUUCBzdGF0dXMgY29kZSAyMDAgYW5kIHN1cHBsaWVkIHN0YXRpYyBkYXRhIHRvIGNvbnN0cnVjdCB0aGUgcmVzcG9uc2UuIAorICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIFJlcXVlc3RIYW5kbGVyIG9iamVjdCBmb3IgcG9zc2libGUgb3ZlcnJpZGVzLgorICAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gYWRkIHRvIHRoZSByZXNwb25zZS4KKyAgICAgICAgICAgICAgKiBAcGFyYW0gaGVhZGVycyBIZWFkZXJzIG9iamVjdCB0byBhZGQgdG8gdGhlIHJlc3BvbnNlLgorICAgICAgICAgICAgICAqIEBwYXJhbSByZXNwb25zZVRleHQgUmVzcG9uc2UgdGV4dCB0byBhZGQgdG8gdGhlIHJlc3BvbnNlLgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmVzcG9uZChkYXRhOiBzdHJpbmcgfCBPYmplY3QsIGhlYWRlcnM/OiBPYmplY3QsIHJlc3BvbnNlVGV4dD86IHN0cmluZyk6IElSZXF1ZXN0SGFuZGxlcjsKKworICAgICAgICAgICAgLy8gQXZhaWxhYmxlIHdoZW4gbmdNb2NrRTJFIGlzIGxvYWRlZAorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICogQW55IHJlcXVlc3QgbWF0Y2hpbmcgYSBiYWNrZW5kIGRlZmluaXRpb24gb3IgZXhwZWN0YXRpb24gd2l0aCBwYXNzVGhyb3VnaCBoYW5kbGVyIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHJlYWwgYmFja2VuZCAoYW4gWEhSIHJlcXVlc3Qgd2lsbCBiZSBtYWRlIHRvIHRoZSBzZXJ2ZXIuKQorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcGFzc1Rocm91Z2goKTogSVJlcXVlc3RIYW5kbGVyOworICAgICAgICB9CisKKyAgICB9CisKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZnVuY3Rpb25zIGF0dGFjaGVkIHRvIGdsb2JhbCBvYmplY3QgKHdpbmRvdykKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vVXNlIGBhbmd1bGFyLm1vY2subW9kdWxlYCBpbnN0ZWFkIG9mIGBtb2R1bGVgLCBhcyBgbW9kdWxlYCBjb25mbGljdHMgd2l0aCBjb21tb25qcy4KKy8vZGVjbGFyZSB2YXIgbW9kdWxlOiAoLi4ubW9kdWxlczogYW55W10pID0+IGFueTsKK2RlY2xhcmUgdmFyIGluamVjdDogYW5ndWxhci5JSW5qZWN0U3RhdGljOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXJqcy9hbmd1bGFyLXJlc291cmNlLmQudHMgYi9jYXRhbG9nLXVpL3R5cGluZ3MvYW5ndWxhcmpzL2FuZ3VsYXItcmVzb3VyY2UuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njk5OTdiCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXJqcy9hbmd1bGFyLXJlc291cmNlLmQudHMKQEAgLTAsMCArMSwxODMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyBUeXBlIGRlZmluaXRpb25zIGZvciBBbmd1bGFyIEpTIDEuMyAobmdSZXNvdXJjZSBtb2R1bGUpCisvLyBQcm9qZWN0OiBodHRwOi8vYW5ndWxhcmpzLm9yZworLy8gRGVmaW5pdGlvbnMgYnk6IERpZWdvIFZpbGFyIDxodHRwOi8vZ2l0aHViLmNvbS9kaWVnb3ZpbGFyPiwgTWljaGFlbCBKZXNzIDxodHRwOi8vZ2l0aHViLmNvbS9taWZmZWxzPgorLy8gRGVmaW5pdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXB0aXYvRGVmaW5pdGVseVR5cGVkCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9ImFuZ3VsYXIuZC50cyIgLz4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIG5nUmVzb3VyY2UgbW9kdWxlIChhbmd1bGFyLXJlc291cmNlLmpzKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworZGVjbGFyZSBtb2R1bGUgYW5ndWxhci5yZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50bHkgc3VwcG9ydGVkIG9wdGlvbnMgZm9yIHRoZSAkcmVzb3VyY2UgZmFjdG9yeSBvcHRpb25zIGFyZ3VtZW50LgorICAgICAqLworICAgIGludGVyZmFjZSBJUmVzb3VyY2VPcHRpb25zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHRydWUgdGhlbiB0aGUgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIGFueSBjYWxjdWxhdGVkIFVSTCB3aWxsIGJlIHN0cmlwcGVkIChkZWZhdWx0cyB0byB0cnVlKQorICAgICAgICAgKi8KKyAgICAgICAgc3RyaXBUcmFpbGluZ1NsYXNoZXM/OiBib29sZWFuOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFJlc291cmNlU2VydmljZQorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZ1Jlc291cmNlLiRyZXNvdXJjZQorICAgIC8vIE1vc3QgcGFydCBvZiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHdlcmUgYWNoaWV2ZWQgYnkgYW5hbHl6aW5nIHRoZQorICAgIC8vIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgdGhlIGRvY3VtZW50YXRpb24gZG9lc24ndCBzZWVtIHRvIGNvdmVyCisgICAgLy8gdGhhdCBkZWVwbHkuCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElSZXNvdXJjZVNlcnZpY2UgeworICAgICAgICAodXJsOiBzdHJpbmcsIHBhcmFtRGVmYXVsdHM/OiBhbnksCisgICAgICAgICAgICAvKiogZXhhbXBsZTogIHt1cGRhdGU6IHsgbWV0aG9kOiAnUFVUJyB9LCBkZWxldGU6IGRlbGV0ZURlc2NyaXB0b3IgfQorICAgICAgICAgICAgIHdoZXJlIGRlbGV0ZURlc2NyaXB0b3IgOiBJQWN0aW9uRGVzY3JpcHRvciAqLworICAgICAgICAgICAgYWN0aW9ucz86IGFueSwgb3B0aW9ucz86IElSZXNvdXJjZU9wdGlvbnMpOiBJUmVzb3VyY2VDbGFzczxJUmVzb3VyY2U8YW55Pj47CisgICAgICAgIDxULCBVPih1cmw6IHN0cmluZywgcGFyYW1EZWZhdWx0cz86IGFueSwKKyAgICAgICAgICAgIC8qKiBleGFtcGxlOiAge3VwZGF0ZTogeyBtZXRob2Q6ICdQVVQnIH0sIGRlbGV0ZTogZGVsZXRlRGVzY3JpcHRvciB9CisgICAgICAgICAgICAgd2hlcmUgZGVsZXRlRGVzY3JpcHRvciA6IElBY3Rpb25EZXNjcmlwdG9yICovCisgICAgICAgICAgICBhY3Rpb25zPzogYW55LCBvcHRpb25zPzogSVJlc291cmNlT3B0aW9ucyk6IFU7CisgICAgICAgIDxUPih1cmw6IHN0cmluZywgcGFyYW1EZWZhdWx0cz86IGFueSwKKyAgICAgICAgICAgIC8qKiBleGFtcGxlOiAge3VwZGF0ZTogeyBtZXRob2Q6ICdQVVQnIH0sIGRlbGV0ZTogZGVsZXRlRGVzY3JpcHRvciB9CisgICAgICAgICAgICAgd2hlcmUgZGVsZXRlRGVzY3JpcHRvciA6IElBY3Rpb25EZXNjcmlwdG9yICovCisgICAgICAgICAgICBhY3Rpb25zPzogYW55LCBvcHRpb25zPzogSVJlc291cmNlT3B0aW9ucyk6IElSZXNvdXJjZUNsYXNzPFQ+OworICAgIH0KKworICAgIC8vIEp1c3QgYSByZWZlcmVuY2UgdG8gZmFjaWxpdGF0ZSBkZXNjcmliaW5nIG5ldyBhY3Rpb25zCisgICAgaW50ZXJmYWNlIElBY3Rpb25EZXNjcmlwdG9yIHsKKyAgICAgICAgbWV0aG9kOiBzdHJpbmc7CisgICAgICAgIGlzQXJyYXk/OiBib29sZWFuOworICAgICAgICBwYXJhbXM/OiBhbnk7CisgICAgICAgIGhlYWRlcnM/OiBhbnk7CisgICAgICAgIHVybD86IGFueTsKKyAgICAgICAgY2FjaGU/OiBCb29sZWFuOworICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0PzogRnVuY3Rpb247CisgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlPzogRnVuY3Rpb247CisgICAgfQorCisgICAgLy8gQmFzZWNsYXNzIGZvciBldmVyeXJlc291cmNlIHdpdGggZGVmYXVsdCBhY3Rpb25zLgorICAgIC8vIElmIHlvdSBkZWZpbmUgeW91ciBuZXcgYWN0aW9ucyBmb3IgdGhlIHJlc291cmNlLCB5b3Ugd2lsbCBuZWVkCisgICAgLy8gdG8gZXh0ZW5kIHRoaXMgaW50ZXJmYWNlIGFuZCB0eXBlY2FzdCB0aGUgUmVzb3VyY2VDbGFzcyB0byBpdC4KKyAgICAvLworICAgIC8vIEluIGNhc2Ugb2YgcGFzc2luZyB0aGUgZmlyc3QgYXJndW1lbnQgYXMgYW55dGhpbmcgYnV0IGEgZnVuY3Rpb24sCisgICAgLy8gaXQncyBnb25uYSBiZSBjb25zaWRlcmVkIGRhdGEgaWYgdGhlIGFjdGlvbiBtZXRob2QgaXMgUE9TVCwgUFVUIG9yCisgICAgLy8gUEFUQ0ggKGluIG90aGVyIHdvcmRzLCBtZXRob2RzIHdpdGggYm9keSkuIE90aGVyd2lzZSwgaXQncyBnb2luZworICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgcGFyYW1ldGVycyB0byB0aGUgcmVxdWVzdC4KKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2Jsb2IvdjEuMi4wL3NyYy9uZ1Jlc291cmNlL3Jlc291cmNlLmpzI0w0NjEtTDQ2NQorICAgIC8vCisgICAgLy8gT25seSB0aG9zZSBtZXRob2RzIHdpdGggYW4gSFRUUCBib2R5IGRvIGhhdmUgJ2RhdGEnIGFzIGZpcnN0IHBhcmFtZXRlcjoKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2Jsb2IvdjEuMi4wL3NyYy9uZ1Jlc291cmNlL3Jlc291cmNlLmpzI0w0NjMKKyAgICAvLyBNb3JlIHNwZWNpZmljYWxseSwgdGhvc2UgbWV0aG9kcyBhcmUgUE9TVCwgUFVUIGFuZCBQQVRDSDoKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2Jsb2IvdjEuMi4wL3NyYy9uZ1Jlc291cmNlL3Jlc291cmNlLmpzI0w0MzIKKyAgICAvLworICAgIC8vIEFsc28sIHN0YXRpYyBjYWxscyBhbHdheXMgcmV0dXJuIHRoZSBJUmVzb3VyY2UgKG9yIElSZXNvdXJjZUFycmF5KSByZXRyaWV2ZWQKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2Jsb2IvdjEuMi4wL3NyYy9uZ1Jlc291cmNlL3Jlc291cmNlLmpzI0w1MzgtTDU0OQorICAgIGludGVyZmFjZSBJUmVzb3VyY2VDbGFzczxUPiB7CisgICAgICAgIG5ldyhkYXRhT3JQYXJhbXM/IDogYW55KSA6IFQ7CisgICAgICAgIGdldCgpOiBUOworICAgICAgICBnZXQocGFyYW1zOiBPYmplY3QpOiBUOworICAgICAgICBnZXQoc3VjY2VzczogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBUOworICAgICAgICBnZXQocGFyYW1zOiBPYmplY3QsIHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogVDsKKyAgICAgICAgZ2V0KHBhcmFtczogT2JqZWN0LCBkYXRhOiBPYmplY3QsIHN1Y2Nlc3M/OiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IFQ7CisKKyAgICAgICAgcXVlcnkoKTogSVJlc291cmNlQXJyYXk8VD47CisgICAgICAgIHF1ZXJ5KHBhcmFtczogT2JqZWN0KTogSVJlc291cmNlQXJyYXk8VD47CisgICAgICAgIHF1ZXJ5KHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogSVJlc291cmNlQXJyYXk8VD47CisgICAgICAgIHF1ZXJ5KHBhcmFtczogT2JqZWN0LCBzdWNjZXNzOiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IElSZXNvdXJjZUFycmF5PFQ+OworICAgICAgICBxdWVyeShwYXJhbXM6IE9iamVjdCwgZGF0YTogT2JqZWN0LCBzdWNjZXNzPzogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBJUmVzb3VyY2VBcnJheTxUPjsKKworICAgICAgICBzYXZlKCk6IFQ7CisgICAgICAgIHNhdmUoZGF0YTogT2JqZWN0KTogVDsKKyAgICAgICAgc2F2ZShzdWNjZXNzOiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IFQ7CisgICAgICAgIHNhdmUoZGF0YTogT2JqZWN0LCBzdWNjZXNzOiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IFQ7CisgICAgICAgIHNhdmUocGFyYW1zOiBPYmplY3QsIGRhdGE6IE9iamVjdCwgc3VjY2Vzcz86IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogVDsKKworICAgICAgICByZW1vdmUoKTogVDsKKyAgICAgICAgcmVtb3ZlKHBhcmFtczogT2JqZWN0KTogVDsKKyAgICAgICAgcmVtb3ZlKHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogVDsKKyAgICAgICAgcmVtb3ZlKHBhcmFtczogT2JqZWN0LCBzdWNjZXNzOiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IFQ7CisgICAgICAgIHJlbW92ZShwYXJhbXM6IE9iamVjdCwgZGF0YTogT2JqZWN0LCBzdWNjZXNzPzogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBUOworCisgICAgICAgIGRlbGV0ZSgpOiBUOworICAgICAgICBkZWxldGUocGFyYW1zOiBPYmplY3QpOiBUOworICAgICAgICBkZWxldGUoc3VjY2VzczogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBUOworICAgICAgICBkZWxldGUocGFyYW1zOiBPYmplY3QsIHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogVDsKKyAgICAgICAgZGVsZXRlKHBhcmFtczogT2JqZWN0LCBkYXRhOiBPYmplY3QsIHN1Y2Nlc3M/OiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IFQ7CisgICAgfQorCisgICAgLy8gSW5zdGFuY2UgY2FsbHMgYWx3YXlzIHJldHVybiB0aGUgdGhlIHByb21pc2Ugb2YgdGhlIHJlcXVlc3Qgd2hpY2ggcmV0cmlldmVkIHRoZSBvYmplY3QKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2Jsb2IvdjEuMi4wL3NyYy9uZ1Jlc291cmNlL3Jlc291cmNlLmpzI0w1MzgtTDU0NgorICAgIGludGVyZmFjZSBJUmVzb3VyY2U8VD4geworICAgICAgICAkZ2V0KCk6IGFuZ3VsYXIuSVByb21pc2U8VD47CisgICAgICAgICRnZXQocGFyYW1zPzogT2JqZWN0LCBzdWNjZXNzPzogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBhbmd1bGFyLklQcm9taXNlPFQ+OworICAgICAgICAkZ2V0KHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogYW5ndWxhci5JUHJvbWlzZTxUPjsKKworICAgICAgICAkcXVlcnkoKTogYW5ndWxhci5JUHJvbWlzZTxJUmVzb3VyY2VBcnJheTxUPj47CisgICAgICAgICRxdWVyeShwYXJhbXM/OiBPYmplY3QsIHN1Y2Nlc3M/OiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IGFuZ3VsYXIuSVByb21pc2U8SVJlc291cmNlQXJyYXk8VD4+OworICAgICAgICAkcXVlcnkoc3VjY2VzczogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBhbmd1bGFyLklQcm9taXNlPElSZXNvdXJjZUFycmF5PFQ+PjsKKworICAgICAgICAkc2F2ZSgpOiBhbmd1bGFyLklQcm9taXNlPFQ+OworICAgICAgICAkc2F2ZShwYXJhbXM/OiBPYmplY3QsIHN1Y2Nlc3M/OiBGdW5jdGlvbiwgZXJyb3I/OiBGdW5jdGlvbik6IGFuZ3VsYXIuSVByb21pc2U8VD47CisgICAgICAgICRzYXZlKHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogYW5ndWxhci5JUHJvbWlzZTxUPjsKKworICAgICAgICAkcmVtb3ZlKCk6IGFuZ3VsYXIuSVByb21pc2U8VD47CisgICAgICAgICRyZW1vdmUocGFyYW1zPzogT2JqZWN0LCBzdWNjZXNzPzogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBhbmd1bGFyLklQcm9taXNlPFQ+OworICAgICAgICAkcmVtb3ZlKHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogYW5ndWxhci5JUHJvbWlzZTxUPjsKKworICAgICAgICAkZGVsZXRlKCk6IGFuZ3VsYXIuSVByb21pc2U8VD47CisgICAgICAgICRkZWxldGUocGFyYW1zPzogT2JqZWN0LCBzdWNjZXNzPzogRnVuY3Rpb24sIGVycm9yPzogRnVuY3Rpb24pOiBhbmd1bGFyLklQcm9taXNlPFQ+OworICAgICAgICAkZGVsZXRlKHN1Y2Nlc3M6IEZ1bmN0aW9uLCBlcnJvcj86IEZ1bmN0aW9uKTogYW5ndWxhci5JUHJvbWlzZTxUPjsKKworICAgICAgICAvKiogdGhlIHByb21pc2Ugb2YgdGhlIG9yaWdpbmFsIHNlcnZlciBpbnRlcmFjdGlvbiB0aGF0IGNyZWF0ZWQgdGhpcyBpbnN0YW5jZS4gKiovCisgICAgICAgICRwcm9taXNlIDogYW5ndWxhci5JUHJvbWlzZTxUPjsKKyAgICAgICAgJHJlc29sdmVkIDogYm9vbGVhbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFsbHkganVzdCBhIHJlZ3VsYXIgQXJyYXkgb2JqZWN0IHdpdGggJHByb21pc2UgYW5kICRyZXNvbHZlIGF0dGFjaGVkIHRvIGl0CisgICAgICovCisgICAgaW50ZXJmYWNlIElSZXNvdXJjZUFycmF5PFQ+IGV4dGVuZHMgQXJyYXk8VD4geworICAgICAgICAvKiogdGhlIHByb21pc2Ugb2YgdGhlIG9yaWdpbmFsIHNlcnZlciBpbnRlcmFjdGlvbiB0aGF0IGNyZWF0ZWQgdGhpcyBjb2xsZWN0aW9uLiAqKi8KKyAgICAgICAgJHByb21pc2UgOiBhbmd1bGFyLklQcm9taXNlPElSZXNvdXJjZUFycmF5PFQ+PjsKKyAgICAgICAgJHJlc29sdmVkIDogYm9vbGVhbjsKKyAgICB9CisKKyAgICAvKiogd2hlbiBjcmVhdGluZyBhIHJlc291cmNlIGZhY3RvcnkgdmlhIElNb2R1bGUuZmFjdG9yeSAqLworICAgIGludGVyZmFjZSBJUmVzb3VyY2VTZXJ2aWNlRmFjdG9yeUZ1bmN0aW9uPFQ+IHsKKyAgICAgICAgKCRyZXNvdXJjZTogYW5ndWxhci5yZXNvdXJjZS5JUmVzb3VyY2VTZXJ2aWNlKTogSVJlc291cmNlQ2xhc3M8VD47CisgICAgICAgIDxVIGV4dGVuZHMgSVJlc291cmNlQ2xhc3M8VD4+KCRyZXNvdXJjZTogYW5ndWxhci5yZXNvdXJjZS5JUmVzb3VyY2VTZXJ2aWNlKTogVTsKKyAgICB9Cit9CisKKy8qKiBleHRlbnNpb25zIHRvIGJhc2UgbmcgYmFzZWQgb24gdXNpbmcgYW5ndWxhci1yZXNvdXJjZSAqLworZGVjbGFyZSBtb2R1bGUgYW5ndWxhciB7CisKKyAgICBpbnRlcmZhY2UgSU1vZHVsZSB7CisgICAgICAgIC8qKiBjcmVhdGluZyBhIHJlc291cmNlIHNlcnZpY2UgZmFjdG9yeSAqLworICAgICAgICBmYWN0b3J5KG5hbWU6IHN0cmluZywgcmVzb3VyY2VTZXJ2aWNlRmFjdG9yeUZ1bmN0aW9uOiBhbmd1bGFyLnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2VGYWN0b3J5RnVuY3Rpb248YW55Pik6IElNb2R1bGU7CisgICAgfQorfQorCitpbnRlcmZhY2UgQXJyYXk8VD4KK3sKKyAgICAvKiogdGhlIHByb21pc2Ugb2YgdGhlIG9yaWdpbmFsIHNlcnZlciBpbnRlcmFjdGlvbiB0aGF0IGNyZWF0ZWQgdGhpcyBjb2xsZWN0aW9uLiAqKi8KKyAgICAkcHJvbWlzZSA6IGFuZ3VsYXIuSVByb21pc2U8QXJyYXk8VD4+OworICAgICRyZXNvbHZlZCA6IGJvb2xlYW47Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3R5cGluZ3MvYW5ndWxhcmpzL2FuZ3VsYXIuZC50cyBiL2NhdGFsb2ctdWkvdHlwaW5ncy9hbmd1bGFyanMvYW5ndWxhci5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjU2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3R5cGluZ3MvYW5ndWxhcmpzL2FuZ3VsYXIuZC50cwpAQCAtMCwwICsxLDE2MTMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyBUeXBlIGRlZmluaXRpb25zIGZvciBBbmd1bGFyIEpTIDEuMysKKy8vIFByb2plY3Q6IGh0dHA6Ly9hbmd1bGFyanMub3JnCisvLyBEZWZpbml0aW9ucyBieTogRGllZ28gVmlsYXIgPGh0dHA6Ly9naXRodWIuY29tL2RpZWdvdmlsYXI+CisvLyBEZWZpbml0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292L0RlZmluaXRlbHlUeXBlZAorCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL2pxdWVyeS9qcXVlcnkuZC50cyIgLz4KKworZGVjbGFyZSB2YXIgYW5ndWxhcjogYW5ndWxhci5JQW5ndWxhclN0YXRpYzsKKworLy8gU3VwcG9ydCBmb3IgcGFpbmxlc3MgZGVwZW5kZW5jeSBpbmplY3Rpb24KK2ludGVyZmFjZSBGdW5jdGlvbiB7CisgICAgJGluamVjdD86IHN0cmluZ1tdOworfQorCisvLyBDb2xsYXBzZSBhbmd1bGFyIGludG8gbmcKK2ltcG9ydCBuZyA9IGFuZ3VsYXI7CisvLyBTdXBwb3J0IEFNRCByZXF1aXJlCitkZWNsYXJlIG1vZHVsZSAnYW5ndWxhcicgeworICAgIGV4cG9ydCA9IGFuZ3VsYXI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIG5nIG1vZHVsZSAoYW5ndWxhci5qcykKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2RlY2xhcmUgbW9kdWxlIGFuZ3VsYXIgeworCisgICAgLy8gbm90IGRpcmVjdGx5IGltcGxlbWVudGVkLCBidXQgZW5zdXJlcyB0aGF0IGNvbnN0cnVjdGVkIGNsYXNzIGltcGxlbWVudHMgJGdldAorICAgIGludGVyZmFjZSBJU2VydmljZVByb3ZpZGVyQ2xhc3MgeworICAgICAgICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogSVNlcnZpY2VQcm92aWRlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSVNlcnZpY2VQcm92aWRlckZhY3RvcnkgeworICAgICAgICAoLi4uYXJnczogYW55W10pOiBJU2VydmljZVByb3ZpZGVyOworICAgIH0KKworICAgIC8vIEFsbCBzZXJ2aWNlIHByb3ZpZGVycyBleHRlbmQgdGhpcyBpbnRlcmZhY2UKKyAgICBpbnRlcmZhY2UgSVNlcnZpY2VQcm92aWRlciB7CisgICAgICAgICRnZXQ6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUFuZ3VsYXJCb290c3RyYXBDb25maWcgeworICAgICAgICBzdHJpY3REaT86IGJvb2xlYW47CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQW5ndWxhclN0YXRpYworICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJQW5ndWxhclN0YXRpYyB7CisgICAgICAgIGJpbmQoY29udGV4dDogYW55LCBmbjogRnVuY3Rpb24sIC4uLmFyZ3M6IGFueVtdKTogRnVuY3Rpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIG1hbnVhbGx5IHN0YXJ0IHVwIGFuZ3VsYXIgYXBwbGljYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVtZW50IERPTSBlbGVtZW50IHdoaWNoIGlzIHRoZSByb290IG9mIGFuZ3VsYXIgYXBwbGljYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBtb2R1bGVzIEFuIGFycmF5IG9mIG1vZHVsZXMgdG8gbG9hZCBpbnRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogICAgIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgcHJlZGVmaW5lZCBtb2R1bGUgb3IgYSAoREkgYW5ub3RhdGVkKQorICAgICAgICAgKiAgICAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlIGluamVjdG9yIGFzIGEgcnVuIGJsb2NrLgorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIGFuIG9iamVjdCBmb3IgZGVmaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYXBwbGljYXRpb24uIFRoZSBmb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkOgorICAgICAgICAgKiAgICAgLSBgc3RyaWN0RGlgOiBkaXNhYmxlIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgbWVhbnQgdG8gYXNzaXN0IGluIGZpbmRpbmcgYnVncyB3aGljaCBicmVhayBtaW5pZmllZCBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vdHN0cmFwKGVsZW1lbnQ6IHN0cmluZywgbW9kdWxlcz86IHN0cmluZywgY29uZmlnPzogSUFuZ3VsYXJCb290c3RyYXBDb25maWcpOiBhdXRvLklJbmplY3RvclNlcnZpY2U7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byBtYW51YWxseSBzdGFydCB1cCBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gbW9kdWxlcyBBbiBhcnJheSBvZiBtb2R1bGVzIHRvIGxvYWQgaW50byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAqICAgICBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIG9yIGEgKERJIGFubm90YXRlZCkKKyAgICAgICAgICogICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBpbmplY3RvciBhcyBhIHJ1biBibG9jay4KKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBhbiBvYmplY3QgZm9yIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgICogICAgIC0gYHN0cmljdERpYDogZGlzYWJsZSBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGlzIG1lYW50IHRvIGFzc2lzdCBpbiBmaW5kaW5nIGJ1Z3Mgd2hpY2ggYnJlYWsgbWluaWZpZWQgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb3RzdHJhcChlbGVtZW50OiBzdHJpbmcsIG1vZHVsZXM/OiBGdW5jdGlvbiwgY29uZmlnPzogSUFuZ3VsYXJCb290c3RyYXBDb25maWcpOiBhdXRvLklJbmplY3RvclNlcnZpY2U7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byBtYW51YWxseSBzdGFydCB1cCBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gbW9kdWxlcyBBbiBhcnJheSBvZiBtb2R1bGVzIHRvIGxvYWQgaW50byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAqICAgICBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIG9yIGEgKERJIGFubm90YXRlZCkKKyAgICAgICAgICogICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBpbmplY3RvciBhcyBhIHJ1biBibG9jay4KKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBhbiBvYmplY3QgZm9yIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgICogICAgIC0gYHN0cmljdERpYDogZGlzYWJsZSBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGlzIG1lYW50IHRvIGFzc2lzdCBpbiBmaW5kaW5nIGJ1Z3Mgd2hpY2ggYnJlYWsgbWluaWZpZWQgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb3RzdHJhcChlbGVtZW50OiBzdHJpbmcsIG1vZHVsZXM/OiBzdHJpbmdbXSwgY29uZmlnPzogSUFuZ3VsYXJCb290c3RyYXBDb25maWcpOiBhdXRvLklJbmplY3RvclNlcnZpY2U7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byBtYW51YWxseSBzdGFydCB1cCBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gbW9kdWxlcyBBbiBhcnJheSBvZiBtb2R1bGVzIHRvIGxvYWQgaW50byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAqICAgICBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIG9yIGEgKERJIGFubm90YXRlZCkKKyAgICAgICAgICogICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBpbmplY3RvciBhcyBhIHJ1biBibG9jay4KKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBhbiBvYmplY3QgZm9yIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgICogICAgIC0gYHN0cmljdERpYDogZGlzYWJsZSBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGlzIG1lYW50IHRvIGFzc2lzdCBpbiBmaW5kaW5nIGJ1Z3Mgd2hpY2ggYnJlYWsgbWluaWZpZWQgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb3RzdHJhcChlbGVtZW50OiBKUXVlcnksIG1vZHVsZXM/OiBzdHJpbmcsIGNvbmZpZz86IElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnKTogYXV0by5JSW5qZWN0b3JTZXJ2aWNlOworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlcyB0byBsb2FkIGludG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiAgICAgRWFjaCBpdGVtIGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIG1vZHVsZSBvciBhIChESSBhbm5vdGF0ZWQpCisgICAgICAgICAqICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgaW5qZWN0b3IgYXMgYSBydW4gYmxvY2suCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgYW4gb2JqZWN0IGZvciBkZWZpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgICAqICAgICAtIGBzdHJpY3REaWA6IGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0byBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBib290c3RyYXAoZWxlbWVudDogSlF1ZXJ5LCBtb2R1bGVzPzogRnVuY3Rpb24sIGNvbmZpZz86IElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnKTogYXV0by5JSW5qZWN0b3JTZXJ2aWNlOworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlcyB0byBsb2FkIGludG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiAgICAgRWFjaCBpdGVtIGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIG1vZHVsZSBvciBhIChESSBhbm5vdGF0ZWQpCisgICAgICAgICAqICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgaW5qZWN0b3IgYXMgYSBydW4gYmxvY2suCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgYW4gb2JqZWN0IGZvciBkZWZpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgICAqICAgICAtIGBzdHJpY3REaWA6IGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0byBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBib290c3RyYXAoZWxlbWVudDogSlF1ZXJ5LCBtb2R1bGVzPzogc3RyaW5nW10sIGNvbmZpZz86IElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnKTogYXV0by5JSW5qZWN0b3JTZXJ2aWNlOworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlcyB0byBsb2FkIGludG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiAgICAgRWFjaCBpdGVtIGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIG1vZHVsZSBvciBhIChESSBhbm5vdGF0ZWQpCisgICAgICAgICAqICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgaW5qZWN0b3IgYXMgYSBydW4gYmxvY2suCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgYW4gb2JqZWN0IGZvciBkZWZpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgICAqICAgICAtIGBzdHJpY3REaWA6IGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0byBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBib290c3RyYXAoZWxlbWVudDogRWxlbWVudCwgbW9kdWxlcz86IHN0cmluZywgY29uZmlnPzogSUFuZ3VsYXJCb290c3RyYXBDb25maWcpOiBhdXRvLklJbmplY3RvclNlcnZpY2U7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byBtYW51YWxseSBzdGFydCB1cCBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gbW9kdWxlcyBBbiBhcnJheSBvZiBtb2R1bGVzIHRvIGxvYWQgaW50byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAqICAgICBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIG9yIGEgKERJIGFubm90YXRlZCkKKyAgICAgICAgICogICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBpbmplY3RvciBhcyBhIHJ1biBibG9jay4KKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBhbiBvYmplY3QgZm9yIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgICogICAgIC0gYHN0cmljdERpYDogZGlzYWJsZSBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGlzIG1lYW50IHRvIGFzc2lzdCBpbiBmaW5kaW5nIGJ1Z3Mgd2hpY2ggYnJlYWsgbWluaWZpZWQgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb3RzdHJhcChlbGVtZW50OiBFbGVtZW50LCBtb2R1bGVzPzogRnVuY3Rpb24sIGNvbmZpZz86IElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnKTogYXV0by5JSW5qZWN0b3JTZXJ2aWNlOworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlcyB0byBsb2FkIGludG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiAgICAgRWFjaCBpdGVtIGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIG1vZHVsZSBvciBhIChESSBhbm5vdGF0ZWQpCisgICAgICAgICAqICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgaW5qZWN0b3IgYXMgYSBydW4gYmxvY2suCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgYW4gb2JqZWN0IGZvciBkZWZpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgICAqICAgICAtIGBzdHJpY3REaWA6IGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0byBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBib290c3RyYXAoZWxlbWVudDogRWxlbWVudCwgbW9kdWxlcz86IHN0cmluZ1tdLCBjb25maWc/OiBJQW5ndWxhckJvb3RzdHJhcENvbmZpZyk6IGF1dG8uSUluamVjdG9yU2VydmljZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIG1hbnVhbGx5IHN0YXJ0IHVwIGFuZ3VsYXIgYXBwbGljYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVtZW50IERPTSBlbGVtZW50IHdoaWNoIGlzIHRoZSByb290IG9mIGFuZ3VsYXIgYXBwbGljYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBtb2R1bGVzIEFuIGFycmF5IG9mIG1vZHVsZXMgdG8gbG9hZCBpbnRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogICAgIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgcHJlZGVmaW5lZCBtb2R1bGUgb3IgYSAoREkgYW5ub3RhdGVkKQorICAgICAgICAgKiAgICAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlIGluamVjdG9yIGFzIGEgcnVuIGJsb2NrLgorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIGFuIG9iamVjdCBmb3IgZGVmaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYXBwbGljYXRpb24uIFRoZSBmb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkOgorICAgICAgICAgKiAgICAgLSBgc3RyaWN0RGlgOiBkaXNhYmxlIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgbWVhbnQgdG8gYXNzaXN0IGluIGZpbmRpbmcgYnVncyB3aGljaCBicmVhayBtaW5pZmllZCBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vdHN0cmFwKGVsZW1lbnQ6IERvY3VtZW50LCBtb2R1bGVzPzogc3RyaW5nLCBjb25maWc/OiBJQW5ndWxhckJvb3RzdHJhcENvbmZpZyk6IGF1dG8uSUluamVjdG9yU2VydmljZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIG1hbnVhbGx5IHN0YXJ0IHVwIGFuZ3VsYXIgYXBwbGljYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVtZW50IERPTSBlbGVtZW50IHdoaWNoIGlzIHRoZSByb290IG9mIGFuZ3VsYXIgYXBwbGljYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBtb2R1bGVzIEFuIGFycmF5IG9mIG1vZHVsZXMgdG8gbG9hZCBpbnRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogICAgIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgcHJlZGVmaW5lZCBtb2R1bGUgb3IgYSAoREkgYW5ub3RhdGVkKQorICAgICAgICAgKiAgICAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlIGluamVjdG9yIGFzIGEgcnVuIGJsb2NrLgorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIGFuIG9iamVjdCBmb3IgZGVmaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYXBwbGljYXRpb24uIFRoZSBmb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkOgorICAgICAgICAgKiAgICAgLSBgc3RyaWN0RGlgOiBkaXNhYmxlIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgbWVhbnQgdG8gYXNzaXN0IGluIGZpbmRpbmcgYnVncyB3aGljaCBicmVhayBtaW5pZmllZCBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vdHN0cmFwKGVsZW1lbnQ6IERvY3VtZW50LCBtb2R1bGVzPzogRnVuY3Rpb24sIGNvbmZpZz86IElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnKTogYXV0by5JSW5qZWN0b3JTZXJ2aWNlOworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlcyB0byBsb2FkIGludG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiAgICAgRWFjaCBpdGVtIGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIG1vZHVsZSBvciBhIChESSBhbm5vdGF0ZWQpCisgICAgICAgICAqICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgaW5qZWN0b3IgYXMgYSBydW4gYmxvY2suCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgYW4gb2JqZWN0IGZvciBkZWZpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgICAqICAgICAtIGBzdHJpY3REaWA6IGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0byBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBib290c3RyYXAoZWxlbWVudDogRG9jdW1lbnQsIG1vZHVsZXM/OiBzdHJpbmdbXSwgY29uZmlnPzogSUFuZ3VsYXJCb290c3RyYXBDb25maWcpOiBhdXRvLklJbmplY3RvclNlcnZpY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2Ygc291cmNlLCB3aGljaCBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiAtIElmIG5vIGRlc3RpbmF0aW9uIGlzIHN1cHBsaWVkLCBhIGNvcHkgb2YgdGhlIG9iamVjdCBvciBhcnJheSBpcyBjcmVhdGVkLgorICAgICAgICAgKiAtIElmIGEgZGVzdGluYXRpb24gaXMgcHJvdmlkZWQsIGFsbCBvZiBpdHMgZWxlbWVudHMgKGZvciBhcnJheSkgb3IgcHJvcGVydGllcyAoZm9yIG9iamVjdHMpIGFyZSBkZWxldGVkIGFuZCB0aGVuIGFsbCBlbGVtZW50cy9wcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGl0LgorICAgICAgICAgKiAtIElmIHNvdXJjZSBpcyBub3QgYW4gb2JqZWN0IG9yIGFycmF5IChpbmMuIG51bGwgYW5kIHVuZGVmaW5lZCksIHNvdXJjZSBpcyByZXR1cm5lZC4KKyAgICAgICAgICogLSBJZiBzb3VyY2UgaXMgaWRlbnRpY2FsIHRvICdkZXN0aW5hdGlvbicgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbWFrZSBhIGNvcHkuIENhbiBiZSBhbnkgdHlwZSwgaW5jbHVkaW5nIHByaW1pdGl2ZXMsIG51bGwsIGFuZCB1bmRlZmluZWQuCisgICAgICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBEZXN0aW5hdGlvbiBpbnRvIHdoaWNoIHRoZSBzb3VyY2UgaXMgY29waWVkLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIGNvcHk8VD4oc291cmNlOiBULCBkZXN0aW5hdGlvbj86IFQpOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwcyBhIHJhdyBET00gZWxlbWVudCBvciBIVE1MIHN0cmluZyBhcyBhIGpRdWVyeSBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBqUXVlcnkgaXMgYXZhaWxhYmxlLCBhbmd1bGFyLmVsZW1lbnQgaXMgYW4gYWxpYXMgZm9yIHRoZSBqUXVlcnkgZnVuY3Rpb24uIElmIGpRdWVyeSBpcyBub3QgYXZhaWxhYmxlLCBhbmd1bGFyLmVsZW1lbnQgZGVsZWdhdGVzIHRvIEFuZ3VsYXIncyBidWlsdC1pbiBzdWJzZXQgb2YgalF1ZXJ5LCBjYWxsZWQgImpRdWVyeSBsaXRlIiBvciAianFMaXRlLiIKKyAgICAgICAgICovCisgICAgICAgIGVsZW1lbnQ6IElBdWdtZW50ZWRKUXVlcnlTdGF0aWM7CisgICAgICAgIGVxdWFscyh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnkpOiBib29sZWFuOworICAgICAgICBleHRlbmQoZGVzdGluYXRpb246IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZXMgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggaXRlbSBpbiBvYmogY29sbGVjdGlvbiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYW4gYXJyYXkuIFRoZSBpdGVyYXRvciBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggaXRlcmF0b3IodmFsdWUsIGtleSksIHdoZXJlIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgcHJvcGVydHkgb3IgYW4gYXJyYXkgZWxlbWVudCBhbmQga2V5IGlzIHRoZSBvYmplY3QgcHJvcGVydHkga2V5IG9yIGFycmF5IGVsZW1lbnQgaW5kZXguIFNwZWNpZnlpbmcgYSBjb250ZXh0IGZvciB0aGUgZnVuY3Rpb24gaXMgb3B0aW9uYWwuCisgICAgICAgICAqCisgICAgICAgICAqIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IC5mb3JFYWNoIGRvZXMgbm90IGl0ZXJhdGUgb3ZlciBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWNhdXNlIGl0IGZpbHRlcnMgdXNpbmcgdGhlIGhhc093blByb3BlcnR5IG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0b3IgSXRlcmF0b3IgZnVuY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IE9iamVjdCB0byBiZWNvbWUgY29udGV4dCAodGhpcykgZm9yIHRoZSBpdGVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2g8VD4ob2JqOiBUW10sIGl0ZXJhdG9yOiAodmFsdWU6IFQsIGtleTogbnVtYmVyKSA9PiBhbnksIGNvbnRleHQ/OiBhbnkpOiBhbnk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRvciBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGl0ZW0gaW4gb2JqIGNvbGxlY3Rpb24sIHdoaWNoIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGFuIGFycmF5LiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIGl0ZXJhdG9yKHZhbHVlLCBrZXkpLCB3aGVyZSB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHByb3BlcnR5IG9yIGFuIGFycmF5IGVsZW1lbnQgYW5kIGtleSBpcyB0aGUgb2JqZWN0IHByb3BlcnR5IGtleSBvciBhcnJheSBlbGVtZW50IGluZGV4LiBTcGVjaWZ5aW5nIGEgY29udGV4dCBmb3IgdGhlIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLgorICAgICAgICAgKgorICAgICAgICAgKiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCAuZm9yRWFjaCBkb2VzIG5vdCBpdGVyYXRlIG92ZXIgaW5oZXJpdGVkIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBmaWx0ZXJzIHVzaW5nIHRoZSBoYXNPd25Qcm9wZXJ0eSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdG9yIEl0ZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBPYmplY3QgdG8gYmVjb21lIGNvbnRleHQgKHRoaXMpIGZvciB0aGUgaXRlcmF0b3IgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoPFQ+KG9iajogeyBbaW5kZXg6IHN0cmluZ106IFQ7IH0sIGl0ZXJhdG9yOiAodmFsdWU6IFQsIGtleTogc3RyaW5nKSA9PiBhbnksIGNvbnRleHQ/OiBhbnkpOiBhbnk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRvciBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGl0ZW0gaW4gb2JqIGNvbGxlY3Rpb24sIHdoaWNoIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGFuIGFycmF5LiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIGl0ZXJhdG9yKHZhbHVlLCBrZXkpLCB3aGVyZSB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHByb3BlcnR5IG9yIGFuIGFycmF5IGVsZW1lbnQgYW5kIGtleSBpcyB0aGUgb2JqZWN0IHByb3BlcnR5IGtleSBvciBhcnJheSBlbGVtZW50IGluZGV4LiBTcGVjaWZ5aW5nIGEgY29udGV4dCBmb3IgdGhlIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLgorICAgICAgICAgKgorICAgICAgICAgKiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCAuZm9yRWFjaCBkb2VzIG5vdCBpdGVyYXRlIG92ZXIgaW5oZXJpdGVkIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBmaWx0ZXJzIHVzaW5nIHRoZSBoYXNPd25Qcm9wZXJ0eSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdG9yIEl0ZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBPYmplY3QgdG8gYmVjb21lIGNvbnRleHQgKHRoaXMpIGZvciB0aGUgaXRlcmF0b3IgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoKG9iajogYW55LCBpdGVyYXRvcjogKHZhbHVlOiBhbnksIGtleTogYW55KSA9PiBhbnksIGNvbnRleHQ/OiBhbnkpOiBhbnk7CisKKyAgICAgICAgZnJvbUpzb24oanNvbjogc3RyaW5nKTogYW55OworICAgICAgICBpZGVudGl0eShhcmc/OiBhbnkpOiBhbnk7CisgICAgICAgIGluamVjdG9yKG1vZHVsZXM/OiBhbnlbXSk6IGF1dG8uSUluamVjdG9yU2VydmljZTsKKyAgICAgICAgaXNBcnJheSh2YWx1ZTogYW55KTogYm9vbGVhbjsKKyAgICAgICAgaXNEYXRlKHZhbHVlOiBhbnkpOiBib29sZWFuOworICAgICAgICBpc0RlZmluZWQodmFsdWU6IGFueSk6IGJvb2xlYW47CisgICAgICAgIGlzRWxlbWVudCh2YWx1ZTogYW55KTogYm9vbGVhbjsKKyAgICAgICAgaXNGdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbjsKKyAgICAgICAgaXNOdW1iZXIodmFsdWU6IGFueSk6IGJvb2xlYW47CisgICAgICAgIGlzT2JqZWN0KHZhbHVlOiBhbnkpOiBib29sZWFuOworICAgICAgICBpc1N0cmluZyh2YWx1ZTogYW55KTogYm9vbGVhbjsKKyAgICAgICAgaXNVbmRlZmluZWQodmFsdWU6IGFueSk6IGJvb2xlYW47CisgICAgICAgIGxvd2VyY2FzZShzdHI6IHN0cmluZyk6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFuZ3VsYXIubW9kdWxlIGlzIGEgZ2xvYmFsIHBsYWNlIGZvciBjcmVhdGluZywgcmVnaXN0ZXJpbmcgYW5kIHJldHJpZXZpbmcgQW5ndWxhciBtb2R1bGVzLiBBbGwgbW9kdWxlcyAoYW5ndWxhciBjb3JlIG9yIDNyZCBwYXJ0eSkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIHRvIGFuIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGlzIG1lY2hhbmlzbS4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiBwYXNzZWQgdHdvIG9yIG1vcmUgYXJndW1lbnRzLCBhIG5ldyBtb2R1bGUgaXMgY3JlYXRlZC4gSWYgcGFzc2VkIG9ubHkgb25lIGFyZ3VtZW50LCBhbiBleGlzdGluZyBtb2R1bGUgKHRoZSBuYW1lIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gbW9kdWxlKSBpcyByZXRyaWV2ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gY3JlYXRlIG9yIHJldHJpZXZlLgorICAgICAgICAgKiBAcGFyYW0gcmVxdWlyZXMgVGhlIG5hbWVzIG9mIG1vZHVsZXMgdGhpcyBtb2R1bGUgZGVwZW5kcyBvbi4gSWYgc3BlY2lmaWVkIHRoZW4gbmV3IG1vZHVsZSBpcyBiZWluZyBjcmVhdGVkLiBJZiB1bnNwZWNpZmllZCB0aGVuIHRoZSBtb2R1bGUgaXMgYmVpbmcgcmV0cmlldmVkIGZvciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBjb25maWdGbiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlLgorICAgICAgICAgKi8KKyAgICAgICAgbW9kdWxlKAorICAgICAgICAgICAgbmFtZTogc3RyaW5nLAorICAgICAgICAgICAgcmVxdWlyZXM/OiBzdHJpbmdbXSwKKyAgICAgICAgICAgIGNvbmZpZ0ZuPzogRnVuY3Rpb24pOiBJTW9kdWxlOworCisgICAgICAgIG5vb3AoLi4uYXJnczogYW55W10pOiB2b2lkOworICAgICAgICByZWxvYWRXaXRoRGVidWdJbmZvKCk6IHZvaWQ7CisgICAgICAgIHRvSnNvbihvYmo6IGFueSwgcHJldHR5PzogYm9vbGVhbik6IHN0cmluZzsKKyAgICAgICAgdXBwZXJjYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nOworICAgICAgICB2ZXJzaW9uOiB7CisgICAgICAgICAgICBmdWxsOiBzdHJpbmc7CisgICAgICAgICAgICBtYWpvcjogbnVtYmVyOworICAgICAgICAgICAgbWlub3I6IG51bWJlcjsKKyAgICAgICAgICAgIGRvdDogbnVtYmVyOworICAgICAgICAgICAgY29kZU5hbWU6IHN0cmluZzsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBNb2R1bGUKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvYW5ndWxhci5Nb2R1bGUKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSU1vZHVsZSB7CisgICAgICAgIGFuaW1hdGlvbihuYW1lOiBzdHJpbmcsIGFuaW1hdGlvbkZhY3Rvcnk6IEZ1bmN0aW9uKTogSU1vZHVsZTsKKyAgICAgICAgYW5pbWF0aW9uKG5hbWU6IHN0cmluZywgaW5saW5lQW5ub3RhdGVkRnVuY3Rpb246IGFueVtdKTogSU1vZHVsZTsKKyAgICAgICAgYW5pbWF0aW9uKG9iamVjdDogT2JqZWN0KTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB3b3JrIHdoaWNoIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBvbiBtb2R1bGUgbG9hZGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZ0ZuIEV4ZWN1dGUgdGhpcyBmdW5jdGlvbiBvbiBtb2R1bGUgbG9hZC4gVXNlZnVsIGZvciBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBjb25maWcoY29uZmlnRm46IEZ1bmN0aW9uKTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB3b3JrIHdoaWNoIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBvbiBtb2R1bGUgbG9hZGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlubGluZUFubm90YXRlZEZ1bmN0aW9uIEV4ZWN1dGUgdGhpcyBmdW5jdGlvbiBvbiBtb2R1bGUgbG9hZC4gVXNlZnVsIGZvciBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBjb25maWcoaW5saW5lQW5ub3RhdGVkRnVuY3Rpb246IGFueVtdKTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGEgY29uc3RhbnQgc2VydmljZSwgc3VjaCBhcyBhIHN0cmluZywgYSBudW1iZXIsIGFuIGFycmF5LCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgd2l0aCB0aGUgJGluamVjdG9yLiBVbmxpa2UgdmFsdWUgaXQgY2FuIGJlIGluamVjdGVkIGludG8gYSBtb2R1bGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoc2VlIGNvbmZpZykgYW5kIGl0IGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGFuIEFuZ3VsYXIgZGVjb3JhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29uc3RhbnQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgY29uc3RhbnQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBjb25zdGFudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBJTW9kdWxlOworICAgICAgICBjb25zdGFudChvYmplY3Q6IE9iamVjdCk6IElNb2R1bGU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgJGNvbnRyb2xsZXIgc2VydmljZSBpcyB1c2VkIGJ5IEFuZ3VsYXIgdG8gY3JlYXRlIG5ldyBjb250cm9sbGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBwcm92aWRlciBhbGxvd3MgY29udHJvbGxlciByZWdpc3RyYXRpb24gdmlhIHRoZSByZWdpc3RlciBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIENvbnRyb2xsZXIgbmFtZSwgb3IgYW4gb2JqZWN0IG1hcCBvZiBjb250cm9sbGVycyB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgY29uc3RydWN0b3JzLgorICAgICAgICAgKiBAcGFyYW0gY29udHJvbGxlckNvbnN0cnVjdG9yIENvbnRyb2xsZXIgY29uc3RydWN0b3IgZm4gKG9wdGlvbmFsbHkgZGVjb3JhdGVkIHdpdGggREkgYW5ub3RhdGlvbnMgaW4gdGhlIGFycmF5IG5vdGF0aW9uKS4KKyAgICAgICAgICovCisgICAgICAgIGNvbnRyb2xsZXIobmFtZTogc3RyaW5nLCBjb250cm9sbGVyQ29uc3RydWN0b3I6IEZ1bmN0aW9uKTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAkY29udHJvbGxlciBzZXJ2aWNlIGlzIHVzZWQgYnkgQW5ndWxhciB0byBjcmVhdGUgbmV3IGNvbnRyb2xsZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHByb3ZpZGVyIGFsbG93cyBjb250cm9sbGVyIHJlZ2lzdHJhdGlvbiB2aWEgdGhlIHJlZ2lzdGVyIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgQ29udHJvbGxlciBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGNvbnRyb2xsZXJzIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBjb25zdHJ1Y3RvcnMuCisgICAgICAgICAqIEBwYXJhbSBjb250cm9sbGVyQ29uc3RydWN0b3IgQ29udHJvbGxlciBjb25zdHJ1Y3RvciBmbiAob3B0aW9uYWxseSBkZWNvcmF0ZWQgd2l0aCBESSBhbm5vdGF0aW9ucyBpbiB0aGUgYXJyYXkgbm90YXRpb24pLgorICAgICAgICAgKi8KKyAgICAgICAgY29udHJvbGxlcihuYW1lOiBzdHJpbmcsIGlubGluZUFubm90YXRlZENvbnN0cnVjdG9yOiBhbnlbXSk6IElNb2R1bGU7CisgICAgICAgIGNvbnRyb2xsZXIob2JqZWN0OiBPYmplY3QpOiBJTW9kdWxlOworICAgICAgICAvKioKKyAgICAgICAgICogUmVnaXN0ZXIgYSBuZXcgZGlyZWN0aXZlIHdpdGggdGhlIGNvbXBpbGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkaXJlY3RpdmUgaW4gY2FtZWwtY2FzZSAoaS5lLiBuZ0JpbmQgd2hpY2ggd2lsbCBtYXRjaCBhcyBuZy1iaW5kKQorICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aXZlRmFjdG9yeSBBbiBpbmplY3RhYmxlIGRpcmVjdGl2ZSBmYWN0b3J5IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZGlyZWN0aXZlKG5hbWU6IHN0cmluZywgZGlyZWN0aXZlRmFjdG9yeTogSURpcmVjdGl2ZUZhY3RvcnkpOiBJTW9kdWxlOworICAgICAgICAvKioKKyAgICAgICAgICogUmVnaXN0ZXIgYSBuZXcgZGlyZWN0aXZlIHdpdGggdGhlIGNvbXBpbGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkaXJlY3RpdmUgaW4gY2FtZWwtY2FzZSAoaS5lLiBuZ0JpbmQgd2hpY2ggd2lsbCBtYXRjaCBhcyBuZy1iaW5kKQorICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aXZlRmFjdG9yeSBBbiBpbmplY3RhYmxlIGRpcmVjdGl2ZSBmYWN0b3J5IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZGlyZWN0aXZlKG5hbWU6IHN0cmluZywgaW5saW5lQW5ub3RhdGVkRnVuY3Rpb246IGFueVtdKTogSU1vZHVsZTsKKyAgICAgICAgZGlyZWN0aXZlKG9iamVjdDogT2JqZWN0KTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGEgc2VydmljZSBmYWN0b3J5LCB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byByZXR1cm4gdGhlIHNlcnZpY2UgaW5zdGFuY2UuIFRoaXMgaXMgc2hvcnQgZm9yIHJlZ2lzdGVyaW5nIGEgc2VydmljZSB3aGVyZSBpdHMgcHJvdmlkZXIgY29uc2lzdHMgb2Ygb25seSBhICRnZXQgcHJvcGVydHksIHdoaWNoIGlzIHRoZSBnaXZlbiBzZXJ2aWNlIGZhY3RvcnkgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlICRwcm92aWRlLmZhY3RvcnkoZ2V0Rm4pIGlmIHlvdSBkbyBub3QgbmVlZCB0byBjb25maWd1cmUgeW91ciBzZXJ2aWNlIGluIGEgcHJvdmlkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4KKyAgICAgICAgICogQHBhcmFtICRnZXRGbiBUaGUgJGdldEZuIGZvciB0aGUgaW5zdGFuY2UgY3JlYXRpb24uIEludGVybmFsbHkgdGhpcyBpcyBhIHNob3J0IGhhbmQgZm9yICRwcm92aWRlLnByb3ZpZGVyKG5hbWUsIHskZ2V0OiAkZ2V0Rm59KS4KKyAgICAgICAgICovCisgICAgICAgIGZhY3RvcnkobmFtZTogc3RyaW5nLCAkZ2V0Rm46IEZ1bmN0aW9uKTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGEgc2VydmljZSBmYWN0b3J5LCB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byByZXR1cm4gdGhlIHNlcnZpY2UgaW5zdGFuY2UuIFRoaXMgaXMgc2hvcnQgZm9yIHJlZ2lzdGVyaW5nIGEgc2VydmljZSB3aGVyZSBpdHMgcHJvdmlkZXIgY29uc2lzdHMgb2Ygb25seSBhICRnZXQgcHJvcGVydHksIHdoaWNoIGlzIHRoZSBnaXZlbiBzZXJ2aWNlIGZhY3RvcnkgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlICRwcm92aWRlLmZhY3RvcnkoZ2V0Rm4pIGlmIHlvdSBkbyBub3QgbmVlZCB0byBjb25maWd1cmUgeW91ciBzZXJ2aWNlIGluIGEgcHJvdmlkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4KKyAgICAgICAgICogQHBhcmFtIGlubGluZUFubm90YXRlZEZ1bmN0aW9uIFRoZSAkZ2V0Rm4gZm9yIHRoZSBpbnN0YW5jZSBjcmVhdGlvbi4gSW50ZXJuYWxseSB0aGlzIGlzIGEgc2hvcnQgaGFuZCBmb3IgJHByb3ZpZGUucHJvdmlkZXIobmFtZSwgeyRnZXQ6ICRnZXRGbn0pLgorICAgICAgICAgKi8KKyAgICAgICAgZmFjdG9yeShuYW1lOiBzdHJpbmcsIGlubGluZUFubm90YXRlZEZ1bmN0aW9uOiBhbnlbXSk6IElNb2R1bGU7CisgICAgICAgIGZhY3Rvcnkob2JqZWN0OiBPYmplY3QpOiBJTW9kdWxlOworICAgICAgICBmaWx0ZXIobmFtZTogc3RyaW5nLCBmaWx0ZXJGYWN0b3J5RnVuY3Rpb246IEZ1bmN0aW9uKTogSU1vZHVsZTsKKyAgICAgICAgZmlsdGVyKG5hbWU6IHN0cmluZywgaW5saW5lQW5ub3RhdGVkRnVuY3Rpb246IGFueVtdKTogSU1vZHVsZTsKKyAgICAgICAgZmlsdGVyKG9iamVjdDogT2JqZWN0KTogSU1vZHVsZTsKKyAgICAgICAgcHJvdmlkZXIobmFtZTogc3RyaW5nLCBzZXJ2aWNlUHJvdmlkZXJGYWN0b3J5OiBJU2VydmljZVByb3ZpZGVyRmFjdG9yeSk6IElNb2R1bGU7CisgICAgICAgIHByb3ZpZGVyKG5hbWU6IHN0cmluZywgc2VydmljZVByb3ZpZGVyQ29uc3RydWN0b3I6IElTZXJ2aWNlUHJvdmlkZXJDbGFzcyk6IElNb2R1bGU7CisgICAgICAgIHByb3ZpZGVyKG5hbWU6IHN0cmluZywgaW5saW5lQW5ub3RhdGVkQ29uc3RydWN0b3I6IGFueVtdKTogSU1vZHVsZTsKKyAgICAgICAgcHJvdmlkZXIobmFtZTogc3RyaW5nLCBwcm92aWRlck9iamVjdDogSVNlcnZpY2VQcm92aWRlcik6IElNb2R1bGU7CisgICAgICAgIHByb3ZpZGVyKG9iamVjdDogT2JqZWN0KTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJ1biBibG9ja3MgYXJlIHRoZSBjbG9zZXN0IHRoaW5nIGluIEFuZ3VsYXIgdG8gdGhlIG1haW4gbWV0aG9kLiBBIHJ1biBibG9jayBpcyB0aGUgY29kZSB3aGljaCBuZWVkcyB0byBydW4gdG8ga2lja3N0YXJ0IHRoZSBhcHBsaWNhdGlvbi4gSXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgYWxsIG9mIHRoZSBzZXJ2aWNlIGhhdmUgYmVlbiBjb25maWd1cmVkIGFuZCB0aGUgaW5qZWN0b3IgaGFzIGJlZW4gY3JlYXRlZC4gUnVuIGJsb2NrcyB0eXBpY2FsbHkgY29udGFpbiBjb2RlIHdoaWNoIGlzIGhhcmQgdG8gdW5pdC10ZXN0LCBhbmQgZm9yIHRoaXMgcmVhc29uIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBpc29sYXRlZCBtb2R1bGVzLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGlnbm9yZWQgaW4gdGhlIHVuaXQtdGVzdHMuCisgICAgICAgICAqLworICAgICAgICBydW4oaW5pdGlhbGl6YXRpb25GdW5jdGlvbjogRnVuY3Rpb24pOiBJTW9kdWxlOworICAgICAgICAvKioKKyAgICAgICAgICogUnVuIGJsb2NrcyBhcmUgdGhlIGNsb3Nlc3QgdGhpbmcgaW4gQW5ndWxhciB0byB0aGUgbWFpbiBtZXRob2QuIEEgcnVuIGJsb2NrIGlzIHRoZSBjb2RlIHdoaWNoIG5lZWRzIHRvIHJ1biB0byBraWNrc3RhcnQgdGhlIGFwcGxpY2F0aW9uLiBJdCBpcyBleGVjdXRlZCBhZnRlciBhbGwgb2YgdGhlIHNlcnZpY2UgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgYW5kIHRoZSBpbmplY3RvciBoYXMgYmVlbiBjcmVhdGVkLiBSdW4gYmxvY2tzIHR5cGljYWxseSBjb250YWluIGNvZGUgd2hpY2ggaXMgaGFyZCB0byB1bml0LXRlc3QsIGFuZCBmb3IgdGhpcyByZWFzb24gc2hvdWxkIGJlIGRlY2xhcmVkIGluIGlzb2xhdGVkIG1vZHVsZXMsIHNvIHRoYXQgdGhleSBjYW4gYmUgaWdub3JlZCBpbiB0aGUgdW5pdC10ZXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHJ1bihpbmxpbmVBbm5vdGF0ZWRGdW5jdGlvbjogYW55W10pOiBJTW9kdWxlOworICAgICAgICBzZXJ2aWNlKG5hbWU6IHN0cmluZywgc2VydmljZUNvbnN0cnVjdG9yOiBGdW5jdGlvbik6IElNb2R1bGU7CisgICAgICAgIHNlcnZpY2UobmFtZTogc3RyaW5nLCBpbmxpbmVBbm5vdGF0ZWRDb25zdHJ1Y3RvcjogYW55W10pOiBJTW9kdWxlOworICAgICAgICBzZXJ2aWNlKG9iamVjdDogT2JqZWN0KTogSU1vZHVsZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGEgdmFsdWUgc2VydmljZSB3aXRoIHRoZSAkaW5qZWN0b3IsIHN1Y2ggYXMgYSBzdHJpbmcsIGEgbnVtYmVyLCBhbiBhcnJheSwgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24uIFRoaXMgaXMgc2hvcnQgZm9yIHJlZ2lzdGVyaW5nIGEgc2VydmljZSB3aGVyZSBpdHMgcHJvdmlkZXIncyAkZ2V0IHByb3BlcnR5IGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgdmFsdWUgc2VydmljZS4KKworICAgICAgICAgICBWYWx1ZSBzZXJ2aWNlcyBhcmUgc2ltaWxhciB0byBjb25zdGFudCBzZXJ2aWNlcywgZXhjZXB0IHRoYXQgdGhleSBjYW5ub3QgYmUgaW5qZWN0ZWQgaW50byBhIG1vZHVsZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIChzZWUgY29uZmlnKSBidXQgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhbiBBbmd1bGFyIGRlY29yYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgdmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogSU1vZHVsZTsKKyAgICAgICAgdmFsdWUob2JqZWN0OiBPYmplY3QpOiBJTW9kdWxlOworCisgICAgICAgIC8vIFByb3BlcnRpZXMKKyAgICAgICAgbmFtZTogc3RyaW5nOworICAgICAgICByZXF1aXJlczogc3RyaW5nW107CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQXR0cmlidXRlcworICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJQXR0cmlidXRlcyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiB0aGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgc2NvcGVkIGF0dHJpYnV0ZXMuIGl0J3Mgbm90IHZlcnkgZWxlZ2FudAorICAgICAgICAgKiBiZWNhdXNlIHlvdSBoYXZlIHRvIHVzZSBhdHRyc1snZm9vJ10gaW5zdGVhZCBvZiBhdHRycy5mb28gYnV0IEkgZG9uJ3Qga25vdyBvZiBhIGJldHRlciB3YXkKKyAgICAgICAgICogdGhpcyBzaG91bGQgcmVhbGx5IGJlIGxpbWl0ZWQgdG8gcmV0dXJuIHN0cmluZyBidXQgaXQgY3JlYXRlcyB0aGlzIHByb2JsZW06IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE3MjAxODU0LzE2NTY1NgorICAgICAgICAgKi8KKyAgICAgICAgW25hbWU6IHN0cmluZ106IGFueTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0aGUgQ1NTIGNsYXNzIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgY2xhc3NWYWwgcGFyYW1ldGVyIHRvIHRoZQorICAgICAgICAgKiBlbGVtZW50LiBJZiBhbmltYXRpb25zIGFyZSBlbmFibGVkIHRoZW4gYW4gYW5pbWF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkCisgICAgICAgICAqIGZvciB0aGUgY2xhc3MgYWRkaXRpb24uCisgICAgICAgICAqLworICAgICAgICAkYWRkQ2xhc3MoY2xhc3NWYWw6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgdGhlIENTUyBjbGFzcyB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGNsYXNzVmFsIHBhcmFtZXRlciBmcm9tIHRoZQorICAgICAgICAgKiBlbGVtZW50LiBJZiBhbmltYXRpb25zIGFyZSBlbmFibGVkIHRoZW4gYW4gYW5pbWF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIGZvcgorICAgICAgICAgKiB0aGUgY2xhc3MgcmVtb3ZhbC4KKyAgICAgICAgICovCisgICAgICAgICRyZW1vdmVDbGFzcyhjbGFzc1ZhbDogc3RyaW5nKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IERPTSBlbGVtZW50IGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgICRzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYnNlcnZlcyBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlLgorICAgICAgICAgKiBUaGUgb2JzZXJ2ZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIG9uY2UgZHVyaW5nIHRoZSBuZXh0ICRkaWdlc3QKKyAgICAgICAgICogZm9sbG93aW5nIGNvbXBpbGF0aW9uLiBUaGUgb2JzZXJ2ZXIgaXMgdGhlbiBpbnZva2VkIHdoZW5ldmVyIHRoZQorICAgICAgICAgKiBpbnRlcnBvbGF0ZWQgdmFsdWUgY2hhbmdlcy4KKyAgICAgICAgICovCisgICAgICAgICRvYnNlcnZlKG5hbWU6IHN0cmluZywgZm46ICh2YWx1ZT86IGFueSkgPT4gYW55KTogRnVuY3Rpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbWFwIG9mIERPTSBlbGVtZW50IGF0dHJpYnV0ZSBuYW1lcyB0byB0aGUgbm9ybWFsaXplZCBuYW1lLiBUaGlzIGlzIG5lZWRlZAorICAgICAgICAgKiB0byBkbyByZXZlcnNlIGxvb2t1cCBmcm9tIG5vcm1hbGl6ZWQgbmFtZSBiYWNrIHRvIGFjdHVhbCBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgJGF0dHI6IE9iamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmb3JtLkZvcm1Db250cm9sbGVyIC0gdHlwZSBpbiBtb2R1bGUgbmcKKyAgICAgKiBzZWUgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nL3R5cGUvZm9ybS5Gb3JtQ29udHJvbGxlcgorICAgICAqLworICAgIGludGVyZmFjZSBJRm9ybUNvbnRyb2xsZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRleGVyIHdoaWNoIHNob3VsZCByZXR1cm4gbmcuSU5nTW9kZWxDb250cm9sbGVyIGZvciBtb3N0IHByb3BlcnRpZXMgYnV0IGNhbm5vdCBiZWNhdXNlIG9mICJBbGwgbmFtZWQgcHJvcGVydGllcyBtdXN0IGJlIGFzc2lnbmFibGUgdG8gc3RyaW5nIGluZGV4ZXIgdHlwZSIgY29uc3RyYWludCAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzI3MgorICAgICAgICAgKi8KKyAgICAgICAgW25hbWU6IHN0cmluZ106IGFueTsKKworICAgICAgICAkcHJpc3RpbmU6IGJvb2xlYW47CisgICAgICAgICRkaXJ0eTogYm9vbGVhbjsKKyAgICAgICAgJHZhbGlkOiBib29sZWFuOworICAgICAgICAkaW52YWxpZDogYm9vbGVhbjsKKyAgICAgICAgJHN1Ym1pdHRlZDogYm9vbGVhbjsKKyAgICAgICAgJGVycm9yOiBhbnk7CisgICAgICAgICRhZGRDb250cm9sKGNvbnRyb2w6IElOZ01vZGVsQ29udHJvbGxlcik6IHZvaWQ7CisgICAgICAgICRyZW1vdmVDb250cm9sKGNvbnRyb2w6IElOZ01vZGVsQ29udHJvbGxlcik6IHZvaWQ7CisgICAgICAgICRzZXRWYWxpZGl0eSh2YWxpZGF0aW9uRXJyb3JLZXk6IHN0cmluZywgaXNWYWxpZDogYm9vbGVhbiwgY29udHJvbDogSU5nTW9kZWxDb250cm9sbGVyKTogdm9pZDsKKyAgICAgICAgJHNldERpcnR5KCk6IHZvaWQ7CisgICAgICAgICRzZXRQcmlzdGluZSgpOiB2b2lkOworICAgICAgICAkY29tbWl0Vmlld1ZhbHVlKCk6IHZvaWQ7CisgICAgICAgICRyb2xsYmFja1ZpZXdWYWx1ZSgpOiB2b2lkOworICAgICAgICAkc2V0U3VibWl0dGVkKCk6IHZvaWQ7CisgICAgICAgICRzZXRVbnRvdWNoZWQoKTogdm9pZDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBOZ01vZGVsQ29udHJvbGxlcgorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy5kaXJlY3RpdmU6bmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlcgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJTmdNb2RlbENvbnRyb2xsZXIgeworICAgICAgICAkcmVuZGVyKCk6IHZvaWQ7CisgICAgICAgICRzZXRWYWxpZGl0eSh2YWxpZGF0aW9uRXJyb3JLZXk6IHN0cmluZywgaXNWYWxpZDogYm9vbGVhbik6IHZvaWQ7CisgICAgICAgIC8vIERvY3VtZW50YXRpb24gc3RhdGVzIHZpZXdWYWx1ZSBhbmQgbW9kZWxWYWx1ZSB0byBiZSBhIHN0cmluZyBidXQgb3RoZXIKKyAgICAgICAgLy8gdHlwZXMgZG8gd29yayBhbmQgaXQncyBjb21tb24gdG8gdXNlIHRoZW0uCisgICAgICAgICRzZXRWaWV3VmFsdWUodmFsdWU6IGFueSwgdHJpZ2dlcj86IHN0cmluZyk6IHZvaWQ7CisgICAgICAgICRzZXRQcmlzdGluZSgpOiB2b2lkOworICAgICAgICAkdmFsaWRhdGUoKTogdm9pZDsKKyAgICAgICAgJHNldFRvdWNoZWQoKTogdm9pZDsKKyAgICAgICAgJHNldFVudG91Y2hlZCgpOiB2b2lkOworICAgICAgICAkcm9sbGJhY2tWaWV3VmFsdWUoKTogdm9pZDsKKyAgICAgICAgJGNvbW1pdFZpZXdWYWx1ZSgpOiB2b2lkOworICAgICAgICAkaXNFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbjsKKworICAgICAgICAkdmlld1ZhbHVlOiBhbnk7CisKKyAgICAgICAgJG1vZGVsVmFsdWU6IGFueTsKKworICAgICAgICAkcGFyc2VyczogSU1vZGVsUGFyc2VyW107CisgICAgICAgICRmb3JtYXR0ZXJzOiBJTW9kZWxGb3JtYXR0ZXJbXTsKKyAgICAgICAgJHZpZXdDaGFuZ2VMaXN0ZW5lcnM6IElNb2RlbFZpZXdDaGFuZ2VMaXN0ZW5lcltdOworICAgICAgICAkZXJyb3I6IGFueTsKKyAgICAgICAgJG5hbWU6IHN0cmluZzsKKworICAgICAgICAkdG91Y2hlZDogYm9vbGVhbjsKKyAgICAgICAgJHVudG91Y2hlZDogYm9vbGVhbjsKKworICAgICAgICAkdmFsaWRhdG9yczogSU1vZGVsVmFsaWRhdG9yczsKKyAgICAgICAgJGFzeW5jVmFsaWRhdG9yczogSUFzeW5jTW9kZWxWYWxpZGF0b3JzOworCisgICAgICAgICRwZW5kaW5nOiBhbnk7CisgICAgICAgICRwcmlzdGluZTogYm9vbGVhbjsKKyAgICAgICAgJGRpcnR5OiBib29sZWFuOworICAgICAgICAkdmFsaWQ6IGJvb2xlYW47CisgICAgICAgICRpbnZhbGlkOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBJTW9kZWxWYWxpZGF0b3JzIHsKKyAgICAgICAgW2luZGV4OiBzdHJpbmddOiAoLi4uYXJnczogYW55W10pID0+IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIElBc3luY01vZGVsVmFsaWRhdG9ycyB7CisgICAgICAgIFtpbmRleDogc3RyaW5nXTogKC4uLmFyZ3M6IGFueVtdKSA9PiBJUHJvbWlzZTxib29sZWFuPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSU1vZGVsUGFyc2VyIHsKKyAgICAgICAgKHZhbHVlOiBhbnkpOiBhbnk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElNb2RlbEZvcm1hdHRlciB7CisgICAgICAgICh2YWx1ZTogYW55KTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBJTW9kZWxWaWV3Q2hhbmdlTGlzdGVuZXIgeworICAgICAgICAoKTogdm9pZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAkcm9vdFNjb3BlIC0gJHJvb3RTY29wZVByb3ZpZGVyIC0gc2VydmljZSBpbiBtb2R1bGUgbmcKKyAgICAgKiBzZWUgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nL3R5cGUvJHJvb3RTY29wZS5TY29wZSBhbmQgaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nL3NlcnZpY2UvJHJvb3RTY29wZQorICAgICAqLworICAgIGludGVyZmFjZSBJUm9vdFNjb3BlU2VydmljZSB7CisgICAgICAgIFtpbmRleDogc3RyaW5nXTogYW55OworCisgICAgICAgICRhcHBseSgpOiBhbnk7CisgICAgICAgICRhcHBseShleHA6IHN0cmluZyk6IGFueTsKKyAgICAgICAgJGFwcGx5KGV4cDogKHNjb3BlOiBJU2NvcGUpID0+IGFueSk6IGFueTsKKworICAgICAgICAkYXBwbHlBc3luYygpOiBhbnk7CisgICAgICAgICRhcHBseUFzeW5jKGV4cDogc3RyaW5nKTogYW55OworICAgICAgICAkYXBwbHlBc3luYyhleHA6IChzY29wZTogSVNjb3BlKSA9PiBhbnkpOiBhbnk7CisKKyAgICAgICAgJGJyb2FkY2FzdChuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogSUFuZ3VsYXJFdmVudDsKKyAgICAgICAgJGRlc3Ryb3koKTogdm9pZDsKKyAgICAgICAgJGRpZ2VzdCgpOiB2b2lkOworICAgICAgICAkZW1pdChuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogSUFuZ3VsYXJFdmVudDsKKworICAgICAgICAkZXZhbCgpOiBhbnk7CisgICAgICAgICRldmFsKGV4cHJlc3Npb246IHN0cmluZywgbG9jYWxzPzogT2JqZWN0KTogYW55OworICAgICAgICAkZXZhbChleHByZXNzaW9uOiAoc2NvcGU6IElTY29wZSkgPT4gYW55LCBsb2NhbHM/OiBPYmplY3QpOiBhbnk7CisKKyAgICAgICAgJGV2YWxBc3luYygpOiB2b2lkOworICAgICAgICAkZXZhbEFzeW5jKGV4cHJlc3Npb246IHN0cmluZyk6IHZvaWQ7CisgICAgICAgICRldmFsQXN5bmMoZXhwcmVzc2lvbjogKHNjb3BlOiBJU2NvcGUpID0+IGFueSk6IHZvaWQ7CisKKyAgICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2UgYnkgdGhlIGltcGxlbWVudGF0aW9uIGNoZWNraW5nIHN0cmF0ZWd5CisgICAgICAgICRuZXcoaXNvbGF0ZT86IGJvb2xlYW4sIHBhcmVudD86IElTY29wZSk6IElTY29wZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTGlzdGVucyBvbiBldmVudHMgb2YgYSBnaXZlbiB0eXBlLiBTZWUgJGVtaXQgZm9yIGRpc2N1c3Npb24gb2YgZXZlbnQgbGlmZSBjeWNsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uIGZvcm1hdCBpczogZnVuY3Rpb24oZXZlbnQsIGFyZ3MuLi4pLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBFdmVudCBuYW1lIHRvIGxpc3RlbiBvbi4KKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgZW1pdHRlZC4KKyAgICAgICAgICovCisgICAgICAgICRvbihuYW1lOiBzdHJpbmcsIGxpc3RlbmVyOiAoZXZlbnQ6IElBbmd1bGFyRXZlbnQsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBGdW5jdGlvbjsKKworICAgICAgICAkd2F0Y2god2F0Y2hFeHByZXNzaW9uOiBzdHJpbmcsIGxpc3RlbmVyPzogc3RyaW5nLCBvYmplY3RFcXVhbGl0eT86IGJvb2xlYW4pOiBGdW5jdGlvbjsKKyAgICAgICAgJHdhdGNoKHdhdGNoRXhwcmVzc2lvbjogc3RyaW5nLCBsaXN0ZW5lcj86IChuZXdWYWx1ZTogYW55LCBvbGRWYWx1ZTogYW55LCBzY29wZTogSVNjb3BlKSA9PiBhbnksIG9iamVjdEVxdWFsaXR5PzogYm9vbGVhbik6IEZ1bmN0aW9uOworICAgICAgICAkd2F0Y2god2F0Y2hFeHByZXNzaW9uOiAoc2NvcGU6IElTY29wZSkgPT4gYW55LCBsaXN0ZW5lcj86IHN0cmluZywgb2JqZWN0RXF1YWxpdHk/OiBib29sZWFuKTogRnVuY3Rpb247CisgICAgICAgICR3YXRjaCh3YXRjaEV4cHJlc3Npb246IChzY29wZTogSVNjb3BlKSA9PiBhbnksIGxpc3RlbmVyPzogKG5ld1ZhbHVlOiBhbnksIG9sZFZhbHVlOiBhbnksIHNjb3BlOiBJU2NvcGUpID0+IGFueSwgb2JqZWN0RXF1YWxpdHk/OiBib29sZWFuKTogRnVuY3Rpb247CisKKyAgICAgICAgJHdhdGNoQ29sbGVjdGlvbih3YXRjaEV4cHJlc3Npb246IHN0cmluZywgbGlzdGVuZXI6IChuZXdWYWx1ZTogYW55LCBvbGRWYWx1ZTogYW55LCBzY29wZTogSVNjb3BlKSA9PiBhbnkpOiBGdW5jdGlvbjsKKyAgICAgICAgJHdhdGNoQ29sbGVjdGlvbih3YXRjaEV4cHJlc3Npb246IChzY29wZTogSVNjb3BlKSA9PiBhbnksIGxpc3RlbmVyOiAobmV3VmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSwgc2NvcGU6IElTY29wZSkgPT4gYW55KTogRnVuY3Rpb247CisKKyAgICAgICAgJHdhdGNoR3JvdXAod2F0Y2hFeHByZXNzaW9uczogYW55W10sIGxpc3RlbmVyOiAobmV3VmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSwgc2NvcGU6IElTY29wZSkgPT4gYW55KTogRnVuY3Rpb247CisgICAgICAgICR3YXRjaEdyb3VwKHdhdGNoRXhwcmVzc2lvbnM6IHsgKHNjb3BlOiBJU2NvcGUpOiBhbnkgfVtdLCBsaXN0ZW5lcjogKG5ld1ZhbHVlOiBhbnksIG9sZFZhbHVlOiBhbnksIHNjb3BlOiBJU2NvcGUpID0+IGFueSk6IEZ1bmN0aW9uOworCisgICAgICAgICRwYXJlbnQ6IElTY29wZTsKKyAgICAgICAgJHJvb3Q6IElSb290U2NvcGVTZXJ2aWNlOworICAgICAgICAkaWQ6IG51bWJlcjsKKworICAgICAgICAvLyBIaWRkZW4gbWVtYmVycworICAgICAgICAkJGlzb2xhdGVCaW5kaW5nczogYW55OworICAgICAgICAkJHBoYXNlOiBhbnk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElTY29wZSBleHRlbmRzIElSb290U2NvcGVTZXJ2aWNlIHsgfQorCisgICAgLyoqCisgICAgICogJHNjb3BlIGZvciBuZ1JlcGVhdCBkaXJlY3RpdmUuCisgICAgICogc2VlIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy9kaXJlY3RpdmUvbmdSZXBlYXQKKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgSVJlcGVhdFNjb3BlIGV4dGVuZHMgSVNjb3BlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogaXRlcmF0b3Igb2Zmc2V0IG9mIHRoZSByZXBlYXRlZCBlbGVtZW50ICgwLi5sZW5ndGgtMSkuCisgICAgICAgICAqLworICAgICAgICAkaW5kZXg6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBmaXJzdCBpbiB0aGUgaXRlcmF0b3IuCisgICAgICAgICAqLworICAgICAgICAkZmlyc3Q6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRydWUgaWYgdGhlIHJlcGVhdGVkIGVsZW1lbnQgaXMgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3QgaW4gdGhlIGl0ZXJhdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgJG1pZGRsZTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBsYXN0IGluIHRoZSBpdGVyYXRvci4KKyAgICAgICAgICovCisgICAgICAgICRsYXN0OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB0cnVlIGlmIHRoZSBpdGVyYXRvciBwb3NpdGlvbiAkaW5kZXggaXMgZXZlbiAob3RoZXJ3aXNlIGZhbHNlKS4KKyAgICAgICAgICovCisgICAgICAgICRldmVuOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB0cnVlIGlmIHRoZSBpdGVyYXRvciBwb3NpdGlvbiAkaW5kZXggaXMgb2RkIChvdGhlcndpc2UgZmFsc2UpLgorICAgICAgICAgKi8KKyAgICAgICAgJG9kZDogYm9vbGVhbjsKKworCX0KKworICAgIGludGVyZmFjZSBJQW5ndWxhckV2ZW50IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBzY29wZSBvbiB3aGljaCB0aGUgZXZlbnQgd2FzICRlbWl0LWVkIG9yICRicm9hZGNhc3QtZWQuCisgICAgICAgICAqLworICAgICAgICB0YXJnZXRTY29wZTogSVNjb3BlOworICAgICAgICAvKioKKyAgICAgICAgICogdGhlIHNjb3BlIHRoYXQgaXMgY3VycmVudGx5IGhhbmRsaW5nIHRoZSBldmVudC4gT25jZSB0aGUgZXZlbnQgcHJvcGFnYXRlcyB0aHJvdWdoIHRoZSBzY29wZSBoaWVyYXJjaHksIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIG51bGwuCisgICAgICAgICAqLworICAgICAgICBjdXJyZW50U2NvcGU6IElTY29wZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5hbWUgb2YgdGhlIGV2ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgbmFtZTogc3RyaW5nOworICAgICAgICAvKioKKyAgICAgICAgICogY2FsbGluZyBzdG9wUHJvcGFnYXRpb24gZnVuY3Rpb24gd2lsbCBjYW5jZWwgZnVydGhlciBldmVudCBwcm9wYWdhdGlvbiAoYXZhaWxhYmxlIG9ubHkgZm9yIGV2ZW50cyB0aGF0IHdlcmUgJGVtaXQtZWQpLgorICAgICAgICAgKi8KKyAgICAgICAgc3RvcFByb3BhZ2F0aW9uPzogRnVuY3Rpb247CisgICAgICAgIC8qKgorICAgICAgICAgKiBjYWxsaW5nIHByZXZlbnREZWZhdWx0IHNldHMgZGVmYXVsdFByZXZlbnRlZCBmbGFnIHRvIHRydWUuCisgICAgICAgICAqLworICAgICAgICBwcmV2ZW50RGVmYXVsdDogRnVuY3Rpb247CisgICAgICAgIC8qKgorICAgICAgICAgKiB0cnVlIGlmIHByZXZlbnREZWZhdWx0IHdhcyBjYWxsZWQuCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBib29sZWFuOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFdpbmRvd1NlcnZpY2UKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJHdpbmRvdworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJV2luZG93U2VydmljZSBleHRlbmRzIFdpbmRvdyB7CisgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBCcm93c2VyU2VydmljZQorICAgIC8vIFRPRE8gdW5kb2N1bWVudGVkLCBzbyB3ZSBuZWVkIHRvIGdldCBpdCBmcm9tIHRoZSBzb3VyY2UgY29kZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJQnJvd3NlclNlcnZpY2UgeworICAgICAgICBkZWZlcjogYW5ndWxhci5JVGltZW91dFNlcnZpY2U7CisgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUaW1lb3V0U2VydmljZQorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kdGltZW91dAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJVGltZW91dFNlcnZpY2UgeworICAgICAgICAoZnVuYzogRnVuY3Rpb24sIGRlbGF5PzogbnVtYmVyLCBpbnZva2VBcHBseT86IGJvb2xlYW4pOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBjYW5jZWwocHJvbWlzZTogSVByb21pc2U8YW55Pik6IGJvb2xlYW47CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW50ZXJ2YWxTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRpbnRlcnZhbAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJSW50ZXJ2YWxTZXJ2aWNlIHsKKyAgICAgICAgKGZ1bmM6IEZ1bmN0aW9uLCBkZWxheTogbnVtYmVyLCBjb3VudD86IG51bWJlciwgaW52b2tlQXBwbHk/OiBib29sZWFuKTogSVByb21pc2U8YW55PjsKKyAgICAgICAgY2FuY2VsKHByb21pc2U6IElQcm9taXNlPGFueT4pOiBib29sZWFuOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEFuZ3VsYXJQcm92aWRlcgorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy9wcm92aWRlci8kYW5pbWF0ZVByb3ZpZGVyCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElBbmltYXRlUHJvdmlkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVnaXN0ZXJzIGEgbmV3IGluamVjdGFibGUgYW5pbWF0aW9uIGZhY3RvcnkgZnVuY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhbmltYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB0byByZXR1cm4gdGhlIGFuaW1hdGlvbiBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICByZWdpc3RlcihuYW1lOiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IElBbmltYXRlQ2FsbGJhY2tPYmplY3QpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGFuZC9vciBzZXRzIHRoZSBDU1MgY2xhc3MgZXhwcmVzc2lvbiB0aGF0IGlzIGNoZWNrZWQgd2hlbiBwZXJmb3JtaW5nIGFuIGFuaW1hdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNsYXNzTmFtZSBleHByZXNzaW9uIHdoaWNoIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCBhbmltYXRpb25zLgorICAgICAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBDU1MgY2xhc3NOYW1lIGV4cHJlc3Npb24gdmFsdWUuIElmIG51bGwgdGhlbiB0aGVyZSBpcyBubyBleHByZXNzaW9uIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgY2xhc3NOYW1lRmlsdGVyKGV4cHJlc3Npb24/OiBSZWdFeHApOiBSZWdFeHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFuaW1hdGlvbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgY2FsbGJhY2sgZnVuY3Rpb25zIGZvciBlYWNoIGV2ZW50IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgYW5pbWF0ZWQuCisgICAgICovCisgICAgaW50ZXJmYWNlIElBbmltYXRlQ2FsbGJhY2tPYmplY3QgeworICAgICAgICBldmVudEZuKGVsZW1lbnQ6IE5vZGUsIGRvbmVGbjogKCkgPT4gdm9pZCk6IEZ1bmN0aW9uOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZpbHRlclNlcnZpY2UKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJGZpbHRlcgorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kZmlsdGVyUHJvdmlkZXIKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUZpbHRlclNlcnZpY2UgeworICAgICAgICAobmFtZTogc3RyaW5nKTogRnVuY3Rpb247CisgICAgfQorCisgICAgaW50ZXJmYWNlIElGaWx0ZXJQcm92aWRlciBleHRlbmRzIElTZXJ2aWNlUHJvdmlkZXIgeworICAgICAgICByZWdpc3RlcihuYW1lOiBzdHJpbmcsIGZpbHRlckZhY3Rvcnk6IEZ1bmN0aW9uKTogSVNlcnZpY2VQcm92aWRlcjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBMb2NhbGVTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRsb2NhbGUKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUxvY2FsZVNlcnZpY2UgeworICAgICAgICBpZDogc3RyaW5nOworCisgICAgICAgIC8vIFRoZXNlIGFyZSBub3QgZG9jdW1lbnRlZAorICAgICAgICAvLyBDaGVjayBhbmd1bGFyJ3MgaTE4biBmaWxlcyBmb3IgZXhlbXBsZXMKKyAgICAgICAgTlVNQkVSX0ZPUk1BVFM6IElMb2NhbGVOdW1iZXJGb3JtYXREZXNjcmlwdG9yOworICAgICAgICBEQVRFVElNRV9GT1JNQVRTOiBJTG9jYWxlRGF0ZVRpbWVGb3JtYXREZXNjcmlwdG9yOworICAgICAgICBwbHVyYWxDYXQ6IChudW06IGFueSkgPT4gc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBJTG9jYWxlTnVtYmVyRm9ybWF0RGVzY3JpcHRvciB7CisgICAgICAgIERFQ0lNQUxfU0VQOiBzdHJpbmc7CisgICAgICAgIEdST1VQX1NFUDogc3RyaW5nOworICAgICAgICBQQVRURVJOUzogSUxvY2FsZU51bWJlclBhdHRlcm5EZXNjcmlwdG9yW107CisgICAgICAgIENVUlJFTkNZX1NZTTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBJTG9jYWxlTnVtYmVyUGF0dGVybkRlc2NyaXB0b3IgeworICAgICAgICBtaW5JbnQ6IG51bWJlcjsKKyAgICAgICAgbWluRnJhYzogbnVtYmVyOworICAgICAgICBtYXhGcmFjOiBudW1iZXI7CisgICAgICAgIHBvc1ByZTogc3RyaW5nOworICAgICAgICBwb3NTdWY6IHN0cmluZzsKKyAgICAgICAgbmVnUHJlOiBzdHJpbmc7CisgICAgICAgIG5lZ1N1Zjogc3RyaW5nOworICAgICAgICBnU2l6ZTogbnVtYmVyOworICAgICAgICBsZ1NpemU6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUxvY2FsZURhdGVUaW1lRm9ybWF0RGVzY3JpcHRvciB7CisgICAgICAgIE1PTlRIOiBzdHJpbmdbXTsKKyAgICAgICAgU0hPUlRNT05USDogc3RyaW5nW107CisgICAgICAgIERBWTogc3RyaW5nW107CisgICAgICAgIFNIT1JUREFZOiBzdHJpbmdbXTsKKyAgICAgICAgQU1QTVM6IHN0cmluZ1tdOworICAgICAgICBtZWRpdW06IHN0cmluZzsKKyAgICAgICAgc2hvcnQ6IHN0cmluZzsKKyAgICAgICAgZnVsbERhdGU6IHN0cmluZzsKKyAgICAgICAgbG9uZ0RhdGU6IHN0cmluZzsKKyAgICAgICAgbWVkaXVtRGF0ZTogc3RyaW5nOworICAgICAgICBzaG9ydERhdGU6IHN0cmluZzsKKyAgICAgICAgbWVkaXVtVGltZTogc3RyaW5nOworICAgICAgICBzaG9ydFRpbWU6IHN0cmluZzsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBMb2dTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRsb2cKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJGxvZ1Byb3ZpZGVyCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElMb2dTZXJ2aWNlIHsKKyAgICAgICAgZGVidWc6IElMb2dDYWxsOworICAgICAgICBlcnJvcjogSUxvZ0NhbGw7CisgICAgICAgIGluZm86IElMb2dDYWxsOworICAgICAgICBsb2c6IElMb2dDYWxsOworICAgICAgICB3YXJuOiBJTG9nQ2FsbDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUxvZ1Byb3ZpZGVyIHsKKyAgICAgICAgZGVidWdFbmFibGVkKCk6IGJvb2xlYW47CisgICAgICAgIGRlYnVnRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogSUxvZ1Byb3ZpZGVyOworICAgIH0KKworICAgIC8vIFdlIGRlZmluZSB0aGlzIGFzIHNlcGFyYXRlIGludGVyZmFjZSBzbyB3ZSBjYW4gcmVvcGVuIGl0IGxhdGVyIGZvcgorICAgIC8vIHRoZSBuZ01vY2sgbW9kdWxlLgorICAgIGludGVyZmFjZSBJTG9nQ2FsbCB7CisgICAgICAgICguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gUGFyc2VTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRwYXJzZQorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kcGFyc2VQcm92aWRlcgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJUGFyc2VTZXJ2aWNlIHsKKyAgICAgICAgKGV4cHJlc3Npb246IHN0cmluZyk6IElDb21waWxlZEV4cHJlc3Npb247CisgICAgfQorCisgICAgaW50ZXJmYWNlIElQYXJzZVByb3ZpZGVyIHsKKyAgICAgICAgbG9nUHJvbWlzZVdhcm5pbmdzKCk6IGJvb2xlYW47CisgICAgICAgIGxvZ1Byb21pc2VXYXJuaW5ncyh2YWx1ZTogYm9vbGVhbik6IElQYXJzZVByb3ZpZGVyOworCisgICAgICAgIHVud3JhcFByb21pc2VzKCk6IGJvb2xlYW47CisgICAgICAgIHVud3JhcFByb21pc2VzKHZhbHVlOiBib29sZWFuKTogSVBhcnNlUHJvdmlkZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElDb21waWxlZEV4cHJlc3Npb24geworICAgICAgICAoY29udGV4dDogYW55LCBsb2NhbHM/OiBhbnkpOiBhbnk7CisKKyAgICAgICAgLy8gSWYgdmFsdWUgaXMgbm90IHByb3ZpZGVkLCB1bmRlZmluZWQgaXMgZ29ubmEgYmUgdXNlZCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gZG9lcyBub3QgY2hlY2sgdGhlIHBhcmFtZXRlci4gTGV0J3MgZm9yY2UgYSB2YWx1ZSBmb3IgY29uc2lzdGVuY3kuIElmIGNvbnN1bWVyCisgICAgICAgIC8vIHdoYW50cyB0byB1bmRlZmluZSBpdCwgcGFzcyB0aGUgdW5kZWZpbmVkIHZhbHVlIGV4cGxpY2l0bHkuCisgICAgICAgIGFzc2lnbihjb250ZXh0OiBhbnksIHZhbHVlOiBhbnkpOiBhbnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogJGxvY2F0aW9uIC0gJGxvY2F0aW9uUHJvdmlkZXIgLSBzZXJ2aWNlIGluIG1vZHVsZSBuZworICAgICAqIHNlZSBodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcvc2VydmljZS8kbG9jYXRpb24KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgSUxvY2F0aW9uU2VydmljZSB7CisgICAgICAgIGFic1VybCgpOiBzdHJpbmc7CisgICAgICAgIGhhc2goKTogc3RyaW5nOworICAgICAgICBoYXNoKG5ld0hhc2g6IHN0cmluZyk6IElMb2NhdGlvblNlcnZpY2U7CisgICAgICAgIGhvc3QoKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gcGF0aCBvZiBjdXJyZW50IHVybAorICAgICAgICAgKi8KKyAgICAgICAgcGF0aCgpOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoYW5nZSBwYXRoIHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gJGxvY2F0aW9uLgorICAgICAgICAgKiBOb3RlOiBQYXRoIHNob3VsZCBhbHdheXMgYmVnaW4gd2l0aCBmb3J3YXJkIHNsYXNoICgvKSwgdGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIGZvcndhcmQgc2xhc2ggaWYgaXQgaXMgbWlzc2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhdGggTmV3IHBhdGgKKyAgICAgICAgICovCisgICAgICAgIHBhdGgocGF0aDogc3RyaW5nKTogSUxvY2F0aW9uU2VydmljZTsKKworICAgICAgICBwb3J0KCk6IG51bWJlcjsKKyAgICAgICAgcHJvdG9jb2woKTogc3RyaW5nOworICAgICAgICByZXBsYWNlKCk6IElMb2NhdGlvblNlcnZpY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBzZWFyY2ggcGFydCAoYXMgb2JqZWN0KSBvZiBjdXJyZW50IHVybAorICAgICAgICAgKi8KKyAgICAgICAgc2VhcmNoKCk6IGFueTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hhbmdlIHNlYXJjaCBwYXJ0IHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gJGxvY2F0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VhcmNoIFdoZW4gY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgdGhlIG1ldGhvZCBhY3RzIGFzIGEgc2V0dGVyLCBzZXR0aW5nIHRoZSBzZWFyY2ggY29tcG9uZW50IG9mICRsb2NhdGlvbiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBoYXNoIG9iamVjdCBjb250YWluaW5nIGFuIGFycmF5IG9mIHZhbHVlcywgdGhlc2UgdmFsdWVzIHdpbGwgYmUgZW5jb2RlZCBhcyBkdXBsaWNhdGUgc2VhcmNoIHBhcmFtZXRlcnMgaW4gdGhlIHVybC4KKyAgICAgICAgICovCisgICAgICAgIHNlYXJjaChzZWFyY2g6IGFueSk6IElMb2NhdGlvblNlcnZpY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoYW5nZSBzZWFyY2ggcGFydCB3aGVuIGNhbGxlZCB3aXRoIHBhcmFtZXRlciBhbmQgcmV0dXJuICRsb2NhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlYXJjaCBOZXcgc2VhcmNoIHBhcmFtcworICAgICAgICAgKiBAcGFyYW0gcGFyYW1WYWx1ZSBJZiBzZWFyY2ggaXMgYSBzdHJpbmcgb3IgYSBOdW1iZXIsIHRoZW4gcGFyYW1WYWx1ZSB3aWxsIG92ZXJyaWRlIG9ubHkgYSBzaW5nbGUgc2VhcmNoIHByb3BlcnR5LiBJZiBwYXJhbVZhbHVlIGlzIG51bGwsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGRlbGV0ZWQuIElmIHBhcmFtVmFsdWUgaXMgYW4gYXJyYXksIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHByb3BlcnR5IG9mIHRoZSBzZWFyY2ggY29tcG9uZW50IG9mICRsb2NhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudC4gSWYgcGFyYW1WYWx1ZSBpcyB0cnVlLCB0aGUgcHJvcGVydHkgc3BlY2lmaWVkIHZpYSB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBhZGRlZCB3aXRoIG5vIHZhbHVlIG5vciB0cmFpbGluZyBlcXVhbCBzaWduLgorICAgICAgICAgKi8KKyAgICAgICAgc2VhcmNoKHNlYXJjaDogc3RyaW5nLCBwYXJhbVZhbHVlOiBzdHJpbmd8bnVtYmVyfHN0cmluZ1tdfGJvb2xlYW4pOiBJTG9jYXRpb25TZXJ2aWNlOworCisgICAgICAgIHN0YXRlKCk6IGFueTsKKyAgICAgICAgc3RhdGUoc3RhdGU6IGFueSk6IElMb2NhdGlvblNlcnZpY2U7CisgICAgICAgIHVybCgpOiBzdHJpbmc7CisgICAgICAgIHVybCh1cmw6IHN0cmluZyk6IElMb2NhdGlvblNlcnZpY2U7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElMb2NhdGlvblByb3ZpZGVyIGV4dGVuZHMgSVNlcnZpY2VQcm92aWRlciB7CisgICAgICAgIGhhc2hQcmVmaXgoKTogc3RyaW5nOworICAgICAgICBoYXNoUHJlZml4KHByZWZpeDogc3RyaW5nKTogSUxvY2F0aW9uUHJvdmlkZXI7CisgICAgICAgIGh0bWw1TW9kZSgpOiBib29sZWFuOworCisgICAgICAgIC8vIERvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgcGFyYW1ldGVyIGlzIHN0cmluZywgYnV0CisgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIHRlc3RzIGl0IGFzIGJvb2xlYW4sIHdoaWNoIG1ha2VzIG1vcmUgc2Vuc2UKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhIHRvZ2dsZXIKKyAgICAgICAgaHRtbDVNb2RlKGFjdGl2ZTogYm9vbGVhbik6IElMb2NhdGlvblByb3ZpZGVyOworICAgICAgICBodG1sNU1vZGUobW9kZTogeyBlbmFibGVkPzogYm9vbGVhbjsgcmVxdWlyZUJhc2U/OiBib29sZWFuOyByZXdyaXRlTGlua3M/OiBib29sZWFuOyB9KTogSUxvY2F0aW9uUHJvdmlkZXI7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRG9jdW1lbnRTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRkb2N1bWVudAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJRG9jdW1lbnRTZXJ2aWNlIGV4dGVuZHMgSUF1Z21lbnRlZEpRdWVyeSB7fQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRXhjZXB0aW9uSGFuZGxlclNlcnZpY2UKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJGV4Y2VwdGlvbkhhbmRsZXIKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUV4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlIHsKKyAgICAgICAgKGV4Y2VwdGlvbjogRXJyb3IsIGNhdXNlPzogc3RyaW5nKTogdm9pZDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBSb290RWxlbWVudFNlcnZpY2UKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJHJvb3RFbGVtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElSb290RWxlbWVudFNlcnZpY2UgZXh0ZW5kcyBKUXVlcnkge30KKworICAgIGludGVyZmFjZSBJUVJlc29sdmVSZWplY3Q8VD4geworICAgICAgICAoKTogdm9pZDsKKyAgICAgICAgKHZhbHVlOiBUKTogdm9pZDsKKyAgICB9CisgICAgLyoqCisgICAgICogJHEgLSBzZXJ2aWNlIGluIG1vZHVsZSBuZworICAgICAqIEEgcHJvbWlzZS9kZWZlcnJlZCBpbXBsZW1lbnRhdGlvbiBpbnNwaXJlZCBieSBLcmlzIEtvd2FsJ3MgUS4KKyAgICAgKiBTZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcvc2VydmljZS8kcQorICAgICAqLworICAgIGludGVyZmFjZSBJUVNlcnZpY2UgeworICAgICAgICBuZXcgKHJlc29sdmVyOiAocmVzb2x2ZTogSVFSZXNvbHZlUmVqZWN0PGFueT4pID0+IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIG5ldyAocmVzb2x2ZXI6IChyZXNvbHZlOiBJUVJlc29sdmVSZWplY3Q8YW55PiwgcmVqZWN0OiBJUVJlc29sdmVSZWplY3Q8YW55PikgPT4gYW55KTogSVByb21pc2U8YW55PjsKKyAgICAgICAgbmV3IDxUPihyZXNvbHZlcjogKHJlc29sdmU6IElRUmVzb2x2ZVJlamVjdDxUPiwgcmVqZWN0OiBJUVJlc29sdmVSZWplY3Q8YW55PikgPT4gYW55KTogSVByb21pc2U8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbWJpbmVzIG11bHRpcGxlIHByb21pc2VzIGludG8gYSBzaW5nbGUgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIG9mIHRoZSBpbnB1dCBwcm9taXNlcyBhcmUgcmVzb2x2ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgYSBzaW5nbGUgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhbiBhcnJheSBvZiB2YWx1ZXMsIGVhY2ggdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvbWlzZSBhdCB0aGUgc2FtZSBpbmRleCBpbiB0aGUgcHJvbWlzZXMgYXJyYXkuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgaXMgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbiwgdGhpcyByZXN1bHRpbmcgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWUgcmVqZWN0aW9uIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvbWlzZXMgQW4gYXJyYXkgb2YgcHJvbWlzZXMuCisgICAgICAgICAqLworICAgICAgICBhbGwocHJvbWlzZXM6IElQcm9taXNlPGFueT5bXSk6IElQcm9taXNlPGFueVtdPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbWJpbmVzIG11bHRpcGxlIHByb21pc2VzIGludG8gYSBzaW5nbGUgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIG9mIHRoZSBpbnB1dCBwcm9taXNlcyBhcmUgcmVzb2x2ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgYSBzaW5nbGUgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCBhIGhhc2ggb2YgdmFsdWVzLCBlYWNoIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb21pc2UgYXQgdGhlIHNhbWUga2V5IGluIHRoZSBwcm9taXNlcyBoYXNoLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIGlzIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24sIHRoaXMgcmVzdWx0aW5nIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lIHJlamVjdGlvbiB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb21pc2VzIEEgaGFzaCBvZiBwcm9taXNlcy4KKyAgICAgICAgICovCisgICAgICAgIGFsbChwcm9taXNlczogeyBbaWQ6IHN0cmluZ106IElQcm9taXNlPGFueT47IH0pOiBJUHJvbWlzZTx7IFtpZDogc3RyaW5nXTogYW55OyB9PjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBEZWZlcnJlZCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhIHRhc2sgd2hpY2ggd2lsbCBmaW5pc2ggaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICovCisgICAgICAgIGRlZmVyPFQ+KCk6IElEZWZlcnJlZDxUPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgYXMgcmVqZWN0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlYXNvbi4gVGhpcyBhcGkgc2hvdWxkIGJlIHVzZWQgdG8gZm9yd2FyZCByZWplY3Rpb24gaW4gYSBjaGFpbiBvZiBwcm9taXNlcy4gSWYgeW91IGFyZSBkZWFsaW5nIHdpdGggdGhlIGxhc3QgcHJvbWlzZSBpbiBhIHByb21pc2UgY2hhaW4sIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0LgorICAgICAgICAgKgorICAgICAgICAgKiBXaGVuIGNvbXBhcmluZyBkZWZlcnJlZHMvcHJvbWlzZXMgdG8gdGhlIGZhbWlsaWFyIGJlaGF2aW9yIG9mIHRyeS9jYXRjaC90aHJvdywgdGhpbmsgb2YgcmVqZWN0IGFzIHRoZSB0aHJvdyBrZXl3b3JkIGluIEphdmFTY3JpcHQuIFRoaXMgYWxzbyBtZWFucyB0aGF0IGlmIHlvdSAiY2F0Y2giIGFuIGVycm9yIHZpYSBhIHByb21pc2UgZXJyb3IgY2FsbGJhY2sgYW5kIHlvdSB3YW50IHRvIGZvcndhcmQgdGhlIGVycm9yIHRvIHRoZSBwcm9taXNlIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCBwcm9taXNlLCB5b3UgaGF2ZSB0byAicmV0aHJvdyIgdGhlIGVycm9yIGJ5IHJldHVybmluZyBhIHJlamVjdGlvbiBjb25zdHJ1Y3RlZCB2aWEgcmVqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVhc29uIENvbnN0YW50LCBtZXNzYWdlLCBleGNlcHRpb24gb3IgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVqZWN0aW9uIHJlYXNvbi4KKyAgICAgICAgICovCisgICAgICAgIHJlamVjdChyZWFzb24/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICAvKioKKyAgICAgICAgICogV3JhcHMgYW4gb2JqZWN0IHRoYXQgbWlnaHQgYmUgYSB2YWx1ZSBvciBhICgzcmQgcGFydHkpIHRoZW4tYWJsZSBwcm9taXNlIGludG8gYSAkcSBwcm9taXNlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBhcmUgZGVhbGluZyB3aXRoIGFuIG9iamVjdCB0aGF0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBhIHByb21pc2UsIG9yIGlmIHRoZSBwcm9taXNlIGNvbWVzIGZyb20gYSBzb3VyY2UgdGhhdCBjYW4ndCBiZSB0cnVzdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb3IgYSBwcm9taXNlCisgICAgICAgICAqLworICAgICAgICB3aGVuPFQ+KHZhbHVlOiBJUHJvbWlzZTxUPnxUKTogSVByb21pc2U8VD47CisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwcyBhbiBvYmplY3QgdGhhdCBtaWdodCBiZSBhIHZhbHVlIG9yIGEgKDNyZCBwYXJ0eSkgdGhlbi1hYmxlIHByb21pc2UgaW50byBhICRxIHByb21pc2UuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggYW4gb2JqZWN0IHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlIGEgcHJvbWlzZSwgb3IgaWYgdGhlIHByb21pc2UgY29tZXMgZnJvbSBhIHNvdXJjZSB0aGF0IGNhbid0IGJlIHRydXN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvciBhIHByb21pc2UKKyAgICAgICAgICovCisgICAgICAgIHdoZW4oKTogSVByb21pc2U8dm9pZD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIElQcm9taXNlPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcHJvbWlzZSB3YXMgb3Igd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCwgdGhlbiBjYWxscyBvbmUgb2YgdGhlIHN1Y2Nlc3Mgb3IgZXJyb3IgY2FsbGJhY2tzIGFzeW5jaHJvbm91c2x5IGFzIHNvb24gYXMgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUuIFRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50OiB0aGUgcmVzdWx0IG9yIHJlamVjdGlvbiByZWFzb24uIEFkZGl0aW9uYWxseSwgdGhlIG5vdGlmeSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIHplcm8gb3IgbW9yZSB0aW1lcyB0byBwcm92aWRlIGEgcHJvZ3Jlc3MgaW5kaWNhdGlvbiwgYmVmb3JlIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIG9yIHJlamVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IHByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjay4gSXQgYWxzbyBub3RpZmllcyB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbm90aWZ5Q2FsbGJhY2sgbWV0aG9kLiBUaGUgcHJvbWlzZSBjYW4gbm90IGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIGZyb20gdGhlIG5vdGlmeUNhbGxiYWNrIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHRoZW48VFJlc3VsdD4oc3VjY2Vzc0NhbGxiYWNrOiAocHJvbWlzZVZhbHVlOiBUKSA9PiBJSHR0cFByb21pc2U8VFJlc3VsdD58SVByb21pc2U8VFJlc3VsdD58VFJlc3VsdCwgZXJyb3JDYWxsYmFjaz86IChyZWFzb246IGFueSkgPT4gYW55LCBub3RpZnlDYWxsYmFjaz86IChzdGF0ZTogYW55KSA9PiBhbnkpOiBJUHJvbWlzZTxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2hvcnRoYW5kIGZvciBwcm9taXNlLnRoZW4obnVsbCwgZXJyb3JDYWxsYmFjaykKKyAgICAgICAgICovCisgICAgICAgIGNhdGNoPFRSZXN1bHQ+KG9uUmVqZWN0ZWQ6IChyZWFzb246IGFueSkgPT4gSUh0dHBQcm9taXNlPFRSZXN1bHQ+fElQcm9taXNlPFRSZXN1bHQ+fFRSZXN1bHQpOiBJUHJvbWlzZTxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWxsb3dzIHlvdSB0byBvYnNlcnZlIGVpdGhlciB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIGEgcHJvbWlzZSwgYnV0IHRvIGRvIHNvIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBmaW5hbCB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgdG8gcmVsZWFzZSByZXNvdXJjZXMgb3IgZG8gc29tZSBjbGVhbi11cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgd2hldGhlciB0aGUgcHJvbWlzZSB3YXMgcmVqZWN0ZWQgb3IgcmVzb2x2ZWQuIFNlZSB0aGUgZnVsbCBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBCZWNhdXNlIGZpbmFsbHkgaXMgYSByZXNlcnZlZCB3b3JkIGluIEphdmFTY3JpcHQgYW5kIHJlc2VydmVkIGtleXdvcmRzIGFyZSBub3Qgc3VwcG9ydGVkIGFzIHByb3BlcnR5IG5hbWVzIGJ5IEVTMywgeW91J2xsIG5lZWQgdG8gaW52b2tlIHRoZSBtZXRob2QgbGlrZSBwcm9taXNlWydmaW5hbGx5J10oY2FsbGJhY2spIHRvIG1ha2UgeW91ciBjb2RlIElFOCBhbmQgQW5kcm9pZCAyLnggY29tcGF0aWJsZS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsbHk8VFJlc3VsdD4oZmluYWxseUNhbGxiYWNrOiAoKSA9PiBhbnkpOiBJUHJvbWlzZTxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSURlZmVycmVkPFQ+IHsKKyAgICAgICAgcmVzb2x2ZSh2YWx1ZT86IFQpOiB2b2lkOworICAgICAgICByZWplY3QocmVhc29uPzogYW55KTogdm9pZDsKKyAgICAgICAgbm90aWZ5KHN0YXRlPzogYW55KTogdm9pZDsKKyAgICAgICAgcHJvbWlzZTogSVByb21pc2U8VD47CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQW5jaG9yU2Nyb2xsU2VydmljZQorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kYW5jaG9yU2Nyb2xsCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElBbmNob3JTY3JvbGxTZXJ2aWNlIHsKKyAgICAgICAgKCk6IHZvaWQ7CisgICAgICAgIHlPZmZzZXQ6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUFuY2hvclNjcm9sbFByb3ZpZGVyIGV4dGVuZHMgSVNlcnZpY2VQcm92aWRlciB7CisgICAgICAgIGRpc2FibGVBdXRvU2Nyb2xsaW5nKCk6IHZvaWQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2FjaGVGYWN0b3J5U2VydmljZQorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kY2FjaGVGYWN0b3J5CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElDYWNoZUZhY3RvcnlTZXJ2aWNlIHsKKyAgICAgICAgLy8gTGV0cyBub3QgZm9jZSB0aGUgb3B0aW9uc01hcCB0byBoYXZlIHRoZSBjYXBhY2l0eSBtZW1iZXIuIEV2ZW4gdGhvdWdoCisgICAgICAgIC8vIGl0J3MgdGhlIE9OTFkgb3B0aW9uIGNvbnNpZGVyZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvZGF5LCBhIGNvbnN1bWVyCisgICAgICAgIC8vIG1pZ2h0IGZpbmQgaXQgdXNlZnVsIHRvIGFzc29jaWF0ZSBzb21lIG90aGVyIG9wdGlvbnMgdG8gdGhlIGNhY2hlIG9iamVjdC4KKyAgICAgICAgLy8oY2FjaGVJZDogc3RyaW5nLCBvcHRpb25zTWFwPzogeyBjYXBhY2l0eTogbnVtYmVyOyB9KTogQ2FjaGVPYmplY3Q7CisgICAgICAgIChjYWNoZUlkOiBzdHJpbmcsIG9wdGlvbnNNYXA/OiB7IGNhcGFjaXR5OiBudW1iZXI7IH0pOiBJQ2FjaGVPYmplY3Q7CisKKyAgICAgICAgLy8gTWV0aG9kcyBiZWxsb3cgYXJlIG5vdCBkb2N1bWVudGVkCisgICAgICAgIGluZm8oKTogYW55OworICAgICAgICBnZXQoY2FjaGVJZDogc3RyaW5nKTogSUNhY2hlT2JqZWN0OworICAgIH0KKworICAgIGludGVyZmFjZSBJQ2FjaGVPYmplY3QgeworICAgICAgICBpbmZvKCk6IHsKKyAgICAgICAgICAgIGlkOiBzdHJpbmc7CisgICAgICAgICAgICBzaXplOiBudW1iZXI7CisKKyAgICAgICAgICAgIC8vIE5vdCBnYXJhbnRlZWQgdG8gaGF2ZSwgc2luY2UgaXQncyBhIG5vbi1tYW5kYXRvcnkgb3B0aW9uCisgICAgICAgICAgICAvL2NhcGFjaXR5OiBudW1iZXI7CisgICAgICAgIH07CisgICAgICAgIHB1dDxUPihrZXk6IHN0cmluZywgdmFsdWU/OiBUKTogVDsKKyAgICAgICAgZ2V0KGtleTogc3RyaW5nKTogYW55OworICAgICAgICByZW1vdmUoa2V5OiBzdHJpbmcpOiB2b2lkOworICAgICAgICByZW1vdmVBbGwoKTogdm9pZDsKKyAgICAgICAgZGVzdHJveSgpOiB2b2lkOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbXBpbGVTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRjb21waWxlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRjb21waWxlUHJvdmlkZXIKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUNvbXBpbGVTZXJ2aWNlIHsKKyAgICAgICAgKGVsZW1lbnQ6IHN0cmluZywgdHJhbnNjbHVkZT86IElUcmFuc2NsdWRlRnVuY3Rpb24sIG1heFByaW9yaXR5PzogbnVtYmVyKTogSVRlbXBsYXRlTGlua2luZ0Z1bmN0aW9uOworICAgICAgICAoZWxlbWVudDogRWxlbWVudCwgdHJhbnNjbHVkZT86IElUcmFuc2NsdWRlRnVuY3Rpb24sIG1heFByaW9yaXR5PzogbnVtYmVyKTogSVRlbXBsYXRlTGlua2luZ0Z1bmN0aW9uOworICAgICAgICAoZWxlbWVudDogSlF1ZXJ5LCB0cmFuc2NsdWRlPzogSVRyYW5zY2x1ZGVGdW5jdGlvbiwgbWF4UHJpb3JpdHk/OiBudW1iZXIpOiBJVGVtcGxhdGVMaW5raW5nRnVuY3Rpb247CisgICAgfQorCisgICAgaW50ZXJmYWNlIElDb21waWxlUHJvdmlkZXIgZXh0ZW5kcyBJU2VydmljZVByb3ZpZGVyIHsKKyAgICAgICAgZGlyZWN0aXZlKG5hbWU6IHN0cmluZywgZGlyZWN0aXZlRmFjdG9yeTogRnVuY3Rpb24pOiBJQ29tcGlsZVByb3ZpZGVyOworCisgICAgICAgIC8vIFVuZG9jdW1lbnRlZCwgYnV0IGl0IGlzIHRoZXJlLi4uCisgICAgICAgIGRpcmVjdGl2ZShkaXJlY3RpdmVzTWFwOiBhbnkpOiBJQ29tcGlsZVByb3ZpZGVyOworCisgICAgICAgIGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0KCk6IFJlZ0V4cDsKKyAgICAgICAgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QocmVnZXhwOiBSZWdFeHApOiBJQ29tcGlsZVByb3ZpZGVyOworCisgICAgICAgIGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCgpOiBSZWdFeHA7CisgICAgICAgIGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdChyZWdleHA6IFJlZ0V4cCk6IElDb21waWxlUHJvdmlkZXI7CisKKyAgICAgICAgZGVidWdJbmZvRW5hYmxlZChlbmFibGVkPzogYm9vbGVhbik6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUNsb25lQXR0YWNoRnVuY3Rpb24geworICAgICAgICAvLyBMZXQncyBoaW50IGJ1dCBub3QgZm9yY2UgY2xvbmVBdHRhY2hGbidzIHNpZ25hdHVyZQorICAgICAgICAoY2xvbmVkRWxlbWVudD86IEpRdWVyeSwgc2NvcGU/OiBJU2NvcGUpOiBhbnk7CisgICAgfQorCisgICAgLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgInB1YmxpY0xpbmtGbiIgcmV0dXJuZWQgYnkgJGNvbXBpbGUuCisgICAgaW50ZXJmYWNlIElUZW1wbGF0ZUxpbmtpbmdGdW5jdGlvbiB7CisgICAgICAgIChzY29wZTogSVNjb3BlLCBjbG9uZUF0dGFjaEZuPzogSUNsb25lQXR0YWNoRnVuY3Rpb24pOiBJQXVnbWVudGVkSlF1ZXJ5OworICAgIH0KKworICAgIC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gJHRyYW5zY2x1ZGUgKGFuZCBhbHNvIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIHBhc3NlZCB0byBsaW5rKS4KKyAgICBpbnRlcmZhY2UgSVRyYW5zY2x1ZGVGdW5jdGlvbiB7CisgICAgICAgIC8vIElmIHRoZSBzY29wZSBpcyBwcm92aWRlZCwgdGhlbiB0aGUgY2xvbmVBdHRhY2hGbiBtdXN0IGJlIGFzIHdlbGwuCisgICAgICAgIChzY29wZTogSVNjb3BlLCBjbG9uZUF0dGFjaEZuOiBJQ2xvbmVBdHRhY2hGdW5jdGlvbik6IElBdWdtZW50ZWRKUXVlcnk7CisgICAgICAgIC8vIElmIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgdGhlbiBpdCdzIGFzc3VtZWQgdG8gYmUgdGhlIGNsb25lQXR0YWNoRm4uCisgICAgICAgIChjbG9uZUF0dGFjaEZuPzogSUNsb25lQXR0YWNoRnVuY3Rpb24pOiBJQXVnbWVudGVkSlF1ZXJ5OworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbnRyb2xsZXJTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRjb250cm9sbGVyCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRjb250cm9sbGVyUHJvdmlkZXIKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUNvbnRyb2xsZXJTZXJ2aWNlIHsKKyAgICAgICAgLy8gQWx0aG91Z2ggdGhlIGRvY3VtZW50YXRpb24gZG9lc24ndCBzdGF0ZSB0aGlzLCBsb2NhbHMgYXJlIG9wdGlvbmFsCisgICAgICAgIChjb250cm9sbGVyQ29uc3RydWN0b3I6IEZ1bmN0aW9uLCBsb2NhbHM/OiBhbnkpOiBhbnk7CisgICAgICAgIChjb250cm9sbGVyTmFtZTogc3RyaW5nLCBsb2NhbHM/OiBhbnkpOiBhbnk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElDb250cm9sbGVyUHJvdmlkZXIgZXh0ZW5kcyBJU2VydmljZVByb3ZpZGVyIHsKKyAgICAgICAgcmVnaXN0ZXIobmFtZTogc3RyaW5nLCBjb250cm9sbGVyQ29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZDsKKyAgICAgICAgcmVnaXN0ZXIobmFtZTogc3RyaW5nLCBkZXBlbmRlbmN5QW5ub3RhdGVkQ29uc3RydWN0b3I6IGFueVtdKTogdm9pZDsKKyAgICAgICAgYWxsb3dHbG9iYWxzKCk6IHZvaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSHR0cFNlcnZpY2UKKyAgICAgKiBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcvc2VydmljZS8kaHR0cAorICAgICAqLworICAgIGludGVyZmFjZSBJSHR0cFNlcnZpY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogT2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlcXVlc3QgdG8gYmUgbWFkZSBhbmQgaG93IGl0IHNob3VsZCBiZSBwcm9jZXNzZWQuCisgICAgICAgICAqLworICAgICAgICA8VD4oY29uZmlnOiBJUmVxdWVzdENvbmZpZyk6IElIdHRwUHJvbWlzZTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gR0VUIHJlcXVlc3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0CisgICAgICAgICAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIGdldDxUPih1cmw6IHN0cmluZywgY29uZmlnPzogSVJlcXVlc3RTaG9ydGN1dENvbmZpZyk6IElIdHRwUHJvbWlzZTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gREVMRVRFIHJlcXVlc3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0CisgICAgICAgICAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIGRlbGV0ZTxUPih1cmw6IHN0cmluZywgY29uZmlnPzogSVJlcXVlc3RTaG9ydGN1dENvbmZpZyk6IElIdHRwUHJvbWlzZTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gSEVBRCByZXF1ZXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBoZWFkPFQ+KHVybDogc3RyaW5nLCBjb25maWc/OiBJUmVxdWVzdFNob3J0Y3V0Q29uZmlnKTogSUh0dHBQcm9taXNlPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBKU09OUCByZXF1ZXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBqc29ucDxUPih1cmw6IHN0cmluZywgY29uZmlnPzogSVJlcXVlc3RTaG9ydGN1dENvbmZpZyk6IElIdHRwUHJvbWlzZTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gUE9TVCByZXF1ZXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAorICAgICAgICAgKiBAcGFyYW0gZGF0YSBSZXF1ZXN0IGNvbnRlbnQKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcG9zdDxUPih1cmw6IHN0cmluZywgZGF0YTogYW55LCBjb25maWc/OiBJUmVxdWVzdFNob3J0Y3V0Q29uZmlnKTogSUh0dHBQcm9taXNlPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBQVVQgcmVxdWVzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVybCBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkwgc3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3QKKyAgICAgICAgICogQHBhcmFtIGRhdGEgUmVxdWVzdCBjb250ZW50CisgICAgICAgICAqIEBwYXJhbSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1dDxUPih1cmw6IHN0cmluZywgZGF0YTogYW55LCBjb25maWc/OiBJUmVxdWVzdFNob3J0Y3V0Q29uZmlnKTogSUh0dHBQcm9taXNlPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBQQVRDSCByZXF1ZXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAorICAgICAgICAgKiBAcGFyYW0gZGF0YSBSZXF1ZXN0IGNvbnRlbnQKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcGF0Y2g8VD4odXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgY29uZmlnPzogSVJlcXVlc3RTaG9ydGN1dENvbmZpZyk6IElIdHRwUHJvbWlzZTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUnVudGltZSBlcXVpdmFsZW50IG9mIHRoZSAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzIHByb3BlcnR5LiBBbGxvd3MgY29uZmlndXJhdGlvbiBvZiBkZWZhdWx0IGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscyBhcyB3ZWxsIGFzIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIGRlZmF1bHRzOiBJUmVxdWVzdENvbmZpZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQXJyYXkgb2YgY29uZmlnIG9iamVjdHMgZm9yIGN1cnJlbnRseSBwZW5kaW5nIHJlcXVlc3RzLiBUaGlzIGlzIHByaW1hcmlseSBtZWFudCB0byBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICAgICAqLworICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFueVtdOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9iamVjdCBkZXNjcmliaW5nIHRoZSByZXF1ZXN0IHRvIGJlIG1hZGUgYW5kIGhvdyBpdCBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICAgICAqIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy9zZXJ2aWNlLyRodHRwI3VzYWdlCisgICAgICovCisgICAgaW50ZXJmYWNlIElSZXF1ZXN0U2hvcnRjdXRDb25maWcgeworICAgICAgICAvKioKKyAgICAgICAgICoge09iamVjdC48c3RyaW5nfE9iamVjdD59CisgICAgICAgICAqIE1hcCBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2hpY2ggd2lsbCBiZSB0dXJuZWQgdG8gP2tleTE9dmFsdWUxJmtleTI9dmFsdWUyIGFmdGVyIHRoZSB1cmwuIElmIHRoZSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcsIGl0IHdpbGwgYmUgSlNPTmlmaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcGFyYW1zPzogYW55OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXAgb2Ygc3RyaW5ncyBvciBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIHN0cmluZ3MgcmVwcmVzZW50aW5nIEhUVFAgaGVhZGVycyB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuIElmIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBudWxsLCB0aGUgaGVhZGVyIHdpbGwgbm90IGJlIHNlbnQuCisgICAgICAgICAqLworICAgICAgICBoZWFkZXJzPzogYW55OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOYW1lIG9mIEhUVFAgaGVhZGVyIHRvIHBvcHVsYXRlIHdpdGggdGhlIFhTUkYgdG9rZW4uCisgICAgICAgICAqLworICAgICAgICB4c3JmSGVhZGVyTmFtZT86IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogTmFtZSBvZiBjb29raWUgY29udGFpbmluZyB0aGUgWFNSRiB0b2tlbi4KKyAgICAgICAgICovCisgICAgICAgIHhzcmZDb29raWVOYW1lPzogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB7Ym9vbGVhbnxDYWNoZX0KKyAgICAgICAgICogSWYgdHJ1ZSwgYSBkZWZhdWx0ICRodHRwIGNhY2hlIHdpbGwgYmUgdXNlZCB0byBjYWNoZSB0aGUgR0VUIHJlcXVlc3QsIG90aGVyd2lzZSBpZiBhIGNhY2hlIGluc3RhbmNlIGJ1aWx0IHdpdGggJGNhY2hlRmFjdG9yeSwgdGhpcyBjYWNoZSB3aWxsIGJlIHVzZWQgZm9yIGNhY2hpbmcuCisgICAgICAgICAqLworICAgICAgICBjYWNoZT86IGFueTsKKworICAgICAgICAvKioKKyAgICAgICAgICogd2hldGhlciB0byB0byBzZXQgdGhlIHdpdGhDcmVkZW50aWFscyBmbGFnIG9uIHRoZSBYSFIgb2JqZWN0LiBTZWUgW3JlcXVlc3RzIHdpdGggY3JlZGVudGlhbHNdaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vaHR0cF9hY2Nlc3NfY29udHJvbCNzZWN0aW9uXzUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAqLworICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB7c3RyaW5nfE9iamVjdH0KKyAgICAgICAgICogRGF0YSB0byBiZSBzZW50IGFzIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIGRhdGE/OiBhbnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyKXxBcnJheS48ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcik+fQorICAgICAgICAgKiBUcmFuc2Zvcm0gZnVuY3Rpb24gb3IgYW4gYXJyYXkgb2Ygc3VjaCBmdW5jdGlvbnMuIFRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gdGFrZXMgdGhlIGh0dHAgcmVxdWVzdCBib2R5IGFuZCBoZWFkZXJzIGFuZCByZXR1cm5zIGl0cyB0cmFuc2Zvcm1lZCAodHlwaWNhbGx5IHNlcmlhbGl6ZWQpIHZlcnNpb24uCisgICAgICAgICAqLworICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0PzogYW55OworCisgICAgICAgIC8qKgorICAgICAgICAgKiB7ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcil8QXJyYXkuPGZ1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIpPn0KKyAgICAgICAgICogVHJhbnNmb3JtIGZ1bmN0aW9uIG9yIGFuIGFycmF5IG9mIHN1Y2ggZnVuY3Rpb25zLiBUaGUgdHJhbnNmb3JtIGZ1bmN0aW9uIHRha2VzIHRoZSBodHRwIHJlc3BvbnNlIGJvZHkgYW5kIGhlYWRlcnMgYW5kIHJldHVybnMgaXRzIHRyYW5zZm9ybWVkICh0eXBpY2FsbHkgZGVzZXJpYWxpemVkKSB2ZXJzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U/OiBhbnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtudW1iZXJ8UHJvbWlzZX0KKyAgICAgICAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIHByb21pc2UgdGhhdCBzaG91bGQgYWJvcnQgdGhlIHJlcXVlc3Qgd2hlbiByZXNvbHZlZC4KKyAgICAgICAgICovCisgICAgICAgIHRpbWVvdXQ/OiBhbnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlZSByZXF1ZXN0VHlwZS4KKyAgICAgICAgICovCisgICAgICAgIHJlc3BvbnNlVHlwZT86IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgZGVzY3JpYmluZyB0aGUgcmVxdWVzdCB0byBiZSBtYWRlIGFuZCBob3cgaXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcvc2VydmljZS8kaHR0cCN1c2FnZQorICAgICAqLworICAgIGludGVyZmFjZSBJUmVxdWVzdENvbmZpZyBleHRlbmRzIElSZXF1ZXN0U2hvcnRjdXRDb25maWcgeworICAgICAgICAvKioKKyAgICAgICAgICogSFRUUCBtZXRob2QgKGUuZy4gJ0dFVCcsICdQT1NUJywgZXRjKQorICAgICAgICAgKi8KKyAgICAgICAgbWV0aG9kOiBzdHJpbmc7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdXJsOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElIdHRwSGVhZGVyc0dldHRlciB7CisgICAgICAgICgpOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7IH07CisgICAgICAgIChoZWFkZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElIdHRwUHJvbWlzZUNhbGxiYWNrPFQ+IHsKKyAgICAgICAgKGRhdGE6IFQsIHN0YXR1czogbnVtYmVyLCBoZWFkZXJzOiBJSHR0cEhlYWRlcnNHZXR0ZXIsIGNvbmZpZzogSVJlcXVlc3RDb25maWcpOiB2b2lkOworICAgIH0KKworICAgIGludGVyZmFjZSBJSHR0cFByb21pc2VDYWxsYmFja0FyZzxUPiB7CisgICAgICAgIGRhdGE/OiBUOworICAgICAgICBzdGF0dXM/OiBudW1iZXI7CisgICAgICAgIGhlYWRlcnM/OiBJSHR0cEhlYWRlcnNHZXR0ZXI7CisgICAgICAgIGNvbmZpZz86IElSZXF1ZXN0Q29uZmlnOworICAgICAgICBzdGF0dXNUZXh0Pzogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBJSHR0cFByb21pc2U8VD4gZXh0ZW5kcyBJUHJvbWlzZTxJSHR0cFByb21pc2VDYWxsYmFja0FyZzxUPj4geworICAgICAgICBzdWNjZXNzKGNhbGxiYWNrOiBJSHR0cFByb21pc2VDYWxsYmFjazxUPik6IElIdHRwUHJvbWlzZTxUPjsKKyAgICAgICAgZXJyb3IoY2FsbGJhY2s6IElIdHRwUHJvbWlzZUNhbGxiYWNrPGFueT4pOiBJSHR0cFByb21pc2U8VD47CisgICAgICAgIHRoZW48VFJlc3VsdD4oc3VjY2Vzc0NhbGxiYWNrOiAocmVzcG9uc2U6IElIdHRwUHJvbWlzZUNhbGxiYWNrQXJnPFQ+KSA9PiBJUHJvbWlzZTxUUmVzdWx0PnxUUmVzdWx0LCBlcnJvckNhbGxiYWNrPzogKHJlc3BvbnNlOiBJSHR0cFByb21pc2VDYWxsYmFja0FyZzxhbnk+KSA9PiBhbnkpOiBJUHJvbWlzZTxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIE9iamVjdCB0aGF0IGNvbnRyb2xzIHRoZSBkZWZhdWx0cyBmb3IgJGh0dHAgcHJvdmlkZXIKKyAgICAqIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy9zZXJ2aWNlLyRodHRwI2RlZmF1bHRzCisgICAgKi8KKyAgICBpbnRlcmZhY2UgSUh0dHBQcm92aWRlckRlZmF1bHRzIHsKKyAgICAgICAgeHNyZkNvb2tpZU5hbWU/OiBzdHJpbmc7CisgICAgICAgIHhzcmZIZWFkZXJOYW1lPzogc3RyaW5nOworICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuOworICAgICAgICBoZWFkZXJzPzogeworICAgICAgICAgICAgY29tbW9uPzogYW55OworICAgICAgICAgICAgcG9zdD86IGFueTsKKyAgICAgICAgICAgIHB1dD86IGFueTsKKyAgICAgICAgICAgIHBhdGNoPzogYW55OworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIElIdHRwUHJvdmlkZXIgZXh0ZW5kcyBJU2VydmljZVByb3ZpZGVyIHsKKyAgICAgICAgZGVmYXVsdHM6IElIdHRwUHJvdmlkZXJEZWZhdWx0czsKKyAgICAgICAgaW50ZXJjZXB0b3JzOiBhbnlbXTsKKyAgICAgICAgdXNlQXBwbHlBc3luYygpOiBib29sZWFuOworICAgICAgICB1c2VBcHBseUFzeW5jKHZhbHVlOiBib29sZWFuKTogSUh0dHBQcm92aWRlcjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBIdHRwQmFja2VuZFNlcnZpY2UKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJGh0dHBCYWNrZW5kCisgICAgLy8gWW91IHNob3VsZCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIHNlcnZpY2UgZGlyZWN0bHkuCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgaW50ZXJmYWNlIElIdHRwQmFja2VuZFNlcnZpY2UgeworICAgICAgICAvLyBYWFggUGVyaGFwcyBkZWZpbmUgY2FsbGJhY2sgc2lnbmF0dXJlIGluIHRoZSBmdXR1cmUKKyAgICAgICAgKG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgcG9zdD86IGFueSwgY2FsbGJhY2s/OiBGdW5jdGlvbiwgaGVhZGVycz86IGFueSwgdGltZW91dD86IG51bWJlciwgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbik6IHZvaWQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW50ZXJwb2xhdGVTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRpbnRlcnBvbGF0ZQorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kaW50ZXJwb2xhdGVQcm92aWRlcgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJSW50ZXJwb2xhdGVTZXJ2aWNlIHsKKyAgICAgICAgKHRleHQ6IHN0cmluZywgbXVzdEhhdmVFeHByZXNzaW9uPzogYm9vbGVhbiwgdHJ1c3RlZENvbnRleHQ/OiBzdHJpbmcsIGFsbE9yTm90aGluZz86IGJvb2xlYW4pOiBJSW50ZXJwb2xhdGlvbkZ1bmN0aW9uOworICAgICAgICBlbmRTeW1ib2woKTogc3RyaW5nOworICAgICAgICBzdGFydFN5bWJvbCgpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElJbnRlcnBvbGF0aW9uRnVuY3Rpb24geworICAgICAgICAoY29udGV4dDogYW55KTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBJSW50ZXJwb2xhdGVQcm92aWRlciBleHRlbmRzIElTZXJ2aWNlUHJvdmlkZXIgeworICAgICAgICBzdGFydFN5bWJvbCgpOiBzdHJpbmc7CisgICAgICAgIHN0YXJ0U3ltYm9sKHZhbHVlOiBzdHJpbmcpOiBJSW50ZXJwb2xhdGVQcm92aWRlcjsKKyAgICAgICAgZW5kU3ltYm9sKCk6IHN0cmluZzsKKyAgICAgICAgZW5kU3ltYm9sKHZhbHVlOiBzdHJpbmcpOiBJSW50ZXJwb2xhdGVQcm92aWRlcjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUZW1wbGF0ZUNhY2hlU2VydmljZQorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kdGVtcGxhdGVDYWNoZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJVGVtcGxhdGVDYWNoZVNlcnZpY2UgZXh0ZW5kcyBJQ2FjaGVPYmplY3Qge30KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNDRVNlcnZpY2UKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJHNjZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJU0NFU2VydmljZSB7CisgICAgICAgIGdldFRydXN0ZWQodHlwZTogc3RyaW5nLCBtYXlCZVRydXN0ZWQ6IGFueSk6IGFueTsKKyAgICAgICAgZ2V0VHJ1c3RlZENzcyh2YWx1ZTogYW55KTogYW55OworICAgICAgICBnZXRUcnVzdGVkSHRtbCh2YWx1ZTogYW55KTogYW55OworICAgICAgICBnZXRUcnVzdGVkSnModmFsdWU6IGFueSk6IGFueTsKKyAgICAgICAgZ2V0VHJ1c3RlZFJlc291cmNlVXJsKHZhbHVlOiBhbnkpOiBhbnk7CisgICAgICAgIGdldFRydXN0ZWRVcmwodmFsdWU6IGFueSk6IGFueTsKKyAgICAgICAgcGFyc2UodHlwZTogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcpOiAoY29udGV4dDogYW55LCBsb2NhbHM6IGFueSkgPT4gYW55OworICAgICAgICBwYXJzZUFzQ3NzKGV4cHJlc3Npb246IHN0cmluZyk6IChjb250ZXh0OiBhbnksIGxvY2FsczogYW55KSA9PiBhbnk7CisgICAgICAgIHBhcnNlQXNIdG1sKGV4cHJlc3Npb246IHN0cmluZyk6IChjb250ZXh0OiBhbnksIGxvY2FsczogYW55KSA9PiBhbnk7CisgICAgICAgIHBhcnNlQXNKcyhleHByZXNzaW9uOiBzdHJpbmcpOiAoY29udGV4dDogYW55LCBsb2NhbHM6IGFueSkgPT4gYW55OworICAgICAgICBwYXJzZUFzUmVzb3VyY2VVcmwoZXhwcmVzc2lvbjogc3RyaW5nKTogKGNvbnRleHQ6IGFueSwgbG9jYWxzOiBhbnkpID0+IGFueTsKKyAgICAgICAgcGFyc2VBc1VybChleHByZXNzaW9uOiBzdHJpbmcpOiAoY29udGV4dDogYW55LCBsb2NhbHM6IGFueSkgPT4gYW55OworICAgICAgICB0cnVzdEFzKHR5cGU6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueTsKKyAgICAgICAgdHJ1c3RBc0h0bWwodmFsdWU6IGFueSk6IGFueTsKKyAgICAgICAgdHJ1c3RBc0pzKHZhbHVlOiBhbnkpOiBhbnk7CisgICAgICAgIHRydXN0QXNSZXNvdXJjZVVybCh2YWx1ZTogYW55KTogYW55OworICAgICAgICB0cnVzdEFzVXJsKHZhbHVlOiBhbnkpOiBhbnk7CisgICAgICAgIGlzRW5hYmxlZCgpOiBib29sZWFuOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNDRVByb3ZpZGVyCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRzY2VQcm92aWRlcgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJU0NFUHJvdmlkZXIgZXh0ZW5kcyBJU2VydmljZVByb3ZpZGVyIHsKKyAgICAgICAgZW5hYmxlZCh2YWx1ZTogYm9vbGVhbik6IHZvaWQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU0NFRGVsZWdhdGVTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRzY2VEZWxlZ2F0ZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJU0NFRGVsZWdhdGVTZXJ2aWNlIHsKKyAgICAgICAgZ2V0VHJ1c3RlZCh0eXBlOiBzdHJpbmcsIG1heUJlVHJ1c3RlZDogYW55KTogYW55OworICAgICAgICB0cnVzdEFzKHR5cGU6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueTsKKyAgICAgICAgdmFsdWVPZih2YWx1ZTogYW55KTogYW55OworICAgIH0KKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU0NFRGVsZWdhdGVQcm92aWRlcgorICAgIC8vIHNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kc2NlRGVsZWdhdGVQcm92aWRlcgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIGludGVyZmFjZSBJU0NFRGVsZWdhdGVQcm92aWRlciBleHRlbmRzIElTZXJ2aWNlUHJvdmlkZXIgeworICAgICAgICByZXNvdXJjZVVybEJsYWNrbGlzdChibGFja2xpc3Q6IGFueVtdKTogdm9pZDsKKyAgICAgICAgcmVzb3VyY2VVcmxXaGl0ZWxpc3Qod2hpdGVsaXN0OiBhbnlbXSk6IHZvaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogJHRlbXBsYXRlUmVxdWVzdCBzZXJ2aWNlCisgICAgICogc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nL3NlcnZpY2UvJHRlbXBsYXRlUmVxdWVzdAorICAgICAqLworICAgIGludGVyZmFjZSBJVGVtcGxhdGVSZXF1ZXN0U2VydmljZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBEb3dubG9hZHMgYSB0ZW1wbGF0ZSB1c2luZyAkaHR0cCBhbmQsIHVwb24gc3VjY2Vzcywgc3RvcmVzIHRoZQorICAgICAgICAgKiBjb250ZW50cyBpbnNpZGUgb2YgJHRlbXBsYXRlQ2FjaGUuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZSBIVFRQIHJlcXVlc3QgZmFpbHMgb3IgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdGhlIEhUVFAgcmVxdWVzdCBpcworICAgICAgICAgKiBlbXB0eSB0aGVuIGEgJGNvbXBpbGUgZXJyb3Igd2lsbCBiZSB0aHJvd24gKHVubGVzcworICAgICAgICAgKiB7aWdub3JlUmVxdWVzdEVycm9yfSBpcyBzZXQgdG8gdHJ1ZSkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cGwgICAgICAgICAgICAgICAgICBUaGUgdGVtcGxhdGUgVVJMLgorICAgICAgICAgKiBAcGFyYW0gaWdub3JlUmVxdWVzdEVycm9yICAgV2hldGhlciBvciBub3QgdG8gaWdub3JlIHRoZSBleGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHJlcXVlc3QgZmFpbHMgb3IgdGhlIHRlbXBsYXRlIGlzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAgIEEgcHJvbWlzZSB3aG9zZSB2YWx1ZSBpcyB0aGUgdGVtcGxhdGUgY29udGVudC4KKyAgICAgICAgICovCisgICAgICAgICh0cGw6IHN0cmluZywgaWdub3JlUmVxdWVzdEVycm9yPzogYm9vbGVhbik6IElQcm9taXNlPHN0cmluZz47CisgICAgICAgIC8qKgorICAgICAgICAgKiB0b3RhbCBhbW91bnQgb2YgcGVuZGluZyB0ZW1wbGF0ZSByZXF1ZXN0cyBiZWluZyBkb3dubG9hZGVkLgorICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQorICAgICAgICAgKi8KKyAgICAgICAgdG90YWxQZW5kaW5nUmVxdWVzdHM6IG51bWJlcjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEaXJlY3RpdmUKKyAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUKKyAgICAvLyBhbmQgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9ndWlkZS9kaXJlY3RpdmUKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGludGVyZmFjZSBJRGlyZWN0aXZlRmFjdG9yeSB7CisgICAgICAgICguLi5hcmdzOiBhbnlbXSk6IElEaXJlY3RpdmU7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElEaXJlY3RpdmVMaW5rRm4geworICAgICAgICAoCisgICAgICAgICAgICBzY29wZTogSVNjb3BlLAorICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50OiBJQXVnbWVudGVkSlF1ZXJ5LAorICAgICAgICAgICAgaW5zdGFuY2VBdHRyaWJ1dGVzOiBJQXR0cmlidXRlcywKKyAgICAgICAgICAgIGNvbnRyb2xsZXI6IGFueSwKKyAgICAgICAgICAgIHRyYW5zY2x1ZGU6IElUcmFuc2NsdWRlRnVuY3Rpb24KKyAgICAgICAgKTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSURpcmVjdGl2ZVByZVBvc3QgeworICAgICAgICBwcmU/OiBJRGlyZWN0aXZlTGlua0ZuOworICAgICAgICBwb3N0PzogSURpcmVjdGl2ZUxpbmtGbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSURpcmVjdGl2ZUNvbXBpbGVGbiB7CisgICAgICAgICgKKyAgICAgICAgICAgIHRlbXBsYXRlRWxlbWVudDogSUF1Z21lbnRlZEpRdWVyeSwKKyAgICAgICAgICAgIHRlbXBsYXRlQXR0cmlidXRlczogSUF0dHJpYnV0ZXMsCisgICAgICAgICAgICB0cmFuc2NsdWRlOiBJVHJhbnNjbHVkZUZ1bmN0aW9uCisgICAgICAgICk6IElEaXJlY3RpdmVQcmVQb3N0OworICAgIH0KKworICAgIGludGVyZmFjZSBJRGlyZWN0aXZlIHsKKyAgICAgICAgY29tcGlsZT86IElEaXJlY3RpdmVDb21waWxlRm47CisgICAgICAgIGNvbnRyb2xsZXI/OiBhbnk7CisgICAgICAgIGNvbnRyb2xsZXJBcz86IHN0cmluZzsKKyAgICAgICAgYmluZFRvQ29udHJvbGxlcj86IGJvb2xlYW47CisgICAgICAgIGxpbms/OiBJRGlyZWN0aXZlTGlua0ZuIHwgSURpcmVjdGl2ZVByZVBvc3Q7CisgICAgICAgIG5hbWU/OiBzdHJpbmc7CisgICAgICAgIHByaW9yaXR5PzogbnVtYmVyOworICAgICAgICByZXBsYWNlPzogYm9vbGVhbjsKKyAgICAgICAgcmVxdWlyZT86IGFueTsKKyAgICAgICAgcmVzdHJpY3Q/OiBzdHJpbmc7CisgICAgICAgIHNjb3BlPzogYW55OworICAgICAgICB0ZW1wbGF0ZT86IGFueTsKKyAgICAgICAgdGVtcGxhdGVVcmw/OiBhbnk7CisgICAgICAgIHRlcm1pbmFsPzogYm9vbGVhbjsKKyAgICAgICAgdHJhbnNjbHVkZT86IGFueTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhbmd1bGFyLmVsZW1lbnQKKyAgICAgKiB3aGVuIGNhbGxpbmcgYW5ndWxhci5lbGVtZW50LCBhbmd1bGFyIHJldHVybnMgYSBqUXVlcnkgb2JqZWN0LAorICAgICAqIGF1Z21lbnRlZCB3aXRoIGFkZGl0aW9uYWwgbWV0aG9kcyBsaWtlIGUuZy4gc2NvcGUuCisgICAgICogc2VlOiBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9hbmd1bGFyLmVsZW1lbnQKKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgSUF1Z21lbnRlZEpRdWVyeVN0YXRpYyBleHRlbmRzIEpRdWVyeVN0YXRpYyB7CisgICAgICAgIChzZWxlY3Rvcjogc3RyaW5nLCBjb250ZXh0PzogYW55KTogSUF1Z21lbnRlZEpRdWVyeTsKKyAgICAgICAgKGVsZW1lbnQ6IEVsZW1lbnQpOiBJQXVnbWVudGVkSlF1ZXJ5OworICAgICAgICAob2JqZWN0OiB7fSk6IElBdWdtZW50ZWRKUXVlcnk7CisgICAgICAgIChlbGVtZW50QXJyYXk6IEVsZW1lbnRbXSk6IElBdWdtZW50ZWRKUXVlcnk7CisgICAgICAgIChvYmplY3Q6IEpRdWVyeSk6IElBdWdtZW50ZWRKUXVlcnk7CisgICAgICAgIChmdW5jOiBGdW5jdGlvbik6IElBdWdtZW50ZWRKUXVlcnk7CisgICAgICAgIChhcnJheTogYW55W10pOiBJQXVnbWVudGVkSlF1ZXJ5OworICAgICAgICAoKTogSUF1Z21lbnRlZEpRdWVyeTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSUF1Z21lbnRlZEpRdWVyeSBleHRlbmRzIEpRdWVyeSB7CisgICAgICAgIC8vIFRPRE86IGV2ZW50cywgaG93IHRvIGRlZmluZT8KKyAgICAgICAgLy8kZGVzdHJveQorCisgICAgICAgIGZpbmQoc2VsZWN0b3I6IHN0cmluZyk6IElBdWdtZW50ZWRKUXVlcnk7CisgICAgICAgIGZpbmQoZWxlbWVudDogYW55KTogSUF1Z21lbnRlZEpRdWVyeTsKKyAgICAgICAgZmluZChvYmo6IEpRdWVyeSk6IElBdWdtZW50ZWRKUXVlcnk7CisgICAgICAgIGNvbnRyb2xsZXIoKTogYW55OworICAgICAgICBjb250cm9sbGVyKG5hbWU6IHN0cmluZyk6IGFueTsKKyAgICAgICAgaW5qZWN0b3IoKTogYW55OworICAgICAgICBzY29wZSgpOiBJU2NvcGU7CisgICAgICAgIGlzb2xhdGVTY29wZSgpOiBJU2NvcGU7CisKKyAgICAgICAgaW5oZXJpdGVkRGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IEpRdWVyeTsKKyAgICAgICAgaW5oZXJpdGVkRGF0YShvYmo6IHsgW2tleTogc3RyaW5nXTogYW55OyB9KTogSlF1ZXJ5OworICAgICAgICBpbmhlcml0ZWREYXRhKGtleT86IHN0cmluZyk6IGFueTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEFuaW1hdGVTZXJ2aWNlCisgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRhbmltYXRlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBpbnRlcmZhY2UgSUFuaW1hdGVTZXJ2aWNlIHsKKyAgICAgICAgYWRkQ2xhc3MoZWxlbWVudDogSlF1ZXJ5LCBjbGFzc05hbWU6IHN0cmluZywgZG9uZT86IEZ1bmN0aW9uKTogSVByb21pc2U8YW55PjsKKyAgICAgICAgZW50ZXIoZWxlbWVudDogSlF1ZXJ5LCBwYXJlbnQ6IEpRdWVyeSwgYWZ0ZXI6IEpRdWVyeSwgZG9uZT86IEZ1bmN0aW9uKTogdm9pZDsKKyAgICAgICAgbGVhdmUoZWxlbWVudDogSlF1ZXJ5LCBkb25lPzogRnVuY3Rpb24pOiB2b2lkOworICAgICAgICBtb3ZlKGVsZW1lbnQ6IEpRdWVyeSwgcGFyZW50OiBKUXVlcnksIGFmdGVyOiBKUXVlcnksIGRvbmU/OiBGdW5jdGlvbik6IHZvaWQ7CisgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQ6IEpRdWVyeSwgY2xhc3NOYW1lOiBzdHJpbmcsIGRvbmU/OiBGdW5jdGlvbik6IHZvaWQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQVVUTyBtb2R1bGUgKGFuZ3VsYXIuanMpCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgZXhwb3J0IG1vZHVsZSBhdXRvIHsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBJbmplY3RvclNlcnZpY2UKKyAgICAgICAgLy8gc2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL0FVVE8uJGluamVjdG9yCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIGludGVyZmFjZSBJSW5qZWN0b3JTZXJ2aWNlIHsKKyAgICAgICAgICAgIGFubm90YXRlKGZuOiBGdW5jdGlvbik6IHN0cmluZ1tdOworICAgICAgICAgICAgYW5ub3RhdGUoaW5saW5lQW5ub3RhdGVkRnVuY3Rpb246IGFueVtdKTogc3RyaW5nW107CisgICAgICAgICAgICBnZXQobmFtZTogc3RyaW5nKTogYW55OworICAgICAgICAgICAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47CisgICAgICAgICAgICBpbnN0YW50aWF0ZSh0eXBlQ29uc3RydWN0b3I6IEZ1bmN0aW9uLCBsb2NhbHM/OiBhbnkpOiBhbnk7CisgICAgICAgICAgICBpbnZva2UoaW5saW5lQW5ub3RhdGVkRnVuY3Rpb246IGFueVtdKTogYW55OworICAgICAgICAgICAgaW52b2tlKGZ1bmM6IEZ1bmN0aW9uLCBjb250ZXh0PzogYW55LCBsb2NhbHM/OiBhbnkpOiBhbnk7CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBQcm92aWRlU2VydmljZQorICAgICAgICAvLyBzZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvQVVUTy4kcHJvdmlkZQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICBpbnRlcmZhY2UgSVByb3ZpZGVTZXJ2aWNlIHsKKyAgICAgICAgICAgIC8vIERvY3VtZW50YXRpb24gc2F5cyBpdCByZXR1cm5zIHRoZSByZWdpc3RlcmVkIGluc3RhbmNlLCBidXQgYWN0dWFsCisgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcuCisgICAgICAgICAgICAvLyBjb25zdGFudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnk7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJlZ2lzdGVyIGEgY29uc3RhbnQgc2VydmljZSwgc3VjaCBhcyBhIHN0cmluZywgYSBudW1iZXIsIGFuIGFycmF5LCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgd2l0aCB0aGUgJGluamVjdG9yLiBVbmxpa2UgdmFsdWUgaXQgY2FuIGJlIGluamVjdGVkIGludG8gYSBtb2R1bGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoc2VlIGNvbmZpZykgYW5kIGl0IGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGFuIEFuZ3VsYXIgZGVjb3JhdG9yLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb25zdGFudC4KKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgY29uc3RhbnQgdmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnN0YW50KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQ7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIGRlY29yYXRvciB3aXRoIHRoZSAkaW5qZWN0b3IuIEEgc2VydmljZSBkZWNvcmF0b3IgaW50ZXJjZXB0cyB0aGUgY3JlYXRpb24gb2YgYSBzZXJ2aWNlLCBhbGxvd2luZyBpdCB0byBvdmVycmlkZSBvciBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgc2VydmljZS4gVGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgZGVjb3JhdG9yIG1heSBiZSB0aGUgb3JpZ2luYWwgc2VydmljZSwgb3IgYSBuZXcgc2VydmljZSBvYmplY3Qgd2hpY2ggcmVwbGFjZXMgb3Igd3JhcHMgYW5kIGRlbGVnYXRlcyB0byB0aGUgb3JpZ2luYWwgc2VydmljZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBkZWNvcmF0ZS4KKyAgICAgICAgICAgICAqIEBwYXJhbSBkZWNvcmF0b3IgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgc2VydmljZSBuZWVkcyB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHNob3VsZCByZXR1cm4gdGhlIGRlY29yYXRlZCBzZXJ2aWNlIGluc3RhbmNlLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHVzaW5nIHRoZSBpbmplY3Rvci5pbnZva2UgbWV0aG9kIGFuZCBpcyB0aGVyZWZvcmUgZnVsbHkgaW5qZWN0YWJsZS4gTG9jYWwgaW5qZWN0aW9uIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAkZGVsZWdhdGUgLSBUaGUgb3JpZ2luYWwgc2VydmljZSBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIG1vbmtleSBwYXRjaGVkLCBjb25maWd1cmVkLCBkZWNvcmF0ZWQgb3IgZGVsZWdhdGVkIHRvLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZWNvcmF0b3IobmFtZTogc3RyaW5nLCBkZWNvcmF0b3I6IEZ1bmN0aW9uKTogdm9pZDsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIGRlY29yYXRvciB3aXRoIHRoZSAkaW5qZWN0b3IuIEEgc2VydmljZSBkZWNvcmF0b3IgaW50ZXJjZXB0cyB0aGUgY3JlYXRpb24gb2YgYSBzZXJ2aWNlLCBhbGxvd2luZyBpdCB0byBvdmVycmlkZSBvciBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgc2VydmljZS4gVGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgZGVjb3JhdG9yIG1heSBiZSB0aGUgb3JpZ2luYWwgc2VydmljZSwgb3IgYSBuZXcgc2VydmljZSBvYmplY3Qgd2hpY2ggcmVwbGFjZXMgb3Igd3JhcHMgYW5kIGRlbGVnYXRlcyB0byB0aGUgb3JpZ2luYWwgc2VydmljZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBkZWNvcmF0ZS4KKyAgICAgICAgICAgICAqIEBwYXJhbSBpbmxpbmVBbm5vdGF0ZWRGdW5jdGlvbiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBzZXJ2aWNlIG5lZWRzIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgc2hvdWxkIHJldHVybiB0aGUgZGVjb3JhdGVkIHNlcnZpY2UgaW5zdGFuY2UuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgdXNpbmcgdGhlIGluamVjdG9yLmludm9rZSBtZXRob2QgYW5kIGlzIHRoZXJlZm9yZSBmdWxseSBpbmplY3RhYmxlLiBMb2NhbCBpbmplY3Rpb24gYXJndW1lbnRzOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICRkZWxlZ2F0ZSAtIFRoZSBvcmlnaW5hbCBzZXJ2aWNlIGluc3RhbmNlLCB3aGljaCBjYW4gYmUgbW9ua2V5IHBhdGNoZWQsIGNvbmZpZ3VyZWQsIGRlY29yYXRlZCBvciBkZWxlZ2F0ZWQgdG8uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRlY29yYXRvcihuYW1lOiBzdHJpbmcsIGlubGluZUFubm90YXRlZEZ1bmN0aW9uOiBhbnlbXSk6IHZvaWQ7CisgICAgICAgICAgICBmYWN0b3J5KG5hbWU6IHN0cmluZywgc2VydmljZUZhY3RvcnlGdW5jdGlvbjogRnVuY3Rpb24pOiBJU2VydmljZVByb3ZpZGVyOworICAgICAgICAgICAgZmFjdG9yeShuYW1lOiBzdHJpbmcsIGlubGluZUFubm90YXRlZEZ1bmN0aW9uOiBhbnlbXSk6IElTZXJ2aWNlUHJvdmlkZXI7CisgICAgICAgICAgICBwcm92aWRlcihuYW1lOiBzdHJpbmcsIHByb3ZpZGVyOiBJU2VydmljZVByb3ZpZGVyKTogSVNlcnZpY2VQcm92aWRlcjsKKyAgICAgICAgICAgIHByb3ZpZGVyKG5hbWU6IHN0cmluZywgc2VydmljZVByb3ZpZGVyQ29uc3RydWN0b3I6IEZ1bmN0aW9uKTogSVNlcnZpY2VQcm92aWRlcjsKKyAgICAgICAgICAgIHNlcnZpY2UobmFtZTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiBJU2VydmljZVByb3ZpZGVyOworICAgICAgICAgICAgdmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogSVNlcnZpY2VQcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXJqcy9yZXN0YW5ndWxhci5kLnRzIGIvY2F0YWxvZy11aS90eXBpbmdzL2FuZ3VsYXJqcy9yZXN0YW5ndWxhci5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjhiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3R5cGluZ3MvYW5ndWxhcmpzL3Jlc3Rhbmd1bGFyLmQudHMKQEAgLTAsMCArMSwxNTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyBUeXBlIGRlZmluaXRpb25zIGZvciBSZXN0YW5ndWxhciB2MS40LjAKKy8vIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZ29udG8vcmVzdGFuZ3VsYXIKKy8vIERlZmluaXRpb25zIGJ5OiBCb3JpcyBZYW5rb3YgPGh0dHBzOi8vZ2l0aHViLmNvbS9ib3Jpc3lhbmtvdi8+CisvLyBEZWZpbml0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292L0RlZmluaXRlbHlUeXBlZAorCisKKy8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uL2FuZ3VsYXJqcy9hbmd1bGFyLmQudHMiIC8+CisKKy8vIFN1cHBvcnQgQU1EIHJlcXVpcmUgKGNvcHlpbmcgYW5ndWxhci5kLnRzIGFwcHJvYWNoKQorLy8gYWxsb3dzIGZvciBpbXBvcnQge0lSZXF1ZXN0Q29uZmlnfSBmcm9tICdyZXN0YW5ndWxhcicgRVM2IGFwcHJvYWNoCitkZWNsYXJlIG1vZHVsZSAncmVzdGFuZ3VsYXInIHsKKyAgICBleHBvcnQgPSByZXN0YW5ndWxhcjsKK30KKworCisKK2RlY2xhcmUgbW9kdWxlIHJlc3Rhbmd1bGFyIHsKKworICAgIGludGVyZmFjZSBJUHJvbWlzZTxUPiBleHRlbmRzIGFuZ3VsYXIuSVByb21pc2U8VD4geworICAgICAgICBjYWxsKG1ldGhvZE5hbWU6IHN0cmluZywgcGFyYW1zPzogYW55KTogSVByb21pc2U8VD47CisgICAgICAgIGdldChmaWVsZE5hbWU6IHN0cmluZyk6IElQcm9taXNlPFQ+OworICAgICAgICAkb2JqZWN0OiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBJQ29sbGVjdGlvblByb21pc2U8VD4gZXh0ZW5kcyBhbmd1bGFyLklQcm9taXNlPFRbXT4geworICAgICAgICBwdXNoKG9iamVjdDogYW55KTogSUNvbGxlY3Rpb25Qcm9taXNlPFQ+OworICAgICAgICBjYWxsKG1ldGhvZE5hbWU6IHN0cmluZywgcGFyYW1zPzogYW55KTogSUNvbGxlY3Rpb25Qcm9taXNlPFQ+OworICAgICAgICBnZXQoZmllbGROYW1lOiBzdHJpbmcpOiBJQ29sbGVjdGlvblByb21pc2U8VD47CisgICAgICAgICRvYmplY3Q6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSVJlc3BvbnNlIHsKKyAgICAgICAgc3RhdHVzOiBudW1iZXI7CisgICAgICAgIGRhdGE6IGFueTsKKyAgICAgICAgaGVhZGVycyhuYW1lOiBzdHJpbmcpOiBzdHJpbmc7CisgICAgICAgIGNvbmZpZzogeworICAgICAgICAgICAgbWV0aG9kOiBzdHJpbmc7CisgICAgICAgICAgICB1cmw6IHN0cmluZzsKKyAgICAgICAgICAgIHBhcmFtczogYW55OworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIElQcm92aWRlciB7CisgICAgICAgIHNldEJhc2VVcmwoYmFzZVVybDogc3RyaW5nKTogdm9pZDsKKyAgICAgICAgc2V0RXh0cmFGaWVsZHMoZmllbGRzOiBzdHJpbmdbXSk6IHZvaWQ7CisgICAgICAgIHNldFBhcmVudGxlc3MocGFyZW50bGVzczogYm9vbGVhbiwgcm91dGVzOiBzdHJpbmdbXSk6IHZvaWQ7CisgICAgICAgIHNldERlZmF1bHRIdHRwRmllbGRzKGh0dHBGaWVsZHM6IGFueSk6IHZvaWQ7CisgICAgICAgIGFkZEVsZW1lbnRUcmFuc2Zvcm1lcihyb3V0ZTogc3RyaW5nLCB0cmFuc2Zvcm1lcjogRnVuY3Rpb24pOiB2b2lkOworICAgICAgICBhZGRFbGVtZW50VHJhbnNmb3JtZXIocm91dGU6IHN0cmluZywgaXNDb2xsZWN0aW9uOiBib29sZWFuLCB0cmFuc2Zvcm1lcjogRnVuY3Rpb24pOiB2b2lkOworICAgICAgICBzZXRUcmFuc2Zvcm1Pbmx5U2VydmVyRWxlbWVudHMoYWN0aXZlOiBib29sZWFuKTogdm9pZDsKKyAgICAgICAgc2V0T25FbGVtUmVzdGFuZ3VsYXJpemVkKGNhbGxiYWNrOiAoZWxlbTogYW55LCBpc0NvbGxlY3Rpb246IGJvb2xlYW4sIHdoYXQ6IHN0cmluZywgcmVzdGFuZ3VsYXI6IElTZXJ2aWNlKSA9PiBhbnkpOiB2b2lkOworICAgICAgICBzZXRSZXNwb25zZUludGVyY2VwdG9yKHJlc3BvbnNlSW50ZXJjZXB0b3I6IChkYXRhOiBhbnksIG9wZXJhdGlvbjogc3RyaW5nLCB3aGF0OiBzdHJpbmcsIHVybDogc3RyaW5nLCByZXNwb25zZTogSVJlc3BvbnNlLCBkZWZlcnJlZDogYW5ndWxhci5JRGVmZXJyZWQ8YW55PikgPT4gYW55KTogdm9pZDsKKyAgICAgICAgc2V0UmVzcG9uc2VFeHRyYWN0b3IocmVzcG9uc2VJbnRlcmNlcHRvcjogKGRhdGE6IGFueSwgb3BlcmF0aW9uOiBzdHJpbmcsIHdoYXQ6IHN0cmluZywgdXJsOiBzdHJpbmcsIHJlc3BvbnNlOiBJUmVzcG9uc2UsIGRlZmVycmVkOiBhbmd1bGFyLklEZWZlcnJlZDxhbnk+KSA9PiBhbnkpOiB2b2lkOworICAgICAgICBhZGRSZXNwb25zZUludGVyY2VwdG9yKHJlc3BvbnNlSW50ZXJjZXB0b3I6IChkYXRhOiBhbnksIG9wZXJhdGlvbjogc3RyaW5nLCB3aGF0OiBzdHJpbmcsIHVybDogc3RyaW5nLCByZXNwb25zZTogSVJlc3BvbnNlLCBkZWZlcnJlZDogYW5ndWxhci5JRGVmZXJyZWQ8YW55PikgPT4gYW55KTogdm9pZDsKKyAgICAgICAgc2V0UmVxdWVzdEludGVyY2VwdG9yKHJlcXVlc3RJbnRlcmNlcHRvcjogKGVsZW1lbnQ6IGFueSwgb3BlcmF0aW9uOiBzdHJpbmcsIHdoYXQ6IHN0cmluZywgdXJsOiBzdHJpbmcpID0+IGFueSk6IHZvaWQ7CisgICAgICAgIGFkZFJlcXVlc3RJbnRlcmNlcHRvcihyZXF1ZXN0SW50ZXJjZXB0b3I6IChlbGVtZW50OiBhbnksIG9wZXJhdGlvbjogc3RyaW5nLCB3aGF0OiBzdHJpbmcsIHVybDogc3RyaW5nKSA9PiBhbnkpOiB2b2lkOworICAgICAgICBzZXRGdWxsUmVxdWVzdEludGVyY2VwdG9yKGZ1bGxSZXF1ZXN0SW50ZXJjZXB0b3I6IChlbGVtZW50OiBhbnksIG9wZXJhdGlvbjogc3RyaW5nLCB3aGF0OiBzdHJpbmcsIHVybDogc3RyaW5nLCBoZWFkZXJzOiBhbnksIHBhcmFtczogYW55LCBodHRwQ29uZmlnOiBhbmd1bGFyLklSZXF1ZXN0U2hvcnRjdXRDb25maWcpID0+IHtlbGVtZW50OiBhbnk7IGhlYWRlcnM6IGFueTsgcGFyYW1zOiBhbnl9KTogdm9pZDsKKyAgICAgICAgYWRkRnVsbFJlcXVlc3RJbnRlcmNlcHRvcihyZXF1ZXN0SW50ZXJjZXB0b3I6IChlbGVtZW50OiBhbnksIG9wZXJhdGlvbjogc3RyaW5nLCB3aGF0OiBzdHJpbmcsIHVybDogc3RyaW5nLCBoZWFkZXJzOiBhbnksIHBhcmFtczogYW55LCBodHRwQ29uZmlnOiBhbmd1bGFyLklSZXF1ZXN0U2hvcnRjdXRDb25maWcpID0+IHtoZWFkZXJzOiBhbnk7IHBhcmFtczogYW55OyBlbGVtZW50OiBhbnk7IGh0dHBDb25maWc6IGFuZ3VsYXIuSVJlcXVlc3RTaG9ydGN1dENvbmZpZ30pOiB2b2lkOworICAgICAgICBzZXRFcnJvckludGVyY2VwdG9yKGVycm9ySW50ZXJjZXB0b3I6IChyZXNwb25zZTogSVJlc3BvbnNlLCBkZWZlcnJlZDogYW5ndWxhci5JRGVmZXJyZWQ8YW55PikgPT4gYW55KTogdm9pZDsKKyAgICAgICAgc2V0UmVzdGFuZ3VsYXJGaWVsZHMoZmllbGRzOiB7W2ZpZWxkTmFtZTogc3RyaW5nXTogc3RyaW5nfSk6IHZvaWQ7CisgICAgICAgIHNldE1ldGhvZE92ZXJyaWRlcnMob3ZlcnJpZGVyczogc3RyaW5nW10pOiB2b2lkOworICAgICAgICBzZXRKc29ucChqc29ucDogYm9vbGVhbik6IHZvaWQ7CisgICAgICAgIHNldERlZmF1bHRSZXF1ZXN0UGFyYW1zKHBhcmFtczogYW55KTogdm9pZDsKKyAgICAgICAgc2V0RGVmYXVsdFJlcXVlc3RQYXJhbXMobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogYW55KTogdm9pZDsKKyAgICAgICAgc2V0RGVmYXVsdFJlcXVlc3RQYXJhbXMobWV0aG9kczogc3RyaW5nW10sIHBhcmFtczogYW55KTogdm9pZDsKKyAgICAgICAgc2V0RnVsbFJlc3BvbnNlKGZ1bGxSZXNwb25zZTogYm9vbGVhbik6IHZvaWQ7CisgICAgICAgIHNldERlZmF1bHRIZWFkZXJzKGhlYWRlcnM6IGFueSk6IHZvaWQ7CisgICAgICAgIHNldFJlcXVlc3RTdWZmaXgoc3VmZml4OiBzdHJpbmcpOiB2b2lkOworICAgICAgICBzZXRVc2VDYW5ub25pY2FsSWQodXNlQ2Fubm9uaWNhbElkOiBib29sZWFuKTogdm9pZDsKKyAgICAgICAgc2V0RW5jb2RlSWRzKGVuY29kZTogYm9vbGVhbik6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElDdXN0b20geworICAgICAgICBjdXN0b21HRVQocGF0aDogc3RyaW5nLCBwYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBjdXN0b21HRVRMSVNUKHBhdGg6IHN0cmluZywgcGFyYW1zPzogYW55LCBoZWFkZXJzPzogYW55KTogSUNvbGxlY3Rpb25Qcm9taXNlPGFueT47CisgICAgICAgIGN1c3RvbURFTEVURShwYXRoOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIGN1c3RvbVBPU1QoZWxlbT86IGFueSwgcGF0aD86IHN0cmluZywgcGFyYW1zPzogYW55LCBoZWFkZXJzPzogYW55KTogSVByb21pc2U8YW55PjsKKyAgICAgICAgY3VzdG9tUFVUKGVsZW0/OiBhbnksIHBhdGg/OiBzdHJpbmcsIHBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIGN1c3RvbU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcGF0aDogc3RyaW5nLCBwYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnksIGVsZW0/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBhZGRSZXN0YW5ndWxhck1ldGhvZChuYW1lOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nLCBwYXRoPzogc3RyaW5nLCBwYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnksIGVsZW0/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgIH0KKworICAgIGludGVyZmFjZSBJU2VydmljZSBleHRlbmRzIElDdXN0b20sIElQcm92aWRlciB7CisgICAgICAgIG9uZShyb3V0ZTogc3RyaW5nLCBpZD86IG51bWJlcik6IElFbGVtZW50OworICAgICAgICBvbmUocm91dGU6IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBJRWxlbWVudDsKKyAgICAgICAgb25lVXJsKHJvdXRlOiBzdHJpbmcsIHVybDogc3RyaW5nKTogSUVsZW1lbnQ7CisgICAgICAgIGFsbChyb3V0ZTogc3RyaW5nKTogSUVsZW1lbnQ7CisgICAgICAgIGFsbFVybChyb3V0ZTogc3RyaW5nLCB1cmw6IHN0cmluZyk6IElFbGVtZW50OworICAgICAgICBjb3B5KGZyb21FbGVtZW50OiBhbnkpOiBJRWxlbWVudDsKKyAgICAgICAgd2l0aENvbmZpZyhjb25maWd1cmVyOiAoUmVzdGFuZ3VsYXJQcm92aWRlcjogSVByb3ZpZGVyKSA9PiBhbnkpOiBJU2VydmljZTsKKyAgICAgICAgcmVzdGFuZ3VsYXJpemVFbGVtZW50KHBhcmVudDogYW55LCBlbGVtZW50OiBhbnksIHJvdXRlOiBzdHJpbmcsIGNvbGxlY3Rpb24/OiBhbnksIHJlcVBhcmFtcz86IGFueSk6IElFbGVtZW50OworICAgICAgICByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24ocGFyZW50OiBhbnksIGVsZW1lbnQ6IGFueSwgcm91dGU6IHN0cmluZyk6IElDb2xsZWN0aW9uOworICAgICAgICBzZXJ2aWNlKHJvdXRlOiBzdHJpbmcsIHBhcmVudD86IGFueSk6IElTZXJ2aWNlOworICAgICAgICBzdHJpcFJlc3Rhbmd1bGFyKGVsZW1lbnQ6IGFueSk6IGFueTsKKyAgICAgICAgZXh0ZW5kTW9kZWwocm91dGU6IHN0cmluZywgZXh0ZW5kZXI6IChtb2RlbDogSUVsZW1lbnQpID0+IGFueSk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIElFbGVtZW50IGV4dGVuZHMgSVNlcnZpY2UgeworICAgICAgICBnZXQocXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBnZXQ8VD4ocXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxUPjsKKyAgICAgICAgZ2V0TGlzdChzdWJFbGVtZW50PzogYW55LCBxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElDb2xsZWN0aW9uUHJvbWlzZTxhbnk+OworICAgICAgICBnZXRMaXN0PFQ+KHN1YkVsZW1lbnQ/OiBhbnksIHF1ZXJ5UGFyYW1zPzogYW55LCBoZWFkZXJzPzogYW55KTogSUNvbGxlY3Rpb25Qcm9taXNlPFQ+OworICAgICAgICBwdXQocXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBwb3N0KHN1YkVsZW1lbnQ6IGFueSwgZWxlbWVudFRvUG9zdDogYW55LCBxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIHBvc3Q8VD4oc3ViRWxlbWVudDogYW55LCBlbGVtZW50VG9Qb3N0OiBULCBxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPFQ+OworICAgICAgICBwb3N0KGVsZW1lbnRUb1Bvc3Q6IGFueSwgcXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBwb3N0PFQ+KGVsZW1lbnRUb1Bvc3Q6IFQsIHF1ZXJ5UGFyYW1zPzogYW55LCBoZWFkZXJzPzogYW55KTogSVByb21pc2U8VD47CisgICAgICAgIHJlbW92ZShxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIGhlYWQocXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICB0cmFjZShxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIG9wdGlvbnMocXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBwYXRjaChxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIGNsb25lKCk6IElFbGVtZW50OworICAgICAgICBwbGFpbigpOiBhbnk7CisgICAgICAgIHBsYWluPFQ+KCk6IFQ7CisgICAgICAgIHdpdGhIdHRwQ29uZmlnKGh0dHBDb25maWc6IGFuZ3VsYXIuSVJlcXVlc3RTaG9ydGN1dENvbmZpZyk6IElFbGVtZW50OworICAgICAgICBzYXZlKHF1ZXJ5UGFyYW1zPzogYW55LCBoZWFkZXJzPzogYW55KTogSVByb21pc2U8YW55PjsKKyAgICAgICAgZ2V0UmVzdGFuZ3VsYXJVcmwoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBJQ29sbGVjdGlvbiBleHRlbmRzIElTZXJ2aWNlLCBBcnJheTxhbnk+IHsKKyAgICAgICAgZ2V0TGlzdChxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElDb2xsZWN0aW9uUHJvbWlzZTxhbnk+OworICAgICAgICBnZXRMaXN0PFQ+KHF1ZXJ5UGFyYW1zPzogYW55LCBoZWFkZXJzPzogYW55KTogSUNvbGxlY3Rpb25Qcm9taXNlPFQ+OworICAgICAgICBwb3N0KGVsZW1lbnRUb1Bvc3Q6IGFueSwgcXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBwb3N0PFQ+KGVsZW1lbnRUb1Bvc3Q6IFQsIHF1ZXJ5UGFyYW1zPzogYW55LCBoZWFkZXJzPzogYW55KTogSVByb21pc2U8VD47CisgICAgICAgIGhlYWQocXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICB0cmFjZShxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIG9wdGlvbnMocXVlcnlQYXJhbXM/OiBhbnksIGhlYWRlcnM/OiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICBwYXRjaChxdWVyeVBhcmFtcz86IGFueSwgaGVhZGVycz86IGFueSk6IElQcm9taXNlPGFueT47CisgICAgICAgIHB1dEVsZW1lbnQoaWR4OiBhbnksIHBhcmFtczogYW55LCBoZWFkZXJzOiBhbnkpOiBJUHJvbWlzZTxhbnk+OworICAgICAgICB3aXRoSHR0cENvbmZpZyhodHRwQ29uZmlnOiBhbmd1bGFyLklSZXF1ZXN0U2hvcnRjdXRDb25maWcpOiBJQ29sbGVjdGlvbjsKKyAgICAgICAgY2xvbmUoKTogSUNvbGxlY3Rpb247CisgICAgICAgIHBsYWluKCk6IGFueTsKKyAgICAgICAgcGxhaW48VD4oKTogVFtdOworICAgICAgICBnZXRSZXN0YW5ndWxhclVybCgpOiBzdHJpbmc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2N5dG9zY2FwZS9jeXRvc2NhcGUtZXh0ZW5zaW9uLmpzIGIvY2F0YWxvZy11aS90eXBpbmdzL2N5dG9zY2FwZS9jeXRvc2NhcGUtZXh0ZW5zaW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjIyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3R5cGluZ3MvY3l0b3NjYXBlL2N5dG9zY2FwZS1leHRlbnNpb24uanMKQEAgLTAsMCArMSBAQAorLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3l0b3NjYXBlLWV4dGVuc2lvbi5qcy5tYXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3R5cGluZ3MvY3l0b3NjYXBlL2N5dG9zY2FwZS1leHRlbnNpb24uanMubWFwIGIvY2F0YWxvZy11aS90eXBpbmdzL2N5dG9zY2FwZS9jeXRvc2NhcGUtZXh0ZW5zaW9uLmpzLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWVkYTQwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90eXBpbmdzL2N5dG9zY2FwZS9jeXRvc2NhcGUtZXh0ZW5zaW9uLmpzLm1hcApAQCAtMCwwICsxIEBACit7InZlcnNpb24iOjMsImZpbGUiOiJjeXRvc2NhcGUtZXh0ZW5zaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY3l0b3NjYXBlLWV4dGVuc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3R5cGluZ3MvY3l0b3NjYXBlL2N5dG9zY2FwZS1leHRlbnNpb24udHMgYi9jYXRhbG9nLXVpL3R5cGluZ3MvY3l0b3NjYXBlL2N5dG9zY2FwZS1leHRlbnNpb24udHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4NDNhZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvdHlwaW5ncy9jeXRvc2NhcGUvY3l0b3NjYXBlLWV4dGVuc2lvbi50cwpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENyZWF0ZWQgYnkgb2JhcmRhIG9uIDEyLzIxLzIwMTYuCisgKi8KK2RlY2xhcmUgbW9kdWxlIEN5IHsKKworICAgIGludGVyZmFjZSBJbnN0YW5jZSB7CisKKyAgICAgICAgZXhwYW5kQ29sbGFwc2Uob3B0aW9ucz86IEV4cGFuZENvbGxhcHNlT3B0aW9ucyk7CisgICAgICAgIGNvbGxhcHNlQWxsKG9wdGlvbnM/OiBFeHBhbmRDb2xsYXBzZU9wdGlvbnMpOworICAgIH0KKworCisKKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbk5vZGVzIHsKKworICAgICAgICBxdGlwKHRvb2x0aXBPcHRpb25zOiBUb29sdGlwT3B0aW9uKTsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBUb29sdGlwT3B0aW9uIHsKKyAgICAgICAgY29udGVudD86IHN0cmluZyB8IEZ1bmN0aW9uOworICAgICAgICBwb3NpdGlvbj86IGFueTsKKyAgICAgICAgc3R5bGU/OiBhbnk7CisgICAgICAgIHNob3c/OmFueTsKKyAgICAgICAgaGlkZT86YW55OworICAgICAgICBpbmNsdWRlTGFiZWxzPzogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgRXhwYW5kQ29sbGFwc2VPcHRpb25zIHsKKyAgICAgICAgbGF5b3V0Qnk6YW55OworICAgICAgICBmaXNoZXllOiBib29sZWFuOworICAgICAgICB1bmRvYWJsZTogYm9vbGVhbjsKKyAgICAgICAgZXhwYW5kQ3VlSW1hZ2U6IHN0cmluZzsKKyAgICAgICAgY29sbGFwc2VDdWVJbWFnZTogc3RyaW5nOworICAgICAgICBleHBhbmRDb2xsYXBzZUN1ZVNpemU6IG51bWJlcjsKKyAgICAgICAgZXhwYW5kQ29sbGFwc2VDdWVTZW5zaXRpdml0eTogbnVtYmVyOworICAgICAgICBjdWVPZmZzZXQ6IG51bWJlcjsKKyAgICAgIC8vICBleHBhbmRDb2xsYXBzZUN1ZVBvc2l0aW9uOiBzdHJpbmc7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvdHlwaW5ncy9jeXRvc2NhcGUvY3l0b3NjYXBlLmQudHMgYi9jYXRhbG9nLXVpL3R5cGluZ3MvY3l0b3NjYXBlL2N5dG9zY2FwZS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMGI2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3R5cGluZ3MvY3l0b3NjYXBlL2N5dG9zY2FwZS5kLnRzCkBAIC0wLDAgKzEsMzA5NSBAQAorLy8gVHlwZSBkZWZpbml0aW9ucyBmb3IgQ3l0b3NjYXBlLmpzIDIuNC4yCisvLyBQcm9qZWN0OiBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8KKy8vIERlZmluaXRpb25zIGJ5OiAgRmFiaWFuIFNjaG1pZHQKKy8vCisvLyBUcmFuc2xhdGlvbiBmcm9tIE9iamVjdHMgaW4gaGVscCB0byBUeXBlc2NyaXB0IGludGVyZmFjZS4KKy8vIGN5ICAgLS0+IEN5Lkluc3RhbmNlCisvLyAgdGhlIGNvcmUKKy8vIGVsZSAgLS0+IEN5LkNvbGxlY3Rpb25GaXJzdAorLy8gIGEgY29sbGVjdGlvbiBvZiBhIHNpbmdsZSBlbGVtZW50IChub2RlIG9yIGVkZ2UpCisvLyBlbGVzIC0tPiBDeS5Db2xsZWN0aW9uCisvLyAgYSBjb2xsZWN0aW9uIG9mIG9uZSBvciBtb3JlIGVsZW1lbnRzIChub2RlcyBhbmQgZWRnZXMpCisvLyBub2RlIC0tPiBDeS5Db2xsZWN0aW9uRmlyc3ROb2RlCisvLyAgYSBjb2xsZWN0aW9uIG9mIGEgc2luZ2xlIG5vZGUKKy8vIG5vZGVzIC0+IEN5LkNvbGxlY3Rpb25Ob2RlcworLy8gIGEgY29sbGVjdGlvbiBvZiBvbmUgb3IgbW9yZSBub2RlcworLy8gZWRnZSAtLT4gQ3kuQ29sbGVjdGlvbkZpcnN0RWRnZQorLy8gIGEgY29sbGVjdGlvbiBvZiBhIHNpbmdsZSBlZGdlCisvLyBlZGdlcyAtPiBDeS5Db2xsZWN0aW9uRWRnZXMKKy8vICBhIGNvbGxlY3Rpb24gb2Ygb25lIG9yIG1vcmUgZWRnZXMKKy8vCisvLyBUaGUgbGlicmFyeSBtYWtlcyBhIGRpZmVycmVuY2UgYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlciBkdWUgdG8gdGhlIGR5bmFtaWMgYmVoYXZpb3VyIG9mIHRoZSBDeXRvc2NhcGUgbGlicmFyeS4KKy8vIEZvciBhIGlucHV0IHBhcmFtZXRlciBpdCB3aWxsIGFsd2F5cyBleHBlY3Q6CisvLyAgLSBDeS5Db2xsZWN0aW9uCisvLyAgICAgIFRoZSBpbnB1dCBjYW4gYmUgYW55IGVsZW1lbnQgKG5vZGUgYW5kIGVkZ2UpIGNvbGxlY3Rpb24uCisvLyAgLSBDeS5Db2xsZWN0aW9uTm9kZXMKKy8vICAgICAgVGhlIGlucHV0IG11c3QgYmUgYSBub2RlIGNvbGxlY3Rpb24uCisvLyAgLSBDeS5Db2xsZWN0aW9uRWRnZXMKKy8vICAgICAgVGhlIGlucHV0IG11c3QgYmUgYSBlZGdlIGNvbGxlY3Rpb24uCisvLyAgLSBDeS5Db2xsZWN0aW9uRmlyc3QKKy8vICAgICAgVGhlIGlucHV0IG11c3QgYmUgYSBzaW5nbGUgZWxlbWVudC4KKy8vICAtIEN5LkNvbGxlY3Rpb25GaXJzdE5vZGUKKy8vICAgICAgVGhlIGludXQgbXVzdCBiZSBhIHNpbmdsZSBub2RlLgorLy8gIC0gQ3kuQ29sbGVjdGlvbkZpcnN0RWRnZQorLy8gICAgICBUaGUgaW5wdXQgbXVzdCBiZSBhIHNpbmdsZSBlZGdlLgorLy8KKy8vIEZvciBhIG91dHB1dCBvZiBhIGZ1bmN0aW9uIGl0IHdpbGwgYWx3YXlzIGdpdmU6CisvLyAgLSBDeS5Db2xsZWN0aW9uRWxlbWVudHMKKy8vICAgICAgVGhlIG91dHB1dCBpcyBhIGNvbGxlY3Rpb24gb2Ygbm9kZSBhbmQgZWRnZSBlbGVtZW50cyBPUiBzaW5nbGUgZWxlbWVudC4KKy8vICAtIEN5LkNvbGxlY3Rpb25FZGdlcworLy8gICAgICBUaGUgb3V0cHV0IGlzIGEgY29sbGVjdGlvbiBvZiBlZGdlIGVsZW1lbnRzIE9SIHNpbmdsZSBlZGdlLgorLy8gIC0gQ3kuQ29sbGVjdGlvbk5vZGVzCisvLyAgICAgIFRoZSBvdXRwdXQgaXMgYSBjb2xsZWN0aW9uIG9mIG5vZGUgZWxlbWVudHMgT1Igc2luZ2xlIG5vZGUuCisKK2RlY2xhcmUgbW9kdWxlIEN5IHsKKyAgICAvKioKKyAgICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI3NlbGVjdG9ycyBmb3IgZGV0YWlscyBhYm91dCB3cml0aW5nIHNlbGVjdG9ycy4KKyAgICAgKi8KKyAgICBpbXBvcnQgQ2xpcEV4dGVudCA9IGQzLmdlby5DbGlwRXh0ZW50OworICAgIHR5cGUgU2VsZWN0b3IgPSBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBQb3NzYmlsZSB2YWx1ZXMgYXJlICdhZGRpdGl2ZScgb3IgJ3NpbmdsZScuCisgICAgICovCisgICAgdHlwZSBTZWxlY3Rpb25UeXBlID0gc3RyaW5nOworCisgICAgLyoqCisgICAgICogUG9zc2libGUgdmFsdWVzIGFyZSAnbm9kZXMnIG9yICdlZGdlcycuCisgICAgICovCisgICAgdHlwZSBFbGVtZW50R3JvdXAgPSBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlICd4JyBvciAneScuCisgICAgICovCisgICAgdHlwZSBQb3NpdGlvbkRpbWVuc2lvbiA9IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIFVzdWFsbHkgdGVtcCBvciBub25zZXJpYWxpc2FibGUgZGF0YSBjYW4gYmUgc3RvcmVkLgorICAgICAqLworICAgIHR5cGUgU2NyYXRjaHBhZCA9IGFueTsKKworICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRWxlbWVudHMgZXh0ZW5kcyBDb2xsZWN0aW9uRWRnZXMsIENvbGxlY3Rpb25Ob2RlcywgQ29sbGVjdGlvbkZpcnN0RWxlbWVudCB7CisgICAgICAgIC8vSW50ZW50aW9uYWxseSBlbXB0eS4KKyAgICB9CisKKyAgICBpbnRlcmZhY2UgRXh0ZW50IHsKKyAgICAgICAgeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkVkZ2VzIGV4dGVuZHMgQ29sbGVjdGlvbiwgQ29sbGVjdGlvbkZpcnN0RWRnZSwKKyAgICAgICAgQ29sbGVjdGlvbkVkZ2VzVHJhdmVyc2luZyB7CisgICAgfQorCisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25Ob2RlcyBleHRlbmRzIENvbGxlY3Rpb24sIENvbGxlY3Rpb25GaXJzdE5vZGUsCisgICAgICAgIENvbGxlY3Rpb25Ob2Rlc01ldGFkYXRhLCBDb2xsZWN0aW9uTm9kZXNQb3NpdGlvbiwgQ29sbGVjdGlvbk5vZGVzVHJhdmVyc2luZywgQ29sbGVjdGlvbk5vZGVzQ29tcG91bmQgeworICAgIH0KKworICAgIGludGVyZmFjZSBDb2xsZWN0aW9uIGV4dGVuZHMgQ29sbGVjdGlvbkZpcnN0LAorICAgICAgICBDb2xsZWN0aW9uTWFuaXB1bGF0aW9uLCBDb2xsZWN0aW9uRXZlbnRzLCBDb2xsZWN0aW9uRGF0YSwgQ29sbGVjdGlvblBvc2l0aW9uLCBDb2xsZWN0aW9uTGF5b3V0LCBDb2xsZWN0aW9uU2VsZWN0aW9uLCBDb2xsZWN0aW9uU3R5bGUsIENvbGxlY3Rpb25BbmltYXRpb24sIENvbGxlY3Rpb25Db21wYXJpc2lvbiwgQ29sbGVjdGlvbkl0ZXJhdGlvbiwgQ29sbGVjdGlvbkJ1aWxkaW5nVW5pb24sIENvbGxlY3Rpb25BbGdvcml0aG1zLCBDb2xsZWN0aW9uVHJhdmVyc2luZyB7CisgICAgfQorCisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25GaXJzdEVsZW1lbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRmlyc3RFZGdlLCBDb2xsZWN0aW9uRmlyc3ROb2RlIHsKKyAgICAgICAgLy9JbnRlbnRpb25hbGx5IGVtcHR5LgorICAgIH0KKworICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRmlyc3RFZGdlIGV4dGVuZHMgQ29sbGVjdGlvbkZpcnN0LAorICAgICAgICBDb2xsZWN0aW9uRmlyc3RFZGdlRGF0YSwgQ29sbGVjdGlvbkZpcnN0RWRnZVRyYXZlcnNpbmcgeworICAgIH0KKworICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRmlyc3ROb2RlIGV4dGVuZHMgQ29sbGVjdGlvbkZpcnN0LAorICAgICAgICBDb2xsZWN0aW9uRmlyc3ROb2RlTWV0YWRhdGEsIENvbGxlY3Rpb25GaXJzdE5vZGVQb3NpdGlvbiwgQ29sbGVjdGlvbkZpcnN0Tm9kZUNvbXBvdW5kIHsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkZpcnN0IGV4dGVuZHMgQ29sbGVjdGlvbkZpcnN0TWFuaXB1bGF0aW9uLCBDb2xsZWN0aW9uRmlyc3REYXRhLCBDb2xsZWN0aW9uRmlyc3RQb3NpdGlvbiwgQ29sbGVjdGlvbkZpcnN0U2VsZWN0aW9uLCBDb2xsZWN0aW9uRmlyc3RTdHlsZSwgQ29sbGVjdGlvbkZpcnRzQW5pbWF0aW9uIHsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbk1hbmlwdWxhdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGdyYXBoLgorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlKCk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHV0IHJlbW92ZWQgZWxlbWVudHMgYmFjayBpbnRvIHRoZSBncmFwaC4KKyAgICAgICAgICovCisgICAgICAgIHJlc3RvcmUoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuZXcgY29sbGVjdGlvbiBjb250YWluaW5nIGNsb25lcyAoaS5lLiBjb3BpZXMpIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmUoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgbmV3IGNvbGxlY3Rpb24gY29udGFpbmluZyBjbG9uZXMgKGkuZS4gY29waWVzKSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGNvcHkoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBFZmZlY3RpdmVseSBtb3ZlIGVkZ2VzIHRvIGRpZmZlcmVudCBub2Rlcy4gVGhlIG1vZGlmaWVkIChhY3R1YWxseSBuZXcpIGVsZW1lbnRzIGFyZSByZXR1cm5lZC4KKyAgICAgICAgICovCisgICAgICAgIG1vdmUobG9jYXRpb246IHsgc291cmNlPzogc3RyaW5nLCB0YXJnZXQ/OiBzdHJpbmcgfSk6IENvbGxlY3Rpb25FZGdlczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVmZmVjdGl2ZWx5IG1vdmUgbm9kZXMgdG8gZGlmZmVyZW50IHBhcmVudCBub2RlLiBUaGUgbW9kaWZpZWQgKGFjdHVhbGx5IG5ldykgZWxlbWVudHMgYXJlIHJldHVybmVkLgorICAgICAgICAgKi8KKyAgICAgICAgbW92ZShsb2NhdGlvbjogeyBwYXJlbnQ6IHN0cmluZyB9KTogQ29sbGVjdGlvbk5vZGVzOworICAgIH0KKworICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRXZlbnRzIHsKKyAgICAgICAgLy9UT0RPOiBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9ldmVudHMKKyAgICAgICAgLy9UT0RPOiBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9ldmVudHMKKworICAgICAgIC8vIG9uKGV2ZW50OnN0cmluZywgY2FsbGJhY2s6ICgpID0+IHZvaWQpOworCisgICAgICAgIG9uKGV2ZW50czogc3RyaW5nLCBhbnkpOworICAgIH0KKworICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRGF0YSB7CisgICAgICAgIC8vaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vZGF0YQorCisgICAgICAgIC8vICAgIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBpbW11dGFibGU6CisgICAgICAgIC8vaWQ6IFRoZSBpZCBmaWVsZCBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGVsZW1lbnQgaW4gdGhlIGdyYXBoLgorICAgICAgICAvL3NvdXJjZSAmIHRhcmdldCA6IFRoZXNlIGZpZWxkcyBkZWZpbmUgYW4gZWRnZSdzIHJlbGF0aW9uc2hpcCB0byBub2RlcywgYW5kIHRoaXMgcmVsYXRpb25zaGlwIGNhbiBub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbi4KKyAgICAgICAgLy9wYXJlbnQ6IFRoZSBwYXJlbnQgZmllbGQgZGVmaW5lcyB0aGUgcGFyZW50IChjb21wb3VuZCkgbm9kZS4KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGRldmVsb3Blci1kZWZpbmVkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZURhdGEoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGRldmVsb3Blci1kZWZpbmVkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWVzIEEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZmllbGRzIHRvIGRlbGV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZURhdGEobmFtZXM6IHN0cmluZyk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBkZXZlbG9wZXItZGVmaW5lZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICByZW1vdmVBdHRyKCk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBkZXZlbG9wZXItZGVmaW5lZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lcyBBIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZpZWxkcyB0byBkZWxldGUuCisgICAgICAgICAqLworICAgICAgICByZW1vdmVBdHRyKG5hbWVzOiBzdHJpbmcpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbiBhcnJheSBvZiB0aGUgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgYWxsIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAganNvbnMoKTogc3RyaW5nW107CisgICAgfQorICAgIGludGVyZmFjZSBDb2xsZWN0aW9uTm9kZXNNZXRhZGF0YSB7CisgICAgICAgIC8vaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vbWV0YWRhdGEKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBtYXhpbXVtIGRlZ3JlZSBvZiB0aGUgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBhIG5vZGUsIHRoZSBkZWdyZWUgaXMgdGhlIG51bWJlciBvZiBlZGdlIGNvbm5lY3Rpb25zIGl0IGhhcy4gRWFjaCB0aW1lIGEgbm9kZSBpcyByZWZlcmVuY2VkIGFzIHNvdXJjZSBvciB0YXJnZXQgb2YgYW4gZWRnZSBpbiB0aGUgZ3JhcGgsIHRoYXQgY291bnRzIGFzIGFuIGVkZ2UgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIGEgc2V0IG9mIG5vZGVzLCB0aGUgdGhlIHRvdGFsIGRlZ3JlZSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVkZ2UgY29ubmVjdGlvbnMgdG8gbm9kZXMgaW4gdGhlIHNldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluY2x1ZGVMb29wcyBBIGJvb2xlYW4sIGluZGljYXRpbmcgd2hldGhlciBsb29wcyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gZGVncmVlIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIG1heERlZ3JlZShpbmNsdWRlTG9vcHM6IGJvb2xlYW4pOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG1pbmltdW0gaW5kZWdyZWUgb2YgdGhlIG5vZGVzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgYSBub2RlLCB0aGUgaW5kZWdyZWUgaXMgdGhlIG51bWJlciBvZiBpbmNvbWluZyBlZGdlIGNvbm5lY3Rpb25zIGl0IGhhcy4gRWFjaCB0aW1lIGEgbm9kZSBpcyByZWZlcnJlZCB0byBhcyB0YXJnZXQgb2YgYW4gZWRnZSBpbiB0aGUgZ3JhcGgsIHRoYXQgY291bnRzIGFzIGFuIGluY29taW5nIGVkZ2UgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIGEgc2V0IG9mIG5vZGVzLCB0aGUgdGhlIHRvdGFsIGRlZ3JlZSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVkZ2UgY29ubmVjdGlvbnMgdG8gbm9kZXMgaW4gdGhlIHNldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluY2x1ZGVMb29wcyBBIGJvb2xlYW4sIGluZGljYXRpbmcgd2hldGhlciBsb29wcyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gZGVncmVlIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIG1pbkluZGVncmVlKGluY2x1ZGVMb29wczogYm9vbGVhbik6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbWF4aW11bSBpbmRlZ3JlZSBvZiB0aGUgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBhIG5vZGUsIHRoZSBpbmRlZ3JlZSBpcyB0aGUgbnVtYmVyIG9mIGluY29taW5nIGVkZ2UgY29ubmVjdGlvbnMgaXQgaGFzLiBFYWNoIHRpbWUgYSBub2RlIGlzIHJlZmVycmVkIHRvIGFzIHRhcmdldCBvZiBhbiBlZGdlIGluIHRoZSBncmFwaCwgdGhhdCBjb3VudHMgYXMgYW4gaW5jb21pbmcgZWRnZSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgYSBzZXQgb2Ygbm9kZXMsIHRoZSB0aGUgdG90YWwgZGVncmVlIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWRnZSBjb25uZWN0aW9ucyB0byBub2RlcyBpbiB0aGUgc2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5jbHVkZUxvb3BzIEEgYm9vbGVhbiwgaW5kaWNhdGluZyB3aGV0aGVyIGxvb3BzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiBkZWdyZWUgY2FsY3VsYXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgbWF4SW5kZWdyZWUoaW5jbHVkZUxvb3BzOiBib29sZWFuKTogbnVtYmVyOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBtaW5pbXVtIG91dGRlZ3JlZSBvZiB0aGUgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBhIG5vZGUsIHRoZSBvdXRkZWdyZWUgaXMgdGhlIG51bWJlciBvZiBvdXRnb2luZyBlZGdlIGNvbm5lY3Rpb25zIGl0IGhhcy4gRWFjaCB0aW1lIGEgbm9kZSBpcyByZWZlcnJlZCB0byBhcyBzb3VyY2Ugb2YgYW4gZWRnZSBpbiB0aGUgZ3JhcGgsIHRoYXQgY291bnRzIGFzIGFuIG91dGdvaW5nIGVkZ2UgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIGEgc2V0IG9mIG5vZGVzLCB0aGUgdGhlIHRvdGFsIGRlZ3JlZSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVkZ2UgY29ubmVjdGlvbnMgdG8gbm9kZXMgaW4gdGhlIHNldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluY2x1ZGVMb29wcyBBIGJvb2xlYW4sIGluZGljYXRpbmcgd2hldGhlciBsb29wcyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gZGVncmVlIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIG1pbk91dGRlZ3JlZShpbmNsdWRlTG9vcHM6IGJvb2xlYW4pOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG1heGltdW0gb3V0ZGVncmVlIG9mIHRoZSBub2RlcyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIGEgbm9kZSwgdGhlIG91dGRlZ3JlZSBpcyB0aGUgbnVtYmVyIG9mIG91dGdvaW5nIGVkZ2UgY29ubmVjdGlvbnMgaXQgaGFzLiBFYWNoIHRpbWUgYSBub2RlIGlzIHJlZmVycmVkIHRvIGFzIHNvdXJjZSBvZiBhbiBlZGdlIGluIHRoZSBncmFwaCwgdGhhdCBjb3VudHMgYXMgYW4gb3V0Z29pbmcgZWRnZSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgYSBzZXQgb2Ygbm9kZXMsIHRoZSB0aGUgdG90YWwgZGVncmVlIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWRnZSBjb25uZWN0aW9ucyB0byBub2RlcyBpbiB0aGUgc2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5jbHVkZUxvb3BzIEEgYm9vbGVhbiwgaW5kaWNhdGluZyB3aGV0aGVyIGxvb3BzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiBkZWdyZWUgY2FsY3VsYXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgbWF4T3V0ZGVncmVlKGluY2x1ZGVMb29wczogYm9vbGVhbik6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQm91bmRpbmdCb3ggeworICAgICAgICB4MTogbnVtYmVyOworICAgICAgICB4MjogbnVtYmVyOworICAgICAgICB5MTogbnVtYmVyOworICAgICAgICB5MjogbnVtYmVyOworICAgICAgICB3OiBudW1iZXI7CisgICAgICAgIGg6IG51bWJlcjsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25Qb3NpdGlvbiB7CisgICAgICAgIC8vaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vcG9zaXRpb24tLWRpbWVuc2lvbnMKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGVsZW1lbnRzIGluIG1vZGVsIGNvb3JkaW5hdGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyBvcHRpb25zIGZvciB0aGUgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBib3VuZGluZ0JveChvcHRpb25zOiBCb3VuZGluZ0JveE9wdGlvbnMpOiBCb3VuZGluZ0JveDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50cyBpbiBtb2RlbCBjb29yZGluYXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYm91bmRpbmdib3gob3B0aW9ucz86IEJvdW5kaW5nQm94T3B0aW9ucyk6IEJvdW5kaW5nQm94OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudHMgaW4gcmVuZGVyZWQgY29vcmRpbmF0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBjb250YWluaW5nIG9wdGlvbnMgZm9yIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkQm91bmRpbmdCb3gob3B0aW9ucz86IEJvdW5kaW5nQm94T3B0aW9ucyk6IEJvdW5kaW5nQm94OworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGVsZW1lbnRzIGluIHJlbmRlcmVkIGNvb3JkaW5hdGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyBvcHRpb25zIGZvciB0aGUgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlZEJvdW5kaW5nYm94KG9wdGlvbnM/OiBCb3VuZGluZ0JveE9wdGlvbnMpOiBCb3VuZGluZ0JveDsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25Ob2Rlc1Bvc2l0aW9uIHsKKyAgICAgICAgLy9odHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9wb3NpdGlvbi0tZGltZW5zaW9ucworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHBvc2l0aW9ucyBmdW5jdGlvbmFsbHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcG9zaXRpb24gdG8gc2V0IGZvciBlYWNoIGVsZW1lbnQuCisgICAgICAgICAqIGkgLSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgd2hlbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqIGVsZSAtIFRoZSBlbGVtZW50IGJlaW5nIGl0ZXJhdGVkIG92ZXIgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgcG9zaXRpb24gdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcG9zaXRpb25zKGNhbGxiYWNrOiAoaTogbnVtYmVyLCBlbGU6IENvbGxlY3Rpb25Ob2RlcykgPT4gUG9zaXRpb24pOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgcG9zaXRpb25zIGZvciBhbGwgbm9kZXMgYmFzZWQgb24gYSBzaW5nbGUgcG9zaXRpb24gb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcG9zIEFuIG9iamVjdCBzcGVjaWZ5aW5nIG5hbWUtdmFsdWUgcGFpcnMgcmVwcmVzZW50aW5nIGRpbWVuc2lvbnMgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcG9zaXRpb25zKHBvczogUG9zaXRpb24pOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgcG9zaXRpb25zIGZ1bmN0aW9uYWxseS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBwb3NpdGlvbiB0byBzZXQgZm9yIGVhY2ggZWxlbWVudC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB3aGVuIGl0ZXJhdGluZyBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICogZWxlIC0gVGhlIGVsZW1lbnQgYmVpbmcgaXRlcmF0ZWQgb3ZlciBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBwb3NpdGlvbiB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBtb2RlbFBvc2l0aW9ucyhjYWxsYmFjazogKGk6IG51bWJlciwgZWxlOiBDb2xsZWN0aW9uTm9kZXMpID0+IFBvc2l0aW9uKTogQ29sbGVjdGlvbk5vZGVzOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHBvc2l0aW9ucyBmb3IgYWxsIG5vZGVzIGJhc2VkIG9uIGEgc2luZ2xlIHBvc2l0aW9uIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvcyBBbiBvYmplY3Qgc3BlY2lmeWluZyBuYW1lLXZhbHVlIHBhaXJzIHJlcHJlc2VudGluZyBkaW1lbnNpb25zIHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIG1vZGVsUG9zaXRpb25zKHBvczogUG9zaXRpb24pOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgcG9zaXRpb25zIGZ1bmN0aW9uYWxseS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBwb3NpdGlvbiB0byBzZXQgZm9yIGVhY2ggZWxlbWVudC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB3aGVuIGl0ZXJhdGluZyBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICogZWxlIC0gVGhlIGVsZW1lbnQgYmVpbmcgaXRlcmF0ZWQgb3ZlciBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBwb3NpdGlvbiB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBwb2ludHMoY2FsbGJhY2s6IChpOiBudW1iZXIsIGVsZTogQ29sbGVjdGlvbk5vZGVzKSA9PiBQb3NpdGlvbik6IENvbGxlY3Rpb25Ob2RlczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBwb3NpdGlvbnMgZm9yIGFsbCBub2RlcyBiYXNlZCBvbiBhIHNpbmdsZSBwb3NpdGlvbiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3MgQW4gb2JqZWN0IHNwZWNpZnlpbmcgbmFtZS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgZGltZW5zaW9ucyB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBwb2ludHMocG9zOiBQb3NpdGlvbik6IENvbGxlY3Rpb25Ob2RlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWxsb3cgdGhlIHVzZXIgdG8gZ3JhYiB0aGUgbm9kZXMuCisgICAgICAgICAqLworICAgICAgICBncmFiaWZ5KCk6IENvbGxlY3Rpb25Ob2RlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGlzYWxsb3cgdGhlIHVzZXIgdG8gZ3JhYiB0aGUgbm9kZXMuCisgICAgICAgICAqLworICAgICAgICB1bmdyYWJpZnkoKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2NrIHRoZSBub2RlcyBzdWNoIHRoYXQgdGhlaXIgcG9zaXRpb25zIGNhbiBub3QgYmUgY2hhbmdlZC4KKyAgICAgICAgICovCisgICAgICAgIGxvY2soKTogQ29sbGVjdGlvbk5vZGVzOworICAgICAgICAvKioKKyAgICAgICAgICogVW5sb2NrIHRoZSBub2RlcyBzdWNoIHRoYXQgdGhlaXIgcG9zaXRpb25zIGNhbiBiZSBjaGFuZ2VkLgorICAgICAgICAgKi8KKyAgICAgICAgdW5sb2NrKCk6IENvbGxlY3Rpb25Ob2RlczsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25MYXlvdXQgeworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9sYXlvdXQKKworICAgICAgICAvKioKKyAgICAgICAgICogUnVuIGEgbGF5b3V0IG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLCBhbGdvcml0aG1pY2FsbHkgcG9zaXRpb25pbmcgdGhlIG5vZGVzLgorICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgcnVubmluZyBhIGxheW91dCBvbiBhIHN1YnNldCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbGF5b3V0IG9wdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBsYXlvdXQob3B0aW9uczogTGF5b3V0T3B0aW9ucyk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgbmV3IGxheW91dCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWxnb3JpdGhtaWNhbGx5IHBvc2l0aW9uIHRoZSBub2RlcyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHJ1bm5pbmcgYSBsYXlvdXQgb24gYSBzdWJzZXQgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBncmFwaCwgcGVyaGFwcyBpbiBwYXJhbGxlbCB0byBvdGhlciBsYXlvdXRzLgorICAgICAgICAgKgorICAgICAgICAgKiBZb3UgbXVzdCBzcGVjaWZ5IG9wdGlvbnMubmFtZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgeW91IHdpc2ggdG8gdXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiB0aGF0IHlvdSBtdXN0IGNhbGwgbGF5b3V0LnJ1bigpIGluIG9yZGVyIGZvciBpdCB0byBhZmZlY3QgdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbGF5b3V0IG9wdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBtYWtlTGF5b3V0KG9wdGlvbnM6IExheW91dE9wdGlvbnMpOiBMYXlvdXRJbnN0YW5jZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIG5ldyBsYXlvdXQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFsZ29yaXRobWljYWxseSBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBydW5uaW5nIGEgbGF5b3V0IG9uIGEgc3Vic2V0IG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgZ3JhcGgsIHBlcmhhcHMgaW4gcGFyYWxsZWwgdG8gb3RoZXIgbGF5b3V0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogWW91IG11c3Qgc3BlY2lmeSBvcHRpb25zLm5hbWUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IHlvdSB3aXNoIHRvIHVzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogdGhhdCB5b3UgbXVzdCBjYWxsIGxheW91dC5ydW4oKSBpbiBvcmRlciBmb3IgaXQgdG8gYWZmZWN0IHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGxheW91dCBvcHRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgY3JlYXRlTGF5b3V0KG9wdGlvbnM6IExheW91dE9wdGlvbnMpOiBMYXlvdXRJbnN0YW5jZTsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25TZWxlY3Rpb24geworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9zZWxlY3Rpb24KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFrZSB0aGUgZWxlbWVudHMgc2VsZWN0ZWQgKE5CIG90aGVyIGVsZW1lbnRzIG91dHNpZGUgdGhlIGNvbGxlY3Rpb24gYXJlIG5vdCBhZmZlY3RlZCkuCisgICAgICAgICAqLworICAgICAgICBzZWxlY3QoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYWtlIHRoZSBlbGVtZW50cyBub3Qgc2VsZWN0ZWQgKE5CIG90aGVyIGVsZW1lbnRzIG91dHNpZGUgdGhlIGNvbGxlY3Rpb24gYXJlIG5vdCBhZmZlY3RlZCkuCisgICAgICAgICAqLworICAgICAgICB1bnNlbGVjdCgpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBNYWtlIHRoZSBlbGVtZW50cyBub3Qgc2VsZWN0ZWQgKE5CIG90aGVyIGVsZW1lbnRzIG91dHNpZGUgdGhlIGNvbGxlY3Rpb24gYXJlIG5vdCBhZmZlY3RlZCkuCisgICAgICAgICAqLworICAgICAgICBkZXNlbGVjdCgpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2UgdGhlIHNlbGVjdGlvbiBzdGF0ZXMgb2YgdGhlIGVsZW1lbnRzIG11dGFibGUuCisgICAgICAgICAqLworICAgICAgICBzZWxlY3RpZnkoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYWtlIHRoZSBzZWxlY3Rpb24gc3RhdGVzIG9mIHRoZSBlbGVtZW50cyBpbW11dGFibGUuCisgICAgICAgICAqLworICAgICAgICB1bnNlbGVjdGlmeSgpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgfQorICAgIGludGVyZmFjZSBDb2xsZWN0aW9uU3R5bGUgeworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9zdHlsZQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgY2xhc3NlcyB0byBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsYXNzZXMgQSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBuYW1lcyB0byBhZGQgdG8gdGhlIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgYWRkQ2xhc3MoY2xhc3Nlczogc3RyaW5nKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgY2xhc3NlcyBmcm9tIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xhc3NlcyBBIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzIG5hbWVzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZUNsYXNzKGNsYXNzZXM6IHN0cmluZyk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogVG9nZ2xlIHdoZXRoZXIgdGhlIGVsZW1lbnRzIGhhdmUgdGhlIHNwZWNpZmllZCBjbGFzc2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xhc3NlcyBBIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzIG5hbWVzIHRvIHRvZ2dsZSBvbiB0aGUgZWxlbWVudHMuCisgICAgICAgICAqIEBwYXJhbSB0b2dnbGUgW29wdGlvbmFsXSBJbnN0ZWFkIG9mIGF1dG9tYXRpY2FsbHkgdG9nZ2xpbmcsIGFkZHMgdGhlIGNsYXNzZXMgb24gdHJ1dGh5IHZhbHVlcyBvciByZW1vdmVzIHRoZW0gb24gZmFsc2V5IHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHRvZ2dsZUNsYXNzKGNsYXNzZXM6IHN0cmluZywgdG9nZ2xlPzogYm9vbGVhbik6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGNsYXNzZXMgdG8gdGhlIGVsZW1lbnRzLCBhbmQgdGhlbiByZW1vdmUgdGhlIGNsYXNzZXMgYWZ0ZXIgYSBzcGVjaWZpZWQgZHVyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGFzc2VzIEEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3MgbmFtZXMgdG8gZmxhc2ggb24gdGhlIGVsZW1lbnRzLgorICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gW29wdGlvbmFsXSBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGhlIGNsYXNzZXMgc2hvdWxkIGJlIGFkZGVkIG9uIHRoZSBlbGVtZW50cy4gQWZ0ZXIgdGhlIGR1cmF0aW9uLCB0aGUgY2xhc3NlcyBhcmUgcmVtb3ZlZC4KKyAgICAgICAgICovCisgICAgICAgIGZsYXNoQ2xhc3MoY2xhc3Nlczogc3RyaW5nLCBkdXJhdGlvbj86IG51bWJlcik6IENvbGxlY3Rpb25FbGVtZW50czsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuYW1lLXZhbHVlIHBhaXIgb2JqZWN0IGNvbnRhaW5pbmcgdmlzdWFsIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcyBmb3IgdGhlIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBzdHlsZSgpOiBDc3MuRWxlbWVudENzczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIHBhcnRpY3VsYXIgc3R5bGUgcHJvcGVydHkgdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB2aXN1YWwgc3R5bGUgcHJvcGVydHkgdG8gZ2V0LgorICAgICAgICAgKi8KKyAgICAgICAgc3R5bGUobmFtZTogc3RyaW5nKTogQ3NzLkVsZW1lbnRDc3M7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIG5hbWUtdmFsdWUgcGFpciBvYmplY3QgY29udGFpbmluZyB2aXN1YWwgc3R5bGUgcHJvcGVydGllcyBhbmQgdGhlaXIgdmFsdWVzIGZvciB0aGUgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIGNzcygpOiBDc3MuRWxlbWVudENzczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIHBhcnRpY3VsYXIgc3R5bGUgcHJvcGVydHkgdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB2aXN1YWwgc3R5bGUgcHJvcGVydHkgdG8gZ2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY3NzKG5hbWU6IHN0cmluZyk6IENzcy5FbGVtZW50Q3NzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuYW1lLXZhbHVlIHBhaXIgb2JqZWN0IGNvbnRhaW5pbmcgdmlzdWFsIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcyBmb3IgdGhlIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBieXBhc3MoKTogQ3NzLkVsZW1lbnRDc3M7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBwYXJ0aWN1bGFyIHN0eWxlIHByb3BlcnR5IHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmlzdWFsIHN0eWxlIHByb3BlcnR5IHRvIGdldC4KKyAgICAgICAgICovCisgICAgICAgIGJ5cGFzcyhuYW1lOiBzdHJpbmcpOiBDc3MuRWxlbWVudENzczsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCB2aXN1YWwgc3R5bGUgcHJvcGVydHkgZm9yIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB2ZXJ5IHNwYXJpbmdseSwgYmVjYXVzZSBpdCBvdmVycmlkZXMgdGhlIHN0eWxlIG9mIGFuIGVsZW1lbnQsIGRlc3BpdGUgdGhlIHN0YXRlIGFuZCBjbGFzc2VzIHRoYXQgaXQgaGFzLiBJbiBnZW5lcmFsLCBpdCdzIG11Y2ggYmV0dGVyIHRvIHNwZWNpZnkgYSBiZXR0ZXIgc3R5bGVzaGVldCBhdCBpbml0aWFsaXNhdGlvbiB0aGF0IHJlZmxlY3RzIHlvdXIgYXBwbGljYXRpb24gc3RhdGUgcmF0aGVyIHRoYW4gcHJvZ3JhbW1hdGljYWxseSBtb2RpZnlpbmcgc3R5bGUuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlbW92ZSBhIHBhcnRpY3VsYXIgb3ZlcnJpZGRlbiBzdHlsZSBwcm9wZXJ0eSwgc2V0IG51bGwgdG8gaXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSB2aXN1YWwgc3R5bGUgcHJvcGVydHkuCisgICAgICAgICAqLworICAgICAgICBzdHlsZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgc2V2ZXJhbCB2aXN1YWwgc3R5bGUgcHJvcGVydGllcyBhdCBvbmNlIGZvciB0aGUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gdmVyeSBzcGFyaW5nbHksIGJlY2F1c2UgaXQgb3ZlcnJpZGVzIHRoZSBzdHlsZSBvZiBhbiBlbGVtZW50LCBkZXNwaXRlIHRoZSBzdGF0ZSBhbmQgY2xhc3NlcyB0aGF0IGl0IGhhcy4gSW4gZ2VuZXJhbCwgaXQncyBtdWNoIGJldHRlciB0byBzcGVjaWZ5IGEgYmV0dGVyIHN0eWxlc2hlZXQgYXQgaW5pdGlhbGlzYXRpb24gdGhhdCByZWZsZWN0cyB5b3VyIGFwcGxpY2F0aW9uIHN0YXRlIHJhdGhlciB0aGFuIHByb2dyYW1tYXRpY2FsbHkgbW9kaWZ5aW5nIHN0eWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB5b3Ugd291bGQgbGlrZSB0byByZW1vdmUgYSBwYXJ0aWN1bGFyIG92ZXJyaWRkZW4gc3R5bGUgcHJvcGVydHksIHNldCBudWxsIHRvIGl0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvcHMgQW4gb2JqZWN0IHdpdGggbmFtZS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgcHJvcGVydGllcyB0byBzZXQgb24gdGhlIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgc3R5bGUocHJvcHM6IENzcy5FbGVtZW50Q3NzKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCB2aXN1YWwgc3R5bGUgcHJvcGVydHkgZm9yIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB2ZXJ5IHNwYXJpbmdseSwgYmVjYXVzZSBpdCBvdmVycmlkZXMgdGhlIHN0eWxlIG9mIGFuIGVsZW1lbnQsIGRlc3BpdGUgdGhlIHN0YXRlIGFuZCBjbGFzc2VzIHRoYXQgaXQgaGFzLiBJbiBnZW5lcmFsLCBpdCdzIG11Y2ggYmV0dGVyIHRvIHNwZWNpZnkgYSBiZXR0ZXIgc3R5bGVzaGVldCBhdCBpbml0aWFsaXNhdGlvbiB0aGF0IHJlZmxlY3RzIHlvdXIgYXBwbGljYXRpb24gc3RhdGUgcmF0aGVyIHRoYW4gcHJvZ3JhbW1hdGljYWxseSBtb2RpZnlpbmcgc3R5bGUuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlbW92ZSBhIHBhcnRpY3VsYXIgb3ZlcnJpZGRlbiBzdHlsZSBwcm9wZXJ0eSwgc2V0IG51bGwgdG8gaXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSB2aXN1YWwgc3R5bGUgcHJvcGVydHkuCisgICAgICAgICAqLworICAgICAgICBjc3MobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHNldmVyYWwgdmlzdWFsIHN0eWxlIHByb3BlcnRpZXMgYXQgb25jZSBmb3IgdGhlIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBZb3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHZlcnkgc3BhcmluZ2x5LCBiZWNhdXNlIGl0IG92ZXJyaWRlcyB0aGUgc3R5bGUgb2YgYW4gZWxlbWVudCwgZGVzcGl0ZSB0aGUgc3RhdGUgYW5kIGNsYXNzZXMgdGhhdCBpdCBoYXMuIEluIGdlbmVyYWwsIGl0J3MgbXVjaCBiZXR0ZXIgdG8gc3BlY2lmeSBhIGJldHRlciBzdHlsZXNoZWV0IGF0IGluaXRpYWxpc2F0aW9uIHRoYXQgcmVmbGVjdHMgeW91ciBhcHBsaWNhdGlvbiBzdGF0ZSByYXRoZXIgdGhhbiBwcm9ncmFtbWF0aWNhbGx5IG1vZGlmeWluZyBzdHlsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgeW91IHdvdWxkIGxpa2UgdG8gcmVtb3ZlIGEgcGFydGljdWxhciBvdmVycmlkZGVuIHN0eWxlIHByb3BlcnR5LCBzZXQgbnVsbCB0byBpdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb3BzIEFuIG9iamVjdCB3aXRoIG5hbWUtdmFsdWUgcGFpcnMgcmVwcmVzZW50aW5nIHByb3BlcnRpZXMgdG8gc2V0IG9uIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIGNzcyhwcm9wczogQ3NzLkVsZW1lbnRDc3MpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIHZpc3VhbCBzdHlsZSBwcm9wZXJ0eSBmb3IgdGhlIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBZb3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHZlcnkgc3BhcmluZ2x5LCBiZWNhdXNlIGl0IG92ZXJyaWRlcyB0aGUgc3R5bGUgb2YgYW4gZWxlbWVudCwgZGVzcGl0ZSB0aGUgc3RhdGUgYW5kIGNsYXNzZXMgdGhhdCBpdCBoYXMuIEluIGdlbmVyYWwsIGl0J3MgbXVjaCBiZXR0ZXIgdG8gc3BlY2lmeSBhIGJldHRlciBzdHlsZXNoZWV0IGF0IGluaXRpYWxpc2F0aW9uIHRoYXQgcmVmbGVjdHMgeW91ciBhcHBsaWNhdGlvbiBzdGF0ZSByYXRoZXIgdGhhbiBwcm9ncmFtbWF0aWNhbGx5IG1vZGlmeWluZyBzdHlsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgeW91IHdvdWxkIGxpa2UgdG8gcmVtb3ZlIGEgcGFydGljdWxhciBvdmVycmlkZGVuIHN0eWxlIHByb3BlcnR5LCBzZXQgbnVsbCB0byBpdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgdG8gdGhlIHZpc3VhbCBzdHlsZSBwcm9wZXJ0eS4KKyAgICAgICAgICovCisgICAgICAgIGJ5cGFzcyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgc2V2ZXJhbCB2aXN1YWwgc3R5bGUgcHJvcGVydGllcyBhdCBvbmNlIGZvciB0aGUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gdmVyeSBzcGFyaW5nbHksIGJlY2F1c2UgaXQgb3ZlcnJpZGVzIHRoZSBzdHlsZSBvZiBhbiBlbGVtZW50LCBkZXNwaXRlIHRoZSBzdGF0ZSBhbmQgY2xhc3NlcyB0aGF0IGl0IGhhcy4gSW4gZ2VuZXJhbCwgaXQncyBtdWNoIGJldHRlciB0byBzcGVjaWZ5IGEgYmV0dGVyIHN0eWxlc2hlZXQgYXQgaW5pdGlhbGlzYXRpb24gdGhhdCByZWZsZWN0cyB5b3VyIGFwcGxpY2F0aW9uIHN0YXRlIHJhdGhlciB0aGFuIHByb2dyYW1tYXRpY2FsbHkgbW9kaWZ5aW5nIHN0eWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB5b3Ugd291bGQgbGlrZSB0byByZW1vdmUgYSBwYXJ0aWN1bGFyIG92ZXJyaWRkZW4gc3R5bGUgcHJvcGVydHksIHNldCBudWxsIHRvIGl0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvcHMgQW4gb2JqZWN0IHdpdGggbmFtZS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgcHJvcGVydGllcyB0byBzZXQgb24gdGhlIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgYnlwYXNzKHByb3BzOiBDc3MuRWxlbWVudENzcyk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhbGwgb3ZlcnJpZGRlbiBzdHlsZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICByZW1vdmVTdHlsZSgpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIHBhcnRpY3VsYXIgb3ZlcnJpZGRlbiBzdHlsZSBwcm9wZXJ0aWVzIG9mIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWVzIEEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMgZm9yIHdoaWNoIG92ZXJyaWRkZW4gc3R5bGVzIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZVN0eWxlKG5hbWVzOiBzdHJpbmcpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGFsbCBvdmVycmlkZGVuIHN0eWxlIG9mIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZUNzcygpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIHBhcnRpY3VsYXIgb3ZlcnJpZGRlbiBzdHlsZSBwcm9wZXJ0aWVzIG9mIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWVzIEEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMgZm9yIHdoaWNoIG92ZXJyaWRkZW4gc3R5bGVzIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZUNzcyhuYW1lczogc3RyaW5nKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhbGwgb3ZlcnJpZGRlbiBzdHlsZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICByZW1vdmVCeXBhc3MoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBwYXJ0aWN1bGFyIG92ZXJyaWRkZW4gc3R5bGUgcHJvcGVydGllcyBvZiB0aGUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lcyBBIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIGZvciB3aGljaCBvdmVycmlkZGVuIHN0eWxlcyB3aWxsIGJlIHJlbW92ZWQuCisgICAgICAgICAqLworICAgICAgICByZW1vdmVCeXBhc3MobmFtZXM6IHN0cmluZyk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25BbmltYXRpb24geworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9hbmltYXRpb24KKworICAgICAgICAvKioKKyAgICAgICAgICogQW5pbWF0ZSB0aGUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgb25seSBvbmUgb2YgcG9zaXRpb24gYW5kIHJlbmRlcmVkUG9zaXRpb246IFlvdSBjYW4gbm90IGFuaW1hdGUgdG8gdHdvIHBvc2l0aW9ucyBhdCBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pcyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGV0YWlscyBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKiBwb3NpdGlvbiAtIEEgcG9zaXRpb24gdG8gd2hpY2ggdGhlIGVsZW1lbnRzIHdpbGwgYmUgYW5pbWF0ZWQuCisgICAgICAgICAqIHJlbmRlcmVkUG9zaXRpb24gLSBBIHJlbmRlcmVkIHBvc2l0aW9uIHRvIHdoaWNoIHRoZSBlbGVtZW50cyB3aWxsIGJlICBhbmltYXRlZC4KKyAgICAgICAgICogc3R5bGUgLSBBbiBvYmplY3QgY29udGFpbmluZyBuYW1lLXZhbHVlIHBhaXJzIG9mIHN0eWxlIHByb3BlcnRpZXMgdG8gYW5pbWF0ZS4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYW5pbWF0aW9uIG9wdGlvbnMuCisgICAgICAgICAqIGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorICAgICAgICAgKiBxdWV1ZSAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcXVldWUgdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICogY29tcGxldGUgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGRvbmUuCisgICAgICAgICAqIHN0ZXAgLSBBIGZ1bmN0aW9uIHRvIGNhbGwgZWFjaCB0aW1lIHRoZSBhbmltYXRpb24gc3RlcHMuCisgICAgICAgICAqLworICAgICAgICBhbmltYXRlKGFuaXM6IHsKKyAgICAgICAgICAgIHBvc3Rpb24/OiBQb3NpdGlvbiwKKyAgICAgICAgICAgIHJlbmRlcmVkUG9zaXRpb24/OiBQb3NpdGlvbiwKKyAgICAgICAgICAgIHN0eWxlPzogQ3NzLkVsZW1lbnRDc3MKKyAgICAgICAgfSwgb3B0aW9ucz86IHsKKyAgICAgICAgICAgIGR1cmF0aW9uPzogbnVtYmVyLAorICAgICAgICAgICAgcXVldWU/OiBib29sZWFuLAorICAgICAgICAgICAgY29tcGxldGU/OiAoKSA9PiB2b2lkLAorICAgICAgICAgICAgc3RlcD86ICgpID0+IHZvaWQKKyAgICAgICAgfSk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgZGVsYXkgYmV0d2VlbiBhbmltYXRpb25zIGZvciB0aGUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkdXJhdGlvbiBIb3cgbG9uZyB0aGUgZGVsYXkgc2hvdWxkIGJlIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBkZWxheSBpcyBjb21wbGV0ZS4KKyAgICAgICAgICovCisgICAgICAgIGRlbGF5KGR1cmF0aW9uOiBudW1iZXIsIGNvbXBsZXRlPzogKCkgPT4gdm9pZCk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcCBhbGwgYW5pbWF0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgcnVubmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsZWFyUXVldWUgQSBib29sZWFuLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHF1ZXVlIG9mIGFuaW1hdGlvbnMgc2hvdWxkIGJlIGVtcHRpZWQuCisgICAgICAgICAqIEBwYXJhbSBqdW1wVG9FbmQgQSBib29sZWFuLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnMgc2hvdWxkIGp1bXAgdG8gdGhlaXIgZW5kcyByYXRoZXIgdGhhbiBqdXN0IHN0b3BwaW5nIG1pZHdheS4KKyAgICAgICAgICovCisgICAgICAgIHN0b3AoY2xlYXJRdWV1ZT86IGJvb2xlYW4sIGp1bXBUb0VuZD86IGJvb2xlYW4pOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBhbGwgcXVldWVkIGFuaW1hdGlvbnMgZm9yIHRoZSBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIGNsZWFyUXVldWUoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbXBhcmlzaW9uIHsKKyAgICAgICAgLy8gaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vY29tcGFyaXNvbgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBhcyBhbm90aGVyIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVzIFRoZSBvdGhlciBlbGVtZW50cyB0byBjb21wYXJlIHRvLgorICAgICAgICAgKi8KKyAgICAgICAgc2FtZShlbGVzOiBDb2xsZWN0aW9uKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5zIGFueSBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcyBhbm90aGVyIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVzIFRoZSBvdGhlciBlbGVtZW50cyB0byBjb21wYXJlIHRvLgorICAgICAgICAgKi8KKyAgICAgICAgYW55U2FtZShlbGVzOiBDb2xsZWN0aW9uKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYWxsIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhcmUgaW4gdGhlIG5laWdoYm91cmhvb2Qgb2YgdGhlIGNhbGxpbmcgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZXMgVGhlIG90aGVyIGVsZW1lbnRzIHRvIGNvbXBhcmUgdG8uCisgICAgICAgICAqLworICAgICAgICBhbGxBcmVOZWlnaGJvcnMoZWxlczogQ29sbGVjdGlvbik6IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhbGwgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFyZSBpbiB0aGUgbmVpZ2hib3VyaG9vZCBvZiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlcyBUaGUgb3RoZXIgZWxlbWVudHMgdG8gY29tcGFyZSB0by4KKyAgICAgICAgICovCisgICAgICAgIGFsbEFyZU5laWdoYm91cnMoZWxlczogQ29sbGVjdGlvbik6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERldGVybWluZSB3aGV0aGVyIGFueSBlbGVtZW50IGluIHRoaXMgY29sbGVjdGlvbiBtYXRjaGVzIGEgc2VsZWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICAgICAgICovCisgICAgICAgIGlzKHNlbGVjdG9yOiBTZWxlY3Rvcik6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERldGVybWluZSB3aGV0aGVyIGFsbCBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBtYXRjaCBhIHNlbGVjdG9yLgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoIGFnYWluc3QuCisgICAgICAgICAqLworICAgICAgICBhbGxBcmUoc2VsZWN0b3I6IFNlbGVjdG9yKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGVsZW1lbnQgaW4gdGhpcyBjb2xsZWN0aW9uIHNhdGlzZmllcyB0aGUgc3BlY2lmaWVkIHRlc3QgZnVuY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0ZXN0IFRoZSB0ZXN0IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnV0aHkgdmFsdWVzIGZvciBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHRlc3QgYW5kIGZhbHNleSB2YWx1ZXMgZm9yIGVsZW1lbnRzIHRoYXQgZG8gbm90IHNhdGlzZnkgdGhlIHRlc3QuCisgICAgICAgICAqIGVsZSAtIFRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgICAgICAqIGkgLSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgICAgICogZWxlcyAtIFRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGJlaW5nIHRlc3RlZC4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgW29wdGlvbmFsXSBUaGUgdmFsdWUgZm9yIHRoaXMgd2l0aGluIHRoZSB0ZXN0IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc29tZSh0ZXN0OiAoZWxlOiBDb2xsZWN0aW9uRWxlbWVudHMsIGk6IG51bWJlciwgZWxlczogQ29sbGVjdGlvbkVsZW1lbnRzKSA9PiBib29sZWFuLCB0aGlzQXJnPzogYW55KTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYWxsIGVsZW1lbnRzIGluIHRoaXMgY29sbGVjdGlvbiBzYXRpc2Z5IHRoZSBzcGVjaWZpZWQgdGVzdCBmdW5jdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRlc3QgVGhlIHRlc3QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydXRoeSB2YWx1ZXMgZm9yIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgdGVzdCBhbmQgZmFsc2V5IHZhbHVlcyBmb3IgZWxlbWVudHMgdGhhdCBkbyBub3Qgc2F0aXNmeSB0aGUgdGVzdC4KKyAgICAgICAgICogZWxlIC0gVGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50LgorICAgICAgICAgKiBlbGVzIC0gVGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgYmVpbmcgdGVzdGVkLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBbb3B0aW9uYWxdIFRoZSB2YWx1ZSBmb3IgdGhpcyB3aXRoaW4gdGhlIHRlc3QgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBldmVyeSh0ZXN0OiAoZWxlOiBDb2xsZWN0aW9uRWxlbWVudHMsIGk6IG51bWJlciwgZWxlczogQ29sbGVjdGlvbkVsZW1lbnRzKSA9PiBib29sZWFuLCB0aGlzQXJnPzogYW55KTogYm9vbGVhbjsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25JdGVyYXRpb24geworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9pdGVyYXRpb24KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBzaXplKCk6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgbGVuZ3RoOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LCBtZWFuaW5nIGl0IGhhcyBubyBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIGVtcHR5KCk6IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB0aGUgY29sbGVjdGlvbiBpcyBub25lbXB0eSwgbWVhbmluZyBpdCBoYXMgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBub25lbXB0eSgpOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBjb252ZW5pZW50IGluIHNvbWUgY2FzZXMsIGl0IGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gbWFraW5nIHlvdXIgb3duIGxvb3AuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlYWNoIFRoZSBmdW5jdGlvbiBleGVjdXRlZCBlYWNoIGl0ZXJhdGlvbi4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICogZWxlIC0gVGhlIGVsZW1lbnQgYXQgdGhlIGN1cnJlbnQgaW5kZXguCisgICAgICAgICAqLworICAgICAgICBlYWNoKGVhY2g6IChpOiBudW1iZXIsIGVsZTogQ29sbGVjdGlvbkVsZW1lbnRzKSA9PiB2b2lkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiB1c2luZyBhbiBpbXBsZW1lbnRhdGlvbiBsaWtlIHRoZSBuYXRpdmUgYXJyYXkgZnVuY3Rpb24gbmFtZXNha2UuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKCkgd2l0aCBtaW5vciBjaGFuZ2VzIGZvciBjb252ZW5pZW5jZToKKyAgICAgICAgICogWW91IGNhbiBleGl0IHRoZSBpdGVyYXRpb24gZWFybHkgYnkgcmV0dXJuaW5nIGZhbHNlIGluIHRoZSBpdGVyYXRpbmcgZnVuY3Rpb24uIFRoZSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCgpIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhpcywgYnV0IGl0IGlzIGluY2x1ZGVkIGFueXdheSBvbiBhY2NvdW50IG9mIGl0cyB1dGlsaXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWFjaCBUaGUgZnVuY3Rpb24gZXhlY3V0ZWQgZWFjaCBpdGVyYXRpb24uCisgICAgICAgICAqIGVsZSAtIFRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgICAgICAqIGkgLSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgICAgICogZWxlcyAtIFRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGJlaW5nIGl0ZXJhdGVkLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBbb3B0aW9uYWxdIFRoZSB2YWx1ZSBmb3IgdGhpcyB3aXRoaW4gdGhlIGl0ZXJhdGluZyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2goZWFjaDogKGVsZTogQ29sbGVjdGlvbkVsZW1lbnRzLCBpOiBudW1iZXIsIGVsZXM6IENvbGxlY3Rpb25FbGVtZW50cykgPT4gdm9pZHxib29sZWFuLCB0aGlzQXJnPzogYW55KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGFuIGVsZW1lbnQgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBZb3UgbWF5IHVzZSBlbGVzW2ldIGluIHBsYWNlIG9mIGVsZXMuZXEoaSkgYXMgYSBtb3JlIHBlcmZvcm1hbnQgYWx0ZXJuYXRpdmUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gZ2V0LgorICAgICAgICAgKi8KKyAgICAgICAgZXEoaW5kZXg6IG51bWJlcik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbiBlbGVtZW50IGF0IGEgcGFydGljdWxhciBpbmRleCBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBnZXQuCisgICAgICAgICAqLworICAgICAgICBbaW5kZXg6IG51bWJlcl06IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGZpcnN0KCk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgbGFzdCgpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIHN1YnNldCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gYmFzZWQgb24gc3BlY2lmaWVkIGluZGljZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBbb3B0aW9uYWxdIEFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgd2hlcmUgdG8gc3RhcnQgdGhlIHNlbGVjdGlvbi4gVGhlIGZpcnN0IGVsZW1lbnQgaGFzIGFuIGluZGV4IG9mIDAuIFVzZSBuZWdhdGl2ZSBudW1iZXJzIHRvIHNlbGVjdCBmcm9tIHRoZSBlbmQgb2YgYW4gYXJyYXkuCisgICAgICAgICAqIEBwYXJhbSBlbmQgW29wdGlvbmFsXSBBbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHdoZXJlIHRvIGVuZCB0aGUgc2VsZWN0aW9uLiBJZiBvbWl0dGVkLCBhbGwgZWxlbWVudHMgZnJvbSB0aGUgc3RhcnQgcG9zaXRpb24gYW5kIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IHdpbGwgYmUgc2VsZWN0ZWQuIFVzZSBuZWdhdGl2ZSBudW1iZXJzIHRvIHNlbGVjdCBmcm9tIHRoZSBlbmQgb2YgYW4gYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBzbGljZShzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkJ1aWxkaW5nVW5pb24geworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgbmV3IGNvbGxlY3Rpb24sIHJlc3VsdGluZyBmcm9tIGFkZGluZyB0aGUgY29sbGVjdGlvbiB3aXRoIGFub3RoZXIgb25lCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVzIFRoZSBlbGVtZW50cyB0byBhZGQuCisgICAgICAgICAqLworICAgICAgICAoZWxlczogQ29sbGVjdGlvbik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIG5ldyBjb2xsZWN0aW9uLCByZXN1bHRpbmcgZnJvbSBhZGRpbmcgdGhlIGNvbGxlY3Rpb24gd2l0aCBhbm90aGVyIG9uZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlc0FycmF5IEFuIGFycmF5IG9mIGVsZW1lbnRzIHRvIGFkZC4KKyAgICAgICAgICovCisgICAgICAgIChlbGVzQXJyYXk6IENvbGxlY3Rpb25bXSk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIG5ldyBjb2xsZWN0aW9uLCByZXN1bHRpbmcgZnJvbSBhZGRpbmcgdGhlIGNvbGxlY3Rpb24gd2l0aCBhbm90aGVyIG9uZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgRWxlbWVudHMgaW4gdGhlIGdyYXBoIG1hdGNoaW5nIHRoaXMgc2VsZWN0b3IgYXJlIGFkZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgKHNlbGVjdG9yOiBTZWxlY3Rvcik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25CdWlsZGluZ0RpZmZlcmVuY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgbmV3IGNvbGxlY3Rpb24sIHJlc3VsdGluZyBmcm9tIHRoZSBjb2xsZWN0aW9uIHdpdGhvdXQgc29tZSBzcGVjaWZpZWQgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVzIFRoZSBlbGVtZW50cyB0aGF0IHdpbGwgbm90IGJlIGluIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIChlbGVzOiBDb2xsZWN0aW9uKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgbmV3IGNvbGxlY3Rpb24sIHJlc3VsdGluZyBmcm9tIHRoZSBjb2xsZWN0aW9uIHdpdGhvdXQgc29tZSBzcGVjaWZpZWQgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBFbGVtZW50cyBmcm9tIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb24gbWF0Y2hpbmcgdGhpcyBzZWxlY3RvciB3aWxsIG5vdCBiZSBpbiB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICAoc2VsZWN0b3I6IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkJ1aWxkaW5nSW50ZXJzZWN0aW9uIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZWxlbWVudHMgaW4gYm90aCB0aGlzIGNvbGxlY3Rpb24gYW5kIGFub3RoZXIgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVzIFRoZSBlbGVtZW50cyB0byBpbnRlcnNlY3Qgd2l0aC4KKyAgICAgICAgICovCisgICAgICAgIChlbGVzOiBDb2xsZWN0aW9uKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBlbGVtZW50cyBpbiBib3RoIHRoaXMgY29sbGVjdGlvbiBhbmQgYW5vdGhlciBzcGVjaWZpZWQgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50cyB0byBpbnRlcnNlY3Qgd2l0aC4gQWxsIGVsZW1lbnRzIGluIHRoZSBncmFwaCBtYXRjaGluZyB0aGUgc2VsZWN0b3IgYXJlIHVzZWQgYXMgdGhlIHBhc3NlZCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgKHNlbGVjdG9yOiBTZWxlY3Rvcik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25TeW1tZXRyaWNEaWZmZXJlbmNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbiBvciB0aGUgcGFzc2VkIGNvbGxlY3Rpb24gYnV0IG5vdCBpbiBib3RoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlcyBUaGUgZWxlbWVudHMgdG8gYXBwbHkgdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIHdpdGguCisgICAgICAgICAqLworICAgICAgICAoZWxlczogQ29sbGVjdGlvbik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbiBvciB0aGUgcGFzc2VkIGNvbGxlY3Rpb24gYnV0IG5vdCBpbiBib3RoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzZWxlY3RvciByZXByZXNlbnRpbmcgdGhlIGVsZW1lbnRzIHRvIGFwcGx5IHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSB3aXRoLiBBbGwgZWxlbWVudHMgaW4gdGhlIGdyYXBoIG1hdGNoaW5nIHRoZSBzZWxlY3RvciBhcmUgdXNlZCBhcyB0aGUgcGFzc2VkIGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICAoc2VsZWN0b3I6IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkJ1aWxkaW5nVW5pb24geworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9idWlsZGluZy0tZmlsdGVyaW5nCisKKyAgICAgICAgdW5pb246IENvbGxlY3Rpb25CdWlsZGluZ1VuaW9uOworICAgICAgICAvL1tpbmRleDogInUiXTogQ29sbGVjdGlvbkJ1aWxkaW5nVW5pb247CisgICAgICAgIGFkZDogQ29sbGVjdGlvbkJ1aWxkaW5nVW5pb247CisgICAgICAgIC8vW2luZGV4OiAiKyJdOiBDb2xsZWN0aW9uQnVpbGRpbmdVbmlvbjsKKyAgICAgICAgb3I6IENvbGxlY3Rpb25CdWlsZGluZ1VuaW9uOworICAgICAgICAvL1tpbmRleDogInwiXTogQ29sbGVjdGlvbkJ1aWxkaW5nVW5pb247CisKKyAgICAgICAgZGlmZmVyZW5jZTogQ29sbGVjdGlvbkJ1aWxkaW5nRGlmZmVyZW5jZTsKKyAgICAgICAgLy9baW5kZXg6ICJcXCJdOiBDb2xsZWN0aW9uQnVpbGRpbmdEaWZmZXJlbmNlOworICAgICAgICBub3Q6IENvbGxlY3Rpb25CdWlsZGluZ0RpZmZlcmVuY2U7CisgICAgICAgIC8vW2luZGV4OiAiISJdOiBDb2xsZWN0aW9uQnVpbGRpbmdEaWZmZXJlbmNlOworICAgICAgICByZWxhdGl2ZUNvbXBsZW1lbnQoKTogQ29sbGVjdGlvbkJ1aWxkaW5nRGlmZmVyZW5jZTsKKyAgICAgICAgLy9baW5kZXg6ICItIl06IENvbGxlY3Rpb25CdWlsZGluZ0RpZmZlcmVuY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGdyYXBoIHRoYXQgYXJlIG5vdCBpbiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYWJzb2x1dGVDb21wbGVtZW50KCk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGdyYXBoIHRoYXQgYXJlIG5vdCBpbiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYWJzY29tcCgpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYWxsIGVsZW1lbnRzIGluIHRoZSBncmFwaCB0aGF0IGFyZSBub3QgaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGNvbXBsZW1lbnQoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIGludGVyc2VjdGlvbjogQ29sbGVjdGlvbkJ1aWxkaW5nSW50ZXJzZWN0aW9uOworICAgICAgICBpbnRlcnNlY3Q6IENvbGxlY3Rpb25CdWlsZGluZ0ludGVyc2VjdGlvbjsKKyAgICAgICAgYW5kOiBDb2xsZWN0aW9uQnVpbGRpbmdJbnRlcnNlY3Rpb247CisgICAgICAgIC8vW2luZGV4OiAibiJdOiBDb2xsZWN0aW9uQnVpbGRpbmdJbnRlcnNlY3Rpb247CisgICAgICAgIC8vW2luZGV4OiAiJiJdOiBDb2xsZWN0aW9uQnVpbGRpbmdJbnRlcnNlY3Rpb247CisgICAgICAgIC8vW2luZGV4OiAiLiJdOiBDb2xsZWN0aW9uQnVpbGRpbmdJbnRlcnNlY3Rpb247CisKKyAgICAgICAgc3ltbWV0cmljRGlmZmVyZW5jZTogQ29sbGVjdGlvblN5bW1ldHJpY0RpZmZlcmVuY2U7CisgICAgICAgIHN5bWRpZmY6IENvbGxlY3Rpb25TeW1tZXRyaWNEaWZmZXJlbmNlOworICAgICAgICB4b3I6IENvbGxlY3Rpb25TeW1tZXRyaWNEaWZmZXJlbmNlOworICAgICAgICAvL1tpbmRleDogIl4iXTogQ29sbGVjdGlvblN5bW1ldHJpY0RpZmZlcmVuY2U7CisgICAgICAgIC8vW2luZGV4OiAiKCspIl06IENvbGxlY3Rpb25TeW1tZXRyaWNEaWZmZXJlbmNlOworICAgICAgICAvL1tpbmRleDogIigtKSJdOiBDb2xsZWN0aW9uU3ltbWV0cmljRGlmZmVyZW5jZTsKKworICAgICAgICAvL1tpbmRleDogc3RyaW5nXTogQ29sbGVjdGlvbkJ1aWxkaW5nRGlmZmVyZW5jZSB8Q29sbGVjdGlvbkJ1aWxkaW5nVW5pb24gfCBDb2xsZWN0aW9uQnVpbGRpbmdJbnRlcnNlY3Rpb24gfCBDb2xsZWN0aW9uU3ltbWV0cmljRGlmZmVyZW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybSBhIHRyYWRpdGlvbmFsIGxlZnQvcmlnaHQgZGlmZiBvbiB0aGUgdHdvIGNvbGxlY3Rpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlcyBUaGUgZWxlbWVudHMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRpZmYuCisgICAgICAgICAqLworICAgICAgICBkaWZmKGVsZXM6IENvbGxlY3Rpb24pOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtIGEgdHJhZGl0aW9uYWwgbGVmdC9yaWdodCBkaWZmIG9uIHRoZSB0d28gY29sbGVjdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHJlcHJlc2VudGluZyB0aGUgZWxlbWVudHMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRpZmYuIEFsbCBlbGVtZW50cyBpbiB0aGUgZ3JhcGggbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIGFyZSB1c2VkIGFzIHRoZSBwYXNzZWQgY29sbGVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwbGFpbiBvYmplY3Qgb2YgdGhlIGZvcm0geyBsZWZ0LCByaWdodCwgYm90aCB9IHdoZXJlCisgICAgICAgICAqIGxlZnQgLSBpcyB0aGUgc2V0IG9mIGVsZW1lbnRzIG9ubHkgaW4gdGhlIGNhbGxpbmcgKGkuZS4gbGVmdCkgY29sbGVjdGlvbiwKKyAgICAgICAgICogcmlnaHQgLSBpcyB0aGUgc2V0IG9mIGVsZW1lbnRzIG9ubHkgaW4gdGhlIHBhc3NlZCAoaS5lLiByaWdodCkgY29sbGVjdGlvbiwgYW5kCisgICAgICAgICAqIGJvdGggLSBpcyB0aGUgc2V0IG9mIGVsZW1lbnRzIGluIGJvdGggY29sbGVjdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBkaWZmKHNlbGVjdG9yOiBTZWxlY3Rvcik6IHsKKyAgICAgICAgICAgIGxlZnQ6IENvbGxlY3Rpb25FbGVtZW50cywKKyAgICAgICAgICAgIHJpZ2h0OiBDb2xsZWN0aW9uRWxlbWVudHMsCisgICAgICAgICAgICBib3RoOiBDb2xsZWN0aW9uRWxlbWVudHMKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgbmV3IGNvbGxlY3Rpb24gY29udGFpbmluZyBlbGVtZW50cyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyKHNlbGVjdG9yOiBTZWxlY3Rvcik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIG5ldyBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgZWxlbWVudHMgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBmaWx0ZXIgc2VsZWN0b3IgVGhlIGZpbHRlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBmb3IgZWxlbWVudHMgdG8gaW5jbHVkZS4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50IGJlaW5nIGNvbnNpZGVyZWQuCisgICAgICAgICAqIGVsZSAtIFRoZSBlbGVtZW50IGJlaW5nIGNvbnNpZGVyZWQuCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXIoZmlsdGVyOiAoaTogbnVtYmVyLCBlbGU6IENvbGxlY3Rpb25FbGVtZW50cykgPT4gYm9vbGVhbik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbm9kZXMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoIGFnYWluc3QuCisgICAgICAgICAqLworICAgICAgICBub2RlcyhzZWxlY3RvcjogU2VsZWN0b3IpOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGVkZ2VzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAgICAgKi8KKyAgICAgICAgZWRnZXMoc2VsZWN0b3I6IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVkZ2VzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuZXcgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLCB1c2luZyBhbiBpbXBsZW1lbnRhdGlvbiBsaWtlIHRoZSBzdGFuZGFyZCBhcnJheSBuYW1lc2FrZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnV0aHkgdmFsdWVzIGZvciBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCBmYWxzZXkgdmFsdWVzIGZvciBlbGVtZW50cyB0byBleGNsdWRlLgorICAgICAgICAgKiBlbGUgLSBUaGUgY3VycmVudCBlbGVtZW50LgorICAgICAgICAgKiBpIC0gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgICAgICAqIGVsZXMgLSBUaGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyBiZWluZyBmaWx0ZXJlZC4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgW29wdGlvbmFsXSBUaGUgdmFsdWUgZm9yIHRoaXMgd2l0aGluIHRoZSBpdGVyYXRpbmcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXJGbihmaWx0ZXI6IChlbGU6IENvbGxlY3Rpb25FbGVtZW50cywgaTogbnVtYmVyLCBlbGVzOiBDb2xsZWN0aW9uRWxlbWVudHMpID0+IGJvb2xlYW4sIHRoaXNBcmc/OiBhbnkpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuZXcgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLCB1c2luZyBhbiBpbXBsZW1lbnRhdGlvbiBsaWtlIHRoZSBzdGFuZGFyZCBhcnJheSBuYW1lc2FrZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnV0aHkgdmFsdWVzIGZvciBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCBmYWxzZXkgdmFsdWVzIGZvciBlbGVtZW50cyB0byBleGNsdWRlLgorICAgICAgICAgKiBlbGUgLSBUaGUgY3VycmVudCBlbGVtZW50LgorICAgICAgICAgKiBpIC0gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgICAgICAqIGVsZXMgLSBUaGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyBiZWluZyBmaWx0ZXJlZC4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgW29wdGlvbmFsXSBUaGUgdmFsdWUgZm9yIHRoaXMgd2l0aGluIHRoZSBpdGVyYXRpbmcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBmbkZpbHRlcihmaWx0ZXI6IChlbGU6IENvbGxlY3Rpb25FbGVtZW50cywgaTogbnVtYmVyLCBlbGVzOiBDb2xsZWN0aW9uRWxlbWVudHMpID0+IGJvb2xlYW4sIHRoaXNBcmc/OiBhbnkpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuZXcgY29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLCB1c2luZyBhbiBpbXBsZW1lbnRhdGlvbiBsaWtlIHRoZSBzdGFuZGFyZCBhcnJheSBuYW1lc2FrZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnV0aHkgdmFsdWVzIGZvciBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCBmYWxzZXkgdmFsdWVzIGZvciBlbGVtZW50cyB0byBleGNsdWRlLgorICAgICAgICAgKiBlbGUgLSBUaGUgY3VycmVudCBlbGVtZW50LgorICAgICAgICAgKiBpIC0gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgICAgICAqIGVsZXMgLSBUaGUgY29sbGVjdGlvbiBvZiBlbGVtZW50cyBiZWluZyBmaWx0ZXJlZC4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgW29wdGlvbmFsXSBUaGUgdmFsdWUgZm9yIHRoaXMgd2l0aGluIHRoZSBpdGVyYXRpbmcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBzdGRGaWx0ZXIoZmlsdGVyOiAoZWxlOiBDb2xsZWN0aW9uRWxlbWVudHMsIGk6IG51bWJlciwgZWxlczogQ29sbGVjdGlvbkVsZW1lbnRzKSA9PiBib29sZWFuLCB0aGlzQXJnPzogYW55KTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuZXcgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBlbGVtZW50cyBzb3J0ZWQgYnkgdGhlIHNwZWNpZmllZCBjb21wYXJpc29uIGZ1bmN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc29ydCBUaGUgc29ydGluZyBjb21wYXJpc29uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5lZ2F0aXZlIG51bWJlciBmb3IgZWxlMSBiZWZvcmUgZWxlMiwgMCBmb3IgZWxlMSBzYW1lIGFzIGVsZTIsIG9yIGEgcG9zaXRpdmUgbnVtYmVyIGZvciBlbGUxIGFmdGVyIGVsZTIuCisgICAgICAgICAqLworICAgICAgICBzb3J0KHNvcnQ6IChlbGUxOiBDb2xsZWN0aW9uRWxlbWVudHMsIGVsZTI6IENvbGxlY3Rpb25FbGVtZW50cykgPT4gbnVtYmVyKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB2YWx1ZXMgbWFwcGVkIGZyb20gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXBwZWQgdmFsdWUgZm9yIGVhY2ggZWxlbWVudC4KKyAgICAgICAgICogZWxlIC0gVGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50LgorICAgICAgICAgKiBlbGVzIC0gVGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgYmVpbmcgbWFwcGVkLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBbb3B0aW9uYWxdIFRoZSB2YWx1ZSBmb3IgdGhpcyB3aXRoaW4gdGhlIGl0ZXJhdGluZyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIG1hcChmbjogKGVsZTogQ29sbGVjdGlvbkVsZW1lbnRzLCBpOiBudW1iZXIsIGVsZXM6IENvbGxlY3Rpb25FbGVtZW50cykgPT4gYW55LCB0aGlzQXJnPzogYW55KTogYW55W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmQgYSBtaW5pbXVtIHZhbHVlIGluIGEgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIHRvIGNvbXBhcmUgZm9yIGVhY2ggZWxlbWVudC4KKyAgICAgICAgICogZWxlIC0gVGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50LgorICAgICAgICAgKiBlbGVzIC0gVGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgYmVpbmcgbWFwcGVkLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBbb3B0aW9uYWxdIFRoZSB2YWx1ZSBmb3IgdGhpcyB3aXRoaW4gdGhlIGl0ZXJhdGluZyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIG1pbihmbjogKGVsZTogQ29sbGVjdGlvbkVsZW1lbnRzLCBpOiBudW1iZXIsIGVsZXM6IENvbGxlY3Rpb25FbGVtZW50cykgPT4gYW55LCB0aGlzQXJnPzogYW55KTogeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbWluaW11bSB2YWx1ZSBmb3VuZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdmFsdWU6IGFueSwKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGVsZW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWluaW11bSB2YWx1ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxlOiBDb2xsZWN0aW9uRWxlbWVudHMKKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZCBhIG1heGltdW0gdmFsdWUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSB0byBjb21wYXJlIGZvciBlYWNoIGVsZW1lbnQuCisgICAgICAgICAqIGVsZSAtIFRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgICAgICAqIGkgLSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgICAgICogZWxlcyAtIFRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIGJlaW5nIG1hcHBlZC4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgW29wdGlvbmFsXSBUaGUgdmFsdWUgZm9yIHRoaXMgd2l0aGluIHRoZSBpdGVyYXRpbmcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBtYXgoZm46IChlbGU6IENvbGxlY3Rpb25FbGVtZW50cywgaTogbnVtYmVyLCBlbGVzOiBDb2xsZWN0aW9uRWxlbWVudHMpID0+IGFueSwgdGhpc0FyZz86IGFueSk6IHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIG1heGltdW0gdmFsdWUgZm91bmQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHZhbHVlOiBhbnksCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBlbGVtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1heGltdW0gdmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVsZTogQ29sbGVjdGlvbkVsZW1lbnRzCisgICAgICAgIH07CisgICAgfQorICAgIGludGVyZmFjZSBDb2xsZWN0aW9uVHJhdmVyc2luZyB7CisgICAgICAgIC8vIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNjb2xsZWN0aW9uL3RyYXZlcnNpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBvcGVuIG5laWdoYm91cmhvb2Qgb2YgdGhlIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbmVpZ2hib3VyaG9vZCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIHRoZSB0cmFkaXRpb25hbCBkZWZpbml0aW9uIG9mIGEgIm5laWdoYm91cmhvb2QiOiBUaGlzIHJldHVybmVkIG5laWdoYm91cmhvb2QgaW5jbHVkZXMgdGhlIGVkZ2VzIGNvbm5lY3RpbmcgdGhlIGNvbGxlY3Rpb24gdG8gdGhlIG5laWdoYm91cmhvb2QuIFRoaXMgZ2l2ZXMgeW91IG1vcmUgZmxleGliaWxpdHkuCisgICAgICAgICAqIEFuIG9wZW4gbmVpZ2hib3VyaG9vZCBpcyBvbmUgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBzZXQgb2YgZWxlbWVudHMuIElmIHVuc3BlY2lmaWVkLCBhIG5laWdoYm91cmhvb2QgaXMgb3BlbiBieSBkZWZhdWx0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgW29wdGlvbmFsXSBBbiBvcHRpb25hbCBzZWxlY3RvciB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIG5laWdoYm9yaG9vZChzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBvcGVuIG5laWdoYm91cmhvb2Qgb2YgdGhlIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbmVpZ2hib3VyaG9vZCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIHRoZSB0cmFkaXRpb25hbCBkZWZpbml0aW9uIG9mIGEgIm5laWdoYm91cmhvb2QiOiBUaGlzIHJldHVybmVkIG5laWdoYm91cmhvb2QgaW5jbHVkZXMgdGhlIGVkZ2VzIGNvbm5lY3RpbmcgdGhlIGNvbGxlY3Rpb24gdG8gdGhlIG5laWdoYm91cmhvb2QuIFRoaXMgZ2l2ZXMgeW91IG1vcmUgZmxleGliaWxpdHkuCisgICAgICAgICAqIEFuIG9wZW4gbmVpZ2hib3VyaG9vZCBpcyBvbmUgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBzZXQgb2YgZWxlbWVudHMuIElmIHVuc3BlY2lmaWVkLCBhIG5laWdoYm91cmhvb2QgaXMgb3BlbiBieSBkZWZhdWx0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgW29wdGlvbmFsXSBBbiBvcHRpb25hbCBzZWxlY3RvciB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIG9wZW5OZWlnaGJvcmhvb2Qoc2VsZWN0b3I/OiBTZWxlY3Rvcik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY2xvc2VkIG5laWdoYm91cmhvb2Qgb2YgdGhlIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbmVpZ2hib3VyaG9vZCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIHRoZSB0cmFkaXRpb25hbCBkZWZpbml0aW9uIG9mIGEgIm5laWdoYm91cmhvb2QiOiBUaGlzIHJldHVybmVkIG5laWdoYm91cmhvb2QgaW5jbHVkZXMgdGhlIGVkZ2VzIGNvbm5lY3RpbmcgdGhlIGNvbGxlY3Rpb24gdG8gdGhlIG5laWdoYm91cmhvb2QuIFRoaXMgZ2l2ZXMgeW91IG1vcmUgZmxleGliaWxpdHkuCisgICAgICAgICAqIEEgY2xvc2VkIG5laWdoYm91cmhvb2QgaXMgb25lIHRoYXQgZG9lcyBpbmNsdWRlIHRoZSBvcmlnaW5hbCBzZXQgb2YgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEFuIG9wdGlvbmFsIHNlbGVjdG9yIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY2xvc2VkTmVpZ2hib3Job29kKHNlbGVjdG9yPzogU2VsZWN0b3IpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgfQorICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRWRnZXNUcmF2ZXJzaW5nIHsKKyAgICAgICAgLy8gaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vdHJhdmVyc2luZworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG5vZGVzIGNvbm5lY3RlZCB0byB0aGUgZWRnZXMgaW4gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQW4gb3B0aW9uYWwgc2VsZWN0b3IgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjb25uZWN0ZWROb2RlcyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgc291cmNlIG5vZGVzIGNvbm5lY3RlZCB0byB0aGUgZWRnZXMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEFuIG9wdGlvbmFsIHNlbGVjdG9yIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc291cmNlcyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGFyZ2V0IG5vZGVzIGNvbm5lY3RlZCB0byB0aGUgZWRnZXMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEFuIG9wdGlvbmFsIHNlbGVjdG9yIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdGFyZ2V0cyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZWRnZXMgcGFyYWxsZWwgdG8gdGhvc2UgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFR3byBlZGdlcyBhcmUgc2FpZCB0byBiZSBwYXJhbGxlbCBpZiB0aGV5IGNvbm5lY3QgdGhlIHNhbWUgdHdvIG5vZGVzLiBBbnkgdHdvIHBhcmFsbGVsIGVkZ2VzIG1heSBjb25uZWN0IG5vZGVzIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgZWRnZXMgc2hhcmUgdGhlIHNhbWUgc291cmNlIGFuZCB0YXJnZXQuIFRoZXkgbWF5IGFsdGVybmF0aXZlbHkgY29ubmVjdCBub2RlcyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBhcmUgcmV2ZXJzZWQgaW4gdGhlIHNlY29uZCBlZGdlLgorICAgICAgICAgKiBUaGF0IGlzOgorICAgICAgICAgKiAtIGVkZ2UxLnNvdXJjZSgpLmlkKCkgPT09IGVkZ2UyLnNvdXJjZSgpLmlkKCkKKyAgICAgICAgICogICAmJiBlZGdlMS50YXJnZXQoKS5pZCgpID09PSBlZGdlMi50YXJnZXQoKS5pZCgpCisgICAgICAgICAqIE9SCisgICAgICAgICAqIC0gZWRnZTEuc291cmNlKCkuaWQoKSA9PT0gZWRnZTIudGFyZ2V0KCkuaWQoKQorICAgICAgICAgKiAgICYmIGVkZ2UxLnRhcmdldCgpLmlkKCkgPT09IGVkZ2UyLnNvdXJjZSgpLmlkKCkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQW4gb3B0aW9uYWwgc2VsZWN0b3IgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwYXJhbGxlbEVkZ2VzKHNlbGVjdG9yPzogU2VsZWN0b3IpOiBDb2xsZWN0aW9uRWRnZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBlZGdlcyBjb2RpcmVjdGVkIHRvIHRob3NlIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUd28gZWRnZXMgYXJlIHNhaWQgdG8gYmUgY29kaXJlY3RlZCBpZiB0aGV5IGNvbm5lY3QgdGhlIHNhbWUgdHdvIG5vZGVzIGluIHRoZSBzYW1lIGRpcmVjdGlvbjogVGhlIGVkZ2VzIGhhdmUgdGhlIHNhbWUgc291cmNlIGFuZCB0YXJnZXQuCisgICAgICAgICAqIFRoYXQgaXM6CisgICAgICAgICAqIC0gZWRnZTEuc291cmNlKCkuaWQoKSA9PT0gZWRnZTIuc291cmNlKCkuaWQoKQorICAgICAgICAgKiAgICYmIGVkZ2UxLnRhcmdldCgpLmlkKCkgPT09IGVkZ2UyLnRhcmdldCgpLmlkKCkKKworICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgW29wdGlvbmFsXSBBbiBvcHRpb25hbCBzZWxlY3RvciB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGNvZGlyZWN0ZWRFZGdlcyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVkZ2VzOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbk5vZGVzVHJhdmVyc2luZyB7CisgICAgICAgIC8vIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNjb2xsZWN0aW9uL3RyYXZlcnNpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBlZGdlcyBjb25uZWN0aW5nIHRoZSBjb2xsZWN0aW9uIHRvIGFub3RoZXIgY29sbGVjdGlvbi4gRGlyZWN0aW9uIG9mIHRoZSBlZGdlcyBkb2VzIG5vdCBtYXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVzIFRoZSBvdGhlciBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZWRnZXNXaXRoKGVsZXM6IENvbGxlY3Rpb24pOiBDb2xsZWN0aW9uRWRnZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGVkZ2VzIGNvbm5lY3RpbmcgdGhlIGNvbGxlY3Rpb24gdG8gYW5vdGhlciBjb2xsZWN0aW9uLiBEaXJlY3Rpb24gb2YgdGhlIGVkZ2VzIGRvZXMgbm90IG1hdHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBvdGhlciBjb2xsZWN0aW9uLCBzcGVjaWZpZWQgYXMgYSBzZWxlY3RvciB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgYWxsIGVsZW1lbnRzIGluIHRoZSBncmFwaC4KKyAgICAgICAgICovCisgICAgICAgIGVkZ2VzV2l0aChzZWxlY3RvcjogU2VsZWN0b3IpOiBDb2xsZWN0aW9uRWRnZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZWRnZXMgY29taW5nIGZyb20gdGhlIGNvbGxlY3Rpb24gKGkuZS4gdGhlIHNvdXJjZSkgZ29pbmcgdG8gYW5vdGhlciBjb2xsZWN0aW9uIChpLmUuIHRoZSB0YXJnZXQpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZWxlcyBUaGUgb3RoZXIgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGVkZ2VzVG8oZWxlczogQ29sbGVjdGlvbik6IENvbGxlY3Rpb25FZGdlczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZWRnZXMgY29taW5nIGZyb20gdGhlIGNvbGxlY3Rpb24gKGkuZS4gdGhlIHNvdXJjZSkgZ29pbmcgdG8gYW5vdGhlciBjb2xsZWN0aW9uIChpLmUuIHRoZSB0YXJnZXQpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIG90aGVyIGNvbGxlY3Rpb24sIHNwZWNpZmllZCBhcyBhIHNlbGVjdG9yIHdoaWNoIGlzIG1hdGNoZWQgYWdhaW5zdCBhbGwgZWxlbWVudHMgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKi8KKyAgICAgICAgZWRnZXNUbyhzZWxlY3RvcjogU2VsZWN0b3IpOiBDb2xsZWN0aW9uRWRnZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBub2RlcyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQW4gb3B0aW9uYWwgc2VsZWN0b3IgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjb25uZWN0ZWRFZGdlcyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVkZ2VzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGcm9tIHRoZSBzZXQgb2YgY2FsbGluZyBub2RlcywgZ2V0IHRoZSBub2RlcyB3aGljaCBhcmUgbGVhdmVzIChpLmUuIG5vIG91dGdvaW5nIGVkZ2VzLCBhcyBpbiBhIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGgpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgW29wdGlvbmFsXSBBbiBvcHRpb25hbCBzZWxlY3RvciB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGxlYXZlcyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZWRnZXMgKGFuZCB0aGVpciB0YXJnZXRzKSBjb21pbmcgb3V0IG9mIHRoZSBub2RlcyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQW4gb3B0aW9uYWwgc2VsZWN0b3IgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBvdXRnb2VycyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVkZ2VzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN1cnNpdmVseSBnZXQgZWRnZXMgKGFuZCB0aGVpciB0YXJnZXRzKSBjb21pbmcgb3V0IG9mIHRoZSBub2RlcyBpbiB0aGUgY29sbGVjdGlvbiAoaS5lLiB0aGUgb3V0Z29lcnMsIHRoZSBvdXRnb2Vycycgb3V0Z29lcnMsIC4uLikuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEFuIG9wdGlvbmFsIHNlbGVjdG9yIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc3VjY2Vzc29ycyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVkZ2VzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZWRnZXMgKGFuZCB0aGVpciBzb3VyY2VzKSBjb21pbmcgaW50byB0aGUgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEFuIG9wdGlvbmFsIHNlbGVjdG9yIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW5jb21lcnMoc2VsZWN0b3I/OiBTZWxlY3Rvcik6IENvbGxlY3Rpb25FZGdlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjdXJzaXZlbHkgZ2V0IGVkZ2VzIChhbmQgdGhlaXIgc291cmNlcykgY29taW5nIGludG8gdGhlIG5vZGVzIGluIHRoZSBjb2xsZWN0aW9uIChpLmUuIHRoZSBpbmNvbWVycywgdGhlIGluY29tZXJzJyBpbmNvbWVycywgLi4uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQW4gb3B0aW9uYWwgc2VsZWN0b3IgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwcmVkZWNlc3NvcnMoc2VsZWN0b3I/OiBTZWxlY3Rvcik6IENvbGxlY3Rpb25FZGdlczsKKyAgICB9CisgICAgaW50ZXJmYWNlIFNlYXJjaEJyZWFkdGhGaXJzdE9wdGlvbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJvb3Qgbm9kZXMgKHNlbGVjdG9yIG9yIGNvbGxlY3Rpb24pIHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4KKyAgICAgICAgICovCisgICAgICAgIHJvb3RzOiBTZWxlY3RvcnxDb2xsZWN0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogQSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBub2RlIGlzIHZpc2l0ZWQgaW4gdGhlIHNlYXJjaC4gVGhlIGhhbmRsZXIgcmV0dXJucyB0cnVlIHdoZW4gaXQgZmluZHMgdGhlIGRlc2lyZWQgbm9kZSwgYW5kIGl0IHJldHVybnMgZmFsc2UgdG8gY2FuY2VsIHRoZSBzZWFyY2guCisgICAgICAgICAqIGkgLSBUaGUgaW5kZXggaW5kaWNhdGluZyB0aGlzIG5vZGUgaXMgdGhlIGl0aCB2aXNpdGVkIG5vZGUuCisgICAgICAgICAqIGRlcHRoIC0gSG93IG1hbnkgZWRnZSBob3BzIGF3YXkgdGhpcyBub2RlIGlzIGZyb20gdGhlIHJvb3Qgbm9kZXMuCisgICAgICAgICAqIHYgLSBUaGUgY3VycmVudCBub2RlLgorICAgICAgICAgKiBlIC0gVGhlIGVkZ2UgY29ubmVjdGluZyB0aGUgcHJldmlvdXMgbm9kZSB0byB0aGUgY3VycmVudCBub2RlLgorICAgICAgICAgKiB1IC0gVGhlIHByZXZpb3VzIG5vZGUuCisgICAgICAgICAqLworICAgICAgICB2aXNpdD86IChpOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsIHY6IENvbGxlY3Rpb25Ob2RlcywgZTogQ29sbGVjdGlvbkVkZ2VzLCB1OiBDb2xsZWN0aW9uTm9kZXMpID0+IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhbGdvcml0aG0gc2hvdWxkIG9ubHkgZ28gYWxvbmcgZWRnZXMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IChkZWZhdWx0IGZhbHNlKS4KKyAgICAgICAgICovCisgICAgICAgIGRpcmVjdGVkPzogYm9vbGVhbjsKKyAgICB9CisgICAgaW50ZXJmYWNlIFNlYXJjaEJyZWFkdGhGaXJzdFJlc3VsdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGF0aCBvZiB0aGUgc2VhcmNoLgorICAgICAgICAgKiAtIFRoZSBwYXRoIHJldHVybmVkIGluY2x1ZGVzIGVkZ2VzIHN1Y2ggdGhhdCBpZiBwYXRoW2ldIGlzIGEgbm9kZSwgdGhlbiBwYXRoW2kgLSAxXSBpcyB0aGUgZWRnZSB1c2VkIHRvIGdldCB0byB0aGF0IG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwYXRoOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbm9kZSBmb3VuZCBieSB0aGUgc2VhcmNoCisgICAgICAgICAqIC0gSWYgbm8gbm9kZSB3YXMgZm91bmQsIHRoZW4gZm91bmQgaXMgZW1wdHkuCisgICAgICAgICAqIC0gSWYgeW91ciBoYW5kbGVyIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZW4gdGhlIG9ubHkgdGhlIHBhdGggdXAgdG8gdGhhdCBwb2ludCBpcyByZXR1cm5lZC4KKyAgICAgICAgICovCisgICAgICAgIGZvdW5kOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgfQorICAgIGludGVyZmFjZSBTZWFyY2hEaWprc3RyYU9wdGlvbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJvb3Qgbm9kZSAoc2VsZWN0b3Igb3IgY29sbGVjdGlvbikgd2hlcmUgdGhlIGFsZ29yaXRobSBzdGFydHMuCisgICAgICAgICAqLworICAgICAgICByb290OiBTZWxlY3RvcnxDb2xsZWN0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcG9zaXRpdmUgbnVtZXJpYyB3ZWlnaHQgZm9yIHRoaXMgZWRnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgbm8gd2VpZ2h0IGZ1bmN0aW9uIGlzIGRlZmluZWQsIGEgY29uc3RhbnQgd2VpZ2h0IG9mIDEgaXMgdXNlZCBmb3IgZWFjaCBlZGdlLgorICAgICAgICAgKi8KKyAgICAgICAgd2VpZ2h0PzogKGVkZ2U6IENvbGxlY3Rpb25FZGdlcykgPT4gbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhbGdvcml0aG0gc2hvdWxkIG9ubHkgZ28gYWxvbmcgZWRnZXMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IChkZWZhdWx0IGZhbHNlKS4KKyAgICAgICAgICovCisgICAgICAgIGRpcmVjdGVkPzogYm9vbGVhbjsKKyAgICB9CisgICAgaW50ZXJmYWNlIFNlYXJjaERpamtzdHJhUmVzdWx0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHNvdXJjZSBub2RlIHRvIG5vZGUuCisgICAgICAgICAqLworICAgICAgICBkaXN0YW5jZVRvOiAobm9kZTogQ29sbGVjdGlvbkZpcnN0Tm9kZSkgPT4gbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBzaG9ydGVzdCBwYXRoIGZyb20gdGhlIHNvdXJjZSBub2RlIHRvIG5vZGUuCisgICAgICAgICAqIFRoZSBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBzb3VyY2Ugbm9kZSBhbmQgaW5jbHVkZXMgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vZGVzIGluIHRoZSBwYXRoIHN1Y2ggdGhhdCBpZiBwYXRoVG8obm9kZSlbaV0gaXMgYW4gZWRnZSwgdGhlbiBwYXRoVG8obm9kZSlbaS0xXSBpcyB0aGUgcHJldmlvdXMgbm9kZSBpbiB0aGUgcGF0aCBhbmQgcGF0aFRvKG5vZGUpW2krMV0gaXMgdGhlIG5leHQgbm9kZSBpbiB0aGUgcGF0aC4KKyAgICAgICAgICovCisgICAgICAgIHBhdGhUbzogKG5vZGU6IENvbGxlY3Rpb25GaXJzdE5vZGUpID0+IENvbGxlY3Rpb247CisgICAgfQorICAgIGludGVyZmFjZSBTZWFyY2hBU3Rhck9wdGlvbnMgeworICAgIH0KKyAgICBpbnRlcmZhY2UgU2VhcmNoQVN0YXJSZXN1bHQgeworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkFsZ29yaXRobXMgeworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9hbGdvcml0aG1zCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm0gYSBicmVhZHRoLWZpcnN0IHNlYXJjaCB3aXRoaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGJyZWFkdGgtZmlyc3Qgc2VhcmNoIG9uIG9ubHkgdGhlIHN1YnNldCBvZiB0aGUgZ3JhcGggaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGJyZWFkdGhGaXJzdFNlYXJjaChvcHRpb25zOiBTZWFyY2hCcmVhZHRoRmlyc3RPcHRpb25zKTogU2VhcmNoQnJlYWR0aEZpcnN0UmVzdWx0OworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybSBhIGJyZWFkdGgtZmlyc3Qgc2VhcmNoIHdpdGhpbiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgYnJlYWR0aC1maXJzdCBzZWFyY2ggb24gb25seSB0aGUgc3Vic2V0IG9mIHRoZSBncmFwaCBpbiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm9vdHMgVGhlIHJvb3Qgbm9kZXMgKHNlbGVjdG9yIG9yIGNvbGxlY3Rpb24pIHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4KKyAgICAgICAgICogQHBhcmFtIHZpc2l0IFtvcHRpb25hbF0gQSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBub2RlIGlzIHZpc2l0ZWQgaW4gdGhlIHNlYXJjaC4gVGhlIGhhbmRsZXIgcmV0dXJucyB0cnVlIHdoZW4gaXQgZmluZHMgdGhlIGRlc2lyZWQgbm9kZSwgYW5kIGl0IHJldHVybnMgZmFsc2UgdG8gY2FuY2VsIHRoZSBzZWFyY2guCisgICAgICAgICAqIGkgLSBUaGUgaW5kZXggaW5kaWNhdGluZyB0aGlzIG5vZGUgaXMgdGhlIGl0aCB2aXNpdGVkIG5vZGUuCisgICAgICAgICAqIGRlcHRoIC0gSG93IG1hbnkgZWRnZSBob3BzIGF3YXkgdGhpcyBub2RlIGlzIGZyb20gdGhlIHJvb3Qgbm9kZXMuCisgICAgICAgICAqIHYgLSBUaGUgY3VycmVudCBub2RlLgorICAgICAgICAgKiBlIC0gVGhlIGVkZ2UgY29ubmVjdGluZyB0aGUgcHJldmlvdXMgbm9kZSB0byB0aGUgY3VycmVudCBub2RlLgorICAgICAgICAgKiB1IC0gVGhlIHByZXZpb3VzIG5vZGUuCisgICAgICAgICAqIEBwYXJhbSBkaXJlY3RlZCBbb3B0aW9uYWxdIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNlYXJjaCBzaG91bGQgb25seSBnbyBhbG9uZyBlZGdlcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQgKGRlZmF1bHQgZmFsc2UpLgorICAgICAgICAgKi8KKyAgICAgICAgYnJlYWR0aEZpcnN0U2VhcmNoKHJvb3RzOiBTZWxlY3RvcnxDb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXQ/OiAoaTogbnVtYmVyLCBkZXB0aDogbnVtYmVyLCB2OiBDb2xsZWN0aW9uTm9kZXMsIGU6IENvbGxlY3Rpb25FZGdlcywgdTogQ29sbGVjdGlvbk5vZGVzKSA9PiBib29sZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0ZWQ/OiBib29sZWFuKTogU2VhcmNoQnJlYWR0aEZpcnN0UmVzdWx0OworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybSBhIGJyZWFkdGgtZmlyc3Qgc2VhcmNoIHdpdGhpbiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgYnJlYWR0aC1maXJzdCBzZWFyY2ggb24gb25seSB0aGUgc3Vic2V0IG9mIHRoZSBncmFwaCBpbiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYmZzKG9wdGlvbnM6IFNlYXJjaEJyZWFkdGhGaXJzdE9wdGlvbnMpOiBTZWFyY2hCcmVhZHRoRmlyc3RSZXN1bHQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtIGEgYnJlYWR0aC1maXJzdCBzZWFyY2ggd2l0aGluIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBicmVhZHRoLWZpcnN0IHNlYXJjaCBvbiBvbmx5IHRoZSBzdWJzZXQgb2YgdGhlIGdyYXBoIGluIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb290cyBUaGUgcm9vdCBub2RlcyAoc2VsZWN0b3Igb3IgY29sbGVjdGlvbikgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLgorICAgICAgICAgKiBAcGFyYW0gdmlzaXQgW29wdGlvbmFsXSBBIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgdmlzaXRlZCBpbiB0aGUgc2VhcmNoLiBUaGUgaGFuZGxlciByZXR1cm5zIHRydWUgd2hlbiBpdCBmaW5kcyB0aGUgZGVzaXJlZCBub2RlLCBhbmQgaXQgcmV0dXJucyBmYWxzZSB0byBjYW5jZWwgdGhlIHNlYXJjaC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBpbmRpY2F0aW5nIHRoaXMgbm9kZSBpcyB0aGUgaXRoIHZpc2l0ZWQgbm9kZS4KKyAgICAgICAgICogZGVwdGggLSBIb3cgbWFueSBlZGdlIGhvcHMgYXdheSB0aGlzIG5vZGUgaXMgZnJvbSB0aGUgcm9vdCBub2Rlcy4KKyAgICAgICAgICogdiAtIFRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgICAqIGUgLSBUaGUgZWRnZSBjb25uZWN0aW5nIHRoZSBwcmV2aW91cyBub2RlIHRvIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgICAqIHUgLSBUaGUgcHJldmlvdXMgbm9kZS4KKyAgICAgICAgICogQHBhcmFtIGRpcmVjdGVkIFtvcHRpb25hbF0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2VhcmNoIHNob3VsZCBvbmx5IGdvIGFsb25nIGVkZ2VzIGZyb20gc291cmNlIHRvIHRhcmdldCAoZGVmYXVsdCBmYWxzZSkuCisgICAgICAgICAqLworICAgICAgICBiZnMocm9vdHM6IFNlbGVjdG9yfENvbGxlY3Rpb24sCisgICAgICAgICAgICB2aXNpdD86IChpOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsIHY6IENvbGxlY3Rpb25Ob2RlcywgZTogQ29sbGVjdGlvbkVkZ2VzLCB1OiBDb2xsZWN0aW9uTm9kZXMpID0+IGJvb2xlYW4sCisgICAgICAgICAgICBkaXJlY3RlZD86IGJvb2xlYW4pOiBTZWFyY2hCcmVhZHRoRmlyc3RSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm0gYSBkZXB0aC1maXJzdCBzZWFyY2ggd2l0aGluIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBkZXB0aC1maXJzdCBzZWFyY2ggb24gb25seSB0aGUgc3Vic2V0IG9mIHRoZSBncmFwaCBpbiB0aGUgY2FsbGluZyBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZGVwdGhGaXJzdFNlYXJjaChvcHRpb25zOiBTZWFyY2hCcmVhZHRoRmlyc3RPcHRpb25zKTogU2VhcmNoQnJlYWR0aEZpcnN0UmVzdWx0OworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybSBhIGRlcHRoLWZpcnN0IHNlYXJjaCB3aXRoaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRlcHRoLWZpcnN0IHNlYXJjaCBvbiBvbmx5IHRoZSBzdWJzZXQgb2YgdGhlIGdyYXBoIGluIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb290cyBUaGUgcm9vdCBub2RlcyAoc2VsZWN0b3Igb3IgY29sbGVjdGlvbikgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLgorICAgICAgICAgKiBAcGFyYW0gdmlzaXQgW29wdGlvbmFsXSBBIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgdmlzaXRlZCBpbiB0aGUgc2VhcmNoLiBUaGUgaGFuZGxlciByZXR1cm5zIHRydWUgd2hlbiBpdCBmaW5kcyB0aGUgZGVzaXJlZCBub2RlLCBhbmQgaXQgcmV0dXJucyBmYWxzZSB0byBjYW5jZWwgdGhlIHNlYXJjaC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBpbmRpY2F0aW5nIHRoaXMgbm9kZSBpcyB0aGUgaXRoIHZpc2l0ZWQgbm9kZS4KKyAgICAgICAgICogZGVwdGggLSBIb3cgbWFueSBlZGdlIGhvcHMgYXdheSB0aGlzIG5vZGUgaXMgZnJvbSB0aGUgcm9vdCBub2Rlcy4KKyAgICAgICAgICogdiAtIFRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgICAqIGUgLSBUaGUgZWRnZSBjb25uZWN0aW5nIHRoZSBwcmV2aW91cyBub2RlIHRvIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgICAqIHUgLSBUaGUgcHJldmlvdXMgbm9kZS4KKyAgICAgICAgICogQHBhcmFtIGRpcmVjdGVkIFtvcHRpb25hbF0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2VhcmNoIHNob3VsZCBvbmx5IGdvIGFsb25nIGVkZ2VzIGZyb20gc291cmNlIHRvIHRhcmdldCAoZGVmYXVsdCBmYWxzZSkuCisgICAgICAgICAqLworICAgICAgICBkZXB0aEZpcnN0U2VhcmNoKHJvb3RzOiBTZWxlY3RvcnxDb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0PzogKGk6IG51bWJlciwgZGVwdGg6IG51bWJlciwgdjogQ29sbGVjdGlvbk5vZGVzLCBlOiBDb2xsZWN0aW9uRWRnZXMsIHU6IENvbGxlY3Rpb25Ob2RlcykgPT4gYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RlZD86IGJvb2xlYW4pOiBTZWFyY2hCcmVhZHRoRmlyc3RSZXN1bHQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIHdpdGhpbiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIG9uIG9ubHkgdGhlIHN1YnNldCBvZiB0aGUgZ3JhcGggaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGRmcyhvcHRpb25zOiBTZWFyY2hCcmVhZHRoRmlyc3RPcHRpb25zKTogU2VhcmNoQnJlYWR0aEZpcnN0UmVzdWx0OworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybSBhIGRlcHRoLWZpcnN0IHNlYXJjaCB3aXRoaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRlcHRoLWZpcnN0IHNlYXJjaCBvbiBvbmx5IHRoZSBzdWJzZXQgb2YgdGhlIGdyYXBoIGluIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb290cyBUaGUgcm9vdCBub2RlcyAoc2VsZWN0b3Igb3IgY29sbGVjdGlvbikgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLgorICAgICAgICAgKiBAcGFyYW0gdmlzaXQgW29wdGlvbmFsXSBBIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgdmlzaXRlZCBpbiB0aGUgc2VhcmNoLiBUaGUgaGFuZGxlciByZXR1cm5zIHRydWUgd2hlbiBpdCBmaW5kcyB0aGUgZGVzaXJlZCBub2RlLCBhbmQgaXQgcmV0dXJucyBmYWxzZSB0byBjYW5jZWwgdGhlIHNlYXJjaC4KKyAgICAgICAgICogaSAtIFRoZSBpbmRleCBpbmRpY2F0aW5nIHRoaXMgbm9kZSBpcyB0aGUgaXRoIHZpc2l0ZWQgbm9kZS4KKyAgICAgICAgICogZGVwdGggLSBIb3cgbWFueSBlZGdlIGhvcHMgYXdheSB0aGlzIG5vZGUgaXMgZnJvbSB0aGUgcm9vdCBub2Rlcy4KKyAgICAgICAgICogdiAtIFRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgICAqIGUgLSBUaGUgZWRnZSBjb25uZWN0aW5nIHRoZSBwcmV2aW91cyBub2RlIHRvIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgICAqIHUgLSBUaGUgcHJldmlvdXMgbm9kZS4KKyAgICAgICAgICogQHBhcmFtIGRpcmVjdGVkIFtvcHRpb25hbF0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2VhcmNoIHNob3VsZCBvbmx5IGdvIGFsb25nIGVkZ2VzIGZyb20gc291cmNlIHRvIHRhcmdldCAoZGVmYXVsdCBmYWxzZSkuCisgICAgICAgICAqLworICAgICAgICBkZnMocm9vdHM6IFNlbGVjdG9yfENvbGxlY3Rpb24sCisgICAgICAgICAgICB2aXNpdD86IChpOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsIHY6IENvbGxlY3Rpb25Ob2RlcywgZTogQ29sbGVjdGlvbkVkZ2VzLCB1OiBDb2xsZWN0aW9uTm9kZXMpID0+IGJvb2xlYW4sCisgICAgICAgICAgICBkaXJlY3RlZD86IGJvb2xlYW4pOiBTZWFyY2hCcmVhZHRoRmlyc3RSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm0gRGlqa3N0cmEncyBhbGdvcml0aG0gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLiBUaGlzIGZpbmRzIHRoZSBzaG9ydGVzdCBwYXRocyB0byBhbGwgb3RoZXIgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24gZnJvbSB0aGUgcm9vdCBub2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBEaWprc3RyYSdzIGFsZ29yaXRobSBvbiBvbmx5IHRoZSBzdWJzZXQgb2YgdGhlIGdyYXBoIGluIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBkaWprc3RyYShvcHRpb25zOiBTZWFyY2hEaWprc3RyYU9wdGlvbnMpOiBTZWFyY2hEaWprc3RyYVJlc3VsdDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm0gRGlqa3N0cmEncyBhbGdvcml0aG0gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLiBUaGlzIGZpbmRzIHRoZSBzaG9ydGVzdCBwYXRocyB0byBhbGwgb3RoZXIgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24gZnJvbSB0aGUgcm9vdCBub2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBEaWprc3RyYSdzIGFsZ29yaXRobSBvbiBvbmx5IHRoZSBzdWJzZXQgb2YgdGhlIGdyYXBoIGluIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb290IFRoZSByb290IG5vZGUgKHNlbGVjdG9yIG9yIGNvbGxlY3Rpb24pIHdoZXJlIHRoZSBhbGdvcml0aG0gc3RhcnRzLgorICAgICAgICAgKiBAcGFyYW0gd2VpZ2h0IFtvcHRpb25hbF0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHBvc2l0aXZlIG51bWVyaWMgd2VpZ2h0IGZvciB0aGlzIGVkZ2UuCisgICAgICAgICAqIElmIG5vIHdlaWdodCBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhIGNvbnN0YW50IHdlaWdodCBvZiAxIGlzIHVzZWQgZm9yIGVhY2ggZWRnZS4KKyAgICAgICAgICogQHBhcmFtIGRpcmVjdGVkIFtvcHRpb25hbF0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWxnb3JpdGhtIHNob3VsZCBvbmx5IGdvIGFsb25nIGVkZ2VzIGZyb20gc291cmNlIHRvIHRhcmdldCAoZGVmYXVsdCBmYWxzZSkuCisgICAgICAgICAqLworICAgICAgICBkaWprc3RyYShyb290OiBTZWxlY3RvcnxDb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICB3ZWlnaHQ/OiAoZWRnZTogQ29sbGVjdGlvbkVkZ2VzKSA9PiBudW1iZXIsCisgICAgICAgICAgICAgICAgIGRpcmVjdGVkPzogYm9vbGVhbik6IFNlYXJjaERpamtzdHJhUmVzdWx0OworCisKKyAgICAgICAgLy9UT0RPOiBjb250aW51ZSBoZXJlOiBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9hbGdvcml0aG1zL2VsZXMuZGlqa3N0cmEKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25Ob2Rlc0NvbXBvdW5kIHsKKyAgICAgICAgLy8gaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vY29tcG91bmQtbm9kZXMKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBjb21wb3VuZCBwYXJlbnQgbm9kZSBvZiBlYWNoIG5vZGUgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEEgc2VsZWN0b3IgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcGFyZW50KHNlbGVjdG9yPzogU2VsZWN0b3IpOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbGwgY29tcG91bmQgYW5jZXN0b3Igbm9kZXMgKGkuZS4gcGFyZW50cywgcGFyZW50cycgcGFyZW50cywgZXRjLikgb2YgZWFjaCBub2RlIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgW29wdGlvbmFsXSBBIHNlbGVjdG9yIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHBhcmVudHMoc2VsZWN0b3I/OiBTZWxlY3Rvcik6IENvbGxlY3Rpb25Ob2RlczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbGwgY29tcG91bmQgYW5jZXN0b3Igbm9kZXMgKGkuZS4gcGFyZW50cywgcGFyZW50cycgcGFyZW50cywgZXRjLikgb2YgZWFjaCBub2RlIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgW29wdGlvbmFsXSBBIHNlbGVjdG9yIHVzZWQgdG8gZmlsdGVyIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGFuY2VzdG9ycyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYWxsIGNvbXBvdW5kIGFuY2VzdG9ycyBjb21tb24gdG8gYWxsIHRoZSBub2RlcyBpbiB0aGUgY29sbGVjdGlvbiwgc3RhcnRpbmcgd2l0aCB0aGUgY2xvc2VzdCBhbmQgZ2V0dGluZyBwcm9ncmVzc2l2ZWx5IGZhcnRoZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFlvdSBjYW4gZ2V0IHRoZSBjbG9zZXN0IGNvbW1vbiBhbmNlc3RvciB2aWEKKyAgICAgICAgICogICBub2Rlcy5jb21tb25BbmNlc3RvcnMoKS5maXJzdCgpCisgICAgICAgICAqIGFuZCB0aGUgZmFydGhlc3QgdmlhCisgICAgICAgICAqICAgbm9kZXMuY29tbW9uQW5jZXN0b3JzKCkubGFzdCgpCisgICAgICAgICAqICwgYmVjYXVzZSB0aGUgY29tbW9uIGFuY2VzdG9ycyBhcmUgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjbG9zZW5lc3MuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEEgc2VsZWN0b3IgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBjb21tb25BbmNlc3RvcnMoc2VsZWN0b3I/OiBTZWxlY3Rvcik6IENvbGxlY3Rpb25Ob2RlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGFsbCBvcnBoYW4gKGkuZS4gaGFzIG5vIGNvbXBvdW5kIHBhcmVudCkgbm9kZXMgaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQSBzZWxlY3RvciB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBvcnBoYW5zKHNlbGVjdG9yPzogU2VsZWN0b3IpOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbGwgbm9ub3JwaGFuIChpLmUuIGhhcyBhIGNvbXBvdW5kIHBhcmVudCkgbm9kZXMgaW4gdGhlIGNhbGxpbmcgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQSBzZWxlY3RvciB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBub25vcnBoYW5zKHNlbGVjdG9yPzogU2VsZWN0b3IpOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbGwgY29tcG91bmQgY2hpbGQgKGkuZS4gZGlyZWN0IGRlc2NlbmRhbnQpIG5vZGVzIG9mIGVhY2ggbm9kZSBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQSBzZWxlY3RvciB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjaGlsZHJlbihzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYWxsIGNvbXBvdW5kIGRlc2NlbmRhbnQgKGkuZS4gY2hpbGRyZW4sIGNoaWxkcmVuJ3MgY2hpbGRyZW4sIGV0Yy4pIG5vZGVzIG9mIGVhY2ggbm9kZSBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQSBzZWxlY3RvciB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBkZXNjZW5kYW50cyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYWxsIHNpYmxpbmcgKGkuZS4gc2FtZSBjb21wb3VuZCBwYXJlbnQpIG5vZGVzIG9mIGVhY2ggbm9kZSBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gQSBzZWxlY3RvciB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0YW50IGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBzaWJsaW5ncyhzZWxlY3Rvcj86IFNlbGVjdG9yKTogQ29sbGVjdGlvbk5vZGVzOworICAgIH0KKworICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRmlyc3RNYW5pcHVsYXRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBncmFwaC4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZWQoKTogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGluc2lkZSB0aGUgZ3JhcGggKGkuZS4gbm90IHJlbW92ZWQpLgorICAgICAgICAgKi8KKyAgICAgICAgaW5zaWRlKCk6IGJvb2xlYW47CisKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25GaXJzdERhdGEgeworICAgICAgICAvL2h0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNjb2xsZWN0aW9uL2RhdGEKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGFsbCBkYXRhIGZvciB0aGUgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIGRhdGEoKTogYW55OworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgcGFydGljdWxhciBkYXRhIGZpZWxkIGZvciB0aGUgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIGRhdGEobmFtZTogc3RyaW5nKTogYW55OworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgcGFydGljdWxhciBkYXRhIGZpZWxkIGZvciB0aGUgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIGRhdGEobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZSBtdWx0aXBsZSBkYXRhIGZpZWxkcyBhdCBvbmNlIHZpYSBhbiBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBkYXRhKG9iajogYW55KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBlbnRpcmUgc2NyYXRjaHBhZCBvYmplY3QgZm9yIHRoZSBlbGVtZW50LCB3aGVyZSB0ZW1wb3Jhcnkgb3Igbm9uLUpTT04gZGF0YSBjYW4gYmUgc3RvcmVkLiBBcHAtbGV2ZWwgc2NyYXRjaHBhZCBkYXRhIHNob3VsZCB1c2UgbmFtZXNwYWNlcyBwcmVmaXhlZCB3aXRoIHVuZGVyc2NvcmUsIGxpa2UgJ19mb28nLgorICAgICAgICAgKi8KKyAgICAgICAgc2NyYXRjaCgpOiBTY3JhdGNocGFkOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBzY3JhdGNocGFkIGF0IGEgcGFydGljdWxhciBuYW1lc3BhY2UsIHdoZXJlIHRlbXBvcmFyeSBvciBub24tSlNPTiBkYXRhIGNhbiBiZSBzdG9yZWQuIEFwcC1sZXZlbCBzY3JhdGNocGFkIGRhdGEgc2hvdWxkIHVzZSBuYW1lc3BhY2VzIHByZWZpeGVkIHdpdGggdW5kZXJzY29yZSwgbGlrZSAnX2ZvbycuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgQSBuYW1lc3BhY2Ugc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc2NyYXRjaChuYW1lc3BhY2U6IHN0cmluZyk6IFNjcmF0Y2hwYWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHNjcmF0Y2hwYWQgYXQgYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZSwgd2hlcmUgdGVtcG9yYXJ5IG9yIG5vbi1KU09OIGRhdGEgY2FuIGJlIHN0b3JlZC4gQXBwLWxldmVsIHNjcmF0Y2hwYWQgZGF0YSBzaG91bGQgdXNlIG5hbWVzcGFjZXMgcHJlZml4ZWQgd2l0aCB1bmRlcnNjb3JlLCBsaWtlICdfZm9vJy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWVzcGFjZSBBIG5hbWVzcGFjZSBzdHJpbmcuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgorICAgICAgICAgKi8KKyAgICAgICAgc2NyYXRjaChuYW1lc3BhY2U6IHN0cmluZywgdmFsdWU6IGFueSk6IFNjcmF0Y2hwYWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBzY3JhdGNocGFkIGRhdGEuIFlvdSBzaG91bGQgcmVtb3ZlIHNjcmF0Y2hwYWQgZGF0YSBvbmx5IGF0IHlvdXIgb3duIG5hbWVzcGFjZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgQSBuYW1lc3BhY2Ugc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlU2NyYXRjaChuYW1lc3BhY2U6IHN0cmluZyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgc2hvcnRjdXQgdG8gZ2V0IHRoZSBJRCBvZiBhbiBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgaWQoKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGVsZW1lbnQncyBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGpzb24oKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGdyb3VwIHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBncm91cCBzdHJpbmdzIGFyZSAnbm9kZXMnIGZvciBub2RlcyBhbmQgJ2VkZ2VzJyBmb3IgZWRnZXMuIEluIGdlbmVyYWwsIHlvdSBzaG91bGQgYmUgdXNpbmcgZWxlLmlzRWRnZSgpIGFuZCBlbGUuaXNOb2RlKCkgaW5zdGVhZCBvZiBlbGUuZ3JvdXAoKS4KKyAgICAgICAgICovCisgICAgICAgIGdyb3VwKCk6IEVsZW1lbnRHcm91cDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYSBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNOb2RlKCk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGFuIGVkZ2UuCisgICAgICAgICAqLworICAgICAgICBpc0VkZ2UoKTogYm9vbGVhbjsKKworCisgICAgICAgIGN5KCk6IEN5Lkluc3RhbmNlCisgICAgfQorICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRmlyc3RFZGdlRGF0YSB7CisgICAgICAgIC8vaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vZGF0YQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB0aGUgZWRnZSBpcyBhIGxvb3AgKGkuZS4gc291cmNlIHNhbWUgYXMgdGFyZ2V0KS4KKyAgICAgICAgICovCisgICAgICAgIGlzTG9vcCgpOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB0aGUgZWRnZSBpcyBzaW1wbGUgKGkuZS4gc291cmNlIGRpZmZlcmVudCB0aGFuIHRhcmdldCkuCisgICAgICAgICAqLworICAgICAgICBpc1NpbXBsZSgpOiBib29sZWFuOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkZpcnN0Tm9kZU1ldGFkYXRhIHsKKyAgICAgICAgLy9odHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9tZXRhZGF0YQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRlZ3JlZSBvZiBhIG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBhIG5vZGUsIHRoZSBkZWdyZWUgaXMgdGhlIG51bWJlciBvZiBlZGdlIGNvbm5lY3Rpb25zIGl0IGhhcy4gRWFjaCB0aW1lIGEgbm9kZSBpcyByZWZlcmVuY2VkIGFzIHNvdXJjZSBvciB0YXJnZXQgb2YgYW4gZWRnZSBpbiB0aGUgZ3JhcGgsIHRoYXQgY291bnRzIGFzIGFuIGVkZ2UgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluY2x1ZGVMb29wcyBBIGJvb2xlYW4sIGluZGljYXRpbmcgd2hldGhlciBsb29wcyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gZGVncmVlIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIGRlZ3JlZShpbmNsdWRlTG9vcHM6IGJvb2xlYW4pOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGluZGVncmVlIG9mIGEgbm9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIGEgbm9kZSwgdGhlIGluZGVncmVlIGlzIHRoZSBudW1iZXIgb2YgaW5jb21pbmcgZWRnZSBjb25uZWN0aW9ucyBpdCBoYXMuIEVhY2ggdGltZSBhIG5vZGUgaXMgcmVmZXJyZWQgdG8gYXMgdGFyZ2V0IG9mIGFuIGVkZ2UgaW4gdGhlIGdyYXBoLCB0aGF0IGNvdW50cyBhcyBhbiBpbmNvbWluZyBlZGdlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbmNsdWRlTG9vcHMgQSBib29sZWFuLCBpbmRpY2F0aW5nIHdoZXRoZXIgbG9vcHMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIGRlZ3JlZSBjYWxjdWxhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBpbmRlZ3JlZShpbmNsdWRlTG9vcHM6IGJvb2xlYW4pOiBudW1iZXI7CisgICAgICAgIC8qKioKKyAgICAgICAgICogR2V0IHRoZSBvdXRkZWdyZWUgb2YgYSBub2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgYSBub2RlLCB0aGUgb3V0ZGVncmVlIGlzIHRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgZWRnZSBjb25uZWN0aW9ucyBpdCBoYXMuIEVhY2ggdGltZSBhIG5vZGUgaXMgcmVmZXJyZWQgdG8gYXMgc291cmNlIG9mIGFuIGVkZ2UgaW4gdGhlIGdyYXBoLCB0aGF0IGNvdW50cyBhcyBhbiBvdXRnb2luZyBlZGdlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbmNsdWRlTG9vcHMgQSBib29sZWFuLCBpbmRpY2F0aW5nIHdoZXRoZXIgbG9vcHMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIGRlZ3JlZSBjYWxjdWxhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBvdXRkZWdyZWUoaW5jbHVkZUxvb3BzOiBib29sZWFuKTogbnVtYmVyOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkZpcnN0Tm9kZVBvc2l0aW9uIGV4dGVuZHMgQ29sbGVjdGlvblBvc2l0aW9ueworICAgICAgICAvL2h0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNjb2xsZWN0aW9uL3Bvc2l0aW9uLS1kaW1lbnNpb25zCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgKG1vZGVsKSBwb3NpdGlvbiBvZiBhIG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwb3NpdGlvbigpOiBQb3NpdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcG9zaXRpb24gZGltZW5zaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBwb3NpdGlvbiBkaW1lbnNpb24gdG8gZ2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcG9zaXRpb24oZGltZW5zaW9uOiBQb3NpdGlvbkRpbWVuc2lvbik6IFBvc2l0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwb3NpdGlvbiBkaW1lbnNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIHBvc2l0aW9uIGRpbWVuc2lvbiB0byBzZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSBkaW1lbnNpb24uCisgICAgICAgICAqLworICAgICAgICBwb3NpdGlvbihkaW1lbnNpb246IFBvc2l0aW9uRGltZW5zaW9uLCB2YWx1ZTogbnVtYmVyKTogQ29sbGVjdGlvbk5vZGVzOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwb3NpdGlvbiB1c2luZyBuYW1lLXZhbHVlIHBhaXJzIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcG9zIEFuIG9iamVjdCBzcGVjaWZ5aW5nIG5hbWUtdmFsdWUgcGFpcnMgcmVwcmVzZW50aW5nIGRpbWVuc2lvbnMgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcG9zaXRpb24ocG9zOiBQb3NpdGlvbik6IENvbGxlY3Rpb25Ob2RlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSAobW9kZWwpIHBvc2l0aW9uIG9mIGEgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIG1vZGVsUG9zaXRpb24oKTogUG9zaXRpb247CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBvc2l0aW9uIGRpbWVuc2lvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgcG9zaXRpb24gZGltZW5zaW9uIHRvIGdldC4KKyAgICAgICAgICovCisgICAgICAgIG1vZGVsUG9zaXRpb24oZGltZW5zaW9uOiBQb3NpdGlvbkRpbWVuc2lvbik6IFBvc2l0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwb3NpdGlvbiBkaW1lbnNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIHBvc2l0aW9uIGRpbWVuc2lvbiB0byBzZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSBkaW1lbnNpb24uCisgICAgICAgICAqLworICAgICAgICBtb2RlbFBvc2l0aW9uKGRpbWVuc2lvbjogUG9zaXRpb25EaW1lbnNpb24sIHZhbHVlOiBudW1iZXIpOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIHVzaW5nIG5hbWUtdmFsdWUgcGFpcnMgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3MgQW4gb2JqZWN0IHNwZWNpZnlpbmcgbmFtZS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgZGltZW5zaW9ucyB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBtb2RlbFBvc2l0aW9uKHBvczogUG9zaXRpb24pOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgKG1vZGVsKSBwb3NpdGlvbiBvZiBhIG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwb2ludCgpOiBQb3NpdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcG9zaXRpb24gZGltZW5zaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBwb3NpdGlvbiBkaW1lbnNpb24gdG8gZ2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcG9pbnQoZGltZW5zaW9uOiBQb3NpdGlvbkRpbWVuc2lvbik6IFBvc2l0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwb3NpdGlvbiBkaW1lbnNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIHBvc2l0aW9uIGRpbWVuc2lvbiB0byBzZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSBkaW1lbnNpb24uCisgICAgICAgICAqLworICAgICAgICBwb2ludChkaW1lbnNpb246IFBvc2l0aW9uRGltZW5zaW9uLCB2YWx1ZTogbnVtYmVyKTogQ29sbGVjdGlvbk5vZGVzOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwb3NpdGlvbiB1c2luZyBuYW1lLXZhbHVlIHBhaXJzIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcG9zIEFuIG9iamVjdCBzcGVjaWZ5aW5nIG5hbWUtdmFsdWUgcGFpcnMgcmVwcmVzZW50aW5nIGRpbWVuc2lvbnMgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcG9pbnQocG9zOiBQb3NpdGlvbik6IENvbGxlY3Rpb25Ob2RlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSByZW5kZXJlZCAob24tc2NyZWVuKSBwb3NpdGlvbiBvZiBhIG5vZGUuCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlZFBvc2l0aW9uKCk6IFBvc2l0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCByZW5kZXJlZCBwb3Npc2l0aW9uIGRpbWVuc2lvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgcG9zaXRpb24gZGltZW5zaW9uIHRvIGdldC4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkUG9zaXRpb24oZGltZW5zaW9uOiBQb3NpdGlvbkRpbWVuc2lvbik6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcmVuZGVyZWQgcG9zaXNpdGlvbiBkaW1lbnNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIHBvc2l0aW9uIGRpbWVuc2lvbiB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSBkaW1lbnNpb24uCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlZFBvc2l0aW9uKGRpbWVuc2lvbjogUG9zaXRpb25EaW1lbnNpb24sIHZhbHVlOiBudW1iZXIpOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHJlbmRlcmVkIHBvc2l0aW9uIHVzaW5nIG5hbWUtdmFsdWUgcGFpcnMgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3MgQW4gb2JqZWN0IHNwZWNpZnlpbmcgbmFtZS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgZGltZW5zaW9ucyB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlZFBvc2l0aW9uKHBvczogUG9zaXRpb24pOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcmVuZGVyZWQgKG9uLXNjcmVlbikgcG9zaXRpb24gb2YgYSBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcmVuZGVyZWRQb2ludCgpOiBQb3NpdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcmVuZGVyZWQgKG9uLXNjcmVlbikgcG9zaXRpb24gb2YgYSBub2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBwb3NpdGlvbiBkaW1lbnNpb24gdG8gZ2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcmVuZGVyZWRQb2ludChkaW1lbnNpb246IFBvc2l0aW9uRGltZW5zaW9uKTogbnVtYmVyOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCByZW5kZXJlZCBwb3Npc2l0aW9uIGRpbWVuc2lvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgcG9zaXRpb24gZGltZW5zaW9uIHRvIGdldC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgdG8gdGhlIGRpbWVuc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkUG9pbnQoZGltZW5zaW9uOiBQb3NpdGlvbkRpbWVuc2lvbiwgdmFsdWU6IG51bWJlcik6IENvbGxlY3Rpb25Ob2RlczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgcmVuZGVyZWQgcG9zaXRpb24gdXNpbmcgbmFtZS12YWx1ZSBwYWlycyBpbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvcyBBbiBvYmplY3Qgc3BlY2lmeWluZyBuYW1lLXZhbHVlIHBhaXJzIHJlcHJlc2VudGluZyBkaW1lbnNpb25zIHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkUG9pbnQocG9zOiBQb3NpdGlvbik6IENvbGxlY3Rpb25Ob2RlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiBhIG5vZGUsIHJlbGF0aXZlIHRvIGl0cyBjb21wb3VuZCBwYXJlbnQuCisgICAgICAgICAqLworICAgICAgICByZWxhdGl2ZVBvc2l0aW9uKCk6IFBvc2l0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiBhIG5vZGUsIHJlbGF0aXZlIHRvIGl0cyBjb21wb3VuZCBwYXJlbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIHBvc2l0aW9uIGRpbWVuc2lvbiB0byBnZXQuCisgICAgICAgICAqLworICAgICAgICByZWxhdGl2ZVBvc2l0aW9uKGRpbWVuc2lvbjogUG9zaXRpb25EaW1lbnNpb24pOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHJlbGF0aXZlIHBvc2lzaXRpb24gZGltZW5zaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBwb3NpdGlvbiBkaW1lbnNpb24gdG8gZ2V0LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0byB0aGUgZGltZW5zaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmVsYXRpdmVQb3NpdGlvbihkaW1lbnNpb246IFBvc2l0aW9uRGltZW5zaW9uLCB2YWx1ZTogbnVtYmVyKTogQ29sbGVjdGlvbk5vZGVzOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSByZWxhdGl2ZSBwb3NpdGlvbiB1c2luZyBuYW1lLXZhbHVlIHBhaXJzIGluIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcG9zIEFuIG9iamVjdCBzcGVjaWZ5aW5nIG5hbWUtdmFsdWUgcGFpcnMgcmVwcmVzZW50aW5nIGRpbWVuc2lvbnMgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcmVsYXRpdmVQb3NpdGlvbihwb3M6IFBvc2l0aW9uKTogQ29sbGVjdGlvbk5vZGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIGEgbm9kZSwgcmVsYXRpdmUgdG8gaXRzIGNvbXBvdW5kIHBhcmVudC4KKyAgICAgICAgICovCisgICAgICAgIHJlbGF0aXZlUG9pbnQoKTogUG9zaXRpb247CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIGEgbm9kZSwgcmVsYXRpdmUgdG8gaXRzIGNvbXBvdW5kIHBhcmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgcG9zaXRpb24gZGltZW5zaW9uIHRvIGdldC4KKyAgICAgICAgICovCisgICAgICAgIHJlbGF0aXZlUG9pbnQoZGltZW5zaW9uOiBQb3NpdGlvbkRpbWVuc2lvbik6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcmVsYXRpdmUgcG9zaXNpdGlvbiBkaW1lbnNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIHBvc2l0aW9uIGRpbWVuc2lvbiB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSBkaW1lbnNpb24uCisgICAgICAgICAqLworICAgICAgICByZWxhdGl2ZVBvaW50KGRpbWVuc2lvbjogUG9zaXRpb25EaW1lbnNpb24sIHZhbHVlOiBudW1iZXIpOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIHVzaW5nIG5hbWUtdmFsdWUgcGFpcnMgaW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3MgQW4gb2JqZWN0IHNwZWNpZnlpbmcgbmFtZS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgZGltZW5zaW9ucyB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICByZWxhdGl2ZVBvaW50KHBvczogUG9zaXRpb24pOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgfQorICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRmlyc3RQb3NpdGlvbiB7CisgICAgICAgIC8vaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vcG9zaXRpb24tLWRpbWVuc2lvbnMKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB3aWR0aCBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHdpZHRoKCk6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgb3V0ZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQgKGluY2x1ZGVzIHdpZHRoICYgYm9yZGVyKS4KKyAgICAgICAgICovCisgICAgICAgIG91dGVyV2lkdGgoKTogbnVtYmVyOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB3aWR0aCBvZiB0aGUgZWxlbWVudCBpbiByZW5kZXJlZCBkaW1lbnNpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcmVuZGVyZWRXaWR0aCgpOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG91dGVyIHdpZHRoIG9mIHRoZSBlbGVtZW50IChpbmNsdWRlcyB3aWR0aCAmIGJvcmRlcikgaW4gcmVuZGVyZWQgZGltZW5zaW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkT3V0ZXJXaWR0aCgpOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgaGVpZ2h0KCk6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgb3V0ZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IChpbmNsdWRlcyBoZWlnaHQgJiBib3JkZXIpLgorICAgICAgICAgKi8KKyAgICAgICAgb3V0ZXJIZWlnaHQoKTogbnVtYmVyOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgaW4gcmVuZGVyZWQgZGltZW5zaW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkSGVpZ2h0KCk6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgb3V0ZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IChpbmNsdWRlcyBoZWlnaHQgJiBib3JkZXIpIGluIHJlbmRlcmVkIGRpbWVuc2lvbnMuCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlZE91dGVySGVpZ2h0KCk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGFjdGl2ZSAoZS5nLiBvbiB1c2VyIHRhcCwgZ3JhYiwgZXRjKS4KKyAgICAgICAgICovCisgICAgICAgIGFjdGl2ZSgpOiBib29sZWFuOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkZpcnN0U2VsZWN0aW9uIHsKKyAgICAgICAgLy8gaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vc2VsZWN0aW9uCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIHNlbGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgc2VsZWN0ZWQoKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgdGhlIGVsZW1lbnQncyBzZWxlY3Rpb24gc3RhdGUgaXMgbXV0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHNlbGVjdGFibGUoKTogYm9vbGVhbjsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25GaXJzdFN0eWxlIHsKKyAgICAgICAgLy8gaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvbGxlY3Rpb24vc3R5bGUKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgYW4gZWxlbWVudCBoYXMgYSBwYXJ0aWN1bGFyIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byB0ZXN0IGZvci4KKyAgICAgICAgICovCisgICAgICAgIGhhc0NsYXNzKGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbjsKKworICAgICAgICAvLy8qKgorICAgICAgICAvLyogR2V0IGEgbmFtZS12YWx1ZSBwYWlyIG9iamVjdCBjb250YWluaW5nIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB0aGVpciB2YWx1ZXMgZm9yIHRoZSBlbGVtZW50LgorICAgICAgICAvLyovCisgICAgICAgIC8vc3R5bGUoKTogQ3NzLkVsZW1lbnRDc3M7CisgICAgICAgIC8vLyoqCisgICAgICAgIC8vICogR2V0IGEgcGFydGljdWxhciBzdHlsZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgICAgLy8gKgorICAgICAgICAvLyAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB2aXN1YWwgc3R5bGUgcHJvcGVydHkgdG8gZ2V0LgorICAgICAgICAvLyAqLworICAgICAgICAvL3N0eWxlKG5hbWU6IHN0cmluZyk6IENzcy5FbGVtZW50Q3NzOworCisgICAgICAgIC8vLyoqCisgICAgICAgIC8vICogR2V0IGEgbmFtZS12YWx1ZSBwYWlyIG9iamVjdCBjb250YWluaW5nIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB0aGVpciB2YWx1ZXMgZm9yIHRoZSBlbGVtZW50LgorICAgICAgICAvLyAqLworICAgICAgICAvL2NzcygpOiBDc3MuRWxlbWVudENzczsKKyAgICAgICAgLy8vKioKKyAgICAgICAgLy8gKiBHZXQgYSBwYXJ0aWN1bGFyIHN0eWxlIHByb3BlcnR5IHZhbHVlLgorICAgICAgICAvLyAqCisgICAgICAgIC8vICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHZpc3VhbCBzdHlsZSBwcm9wZXJ0eSB0byBnZXQuCisgICAgICAgIC8vICovCisgICAgICAgIC8vY3NzKG5hbWU6IHN0cmluZyk6IENzcy5FbGVtZW50Q3NzOworCisgICAgICAgIC8vLyoqCisgICAgICAgIC8vICogR2V0IGEgbmFtZS12YWx1ZSBwYWlyIG9iamVjdCBjb250YWluaW5nIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB0aGVpciB2YWx1ZXMgZm9yIHRoZSBlbGVtZW50LgorICAgICAgICAvLyAqLworICAgICAgICAvL2J5cGFzcygpOiBDc3MuRWxlbWVudENzczsKKyAgICAgICAgLy8vKioKKyAgICAgICAgLy8gKiBHZXQgYSBwYXJ0aWN1bGFyIHN0eWxlIHByb3BlcnR5IHZhbHVlLgorICAgICAgICAvLyAqCisgICAgICAgIC8vICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHZpc3VhbCBzdHlsZSBwcm9wZXJ0eSB0byBnZXQuCisgICAgICAgIC8vICovCisgICAgICAgIC8vYnlwYXNzKG5hbWU6IHN0cmluZyk6IENzcy5FbGVtZW50Q3NzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBuYW1lLXZhbHVlIHBhaXIgb2JqZWN0IGNvbnRhaW5pbmcgcmVuZGVyZWQgdmlzdWFsIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcyBmb3IgdGhlIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlZFN0eWxlKCk6IENzcy5FbGVtZW50Q3NzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgcGFydGljdWxhciByZW5kZXJlZCBzdHlsZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHZpc3VhbCBzdHlsZSBwcm9wZXJ0eSB0byBnZXQuCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlZFN0eWxlKG5hbWU6IHN0cmluZyk6IENzcy5FbGVtZW50Q3NzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgbmFtZS12YWx1ZSBwYWlyIG9iamVjdCBjb250YWluaW5nIHJlbmRlcmVkIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB0aGVpciB2YWx1ZXMgZm9yIHRoZSBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcmVuZGVyZWRDc3MoKTogQ3NzLkVsZW1lbnRDc3M7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBwYXJ0aWN1bGFyIHJlbmRlcmVkIHN0eWxlIHByb3BlcnR5IHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmlzdWFsIHN0eWxlIHByb3BlcnR5IHRvIGdldC4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkQ3NzKG5hbWU6IHN0cmluZyk6IENzcy5FbGVtZW50Q3NzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlzaWJsZSgpOiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaGlkZGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaGlkZGVuKCk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZWZmZWN0aXZlIG9wYWNpdHkgb2YgdGhlIGVsZW1lbnQgKGkuZS4gb24tc2NyZWVuIG9wYWNpdHkpLCB3aGljaCB0YWtlcyBpbnRvIGNvbnNpZGVyYXRpb24gcGFyZW50IG5vZGUgb3BhY2l0eS4KKyAgICAgICAgICovCisgICAgICAgIGVmZmVjdGl2ZU9wYWNpdHkoKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB0aGUgZWxlbWVudCdzIGVmZmVjdGl2ZSBvcGFjaXR5IGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQsIHdoaWNoIHRha2VzIGludG8gY29uc2lkZXJhdGlvbiBwYXJlbnQgbm9kZSBvcGFjaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgdHJhbnNwYXJlbnQoKTogYm9vbGVhbjsKKyAgICB9CisgICAgaW50ZXJmYWNlIENvbGxlY3Rpb25GaXJ0c0FuaW1hdGlvbiB7CisgICAgICAgIC8vIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNjb2xsZWN0aW9uL2FuaW1hdGlvbgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB0aGUgZWxlbWVudCBpcyBjdXJyZW50bHkgYmVpbmcgYW5pbWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBhbmltYXRlZCgpOiBib29sZWFuOworICAgIH0KKyAgICBpbnRlcmZhY2UgQ29sbGVjdGlvbkZpcnN0RWRnZVRyYXZlcnNpbmcgeworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi90cmF2ZXJzaW5nCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBzb3VyY2Ugbm9kZSBvZiB0aGlzIGVkZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEFuIG9wdGlvbmFsIHNlbGVjdG9yIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc291cmNlKHNlbGVjdG9yPzogU2VsZWN0b3IpOiBDb2xsZWN0aW9uTm9kZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0YXJnZXQgbm9kZSBvZiB0aGlzIGVkZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIEFuIG9wdGlvbmFsIHNlbGVjdG9yIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdGFyZ2V0KHNlbGVjdG9yPzogU2VsZWN0b3IpOiBDb2xsZWN0aW9uTm9kZXM7CisgICAgfQorICAgIGludGVyZmFjZSBDb2xsZWN0aW9uRmlyc3ROb2RlQ29tcG91bmQgeworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29sbGVjdGlvbi9jb21wb3VuZC1ub2RlcworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB0aGUgbm9kZSBpcyBhIGNvbXBvdW5kIHBhcmVudCAoaS5lLiBhIG5vZGUgY29udGFpbmluZyBvbmUgb3IgbW9yZSBjaGlsZCBub2RlcykKKyAgICAgICAgICovCisgICAgICAgIGlzUGFyZW50KCk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIHRoZSBub2RlIGlzIGEgY29tcG91bmQgY2hpbGQgKGkuZS4gY29udGFpbmVkIHdpdGhpbiBhIG5vZGUpCisgICAgICAgICAqLworICAgICAgICBpc0NoaWxkKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIEVsZW1lbnRzRGVmaW5pdGlvbiB7CisgICAgICAgIG5vZGVzOiBTZGMuTW9kZWxzLkdyYXBoLkNvbW1vbk5vZGVCYXNlW107CisgICAgICAgIGVkZ2VzOiBTZGMuTW9kZWxzLkNvbW1vbkxpbmtCYXNlW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIEVsZW1lbnREZWZpbml0aW9uIHsKKworCisgICAgICAgIGdyb3VwPzogRWxlbWVudEdyb3VwOworICAgICAgICBkYXRhOiAgU2RjLk1vZGVscy5HcmFwaC5Db21tb25Ob2RlQmFzZXwgU2RjLk1vZGVscy5Db21tb25MaW5rQmFzZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNjcmF0Y2hwYWQgZGF0YSAodXN1YWxseSB0ZW1wIG9yIG5vbnNlcmlhbGlzYWJsZSBkYXRhKQorICAgICAgICAgKi8KKyAgICAgICAgc2NhdGNoPzogU2NyYXRjaHBhZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtb2RlbCBwb3NpdGlvbiBvZiB0aGUgbm9kZSAob3B0aW9uYWwgb24gaW5pdCwgbWFuZGF0b3J5IGFmdGVyKQorICAgICAgICAgKi8KKyAgICAgICAgcG9zaXRpb24/OiBQb3NpdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNhbiBhbHRlcm5hdGl2ZWx5IHNwZWNpZnkgcG9zaXRpb24gaW4gcmVuZGVyZWQgb24tc2NyZWVuIHBpeGVscworICAgICAgICAgKi8KKyAgICAgICAgcmVuZGVyZWRQb3NpdGlvbj86IFBvc2l0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0aGUgZWxlbWVudCBpcyBzZWxlY3RlZCAoZGVmYXVsdCBmYWxzZSkKKyAgICAgICAgICovCisgICAgICAgIHNlbGVjdGVkPzogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzdGF0ZSBpcyBtdXRhYmxlIChkZWZhdWx0IHRydWUpCisgICAgICAgICAqLworICAgICAgICBzZWxlY3RhYmxlPzogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZW4gbG9ja2VkIGEgbm9kZSdzIHBvc2l0aW9uIGlzIGltbXV0YWJsZSAoZGVmYXVsdCBmYWxzZSkKKyAgICAgICAgICovCisgICAgICAgIGxvY2tlZD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBXZXRoZXIgdGhlIG5vZGUgY2FuIGJlIGdyYWJiZWQgYW5kIG1vdmVkIGJ5IHRoZSB1c2VyCisgICAgICAgICAqLworICAgICAgICBncmFiYmFibGU/OiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBuYW1lcyB0aGF0IHRoZSBlbGVtZW50IGhhcworICAgICAgICAgKi8KKyAgICAgICAgY2xhc3Nlcz86IHN0cmluZzsKKyAgICAgICAgc3R5bGU/OiBDU1NTdHlsZURlY2xhcmF0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogeW91IHNob3VsZCBvbmx5IHVzZSBgc3R5bGVgL2Bjc3NgIGZvciB2ZXJ5IHNwZWNpYWwgY2FzZXM7IHVzZSBjbGFzc2VzIGluc3RlYWQKKyAgICAgICAgICovCisgICAgICAgIGNzcz86IENzcy5FbGVtZW50Q3NzOworICAgIH0KKyAgICAKKyAgICAvLyBpbnRlcmZhY2UgRWxlbWVudERhdGFEZWZpbml0aW9uIHsKKyAgICAvLyAgICAgLyoqCisgICAgLy8gICAgICAqIGVsaWRlZCBpZCA9PiBhdXRvZ2VuZXJhdGVkIGlkCisgICAgLy8gICAgICAqLworICAgIC8vICAgICBpc1NkY0VsZW1lbnQ/OiBib29sZWFuOworICAgIC8vICAgICBpZD86IHN0cmluZzsKKyAgICAvLyAgICAgcG9zaXRpb24/OiBQb3NpdGlvbjsKKyAgICAvLyAgICAgbGFiZWw/OiBzdHJpbmc7CisgICAgLy8gfQorICAgIGludGVyZmFjZSBFZGdlRGVmaW5pdGlvbiBleHRlbmRzIEVsZW1lbnREZWZpbml0aW9uIHsKKyAgICAgICAgZGF0YTogU2RjLk1vZGVscy5Db21tb25MaW5rQmFzZTsKKyAgICB9CisKKyAgICAvLyBpbnRlcmZhY2UgRWRnZURhdGFEZWZpbml0aW9uIGV4dGVuZHMgRWxlbWVudERhdGFEZWZpbml0aW9uIHsgLyoqCisgICAgLy8gICAgICAgICAgKiB0aGUgc291cmNlIG5vZGUgaWQgKGVkZ2UgY29tZXMgZnJvbSB0aGlzIG5vZGUpCisgICAgLy8gICAgICAgICAgKi8KKyAgICAvLyAgICAgICAgIHNvdXJjZTogc3RyaW5nOworICAgIC8vICAgICAvKioKKyAgICAvLyAgICAgICogdGhlIHRhcmdldCBub2RlIGlkIChlZGdlIGdvZXMgdG8gdGhpcyBub2RlKQorICAgIC8vICAgICAgKi8KKyAgICAvLyAgICAgdGFyZ2V0OiBzdHJpbmc7CisgICAgLy8gICAgIGNvbW1vbkdyYXBoTGluaz86IFNkYy5Nb2RlbHMuQ29tcG9zaXRpb25DaUxpbmtCYXNlOyAvL3RoaXMgaXMgc2RjLWxpbmstZGF0YS1vYmplY3QKKyAgICAvLyB9CisgICAgaW50ZXJmYWNlIE5vZGVEZWZpbml0aW9uIGV4dGVuZHMgRWxlbWVudERlZmluaXRpb24geworCisgICAgICAgIGRhdGE6ICBTZGMuTW9kZWxzLkdyYXBoLkNvbW1vbk5vZGVCYXNlOworCisgICAgfQorICAgIC8vIGludGVyZmFjZSBOb2RlRGF0YURlZmluaXRpb24gZXh0ZW5kcyBFbGVtZW50RGF0YURlZmluaXRpb24geworICAgIC8vICAgICBwYXJlbnQ/OiBzdHJpbmc7CisgICAgLy8gICAgIGNvbW1vbkdyYXBoTm9kZT86IFNkYy5Nb2RlbHMuR3JhcGguQ29tbW9uTm9kZUJhc2U7IC8vdGhpcyBpcyBzZGMtbm9kZS1kYXRhLW9iamVjdAorICAgIC8vICAgICB0eXBlOiBzdHJpbmcKKyAgICAvLworICAgIC8vIH0KKworICAgIGludGVyZmFjZSBTdHlsZXNoZWV0IHsKKyAgICAgICAgc2VsZWN0b3I6IHN0cmluZzsKKyAgICAgICAgY3NzOiBDc3MuRWxlbWVudENzczsKKyAgICB9CisKKyAgICBleHBvcnQgbW9kdWxlIENzcyB7CisgICAgICAgIC8vVE9ETzogaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI3N0eWxlCisKKyAgICAgICAgdHlwZSBDb2xvdXIgPSBzdHJpbmc7CisKKyAgICAgICAgLy8gVE9ETzogSG93IHRvIGNvbnN0cmFpbiB0byBhIHZhbHVlPworICAgICAgICB0eXBlIFNoYXBlID0gc3RyaW5nOyAvLyAncmVjdGFuZ2xlJywgJ3JvdW5kcmVjdGFuZ2xlJywgJ2VsbGlwc2UnLCAndHJpYW5nbGUnLCBwZW50YWdvbiwgaGV4YWdvbiwgaGVwdGFnb24sIG9jdGFnb24sIHN0YXIKKworICAgICAgICAvLyBUT0RPOiBIb3cgdG8gY29uc3RyYWluIHRvIGEgdmFsdWU/CisgICAgICAgIHR5cGUgU3R5bGUgPSBzdHJpbmc7IC8vIHNvbGlkLCBkb3R0ZWQsIGRhc2hlZCwgb3IgZG91YmxlCisKKyAgICAgICAgZXhwb3J0IGludGVyZmFjZSBOb2RlQ3NzIHsKKyAgICAgICAgICAgIHdpZHRoPzogbnVtYmVyOworICAgICAgICAgICAgaGVpZ2h0PzogbnVtYmVyOworICAgICAgICAgICAgc2hhcGU/OiBTaGFwZTsKKyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj86IENvbG91cjsKKyAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yIj86IGFueTsKKyAgICAgICAgICAgICJiYWNrZ3JvdW5kLWJsYWNrZW4iPzogbnVtYmVyOworICAgICAgICAgICAgImJhY2tncm91bmQtb3BhY2l0eSI/OiBudW1iZXI7CisgICAgICAgICAgICAiYmFja2dyb3VuZC1pbWFnZSI/OiBhbnk7CisgICAgICAgICAgICAiYmFja2dyb3VuZC13aWR0aCI/OiBudW1iZXI7CisgICAgICAgICAgICAiYmFja2dyb3VuZC1oZWlnaHQiPzogbnVtYmVyOworICAgICAgICAgICAgImJvcmRlci13aWR0aCI/OiBudW1iZXI7CisgICAgICAgICAgICAiYm9yZGVyLXN0eWxlIj86IFN0eWxlOworICAgICAgICAgICAgImJvcmRlci1jb2xvciI/OiBDb2xvdXI7CisgICAgICAgICAgICAiYm9yZGVyLW9wYWNpdHkiPzogbnVtYmVyOworICAgICAgICAgICAgImxhYmVsIj86IHN0cmluZzsKKyAgICAgICAgICAgICJldmVudHMiPzogc3RyaW5nOworICAgICAgICAgICAgInRleHQtZXZlbnRzIj86IHN0cmluZzsKKyAgICAgICAgICAgICJ0ZXh0LXZhbGlnbiI/IDpzdHJpbmc7CisgICAgICAgICAgICAidGV4dC1oYWxpZ24iPyA6c3RyaW5nOworICAgICAgICAgICAgInRleHQtbWFyZ2luLXkiPyA6YW55OworICAgICAgICAgICAgImFjdGl2ZS1iZy1zaXplIj86IG51bWJlcjsKKyAgICAgICAgICAgICJiYWNrZ3JvdW5kLWZpdCI/OiBzdHJpbmc7CisgICAgICAgICAgICAiYmFja2dyb3VuZC1jbGlwIj86IHN0cmluZzsKKyAgICAgICAgICAgICJiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHkiPzogbnVtYmVyOworICAgICAgICAgICAgIm92ZXJsYXktY29sb3IiPzogc3RyaW5nOworICAgICAgICAgICAgImZvbnQtc2l6ZSI/IDpudW1iZXI7CisgICAgICAgICAgICAiZm9udC1mYW1pbHkiPyA6c3RyaW5nOworICAgICAgICAgICAgImJhY2tncm91bmQtcG9zaXRpb24teCI/IDpudW1iZXI7CisgICAgICAgICAgICAiYmFja2dyb3VuZC1wb3NpdGlvbi15Ij8gOm51bWJlcjsKKyAgICAgICAgICAgICdvdmVybGF5LW9wYWNpdHknPzogbnVtYmVyOworICAgICAgICAgICAgJ3RleHQtYm9yZGVyLXdpZHRoJz86IG51bWJlcjsKKyAgICAgICAgICAgICd0ZXh0LWJvcmRlci1jb2xvcic/OiBzdHJpbmc7CisgICAgICAgICAgICAndGV4dC1ib3JkZXItb3BhY2l0eSc/OiBudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgaW50ZXJmYWNlIFNlbGVjdGlvbkJveCB7CisgICAgICAgICAgICAic2VsZWN0aW9uLWJveC1jb2xvciI/OiBzdHJpbmcKKyAgICAgICAgICAgICJzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvciI/OiBzdHJpbmcKKyAgICAgICAgICAgICJzZWxlY3Rpb24tYm94LWJvcmRlci13aWR0aCI/OiBudW1iZXIKKyAgICAgICAgICAgICJzZWxlY3Rpb24tYm94LW9wYWNpdHkiPzogbnVtYmVyCisKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG91bmROb2RlQ3NzIGV4dGVuZHMgTm9kZUNzcyB7CisgICAgICAgICAgICAicGFkZGluZy1sZWZ0Ij86IG51bWJlcjsKKyAgICAgICAgICAgICJwYWRkaW5nLXJpZ2h0Ij86IG51bWJlcjsKKyAgICAgICAgICAgICJwYWRkaW5nLXRvcCI/OiBudW1iZXI7CisgICAgICAgICAgICAicGFkZGluZy1ib3R0b20iPzogbnVtYmVyOworICAgICAgICAgICAgImNvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzIj86IHN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRWRnZUNzcyB7CisKKyAgICAgICAgICAgICJsaW5lLWNvbG9yIj86IHN0cmluZzsKKyAgICAgICAgICAgICJ0YXJnZXQtYXJyb3ctY29sb3IiPzogc3RyaW5nOworICAgICAgICAgICAgInRhcmdldC1hcnJvdy1zaGFwZSI/OiBzdHJpbmc7CisgICAgICAgICAgICAiY3VydmUtc3R5bGUiPzogc3RyaW5nOworICAgICAgICAgICAgImNvbnRyb2wtcG9pbnQtc3RlcC1zaXplIj86IG51bWJlcjsKKyAgICAgICAgICAgICJjb250cm9sLXBvaW50LWRpc3RhbmNlcyI/OiBzdHJpbmcsCisgICAgICAgICAgICAiY29udHJvbC1wb2ludC13ZWlnaHRzIj86IHN0cmluZywKKyAgICAgICAgICAgICJzZWdtZW50LWRpc3RhbmNlcyI/OiBzdHJpbmcsCisgICAgICAgICAgICAic2VnbWVudC13ZWlnaHRzIj86IHN0cmluZworICAgICAgICAgICAgImxpbmUtc3R5bGUiPyA6IHN0cmluZworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGludGVyZmFjZSBFbGVtZW50Q3NzIGV4dGVuZHMgTm9kZUNzcywgQ29tcG91bmROb2RlQ3NzLCBFZGdlQ3NzLCBTZWxlY3Rpb25Cb3ggeworICAgICAgICB9CisgICAgICAgIC8vZXhwb3J0IGludGVyZmFjZSBFbGVtZW50Q3NzIGV4dGVuZHMgQ1NTU3R5bGVEZWNsYXJhdGlvbiB7IH0KKyAgICB9CisKKyAgICBpbnRlcmZhY2UgUmVuZGVyZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHJlbmRlcmVyIHRvIHVzZS4gQnkgZGVmYXVsdCwgdGhlICdjYW52YXMnIHJlbmRlcmVyIGlzIHVzZWQuIElmIHlvdSBidWlsZCBhbmQgcmVnaXN0ZXIgeW91ciBvd24gcmVuZGVyZXIsIHRoZW4geW91IGNhbiBzcGVjaWZ5IGl0cyBuYW1lIGhlcmUuCisgICAgICAgICAqLworICAgICAgICBuYW1lOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEluc3RhbmNlIGV4dGVuZHMgSW5zdGFuY2VFdmVudCwgSW5zdGFuY2VWaWV3UG9ydCwgSW5zdGFuY2VBbmltYXRpb24sIEluc3RhbmNlTGF5b3V0LCBJbnN0YW5jZVN0eWxlLCBJbnN0YW5jZUV4cG9ydCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgZWxlbWVudHMgdG8gdGhlIGdyYXBoIGFuZCByZXR1cm4gdGhlbS4KKyAgICAgICAgICovCisgICAgICAgIGFkZChlbGVPYmo6IEVsZW1lbnREZWZpbml0aW9uKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGVsZW1lbnRzIHRvIHRoZSBncmFwaCBhbmQgcmV0dXJuIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBhZGQoZWxlT2JqczogRWxlbWVudERlZmluaXRpb25bXSk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBlbGVtZW50cyB0byB0aGUgZ3JhcGggYW5kIHJldHVybiB0aGVtLgorICAgICAgICAgKi8KKyAgICAgICAgYWRkKGVsZXM6IENvbGxlY3Rpb24pOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBncmFwaCBhbmQgcmV0dXJuIHRoZW0uCisgICAgICAgICAqLworICAgICAgICByZW1vdmUoZWxlczogQ29sbGVjdGlvbik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBlbGVtZW50cyBpbiB0aGUgZ3JhcGggbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZShzZWxlY3RvcjogU2VsZWN0b3IpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbiBlbXB0eSBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY29sbGVjdGlvbigpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBjb2xsZWN0aW9uIGZyb20gZWxlbWVudHMgaW4gdGhlIGdyYXBoIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCisgICAgICAgICAqLworICAgICAgICBjb2xsZWN0aW9uKHNlbGVjdG9yOiBTZWxlY3Rvcik6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIGNvbGxlY3Rpb24gZnJvbSBhbiBhcnJheSBvZiBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIGNvbGxlY3Rpb24oZWxlc0FycmF5OiBDb2xsZWN0aW9uRWxlbWVudHNbXSk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGFuIGVsZW1lbnQgZnJvbSBpdHMgSUQgaW4gYSB2ZXJ5IHBlcmZvcm1hbnQgd2F5LgorICAgICAgICAgKi8KKyAgICAgICAgZ2V0RWxlbWVudEJ5SWQoaWQ6IHN0cmluZyk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGVsZW1lbnRzIGluIHRoZSBncmFwaCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgJChzZWxlY3RvcjogU2VsZWN0b3IpOiBDb2xsZWN0aW9uRWxlbWVudHM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZWxlbWVudHMgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKi8KKyAgICAgICAgZWxlbWVudHMoKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGVsZW1lbnRzIGluIHRoZSBncmFwaCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgZWxlbWVudHMoc2VsZWN0b3I6IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IG5vZGVzIGluIHRoZSBncmFwaC4KKyAgICAgICAgICovCisgICAgICAgIG5vZGVzKCk6IENvbGxlY3Rpb25Ob2RlczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBub2RlcyBpbiB0aGUgZ3JhcGggbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KKyAgICAgICAgICovCisgICAgICAgIG5vZGVzKHNlbGVjdG9yOiBTZWxlY3Rvcik6IENvbGxlY3Rpb25Ob2RlczsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBlZGdlcyBpbiB0aGUgZ3JhcGguCisgICAgICAgICAqLworICAgICAgICBlZGdlcygpOiBDb2xsZWN0aW9uRWRnZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZWRnZXMgaW4gdGhlIGdyYXBoIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCisgICAgICAgICAqLworICAgICAgICBlZGdlcyhzZWxlY3RvcjogU2VsZWN0b3IpOiBDb2xsZWN0aW9uRWRnZXM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZWxlbWVudHMgaW4gdGhlIGdyYXBoIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXIoc2VsZWN0b3I6IFNlbGVjdG9yKTogQ29sbGVjdGlvbkVsZW1lbnRzOworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGVsZW1lbnRzIGluIHRoZSBncmFwaCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGZpbHRlciBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGZpbHRlcihmaWx0ZXI6IChpOiBudW1iZXIsIGVsZTogQ29sbGVjdGlvbkZpcnN0KSA9PiBib29sZWFuKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbGxvdyBmb3IgbWFuaXB1bGF0aW9uIG9mIGVsZW1lbnRzIHdpdGhvdXQgdHJpZ2dlcmluZyBtdWx0aXBsZSBzdHlsZSBjYWxjdWxhdGlvbnMgb3IgbXVsdGlwbGUgcmVkcmF3cy4KKyAgICAgICAgICoKKyAgICAgICAgICogIEEgY2FsbGJhY2sgd2l0aGluIHdoaWNoIHlvdSBjYW4gbWFrZSBiYXRjaCB1cGRhdGVzIHRvIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgYmF0Y2goY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkOworICAgICAgICAvKioKKyAgICAgICAgICogQWxsb3cgZm9yIG1hbmlwdWxhdGlvbiBvZiBlbGVtZW50cyB3aXRob3V0IHRyaWdnZXJpbmcgbXVsdGlwbGUgc3R5bGUgY2FsY3VsYXRpb25zIG9yIG11bHRpcGxlIHJlZHJhd3MuCisgICAgICAgICAqIFN0YXJ0cyBiYXRjaGluZyBtYW51YWxseSAodXNlZnVsIGZvciBhc3luY2hyb25vdXMgY2FzZXMpLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhcnRCYXRjaCgpOiB2b2lkOworICAgICAgICAvKioKKyAgICAgICAgICogQWxsb3cgZm9yIG1hbmlwdWxhdGlvbiBvZiBlbGVtZW50cyB3aXRob3V0IHRyaWdnZXJpbmcgbXVsdGlwbGUgc3R5bGUgY2FsY3VsYXRpb25zIG9yIG11bHRpcGxlIHJlZHJhd3MuCisgICAgICAgICAqIEVuZHMgYmF0Y2hpbmcgbWFudWFsbHkgKHVzZWZ1bCBmb3IgYXN5bmNocm9ub3VzIGNhc2VzKS4KKyAgICAgICAgICovCisgICAgICAgIGVuZEJhdGNoKCk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZXhwbGljaXRseSBkZXN0cm95IHRoZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIGRlc3Ryb3koKTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgRXZlbnRPYmplY3QgeworICAgICAgICAvKioKKyAgICAgICAgICogSG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmF0b3Igb2YgdGhlIGV2ZW50IChjb3JlIG9yIGVsZW1lbnQpCisgICAgICAgICAqLworICAgICAgICBjeVRhcmdldDogYW55OyAvL0NvbGxlY3Rpb25FbGVtZW50cyBvciBDeS5JbnN0YW5jZTsKKyAgICAgICAgZGF0YTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBJbnN0YW5jZUV2ZW50IHsKKyAgICAgICAgLy8gaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvcmUvZXZlbnRzCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3Vycy4KKyAgICAgICAgICovCisgICAgICAgIG9uKGV2ZW50czogc3RyaW5nLCBoYW5kbGVyOiAoZXZ0OiBFdmVudE9iamVjdCwgZGF0YT86IGFueSkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kIHRvIGV2ZW50cyB0aGF0IG9jY3VyIGluIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IG5hbWVzLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50cyBvY2N1cnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICovCisgICAgICAgIG9uKGV2ZW50czogc3RyaW5nLCBzZWxlY3RvcjogU2VsZWN0b3IsIGhhbmRsZXI6IChldnQ6IEV2ZW50T2JqZWN0LCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3Vycy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgdG8gc3BlY2lmeSBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaXMgdHJpZ2dlcmVkLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBBIHBsYWluIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaW4gdGhlIGV2ZW50IG9iamVjdCBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIG9uKGV2ZW50czogc3RyaW5nLCBzZWxlY3RvcjogU2VsZWN0b3IsIGRhdGE6IGFueSwgaGFuZGxlcjogKGV2dDogRXZlbnRPYmplY3QsIGRhdGE/OiBhbnkpID0+IHZvaWQpOiB2b2lkOworICAgICAgICAvKioKKyAgICAgICAgICogQmluZCB0byBldmVudHMgdGhhdCBvY2N1ciBpbiB0aGUgZ3JhcGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBldmVudHNNYXAgQSBtYXAgb2YgZXZlbnQgbmFtZXMgdG8gaGFuZGxlciBmdW5jdGlvbnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgQSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIHRoZSBldmVudCBvYmplY3QgYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBvbihldmVudHNNYXA6IHsKKyAgICAgICAgICAgIFt2YWx1ZTogc3RyaW5nXTogKGV2dDogRXZlbnRPYmplY3QsIGRhdGE/OiBhbnkpID0+IHZvaWQKKyAgICAgICAgfSwgc2VsZWN0b3I/OiBTZWxlY3RvciwgZGF0YT86IGFueSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3Vycy4KKyAgICAgICAgICovCisgICAgICAgIGJpbmQoZXZlbnRzOiBzdHJpbmcsIGhhbmRsZXI6IChldnQ6IEV2ZW50T2JqZWN0LCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3Vycy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgdG8gc3BlY2lmeSBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaXMgdHJpZ2dlcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgYmluZChldmVudHM6IHN0cmluZywgc2VsZWN0b3I6IFNlbGVjdG9yLCBoYW5kbGVyOiAoZXZ0OiBFdmVudE9iamVjdCwgZGF0YT86IGFueSkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kIHRvIGV2ZW50cyB0aGF0IG9jY3VyIGluIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IG5hbWVzLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50cyBvY2N1cnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgQSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIHRoZSBldmVudCBvYmplY3QgYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBiaW5kKGV2ZW50czogc3RyaW5nLCBzZWxlY3RvcjogU2VsZWN0b3IsIGRhdGE6IGFueSwgaGFuZGxlcjogKGV2dDogRXZlbnRPYmplY3QsIGRhdGE/OiBhbnkpID0+IHZvaWQpOiB2b2lkOworICAgICAgICAvKioKKyAgICAgICAgICogQmluZCB0byBldmVudHMgdGhhdCBvY2N1ciBpbiB0aGUgZ3JhcGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBldmVudHNNYXAgQSBtYXAgb2YgZXZlbnQgbmFtZXMgdG8gaGFuZGxlciBmdW5jdGlvbnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgQSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIHRoZSBldmVudCBvYmplY3QgYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBiaW5kKGV2ZW50c01hcDogeworICAgICAgICAgICAgW3ZhbHVlOiBzdHJpbmddOiAoZXZ0OiBFdmVudE9iamVjdCwgZGF0YT86IGFueSkgPT4gdm9pZAorICAgICAgICB9LCBzZWxlY3Rvcj86IFNlbGVjdG9yLCBkYXRhPzogYW55KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQmluZCB0byBldmVudHMgdGhhdCBvY2N1ciBpbiB0aGUgZ3JhcGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBldmVudHMgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBldmVudCBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBldmVudHMgb2NjdXJzLgorICAgICAgICAgKi8KKyAgICAgICAgbGlzdGVuKGV2ZW50czogc3RyaW5nLCBoYW5kbGVyOiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kIHRvIGV2ZW50cyB0aGF0IG9jY3VyIGluIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IG5hbWVzLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50cyBvY2N1cnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICovCisgICAgICAgIGxpc3RlbihldmVudHM6IHN0cmluZywgc2VsZWN0b3I6IFNlbGVjdG9yLCBoYW5kbGVyOiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kIHRvIGV2ZW50cyB0aGF0IG9jY3VyIGluIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IG5hbWVzLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50cyBvY2N1cnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgQSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIHRoZSBldmVudCBvYmplY3QgYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBsaXN0ZW4oZXZlbnRzOiBzdHJpbmcsIHNlbGVjdG9yOiBTZWxlY3RvciwgZGF0YTogYW55LCBoYW5kbGVyOiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kIHRvIGV2ZW50cyB0aGF0IG9jY3VyIGluIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50c01hcCBBIG1hcCBvZiBldmVudCBuYW1lcyB0byBoYW5kbGVyIGZ1bmN0aW9ucy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgdG8gc3BlY2lmeSBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaXMgdHJpZ2dlcmVkLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBBIHBsYWluIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaW4gdGhlIGV2ZW50IG9iamVjdCBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIGxpc3RlbihldmVudHNNYXA6IHsKKyAgICAgICAgICAgIFt2YWx1ZTogc3RyaW5nXTogKGV2dDogRXZlbnRPYmplY3QpID0+IHZvaWQKKyAgICAgICAgfSwgc2VsZWN0b3I/OiBTZWxlY3RvciwgZGF0YT86IGFueSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3Vycy4KKyAgICAgICAgICovCisgICAgICAgIGFkZExpc3RlbmVyKGV2ZW50czogc3RyaW5nLCBoYW5kbGVyOiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kIHRvIGV2ZW50cyB0aGF0IG9jY3VyIGluIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IG5hbWVzLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50cyBvY2N1cnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICovCisgICAgICAgIGFkZExpc3RlbmVyKGV2ZW50czogc3RyaW5nLCBzZWxlY3RvcjogU2VsZWN0b3IsIGhhbmRsZXI6IChldnQ6IEV2ZW50T2JqZWN0KSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3Vycy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgdG8gc3BlY2lmeSBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaXMgdHJpZ2dlcmVkLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBBIHBsYWluIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaW4gdGhlIGV2ZW50IG9iamVjdCBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIGFkZExpc3RlbmVyKGV2ZW50czogc3RyaW5nLCBzZWxlY3RvcjogU2VsZWN0b3IsIGRhdGE6IGFueSwgaGFuZGxlcjogKGV2dDogRXZlbnRPYmplY3QpID0+IHZvaWQpOiB2b2lkOworICAgICAgICAvKioKKyAgICAgICAgICogQmluZCB0byBldmVudHMgdGhhdCBvY2N1ciBpbiB0aGUgZ3JhcGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBldmVudHNNYXAgQSBtYXAgb2YgZXZlbnQgbmFtZXMgdG8gaGFuZGxlciBmdW5jdGlvbnMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHRvIHNwZWNpZnkgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgQSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIHRoZSBldmVudCBvYmplY3QgYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBhZGRMaXN0ZW5lcihldmVudHNNYXA6IHsKKyAgICAgICAgICAgIFt2YWx1ZTogc3RyaW5nXTogKGV2dDogRXZlbnRPYmplY3QpID0+IHZvaWQKKyAgICAgICAgfSwgc2VsZWN0b3I/OiBTZWxlY3RvciwgZGF0YT86IGFueSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLCBhbmQgdHJpZ2dlciB0aGUgaGFuZGxlciBvbmx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBldmVudHMgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBldmVudCBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBldmVudHMgb2NjdXJzLgorICAgICAgICAgKi8KKyAgICAgICAgb25lKGV2ZW50czogc3RyaW5nLCBoYW5kbGVyOiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kIHRvIGV2ZW50cyB0aGF0IG9jY3VyIGluIHRoZSBncmFwaCwgYW5kIHRyaWdnZXIgdGhlIGhhbmRsZXIgb25seSBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnRzIG9jY3Vycy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgdG8gc3BlY2lmeSBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaXMgdHJpZ2dlcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgb25lKGV2ZW50czogc3RyaW5nLCBzZWxlY3RvcjogU2VsZWN0b3IsIGhhbmRsZXI6IChldnQ6IEV2ZW50T2JqZWN0KSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmQgdG8gZXZlbnRzIHRoYXQgb2NjdXIgaW4gdGhlIGdyYXBoLCBhbmQgdHJpZ2dlciB0aGUgaGFuZGxlciBvbmx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBldmVudHMgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBldmVudCBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBldmVudHMgb2NjdXJzLgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzZWxlY3RvciB0byBzcGVjaWZ5IGVsZW1lbnRzIGZvciB3aGljaCB0aGUgaGFuZGxlciBpcyB0cmlnZ2VyZWQuCisgICAgICAgICAqIEBwYXJhbSBkYXRhIEEgcGxhaW4gb2JqZWN0IHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlciBpbiB0aGUgZXZlbnQgb2JqZWN0IGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgb25lKGV2ZW50czogc3RyaW5nLCBzZWxlY3RvcjogU2VsZWN0b3IsIGRhdGE6IGFueSwgaGFuZGxlcjogKGV2dDogRXZlbnRPYmplY3QpID0+IHZvaWQpOiB2b2lkOworICAgICAgICAvKioKKyAgICAgICAgICogQmluZCB0byBldmVudHMgdGhhdCBvY2N1ciBpbiB0aGUgZ3JhcGgsIGFuZCB0cmlnZ2VyIHRoZSBoYW5kbGVyIG9ubHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50c01hcCBBIG1hcCBvZiBldmVudCBuYW1lcyB0byBoYW5kbGVyIGZ1bmN0aW9ucy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgdG8gc3BlY2lmeSBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaXMgdHJpZ2dlcmVkLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBBIHBsYWluIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaW4gdGhlIGV2ZW50IG9iamVjdCBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIG9uZShldmVudHNNYXA6IHsKKyAgICAgICAgICAgIFt2YWx1ZTogc3RyaW5nXTogKGV2dDogRXZlbnRPYmplY3QpID0+IHZvaWQKKyAgICAgICAgfSwgc2VsZWN0b3I/OiBTZWxlY3RvciwgZGF0YT86IGFueSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBldmVudCBoYW5kbGVycy4KKyAgICAgICAgICogQHBhcmFtIGV2ZW50cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IG5hbWVzLgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgW29wdGlvbmFsXSBUaGUgc2FtZSBzZWxlY3RvciB1c2VkIHRvIGJpbmQgdG8gdGhlIGV2ZW50cy4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZXIgW29wdGlvbmFsXSBBIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiB0byByZW1vdmUuCisgICAgICAgICAqLworICAgICAgICBvZmYoZXZlbnRzOiBzdHJpbmcsIHNlbGVjdG9yPzogU2VsZWN0b3IsIGhhbmRsZXI/OiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBldmVudCBoYW5kbGVycy4KKyAgICAgICAgICogQHBhcmFtIGV2ZW50c01hcCBBIG1hcCBvZiBldmVudCBuYW1lcyB0byBoYW5kbGVyIGZ1bmN0aW9ucyB0byByZW1vdmUuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIFRoZSBzYW1lIHNlbGVjdG9yIHVzZWQgdG8gYmluZCB0byB0aGUgZXZlbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgb2ZmKGV2ZW50c01hcDogeworICAgICAgICAgICAgW3ZhbHVlOiBzdHJpbmddOiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZAorICAgICAgICB9LCBzZWxlY3Rvcj86IFNlbGVjdG9yKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGV2ZW50IGhhbmRsZXJzLgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIFRoZSBzYW1lIHNlbGVjdG9yIHVzZWQgdG8gYmluZCB0byB0aGUgZXZlbnRzLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBbb3B0aW9uYWxdIEEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZS4KKyAgICAgICAgICovCisgICAgICAgIHVuYmluZChldmVudHM6IHN0cmluZywgc2VsZWN0b3I/OiBTZWxlY3RvciwgaGFuZGxlcj86IChldnQ6IEV2ZW50T2JqZWN0KSA9PiB2b2lkKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGV2ZW50IGhhbmRsZXJzLgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzTWFwIEEgbWFwIG9mIGV2ZW50IG5hbWVzIHRvIGhhbmRsZXIgZnVuY3Rpb25zIHRvIHJlbW92ZS4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gVGhlIHNhbWUgc2VsZWN0b3IgdXNlZCB0byBiaW5kIHRvIHRoZSBldmVudHMuCisgICAgICAgICAqLworICAgICAgICB1bmJpbmQoZXZlbnRzTWFwOiB7CisgICAgICAgICAgICBbdmFsdWU6IHN0cmluZ106IChldnQ6IEV2ZW50T2JqZWN0KSA9PiB2b2lkCisgICAgICAgIH0sIHNlbGVjdG9yPzogU2VsZWN0b3IpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgZXZlbnQgaGFuZGxlcnMuCisgICAgICAgICAqIEBwYXJhbSBldmVudHMgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBldmVudCBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gVGhlIHNhbWUgc2VsZWN0b3IgdXNlZCB0byBiaW5kIHRvIHRoZSBldmVudHMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFtvcHRpb25hbF0gQSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcmVtb3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdW5saXN0ZW4oZXZlbnRzOiBzdHJpbmcsIHNlbGVjdG9yPzogU2VsZWN0b3IsIGhhbmRsZXI/OiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBldmVudCBoYW5kbGVycy4KKyAgICAgICAgICogQHBhcmFtIGV2ZW50c01hcCBBIG1hcCBvZiBldmVudCBuYW1lcyB0byBoYW5kbGVyIGZ1bmN0aW9ucyB0byByZW1vdmUuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIFRoZSBzYW1lIHNlbGVjdG9yIHVzZWQgdG8gYmluZCB0byB0aGUgZXZlbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgdW5saXN0ZW4oZXZlbnRzTWFwOiB7CisgICAgICAgICAgICBbdmFsdWU6IHN0cmluZ106IChldnQ6IEV2ZW50T2JqZWN0KSA9PiB2b2lkCisgICAgICAgIH0sIHNlbGVjdG9yPzogU2VsZWN0b3IpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgZXZlbnQgaGFuZGxlcnMuCisgICAgICAgICAqIEBwYXJhbSBldmVudHMgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBldmVudCBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFtvcHRpb25hbF0gVGhlIHNhbWUgc2VsZWN0b3IgdXNlZCB0byBiaW5kIHRvIHRoZSBldmVudHMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIFtvcHRpb25hbF0gQSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcmVtb3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnRzOiBzdHJpbmcsIHNlbGVjdG9yPzogU2VsZWN0b3IsIGhhbmRsZXI/OiAoZXZ0OiBFdmVudE9iamVjdCkgPT4gdm9pZCk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBldmVudCBoYW5kbGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50c01hcCBBIG1hcCBvZiBldmVudCBuYW1lcyB0byBoYW5kbGVyIGZ1bmN0aW9ucyB0byByZW1vdmUuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBbb3B0aW9uYWxdIFRoZSBzYW1lIHNlbGVjdG9yIHVzZWQgdG8gYmluZCB0byB0aGUgZXZlbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnRzTWFwOiB7CisgICAgICAgICAgICBbdmFsdWU6IHN0cmluZ106IChldnQ6IEV2ZW50T2JqZWN0KSA9PiB2b2lkCisgICAgICAgIH0sIHNlbGVjdG9yPzogU2VsZWN0b3IpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmlnZ2VyIG9uZSBvciBtb3JlIGV2ZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50cyBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IG5hbWVzIHRvIHRyaWdnZXIuCisgICAgICAgICAqIEBwYXJhbSBleHRyYVBhcmFtcyBbb3B0aW9uYWxdIEFuIGFycmF5IG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBoYW5kbGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdHJpZ2dlcihldmVudHM6IHN0cmluZywgZXh0cmFQYXJhbXM/OiBhbnlbXSk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyaWdnZXIgb25lIG9yIG1vcmUgZXZlbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRzIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gdHJpZ2dlci4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhUGFyYW1zIFtvcHRpb25hbF0gQW4gYXJyYXkgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXIuCisgICAgICAgICAqLworICAgICAgICBlbWl0KGV2ZW50czogc3RyaW5nLCBleHRyYVBhcmFtcz86IGFueVtdKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgdGhlIGluaXRpYWwgcmVuZGVyIGV2ZW50IGhhcyBvY2N1cnJlZCAodXNlZnVsIGZvciBwbHVnaW5zIGV0YykuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aGV0aGVyIHRoZSBpbml0cmVuZGVyIGV2ZW50IGhhcyBvY2N1cnJlZCBvbiB0aGUgZ3JhcGgsIG1lYW5pbmcgdGhhdCB0aGUgcmVuZGVyZXIgaGFzIGRyYXduIHRoZSBncmFwaCBhdCBsZWFzdCBvbmNlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGdyYWIgaW1hZ2UgZGF0YSBmcm9tIHRoZSBjb3JlLCBhcyB0aGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBrbm93IHdoZXRoZXIgdGhhdCBkYXRhIGlzIGF2YWlsYWJsZSB5ZXQ6IFlvdSBjYW4gbm90IGdyYWIgdGhlIGdyYXBoIHNjZW5lIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gcmVuZGVyZWQuCisgICAgICAgICAqLworICAgICAgICBpbml0cmVuZGVyKCk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJ1biBhIGhhbmRsZXIgZnVuY3Rpb24gZXZlcnkgdGltZSBhIGZyYW1lIGlzIHJlbmRlcmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byBjYWxsIG9uIGVhY2ggZnJhbWUuCisgICAgICAgICAqLworICAgICAgICBvblJlbmRlcihoYW5kbGVyOiAoKSA9PiB2b2lkKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGhhbmRsZXJzIGZ1bmN0aW9uIGJvdW5kIHZpYSBjeS5vblJlbmRlcigpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBbb3B0aW9uYWxdIEEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZS4gQWxsIGhhbmRsZXJzIGFyZSByZW1vdmVkIGlmIHRoaXMgaXMgdW5zcGVjaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBvZmZSZW5kZXIoaGFuZGxlcj86ICgpID0+IHZvaWQpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSdW4gYSBjYWxsYmFjayBhcyBzb29uIGFzIHRoZSBncmFwaCBiZWNvbWVzIHJlYWR5LiBJZiB0aGUgZ3JhcGggaXMgYWxyZWFkeSByZWFkeSwgdGhlbiB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LgorICAgICAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIHJ1biBhcyBzb29uIGFzIHRoZSBncmFwaCBpcyByZWFkeSwgaW5zaWRlIHdoaWNoIHRoaXMgcmVmZXJzIHRvIHRoZSBjb3JlIChjeSkuCisgICAgICAgICAqLworICAgICAgICByZWFkeShmbjogKCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEluc3RhbmNlVmlld1BvcnQgeworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29yZS92aWV3cG9ydC1tYW5pcHVsYXRpb24KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFuIHRoZSBncmFwaCB0byB0aGUgY2VudHJlIG9mIGEgY29sbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVsZXMgVGhlIGNvbGxlY3Rpb24gdG8gY2VudHJlIHVwb24uCisgICAgICAgICAqLworICAgICAgICBjZW50ZXIoZWxlcz86IENvbGxlY3Rpb24pOiBDb2xsZWN0aW9uRWxlbWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhbiBhbmQgem9vbXMgdGhlIGdyYXBoIHRvIGZpdCB0byBhIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVzIFtvcHRpb25hbF0gVGhlIGNvbGxlY3Rpb24gdG8gZml0IHRvLgorICAgICAgICAgKiBAcGFyYW0gcGFkZGluZyBbb3B0aW9uYWxdIEFuIGFtb3VudCBvZiBwYWRkaW5nIChpbiBwaXhlbHMpIHRvIGhhdmUgYXJvdW5kIHRoZSBncmFwaAorICAgICAgICAgKi8KKyAgICAgICAgZml0KGVsZXM/OiBDb2xsZWN0aW9uLCBwYWRkaW5nPzogbnVtYmVyKTogQ29sbGVjdGlvbkVsZW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNldCB0aGUgZ3JhcGggdG8gdGhlIGRlZmF1bHQgem9vbSBsZXZlbCBhbmQgcGFubmluZyBwb3NpdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJlc2V0KCk6IENvbGxlY3Rpb25FbGVtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC4KKyAgICAgICAgICovCisgICAgICAgIHBhbigpOiBQb3NpdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlbmRlcmVkUG9zaXRpb24gVGhlIHJlbmRlcmVkIHBvc2l0aW9uIHRvIHBhbiB0aGUgZ3JhcGggdG8uCisgICAgICAgICAqLworICAgICAgICBwYW4ocmVuZGVyZWRQb3NpdGlvbj86IFBvc2l0aW9uKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVsYXRpdmVseSBwYW4gdGhlIGdyYXBoIGJ5IGEgc3BlY2lmaWVkIHJlbmRlcmVkIHBvc2l0aW9uIHZlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlbmRlcmVkUG9zaXRpb24gVGhlIHJlbmRlcmVkIHBvc2l0aW9uIHZlY3RvciB0byBwYW4gdGhlIGdyYXBoIGJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcGFuQnkocmVuZGVyZWRQb3NpdGlvbjogUG9zaXRpb24pOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciBwYW5uaW5nIGlzIGVuYWJsZWQuIElmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSA9PT0gdHJ1ZSwgdGhlbiB0aGUgdXNlciBtdXN0IHRhcGhvbGQgdG8gaW5pdGlhdGUgcGFubmluZy4KKyAgICAgICAgICovCisgICAgICAgIHBhbm5pbmdFbmFibGVkKCk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB3aGV0aGVyIHBhbm5pbmcgaXMgZW5hYmxlZC4gSWYgY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpID09PSB0cnVlLCB0aGVuIHRoZSB1c2VyIG11c3QgdGFwaG9sZCB0byBpbml0aWF0ZSBwYW5uaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYm9vbCBBIHRydXRoeSB2YWx1ZSBlbmFibGVzIHBhbm5pbmc7IGEgZmFsc2V5IHZhbHVlIGRpc2FibGVzIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgcGFubmluZ0VuYWJsZWQoYm9vbDogYm9vbGVhbik6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIHBhbm5pbmcgYnkgdXNlciBldmVudHMgKGUuZy4gZHJhZ2dpbmcgdGhlIGdyYXBoIGJhY2tncm91bmQpIGlzIGVuYWJsZWQuIElmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSA9PT0gdHJ1ZSwgdGhlbiB0aGUgdXNlciBtdXN0IHRhcGhvbGQgdG8gaW5pdGlhdGUgcGFubmluZy4KKyAgICAgICAgICovCisgICAgICAgIHVzZXJQYW5uaW5nRW5hYmxlZCgpOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgd2hldGhlciBwYW5uaW5nIGJ5IHVzZXIgZXZlbnRzIChlLmcuIGRyYWdnaW5nIHRoZSBncmFwaCBiYWNrZ3JvdW5kKSBpcyBlbmFibGVkLiBJZiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgPT09IHRydWUsIHRoZW4gdGhlIHVzZXIgbXVzdCB0YXBob2xkIHRvIGluaXRpYXRlIHBhbm5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBib29sIEEgdHJ1dGh5IHZhbHVlIGVuYWJsZXMgdXNlciBwYW5uaW5nOyBhIGZhbHNleSB2YWx1ZSBkaXNhYmxlcyBpdC4KKyAgICAgICAgICovCisgICAgICAgIHVzZXJQYW5uaW5nRW5hYmxlZChib29sOiBib29sZWFuKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB6b29tIGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgem9vbSgpOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHpvb20gbGV2ZWwuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgem9vbSBsZXZlbCB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICB6b29tKGxldmVsOiBudW1iZXIpOiB2b2lkOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB6b29tIGxldmVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3Igem9vbWluZy4KKyAgICAgICAgICovCisgICAgICAgIHpvb20ob3B0aW9uczogWm9vbU9wdGlvbnMpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciB6b29taW5nIGlzIGVuYWJsZWQuCisgICAgICAgICAqLworICAgICAgICB6b29taW5nRW5hYmxlZCgpOiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYm9vbCBBIHRydXRoeSB2YWx1ZSBlbmFibGVzIHpvb21pbmc7IGEgZmFsc2V5IHZhbHVlIGRpc2FibGVzIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgem9vbWluZ0VuYWJsZWQoYm9vbDogYm9vbGVhbik6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIHpvb21pbmcgYnkgdXNlciBldmVudHMgKGUuZy4gbW91c2Ugd2hlZWwsIHBpbmNoLXRvLXpvb20pIGlzIGVuYWJsZWQuCisgICAgICAgICAqLworICAgICAgICB1c2VyWm9vbWluZ0VuYWJsZWQoKTogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB3aGV0aGVyIHpvb21pbmcgYnkgdXNlciBldmVudHMgKGUuZy4gbW91c2Ugd2hlZWwsIHBpbmNoLXRvLXpvb20pIGlzIGVuYWJsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBib29sIEEgdHJ1dGh5IHZhbHVlIGVuYWJsZXMgdXNlciB6b29taW5nOyBhIGZhbHNleSB2YWx1ZSBkaXNhYmxlcyBpdC4KKyAgICAgICAgICovCisgICAgICAgIHVzZXJab29taW5nRW5hYmxlZChib29sOiBib29sZWFuKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBtaW5pbXVtIHpvb20gbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBtaW5ab29tKCk6IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgbWluaW11bSB6b29tIGxldmVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gem9vbSBUaGUgbmV3IG1pbmltdW0gem9vbSBsZXZlbCB0byB1c2UuCisgICAgICAgICAqLworICAgICAgICBtaW5ab29tKHpvb206IG51bWJlcik6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbWF4aW11bSB6b29tIGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgbWF4Wm9vbSgpOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gem9vbSBsZXZlbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHpvb20gVGhlIG5ldyBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgbWF4Wm9vbSh6b29tOiBudW1iZXIpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHZpZXdwb3J0IHN0YXRlIChwYW4gJiB6b29tKSBpbiBvbmUgY2FsbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gc2V0LgorICAgICAgICAgKiBAcGFyYW0gcGFuIFRoZSBwYW4gdG8gc2V0IChhIHJlbmRlcmVkIHBvc2l0aW9uKS4KKyAgICAgICAgICovCisgICAgICAgIHZpZXdwb3J0KHpvb206IG51bWJlciwgcGFuOiBQb3NpdGlvbik6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGV0aGVyIGJveCBzZWxlY3Rpb24gaXMgZW5hYmxlZC4gSWYgZW5hYmxlZCwgdGhlIHVzZXIgbXVzdCBob2xkIGxlZnQtY2xpY2sgdG8gaW5pdGlhdGUgcGFubmluZy4KKyAgICAgICAgICovCisgICAgICAgIGJveFNlbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB3aGV0aGVyIGJveCBzZWxlY3Rpb24gaXMgZW5hYmxlZC4gSWYgZW5hYmxlZCwgdGhlIHVzZXIgbXVzdCBob2xkIGxlZnQtY2xpY2sgdG8gaW5pdGlhdGUgcGFubmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJvb2wgQSB0cnV0aHkgdmFsdWUgZW5hYmxlcyBib3ggc2VsZWN0aW9uOyBhIGZhbHNleSB2YWx1ZSBkaXNhYmxlcyBpdC4KKyAgICAgICAgICovCisgICAgICAgIGJveFNlbGVjdGlvbkVuYWJsZWQoYm9vbDogYm9vbGVhbik6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgb24tc2NyZWVuIHdpZHRoIG9mIHRoZSB2aWV3cG9ydCBpbiBwaXhlbHMuCisgICAgICAgICAqLworICAgICAgICB3aWR0aCgpOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgb24tc2NyZWVuIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgaW4gcGl4ZWxzLgorICAgICAgICAgKi8KKyAgICAgICAgaGVpZ2h0KCk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBleHRlbnQgb2YgdGhlIHZpZXdwb3J0LCBhIGJvdW5kaW5nIGJveCBpbiBtb2RlbCBjb29yZGluYXRlcyB0aGF0IGxldHMgeW91IGtub3cgd2hhdCBtb2RlbCBwb3NpdGlvbnMgYXJlIHZpc2libGUgaW4gdGhlIHZpZXdwb3J0LgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW50KCk6IEV4dGVudDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgbm9kZXMgYXJlIGF1dG9tYXRpY2FsbHkgbG9ja2VkIChpLmUuIGlmIHRydWUsIG5vZGVzIGFyZSBsb2NrZWQgZGVzcGl0ZSB0aGVpciBpbmRpdmlkdWFsIHN0YXRlKS4KKyAgICAgICAgICovCisgICAgICAgIGF1dG9sb2NrKCk6IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgd2hldGhlciBub2RlcyBhcmUgYXV0b21hdGljYWxseSBsb2NrZWQgKGkuZS4gaWYgdHJ1ZSwgbm9kZXMgYXJlIGxvY2tlZCBkZXNwaXRlIHRoZWlyIGluZGl2aWR1YWwgc3RhdGUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYm9vbCBBIHRydXRoeSB2YWx1ZSBlbmFibGVzIGF1dG9sb2NraW5nOyBhIGZhbHNleSB2YWx1ZSBkaXNhYmxlcyBpdC4KKyAgICAgICAgICovCisgICAgICAgIGF1dG9sb2NrKGJvb2w6IGJvb2xlYW4pOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciBub2RlcyBhcmUgYXV0b21hdGljYWxseSB1bmdyYWJpZmllZCAoaS5lLiBpZiB0cnVlLCBub2RlcyBhcmUgdW5ncmFiYmFsZSBkZXNwaXRlIHRoZWlyIGluZGl2aWR1YWwgc3RhdGUpLgorICAgICAgICAgKi8KKyAgICAgICAgYXV0b3VuZ3JhYmlmeSgpOiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHdoZXRoZXIgbm9kZXMgYXJlIGF1dG9tYXRpY2FsbHkgdW5ncmFiaWZpZWQgKGkuZS4gaWYgdHJ1ZSwgbm9kZXMgYXJlIHVuZ3JhYmJhbGUgZGVzcGl0ZSB0aGVpciBpbmRpdmlkdWFsIHN0YXRlKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJvb2wgQSB0cnV0aHkgdmFsdWUgZW5hYmxlcyBhdXRvbG9ja2luZzsgYSBmYWxzZXkgdmFsdWUgZGlzYWJsZXMgaXQuCisgICAgICAgICAqLworICAgICAgICBhdXRvdW5ncmFiaWZ5KGJvb2w6IGJvb2xlYW4pOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgd2hldGhlciBub2RlcyBhcmUgYXV0b21hdGljYWxseSB1bnNlbGVjdGlmaWVkIChpLmUuIGlmIHRydWUsIG5vZGVzIGFyZSB1bnNlbGVjdGFibGUgZGVzcGl0ZSB0aGVpciBpbmRpdmlkdWFsIHN0YXRlKS4KKyAgICAgICAgICovCisgICAgICAgIGF1dG91bnNlbGVjdGlmeSgpOiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHdoZXRoZXIgbm9kZXMgYXJlIGF1dG9tYXRpY2FsbHkgdW5zZWxlY3RpZmllZCAoaS5lLiBpZiB0cnVlLCBub2RlcyBhcmUgdW5zZWxlY3RhYmxlIGRlc3BpdGUgdGhlaXIgaW5kaXZpZHVhbCBzdGF0ZSkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBib29sIEEgdHJ1dGh5IHZhbHVlIGVuYWJsZXMgYXV0b2xvY2tpbmc7IGEgZmFsc2V5IHZhbHVlIGRpc2FibGVzIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgYXV0b3Vuc2VsZWN0aWZ5KGJvb2w6IGJvb2xlYW4pOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3JjZSB0aGUgcmVuZGVyZXIgdG8gcmVkcmF3IChpLmUuIGRyYXcgYSBuZXcgZnJhbWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyB0aGUgcmVuZGVyZXIgdG8gZHJhdyBhIG5ldyBmcmFtZS4gSXQgaXMgdXNlZnVsIGZvciB2ZXJ5IHNwZWNpZmljIGVkZ2VjYXNlcywgc3VjaCBhcyBpbiBjZXJ0YWluIFVJIHBsdWdpbnMsIGJ1dCBpdCBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW9zdCBkZXZlbG9wZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yY2VSZW5kZXIoKTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yY2UgdGhlIHJlbmRlcmVyIHRvIHJlY2FsY3VsYXRlIHRoZSB2aWV3cG9ydCBib3VuZHMuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHlvdXIgY29kZSByZXNpemVzIHRoZSBncmFwaCdzIGRpbWVuc2lvbnMgb3IgcG9zaXRpb24gKGkuZS4gYnkgY2hhbmdpbmcgdGhlIHN0eWxlIG9mIHRoZSBIVE1MIERPTSBlbGVtZW50IHRoYXQgaG9sZHMgdGhlIGdyYXBoKSwgeW91IHdpbGwgd2FudCB0byBjYWxsIGN5LnJlc2l6ZSgpIHRvIGhhdmUgdGhlIGdyYXBoIHJlc2l6ZSBhbmQgcmVkcmF3IGl0c2VsZi4KKyAgICAgICAgICoKKyAgICAgICAgICogQ3l0b3NjYXBlLmpzIGNhbiBub3QgYXV0b21hdGljYWxseSBtb25pdG9yIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHZpZXdwb3J0LCBhcyBxdWVyeWluZyB0aGUgRE9NIGZvciB0aG9zZSBkaW1lbnNpb25zIGNhbiBiZSBleHBlbnNpdmUuIEFsdGhvdWdoIGN5LnJlc2l6ZSgpIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGZvciB5b3Ugb24gdGhlIHdpbmRvdydzIHJlc2l6ZSBldmVudCwgdGhlcmUgaXMgbm8gcmVzaXplIG9yIHN0eWxlIGV2ZW50IGZvciBhcmJpdHJhcnkgRE9NIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcmVzaXplKCk6IENvbGxlY3Rpb25FbGVtZW50czsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSW5zdGFuY2VBbmltYXRpb24geworICAgICAgICAvLyBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jY29yZS9hbmltYXRpb24KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHdoZXRoZXIgdGhlIHZpZXdwb3J0IGlzIGN1cnJlbnRseSBiZWluZyBhbmltYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIGFuaW1hdGVkKCk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuaW1hdGUgdGhlIHZpZXdwb3J0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pcyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGV0YWlscyBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKiB6b29tIEEgem9vbSBsZXZlbCB0byB3aGljaCB0aGUgZ3JhcGggd2lsbCBiZSBhbmltYXRlZC4KKyAgICAgICAgICogcGFuIEEgcGFubmluZyBwb3NpdGlvbiB0byB3aGljaCB0aGUgZ3JhcGggd2lsbCBiZSBhbmltYXRlZC4KKyAgICAgICAgICogcGFuQnkgQSByZWxhdGl2ZSBwYW5uaW5nIHBvc2l0aW9uIHRvIHdoaWNoIHRoZSBncmFwaCB3aWxsIGJlIGFuaW1hdGVkLgorICAgICAgICAgKiBmaXQgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZml0dGluZyBvcHRpb25zIGZyb20gd2hpY2ggdGhlIGdyYXBoIHdpbGwgYmUgYW5pbWF0ZWQuCisgICAgICAgICAqIGVsZXMgRWxlbWVudHMgb3IgYSBzZWxlY3RvciB0byB3aGljaCB0aGUgdmlld3BvcnQgd2lsbCBiZSBmaXR0ZWQuCisgICAgICAgICAqIHBhZGRpbmcgUGFkZGluZyB0byB1c2Ugd2l0aCB0aGUgZml0dGluZy4KKyAgICAgICAgICogY2VudGVyIEFuIG9iamVjdCBjb250YWluaW5nIGNlbnRyaW5nIG9wdGlvbnMgZnJvbSB3aGljaCB0aGUgZ3JhcGggd2lsbCBiZSBhbmltYXRlZC4KKyAgICAgICAgICogZWxlcyBFbGVtZW50cyBvciBhIHNlbGVjdG9yIHRvIHdoaWNoIHRoZSB2aWV3cG9ydCB3aWxsIGJlIGNlbnRyZWQuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBjb250YWluaW5nIGFuaW1hdGlvbiBvcHRpb25zLgorICAgICAgICAgKiBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICogcXVldWUgLSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHF1ZXVlIHRoZSBhbmltYXRpb24uCisgICAgICAgICAqIGNvbXBsZXRlIC0gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBkb25lLgorICAgICAgICAgKiBzdGVwIC0gQSBmdW5jdGlvbiB0byBjYWxsIGVhY2ggdGltZSB0aGUgYW5pbWF0aW9uIHN0ZXBzLgorICAgICAgICAgKi8KKyAgICAgICAgYW5pbWF0ZShhbmlzOiB7CisgICAgICAgICAgICB6b29tPzogbnVtYmVyLAorICAgICAgICAgICAgcGFuPzogUG9zaXRpb24sCisgICAgICAgICAgICBwYW5CeT86IFBvc2l0aW9uLAorICAgICAgICAgICAgZml0PzogeworICAgICAgICAgICAgICAgIGVsZXM6IENvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgcGFkZGluZz86IG51bWJlcgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGNlbnRlcj86IHsKKyAgICAgICAgICAgICAgICBlbGVzOiBDb2xsZWN0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0sIG9wdGlvbnM/OiB7CisgICAgICAgICAgICBkdXJhdGlvbj86IG51bWJlciwKKyAgICAgICAgICAgIHF1ZXVlPzogYm9vbGVhbiwKKyAgICAgICAgICAgIGNvbXBsZXRlPzogKCkgPT4gdm9pZCwKKyAgICAgICAgICAgIHN0ZXA/OiAoKSA9PiB2b2lkCisgICAgICAgIH0pOiBDeS5JbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgZGVsYXkgYmV0d2VlbiBhbmltYXRpb25zIGZvciB0aGUgdmlld3BvcnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkdXJhdGlvbiBIb3cgbG9uZyB0aGUgZGVsYXkgc2hvdWxkIGJlIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBkZWxheSBpcyBjb21wbGV0ZS4KKyAgICAgICAgICovCisgICAgICAgIGRlbGF5KGR1cmF0aW9uOiBudW1iZXIsIGNvbXBsZXRlPzogKCkgPT4gdm9pZCk6IEN5Lkluc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9wIGFsbCB2aWV3cG9ydCBhbmltYXRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xlYXJRdWV1ZSBBIGJvb2xlYW4sIGluZGljYXRpbmcgd2hldGhlciB0aGUgcXVldWUgb2YgYW5pbWF0aW9ucyBzaG91bGQgYmUgZW1wdGllZC4KKyAgICAgICAgICogQHBhcmFtIGp1bXBUb0VuZCBBIGJvb2xlYW4sIGluZGljYXRpbmcgd2hldGhlciB0aGUgY3VycmVudGx5LXJ1bm5pbmcgYW5pbWF0aW9ucyBzaG91bGQganVtcCB0byB0aGVpciBlbmRzIHJhdGhlciB0aGFuIGp1c3Qgc3RvcHBpbmcgbWlkd2F5LgorICAgICAgICAgKi8KKyAgICAgICAgc3RvcChjbGVhclF1ZXVlPzogYm9vbGVhbiwganVtcFRvRW5kPzogYm9vbGVhbik6IEN5Lkluc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgYWxsIHF1ZXVlZCBhbmltYXRpb25zIGZvciB0aGUgdmlld3BvcnQuCisgICAgICAgICAqLworICAgICAgICBjbGVhclF1ZXVlKCk6IEN5Lkluc3RhbmNlOworICAgIH0KKworICAgIGludGVyZmFjZSBJbnN0YW5jZUxheW91dCB7CisgICAgICAgIC8vVE9ETzogaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2NvcmUvbGF5b3V0CisgICAgICAgIGxheW91dChsYXlvdXQ6IExheW91dE9wdGlvbnMpOiB2b2lkOworCisgICAgfQorCisgICAgaW50ZXJmYWNlIEluc3RhbmNlU3R5bGUgeworICAgICAgICAvL1RPRE86IGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNjb3JlL3N0eWxlCisgICAgfQorCisgICAgaW50ZXJmYWNlIEluc3RhbmNlRXhwb3J0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4cG9ydCB0aGUgY3VycmVudCBncmFwaCB2aWV3IGFzIGEgUE5HIGltYWdlIGluIEJhc2U2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHBuZygpOiBzdHJpbmc7CisgICAgICAgIC8qKgorICAgICAgICAgKiBFeHBvcnQgdGhlIGN1cnJlbnQgZ3JhcGggdmlldyBhcyBhIFBORyBpbWFnZSBpbiBCYXNlNjQgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAqLworICAgICAgICBwbmcob3B0aW9uczogRXhwb3J0T3B0aW9ucyk6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhwb3J0IHRoZSBjdXJyZW50IGdyYXBoIHZpZXcgYXMgYSBKUEcgaW1hZ2UgaW4gQmFzZTY0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAganBnKCk6IHN0cmluZzsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4cG9ydCB0aGUgY3VycmVudCBncmFwaCB2aWV3IGFzIGEgSlBHIGltYWdlIGluIEJhc2U2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGpwZyhvcHRpb25zOiBFeHBvcnRPcHRpb25zKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeHBvcnQgdGhlIGN1cnJlbnQgZ3JhcGggdmlldyBhcyBhIEpQRyBpbWFnZSBpbiBCYXNlNjQgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAqLworICAgICAgICBqcGVnKCk6IHN0cmluZzsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4cG9ydCB0aGUgY3VycmVudCBncmFwaCB2aWV3IGFzIGEgSlBHIGltYWdlIGluIEJhc2U2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGpwZWcob3B0aW9uczogRXhwb3J0T3B0aW9ucyk6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhwb3J0IHRoZSBncmFwaCBhcyBKU09OLCB0aGUgc2FtZSBmb3JtYXQgdXNlZCBhdCBpbml0aWFsaXNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGpzb24oKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBQb3NpdGlvbiB7CisgICAgICAgIHg6IG51bWJlcjsKKyAgICAgICAgeTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMYXlvdXRJbnN0YW5jZSB7CisgICAgICAgIC8vVE9ETzogaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2xheW91dHMvbGF5b3V0LW1hbmlwdWxhdGlvbgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydCBydW5uaW5nIHRoZSBsYXlvdXQuCisgICAgICAgICAqLworICAgICAgICBydW4oKTogdm9pZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0IHJ1bm5pbmcgdGhlIGxheW91dC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXJ0KCk6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3AgcnVubmluZyB0aGUgKGFzeW5jaHJvbm91cy9kaXNjcmV0ZSkgbGF5b3V0LgorICAgICAgICAgKi8KKyAgICAgICAgc3RvcCgpOiB2b2lkOworICAgIH0KKworICAgIGludGVyZmFjZSBMYXlvdXRPcHRpb25zIHsKKyAgICAgICAgLy8gVE9ETzogaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2xheW91dHMKKyAgICAgICAgLyoqCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGlzICdncmlkJy4KKyAgICAgICAgICovCisgICAgICAgIG5hbWU/OiBzdHJpbmc7CisgICAgICAgIHBhZGRpbmc/OiBudW1iZXI7CisgICAgICAgIGF2b2lkT3ZlcmxhcD86IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIEN5dG9zY2FwZU9wdGlvbnMgeworICAgICAgICAvLyB2ZXJ5IGNvbW1vbmx5IHVzZWQgb3B0aW9uczoKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgSFRNTCBET00gZWxlbWVudCBpbiB3aGljaCB0aGUgZ3JhcGggc2hvdWxkIGJlIHJlbmRlcmVkLgorICAgICAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGlmIEN5dG9zY2FwZS5qcyBpcyBydW4gaGVhZGxlc3NseSBvciBpZiB5b3UgaW5pdGlhbGlzZSB1c2luZyBqUXVlcnkgKGluIHdoaWNoIGNhc2UgeW91ciBqUXVlcnkgb2JqZWN0IGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgRE9NIGVsZW1lbnQpLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBpcyB1bmRlZmluZWQuCisgICAgICAgICAqLworICAgICAgICBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IEpRdWVyeTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBbW1N0eWxlc2hlZXRdXSB1c2VkIHRvIHN0eWxlIHRoZSBncmFwaC4gRm9yIGNvbnZlbmllbmNlLCB0aGlzIG9wdGlvbiBjYW4gYWx0ZXJuYXRpdmVseSBiZSBzcGVjaWZpZWQgYXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHN0eWxlc2hlZXQuCisgICAgICAgICAqLworICAgICAgICBzdHlsZT86IFN0eWxlc2hlZXRbXXxQcm9taXNlPFN0eWxlc2hlZXRbXT47CisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhcnJheSBvZiBbW0VsZW1lbnRzXV0gc3BlY2lmaWVkIGFzIHBsYWluIG9iamVjdHMuIEZvciBjb252ZW5pZW5jZSwgdGhpcyBvcHRpb24gY2FuIGFsdGVybmF0aXZlbHkgYmUgc3BlY2lmaWVkIGFzIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBlbGVtZW50cyBKU09OLgorICAgICAgICAgKi8KKyAgICAgICAgZWxlbWVudHM/OiBFbGVtZW50c0RlZmluaXRpb258RWxlbWVudERlZmluaXRpb25bXXxQcm9taXNlPEVsZW1lbnRzRGVmaW5pdGlvbj58UHJvbWlzZTxFbGVtZW50RGVmaW5pdGlvbltdPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgcGxhaW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGxheW91dCBvcHRpb25zLiBXaGljaCBsYXlvdXQgaXMgaW5pdGlhbGx5IHJ1biBpcyBzcGVjaWZpZWQgYnkgdGhlIG5hbWUgZmllbGQuIFJlZmVyIHRvIGEgbGF5b3V0J3MgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG9wdGlvbnMgaXQgc3VwcG9ydHMuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgeW91ciBub2RlIHBvc2l0aW9ucyB5b3Vyc2VsZiBpbiB5b3VyIGVsZW1lbnRzIEpTT04sIHlvdSBjYW4gdXNlIHRoZSBwcmVzZXQgbGF5b3V0IOKAlCBieSBkZWZhdWx0IGl0IGRvZXMgbm90IHNldCBhbnkgcG9zaXRpb25zLCBsZWF2aW5nIHlvdXIgbm9kZXMgaW4gdGhlaXIgY3VycmVudCBwb3NpdGlvbnMgKGUuZy4gc3BlY2lmaWVkIGluIG9wdGlvbnMuZWxlbWVudHMgYXQgaW5pdGlhbGlzYXRpb24gdGltZSkKKyAgICAgICAgICovCisgICAgICAgIGxheW91dD86IExheW91dE9wdGlvbnM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gQ3l0b3NjYXBlLmpzIGhhcyBsb2FkZWQgdGhlIGdyYXBoIGFuZCB0aGUgbGF5b3V0IGhhcyBzcGVjaWZpZWQgaW5pdGlhbCBwb3NpdGlvbnMgb2YgdGhlIG5vZGVzLiBBZnRlciB0aGlzIHBvaW50LCByZW5kZXJpbmcgY2FuIGhhcHBlbiwgdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGggdGhlIGdyYXBoLCBldCBjZXRlcmEuCisgICAgICAgICAqLworICAgICAgICByZWFkeT86IChldnQ6IGFueSkgPT4gdm9pZDsKKworICAgICAgICAvLyBpbml0aWFsIHZpZXdwb3J0IHN0YXRlOgorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluaXRpYWwgem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguIE1ha2Ugc3VyZSB0byBkaXNhYmxlIHZpZXdwb3J0IG1hbmlwdWxhdGlvbiBvcHRpb25zLCBzdWNoIGFzIGZpdCwgaW4geW91ciBsYXlvdXQgc28gdGhhdCBpdCBpcyBub3Qgb3ZlcnJpZGRlbiB3aGVuIHRoZSBsYXlvdXQgaXMgYXBwbGllZC4gWW91IGNhbiBzZXQgb3B0aW9ucy5taW5ab29tIGFuZCBvcHRpb25zLm1heFpvb20gdG8gc2V0IHJlc3RyaWN0aW9ucyBvbiB0aGUgem9vbSBsZXZlbC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgICAgICovCisgICAgICAgIHpvb20/OiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaW5pdGlhbCBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC4gTWFrZSBzdXJlIHRvIGRpc2FibGUgdmlld3BvcnQgbWFuaXB1bGF0aW9uIG9wdGlvbnMsIHN1Y2ggYXMgZml0LCBpbiB5b3VyIGxheW91dCBzbyB0aGF0IGl0IGlzIG5vdCBvdmVycmlkZGVuIHdoZW4gdGhlIGxheW91dCBpcyBhcHBsaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcGFuPzogUG9zaXRpb247CisKKyAgICAgICAgLy8gaW50ZXJhY3Rpb24gb3B0aW9ucz86CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIG1pbmltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZSBzY2FsZWQgc21hbGxlciB0aGFuIHRoaXMgem9vbSBsZXZlbC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMWUtNTAuCisgICAgICAgICAqLworICAgICAgICBtaW5ab29tPzogbnVtYmVyOworICAgICAgICAvKioKKyAgICAgICAgICogQSBtYXhpbXVtIGJvdW5kIG9uIHRoZSB6b29tIGxldmVsIG9mIHRoZSBncmFwaC4gVGhlIHZpZXdwb3J0IGNhbiBub3QgYmUgc2NhbGVkIGxhcmdlciB0aGFuIHRoaXMgem9vbSBsZXZlbC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMWU1MC4KKyAgICAgICAgICovCisgICAgICAgIG1heFpvb20/OiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHpvb21pbmcgdGhlIGdyYXBoIGlzIGVuYWJsZWQsIGJvdGggYnkgdXNlciBldmVudHMgYW5kIHByb2dyYW1tYXRpY2FsbHkuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICAgICAqLworICAgICAgICB6b29taW5nRW5hYmxlZD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHVzZXIgZXZlbnRzIChlLmcuIG1vdXNlIHdoZWVsLCBwaW5jaC10by16b29tKSBhcmUgYWxsb3dlZCB0byB6b29tIHRoZSBncmFwaC4gUHJvZ3JhbW1hdGljIGNoYW5nZXMgdG8gem9vbSBhcmUgdW5hZmZlY3RlZCBieSB0aGlzIG9wdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgICAgICovCisgICAgICAgIHVzZXJab29taW5nRW5hYmxlZD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHBhbm5pbmcgdGhlIGdyYXBoIGlzIGVuYWJsZWQsIGJvdGggYnkgdXNlciBldmVudHMgYW5kIHByb2dyYW1tYXRpY2FsbHkuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICAgICAqLworICAgICAgICBwYW5uaW5nRW5hYmxlZD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHVzZXIgZXZlbnRzIChlLmcuIGRyYWdnaW5nIHRoZSBncmFwaCBiYWNrZ3JvdW5kKSBhcmUgYWxsb3dlZCB0byBwYW4gdGhlIGdyYXBoLiBQcm9ncmFtbWF0aWMgY2hhbmdlcyB0byBwYW4gYXJlIHVuYWZmZWN0ZWQgYnkgdGhpcyBvcHRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICAgICAqLworICAgICAgICB1c2VyUGFubmluZ0VuYWJsZWQ/OiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciBib3ggc2VsZWN0aW9uIChpLmUuIGRyYWcgYSBib3ggb3ZlcmxheSBhcm91bmQsIGFuZCByZWxlYXNlIGl0IHRvIHNlbGVjdCkgaXMgZW5hYmxlZC4gSWYgZW5hYmxlZCwgdGhlIHVzZXIgbXVzdCB0YXBob2xkIHRvIHBhbiB0aGUgZ3JhcGguCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBzZWxlY3Rpb24gYmVoYXZpb3VyIGZyb20gdXNlciBpbnB1dC4gQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgYXV0b21hdGljYWxseSBmb3IgeW91IGJhc2VkIG9uIHRoZSB0eXBlIG9mIGlucHV0IGRldmljZSBkZXRlY3RlZC4gT24gdG91Y2ggZGV2aWNlcywgJ2FkZGl0aXZlJyBpcyBkZWZhdWx0IOKAlCBhIG5ldyBzZWxlY3Rpb24gbWFkZSBieSB0aGUgdXNlciBhZGRzIHRvIHRoZSBzZXQgb2YgY3VycmVubHkgc2VsZWN0ZWQgZWxlbWVudHMuIE9uIG1vdXNlLWlucHV0IGRldmljZXMsICdzaW5nbGUnIGlzIGRlZmF1bHQg4oCUIGEgbmV3IHNlbGVjdGlvbiBtYWRlIGJ5IHRoZSB1c2VyIGJlY29tZXMgdGhlIGVudGlyZSBzZXQgb2YgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnRzIChpLmUuIHRoZSBwcmV2aW91cyBlbGVtZW50cyBhcmUgdW5zZWxlY3RlZCkuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIChpc1RvdWNoRGV2aWNlID8gJ2FkZGl0aXZlJyA6ICdzaW5nbGUnKS4KKyAgICAgICAgICovCisgICAgICAgIHNlbGVjdGlvblR5cGU/OiBTZWxlY3Rpb25UeXBlOworICAgICAgICAvKioKKyAgICAgICAgICogQSBub25uZWdhdGl2ZSBpbnRlZ2VyIHRoYXQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBkaXN0YW5jZSB0aGF0IGEgdXNlciBtYXkgbW92ZSBkdXJpbmcgYSB0YXAgZ2VzdHVyZSwgb24gdG91Y2ggZGV2aWNlcyBhbmQgZGVza3RvcCBkZXZpY2VzIHJlc3BlY3RpdmVseS4gVGhpcyBtYWtlcyB0YXBwaW5nIGVhc2llciBmb3IgdXNlcnMuIFRoZXNlIHZhbHVlcyBoYXZlIHNhbmUgZGVmYXVsdHMsIHNvIGl0IGlzIG5vdCBhZHZpc2VkIHRvIGNoYW5nZSB0aGVzZSBvcHRpb25zIHVubGVzcyB5b3UgaGF2ZSB2ZXJ5IGdvb2QgcmVhc29uIGZvciBkb2luZyBzby4gTGFyZ2VyIHZhbHVlcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgaGF2ZSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGlzIDguCisgICAgICAgICAqLworICAgICAgICB0b3VjaFRhcFRocmVzaG9sZD86IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbm9ubmVnYXRpdmUgaW50ZWdlciB0aGF0IGluZGljYXRlcyB0aGUgbWF4aW11bSBhbGxvd2FibGUgZGlzdGFuY2UgdGhhdCBhIHVzZXIgbWF5IG1vdmUgZHVyaW5nIGEgdGFwIGdlc3R1cmUsIG9uIHRvdWNoIGRldmljZXMgYW5kIGRlc2t0b3AgZGV2aWNlcyByZXNwZWN0aXZlbHkuIFRoaXMgbWFrZXMgdGFwcGluZyBlYXNpZXIgZm9yIHVzZXJzLiBUaGVzZSB2YWx1ZXMgaGF2ZSBzYW5lIGRlZmF1bHRzLCBzbyBpdCBpcyBub3QgYWR2aXNlZCB0byBjaGFuZ2UgdGhlc2Ugb3B0aW9ucyB1bmxlc3MgeW91IGhhdmUgdmVyeSBnb29kIHJlYXNvbiBmb3IgZG9pbmcgc28uIExhcmdlciB2YWx1ZXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGhhdmUgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LgorICAgICAgICAgKi8KKyAgICAgICAgZGVza3RvcFRhcFRocmVzaG9sZD86IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgbm9kZXMgc2hvdWxkIGJlIGxvY2tlZCAobm90IGRyYWdnYWJsZSBhdCBhbGwpIGJ5IGRlZmF1bHQgKGlmIHRydWUsIG92ZXJyaWRlcyBpbmRpdmlkdWFsIG5vZGUgc3RhdGUpLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGF1dG9sb2NrPzogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgbm9kZXMgc2hvdWxkIGJlIHVuZ3JhYmlmaWVkIChub3QgZ3JhYmJhYmxlIGJ5IHVzZXIpIGJ5IGRlZmF1bHQgKGlmIHRydWUsIG92ZXJyaWRlcyBpbmRpdmlkdWFsIG5vZGUgc3RhdGUpLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGF1dG91bmdyYWJpZnk/OiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciBub2RlcyBzaG91bGQgYmUgdW5zZWxlY3RpZmllZCAoaW1tdXRhYmxlIHNlbGVjdGlvbiBzdGF0ZSkgYnkgZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgZWxlbWVudCBzdGF0ZSkuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgYXV0b3Vuc2VsZWN0aWZ5PzogYm9vbGVhbjsKKworICAgICAgICAvLyByZW5kZXJpbmcgb3B0aW9uczoKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgY29udmVuaWVuY2Ugb3B0aW9uIHRoYXQgaW5pdGlhbGlzZXMgdGhlIGluc3RhbmNlIHRvIHJ1biBoZWFkbGVzc2x5LiBZb3UgZG8gbm90IG5lZWQgdG8gc2V0IHRoaXMgaW4gZW52aXJvbm1lbnRzIHRoYXQgYXJlIGltcGxpY2l0bHkgaGVhZGxlc3MgKGUuZy4gTm9kZS5qcykuIEhvd2V2ZXIsIGl0IGlzIGhhbmR5IHRvIHNldCBoZWFkbGVzczogdHJ1ZSBpZiB5b3Ugd2FudCBhIGhlYWRsZXNzIGluc3RhbmNlIGluIGEgYnJvd3Nlci4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBoZWFkbGVzcz86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBzdHlsaW5nIHNob3VsZCBiZSB1c2VkLiBGb3IgaGVhZGxlc3MgKGkuZS4gb3V0c2lkZSB0aGUgYnJvd3NlcikgZW52aXJvbm1lbnRzLCBkaXNwbGF5IGlzIG5vdCBuZWNlc3NhcnkgYW5kIHNvIG5laXRoZXIgaXMgc3R5bGluZyBuZWNlc3Nhcnkg4oCUIHRoZXJlYnkgc3BlZWRpbmcgdXAgeW91ciBjb2RlLiBZb3UgY2FuIG1hbnVhbGx5IGVuYWJsZSBzdHlsaW5nIGluIGhlYWRsZXNzIGVudmlyb25tZW50cyBpZiB5b3UgcmVxdWlyZSBpdCBmb3IgYSBzcGVjaWFsIGNhc2UuIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGRpc2FibGUgc3R5bGUgaWYgeW91IHBsYW4gb24gcmVuZGVyaW5nIHRoZSBncmFwaC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgICAgICovCisgICAgICAgIHN0eWxlRW5hYmxlZD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGVuIHNldCB0byB0cnVlLCB0aGUgcmVuZGVyZXIgZG9lcyBub3QgcmVuZGVyIGVkZ2VzIHdoaWxlIHRoZSB2aWV3cG9ydCBpcyBiZWluZyBtYW5pcHVsYXRlZC4gVGhpcyBtYWtlcyBwYW5uaW5nLCB6b29taW5nLCBkcmFnZ2luZywgZXQgY2V0ZXJhIG1vcmUgcmVzcG9uc2l2ZSBmb3IgbGFyZ2UgZ3JhcGhzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGhpZGVFZGdlc09uVmlld3BvcnQ/OiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogaGVuIHNldCB0byB0cnVlLCB0aGUgcmVuZGVyZXIgZG9lcyBub3QgcmVuZGVyIGxhYmVscyB3aGlsZSB0aGUgdmlld3BvcnQgaXMgYmVpbmcgbWFuaXB1bGF0ZWQuIFRoaXMgbWFrZXMgcGFubmluZywgem9vbWluZywgZHJhZ2dpbmcsIGV0IGNldGVyYSBtb3JlIHJlc3BvbnNpdmUgZm9yIGxhcmdlIGdyYXBocy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBoaWRlTGFiZWxzT25WaWV3cG9ydD86IGJvb2xlYW47CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGVuIHNldCB0byB0cnVlLCB0aGUgcmVuZGVyZXIgdXNlcyBhIHRleHR1cmUgKGlmIHN1cHBvcnRlZCkgZHVyaW5nIHBhbm5pbmcgYW5kIHpvb21pbmcgaW5zdGVhZCBvZiBkcmF3aW5nIHRoZSBlbGVtZW50cywgbWFraW5nIGxhcmdlIGdyYXBocyBtb3JlIHJlc3BvbnNpdmUuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgdGV4dHVyZU9uVmlld3BvcnQ/OiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIGEgbW90aW9uIGJsdXIgZWZmZWN0IHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBmcmFtZXMgc2VlbSBzbW9vdGhlci4gVGhpcyBjYW4gc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgcGVyY2VpdmVkIHBlcmZvcm1hbmNlIGZvciBhIGxhcmdlIGdyYXBocy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBtb3Rpb25CbHVyPzogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZW4gbW90aW9uQmx1cjogdHJ1ZSwgdGhpcyB2YWx1ZSBjb250cm9scyB0aGUgb3BhY2l0eSBvZiBtb3Rpb24gYmx1ciBmcmFtZXMuIEhpZ2hlciB2YWx1ZXMgbWFrZSB0aGUgbW90aW9uIGJsdXIgZWZmZWN0IG1vcmUgcHJvbm91bmNlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4yLgorICAgICAgICAgKi8KKyAgICAgICAgbW90aW9uQmx1ck9wYWNpdHk/OiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGFuZ2VzIHRoZSBzY3JvbGwgd2hlZWwgc2Vuc2l0aXZpdHkgd2hlbiB6b29taW5nLiBUaGlzIGlzIGEgbXVsdGlwbGljYXRpdmUgbW9kaWZpZXIuIFNvLCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSByZWR1Y2VzIHRoZSBzZW5zaXRpdml0eSAoem9vbXMgc2xvd2VyKSwgYW5kIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDEgaW5jcmVhc2VzIHRoZSBzZW5zaXRpdml0eSAoem9vbXMgZmFzdGVyKS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgICAgICovCisgICAgICAgIHdoZWVsU2Vuc2l0aXZpdHk/OiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZXMgdGhlIHNjcmVlbiBwaXhlbCByYXRpbyB3aXRoIGEgbWFudWFsbHkgc2V0IHZhbHVlICgxLjAgb3IgMC42NjYgcmVjb21tZW5kZWQsIGlmIHNldCkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugb24gaGlnaCBkZW5zaXR5IGRpc3BsYXlzIGJ5IHJlZHVjaW5nIHRoZSBlZmZlY3RpdmUgYXJlYSB0aGF0IG5lZWRzIHRvIGJlIHJlbmRlcmVkLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGhhcmR3YXJlJ3MgYWN0dWFsIHBpeGVsIHJhdGlvIGF0IHRoZSBleHBlbnNlIG9mIHBlcmZvcm1hbmNlLCB5b3UgY2FuIHNldCBwaXhlbFJhdGlvOiAnYXV0bycuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICAgICAqLworICAgICAgICBwaXhlbFJhdGlvPzogbnVtYmVyOworICAgICAgICAvKioKKyAgICAgICAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIEN5dG9zY2FwZS5qcyBoYXMgcmVuZGVyZWQgaXRzIGZpcnN0IGZyYW1lLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZ3JhYmJpbmcgc2NyZWVuc2hvdHMgZXRjIGFmdGVyIGluaXRpYWxpc2lvbiwgYnV0IGluIGdlbmVyYWwgeW91IHNob3VsZCB1c2UgcmVhZHkgaW5zdGVhZC4KKyAgICAgICAgICovCisgICAgICAgIGluaXRyZW5kZXI/OiAoZXZ0OiBhbnkpID0+IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiAgQSBwbGFpbiBvYmplY3QgY29udGFpbmluZyBvcHRpb25zIGZvciB0aGUgcmVuZGVyZXIgdG8gYmUgdXNlZC4gVGhlIG9wdGlvbnMucmVuZGVyZXIubmFtZSBmaWVsZCBzcGVjaWZpZXMgd2hpY2ggcmVuZGVyZXIgaXMgdXNlZC4gWW91IG5lZWQgbm90IHNwZWNpZnkgYW55dGhpbmcgZm9yIHRoZSByZW5kZXJlciBvcHRpb24sIHVubGVzcyB5b3Ugd2FudCB0byBzcGVjaWZ5IG9uZSBvZiB0aGUgcmVuZGVyaW5nIG9wdGlvbnMuCisgICAgICAgICAqLworICAgICAgICByZW5kZXJlcj86IFJlbmRlcmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBFeHBvcnRPcHRpb25zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBiYWNrZ3JvdW5kIGNvbG91ciBvZiB0aGUgaW1hZ2UgKHRyYW5zcGFyZW50IGJ5IGRlZmF1bHQpLgorICAgICAgICAgKi8KKyAgICAgICAgYmc/OiBzdHJpbmc7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHRvIGV4cG9ydCB0aGUgY3VycmVudCB2aWV3cG9ydCB2aWV3IChmYWxzZSwgZGVmYXVsdCkgb3IgdGhlIGVudGlyZSBncmFwaCAodHJ1ZSkuCisgICAgICAgICAqLworICAgICAgICBmdWxsPzogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdmFsdWUgc3BlY2lmaWVzIGEgcG9zaXRpdmUgbnVtYmVyIHRoYXQgc2NhbGVzIHRoZSBzaXplIG9mIHRoZSByZXN1bHRhbnQgaW1hZ2UuCisgICAgICAgICAqLworICAgICAgICBzY2FsZT86IG51bWJlcjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNwZWNpZmllcyB0aGUgc2NhbGUgYXV0b21hdGljYWxseSBpbiBjb21iaW5hdGlvbiB3aXRoIG1heEhlaWdodCBzdWNoIHRoYXQgdGhlIHJlc3VsdGFudCBpbWFnZSBpcyBubyB3aWRlciB0aGFuIG1heFdpZHRoLgorICAgICAgICAgKi8KKyAgICAgICAgbWF4V2lkdGg/OiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIHNjYWxlIGF1dG9tYXRpY2FsbHkgaW4gY29tYmluYXRpb24gd2l0aCBtYXhXaWR0aCBzdWNoIHRoYXQgdGhlIHJlc3VsdGFudCBpbWFnZSBpcyBubyB0YWxsZXIgdGhhbiBtYXhIZWlnaHQuCisgICAgICAgICAqLworICAgICAgICBtYXhIZWlnaHQ/OiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEJvdW5kaW5nQm94T3B0aW9ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgbm9kZXMgaW4gdGhlIGJvdW5kaW5nIGJveC4KKyAgICAgICAgICovCisgICAgICAgIGluY2x1ZGVOb2RlczogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBlZGdlcyBpbiB0aGUgYm91bmRpbmcgYm94LgorICAgICAgICAgKi8KKyAgICAgICAgaW5jbHVkZUVkZ2VzOiBib29sZWFuOworICAgICAgICAvKioKKyAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBpbmNsdWRlIGxhYmVscyBpbiB0aGUgYm91bmRpbmcgYm94LgorICAgICAgICAgKi8KKyAgICAgICAgaW5jbHVkZUxhYmVsczogYm9vbGVhbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBzaGFkb3dzIGluIHRoZSBib3VuZGluZyBib3ggKGRlZmF1bHQgdHJ1ZSkuCisgICAgICAgICAqLworCisgICAgICAgIGluY2x1ZGVTaGFkb3dzOiBib29sZWFuCisgICAgfQorCisgICAgaW50ZXJmYWNlIFpvb21PcHRpb25zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB6b29tIGxldmVsIHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGxldmVsOiBudW1iZXI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcG9zaXRpb24gYWJvdXQgd2hpY2ggdG8gem9vbS4KKyAgICAgICAgICovCisgICAgICAgIHBvc2l0aW9uPzogUG9zaXRpb247CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcmVuZGVyZWQgcG9zaXRpb24gYWJvdXQgd2hpY2ggdG8gem9vbS4KKyAgICAgICAgICovCisgICAgICAgIHJlbmRlcmVkUG9zaXRpb24/OiBQb3NpdGlvbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU3RhdGljIHsKKyAgICAgICAgKG9wdGlvbnM/OiBDeXRvc2NhcGVPcHRpb25zKTogSW5zdGFuY2U7CisgICAgICAgIChleHRlbnNpb25OYW1lOiBzdHJpbmcsIGZvbzogc3RyaW5nLCBiYXI6IGFueSk6IEluc3RhbmNlOworICAgICAgICB2ZXJzaW9uOiBzdHJpbmc7CisKKyAgICAgICAgUHJvbWlzZTxUPigpOiBDeS5Qcm9taXNlPFQ+OworICAgIH0KKworICAgIGVudW0gUHJvbWlzZVN0YXRlIHsKKyAgICAgICAgU1RBVEVfUEVORElORyA9IDAsCisgICAgICAgIFNUQVRFX0ZVTEZJTExFRCA9IDEsCisgICAgICAgIFNUQVRFX1JFSkVDVEVEID0gMgorCisgICAgfQorCisgICAgaW50ZXJmYWNlIFByb21pc2U8VD4geworICAgICAgICBpZDogc3RyaW5nOworICAgICAgICBzdGF0ZTogUHJvbWlzZVN0YXRlOworICAgICAgICBmdWxmaWxsVmFsdWU6IFQ7CisgICAgICAgIHJlamVjdFJlYXNvbjogYW55OworICAgICAgICBvbkZ1bGZpbGxlZDogYW55W107CisgICAgICAgIG9uUmVqZWN0ZWQ6IGFueVtdOworCisgICAgICAgIGZ1bGZpbGwodmFsdWU6IFQpOiBQcm9taXNlPFQ+OworICAgICAgICByZWplY3QoZXJyb3I6IGFueSk6IFByb21pc2U8YW55PjsKKyAgICAgICAgdGhlbjxVPihvbkZ1bGZpbGxlZD86ICh2YWx1ZTogVCkgPT4gVSB8IFByb21pc2U8VT4sIG9uUmVqZWN0ZWQ/OiAoZXJyb3I6IGFueSkgPT4gVSB8IFByb21pc2U8VT4pOiBQcm9taXNlPFU+OworICAgICAgICB0aGVuPFU+KG9uRnVsZmlsbGVkPzogKHZhbHVlOiBUKSA9PiBVIHwgUHJvbWlzZTxVPiwgb25SZWplY3RlZD86IChlcnJvcjogYW55KSA9PiB2b2lkKTogUHJvbWlzZTxVPjsKKyAgICB9Cit9CisKK2RlY2xhcmUgbW9kdWxlICJjeXRvc2NhcGUiIHsKKyAgICBleHBvcnQgPSBjeXRvc2NhcGU7Cit9CisKK2RlY2xhcmUgdmFyIGN5dG9zY2FwZTogQ3kuU3RhdGljOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvdHlwaW5ncy9jeXRvc2NhcGUvZWRnZS1lZGl0YXRpb24uZC50cyBiL2NhdGFsb2ctdWkvdHlwaW5ncy9jeXRvc2NhcGUvZWRnZS1lZGl0YXRpb24uZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWViZDcwCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90eXBpbmdzL2N5dG9zY2FwZS9lZGdlLWVkaXRhdGlvbi5kLnRzCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogQ3JlYXRlZCBieSBvYmFyZGEgb24gMTEvNi8yMDE2LgorICovCisKK2ludGVyZmFjZSBDeXRvc2NhcGVFZGdlRWRpdGF0aW9uIHsKKyAgICBuZXcoKTogQ3l0b3NjYXBlRWRnZUVkaXRhdGlvbjsKKworICAgIGluaXQoY3k6IEN5Lkluc3RhbmNlLCBoYW5kbGVTaXplPzogbnVtYmVyKTp2b2lkOworICAgIHJlZ2lzdGVySGFuZGxlKGhhbmRsZTogSGFuZGxlKTogdm9pZDsKK30KKworaW50ZXJmYWNlIEhhbmRsZSB7CisgICAgcG9zaXRpb25YOiBzdHJpbmcsCisgICAgcG9zaXRpb25ZOiBzdHJpbmcsCisgICAgb2Zmc2V0WD86IG51bWJlciwKKyAgICBvZmZzZXRZPzogbnVtYmVyLAorICAgIGNvbG9yOiBzdHJpbmcsCisgICAgdHlwZTogc3RyaW5nLAorICAgIHNpbmdsZTogYm9vbGVhbiwKKyAgICBub2RlVHlwZU5hbWVzOiBBcnJheTxzdHJpbmc+OworICAgIGltYWdlVXJsOiBzdHJpbmc7CisgICAgbGluZVdpZHRoOiBudW1iZXI7CisgICAgbGluZVN0eWxlOiBzdHJpbmc7Cit9CisKK2RlY2xhcmUgdmFyIEN5dG9zY2FwZUVkZ2VFZGl0YXRpb246IEN5dG9zY2FwZUVkZ2VFZGl0YXRpb247CisKK2RlY2xhcmUgZnVuY3Rpb24gcmVxdWlyZShuYW1lOnN0cmluZyk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2QzL2QzLmQudHMgYi9jYXRhbG9nLXVpL3R5cGluZ3MvZDMvZDMuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQzMzUxCi0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90eXBpbmdzL2QzL2QzLmQudHMKQEAgLTAsMCArMSwzMzA4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8gVHlwZSBkZWZpbml0aW9ucyBmb3IgZDNKUworLy8gUHJvamVjdDogaHR0cDovL2QzanMub3JnLworLy8gRGVmaW5pdGlvbnMgYnk6IEFsZXggRm9yZCA8aHR0cHM6Ly9naXRodWIuY29tL2d1c3RhdmRlcmRyYWNoZT4sIEJvcmlzIFlhbmtvdiA8aHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292PgorLy8gRGVmaW5pdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9ib3Jpc3lhbmtvdi9EZWZpbml0ZWx5VHlwZWQKKworZGVjbGFyZSBtb2R1bGUgZDMgeworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgRDMuanMuCisgICAgICovCisgICAgZXhwb3J0IHZhciB2ZXJzaW9uOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2VsZWN0b3Igc3RyaW5nLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZyk6IFNlbGVjdGlvbjxhbnk+OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2VsZWN0aW9uIGZyb20gdGhlIGdpdmVuIG5vZGUgcmVmZXJlbmNlLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qobm9kZTogRXZlbnRUYXJnZXQpOiBTZWxlY3Rpb248YW55PjsKKworICAgIC8qKgorICAgICAqIEZpbmQgYWxsIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHNlbGVjdG9yIHN0cmluZy4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gc2VsZWN0QWxsKHNlbGVjdG9yOiBzdHJpbmcpOiBTZWxlY3Rpb248YW55PjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBnaXZlbiBsaXN0IG9mIG5vZGVzLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBzZWxlY3RBbGwobm9kZXM6IEV2ZW50VGFyZ2V0W10pOiBTZWxlY3Rpb248YW55PjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJvb3Qgc2VsZWN0aW9uIChhcyBpZiBieSBkMy5zZWxlY3QoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgZm9yICdpbnN0YW5jZW9mJyB0ZXN0cywgYW5kIGV4dGVuZGluZyBpdHMgcHJvdG90eXBlIHdpbGwgYWRkIHByb3BlcnRpZXMgdG8gYWxsIHNlbGVjdGlvbnMuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdGlvbigpOiBTZWxlY3Rpb248YW55PjsKKworICAgIG1vZHVsZSBzZWxlY3Rpb24geworICAgICAgICBleHBvcnQgdmFyIHByb3RvdHlwZTogU2VsZWN0aW9uPGFueT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbGVjdGlvbnMgYXJlIGdyb3VwZWQgaW50byBhcnJheXMgb2Ygbm9kZXMsIHdpdGggdGhlIHBhcmVudCB0cmFja2VkIGluIHRoZSAncGFyZW50Tm9kZScgcHJvcGVydHkuCisgICAgICAgICAqLworICAgICAgICBpbnRlcmZhY2UgR3JvdXAgZXh0ZW5kcyBBcnJheTxFdmVudFRhcmdldD4geworICAgICAgICAgICAgcGFyZW50Tm9kZTogRXZlbnRUYXJnZXQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgVXBkYXRlPERhdHVtPiB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHJpZXZlIGEgZ3JvdXBlZCBzZWxlY3Rpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFtpbmRleDogbnVtYmVyXTogR3JvdXA7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIG51bWJlciBvZiBncm91cHMgaW4gdGhpcyBzZWxlY3Rpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxlbmd0aDogbnVtYmVyOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGZvciB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBxdWVyeS4gTWF5IGJlIHByZWZpeGVkIChzZWUgZDMubnMucHJlZml4KS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXR0cihuYW1lOiBzdHJpbmcpOiBzdHJpbmc7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRm9yIGFsbCBub2Rlcywgc2V0IHRoZSBhdHRyaWJ1dGUgdG8gdGhlIHNwZWNpZmllZCBjb25zdGFudCB2YWx1ZS4gVXNlIG51bGwgdG8gcmVtb3ZlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZSwgb3B0aW9uYWxseSBwcmVmaXhlZC4KKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlIHRvIHVzZS4gTm90ZSB0aGF0IHRoaXMgaXMgY29lcmNlZCB0byBhIHN0cmluZyBhdXRvbWF0aWNhbGx5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhdHRyKG5hbWU6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRGVyaXZlIGFuIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24gYmFzZWQgb24gYm91bmQgZGF0YS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgYXR0cmlidXRlIG5hbWUsIG9wdGlvbmFsbHkgcHJlZml4ZWQuCisgICAgICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZ1bmN0aW9uIG9mIHRoZSBkYXR1bSAodGhlIGJvdW5kIGRhdGEgaXRlbSkgYW5kIGluZGV4ICh0aGUgcG9zaXRpb24gaW4gdGhlIHN1Ymdyb3VwaW5nKSB3aGljaCBjb21wdXRlcyB0aGUgYXR0cmlidXRlIHZhbHVlLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxsLCB0aGUgYXR0cmlidXRlIGlzIHJlbW92ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGF0dHIobmFtZTogc3RyaW5nLCB2YWx1ZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gUHJpbWl0aXZlKTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXQgbXVsdGlwbGUgcHJvcGVydGllcyBhdCBvbmNlIHVzaW5nIGFuIE9iamVjdC4gRDMgaXRlcmF0ZXMgb3ZlciBhbGwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCBlaXRoZXIgc2V0cyBvciBjb21wdXRlcyB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgYmFzZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIE9iamVjdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gb2JqIEEga2V5LXZhbHVlIG1hcHBpbmcgY29ycmVzcG9uZGluZyB0byBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHNpbXBsZSBzdHJpbmcgb3IgbnVtYmVyLCBpdCBpcyB0YWtlbiBhcyBhIGNvbnN0YW50LiBPdGhlcndpc2UsIGl0IGlzIGEgZnVuY3Rpb24gdGhhdCBkZXJpdmVzIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGF0dHIob2JqOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB8ICgoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBQcmltaXRpdmUpIH0pOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGlzIHNlbGVjdGlvbiBoYXMgdGhlIGdpdmVuIGNsYXNzIGxpc3QuIElmIG11bHRpcGxlIGNsYXNzZXMgYXJlIHNwZWNpZmllZCAoaS5lLiwgImZvbyBiYXIiKSwgdGhlbiByZXR1cm5zIHRydWUgb25seSBpZiBhbGwgY2xhc3NlcyBtYXRjaC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgY2xhc3MgbGlzdCB0byBxdWVyeS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2xhc3NlZChuYW1lOiBzdHJpbmcpOiBib29sZWFuOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEFkZHMgKG9yIHJlbW92ZXMpIHRoZSBnaXZlbiBjbGFzcyBsaXN0LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBjbGFzcyBsaXN0IHRvIHRvZ2dsZS4gU3BhY2VzIHNlcGFyYXRlIGNsYXNzIG5hbWVzOiAiZm9vIGJhciIgaXMgYSBsaXN0IG9mIHR3byBjbGFzc2VzLgorICAgICAgICAgICAgICogQHBhcmFtIHZhbHVlIElmIHRydWUsIGFkZCB0aGUgY2xhc3Nlcy4gSWYgZmFsc2UsIHJlbW92ZSB0aGVtLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjbGFzc2VkKG5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gY2xhc3MgbGlzdCBzaG91bGQgYmUgdG9nZ2xlZCBmb3IgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIGNsYXNzIGxpc3QuIFNwYWNlcyBzZXBhcmF0ZSBtdWx0aXBsZSBjbGFzcyBuYW1lcy4KKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZnVuY3Rpb24gdG8gcnVuIGZvciBlYWNoIG5vZGUuIFNob3VsZCByZXR1cm4gdHJ1ZSB0byBhZGQgdGhlIGNsYXNzIHRvIHRoZSBub2RlLCBvciBmYWxzZSB0byByZW1vdmUgaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNsYXNzZWQobmFtZTogc3RyaW5nLCB2YWx1ZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2V0IG9yIGRlcml2ZSBjbGFzc2VzIGZvciBtdWx0aXBsZSBjbGFzcyBsaXN0cyBhdCBvbmNlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSBvYmogQW4gT2JqZWN0IG1hcHBpbmcgY2xhc3MgbGlzdHMgdG8gdmFsdWVzIHRoYXQgYXJlIGVpdGhlciBwbGFpbiBib29sZWFucyBvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYm9vbGVhbnMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNsYXNzZWQob2JqOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfCAoKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbikgfSk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmV0cmlldmUgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIENTUyBwcm9wZXJ0eSBuYW1lIHRvIHF1ZXJ5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0eWxlKG5hbWU6IHN0cmluZyk6IHN0cmluZzsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXQgYSBzdHlsZSBwcm9wZXJ0eSBmb3IgYWxsIG5vZGVzIGluIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgQ1NTIHByb3BlcnR5IG5hbWUKKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAgICAgICAgICAqIEBwYXJhbSBwcmlvcml0eSBpZiBzcGVjaWZpZWQsIGVpdGhlciBudWxsIG9yIHRoZSBzdHJpbmcgImltcG9ydGFudCIgKG5vIGV4Y2xhbWF0aW9uIG1hcmspCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0eWxlKG5hbWU6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSwgcHJpb3JpdHk/OiBzdHJpbmcpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIERlcml2ZSBhIHByb3BlcnR5IHZhbHVlIGZvciBlYWNoIG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBDU1MgcHJvcGVydHkgbmFtZQorICAgICAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBmdW5jdGlvbiB0byBkZXJpdmUgdGhlIHZhbHVlCisgICAgICAgICAgICAgKiBAcGFyYW0gcHJpb3JpdHkgaWYgc3BlY2lmaWVkLCBlaXRoZXIgbnVsbCBvciB0aGUgc3RyaW5nICJpbXBvcnRhbnQiIChubyBleGNsYW1hdGlvbiBtYXJrKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdHlsZShuYW1lOiBzdHJpbmcsIHZhbHVlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBQcmltaXRpdmUsIHByaW9yaXR5Pzogc3RyaW5nKTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXQgYSBsYXJnZSBudW1iZXIgb2YgQ1NTIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3QuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIG9iaiBhbiBPYmplY3Qgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIENTUyBwcm9wZXJ0eSBuYW1lcyBhbmQgdmFsdWVzIGFyZSBlaXRoZXIgY29uc3RhbnRzIG9yIGZ1bmN0aW9ucyB0aGF0IGRlcml2ZSBwcm9wZXJ0eSB2YWx1ZXMKKyAgICAgICAgICAgICAqIEBwYXJhbSBwcmlvcml0eSBpZiBzcGVjaWZpZWQsIGVpdGhlciBudWxsIG9yIHRoZSBzdHJpbmcgImltcG9ydGFudCIgKG5vIGV4Y2xhbWF0aW9uIG1hcmspCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0eWxlKG9iajogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmUgfCAoKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gUHJpbWl0aXZlKSB9LCBwcmlvcml0eT86IHN0cmluZyk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmV0cmlldmUgYW4gYXJiaXRyYXJ5IG5vZGUgcHJvcGVydHkgc3VjaCBhcyB0aGUgJ2NoZWNrZWQnIHByb3BlcnR5IG9mIGNoZWNrYm94ZXMsIG9yIHRoZSAndmFsdWUnIG9mIHRleHQgYm94ZXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5vZGUncyBwcm9wZXJ0eSB0byByZXRyaWV2ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwcm9wZXJ0eShuYW1lOiBzdHJpbmcpOiBhbnk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRm9yIGVhY2ggbm9kZSwgc2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZS4gSW50ZXJuYWxseSwgdGhpcyBzZXRzIHRoZSBub2RlIHByb3BlcnR5IGRpcmVjdGx5IChlLmcuLCBub2RlW25hbWVdID0gdmFsdWUpLCBzbyB0YWtlIGNhcmUgbm90IHRvIG11dGF0ZSBzcGVjaWFsIHByb3BlcnRpZXMgbGlrZSBfX3Byb3RvX18uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWUKKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBGb3IgZWFjaCBub2RlLCBkZXJpdmUgdGhlIHByb3BlcnR5IHZhbHVlLiBJbnRlcm5hbGx5LCB0aGlzIHNldHMgdGhlIG5vZGUgcHJvcGVydHkgZGlyZWN0bHkgKGUuZy4sIG5vZGVbbmFtZV0gPSB2YWx1ZSksIHNvIHRha2UgY2FyZSBub3QgdG8gbXV0YXRlIHNwZWNpYWwgcHJvcGVydGllcyBsaWtlIF9fcHJvdG9fXy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZQorICAgICAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGRlcml2ZSB0aGUgcHJvcGVydHkncyB2YWx1ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwcm9wZXJ0eShuYW1lOiBzdHJpbmcsIHZhbHVlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBhbnkpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNldCBtdWx0aXBsZSBub2RlIHByb3BlcnRpZXMuIENhdmVhdHMgYXBwbHk6IHRha2UgY2FyZSBub3QgdG8gbXV0YXRlIHNwZWNpYWwgcHJvcGVydGllcyBsaWtlIF9fcHJvdG9fXy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gb2JqIGFuIE9iamVjdCB3aG9zZSBrZXlzIGNvcnJlc3BvbmQgdG8gbm9kZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgYXJlIGVpdGhlciBjb25zdGFudHMgb3IgZnVuY3Rpb25zIHRoYXQgd2lsbCBjb21wdXRlIGEgdmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByb3BlcnR5KG9iajogeyBba2V5OiBzdHJpbmddOiBhbnkgfCAoKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gYW55KSB9KTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgdGV4dENvbnRlbnQgb2YgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGV4dCgpOiBzdHJpbmc7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2V0IHRoZSB0ZXh0Q29udGVudCBvZiBlYWNoIG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdGV4dCB0byB1c2UgZm9yIGFsbCBub2RlcworICAgICAgICAgICAgICovCisgICAgICAgICAgICB0ZXh0KHZhbHVlOiBQcmltaXRpdmUpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvbXB1dGUgdGhlIHRleHRDb250ZW50IG9mIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBmdW5jdGlvbiB3aGljaCB3aWxsIGNvbXB1dGUgdGhlIHRleHQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGV4dCh2YWx1ZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gUHJpbWl0aXZlKTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgSFRNTCBjb250ZW50IG9mIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZWxlY3Rpb24uIFVzZXMgJ2lubmVySFRNTCcgaW50ZXJuYWxseSBhbmQgd2lsbCBub3Qgd29yayB3aXRoIFNWRyBvciBvdGhlciBlbGVtZW50cyB3aXRob3V0IGEgcG9seWZpbGwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGh0bWwoKTogc3RyaW5nOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNldCB0aGUgSFRNTCBjb250ZW50IG9mIGV2ZXJ5IG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4gVXNlcyAnaW5uZXJIVE1MJyBpbnRlcm5hbGx5IGFuZCB0aHVzIHdpbGwgbm90IHdvcmsgd2l0aCBTVkcgb3Igb3RoZXIgZWxlbWVudHMgd2l0aG91dCBhIHBvbHlmaWxsLgorICAgICAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBIVE1MIGNvbnRlbnQgdG8gdXNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBodG1sKHZhbHVlOiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvbXB1dGUgdGhlIEhUTUwgY29udGVudCBmb3IgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24uIFVzZXMgJ2lubmVySFRNTCcgaW50ZXJuYWxseSBhbmQgdGh1cyB3aWxsIG5vdCB3b3JrIHdpdGggU1ZHIG9yIG90aGVyIGVsZW1lbnRzIHdpdGhvdXQgYSBwb2x5ZmlsbC4KKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZnVuY3Rpb24gdG8gY29tcHV0ZSBIVE1MIGNvbnRlbnQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaHRtbCh2YWx1ZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBcHBlbmRzIGEgbmV3IGNoaWxkIHRvIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLiBUaGlzIGNoaWxkIHdpbGwgaW5oZXJpdCB0aGUgcGFyZW50J3MgZGF0YSAoaWYgYXZhaWxhYmxlKS4gUmV0dXJucyBhIGZyZXNoIHNlbGVjdGlvbiBjb25zaXN0aW5nIG9mIHRoZSBuZXdseS1hcHBlbmRlZCBjaGlsZHJlbi4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZWxlbWVudCBuYW1lIHRvIGFwcGVuZC4gTWF5IGJlIHByZWZpeGVkIChzZWUgZDMubnMucHJlZml4KS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXBwZW5kKG5hbWU6IHN0cmluZyk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQXBwZW5kcyBhIG5ldyBjaGlsZCB0byBlYWNoIG5vZGUgaW4gdGhlIHNlbGVjdGlvbiBieSBjb21wdXRpbmcgYSBuZXcgbm9kZS4gVGhpcyBjaGlsZCB3aWxsIGluaGVyaXQgdGhlIHBhcmVudCdzIGRhdGEgKGlmIGF2YWlsYWJsZSkuIFJldHVybnMgYSBmcmVzaCBzZWxlY3Rpb24gY29uc2lzdGluZyBvZiB0aGUgbmV3bHktYXBwZW5kZWQgY2hpbGRyZW4uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSBuZXcgZWxlbWVudAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhcHBlbmQobmFtZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gRXZlbnRUYXJnZXQpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEluc2VydHMgYSBuZXcgY2hpbGQgdG8gZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24uIFRoaXMgY2hpbGQgd2lsbCBpbmhlcml0IGl0cyBwYXJlbnQncyBkYXRhIChpZiBhdmFpbGFibGUpLiBSZXR1cm5zIGEgZnJlc2ggc2VsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlIG5ld2x5LWluc2VydGVkIGNoaWxkcmVuLgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmFtZSB0byBhcHBlbmQuIE1heSBiZSBwcmVmaXhlZCAoc2VlIGQzLm5zLnByZWZpeCkuCisgICAgICAgICAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSBzZWxlY3RvciB0byBkZXRlcm1pbmUgcG9zaXRpb24gKGUuZy4sICI6Zmlyc3QtY2hpbGQiKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnNlcnQobmFtZTogc3RyaW5nLCBiZWZvcmU6IHN0cmluZyk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogSW5zZXJ0cyBhIG5ldyBjaGlsZCB0byBlYWNoIG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4gVGhpcyBjaGlsZCB3aWxsIGluaGVyaXQgaXRzIHBhcmVudCdzIGRhdGEgKGlmIGF2YWlsYWJsZSkuIFJldHVybnMgYSBmcmVzaCBzZWxlY3Rpb24gY29uc2lzdGluZyBvZiB0aGUgbmV3bHktaW5zZXJ0ZWQgY2hpbGRyZW4uCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZWxlbWVudCBuYW1lIHRvIGFwcGVuZC4gTWF5IGJlIHByZWZpeGVkIChzZWUgZDMubnMucHJlZml4KS4KKyAgICAgICAgICAgICAqIEBwYXJhbSBiZWZvcmUgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZSBuZXh0IHNpYmxpbmcKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5zZXJ0KG5hbWU6IHN0cmluZywgYmVmb3JlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBFdmVudFRhcmdldCk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogSW5zZXJ0cyBhIG5ldyBjaGlsZCB0byB0aGUgZW5kIG9mIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uIGJ5IGNvbXB1dGluZyBhIG5ldyBub2RlLiBUaGlzIGNoaWxkIHdpbGwgaW5oZXJpdCBpdHMgcGFyZW50J3MgZGF0YSAoaWYgYXZhaWxhYmxlKS4gUmV0dXJucyBhIGZyZXNoIHNlbGVjdGlvbiBjb25zaXN0aW5nIG9mIHRoZSBuZXdseS1pbnNlcnRlZCBjaGlsZHJlbi4KKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgbmV3IGNoaWxkCisgICAgICAgICAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSBzZWxlY3RvciB0byBkZXRlcm1pbmUgcG9zaXRpb24gKGUuZy4sICI6Zmlyc3QtY2hpbGQiKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnNlcnQobmFtZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gRXZlbnRUYXJnZXQsIGJlZm9yZTogc3RyaW5nKTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJbnNlcnRzIGEgbmV3IGNoaWxkIHRvIHRoZSBlbmQgb2YgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24gYnkgY29tcHV0aW5nIGEgbmV3IG5vZGUuIFRoaXMgY2hpbGQgd2lsbCBpbmhlcml0IGl0cyBwYXJlbnQncyBkYXRhIChpZiBhdmFpbGFibGUpLiBSZXR1cm5zIGEgZnJlc2ggc2VsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlIG5ld2x5LWluc2VydGVkIGNoaWxkcmVuLgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSBuZXcgY2hpbGQKKyAgICAgICAgICAgICAqIEBwYXJhbSBiZWZvcmUgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZSBuZXh0IHNpYmxpbmcKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5zZXJ0KG5hbWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0LCBiZWZvcmU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0KTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBET00uIFRoZXkgYXJlIGluIGEgZGV0YWNoZWQgc3RhdGUgYW5kIG1heSBiZSByZS1hZGRlZCAodGhvdWdoIHRoZXJlIGlzIGN1cnJlbnRseSBubyBkZWRpY2F0ZWQgQVBJIGZvciBkb2luZyBzbykuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlbW92ZSgpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHJpZXZlcyB0aGUgZGF0YSBib3VuZCB0byB0aGUgZmlyc3QgZ3JvdXAgaW4gdGhpcyBzZWxlY3Rpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRhdGEoKTogRGF0dW1bXTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBCaW5kcyBkYXRhIHRvIHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAgICAgICogQHBhcmFtIGRhdGEgdGhlIGFycmF5IG9mIGRhdGEgdG8gYmluZCB0byB0aGlzIHNlbGVjdGlvbgorICAgICAgICAgICAgICogQHBhcmFtIGtleSB0aGUgb3B0aW9uYWwgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSB1bmlxdWUga2V5IGZvciBlYWNoIHBpZWNlIG9mIGRhdGEuIFdoZW4gdW5zcGVjaWZpZWQsIHVzZXMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkYXRhPE5ld0RhdHVtPihkYXRhOiBOZXdEYXR1bVtdLCBrZXk/OiAoZGF0dW06IE5ld0RhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBzdHJpbmcpOiBVcGRhdGU8TmV3RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIERlcml2ZXMgZGF0YSB0byBiaW5kIHRvIHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAgICAgICogQHBhcmFtIGRhdGEgdGhlIGZ1bmN0aW9uIHRvIGRlcml2ZSBkYXRhLiBNdXN0IHJldHVybiBhbiBhcnJheS4KKyAgICAgICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgdW5pcXVlIGtleSBmb3IgZWFjaCBkYXRhIGl0ZW0uIFdoZW4gdW5zcGVjaWZpZWQsIHVzZXMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkYXRhPE5ld0RhdHVtPihkYXRhOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBOZXdEYXR1bVtdLCBrZXk/OiAoZGF0dW06IE5ld0RhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBzdHJpbmcpOiBVcGRhdGU8TmV3RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEZpbHRlcnMgdGhlIHNlbGVjdGlvbiwgcmV0dXJuaW5nIG9ubHkgdGhvc2Ugbm9kZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gQ1NTIHNlbGVjdG9yLgorICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBDU1Mgc2VsZWN0b3IKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmlsdGVyKHNlbGVjdG9yOiBzdHJpbmcpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEZpbHRlcnMgdGhlIHNlbGVjdGlvbiwgcmV0dXJuaW5nIG9ubHkgdGhvc2Ugbm9kZXMgZm9yIHdoaWNoIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5lZCB0cnVlLgorICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBmaWx0ZXIgZnVuY3Rpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmlsdGVyKHNlbGVjdG9yOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZXR1cm4gdGhlIGRhdGEgaXRlbSBib3VuZCB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkYXR1bSgpOiBEYXR1bTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXQgdGhlIGRhdGEgaXRlbSBmb3IgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNvbnN0YW50IGVsZW1lbnQgdG8gdXNlIGZvciBlYWNoIG5vZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGF0dW08TmV3RGF0dW0+KHZhbHVlOiBOZXdEYXR1bSk6IFVwZGF0ZTxOZXdEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRGVyaXZlIHRoZSBkYXRhIGl0ZW0gZm9yIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLiBVc2VmdWwgZm9yIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGUgSFRNTDUgJ2RhdGFzZXQnIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZnVuY3Rpb24gdG8gY29tcHV0ZSBkYXRhIGZvciBlYWNoIG5vZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGF0dW08TmV3RGF0dW0+KHZhbHVlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBOZXdEYXR1bSk6IFVwZGF0ZTxOZXdEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmVvcmRlcnMgbm9kZXMgaW4gdGhlIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gY29tcGFyYXRvci4gTm9kZXMgYXJlIHJlLWluc2VydGVkIGludG8gdGhlIGRvY3VtZW50IG9uY2Ugc29ydGVkLgorICAgICAgICAgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24sIHdoaWNoIGRlZmF1bHRzIHRvIGQzLmFzY2VuZGluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBzb3J0KGNvbXBhcmF0b3I/OiAoYTogRGF0dW0sIGI6IERhdHVtKSA9PiBudW1iZXIpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJlb3JkZXJzIG5vZGVzIGluIHRoZSBkb2N1bWVudCB0byBtYXRjaCB0aGUgc2VsZWN0aW9uIG9yZGVyLiBNb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgc29ydCgpIGlmIHRoZSBzZWxlY3Rpb24gaXMgYWxyZWFkeSBvcmRlcmVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBvcmRlcigpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIChpZiBhbnkpIGZvciB0aGUgZ2l2ZW4gZXZlbnQuCisgICAgICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBldmVudCB0byBsb2FkIHRoZSBsaXN0ZW5lciBmb3IuIE1heSBoYXZlIGEgbmFtZXNwYWNlIChlLmcuLCAiLmZvbyIpIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG9uKHR5cGU6IHN0cmluZyk6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IGFueTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuIElmIG9uZSB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLCBpdCBpcyByZW1vdmVkIGJlZm9yZSB0aGUgbmV3IGxpc3RlbmVyIGlzIGFkZGVkLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpcyBpZ25vcmVkLgorICAgICAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIG9mIGV2ZW50IHRvIGxpc3RlbiB0by4gTWF5IGhhdmUgYSBuYW1lc3BhY2UgKGUuZy4sICIuZm9vIikgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhbiBldmVudCBsaXN0ZW5lciBmdW5jdGlvbiwgb3IgbnVsbCB0byB1bnJlZ2lzdGVyCisgICAgICAgICAgICAgKiBAcGFyYW0gY2FwdHVyZSBzZXRzIHRoZSBET00gdXNlQ2FwdHVyZSBmbGFnCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG9uKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IGFueSwgY2FwdHVyZT86IGJvb2xlYW4pOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEJlZ2lucyBhIG5ldyB0cmFuc2l0aW9uLiBJbnRlcnJ1cHRzIGFueSBhY3RpdmUgdHJhbnNpdGlvbnMgb2YgdGhlIHNhbWUgbmFtZS4KKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSB0cmFuc2l0aW9uIG5hbWUgKGRlZmF1bHRzIHRvICIiKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0cmFuc2l0aW9uKG5hbWU/OiBzdHJpbmcpOiBUcmFuc2l0aW9uPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJbnRlcnJ1cHRzIHRoZSBhY3RpdmUgdHJhbnNpdGlvbiBvZiB0aGUgcHJvdmlkZWQgbmFtZS4gRG9lcyBub3QgY2FuY2VsIHNjaGVkdWxlZCB0cmFuc2l0aW9ucy4KKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSB0cmFuc2l0aW9uIG5hbWUgKGRlZmF1bHRzIHRvICIiKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnRlcnJ1cHQobmFtZT86IHN0cmluZyk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlcyBhIHN1YnNlbGVjdGlvbiBieSBmaW5kaW5nIHRoZSBmaXJzdCBkZXNjZW5kZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvciBzdHJpbmcuIEJvdW5kIGRhdGEgaXMgaW5oZXJpdGVkLgorICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBDU1Mgc2VsZWN0b3IgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZyk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlcyBhIHN1YnNlbGVjdGlvbiBieSB1c2luZyBhIGZ1bmN0aW9uIHRvIGZpbmQgZGVzY2VuZGVudCBlbGVtZW50cy4gQm91bmQgZGF0YSBpcyBpbmhlcml0ZWQuCisgICAgICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIGZ1bmN0aW9uIHRvIGZpbmQgbWF0Y2hpbmcgZGVzY2VuZGFudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2VsZWN0KHNlbGVjdG9yOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBFdmVudFRhcmdldCk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlcyBhIHN1YnNlbGVjdGlvbiBieSBmaW5kaW5nIGFsbCBkZXNjZW5kZW50cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBzZWxlY3Rvci4gQm91bmQgZGF0YSBpcyBub3QgaW5oZXJpdGVkLgorICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBDU1Mgc2VsZWN0b3IgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZWxlY3RBbGwoc2VsZWN0b3I6IHN0cmluZyk6IFVwZGF0ZTxEYXR1bT47CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlcyBhIHN1YnNlbGVjdGlvbiBieSB1c2luZyBhIGZ1bmN0aW9uIHRvIGZpbmQgZGVzY2VuZGVudCBlbGVtZW50cy4gQm91bmQgZGF0YSBpcyBub3QgaW5oZXJpdGVkLgorICAgICAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBmdW5jdGlvbiB0byBmaW5kIG1hdGNoaW5nIGRlc2NlbmRlbnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNlbGVjdEFsbChzZWxlY3RvcjogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gQXJyYXk8RXZlbnRUYXJnZXQ+IHwgTm9kZUxpc3QpOiBVcGRhdGU8YW55PjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJbnZva2UgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaXMgaWdub3JlZC4KKyAgICAgICAgICAgICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB0byBpbnZva2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZWFjaChmdW5jOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBhbnkpOiBVcGRhdGU8RGF0dW0+OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENhbGwgYSBmdW5jdGlvbiBvbiB0aGUgc2VsZWN0aW9uLiBzZWwuY2FsbChmb28pIGlzIGVxdWl2YWxlbnQgdG8gZm9vKHNlbCkuCisgICAgICAgICAgICAgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24gdG8gY2FsbCBvbiB0aGUgc2VsZWN0aW9uCisgICAgICAgICAgICAgKiBAcGFyYW0gYXJncyBhbnkgb3B0aW9uYWwgYXJncworICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYWxsKGZ1bmM6IChzZWw6IFVwZGF0ZTxEYXR1bT4sIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIC4uLmFyZ3M6IGFueVtdKTogVXBkYXRlPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGVtcHR5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBlbXB0eSgpOiBib29sZWFuOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IG5vbi1udWxsIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGlvbiwgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG5vZGUoKTogRXZlbnRUYXJnZXQ7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNpemUoKTogbnVtYmVyOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIG5vZGVzIGZvciBlYWNoIGRhdGEgZWxlbWVudCBmb3Igd2hpY2ggbm8gY29ycmVzcG9uZGluZyBET00gZWxlbWVudCB3YXMgZm91bmQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVudGVyKCk6IEVudGVyPERhdHVtPjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBSZXR1cm5zIGEgc2VsZWN0aW9uIGZvciB0aG9zZSBET00gbm9kZXMgZm9yIHdoaWNoIG5vIG5ldyBkYXRhIGVsZW1lbnQgd2FzIGZvdW5kLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBleGl0KCk6IFNlbGVjdGlvbjxEYXR1bT47CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgRW50ZXI8RGF0dW0+IHsKKyAgICAgICAgICAgIGFwcGVuZChuYW1lOiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworICAgICAgICAgICAgYXBwZW5kKG5hbWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0KTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAgICAgaW5zZXJ0KG5hbWU6IHN0cmluZywgYmVmb3JlPzogc3RyaW5nKTogU2VsZWN0aW9uPERhdHVtPjsKKyAgICAgICAgICAgIGluc2VydChuYW1lOiBzdHJpbmcsIGJlZm9yZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gRXZlbnRUYXJnZXQpOiBTZWxlY3Rpb248RGF0dW0+OworICAgICAgICAgICAgaW5zZXJ0KG5hbWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0LCBiZWZvcmU/OiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworICAgICAgICAgICAgaW5zZXJ0KG5hbWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0LCBiZWZvcmU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0KTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAgICAgc2VsZWN0KG5hbWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0KTogU2VsZWN0aW9uPERhdHVtPjsKKyAgICAgICAgICAgIGNhbGwoZnVuYzogKHNlbGVjdGlvbjogRW50ZXI8RGF0dW0+LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55LCAuLi5hcmdzOiBhbnlbXSk6IEVudGVyPERhdHVtPjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkbWluaXN0cml2aWE6IEphdmFTY3JpcHQgcHJpbWl0aXZlIHR5cGVzLCBvciAidGhpbmdzIHRoYXQgdG9TdHJpbmcoKSBwcmVkaWN0YWJseSIuCisgICAgICovCisgICAgZXhwb3J0IHR5cGUgUHJpbWl0aXZlID0gbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbjsKKworICAgIC8qKgorICAgICAqIEFkbWluaXN0cml2aWE6IGFueXRoaW5nIHdpdGggYSB2YWx1ZU9mKCk6IG51bWJlciBtZXRob2QgaXMgY29tcGFyYWJsZSwgc28gd2UgYWxsb3cgaXQgaW4gbnVtZXJpYyBvcGVyYXRpb25zCisgICAgICovCisgICAgaW50ZXJmYWNlIE51bWVyaWMgeworICAgICAgICB2YWx1ZU9mKCk6IG51bWJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGdyb3VwZWQgYXJyYXkgb2Ygbm9kZXMuCisgICAgICogQHBhcmFtIERhdHVtIHRoZSBkYXRhIGJvdW5kIHRvIHRoaXMgc2VsZWN0aW9uLgorICAgICAqLworICAgIGludGVyZmFjZSBTZWxlY3Rpb248RGF0dW0+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIGEgZ3JvdXBlZCBzZWxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBbaW5kZXg6IG51bWJlcl06IHNlbGVjdGlvbi5Hcm91cDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBncm91cHMgaW4gdGhpcyBzZWxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBsZW5ndGg6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgZm9yIHRoZSBmaXJzdCBub2RlIGluIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBxdWVyeS4gTWF5IGJlIHByZWZpeGVkIChzZWUgZDMubnMucHJlZml4KS4KKyAgICAgICAgICovCisgICAgICAgIGF0dHIobmFtZTogc3RyaW5nKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgYWxsIG5vZGVzLCBzZXQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IHZhbHVlLiBVc2UgbnVsbCB0byByZW1vdmUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZSwgb3B0aW9uYWxseSBwcmVmaXhlZC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gdXNlLiBOb3RlIHRoYXQgdGhpcyBpcyBjb2VyY2VkIHRvIGEgc3RyaW5nIGF1dG9tYXRpY2FsbHkuCisgICAgICAgICAqLworICAgICAgICBhdHRyKG5hbWU6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlcml2ZSBhbiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uIGJhc2VkIG9uIGJvdW5kIGRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZSwgb3B0aW9uYWxseSBwcmVmaXhlZC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSBmdW5jdGlvbiBvZiB0aGUgZGF0dW0gKHRoZSBib3VuZCBkYXRhIGl0ZW0pIGFuZCBpbmRleCAodGhlIHBvc2l0aW9uIGluIHRoZSBzdWJncm91cGluZykgd2hpY2ggY29tcHV0ZXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCwgdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLgorICAgICAgICAgKi8KKyAgICAgICAgYXR0cihuYW1lOiBzdHJpbmcsIHZhbHVlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBQcmltaXRpdmUpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgbXVsdGlwbGUgcHJvcGVydGllcyBhdCBvbmNlIHVzaW5nIGFuIE9iamVjdC4gRDMgaXRlcmF0ZXMgb3ZlciBhbGwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCBlaXRoZXIgc2V0cyBvciBjb21wdXRlcyB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgYmFzZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIE9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iaiBBIGtleS12YWx1ZSBtYXBwaW5nIGNvcnJlc3BvbmRpbmcgdG8gYXR0cmlidXRlcyBhbmQgdmFsdWVzLiBJZiB0aGUgdmFsdWUgaXMgYSBzaW1wbGUgc3RyaW5nIG9yIG51bWJlciwgaXQgaXMgdGFrZW4gYXMgYSBjb25zdGFudC4gT3RoZXJ3aXNlLCBpdCBpcyBhIGZ1bmN0aW9uIHRoYXQgZGVyaXZlcyB0aGUgYXR0cmlidXRlIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgYXR0cihvYmo6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIHwgKChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IFByaW1pdGl2ZSkgfSk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGlzIHNlbGVjdGlvbiBoYXMgdGhlIGdpdmVuIGNsYXNzIGxpc3QuIElmIG11bHRpcGxlIGNsYXNzZXMgYXJlIHNwZWNpZmllZCAoaS5lLiwgImZvbyBiYXIiKSwgdGhlbiByZXR1cm5zIHRydWUgb25seSBpZiBhbGwgY2xhc3NlcyBtYXRjaC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIGNsYXNzIGxpc3QgdG8gcXVlcnkuCisgICAgICAgICAqLworICAgICAgICBjbGFzc2VkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgKG9yIHJlbW92ZXMpIHRoZSBnaXZlbiBjbGFzcyBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgY2xhc3MgbGlzdCB0byB0b2dnbGUuIFNwYWNlcyBzZXBhcmF0ZSBjbGFzcyBuYW1lczogImZvbyBiYXIiIGlzIGEgbGlzdCBvZiB0d28gY2xhc3Nlcy4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIElmIHRydWUsIGFkZCB0aGUgY2xhc3Nlcy4gSWYgZmFsc2UsIHJlbW92ZSB0aGVtLgorICAgICAgICAgKi8KKyAgICAgICAgY2xhc3NlZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBjbGFzcyBsaXN0IHNob3VsZCBiZSB0b2dnbGVkIGZvciBlYWNoIG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIGNsYXNzIGxpc3QuIFNwYWNlcyBzZXBhcmF0ZSBtdWx0aXBsZSBjbGFzcyBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSBmdW5jdGlvbiB0byBydW4gZm9yIGVhY2ggbm9kZS4gU2hvdWxkIHJldHVybiB0cnVlIHRvIGFkZCB0aGUgY2xhc3MgdG8gdGhlIG5vZGUsIG9yIGZhbHNlIHRvIHJlbW92ZSBpdC4KKyAgICAgICAgICovCisgICAgICAgIGNsYXNzZWQobmFtZTogc3RyaW5nLCB2YWx1ZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBvciBkZXJpdmUgY2xhc3NlcyBmb3IgbXVsdGlwbGUgY2xhc3MgbGlzdHMgYXQgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iaiBBbiBPYmplY3QgbWFwcGluZyBjbGFzcyBsaXN0cyB0byB2YWx1ZXMgdGhhdCBhcmUgZWl0aGVyIHBsYWluIGJvb2xlYW5zIG9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBib29sZWFucy4KKyAgICAgICAgICovCisgICAgICAgIGNsYXNzZWQob2JqOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfCAoKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbikgfSk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSBjb21wdXRlZCBzdHlsZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIENTUyBwcm9wZXJ0eSBuYW1lIHRvIHF1ZXJ5CisgICAgICAgICAqLworICAgICAgICBzdHlsZShuYW1lOiBzdHJpbmcpOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHN0eWxlIHByb3BlcnR5IGZvciBhbGwgbm9kZXMgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIENTUyBwcm9wZXJ0eSBuYW1lCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAgICAgICogQHBhcmFtIHByaW9yaXR5IGlmIHNwZWNpZmllZCwgZWl0aGVyIG51bGwgb3IgdGhlIHN0cmluZyAiaW1wb3J0YW50IiAobm8gZXhjbGFtYXRpb24gbWFyaykKKyAgICAgICAgICovCisgICAgICAgIHN0eWxlKG5hbWU6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSwgcHJpb3JpdHk/OiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXJpdmUgYSBwcm9wZXJ0eSB2YWx1ZSBmb3IgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBDU1MgcHJvcGVydHkgbmFtZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZ1bmN0aW9uIHRvIGRlcml2ZSB0aGUgdmFsdWUKKyAgICAgICAgICogQHBhcmFtIHByaW9yaXR5IGlmIHNwZWNpZmllZCwgZWl0aGVyIG51bGwgb3IgdGhlIHN0cmluZyAiaW1wb3J0YW50IiAobm8gZXhjbGFtYXRpb24gbWFyaykKKyAgICAgICAgICovCisgICAgICAgIHN0eWxlKG5hbWU6IHN0cmluZywgdmFsdWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IFByaW1pdGl2ZSwgcHJpb3JpdHk/OiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgYSBsYXJnZSBudW1iZXIgb2YgQ1NTIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmogYW4gT2JqZWN0IHdob3NlIGtleXMgY29ycmVzcG9uZCB0byBDU1MgcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBhcmUgZWl0aGVyIGNvbnN0YW50cyBvciBmdW5jdGlvbnMgdGhhdCBkZXJpdmUgcHJvcGVydHkgdmFsdWVzCisgICAgICAgICAqIEBwYXJhbSBwcmlvcml0eSBpZiBzcGVjaWZpZWQsIGVpdGhlciBudWxsIG9yIHRoZSBzdHJpbmcgImltcG9ydGFudCIgKG5vIGV4Y2xhbWF0aW9uIG1hcmspCisgICAgICAgICAqLworICAgICAgICBzdHlsZShvYmo6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIHwgKChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IFByaW1pdGl2ZSkgfSwgcHJpb3JpdHk/OiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSBhbiBhcmJpdHJhcnkgbm9kZSBwcm9wZXJ0eSBzdWNoIGFzIHRoZSAnY2hlY2tlZCcgcHJvcGVydHkgb2YgY2hlY2tib3hlcywgb3IgdGhlICd2YWx1ZScgb2YgdGV4dCBib3hlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5vZGUncyBwcm9wZXJ0eSB0byByZXRyaWV2ZQorICAgICAgICAgKi8KKyAgICAgICAgcHJvcGVydHkobmFtZTogc3RyaW5nKTogYW55OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgZWFjaCBub2RlLCBzZXQgdGhlIHByb3BlcnR5IHZhbHVlLiBJbnRlcm5hbGx5LCB0aGlzIHNldHMgdGhlIG5vZGUgcHJvcGVydHkgZGlyZWN0bHkgKGUuZy4sIG5vZGVbbmFtZV0gPSB2YWx1ZSksIHNvIHRha2UgY2FyZSBub3QgdG8gbXV0YXRlIHNwZWNpYWwgcHJvcGVydGllcyBsaWtlIF9fcHJvdG9fXy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWUKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIGVhY2ggbm9kZSwgZGVyaXZlIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gSW50ZXJuYWxseSwgdGhpcyBzZXRzIHRoZSBub2RlIHByb3BlcnR5IGRpcmVjdGx5IChlLmcuLCBub2RlW25hbWVdID0gdmFsdWUpLCBzbyB0YWtlIGNhcmUgbm90IHRvIG11dGF0ZSBzcGVjaWFsIHByb3BlcnRpZXMgbGlrZSBfX3Byb3RvX18uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXJpdmUgdGhlIHByb3BlcnR5J3MgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IGFueSk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBtdWx0aXBsZSBub2RlIHByb3BlcnRpZXMuIENhdmVhdHMgYXBwbHk6IHRha2UgY2FyZSBub3QgdG8gbXV0YXRlIHNwZWNpYWwgcHJvcGVydGllcyBsaWtlIF9fcHJvdG9fXy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iaiBhbiBPYmplY3Qgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIG5vZGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIGFyZSBlaXRoZXIgY29uc3RhbnRzIG9yIGZ1bmN0aW9ucyB0aGF0IHdpbGwgY29tcHV0ZSBhIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvcGVydHkob2JqOiB7IFtrZXk6IHN0cmluZ106IGFueSB8ICgoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBhbnkpIH0pOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgdGV4dENvbnRlbnQgb2YgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHRleHQoKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHRleHRDb250ZW50IG9mIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHRleHQgdG8gdXNlIGZvciBhbGwgbm9kZXMKKyAgICAgICAgICovCisgICAgICAgIHRleHQodmFsdWU6IFByaW1pdGl2ZSk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXB1dGUgdGhlIHRleHRDb250ZW50IG9mIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY29tcHV0ZSB0aGUgdGV4dAorICAgICAgICAgKi8KKyAgICAgICAgdGV4dCh2YWx1ZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gUHJpbWl0aXZlKTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIEhUTUwgY29udGVudCBvZiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgc2VsZWN0aW9uLiBVc2VzICdpbm5lckhUTUwnIGludGVybmFsbHkgYW5kIHdpbGwgbm90IHdvcmsgd2l0aCBTVkcgb3Igb3RoZXIgZWxlbWVudHMgd2l0aG91dCBhIHBvbHlmaWxsLgorICAgICAgICAgKi8KKyAgICAgICAgaHRtbCgpOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgSFRNTCBjb250ZW50IG9mIGV2ZXJ5IG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4gVXNlcyAnaW5uZXJIVE1MJyBpbnRlcm5hbGx5IGFuZCB0aHVzIHdpbGwgbm90IHdvcmsgd2l0aCBTVkcgb3Igb3RoZXIgZWxlbWVudHMgd2l0aG91dCBhIHBvbHlmaWxsLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIEhUTUwgY29udGVudCB0byB1c2UuCisgICAgICAgICAqLworICAgICAgICBodG1sKHZhbHVlOiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wdXRlIHRoZSBIVE1MIGNvbnRlbnQgZm9yIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLiBVc2VzICdpbm5lckhUTUwnIGludGVybmFsbHkgYW5kIHRodXMgd2lsbCBub3Qgd29yayB3aXRoIFNWRyBvciBvdGhlciBlbGVtZW50cyB3aXRob3V0IGEgcG9seWZpbGwuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZnVuY3Rpb24gdG8gY29tcHV0ZSBIVE1MIGNvbnRlbnQKKyAgICAgICAgICovCisgICAgICAgIGh0bWwodmFsdWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IHN0cmluZyk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGVuZHMgYSBuZXcgY2hpbGQgdG8gZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24uIFRoaXMgY2hpbGQgd2lsbCBpbmhlcml0IHRoZSBwYXJlbnQncyBkYXRhIChpZiBhdmFpbGFibGUpLiBSZXR1cm5zIGEgZnJlc2ggc2VsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlIG5ld2x5LWFwcGVuZGVkIGNoaWxkcmVuLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZWxlbWVudCBuYW1lIHRvIGFwcGVuZC4gTWF5IGJlIHByZWZpeGVkIChzZWUgZDMubnMucHJlZml4KS4KKyAgICAgICAgICovCisgICAgICAgIGFwcGVuZChuYW1lOiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBlbmRzIGEgbmV3IGNoaWxkIHRvIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uIGJ5IGNvbXB1dGluZyBhIG5ldyBub2RlLiBUaGlzIGNoaWxkIHdpbGwgaW5oZXJpdCB0aGUgcGFyZW50J3MgZGF0YSAoaWYgYXZhaWxhYmxlKS4gUmV0dXJucyBhIGZyZXNoIHNlbGVjdGlvbiBjb25zaXN0aW5nIG9mIHRoZSBuZXdseS1hcHBlbmRlZCBjaGlsZHJlbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSBuZXcgZWxlbWVudAorICAgICAgICAgKi8KKyAgICAgICAgYXBwZW5kKG5hbWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0KTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW5zZXJ0cyBhIG5ldyBjaGlsZCB0byBlYWNoIG5vZGUgaW4gdGhlIHNlbGVjdGlvbi4gVGhpcyBjaGlsZCB3aWxsIGluaGVyaXQgaXRzIHBhcmVudCdzIGRhdGEgKGlmIGF2YWlsYWJsZSkuIFJldHVybnMgYSBmcmVzaCBzZWxlY3Rpb24gY29uc2lzdGluZyBvZiB0aGUgbmV3bHktaW5zZXJ0ZWQgY2hpbGRyZW4uCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBlbGVtZW50IG5hbWUgdG8gYXBwZW5kLiBNYXkgYmUgcHJlZml4ZWQgKHNlZSBkMy5ucy5wcmVmaXgpLgorICAgICAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSBzZWxlY3RvciB0byBkZXRlcm1pbmUgcG9zaXRpb24gKGUuZy4sICI6Zmlyc3QtY2hpbGQiKQorICAgICAgICAgKi8KKyAgICAgICAgaW5zZXJ0KG5hbWU6IHN0cmluZywgYmVmb3JlOiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnNlcnRzIGEgbmV3IGNoaWxkIHRvIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLiBUaGlzIGNoaWxkIHdpbGwgaW5oZXJpdCBpdHMgcGFyZW50J3MgZGF0YSAoaWYgYXZhaWxhYmxlKS4gUmV0dXJucyBhIGZyZXNoIHNlbGVjdGlvbiBjb25zaXN0aW5nIG9mIHRoZSBuZXdseS1pbnNlcnRlZCBjaGlsZHJlbi4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmFtZSB0byBhcHBlbmQuIE1heSBiZSBwcmVmaXhlZCAoc2VlIGQzLm5zLnByZWZpeCkuCisgICAgICAgICAqIEBwYXJhbSBiZWZvcmUgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZSBuZXh0IHNpYmxpbmcKKyAgICAgICAgICovCisgICAgICAgIGluc2VydChuYW1lOiBzdHJpbmcsIGJlZm9yZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gRXZlbnRUYXJnZXQpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnNlcnRzIGEgbmV3IGNoaWxkIHRvIHRoZSBlbmQgb2YgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24gYnkgY29tcHV0aW5nIGEgbmV3IG5vZGUuIFRoaXMgY2hpbGQgd2lsbCBpbmhlcml0IGl0cyBwYXJlbnQncyBkYXRhIChpZiBhdmFpbGFibGUpLiBSZXR1cm5zIGEgZnJlc2ggc2VsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlIG5ld2x5LWluc2VydGVkIGNoaWxkcmVuLgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIG5ldyBjaGlsZAorICAgICAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSBzZWxlY3RvciB0byBkZXRlcm1pbmUgcG9zaXRpb24gKGUuZy4sICI6Zmlyc3QtY2hpbGQiKQorICAgICAgICAgKi8KKyAgICAgICAgaW5zZXJ0KG5hbWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0LCBiZWZvcmU6IHN0cmluZyk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluc2VydHMgYSBuZXcgY2hpbGQgdG8gdGhlIGVuZCBvZiBlYWNoIG5vZGUgaW4gdGhlIHNlbGVjdGlvbiBieSBjb21wdXRpbmcgYSBuZXcgbm9kZS4gVGhpcyBjaGlsZCB3aWxsIGluaGVyaXQgaXRzIHBhcmVudCdzIGRhdGEgKGlmIGF2YWlsYWJsZSkuIFJldHVybnMgYSBmcmVzaCBzZWxlY3Rpb24gY29uc2lzdGluZyBvZiB0aGUgbmV3bHktaW5zZXJ0ZWQgY2hpbGRyZW4uCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgbmV3IGNoaWxkCisgICAgICAgICAqIEBwYXJhbSBiZWZvcmUgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZSBuZXh0IHNpYmxpbmcKKyAgICAgICAgICovCisgICAgICAgIGluc2VydChuYW1lOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBFdmVudFRhcmdldCwgYmVmb3JlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBFdmVudFRhcmdldCk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgdGhlIGVsZW1lbnRzIGZyb20gdGhlIERPTS4gVGhleSBhcmUgaW4gYSBkZXRhY2hlZCBzdGF0ZSBhbmQgbWF5IGJlIHJlLWFkZGVkICh0aG91Z2ggdGhlcmUgaXMgY3VycmVudGx5IG5vIGRlZGljYXRlZCBBUEkgZm9yIGRvaW5nIHNvKS4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZSgpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGRhdGEgYm91bmQgdG8gdGhlIGZpcnN0IGdyb3VwIGluIHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZGF0YSgpOiBEYXR1bVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kcyBkYXRhIHRvIHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYXJyYXkgb2YgZGF0YSB0byBiaW5kIHRvIHRoaXMgc2VsZWN0aW9uCisgICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgdW5pcXVlIGtleSBmb3IgZWFjaCBwaWVjZSBvZiBkYXRhLiBXaGVuIHVuc3BlY2lmaWVkLCB1c2VzIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIGRhdGE8TmV3RGF0dW0+KGRhdGE6IE5ld0RhdHVtW10sIGtleT86IChkYXR1bTogTmV3RGF0dW0sIGluZGV4OiBudW1iZXIpID0+IHN0cmluZyk6IHNlbGVjdGlvbi5VcGRhdGU8TmV3RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXJpdmVzIGRhdGEgdG8gYmluZCB0byB0aGlzIHNlbGVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgdGhlIGZ1bmN0aW9uIHRvIGRlcml2ZSBkYXRhLiBNdXN0IHJldHVybiBhbiBhcnJheS4KKyAgICAgICAgICogQHBhcmFtIGtleSB0aGUgb3B0aW9uYWwgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSB1bmlxdWUga2V5IGZvciBlYWNoIGRhdGEgaXRlbS4gV2hlbiB1bnNwZWNpZmllZCwgdXNlcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBkYXRhPE5ld0RhdHVtPihkYXRhOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBOZXdEYXR1bVtdLCBrZXk/OiAoZGF0dW06IE5ld0RhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBzdHJpbmcpOiBzZWxlY3Rpb24uVXBkYXRlPE5ld0RhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmlsdGVycyB0aGUgc2VsZWN0aW9uLCByZXR1cm5pbmcgb25seSB0aG9zZSBub2RlcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBDU1Mgc2VsZWN0b3IuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgQ1NTIHNlbGVjdG9yCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXIoc2VsZWN0b3I6IHN0cmluZyk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbHRlcnMgdGhlIHNlbGVjdGlvbiwgcmV0dXJuaW5nIG9ubHkgdGhvc2Ugbm9kZXMgZm9yIHdoaWNoIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5lZCB0cnVlLgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIGZpbHRlciBmdW5jdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyKHNlbGVjdG9yOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBkYXRhIGl0ZW0gYm91bmQgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGRhdHVtKCk6IERhdHVtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXJpdmUgdGhlIGRhdGEgaXRlbSBmb3IgZWFjaCBub2RlIGluIHRoZSBzZWxlY3Rpb24uIFVzZWZ1bCBmb3Igc2l0dWF0aW9ucyBzdWNoIGFzIHRoZSBIVE1MNSAnZGF0YXNldCcgYXR0cmlidXRlLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgZGF0YSBmb3IgZWFjaCBub2RlCisgICAgICAgICAqLworICAgICAgICBkYXR1bTxOZXdEYXR1bT4odmFsdWU6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IE5ld0RhdHVtKTogU2VsZWN0aW9uPE5ld0RhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBkYXRhIGl0ZW0gZm9yIGVhY2ggbm9kZSBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNvbnN0YW50IGVsZW1lbnQgdG8gdXNlIGZvciBlYWNoIG5vZGUKKyAgICAgICAgICovCisgICAgICAgIGRhdHVtPE5ld0RhdHVtPih2YWx1ZTogTmV3RGF0dW0pOiBTZWxlY3Rpb248TmV3RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW9yZGVycyBub2RlcyBpbiB0aGUgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBjb21wYXJhdG9yLiBOb2RlcyBhcmUgcmUtaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQgb25jZSBzb3J0ZWQuCisgICAgICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uLCB3aGljaCBkZWZhdWx0cyB0byBkMy5hc2NlbmRpbmcKKyAgICAgICAgICovCisgICAgICAgIHNvcnQoY29tcGFyYXRvcj86IChhOiBEYXR1bSwgYjogRGF0dW0pID0+IG51bWJlcik6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlb3JkZXJzIG5vZGVzIGluIHRoZSBkb2N1bWVudCB0byBtYXRjaCB0aGUgc2VsZWN0aW9uIG9yZGVyLiBNb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgc29ydCgpIGlmIHRoZSBzZWxlY3Rpb24gaXMgYWxyZWFkeSBvcmRlcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXIoKTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbGlzdGVuZXIgKGlmIGFueSkgZm9yIHRoZSBnaXZlbiBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbG9hZCB0aGUgbGlzdGVuZXIgZm9yLiBNYXkgaGF2ZSBhIG5hbWVzcGFjZSAoZS5nLiwgIi5mb28iKSBhdCB0aGUgZW5kLgorICAgICAgICAgKi8KKyAgICAgICAgb24odHlwZTogc3RyaW5nKTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gYW55OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuIElmIG9uZSB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLCBpdCBpcyByZW1vdmVkIGJlZm9yZSB0aGUgbmV3IGxpc3RlbmVyIGlzIGFkZGVkLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpcyBpZ25vcmVkLgorICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgb2YgZXZlbnQgdG8gbGlzdGVuIHRvLiBNYXkgaGF2ZSBhIG5hbWVzcGFjZSAoZS5nLiwgIi5mb28iKSBhdCB0aGUgZW5kLgorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYW4gZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24sIG9yIG51bGwgdG8gdW5yZWdpc3RlcgorICAgICAgICAgKiBAcGFyYW0gY2FwdHVyZSBzZXRzIHRoZSBET00gdXNlQ2FwdHVyZSBmbGFnCisgICAgICAgICAqLworICAgICAgICBvbih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBhbnksIGNhcHR1cmU/OiBib29sZWFuKTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQmVnaW5zIGEgbmV3IHRyYW5zaXRpb24uIEludGVycnVwdHMgYW55IGFjdGl2ZSB0cmFuc2l0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdHJhbnNpdGlvbiBuYW1lIChkZWZhdWx0cyB0byAiIikKKyAgICAgICAgICovCisgICAgICAgIHRyYW5zaXRpb24obmFtZT86IHN0cmluZyk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlcnJ1cHRzIHRoZSBhY3RpdmUgdHJhbnNpdGlvbiBvZiB0aGUgcHJvdmlkZWQgbmFtZS4gRG9lcyBub3QgY2FuY2VsIHNjaGVkdWxlZCB0cmFuc2l0aW9ucy4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIHRyYW5zaXRpb24gbmFtZSAoZGVmYXVsdHMgdG8gIiIpCisgICAgICAgICAqLworICAgICAgICBpbnRlcnJ1cHQobmFtZT86IHN0cmluZyk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBzdWJzZWxlY3Rpb24gYnkgZmluZGluZyB0aGUgZmlyc3QgZGVzY2VuZGVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3Igc3RyaW5nLiBCb3VuZCBkYXRhIGlzIGluaGVyaXRlZC4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBDU1Mgc2VsZWN0b3IgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAgICAgKi8KKyAgICAgICAgc2VsZWN0KHNlbGVjdG9yOiBzdHJpbmcpOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgc3Vic2VsZWN0aW9uIGJ5IHVzaW5nIGEgZnVuY3Rpb24gdG8gZmluZCBkZXNjZW5kZW50IGVsZW1lbnRzLiBCb3VuZCBkYXRhIGlzIGluaGVyaXRlZC4KKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBmdW5jdGlvbiB0byBmaW5kIG1hdGNoaW5nIGRlc2NlbmRhbnRzCisgICAgICAgICAqLworICAgICAgICBzZWxlY3Qoc2VsZWN0b3I6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IEV2ZW50VGFyZ2V0KTogU2VsZWN0aW9uPERhdHVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHN1YnNlbGVjdGlvbiBieSBmaW5kaW5nIGFsbCBkZXNjZW5kZW50cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBzZWxlY3Rvci4gQm91bmQgZGF0YSBpcyBub3QgaW5oZXJpdGVkLgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIENTUyBzZWxlY3RvciB0byBtYXRjaCBhZ2FpbnN0CisgICAgICAgICAqLworICAgICAgICBzZWxlY3RBbGwoc2VsZWN0b3I6IHN0cmluZyk6IFNlbGVjdGlvbjxhbnk+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgc3Vic2VsZWN0aW9uIGJ5IGZpbmRpbmcgYWxsIGRlc2NlbmRhbnRzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHNlbGVjdG9yLiBCb3VuZCBkYXRhIGlzIG5vdCBpbmhlcml0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFVzZSB0aGlzIG92ZXJsb2FkIHdoZW4gZGF0YS1iaW5kaW5nIGEgc3Vic2VsZWN0aW9uICh0aGF0IGlzLCBzZWwuc2VsZWN0QWxsKCcuZm9vJykuZGF0YShkID0+IC4uLikpLiBUaGUgdHlwZSB3aWxsIGNhcnJ5IG92ZXIuCisgICAgICAgICAqLworICAgICAgICBzZWxlY3RBbGw8VD4oc2VsZWN0b3I6IHN0cmluZyk6IFNlbGVjdGlvbjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHN1YnNlbGVjdGlvbiBieSB1c2luZyBhIGZ1bmN0aW9uIHRvIGZpbmQgZGVzY2VuZGVudCBlbGVtZW50cy4gQm91bmQgZGF0YSBpcyBub3QgaW5oZXJpdGVkLgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIGZ1bmN0aW9uIHRvIGZpbmQgbWF0Y2hpbmcgZGVzY2VuZGVudHMKKyAgICAgICAgICovCisgICAgICAgIHNlbGVjdEFsbChzZWxlY3RvcjogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gQXJyYXk8RXZlbnRUYXJnZXQ+IHwgTm9kZUxpc3QpOiBTZWxlY3Rpb248YW55PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHN1YnNlbGVjdGlvbiBieSB1c2luZyBhIGZ1bmN0aW9uIHRvIGZpbmQgZGVzY2VuZGVudCBlbGVtZW50cy4gQm91bmQgZGF0YSBpcyBub3QgaW5oZXJpdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBVc2UgdGhpcyBvdmVybG9hZCB3aGVuIGRhdGEtYmluZGluZyBhIHN1YnNlbGVjdGlvbiAodGhhdCBpcywgc2VsLnNlbGVjdEFsbCgnLmZvbycpLmRhdGEoZCA9PiAuLi4pKS4gVGhlIHR5cGUgd2lsbCBjYXJyeSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIGZ1bmN0aW9uIHRvIGZpbmQgbWF0Y2hpbmcgZGVzY2VuZGVudHMKKyAgICAgICAgICovCisgICAgICAgIHNlbGVjdEFsbDxUPihzZWxlY3RvcjogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gQXJyYXk8RXZlbnRUYXJnZXQ+IHwgTm9kZUxpc3QpOiBTZWxlY3Rpb248VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2VsZWN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBpcyBpZ25vcmVkLgorICAgICAgICAgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24gdG8gaW52b2tlCisgICAgICAgICAqLworICAgICAgICBlYWNoKGZ1bmM6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IGFueSk6IFNlbGVjdGlvbjxEYXR1bT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGwgYSBmdW5jdGlvbiBvbiB0aGUgc2VsZWN0aW9uLiBzZWwuY2FsbChmb28pIGlzIGVxdWl2YWxlbnQgdG8gZm9vKHNlbCkuCisgICAgICAgICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB0byBjYWxsIG9uIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgYW55IG9wdGlvbmFsIGFyZ3MKKyAgICAgICAgICovCisgICAgICAgIGNhbGwoZnVuYzogKHNlbDogU2VsZWN0aW9uPERhdHVtPiwgLi4uYXJnczogYW55W10pID0+IGFueSwgLi4uYXJnczogYW55W10pOiBTZWxlY3Rpb248RGF0dW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGVtcHR5LgorICAgICAgICAgKi8KKyAgICAgICAgZW1wdHkoKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZmlyc3Qgbm9uLW51bGwgZWxlbWVudCBpbiB0aGUgc2VsZWN0aW9uLCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIG5vZGUoKTogRXZlbnRUYXJnZXQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZSgpOiBudW1iZXI7CisgICAgfQorCisgICAgZXhwb3J0IGZ1bmN0aW9uIHRyYW5zaXRpb24oKTogVHJhbnNpdGlvbjxhbnk+OworICAgIG1vZHVsZSB0cmFuc2l0aW9uIHsKKyAgICAgICAgZXhwb3J0IHZhciBwcm90b3R5cGU6IFRyYW5zaXRpb248YW55PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgVHJhbnNpdGlvbjxEYXR1bT4geworICAgICAgICBkZWxheSgpOiBudW1iZXI7CisgICAgICAgIGRlbGF5KGRlbGF5OiBudW1iZXIpOiBUcmFuc2l0aW9uPERhdHVtPjsKKyAgICAgICAgZGVsYXkoZGVsYXk6IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IG51bWJlcik6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIGR1cmF0aW9uKCk6IG51bWJlcjsKKyAgICAgICAgZHVyYXRpb24oZHVyYXRpb246IG51bWJlcik6IFRyYW5zaXRpb248RGF0dW0+OworICAgICAgICBkdXJhdGlvbihkdXJhdGlvbjogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogVHJhbnNpdGlvbjxEYXR1bT47CisKKyAgICAgICAgZWFzZSgpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgICAgIGVhc2UodmFsdWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBUcmFuc2l0aW9uPERhdHVtPjsKKyAgICAgICAgZWFzZSh2YWx1ZTogKHQ6IG51bWJlcikgPT4gbnVtYmVyKTogVHJhbnNpdGlvbjxEYXR1bT47CisKKyAgICAgICAgYXR0cihuYW1lOiBzdHJpbmcsIHZhbHVlOiBQcmltaXRpdmUpOiBUcmFuc2l0aW9uPERhdHVtPjsKKyAgICAgICAgYXR0cihuYW1lOiBzdHJpbmcsIHZhbHVlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBQcmltaXRpdmUpOiBUcmFuc2l0aW9uPERhdHVtPjsKKyAgICAgICAgYXR0cihvYmo6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIHwgKChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IFByaW1pdGl2ZSkgfSk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIGF0dHJUd2VlbihuYW1lOiBzdHJpbmcsIHR3ZWVuOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyLCBhdHRyOiBzdHJpbmcpID0+IFByaW1pdGl2ZSk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIHN0eWxlKG5hbWU6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSwgcHJpb3JpdHk/OiBzdHJpbmcpOiBUcmFuc2l0aW9uPERhdHVtPjsKKyAgICAgICAgc3R5bGUobmFtZTogc3RyaW5nLCB2YWx1ZTogKGRhdHVtOiBEYXR1bSwgaW5kZXg6IG51bWJlcikgPT4gUHJpbWl0aXZlLCBwcmlvcml0eT86IHN0cmluZyk6IFRyYW5zaXRpb248RGF0dW0+OworICAgICAgICBzdHlsZShvYmo6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIHwgKChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIpID0+IFByaW1pdGl2ZSkgfSwgcHJpb3JpdHk/OiBzdHJpbmcpOiBUcmFuc2l0aW9uPERhdHVtPjsKKworICAgICAgICBzdHlsZVR3ZWVuKG5hbWU6IHN0cmluZywgdHdlZW46IChkYXR1bTogRGF0dW0sIGluZGV4OiBudW1iZXIsIGF0dHI6IHN0cmluZykgPT4gUHJpbWl0aXZlLCBwcmlvcml0eT86IHN0cmluZyk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIHRleHQodmFsdWU6IFByaW1pdGl2ZSk6IFRyYW5zaXRpb248RGF0dW0+OworICAgICAgICB0ZXh0KHZhbHVlOiAoZGF0dW06IERhdHVtLCBpbmRleDogbnVtYmVyKSA9PiBQcmltaXRpdmUpOiBUcmFuc2l0aW9uPERhdHVtPjsKKworICAgICAgICB0d2VlbihuYW1lOiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+ICh0OiBudW1iZXIpID0+IGFueSk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIHJlbW92ZSgpOiBUcmFuc2l0aW9uPERhdHVtPjsKKworICAgICAgICBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZyk6IFRyYW5zaXRpb248RGF0dW0+OworICAgICAgICBzZWxlY3Qoc2VsZWN0b3I6IChkOiBEYXR1bSwgaTogbnVtYmVyKSA9PiBFdmVudFRhcmdldCk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIHNlbGVjdEFsbChzZWxlY3Rvcjogc3RyaW5nKTogVHJhbnNpdGlvbjxhbnk+OworICAgICAgICBzZWxlY3RBbGwoc2VsZWN0b3I6IChkOiBEYXR1bSwgaTogbnVtYmVyKSA9PiBFdmVudFRhcmdldFtdKTogVHJhbnNpdGlvbjxhbnk+OworCisgICAgICAgIGZpbHRlcihzZWxlY3Rvcjogc3RyaW5nKTogVHJhbnNpdGlvbjxEYXR1bT47CisgICAgICAgIGZpbHRlcihzZWxlY3RvcjogKGQ6IERhdHVtLCBpOiBudW1iZXIpID0+IGJvb2xlYW4pOiBUcmFuc2l0aW9uPERhdHVtPjsKKworICAgICAgICBlYWNoKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IChkOiBEYXR1bSwgaTogbnVtYmVyKSA9PiBhbnkpOiBUcmFuc2l0aW9uPERhdHVtPjsKKyAgICAgICAgZWFjaChsaXN0ZW5lcjogKGQ6IERhdHVtLCBpOiBudW1iZXIpID0+IGFueSk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIGNhbGwoZnVuYzogKHRyYW5zaXRpb246IFRyYW5zaXRpb248RGF0dW0+LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55LCAuLi5hcmdzOiBhbnlbXSk6IFRyYW5zaXRpb248RGF0dW0+OworCisgICAgICAgIGVtcHR5KCk6IGJvb2xlYW47CisgICAgICAgIG5vZGUoKTogRXZlbnRUYXJnZXQ7CisgICAgICAgIHNpemUoKTogbnVtYmVyOworICAgIH0KKworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdsaW5lYXInKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdsaW5lYXItaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdsaW5lYXItb3V0Jyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnbGluZWFyLWluLW91dCcpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ2xpbmVhci1vdXQtaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3BvbHknLCBrOiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3BvbHktaW4nLCBrOiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3BvbHktb3V0JywgazogbnVtYmVyKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdwb2x5LWluLW91dCcsIGs6IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAncG9seS1vdXQtaW4nLCBrOiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAncXVhZCcpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3F1YWQtaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdxdWFkLW91dCcpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3F1YWQtaW4tb3V0Jyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAncXVhZC1vdXQtaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ2N1YmljJyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnY3ViaWMtaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdjdWJpYy1vdXQnKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdjdWJpYy1pbi1vdXQnKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdjdWJpYy1vdXQtaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3NpbicpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3Npbi1pbicpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ3Npbi1vdXQnKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdzaW4taW4tb3V0Jyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnc2luLW91dC1pbicpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnY2lyY2xlJyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnY2lyY2xlLWluJyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnY2lyY2xlLW91dCcpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ2NpcmNsZS1pbi1vdXQnKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdjaXJjbGUtb3V0LWluJyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdlbGFzdGljJywgYT86IG51bWJlciwgYj86IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnZWxhc3RpYy1pbicsIGE/OiBudW1iZXIsIGI/OiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ2VsYXN0aWMtb3V0JywgYT86IG51bWJlciwgYj86IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnZWxhc3RpYy1pbi1vdXQnLCBhPzogbnVtYmVyLCBiPzogbnVtYmVyKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdlbGFzdGljLW91dC1pbicsIGE/OiBudW1iZXIsIGI/OiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnYmFjaycsIHM6IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnYmFjay1pbicsIHM6IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnYmFjay1vdXQnLCBzOiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ2JhY2staW4tb3V0JywgczogbnVtYmVyKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdiYWNrLW91dC1pbicsIHM6IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdib3VuY2UnKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdib3VuY2UtaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBlYXNlKHR5cGU6ICdib3VuY2Utb3V0Jyk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZWFzZSh0eXBlOiAnYm91bmNlLWluLW91dCcpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogJ2JvdW5jZS1vdXQtaW4nKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGVhc2UodHlwZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKworICAgIGV4cG9ydCBmdW5jdGlvbiB0aW1lcihmdW5jOiAoKSA9PiBhbnksIGRlbGF5PzogbnVtYmVyLCB0aW1lPzogbnVtYmVyKTogdm9pZDsKKworICAgIG1vZHVsZSB0aW1lciB7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBmbHVzaCgpOiB2b2lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGV2ZW50J3MgdmFsdWUuIFVzZSB0aGlzIHZhcmlhYmxlIGluIGEgaGFuZGxlciByZWdpc3RlcmVkIHdpdGggc2VsZWN0aW9uLm9uLgorICAgICAqLworICAgIGV4cG9ydCB2YXIgZXZlbnQ6IEV2ZW50OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgcmVsYXRpdmUgdG8gdGhlIHByb3ZpZGVkIGNvbnRhaW5lciBlbGVtZW50LCB1c2luZyBkMy5ldmVudCBmb3IgdGhlIG1vdXNlJ3MgcG9zaXRpb24gb24gdGhlIHBhZ2UuCisgICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyIGVsZW1lbnQgKGUuZy4gYW4gU1ZHIDxnPiBlbGVtZW50KQorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtb3VzZShjb250YWluZXI6IEV2ZW50VGFyZ2V0KTogW251bWJlciwgbnVtYmVyXTsKKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgY29udGFpbmVyIGVsZW1lbnQgYW5kIGEgdG91Y2ggaWRlbnRpZmllciwgZGV0ZXJtaW5lIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIHRoZSB0b3VjaC4KKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIgZWxlbWVudCAoZS5nLiwgYW4gU1ZHIDxzdmc+IGVsZW1lbnQpCisgICAgICogQHBhcmFtIGlkZW50aWZpZXIgdGhlIGdpdmVuIHRvdWNoIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gdG91Y2goY29udGFpbmVyOiBFdmVudFRhcmdldCwgaWRlbnRpZmVyOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjb250YWluZXIgZWxlbWVudCwgYSBsaXN0IG9mIHRvdWNoZXMsIGFuZCBhIHRvdWNoIGlkZW50aWZpZXIsIGRldGVybWluZSB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgdG91Y2guCisgICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyIGVsZW1lbnQgKGUuZy4sIGFuIFNWRyA8c3ZnPiBlbGVtZW50KQorICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIHRoZSBnaXZlbiB0b3VjaCBpZGVudGlmaWVyCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIHRvdWNoKGNvbnRhaW5lcjogRXZlbnRUYXJnZXQsIHRvdWNoZXM6IFRvdWNoTGlzdCwgaWRlbnRpZmVyOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjb250YWluZXIgZWxlbWVudCBhbmQgYW4gb3B0aW9uYWwgbGlzdCBvZiB0b3VjaGVzLCByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5IHRvdWNoIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gdG91Y2hlcyBhbiBvcHRpb25hbCBsaXN0IG9mIHRvdWNoZXMgKGRlZmF1bHRzIHRvIGQzLmV2ZW50LnRvdWNoZXMpCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZXMoY29udGFpbmVyOiBFdmVudFRhcmdldCwgdG91Y2hlcz86IFRvdWNoTGlzdCk6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+OworCisgICAgLy8gTkIuIHRoaXMgaXMgbGltaXRlZCB0byBwcmltaXRpdmUgdmFsdWVzIGR1ZSB0byBEMydzIHVzZSBvZiB0aGUgPCwgPiwgYW5kID49IG9wZXJhdG9ycy4gUmVzdWx0cyBnZXQgd2VpcmQgZm9yIG9iamVjdCBpbnN0YW5jZXMuCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIHByaW1pdGl2ZSB2YWx1ZXMgZm9yIHNvcnRpbmcgKGluIGFzY2VuZGluZyBvcmRlcikuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIGFzY2VuZGluZyhhOiBQcmltaXRpdmUsIGI6IFByaW1pdGl2ZSk6IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHR3byBwcmltaXRpdmUgdmFsdWVzIGZvciBzb3J0aW5nIChpbiBhc2NlbmRpbmcgb3JkZXIpLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBkZXNjZW5kaW5nKGE6IFByaW1pdGl2ZSwgYjogUHJpbWl0aXZlKTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtaW4oYXJyYXk6IG51bWJlcltdKTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtaW4oYXJyYXk6IHN0cmluZ1tdKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtaW48VCBleHRlbmRzIE51bWVyaWM+KGFycmF5OiBUW10pOiBUOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtaW48VD4oYXJyYXk6IFRbXSwgYWNjZXNzb3I6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtaW48VD4oYXJyYXk6IFRbXSwgYWNjZXNzb3I6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtaW48VCwgVSBleHRlbmRzIE51bWVyaWM+KGFycmF5OiBUW10sIGFjY2Vzc29yOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBVOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBhcnJheSBvZiBudW1iZXJzIHVzaW5nIG5hdHVyYWwgb3JkZXIuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIG1heChhcnJheTogbnVtYmVyW10pOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIGFycmF5IG9mIHN0cmluZ3MgdXNpbmcgbmF0dXJhbCBvcmRlci4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gbWF4KGFycmF5OiBzdHJpbmdbXSk6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgYXJyYXkgb2YgbnVtYmVycyB1c2luZyBuYXR1cmFsIG9yZGVyLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtYXg8VCBleHRlbmRzIE51bWVyaWM+KGFycmF5OiBUW10pOiBUOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyIGFuZCBhIHByb2plY3Rpb24gZnVuY3Rpb24gdG8gbWFwIHZhbHVlcyB0byBudW1iZXJzLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtYXg8VD4oYXJyYXk6IFRbXSwgYWNjZXNzb3I6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyIGFuZCBhIHByb2plY3Rpb24gZnVuY3Rpb24gdG8gbWFwIHZhbHVlcyB0byBzdHJpbmdzLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtYXg8VD4oYXJyYXk6IFRbXSwgYWNjZXNzb3I6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBhcnJheSB1c2luZyBuYXR1cmFsIG9yZGVyIGFuZCBhIHByb2plY3Rpb24gZnVuY3Rpb24gdG8gbWFwIHZhbHVlcyB0byBlYXNpbHktc29ydGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gbWF4PFQsIFUgZXh0ZW5kcyBOdW1lcmljPihhcnJheTogVFtdLCBhY2Nlc3NvcjogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBVKTogVTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWluIGFuZCBtYXggc2ltdWx0YW5lb3VzbHkuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIGV4dGVudChhcnJheTogbnVtYmVyW10pOiBbbnVtYmVyLCBudW1iZXJdOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW4gYW5kIG1heCBzaW11bHRhbmVvdXNseS4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gZXh0ZW50KGFycmF5OiBzdHJpbmdbXSk6IFtzdHJpbmcsIHN0cmluZ107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1pbiBhbmQgbWF4IHNpbXVsdGFuZW91c2x5LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBleHRlbnQ8VCBleHRlbmRzIE51bWVyaWM+KGFycmF5OiBUW10pOiBbVCwgVF07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1pbiBhbmQgbWF4IHNpbXVsdGFuZW91c2x5LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBleHRlbnQ8VCBleHRlbmRzIE51bWVyaWM+KGFycmF5OiBBcnJheTxUIHwgUHJpbWl0aXZlPik6IFtUIHwgUHJpbWl0aXZlLCBUIHwgUHJpbWl0aXZlXTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWluIGFuZCBtYXggc2ltdWx0YW5lb3VzbHkuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIGV4dGVudDxUPihhcnJheTogVFtdLCBhY2Nlc3NvcjogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtaW4gYW5kIG1heCBzaW11bHRhbmVvdXNseS4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gZXh0ZW50PFQ+KGFycmF5OiBUW10sIGFjY2Vzc29yOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1pbiBhbmQgbWF4IHNpbXVsdGFuZW91c2x5LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBleHRlbnQ8VCwgVSBleHRlbmRzIE51bWVyaWM+KGFycmF5OiBVW10sIGFjY2Vzc29yOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBbVSB8IFByaW1pdGl2ZSwgVSB8IFByaW1pdGl2ZV07CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlIHRoZSBzdW0gb2YgYW4gYXJyYXkgb2YgbnVtYmVycy4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gc3VtKGFycmF5OiBudW1iZXJbXSk6IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIENvbXB1dGUgdGhlIHN1bSBvZiBhbiBhcnJheSwgdXNpbmcgdGhlIGdpdmVuIGFjY2Vzc29yIHRvIGNvbnZlcnQgdmFsdWVzIHRvIG51bWJlcnMuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIHN1bTxUPihhcnJheTogVFtdLCBhY2Nlc3NvcjogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBudW1iZXI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gbWVhbihhcnJheTogbnVtYmVyW10pOiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIG1lYW48VD4oYXJyYXk6IFRbXSwgYWNjZXNzb3I6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIHF1YW50aWxlKGFycmF5OiBudW1iZXJbXSwgcDogbnVtYmVyKTogbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIHZhcmlhbmNlKGFycmF5OiBudW1iZXJbXSk6IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gdmFyaWFuY2U8VD4oYXJyYXk6IFRbXSwgYWNjZXNzb3I6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGRldmlhdGlvbihhcnJheTogbnVtYmVyW10pOiBudW1iZXI7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGRldmlhdGlvbjxUPihhcnJheTogVFtdLCBhY2Nlc3NvcjogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBudW1iZXI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gYmlzZWN0TGVmdChhcnJheTogbnVtYmVyW10sIHg6IG51bWJlciwgbG8/OiBudW1iZXIsIGhpPzogbnVtYmVyKTogbnVtYmVyOworICAgIGV4cG9ydCBmdW5jdGlvbiBiaXNlY3RMZWZ0KGFycmF5OiBzdHJpbmdbXSwgeDogc3RyaW5nLCBsbz86IG51bWJlciwgaGk/OiBudW1iZXIpOiBudW1iZXI7CisKKyAgICBleHBvcnQgdmFyIGJpc2VjdDogdHlwZW9mIGJpc2VjdFJpZ2h0OworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGJpc2VjdFJpZ2h0PFQ+KGFycmF5OiBUW10sIHg6IFQsIGxvPzogbnVtYmVyLCBoaT86IG51bWJlcik6IG51bWJlcjsKKworICAgIGV4cG9ydCBmdW5jdGlvbiBiaXNlY3RvcjxULCBVPihhY2Nlc3NvcjogKHg6IFQpID0+IFUpOiB7CisgICAgICAgIGxlZnQ6IChhcnJheTogVFtdLCB4OiBULCBsbz86IG51bWJlciwgaGk/OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICAgICAgcmlnaHQ6IChhcnJheTogVFtdLCB4OiBULCBsbz86IG51bWJlciwgaGk/OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICB9CisKKyAgICBleHBvcnQgZnVuY3Rpb24gYmlzZWN0b3I8VCwgVT4oY29tcGFyYXRvcjogKGE6IFQsIGI6IFUpID0+IG51bWJlcik6IHsKKyAgICAgICAgbGVmdDogKGFycmF5OiBUW10sIHg6IFUsIGxvPzogbnVtYmVyLCBoaT86IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICByaWdodDogKGFycmF5OiBUW10sIHg6IFUsIGxvPzogbnVtYmVyLCBoaT86IG51bWJlcikgPT4gbnVtYmVyOworICAgIH0KKworICAgIGV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlPFQ+KGFycmF5OiBUW10sIGxvPzogbnVtYmVyLCBoaT86IG51bWJlcik6IFRbXTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICogQHBhcmFtIG9iamVjdCBhIEphdmFTY3JpcHQgb2JqZWN0CisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIGtleXMob2JqZWN0OiBPYmplY3QpOiBzdHJpbmdbXTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiB2YWx1ZXM8VD4ob2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IFQgfSk6IFRbXTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KG9iamVjdDogeyBba2V5OiBudW1iZXJdOiBUIH0pOiBUW107CisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIHZhbHVlcyhvYmplY3Q6IE9iamVjdCk6IGFueVtdOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBrZXktdmFsdWUgcGFpcnMgY29udGFpbmluZyB0aGUgcHJvcGVydHkgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBlbnRyaWVzPFQ+KG9iamVjdDogeyBba2V5OiBzdHJpbmddOiBUIH0pOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogVCB9W107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGtleS12YWx1ZSBwYWlycyBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIGVudHJpZXM8VD4ob2JqZWN0OiB7IFtrZXk6IG51bWJlcl06IFQgfSk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBUIH1bXTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzIGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gZW50cmllcyhvYmplY3Q6IE9iamVjdCk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdOworCisgICAgLyoqCisgICAgICogQSBzaGltIGZvciBFUzYgbWFwcy4gVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYSBKYXZhU2NyaXB0IG9iamVjdCBpbnRlcm5hbGx5LCBhbmQgdGh1cyBrZXlzIGFyZSBsaW1pdGVkIHRvIHN0cmluZ3MuCisgICAgICovCisgICAgaW50ZXJmYWNlIE1hcDxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBEb2VzIHRoZSBtYXAgY29udGFpbiB0aGUgZ2l2ZW4ga2V5PworICAgICAgICAgKi8KKyAgICAgICAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyB2YWx1ZSBzdG9yZWQuCisgICAgICAgICAqLworICAgICAgICBnZXQoa2V5OiBzdHJpbmcpOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LiBSZXR1cm5zIHRoZSBuZXcgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS4gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhIHZhbHVlIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICByZW1vdmUoa2V5OiBzdHJpbmcpOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrZXlzIGluIGFyYml0cmFyeSBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIGtleXMoKTogc3RyaW5nW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHZhbHVlcyBpbiBhcmJpdHJhcnkgb3JkZXIuCisgICAgICAgICAqLworICAgICAgICB2YWx1ZXMoKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGtleS12YWx1ZSBvYmplY3RzIGluIGFyYml0cmFyeSBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIGVudHJpZXMoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IFQgfVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxscyB0aGUgZnVuY3Rpb24gZm9yIGVhY2gga2V5IGFuZCB2YWx1ZSBwYWlyIGluIHRoZSBtYXAuIFRoZSAndGhpcycgY29udGV4dCBpcyB0aGUgbWFwIGl0c2VsZi4KKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2goZnVuYzogKGtleTogc3RyaW5nLCB2YWx1ZTogVCkgPT4gYW55KTogdm9pZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogSXMgdGhpcyBtYXAgZW1wdHk/CisgICAgICAgICAqLworICAgICAgICBlbXB0eSgpOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIGluIHRoZSBtYXAuCisgICAgICAgICAqLworICAgICAgICBzaXplKCk6IG51bWJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGluaXRpYWxseSBlbXB0eSBtYXAuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIG1hcDxUPigpOiBNYXA8VD47CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbWFwIGJ5IGNvcHlpbmcga2V5cyBhbmQgdmFsdWVzIGZyb20gdGhlIGdpdmVuIG9uZS4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gbWFwPFQ+KG9iamVjdDogTWFwPFQ+KTogTWFwPFQ+OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IG1hcCBieSBjb3B5aW5nIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gbWFwPFQ+KG9iamVjdDogeyBba2V5OiBzdHJpbmddOiBUIH0pOiBNYXA8VD47CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbWFwIGJ5IGNvcHlpbmcgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtYXA8VD4ob2JqZWN0OiB7IFtrZXk6IG51bWJlcl06IFQgfSk6IE1hcDxUPjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBtYXAgYnkgY29weWluZyBlbGVtZW50cyBmcm9tIHRoZSBhcnJheS4gVGhlIGtleSBmdW5jdGlvbiBpcyB1c2VkIHRvIGlkZW50aWZ5IGVhY2ggb2JqZWN0LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtYXA8VD4oYXJyYXk6IFRbXSwga2V5OiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IHN0cmluZyk6IE1hcDxUPjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBtYXAgYnkgY29weWluZyBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QuCisgICAgICovCisgICAgZXhwb3J0IGZ1bmN0aW9uIG1hcChvYmplY3Q6IE9iamVjdCk6IE1hcDxhbnk+OworCisgICAgLyoqCisgICAgICogQSBzaGltIGZvciBFUzYgc2V0cy4gSXMgb25seSBhYmxlIHRvIHN0b3JlIHN0cmluZ3MuCisgICAgICovCisgICAgaW50ZXJmYWNlIFNldCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJcyB0aGUgZ2l2ZW4gc3RyaW5nIHN0b3JlZCBpbiB0aGlzIHNldD8KKyAgICAgICAgICovCisgICAgICAgIGhhcyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIHRoZSBzdHJpbmcgdG8gdGhpcyBzZXQuIFJldHVybnMgdGhlIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgYWRkKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gdmFsdWUgZnJvbSB0aGUgc2V0LiBSZXR1cm5zIHRydWUgaWYgaXQgd2FzIHN0b3JlZCwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc3RyaW5ncyBzdG9yZWQgaW4gdGhpcyBzZXQuCisgICAgICAgICAqLworICAgICAgICB2YWx1ZXMoKTogc3RyaW5nW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxzIGEgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2ggdmFsdWUgaW4gdGhlIHNldC4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gaXMgaWdub3JlZC4gVGhlIHRoaXMgY29udGV4dCBvZiB0aGUgZnVuY3Rpb24gaXMgdGhlIHNldCBpdHNlbGYuCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoKGZ1bmM6ICh2YWx1ZTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJcyB0aGlzIHNldCBlbXB0eT8KKyAgICAgICAgICovCisgICAgICAgIGVtcHR5KCk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgc3RvcmVkIGluIHRoaXMgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZSgpOiBudW1iZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbml0aWFsbHktZW1wdHkgc2V0LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBzZXQoKTogU2V0OworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBzZXQgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gc2V0KGFycmF5OiBzdHJpbmdbXSk6IFNldDsKKworICAgIC8qKgorICAgICAqIE1lcmdlcyB0aGUgc3BlY2lmaWVkIGFycmF5cyBpbnRvIGEgc2luZ2xlIGFycmF5LgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBtZXJnZTxUPihhcnJheXM6IFRbXVtdKTogVFtdOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgMC1iYXNlZCBudW1lcmljIHNlcXVlbmNlLiBUaGUgb3V0cHV0IHJhbmdlIGRvZXMgbm90IGluY2x1ZGUgJ3N0b3AnLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiByYW5nZShzdG9wOiBudW1iZXIpOiBudW1iZXJbXTsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIG51bWVyaWMgc2VxdWVuY2Ugc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gc3RhcnQgYW5kIHN0b3AgdmFsdWVzLiAnc3RlcCcgZGVmYXVsdHMgdG8gMS4gVGhlIG91dHB1dCByYW5nZSBkb2VzIG5vdCBpbmNsdWRlICdzdG9wJy4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyLCBzdGVwPzogbnVtYmVyKTogbnVtYmVyW107CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGFycmF5LCByZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgbGlzdCBvZiBpbmRpY2VzIGluICdrZXlzJy4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gcGVybXV0ZTxUPihhcnJheTogeyBba2V5OiBudW1iZXJdOiBUIH0sIGtleXM6IG51bWJlcltdKTogVFtdOworCisgICAgLyoqCisgICAgICogR2l2ZW4gdGhlIHNwZWNpZmllZCBvYmplY3QsIHJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIGluICdrZXlzJy4KKyAgICAgKi8KKyAgICBleHBvcnQgZnVuY3Rpb24gcGVybXV0ZTxUPihvYmplY3Q6IHsgW2tleTogc3RyaW5nXTogVCB9LCBrZXlzOiBzdHJpbmdbXSk6IFRbXTsKKworICAgIC8vIFRPRE8gY29uc3RydWN0IG4tdHVwbGVzIGZyb20gbiBpbnB1dCBhcnJheXMKKyAgICBleHBvcnQgZnVuY3Rpb24gemlwPFQ+KC4uLmFycmF5czogVFtdW10pOiBUW11bXTsKKworICAgIGV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2U8VD4obWF0cml4OiBUW11bXSk6IFRbXVtdOworCisgICAgLyoqCisgICAgICogRm9yIGVhY2ggYWRqYWNlbnQgcGFpciBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCByZXR1cm5zIGEgbmV3IGFycmF5IG9mIHR1cGxlcyBvZiBlbGVtZW50cyBpIGFuZCBpIC0gMS4KKyAgICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBhcnJheSBpZiB0aGUgaW5wdXQgYXJyYXkgaGFzIGZld2VyIHRoYW4gdHdvIGVsZW1lbnRzLgorICAgICAqLworICAgIGV4cG9ydCBmdW5jdGlvbiBwYWlyczxUPihhcnJheTogVFtdKTogQXJyYXk8W1QsIFRdPjsKKworICAgIGludGVyZmFjZSBOZXN0PFQ+IHsKKyAgICAgICAga2V5KGZ1bmM6IChkYXR1bTogVCkgPT4gc3RyaW5nKTogTmVzdDxUPjsKKyAgICAgICAgc29ydEtleXMoY29tcGFyYXRvcjogKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiBudW1iZXIpOiBOZXN0PFQ+OworICAgICAgICBzb3J0VmFsdWVzKGNvbXBhcmF0b3I6IChhOiBULCBiOiBUKSA9PiBudW1iZXIpOiBOZXN0PFQ+OworICAgICAgICByb2xsdXA8VT4oZnVuYzogKHZhbHVlczogVFtdKSA9PiBVKTogTmVzdDxUPjsKKyAgICAgICAgbWFwKGFycmF5OiBUW10pOiB7IFtrZXk6IHN0cmluZ106IGFueSB9OworICAgICAgICBtYXAoYXJyYXk6IFRbXSwgbWFwVHlwZTogdHlwZW9mIGQzLm1hcCk6IE1hcDxhbnk+OworICAgICAgICBlbnRyaWVzKGFycmF5OiBUW10pOiB7IGtleTogc3RyaW5nOyB2YWx1ZXM6IGFueSB9W107CisgICAgfQorCisgICAgZXhwb3J0IGZ1bmN0aW9uIG5lc3Q8VD4oKTogTmVzdDxUPjsKKworICAgIGV4cG9ydCBtb2R1bGUgcmFuZG9tIHsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbChtZWFuPzogbnVtYmVyLCBkZXZpYXRpb24/OiBudW1iZXIpOiAoKSA9PiBudW1iZXI7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBsb2dOb3JtYWwobWVhbj86IG51bWJlciwgZGV2aWF0aW9uPzogbnVtYmVyKTogKCkgPT4gbnVtYmVyOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gYmF0ZXMoY291bnQ6IG51bWJlcik6ICgpID0+IG51bWJlcjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGlyd2luSGFsbChjb3VudDogbnVtYmVyKTogKCkgPT4gbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBUcmFuc2Zvcm0geworICAgICAgICByb3RhdGU6IG51bWJlcjsKKyAgICAgICAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICBza2V3OiBudW1iZXI7CisgICAgICAgIHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICB0b1N0cmluZygpOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybSh0cmFuc2Zvcm06IHN0cmluZyk6IFRyYW5zZm9ybTsKKworICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXQoc3BlY2lmaWVyOiBzdHJpbmcpOiAobjogbnVtYmVyKSA9PiBzdHJpbmc7CisKKyAgICBpbnRlcmZhY2UgRm9ybWF0UHJlZml4IHsKKyAgICAgICAgc3ltYm9sOiBzdHJpbmc7CisgICAgICAgIHNjYWxlKG46IG51bWJlcik6IG51bWJlcjsKKyAgICB9CisKKyAgICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHZhbHVlOiBudW1iZXIsIHByZWNpc2lvbj86IG51bWJlcik6IEZvcm1hdFByZWZpeDsKKworICAgIGV4cG9ydCBmdW5jdGlvbiByb3VuZCh4OiBudW1iZXIsIG4/OiBudW1iZXIpOiBudW1iZXI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gcmVxdW90ZShzdHJpbmc6IHN0cmluZyk6IHN0cmluZzsKKworICAgIGV4cG9ydCB2YXIgcmdiOiB7CisgICAgICAgIG5ldyAocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IFJnYjsKKyAgICAgICAgbmV3IChjb2xvcjogc3RyaW5nKTogUmdiOworCisgICAgICAgIChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogUmdiOworICAgICAgICAoY29sb3I6IHN0cmluZyk6IFJnYjsKKyAgICB9OworCisgICAgaW50ZXJmYWNlIFJnYiBleHRlbmRzIENvbG9yIHsKKyAgICAgICAgcjogbnVtYmVyOworICAgICAgICBnOiBudW1iZXI7CisgICAgICAgIGI6IG51bWJlcjsKKworICAgICAgICBicmlnaHRlcihrPzogbnVtYmVyKTogUmdiOworICAgICAgICBkYXJrZXIoaz86IG51bWJlcik6IFJnYjsKKworICAgICAgICBoc2woKTogSHNsOworCisgICAgICAgIHRvU3RyaW5nKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgdmFyIGhzbDogeworICAgICAgICBuZXcgKGg6IG51bWJlciwgczogbnVtYmVyLCBsOiBudW1iZXIpOiBIc2w7CisgICAgICAgIG5ldyAoY29sb3I6IHN0cmluZyk6IEhzbDsKKworICAgICAgICAoaDogbnVtYmVyLCBzOiBudW1iZXIsIGw6IG51bWJlcik6IEhzbDsKKyAgICAgICAgKGNvbG9yOiBzdHJpbmcpOiBIc2w7CisgICAgfTsKKworICAgIGludGVyZmFjZSBIc2wgZXh0ZW5kcyBDb2xvciB7CisgICAgICAgIGg6IG51bWJlcjsKKyAgICAgICAgczogbnVtYmVyOworICAgICAgICBsOiBudW1iZXI7CisKKyAgICAgICAgYnJpZ2h0ZXIoaz86IG51bWJlcik6IEhzbDsKKyAgICAgICAgZGFya2VyKGs/OiBudW1iZXIpOiBIc2w7CisKKyAgICAgICAgcmdiKCk6IFJnYjsKKworICAgICAgICB0b1N0cmluZygpOiBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IHZhciBoY2w6IHsKKyAgICAgICAgbmV3IChoOiBudW1iZXIsIGM6IG51bWJlciwgbDogbnVtYmVyKTogSGNsOworICAgICAgICBuZXcgKGNvbG9yOiBzdHJpbmcpOiBIY2w7CisKKyAgICAgICAgKGg6IG51bWJlciwgYzogbnVtYmVyLCBsOiBudW1iZXIpOiBIY2w7CisgICAgICAgIChjb2xvcjogc3RyaW5nKTogSGNsOworICAgIH07CisKKyAgICBpbnRlcmZhY2UgSGNsIGV4dGVuZHMgQ29sb3IgeworICAgICAgICBoOiBudW1iZXI7CisgICAgICAgIGM6IG51bWJlcjsKKyAgICAgICAgbDogbnVtYmVyOworCisgICAgICAgIGJyaWdodGVyKGs/OiBudW1iZXIpOiBIY2w7CisgICAgICAgIGRhcmtlcihrPzogbnVtYmVyKTogSGNsOworICAgIH0KKworICAgIGV4cG9ydCB2YXIgbGFiOiB7CisgICAgICAgIG5ldyAobDogbnVtYmVyLCBhOiBudW1iZXIsIGI6IG51bWJlcik6IExhYjsKKyAgICAgICAgbmV3IChjb2xvcjogc3RyaW5nKTogTGFiOworCisgICAgICAgIChsOiBudW1iZXIsIGE6IG51bWJlciwgYjogbnVtYmVyKTogTGFiOworICAgICAgICAoY29sb3I6IHN0cmluZyk6IExhYjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTGFiIGV4dGVuZHMgQ29sb3IgeworICAgICAgICBsOiBudW1iZXI7CisgICAgICAgIGE6IG51bWJlcjsKKyAgICAgICAgYjogbnVtYmVyOworCisgICAgICAgIGJyaWdodGVyKGs/OiBudW1iZXIpOiBMYWI7CisgICAgICAgIGRhcmtlcihrPzogbnVtYmVyKTogTGFiOworCisgICAgICAgIHJnYigpOiBSZ2I7CisgICAgICAgIHRvU3RyaW5nKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBleHBvcnQgdmFyIGNvbG9yOiB7CisgICAgICAgICgpOiBDb2xvcjsKKyAgICAgICAgbmV3ICgpOiBDb2xvcjsKKyAgICB9OworCisgICAgaW50ZXJmYWNlIENvbG9yIHsKKyAgICAgICAgcmdiKCk6IFJnYjsKKyAgICB9CisKKyAgICBleHBvcnQgbW9kdWxlIG5zIHsKKyAgICAgICAgaW50ZXJmYWNlIFF1YWxpZmllZCB7CisgICAgICAgICAgICBzcGFjZTogc3RyaW5nOworICAgICAgICAgICAgbG9jYWw6IHN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCB2YXIgcHJlZml4OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gcXVhbGlmeShuYW1lOiBzdHJpbmcpOiBRdWFsaWZpZWQgfCBzdHJpbmc7CisgICAgfQorCisgICAgZXhwb3J0IGZ1bmN0aW9uIGZ1bmN0b3I8VCBleHRlbmRzIEZ1bmN0aW9uPih2YWx1ZTogVCk6IFQ7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGZ1bmN0b3I8VD4odmFsdWU6IFQpOiAoKSA9PiBUOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIHJlYmluZCh0YXJnZXQ6IHt9LCBzb3VyY2U6IHt9LCAuLi5uYW1lczogc3RyaW5nW10pOiBhbnk7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2goLi4ubmFtZXM6IHN0cmluZ1tdKTogRGlzcGF0Y2g7CisKKyAgICBpbnRlcmZhY2UgRGlzcGF0Y2ggeworICAgICAgICBvbih0eXBlOiBzdHJpbmcpOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7CisgICAgICAgIG9uKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogRGlzcGF0Y2g7CisgICAgICAgIFtldmVudDogc3RyaW5nXTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkOworICAgIH0KKworICAgIGV4cG9ydCBtb2R1bGUgc2NhbGUgeworICAgICAgICBleHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoKTogSWRlbnRpdHk7CisKKyAgICAgICAgaW50ZXJmYWNlIElkZW50aXR5IHsKKyAgICAgICAgICAgIChuOiBudW1iZXIpOiBudW1iZXI7CisgICAgICAgICAgICBpbnZlcnQobjogbnVtYmVyKTogbnVtYmVyOworCisgICAgICAgICAgICBkb21haW4oKTogbnVtYmVyW107CisgICAgICAgICAgICBkb21haW4obnVtYmVyczogbnVtYmVyW10pOiBJZGVudGl0eTsKKworICAgICAgICAgICAgcmFuZ2UoKTogbnVtYmVyW107CisgICAgICAgICAgICByYW5nZShudW1iZXJzOiBudW1iZXJbXSk6IElkZW50aXR5OworCisgICAgICAgICAgICB0aWNrcyhjb3VudD86IG51bWJlcik6IG51bWJlcltdOworCisgICAgICAgICAgICB0aWNrRm9ybWF0KGNvdW50PzogbnVtYmVyLCBmb3JtYXQ/OiBzdHJpbmcpOiAobjogbnVtYmVyKSA9PiBzdHJpbmc7CisKKyAgICAgICAgICAgIGNvcHkoKTogSWRlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gbGluZWFyKCk6IExpbmVhcjxudW1iZXIsIG51bWJlcj47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBsaW5lYXI8T3V0cHV0PigpOiBMaW5lYXI8T3V0cHV0LCBPdXRwdXQ+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gbGluZWFyPFJhbmdlLCBPdXRwdXQ+KCk6IExpbmVhcjxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICBpbnRlcmZhY2UgTGluZWFyPFJhbmdlLCBPdXRwdXQ+IHsKKyAgICAgICAgICAgICh4OiBudW1iZXIpOiBPdXRwdXQ7CisgICAgICAgICAgICBpbnZlcnQoeTogbnVtYmVyKTogbnVtYmVyOworCisgICAgICAgICAgICBkb21haW4oKTogbnVtYmVyW107CisgICAgICAgICAgICBkb21haW4obnVtYmVyczogbnVtYmVyW10pOiBMaW5lYXI8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIHJhbmdlKCk6IFJhbmdlW107CisgICAgICAgICAgICByYW5nZSh2YWx1ZXM6IFJhbmdlW10pOiBMaW5lYXI8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIHJhbmdlUm91bmQodmFsdWVzOiBudW1iZXJbXSk6IExpbmVhcjxudW1iZXIsIG51bWJlcj47CisKKyAgICAgICAgICAgIGludGVycG9sYXRlKCk6IChhOiBSYW5nZSwgYjogUmFuZ2UpID0+ICh0OiBudW1iZXIpID0+IE91dHB1dDsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGZhY3Rvcnk6IChhOiBSYW5nZSwgYjogUmFuZ2UpID0+ICh0OiBudW1iZXIpID0+IE91dHB1dCk6IExpbmVhcjxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICAgICAgY2xhbXAoKTogYm9vbGVhbjsKKyAgICAgICAgICAgIGNsYW1wKGNsYW1wOiBib29sZWFuKTogTGluZWFyPFJhbmdlLCBPdXRwdXQ+OworCisgICAgICAgICAgICBuaWNlKGNvdW50PzogbnVtYmVyKTogTGluZWFyPFJhbmdlLCBPdXRwdXQ+OworCisgICAgICAgICAgICB0aWNrcyhjb3VudD86IG51bWJlcik6IG51bWJlcltdOworCisgICAgICAgICAgICB0aWNrRm9ybWF0KGNvdW50PzogbnVtYmVyLCBmb3JtYXQ/OiBzdHJpbmcpOiAobjogbnVtYmVyKSA9PiBzdHJpbmc7CisKKyAgICAgICAgICAgIGNvcHkoKTogTGluZWFyPFJhbmdlLCBPdXRwdXQ+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHNxcnQoKTogUG93PG51bWJlciwgbnVtYmVyPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHNxcnQ8T3V0cHV0PigpOiBQb3c8T3V0cHV0LCBPdXRwdXQ+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gc3FydDxSYW5nZSwgT3V0cHV0PigpOiBQb3c8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHBvdygpOiBQb3c8bnVtYmVyLCBudW1iZXI+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gcG93PE91dHB1dD4oKTogUG93PE91dHB1dCwgT3V0cHV0PjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHBvdzxSYW5nZSwgT3V0cHV0PigpOiBQb3c8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgaW50ZXJmYWNlIFBvdzxSYW5nZSwgT3V0cHV0PiB7CisgICAgICAgICAgICAoeDogbnVtYmVyKTogT3V0cHV0OworCisgICAgICAgICAgICBpbnZlcnQoeTogbnVtYmVyKTogbnVtYmVyOworCisgICAgICAgICAgICBkb21haW4oKTogbnVtYmVyW107CisgICAgICAgICAgICBkb21haW4obnVtYmVyczogbnVtYmVyW10pOiBQb3c8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIHJhbmdlKCk6IFJhbmdlW107CisgICAgICAgICAgICByYW5nZSh2YWx1ZXM6IFJhbmdlW10pOiBQb3c8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIHJhbmdlUm91bmQodmFsdWVzOiBudW1iZXJbXSk6IFBvdzxudW1iZXIsIG51bWJlcj47CisKKyAgICAgICAgICAgIGV4cG9uZW50KCk6IG51bWJlcjsKKyAgICAgICAgICAgIGV4cG9uZW50KGs6IG51bWJlcik6IFBvdzxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICAgICAgaW50ZXJwb2xhdGUoKTogKGE6IFJhbmdlLCBiOiBSYW5nZSkgPT4gKHQ6IG51bWJlcikgPT4gT3V0cHV0OworICAgICAgICAgICAgaW50ZXJwb2xhdGUoZmFjdG9yeTogKGE6IFJhbmdlLCBiOiBSYW5nZSkgPT4gKHQ6IG51bWJlcikgPT4gT3V0cHV0KTogUG93PFJhbmdlLCBPdXRwdXQ+OworCisgICAgICAgICAgICBjbGFtcCgpOiBib29sZWFuOworICAgICAgICAgICAgY2xhbXAoY2xhbXA6IGJvb2xlYW4pOiBQb3c8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIG5pY2UobT86IG51bWJlcik6IFBvdzxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICAgICAgdGlja3MoY291bnQ/OiBudW1iZXIpOiBudW1iZXJbXTsKKworICAgICAgICAgICAgdGlja0Zvcm1hdChjb3VudD86IG51bWJlciwgZm9ybWF0Pzogc3RyaW5nKTogKG46IG51bWJlcikgPT4gc3RyaW5nOworCisgICAgICAgICAgICBjb3B5KCk6IFBvdzxSYW5nZSwgT3V0cHV0PjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBsb2coKTogTG9nPG51bWJlciwgbnVtYmVyPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGxvZzxPdXRwdXQ+KCk6IExvZzxPdXRwdXQsIE91dHB1dD47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBsb2c8UmFuZ2UsIE91dHB1dD4oKTogTG9nPFJhbmdlLCBPdXRwdXQ+OworCisgICAgICAgIGludGVyZmFjZSBMb2c8UmFuZ2UsIE91dHB1dD4geworICAgICAgICAgICAgKHg6IG51bWJlcik6IE91dHB1dDsKKworICAgICAgICAgICAgaW52ZXJ0KHk6IG51bWJlcik6IG51bWJlcjsKKworICAgICAgICAgICAgZG9tYWluKCk6IG51bWJlcltdOworICAgICAgICAgICAgZG9tYWluKG51bWJlcnM6IG51bWJlcltdKTogTG9nPFJhbmdlLCBPdXRwdXQ+OworCisgICAgICAgICAgICByYW5nZSgpOiBSYW5nZVtdOworICAgICAgICAgICAgcmFuZ2UodmFsdWVzOiBSYW5nZVtdKTogTG9nPFJhbmdlLCBPdXRwdXQ+OworCisgICAgICAgICAgICByYW5nZVJvdW5kKHZhbHVlczogbnVtYmVyW10pOiBMb2c8bnVtYmVyLCBudW1iZXI+OworCisgICAgICAgICAgICBiYXNlKCk6IG51bWJlcjsKKyAgICAgICAgICAgIGJhc2UoYmFzZTogbnVtYmVyKTogTG9nPFJhbmdlLCBPdXRwdXQ+OworCisgICAgICAgICAgICBpbnRlcnBvbGF0ZSgpOiAoYTogUmFuZ2UsIGI6IFJhbmdlKSA9PiAodDogbnVtYmVyKSA9PiBPdXRwdXQ7CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShmYWN0b3J5OiAoYTogUmFuZ2UsIGI6IFJhbmdlKSA9PiAodDogbnVtYmVyKSA9PiBPdXRwdXQpOiBMb2c8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIGNsYW1wKCk6IGJvb2xlYW47CisgICAgICAgICAgICBjbGFtcChjbGFtcDogYm9vbGVhbik6IExvZzxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICAgICAgbmljZSgpOiBMb2c8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIHRpY2tzKCk6IG51bWJlcltdOworCisgICAgICAgICAgICB0aWNrRm9ybWF0KGNvdW50PzogbnVtYmVyLCBmb3JtYXQ/OiBzdHJpbmcpOiAodDogbnVtYmVyKSA9PiBzdHJpbmc7CisKKyAgICAgICAgICAgIGNvcHkoKTogTG9nPFJhbmdlLCBPdXRwdXQ+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHF1YW50aXplPFQ+KCk6IFF1YW50aXplPFQ+OworCisgICAgICAgIGludGVyZmFjZSBRdWFudGl6ZTxUPiB7CisgICAgICAgICAgICAoeDogbnVtYmVyKTogVDsKKworICAgICAgICAgICAgaW52ZXJ0RXh0ZW50KHk6IFQpOiBbbnVtYmVyLCBudW1iZXJdOworCisgICAgICAgICAgICBkb21haW4oKTogbnVtYmVyW107CisgICAgICAgICAgICBkb21haW4obnVtYmVyczogbnVtYmVyW10pOiBRdWFudGl6ZTxUPjsKKworICAgICAgICAgICAgcmFuZ2UoKTogVFtdOworICAgICAgICAgICAgcmFuZ2UodmFsdWVzOiBUW10pOiBRdWFudGl6ZTxUPjsKKworICAgICAgICAgICAgY29weSgpOiBRdWFudGl6ZTxUPjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZTxUPigpOiBRdWFudGlsZTxUPjsKKworICAgICAgICBpbnRlcmZhY2UgUXVhbnRpbGU8VD4geworICAgICAgICAgICAgKHg6IG51bWJlcik6IFQ7CisKKyAgICAgICAgICAgIGludmVydEV4dGVudCh5OiBUKTogW251bWJlciwgbnVtYmVyXTsKKworICAgICAgICAgICAgZG9tYWluKCk6IG51bWJlcltdOworICAgICAgICAgICAgZG9tYWluKG51bWJlcnM6IG51bWJlcltdKTogUXVhbnRpbGU8VD47CisKKyAgICAgICAgICAgIHJhbmdlKCk6IFRbXTsKKyAgICAgICAgICAgIHJhbmdlKHZhbHVlczogVFtdKTogUXVhbnRpbGU8VD47CisKKyAgICAgICAgICAgIHF1YW50aWxlcygpOiBudW1iZXJbXTsKKworICAgICAgICAgICAgY29weSgpOiBRdWFudGlsZTxUPjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB0aHJlc2hvbGQ8UmFuZ2U+KCk6IFRocmVzaG9sZDxudW1iZXIsIFJhbmdlPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHRocmVzaG9sZDxEb21haW4sIFJhbmdlPigpOiBUaHJlc2hvbGQ8RG9tYWluLCBSYW5nZT47CisKKyAgICAgICAgaW50ZXJmYWNlIFRocmVzaG9sZDxEb21haW4sIFJhbmdlPiB7CisgICAgICAgICAgICAoeDogbnVtYmVyKTogUmFuZ2U7CisKKyAgICAgICAgICAgIGludmVydEV4dGVudCh5OiBSYW5nZSk6IFtEb21haW4sIERvbWFpbl07CisKKyAgICAgICAgICAgIGRvbWFpbigpOiBEb21haW5bXTsKKyAgICAgICAgICAgIGRvbWFpbihkb21haW46IERvbWFpbltdKTogVGhyZXNob2xkPERvbWFpbiwgUmFuZ2U+OworCisgICAgICAgICAgICByYW5nZSgpOiBSYW5nZVtdOworICAgICAgICAgICAgcmFuZ2UodmFsdWVzOiBSYW5nZVtdKTogVGhyZXNob2xkPERvbWFpbiwgUmFuZ2U+OworCisgICAgICAgICAgICBjb3B5KCk6IFRocmVzaG9sZDxEb21haW4sIFJhbmdlPjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBvcmRpbmFsPFJhbmdlPigpOiBPcmRpbmFsPHN0cmluZywgUmFuZ2U+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gb3JkaW5hbDxEb21haW4gZXh0ZW5kcyB7IHRvU3RyaW5nKCk6IHN0cmluZyB9LCBSYW5nZT4oKTogT3JkaW5hbDxEb21haW4sIFJhbmdlPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5MTAoKTogT3JkaW5hbDxzdHJpbmcsIHN0cmluZz47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeTEwPERvbWFpbiBleHRlbmRzIHsgdG9TdHJpbmcoKTogc3RyaW5nIH0+KCk6IE9yZGluYWw8RG9tYWluLCBzdHJpbmc+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkyMCgpOiBPcmRpbmFsPHN0cmluZywgc3RyaW5nPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5MjA8RG9tYWluIGV4dGVuZHMgeyB0b1N0cmluZygpOiBzdHJpbmcgfT4oKTogT3JkaW5hbDxEb21haW4sIHN0cmluZz47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeTIwYigpOiBPcmRpbmFsPHN0cmluZywgc3RyaW5nPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5MjBiPERvbWFpbiBleHRlbmRzIHsgdG9TdHJpbmcoKTogc3RyaW5nIH0+KCk6IE9yZGluYWw8RG9tYWluLCBzdHJpbmc+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkyMGMoKTogT3JkaW5hbDxzdHJpbmcsc3RyaW5nPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5MjBjPERvbWFpbiBleHRlbmRzIHsgdG9TdHJpbmcoKTogc3RyaW5nIH0+KCk6IE9yZGluYWw8RG9tYWluLCBzdHJpbmc+OworCisgICAgICAgIGludGVyZmFjZSBPcmRpbmFsPERvbWFpbiBleHRlbmRzIHsgdG9TdHJpbmcoKTogc3RyaW5nIH0sIFJhbmdlPiB7CisgICAgICAgICAgICAoeDogRG9tYWluKTogUmFuZ2U7CisKKyAgICAgICAgICAgIGRvbWFpbigpOiBEb21haW5bXTsKKyAgICAgICAgICAgIGRvbWFpbih2YWx1ZXM6IERvbWFpbltdKTogT3JkaW5hbDxEb21haW4sIFJhbmdlPjsKKworICAgICAgICAgICAgcmFuZ2UoKTogUmFuZ2VbXTsKKyAgICAgICAgICAgIHJhbmdlKHZhbHVlczogUmFuZ2VbXSk6IE9yZGluYWw8RG9tYWluLCBSYW5nZT47CisKKyAgICAgICAgICAgIHJhbmdlUG9pbnRzKGludGVydmFsOiBbbnVtYmVyLCBudW1iZXJdLCBwYWRkaW5nPzogbnVtYmVyKTogT3JkaW5hbDxEb21haW4sIG51bWJlcj47CisgICAgICAgICAgICByYW5nZVJvdW5kUG9pbnRzKGludGVydmFsOiBbbnVtYmVyLCBudW1iZXJdLCBwYWRkaW5nPzogbnVtYmVyKTogT3JkaW5hbDxEb21haW4sIG51bWJlcj47CisKKyAgICAgICAgICAgIHJhbmdlQmFuZHMoaW50ZXJ2YWw6IFtudW1iZXIsIG51bWJlcl0sIHBhZGRpbmc/OiBudW1iZXIsIG91dGVyUGFkZGluZz86IG51bWJlcik6IE9yZGluYWw8RG9tYWluLCBudW1iZXI+OworICAgICAgICAgICAgcmFuZ2VSb3VuZEJhbmRzKGludGVydmFsOiBbbnVtYmVyLCBudW1iZXJdLCBwYWRkaW5nPzogbnVtYmVyLCBvdXRlclBhZGRpbmc/OiBudW1iZXIpOiBPcmRpbmFsPERvbWFpbiwgbnVtYmVyPjsKKworICAgICAgICAgICAgcmFuZ2VCYW5kKCk6IG51bWJlcjsKKyAgICAgICAgICAgIHJhbmdlRXh0ZW50KCk6IFtudW1iZXIsIG51bWJlcl07CisKKyAgICAgICAgICAgIGNvcHkoKTogT3JkaW5hbDxEb21haW4sIFJhbmdlPjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZShhOiBudW1iZXIsIGI6IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGUoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiAodDogbnVtYmVyKSA9PiBzdHJpbmc7CisgICAgZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlKGE6IHN0cmluZyB8IENvbG9yLCBiOiBDb2xvcik6ICh0OiBudW1iZXIpID0+IHN0cmluZzsKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGUoYTogQXJyYXk8c3RyaW5nIHwgQ29sb3I+LCBiOiBDb2xvcltdKTogKHQ6IG51bWJlcikgPT4gc3RyaW5nOworICAgIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZTxSYW5nZSwgT3V0cHV0PihhOiBSYW5nZVtdLCBiOiBPdXRwdXRbXSk6ICh0OiBudW1iZXIpID0+IE91dHB1dFtdOworICAgIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZTxSYW5nZSwgT3V0cHV0PihhOiBSYW5nZVtdLCBiOiBSYW5nZVtdKTogKHQ6IG51bWJlcikgPT4gT3V0cHV0W107CisgICAgZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlKGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgQ29sb3IgfSwgYjogeyBba2V5OiBzdHJpbmddOiBDb2xvciB9KTogKHQ6IG51bWJlcikgPT4geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTsKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGU8UmFuZ2UsIE91dHB1dD4oYTogeyBba2V5OiBzdHJpbmddOiBSYW5nZSB9LCBiOiB7IFtrZXk6IHN0cmluZ106IE91dHB1dCB9KTogKHQ6IG51bWJlcikgPT4geyBba2V5OiBzdHJpbmddOiBPdXRwdXQgfTsKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGU8UmFuZ2UsIE91dHB1dD4oYTogeyBba2V5OiBzdHJpbmddOiBSYW5nZSB9LCBiOiB7IFtrZXk6IHN0cmluZ106IFJhbmdlIH0pOiAodDogbnVtYmVyKSA9PiB7IFtrZXk6IHN0cmluZ106IE91dHB1dCB9OworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlTnVtYmVyKGE6IG51bWJlciwgYjogbnVtYmVyKTogKHQ6IG51bWJlcikgPT4gbnVtYmVyOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlUm91bmQoYTogbnVtYmVyLCBiOiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVTdHJpbmcoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiAodDogbnVtYmVyKSA9PiBzdHJpbmc7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVSZ2IoYTogc3RyaW5nIHwgQ29sb3IsIGI6IHN0cmluZyB8IENvbG9yKTogKHQ6IG51bWJlcikgPT4gc3RyaW5nOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlSHNsKGE6IHN0cmluZyB8IENvbG9yLCBiOiBzdHJpbmcgfCBDb2xvcik6ICh0OiBudW1iZXIpID0+IHN0cmluZzsKKworICAgIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUxhYihhOiBzdHJpbmcgfCBDb2xvciwgYjogc3RyaW5nIHwgQ29sb3IpOiAodDogbnVtYmVyKSA9PiBzdHJpbmc7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVIY2woYTogc3RyaW5nIHwgQ29sb3IsIGI6IHN0cmluZyB8IENvbG9yKTogKHQ6IG51bWJlcikgPT4gc3RyaW5nOworCisgICAgZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlQXJyYXkoYTogQXJyYXk8c3RyaW5nIHwgQ29sb3I+LCBiOiBDb2xvcltdKTogKHQ6IG51bWJlcikgPT4gc3RyaW5nW107CisgICAgZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlQXJyYXk8UmFuZ2UsIE91dHB1dD4oYTogUmFuZ2VbXSwgYjogUmFuZ2VbXSk6ICh0OiBudW1iZXIpID0+IE91dHB1dFtdOworICAgIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUFycmF5PFJhbmdlLCBPdXRwdXQ+KGE6IFJhbmdlW10sIGI6IE91dHB1dFtdKTogKHQ6IG51bWJlcikgPT4gT3V0cHV0W107CisKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVPYmplY3QoYTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBDb2xvciB9LCBiOiB7IFtrZXk6IHN0cmluZ106IENvbG9yIH0pOiAodDogbnVtYmVyKSA9PiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9OworICAgIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZU9iamVjdDxSYW5nZSwgT3V0cHV0PihhOiB7IFtrZXk6IHN0cmluZ106IFJhbmdlIH0sIGI6IHsgW2tleTogc3RyaW5nXTogT3V0cHV0IH0pOiAodDogbnVtYmVyKSA9PiB7IFtrZXk6IHN0cmluZ106IE91dHB1dCB9OworICAgIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZU9iamVjdDxSYW5nZSwgT3V0cHV0PihhOiB7IFtrZXk6IHN0cmluZ106IFJhbmdlIH0sIGI6IHsgW2tleTogc3RyaW5nXTogUmFuZ2UgfSk6ICh0OiBudW1iZXIpID0+IHsgW2tleTogc3RyaW5nXTogT3V0cHV0IH07CisKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0oYTogc3RyaW5nIHwgVHJhbnNmb3JtLCBiOiBzdHJpbmcgfCBUcmFuc2Zvcm0pOiAodDogbnVtYmVyKSA9PiBzdHJpbmc7CisKKyAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVab29tKGE6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogeworICAgICAgICAodDogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOworICAgICAgICBkdXJhdGlvbjogbnVtYmVyOworICAgIH07CisKKyAgICBleHBvcnQgdmFyIGludGVycG9sYXRvcnM6IEFycmF5PChhOiBhbnksIGI6IGFueSkgPT4gKHQ6IG51bWJlcikgPT4gYW55PjsKKworICAgIGV4cG9ydCBtb2R1bGUgdGltZSB7CisgICAgICAgIGV4cG9ydCB2YXIgc2Vjb25kOiBJbnRlcnZhbDsKKyAgICAgICAgZXhwb3J0IHZhciBtaW51dGU6IEludGVydmFsOworICAgICAgICBleHBvcnQgdmFyIGhvdXI6IEludGVydmFsOworICAgICAgICBleHBvcnQgdmFyIGRheTogSW50ZXJ2YWw7CisgICAgICAgIGV4cG9ydCB2YXIgd2VlazogSW50ZXJ2YWw7CisgICAgICAgIGV4cG9ydCB2YXIgc3VuZGF5OiBJbnRlcnZhbDsKKyAgICAgICAgZXhwb3J0IHZhciBtb25kYXk6IEludGVydmFsOworICAgICAgICBleHBvcnQgdmFyIHR1ZXNkYXk6IEludGVydmFsOworICAgICAgICBleHBvcnQgdmFyIHdlZG5lc2RheTogSW50ZXJ2YWw7CisgICAgICAgIGV4cG9ydCB2YXIgdGh1cnNkYXk6IEludGVydmFsOworICAgICAgICBleHBvcnQgdmFyIGZyaWRheTogSW50ZXJ2YWw7CisgICAgICAgIGV4cG9ydCB2YXIgc2F0dXJkYXk6IEludGVydmFsOworICAgICAgICBleHBvcnQgdmFyIG1vbnRoOiBJbnRlcnZhbDsKKyAgICAgICAgZXhwb3J0IHZhciB5ZWFyOiBJbnRlcnZhbDsKKworICAgICAgICBpbnRlcmZhY2UgSW50ZXJ2YWwgeworICAgICAgICAgICAgKGQ6IERhdGUpOiBEYXRlOworCisgICAgICAgICAgICBmbG9vcihkOiBEYXRlKTogRGF0ZTsKKworICAgICAgICAgICAgcm91bmQoZDogRGF0ZSk6IERhdGU7CisKKyAgICAgICAgICAgIGNlaWwoZDogRGF0ZSk6IERhdGU7CisKKyAgICAgICAgICAgIHJhbmdlKHN0YXJ0OiBEYXRlLCBzdG9wOiBEYXRlLCBzdGVwPzogbnVtYmVyKTogRGF0ZVtdOworCisgICAgICAgICAgICBvZmZzZXQoZGF0ZTogRGF0ZSwgc3RlcDogbnVtYmVyKTogRGF0ZTsKKworICAgICAgICAgICAgdXRjOiB7CisgICAgICAgICAgICAgICAgKGQ6IERhdGUpOiBEYXRlOworCisgICAgICAgICAgICAgICAgZmxvb3IoZDogRGF0ZSk6IERhdGU7CisKKyAgICAgICAgICAgICAgICByb3VuZChkOiBEYXRlKTogRGF0ZTsKKworICAgICAgICAgICAgICAgIGNlaWwoZDogRGF0ZSk6IERhdGU7CisKKyAgICAgICAgICAgICAgICByYW5nZShzdGFydDogRGF0ZSwgc3RvcDogRGF0ZSwgc3RlcD86IG51bWJlcik6IERhdGVbXTsKKworICAgICAgICAgICAgICAgIG9mZnNldChkYXRlOiBEYXRlLCBzdGVwOiBudW1iZXIpOiBEYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHNlY29uZHMoc3RhcnQ6IERhdGUsIHN0b3A6IERhdGUsIHN0ZXA/OiBudW1iZXIpOiBEYXRlW107CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBtaW51dGVzKHN0YXJ0OiBEYXRlLCBzdG9wOiBEYXRlLCBzdGVwPzogbnVtYmVyKTogRGF0ZVtdOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gaG91cnMoc3RhcnQ6IERhdGUsIHN0b3A6IERhdGUsIHN0ZXA/OiBudW1iZXIpOiBEYXRlW107CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBkYXlzKHN0YXJ0OiBEYXRlLCBzdG9wOiBEYXRlLCBzdGVwPzogbnVtYmVyKTogRGF0ZVtdOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gd2Vla3Moc3RhcnQ6IERhdGUsIHN0b3A6IERhdGUsIHN0ZXA/OiBudW1iZXIpOiBEYXRlW107CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBzdW5kYXlzKHN0YXJ0OiBEYXRlLCBzdG9wOiBEYXRlLCBzdGVwPzogbnVtYmVyKTogRGF0ZVtdOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gbW9uZGF5cyhzdGFydDogRGF0ZSwgc3RvcDogRGF0ZSwgc3RlcD86IG51bWJlcik6IERhdGVbXTsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHR1ZXNkYXlzKHN0YXJ0OiBEYXRlLCBzdG9wOiBEYXRlLCBzdGVwPzogbnVtYmVyKTogRGF0ZVtdOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gd2VkbmVzZGF5cyhzdGFydDogRGF0ZSwgc3RvcDogRGF0ZSwgc3RlcD86IG51bWJlcik6IERhdGVbXTsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHRodXJzZGF5cyhzdGFydDogRGF0ZSwgc3RvcDogRGF0ZSwgc3RlcD86IG51bWJlcik6IERhdGVbXTsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGZyaWRheXMoc3RhcnQ6IERhdGUsIHN0b3A6IERhdGUsIHN0ZXA/OiBudW1iZXIpOiBEYXRlW107CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBzYXR1cmRheXMoc3RhcnQ6IERhdGUsIHN0b3A6IERhdGUsIHN0ZXA/OiBudW1iZXIpOiBEYXRlW107CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBtb250aHMoc3RhcnQ6IERhdGUsIHN0b3A6IERhdGUsIHN0ZXA/OiBudW1iZXIpOiBEYXRlW107CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB5ZWFycyhzdGFydDogRGF0ZSwgc3RvcDogRGF0ZSwgc3RlcD86IG51bWJlcik6IERhdGVbXTsKKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gZGF5T2ZZZWFyKGQ6IERhdGUpOiBudW1iZXI7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB3ZWVrT2ZZZWFyKGQ6IERhdGUpOiBudW1iZXI7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBzdW5kYXlPZlllYXIoZDogRGF0ZSk6IG51bWJlcjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIG1vbmRheU9mWWVhcihkOiBEYXRlKTogbnVtYmVyOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gdHVlc2RheU9mWWVhcihkOiBEYXRlKTogbnVtYmVyOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gd2VkbmVzZGF5T2ZZZWFyKGQ6IERhdGUpOiBudW1iZXI7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBmcmlkYXlPZlllYXIoZDogRGF0ZSk6IG51bWJlcjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHNhdHVyZGF5T2ZZZWFyKGQ6IERhdGUpOiBudW1iZXI7CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChzcGVjaWZpZXI6IHN0cmluZyk6IEZvcm1hdDsKKworICAgICAgICBleHBvcnQgbW9kdWxlIGZvcm1hdCB7CisgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gbXVsdGkoZm9ybWF0czogQXJyYXk8W3N0cmluZywgKGQ6IERhdGUpID0+IGJvb2xlYW5dPik6IEZvcm1hdDsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB1dGMoc3BlY2lmaWVyOiBzdHJpbmcpOiBGb3JtYXQ7CisgICAgICAgICAgICBleHBvcnQgdmFyIGlzbzogRm9ybWF0OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIEZvcm1hdCB7CisgICAgICAgICAgICAoZDogRGF0ZSk6IHN0cmluZzsKKyAgICAgICAgICAgIHBhcnNlKGlucHV0OiBzdHJpbmcpOiBEYXRlOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKCk6IFNjYWxlPG51bWJlciwgbnVtYmVyPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlPE91dHB1dD4oKTogU2NhbGU8T3V0cHV0LCBPdXRwdXQ+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gc2NhbGU8UmFuZ2UsIE91dHB1dD4oKTogU2NhbGU8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgZXhwb3J0IG1vZHVsZSBzY2FsZSB7CisgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gdXRjKCk6IFNjYWxlPG51bWJlciwgbnVtYmVyPjsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB1dGM8T3V0cHV0PigpOiBTY2FsZTxPdXRwdXQsIE91dHB1dD47CisgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gdXRjPFJhbmdlLCBPdXRwdXQ+KCk6IFNjYWxlPFJhbmdlLCBPdXRwdXQ+OworICAgICAgICB9CisKKworICAgICAgICBpbnRlcmZhY2UgU2NhbGU8UmFuZ2UsIE91dHB1dD4geworICAgICAgICAgICAgKHg6IERhdGUpOiBPdXRwdXQ7CisKKyAgICAgICAgICAgIGludmVydCh5OiBudW1iZXIpOiBEYXRlOworCisgICAgICAgICAgICBkb21haW4oKTogRGF0ZVtdOworICAgICAgICAgICAgZG9tYWluKGRhdGVzOiBudW1iZXJbXSk6IFNjYWxlPFJhbmdlLCBPdXRwdXQ+OworICAgICAgICAgICAgZG9tYWluKGRhdGVzOiBEYXRlW10pOiBTY2FsZTxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICAgICAgbmljZSgpOiBTY2FsZTxSYW5nZSwgT3V0cHV0PjsKKyAgICAgICAgICAgIG5pY2UoaW50ZXJ2YWw6IEludGVydmFsLCBzdGVwPzogbnVtYmVyKTogU2NhbGU8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIHJhbmdlKCk6IFJhbmdlW107CisgICAgICAgICAgICByYW5nZSh2YWx1ZXM6IFJhbmdlW10pOiBTY2FsZTxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICAgICAgcmFuZ2VSb3VuZCh2YWx1ZXM6IG51bWJlcltdKTogU2NhbGU8bnVtYmVyLCBudW1iZXI+OworCisgICAgICAgICAgICBpbnRlcnBvbGF0ZSgpOiAoYTogUmFuZ2UsIGI6IFJhbmdlKSA9PiAodDogbnVtYmVyKSA9PiBPdXRwdXQ7CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShmYWN0b3J5OiAoYTogUmFuZ2UsIGI6IFJhbmdlKSA9PiAodDogbnVtYmVyKSA9PiBPdXRwdXQpOiBTY2FsZTxSYW5nZSwgT3V0cHV0PjsKKworICAgICAgICAgICAgY2xhbXAoKTogYm9vbGVhbjsKKyAgICAgICAgICAgIGNsYW1wKGNsYW1wOiBib29sZWFuKTogU2NhbGU8UmFuZ2UsIE91dHB1dD47CisKKyAgICAgICAgICAgIHRpY2tzKCk6IERhdGVbXTsKKyAgICAgICAgICAgIHRpY2tzKGludGVydmFsOiBJbnRlcnZhbCwgc3RlcD86IG51bWJlcik6IERhdGVbXTsKKyAgICAgICAgICAgIHRpY2tzKGNvdW50OiBudW1iZXIpOiBEYXRlW107CisKKyAgICAgICAgICAgIHRpY2tGb3JtYXQoY291bnQ6IG51bWJlcik6IChkOiBEYXRlKSA9PiBzdHJpbmc7CisKKyAgICAgICAgICAgIGNvcHkoKTogU2NhbGU8UmFuZ2UsIE91dHB1dD47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgbW9kdWxlIGJlaGF2aW9yIHsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGRyYWc8RGF0dW0+KCk6IERyYWc8RGF0dW0+OworCisgICAgICAgIGludGVyZmFjZSBEcmFnPERhdHVtPiB7CisgICAgICAgICAgICAoc2VsZWN0aW9uOiBTZWxlY3Rpb248RGF0dW0+KTogdm9pZDsKKworICAgICAgICAgICAgb24odHlwZTogc3RyaW5nKTogKGQ6IERhdHVtLCBpOiBudW1iZXIpID0+IGFueTsKKyAgICAgICAgICAgIG9uKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IChkOiBEYXR1bSwgaTogbnVtYmVyKSA9PiBhbnkpOiBEcmFnPERhdHVtPjsKKworICAgICAgICAgICAgb3JpZ2luKCk6IChkOiBEYXR1bSwgaTogbnVtYmVyKSA9PiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07CisgICAgICAgICAgICBvcmlnaW4oYWNjZXNzb3I6IChkOiBEYXR1bSwgaTogbnVtYmVyKSA9PiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiBEcmFnPERhdHVtPjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB6b29tPERhdHVtPigpOiBab29tPERhdHVtPjsKKworICAgICAgICBtb2R1bGUgem9vbSB7CisgICAgICAgICAgICBpbnRlcmZhY2UgU2NhbGUgeworICAgICAgICAgICAgICAgIGRvbWFpbigpOiBudW1iZXJbXTsKKyAgICAgICAgICAgICAgICBkb21haW4odmFsdWVzOiBudW1iZXJbXSk6IFNjYWxlOworCisgICAgICAgICAgICAgICAgaW52ZXJ0KHk6IG51bWJlcik6IG51bWJlcjsKKworICAgICAgICAgICAgICAgIHJhbmdlKHZhbHVlczogbnVtYmVyW10pOiBTY2FsZTsKKyAgICAgICAgICAgICAgICByYW5nZSgpOiBudW1iZXJbXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBab29tPERhdHVtPiB7CisgICAgICAgICAgICAoc2VsZWN0aW9uOiBTZWxlY3Rpb248RGF0dW0+KTogdm9pZDsKKworICAgICAgICAgICAgdHJhbnNsYXRlKCk6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICB0cmFuc2xhdGUodHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdKTogWm9vbTxEYXR1bT47CisKKyAgICAgICAgICAgIHNjYWxlKCk6IG51bWJlcjsKKyAgICAgICAgICAgIHNjYWxlKHNjYWxlOiBudW1iZXIpOiBab29tPERhdHVtPjsKKworICAgICAgICAgICAgc2NhbGVFeHRlbnQoKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIHNjYWxlRXh0ZW50KGV4dGVudDogW251bWJlciwgbnVtYmVyXSk6IFpvb208RGF0dW0+OworCisgICAgICAgICAgICBjZW50ZXIoKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIGNlbnRlcihjZW50ZXI6IFtudW1iZXIsIG51bWJlcl0pOiBab29tPERhdHVtPjsKKworICAgICAgICAgICAgc2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgc2l6ZShzaXplOiBbbnVtYmVyLCBudW1iZXJdKTogWm9vbTxEYXR1bT47CisKKyAgICAgICAgICAgIHgoKTogem9vbS5TY2FsZTsKKyAgICAgICAgICAgIHgoeDogem9vbS5TY2FsZSk6IFpvb208RGF0dW0+OworCisgICAgICAgICAgICB5KCk6IHpvb20uU2NhbGU7CisgICAgICAgICAgICB5KHk6IHpvb20uU2NhbGUpOiBab29tPERhdHVtPjsKKworICAgICAgICAgICAgb24odHlwZTogc3RyaW5nKTogKGQ6IERhdHVtLCBpOiBudW1iZXIpID0+IGFueTsKKyAgICAgICAgICAgIG9uKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6IChkOiBEYXR1bSwgaTogbnVtYmVyKSA9PiBhbnkpOiBab29tPERhdHVtPjsKKworICAgICAgICAgICAgZXZlbnQoc2VsZWN0aW9uOiBTZWxlY3Rpb248RGF0dW0+KTogdm9pZDsKKyAgICAgICAgICAgIGV2ZW50KHRyYW5zaXRpb246IFRyYW5zaXRpb248RGF0dW0+KTogdm9pZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV4cG9ydCBtb2R1bGUgZ2VvIHsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHBhdGgoKTogUGF0aDsKKworICAgICAgICBpbnRlcmZhY2UgUGF0aCB7CisgICAgICAgICAgICAoZmVhdHVyZTogYW55LCBpbmRleD86IG51bWJlcik6IHN0cmluZzsKKworICAgICAgICAgICAgYXJlYShmZWF0dXJlOiBhbnkpOiBudW1iZXI7CisKKyAgICAgICAgICAgIGNlbnRyb2lkKGZlYXR1cmU6IGFueSk6IFtudW1iZXIsIG51bWJlcl07CisKKyAgICAgICAgICAgIGJvdW5kcyhmZWF0dXJlOiBhbnkpOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07CisKKyAgICAgICAgICAgIHByb2plY3Rpb24oKTogVHJhbnNmb3JtIHwgKChjb29yZGluYXRlczogW251bWJlciwgbnVtYmVyXSkgPT4gW251bWJlciwgbnVtYmVyXSk7CisgICAgICAgICAgICBwcm9qZWN0aW9uKHN0cmVhbTogVHJhbnNmb3JtKTogUGF0aDsKKyAgICAgICAgICAgIHByb2plY3Rpb24ocHJvamVjdGlvbjogKGNvb3JkaW5hdGVzOiBbbnVtYmVyLCBudW1iZXJdKSA9PiBbbnVtYmVyLCBudW1iZXJdKTogUGF0aDsKKworICAgICAgICAgICAgcG9pbnRSYWRpdXMoKTogbnVtYmVyIHwgKChkYXR1bTogYW55LCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgcG9pbnRSYWRpdXMocmFkaXVzOiBudW1iZXIpOiBQYXRoOworICAgICAgICAgICAgcG9pbnRSYWRpdXMocmFkaXVzOiAoZGF0dW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogUGF0aDsKKworICAgICAgICAgICAgY29udGV4dCgpOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7CisgICAgICAgICAgICBjb250ZXh0KGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk6IFBhdGg7CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gZ3JhdGljdWxlKCk6IEdyYXRpY3VsZTsKKworICAgICAgICBpbnRlcmZhY2UgR3JhdGljdWxlIHsKKyAgICAgICAgICAgICgpOiBhbnk7CisKKyAgICAgICAgICAgIGxpbmVzKCk6IGFueVtdOworCisgICAgICAgICAgICBvdXRsaW5lKCk6IGFueTsKKworICAgICAgICAgICAgZXh0ZW50KCk6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTsKKyAgICAgICAgICAgIGV4dGVudChleHRlbnQ6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSk6IEdyYXRpY3VsZTsKKworICAgICAgICAgICAgbWFqb3JFeHRlbnQoKTogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dOworICAgICAgICAgICAgbWFqb3JFeHRlbnQoZXh0ZW50OiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0pOiBHcmF0aWN1bGU7CisKKyAgICAgICAgICAgIG1pbm9yRXh0ZW50KCk6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTsKKyAgICAgICAgICAgIG1pbm9yRXh0ZW50KGV4dGVudDogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dKTogR3JhdGljdWxlOworCisgICAgICAgICAgICBzdGVwKCk6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICBzdGVwKHN0ZXA6IFtudW1iZXIsIG51bWJlcl0pOiBHcmF0aWN1bGU7CisKKyAgICAgICAgICAgIG1ham9yU3RlcCgpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgbWFqb3JTdGVwKHN0ZXA6IFtudW1iZXIsIG51bWJlcl0pOiBHcmF0aWN1bGU7CisKKyAgICAgICAgICAgIG1pbm9yU3RlcCgpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgbWlub3JTdGVwKHN0ZXA6IFtudW1iZXIsIG51bWJlcl0pOiBHcmF0aWN1bGU7CisKKyAgICAgICAgICAgIHByZWNpc2lvbigpOiBudW1iZXI7CisgICAgICAgICAgICBwcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiBHcmF0aWN1bGU7CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gY2lyY2xlKCk6IENpcmNsZTsKKworICAgICAgICBpbnRlcmZhY2UgQ2lyY2xlIHsKKyAgICAgICAgICAgICguLi5hcmdzOiBhbnlbXSk6IGFueTsKKworICAgICAgICAgICAgb3JpZ2luKCk6IFtudW1iZXIsIG51bWJlcl0gfCAoKC4uLmFyZ3M6IGFueVtdKSA9PiBbbnVtYmVyLCBudW1iZXJdKTsKKyAgICAgICAgICAgIG9yaWdpbihvcmlnaW46IFtudW1iZXIsIG51bWJlcl0pOiBDaXJjbGU7CisgICAgICAgICAgICBvcmlnaW4ob3JpZ2luOiAoLi4uYXJnczogYW55W10pID0+IFtudW1iZXIsIG51bWJlcl0pOiBDaXJjbGU7CisKKyAgICAgICAgICAgIGFuZ2xlKCk6IG51bWJlcjsKKyAgICAgICAgICAgIGFuZ2xlKGFuZ2xlOiBudW1iZXIpOiBDaXJjbGU7CisKKyAgICAgICAgICAgIHByZWNpc2lvbigpOiBudW1iZXI7CisgICAgICAgICAgICBwcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiBDaXJjbGU7CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gYXJlYShmZWF0dXJlOiBhbnkpOiBudW1iZXI7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjZW50cm9pZChmZWF0dXJlOiBhbnkpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gYm91bmRzKGZlYXR1cmU6IGFueSk6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGE6IFtudW1iZXIsIG51bWJlcl0sIGI6IFtudW1iZXIsIG51bWJlcl0pOiBudW1iZXI7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoZmVhdHVyZTogYW55KTogbnVtYmVyOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGUoYTogW251bWJlciwgbnVtYmVyXSwgYjogW251bWJlciwgbnVtYmVyXSk6ICh0OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl07CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJvdGF0aW9uKHJvdGF0ZTogW251bWJlciwgbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IFJvdGF0aW9uOworCisgICAgICAgIGludGVyZmFjZSBSb3RhdGlvbiB7CisgICAgICAgICAgICAobG9jYXRpb246IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgaW52ZXJ0KGxvY2F0aW9uOiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBzdHJlYW0ob2JqZWN0OiBhbnksIGxpc3RlbmVyOiBMaXN0ZW5lcik6IHZvaWQ7CisKKyAgICAgICAgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgICAgIHBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpOiB2b2lkOworICAgICAgICAgICAgbGluZVN0YXJ0KCk6IHZvaWQ7CisgICAgICAgICAgICBsaW5lRW5kKCk6IHZvaWQ7CisgICAgICAgICAgICBwb2x5Z29uU3RhcnQoKTogdm9pZDsKKyAgICAgICAgICAgIHBvbHlnb25FbmQoKTogdm9pZDsKKyAgICAgICAgICAgIHNwaGVyZSgpOiB2b2lkOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShtZXRob2RzOiBUcmFuc2Zvcm1NZXRob2RzKTogVHJhbnNmb3JtOworCisgICAgICAgIGludGVyZmFjZSBUcmFuc2Zvcm1NZXRob2RzIHsKKyAgICAgICAgICAgIHBvaW50Pyh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogdm9pZDsKKyAgICAgICAgICAgIGxpbmVTdGFydD8oKTogdm9pZDsKKyAgICAgICAgICAgIGxpbmVFbmQ/KCk6IHZvaWQ7CisgICAgICAgICAgICBwb2x5Z29uU3RhcnQ/KCk6IHZvaWQ7CisgICAgICAgICAgICBwb2x5Z29uRW5kPygpOiB2b2lkOworICAgICAgICAgICAgc3BoZXJlPygpOiB2b2lkOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFRyYW5zZm9ybSB7CisgICAgICAgICAgICBzdHJlYW0oc3RyZWFtOiBMaXN0ZW5lcik6IExpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNsaXBFeHRlbnQoKTogQ2xpcEV4dGVudDsKKworICAgICAgICBpbnRlcmZhY2UgQ2xpcEV4dGVudCBleHRlbmRzIFRyYW5zZm9ybSB7CisgICAgICAgICAgICBleHRlbnQoKTogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dOworICAgICAgICAgICAgZXh0ZW50KGV4dGVudDogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dKTogQ2xpcEV4dGVudDsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uKHJhdzogUmF3SW52ZXJ0aWJsZVByb2plY3Rpb24pOiBJbnZlcnRpYmxlUHJvamVjdGlvbjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHByb2plY3Rpb24ocmF3OiBSYXdQcm9qZWN0aW9uKTogUHJvamVjdGlvbjsKKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gcHJvamVjdGlvbk11dGF0b3IoZmFjdG9yeTogKC4uLmFyZ3M6IGFueVtdKSA9PiBSYXdJbnZlcnRpYmxlUHJvamVjdGlvbik6ICguLi5hcmdzOiBhbnlbXSkgPT4gSW52ZXJ0aWJsZVByb2plY3Rpb247CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uTXV0YXRvcihmYWN0b3J5OiAoLi4uYXJnczogYW55W10pID0+IFJhd1Byb2plY3Rpb24pOiAoLi4uYXJnczogYW55W10pID0+IFByb2plY3Rpb247CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGFsYmVycygpOiBDb25pY1Byb2plY3Rpb247CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBhbGJlcnNVc2EoKTogQ29uaWNQcm9qZWN0aW9uOworICAgICAgICBleHBvcnQgZnVuY3Rpb24gYXppbXV0aGFsRXF1YWxBcmVhKCk6IEludmVydGlibGVQcm9qZWN0aW9uOworICAgICAgICBtb2R1bGUgYXppbXV0aGFsRXF1YWxBcmVhIHsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYXcobGFtYmRhOiBudW1iZXIsIHBoaTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIG1vZHVsZSByYXcgeworICAgICAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBpbnZlcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGF6aW11dGhhbEVxdWlkaXN0YW50KCk6IEludmVydGlibGVQcm9qZWN0aW9uOworICAgICAgICBtb2R1bGUgYXppbXV0aGFsRXF1aWRpc3RhbnQgeworICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJhdyhsYW1iZGE6IG51bWJlciwgcGhpOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgbW9kdWxlIHJhdyB7CisgICAgICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGludmVydCh4OiBudW1iZXIsIHk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gY29uaWNDb25mb3JtYWwoKTogQ29uaWNQcm9qZWN0aW9uOworICAgICAgICBtb2R1bGUgY29uaWNDb25mb3JtYWwgeworICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJhdyhwaGkwOiBudW1iZXIsIHBoaTE6IG51bWJlcik6IFJhd0ludmVydGlibGVQcm9qZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNvbmljRXF1YWxBcmVhKCk6IENvbmljUHJvamVjdGlvbjsKKyAgICAgICAgbW9kdWxlIGNvbmljRXF1YWxBcmVhIHsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYXcocGhpMDogbnVtYmVyLCBwaGkxOiBudW1iZXIpOiBSYXdJbnZlcnRpYmxlUHJvamVjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjb25pY0VxdWlkaXN0YW50KCk6IENvbmljUHJvamVjdGlvbjsKKyAgICAgICAgbW9kdWxlIGNvbmljRXF1aWRpc3RhbnQgeworICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJhdyhwaGkwOiBudW1iZXIsIHBoaTE6IG51bWJlcik6IFJhd0ludmVydGlibGVQcm9qZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGVxdWlyZWN0YW5ndWxhcigpOiBJbnZlcnRpYmxlUHJvamVjdGlvbjsKKyAgICAgICAgbW9kdWxlIGVxdWlyZWN0YW5ndWxhciB7CisgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmF3KGxhbWJkYTogbnVtYmVyLCBwaGk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICBtb2R1bGUgcmF3IHsKKyAgICAgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gaW52ZXJ0KHg6IG51bWJlciwgeTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBnbm9tb25pYygpOiBJbnZlcnRpYmxlUHJvamVjdGlvbjsKKyAgICAgICAgbW9kdWxlIGdub21vbmljIHsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYXcobGFtYmRhOiBudW1iZXIsIHBoaTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIG1vZHVsZSByYXcgeworICAgICAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBpbnZlcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yKCk6IEludmVydGlibGVQcm9qZWN0aW9uOworICAgICAgICBtb2R1bGUgbWVyY2F0b3IgeworICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJhdyhsYW1iZGE6IG51bWJlciwgcGhpOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgbW9kdWxlIHJhdyB7CisgICAgICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGludmVydCh4OiBudW1iZXIsIHk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gb3J0aG9ncmFwaGljKCk6IEludmVydGlibGVQcm9qZWN0aW9uOworICAgICAgICBtb2R1bGUgb3J0aG9ncmFwaGljIHsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYXcobGFtYmRhOiBudW1iZXIsIHBoaTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIG1vZHVsZSByYXcgeworICAgICAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBpbnZlcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHN0ZXJlb2dyYXBoaWMoKTogSW52ZXJ0aWJsZVByb2plY3Rpb247CisgICAgICAgIG1vZHVsZSBzdGVyZW9ncmFwaGljIHsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYXcobGFtYmRhOiBudW1iZXIsIHBoaTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIG1vZHVsZSByYXcgeworICAgICAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBpbnZlcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHRyYW5zdmVyc2VNZXJjYXRvcigpOiBJbnZlcnRpYmxlUHJvamVjdGlvbjsKKyAgICAgICAgbW9kdWxlIHRyYW5zdmVyc2VNZXJjYXRvciB7CisgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmF3KGxhbWJkYTogbnVtYmVyLCBwaGk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICBtb2R1bGUgcmF3IHsKKyAgICAgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gaW52ZXJ0KHg6IG51bWJlciwgeTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBQcm9qZWN0aW9uIHsKKyAgICAgICAgICAgIChsb2NhdGlvbjogW251bWJlciwgbnVtYmVyXSk6IFtudW1iZXIsIG51bWJlcl07CisKKyAgICAgICAgICAgIHJvdGF0ZSgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICByb3RhdGUocm90YXRpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IFByb2plY3Rpb247CisKKyAgICAgICAgICAgIGNlbnRlcigpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgY2VudGVyKGxvY2F0aW9uOiBbbnVtYmVyLCBudW1iZXJdKTogUHJvamVjdGlvbjsKKworICAgICAgICAgICAgdHJhbnNsYXRlKCk6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICB0cmFuc2xhdGUocG9pbnQ6IFtudW1iZXIsIG51bWJlcl0pOiBQcm9qZWN0aW9uOworCisgICAgICAgICAgICBzY2FsZSgpOiBudW1iZXI7CisgICAgICAgICAgICBzY2FsZShzY2FsZTogbnVtYmVyKTogUHJvamVjdGlvbjsKKworICAgICAgICAgICAgY2xpcEFuZ2xlKCk6IG51bWJlcjsKKyAgICAgICAgICAgIGNsaXBBbmdsZShhbmdsZTogbnVtYmVyKTogUHJvamVjdGlvbjsKKworICAgICAgICAgICAgY2xpcEV4dGVudCgpOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07CisgICAgICAgICAgICBjbGlwRXh0ZW50KGV4dGVudDogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dKTogUHJvamVjdGlvbjsKKworICAgICAgICAgICAgcHJlY2lzaW9uKCk6IG51bWJlcjsKKyAgICAgICAgICAgIHByZWNpc2lvbihwcmVjaXNpb246IG51bWJlcik6IFByb2plY3Rpb247CisKKyAgICAgICAgICAgIHN0cmVhbShsaXN0ZW5lcjogTGlzdGVuZXIpOiBMaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBJbnZlcnRpYmxlUHJvamVjdGlvbiBleHRlbmRzIFByb2plY3Rpb24geworICAgICAgICAgICAgaW52ZXJ0KHBvaW50OiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBDb25pY1Byb2plY3Rpb24gZXh0ZW5kcyBJbnZlcnRpYmxlUHJvamVjdGlvbiB7CisgICAgICAgICAgICBwYXJhbGxlbHMoKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIHBhcmFsbGVscyhwYXJhbGxlbHM6IFtudW1iZXIsIG51bWJlcl0pOiBDb25pY1Byb2plY3Rpb247CisKKyAgICAgICAgICAgIHJvdGF0ZSgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICByb3RhdGUocm90YXRpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IENvbmljUHJvamVjdGlvbjsKKworICAgICAgICAgICAgY2VudGVyKCk6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICBjZW50ZXIobG9jYXRpb246IFtudW1iZXIsIG51bWJlcl0pOiBDb25pY1Byb2plY3Rpb247CisKKyAgICAgICAgICAgIHRyYW5zbGF0ZSgpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgdHJhbnNsYXRlKHBvaW50OiBbbnVtYmVyLCBudW1iZXJdKTogQ29uaWNQcm9qZWN0aW9uOworCisgICAgICAgICAgICBzY2FsZSgpOiBudW1iZXI7CisgICAgICAgICAgICBzY2FsZShzY2FsZTogbnVtYmVyKTogQ29uaWNQcm9qZWN0aW9uOworCisgICAgICAgICAgICBjbGlwQW5nbGUoKTogbnVtYmVyOworICAgICAgICAgICAgY2xpcEFuZ2xlKGFuZ2xlOiBudW1iZXIpOiBDb25pY1Byb2plY3Rpb247CisKKyAgICAgICAgICAgIGNsaXBFeHRlbnQoKTogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dOworICAgICAgICAgICAgY2xpcEV4dGVudChleHRlbnQ6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSk6IENvbmljUHJvamVjdGlvbjsKKworICAgICAgICAgICAgcHJlY2lzaW9uKCk6IG51bWJlcjsKKyAgICAgICAgICAgIHByZWNpc2lvbihwcmVjaXNpb246IG51bWJlcik6IENvbmljUHJvamVjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBSYXdQcm9qZWN0aW9uIHsKKyAgICAgICAgICAgIChsYW1iZGE6IG51bWJlciwgcGhpOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFJhd0ludmVydGlibGVQcm9qZWN0aW9uIGV4dGVuZHMgUmF3UHJvamVjdGlvbiB7CisgICAgICAgICAgICBpbnZlcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICB9CisgICAgfQorCisgICAgbW9kdWxlIHN2ZyB7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBsaW5lKCk6IExpbmU8W251bWJlciwgbnVtYmVyXT47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBsaW5lPFQ+KCk6IExpbmU8VD47CisKKyAgICAgICAgaW50ZXJmYWNlIExpbmU8VD4geworICAgICAgICAgICAgKGRhdGE6IFRbXSk6IHN0cmluZzsKKworICAgICAgICAgICAgeCgpOiBudW1iZXIgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHgoeDogbnVtYmVyKTogTGluZTxUPjsKKyAgICAgICAgICAgIHgoeDogKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTogTGluZTxUPjsKKworICAgICAgICAgICAgeSgpOiBudW1iZXIgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHkoeDogbnVtYmVyKTogTGluZTxUPjsKKyAgICAgICAgICAgIHkoeTogKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTogTGluZTxUPjsKKworICAgICAgICAgICAgaW50ZXJwb2xhdGUoKTogc3RyaW5nIHwgKChwb2ludHM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KSA9PiBzdHJpbmcpOworICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJsaW5lYXIiKTogTGluZTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAibGluZWFyLWNsb3NlZCIpOiBMaW5lPFQ+OworICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJzdGVwIik6IExpbmU8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogInN0ZXAtYmVmb3JlIik6IExpbmU8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogInN0ZXAtYWZ0ZXIiKTogTGluZTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiYmFzaXMiKTogTGluZTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiYmFzaXMtb3BlbiIpOiBMaW5lPFQ+OworICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJiYXNpcy1jbG9zZWQiKTogTGluZTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiYnVuZGxlIik6IExpbmU8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImNhcmRpbmFsIik6IExpbmU8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImNhcmRpbmFsLW9wZW4iKTogTGluZTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiY2FyZGluYWwtY2xvc2VkIik6IExpbmU8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogIm1vbm90b25lIik6IExpbmU8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogc3RyaW5nKTogTGluZTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAocG9pbnRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikgPT4gc3RyaW5nKTogTGluZTxUPjsKKworICAgICAgICAgICAgdGVuc2lvbigpOiBudW1iZXI7CisgICAgICAgICAgICB0ZW5zaW9uKHRlbnNpb246IG51bWJlcik6IExpbmU8VD47CisKKyAgICAgICAgICAgIGRlZmluZWQoKTogKGQ6IFQsIGk6IG51bWJlcikgPT4gYm9vbGVhbjsKKyAgICAgICAgICAgIGRlZmluZWQoZGVmaW5lZDogKGQ6IFQsIGk6IG51bWJlcikgPT4gYm9vbGVhbik6IExpbmU8VD47CisgICAgICAgIH0KKworICAgICAgICBtb2R1bGUgbGluZSB7CisgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmFkaWFsKCk6IFJhZGlhbDxbbnVtYmVyLCBudW1iZXJdPjsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYWRpYWw8VD4oKTogUmFkaWFsPFQ+OworCisgICAgICAgICAgICBpbnRlcmZhY2UgUmFkaWFsPFQ+IHsKKyAgICAgICAgICAgICAgICAoZGF0YTogVFtdKTogc3RyaW5nOworCisgICAgICAgICAgICAgICAgcmFkaXVzKCk6IG51bWJlciB8ICgoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgICAgIHJhZGl1cyhyYWRpdXM6IG51bWJlcik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICByYWRpdXMocmFkaXVzOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBSYWRpYWw8VD47CisKKyAgICAgICAgICAgICAgICBhbmdsZSgpOiBudW1iZXIgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBhbmdsZShhbmdsZTogbnVtYmVyKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGFuZ2xlKGFuZ2xlOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBSYWRpYWw8VD47CisKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSgpOiBzdHJpbmcgfCAoKHBvaW50czogQXJyYXk8W251bWJlciwgbnVtYmVyXT4pID0+IHN0cmluZyk7CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJsaW5lYXIiKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAibGluZWFyLWNsb3NlZCIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJzdGVwIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogInN0ZXAtYmVmb3JlIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogInN0ZXAtYWZ0ZXIiKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiYmFzaXMiKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiYmFzaXMtb3BlbiIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJiYXNpcy1jbG9zZWQiKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiYnVuZGxlIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImNhcmRpbmFsIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImNhcmRpbmFsLW9wZW4iKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiY2FyZGluYWwtY2xvc2VkIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogIm1vbm90b25lIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogc3RyaW5nKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAocG9pbnRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikgPT4gc3RyaW5nKTogUmFkaWFsPFQ+OworCisgICAgICAgICAgICAgICAgdGVuc2lvbigpOiBudW1iZXI7CisgICAgICAgICAgICAgICAgdGVuc2lvbih0ZW5zaW9uOiBudW1iZXIpOiBSYWRpYWw8VD47CisKKyAgICAgICAgICAgICAgICBkZWZpbmVkKCk6IChkOiBULCBpOiBudW1iZXIpID0+IGJvb2xlYW47CisgICAgICAgICAgICAgICAgZGVmaW5lZChkZWZpbmVkOiAoZDogVCwgaTogbnVtYmVyKSA9PiBib29sZWFuKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGFyZWEoKTogQXJlYTxbbnVtYmVyLCBudW1iZXJdPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGFyZWE8VD4oKTogQXJlYTxUPjsKKworICAgICAgICBpbnRlcmZhY2UgQXJlYTxUPiB7CisgICAgICAgICAgICAoZGF0YTogVFtdKTogc3RyaW5nOworCisgICAgICAgICAgICB4KCk6IG51bWJlciB8ICgoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgeCh4OiBudW1iZXIpOiBBcmVhPFQ+OworICAgICAgICAgICAgeCh4OiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBBcmVhPFQ+OworCisgICAgICAgICAgICB4MCgpOiBudW1iZXIgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHgwKHgwOiBudW1iZXIpOiBBcmVhPFQ+OworICAgICAgICAgICAgeDAoeDA6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IEFyZWE8VD47CisKKyAgICAgICAgICAgIHgxKCk6IG51bWJlciB8ICgoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgeDEoeDE6IG51bWJlcik6IEFyZWE8VD47CisgICAgICAgICAgICB4MSh4MTogKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTogQXJlYTxUPjsKKworICAgICAgICAgICAgeSgpOiBudW1iZXIgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHkoeTogbnVtYmVyKTogQXJlYTxUPjsKKyAgICAgICAgICAgIHkoeTogKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTogQXJlYTxUPjsKKworICAgICAgICAgICAgeTAoKTogbnVtYmVyIHwgKChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik7CisgICAgICAgICAgICB5MCh5MDogbnVtYmVyKTogQXJlYTxUPjsKKyAgICAgICAgICAgIHkwKHkwOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBBcmVhPFQ+OworCisgICAgICAgICAgICB5MSgpOiBudW1iZXIgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHkxKHkxOiBudW1iZXIpOiBBcmVhPFQ+OworICAgICAgICAgICAgeTEoeTE6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IEFyZWE8VD47CisKKyAgICAgICAgICAgIGludGVycG9sYXRlKCk6IHN0cmluZyB8ICgocG9pbnRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikgPT4gc3RyaW5nKTsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAibGluZWFyIik6IEFyZWE8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogInN0ZXAiKTogQXJlYTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAic3RlcC1iZWZvcmUiKTogQXJlYTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAic3RlcC1hZnRlciIpOiBBcmVhPFQ+OworICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJiYXNpcyIpOiBBcmVhPFQ+OworICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJiYXNpcy1vcGVuIik6IEFyZWE8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImNhcmRpbmFsIik6IEFyZWE8VD47CisgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImNhcmRpbmFsLW9wZW4iKTogQXJlYTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAibW9ub3RvbmUiKTogQXJlYTxUPjsKKyAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiBzdHJpbmcpOiBBcmVhPFQ+OworCisgICAgICAgICAgICB0ZW5zaW9uKCk6IG51bWJlcjsKKyAgICAgICAgICAgIHRlbnNpb24odGVuc2lvbjogbnVtYmVyKTogQXJlYTxUPjsKKworICAgICAgICAgICAgZGVmaW5lZCgpOiAoZDogVCwgaTogbnVtYmVyKSA9PiBib29sZWFuOworICAgICAgICAgICAgZGVmaW5lZChkZWZpbmVkOiAoZDogVCwgaTogbnVtYmVyKSA9PiBib29sZWFuKTogQXJlYTxUPjsKKyAgICAgICAgfQorCisgICAgICAgIG1vZHVsZSBhcmVhIHsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYWRpYWwoKTogUmFkaWFsPFtudW1iZXIsIG51bWJlcl0+OworICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJhZGlhbDxUPigpOiBSYWRpYWw8VD47CisKKyAgICAgICAgICAgIGludGVyZmFjZSBSYWRpYWw8VD4geworICAgICAgICAgICAgICAgIChkYXRhOiBUW10pOiBzdHJpbmc7CisKKyAgICAgICAgICAgICAgICByYWRpdXMoKTogbnVtYmVyIHwgKChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik7CisgICAgICAgICAgICAgICAgcmFkaXVzKHJhZGl1czogbnVtYmVyKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIHJhZGl1cyhyYWRpdXM6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IFJhZGlhbDxUPjsKKworICAgICAgICAgICAgICAgIGlubmVyUmFkaXVzKCk6IG51bWJlciB8ICgoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgICAgIGlubmVyUmFkaXVzKGlubmVyUmFkaXVzOiBudW1iZXIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXM6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IFJhZGlhbDxUPjsKKworICAgICAgICAgICAgICAgIG91dGVyUmFkaXVzKCk6IG51bWJlciB8ICgoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgICAgIG91dGVyUmFkaXVzKG91dGVyUmFkaXVzOiBudW1iZXIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgb3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXM6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IFJhZGlhbDxUPjsKKworICAgICAgICAgICAgICAgIGFuZ2xlKCk6IG51bWJlciB8ICgoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgICAgIGFuZ2xlKGFuZ2xlOiBudW1iZXIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgYW5nbGUoYW5nbGU6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IFJhZGlhbDxUPjsKKworICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUoKTogbnVtYmVyIHwgKChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik7CisgICAgICAgICAgICAgICAgc3RhcnRBbmdsZShzdGFydEFuZ2xlOiBudW1iZXIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgc3RhcnRBbmdsZShzdGFydEFuZ2xlOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBSYWRpYWw8VD47CisKKyAgICAgICAgICAgICAgICBlbmRBbmdsZSgpOiBudW1iZXIgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBlbmRBbmdsZShlbmRBbmdsZTogbnVtYmVyKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGVuZEFuZ2xlKGVuZEFuZ2xlOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBSYWRpYWw8VD47CisKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSgpOiBzdHJpbmcgfCAoKHBvaW50czogQXJyYXk8W251bWJlciwgbnVtYmVyXT4pID0+IHN0cmluZyk7CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJsaW5lYXIiKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAic3RlcCIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJzdGVwLWJlZm9yZSIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJzdGVwLWFmdGVyIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImJhc2lzIik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogImJhc2lzLW9wZW4iKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiY2FyZGluYWwiKTogUmFkaWFsPFQ+OworICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGludGVycG9sYXRlOiAiY2FyZGluYWwtb3BlbiIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6ICJtb25vdG9uZSIpOiBSYWRpYWw8VD47CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGU6IHN0cmluZyk6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShpbnRlcnBvbGF0ZTogKHBvaW50czogQXJyYXk8W251bWJlciwgbnVtYmVyXT4pID0+IHN0cmluZyk6IFJhZGlhbDxUPjsKKworICAgICAgICAgICAgICAgIHRlbnNpb24oKTogbnVtYmVyOworICAgICAgICAgICAgICAgIHRlbnNpb24odGVuc2lvbjogbnVtYmVyKTogUmFkaWFsPFQ+OworCisgICAgICAgICAgICAgICAgZGVmaW5lZCgpOiAoZDogVCwgaTogbnVtYmVyKSA9PiBib29sZWFuOworICAgICAgICAgICAgICAgIGRlZmluZWQoZGVmaW5lZDogKGQ6IFQsIGk6IG51bWJlcikgPT4gYm9vbGVhbik6IFJhZGlhbDxUPjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBhcmMoKTogQXJjPGFyYy5BcmM+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gYXJjPFQ+KCk6IEFyYzxUPjsKKworICAgICAgICBtb2R1bGUgYXJjIHsKKyAgICAgICAgICAgIGludGVyZmFjZSBBcmMgeworICAgICAgICAgICAgICAgIGlubmVyUmFkaXVzOiBudW1iZXI7CisgICAgICAgICAgICAgICAgb3V0ZXJSYWRpdXM6IG51bWJlcjsKKyAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiBudW1iZXI7CisgICAgICAgICAgICAgICAgZW5kQW5nbGU6IG51bWJlcjsKKyAgICAgICAgICAgICAgICBwYWRBbmdsZTogbnVtYmVyCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgQXJjPFQ+IHsKKyAgICAgICAgICAgIChkOiBULCBpOiBudW1iZXIpOiBzdHJpbmc7CisKKyAgICAgICAgICAgIGlubmVyUmFkaXVzKCk6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcjsKKyAgICAgICAgICAgIGlubmVyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogQXJjPFQ+OworICAgICAgICAgICAgaW5uZXJSYWRpdXMocmFkaXVzOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBBcmM8VD47CisKKyAgICAgICAgICAgIG91dGVyUmFkaXVzKCk6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcjsKKyAgICAgICAgICAgIG91dGVyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogQXJjPFQ+OworICAgICAgICAgICAgb3V0ZXJSYWRpdXMocmFkaXVzOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBBcmM8VD47CisKKyAgICAgICAgICAgIGNvcm5lclJhZGl1cygpOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgICAgICAgICBjb3JuZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiBBcmM8VD47CisgICAgICAgICAgICBjb3JuZXJSYWRpdXMocmFkaXVzOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBBcmM8VD47CisKKyAgICAgICAgICAgIHBhZFJhZGl1cygpOiBzdHJpbmcgfCAoKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHBhZFJhZGl1cyhyYWRpdXM6ICJhdXRvIik6IEFyYzxUPjsKKyAgICAgICAgICAgIHBhZFJhZGl1cyhyYWRpdXM6IHN0cmluZyk6IEFyYzxUPjsKKyAgICAgICAgICAgIHBhZFJhZGl1cyhyYWRpdXM6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IEFyYzxUPjsKKworICAgICAgICAgICAgc3RhcnRBbmdsZSgpOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgICAgICAgICBzdGFydEFuZ2xlKGFuZ2xlOiBudW1iZXIpOiBBcmM8VD47CisgICAgICAgICAgICBzdGFydEFuZ2xlKGFuZ2xlOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBBcmM8VD47CisKKyAgICAgICAgICAgIGVuZEFuZ2xlKCk6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcjsKKyAgICAgICAgICAgIGVuZEFuZ2xlKGFuZ2xlOiBudW1iZXIpOiBBcmM8VD47CisgICAgICAgICAgICBlbmRBbmdsZShhbmdsZTogKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTogQXJjPFQ+OworCisgICAgICAgICAgICBwYWRBbmdsZSgpOiAoZDogVCwgaTogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgICAgICAgICBwYWRBbmdsZShhbmdsZTogbnVtYmVyKTogQXJjPFQ+OworICAgICAgICAgICAgcGFkQW5nbGUoYW5nbGU6IChkOiBULCBpOiBudW1iZXIpID0+IG51bWJlcik6IEFyYzxUPjsKKworICAgICAgICAgICAgY2VudHJvaWQoZDogVCwgaT86IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gc3ltYm9sKCk6IFN5bWJvbDx7fT47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBzeW1ib2w8VD4oKTogU3ltYm9sPFQ+OworCisgICAgICAgIGludGVyZmFjZSBTeW1ib2w8VD4geworICAgICAgICAgICAgKGQ6IFQsIGk/OiBudW1iZXIpOiBzdHJpbmc7CisKKyAgICAgICAgICAgIHR5cGUoKTogKGQ6IFQsIGk6IG51bWJlcikgPT4gc3RyaW5nOworICAgICAgICAgICAgdHlwZSh0eXBlOiBzdHJpbmcpOiBTeW1ib2w8VD47CisgICAgICAgICAgICB0eXBlKHR5cGU6IChkOiBULCBpOiBudW1iZXIpID0+IHN0cmluZyk6IFN5bWJvbDxUPjsKKworICAgICAgICAgICAgc2l6ZSgpOiAoZDogVCwgaTogc3RyaW5nKSA9PiBudW1iZXI7CisgICAgICAgICAgICBzaXplKHNpemU6IG51bWJlcik6IFN5bWJvbDxUPjsKKyAgICAgICAgICAgIHNpemUoc2l6ZTogKGQ6IFQsIGk6IG51bWJlcikgPT4gbnVtYmVyKTogU3ltYm9sPFQ+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IHZhciBzeW1ib2xUeXBlczogc3RyaW5nW107CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNob3JkKCk6IENob3JkPGNob3JkLkxpbms8Y2hvcmQuTm9kZT4sIGNob3JkLk5vZGU+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gY2hvcmQ8Tm9kZT4oKTogQ2hvcmQ8Y2hvcmQuTGluazxOb2RlPiwgTm9kZT47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjaG9yZDxMaW5rLCBOb2RlPigpOiBDaG9yZDxMaW5rLCBOb2RlPjsKKworICAgICAgICBtb2R1bGUgY2hvcmQgeworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8Tm9kZT4geworICAgICAgICAgICAgICAgIHNvdXJjZTogTm9kZTsKKyAgICAgICAgICAgICAgICB0YXJnZXQ6IE5vZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVyZmFjZSBOb2RlIHsKKyAgICAgICAgICAgICAgICByYWRpdXM6IG51bWJlcjsKKyAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiBudW1iZXI7CisgICAgICAgICAgICAgICAgZW5kQW5nbGU6IG51bWJlcgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIENob3JkPExpbmssIE5vZGU+IHsKKyAgICAgICAgICAgIChkOiBMaW5rLCBpOiBudW1iZXIpOiBzdHJpbmc7CisKKyAgICAgICAgICAgIHNvdXJjZSgpOiAoZDogTGluaywgaTogbnVtYmVyKSA9PiBOb2RlOworICAgICAgICAgICAgc291cmNlKHNvdXJjZTogTm9kZSk6IENob3JkPExpbmssIE5vZGU+OworICAgICAgICAgICAgc291cmNlKHNvdXJjZTogKGQ6IExpbmssIGk6IG51bWJlcikgPT4gTm9kZSk6IENob3JkPExpbmssIE5vZGU+OworCisgICAgICAgICAgICB0YXJnZXQoKTogKGQ6IExpbmssIGk6IG51bWJlcikgPT4gTm9kZTsKKyAgICAgICAgICAgIHRhcmdldCh0YXJnZXQ6IE5vZGUpOiBDaG9yZDxMaW5rLCBOb2RlPjsKKyAgICAgICAgICAgIHRhcmdldCh0YXJnZXQ6IChkOiBMaW5rLCBpOiBudW1iZXIpID0+IE5vZGUpOiBDaG9yZDxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgcmFkaXVzKCk6IChkOiBOb2RlLCBpOiBudW1iZXIpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHJhZGl1cyhyYWRpdXM6IG51bWJlcik6IENob3JkPExpbmssIE5vZGU+OworICAgICAgICAgICAgcmFkaXVzKHJhZGl1czogKGQ6IE5vZGUsIGk6IG51bWJlcikgPT4gbnVtYmVyKTogQ2hvcmQ8TGluaywgTm9kZT47CisKKyAgICAgICAgICAgIHN0YXJ0QW5nbGUoKTogKGQ6IE5vZGUsIGk6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgc3RhcnRBbmdsZShhbmdsZTogbnVtYmVyKTogQ2hvcmQ8TGluaywgTm9kZT47CisgICAgICAgICAgICBzdGFydEFuZ2xlKGFuZ2xlOiAoZDogTm9kZSwgaTogbnVtYmVyKSA9PiBudW1iZXIpOiBDaG9yZDxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgZW5kQW5nbGUoKTogKGQ6IE5vZGUsIGk6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgZW5kQW5nbGUoYW5nbGU6IG51bWJlcik6IENob3JkPExpbmssIE5vZGU+OworICAgICAgICAgICAgZW5kQW5nbGUoYW5nbGU6IChkOiBOb2RlLCBpOiBudW1iZXIpID0+IG51bWJlcik6IENob3JkPExpbmssIE5vZGU+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGRpYWdvbmFsKCk6IERpYWdvbmFsPGRpYWdvbmFsLkxpbms8ZGlhZ29uYWwuTm9kZT4sIGRpYWdvbmFsLk5vZGU+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gZGlhZ29uYWw8Tm9kZT4oKTogRGlhZ29uYWw8ZGlhZ29uYWwuTGluazxOb2RlPiwgTm9kZT47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBkaWFnb25hbDxMaW5rLCBOb2RlPigpOiBEaWFnb25hbDxMaW5rLCBOb2RlPjsKKworICAgICAgICBtb2R1bGUgZGlhZ29uYWwgeworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8Tm9kZT4geworICAgICAgICAgICAgICAgIHNvdXJjZTogTm9kZTsKKyAgICAgICAgICAgICAgICB0YXJnZXQ6IE5vZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVyZmFjZSBOb2RlIHsKKyAgICAgICAgICAgICAgICB4OiBudW1iZXI7CisgICAgICAgICAgICAgICAgeTogbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIERpYWdvbmFsPExpbmssIE5vZGU+IHsKKyAgICAgICAgICAgIChkOiBMaW5rLCBpOiBudW1iZXIpOiBzdHJpbmc7CisKKyAgICAgICAgICAgIHNvdXJjZSgpOiAoZDogTGluaywgaTogbnVtYmVyKSA9PiBOb2RlOworICAgICAgICAgICAgc291cmNlKHNvdXJjZTogTm9kZSk6IERpYWdvbmFsPExpbmssIE5vZGU+OworICAgICAgICAgICAgc291cmNlKHNvdXJjZTogKGQ6IExpbmssIGk6IG51bWJlcikgPT4gTm9kZSk6IERpYWdvbmFsPExpbmssIE5vZGU+OworCisgICAgICAgICAgICB0YXJnZXQoKTogKGQ6IExpbmssIGk6IG51bWJlcikgPT4gTm9kZTsKKyAgICAgICAgICAgIHRhcmdldCh0YXJnZXQ6IE5vZGUpOiBEaWFnb25hbDxMaW5rLCBOb2RlPjsKKyAgICAgICAgICAgIHRhcmdldCh0YXJnZXQ6IChkOiBMaW5rLCBpOiBudW1iZXIpID0+IE5vZGUpOiBEaWFnb25hbDxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgcHJvamVjdGlvbigpOiAoZDogTm9kZSwgaTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgcHJvamVjdGlvbihwcm9qZWN0aW9uOiAoZDogTm9kZSwgaTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdKTogRGlhZ29uYWw8TGluaywgTm9kZT47CisgICAgICAgIH0KKworICAgICAgICBtb2R1bGUgZGlhZ29uYWwgeworICAgICAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJhZGlhbCgpOiBSYWRpYWw8TGluazxOb2RlPiwgTm9kZT47CisgICAgICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmFkaWFsPE5vZGU+KCk6IFJhZGlhbDxMaW5rPE5vZGU+LCBOb2RlPjsKKyAgICAgICAgICAgIGV4cG9ydCBmdW5jdGlvbiByYWRpYWw8TGluaywgTm9kZT4oKTogUmFkaWFsPExpbmssIE5vZGU+OworCisgICAgICAgICAgICBpbnRlcmZhY2UgUmFkaWFsPExpbmssIE5vZGU+IHsKKyAgICAgICAgICAgICAgICAoZDogTGluaywgaTogbnVtYmVyKTogc3RyaW5nOworCisgICAgICAgICAgICAgICAgc291cmNlKCk6IChkOiBMaW5rLCBpOiBudW1iZXIpID0+IE5vZGU7CisgICAgICAgICAgICAgICAgc291cmNlKHNvdXJjZTogTm9kZSk6IFJhZGlhbDxMaW5rLCBOb2RlPjsKKyAgICAgICAgICAgICAgICBzb3VyY2Uoc291cmNlOiAoZDogTGluaywgaTogbnVtYmVyKSA9PiBOb2RlKTogUmFkaWFsPExpbmssIE5vZGU+OworCisgICAgICAgICAgICAgICAgdGFyZ2V0KCk6IChkOiBMaW5rLCBpOiBudW1iZXIpID0+IE5vZGU7CisgICAgICAgICAgICAgICAgdGFyZ2V0KHRhcmdldDogTm9kZSk6IFJhZGlhbDxMaW5rLCBOb2RlPjsKKyAgICAgICAgICAgICAgICB0YXJnZXQodGFyZ2V0OiAoZDogTGluaywgaTogbnVtYmVyKSA9PiBOb2RlKTogUmFkaWFsPExpbmssIE5vZGU+OworCisgICAgICAgICAgICAgICAgcHJvamVjdGlvbigpOiAoZDogTm9kZSwgaTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgICAgIHByb2plY3Rpb24ocHJvamVjdGlvbjogKGQ6IE5vZGUsIGk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXSk6IFJhZGlhbDxMaW5rLCBOb2RlPjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBheGlzKCk6IEF4aXM7CisKKyAgICAgICAgaW50ZXJmYWNlIEF4aXMgeworICAgICAgICAgICAgKHNlbGVjdGlvbjogU2VsZWN0aW9uPGFueT4pOiB2b2lkOworICAgICAgICAgICAgKHNlbGVjdGlvbjogVHJhbnNpdGlvbjxhbnk+KTogdm9pZDsKKworICAgICAgICAgICAgc2NhbGUoKTogYW55OworICAgICAgICAgICAgc2NhbGUoc2NhbGU6IGFueSk6IEF4aXM7CisKKyAgICAgICAgICAgIG9yaWVudCgpOiBzdHJpbmc7CisgICAgICAgICAgICBvcmllbnQob3JpZW50YXRpb246IHN0cmluZyk6IEF4aXM7CisKKyAgICAgICAgICAgIHRpY2tzKCk6IGFueVtdOworICAgICAgICAgICAgdGlja3MoLi4uYXJnczogYW55W10pOiBBeGlzOworCisgICAgICAgICAgICB0aWNrVmFsdWVzKCk6IGFueVtdOworICAgICAgICAgICAgdGlja1ZhbHVlcyh2YWx1ZXM6IGFueVtdKTogQXhpczsKKworICAgICAgICAgICAgdGlja1NpemUoKTogbnVtYmVyOworICAgICAgICAgICAgdGlja1NpemUoc2l6ZTogbnVtYmVyKTogQXhpczsKKyAgICAgICAgICAgIHRpY2tTaXplKGlubmVyOiBudW1iZXIsIG91dGVyOiBudW1iZXIpOiBBeGlzOworCisgICAgICAgICAgICBpbm5lclRpY2tTaXplKCk6IG51bWJlcjsKKyAgICAgICAgICAgIGlubmVyVGlja1NpemUoc2l6ZTogbnVtYmVyKTogQXhpczsKKworICAgICAgICAgICAgb3V0ZXJUaWNrU2l6ZSgpOiBudW1iZXI7CisgICAgICAgICAgICBvdXRlclRpY2tTaXplKHNpemU6IG51bWJlcik6IEF4aXM7CisKKyAgICAgICAgICAgIHRpY2tQYWRkaW5nKCk6IG51bWJlcjsKKyAgICAgICAgICAgIHRpY2tQYWRkaW5nKHBhZGRpbmc6IG51bWJlcik6IEF4aXM7CisKKyAgICAgICAgICAgIHRpY2tGb3JtYXQoKTogKHQ6IGFueSkgPT4gc3RyaW5nOworICAgICAgICAgICAgdGlja0Zvcm1hdChmb3JtYXQ6ICh0OiBhbnkpID0+IHN0cmluZyk6IEF4aXM7CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gYnJ1c2goKTogQnJ1c2g8YW55PjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGJydXNoPFQ+KCk6IEJydXNoPFQ+OworCisgICAgICAgIG1vZHVsZSBicnVzaCB7CisgICAgICAgICAgICBpbnRlcmZhY2UgU2NhbGUgeworICAgICAgICAgICAgICAgIGRvbWFpbigpOiBudW1iZXJbXTsKKyAgICAgICAgICAgICAgICBkb21haW4oZG9tYWluOiBudW1iZXJbXSk6IFNjYWxlOworCisgICAgICAgICAgICAgICAgcmFuZ2UoKTogbnVtYmVyW107CisgICAgICAgICAgICAgICAgcmFuZ2UocmFuZ2U6IG51bWJlcltdKTogU2NhbGU7CisKKyAgICAgICAgICAgICAgICBpbnZlcnQ/KHk6IG51bWJlcik6IG51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBCcnVzaDxUPiB7CisgICAgICAgICAgICAoc2VsZWN0aW9uOiBTZWxlY3Rpb248VD4pOiB2b2lkOworICAgICAgICAgICAgKHNlbGVjdGlvbjogVHJhbnNpdGlvbjxUPik6IHZvaWQ7CisKKyAgICAgICAgICAgIGV2ZW50KHNlbGVjdGlvbjogU2VsZWN0aW9uPFQ+KTogdm9pZDsKKyAgICAgICAgICAgIGV2ZW50KHNlbGVjdGlvbjogVHJhbnNpdGlvbjxUPik6IHZvaWQ7CisKKyAgICAgICAgICAgIHgoKTogYnJ1c2guU2NhbGU7CisgICAgICAgICAgICB4KHg6IGJydXNoLlNjYWxlKTogQnJ1c2g8VD47CisKKyAgICAgICAgICAgIHkoKTogYnJ1c2guU2NhbGU7CisgICAgICAgICAgICB5KHk6IGJydXNoLlNjYWxlKTogQnJ1c2g8VD47CisKKyAgICAgICAgICAgIGV4dGVudCgpOiBbbnVtYmVyLCBudW1iZXJdIHwgW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dOworICAgICAgICAgICAgZXh0ZW50KGV4dGVudDogW251bWJlciwgbnVtYmVyXSB8IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSk6IEJydXNoPFQ+OworCisgICAgICAgICAgICBjbGFtcCgpOiBib29sZWFuIHwgW2Jvb2xlYW4sIGJvb2xlYW5dOworICAgICAgICAgICAgY2xhbXAoY2xhbXA6IGJvb2xlYW4gfCBbYm9vbGVhbiwgYm9vbGVhbl0pOiBCcnVzaDxUPjsKKworICAgICAgICAgICAgY2xlYXIoKTogdm9pZDsKKworICAgICAgICAgICAgZW1wdHkoKTogYm9vbGVhbjsKKworICAgICAgICAgICAgb24odHlwZTogJ2JydXNoc3RhcnQnKTogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkOworICAgICAgICAgICAgb24odHlwZTogJ2JydXNoJyk6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZDsKKyAgICAgICAgICAgIG9uKHR5cGU6ICdicnVzaGVuZCcpOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IHZvaWQ7CisgICAgICAgICAgICBvbih0eXBlOiBzdHJpbmcpOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IHZvaWQ7CisKKyAgICAgICAgICAgIG9uKHR5cGU6ICdicnVzaHN0YXJ0JywgbGlzdGVuZXI6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IEJydXNoPFQ+OworICAgICAgICAgICAgb24odHlwZTogJ2JydXNoJywgbGlzdGVuZXI6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IEJydXNoPFQ+OworICAgICAgICAgICAgb24odHlwZTogJ2JydXNoZW5kJywgbGlzdGVuZXI6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IEJydXNoPFQ+OworICAgICAgICAgICAgb24odHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogQnJ1c2g8VD47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleHBvcnQgZnVuY3Rpb24geGhyKHVybDogc3RyaW5nLCBtaW1lVHlwZT86IHN0cmluZywgY2FsbGJhY2s/OiAoZXJyOiBhbnksIGRhdGE6IGFueSkgPT4gdm9pZCk6IFhocjsKKyAgICBleHBvcnQgZnVuY3Rpb24geGhyKHVybDogc3RyaW5nLCBjYWxsYmFjazogKGVycjogYW55LCBkYXRhOiBhbnkpID0+IHZvaWQpOiBYaHI7CisKKyAgICBpbnRlcmZhY2UgWGhyIHsKKyAgICAgICAgaGVhZGVyKG5hbWU6IHN0cmluZyk6IHN0cmluZzsKKyAgICAgICAgaGVhZGVyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFhocjsKKworICAgICAgICBtaW1lVHlwZSgpOiBzdHJpbmc7CisgICAgICAgIG1pbWVUeXBlKHR5cGU6IHN0cmluZyk6IFhocjsKKworICAgICAgICByZXNwb25zZVR5cGUoKTogc3RyaW5nOworICAgICAgICByZXNwb25zZVR5cGUodHlwZTogc3RyaW5nKTogWGhyOworCisgICAgICAgIHJlc3BvbnNlKCk6IChyZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCkgPT4gYW55OworICAgICAgICByZXNwb25zZSh2YWx1ZTogKHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0KSA9PiBhbnkpOiBYaHI7CisKKyAgICAgICAgZ2V0KGNhbGxiYWNrPzogKGVycjogYW55LCBkYXRhOiBhbnkpID0+IHZvaWQpOiBYaHI7CisKKyAgICAgICAgcG9zdChkYXRhPzogYW55LCBjYWxsYmFjaz86IChlcnI6IGFueSwgZGF0YTogYW55KSA9PiB2b2lkKTogWGhyOworICAgICAgICBwb3N0KGNhbGxiYWNrOiAoZXJyOiBhbnksIGRhdGE6IGFueSkgPT4gdm9pZCk6IFhocjsKKworICAgICAgICBzZW5kKG1ldGhvZDogc3RyaW5nLCBkYXRhPzogYW55LCBjYWxsYmFjaz86IChlcnI6IGFueSwgZGF0YTogYW55KSA9PiB2b2lkKTogWGhyOworICAgICAgICBzZW5kKG1ldGhvZDogc3RyaW5nLCBjYWxsYmFjazogKGVycjogYW55LCBkYXRhOiBhbnkpID0+IHZvaWQpOiBYaHI7CisKKyAgICAgICAgYWJvcnQoKTogWGhyOworCisgICAgICAgIG9uKHR5cGU6ICJiZWZvcmVzZW5kIik6IChyZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCkgPT4gdm9pZDsKKyAgICAgICAgb24odHlwZTogInByb2dyZXNzIik6IChyZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCkgPT4gdm9pZDsKKyAgICAgICAgb24odHlwZTogImxvYWQiKTogKHJlc3BvbnNlOiBhbnkpID0+IHZvaWQ7CisgICAgICAgIG9uKHR5cGU6ICJlcnJvciIpOiAoZXJyOiBhbnkpID0+IHZvaWQ7CisgICAgICAgIG9uKHR5cGU6IHN0cmluZyk6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDsKKworICAgICAgICBvbih0eXBlOiAiYmVmb3Jlc2VuZCIsIGxpc3RlbmVyOiAocmVxdWVzdDogWE1MSHR0cFJlcXVlc3QpID0+IHZvaWQpOiBYaHI7CisgICAgICAgIG9uKHR5cGU6ICJwcm9ncmVzcyIsIGxpc3RlbmVyOiAocmVxdWVzdDogWE1MSHR0cFJlcXVlc3QpID0+IHZvaWQpOiBYaHI7CisgICAgICAgIG9uKHR5cGU6ICJsb2FkIiwgbGlzdGVuZXI6IChyZXNwb25zZTogYW55KSA9PiB2b2lkKTogWGhyOworICAgICAgICBvbih0eXBlOiAiZXJyb3IiLCBsaXN0ZW5lcjogKGVycjogYW55KSA9PiB2b2lkKTogWGhyOworICAgICAgICBvbih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiBYaHI7CisgICAgfQorCisgICAgZXhwb3J0IGZ1bmN0aW9uIHRleHQodXJsOiBzdHJpbmcsIG1pbWVUeXBlPzogc3RyaW5nLCBjYWxsYmFjaz86IChlcnI6IGFueSwgZGF0YTogc3RyaW5nKSA9PiB2b2lkKTogWGhyOworICAgIGV4cG9ydCBmdW5jdGlvbiB0ZXh0KHVybDogc3RyaW5nLCBjYWxsYmFjazogKGVycjogYW55LCBkYXRhOiBzdHJpbmcpID0+IHZvaWQpOiBYaHI7CisKKyAgICBleHBvcnQgZnVuY3Rpb24ganNvbih1cmw6IHN0cmluZywgY2FsbGJhY2s/OiAoZXJyOiBhbnksIGRhdGE6IGFueSkgPT4gdm9pZCk6IFhocjsKKworICAgIGV4cG9ydCBmdW5jdGlvbiB4bWwodXJsOiBzdHJpbmcsIG1pbWVUeXBlPzogc3RyaW5nLCBjYWxsYmFjaz86IChlcnI6IGFueSwgZGF0YTogYW55KSA9PiB2b2lkKTogWGhyOworICAgIGV4cG9ydCBmdW5jdGlvbiB4bWwodXJsOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyOiBhbnksIGRhdGE6IGFueSkgPT4gdm9pZCk6IFhocjsKKworICAgIGV4cG9ydCBmdW5jdGlvbiBodG1sKHVybDogc3RyaW5nLCBjYWxsYmFjaz86IChlcnI6IGFueSwgZGF0YTogRG9jdW1lbnRGcmFnbWVudCkgPT4gdm9pZCk6IFhocjsKKworICAgIGV4cG9ydCB2YXIgY3N2OiBEc3Y7CisgICAgZXhwb3J0IHZhciB0c3Y6IERzdjsKKyAgICBleHBvcnQgZnVuY3Rpb24gZHN2KGRlbGltaXRlcjogc3RyaW5nLCBtaW1lVHlwZTogc3RyaW5nKTogRHN2OworCisgICAgaW50ZXJmYWNlIERzdiB7CisgICAgICAgICh1cmw6IHN0cmluZywgY2FsbGJhY2s6IChyb3dzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10pID0+IHZvaWQpOiBEc3ZYaHI8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT47CisgICAgICAgICh1cmw6IHN0cmluZywgY2FsbGJhY2s6IChlcnJvcjogYW55LCByb3dzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10pID0+IHZvaWQpOiBEc3ZYaHI8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT47CisgICAgICAgICh1cmw6IHN0cmluZyk6IERzdlhocjx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PjsKKyAgICAgICAgPFQ+KHVybDogc3RyaW5nLCBhY2Nlc3NvcjogKHJvdzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkgPT4gVCwgY2FsbGJhY2s6IChyb3dzOiBUW10pID0+IHZvaWQpOiBEc3ZYaHI8VD47CisgICAgICAgIDxUPih1cmw6IHN0cmluZywgYWNjZXNzb3I6IChyb3c6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pID0+IFQsIGNhbGxiYWNrOiAoZXJyb3I6IGFueSwgcm93czogVFtdKSA9PiB2b2lkKTogRHN2WGhyPFQ+OworICAgICAgICA8VD4odXJsOiBzdHJpbmcsIGFjY2Vzc29yOiAocm93OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSA9PiBUKTogRHN2WGhyPFQ+OworCisgICAgICAgIHBhcnNlKHN0cmluZzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdOworICAgICAgICBwYXJzZTxUPihzdHJpbmc6IHN0cmluZywgYWNjZXNzb3I6IChyb3c6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sIGluZGV4OiBudW1iZXIpID0+IFQpOiBUW107CisKKyAgICAgICAgcGFyc2VSb3dzKHN0cmluZzogc3RyaW5nKTogc3RyaW5nW11bXTsKKyAgICAgICAgcGFyc2VSb3dzPFQ+KHN0cmluZzogc3RyaW5nLCBhY2Nlc3NvcjogKHJvdzogc3RyaW5nW10sIGluZGV4OiBudW1iZXIpID0+IFQpOiBUW107CisKKyAgICAgICAgZm9ybWF0KHJvd3M6IE9iamVjdFtdKTogc3RyaW5nOworCisgICAgICAgIGZvcm1hdFJvd3Mocm93czogc3RyaW5nW11bXSk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgRHN2WGhyPFQ+IGV4dGVuZHMgWGhyIHsKKyAgICAgICAgcm93KCk6IChyb3c6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pID0+IFQ7CisgICAgICAgIHJvdzxVPihhY2Nlc3NvcjogKHJvdzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkgPT4gVSk6IERzdlhocjxVPjsKKworICAgICAgICBoZWFkZXIobmFtZTogc3RyaW5nKTogc3RyaW5nOworICAgICAgICBoZWFkZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogRHN2WGhyPFQ+OworCisgICAgICAgIG1pbWVUeXBlKCk6IHN0cmluZzsKKyAgICAgICAgbWltZVR5cGUodHlwZTogc3RyaW5nKTogRHN2WGhyPFQ+OworCisgICAgICAgIHJlc3BvbnNlVHlwZSgpOiBzdHJpbmc7CisgICAgICAgIHJlc3BvbnNlVHlwZSh0eXBlOiBzdHJpbmcpOiBEc3ZYaHI8VD47CisKKyAgICAgICAgcmVzcG9uc2UoKTogKHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0KSA9PiBhbnk7CisgICAgICAgIHJlc3BvbnNlKHZhbHVlOiAocmVxdWVzdDogWE1MSHR0cFJlcXVlc3QpID0+IGFueSk6IERzdlhocjxUPjsKKworICAgICAgICBnZXQoY2FsbGJhY2s/OiAoZXJyOiBhbnksIGRhdGE6IFQpID0+IHZvaWQpOiBEc3ZYaHI8VD47CisgICAgICAgIHBvc3QoZGF0YT86IGFueSwgY2FsbGJhY2s/OiAoZXJyOiBhbnksIGRhdGE6IFQpID0+IHZvaWQpOiBEc3ZYaHI8VD47CisgICAgICAgIHBvc3QoY2FsbGJhY2s6IChlcnI6IGFueSwgZGF0YTogVCkgPT4gdm9pZCk6IERzdlhocjxUPjsKKworICAgICAgICBzZW5kKG1ldGhvZDogc3RyaW5nLCBkYXRhPzogYW55LCBjYWxsYmFjaz86IChlcnI6IGFueSwgZGF0YTogVCkgPT4gdm9pZCk6IERzdlhocjxUPjsKKyAgICAgICAgc2VuZChtZXRob2Q6IHN0cmluZywgY2FsbGJhY2s6IChlcnI6IGFueSwgZGF0YTogVCkgPT4gdm9pZCk6IERzdlhocjxUPjsKKworICAgICAgICBhYm9ydCgpOiBEc3ZYaHI8VD47CisKKyAgICAgICAgb24odHlwZTogImJlZm9yZXNlbmQiKTogKHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0KSA9PiB2b2lkOworICAgICAgICBvbih0eXBlOiAicHJvZ3Jlc3MiKTogKHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0KSA9PiB2b2lkOworICAgICAgICBvbih0eXBlOiAibG9hZCIpOiAocmVzcG9uc2U6IFQpID0+IHZvaWQ7CisgICAgICAgIG9uKHR5cGU6ICJlcnJvciIpOiAoZXJyOiBhbnkpID0+IHZvaWQ7CisgICAgICAgIG9uKHR5cGU6IHN0cmluZyk6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDsKKworICAgICAgICBvbih0eXBlOiAiYmVmb3Jlc2VuZCIsIGxpc3RlbmVyOiAocmVxdWVzdDogWE1MSHR0cFJlcXVlc3QpID0+IHZvaWQpOiBEc3ZYaHI8VD47CisgICAgICAgIG9uKHR5cGU6ICJwcm9ncmVzcyIsIGxpc3RlbmVyOiAocmVxdWVzdDogWE1MSHR0cFJlcXVlc3QpID0+IHZvaWQpOiBEc3ZYaHI8VD47CisgICAgICAgIG9uKHR5cGU6ICJsb2FkIiwgbGlzdGVuZXI6IChyZXNwb25zZTogVCkgPT4gdm9pZCk6IERzdlhocjxUPjsKKyAgICAgICAgb24odHlwZTogImVycm9yIiwgbGlzdGVuZXI6IChlcnI6IGFueSkgPT4gdm9pZCk6IERzdlhocjxUPjsKKyAgICAgICAgb24odHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogRHN2WGhyPFQ+OworICAgIH0KKworICAgIGV4cG9ydCBmdW5jdGlvbiBsb2NhbGUoZGVmaW5pdGlvbjogTG9jYWxlRGVmaW5pdGlvbik6IExvY2FsZTsKKworICAgIGludGVyZmFjZSBMb2NhbGVEZWZpbml0aW9uIHsKKyAgICAgICAgZGVjaW1hbDogc3RyaW5nOworICAgICAgICB0aG91c2FuZHM6IHN0cmluZzsKKyAgICAgICAgZ3JvdXBpbmc6IG51bWJlcltdOworICAgICAgICBjdXJyZW5jeTogW3N0cmluZywgc3RyaW5nXTsKKyAgICAgICAgZGF0ZVRpbWU6IHN0cmluZzsKKyAgICAgICAgZGF0ZTogc3RyaW5nOworICAgICAgICB0aW1lOiBzdHJpbmc7CisgICAgICAgIHBlcmlvZHM6IFtzdHJpbmcsIHN0cmluZ107CisgICAgICAgIGRheXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmddOworICAgICAgICBzaG9ydERheXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmddOworICAgICAgICBtb250aHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nXTsKKyAgICAgICAgc2hvcnRNb250aHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9jYWxlIHsKKyAgICAgICAgbnVtYmVyRm9ybWF0KHNwZWNpZmllcjogc3RyaW5nKTogKG46IG51bWJlcikgPT4gc3RyaW5nOworICAgICAgICB0aW1lRm9ybWF0OiB7CisgICAgICAgICAgICAoc3BlY2lmaWVyOiBzdHJpbmcpOiB0aW1lLkZvcm1hdDsKKyAgICAgICAgICAgIHV0YyhzcGVjaWZpZXI6IHN0cmluZyk6IHRpbWUuRm9ybWF0OworICAgICAgICB9CisgICAgfQorCisgICAgbW9kdWxlIGxheW91dCB7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBidW5kbGUoKTogQnVuZGxlPGJ1bmRsZS5Ob2RlPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGJ1bmRsZTxUIGV4dGVuZHMgYnVuZGxlLk5vZGU+KCk6IEJ1bmRsZTxUPgorCisgICAgICAgIG1vZHVsZSBidW5kbGUgeworICAgICAgICAgICAgaW50ZXJmYWNlIE5vZGUgeworICAgICAgICAgICAgICAgIHBhcmVudDogTm9kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8VCBleHRlbmRzIE5vZGU+IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6IFQ7CisgICAgICAgICAgICAgICAgdGFyZ2V0OiBUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIEJ1bmRsZTxUIGV4dGVuZHMgYnVuZGxlLk5vZGU+IHsKKyAgICAgICAgICAgIChsaW5rczogYnVuZGxlLkxpbms8VD5bXSk6IFRbXVtdOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNob3JkKCk6IENob3JkOworCisgICAgICAgIG1vZHVsZSBjaG9yZCB7CisgICAgICAgICAgICBpbnRlcmZhY2UgTGluayB7CisgICAgICAgICAgICAgICAgc291cmNlOiBOb2RlOworICAgICAgICAgICAgICAgIHRhcmdldDogTm9kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJmYWNlIE5vZGUgeworICAgICAgICAgICAgICAgIGluZGV4OiBudW1iZXI7CisgICAgICAgICAgICAgICAgc3ViaW5kZXg6IG51bWJlcjsKKyAgICAgICAgICAgICAgICBzdGFydEFuZ2xlOiBudW1iZXI7CisgICAgICAgICAgICAgICAgZW5kQW5nbGU6IG51bWJlcjsKKyAgICAgICAgICAgICAgICB2YWx1ZTogbnVtYmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcmZhY2UgR3JvdXAgeworICAgICAgICAgICAgICAgIGluZGV4OiBudW1iZXI7CisgICAgICAgICAgICAgICAgc3RhcnRBbmdsZTogbnVtYmVyOworICAgICAgICAgICAgICAgIGVuZEFuZ2xlOiBudW1iZXI7CisgICAgICAgICAgICAgICAgdmFsdWU6IG51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBDaG9yZCB7CisgICAgICAgICAgICBtYXRyaXgoKTogbnVtYmVyW11bXTsKKyAgICAgICAgICAgIG1hdHJpeChtYXRyaXg6IG51bWJlcltdW10pOiBDaG9yZDsKKworICAgICAgICAgICAgcGFkZGluZygpOiBudW1iZXI7CisgICAgICAgICAgICBwYWRkaW5nKHBhZGRpbmc6IG51bWJlcik6IENob3JkOworCisgICAgICAgICAgICBzb3J0R3JvdXBzKCk6IChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgc29ydEdyb3Vwcyhjb21wYXJhdG9yOiAoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IG51bWJlcik6IENob3JkOworCisgICAgICAgICAgICBzb3J0U3ViZ3JvdXBzKCk6IChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgc29ydFN1Ymdyb3Vwcyhjb21wYXJhdG9yOiAoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IG51bWJlcik6IENob3JkOworCisgICAgICAgICAgICBzb3J0Q2hvcmRzKCk6IChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgc29ydENob3Jkcyhjb21wYXJhdG9yOiAoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IG51bWJlcik6IENob3JkOworCisgICAgICAgICAgICBjaG9yZHMoKTogY2hvcmQuTGlua1tdOworICAgICAgICAgICAgZ3JvdXBzKCk6IGNob3JkLkdyb3VwW107CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gY2x1c3RlcigpOiBDbHVzdGVyPGNsdXN0ZXIuUmVzdWx0PjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNsdXN0ZXI8VCBleHRlbmRzIGNsdXN0ZXIuUmVzdWx0PigpOiBDbHVzdGVyPFQ+OworCisgICAgICAgIG1vZHVsZSBjbHVzdGVyIHsKKyAgICAgICAgICAgIGludGVyZmFjZSBSZXN1bHQgeworICAgICAgICAgICAgICAgIHBhcmVudD86IFJlc3VsdDsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbj86IFJlc3VsdFtdOworICAgICAgICAgICAgICAgIGRlcHRoPzogbnVtYmVyOworICAgICAgICAgICAgICAgIHg/OiBudW1iZXI7CisgICAgICAgICAgICAgICAgeT86IG51bWJlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8VCBleHRlbmRzIFJlc3VsdD4geworICAgICAgICAgICAgICAgIHNvdXJjZTogVDsKKyAgICAgICAgICAgICAgICB0YXJnZXQ6IFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgQ2x1c3RlcjxUIGV4dGVuZHMgY2x1c3Rlci5SZXN1bHQ+IHsKKyAgICAgICAgICAgIChyb290OiBUKTogVFtdOworCisgICAgICAgICAgICBub2Rlcyhyb290OiBUKTogVFtdOworCisgICAgICAgICAgICBsaW5rcyhub2RlczogVFtdKTogY2x1c3Rlci5MaW5rPFQ+OworCisgICAgICAgICAgICBjaGlsZHJlbigpOiAobm9kZTogVCkgPT4gVFtdOworICAgICAgICAgICAgY2hpbGRyZW4oYWNjZXNzb3I6IChub2RlOiBUKSA9PiBUW10pOiBDbHVzdGVyPFQ+OworCisgICAgICAgICAgICBzb3J0KCk6IChhOiBULCBiOiBUKSA9PiBudW1iZXI7CisgICAgICAgICAgICBzb3J0KGNvbXBhcmF0b3I6IChhOiBULCBiOiBUKSA9PiBudW1iZXIpOiBDbHVzdGVyPFQ+OworCisgICAgICAgICAgICBzZXBhcmF0aW9uKCk6IChhOiBULCBiOiBUKSA9PiBudW1iZXI7CisgICAgICAgICAgICBzZXBhcmF0aW9uKHNlcGFyYXRpb246IChhOiBULCBiOiBUKSA9PiBudW1iZXIpOiBDbHVzdGVyPFQ+OworCisgICAgICAgICAgICBzaXplKCk6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICBzaXplKHNpemU6IFtudW1iZXIsIG51bWJlcl0pOiBDbHVzdGVyPFQ+OworCisgICAgICAgICAgICBub2RlU2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgbm9kZVNpemUobm9kZVNpemU6IFtudW1iZXIsIG51bWJlcl0pOiBDbHVzdGVyPFQ+OworCisgICAgICAgICAgICB2YWx1ZSgpOiAoYTogVCkgPT4gbnVtYmVyOworICAgICAgICAgICAgdmFsdWUodmFsdWU6IChhOiBUKSA9PiBudW1iZXIpOiBDbHVzdGVyPFQ+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGZvcmNlKCk6IEZvcmNlPGZvcmNlLkxpbms8Zm9yY2UuTm9kZT4sIGZvcmNlLk5vZGU+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gZm9yY2U8Tm9kZSBleHRlbmRzIGZvcmNlLk5vZGU+KCk6IEZvcmNlPGZvcmNlLkxpbms8Tm9kZT4sIE5vZGU+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gZm9yY2U8TGluayBleHRlbmRzIGZvcmNlLkxpbms8Zm9yY2UuTm9kZT4sIE5vZGUgZXh0ZW5kcyBmb3JjZS5Ob2RlPigpOiBGb3JjZTxMaW5rLCBOb2RlPjsKKworICAgICAgICBtb2R1bGUgZm9yY2UgeworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8VCBleHRlbmRzIE5vZGU+IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6IFQ7CisgICAgICAgICAgICAgICAgdGFyZ2V0OiBUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcmZhY2UgTm9kZSB7CisgICAgICAgICAgICAgICAgaW5kZXg/OiBudW1iZXI7CisgICAgICAgICAgICAgICAgeD86IG51bWJlcjsKKyAgICAgICAgICAgICAgICB5PzogbnVtYmVyOworICAgICAgICAgICAgICAgIHB4PzogbnVtYmVyOworICAgICAgICAgICAgICAgIHB5PzogbnVtYmVyOworICAgICAgICAgICAgICAgIGZpeGVkPzogYm9vbGVhbjsKKyAgICAgICAgICAgICAgICB3ZWlnaHQ/OiBudW1iZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVyZmFjZSBFdmVudCB7CisgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nOworICAgICAgICAgICAgICAgIGFscGhhOiBudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgRm9yY2U8TGluayBleHRlbmRzIGZvcmNlLkxpbms8Zm9yY2UuTm9kZT4sIE5vZGUgZXh0ZW5kcyBmb3JjZS5Ob2RlPiB7CisgICAgICAgICAgICBzaXplKCk6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICBzaXplKHNpemU6IFtudW1iZXIsIG51bWJlcl0pOiBGb3JjZTxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgbGlua0Rpc3RhbmNlKCk6IG51bWJlciB8ICgobGluazogTGluaywgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIGxpbmtEaXN0YW5jZShkaXN0YW5jZTogbnVtYmVyKTogRm9yY2U8TGluaywgTm9kZT47CisgICAgICAgICAgICBsaW5rRGlzdGFuY2UoZGlzdGFuY2U6IChsaW5rOiBMaW5rLCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBGb3JjZTxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgbGlua1N0cmVuZ3RoKCk6IG51bWJlciB8ICgobGluazogTGluaywgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIGxpbmtTdHJlbmd0aChzdHJlbmd0aDogbnVtYmVyKTogRm9yY2U8TGluaywgTm9kZT47CisgICAgICAgICAgICBsaW5rU3RyZW5ndGgoc3RyZW5ndGg6IChsaW5rOiBMaW5rLCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBGb3JjZTxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgZnJpY3Rpb24oKTogbnVtYmVyOworICAgICAgICAgICAgZnJpY3Rpb24oZnJpY3Rpb246IG51bWJlcik6IEZvcmNlPExpbmssIE5vZGU+OworCisgICAgICAgICAgICBjaGFyZ2UoKTogbnVtYmVyIHwgKChub2RlOiBOb2RlLCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOworICAgICAgICAgICAgY2hhcmdlKGNoYXJnZTogbnVtYmVyKTogRm9yY2U8TGluaywgTm9kZT47CisgICAgICAgICAgICBjaGFyZ2UoY2hhcmdlOiAobm9kZTogTm9kZSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogRm9yY2U8TGluaywgTm9kZT47CisKKyAgICAgICAgICAgIGNoYXJnZURpc3RhbmNlKCk6IG51bWJlcjsKKyAgICAgICAgICAgIGNoYXJnZURpc3RhbmNlKGRpc3RhbmNlOiBudW1iZXIpOiBGb3JjZTxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgdGhldGEoKTogbnVtYmVyOworICAgICAgICAgICAgdGhldGEodGhldGE6IG51bWJlcik6IEZvcmNlPExpbmssIE5vZGU+OworCisgICAgICAgICAgICBncmF2aXR5KCk6IG51bWJlcjsKKyAgICAgICAgICAgIGdyYXZpdHkoZ3Jhdml0eTogbnVtYmVyKTogRm9yY2U8TGluaywgTm9kZT47CisKKyAgICAgICAgICAgIG5vZGVzKCk6IE5vZGVbXTsKKyAgICAgICAgICAgIG5vZGVzKG5vZGVzOiBOb2RlW10pOiBGb3JjZTxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgbGlua3MoKTogTGlua1tdOworICAgICAgICAgICAgbGlua3MobGlua3M6IHsgc291cmNlOiBudW1iZXI7IHRhcmdldDogbnVtYmVyIH1bXSk6IEZvcmNlPExpbmssIE5vZGU+OworICAgICAgICAgICAgbGlua3MobGlua3M6IExpbmtbXSk6IEZvcmNlPExpbmssIE5vZGU+OworCisgICAgICAgICAgICBzdGFydCgpOiBGb3JjZTxMaW5rLCBOb2RlPjsKKworICAgICAgICAgICAgYWxwaGEoKTogbnVtYmVyOworICAgICAgICAgICAgYWxwaGEodmFsdWU6IG51bWJlcik6IEZvcmNlPExpbmssIE5vZGU+OworCisgICAgICAgICAgICByZXN1bWUoKTogRm9yY2U8TGluaywgTm9kZT47CisKKyAgICAgICAgICAgIHN0b3AoKTogRm9yY2U8TGluaywgTm9kZT47CisKKyAgICAgICAgICAgIG9uKHR5cGU6IHN0cmluZyk6IChldmVudDogZm9yY2UuRXZlbnQpID0+IHZvaWQ7CisgICAgICAgICAgICBvbih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoZXZlbnQ6IGZvcmNlLkV2ZW50KSA9PiB2b2lkKTogRm9yY2U8TGluaywgTm9kZT47CisKKyAgICAgICAgICAgIGRyYWcoKTogYmVoYXZpb3IuRHJhZzxOb2RlPjsKKyAgICAgICAgICAgIGRyYWcoc2VsZWN0aW9uOiBTZWxlY3Rpb248Tm9kZT4pOiB2b2lkOworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGhpZXJhcmNoeSgpOiBIaWVyYXJjaHk8aGllcmFyY2h5LlJlc3VsdD47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBoaWVyYXJjaHk8VCBleHRlbmRzIGhpZXJhcmNoeS5SZXN1bHQ+KCk6IEhpZXJhcmNoeTxUPjsKKworICAgICAgICBtb2R1bGUgaGllcmFyY2h5IHsKKyAgICAgICAgICAgIGludGVyZmFjZSBSZXN1bHQgeworICAgICAgICAgICAgICAgIHBhcmVudD86IFJlc3VsdDsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbj86IFJlc3VsdFtdOworICAgICAgICAgICAgICAgIHZhbHVlPzogbnVtYmVyOworICAgICAgICAgICAgICAgIGRlcHRoPzogbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIEhpZXJhcmNoeTxUIGV4dGVuZHMgaGllcmFyY2h5LlJlc3VsdD4geworICAgICAgICAgICAgKHJvb3Q6IFQpOiBUW107CisKKyAgICAgICAgICAgIGNoaWxkcmVuKCk6IChub2RlOiBUKSA9PiBUW107CisgICAgICAgICAgICBjaGlsZHJlbihhY2Nlc3NvcjogKG5vZGU6IFQpID0+IFRbXSk6IEhpZXJhcmNoeTxUPjsKKworICAgICAgICAgICAgc29ydCgpOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyOworICAgICAgICAgICAgc29ydChjb21wYXJhdG9yOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogSGllcmFyY2h5PFQ+OworCisgICAgICAgICAgICB2YWx1ZSgpOiAobm9kZTogVCkgPT4gbnVtYmVyOworICAgICAgICAgICAgdmFsdWUoYWNjZXNzb3I6IChub2RlOiBUKSA9PiBudW1iZXIpOiBIaWVyYXJjaHk8VD47CisKKyAgICAgICAgICAgIHJldmFsdWUocm9vdDogVCk6IFRbXTsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBoaXN0b2dyYW0oKTogSGlzdG9ncmFtPG51bWJlcj47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBoaXN0b2dyYW08VD4oKTogSGlzdG9ncmFtPFQ+OworCisgICAgICAgIG1vZHVsZSBoaXN0b2dyYW0geworICAgICAgICAgICAgaW50ZXJmYWNlIEJpbjxUPiBleHRlbmRzIEFycmF5PFQ+IHsKKyAgICAgICAgICAgICAgICB4OiBudW1iZXI7CisgICAgICAgICAgICAgICAgZHg6IG51bWJlcjsKKyAgICAgICAgICAgICAgICB5OiBudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgSGlzdG9ncmFtPFQ+IHsKKyAgICAgICAgICAgICh2YWx1ZXM6IFRbXSwgaW5kZXg/OiBudW1iZXIpOiBoaXN0b2dyYW0uQmluPFQ+W107CisKKyAgICAgICAgICAgIHZhbHVlKCk6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgdmFsdWUodmFsdWU6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogSGlzdG9ncmFtPFQ+OworCisgICAgICAgICAgICByYW5nZSgpOiAodmFsdWVzOiBUW10sIGluZGV4OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICByYW5nZShyYW5nZTogKHZhbHVlczogVFtdLCBpbmRleDogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdKTogSGlzdG9ncmFtPFQ+OworCisgICAgICAgICAgICBiaW5zKCk6IChyYW5nZTogW251bWJlciwgbnVtYmVyXSwgdmFsdWVzOiBUW10sIGluZGV4OiBudW1iZXIpID0+IG51bWJlcltdOworICAgICAgICAgICAgYmlucyhjb3VudDogbnVtYmVyKTogSGlzdG9ncmFtPFQ+OworICAgICAgICAgICAgYmlucyh0aHJlc2hvbGRzOiBudW1iZXJbXSk6IEhpc3RvZ3JhbTxUPjsKKyAgICAgICAgICAgIGJpbnMoZnVuYzogKHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdLCB2YWx1ZXM6IFRbXSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyW10pOiBIaXN0b2dyYW08VD47CisKKyAgICAgICAgICAgIGZyZXF1ZW5jeSgpOiBib29sZWFuOworICAgICAgICAgICAgZnJlcXVlbmN5KGZyZXF1ZW5jeTogYm9vbGVhbik6IEhpc3RvZ3JhbTxUPjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBwYWNrKCk6IFBhY2s8cGFjay5Ob2RlPjsKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHBhY2s8VCBleHRlbmRzIHBhY2suTm9kZT4oKTogUGFjazxUPjsKKworICAgICAgICBtb2R1bGUgcGFjayB7CisgICAgICAgICAgICBpbnRlcmZhY2UgTm9kZSB7CisgICAgICAgICAgICAgICAgcGFyZW50PzogTm9kZTsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbj86IE5vZGVbXTsKKyAgICAgICAgICAgICAgICB2YWx1ZT86IG51bWJlcjsKKyAgICAgICAgICAgICAgICBkZXB0aD86IG51bWJlcjsKKyAgICAgICAgICAgICAgICB4PzogbnVtYmVyOworICAgICAgICAgICAgICAgIHk/OiBudW1iZXI7CisgICAgICAgICAgICAgICAgcj86IG51bWJlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8VCBleHRlbmRzIE5vZGU+IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6IE5vZGU7CisgICAgICAgICAgICAgICAgdGFyZ2V0OiBOb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFBhY2s8VCBleHRlbmRzIHBhY2suTm9kZT4geworICAgICAgICAgICAgKHJvb3Q6IFQpOiBUW107CisKKyAgICAgICAgICAgIG5vZGVzKHJvb3Q6IFQpOiBUW107CisKKyAgICAgICAgICAgIGxpbmtzKG5vZGVzOiBUW10pOiBwYWNrLkxpbms8VD5bXTsKKworICAgICAgICAgICAgY2hpbGRyZW4oKTogKG5vZGU6IFQsIGRlcHRoOiBudW1iZXIpID0+IFRbXTsKKyAgICAgICAgICAgIGNoaWxkcmVuKGNoaWxkcmVuOiAobm9kZTogVCwgZGVwdGg6IG51bWJlcikgPT4gVFtdKTogUGFjazxUPjsKKworICAgICAgICAgICAgc29ydCgpOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyOworICAgICAgICAgICAgc29ydChjb21wYXJhdG9yOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogUGFjazxUPjsKKworICAgICAgICAgICAgdmFsdWUoKTogKG5vZGU6IFQpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHZhbHVlKHZhbHVlOiAobm9kZTogVCkgPT4gbnVtYmVyKTogUGFjazxUPjsKKworICAgICAgICAgICAgc2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgc2l6ZShzaXplOiBbbnVtYmVyLCBudW1iZXJdKTogUGFjazxUPjsKKworICAgICAgICAgICAgcmFkaXVzKCk6IG51bWJlciB8ICgobm9kZTogVCkgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHJhZGl1cyhyYWRpdXM6IG51bWJlcik6IFBhY2s8VD47CisgICAgICAgICAgICByYWRpdXMocmFkaXVzOiAobm9kZTogVCkgPT4gbnVtYmVyKTogUGFjazxUPjsKKworICAgICAgICAgICAgcGFkZGluZygpOiBudW1iZXI7CisgICAgICAgICAgICBwYWRkaW5nKHBhZGRpbmc6IG51bWJlcik6IFBhY2s8VD47CisgICAgICAgIH0KKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gcGllKCk6IFBpZTxudW1iZXI+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gcGllPFQ+KCk6IFBpZTxUPjsKKworICAgICAgICBtb2R1bGUgcGllIHsKKyAgICAgICAgICAgIGludGVyZmFjZSBBcmM8VD4geworICAgICAgICAgICAgICAgIHZhbHVlOiBudW1iZXI7CisgICAgICAgICAgICAgICAgc3RhcnRBbmdsZTogbnVtYmVyOworICAgICAgICAgICAgICAgIGVuZEFuZ2xlOiBudW1iZXI7CisgICAgICAgICAgICAgICAgcGFkQW5nbGU6IG51bWJlcjsKKyAgICAgICAgICAgICAgICBkYXRhOiBUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFBpZTxUPiB7CisgICAgICAgICAgICAoZGF0YTogVFtdLCBpbmRleD86IG51bWJlcik6IHBpZS5BcmM8VD5bXTsKKworICAgICAgICAgICAgdmFsdWUoKTogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgICAgICAgICB2YWx1ZShhY2Nlc3NvcjogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBQaWU8VD47CisKKyAgICAgICAgICAgIHNvcnQoKTogKGE6IFQsIGI6IFQpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHNvcnQoY29tcGFyYXRvcjogKGE6IFQsIGI6IFQpID0+IG51bWJlcik6IFBpZTxUPjsKKworICAgICAgICAgICAgc3RhcnRBbmdsZSgpOiBudW1iZXIgfCAoKGRhdGE6IFRbXSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTsKKyAgICAgICAgICAgIHN0YXJ0QW5nbGUoYW5nbGU6IG51bWJlcik6IFBpZTxUPjsKKyAgICAgICAgICAgIHN0YXJ0QW5nbGUoYW5nbGU6IChkYXRhOiBUW10sIGluZGV4OiBudW1iZXIpID0+IG51bWJlcik6IFBpZTxUPjsKKworICAgICAgICAgICAgZW5kQW5nbGUoKTogbnVtYmVyIHwgKChkYXRhOiBUW10sIGluZGV4OiBudW1iZXIpID0+IG51bWJlcik7CisgICAgICAgICAgICBlbmRBbmdsZShhbmdsZTogbnVtYmVyKTogUGllPFQ+OworICAgICAgICAgICAgZW5kQW5nbGUoYW5nbGU6IChkYXRhOiBUW10sIGluZGV4OiBudW1iZXIpID0+IG51bWJlcik6IFBpZTxUPjsKKworICAgICAgICAgICAgcGFkQW5nbGUoKTogbnVtYmVyIHwgKChkYXRhOiBUW10sIGluZGV4OiBudW1iZXIpID0+IG51bWJlcik7CisgICAgICAgICAgICBwYWRBbmdsZShhbmdsZTogbnVtYmVyKTogUGllPFQ+OworICAgICAgICAgICAgcGFkQW5nbGUoYW5nbGU6IChkYXRhOiBUW10sIGluZGV4OiBudW1iZXIpID0+IG51bWJlcik6IFBpZTxUPjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBzdGFjaygpOiBTdGFjazxzdGFjay5WYWx1ZVtdLCBzdGFjay5WYWx1ZT47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBzdGFjazxWYWx1ZT4oKTogU3RhY2s8VmFsdWVbXSwgVmFsdWU+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gc3RhY2s8U2VyaWVzLCBWYWx1ZT4oKTogU3RhY2s8U2VyaWVzLCBWYWx1ZT47CisgICAgICAgIG1vZHVsZSBzdGFjayB7CisgICAgICAgICAgICBpbnRlcmZhY2UgVmFsdWUgeworICAgICAgICAgICAgICAgIHg6IG51bWJlcjsKKyAgICAgICAgICAgICAgICB5OiBudW1iZXI7CisgICAgICAgICAgICAgICAgeTA/OiBudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgU3RhY2s8U2VyaWVzLCBWYWx1ZT4geworICAgICAgICAgICAgKGxheWVyczogU2VyaWVzW10sIGluZGV4PzogbnVtYmVyKTogU2VyaWVzW107CisKKyAgICAgICAgICAgIHZhbHVlcygpOiAobGF5ZXI6IFNlcmllcywgaW5kZXg6IG51bWJlcikgPT4gVmFsdWVbXTsKKyAgICAgICAgICAgIHZhbHVlcyhhY2Nlc3NvcjogKGxheWVyOiBTZXJpZXMsIGluZGV4OiBudW1iZXIpID0+IFZhbHVlW10pOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKworICAgICAgICAgICAgb2Zmc2V0KCk6IChkYXRhOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikgPT4gbnVtYmVyW107CisgICAgICAgICAgICBvZmZzZXQob2Zmc2V0OiAic2lsaG91ZXR0ZSIpOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKyAgICAgICAgICAgIG9mZnNldChvZmZzZXQ6ICJ3aWdnbGUiKTogU3RhY2s8U2VyaWVzLCBWYWx1ZT47CisgICAgICAgICAgICBvZmZzZXQob2Zmc2V0OiAiZXhwYW5kIik6IFN0YWNrPFNlcmllcywgVmFsdWU+OworICAgICAgICAgICAgb2Zmc2V0KG9mZnNldDogInplcm8iKTogU3RhY2s8U2VyaWVzLCBWYWx1ZT47CisgICAgICAgICAgICBvZmZzZXQob2Zmc2V0OiBzdHJpbmcpOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKyAgICAgICAgICAgIG9mZnNldChvZmZzZXQ6IChkYXRhOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikgPT4gbnVtYmVyW10pOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKworICAgICAgICAgICAgb3JkZXIoKTogKGRhdGE6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KSA9PiBudW1iZXJbXTsKKyAgICAgICAgICAgIG9yZGVyKG9yZGVyOiAiaW5zaWRlLW91dCIpOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKyAgICAgICAgICAgIG9yZGVyKG9yZGVyOiAicmV2ZXJzZSIpOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKyAgICAgICAgICAgIG9yZGVyKG9yZGVyOiAiZGVmYXVsdCIpOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKyAgICAgICAgICAgIG9yZGVyKG9yZGVyOiBzdHJpbmcpOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKyAgICAgICAgICAgIG9yZGVyKG9yZGVyOiAoZGF0YTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4pID0+IG51bWJlcltdKTogU3RhY2s8U2VyaWVzLCBWYWx1ZT47CisKKyAgICAgICAgICAgIHgoKTogKHZhbHVlOiBWYWx1ZSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgeChhY2Nlc3NvcjogKHZhbHVlOiBWYWx1ZSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogU3RhY2s8U2VyaWVzLCBWYWx1ZT47CisKKyAgICAgICAgICAgIHkoKTogKHZhbHVlOiBWYWx1ZSwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgeShhY2Nlc29yOiAodmFsdWU6IFZhbHVlLCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBTdGFjazxTZXJpZXMsIFZhbHVlPjsKKworICAgICAgICAgICAgb3V0KCk6ICh2YWx1ZTogVmFsdWUsIHkwOiBudW1iZXIsIHk6IG51bWJlcikgPT4gdm9pZDsKKyAgICAgICAgICAgIG91dChzZXR0ZXI6ICh2YWx1ZTogVmFsdWUsIHkwOiBudW1iZXIsIHk6IG51bWJlcikgPT4gdm9pZCk6IFN0YWNrPFNlcmllcywgVmFsdWU+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHRyZWUoKTogVHJlZTx0cmVlLk5vZGU+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gdHJlZTxUIGV4dGVuZHMgdHJlZS5Ob2RlPigpOiBUcmVlPFQ+OworCisgICAgICAgIG1vZHVsZSB0cmVlIHsKKyAgICAgICAgICAgIGludGVyZmFjZSBMaW5rPFQgZXh0ZW5kcyBOb2RlPiB7CisgICAgICAgICAgICAgICAgc291cmNlOiBUOworICAgICAgICAgICAgICAgIHRhcmdldDogVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJmYWNlIE5vZGUgeworICAgICAgICAgICAgICAgIHBhcmVudD86IE5vZGU7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4/OiBOb2RlW107CisgICAgICAgICAgICAgICAgZGVwdGg/OiBudW1iZXI7CisgICAgICAgICAgICAgICAgeD86IG51bWJlcjsKKyAgICAgICAgICAgICAgICB5PzogbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFRyZWU8VD4geworICAgICAgICAgICAgKHJvb3Q6IFQsIGluZGV4PzogbnVtYmVyKTogVFtdOworCisgICAgICAgICAgICBub2Rlcyhyb290OiBULCBpbmRleD86IG51bWJlcik6IFRbXTsKKworICAgICAgICAgICAgbGlua3Mobm9kZXM6IFRbXSk6IHRyZWUuTGluazxUPltdOworCisgICAgICAgICAgICBjaGlsZHJlbigpOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IFRbXTsKKyAgICAgICAgICAgIGNoaWxkcmVuKGNoaWxkcmVuOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IFRbXSk6IFRyZWU8VD47CisKKyAgICAgICAgICAgIHNlcGFyYXRpb24oKTogKGE6IFQsIGI6IFQpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHNlcGFyYXRpb24oc2VwYXJhdGlvbjogKGE6IFQsIGI6IFQpID0+IG51bWJlcik6IFRyZWU8VD47CisKKyAgICAgICAgICAgIHNpemUoKTogW251bWJlciwgbnVtYmVyXTsKKyAgICAgICAgICAgIHNpemUoc2l6ZTogW251bWJlciwgbnVtYmVyXSk6IFRyZWU8VD47CisKKyAgICAgICAgICAgIG5vZGVTaXplKCk6IFtudW1iZXIsIG51bWJlcl07CisgICAgICAgICAgICBub2RlU2l6ZShzaXplOiBbbnVtYmVyLCBudW1iZXJdKTogVHJlZTxUPjsKKworICAgICAgICAgICAgc29ydCgpOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyOworICAgICAgICAgICAgc29ydChjb21wYXJhdG9yOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogVHJlZTxUPjsKKworICAgICAgICAgICAgdmFsdWUoKTogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXI7CisgICAgICAgICAgICB2YWx1ZSh2YWx1ZTogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBUcmVlPFQ+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHRyZWVtYXAoKTogVHJlZW1hcDx0cmVlbWFwLk5vZGU+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gdHJlZW1hcDxUIGV4dGVuZHMgdHJlZW1hcC5Ob2RlPigpOiBUcmVlbWFwPFQ+OworCisgICAgICAgIG1vZHVsZSB0cmVlbWFwIHsKKyAgICAgICAgICAgIGludGVyZmFjZSBOb2RlIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQ/OiBOb2RlOworICAgICAgICAgICAgICAgIGNoaWxkcmVuPzogTm9kZVtdOworICAgICAgICAgICAgICAgIHZhbHVlPzogbnVtYmVyOworICAgICAgICAgICAgICAgIGRlcHRoPzogbnVtYmVyOworICAgICAgICAgICAgICAgIHg/OiBudW1iZXI7CisgICAgICAgICAgICAgICAgeT86IG51bWJlcjsKKyAgICAgICAgICAgICAgICBkeD86IG51bWJlcjsKKyAgICAgICAgICAgICAgICBkeT86IG51bWJlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8VCBleHRlbmRzIE5vZGU+IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6IFQ7CisgICAgICAgICAgICAgICAgdGFyZ2V0OiBUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0eXBlIFBhZGRpbmcgPSBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBUcmVlbWFwPFQgZXh0ZW5kcyB0cmVlbWFwLk5vZGU+IHsKKyAgICAgICAgICAgIChyb290OiBULCBpbmRleD86IG51bWJlcik6IFRbXTsKKworICAgICAgICAgICAgbm9kZXMocm9vdDogVCwgaW5kZXg/OiBudW1iZXIpOiBUW107CisKKyAgICAgICAgICAgIGxpbmtzKG5vZGVzOiBUW10pOiB0cmVlbWFwLkxpbms8VD5bXTsKKworICAgICAgICAgICAgY2hpbGRyZW4oKTogKG5vZGU6IFQsIGRlcHRoOiBudW1iZXIpID0+IFRbXTsKKyAgICAgICAgICAgIGNoaWxkcmVuKGNoaWxkcmVuOiAobm9kZTogVCwgZGVwdGg6IG51bWJlcikgPT4gVFtdKTogVHJlZW1hcDxUPjsKKworICAgICAgICAgICAgc29ydCgpOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyOworICAgICAgICAgICAgc29ydChjb21wYXJhdG9yOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKTogVHJlZW1hcDxUPjsKKworICAgICAgICAgICAgdmFsdWUoKTogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHZhbHVlKHZhbHVlOiAobm9kZTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogVHJlZW1hcDxUPjsKKworICAgICAgICAgICAgc2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdOworICAgICAgICAgICAgc2l6ZShzaXplOiBbbnVtYmVyLCBudW1iZXJdKTogVHJlZW1hcDxUPjsKKworICAgICAgICAgICAgcGFkZGluZygpOiAobm9kZTogVCwgZGVwdGg6IG51bWJlcikgPT4gdHJlZW1hcC5QYWRkaW5nOworICAgICAgICAgICAgcGFkZGluZyhwYWRkaW5nOiB0cmVlbWFwLlBhZGRpbmcpOiBUcmVlbWFwPFQ+OworICAgICAgICAgICAgcGFkZGluZyhwYWRkaW5nOiAobm9kZTogVCwgZGVwdGg6IG51bWJlcikgPT4gdHJlZW1hcC5QYWRkaW5nKTogVHJlZW1hcDxUPjsKKworICAgICAgICAgICAgcm91bmQoKTogYm9vbGVhbjsKKyAgICAgICAgICAgIHJvdW5kKHJvdW5kOiBib29sZWFuKTogVHJlZW1hcDxUPjsKKworICAgICAgICAgICAgc3RpY2t5KCk6IGJvb2xlYW47CisgICAgICAgICAgICBzdGlja3koc3RpY2t5OiBib29sZWFuKTogYm9vbGVhbjsKKworICAgICAgICAgICAgbW9kZSgpOiBzdHJpbmc7CisgICAgICAgICAgICBtb2RlKG1vZGU6ICJzcXVhcmlmeSIpOiBUcmVlbWFwPFQ+OworICAgICAgICAgICAgbW9kZShtb2RlOiAic2xpY2UiKTogVHJlZW1hcDxUPjsKKyAgICAgICAgICAgIG1vZGUobW9kZTogImRpY2UiKTogVHJlZW1hcDxUPjsKKyAgICAgICAgICAgIG1vZGUobW9kZTogInNsaWNlLWRpY2UiKTogVHJlZW1hcDxUPjsKKyAgICAgICAgICAgIG1vZGUobW9kZTogc3RyaW5nKTogVHJlZW1hcDxUPjsKKworICAgICAgICAgICAgcmF0aW8oKTogbnVtYmVyOworICAgICAgICAgICAgcmF0aW8ocmF0aW86IG51bWJlcik6IFRyZWVtYXA8VD47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtb2R1bGUgZ2VvbSB7CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB2b3Jvbm9pKCk6IFZvcm9ub2k8W251bWJlciwgbnVtYmVyXT47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiB2b3Jvbm9pPFQ+KCk6IFZvcm9ub2k8VD47CisKKyAgICAgICAgbW9kdWxlIHZvcm9ub2kgeworICAgICAgICAgICAgaW50ZXJmYWNlIExpbms8VD4geworICAgICAgICAgICAgICAgIHNvdXJjZTogVDsKKyAgICAgICAgICAgICAgICB0YXJnZXQ6IFQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcmZhY2UgVm9yb25vaTxUPiB7CisgICAgICAgICAgICAoZGF0YTogVFtdKTogQXJyYXk8W251bWJlciwgbnVtYmVyXT47CisKKyAgICAgICAgICAgIHgoKTogKHZlcnRleDogVCkgPT4gbnVtYmVyOworICAgICAgICAgICAgeCh4OiAodmVydGV4OiBUKSA9PiBudW1iZXIpOiBWb3Jvbm9pPFQ+OworCisgICAgICAgICAgICB5KCk6ICh2ZXJ0ZXg6IFQpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHkoeTogKHZlcnRleDogVCkgPT4gbnVtYmVyKTogVm9yb25vaTxUPjsKKworICAgICAgICAgICAgY2xpcEV4dGVudCgpOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07CisgICAgICAgICAgICBjbGlwRXh0ZW50KGV4dGVudDogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dKTogVm9yb25vaTxUPjsKKworICAgICAgICAgICAgbGlua3MoZGF0YTogVFtdKTogdm9yb25vaS5MaW5rPFQ+W107CisKKyAgICAgICAgICAgIHRyaWFuZ2xlcyhkYXRhOiBUW10pOiBBcnJheTxbVCwgVCwgVF0+OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSBkMy5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXMoKSBpbnN0ZWFkCisgICAgICAgICAqLworICAgICAgICBleHBvcnQgZnVuY3Rpb24gZGVsYXVuYXkodmVydGljZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KTogQXJyYXk8W1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dPjsKKworICAgICAgICBleHBvcnQgZnVuY3Rpb24gcXVhZHRyZWUoKTogUXVhZHRyZWU8W251bWJlciwgbnVtYmVyXT47CisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBxdWFkdHJlZTxUPigpOiBRdWFkdHJlZTxUPjsKKworICAgICAgICBtb2R1bGUgcXVhZHRyZWUgeworICAgICAgICAgICAgaW50ZXJmYWNlIE5vZGU8VD4geworICAgICAgICAgICAgICAgIG5vZGVzOiBbTm9kZTxUPiwgTm9kZTxUPiwgTm9kZTxUPiwgTm9kZTxUPl07CisgICAgICAgICAgICAgICAgbGVhZjogYm9vbGVhbjsKKyAgICAgICAgICAgICAgICBwb2ludDogVDsKKyAgICAgICAgICAgICAgICB4OiBudW1iZXI7CisgICAgICAgICAgICAgICAgeTogbnVtYmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcmZhY2UgUXVhZHRyZWU8VD4gZXh0ZW5kcyBOb2RlPFQ+IHsKKyAgICAgICAgICAgICAgICBhZGQocG9pbnQ6IFQpOiB2b2lkOworICAgICAgICAgICAgICAgIHZpc2l0KGNhbGxiYWNrOiAobm9kZTogTm9kZTxUPiwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkOworICAgICAgICAgICAgICAgIGZpbmQocG9pbnQ6IFtudW1iZXIsIG51bWJlcl0pOiBUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFF1YWR0cmVlPFQ+IHsKKyAgICAgICAgICAgIChwb2ludHM6IFRbXSk6IHF1YWR0cmVlLlF1YWR0cmVlPFQ+OworCisgICAgICAgICAgICB4KCk6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyOworICAgICAgICAgICAgeCh4OiBudW1iZXIpOiBRdWFkdHJlZTxUPjsKKyAgICAgICAgICAgIHgoeDogKGRhdHVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBudW1iZXIpOiBRdWFkdHJlZTxUPjsKKworICAgICAgICAgICAgeSgpOiAoZGF0dW06IFQsIGluZGV4OiBudW1iZXIpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHkoeTogbnVtYmVyKTogUXVhZHRyZWU8VD47CisgICAgICAgICAgICB5KHk6IChkYXR1bTogVCwgaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyKTogUXVhZHRyZWU8VD47CisKKyAgICAgICAgICAgIGV4dGVudCgpOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07CisgICAgICAgICAgICBleHRlbnQoZXh0ZW50OiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0pOiBRdWFkdHJlZTxUPjsKKyAgICAgICAgfQorCisgICAgICAgIGV4cG9ydCBmdW5jdGlvbiBodWxsKHZlcnRpY2VzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPik6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gaHVsbCgpOiBIdWxsPFtudW1iZXIsIG51bWJlcl0+OworICAgICAgICBleHBvcnQgZnVuY3Rpb24gaHVsbDxUPigpOiBIdWxsPFQ+OworCisgICAgICAgIGludGVyZmFjZSBIdWxsPFQ+IHsKKyAgICAgICAgICAgICh2ZXJ0aWNlczogVFtdKTogQXJyYXk8W251bWJlciwgbnVtYmVyXT47CisKKyAgICAgICAgICAgIHgoKTogKGRhdHVtOiBUKSA9PiBudW1iZXI7CisgICAgICAgICAgICB4KHg6IChkYXR1bTogVCkgPT4gbnVtYmVyKTogSHVsbDxUPjsKKworICAgICAgICAgICAgeSgpOiAoZGF0dW06IFQpID0+IG51bWJlcjsKKyAgICAgICAgICAgIHkoeTogKGRhdHVtOiBUKSA9PiBudW1iZXIpOiBIdWxsPFQ+OworICAgICAgICB9CisKKyAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb24odmVydGljZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KTogUG9seWdvbjsKKworICAgICAgICBpbnRlcmZhY2UgUG9seWdvbiB7CisgICAgICAgICAgICBhcmVhKCk6IG51bWJlcjsKKworICAgICAgICAgICAgY2VudHJvaWQoKTogW251bWJlciwgbnVtYmVyXTsKKworICAgICAgICAgICAgY2xpcChzdWJqZWN0OiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPik6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+OworICAgICAgICB9CisgICAgfQorfQorCisvLyB3ZSBuZWVkIHRoaXMgdG8gZXhpc3QKK2ludGVyZmFjZSBUb3VjaExpc3QgeyB9CisKK2RlY2xhcmUgbW9kdWxlICdkMycgeworICAgIGV4cG9ydCA9IGQzOworfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2phc21pbmUvamFzbWluZS5kLnRzIGIvY2F0YWxvZy11aS90eXBpbmdzL2phc21pbmUvamFzbWluZS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Y2NiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3R5cGluZ3MvamFzbWluZS9qYXNtaW5lLmQudHMKQEAgLTAsMCArMSw1MTUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyBUeXBlIGRlZmluaXRpb25zIGZvciBKYXNtaW5lIDIuMgorLy8gUHJvamVjdDogaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLworLy8gRGVmaW5pdGlvbnMgYnk6IEJvcmlzIFlhbmtvdiA8aHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292Lz4sIFRoZW9kb3JlIEJyb3duIDxodHRwczovL2dpdGh1Yi5jb20vdGhlb2RvcmVqYj4sIERhdmlkIFDDpHJzc29uIDxodHRwczovL2dpdGh1Yi5jb20vZGF2aWRwYXJzc29uLz4KKy8vIERlZmluaXRpb25zOiBodHRwczovL2dpdGh1Yi5jb20vYm9yaXN5YW5rb3YvRGVmaW5pdGVseVR5cGVkCisKKworLy8gRm9yIGRkZXNjcmliZSAvIGlpdCB1c2UgOiBodHRwczovL2dpdGh1Yi5jb20vYm9yaXN5YW5rb3YvRGVmaW5pdGVseVR5cGVkL2Jsb2IvbWFzdGVyL2thcm1hLWphc21pbmUva2FybWEtamFzbWluZS5kLnRzCisKK2RlY2xhcmUgZnVuY3Rpb24gZGVzY3JpYmUoZGVzY3JpcHRpb246IHN0cmluZywgc3BlY0RlZmluaXRpb25zOiAoKSA9PiB2b2lkKTogdm9pZDsKK2RlY2xhcmUgZnVuY3Rpb24gZmRlc2NyaWJlKGRlc2NyaXB0aW9uOiBzdHJpbmcsIHNwZWNEZWZpbml0aW9uczogKCkgPT4gdm9pZCk6IHZvaWQ7CitkZWNsYXJlIGZ1bmN0aW9uIHhkZXNjcmliZShkZXNjcmlwdGlvbjogc3RyaW5nLCBzcGVjRGVmaW5pdGlvbnM6ICgpID0+IHZvaWQpOiB2b2lkOworCitkZWNsYXJlIGZ1bmN0aW9uIGl0KGV4cGVjdGF0aW9uOiBzdHJpbmcsIGFzc2VydGlvbj86ICgpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpOiB2b2lkOworZGVjbGFyZSBmdW5jdGlvbiBpdChleHBlY3RhdGlvbjogc3RyaW5nLCBhc3NlcnRpb24/OiAoZG9uZTogKCkgPT4gdm9pZCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IHZvaWQ7CitkZWNsYXJlIGZ1bmN0aW9uIGZpdChleHBlY3RhdGlvbjogc3RyaW5nLCBhc3NlcnRpb24/OiAoKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKTogdm9pZDsKK2RlY2xhcmUgZnVuY3Rpb24gZml0KGV4cGVjdGF0aW9uOiBzdHJpbmcsIGFzc2VydGlvbj86IChkb25lOiAoKSA9PiB2b2lkKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKTogdm9pZDsKK2RlY2xhcmUgZnVuY3Rpb24geGl0KGV4cGVjdGF0aW9uOiBzdHJpbmcsIGFzc2VydGlvbj86ICgpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpOiB2b2lkOworZGVjbGFyZSBmdW5jdGlvbiB4aXQoZXhwZWN0YXRpb246IHN0cmluZywgYXNzZXJ0aW9uPzogKGRvbmU6ICgpID0+IHZvaWQpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpOiB2b2lkOworCisvKiogSWYgeW91IGNhbGwgdGhlIGZ1bmN0aW9uIHBlbmRpbmcgYW55d2hlcmUgaW4gdGhlIHNwZWMgYm9keSwgbm8gbWF0dGVyIHRoZSBleHBlY3RhdGlvbnMsIHRoZSBzcGVjIHdpbGwgYmUgbWFya2VkIHBlbmRpbmcuICovCitkZWNsYXJlIGZ1bmN0aW9uIHBlbmRpbmcocmVhc29uPzogc3RyaW5nKTogdm9pZDsKKworZGVjbGFyZSBmdW5jdGlvbiBiZWZvcmVFYWNoKGFjdGlvbjogKCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IHZvaWQ7CitkZWNsYXJlIGZ1bmN0aW9uIGJlZm9yZUVhY2goYWN0aW9uOiAoZG9uZTogKCkgPT4gdm9pZCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IHZvaWQ7CitkZWNsYXJlIGZ1bmN0aW9uIGFmdGVyRWFjaChhY3Rpb246ICgpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpOiB2b2lkOworZGVjbGFyZSBmdW5jdGlvbiBhZnRlckVhY2goYWN0aW9uOiAoZG9uZTogKCkgPT4gdm9pZCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IHZvaWQ7CisKK2RlY2xhcmUgZnVuY3Rpb24gYmVmb3JlQWxsKGFjdGlvbjogKCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IHZvaWQ7CitkZWNsYXJlIGZ1bmN0aW9uIGJlZm9yZUFsbChhY3Rpb246IChkb25lOiAoKSA9PiB2b2lkKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKTogdm9pZDsKK2RlY2xhcmUgZnVuY3Rpb24gYWZ0ZXJBbGwoYWN0aW9uOiAoKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKTogdm9pZDsKK2RlY2xhcmUgZnVuY3Rpb24gYWZ0ZXJBbGwoYWN0aW9uOiAoZG9uZTogKCkgPT4gdm9pZCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IHZvaWQ7CisKK2RlY2xhcmUgZnVuY3Rpb24gZXhwZWN0KHNweTogRnVuY3Rpb24pOiBqYXNtaW5lLk1hdGNoZXJzOworZGVjbGFyZSBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnkpOiBqYXNtaW5lLk1hdGNoZXJzOworCitkZWNsYXJlIGZ1bmN0aW9uIGZhaWwoZT86IGFueSk6IHZvaWQ7CisKK2RlY2xhcmUgZnVuY3Rpb24gc3B5T24ob2JqZWN0OiBhbnksIG1ldGhvZDogc3RyaW5nKTogamFzbWluZS5TcHk7CisKK2RlY2xhcmUgZnVuY3Rpb24gcnVucyhhc3luY01ldGhvZDogRnVuY3Rpb24pOiB2b2lkOworZGVjbGFyZSBmdW5jdGlvbiB3YWl0c0ZvcihsYXRjaE1ldGhvZDogKCkgPT4gYm9vbGVhbiwgZmFpbHVyZU1lc3NhZ2U/OiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIpOiB2b2lkOworZGVjbGFyZSBmdW5jdGlvbiB3YWl0cyh0aW1lb3V0PzogbnVtYmVyKTogdm9pZDsKKworZGVjbGFyZSBtb2R1bGUgamFzbWluZSB7CisKKyAgICB2YXIgY2xvY2s6ICgpID0+IENsb2NrOworCisgICAgZnVuY3Rpb24gYW55KGFjbGFzczogYW55KTogQW55OworICAgIGZ1bmN0aW9uIGFueXRoaW5nKCk6IEFueTsKKyAgICBmdW5jdGlvbiBhcnJheUNvbnRhaW5pbmcoc2FtcGxlOiBhbnlbXSk6IEFycmF5Q29udGFpbmluZzsKKyAgICBmdW5jdGlvbiBvYmplY3RDb250YWluaW5nKHNhbXBsZTogYW55KTogT2JqZWN0Q29udGFpbmluZzsKKyAgICBmdW5jdGlvbiBjcmVhdGVTcHkobmFtZTogc3RyaW5nLCBvcmlnaW5hbEZuPzogRnVuY3Rpb24pOiBTcHk7CisgICAgZnVuY3Rpb24gY3JlYXRlU3B5T2JqKGJhc2VOYW1lOiBzdHJpbmcsIG1ldGhvZE5hbWVzOiBhbnlbXSk6IGFueTsKKyAgICBmdW5jdGlvbiBjcmVhdGVTcHlPYmo8VD4oYmFzZU5hbWU6IHN0cmluZywgbWV0aG9kTmFtZXM6IGFueVtdKTogVDsKKyAgICBmdW5jdGlvbiBwcCh2YWx1ZTogYW55KTogc3RyaW5nOworICAgIGZ1bmN0aW9uIGdldEVudigpOiBFbnY7CisgICAgZnVuY3Rpb24gYWRkQ3VzdG9tRXF1YWxpdHlUZXN0ZXIoZXF1YWxpdHlUZXN0ZXI6IEN1c3RvbUVxdWFsaXR5VGVzdGVyKTogdm9pZDsKKyAgICBmdW5jdGlvbiBhZGRNYXRjaGVycyhtYXRjaGVyczogQ3VzdG9tTWF0Y2hlckZhY3Rvcmllcyk6IHZvaWQ7CisgICAgZnVuY3Rpb24gc3RyaW5nTWF0Y2hpbmcoc3RyOiBzdHJpbmcpOiBBbnk7CisgICAgZnVuY3Rpb24gc3RyaW5nTWF0Y2hpbmcoc3RyOiBSZWdFeHApOiBBbnk7CisKKyAgICBpbnRlcmZhY2UgQW55IHsKKworICAgICAgICBuZXcgKGV4cGVjdGVkQ2xhc3M6IGFueSk6IGFueTsKKworICAgICAgICBqYXNtaW5lTWF0Y2hlcyhvdGhlcjogYW55KTogYm9vbGVhbjsKKyAgICAgICAgamFzbWluZVRvU3RyaW5nKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICAvLyB0YWtlbiBmcm9tIFR5cGVTY3JpcHQgbGliLmNvcmUuZXM2LmQudHMsIGFwcGxpY2FibGUgdG8gQ3VzdG9tTWF0Y2hlcnMuY29udGFpbnMoKQorICAgIGludGVyZmFjZSBBcnJheUxpa2U8VD4geworICAgICAgICBsZW5ndGg6IG51bWJlcjsKKyAgICAgICAgW246IG51bWJlcl06IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEFycmF5Q29udGFpbmluZyB7CisgICAgICAgIG5ldyAoc2FtcGxlOiBhbnlbXSk6IGFueTsKKworICAgICAgICBhc3ltbWV0cmljTWF0Y2gob3RoZXI6IGFueSk6IGJvb2xlYW47CisgICAgICAgIGphc21pbmVUb1N0cmluZygpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIE9iamVjdENvbnRhaW5pbmcgeworICAgICAgICBuZXcgKHNhbXBsZTogYW55KTogYW55OworCisgICAgICAgIGphc21pbmVNYXRjaGVzKG90aGVyOiBhbnksIG1pc21hdGNoS2V5czogYW55W10sIG1pc21hdGNoVmFsdWVzOiBhbnlbXSk6IGJvb2xlYW47CisgICAgICAgIGphc21pbmVUb1N0cmluZygpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEJsb2NrIHsKKworICAgICAgICBuZXcgKGVudjogRW52LCBmdW5jOiBTcGVjRnVuY3Rpb24sIHNwZWM6IFNwZWMpOiBhbnk7CisKKyAgICAgICAgZXhlY3V0ZShvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgV2FpdHNCbG9jayBleHRlbmRzIEJsb2NrIHsKKyAgICAgICAgbmV3IChlbnY6IEVudiwgdGltZW91dDogbnVtYmVyLCBzcGVjOiBTcGVjKTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBXYWl0c0ZvckJsb2NrIGV4dGVuZHMgQmxvY2sgeworICAgICAgICBuZXcgKGVudjogRW52LCB0aW1lb3V0OiBudW1iZXIsIGxhdGNoRnVuY3Rpb246IFNwZWNGdW5jdGlvbiwgbWVzc2FnZTogc3RyaW5nLCBzcGVjOiBTcGVjKTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBDbG9jayB7CisgICAgICAgIGluc3RhbGwoKTogdm9pZDsKKyAgICAgICAgdW5pbnN0YWxsKCk6IHZvaWQ7CisgICAgICAgIC8qKiBDYWxscyB0byBhbnkgcmVnaXN0ZXJlZCBjYWxsYmFjayBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNsb2NrIGlzIHRpY2tlZCBmb3J3YXJkIHZpYSB0aGUgamFzbWluZS5jbG9jaygpLnRpY2sgZnVuY3Rpb24sIHdoaWNoIHRha2VzIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gKi8KKyAgICAgICAgdGljayhtczogbnVtYmVyKTogdm9pZDsKKyAgICAgICAgbW9ja0RhdGUoZGF0ZT86IERhdGUpOiB2b2lkOworICAgIH0KKworICAgIGludGVyZmFjZSBDdXN0b21FcXVhbGl0eVRlc3RlciB7CisgICAgICAgIChmaXJzdDogYW55LCBzZWNvbmQ6IGFueSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIEN1c3RvbU1hdGNoZXIgeworICAgICAgICBjb21wYXJlPFQ+KGFjdHVhbDogVCwgZXhwZWN0ZWQ6IFQpOiBDdXN0b21NYXRjaGVyUmVzdWx0OworICAgICAgICBjb21wYXJlKGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55KTogQ3VzdG9tTWF0Y2hlclJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ3VzdG9tTWF0Y2hlckZhY3RvcnkgeworICAgICAgICAodXRpbDogTWF0Y2hlcnNVdGlsLCBjdXN0b21FcXVhbGl0eVRlc3RlcnM6IEFycmF5PEN1c3RvbUVxdWFsaXR5VGVzdGVyPik6IEN1c3RvbU1hdGNoZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEN1c3RvbU1hdGNoZXJGYWN0b3JpZXMgeworICAgICAgICBbaW5kZXg6IHN0cmluZ106IEN1c3RvbU1hdGNoZXJGYWN0b3J5OworICAgIH0KKworICAgIGludGVyZmFjZSBDdXN0b21NYXRjaGVyUmVzdWx0IHsKKyAgICAgICAgcGFzczogYm9vbGVhbjsKKyAgICAgICAgbWVzc2FnZTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBNYXRjaGVyc1V0aWwgeworICAgICAgICBlcXVhbHMoYTogYW55LCBiOiBhbnksIGN1c3RvbVRlc3RlcnM/OiBBcnJheTxDdXN0b21FcXVhbGl0eVRlc3Rlcj4pOiBib29sZWFuOworICAgICAgICBjb250YWluczxUPihoYXlzdGFjazogQXJyYXlMaWtlPFQ+IHwgc3RyaW5nLCBuZWVkbGU6IGFueSwgY3VzdG9tVGVzdGVycz86IEFycmF5PEN1c3RvbUVxdWFsaXR5VGVzdGVyPik6IGJvb2xlYW47CisgICAgICAgIGJ1aWxkRmFpbHVyZU1lc3NhZ2UobWF0Y2hlck5hbWU6IHN0cmluZywgaXNOb3Q6IGJvb2xlYW4sIGFjdHVhbDogYW55LCAuLi5leHBlY3RlZDogQXJyYXk8YW55Pik6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgRW52IHsKKyAgICAgICAgc2V0VGltZW91dDogYW55OworICAgICAgICBjbGVhclRpbWVvdXQ6IHZvaWQ7CisgICAgICAgIHNldEludGVydmFsOiBhbnk7CisgICAgICAgIGNsZWFySW50ZXJ2YWw6IHZvaWQ7CisgICAgICAgIHVwZGF0ZUludGVydmFsOiBudW1iZXI7CisKKyAgICAgICAgY3VycmVudFNwZWM6IFNwZWM7CisKKyAgICAgICAgbWF0Y2hlcnNDbGFzczogTWF0Y2hlcnM7CisKKyAgICAgICAgdmVyc2lvbigpOiBhbnk7CisgICAgICAgIHZlcnNpb25TdHJpbmcoKTogc3RyaW5nOworICAgICAgICBuZXh0U3BlY0lkKCk6IG51bWJlcjsKKyAgICAgICAgYWRkUmVwb3J0ZXIocmVwb3J0ZXI6IFJlcG9ydGVyKTogdm9pZDsKKyAgICAgICAgZXhlY3V0ZSgpOiB2b2lkOworICAgICAgICBkZXNjcmliZShkZXNjcmlwdGlvbjogc3RyaW5nLCBzcGVjRGVmaW5pdGlvbnM6ICgpID0+IHZvaWQpOiBTdWl0ZTsKKyAgICAgICAgLy8gZGRlc2NyaWJlKGRlc2NyaXB0aW9uOiBzdHJpbmcsIHNwZWNEZWZpbml0aW9uczogKCkgPT4gdm9pZCk6IFN1aXRlOyBOb3QgYSBwYXJ0IG9mIGphc21pbmUuIEFuZ3VsYXIgdGVhbSBhZGRzIHRoZXNlCisgICAgICAgIGJlZm9yZUVhY2goYmVmb3JlRWFjaEZ1bmN0aW9uOiAoKSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgYmVmb3JlQWxsKGJlZm9yZUFsbEZ1bmN0aW9uOiAoKSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgY3VycmVudFJ1bm5lcigpOiBSdW5uZXI7CisgICAgICAgIGFmdGVyRWFjaChhZnRlckVhY2hGdW5jdGlvbjogKCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIGFmdGVyQWxsKGFmdGVyQWxsRnVuY3Rpb246ICgpID0+IHZvaWQpOiB2b2lkOworICAgICAgICB4ZGVzY3JpYmUoZGVzYzogc3RyaW5nLCBzcGVjRGVmaW5pdGlvbnM6ICgpID0+IHZvaWQpOiBYU3VpdGU7CisgICAgICAgIGl0KGRlc2NyaXB0aW9uOiBzdHJpbmcsIGZ1bmM6ICgpID0+IHZvaWQpOiBTcGVjOworICAgICAgICAvLyBpaXQoZGVzY3JpcHRpb246IHN0cmluZywgZnVuYzogKCkgPT4gdm9pZCk6IFNwZWM7IE5vdCBhIHBhcnQgb2YgamFzbWluZS4gQW5ndWxhciB0ZWFtIGFkZHMgdGhlc2UKKyAgICAgICAgeGl0KGRlc2M6IHN0cmluZywgZnVuYzogKCkgPT4gdm9pZCk6IFhTcGVjOworICAgICAgICBjb21wYXJlUmVnRXhwc18oYTogUmVnRXhwLCBiOiBSZWdFeHAsIG1pc21hdGNoS2V5czogc3RyaW5nW10sIG1pc21hdGNoVmFsdWVzOiBzdHJpbmdbXSk6IGJvb2xlYW47CisgICAgICAgIGNvbXBhcmVPYmplY3RzXyhhOiBhbnksIGI6IGFueSwgbWlzbWF0Y2hLZXlzOiBzdHJpbmdbXSwgbWlzbWF0Y2hWYWx1ZXM6IHN0cmluZ1tdKTogYm9vbGVhbjsKKyAgICAgICAgZXF1YWxzXyhhOiBhbnksIGI6IGFueSwgbWlzbWF0Y2hLZXlzOiBzdHJpbmdbXSwgbWlzbWF0Y2hWYWx1ZXM6IHN0cmluZ1tdKTogYm9vbGVhbjsKKyAgICAgICAgY29udGFpbnNfKGhheXN0YWNrOiBhbnksIG5lZWRsZTogYW55KTogYm9vbGVhbjsKKyAgICAgICAgYWRkQ3VzdG9tRXF1YWxpdHlUZXN0ZXIoZXF1YWxpdHlUZXN0ZXI6IEN1c3RvbUVxdWFsaXR5VGVzdGVyKTogdm9pZDsKKyAgICAgICAgYWRkTWF0Y2hlcnMobWF0Y2hlcnM6IEN1c3RvbU1hdGNoZXJGYWN0b3JpZXMpOiB2b2lkOworICAgICAgICBzcGVjRmlsdGVyKHNwZWM6IFNwZWMpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBGYWtlVGltZXIgeworCisgICAgICAgIG5ldyAoKTogYW55OworCisgICAgICAgIHJlc2V0KCk6IHZvaWQ7CisgICAgICAgIHRpY2sobWlsbGlzOiBudW1iZXIpOiB2b2lkOworICAgICAgICBydW5GdW5jdGlvbnNXaXRoaW5SYW5nZShvbGRNaWxsaXM6IG51bWJlciwgbm93TWlsbGlzOiBudW1iZXIpOiB2b2lkOworICAgICAgICBzY2hlZHVsZUZ1bmN0aW9uKHRpbWVvdXRLZXk6IGFueSwgZnVuY1RvQ2FsbDogKCkgPT4gdm9pZCwgbWlsbGlzOiBudW1iZXIsIHJlY3VycmluZzogYm9vbGVhbik6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEh0bWxSZXBvcnRlciB7CisgICAgICAgIG5ldyAoKTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBIdG1sU3BlY0ZpbHRlciB7CisgICAgICAgIG5ldyAoKTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBSZXN1bHQgeworICAgICAgICB0eXBlOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIE5lc3RlZFJlc3VsdHMgZXh0ZW5kcyBSZXN1bHQgeworICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nOworCisgICAgICAgIHRvdGFsQ291bnQ6IG51bWJlcjsKKyAgICAgICAgcGFzc2VkQ291bnQ6IG51bWJlcjsKKyAgICAgICAgZmFpbGVkQ291bnQ6IG51bWJlcjsKKworICAgICAgICBza2lwcGVkOiBib29sZWFuOworCisgICAgICAgIHJvbGx1cENvdW50cyhyZXN1bHQ6IE5lc3RlZFJlc3VsdHMpOiB2b2lkOworICAgICAgICBsb2codmFsdWVzOiBhbnkpOiB2b2lkOworICAgICAgICBnZXRJdGVtcygpOiBSZXN1bHRbXTsKKyAgICAgICAgYWRkUmVzdWx0KHJlc3VsdDogUmVzdWx0KTogdm9pZDsKKyAgICAgICAgcGFzc2VkKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIE1lc3NhZ2VSZXN1bHQgZXh0ZW5kcyBSZXN1bHQgIHsKKyAgICAgICAgdmFsdWVzOiBhbnk7CisgICAgICAgIHRyYWNlOiBUcmFjZTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgRXhwZWN0YXRpb25SZXN1bHQgZXh0ZW5kcyBSZXN1bHQgIHsKKyAgICAgICAgbWF0Y2hlck5hbWU6IHN0cmluZzsKKyAgICAgICAgcGFzc2VkKCk6IGJvb2xlYW47CisgICAgICAgIGV4cGVjdGVkOiBhbnk7CisgICAgICAgIGFjdHVhbDogYW55OworICAgICAgICBtZXNzYWdlOiBzdHJpbmc7CisgICAgICAgIHRyYWNlOiBUcmFjZTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgVHJhY2UgeworICAgICAgICBuYW1lOiBzdHJpbmc7CisgICAgICAgIG1lc3NhZ2U6IHN0cmluZzsKKyAgICAgICAgc3RhY2s6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgUHJldHR5UHJpbnRlciB7CisKKyAgICAgICAgbmV3ICgpOiBhbnk7CisKKyAgICAgICAgZm9ybWF0KHZhbHVlOiBhbnkpOiB2b2lkOworICAgICAgICBpdGVyYXRlT2JqZWN0KG9iajogYW55LCBmbjogKHByb3BlcnR5OiBzdHJpbmcsIGlzR2V0dGVyOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgZW1pdFNjYWxhcih2YWx1ZTogYW55KTogdm9pZDsKKyAgICAgICAgZW1pdFN0cmluZyh2YWx1ZTogc3RyaW5nKTogdm9pZDsKKyAgICAgICAgZW1pdEFycmF5KGFycmF5OiBhbnlbXSk6IHZvaWQ7CisgICAgICAgIGVtaXRPYmplY3Qob2JqOiBhbnkpOiB2b2lkOworICAgICAgICBhcHBlbmQodmFsdWU6IGFueSk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFN0cmluZ1ByZXR0eVByaW50ZXIgZXh0ZW5kcyBQcmV0dHlQcmludGVyIHsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgUXVldWUgeworCisgICAgICAgIG5ldyAoZW52OiBhbnkpOiBhbnk7CisKKyAgICAgICAgZW52OiBFbnY7CisgICAgICAgIGVuc3VyZWQ6IGJvb2xlYW5bXTsKKyAgICAgICAgYmxvY2tzOiBCbG9ja1tdOworICAgICAgICBydW5uaW5nOiBib29sZWFuOworICAgICAgICBpbmRleDogbnVtYmVyOworICAgICAgICBvZmZzZXQ6IG51bWJlcjsKKyAgICAgICAgYWJvcnQ6IGJvb2xlYW47CisKKyAgICAgICAgYWRkQmVmb3JlKGJsb2NrOiBCbG9jaywgZW5zdXJlPzogYm9vbGVhbik6IHZvaWQ7CisgICAgICAgIGFkZChibG9jazogYW55LCBlbnN1cmU/OiBib29sZWFuKTogdm9pZDsKKyAgICAgICAgaW5zZXJ0TmV4dChibG9jazogYW55LCBlbnN1cmU/OiBib29sZWFuKTogdm9pZDsKKyAgICAgICAgc3RhcnQob25Db21wbGV0ZT86ICgpID0+IHZvaWQpOiB2b2lkOworICAgICAgICBpc1J1bm5pbmcoKTogYm9vbGVhbjsKKyAgICAgICAgbmV4dF8oKTogdm9pZDsKKyAgICAgICAgcmVzdWx0cygpOiBOZXN0ZWRSZXN1bHRzOworICAgIH0KKworICAgIGludGVyZmFjZSBNYXRjaGVycyB7CisKKyAgICAgICAgbmV3IChlbnY6IEVudiwgYWN0dWFsOiBhbnksIHNwZWM6IEVudiwgaXNOb3Q/OiBib29sZWFuKTogYW55OworCisgICAgICAgIGVudjogRW52OworICAgICAgICBhY3R1YWw6IGFueTsKKyAgICAgICAgc3BlYzogRW52OworICAgICAgICBpc05vdD86IGJvb2xlYW47CisgICAgICAgIG1lc3NhZ2UoKTogYW55OworCisgICAgICAgIHRvQmUoZXhwZWN0ZWQ6IGFueSwgZXhwZWN0YXRpb25GYWlsT3V0cHV0PzogYW55KTogYm9vbGVhbjsKKyAgICAgICAgdG9FcXVhbChleHBlY3RlZDogYW55LCBleHBlY3RhdGlvbkZhaWxPdXRwdXQ/OiBhbnkpOiBib29sZWFuOworICAgICAgICB0b01hdGNoKGV4cGVjdGVkOiBhbnksIGV4cGVjdGF0aW9uRmFpbE91dHB1dD86IGFueSk6IGJvb2xlYW47CisgICAgICAgIHRvQmVEZWZpbmVkKGV4cGVjdGF0aW9uRmFpbE91dHB1dD86IGFueSk6IGJvb2xlYW47CisgICAgICAgIHRvQmVVbmRlZmluZWQoZXhwZWN0YXRpb25GYWlsT3V0cHV0PzogYW55KTogYm9vbGVhbjsKKyAgICAgICAgdG9CZU51bGwoZXhwZWN0YXRpb25GYWlsT3V0cHV0PzogYW55KTogYm9vbGVhbjsKKyAgICAgICAgdG9CZU5hTigpOiBib29sZWFuOworICAgICAgICB0b0JlVHJ1dGh5KGV4cGVjdGF0aW9uRmFpbE91dHB1dD86IGFueSk6IGJvb2xlYW47CisgICAgICAgIHRvQmVGYWxzeShleHBlY3RhdGlvbkZhaWxPdXRwdXQ/OiBhbnkpOiBib29sZWFuOworICAgICAgICB0b0hhdmVCZWVuQ2FsbGVkKCk6IGJvb2xlYW47CisgICAgICAgIHRvSGF2ZUJlZW5DYWxsZWRXaXRoKC4uLnBhcmFtczogYW55W10pOiBib29sZWFuOworICAgICAgICB0b0NvbnRhaW4oZXhwZWN0ZWQ6IGFueSwgZXhwZWN0YXRpb25GYWlsT3V0cHV0PzogYW55KTogYm9vbGVhbjsKKyAgICAgICAgdG9CZUxlc3NUaGFuKGV4cGVjdGVkOiBhbnksIGV4cGVjdGF0aW9uRmFpbE91dHB1dD86IGFueSk6IGJvb2xlYW47CisgICAgICAgIHRvQmVHcmVhdGVyVGhhbihleHBlY3RlZDogYW55LCBleHBlY3RhdGlvbkZhaWxPdXRwdXQ/OiBhbnkpOiBib29sZWFuOworICAgICAgICB0b0JlQ2xvc2VUbyhleHBlY3RlZDogYW55LCBwcmVjaXNpb246IGFueSwgZXhwZWN0YXRpb25GYWlsT3V0cHV0PzogYW55KTogYm9vbGVhbjsKKyAgICAgICAgdG9Db250YWluSHRtbChleHBlY3RlZDogc3RyaW5nKTogYm9vbGVhbjsKKyAgICAgICAgdG9Db250YWluVGV4dChleHBlY3RlZDogc3RyaW5nKTogYm9vbGVhbjsKKyAgICAgICAgdG9UaHJvdyhleHBlY3RlZD86IGFueSk6IGJvb2xlYW47CisgICAgICAgIHRvVGhyb3dFcnJvcihleHBlY3RlZD86IGFueSwgbWVzc2FnZT86IHN0cmluZyk6IGJvb2xlYW47CisgICAgICAgIG5vdDogTWF0Y2hlcnM7CisKKyAgICAgICAgQW55OiBBbnk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFJlcG9ydGVyIHsKKyAgICAgICAgcmVwb3J0UnVubmVyU3RhcnRpbmcocnVubmVyOiBSdW5uZXIpOiB2b2lkOworICAgICAgICByZXBvcnRSdW5uZXJSZXN1bHRzKHJ1bm5lcjogUnVubmVyKTogdm9pZDsKKyAgICAgICAgcmVwb3J0U3VpdGVSZXN1bHRzKHN1aXRlOiBTdWl0ZSk6IHZvaWQ7CisgICAgICAgIHJlcG9ydFNwZWNTdGFydGluZyhzcGVjOiBTcGVjKTogdm9pZDsKKyAgICAgICAgcmVwb3J0U3BlY1Jlc3VsdHMoc3BlYzogU3BlYyk6IHZvaWQ7CisgICAgICAgIGxvZyhzdHI6IHN0cmluZyk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIE11bHRpUmVwb3J0ZXIgZXh0ZW5kcyBSZXBvcnRlciB7CisgICAgICAgIGFkZFJlcG9ydGVyKHJlcG9ydGVyOiBSZXBvcnRlcik6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFJ1bm5lciB7CisKKyAgICAgICAgbmV3IChlbnY6IEVudik6IGFueTsKKworICAgICAgICBleGVjdXRlKCk6IHZvaWQ7CisgICAgICAgIGJlZm9yZUVhY2goYmVmb3JlRWFjaEZ1bmN0aW9uOiBTcGVjRnVuY3Rpb24pOiB2b2lkOworICAgICAgICBhZnRlckVhY2goYWZ0ZXJFYWNoRnVuY3Rpb246IFNwZWNGdW5jdGlvbik6IHZvaWQ7CisgICAgICAgIGJlZm9yZUFsbChiZWZvcmVBbGxGdW5jdGlvbjogU3BlY0Z1bmN0aW9uKTogdm9pZDsKKyAgICAgICAgYWZ0ZXJBbGwoYWZ0ZXJBbGxGdW5jdGlvbjogU3BlY0Z1bmN0aW9uKTogdm9pZDsKKyAgICAgICAgZmluaXNoQ2FsbGJhY2soKTogdm9pZDsKKyAgICAgICAgYWRkU3VpdGUoc3VpdGU6IFN1aXRlKTogdm9pZDsKKyAgICAgICAgYWRkKGJsb2NrOiBCbG9jayk6IHZvaWQ7CisgICAgICAgIHNwZWNzKCk6IFNwZWNbXTsKKyAgICAgICAgc3VpdGVzKCk6IFN1aXRlW107CisgICAgICAgIHRvcExldmVsU3VpdGVzKCk6IFN1aXRlW107CisgICAgICAgIHJlc3VsdHMoKTogTmVzdGVkUmVzdWx0czsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU3BlY0Z1bmN0aW9uIHsKKyAgICAgICAgKHNwZWM/OiBTcGVjKTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU3VpdGVPclNwZWMgeworICAgICAgICBpZDogbnVtYmVyOworICAgICAgICBlbnY6IEVudjsKKyAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZzsKKyAgICAgICAgcXVldWU6IFF1ZXVlOworICAgIH0KKworICAgIGludGVyZmFjZSBTcGVjIGV4dGVuZHMgU3VpdGVPclNwZWMgeworCisgICAgICAgIG5ldyAoZW52OiBFbnYsIHN1aXRlOiBTdWl0ZSwgZGVzY3JpcHRpb246IHN0cmluZyk6IGFueTsKKworICAgICAgICBzdWl0ZTogU3VpdGU7CisKKyAgICAgICAgYWZ0ZXJDYWxsYmFja3M6IFNwZWNGdW5jdGlvbltdOworICAgICAgICBzcGllc186IFNweVtdOworCisgICAgICAgIHJlc3VsdHNfOiBOZXN0ZWRSZXN1bHRzOworICAgICAgICBtYXRjaGVyc0NsYXNzOiBNYXRjaGVyczsKKworICAgICAgICBnZXRGdWxsTmFtZSgpOiBzdHJpbmc7CisgICAgICAgIHJlc3VsdHMoKTogTmVzdGVkUmVzdWx0czsKKyAgICAgICAgbG9nKGFyZ3VtZW50czogYW55KTogYW55OworICAgICAgICBydW5zKGZ1bmM6IFNwZWNGdW5jdGlvbik6IFNwZWM7CisgICAgICAgIGFkZFRvUXVldWUoYmxvY2s6IEJsb2NrKTogdm9pZDsKKyAgICAgICAgYWRkTWF0Y2hlclJlc3VsdChyZXN1bHQ6IFJlc3VsdCk6IHZvaWQ7CisgICAgICAgIGV4cGVjdChhY3R1YWw6IGFueSk6IGFueTsKKyAgICAgICAgd2FpdHModGltZW91dDogbnVtYmVyKTogU3BlYzsKKyAgICAgICAgd2FpdHNGb3IobGF0Y2hGdW5jdGlvbjogU3BlY0Z1bmN0aW9uLCB0aW1lb3V0TWVzc2FnZT86IHN0cmluZywgdGltZW91dD86IG51bWJlcik6IFNwZWM7CisgICAgICAgIGZhaWwoZT86IGFueSk6IHZvaWQ7CisgICAgICAgIGdldE1hdGNoZXJzQ2xhc3NfKCk6IE1hdGNoZXJzOworICAgICAgICBhZGRNYXRjaGVycyhtYXRjaGVyc1Byb3RvdHlwZTogQ3VzdG9tTWF0Y2hlckZhY3Rvcmllcyk6IHZvaWQ7CisgICAgICAgIGZpbmlzaENhbGxiYWNrKCk6IHZvaWQ7CisgICAgICAgIGZpbmlzaChvbkNvbXBsZXRlPzogKCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgICAgIGFmdGVyKGRvQWZ0ZXI6IFNwZWNGdW5jdGlvbik6IHZvaWQ7CisgICAgICAgIGV4ZWN1dGUob25Db21wbGV0ZT86ICgpID0+IHZvaWQpOiBhbnk7CisgICAgICAgIGFkZEJlZm9yZXNBbmRBZnRlcnNUb1F1ZXVlKCk6IHZvaWQ7CisgICAgICAgIGV4cGxvZGVzKCk6IHZvaWQ7CisgICAgICAgIHNweU9uKG9iajogYW55LCBtZXRob2ROYW1lOiBzdHJpbmcsIGlnbm9yZU1ldGhvZERvZXNudEV4aXN0OiBib29sZWFuKTogU3B5OworICAgICAgICByZW1vdmVBbGxTcGllcygpOiB2b2lkOworICAgIH0KKworICAgIGludGVyZmFjZSBYU3BlYyB7CisgICAgICAgIGlkOiBudW1iZXI7CisgICAgICAgIHJ1bnMoKTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU3VpdGUgZXh0ZW5kcyBTdWl0ZU9yU3BlYyB7CisKKyAgICAgICAgbmV3IChlbnY6IEVudiwgZGVzY3JpcHRpb246IHN0cmluZywgc3BlY0RlZmluaXRpb25zOiAoKSA9PiB2b2lkLCBwYXJlbnRTdWl0ZTogU3VpdGUpOiBhbnk7CisKKyAgICAgICAgcGFyZW50U3VpdGU6IFN1aXRlOworCisgICAgICAgIGdldEZ1bGxOYW1lKCk6IHN0cmluZzsKKyAgICAgICAgZmluaXNoKG9uQ29tcGxldGU/OiAoKSA9PiB2b2lkKTogdm9pZDsKKyAgICAgICAgYmVmb3JlRWFjaChiZWZvcmVFYWNoRnVuY3Rpb246IFNwZWNGdW5jdGlvbik6IHZvaWQ7CisgICAgICAgIGFmdGVyRWFjaChhZnRlckVhY2hGdW5jdGlvbjogU3BlY0Z1bmN0aW9uKTogdm9pZDsKKyAgICAgICAgYmVmb3JlQWxsKGJlZm9yZUFsbEZ1bmN0aW9uOiBTcGVjRnVuY3Rpb24pOiB2b2lkOworICAgICAgICBhZnRlckFsbChhZnRlckFsbEZ1bmN0aW9uOiBTcGVjRnVuY3Rpb24pOiB2b2lkOworICAgICAgICByZXN1bHRzKCk6IE5lc3RlZFJlc3VsdHM7CisgICAgICAgIGFkZChzdWl0ZU9yU3BlYzogU3VpdGVPclNwZWMpOiB2b2lkOworICAgICAgICBzcGVjcygpOiBTcGVjW107CisgICAgICAgIHN1aXRlcygpOiBTdWl0ZVtdOworICAgICAgICBjaGlsZHJlbigpOiBhbnlbXTsKKyAgICAgICAgZXhlY3V0ZShvbkNvbXBsZXRlPzogKCkgPT4gdm9pZCk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFhTdWl0ZSB7CisgICAgICAgIGV4ZWN1dGUoKTogdm9pZDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU3B5IHsKKyAgICAgICAgKC4uLnBhcmFtczogYW55W10pOiBhbnk7CisKKyAgICAgICAgaWRlbnRpdHk6IHN0cmluZzsKKyAgICAgICAgYW5kOiBTcHlBbmQ7CisgICAgICAgIGNhbGxzOiBDYWxsczsKKyAgICAgICAgbW9zdFJlY2VudENhbGw6IHsgYXJnczogYW55W107IH07CisgICAgICAgIGFyZ3NGb3JDYWxsOiBhbnlbXTsKKyAgICAgICAgd2FzQ2FsbGVkOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBTcHlBbmQgeworICAgICAgICAvKiogQnkgY2hhaW5pbmcgdGhlIHNweSB3aXRoIGFuZC5jYWxsVGhyb3VnaCwgdGhlIHNweSB3aWxsIHN0aWxsIHRyYWNrIGFsbCBjYWxscyB0byBpdCBidXQgaW4gYWRkaXRpb24gaXQgd2lsbCBkZWxlZ2F0ZSB0byB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLiAqLworICAgICAgICBjYWxsVGhyb3VnaCgpOiBTcHk7CisgICAgICAgIC8qKiBCeSBjaGFpbmluZyB0aGUgc3B5IHdpdGggYW5kLnJldHVyblZhbHVlLCBhbGwgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3BlY2lmaWMgdmFsdWUuICovCisgICAgICAgIHJldHVyblZhbHVlKHZhbDogYW55KTogdm9pZDsKKyAgICAgICAgLyoqIEJ5IGNoYWluaW5nIHRoZSBzcHkgd2l0aCBhbmQuY2FsbEZha2UsIGFsbCBjYWxscyB0byB0aGUgc3B5IHdpbGwgZGVsZWdhdGUgdG8gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uLiAqLworICAgICAgICBjYWxsRmFrZShmbjogRnVuY3Rpb24pOiBTcHk7CisgICAgICAgIC8qKiBCeSBjaGFpbmluZyB0aGUgc3B5IHdpdGggYW5kLnRocm93RXJyb3IsIGFsbCBjYWxscyB0byB0aGUgc3B5IHdpbGwgdGhyb3cgdGhlIHNwZWNpZmllZCB2YWx1ZS4gKi8KKyAgICAgICAgdGhyb3dFcnJvcihtc2c6IHN0cmluZyk6IHZvaWQ7CisgICAgICAgIC8qKiBXaGVuIGEgY2FsbGluZyBzdHJhdGVneSBpcyB1c2VkIGZvciBhIHNweSwgdGhlIG9yaWdpbmFsIHN0dWJiaW5nIGJlaGF2aW9yIGNhbiBiZSByZXR1cm5lZCBhdCBhbnkgdGltZSB3aXRoIGFuZC5zdHViLiAqLworICAgICAgICBzdHViKCk6IFNweTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ2FsbHMgeworICAgICAgICAvKiogQnkgY2hhaW5pbmcgdGhlIHNweSB3aXRoIGNhbGxzLmFueSgpLCB3aWxsIHJldHVybiBmYWxzZSBpZiB0aGUgc3B5IGhhcyBub3QgYmVlbiBjYWxsZWQgYXQgYWxsLCBhbmQgdGhlbiB0cnVlIG9uY2UgYXQgbGVhc3Qgb25lIGNhbGwgaGFwcGVucy4gKiovCisgICAgICAgIGFueSgpOiBib29sZWFuOworICAgICAgICAvKiogQnkgY2hhaW5pbmcgdGhlIHNweSB3aXRoIGNhbGxzLmNvdW50KCksIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNweSB3YXMgY2FsbGVkICoqLworICAgICAgICBjb3VudCgpOiBudW1iZXI7CisgICAgICAgIC8qKiBCeSBjaGFpbmluZyB0aGUgc3B5IHdpdGggY2FsbHMuYXJnc0ZvcigpLCB3aWxsIHJldHVybiB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBjYWxsIG51bWJlciBpbmRleCAqKi8KKyAgICAgICAgYXJnc0ZvcihpbmRleDogbnVtYmVyKTogYW55W107CisgICAgICAgIC8qKiBCeSBjaGFpbmluZyB0aGUgc3B5IHdpdGggY2FsbHMuYWxsQXJncygpLCB3aWxsIHJldHVybiB0aGUgYXJndW1lbnRzIHRvIGFsbCBjYWxscyAqKi8KKyAgICAgICAgYWxsQXJncygpOiBhbnlbXTsKKyAgICAgICAgLyoqIEJ5IGNoYWluaW5nIHRoZSBzcHkgd2l0aCBjYWxscy5hbGwoKSwgd2lsbCByZXR1cm4gdGhlIGNvbnRleHQgKHRoZSB0aGlzKSBhbmQgYXJndW1lbnRzIHBhc3NlZCBhbGwgY2FsbHMgKiovCisgICAgICAgIGFsbCgpOiBDYWxsSW5mb1tdOworICAgICAgICAvKiogQnkgY2hhaW5pbmcgdGhlIHNweSB3aXRoIGNhbGxzLm1vc3RSZWNlbnQoKSwgd2lsbCByZXR1cm4gdGhlIGNvbnRleHQgKHRoZSB0aGlzKSBhbmQgYXJndW1lbnRzIGZvciB0aGUgbW9zdCByZWNlbnQgY2FsbCAqKi8KKyAgICAgICAgbW9zdFJlY2VudCgpOiBDYWxsSW5mbzsKKyAgICAgICAgLyoqIEJ5IGNoYWluaW5nIHRoZSBzcHkgd2l0aCBjYWxscy5maXJzdCgpLCB3aWxsIHJldHVybiB0aGUgY29udGV4dCAodGhlIHRoaXMpIGFuZCBhcmd1bWVudHMgZm9yIHRoZSBmaXJzdCBjYWxsICoqLworICAgICAgICBmaXJzdCgpOiBDYWxsSW5mbzsKKyAgICAgICAgLyoqIEJ5IGNoYWluaW5nIHRoZSBzcHkgd2l0aCBjYWxscy5yZXNldCgpLCB3aWxsIGNsZWFycyBhbGwgdHJhY2tpbmcgZm9yIGEgc3B5ICoqLworICAgICAgICByZXNldCgpOiB2b2lkOworICAgIH0KKworICAgIGludGVyZmFjZSBDYWxsSW5mbyB7CisgICAgICAgIC8qKiBUaGUgY29udGV4dCAodGhlIHRoaXMpIGZvciB0aGUgY2FsbCAqLworICAgICAgICBvYmplY3Q6IGFueTsKKyAgICAgICAgLyoqIEFsbCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjYWxsICovCisgICAgICAgIGFyZ3M6IGFueVtdOworICAgIH0KKworICAgIGludGVyZmFjZSBVdGlsIHsKKyAgICAgICAgaW5oZXJpdChjaGlsZENsYXNzOiBGdW5jdGlvbiwgcGFyZW50Q2xhc3M6IEZ1bmN0aW9uKTogYW55OworICAgICAgICBmb3JtYXRFeGNlcHRpb24oZTogYW55KTogYW55OworICAgICAgICBodG1sRXNjYXBlKHN0cjogc3RyaW5nKTogc3RyaW5nOworICAgICAgICBhcmdzVG9BcnJheShhcmdzOiBhbnkpOiBhbnk7CisgICAgICAgIGV4dGVuZChkZXN0aW5hdGlvbjogYW55LCBzb3VyY2U6IGFueSk6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSnNBcGlSZXBvcnRlciBleHRlbmRzIFJlcG9ydGVyIHsKKworICAgICAgICBzdGFydGVkOiBib29sZWFuOworICAgICAgICBmaW5pc2hlZDogYm9vbGVhbjsKKyAgICAgICAgcmVzdWx0OiBhbnk7CisgICAgICAgIG1lc3NhZ2VzOiBhbnk7CisKKyAgICAgICAgbmV3ICgpOiBhbnk7CisKKyAgICAgICAgc3VpdGVzKCk6IFN1aXRlW107CisgICAgICAgIHN1bW1hcml6ZV8oc3VpdGVPclNwZWM6IFN1aXRlT3JTcGVjKTogYW55OworICAgICAgICByZXN1bHRzKCk6IGFueTsKKyAgICAgICAgcmVzdWx0c0ZvclNwZWMoc3BlY0lkOiBhbnkpOiBhbnk7CisgICAgICAgIGxvZyhzdHI6IGFueSk6IGFueTsKKyAgICAgICAgcmVzdWx0c0ZvclNwZWNzKHNwZWNJZHM6IGFueSk6IGFueTsKKyAgICAgICAgc3VtbWFyaXplUmVzdWx0XyhyZXN1bHQ6IGFueSk6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSmFzbWluZSB7CisgICAgICAgIFNwZWM6IFNwZWM7CisgICAgICAgIGNsb2NrOiBDbG9jazsKKyAgICAgICAgdXRpbDogVXRpbDsKKyAgICB9CisKKyAgICBleHBvcnQgdmFyIEh0bWxSZXBvcnRlcjogSHRtbFJlcG9ydGVyOworICAgIGV4cG9ydCB2YXIgSHRtbFNwZWNGaWx0ZXI6IEh0bWxTcGVjRmlsdGVyOworICAgIGV4cG9ydCB2YXIgREVGQVVMVF9USU1FT1VUX0lOVEVSVkFMOiBudW1iZXI7Cit9CmRpZmYgLS1naXQgYS9jYXRhbG9nLXVpL3R5cGluZ3MvanF1ZXJ5L2pxdWVyeS5kLnRzIGIvY2F0YWxvZy11aS90eXBpbmdzL2pxdWVyeS9qcXVlcnkuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzIwZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvY2F0YWxvZy11aS90eXBpbmdzL2pxdWVyeS9qcXVlcnkuZC50cwpAQCAtMCwwICsxLDMxODEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvLyBUeXBlIGRlZmluaXRpb25zIGZvciBqUXVlcnkgMS4xMC54IC8gMi4wLngKKy8vIFByb2plY3Q6IGh0dHA6Ly9qcXVlcnkuY29tLworLy8gRGVmaW5pdGlvbnMgYnk6IEJvcmlzIFlhbmtvdiA8aHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292Lz4sIENocmlzdGlhbiBIb2ZmbWVpc3RlciA8aHR0cHM6Ly9naXRodWIuY29tL2Nob2ZmbWVpc3Rlcj4sIFN0ZXZlIEZlbnRvbiA8aHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlLUZlbnRvbj4sIERpdWxsZWkgR29tZXMgPGh0dHBzOi8vZ2l0aHViLmNvbS9EaXVsbGVpPiwgVGFzcyBJbGlvcG91bG9zIDxodHRwczovL2dpdGh1Yi5jb20vdGFzb2lsaT4sIEphc29uIFN3ZWFyaW5nZW4gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNvbnMtbm92YWxlYWY+LCBTZWFuIEhpbGwgPGh0dHBzOi8vZ2l0aHViLmNvbS9zZWFuc2tpPiwgR3V1cyBHb29zc2VucyA8aHR0cHM6Ly9naXRodWIuY29tL0d1dXo+LCBLZWxseSBTdW1tZXJsaW4gPGh0dHBzOi8vZ2l0aHViLmNvbS9rc3VtbWVybGluPiwgQmFzYXJhdCBBbGkgU3llZCA8aHR0cHM6Ly9naXRodWIuY29tL2Jhc2FyYXQ+LCBOaWNob2xhcyBXb2x2ZXJzb24gPGh0dHBzOi8vZ2l0aHViLmNvbS9ud29sdmVyc29uPiwgRGVyZWsgQ2ljZXJvbmUgPGh0dHBzOi8vZ2l0aHViLmNvbS9kZXJla2NpY2Vyb25lPiwgQW5kcmV3IEdhc3BhciA8aHR0cHM6Ly9naXRodWIuY29tL0FuZHJld0dhc3Bhcj4sIEphbWVzIEhhcnJpc29uIEZpc2hlciA8aHR0cHM6Ly9naXRodWIuY29tL2phbWVzaGZpc2hlcj4sIFNlaWtpY2hpIEtvbmRvIDxodHRwczovL2dpdGh1Yi5jb20vc2Vpa2ljaGk+LCBCZW5qYW1pbiBKYWNrbWFuIDxodHRwczovL2dpdGh1Yi5jb20vYmVuamFtaW5qYWNrbWFuPiwgUG91bCBTb3JlbnNlbiA8aHR0cHM6Ly9naXRodWIuY29tL3MwOTMyOTQ+LCBKb3NoIFN0cm9ibCA8aHR0cHM6Ly9naXRodWIuY29tL0pvc2hTdHJvYmw+LCBKb2huIFJlaWxseSA8aHR0cHM6Ly9naXRodWIuY29tL2pvaG5ueXJlaWxseS8+LCBEaWNrIHZhbiBkZW4gQnJpbmsgPGh0dHBzOi8vZ2l0aHViLmNvbS9EaWNrdmRCcmluaz4KKy8vIERlZmluaXRpb25zOiBodHRwczovL2dpdGh1Yi5jb20vYm9yaXN5YW5rb3YvRGVmaW5pdGVseVR5cGVkCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UKK3RoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlCitMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitUSElTIENPREUgSVMgUFJPVklERUQgKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVECitXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLAorTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC4KKworU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCithbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8qKgorICogSW50ZXJmYWNlIGZvciB0aGUgQUpBWCBzZXR0aW5nIHRoYXQgd2lsbCBjb25maWd1cmUgdGhlIEFKQVggcmVxdWVzdAorICovCitpbnRlcmZhY2UgSlF1ZXJ5QWpheFNldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGVudCB0eXBlIHNlbnQgaW4gdGhlIHJlcXVlc3QgaGVhZGVyIHRoYXQgdGVsbHMgdGhlIHNlcnZlciB3aGF0IGtpbmQgb2YgcmVzcG9uc2UgaXQgd2lsbCBhY2NlcHQgaW4gcmV0dXJuLiBJZiB0aGUgYWNjZXB0cyBzZXR0aW5nIG5lZWRzIG1vZGlmaWNhdGlvbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8gZG8gc28gb25jZSBpbiB0aGUgJC5hamF4U2V0dXAoKSBtZXRob2QuCisgICAgICovCisgICAgYWNjZXB0cz86IGFueTsKKyAgICAvKioKKyAgICAgKiBCeSBkZWZhdWx0LCBhbGwgcmVxdWVzdHMgYXJlIHNlbnQgYXN5bmNocm9ub3VzbHkgKGkuZS4gdGhpcyBpcyBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0KS4gSWYgeW91IG5lZWQgc3luY2hyb25vdXMgcmVxdWVzdHMsIHNldCB0aGlzIG9wdGlvbiB0byBmYWxzZS4gQ3Jvc3MtZG9tYWluIHJlcXVlc3RzIGFuZCBkYXRhVHlwZTogImpzb25wIiByZXF1ZXN0cyBkbyBub3Qgc3VwcG9ydCBzeW5jaHJvbm91cyBvcGVyYXRpb24uIE5vdGUgdGhhdCBzeW5jaHJvbm91cyByZXF1ZXN0cyBtYXkgdGVtcG9yYXJpbHkgbG9jayB0aGUgYnJvd3NlciwgZGlzYWJsaW5nIGFueSBhY3Rpb25zIHdoaWxlIHRoZSByZXF1ZXN0IGlzIGFjdGl2ZS4gQXMgb2YgalF1ZXJ5IDEuOCwgdGhlIHVzZSBvZiBhc3luYzogZmFsc2Ugd2l0aCBqcVhIUiAoJC5EZWZlcnJlZCkgaXMgZGVwcmVjYXRlZDsgeW91IG11c3QgdXNlIHRoZSBzdWNjZXNzL2Vycm9yL2NvbXBsZXRlIGNhbGxiYWNrIG9wdGlvbnMgaW5zdGVhZCBvZiB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzIG9mIHRoZSBqcVhIUiBvYmplY3Qgc3VjaCBhcyBqcVhIUi5kb25lKCkgb3IgdGhlIGRlcHJlY2F0ZWQganFYSFIuc3VjY2VzcygpLgorICAgICAqLworICAgIGFzeW5jPzogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiBBIHByZS1yZXF1ZXN0IGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBqcVhIUiAoaW4galF1ZXJ5IDEuNC54LCBYTUxIVFRQUmVxdWVzdCkgb2JqZWN0IGJlZm9yZSBpdCBpcyBzZW50LiBVc2UgdGhpcyB0byBzZXQgY3VzdG9tIGhlYWRlcnMsIGV0Yy4gVGhlIGpxWEhSIGFuZCBzZXR0aW5ncyBvYmplY3RzIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGlzIGlzIGFuIEFqYXggRXZlbnQuIFJldHVybmluZyBmYWxzZSBpbiB0aGUgYmVmb3JlU2VuZCBmdW5jdGlvbiB3aWxsIGNhbmNlbCB0aGUgcmVxdWVzdC4gQXMgb2YgalF1ZXJ5IDEuNSwgdGhlIGJlZm9yZVNlbmQgb3B0aW9uIHdpbGwgYmUgY2FsbGVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBiZWZvcmVTZW5kPyAoanFYSFI6IEpRdWVyeVhIUiwgc2V0dGluZ3M6IEpRdWVyeUFqYXhTZXR0aW5ncyk6IGFueTsKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgZm9yY2UgcmVxdWVzdGVkIHBhZ2VzIG5vdCB0byBiZSBjYWNoZWQgYnkgdGhlIGJyb3dzZXIuIE5vdGU6IFNldHRpbmcgY2FjaGUgdG8gZmFsc2Ugd2lsbCBvbmx5IHdvcmsgY29ycmVjdGx5IHdpdGggSEVBRCBhbmQgR0VUIHJlcXVlc3RzLiBJdCB3b3JrcyBieSBhcHBlbmRpbmcgIl89e3RpbWVzdGFtcH0iIHRvIHRoZSBHRVQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciBpcyBub3QgbmVlZGVkIGZvciBvdGhlciB0eXBlcyBvZiByZXF1ZXN0cywgZXhjZXB0IGluIElFOCB3aGVuIGEgUE9TVCBpcyBtYWRlIHRvIGEgVVJMIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQgYnkgYSBHRVQuCisgICAgICovCisgICAgY2FjaGU/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgZmluaXNoZXMgKGFmdGVyIHN1Y2Nlc3MgYW5kIGVycm9yIGNhbGxiYWNrcyBhcmUgZXhlY3V0ZWQpLiBUaGUgZnVuY3Rpb24gZ2V0cyBwYXNzZWQgdHdvIGFyZ3VtZW50czogVGhlIGpxWEhSIChpbiBqUXVlcnkgMS40LngsIFhNTEhUVFBSZXF1ZXN0KSBvYmplY3QgYW5kIGEgc3RyaW5nIGNhdGVnb3JpemluZyB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0ICgic3VjY2VzcyIsICJub3Rtb2RpZmllZCIsICJlcnJvciIsICJ0aW1lb3V0IiwgImFib3J0Iiwgb3IgInBhcnNlcmVycm9yIikuIEFzIG9mIGpRdWVyeSAxLjUsIHRoZSBjb21wbGV0ZSBzZXR0aW5nIGNhbiBhY2NlcHQgYW4gYXJyYXkgb2YgZnVuY3Rpb25zLiBFYWNoIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHR1cm4uIFRoaXMgaXMgYW4gQWpheCBFdmVudC4KKyAgICAgKi8KKyAgICBjb21wbGV0ZT8gKGpxWEhSOiBKUXVlcnlYSFIsIHRleHRTdGF0dXM6IHN0cmluZyk6IGFueTsKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgb2Ygc3RyaW5nL3JlZ3VsYXItZXhwcmVzc2lvbiBwYWlycyB0aGF0IGRldGVybWluZSBob3cgalF1ZXJ5IHdpbGwgcGFyc2UgdGhlIHJlc3BvbnNlLCBnaXZlbiBpdHMgY29udGVudCB0eXBlLiAodmVyc2lvbiBhZGRlZDogMS41KQorICAgICAqLworICAgIGNvbnRlbnRzPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07CisgICAgLy9BY2NvcmRpbmcgdG8galF1ZXJ5LmFqYXggc291cmNlIGNvZGUsIGFqYXgncyBvcHRpb24gYWN0dWFsbHkgYWxsb3dzIGNvbnRlbnRUeXBlIHRvIHNldCB0byAiZmFsc2UiCisgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292L0RlZmluaXRlbHlUeXBlZC9pc3N1ZXMvNzQyCisgICAgLyoqCisgICAgICogV2hlbiBzZW5kaW5nIGRhdGEgdG8gdGhlIHNlcnZlciwgdXNlIHRoaXMgY29udGVudCB0eXBlLiBEZWZhdWx0IGlzICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLCB3aGljaCBpcyBmaW5lIGZvciBtb3N0IGNhc2VzLiBJZiB5b3UgZXhwbGljaXRseSBwYXNzIGluIGEgY29udGVudC10eXBlIHRvICQuYWpheCgpLCB0aGVuIGl0IGlzIGFsd2F5cyBzZW50IHRvIHRoZSBzZXJ2ZXIgKGV2ZW4gaWYgbm8gZGF0YSBpcyBzZW50KS4gVGhlIFczQyBYTUxIdHRwUmVxdWVzdCBzcGVjaWZpY2F0aW9uIGRpY3RhdGVzIHRoYXQgdGhlIGNoYXJzZXQgaXMgYWx3YXlzIFVURi04OyBzcGVjaWZ5aW5nIGFub3RoZXIgY2hhcnNldCB3aWxsIG5vdCBmb3JjZSB0aGUgYnJvd3NlciB0byBjaGFuZ2UgdGhlIGVuY29kaW5nLgorICAgICAqLworICAgIGNvbnRlbnRUeXBlPzogYW55OworICAgIC8qKgorICAgICAqIFRoaXMgb2JqZWN0IHdpbGwgYmUgbWFkZSB0aGUgY29udGV4dCBvZiBhbGwgQWpheC1yZWxhdGVkIGNhbGxiYWNrcy4gQnkgZGVmYXVsdCwgdGhlIGNvbnRleHQgaXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYWpheCBzZXR0aW5ncyB1c2VkIGluIHRoZSBjYWxsICgkLmFqYXhTZXR0aW5ncyBtZXJnZWQgd2l0aCB0aGUgc2V0dGluZ3MgcGFzc2VkIHRvICQuYWpheCkuCisgICAgICovCisgICAgY29udGV4dD86IGFueTsKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhVHlwZS10by1kYXRhVHlwZSBjb252ZXJ0ZXJzLiBFYWNoIGNvbnZlcnRlcidzIHZhbHVlIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBvZiB0aGUgcmVzcG9uc2UuICh2ZXJzaW9uIGFkZGVkOiAxLjUpCisgICAgICovCisgICAgY29udmVydGVycz86IHsgW2tleTogc3RyaW5nXTogYW55OyB9OworICAgIC8qKgorICAgICAqIElmIHlvdSB3aXNoIHRvIGZvcmNlIGEgY3Jvc3NEb21haW4gcmVxdWVzdCAoc3VjaCBhcyBKU09OUCkgb24gdGhlIHNhbWUgZG9tYWluLCBzZXQgdGhlIHZhbHVlIG9mIGNyb3NzRG9tYWluIHRvIHRydWUuIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgc2VydmVyLXNpZGUgcmVkaXJlY3Rpb24gdG8gYW5vdGhlciBkb21haW4uICh2ZXJzaW9uIGFkZGVkOiAxLjUpCisgICAgICovCisgICAgY3Jvc3NEb21haW4/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIERhdGEgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLiBJdCBpcyBjb252ZXJ0ZWQgdG8gYSBxdWVyeSBzdHJpbmcsIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nLiBJdCdzIGFwcGVuZGVkIHRvIHRoZSB1cmwgZm9yIEdFVC1yZXF1ZXN0cy4gU2VlIHByb2Nlc3NEYXRhIG9wdGlvbiB0byBwcmV2ZW50IHRoaXMgYXV0b21hdGljIHByb2Nlc3NpbmcuIE9iamVjdCBtdXN0IGJlIEtleS9WYWx1ZSBwYWlycy4gSWYgdmFsdWUgaXMgYW4gQXJyYXksIGpRdWVyeSBzZXJpYWxpemVzIG11bHRpcGxlIHZhbHVlcyB3aXRoIHNhbWUga2V5IGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdHJhZGl0aW9uYWwgc2V0dGluZyAoZGVzY3JpYmVkIGJlbG93KS4KKyAgICAgKi8KKyAgICBkYXRhPzogYW55OworICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdG8gYmUgdXNlZCB0byBoYW5kbGUgdGhlIHJhdyByZXNwb25zZSBkYXRhIG9mIFhNTEh0dHBSZXF1ZXN0LlRoaXMgaXMgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSByZXNwb25zZS4gWW91IHNob3VsZCByZXR1cm4gdGhlIHNhbml0aXplZCBkYXRhLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyB0d28gYXJndW1lbnRzOiBUaGUgcmF3IGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIGFuZCB0aGUgJ2RhdGFUeXBlJyBwYXJhbWV0ZXIuCisgICAgICovCisgICAgZGF0YUZpbHRlcj8gKGRhdGE6IGFueSwgdHk6IGFueSk6IGFueTsKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBkYXRhIHRoYXQgeW91J3JlIGV4cGVjdGluZyBiYWNrIGZyb20gdGhlIHNlcnZlci4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsIGpRdWVyeSB3aWxsIHRyeSB0byBpbmZlciBpdCBiYXNlZCBvbiB0aGUgTUlNRSB0eXBlIG9mIHRoZSByZXNwb25zZSAoYW4gWE1MIE1JTUUgdHlwZSB3aWxsIHlpZWxkIFhNTCwgaW4gMS40IEpTT04gd2lsbCB5aWVsZCBhIEphdmFTY3JpcHQgb2JqZWN0LCBpbiAxLjQgc2NyaXB0IHdpbGwgZXhlY3V0ZSB0aGUgc2NyaXB0LCBhbmQgYW55dGhpbmcgZWxzZSB3aWxsIGJlIHJldHVybmVkIGFzIGEgc3RyaW5nKS4gCisgICAgICovCisgICAgZGF0YVR5cGU/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgaWYgdGhlIHJlcXVlc3QgZmFpbHMuIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0aHJlZSBhcmd1bWVudHM6IFRoZSBqcVhIUiAoaW4galF1ZXJ5IDEuNC54LCBYTUxIdHRwUmVxdWVzdCkgb2JqZWN0LCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgb2NjdXJyZWQgYW5kIGFuIG9wdGlvbmFsIGV4Y2VwdGlvbiBvYmplY3QsIGlmIG9uZSBvY2N1cnJlZC4gUG9zc2libGUgdmFsdWVzIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50IChiZXNpZGVzIG51bGwpIGFyZSAidGltZW91dCIsICJlcnJvciIsICJhYm9ydCIsIGFuZCAicGFyc2VyZXJyb3IiLiBXaGVuIGFuIEhUVFAgZXJyb3Igb2NjdXJzLCBlcnJvclRocm93biByZWNlaXZlcyB0aGUgdGV4dHVhbCBwb3J0aW9uIG9mIHRoZSBIVFRQIHN0YXR1cywgc3VjaCBhcyAiTm90IEZvdW5kIiBvciAiSW50ZXJuYWwgU2VydmVyIEVycm9yLiIgQXMgb2YgalF1ZXJ5IDEuNSwgdGhlIGVycm9yIHNldHRpbmcgY2FuIGFjY2VwdCBhbiBhcnJheSBvZiBmdW5jdGlvbnMuIEVhY2ggZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdHVybi4gTm90ZTogVGhpcyBoYW5kbGVyIGlzIG5vdCBjYWxsZWQgZm9yIGNyb3NzLWRvbWFpbiBzY3JpcHQgYW5kIGNyb3NzLWRvbWFpbiBKU09OUCByZXF1ZXN0cy4gVGhpcyBpcyBhbiBBamF4IEV2ZW50LgorICAgICAqLworICAgIGVycm9yPyAoanFYSFI6IEpRdWVyeVhIUiwgdGV4dFN0YXR1czogc3RyaW5nLCBlcnJvclRocm93bjogc3RyaW5nKTogYW55OworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdHJpZ2dlciBnbG9iYWwgQWpheCBldmVudCBoYW5kbGVycyBmb3IgdGhpcyByZXF1ZXN0LiBUaGUgZGVmYXVsdCBpcyB0cnVlLiBTZXQgdG8gZmFsc2UgdG8gcHJldmVudCB0aGUgZ2xvYmFsIGhhbmRsZXJzIGxpa2UgYWpheFN0YXJ0IG9yIGFqYXhTdG9wIGZyb20gYmVpbmcgdHJpZ2dlcmVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdmFyaW91cyBBamF4IEV2ZW50cy4KKyAgICAgKi8KKyAgICBnbG9iYWw/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBvZiBhZGRpdGlvbmFsIGhlYWRlciBrZXkvdmFsdWUgcGFpcnMgdG8gc2VuZCBhbG9uZyB3aXRoIHJlcXVlc3RzIHVzaW5nIHRoZSBYTUxIdHRwUmVxdWVzdCB0cmFuc3BvcnQuIFRoZSBoZWFkZXIgWC1SZXF1ZXN0ZWQtV2l0aDogWE1MSHR0cFJlcXVlc3QgaXMgYWx3YXlzIGFkZGVkLCBidXQgaXRzIGRlZmF1bHQgWE1MSHR0cFJlcXVlc3QgdmFsdWUgY2FuIGJlIGNoYW5nZWQgaGVyZS4gVmFsdWVzIGluIHRoZSBoZWFkZXJzIHNldHRpbmcgY2FuIGFsc28gYmUgb3ZlcndyaXR0ZW4gZnJvbSB3aXRoaW4gdGhlIGJlZm9yZVNlbmQgZnVuY3Rpb24uICh2ZXJzaW9uIGFkZGVkOiAxLjUpCisgICAgICovCisgICAgaGVhZGVycz86IHsgW2tleTogc3RyaW5nXTogYW55OyB9OworICAgIC8qKgorICAgICAqIEFsbG93IHRoZSByZXF1ZXN0IHRvIGJlIHN1Y2Nlc3NmdWwgb25seSBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgcmVxdWVzdC4gVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIHRoZSBMYXN0LU1vZGlmaWVkIGhlYWRlci4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZSwgaWdub3JpbmcgdGhlIGhlYWRlci4gSW4galF1ZXJ5IDEuNCB0aGlzIHRlY2huaXF1ZSBhbHNvIGNoZWNrcyB0aGUgJ2V0YWcnIHNwZWNpZmllZCBieSB0aGUgc2VydmVyIHRvIGNhdGNoIHVubW9kaWZpZWQgZGF0YS4KKyAgICAgKi8KKyAgICBpZk1vZGlmaWVkPzogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiBBbGxvdyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCB0byBiZSByZWNvZ25pemVkIGFzICJsb2NhbCwiIChlLmcuIHRoZSBmaWxlc3lzdGVtKSwgZXZlbiBpZiBqUXVlcnkgZG9lcyBub3QgcmVjb2duaXplIGl0IGFzIHN1Y2ggYnkgZGVmYXVsdC4gVGhlIGZvbGxvd2luZyBwcm90b2NvbHMgYXJlIGN1cnJlbnRseSByZWNvZ25pemVkIGFzIGxvY2FsOiBmaWxlLCAqLWV4dGVuc2lvbiwgYW5kIHdpZGdldC4gSWYgdGhlIGlzTG9jYWwgc2V0dGluZyBuZWVkcyBtb2RpZmljYXRpb24sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRvIHNvIG9uY2UgaW4gdGhlICQuYWpheFNldHVwKCkgbWV0aG9kLiAodmVyc2lvbiBhZGRlZDogMS41LjEpCisgICAgICovCisgICAgaXNMb2NhbD86IGJvb2xlYW47CisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG5hbWUgaW4gYSBqc29ucCByZXF1ZXN0LiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mICdjYWxsYmFjaycgaW4gdGhlICdjYWxsYmFjaz0/JyBwYXJ0IG9mIHRoZSBxdWVyeSBzdHJpbmcgaW4gdGhlIHVybC4gU28ge2pzb25wOidvbkpTT05QTG9hZCd9IHdvdWxkIHJlc3VsdCBpbiAnb25KU09OUExvYWQ9PycgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIuIEFzIG9mIGpRdWVyeSAxLjUsIHNldHRpbmcgdGhlIGpzb25wIG9wdGlvbiB0byBmYWxzZSBwcmV2ZW50cyBqUXVlcnkgZnJvbSBhZGRpbmcgdGhlICI/Y2FsbGJhY2siIHN0cmluZyB0byB0aGUgVVJMIG9yIGF0dGVtcHRpbmcgdG8gdXNlICI9PyIgZm9yIHRyYW5zZm9ybWF0aW9uLiBJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQgYWxzbyBleHBsaWNpdGx5IHNldCB0aGUganNvbnBDYWxsYmFjayBzZXR0aW5nLiBGb3IgZXhhbXBsZSwgeyBqc29ucDogZmFsc2UsIGpzb25wQ2FsbGJhY2s6ICJjYWxsYmFja05hbWUiIH0KKyAgICAgKi8KKyAgICBqc29ucD86IGFueTsKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiBuYW1lIGZvciBhIEpTT05QIHJlcXVlc3QuIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHJhbmRvbSBuYW1lIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGpRdWVyeS4gSXQgaXMgcHJlZmVyYWJsZSB0byBsZXQgalF1ZXJ5IGdlbmVyYXRlIGEgdW5pcXVlIG5hbWUgYXMgaXQnbGwgbWFrZSBpdCBlYXNpZXIgdG8gbWFuYWdlIHRoZSByZXF1ZXN0cyBhbmQgcHJvdmlkZSBjYWxsYmFja3MgYW5kIGVycm9yIGhhbmRsaW5nLiBZb3UgbWF5IHdhbnQgdG8gc3BlY2lmeSB0aGUgY2FsbGJhY2sgd2hlbiB5b3Ugd2FudCB0byBlbmFibGUgYmV0dGVyIGJyb3dzZXIgY2FjaGluZyBvZiBHRVQgcmVxdWVzdHMuIEFzIG9mIGpRdWVyeSAxLjUsIHlvdSBjYW4gYWxzbyB1c2UgYSBmdW5jdGlvbiBmb3IgdGhpcyBzZXR0aW5nLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBvZiBqc29ucENhbGxiYWNrIGlzIHNldCB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoYXQgZnVuY3Rpb24uCisgICAgICovCisgICAganNvbnBDYWxsYmFjaz86IGFueTsKKyAgICAvKioKKyAgICAgKiBBIG1pbWUgdHlwZSB0byBvdmVycmlkZSB0aGUgWEhSIG1pbWUgdHlwZS4gKHZlcnNpb24gYWRkZWQ6IDEuNS4xKQorICAgICAqLworICAgIG1pbWVUeXBlPzogc3RyaW5nOworICAgIC8qKgorICAgICAqIEEgcGFzc3dvcmQgdG8gYmUgdXNlZCB3aXRoIFhNTEh0dHBSZXF1ZXN0IGluIHJlc3BvbnNlIHRvIGFuIEhUVFAgYWNjZXNzIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuCisgICAgICovCisgICAgcGFzc3dvcmQ/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogQnkgZGVmYXVsdCwgZGF0YSBwYXNzZWQgaW4gdG8gdGhlIGRhdGEgb3B0aW9uIGFzIGFuIG9iamVjdCAodGVjaG5pY2FsbHksIGFueXRoaW5nIG90aGVyIHRoYW4gYSBzdHJpbmcpIHdpbGwgYmUgcHJvY2Vzc2VkIGFuZCB0cmFuc2Zvcm1lZCBpbnRvIGEgcXVlcnkgc3RyaW5nLCBmaXR0aW5nIHRvIHRoZSBkZWZhdWx0IGNvbnRlbnQtdHlwZSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi4gSWYgeW91IHdhbnQgdG8gc2VuZCBhIERPTURvY3VtZW50LCBvciBvdGhlciBub24tcHJvY2Vzc2VkIGRhdGEsIHNldCB0aGlzIG9wdGlvbiB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwcm9jZXNzRGF0YT86IGJvb2xlYW47CisgICAgLyoqCisgICAgICogT25seSBhcHBsaWVzIHdoZW4gdGhlICJzY3JpcHQiIHRyYW5zcG9ydCBpcyB1c2VkIChlLmcuLCBjcm9zcy1kb21haW4gcmVxdWVzdHMgd2l0aCAianNvbnAiIG9yICJzY3JpcHQiIGRhdGFUeXBlIGFuZCAiR0VUIiB0eXBlKS4gU2V0cyB0aGUgY2hhcnNldCBhdHRyaWJ1dGUgb24gdGhlIHNjcmlwdCB0YWcgdXNlZCBpbiB0aGUgcmVxdWVzdC4gVXNlZCB3aGVuIHRoZSBjaGFyYWN0ZXIgc2V0IG9uIHRoZSBsb2NhbCBwYWdlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgb25lIG9uIHRoZSByZW1vdGUgc2NyaXB0LgorICAgICAqLworICAgIHNjcmlwdENoYXJzZXQ/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IG9mIG51bWVyaWMgSFRUUCBjb2RlcyBhbmQgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZXNwb25zZSBoYXMgdGhlIGNvcnJlc3BvbmRpbmcgY29kZS4gZiB0aGUgcmVxdWVzdCBpcyBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIGNvZGUgZnVuY3Rpb25zIHRha2UgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgc3VjY2VzcyBjYWxsYmFjazsgaWYgaXQgcmVzdWx0cyBpbiBhbiBlcnJvciAoaW5jbHVkaW5nIDN4eCByZWRpcmVjdCksIHRoZXkgdGFrZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBlcnJvciBjYWxsYmFjay4gKHZlcnNpb24gYWRkZWQ6IDEuNSkKKyAgICAgKi8KKyAgICBzdGF0dXNDb2RlPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07CisgICAgLyoqCisgICAgICogQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMuIFRoZSBmdW5jdGlvbiBnZXRzIHBhc3NlZCB0aHJlZSBhcmd1bWVudHM6IFRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZGF0YVR5cGUgcGFyYW1ldGVyOyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzdGF0dXM7IGFuZCB0aGUganFYSFIgKGluIGpRdWVyeSAxLjQueCwgWE1MSHR0cFJlcXVlc3QpIG9iamVjdC4gQXMgb2YgalF1ZXJ5IDEuNSwgdGhlIHN1Y2Nlc3Mgc2V0dGluZyBjYW4gYWNjZXB0IGFuIGFycmF5IG9mIGZ1bmN0aW9ucy4gRWFjaCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbiB0dXJuLiBUaGlzIGlzIGFuIEFqYXggRXZlbnQuCisgICAgICovCisgICAgc3VjY2Vzcz8gKGRhdGE6IGFueSwgdGV4dFN0YXR1czogc3RyaW5nLCBqcVhIUjogSlF1ZXJ5WEhSKTogYW55OworICAgIC8qKgorICAgICAqIFNldCBhIHRpbWVvdXQgKGluIG1pbGxpc2Vjb25kcykgZm9yIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgb3ZlcnJpZGUgYW55IGdsb2JhbCB0aW1lb3V0IHNldCB3aXRoICQuYWpheFNldHVwKCkuIFRoZSB0aW1lb3V0IHBlcmlvZCBzdGFydHMgYXQgdGhlIHBvaW50IHRoZSAkLmFqYXggY2FsbCBpcyBtYWRlOyBpZiBzZXZlcmFsIG90aGVyIHJlcXVlc3RzIGFyZSBpbiBwcm9ncmVzcyBhbmQgdGhlIGJyb3dzZXIgaGFzIG5vIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSwgaXQgaXMgcG9zc2libGUgZm9yIGEgcmVxdWVzdCB0byB0aW1lIG91dCBiZWZvcmUgaXQgY2FuIGJlIHNlbnQuIEluIGpRdWVyeSAxLjQueCBhbmQgYmVsb3csIHRoZSBYTUxIdHRwUmVxdWVzdCBvYmplY3Qgd2lsbCBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlIGlmIHRoZSByZXF1ZXN0IHRpbWVzIG91dDsgYWNjZXNzaW5nIGFueSBvYmplY3QgbWVtYmVycyBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uLiBJbiBGaXJlZm94IDMuMCsgb25seSwgc2NyaXB0IGFuZCBKU09OUCByZXF1ZXN0cyBjYW5ub3QgYmUgY2FuY2VsbGVkIGJ5IGEgdGltZW91dDsgdGhlIHNjcmlwdCB3aWxsIHJ1biBldmVuIGlmIGl0IGFycml2ZXMgYWZ0ZXIgdGhlIHRpbWVvdXQgcGVyaW9kLgorICAgICAqLworICAgIHRpbWVvdXQ/OiBudW1iZXI7CisgICAgLyoqCisgICAgICogU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIHRyYWRpdGlvbmFsIHN0eWxlIG9mIHBhcmFtIHNlcmlhbGl6YXRpb24uCisgICAgICovCisgICAgdHJhZGl0aW9uYWw/OiBib29sZWFuOworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHJlcXVlc3QgdG8gbWFrZSAoIlBPU1QiIG9yICJHRVQiKSwgZGVmYXVsdCBpcyAiR0VUIi4gTm90ZTogT3RoZXIgSFRUUCByZXF1ZXN0IG1ldGhvZHMsIHN1Y2ggYXMgUFVUIGFuZCBERUxFVEUsIGNhbiBhbHNvIGJlIHVzZWQgaGVyZSwgYnV0IHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGJyb3dzZXJzLgorICAgICAqLworICAgIHR5cGU/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogQSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIHNlbnQuCisgICAgICovCisgICAgdXJsPzogc3RyaW5nOworICAgIC8qKgorICAgICAqIEEgdXNlcm5hbWUgdG8gYmUgdXNlZCB3aXRoIFhNTEh0dHBSZXF1ZXN0IGluIHJlc3BvbnNlIHRvIGFuIEhUVFAgYWNjZXNzIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuCisgICAgICovCisgICAgdXNlcm5hbWU/OiBzdHJpbmc7CisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZm9yIGNyZWF0aW5nIHRoZSBYTUxIdHRwUmVxdWVzdCBvYmplY3QuIERlZmF1bHRzIHRvIHRoZSBBY3RpdmVYT2JqZWN0IHdoZW4gYXZhaWxhYmxlIChJRSksIHRoZSBYTUxIdHRwUmVxdWVzdCBvdGhlcndpc2UuIE92ZXJyaWRlIHRvIHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb24gZm9yIFhNTEh0dHBSZXF1ZXN0IG9yIGVuaGFuY2VtZW50cyB0byB0aGUgZmFjdG9yeS4KKyAgICAgKi8KKyAgICB4aHI/OiBhbnk7CisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IG9mIGZpZWxkTmFtZS1maWVsZFZhbHVlIHBhaXJzIHRvIHNldCBvbiB0aGUgbmF0aXZlIFhIUiBvYmplY3QuIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSBpdCB0byBzZXQgd2l0aENyZWRlbnRpYWxzIHRvIHRydWUgZm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cyBpZiBuZWVkZWQuIEluIGpRdWVyeSAxLjUsIHRoZSB3aXRoQ3JlZGVudGlhbHMgcHJvcGVydHkgd2FzIG5vdCBwcm9wYWdhdGVkIHRvIHRoZSBuYXRpdmUgWEhSIGFuZCB0aHVzIENPUlMgcmVxdWVzdHMgcmVxdWlyaW5nIGl0IHdvdWxkIGlnbm9yZSB0aGlzIGZsYWcuIEZvciB0aGlzIHJlYXNvbiwgd2UgcmVjb21tZW5kIHVzaW5nIGpRdWVyeSAxLjUuMSsgc2hvdWxkIHlvdSByZXF1aXJlIHRoZSB1c2Ugb2YgaXQuICh2ZXJzaW9uIGFkZGVkOiAxLjUuMSkKKyAgICAgKi8KKyAgICB4aHJGaWVsZHM/OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfTsKK30KKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHRoZSBqcVhIUiBvYmplY3QKKyAqLworaW50ZXJmYWNlIEpRdWVyeVhIUiBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0LCBKUXVlcnlQcm9taXNlPGFueT4geworICAgIC8qKgorICAgICAqIFRoZSAub3ZlcnJpZGVNaW1lVHlwZSgpIG1ldGhvZCBtYXkgYmUgdXNlZCBpbiB0aGUgYmVmb3JlU2VuZCgpIGNhbGxiYWNrIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZSwgdG8gbW9kaWZ5IHRoZSByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyLiBBcyBvZiBqUXVlcnkgMS41LjEsIHRoZSBqcVhIUiBvYmplY3QgYWxzbyBjb250YWlucyB0aGUgb3ZlcnJpZGVNaW1lVHlwZSgpIG1ldGhvZCAoaXQgd2FzIGF2YWlsYWJsZSBpbiBqUXVlcnkgMS40LngsIGFzIHdlbGwsIGJ1dCB3YXMgdGVtcG9yYXJpbHkgcmVtb3ZlZCBpbiBqUXVlcnkgMS41KS4gCisgICAgICovCisgICAgb3ZlcnJpZGVNaW1lVHlwZShtaW1lVHlwZTogc3RyaW5nKTogYW55OworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGUgcmVxdWVzdC4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzVGV4dCBBIHN0cmluZyBwYXNzZWQgYXMgdGhlIHRleHRTdGF0dXMgcGFyYW1ldGVyIGZvciB0aGUgZG9uZSBjYWxsYmFjay4gRGVmYXVsdCB2YWx1ZTogImNhbmNlbGVkIgorICAgICAqLworICAgIGFib3J0KHN0YXR1c1RleHQ/OiBzdHJpbmcpOiB2b2lkOworICAgIC8qKgorICAgICAqIEluY29ycG9yYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgLmRvbmUoKSBhbmQgLmZhaWwoKSBtZXRob2RzLCBhbGxvd2luZyAoYXMgb2YgalF1ZXJ5IDEuOCkgdGhlIHVuZGVybHlpbmcgUHJvbWlzZSB0byBiZSBtYW5pcHVsYXRlZC4gUmVmZXIgdG8gZGVmZXJyZWQudGhlbigpIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorICAgICAqLworICAgIHRoZW4oZG9uZUNhbGxiYWNrOiAoZGF0YTogYW55LCB0ZXh0U3RhdHVzOiBzdHJpbmcsIGpxWEhSOiBKUXVlcnlYSFIpID0+IHZvaWQsIGZhaWxDYWxsYmFjaz86IChqcVhIUjogSlF1ZXJ5WEhSLCB0ZXh0U3RhdHVzOiBzdHJpbmcsIGVycm9yVGhyb3duOiBhbnkpID0+IHZvaWQpOiBKUXVlcnlQcm9taXNlPGFueT47CisgICAgLyoqCisgICAgICogUHJvcGVydHkgY29udGFpbmluZyB0aGUgcGFyc2VkIHJlc3BvbnNlIGlmIHRoZSByZXNwb25zZSBDb250ZW50LVR5cGUgaXMganNvbgorICAgICAqLworICAgIHJlc3BvbnNlSlNPTj86IGFueTsKK30KKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHRoZSBKUXVlcnkgY2FsbGJhY2sKKyAqLworaW50ZXJmYWNlIEpRdWVyeUNhbGxiYWNrIHsKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIGEgY2FsbGJhY2sgbGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2tzIEEgZnVuY3Rpb24sIG9yIGFycmF5IG9mIGZ1bmN0aW9ucywgdGhhdCBhcmUgdG8gYmUgYWRkZWQgdG8gdGhlIGNhbGxiYWNrIGxpc3QuCisgICAgICovCisgICAgYWRkKGNhbGxiYWNrczogRnVuY3Rpb24pOiBKUXVlcnlDYWxsYmFjazsKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIGEgY2FsbGJhY2sgbGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2tzIEEgZnVuY3Rpb24sIG9yIGFycmF5IG9mIGZ1bmN0aW9ucywgdGhhdCBhcmUgdG8gYmUgYWRkZWQgdG8gdGhlIGNhbGxiYWNrIGxpc3QuCisgICAgICovCisgICAgYWRkKGNhbGxiYWNrczogRnVuY3Rpb25bXSk6IEpRdWVyeUNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogRGlzYWJsZSBhIGNhbGxiYWNrIGxpc3QgZnJvbSBkb2luZyBhbnl0aGluZyBtb3JlLgorICAgICAqLworICAgIGRpc2FibGUoKTogSlF1ZXJ5Q2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGNhbGxiYWNrcyBsaXN0IGhhcyBiZWVuIGRpc2FibGVkLgorICAgICAqLworICAgIGRpc2FibGVkKCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIG9mIHRoZSBjYWxsYmFja3MgZnJvbSBhIGxpc3QuCisgICAgICovCisgICAgZW1wdHkoKTogSlF1ZXJ5Q2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cworICAgICAqIAorICAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFyZ3VtZW50IG9yIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgYmFjayB0byB0aGUgY2FsbGJhY2sgbGlzdC4KKyAgICAgKi8KKyAgICBmaXJlKC4uLmFyZ3VtZW50czogYW55W10pOiBKUXVlcnlDYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlLgorICAgICAqLworICAgIGZpcmVkKCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGFsbCBjYWxsYmFja3MgaW4gYSBsaXN0IHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIHJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2tzIGluIHRoZSBsaXN0IHNob3VsZCBiZSBmaXJlZC4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIEFuIGFyZ3VtZW50LCBvciBhcnJheSBvZiBhcmd1bWVudHMsIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrcyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBmaXJlV2l0aChjb250ZXh0PzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IEpRdWVyeUNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzdXBwbGllZCBjYWxsYmFjayBpcyBpbiBhIGxpc3QKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHNlYXJjaCBmb3IuCisgICAgICovCisgICAgaGFzKGNhbGxiYWNrOiBGdW5jdGlvbik6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBMb2NrIGEgY2FsbGJhY2sgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBsb2NrKCk6IEpRdWVyeUNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIHRoZSBjYWxsYmFja3MgbGlzdCBoYXMgYmVlbiBsb2NrZWQuCisgICAgICovCisgICAgbG9ja2VkKCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIGZyb20gYSBjYWxsYmFjayBsaXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYWxsYmFja3MgQSBmdW5jdGlvbiwgb3IgYXJyYXkgb2YgZnVuY3Rpb25zLCB0aGF0IGFyZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrIGxpc3QuCisgICAgICovCisgICAgcmVtb3ZlKGNhbGxiYWNrczogRnVuY3Rpb24pOiBKUXVlcnlDYWxsYmFjazsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIGZyb20gYSBjYWxsYmFjayBsaXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYWxsYmFja3MgQSBmdW5jdGlvbiwgb3IgYXJyYXkgb2YgZnVuY3Rpb25zLCB0aGF0IGFyZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrIGxpc3QuCisgICAgICovCisgICAgcmVtb3ZlKGNhbGxiYWNrczogRnVuY3Rpb25bXSk6IEpRdWVyeUNhbGxiYWNrOworfQorCisvKioKKyAqIEFsbG93cyBqUXVlcnkgUHJvbWlzZXMgdG8gaW50ZXJvcCB3aXRoIG5vbi1qUXVlcnkgcHJvbWlzZXMKKyAqLworaW50ZXJmYWNlIEpRdWVyeUdlbmVyaWNQcm9taXNlPFQ+IHsKKyAgICAvKioKKyAgICAgKiBBZGQgaGFuZGxlcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIG9iamVjdCBpcyByZXNvbHZlZCwgcmVqZWN0ZWQsIG9yIHN0aWxsIGluIHByb2dyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkb25lRmlsdGVyIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgaXMgcmVzb2x2ZWQuCisgICAgICogQHBhcmFtIGZhaWxGaWx0ZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgaXMgcmVqZWN0ZWQuCisgICAgICovCisgICAgdGhlbjxVPihkb25lRmlsdGVyOiAodmFsdWU/OiBULCAuLi52YWx1ZXM6IGFueVtdKSA9PiBVfEpRdWVyeVByb21pc2U8VT4sIGZhaWxGaWx0ZXI/OiAoLi4ucmVhc29uczogYW55W10pID0+IGFueSwgcHJvZ3Jlc3NGaWx0ZXI/OiAoLi4ucHJvZ3Jlc3Npb246IGFueVtdKSA9PiBhbnkpOiBKUXVlcnlQcm9taXNlPFU+OworCisgICAgLyoqCisgICAgICogQWRkIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBvYmplY3QgaXMgcmVzb2x2ZWQsIHJlamVjdGVkLCBvciBzdGlsbCBpbiBwcm9ncmVzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZG9uZUZpbHRlciBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIGlzIHJlc29sdmVkLgorICAgICAqIEBwYXJhbSBmYWlsRmlsdGVyIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIGlzIHJlamVjdGVkLgorICAgICAqLworICAgIHRoZW4oZG9uZUZpbHRlcjogKHZhbHVlPzogVCwgLi4udmFsdWVzOiBhbnlbXSkgPT4gdm9pZCwgZmFpbEZpbHRlcj86ICguLi5yZWFzb25zOiBhbnlbXSkgPT4gYW55LCBwcm9ncmVzc0ZpbHRlcj86ICguLi5wcm9ncmVzc2lvbjogYW55W10pID0+IGFueSk6IEpRdWVyeVByb21pc2U8dm9pZD47Cit9CisKKy8qKgorICogSW50ZXJmYWNlIGZvciB0aGUgSlF1ZXJ5IHByb21pc2UvZGVmZXJyZWQgY2FsbGJhY2tzCisgKi8KK2ludGVyZmFjZSBKUXVlcnlQcm9taXNlQ2FsbGJhY2s8VD4geworICAgICh2YWx1ZT86IFQsIC4uLmFyZ3M6IGFueVtdKTogdm9pZDsKK30KKworaW50ZXJmYWNlIEpRdWVyeVByb21pc2VPcGVyYXRvcjxULCBVPiB7CisgICAgKGNhbGxiYWNrMTogSlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPFQ+fEpRdWVyeVByb21pc2VDYWxsYmFjazxUPltdLCAuLi5jYWxsYmFja3NOOiBBcnJheTxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PnxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PltdPik6IEpRdWVyeVByb21pc2U8VT47Cit9CisKKy8qKgorICogSW50ZXJmYWNlIGZvciB0aGUgSlF1ZXJ5IHByb21pc2UsIHBhcnQgb2YgY2FsbGJhY2tzCisgKi8KK2ludGVyZmFjZSBKUXVlcnlQcm9taXNlPFQ+IGV4dGVuZHMgSlF1ZXJ5R2VuZXJpY1Byb21pc2U8VD4geworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIERlZmVycmVkIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0ZSgpOiBzdHJpbmc7CisgICAgLyoqCisgICAgICogQWRkIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBvYmplY3QgaXMgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbHdheXNDYWxsYmFja3MxIEEgZnVuY3Rpb24sIG9yIGFycmF5IG9mIGZ1bmN0aW9ucywgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCisgICAgICogQHBhcmFtIGFsd2F5c0NhbGxiYWNrczIgT3B0aW9uYWwgYWRkaXRpb25hbCBmdW5jdGlvbnMsIG9yIGFycmF5cyBvZiBmdW5jdGlvbnMsIHRoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZXNvbHZlZCBvciByZWplY3RlZC4KKyAgICAgKi8KKyAgICBhbHdheXMoYWx3YXlzQ2FsbGJhY2sxPzogSlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT58SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT5bXSwgLi4uYWx3YXlzQ2FsbGJhY2tzTjogQXJyYXk8SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT58SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT5bXT4pOiBKUXVlcnlQcm9taXNlPFQ+OworICAgIC8qKgorICAgICAqIEFkZCBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgb2JqZWN0IGlzIHJlc29sdmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkb25lQ2FsbGJhY2tzMSBBIGZ1bmN0aW9uLCBvciBhcnJheSBvZiBmdW5jdGlvbnMsIHRoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZXNvbHZlZC4KKyAgICAgKiBAcGFyYW0gZG9uZUNhbGxiYWNrczIgT3B0aW9uYWwgYWRkaXRpb25hbCBmdW5jdGlvbnMsIG9yIGFycmF5cyBvZiBmdW5jdGlvbnMsIHRoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBkb25lKGRvbmVDYWxsYmFjazE/OiBKUXVlcnlQcm9taXNlQ2FsbGJhY2s8VD58SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPFQ+W10sIC4uLmRvbmVDYWxsYmFja046IEFycmF5PEpRdWVyeVByb21pc2VDYWxsYmFjazxUPnxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8VD5bXT4pOiBKUXVlcnlQcm9taXNlPFQ+OworICAgIC8qKgorICAgICAqIEFkZCBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgb2JqZWN0IGlzIHJlamVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmYWlsQ2FsbGJhY2tzMSBBIGZ1bmN0aW9uLCBvciBhcnJheSBvZiBmdW5jdGlvbnMsIHRoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZWplY3RlZC4KKyAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrczIgT3B0aW9uYWwgYWRkaXRpb25hbCBmdW5jdGlvbnMsIG9yIGFycmF5cyBvZiBmdW5jdGlvbnMsIHRoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZWplY3RlZC4KKyAgICAgKi8KKyAgICBmYWlsKGZhaWxDYWxsYmFjazE/OiBKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PnxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PltdLCAuLi5mYWlsQ2FsbGJhY2tzTjogQXJyYXk8SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT58SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT5bXT4pOiBKUXVlcnlQcm9taXNlPFQ+OworICAgIC8qKgorICAgICAqIEFkZCBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgb2JqZWN0IGdlbmVyYXRlcyBwcm9ncmVzcyBub3RpZmljYXRpb25zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9ncmVzc0NhbGxiYWNrcyBBIGZ1bmN0aW9uLCBvciBhcnJheSBvZiBmdW5jdGlvbnMsIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBnZW5lcmF0ZXMgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwcm9ncmVzcyhwcm9ncmVzc0NhbGxiYWNrMT86IEpRdWVyeVByb21pc2VDYWxsYmFjazxhbnk+fEpRdWVyeVByb21pc2VDYWxsYmFjazxhbnk+W10sIC4uLnByb2dyZXNzQ2FsbGJhY2tOOiBBcnJheTxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PnxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PltdPik6IEpRdWVyeVByb21pc2U8VD47CisKKyAgICAvLyBEZXByZWNhdGVkIC0gZ2l2ZW4gbm8gdHlwaW5ncworICAgIHBpcGUoZG9uZUZpbHRlcj86ICh4OiBhbnkpID0+IGFueSwgZmFpbEZpbHRlcj86ICh4OiBhbnkpID0+IGFueSwgcHJvZ3Jlc3NGaWx0ZXI/OiAoeDogYW55KSA9PiBhbnkpOiBKUXVlcnlQcm9taXNlPGFueT47Cit9CisKKy8qKgorICogSW50ZXJmYWNlIGZvciB0aGUgSlF1ZXJ5IGRlZmVycmVkLCBwYXJ0IG9mIGNhbGxiYWNrcworICovCitpbnRlcmZhY2UgSlF1ZXJ5RGVmZXJyZWQ8VD4gZXh0ZW5kcyBKUXVlcnlHZW5lcmljUHJvbWlzZTxUPiB7CisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgRGVmZXJyZWQgb2JqZWN0LgorICAgICAqLworICAgIHN0YXRlKCk6IHN0cmluZzsKKyAgICAvKioKKyAgICAgKiBBZGQgaGFuZGxlcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIG9iamVjdCBpcyBlaXRoZXIgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGFsd2F5c0NhbGxiYWNrczEgQSBmdW5jdGlvbiwgb3IgYXJyYXkgb2YgZnVuY3Rpb25zLCB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZXNvbHZlZCBvciByZWplY3RlZC4KKyAgICAgKiBAcGFyYW0gYWx3YXlzQ2FsbGJhY2tzMiBPcHRpb25hbCBhZGRpdGlvbmFsIGZ1bmN0aW9ucywgb3IgYXJyYXlzIG9mIGZ1bmN0aW9ucywgdGhhdCBhcmUgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIGlzIHJlc29sdmVkIG9yIHJlamVjdGVkLgorICAgICAqLworICAgIGFsd2F5cyhhbHdheXNDYWxsYmFjazE/OiBKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PnxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PltdLCAuLi5hbHdheXNDYWxsYmFja3NOOiBBcnJheTxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PnxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8YW55PltdPik6IEpRdWVyeURlZmVycmVkPFQ+OworICAgIC8qKgorICAgICAqIEFkZCBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgb2JqZWN0IGlzIHJlc29sdmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkb25lQ2FsbGJhY2tzMSBBIGZ1bmN0aW9uLCBvciBhcnJheSBvZiBmdW5jdGlvbnMsIHRoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZXNvbHZlZC4KKyAgICAgKiBAcGFyYW0gZG9uZUNhbGxiYWNrczIgT3B0aW9uYWwgYWRkaXRpb25hbCBmdW5jdGlvbnMsIG9yIGFycmF5cyBvZiBmdW5jdGlvbnMsIHRoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBpcyByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBkb25lKGRvbmVDYWxsYmFjazE/OiBKUXVlcnlQcm9taXNlQ2FsbGJhY2s8VD58SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPFQ+W10sIC4uLmRvbmVDYWxsYmFja046IEFycmF5PEpRdWVyeVByb21pc2VDYWxsYmFjazxUPnxKUXVlcnlQcm9taXNlQ2FsbGJhY2s8VD5bXT4pOiBKUXVlcnlEZWZlcnJlZDxUPjsKKyAgICAvKioKKyAgICAgKiBBZGQgaGFuZGxlcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIG9iamVjdCBpcyByZWplY3RlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrczEgQSBmdW5jdGlvbiwgb3IgYXJyYXkgb2YgZnVuY3Rpb25zLCB0aGF0IGFyZSBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgaXMgcmVqZWN0ZWQuCisgICAgICogQHBhcmFtIGZhaWxDYWxsYmFja3MyIE9wdGlvbmFsIGFkZGl0aW9uYWwgZnVuY3Rpb25zLCBvciBhcnJheXMgb2YgZnVuY3Rpb25zLCB0aGF0IGFyZSBjYWxsZWQgd2hlbiB0aGUgRGVmZXJyZWQgaXMgcmVqZWN0ZWQuCisgICAgICovCisgICAgZmFpbChmYWlsQ2FsbGJhY2sxPzogSlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT58SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT5bXSwgLi4uZmFpbENhbGxiYWNrc046IEFycmF5PEpRdWVyeVByb21pc2VDYWxsYmFjazxhbnk+fEpRdWVyeVByb21pc2VDYWxsYmFjazxhbnk+W10+KTogSlF1ZXJ5RGVmZXJyZWQ8VD47CisgICAgLyoqCisgICAgICogQWRkIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBEZWZlcnJlZCBvYmplY3QgZ2VuZXJhdGVzIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMuCisgICAgICogCisgICAgICogQHBhcmFtIHByb2dyZXNzQ2FsbGJhY2tzIEEgZnVuY3Rpb24sIG9yIGFycmF5IG9mIGZ1bmN0aW9ucywgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIERlZmVycmVkIGdlbmVyYXRlcyBwcm9ncmVzcyBub3RpZmljYXRpb25zLgorICAgICAqLworICAgIHByb2dyZXNzKHByb2dyZXNzQ2FsbGJhY2sxPzogSlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT58SlF1ZXJ5UHJvbWlzZUNhbGxiYWNrPGFueT5bXSwgLi4ucHJvZ3Jlc3NDYWxsYmFja046IEFycmF5PEpRdWVyeVByb21pc2VDYWxsYmFjazxhbnk+fEpRdWVyeVByb21pc2VDYWxsYmFjazxhbnk+W10+KTogSlF1ZXJ5RGVmZXJyZWQ8VD47CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBwcm9ncmVzc0NhbGxiYWNrcyBvbiBhIERlZmVycmVkIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBhcmdzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIHByb2dyZXNzQ2FsbGJhY2tzLgorICAgICAqLworICAgIG5vdGlmeSh2YWx1ZT86IGFueSwgLi4uYXJnczogYW55W10pOiBKUXVlcnlEZWZlcnJlZDxUPjsKKworICAgIC8qKgorICAgICAqIENhbGwgdGhlIHByb2dyZXNzQ2FsbGJhY2tzIG9uIGEgRGVmZXJyZWQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3MuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBwYXNzZWQgdG8gdGhlIHByb2dyZXNzQ2FsbGJhY2tzIGFzIHRoZSB0aGlzIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBwcm9ncmVzc0NhbGxiYWNrcy4KKyAgICAgKi8KKyAgICBub3RpZnlXaXRoKGNvbnRleHQ6IGFueSwgdmFsdWU/OiBhbnksIC4uLmFyZ3M6IGFueVtdKTogSlF1ZXJ5RGVmZXJyZWQ8VD47CisKKyAgICAvKioKKyAgICAgKiBSZWplY3QgYSBEZWZlcnJlZCBvYmplY3QgYW5kIGNhbGwgYW55IGZhaWxDYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJncy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBmYWlsQ2FsbGJhY2tzLgorICAgICAqLworICAgIHJlamVjdCh2YWx1ZT86IGFueSwgLi4uYXJnczogYW55W10pOiBKUXVlcnlEZWZlcnJlZDxUPjsKKyAgICAvKioKKyAgICAgKiBSZWplY3QgYSBEZWZlcnJlZCBvYmplY3QgYW5kIGNhbGwgYW55IGZhaWxDYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJncy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHBhc3NlZCB0byB0aGUgZmFpbENhbGxiYWNrcyBhcyB0aGUgdGhpcyBvYmplY3QuCisgICAgICogQHBhcmFtIGFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgZmFpbENhbGxiYWNrcy4KKyAgICAgKi8KKyAgICByZWplY3RXaXRoKGNvbnRleHQ6IGFueSwgdmFsdWU/OiBhbnksIC4uLmFyZ3M6IGFueVtdKTogSlF1ZXJ5RGVmZXJyZWQ8VD47CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGEgRGVmZXJyZWQgb2JqZWN0IGFuZCBjYWxsIGFueSBkb25lQ2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3MuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIEZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byBkb25lQ2FsbGJhY2tzLgorICAgICAqIEBwYXJhbSBhcmdzIE9wdGlvbmFsIHN1YnNlcXVlbnQgYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgZG9uZUNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICByZXNvbHZlKHZhbHVlPzogVCwgLi4uYXJnczogYW55W10pOiBKUXVlcnlEZWZlcnJlZDxUPjsKKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYSBEZWZlcnJlZCBvYmplY3QgYW5kIGNhbGwgYW55IGRvbmVDYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJncy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHBhc3NlZCB0byB0aGUgZG9uZUNhbGxiYWNrcyBhcyB0aGUgdGhpcyBvYmplY3QuCisgICAgICogQHBhcmFtIGFyZ3MgQW4gb3B0aW9uYWwgYXJyYXkgb2YgYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgZG9uZUNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICByZXNvbHZlV2l0aChjb250ZXh0OiBhbnksIHZhbHVlPzogVCwgLi4uYXJnczogYW55W10pOiBKUXVlcnlEZWZlcnJlZDxUPjsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIERlZmVycmVkJ3MgUHJvbWlzZSBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIHRhcmdldCBPYmplY3Qgb250byB3aGljaCB0aGUgcHJvbWlzZSBtZXRob2RzIGhhdmUgdG8gYmUgYXR0YWNoZWQKKyAgICAgKi8KKyAgICBwcm9taXNlKHRhcmdldD86IGFueSk6IEpRdWVyeVByb21pc2U8VD47CisKKyAgICAvLyBEZXByZWNhdGVkIC0gZ2l2ZW4gbm8gdHlwaW5ncworICAgIHBpcGUoZG9uZUZpbHRlcj86ICh4OiBhbnkpID0+IGFueSwgZmFpbEZpbHRlcj86ICh4OiBhbnkpID0+IGFueSwgcHJvZ3Jlc3NGaWx0ZXI/OiAoeDogYW55KSA9PiBhbnkpOiBKUXVlcnlQcm9taXNlPGFueT47Cit9CisKKy8qKgorICogSW50ZXJmYWNlIG9mIHRoZSBKUXVlcnkgZXh0ZW5zaW9uIG9mIHRoZSBXM0MgZXZlbnQgb2JqZWN0CisgKi8KK2ludGVyZmFjZSBCYXNlSlF1ZXJ5RXZlbnRPYmplY3QgZXh0ZW5kcyBFdmVudCB7CisgICAgZGF0YTogYW55OworICAgIGRlbGVnYXRlVGFyZ2V0OiBFbGVtZW50OworICAgIGlzRGVmYXVsdFByZXZlbnRlZCgpOiBib29sZWFuOworICAgIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk6IGJvb2xlYW47CisgICAgaXNQcm9wYWdhdGlvblN0b3BwZWQoKTogYm9vbGVhbjsKKyAgICBuYW1lc3BhY2U6IHN0cmluZzsKKyAgICBvcmlnaW5hbEV2ZW50OiBFdmVudDsKKyAgICBwcmV2ZW50RGVmYXVsdCgpOiBhbnk7CisgICAgcmVsYXRlZFRhcmdldDogRWxlbWVudDsKKyAgICByZXN1bHQ6IGFueTsKKyAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTogdm9pZDsKKyAgICBzdG9wUHJvcGFnYXRpb24oKTogdm9pZDsKKyAgICB0YXJnZXQ6IEVsZW1lbnQ7CisgICAgcGFnZVg6IG51bWJlcjsKKyAgICBwYWdlWTogbnVtYmVyOworICAgIHdoaWNoOiBudW1iZXI7CisgICAgbWV0YUtleTogYm9vbGVhbjsKK30KKworaW50ZXJmYWNlIEpRdWVyeUlucHV0RXZlbnRPYmplY3QgZXh0ZW5kcyBCYXNlSlF1ZXJ5RXZlbnRPYmplY3QgeworICAgIGFsdEtleTogYm9vbGVhbjsKKyAgICBjdHJsS2V5OiBib29sZWFuOworICAgIG1ldGFLZXk6IGJvb2xlYW47CisgICAgc2hpZnRLZXk6IGJvb2xlYW47Cit9CisKK2ludGVyZmFjZSBKUXVlcnlNb3VzZUV2ZW50T2JqZWN0IGV4dGVuZHMgSlF1ZXJ5SW5wdXRFdmVudE9iamVjdCB7CisgICAgYnV0dG9uOiBudW1iZXI7CisgICAgY2xpZW50WDogbnVtYmVyOworICAgIGNsaWVudFk6IG51bWJlcjsKKyAgICBvZmZzZXRYOiBudW1iZXI7CisgICAgb2Zmc2V0WTogbnVtYmVyOworICAgIHBhZ2VYOiBudW1iZXI7CisgICAgcGFnZVk6IG51bWJlcjsKKyAgICBzY3JlZW5YOiBudW1iZXI7CisgICAgc2NyZWVuWTogbnVtYmVyOworfQorCitpbnRlcmZhY2UgSlF1ZXJ5S2V5RXZlbnRPYmplY3QgZXh0ZW5kcyBKUXVlcnlJbnB1dEV2ZW50T2JqZWN0IHsKKyAgICBjaGFyOiBhbnk7CisgICAgY2hhckNvZGU6IG51bWJlcjsKKyAgICBrZXk6IGFueTsKKyAgICBrZXlDb2RlOiBudW1iZXI7Cit9CisKK2ludGVyZmFjZSBKUXVlcnlFdmVudE9iamVjdCBleHRlbmRzIEJhc2VKUXVlcnlFdmVudE9iamVjdCwgSlF1ZXJ5SW5wdXRFdmVudE9iamVjdCwgSlF1ZXJ5TW91c2VFdmVudE9iamVjdCwgSlF1ZXJ5S2V5RXZlbnRPYmplY3R7Cit9CisKKy8qCisgICAgQ29sbGVjdGlvbiBvZiBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IGJyb3dzZXIKKyovCisKK2ludGVyZmFjZSBKUXVlcnlTdXBwb3J0IHsKKyAgICBhamF4PzogYm9vbGVhbjsKKyAgICBib3hNb2RlbD86IGJvb2xlYW47CisgICAgY2hhbmdlQnViYmxlcz86IGJvb2xlYW47CisgICAgY2hlY2tDbG9uZT86IGJvb2xlYW47CisgICAgY2hlY2tPbj86IGJvb2xlYW47CisgICAgY29ycz86IGJvb2xlYW47CisgICAgY3NzRmxvYXQ/OiBib29sZWFuOworICAgIGhyZWZOb3JtYWxpemVkPzogYm9vbGVhbjsKKyAgICBodG1sU2VyaWFsaXplPzogYm9vbGVhbjsKKyAgICBsZWFkaW5nV2hpdGVzcGFjZT86IGJvb2xlYW47CisgICAgbm9DbG9uZUNoZWNrZWQ/OiBib29sZWFuOworICAgIG5vQ2xvbmVFdmVudD86IGJvb2xlYW47CisgICAgb3BhY2l0eT86IGJvb2xlYW47CisgICAgb3B0RGlzYWJsZWQ/OiBib29sZWFuOworICAgIG9wdFNlbGVjdGVkPzogYm9vbGVhbjsKKyAgICBzY3JpcHRFdmFsPyAoKTogYm9vbGVhbjsKKyAgICBzdHlsZT86IGJvb2xlYW47CisgICAgc3VibWl0QnViYmxlcz86IGJvb2xlYW47CisgICAgdGJvZHk/OiBib29sZWFuOworfQorCitpbnRlcmZhY2UgSlF1ZXJ5UGFyYW0geworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgYW4gYXJyYXkgb3Igb2JqZWN0LCBzdWl0YWJsZSBmb3IgdXNlIGluIGEgVVJMIHF1ZXJ5IHN0cmluZyBvciBBamF4IHJlcXVlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBBbiBhcnJheSBvciBvYmplY3QgdG8gc2VyaWFsaXplLgorICAgICAqLworICAgIChvYmo6IGFueSk6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgYW4gYXJyYXkgb3Igb2JqZWN0LCBzdWl0YWJsZSBmb3IgdXNlIGluIGEgVVJMIHF1ZXJ5IHN0cmluZyBvciBBamF4IHJlcXVlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBBbiBhcnJheSBvciBvYmplY3QgdG8gc2VyaWFsaXplLgorICAgICAqIEBwYXJhbSB0cmFkaXRpb25hbCBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBlcmZvcm0gYSB0cmFkaXRpb25hbCAic2hhbGxvdyIgc2VyaWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICAob2JqOiBhbnksIHRyYWRpdGlvbmFsOiBib29sZWFuKTogc3RyaW5nOworfQorCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgdXNlZCB0byBjb25zdHJ1Y3QgalF1ZXJ5IGV2ZW50cyAod2l0aCAkLkV2ZW50KS4gSXQgaXMKKyAqIGRlZmluZWQgc2VwYXJhdGVseSBpbnN0ZWFkIG9mIGlubGluZSBpbiBKUXVlcnlTdGF0aWMgdG8gYWxsb3cKKyAqIG92ZXJyaWRpbmcgdGhlIGNvbnN0cnVjdGlvbiBmdW5jdGlvbiB3aXRoIHNwZWNpZmljIHN0cmluZ3MKKyAqIHJldHVybmluZyBzcGVjaWZpYyBldmVudCBvYmplY3RzLgorICovCitpbnRlcmZhY2UgSlF1ZXJ5RXZlbnRDb25zdHJ1Y3RvciB7CisgICAgKG5hbWU6IHN0cmluZywgZXZlbnRQcm9wZXJ0aWVzPzogYW55KTogSlF1ZXJ5RXZlbnRPYmplY3Q7CisgICAgbmV3IChuYW1lOiBzdHJpbmcsIGV2ZW50UHJvcGVydGllcz86IGFueSk6IEpRdWVyeUV2ZW50T2JqZWN0OworfQorCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgdXNlZCB0byBzcGVjaWZ5IGNvb3JkaW5hdGVzLgorICovCitpbnRlcmZhY2UgSlF1ZXJ5Q29vcmRpbmF0ZXMgeworICAgIGxlZnQ6IG51bWJlcjsKKyAgICB0b3A6IG51bWJlcjsKK30KKworLyoqCisgKiBFbGVtZW50cyBpbiB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgc2VyaWFsaXplQXJyYXkoKQorICovCitpbnRlcmZhY2UgSlF1ZXJ5U2VyaWFsaXplQXJyYXlFbGVtZW50IHsKKyAgICBuYW1lOiBzdHJpbmc7CisgICAgdmFsdWU6IHN0cmluZzsKK30KKworaW50ZXJmYWNlIEpRdWVyeUFuaW1hdGlvbk9wdGlvbnMgeyAKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKi8KKyAgICBkdXJhdGlvbj86IGFueTsgCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgaW5kaWNhdGluZyB3aGljaCBlYXNpbmcgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgdHJhbnNpdGlvbi4KKyAgICAgKi8KKyAgICBlYXNpbmc/OiBzdHJpbmc7IAorICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgY29tcGxldGU/OiBGdW5jdGlvbjsgCisgICAgLyoqCisgICAgICogQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggYW5pbWF0ZWQgcHJvcGVydHkgb2YgZWFjaCBhbmltYXRlZCBlbGVtZW50LiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIG1vZGlmeSB0aGUgVHdlZW4gb2JqZWN0IHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGJlZm9yZSBpdCBpcyBzZXQuCisgICAgICovCisgICAgc3RlcD86IChub3c6IG51bWJlciwgdHdlZW46IGFueSkgPT4gYW55OyAKKyAgICAvKioKKyAgICAgKiBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciBlYWNoIHN0ZXAgb2YgdGhlIGFuaW1hdGlvbiwgb25seSBvbmNlIHBlciBhbmltYXRlZCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBhbmltYXRlZCBwcm9wZXJ0aWVzLiAodmVyc2lvbiBhZGRlZDogMS44KQorICAgICAqLworICAgIHByb2dyZXNzPzogKGFuaW1hdGlvbjogSlF1ZXJ5UHJvbWlzZTxhbnk+LCBwcm9ncmVzczogbnVtYmVyLCByZW1haW5pbmdNczogbnVtYmVyKSA9PiBhbnk7IAorICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBhbmltYXRpb24gYmVnaW5zLiAodmVyc2lvbiBhZGRlZDogMS44KQorICAgICAqLworICAgIHN0YXJ0PzogKGFuaW1hdGlvbjogSlF1ZXJ5UHJvbWlzZTxhbnk+KSA9PiBhbnk7IAorICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBjb21wbGV0ZXMgKGl0cyBQcm9taXNlIG9iamVjdCBpcyByZXNvbHZlZCkuICh2ZXJzaW9uIGFkZGVkOiAxLjgpCisgICAgICovCisgICAgZG9uZT86IChhbmltYXRpb246IEpRdWVyeVByb21pc2U8YW55PiwganVtcGVkVG9FbmQ6IGJvb2xlYW4pID0+IGFueTsgCisgICAgLyoqCisgICAgICogQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGZhaWxzIHRvIGNvbXBsZXRlIChpdHMgUHJvbWlzZSBvYmplY3QgaXMgcmVqZWN0ZWQpLiAodmVyc2lvbiBhZGRlZDogMS44KQorICAgICAqLworICAgIGZhaWw/OiAoYW5pbWF0aW9uOiBKUXVlcnlQcm9taXNlPGFueT4sIGp1bXBlZFRvRW5kOiBib29sZWFuKSA9PiBhbnk7IAorICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBjb21wbGV0ZXMgb3Igc3RvcHMgd2l0aG91dCBjb21wbGV0aW5nIChpdHMgUHJvbWlzZSBvYmplY3QgaXMgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkKS4gKHZlcnNpb24gYWRkZWQ6IDEuOCkKKyAgICAgKi8KKyAgICBhbHdheXM/OiAoYW5pbWF0aW9uOiBKUXVlcnlQcm9taXNlPGFueT4sIGp1bXBlZFRvRW5kOiBib29sZWFuKSA9PiBhbnk7IAorICAgIC8qKgorICAgICAqIEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcGxhY2UgdGhlIGFuaW1hdGlvbiBpbiB0aGUgZWZmZWN0cyBxdWV1ZS4gSWYgZmFsc2UsIHRoZSBhbmltYXRpb24gd2lsbCBiZWdpbiBpbW1lZGlhdGVseS4gQXMgb2YgalF1ZXJ5IDEuNywgdGhlIHF1ZXVlIG9wdGlvbiBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgdGhlIGFuaW1hdGlvbiBpcyBhZGRlZCB0byB0aGUgcXVldWUgcmVwcmVzZW50ZWQgYnkgdGhhdCBzdHJpbmcuIFdoZW4gYSBjdXN0b20gcXVldWUgbmFtZSBpcyB1c2VkIHRoZSBhbmltYXRpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBzdGFydDsgeW91IG11c3QgY2FsbCAuZGVxdWV1ZSgicXVldWVuYW1lIikgdG8gc3RhcnQgaXQuCisgICAgICovCisgICAgcXVldWU/OiBhbnk7IAorICAgIC8qKgorICAgICAqIEEgbWFwIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBDU1MgcHJvcGVydGllcyBkZWZpbmVkIGJ5IHRoZSBwcm9wZXJ0aWVzIGFyZ3VtZW50IGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGVhc2luZyBmdW5jdGlvbnMuICh2ZXJzaW9uIGFkZGVkOiAxLjQpCisgICAgICovCisgICAgc3BlY2lhbEVhc2luZz86IE9iamVjdDsKK30KKworLyoqCisgKiBTdGF0aWMgbWVtYmVycyBvZiBqUXVlcnkgKHRob3NlIG9uICQgYW5kIGpRdWVyeSB0aGVtc2VsdmVzKQorICovCitpbnRlcmZhY2UgSlF1ZXJ5U3RhdGljIHsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gYXN5bmNocm9ub3VzIEhUVFAgKEFqYXgpIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0dGluZ3MgQSBzZXQgb2Yga2V5L3ZhbHVlIHBhaXJzIHRoYXQgY29uZmlndXJlIHRoZSBBamF4IHJlcXVlc3QuIEFsbCBzZXR0aW5ncyBhcmUgb3B0aW9uYWwuIEEgZGVmYXVsdCBjYW4gYmUgc2V0IGZvciBhbnkgb3B0aW9uIHdpdGggJC5hamF4U2V0dXAoKS4KKyAgICAgKi8KKyAgICBhamF4KHNldHRpbmdzOiBKUXVlcnlBamF4U2V0dGluZ3MpOiBKUXVlcnlYSFI7CisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbiBhc3luY2hyb25vdXMgSFRUUCAoQWpheCkgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIHNlbnQuCisgICAgICogQHBhcmFtIHNldHRpbmdzIEEgc2V0IG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IGNvbmZpZ3VyZSB0aGUgQWpheCByZXF1ZXN0LiBBbGwgc2V0dGluZ3MgYXJlIG9wdGlvbmFsLiBBIGRlZmF1bHQgY2FuIGJlIHNldCBmb3IgYW55IG9wdGlvbiB3aXRoICQuYWpheFNldHVwKCkuCisgICAgICovCisgICAgYWpheCh1cmw6IHN0cmluZywgc2V0dGluZ3M/OiBKUXVlcnlBamF4U2V0dGluZ3MpOiBKUXVlcnlYSFI7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgY3VzdG9tIEFqYXggb3B0aW9ucyBvciBtb2RpZnkgZXhpc3Rpbmcgb3B0aW9ucyBiZWZvcmUgZWFjaCByZXF1ZXN0IGlzIHNlbnQgYW5kIGJlZm9yZSB0aGV5IGFyZSBwcm9jZXNzZWQgYnkgJC5hamF4KCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGVzIEFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBkYXRhVHlwZXMKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGhhbmRsZXIgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBmdXR1cmUgQWpheCByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBhamF4UHJlZmlsdGVyKGRhdGFUeXBlczogc3RyaW5nLCBoYW5kbGVyOiAob3B0czogYW55LCBvcmlnaW5hbE9wdHM6IEpRdWVyeUFqYXhTZXR0aW5ncywganFYSFI6IEpRdWVyeVhIUikgPT4gYW55KTogdm9pZDsKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgY3VzdG9tIEFqYXggb3B0aW9ucyBvciBtb2RpZnkgZXhpc3Rpbmcgb3B0aW9ucyBiZWZvcmUgZWFjaCByZXF1ZXN0IGlzIHNlbnQgYW5kIGJlZm9yZSB0aGV5IGFyZSBwcm9jZXNzZWQgYnkgJC5hamF4KCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGhhbmRsZXIgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBmdXR1cmUgQWpheCByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBhamF4UHJlZmlsdGVyKGhhbmRsZXI6IChvcHRzOiBhbnksIG9yaWdpbmFsT3B0czogSlF1ZXJ5QWpheFNldHRpbmdzLCBqcVhIUjogSlF1ZXJ5WEhSKSA9PiBhbnkpOiB2b2lkOworCisgICAgYWpheFNldHRpbmdzOiBKUXVlcnlBamF4U2V0dGluZ3M7CisKKyAgICAgLyoqCisgICAgICAqIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgZnV0dXJlIEFqYXggcmVxdWVzdHMuIEl0cyB1c2UgaXMgbm90IHJlY29tbWVuZGVkLgorICAgICAgKgorICAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIHNldCBvZiBrZXkvdmFsdWUgcGFpcnMgdGhhdCBjb25maWd1cmUgdGhlIGRlZmF1bHQgQWpheCByZXF1ZXN0LiBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwuCisgICAgICAqLworICAgIGFqYXhTZXR1cChvcHRpb25zOiBKUXVlcnlBamF4U2V0dGluZ3MpOiB2b2lkOworCisgICAgLyoqCisgICAgICogTG9hZCBkYXRhIGZyb20gdGhlIHNlcnZlciB1c2luZyBhIEhUVFAgR0VUIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBzZW50LgorICAgICAqIEBwYXJhbSBzdWNjZXNzIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUgVGhlIHR5cGUgb2YgZGF0YSBleHBlY3RlZCBmcm9tIHRoZSBzZXJ2ZXIuIERlZmF1bHQ6IEludGVsbGlnZW50IEd1ZXNzICh4bWwsIGpzb24sIHNjcmlwdCwgb3IgaHRtbCkuCisgICAgICovCisgICAgZ2V0KHVybDogc3RyaW5nLCBzdWNjZXNzPzogKGRhdGE6IGFueSwgdGV4dFN0YXR1czogc3RyaW5nLCBqcVhIUjogSlF1ZXJ5WEhSKSA9PiBhbnksIGRhdGFUeXBlPzogc3RyaW5nKTogSlF1ZXJ5WEhSOworICAgIC8qKgorICAgICAqIExvYWQgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmcgYSBIVFRQIEdFVCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBBIHN0cmluZyBjb250YWluaW5nIHRoZSBVUkwgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgc2VudC4KKyAgICAgKiBAcGFyYW0gZGF0YSBBIHBsYWluIG9iamVjdCBvciBzdHJpbmcgdGhhdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gc3VjY2VzcyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlIFRoZSB0eXBlIG9mIGRhdGEgZXhwZWN0ZWQgZnJvbSB0aGUgc2VydmVyLiBEZWZhdWx0OiBJbnRlbGxpZ2VudCBHdWVzcyAoeG1sLCBqc29uLCBzY3JpcHQsIG9yIGh0bWwpLgorICAgICAqLworICAgIGdldCh1cmw6IHN0cmluZywgZGF0YT86IE9iamVjdHxzdHJpbmcsIHN1Y2Nlc3M/OiAoZGF0YTogYW55LCB0ZXh0U3RhdHVzOiBzdHJpbmcsIGpxWEhSOiBKUXVlcnlYSFIpID0+IGFueSwgZGF0YVR5cGU/OiBzdHJpbmcpOiBKUXVlcnlYSFI7CisgICAgLyoqCisgICAgICogTG9hZCBKU09OLWVuY29kZWQgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmcgYSBHRVQgSFRUUCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBBIHN0cmluZyBjb250YWluaW5nIHRoZSBVUkwgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgc2VudC4KKyAgICAgKiBAcGFyYW0gc3VjY2VzcyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCisgICAgICovCisgICAgZ2V0SlNPTih1cmw6IHN0cmluZywgc3VjY2Vzcz86IChkYXRhOiBhbnksIHRleHRTdGF0dXM6IHN0cmluZywganFYSFI6IEpRdWVyeVhIUikgPT4gYW55KTogSlF1ZXJ5WEhSOworICAgIC8qKgorICAgICAqIExvYWQgSlNPTi1lbmNvZGVkIGRhdGEgZnJvbSB0aGUgc2VydmVyIHVzaW5nIGEgR0VUIEhUVFAgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIHNlbnQuCisgICAgICogQHBhcmFtIGRhdGEgQSBwbGFpbiBvYmplY3Qgb3Igc3RyaW5nIHRoYXQgaXMgc2VudCB0byB0aGUgc2VydmVyIHdpdGggdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHN1Y2Nlc3MgQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgorICAgICAqLworICAgIGdldEpTT04odXJsOiBzdHJpbmcsIGRhdGE/OiBPYmplY3R8c3RyaW5nLCBzdWNjZXNzPzogKGRhdGE6IGFueSwgdGV4dFN0YXR1czogc3RyaW5nLCBqcVhIUjogSlF1ZXJ5WEhSKSA9PiBhbnkpOiBKUXVlcnlYSFI7CisgICAgLyoqCisgICAgICogTG9hZCBhIEphdmFTY3JpcHQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmcgYSBHRVQgSFRUUCByZXF1ZXN0LCB0aGVuIGV4ZWN1dGUgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBzZW50LgorICAgICAqIEBwYXJhbSBzdWNjZXNzIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAgICAgKi8KKyAgICBnZXRTY3JpcHQodXJsOiBzdHJpbmcsIHN1Y2Nlc3M/OiAoc2NyaXB0OiBzdHJpbmcsIHRleHRTdGF0dXM6IHN0cmluZywganFYSFI6IEpRdWVyeVhIUikgPT4gYW55KTogSlF1ZXJ5WEhSOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiBhbiBhcnJheSBvciBvYmplY3QsIHN1aXRhYmxlIGZvciB1c2UgaW4gYSBVUkwgcXVlcnkgc3RyaW5nIG9yIEFqYXggcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwYXJhbTogSlF1ZXJ5UGFyYW07CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGRhdGEgZnJvbSB0aGUgc2VydmVyIHVzaW5nIGEgSFRUUCBQT1NUIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBzZW50LgorICAgICAqIEBwYXJhbSBzdWNjZXNzIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4gUmVxdWlyZWQgaWYgZGF0YVR5cGUgaXMgcHJvdmlkZWQsIGJ1dCBjYW4gYmUgbnVsbCBpbiB0aGF0IGNhc2UuCisgICAgICogQHBhcmFtIGRhdGFUeXBlIFRoZSB0eXBlIG9mIGRhdGEgZXhwZWN0ZWQgZnJvbSB0aGUgc2VydmVyLiBEZWZhdWx0OiBJbnRlbGxpZ2VudCBHdWVzcyAoeG1sLCBqc29uLCBzY3JpcHQsIHRleHQsIGh0bWwpLgorICAgICAqLworICAgIHBvc3QodXJsOiBzdHJpbmcsIHN1Y2Nlc3M/OiAoZGF0YTogYW55LCB0ZXh0U3RhdHVzOiBzdHJpbmcsIGpxWEhSOiBKUXVlcnlYSFIpID0+IGFueSwgZGF0YVR5cGU/OiBzdHJpbmcpOiBKUXVlcnlYSFI7CisgICAgLyoqCisgICAgICogTG9hZCBkYXRhIGZyb20gdGhlIHNlcnZlciB1c2luZyBhIEhUVFAgUE9TVCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBBIHN0cmluZyBjb250YWluaW5nIHRoZSBVUkwgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgc2VudC4KKyAgICAgKiBAcGFyYW0gZGF0YSBBIHBsYWluIG9iamVjdCBvciBzdHJpbmcgdGhhdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gc3VjY2VzcyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMuIFJlcXVpcmVkIGlmIGRhdGFUeXBlIGlzIHByb3ZpZGVkLCBidXQgY2FuIGJlIG51bGwgaW4gdGhhdCBjYXNlLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgdHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZyb20gdGhlIHNlcnZlci4gRGVmYXVsdDogSW50ZWxsaWdlbnQgR3Vlc3MgKHhtbCwganNvbiwgc2NyaXB0LCB0ZXh0LCBodG1sKS4KKyAgICAgKi8KKyAgICBwb3N0KHVybDogc3RyaW5nLCBkYXRhPzogT2JqZWN0fHN0cmluZywgc3VjY2Vzcz86IChkYXRhOiBhbnksIHRleHRTdGF0dXM6IHN0cmluZywganFYSFI6IEpRdWVyeVhIUikgPT4gYW55LCBkYXRhVHlwZT86IHN0cmluZyk6IEpRdWVyeVhIUjsKKworICAgIC8qKgorICAgICAqIEEgbXVsdGktcHVycG9zZSBjYWxsYmFja3MgbGlzdCBvYmplY3QgdGhhdCBwcm92aWRlcyBhIHBvd2VyZnVsIHdheSB0byBtYW5hZ2UgY2FsbGJhY2sgbGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxhZ3MgQW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgZmxhZ3MgdGhhdCBjaGFuZ2UgaG93IHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMuCisgICAgICovCisgICAgQ2FsbGJhY2tzKGZsYWdzPzogc3RyaW5nKTogSlF1ZXJ5Q2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBvciByZWxlYXNlcyB0aGUgZXhlY3V0aW9uIG9mIGpRdWVyeSdzIHJlYWR5IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhvbGQgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlYWR5IGhvbGQgaXMgYmVpbmcgcmVxdWVzdGVkIG9yIHJlbGVhc2VkCisgICAgICovCisgICAgaG9sZFJlYWR5KGhvbGQ6IGJvb2xlYW4pOiB2b2lkOworCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhIHN0cmluZyBjb250YWluaW5nIGEgQ1NTIHNlbGVjdG9yIHdoaWNoIGlzIHRoZW4gdXNlZCB0byBtYXRjaCBhIHNldCBvZiBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgRE9NIEVsZW1lbnQsIERvY3VtZW50LCBvciBqUXVlcnkgdG8gdXNlIGFzIGNvbnRleHQKKyAgICAgKi8KKyAgICAoc2VsZWN0b3I6IHN0cmluZywgY29udGV4dD86IEVsZW1lbnR8SlF1ZXJ5KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhIHN0cmluZyBjb250YWluaW5nIGEgQ1NTIHNlbGVjdG9yIHdoaWNoIGlzIHRoZW4gdXNlZCB0byBtYXRjaCBhIHNldCBvZiBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IEEgRE9NIGVsZW1lbnQgdG8gd3JhcCBpbiBhIGpRdWVyeSBvYmplY3QuCisgICAgICovCisgICAgKGVsZW1lbnQ6IEVsZW1lbnQpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBDU1Mgc2VsZWN0b3Igd2hpY2ggaXMgdGhlbiB1c2VkIHRvIG1hdGNoIGEgc2V0IG9mIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnRBcnJheSBBbiBhcnJheSBjb250YWluaW5nIGEgc2V0IG9mIERPTSBlbGVtZW50cyB0byB3cmFwIGluIGEgalF1ZXJ5IG9iamVjdC4KKyAgICAgKi8KKyAgICAoZWxlbWVudEFycmF5OiBFbGVtZW50W10pOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIERPTSBoYXMgZmluaXNoZWQgbG9hZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIERPTSBpcyByZWFkeS4KKyAgICAgKi8KKyAgICAoY2FsbGJhY2s6IChqUXVlcnlBbGlhcz86IEpRdWVyeVN0YXRpYykgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhIHN0cmluZyBjb250YWluaW5nIGEgQ1NTIHNlbGVjdG9yIHdoaWNoIGlzIHRoZW4gdXNlZCB0byBtYXRjaCBhIHNldCBvZiBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgQSBwbGFpbiBvYmplY3QgdG8gd3JhcCBpbiBhIGpRdWVyeSBvYmplY3QuCisgICAgICovCisgICAgKG9iamVjdDoge30pOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBDU1Mgc2VsZWN0b3Igd2hpY2ggaXMgdGhlbiB1c2VkIHRvIG1hdGNoIGEgc2V0IG9mIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCBBbiBleGlzdGluZyBqUXVlcnkgb2JqZWN0IHRvIGNsb25lLgorICAgICAqLworICAgIChvYmplY3Q6IEpRdWVyeSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgYSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIERPTSBpcyBmdWxseSBsb2FkZWQuCisgICAgICovCisgICAgKCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgRE9NIGVsZW1lbnRzIG9uIHRoZSBmbHkgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nIG9mIHJhdyBIVE1MLgorICAgICAqCisgICAgICogQHBhcmFtIGh0bWwgQSBzdHJpbmcgb2YgSFRNTCB0byBjcmVhdGUgb24gdGhlIGZseS4gTm90ZSB0aGF0IHRoaXMgcGFyc2VzIEhUTUwsIG5vdCBYTUwuCisgICAgICogQHBhcmFtIG93bmVyRG9jdW1lbnQgQSBkb2N1bWVudCBpbiB3aGljaCB0aGUgbmV3IGVsZW1lbnRzIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICAoaHRtbDogc3RyaW5nLCBvd25lckRvY3VtZW50PzogRG9jdW1lbnQpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIERPTSBlbGVtZW50cyBvbiB0aGUgZmx5IGZyb20gdGhlIHByb3ZpZGVkIHN0cmluZyBvZiByYXcgSFRNTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBodG1sIEEgc3RyaW5nIGRlZmluaW5nIGEgc2luZ2xlLCBzdGFuZGFsb25lLCBIVE1MIGVsZW1lbnQgKGUuZy4gPGRpdi8+IG9yIDxkaXY+PC9kaXY+KS4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBbiBvYmplY3Qgb2YgYXR0cmlidXRlcywgZXZlbnRzLCBhbmQgbWV0aG9kcyB0byBjYWxsIG9uIHRoZSBuZXdseS1jcmVhdGVkIGVsZW1lbnQuCisgICAgICovCisgICAgKGh0bWw6IHN0cmluZywgYXR0cmlidXRlczogT2JqZWN0KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVsaW5xdWlzaCBqUXVlcnkncyBjb250cm9sIG9mIHRoZSAkIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlbW92ZUFsbCBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJlbW92ZSBhbGwgalF1ZXJ5IHZhcmlhYmxlcyBmcm9tIHRoZSBnbG9iYWwgc2NvcGUgKGluY2x1ZGluZyBqUXVlcnkgaXRzZWxmKS4KKyAgICAgKi8KKyAgICBub0NvbmZsaWN0KHJlbW92ZUFsbD86IGJvb2xlYW4pOiBPYmplY3Q7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBhIHdheSB0byBleGVjdXRlIGNhbGxiYWNrIGZ1bmN0aW9ucyBiYXNlZCBvbiBvbmUgb3IgbW9yZSBvYmplY3RzLCB1c3VhbGx5IERlZmVycmVkIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZlcnJlZHMgT25lIG9yIG1vcmUgRGVmZXJyZWQgb2JqZWN0cywgb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLgorICAgICAqLworICAgIHdoZW48VD4oLi4uZGVmZXJyZWRzOiBBcnJheTxUfEpRdWVyeVByb21pc2U8VD4vKiBhcyBKUXVlcnlEZWZlcnJlZDxUPiAqLz4pOiBKUXVlcnlQcm9taXNlPFQ+OworCisgICAgLyoqCisgICAgICogSG9vayBkaXJlY3RseSBpbnRvIGpRdWVyeSB0byBvdmVycmlkZSBob3cgcGFydGljdWxhciBDU1MgcHJvcGVydGllcyBhcmUgcmV0cmlldmVkIG9yIHNldCwgbm9ybWFsaXplIENTUyBwcm9wZXJ0eSBuYW1pbmcsIG9yIGNyZWF0ZSBjdXN0b20gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBjc3NIb29rczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07CisgICAgY3NzTnVtYmVyOiBhbnk7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSBhcmJpdHJhcnkgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgRE9NIGVsZW1lbnQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGtleSBBIHN0cmluZyBuYW1pbmcgdGhlIHBpZWNlIG9mIGRhdGEgdG8gc2V0LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGRhdGEgdmFsdWUuCisgICAgICovCisgICAgZGF0YTxUPihlbGVtZW50OiBFbGVtZW50LCBrZXk6IHN0cmluZywgdmFsdWU6IFQpOiBUOworICAgIC8qKgorICAgICAqIFJldHVybnMgdmFsdWUgYXQgbmFtZWQgZGF0YSBzdG9yZSBmb3IgdGhlIGVsZW1lbnQsIGFzIHNldCBieSBqUXVlcnkuZGF0YShlbGVtZW50LCBuYW1lLCB2YWx1ZSksIG9yIHRoZSBmdWxsIGRhdGEgc3RvcmUgZm9yIHRoZSBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBrZXkgQSBzdHJpbmcgbmFtaW5nIHRoZSBwaWVjZSBvZiBkYXRhIHRvIHNldC4KKyAgICAgKi8KKyAgICBkYXRhKGVsZW1lbnQ6IEVsZW1lbnQsIGtleTogc3RyaW5nKTogYW55OworICAgIC8qKgorICAgICAqIFJldHVybnMgdmFsdWUgYXQgbmFtZWQgZGF0YSBzdG9yZSBmb3IgdGhlIGVsZW1lbnQsIGFzIHNldCBieSBqUXVlcnkuZGF0YShlbGVtZW50LCBuYW1lLCB2YWx1ZSksIG9yIHRoZSBmdWxsIGRhdGEgc3RvcmUgZm9yIHRoZSBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBkYXRhLgorICAgICAqLworICAgIGRhdGEoZWxlbWVudDogRWxlbWVudCk6IGFueTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIG5leHQgZnVuY3Rpb24gb24gdGhlIHF1ZXVlIGZvciB0aGUgbWF0Y2hlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnQgQSBET00gZWxlbWVudCBmcm9tIHdoaWNoIHRvIHJlbW92ZSBhbmQgZXhlY3V0ZSBhIHF1ZXVlZCBmdW5jdGlvbi4KKyAgICAgKiBAcGFyYW0gcXVldWVOYW1lIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlLiBEZWZhdWx0cyB0byBmeCwgdGhlIHN0YW5kYXJkIGVmZmVjdHMgcXVldWUuCisgICAgICovCisgICAgZGVxdWV1ZShlbGVtZW50OiBFbGVtZW50LCBxdWV1ZU5hbWU/OiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYW4gZWxlbWVudCBoYXMgYW55IGpRdWVyeSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IEEgRE9NIGVsZW1lbnQgdG8gYmUgY2hlY2tlZCBmb3IgZGF0YS4KKyAgICAgKi8KKyAgICBoYXNEYXRhKGVsZW1lbnQ6IEVsZW1lbnQpOiBib29sZWFuOworCisgICAgLyoqCisgICAgICogU2hvdyB0aGUgcXVldWUgb2YgZnVuY3Rpb25zIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBtYXRjaGVkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudCBBIERPTSBlbGVtZW50IHRvIGluc3BlY3QgZm9yIGFuIGF0dGFjaGVkIHF1ZXVlLgorICAgICAqIEBwYXJhbSBxdWV1ZU5hbWUgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgcXVldWUuIERlZmF1bHRzIHRvIGZ4LCB0aGUgc3RhbmRhcmQgZWZmZWN0cyBxdWV1ZS4KKyAgICAgKi8KKyAgICBxdWV1ZShlbGVtZW50OiBFbGVtZW50LCBxdWV1ZU5hbWU/OiBzdHJpbmcpOiBhbnlbXTsKKyAgICAvKioKKyAgICAgKiBNYW5pcHVsYXRlIHRoZSBxdWV1ZSBvZiBmdW5jdGlvbnMgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIG1hdGNoZWQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IEEgRE9NIGVsZW1lbnQgd2hlcmUgdGhlIGFycmF5IG9mIHF1ZXVlZCBmdW5jdGlvbnMgaXMgYXR0YWNoZWQuCisgICAgICogQHBhcmFtIHF1ZXVlTmFtZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBxdWV1ZS4gRGVmYXVsdHMgdG8gZngsIHRoZSBzdGFuZGFyZCBlZmZlY3RzIHF1ZXVlLgorICAgICAqIEBwYXJhbSBuZXdRdWV1ZSBBbiBhcnJheSBvZiBmdW5jdGlvbnMgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBxdWV1ZSBjb250ZW50cy4KKyAgICAgKi8KKyAgICBxdWV1ZShlbGVtZW50OiBFbGVtZW50LCBxdWV1ZU5hbWU6IHN0cmluZywgbmV3UXVldWU6IEZ1bmN0aW9uW10pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogTWFuaXB1bGF0ZSB0aGUgcXVldWUgb2YgZnVuY3Rpb25zIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBtYXRjaGVkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudCBBIERPTSBlbGVtZW50IG9uIHdoaWNoIHRvIGFkZCBhIHF1ZXVlZCBmdW5jdGlvbi4KKyAgICAgKiBAcGFyYW0gcXVldWVOYW1lIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlLiBEZWZhdWx0cyB0byBmeCwgdGhlIHN0YW5kYXJkIGVmZmVjdHMgcXVldWUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBuZXcgZnVuY3Rpb24gdG8gYWRkIHRvIHRoZSBxdWV1ZS4KKyAgICAgKi8KKyAgICBxdWV1ZShlbGVtZW50OiBFbGVtZW50LCBxdWV1ZU5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJldmlvdXNseS1zdG9yZWQgcGllY2Ugb2YgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IEEgRE9NIGVsZW1lbnQgZnJvbSB3aGljaCB0byByZW1vdmUgZGF0YS4KKyAgICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyBuYW1pbmcgdGhlIHBpZWNlIG9mIGRhdGEgdG8gcmVtb3ZlLgorICAgICAqLworICAgIHJlbW92ZURhdGEoZWxlbWVudDogRWxlbWVudCwgbmFtZT86IHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgY2hhaW5hYmxlIHV0aWxpdHkgb2JqZWN0IHdpdGggbWV0aG9kcyB0byByZWdpc3RlciBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBjYWxsYmFjayBxdWV1ZXMsIGludm9rZSBjYWxsYmFjayBxdWV1ZXMsIGFuZCByZWxheSB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIHN0YXRlIG9mIGFueSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmVmb3JlU3RhcnQgQSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgY29uc3RydWN0b3IgcmV0dXJucy4KKyAgICAgKi8KKyAgICBEZWZlcnJlZDxUPihiZWZvcmVTdGFydD86IChkZWZlcnJlZDogSlF1ZXJ5RGVmZXJyZWQ8VD4pID0+IGFueSk6IEpRdWVyeURlZmVycmVkPFQ+OworCisgICAgLyoqCisgICAgICogRWZmZWN0cworICAgICAqLworICAgIGZ4OiB7CisgICAgICAgIHRpY2s6ICgpID0+IHZvaWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcmF0ZSAoaW4gbWlsbGlzZWNvbmRzKSBhdCB3aGljaCBhbmltYXRpb25zIGZpcmUuCisgICAgICAgICAqLworICAgICAgICBpbnRlcnZhbDogbnVtYmVyOworICAgICAgICBzdG9wOiAoKSA9PiB2b2lkOworICAgICAgICBzcGVlZHM6IHsgc2xvdzogbnVtYmVyOyBmYXN0OiBudW1iZXI7IH07CisgICAgICAgIC8qKgorICAgICAgICAgKiBHbG9iYWxseSBkaXNhYmxlIGFsbCBhbmltYXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgb2ZmOiBib29sZWFuOworICAgICAgICBzdGVwOiBhbnk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRha2VzIGEgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBuZXcgb25lIHRoYXQgd2lsbCBhbHdheXMgaGF2ZSBhIHBhcnRpY3VsYXIgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbmN0aW9uIFRoZSBmdW5jdGlvbiB3aG9zZSBjb250ZXh0IHdpbGwgYmUgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBjb250ZXh0ICh0aGlzKSBvZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gYWRkaXRpb25hbEFyZ3VtZW50cyBBbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIHJlZmVyZW5jZWQgaW4gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LgorICAgICAqLworICAgIHByb3h5KGZuY3Rpb246ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBjb250ZXh0OiBPYmplY3QsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHM6IGFueVtdKTogYW55OworICAgIC8qKgorICAgICAqIFRha2VzIGEgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBuZXcgb25lIHRoYXQgd2lsbCBhbHdheXMgaGF2ZSBhIHBhcnRpY3VsYXIgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBvYmplY3QgdG8gd2hpY2ggdGhlIGNvbnRleHQgKHRoaXMpIG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgc2V0LgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB3aG9zZSBjb250ZXh0IHdpbGwgYmUgY2hhbmdlZCAoc2hvdWxkIGJlIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRleHQgb2JqZWN0KS4KKyAgICAgKiBAcGFyYW0gYWRkaXRpb25hbEFyZ3VtZW50cyBBbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVkIGluIHRoZSBuYW1lIGFyZ3VtZW50LgorICAgICAqLworICAgIHByb3h5KGNvbnRleHQ6IE9iamVjdCwgbmFtZTogc3RyaW5nLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzOiBhbnlbXSk6IGFueTsKKworICAgIEV2ZW50OiBKUXVlcnlFdmVudENvbnN0cnVjdG9yOworCisgICAgLyoqCisgICAgICogVGFrZXMgYSBzdHJpbmcgYW5kIHRocm93cyBhbiBleGNlcHRpb24gY29udGFpbmluZyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNlbmQgb3V0LgorICAgICAqLworICAgIGVycm9yKG1lc3NhZ2U6IGFueSk6IEpRdWVyeTsKKworICAgIGV4cHI6IGFueTsKKyAgICBmbjogYW55OyAgLy9UT0RPOiBEZWNpZGUgaG93IHdlIHdhbnQgdG8gdHlwZSB0aGlzCisKKyAgICBpc1JlYWR5OiBib29sZWFuOworCisgICAgLy8gUHJvcGVydGllcworICAgIHN1cHBvcnQ6IEpRdWVyeVN1cHBvcnQ7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBET00gZWxlbWVudCBpcyBhIGRlc2NlbmRhbnQgb2YgYW5vdGhlciBET00gZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBET00gZWxlbWVudCB0aGF0IG1heSBjb250YWluIHRoZSBvdGhlciBlbGVtZW50LgorICAgICAqIEBwYXJhbSBjb250YWluZWQgVGhlIERPTSBlbGVtZW50IHRoYXQgbWF5IGJlIGNvbnRhaW5lZCBieSAoYSBkZXNjZW5kYW50IG9mKSB0aGUgb3RoZXIgZWxlbWVudC4KKyAgICAgKi8KKyAgICBjb250YWlucyhjb250YWluZXI6IEVsZW1lbnQsIGNvbnRhaW5lZDogRWxlbWVudCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBBIGdlbmVyaWMgaXRlcmF0b3IgZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlYW1sZXNzbHkgaXRlcmF0ZSBvdmVyIGJvdGggb2JqZWN0cyBhbmQgYXJyYXlzLiBBcnJheXMgYW5kIGFycmF5LWxpa2Ugb2JqZWN0cyB3aXRoIGEgbGVuZ3RoIHByb3BlcnR5IChzdWNoIGFzIGEgZnVuY3Rpb24ncyBhcmd1bWVudHMgb2JqZWN0KSBhcmUgaXRlcmF0ZWQgYnkgbnVtZXJpYyBpbmRleCwgZnJvbSAwIHRvIGxlbmd0aC0xLiBPdGhlciBvYmplY3RzIGFyZSBpdGVyYXRlZCB2aWEgdGhlaXIgbmFtZWQgcHJvcGVydGllcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbiBldmVyeSBvYmplY3QuCisgICAgICovCisgICAgZWFjaDxUPigKKyAgICAgICAgY29sbGVjdGlvbjogVFtdLAorICAgICAgICBjYWxsYmFjazogKGluZGV4SW5BcnJheTogbnVtYmVyLCB2YWx1ZU9mRWxlbWVudDogVCkgPT4gYW55CisgICAgICAgICk6IGFueTsKKworICAgIC8qKgorICAgICAqIEEgZ2VuZXJpYyBpdGVyYXRvciBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VhbWxlc3NseSBpdGVyYXRlIG92ZXIgYm90aCBvYmplY3RzIGFuZCBhcnJheXMuIEFycmF5cyBhbmQgYXJyYXktbGlrZSBvYmplY3RzIHdpdGggYSBsZW5ndGggcHJvcGVydHkgKHN1Y2ggYXMgYSBmdW5jdGlvbidzIGFyZ3VtZW50cyBvYmplY3QpIGFyZSBpdGVyYXRlZCBieSBudW1lcmljIGluZGV4LCBmcm9tIDAgdG8gbGVuZ3RoLTEuIE90aGVyIG9iamVjdHMgYXJlIGl0ZXJhdGVkIHZpYSB0aGVpciBuYW1lZCBwcm9wZXJ0aWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIG9uIGV2ZXJ5IG9iamVjdC4KKyAgICAgKi8KKyAgICBlYWNoKAorICAgICAgICBjb2xsZWN0aW9uOiBhbnksCisgICAgICAgIGNhbGxiYWNrOiAoaW5kZXhJbkFycmF5OiBhbnksIHZhbHVlT2ZFbGVtZW50OiBhbnkpID0+IGFueQorICAgICAgICApOiBhbnk7CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgY29udGVudHMgb2YgdHdvIG9yIG1vcmUgb2JqZWN0cyB0b2dldGhlciBpbnRvIHRoZSBmaXJzdCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IEFuIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgbmV3IHByb3BlcnRpZXMgaWYgYWRkaXRpb25hbCBvYmplY3RzIGFyZSBwYXNzZWQgaW4gb3IgdGhhdCB3aWxsIGV4dGVuZCB0aGUgalF1ZXJ5IG5hbWVzcGFjZSBpZiBpdCBpcyB0aGUgc29sZSBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gb2JqZWN0MSBBbiBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gbWVyZ2UgaW4uCisgICAgICogQHBhcmFtIG9iamVjdE4gQWRkaXRpb25hbCBvYmplY3RzIGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBtZXJnZSBpbi4KKyAgICAgKi8KKyAgICBleHRlbmQodGFyZ2V0OiBhbnksIG9iamVjdDE/OiBhbnksIC4uLm9iamVjdE46IGFueVtdKTogYW55OworICAgIC8qKgorICAgICAqIE1lcmdlIHRoZSBjb250ZW50cyBvZiB0d28gb3IgbW9yZSBvYmplY3RzIHRvZ2V0aGVyIGludG8gdGhlIGZpcnN0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWVwIElmIHRydWUsIHRoZSBtZXJnZSBiZWNvbWVzIHJlY3Vyc2l2ZSAoYWthLiBkZWVwIGNvcHkpLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0byBleHRlbmQuIEl0IHdpbGwgcmVjZWl2ZSB0aGUgbmV3IHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIG9iamVjdDEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIG1lcmdlIGluLgorICAgICAqIEBwYXJhbSBvYmplY3ROIEFkZGl0aW9uYWwgb2JqZWN0cyBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gbWVyZ2UgaW4uCisgICAgICovCisgICAgZXh0ZW5kKGRlZXA6IGJvb2xlYW4sIHRhcmdldDogYW55LCBvYmplY3QxPzogYW55LCAuLi5vYmplY3ROOiBhbnlbXSk6IGFueTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgc29tZSBKYXZhU2NyaXB0IGNvZGUgZ2xvYmFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZSBUaGUgSmF2YVNjcmlwdCBjb2RlIHRvIGV4ZWN1dGUuCisgICAgICovCisgICAgZ2xvYmFsRXZhbChjb2RlOiBzdHJpbmcpOiBhbnk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgd2hpY2ggc2F0aXNmeSBhIGZpbHRlciBmdW5jdGlvbi4gVGhlIG9yaWdpbmFsIGFycmF5IGlzIG5vdCBhZmZlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoIHRocm91Z2guCisgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgZWFjaCBpdGVtIGFnYWluc3QuIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24gaXMgdGhlIGl0ZW0sIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBpbmRleC4gVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBCb29sZWFuIHZhbHVlLiAgdGhpcyB3aWxsIGJlIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gaW52ZXJ0IElmICJpbnZlcnQiIGlzIGZhbHNlLCBvciBub3QgcHJvdmlkZWQsIHRoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gYXJyYXkgY29uc2lzdGluZyBvZiBhbGwgZWxlbWVudHMgZm9yIHdoaWNoICJjYWxsYmFjayIgcmV0dXJucyB0cnVlLiBJZiAiaW52ZXJ0IiBpcyB0cnVlLCB0aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIGZvciB3aGljaCAiY2FsbGJhY2siIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgZ3JlcDxUPihhcnJheTogVFtdLCBmdW5jOiAoZWxlbWVudE9mQXJyYXk6IFQsIGluZGV4SW5BcnJheTogbnVtYmVyKSA9PiBib29sZWFuLCBpbnZlcnQ/OiBib29sZWFuKTogVFtdOworCisgICAgLyoqCisgICAgICogU2VhcmNoIGZvciBhIHNwZWNpZmllZCB2YWx1ZSB3aXRoaW4gYW4gYXJyYXkgYW5kIHJldHVybiBpdHMgaW5kZXggKG9yIC0xIGlmIG5vdCBmb3VuZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICogQHBhcmFtIGFycmF5IEFuIGFycmF5IHRocm91Z2ggd2hpY2ggdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbSBmcm9tSW5kZXggaGUgaW5kZXggb2YgdGhlIGFycmF5IGF0IHdoaWNoIHRvIGJlZ2luIHRoZSBzZWFyY2guIFRoZSBkZWZhdWx0IGlzIDAsIHdoaWNoIHdpbGwgc2VhcmNoIHRoZSB3aG9sZSBhcnJheS4KKyAgICAgKi8KKyAgICBpbkFycmF5PFQ+KHZhbHVlOiBULCBhcnJheTogVFtdLCBmcm9tSW5kZXg/OiBudW1iZXIpOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGl0IGlzIGFuIGFycmF5LgorICAgICAqLworICAgIGlzQXJyYXkob2JqOiBhbnkpOiBib29sZWFuOworICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhbiBvYmplY3QgaXMgZW1wdHkgKGNvbnRhaW5zIG5vIGVudW1lcmFibGUgcHJvcGVydGllcykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZW1wdHkuCisgICAgICovCisgICAgaXNFbXB0eU9iamVjdChvYmo6IGFueSk6IGJvb2xlYW47CisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBwYXNzZWQgaXMgYSBKYXZhc2NyaXB0IGZ1bmN0aW9uIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHRlc3Qgd2hldGhlciBvciBub3QgaXQgaXMgYSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBpc0Z1bmN0aW9uKG9iajogYW55KTogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgaXRzIGFyZ3VtZW50IGlzIGEgbnVtYmVyLgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkLgorICAgICAqLworICAgIGlzTnVtZXJpYyh2YWx1ZTogYW55KTogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYW4gb2JqZWN0IGlzIGEgcGxhaW4gb2JqZWN0IChjcmVhdGVkIHVzaW5nICJ7fSIgb3IgIm5ldyBPYmplY3QiKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBhIHBsYWluIG9iamVjdC4KKyAgICAgKi8KKyAgICBpc1BsYWluT2JqZWN0KG9iajogYW55KTogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGl0IGlzIGEgd2luZG93LgorICAgICAqLworICAgIGlzV2luZG93KG9iajogYW55KTogYm9vbGVhbjsKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBET00gbm9kZSBpcyB3aXRoaW4gYW4gWE1MIGRvY3VtZW50IChvciBpcyBhbiBYTUwgZG9jdW1lbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgaGUgRE9NIG5vZGUgdGhhdCB3aWxsIGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgaW4gYW4gWE1MIGRvY3VtZW50LgorICAgICAqLworICAgIGlzWE1MRG9jKG5vZGU6IE5vZGUpOiBib29sZWFuOworCisgICAgLyoqCisgICAgICogQ29udmVydCBhbiBhcnJheS1saWtlIG9iamVjdCBpbnRvIGEgdHJ1ZSBKYXZhU2NyaXB0IGFycmF5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogQW55IG9iamVjdCB0byB0dXJuIGludG8gYSBuYXRpdmUgQXJyYXkuCisgICAgICovCisgICAgbWFrZUFycmF5KG9iajogYW55KTogYW55W107CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgYWxsIGl0ZW1zIGluIGFuIGFycmF5IG9yIG9iamVjdCB0byBuZXcgYXJyYXkgb2YgaXRlbXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFycmF5IFRoZSBBcnJheSB0byB0cmFuc2xhdGUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggaXRlbSBhZ2FpbnN0LiBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGlzIHRoZSBhcnJheSBpdGVtLCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBpbmRleCBpbiBhcnJheSBUaGUgZnVuY3Rpb24gY2FuIHJldHVybiBhbnkgdmFsdWUuIFdpdGhpbiB0aGUgZnVuY3Rpb24sIHRoaXMgcmVmZXJzIHRvIHRoZSBnbG9iYWwgKHdpbmRvdykgb2JqZWN0LgorICAgICAqLworICAgIG1hcDxULCBVPihhcnJheTogVFtdLCBjYWxsYmFjazogKGVsZW1lbnRPZkFycmF5OiBULCBpbmRleEluQXJyYXk6IG51bWJlcikgPT4gVSk6IFVbXTsKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgYWxsIGl0ZW1zIGluIGFuIGFycmF5IG9yIG9iamVjdCB0byBuZXcgYXJyYXkgb2YgaXRlbXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFycmF5T3JPYmplY3QgVGhlIEFycmF5IG9yIE9iamVjdCB0byB0cmFuc2xhdGUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggaXRlbSBhZ2FpbnN0LiBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGlzIHRoZSB2YWx1ZTsgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgaW5kZXggb3Iga2V5IG9mIHRoZSBhcnJheSBvciBvYmplY3QgcHJvcGVydHkuIFRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGFueSB2YWx1ZSB0byBhZGQgdG8gdGhlIGFycmF5LiBBIHJldHVybmVkIGFycmF5IHdpbGwgYmUgZmxhdHRlbmVkIGludG8gdGhlIHJlc3VsdGluZyBhcnJheS4gV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhpcyByZWZlcnMgdG8gdGhlIGdsb2JhbCAod2luZG93KSBvYmplY3QuCisgICAgICovCisgICAgbWFwKGFycmF5T3JPYmplY3Q6IGFueSwgY2FsbGJhY2s6ICh2YWx1ZTogYW55LCBpbmRleE9yS2V5OiBhbnkpID0+IGFueSk6IGFueTsKKworICAgIC8qKgorICAgICAqIE1lcmdlIHRoZSBjb250ZW50cyBvZiB0d28gYXJyYXlzIHRvZ2V0aGVyIGludG8gdGhlIGZpcnN0IGFycmF5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgYXJyYXkgdG8gbWVyZ2UsIHRoZSBlbGVtZW50cyBvZiBzZWNvbmQgYWRkZWQuCisgICAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIGFycmF5IHRvIG1lcmdlIGludG8gdGhlIGZpcnN0LCB1bmFsdGVyZWQuCisgICAgICovCisgICAgbWVyZ2U8VD4oZmlyc3Q6IFRbXSwgc2Vjb25kOiBUW10pOiBUW107CisKKyAgICAvKioKKyAgICAgKiBBbiBlbXB0eSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBub29wKCk6IGFueTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG51bWJlciByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgKi8KKyAgICBub3coKTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogVGFrZXMgYSB3ZWxsLWZvcm1lZCBKU09OIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIEphdmFTY3JpcHQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBqc29uIFRoZSBKU09OIHN0cmluZyB0byBwYXJzZS4KKyAgICAgKi8KKyAgICBwYXJzZUpTT04oanNvbjogc3RyaW5nKTogYW55OworCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgc3RyaW5nIGludG8gYW4gWE1MIGRvY3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgYSB3ZWxsLWZvcm1lZCBYTUwgc3RyaW5nIHRvIGJlIHBhcnNlZAorICAgICAqLworICAgIHBhcnNlWE1MKGRhdGE6IHN0cmluZyk6IFhNTERvY3VtZW50OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIgUmVtb3ZlIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nLgorICAgICAqLworICAgIHRyaW0oc3RyOiBzdHJpbmcpOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIGludGVybmFsIEphdmFTY3JpcHQgW1tDbGFzc11dIG9mIGFuIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byBnZXQgdGhlIGludGVybmFsIEphdmFTY3JpcHQgW1tDbGFzc11dIG9mLgorICAgICAqLworICAgIHR5cGUob2JqOiBhbnkpOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBTb3J0cyBhbiBhcnJheSBvZiBET00gZWxlbWVudHMsIGluIHBsYWNlLCB3aXRoIHRoZSBkdXBsaWNhdGVzIHJlbW92ZWQuIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgb24gYXJyYXlzIG9mIERPTSBlbGVtZW50cywgbm90IHN0cmluZ3Mgb3IgbnVtYmVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIEFycmF5IG9mIERPTSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICB1bmlxdWUoYXJyYXk6IEVsZW1lbnRbXSk6IEVsZW1lbnRbXTsKKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIERPTSBub2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIEhUTUwgc3RyaW5nIHRvIGJlIHBhcnNlZAorICAgICAqIEBwYXJhbSBjb250ZXh0IERPTSBlbGVtZW50IHRvIHNlcnZlIGFzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBIVE1MIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBrZWVwU2NyaXB0cyBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIEhUTUwgc3RyaW5nCisgICAgICovCisgICAgcGFyc2VIVE1MKGRhdGE6IHN0cmluZywgY29udGV4dD86IEhUTUxFbGVtZW50LCBrZWVwU2NyaXB0cz86IGJvb2xlYW4pOiBhbnlbXTsKKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIERPTSBub2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIEhUTUwgc3RyaW5nIHRvIGJlIHBhcnNlZAorICAgICAqIEBwYXJhbSBjb250ZXh0IERPTSBlbGVtZW50IHRvIHNlcnZlIGFzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBIVE1MIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBrZWVwU2NyaXB0cyBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIEhUTUwgc3RyaW5nCisgICAgICovCisgICAgcGFyc2VIVE1MKGRhdGE6IHN0cmluZywgY29udGV4dD86IERvY3VtZW50LCBrZWVwU2NyaXB0cz86IGJvb2xlYW4pOiBhbnlbXTsKK30KKworLyoqCisgKiBUaGUgalF1ZXJ5IGluc3RhbmNlIG1lbWJlcnMKKyAqLworaW50ZXJmYWNlIEpRdWVyeSB7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIEFqYXggcmVxdWVzdHMgY29tcGxldGUuIFRoaXMgaXMgYW4gQWpheEV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQuCisgICAgICovCisgICAgYWpheENvbXBsZXRlKGhhbmRsZXI6IChldmVudDogSlF1ZXJ5RXZlbnRPYmplY3QsIFhNTEh0dHBSZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCwgYWpheE9wdGlvbnM6IGFueSkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBBamF4IHJlcXVlc3RzIGNvbXBsZXRlIHdpdGggYW4gZXJyb3IuIFRoaXMgaXMgYW4gQWpheCBFdmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkLgorICAgICAqLworICAgIGFqYXhFcnJvcihoYW5kbGVyOiAoZXZlbnQ6IEpRdWVyeUV2ZW50T2JqZWN0LCBqcVhIUjogSlF1ZXJ5WEhSLCBhamF4U2V0dGluZ3M6IEpRdWVyeUFqYXhTZXR0aW5ncywgdGhyb3duRXJyb3I6IGFueSkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSBhbiBBamF4IHJlcXVlc3QgaXMgc2VudC4gVGhpcyBpcyBhbiBBamF4IEV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQuCisgICAgICovCisgICAgYWpheFNlbmQoaGFuZGxlcjogKGV2ZW50OiBKUXVlcnlFdmVudE9iamVjdCwganFYSFI6IEpRdWVyeVhIUiwgYWpheE9wdGlvbnM6IEpRdWVyeUFqYXhTZXR0aW5ncykgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmlyc3QgQWpheCByZXF1ZXN0IGJlZ2lucy4gVGhpcyBpcyBhbiBBamF4IEV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQuCisgICAgICovCisgICAgYWpheFN0YXJ0KGhhbmRsZXI6ICgpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gYWxsIEFqYXggcmVxdWVzdHMgaGF2ZSBjb21wbGV0ZWQuIFRoaXMgaXMgYW4gQWpheCBFdmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkLgorICAgICAqLworICAgIGFqYXhTdG9wKGhhbmRsZXI6ICgpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuZXZlciBhbiBBamF4IHJlcXVlc3QgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4gVGhpcyBpcyBhbiBBamF4IEV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQuCisgICAgICovCisgICAgYWpheFN1Y2Nlc3MoaGFuZGxlcjogKGV2ZW50OiBKUXVlcnlFdmVudE9iamVjdCwgWE1MSHR0cFJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0LCBhamF4T3B0aW9uczogSlF1ZXJ5QWpheFNldHRpbmdzKSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGRhdGEgZnJvbSB0aGUgc2VydmVyIGFuZCBwbGFjZSB0aGUgcmV0dXJuZWQgSFRNTCBpbnRvIHRoZSBtYXRjaGVkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBzZW50LgorICAgICAqIEBwYXJhbSBkYXRhIEEgcGxhaW4gb2JqZWN0IG9yIHN0cmluZyB0aGF0IGlzIHNlbnQgdG8gdGhlIHNlcnZlciB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSBjb21wbGV0ZSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgcmVxdWVzdCBjb21wbGV0ZXMuCisgICAgICovCisgICAgbG9hZCh1cmw6IHN0cmluZywgZGF0YT86IHN0cmluZ3xPYmplY3QsIGNvbXBsZXRlPzogKHJlc3BvbnNlVGV4dDogc3RyaW5nLCB0ZXh0U3RhdHVzOiBzdHJpbmcsIFhNTEh0dHBSZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogRW5jb2RlIGEgc2V0IG9mIGZvcm0gZWxlbWVudHMgYXMgYSBzdHJpbmcgZm9yIHN1Ym1pc3Npb24uCisgICAgICovCisgICAgc2VyaWFsaXplKCk6IHN0cmluZzsKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgYSBzZXQgb2YgZm9ybSBlbGVtZW50cyBhcyBhbiBhcnJheSBvZiBuYW1lcyBhbmQgdmFsdWVzLgorICAgICAqLworICAgIHNlcmlhbGl6ZUFycmF5KCk6IEpRdWVyeVNlcmlhbGl6ZUFycmF5RWxlbWVudFtdOworCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGNsYXNzKGVzKSB0byBlYWNoIG9mIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgT25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIGNsYXNzZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNsYXNzIGF0dHJpYnV0ZSBvZiBlYWNoIG1hdGNoZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBhZGRDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgY2xhc3MoZXMpIHRvIGVhY2ggb2YgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGZ1bmN0aW9uIEEgZnVuY3Rpb24gcmV0dXJuaW5nIG9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBjbGFzcyBuYW1lcyB0byBiZSBhZGRlZCB0byB0aGUgZXhpc3RpbmcgY2xhc3MgbmFtZShzKS4gUmVjZWl2ZXMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXQgYW5kIHRoZSBleGlzdGluZyBjbGFzcyBuYW1lKHMpIGFzIGFyZ3VtZW50cy4gV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhpcyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgc2V0LgorICAgICAqLworICAgIGFkZENsYXNzKGZ1bmM6IChpbmRleDogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZykgPT4gc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBwcmV2aW91cyBzZXQgb2YgZWxlbWVudHMgb24gdGhlIHN0YWNrIHRvIHRoZSBjdXJyZW50IHNldCwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhIHNlbGVjdG9yLgorICAgICAqLworICAgIGFkZEJhY2soc2VsZWN0b3I/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBnZXQuCisgICAgICovCisgICAgYXR0cihhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpOiBzdHJpbmc7CisgICAgLyoqCisgICAgICogU2V0IG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgZm9yIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0LgorICAgICAqIEBwYXJhbSB2YWx1ZSBBIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBhdHRyKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZ3xudW1iZXIpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogU2V0IG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgZm9yIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0LgorICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB2YWx1ZSB0byBzZXQuIHRoaXMgaXMgdGhlIGN1cnJlbnQgZWxlbWVudC4gUmVjZWl2ZXMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXQgYW5kIHRoZSBvbGQgYXR0cmlidXRlIHZhbHVlIGFzIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBhdHRyKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgZnVuYzogKGluZGV4OiBudW1iZXIsIGF0dHI6IHN0cmluZykgPT4gc3RyaW5nfG51bWJlcik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTZXQgb25lIG9yIG1vcmUgYXR0cmlidXRlcyBmb3IgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgQW4gb2JqZWN0IG9mIGF0dHJpYnV0ZS12YWx1ZSBwYWlycyB0byBzZXQuCisgICAgICovCisgICAgYXR0cihhdHRyaWJ1dGVzOiBPYmplY3QpOiBKUXVlcnk7CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnRzIGFyZSBhc3NpZ25lZCB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIHRvIHNlYXJjaCBmb3IuCisgICAgICovCisgICAgaGFzQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBIVE1MIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBodG1sKCk6IHN0cmluZzsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEhUTUwgY29udGVudHMgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBodG1sU3RyaW5nIEEgc3RyaW5nIG9mIEhUTUwgdG8gc2V0IGFzIHRoZSBjb250ZW50IG9mIGVhY2ggbWF0Y2hlZCBlbGVtZW50LgorICAgICAqLworICAgIGh0bWwoaHRtbFN0cmluZzogc3RyaW5nKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFNldCB0aGUgSFRNTCBjb250ZW50cyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGZ1bmMgQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIEhUTUwgY29udGVudCB0byBzZXQuIFJlY2VpdmVzIHRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2V0IGFuZCB0aGUgb2xkIEhUTUwgdmFsdWUgYXMgYXJndW1lbnRzLiBqUXVlcnkgZW1wdGllcyB0aGUgZWxlbWVudCBiZWZvcmUgY2FsbGluZyB0aGUgZnVuY3Rpb247IHVzZSB0aGUgb2xkaHRtbCBhcmd1bWVudCB0byByZWZlcmVuY2UgdGhlIHByZXZpb3VzIGNvbnRlbnQuIFdpdGhpbiB0aGUgZnVuY3Rpb24sIHRoaXMgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIHNldC4KKyAgICAgKi8KKyAgICBodG1sKGZ1bmM6IChpbmRleDogbnVtYmVyLCBvbGRodG1sOiBzdHJpbmcpID0+IHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEhUTUwgY29udGVudHMgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBIVE1MIGNvbnRlbnQgdG8gc2V0LiBSZWNlaXZlcyB0aGUgaW5kZXggcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHNldCBhbmQgdGhlIG9sZCBIVE1MIHZhbHVlIGFzIGFyZ3VtZW50cy4galF1ZXJ5IGVtcHRpZXMgdGhlIGVsZW1lbnQgYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uOyB1c2UgdGhlIG9sZGh0bWwgYXJndW1lbnQgdG8gcmVmZXJlbmNlIHRoZSBwcmV2aW91cyBjb250ZW50LiBXaXRoaW4gdGhlIGZ1bmN0aW9uLCB0aGlzIHJlZmVycyB0byB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBzZXQuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KKyAgICAgKi8KKyAgICBwcm9wKHByb3BlcnR5TmFtZTogc3RyaW5nKTogYW55OworICAgIC8qKgorICAgICAqIFNldCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCisgICAgICogQHBhcmFtIHZhbHVlIEEgdmFsdWUgdG8gc2V0IGZvciB0aGUgcHJvcGVydHkuCisgICAgICovCisgICAgcHJvcChwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTZXQgb25lIG9yIG1vcmUgcHJvcGVydGllcyBmb3IgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IG9mIHByb3BlcnR5LXZhbHVlIHBhaXJzIHRvIHNldC4KKyAgICAgKi8KKyAgICBwcm9wKHByb3BlcnRpZXM6IE9iamVjdCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTZXQgb25lIG9yIG1vcmUgcHJvcGVydGllcyBmb3IgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgorICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB2YWx1ZSB0byBzZXQuIFJlY2VpdmVzIHRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2V0IGFuZCB0aGUgb2xkIHByb3BlcnR5IHZhbHVlIGFzIGFyZ3VtZW50cy4gV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhlIGtleXdvcmQgdGhpcyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcm9wKHByb3BlcnR5TmFtZTogc3RyaW5nLCBmdW5jOiAoaW5kZXg6IG51bWJlciwgb2xkUHJvcGVydHlWYWx1ZTogYW55KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gYXR0cmlidXRlIGZyb20gZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIEFuIGF0dHJpYnV0ZSB0byByZW1vdmU7IGFzIG9mIHZlcnNpb24gMS43LCBpdCBjYW4gYmUgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHJlbW92ZUF0dHIoYXR0cmlidXRlTmFtZTogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgc2luZ2xlIGNsYXNzLCBtdWx0aXBsZSBjbGFzc2VzLCBvciBhbGwgY2xhc3NlcyBmcm9tIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIE9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBjbGFzc2VzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2xhc3MgYXR0cmlidXRlIG9mIGVhY2ggbWF0Y2hlZCBlbGVtZW50LgorICAgICAqLworICAgIHJlbW92ZUNsYXNzKGNsYXNzTmFtZT86IHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzaW5nbGUgY2xhc3MsIG11bHRpcGxlIGNsYXNzZXMsIG9yIGFsbCBjbGFzc2VzIGZyb20gZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmdW5jdGlvbiBBIGZ1bmN0aW9uIHJldHVybmluZyBvbmUgb3IgbW9yZSBzcGFjZS1zZXBhcmF0ZWQgY2xhc3MgbmFtZXMgdG8gYmUgcmVtb3ZlZC4gUmVjZWl2ZXMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXQgYW5kIHRoZSBvbGQgY2xhc3MgdmFsdWUgYXMgYXJndW1lbnRzLgorICAgICAqLworICAgIHJlbW92ZUNsYXNzKGZ1bmM6IChpbmRleDogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZykgPT4gc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgZm9yIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJlbW92ZS4KKyAgICAgKi8KKyAgICByZW1vdmVQcm9wKHByb3BlcnR5TmFtZTogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQWRkIG9yIHJlbW92ZSBvbmUgb3IgbW9yZSBjbGFzc2VzIGZyb20gZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgZGVwZW5kaW5nIG9uIGVpdGhlciB0aGUgY2xhc3MncyBwcmVzZW5jZSBvciB0aGUgdmFsdWUgb2YgdGhlIHN3aXRjaCBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgT25lIG9yIG1vcmUgY2xhc3MgbmFtZXMgKHNlcGFyYXRlZCBieSBzcGFjZXMpIHRvIGJlIHRvZ2dsZWQgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCisgICAgICogQHBhcmFtIHN3dGNoIEEgQm9vbGVhbiAobm90IGp1c3QgdHJ1dGh5L2ZhbHN5KSB2YWx1ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY2xhc3Mgc2hvdWxkIGJlIGFkZGVkIG9yIHJlbW92ZWQuCisgICAgICovCisgICAgdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHN3dGNoPzogYm9vbGVhbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBZGQgb3IgcmVtb3ZlIG9uZSBvciBtb3JlIGNsYXNzZXMgZnJvbSBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCBkZXBlbmRpbmcgb24gZWl0aGVyIHRoZSBjbGFzcydzIHByZXNlbmNlIG9yIHRoZSB2YWx1ZSBvZiB0aGUgc3dpdGNoIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN3dGNoIEEgYm9vbGVhbiB2YWx1ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY2xhc3Mgc2hvdWxkIGJlIGFkZGVkIG9yIHJlbW92ZWQuCisgICAgICovCisgICAgdG9nZ2xlQ2xhc3Moc3d0Y2g/OiBib29sZWFuKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEFkZCBvciByZW1vdmUgb25lIG9yIG1vcmUgY2xhc3NlcyBmcm9tIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIGRlcGVuZGluZyBvbiBlaXRoZXIgdGhlIGNsYXNzJ3MgcHJlc2VuY2Ugb3IgdGhlIHZhbHVlIG9mIHRoZSBzd2l0Y2ggYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVuYyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjbGFzcyBuYW1lcyB0byBiZSB0b2dnbGVkIGluIHRoZSBjbGFzcyBhdHRyaWJ1dGUgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4gUmVjZWl2ZXMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXQsIHRoZSBvbGQgY2xhc3MgdmFsdWUsIGFuZCB0aGUgc3dpdGNoIGFzIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gc3d0Y2ggQSBib29sZWFuIHZhbHVlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjbGFzcyBzaG91bGQgYmUgYWRkZWQgb3IgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICB0b2dnbGVDbGFzcyhmdW5jOiAoaW5kZXg6IG51bWJlciwgY2xhc3NOYW1lOiBzdHJpbmcsIHN3dGNoOiBib29sZWFuKSA9PiBzdHJpbmcsIHN3dGNoPzogYm9vbGVhbik6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICovCisgICAgdmFsKCk6IGFueTsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgQSBzdHJpbmcgb2YgdGV4dCBvciBhbiBhcnJheSBvZiBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhbHVlIG9mIGVhY2ggbWF0Y2hlZCBlbGVtZW50IHRvIHNldCBhcyBzZWxlY3RlZC9jaGVja2VkLgorICAgICAqLworICAgIHZhbCh2YWx1ZTogc3RyaW5nfHN0cmluZ1tdKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB2YWx1ZSB0byBzZXQuIHRoaXMgaXMgdGhlIGN1cnJlbnQgZWxlbWVudC4gUmVjZWl2ZXMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXQgYW5kIHRoZSBvbGQgdmFsdWUgYXMgYXJndW1lbnRzLgorICAgICAqLworICAgIHZhbChmdW5jOiAoaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZykgPT4gc3RyaW5nKTogSlF1ZXJ5OworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHN0eWxlIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgQSBDU1MgcHJvcGVydHkuCisgICAgICovCisgICAgY3NzKHByb3BlcnR5TmFtZTogc3RyaW5nKTogc3RyaW5nOworICAgIC8qKgorICAgICAqIFNldCBvbmUgb3IgbW9yZSBDU1MgcHJvcGVydGllcyBmb3IgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBBIENTUyBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZSBBIHZhbHVlIHRvIHNldCBmb3IgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIGNzcyhwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZ3xudW1iZXIpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogU2V0IG9uZSBvciBtb3JlIENTUyBwcm9wZXJ0aWVzIGZvciB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIEEgQ1NTIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIHZhbHVlIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB2YWx1ZSB0byBzZXQuIHRoaXMgaXMgdGhlIGN1cnJlbnQgZWxlbWVudC4gUmVjZWl2ZXMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXQgYW5kIHRoZSBvbGQgdmFsdWUgYXMgYXJndW1lbnRzLgorICAgICAqLworICAgIGNzcyhwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IChpbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKSA9PiBzdHJpbmd8bnVtYmVyKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFNldCBvbmUgb3IgbW9yZSBDU1MgcHJvcGVydGllcyBmb3IgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb2JqZWN0IG9mIHByb3BlcnR5LXZhbHVlIHBhaXJzIHRvIHNldC4KKyAgICAgKi8KKyAgICBjc3MocHJvcGVydGllczogT2JqZWN0KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGNvbXB1dGVkIGhlaWdodCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqLworICAgIGhlaWdodCgpOiBudW1iZXI7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBDU1MgaGVpZ2h0IG9mIGV2ZXJ5IG1hdGNoZWQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBBbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIHBpeGVscywgb3IgYW4gaW50ZWdlciB3aXRoIGFuIG9wdGlvbmFsIHVuaXQgb2YgbWVhc3VyZSBhcHBlbmRlZCAoYXMgYSBzdHJpbmcpLgorICAgICAqLworICAgIGhlaWdodCh2YWx1ZTogbnVtYmVyfHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENTUyBoZWlnaHQgb2YgZXZlcnkgbWF0Y2hlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZ1bmMgQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCB0byBzZXQuIFJlY2VpdmVzIHRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2V0IGFuZCB0aGUgb2xkIGhlaWdodCBhcyBhcmd1bWVudHMuIFdpdGhpbiB0aGUgZnVuY3Rpb24sIHRoaXMgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIHNldC4KKyAgICAgKi8KKyAgICBoZWlnaHQoZnVuYzogKGluZGV4OiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiBudW1iZXJ8c3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGNvbXB1dGVkIGhlaWdodCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCBpbmNsdWRpbmcgcGFkZGluZyBidXQgbm90IGJvcmRlci4KKyAgICAgKi8KKyAgICBpbm5lckhlaWdodCgpOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbm5lciBoZWlnaHQgb24gZWxlbWVudHMgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCBpbmNsdWRpbmcgcGFkZGluZyBidXQgbm90IGJvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBBbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIHBpeGVscywgb3IgYW4gaW50ZWdlciBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIHVuaXQgb2YgbWVhc3VyZSBhcHBlbmRlZCAoYXMgYSBzdHJpbmcpLgorICAgICAqLworICAgIGlubmVySGVpZ2h0KGhlaWdodDogbnVtYmVyfHN0cmluZyk6IEpRdWVyeTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29tcHV0ZWQgd2lkdGggZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgaW5jbHVkaW5nIHBhZGRpbmcgYnV0IG5vdCBib3JkZXIuCisgICAgICovCisgICAgaW5uZXJXaWR0aCgpOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbm5lciB3aWR0aCBvbiBlbGVtZW50cyBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIGluY2x1ZGluZyBwYWRkaW5nIGJ1dCBub3QgYm9yZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIEFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgcGl4ZWxzLCBvciBhbiBpbnRlZ2VyIGFsb25nIHdpdGggYW4gb3B0aW9uYWwgdW5pdCBvZiBtZWFzdXJlIGFwcGVuZGVkIChhcyBhIHN0cmluZykuCisgICAgICovCisgICAgaW5uZXJXaWR0aCh3aWR0aDogbnVtYmVyfHN0cmluZyk6IEpRdWVyeTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQuCisgICAgICovCisgICAgb2Zmc2V0KCk6IEpRdWVyeUNvb3JkaW5hdGVzOworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvcCBhbmQgbGVmdCwgd2hpY2ggYXJlIGludGVnZXJzIGluZGljYXRpbmcgdGhlIG5ldyB0b3AgYW5kIGxlZnQgY29vcmRpbmF0ZXMgZm9yIHRoZSBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29yZGluYXRlcyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyB0b3AgYW5kIGxlZnQsIHdoaWNoIGFyZSBpbnRlZ2VycyBpbmRpY2F0aW5nIHRoZSBuZXcgdG9wIGFuZCBsZWZ0IGNvb3JkaW5hdGVzIGZvciB0aGUgZWxlbWVudHMuCisgICAgICovCisgICAgb2Zmc2V0KGNvb3JkaW5hdGVzOiBKUXVlcnlDb29yZGluYXRlcyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyB0b3AgYW5kIGxlZnQsIHdoaWNoIGFyZSBpbnRlZ2VycyBpbmRpY2F0aW5nIHRoZSBuZXcgdG9wIGFuZCBsZWZ0IGNvb3JkaW5hdGVzIGZvciB0aGUgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVuYyBBIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgY29vcmRpbmF0ZXMgdG8gc2V0LiBSZWNlaXZlcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB0aGUgY3VycmVudCBjb29yZGluYXRlcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2l0aCB0aGUgbmV3IHRvcCBhbmQgbGVmdCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIG9mZnNldChmdW5jOiAoaW5kZXg6IG51bWJlciwgY29vcmRzOiBKUXVlcnlDb29yZGluYXRlcykgPT4gSlF1ZXJ5Q29vcmRpbmF0ZXMpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29tcHV0ZWQgaGVpZ2h0IGZvciB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIGluY2x1ZGluZyBwYWRkaW5nLCBib3JkZXIsIGFuZCBvcHRpb25hbGx5IG1hcmdpbi4gUmV0dXJucyBhbiBpbnRlZ2VyICh3aXRob3V0ICJweCIpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvciBudWxsIGlmIGNhbGxlZCBvbiBhbiBlbXB0eSBzZXQgb2YgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZU1hcmdpbiBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVsZW1lbnQncyBtYXJnaW4gaW4gdGhlIGNhbGN1bGF0aW9uLgorICAgICAqLworICAgIG91dGVySGVpZ2h0KGluY2x1ZGVNYXJnaW4/OiBib29sZWFuKTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3V0ZXIgaGVpZ2h0IG9uIGVsZW1lbnRzIGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgaW5jbHVkaW5nIHBhZGRpbmcgYW5kIGJvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBBbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIHBpeGVscywgb3IgYW4gaW50ZWdlciBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIHVuaXQgb2YgbWVhc3VyZSBhcHBlbmRlZCAoYXMgYSBzdHJpbmcpLgorICAgICAqLworICAgIG91dGVySGVpZ2h0KGhlaWdodDogbnVtYmVyfHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBjb21wdXRlZCB3aWR0aCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCBpbmNsdWRpbmcgcGFkZGluZyBhbmQgYm9yZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVNYXJnaW4gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBpbmNsdWRlIHRoZSBlbGVtZW50J3MgbWFyZ2luIGluIHRoZSBjYWxjdWxhdGlvbi4KKyAgICAgKi8KKyAgICBvdXRlcldpZHRoKGluY2x1ZGVNYXJnaW4/OiBib29sZWFuKTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3V0ZXIgd2lkdGggb24gZWxlbWVudHMgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCBpbmNsdWRpbmcgcGFkZGluZyBhbmQgYm9yZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIEFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgcGl4ZWxzLCBvciBhbiBpbnRlZ2VyIGFsb25nIHdpdGggYW4gb3B0aW9uYWwgdW5pdCBvZiBtZWFzdXJlIGFwcGVuZGVkIChhcyBhIHN0cmluZykuCisgICAgICovCisgICAgb3V0ZXJXaWR0aCh3aWR0aDogbnVtYmVyfHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXQgcGFyZW50LgorICAgICAqLworICAgIHBvc2l0aW9uKCk6IEpRdWVyeUNvb3JkaW5hdGVzOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHNjcm9sbCBiYXIgZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyBvciBzZXQgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHNjcm9sbCBiYXIgZm9yIGV2ZXJ5IG1hdGNoZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBzY3JvbGxMZWZ0KCk6IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgc2Nyb2xsIGJhciBmb3IgZWFjaCBvZiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgcG9zaXRpb24gdG8gc2V0IHRoZSBzY3JvbGwgYmFyIHRvLgorICAgICAqLworICAgIHNjcm9sbExlZnQodmFsdWU6IG51bWJlcik6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgc2Nyb2xsIGJhciBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIG9yIHNldCB0aGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHNjcm9sbCBiYXIgZm9yIGV2ZXJ5IG1hdGNoZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBzY3JvbGxUb3AoKTogbnVtYmVyOworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgc2Nyb2xsIGJhciBmb3IgZWFjaCBvZiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgcG9zaXRpb24gdG8gc2V0IHRoZSBzY3JvbGwgYmFyIHRvLgorICAgICAqLworICAgIHNjcm9sbFRvcCh2YWx1ZTogbnVtYmVyKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGNvbXB1dGVkIHdpZHRoIGZvciB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICovCisgICAgd2lkdGgoKTogbnVtYmVyOworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ1NTIHdpZHRoIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBwaXhlbHMsIG9yIGFuIGludGVnZXIgYWxvbmcgd2l0aCBhbiBvcHRpb25hbCB1bml0IG9mIG1lYXN1cmUgYXBwZW5kZWQgKGFzIGEgc3RyaW5nKS4KKyAgICAgKi8KKyAgICB3aWR0aCh2YWx1ZTogbnVtYmVyfHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENTUyB3aWR0aCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGZ1bmMgQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIHRvIHNldC4gUmVjZWl2ZXMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXQgYW5kIHRoZSBvbGQgd2lkdGggYXMgYXJndW1lbnRzLiBXaXRoaW4gdGhlIGZ1bmN0aW9uLCB0aGlzIHJlZmVycyB0byB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBzZXQuCisgICAgICovCisgICAgd2lkdGgoZnVuYzogKGluZGV4OiBudW1iZXIsIHdpZHRoOiBudW1iZXIpID0+IG51bWJlcnxzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZnJvbSB0aGUgcXVldWUgYWxsIGl0ZW1zIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gcnVuLgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXVlTmFtZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBxdWV1ZS4gRGVmYXVsdHMgdG8gZngsIHRoZSBzdGFuZGFyZCBlZmZlY3RzIHF1ZXVlLgorICAgICAqLworICAgIGNsZWFyUXVldWUocXVldWVOYW1lPzogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogU3RvcmUgYXJiaXRyYXJ5IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBBIHN0cmluZyBuYW1pbmcgdGhlIHBpZWNlIG9mIGRhdGEgdG8gc2V0LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGRhdGEgdmFsdWU7IGl0IGNhbiBiZSBhbnkgSmF2YXNjcmlwdCB0eXBlIGluY2x1ZGluZyBBcnJheSBvciBPYmplY3QuCisgICAgICovCisgICAgZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTdG9yZSBhcmJpdHJhcnkgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIEFuIG9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgb2YgZGF0YSB0byB1cGRhdGUuCisgICAgICovCisgICAgZGF0YShvYmo6IHsgW2tleTogc3RyaW5nXTogYW55OyB9KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgYXQgdGhlIG5hbWVkIGRhdGEgc3RvcmUgZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBqUXVlcnkgY29sbGVjdGlvbiwgYXMgc2V0IGJ5IGRhdGEobmFtZSwgdmFsdWUpIG9yIGJ5IGFuIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IE5hbWUgb2YgdGhlIGRhdGEgc3RvcmVkLgorICAgICAqLworICAgIGRhdGEoa2V5OiBzdHJpbmcpOiBhbnk7CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgbmFtZWQgZGF0YSBzdG9yZSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGpRdWVyeSBjb2xsZWN0aW9uLCBhcyBzZXQgYnkgZGF0YShuYW1lLCB2YWx1ZSkgb3IgYnkgYW4gSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBkYXRhKCk6IGFueTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIG5leHQgZnVuY3Rpb24gb24gdGhlIHF1ZXVlIGZvciB0aGUgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWV1ZU5hbWUgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgcXVldWUuIERlZmF1bHRzIHRvIGZ4LCB0aGUgc3RhbmRhcmQgZWZmZWN0cyBxdWV1ZS4KKyAgICAgKi8KKyAgICBkZXF1ZXVlKHF1ZXVlTmFtZT86IHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByZXZpb3VzbHktc3RvcmVkIHBpZWNlIG9mIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyBuYW1pbmcgdGhlIHBpZWNlIG9mIGRhdGEgdG8gZGVsZXRlIG9yIHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgbmFtaW5nIHRoZSBwaWVjZXMgb2YgZGF0YSB0byBkZWxldGUuCisgICAgICovCisgICAgcmVtb3ZlRGF0YShuYW1lOiBzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJldmlvdXNseS1zdG9yZWQgcGllY2Ugb2YgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0IEFuIGFycmF5IG9mIHN0cmluZ3MgbmFtaW5nIHRoZSBwaWVjZXMgb2YgZGF0YSB0byBkZWxldGUuCisgICAgICovCisgICAgcmVtb3ZlRGF0YShsaXN0OiBzdHJpbmdbXSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFByb21pc2Ugb2JqZWN0IHRvIG9ic2VydmUgd2hlbiBhbGwgYWN0aW9ucyBvZiBhIGNlcnRhaW4gdHlwZSBib3VuZCB0byB0aGUgY29sbGVjdGlvbiwgcXVldWVkIG9yIG5vdCwgaGF2ZSBmaW5pc2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHF1ZXVlIHRoYXQgbmVlZHMgdG8gYmUgb2JzZXJ2ZWQuIChkZWZhdWx0OiBmeCkKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IE9iamVjdCBvbnRvIHdoaWNoIHRoZSBwcm9taXNlIG1ldGhvZHMgaGF2ZSB0byBiZSBhdHRhY2hlZAorICAgICAqLworICAgIHByb21pc2UodHlwZT86IHN0cmluZywgdGFyZ2V0PzogT2JqZWN0KTogSlF1ZXJ5UHJvbWlzZTxhbnk+OworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIGN1c3RvbSBhbmltYXRpb24gb2YgYSBzZXQgb2YgQ1NTIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBBbiBvYmplY3Qgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBtb3ZlIHRvd2FyZC4KKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gQSBzdHJpbmcgb3IgbnVtYmVyIGRldGVybWluaW5nIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBydW4uCisgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgYW5pbWF0ZShwcm9wZXJ0aWVzOiBPYmplY3QsIGR1cmF0aW9uPzogc3RyaW5nfG51bWJlciwgY29tcGxldGU/OiBGdW5jdGlvbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgY3VzdG9tIGFuaW1hdGlvbiBvZiBhIHNldCBvZiBDU1MgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9iamVjdCBvZiBDU1MgcHJvcGVydGllcyBhbmQgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIG1vdmUgdG93YXJkLgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gZWFzaW5nIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggZWFzaW5nIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHRyYW5zaXRpb24uIChkZWZhdWx0OiBzd2luZykKKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBhbmltYXRlKHByb3BlcnRpZXM6IE9iamVjdCwgZHVyYXRpb24/OiBzdHJpbmd8bnVtYmVyLCBlYXNpbmc/OiBzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIGN1c3RvbSBhbmltYXRpb24gb2YgYSBzZXQgb2YgQ1NTIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBBbiBvYmplY3Qgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIHZhbHVlcyB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBtb3ZlIHRvd2FyZC4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIG1hcCBvZiBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorICAgICAqLworICAgIGFuaW1hdGUocHJvcGVydGllczogT2JqZWN0LCBvcHRpb25zOiBKUXVlcnlBbmltYXRpb25PcHRpb25zKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogU2V0IGEgdGltZXIgdG8gZGVsYXkgZXhlY3V0aW9uIG9mIHN1YnNlcXVlbnQgaXRlbXMgaW4gdGhlIHF1ZXVlLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBleGVjdXRpb24gb2YgdGhlIG5leHQgaXRlbSBpbiB0aGUgcXVldWUuCisgICAgICogQHBhcmFtIHF1ZXVlTmFtZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBxdWV1ZS4gRGVmYXVsdHMgdG8gZngsIHRoZSBzdGFuZGFyZCBlZmZlY3RzIHF1ZXVlLgorICAgICAqLworICAgIGRlbGF5KGR1cmF0aW9uOiBudW1iZXIsIHF1ZXVlTmFtZT86IHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIG1hdGNoZWQgZWxlbWVudHMgYnkgZmFkaW5nIHRoZW0gdG8gb3BhcXVlLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBjb21wbGV0ZSBBIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIGZhZGVJbihkdXJhdGlvbj86IG51bWJlcnxzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgbWF0Y2hlZCBlbGVtZW50cyBieSBmYWRpbmcgdGhlbSB0byBvcGFxdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gQSBzdHJpbmcgb3IgbnVtYmVyIGRldGVybWluaW5nIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBydW4uCisgICAgICogQHBhcmFtIGVhc2luZyBBIHN0cmluZyBpbmRpY2F0aW5nIHdoaWNoIGVhc2luZyBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSB0cmFuc2l0aW9uLgorICAgICAqIEBwYXJhbSBjb21wbGV0ZSBBIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIGZhZGVJbihkdXJhdGlvbj86IG51bWJlcnxzdHJpbmcsIGVhc2luZz86IHN0cmluZywgY29tcGxldGU/OiBGdW5jdGlvbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBtYXRjaGVkIGVsZW1lbnRzIGJ5IGZhZGluZyB0aGVtIHRvIG9wYXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgbWFwIG9mIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAgICovCisgICAgZmFkZUluKG9wdGlvbnM6IEpRdWVyeUFuaW1hdGlvbk9wdGlvbnMpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBIaWRlIHRoZSBtYXRjaGVkIGVsZW1lbnRzIGJ5IGZhZGluZyB0aGVtIHRvIHRyYW5zcGFyZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBjb21wbGV0ZSBBIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIGZhZGVPdXQoZHVyYXRpb24/OiBudW1iZXJ8c3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIG1hdGNoZWQgZWxlbWVudHMgYnkgZmFkaW5nIHRoZW0gdG8gdHJhbnNwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gQSBzdHJpbmcgb3IgbnVtYmVyIGRldGVybWluaW5nIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBydW4uCisgICAgICogQHBhcmFtIGVhc2luZyBBIHN0cmluZyBpbmRpY2F0aW5nIHdoaWNoIGVhc2luZyBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSB0cmFuc2l0aW9uLgorICAgICAqIEBwYXJhbSBjb21wbGV0ZSBBIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIGZhZGVPdXQoZHVyYXRpb24/OiBudW1iZXJ8c3RyaW5nLCBlYXNpbmc/OiBzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogSGlkZSB0aGUgbWF0Y2hlZCBlbGVtZW50cyBieSBmYWRpbmcgdGhlbSB0byB0cmFuc3BhcmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgbWFwIG9mIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAgICovCisgICAgZmFkZU91dChvcHRpb25zOiBKUXVlcnlBbmltYXRpb25PcHRpb25zKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQWRqdXN0IHRoZSBvcGFjaXR5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBvcGFjaXR5IEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSBkZW5vdGluZyB0aGUgdGFyZ2V0IG9wYWNpdHkuCisgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgZmFkZVRvKGR1cmF0aW9uOiBzdHJpbmd8bnVtYmVyLCBvcGFjaXR5OiBudW1iZXIsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQWRqdXN0IHRoZSBvcGFjaXR5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBvcGFjaXR5IEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSBkZW5vdGluZyB0aGUgdGFyZ2V0IG9wYWNpdHkuCisgICAgICogQHBhcmFtIGVhc2luZyBBIHN0cmluZyBpbmRpY2F0aW5nIHdoaWNoIGVhc2luZyBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSB0cmFuc2l0aW9uLgorICAgICAqIEBwYXJhbSBjb21wbGV0ZSBBIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIGZhZGVUbyhkdXJhdGlvbjogc3RyaW5nfG51bWJlciwgb3BhY2l0eTogbnVtYmVyLCBlYXNpbmc/OiBzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9yIGhpZGUgdGhlIG1hdGNoZWQgZWxlbWVudHMgYnkgYW5pbWF0aW5nIHRoZWlyIG9wYWNpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gQSBzdHJpbmcgb3IgbnVtYmVyIGRldGVybWluaW5nIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBydW4uCisgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgZmFkZVRvZ2dsZShkdXJhdGlvbj86IG51bWJlcnxzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRGlzcGxheSBvciBoaWRlIHRoZSBtYXRjaGVkIGVsZW1lbnRzIGJ5IGFuaW1hdGluZyB0aGVpciBvcGFjaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBlYXNpbmcgQSBzdHJpbmcgaW5kaWNhdGluZyB3aGljaCBlYXNpbmcgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgdHJhbnNpdGlvbi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBmYWRlVG9nZ2xlKGR1cmF0aW9uPzogbnVtYmVyfHN0cmluZywgZWFzaW5nPzogc3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgaGlkZSB0aGUgbWF0Y2hlZCBlbGVtZW50cyBieSBhbmltYXRpbmcgdGhlaXIgb3BhY2l0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgbWFwIG9mIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAgICovCisgICAgZmFkZVRvZ2dsZShvcHRpb25zOiBKUXVlcnlBbmltYXRpb25PcHRpb25zKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY3VycmVudGx5LXJ1bm5pbmcgYW5pbWF0aW9uLCByZW1vdmUgYWxsIHF1ZXVlZCBhbmltYXRpb25zLCBhbmQgY29tcGxldGUgYWxsIGFuaW1hdGlvbnMgZm9yIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXVlIFRoZSBuYW1lIG9mIHRoZSBxdWV1ZSBpbiB3aGljaCB0byBzdG9wIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgZmluaXNoKHF1ZXVlPzogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogSGlkZSB0aGUgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBoaWRlKGR1cmF0aW9uPzogbnVtYmVyfHN0cmluZywgY29tcGxldGU/OiBGdW5jdGlvbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBIaWRlIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBlYXNpbmcgQSBzdHJpbmcgaW5kaWNhdGluZyB3aGljaCBlYXNpbmcgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgdHJhbnNpdGlvbi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBoaWRlKGR1cmF0aW9uPzogbnVtYmVyfHN0cmluZywgZWFzaW5nPzogc3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIG1hcCBvZiBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorICAgICAqLworICAgIGhpZGUob3B0aW9uczogSlF1ZXJ5QW5pbWF0aW9uT3B0aW9ucyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gQSBzdHJpbmcgb3IgbnVtYmVyIGRldGVybWluaW5nIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBydW4uCisgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgc2hvdyhkdXJhdGlvbj86IG51bWJlcnxzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gZWFzaW5nIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggZWFzaW5nIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHRyYW5zaXRpb24uCisgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgc2hvdyhkdXJhdGlvbj86IG51bWJlcnxzdHJpbmcsIGVhc2luZz86IHN0cmluZywgY29tcGxldGU/OiBGdW5jdGlvbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBtYXAgb2YgYWRkaXRpb25hbCBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBzaG93KG9wdGlvbnM6IEpRdWVyeUFuaW1hdGlvbk9wdGlvbnMpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBtYXRjaGVkIGVsZW1lbnRzIHdpdGggYSBzbGlkaW5nIG1vdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBzbGlkZURvd24oZHVyYXRpb24/OiBudW1iZXJ8c3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIG1hdGNoZWQgZWxlbWVudHMgd2l0aCBhIHNsaWRpbmcgbW90aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBlYXNpbmcgQSBzdHJpbmcgaW5kaWNhdGluZyB3aGljaCBlYXNpbmcgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgdHJhbnNpdGlvbi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBzbGlkZURvd24oZHVyYXRpb24/OiBudW1iZXJ8c3RyaW5nLCBlYXNpbmc/OiBzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgbWF0Y2hlZCBlbGVtZW50cyB3aXRoIGEgc2xpZGluZyBtb3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIG1hcCBvZiBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHNsaWRlRG93bihvcHRpb25zOiBKUXVlcnlBbmltYXRpb25PcHRpb25zKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogRGlzcGxheSBvciBoaWRlIHRoZSBtYXRjaGVkIGVsZW1lbnRzIHdpdGggYSBzbGlkaW5nIG1vdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBzbGlkZVRvZ2dsZShkdXJhdGlvbj86IG51bWJlcnxzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRGlzcGxheSBvciBoaWRlIHRoZSBtYXRjaGVkIGVsZW1lbnRzIHdpdGggYSBzbGlkaW5nIG1vdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gZWFzaW5nIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggZWFzaW5nIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHRyYW5zaXRpb24uCisgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgc2xpZGVUb2dnbGUoZHVyYXRpb24/OiBudW1iZXJ8c3RyaW5nLCBlYXNpbmc/OiBzdHJpbmcsIGNvbXBsZXRlPzogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRGlzcGxheSBvciBoaWRlIHRoZSBtYXRjaGVkIGVsZW1lbnRzIHdpdGggYSBzbGlkaW5nIG1vdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgbWFwIG9mIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAgICovCisgICAgc2xpZGVUb2dnbGUob3B0aW9uczogSlF1ZXJ5QW5pbWF0aW9uT3B0aW9ucyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIG1hdGNoZWQgZWxlbWVudHMgd2l0aCBhIHNsaWRpbmcgbW90aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBjb21wbGV0ZSBBIGZ1bmN0aW9uIHRvIGNhbGwgb25jZSB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqLworICAgIHNsaWRlVXAoZHVyYXRpb24/OiBudW1iZXJ8c3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIG1hdGNoZWQgZWxlbWVudHMgd2l0aCBhIHNsaWRpbmcgbW90aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIEEgc3RyaW5nIG9yIG51bWJlciBkZXRlcm1pbmluZyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgcnVuLgorICAgICAqIEBwYXJhbSBlYXNpbmcgQSBzdHJpbmcgaW5kaWNhdGluZyB3aGljaCBlYXNpbmcgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgdHJhbnNpdGlvbi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBzbGlkZVVwKGR1cmF0aW9uPzogbnVtYmVyfHN0cmluZywgZWFzaW5nPzogc3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIG1hdGNoZWQgZWxlbWVudHMgd2l0aCBhIHNsaWRpbmcgbW90aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBtYXAgb2YgYWRkaXRpb25hbCBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBzbGlkZVVwKG9wdGlvbnM6IEpRdWVyeUFuaW1hdGlvbk9wdGlvbnMpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjdXJyZW50bHktcnVubmluZyBhbmltYXRpb24gb24gdGhlIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJRdWV1ZSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJlbW92ZSBxdWV1ZWQgYW5pbWF0aW9uIGFzIHdlbGwuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqIEBwYXJhbSBqdW1wVG9FbmQgQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBjb21wbGV0ZSB0aGUgY3VycmVudCBhbmltYXRpb24gaW1tZWRpYXRlbHkuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHN0b3AoY2xlYXJRdWV1ZT86IGJvb2xlYW4sIGp1bXBUb0VuZD86IGJvb2xlYW4pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY3VycmVudGx5LXJ1bm5pbmcgYW5pbWF0aW9uIG9uIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXVlIFRoZSBuYW1lIG9mIHRoZSBxdWV1ZSBpbiB3aGljaCB0byBzdG9wIGFuaW1hdGlvbnMuCisgICAgICogQHBhcmFtIGNsZWFyUXVldWUgQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byByZW1vdmUgcXVldWVkIGFuaW1hdGlvbiBhcyB3ZWxsLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0ganVtcFRvRW5kIEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGltbWVkaWF0ZWx5LiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBzdG9wKHF1ZXVlPzogc3RyaW5nLCBjbGVhclF1ZXVlPzogYm9vbGVhbiwganVtcFRvRW5kPzogYm9vbGVhbik6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgaGlkZSB0aGUgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gY29tcGxldGUgQSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICB0b2dnbGUoZHVyYXRpb24/OiBudW1iZXJ8c3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgaGlkZSB0aGUgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBBIHN0cmluZyBvciBudW1iZXIgZGV0ZXJtaW5pbmcgaG93IGxvbmcgdGhlIGFuaW1hdGlvbiB3aWxsIHJ1bi4KKyAgICAgKiBAcGFyYW0gZWFzaW5nIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggZWFzaW5nIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHRyYW5zaXRpb24uCisgICAgICogQHBhcmFtIGNvbXBsZXRlIEEgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgdG9nZ2xlKGR1cmF0aW9uPzogbnVtYmVyfHN0cmluZywgZWFzaW5nPzogc3RyaW5nLCBjb21wbGV0ZT86IEZ1bmN0aW9uKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgaGlkZSB0aGUgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgbWFwIG9mIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBtZXRob2QuCisgICAgICovCisgICAgdG9nZ2xlKG9wdGlvbnM6IEpRdWVyeUFuaW1hdGlvbk9wdGlvbnMpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRGlzcGxheSBvciBoaWRlIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHNob3dPckhpZGUgQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBzaG93IG9yIGhpZGUgdGhlIGVsZW1lbnRzLgorICAgICAqLworICAgIHRvZ2dsZShzaG93T3JIaWRlOiBib29sZWFuKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQXR0YWNoIGEgaGFuZGxlciB0byBhbiBldmVudCBmb3IgdGhlIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBldmVudFR5cGUgQSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBET00gZXZlbnQgdHlwZXMsIHN1Y2ggYXMgImNsaWNrIiBvciAic3VibWl0LCIgb3IgY3VzdG9tIGV2ZW50IG5hbWVzLgorICAgICAqIEBwYXJhbSBldmVudERhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBiaW5kKGV2ZW50VHlwZTogc3RyaW5nLCBldmVudERhdGE6IGFueSwgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGhhbmRsZXIgdG8gYW4gZXZlbnQgZm9yIHRoZSBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIEEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgRE9NIGV2ZW50IHR5cGVzLCBzdWNoIGFzICJjbGljayIgb3IgInN1Ym1pdCwiIG9yIGN1c3RvbSBldmVudCBuYW1lcy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgYmluZChldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGhhbmRsZXIgdG8gYW4gZXZlbnQgZm9yIHRoZSBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIEEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgRE9NIGV2ZW50IHR5cGVzLCBzdWNoIGFzICJjbGljayIgb3IgInN1Ym1pdCwiIG9yIGN1c3RvbSBldmVudCBuYW1lcy4KKyAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gcHJldmVudEJ1YmJsZSBTZXR0aW5nIHRoZSB0aGlyZCBhcmd1bWVudCB0byBmYWxzZSB3aWxsIGF0dGFjaCBhIGZ1bmN0aW9uIHRoYXQgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uIGZyb20gb2NjdXJyaW5nIGFuZCBzdG9wcyB0aGUgZXZlbnQgZnJvbSBidWJibGluZy4gVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBiaW5kKGV2ZW50VHlwZTogc3RyaW5nLCBldmVudERhdGE6IGFueSwgcHJldmVudEJ1YmJsZTogYm9vbGVhbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggYSBoYW5kbGVyIHRvIGFuIGV2ZW50IGZvciB0aGUgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIGV2ZW50VHlwZSBBIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIERPTSBldmVudCB0eXBlcywgc3VjaCBhcyAiY2xpY2siIG9yICJzdWJtaXQsIiBvciBjdXN0b20gZXZlbnQgbmFtZXMuCisgICAgICogQHBhcmFtIHByZXZlbnRCdWJibGUgU2V0dGluZyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gZmFsc2Ugd2lsbCBhdHRhY2ggYSBmdW5jdGlvbiB0aGF0IHByZXZlbnRzIHRoZSBkZWZhdWx0IGFjdGlvbiBmcm9tIG9jY3VycmluZyBhbmQgc3RvcHMgdGhlIGV2ZW50IGZyb20gYnViYmxpbmcuIFRoZSBkZWZhdWx0IGlzIHRydWUuCisgICAgICovCisgICAgYmluZChldmVudFR5cGU6IHN0cmluZywgcHJldmVudEJ1YmJsZTogYm9vbGVhbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggYSBoYW5kbGVyIHRvIGFuIGV2ZW50IGZvciB0aGUgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIGV2ZW50cyBBbiBvYmplY3QgY29udGFpbmluZyBvbmUgb3IgbW9yZSBET00gZXZlbnQgdHlwZXMgYW5kIGZ1bmN0aW9ucyB0byBleGVjdXRlIGZvciB0aGVtLgorICAgICAqLworICAgIGJpbmQoZXZlbnRzOiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAiYmx1ciIgZXZlbnQgb24gYW4gZWxlbWVudAorICAgICAqLworICAgIGJsdXIoKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgImJsdXIiIEphdmFTY3JpcHQgZXZlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBibHVyKGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJibHVyIiBKYXZhU2NyaXB0IGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgYmx1cihldmVudERhdGE/OiBhbnksIGhhbmRsZXI/OiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAiY2hhbmdlIiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIGNoYW5nZSgpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAiY2hhbmdlIiBKYXZhU2NyaXB0IGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgY2hhbmdlKGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJjaGFuZ2UiIEphdmFTY3JpcHQgZXZlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudERhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBjaGFuZ2UoZXZlbnREYXRhPzogYW55LCBoYW5kbGVyPzogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGUgImNsaWNrIiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIGNsaWNrKCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJjbGljayIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICovCisgICAgY2xpY2soaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgImNsaWNrIiBKYXZhU2NyaXB0IGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgY2xpY2soZXZlbnREYXRhPzogYW55LCBoYW5kbGVyPzogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGUgImRibGNsaWNrIiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIGRibGNsaWNrKCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJkYmxjbGljayIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGRibGNsaWNrKGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJkYmxjbGljayIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGRibGNsaWNrKGV2ZW50RGF0YT86IGFueSwgaGFuZGxlcj86IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIGRlbGVnYXRlKHNlbGVjdG9yOiBhbnksIGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisgICAgZGVsZWdhdGUoc2VsZWN0b3I6IGFueSwgZXZlbnRUeXBlOiBzdHJpbmcsIGV2ZW50RGF0YTogYW55LCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAiZm9jdXMiIGV2ZW50IG9uIGFuIGVsZW1lbnQuCisgICAgICovCisgICAgZm9jdXMoKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgImZvY3VzIiBKYXZhU2NyaXB0IGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgZm9jdXMoaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgImZvY3VzIiBKYXZhU2NyaXB0IGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgZm9jdXMoZXZlbnREYXRhPzogYW55LCBoYW5kbGVyPzogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAiZm9jdXNpbiIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGZvY3VzaW4oaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgImZvY3VzaW4iIEphdmFTY3JpcHQgZXZlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudERhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBmb2N1c2luKGV2ZW50RGF0YTogT2JqZWN0LCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJmb2N1c291dCIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGZvY3Vzb3V0KGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJmb2N1c291dCIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGZvY3Vzb3V0KGV2ZW50RGF0YTogT2JqZWN0LCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kIHR3byBoYW5kbGVycyB0byB0aGUgbWF0Y2hlZCBlbGVtZW50cywgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBlbnRlcnMgYW5kIGxlYXZlcyB0aGUgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlckluIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGVudGVycyB0aGUgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlck91dCBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBsZWF2ZXMgdGhlIGVsZW1lbnQuCisgICAgICovCisgICAgaG92ZXIoaGFuZGxlckluOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnksIGhhbmRsZXJPdXQ6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGEgc2luZ2xlIGhhbmRsZXIgdG8gdGhlIG1hdGNoZWQgZWxlbWVudHMsIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgZW50ZXJzIG9yIGxlYXZlcyB0aGUgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlckluT3V0IEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGVudGVycyBvciBsZWF2ZXMgdGhlIGVsZW1lbnQuCisgICAgICovCisgICAgaG92ZXIoaGFuZGxlckluT3V0OiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAia2V5ZG93biIgZXZlbnQgb24gYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBrZXlkb3duKCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJrZXlkb3duIiBKYXZhU2NyaXB0IGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAga2V5ZG93bihoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUtleUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAia2V5ZG93biIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGtleWRvd24oZXZlbnREYXRhPzogYW55LCBoYW5kbGVyPzogKGV2ZW50T2JqZWN0OiBKUXVlcnlLZXlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGUgImtleXByZXNzIiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIGtleXByZXNzKCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJrZXlwcmVzcyIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGtleXByZXNzKGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5S2V5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJrZXlwcmVzcyIgSmF2YVNjcmlwdCBldmVudAorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIGtleXByZXNzKGV2ZW50RGF0YT86IGFueSwgaGFuZGxlcj86IChldmVudE9iamVjdDogSlF1ZXJ5S2V5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFRyaWdnZXIgdGhlICJrZXl1cCIgZXZlbnQgb24gYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBrZXl1cCgpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAia2V5dXAiIEphdmFTY3JpcHQgZXZlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBrZXl1cChoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUtleUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAia2V5dXAiIEphdmFTY3JpcHQgZXZlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudERhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBrZXl1cChldmVudERhdGE/OiBhbnksIGhhbmRsZXI/OiAoZXZlbnRPYmplY3Q6IEpRdWVyeUtleUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJsb2FkIiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBsb2FkKGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJsb2FkIiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBsb2FkKGV2ZW50RGF0YT86IGFueSwgaGFuZGxlcj86IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFRyaWdnZXIgdGhlICJtb3VzZWRvd24iIGV2ZW50IG9uIGFuIGVsZW1lbnQuCisgICAgICovCisgICAgbW91c2Vkb3duKCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJtb3VzZWRvd24iIEphdmFTY3JpcHQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIG1vdXNlZG93bihoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeU1vdXNlRXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJtb3VzZWRvd24iIEphdmFTY3JpcHQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIG1vdXNlZG93bihldmVudERhdGE6IE9iamVjdCwgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlNb3VzZUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAibW91c2VlbnRlciIgZXZlbnQgb24gYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBtb3VzZWVudGVyKCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gYmUgZmlyZWQgd2hlbiB0aGUgbW91c2UgZW50ZXJzIGFuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIG1vdXNlZW50ZXIoaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlNb3VzZUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIGJlIGZpcmVkIHdoZW4gdGhlIG1vdXNlIGVudGVycyBhbiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBtb3VzZWVudGVyKGV2ZW50RGF0YTogT2JqZWN0LCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeU1vdXNlRXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFRyaWdnZXIgdGhlICJtb3VzZWxlYXZlIiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIG1vdXNlbGVhdmUoKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byBiZSBmaXJlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgbW91c2VsZWF2ZShoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeU1vdXNlRXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gYmUgZmlyZWQgd2hlbiB0aGUgbW91c2UgbGVhdmVzIGFuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIG1vdXNlbGVhdmUoZXZlbnREYXRhOiBPYmplY3QsIGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5TW91c2VFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGUgIm1vdXNlbW92ZSIgZXZlbnQgb24gYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBtb3VzZW1vdmUoKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgIm1vdXNlbW92ZSIgSmF2YVNjcmlwdCBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgbW91c2Vtb3ZlKGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5TW91c2VFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgIm1vdXNlbW92ZSIgSmF2YVNjcmlwdCBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudERhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgbW91c2Vtb3ZlKGV2ZW50RGF0YTogT2JqZWN0LCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeU1vdXNlRXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFRyaWdnZXIgdGhlICJtb3VzZW91dCIgZXZlbnQgb24gYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBtb3VzZW91dCgpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAibW91c2VvdXQiIEphdmFTY3JpcHQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIG1vdXNlb3V0KGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5TW91c2VFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgIm1vdXNlb3V0IiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBtb3VzZW91dChldmVudERhdGE6IE9iamVjdCwgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlNb3VzZUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAibW91c2VvdmVyIiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIG1vdXNlb3ZlcigpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAibW91c2VvdmVyIiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBtb3VzZW92ZXIoaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlNb3VzZUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAibW91c2VvdmVyIiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBtb3VzZW92ZXIoZXZlbnREYXRhOiBPYmplY3QsIGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5TW91c2VFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGUgIm1vdXNldXAiIGV2ZW50IG9uIGFuIGVsZW1lbnQuCisgICAgICovCisgICAgbW91c2V1cCgpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAibW91c2V1cCIgSmF2YVNjcmlwdCBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgbW91c2V1cChoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeU1vdXNlRXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJtb3VzZXVwIiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBtb3VzZXVwKGV2ZW50RGF0YTogT2JqZWN0LCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeU1vdXNlRXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBldmVudCBoYW5kbGVyLgorICAgICAqLworICAgIG9mZigpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRzIE9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBldmVudCB0eXBlcyBhbmQgb3B0aW9uYWwgbmFtZXNwYWNlcywgb3IganVzdCBuYW1lc3BhY2VzLCBzdWNoIGFzICJjbGljayIsICJrZXlkb3duLm15UGx1Z2luIiwgb3IgIi5teVBsdWdpbiIuCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3Igd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSBvbmUgb3JpZ2luYWxseSBwYXNzZWQgdG8gLm9uKCkgd2hlbiBhdHRhY2hpbmcgZXZlbnQgaGFuZGxlcnMuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBoYW5kbGVyIGZ1bmN0aW9uIHByZXZpb3VzbHkgYXR0YWNoZWQgZm9yIHRoZSBldmVudChzKSwgb3IgdGhlIHNwZWNpYWwgdmFsdWUgZmFsc2UuCisgICAgICovCisgICAgb2ZmKGV2ZW50czogc3RyaW5nLCBzZWxlY3Rvcj86IHN0cmluZywgaGFuZGxlcj86IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXZlbnQgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudHMgT25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIGV2ZW50IHR5cGVzIGFuZCBvcHRpb25hbCBuYW1lc3BhY2VzLCBvciBqdXN0IG5hbWVzcGFjZXMsIHN1Y2ggYXMgImNsaWNrIiwgImtleWRvd24ubXlQbHVnaW4iLCBvciAiLm15UGx1Z2luIi4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGhhbmRsZXIgZnVuY3Rpb24gcHJldmlvdXNseSBhdHRhY2hlZCBmb3IgdGhlIGV2ZW50KHMpLCBvciB0aGUgc3BlY2lhbCB2YWx1ZSBmYWxzZS4KKyAgICAgKi8KKyAgICBvZmYoZXZlbnRzOiBzdHJpbmcsIGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXZlbnQgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudHMgQW4gb2JqZWN0IHdoZXJlIHRoZSBzdHJpbmcga2V5cyByZXByZXNlbnQgb25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIGV2ZW50IHR5cGVzIGFuZCBvcHRpb25hbCBuYW1lc3BhY2VzLCBhbmQgdGhlIHZhbHVlcyByZXByZXNlbnQgaGFuZGxlciBmdW5jdGlvbnMgcHJldmlvdXNseSBhdHRhY2hlZCBmb3IgdGhlIGV2ZW50KHMpLgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgb25lIG9yaWdpbmFsbHkgcGFzc2VkIHRvIC5vbigpIHdoZW4gYXR0YWNoaW5nIGV2ZW50IGhhbmRsZXJzLgorICAgICAqLworICAgIG9mZihldmVudHM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCBzZWxlY3Rvcj86IHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEF0dGFjaCBhbiBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgdG8gdGhlIHNlbGVjdGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50cyBPbmUgb3IgbW9yZSBzcGFjZS1zZXBhcmF0ZWQgZXZlbnQgdHlwZXMgYW5kIG9wdGlvbmFsIG5hbWVzcGFjZXMsIHN1Y2ggYXMgImNsaWNrIiBvciAia2V5ZG93bi5teVBsdWdpbiIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4gVGhlIHZhbHVlIGZhbHNlIGlzIGFsc28gYWxsb3dlZCBhcyBhIHNob3J0aGFuZCBmb3IgYSBmdW5jdGlvbiB0aGF0IHNpbXBseSBkb2VzIHJldHVybiBmYWxzZS4gUmVzdCBwYXJhbWV0ZXIgYXJncyBpcyBmb3Igb3B0aW9uYWwgcGFyYW1ldGVycyBwYXNzZWQgdG8galF1ZXJ5LnRyaWdnZXIoKS4gTm90ZSB0aGF0IHRoZSBhY3R1YWwgcGFyYW1ldGVycyBvbiB0aGUgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiBtdXN0IGJlIG1hcmtlZCBhcyBvcHRpb25hbCAoPyBzeW50YXgpLgorICAgICAqLworICAgIG9uKGV2ZW50czogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEF0dGFjaCBhbiBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgdG8gdGhlIHNlbGVjdGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50cyBPbmUgb3IgbW9yZSBzcGFjZS1zZXBhcmF0ZWQgZXZlbnQgdHlwZXMgYW5kIG9wdGlvbmFsIG5hbWVzcGFjZXMsIHN1Y2ggYXMgImNsaWNrIiBvciAia2V5ZG93bi5teVBsdWdpbiIuCisgICAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaW4gZXZlbnQuZGF0YSB3aGVuIGFuIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLiBUaGUgdmFsdWUgZmFsc2UgaXMgYWxzbyBhbGxvd2VkIGFzIGEgc2hvcnRoYW5kIGZvciBhIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGRvZXMgcmV0dXJuIGZhbHNlLgorICAgICovCisgICAgb24oZXZlbnRzOiBzdHJpbmcsIGRhdGEgOiBhbnksIGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQXR0YWNoIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gZm9yIG9uZSBvciBtb3JlIGV2ZW50cyB0byB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRzIE9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBldmVudCB0eXBlcyBhbmQgb3B0aW9uYWwgbmFtZXNwYWNlcywgc3VjaCBhcyAiY2xpY2siIG9yICJrZXlkb3duLm15UGx1Z2luIi4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzZWxlY3RvciBzdHJpbmcgdG8gZmlsdGVyIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdGhhdCB0cmlnZ2VyIHRoZSBldmVudC4gSWYgdGhlIHNlbGVjdG9yIGlzIG51bGwgb3Igb21pdHRlZCwgdGhlIGV2ZW50IGlzIGFsd2F5cyB0cmlnZ2VyZWQgd2hlbiBpdCByZWFjaGVzIHRoZSBzZWxlY3RlZCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuIFRoZSB2YWx1ZSBmYWxzZSBpcyBhbHNvIGFsbG93ZWQgYXMgYSBzaG9ydGhhbmQgZm9yIGEgZnVuY3Rpb24gdGhhdCBzaW1wbHkgZG9lcyByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgb24oZXZlbnRzOiBzdHJpbmcsIHNlbGVjdG9yOiBzdHJpbmcsIGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QsIC4uLmV2ZW50RGF0YTogYW55W10pID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggYW4gZXZlbnQgaGFuZGxlciBmdW5jdGlvbiBmb3Igb25lIG9yIG1vcmUgZXZlbnRzIHRvIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudHMgT25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIGV2ZW50IHR5cGVzIGFuZCBvcHRpb25hbCBuYW1lc3BhY2VzLCBzdWNoIGFzICJjbGljayIgb3IgImtleWRvd24ubXlQbHVnaW4iLgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHN0cmluZyB0byBmaWx0ZXIgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cyB0aGF0IHRyaWdnZXIgdGhlIGV2ZW50LiBJZiB0aGUgc2VsZWN0b3IgaXMgbnVsbCBvciBvbWl0dGVkLCB0aGUgZXZlbnQgaXMgYWx3YXlzIHRyaWdnZXJlZCB3aGVuIGl0IHJlYWNoZXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQuCisgICAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaW4gZXZlbnQuZGF0YSB3aGVuIGFuIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLiBUaGUgdmFsdWUgZmFsc2UgaXMgYWxzbyBhbGxvd2VkIGFzIGEgc2hvcnRoYW5kIGZvciBhIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGRvZXMgcmV0dXJuIGZhbHNlLgorICAgICAqLworICAgIG9uKGV2ZW50czogc3RyaW5nLCBzZWxlY3Rvcjogc3RyaW5nLCBkYXRhOiBhbnksIGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QsIC4uLmV2ZW50RGF0YTogYW55W10pID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggYW4gZXZlbnQgaGFuZGxlciBmdW5jdGlvbiBmb3Igb25lIG9yIG1vcmUgZXZlbnRzIHRvIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudHMgQW4gb2JqZWN0IGluIHdoaWNoIHRoZSBzdHJpbmcga2V5cyByZXByZXNlbnQgb25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIGV2ZW50IHR5cGVzIGFuZCBvcHRpb25hbCBuYW1lc3BhY2VzLCBhbmQgdGhlIHZhbHVlcyByZXByZXNlbnQgYSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgdGhlIGV2ZW50KHMpLgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHN0cmluZyB0byBmaWx0ZXIgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cyB0aGF0IHdpbGwgY2FsbCB0aGUgaGFuZGxlci4gSWYgdGhlIHNlbGVjdG9yIGlzIG51bGwgb3Igb21pdHRlZCwgdGhlIGhhbmRsZXIgaXMgYWx3YXlzIGNhbGxlZCB3aGVuIGl0IHJlYWNoZXMgdGhlIHNlbGVjdGVkIGVsZW1lbnQuCisgICAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgaW4gZXZlbnQuZGF0YSB3aGVuIGFuIGV2ZW50IG9jY3Vycy4KKyAgICAgKi8KKyAgICBvbihldmVudHM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCBzZWxlY3Rvcj86IHN0cmluZywgZGF0YT86IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggYW4gZXZlbnQgaGFuZGxlciBmdW5jdGlvbiBmb3Igb25lIG9yIG1vcmUgZXZlbnRzIHRvIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudHMgQW4gb2JqZWN0IGluIHdoaWNoIHRoZSBzdHJpbmcga2V5cyByZXByZXNlbnQgb25lIG9yIG1vcmUgc3BhY2Utc2VwYXJhdGVkIGV2ZW50IHR5cGVzIGFuZCBvcHRpb25hbCBuYW1lc3BhY2VzLCBhbmQgdGhlIHZhbHVlcyByZXByZXNlbnQgYSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgdGhlIGV2ZW50KHMpLgorICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIGV2ZW50LmRhdGEgd2hlbiBhbiBldmVudCBvY2N1cnMuCisgICAgICovCisgICAgb24oZXZlbnRzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSwgZGF0YT86IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGhhbmRsZXIgdG8gYW4gZXZlbnQgZm9yIHRoZSBlbGVtZW50cy4gVGhlIGhhbmRsZXIgaXMgZXhlY3V0ZWQgYXQgbW9zdCBvbmNlIHBlciBlbGVtZW50IHBlciBldmVudCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50cyBBIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIEphdmFTY3JpcHQgZXZlbnQgdHlwZXMsIHN1Y2ggYXMgImNsaWNrIiBvciAic3VibWl0LCIgb3IgY3VzdG9tIGV2ZW50IG5hbWVzLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhdCB0aGUgdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIG9uZShldmVudHM6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGhhbmRsZXIgdG8gYW4gZXZlbnQgZm9yIHRoZSBlbGVtZW50cy4gVGhlIGhhbmRsZXIgaXMgZXhlY3V0ZWQgYXQgbW9zdCBvbmNlIHBlciBlbGVtZW50IHBlciBldmVudCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50cyBBIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIEphdmFTY3JpcHQgZXZlbnQgdHlwZXMsIHN1Y2ggYXMgImNsaWNrIiBvciAic3VibWl0LCIgb3IgY3VzdG9tIGV2ZW50IG5hbWVzLgorICAgICAqIEBwYXJhbSBkYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYXQgdGhlIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBvbmUoZXZlbnRzOiBzdHJpbmcsIGRhdGE6IE9iamVjdCwgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQXR0YWNoIGEgaGFuZGxlciB0byBhbiBldmVudCBmb3IgdGhlIGVsZW1lbnRzLiBUaGUgaGFuZGxlciBpcyBleGVjdXRlZCBhdCBtb3N0IG9uY2UgcGVyIGVsZW1lbnQgcGVyIGV2ZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRzIE9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBldmVudCB0eXBlcyBhbmQgb3B0aW9uYWwgbmFtZXNwYWNlcywgc3VjaCBhcyAiY2xpY2siIG9yICJrZXlkb3duLm15UGx1Z2luIi4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzZWxlY3RvciBzdHJpbmcgdG8gZmlsdGVyIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdGhhdCB0cmlnZ2VyIHRoZSBldmVudC4gSWYgdGhlIHNlbGVjdG9yIGlzIG51bGwgb3Igb21pdHRlZCwgdGhlIGV2ZW50IGlzIGFsd2F5cyB0cmlnZ2VyZWQgd2hlbiBpdCByZWFjaGVzIHRoZSBzZWxlY3RlZCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuIFRoZSB2YWx1ZSBmYWxzZSBpcyBhbHNvIGFsbG93ZWQgYXMgYSBzaG9ydGhhbmQgZm9yIGEgZnVuY3Rpb24gdGhhdCBzaW1wbHkgZG9lcyByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgb25lKGV2ZW50czogc3RyaW5nLCBzZWxlY3Rvcjogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQXR0YWNoIGEgaGFuZGxlciB0byBhbiBldmVudCBmb3IgdGhlIGVsZW1lbnRzLiBUaGUgaGFuZGxlciBpcyBleGVjdXRlZCBhdCBtb3N0IG9uY2UgcGVyIGVsZW1lbnQgcGVyIGV2ZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRzIE9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBldmVudCB0eXBlcyBhbmQgb3B0aW9uYWwgbmFtZXNwYWNlcywgc3VjaCBhcyAiY2xpY2siIG9yICJrZXlkb3duLm15UGx1Z2luIi4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzZWxlY3RvciBzdHJpbmcgdG8gZmlsdGVyIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdGhhdCB0cmlnZ2VyIHRoZSBldmVudC4gSWYgdGhlIHNlbGVjdG9yIGlzIG51bGwgb3Igb21pdHRlZCwgdGhlIGV2ZW50IGlzIGFsd2F5cyB0cmlnZ2VyZWQgd2hlbiBpdCByZWFjaGVzIHRoZSBzZWxlY3RlZCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIGV2ZW50LmRhdGEgd2hlbiBhbiBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4gVGhlIHZhbHVlIGZhbHNlIGlzIGFsc28gYWxsb3dlZCBhcyBhIHNob3J0aGFuZCBmb3IgYSBmdW5jdGlvbiB0aGF0IHNpbXBseSBkb2VzIHJldHVybiBmYWxzZS4KKyAgICAgKi8KKyAgICBvbmUoZXZlbnRzOiBzdHJpbmcsIHNlbGVjdG9yOiBzdHJpbmcsIGRhdGE6IGFueSwgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQXR0YWNoIGEgaGFuZGxlciB0byBhbiBldmVudCBmb3IgdGhlIGVsZW1lbnRzLiBUaGUgaGFuZGxlciBpcyBleGVjdXRlZCBhdCBtb3N0IG9uY2UgcGVyIGVsZW1lbnQgcGVyIGV2ZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRzIEFuIG9iamVjdCBpbiB3aGljaCB0aGUgc3RyaW5nIGtleXMgcmVwcmVzZW50IG9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBldmVudCB0eXBlcyBhbmQgb3B0aW9uYWwgbmFtZXNwYWNlcywgYW5kIHRoZSB2YWx1ZXMgcmVwcmVzZW50IGEgaGFuZGxlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIHRoZSBldmVudChzKS4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzZWxlY3RvciBzdHJpbmcgdG8gZmlsdGVyIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdGhhdCB3aWxsIGNhbGwgdGhlIGhhbmRsZXIuIElmIHRoZSBzZWxlY3RvciBpcyBudWxsIG9yIG9taXR0ZWQsIHRoZSBoYW5kbGVyIGlzIGFsd2F5cyBjYWxsZWQgd2hlbiBpdCByZWFjaGVzIHRoZSBzZWxlY3RlZCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIGluIGV2ZW50LmRhdGEgd2hlbiBhbiBldmVudCBvY2N1cnMuCisgICAgICovCisgICAgb25lKGV2ZW50czogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHNlbGVjdG9yPzogc3RyaW5nLCBkYXRhPzogYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQXR0YWNoIGEgaGFuZGxlciB0byBhbiBldmVudCBmb3IgdGhlIGVsZW1lbnRzLiBUaGUgaGFuZGxlciBpcyBleGVjdXRlZCBhdCBtb3N0IG9uY2UgcGVyIGVsZW1lbnQgcGVyIGV2ZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRzIEFuIG9iamVjdCBpbiB3aGljaCB0aGUgc3RyaW5nIGtleXMgcmVwcmVzZW50IG9uZSBvciBtb3JlIHNwYWNlLXNlcGFyYXRlZCBldmVudCB0eXBlcyBhbmQgb3B0aW9uYWwgbmFtZXNwYWNlcywgYW5kIHRoZSB2YWx1ZXMgcmVwcmVzZW50IGEgaGFuZGxlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIHRoZSBldmVudChzKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBEYXRhIHRvIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBpbiBldmVudC5kYXRhIHdoZW4gYW4gZXZlbnQgb2NjdXJzLgorICAgICAqLworICAgIG9uZShldmVudHM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCBkYXRhPzogYW55KTogSlF1ZXJ5OworCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBET00gaXMgZnVsbHkgbG9hZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGFmdGVyIHRoZSBET00gaXMgcmVhZHkuCisgICAgICovCisgICAgcmVhZHkoaGFuZGxlcjogKGpRdWVyeUFsaWFzPzogSlF1ZXJ5U3RhdGljKSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAicmVzaXplIiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIHJlc2l6ZSgpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAicmVzaXplIiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIHJlc2l6ZShoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAicmVzaXplIiBKYXZhU2NyaXB0IGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIGVhY2ggdGltZSB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIHJlc2l6ZShldmVudERhdGE6IE9iamVjdCwgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGUgInNjcm9sbCIgZXZlbnQgb24gYW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBzY3JvbGwoKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgInNjcm9sbCIgSmF2YVNjcmlwdCBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBzY3JvbGwoaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgInNjcm9sbCIgSmF2YVNjcmlwdCBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudERhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBzY3JvbGwoZXZlbnREYXRhOiBPYmplY3QsIGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFRyaWdnZXIgdGhlICJzZWxlY3QiIGV2ZW50IG9uIGFuIGVsZW1lbnQuCisgICAgICovCisgICAgc2VsZWN0KCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJzZWxlY3QiIEphdmFTY3JpcHQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgc2VsZWN0KGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJzZWxlY3QiIEphdmFTY3JpcHQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgc2VsZWN0KGV2ZW50RGF0YTogT2JqZWN0LCBoYW5kbGVyOiAoZXZlbnRPYmplY3Q6IEpRdWVyeUV2ZW50T2JqZWN0KSA9PiBhbnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoZSAic3VibWl0IiBldmVudCBvbiBhbiBlbGVtZW50LgorICAgICAqLworICAgIHN1Ym1pdCgpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAic3VibWl0IiBKYXZhU2NyaXB0IGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZWFjaCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgc3VibWl0KGhhbmRsZXI6IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJzdWJtaXQiIEphdmFTY3JpcHQgZXZlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudERhdGEgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBlYWNoIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBzdWJtaXQoZXZlbnREYXRhPzogYW55LCBoYW5kbGVyPzogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhbGwgaGFuZGxlcnMgYW5kIGJlaGF2aW9ycyBhdHRhY2hlZCB0byB0aGUgbWF0Y2hlZCBlbGVtZW50cyBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIGV2ZW50VHlwZSBBIHN0cmluZyBjb250YWluaW5nIGEgSmF2YVNjcmlwdCBldmVudCB0eXBlLCBzdWNoIGFzIGNsaWNrIG9yIHN1Ym1pdC4KKyAgICAgKiBAcGFyYW0gZXh0cmFQYXJhbWV0ZXJzIEFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIGFsb25nIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqLworICAgIHRyaWdnZXIoZXZlbnRUeXBlOiBzdHJpbmcsIGV4dHJhUGFyYW1ldGVycz86IGFueVtdfE9iamVjdCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGFsbCBoYW5kbGVycyBhbmQgYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHRoZSBtYXRjaGVkIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZlbnQgQSBqUXVlcnkuRXZlbnQgb2JqZWN0LgorICAgICAqIEBwYXJhbSBleHRyYVBhcmFtZXRlcnMgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgYWxvbmcgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICovCisgICAgdHJpZ2dlcihldmVudDogSlF1ZXJ5RXZlbnRPYmplY3QsIGV4dHJhUGFyYW1ldGVycz86IGFueVtdfE9iamVjdCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYWxsIGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuIGVsZW1lbnQgZm9yIGFuIGV2ZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBldmVudFR5cGUgQSBzdHJpbmcgY29udGFpbmluZyBhIEphdmFTY3JpcHQgZXZlbnQgdHlwZSwgc3VjaCBhcyBjbGljayBvciBzdWJtaXQuCisgICAgICogQHBhcmFtIGV4dHJhUGFyYW1ldGVycyBBbiBhcnJheSBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyBhbG9uZyB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgKi8KKyAgICB0cmlnZ2VySGFuZGxlcihldmVudFR5cGU6IHN0cmluZywgLi4uZXh0cmFQYXJhbWV0ZXJzOiBhbnlbXSk6IE9iamVjdDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByZXZpb3VzbHktYXR0YWNoZWQgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBKYXZhU2NyaXB0IGV2ZW50IHR5cGUsIHN1Y2ggYXMgY2xpY2sgb3Igc3VibWl0LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiB0aGF0IGlzIHRvIGJlIG5vIGxvbmdlciBleGVjdXRlZC4KKyAgICAgKi8KKyAgICB1bmJpbmQoZXZlbnRUeXBlPzogc3RyaW5nLCBoYW5kbGVyPzogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByZXZpb3VzbHktYXR0YWNoZWQgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBKYXZhU2NyaXB0IGV2ZW50IHR5cGUsIHN1Y2ggYXMgY2xpY2sgb3Igc3VibWl0LgorICAgICAqIEBwYXJhbSBmbHMgVW5iaW5kcyB0aGUgY29ycmVzcG9uZGluZyAncmV0dXJuIGZhbHNlJyBmdW5jdGlvbiB0aGF0IHdhcyBib3VuZCB1c2luZyAuYmluZCggZXZlbnRUeXBlLCBmYWxzZSApLgorICAgICAqLworICAgIHVuYmluZChldmVudFR5cGU6IHN0cmluZywgZmxzOiBib29sZWFuKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByZXZpb3VzbHktYXR0YWNoZWQgZXZlbnQgaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0IEEgSmF2YVNjcmlwdCBldmVudCBvYmplY3QgYXMgcGFzc2VkIHRvIGFuIGV2ZW50IGhhbmRsZXIuCisgICAgICovCisgICAgdW5iaW5kKGV2dDogYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgaGFuZGxlciBmcm9tIHRoZSBldmVudCBmb3IgYWxsIGVsZW1lbnRzIHdoaWNoIG1hdGNoIHRoZSBjdXJyZW50IHNlbGVjdG9yLCBiYXNlZCB1cG9uIGEgc3BlY2lmaWMgc2V0IG9mIHJvb3QgZWxlbWVudHMuCisgICAgICovCisgICAgdW5kZWxlZ2F0ZSgpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgaGFuZGxlciBmcm9tIHRoZSBldmVudCBmb3IgYWxsIGVsZW1lbnRzIHdoaWNoIG1hdGNoIHRoZSBjdXJyZW50IHNlbGVjdG9yLCBiYXNlZCB1cG9uIGEgc3BlY2lmaWMgc2V0IG9mIHJvb3QgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3Igd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZXZlbnQgcmVzdWx0cy4KKyAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBKYXZhU2NyaXB0IGV2ZW50IHR5cGUsIHN1Y2ggYXMgImNsaWNrIiBvciAia2V5ZG93biIKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYXQgdGhlIHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICB1bmRlbGVnYXRlKHNlbGVjdG9yOiBzdHJpbmcsIGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyPzogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGhhbmRsZXIgZnJvbSB0aGUgZXZlbnQgZm9yIGFsbCBlbGVtZW50cyB3aGljaCBtYXRjaCB0aGUgY3VycmVudCBzZWxlY3RvciwgYmFzZWQgdXBvbiBhIHNwZWNpZmljIHNldCBvZiByb290IGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGV2ZW50IHJlc3VsdHMuCisgICAgICogQHBhcmFtIGV2ZW50cyBBbiBvYmplY3Qgb2Ygb25lIG9yIG1vcmUgZXZlbnQgdHlwZXMgYW5kIHByZXZpb3VzbHkgYm91bmQgZnVuY3Rpb25zIHRvIHVuYmluZCBmcm9tIHRoZW0uCisgICAgICovCisgICAgdW5kZWxlZ2F0ZShzZWxlY3Rvcjogc3RyaW5nLCBldmVudHM6IE9iamVjdCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBoYW5kbGVyIGZyb20gdGhlIGV2ZW50IGZvciBhbGwgZWxlbWVudHMgd2hpY2ggbWF0Y2ggdGhlIGN1cnJlbnQgc2VsZWN0b3IsIGJhc2VkIHVwb24gYSBzcGVjaWZpYyBzZXQgb2Ygcm9vdCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBuYW1lc3BhY2UgdG8gdW5iaW5kIGFsbCBldmVudHMgZnJvbS4KKyAgICAgKi8KKyAgICB1bmRlbGVnYXRlKG5hbWVzcGFjZTogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQmluZCBhbiBldmVudCBoYW5kbGVyIHRvIHRoZSAidW5sb2FkIiBKYXZhU2NyaXB0IGV2ZW50LiAoREVQUkVDQVRFRCBmcm9tIHYxLjgpCisgICAgICogCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICB1bmxvYWQoaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgInVubG9hZCIgSmF2YVNjcmlwdCBldmVudC4gKERFUFJFQ0FURUQgZnJvbSB2MS44KQorICAgICAqIAorICAgICAqIEBwYXJhbSBldmVudERhdGEgQSBwbGFpbiBvYmplY3Qgb2YgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgdW5sb2FkKGV2ZW50RGF0YT86IGFueSwgaGFuZGxlcj86IChldmVudE9iamVjdDogSlF1ZXJ5RXZlbnRPYmplY3QpID0+IGFueSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFRoZSBET00gbm9kZSBjb250ZXh0IG9yaWdpbmFsbHkgcGFzc2VkIHRvIGpRdWVyeSgpOyBpZiBub25lIHdhcyBwYXNzZWQgdGhlbiBjb250ZXh0IHdpbGwgbGlrZWx5IGJlIHRoZSBkb2N1bWVudC4gKERFUFJFQ0FURUQgZnJvbSB2MS4xMCkKKyAgICAgKi8KKyAgICBjb250ZXh0OiBFbGVtZW50OworCisgICAganF1ZXJ5OiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIGV2ZW50IGhhbmRsZXIgdG8gdGhlICJlcnJvciIgSmF2YVNjcmlwdCBldmVudC4gKERFUFJFQ0FURUQgZnJvbSB2MS44KQorICAgICAqIAorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgZXJyb3IoaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEJpbmQgYW4gZXZlbnQgaGFuZGxlciB0byB0aGUgImVycm9yIiBKYXZhU2NyaXB0IGV2ZW50LiAoREVQUkVDQVRFRCBmcm9tIHYxLjgpCisgICAgICogCisgICAgICogQHBhcmFtIGV2ZW50RGF0YSBBIHBsYWluIG9iamVjdCBvZiBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyAgICAgKi8KKyAgICBlcnJvcihldmVudERhdGE6IGFueSwgaGFuZGxlcjogKGV2ZW50T2JqZWN0OiBKUXVlcnlFdmVudE9iamVjdCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogQWRkIGEgY29sbGVjdGlvbiBvZiBET00gZWxlbWVudHMgb250byB0aGUgalF1ZXJ5IHN0YWNrLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50cyBBbiBhcnJheSBvZiBlbGVtZW50cyB0byBwdXNoIG9udG8gdGhlIHN0YWNrIGFuZCBtYWtlIGludG8gYSBuZXcgalF1ZXJ5IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdXNoU3RhY2soZWxlbWVudHM6IGFueVtdKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEFkZCBhIGNvbGxlY3Rpb24gb2YgRE9NIGVsZW1lbnRzIG9udG8gdGhlIGpRdWVyeSBzdGFjay4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudHMgQW4gYXJyYXkgb2YgZWxlbWVudHMgdG8gcHVzaCBvbnRvIHRoZSBzdGFjayBhbmQgbWFrZSBpbnRvIGEgbmV3IGpRdWVyeSBvYmplY3QuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYSBqUXVlcnkgbWV0aG9kIHRoYXQgZ2VuZXJhdGVkIHRoZSBhcnJheSBvZiBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCBpbiB0byB0aGUgalF1ZXJ5IG1ldGhvZCAoZm9yIHNlcmlhbGl6YXRpb24pLgorICAgICAqLworICAgIHB1c2hTdGFjayhlbGVtZW50czogYW55W10sIG5hbWU6IHN0cmluZywgYXJndW1lbnRzOiBhbnlbXSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEluc2VydCBjb250ZW50LCBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciwgYWZ0ZXIgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBwYXJhbSBjb250ZW50MSBIVE1MIHN0cmluZywgRE9NIGVsZW1lbnQsIGFycmF5IG9mIGVsZW1lbnRzLCBvciBqUXVlcnkgb2JqZWN0IHRvIGluc2VydCBhZnRlciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIHBhcmFtIGNvbnRlbnQyIE9uZSBvciBtb3JlIGFkZGl0aW9uYWwgRE9NIGVsZW1lbnRzLCBhcnJheXMgb2YgZWxlbWVudHMsIEhUTUwgc3RyaW5ncywgb3IgalF1ZXJ5IG9iamVjdHMgdG8gaW5zZXJ0IGFmdGVyIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICovCisgICAgYWZ0ZXIoY29udGVudDE6IEpRdWVyeXxhbnlbXXxFbGVtZW50fFRleHR8c3RyaW5nLCAuLi5jb250ZW50MjogYW55W10pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogSW5zZXJ0IGNvbnRlbnQsIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyLCBhZnRlciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIHBhcmFtIGZ1bmMgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gSFRNTCBzdHJpbmcsIERPTSBlbGVtZW50KHMpLCBvciBqUXVlcnkgb2JqZWN0IHRvIGluc2VydCBhZnRlciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLiBSZWNlaXZlcyB0aGUgaW5kZXggcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHNldCBhcyBhbiBhcmd1bWVudC4gV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhpcyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgc2V0LgorICAgICAqLworICAgIGFmdGVyKGZ1bmM6IChpbmRleDogbnVtYmVyLCBodG1sOiBzdHJpbmcpID0+IHN0cmluZ3xFbGVtZW50fEpRdWVyeSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEluc2VydCBjb250ZW50LCBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciwgdG8gdGhlIGVuZCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIHBhcmFtIGNvbnRlbnQxIERPTSBlbGVtZW50LCBhcnJheSBvZiBlbGVtZW50cywgSFRNTCBzdHJpbmcsIG9yIGpRdWVyeSBvYmplY3QgdG8gaW5zZXJ0IGF0IHRoZSBlbmQgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiBwYXJhbSBjb250ZW50MiBPbmUgb3IgbW9yZSBhZGRpdGlvbmFsIERPTSBlbGVtZW50cywgYXJyYXlzIG9mIGVsZW1lbnRzLCBIVE1MIHN0cmluZ3MsIG9yIGpRdWVyeSBvYmplY3RzIHRvIGluc2VydCBhdCB0aGUgZW5kIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICovCisgICAgYXBwZW5kKGNvbnRlbnQxOiBKUXVlcnl8YW55W118RWxlbWVudHxUZXh0fHN0cmluZywgLi4uY29udGVudDI6IGFueVtdKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEluc2VydCBjb250ZW50LCBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciwgdG8gdGhlIGVuZCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIHBhcmFtIGZ1bmMgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gSFRNTCBzdHJpbmcsIERPTSBlbGVtZW50KHMpLCBvciBqUXVlcnkgb2JqZWN0IHRvIGluc2VydCBhdCB0aGUgZW5kIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuIFJlY2VpdmVzIHRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2V0IGFuZCB0aGUgb2xkIEhUTUwgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYXMgYXJndW1lbnRzLiBXaXRoaW4gdGhlIGZ1bmN0aW9uLCB0aGlzIHJlZmVycyB0byB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBzZXQuCisgICAgICovCisgICAgYXBwZW5kKGZ1bmM6IChpbmRleDogbnVtYmVyLCBodG1sOiBzdHJpbmcpID0+IHN0cmluZ3xFbGVtZW50fEpRdWVyeSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEluc2VydCBldmVyeSBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyB0byB0aGUgZW5kIG9mIHRoZSB0YXJnZXQuCisgICAgICogCisgICAgICogQHBhcmFtIHRhcmdldCBBIHNlbGVjdG9yLCBlbGVtZW50LCBIVE1MIHN0cmluZywgYXJyYXkgb2YgZWxlbWVudHMsIG9yIGpRdWVyeSBvYmplY3Q7IHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB3aWxsIGJlIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQocykgc3BlY2lmaWVkIGJ5IHRoaXMgcGFyYW1ldGVyLgorICAgICAqLworICAgIGFwcGVuZFRvKHRhcmdldDogSlF1ZXJ5fGFueVtdfEVsZW1lbnR8c3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogSW5zZXJ0IGNvbnRlbnQsIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyLCBiZWZvcmUgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBwYXJhbSBjb250ZW50MSBIVE1MIHN0cmluZywgRE9NIGVsZW1lbnQsIGFycmF5IG9mIGVsZW1lbnRzLCBvciBqUXVlcnkgb2JqZWN0IHRvIGluc2VydCBiZWZvcmUgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiBwYXJhbSBjb250ZW50MiBPbmUgb3IgbW9yZSBhZGRpdGlvbmFsIERPTSBlbGVtZW50cywgYXJyYXlzIG9mIGVsZW1lbnRzLCBIVE1MIHN0cmluZ3MsIG9yIGpRdWVyeSBvYmplY3RzIHRvIGluc2VydCBiZWZvcmUgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBiZWZvcmUoY29udGVudDE6IEpRdWVyeXxhbnlbXXxFbGVtZW50fFRleHR8c3RyaW5nLCAuLi5jb250ZW50MjogYW55W10pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogSW5zZXJ0IGNvbnRlbnQsIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyLCBiZWZvcmUgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIEhUTUwgc3RyaW5nLCBET00gZWxlbWVudChzKSwgb3IgalF1ZXJ5IG9iamVjdCB0byBpbnNlcnQgYmVmb3JlIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuIFJlY2VpdmVzIHRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2V0IGFzIGFuIGFyZ3VtZW50LiBXaXRoaW4gdGhlIGZ1bmN0aW9uLCB0aGlzIHJlZmVycyB0byB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBzZXQuCisgICAgICovCisgICAgYmVmb3JlKGZ1bmM6IChpbmRleDogbnVtYmVyLCBodG1sOiBzdHJpbmcpID0+IHN0cmluZ3xFbGVtZW50fEpRdWVyeSk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGRlZXAgY29weSBvZiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICogCisgICAgICogcGFyYW0gd2l0aERhdGFBbmRFdmVudHMgQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBldmVudCBoYW5kbGVycyBhbmQgZGF0YSBzaG91bGQgYmUgY29waWVkIGFsb25nIHdpdGggdGhlIGVsZW1lbnRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKiBwYXJhbSBkZWVwV2l0aERhdGFBbmRFdmVudHMgQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBldmVudCBoYW5kbGVycyBhbmQgZGF0YSBmb3IgYWxsIGNoaWxkcmVuIG9mIHRoZSBjbG9uZWQgZWxlbWVudCBzaG91bGQgYmUgY29waWVkLiBCeSBkZWZhdWx0IGl0cyB2YWx1ZSBtYXRjaGVzIHRoZSBmaXJzdCBhcmd1bWVudCdzIHZhbHVlICh3aGljaCBkZWZhdWx0cyB0byBmYWxzZSkuCisgICAgICovCisgICAgY2xvbmUod2l0aERhdGFBbmRFdmVudHM/OiBib29sZWFuLCBkZWVwV2l0aERhdGFBbmRFdmVudHM/OiBib29sZWFuKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHRoZSBET00uCisgICAgICogCisgICAgICogcGFyYW0gc2VsZWN0b3IgQSBzZWxlY3RvciBleHByZXNzaW9uIHRoYXQgZmlsdGVycyB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBkZXRhY2goc2VsZWN0b3I/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHRoZSBET00uCisgICAgICovCisgICAgZW1wdHkoKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogSW5zZXJ0IGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIGFmdGVyIHRoZSB0YXJnZXQuCisgICAgICogCisgICAgICogcGFyYW0gdGFyZ2V0IEEgc2VsZWN0b3IsIGVsZW1lbnQsIGFycmF5IG9mIGVsZW1lbnRzLCBIVE1MIHN0cmluZywgb3IgalF1ZXJ5IG9iamVjdDsgdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzIHdpbGwgYmUgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGVsZW1lbnQocykgc3BlY2lmaWVkIGJ5IHRoaXMgcGFyYW1ldGVyLgorICAgICAqLworICAgIGluc2VydEFmdGVyKHRhcmdldDogSlF1ZXJ5fGFueVtdfEVsZW1lbnR8VGV4dHxzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgZXZlcnkgZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgYmVmb3JlIHRoZSB0YXJnZXQuCisgICAgICogCisgICAgICogcGFyYW0gdGFyZ2V0IEEgc2VsZWN0b3IsIGVsZW1lbnQsIGFycmF5IG9mIGVsZW1lbnRzLCBIVE1MIHN0cmluZywgb3IgalF1ZXJ5IG9iamVjdDsgdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBlbGVtZW50KHMpIHNwZWNpZmllZCBieSB0aGlzIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBpbnNlcnRCZWZvcmUodGFyZ2V0OiBKUXVlcnl8YW55W118RWxlbWVudHxUZXh0fHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEluc2VydCBjb250ZW50LCBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciwgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIHBhcmFtIGNvbnRlbnQxIERPTSBlbGVtZW50LCBhcnJheSBvZiBlbGVtZW50cywgSFRNTCBzdHJpbmcsIG9yIGpRdWVyeSBvYmplY3QgdG8gaW5zZXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiBwYXJhbSBjb250ZW50MiBPbmUgb3IgbW9yZSBhZGRpdGlvbmFsIERPTSBlbGVtZW50cywgYXJyYXlzIG9mIGVsZW1lbnRzLCBIVE1MIHN0cmluZ3MsIG9yIGpRdWVyeSBvYmplY3RzIHRvIGluc2VydCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICovCisgICAgcHJlcGVuZChjb250ZW50MTogSlF1ZXJ5fGFueVtdfEVsZW1lbnR8VGV4dHxzdHJpbmcsIC4uLmNvbnRlbnQyOiBhbnlbXSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgY29udGVudCwgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXIsIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIEhUTUwgc3RyaW5nLCBET00gZWxlbWVudChzKSwgb3IgalF1ZXJ5IG9iamVjdCB0byBpbnNlcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLiBSZWNlaXZlcyB0aGUgaW5kZXggcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHNldCBhbmQgdGhlIG9sZCBIVE1MIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFzIGFyZ3VtZW50cy4gV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhpcyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgc2V0LgorICAgICAqLworICAgIHByZXBlbmQoZnVuYzogKGluZGV4OiBudW1iZXIsIGh0bWw6IHN0cmluZykgPT4gc3RyaW5nfEVsZW1lbnR8SlF1ZXJ5KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogSW5zZXJ0IGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBhcnJheSBvZiBlbGVtZW50cywgb3IgalF1ZXJ5IG9iamVjdDsgdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZWxlbWVudChzKSBzcGVjaWZpZWQgYnkgdGhpcyBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHJlcGVuZFRvKHRhcmdldDogSlF1ZXJ5fGFueVtdfEVsZW1lbnR8c3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHRoZSBET00uCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0aGF0IGZpbHRlcnMgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHRvIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcmVtb3ZlKHNlbGVjdG9yPzogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBlYWNoIHRhcmdldCBlbGVtZW50IHdpdGggdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0YXJnZXQgQSBzZWxlY3RvciBzdHJpbmcsIGpRdWVyeSBvYmplY3QsIERPTSBlbGVtZW50LCBvciBhcnJheSBvZiBlbGVtZW50cyBpbmRpY2F0aW5nIHdoaWNoIGVsZW1lbnQocykgdG8gcmVwbGFjZS4KKyAgICAgKi8KKyAgICByZXBsYWNlQWxsKHRhcmdldDogSlF1ZXJ5fGFueVtdfEVsZW1lbnR8c3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHdpdGggdGhlIHByb3ZpZGVkIG5ldyBjb250ZW50IGFuZCByZXR1cm4gdGhlIHNldCBvZiBlbGVtZW50cyB0aGF0IHdhcyByZW1vdmVkLgorICAgICAqIAorICAgICAqIHBhcmFtIG5ld0NvbnRlbnQgVGhlIGNvbnRlbnQgdG8gaW5zZXJ0LiBNYXkgYmUgYW4gSFRNTCBzdHJpbmcsIERPTSBlbGVtZW50LCBhcnJheSBvZiBET00gZWxlbWVudHMsIG9yIGpRdWVyeSBvYmplY3QuCisgICAgICovCisgICAgcmVwbGFjZVdpdGgobmV3Q29udGVudDogSlF1ZXJ5fGFueVtdfEVsZW1lbnR8VGV4dHxzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogUmVwbGFjZSBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHdpdGggdGhlIHByb3ZpZGVkIG5ldyBjb250ZW50IGFuZCByZXR1cm4gdGhlIHNldCBvZiBlbGVtZW50cyB0aGF0IHdhcyByZW1vdmVkLgorICAgICAqIAorICAgICAqIHBhcmFtIGZ1bmMgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgY29udGVudCB3aXRoIHdoaWNoIHRvIHJlcGxhY2UgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqLworICAgIHJlcGxhY2VXaXRoKGZ1bmM6ICgpID0+IEVsZW1lbnR8SlF1ZXJ5KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb21iaW5lZCB0ZXh0IGNvbnRlbnRzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIGluY2x1ZGluZyB0aGVpciBkZXNjZW5kYW50cy4KKyAgICAgKi8KKyAgICB0ZXh0KCk6IHN0cmluZzsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyB0byB0aGUgc3BlY2lmaWVkIHRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gc2V0IGFzIHRoZSBjb250ZW50IG9mIGVhY2ggbWF0Y2hlZCBlbGVtZW50LiBXaGVuIE51bWJlciBvciBCb29sZWFuIGlzIHN1cHBsaWVkLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICB0ZXh0KHRleHQ6IHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyB0byB0aGUgc3BlY2lmaWVkIHRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIGZ1bmMgQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHRleHQgY29udGVudCB0byBzZXQuIFJlY2VpdmVzIHRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2V0IGFuZCB0aGUgb2xkIHRleHQgdmFsdWUgYXMgYXJndW1lbnRzLgorICAgICAqLworICAgIHRleHQoZnVuYzogKGluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZykgPT4gc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgYWxsIHRoZSBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIGpRdWVyeSBzZXQsIGFzIGFuIGFycmF5LgorICAgICAqLworICAgIHRvQXJyYXkoKTogYW55W107CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHBhcmVudHMgb2YgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIGZyb20gdGhlIERPTSwgbGVhdmluZyB0aGUgbWF0Y2hlZCBlbGVtZW50cyBpbiB0aGVpciBwbGFjZS4KKyAgICAgKi8KKyAgICB1bndyYXAoKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogV3JhcCBhbiBIVE1MIHN0cnVjdHVyZSBhcm91bmQgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JhcHBpbmdFbGVtZW50IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBvciBqUXVlcnkgb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHN0cnVjdHVyZSB0byB3cmFwIGFyb3VuZCB0aGUgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICB3cmFwKHdyYXBwaW5nRWxlbWVudDogSlF1ZXJ5fEVsZW1lbnR8c3RyaW5nKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFdyYXAgYW4gSFRNTCBzdHJ1Y3R1cmUgYXJvdW5kIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIGZ1bmMgQSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIEhUTUwgY29udGVudCBvciBqUXVlcnkgb2JqZWN0IHRvIHdyYXAgYXJvdW5kIHRoZSBtYXRjaGVkIGVsZW1lbnRzLiBSZWNlaXZlcyB0aGUgaW5kZXggcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHNldCBhcyBhbiBhcmd1bWVudC4gV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhpcyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgc2V0LgorICAgICAqLworICAgIHdyYXAoZnVuYzogKGluZGV4OiBudW1iZXIpID0+IHN0cmluZ3xKUXVlcnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBXcmFwIGFuIEhUTUwgc3RydWN0dXJlIGFyb3VuZCBhbGwgZWxlbWVudHMgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3cmFwcGluZ0VsZW1lbnQgQSBzZWxlY3RvciwgZWxlbWVudCwgSFRNTCBzdHJpbmcsIG9yIGpRdWVyeSBvYmplY3Qgc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIHRvIHdyYXAgYXJvdW5kIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqLworICAgIHdyYXBBbGwod3JhcHBpbmdFbGVtZW50OiBKUXVlcnl8RWxlbWVudHxzdHJpbmcpOiBKUXVlcnk7CisgICAgd3JhcEFsbChmdW5jOiAoaW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogV3JhcCBhbiBIVE1MIHN0cnVjdHVyZSBhcm91bmQgdGhlIGNvbnRlbnQgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JhcHBpbmdFbGVtZW50IEFuIEhUTUwgc25pcHBldCwgc2VsZWN0b3IgZXhwcmVzc2lvbiwgalF1ZXJ5IG9iamVjdCwgb3IgRE9NIGVsZW1lbnQgc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIHRvIHdyYXAgYXJvdW5kIHRoZSBjb250ZW50IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqLworICAgIHdyYXBJbm5lcih3cmFwcGluZ0VsZW1lbnQ6IEpRdWVyeXxFbGVtZW50fHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBXcmFwIGFuIEhUTUwgc3RydWN0dXJlIGFyb3VuZCB0aGUgY29udGVudCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmdW5jIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggZ2VuZXJhdGVzIGEgc3RydWN0dXJlIHRvIHdyYXAgYXJvdW5kIHRoZSBjb250ZW50IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnRzLiBSZWNlaXZlcyB0aGUgaW5kZXggcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHNldCBhcyBhbiBhcmd1bWVudC4gV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhpcyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgc2V0LgorICAgICAqLworICAgIHdyYXBJbm5lcihmdW5jOiAoaW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogSXRlcmF0ZSBvdmVyIGEgalF1ZXJ5IG9iamVjdCwgZXhlY3V0aW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggbWF0Y2hlZCBlbGVtZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBtYXRjaGVkIGVsZW1lbnQuCisgICAgICovCisgICAgZWFjaChmdW5jOiAoaW5kZXg6IG51bWJlciwgZWxlbTogRWxlbWVudCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgb25lIG9mIHRoZSBlbGVtZW50cyBtYXRjaGVkIGJ5IHRoZSBqUXVlcnkgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmRleCBBIHplcm8tYmFzZWQgaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGVsZW1lbnQgdG8gcmV0cmlldmUuCisgICAgICovCisgICAgZ2V0KGluZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudDsKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgZWxlbWVudHMgbWF0Y2hlZCBieSB0aGUgalF1ZXJ5IG9iamVjdC4KKyAgICAgKi8KKyAgICBnZXQoKTogYW55W107CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggZm9yIGEgZ2l2ZW4gZWxlbWVudCBmcm9tIGFtb25nIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqLworICAgIGluZGV4KCk6IG51bWJlcjsKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggZm9yIGEgZ2l2ZW4gZWxlbWVudCBmcm9tIGFtb25nIHRoZSBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHNlbGVjdG9yIHJlcHJlc2VudGluZyBhIGpRdWVyeSBjb2xsZWN0aW9uIGluIHdoaWNoIHRvIGxvb2sgZm9yIGFuIGVsZW1lbnQuCisgICAgICovCisgICAgaW5kZXgoc2VsZWN0b3I6IHN0cmluZ3xKUXVlcnl8RWxlbWVudCk6IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGpRdWVyeSBvYmplY3QuCisgICAgICovCisgICAgbGVuZ3RoOiBudW1iZXI7CisgICAgLyoqCisgICAgICogQSBzZWxlY3RvciByZXByZXNlbnRpbmcgc2VsZWN0b3IgcGFzc2VkIHRvIGpRdWVyeSgpLCBpZiBhbnksIHdoZW4gY3JlYXRpbmcgdGhlIG9yaWdpbmFsIHNldC4KKyAgICAgKiB2ZXJzaW9uIGRlcHJlY2F0ZWQ6IDEuNywgcmVtb3ZlZDogMS45CisgICAgICovCisgICAgc2VsZWN0b3I6IHN0cmluZzsKKyAgICBbaW5kZXg6IHN0cmluZ106IGFueTsKKyAgICBbaW5kZXg6IG51bWJlcl06IEhUTUxFbGVtZW50OworCisgICAgLyoqCisgICAgICogQWRkIGVsZW1lbnRzIHRvIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBmaW5kIGFkZGl0aW9uYWwgZWxlbWVudHMgdG8gYWRkIHRvIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgcG9pbnQgaW4gdGhlIGRvY3VtZW50IGF0IHdoaWNoIHRoZSBzZWxlY3RvciBzaG91bGQgYmVnaW4gbWF0Y2hpbmc7IHNpbWlsYXIgdG8gdGhlIGNvbnRleHQgYXJndW1lbnQgb2YgdGhlICQoc2VsZWN0b3IsIGNvbnRleHQpIG1ldGhvZC4KKyAgICAgKi8KKyAgICBhZGQoc2VsZWN0b3I6IHN0cmluZywgY29udGV4dD86IEVsZW1lbnQpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogQWRkIGVsZW1lbnRzIHRvIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudHMgT25lIG9yIG1vcmUgZWxlbWVudHMgdG8gYWRkIHRvIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBhZGQoLi4uZWxlbWVudHM6IEVsZW1lbnRbXSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBBZGQgZWxlbWVudHMgdG8gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBodG1sIEFuIEhUTUwgZnJhZ21lbnQgdG8gYWRkIHRvIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBhZGQoaHRtbDogc3RyaW5nKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEFkZCBlbGVtZW50cyB0byB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBBbiBleGlzdGluZyBqUXVlcnkgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICovCisgICAgYWRkKG9iajogSlF1ZXJ5KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjaGlsZHJlbiBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGEgc2VsZWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgY2hpbGRyZW4oc2VsZWN0b3I/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQsIGdldCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIGJ5IHRlc3RpbmcgdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCB0cmF2ZXJzaW5nIHVwIHRocm91Z2ggaXRzIGFuY2VzdG9ycyBpbiB0aGUgRE9NIHRyZWUuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgY2xvc2VzdChzZWxlY3Rvcjogc3RyaW5nKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCwgZ2V0IHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgYnkgdGVzdGluZyB0aGUgZWxlbWVudCBpdHNlbGYgYW5kIHRyYXZlcnNpbmcgdXAgdGhyb3VnaCBpdHMgYW5jZXN0b3JzIGluIHRoZSBET00gdHJlZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCBhIG1hdGNoaW5nIGVsZW1lbnQgbWF5IGJlIGZvdW5kLiBJZiBubyBjb250ZXh0IGlzIHBhc3NlZCBpbiB0aGVuIHRoZSBjb250ZXh0IG9mIHRoZSBqUXVlcnkgc2V0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAqLworICAgIGNsb3Nlc3Qoc2VsZWN0b3I6IHN0cmluZywgY29udGV4dD86IEVsZW1lbnQpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogRm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0LCBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciBieSB0ZXN0aW5nIHRoZSBlbGVtZW50IGl0c2VsZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoIGl0cyBhbmNlc3RvcnMgaW4gdGhlIERPTSB0cmVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogQSBqUXVlcnkgb2JqZWN0IHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgY2xvc2VzdChvYmo6IEpRdWVyeSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQsIGdldCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIGJ5IHRlc3RpbmcgdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCB0cmF2ZXJzaW5nIHVwIHRocm91Z2ggaXRzIGFuY2VzdG9ycyBpbiB0aGUgRE9NIHRyZWUuCisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnQgQW4gZWxlbWVudCB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIGNsb3Nlc3QoZWxlbWVudDogRWxlbWVudCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEdldCBhbiBhcnJheSBvZiBhbGwgdGhlIGVsZW1lbnRzIGFuZCBzZWxlY3RvcnMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBjdXJyZW50IGVsZW1lbnQgdXAgdGhyb3VnaCB0aGUgRE9NIHRyZWUuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9ycyBBbiBhcnJheSBvciBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdCAoY2FuIGFsc28gYmUgYSBqUXVlcnkgb2JqZWN0KS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCBhIG1hdGNoaW5nIGVsZW1lbnQgbWF5IGJlIGZvdW5kLiBJZiBubyBjb250ZXh0IGlzIHBhc3NlZCBpbiB0aGVuIHRoZSBjb250ZXh0IG9mIHRoZSBqUXVlcnkgc2V0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAqLworICAgIGNsb3Nlc3Qoc2VsZWN0b3JzOiBhbnksIGNvbnRleHQ/OiBFbGVtZW50KTogYW55W107CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNoaWxkcmVuIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIGluY2x1ZGluZyB0ZXh0IGFuZCBjb21tZW50IG5vZGVzLgorICAgICAqLworICAgIGNvbnRlbnRzKCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEVuZCB0aGUgbW9zdCByZWNlbnQgZmlsdGVyaW5nIG9wZXJhdGlvbiBpbiB0aGUgY3VycmVudCBjaGFpbiBhbmQgcmV0dXJuIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cyB0byBpdHMgcHJldmlvdXMgc3RhdGUuCisgICAgICovCisgICAgZW5kKCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFJlZHVjZSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgdG8gdGhlIG9uZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmRleCBBbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIDAtYmFzZWQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuIE9SIEFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQsIGNvdW50aW5nIGJhY2t3YXJkcyBmcm9tIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHNldC4KKyAgICAgKiAgCisgICAgICovCisgICAgZXEoaW5kZXg6IG51bWJlcik6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFJlZHVjZSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgdG8gdGhvc2UgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3Igb3IgcGFzcyB0aGUgZnVuY3Rpb24ncyB0ZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBtYXRjaCB0aGUgY3VycmVudCBzZXQgb2YgZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBmaWx0ZXIoc2VsZWN0b3I6IHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZWR1Y2UgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHRvIHRob3NlIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIG9yIHBhc3MgdGhlIGZ1bmN0aW9uJ3MgdGVzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnVuYyBBIGZ1bmN0aW9uIHVzZWQgYXMgYSB0ZXN0IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldC4gdGhpcyBpcyB0aGUgY3VycmVudCBET00gZWxlbWVudC4KKyAgICAgKi8KKyAgICBmaWx0ZXIoZnVuYzogKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IEVsZW1lbnQpID0+IGFueSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZWR1Y2UgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHRvIHRob3NlIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIG9yIHBhc3MgdGhlIGZ1bmN0aW9uJ3MgdGVzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudCBBbiBlbGVtZW50IHRvIG1hdGNoIHRoZSBjdXJyZW50IHNldCBvZiBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIGZpbHRlcihlbGVtZW50OiBFbGVtZW50KTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJlZHVjZSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgdG8gdGhvc2UgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3Igb3IgcGFzcyB0aGUgZnVuY3Rpb24ncyB0ZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogQW4gZXhpc3RpbmcgalF1ZXJ5IG9iamVjdCB0byBtYXRjaCB0aGUgY3VycmVudCBzZXQgb2YgZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBmaWx0ZXIob2JqOiBKUXVlcnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlc2NlbmRhbnRzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgY3VycmVudCBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgZmlsdGVyZWQgYnkgYSBzZWxlY3RvciwgalF1ZXJ5IG9iamVjdCwgb3IgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBmaW5kKHNlbGVjdG9yOiBzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZXNjZW5kYW50cyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIGZpbHRlcmVkIGJ5IGEgc2VsZWN0b3IsIGpRdWVyeSBvYmplY3QsIG9yIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnQgQW4gZWxlbWVudCB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIGZpbmQoZWxlbWVudDogRWxlbWVudCk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlc2NlbmRhbnRzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgY3VycmVudCBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgZmlsdGVyZWQgYnkgYSBzZWxlY3RvciwgalF1ZXJ5IG9iamVjdCwgb3IgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqIEEgalF1ZXJ5IG9iamVjdCB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIGZpbmQob2JqOiBKUXVlcnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBSZWR1Y2UgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHRvIHRoZSBmaXJzdCBpbiB0aGUgc2V0LgorICAgICAqLworICAgIGZpcnN0KCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFJlZHVjZSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgdG8gdGhvc2UgdGhhdCBoYXZlIGEgZGVzY2VuZGFudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIG9yIERPTSBlbGVtZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIGhhcyhzZWxlY3Rvcjogc3RyaW5nKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIFJlZHVjZSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgdG8gdGhvc2UgdGhhdCBoYXZlIGEgZGVzY2VuZGFudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIG9yIERPTSBlbGVtZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZWQgQSBET00gZWxlbWVudCB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIGhhcyhjb250YWluZWQ6IEVsZW1lbnQpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyBhZ2FpbnN0IGEgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIGpRdWVyeSBvYmplY3QgYW5kIHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBlbGVtZW50cyBtYXRjaGVzIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgaXMoc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW47CisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGN1cnJlbnQgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMgYWdhaW5zdCBhIHNlbGVjdG9yLCBlbGVtZW50LCBvciBqUXVlcnkgb2JqZWN0IGFuZCByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgZWxlbWVudHMgbWF0Y2hlcyB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gdXNlZCBhcyBhIHRlc3QgZm9yIHRoZSBzZXQgb2YgZWxlbWVudHMuIEl0IGFjY2VwdHMgb25lIGFyZ3VtZW50LCBpbmRleCwgd2hpY2ggaXMgdGhlIGVsZW1lbnQncyBpbmRleCBpbiB0aGUgalF1ZXJ5IGNvbGxlY3Rpb24uV2l0aGluIHRoZSBmdW5jdGlvbiwgdGhpcyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgRE9NIGVsZW1lbnQuCisgICAgICovCisgICAgaXMoZnVuYzogKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IEVsZW1lbnQpID0+IGJvb2xlYW4pOiBib29sZWFuOworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjdXJyZW50IG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzIGFnYWluc3QgYSBzZWxlY3RvciwgZWxlbWVudCwgb3IgalF1ZXJ5IG9iamVjdCBhbmQgcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIGVsZW1lbnRzIG1hdGNoZXMgdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqIEFuIGV4aXN0aW5nIGpRdWVyeSBvYmplY3QgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc2V0IG9mIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgaXMob2JqOiBKUXVlcnkpOiBib29sZWFuOworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjdXJyZW50IG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzIGFnYWluc3QgYSBzZWxlY3RvciwgZWxlbWVudCwgb3IgalF1ZXJ5IG9iamVjdCBhbmQgcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIGVsZW1lbnRzIG1hdGNoZXMgdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudHMgT25lIG9yIG1vcmUgZWxlbWVudHMgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc2V0IG9mIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgaXMoZWxlbWVudHM6IGFueSk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBSZWR1Y2UgdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzIHRvIHRoZSBmaW5hbCBvbmUgaW4gdGhlIHNldC4KKyAgICAgKi8KKyAgICBsYXN0KCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFBhc3MgZWFjaCBlbGVtZW50IGluIHRoZSBjdXJyZW50IG1hdGNoZWQgc2V0IHRocm91Z2ggYSBmdW5jdGlvbiwgcHJvZHVjaW5nIGEgbmV3IGpRdWVyeSBvYmplY3QgY29udGFpbmluZyB0aGUgcmV0dXJuIHZhbHVlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgY3VycmVudCBzZXQuCisgICAgICovCisgICAgbWFwKGNhbGxiYWNrOiAoaW5kZXg6IG51bWJlciwgZG9tRWxlbWVudDogRWxlbWVudCkgPT4gYW55KTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgc2libGluZyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLiBJZiBhIHNlbGVjdG9yIGlzIHByb3ZpZGVkLCBpdCByZXRyaWV2ZXMgdGhlIG5leHQgc2libGluZyBvbmx5IGlmIGl0IG1hdGNoZXMgdGhhdCBzZWxlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBuZXh0KHNlbGVjdG9yPzogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IGFsbCBmb2xsb3dpbmcgc2libGluZ3Mgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhIHNlbGVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIG5leHRBbGwoc2VsZWN0b3I/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGZvbGxvd2luZyBzaWJsaW5ncyBvZiBlYWNoIGVsZW1lbnQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGVsZW1lbnQgbWF0Y2hlZCBieSB0aGUgc2VsZWN0b3IsIERPTSBub2RlLCBvciBqUXVlcnkgb2JqZWN0IHBhc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gaW5kaWNhdGUgd2hlcmUgdG8gc3RvcCBtYXRjaGluZyBmb2xsb3dpbmcgc2libGluZyBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgbmV4dFVudGlsKHNlbGVjdG9yPzogc3RyaW5nLCBmaWx0ZXI/OiBzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogR2V0IGFsbCBmb2xsb3dpbmcgc2libGluZ3Mgb2YgZWFjaCBlbGVtZW50IHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBlbGVtZW50IG1hdGNoZWQgYnkgdGhlIHNlbGVjdG9yLCBET00gbm9kZSwgb3IgalF1ZXJ5IG9iamVjdCBwYXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnQgQSBET00gbm9kZSBvciBqUXVlcnkgb2JqZWN0IGluZGljYXRpbmcgd2hlcmUgdG8gc3RvcCBtYXRjaGluZyBmb2xsb3dpbmcgc2libGluZyBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgbmV4dFVudGlsKGVsZW1lbnQ/OiBFbGVtZW50LCBmaWx0ZXI/OiBzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogR2V0IGFsbCBmb2xsb3dpbmcgc2libGluZ3Mgb2YgZWFjaCBlbGVtZW50IHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBlbGVtZW50IG1hdGNoZWQgYnkgdGhlIHNlbGVjdG9yLCBET00gbm9kZSwgb3IgalF1ZXJ5IG9iamVjdCBwYXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBBIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgaW5kaWNhdGluZyB3aGVyZSB0byBzdG9wIG1hdGNoaW5nIGZvbGxvd2luZyBzaWJsaW5nIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBmaWx0ZXIgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBuZXh0VW50aWwob2JqPzogSlF1ZXJ5LCBmaWx0ZXI/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgbm90KHNlbGVjdG9yOiBzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogUmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gdXNlZCBhcyBhIHRlc3QgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0LiB0aGlzIGlzIHRoZSBjdXJyZW50IERPTSBlbGVtZW50LgorICAgICAqLworICAgIG5vdChmdW5jOiAoaW5kZXg6IG51bWJlciwgZWxlbWVudDogRWxlbWVudCkgPT4gYm9vbGVhbik6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnRzIE9uZSBvciBtb3JlIERPTSBlbGVtZW50cyB0byByZW1vdmUgZnJvbSB0aGUgbWF0Y2hlZCBzZXQuCisgICAgICovCisgICAgbm90KC4uLmVsZW1lbnRzOiBFbGVtZW50W10pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogUmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogQW4gZXhpc3RpbmcgalF1ZXJ5IG9iamVjdCB0byBtYXRjaCB0aGUgY3VycmVudCBzZXQgb2YgZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBub3Qob2JqOiBKUXVlcnkpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgZWxlbWVudCB0aGF0IGlzIHBvc2l0aW9uZWQuCisgICAgICovCisgICAgb2Zmc2V0UGFyZW50KCk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyZW50IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgY3VycmVudCBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhIHNlbGVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIHBhcmVudChzZWxlY3Rvcj86IHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYW5jZXN0b3JzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgY3VycmVudCBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhIHNlbGVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIHBhcmVudHMoc2VsZWN0b3I/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFuY2VzdG9ycyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBlbGVtZW50IG1hdGNoZWQgYnkgdGhlIHNlbGVjdG9yLCBET00gbm9kZSwgb3IgalF1ZXJ5IG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gaW5kaWNhdGUgd2hlcmUgdG8gc3RvcCBtYXRjaGluZyBhbmNlc3RvciBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgcGFyZW50c1VudGlsKHNlbGVjdG9yPzogc3RyaW5nLCBmaWx0ZXI/OiBzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbmNlc3RvcnMgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBjdXJyZW50IHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgZWxlbWVudCBtYXRjaGVkIGJ5IHRoZSBzZWxlY3RvciwgRE9NIG5vZGUsIG9yIGpRdWVyeSBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIGVsZW1lbnQgQSBET00gbm9kZSBvciBqUXVlcnkgb2JqZWN0IGluZGljYXRpbmcgd2hlcmUgdG8gc3RvcCBtYXRjaGluZyBhbmNlc3RvciBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxlY3RvciBleHByZXNzaW9uIHRvIG1hdGNoIGVsZW1lbnRzIGFnYWluc3QuCisgICAgICovCisgICAgcGFyZW50c1VudGlsKGVsZW1lbnQ/OiBFbGVtZW50LCBmaWx0ZXI/OiBzdHJpbmcpOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbmNlc3RvcnMgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBjdXJyZW50IHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgZWxlbWVudCBtYXRjaGVkIGJ5IHRoZSBzZWxlY3RvciwgRE9NIG5vZGUsIG9yIGpRdWVyeSBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBBIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgaW5kaWNhdGluZyB3aGVyZSB0byBzdG9wIG1hdGNoaW5nIGFuY2VzdG9yIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBmaWx0ZXIgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwYXJlbnRzVW50aWwob2JqPzogSlF1ZXJ5LCBmaWx0ZXI/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBzaWJsaW5nIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgYSBzZWxlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwcmV2KHNlbGVjdG9yPzogc3RyaW5nKTogSlF1ZXJ5OworCisgICAgLyoqCisgICAgICogR2V0IGFsbCBwcmVjZWRpbmcgc2libGluZ3Mgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQgb2YgbWF0Y2hlZCBlbGVtZW50cywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBhIHNlbGVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIHByZXZBbGwoc2VsZWN0b3I/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHByZWNlZGluZyBzaWJsaW5ncyBvZiBlYWNoIGVsZW1lbnQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGVsZW1lbnQgbWF0Y2hlZCBieSB0aGUgc2VsZWN0b3IsIERPTSBub2RlLCBvciBqUXVlcnkgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBpbmRpY2F0ZSB3aGVyZSB0byBzdG9wIG1hdGNoaW5nIHByZWNlZGluZyBzaWJsaW5nIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBmaWx0ZXIgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwcmV2VW50aWwoc2VsZWN0b3I/OiBzdHJpbmcsIGZpbHRlcj86IHN0cmluZyk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHByZWNlZGluZyBzaWJsaW5ncyBvZiBlYWNoIGVsZW1lbnQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGVsZW1lbnQgbWF0Y2hlZCBieSB0aGUgc2VsZWN0b3IsIERPTSBub2RlLCBvciBqUXVlcnkgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbGVtZW50IEEgRE9NIG5vZGUgb3IgalF1ZXJ5IG9iamVjdCBpbmRpY2F0aW5nIHdoZXJlIHRvIHN0b3AgbWF0Y2hpbmcgcHJlY2VkaW5nIHNpYmxpbmcgZWxlbWVudHMuCisgICAgICogQHBhcmFtIGZpbHRlciBBIHN0cmluZyBjb250YWluaW5nIGEgc2VsZWN0b3IgZXhwcmVzc2lvbiB0byBtYXRjaCBlbGVtZW50cyBhZ2FpbnN0LgorICAgICAqLworICAgIHByZXZVbnRpbChlbGVtZW50PzogRWxlbWVudCwgZmlsdGVyPzogc3RyaW5nKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIEdldCBhbGwgcHJlY2VkaW5nIHNpYmxpbmdzIG9mIGVhY2ggZWxlbWVudCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgZWxlbWVudCBtYXRjaGVkIGJ5IHRoZSBzZWxlY3RvciwgRE9NIG5vZGUsIG9yIGpRdWVyeSBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBBIERPTSBub2RlIG9yIGpRdWVyeSBvYmplY3QgaW5kaWNhdGluZyB3aGVyZSB0byBzdG9wIG1hdGNoaW5nIHByZWNlZGluZyBzaWJsaW5nIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBmaWx0ZXIgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwcmV2VW50aWwob2JqPzogSlF1ZXJ5LCBmaWx0ZXI/OiBzdHJpbmcpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNpYmxpbmdzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgYSBzZWxlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSBzdHJpbmcgY29udGFpbmluZyBhIHNlbGVjdG9yIGV4cHJlc3Npb24gdG8gbWF0Y2ggZWxlbWVudHMgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBzaWJsaW5ncyhzZWxlY3Rvcj86IHN0cmluZyk6IEpRdWVyeTsKKworICAgIC8qKgorICAgICAqIFJlZHVjZSB0aGUgc2V0IG9mIG1hdGNoZWQgZWxlbWVudHMgdG8gYSBzdWJzZXQgc3BlY2lmaWVkIGJ5IGEgcmFuZ2Ugb2YgaW5kaWNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RhcnQgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSAwLWJhc2VkIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBlbGVtZW50cyBiZWdpbiB0byBiZSBzZWxlY3RlZC4gSWYgbmVnYXRpdmUsIGl0IGluZGljYXRlcyBhbiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIHRoZSBzZXQuCisgICAgICogQHBhcmFtIGVuZCBBbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIDAtYmFzZWQgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGVsZW1lbnRzIHN0b3AgYmVpbmcgc2VsZWN0ZWQuIElmIG5lZ2F0aXZlLCBpdCBpbmRpY2F0ZXMgYW4gb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUgc2V0LiBJZiBvbWl0dGVkLCB0aGUgcmFuZ2UgY29udGludWVzIHVudGlsIHRoZSBlbmQgb2YgdGhlIHNldC4KKyAgICAgKi8KKyAgICBzbGljZShzdGFydDogbnVtYmVyLCBlbmQ/OiBudW1iZXIpOiBKUXVlcnk7CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBxdWV1ZSBvZiBmdW5jdGlvbnMgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIG1hdGNoZWQgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIHF1ZXVlTmFtZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBxdWV1ZS4gRGVmYXVsdHMgdG8gZngsIHRoZSBzdGFuZGFyZCBlZmZlY3RzIHF1ZXVlLgorICAgICAqLworICAgIHF1ZXVlKHF1ZXVlTmFtZT86IHN0cmluZyk6IGFueVtdOworICAgIC8qKgorICAgICAqIE1hbmlwdWxhdGUgdGhlIHF1ZXVlIG9mIGZ1bmN0aW9ucyB0byBiZSBleGVjdXRlZCwgb25jZSBmb3IgZWFjaCBtYXRjaGVkIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIG5ld1F1ZXVlIEFuIGFycmF5IG9mIGZ1bmN0aW9ucyB0byByZXBsYWNlIHRoZSBjdXJyZW50IHF1ZXVlIGNvbnRlbnRzLgorICAgICAqLworICAgIHF1ZXVlKG5ld1F1ZXVlOiBGdW5jdGlvbltdKTogSlF1ZXJ5OworICAgIC8qKgorICAgICAqIE1hbmlwdWxhdGUgdGhlIHF1ZXVlIG9mIGZ1bmN0aW9ucyB0byBiZSBleGVjdXRlZCwgb25jZSBmb3IgZWFjaCBtYXRjaGVkIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBuZXcgZnVuY3Rpb24gdG8gYWRkIHRvIHRoZSBxdWV1ZSwgd2l0aCBhIGZ1bmN0aW9uIHRvIGNhbGwgdGhhdCB3aWxsIGRlcXVldWUgdGhlIG5leHQgaXRlbS4KKyAgICAgKi8KKyAgICBxdWV1ZShjYWxsYmFjazogRnVuY3Rpb24pOiBKUXVlcnk7CisgICAgLyoqCisgICAgICogTWFuaXB1bGF0ZSB0aGUgcXVldWUgb2YgZnVuY3Rpb25zIHRvIGJlIGV4ZWN1dGVkLCBvbmNlIGZvciBlYWNoIG1hdGNoZWQgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcXVldWVOYW1lIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHF1ZXVlLiBEZWZhdWx0cyB0byBmeCwgdGhlIHN0YW5kYXJkIGVmZmVjdHMgcXVldWUuCisgICAgICogQHBhcmFtIG5ld1F1ZXVlIEFuIGFycmF5IG9mIGZ1bmN0aW9ucyB0byByZXBsYWNlIHRoZSBjdXJyZW50IHF1ZXVlIGNvbnRlbnRzLgorICAgICAqLworICAgIHF1ZXVlKHF1ZXVlTmFtZTogc3RyaW5nLCBuZXdRdWV1ZTogRnVuY3Rpb25bXSk6IEpRdWVyeTsKKyAgICAvKioKKyAgICAgKiBNYW5pcHVsYXRlIHRoZSBxdWV1ZSBvZiBmdW5jdGlvbnMgdG8gYmUgZXhlY3V0ZWQsIG9uY2UgZm9yIGVhY2ggbWF0Y2hlZCBlbGVtZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBxdWV1ZU5hbWUgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgcXVldWUuIERlZmF1bHRzIHRvIGZ4LCB0aGUgc3RhbmRhcmQgZWZmZWN0cyBxdWV1ZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIG5ldyBmdW5jdGlvbiB0byBhZGQgdG8gdGhlIHF1ZXVlLCB3aXRoIGEgZnVuY3Rpb24gdG8gY2FsbCB0aGF0IHdpbGwgZGVxdWV1ZSB0aGUgbmV4dCBpdGVtLgorICAgICAqLworICAgIHF1ZXVlKHF1ZXVlTmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiBKUXVlcnk7Cit9CitkZWNsYXJlIG1vZHVsZSAianF1ZXJ5IiB7CisgICAgZXhwb3J0ID0gJDsKK30KK2RlY2xhcmUgdmFyIGpRdWVyeTogSlF1ZXJ5U3RhdGljOworZGVjbGFyZSB2YXIgJDogSlF1ZXJ5U3RhdGljOwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2pzTWQ1L21kNS5kLnRzIGIvY2F0YWxvZy11aS90eXBpbmdzL2pzTWQ1L21kNS5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDZhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3R5cGluZ3MvanNNZDUvbWQ1LmQudHMKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGpzLW1kNSB2MC4zLjAKKy8vIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtbWQ1CisvLyBEZWZpbml0aW9ucyBieTogUm9sYW5kIEdyZWltIDxodHRwczovL2dpdGh1Yi5jb20vdGlnZXJ4eT4KKy8vIERlZmluaXRpb25zOiBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC8KKworLy8vIDxyZWZlcmVuY2UgcGF0aD0iLi4vanF1ZXJ5L2pxdWVyeS5kLnRzIi8+CisKK2ludGVyZmFjZSBKUXVlcnkgeworICAgIG1kNSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nOworICAgIG1kNSh2YWx1ZTogQXJyYXk8YW55Pik6IHN0cmluZzsKKyAgICBtZDUodmFsdWU6IFVpbnQ4QXJyYXkpOiBzdHJpbmc7Cit9CisKK2ludGVyZmFjZSBKUXVlcnlTdGF0aWMgeworICAgIG1kNSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nOworICAgIG1kNSh2YWx1ZTogQXJyYXk8YW55Pik6IHN0cmluZzsKKyAgICBtZDUodmFsdWU6IFVpbnQ4QXJyYXkpOiBzdHJpbmc7Cit9CisKK2ludGVyZmFjZSBtZDUgeworICAgICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nOworICAgICh2YWx1ZTogQXJyYXk8YW55Pik6IHN0cmluZzsKKyAgICAodmFsdWU6IFVpbnQ4QXJyYXkpOiBzdHJpbmc7Cit9CisKK2ludGVyZmFjZSBTdHJpbmcgeworICAgIG1kNSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nOworICAgIG1kNSh2YWx1ZTogQXJyYXk8YW55Pik6IHN0cmluZzsKKyAgICBtZDUodmFsdWU6IFVpbnQ4QXJyYXkpOiBzdHJpbmc7Cit9CisKK2RlY2xhcmUgbW9kdWxlICJqcy1tZDUiIHsKKyAgICBleHBvcnQgPSBtZDU7Cit9CisKK2RlY2xhcmUgdmFyIG1kNTogbWQ1OwpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL2xvZGFzaC9sb2Rhc2guZC50cyBiL2NhdGFsb2ctdWkvdHlwaW5ncy9sb2Rhc2gvbG9kYXNoLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyMzk4MgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvdHlwaW5ncy9sb2Rhc2gvbG9kYXNoLmQudHMKQEAgLTAsMCArMSwyMjk0OSBAQAorLy8gVHlwZSBkZWZpbml0aW9ucyBmb3IgTG8tRGFzaCA0LjE0CisvLyBQcm9qZWN0OiBodHRwOi8vbG9kYXNoLmNvbS8KKy8vIERlZmluaXRpb25zIGJ5OiBCcmlhbiBaZW5nZWwgPGh0dHBzOi8vZ2l0aHViLmNvbS9iY3plbmdlbD4sIElseWEgTW9jaGFsb3YgPGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJvb3RzdT4sIFN0ZXBhbiBNaWtoYXlseXVrIDxodHRwczovL2dpdGh1Yi5jb20vc3RlcGFuY2FyPgorLy8gRGVmaW5pdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkCisKKworLyoqCisgIyMjIDQuMC4wIENoYW5nZWxvZyAoaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvd2lraS9DaGFuZ2Vsb2cpCisKKyAjIyMjIFRPRE86CisgcmVtb3ZlZDoKKyAtIFt4XSBSZW1vdmVkIF8uc3VwcG9ydAorIC0gW3hdIFJlbW92ZWQgXy5maW5kV2hlcmUgaW4gZmF2b3Igb2YgXy5maW5kIHdpdGggaXRlcmF0ZWUgc2hvcnRoYW5kCisgLSBbeF0gUmVtb3ZlZCBfLndoZXJlIGluIGZhdm9yIG9mIF8uZmlsdGVyIHdpdGggaXRlcmF0ZWUgc2hvcnRoYW5kCisgLSBbeF0gUmVtb3ZlZCBfLnBsdWNrIGluIGZhdm9yIG9mIF8ubWFwIHdpdGggaXRlcmF0ZWUgc2hvcnRoYW5kCisKKyByZW5hbWVkOgorIC0gW3hdIFJlbmFtZWQgXy5maXJzdCB0byBfLmhlYWQKKyAtIFt4XSBSZW5hbWVkIF8uaW5kZXhCeSB0byBfLmtleUJ5CisgLSBbeF0gUmVuYW1lZCBfLmludm9rZSB0byBfLmludm9rZU1hcAorIC0gW3hdIFJlbmFtZWQgXy5vdmVyQXJncyB0byBfLm92ZXJBcmdzCisgLSBbeF0gUmVuYW1lZCBfLnBhZExlZnQgJiBfLnBhZFJpZ2h0IHRvIF8ucGFkU3RhcnQgJiBfLnBhZEVuZAorIC0gW3hdIFJlbmFtZWQgXy5wYWlycyB0byBfLnRvUGFpcnMKKyAtIFt4XSBSZW5hbWVkIF8ucmVzdCB0byBfLnRhaWwKKyAtIFt4XSBSZW5hbWVkIF8ucmVzdFBhcmFtIHRvIF8ucmVzdAorIC0gW3hdIFJlbmFtZWQgXy5zb3J0QnlPcmRlciB0byBfLm9yZGVyQnkKKyAtIFt4XSBSZW5hbWVkIF8udHJpbUxlZnQgJiBfLnRyaW1SaWdodCB0byBfLnRyaW1TdGFydCAmIF8udHJpbUVuZAorIC0gW3hdIFJlbmFtZWQgXy50cnVuYyB0byBfLnRydW5jYXRlCisKKyBzcGxpdDoKKyAtIFt4XSBTcGxpdCBfLmluZGV4T2YgJiBfLmxhc3RJbmRleE9mIGludG8gXy5zb3J0ZWRJbmRleE9mICYgXy5zb3J0ZWRMYXN0SW5kZXhPZgorIC0gW3hdIFNwbGl0IF8ubWF4ICYgXy5taW4gaW50byBfLm1heEJ5ICYgXy5taW5CeQorIC0gW3hdIFNwbGl0IF8ub21pdCAmIF8ucGljayBpbnRvIF8ub21pdEJ5ICYgXy5waWNrQnkKKyAtIFt4XSBTcGxpdCBfLnNhbXBsZSBpbnRvIF8uc2FtcGxlU2l6ZQorIC0gW3hdIFNwbGl0IF8uc29ydGVkSW5kZXggaW50byBfLnNvcnRlZEluZGV4QnkKKyAtIFt4XSBTcGxpdCBfLnNvcnRlZExhc3RJbmRleCBpbnRvIF8uc29ydGVkTGFzdEluZGV4QnkKKyAtIFt4XSBTcGxpdCBfLnVuaXEgaW50byBfLnNvcnRlZFVuaXEsIF8uc29ydGVkVW5pcUJ5LCAmIF8udW5pcUJ5CisKKyBjaGFuZ2VzOgorIC0gW3hdIEFic29yYmVkIF8uc29ydEJ5QWxsIGludG8gXy5zb3J0QnkKKyAtIFt4XSBDaGFuZ2VkIHRoZSBjYXRlZ29yeSBvZiBfLmF0IHRvIOKAnE9iamVjdOKAnQorIC0gW3hdIENoYW5nZWQgdGhlIGNhdGVnb3J5IG9mIF8uYmluZEFsbCB0byDigJxVdGlsaXR54oCdCisgLSBbeF0gTWFkZSBfLmNhcGl0YWxpemUgdXBwZXJjYXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgJiBsb3dlcmNhc2UgdGhlIHJlc3QKKyAtIFt4XSBNYWRlIF8uZnVuY3Rpb25zIHJldHVybiBvbmx5IG93biBtZXRob2QgbmFtZXMKKworCisgYWRkZWQgMjMgYXJyYXkgbWV0aG9kczoKKyAtIFt4XSBfLmNvbmNhdAorIC0gW3hdIF8uZGlmZmVyZW5jZUJ5CisgLSBbeF0gXy5kaWZmZXJlbmNlV2l0aAorIC0gW3hdIF8uZmxhdE1hcAorIC0gW3hdIF8uZnJvbVBhaXJzCisgLSBbeF0gXy5pbnRlcnNlY3Rpb25CeQorIC0gW3hdIF8uaW50ZXJzZWN0aW9uV2l0aAorIC0gW3hdIF8uam9pbgorIC0gW3hdIF8ucHVsbEFsbAorIC0gW3hdIF8ucHVsbEFsbEJ5CisgLSBbeF0gXy5yZXZlcnNlCisgLSBbeF0gXy5zb3J0ZWRJbmRleEJ5CisgLSBbeF0gXy5zb3J0ZWRJbmRleE9mCisgLSBbeF0gXy5zb3J0ZWRMYXN0SW5kZXhCeQorIC0gW3hdIF8uc29ydGVkTGFzdEluZGV4T2YKKyAtIFt4XSBfLnNvcnRlZFVuaXEKKyAtIFt4XSBfLnNvcnRlZFVuaXFCeQorIC0gW3hdIF8udW5pb25CeQorIC0gW3hdIF8udW5pb25XaXRoCisgLSBbeF0gXy51bmlxQnkKKyAtIFt4XSBfLnVuaXFXaXRoCisgLSBbeF0gXy54b3JCeQorIC0gW3hdIF8ueG9yV2l0aAorCisgYWRkZWQgMTggbGFuZyBtZXRob2RzOgorIC0gW3hdIF8uY2xvbmVEZWVwV2l0aAorIC0gW3hdIF8uY2xvbmVXaXRoCisgLSBbeF0gXy5lcQorIC0gW3hdIF8uaXNBcnJheUxpa2UKKyAtIFt4XSBfLmlzQXJyYXlMaWtlT2JqZWN0CisgLSBbeF0gXy5pc0VxdWFsV2l0aAorIC0gW3hdIF8uaXNJbnRlZ2VyCisgLSBbeF0gXy5pc0xlbmd0aAorIC0gW3hdIF8uaXNNYXRjaFdpdGgKKyAtIFt4XSBfLmlzTmlsCisgLSBbeF0gXy5pc09iamVjdExpa2UKKyAtIFt4XSBfLmlzU2FmZUludGVnZXIKKyAtIFt4XSBfLmlzU3ltYm9sCisgLSBbeF0gXy50b0ludGVnZXIKKyAtIFt4XSBfLnRvTGVuZ3RoCisgLSBbeF0gXy50b051bWJlcgorIC0gW3hdIF8udG9TYWZlSW50ZWdlcgorIC0gW3hdIF8udG9TdHJpbmcKKworIGFkZGVkIDEzIG9iamVjdCBtZXRob2RzOgorIC0gW3hdIF8uYXNzaWduSW4KKyAtIFt4XSBfLmFzc2lnbkluV2l0aAorIC0gW3hdIF8uYXNzaWduV2l0aAorIC0gW3hdIF8uZnVuY3Rpb25zSW4KKyAtIFt4XSBfLmhhc0luCisgLSBbeF0gXy5tZXJnZVdpdGgKKyAtIFt4XSBfLm9taXRCeQorIC0gW3hdIF8ucGlja0J5CisKKworIGFkZGVkIDggc3RyaW5nIG1ldGhvZHM6CisgLSBbeF0gXy5sb3dlckNhc2UKKyAtIFt4XSBfLmxvd2VyRmlyc3QKKyAtIFt4XSBfLnVwcGVyQ2FzZQorIC0gW3hdIF8udXBwZXJGaXJzdAorIC0gW3hdIF8udG9Mb3dlcgorIC0gW3hdIF8udG9VcHBlcgorCisgYWRkZWQgOCB1dGlsaXR5IG1ldGhvZHM6CisgLSBbeF0gXy50b1BhdGgKKworIGFkZGVkIDQgbWF0aCBtZXRob2RzOgorIC0gW3hdIF8ubWF4QnkKKyAtIFt4XSBfLm1lYW4KKyAtIFt4XSBfLm1pbkJ5CisgLSBbeF0gXy5zdW1CeQorCisgYWRkZWQgMiBmdW5jdGlvbiBtZXRob2RzOgorIC0gW3hdIF8uZmxpcAorIC0gW3hdIF8udW5hcnkKKworIGFkZGVkIDIgbnVtYmVyIG1ldGhvZHM6CisgLSBbeF0gXy5jbGFtcAorIC0gW3hdIF8uc3VidHJhY3QKKworIGFkZGVkIGNvbGxlY3Rpb24gbWV0aG9kOgorIC0gW3hdIF8uc2FtcGxlU2l6ZQorCisgQWRkZWQgMyBhbGlhc2VzCisKKyAtIFt4XSBfLmZpcnN0IGFzIGFuIGFsaWFzIG9mIF8uaGVhZAorCisgUmVtb3ZlZCAxNyBhbGlhc2VzCisgLSBbeF0gUmVtb3ZlZCBhbGlhc2UgXy5hbGwKKyAtIFt4XSBSZW1vdmVkIGFsaWFzZSBfLmFueQorIC0gW3hdIFJlbW92ZWQgYWxpYXNlIF8uYmFja2Zsb3cKKyAtIFt4XSBSZW1vdmVkIGFsaWFzZSBfLmNhbGxiYWNrCisgLSBbeF0gUmVtb3ZlZCBhbGlhc2UgXy5jb2xsZWN0CisgLSBbeF0gUmVtb3ZlZCBhbGlhc2UgXy5jb21wb3NlCisgLSBbeF0gUmVtb3ZlZCBhbGlhc2UgXy5jb250YWlucworIC0gW3hdIFJlbW92ZWQgYWxpYXNlIF8uZGV0ZWN0CisgLSBbeF0gUmVtb3ZlZCBhbGlhc2UgXy5mb2xkbAorIC0gW3hdIFJlbW92ZWQgYWxpYXNlIF8uZm9sZHIKKyAtIFt4XSBSZW1vdmVkIGFsaWFzZSBfLmluY2x1ZGUKKyAtIFt4XSBSZW1vdmVkIGFsaWFzZSBfLmluamVjdAorIC0gW3hdIFJlbW92ZWQgYWxpYXNlIF8ubWV0aG9kcworIC0gW3hdIFJlbW92ZWQgYWxpYXNlIF8ub2JqZWN0CisgLSBbeF0gUmVtb3ZlZCBhbGlhc2UgXy5ydW4KKyAtIFt4XSBSZW1vdmVkIGFsaWFzZSBfLnNlbGVjdAorIC0gW3hdIFJlbW92ZWQgYWxpYXNlIF8udW5pcXVlCisKKyBPdGhlciBjaGFuZ2VzCisgLSBbeF0gQWRkZWQgc3VwcG9ydCBmb3IgYXJyYXkgYnVmZmVycyB0byBfLmlzRXF1YWwKKyAtIFt4XSBBZGRlZCBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIGl0ZXJhdG9ycyB0byBfLnRvQXJyYXkKKyAtIFt4XSBBZGRlZCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzIHRvIF8uemlwT2JqZWN0CisgLSBbeF0gQ2hhbmdlZCBVTUQgdG8gZXhwb3J0IHRvIHdpbmRvdyBvciBzZWxmIHdoZW4gYXZhaWxhYmxlIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgZXhwb3J0cworIC0gW3hdIEVuc3VyZWQgZGVib3VuY2UgY2FuY2VsIGNsZWFycyBhcmdzICYgdGhpc0FyZyByZWZlcmVuY2VzCisgLSBbeF0gRW5zdXJlZCBfLmFkZCwgXy5zdWJ0cmFjdCwgJiBfLnN1bSBkb27igJl0IHNraXAgTmFOIHZhbHVlcworIC0gW3hdIEVuc3VyZWQgXy5jbG9uZSB0cmVhdHMgZ2VuZXJhdG9ycyBsaWtlIGZ1bmN0aW9ucworIC0gW3hdIEVuc3VyZWQgXy5jbG9uZSBwcm9kdWNlcyBjbG9uZXMgd2l0aCB0aGUgc291cmNl4oCZcyBbW1Byb3RvdHlwZV1dCisgLSBbeF0gRW5zdXJlZCBfLmRlZmF1bHRzIGFzc2lnbnMgcHJvcGVydGllcyB0aGF0IHNoYWRvdyBPYmplY3QucHJvdG90eXBlCisgLSBbeF0gRW5zdXJlZCBfLmRlZmF1bHRzRGVlcCBkb2VzbuKAmXQgbWVyZ2UgYSBzdHJpbmcgaW50byBhbiBhcnJheQorIC0gW3hdIEVuc3VyZWQgXy5kZWZhdWx0c0RlZXAgJiBfLm1lcmdlIGRvbuKAmXQgbW9kaWZ5IHNvdXJjZXMKKyAtIFt4XSBFbnN1cmVkIF8uZGVmYXVsdHNEZWVwIHdvcmtzIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcworIC0gW3hdIEVuc3VyZWQgXy5rZXlzIHNraXBzIOKAnGxlbmd0aOKAnSBvbiBzdHJpY3QgbW9kZSBhcmd1bWVudHMgb2JqZWN0cyBpbiBTYWZhcmkgOQorIC0gW3hdIEVuc3VyZWQgXy5tZXJnZSBkb2VzbuKAmXQgY29udmVydCBzdHJpbmdzIHRvIGFycmF5cworIC0gW3hdIEVuc3VyZWQgXy5tZXJnZSBtZXJnZXMgcGxhaW4tb2JqZWN0cyBvbnRvIG5vbiBwbGFpbi1vYmplY3RzCisgLSBbeF0gRW5zdXJlZCBfI3BsYW50IHJlc2V0cyBpdGVyYXRvciBkYXRhIG9mIGNsb25lZCBzZXF1ZW5jZXMKKyAtIFt4XSBFbnN1cmVkIF8ucmFuZG9tIHN3YXBzIG1pbiAmIG1heCBpZiBtaW4gaXMgZ3JlYXRlciB0aGFuIG1heAorIC0gW3hdIEVuc3VyZWQgXy5yYW5nZSBwcmVzZXJ2ZXMgdGhlIHNpZ24gb2Ygc3RhcnQgb2YgLTAKKyAtIFt4XSBFbnN1cmVkIF8ucmVkdWNlICYgXy5yZWR1Y2VSaWdodCB1c2UgZ2V0SXRlcmF0ZWUgaW4gdGhlaXIgYXJyYXkgYnJhbmNoCisgLSBbeF0gRml4ZWQgcm91bmRpbmcgaXNzdWUgd2l0aCB0aGUgcHJlY2lzaW9uIHBhcmFtIG9mIF8uZmxvb3IKKyAtIFt4XSBBZGRlZCBmbHVzaCBtZXRob2QgdG8gZGVib3VuY2VkICYgdGhyb3R0bGVkIGZ1bmN0aW9ucworCisgKiogTEFURVIgKioKKyBNaXNjOgorIC0gWyBdIE1hZGUgXy5mb3JFYWNoLCBfLmZvckluLCBfLmZvck93biwgJiBfLnRpbWVzIGltcGxpY2l0bHkgZW5kIGEgY2hhaW4gc2VxdWVuY2UKKyAtIFsgXSBSZW1vdmVkIHRoaXNBcmcgcGFyYW1zIGZyb20gbW9zdCBtZXRob2RzCisgLSBbIF0gTWFkZSDigJxCeeKAnSBtZXRob2RzIHByb3ZpZGUgYSBzaW5nbGUgcGFyYW0gdG8gaXRlcmF0ZWVzCisgLSBbIF0gTWFkZSBfLndvcmRzIGNoYWluYWJsZSBieSBkZWZhdWx0CisgLSBbIF0gUmVtb3ZlZCBpc0RlZXAgcGFyYW1zIGZyb20gXy5jbG9uZSAmIF8uZmxhdHRlbgorIC0gWyBdIFJlbW92ZWQgXy5iaW5kQWxsIHN1cHBvcnQgZm9yIGJpbmRpbmcgYWxsIG1ldGhvZHMgd2hlbiBubyBuYW1lcyBhcmUgcHJvdmlkZWQKKyAtIFsgXSBSZW1vdmVkIGZ1bmMtZmlyc3QgcGFyYW0gc2lnbmF0dXJlIGZyb20gXy5iZWZvcmUgJiBfLmFmdGVyCisgLSBbIF0gXy5leHRlbmQgYXMgYW4gYWxpYXMgb2YgXy5hc3NpZ25JbgorIC0gWyBdIF8uZXh0ZW5kV2l0aCBhcyBhbiBhbGlhcyBvZiBfLmFzc2lnbkluV2l0aAorIC0gWyBdIEFkZGVkIGNsZWFyIG1ldGhvZCB0byBfLm1lbW9pemUuQ2FjaGUKKyAtIFsgXSBBZGRlZCBzdXBwb3J0IGZvciBFUzYgbWFwcywgc2V0cywgJiBzeW1ib2xzIHRvIF8uY2xvbmUsIF8uaXNFcXVhbCwgJiBfLnRvQXJyYXkKKyAtIFsgXSBFbmFibGVkIF8uZmxvdyAmIF8uZmxvd1JpZ2h0IHRvIGFjY2VwdCBhbiBhcnJheSBvZiBmdW5jdGlvbnMKKyAtIFsgXSBFbnN1cmVkIOKAnENvbGxlY3Rpb27igJ0gbWV0aG9kcyB0cmVhdCBmdW5jdGlvbnMgYXMgb2JqZWN0cworIC0gWyBdIEVuc3VyZWQgXy5hc3NpZ24sIF8uZGVmYXVsdHMsICYgXy5tZXJnZSBjb2VyY2Ugb2JqZWN0IHZhbHVlcyB0byBvYmplY3RzCisgLSBbIF0gRW5zdXJlZCBfLmJpbmRLZXkgYm91bmQgZnVuY3Rpb25zIGNhbGwgb2JqZWN0W2tleV0gd2hlbiBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yCisgLSBbIF0gRW5zdXJlZCBfLmlzRnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBnZW5lcmF0b3IgZnVuY3Rpb25zCisgLSBbIF0gRW5zdXJlZCBfLm1lcmdlIGFzc2lnbnMgdHlwZWQgYXJyYXlzIGRpcmVjdGx5CisgLSBbIF0gTWFkZSBfKC4uLikgYW4gaXRlcmF0b3IgJiBpdGVyYWJsZQorIC0gWyBdIE1hZGUgXy5kcm9wLCBfLnRha2UsICYgcmlnaHQgZm9ybXMgY29lcmNlIG4gb2YgdW5kZWZpbmVkIHRvIDAKKworIE1ldGhvZHM6CisgLSBbIF0gXy5jb25jYXQKKyAtIFsgXSBfLmRpZmZlcmVuY2VCeQorIC0gWyBdIF8uZGlmZmVyZW5jZVdpdGgKKyAtIFsgXSBfLmZsYXRNYXAKKyAtIFsgXSBfLmZyb21QYWlycworIC0gWyBdIF8uaW50ZXJzZWN0aW9uQnkKKyAtIFsgXSBfLmludGVyc2VjdGlvbldpdGgKKyAtIFsgXSBfLmpvaW4KKyAtIFsgXSBfLnB1bGxBbGwKKyAtIFsgXSBfLnB1bGxBbGxCeQorIC0gWyBdIF8ucmV2ZXJzZQorIC0gWyBdIF8uc29ydGVkTGFzdEluZGV4T2YKKyAtIFsgXSBfLnVuaW9uQnkKKyAtIFsgXSBfLnVuaW9uV2l0aAorIC0gWyBdIF8udW5pcVdpdGgKKyAtIFsgXSBfLnhvckJ5CisgLSBbIF0gXy54b3JXaXRoCisgLSBbIF0gXy50b1N0cmluZworCisgLSBbIF0gXy5pbnZva2UKKyAtIFsgXSBfLnNldFdpdGgKKyAtIFsgXSBfLnRvUGFpcnMKKyAtIFsgXSBfLnRvUGFpcnNJbgorIC0gWyBdIF8udW5zZXQKKworIC0gWyBdIF8ucmVwbGFjZQorIC0gWyBdIF8uc3BsaXQKKworIC0gWyBdIF8uY29uZAorIC0gWyBdIF8uY29uZm9ybXMKKyAtIFsgXSBfLm50aEFyZworIC0gWyBdIF8ub3ZlcgorIC0gWyBdIF8ub3ZlckV2ZXJ5CisgLSBbIF0gXy5vdmVyU29tZQorIC0gWyBdIF8ucmFuZ2VSaWdodAorCisgLSBbIF0gXy5uZXh0CisgKi8KKworZGVjbGFyZSB2YXIgXzogXy5Mb0Rhc2hTdGF0aWM7CisKK2RlY2xhcmUgbW9kdWxlIF8geworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGxvZGFzaCBvYmplY3Qgd2hpY2ggd3JhcHMgdGhlIGdpdmVuIHZhbHVlIHRvIGVuYWJsZSBpbnR1aXRpdmUgbWV0aG9kIGNoYWluaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBJbiBhZGRpdGlvbiB0byBMby1EYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGFsc28gaGF2ZSB0aGUgZm9sbG93aW5nIEFycmF5IG1ldGhvZHM6CisgICAgICAgICAqIGNvbmNhdCwgam9pbiwgcG9wLCBwdXNoLCByZXZlcnNlLCBzaGlmdCwgc2xpY2UsIHNvcnQsIHNwbGljZSwgYW5kIHVuc2hpZnQKKyAgICAgICAgICoKKyAgICAgICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgdmFsdWUgbWV0aG9kIGlzIGltcGxpY2l0bHkgb3IKKyAgICAgICAgICogZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBmdW5jdGlvbnMgYXJlOgorICAgICAgICAgKiBhZnRlciwgYXNzaWduLCBiaW5kLCBiaW5kQWxsLCBiaW5kS2V5LCBjaGFpbiwgY2h1bmssIGNvbXBhY3QsIGNvbXBvc2UsIGNvbmNhdCwgY291bnRCeSwKKyAgICAgICAgICogY3JlYXRlQ2FsbGJhY2ssIGN1cnJ5LCBkZWJvdW5jZSwgZGVmYXVsdHMsIGRlZmVyLCBkZWxheSwgZGlmZmVyZW5jZSwgZmlsdGVyLCBmbGF0dGVuLAorICAgICAgICAgKiBmb3JFYWNoLCBmb3JFYWNoUmlnaHQsIGZvckluLCBmb3JJblJpZ2h0LCBmb3JPd24sIGZvck93blJpZ2h0LCBmdW5jdGlvbnMsIGdyb3VwQnksCisgICAgICAgICAqIGtleUJ5LCBpbml0aWFsLCBpbnRlcnNlY3Rpb24sIGludmVydCwgaW52b2tlLCBrZXlzLCBtYXAsIG1heCwgbWVtb2l6ZSwgbWVyZ2UsIG1pbiwKKyAgICAgICAgICogb2JqZWN0LCBvbWl0LCBvbmNlLCBwYWlycywgcGFydGlhbCwgcGFydGlhbFJpZ2h0LCBwaWNrLCBwbHVjaywgcHVsbCwgcHVzaCwgcmFuZ2UsIHJlamVjdCwKKyAgICAgICAgICogcmVtb3ZlLCByZXN0LCByZXZlcnNlLCBzYW1wbGUsIHNodWZmbGUsIHNsaWNlLCBzb3J0LCBzb3J0QnksIHNwbGljZSwgdGFwLCB0aHJvdHRsZSwgdGltZXMsCisgICAgICAgICAqIHRvQXJyYXksIHRyYW5zZm9ybSwgdW5pb24sIHVuaXEsIHVuc2V0LCB1bnNoaWZ0LCB1bnppcCwgdmFsdWVzLCB3aGVyZSwgd2l0aG91dCwgd3JhcCwgYW5kIHppcAorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbm9uLWNoYWluYWJsZSB3cmFwcGVyIGZ1bmN0aW9ucyBhcmU6CisgICAgICAgICAqIGNsb25lLCBjbG9uZURlZXAsIGNvbnRhaW5zLCBlc2NhcGUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbmRLZXksIGZpbmRMYXN0LAorICAgICAgICAgKiBmaW5kTGFzdEluZGV4LCBmaW5kTGFzdEtleSwgaGFzLCBpZGVudGl0eSwgaW5kZXhPZiwgaXNBcmd1bWVudHMsIGlzQXJyYXksIGlzQm9vbGVhbiwKKyAgICAgICAgICogaXNEYXRlLCBpc0VsZW1lbnQsIGlzRW1wdHksIGlzRXF1YWwsIGlzRmluaXRlLCBpc0Z1bmN0aW9uLCBpc05hTiwgaXNOdWxsLCBpc051bWJlciwKKyAgICAgICAgICogaXNPYmplY3QsIGlzUGxhaW5PYmplY3QsIGlzUmVnRXhwLCBpc1N0cmluZywgaXNVbmRlZmluZWQsIGpvaW4sIGxhc3RJbmRleE9mLCBtaXhpbiwKKyAgICAgICAgICogbm9Db25mbGljdCwgcGFyc2VJbnQsIHBvcCwgcmFuZG9tLCByZWR1Y2UsIHJlZHVjZVJpZ2h0LCByZXN1bHQsIHNoaWZ0LCBzaXplLCBzb21lLAorICAgICAgICAgKiBzb3J0ZWRJbmRleCwgcnVuSW5Db250ZXh0LCB0ZW1wbGF0ZSwgdW5lc2NhcGUsIHVuaXF1ZUlkLCBhbmQgdmFsdWUKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZpcnN0IGFuZCBsYXN0IHJldHVybiB3cmFwcGVkIHZhbHVlcyB3aGVuIG4gaXMgcHJvdmlkZWQsIG90aGVyd2lzZQorICAgICAgICAgKiB0aGV5IHJldHVybiB1bndyYXBwZWQgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBFeHBsaWNpdCBjaGFpbmluZyBjYW4gYmUgZW5hYmxlZCBieSB1c2luZyB0aGUgXy5jaGFpbiBtZXRob2QuCisgICAgICAgICAqKi8KKyAgICAgICAgKHZhbHVlOiBudW1iZXIpOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICAgICAgKHZhbHVlOiBzdHJpbmcpOiBMb0Rhc2hJbXBsaWNpdFN0cmluZ1dyYXBwZXI7CisgICAgICAgICh2YWx1ZTogYm9vbGVhbik6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICAgICAgKHZhbHVlOiBBcnJheTxudW1iZXI+KTogTG9EYXNoSW1wbGljaXROdW1iZXJBcnJheVdyYXBwZXI7CisgICAgICAgIDxUPih2YWx1ZTogQXJyYXk8VD4pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICAgICAgPFQgZXh0ZW5kcyB7fT4odmFsdWU6IFQpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgICAgICh2YWx1ZTogYW55KTogTG9EYXNoSW1wbGljaXRXcmFwcGVyPGFueT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci4KKyAgICAgICAgICoqLworICAgICAgICBWRVJTSU9OOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgTG8tRGFzaCBhcmUgc2ltaWxhciB0byB0aG9zZSBpbiBlbWJlZGRlZCBSdWJ5CisgICAgICAgICAqIChFUkIpLiBDaGFuZ2UgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy4KKyAgICAgICAgICoqLworICAgICAgICB0ZW1wbGF0ZVNldHRpbmdzOiBUZW1wbGF0ZVNldHRpbmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgTG8tRGFzaCBhcmUgc2ltaWxhciB0byB0aG9zZSBpbiBlbWJlZGRlZCBSdWJ5CisgICAgICogKEVSQikuIENoYW5nZSB0aGUgZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgorICAgICAqKi8KKyAgICBpbnRlcmZhY2UgVGVtcGxhdGVTZXR0aW5ncyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgImVzY2FwZSIgZGVsaW1pdGVyLgorICAgICAgICAgKiovCisgICAgICAgIGVzY2FwZT86IFJlZ0V4cDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlICJldmFsdWF0ZSIgZGVsaW1pdGVyLgorICAgICAgICAgKiovCisgICAgICAgIGV2YWx1YXRlPzogUmVnRXhwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgICoqLworICAgICAgICBpbXBvcnRzPzogRGljdGlvbmFyeTxhbnk+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgImludGVycG9sYXRlIiBkZWxpbWl0ZXIuCisgICAgICAgICAqKi8KKyAgICAgICAgaW50ZXJwb2xhdGU/OiBSZWdFeHA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC4KKyAgICAgICAgICoqLworICAgICAgICB2YXJpYWJsZT86IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS92YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgTWFwQ2FjaGUgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGNhY2hlLgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LCBlbHNlIGBmYWxzZWAuCisgICAgICAgICAqLworICAgICAgICBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBjYWNoZWQgdmFsdWUgZm9yIGBrZXlgLgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBnZXQoa2V5OiBzdHJpbmcpOiBhbnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBhIGNhY2hlZCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC4KKyAgICAgICAgICovCisgICAgICAgIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYHZhbHVlYCB0byBga2V5YCBvZiB0aGUgY2FjaGUuCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gY2FjaGUuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2FjaGUgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogXy5EaWN0aW9uYXJ5PGFueT47CisgICAgfQorICAgIGludGVyZmFjZSBNYXBDYWNoZUNvbnN0cnVjdG9yIHsKKyAgICAgICAgbmV3ICgpOiBNYXBDYWNoZTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoV3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IGV4dGVuZHMgTG9EYXNoV3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IGV4dGVuZHMgTG9EYXNoV3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiBleHRlbmRzIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+PiB7IH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4gZXh0ZW5kcyBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPj4geyB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRTdHJpbmdXcmFwcGVyIGV4dGVuZHMgTG9EYXNoSW1wbGljaXRXcmFwcGVyPHN0cmluZz4geyB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRTdHJpbmdXcmFwcGVyIGV4dGVuZHMgTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz4geyB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IGV4dGVuZHMgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4+IHsgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiBleHRlbmRzIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+PiB7IH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiBleHRlbmRzIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VFtdLCBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPj4geworICAgICAgICBwb3AoKTogVDsKKyAgICAgICAgcHVzaCguLi5pdGVtczogVFtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgICAgIHNoaWZ0KCk6IFQ7CisgICAgICAgIHNvcnQoY29tcGFyZUZuPzogKGE6IFQsIGI6IFQpID0+IG51bWJlcik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgICAgICBzcGxpY2Uoc3RhcnQ6IG51bWJlcik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgICAgICBzcGxpY2Uoc3RhcnQ6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IGFueVtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgICAgIHVuc2hpZnQoLi4uaXRlbXM6IFRbXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiBleHRlbmRzIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VFtdLCBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPj4geworICAgICAgICBwb3AoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworICAgICAgICBwdXNoKC4uLml0ZW1zOiBUW10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICAgICAgc2hpZnQoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworICAgICAgICBzb3J0KGNvbXBhcmVGbj86IChhOiBULCBiOiBUKSA9PiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICAgICAgc3BsaWNlKHN0YXJ0OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICAgICAgc3BsaWNlKHN0YXJ0OiBudW1iZXIsIGRlbGV0ZUNvdW50OiBudW1iZXIsIC4uLml0ZW1zOiBhbnlbXSk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgICAgICB1bnNoaWZ0KC4uLml0ZW1zOiBUW10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXROdW1iZXJBcnJheVdyYXBwZXIgZXh0ZW5kcyBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxudW1iZXI+IHsgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0TnVtYmVyQXJyYXlXcmFwcGVyIGV4dGVuZHMgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8bnVtYmVyPiB7IH0KKworICAgIC8qKioqKioqKioKKyAgICAgKiBBcnJheSAqCisgICAgICoqKioqKioqKi8KKworICAgICAgICAvL18uY2h1bmsKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBzaXplLiBJZiBjb2xsZWN0aW9uIGNhbuKAmXQgYmUgc3BsaXQgZXZlbmx5LCB0aGUKKyAgICAgICAgICogZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuCisgICAgICAgICAqIEBwYXJhbSBzaXplIFRoZSBsZW5ndGggb2YgZWFjaCBjaHVuay4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgY29udGFpbmluZyBjaHVua3MuCisgICAgICAgICAqLworICAgICAgICBjaHVuazxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgc2l6ZT86IG51bWJlcgorICAgICAgICApOiBUW11bXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNodW5rCisgICAgICAgICAqLworICAgICAgICBjaHVuayhzaXplPzogbnVtYmVyKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFtdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jaHVuaworICAgICAgICAgKi8KKyAgICAgICAgY2h1bms8VFJlc3VsdD4oc2l6ZT86IG51bWJlcik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHRbXT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jaHVuaworICAgICAgICAgKi8KKyAgICAgICAgY2h1bmsoc2l6ZT86IG51bWJlcik6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRbXT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2h1bmsKKyAgICAgICAgICovCisgICAgICAgIGNodW5rPFRSZXN1bHQ+KHNpemU/OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0W10+OworICAgIH0KKworICAgIC8vXy5jb21wYWN0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHdpdGggYWxsIGZhbHNleSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIHZhbHVlcyBmYWxzZSwgbnVsbCwgMCwgIiIsIHVuZGVmaW5lZCwgYW5kIE5hTiBhcmUKKyAgICAgICAgICogZmFsc2V5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuCisgICAgICAgICAqIEByZXR1cm4gKEFycmF5KSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgY29tcGFjdDxUPihhcnJheT86IExpc3Q8VD4pOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb21wYWN0CisgICAgICAgICAqLworICAgICAgICBjb21wYWN0KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvbXBhY3QKKyAgICAgICAgICovCisgICAgICAgIGNvbXBhY3Q8VFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb21wYWN0CisgICAgICAgICAqLworICAgICAgICBjb21wYWN0KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvbXBhY3QKKyAgICAgICAgICovCisgICAgICAgIGNvbXBhY3Q8VFJlc3VsdD4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmNvbmNhdCBEVU1NWQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBhcnJheSBjb25jYXRlbmF0aW5nIGBhcnJheWAgd2l0aCBhbnkgYWRkaXRpb25hbCBhcnJheXMKKyAgICAgICAgICogYW5kL29yIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbmNhdGVuYXRlLgorICAgICAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuCisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIGFycmF5ID0gWzFdOworICAgICAgICAgKiB2YXIgb3RoZXIgPSBfLmNvbmNhdChhcnJheSwgMiwgWzNdLCBbWzRdXSk7CisgICAgICAgICAqCisgICAgICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTsKKyAgICAgICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XV0KKyAgICAgICAgICoKKyAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOworICAgICAgICAgKiAvLyA9PiBbMV0KKyAgICAgICAgICovCisgICAgICAgIGNvbmNhdDxUPihhcnJheTogVFtdfExpc3Q8VD4sIC4uLnZhbHVlczogKFR8VFtdfExpc3Q8VD4pW10pIDogVFtdOworICAgIH0KKworICAgIC8vXy5kaWZmZXJlbmNlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSBhcnJheSB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBwcm92aWRlZCBhcnJheXMgdXNpbmcgU2FtZVZhbHVlWmVybyBmb3IKKyAgICAgICAgICogZXF1YWxpdHkgY29tcGFyaXNvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgYXJyYXlzIG9mIHZhbHVlcyB0byBleGNsdWRlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlPFQ+KAorICAgICAgICAgICAgYXJyYXk6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgLi4udmFsdWVzOiBBcnJheTxUW118TGlzdDxUPj4KKyAgICAgICAgKTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZSguLi52YWx1ZXM6IChUW118TGlzdDxUPilbXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2UKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2U8VFZhbHVlPiguLi52YWx1ZXM6IChUVmFsdWVbXXxMaXN0PFRWYWx1ZT4pW10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZSguLi52YWx1ZXM6IChUW118TGlzdDxUPilbXSk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2UKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2U8VFZhbHVlPiguLi52YWx1ZXM6IChUVmFsdWVbXXxMaXN0PFRWYWx1ZT4pW10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworICAgIH0KKworICAgIC8vXy5kaWZmZXJlbmNlQnkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5kaWZmZXJlbmNlIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgaXRlcmF0ZWUgd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGFycmF5CisgICAgICAgICAqIGFuZCB2YWx1ZXMgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZQorICAgICAgICAgKiBhcmd1bWVudDogKHZhbHVlKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgYXJyYXk6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgYXJyYXk6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICBhcnJheTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgYXJyYXk6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgYXJyYXk6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIGFycmF5OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKCh2YWx1ZTogVCkgPT4gYW55KXxzdHJpbmcKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICBhcnJheTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXM0PzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXM1PzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgYXJyYXk6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzND86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzNT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgYXJyYXk6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgLi4udmFsdWVzOiBhbnlbXQorICAgICAgICApOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlcz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKCh2YWx1ZTogVCkgPT4gYW55KXxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXM0PzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXM0PzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczU/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKCh2YWx1ZTogVCkgPT4gYW55KXxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczU/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgLi4udmFsdWVzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlcz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKCh2YWx1ZTogVCkgPT4gYW55KXxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXM0PzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXM0PzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczU/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKCh2YWx1ZTogVCkgPT4gYW55KXxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczU/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgLi4udmFsdWVzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICB2YWx1ZXM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKCh2YWx1ZTogVCkgPT4gYW55KXxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzND86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzNT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzND86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzNT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICAuLi52YWx1ZXM6IGFueVtdCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICB2YWx1ZXM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICgodmFsdWU6IFQpID0+IGFueSl8c3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICB2YWx1ZXMxPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMyPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZXMzPzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxUPigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKCh2YWx1ZTogVCkgPT4gYW55KXxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlQnkKKyAgICAgICAgICovCisgICAgICAgIGRpZmZlcmVuY2VCeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIHZhbHVlczE/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczI/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczM/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlczQ/OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQ+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzND86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzNT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAoKHZhbHVlOiBUKSA9PiBhbnkpfHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2VCeQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZUJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgdmFsdWVzMT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMj86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzMz86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzND86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWVzNT86IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZUJ5CisgICAgICAgICAqLworICAgICAgICBkaWZmZXJlbmNlQnk8VD4oCisgICAgICAgICAgICAuLi52YWx1ZXM6IGFueVtdCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5kaWZmZXJlbmNlV2l0aCBEVU1NWQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlcgorICAgICAgICAgKiBwcm92aWRlZCBhcnJheXMgdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2FtZXZhbHVlemVybykKKyAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uZGlmZmVyZW5jZShbMywgMiwgMV0sIFs0LCAyXSk7CisgICAgICAgICAqIC8vID0+IFszLCAxXQorICAgICAgICAgKi8KKyAgICAgICAgZGlmZmVyZW5jZVdpdGgoCisgICAgICAgICAgICBhcnJheTogYW55W118TGlzdDxhbnk+LAorICAgICAgICAgICAgLi4udmFsdWVzOiBhbnlbXQorICAgICAgICApOiBhbnlbXTsKKyAgICB9CisKKyAgICAvL18uZHJvcAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGFycmF5IHdpdGggbiBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAgICAgICogQHBhcmFtIG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNsaWNlIG9mIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgZHJvcDxUPihhcnJheTogVFtdfExpc3Q8VD4sIG4/OiBudW1iZXIpOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wCisgICAgICAgICAqLworICAgICAgICBkcm9wKG4/OiBudW1iZXIpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wCisgICAgICAgICAqLworICAgICAgICBkcm9wPFQ+KG4/OiBudW1iZXIpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3AKKyAgICAgICAgICovCisgICAgICAgIGRyb3Aobj86IG51bWJlcik6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3AKKyAgICAgICAgICovCisgICAgICAgIGRyb3A8VD4obj86IG51bWJlcik6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5kcm9wUmlnaHQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBhcnJheSB3aXRoIG4gZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzbGljZSBvZiBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodDxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgbj86IG51bWJlcgorICAgICAgICApOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodChuPzogbnVtYmVyKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBkcm9wUmlnaHQ8VFJlc3VsdD4obj86IG51bWJlcik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBkcm9wUmlnaHQobj86IG51bWJlcik6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BSaWdodAorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFJpZ2h0PFRSZXN1bHQ+KG4/OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uZHJvcFJpZ2h0V2hpbGUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBhcnJheSBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIHByZWRpY2F0ZQorICAgICAgICAgKiByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ucHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkKKyAgICAgICAgICogdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JlYXRlZCBfLm1hdGNoZXNQcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yCisgICAgICAgICAqIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvciBlbGVtZW50cyB0aGF0CisgICAgICAgICAqIG1hdGNoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBwcmVkaWNhdGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBkcm9wUmlnaHRXaGlsZTxUVmFsdWU+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VFZhbHVlPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIGJvb2xlYW4+CisgICAgICAgICk6IFRWYWx1ZVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUVmFsdWU+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IFRWYWx1ZVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlPFRXaGVyZSwgVFZhbHVlPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFRWYWx1ZT4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogVFZhbHVlW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFJpZ2h0V2hpbGUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFJpZ2h0V2hpbGUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFJpZ2h0V2hpbGU8VFdoZXJlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFJpZ2h0V2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFJpZ2h0V2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlPFRXaGVyZSwgVFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlKAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlKAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlPFRXaGVyZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFZhbHVlLCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BSaWdodFdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFZhbHVlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BSaWdodFdoaWxlCisgICAgICAgICAqLworICAgICAgICBkcm9wUmlnaHRXaGlsZTxUV2hlcmUsIFRWYWx1ZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFZhbHVlPjsKKyAgICB9CisKKyAgICAvL18uZHJvcFdoaWxlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYXJyYXkgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBwcmVkaWNhdGUKKyAgICAgICAgICogcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgYm91bmQgdG8gdGhpc0FyZyBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLnByb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5CisgICAgICAgICAqIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIHRoaXNBcmcgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzUHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvcgorICAgICAgICAgKiBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZSwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBwcmVkaWNhdGUgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IgZWxlbWVudHMgdGhhdAorICAgICAgICAgKiBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBwcmVkaWNhdGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBkcm9wV2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFRWYWx1ZT4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFZhbHVlLCBib29sZWFuPgorICAgICAgICApOiBUVmFsdWVbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUVmFsdWU+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IFRWYWx1ZVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFdoaWxlCisgICAgICAgICAqLworICAgICAgICBkcm9wV2hpbGU8VFdoZXJlLCBUVmFsdWU+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VFZhbHVlPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBUVmFsdWVbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFdoaWxlKAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFdoaWxlCisgICAgICAgICAqLworICAgICAgICBkcm9wV2hpbGUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BXaGlsZTxUV2hlcmU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFZhbHVlLCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFdoaWxlCisgICAgICAgICAqLworICAgICAgICBkcm9wV2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFdoaWxlCisgICAgICAgICAqLworICAgICAgICBkcm9wV2hpbGU8VFdoZXJlLCBUVmFsdWU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BXaGlsZSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFdoaWxlKAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZHJvcFdoaWxlCisgICAgICAgICAqLworICAgICAgICBkcm9wV2hpbGU8VFdoZXJlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kcm9wV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIGRyb3BXaGlsZTxUVmFsdWU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFZhbHVlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFZhbHVlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRyb3BXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgZHJvcFdoaWxlPFRXaGVyZSwgVFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworICAgIH0KKworICAgIC8vXy5maWxsCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBhcnJheSB3aXRoIHZhbHVlIGZyb20gc3RhcnQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBlbmQuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIG11dGF0ZXMgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGFycmF5IHdpdGguCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24uCisgICAgICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBwb3NpdGlvbi4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgZmlsbDxUPigKKyAgICAgICAgICAgIGFycmF5OiBhbnlbXSwKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgc3RhcnQ/OiBudW1iZXIsCisgICAgICAgICAgICBlbmQ/OiBudW1iZXIKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmlsbAorICAgICAgICAgKi8KKyAgICAgICAgZmlsbDxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PGFueT4sCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIHN0YXJ0PzogbnVtYmVyLAorICAgICAgICAgICAgZW5kPzogbnVtYmVyCisgICAgICAgICk6IExpc3Q8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWxsCisgICAgICAgICAqLworICAgICAgICBmaWxsPFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBzdGFydD86IG51bWJlciwKKyAgICAgICAgICAgIGVuZD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWxsCisgICAgICAgICAqLworICAgICAgICBmaWxsPFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBzdGFydD86IG51bWJlciwKKyAgICAgICAgICAgIGVuZD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8TGlzdDxUPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWxsCisgICAgICAgICAqLworICAgICAgICBmaWxsPFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBzdGFydD86IG51bWJlciwKKyAgICAgICAgICAgIGVuZD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWxsCisgICAgICAgICAqLworICAgICAgICBmaWxsPFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBzdGFydD86IG51bWJlciwKKyAgICAgICAgICAgIGVuZD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8TGlzdDxUPj47CisgICAgfQorCisgICAgLy9fLmZpbmRJbmRleAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBfLmZpbmQgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlZGljYXRlIHJldHVybnMgdHJ1dGh5CisgICAgICAgICAqIGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBwcmVkaWNhdGUgdGhlIGNyZWF0ZWQgXy5wcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eQorICAgICAgICAgKiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciB0aGlzQXJnIHRoZSBjcmVhdGVkIF8ubWF0Y2hlc1Byb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IKKyAgICAgICAgICogZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHkgdmFsdWUsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ubWF0Y2hlcyBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yIGVsZW1lbnRzIHRoYXQKKyAgICAgICAgICogaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC4KKyAgICAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSAtMS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmRJbmRleDxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZEluZGV4PFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kSW5kZXg8VywgVD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kSW5kZXgoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4sCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kSW5kZXgoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kSW5kZXg8Vz4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBXLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRJbmRleDxUUmVzdWx0PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUUmVzdWx0LCBib29sZWFuPiwKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRJbmRleCgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZywKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRJbmRleDxXPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kSW5kZXgoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4sCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRJbmRleCgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZywKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZEluZGV4PFc+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVywKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRJbmRleDxUUmVzdWx0PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUUmVzdWx0LCBib29sZWFuPiwKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZEluZGV4KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kSW5kZXg8Vz4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBXLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy5maW5kTGFzdEluZGV4CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uZmluZEluZGV4IGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgY29sbGVjdGlvbiBmcm9tIHJpZ2h0IHRvIGxlZnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ucHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkKKyAgICAgICAgICogdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JlYXRlZCBfLm1hdGNoZXNQcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yCisgICAgICAgICAqIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvciBlbGVtZW50cyB0aGF0CisgICAgICAgICAqIGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guCisgICAgICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgLTEuCisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEluZGV4PFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4sCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RJbmRleDxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0SW5kZXg8VywgVD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RJbmRleCgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPiwKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEluZGV4KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0SW5kZXg8Vz4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBXLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEluZGV4PFRSZXN1bHQ+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFRSZXN1bHQsIGJvb2xlYW4+LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0SW5kZXgoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RJbmRleDxXPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RJbmRleCgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPiwKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0SW5kZXgoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEluZGV4PFc+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVywKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEluZGV4PFRSZXN1bHQ+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFRSZXN1bHQsIGJvb2xlYW4+LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RJbmRleCgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZywKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0SW5kZXg8Vz4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBXLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy5maXJzdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmhlYWQKKyAgICAgICAgICovCisgICAgICAgIGZpcnN0PFQ+KGFycmF5OiBMaXN0PFQ+KTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5oZWFkCisgICAgICAgICAqLworICAgICAgICBmaXJzdCgpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5oZWFkCisgICAgICAgICAqLworICAgICAgICBmaXJzdCgpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmhlYWQKKyAgICAgICAgICovCisgICAgICAgIGZpcnN0PFQ+KCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaGVhZAorICAgICAgICAgKi8KKyAgICAgICAgZmlyc3QoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5oZWFkCisgICAgICAgICAqLworICAgICAgICBmaXJzdDxUPigpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmhlYWQKKyAgICAgICAgICovCisgICAgICAgIGZpcnN0PFQ+KCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFJlY3Vyc2l2ZUFycmF5PFQ+IGV4dGVuZHMgQXJyYXk8VHxSZWN1cnNpdmVBcnJheTxUPj4ge30KKyAgICBpbnRlcmZhY2UgTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4gZXh0ZW5kcyBMaXN0PFR8UmVjdXJzaXZlQXJyYXk8VD4+IHt9CisKKyAgICAvL18uZmxhdHRlbgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogRmxhdHRlbnMgYSBuZXN0ZWQgYXJyYXkuIElmIGlzRGVlcCBpcyB0cnVlIHRoZSBhcnJheSBpcyByZWN1cnNpdmVseSBmbGF0dGVuZWQsIG90aGVyd2lzZSBpdOKAmXMgb25seQorICAgICAgICAgKiBmbGF0dGVuZWQgYSBzaW5nbGUgbGV2ZWwuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KKyAgICAgICAgICogQHBhcmFtIGlzRGVlcCBTcGVjaWZ5IGEgZGVlcCBmbGF0dGVuLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBmbGF0dGVuPFQ+KGFycmF5OiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPiwgaXNEZWVwOiBib29sZWFuKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdHRlbgorICAgICAgICAgKi8KKyAgICAgICAgZmxhdHRlbjxUPihhcnJheTogTGlzdDxUfFRbXT4pOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0dGVuCisgICAgICAgICAqLworICAgICAgICBmbGF0dGVuPFQ+KGFycmF5OiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPik6IFJlY3Vyc2l2ZUFycmF5PFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW48VFJlc3VsdD4oaXNEZWVwPzogYm9vbGVhbik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW48VFJlc3VsdD4oaXNEZWVwPzogYm9vbGVhbik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW48VFJlc3VsdD4oaXNEZWVwPzogYm9vbGVhbik6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW48VFJlc3VsdD4oaXNEZWVwPzogYm9vbGVhbik6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5mbGF0dGVuRGVlcAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYSBuZXN0ZWQgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcmVjdXJzaXZlbHkgZmxhdHRlbi4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgZmxhdHRlbkRlZXA8VD4oYXJyYXk6IExpc3RPZlJlY3Vyc2l2ZUFycmF5c09yVmFsdWVzPFQ+KTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW5EZWVwCisgICAgICAgICAqLworICAgICAgICBmbGF0dGVuRGVlcCgpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdHRlbkRlZXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW5EZWVwPFQ+KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW5EZWVwCisgICAgICAgICAqLworICAgICAgICBmbGF0dGVuRGVlcDxUPigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0dGVuRGVlcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdHRlbkRlZXAoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXR0ZW5EZWVwCisgICAgICAgICAqLworICAgICAgICBmbGF0dGVuRGVlcDxUPigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0dGVuRGVlcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdHRlbkRlZXA8VD4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy8gXy5mbGF0dGVuRGVwdGgKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXkgdXAgdG8gZGVwdGggdGltZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcmVjdXJzaXZlbHkgZmxhdHRlbi4KKyAgICAgICAgICogQHBhcmFtIG51bWJlciBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIGZsYXR0ZW5EZXB0aDxUPihhcnJheTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGRlcHRoPzogbnVtYmVyKTogVFtdOworICAgIH0KKworICAgIC8vXy5mcm9tUGFpcnMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZAorICAgICAgICAgKiBmcm9tIGtleS12YWx1ZSBgcGFpcnNgLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLgorICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmZyb21QYWlycyhbWydmcmVkJywgMzBdLCBbJ2Jhcm5leScsIDQwXV0pOworICAgICAgICAgKiAvLyA9PiB7ICdmcmVkJzogMzAsICdiYXJuZXknOiA0MCB9CisgICAgICAgICAqLworICAgICAgICBmcm9tUGFpcnM8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxbXy5TdHJpbmdSZXByZXNlbnRhYmxlLCBUXT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgIEBzZWUgXy5mcm9tUGFpcnMKKyAgICAgICAgICovCisgICAgICAgIGZyb21QYWlycygKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PGFueVtdPgorICAgICAgICApOiBEaWN0aW9uYXJ5PGFueT47CisgICAgfQorCisgICAgLy9fLmZyb21QYWlycyBEVU1NWQorICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZnJvbVBhaXJzCisgICAgICAgICAqLworICAgICAgICBmcm9tUGFpcnMoKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPGFueT47CisgICAgfQorCisgICAgLy9fLmZyb21QYWlycyBEVU1NWQorICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZnJvbVBhaXJzCisgICAgICAgICAqLworICAgICAgICBmcm9tUGFpcnMoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPGFueT47CisgICAgfQorCisgICAgLy9fLmhlYWQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBhbGlhcyBfLmZpcnN0CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIGhlYWQ8VD4oYXJyYXk6IExpc3Q8VD4pOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmhlYWQKKyAgICAgICAgICovCisgICAgICAgIGhlYWQoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaGVhZAorICAgICAgICAgKi8KKyAgICAgICAgaGVhZCgpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmhlYWQKKyAgICAgICAgICovCisgICAgICAgIGhlYWQ8VD4oKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5oZWFkCisgICAgICAgICAqLworICAgICAgICBoZWFkKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaGVhZAorICAgICAgICAgKi8KKyAgICAgICAgaGVhZDxUPigpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmhlYWQKKyAgICAgICAgICovCisgICAgICAgIGhlYWQ8VD4oKTogVDsKKyAgICB9CisKKyAgICAvL18uaW5kZXhPZgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgCisgICAgICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCisgICAgICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGUgb2Zmc2V0CisgICAgICAgICAqIGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIHNvcnRlZCBwcm92aWRpbmcgYHRydWVgIGZvciBgZnJvbUluZGV4YAorICAgICAgICAgKiBwZXJmb3JtcyBhIGZhc3RlciBiaW5hcnkgc2VhcmNoLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgorICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpOworICAgICAgICAgKiAvLyA9PiAxCisgICAgICAgICAqCisgICAgICAgICAqIC8vIHVzaW5nIGBmcm9tSW5kZXhgCisgICAgICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpOworICAgICAgICAgKiAvLyA9PiAzCisgICAgICAgICAqLworICAgICAgICBpbmRleE9mPFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGZyb21JbmRleD86IGJvb2xlYW58bnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluZGV4T2YKKyAgICAgICAgICovCisgICAgICAgIGluZGV4T2YoCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGZyb21JbmRleD86IGJvb2xlYW58bnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbmRleE9mCisgICAgICAgICAqLworICAgICAgICBpbmRleE9mPFRWYWx1ZT4oCisgICAgICAgICAgICB2YWx1ZTogVFZhbHVlLAorICAgICAgICAgICAgZnJvbUluZGV4PzogYm9vbGVhbnxudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5kZXhPZgorICAgICAgICAgKi8KKyAgICAgICAgaW5kZXhPZigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgZnJvbUluZGV4PzogYm9vbGVhbnxudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5kZXhPZgorICAgICAgICAgKi8KKyAgICAgICAgaW5kZXhPZjxUVmFsdWU+KAorICAgICAgICAgICAgdmFsdWU6IFRWYWx1ZSwKKyAgICAgICAgICAgIGZyb21JbmRleD86IGJvb2xlYW58bnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy5pbnRlcnNlY3Rpb25CeSBEVU1NWQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYAorICAgICAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uCisgICAgICAgICAqIGJ5IHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFs0LjMsIDIuNF0sIE1hdGguZmxvb3IpOworICAgICAgICAgKiAvLyA9PiBbMi4xXQorICAgICAgICAgKgorICAgICAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZAorICAgICAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpOworICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDEgfV0KKyAgICAgICAgICovCisgICAgICAgIGludGVyc2VjdGlvbkJ5KAorICAgICAgICAgICAgYXJyYXk6IGFueVtdfExpc3Q8YW55PiwKKyAgICAgICAgICAgIC4uLnZhbHVlczogYW55W10KKyAgICAgICAgKTogYW55W107CisgICAgfQorCisgICAgLy9fLmludGVyc2VjdGlvbldpdGggRFVNTVkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYAorICAgICAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWQKKyAgICAgICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07CisgICAgICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dOworICAgICAgICAgKgorICAgICAgICAgKiBfLmludGVyc2VjdGlvbldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpOworICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XQorICAgICAgICAgKi8KKyAgICAgICAgaW50ZXJzZWN0aW9uV2l0aCgKKyAgICAgICAgICAgIGFycmF5OiBhbnlbXXxMaXN0PGFueT4sCisgICAgICAgICAgICAuLi52YWx1ZXM6IGFueVtdCisgICAgICAgICk6IGFueVtdOworICAgIH0KKworICAgIC8vXy5qb2luCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LgorICAgICAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFRoZSBlbGVtZW50IHNlcGFyYXRvci4KKyAgICAgICAgICogQHJldHVybnMgUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIGpvaW4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxhbnk+LAorICAgICAgICAgICAgc2VwYXJhdG9yPzogc3RyaW5nCisgICAgICAgICk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5qb2luCisgICAgICAgICAqLworICAgICAgICBqb2luKHNlcGFyYXRvcj86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmpvaW4KKyAgICAgICAgICovCisgICAgICAgIGpvaW4oc2VwYXJhdG9yPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmpvaW4KKyAgICAgICAgICovCisgICAgICAgIGpvaW4oc2VwYXJhdG9yPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmpvaW4KKyAgICAgICAgICovCisgICAgICAgIGpvaW4oc2VwYXJhdG9yPzogc3RyaW5nKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5qb2luCisgICAgICAgICAqLworICAgICAgICBqb2luKHNlcGFyYXRvcj86IHN0cmluZyk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmpvaW4KKyAgICAgICAgICovCisgICAgICAgIGpvaW4oc2VwYXJhdG9yPzogc3RyaW5nKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnB1bGxBbGwgRFVNTVkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gcmVtb3ZlLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS4KKyAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCAxLCAyLCAzXTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5wdWxsKGFycmF5LCBbMiwgM10pOworICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7CisgICAgICAgICAqIC8vID0+IFsxLCAxXQorICAgICAgICAgKi8KKyAgICAgICAgcHVsbEFsbCgKKyAgICAgICAgICAgIGFycmF5OiBhbnlbXXxMaXN0PGFueT4sCisgICAgICAgICAgICAuLi52YWx1ZXM6IGFueVtdCisgICAgICAgICk6IGFueVtdOworICAgIH0KKworICAgIC8vXy5wdWxsQWxsQnkgRFVNTVkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzCisgICAgICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uCisgICAgICAgICAqIGJ5IHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KKyAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMyB9LCB7ICd4JzogMSB9XTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTsKKyAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOworICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV0KKyAgICAgICAgICovCisgICAgICAgIHB1bGxBbGxCeSgKKyAgICAgICAgICAgIGFycmF5OiBhbnlbXXxMaXN0PGFueT4sCisgICAgICAgICAgICAuLi52YWx1ZXM6IGFueVtdCisgICAgICAgICk6IGFueVtdOworICAgIH0KKworICAgIC8vXy5yZXZlcnNlIERVTU1ZCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZAorICAgICAgICAgKiBlbGVtZW50IGJlY29tZXMgdGhlIHNlY29uZCB0byBsYXN0LCBhbmQgc28gb24uCisgICAgICAgICAqCisgICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uCisgICAgICAgICAqIFtgQXJyYXkjcmV2ZXJzZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3JldmVyc2UpLgorICAgICAgICAgKgorICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5yZXZlcnNlKGFycmF5KTsKKyAgICAgICAgICogLy8gPT4gWzMsIDIsIDFdCisgICAgICAgICAqCisgICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTsKKyAgICAgICAgICogLy8gPT4gWzMsIDIsIDFdCisgICAgICAgICAqLworICAgICAgICByZXZlcnNlKAorICAgICAgICAgICAgYXJyYXk6IGFueVtdfExpc3Q8YW55PiwKKyAgICAgICAgICAgIC4uLnZhbHVlczogYW55W10KKyAgICAgICAgKTogYW55W107CisgICAgfQorCisgICAgLy9fLnNvcnRlZEluZGV4T2YKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnkKKyAgICAgICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uc29ydGVkSW5kZXhPZihbMSwgMSwgMiwgMl0sIDIpOworICAgICAgICAgKiAvLyA9PiAyCisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleE9mPFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleE9mCisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleE9mKAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4T2YKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4T2Y8VFZhbHVlPigKKyAgICAgICAgICAgIHZhbHVlOiBUVmFsdWUKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhPZgorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhPZigKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4T2YKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4T2Y8VFZhbHVlPigKKyAgICAgICAgICAgIHZhbHVlOiBUVmFsdWUKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLmluaXRpYWwKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNsaWNlIG9mIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgaW5pdGlhbDxUPihhcnJheTogTGlzdDxUPik6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluaXRpYWwKKyAgICAgICAgICovCisgICAgICAgIGluaXRpYWwoKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5pdGlhbAorICAgICAgICAgKi8KKyAgICAgICAgaW5pdGlhbDxUPigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluaXRpYWwKKyAgICAgICAgICovCisgICAgICAgIGluaXRpYWwoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5pdGlhbAorICAgICAgICAgKi8KKyAgICAgICAgaW5pdGlhbDxUPigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uaW50ZXJzZWN0aW9uCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIG9mIHRoZSBwcm92aWRlZCBhcnJheXMgdXNpbmcgU2FtZVZhbHVlWmVybyBmb3IKKyAgICAgICAgICogZXF1YWxpdHkgY29tcGFyaXNvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaW50ZXJzZWN0aW9uPFQ+KC4uLmFycmF5czogKFRbXXxMaXN0PFQ+KVtdKTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW50ZXJzZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBpbnRlcnNlY3Rpb248VFJlc3VsdD4oLi4uYXJyYXlzOiAoVFJlc3VsdFtdfExpc3Q8VFJlc3VsdD4pW10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnRlcnNlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGludGVyc2VjdGlvbjxUUmVzdWx0PiguLi5hcnJheXM6IChUUmVzdWx0W118TGlzdDxUUmVzdWx0PilbXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW50ZXJzZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBpbnRlcnNlY3Rpb248VFJlc3VsdD4oLi4uYXJyYXlzOiAoVFJlc3VsdFtdfExpc3Q8VFJlc3VsdD4pW10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnRlcnNlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGludGVyc2VjdGlvbjxUUmVzdWx0PiguLi5hcnJheXM6IChUUmVzdWx0W118TGlzdDxUUmVzdWx0PilbXSk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5sYXN0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgbGFzdDxUPihhcnJheTogTGlzdDxUPik6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubGFzdAorICAgICAgICAgKi8KKyAgICAgICAgbGFzdCgpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5sYXN0CisgICAgICAgICAqLworICAgICAgICBsYXN0KCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubGFzdAorICAgICAgICAgKi8KKyAgICAgICAgbGFzdDxUPigpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmxhc3QKKyAgICAgICAgICovCisgICAgICAgIGxhc3QoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5sYXN0CisgICAgICAgICAqLworICAgICAgICBsYXN0PFQ+KCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubGFzdAorICAgICAgICAgKi8KKyAgICAgICAgbGFzdDxUPigpOiBUOworICAgIH0KKworICAgIC8vXy5sYXN0SW5kZXhPZgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBfLmluZGV4T2YgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBhcnJheSBmcm9tIHJpZ2h0IHRvIGxlZnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICAgICAqIEBwYXJhbSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tIG9yIHRydWUgdG8gcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggb24gYSBzb3J0ZWQgYXJyYXkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgLTEuCisgICAgICAgICAqLworICAgICAgICBsYXN0SW5kZXhPZjxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBib29sZWFufG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5sYXN0SW5kZXhPZgorICAgICAgICAgKi8KKyAgICAgICAgbGFzdEluZGV4T2YoCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGZyb21JbmRleD86IGJvb2xlYW58bnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5sYXN0SW5kZXhPZgorICAgICAgICAgKi8KKyAgICAgICAgbGFzdEluZGV4T2Y8VFJlc3VsdD4oCisgICAgICAgICAgICB2YWx1ZTogVFJlc3VsdCwKKyAgICAgICAgICAgIGZyb21JbmRleD86IGJvb2xlYW58bnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmxhc3RJbmRleE9mCisgICAgICAgICAqLworICAgICAgICBsYXN0SW5kZXhPZigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgZnJvbUluZGV4PzogYm9vbGVhbnxudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubGFzdEluZGV4T2YKKyAgICAgICAgICovCisgICAgICAgIGxhc3RJbmRleE9mPFRSZXN1bHQ+KAorICAgICAgICAgICAgdmFsdWU6IFRSZXN1bHQsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBib29sZWFufG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18ucHVsbAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhbGwgcHJvdmlkZWQgdmFsdWVzIGZyb20gYXJyYXkgdXNpbmcgU2FtZVZhbHVlWmVybyBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFVubGlrZSBfLndpdGhvdXQsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBwdWxsPFQ+KAorICAgICAgICAgICAgYXJyYXk6IFRbXSwKKyAgICAgICAgICAgIC4uLnZhbHVlczogVFtdCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnB1bGwKKyAgICAgICAgICovCisgICAgICAgIHB1bGw8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIC4uLnZhbHVlczogVFtdCisgICAgICAgICk6IExpc3Q8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wdWxsCisgICAgICAgICAqLworICAgICAgICBwdWxsKC4uLnZhbHVlczogVFtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucHVsbAorICAgICAgICAgKi8KKyAgICAgICAgcHVsbDxUVmFsdWU+KC4uLnZhbHVlczogVFZhbHVlW10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8TGlzdDxUVmFsdWU+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnB1bGwKKyAgICAgICAgICovCisgICAgICAgIHB1bGwoLi4udmFsdWVzOiBUW10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wdWxsCisgICAgICAgICAqLworICAgICAgICBwdWxsPFRWYWx1ZT4oLi4udmFsdWVzOiBUVmFsdWVbXSk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxMaXN0PFRWYWx1ZT4+OworICAgIH0KKworICAgIC8vXy5wdWxsQXQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpbmRleGVzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLgorICAgICAgICAgKiBJbmRleGVzIG1heSBiZSBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2YgaW5kZXhlcyBvciBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogVW5saWtlIF8uYXQsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUsIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGluZGV4ZXMgb3IgYXJyYXlzIG9mIGluZGV4ZXMuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWxsQXQ8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIC4uLmluZGV4ZXM6IChudW1iZXJ8bnVtYmVyW10pW10KKyAgICAgICAgKTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucHVsbEF0CisgICAgICAgICAqLworICAgICAgICBwdWxsQXQoLi4uaW5kZXhlczogKG51bWJlcnxudW1iZXJbXSlbXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnB1bGxBdAorICAgICAgICAgKi8KKyAgICAgICAgcHVsbEF0PFQ+KC4uLmluZGV4ZXM6IChudW1iZXJ8bnVtYmVyW10pW10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnB1bGxBdAorICAgICAgICAgKi8KKyAgICAgICAgcHVsbEF0KC4uLmluZGV4ZXM6IChudW1iZXJ8bnVtYmVyW10pW10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wdWxsQXQKKyAgICAgICAgICovCisgICAgICAgIHB1bGxBdDxUPiguLi5pbmRleGVzOiAobnVtYmVyfG51bWJlcltdKVtdKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnJlbW92ZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBhcnJheSB0aGF0IHByZWRpY2F0ZSByZXR1cm5zIHRydXRoeSBmb3IgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQKKyAgICAgICAgICogZWxlbWVudHMuIFRoZSBwcmVkaWNhdGUgaXMgYm91bmQgdG8gdGhpc0FyZyBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLnByb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5CisgICAgICAgICAqIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIHRoaXNBcmcgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzUHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvcgorICAgICAgICAgKiBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZSwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBwcmVkaWNhdGUgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IgZWxlbWVudHMgdGhhdAorICAgICAgICAgKiBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFVubGlrZSBfLmZpbHRlciwgdGhpcyBtZXRob2QgbXV0YXRlcyBhcnJheS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCisgICAgICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBwcmVkaWNhdGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICByZW1vdmU8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZTxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlPFcsIFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBXCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlKAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVtb3ZlCisgICAgICAgICAqLworICAgICAgICByZW1vdmUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZTxXPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVtb3ZlCisgICAgICAgICAqLworICAgICAgICByZW1vdmU8VFJlc3VsdD4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFJlc3VsdCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZTxUUmVzdWx0PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlPFcsIFRSZXN1bHQ+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlKAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVtb3ZlCisgICAgICAgICAqLworICAgICAgICByZW1vdmUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZTxXPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVtb3ZlCisgICAgICAgICAqLworICAgICAgICByZW1vdmU8VFJlc3VsdD4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFJlc3VsdCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZTxUUmVzdWx0PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgcmVtb3ZlPFcsIFRSZXN1bHQ+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18udGFpbAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAYWxpYXMgXy50YWlsCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICB0YWlsPFQ+KGFycmF5OiBMaXN0PFQ+KTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFpbAorICAgICAgICAgKi8KKyAgICAgICAgdGFpbCgpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWlsCisgICAgICAgICAqLworICAgICAgICB0YWlsPFQ+KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFpbAorICAgICAgICAgKi8KKyAgICAgICAgdGFpbCgpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWlsCisgICAgICAgICAqLworICAgICAgICB0YWlsPFQ+KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5zbGljZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGFycmF5IGZyb20gc3RhcnQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBlbmQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24uCisgICAgICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBwb3NpdGlvbi4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzbGljZSBvZiBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIHNsaWNlPFQ+KAorICAgICAgICAgICAgYXJyYXk6IFRbXSwKKyAgICAgICAgICAgIHN0YXJ0PzogbnVtYmVyLAorICAgICAgICAgICAgZW5kPzogbnVtYmVyCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNsaWNlCisgICAgICAgICAqLworICAgICAgICBzbGljZSgKKyAgICAgICAgICAgIHN0YXJ0PzogbnVtYmVyLAorICAgICAgICAgICAgZW5kPzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2xpY2UKKyAgICAgICAgICovCisgICAgICAgIHNsaWNlKAorICAgICAgICAgICAgc3RhcnQ/OiBudW1iZXIsCisgICAgICAgICAgICBlbmQ/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnNvcnRlZEluZGV4CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZAorICAgICAgICAgKiBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5zb3J0ZWRJbmRleChbMzAsIDUwXSwgNDApOworICAgICAgICAgKiAvLyA9PiAxCisgICAgICAgICAqCisgICAgICAgICAqIF8uc29ydGVkSW5kZXgoWzQsIDVdLCA0KTsKKyAgICAgICAgICogLy8gPT4gMAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VCwgVFNvcnQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleDxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4PFcsIFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VFNvcnQ+KAorICAgICAgICAgICAgdmFsdWU6IHN0cmluZworICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VFNvcnQ+KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleDxULCBUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VD4oCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VywgVD4oCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4PFRTb3J0PigKKyAgICAgICAgICAgIHZhbHVlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXg8VFNvcnQ+KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXgoCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleDxXPigKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleDxULCBUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleDxUPigKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4PFcsIFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKworICAgIH0KKworICAgIC8vXy5zb3J0ZWRJbmRleEJ5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAKKyAgICAgICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpcgorICAgICAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KKyAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgZGljdCA9IHsgJ3RoaXJ0eSc6IDMwLCAnZm9ydHknOiA0MCwgJ2ZpZnR5JzogNTAgfTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5zb3J0ZWRJbmRleEJ5KFsndGhpcnR5JywgJ2ZpZnR5J10sICdmb3J0eScsIF8ucHJvcGVydHlPZihkaWN0KSk7CisgICAgICAgICAqIC8vID0+IDEKKyAgICAgICAgICoKKyAgICAgICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQKKyAgICAgICAgICogXy5zb3J0ZWRJbmRleEJ5KFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XSwgeyAneCc6IDQgfSwgJ3gnKTsKKyAgICAgICAgICogLy8gPT4gMAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxULCBUU29ydD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBUKSA9PiBUU29ydAorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleEJ5PFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiAoeDogVCkgPT4gYW55CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IHN0cmluZworICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleEJ5PFcsIFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBXCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IE9iamVjdAorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBzdHJpbmcpID0+IFRTb3J0CisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VFNvcnQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogKHg6IFQpID0+IFRTb3J0CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4QnkoCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxXPigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IFcKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VCwgVFNvcnQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogKHg6IFQpID0+IFRTb3J0CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiAoeDogVCkgPT4gYW55CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxXLCBUPigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IFcKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxUPigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IE9iamVjdAorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBzdHJpbmcpID0+IFRTb3J0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiAoeDogVCkgPT4gVFNvcnQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleEJ5KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxXPigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkSW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkSW5kZXhCeTxULCBUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiAoeDogVCkgPT4gVFNvcnQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleEJ5PFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogKHg6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRJbmRleEJ5PFcsIFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogVworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZEluZGV4Qnk8VD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBPYmplY3QKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLnNvcnRlZExhc3RJbmRleAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdAorICAgICAgICAgKiBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8KKyAgICAgICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDVdLCA0KTsKKyAgICAgICAgICogLy8gPT4gMQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4PFQsIFRTb3J0PigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXg8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4PFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleDxXLCBUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXg8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleDxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogc3RyaW5nCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4PFRTb3J0PigKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXg8Vz4oCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXg8VCwgVFNvcnQ+KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXg8VD4oCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleDxXLCBUPigKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleDxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXg8VFNvcnQ+KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleCgKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4PFQsIFRTb3J0PigKKyAgICAgICAgICAgIHZhbHVlOiBUCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXg8VD4oCisgICAgICAgICAgICB2YWx1ZTogVAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleAorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4PFcsIFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLnNvcnRlZExhc3RJbmRleEJ5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZExhc3RJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgCisgICAgICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXIKKyAgICAgICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS4KKyAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQKKyAgICAgICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShbeyAneCc6IDQgfSwgeyAneCc6IDUgfV0sIHsgJ3gnOiA0IH0sICd4Jyk7CisgICAgICAgICAqIC8vID0+IDEKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5PFQsIFRTb3J0PigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogKHg6IFQpID0+IFRTb3J0CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogKHg6IFQpID0+IGFueQorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4Qnk8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IHN0cmluZworICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4Qnk8VywgVD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IFcKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5PFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBPYmplY3QKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBzdHJpbmcpID0+IFRTb3J0CisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiAoeDogVCkgPT4gVFNvcnQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogc3RyaW5nCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxXPigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IFcKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxULCBUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiAoeDogVCkgPT4gVFNvcnQKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5PFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogKHg6IFQpID0+IGFueQorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4Qnk8VD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5PFcsIFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogVworICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4Qnk8VD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBPYmplY3QKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxUU29ydD4oCisgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBzdHJpbmcpID0+IFRTb3J0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5PFRTb3J0PigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBUKSA9PiBUU29ydAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeSgKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxXPigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5PFQsIFRTb3J0PigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBUKSA9PiBUU29ydAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZExhc3RJbmRleEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRMYXN0SW5kZXhCeTxUPigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU6ICh4OiBUKSA9PiBhbnkKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4Qnk8VD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRMYXN0SW5kZXhCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4Qnk8VywgVD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkTGFzdEluZGV4QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZExhc3RJbmRleEJ5PFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpdGVyYXRlZTogT2JqZWN0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy5zb3J0ZWRMYXN0SW5kZXhPZiBEVU1NWQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnkKKyAgICAgICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uc29ydGVkTGFzdEluZGV4T2YoWzEsIDEsIDIsIDJdLCAyKTsKKyAgICAgICAgICogLy8gPT4gMworICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkTGFzdEluZGV4T2YoCisgICAgICAgICAgICBhcnJheTogYW55W118TGlzdDxhbnk+LAorICAgICAgICAgICAgLi4udmFsdWVzOiBhbnlbXQorICAgICAgICApOiBhbnlbXTsKKyAgICB9CisKKyAgICAvL18udGFpbAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlc3QKKyAgICAgICAgICovCisgICAgICAgIHRhaWw8VD4oYXJyYXk6IExpc3Q8VD4pOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXN0CisgICAgICAgICAqLworICAgICAgICB0YWlsKCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlc3QKKyAgICAgICAgICovCisgICAgICAgIHRhaWw8VD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXN0CisgICAgICAgICAqLworICAgICAgICB0YWlsKCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlc3QKKyAgICAgICAgICovCisgICAgICAgIHRhaWw8VD4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnRha2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBhcnJheSB3aXRoIG4gZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICB0YWtlPFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICBuPzogbnVtYmVyCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2UKKyAgICAgICAgICovCisgICAgICAgIHRha2Uobj86IG51bWJlcik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2UKKyAgICAgICAgICovCisgICAgICAgIHRha2U8VFJlc3VsdD4obj86IG51bWJlcik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZShuPzogbnVtYmVyKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZTxUUmVzdWx0PihuPzogbnVtYmVyKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLnRha2VSaWdodAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGFycmF5IHdpdGggbiBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzbGljZSBvZiBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIHRha2VSaWdodDxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgbj86IG51bWJlcgorICAgICAgICApOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIHRha2VSaWdodChuPzogbnVtYmVyKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVJpZ2h0CisgICAgICAgICAqLworICAgICAgICB0YWtlUmlnaHQ8VFJlc3VsdD4obj86IG51bWJlcik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVJpZ2h0CisgICAgICAgICAqLworICAgICAgICB0YWtlUmlnaHQobj86IG51bWJlcik6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VSaWdodAorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0PFRSZXN1bHQ+KG4/OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18udGFrZVJpZ2h0V2hpbGUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBhcnJheSB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC4gRWxlbWVudHMgYXJlIHRha2VuIHVudGlsIHByZWRpY2F0ZSByZXR1cm5zCisgICAgICAgICAqIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ucHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkKKyAgICAgICAgICogdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JlYXRlZCBfLm1hdGNoZXNQcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yCisgICAgICAgICAqIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvciBlbGVtZW50cyB0aGF0CisgICAgICAgICAqIGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIHByZWRpY2F0ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzbGljZSBvZiBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIHRha2VSaWdodFdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUVmFsdWU+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYm9vbGVhbj4KKyAgICAgICAgKTogVFZhbHVlW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFRWYWx1ZT4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogVFZhbHVlW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGU8VFdoZXJlLCBUVmFsdWU+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VFZhbHVlPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBUVmFsdWVbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VSaWdodFdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlUmlnaHRXaGlsZSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VSaWdodFdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlUmlnaHRXaGlsZSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VSaWdodFdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlUmlnaHRXaGlsZTxUV2hlcmU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VSaWdodFdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlUmlnaHRXaGlsZTxUVmFsdWU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFZhbHVlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VSaWdodFdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlUmlnaHRXaGlsZTxUVmFsdWU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGU8VFdoZXJlLCBUVmFsdWU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGU8VFdoZXJlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlUmlnaHRXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVJpZ2h0V2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVJpZ2h0V2hpbGUKKyAgICAgICAgICovCisgICAgICAgIHRha2VSaWdodFdoaWxlPFRXaGVyZSwgVFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworICAgIH0KKworICAgIC8vXy50YWtlV2hpbGUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBhcnJheSB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHMgYXJlIHRha2VuIHVudGlsIHByZWRpY2F0ZSByZXR1cm5zCisgICAgICAgICAqIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ucHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkKKyAgICAgICAgICogdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JlYXRlZCBfLm1hdGNoZXNQcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yCisgICAgICAgICAqIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvciBlbGVtZW50cyB0aGF0CisgICAgICAgICAqIGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KKyAgICAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIHByZWRpY2F0ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzbGljZSBvZiBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIHRha2VXaGlsZTxUVmFsdWU+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VFZhbHVlPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIGJvb2xlYW4+CisgICAgICAgICk6IFRWYWx1ZVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlV2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFRWYWx1ZT4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogVFZhbHVlW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIHRha2VXaGlsZTxUV2hlcmUsIFRWYWx1ZT4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUVmFsdWU+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IFRWYWx1ZVtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlV2hpbGUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIHRha2VXaGlsZSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVdoaWxlPFRXaGVyZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlV2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIHRha2VXaGlsZTxUVmFsdWU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIHRha2VXaGlsZTxUV2hlcmUsIFRWYWx1ZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFZhbHVlPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVdoaWxlKAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlV2hpbGUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YWtlV2hpbGUKKyAgICAgICAgICovCisgICAgICAgIHRha2VXaGlsZTxUV2hlcmU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRha2VXaGlsZQorICAgICAgICAgKi8KKyAgICAgICAgdGFrZVdoaWxlPFRWYWx1ZT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFZhbHVlLCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlV2hpbGU8VFZhbHVlPigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUVmFsdWU+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGFrZVdoaWxlCisgICAgICAgICAqLworICAgICAgICB0YWtlV2hpbGU8VFdoZXJlLCBUVmFsdWU+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRWYWx1ZT47CisgICAgfQorCisgICAgLy9fLnVuaW9uCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzIHVzaW5nIFNhbWVWYWx1ZVplcm8gZm9yCisgICAgICAgICAqIGVxdWFsaXR5IGNvbXBhcmlzb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgdW5pb248VD4oLi4uYXJyYXlzOiBMaXN0PFQ+W10pOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbgorICAgICAgICAgKi8KKyAgICAgICAgdW5pb24oLi4uYXJyYXlzOiBMaXN0PFQ+W10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uCisgICAgICAgICAqLworICAgICAgICB1bmlvbjxUPiguLi5hcnJheXM6IExpc3Q8VD5bXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uCisgICAgICAgICAqLworICAgICAgICB1bmlvbjxUPiguLi5hcnJheXM6IExpc3Q8VD5bXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb24KKyAgICAgICAgICovCisgICAgICAgIHVuaW9uKC4uLmFycmF5czogTGlzdDxUPltdKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbgorICAgICAgICAgKi8KKyAgICAgICAgdW5pb248VD4oLi4uYXJyYXlzOiBMaXN0PFQ+W10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbgorICAgICAgICAgKi8KKyAgICAgICAgdW5pb248VD4oLi4uYXJyYXlzOiBMaXN0PFQ+W10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18udW5pb25CeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzCisgICAgICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2gKKyAgICAgICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VD4oCisgICAgICAgICAgICBhcnJheXM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgYXJyYXlzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKHZhbHVlOiBUKSA9PiBhbnkKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czE6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czE6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKHZhbHVlOiBUKSA9PiBhbnkKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czE6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNDogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICh2YWx1ZTogVCkgPT4gYW55CisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMxOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM0OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNDogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM1OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKHZhbHVlOiBUKSA9PiBhbnkKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czE6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czQ6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICAuLi5pdGVyYXRlZTogYW55W10KKyAgICAgICAgKTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKHZhbHVlOiBUKSA9PiBhbnkKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM0OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKHZhbHVlOiBUKSA9PiBhbnkKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czQ6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM0OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czU6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNDogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM1OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VD4oCisgICAgICAgICAgICAuLi5pdGVyYXRlZTogYW55W10KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKHZhbHVlOiBUKSA9PiBhbnkKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM0OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogKHZhbHVlOiBUKSA9PiBhbnkKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQsIFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czQ6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM0OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czU6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNDogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM1OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VD4oCisgICAgICAgICAgICAuLi5pdGVyYXRlZTogYW55W10KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICh2YWx1ZTogVCkgPT4gYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICh2YWx1ZTogVCkgPT4gYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czQ6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNDogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czQ6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICh2YWx1ZTogVCkgPT4gYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM0OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czU6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIC4uLml0ZXJhdGVlOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICh2YWx1ZTogVCkgPT4gYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICh2YWx1ZTogVCkgPT4gYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czQ6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiAodmFsdWU6IFQpID0+IGFueQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaW9uQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaW9uQnk8VCwgVyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBhcnJheXMyOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czM6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNDogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlvbkJ5CisgICAgICAgICAqLworICAgICAgICB1bmlvbkJ5PFQ+KAorICAgICAgICAgICAgYXJyYXlzMjogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXMzOiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czQ6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzNTogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86ICh2YWx1ZTogVCkgPT4gYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxULCBXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGFycmF5czI6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgYXJyYXlzMzogVFtdfExpc3Q8VD4sCisgICAgICAgICAgICBhcnJheXM0OiBUW118TGlzdDxUPiwKKyAgICAgICAgICAgIGFycmF5czU6IFRbXXxMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pb25CeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pb25CeTxUPigKKyAgICAgICAgICAgIC4uLml0ZXJhdGVlOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18udW5pcQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgYW4gYXJyYXksIHVzaW5nCisgICAgICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCisgICAgICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnQKKyAgICAgICAgICogaXMga2VwdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLnVuaXEoWzIsIDEsIDJdKTsKKyAgICAgICAgICogLy8gPT4gWzIsIDFdCisgICAgICAgICAqLworICAgICAgICB1bmlxPFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcTxULCBUU29ydD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPgorICAgICAgICApOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcTxUU29ydD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxCisgICAgICAgICAqLworICAgICAgICB1bmlxPFRTb3J0PigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaXEKKyAgICAgICAgICovCisgICAgICAgIHVuaXEoKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIHVuaXE8VD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxCisgICAgICAgICAqLworICAgICAgICB1bmlxPFQsIFRTb3J0PigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxCisgICAgICAgICAqLworICAgICAgICB1bmlxPFRTb3J0PigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaXEKKyAgICAgICAgICovCisgICAgICAgIHVuaXE8VFNvcnQ+KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcSgpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxCisgICAgICAgICAqLworICAgICAgICB1bmlxPFQ+KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcTxULCBUU29ydD4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnVuaXFCeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXMKKyAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaAorICAgICAgICAgKiB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTsKKyAgICAgICAgICogLy8gPT4gWzIuMSwgMS4yXQorICAgICAgICAgKgorICAgICAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZAorICAgICAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7CisgICAgICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcUJ5PFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcUJ5CisgICAgICAgICAqLworICAgICAgICB1bmlxQnk8VCwgVFNvcnQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIFRTb3J0PgorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU6IHN0cmluZworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU6IE9iamVjdAorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUV2hlcmUgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBUV2hlcmUKKyAgICAgICAgKTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcUJ5PFRTb3J0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcUJ5CisgICAgICAgICAqLworICAgICAgICB1bmlxQnk8VFNvcnQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUV2hlcmUgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBpdGVyYXRlZTogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcUJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcUJ5CisgICAgICAgICAqLworICAgICAgICB1bmlxQnk8VCwgVFNvcnQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBPYmplY3QKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUV2hlcmUgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICBpdGVyYXRlZTogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcUJ5PFRTb3J0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcUJ5CisgICAgICAgICAqLworICAgICAgICB1bmlxQnk8VFNvcnQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUV2hlcmUgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBpdGVyYXRlZTogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcUJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcUJ5CisgICAgICAgICAqLworICAgICAgICB1bmlxQnk8VCwgVFNvcnQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBPYmplY3QKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHVuaXFCeTxUV2hlcmUgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICBpdGVyYXRlZTogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5zb3J0ZWRVbmlxCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZAorICAgICAgICAgKiBmb3Igc29ydGVkIGFycmF5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLnNvcnRlZFVuaXEoWzEsIDEsIDJdKTsKKyAgICAgICAgICogLy8gPT4gWzEsIDJdCisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxPFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcTxULCBUU29ydD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPgorICAgICAgICApOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcTxUU29ydD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxCisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxPFRTb3J0PigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZFVuaXEKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZFVuaXEoKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIHNvcnRlZFVuaXE8VD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxCisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxPFQsIFRTb3J0PigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxCisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxPFRTb3J0PigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZFVuaXEKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZFVuaXE8VFNvcnQ+KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcSgpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxCisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxPFQ+KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcTxULCBUU29ydD4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnNvcnRlZFVuaXFCeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZAorICAgICAgICAgKiBmb3Igc29ydGVkIGFycmF5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLnNvcnRlZFVuaXFCeShbMS4xLCAxLjIsIDIuMywgMi40XSwgTWF0aC5mbG9vcik7CisgICAgICAgICAqIC8vID0+IFsxLjEsIDIuMl0KKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZFVuaXFCeTxUPigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZFVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcUJ5PFQsIFRTb3J0PigKKyAgICAgICAgICAgIGFycmF5OiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBzdHJpbmcKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBPYmplY3QKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VFdoZXJlIGV4dGVuZHMge30sIFQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZTogVFdoZXJlCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZFVuaXFCeTxUU29ydD4oCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIFRTb3J0PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZFVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcUJ5PFRTb3J0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnkoCisgICAgICAgICAgICBpdGVyYXRlZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VFdoZXJlIGV4dGVuZHMge30+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZFVuaXFCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZFVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcUJ5PFQsIFRTb3J0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZTogT2JqZWN0CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VFdoZXJlIGV4dGVuZHMge30sIFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZFVuaXFCeTxUU29ydD4oCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIFRTb3J0PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZFVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcUJ5PFRTb3J0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnkoCisgICAgICAgICAgICBpdGVyYXRlZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VFdoZXJlIGV4dGVuZHMge30+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0ZWRVbmlxQnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRlZFVuaXFCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRlZFVuaXFCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydGVkVW5pcUJ5PFQsIFRTb3J0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZTogT2JqZWN0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydGVkVW5pcUJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0ZWRVbmlxQnk8VFdoZXJlIGV4dGVuZHMge30sIFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18udW5pb25XaXRoIERVTU1ZCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaAorICAgICAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWQKKyAgICAgICAgICogd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTsKKyAgICAgICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07CisgICAgICAgICAqCisgICAgICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTsKKyAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dCisgICAgICAgICAqLworICAgICAgICB1bmlvbldpdGgoCisgICAgICAgICAgICBhcnJheTogYW55W118TGlzdDxhbnk+LAorICAgICAgICAgICAgLi4udmFsdWVzOiBhbnlbXQorICAgICAgICApOiBhbnlbXTsKKyAgICB9CisKKyAgICAvL18udW5pcVdpdGggRFVNTVkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2gKKyAgICAgICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWQgd2l0aAorICAgICAgICAgKiB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgIHsgJ3gnOiAxLCAneSc6IDIgfV07CisgICAgICAgICAqCisgICAgICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTsKKyAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XQorICAgICAgICAgKi8KKyAgICAgICAgdW5pcVdpdGgoCisgICAgICAgICAgICBhcnJheTogYW55W118TGlzdDxhbnk+LAorICAgICAgICAgICAgLi4udmFsdWVzOiBhbnlbXQorICAgICAgICApOiBhbnlbXTsKKyAgICB9CisKKyAgICAvL18udW56aXAKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy56aXAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5CisgICAgICAgICAqIHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXAgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHVuemlwPFQ+KGFycmF5OiBMaXN0PExpc3Q8VD4+KTogVFtdW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bnppcAorICAgICAgICAgKi8KKyAgICAgICAgdW56aXA8VD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFtdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bnppcAorICAgICAgICAgKi8KKyAgICAgICAgdW56aXA8VD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFtdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuemlwCisgICAgICAgICAqLworICAgICAgICB1bnppcDxUPigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUW10+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuemlwCisgICAgICAgICAqLworICAgICAgICB1bnppcDxUPigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUW10+OworICAgIH0KKworICAgIC8vXy51bnppcFdpdGgKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy51bnppcCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGl0ZXJhdGVlIHRvIHNwZWNpZnkgaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlCisgICAgICAgICAqIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgYm91bmQgdG8gdGhpc0FyZyBhbmQgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwKKyAgICAgICAgICogZ3JvdXApLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lIHJlZ3JvdXBlZCB2YWx1ZXMuCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgaXRlcmF0ZWUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHVuemlwV2l0aDxUQXJyYXksIFRSZXN1bHQ+KAorICAgICAgICAgICAgYXJyYXk6IExpc3Q8TGlzdDxUQXJyYXk+PiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTWVtb0l0ZXJhdG9yPFRBcnJheSwgVFJlc3VsdD4KKyAgICAgICAgKTogVFJlc3VsdFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW56aXBXaXRoCisgICAgICAgICAqLworICAgICAgICB1bnppcFdpdGg8VEFyciwgVFJlc3VsdD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IE1lbW9JdGVyYXRvcjxUQXJyLCBUUmVzdWx0PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bnppcFdpdGgKKyAgICAgICAgICovCisgICAgICAgIHVuemlwV2l0aDxUQXJyLCBUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTWVtb0l0ZXJhdG9yPFRBcnIsIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy53aXRob3V0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgcHJvdmlkZWQgdmFsdWVzIHVzaW5nIFNhbWVWYWx1ZVplcm8gZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbHRlci4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHdpdGhvdXQ8VD4oCisgICAgICAgICAgICBhcnJheTogTGlzdDxUPiwKKyAgICAgICAgICAgIC4uLnZhbHVlczogVFtdCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLndpdGhvdXQKKyAgICAgICAgICovCisgICAgICAgIHdpdGhvdXQoLi4udmFsdWVzOiBUW10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy53aXRob3V0CisgICAgICAgICAqLworICAgICAgICB3aXRob3V0PFQ+KC4uLnZhbHVlczogVFtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy53aXRob3V0CisgICAgICAgICAqLworICAgICAgICB3aXRob3V0KC4uLnZhbHVlczogVFtdKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud2l0aG91dAorICAgICAgICAgKi8KKyAgICAgICAgd2l0aG91dDxUPiguLi52YWx1ZXM6IFRbXSk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy54b3IKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgeG9yPFQ+KC4uLmFycmF5czogTGlzdDxUPltdKTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ueG9yCisgICAgICAgICAqLworICAgICAgICB4b3IoLi4uYXJyYXlzOiBMaXN0PFQ+W10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy54b3IKKyAgICAgICAgICovCisgICAgICAgIHhvcjxUPiguLi5hcnJheXM6IExpc3Q8VD5bXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ueG9yCisgICAgICAgICAqLworICAgICAgICB4b3IoLi4uYXJyYXlzOiBMaXN0PFQ+W10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy54b3IKKyAgICAgICAgICovCisgICAgICAgIHhvcjxUPiguLi5hcnJheXM6IExpc3Q8VD5bXSk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy54b3JCeSBEVU1NWQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpcworICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoCisgICAgICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQorICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzQuMywgMi40XSwgTWF0aC5mbG9vcik7CisgICAgICAgICAqIC8vID0+IFsxLjIsIDQuM10KKyAgICAgICAgICoKKyAgICAgICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQKKyAgICAgICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTsKKyAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dCisgICAgICAgICAqLworICAgICAgICB4b3JCeSgKKyAgICAgICAgICAgIGFycmF5OiBhbnlbXXxMaXN0PGFueT4sCisgICAgICAgICAgICAuLi52YWx1ZXM6IGFueVtdCisgICAgICAgICk6IGFueVtdOworICAgIH0KKworICAgIC8vXy54b3JXaXRoIERVTU1ZCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2ggaXMKKyAgICAgICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkIHdpdGgKKyAgICAgICAgICogdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKKyAgICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC4KKyAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgdmFsdWVzLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07CisgICAgICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dOworICAgICAgICAgKgorICAgICAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpOworICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dCisgICAgICAgICAqLworICAgICAgICB4b3JXaXRoKAorICAgICAgICAgICAgYXJyYXk6IGFueVtdfExpc3Q8YW55PiwKKyAgICAgICAgICAgIC4uLnZhbHVlczogYW55W10KKyAgICAgICAgKTogYW55W107CisgICAgfQorCisgICAgLy9fLnppcAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsCisgICAgICAgICAqIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlIHNlY29uZCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCBhbmQgc28gb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcnJheXMgVGhlIGFycmF5cyB0byBwcm9jZXNzLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgemlwPFQ+KC4uLmFycmF5czogTGlzdDxUPltdKTogVFtdW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy56aXAKKyAgICAgICAgICovCisgICAgICAgIHppcDxUPiguLi5hcnJheXM6IExpc3Q8VD5bXSk6IF8uTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFtdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy56aXAKKyAgICAgICAgICovCisgICAgICAgIHppcDxUPiguLi5hcnJheXM6IExpc3Q8VD5bXSk6IF8uTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFtdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcAorICAgICAgICAgKi8KKyAgICAgICAgemlwPFQ+KC4uLmFycmF5czogTGlzdDxUPltdKTogXy5Mb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUW10+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcAorICAgICAgICAgKi8KKyAgICAgICAgemlwPFQ+KC4uLmFycmF5czogTGlzdDxUPltdKTogXy5Mb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUW10+OworICAgIH0KKworICAgIC8vXy56aXBPYmplY3QKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbnZlcnNlIG9mIF8ucGFpcnM7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkIGZyb20gYXJyYXlzIG9mIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMuCisgICAgICAgICAqIFByb3ZpZGUgZWl0aGVyIGEgc2luZ2xlIHR3byBkaW1lbnNpb25hbCBhcnJheSwgZS5nLiBbW2tleTEsIHZhbHVlMV0sIFtrZXkyLCB2YWx1ZTJdXSBvciB0d28gYXJyYXlzLCBvbmUgb2YKKyAgICAgICAgICogcHJvcGVydHkgbmFtZXMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgcHJvcGVydHkgdmFsdWVzLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICB6aXBPYmplY3Q8VFZhbHVlcywgVFJlc3VsdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHByb3BzOiBMaXN0PFN0cmluZ1JlcHJlc2VudGFibGU+fExpc3Q8TGlzdDxhbnk+PiwKKyAgICAgICAgICAgIHZhbHVlcz86IExpc3Q8VFZhbHVlcz4KKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgemlwT2JqZWN0PFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBwcm9wczogTGlzdDxTdHJpbmdSZXByZXNlbnRhYmxlPnxMaXN0PExpc3Q8YW55Pj4sCisgICAgICAgICAgICB2YWx1ZXM/OiBMaXN0PGFueT4KKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgemlwT2JqZWN0KAorICAgICAgICAgICAgcHJvcHM6IExpc3Q8U3RyaW5nUmVwcmVzZW50YWJsZT58TGlzdDxMaXN0PGFueT4+LAorICAgICAgICAgICAgdmFsdWVzPzogTGlzdDxhbnk+CisgICAgICAgICk6IF8uRGljdGlvbmFyeTxhbnk+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uemlwT2JqZWN0CisgICAgICAgICAqLworICAgICAgICB6aXBPYmplY3Q8VFZhbHVlcywgVFJlc3VsdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHZhbHVlcz86IExpc3Q8VFZhbHVlcz4KKyAgICAgICAgKTogXy5Mb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy56aXBPYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHppcE9iamVjdDxUUmVzdWx0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgdmFsdWVzPzogTGlzdDxhbnk+CisgICAgICAgICk6IF8uTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uemlwT2JqZWN0CisgICAgICAgICAqLworICAgICAgICB6aXBPYmplY3QoCisgICAgICAgICAgICB2YWx1ZXM/OiBMaXN0PGFueT4KKyAgICAgICAgKTogXy5Mb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8Xy5EaWN0aW9uYXJ5PGFueT4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgemlwT2JqZWN0PFRWYWx1ZXMsIFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICB2YWx1ZXM/OiBMaXN0PFRWYWx1ZXM+CisgICAgICAgICk6IF8uTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uemlwT2JqZWN0CisgICAgICAgICAqLworICAgICAgICB6aXBPYmplY3Q8VFJlc3VsdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHZhbHVlcz86IExpc3Q8YW55PgorICAgICAgICApOiBfLkxvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgemlwT2JqZWN0KAorICAgICAgICAgICAgdmFsdWVzPzogTGlzdDxhbnk+CisgICAgICAgICk6IF8uTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPF8uRGljdGlvbmFyeTxhbnk+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgemlwT2JqZWN0PFRWYWx1ZXMsIFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICB2YWx1ZXM/OiBMaXN0PFRWYWx1ZXM+CisgICAgICAgICk6IF8uTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uemlwT2JqZWN0CisgICAgICAgICAqLworICAgICAgICB6aXBPYmplY3Q8VFJlc3VsdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHZhbHVlcz86IExpc3Q8YW55PgorICAgICAgICApOiBfLkxvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgemlwT2JqZWN0KAorICAgICAgICAgICAgdmFsdWVzPzogTGlzdDxhbnk+CisgICAgICAgICk6IF8uTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPF8uRGljdGlvbmFyeTxhbnk+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy56aXBPYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHppcE9iamVjdDxUVmFsdWVzLCBUUmVzdWx0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgdmFsdWVzPzogTGlzdDxUVmFsdWVzPgorICAgICAgICApOiBfLkxvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnppcE9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgemlwT2JqZWN0PFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICB2YWx1ZXM/OiBMaXN0PGFueT4KKyAgICAgICAgKTogXy5Mb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy56aXBPYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHppcE9iamVjdCgKKyAgICAgICAgICAgIHZhbHVlcz86IExpc3Q8YW55PgorICAgICAgICApOiBfLkxvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxfLkRpY3Rpb25hcnk8YW55Pj47CisgICAgfQorCisgICAgLy9fLnppcFdpdGgKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy56aXAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBpdGVyYXRlZSB0byBzcGVjaWZ5IGhvdyBncm91cGVkIHZhbHVlcyBzaG91bGQgYmUKKyAgICAgICAgICogY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LAorICAgICAgICAgKiBncm91cCkuCisgICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy4KKyAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBncm91cGVkIHZhbHVlcy4KKyAgICAgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICB6aXBXaXRoPFRSZXN1bHQ+KC4uLmFyZ3M6IGFueVtdKTogVFJlc3VsdFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uemlwV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgemlwV2l0aDxUUmVzdWx0PiguLi5hcmdzOiBhbnlbXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8qKioqKioqKioKKyAgICAgKiBDaGFpbiAqCisgICAgICoqKioqKioqKi8KKworICAgICAgICAvL18uY2hhaW4KKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBsb2Rhc2ggb2JqZWN0IHRoYXQgd3JhcHMgdmFsdWUgd2l0aCBleHBsaWNpdCBtZXRob2QgY2hhaW5pbmcgZW5hYmxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBsb2Rhc2ggd3JhcHBlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIGNoYWluKHZhbHVlOiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICAgICAgY2hhaW4odmFsdWU6IHN0cmluZyk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgICAgICBjaGFpbih2YWx1ZTogYm9vbGVhbik6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICAgICAgY2hhaW48VD4odmFsdWU6IFRbXSk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgICAgICBjaGFpbjxUIGV4dGVuZHMge30+KHZhbHVlOiBUKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworICAgICAgICBjaGFpbih2YWx1ZTogYW55KTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGFueT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2hhaW4KKyAgICAgICAgICovCisgICAgICAgIGNoYWluKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNoYWluCisgICAgICAgICAqLworICAgICAgICBjaGFpbigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jaGFpbgorICAgICAgICAgKi8KKyAgICAgICAgY2hhaW4oKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2hhaW4KKyAgICAgICAgICovCisgICAgICAgIGNoYWluKCk6IFRXcmFwcGVyOworICAgIH0KKworICAgIC8vXy50YXAKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgaW50ZXJjZXB0b3IgYW5kIHJldHVybnMgdmFsdWUuIFRoZSBpbnRlcmNlcHRvciBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggb25lCisgICAgICAgICAqIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byAidGFwIGludG8iIGEgbWV0aG9kIGNoYWluIGluIG9yZGVyIHRvIHBlcmZvcm0gb3BlcmF0aW9ucworICAgICAgICAgKiBvbiBpbnRlcm1lZGlhdGUgcmVzdWx0cyB3aXRoaW4gdGhlIGNoYWluLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gaW50ZXJjZXB0b3IuCisgICAgICAgICAqIEBwYXJhbSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLgorICAgICAgICAgKiBAcGFyZW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGludGVyY2VwdG9yLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdmFsdWUuCisgICAgICAgICAqKi8KKyAgICAgICAgdGFwPFQ+KAorICAgICAgICAgICAgdmFsdWU6IFQsCisgICAgICAgICAgICBpbnRlcmNlcHRvcjogKHZhbHVlOiBUKSA9PiB2b2lkCisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YXAKKyAgICAgICAgICovCisgICAgICAgIHRhcCgKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IHZvaWQKKyAgICAgICAgKTogVFdyYXBwZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50YXAKKyAgICAgICAgICovCisgICAgICAgIHRhcCgKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IHZvaWQKKyAgICAgICAgKTogVFdyYXBwZXI7CisgICAgfQorCisgICAgLy9fLnRocnUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy50YXAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVyY2VwdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gaW50ZXJjZXB0b3IuCisgICAgICAgICAqIEBwYXJhbSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGludGVyY2VwdG9yLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcmNlcHRvci4KKyAgICAgICAgICovCisgICAgICAgIHRocnU8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHQKKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRocnUKKyAgICAgICAgICovCisgICAgICAgIHRocnU8VFJlc3VsdCBleHRlbmRzIG51bWJlcj4oCisgICAgICAgICAgICBpbnRlcmNlcHRvcjogKHZhbHVlOiBUKSA9PiBUUmVzdWx0KTogTG9EYXNoSW1wbGljaXRXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGhydQorICAgICAgICAgKi8KKyAgICAgICAgdGhydTxUUmVzdWx0IGV4dGVuZHMgc3RyaW5nPigKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHQpOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50aHJ1CisgICAgICAgICAqLworICAgICAgICB0aHJ1PFRSZXN1bHQgZXh0ZW5kcyBib29sZWFuPigKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHQpOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50aHJ1CisgICAgICAgICAqLworICAgICAgICB0aHJ1PFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBpbnRlcmNlcHRvcjogKHZhbHVlOiBUKSA9PiBUUmVzdWx0KTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGhydQorICAgICAgICAgKi8KKyAgICAgICAgdGhydTxUUmVzdWx0PigKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHRbXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGhydQorICAgICAgICAgKi8KKyAgICAgICAgdGhydTxUUmVzdWx0IGV4dGVuZHMgbnVtYmVyPigKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGhydQorICAgICAgICAgKi8KKyAgICAgICAgdGhydTxUUmVzdWx0IGV4dGVuZHMgc3RyaW5nPigKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGhydQorICAgICAgICAgKi8KKyAgICAgICAgdGhydTxUUmVzdWx0IGV4dGVuZHMgYm9vbGVhbj4oCisgICAgICAgICAgICBpbnRlcmNlcHRvcjogKHZhbHVlOiBUKSA9PiBUUmVzdWx0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRocnUKKyAgICAgICAgICovCisgICAgICAgIHRocnU8VFJlc3VsdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGhydQorICAgICAgICAgKi8KKyAgICAgICAgdGhydTxUUmVzdWx0PigKKyAgICAgICAgICAgIGludGVyY2VwdG9yOiAodmFsdWU6IFQpID0+IFRSZXN1bHRbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ucHJvdG90eXBlLmNvbW1pdAorICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW5lZCBzZXF1ZW5jZSBhbmQgcmV0dXJucyB0aGUgd3JhcHBlZCByZXN1bHQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGxvZGFzaCB3cmFwcGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgY29tbWl0KCk6IFRXcmFwcGVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY29tbWl0CisgICAgICAgICAqLworICAgICAgICBjb21taXQoKTogVFdyYXBwZXI7CisgICAgfQorCisgICAgLy9fLnByb3RvdHlwZS5jb25jYXQKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBhcnJheSBqb2luaW5nIGEgd3JhcHBlZCBhcnJheSB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5cyBhbmQvb3IgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaXRlbXMKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgY29uY2F0PFRJdGVtPiguLi5pdGVtczogQXJyYXk8VEl0ZW18QXJyYXk8VEl0ZW0+Pik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRJdGVtPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvbmNhdAorICAgICAgICAgKi8KKyAgICAgICAgY29uY2F0KC4uLml0ZW1zOiBBcnJheTxUfEFycmF5PFQ+Pik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY29uY2F0CisgICAgICAgICAqLworICAgICAgICBjb25jYXQ8VEl0ZW0+KC4uLml0ZW1zOiBBcnJheTxUSXRlbXxBcnJheTxUSXRlbT4+KTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VEl0ZW0+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY29uY2F0CisgICAgICAgICAqLworICAgICAgICBjb25jYXQoLi4uaXRlbXM6IEFycmF5PFR8QXJyYXk8VD4+KTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnByb3RvdHlwZS5wbGFudAorICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluZWQgc2VxdWVuY2UgcGxhbnRpbmcgdmFsdWUgYXMgdGhlIHdyYXBwZWQgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQgYXMgdGhlIHdyYXBwZWQgdmFsdWUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGxvZGFzaCB3cmFwcGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcGxhbnQodmFsdWU6IG51bWJlcik6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGxhbnQKKyAgICAgICAgICovCisgICAgICAgIHBsYW50KHZhbHVlOiBzdHJpbmcpOiBMb0Rhc2hJbXBsaWNpdFN0cmluZ1dyYXBwZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wbGFudAorICAgICAgICAgKi8KKyAgICAgICAgcGxhbnQodmFsdWU6IGJvb2xlYW4pOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wbGFudAorICAgICAgICAgKi8KKyAgICAgICAgcGxhbnQodmFsdWU6IG51bWJlcltdKTogTG9EYXNoSW1wbGljaXROdW1iZXJBcnJheVdyYXBwZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wbGFudAorICAgICAgICAgKi8KKyAgICAgICAgcGxhbnQ8VD4odmFsdWU6IFRbXSk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGxhbnQKKyAgICAgICAgICovCisgICAgICAgIHBsYW50PFQgZXh0ZW5kcyB7fT4odmFsdWU6IFQpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wbGFudAorICAgICAgICAgKi8KKyAgICAgICAgcGxhbnQodmFsdWU6IGFueSk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxhbnk+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGxhbnQKKyAgICAgICAgICovCisgICAgICAgIHBsYW50KHZhbHVlOiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBsYW50CisgICAgICAgICAqLworICAgICAgICBwbGFudCh2YWx1ZTogc3RyaW5nKTogTG9EYXNoRXhwbGljaXRTdHJpbmdXcmFwcGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGxhbnQKKyAgICAgICAgICovCisgICAgICAgIHBsYW50KHZhbHVlOiBib29sZWFuKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGxhbnQKKyAgICAgICAgICovCisgICAgICAgIHBsYW50KHZhbHVlOiBudW1iZXJbXSk6IExvRGFzaEV4cGxpY2l0TnVtYmVyQXJyYXlXcmFwcGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGxhbnQKKyAgICAgICAgICovCisgICAgICAgIHBsYW50PFQ+KHZhbHVlOiBUW10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBsYW50CisgICAgICAgICAqLworICAgICAgICBwbGFudDxUIGV4dGVuZHMge30+KHZhbHVlOiBUKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGxhbnQKKyAgICAgICAgICovCisgICAgICAgIHBsYW50KHZhbHVlOiBhbnkpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8YW55PjsKKyAgICB9CisKKyAgICAvL18ucHJvdG90eXBlLnJldmVyc2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogUmV2ZXJzZXMgdGhlIHdyYXBwZWQgYXJyYXkgc28gdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZCBlbGVtZW50IGJlY29tZXMgdGhlIHNlY29uZCB0bworICAgICAgICAgKiBsYXN0LCBhbmQgc28gb24uCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIG11dGF0ZXMgdGhlIHdyYXBwZWQgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IHJldmVyc2VkIGxvZGFzaCB3cmFwcGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcmV2ZXJzZSgpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJldmVyc2UKKyAgICAgICAgICovCisgICAgICAgIHJldmVyc2UoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnByb3RvdHlwZS50b0pTT04KKyAgICBpbnRlcmZhY2UgTG9EYXNoV3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy52YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgdG9KU09OKCk6IFQ7CisgICAgfQorCisgICAgLy9fLnByb3RvdHlwZS50b1N0cmluZworICAgIGludGVyZmFjZSBMb0Rhc2hXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogUHJvZHVjZXMgdGhlIHJlc3VsdCBvZiBjb2VyY2luZyB0aGUgdW53cmFwcGVkIHZhbHVlIHRvIGEgc3RyaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvZXJjZWQgc3RyaW5nIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgdG9TdHJpbmcoKTogc3RyaW5nOworICAgIH0KKworICAgIC8vXy5wcm90b3R5cGUudmFsdWUKKyAgICBpbnRlcmZhY2UgTG9EYXNoV3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbmVkIHNlcXVlbmNlIHRvIGV4dHJhY3QgdGhlIHVud3JhcHBlZCB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQGFsaWFzIF8udG9KU09OLCBfLnZhbHVlT2YKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICB2YWx1ZSgpOiBUOworICAgIH0KKworICAgIC8vXy52YWx1ZU9mCisgICAgaW50ZXJmYWNlIExvRGFzaFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHZhbHVlT2YoKTogVDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioKKyAgICAgKiBDb2xsZWN0aW9uICoKKyAgICAgKioqKioqKioqKioqKiovCisKKyAgICAgICAgLy9fLmF0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleXMsIG9yIGluZGV4ZXMsIG9mIGNvbGxlY3Rpb24uIEtleXMgbWF5IGJlCisgICAgICAgICAqIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBhcyBhcnJheXMgb2Yga2V5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIG9yIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcGljaywgc3BlY2lmaWVkIGluZGl2aWR1YWxseSBvciBpbiBhcnJheXMuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHBpY2tlZCBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIGF0PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgLi4ucHJvcHM6IChudW1iZXJ8c3RyaW5nfChudW1iZXJ8c3RyaW5nKVtdKVtdCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmF0CisgICAgICAgICAqLworICAgICAgICBhdCguLi5wcm9wczogKG51bWJlcnxzdHJpbmd8KG51bWJlcnxzdHJpbmcpW10pW10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hdAorICAgICAgICAgKi8KKyAgICAgICAgYXQ8VD4oLi4ucHJvcHM6IChudW1iZXJ8c3RyaW5nfChudW1iZXJ8c3RyaW5nKVtdKVtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hdAorICAgICAgICAgKi8KKyAgICAgICAgYXQoLi4ucHJvcHM6IChudW1iZXJ8c3RyaW5nfChudW1iZXJ8c3RyaW5nKVtdKVtdKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXQKKyAgICAgICAgICovCisgICAgICAgIGF0PFQ+KC4uLnByb3BzOiAobnVtYmVyfHN0cmluZ3wobnVtYmVyfHN0cmluZylbXSlbXSk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5jb3VudEJ5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIGNvbGxlY3Rpb24gdGhyb3VnaAorICAgICAgICAgKiBpdGVyYXRlZS4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2YgZWFjaCBrZXkgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IHdhcyByZXR1cm5lZCBieSBpdGVyYXRlZS4gVGhlCisgICAgICAgICAqIGl0ZXJhdGVlIGlzIGJvdW5kIHRvIHRoaXNBcmcgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6CisgICAgICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBpdGVyYXRlZSB0aGUgY3JlYXRlZCBfLnByb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5CisgICAgICAgICAqIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIHRoaXNBcmcgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzUHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvcgorICAgICAgICAgKiBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZSwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBpdGVyYXRlZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvciBlbGVtZW50cyB0aGF0CisgICAgICAgICAqIGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBpdGVyYXRlZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgY291bnRCeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IERpY3Rpb25hcnk8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvdW50QnkKKyAgICAgICAgICovCisgICAgICAgIGNvdW50Qnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBEaWN0aW9uYXJ5PG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb3VudEJ5CisgICAgICAgICAqLworICAgICAgICBjb3VudEJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTnVtZXJpY0RpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBEaWN0aW9uYXJ5PG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb3VudEJ5CisgICAgICAgICAqLworICAgICAgICBjb3VudEJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+fE51bWVyaWNEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogRGljdGlvbmFyeTxudW1iZXI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY291bnRCeQorICAgICAgICAgKi8KKyAgICAgICAgY291bnRCeTxXLCBUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPnxOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBEaWN0aW9uYXJ5PG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb3VudEJ5CisgICAgICAgICAqLworICAgICAgICBjb3VudEJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+fE51bWVyaWNEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBPYmplY3QKKyAgICAgICAgKTogRGljdGlvbmFyeTxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvdW50QnkKKyAgICAgICAgICovCisgICAgICAgIGNvdW50QnkoCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PG51bWJlcj4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY291bnRCeQorICAgICAgICAgKi8KKyAgICAgICAgY291bnRCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8bnVtYmVyPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb3VudEJ5CisgICAgICAgICAqLworICAgICAgICBjb3VudEJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8bnVtYmVyPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb3VudEJ5CisgICAgICAgICAqLworICAgICAgICBjb3VudEJ5PFc+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PG51bWJlcj4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvdW50QnkKKyAgICAgICAgICovCisgICAgICAgIGNvdW50Qnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+fERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxudW1iZXI+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvdW50QnkKKyAgICAgICAgICovCisgICAgICAgIGNvdW50QnkoCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxudW1iZXI+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvdW50QnkKKyAgICAgICAgICovCisgICAgICAgIGNvdW50Qnk8Vz4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8bnVtYmVyPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY291bnRCeQorICAgICAgICAgKi8KKyAgICAgICAgY291bnRCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8bnVtYmVyPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb3VudEJ5CisgICAgICAgICAqLworICAgICAgICBjb3VudEJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxudW1iZXI+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvdW50QnkKKyAgICAgICAgICovCisgICAgICAgIGNvdW50QnkoCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxudW1iZXI+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNvdW50QnkKKyAgICAgICAgICovCisgICAgICAgIGNvdW50Qnk8Vz4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8bnVtYmVyPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY291bnRCeQorICAgICAgICAgKi8KKyAgICAgICAgY291bnRCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT58RGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58TnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PG51bWJlcj4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY291bnRCeQorICAgICAgICAgKi8KKyAgICAgICAgY291bnRCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PG51bWJlcj4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY291bnRCeQorICAgICAgICAgKi8KKyAgICAgICAgY291bnRCeTxXPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxudW1iZXI+PjsKKyAgICB9CisKKyAgICAvL18uZWFjaAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckVhY2gKKyAgICAgICAgICovCisgICAgICAgIGVhY2g8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBUW10sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckVhY2gKKyAgICAgICAgICovCisgICAgICAgIGVhY2g8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMaXN0PFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaAorICAgICAgICAgKi8KKyAgICAgICAgZWFjaDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBlYWNoPFQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBPYmplY3RJdGVyYXRvcjxhbnksIGFueT4KKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckVhY2gKKyAgICAgICAgICovCisgICAgICAgIGVhY2g8VCBleHRlbmRzIHt9LCBUVmFsdWU+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0SXRlcmF0b3I8VFZhbHVlLCBhbnk+CisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaAorICAgICAgICAgKi8KKyAgICAgICAgZWFjaCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaAorICAgICAgICAgKi8KKyAgICAgICAgZWFjaCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBlYWNoPFRWYWx1ZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIGFueT58RGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZSwgYW55PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaAorICAgICAgICAgKi8KKyAgICAgICAgZWFjaCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaAorICAgICAgICAgKi8KKyAgICAgICAgZWFjaCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBlYWNoPFRWYWx1ZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIGFueT58RGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZSwgYW55PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLmVhY2hSaWdodAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckVhY2hSaWdodAorICAgICAgICAgKi8KKyAgICAgICAgZWFjaFJpZ2h0PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogVFtdLAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGVhY2hSaWdodDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExpc3Q8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGVhY2hSaWdodDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGVhY2hSaWdodDxUIGV4dGVuZHMge30+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0SXRlcmF0b3I8YW55LCBhbnk+CisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGVhY2hSaWdodDxUIGV4dGVuZHMge30sIFRWYWx1ZT4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBPYmplY3RJdGVyYXRvcjxUVmFsdWUsIGFueT4KKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGVhY2hSaWdodCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBlYWNoUmlnaHQoCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBlYWNoUmlnaHQ8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlLCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGVhY2hSaWdodCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBlYWNoUmlnaHQoCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBlYWNoUmlnaHQ8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlLCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uZXZlcnkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBwcmVkaWNhdGUgcmV0dXJucyB0cnV0aHkgZm9yIGFsbCBlbGVtZW50cyBvZiBjb2xsZWN0aW9uLiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIHByZWRpY2F0ZQorICAgICAgICAgKiByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmV2ZXJ5CisgICAgICAgICAqLworICAgICAgICBldmVyeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPnxOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZ3xhbnlbXQorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZXZlcnkKKyAgICAgICAgICovCisgICAgICAgIGV2ZXJ5PFRPYmplY3QgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD58TnVtZXJpY0RpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUT2JqZWN0CisgICAgICAgICk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnkoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj58TnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZXZlcnkKKyAgICAgICAgICovCisgICAgICAgIGV2ZXJ5KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nfGFueVtdCisgICAgICAgICk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnk8VE9iamVjdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRPYmplY3QKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnk8VFJlc3VsdD4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFJlc3VsdCwgYm9vbGVhbj58RGljdGlvbmFyeUl0ZXJhdG9yPFRSZXN1bHQsIGJvb2xlYW4+fE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmV2ZXJ5CisgICAgICAgICAqLworICAgICAgICBldmVyeSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZ3xhbnlbXQorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZXZlcnkKKyAgICAgICAgICovCisgICAgICAgIGV2ZXJ5PFRPYmplY3QgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUT2JqZWN0CisgICAgICAgICk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnkoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj58TnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnkoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmd8YW55W10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZXZlcnkKKyAgICAgICAgICovCisgICAgICAgIGV2ZXJ5PFRPYmplY3QgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUT2JqZWN0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ldmVyeQorICAgICAgICAgKi8KKyAgICAgICAgZXZlcnk8VFJlc3VsdD4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VFJlc3VsdCwgYm9vbGVhbj58RGljdGlvbmFyeUl0ZXJhdG9yPFRSZXN1bHQsIGJvb2xlYW4+fE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZXZlcnkKKyAgICAgICAgICovCisgICAgICAgIGV2ZXJ5KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nfGFueVtdCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmV2ZXJ5CisgICAgICAgICAqLworICAgICAgICBldmVyeTxUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVE9iamVjdAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmZpbHRlcgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBjb2xsZWN0aW9uLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzIHByZWRpY2F0ZSByZXR1cm5zIHRydXRoeSBmb3IuIFRoZQorICAgICAgICAgKiBwcmVkaWNhdGUgaXMgYm91bmQgdG8gdGhpc0FyZyBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLnByb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5CisgICAgICAgICAqIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIHRoaXNBcmcgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzUHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvcgorICAgICAgICAgKiBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZSwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBwcmVkaWNhdGUgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IgZWxlbWVudHMgdGhhdAorICAgICAgICAgKiBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIHByZWRpY2F0ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXI8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyPFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIGZpbHRlcigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IHN0cmluZywKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFN0cmluZ0l0ZXJhdG9yPGJvb2xlYW4+CisgICAgICAgICk6IHN0cmluZ1tdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXI8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU6IHN0cmluZworICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIGZpbHRlcjxXIGV4dGVuZHMge30sIFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlOiBXCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIGZpbHRlcigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFN0cmluZ0l0ZXJhdG9yPGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIGZpbHRlcigKKyAgICAgICAgICAgIHByZWRpY2F0ZTogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXIoCisgICAgICAgICAgICBwcmVkaWNhdGU6IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyPFc+KHByZWRpY2F0ZTogVyk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyPFQ+KAorICAgICAgICAgICAgcHJlZGljYXRlOiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj58RGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXI8VD4oCisgICAgICAgICAgICBwcmVkaWNhdGU6IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyPFcsIFQ+KHByZWRpY2F0ZTogVyk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyKAorICAgICAgICAgICAgcHJlZGljYXRlPzogU3RyaW5nSXRlcmF0b3I8Ym9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZmlsdGVyKAorICAgICAgICAgICAgcHJlZGljYXRlOiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIGZpbHRlcigKKyAgICAgICAgICAgIHByZWRpY2F0ZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXI8Vz4ocHJlZGljYXRlOiBXKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXI8VD4oCisgICAgICAgICAgICBwcmVkaWNhdGU6IExpc3RJdGVyYXRvcjxULCBib29sZWFuPnxEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIGZpbHRlcjxUPigKKyAgICAgICAgICAgIHByZWRpY2F0ZTogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmaWx0ZXI8VywgVD4ocHJlZGljYXRlOiBXKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLmZpbmQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgY29sbGVjdGlvbiwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50IHByZWRpY2F0ZSByZXR1cm5zIHRydXRoeSBmb3IuCisgICAgICAgICAqIFRoZSBwcmVkaWNhdGUgaXMgYm91bmQgdG8gdGhpc0FyZyBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLnByb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5CisgICAgICAgICAqIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIHRoaXNBcmcgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzUHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvcgorICAgICAgICAgKiBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZSwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBwcmVkaWNhdGUgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IgZWxlbWVudHMgdGhhdAorICAgICAgICAgKiBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNlYXJjaC4KKyAgICAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgdW5kZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgZmluZDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4sCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmQKKyAgICAgICAgICovCisgICAgICAgIGZpbmQ8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqLworICAgICAgICBmaW5kPFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqLworICAgICAgICBmaW5kPFRPYmplY3QgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUT2JqZWN0LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqLworICAgICAgICBmaW5kKAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqLworICAgICAgICBmaW5kKAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqLworICAgICAgICBmaW5kPFRPYmplY3QgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUT2JqZWN0LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZAorICAgICAgICAgKi8KKyAgICAgICAgZmluZDxUUmVzdWx0PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxUUmVzdWx0LCBib29sZWFuPnxEaWN0aW9uYXJ5SXRlcmF0b3I8VFJlc3VsdCwgYm9vbGVhbj4sCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmQKKyAgICAgICAgICovCisgICAgICAgIGZpbmQ8VFJlc3VsdD4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmQKKyAgICAgICAgICovCisgICAgICAgIGZpbmQ8VE9iamVjdCBleHRlbmRzIHt9LCBUUmVzdWx0PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRPYmplY3QsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICAvL18uZmluZExhc3QKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5maW5kIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uIGZyb20KKyAgICAgICAgICogcmlnaHQgdG8gbGVmdC4KKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gU2VhcmNoZXMgZm9yIGEgdmFsdWUgaW4gdGhpcyBsaXN0LgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAgICogQHJldHVybiBUaGUgZm91bmQgZWxlbWVudCwgZWxzZSB1bmRlZmluZWQuCisgICAgICAgICAqKi8KKyAgICAgICAgZmluZExhc3Q8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBBcnJheTxUPiwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4sCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmQKKyAgICAgICAgICoqLworICAgICAgICBmaW5kTGFzdDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBjYWxsYmFjazogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqKi8KKyAgICAgICAgZmluZExhc3Q8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgY2FsbGJhY2s6IERpY3Rpb25hcnlJdGVyYXRvcjxULCBib29sZWFuPiwKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZAorICAgICAgICAgKiBAcGFyYW0gXy5wbHVjayBzdHlsZSBjYWxsYmFjaworICAgICAgICAgKiovCisgICAgICAgIGZpbmRMYXN0PFcsIFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogQXJyYXk8VD4sCisgICAgICAgICAgICB3aGVyZVZhbHVlOiBXLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqIEBwYXJhbSBfLnBsdWNrIHN0eWxlIGNhbGxiYWNrCisgICAgICAgICAqKi8KKyAgICAgICAgZmluZExhc3Q8VywgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgd2hlcmVWYWx1ZTogVywKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZAorICAgICAgICAgKiBAcGFyYW0gXy5wbHVjayBzdHlsZSBjYWxsYmFjaworICAgICAgICAgKiovCisgICAgICAgIGZpbmRMYXN0PFcsIFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHdoZXJlVmFsdWU6IFcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmQKKyAgICAgICAgICogQHBhcmFtIF8ud2hlcmUgc3R5bGUgY2FsbGJhY2sKKyAgICAgICAgICoqLworICAgICAgICBmaW5kTGFzdDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IEFycmF5PFQ+LAorICAgICAgICAgICAgcGx1Y2tWYWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqIEBwYXJhbSBfLndoZXJlIHN0eWxlIGNhbGxiYWNrCisgICAgICAgICAqKi8KKyAgICAgICAgZmluZExhc3Q8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgcGx1Y2tWYWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kCisgICAgICAgICAqIEBwYXJhbSBfLndoZXJlIHN0eWxlIGNhbGxiYWNrCisgICAgICAgICAqKi8KKyAgICAgICAgZmluZExhc3Q8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcGx1Y2tWYWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdAorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3QoCisgICAgICAgICAgICBjYWxsYmFjazogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+LAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3QKKyAgICAgICAgICogQHBhcmFtIF8ud2hlcmUgc3R5bGUgY2FsbGJhY2sKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0PFc+KAorICAgICAgICAgICAgd2hlcmVWYWx1ZTogVywKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3QKKyAgICAgICAgICogQHBhcmFtIF8ud2hlcmUgc3R5bGUgY2FsbGJhY2sKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0KAorICAgICAgICAgICAgcGx1Y2tWYWx1ZTogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgLy9fLmZsYXRNYXAKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZmxhdHRlbmVkIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBjb2xsZWN0aW9uIHRocm91Z2ggaXRlcmF0ZWUKKyAgICAgICAgICogYW5kIGNvbmNhdGluZyBpdHMgcmVzdWx0IHRvIHRoZSBvdGhlciBtYXBwZWQgdmFsdWVzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKKyAgICAgICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEBwYXJhbSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIFRSZXN1bHR8VFJlc3VsdFtdPgorICAgICAgICApOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxhbnk+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8YW55LCBUUmVzdWx0fFRSZXN1bHRbXT4KKyAgICAgICAgKTogVFJlc3VsdFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBUUmVzdWx0fFRSZXN1bHRbXT4KKyAgICAgICAgKTogVFJlc3VsdFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8YW55PiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPGFueSwgVFJlc3VsdHxUUmVzdWx0W10+CisgICAgICAgICk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBUUmVzdWx0fFRSZXN1bHRbXT4KKyAgICAgICAgKTogVFJlc3VsdFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IE51bWVyaWNEaWN0aW9uYXJ5PGFueT4sCisgICAgICAgICAgICBpdGVyYXRlZT86IE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8YW55LCBUUmVzdWx0fFRSZXN1bHRbXT4KKyAgICAgICAgKTogVFJlc3VsdFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUT2JqZWN0IGV4dGVuZHMgT2JqZWN0LCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IFRPYmplY3QsCisgICAgICAgICAgICBpdGVyYXRlZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgVFJlc3VsdHxUUmVzdWx0W10+CisgICAgICAgICk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBPYmplY3QsCisgICAgICAgICAgICBpdGVyYXRlZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgVFJlc3VsdHxUUmVzdWx0W10+CisgICAgICAgICk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VFdoZXJlIGV4dGVuZHMgT2JqZWN0LCBUT2JqZWN0IGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IFRPYmplY3QsCisgICAgICAgICAgICBpdGVyYXRlZTogVFdoZXJlCisgICAgICAgICk6IGJvb2xlYW5bXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VE9iamVjdCBleHRlbmRzIE9iamVjdCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBUT2JqZWN0LAorICAgICAgICAgICAgaXRlcmF0ZWU6IE9iamVjdHxzdHJpbmcKKyAgICAgICAgKTogVFJlc3VsdFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUT2JqZWN0IGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IFRPYmplY3QsCisgICAgICAgICAgICBpdGVyYXRlZTogW3N0cmluZywgYW55XQorICAgICAgICApOiBib29sZWFuW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogc3RyaW5nCisgICAgICAgICk6IHN0cmluZ1tdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IE9iamVjdCwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0fHN0cmluZworICAgICAgICApOiBUUmVzdWx0W107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBUUmVzdWx0fFRSZXN1bHRbXT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwKCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBUUmVzdWx0fFRSZXN1bHRbXT58c3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUV2hlcmUgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxib29sZWFuPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXAoCisgICAgICAgICAgICBpdGVyYXRlZTogW3N0cmluZywgYW55XQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxib29sZWFuPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFJlc3VsdHxUUmVzdWx0W10+fERpY3Rpb25hcnlJdGVyYXRvcjxULCBUUmVzdWx0fFRSZXN1bHRbXT58TnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBUUmVzdWx0fFRSZXN1bHRbXT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IE9iamVjdEl0ZXJhdG9yPGFueSwgVFJlc3VsdHxUUmVzdWx0W10+fHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VFdoZXJlIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8Ym9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwKAorICAgICAgICAgICAgaXRlcmF0ZWU6IFtzdHJpbmcsIGFueV0KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8Ym9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFRSZXN1bHQ+KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VFJlc3VsdD4oCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPHN0cmluZywgVFJlc3VsdHxUUmVzdWx0W10+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcCgpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgVFJlc3VsdHxUUmVzdWx0W10+fHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VFdoZXJlIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8Ym9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwKAorICAgICAgICAgICAgaXRlcmF0ZWU6IFtzdHJpbmcsIGFueV0KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8Ym9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFRSZXN1bHQ+KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsYXRNYXAKKyAgICAgICAgICovCisgICAgICAgIGZsYXRNYXA8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIFRSZXN1bHR8VFJlc3VsdFtdPnxEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgVFJlc3VsdHxUUmVzdWx0W10+fE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgVFJlc3VsdHxUUmVzdWx0W10+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBPYmplY3RJdGVyYXRvcjxhbnksIFRSZXN1bHR8VFJlc3VsdFtdPnxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbGF0TWFwCisgICAgICAgICAqLworICAgICAgICBmbGF0TWFwPFRXaGVyZSBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBpdGVyYXRlZTogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBbc3RyaW5nLCBhbnldCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxhdE1hcAorICAgICAgICAgKi8KKyAgICAgICAgZmxhdE1hcDxUUmVzdWx0PigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uZm9yRWFjaAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBjb2xsZWN0aW9uIGludm9raW5nIGl0ZXJhdGVlIGZvciBlYWNoIGVsZW1lbnQuIFRoZSBpdGVyYXRlZSBpcyBib3VuZCB0byB0aGlzQXJnCisgICAgICAgICAqIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOgorICAgICAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IEFzIHdpdGggb3RoZXIgIkNvbGxlY3Rpb25zIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSAibGVuZ3RoIiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvCisgICAgICAgICAqIGF2b2lkIHRoaXMgYmVoYXZpb3IgXy5mb3JJbiBvciBfLmZvck93biBtYXkgYmUgdXNlZCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGFsaWFzIF8uZWFjaAorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEBwYXJhbSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGl0ZXJhdGVlLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yRWFjaDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IFRbXSwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaAorICAgICAgICAgKi8KKyAgICAgICAgZm9yRWFjaDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExpc3Q8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoPFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckVhY2gKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2g8VCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IFQsCisgICAgICAgICAgICBpdGVyYXRlZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgYW55PgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaAorICAgICAgICAgKi8KKyAgICAgICAgZm9yRWFjaDxUIGV4dGVuZHMge30sIFRWYWx1ZT4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBPYmplY3RJdGVyYXRvcjxUVmFsdWUsIGFueT4KKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoKAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxzdHJpbmcsIGFueT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoKAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckVhY2gKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2g8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlLCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoKAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxzdHJpbmcsIGFueT4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoKAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckVhY2gKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2g8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlLCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uZm9yRWFjaFJpZ2h0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uZm9yRWFjaCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGNvbGxlY3Rpb24gZnJvbSByaWdodCB0byBsZWZ0LgorICAgICAgICAgKgorICAgICAgICAgKiBAYWxpYXMgXy5lYWNoUmlnaHQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGNhbGxiYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yRWFjaFJpZ2h0PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogVFtdLAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2hSaWdodDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExpc3Q8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2hSaWdodDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2hSaWdodDxUIGV4dGVuZHMge30+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0SXRlcmF0b3I8YW55LCBhbnk+CisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2hSaWdodDxUIGV4dGVuZHMge30sIFRWYWx1ZT4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBULAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBPYmplY3RJdGVyYXRvcjxUVmFsdWUsIGFueT4KKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2hSaWdodCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoUmlnaHQoCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoUmlnaHQ8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlLCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvckVhY2hSaWdodCgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoUmlnaHQoCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CisgICAgICAgICAqLworICAgICAgICBmb3JFYWNoUmlnaHQ8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlLCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uZ3JvdXBCeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBjb2xsZWN0aW9uIHRocm91Z2gKKyAgICAgICAgICogaXRlcmF0ZWUuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUKKyAgICAgICAgICoga2V5LiBUaGUgaXRlcmF0ZWUgaXMgYm91bmQgdG8gdGhpc0FyZyBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKKyAgICAgICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGl0ZXJhdGVlIHRoZSBjcmVhdGVkIF8ucHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkKKyAgICAgICAgICogdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JlYXRlZCBfLm1hdGNoZXNQcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yCisgICAgICAgICAqIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGl0ZXJhdGVlIHRoZSBjcmVhdGVkIF8ubWF0Y2hlcyBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yIGVsZW1lbnRzIHRoYXQKKyAgICAgICAgICogaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEBwYXJhbSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGl0ZXJhdGVlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBncm91cEJ5PFQsIFRLZXk+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIFRLZXk+CisgICAgICAgICk6IERpY3Rpb25hcnk8VFtdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PGFueT4sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IERpY3Rpb25hcnk8VFtdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VCwgVEtleT4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgVEtleT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUW10+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8YW55PiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUW10+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxULCBUVmFsdWU+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogRGljdGlvbmFyeTxUW10+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IERpY3Rpb25hcnk8VFtdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VFdoZXJlLCBUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVFdoZXJlCisgICAgICAgICk6IERpY3Rpb25hcnk8VFtdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IE9iamVjdAorICAgICAgICApOiBEaWN0aW9uYXJ5PFRbXT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUS2V5PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIFRLZXk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRbXT4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUS2V5PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIFRLZXk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRbXT4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUVmFsdWU+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFtdPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ncm91cEJ5CisgICAgICAgICAqLworICAgICAgICBncm91cEJ5PFRXaGVyZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ncm91cEJ5CisgICAgICAgICAqLworICAgICAgICBncm91cEJ5PFQsIFRLZXk+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgVEtleT58RGljdGlvbmFyeUl0ZXJhdG9yPFQsIFRLZXk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRbXT4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT58RGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFtdPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ncm91cEJ5CisgICAgICAgICAqLworICAgICAgICBncm91cEJ5PFQsIFRWYWx1ZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VFdoZXJlLCBUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVFdoZXJlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRbXT4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRbXT4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VEtleT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBUS2V5PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VEtleT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBUS2V5PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRbXT4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxUV2hlcmU+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFtdPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxULCBUS2V5PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIFRLZXk+fERpY3Rpb25hcnlJdGVyYXRvcjxULCBUS2V5PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+fERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRbXT4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3JvdXBCeQorICAgICAgICAgKi8KKyAgICAgICAgZ3JvdXBCeTxULCBUVmFsdWU+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFtdPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ncm91cEJ5CisgICAgICAgICAqLworICAgICAgICBncm91cEJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFtdPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ncm91cEJ5CisgICAgICAgICAqLworICAgICAgICBncm91cEJ5PFRXaGVyZSwgVD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFRXaGVyZQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdyb3VwQnkKKyAgICAgICAgICovCisgICAgICAgIGdyb3VwQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IE9iamVjdAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUW10+PjsKKyAgICB9CisKKyAgICAvL18uaW5jbHVkZXMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB0YXJnZXQgaXMgaW4gY29sbGVjdGlvbiB1c2luZyBTYW1lVmFsdWVaZXJvIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgZnJvbUluZGV4IGlzIG5lZ2F0aXZlLAorICAgICAgICAgKiBpdOKAmXMgdXNlZCBhcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzZWFyY2guCisgICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCisgICAgICAgICAqIEBwYXJhbSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGZvdW5kLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaW5jbHVkZXM8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICB0YXJnZXQ6IFQsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluY2x1ZGVzCisgICAgICAgICAqLworICAgICAgICBpbmNsdWRlcygKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IHN0cmluZywKKyAgICAgICAgICAgIHRhcmdldDogc3RyaW5nLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbmNsdWRlcworICAgICAgICAgKi8KKyAgICAgICAgaW5jbHVkZXMoCisgICAgICAgICAgICB0YXJnZXQ6IFQsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbmNsdWRlcworICAgICAgICAgKi8KKyAgICAgICAgaW5jbHVkZXM8VFZhbHVlPigKKyAgICAgICAgICAgIHRhcmdldDogVFZhbHVlLAorICAgICAgICAgICAgZnJvbUluZGV4PzogbnVtYmVyCisgICAgICAgICk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5jbHVkZXMKKyAgICAgICAgICovCisgICAgICAgIGluY2x1ZGVzKAorICAgICAgICAgICAgdGFyZ2V0OiBzdHJpbmcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluY2x1ZGVzCisgICAgICAgICAqLworICAgICAgICBpbmNsdWRlcygKKyAgICAgICAgICAgIHRhcmdldDogVCwKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5jbHVkZXMKKyAgICAgICAgICovCisgICAgICAgIGluY2x1ZGVzPFRWYWx1ZT4oCisgICAgICAgICAgICB0YXJnZXQ6IFRWYWx1ZSwKKyAgICAgICAgICAgIGZyb21JbmRleD86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5jbHVkZXMKKyAgICAgICAgICovCisgICAgICAgIGluY2x1ZGVzKAorICAgICAgICAgICAgdGFyZ2V0OiBzdHJpbmcsCisgICAgICAgICAgICBmcm9tSW5kZXg/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5rZXlCeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBjb2xsZWN0aW9uIHRocm91Z2gKKyAgICAgICAgICogaXRlcmF0ZWUuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mIGVhY2gga2V5IGlzIHRoZSBsYXN0IGVsZW1lbnQgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGtleS4gVGhlCisgICAgICAgICAqIGl0ZXJhdGVlIGZ1bmN0aW9uIGlzIGJvdW5kIHRvIHRoaXNBcmcgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6CisgICAgICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBpdGVyYXRlZSB0aGUgY3JlYXRlZCBfLnByb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5CisgICAgICAgICAqIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIHRoaXNBcmcgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzUHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvcgorICAgICAgICAgKiBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZSwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBpdGVyYXRlZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvciBlbGVtZW50cyB0aGF0CisgICAgICAgICAqIGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBpdGVyYXRlZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAga2V5Qnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBEaWN0aW9uYXJ5PFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTnVtZXJpY0RpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBEaWN0aW9uYXJ5PFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleUJ5CisgICAgICAgICAqLworICAgICAgICBrZXlCeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58TnVtZXJpY0RpY3Rpb25hcnk8VD58RGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5rZXlCeQorICAgICAgICAgKi8KKyAgICAgICAga2V5Qnk8VyBleHRlbmRzIE9iamVjdCwgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fE51bWVyaWNEaWN0aW9uYXJ5PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleUJ5CisgICAgICAgICAqLworICAgICAgICBrZXlCeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58TnVtZXJpY0RpY3Rpb25hcnk8VD58RGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0CisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5rZXlCeQorICAgICAgICAgKi8KKyAgICAgICAga2V5QnkoCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleUJ5CisgICAgICAgICAqLworICAgICAgICBrZXlCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleUJ5CisgICAgICAgICAqLworICAgICAgICBrZXlCeTxXIGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PnxOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58RGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5PFcgZXh0ZW5kcyBPYmplY3QsIFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleUJ5CisgICAgICAgICAqLworICAgICAgICBrZXlCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5rZXlCeQorICAgICAgICAgKi8KKyAgICAgICAga2V5QnkoCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleUJ5CisgICAgICAgICAqLworICAgICAgICBrZXlCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5PFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5rZXlCeQorICAgICAgICAgKi8KKyAgICAgICAga2V5Qnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+fE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5rZXlCeQorICAgICAgICAgKi8KKyAgICAgICAga2V5Qnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5rZXlCeQorICAgICAgICAgKi8KKyAgICAgICAga2V5Qnk8VyBleHRlbmRzIE9iamVjdCwgVD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5QnkKKyAgICAgICAgICovCisgICAgICAgIGtleUJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBPYmplY3QKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworICAgIH0KKworICAgIC8vXy5pbnZva2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBwYXRoIG9mIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLgorICAgICAgICAgKiovCisgICAgICAgIGludm9rZTxUT2JqZWN0IGV4dGVuZHMgT2JqZWN0LCBUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52b2tlCisgICAgICAgICAqKi8KKyAgICAgICAgaW52b2tlPFRWYWx1ZSwgVFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IERpY3Rpb25hcnk8VFZhbHVlPnxUVmFsdWVbXSwKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52b2tlCisgICAgICAgICAqKi8KKyAgICAgICAgaW52b2tlPFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBhbnksCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZQorICAgICAgICAgKiovCisgICAgICAgIGludm9rZTxUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZQorICAgICAgICAgKiovCisgICAgICAgIGludm9rZTxUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52b2tlCisgICAgICAgICAqKi8KKyAgICAgICAgaW52b2tlPFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52b2tlCisgICAgICAgICAqKi8KKyAgICAgICAgaW52b2tlPFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgLy9fLmludm9rZU1hcAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogSW52b2tlcyB0aGUgbWV0aG9kIG5hbWVkIGJ5IG1ldGhvZE5hbWUgb24gZWFjaCBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uIHJldHVybmluZworICAgICAgICAgKiBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGludm9rZWQgbWV0aG9kLiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB3aWxsIGJlIHByb3ZpZGVkCisgICAgICAgICAqIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIG1ldGhvZE5hbWUgaXMgYSBmdW5jdGlvbiBpdCB3aWxsIGJlIGludm9rZWQgZm9yLCBhbmQgdGhpcworICAgICAgICAgKiBib3VuZCB0bywgZWFjaCBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC4KKyAgICAgICAgICoqLworICAgICAgICBpbnZva2VNYXA8VFZhbHVlIGV4dGVuZHMge30sIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogVFZhbHVlW10sCisgICAgICAgICAgICBtZXRob2ROYW1lOiBzdHJpbmcsCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUVmFsdWUgZXh0ZW5kcyB7fSwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFRWYWx1ZT4sCisgICAgICAgICAgICBtZXRob2ROYW1lOiBzdHJpbmcsCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IHt9W10sCisgICAgICAgICAgICBtZXRob2ROYW1lOiBzdHJpbmcsCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8e30+LAorICAgICAgICAgICAgbWV0aG9kTmFtZTogc3RyaW5nLAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZva2VNYXAKKyAgICAgICAgICoqLworICAgICAgICBpbnZva2VNYXA8VFZhbHVlIGV4dGVuZHMge30sIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogVFZhbHVlW10sCisgICAgICAgICAgICBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdCwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdKTogVFJlc3VsdFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52b2tlTWFwCisgICAgICAgICAqKi8KKyAgICAgICAgaW52b2tlTWFwPFRWYWx1ZSBleHRlbmRzIHt9LCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VFZhbHVlPiwKKyAgICAgICAgICAgIG1ldGhvZDogKC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0LAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZva2VNYXAKKyAgICAgICAgICoqLworICAgICAgICBpbnZva2VNYXA8VFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiB7fVtdLAorICAgICAgICAgICAgbWV0aG9kOiAoLi4uYXJnczogYW55W10pID0+IFRSZXN1bHQsCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8e30+LAorICAgICAgICAgICAgbWV0aG9kOiAoLi4uYXJnczogYW55W10pID0+IFRSZXN1bHQsCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIG1ldGhvZE5hbWU6IHN0cmluZywKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZva2VNYXAKKyAgICAgICAgICoqLworICAgICAgICBpbnZva2VNYXA8VFJlc3VsdD4oCisgICAgICAgICAgICBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdCwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52b2tlTWFwCisgICAgICAgICAqKi8KKyAgICAgICAgaW52b2tlTWFwPFRSZXN1bHQ+KAorICAgICAgICAgICAgbWV0aG9kTmFtZTogc3RyaW5nLAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIG1ldGhvZDogKC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0LAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIG1ldGhvZE5hbWU6IHN0cmluZywKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZva2VNYXAKKyAgICAgICAgICoqLworICAgICAgICBpbnZva2VNYXA8VFJlc3VsdD4oCisgICAgICAgICAgICBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdCwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52b2tlTWFwCisgICAgICAgICAqKi8KKyAgICAgICAgaW52b2tlTWFwPFRSZXN1bHQ+KAorICAgICAgICAgICAgbWV0aG9kTmFtZTogc3RyaW5nLAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludm9rZU1hcAorICAgICAgICAgKiovCisgICAgICAgIGludm9rZU1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIG1ldGhvZDogKC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0LAorICAgICAgICAgICAgLi4uYXJnczogYW55W10pOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ubWFwCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBjb2xsZWN0aW9uIHRocm91Z2ggaXRlcmF0ZWUuIFRoZSBpdGVyYXRlZSBpcyBib3VuZCB0bworICAgICAgICAgKiB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgaXRlcmF0ZWUgdGhlIGNyZWF0ZWQgXy5wcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgICAgICAgKiBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciB0aGlzQXJnIHRoZSBjcmVhdGVkIF8ubWF0Y2hlc1Byb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IKKyAgICAgICAgICogZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHkgdmFsdWUsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgaXRlcmF0ZWUgdGhlIGNyZWF0ZWQgXy5tYXRjaGVzIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IgZWxlbWVudHMgdGhhdAorICAgICAgICAgKiBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZSBfLmV2ZXJ5LCBfLmZpbHRlciwgXy5tYXAsIF8ubWFwVmFsdWVzLAorICAgICAgICAgKiBfLnJlamVjdCwgYW5kIF8uc29tZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6CisgICAgICAgICAqIGFyeSwgY2FsbGJhY2ssIGNodW5rLCBjbG9uZSwgY3JlYXRlLCBjdXJyeSwgY3VycnlSaWdodCwgZHJvcCwgZHJvcFJpZ2h0LCBldmVyeSwgZmlsbCwgZmxhdHRlbiwgaW52ZXJ0LCBtYXgsCisgICAgICAgICAqIG1pbiwgcGFyc2VJbnQsIHNsaWNlLCBzb3J0QnksIHRha2UsIHRha2VSaWdodCwgdGVtcGxhdGUsIHRyaW0sIHRyaW1MZWZ0LCB0cmltUmlnaHQsIHRydW5jLCByYW5kb20sIHJhbmdlLAorICAgICAgICAgKiBzYW1wbGUsIHNvbWUsIHN1bSwgdW5pcSwgYW5kIHdvcmRzCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgaXRlcmF0ZWUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS4KKyAgICAgICAgICovCisgICAgICAgIG1hcDxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBUUmVzdWx0PgorICAgICAgICApOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXAKKyAgICAgICAgICovCisgICAgICAgIG1hcDxUIGV4dGVuZHMge30sIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIFRSZXN1bHQ+CisgICAgICAgICk6IFRSZXN1bHRbXTsKKworICAgICAgICBtYXA8VCBleHRlbmRzIHt9LCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IE51bWVyaWNEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIFRSZXN1bHQ+CisgICAgICAgICk6IFRSZXN1bHRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcAorICAgICAgICAgKi8KKyAgICAgICAgbWFwPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+fE51bWVyaWNEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogVFJlc3VsdFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwCisgICAgICAgICAqLworICAgICAgICBtYXA8VCwgVE9iamVjdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPnxOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVE9iamVjdAorICAgICAgICApOiBib29sZWFuW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXAKKyAgICAgICAgICovCisgICAgICAgIG1hcDxUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwCisgICAgICAgICAqLworICAgICAgICBtYXA8VFJlc3VsdD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcAorICAgICAgICAgKi8KKyAgICAgICAgbWFwPFRPYmplY3QgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFRPYmplY3QKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwCisgICAgICAgICAqLworICAgICAgICBtYXA8VFZhbHVlLCBUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRWYWx1ZSwgVFJlc3VsdD58RGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZSwgVFJlc3VsdD4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXAKKyAgICAgICAgICovCisgICAgICAgIG1hcDxUVmFsdWUsIFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXAKKyAgICAgICAgICovCisgICAgICAgIG1hcDxUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBUT2JqZWN0CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwCisgICAgICAgICAqLworICAgICAgICBtYXA8VFJlc3VsdD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBUUmVzdWx0PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcAorICAgICAgICAgKi8KKyAgICAgICAgbWFwPFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXAKKyAgICAgICAgICovCisgICAgICAgIG1hcDxUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBUT2JqZWN0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcAorICAgICAgICAgKi8KKyAgICAgICAgbWFwPFRWYWx1ZSwgVFJlc3VsdD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxUVmFsdWUsIFRSZXN1bHQ+fERpY3Rpb25hcnlJdGVyYXRvcjxUVmFsdWUsIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwCisgICAgICAgICAqLworICAgICAgICBtYXA8VFZhbHVlLCBUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwCisgICAgICAgICAqLworICAgICAgICBtYXA8VE9iamVjdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVE9iamVjdAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18ucGFydGl0aW9uCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIGVsZW1lbnRzIHByZWRpY2F0ZSByZXR1cm5zIHRydXRoeSBmb3IsCisgICAgICAgICAqIHdoaWxlIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgZWxlbWVudHMgcHJlZGljYXRlIHJldHVybnMgZmFsc2V5IGZvci4KKyAgICAgICAgICogVGhlIHByZWRpY2F0ZSBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ucHJvcGVydHkgc3R5bGUgY2FsbGJhY2sKKyAgICAgICAgICogcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JlYXRlZCBfLm1hdGNoZXNQcm9wZXJ0eSBzdHlsZSBjYWxsYmFjaworICAgICAgICAgKiByZXR1cm5zIHRydWUgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucworICAgICAgICAgKiB0cnVlIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIHByZWRpY2F0ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLgorICAgICAgICAgKiovCisgICAgICAgIHBhcnRpdGlvbjxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBjYWxsYmFjazogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+KTogVFtdW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYXJ0aXRpb24KKyAgICAgICAgICoqLworICAgICAgICBwYXJ0aXRpb248VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgY2FsbGJhY2s6IERpY3Rpb25hcnlJdGVyYXRvcjxULCBib29sZWFuPik6IFRbXVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGFydGl0aW9uCisgICAgICAgICAqKi8KKyAgICAgICAgcGFydGl0aW9uPFcsIFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPiwKKyAgICAgICAgICAgIHdoZXJlVmFsdWU6IFcpOiBUW11bXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhcnRpdGlvbgorICAgICAgICAgKiovCisgICAgICAgIHBhcnRpdGlvbjxXLCBUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICB3aGVyZVZhbHVlOiBXKTogVFtdW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYXJ0aXRpb24KKyAgICAgICAgICoqLworICAgICAgICBwYXJ0aXRpb248VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgcGF0aDogc3RyaW5nLAorICAgICAgICAgICAgc3JjVmFsdWU6IGFueSk6IFRbXVtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGFydGl0aW9uCisgICAgICAgICAqKi8KKyAgICAgICAgcGFydGl0aW9uPFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHBhdGg6IHN0cmluZywKKyAgICAgICAgICAgIHNyY1ZhbHVlOiBhbnkpOiBUW11bXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhcnRpdGlvbgorICAgICAgICAgKiovCisgICAgICAgIHBhcnRpdGlvbjxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBwbHVja1ZhbHVlOiBzdHJpbmcpOiBUW11bXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhcnRpdGlvbgorICAgICAgICAgKiovCisgICAgICAgIHBhcnRpdGlvbjxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBwbHVja1ZhbHVlOiBzdHJpbmcpOiBUW11bXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRTdHJpbmdXcmFwcGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYXJ0aXRpb24KKyAgICAgICAgICovCisgICAgICAgIHBhcnRpdGlvbigKKyAgICAgICAgICAgIGNhbGxiYWNrOiBMaXN0SXRlcmF0b3I8c3RyaW5nLCBib29sZWFuPik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPHN0cmluZ1tdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhcnRpdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcGFydGl0aW9uKAorICAgICAgICAgICAgY2FsbGJhY2s6IExpc3RJdGVyYXRvcjxULCBib29sZWFuPik6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRbXT47CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGFydGl0aW9uCisgICAgICAgICAqLworICAgICAgICBwYXJ0aXRpb248Vz4oCisgICAgICAgICAgICB3aGVyZVZhbHVlOiBXKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFtdPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYXJ0aXRpb24KKyAgICAgICAgICovCisgICAgICAgIHBhcnRpdGlvbigKKyAgICAgICAgICAgIHBhdGg6IHN0cmluZywKKyAgICAgICAgICAgIHNyY1ZhbHVlOiBhbnkpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUW10+OworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhcnRpdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcGFydGl0aW9uKAorICAgICAgICAgICAgcGx1Y2tWYWx1ZTogc3RyaW5nKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFtdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYXJ0aXRpb24KKyAgICAgICAgICovCisgICAgICAgIHBhcnRpdGlvbjxUUmVzdWx0PigKKyAgICAgICAgICAgIGNhbGxiYWNrOiBMaXN0SXRlcmF0b3I8VFJlc3VsdCwgYm9vbGVhbj4pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0W10+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGFydGl0aW9uCisgICAgICAgICAqLworICAgICAgICBwYXJ0aXRpb248VFJlc3VsdD4oCisgICAgICAgICAgICBjYWxsYmFjazogRGljdGlvbmFyeUl0ZXJhdG9yPFRSZXN1bHQsIGJvb2xlYW4+KTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdFtdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhcnRpdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcGFydGl0aW9uPFcsIFRSZXN1bHQ+KAorICAgICAgICAgICAgd2hlcmVWYWx1ZTogVyk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHRbXT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYXJ0aXRpb24KKyAgICAgICAgICovCisgICAgICAgIHBhcnRpdGlvbjxUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IHN0cmluZywKKyAgICAgICAgICAgIHNyY1ZhbHVlOiBhbnkpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0W10+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucGFydGl0aW9uCisgICAgICAgICAqLworICAgICAgICBwYXJ0aXRpb248VFJlc3VsdD4oCisgICAgICAgICAgICBwbHVja1ZhbHVlOiBzdHJpbmcpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0W10+OworICAgIH0KKworICAgIC8vXy5yZWR1Y2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZHVjZXMgYSBjb2xsZWN0aW9uIHRvIGEgdmFsdWUgd2hpY2ggaXMgdGhlIGFjY3VtdWxhdGVkIHJlc3VsdCBvZiBydW5uaW5nIGVhY2gKKyAgICAgICAgICogZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBjYWxsYmFjaywgd2hlcmUgZWFjaCBzdWNjZXNzaXZlIGNhbGxiYWNrIGV4ZWN1dGlvbgorICAgICAgICAgKiBjb25zdW1lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBleGVjdXRpb24uIElmIGFjY3VtdWxhdG9yIGlzIG5vdCBwcm92aWRlZCB0aGUKKyAgICAgICAgICogZmlyc3QgZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUuIFRoZSBjYWxsYmFjaworICAgICAgICAgKiBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM7IChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGFjY3VtdWxhdG9yIEluaXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGNhbGxiYWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgorICAgICAgICAgKiovCisgICAgICAgIHJlZHVjZTxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IEFycmF5PFQ+LAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yOiBUUmVzdWx0KTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZQorICAgICAgICAgKiovCisgICAgICAgIHJlZHVjZTxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBjYWxsYmFjazogTWVtb0l0ZXJhdG9yPFQsIFRSZXN1bHQ+LAorICAgICAgICAgICAgYWNjdW11bGF0b3I6IFRSZXN1bHQpOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlCisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VCwgVFJlc3VsdD4sCisgICAgICAgICAgICBhY2N1bXVsYXRvcjogVFJlc3VsdCk6IFRSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWR1Y2UKKyAgICAgICAgICoqLworICAgICAgICByZWR1Y2U8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VCwgVFJlc3VsdD4sCisgICAgICAgICAgICBhY2N1bXVsYXRvcjogVFJlc3VsdCk6IFRSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWR1Y2UKKyAgICAgICAgICoqLworICAgICAgICByZWR1Y2U8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBBcnJheTxUPiwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VCwgVFJlc3VsdD4pOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlCisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPiwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VCwgVFJlc3VsdD4pOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlCisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VCwgVFJlc3VsdD4pOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlCisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTnVtZXJpY0RpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBjYWxsYmFjazogTWVtb0l0ZXJhdG9yPFQsIFRSZXN1bHQ+KTogVFJlc3VsdDsKKworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlCisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlPFRSZXN1bHQ+KAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yOiBUUmVzdWx0KTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZQorICAgICAgICAgKiovCisgICAgICAgIHJlZHVjZTxUUmVzdWx0PigKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VCwgVFJlc3VsdD4pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZQorICAgICAgICAgKiovCisgICAgICAgIHJlZHVjZTxUVmFsdWUsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxUVmFsdWUsIFRSZXN1bHQ+LAorICAgICAgICAgICAgYWNjdW11bGF0b3I6IFRSZXN1bHQpOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlCisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlPFRWYWx1ZSwgVFJlc3VsdD4oCisgICAgICAgICAgICBjYWxsYmFjazogTWVtb0l0ZXJhdG9yPFRWYWx1ZSwgVFJlc3VsdD4pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZQorICAgICAgICAgKiovCisgICAgICAgIHJlZHVjZTxUVmFsdWUsIFRSZXN1bHQ+KAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxUVmFsdWUsIFRSZXN1bHQ+LAorICAgICAgICAgICAgYWNjdW11bGF0b3I6IFRSZXN1bHQpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWR1Y2UKKyAgICAgICAgICoqLworICAgICAgICByZWR1Y2U8VFZhbHVlLCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VFZhbHVlLCBUUmVzdWx0Pik6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKipMb0Rhc2hFeHBsaWNpdFdyYXBwZXIKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZQorICAgICAgICAgKi8KKyAgICAgICAgcmVkdWNlPFRSZXN1bHQ+KAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yOiBUUmVzdWx0KTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlCisgICAgICAgICAqLworICAgICAgICByZWR1Y2U8VFJlc3VsdD4oCisgICAgICAgICAgICBjYWxsYmFjazogTWVtb0l0ZXJhdG9yPFQsIFRSZXN1bHQ+KTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5yZWR1Y2VSaWdodAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBfLnJlZHVjZSBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbiBmcm9tCisgICAgICAgICAqIHJpZ2h0IHRvIGxlZnQuCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGFjY3VtdWxhdG9yIEluaXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGNhbGxiYWNrLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KKyAgICAgICAgICoqLworICAgICAgICByZWR1Y2VSaWdodDxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IEFycmF5PFQ+LAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yOiBUUmVzdWx0KTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZVJpZ2h0CisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlUmlnaHQ8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yOiBUUmVzdWx0KTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZVJpZ2h0CisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlUmlnaHQ8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yOiBUUmVzdWx0KTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZVJpZ2h0CisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlUmlnaHQ8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBBcnJheTxUPiwKKyAgICAgICAgICAgIGNhbGxiYWNrOiBNZW1vSXRlcmF0b3I8VCwgVFJlc3VsdD4pOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHQKKyAgICAgICAgICoqLworICAgICAgICByZWR1Y2VSaWdodDxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBjYWxsYmFjazogTWVtb0l0ZXJhdG9yPFQsIFRSZXN1bHQ+KTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlZHVjZVJpZ2h0CisgICAgICAgICAqKi8KKyAgICAgICAgcmVkdWNlUmlnaHQ8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgY2FsbGJhY2s6IE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0Pik6IFRSZXN1bHQ7CisgICAgfQorCisgICAgLy9fLnJlamVjdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9wcG9zaXRlIG9mIF8uZmlsdGVyOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBjb2xsZWN0aW9uIHRoYXQgcHJlZGljYXRlIGRvZXMgbm90IHJldHVybgorICAgICAgICAgKiB0cnV0aHkgZm9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBwcmVkaWNhdGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgcmVqZWN0PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWplY3QKKyAgICAgICAgICovCisgICAgICAgIHJlamVjdDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVqZWN0CisgICAgICAgICAqLworICAgICAgICByZWplY3QoCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBzdHJpbmcsCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBTdHJpbmdJdGVyYXRvcjxib29sZWFuPgorICAgICAgICApOiBzdHJpbmdbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcmVqZWN0PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlOiBzdHJpbmcKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVqZWN0CisgICAgICAgICAqLworICAgICAgICByZWplY3Q8VyBleHRlbmRzIHt9LCBUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZTogVworICAgICAgICApOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVqZWN0CisgICAgICAgICAqLworICAgICAgICByZWplY3QoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBTdHJpbmdJdGVyYXRvcjxib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVqZWN0CisgICAgICAgICAqLworICAgICAgICByZWplY3QoCisgICAgICAgICAgICBwcmVkaWNhdGU6IExpc3RJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcmVqZWN0KAorICAgICAgICAgICAgcHJlZGljYXRlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWplY3QKKyAgICAgICAgICovCisgICAgICAgIHJlamVjdDxXPihwcmVkaWNhdGU6IFcpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWplY3QKKyAgICAgICAgICovCisgICAgICAgIHJlamVjdDxUPigKKyAgICAgICAgICAgIHByZWRpY2F0ZTogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+fERpY3Rpb25hcnlJdGVyYXRvcjxULCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcmVqZWN0PFQ+KAorICAgICAgICAgICAgcHJlZGljYXRlOiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWplY3QKKyAgICAgICAgICovCisgICAgICAgIHJlamVjdDxXLCBUPihwcmVkaWNhdGU6IFcpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWplY3QKKyAgICAgICAgICovCisgICAgICAgIHJlamVjdCgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFN0cmluZ0l0ZXJhdG9yPGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWplY3QKKyAgICAgICAgICovCisgICAgICAgIHJlamVjdCgKKyAgICAgICAgICAgIHByZWRpY2F0ZTogTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVqZWN0CisgICAgICAgICAqLworICAgICAgICByZWplY3QoCisgICAgICAgICAgICBwcmVkaWNhdGU6IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcmVqZWN0PFc+KHByZWRpY2F0ZTogVyk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcmVqZWN0PFQ+KAorICAgICAgICAgICAgcHJlZGljYXRlOiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj58RGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVqZWN0CisgICAgICAgICAqLworICAgICAgICByZWplY3Q8VD4oCisgICAgICAgICAgICBwcmVkaWNhdGU6IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcmVqZWN0PFcsIFQ+KHByZWRpY2F0ZTogVyk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5zYW1wbGUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgYSByYW5kb20gZWxlbWVudCBmcm9tIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHNhbXBsZTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPnxOdW1lcmljRGljdGlvbmFyeTxUPgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2FtcGxlCisgICAgICAgICAqLworICAgICAgICBzYW1wbGU8TyBleHRlbmRzIE9iamVjdCwgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBPCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zYW1wbGUKKyAgICAgICAgICovCisgICAgICAgIHNhbXBsZTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IE9iamVjdAorICAgICAgICApOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNhbXBsZQorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNhbXBsZQorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlKCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2FtcGxlCisgICAgICAgICAqLworICAgICAgICBzYW1wbGU8VD4oKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zYW1wbGUKKyAgICAgICAgICovCisgICAgICAgIHNhbXBsZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNhbXBsZQorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlPFRXcmFwcGVyPigpOiBUV3JhcHBlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zYW1wbGUKKyAgICAgICAgICovCisgICAgICAgIHNhbXBsZTxUV3JhcHBlcj4oKTogVFdyYXBwZXI7CisgICAgfQorCisgICAgLy9fLnNhbXBsZVNpemUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgbiByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBjb2xsZWN0aW9uIHVwIHRvIHRoZSBzaXplIG9mIGNvbGxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS4KKyAgICAgICAgICogQHBhcmFtIG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlU2l6ZTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPnxOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIG4/OiBudW1iZXIKKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2FtcGxlU2l6ZQorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlU2l6ZTxPIGV4dGVuZHMgT2JqZWN0LCBUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IE8sCisgICAgICAgICAgICBuPzogbnVtYmVyCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNhbXBsZVNpemUKKyAgICAgICAgICovCisgICAgICAgIHNhbXBsZVNpemU8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBPYmplY3QsCisgICAgICAgICAgICBuPzogbnVtYmVyCisgICAgICAgICk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zYW1wbGVTaXplCisgICAgICAgICAqLworICAgICAgICBzYW1wbGVTaXplKAorICAgICAgICAgICAgbj86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2FtcGxlU2l6ZQorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlU2l6ZSgKKyAgICAgICAgICAgIG4/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2FtcGxlU2l6ZQorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlU2l6ZTxUPigKKyAgICAgICAgICAgIG4/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2FtcGxlU2l6ZQorICAgICAgICAgKi8KKyAgICAgICAgc2FtcGxlU2l6ZSgKKyAgICAgICAgICAgIG4/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNhbXBsZVNpemUKKyAgICAgICAgICovCisgICAgICAgIHNhbXBsZVNpemUoCisgICAgICAgICAgICBuPzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNhbXBsZVNpemUKKyAgICAgICAgICovCisgICAgICAgIHNhbXBsZVNpemU8VD4oCisgICAgICAgICAgICBuPzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5zaHVmZmxlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZSBGaXNoZXItWWF0ZXMgc2h1ZmZsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBzaHVmZmxlPFQ+KGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPik6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNodWZmbGUKKyAgICAgICAgICovCisgICAgICAgIHNodWZmbGUoY29sbGVjdGlvbjogc3RyaW5nKTogc3RyaW5nW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2h1ZmZsZQorICAgICAgICAgKi8KKyAgICAgICAgc2h1ZmZsZSgpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2h1ZmZsZQorICAgICAgICAgKi8KKyAgICAgICAgc2h1ZmZsZSgpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zaHVmZmxlCisgICAgICAgICAqLworICAgICAgICBzaHVmZmxlPFQ+KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNodWZmbGUKKyAgICAgICAgICovCisgICAgICAgIHNodWZmbGUoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNodWZmbGUKKyAgICAgICAgICovCisgICAgICAgIHNodWZmbGUoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2h1ZmZsZQorICAgICAgICAgKi8KKyAgICAgICAgc2h1ZmZsZTxUPigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uc2l6ZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgc2l6ZSBvZiBjb2xsZWN0aW9uIGJ5IHJldHVybmluZyBpdHMgbGVuZ3RoIGZvciBhcnJheS1saWtlIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlCisgICAgICAgICAqIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2l6ZSBvZiBjb2xsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZTxUPihjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4pOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zaXplCisgICAgICAgICAqLworICAgICAgICBzaXplKGNvbGxlY3Rpb246IHN0cmluZyk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zaXplCisgICAgICAgICAqLworICAgICAgICBzaXplKCk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNpemUKKyAgICAgICAgICovCisgICAgICAgIHNpemUoKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNpemUKKyAgICAgICAgICovCisgICAgICAgIHNpemUoKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNpemUKKyAgICAgICAgICovCisgICAgICAgIHNpemUoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zaXplCisgICAgICAgICAqLworICAgICAgICBzaXplKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNpemUKKyAgICAgICAgICovCisgICAgICAgIHNpemUoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLnNvbWUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBwcmVkaWNhdGUgcmV0dXJucyB0cnV0aHkgZm9yIGFueSBlbGVtZW50IG9mIGNvbGxlY3Rpb24uIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgcHJlZGljYXRlCisgICAgICAgICAqIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgc29tZTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBMaXN0SXRlcmF0b3I8VCwgYm9vbGVhbj4KKyAgICAgICAgKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvbWUKKyAgICAgICAgICovCisgICAgICAgIHNvbWU8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb21lCisgICAgICAgICAqLworICAgICAgICBzb21lPFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTnVtZXJpY0RpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb21lCisgICAgICAgICAqLworICAgICAgICBzb21lKAorICAgICAgICAgICAgY29sbGVjdGlvbjogT2JqZWN0LAorICAgICAgICAgICAgcHJlZGljYXRlPzogT2JqZWN0SXRlcmF0b3I8YW55LCBib29sZWFuPgorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPnxOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZ3xbc3RyaW5nLCBhbnldCisgICAgICAgICk6IGJvb2xlYW47CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvbWUKKyAgICAgICAgICovCisgICAgICAgIHNvbWUoCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBPYmplY3QsCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmd8W3N0cmluZywgYW55XQorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZTxUT2JqZWN0IGV4dGVuZHMge30sIFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+fE51bWVyaWNEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgcHJlZGljYXRlPzogVE9iamVjdAorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD58RGljdGlvbmFyeTxUPnxOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IE9iamVjdAorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZTxUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogT2JqZWN0LAorICAgICAgICAgICAgcHJlZGljYXRlPzogVE9iamVjdAorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPnxOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb21lCisgICAgICAgICAqLworICAgICAgICBzb21lKAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nfFtzdHJpbmcsIGFueV0KKyAgICAgICAgKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvbWUKKyAgICAgICAgICovCisgICAgICAgIHNvbWU8VE9iamVjdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRPYmplY3QKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb21lCisgICAgICAgICAqLworICAgICAgICBzb21lPFRSZXN1bHQ+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFRSZXN1bHQsIGJvb2xlYW4+fERpY3Rpb25hcnlJdGVyYXRvcjxUUmVzdWx0LCBib29sZWFuPnxOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+fE9iamVjdEl0ZXJhdG9yPGFueSwgYm9vbGVhbj4KKyAgICAgICAgKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvbWUKKyAgICAgICAgICovCisgICAgICAgIHNvbWUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmd8W3N0cmluZywgYW55XQorICAgICAgICApOiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZTxUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVE9iamVjdAorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IExpc3RJdGVyYXRvcjxULCBib29sZWFuPnxOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvbWUKKyAgICAgICAgICovCisgICAgICAgIHNvbWUoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmd8W3N0cmluZywgYW55XQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb21lCisgICAgICAgICAqLworICAgICAgICBzb21lPFRPYmplY3QgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUT2JqZWN0CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb21lCisgICAgICAgICAqLworICAgICAgICBzb21lPFRSZXN1bHQ+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogTGlzdEl0ZXJhdG9yPFRSZXN1bHQsIGJvb2xlYW4+fERpY3Rpb25hcnlJdGVyYXRvcjxUUmVzdWx0LCBib29sZWFuPnxOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGJvb2xlYW4+fE9iamVjdEl0ZXJhdG9yPGFueSwgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29tZQorICAgICAgICAgKi8KKyAgICAgICAgc29tZSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZ3xbc3RyaW5nLCBhbnldCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvbWUKKyAgICAgICAgICovCisgICAgICAgIHNvbWU8VE9iamVjdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRPYmplY3QKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5zb3J0QnkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2YKKyAgICAgICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocm91Z2ggZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2QKKyAgICAgICAgICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mCisgICAgICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXXxPYmplY3R8T2JqZWN0W118c3RyaW5nfHN0cmluZ1tdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dCisgICAgICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnksIHNwZWNpZmllZCBpbmRpdmlkdWFsbHkgb3IgaW4gYXJyYXlzLgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciB1c2VycyA9IFsKKyAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LAorICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDIgfSwKKyAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9CisgICAgICAgICAqIF07CisgICAgICAgICAqCisgICAgICAgICAqIF8uc29ydEJ5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXI7IH0pOworICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDQyXV0KKyAgICAgICAgICoKKyAgICAgICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7CisgICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDQyXSwgWydmcmVkJywgNDhdXQorICAgICAgICAgKgorICAgICAgICAgKiBfLnNvcnRCeSh1c2VycywgJ3VzZXInLCBmdW5jdGlvbihvKSB7CisgICAgICAgICAqICAgcmV0dXJuIE1hdGguZmxvb3Ioby5hZ2UgLyAxMCk7CisgICAgICAgICAqIH0pOworICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDQyXV0KKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeTxULCBUU29ydD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFQsIFRTb3J0PigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0Qnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZTogc3RyaW5nCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFcgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICB3aGVyZVZhbHVlOiBXCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+CisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogKEFycmF5PFQ+fExpc3Q8VD4pLAorICAgICAgICAgICAgaXRlcmF0ZWVzOiAoTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdClbXSk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogKEFycmF5PFQ+fExpc3Q8VD4pLAorICAgICAgICAgICAgLi4uaXRlcmF0ZWVzOiAoTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+fE9iamVjdHxzdHJpbmcpW10pOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeTxUU29ydD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeShpdGVyYXRlZTogc3RyaW5nKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeTxXIGV4dGVuZHMge30+KHdoZXJlVmFsdWU6IFcpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0QnkoLi4uaXRlcmF0ZWVzOiAoTGlzdEl0ZXJhdG9yPFQsIGJvb2xlYW4+fE9iamVjdHxzdHJpbmcpW10pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKiovCisgICAgICAgIHNvcnRCeShpdGVyYXRlZXM6IChMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0KVtdKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0Qnk8VCwgVFNvcnQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+fERpY3Rpb25hcnlJdGVyYXRvcjxULCBUU29ydD4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeTxUPihpdGVyYXRlZTogc3RyaW5nKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeTxXIGV4dGVuZHMge30sIFQ+KHdoZXJlVmFsdWU6IFcpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFQ+KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0Qnk8VFNvcnQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgVFNvcnQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0QnkoaXRlcmF0ZWU6IHN0cmluZyk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0Qnk8VyBleHRlbmRzIHt9Pih3aGVyZVZhbHVlOiBXKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeSgpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zb3J0QnkKKyAgICAgICAgICovCisgICAgICAgIHNvcnRCeTxULCBUU29ydD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBUU29ydD58RGljdGlvbmFyeUl0ZXJhdG9yPFQsIFRTb3J0PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFQ+KGl0ZXJhdGVlOiBzdHJpbmcpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNvcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgc29ydEJ5PFcgZXh0ZW5kcyB7fSwgVD4od2hlcmVWYWx1ZTogVyk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc29ydEJ5CisgICAgICAgICAqLworICAgICAgICBzb3J0Qnk8VD4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLm9yZGVyQnkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydEJ5YCBleGNlcHQgdGhhdCBpdCBhbGxvd3Mgc3BlY2lmeWluZyB0aGUgc29ydAorICAgICAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcworICAgICAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mICJkZXNjIiBmb3IKKyAgICAgICAgICogZGVzY2VuZGluZyBvciAiYXNjIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KKyAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXSBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuCisgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC4KKyAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5yZWR1Y2VgLgorICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciB1c2VycyA9IFsKKyAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LAorICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sCisgICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDIgfSwKKyAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9CisgICAgICAgICAqIF07CisgICAgICAgICAqCisgICAgICAgICAqIC8vIHNvcnQgYnkgYHVzZXJgIGluIGFzY2VuZGluZyBvcmRlciBhbmQgYnkgYGFnZWAgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICAgKiBfLm9yZGVyQnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSwgWydhc2MnLCAnZGVzYyddKTsKKyAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0Ml1dCisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFcgZXh0ZW5kcyBPYmplY3QsIFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlczogTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFd8KExpc3RJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXKVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm9yZGVyQnkKKyAgICAgICAgICovCisgICAgICAgIG9yZGVyQnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0fChMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0KVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm9yZGVyQnkKKyAgICAgICAgICovCisgICAgICAgIG9yZGVyQnk8VyBleHRlbmRzIE9iamVjdCwgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBOdW1lcmljRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlczogTnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXfChOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFcpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IE51bWVyaWNEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdHwoTnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xPYmplY3QpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxXIGV4dGVuZHMgT2JqZWN0LCBUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZXM6IERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXfChEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8VylbXSwKKyAgICAgICAgICAgIG9yZGVycz86IGJvb2xlYW58c3RyaW5nfChib29sZWFufHN0cmluZylbXQorICAgICAgICApOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlczogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdHwoRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdClbXSwKKyAgICAgICAgICAgIG9yZGVycz86IGJvb2xlYW58c3RyaW5nfChib29sZWFufHN0cmluZylbXQorICAgICAgICApOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlczogTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfChMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmcpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFcgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8V3woTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFcpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxXIGV4dGVuZHMgT2JqZWN0LCBUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlczogTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFd8KExpc3RJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXKVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlczogTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdHwoTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdClbXSwKKyAgICAgICAgICAgIG9yZGVycz86IGJvb2xlYW58c3RyaW5nfChib29sZWFufHN0cmluZylbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm9yZGVyQnkKKyAgICAgICAgICovCisgICAgICAgIG9yZGVyQnk8VyBleHRlbmRzIE9iamVjdCwgVD4oCisgICAgICAgICAgICBpdGVyYXRlZXM6IE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8V3woTnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXKVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlczogTnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xPYmplY3R8KE51bWVyaWNEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0KVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxXIGV4dGVuZHMgT2JqZWN0LCBUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlczogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFd8KERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXKVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlczogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdHwoRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdClbXSwKKyAgICAgICAgICAgIG9yZGVycz86IGJvb2xlYW58c3RyaW5nfChib29sZWFufHN0cmluZylbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5KAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8KExpc3RJdGVyYXRvcjxULCBhbnk+fHN0cmluZylbXSwKKyAgICAgICAgICAgIG9yZGVycz86IGJvb2xlYW58c3RyaW5nfChib29sZWFufHN0cmluZylbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm9yZGVyQnkKKyAgICAgICAgICovCisgICAgICAgIG9yZGVyQnk8VyBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBpdGVyYXRlZXM6IExpc3RJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXfChMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8VylbXSwKKyAgICAgICAgICAgIG9yZGVycz86IGJvb2xlYW58c3RyaW5nfChib29sZWFufHN0cmluZylbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFcgZXh0ZW5kcyBPYmplY3QsIFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8V3woTGlzdEl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFcpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0fChMaXN0SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0KVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3JkZXJCeQorICAgICAgICAgKi8KKyAgICAgICAgb3JkZXJCeTxXIGV4dGVuZHMgT2JqZWN0LCBUPigKKyAgICAgICAgICAgIGl0ZXJhdGVlczogTnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xXfChOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFcpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfE9iamVjdHwoTnVtZXJpY0RpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+fHN0cmluZ3xPYmplY3QpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFcgZXh0ZW5kcyBPYmplY3QsIFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8V3woRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT58c3RyaW5nfFcpW10sCisgICAgICAgICAgICBvcmRlcnM/OiBib29sZWFufHN0cmluZ3woYm9vbGVhbnxzdHJpbmcpW10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vcmRlckJ5CisgICAgICAgICAqLworICAgICAgICBvcmRlckJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWVzOiBEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0fChEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PnxzdHJpbmd8T2JqZWN0KVtdLAorICAgICAgICAgICAgb3JkZXJzPzogYm9vbGVhbnxzdHJpbmd8KGJvb2xlYW58c3RyaW5nKVtdCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8qKioqKioqKgorICAgICAqIERhdGUgKgorICAgICAqKioqKioqKi8KKworICAgICAgICAvL18ubm93CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgbm93KCk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm5vdworICAgICAgICAgKi8KKyAgICAgICAgbm93KCk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm5vdworICAgICAgICAgKi8KKyAgICAgICAgbm93KCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8qKioqKioqKioqKioqCisgICAgICogRnVuY3Rpb25zICoKKyAgICAgKioqKioqKioqKioqKi8KKworICAgICAgICAvL18uYWZ0ZXIKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBfLmJlZm9yZTsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBmdW5jIG9uY2UgaXTigJlzIGNhbGxlZCBuIG9yIG1vcmUgdGltZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGZ1bmMgaXMgaW52b2tlZC4KKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYWZ0ZXI8VEZ1bmMgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBuOiBudW1iZXIsCisgICAgICAgICAgICBmdW5jOiBURnVuYworICAgICAgICApOiBURnVuYzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hZnRlcgorICAgICAgICAgKiovCisgICAgICAgIGFmdGVyPFRGdW5jIGV4dGVuZHMgRnVuY3Rpb24+KGZ1bmM6IFRGdW5jKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRGdW5jPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hZnRlcgorICAgICAgICAgKiovCisgICAgICAgIGFmdGVyPFRGdW5jIGV4dGVuZHMgRnVuY3Rpb24+KGZ1bmM6IFRGdW5jKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRGdW5jPjsKKyAgICB9CisKKyAgICAvL18uYXJ5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG4gYXJndW1lbnRzIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgYXJpdHkgY2FwLgorICAgICAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBhcnk8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIGZ1bmM6IEZ1bmN0aW9uLAorICAgICAgICAgICAgbj86IG51bWJlcgorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIGFyeTxUIGV4dGVuZHMgRnVuY3Rpb24sIFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBmdW5jOiBULAorICAgICAgICAgICAgbj86IG51bWJlcgorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFyeQorICAgICAgICAgKi8KKyAgICAgICAgYXJ5PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4obj86IG51bWJlcik6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hcnkKKyAgICAgICAgICovCisgICAgICAgIGFyeTxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KG4/OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmJlZm9yZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBmdW5jLCB3aXRoIHRoZSB0aGlzIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUKKyAgICAgICAgICogaXTigJlzIGNhbGxlZCBsZXNzIHRoYW4gbiB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBmdW5jCisgICAgICAgICAqIGludm9jYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggZnVuYyBpcyBubyBsb25nZXIgaW52b2tlZC4KKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYmVmb3JlPFRGdW5jIGV4dGVuZHMgRnVuY3Rpb24+KAorICAgICAgICAgICAgbjogbnVtYmVyLAorICAgICAgICAgICAgZnVuYzogVEZ1bmMKKyAgICAgICAgKTogVEZ1bmM7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYmVmb3JlCisgICAgICAgICAqKi8KKyAgICAgICAgYmVmb3JlPFRGdW5jIGV4dGVuZHMgRnVuY3Rpb24+KGZ1bmM6IFRGdW5jKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRGdW5jPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5iZWZvcmUKKyAgICAgICAgICoqLworICAgICAgICBiZWZvcmU8VEZ1bmMgZXh0ZW5kcyBGdW5jdGlvbj4oZnVuYzogVEZ1bmMpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VEZ1bmM+OworICAgIH0KKworICAgIC8vXy5iaW5kCisgICAgaW50ZXJmYWNlIEZ1bmN0aW9uQmluZCB7CisgICAgICAgIHBsYWNlaG9sZGVyOiBhbnk7CisKKyAgICAgICAgPFQgZXh0ZW5kcyBGdW5jdGlvbiwgVFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIGZ1bmM6IFQsCisgICAgICAgICAgICB0aGlzQXJnOiBhbnksCisgICAgICAgICAgICAuLi5wYXJ0aWFsczogYW55W10KKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICA8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIGZ1bmM6IEZ1bmN0aW9uLAorICAgICAgICAgICAgdGhpc0FyZzogYW55LAorICAgICAgICAgICAgLi4ucGFydGlhbHM6IGFueVtdCisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGZ1bmMgd2l0aCB0aGUgdGhpcyBiaW5kaW5nIG9mIHRoaXNBcmcgYW5kIHByZXBlbmRzIGFueSBhZGRpdGlvbmFsIF8uYmluZAorICAgICAgICAgKiBhcmd1bWVudHMgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGJvdW5kIGZ1bmN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgXy5iaW5kLnBsYWNlaG9sZGVyIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBfIGluIG1vbm9saXRoaWMgYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvcgorICAgICAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFVubGlrZSBuYXRpdmUgRnVuY3Rpb24jYmluZCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBzZXQgdGhlICJsZW5ndGgiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgZnVuYy4KKyAgICAgICAgICogQHBhcmFtIHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYmluZDogRnVuY3Rpb25CaW5kOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmJpbmQKKyAgICAgICAgICovCisgICAgICAgIGJpbmQ8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIHRoaXNBcmc6IGFueSwKKyAgICAgICAgICAgIC4uLnBhcnRpYWxzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYmluZAorICAgICAgICAgKi8KKyAgICAgICAgYmluZDxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KAorICAgICAgICAgICAgdGhpc0FyZzogYW55LAorICAgICAgICAgICAgLi4ucGFydGlhbHM6IGFueVtdCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uYmluZEFsbAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQmluZHMgbWV0aG9kcyBvZiBhbiBvYmplY3QgdG8gdGhlIG9iamVjdCBpdHNlbGYsIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZyBtZXRob2QuIE1ldGhvZCBuYW1lcyBtYXkgYmUKKyAgICAgICAgICogc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5cyBvZiBtZXRob2QgbmFtZXMuIElmIG5vIG1ldGhvZCBuYW1lcyBhcmUgcHJvdmlkZWQgYWxsCisgICAgICAgICAqIGVudW1lcmFibGUgZnVuY3Rpb24gcHJvcGVydGllcywgb3duIGFuZCBpbmhlcml0ZWQsIG9mIG9iamVjdCBhcmUgYm91bmQuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHNldCB0aGUgImxlbmd0aCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZXMgVGhlIG9iamVjdCBtZXRob2QgbmFtZXMgdG8gYmluZCwgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgbWV0aG9kIG5hbWVzIG9yIGFycmF5cyBvZgorICAgICAgICAgKiBtZXRob2QgbmFtZXMuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBiaW5kQWxsPFQ+KAorICAgICAgICAgICAgb2JqZWN0OiBULAorICAgICAgICAgICAgLi4ubWV0aG9kTmFtZXM6IChzdHJpbmd8c3RyaW5nW10pW10KKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5iaW5kQWxsCisgICAgICAgICAqLworICAgICAgICBiaW5kQWxsKC4uLm1ldGhvZE5hbWVzOiAoc3RyaW5nfHN0cmluZ1tdKVtdKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmJpbmRBbGwKKyAgICAgICAgICovCisgICAgICAgIGJpbmRBbGwoLi4ubWV0aG9kTmFtZXM6IChzdHJpbmd8c3RyaW5nW10pW10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLmJpbmRLZXkKKyAgICBpbnRlcmZhY2UgRnVuY3Rpb25CaW5kS2V5IHsKKyAgICAgICAgcGxhY2Vob2xkZXI6IGFueTsKKworICAgICAgICA8VCBleHRlbmRzIE9iamVjdCwgVFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIG9iamVjdDogVCwKKyAgICAgICAgICAgIGtleTogYW55LAorICAgICAgICAgICAgLi4ucGFydGlhbHM6IGFueVtdCisgICAgICAgICk6IFRSZXN1bHQ7CisKKyAgICAgICAgPFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBvYmplY3Q6IE9iamVjdCwKKyAgICAgICAgICAgIGtleTogYW55LAorICAgICAgICAgICAgLi4ucGFydGlhbHM6IGFueVtdCisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgb2JqZWN0W2tleV0gYW5kIHByZXBlbmRzIGFueSBhZGRpdGlvbmFsIF8uYmluZEtleSBhcmd1bWVudHMKKyAgICAgICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGJvdW5kIGZ1bmN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gXy5iaW5kIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2UgbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQKKyAgICAgICAgICogb3IgZG9u4oCZdCB5ZXQgZXhpc3QuIFNlZSBQZXRlciBNaWNoYXV44oCZcyBhcnRpY2xlIGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBfLmJpbmRLZXkucGxhY2Vob2xkZXIgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIF8gaW4gbW9ub2xpdGhpYyBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIKKyAgICAgICAgICogZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRoZSBtZXRob2QgYmVsb25ncyB0by4KKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuCisgICAgICAgICAqIEBwYXJhbSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGJpbmRLZXk6IEZ1bmN0aW9uQmluZEtleTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5iaW5kS2V5CisgICAgICAgICAqLworICAgICAgICBiaW5kS2V5PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBrZXk6IGFueSwKKyAgICAgICAgICAgIC4uLnBhcnRpYWxzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYmluZEtleQorICAgICAgICAgKi8KKyAgICAgICAgYmluZEtleTxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KAorICAgICAgICAgICAga2V5OiBhbnksCisgICAgICAgICAgICAuLi5wYXJ0aWFsczogYW55W10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5jcmVhdGVDYWxsYmFjaworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUHJvZHVjZXMgYSBjYWxsYmFjayBib3VuZCB0byBhbiBvcHRpb25hbCB0aGlzQXJnLiBJZiBmdW5jIGlzIGEgcHJvcGVydHkgbmFtZSB0aGUgY3JlYXRlZAorICAgICAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgZnVuYyBpcyBhbiBvYmplY3QgdGhlIGNyZWF0ZWQKKyAgICAgICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdHJ1ZSBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50IG9iamVjdCBwcm9wZXJ0aWVzLAorICAgICAgICAgKiBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gZmFsc2UuCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgY2FsbGJhY2suCisgICAgICAgICAqIEBwYXJhbSBhcmdDb3VudCBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgY2FsbGJhY2sgYWNjZXB0cy4KKyAgICAgICAgICogQHJldHVybiBBIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgICAgICAgKiovCisgICAgICAgIGNyZWF0ZUNhbGxiYWNrKAorICAgICAgICAgICAgZnVuYzogc3RyaW5nLAorICAgICAgICAgICAgYXJnQ291bnQ/OiBudW1iZXIpOiAoKSA9PiBhbnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jcmVhdGVDYWxsYmFjaworICAgICAgICAgKiovCisgICAgICAgIGNyZWF0ZUNhbGxiYWNrKAorICAgICAgICAgICAgZnVuYzogRGljdGlvbmFyeTxhbnk+LAorICAgICAgICAgICAgYXJnQ291bnQ/OiBudW1iZXIpOiAoKSA9PiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNyZWF0ZUNhbGxiYWNrCisgICAgICAgICAqKi8KKyAgICAgICAgY3JlYXRlQ2FsbGJhY2soCisgICAgICAgICAgICBhcmdDb3VudD86IG51bWJlcik6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwoKSA9PiBhbnk+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNyZWF0ZUNhbGxiYWNrCisgICAgICAgICAqKi8KKyAgICAgICAgY3JlYXRlQ2FsbGJhY2soCisgICAgICAgICAgICBhcmdDb3VudD86IG51bWJlcik6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwoKSA9PiBhbnk+OworICAgIH0KKworICAgIC8vXy5jdXJyeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgb3IgbW9yZSBhcmd1bWVudHMgb2YgZnVuYyB0aGF0IHdoZW4gY2FsbGVkIGVpdGhlciBpbnZva2VzIGZ1bmMgcmV0dXJuaW5nCisgICAgICAgICAqIGl0cyByZXN1bHQsIGlmIGFsbCBmdW5jIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgb2YgdGhlCisgICAgICAgICAqIHJlbWFpbmluZyBmdW5jIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgZnVuYyBtYXkgYmUgc3BlY2lmaWVkIGlmIGZ1bmMubGVuZ3RoIGlzIG5vdCBzdWZmaWNpZW50LgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjdXJyeTxUMSwgUj4oZnVuYzogKHQxOiBUMSkgPT4gUik6CisgICAgICAgICAgICBDdXJyaWVkRnVuY3Rpb24xPFQxLCBSPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgYXJndW1lbnRzIG9mIGZ1bmMgdGhhdCB3aGVuIGNhbGxlZCBlaXRoZXIgaW52b2tlcyBmdW5jIHJldHVybmluZworICAgICAgICAgKiBpdHMgcmVzdWx0LCBpZiBhbGwgZnVuYyBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBvciBtb3JlIG9mIHRoZQorICAgICAgICAgKiByZW1haW5pbmcgZnVuYyBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGZ1bmMgbWF5IGJlIHNwZWNpZmllZCBpZiBmdW5jLmxlbmd0aCBpcyBub3Qgc3VmZmljaWVudC4KKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY3Vycnk8VDEsIFQyLCBSPihmdW5jOiAodDE6IFQxLCB0MjogVDIpID0+IFIpOgorICAgICAgICAgICAgQ3VycmllZEZ1bmN0aW9uMjxUMSwgVDIsIFI+OworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgb3IgbW9yZSBhcmd1bWVudHMgb2YgZnVuYyB0aGF0IHdoZW4gY2FsbGVkIGVpdGhlciBpbnZva2VzIGZ1bmMgcmV0dXJuaW5nCisgICAgICAgICAqIGl0cyByZXN1bHQsIGlmIGFsbCBmdW5jIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgb2YgdGhlCisgICAgICAgICAqIHJlbWFpbmluZyBmdW5jIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgZnVuYyBtYXkgYmUgc3BlY2lmaWVkIGlmIGZ1bmMubGVuZ3RoIGlzIG5vdCBzdWZmaWNpZW50LgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjdXJyeTxUMSwgVDIsIFQzLCBSPihmdW5jOiAodDE6IFQxLCB0MjogVDIsIHQzOiBUMykgPT4gUik6CisgICAgICAgICAgICBDdXJyaWVkRnVuY3Rpb24zPFQxLCBUMiwgVDMsIFI+OworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgb3IgbW9yZSBhcmd1bWVudHMgb2YgZnVuYyB0aGF0IHdoZW4gY2FsbGVkIGVpdGhlciBpbnZva2VzIGZ1bmMgcmV0dXJuaW5nCisgICAgICAgICAqIGl0cyByZXN1bHQsIGlmIGFsbCBmdW5jIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgb2YgdGhlCisgICAgICAgICAqIHJlbWFpbmluZyBmdW5jIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgZnVuYyBtYXkgYmUgc3BlY2lmaWVkIGlmIGZ1bmMubGVuZ3RoIGlzIG5vdCBzdWZmaWNpZW50LgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjdXJyeTxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogKHQxOiBUMSwgdDI6IFQyLCB0MzogVDMsIHQ0OiBUNCkgPT4gUik6CisgICAgICAgICAgICBDdXJyaWVkRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgYXJndW1lbnRzIG9mIGZ1bmMgdGhhdCB3aGVuIGNhbGxlZCBlaXRoZXIgaW52b2tlcyBmdW5jIHJldHVybmluZworICAgICAgICAgKiBpdHMgcmVzdWx0LCBpZiBhbGwgZnVuYyBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBvciBtb3JlIG9mIHRoZQorICAgICAgICAgKiByZW1haW5pbmcgZnVuYyBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGZ1bmMgbWF5IGJlIHNwZWNpZmllZCBpZiBmdW5jLmxlbmd0aCBpcyBub3Qgc3VmZmljaWVudC4KKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY3Vycnk8VDEsIFQyLCBUMywgVDQsIFQ1LCBSPihmdW5jOiAodDE6IFQxLCB0MjogVDIsIHQzOiBUMywgdDQ6IFQ0LCB0NTogVDUpID0+IFIpOgorICAgICAgICAgICAgQ3VycmllZEZ1bmN0aW9uNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFI+OworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgb3IgbW9yZSBhcmd1bWVudHMgb2YgZnVuYyB0aGF0IHdoZW4gY2FsbGVkIGVpdGhlciBpbnZva2VzIGZ1bmMgcmV0dXJuaW5nCisgICAgICAgICAqIGl0cyByZXN1bHQsIGlmIGFsbCBmdW5jIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgb2YgdGhlCisgICAgICAgICAqIHJlbWFpbmluZyBmdW5jIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgZnVuYyBtYXkgYmUgc3BlY2lmaWVkIGlmIGZ1bmMubGVuZ3RoIGlzIG5vdCBzdWZmaWNpZW50LgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEBwYXJhbSBhcml0eSBUaGUgYXJpdHkgb2YgZnVuYy4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGN1cnJ5PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBmdW5jOiBGdW5jdGlvbiwKKyAgICAgICAgICAgIGFyaXR5PzogbnVtYmVyKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ3VycmllZEZ1bmN0aW9uMTxUMSwgUj4geworICAgICAgICAoKTogQ3VycmllZEZ1bmN0aW9uMTxUMSwgUj47CisgICAgICAgICh0MTogVDEpOiBSOworICAgIH0KKworICAgIGludGVyZmFjZSBDdXJyaWVkRnVuY3Rpb24yPFQxLCBUMiwgUj4geworICAgICAgICAoKTogQ3VycmllZEZ1bmN0aW9uMjxUMSwgVDIsIFI+OworICAgICAgICAodDE6IFQxKTogQ3VycmllZEZ1bmN0aW9uMTxUMiwgUj47CisgICAgICAgICh0MTogVDEsIHQyOiBUMik6IFI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEN1cnJpZWRGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj4geworICAgICAgICAoKTogQ3VycmllZEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPjsKKyAgICAgICAgKHQxOiBUMSk6IEN1cnJpZWRGdW5jdGlvbjI8VDIsIFQzLCBSPjsKKyAgICAgICAgKHQxOiBUMSwgdDI6IFQyKTogQ3VycmllZEZ1bmN0aW9uMTxUMywgUj47CisgICAgICAgICh0MTogVDEsIHQyOiBUMiwgdDM6IFQzKTogUjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ3VycmllZEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4geworICAgICAgICAoKTogQ3VycmllZEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj47CisgICAgICAgICh0MTogVDEpOiBDdXJyaWVkRnVuY3Rpb24zPFQyLCBUMywgVDQsIFI+OworICAgICAgICAodDE6IFQxLCB0MjogVDIpOiBDdXJyaWVkRnVuY3Rpb24yPFQzLCBUNCwgUj47CisgICAgICAgICh0MTogVDEsIHQyOiBUMiwgdDM6IFQzKTogQ3VycmllZEZ1bmN0aW9uMTxUNCwgUj47CisgICAgICAgICh0MTogVDEsIHQyOiBUMiwgdDM6IFQzLCB0NDogVDQpOiBSOworICAgIH0KKworICAgIGludGVyZmFjZSBDdXJyaWVkRnVuY3Rpb241PFQxLCBUMiwgVDMsIFQ0LCBUNSwgUj4geworICAgICAgICAoKTogQ3VycmllZEZ1bmN0aW9uNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFI+OworICAgICAgICAodDE6IFQxKTogQ3VycmllZEZ1bmN0aW9uNDxUMiwgVDMsIFQ0LCBUNSwgUj47CisgICAgICAgICh0MTogVDEsIHQyOiBUMik6IEN1cnJpZWRGdW5jdGlvbjM8VDMsIFQ0LCBUNSwgUj47CisgICAgICAgICh0MTogVDEsIHQyOiBUMiwgdDM6IFQzKTogQ3VycmllZEZ1bmN0aW9uMjxUNCwgVDUsIFI+OworICAgICAgICAodDE6IFQxLCB0MjogVDIsIHQzOiBUMywgdDQ6IFQ0KTogQ3VycmllZEZ1bmN0aW9uMTxUNSwgUj47CisgICAgICAgICh0MTogVDEsIHQyOiBUMiwgdDM6IFQzLCB0NDogVDQsIHQ1OiBUNSk6IFI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY3VycnkKKyAgICAgICAgICoqLworICAgICAgICBjdXJyeTxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KGFyaXR5PzogbnVtYmVyKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5jdXJyeVJpZ2h0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uY3VycnkgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGZ1bmMgaW4gdGhlIG1hbm5lciBvZiBfLnBhcnRpYWxSaWdodAorICAgICAgICAgKiBpbnN0ZWFkIG9mIF8ucGFydGlhbC4KKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY3VycnlSaWdodDxUMSwgUj4oZnVuYzogKHQxOiBUMSkgPT4gUik6CisgICAgICAgICAgICBDdXJyaWVkRnVuY3Rpb24xPFQxLCBSPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5jdXJyeSBleGNlcHQgdGhhdCBhcmd1bWVudHMgYXJlIGFwcGxpZWQgdG8gZnVuYyBpbiB0aGUgbWFubmVyIG9mIF8ucGFydGlhbFJpZ2h0CisgICAgICAgICAqIGluc3RlYWQgb2YgXy5wYXJ0aWFsLgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjdXJyeVJpZ2h0PFQxLCBUMiwgUj4oZnVuYzogKHQxOiBUMSwgdDI6IFQyKSA9PiBSKToKKyAgICAgICAgICAgIEN1cnJpZWRGdW5jdGlvbjI8VDIsIFQxLCBSPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5jdXJyeSBleGNlcHQgdGhhdCBhcmd1bWVudHMgYXJlIGFwcGxpZWQgdG8gZnVuYyBpbiB0aGUgbWFubmVyIG9mIF8ucGFydGlhbFJpZ2h0CisgICAgICAgICAqIGluc3RlYWQgb2YgXy5wYXJ0aWFsLgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjdXJyeVJpZ2h0PFQxLCBUMiwgVDMsIFI+KGZ1bmM6ICh0MTogVDEsIHQyOiBUMiwgdDM6IFQzKSA9PiBSKToKKyAgICAgICAgICAgIEN1cnJpZWRGdW5jdGlvbjM8VDMsIFQyLCBUMSwgUj47CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uY3VycnkgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGZ1bmMgaW4gdGhlIG1hbm5lciBvZiBfLnBhcnRpYWxSaWdodAorICAgICAgICAgKiBpbnN0ZWFkIG9mIF8ucGFydGlhbC4KKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY3VycnlSaWdodDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogKHQxOiBUMSwgdDI6IFQyLCB0MzogVDMsIHQ0OiBUNCkgPT4gUik6CisgICAgICAgICAgICBDdXJyaWVkRnVuY3Rpb240PFQ0LCBUMywgVDIsIFQxLCBSPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5jdXJyeSBleGNlcHQgdGhhdCBhcmd1bWVudHMgYXJlIGFwcGxpZWQgdG8gZnVuYyBpbiB0aGUgbWFubmVyIG9mIF8ucGFydGlhbFJpZ2h0CisgICAgICAgICAqIGluc3RlYWQgb2YgXy5wYXJ0aWFsLgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjdXJyeVJpZ2h0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgUj4oZnVuYzogKHQxOiBUMSwgdDI6IFQyLCB0MzogVDMsIHQ0OiBUNCwgdDU6IFQ1KSA9PiBSKToKKyAgICAgICAgICAgIEN1cnJpZWRGdW5jdGlvbjU8VDUsIFQ0LCBUMywgVDIsIFQxLCBSPjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5jdXJyeSBleGNlcHQgdGhhdCBhcmd1bWVudHMgYXJlIGFwcGxpZWQgdG8gZnVuYyBpbiB0aGUgbWFubmVyIG9mIF8ucGFydGlhbFJpZ2h0CisgICAgICAgICAqIGluc3RlYWQgb2YgXy5wYXJ0aWFsLgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCisgICAgICAgICAqIEBwYXJhbSBhcml0eSBUaGUgYXJpdHkgb2YgZnVuYy4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGN1cnJ5UmlnaHQ8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIGZ1bmM6IEZ1bmN0aW9uLAorICAgICAgICAgICAgYXJpdHk/OiBudW1iZXIpOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmN1cnJ5UmlnaHQKKyAgICAgICAgICoqLworICAgICAgICBjdXJyeVJpZ2h0PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oYXJpdHk/OiBudW1iZXIpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmRlYm91bmNlCisgICAgaW50ZXJmYWNlIERlYm91bmNlU2V0dGluZ3MgeworICAgICAgICAvKioKKyAgICAgICAgICogU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgorICAgICAgICAgKi8KKyAgICAgICAgbGVhZGluZz86IGJvb2xlYW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXhpbXVtIHRpbWUgZnVuYyBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl04oCZcyBpbnZva2VkLgorICAgICAgICAgKi8KKyAgICAgICAgbWF4V2FpdD86IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KKyAgICAgICAgICovCisgICAgICAgIHRyYWlsaW5nPzogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgZnVuYyB1bnRpbCBhZnRlciB3YWl0IG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UKKyAgICAgICAgICogdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhcyBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBjYW5jZWwgbWV0aG9kIHRvCisgICAgICAgICAqIGNhbmNlbCBkZWxheWVkIGludm9jYXRpb25zIGFuZCBhIGZsdXNoIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4gUHJvdmlkZSBhbiBvcHRpb25zIG9iamVjdCB0bworICAgICAgICAgKiBpbmRpY2F0ZSB0aGF0IGZ1bmMgc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHdhaXQgdGltZW91dC4gU3Vic2VxdWVudAorICAgICAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGZ1bmMgaW52b2NhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogSWYgbGVhZGluZyBhbmQgdHJhaWxpbmcgb3B0aW9ucyBhcmUgdHJ1ZSwgZnVuYyBpcyBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkKKyAgICAgICAgICogaWYgdGhlIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIHdhaXQgdGltZW91dC4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlIERhdmlkIENvcmJhY2hv4oCZcyBhcnRpY2xlIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gXy5kZWJvdW5jZSBhbmQgXy50aHJvdHRsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLgorICAgICAgICAgKiBAcGFyYW0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucy5sZWFkaW5nIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMubWF4V2FpdCBUaGUgbWF4aW11bSB0aW1lIGZ1bmMgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdOKAmXMgaW52b2tlZC4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMudHJhaWxpbmcgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZGVib3VuY2U8VCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIGZ1bmM6IFQsCisgICAgICAgICAgICB3YWl0PzogbnVtYmVyLAorICAgICAgICAgICAgb3B0aW9ucz86IERlYm91bmNlU2V0dGluZ3MKKyAgICAgICAgKTogVCAmIENhbmNlbGFibGU7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGVib3VuY2UKKyAgICAgICAgICovCisgICAgICAgIGRlYm91bmNlKAorICAgICAgICAgICAgd2FpdD86IG51bWJlciwKKyAgICAgICAgICAgIG9wdGlvbnM/OiBEZWJvdW5jZVNldHRpbmdzCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgQ2FuY2VsYWJsZT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGVib3VuY2UKKyAgICAgICAgICovCisgICAgICAgIGRlYm91bmNlKAorICAgICAgICAgICAgd2FpdD86IG51bWJlciwKKyAgICAgICAgICAgIG9wdGlvbnM/OiBEZWJvdW5jZVNldHRpbmdzCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgQ2FuY2VsYWJsZT47CisgICAgfQorCisgICAgLy9fLmRlZmVyCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGZ1bmMgdW50aWwgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMgY2xlYXJlZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0bworICAgICAgICAgKiBmdW5jIHdoZW4gaXTigJlzIGludm9rZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGguCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGltZXIgaWQuCisgICAgICAgICAqLworICAgICAgICBkZWZlcjxUIGV4dGVuZHMgRnVuY3Rpb24+KAorICAgICAgICAgICAgZnVuYzogVCwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZlcgorICAgICAgICAgKi8KKyAgICAgICAgZGVmZXIoLi4uYXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZlcgorICAgICAgICAgKi8KKyAgICAgICAgZGVmZXIoLi4uYXJnczogYW55W10pOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18uZGVsYXkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZXMgZnVuYyBhZnRlciB3YWl0IG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBmdW5jIHdoZW4gaXTigJlzIGludm9rZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS4KKyAgICAgICAgICogQHBhcmFtIHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGguCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGltZXIgaWQuCisgICAgICAgICAqLworICAgICAgICBkZWxheTxUIGV4dGVuZHMgRnVuY3Rpb24+KAorICAgICAgICAgICAgZnVuYzogVCwKKyAgICAgICAgICAgIHdhaXQ6IG51bWJlciwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWxheQorICAgICAgICAgKi8KKyAgICAgICAgZGVsYXkoCisgICAgICAgICAgICB3YWl0OiBudW1iZXIsCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWxheQorICAgICAgICAgKi8KKyAgICAgICAgZGVsYXkoCisgICAgICAgICAgICB3YWl0OiBudW1iZXIsCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuCisgICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgZmxpcHBlZCA9IF8uZmxpcChmdW5jdGlvbigpIHsKKyAgICAgICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7CisgICAgICAgICAqIH0pOworICAgICAgICAgKgorICAgICAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7CisgICAgICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddCisgICAgICAgICAqLworICAgICAgICBmbGlwPFQgZXh0ZW5kcyBGdW5jdGlvbj4oZnVuYzogVCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxpcAorICAgICAgICAgKi8KKyAgICAgICAgZmxpcCgpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxpcAorICAgICAgICAgKi8KKyAgICAgICAgZmxpcCgpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLmZsb3cKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25zIHdpdGggdGhlIHRoaXMgYmluZGluZyBvZiB0aGUKKyAgICAgICAgICogY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmdW5jcyBGdW5jdGlvbnMgdG8gaW52b2tlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIC8vIDEtYXJndW1lbnQgZmlyc3QgZnVuY3Rpb24KKyAgICAgICAgZmxvdzxBMSwgUjEsIFIyPihmMTogKGExOiBBMSkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyKTogKGExOiBBMSkgPT4gUjI7CisgICAgICAgIGZsb3c8QTEsIFIxLCBSMiwgUjM+KGYxOiAoYTE6IEExKSA9PiBSMSwgZjI6IChhOiBSMSkgPT4gUjIsIGYzOiAoYTogUjIpID0+IFIzKTogKGExOiBBMSkgPT4gUjM7CisgICAgICAgIGZsb3c8QTEsIFIxLCBSMiwgUjMsIFI0PihmMTogKGExOiBBMSkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQpOiAoYTE6IEExKSA9PiBSNDsKKyAgICAgICAgZmxvdzxBMSwgUjEsIFIyLCBSMywgUjQsIFI1PihmMTogKGExOiBBMSkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQsIGY1OiAoYTogUjQpID0+IFI1KTogKGExOiBBMSkgPT4gUjU7CisgICAgICAgIGZsb3c8QTEsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjY+KGYxOiAoYTE6IEExKSA9PiBSMSwgZjI6IChhOiBSMSkgPT4gUjIsIGYzOiAoYTogUjIpID0+IFIzLCBmNDogKGE6IFIzKSA9PiBSNCwgZjU6IChhOiBSNCkgPT4gUjUsIGY2OiAoYTogUjUpID0+IFI2KTogKGExOiBBMSkgPT4gUjY7CisgICAgICAgIGZsb3c8QTEsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsIFI3PihmMTogKGExOiBBMSkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQsIGY1OiAoYTogUjQpID0+IFI1LCBmNjogKGE6IFI1KSA9PiBSNiwgZjc6IChhOiBSNikgPT4gUjcpOiAoYTE6IEExKSA9PiBSNzsKKyAgICAgICAgLy8gMi1hcmd1bWVudCBmaXJzdCBmdW5jdGlvbgorICAgICAgICBmbG93PEExLCBBMiwgUjEsIFIyPihmMTogKGExOiBBMSwgYTI6IEEyKSA9PiBSMSwgZjI6IChhOiBSMSkgPT4gUjIpOiAoYTE6IEExLCBhMjogQTIpID0+IFIyOworICAgICAgICBmbG93PEExLCBBMiwgUjEsIFIyLCBSMz4oZjE6IChhMTogQTEsIGEyOiBBMikgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMyk6IChhMTogQTEsIGEyOiBBMikgPT4gUjM7CisgICAgICAgIGZsb3c8QTEsIEEyLCBSMSwgUjIsIFIzLCBSND4oZjE6IChhMTogQTEsIGEyOiBBMikgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQpOiAoYTE6IEExLCBhMjogQTIpID0+IFI0OworICAgICAgICBmbG93PEExLCBBMiwgUjEsIFIyLCBSMywgUjQsIFI1PihmMTogKGExOiBBMSwgYTI6IEEyKSA9PiBSMSwgZjI6IChhOiBSMSkgPT4gUjIsIGYzOiAoYTogUjIpID0+IFIzLCBmNDogKGE6IFIzKSA9PiBSNCwgZjU6IChhOiBSNCkgPT4gUjUpOiAoYTE6IEExLCBhMjogQTIpID0+IFI1OworICAgICAgICBmbG93PEExLCBBMiwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNj4oZjE6IChhMTogQTEsIGEyOiBBMikgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQsIGY1OiAoYTogUjQpID0+IFI1LCBmNjogKGE6IFI1KSA9PiBSNik6IChhMTogQTEsIGEyOiBBMikgPT4gUjY7CisgICAgICAgIGZsb3c8QTEsIEEyLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNz4oZjE6IChhMTogQTEsIGEyOiBBMikgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQsIGY1OiAoYTogUjQpID0+IFI1LCBmNjogKGE6IFI1KSA9PiBSNiwgZjc6IChhOiBSNikgPT4gUjcpOiAoYTE6IEExLCBhMjogQTIpID0+IFI3OworICAgICAgICAvLyAzLWFyZ3VtZW50IGZpcnN0IGZ1bmN0aW9uCisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgUjEsIFIyPihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMpID0+IFIxLCBmMjogKGE6IFIxKSA9PiBSMik6IChhMTogQTEsIGEyOiBBMiwgYTM6IEEzKSA9PiBSMjsKKyAgICAgICAgZmxvdzxBMSwgQTIsIEEzLCBSMSwgUjIsIFIzPihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMpID0+IFIxLCBmMjogKGE6IFIxKSA9PiBSMiwgZjM6IChhOiBSMikgPT4gUjMpOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMykgPT4gUjM7CisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgUjEsIFIyLCBSMywgUjQ+KGYxOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMykgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQpOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMykgPT4gUjQ7CisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgUjEsIFIyLCBSMywgUjQsIFI1PihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMpID0+IFIxLCBmMjogKGE6IFIxKSA9PiBSMiwgZjM6IChhOiBSMikgPT4gUjMsIGY0OiAoYTogUjMpID0+IFI0LCBmNTogKGE6IFI0KSA9PiBSNSk6IChhMTogQTEsIGEyOiBBMiwgYTM6IEEzKSA9PiBSNTsKKyAgICAgICAgZmxvdzxBMSwgQTIsIEEzLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2PihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMpID0+IFIxLCBmMjogKGE6IFIxKSA9PiBSMiwgZjM6IChhOiBSMikgPT4gUjMsIGY0OiAoYTogUjMpID0+IFI0LCBmNTogKGE6IFI0KSA9PiBSNSwgZjY6IChhOiBSNSkgPT4gUjYpOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMykgPT4gUjY7CisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwgUjc+KGYxOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMykgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQsIGY1OiAoYTogUjQpID0+IFI1LCBmNjogKGE6IFI1KSA9PiBSNiwgZjc6IChhOiBSNikgPT4gUjcpOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMykgPT4gUjc7CisgICAgICAgIC8vIDQtYXJndW1lbnQgZmlyc3QgZnVuY3Rpb24KKyAgICAgICAgZmxvdzxBMSwgQTIsIEEzLCBBNCwgUjEsIFIyPihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyKTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjI7CisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgQTQsIFIxLCBSMiwgUjM+KGYxOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMywgYTQ6IEE0KSA9PiBSMSwgZjI6IChhOiBSMSkgPT4gUjIsIGYzOiAoYTogUjIpID0+IFIzKTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjM7CisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgQTQsIFIxLCBSMiwgUjMsIFI0PihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQpOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMywgYTQ6IEE0KSA9PiBSNDsKKyAgICAgICAgZmxvdzxBMSwgQTIsIEEzLCBBNCwgUjEsIFIyLCBSMywgUjQsIFI1PihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQsIGY1OiAoYTogUjQpID0+IFI1KTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjU7CisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgQTQsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjY+KGYxOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMywgYTQ6IEE0KSA9PiBSMSwgZjI6IChhOiBSMSkgPT4gUjIsIGYzOiAoYTogUjIpID0+IFIzLCBmNDogKGE6IFIzKSA9PiBSNCwgZjU6IChhOiBSNCkgPT4gUjUsIGY2OiAoYTogUjUpID0+IFI2KTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjY7CisgICAgICAgIGZsb3c8QTEsIEEyLCBBMywgQTQsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsIFI3PihmMTogKGExOiBBMSwgYTI6IEEyLCBhMzogQTMsIGE0OiBBNCkgPT4gUjEsIGYyOiAoYTogUjEpID0+IFIyLCBmMzogKGE6IFIyKSA9PiBSMywgZjQ6IChhOiBSMykgPT4gUjQsIGY1OiAoYTogUjQpID0+IFI1LCBmNjogKGE6IFI1KSA9PiBSNiwgZjc6IChhOiBSNikgPT4gUjcpOiAoYTE6IEExLCBhMjogQTIsIGEzOiBBMywgYTQ6IEE0KSA9PiBSNzsKKyAgICAgICAgLy8gZ2VuZXJpYyBmdW5jdGlvbgorICAgICAgICBmbG93PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oLi4uZnVuY3M6IEZ1bmN0aW9uW10pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsb3cKKyAgICAgICAgICovCisgICAgICAgIGZsb3c8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPiguLi5mdW5jczogRnVuY3Rpb25bXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbG93CisgICAgICAgICAqLworICAgICAgICBmbG93PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oLi4uZnVuY3M6IEZ1bmN0aW9uW10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmZsb3dSaWdodAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBfLmZsb3cgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25zIGZyb20gcmlnaHQKKyAgICAgICAgICogdG8gbGVmdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZ1bmNzIEZ1bmN0aW9ucyB0byBpbnZva2UuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZmxvd1JpZ2h0PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oLi4uZnVuY3M6IEZ1bmN0aW9uW10pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsb3dSaWdodAorICAgICAgICAgKi8KKyAgICAgICAgZmxvd1JpZ2h0PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oLi4uZnVuY3M6IEZ1bmN0aW9uW10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmxvd1JpZ2h0CisgICAgICAgICAqLworICAgICAgICBmbG93UmlnaHQ8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPiguLi5mdW5jczogRnVuY3Rpb25bXSk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKworICAgIC8vXy5tZW1vaXplCisgICAgaW50ZXJmYWNlIE1lbW9pemVkRnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiB7CisgICAgICAgIGNhY2hlOiBNYXBDYWNoZTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgZnVuYy4gSWYgcmVzb2x2ZXIgaXMgcHJvdmlkZWQgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvcgorICAgICAgICAgKiBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudAorICAgICAgICAgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgY29lcmNlZCB0byBhIHN0cmluZyBhbmQgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBUaGUgZnVuYyBpcyBpbnZva2VkIHdpdGgKKyAgICAgICAgICogdGhlIHRoaXMgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuCisgICAgICAgICAqIEBwYXJhbSByZXNvbHZlciBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBtZW1vaXppbmcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBtZW1vaXplOiB7CisgICAgICAgICAgICA8VCBleHRlbmRzIEZ1bmN0aW9uPihmdW5jOiBULCByZXNvbHZlcj86IEZ1bmN0aW9uKTogVCAmIE1lbW9pemVkRnVuY3Rpb247CisgICAgICAgICAgICBDYWNoZTogTWFwQ2FjaGVDb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lbW9pemUKKyAgICAgICAgICovCisgICAgICAgIG1lbW9pemUocmVzb2x2ZXI/OiBGdW5jdGlvbik6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgTWVtb2l6ZWRGdW5jdGlvbj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVtb2l6ZQorICAgICAgICAgKi8KKyAgICAgICAgbWVtb2l6ZShyZXNvbHZlcj86IEZ1bmN0aW9uKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBNZW1vaXplZEZ1bmN0aW9uPjsKKyAgICB9CisKKyAgICAvL18ub3ZlckFyZ3MgKHdhcyBfLm1vZEFyZ3MpCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBydW5zIGVhY2ggYXJndW1lbnQgdGhyb3VnaCBhIGNvcnJlc3BvbmRpbmcgdHJhbnNmb3JtIGZ1bmN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC4KKyAgICAgICAgICogQHBhcmFtIHRyYW5zZm9ybXMgVGhlIGZ1bmN0aW9ucyB0byB0cmFuc2Zvcm0gYXJndW1lbnRzLCBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBmdW5jdGlvbnMgb3IgYXJyYXlzCisgICAgICAgICAqIG9mIGZ1bmN0aW9ucy4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBvdmVyQXJnczxUIGV4dGVuZHMgRnVuY3Rpb24sIFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBmdW5jOiBULAorICAgICAgICAgICAgLi4udHJhbnNmb3JtczogRnVuY3Rpb25bXQorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3ZlckFyZ3MKKyAgICAgICAgICovCisgICAgICAgIG92ZXJBcmdzPFQgZXh0ZW5kcyBGdW5jdGlvbiwgVFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIGZ1bmM6IFQsCisgICAgICAgICAgICB0cmFuc2Zvcm1zOiBGdW5jdGlvbltdCisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3ZlckFyZ3MKKyAgICAgICAgICovCisgICAgICAgIG92ZXJBcmdzPFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oLi4udHJhbnNmb3JtczogRnVuY3Rpb25bXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXJBcmdzCisgICAgICAgICAqLworICAgICAgICBvdmVyQXJnczxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KHRyYW5zZm9ybXM6IEZ1bmN0aW9uW10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3ZlckFyZ3MKKyAgICAgICAgICovCisgICAgICAgIG92ZXJBcmdzPFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oLi4udHJhbnNmb3JtczogRnVuY3Rpb25bXSk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXJBcmdzCisgICAgICAgICAqLworICAgICAgICBvdmVyQXJnczxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KHRyYW5zZm9ybXM6IEZ1bmN0aW9uW10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLm5lZ2F0ZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgZnVuYy4gVGhlIGZ1bmMgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aAorICAgICAgICAgKiB0aGUgdGhpcyBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIHByZWRpY2F0ZSB0byBuZWdhdGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgbmVnYXRlPFQgZXh0ZW5kcyBGdW5jdGlvbj4ocHJlZGljYXRlOiBUKTogKC4uLmFyZ3M6IGFueVtdKSA9PiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubmVnYXRlCisgICAgICAgICAqLworICAgICAgICBuZWdhdGU8VCBleHRlbmRzIEZ1bmN0aW9uLCBUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KHByZWRpY2F0ZTogVCk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubmVnYXRlCisgICAgICAgICAqLworICAgICAgICBuZWdhdGUoKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPCguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5uZWdhdGUKKyAgICAgICAgICovCisgICAgICAgIG5lZ2F0ZTxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5uZWdhdGUKKyAgICAgICAgICovCisgICAgICAgIG5lZ2F0ZSgpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KC4uLmFyZ3M6IGFueVtdKSA9PiBib29sZWFuPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm5lZ2F0ZQorICAgICAgICAgKi8KKyAgICAgICAgbmVnYXRlPFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5vbmNlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyByZXN0cmljdGVkIHRvIGludm9raW5nIGZ1bmMgb25jZS4gUmVwZWF0IGNhbGxzIHRvIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIHZhbHVlCisgICAgICAgICAqIG9mIHRoZSBmaXJzdCBjYWxsLiBUaGUgZnVuYyBpcyBpbnZva2VkIHdpdGggdGhlIHRoaXMgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBvbmNlPFQgZXh0ZW5kcyBGdW5jdGlvbj4oZnVuYzogVCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub25jZQorICAgICAgICAgKi8KKyAgICAgICAgb25jZSgpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub25jZQorICAgICAgICAgKi8KKyAgICAgICAgb25jZSgpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLnBhcnRpYWwKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgaW52b2tlcyBmdW5jIHdpdGggYW55IGFkZGl0aW9uYWwgcGFydGlhbCBhcmd1bWVudHMKKyAgICAgICAgICogcHJlcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gXy5iaW5kIGV4Y2VwdAorICAgICAgICAgKiBpdCBkb2VzIG5vdCBhbHRlciB0aGUgdGhpcyBiaW5kaW5nLgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uCisgICAgICAgICAqKi8KKyAgICAgICAgICAgIHBhcnRpYWw6IFBhcnRpYWw7CisgICAgfQorCisgICAgdHlwZSBQSCA9IExvRGFzaFN0YXRpYzsKKworICAgIGludGVyZmFjZSBGdW5jdGlvbjA8Uj4geworICAgICAgICAoKTogUjsKKyAgICB9CisgICAgaW50ZXJmYWNlIEZ1bmN0aW9uMTxUMSwgUj4geworICAgICAgICAodDE6IFQxKTogUjsKKyAgICB9CisgICAgaW50ZXJmYWNlIEZ1bmN0aW9uMjxUMSwgVDIsIFI+IHsKKyAgICAgICAgKHQxOiBUMSwgdDI6IFQyKTogUjsKKyAgICB9CisgICAgaW50ZXJmYWNlIEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPiB7CisgICAgICAgICh0MTogVDEsIHQyOiBUMiwgdDM6IFQzKTogUjsKKyAgICB9CisgICAgaW50ZXJmYWNlIEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4geworICAgICAgICAodDE6IFQxLCB0MjogVDIsIHQzOiBUMywgdDQ6IFQ0KTogUjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgUGFydGlhbCB7CisgICAgICAgIC8vIGFyaXR5IDAKKyAgICAgICAgPFI+KGZ1bmM6IEZ1bmN0aW9uMDxSPik6IEZ1bmN0aW9uMDxSPjsKKyAgICAgICAgLy8gYXJpdHkgMQorICAgICAgICA8VDEsIFI+KGZ1bmM6IEZ1bmN0aW9uMTxUMSwgUj4pOiBGdW5jdGlvbjE8VDEsIFI+OworICAgICAgICA8VDEsIFI+KGZ1bmM6IEZ1bmN0aW9uMTxUMSwgUj4sIGFyZzE6IFQxKTogRnVuY3Rpb24wPFI+OworICAgICAgICAvLyBhcml0eSAyCisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+KTogICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24yPFQxLCBUMiwgUj47CisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+LCBhcmcxOiBUMSk6ICAgICAgICAgICAgRnVuY3Rpb24xPCAgICBUMiwgUj47CisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+LCBwbGMxOiBQSCwgYXJnMjogVDIpOiAgRnVuY3Rpb24xPFQxLCAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+LCBhcmcxOiBUMSwgYXJnMjogVDIpOiAgRnVuY3Rpb24wPCAgICAgICAgUj47CisgICAgICAgIC8vIGFyaXR5IDMKKyAgICAgICAgPFQxLCBUMiwgVDMsIFI+KGZ1bmM6IEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPik6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBSPihmdW5jOiBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj4sIGFyZzE6IFQxKTogICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24yPCAgICBUMiwgVDMsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgUj4oZnVuYzogRnVuY3Rpb24zPFQxLCBUMiwgVDMsIFI+LCBwbGMxOiBQSCwgYXJnMjogVDIpOiAgICAgICAgICAgIEZ1bmN0aW9uMjxUMSwgICAgIFQzLCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFI+KGZ1bmM6IEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPiwgYXJnMTogVDEsIGFyZzI6IFQyKTogICAgICAgICAgICBGdW5jdGlvbjE8ICAgICAgICBUMywgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBSPihmdW5jOiBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj4sIHBsYzE6IFBILCBwbGMyOiBQSCwgYXJnMzogVDMpOiAgRnVuY3Rpb24yPFQxLCBUMiwgICAgIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgUj4oZnVuYzogRnVuY3Rpb24zPFQxLCBUMiwgVDMsIFI+LCBhcmcxOiBUMSwgcGxjMjogUEgsIGFyZzM6IFQzKTogIEZ1bmN0aW9uMTwgICAgVDIsICAgICBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFI+KGZ1bmM6IEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPiwgcGxjMTogUEgsIGFyZzI6IFQyLCBhcmczOiBUMyk6ICBGdW5jdGlvbjE8VDEsICAgICAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBSPihmdW5jOiBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj4sIGFyZzE6IFQxLCBhcmcyOiBUMiwgYXJnMzogVDMpOiAgRnVuY3Rpb24wPCAgICAgICAgICAgIFI+OworICAgICAgICAvLyBhcml0eSA0CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPik6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBhcmcxOiBUMSk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjM8ICAgIFQyLCBUMywgVDQsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sIHBsYzE6IFBILCBhcmcyOiBUMik6ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uMzxUMSwgICAgIFQzLCBUNCwgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgYXJnMTogVDEsIGFyZzI6IFQyKTogICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24yPCAgICAgICAgVDMsIFQ0LCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBwbGMxOiBQSCwgcGxjMjogUEgsIGFyZzM6IFQzKTogICAgICAgICAgICBGdW5jdGlvbjM8VDEsIFQyLCAgICAgVDQsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sIGFyZzE6IFQxLCBwbGMyOiBQSCwgYXJnMzogVDMpOiAgICAgICAgICAgIEZ1bmN0aW9uMjwgICAgVDIsICAgICBUNCwgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgcGxjMTogUEgsIGFyZzI6IFQyLCBhcmczOiBUMyk6ICAgICAgICAgICAgRnVuY3Rpb24yPFQxLCAgICAgICAgIFQ0LCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBhcmcxOiBUMSwgYXJnMjogVDIsIGFyZzM6IFQzKTogICAgICAgICAgICBGdW5jdGlvbjE8ICAgICAgICAgICAgVDQsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sIHBsYzE6IFBILCBwbGMyOiBQSCwgcGxjMzogUEgsIGFyZzQ6IFQ0KTogIEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgYXJnMTogVDEsIHBsYzI6IFBILCBwbGMzOiBQSCwgYXJnNDogVDQpOiAgRnVuY3Rpb24yPCAgICBUMiwgVDMsICAgICBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBwbGMxOiBQSCwgYXJnMjogVDIsIHBsYzM6IFBILCBhcmc0OiBUNCk6ICBGdW5jdGlvbjI8VDEsICAgICBUMywgICAgIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sIGFyZzE6IFQxLCBhcmcyOiBUMiwgcGxjMzogUEgsIGFyZzQ6IFQ0KTogIEZ1bmN0aW9uMTwgICAgICAgIFQzLCAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgcGxjMTogUEgsIHBsYzI6IFBILCBhcmczOiBUMywgYXJnNDogVDQpOiAgRnVuY3Rpb24yPFQxLCBUMiwgICAgICAgICBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBhcmcxOiBUMSwgcGxjMjogUEgsIGFyZzM6IFQzLCBhcmc0OiBUNCk6ICBGdW5jdGlvbjE8ICAgIFQyLCAgICAgICAgIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sIHBsYzE6IFBILCBhcmcyOiBUMiwgYXJnMzogVDMsIGFyZzQ6IFQ0KTogIEZ1bmN0aW9uMTxUMSwgICAgICAgICAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgYXJnMTogVDEsIGFyZzI6IFQyLCBhcmczOiBUMywgYXJnNDogVDQpOiAgRnVuY3Rpb24wPCAgICAgICAgICAgICAgICBSPjsKKyAgICAgICAgLy8gY2F0Y2gtYWxsCisgICAgICAgIChmdW5jOiBGdW5jdGlvbiwgLi4uYXJnczogYW55W10pOiBGdW5jdGlvbjsKKyAgICB9CisKKyAgICAvL18ucGFydGlhbFJpZ2h0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8ucGFydGlhbCBleGNlcHQgdGhhdCBwYXJ0aWFsIGFyZ3VtZW50cyBhcmUgYXBwZW5kZWQgdG8gdGhvc2UgcHJvdmlkZWQKKyAgICAgICAgICogdG8gdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uCisgICAgICAgICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC4KKyAgICAgICAgICogQHJldHVybiBUaGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLgorICAgICAgICAgKiovCisgICAgICAgIHBhcnRpYWxSaWdodDogUGFydGlhbFJpZ2h0CisgICAgfQorCisgICAgaW50ZXJmYWNlIFBhcnRpYWxSaWdodCB7CisgICAgICAgIC8vIGFyaXR5IDAKKyAgICAgICAgPFI+KGZ1bmM6IEZ1bmN0aW9uMDxSPik6IEZ1bmN0aW9uMDxSPjsKKyAgICAgICAgLy8gYXJpdHkgMQorICAgICAgICA8VDEsIFI+KGZ1bmM6IEZ1bmN0aW9uMTxUMSwgUj4pOiBGdW5jdGlvbjE8VDEsIFI+OworICAgICAgICA8VDEsIFI+KGZ1bmM6IEZ1bmN0aW9uMTxUMSwgUj4sIGFyZzE6IFQxKTogRnVuY3Rpb24wPFI+OworICAgICAgICAvLyBhcml0eSAyCisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+KTogICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24yPFQxLCBUMiwgUj47CisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+LCBhcmcxOiBUMSwgcGxjMjogUEgpOiAgRnVuY3Rpb24xPCAgICBUMiwgUj47CisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+LCAgICAgICAgICAgYXJnMjogVDIpOiAgRnVuY3Rpb24xPFQxLCAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFI+KGZ1bmM6IEZ1bmN0aW9uMjxUMSwgVDIsIFI+LCBhcmcxOiBUMSwgYXJnMjogVDIpOiAgRnVuY3Rpb24wPCAgICAgICAgUj47CisgICAgICAgIC8vIGFyaXR5IDMKKyAgICAgICAgPFQxLCBUMiwgVDMsIFI+KGZ1bmM6IEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPik6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBSPihmdW5jOiBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj4sIGFyZzE6IFQxLCBwbGMyOiBQSCwgcGxjMzogUEgpOiAgRnVuY3Rpb24yPCAgICBUMiwgVDMsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgUj4oZnVuYzogRnVuY3Rpb24zPFQxLCBUMiwgVDMsIFI+LCAgICAgICAgICAgYXJnMjogVDIsIHBsYzM6IFBIKTogIEZ1bmN0aW9uMjxUMSwgICAgIFQzLCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFI+KGZ1bmM6IEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPiwgYXJnMTogVDEsIGFyZzI6IFQyLCBwbGMzOiBQSCk6ICBGdW5jdGlvbjE8ICAgICAgICBUMywgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBSPihmdW5jOiBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj4sICAgICAgICAgICAgICAgICAgICAgYXJnMzogVDMpOiAgRnVuY3Rpb24yPFQxLCBUMiwgICAgIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgUj4oZnVuYzogRnVuY3Rpb24zPFQxLCBUMiwgVDMsIFI+LCBhcmcxOiBUMSwgcGxjMjogUEgsIGFyZzM6IFQzKTogIEZ1bmN0aW9uMTwgICAgVDIsICAgICBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFI+KGZ1bmM6IEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCBSPiwgICAgICAgICAgIGFyZzI6IFQyLCBhcmczOiBUMyk6ICBGdW5jdGlvbjE8VDEsICAgICAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBSPihmdW5jOiBGdW5jdGlvbjM8VDEsIFQyLCBUMywgUj4sIGFyZzE6IFQxLCBhcmcyOiBUMiwgYXJnMzogVDMpOiAgRnVuY3Rpb24wPCAgICAgICAgICAgIFI+OworICAgICAgICAvLyBhcml0eSA0CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPik6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBhcmcxOiBUMSwgcGxjMjogUEgsIHBsYzM6IFBILCBwbGM0OiBQSCk6ICBGdW5jdGlvbjM8ICAgIFQyLCBUMywgVDQsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sICAgICAgICAgICBhcmcyOiBUMiwgcGxjMzogUEgsIHBsYzQ6IFBIKTogIEZ1bmN0aW9uMzxUMSwgICAgIFQzLCBUNCwgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgYXJnMTogVDEsIGFyZzI6IFQyLCBwbGMzOiBQSCwgcGxjNDogUEgpOiAgRnVuY3Rpb24yPCAgICAgICAgVDMsIFQ0LCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCAgICAgICAgICAgICAgICAgICAgIGFyZzM6IFQzLCBwbGM0OiBQSCk6ICBGdW5jdGlvbjM8VDEsIFQyLCAgICAgVDQsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sIGFyZzE6IFQxLCBwbGMyOiBQSCwgYXJnMzogVDMsIHBsYzQ6IFBIKTogIEZ1bmN0aW9uMjwgICAgVDIsICAgICBUNCwgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgICAgICAgICAgIGFyZzI6IFQyLCBhcmczOiBUMywgcGxjNDogUEgpOiAgRnVuY3Rpb24yPFQxLCAgICAgICAgIFQ0LCBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBhcmcxOiBUMSwgYXJnMjogVDIsIGFyZzM6IFQzLCBwbGM0OiBQSCk6ICBGdW5jdGlvbjE8ICAgICAgICAgICAgVDQsIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzQ6IFQ0KTogIEZ1bmN0aW9uMzxUMSwgVDIsIFQzLCAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgYXJnMTogVDEsIHBsYzI6IFBILCBwbGMzOiBQSCwgYXJnNDogVDQpOiAgRnVuY3Rpb24yPCAgICBUMiwgVDMsICAgICBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCAgICAgICAgICAgYXJnMjogVDIsIHBsYzM6IFBILCBhcmc0OiBUNCk6ICBGdW5jdGlvbjI8VDEsICAgICBUMywgICAgIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sIGFyZzE6IFQxLCBhcmcyOiBUMiwgcGxjMzogUEgsIGFyZzQ6IFQ0KTogIEZ1bmN0aW9uMTwgICAgICAgIFQzLCAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgICAgICAgICAgICAgICAgICAgICBhcmczOiBUMywgYXJnNDogVDQpOiAgRnVuY3Rpb24yPFQxLCBUMiwgICAgICAgICBSPjsKKyAgICAgICAgPFQxLCBUMiwgVDMsIFQ0LCBSPihmdW5jOiBGdW5jdGlvbjQ8VDEsIFQyLCBUMywgVDQsIFI+LCBhcmcxOiBUMSwgcGxjMjogUEgsIGFyZzM6IFQzLCBhcmc0OiBUNCk6ICBGdW5jdGlvbjE8ICAgIFQyLCAgICAgICAgIFI+OworICAgICAgICA8VDEsIFQyLCBUMywgVDQsIFI+KGZ1bmM6IEZ1bmN0aW9uNDxUMSwgVDIsIFQzLCBUNCwgUj4sICAgICAgICAgICBhcmcyOiBUMiwgYXJnMzogVDMsIGFyZzQ6IFQ0KTogIEZ1bmN0aW9uMTxUMSwgICAgICAgICAgICAgUj47CisgICAgICAgIDxUMSwgVDIsIFQzLCBUNCwgUj4oZnVuYzogRnVuY3Rpb240PFQxLCBUMiwgVDMsIFQ0LCBSPiwgYXJnMTogVDEsIGFyZzI6IFQyLCBhcmczOiBUMywgYXJnNDogVDQpOiAgRnVuY3Rpb24wPCAgICAgICAgICAgICAgICBSPjsKKyAgICAgICAgLy8gY2F0Y2gtYWxsCisgICAgICAgIChmdW5jOiBGdW5jdGlvbiwgLi4uYXJnczogYW55W10pOiBGdW5jdGlvbjsKKyAgICB9CisKKyAgICAvL18ucmVhcmcKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgZnVuYyB3aXRoIGFyZ3VtZW50cyBhcnJhbmdlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZQorICAgICAgICAgKiBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXMgcHJvdmlkZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCB0aGUgYXJndW1lbnQgdmFsdWUgYXQgdGhlIHNlY29uZCBpbmRleAorICAgICAgICAgKiBpcyBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBhbmQgc28gb24uCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZWFycmFuZ2UgYXJndW1lbnRzIGZvci4KKyAgICAgICAgICogQHBhcmFtIGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFyZ3VtZW50IGluZGV4ZXMsIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGluZGV4ZXMgb3IgYXJyYXlzIG9mIGluZGV4ZXMuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmVhcmc8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPihmdW5jOiBGdW5jdGlvbiwgaW5kZXhlczogbnVtYmVyW10pOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVhcmcKKyAgICAgICAgICovCisgICAgICAgIHJlYXJnPFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oZnVuYzogRnVuY3Rpb24sIC4uLmluZGV4ZXM6IG51bWJlcltdKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZWFyZworICAgICAgICAgKi8KKyAgICAgICAgcmVhcmc8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPihpbmRleGVzOiBudW1iZXJbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlYXJnCisgICAgICAgICAqLworICAgICAgICByZWFyZzxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KC4uLmluZGV4ZXM6IG51bWJlcltdKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5yZXN0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGZ1bmMgd2l0aCB0aGUgdGhpcyBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBzdGFydAorICAgICAgICAgKiBhbmQgYmV5b25kIHByb3ZpZGVkIGFzIGFuIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGUgcmVzdCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICByZXN0PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBmdW5jOiBGdW5jdGlvbiwKKyAgICAgICAgICAgIHN0YXJ0PzogbnVtYmVyCisgICAgICAgICk6IFRSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXN0CisgICAgICAgICAqLworICAgICAgICByZXN0PFRSZXN1bHQgZXh0ZW5kcyBGdW5jdGlvbiwgVEZ1bmMgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBmdW5jOiBURnVuYywKKyAgICAgICAgICAgIHN0YXJ0PzogbnVtYmVyCisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVzdAorICAgICAgICAgKi8KKyAgICAgICAgcmVzdDxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KHN0YXJ0PzogbnVtYmVyKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlc3QKKyAgICAgICAgICovCisgICAgICAgIHJlc3Q8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPihzdGFydD86IG51bWJlcik6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uc3ByZWFkCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGZ1bmMgd2l0aCB0aGUgdGhpcyBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhbiBhcnJheSBvZiBhcmd1bWVudHMKKyAgICAgICAgICogbXVjaCBsaWtlIEZ1bmN0aW9uI2FwcGx5LgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGUgc3ByZWFkIG9wZXJhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHNwcmVhZDxGIGV4dGVuZHMgRnVuY3Rpb24sIFQgZXh0ZW5kcyBGdW5jdGlvbj4oZnVuYzogRik6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zcHJlYWQKKyAgICAgICAgICovCisgICAgICAgIHNwcmVhZDxUIGV4dGVuZHMgRnVuY3Rpb24+KGZ1bmM6IEZ1bmN0aW9uKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zcHJlYWQKKyAgICAgICAgICovCisgICAgICAgIHNwcmVhZDxUIGV4dGVuZHMgRnVuY3Rpb24+KCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zcHJlYWQKKyAgICAgICAgICovCisgICAgICAgIHNwcmVhZDxUIGV4dGVuZHMgRnVuY3Rpb24+KCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18udGhyb3R0bGUKKyAgICBpbnRlcmZhY2UgVGhyb3R0bGVTZXR0aW5ncyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiB5b3UnZCBsaWtlIHRvIGRpc2FibGUgdGhlIGxlYWRpbmctZWRnZSBjYWxsLCBwYXNzIHRoaXMgYXMgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBsZWFkaW5nPzogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogSWYgeW91J2QgbGlrZSB0byBkaXNhYmxlIHRoZSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nLWVkZ2UsIHBhc3MgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICB0cmFpbGluZz86IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGZ1bmMgYXQgbW9zdCBvbmNlIHBlciBldmVyeSB3YWl0IG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZAorICAgICAgICAgKiBmdW5jdGlvbiBjb21lcyB3aXRoIGEgY2FuY2VsIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBpbnZvY2F0aW9ucyBhbmQgYSBmbHVzaCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlCisgICAgICAgICAqIHRoZW0uIFByb3ZpZGUgYW4gb3B0aW9ucyBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCBmdW5jIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlCisgICAgICAgICAqIG9mIHRoZSB3YWl0IHRpbWVvdXQuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBmdW5jIGNhbGwuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IElmIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG9wdGlvbnMgYXJlIHRydWUsIGZ1bmMgaXMgaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmCisgICAgICAgICAqIHRoZSB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSB3YWl0IHRpbWVvdXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS4KKyAgICAgICAgICogQHBhcmFtIHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMubGVhZGluZyBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zLnRyYWlsaW5nIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHRocm90dGxlPFQgZXh0ZW5kcyBGdW5jdGlvbj4oCisgICAgICAgICAgICBmdW5jOiBULAorICAgICAgICAgICAgd2FpdD86IG51bWJlciwKKyAgICAgICAgICAgIG9wdGlvbnM/OiBUaHJvdHRsZVNldHRpbmdzCisgICAgICAgICk6IFQgJiBDYW5jZWxhYmxlOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRocm90dGxlCisgICAgICAgICAqLworICAgICAgICB0aHJvdHRsZSgKKyAgICAgICAgICAgIHdhaXQ/OiBudW1iZXIsCisgICAgICAgICAgICBvcHRpb25zPzogVGhyb3R0bGVTZXR0aW5ncworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIENhbmNlbGFibGU+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRocm90dGxlCisgICAgICAgICAqLworICAgICAgICB0aHJvdHRsZSgKKyAgICAgICAgICAgIHdhaXQ/OiBudW1iZXIsCisgICAgICAgICAgICBvcHRpb25zPzogVGhyb3R0bGVTZXR0aW5ncworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIENhbmNlbGFibGU+OworICAgIH0KKworICAgIC8vXy51bmFyeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueQorICAgICAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KKyAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuCisgICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7CisgICAgICAgICAqIC8vID0+IFs2LCA4LCAxMF0KKyAgICAgICAgICovCisgICAgICAgIHVuYXJ5PFQgZXh0ZW5kcyBGdW5jdGlvbj4oZnVuYzogVCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5hcnkKKyAgICAgICAgICovCisgICAgICAgIHVuYXJ5KCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmFyeQorICAgICAgICAgKi8KKyAgICAgICAgdW5hcnkoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy53cmFwCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB2YWx1ZSB0byB0aGUgd3JhcHBlciBmdW5jdGlvbiBhcyBpdHMgZmlyc3QgYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsCisgICAgICAgICAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uLiBUaGUgd3JhcHBlciBpcworICAgICAgICAgKiBpbnZva2VkIHdpdGggdGhlIHRoaXMgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLgorICAgICAgICAgKiBAcGFyYW0gd3JhcHBlciBUaGUgd3JhcHBlciBmdW5jdGlvbi4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICB3cmFwPFYsIFcgZXh0ZW5kcyBGdW5jdGlvbiwgUiBleHRlbmRzIEZ1bmN0aW9uPigKKyAgICAgICAgICAgIHZhbHVlOiBWLAorICAgICAgICAgICAgd3JhcHBlcjogVworICAgICAgICApOiBSOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud3JhcAorICAgICAgICAgKi8KKyAgICAgICAgd3JhcDxWLCBSIGV4dGVuZHMgRnVuY3Rpb24+KAorICAgICAgICAgICAgdmFsdWU6IFYsCisgICAgICAgICAgICB3cmFwcGVyOiBGdW5jdGlvbgorICAgICAgICApOiBSOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud3JhcAorICAgICAgICAgKi8KKyAgICAgICAgd3JhcDxSIGV4dGVuZHMgRnVuY3Rpb24+KAorICAgICAgICAgICAgdmFsdWU6IGFueSwKKyAgICAgICAgICAgIHdyYXBwZXI6IEZ1bmN0aW9uCisgICAgICAgICk6IFI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud3JhcAorICAgICAgICAgKi8KKyAgICAgICAgd3JhcDxXIGV4dGVuZHMgRnVuY3Rpb24sIFIgZXh0ZW5kcyBGdW5jdGlvbj4od3JhcHBlcjogVyk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxSPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLndyYXAKKyAgICAgICAgICovCisgICAgICAgIHdyYXA8UiBleHRlbmRzIEZ1bmN0aW9uPih3cmFwcGVyOiBGdW5jdGlvbik6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxSPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLndyYXAKKyAgICAgICAgICovCisgICAgICAgIHdyYXA8VyBleHRlbmRzIEZ1bmN0aW9uLCBSIGV4dGVuZHMgRnVuY3Rpb24+KHdyYXBwZXI6IFcpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8Uj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy53cmFwCisgICAgICAgICAqLworICAgICAgICB3cmFwPFIgZXh0ZW5kcyBGdW5jdGlvbj4od3JhcHBlcjogRnVuY3Rpb24pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8Uj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud3JhcAorICAgICAgICAgKi8KKyAgICAgICAgd3JhcDxXIGV4dGVuZHMgRnVuY3Rpb24sIFIgZXh0ZW5kcyBGdW5jdGlvbj4od3JhcHBlcjogVyk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxSPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLndyYXAKKyAgICAgICAgICovCisgICAgICAgIHdyYXA8UiBleHRlbmRzIEZ1bmN0aW9uPih3cmFwcGVyOiBGdW5jdGlvbik6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxSPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy53cmFwCisgICAgICAgICAqLworICAgICAgICB3cmFwPFcgZXh0ZW5kcyBGdW5jdGlvbiwgUiBleHRlbmRzIEZ1bmN0aW9uPih3cmFwcGVyOiBXKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud3JhcAorICAgICAgICAgKi8KKyAgICAgICAgd3JhcDxSIGV4dGVuZHMgRnVuY3Rpb24+KHdyYXBwZXI6IEZ1bmN0aW9uKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud3JhcAorICAgICAgICAgKi8KKyAgICAgICAgd3JhcDxXIGV4dGVuZHMgRnVuY3Rpb24sIFIgZXh0ZW5kcyBGdW5jdGlvbj4od3JhcHBlcjogVyk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxSPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLndyYXAKKyAgICAgICAgICovCisgICAgICAgIHdyYXA8UiBleHRlbmRzIEZ1bmN0aW9uPih3cmFwcGVyOiBGdW5jdGlvbik6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxSPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy53cmFwCisgICAgICAgICAqLworICAgICAgICB3cmFwPFcgZXh0ZW5kcyBGdW5jdGlvbiwgUiBleHRlbmRzIEZ1bmN0aW9uPih3cmFwcGVyOiBXKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ud3JhcAorICAgICAgICAgKi8KKyAgICAgICAgd3JhcDxSIGV4dGVuZHMgRnVuY3Rpb24+KHdyYXBwZXI6IEZ1bmN0aW9uKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFI+OworICAgIH0KKworICAgIC8qKioqKioqKgorICAgICAqIExhbmcgKgorICAgICAqKioqKioqKi8KKworICAgICAgICAvL18uY2FzdEFycmF5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYXN0cyB2YWx1ZSBhcyBhbiBhcnJheSBpZiBpdOKAmXMgbm90IG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNhc3QgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBjYXN0QXJyYXk8VD4odmFsdWU6IFQpOiBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2FzdEFycmF5CisgICAgICAgICAqLworICAgICAgICBjYXN0QXJyYXkoKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jYXN0QXJyYXkKKyAgICAgICAgICovCisgICAgICAgIGNhc3RBcnJheSgpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jYXN0QXJyYXkKKyAgICAgICAgICovCisgICAgICAgIGNhc3RBcnJheSgpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jYXN0QXJyYXkKKyAgICAgICAgICovCisgICAgICAgIGNhc3RBcnJheSgpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNhc3RBcnJheQorICAgICAgICAgKi8KKyAgICAgICAgY2FzdEFycmF5KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNhc3RBcnJheQorICAgICAgICAgKi8KKyAgICAgICAgY2FzdEFycmF5KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5jbG9uZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIHN0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywKKyAgICAgICAgICogYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcywgbnVtYmVycywgT2JqZWN0IG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsCisgICAgICAgICAqIGFuZCB0eXBlZCBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFyZ3VtZW50cyBvYmplY3RzIGFyZSBjbG9uZWQgYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkKKyAgICAgICAgICogb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaCBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGNsb25lPFQ+KHZhbHVlOiBUKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZQorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmUoKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmUKKyAgICAgICAgICovCisgICAgICAgIGNsb25lKCk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZQorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmUoKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZQorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmUoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZQorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmUoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmUKKyAgICAgICAgICovCisgICAgICAgIGNsb25lKCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uY2xvbmVEZWVwCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uY2xvbmUgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwPFQ+KHZhbHVlOiBUKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZURlZXAKKyAgICAgICAgICovCisgICAgICAgIGNsb25lRGVlcCgpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwCisgICAgICAgICAqLworICAgICAgICBjbG9uZURlZXAoKTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNsb25lRGVlcAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwKCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwCisgICAgICAgICAqLworICAgICAgICBjbG9uZURlZXAoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwCisgICAgICAgICAqLworICAgICAgICBjbG9uZURlZXAoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwCisgICAgICAgICAqLworICAgICAgICBjbG9uZURlZXAoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworICAgIH0KKworICAgIC8vXy5jbG9uZURlZXBXaXRoCisgICAgaW50ZXJmYWNlIENsb25lRGVlcFdpdGhDdXN0b21pemVyPFRWYWx1ZSwgVFJlc3VsdD4geworICAgICAgICAodmFsdWU6IFRWYWx1ZSk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uY2xvbmVXaXRoIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS4KKyAgICAgICAgICogQHBhcmFtIGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIHZhbHVlOiBhbnksCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVEZWVwV2l0aEN1c3RvbWl6ZXI8YW55LCBUUmVzdWx0PgorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbkRlZXBlV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIHZhbHVlOiBULAorICAgICAgICAgICAgY3VzdG9taXplcj86IENsb25lRGVlcFdpdGhDdXN0b21pemVyPFQsIFRSZXN1bHQ+CisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxUW10sIFRSZXN1bHQ+CisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGgKKyAgICAgICAgICovCisgICAgICAgIGNsb25lRGVlcFdpdGg8VFJlc3VsdCBleHRlbmRzIChudW1iZXJ8c3RyaW5nfGJvb2xlYW4pPigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZURlZXBXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZURlZXBXaXRoPFRSZXN1bHQ+KAorICAgICAgICAgICAgY3VzdG9taXplcj86IENsb25lRGVlcFdpdGhDdXN0b21pemVyPFQsIFRSZXN1bHRbXT4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZURlZXBXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZURlZXBXaXRoPFRSZXN1bHQgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgY3VzdG9taXplcj86IENsb25lRGVlcFdpdGhDdXN0b21pemVyPFQsIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGgKKyAgICAgICAgICovCisgICAgICAgIGNsb25lRGVlcFdpdGg8VFJlc3VsdCBleHRlbmRzIChudW1iZXJ8c3RyaW5nfGJvb2xlYW4pPigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxUW10sIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGgKKyAgICAgICAgICovCisgICAgICAgIGNsb25lRGVlcFdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVEZWVwV2l0aEN1c3RvbWl6ZXI8VFtdLCBUUmVzdWx0W10+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxUUmVzdWx0IGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxUW10sIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZURlZXBXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZURlZXBXaXRoPFRSZXN1bHQgZXh0ZW5kcyAobnVtYmVyfHN0cmluZ3xib29sZWFuKT4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVEZWVwV2l0aEN1c3RvbWl6ZXI8VCwgVFJlc3VsdD4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0W10+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVEZWVwV2l0aDxUUmVzdWx0IGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZURlZXBXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmNsb25lV2l0aAorICAgIGludGVyZmFjZSBDbG9uZVdpdGhDdXN0b21pemVyPFRWYWx1ZSwgVFJlc3VsdD4geworICAgICAgICAodmFsdWU6IFRWYWx1ZSk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uY2xvbmUgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBjdXN0b21pemVyIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlLgorICAgICAgICAgKiBJZiBjdXN0b21pemVyIHJldHVybnMgdW5kZWZpbmVkIGNsb25pbmcgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuCisgICAgICAgICAqIEBwYXJhbSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICB2YWx1ZTogYW55LAorICAgICAgICAgICAgY3VzdG9taXplcj86IENsb25lV2l0aEN1c3RvbWl6ZXI8YW55LCBUUmVzdWx0PgorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VCwgVFJlc3VsdD4oCisgICAgICAgICAgICB2YWx1ZTogVCwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZVdpdGhDdXN0b21pemVyPFQsIFRSZXN1bHQ+CisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxUW10sIFRSZXN1bHQ+CisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNsb25lV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVXaXRoPFRSZXN1bHQgZXh0ZW5kcyAobnVtYmVyfHN0cmluZ3xib29sZWFuKT4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZVdpdGgKKyAgICAgICAgICovCisgICAgICAgIGNsb25lV2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZVdpdGhDdXN0b21pemVyPFQsIFRSZXN1bHRbXT4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZVdpdGgKKyAgICAgICAgICovCisgICAgICAgIGNsb25lV2l0aDxUUmVzdWx0IGV4dGVuZHMgT2JqZWN0PigKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI/OiBDbG9uZVdpdGhDdXN0b21pemVyPFQsIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNsb25lV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVXaXRoPFRSZXN1bHQgZXh0ZW5kcyAobnVtYmVyfHN0cmluZ3xib29sZWFuKT4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxUW10sIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNsb25lV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgY2xvbmVXaXRoPFRSZXN1bHQ+KAorICAgICAgICAgICAgY3VzdG9taXplcj86IENsb25lV2l0aEN1c3RvbWl6ZXI8VFtdLCBUUmVzdWx0W10+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VFJlc3VsdCBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxUW10sIFRSZXN1bHQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbG9uZVdpdGgKKyAgICAgICAgICovCisgICAgICAgIGNsb25lV2l0aDxUUmVzdWx0IGV4dGVuZHMgKG51bWJlcnxzdHJpbmd8Ym9vbGVhbik+KAorICAgICAgICAgICAgY3VzdG9taXplcj86IENsb25lV2l0aEN1c3RvbWl6ZXI8VCwgVFJlc3VsdD4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0W10+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCisgICAgICAgICAqLworICAgICAgICBjbG9uZVdpdGg8VFJlc3VsdCBleHRlbmRzIE9iamVjdD4oCisgICAgICAgICAgICBjdXN0b21pemVyPzogQ2xvbmVXaXRoQ3VzdG9taXplcjxULCBUUmVzdWx0PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmVxCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBhIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCisgICAgICAgICAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07CisgICAgICAgICAqIHZhciBvdGhlciA9IHsgJ3VzZXInOiAnZnJlZCcgfTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5lcShvYmplY3QsIG90aGVyKTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICoKKyAgICAgICAgICogXy5lcSgnYScsICdhJyk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICoKKyAgICAgICAgICogXy5lcShOYU4sIE5hTik7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICovCisgICAgICAgIGVxKAorICAgICAgICAgICAgdmFsdWU6IGFueSwKKyAgICAgICAgICAgIG90aGVyOiBhbnkKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRXF1YWwKKyAgICAgICAgICovCisgICAgICAgIGVxKAorICAgICAgICAgICAgb3RoZXI6IGFueQorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFcXVhbAorICAgICAgICAgKi8KKyAgICAgICAgZXEoCisgICAgICAgICAgICBvdGhlcjogYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uZ3QKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3RoZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgICAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3RoZXIsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBndCgKKyAgICAgICAgICAgIHZhbHVlOiBhbnksCisgICAgICAgICAgICBvdGhlcjogYW55CisgICAgICAgICk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ndAorICAgICAgICAgKi8KKyAgICAgICAgZ3Qob3RoZXI6IGFueSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ndAorICAgICAgICAgKi8KKyAgICAgICAgZ3Qob3RoZXI6IGFueSk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uZ3RlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG90aGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICAgICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG90aGVyLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgZ3RlKAorICAgICAgICAgICAgdmFsdWU6IGFueSwKKyAgICAgICAgICAgIG90aGVyOiBhbnkKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmd0ZQorICAgICAgICAgKi8KKyAgICAgICAgZ3RlKG90aGVyOiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ3RlCisgICAgICAgICAqLworICAgICAgICBndGUob3RoZXI6IGFueSk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNBcmd1bWVudHMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGFuIGFyZ3VtZW50cyBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNBcmd1bWVudHModmFsdWU/OiBhbnkpOiB2YWx1ZSBpcyBJQXJndW1lbnRzOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNBcmd1bWVudHMKKyAgICAgICAgICovCisgICAgICAgIGlzQXJndW1lbnRzKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0FyZ3VtZW50cworICAgICAgICAgKi8KKyAgICAgICAgaXNBcmd1bWVudHMoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5pc0FycmF5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgY2xhc3NpZmllZCBhcyBhbiBBcnJheSBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNBcnJheTxUPih2YWx1ZT86IGFueSk6IHZhbHVlIGlzIFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNBcnJheQorICAgICAgICAgKi8KKyAgICAgICAgaXNBcnJheSgpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0FycmF5CisgICAgICAgICAqLworICAgICAgICBpc0FycmF5KCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNBcnJheUJ1ZmZlcgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGNsYXNzaWZpZWQgYXMgYW4gQXJyYXlCdWZmZXIgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzQXJyYXlCdWZmZXIodmFsdWU/OiBhbnkpOiB2YWx1ZSBpcyBBcnJheUJ1ZmZlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzQXJyYXlCdWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlzQXJyYXlCdWZmZXIoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzQXJyYXlCdWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlzQXJyYXlCdWZmZXIoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5pc0FycmF5TGlrZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQncworICAgICAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yCisgICAgICAgICAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQHR5cGUgRnVuY3Rpb24KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pOworICAgICAgICAgKiAvLyA9PiB0cnVlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc0FycmF5TGlrZSgnYWJjJyk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc0FycmF5TGlrZShfLm5vb3ApOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKi8KKyAgICAgICAgaXNBcnJheUxpa2U8VD4odmFsdWU/OiBhbnkpOiB2YWx1ZSBpcyBUW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCxUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzQXJyYXlMaWtlCisgICAgICAgICAqLworICAgICAgICBpc0FycmF5TGlrZSgpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0FycmF5TGlrZQorICAgICAgICAgKi8KKyAgICAgICAgaXNBcnJheUxpa2UoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5pc0FycmF5TGlrZU9iamVjdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYAorICAgICAgICAgKiBpcyBhbiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQHR5cGUgRnVuY3Rpb24KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LCBlbHNlIGBmYWxzZWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pOworICAgICAgICAgKiAvLyA9PiB0cnVlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7CisgICAgICAgICAqIC8vID0+IGZhbHNlCisgICAgICAgICAqLworICAgICAgICBpc0FycmF5TGlrZU9iamVjdDxUPih2YWx1ZT86IGFueSk6IHZhbHVlIGlzIFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNBcnJheUxpa2VPYmplY3QKKyAgICAgICAgICovCisgICAgICAgIGlzQXJyYXlMaWtlT2JqZWN0KCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCxUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzQXJyYXlMaWtlT2JqZWN0CisgICAgICAgICAqLworICAgICAgICBpc0FycmF5TGlrZU9iamVjdCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzQm9vbGVhbgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNCb29sZWFuKHZhbHVlPzogYW55KTogdmFsdWUgaXMgYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzQm9vbGVhbgorICAgICAgICAgKi8KKyAgICAgICAgaXNCb29sZWFuKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0Jvb2xlYW4KKyAgICAgICAgICovCisgICAgICAgIGlzQm9vbGVhbigpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzQnVmZmVyCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgYSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgYnVmZmVyLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNCdWZmZXIodmFsdWU/OiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNCdWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlzQnVmZmVyKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0J1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgaXNCdWZmZXIoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5pc0RhdGUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGEgRGF0ZSBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNEYXRlKHZhbHVlPzogYW55KTogdmFsdWUgaXMgRGF0ZTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgaXNEYXRlKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlzRGF0ZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzRWxlbWVudAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGEgRE9NIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc0VsZW1lbnQodmFsdWU/OiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFbGVtZW50CisgICAgICAgICAqLworICAgICAgICBpc0VsZW1lbnQoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRWxlbWVudAorICAgICAgICAgKi8KKyAgICAgICAgaXNFbGVtZW50KCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNFbXB0eQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGVtcHR5LiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgZW1wdHkgdW5sZXNzIGl04oCZcyBhbiBhcmd1bWVudHMgb2JqZWN0LCBhcnJheSwgc3RyaW5nLCBvcgorICAgICAgICAgKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9uIHdpdGggYSBsZW5ndGggZ3JlYXRlciB0aGFuIDAgb3IgYW4gb2JqZWN0IHdpdGggb3duIGVudW1lcmFibGUgcHJvcGVydGllcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBlbXB0eSwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzRW1wdHkodmFsdWU/OiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFbXB0eQorICAgICAgICAgKi8KKyAgICAgICAgaXNFbXB0eSgpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFbXB0eQorICAgICAgICAgKi8KKyAgICAgICAgaXNFbXB0eSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzRXF1YWwKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUKKyAgICAgICAgICogZXF1aXZhbGVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLAorICAgICAgICAgKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsCisgICAgICAgICAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkCisgICAgICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTQorICAgICAgICAgKiBub2RlcyBhcmUgKipub3QqKiBzdXBwb3J0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTsKKyAgICAgICAgICogdmFyIG90aGVyID0geyAndXNlcic6ICdmcmVkJyB9OworICAgICAgICAgKgorICAgICAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogb2JqZWN0ID09PSBvdGhlcjsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICovCisgICAgICAgIGlzRXF1YWwoCisgICAgICAgICAgICB2YWx1ZTogYW55LAorICAgICAgICAgICAgb3RoZXI6IGFueQorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFcXVhbAorICAgICAgICAgKi8KKyAgICAgICAgaXNFcXVhbCgKKyAgICAgICAgICAgIG90aGVyOiBhbnkKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRXF1YWwKKyAgICAgICAgICovCisgICAgICAgIGlzRXF1YWwoCisgICAgICAgICAgICBvdGhlcjogYW55CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvLyBfLmlzRXF1YWxXaXRoCisgICAgaW50ZXJmYWNlIElzRXF1YWxDdXN0b21pemVyIHsKKyAgICAgICAgKHZhbHVlOiBhbnksIG90aGVyOiBhbnksIGluZGV4T3JLZXk/OiBudW1iZXJ8c3RyaW5nKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNFcXVhbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXMKKyAgICAgICAgICogaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAgY29tcGFyaXNvbnMgYXJlCisgICAgICAgICAqIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0byBzZXZlbiBhcmd1bWVudHM6CisgICAgICAgICAqIChvYmpWYWx1ZSwgb3RoVmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIG90aGVyLCBzdGFja10pLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLgorICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7CisgICAgICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTsKKyAgICAgICAgICogfQorICAgICAgICAgKgorICAgICAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkgeworICAgICAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkgeworICAgICAgICAgKiAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAqICAgfQorICAgICAgICAgKiB9CisgICAgICAgICAqCisgICAgICAgICAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddOworICAgICAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc0VxdWFsV2l0aChhcnJheSwgb3RoZXIsIGN1c3RvbWl6ZXIpOworICAgICAgICAgKiAvLyA9PiB0cnVlCisgICAgICAgICAqLworICAgICAgICBpc0VxdWFsV2l0aCgKKyAgICAgICAgICAgIHZhbHVlOiBhbnksCisgICAgICAgICAgICBvdGhlcjogYW55LAorICAgICAgICAgICAgY3VzdG9taXplcjogSXNFcXVhbEN1c3RvbWl6ZXIKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRXF1YWxXaXRoCisgICAgICAgICAqLworICAgICAgICBpc0VxdWFsV2l0aCgKKyAgICAgICAgICAgIG90aGVyOiBhbnksCisgICAgICAgICAgICBjdXN0b21pemVyOiBJc0VxdWFsQ3VzdG9taXplcgorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFcXVhbFdpdGgKKyAgICAgICAgICovCisgICAgICAgIGlzRXF1YWxXaXRoKAorICAgICAgICAgICAgb3RoZXI6IGFueSwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IElzRXF1YWxDdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNFcnJvcgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGFuIEVycm9yLCBFdmFsRXJyb3IsIFJhbmdlRXJyb3IsIFJlZmVyZW5jZUVycm9yLCBTeW50YXhFcnJvciwgVHlwZUVycm9yLCBvciBVUklFcnJvcgorICAgICAgICAgKiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzRXJyb3IodmFsdWU6IGFueSk6IHZhbHVlIGlzIEVycm9yOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFcnJvcgorICAgICAgICAgKi8KKyAgICAgICAgaXNFcnJvcigpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNFcnJvcgorICAgICAgICAgKi8KKyAgICAgICAgaXNFcnJvcigpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzRmluaXRlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gTnVtYmVyLmlzRmluaXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc0Zpbml0ZSh2YWx1ZT86IGFueSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0Zpbml0ZQorICAgICAgICAgKi8KKyAgICAgICAgaXNGaW5pdGUoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRmluaXRlCisgICAgICAgICAqLworICAgICAgICBpc0Zpbml0ZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzRnVuY3Rpb24KKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGEgRnVuY3Rpb24gb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzRnVuY3Rpb24odmFsdWU/OiBhbnkpOiB2YWx1ZSBpcyBGdW5jdGlvbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRnVuY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGlzRnVuY3Rpb24oKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzRnVuY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGlzRnVuY3Rpb24oKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5pc0ludGVnZXIKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuCisgICAgICAgICAqCisgICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZworICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzSW50ZWdlcigzKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzSW50ZWdlcignMycpOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKi8KKyAgICAgICAgaXNJbnRlZ2VyKHZhbHVlPzogYW55KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzSW50ZWdlcgorICAgICAgICAgKi8KKyAgICAgICAgaXNJbnRlZ2VyKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc0ludGVnZXIKKyAgICAgICAgICovCisgICAgICAgIGlzSW50ZWdlcigpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzTGVuZ3RoCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBpcyBsb29zZWx5IGJhc2VkIG9uIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b2xlbmd0aCkuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNMZW5ndGgoMyk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc0xlbmd0aChJbmZpbml0eSk7CisgICAgICAgICAqIC8vID0+IGZhbHNlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNMZW5ndGgoJzMnKTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICovCisgICAgICAgIGlzTGVuZ3RoKHZhbHVlPzogYW55KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzTGVuZ3RoCisgICAgICAgICAqLworICAgICAgICBpc0xlbmd0aCgpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNMZW5ndGgKKyAgICAgICAgICovCisgICAgICAgIGlzTGVuZ3RoKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNNYXAKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGEgTWFwIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNNYXA8SywgVj4odmFsdWU/OiBhbnkpOiB2YWx1ZSBpcyBNYXA8SywgVj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc01hcAorICAgICAgICAgKi8KKyAgICAgICAgaXNNYXAoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzTWFwCisgICAgICAgICAqLworICAgICAgICBpc01hcCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzTWF0Y2gKKyAgICBpbnRlcmZhY2UgaXNNYXRjaEN1c3RvbWl6ZXIgeworICAgICAgICAodmFsdWU6IGFueSwgb3RoZXI6IGFueSwgaW5kZXhPcktleT86IG51bWJlcnxzdHJpbmcpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBgb2JqZWN0YCBhbmQgYHNvdXJjZWAgdG8gZGV0ZXJtaW5lIGlmCisgICAgICAgICAqIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyBgXy5pc0VxdWFsYC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZworICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC4KKyAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9OworICAgICAgICAgKgorICAgICAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdhZ2UnOiA0MCB9KTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdhZ2UnOiAzNiB9KTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICovCisgICAgICAgIGlzTWF0Y2gob2JqZWN0OiBPYmplY3QsIHNvdXJjZTogT2JqZWN0KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc01hdGNoCisgICAgICAgICAqLworICAgICAgICBpc01hdGNoKHNvdXJjZTogT2JqZWN0KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICAvL18uaXNNYXRjaFdpdGgKKyAgICBpbnRlcmZhY2UgaXNNYXRjaFdpdGhDdXN0b21pemVyIHsKKyAgICAgICAgKHZhbHVlOiBhbnksIG90aGVyOiBhbnksIGluZGV4T3JLZXk/OiBudW1iZXJ8c3RyaW5nKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2gKKyAgICAgICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAgY29tcGFyaXNvbnMKKyAgICAgICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB0aHJlZQorICAgICAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCisgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgorICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy4KKyAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkgeworICAgICAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7CisgICAgICAgICAqIH0KKyAgICAgICAgICoKKyAgICAgICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHsKKyAgICAgICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhzcmNWYWx1ZSkpIHsKKyAgICAgICAgICogICAgIHJldHVybiB0cnVlOworICAgICAgICAgKiAgIH0KKyAgICAgICAgICogfQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07CisgICAgICAgICAqIHZhciBzb3VyY2UgPSB7ICdncmVldGluZyc6ICdoaScgfTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICovCisgICAgICAgIGlzTWF0Y2hXaXRoKG9iamVjdDogT2JqZWN0LCBzb3VyY2U6IE9iamVjdCwgY3VzdG9taXplcjogaXNNYXRjaFdpdGhDdXN0b21pemVyKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc01hdGNoV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgaXNNYXRjaFdpdGgoc291cmNlOiBPYmplY3QsIGN1c3RvbWl6ZXI6IGlzTWF0Y2hXaXRoQ3VzdG9taXplcik6IGJvb2xlYW47CisgICAgfQorCisgICAgLy9fLmlzTmFOCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgTmFOLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgdGhlIHNhbWUgYXMgaXNOYU4gd2hpY2ggcmV0dXJucyB0cnVlIGZvciB1bmRlZmluZWQgYW5kIG90aGVyIG5vbi1udW1lcmljIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgTmFOLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNOYU4odmFsdWU/OiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNOYU4KKyAgICAgICAgICovCisgICAgICAgIGlzTmFOKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc05hTgorICAgICAgICAgKi8KKyAgICAgICAgaXNOYU4oKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5pc05hdGl2ZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0cnVuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzTmF0aXZlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBGdW5jdGlvbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNOYXRpdmUKKyAgICAgICAgICovCisgICAgICAgIGlzTmF0aXZlKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzTmF0aXZlCisgICAgICAgICAqLworICAgICAgICBpc05hdGl2ZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzTmlsCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG51bGxpc2gsIGVsc2UgYGZhbHNlYC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc05pbChudWxsKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzTmlsKHZvaWQgMCk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc05pbChOYU4pOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKi8KKyAgICAgICAgaXNOaWwodmFsdWU/OiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBzZWUgXy5pc05pbAorICAgICAgICAgKi8KKyAgICAgICAgaXNOaWwoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNOaWwKKyAgICAgICAgICovCisgICAgICAgIGlzTmlsKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNOdWxsCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgbnVsbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgbnVsbCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzTnVsbCh2YWx1ZT86IGFueSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzTnVsbAorICAgICAgICAgKi8KKyAgICAgICAgaXNOdWxsKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzTnVsbAorICAgICAgICAgKi8KKyAgICAgICAgaXNOdWxsKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNOdW1iZXIKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGEgTnVtYmVyIHByaW1pdGl2ZSBvciBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRvIGV4Y2x1ZGUgSW5maW5pdHksIC1JbmZpbml0eSwgYW5kIE5hTiwgd2hpY2ggYXJlIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBfLmlzRmluaXRlIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc051bWJlcih2YWx1ZT86IGFueSk6IHZhbHVlIGlzIG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNOdW1iZXIKKyAgICAgICAgICovCisgICAgICAgIGlzTnVtYmVyKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzTnVtYmVyCisgICAgICAgICAqLworICAgICAgICBpc051bWJlcigpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzT2JqZWN0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgdGhlIGxhbmd1YWdlIHR5cGUgb2YgT2JqZWN0LiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgbmV3IE51bWJlcigwKSwKKyAgICAgICAgICogYW5kIG5ldyBTdHJpbmcoJycpKQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc09iamVjdCh2YWx1ZT86IGFueSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzT2JqZWN0CisgICAgICAgICAqLworICAgICAgICBpc09iamVjdCgpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBzZWUgXy5pc09iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgaXNPYmplY3QoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworICAgIH0KKworICAgIC8vXy5pc09iamVjdExpa2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYAorICAgICAgICAgKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mICJvYmplY3QiLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzT2JqZWN0TGlrZSh7fSk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzT2JqZWN0TGlrZShudWxsKTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICovCisgICAgICAgIGlzT2JqZWN0TGlrZSh2YWx1ZT86IGFueSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzT2JqZWN0TGlrZQorICAgICAgICAgKi8KKyAgICAgICAgaXNPYmplY3RMaWtlKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzT2JqZWN0TGlrZQorICAgICAgICAgKi8KKyAgICAgICAgaXNPYmplY3RMaWtlKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNQbGFpbk9iamVjdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEKKyAgICAgICAgICogW1tQcm90b3R5cGVdXSBvZiBudWxsLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBhc3N1bWVzIG9iamVjdHMgY3JlYXRlZCBieSB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yIGhhdmUgbm8gaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc1BsYWluT2JqZWN0KHZhbHVlPzogYW55KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNQbGFpbk9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgaXNQbGFpbk9iamVjdCgpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBzZWUgXy5pc1BsYWluT2JqZWN0CisgICAgICAgICAqLworICAgICAgICBpc1BsYWluT2JqZWN0KCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNSZWdFeHAKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGEgUmVnRXhwIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc1JlZ0V4cCh2YWx1ZT86IGFueSk6IHZhbHVlIGlzIFJlZ0V4cDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNSZWdFeHAKKyAgICAgICAgICovCisgICAgICAgIGlzUmVnRXhwKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzUmVnRXhwCisgICAgICAgICAqLworICAgICAgICBpc1JlZ0V4cCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzU2FmZUludGVnZXIKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NAorICAgICAgICAgKiBkb3VibGUgcHJlY2lzaW9uIG51bWJlciB3aGljaCBpc24ndCB0aGUgcmVzdWx0IG9mIGEgcm91bmRlZCB1bnNhZmUgaW50ZWdlci4KKyAgICAgICAgICoKKyAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIFtgTnVtYmVyLmlzU2FmZUludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNTYWZlSW50ZWdlcikuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNTYWZlSW50ZWdlcigzKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7CisgICAgICAgICAqIC8vID0+IGZhbHNlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNTYWZlSW50ZWdlcihJbmZpbml0eSk7CisgICAgICAgICAqIC8vID0+IGZhbHNlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaXNTYWZlSW50ZWdlcignMycpOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKi8KKyAgICAgICAgaXNTYWZlSW50ZWdlcih2YWx1ZTogYW55KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNTYWZlSW50ZWdlcgorICAgICAgICAgKi8KKyAgICAgICAgaXNTYWZlSW50ZWdlcigpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBzZWUgXy5pc1NhZmVJbnRlZ2VyCisgICAgICAgICAqLworICAgICAgICBpc1NhZmVJbnRlZ2VyKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNTZXQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyBjbGFzc2lmaWVkIGFzIGEgU2V0IG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNTZXQ8VD4odmFsdWU/OiBhbnkpOiB2YWx1ZSBpcyBTZXQ8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc1NldAorICAgICAgICAgKi8KKyAgICAgICAgaXNTZXQoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzU2V0CisgICAgICAgICAqLworICAgICAgICBpc1NldCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzU3RyaW5nCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgY2xhc3NpZmllZCBhcyBhIFN0cmluZyBwcmltaXRpdmUgb3Igb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzU3RyaW5nKHZhbHVlPzogYW55KTogdmFsdWUgaXMgc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBzZWUgXy5pc1N0cmluZworICAgICAgICAgKi8KKyAgICAgICAgaXNTdHJpbmcoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNTdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIGlzU3RyaW5nKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNTeW1ib2wKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5pc1N5bWJvbCgnYWJjJyk7CisgICAgICAgICAqIC8vID0+IGZhbHNlCisgICAgICAgICAqLworICAgICAgICBpc1N5bWJvbCh2YWx1ZTogYW55KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNTeW1ib2wKKyAgICAgICAgICovCisgICAgICAgIGlzU3ltYm9sKCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzU3ltYm9sCisgICAgICAgICAqLworICAgICAgICBpc1N5bWJvbCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzVHlwZWRBcnJheQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc1R5cGVkQXJyYXkodmFsdWU6IGFueSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzVHlwZWRBcnJheQorICAgICAgICAgKi8KKyAgICAgICAgaXNUeXBlZEFycmF5KCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNlZSBfLmlzVHlwZWRBcnJheQorICAgICAgICAgKi8KKyAgICAgICAgaXNUeXBlZEFycmF5KCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNVbmRlZmluZWQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB2YWx1ZSBpcyB1bmRlZmluZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIHVuZGVmaW5lZCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlzVW5kZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBzZWUgXy5pc1VuZGVmaW5lZAorICAgICAgICAgKi8KKyAgICAgICAgaXNVbmRlZmluZWQoKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogc2VlIF8uaXNVbmRlZmluZWQKKyAgICAgICAgICovCisgICAgICAgIGlzVW5kZWZpbmVkKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaXNXZWFrTWFwCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgY2xhc3NpZmllZCBhcyBhIFdlYWtNYXAgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpc1dlYWtNYXA8SywgVj4odmFsdWU/OiBhbnkpOiB2YWx1ZSBpcyBXZWFrTWFwPEssIFY+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNTZXQKKyAgICAgICAgICovCisgICAgICAgIGlzV2Vha01hcCgpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXNTZXQKKyAgICAgICAgICovCisgICAgICAgIGlzV2Vha01hcCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmlzV2Vha1NldAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGNsYXNzaWZpZWQgYXMgYSBXZWFrU2V0IG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgaXNXZWFrU2V0PFQ+KHZhbHVlPzogYW55KTogdmFsdWUgaXMgV2Vha1NldDxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlzV2Vha1NldAorICAgICAgICAgKi8KKyAgICAgICAgaXNXZWFrU2V0KCk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pc1dlYWtTZXQKKyAgICAgICAgICovCisgICAgICAgIGlzV2Vha1NldCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmx0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdmFsdWUgaXMgbGVzcyB0aGFuIG90aGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICAgICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgbGVzcyB0aGFuIG90aGVyLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgbHQoCisgICAgICAgICAgICB2YWx1ZTogYW55LAorICAgICAgICAgICAgb3RoZXI6IGFueQorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubHQKKyAgICAgICAgICovCisgICAgICAgIGx0KG90aGVyOiBhbnkpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubHQKKyAgICAgICAgICovCisgICAgICAgIGx0KG90aGVyOiBhbnkpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmx0ZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBvdGhlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLgorICAgICAgICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBvdGhlciwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGx0ZSgKKyAgICAgICAgICAgIHZhbHVlOiBhbnksCisgICAgICAgICAgICBvdGhlcjogYW55CisgICAgICAgICk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5sdGUKKyAgICAgICAgICovCisgICAgICAgIGx0ZShvdGhlcjogYW55KTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmx0ZQorICAgICAgICAgKi8KKyAgICAgICAgbHRlKG90aGVyOiBhbnkpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLnRvQXJyYXkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIHZhbHVlIHRvIGFuIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgdG9BcnJheTxUPih2YWx1ZTogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+fE51bWVyaWNEaWN0aW9uYXJ5PFQ+KTogVFtdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9BcnJheQorICAgICAgICAgKi8KKyAgICAgICAgdG9BcnJheTxUVmFsdWUsIFRSZXN1bHQ+KHZhbHVlOiBUVmFsdWUpOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b0FycmF5CisgICAgICAgICAqLworICAgICAgICB0b0FycmF5PFRSZXN1bHQ+KHZhbHVlPzogYW55KTogVFJlc3VsdFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvQXJyYXkKKyAgICAgICAgICovCisgICAgICAgIHRvQXJyYXk8VFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b0FycmF5CisgICAgICAgICAqLworICAgICAgICB0b0FycmF5KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvQXJyYXkKKyAgICAgICAgICovCisgICAgICAgIHRvQXJyYXk8VFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9BcnJheQorICAgICAgICAgKi8KKyAgICAgICAgdG9BcnJheTxUUmVzdWx0PigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvQXJyYXkKKyAgICAgICAgICovCisgICAgICAgIHRvQXJyYXkoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9BcnJheQorICAgICAgICAgKi8KKyAgICAgICAgdG9BcnJheTxUUmVzdWx0PigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18udG9QbGFpbk9iamVjdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgdmFsdWUgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHZhbHVlIHRvIG93biBwcm9wZXJ0aWVzCisgICAgICAgICAqIG9mIHRoZSBwbGFpbiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgdG9QbGFpbk9iamVjdDxUUmVzdWx0IGV4dGVuZHMge30+KHZhbHVlPzogYW55KTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvUGxhaW5PYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHRvUGxhaW5PYmplY3Q8VFJlc3VsdCBleHRlbmRzIHt9PigpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLnRvSW50ZWdlcgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBpcyBsb29zZWx5IGJhc2VkIG9uIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvaW50ZWdlcikuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KKyAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9JbnRlZ2VyKDMpOworICAgICAgICAgKiAvLyA9PiAzCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpOworICAgICAgICAgKiAvLyA9PiAwCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTsKKyAgICAgICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgKKyAgICAgICAgICoKKyAgICAgICAgICogXy50b0ludGVnZXIoJzMnKTsKKyAgICAgICAgICogLy8gPT4gMworICAgICAgICAgKi8KKyAgICAgICAgdG9JbnRlZ2VyKHZhbHVlOiBhbnkpOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b0ludGVnZXIKKyAgICAgICAgICovCisgICAgICAgIHRvSW50ZWdlcigpOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvSW50ZWdlcgorICAgICAgICAgKi8KKyAgICAgICAgdG9JbnRlZ2VyKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy50b0xlbmd0aAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyIHN1aXRhYmxlIGZvciB1c2UgYXMgdGhlIGxlbmd0aCBvZiBhbgorICAgICAgICAgKiBhcnJheS1saWtlIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b2xlbmd0aCkuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KKyAgICAgICAgICogQHJldHVybiB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy50b0xlbmd0aCgzKTsKKyAgICAgICAgICogLy8gPT4gMworICAgICAgICAgKgorICAgICAgICAgKiBfLnRvTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpOworICAgICAgICAgKiAvLyA9PiAwCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9MZW5ndGgoSW5maW5pdHkpOworICAgICAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1CisgICAgICAgICAqCisgICAgICAgICAqIF8udG9MZW5ndGgoJzMnKTsKKyAgICAgICAgICogLy8gPT4gMworICAgICAgICAgKi8KKyAgICAgICAgdG9MZW5ndGgodmFsdWU6IGFueSk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvTGVuZ3RoCisgICAgICAgICAqLworICAgICAgICB0b0xlbmd0aCgpOiBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvTGVuZ3RoCisgICAgICAgICAqLworICAgICAgICB0b0xlbmd0aCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18udG9OdW1iZXIKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IExhbmcKKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy4KKyAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLnRvTnVtYmVyKDMpOworICAgICAgICAgKiAvLyA9PiAzCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7CisgICAgICAgICAqIC8vID0+IDVlLTMyNAorICAgICAgICAgKgorICAgICAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTsKKyAgICAgICAgICogLy8gPT4gSW5maW5pdHkKKyAgICAgICAgICoKKyAgICAgICAgICogXy50b051bWJlcignMycpOworICAgICAgICAgKiAvLyA9PiAzCisgICAgICAgICAqLworICAgICAgICB0b051bWJlcih2YWx1ZTogYW55KTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9OdW1iZXIKKyAgICAgICAgICovCisgICAgICAgIHRvTnVtYmVyKCk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9OdW1iZXIKKyAgICAgICAgICovCisgICAgICAgIHRvTnVtYmVyKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy50b1NhZmVJbnRlZ2VyCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc2FmZSBpbnRlZ2VyLiBBIHNhZmUgaW50ZWdlciBjYW4gYmUgY29tcGFyZWQgYW5kCisgICAgICAgICAqIHJlcHJlc2VudGVkIGNvcnJlY3RseS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZworICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LgorICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy50b1NhZmVJbnRlZ2VyKDMpOworICAgICAgICAgKiAvLyA9PiAzCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTsKKyAgICAgICAgICogLy8gPT4gMAorICAgICAgICAgKgorICAgICAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpOworICAgICAgICAgKiAvLyA9PiA5MDA3MTk5MjU0NzQwOTkxCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9TYWZlSW50ZWdlcignMycpOworICAgICAgICAgKiAvLyA9PiAzCisgICAgICAgICAqLworICAgICAgICB0b1NhZmVJbnRlZ2VyKHZhbHVlOiBhbnkpOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b1NhZmVJbnRlZ2VyCisgICAgICAgICAqLworICAgICAgICB0b1NhZmVJbnRlZ2VyKCk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9TYWZlSW50ZWdlcgorICAgICAgICAgKi8KKyAgICAgICAgdG9TYWZlSW50ZWdlcigpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18udG9TdHJpbmcgRFVNTVkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgaWYgaXQncyBub3Qgb25lLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKKyAgICAgICAgICogZm9yIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZworICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLgorICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9TdHJpbmcobnVsbCk7CisgICAgICAgICAqIC8vID0+ICcnCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9TdHJpbmcoLTApOworICAgICAgICAgKiAvLyA9PiAnLTAnCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTsKKyAgICAgICAgICogLy8gPT4gJzEsMiwzJworICAgICAgICAgKi8KKyAgICAgICAgdG9TdHJpbmcodmFsdWU6IGFueSk6IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioqKioqKioKKyAgICAgKiBNYXRoICoKKyAgICAgKioqKioqKiovCisKKyAgICAgICAgLy9fLmFkZAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0d28gbnVtYmVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIHRvIGFkZC4KKyAgICAgICAgICogQHBhcmFtIGFkZGVuZCBUaGUgc2Vjb25kIG51bWJlciB0byBhZGQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3VtLgorICAgICAgICAgKi8KKyAgICAgICAgYWRkKAorICAgICAgICAgICAgYXVnZW5kOiBudW1iZXIsCisgICAgICAgICAgICBhZGRlbmQ6IG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYWRkCisgICAgICAgICAqLworICAgICAgICBhZGQoYWRkZW5kOiBudW1iZXIpOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYWRkCisgICAgICAgICAqLworICAgICAgICBhZGQoYWRkZW5kOiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18uY2VpbAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsY3VsYXRlcyBuIHJvdW5kZWQgdXAgdG8gcHJlY2lzaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLgorICAgICAgICAgKiBAcGFyYW0gcHJlY2lzaW9uIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuCisgICAgICAgICAqLworICAgICAgICBjZWlsKAorICAgICAgICAgICAgbjogbnVtYmVyLAorICAgICAgICAgICAgcHJlY2lzaW9uPzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jZWlsCisgICAgICAgICAqLworICAgICAgICBjZWlsKHByZWNpc2lvbj86IG51bWJlcik6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jZWlsCisgICAgICAgICAqLworICAgICAgICBjZWlsKHByZWNpc2lvbj86IG51bWJlcik6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy5mbG9vcgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsY3VsYXRlcyBuIHJvdW5kZWQgZG93biB0byBwcmVjaXNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi4KKyAgICAgICAgICogQHBhcmFtIHByZWNpc2lvbiBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci4KKyAgICAgICAgICovCisgICAgICAgIGZsb29yKAorICAgICAgICAgICAgbjogbnVtYmVyLAorICAgICAgICAgICAgcHJlY2lzaW9uPzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mbG9vcgorICAgICAgICAgKi8KKyAgICAgICAgZmxvb3IocHJlY2lzaW9uPzogbnVtYmVyKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZsb29yCisgICAgICAgICAqLworICAgICAgICBmbG9vcihwcmVjaXNpb24/OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18ubWF4CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleQorICAgICAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aAorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIG1heDxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4KKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1heAorICAgICAgICAgKi8KKyAgICAgICAgbWF4KCk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWF4CisgICAgICAgICAqLworICAgICAgICBtYXg8VD4oKTogVDsKKyAgICB9CisKKyAgICAvL18ubWF4QnkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWF4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXMKKyAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaAorICAgICAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aAorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KKyAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dOworICAgICAgICAgKgorICAgICAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYTsgfSk7CisgICAgICAgICAqIC8vID0+IHsgJ24nOiAyIH0KKyAgICAgICAgICoKKyAgICAgICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQKKyAgICAgICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpOworICAgICAgICAgKiAvLyA9PiB7ICduJzogMiB9CisgICAgICAgICAqLworICAgICAgICBtYXhCeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXhCeQorICAgICAgICAgKi8KKyAgICAgICAgbWF4Qnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWF4QnkKKyAgICAgICAgICovCisgICAgICAgIG1heEJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1heEJ5CisgICAgICAgICAqLworICAgICAgICBtYXhCeTxUT2JqZWN0IGV4dGVuZHMge30sIFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPnxEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgd2hlcmVWYWx1ZT86IFRPYmplY3QKKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1heEJ5CisgICAgICAgICAqLworICAgICAgICBtYXhCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1heEJ5CisgICAgICAgICAqLworICAgICAgICBtYXhCeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXhCeQorICAgICAgICAgKi8KKyAgICAgICAgbWF4Qnk8VE9iamVjdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIHdoZXJlVmFsdWU/OiBUT2JqZWN0CisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWF4QnkKKyAgICAgICAgICovCisgICAgICAgIG1heEJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PnxEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWF4QnkKKyAgICAgICAgICovCisgICAgICAgIG1heEJ5PFQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1heEJ5CisgICAgICAgICAqLworICAgICAgICBtYXhCeTxUT2JqZWN0IGV4dGVuZHMge30sIFQ+KAorICAgICAgICAgICAgd2hlcmVWYWx1ZT86IFRPYmplY3QKKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICAvL18ubWVhbgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcHV0ZXMgdGhlIG1lYW4gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8ubWVhbihbNCwgMiwgOCwgNl0pOworICAgICAgICAgKiAvLyA9PiA1CisgICAgICAgICAqLworICAgICAgICBtZWFuPFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPgorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZWFuCisgICAgICAgICAqLworICAgICAgICBtZWFuPFQ+KCk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lYW4KKyAgICAgICAgICovCisgICAgICAgIG1lYW4oKTogbnVtYmVyOworICAgIH0KKworICAgIC8vXy5taW4KKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5CisgICAgICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgbWluPFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPgorICAgICAgICApOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWluCisgICAgICAgICAqLworICAgICAgICBtaW4oKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5taW4KKyAgICAgICAgICovCisgICAgICAgIG1pbjxUPigpOiBUOworICAgIH0KKworICAgIC8vXy5taW5CeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpcworICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoCisgICAgICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCisgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07CisgICAgICAgICAqCisgICAgICAgICAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hOyB9KTsKKyAgICAgICAgICogLy8gPT4geyAnbic6IDEgfQorICAgICAgICAgKgorICAgICAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZAorICAgICAgICAgKiBfLm1pbkJ5KG9iamVjdHMsICduJyk7CisgICAgICAgICAqIC8vID0+IHsgJ24nOiAxIH0KKyAgICAgICAgICovCisgICAgICAgIG1pbkJ5PFQ+KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1pbkJ5CisgICAgICAgICAqLworICAgICAgICBtaW5CeTxUPigKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5taW5CeQorICAgICAgICAgKi8KKyAgICAgICAgbWluQnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWluQnkKKyAgICAgICAgICovCisgICAgICAgIG1pbkJ5PFRPYmplY3QgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICB3aGVyZVZhbHVlPzogVE9iamVjdAorICAgICAgICApOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWluQnkKKyAgICAgICAgICovCisgICAgICAgIG1pbkJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgYW55PgorICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWluQnkKKyAgICAgICAgICovCisgICAgICAgIG1pbkJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogVDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1pbkJ5CisgICAgICAgICAqLworICAgICAgICBtaW5CeTxUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgd2hlcmVWYWx1ZT86IFRPYmplY3QKKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5taW5CeQorICAgICAgICAgKi8KKyAgICAgICAgbWluQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBhbnk+fERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IFQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5taW5CeQorICAgICAgICAgKi8KKyAgICAgICAgbWluQnk8VD4oCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBUOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWluQnkKKyAgICAgICAgICovCisgICAgICAgIG1pbkJ5PFRPYmplY3QgZXh0ZW5kcyB7fSwgVD4oCisgICAgICAgICAgICB3aGVyZVZhbHVlPzogVE9iamVjdAorICAgICAgICApOiBUOworICAgIH0KKworICAgIC8vXy5yb3VuZAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsY3VsYXRlcyBuIHJvdW5kZWQgdG8gcHJlY2lzaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgbnVtYmVyIHRvIHJvdW5kLgorICAgICAgICAgKiBAcGFyYW0gcHJlY2lzaW9uIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuCisgICAgICAgICAqLworICAgICAgICByb3VuZCgKKyAgICAgICAgICAgIG46IG51bWJlciwKKyAgICAgICAgICAgIHByZWNpc2lvbj86IG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucm91bmQKKyAgICAgICAgICovCisgICAgICAgIHJvdW5kKHByZWNpc2lvbj86IG51bWJlcik6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yb3VuZAorICAgICAgICAgKi8KKyAgICAgICAgcm91bmQocHJlY2lzaW9uPzogbnVtYmVyKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLnN1bQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLnN1bShbNCwgMiwgOCwgNl0pOworICAgICAgICAgKiAvLyA9PiAyMAorICAgICAgICAgKi8KKyAgICAgICAgc3VtPFQ+KGNvbGxlY3Rpb246IExpc3Q8VD4pOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdW0KKyAgICAgICAgICovCisgICAgICAgIHN1bShjb2xsZWN0aW9uOiBMaXN0PG51bWJlcj58RGljdGlvbmFyeTxudW1iZXI+KTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3VtCisgICAgICAgICAqLworICAgICAgICBzdW0oKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bQorICAgICAgICAgKiovCisgICAgICAgIHN1bTxUVmFsdWU+KCk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bQorICAgICAgICAgKi8KKyAgICAgICAgc3VtKCk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bQorICAgICAgICAgKi8KKyAgICAgICAgc3VtKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bQorICAgICAgICAgKi8KKyAgICAgICAgc3VtPFRWYWx1ZT4oKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdW0KKyAgICAgICAgICovCisgICAgICAgIHN1bSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18uc3VtQnkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc3VtYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXMKKyAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC4KKyAgICAgICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKKyAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07CisgICAgICAgICAqCisgICAgICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTsKKyAgICAgICAgICogLy8gPT4gMjAKKyAgICAgICAgICoKKyAgICAgICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQKKyAgICAgICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpOworICAgICAgICAgKiAvLyA9PiAyMAorICAgICAgICAgKi8KKyAgICAgICAgc3VtQnk8VD4oCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBudW1iZXI+CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bUJ5CisgICAgICAgICAqLworICAgICAgICBzdW1CeSgKKyAgICAgICAgICAgIGNvbGxlY3Rpb246IExpc3Q8e30+LAorICAgICAgICAgICAgaXRlcmF0ZWU6IHN0cmluZworICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdW1CeQorICAgICAgICAgKi8KKyAgICAgICAgc3VtQnkoCisgICAgICAgICAgICBjb2xsZWN0aW9uOiBMaXN0PG51bWJlcj4KKyAgICAgICAgKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3VtQnkKKyAgICAgICAgICovCisgICAgICAgIHN1bUJ5KAorICAgICAgICAgICAgY29sbGVjdGlvbjogTGlzdDx7fT4sCisgICAgICAgICAgICBpdGVyYXRlZTogRGljdGlvbmFyeTx7fT4KKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3VtQnkKKyAgICAgICAgICovCisgICAgICAgIHN1bUJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjxULCBudW1iZXI+CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bUJ5CisgICAgICAgICAqLworICAgICAgICBzdW1CeShpdGVyYXRlZTogc3RyaW5nKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3VtQnkKKyAgICAgICAgICovCisgICAgICAgIHN1bUJ5KGl0ZXJhdGVlOiBEaWN0aW9uYXJ5PHt9Pik6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdW1CeQorICAgICAgICAgKi8KKyAgICAgICAgc3VtQnkoCisgICAgICAgICAgICBpdGVyYXRlZTogTGlzdEl0ZXJhdG9yPHt9LCBudW1iZXI+CisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bUJ5CisgICAgICAgICAqLworICAgICAgICBzdW1CeShpdGVyYXRlZTogc3RyaW5nKTogbnVtYmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3VtQnkKKyAgICAgICAgICovCisgICAgICAgIHN1bUJ5KGl0ZXJhdGVlOiBEaWN0aW9uYXJ5PHt9Pik6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bUJ5CisgICAgICAgICAqLworICAgICAgICBzdW1CeSgKKyAgICAgICAgICAgIGl0ZXJhdGVlOiBMaXN0SXRlcmF0b3I8VCwgbnVtYmVyPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bUJ5CisgICAgICAgICAqLworICAgICAgICBzdW1CeShpdGVyYXRlZTogc3RyaW5nKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdW1CeQorICAgICAgICAgKi8KKyAgICAgICAgc3VtQnkoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdW1CeQorICAgICAgICAgKi8KKyAgICAgICAgc3VtQnkoaXRlcmF0ZWU6IERpY3Rpb25hcnk8e30+KTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3VtQnkKKyAgICAgICAgICovCisgICAgICAgIHN1bUJ5KAorICAgICAgICAgICAgaXRlcmF0ZWU6IExpc3RJdGVyYXRvcjx7fSwgbnVtYmVyPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN1bUJ5CisgICAgICAgICAqLworICAgICAgICBzdW1CeShpdGVyYXRlZTogc3RyaW5nKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdW1CeQorICAgICAgICAgKi8KKyAgICAgICAgc3VtQnkoaXRlcmF0ZWU6IERpY3Rpb25hcnk8e30+KTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLyoqKioqKioqKioKKyAgICAgKiBOdW1iZXIgKgorICAgICAqKioqKioqKioqLworCisgICAgICAgIC8vXy5zdWJ0cmFjdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogU3VidHJhY3QgdHdvIG51bWJlcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKKyAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3VidHJhaGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBfLnN1YnRyYWN0KDYsIDQpOworICAgICAgICAgKiAvLyA9PiAyCisgICAgICAgICAqLworICAgICAgICBzdWJ0cmFjdCgKKyAgICAgICAgICAgIG1pbnVlbmQ6IG51bWJlciwKKyAgICAgICAgICAgIHN1YnRyYWhlbmQ6IG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3VidHJhY3QKKyAgICAgICAgICovCisgICAgICAgIHN1YnRyYWN0KAorICAgICAgICAgICAgc3VidHJhaGVuZDogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zdWJ0cmFjdAorICAgICAgICAgKi8KKyAgICAgICAgc3VidHJhY3QoCisgICAgICAgICAgICBzdWJ0cmFoZW5kOiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLmNsYW1wCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IE51bWJlcgorICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuCisgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC4KKyAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC4KKyAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8uY2xhbXAoLTEwLCAtNSwgNSk7CisgICAgICAgICAqIC8vID0+IC01CisgICAgICAgICAqCisgICAgICAgICAqIF8uY2xhbXAoMTAsIC01LCA1KTsKKyAgICAgICAgICogLy8gPT4gNQorICAgICAgICAgKi8KKyAgICAgICAgY2xhbXAoCisgICAgICAgICAgICBudW1iZXI6IG51bWJlciwKKyAgICAgICAgICAgIGxvd2VyOiBudW1iZXIsCisgICAgICAgICAgICB1cHBlcjogbnVtYmVyCisgICAgICAgICk6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jbGFtcAorICAgICAgICAgKi8KKyAgICAgICAgY2xhbXAoCisgICAgICAgICAgICBsb3dlcjogbnVtYmVyLAorICAgICAgICAgICAgdXBwZXI6IG51bWJlcgorICAgICAgICApOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY2xhbXAKKyAgICAgICAgICovCisgICAgICAgIGNsYW1wKAorICAgICAgICAgICAgbG93ZXI6IG51bWJlciwKKyAgICAgICAgICAgIHVwcGVyOiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLmluUmFuZ2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiBuIGlzIGJldHdlZW4gc3RhcnQgYW5kIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nLCBlbmQuIElmIGVuZCBpcyBub3Qgc3BlY2lmaWVkIGl04oCZcyBzZXQgdG8gc3RhcnQKKyAgICAgICAgICogd2l0aCBzdGFydCB0aGVuIHNldCB0byAwLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgbnVtYmVyIHRvIGNoZWNrLgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS4KKyAgICAgICAgICogQHBhcmFtIGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgbiBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpblJhbmdlKAorICAgICAgICAgICAgbjogbnVtYmVyLAorICAgICAgICAgICAgc3RhcnQ6IG51bWJlciwKKyAgICAgICAgICAgIGVuZDogbnVtYmVyCisgICAgICAgICk6IGJvb2xlYW47CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluUmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIGluUmFuZ2UoCisgICAgICAgICAgICBuOiBudW1iZXIsCisgICAgICAgICAgICBlbmQ6IG51bWJlcgorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluUmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIGluUmFuZ2UoCisgICAgICAgICAgICBzdGFydDogbnVtYmVyLAorICAgICAgICAgICAgZW5kOiBudW1iZXIKKyAgICAgICAgKTogYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluUmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIGluUmFuZ2UoZW5kOiBudW1iZXIpOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmluUmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIGluUmFuZ2UoCisgICAgICAgICAgICBzdGFydDogbnVtYmVyLAorICAgICAgICAgICAgZW5kOiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW5SYW5nZQorICAgICAgICAgKi8KKyAgICAgICAgaW5SYW5nZShlbmQ6IG51bWJlcik6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18ucmFuZG9tCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAoaW5jbHVzaXZlKS4gSWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbgorICAgICAgICAgKiAwIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyIGlzIHJldHVybmVkLiBJZiBmbG9hdGluZyBpcyB0cnVlLCBvciBlaXRoZXIgbWluIG9yIG1heCBhcmUgZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50CisgICAgICAgICAqIG51bWJlciBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtaW4gVGhlIG1pbmltdW0gcG9zc2libGUgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSBtYXggVGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSBmbG9hdGluZyBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLgorICAgICAgICAgKi8KKyAgICAgICAgcmFuZG9tKAorICAgICAgICAgICAgbWluPzogbnVtYmVyLAorICAgICAgICAgICAgbWF4PzogbnVtYmVyLAorICAgICAgICAgICAgZmxvYXRpbmc/OiBib29sZWFuCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJhbmRvbQorICAgICAgICAgKi8KKyAgICAgICAgcmFuZG9tKAorICAgICAgICAgICAgbWluPzogbnVtYmVyLAorICAgICAgICAgICAgZmxvYXRpbmc/OiBib29sZWFuCisgICAgICAgICk6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJhbmRvbQorICAgICAgICAgKi8KKyAgICAgICAgcmFuZG9tKGZsb2F0aW5nPzogYm9vbGVhbik6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yYW5kb20KKyAgICAgICAgICovCisgICAgICAgIHJhbmRvbSgKKyAgICAgICAgICAgIG1heD86IG51bWJlciwKKyAgICAgICAgICAgIGZsb2F0aW5nPzogYm9vbGVhbgorICAgICAgICApOiBudW1iZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yYW5kb20KKyAgICAgICAgICovCisgICAgICAgIHJhbmRvbShmbG9hdGluZz86IGJvb2xlYW4pOiBudW1iZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmFuZG9tCisgICAgICAgICAqLworICAgICAgICByYW5kb20oCisgICAgICAgICAgICBtYXg/OiBudW1iZXIsCisgICAgICAgICAgICBmbG9hdGluZz86IGJvb2xlYW4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPG51bWJlcj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yYW5kb20KKyAgICAgICAgICovCisgICAgICAgIHJhbmRvbShmbG9hdGluZz86IGJvb2xlYW4pOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKgorICAgICAqIE9iamVjdCAqCisgICAgICoqKioqKioqKiovCisKKyAgICAgICAgLy9fLmFzc2lnbgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICAgKiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudCBzb3VyY2VzCisgICAgICAgICAqIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvbgorICAgICAgICAgKiBbYE9iamVjdC5hc3NpZ25gXShodHRwczovL21kbi5pby9PYmplY3QvYXNzaWduKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CisgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuCisgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKKyAgICAgICAgICogICB0aGlzLmMgPSAzOworICAgICAgICAgKiB9CisgICAgICAgICAqCisgICAgICAgICAqIGZ1bmN0aW9uIEJhcigpIHsKKyAgICAgICAgICogICB0aGlzLmUgPSA1OworICAgICAgICAgKiB9CisgICAgICAgICAqCisgICAgICAgICAqIEZvby5wcm90b3R5cGUuZCA9IDQ7CisgICAgICAgICAqIEJhci5wcm90b3R5cGUuZiA9IDY7CisgICAgICAgICAqCisgICAgICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28sIG5ldyBCYXIpOworICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzLCAnZSc6IDUgfQorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRPYmplY3QsIFRTb3VyY2U+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlMSAmIFRTb3VyY2UyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYXNzaWduCisgICAgICAgICAqLworICAgICAgICBhc3NpZ248VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduCisgICAgICAgICAqLworICAgICAgICBhc3NpZ248VE9iamVjdD4ob2JqZWN0OiBUT2JqZWN0KTogVE9iamVjdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBhbnksCisgICAgICAgICAgICAuLi5vdGhlckFyZ3M6IGFueVtdCisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduCisgICAgICAgICAqLworICAgICAgICBhc3NpZ248VFNvdXJjZT4oCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ24KKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbjxUU291cmNlMSwgVFNvdXJjZTI+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ24KKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbjxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNAorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduKCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRSZXN1bHQ+KC4uLm90aGVyQXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduCisgICAgICAgICAqLworICAgICAgICBhc3NpZ248VFNvdXJjZT4oCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ24KKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbjxUU291cmNlMSwgVFNvdXJjZTI+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ24KKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbjxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduKCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduPFRSZXN1bHQ+KC4uLm90aGVyQXJnczogYW55W10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmFzc2lnbldpdGgKKyAgICBpbnRlcmZhY2UgQXNzaWduQ3VzdG9taXplciB7CisgICAgICAgIChvYmplY3RWYWx1ZTogYW55LCBzb3VyY2VWYWx1ZTogYW55LCBrZXk/OiBzdHJpbmcsIG9iamVjdD86IHt9LCBzb3VyY2U/OiB7fSk6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaAorICAgICAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAKKyAgICAgICAgICogYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkCisgICAgICAgICAqIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CisgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuCisgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7CisgICAgICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTsKKyAgICAgICAgICogfQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpOworICAgICAgICAgKgorICAgICAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTsKKyAgICAgICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9CisgICAgICAgICAqLworICAgICAgICBhc3NpZ25XaXRoPFRPYmplY3QsIFRTb3VyY2U+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25XaXRoPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25XaXRoPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbldpdGg8VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTMgJiBUU291cmNlNDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbldpdGg8VE9iamVjdD4ob2JqZWN0OiBUT2JqZWN0KTogVE9iamVjdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbldpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IGFueSwKKyAgICAgICAgICAgIC4uLm90aGVyQXJnczogYW55W10KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25XaXRoPFRTb3VyY2U+KAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2U+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbldpdGg8VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYXNzaWduV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduV2l0aDxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbldpdGg8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzICYgVFNvdXJjZTQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduV2l0aCgpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25XaXRoPFRSZXN1bHQ+KC4uLm90aGVyQXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduV2l0aDxUU291cmNlPigKKyAgICAgICAgICAgIHNvdXJjZTogVFNvdXJjZSwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25XaXRoPFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbldpdGg8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25XaXRoPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTMsIFRTb3VyY2U0PigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIHNvdXJjZTQ6IFRTb3VyY2U0LAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbldpdGgoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduV2l0aDxUUmVzdWx0PiguLi5vdGhlckFyZ3M6IGFueVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5hc3NpZ25JbgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZAorICAgICAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuCisgICAgICAgICAqCisgICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBhbGlhcyBleHRlbmQKKyAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAorICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLgorICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7CisgICAgICAgICAqICAgdGhpcy5iID0gMjsKKyAgICAgICAgICogfQorICAgICAgICAgKgorICAgICAgICAgKiBmdW5jdGlvbiBCYXIoKSB7CisgICAgICAgICAqICAgdGhpcy5kID0gNDsKKyAgICAgICAgICogfQorICAgICAgICAgKgorICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzOworICAgICAgICAgKiBCYXIucHJvdG90eXBlLmUgPSA1OworICAgICAgICAgKgorICAgICAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAxIH0sIG5ldyBGb28sIG5ldyBCYXIpOworICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCwgJ2UnOiA1IH0KKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluPFRPYmplY3QsIFRTb3VyY2U+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbjxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTI+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW4KKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluPFRPYmplY3Q+KG9iamVjdDogVE9iamVjdCk6IFRPYmplY3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IGFueSwKKyAgICAgICAgICAgIC4uLm90aGVyQXJnczogYW55W10KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFNvdXJjZT4oCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbjxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNAorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbigpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFJlc3VsdD4oLi4ub3RoZXJBcmdzOiBhbnlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFNvdXJjZT4oCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbjxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbigpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW48VFJlc3VsdD4oLi4ub3RoZXJBcmdzOiBhbnlbXSk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uYXNzaWduSW5XaXRoCisgICAgaW50ZXJmYWNlIEFzc2lnbkN1c3RvbWl6ZXIgeworICAgICAgICAob2JqZWN0VmFsdWU6IGFueSwgc291cmNlVmFsdWU6IGFueSwga2V5Pzogc3RyaW5nLCBvYmplY3Q/OiB7fSwgc291cmNlPzoge30pOiBhbnk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbkluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaAorICAgICAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAKKyAgICAgICAgICogYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkCisgICAgICAgICAqIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLgorICAgICAgICAgKgorICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aAorICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CisgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuCisgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7CisgICAgICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTsKKyAgICAgICAgICogfQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7CisgICAgICAgICAqCisgICAgICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pOworICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH0KKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aDxUT2JqZWN0LCBUU291cmNlPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTogVFNvdXJjZSwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbldpdGg8VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlMSAmIFRTb3VyY2UyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW5XaXRoPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW5XaXRoPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTMsIFRTb3VyY2U0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIHNvdXJjZTQ6IFRTb3VyY2U0LAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzICYgVFNvdXJjZTQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aDxUT2JqZWN0PihvYmplY3Q6IFRPYmplY3QpOiBUT2JqZWN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbldpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IGFueSwKKyAgICAgICAgICAgIC4uLm90aGVyQXJnczogYW55W10KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aDxUU291cmNlPigKKyAgICAgICAgICAgIHNvdXJjZTogVFNvdXJjZSwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aDxUU291cmNlMSwgVFNvdXJjZTI+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aDxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW5XaXRoPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTMsIFRTb3VyY2U0PigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIHNvdXJjZTQ6IFRTb3VyY2U0LAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW5XaXRoKCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgYXNzaWduSW5XaXRoPFRSZXN1bHQ+KC4uLm90aGVyQXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbldpdGg8VFNvdXJjZT4oCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbldpdGg8VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBhc3NpZ25JbldpdGg8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aDxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNCwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTMgJiBUU291cmNlND47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aCgpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGFzc2lnbkluV2l0aDxUUmVzdWx0PiguLi5vdGhlckFyZ3M6IGFueVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5jcmVhdGUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG90eXBlIG9iamVjdC4gSWYgYSBwcm9wZXJ0aWVzIG9iamVjdCBpcyBwcm92aWRlZCBpdHMgb3duCisgICAgICAgICAqIGVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLgorICAgICAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgY3JlYXRlPFQgZXh0ZW5kcyBPYmplY3QsIFUgZXh0ZW5kcyBPYmplY3Q+KAorICAgICAgICAgICAgcHJvdG90eXBlOiBULAorICAgICAgICAgICAgcHJvcGVydGllcz86IFUKKyAgICAgICAgKTogVCAmIFU7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY3JlYXRlCisgICAgICAgICAqLworICAgICAgICBjcmVhdGU8VSBleHRlbmRzIE9iamVjdD4ocHJvcGVydGllcz86IFUpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFU+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNyZWF0ZQorICAgICAgICAgKi8KKyAgICAgICAgY3JlYXRlPFUgZXh0ZW5kcyBPYmplY3Q+KHByb3BlcnRpZXM/OiBVKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBVPjsKKyAgICB9CisKKworICAgIC8vXy5kZWZhdWx0cworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3QocykgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uCisgICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIHVuZGVmaW5lZC4gT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlCisgICAgICAgICAqIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIG11dGF0ZXMgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy4KKyAgICAgICAgICogQHJldHVybiBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VE9iamVjdCwgVFNvdXJjZT4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UKKyAgICAgICAgKTogVFNvdXJjZSAmIFRPYmplY3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIKKyAgICAgICAgKTogVFNvdXJjZTIgJiBUU291cmNlMSAmIFRPYmplY3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMKKyAgICAgICAgKTogVFNvdXJjZTMgJiBUU291cmNlMiAmIFRTb3VyY2UxICYgVE9iamVjdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0czxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNAorICAgICAgICApOiBUU291cmNlNCAmIFRTb3VyY2UzICYgVFNvdXJjZTIgJiBUU291cmNlMSAmIFRPYmplY3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VE9iamVjdD4ob2JqZWN0OiBUT2JqZWN0KTogVE9iamVjdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0czxUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogYW55LAorICAgICAgICAgICAgLi4uc291cmNlczogYW55W10KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VFNvdXJjZT4oCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRTb3VyY2UgJiBUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0czxUU291cmNlMSwgVFNvdXJjZTI+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFNvdXJjZTIgJiBUU291cmNlMSAmIFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGVmYXVsdHMKKyAgICAgICAgICovCisgICAgICAgIGRlZmF1bHRzPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUU291cmNlMyAmIFRTb3VyY2UyICYgVFNvdXJjZTEgJiBUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0czxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNAorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFNvdXJjZTQgJiBUU291cmNlMyAmIFRTb3VyY2UyICYgVFNvdXJjZTEgJiBUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0cygpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VFJlc3VsdD4oLi4uc291cmNlczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGVmYXVsdHMKKyAgICAgICAgICovCisgICAgICAgIGRlZmF1bHRzPFRTb3VyY2U+KAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUU291cmNlICYgVD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRTb3VyY2UyICYgVFNvdXJjZTEgJiBUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0czxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFNvdXJjZTMgJiBUU291cmNlMiAmIFRTb3VyY2UxICYgVD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHM8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRTb3VyY2U0ICYgVFNvdXJjZTMgJiBUU291cmNlMiAmIFRTb3VyY2UxICYgVD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0cworICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdHMoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGVmYXVsdHMKKyAgICAgICAgICovCisgICAgICAgIGRlZmF1bHRzPFRSZXN1bHQ+KC4uLnNvdXJjZXM6IGFueVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5kZWZhdWx0c0RlZXAKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5kZWZhdWx0cyBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBhc3NpZ25zIGRlZmF1bHQgcHJvcGVydGllcy4KKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBvYmplY3QuCisgICAgICAgICAqKi8KKyAgICAgICAgZGVmYXVsdHNEZWVwPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBULAorICAgICAgICAgICAgLi4uc291cmNlczogYW55W10pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcAorICAgICAgICAgKiovCisgICAgICAgIGRlZmF1bHRzRGVlcDxUUmVzdWx0PiguLi5zb3VyY2VzOiBhbnlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PgorICAgIH0KKworICAgIC8vIF8uZXh0ZW5kCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW4KKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZDxUT2JqZWN0LCBUU291cmNlPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTogVFNvdXJjZQorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBleHRlbmQ8VE9iamVjdCwgVFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTMsIFRTb3VyY2U0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIHNvdXJjZTQ6IFRTb3VyY2U0CisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTMgJiBUU291cmNlNDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBleHRlbmQ8VE9iamVjdD4ob2JqZWN0OiBUT2JqZWN0KTogVE9iamVjdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBleHRlbmQ8VFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IGFueSwKKyAgICAgICAgICAgIC4uLm90aGVyQXJnczogYW55W10KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRTb3VyY2U+KAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBleHRlbmQ8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTMgJiBUU291cmNlND47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kKCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBleHRlbmQ8VFJlc3VsdD4oLi4ub3RoZXJBcmdzOiBhbnlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRTb3VyY2U+KAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBleHRlbmQ8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTMgJiBUU291cmNlND47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbgorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kKCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluCisgICAgICAgICAqLworICAgICAgICBleHRlbmQ8VFJlc3VsdD4oLi4ub3RoZXJBcmdzOiBhbnlbXSk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZFdpdGg8VE9iamVjdCwgVFNvdXJjZT4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBleHRlbmRXaXRoPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kV2l0aDxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kV2l0aDxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNCwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBleHRlbmRXaXRoPFRPYmplY3Q+KG9iamVjdDogVE9iamVjdCk6IFRPYmplY3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZFdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IGFueSwKKyAgICAgICAgICAgIC4uLm90aGVyQXJnczogYW55W10KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZFdpdGg8VFNvdXJjZT4oCisgICAgICAgICAgICBzb3VyY2U6IFRTb3VyY2UsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZFdpdGg8VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZFdpdGg8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kV2l0aDxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzLCBUU291cmNlND4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMsCisgICAgICAgICAgICBzb3VyY2U0OiBUU291cmNlNCwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IEFzc2lnbkN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTMgJiBUU291cmNlND47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZFdpdGgoKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBleHRlbmRXaXRoPFRSZXN1bHQ+KC4uLm90aGVyQXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBleHRlbmRXaXRoPFRTb3VyY2U+KAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2U+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBleHRlbmRXaXRoPFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTI+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBleHRlbmRXaXRoPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTM+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgY3VzdG9taXplcjogQXNzaWduQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMz47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGgKKyAgICAgICAgICovCisgICAgICAgIGV4dGVuZFdpdGg8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQsCisgICAgICAgICAgICBjdXN0b21pemVyOiBBc3NpZ25DdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzICYgVFNvdXJjZTQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoCisgICAgICAgICAqLworICAgICAgICBleHRlbmRXaXRoKCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgZXh0ZW5kV2l0aDxUUmVzdWx0PiguLi5vdGhlckFyZ3M6IGFueVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5maW5kS2V5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uZmluZCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlZGljYXRlIHJldHVybnMgdHJ1dGh5IGZvcgorICAgICAgICAgKiBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBwcmVkaWNhdGUgdGhlIGNyZWF0ZWQgXy5wcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eQorICAgICAgICAgKiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciB0aGlzQXJnIHRoZSBjcmVhdGVkIF8ubWF0Y2hlc1Byb3BlcnR5IHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBmb3IKKyAgICAgICAgICogZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHkgdmFsdWUsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ubWF0Y2hlcyBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yIGVsZW1lbnRzIHRoYXQKKyAgICAgICAgICogaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gc2VhcmNoLgorICAgICAgICAgKiBAcGFyYW0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgcHJlZGljYXRlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIHVuZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmRLZXk8VFZhbHVlcywgVE9iamVjdD4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlcywgYm9vbGVhbj4KKyAgICAgICAgKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZEtleTxUT2JqZWN0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgYm9vbGVhbj4KKyAgICAgICAgKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZEtleTxUT2JqZWN0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kS2V5CisgICAgICAgICAqLworICAgICAgICBmaW5kS2V5PFRXaGVyZSBleHRlbmRzIERpY3Rpb25hcnk8YW55PiwgVE9iamVjdD4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRLZXkKKyAgICAgICAgICovCisgICAgICAgIGZpbmRLZXk8VFZhbHVlcz4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlcywgYm9vbGVhbj4KKyAgICAgICAgKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZEtleSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgYm9vbGVhbj4KKyAgICAgICAgKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZEtleSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kS2V5CisgICAgICAgICAqLworICAgICAgICBmaW5kS2V5PFRXaGVyZSBleHRlbmRzIERpY3Rpb25hcnk8YW55Pj4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRLZXkKKyAgICAgICAgICovCisgICAgICAgIGZpbmRLZXk8VFZhbHVlcz4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlcywgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kS2V5CisgICAgICAgICAqLworICAgICAgICBmaW5kS2V5KAorICAgICAgICAgICAgcHJlZGljYXRlPzogT2JqZWN0SXRlcmF0b3I8YW55LCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRLZXkKKyAgICAgICAgICovCisgICAgICAgIGZpbmRLZXkoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kS2V5CisgICAgICAgICAqLworICAgICAgICBmaW5kS2V5PFRXaGVyZSBleHRlbmRzIERpY3Rpb25hcnk8YW55Pj4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLmZpbmRMYXN0S2V5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIF8uZmluZEtleSBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgcHJlZGljYXRlIHRoZSBjcmVhdGVkIF8ucHJvcGVydHkgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkKKyAgICAgICAgICogdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JlYXRlZCBfLm1hdGNoZXNQcm9wZXJ0eSBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRydWUgZm9yCisgICAgICAgICAqIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLCBlbHNlIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIHByZWRpY2F0ZSB0aGUgY3JlYXRlZCBfLm1hdGNoZXMgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGZvciBlbGVtZW50cyB0aGF0CisgICAgICAgICAqIGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHNlYXJjaC4KKyAgICAgICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIHByZWRpY2F0ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSB1bmRlZmluZWQuCisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEtleTxUVmFsdWVzLCBUT2JqZWN0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IERpY3Rpb25hcnlJdGVyYXRvcjxUVmFsdWVzLCBib29sZWFuPgorICAgICAgICApOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RLZXk8VE9iamVjdD4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBPYmplY3RJdGVyYXRvcjxhbnksIGJvb2xlYW4+CisgICAgICAgICk6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0S2V5CisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEtleTxUT2JqZWN0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IHN0cmluZworICAgICAgICApOiBzdHJpbmc7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RLZXk8VFdoZXJlIGV4dGVuZHMgRGljdGlvbmFyeTxhbnk+LCBUT2JqZWN0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IFRXaGVyZQorICAgICAgICApOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RLZXkKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0S2V5PFRWYWx1ZXM+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZXMsIGJvb2xlYW4+CisgICAgICAgICk6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0S2V5CisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEtleSgKKyAgICAgICAgICAgIHByZWRpY2F0ZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgYm9vbGVhbj4KKyAgICAgICAgKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RLZXkKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0S2V5KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZpbmRMYXN0S2V5CisgICAgICAgICAqLworICAgICAgICBmaW5kTGFzdEtleTxUV2hlcmUgZXh0ZW5kcyBEaWN0aW9uYXJ5PGFueT4+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogVFdoZXJlCisgICAgICAgICk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RLZXk8VFZhbHVlcz4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBEaWN0aW9uYXJ5SXRlcmF0b3I8VFZhbHVlcywgYm9vbGVhbj4KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5maW5kTGFzdEtleQorICAgICAgICAgKi8KKyAgICAgICAgZmluZExhc3RLZXkoCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBPYmplY3RJdGVyYXRvcjxhbnksIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RLZXkKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0S2V5KAorICAgICAgICAgICAgcHJlZGljYXRlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZmluZExhc3RLZXkKKyAgICAgICAgICovCisgICAgICAgIGZpbmRMYXN0S2V5PFRXaGVyZSBleHRlbmRzIERpY3Rpb25hcnk8YW55Pj4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBUV2hlcmUKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLmZvckluCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgaW52b2tpbmcgaXRlcmF0ZWUgZm9yIGVhY2ggcHJvcGVydHkuIFRoZQorICAgICAgICAgKiBpdGVyYXRlZSBpcyBib3VuZCB0byB0aGlzQXJnIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heQorICAgICAgICAgKiBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgaXRlcmF0ZWUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBmb3JJbjxUPigKKyAgICAgICAgICAgIG9iamVjdDogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckluCisgICAgICAgICAqLworICAgICAgICBmb3JJbjxUIGV4dGVuZHMge30+KAorICAgICAgICAgICAgb2JqZWN0OiBULAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBPYmplY3RJdGVyYXRvcjxhbnksIGFueT4KKyAgICAgICAgKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JJbgorICAgICAgICAgKi8KKyAgICAgICAgZm9ySW48VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZSwgYW55PgorICAgICAgICApOiBfLkxvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JJbgorICAgICAgICAgKi8KKyAgICAgICAgZm9ySW48VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZSwgYW55PgorICAgICAgICApOiBfLkxvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uZm9ySW5SaWdodAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBfLmZvckluIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZiBvYmplY3QgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBpdGVyYXRlZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIGZvckluUmlnaHQ8VD4oCisgICAgICAgICAgICBvYmplY3Q6IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JJblJpZ2h0CisgICAgICAgICAqLworICAgICAgICBmb3JJblJpZ2h0PFQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBvYmplY3Q6IFQsCisgICAgICAgICAgICBpdGVyYXRlZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgYW55PgorICAgICAgICApOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvckluUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvckluUmlnaHQ8VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZSwgYW55PgorICAgICAgICApOiBfLkxvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JJblJpZ2h0CisgICAgICAgICAqLworICAgICAgICBmb3JJblJpZ2h0PFRWYWx1ZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxUVmFsdWUsIGFueT4KKyAgICAgICAgKTogXy5Mb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLmZvck93bgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBpbnZva2luZyBpdGVyYXRlZSBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzCisgICAgICAgICAqIGJvdW5kIHRvIHRoaXNBcmcgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQKKyAgICAgICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHRoaXNBcmcgVGhlIHRoaXMgYmluZGluZyBvZiBpdGVyYXRlZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIGZvck93bjxUPigKKyAgICAgICAgICAgIG9iamVjdDogRGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFQsIGFueT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvck93bgorICAgICAgICAgKi8KKyAgICAgICAgZm9yT3duPFQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBvYmplY3Q6IFQsCisgICAgICAgICAgICBpdGVyYXRlZT86IE9iamVjdEl0ZXJhdG9yPGFueSwgYW55PgorICAgICAgICApOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZvck93bgorICAgICAgICAgKi8KKyAgICAgICAgZm9yT3duPFRWYWx1ZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxUVmFsdWUsIGFueT4KKyAgICAgICAgKTogXy5Mb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yT3duCisgICAgICAgICAqLworICAgICAgICBmb3JPd248VFZhbHVlPigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogRGljdGlvbmFyeUl0ZXJhdG9yPFRWYWx1ZSwgYW55PgorICAgICAgICApOiBfLkxvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18uZm9yT3duUmlnaHQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5mb3JPd24gZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mIG9iamVjdCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgICAqIEBwYXJhbSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdGhpc0FyZyBUaGUgdGhpcyBiaW5kaW5nIG9mIGl0ZXJhdGVlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgZm9yT3duUmlnaHQ8VD4oCisgICAgICAgICAgICBvYmplY3Q6IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBhbnk+CisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mb3JPd25SaWdodAorICAgICAgICAgKi8KKyAgICAgICAgZm9yT3duUmlnaHQ8VCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIG9iamVjdDogVCwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogT2JqZWN0SXRlcmF0b3I8YW55LCBhbnk+CisgICAgICAgICk6IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yT3duUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvck93blJpZ2h0PFRWYWx1ZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxUVmFsdWUsIGFueT4KKyAgICAgICAgKTogXy5Mb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZm9yT3duUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZvck93blJpZ2h0PFRWYWx1ZT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxUVmFsdWUsIGFueT4KKyAgICAgICAgKTogXy5Mb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLmZ1bmN0aW9ucworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMKKyAgICAgICAgICogb2YgYG9iamVjdGAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAorICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKKyAgICAgICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7CisgICAgICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpOworICAgICAgICAgKiB9CisgICAgICAgICAqCisgICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7CisgICAgICAgICAqIC8vID0+IFsnYScsICdiJ10KKyAgICAgICAgICovCisgICAgICAgIGZ1bmN0aW9uczxUIGV4dGVuZHMge30+KG9iamVjdDogYW55KTogc3RyaW5nW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZnVuY3Rpb25zCisgICAgICAgICAqLworICAgICAgICBmdW5jdGlvbnMoKTogXy5Mb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmZ1bmN0aW9ucworICAgICAgICAgKi8KKyAgICAgICAgZnVuY3Rpb25zKCk6IF8uTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18uZnVuY3Rpb25zSW4KKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gYW5kIGluaGVyaXRlZAorICAgICAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAorICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KKyAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKKyAgICAgICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7CisgICAgICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpOworICAgICAgICAgKiB9CisgICAgICAgICAqCisgICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTsKKyAgICAgICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddCisgICAgICAgICAqLworICAgICAgICBmdW5jdGlvbnNJbjxUIGV4dGVuZHMge30+KG9iamVjdDogYW55KTogc3RyaW5nW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZnVuY3Rpb25zSW4KKyAgICAgICAgICovCisgICAgICAgIGZ1bmN0aW9uc0luKCk6IF8uTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJbgorICAgICAgICAgKi8KKyAgICAgICAgZnVuY3Rpb25zSW4oKTogXy5Mb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy5nZXQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHByb3BlcnR5IHZhbHVlIGF0IHBhdGggb2Ygb2JqZWN0LiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgdW5kZWZpbmVkIHRoZSBkZWZhdWx0VmFsdWUgaXMgdXNlZAorICAgICAgICAgKiBpbiBpdHMgcGxhY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KKyAgICAgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KKyAgICAgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgcmV0dXJuZWQgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGdldDxUT2JqZWN0LCBUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgZGVmYXVsdFZhbHVlPzogVFJlc3VsdAorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ2V0CisgICAgICAgICAqLworICAgICAgICBnZXQ8VFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IGFueSwKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgZGVmYXVsdFZhbHVlPzogVFJlc3VsdAorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdldAorICAgICAgICAgKi8KKyAgICAgICAgZ2V0PFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICBkZWZhdWx0VmFsdWU/OiBUUmVzdWx0CisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5nZXQKKyAgICAgICAgICovCisgICAgICAgIGdldDxUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgZGVmYXVsdFZhbHVlPzogVFJlc3VsdAorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmdldAorICAgICAgICAgKi8KKyAgICAgICAgZ2V0PFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICBkZWZhdWx0VmFsdWU/OiBUUmVzdWx0CisgICAgICAgICk6IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZ2V0CisgICAgICAgICAqLworICAgICAgICBnZXQ8VFJlc3VsdFdyYXBwZXI+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICBkZWZhdWx0VmFsdWU/OiBhbnkKKyAgICAgICAgKTogVFJlc3VsdFdyYXBwZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5nZXQKKyAgICAgICAgICovCisgICAgICAgIGdldDxUUmVzdWx0V3JhcHBlcj4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT86IGFueQorICAgICAgICApOiBUUmVzdWx0V3JhcHBlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5nZXQKKyAgICAgICAgICovCisgICAgICAgIGdldDxUUmVzdWx0V3JhcHBlcj4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT86IGFueQorICAgICAgICApOiBUUmVzdWx0V3JhcHBlcjsKKyAgICB9CisKKyAgICAvL18uaGFzCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKKyAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogeyAnYyc6IDMgfSB9IH07CisgICAgICAgICAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogXy5jcmVhdGUoeyAnYyc6IDMgfSkgfSkgfSk7CisgICAgICAgICAqCisgICAgICAgICAqIF8uaGFzKG9iamVjdCwgJ2EnKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmhhcyhvYmplY3QsICdhLmIuYycpOworICAgICAgICAgKiAvLyA9PiB0cnVlCisgICAgICAgICAqCisgICAgICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InLCAnYyddKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmhhcyhvdGhlciwgJ2EnKTsKKyAgICAgICAgICogLy8gPT4gZmFsc2UKKyAgICAgICAgICovCisgICAgICAgIGhhczxUIGV4dGVuZHMge30+KAorICAgICAgICAgICAgb2JqZWN0OiBULAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10KKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5oYXMKKyAgICAgICAgICovCisgICAgICAgIGhhcyhwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSk6IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaGFzCisgICAgICAgICAqLworICAgICAgICBoYXMocGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10pOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLmhhc0luCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CisgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KKyAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suCisgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IF8uY3JlYXRlKHsgJ2MnOiAzIH0pIH0pIH0pOworICAgICAgICAgKgorICAgICAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTsKKyAgICAgICAgICogLy8gPT4gdHJ1ZQorICAgICAgICAgKgorICAgICAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYi5jJyk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJywgJ2MnXSk7CisgICAgICAgICAqIC8vID0+IHRydWUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7CisgICAgICAgICAqIC8vID0+IGZhbHNlCisgICAgICAgICAqLworICAgICAgICBoYXNJbjxUIGV4dGVuZHMge30+KAorICAgICAgICAgICAgb2JqZWN0OiBULAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10KKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5oYXNJbgorICAgICAgICAgKi8KKyAgICAgICAgaGFzSW4ocGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10pOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmhhc0luCisgICAgICAgICAqLworICAgICAgICBoYXNJbihwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18uaW52ZXJ0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIG9iamVjdC4gSWYgb2JqZWN0IGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsCisgICAgICAgICAqIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMgdW5sZXNzIG11bHRpVmFsdWUgaXMgdHJ1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC4KKyAgICAgICAgICogQHBhcmFtIG11bHRpVmFsdWUgQWxsb3cgbXVsdGlwbGUgdmFsdWVzIHBlciBrZXkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIGludmVydDxUIGV4dGVuZHMge30sIFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBvYmplY3Q6IFQsCisgICAgICAgICAgICBtdWx0aVZhbHVlPzogYm9vbGVhbgorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52ZXJ0CisgICAgICAgICAqLworICAgICAgICBpbnZlcnQ8VFJlc3VsdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIG9iamVjdDogT2JqZWN0LAorICAgICAgICAgICAgbXVsdGlWYWx1ZT86IGJvb2xlYW4KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZlcnQKKyAgICAgICAgICovCisgICAgICAgIGludmVydDxUUmVzdWx0IGV4dGVuZHMge30+KG11bHRpVmFsdWU/OiBib29sZWFuKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludmVydAorICAgICAgICAgKi8KKyAgICAgICAgaW52ZXJ0PFRSZXN1bHQgZXh0ZW5kcyB7fT4obXVsdGlWYWx1ZT86IGJvb2xlYW4pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLmludmVyQnkKKyAgICBpbnRlcmZhY2UgSW52ZXJ0QnlJdGVyYXRvcjxUPiB7CisgICAgICAgICh2YWx1ZTogVCk6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5pbnZlcnQgZXhjZXB0IHRoYXQgdGhlIGludmVydGVkIG9iamVjdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2gKKyAgICAgICAgICogZWxlbWVudCBvZiBvYmplY3QgdGhyb3VnaCBpdGVyYXRlZS4gVGhlIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2YKKyAgICAgICAgICoga2V5cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgaW52ZXJ0ZWQgdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LgorICAgICAgICAgKiBAcGFyYW0gaW50ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBpbnZlcnRCeSgKKyAgICAgICAgICAgIG9iamVjdDogT2JqZWN0LAorICAgICAgICAgICAgaW50ZXJhdGVlPzogSW52ZXJ0QnlJdGVyYXRvcjxhbnk+fHN0cmluZworICAgICAgICApOiBEaWN0aW9uYXJ5PHN0cmluZ1tdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludmVydEJ5CisgICAgICAgICAqLworICAgICAgICBpbnZlcnRCeTxUPigKKyAgICAgICAgICAgIG9iamVjdDogXy5EaWN0aW9uYXJ5PFQ+fF8uTnVtZXJpY0RpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpbnRlcmF0ZWU/OiBJbnZlcnRCeUl0ZXJhdG9yPFQ+fHN0cmluZworICAgICAgICApOiBEaWN0aW9uYXJ5PHN0cmluZ1tdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludmVydEJ5CisgICAgICAgICAqLworICAgICAgICBpbnZlcnRCeTxXPigKKyAgICAgICAgICAgIG9iamVjdDogT2JqZWN0LAorICAgICAgICAgICAgaW50ZXJhdGVlPzogVworICAgICAgICApOiBEaWN0aW9uYXJ5PHN0cmluZ1tdPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludmVydEJ5CisgICAgICAgICAqLworICAgICAgICBpbnZlcnRCeTxULCBXPigKKyAgICAgICAgICAgIG9iamVjdDogXy5EaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaW50ZXJhdGVlPzogVworICAgICAgICApOiBEaWN0aW9uYXJ5PHN0cmluZ1tdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZlcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgaW52ZXJ0QnkoCisgICAgICAgICAgICBpbnRlcmF0ZWU/OiBJbnZlcnRCeUl0ZXJhdG9yPGFueT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8c3RyaW5nW10+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludmVydEJ5CisgICAgICAgICAqLworICAgICAgICBpbnZlcnRCeSgKKyAgICAgICAgICAgIGludGVyYXRlZT86IEludmVydEJ5SXRlcmF0b3I8VD58c3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PHN0cmluZ1tdPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZlcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgaW52ZXJ0Qnk8Vz4oCisgICAgICAgICAgICBpbnRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PHN0cmluZ1tdPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52ZXJ0QnkKKyAgICAgICAgICovCisgICAgICAgIGludmVydEJ5KAorICAgICAgICAgICAgaW50ZXJhdGVlPzogSW52ZXJ0QnlJdGVyYXRvcjxhbnk+fHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxzdHJpbmdbXT4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52ZXJ0QnkKKyAgICAgICAgICovCisgICAgICAgIGludmVydEJ5PFc+KAorICAgICAgICAgICAgaW50ZXJhdGVlPzogVworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxzdHJpbmdbXT4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludmVydEJ5CisgICAgICAgICAqLworICAgICAgICBpbnZlcnRCeSgKKyAgICAgICAgICAgIGludGVyYXRlZT86IEludmVydEJ5SXRlcmF0b3I8YW55PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxzdHJpbmdbXT4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaW52ZXJ0QnkKKyAgICAgICAgICovCisgICAgICAgIGludmVydEJ5KAorICAgICAgICAgICAgaW50ZXJhdGVlPzogSW52ZXJ0QnlJdGVyYXRvcjxUPnxzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8c3RyaW5nW10+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmludmVydEJ5CisgICAgICAgICAqLworICAgICAgICBpbnZlcnRCeTxXPigKKyAgICAgICAgICAgIGludGVyYXRlZT86IFcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8c3RyaW5nW10+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZlcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgaW52ZXJ0QnkoCisgICAgICAgICAgICBpbnRlcmF0ZWU/OiBJbnZlcnRCeUl0ZXJhdG9yPGFueT58c3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PHN0cmluZ1tdPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pbnZlcnRCeQorICAgICAgICAgKi8KKyAgICAgICAgaW52ZXJ0Qnk8Vz4oCisgICAgICAgICAgICBpbnRlcmF0ZWU/OiBXCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PHN0cmluZ1tdPj47CisgICAgfQorCisgICAgLy9fLmtleXMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZSBFUyBzcGVjIGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgICAgICovCisgICAgICAgIGtleXMob2JqZWN0PzogYW55KTogc3RyaW5nW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5cworICAgICAgICAgKi8KKyAgICAgICAga2V5cygpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleXMKKyAgICAgICAgICovCisgICAgICAgIGtleXMoKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18ua2V5c0luCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgorICAgICAgICAgKi8KKyAgICAgICAga2V5c0luKG9iamVjdD86IGFueSk6IHN0cmluZ1tdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtleXNJbgorICAgICAgICAgKi8KKyAgICAgICAga2V5c0luKCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2V5c0luCisgICAgICAgICAqLworICAgICAgICBrZXlzSW4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18ubWFwS2V5cworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9wcG9zaXRlIG9mIF8ubWFwVmFsdWVzOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyBvYmplY3QgYW5kIGtleXMgZ2VuZXJhdGVkCisgICAgICAgICAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBvZiBvYmplY3QgdGhyb3VnaCBpdGVyYXRlZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgaXRlcmF0ZWUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBtYXBLZXlzPFQsIFRLZXk+KAorICAgICAgICAgICAgb2JqZWN0OiBMaXN0PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgVEtleT4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcEtleXMKKyAgICAgICAgICovCisgICAgICAgIG1hcEtleXM8VCwgVEtleT4oCisgICAgICAgICAgICBvYmplY3Q6IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IERpY3Rpb25hcnlJdGVyYXRvcjxULCBUS2V5PgorICAgICAgICApOiBEaWN0aW9uYXJ5PFQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwS2V5cworICAgICAgICAgKi8KKyAgICAgICAgbWFwS2V5czxULCBUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgb2JqZWN0OiBMaXN0PFQ+fERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IFRPYmplY3QKKyAgICAgICAgKTogRGljdGlvbmFyeTxUPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcEtleXMKKyAgICAgICAgICovCisgICAgICAgIG1hcEtleXM8VD4oCisgICAgICAgICAgICBvYmplY3Q6IExpc3Q8VD58RGljdGlvbmFyeTxUPiwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IERpY3Rpb25hcnk8VD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBLZXlzCisgICAgICAgICAqLworICAgICAgICBtYXBLZXlzPFRLZXk+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VCwgVEtleT4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwS2V5cworICAgICAgICAgKi8KKyAgICAgICAgbWFwS2V5czxUT2JqZWN0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBUT2JqZWN0CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcEtleXMKKyAgICAgICAgICovCisgICAgICAgIG1hcEtleXMoCisgICAgICAgICAgICBpdGVyYXRlZT86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUPj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwS2V5cworICAgICAgICAgKi8KKyAgICAgICAgbWFwS2V5czxUUmVzdWx0LCBUS2V5PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTGlzdEl0ZXJhdG9yPFRSZXN1bHQsIFRLZXk+fERpY3Rpb25hcnlJdGVyYXRvcjxUUmVzdWx0LCBUS2V5PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUUmVzdWx0Pj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBLZXlzCisgICAgICAgICAqLworICAgICAgICBtYXBLZXlzPFRSZXN1bHQsIFRPYmplY3QgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFRPYmplY3QKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFJlc3VsdD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwS2V5cworICAgICAgICAgKi8KKyAgICAgICAgbWFwS2V5czxUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRSZXN1bHQ+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcEtleXMKKyAgICAgICAgICovCisgICAgICAgIG1hcEtleXM8VEtleT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IExpc3RJdGVyYXRvcjxULCBUS2V5PgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUPj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBLZXlzCisgICAgICAgICAqLworICAgICAgICBtYXBLZXlzPFRPYmplY3QgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBpdGVyYXRlZT86IFRPYmplY3QKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VD4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWFwS2V5cworICAgICAgICAgKi8KKyAgICAgICAgbWFwS2V5cygKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogc3RyaW5nCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFQ+PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBLZXlzCisgICAgICAgICAqLworICAgICAgICBtYXBLZXlzPFRSZXN1bHQsIFRLZXk+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBMaXN0SXRlcmF0b3I8VFJlc3VsdCwgVEtleT58RGljdGlvbmFyeUl0ZXJhdG9yPFRSZXN1bHQsIFRLZXk+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRSZXN1bHQ+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcEtleXMKKyAgICAgICAgICovCisgICAgICAgIG1hcEtleXM8VFJlc3VsdCwgVE9iamVjdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogVE9iamVjdAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUUmVzdWx0Pj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBLZXlzCisgICAgICAgICAqLworICAgICAgICBtYXBLZXlzPFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFJlc3VsdD4+OworICAgIH0KKworICAgIC8vXy5tYXBWYWx1ZXMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBvYmplY3QgYW5kIHZhbHVlcyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93bgorICAgICAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnR5IG9mIG9iamVjdCB0aHJvdWdoIGl0ZXJhdGVlLiBUaGUgaXRlcmF0ZWUgZnVuY3Rpb24gaXMgYm91bmQgdG8gdGhpc0FyZworICAgICAgICAgKiBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBpdGVyYXRlZSB0aGUgY3JlYXRlZCAiXy5wcm9wZXJ0eSIgc3R5bGUgY2FsbGJhY2sgcmV0dXJucworICAgICAgICAgKiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgdGhpc0FyZyB0aGUgY3JldGVkICJfLm1hdGNoZXNQcm9wZXJ0eSIgc3R5bGUgY2FsbGJhY2sgcmV0dXJucworICAgICAgICAgKiB0cnVlIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZSwgZWxzZSBmYWxzZTsuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgaXRlcmF0ZWUgdGhlIGNyZWF0ZWQgIl8ubWF0Y2hlcyIgc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlCisgICAgICAgICAqIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuCisgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBtYXBWYWx1ZXM8VCwgVFJlc3VsdD4ob2JqOiBEaWN0aW9uYXJ5PFQ+LCBjYWxsYmFjazogT2JqZWN0SXRlcmF0b3I8VCwgVFJlc3VsdD4pOiBEaWN0aW9uYXJ5PFRSZXN1bHQ+OworICAgICAgICBtYXBWYWx1ZXM8VD4ob2JqOiBEaWN0aW9uYXJ5PFQ+LCB3aGVyZTogRGljdGlvbmFyeTxUPik6IERpY3Rpb25hcnk8Ym9vbGVhbj47CisgICAgICAgIG1hcFZhbHVlczxULCBUTWFwcGVkPihvYmo6IFQsIHBsdWNrOiBzdHJpbmcpOiBUTWFwcGVkOworICAgICAgICBtYXBWYWx1ZXM8VD4ob2JqOiBULCBjYWxsYmFjazogT2JqZWN0SXRlcmF0b3I8YW55LCBhbnk+KTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBWYWx1ZXMKKyAgICAgICAgICogVFZhbHVlIGlzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgVC4KKyAgICAgICAgICogVFJlc3VsdCBpcyB0aGUgdHlwZSBvdXRwdXQgYnkgdGhlIE9iamVjdEl0ZXJhdG9yIGZ1bmN0aW9uCisgICAgICAgICAqLworICAgICAgICBtYXBWYWx1ZXM8VFZhbHVlLCBUUmVzdWx0PihjYWxsYmFjazogT2JqZWN0SXRlcmF0b3I8VFZhbHVlLCBUUmVzdWx0Pik6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRSZXN1bHQ+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcFZhbHVlcworICAgICAgICAgKiBUUmVzdWx0IGlzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkgcGx1Y2suCisgICAgICAgICAqIFQgc2hvdWxkIGJlIGEgRGljdGlvbmFyeTxEaWN0aW9uYXJ5PFRSZXN1bHQ+PgorICAgICAgICAgKi8KKyAgICAgICAgbWFwVmFsdWVzPFRSZXN1bHQ+KHBsdWNrOiBzdHJpbmcpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUUmVzdWx0Pj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBWYWx1ZXMKKyAgICAgICAgICogVFJlc3VsdCBpcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBpbiB0aGUgdmFsdWVzIG9mIFQKKyAgICAgICAgICogVCBzaG91bGQgYmUgYSBEaWN0aW9uYXJ5PERpY3Rpb25hcnk8VFJlc3VsdD4+CisgICAgICAgICAqLworICAgICAgICBtYXBWYWx1ZXM8VFJlc3VsdD4od2hlcmU6IERpY3Rpb25hcnk8VFJlc3VsdD4pOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBWYWx1ZXMKKyAgICAgICAgICogVFZhbHVlIGlzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgVC4KKyAgICAgICAgICogVFJlc3VsdCBpcyB0aGUgdHlwZSBvdXRwdXQgYnkgdGhlIE9iamVjdEl0ZXJhdG9yIGZ1bmN0aW9uCisgICAgICAgICAqLworICAgICAgICBtYXBWYWx1ZXM8VFZhbHVlLCBUUmVzdWx0PihjYWxsYmFjazogT2JqZWN0SXRlcmF0b3I8VFZhbHVlLCBUUmVzdWx0Pik6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxEaWN0aW9uYXJ5PFRSZXN1bHQ+PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hcFZhbHVlcworICAgICAgICAgKiBUUmVzdWx0IGlzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgYnkgcGx1Y2suCisgICAgICAgICAqIFQgc2hvdWxkIGJlIGEgRGljdGlvbmFyeTxEaWN0aW9uYXJ5PFRSZXN1bHQ+PgorICAgICAgICAgKi8KKyAgICAgICAgbWFwVmFsdWVzPFRSZXN1bHQ+KHBsdWNrOiBzdHJpbmcpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUUmVzdWx0Pj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXBWYWx1ZXMKKyAgICAgICAgICogVFJlc3VsdCBpcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBpbiB0aGUgdmFsdWVzIG9mIFQKKyAgICAgICAgICogVCBzaG91bGQgYmUgYSBEaWN0aW9uYXJ5PERpY3Rpb25hcnk8VFJlc3VsdD4+CisgICAgICAgICAqLworICAgICAgICBtYXBWYWx1ZXM8VFJlc3VsdD4od2hlcmU6IERpY3Rpb25hcnk8VFJlc3VsdD4pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLm1lcmdlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHNvdXJjZQorICAgICAgICAgKiBvYmplY3RzIGludG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCwgc2tpcHBpbmcgc291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlCisgICAgICAgICAqIHRvIGB1bmRlZmluZWRgLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXMgYXJlIG1lcmdlZCByZWN1cnNpdmVseS4KKyAgICAgICAgICogT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnkgYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMKKyAgICAgICAgICogYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5CisgICAgICAgICAqIGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuCisgICAgICAgICAqCisgICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKKyAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy4KKyAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIHVzZXJzID0geworICAgICAgICAgKiAgICdkYXRhJzogW3sgJ3VzZXInOiAnYmFybmV5JyB9LCB7ICd1c2VyJzogJ2ZyZWQnIH1dCisgICAgICAgICAqIH07CisgICAgICAgICAqCisgICAgICAgICAqIHZhciBhZ2VzID0geworICAgICAgICAgKiAgICdkYXRhJzogW3sgJ2FnZSc6IDM2IH0sIHsgJ2FnZSc6IDQwIH1dCisgICAgICAgICAqIH07CisgICAgICAgICAqCisgICAgICAgICAqIF8ubWVyZ2UodXNlcnMsIGFnZXMpOworICAgICAgICAgKiAvLyA9PiB7ICdkYXRhJzogW3sgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sIHsgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XSB9CisgICAgICAgICAqLworICAgICAgICBtZXJnZTxUT2JqZWN0LCBUU291cmNlPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTogVFNvdXJjZQorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlCisgICAgICAgICAqLworICAgICAgICBtZXJnZTxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTI+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlCisgICAgICAgICAqLworICAgICAgICBtZXJnZTxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMworICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2UKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTMsIFRTb3VyY2U0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIHNvdXJjZTQ6IFRTb3VyY2U0CisgICAgICAgICk6IFRPYmplY3QgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTMgJiBUU291cmNlNDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlCisgICAgICAgICAqLworICAgICAgICBtZXJnZTxUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogYW55LAorICAgICAgICAgICAgLi4ub3RoZXJBcmdzOiBhbnlbXQorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlCisgICAgICAgICAqLworICAgICAgICBtZXJnZTxUU291cmNlPigKKyAgICAgICAgICAgIHNvdXJjZTogVFNvdXJjZQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2U+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2UKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlPFRTb3VyY2UxLCBUU291cmNlMj4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXJnZQorICAgICAgICAgKi8KKyAgICAgICAgbWVyZ2U8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMz4oCisgICAgICAgICAgICBzb3VyY2UxOiBUU291cmNlMSwKKyAgICAgICAgICAgIHNvdXJjZTI6IFRTb3VyY2UyLAorICAgICAgICAgICAgc291cmNlMzogVFNvdXJjZTMKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2UKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlPFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTMsIFRTb3VyY2U0PigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIHNvdXJjZTQ6IFRTb3VyY2U0CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzICYgVFNvdXJjZTQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2UKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlPFRSZXN1bHQ+KAorICAgICAgICAgICAgLi4ub3RoZXJBcmdzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2UKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlPFRTb3VyY2U+KAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZT47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXJnZQorICAgICAgICAgKi8KKyAgICAgICAgbWVyZ2U8VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlCisgICAgICAgICAqLworICAgICAgICBtZXJnZTxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMz47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXJnZQorICAgICAgICAgKi8KKyAgICAgICAgbWVyZ2U8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMyAmIFRTb3VyY2U0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlCisgICAgICAgICAqLworICAgICAgICBtZXJnZTxUUmVzdWx0PigKKyAgICAgICAgICAgIC4uLm90aGVyQXJnczogYW55W10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5tZXJnZVdpdGgKKyAgICBpbnRlcmZhY2UgTWVyZ2VXaXRoQ3VzdG9taXplciB7CisgICAgICAgICh2YWx1ZTogYW55LCBzcmNWYWx1ZTogYW55LCBrZXk/OiBzdHJpbmcsIG9iamVjdD86IE9iamVjdCwgc291cmNlPzogT2JqZWN0KTogYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2gKKyAgICAgICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlCisgICAgICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGUKKyAgICAgICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNldmVuIGFyZ3VtZW50czoKKyAgICAgICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKKyAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuCisgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7CisgICAgICAgICAqICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkpIHsKKyAgICAgICAgICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpOworICAgICAgICAgKiAgIH0KKyAgICAgICAgICogfQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb2JqZWN0ID0geworICAgICAgICAgKiAgICdmcnVpdHMnOiBbJ2FwcGxlJ10sCisgICAgICAgICAqICAgJ3ZlZ2V0YWJsZXMnOiBbJ2JlZXQnXQorICAgICAgICAgKiB9OworICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb3RoZXIgPSB7CisgICAgICAgICAqICAgJ2ZydWl0cyc6IFsnYmFuYW5hJ10sCisgICAgICAgICAqICAgJ3ZlZ2V0YWJsZXMnOiBbJ2NhcnJvdCddCisgICAgICAgICAqIH07CisgICAgICAgICAqCisgICAgICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7CisgICAgICAgICAqIC8vID0+IHsgJ2ZydWl0cyc6IFsnYXBwbGUnLCAnYmFuYW5hJ10sICd2ZWdldGFibGVzJzogWydiZWV0JywgJ2NhcnJvdCddIH0KKyAgICAgICAgICovCisgICAgICAgIG1lcmdlV2l0aDxUT2JqZWN0LCBUU291cmNlPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTogVFNvdXJjZSwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IE1lcmdlV2l0aEN1c3RvbWl6ZXIKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXJnZVdpdGgKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlV2l0aDxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTI+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IE1lcmdlV2l0aEN1c3RvbWl6ZXIKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXJnZVdpdGgKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlV2l0aDxUT2JqZWN0LCBUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IE1lcmdlV2l0aEN1c3RvbWl6ZXIKKyAgICAgICAgKTogVE9iamVjdCAmIFRTb3VyY2UxICYgVFNvdXJjZTIgJiBUU291cmNlMzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgbWVyZ2VXaXRoPFRPYmplY3QsIFRTb3VyY2UxLCBUU291cmNlMiwgVFNvdXJjZTMsIFRTb3VyY2U0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIHNvdXJjZTQ6IFRTb3VyY2U0LAorICAgICAgICAgICAgY3VzdG9taXplcjogTWVyZ2VXaXRoQ3VzdG9taXplcgorICAgICAgICApOiBUT2JqZWN0ICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzICYgVFNvdXJjZTQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXJnZVdpdGgKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlV2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogYW55LAorICAgICAgICAgICAgLi4ub3RoZXJBcmdzOiBhbnlbXQorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1lcmdlV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgbWVyZ2VXaXRoPFRTb3VyY2U+KAorICAgICAgICAgICAgc291cmNlOiBUU291cmNlLAorICAgICAgICAgICAgY3VzdG9taXplcjogTWVyZ2VXaXRoQ3VzdG9taXplcgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VCAmIFRTb3VyY2U+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2VXaXRoCisgICAgICAgICAqLworICAgICAgICBtZXJnZVdpdGg8VFNvdXJjZTEsIFRTb3VyY2UyPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBjdXN0b21pemVyOiBNZXJnZVdpdGhDdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXJnZVdpdGgKKyAgICAgICAgICovCisgICAgICAgIG1lcmdlV2l0aDxUU291cmNlMSwgVFNvdXJjZTIsIFRTb3VyY2UzPigKKyAgICAgICAgICAgIHNvdXJjZTE6IFRTb3VyY2UxLAorICAgICAgICAgICAgc291cmNlMjogVFNvdXJjZTIsCisgICAgICAgICAgICBzb3VyY2UzOiBUU291cmNlMywKKyAgICAgICAgICAgIGN1c3RvbWl6ZXI6IE1lcmdlV2l0aEN1c3RvbWl6ZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQgJiBUU291cmNlMSAmIFRTb3VyY2UyICYgVFNvdXJjZTM+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2VXaXRoCisgICAgICAgICAqLworICAgICAgICBtZXJnZVdpdGg8VFNvdXJjZTEsIFRTb3VyY2UyLCBUU291cmNlMywgVFNvdXJjZTQ+KAorICAgICAgICAgICAgc291cmNlMTogVFNvdXJjZTEsCisgICAgICAgICAgICBzb3VyY2UyOiBUU291cmNlMiwKKyAgICAgICAgICAgIHNvdXJjZTM6IFRTb3VyY2UzLAorICAgICAgICAgICAgc291cmNlNDogVFNvdXJjZTQsCisgICAgICAgICAgICBjdXN0b21pemVyOiBNZXJnZVdpdGhDdXN0b21pemVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUICYgVFNvdXJjZTEgJiBUU291cmNlMiAmIFRTb3VyY2UzICYgVFNvdXJjZTQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWVyZ2VXaXRoCisgICAgICAgICAqLworICAgICAgICBtZXJnZVdpdGg8VFJlc3VsdD4oCisgICAgICAgICAgICAuLi5vdGhlckFyZ3M6IGFueVtdCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ub21pdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUKKyAgICAgICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKKyAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3Byb3BzXSBUaGUgcHJvcGVydHkgbmFtZXMgdG8gb21pdCwgc3BlY2lmaWVkCisgICAgICAgICAqICBpbmRpdmlkdWFsbHkgb3IgaW4gYXJyYXlzLi4KKyAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07CisgICAgICAgICAqCisgICAgICAgICAqIF8ub21pdChvYmplY3QsIFsnYScsICdjJ10pOworICAgICAgICAgKiAvLyA9PiB7ICdiJzogJzInIH0KKyAgICAgICAgICovCisKKyAgICAgICAgb21pdDxUUmVzdWx0IGV4dGVuZHMge30sIFQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBvYmplY3Q6IFQsCisgICAgICAgICAgICAuLi5wcmVkaWNhdGU6IChTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSlbXQorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub21pdAorICAgICAgICAgKi8KKyAgICAgICAgb21pdDxUUmVzdWx0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgLi4ucHJlZGljYXRlOiAoU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10pW10KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub21pdAorICAgICAgICAgKi8KKyAgICAgICAgb21pdDxUUmVzdWx0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgLi4ucHJlZGljYXRlOiAoU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10pW10KKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5vbWl0QnkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUKKyAgICAgICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXQgYHByZWRpY2F0ZWAKKyAgICAgICAgICogZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CisgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuCisgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9OworICAgICAgICAgKgorICAgICAgICAgKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpOworICAgICAgICAgKiAvLyA9PiB7ICdiJzogJzInIH0KKyAgICAgICAgICovCisgICAgICAgIG9taXRCeTxUUmVzdWx0IGV4dGVuZHMge30sIFQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBvYmplY3Q6IFQsCisgICAgICAgICAgICBwcmVkaWNhdGU6IE9iamVjdEl0ZXJhdG9yPGFueSwgYm9vbGVhbj4KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vbWl0QnkKKyAgICAgICAgICovCisgICAgICAgIG9taXRCeTxUUmVzdWx0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgcHJlZGljYXRlOiBPYmplY3RJdGVyYXRvcjxhbnksIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vbWl0QnkKKyAgICAgICAgICovCisgICAgICAgIG9taXRCeTxUUmVzdWx0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgcHJlZGljYXRlOiBPYmplY3RJdGVyYXRvcjxhbnksIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ucGljaworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKKyAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3Byb3BzXSBUaGUgcHJvcGVydHkgbmFtZXMgdG8gcGljaywgc3BlY2lmaWVkCisgICAgICAgICAqICBpbmRpdmlkdWFsbHkgb3IgaW4gYXJyYXlzLgorICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7CisgICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfQorICAgICAgICAgKi8KKyAgICAgICAgcGljazxUUmVzdWx0IGV4dGVuZHMge30sIFQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBvYmplY3Q6IFQsCisgICAgICAgICAgICAuLi5wcmVkaWNhdGU6IChTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSlbXQorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBpY2sKKyAgICAgICAgICovCisgICAgICAgIHBpY2s8VFJlc3VsdCBleHRlbmRzIHt9PigKKyAgICAgICAgICAgIC4uLnByZWRpY2F0ZTogKFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdKVtdCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5waWNrCisgICAgICAgICAqLworICAgICAgICBwaWNrPFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICAuLi5wcmVkaWNhdGU6IChTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSlbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLnBpY2tCeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJucworICAgICAgICAgKiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuCisgICAgICAgICAqCisgICAgICAgICAqIEBzdGF0aWMKKyAgICAgICAgICogQG1lbWJlck9mIF8KKyAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAorICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LgorICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgorICAgICAgICAgKiBAZXhhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5waWNrQnkob2JqZWN0LCBfLmlzTnVtYmVyKTsKKyAgICAgICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9CisgICAgICAgICAqLworICAgICAgICBwaWNrQnk8VFJlc3VsdCBleHRlbmRzIHt9LCBUIGV4dGVuZHMge30+KAorICAgICAgICAgICAgb2JqZWN0OiBULAorICAgICAgICAgICAgcHJlZGljYXRlPzogT2JqZWN0SXRlcmF0b3I8YW55LCBib29sZWFuPgorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBpY2tCeQorICAgICAgICAgKi8KKyAgICAgICAgcGlja0J5PFRSZXN1bHQgZXh0ZW5kcyB7fT4oCisgICAgICAgICAgICBwcmVkaWNhdGU/OiBPYmplY3RJdGVyYXRvcjxhbnksIGJvb2xlYW4+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5waWNrQnkKKyAgICAgICAgICovCisgICAgICAgIHBpY2tCeTxUUmVzdWx0IGV4dGVuZHMge30+KAorICAgICAgICAgICAgcHJlZGljYXRlPzogT2JqZWN0SXRlcmF0b3I8YW55LCBib29sZWFuPgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLnJlc3VsdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBfLmdldCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYSBmdW5jdGlvbiBpdOKAmXMgaW52b2tlZCB3aXRoIHRoZSB0aGlzIGJpbmRpbmcKKyAgICAgICAgICogb2YgaXRzIHBhcmVudCBvYmplY3QgYW5kIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KKyAgICAgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHJlc29sdmUuCisgICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHJldHVybmVkIGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyB1bmRlZmluZWQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICByZXN1bHQ8VE9iamVjdCwgVFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IFRPYmplY3QsCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT86IFRSZXN1bHR8KCguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdCkKKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlc3VsdAorICAgICAgICAgKi8KKyAgICAgICAgcmVzdWx0PFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBhbnksCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT86IFRSZXN1bHR8KCguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdCkKKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXN1bHQKKyAgICAgICAgICovCisgICAgICAgIHJlc3VsdDxUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgZGVmYXVsdFZhbHVlPzogVFJlc3VsdHwoKC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0KQorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVzdWx0CisgICAgICAgICAqLworICAgICAgICByZXN1bHQ8VFJlc3VsdD4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT86IFRSZXN1bHR8KCguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdCkKKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXN1bHQKKyAgICAgICAgICovCisgICAgICAgIHJlc3VsdDxUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgZGVmYXVsdFZhbHVlPzogVFJlc3VsdHwoKC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0KQorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlc3VsdAorICAgICAgICAgKi8KKyAgICAgICAgcmVzdWx0PFRSZXN1bHRXcmFwcGVyPigKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgZGVmYXVsdFZhbHVlPzogYW55CisgICAgICAgICk6IFRSZXN1bHRXcmFwcGVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVzdWx0CisgICAgICAgICAqLworICAgICAgICByZXN1bHQ8VFJlc3VsdFdyYXBwZXI+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICBkZWZhdWx0VmFsdWU/OiBhbnkKKyAgICAgICAgKTogVFJlc3VsdFdyYXBwZXI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVzdWx0CisgICAgICAgICAqLworICAgICAgICByZXN1bHQ8VFJlc3VsdFdyYXBwZXI+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICBkZWZhdWx0VmFsdWU/OiBhbnkKKyAgICAgICAgKTogVFJlc3VsdFdyYXBwZXI7CisgICAgfQorCisgICAgLy9fLnNldAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgYXQgcGF0aCBvZiBvYmplY3QuIElmIGEgcG9ydGlvbiBvZiBwYXRoIGRvZXNu4oCZdCBleGlzdCBpdOKAmXMgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvcgorICAgICAgICAgKiBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0cyBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIF8uc2V0V2l0aCB0bworICAgICAgICAgKiBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS4KKyAgICAgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBzZXQ8VFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IE9iamVjdCwKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgdmFsdWU6IGFueQorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2V0CisgICAgICAgICAqLworICAgICAgICBzZXQ8ViwgVFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IE9iamVjdCwKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgdmFsdWU6IFYKKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNldAorICAgICAgICAgKi8KKyAgICAgICAgc2V0PE8sIFYsIFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBPLAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB2YWx1ZTogVgorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNldAorICAgICAgICAgKi8KKyAgICAgICAgc2V0PFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB2YWx1ZTogYW55CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNldAorICAgICAgICAgKi8KKyAgICAgICAgc2V0PFYsIFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB2YWx1ZTogVgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2V0CisgICAgICAgICAqLworICAgICAgICBzZXQ8VFJlc3VsdD4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIHZhbHVlOiBhbnkKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2V0CisgICAgICAgICAqLworICAgICAgICBzZXQ8ViwgVFJlc3VsdD4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIHZhbHVlOiBWCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uc2V0V2l0aAorICAgIGludGVyZmFjZSBTZXRXaXRoQ3VzdG9taXplcjxUPiB7CisgICAgICAgIChuc1ZhbHVlOiBhbnksIGtleTogc3RyaW5nLCBuc09iamVjdDogVCk6IGFueTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgXy5zZXQgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBjdXN0b21pemVyIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZgorICAgICAgICAgKiBwYXRoLiBJZiBjdXN0b21pemVyIHJldHVybnMgdW5kZWZpbmVkIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBjdXN0b21pemVyIGlzCisgICAgICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS4KKyAgICAgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCisgICAgICAgICAqIEBwYXJlbSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgc2V0V2l0aDxUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogT2JqZWN0LAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB2YWx1ZTogYW55LAorICAgICAgICAgICAgY3VzdG9taXplcj86IFNldFdpdGhDdXN0b21pemVyPE9iamVjdD4KKyAgICAgICAgKTogVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNldFdpdGgKKyAgICAgICAgICovCisgICAgICAgIHNldFdpdGg8ViwgVFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IE9iamVjdCwKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgdmFsdWU6IFYsCisgICAgICAgICAgICBjdXN0b21pemVyPzogU2V0V2l0aEN1c3RvbWl6ZXI8T2JqZWN0PgorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc2V0V2l0aAorICAgICAgICAgKi8KKyAgICAgICAgc2V0V2l0aDxPLCBWLCBUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogTywKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgdmFsdWU6IFYsCisgICAgICAgICAgICBjdXN0b21pemVyPzogU2V0V2l0aEN1c3RvbWl6ZXI8Tz4KKyAgICAgICAgKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zZXRXaXRoCisgICAgICAgICAqLworICAgICAgICBzZXRXaXRoPFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB2YWx1ZTogYW55LAorICAgICAgICAgICAgY3VzdG9taXplcj86IFNldFdpdGhDdXN0b21pemVyPFQ+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNldFdpdGgKKyAgICAgICAgICovCisgICAgICAgIHNldFdpdGg8ViwgVFJlc3VsdD4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIHZhbHVlOiBWLAorICAgICAgICAgICAgY3VzdG9taXplcj86IFNldFdpdGhDdXN0b21pemVyPFQ+CisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zZXRXaXRoCisgICAgICAgICAqLworICAgICAgICBzZXRXaXRoPFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB2YWx1ZTogYW55LAorICAgICAgICAgICAgY3VzdG9taXplcj86IFNldFdpdGhDdXN0b21pemVyPFQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnNldFdpdGgKKyAgICAgICAgICovCisgICAgICAgIHNldFdpdGg8ViwgVFJlc3VsdD4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIHZhbHVlOiBWLAorICAgICAgICAgICAgY3VzdG9taXplcj86IFNldFdpdGhDdXN0b21pemVyPFQ+CisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18udG9QYWlycworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBrZXktdmFsdWUgcGFpcnMgZm9yIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBrZXktdmFsdWUgcGFpcnMuCisgICAgICAgICAqLworICAgICAgICB0b1BhaXJzPFQgZXh0ZW5kcyB7fT4ob2JqZWN0PzogVCk6IGFueVtdW107CisKKyAgICAgICAgdG9QYWlyczxUIGV4dGVuZHMge30sIFRSZXN1bHQ+KG9iamVjdD86IFQpOiBUUmVzdWx0W11bXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b1BhaXJzCisgICAgICAgICAqLworICAgICAgICB0b1BhaXJzPFRSZXN1bHQ+KCk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHRbXT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9QYWlycworICAgICAgICAgKi8KKyAgICAgICAgdG9QYWlyczxUUmVzdWx0PigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0W10+OworICAgIH0KKworICAgIC8vXy50b1BhaXJzSW4KKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBrZXktdmFsdWUgcGFpcnMgZm9yIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBrZXktdmFsdWUgcGFpcnMuCisgICAgICAgICAqLworICAgICAgICB0b1BhaXJzSW48VCBleHRlbmRzIHt9PihvYmplY3Q/OiBUKTogYW55W11bXTsKKworICAgICAgICB0b1BhaXJzSW48VCBleHRlbmRzIHt9LCBUUmVzdWx0PihvYmplY3Q/OiBUKTogVFJlc3VsdFtdW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udG9QYWlyc0luCisgICAgICAgICAqLworICAgICAgICB0b1BhaXJzSW48VFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VFJlc3VsdFtdPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b1BhaXJzSW4KKyAgICAgICAgICovCisgICAgICAgIHRvUGFpcnNJbjxUUmVzdWx0PigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0W10+OworICAgIH0KKworICAgIC8vXy50cmFuc2Zvcm0KKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIF8ucmVkdWNlOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIG9iamVjdCB0byBhIG5ldyBhY2N1bXVsYXRvciBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZgorICAgICAgICAgKiBydW5uaW5nIGVhY2ggb2YgaXRzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgdGhyb3VnaCBpdGVyYXRlZSwgd2l0aCBlYWNoIGludm9jYXRpb24gcG90ZW50aWFsbHkgbXV0YXRpbmcKKyAgICAgICAgICogdGhlIGFjY3VtdWxhdG9yIG9iamVjdC4gVGhlIGl0ZXJhdGVlIGlzIGJvdW5kIHRvIHRoaXNBcmcgYW5kIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLAorICAgICAgICAgKiB2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGZhbHNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgorICAgICAgICAgKiBAcGFyYW0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGFjY3VtdWxhdG9yIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSB0aGlzQXJnIFRoZSB0aGlzIGJpbmRpbmcgb2YgaXRlcmF0ZWUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICB0cmFuc2Zvcm08VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IFRbXSwKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTWVtb1ZvaWRBcnJheUl0ZXJhdG9yPFQsIFRSZXN1bHRbXT4sCisgICAgICAgICAgICBhY2N1bXVsYXRvcj86IFRSZXN1bHRbXQorICAgICAgICApOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50cmFuc2Zvcm0KKyAgICAgICAgICovCisgICAgICAgIHRyYW5zZm9ybTxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogVFtdLAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBNZW1vVm9pZEFycmF5SXRlcmF0b3I8VCwgRGljdGlvbmFyeTxUUmVzdWx0Pj4sCisgICAgICAgICAgICBhY2N1bXVsYXRvcj86IERpY3Rpb25hcnk8VFJlc3VsdD4KKyAgICAgICAgKTogRGljdGlvbmFyeTxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRyYW5zZm9ybQorICAgICAgICAgKi8KKyAgICAgICAgdHJhbnNmb3JtPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBEaWN0aW9uYXJ5PFQ+LAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBNZW1vVm9pZERpY3Rpb25hcnlJdGVyYXRvcjxULCBEaWN0aW9uYXJ5PFRSZXN1bHQ+PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yPzogRGljdGlvbmFyeTxUUmVzdWx0PgorICAgICAgICApOiBEaWN0aW9uYXJ5PFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udHJhbnNmb3JtCisgICAgICAgICAqLworICAgICAgICB0cmFuc2Zvcm08VCwgVFJlc3VsdD4oCisgICAgICAgICAgICBvYmplY3Q6IERpY3Rpb25hcnk8VD4sCisgICAgICAgICAgICBpdGVyYXRlZT86IE1lbW9Wb2lkRGljdGlvbmFyeUl0ZXJhdG9yPFQsIFRSZXN1bHRbXT4sCisgICAgICAgICAgICBhY2N1bXVsYXRvcj86IFRSZXN1bHRbXQorICAgICAgICApOiBUUmVzdWx0W107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50cmFuc2Zvcm0KKyAgICAgICAgICovCisgICAgICAgIHRyYW5zZm9ybTxUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTWVtb1ZvaWRBcnJheUl0ZXJhdG9yPFQsIFRSZXN1bHRbXT4sCisgICAgICAgICAgICBhY2N1bXVsYXRvcj86IFRSZXN1bHRbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRyYW5zZm9ybQorICAgICAgICAgKi8KKyAgICAgICAgdHJhbnNmb3JtPFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBNZW1vVm9pZEFycmF5SXRlcmF0b3I8VCwgRGljdGlvbmFyeTxUUmVzdWx0Pj4sCisgICAgICAgICAgICBhY2N1bXVsYXRvcj86IERpY3Rpb25hcnk8VFJlc3VsdD4KKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPERpY3Rpb25hcnk8VFJlc3VsdD4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRyYW5zZm9ybQorICAgICAgICAgKi8KKyAgICAgICAgdHJhbnNmb3JtPFQsIFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU/OiBNZW1vVm9pZERpY3Rpb25hcnlJdGVyYXRvcjxULCBEaWN0aW9uYXJ5PFRSZXN1bHQ+PiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yPzogRGljdGlvbmFyeTxUUmVzdWx0PgorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8RGljdGlvbmFyeTxUUmVzdWx0Pj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50cmFuc2Zvcm0KKyAgICAgICAgICovCisgICAgICAgIHRyYW5zZm9ybTxULCBUUmVzdWx0PigKKyAgICAgICAgICAgIGl0ZXJhdGVlPzogTWVtb1ZvaWREaWN0aW9uYXJ5SXRlcmF0b3I8VCwgVFJlc3VsdFtdPiwKKyAgICAgICAgICAgIGFjY3VtdWxhdG9yPzogVFJlc3VsdFtdCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy51bnNldAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgcGF0aCBvZiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIG11dGF0ZXMgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgdW5zZXQ8VD4oCisgICAgICAgICAgICBvYmplY3Q6IFQsCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXQorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuc2V0CisgICAgICAgICAqLworICAgICAgICB1bnNldChwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bnNldAorICAgICAgICAgKi8KKyAgICAgICAgdW5zZXQocGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10pOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLnVwZGF0ZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBfLnNldCBleGNlcHQgdGhhdCBhY2NlcHRzIHVwZGF0ZXIgdG8gcHJvZHVjZSB0aGUgdmFsdWUgdG8gc2V0LiBVc2UgXy51cGRhdGVXaXRoIHRvCisgICAgICAgICAqIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLiBUaGUgdXBkYXRlciBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgorICAgICAgICAgKiBAcGFyYW0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHVwZGF0ZTxUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogT2JqZWN0LAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB1cGRhdGVyOiBGdW5jdGlvbgorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udXBkYXRlCisgICAgICAgICAqLworICAgICAgICB1cGRhdGU8VSBleHRlbmRzIEZ1bmN0aW9uLCBUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogT2JqZWN0LAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB1cGRhdGVyOiBVCisgICAgICAgICk6IFRSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51cGRhdGUKKyAgICAgICAgICovCisgICAgICAgIHVwZGF0ZTxPIGV4dGVuZHMge30sIFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBPLAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB1cGRhdGVyOiBGdW5jdGlvbgorICAgICAgICApOiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udXBkYXRlCisgICAgICAgICAqLworICAgICAgICB1cGRhdGU8TywgVSBleHRlbmRzIEZ1bmN0aW9uLCBUUmVzdWx0PigKKyAgICAgICAgICAgIG9iamVjdDogTywKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgdXBkYXRlcjogVQorICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVwZGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgdXBkYXRlPFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB1cGRhdGVyOiBhbnkKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udXBkYXRlCisgICAgICAgICAqLworICAgICAgICB1cGRhdGU8VSBleHRlbmRzIEZ1bmN0aW9uLCBUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdLAorICAgICAgICAgICAgdXBkYXRlcjogVQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udXBkYXRlCisgICAgICAgICAqLworICAgICAgICB1cGRhdGU8VFJlc3VsdD4oCisgICAgICAgICAgICBwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIHVwZGF0ZXI6IGFueQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51cGRhdGUKKyAgICAgICAgICovCisgICAgICAgIHVwZGF0ZTxVIGV4dGVuZHMgRnVuY3Rpb24sIFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICB1cGRhdGVyOiBVCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18udmFsdWVzCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSB2YWx1ZXMgb2Ygb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICB2YWx1ZXM8VD4ob2JqZWN0PzogRGljdGlvbmFyeTxUPik6IFRbXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnZhbHVlcworICAgICAgICAgKi8KKyAgICAgICAgdmFsdWVzPFQ+KG9iamVjdD86IGFueSk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy52YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHZhbHVlczxUPigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy52YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHZhbHVlczxUPigpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICAvL18udmFsdWVzSW4KKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgdmFsdWVzIG9mIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHZhbHVlc0luPFQ+KG9iamVjdD86IERpY3Rpb25hcnk8VD4pOiBUW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy52YWx1ZXNJbgorICAgICAgICAgKi8KKyAgICAgICAgdmFsdWVzSW48VD4ob2JqZWN0PzogYW55KTogVFtdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnZhbHVlc0luCisgICAgICAgICAqLworICAgICAgICB2YWx1ZXNJbjxUPigpOiBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy52YWx1ZXNJbgorICAgICAgICAgKi8KKyAgICAgICAgdmFsdWVzSW48VD4oKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD47CisgICAgfQorCisgICAgLyoqKioqKioqKioKKyAgICAgKiBTdHJpbmcgKgorICAgICAqKioqKioqKioqLworCisgICAgICAgIC8vXy5jYW1lbENhc2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIHN0cmluZyB0byBjYW1lbCBjYXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBjYW1lbENhc2Uoc3RyaW5nPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmNhbWVsQ2FzZQorICAgICAgICAgKi8KKyAgICAgICAgY2FtZWxDYXNlKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jYW1lbENhc2UKKyAgICAgICAgICovCisgICAgICAgIGNhbWVsQ2FzZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18uY2FwaXRhbGl6ZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBzdHJpbmcgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZyB0byBsb3dlciBjYXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBjYXBpdGFsaXplKHN0cmluZz86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jYXBpdGFsaXplCisgICAgICAgICAqLworICAgICAgICBjYXBpdGFsaXplKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jYXBpdGFsaXplCisgICAgICAgICAqLworICAgICAgICBjYXBpdGFsaXplKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy5kZWJ1cnIKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlYnVycnMgc3RyaW5nIGJ5IGNvbnZlcnRpbmcgbGF0aW4tMSBzdXBwbGVtZW50YXJ5IGxldHRlcnMgdG8gYmFzaWMgbGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmcgY29tYmluaW5nCisgICAgICAgICAqIGRpYWNyaXRpY2FsIG1hcmtzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gZGVidXJyLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIGRlYnVycihzdHJpbmc/OiBzdHJpbmcpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGVidXJyCisgICAgICAgICAqLworICAgICAgICBkZWJ1cnIoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmRlYnVycgorICAgICAgICAgKi8KKyAgICAgICAgZGVidXJyKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy5lbmRzV2l0aAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBzZWFyY2guCisgICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLgorICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCBmcm9tLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBzdHJpbmcgZW5kcyB3aXRoIHRhcmdldCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGVuZHNXaXRoKAorICAgICAgICAgICAgc3RyaW5nPzogc3RyaW5nLAorICAgICAgICAgICAgdGFyZ2V0Pzogc3RyaW5nLAorICAgICAgICAgICAgcG9zaXRpb24/OiBudW1iZXIKKyAgICAgICAgKTogYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5lbmRzV2l0aAorICAgICAgICAgKi8KKyAgICAgICAgZW5kc1dpdGgoCisgICAgICAgICAgICB0YXJnZXQ/OiBzdHJpbmcsCisgICAgICAgICAgICBwb3NpdGlvbj86IG51bWJlcgorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmVuZHNXaXRoCisgICAgICAgICAqLworICAgICAgICBlbmRzV2l0aCgKKyAgICAgICAgICAgIHRhcmdldD86IHN0cmluZywKKyAgICAgICAgICAgIHBvc2l0aW9uPzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxib29sZWFuPjsKKyAgICB9CisKKyAgICAvLyBfLmVzY2FwZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgIiYiLCAiPCIsICI+IiwgJyInLCAiJyIsIGFuZCAiYCIgaW4gc3RyaW5nIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogTm8gb3RoZXIgY2hhcmFjdGVycyBhcmUgZXNjYXBlZC4gVG8gZXNjYXBlIGFkZGl0aW9uYWwgY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgaGUuCisgICAgICAgICAqCisgICAgICAgICAqIGhvdWdoIHRoZSAiPiIgY2hhcmFjdGVyIGlzIGVzY2FwZWQgZm9yIHN5bW1ldHJ5LCBjaGFyYWN0ZXJzIGxpa2UgIj4iIGFuZCAiLyIgZG9u4oCZdCBuZWVkIGVzY2FwaW5nIGluIEhUTUwKKyAgICAgICAgICogYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nIHVubGVzcyB0aGV5J3JlIHBhcnQgb2YgYSB0YWcgb3IgdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLiBTZWUgTWF0aGlhcyBCeW5lbnPigJlzCisgICAgICAgICAqIGFydGljbGUgKHVuZGVyICJzZW1pLXJlbGF0ZWQgZnVuIGZhY3QiKSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgICAgKgorICAgICAgICAgKiBCYWNrdGlja3MgYXJlIGVzY2FwZWQgYmVjYXVzZSBpbiBJRSA8IDksIHRoZXkgY2FuIGJyZWFrIG91dCBvZiBhdHRyaWJ1dGUgdmFsdWVzIG9yIEhUTUwgY29tbWVudHMuIFNlZSAjNTksCisgICAgICAgICAqICMxMDIsICMxMDgsIGFuZCAjMTMzIG9mIHRoZSBIVE1MNSBTZWN1cml0eSBDaGVhdHNoZWV0IGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgICAqCisgICAgICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXMgcXVvdGUgYXR0cmlidXRlIHZhbHVlcyB0byByZWR1Y2UgWFNTIHZlY3RvcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBlc2NhcGUoc3RyaW5nPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmVzY2FwZQorICAgICAgICAgKi8KKyAgICAgICAgZXNjYXBlKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5lc2NhcGUKKyAgICAgICAgICovCisgICAgICAgIGVzY2FwZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvLyBfLmVzY2FwZVJlZ0V4cAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogRXNjYXBlcyB0aGUgUmVnRXhwIHNwZWNpYWwgY2hhcmFjdGVycyAiXiIsICIkIiwgIlwiLCAiLiIsICIqIiwgIisiLCAiPyIsICIoIiwgIikiLCAiWyIsICJdIiwKKyAgICAgICAgICogInsiLCAifSIsIGFuZCAifCIgaW4gc3RyaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gZXNjYXBlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgZXNjYXBlUmVnRXhwKHN0cmluZz86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5lc2NhcGVSZWdFeHAKKyAgICAgICAgICovCisgICAgICAgIGVzY2FwZVJlZ0V4cCgpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZXNjYXBlUmVnRXhwCisgICAgICAgICAqLworICAgICAgICBlc2NhcGVSZWdFeHAoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLmtlYmFiQ2FzZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgc3RyaW5nIHRvIGtlYmFiIGNhc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIGtlYmFiQ2FzZShzdHJpbmc/OiBzdHJpbmcpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ua2ViYWJDYXNlCisgICAgICAgICAqLworICAgICAgICBrZWJhYkNhc2UoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmtlYmFiQ2FzZQorICAgICAgICAgKi8KKyAgICAgICAga2ViYWJDYXNlKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy5sb3dlckNhc2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIGxvd2VyIGNhc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIGxvd2VyQ2FzZShzdHJpbmc/OiBzdHJpbmcpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubG93ZXJDYXNlCisgICAgICAgICAqLworICAgICAgICBsb3dlckNhc2UoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmxvd2VyQ2FzZQorICAgICAgICAgKi8KKyAgICAgICAgbG93ZXJDYXNlKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy5sb3dlckZpcnN0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBsb3dlckZpcnN0KHN0cmluZz86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5sb3dlckZpcnN0CisgICAgICAgICAqLworICAgICAgICBsb3dlckZpcnN0KCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5sb3dlckZpcnN0CisgICAgICAgICAqLworICAgICAgICBsb3dlckZpcnN0KCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy5wYWQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhZHMgc3RyaW5nIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBpZiBpdOKAmXMgc2hvcnRlciB0aGFuIGxlbmd0aC4gUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYKKyAgICAgICAgICogdGhleSBjYW7igJl0IGJlIGV2ZW5seSBkaXZpZGVkIGJ5IGxlbmd0aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZC4KKyAgICAgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgcGFkZGluZyBsZW5ndGguCisgICAgICAgICAqIEBwYXJhbSBjaGFycyBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcGFkKAorICAgICAgICAgICAgc3RyaW5nPzogc3RyaW5nLAorICAgICAgICAgICAgbGVuZ3RoPzogbnVtYmVyLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhZAorICAgICAgICAgKi8KKyAgICAgICAgcGFkKAorICAgICAgICAgICAgbGVuZ3RoPzogbnVtYmVyLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhZAorICAgICAgICAgKi8KKyAgICAgICAgcGFkKAorICAgICAgICAgICAgbGVuZ3RoPzogbnVtYmVyLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnBhZEVuZAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUGFkcyBzdHJpbmcgb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXTigJlzIHNob3J0ZXIgdGhhbiBsZW5ndGguIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkCisgICAgICAgICAqIGxlbmd0aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIHBhZC4KKyAgICAgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgcGFkZGluZyBsZW5ndGguCisgICAgICAgICAqIEBwYXJhbSBjaGFycyBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcGFkRW5kKAorICAgICAgICAgICAgc3RyaW5nPzogc3RyaW5nLAorICAgICAgICAgICAgbGVuZ3RoPzogbnVtYmVyLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhZEVuZAorICAgICAgICAgKi8KKyAgICAgICAgcGFkRW5kKAorICAgICAgICAgICAgbGVuZ3RoPzogbnVtYmVyLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhZEVuZAorICAgICAgICAgKi8KKyAgICAgICAgcGFkRW5kKAorICAgICAgICAgICAgbGVuZ3RoPzogbnVtYmVyLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnBhZFN0YXJ0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQYWRzIHN0cmluZyBvbiB0aGUgbGVmdCBzaWRlIGlmIGl04oCZcyBzaG9ydGVyIHRoYW4gbGVuZ3RoLiBQYWRkaW5nIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZAorICAgICAgICAgKiBsZW5ndGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBwYWQuCisgICAgICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLgorICAgICAgICAgKiBAcGFyYW0gY2hhcnMgVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHBhZFN0YXJ0KAorICAgICAgICAgICAgc3RyaW5nPzogc3RyaW5nLAorICAgICAgICAgICAgbGVuZ3RoPzogbnVtYmVyLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhZFN0YXJ0CisgICAgICAgICAqLworICAgICAgICBwYWRTdGFydCgKKyAgICAgICAgICAgIGxlbmd0aD86IG51bWJlciwKKyAgICAgICAgICAgIGNoYXJzPzogc3RyaW5nCisgICAgICAgICk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYWRTdGFydAorICAgICAgICAgKi8KKyAgICAgICAgcGFkU3RhcnQoCisgICAgICAgICAgICBsZW5ndGg/OiBudW1iZXIsCisgICAgICAgICAgICBjaGFycz86IHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18ucGFyc2VJbnQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIHN0cmluZyB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIHJhZGl4IGlzIHVuZGVmaW5lZCBvciAwLCBhIHJhZGl4IG9mIDEwIGlzIHVzZWQKKyAgICAgICAgICogdW5sZXNzIHZhbHVlIGlzIGEgaGV4YWRlY2ltYWwsIGluIHdoaWNoIGNhc2UgYSByYWRpeCBvZiAxNiBpcyB1c2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBhbGlnbnMgd2l0aCB0aGUgRVM1IGltcGxlbWVudGF0aW9uIG9mIHBhcnNlSW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KKyAgICAgICAgICogQHBhcmFtIHJhZGl4IFRoZSByYWRpeCB0byBpbnRlcnByZXQgdmFsdWUgYnkuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuCisgICAgICAgICAqLworICAgICAgICBwYXJzZUludCgKKyAgICAgICAgICAgIHN0cmluZzogc3RyaW5nLAorICAgICAgICAgICAgcmFkaXg/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnBhcnNlSW50CisgICAgICAgICAqLworICAgICAgICBwYXJzZUludChyYWRpeD86IG51bWJlcik6IG51bWJlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wYXJzZUludAorICAgICAgICAgKi8KKyAgICAgICAgcGFyc2VJbnQocmFkaXg/OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18ucmVwZWF0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXBlYXRzIHRoZSBnaXZlbiBzdHJpbmcgbiB0aW1lcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC4KKyAgICAgICAgICogQHBhcmFtIG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICByZXBlYXQoCisgICAgICAgICAgICBzdHJpbmc/OiBzdHJpbmcsCisgICAgICAgICAgICBuPzogbnVtYmVyCisgICAgICAgICk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXBlYXQKKyAgICAgICAgICovCisgICAgICAgIHJlcGVhdChuPzogbnVtYmVyKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlcGVhdAorICAgICAgICAgKi8KKyAgICAgICAgcmVwZWF0KG4/OiBudW1iZXIpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18ucmVwbGFjZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgcGF0dGVybiBpbiBzdHJpbmcgd2l0aCByZXBsYWNlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gU3RyaW5nI3JlcGxhY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcKKyAgICAgICAgICogQHBhcmFtIHBhdHRlcm4KKyAgICAgICAgICogQHBhcmFtIHJlcGxhY2VtZW50CisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcmVwbGFjZSgKKyAgICAgICAgICAgIHN0cmluZzogc3RyaW5nLAorICAgICAgICAgICAgcGF0dGVybjogUmVnRXhwfHN0cmluZywKKyAgICAgICAgICAgIHJlcGxhY2VtZW50OiBGdW5jdGlvbnxzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVwbGFjZQorICAgICAgICAgKi8KKyAgICAgICAgcmVwbGFjZSgKKyAgICAgICAgICAgIHBhdHRlcm4/OiBSZWdFeHB8c3RyaW5nLAorICAgICAgICAgICAgcmVwbGFjZW1lbnQ/OiBGdW5jdGlvbnxzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlcGxhY2UKKyAgICAgICAgICovCisgICAgICAgIHJlcGxhY2UoCisgICAgICAgICAgICBwYXR0ZXJuPzogUmVnRXhwfHN0cmluZywKKyAgICAgICAgICAgIHJlcGxhY2VtZW50PzogRnVuY3Rpb258c3RyaW5nCisgICAgICAgICk6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlcGxhY2UKKyAgICAgICAgICovCisgICAgICAgIHJlcGxhY2UoCisgICAgICAgICAgICByZXBsYWNlbWVudD86IEZ1bmN0aW9ufHN0cmluZworICAgICAgICApOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVwbGFjZQorICAgICAgICAgKi8KKyAgICAgICAgcmVwbGFjZSgKKyAgICAgICAgICAgIHBhdHRlcm4/OiBSZWdFeHB8c3RyaW5nLAorICAgICAgICAgICAgcmVwbGFjZW1lbnQ/OiBGdW5jdGlvbnxzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmVwbGFjZQorICAgICAgICAgKi8KKyAgICAgICAgcmVwbGFjZSgKKyAgICAgICAgICAgIHJlcGxhY2VtZW50PzogRnVuY3Rpb258c3RyaW5nCisgICAgICAgICk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXBsYWNlCisgICAgICAgICAqLworICAgICAgICByZXBsYWNlKAorICAgICAgICAgICAgcGF0dGVybj86IFJlZ0V4cHxzdHJpbmcsCisgICAgICAgICAgICByZXBsYWNlbWVudD86IEZ1bmN0aW9ufHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlcGxhY2UKKyAgICAgICAgICovCisgICAgICAgIHJlcGxhY2UoCisgICAgICAgICAgICByZXBsYWNlbWVudD86IEZ1bmN0aW9ufHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yZXBsYWNlCisgICAgICAgICAqLworICAgICAgICByZXBsYWNlKAorICAgICAgICAgICAgcGF0dGVybj86IFJlZ0V4cHxzdHJpbmcsCisgICAgICAgICAgICByZXBsYWNlbWVudD86IEZ1bmN0aW9ufHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJlcGxhY2UKKyAgICAgICAgICovCisgICAgICAgIHJlcGxhY2UoCisgICAgICAgICAgICByZXBsYWNlbWVudD86IEZ1bmN0aW9ufHN0cmluZworICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18uc25ha2VDYXNlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBzdHJpbmcgdG8gc25ha2UgY2FzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc25ha2VDYXNlKHN0cmluZz86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5zbmFrZUNhc2UKKyAgICAgICAgICovCisgICAgICAgIHNuYWtlQ2FzZSgpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc25ha2VDYXNlCisgICAgICAgICAqLworICAgICAgICBzbmFrZUNhc2UoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnNwbGl0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTcGxpdHMgc3RyaW5nIGJ5IHNlcGFyYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gU3RyaW5nI3NwbGl0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICAgICAqIEBwYXJhbSBzZXBhcmF0b3IKKyAgICAgICAgICogQHBhcmFtIGxpbWl0CisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHN0cmluZyBzZWdtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHNwbGl0KAorICAgICAgICAgICAgc3RyaW5nOiBzdHJpbmcsCisgICAgICAgICAgICBzZXBhcmF0b3I/OiBSZWdFeHB8c3RyaW5nLAorICAgICAgICAgICAgbGltaXQ/OiBudW1iZXIKKyAgICAgICAgKTogc3RyaW5nW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3BsaXQKKyAgICAgICAgICovCisgICAgICAgIHNwbGl0KAorICAgICAgICAgICAgc2VwYXJhdG9yPzogUmVnRXhwfHN0cmluZywKKyAgICAgICAgICAgIGxpbWl0PzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3BsaXQKKyAgICAgICAgICovCisgICAgICAgIHNwbGl0KAorICAgICAgICAgICAgc2VwYXJhdG9yPzogUmVnRXhwfHN0cmluZywKKyAgICAgICAgICAgIGxpbWl0PzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnN0YXJ0Q2FzZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgc3RyaW5nIHRvIHN0YXJ0IGNhc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXJ0Q2FzZShzdHJpbmc/OiBzdHJpbmcpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uc3RhcnRDYXNlCisgICAgICAgICAqLworICAgICAgICBzdGFydENhc2UoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN0YXJ0Q2FzZQorICAgICAgICAgKi8KKyAgICAgICAgc3RhcnRDYXNlKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy5zdGFydHNXaXRoCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci4KKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRhcmdldCwgZWxzZSBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXJ0c1dpdGgoCisgICAgICAgICAgICBzdHJpbmc/OiBzdHJpbmcsCisgICAgICAgICAgICB0YXJnZXQ/OiBzdHJpbmcsCisgICAgICAgICAgICBwb3NpdGlvbj86IG51bWJlcgorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN0YXJ0c1dpdGgKKyAgICAgICAgICovCisgICAgICAgIHN0YXJ0c1dpdGgoCisgICAgICAgICAgICB0YXJnZXQ/OiBzdHJpbmcsCisgICAgICAgICAgICBwb3NpdGlvbj86IG51bWJlcgorICAgICAgICApOiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnN0YXJ0c1dpdGgKKyAgICAgICAgICovCisgICAgICAgIHN0YXJ0c1dpdGgoCisgICAgICAgICAgICB0YXJnZXQ/OiBzdHJpbmcsCisgICAgICAgICAgICBwb3NpdGlvbj86IG51bWJlcgorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8Ym9vbGVhbj47CisgICAgfQorCisgICAgLy9fLnRlbXBsYXRlCisgICAgaW50ZXJmYWNlIFRlbXBsYXRlT3B0aW9ucyBleHRlbmRzIFRlbXBsYXRlU2V0dGluZ3MgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNvdXJjZVVSTCBvZiB0aGUgdGVtcGxhdGUncyBjb21waWxlZCBzb3VyY2UuCisgICAgICAgICAqLworICAgICAgICBzb3VyY2VVUkw/OiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFRlbXBsYXRlRXhlY3V0b3IgeworICAgICAgICAoZGF0YT86IE9iamVjdCk6IHN0cmluZzsKKyAgICAgICAgc291cmNlOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBjYW4gaW50ZXJwb2xhdGUgZGF0YSBwcm9wZXJ0aWVzIGluICJpbnRlcnBvbGF0ZSIgZGVsaW1pdGVycywKKyAgICAgICAgICogSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpbiAiZXNjYXBlIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluICJldmFsdWF0ZSIKKyAgICAgICAgICogZGVsaW1pdGVycy4gRGF0YSBwcm9wZXJ0aWVzIG1heSBiZSBhY2Nlc3NlZCBhcyBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgdGVtcGxhdGUuIElmIGEgc2V0dGluZyBvYmplY3QgaXMKKyAgICAgICAgICogcHJvdmlkZWQgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIF8udGVtcGxhdGVTZXR0aW5ncyB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBfLnRlbXBsYXRlIHV0aWxpemVzCisgICAgICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKSBmb3IgZWFzaWVyCisgICAgICAgICAqIGRlYnVnZ2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWUKKyAgICAgICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWUKKyAgICAgICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgdGVtcGxhdGUgc3RyaW5nLgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zLmVzY2FwZSBUaGUgSFRNTCAiZXNjYXBlIiBkZWxpbWl0ZXIuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zLmV2YWx1YXRlIFRoZSAiZXZhbHVhdGUiIGRlbGltaXRlci4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMuaW1wb3J0cyBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucy5pbnRlcnBvbGF0ZSBUaGUgImludGVycG9sYXRlIiBkZWxpbWl0ZXIuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zLnNvdXJjZVVSTCBUaGUgc291cmNlVVJMIG9mIHRoZSB0ZW1wbGF0ZSdzIGNvbXBpbGVkIHNvdXJjZS4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMudmFyaWFibGUgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZSgKKyAgICAgICAgICAgIHN0cmluZzogc3RyaW5nLAorICAgICAgICAgICAgb3B0aW9ucz86IFRlbXBsYXRlT3B0aW9ucworICAgICAgICApOiBUZW1wbGF0ZUV4ZWN1dG9yOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRlbXBsYXRlCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZShvcHRpb25zPzogVGVtcGxhdGVPcHRpb25zKTogVGVtcGxhdGVFeGVjdXRvcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50ZW1wbGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGUob3B0aW9ucz86IFRlbXBsYXRlT3B0aW9ucyk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUZW1wbGF0ZUV4ZWN1dG9yPjsKKyAgICB9CisKKyAgICAvL18udG9Mb3dlcgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHRvTG93ZXIoc3RyaW5nPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvTG93ZXIKKyAgICAgICAgICovCisgICAgICAgIHRvTG93ZXIoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvTG93ZXIKKyAgICAgICAgICovCisgICAgICAgIHRvTG93ZXIoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnRvVXBwZXIKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byB1cHBlciBjYXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICB0b1VwcGVyKHN0cmluZz86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b1VwcGVyCisgICAgICAgICAqLworICAgICAgICB0b1VwcGVyKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b1VwcGVyCisgICAgICAgICAqLworICAgICAgICB0b1VwcGVyKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy50cmltCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLgorICAgICAgICAgKiBAcGFyYW0gY2hhcnMgVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHRyaW0oCisgICAgICAgICAgICBzdHJpbmc/OiBzdHJpbmcsCisgICAgICAgICAgICBjaGFycz86IHN0cmluZworICAgICAgICApOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udHJpbQorICAgICAgICAgKi8KKyAgICAgICAgdHJpbShjaGFycz86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50cmltCisgICAgICAgICAqLworICAgICAgICB0cmltKGNoYXJzPzogc3RyaW5nKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnRyaW1FbmQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIHN0cmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uCisgICAgICAgICAqIEBwYXJhbSBjaGFycyBUaGUgY2hhcmFjdGVycyB0byB0cmltLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdHJpbUVuZCgKKyAgICAgICAgICAgIHN0cmluZz86IHN0cmluZywKKyAgICAgICAgICAgIGNoYXJzPzogc3RyaW5nCisgICAgICAgICk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50cmltRW5kCisgICAgICAgICAqLworICAgICAgICB0cmltRW5kKGNoYXJzPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRyaW1FbmQKKyAgICAgICAgICovCisgICAgICAgIHRyaW1FbmQoY2hhcnM/OiBzdHJpbmcpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18udHJpbVN0YXJ0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIHN0cmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uCisgICAgICAgICAqIEBwYXJhbSBjaGFycyBUaGUgY2hhcmFjdGVycyB0byB0cmltLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdHJpbVN0YXJ0KAorICAgICAgICAgICAgc3RyaW5nPzogc3RyaW5nLAorICAgICAgICAgICAgY2hhcnM/OiBzdHJpbmcKKyAgICAgICAgKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRyaW1TdGFydAorICAgICAgICAgKi8KKyAgICAgICAgdHJpbVN0YXJ0KGNoYXJzPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRyaW1TdGFydAorICAgICAgICAgKi8KKyAgICAgICAgdHJpbVN0YXJ0KGNoYXJzPzogc3RyaW5nKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPHN0cmluZz47CisgICAgfQorCisgICAgLy9fLnRydW5jYXRlCisgICAgaW50ZXJmYWNlIFRydW5jYXRlT3B0aW9ucyB7CisgICAgICAgIC8qKiBUaGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLiAqLworICAgICAgICBsZW5ndGg/OiBudW1iZXI7CisgICAgICAgIC8qKiBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC4gKi8KKyAgICAgICAgb21pc3Npb24/OiBzdHJpbmc7CisgICAgICAgIC8qKiBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gdHJ1bmNhdGUgdG8uICovCisgICAgICAgIHNlcGFyYXRvcj86IHN0cmluZ3xSZWdFeHA7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnVuY2F0ZXMgc3RyaW5nIGlmIGl04oCZcyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoLiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQKKyAgICAgICAgICogc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvbiBzdHJpbmcgd2hpY2ggZGVmYXVsdHMgdG8gIuKApiIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cnVuY2F0ZS4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2JqZWN0IG9yIG1heGltdW0gc3RyaW5nIGxlbmd0aC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0cnVuY2F0ZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdHJ1bmNhdGUoCisgICAgICAgICAgICBzdHJpbmc/OiBzdHJpbmcsCisgICAgICAgICAgICBvcHRpb25zPzogVHJ1bmNhdGVPcHRpb25zCisgICAgICAgICk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50cnVuY2F0ZQorICAgICAgICAgKi8KKyAgICAgICAgdHJ1bmNhdGUob3B0aW9ucz86IFRydW5jYXRlT3B0aW9ucyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50cnVuY2F0ZQorICAgICAgICAgKi8KKyAgICAgICAgdHJ1bmNhdGUob3B0aW9ucz86IFRydW5jYXRlT3B0aW9ucyk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8vXy51bmVzY2FwZQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGludmVyc2Ugb2YgXy5lc2NhcGU7IHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBIVE1MIGVudGl0aWVzICZhbXA7LCAmbHQ7LCAmZ3Q7LCAmcXVvdDssICYjMzk7LCBhbmQgJiM5NjsKKyAgICAgICAgICogaW4gc3RyaW5nIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeQorICAgICAgICAgKiBsaWtlIGhlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHVuZXNjYXBlKHN0cmluZz86IHN0cmluZyk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51bmVzY2FwZQorICAgICAgICAgKi8KKyAgICAgICAgdW5lc2NhcGUoKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuZXNjYXBlCisgICAgICAgICAqLworICAgICAgICB1bmVzY2FwZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18udXBwZXJDYXNlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICB1cHBlckNhc2Uoc3RyaW5nPzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVwcGVyQ2FzZQorICAgICAgICAgKi8KKyAgICAgICAgdXBwZXJDYXNlKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy51cHBlckNhc2UKKyAgICAgICAgICovCisgICAgICAgIHVwcGVyQ2FzZSgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18udXBwZXJGaXJzdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdXBwZXJGaXJzdChzdHJpbmc/OiBzdHJpbmcpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udXBwZXJGaXJzdAorICAgICAgICAgKi8KKyAgICAgICAgdXBwZXJGaXJzdCgpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udXBwZXJGaXJzdAorICAgICAgICAgKi8KKyAgICAgICAgdXBwZXJGaXJzdCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nPjsKKyAgICB9CisKKyAgICAvL18ud29yZHMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuCisgICAgICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLgorICAgICAgICAgKi8KKyAgICAgICAgd29yZHMoCisgICAgICAgICAgICBzdHJpbmc/OiBzdHJpbmcsCisgICAgICAgICAgICBwYXR0ZXJuPzogc3RyaW5nfFJlZ0V4cAorICAgICAgICApOiBzdHJpbmdbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy53b3JkcworICAgICAgICAgKi8KKyAgICAgICAgd29yZHMocGF0dGVybj86IHN0cmluZ3xSZWdFeHApOiBzdHJpbmdbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy53b3JkcworICAgICAgICAgKi8KKyAgICAgICAgd29yZHMocGF0dGVybj86IHN0cmluZ3xSZWdFeHApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIC8qKioqKioqKioqKgorICAgICAqIFV0aWxpdHkgKgorICAgICAqKioqKioqKioqKi8KKworICAgICAgICAvL18uYXR0ZW1wdAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQXR0ZW1wdHMgdG8gaW52b2tlIGZ1bmMsIHJldHVybmluZyBlaXRoZXIgdGhlIHJlc3VsdCBvciB0aGUgY2F1Z2h0IGVycm9yIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgICAgICAgICAqIGFyZSBwcm92aWRlZCB0byBmdW5jIHdoZW4gaXTigJlzIGludm9rZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhdHRlbXB0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZ1bmMgcmVzdWx0IG9yIGVycm9yIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIGF0dGVtcHQ8VFJlc3VsdD4oZnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0LCAuLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHR8RXJyb3I7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXR0ZW1wdAorICAgICAgICAgKi8KKyAgICAgICAgYXR0ZW1wdDxUUmVzdWx0PiguLi5hcmdzOiBhbnlbXSk6IFRSZXN1bHR8RXJyb3I7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uYXR0ZW1wdAorICAgICAgICAgKi8KKyAgICAgICAgYXR0ZW1wdDxUUmVzdWx0PiguLi5hcmdzOiBhbnlbXSk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0fEVycm9yPjsKKyAgICB9CisKKyAgICAvL18uY29uc3RhbnQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjb25zdGFudDxUPih2YWx1ZTogVCk6ICgpID0+IFQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5jb25zdGFudAorICAgICAgICAgKi8KKyAgICAgICAgY29uc3RhbnQ8VFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPCgpID0+IFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uY29uc3RhbnQKKyAgICAgICAgICovCisgICAgICAgIGNvbnN0YW50PFRSZXN1bHQ+KCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjwoKSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uZGVmYXVsdFRvCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgYHZhbHVlYCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIGluCisgICAgICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCwKKyAgICAgICAgICogb3IgYHVuZGVmaW5lZGAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCisgICAgICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAqIEByZXR1cm5zIFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgZGVmYXVsdFRvPFQ+KHZhbHVlOiBULCBkZWZhdWx0VmFsdWU6IFQpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uZGVmYXVsdFRvCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0VG88VFJlc3VsdD4odmFsdWU6IFRSZXN1bHQpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5kZWZhdWx0VG8KKyAgICAgICAgICovCisgICAgICAgIGRlZmF1bHRUbzxUUmVzdWx0Pih2YWx1ZTogVFJlc3VsdCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18uaWRlbnRpdHkKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IHByb3ZpZGVkIHRvIGl0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgQW55IHZhbHVlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBpZGVudGl0eTxUPih2YWx1ZT86IFQpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlkZW50aXR5CisgICAgICAgICAqLworICAgICAgICBpZGVudGl0eSgpOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaWRlbnRpdHkKKyAgICAgICAgICovCisgICAgICAgIGlkZW50aXR5KCk6IFRbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pZGVudGl0eQorICAgICAgICAgKi8KKyAgICAgICAgaWRlbnRpdHkoKTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pZGVudGl0eQorICAgICAgICAgKi8KKyAgICAgICAgaWRlbnRpdHkoKTogTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaWRlbnRpdHkKKyAgICAgICAgICovCisgICAgICAgIGlkZW50aXR5KCk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLmlkZW50aXR5CisgICAgICAgICAqLworICAgICAgICBpZGVudGl0eSgpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD47CisgICAgfQorCisgICAgLy9fLml0ZXJhdGVlCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQKKyAgICAgICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgcmV0dXJucyB0aGUKKyAgICAgICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIG9iamVjdCB0aGUgY3JlYXRlZAorICAgICAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50IG9iamVjdCBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCisgICAgICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay4KKyAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogdmFyIHVzZXJzID0gWworICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCisgICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfQorICAgICAgICAgKiBdOworICAgICAgICAgKgorICAgICAgICAgKiAvLyBjcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMKKyAgICAgICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihjYWxsYmFjaywgZnVuYykgeworICAgICAgICAgKiAgIHZhciBwID0gL14oXFMrKVxzKihbPD5dKVxzKihcUyspJC8uZXhlYyhmdW5jKTsKKyAgICAgICAgICogICByZXR1cm4gIXAgPyBjYWxsYmFjayhmdW5jKSA6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgICAgKiAgICAgcmV0dXJuIChwWzJdID09ICc+JyA/IG9iamVjdFtwWzFdXSA+IHBbM10gOiBvYmplY3RbcFsxXV0gPCBwWzNdKTsKKyAgICAgICAgICogICB9OworICAgICAgICAgKiB9KTsKKyAgICAgICAgICoKKyAgICAgICAgICogXy5maWx0ZXIodXNlcnMsICdhZ2UgPiAzNicpOworICAgICAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH1dCisgICAgICAgICAqLworICAgICAgICBpdGVyYXRlZTxUUmVzdWx0PigKKyAgICAgICAgICAgIGZ1bmM6IEZ1bmN0aW9uCisgICAgICAgICk6ICguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLml0ZXJhdGVlCisgICAgICAgICAqLworICAgICAgICBpdGVyYXRlZTxUUmVzdWx0PigKKyAgICAgICAgICAgIGZ1bmM6IHN0cmluZworICAgICAgICApOiAob2JqZWN0OiBhbnkpID0+IFRSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pdGVyYXRlZQorICAgICAgICAgKi8KKyAgICAgICAgaXRlcmF0ZWUoCisgICAgICAgICAgICBmdW5jOiBPYmplY3QKKyAgICAgICAgKTogKG9iamVjdDogYW55KSA9PiBib29sZWFuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXRlcmF0ZWUKKyAgICAgICAgICovCisgICAgICAgIGl0ZXJhdGVlPFRSZXN1bHQ+KCk6ICh2YWx1ZTogVFJlc3VsdCkgPT4gVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pdGVyYXRlZQorICAgICAgICAgKi8KKyAgICAgICAgaXRlcmF0ZWU8VFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPChvYmplY3Q6IGFueSkgPT4gVFJlc3VsdD47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXRlcmF0ZWUKKyAgICAgICAgICovCisgICAgICAgIGl0ZXJhdGVlKCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwob2JqZWN0OiBhbnkpID0+IGJvb2xlYW4+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8uaXRlcmF0ZWUKKyAgICAgICAgICovCisgICAgICAgIGl0ZXJhdGVlPFRSZXN1bHQ+KCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwoLi4uYXJnczogYW55W10pID0+IFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLml0ZXJhdGVlCisgICAgICAgICAqLworICAgICAgICBpdGVyYXRlZTxUUmVzdWx0PigpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KG9iamVjdDogYW55KSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pdGVyYXRlZQorICAgICAgICAgKi8KKyAgICAgICAgaXRlcmF0ZWUoKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPChvYmplY3Q6IGFueSkgPT4gYm9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5pdGVyYXRlZQorICAgICAgICAgKi8KKyAgICAgICAgaXRlcmF0ZWU8VFJlc3VsdD4oKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPCguLi5hcmdzOiBhbnlbXSkgPT4gVFJlc3VsdD47CisgICAgfQorCisgICAgLy9fLm1hdGNoZXMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlbiBvYmplY3QgYW5kIHNvdXJjZSwgcmV0dXJuaW5nIHRydWUgaWYgdGhlCisgICAgICAgICAqIGdpdmVuIG9iamVjdCBoYXMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgZmFsc2UuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGJvb2xlYW5zLCBEYXRlIG9iamVjdHMsIG51bWJlcnMsIE9iamVjdCBvYmplY3RzLCByZWdleGVzLCBhbmQKKyAgICAgICAgICogc3RyaW5ncy4gT2JqZWN0cyBhcmUgY29tcGFyZWQgYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZvciBjb21wYXJpbmcgYSBzaW5nbGUgb3duCisgICAgICAgICAqIG9yIGluaGVyaXRlZCBwcm9wZXJ0eSB2YWx1ZSBzZWUgXy5tYXRjaGVzUHJvcGVydHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgbWF0Y2hlczxUPihzb3VyY2U6IFQpOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hdGNoZXMKKyAgICAgICAgICovCisgICAgICAgIG1hdGNoZXM8VCwgVj4oc291cmNlOiBUKTogKHZhbHVlOiBWKSA9PiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWF0Y2hlcworICAgICAgICAgKi8KKyAgICAgICAgbWF0Y2hlczxWPigpOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8KHZhbHVlOiBWKSA9PiBib29sZWFuPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hdGNoZXMKKyAgICAgICAgICovCisgICAgICAgIG1hdGNoZXM8Vj4oKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPCh2YWx1ZTogVikgPT4gYm9vbGVhbj47CisgICAgfQorCisgICAgLy9fLm1hdGNoZXNQcm9wZXJ0eQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHBhdGggb24gYSBnaXZlbiBvYmplY3QgdG8gdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGJvb2xlYW5zLCBEYXRlIG9iamVjdHMsIG51bWJlcnMsIE9iamVjdCBvYmplY3RzLCByZWdleGVzLCBhbmQKKyAgICAgICAgICogc3RyaW5ncy4gT2JqZWN0cyBhcmUgY29tcGFyZWQgYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCisgICAgICAgICAqIEBwYXJhbSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgbWF0Y2hlc1Byb3BlcnR5PFQ+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICBzcmNWYWx1ZTogVAorICAgICAgICApOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hdGNoZXNQcm9wZXJ0eQorICAgICAgICAgKi8KKyAgICAgICAgbWF0Y2hlc1Byb3BlcnR5PFQsIFY+KAorICAgICAgICAgICAgcGF0aDogU3RyaW5nUmVwcmVzZW50YWJsZXxTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICBzcmNWYWx1ZTogVAorICAgICAgICApOiAodmFsdWU6IFYpID0+IGJvb2xlYW47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXRjaGVzUHJvcGVydHkKKyAgICAgICAgICovCisgICAgICAgIG1hdGNoZXNQcm9wZXJ0eTxTcmNWYWx1ZT4oCisgICAgICAgICAgICBzcmNWYWx1ZTogU3JjVmFsdWUKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPCh2YWx1ZTogYW55KSA9PiBib29sZWFuPjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1hdGNoZXNQcm9wZXJ0eQorICAgICAgICAgKi8KKyAgICAgICAgbWF0Y2hlc1Byb3BlcnR5PFNyY1ZhbHVlLCBWYWx1ZT4oCisgICAgICAgICAgICBzcmNWYWx1ZTogU3JjVmFsdWUKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPCh2YWx1ZTogVmFsdWUpID0+IGJvb2xlYW4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWF0Y2hlc1Byb3BlcnR5CisgICAgICAgICAqLworICAgICAgICBtYXRjaGVzUHJvcGVydHk8U3JjVmFsdWU+KAorICAgICAgICAgICAgc3JjVmFsdWU6IFNyY1ZhbHVlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjwodmFsdWU6IGFueSkgPT4gYm9vbGVhbj47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tYXRjaGVzUHJvcGVydHkKKyAgICAgICAgICovCisgICAgICAgIG1hdGNoZXNQcm9wZXJ0eTxTcmNWYWx1ZSwgVmFsdWU+KAorICAgICAgICAgICAgc3JjVmFsdWU6IFNyY1ZhbHVlCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjwodmFsdWU6IFZhbHVlKSA9PiBib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18ubWV0aG9kCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgcGF0aCBvbiBhIGdpdmVuIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZAorICAgICAgICAgKiB0byB0aGUgaW52b2tlZCBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgbWV0aG9kPFRPYmplY3QsIFRSZXN1bHQ+KAorICAgICAgICAgICAgcGF0aDogc3RyaW5nfFN0cmluZ1JlcHJlc2VudGFibGVbXSwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdCisgICAgICAgICk6IChvYmplY3Q6IFRPYmplY3QpID0+IFRSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXRob2QKKyAgICAgICAgICovCisgICAgICAgIG1ldGhvZDxUUmVzdWx0PigKKyAgICAgICAgICAgIHBhdGg6IHN0cmluZ3xTdHJpbmdSZXByZXNlbnRhYmxlW10sCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXQorICAgICAgICApOiAob2JqZWN0OiBhbnkpID0+IFRSZXN1bHQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWV0aG9kCisgICAgICAgICAqLworICAgICAgICBtZXRob2Q8VE9iamVjdCwgVFJlc3VsdD4oLi4uYXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8KG9iamVjdDogVE9iamVjdCkgPT4gVFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXRob2QKKyAgICAgICAgICovCisgICAgICAgIG1ldGhvZDxUUmVzdWx0PiguLi5hcmdzOiBhbnlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwob2JqZWN0OiBhbnkpID0+IFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWV0aG9kCisgICAgICAgICAqLworICAgICAgICBtZXRob2Q8VE9iamVjdCwgVFJlc3VsdD4oLi4uYXJnczogYW55W10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8KG9iamVjdDogVE9iamVjdCkgPT4gVFJlc3VsdD47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXRob2QKKyAgICAgICAgICovCisgICAgICAgIG1ldGhvZDxUUmVzdWx0PiguLi5hcmdzOiBhbnlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwob2JqZWN0OiBhbnkpID0+IFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1ldGhvZAorICAgICAgICAgKi8KKyAgICAgICAgbWV0aG9kPFRPYmplY3QsIFRSZXN1bHQ+KC4uLmFyZ3M6IGFueVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPChvYmplY3Q6IFRPYmplY3QpID0+IFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWV0aG9kCisgICAgICAgICAqLworICAgICAgICBtZXRob2Q8VFJlc3VsdD4oLi4uYXJnczogYW55W10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KG9iamVjdDogYW55KSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1ldGhvZAorICAgICAgICAgKi8KKyAgICAgICAgbWV0aG9kPFRPYmplY3QsIFRSZXN1bHQ+KC4uLmFyZ3M6IGFueVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPChvYmplY3Q6IFRPYmplY3QpID0+IFRSZXN1bHQ+OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWV0aG9kCisgICAgICAgICAqLworICAgICAgICBtZXRob2Q8VFJlc3VsdD4oLi4uYXJnczogYW55W10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KG9iamVjdDogYW55KSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ubWV0aG9kT2YKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBfLm1ldGhvZDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGEgZ2l2ZW4gcGF0aCBvbiBvYmplY3QuCisgICAgICAgICAqIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBtZXRob2RPZjxUT2JqZWN0IGV4dGVuZHMge30sIFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiBUT2JqZWN0LAorICAgICAgICAgICAgLi4uYXJnczogYW55W10KKyAgICAgICAgKTogKHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdKSA9PiBUUmVzdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubWV0aG9kT2YKKyAgICAgICAgICovCisgICAgICAgIG1ldGhvZE9mPFRSZXN1bHQ+KAorICAgICAgICAgICAgb2JqZWN0OiB7fSwKKyAgICAgICAgICAgIC4uLmFyZ3M6IGFueVtdCisgICAgICAgICk6IChwYXRoOiBTdHJpbmdSZXByZXNlbnRhYmxlfFN0cmluZ1JlcHJlc2VudGFibGVbXSkgPT4gVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXRob2RPZgorICAgICAgICAgKi8KKyAgICAgICAgbWV0aG9kT2Y8VFJlc3VsdD4oCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8KHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdKSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5tZXRob2RPZgorICAgICAgICAgKi8KKyAgICAgICAgbWV0aG9kT2Y8VFJlc3VsdD4oCisgICAgICAgICAgICAuLi5hcmdzOiBhbnlbXQorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdKSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ubWl4aW4KKyAgICBpbnRlcmZhY2UgTWl4aW5PcHRpb25zIHsKKyAgICAgICAgY2hhaW4/OiBib29sZWFuOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZSBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgb2JqZWN0IGlzIGEKKyAgICAgICAgICogZnVuY3Rpb24gdGhlbiBtZXRob2RzIGFyZSBhZGRlZCB0byBpdHMgcHJvdG90eXBlIGFzIHdlbGwuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFVzZSBfLnJ1bkluQ29udGV4dCB0byBjcmVhdGUgYSBwcmlzdGluZSBsb2Rhc2ggZnVuY3Rpb24gdG8gYXZvaWQgY29uZmxpY3RzIGNhdXNlZCBieSBtb2RpZnlpbmcKKyAgICAgICAgICogdGhlIG9yaWdpbmFsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zLmNoYWluIFNwZWNpZnkgd2hldGhlciB0aGUgZnVuY3Rpb25zIGFkZGVkIGFyZSBjaGFpbmFibGUuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBtaXhpbjxUUmVzdWx0LCBUT2JqZWN0PigKKyAgICAgICAgICAgIG9iamVjdDogVE9iamVjdCwKKyAgICAgICAgICAgIHNvdXJjZTogRGljdGlvbmFyeTxGdW5jdGlvbj4sCisgICAgICAgICAgICBvcHRpb25zPzogTWl4aW5PcHRpb25zCisgICAgICAgICk6IFRSZXN1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5taXhpbgorICAgICAgICAgKi8KKyAgICAgICAgbWl4aW48VFJlc3VsdD4oCisgICAgICAgICAgICBzb3VyY2U6IERpY3Rpb25hcnk8RnVuY3Rpb24+LAorICAgICAgICAgICAgb3B0aW9ucz86IE1peGluT3B0aW9ucworICAgICAgICApOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1peGluCisgICAgICAgICAqLworICAgICAgICBtaXhpbjxUUmVzdWx0PigKKyAgICAgICAgICAgIHNvdXJjZTogRGljdGlvbmFyeTxGdW5jdGlvbj4sCisgICAgICAgICAgICBvcHRpb25zPzogTWl4aW5PcHRpb25zCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1peGluCisgICAgICAgICAqLworICAgICAgICBtaXhpbjxUUmVzdWx0PigKKyAgICAgICAgICAgIG9wdGlvbnM/OiBNaXhpbk9wdGlvbnMKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1peGluCisgICAgICAgICAqLworICAgICAgICBtaXhpbjxUUmVzdWx0PigKKyAgICAgICAgICAgIHNvdXJjZTogRGljdGlvbmFyeTxGdW5jdGlvbj4sCisgICAgICAgICAgICBvcHRpb25zPzogTWl4aW5PcHRpb25zCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm1peGluCisgICAgICAgICAqLworICAgICAgICBtaXhpbjxUUmVzdWx0PigKKyAgICAgICAgICAgIG9wdGlvbnM/OiBNaXhpbk9wdGlvbnMKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPFRSZXN1bHQ+OworICAgIH0KKworICAgIC8vXy5ub0NvbmZsaWN0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXZlcnRzIHRoZSBfIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbG9kYXNoIGZ1bmN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvZGFzaCBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIG5vQ29uZmxpY3QoKTogdHlwZW9mIF87CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ub0NvbmZsaWN0CisgICAgICAgICAqLworICAgICAgICBub0NvbmZsaWN0KCk6IHR5cGVvZiBfOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubm9Db25mbGljdAorICAgICAgICAgKi8KKyAgICAgICAgbm9Db25mbGljdCgpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8dHlwZW9mIF8+OworICAgIH0KKworICAgIC8vXy5ub29wCisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIG5vLW9wZXJhdGlvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdW5kZWZpbmVkIHJlZ2FyZGxlc3Mgb2YgdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB1bmRlZmluZWQKKyAgICAgICAgICovCisgICAgICAgIG5vb3AoLi4uYXJnczogYW55W10pOiB2b2lkOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXJCYXNlPFQsIFRXcmFwcGVyPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ubm9vcAorICAgICAgICAgKi8KKyAgICAgICAgbm9vcCguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ub29wCisgICAgICAgICAqLworICAgICAgICBub29wKC4uLmFyZ3M6IGFueVtdKTogXy5Mb0Rhc2hFeHBsaWNpdFdyYXBwZXI8dm9pZD47CisgICAgfQorCisgICAgLy9fLm50aEFyZworICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdHMgbnRoIGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBudGhBcmc8VFJlc3VsdCBleHRlbmRzIEZ1bmN0aW9uPihuPzogbnVtYmVyKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5udGhBcmcKKyAgICAgICAgICovCisgICAgICAgIG50aEFyZzxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5udGhBcmcKKyAgICAgICAgICovCisgICAgICAgIG50aEFyZzxUUmVzdWx0IGV4dGVuZHMgRnVuY3Rpb24+KCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ub3ZlcgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBpdGVyYXRlZXMgd2l0aCB0aGUgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zCisgICAgICAgICAqIHRoZWlyIHJlc3VsdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgb3ZlcjxUUmVzdWx0PiguLi5pdGVyYXRlZXM6IChGdW5jdGlvbnxGdW5jdGlvbltdKVtdKTogKC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0W107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vdmVyCisgICAgICAgICAqLworICAgICAgICBvdmVyPFRSZXN1bHQ+KC4uLml0ZXJhdGVlczogKEZ1bmN0aW9ufEZ1bmN0aW9uW10pW10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8KC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0W10+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXIKKyAgICAgICAgICovCisgICAgICAgIG92ZXI8VFJlc3VsdD4oLi4uaXRlcmF0ZWVzOiAoRnVuY3Rpb258RnVuY3Rpb25bXSlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwoLi4uYXJnczogYW55W10pID0+IFRSZXN1bHRbXT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5vdmVyCisgICAgICAgICAqLworICAgICAgICBvdmVyPFRSZXN1bHQ+KC4uLml0ZXJhdGVlczogKEZ1bmN0aW9ufEZ1bmN0aW9uW10pW10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KC4uLmFyZ3M6IGFueVtdKSA9PiBUUmVzdWx0W10+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXIKKyAgICAgICAgICovCisgICAgICAgIG92ZXI8VFJlc3VsdD4oLi4uaXRlcmF0ZWVzOiAoRnVuY3Rpb258RnVuY3Rpb25bXSlbXSk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjwoLi4uYXJnczogYW55W10pID0+IFRSZXN1bHRbXT47CisgICAgfQorCisgICAgLy9fLm92ZXJFdmVyeQorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGFsbCBvZiB0aGUgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMKKyAgICAgICAgICogcHJvdmlkZWQgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcmVkaWNhdGVzIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIG92ZXJFdmVyeSguLi5wcmVkaWNhdGVzOiAoRnVuY3Rpb258RnVuY3Rpb25bXSlbXSk6ICguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXJFdmVyeQorICAgICAgICAgKi8KKyAgICAgICAgb3ZlckV2ZXJ5KC4uLnByZWRpY2F0ZXM6IChGdW5jdGlvbnxGdW5jdGlvbltdKVtdKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPCguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3ZlckV2ZXJ5CisgICAgICAgICAqLworICAgICAgICBvdmVyRXZlcnkoLi4ucHJlZGljYXRlczogKEZ1bmN0aW9ufEZ1bmN0aW9uW10pW10pOiBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8KC4uLmFyZ3M6IGFueVtdKSA9PiBib29sZWFuPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXJFdmVyeQorICAgICAgICAgKi8KKyAgICAgICAgb3ZlckV2ZXJ5KC4uLnByZWRpY2F0ZXM6IChGdW5jdGlvbnxGdW5jdGlvbltdKVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPCguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3ZlckV2ZXJ5CisgICAgICAgICAqLworICAgICAgICBvdmVyRXZlcnkoLi4ucHJlZGljYXRlczogKEZ1bmN0aW9ufEZ1bmN0aW9uW10pW10pOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KC4uLmFyZ3M6IGFueVtdKSA9PiBib29sZWFuPjsKKyAgICB9CisKKyAgICAvL18ub3ZlclNvbWUKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiBhbnkgb2YgdGhlIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzCisgICAgICAgICAqIHByb3ZpZGVkIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJlZGljYXRlcyBUaGUgcHJlZGljYXRlcyB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBvdmVyU29tZSguLi5wcmVkaWNhdGVzOiAoRnVuY3Rpb258RnVuY3Rpb25bXSlbXSk6ICguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXJTb21lCisgICAgICAgICAqLworICAgICAgICBvdmVyU29tZSguLi5wcmVkaWNhdGVzOiAoRnVuY3Rpb258RnVuY3Rpb25bXSlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwoLi4uYXJnczogYW55W10pID0+IGJvb2xlYW4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLm92ZXJTb21lCisgICAgICAgICAqLworICAgICAgICBvdmVyU29tZSguLi5wcmVkaWNhdGVzOiAoRnVuY3Rpb258RnVuY3Rpb25bXSlbXSk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwoLi4uYXJnczogYW55W10pID0+IGJvb2xlYW4+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3ZlclNvbWUKKyAgICAgICAgICovCisgICAgICAgIG92ZXJTb21lKC4uLnByZWRpY2F0ZXM6IChGdW5jdGlvbnxGdW5jdGlvbltdKVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPCguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ub3ZlclNvbWUKKyAgICAgICAgICovCisgICAgICAgIG92ZXJTb21lKC4uLnByZWRpY2F0ZXM6IChGdW5jdGlvbnxGdW5jdGlvbltdKVtdKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPCguLi5hcmdzOiBhbnlbXSkgPT4gYm9vbGVhbj47CisgICAgfQorCisgICAgLy9fLnByb3BlcnR5CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBhdCBwYXRoIG9uIGEgZ2l2ZW4gb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByb3BlcnR5PFRPYmosIFRSZXN1bHQ+KHBhdGg6IFN0cmluZ1JlcHJlc2VudGFibGV8U3RyaW5nUmVwcmVzZW50YWJsZVtdKTogKG9iajogVE9iaikgPT4gVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wcm9wZXJ0eQorICAgICAgICAgKi8KKyAgICAgICAgcHJvcGVydHk8VE9iaiwgVFJlc3VsdD4oKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPChvYmo6IFRPYmopID0+IFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucHJvcGVydHkKKyAgICAgICAgICovCisgICAgICAgIHByb3BlcnR5PFRPYmosIFRSZXN1bHQ+KCk6IExvRGFzaEltcGxpY2l0T2JqZWN0V3JhcHBlcjwob2JqOiBUT2JqKSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5wcm9wZXJ0eQorICAgICAgICAgKi8KKyAgICAgICAgcHJvcGVydHk8VE9iaiwgVFJlc3VsdD4oKTogTG9EYXNoRXhwbGljaXRPYmplY3RXcmFwcGVyPChvYmo6IFRPYmopID0+IFRSZXN1bHQ+OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucHJvcGVydHkKKyAgICAgICAgICovCisgICAgICAgIHByb3BlcnR5PFRPYmosIFRSZXN1bHQ+KCk6IExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjwob2JqOiBUT2JqKSA9PiBUUmVzdWx0PjsKKyAgICB9CisKKyAgICAvL18ucHJvcGVydHlPZgorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9wcG9zaXRlIG9mIF8ucHJvcGVydHk7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aAorICAgICAgICAgKiBvbiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwcm9wZXJ0eU9mPFQgZXh0ZW5kcyB7fT4ob2JqZWN0OiBUKTogKHBhdGg6IHN0cmluZ3xzdHJpbmdbXSkgPT4gYW55OworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdE9iamVjdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnByb3BlcnR5T2YKKyAgICAgICAgICovCisgICAgICAgIHByb3BlcnR5T2YoKTogTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPChwYXRoOiBzdHJpbmd8c3RyaW5nW10pID0+IGFueT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0T2JqZWN0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucHJvcGVydHlPZgorICAgICAgICAgKi8KKyAgICAgICAgcHJvcGVydHlPZigpOiBMb0Rhc2hFeHBsaWNpdE9iamVjdFdyYXBwZXI8KHBhdGg6IHN0cmluZ3xzdHJpbmdbXSkgPT4gYW55PjsKKyAgICB9CisKKyAgICAvL18ucmFuZ2UKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tIHN0YXJ0IHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgZW5kLgorICAgICAgICAgKiBJZiBlbmQgaXMgbm90IHNwZWNpZmllZCBpdOKAmXMgc2V0IHRvIHN0YXJ0IHdpdGggc3RhcnQgdGhlbiBzZXQgdG8gMC4gSWYgZW5kIGlzIGxlc3MgdGhhbiBzdGFydCBhIHplcm8tbGVuZ3RoCisgICAgICAgICAqIHJhbmdlIGlzIGNyZWF0ZWQgdW5sZXNzIGEgbmVnYXRpdmUgc3RlcCBpcyBzcGVjaWZpZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLgorICAgICAgICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICAgKiBAcGFyYW0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IHJhbmdlIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgcmFuZ2UoCisgICAgICAgICAgICBzdGFydDogbnVtYmVyLAorICAgICAgICAgICAgZW5kOiBudW1iZXIsCisgICAgICAgICAgICBzdGVwPzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcltdOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIHJhbmdlKAorICAgICAgICAgICAgZW5kOiBudW1iZXIsCisgICAgICAgICAgICBzdGVwPzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcltdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJhbmdlCisgICAgICAgICAqLworICAgICAgICByYW5nZSgKKyAgICAgICAgICAgIGVuZD86IG51bWJlciwKKyAgICAgICAgICAgIHN0ZXA/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoSW1wbGljaXRBcnJheVdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoRXhwbGljaXRXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yYW5nZQorICAgICAgICAgKi8KKyAgICAgICAgcmFuZ2UoCisgICAgICAgICAgICBlbmQ/OiBudW1iZXIsCisgICAgICAgICAgICBzdGVwPzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEV4cGxpY2l0QXJyYXlXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgLy9fLnJhbmdlUmlnaHQKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmFuZ2VgIGV4Y2VwdCB0aGF0IGl0IHBvcHVsYXRlcyB2YWx1ZXMgaW4KKyAgICAgICAgICogZGVzY2VuZGluZyBvcmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHN0YXRpYworICAgICAgICAgKiBAbWVtYmVyT2YgXworICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAorICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCisgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS4KKyAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgbnVtYmVycy4KKyAgICAgICAgICogQGV4YW1wbGUKKyAgICAgICAgICoKKyAgICAgICAgICogXy5yYW5nZVJpZ2h0KDQpOworICAgICAgICAgKiAvLyA9PiBbMywgMiwgMSwgMF0KKyAgICAgICAgICoKKyAgICAgICAgICogXy5yYW5nZVJpZ2h0KC00KTsKKyAgICAgICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdCisgICAgICAgICAqCisgICAgICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTsKKyAgICAgICAgICogLy8gPT4gWzQsIDMsIDIsIDFdCisgICAgICAgICAqCisgICAgICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7CisgICAgICAgICAqIC8vID0+IFsxNSwgMTAsIDUsIDBdCisgICAgICAgICAqCisgICAgICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpOworICAgICAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF0KKyAgICAgICAgICoKKyAgICAgICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApOworICAgICAgICAgKiAvLyA9PiBbMSwgMSwgMV0KKyAgICAgICAgICoKKyAgICAgICAgICogXy5yYW5nZVJpZ2h0KDApOworICAgICAgICAgKiAvLyA9PiBbXQorICAgICAgICAgKi8KKyAgICAgICAgcmFuZ2VSaWdodCgKKyAgICAgICAgICAgIHN0YXJ0OiBudW1iZXIsCisgICAgICAgICAgICBlbmQ6IG51bWJlciwKKyAgICAgICAgICAgIHN0ZXA/OiBudW1iZXIKKyAgICAgICAgKTogbnVtYmVyW107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5yYW5nZVJpZ2h0CisgICAgICAgICAqLworICAgICAgICByYW5nZVJpZ2h0KAorICAgICAgICAgICAgZW5kOiBudW1iZXIsCisgICAgICAgICAgICBzdGVwPzogbnVtYmVyCisgICAgICAgICk6IG51bWJlcltdOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnJhbmdlUmlnaHQKKyAgICAgICAgICovCisgICAgICAgIHJhbmdlUmlnaHQoCisgICAgICAgICAgICBlbmQ/OiBudW1iZXIsCisgICAgICAgICAgICBzdGVwPzogbnVtYmVyCisgICAgICAgICk6IExvRGFzaEltcGxpY2l0QXJyYXlXcmFwcGVyPG51bWJlcj47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8ucmFuZ2VSaWdodAorICAgICAgICAgKi8KKyAgICAgICAgcmFuZ2VSaWdodCgKKyAgICAgICAgICAgIGVuZD86IG51bWJlciwKKyAgICAgICAgICAgIHN0ZXA/OiBudW1iZXIKKyAgICAgICAgKTogTG9EYXNoRXhwbGljaXRBcnJheVdyYXBwZXI8bnVtYmVyPjsKKyAgICB9CisKKyAgICAvL18ucnVuSW5Db250ZXh0CisgICAgaW50ZXJmYWNlIExvRGFzaFN0YXRpYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgbG9kYXNoIGZ1bmN0aW9uIHVzaW5nIHRoZSBnaXZlbiBjb250ZXh0IG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2JqZWN0LgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgbG9kYXNoIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcnVuSW5Db250ZXh0KGNvbnRleHQ/OiBPYmplY3QpOiB0eXBlb2YgXzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRPYmplY3RXcmFwcGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy5ydW5JbkNvbnRleHQKKyAgICAgICAgICovCisgICAgICAgIHJ1bkluQ29udGV4dCgpOiB0eXBlb2YgXzsKKyAgICB9CisKKyAgICAvL18udGltZXMKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZXMgdGhlIGl0ZXJhdGVlIGZ1bmN0aW9uIG4gdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZQorICAgICAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBpdGVyYXRlZS4KKyAgICAgICAgICogQHBhcmFtIGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy4KKyAgICAgICAgICovCisgICAgICAgIHRpbWVzPFRSZXN1bHQ+KAorICAgICAgICAgICAgbjogbnVtYmVyLAorICAgICAgICAgICAgaXRlcmF0ZWU6IChudW06IG51bWJlcikgPT4gVFJlc3VsdAorICAgICAgICApOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50aW1lcworICAgICAgICAgKi8KKyAgICAgICAgdGltZXMobjogbnVtYmVyKTogbnVtYmVyW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEltcGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGltZXMKKyAgICAgICAgICovCisgICAgICAgIHRpbWVzPFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IChudW06IG51bWJlcikgPT4gVFJlc3VsdAorICAgICAgICApOiBUUmVzdWx0W107CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50aW1lcworICAgICAgICAgKi8KKyAgICAgICAgdGltZXMoKTogbnVtYmVyW107CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udGltZXMKKyAgICAgICAgICovCisgICAgICAgIHRpbWVzPFRSZXN1bHQ+KAorICAgICAgICAgICAgaXRlcmF0ZWU6IChudW06IG51bWJlcikgPT4gVFJlc3VsdAorICAgICAgICApOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxUUmVzdWx0PjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRpbWVzCisgICAgICAgICAqLworICAgICAgICB0aW1lcygpOiBMb0Rhc2hFeHBsaWNpdEFycmF5V3JhcHBlcjxudW1iZXI+OworICAgIH0KKworICAgIC8vXy50b1BhdGgKKyAgICBpbnRlcmZhY2UgTG9EYXNoU3RhdGljIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAc3RhdGljCisgICAgICAgICAqIEBtZW1iZXJPZiBfCisgICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCisgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuCisgICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuCisgICAgICAgICAqIEBleGFtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIF8udG9QYXRoKCdhLmIuYycpOworICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10KKyAgICAgICAgICoKKyAgICAgICAgICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7CisgICAgICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddCisgICAgICAgICAqCisgICAgICAgICAqIHZhciBwYXRoID0gWydhJywgJ2InLCAnYyddLAorICAgICAgICAgKiAgICAgbmV3UGF0aCA9IF8udG9QYXRoKHBhdGgpOworICAgICAgICAgKgorICAgICAgICAgKiBjb25zb2xlLmxvZyhuZXdQYXRoKTsKKyAgICAgICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddCisgICAgICAgICAqCisgICAgICAgICAqIGNvbnNvbGUubG9nKHBhdGggPT09IG5ld1BhdGgpOworICAgICAgICAgKiAvLyA9PiBmYWxzZQorICAgICAgICAgKi8KKyAgICAgICAgdG9QYXRoKHZhbHVlOiBhbnkpOiBzdHJpbmdbXTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTG9EYXNoSW1wbGljaXRXcmFwcGVyQmFzZTxULCBUV3JhcHBlcj4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnRvUGF0aAorICAgICAgICAgKi8KKyAgICAgICAgdG9QYXRoKCk6IExvRGFzaEltcGxpY2l0V3JhcHBlcjxzdHJpbmdbXT47CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlckJhc2U8VCwgVFdyYXBwZXI+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgXy50b1BhdGgKKyAgICAgICAgICovCisgICAgICAgIHRvUGF0aCgpOiBMb0Rhc2hFeHBsaWNpdFdyYXBwZXI8c3RyaW5nW10+OworICAgIH0KKworICAgIC8vXy51bmlxdWVJZAorICAgIGludGVyZmFjZSBMb0Rhc2hTdGF0aWMgeworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBwcmVmaXggaXMgcHJvdmlkZWQgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdW5pcXVlIElELgorICAgICAgICAgKi8KKyAgICAgICAgdW5pcXVlSWQocHJlZml4Pzogc3RyaW5nKTogc3RyaW5nOworICAgIH0KKworICAgIGludGVyZmFjZSBMb0Rhc2hJbXBsaWNpdFdyYXBwZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBfLnVuaXF1ZUlkCisgICAgICAgICAqLworICAgICAgICB1bmlxdWVJZCgpOiBzdHJpbmc7CisgICAgfQorCisgICAgaW50ZXJmYWNlIExvRGFzaEV4cGxpY2l0V3JhcHBlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIF8udW5pcXVlSWQKKyAgICAgICAgICovCisgICAgICAgIHVuaXF1ZUlkKCk6IExvRGFzaEV4cGxpY2l0V3JhcHBlcjxzdHJpbmc+OworICAgIH0KKworICAgIGludGVyZmFjZSBMaXN0SXRlcmF0b3I8VCwgVFJlc3VsdD4geworICAgICAgICAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGNvbGxlY3Rpb246IExpc3Q8VD4pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBEaWN0aW9uYXJ5SXRlcmF0b3I8VCwgVFJlc3VsdD4geworICAgICAgICAodmFsdWU6IFQsIGtleT86IHN0cmluZywgY29sbGVjdGlvbj86IERpY3Rpb25hcnk8VD4pOiBUUmVzdWx0OworICAgIH0KKworICAgIGludGVyZmFjZSBOdW1lcmljRGljdGlvbmFyeUl0ZXJhdG9yPFQsIFRSZXN1bHQ+IHsKKyAgICAgICAgKHZhbHVlOiBULCBrZXk/OiBudW1iZXIsIGNvbGxlY3Rpb24/OiBEaWN0aW9uYXJ5PFQ+KTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgT2JqZWN0SXRlcmF0b3I8VCwgVFJlc3VsdD4geworICAgICAgICAoZWxlbWVudDogVCwga2V5Pzogc3RyaW5nLCBjb2xsZWN0aW9uPzogYW55KTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU3RyaW5nSXRlcmF0b3I8VFJlc3VsdD4geworICAgICAgICAoY2hhcjogc3RyaW5nLCBpbmRleD86IG51bWJlciwgc3RyaW5nPzogc3RyaW5nKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTWVtb1ZvaWRJdGVyYXRvcjxULCBUUmVzdWx0PiB7CisgICAgICAgIChwcmV2OiBUUmVzdWx0LCBjdXJyOiBULCBpbmRleE9yS2V5PzogYW55LCBsaXN0PzogVFtdKTogdm9pZDsKKyAgICB9CisgICAgaW50ZXJmYWNlIE1lbW9JdGVyYXRvcjxULCBUUmVzdWx0PiB7CisgICAgICAgIChwcmV2OiBUUmVzdWx0LCBjdXJyOiBULCBpbmRleE9yS2V5PzogYW55LCBsaXN0PzogVFtdKTogVFJlc3VsdDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgTWVtb1ZvaWRBcnJheUl0ZXJhdG9yPFQsIFRSZXN1bHQ+IHsKKyAgICAgICAgKGFjYzogVFJlc3VsdCwgY3VycjogVCwgaW5kZXg/OiBudW1iZXIsIGFycj86IFRbXSk6IHZvaWQ7CisgICAgfQorICAgIGludGVyZmFjZSBNZW1vVm9pZERpY3Rpb25hcnlJdGVyYXRvcjxULCBUUmVzdWx0PiB7CisgICAgICAgIChhY2M6IFRSZXN1bHQsIGN1cnI6IFQsIGtleT86IHN0cmluZywgZGljdD86IERpY3Rpb25hcnk8VD4pOiB2b2lkOworICAgIH0KKworICAgIC8vaW50ZXJmYWNlIENvbGxlY3Rpb248VD4ge30KKworICAgIC8vIENvbW1vbiBpbnRlcmZhY2UgYmV0d2VlbiBBcnJheXMgYW5kIGpRdWVyeSBvYmplY3RzCisgICAgaW50ZXJmYWNlIExpc3Q8VD4geworICAgICAgICBbaW5kZXg6IG51bWJlcl06IFQ7CisgICAgICAgIGxlbmd0aDogbnVtYmVyOworICAgIH0KKworICAgIGludGVyZmFjZSBEaWN0aW9uYXJ5PFQ+IHsKKyAgICAgICAgW2luZGV4OiBzdHJpbmddOiBUOworICAgIH0KKworICAgIGludGVyZmFjZSBOdW1lcmljRGljdGlvbmFyeTxUPiB7CisgICAgICAgIFtpbmRleDogbnVtYmVyXTogVDsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU3RyaW5nUmVwcmVzZW50YWJsZSB7CisgICAgICAgIHRvU3RyaW5nKCk6IHN0cmluZzsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ2FuY2VsYWJsZSB7CisgICAgICAgIGNhbmNlbCgpOiB2b2lkOworICAgICAgICBmbHVzaCgpOiB2b2lkOworICAgIH0KK30KKworLy8gTmFtZWQgZXhwb3J0cworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2FmdGVyIiB7CisgICAgY29uc3QgYWZ0ZXI6IHR5cGVvZiBfLmFmdGVyOworICAgIGV4cG9ydCA9IGFmdGVyOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvYXJ5IiB7CisgICAgY29uc3QgYXJ5OiB0eXBlb2YgXy5hcnk7CisgICAgZXhwb3J0ID0gYXJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvYXNzaWduIiB7CisgICAgY29uc3QgYXNzaWduOiB0eXBlb2YgXy5hc3NpZ247CisgICAgZXhwb3J0ID0gYXNzaWduOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvYXNzaWduSW4iIHsKKyAgICBjb25zdCBhc3NpZ25JbjogdHlwZW9mIF8uYXNzaWduSW47CisgICAgZXhwb3J0ID0gYXNzaWduSW47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9hc3NpZ25JbldpdGgiIHsKKyAgICBjb25zdCBhc3NpZ25JbldpdGg6IHR5cGVvZiBfLmFzc2lnbkluV2l0aDsKKyAgICBleHBvcnQgPSBhc3NpZ25JbldpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9hc3NpZ25XaXRoIiB7CisgICAgY29uc3QgYXNzaWduV2l0aDogdHlwZW9mIF8uYXNzaWduV2l0aDsKKyAgICBleHBvcnQgPSBhc3NpZ25XaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvYXQiIHsKKyAgICBjb25zdCBhdDogdHlwZW9mIF8uYXQ7CisgICAgZXhwb3J0ID0gYXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9iZWZvcmUiIHsKKyAgICBjb25zdCBiZWZvcmU6IHR5cGVvZiBfLmJlZm9yZTsKKyAgICBleHBvcnQgPSBiZWZvcmU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9iaW5kIiB7CisgICAgY29uc3QgYmluZDogdHlwZW9mIF8uYmluZDsKKyAgICBleHBvcnQgPSBiaW5kOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvYmluZEFsbCIgeworICAgIGNvbnN0IGJpbmRBbGw6IHR5cGVvZiBfLmJpbmRBbGw7CisgICAgZXhwb3J0ID0gYmluZEFsbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2JpbmRLZXkiIHsKKyAgICBjb25zdCBiaW5kS2V5OiB0eXBlb2YgXy5iaW5kS2V5OworICAgIGV4cG9ydCA9IGJpbmRLZXk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9jYXN0QXJyYXkiIHsKKyAgICBjb25zdCBjYXN0QXJyYXk6IHR5cGVvZiBfLmNhc3RBcnJheTsKKyAgICBleHBvcnQgPSBjYXN0QXJyYXk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9jaGFpbiIgeworICAgIGNvbnN0IGNoYWluOiB0eXBlb2YgXy5jaGFpbjsKKyAgICBleHBvcnQgPSBjaGFpbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2NodW5rIiB7CisgICAgY29uc3QgY2h1bms6IHR5cGVvZiBfLmNodW5rOworICAgIGV4cG9ydCA9IGNodW5rOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvY29tcGFjdCIgeworICAgIGNvbnN0IGNvbXBhY3Q6IHR5cGVvZiBfLmNvbXBhY3Q7CisgICAgZXhwb3J0ID0gY29tcGFjdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2NvbmNhdCIgeworICAgIGNvbnN0IGNvbmNhdDogdHlwZW9mIF8uY29uY2F0OworICAgIGV4cG9ydCA9IGNvbmNhdDsKK30KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gvY29uZCIgeworIGNvbnN0IGNvbmQ6IHR5cGVvZiBfLmNvbmQ7CisgZXhwb3J0ID0gY29uZDsKKyB9CisgKi8KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gvY29uZm9ybXMiIHsKKyBjb25zdCBjb25mb3JtczogdHlwZW9mIF8uY29uZm9ybXM7CisgZXhwb3J0ID0gY29uZm9ybXM7CisgfQorICovCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvY29uc3RhbnQiIHsKKyAgICBjb25zdCBjb25zdGFudDogdHlwZW9mIF8uY29uc3RhbnQ7CisgICAgZXhwb3J0ID0gY29uc3RhbnQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9jb3VudEJ5IiB7CisgICAgY29uc3QgY291bnRCeTogdHlwZW9mIF8uY291bnRCeTsKKyAgICBleHBvcnQgPSBjb3VudEJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvY3JlYXRlIiB7CisgICAgY29uc3QgY3JlYXRlOiB0eXBlb2YgXy5jcmVhdGU7CisgICAgZXhwb3J0ID0gY3JlYXRlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvY3VycnkiIHsKKyAgICBjb25zdCBjdXJyeTogdHlwZW9mIF8uY3Vycnk7CisgICAgZXhwb3J0ID0gY3Vycnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9jdXJyeVJpZ2h0IiB7CisgICAgY29uc3QgY3VycnlSaWdodDogdHlwZW9mIF8uY3VycnlSaWdodDsKKyAgICBleHBvcnQgPSBjdXJyeVJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZGVib3VuY2UiIHsKKyAgICBjb25zdCBkZWJvdW5jZTogdHlwZW9mIF8uZGVib3VuY2U7CisgICAgZXhwb3J0ID0gZGVib3VuY2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9kZWZhdWx0cyIgeworICAgIGNvbnN0IGRlZmF1bHRzOiB0eXBlb2YgXy5kZWZhdWx0czsKKyAgICBleHBvcnQgPSBkZWZhdWx0czsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2RlZmF1bHRzRGVlcCIgeworICAgIGNvbnN0IGRlZmF1bHRzRGVlcDogdHlwZW9mIF8uZGVmYXVsdHNEZWVwOworICAgIGV4cG9ydCA9IGRlZmF1bHRzRGVlcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2RlZmVyIiB7CisgICAgY29uc3QgZGVmZXI6IHR5cGVvZiBfLmRlZmVyOworICAgIGV4cG9ydCA9IGRlZmVyOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZGVsYXkiIHsKKyAgICBjb25zdCBkZWxheTogdHlwZW9mIF8uZGVsYXk7CisgICAgZXhwb3J0ID0gZGVsYXk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9kaWZmZXJlbmNlIiB7CisgICAgY29uc3QgZGlmZmVyZW5jZTogdHlwZW9mIF8uZGlmZmVyZW5jZTsKKyAgICBleHBvcnQgPSBkaWZmZXJlbmNlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZGlmZmVyZW5jZUJ5IiB7CisgICAgY29uc3QgZGlmZmVyZW5jZUJ5OiB0eXBlb2YgXy5kaWZmZXJlbmNlQnk7CisgICAgZXhwb3J0ID0gZGlmZmVyZW5jZUJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZGlmZmVyZW5jZVdpdGgiIHsKKyAgICBjb25zdCBkaWZmZXJlbmNlV2l0aDogdHlwZW9mIF8uZGlmZmVyZW5jZVdpdGg7CisgICAgZXhwb3J0ID0gZGlmZmVyZW5jZVdpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9kcm9wIiB7CisgICAgY29uc3QgZHJvcDogdHlwZW9mIF8uZHJvcDsKKyAgICBleHBvcnQgPSBkcm9wOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZHJvcFJpZ2h0IiB7CisgICAgY29uc3QgZHJvcFJpZ2h0OiB0eXBlb2YgXy5kcm9wUmlnaHQ7CisgICAgZXhwb3J0ID0gZHJvcFJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZHJvcFJpZ2h0V2hpbGUiIHsKKyAgICBjb25zdCBkcm9wUmlnaHRXaGlsZTogdHlwZW9mIF8uZHJvcFJpZ2h0V2hpbGU7CisgICAgZXhwb3J0ID0gZHJvcFJpZ2h0V2hpbGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9kcm9wV2hpbGUiIHsKKyAgICBjb25zdCBkcm9wV2hpbGU6IHR5cGVvZiBfLmRyb3BXaGlsZTsKKyAgICBleHBvcnQgPSBkcm9wV2hpbGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9maWxsIiB7CisgICAgY29uc3QgZmlsbDogdHlwZW9mIF8uZmlsbDsKKyAgICBleHBvcnQgPSBmaWxsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmlsdGVyIiB7CisgICAgY29uc3QgZmlsdGVyOiB0eXBlb2YgXy5maWx0ZXI7CisgICAgZXhwb3J0ID0gZmlsdGVyOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmxhdE1hcCIgeworICAgIGNvbnN0IGZsYXRNYXA6IHR5cGVvZiBfLmZsYXRNYXA7CisgICAgZXhwb3J0ID0gZmxhdE1hcDsKK30KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmxhdE1hcERlZXAiIHsKKyBjb25zdCBmbGF0TWFwRGVlcDogdHlwZW9mIF8uZmxhdE1hcERlZXA7CisgZXhwb3J0ID0gZmxhdE1hcERlZXA7CisgfQorICovCisvKioKKyAqIHVuY29tZW50IGl0IGlmIGRlZmluaXRpb24gZXhpc3RzCisgKi8KKy8qCisgZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9mbGF0TWFwRGVwdGgiIHsKKyBjb25zdCBmbGF0TWFwRGVwdGg6IHR5cGVvZiBfLmZsYXRNYXBEZXB0aDsKKyBleHBvcnQgPSBmbGF0TWFwRGVwdGg7CisgfQorICovCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmxhdHRlbiIgeworICAgIGNvbnN0IGZsYXR0ZW46IHR5cGVvZiBfLmZsYXR0ZW47CisgICAgZXhwb3J0ID0gZmxhdHRlbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2ZsYXR0ZW5EZWVwIiB7CisgICAgY29uc3QgZmxhdHRlbkRlZXA6IHR5cGVvZiBfLmZsYXR0ZW5EZWVwOworICAgIGV4cG9ydCA9IGZsYXR0ZW5EZWVwOworfQorCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2ZsYXR0ZW5EZXB0aCIgeworICAgIGNvbnN0IGZsYXR0ZW5EZXB0aDogdHlwZW9mIF8uZmxhdHRlbkRlcHRoOworICAgIGV4cG9ydCA9IGZsYXR0ZW5EZXB0aDsKK30KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9mbGlwIiB7CisgICAgY29uc3QgZmxpcDogdHlwZW9mIF8uZmxpcDsKKyAgICBleHBvcnQgPSBmbGlwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmxvdyIgeworICAgIGNvbnN0IGZsb3c6IHR5cGVvZiBfLmZsb3c7CisgICAgZXhwb3J0ID0gZmxvdzsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2Zsb3dSaWdodCIgeworICAgIGNvbnN0IGZsb3dSaWdodDogdHlwZW9mIF8uZmxvd1JpZ2h0OworICAgIGV4cG9ydCA9IGZsb3dSaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2Zyb21QYWlycyIgeworICAgIGNvbnN0IGZyb21QYWlyczogdHlwZW9mIF8uZnJvbVBhaXJzOworICAgIGV4cG9ydCA9IGZyb21QYWlyczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2Z1bmN0aW9ucyIgeworICAgIGNvbnN0IGZ1bmN0aW9uczogdHlwZW9mIF8uZnVuY3Rpb25zOworICAgIGV4cG9ydCA9IGZ1bmN0aW9uczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2Z1bmN0aW9uc0luIiB7CisgICAgY29uc3QgZnVuY3Rpb25zSW46IHR5cGVvZiBfLmZ1bmN0aW9uc0luOworICAgIGV4cG9ydCA9IGZ1bmN0aW9uc0luOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZ3JvdXBCeSIgeworICAgIGNvbnN0IGdyb3VwQnk6IHR5cGVvZiBfLmdyb3VwQnk7CisgICAgZXhwb3J0ID0gZ3JvdXBCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2luaXRpYWwiIHsKKyAgICBjb25zdCBpbml0aWFsOiB0eXBlb2YgXy5pbml0aWFsOworICAgIGV4cG9ydCA9IGluaXRpYWw7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pbnRlcnNlY3Rpb24iIHsKKyAgICBjb25zdCBpbnRlcnNlY3Rpb246IHR5cGVvZiBfLmludGVyc2VjdGlvbjsKKyAgICBleHBvcnQgPSBpbnRlcnNlY3Rpb247Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pbnRlcnNlY3Rpb25CeSIgeworICAgIGNvbnN0IGludGVyc2VjdGlvbkJ5OiB0eXBlb2YgXy5pbnRlcnNlY3Rpb25CeTsKKyAgICBleHBvcnQgPSBpbnRlcnNlY3Rpb25CeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2ludGVyc2VjdGlvbldpdGgiIHsKKyAgICBjb25zdCBpbnRlcnNlY3Rpb25XaXRoOiB0eXBlb2YgXy5pbnRlcnNlY3Rpb25XaXRoOworICAgIGV4cG9ydCA9IGludGVyc2VjdGlvbldpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pbnZlcnQiIHsKKyAgICBjb25zdCBpbnZlcnQ6IHR5cGVvZiBfLmludmVydDsKKyAgICBleHBvcnQgPSBpbnZlcnQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pbnZlcnRCeSIgeworICAgIGNvbnN0IGludmVydEJ5OiB0eXBlb2YgXy5pbnZlcnRCeTsKKyAgICBleHBvcnQgPSBpbnZlcnRCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2ludm9rZU1hcCIgeworICAgIGNvbnN0IGludm9rZU1hcDogdHlwZW9mIF8uaW52b2tlTWFwOworICAgIGV4cG9ydCA9IGludm9rZU1hcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2l0ZXJhdGVlIiB7CisgICAgY29uc3QgaXRlcmF0ZWU6IHR5cGVvZiBfLml0ZXJhdGVlOworICAgIGV4cG9ydCA9IGl0ZXJhdGVlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gva2V5QnkiIHsKKyAgICBjb25zdCBrZXlCeTogdHlwZW9mIF8ua2V5Qnk7CisgICAgZXhwb3J0ID0ga2V5Qnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9rZXlzIiB7CisgICAgY29uc3Qga2V5czogdHlwZW9mIF8ua2V5czsKKyAgICBleHBvcnQgPSBrZXlzOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gva2V5c0luIiB7CisgICAgY29uc3Qga2V5c0luOiB0eXBlb2YgXy5rZXlzSW47CisgICAgZXhwb3J0ID0ga2V5c0luOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbWFwIiB7CisgICAgY29uc3QgbWFwOiB0eXBlb2YgXy5tYXA7CisgICAgZXhwb3J0ID0gbWFwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbWFwS2V5cyIgeworICAgIGNvbnN0IG1hcEtleXM6IHR5cGVvZiBfLm1hcEtleXM7CisgICAgZXhwb3J0ID0gbWFwS2V5czsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL21hcFZhbHVlcyIgeworICAgIGNvbnN0IG1hcFZhbHVlczogdHlwZW9mIF8ubWFwVmFsdWVzOworICAgIGV4cG9ydCA9IG1hcFZhbHVlczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL21hdGNoZXMiIHsKKyAgICBjb25zdCBtYXRjaGVzOiB0eXBlb2YgXy5tYXRjaGVzOworICAgIGV4cG9ydCA9IG1hdGNoZXM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9tYXRjaGVzUHJvcGVydHkiIHsKKyAgICBjb25zdCBtYXRjaGVzUHJvcGVydHk6IHR5cGVvZiBfLm1hdGNoZXNQcm9wZXJ0eTsKKyAgICBleHBvcnQgPSBtYXRjaGVzUHJvcGVydHk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9tZW1vaXplIiB7CisgICAgY29uc3QgbWVtb2l6ZTogdHlwZW9mIF8ubWVtb2l6ZTsKKyAgICBleHBvcnQgPSBtZW1vaXplOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbWVyZ2UiIHsKKyAgICBjb25zdCBtZXJnZTogdHlwZW9mIF8ubWVyZ2U7CisgICAgZXhwb3J0ID0gbWVyZ2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9tZXJnZVdpdGgiIHsKKyAgICBjb25zdCBtZXJnZVdpdGg6IHR5cGVvZiBfLm1lcmdlV2l0aDsKKyAgICBleHBvcnQgPSBtZXJnZVdpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9tZXRob2QiIHsKKyAgICBjb25zdCBtZXRob2Q6IHR5cGVvZiBfLm1ldGhvZDsKKyAgICBleHBvcnQgPSBtZXRob2Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9tZXRob2RPZiIgeworICAgIGNvbnN0IG1ldGhvZE9mOiB0eXBlb2YgXy5tZXRob2RPZjsKKyAgICBleHBvcnQgPSBtZXRob2RPZjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL21peGluIiB7CisgICAgY29uc3QgbWl4aW46IHR5cGVvZiBfLm1peGluOworICAgIGV4cG9ydCA9IG1peGluOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbmVnYXRlIiB7CisgICAgY29uc3QgbmVnYXRlOiB0eXBlb2YgXy5uZWdhdGU7CisgICAgZXhwb3J0ID0gbmVnYXRlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbnRoQXJnIiB7CisgICAgY29uc3QgbnRoQXJnOiB0eXBlb2YgXy5udGhBcmc7CisgICAgZXhwb3J0ID0gbnRoQXJnOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvb21pdCIgeworICAgIGNvbnN0IG9taXQ6IHR5cGVvZiBfLm9taXQ7CisgICAgZXhwb3J0ID0gb21pdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL29taXRCeSIgeworICAgIGNvbnN0IG9taXRCeTogdHlwZW9mIF8ub21pdEJ5OworICAgIGV4cG9ydCA9IG9taXRCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL29uY2UiIHsKKyAgICBjb25zdCBvbmNlOiB0eXBlb2YgXy5vbmNlOworICAgIGV4cG9ydCA9IG9uY2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9vcmRlckJ5IiB7CisgICAgY29uc3Qgb3JkZXJCeTogdHlwZW9mIF8ub3JkZXJCeTsKKyAgICBleHBvcnQgPSBvcmRlckJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvb3ZlciIgeworICAgIGNvbnN0IG92ZXI6IHR5cGVvZiBfLm92ZXI7CisgICAgZXhwb3J0ID0gb3ZlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL292ZXJBcmdzIiB7CisgICAgY29uc3Qgb3ZlckFyZ3M6IHR5cGVvZiBfLm92ZXJBcmdzOworICAgIGV4cG9ydCA9IG92ZXJBcmdzOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvb3ZlckV2ZXJ5IiB7CisgICAgY29uc3Qgb3ZlckV2ZXJ5OiB0eXBlb2YgXy5vdmVyRXZlcnk7CisgICAgZXhwb3J0ID0gb3ZlckV2ZXJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvb3ZlclNvbWUiIHsKKyAgICBjb25zdCBvdmVyU29tZTogdHlwZW9mIF8ub3ZlclNvbWU7CisgICAgZXhwb3J0ID0gb3ZlclNvbWU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9wYXJ0aWFsIiB7CisgICAgY29uc3QgcGFydGlhbDogdHlwZW9mIF8ucGFydGlhbDsKKyAgICBleHBvcnQgPSBwYXJ0aWFsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcGFydGlhbFJpZ2h0IiB7CisgICAgY29uc3QgcGFydGlhbFJpZ2h0OiB0eXBlb2YgXy5wYXJ0aWFsUmlnaHQ7CisgICAgZXhwb3J0ID0gcGFydGlhbFJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcGFydGl0aW9uIiB7CisgICAgY29uc3QgcGFydGl0aW9uOiB0eXBlb2YgXy5wYXJ0aXRpb247CisgICAgZXhwb3J0ID0gcGFydGl0aW9uOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcGljayIgeworICAgIGNvbnN0IHBpY2s6IHR5cGVvZiBfLnBpY2s7CisgICAgZXhwb3J0ID0gcGljazsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3BpY2tCeSIgeworICAgIGNvbnN0IHBpY2tCeTogdHlwZW9mIF8ucGlja0J5OworICAgIGV4cG9ydCA9IHBpY2tCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3Byb3BlcnR5IiB7CisgICAgY29uc3QgcHJvcGVydHk6IHR5cGVvZiBfLnByb3BlcnR5OworICAgIGV4cG9ydCA9IHByb3BlcnR5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcHJvcGVydHlPZiIgeworICAgIGNvbnN0IHByb3BlcnR5T2Y6IHR5cGVvZiBfLnByb3BlcnR5T2Y7CisgICAgZXhwb3J0ID0gcHJvcGVydHlPZjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3B1bGwiIHsKKyAgICBjb25zdCBwdWxsOiB0eXBlb2YgXy5wdWxsOworICAgIGV4cG9ydCA9IHB1bGw7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9wdWxsQWxsIiB7CisgICAgY29uc3QgcHVsbEFsbDogdHlwZW9mIF8ucHVsbEFsbDsKKyAgICBleHBvcnQgPSBwdWxsQWxsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcHVsbEFsbEJ5IiB7CisgICAgY29uc3QgcHVsbEFsbEJ5OiB0eXBlb2YgXy5wdWxsQWxsQnk7CisgICAgZXhwb3J0ID0gcHVsbEFsbEJ5OworfQorCisvKioKKyAqIHVuY29tZW50IGl0IGlmIGRlZmluaXRpb24gZXhpc3RzCisgKi8KKy8qCisgZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9wdWxsQWxsV2l0aCIgeworIGNvbnN0IHB1bGxBbGxXaXRoOiB0eXBlb2YgXy5wdWxsQWxsV2l0aDsKKyBleHBvcnQgPSBwdWxsQWxsV2l0aDsKKyB9CisgKi8KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9wdWxsQXQiIHsKKyAgICBjb25zdCBwdWxsQXQ6IHR5cGVvZiBfLnB1bGxBdDsKKyAgICBleHBvcnQgPSBwdWxsQXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9yYW5nZSIgeworICAgIGNvbnN0IHJhbmdlOiB0eXBlb2YgXy5yYW5nZTsKKyAgICBleHBvcnQgPSByYW5nZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3JhbmdlUmlnaHQiIHsKKyAgICBjb25zdCByYW5nZVJpZ2h0OiB0eXBlb2YgXy5yYW5nZVJpZ2h0OworICAgIGV4cG9ydCA9IHJhbmdlUmlnaHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9yZWFyZyIgeworICAgIGNvbnN0IHJlYXJnOiB0eXBlb2YgXy5yZWFyZzsKKyAgICBleHBvcnQgPSByZWFyZzsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3JlamVjdCIgeworICAgIGNvbnN0IHJlamVjdDogdHlwZW9mIF8ucmVqZWN0OworICAgIGV4cG9ydCA9IHJlamVjdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3JlbW92ZSIgeworICAgIGNvbnN0IHJlbW92ZTogdHlwZW9mIF8ucmVtb3ZlOworICAgIGV4cG9ydCA9IHJlbW92ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3Jlc3QiIHsKKyAgICBjb25zdCByZXN0OiB0eXBlb2YgXy5yZXN0OworICAgIGV4cG9ydCA9IHJlc3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9yZXZlcnNlIiB7CisgICAgY29uc3QgcmV2ZXJzZTogdHlwZW9mIF8ucmV2ZXJzZTsKKyAgICBleHBvcnQgPSByZXZlcnNlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc2FtcGxlU2l6ZSIgeworICAgIGNvbnN0IHNhbXBsZVNpemU6IHR5cGVvZiBfLnNhbXBsZVNpemU7CisgICAgZXhwb3J0ID0gc2FtcGxlU2l6ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3NldCIgeworICAgIGNvbnN0IHNldDogdHlwZW9mIF8uc2V0OworICAgIGV4cG9ydCA9IHNldDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3NldFdpdGgiIHsKKyAgICBjb25zdCBzZXRXaXRoOiB0eXBlb2YgXy5zZXRXaXRoOworICAgIGV4cG9ydCA9IHNldFdpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zaHVmZmxlIiB7CisgICAgY29uc3Qgc2h1ZmZsZTogdHlwZW9mIF8uc2h1ZmZsZTsKKyAgICBleHBvcnQgPSBzaHVmZmxlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc2xpY2UiIHsKKyAgICBjb25zdCBzbGljZTogdHlwZW9mIF8uc2xpY2U7CisgICAgZXhwb3J0ID0gc2xpY2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zb3J0QnkiIHsKKyAgICBjb25zdCBzb3J0Qnk6IHR5cGVvZiBfLnNvcnRCeTsKKyAgICBleHBvcnQgPSBzb3J0Qnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zb3J0ZWRVbmlxIiB7CisgICAgY29uc3Qgc29ydGVkVW5pcTogdHlwZW9mIF8uc29ydGVkVW5pcTsKKyAgICBleHBvcnQgPSBzb3J0ZWRVbmlxOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc29ydGVkVW5pcUJ5IiB7CisgICAgY29uc3Qgc29ydGVkVW5pcUJ5OiB0eXBlb2YgXy5zb3J0ZWRVbmlxQnk7CisgICAgZXhwb3J0ID0gc29ydGVkVW5pcUJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc3BsaXQiIHsKKyAgICBjb25zdCBzcGxpdDogdHlwZW9mIF8uc3BsaXQ7CisgICAgZXhwb3J0ID0gc3BsaXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zcHJlYWQiIHsKKyAgICBjb25zdCBzcHJlYWQ6IHR5cGVvZiBfLnNwcmVhZDsKKyAgICBleHBvcnQgPSBzcHJlYWQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC90YWlsIiB7CisgICAgY29uc3QgdGFpbDogdHlwZW9mIF8udGFpbDsKKyAgICBleHBvcnQgPSB0YWlsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdGFrZSIgeworICAgIGNvbnN0IHRha2U6IHR5cGVvZiBfLnRha2U7CisgICAgZXhwb3J0ID0gdGFrZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3Rha2VSaWdodCIgeworICAgIGNvbnN0IHRha2VSaWdodDogdHlwZW9mIF8udGFrZVJpZ2h0OworICAgIGV4cG9ydCA9IHRha2VSaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3Rha2VSaWdodFdoaWxlIiB7CisgICAgY29uc3QgdGFrZVJpZ2h0V2hpbGU6IHR5cGVvZiBfLnRha2VSaWdodFdoaWxlOworICAgIGV4cG9ydCA9IHRha2VSaWdodFdoaWxlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdGFrZVdoaWxlIiB7CisgICAgY29uc3QgdGFrZVdoaWxlOiB0eXBlb2YgXy50YWtlV2hpbGU7CisgICAgZXhwb3J0ID0gdGFrZVdoaWxlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdGFwIiB7CisgICAgY29uc3QgdGFwOiB0eXBlb2YgXy50YXA7CisgICAgZXhwb3J0ID0gdGFwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdGhyb3R0bGUiIHsKKyAgICBjb25zdCB0aHJvdHRsZTogdHlwZW9mIF8udGhyb3R0bGU7CisgICAgZXhwb3J0ID0gdGhyb3R0bGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC90aHJ1IiB7CisgICAgY29uc3QgdGhydTogdHlwZW9mIF8udGhydTsKKyAgICBleHBvcnQgPSB0aHJ1OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdG9BcnJheSIgeworICAgIGNvbnN0IHRvQXJyYXk6IHR5cGVvZiBfLnRvQXJyYXk7CisgICAgZXhwb3J0ID0gdG9BcnJheTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3RvUGFpcnMiIHsKKyAgICBjb25zdCB0b1BhaXJzOiB0eXBlb2YgXy50b1BhaXJzOworICAgIGV4cG9ydCA9IHRvUGFpcnM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC90b1BhaXJzSW4iIHsKKyAgICBjb25zdCB0b1BhaXJzSW46IHR5cGVvZiBfLnRvUGFpcnNJbjsKKyAgICBleHBvcnQgPSB0b1BhaXJzSW47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC90b1BhdGgiIHsKKyAgICBjb25zdCB0b1BhdGg6IHR5cGVvZiBfLnRvUGF0aDsKKyAgICBleHBvcnQgPSB0b1BhdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC90b1BsYWluT2JqZWN0IiB7CisgICAgY29uc3QgdG9QbGFpbk9iamVjdDogdHlwZW9mIF8udG9QbGFpbk9iamVjdDsKKyAgICBleHBvcnQgPSB0b1BsYWluT2JqZWN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdHJhbnNmb3JtIiB7CisgICAgY29uc3QgdHJhbnNmb3JtOiB0eXBlb2YgXy50cmFuc2Zvcm07CisgICAgZXhwb3J0ID0gdHJhbnNmb3JtOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdW5hcnkiIHsKKyAgICBjb25zdCB1bmFyeTogdHlwZW9mIF8udW5hcnk7CisgICAgZXhwb3J0ID0gdW5hcnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC91bmlvbiIgeworICAgIGNvbnN0IHVuaW9uOiB0eXBlb2YgXy51bmlvbjsKKyAgICBleHBvcnQgPSB1bmlvbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3VuaW9uQnkiIHsKKyAgICBjb25zdCB1bmlvbkJ5OiB0eXBlb2YgXy51bmlvbkJ5OworICAgIGV4cG9ydCA9IHVuaW9uQnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC91bmlvbldpdGgiIHsKKyAgICBjb25zdCB1bmlvbldpdGg6IHR5cGVvZiBfLnVuaW9uV2l0aDsKKyAgICBleHBvcnQgPSB1bmlvbldpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC91bmlxIiB7CisgICAgY29uc3QgdW5pcTogdHlwZW9mIF8udW5pcTsKKyAgICBleHBvcnQgPSB1bmlxOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdW5pcUJ5IiB7CisgICAgY29uc3QgdW5pcUJ5OiB0eXBlb2YgXy51bmlxQnk7CisgICAgZXhwb3J0ID0gdW5pcUJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdW5pcVdpdGgiIHsKKyAgICBjb25zdCB1bmlxV2l0aDogdHlwZW9mIF8udW5pcVdpdGg7CisgICAgZXhwb3J0ID0gdW5pcVdpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC91bnNldCIgeworICAgIGNvbnN0IHVuc2V0OiB0eXBlb2YgXy51bnNldDsKKyAgICBleHBvcnQgPSB1bnNldDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3VuemlwIiB7CisgICAgY29uc3QgdW56aXA6IHR5cGVvZiBfLnVuemlwOworICAgIGV4cG9ydCA9IHVuemlwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdW56aXBXaXRoIiB7CisgICAgY29uc3QgdW56aXBXaXRoOiB0eXBlb2YgXy51bnppcFdpdGg7CisgICAgZXhwb3J0ID0gdW56aXBXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdXBkYXRlIiB7CisgICAgY29uc3QgdXBkYXRlOiB0eXBlb2YgXy51cGRhdGU7CisgICAgZXhwb3J0ID0gdXBkYXRlOworfQorCisvKioKKyAqIHVuY29tZW50IGl0IGlmIGRlZmluaXRpb24gZXhpc3RzCisgKi8KKy8qCisgZGVjbGFyZSBtb2R1bGUgImxvZGFzaC91cGRhdGVXaXRoIiB7CisgY29uc3QgdXBkYXRlV2l0aDogdHlwZW9mIF8udXBkYXRlV2l0aDsKKyBleHBvcnQgPSB1cGRhdGVXaXRoOworIH0KKyAqLworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3ZhbHVlcyIgeworICAgIGNvbnN0IHZhbHVlczogdHlwZW9mIF8udmFsdWVzOworICAgIGV4cG9ydCA9IHZhbHVlczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3ZhbHVlc0luIiB7CisgICAgY29uc3QgdmFsdWVzSW46IHR5cGVvZiBfLnZhbHVlc0luOworICAgIGV4cG9ydCA9IHZhbHVlc0luOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvd2l0aG91dCIgeworICAgIGNvbnN0IHdpdGhvdXQ6IHR5cGVvZiBfLndpdGhvdXQ7CisgICAgZXhwb3J0ID0gd2l0aG91dDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3dvcmRzIiB7CisgICAgY29uc3Qgd29yZHM6IHR5cGVvZiBfLndvcmRzOworICAgIGV4cG9ydCA9IHdvcmRzOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvd3JhcCIgeworICAgIGNvbnN0IHdyYXA6IHR5cGVvZiBfLndyYXA7CisgICAgZXhwb3J0ID0gd3JhcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3hvciIgeworICAgIGNvbnN0IHhvcjogdHlwZW9mIF8ueG9yOworICAgIGV4cG9ydCA9IHhvcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3hvckJ5IiB7CisgICAgY29uc3QgeG9yQnk6IHR5cGVvZiBfLnhvckJ5OworICAgIGV4cG9ydCA9IHhvckJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gveG9yV2l0aCIgeworICAgIGNvbnN0IHhvcldpdGg6IHR5cGVvZiBfLnhvcldpdGg7CisgICAgZXhwb3J0ID0geG9yV2l0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3ppcCIgeworICAgIGNvbnN0IHppcDogdHlwZW9mIF8uemlwOworICAgIGV4cG9ydCA9IHppcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3ppcE9iamVjdCIgeworICAgIGNvbnN0IHppcE9iamVjdDogdHlwZW9mIF8uemlwT2JqZWN0OworICAgIGV4cG9ydCA9IHppcE9iamVjdDsKK30KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gvemlwT2JqZWN0RGVlcCIgeworIGNvbnN0IHppcE9iamVjdERlZXA6IHR5cGVvZiBfLnppcE9iamVjdERlZXA7CisgZXhwb3J0ID0gemlwT2JqZWN0RGVlcDsKKyB9CisgKi8KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3ppcFdpdGgiIHsKKyAgICBjb25zdCB6aXBXaXRoOiB0eXBlb2YgXy56aXBXaXRoOworICAgIGV4cG9ydCA9IHppcFdpdGg7Cit9CisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2VudHJpZXMiIHsKKyBjb25zdCBlbnRyaWVzOiB0eXBlb2YgXy5lbnRyaWVzOworIGV4cG9ydCA9IGVudHJpZXM7CisgfQorICovCisvKioKKyAqIHVuY29tZW50IGl0IGlmIGRlZmluaXRpb24gZXhpc3RzCisgKi8KKy8qCisgZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9lbnRyaWVzSW4iIHsKKyBjb25zdCBlbnRyaWVzSW46IHR5cGVvZiBfLmVudHJpZXNJbjsKKyBleHBvcnQgPSBlbnRyaWVzSW47CisgfQorICovCisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9leHRlbmQiIHsKKyAgICBjb25zdCBleHRlbmQ6IHR5cGVvZiBfLmV4dGVuZDsKKyAgICBleHBvcnQgPSBleHRlbmQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9leHRlbmRXaXRoIiB7CisgICAgY29uc3QgZXh0ZW5kV2l0aDogdHlwZW9mIF8uZXh0ZW5kV2l0aDsKKyAgICBleHBvcnQgPSBleHRlbmRXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvYWRkIiB7CisgICAgY29uc3QgYWRkOiB0eXBlb2YgXy5hZGQ7CisgICAgZXhwb3J0ID0gYWRkOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvYXR0ZW1wdCIgeworICAgIGNvbnN0IGF0dGVtcHQ6IHR5cGVvZiBfLmF0dGVtcHQ7CisgICAgZXhwb3J0ID0gYXR0ZW1wdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2NhbWVsQ2FzZSIgeworICAgIGNvbnN0IGNhbWVsQ2FzZTogdHlwZW9mIF8uY2FtZWxDYXNlOworICAgIGV4cG9ydCA9IGNhbWVsQ2FzZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2NhcGl0YWxpemUiIHsKKyAgICBjb25zdCBjYXBpdGFsaXplOiB0eXBlb2YgXy5jYXBpdGFsaXplOworICAgIGV4cG9ydCA9IGNhcGl0YWxpemU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9jZWlsIiB7CisgICAgY29uc3QgY2VpbDogdHlwZW9mIF8uY2VpbDsKKyAgICBleHBvcnQgPSBjZWlsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvY2xhbXAiIHsKKyAgICBjb25zdCBjbGFtcDogdHlwZW9mIF8uY2xhbXA7CisgICAgZXhwb3J0ID0gY2xhbXA7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9jbG9uZSIgeworICAgIGNvbnN0IGNsb25lOiB0eXBlb2YgXy5jbG9uZTsKKyAgICBleHBvcnQgPSBjbG9uZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2Nsb25lRGVlcCIgeworICAgIGNvbnN0IGNsb25lRGVlcDogdHlwZW9mIF8uY2xvbmVEZWVwOworICAgIGV4cG9ydCA9IGNsb25lRGVlcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2Nsb25lRGVlcFdpdGgiIHsKKyAgICBjb25zdCBjbG9uZURlZXBXaXRoOiB0eXBlb2YgXy5jbG9uZURlZXBXaXRoOworICAgIGV4cG9ydCA9IGNsb25lRGVlcFdpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9jbG9uZVdpdGgiIHsKKyAgICBjb25zdCBjbG9uZVdpdGg6IHR5cGVvZiBfLmNsb25lV2l0aDsKKyAgICBleHBvcnQgPSBjbG9uZVdpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9kZWJ1cnIiIHsKKyAgICBjb25zdCBkZWJ1cnI6IHR5cGVvZiBfLmRlYnVycjsKKyAgICBleHBvcnQgPSBkZWJ1cnI7Cit9CisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2RpdmlkZSIgeworIGNvbnN0IGRpdmlkZTogdHlwZW9mIF8uZGl2aWRlOworIGV4cG9ydCA9IGRpdmlkZTsKKyB9CisgKi8KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9lbmRzV2l0aCIgeworICAgIGNvbnN0IGVuZHNXaXRoOiB0eXBlb2YgXy5lbmRzV2l0aDsKKyAgICBleHBvcnQgPSBlbmRzV2l0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2VxIiB7CisgICAgY29uc3QgZXE6IHR5cGVvZiBfLmVxOworICAgIGV4cG9ydCA9IGVxOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZXNjYXBlIiB7CisgICAgY29uc3QgZXNjYXBlOiB0eXBlb2YgXy5lc2NhcGU7CisgICAgZXhwb3J0ID0gZXNjYXBlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZXNjYXBlUmVnRXhwIiB7CisgICAgY29uc3QgZXNjYXBlUmVnRXhwOiB0eXBlb2YgXy5lc2NhcGVSZWdFeHA7CisgICAgZXhwb3J0ID0gZXNjYXBlUmVnRXhwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZXZlcnkiIHsKKyAgICBjb25zdCBldmVyeTogdHlwZW9mIF8uZXZlcnk7CisgICAgZXhwb3J0ID0gZXZlcnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9maW5kIiB7CisgICAgY29uc3QgZmluZDogdHlwZW9mIF8uZmluZDsKKyAgICBleHBvcnQgPSBmaW5kOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmluZEluZGV4IiB7CisgICAgY29uc3QgZmluZEluZGV4OiB0eXBlb2YgXy5maW5kSW5kZXg7CisgICAgZXhwb3J0ID0gZmluZEluZGV4OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmluZEtleSIgeworICAgIGNvbnN0IGZpbmRLZXk6IHR5cGVvZiBfLmZpbmRLZXk7CisgICAgZXhwb3J0ID0gZmluZEtleTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2ZpbmRMYXN0IiB7CisgICAgY29uc3QgZmluZExhc3Q6IHR5cGVvZiBfLmZpbmRMYXN0OworICAgIGV4cG9ydCA9IGZpbmRMYXN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmluZExhc3RJbmRleCIgeworICAgIGNvbnN0IGZpbmRMYXN0SW5kZXg6IHR5cGVvZiBfLmZpbmRMYXN0SW5kZXg7CisgICAgZXhwb3J0ID0gZmluZExhc3RJbmRleDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2ZpbmRMYXN0S2V5IiB7CisgICAgY29uc3QgZmluZExhc3RLZXk6IHR5cGVvZiBfLmZpbmRMYXN0S2V5OworICAgIGV4cG9ydCA9IGZpbmRMYXN0S2V5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZmxvb3IiIHsKKyAgICBjb25zdCBmbG9vcjogdHlwZW9mIF8uZmxvb3I7CisgICAgZXhwb3J0ID0gZmxvb3I7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9mb3JFYWNoIiB7CisgICAgY29uc3QgZm9yRWFjaDogdHlwZW9mIF8uZm9yRWFjaDsKKyAgICBleHBvcnQgPSBmb3JFYWNoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZm9yRWFjaFJpZ2h0IiB7CisgICAgY29uc3QgZm9yRWFjaFJpZ2h0OiB0eXBlb2YgXy5mb3JFYWNoUmlnaHQ7CisgICAgZXhwb3J0ID0gZm9yRWFjaFJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZm9ySW4iIHsKKyAgICBjb25zdCBmb3JJbjogdHlwZW9mIF8uZm9ySW47CisgICAgZXhwb3J0ID0gZm9ySW47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9mb3JJblJpZ2h0IiB7CisgICAgY29uc3QgZm9ySW5SaWdodDogdHlwZW9mIF8uZm9ySW5SaWdodDsKKyAgICBleHBvcnQgPSBmb3JJblJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZm9yT3duIiB7CisgICAgY29uc3QgZm9yT3duOiB0eXBlb2YgXy5mb3JPd247CisgICAgZXhwb3J0ID0gZm9yT3duOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvZm9yT3duUmlnaHQiIHsKKyAgICBjb25zdCBmb3JPd25SaWdodDogdHlwZW9mIF8uZm9yT3duUmlnaHQ7CisgICAgZXhwb3J0ID0gZm9yT3duUmlnaHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9nZXQiIHsKKyAgICBjb25zdCBnZXQ6IHR5cGVvZiBfLmdldDsKKyAgICBleHBvcnQgPSBnZXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9ndCIgeworICAgIGNvbnN0IGd0OiB0eXBlb2YgXy5ndDsKKyAgICBleHBvcnQgPSBndDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2d0ZSIgeworICAgIGNvbnN0IGd0ZTogdHlwZW9mIF8uZ3RlOworICAgIGV4cG9ydCA9IGd0ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2hhcyIgeworICAgIGNvbnN0IGhhczogdHlwZW9mIF8uaGFzOworICAgIGV4cG9ydCA9IGhhczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2hhc0luIiB7CisgICAgY29uc3QgaGFzSW46IHR5cGVvZiBfLmhhc0luOworICAgIGV4cG9ydCA9IGhhc0luOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaGVhZCIgeworICAgIGNvbnN0IGhlYWQ6IHR5cGVvZiBfLmhlYWQ7CisgICAgZXhwb3J0ID0gaGVhZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lkZW50aXR5IiB7CisgICAgY29uc3QgaWRlbnRpdHk6IHR5cGVvZiBfLmlkZW50aXR5OworICAgIGV4cG9ydCA9IGlkZW50aXR5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaW5jbHVkZXMiIHsKKyAgICBjb25zdCBpbmNsdWRlczogdHlwZW9mIF8uaW5jbHVkZXM7CisgICAgZXhwb3J0ID0gaW5jbHVkZXM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pbmRleE9mIiB7CisgICAgY29uc3QgaW5kZXhPZjogdHlwZW9mIF8uaW5kZXhPZjsKKyAgICBleHBvcnQgPSBpbmRleE9mOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaW5SYW5nZSIgeworICAgIGNvbnN0IGluUmFuZ2U6IHR5cGVvZiBfLmluUmFuZ2U7CisgICAgZXhwb3J0ID0gaW5SYW5nZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2ludm9rZSIgeworICAgIGNvbnN0IGludm9rZTogdHlwZW9mIF8uaW52b2tlOworICAgIGV4cG9ydCA9IGludm9rZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzQXJndW1lbnRzIiB7CisgICAgY29uc3QgaXNBcmd1bWVudHM6IHR5cGVvZiBfLmlzQXJndW1lbnRzOworICAgIGV4cG9ydCA9IGlzQXJndW1lbnRzOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNBcnJheSIgeworICAgIGNvbnN0IGlzQXJyYXk6IHR5cGVvZiBfLmlzQXJyYXk7CisgICAgZXhwb3J0ID0gaXNBcnJheTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzQXJyYXlCdWZmZXIiIHsKKyAgICBjb25zdCBpc0FycmF5QnVmZmVyOiB0eXBlb2YgXy5pc0FycmF5QnVmZmVyOworICAgIGV4cG9ydCA9IGlzQXJyYXlCdWZmZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc0FycmF5TGlrZSIgeworICAgIGNvbnN0IGlzQXJyYXlMaWtlOiB0eXBlb2YgXy5pc0FycmF5TGlrZTsKKyAgICBleHBvcnQgPSBpc0FycmF5TGlrZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0IiB7CisgICAgY29uc3QgaXNBcnJheUxpa2VPYmplY3Q6IHR5cGVvZiBfLmlzQXJyYXlMaWtlT2JqZWN0OworICAgIGV4cG9ydCA9IGlzQXJyYXlMaWtlT2JqZWN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNCb29sZWFuIiB7CisgICAgY29uc3QgaXNCb29sZWFuOiB0eXBlb2YgXy5pc0Jvb2xlYW47CisgICAgZXhwb3J0ID0gaXNCb29sZWFuOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNCdWZmZXIiIHsKKyAgICBjb25zdCBpc0J1ZmZlcjogdHlwZW9mIF8uaXNCdWZmZXI7CisgICAgZXhwb3J0ID0gaXNCdWZmZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc0RhdGUiIHsKKyAgICBjb25zdCBpc0RhdGU6IHR5cGVvZiBfLmlzRGF0ZTsKKyAgICBleHBvcnQgPSBpc0RhdGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc0VsZW1lbnQiIHsKKyAgICBjb25zdCBpc0VsZW1lbnQ6IHR5cGVvZiBfLmlzRWxlbWVudDsKKyAgICBleHBvcnQgPSBpc0VsZW1lbnQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc0VtcHR5IiB7CisgICAgY29uc3QgaXNFbXB0eTogdHlwZW9mIF8uaXNFbXB0eTsKKyAgICBleHBvcnQgPSBpc0VtcHR5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNFcXVhbCIgeworICAgIGNvbnN0IGlzRXF1YWw6IHR5cGVvZiBfLmlzRXF1YWw7CisgICAgZXhwb3J0ID0gaXNFcXVhbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzRXF1YWxXaXRoIiB7CisgICAgY29uc3QgaXNFcXVhbFdpdGg6IHR5cGVvZiBfLmlzRXF1YWxXaXRoOworICAgIGV4cG9ydCA9IGlzRXF1YWxXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNFcnJvciIgeworICAgIGNvbnN0IGlzRXJyb3I6IHR5cGVvZiBfLmlzRXJyb3I7CisgICAgZXhwb3J0ID0gaXNFcnJvcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzRmluaXRlIiB7CisgICAgY29uc3QgaXNGaW5pdGU6IHR5cGVvZiBfLmlzRmluaXRlOworICAgIGV4cG9ydCA9IGlzRmluaXRlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNGdW5jdGlvbiIgeworICAgIGNvbnN0IGlzRnVuY3Rpb246IHR5cGVvZiBfLmlzRnVuY3Rpb247CisgICAgZXhwb3J0ID0gaXNGdW5jdGlvbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzSW50ZWdlciIgeworICAgIGNvbnN0IGlzSW50ZWdlcjogdHlwZW9mIF8uaXNJbnRlZ2VyOworICAgIGV4cG9ydCA9IGlzSW50ZWdlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzTGVuZ3RoIiB7CisgICAgY29uc3QgaXNMZW5ndGg6IHR5cGVvZiBfLmlzTGVuZ3RoOworICAgIGV4cG9ydCA9IGlzTGVuZ3RoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNNYXAiIHsKKyAgICBjb25zdCBpc01hcDogdHlwZW9mIF8uaXNNYXA7CisgICAgZXhwb3J0ID0gaXNNYXA7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc01hdGNoIiB7CisgICAgY29uc3QgaXNNYXRjaDogdHlwZW9mIF8uaXNNYXRjaDsKKyAgICBleHBvcnQgPSBpc01hdGNoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNNYXRjaFdpdGgiIHsKKyAgICBjb25zdCBpc01hdGNoV2l0aDogdHlwZW9mIF8uaXNNYXRjaFdpdGg7CisgICAgZXhwb3J0ID0gaXNNYXRjaFdpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc05hTiIgeworICAgIGNvbnN0IGlzTmFOOiB0eXBlb2YgXy5pc05hTjsKKyAgICBleHBvcnQgPSBpc05hTjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzTmF0aXZlIiB7CisgICAgY29uc3QgaXNOYXRpdmU6IHR5cGVvZiBfLmlzTmF0aXZlOworICAgIGV4cG9ydCA9IGlzTmF0aXZlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNOaWwiIHsKKyAgICBjb25zdCBpc05pbDogdHlwZW9mIF8uaXNOaWw7CisgICAgZXhwb3J0ID0gaXNOaWw7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc051bGwiIHsKKyAgICBjb25zdCBpc051bGw6IHR5cGVvZiBfLmlzTnVsbDsKKyAgICBleHBvcnQgPSBpc051bGw7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc051bWJlciIgeworICAgIGNvbnN0IGlzTnVtYmVyOiB0eXBlb2YgXy5pc051bWJlcjsKKyAgICBleHBvcnQgPSBpc051bWJlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzT2JqZWN0IiB7CisgICAgY29uc3QgaXNPYmplY3Q6IHR5cGVvZiBfLmlzT2JqZWN0OworICAgIGV4cG9ydCA9IGlzT2JqZWN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNPYmplY3RMaWtlIiB7CisgICAgY29uc3QgaXNPYmplY3RMaWtlOiB0eXBlb2YgXy5pc09iamVjdExpa2U7CisgICAgZXhwb3J0ID0gaXNPYmplY3RMaWtlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNQbGFpbk9iamVjdCIgeworICAgIGNvbnN0IGlzUGxhaW5PYmplY3Q6IHR5cGVvZiBfLmlzUGxhaW5PYmplY3Q7CisgICAgZXhwb3J0ID0gaXNQbGFpbk9iamVjdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzUmVnRXhwIiB7CisgICAgY29uc3QgaXNSZWdFeHA6IHR5cGVvZiBfLmlzUmVnRXhwOworICAgIGV4cG9ydCA9IGlzUmVnRXhwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNTYWZlSW50ZWdlciIgeworICAgIGNvbnN0IGlzU2FmZUludGVnZXI6IHR5cGVvZiBfLmlzU2FmZUludGVnZXI7CisgICAgZXhwb3J0ID0gaXNTYWZlSW50ZWdlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzU2V0IiB7CisgICAgY29uc3QgaXNTZXQ6IHR5cGVvZiBfLmlzU2V0OworICAgIGV4cG9ydCA9IGlzU2V0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNTdHJpbmciIHsKKyAgICBjb25zdCBpc1N0cmluZzogdHlwZW9mIF8uaXNTdHJpbmc7CisgICAgZXhwb3J0ID0gaXNTdHJpbmc7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9pc1N5bWJvbCIgeworICAgIGNvbnN0IGlzU3ltYm9sOiB0eXBlb2YgXy5pc1N5bWJvbDsKKyAgICBleHBvcnQgPSBpc1N5bWJvbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzVHlwZWRBcnJheSIgeworICAgIGNvbnN0IGlzVHlwZWRBcnJheTogdHlwZW9mIF8uaXNUeXBlZEFycmF5OworICAgIGV4cG9ydCA9IGlzVHlwZWRBcnJheTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2lzVW5kZWZpbmVkIiB7CisgICAgY29uc3QgaXNVbmRlZmluZWQ6IHR5cGVvZiBfLmlzVW5kZWZpbmVkOworICAgIGV4cG9ydCA9IGlzVW5kZWZpbmVkOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNXZWFrTWFwIiB7CisgICAgY29uc3QgaXNXZWFrTWFwOiB0eXBlb2YgXy5pc1dlYWtNYXA7CisgICAgZXhwb3J0ID0gaXNXZWFrTWFwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvaXNXZWFrU2V0IiB7CisgICAgY29uc3QgaXNXZWFrU2V0OiB0eXBlb2YgXy5pc1dlYWtTZXQ7CisgICAgZXhwb3J0ID0gaXNXZWFrU2V0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvam9pbiIgeworICAgIGNvbnN0IGpvaW46IHR5cGVvZiBfLmpvaW47CisgICAgZXhwb3J0ID0gam9pbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2tlYmFiQ2FzZSIgeworICAgIGNvbnN0IGtlYmFiQ2FzZTogdHlwZW9mIF8ua2ViYWJDYXNlOworICAgIGV4cG9ydCA9IGtlYmFiQ2FzZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2xhc3QiIHsKKyAgICBjb25zdCBsYXN0OiB0eXBlb2YgXy5sYXN0OworICAgIGV4cG9ydCA9IGxhc3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9sYXN0SW5kZXhPZiIgeworICAgIGNvbnN0IGxhc3RJbmRleE9mOiB0eXBlb2YgXy5sYXN0SW5kZXhPZjsKKyAgICBleHBvcnQgPSBsYXN0SW5kZXhPZjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2xvd2VyQ2FzZSIgeworICAgIGNvbnN0IGxvd2VyQ2FzZTogdHlwZW9mIF8ubG93ZXJDYXNlOworICAgIGV4cG9ydCA9IGxvd2VyQ2FzZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2xvd2VyRmlyc3QiIHsKKyAgICBjb25zdCBsb3dlckZpcnN0OiB0eXBlb2YgXy5sb3dlckZpcnN0OworICAgIGV4cG9ydCA9IGxvd2VyRmlyc3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9sdCIgeworICAgIGNvbnN0IGx0OiB0eXBlb2YgXy5sdDsKKyAgICBleHBvcnQgPSBsdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2x0ZSIgeworICAgIGNvbnN0IGx0ZTogdHlwZW9mIF8ubHRlOworICAgIGV4cG9ydCA9IGx0ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL21heCIgeworICAgIGNvbnN0IG1heDogdHlwZW9mIF8ubWF4OworICAgIGV4cG9ydCA9IG1heDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL21heEJ5IiB7CisgICAgY29uc3QgbWF4Qnk6IHR5cGVvZiBfLm1heEJ5OworICAgIGV4cG9ydCA9IG1heEJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbWVhbiIgeworICAgIGNvbnN0IG1lYW46IHR5cGVvZiBfLm1lYW47CisgICAgZXhwb3J0ID0gbWVhbjsKK30KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbWVhbkJ5IiB7CisgY29uc3QgbWVhbkJ5OiB0eXBlb2YgXy5tZWFuQnk7CisgZXhwb3J0ID0gbWVhbkJ5OworIH0KKyAqLworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL21pbiIgeworICAgIGNvbnN0IG1pbjogdHlwZW9mIF8ubWluOworICAgIGV4cG9ydCA9IG1pbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL21pbkJ5IiB7CisgICAgY29uc3QgbWluQnk6IHR5cGVvZiBfLm1pbkJ5OworICAgIGV4cG9ydCA9IG1pbkJ5OworfQorCisvKioKKyAqIHVuY29tZW50IGl0IGlmIGRlZmluaXRpb24gZXhpc3RzCisgKi8KKy8qCisgZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9tdWx0aXBseSIgeworIGNvbnN0IG11bHRpcGx5OiB0eXBlb2YgXy5tdWx0aXBseTsKKyBleHBvcnQgPSBtdWx0aXBseTsKKyB9CisgKi8KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbnRoIiB7CisgY29uc3QgbnRoOiB0eXBlb2YgXy5udGg7CisgZXhwb3J0ID0gbnRoOworIH0KKyAqLworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL25vQ29uZmxpY3QiIHsKKyAgICBjb25zdCBub0NvbmZsaWN0OiB0eXBlb2YgXy5ub0NvbmZsaWN0OworICAgIGV4cG9ydCA9IG5vQ29uZmxpY3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9ub29wIiB7CisgICAgY29uc3Qgbm9vcDogdHlwZW9mIF8ubm9vcDsKKyAgICBleHBvcnQgPSBub29wOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvbm93IiB7CisgICAgY29uc3Qgbm93OiB0eXBlb2YgXy5ub3c7CisgICAgZXhwb3J0ID0gbm93OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcGFkIiB7CisgICAgY29uc3QgcGFkOiB0eXBlb2YgXy5wYWQ7CisgICAgZXhwb3J0ID0gcGFkOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcGFkRW5kIiB7CisgICAgY29uc3QgcGFkRW5kOiB0eXBlb2YgXy5wYWRFbmQ7CisgICAgZXhwb3J0ID0gcGFkRW5kOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcGFkU3RhcnQiIHsKKyAgICBjb25zdCBwYWRTdGFydDogdHlwZW9mIF8ucGFkU3RhcnQ7CisgICAgZXhwb3J0ID0gcGFkU3RhcnQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9wYXJzZUludCIgeworICAgIGNvbnN0IHBhcnNlSW50OiB0eXBlb2YgXy5wYXJzZUludDsKKyAgICBleHBvcnQgPSBwYXJzZUludDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3JhbmRvbSIgeworICAgIGNvbnN0IHJhbmRvbTogdHlwZW9mIF8ucmFuZG9tOworICAgIGV4cG9ydCA9IHJhbmRvbTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3JlZHVjZSIgeworICAgIGNvbnN0IHJlZHVjZTogdHlwZW9mIF8ucmVkdWNlOworICAgIGV4cG9ydCA9IHJlZHVjZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3JlZHVjZVJpZ2h0IiB7CisgICAgY29uc3QgcmVkdWNlUmlnaHQ6IHR5cGVvZiBfLnJlZHVjZVJpZ2h0OworICAgIGV4cG9ydCA9IHJlZHVjZVJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcmVwZWF0IiB7CisgICAgY29uc3QgcmVwZWF0OiB0eXBlb2YgXy5yZXBlYXQ7CisgICAgZXhwb3J0ID0gcmVwZWF0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcmVwbGFjZSIgeworICAgIGNvbnN0IHJlcGxhY2U6IHR5cGVvZiBfLnJlcGxhY2U7CisgICAgZXhwb3J0ID0gcmVwbGFjZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3Jlc3VsdCIgeworICAgIGNvbnN0IHJlc3VsdDogdHlwZW9mIF8ucmVzdWx0OworICAgIGV4cG9ydCA9IHJlc3VsdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3JvdW5kIiB7CisgICAgY29uc3Qgcm91bmQ6IHR5cGVvZiBfLnJvdW5kOworICAgIGV4cG9ydCA9IHJvdW5kOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvcnVuSW5Db250ZXh0IiB7CisgICAgY29uc3QgcnVuSW5Db250ZXh0OiB0eXBlb2YgXy5ydW5JbkNvbnRleHQ7CisgICAgZXhwb3J0ID0gcnVuSW5Db250ZXh0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc2FtcGxlIiB7CisgICAgY29uc3Qgc2FtcGxlOiB0eXBlb2YgXy5zYW1wbGU7CisgICAgZXhwb3J0ID0gc2FtcGxlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc2l6ZSIgeworICAgIGNvbnN0IHNpemU6IHR5cGVvZiBfLnNpemU7CisgICAgZXhwb3J0ID0gc2l6ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3NuYWtlQ2FzZSIgeworICAgIGNvbnN0IHNuYWtlQ2FzZTogdHlwZW9mIF8uc25ha2VDYXNlOworICAgIGV4cG9ydCA9IHNuYWtlQ2FzZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3NvbWUiIHsKKyAgICBjb25zdCBzb21lOiB0eXBlb2YgXy5zb21lOworICAgIGV4cG9ydCA9IHNvbWU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zb3J0ZWRJbmRleCIgeworICAgIGNvbnN0IHNvcnRlZEluZGV4OiB0eXBlb2YgXy5zb3J0ZWRJbmRleDsKKyAgICBleHBvcnQgPSBzb3J0ZWRJbmRleDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3NvcnRlZEluZGV4QnkiIHsKKyAgICBjb25zdCBzb3J0ZWRJbmRleEJ5OiB0eXBlb2YgXy5zb3J0ZWRJbmRleEJ5OworICAgIGV4cG9ydCA9IHNvcnRlZEluZGV4Qnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zb3J0ZWRJbmRleE9mIiB7CisgICAgY29uc3Qgc29ydGVkSW5kZXhPZjogdHlwZW9mIF8uc29ydGVkSW5kZXhPZjsKKyAgICBleHBvcnQgPSBzb3J0ZWRJbmRleE9mOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc29ydGVkTGFzdEluZGV4IiB7CisgICAgY29uc3Qgc29ydGVkTGFzdEluZGV4OiB0eXBlb2YgXy5zb3J0ZWRMYXN0SW5kZXg7CisgICAgZXhwb3J0ID0gc29ydGVkTGFzdEluZGV4OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvc29ydGVkTGFzdEluZGV4QnkiIHsKKyAgICBjb25zdCBzb3J0ZWRMYXN0SW5kZXhCeTogdHlwZW9mIF8uc29ydGVkTGFzdEluZGV4Qnk7CisgICAgZXhwb3J0ID0gc29ydGVkTGFzdEluZGV4Qnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zb3J0ZWRMYXN0SW5kZXhPZiIgeworICAgIGNvbnN0IHNvcnRlZExhc3RJbmRleE9mOiB0eXBlb2YgXy5zb3J0ZWRMYXN0SW5kZXhPZjsKKyAgICBleHBvcnQgPSBzb3J0ZWRMYXN0SW5kZXhPZjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3N0YXJ0Q2FzZSIgeworICAgIGNvbnN0IHN0YXJ0Q2FzZTogdHlwZW9mIF8uc3RhcnRDYXNlOworICAgIGV4cG9ydCA9IHN0YXJ0Q2FzZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3N0YXJ0c1dpdGgiIHsKKyAgICBjb25zdCBzdGFydHNXaXRoOiB0eXBlb2YgXy5zdGFydHNXaXRoOworICAgIGV4cG9ydCA9IHN0YXJ0c1dpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9zdWJ0cmFjdCIgeworICAgIGNvbnN0IHN1YnRyYWN0OiB0eXBlb2YgXy5zdWJ0cmFjdDsKKyAgICBleHBvcnQgPSBzdWJ0cmFjdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3N1bSIgeworICAgIGNvbnN0IHN1bTogdHlwZW9mIF8uc3VtOworICAgIGV4cG9ydCA9IHN1bTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3N1bUJ5IiB7CisgICAgY29uc3Qgc3VtQnk6IHR5cGVvZiBfLnN1bUJ5OworICAgIGV4cG9ydCA9IHN1bUJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdGVtcGxhdGUiIHsKKyAgICBjb25zdCB0ZW1wbGF0ZTogdHlwZW9mIF8udGVtcGxhdGU7CisgICAgZXhwb3J0ID0gdGVtcGxhdGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC90aW1lcyIgeworICAgIGNvbnN0IHRpbWVzOiB0eXBlb2YgXy50aW1lczsKKyAgICBleHBvcnQgPSB0aW1lczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3RvSW50ZWdlciIgeworICAgIGNvbnN0IHRvSW50ZWdlcjogdHlwZW9mIF8udG9JbnRlZ2VyOworICAgIGV4cG9ydCA9IHRvSW50ZWdlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3RvTGVuZ3RoIiB7CisgICAgY29uc3QgdG9MZW5ndGg6IHR5cGVvZiBfLnRvTGVuZ3RoOworICAgIGV4cG9ydCA9IHRvTGVuZ3RoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdG9Mb3dlciIgeworICAgIGNvbnN0IHRvTG93ZXI6IHR5cGVvZiBfLnRvTG93ZXI7CisgICAgZXhwb3J0ID0gdG9Mb3dlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3RvTnVtYmVyIiB7CisgICAgY29uc3QgdG9OdW1iZXI6IHR5cGVvZiBfLnRvTnVtYmVyOworICAgIGV4cG9ydCA9IHRvTnVtYmVyOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdG9TYWZlSW50ZWdlciIgeworICAgIGNvbnN0IHRvU2FmZUludGVnZXI6IHR5cGVvZiBfLnRvU2FmZUludGVnZXI7CisgICAgZXhwb3J0ID0gdG9TYWZlSW50ZWdlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3RvU3RyaW5nIiB7CisgICAgY29uc3QgdG9TdHJpbmc6IHR5cGVvZiBfLnRvU3RyaW5nOworICAgIGV4cG9ydCA9IHRvU3RyaW5nOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdG9VcHBlciIgeworICAgIGNvbnN0IHRvVXBwZXI6IHR5cGVvZiBfLnRvVXBwZXI7CisgICAgZXhwb3J0ID0gdG9VcHBlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3RyaW0iIHsKKyAgICBjb25zdCB0cmltOiB0eXBlb2YgXy50cmltOworICAgIGV4cG9ydCA9IHRyaW07Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC90cmltRW5kIiB7CisgICAgY29uc3QgdHJpbUVuZDogdHlwZW9mIF8udHJpbUVuZDsKKyAgICBleHBvcnQgPSB0cmltRW5kOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdHJpbVN0YXJ0IiB7CisgICAgY29uc3QgdHJpbVN0YXJ0OiB0eXBlb2YgXy50cmltU3RhcnQ7CisgICAgZXhwb3J0ID0gdHJpbVN0YXJ0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdHJ1bmNhdGUiIHsKKyAgICBjb25zdCB0cnVuY2F0ZTogdHlwZW9mIF8udHJ1bmNhdGU7CisgICAgZXhwb3J0ID0gdHJ1bmNhdGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC91bmVzY2FwZSIgeworICAgIGNvbnN0IHVuZXNjYXBlOiB0eXBlb2YgXy51bmVzY2FwZTsKKyAgICBleHBvcnQgPSB1bmVzY2FwZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL3VuaXF1ZUlkIiB7CisgICAgY29uc3QgdW5pcXVlSWQ6IHR5cGVvZiBfLnVuaXF1ZUlkOworICAgIGV4cG9ydCA9IHVuaXF1ZUlkOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdXBwZXJDYXNlIiB7CisgICAgY29uc3QgdXBwZXJDYXNlOiB0eXBlb2YgXy51cHBlckNhc2U7CisgICAgZXhwb3J0ID0gdXBwZXJDYXNlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gvdXBwZXJGaXJzdCIgeworICAgIGNvbnN0IHVwcGVyRmlyc3Q6IHR5cGVvZiBfLnVwcGVyRmlyc3Q7CisgICAgZXhwb3J0ID0gdXBwZXJGaXJzdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoL2VhY2giIHsKKyAgICBjb25zdCBlYWNoOiB0eXBlb2YgXy5lYWNoOworICAgIGV4cG9ydCA9IGVhY2g7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9lYWNoUmlnaHQiIHsKKyAgICBjb25zdCBlYWNoUmlnaHQ6IHR5cGVvZiBfLmVhY2hSaWdodDsKKyAgICBleHBvcnQgPSBlYWNoUmlnaHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9maXJzdCIgeworICAgIGNvbnN0IGZpcnN0OiB0eXBlb2YgXy5maXJzdDsKKyAgICBleHBvcnQgPSBmaXJzdDsKK30KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC9mcCIgeworICAgIGV4cG9ydCA9IF87Cit9CisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2giIHsKKyAgICBleHBvcnQgPSBfOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBsb2Rhc2ggbWV0aG9kIF8uWFhYIGV4cG9ydGVkIGFzIGEgbW9kdWxlLiAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5hZnRlciIgeworICAgIGNvbnN0IGFmdGVyOiB0eXBlb2YgXy5hZnRlcjsKKyAgICBleHBvcnQgPSBhZnRlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmFyeSIgeworICAgIGNvbnN0IGFyeTogdHlwZW9mIF8uYXJ5OworICAgIGV4cG9ydCA9IGFyeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmFzc2lnbiIgeworICAgIGNvbnN0IGFzc2lnbjogdHlwZW9mIF8uYXNzaWduOworICAgIGV4cG9ydCA9IGFzc2lnbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmFzc2lnbkluIiB7CisgICAgY29uc3QgYXNzaWduSW46IHR5cGVvZiBfLmFzc2lnbkluOworICAgIGV4cG9ydCA9IGFzc2lnbkluOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guYXNzaWduSW5XaXRoIiB7CisgICAgY29uc3QgYXNzaWduSW5XaXRoOiB0eXBlb2YgXy5hc3NpZ25JbldpdGg7CisgICAgZXhwb3J0ID0gYXNzaWduSW5XaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guYXNzaWduV2l0aCIgeworICAgIGNvbnN0IGFzc2lnbldpdGg6IHR5cGVvZiBfLmFzc2lnbldpdGg7CisgICAgZXhwb3J0ID0gYXNzaWduV2l0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmF0IiB7CisgICAgY29uc3QgYXQ6IHR5cGVvZiBfLmF0OworICAgIGV4cG9ydCA9IGF0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guYmVmb3JlIiB7CisgICAgY29uc3QgYmVmb3JlOiB0eXBlb2YgXy5iZWZvcmU7CisgICAgZXhwb3J0ID0gYmVmb3JlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guYmluZCIgeworICAgIGNvbnN0IGJpbmQ6IHR5cGVvZiBfLmJpbmQ7CisgICAgZXhwb3J0ID0gYmluZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmJpbmRBbGwiIHsKKyAgICBjb25zdCBiaW5kQWxsOiB0eXBlb2YgXy5iaW5kQWxsOworICAgIGV4cG9ydCA9IGJpbmRBbGw7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5iaW5kS2V5IiB7CisgICAgY29uc3QgYmluZEtleTogdHlwZW9mIF8uYmluZEtleTsKKyAgICBleHBvcnQgPSBiaW5kS2V5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guY2FzdEFycmF5IiB7CisgICAgY29uc3QgY2FzdEFycmF5OiB0eXBlb2YgXy5jYXN0QXJyYXk7CisgICAgZXhwb3J0ID0gY2FzdEFycmF5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guY2hhaW4iIHsKKyAgICBjb25zdCBjaGFpbjogdHlwZW9mIF8uY2hhaW47CisgICAgZXhwb3J0ID0gY2hhaW47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5jaHVuayIgeworICAgIGNvbnN0IGNodW5rOiB0eXBlb2YgXy5jaHVuazsKKyAgICBleHBvcnQgPSBjaHVuazsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmNvbXBhY3QiIHsKKyAgICBjb25zdCBjb21wYWN0OiB0eXBlb2YgXy5jb21wYWN0OworICAgIGV4cG9ydCA9IGNvbXBhY3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5jb25jYXQiIHsKKyAgICBjb25zdCBjb25jYXQ6IHR5cGVvZiBfLmNvbmNhdDsKKyAgICBleHBvcnQgPSBjb25jYXQ7Cit9CisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmNvbmQiIHsKKyBjb25zdCBjb25kOiB0eXBlb2YgXy5jb25kOworIGV4cG9ydCA9IGNvbmQ7CisgfQorICovCisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmNvbmZvcm1zIiB7CisgY29uc3QgY29uZm9ybXM6IHR5cGVvZiBfLmNvbmZvcm1zOworIGV4cG9ydCA9IGNvbmZvcm1zOworIH0KKyAqLworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmNvbnN0YW50IiB7CisgICAgY29uc3QgY29uc3RhbnQ6IHR5cGVvZiBfLmNvbnN0YW50OworICAgIGV4cG9ydCA9IGNvbnN0YW50OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guY291bnRCeSIgeworICAgIGNvbnN0IGNvdW50Qnk6IHR5cGVvZiBfLmNvdW50Qnk7CisgICAgZXhwb3J0ID0gY291bnRCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmNyZWF0ZSIgeworICAgIGNvbnN0IGNyZWF0ZTogdHlwZW9mIF8uY3JlYXRlOworICAgIGV4cG9ydCA9IGNyZWF0ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmN1cnJ5IiB7CisgICAgY29uc3QgY3Vycnk6IHR5cGVvZiBfLmN1cnJ5OworICAgIGV4cG9ydCA9IGN1cnJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guY3VycnlSaWdodCIgeworICAgIGNvbnN0IGN1cnJ5UmlnaHQ6IHR5cGVvZiBfLmN1cnJ5UmlnaHQ7CisgICAgZXhwb3J0ID0gY3VycnlSaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmRlYm91bmNlIiB7CisgICAgY29uc3QgZGVib3VuY2U6IHR5cGVvZiBfLmRlYm91bmNlOworICAgIGV4cG9ydCA9IGRlYm91bmNlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZGVmYXVsdHMiIHsKKyAgICBjb25zdCBkZWZhdWx0czogdHlwZW9mIF8uZGVmYXVsdHM7CisgICAgZXhwb3J0ID0gZGVmYXVsdHM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5kZWZhdWx0c0RlZXAiIHsKKyAgICBjb25zdCBkZWZhdWx0c0RlZXA6IHR5cGVvZiBfLmRlZmF1bHRzRGVlcDsKKyAgICBleHBvcnQgPSBkZWZhdWx0c0RlZXA7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5kZWZlciIgeworICAgIGNvbnN0IGRlZmVyOiB0eXBlb2YgXy5kZWZlcjsKKyAgICBleHBvcnQgPSBkZWZlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmRlbGF5IiB7CisgICAgY29uc3QgZGVsYXk6IHR5cGVvZiBfLmRlbGF5OworICAgIGV4cG9ydCA9IGRlbGF5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZGlmZmVyZW5jZSIgeworICAgIGNvbnN0IGRpZmZlcmVuY2U6IHR5cGVvZiBfLmRpZmZlcmVuY2U7CisgICAgZXhwb3J0ID0gZGlmZmVyZW5jZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmRpZmZlcmVuY2VCeSIgeworICAgIGNvbnN0IGRpZmZlcmVuY2VCeTogdHlwZW9mIF8uZGlmZmVyZW5jZUJ5OworICAgIGV4cG9ydCA9IGRpZmZlcmVuY2VCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmRpZmZlcmVuY2VXaXRoIiB7CisgICAgY29uc3QgZGlmZmVyZW5jZVdpdGg6IHR5cGVvZiBfLmRpZmZlcmVuY2VXaXRoOworICAgIGV4cG9ydCA9IGRpZmZlcmVuY2VXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZHJvcCIgeworICAgIGNvbnN0IGRyb3A6IHR5cGVvZiBfLmRyb3A7CisgICAgZXhwb3J0ID0gZHJvcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmRyb3BSaWdodCIgeworICAgIGNvbnN0IGRyb3BSaWdodDogdHlwZW9mIF8uZHJvcFJpZ2h0OworICAgIGV4cG9ydCA9IGRyb3BSaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmRyb3BSaWdodFdoaWxlIiB7CisgICAgY29uc3QgZHJvcFJpZ2h0V2hpbGU6IHR5cGVvZiBfLmRyb3BSaWdodFdoaWxlOworICAgIGV4cG9ydCA9IGRyb3BSaWdodFdoaWxlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZHJvcFdoaWxlIiB7CisgICAgY29uc3QgZHJvcFdoaWxlOiB0eXBlb2YgXy5kcm9wV2hpbGU7CisgICAgZXhwb3J0ID0gZHJvcFdoaWxlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZmlsbCIgeworICAgIGNvbnN0IGZpbGw6IHR5cGVvZiBfLmZpbGw7CisgICAgZXhwb3J0ID0gZmlsbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZpbHRlciIgeworICAgIGNvbnN0IGZpbHRlcjogdHlwZW9mIF8uZmlsdGVyOworICAgIGV4cG9ydCA9IGZpbHRlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZsYXRNYXAiIHsKKyAgICBjb25zdCBmbGF0TWFwOiB0eXBlb2YgXy5mbGF0TWFwOworICAgIGV4cG9ydCA9IGZsYXRNYXA7Cit9CisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZsYXRNYXBEZWVwIiB7CisgY29uc3QgZmxhdE1hcERlZXA6IHR5cGVvZiBfLmZsYXRNYXBEZWVwOworIGV4cG9ydCA9IGZsYXRNYXBEZWVwOworIH0KKyAqLworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2guZmxhdE1hcERlcHRoIiB7CisgY29uc3QgZmxhdE1hcERlcHRoOiB0eXBlb2YgXy5mbGF0TWFwRGVwdGg7CisgZXhwb3J0ID0gZmxhdE1hcERlcHRoOworIH0KKyAqLworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZsYXR0ZW4iIHsKKyAgICBjb25zdCBmbGF0dGVuOiB0eXBlb2YgXy5mbGF0dGVuOworICAgIGV4cG9ydCA9IGZsYXR0ZW47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5mbGF0dGVuRGVlcCIgeworICAgIGNvbnN0IGZsYXR0ZW5EZWVwOiB0eXBlb2YgXy5mbGF0dGVuRGVlcDsKKyAgICBleHBvcnQgPSBmbGF0dGVuRGVlcDsKK30KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5mbGF0dGVuRGVwdGgiIHsKKyAgICBjb25zdCBmbGF0dGVuRGVwdGg6IHR5cGVvZiBfLmZsYXR0ZW5EZXB0aDsKKyAgICBleHBvcnQgPSBmbGF0dGVuRGVwdGg7Cit9CisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZmxpcCIgeworICAgIGNvbnN0IGZsaXA6IHR5cGVvZiBfLmZsaXA7CisgICAgZXhwb3J0ID0gZmxpcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZsb3ciIHsKKyAgICBjb25zdCBmbG93OiB0eXBlb2YgXy5mbG93OworICAgIGV4cG9ydCA9IGZsb3c7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5mbG93UmlnaHQiIHsKKyAgICBjb25zdCBmbG93UmlnaHQ6IHR5cGVvZiBfLmZsb3dSaWdodDsKKyAgICBleHBvcnQgPSBmbG93UmlnaHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5mcm9tUGFpcnMiIHsKKyAgICBjb25zdCBmcm9tUGFpcnM6IHR5cGVvZiBfLmZyb21QYWlyczsKKyAgICBleHBvcnQgPSBmcm9tUGFpcnM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5mdW5jdGlvbnMiIHsKKyAgICBjb25zdCBmdW5jdGlvbnM6IHR5cGVvZiBfLmZ1bmN0aW9uczsKKyAgICBleHBvcnQgPSBmdW5jdGlvbnM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5mdW5jdGlvbnNJbiIgeworICAgIGNvbnN0IGZ1bmN0aW9uc0luOiB0eXBlb2YgXy5mdW5jdGlvbnNJbjsKKyAgICBleHBvcnQgPSBmdW5jdGlvbnNJbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmdyb3VwQnkiIHsKKyAgICBjb25zdCBncm91cEJ5OiB0eXBlb2YgXy5ncm91cEJ5OworICAgIGV4cG9ydCA9IGdyb3VwQnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pbml0aWFsIiB7CisgICAgY29uc3QgaW5pdGlhbDogdHlwZW9mIF8uaW5pdGlhbDsKKyAgICBleHBvcnQgPSBpbml0aWFsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaW50ZXJzZWN0aW9uIiB7CisgICAgY29uc3QgaW50ZXJzZWN0aW9uOiB0eXBlb2YgXy5pbnRlcnNlY3Rpb247CisgICAgZXhwb3J0ID0gaW50ZXJzZWN0aW9uOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaW50ZXJzZWN0aW9uQnkiIHsKKyAgICBjb25zdCBpbnRlcnNlY3Rpb25CeTogdHlwZW9mIF8uaW50ZXJzZWN0aW9uQnk7CisgICAgZXhwb3J0ID0gaW50ZXJzZWN0aW9uQnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pbnRlcnNlY3Rpb25XaXRoIiB7CisgICAgY29uc3QgaW50ZXJzZWN0aW9uV2l0aDogdHlwZW9mIF8uaW50ZXJzZWN0aW9uV2l0aDsKKyAgICBleHBvcnQgPSBpbnRlcnNlY3Rpb25XaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaW52ZXJ0IiB7CisgICAgY29uc3QgaW52ZXJ0OiB0eXBlb2YgXy5pbnZlcnQ7CisgICAgZXhwb3J0ID0gaW52ZXJ0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaW52ZXJ0QnkiIHsKKyAgICBjb25zdCBpbnZlcnRCeTogdHlwZW9mIF8uaW52ZXJ0Qnk7CisgICAgZXhwb3J0ID0gaW52ZXJ0Qnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pbnZva2VNYXAiIHsKKyAgICBjb25zdCBpbnZva2VNYXA6IHR5cGVvZiBfLmludm9rZU1hcDsKKyAgICBleHBvcnQgPSBpbnZva2VNYXA7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pdGVyYXRlZSIgeworICAgIGNvbnN0IGl0ZXJhdGVlOiB0eXBlb2YgXy5pdGVyYXRlZTsKKyAgICBleHBvcnQgPSBpdGVyYXRlZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmtleUJ5IiB7CisgICAgY29uc3Qga2V5Qnk6IHR5cGVvZiBfLmtleUJ5OworICAgIGV4cG9ydCA9IGtleUJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gua2V5cyIgeworICAgIGNvbnN0IGtleXM6IHR5cGVvZiBfLmtleXM7CisgICAgZXhwb3J0ID0ga2V5czsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmtleXNJbiIgeworICAgIGNvbnN0IGtleXNJbjogdHlwZW9mIF8ua2V5c0luOworICAgIGV4cG9ydCA9IGtleXNJbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm1hcCIgeworICAgIGNvbnN0IG1hcDogdHlwZW9mIF8ubWFwOworICAgIGV4cG9ydCA9IG1hcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm1hcEtleXMiIHsKKyAgICBjb25zdCBtYXBLZXlzOiB0eXBlb2YgXy5tYXBLZXlzOworICAgIGV4cG9ydCA9IG1hcEtleXM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5tYXBWYWx1ZXMiIHsKKyAgICBjb25zdCBtYXBWYWx1ZXM6IHR5cGVvZiBfLm1hcFZhbHVlczsKKyAgICBleHBvcnQgPSBtYXBWYWx1ZXM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5tYXRjaGVzIiB7CisgICAgY29uc3QgbWF0Y2hlczogdHlwZW9mIF8ubWF0Y2hlczsKKyAgICBleHBvcnQgPSBtYXRjaGVzOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5IiB7CisgICAgY29uc3QgbWF0Y2hlc1Byb3BlcnR5OiB0eXBlb2YgXy5tYXRjaGVzUHJvcGVydHk7CisgICAgZXhwb3J0ID0gbWF0Y2hlc1Byb3BlcnR5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubWVtb2l6ZSIgeworICAgIGNvbnN0IG1lbW9pemU6IHR5cGVvZiBfLm1lbW9pemU7CisgICAgZXhwb3J0ID0gbWVtb2l6ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm1lcmdlIiB7CisgICAgY29uc3QgbWVyZ2U6IHR5cGVvZiBfLm1lcmdlOworICAgIGV4cG9ydCA9IG1lcmdlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubWVyZ2VXaXRoIiB7CisgICAgY29uc3QgbWVyZ2VXaXRoOiB0eXBlb2YgXy5tZXJnZVdpdGg7CisgICAgZXhwb3J0ID0gbWVyZ2VXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubWV0aG9kIiB7CisgICAgY29uc3QgbWV0aG9kOiB0eXBlb2YgXy5tZXRob2Q7CisgICAgZXhwb3J0ID0gbWV0aG9kOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubWV0aG9kT2YiIHsKKyAgICBjb25zdCBtZXRob2RPZjogdHlwZW9mIF8ubWV0aG9kT2Y7CisgICAgZXhwb3J0ID0gbWV0aG9kT2Y7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5taXhpbiIgeworICAgIGNvbnN0IG1peGluOiB0eXBlb2YgXy5taXhpbjsKKyAgICBleHBvcnQgPSBtaXhpbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm5lZ2F0ZSIgeworICAgIGNvbnN0IG5lZ2F0ZTogdHlwZW9mIF8ubmVnYXRlOworICAgIGV4cG9ydCA9IG5lZ2F0ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm50aEFyZyIgeworICAgIGNvbnN0IG50aEFyZzogdHlwZW9mIF8ubnRoQXJnOworICAgIGV4cG9ydCA9IG50aEFyZzsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm9taXQiIHsKKyAgICBjb25zdCBvbWl0OiB0eXBlb2YgXy5vbWl0OworICAgIGV4cG9ydCA9IG9taXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5vbWl0QnkiIHsKKyAgICBjb25zdCBvbWl0Qnk6IHR5cGVvZiBfLm9taXRCeTsKKyAgICBleHBvcnQgPSBvbWl0Qnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5vbmNlIiB7CisgICAgY29uc3Qgb25jZTogdHlwZW9mIF8ub25jZTsKKyAgICBleHBvcnQgPSBvbmNlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gub3JkZXJCeSIgeworICAgIGNvbnN0IG9yZGVyQnk6IHR5cGVvZiBfLm9yZGVyQnk7CisgICAgZXhwb3J0ID0gb3JkZXJCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm92ZXIiIHsKKyAgICBjb25zdCBvdmVyOiB0eXBlb2YgXy5vdmVyOworICAgIGV4cG9ydCA9IG92ZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5vdmVyQXJncyIgeworICAgIGNvbnN0IG92ZXJBcmdzOiB0eXBlb2YgXy5vdmVyQXJnczsKKyAgICBleHBvcnQgPSBvdmVyQXJnczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm92ZXJFdmVyeSIgeworICAgIGNvbnN0IG92ZXJFdmVyeTogdHlwZW9mIF8ub3ZlckV2ZXJ5OworICAgIGV4cG9ydCA9IG92ZXJFdmVyeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm92ZXJTb21lIiB7CisgICAgY29uc3Qgb3ZlclNvbWU6IHR5cGVvZiBfLm92ZXJTb21lOworICAgIGV4cG9ydCA9IG92ZXJTb21lOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gucGFydGlhbCIgeworICAgIGNvbnN0IHBhcnRpYWw6IHR5cGVvZiBfLnBhcnRpYWw7CisgICAgZXhwb3J0ID0gcGFydGlhbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnBhcnRpYWxSaWdodCIgeworICAgIGNvbnN0IHBhcnRpYWxSaWdodDogdHlwZW9mIF8ucGFydGlhbFJpZ2h0OworICAgIGV4cG9ydCA9IHBhcnRpYWxSaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnBhcnRpdGlvbiIgeworICAgIGNvbnN0IHBhcnRpdGlvbjogdHlwZW9mIF8ucGFydGl0aW9uOworICAgIGV4cG9ydCA9IHBhcnRpdGlvbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnBpY2siIHsKKyAgICBjb25zdCBwaWNrOiB0eXBlb2YgXy5waWNrOworICAgIGV4cG9ydCA9IHBpY2s7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5waWNrQnkiIHsKKyAgICBjb25zdCBwaWNrQnk6IHR5cGVvZiBfLnBpY2tCeTsKKyAgICBleHBvcnQgPSBwaWNrQnk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5wcm9wZXJ0eSIgeworICAgIGNvbnN0IHByb3BlcnR5OiB0eXBlb2YgXy5wcm9wZXJ0eTsKKyAgICBleHBvcnQgPSBwcm9wZXJ0eTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnByb3BlcnR5T2YiIHsKKyAgICBjb25zdCBwcm9wZXJ0eU9mOiB0eXBlb2YgXy5wcm9wZXJ0eU9mOworICAgIGV4cG9ydCA9IHByb3BlcnR5T2Y7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5wdWxsIiB7CisgICAgY29uc3QgcHVsbDogdHlwZW9mIF8ucHVsbDsKKyAgICBleHBvcnQgPSBwdWxsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gucHVsbEFsbCIgeworICAgIGNvbnN0IHB1bGxBbGw6IHR5cGVvZiBfLnB1bGxBbGw7CisgICAgZXhwb3J0ID0gcHVsbEFsbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnB1bGxBbGxCeSIgeworICAgIGNvbnN0IHB1bGxBbGxCeTogdHlwZW9mIF8ucHVsbEFsbEJ5OworICAgIGV4cG9ydCA9IHB1bGxBbGxCeTsKK30KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gucHVsbEFsbFdpdGgiIHsKKyBjb25zdCBwdWxsQWxsV2l0aDogdHlwZW9mIF8ucHVsbEFsbFdpdGg7CisgZXhwb3J0ID0gcHVsbEFsbFdpdGg7CisgfQorICovCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gucHVsbEF0IiB7CisgICAgY29uc3QgcHVsbEF0OiB0eXBlb2YgXy5wdWxsQXQ7CisgICAgZXhwb3J0ID0gcHVsbEF0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gucmFuZ2UiIHsKKyAgICBjb25zdCByYW5nZTogdHlwZW9mIF8ucmFuZ2U7CisgICAgZXhwb3J0ID0gcmFuZ2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yYW5nZVJpZ2h0IiB7CisgICAgY29uc3QgcmFuZ2VSaWdodDogdHlwZW9mIF8ucmFuZ2VSaWdodDsKKyAgICBleHBvcnQgPSByYW5nZVJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gucmVhcmciIHsKKyAgICBjb25zdCByZWFyZzogdHlwZW9mIF8ucmVhcmc7CisgICAgZXhwb3J0ID0gcmVhcmc7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yZWplY3QiIHsKKyAgICBjb25zdCByZWplY3Q6IHR5cGVvZiBfLnJlamVjdDsKKyAgICBleHBvcnQgPSByZWplY3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yZW1vdmUiIHsKKyAgICBjb25zdCByZW1vdmU6IHR5cGVvZiBfLnJlbW92ZTsKKyAgICBleHBvcnQgPSByZW1vdmU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yZXN0IiB7CisgICAgY29uc3QgcmVzdDogdHlwZW9mIF8ucmVzdDsKKyAgICBleHBvcnQgPSByZXN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gucmV2ZXJzZSIgeworICAgIGNvbnN0IHJldmVyc2U6IHR5cGVvZiBfLnJldmVyc2U7CisgICAgZXhwb3J0ID0gcmV2ZXJzZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNhbXBsZVNpemUiIHsKKyAgICBjb25zdCBzYW1wbGVTaXplOiB0eXBlb2YgXy5zYW1wbGVTaXplOworICAgIGV4cG9ydCA9IHNhbXBsZVNpemU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zZXQiIHsKKyAgICBjb25zdCBzZXQ6IHR5cGVvZiBfLnNldDsKKyAgICBleHBvcnQgPSBzZXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zZXRXaXRoIiB7CisgICAgY29uc3Qgc2V0V2l0aDogdHlwZW9mIF8uc2V0V2l0aDsKKyAgICBleHBvcnQgPSBzZXRXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc2h1ZmZsZSIgeworICAgIGNvbnN0IHNodWZmbGU6IHR5cGVvZiBfLnNodWZmbGU7CisgICAgZXhwb3J0ID0gc2h1ZmZsZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNsaWNlIiB7CisgICAgY29uc3Qgc2xpY2U6IHR5cGVvZiBfLnNsaWNlOworICAgIGV4cG9ydCA9IHNsaWNlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc29ydEJ5IiB7CisgICAgY29uc3Qgc29ydEJ5OiB0eXBlb2YgXy5zb3J0Qnk7CisgICAgZXhwb3J0ID0gc29ydEJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc29ydGVkVW5pcSIgeworICAgIGNvbnN0IHNvcnRlZFVuaXE6IHR5cGVvZiBfLnNvcnRlZFVuaXE7CisgICAgZXhwb3J0ID0gc29ydGVkVW5pcTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNvcnRlZFVuaXFCeSIgeworICAgIGNvbnN0IHNvcnRlZFVuaXFCeTogdHlwZW9mIF8uc29ydGVkVW5pcUJ5OworICAgIGV4cG9ydCA9IHNvcnRlZFVuaXFCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNwbGl0IiB7CisgICAgY29uc3Qgc3BsaXQ6IHR5cGVvZiBfLnNwbGl0OworICAgIGV4cG9ydCA9IHNwbGl0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc3ByZWFkIiB7CisgICAgY29uc3Qgc3ByZWFkOiB0eXBlb2YgXy5zcHJlYWQ7CisgICAgZXhwb3J0ID0gc3ByZWFkOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudGFpbCIgeworICAgIGNvbnN0IHRhaWw6IHR5cGVvZiBfLnRhaWw7CisgICAgZXhwb3J0ID0gdGFpbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRha2UiIHsKKyAgICBjb25zdCB0YWtlOiB0eXBlb2YgXy50YWtlOworICAgIGV4cG9ydCA9IHRha2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50YWtlUmlnaHQiIHsKKyAgICBjb25zdCB0YWtlUmlnaHQ6IHR5cGVvZiBfLnRha2VSaWdodDsKKyAgICBleHBvcnQgPSB0YWtlUmlnaHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50YWtlUmlnaHRXaGlsZSIgeworICAgIGNvbnN0IHRha2VSaWdodFdoaWxlOiB0eXBlb2YgXy50YWtlUmlnaHRXaGlsZTsKKyAgICBleHBvcnQgPSB0YWtlUmlnaHRXaGlsZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRha2VXaGlsZSIgeworICAgIGNvbnN0IHRha2VXaGlsZTogdHlwZW9mIF8udGFrZVdoaWxlOworICAgIGV4cG9ydCA9IHRha2VXaGlsZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRhcCIgeworICAgIGNvbnN0IHRhcDogdHlwZW9mIF8udGFwOworICAgIGV4cG9ydCA9IHRhcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRocm90dGxlIiB7CisgICAgY29uc3QgdGhyb3R0bGU6IHR5cGVvZiBfLnRocm90dGxlOworICAgIGV4cG9ydCA9IHRocm90dGxlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudGhydSIgeworICAgIGNvbnN0IHRocnU6IHR5cGVvZiBfLnRocnU7CisgICAgZXhwb3J0ID0gdGhydTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRvQXJyYXkiIHsKKyAgICBjb25zdCB0b0FycmF5OiB0eXBlb2YgXy50b0FycmF5OworICAgIGV4cG9ydCA9IHRvQXJyYXk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50b1BhaXJzIiB7CisgICAgY29uc3QgdG9QYWlyczogdHlwZW9mIF8udG9QYWlyczsKKyAgICBleHBvcnQgPSB0b1BhaXJzOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudG9QYWlyc0luIiB7CisgICAgY29uc3QgdG9QYWlyc0luOiB0eXBlb2YgXy50b1BhaXJzSW47CisgICAgZXhwb3J0ID0gdG9QYWlyc0luOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudG9QYXRoIiB7CisgICAgY29uc3QgdG9QYXRoOiB0eXBlb2YgXy50b1BhdGg7CisgICAgZXhwb3J0ID0gdG9QYXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudG9QbGFpbk9iamVjdCIgeworICAgIGNvbnN0IHRvUGxhaW5PYmplY3Q6IHR5cGVvZiBfLnRvUGxhaW5PYmplY3Q7CisgICAgZXhwb3J0ID0gdG9QbGFpbk9iamVjdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRyYW5zZm9ybSIgeworICAgIGNvbnN0IHRyYW5zZm9ybTogdHlwZW9mIF8udHJhbnNmb3JtOworICAgIGV4cG9ydCA9IHRyYW5zZm9ybTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnVuYXJ5IiB7CisgICAgY29uc3QgdW5hcnk6IHR5cGVvZiBfLnVuYXJ5OworICAgIGV4cG9ydCA9IHVuYXJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudW5pb24iIHsKKyAgICBjb25zdCB1bmlvbjogdHlwZW9mIF8udW5pb247CisgICAgZXhwb3J0ID0gdW5pb247Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC51bmlvbkJ5IiB7CisgICAgY29uc3QgdW5pb25CeTogdHlwZW9mIF8udW5pb25CeTsKKyAgICBleHBvcnQgPSB1bmlvbkJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudW5pb25XaXRoIiB7CisgICAgY29uc3QgdW5pb25XaXRoOiB0eXBlb2YgXy51bmlvbldpdGg7CisgICAgZXhwb3J0ID0gdW5pb25XaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudW5pcSIgeworICAgIGNvbnN0IHVuaXE6IHR5cGVvZiBfLnVuaXE7CisgICAgZXhwb3J0ID0gdW5pcTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnVuaXFCeSIgeworICAgIGNvbnN0IHVuaXFCeTogdHlwZW9mIF8udW5pcUJ5OworICAgIGV4cG9ydCA9IHVuaXFCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnVuaXFXaXRoIiB7CisgICAgY29uc3QgdW5pcVdpdGg6IHR5cGVvZiBfLnVuaXFXaXRoOworICAgIGV4cG9ydCA9IHVuaXFXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudW5zZXQiIHsKKyAgICBjb25zdCB1bnNldDogdHlwZW9mIF8udW5zZXQ7CisgICAgZXhwb3J0ID0gdW5zZXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC51bnppcCIgeworICAgIGNvbnN0IHVuemlwOiB0eXBlb2YgXy51bnppcDsKKyAgICBleHBvcnQgPSB1bnppcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnVuemlwV2l0aCIgeworICAgIGNvbnN0IHVuemlwV2l0aDogdHlwZW9mIF8udW56aXBXaXRoOworICAgIGV4cG9ydCA9IHVuemlwV2l0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnVwZGF0ZSIgeworICAgIGNvbnN0IHVwZGF0ZTogdHlwZW9mIF8udXBkYXRlOworICAgIGV4cG9ydCA9IHVwZGF0ZTsKK30KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gudXBkYXRlV2l0aCIgeworIGNvbnN0IHVwZGF0ZVdpdGg6IHR5cGVvZiBfLnVwZGF0ZVdpdGg7CisgZXhwb3J0ID0gdXBkYXRlV2l0aDsKKyB9CisgKi8KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC52YWx1ZXMiIHsKKyAgICBjb25zdCB2YWx1ZXM6IHR5cGVvZiBfLnZhbHVlczsKKyAgICBleHBvcnQgPSB2YWx1ZXM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC52YWx1ZXNJbiIgeworICAgIGNvbnN0IHZhbHVlc0luOiB0eXBlb2YgXy52YWx1ZXNJbjsKKyAgICBleHBvcnQgPSB2YWx1ZXNJbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLndpdGhvdXQiIHsKKyAgICBjb25zdCB3aXRob3V0OiB0eXBlb2YgXy53aXRob3V0OworICAgIGV4cG9ydCA9IHdpdGhvdXQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC53b3JkcyIgeworICAgIGNvbnN0IHdvcmRzOiB0eXBlb2YgXy53b3JkczsKKyAgICBleHBvcnQgPSB3b3JkczsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLndyYXAiIHsKKyAgICBjb25zdCB3cmFwOiB0eXBlb2YgXy53cmFwOworICAgIGV4cG9ydCA9IHdyYXA7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC54b3IiIHsKKyAgICBjb25zdCB4b3I6IHR5cGVvZiBfLnhvcjsKKyAgICBleHBvcnQgPSB4b3I7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC54b3JCeSIgeworICAgIGNvbnN0IHhvckJ5OiB0eXBlb2YgXy54b3JCeTsKKyAgICBleHBvcnQgPSB4b3JCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnhvcldpdGgiIHsKKyAgICBjb25zdCB4b3JXaXRoOiB0eXBlb2YgXy54b3JXaXRoOworICAgIGV4cG9ydCA9IHhvcldpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC56aXAiIHsKKyAgICBjb25zdCB6aXA6IHR5cGVvZiBfLnppcDsKKyAgICBleHBvcnQgPSB6aXA7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC56aXBPYmplY3QiIHsKKyAgICBjb25zdCB6aXBPYmplY3Q6IHR5cGVvZiBfLnppcE9iamVjdDsKKyAgICBleHBvcnQgPSB6aXBPYmplY3Q7Cit9CisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnppcE9iamVjdERlZXAiIHsKKyBjb25zdCB6aXBPYmplY3REZWVwOiB0eXBlb2YgXy56aXBPYmplY3REZWVwOworIGV4cG9ydCA9IHppcE9iamVjdERlZXA7CisgfQorICovCisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC56aXBXaXRoIiB7CisgICAgY29uc3QgemlwV2l0aDogdHlwZW9mIF8uemlwV2l0aDsKKyAgICBleHBvcnQgPSB6aXBXaXRoOworfQorCisvKioKKyAqIHVuY29tZW50IGl0IGlmIGRlZmluaXRpb24gZXhpc3RzCisgKi8KKy8qCisgZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5lbnRyaWVzIiB7CisgY29uc3QgZW50cmllczogdHlwZW9mIF8uZW50cmllczsKKyBleHBvcnQgPSBlbnRyaWVzOworIH0KKyAqLworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2guZW50cmllc0luIiB7CisgY29uc3QgZW50cmllc0luOiB0eXBlb2YgXy5lbnRyaWVzSW47CisgZXhwb3J0ID0gZW50cmllc0luOworIH0KKyAqLworCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZXh0ZW5kIiB7CisgICAgY29uc3QgZXh0ZW5kOiB0eXBlb2YgXy5leHRlbmQ7CisgICAgZXhwb3J0ID0gZXh0ZW5kOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZXh0ZW5kV2l0aCIgeworICAgIGNvbnN0IGV4dGVuZFdpdGg6IHR5cGVvZiBfLmV4dGVuZFdpdGg7CisgICAgZXhwb3J0ID0gZXh0ZW5kV2l0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmFkZCIgeworICAgIGNvbnN0IGFkZDogdHlwZW9mIF8uYWRkOworICAgIGV4cG9ydCA9IGFkZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmF0dGVtcHQiIHsKKyAgICBjb25zdCBhdHRlbXB0OiB0eXBlb2YgXy5hdHRlbXB0OworICAgIGV4cG9ydCA9IGF0dGVtcHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5jYW1lbENhc2UiIHsKKyAgICBjb25zdCBjYW1lbENhc2U6IHR5cGVvZiBfLmNhbWVsQ2FzZTsKKyAgICBleHBvcnQgPSBjYW1lbENhc2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5jYXBpdGFsaXplIiB7CisgICAgY29uc3QgY2FwaXRhbGl6ZTogdHlwZW9mIF8uY2FwaXRhbGl6ZTsKKyAgICBleHBvcnQgPSBjYXBpdGFsaXplOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guY2VpbCIgeworICAgIGNvbnN0IGNlaWw6IHR5cGVvZiBfLmNlaWw7CisgICAgZXhwb3J0ID0gY2VpbDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmNsYW1wIiB7CisgICAgY29uc3QgY2xhbXA6IHR5cGVvZiBfLmNsYW1wOworICAgIGV4cG9ydCA9IGNsYW1wOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guY2xvbmUiIHsKKyAgICBjb25zdCBjbG9uZTogdHlwZW9mIF8uY2xvbmU7CisgICAgZXhwb3J0ID0gY2xvbmU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5jbG9uZURlZXAiIHsKKyAgICBjb25zdCBjbG9uZURlZXA6IHR5cGVvZiBfLmNsb25lRGVlcDsKKyAgICBleHBvcnQgPSBjbG9uZURlZXA7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5jbG9uZURlZXBXaXRoIiB7CisgICAgY29uc3QgY2xvbmVEZWVwV2l0aDogdHlwZW9mIF8uY2xvbmVEZWVwV2l0aDsKKyAgICBleHBvcnQgPSBjbG9uZURlZXBXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guY2xvbmVXaXRoIiB7CisgICAgY29uc3QgY2xvbmVXaXRoOiB0eXBlb2YgXy5jbG9uZVdpdGg7CisgICAgZXhwb3J0ID0gY2xvbmVXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZGVidXJyIiB7CisgICAgY29uc3QgZGVidXJyOiB0eXBlb2YgXy5kZWJ1cnI7CisgICAgZXhwb3J0ID0gZGVidXJyOworfQorCisvKioKKyAqIHVuY29tZW50IGl0IGlmIGRlZmluaXRpb24gZXhpc3RzCisgKi8KKy8qCisgZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5kaXZpZGUiIHsKKyBjb25zdCBkaXZpZGU6IHR5cGVvZiBfLmRpdmlkZTsKKyBleHBvcnQgPSBkaXZpZGU7CisgfQorICovCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZW5kc1dpdGgiIHsKKyAgICBjb25zdCBlbmRzV2l0aDogdHlwZW9mIF8uZW5kc1dpdGg7CisgICAgZXhwb3J0ID0gZW5kc1dpdGg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5lcSIgeworICAgIGNvbnN0IGVxOiB0eXBlb2YgXy5lcTsKKyAgICBleHBvcnQgPSBlcTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmVzY2FwZSIgeworICAgIGNvbnN0IGVzY2FwZTogdHlwZW9mIF8uZXNjYXBlOworICAgIGV4cG9ydCA9IGVzY2FwZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmVzY2FwZVJlZ0V4cCIgeworICAgIGNvbnN0IGVzY2FwZVJlZ0V4cDogdHlwZW9mIF8uZXNjYXBlUmVnRXhwOworICAgIGV4cG9ydCA9IGVzY2FwZVJlZ0V4cDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmV2ZXJ5IiB7CisgICAgY29uc3QgZXZlcnk6IHR5cGVvZiBfLmV2ZXJ5OworICAgIGV4cG9ydCA9IGV2ZXJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZmluZCIgeworICAgIGNvbnN0IGZpbmQ6IHR5cGVvZiBfLmZpbmQ7CisgICAgZXhwb3J0ID0gZmluZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZpbmRJbmRleCIgeworICAgIGNvbnN0IGZpbmRJbmRleDogdHlwZW9mIF8uZmluZEluZGV4OworICAgIGV4cG9ydCA9IGZpbmRJbmRleDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZpbmRLZXkiIHsKKyAgICBjb25zdCBmaW5kS2V5OiB0eXBlb2YgXy5maW5kS2V5OworICAgIGV4cG9ydCA9IGZpbmRLZXk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5maW5kTGFzdCIgeworICAgIGNvbnN0IGZpbmRMYXN0OiB0eXBlb2YgXy5maW5kTGFzdDsKKyAgICBleHBvcnQgPSBmaW5kTGFzdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZpbmRMYXN0SW5kZXgiIHsKKyAgICBjb25zdCBmaW5kTGFzdEluZGV4OiB0eXBlb2YgXy5maW5kTGFzdEluZGV4OworICAgIGV4cG9ydCA9IGZpbmRMYXN0SW5kZXg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5maW5kTGFzdEtleSIgeworICAgIGNvbnN0IGZpbmRMYXN0S2V5OiB0eXBlb2YgXy5maW5kTGFzdEtleTsKKyAgICBleHBvcnQgPSBmaW5kTGFzdEtleTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZsb29yIiB7CisgICAgY29uc3QgZmxvb3I6IHR5cGVvZiBfLmZsb29yOworICAgIGV4cG9ydCA9IGZsb29yOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZm9yRWFjaCIgeworICAgIGNvbnN0IGZvckVhY2g6IHR5cGVvZiBfLmZvckVhY2g7CisgICAgZXhwb3J0ID0gZm9yRWFjaDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZvckVhY2hSaWdodCIgeworICAgIGNvbnN0IGZvckVhY2hSaWdodDogdHlwZW9mIF8uZm9yRWFjaFJpZ2h0OworICAgIGV4cG9ydCA9IGZvckVhY2hSaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZvckluIiB7CisgICAgY29uc3QgZm9ySW46IHR5cGVvZiBfLmZvckluOworICAgIGV4cG9ydCA9IGZvckluOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZm9ySW5SaWdodCIgeworICAgIGNvbnN0IGZvckluUmlnaHQ6IHR5cGVvZiBfLmZvckluUmlnaHQ7CisgICAgZXhwb3J0ID0gZm9ySW5SaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZvck93biIgeworICAgIGNvbnN0IGZvck93bjogdHlwZW9mIF8uZm9yT3duOworICAgIGV4cG9ydCA9IGZvck93bjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmZvck93blJpZ2h0IiB7CisgICAgY29uc3QgZm9yT3duUmlnaHQ6IHR5cGVvZiBfLmZvck93blJpZ2h0OworICAgIGV4cG9ydCA9IGZvck93blJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZ2V0IiB7CisgICAgY29uc3QgZ2V0OiB0eXBlb2YgXy5nZXQ7CisgICAgZXhwb3J0ID0gZ2V0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZ3QiIHsKKyAgICBjb25zdCBndDogdHlwZW9mIF8uZ3Q7CisgICAgZXhwb3J0ID0gZ3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5ndGUiIHsKKyAgICBjb25zdCBndGU6IHR5cGVvZiBfLmd0ZTsKKyAgICBleHBvcnQgPSBndGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5oYXMiIHsKKyAgICBjb25zdCBoYXM6IHR5cGVvZiBfLmhhczsKKyAgICBleHBvcnQgPSBoYXM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5oYXNJbiIgeworICAgIGNvbnN0IGhhc0luOiB0eXBlb2YgXy5oYXNJbjsKKyAgICBleHBvcnQgPSBoYXNJbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmhlYWQiIHsKKyAgICBjb25zdCBoZWFkOiB0eXBlb2YgXy5oZWFkOworICAgIGV4cG9ydCA9IGhlYWQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pZGVudGl0eSIgeworICAgIGNvbnN0IGlkZW50aXR5OiB0eXBlb2YgXy5pZGVudGl0eTsKKyAgICBleHBvcnQgPSBpZGVudGl0eTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmluY2x1ZGVzIiB7CisgICAgY29uc3QgaW5jbHVkZXM6IHR5cGVvZiBfLmluY2x1ZGVzOworICAgIGV4cG9ydCA9IGluY2x1ZGVzOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaW5kZXhPZiIgeworICAgIGNvbnN0IGluZGV4T2Y6IHR5cGVvZiBfLmluZGV4T2Y7CisgICAgZXhwb3J0ID0gaW5kZXhPZjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmluUmFuZ2UiIHsKKyAgICBjb25zdCBpblJhbmdlOiB0eXBlb2YgXy5pblJhbmdlOworICAgIGV4cG9ydCA9IGluUmFuZ2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pbnZva2UiIHsKKyAgICBjb25zdCBpbnZva2U6IHR5cGVvZiBfLmludm9rZTsKKyAgICBleHBvcnQgPSBpbnZva2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc0FyZ3VtZW50cyIgeworICAgIGNvbnN0IGlzQXJndW1lbnRzOiB0eXBlb2YgXy5pc0FyZ3VtZW50czsKKyAgICBleHBvcnQgPSBpc0FyZ3VtZW50czsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzQXJyYXkiIHsKKyAgICBjb25zdCBpc0FycmF5OiB0eXBlb2YgXy5pc0FycmF5OworICAgIGV4cG9ydCA9IGlzQXJyYXk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc0FycmF5QnVmZmVyIiB7CisgICAgY29uc3QgaXNBcnJheUJ1ZmZlcjogdHlwZW9mIF8uaXNBcnJheUJ1ZmZlcjsKKyAgICBleHBvcnQgPSBpc0FycmF5QnVmZmVyOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNBcnJheUxpa2UiIHsKKyAgICBjb25zdCBpc0FycmF5TGlrZTogdHlwZW9mIF8uaXNBcnJheUxpa2U7CisgICAgZXhwb3J0ID0gaXNBcnJheUxpa2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc0FycmF5TGlrZU9iamVjdCIgeworICAgIGNvbnN0IGlzQXJyYXlMaWtlT2JqZWN0OiB0eXBlb2YgXy5pc0FycmF5TGlrZU9iamVjdDsKKyAgICBleHBvcnQgPSBpc0FycmF5TGlrZU9iamVjdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzQm9vbGVhbiIgeworICAgIGNvbnN0IGlzQm9vbGVhbjogdHlwZW9mIF8uaXNCb29sZWFuOworICAgIGV4cG9ydCA9IGlzQm9vbGVhbjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzQnVmZmVyIiB7CisgICAgY29uc3QgaXNCdWZmZXI6IHR5cGVvZiBfLmlzQnVmZmVyOworICAgIGV4cG9ydCA9IGlzQnVmZmVyOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNEYXRlIiB7CisgICAgY29uc3QgaXNEYXRlOiB0eXBlb2YgXy5pc0RhdGU7CisgICAgZXhwb3J0ID0gaXNEYXRlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNFbGVtZW50IiB7CisgICAgY29uc3QgaXNFbGVtZW50OiB0eXBlb2YgXy5pc0VsZW1lbnQ7CisgICAgZXhwb3J0ID0gaXNFbGVtZW50OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNFbXB0eSIgeworICAgIGNvbnN0IGlzRW1wdHk6IHR5cGVvZiBfLmlzRW1wdHk7CisgICAgZXhwb3J0ID0gaXNFbXB0eTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzRXF1YWwiIHsKKyAgICBjb25zdCBpc0VxdWFsOiB0eXBlb2YgXy5pc0VxdWFsOworICAgIGV4cG9ydCA9IGlzRXF1YWw7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc0VxdWFsV2l0aCIgeworICAgIGNvbnN0IGlzRXF1YWxXaXRoOiB0eXBlb2YgXy5pc0VxdWFsV2l0aDsKKyAgICBleHBvcnQgPSBpc0VxdWFsV2l0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzRXJyb3IiIHsKKyAgICBjb25zdCBpc0Vycm9yOiB0eXBlb2YgXy5pc0Vycm9yOworICAgIGV4cG9ydCA9IGlzRXJyb3I7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc0Zpbml0ZSIgeworICAgIGNvbnN0IGlzRmluaXRlOiB0eXBlb2YgXy5pc0Zpbml0ZTsKKyAgICBleHBvcnQgPSBpc0Zpbml0ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzRnVuY3Rpb24iIHsKKyAgICBjb25zdCBpc0Z1bmN0aW9uOiB0eXBlb2YgXy5pc0Z1bmN0aW9uOworICAgIGV4cG9ydCA9IGlzRnVuY3Rpb247Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc0ludGVnZXIiIHsKKyAgICBjb25zdCBpc0ludGVnZXI6IHR5cGVvZiBfLmlzSW50ZWdlcjsKKyAgICBleHBvcnQgPSBpc0ludGVnZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc0xlbmd0aCIgeworICAgIGNvbnN0IGlzTGVuZ3RoOiB0eXBlb2YgXy5pc0xlbmd0aDsKKyAgICBleHBvcnQgPSBpc0xlbmd0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzTWFwIiB7CisgICAgY29uc3QgaXNNYXA6IHR5cGVvZiBfLmlzTWFwOworICAgIGV4cG9ydCA9IGlzTWFwOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNNYXRjaCIgeworICAgIGNvbnN0IGlzTWF0Y2g6IHR5cGVvZiBfLmlzTWF0Y2g7CisgICAgZXhwb3J0ID0gaXNNYXRjaDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzTWF0Y2hXaXRoIiB7CisgICAgY29uc3QgaXNNYXRjaFdpdGg6IHR5cGVvZiBfLmlzTWF0Y2hXaXRoOworICAgIGV4cG9ydCA9IGlzTWF0Y2hXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNOYU4iIHsKKyAgICBjb25zdCBpc05hTjogdHlwZW9mIF8uaXNOYU47CisgICAgZXhwb3J0ID0gaXNOYU47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc05hdGl2ZSIgeworICAgIGNvbnN0IGlzTmF0aXZlOiB0eXBlb2YgXy5pc05hdGl2ZTsKKyAgICBleHBvcnQgPSBpc05hdGl2ZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzTmlsIiB7CisgICAgY29uc3QgaXNOaWw6IHR5cGVvZiBfLmlzTmlsOworICAgIGV4cG9ydCA9IGlzTmlsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNOdWxsIiB7CisgICAgY29uc3QgaXNOdWxsOiB0eXBlb2YgXy5pc051bGw7CisgICAgZXhwb3J0ID0gaXNOdWxsOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNOdW1iZXIiIHsKKyAgICBjb25zdCBpc051bWJlcjogdHlwZW9mIF8uaXNOdW1iZXI7CisgICAgZXhwb3J0ID0gaXNOdW1iZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc09iamVjdCIgeworICAgIGNvbnN0IGlzT2JqZWN0OiB0eXBlb2YgXy5pc09iamVjdDsKKyAgICBleHBvcnQgPSBpc09iamVjdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzT2JqZWN0TGlrZSIgeworICAgIGNvbnN0IGlzT2JqZWN0TGlrZTogdHlwZW9mIF8uaXNPYmplY3RMaWtlOworICAgIGV4cG9ydCA9IGlzT2JqZWN0TGlrZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzUGxhaW5PYmplY3QiIHsKKyAgICBjb25zdCBpc1BsYWluT2JqZWN0OiB0eXBlb2YgXy5pc1BsYWluT2JqZWN0OworICAgIGV4cG9ydCA9IGlzUGxhaW5PYmplY3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc1JlZ0V4cCIgeworICAgIGNvbnN0IGlzUmVnRXhwOiB0eXBlb2YgXy5pc1JlZ0V4cDsKKyAgICBleHBvcnQgPSBpc1JlZ0V4cDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzU2FmZUludGVnZXIiIHsKKyAgICBjb25zdCBpc1NhZmVJbnRlZ2VyOiB0eXBlb2YgXy5pc1NhZmVJbnRlZ2VyOworICAgIGV4cG9ydCA9IGlzU2FmZUludGVnZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc1NldCIgeworICAgIGNvbnN0IGlzU2V0OiB0eXBlb2YgXy5pc1NldDsKKyAgICBleHBvcnQgPSBpc1NldDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzU3RyaW5nIiB7CisgICAgY29uc3QgaXNTdHJpbmc6IHR5cGVvZiBfLmlzU3RyaW5nOworICAgIGV4cG9ydCA9IGlzU3RyaW5nOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guaXNTeW1ib2wiIHsKKyAgICBjb25zdCBpc1N5bWJvbDogdHlwZW9mIF8uaXNTeW1ib2w7CisgICAgZXhwb3J0ID0gaXNTeW1ib2w7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc1R5cGVkQXJyYXkiIHsKKyAgICBjb25zdCBpc1R5cGVkQXJyYXk6IHR5cGVvZiBfLmlzVHlwZWRBcnJheTsKKyAgICBleHBvcnQgPSBpc1R5cGVkQXJyYXk7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5pc1VuZGVmaW5lZCIgeworICAgIGNvbnN0IGlzVW5kZWZpbmVkOiB0eXBlb2YgXy5pc1VuZGVmaW5lZDsKKyAgICBleHBvcnQgPSBpc1VuZGVmaW5lZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzV2Vha01hcCIgeworICAgIGNvbnN0IGlzV2Vha01hcDogdHlwZW9mIF8uaXNXZWFrTWFwOworICAgIGV4cG9ydCA9IGlzV2Vha01hcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmlzV2Vha1NldCIgeworICAgIGNvbnN0IGlzV2Vha1NldDogdHlwZW9mIF8uaXNXZWFrU2V0OworICAgIGV4cG9ydCA9IGlzV2Vha1NldDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLmpvaW4iIHsKKyAgICBjb25zdCBqb2luOiB0eXBlb2YgXy5qb2luOworICAgIGV4cG9ydCA9IGpvaW47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5rZWJhYkNhc2UiIHsKKyAgICBjb25zdCBrZWJhYkNhc2U6IHR5cGVvZiBfLmtlYmFiQ2FzZTsKKyAgICBleHBvcnQgPSBrZWJhYkNhc2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5sYXN0IiB7CisgICAgY29uc3QgbGFzdDogdHlwZW9mIF8ubGFzdDsKKyAgICBleHBvcnQgPSBsYXN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubGFzdEluZGV4T2YiIHsKKyAgICBjb25zdCBsYXN0SW5kZXhPZjogdHlwZW9mIF8ubGFzdEluZGV4T2Y7CisgICAgZXhwb3J0ID0gbGFzdEluZGV4T2Y7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5sb3dlckNhc2UiIHsKKyAgICBjb25zdCBsb3dlckNhc2U6IHR5cGVvZiBfLmxvd2VyQ2FzZTsKKyAgICBleHBvcnQgPSBsb3dlckNhc2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5sb3dlckZpcnN0IiB7CisgICAgY29uc3QgbG93ZXJGaXJzdDogdHlwZW9mIF8ubG93ZXJGaXJzdDsKKyAgICBleHBvcnQgPSBsb3dlckZpcnN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubHQiIHsKKyAgICBjb25zdCBsdDogdHlwZW9mIF8ubHQ7CisgICAgZXhwb3J0ID0gbHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5sdGUiIHsKKyAgICBjb25zdCBsdGU6IHR5cGVvZiBfLmx0ZTsKKyAgICBleHBvcnQgPSBsdGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5tYXgiIHsKKyAgICBjb25zdCBtYXg6IHR5cGVvZiBfLm1heDsKKyAgICBleHBvcnQgPSBtYXg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5tYXhCeSIgeworICAgIGNvbnN0IG1heEJ5OiB0eXBlb2YgXy5tYXhCeTsKKyAgICBleHBvcnQgPSBtYXhCeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm1lYW4iIHsKKyAgICBjb25zdCBtZWFuOiB0eXBlb2YgXy5tZWFuOworICAgIGV4cG9ydCA9IG1lYW47Cit9CisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm1lYW5CeSIgeworIGNvbnN0IG1lYW5CeTogdHlwZW9mIF8ubWVhbkJ5OworIGV4cG9ydCA9IG1lYW5CeTsKKyB9CisgKi8KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5taW4iIHsKKyAgICBjb25zdCBtaW46IHR5cGVvZiBfLm1pbjsKKyAgICBleHBvcnQgPSBtaW47Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5taW5CeSIgeworICAgIGNvbnN0IG1pbkJ5OiB0eXBlb2YgXy5taW5CeTsKKyAgICBleHBvcnQgPSBtaW5CeTsKK30KKworLyoqCisgKiB1bmNvbWVudCBpdCBpZiBkZWZpbml0aW9uIGV4aXN0cworICovCisvKgorIGRlY2xhcmUgbW9kdWxlICJsb2Rhc2gubXVsdGlwbHkiIHsKKyBjb25zdCBtdWx0aXBseTogdHlwZW9mIF8ubXVsdGlwbHk7CisgZXhwb3J0ID0gbXVsdGlwbHk7CisgfQorICovCisKKy8qKgorICogdW5jb21lbnQgaXQgaWYgZGVmaW5pdGlvbiBleGlzdHMKKyAqLworLyoKKyBkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm50aCIgeworIGNvbnN0IG50aDogdHlwZW9mIF8ubnRoOworIGV4cG9ydCA9IG50aDsKKyB9CisgKi8KKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5ub0NvbmZsaWN0IiB7CisgICAgY29uc3Qgbm9Db25mbGljdDogdHlwZW9mIF8ubm9Db25mbGljdDsKKyAgICBleHBvcnQgPSBub0NvbmZsaWN0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gubm9vcCIgeworICAgIGNvbnN0IG5vb3A6IHR5cGVvZiBfLm5vb3A7CisgICAgZXhwb3J0ID0gbm9vcDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLm5vdyIgeworICAgIGNvbnN0IG5vdzogdHlwZW9mIF8ubm93OworICAgIGV4cG9ydCA9IG5vdzsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnBhZCIgeworICAgIGNvbnN0IHBhZDogdHlwZW9mIF8ucGFkOworICAgIGV4cG9ydCA9IHBhZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnBhZEVuZCIgeworICAgIGNvbnN0IHBhZEVuZDogdHlwZW9mIF8ucGFkRW5kOworICAgIGV4cG9ydCA9IHBhZEVuZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnBhZFN0YXJ0IiB7CisgICAgY29uc3QgcGFkU3RhcnQ6IHR5cGVvZiBfLnBhZFN0YXJ0OworICAgIGV4cG9ydCA9IHBhZFN0YXJ0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gucGFyc2VJbnQiIHsKKyAgICBjb25zdCBwYXJzZUludDogdHlwZW9mIF8ucGFyc2VJbnQ7CisgICAgZXhwb3J0ID0gcGFyc2VJbnQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yYW5kb20iIHsKKyAgICBjb25zdCByYW5kb206IHR5cGVvZiBfLnJhbmRvbTsKKyAgICBleHBvcnQgPSByYW5kb207Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yZWR1Y2UiIHsKKyAgICBjb25zdCByZWR1Y2U6IHR5cGVvZiBfLnJlZHVjZTsKKyAgICBleHBvcnQgPSByZWR1Y2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yZWR1Y2VSaWdodCIgeworICAgIGNvbnN0IHJlZHVjZVJpZ2h0OiB0eXBlb2YgXy5yZWR1Y2VSaWdodDsKKyAgICBleHBvcnQgPSByZWR1Y2VSaWdodDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnJlcGVhdCIgeworICAgIGNvbnN0IHJlcGVhdDogdHlwZW9mIF8ucmVwZWF0OworICAgIGV4cG9ydCA9IHJlcGVhdDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnJlcGxhY2UiIHsKKyAgICBjb25zdCByZXBsYWNlOiB0eXBlb2YgXy5yZXBsYWNlOworICAgIGV4cG9ydCA9IHJlcGxhY2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yZXN1bHQiIHsKKyAgICBjb25zdCByZXN1bHQ6IHR5cGVvZiBfLnJlc3VsdDsKKyAgICBleHBvcnQgPSByZXN1bHQ7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5yb3VuZCIgeworICAgIGNvbnN0IHJvdW5kOiB0eXBlb2YgXy5yb3VuZDsKKyAgICBleHBvcnQgPSByb3VuZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnJ1bkluQ29udGV4dCIgeworICAgIGNvbnN0IHJ1bkluQ29udGV4dDogdHlwZW9mIF8ucnVuSW5Db250ZXh0OworICAgIGV4cG9ydCA9IHJ1bkluQ29udGV4dDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNhbXBsZSIgeworICAgIGNvbnN0IHNhbXBsZTogdHlwZW9mIF8uc2FtcGxlOworICAgIGV4cG9ydCA9IHNhbXBsZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNpemUiIHsKKyAgICBjb25zdCBzaXplOiB0eXBlb2YgXy5zaXplOworICAgIGV4cG9ydCA9IHNpemU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zbmFrZUNhc2UiIHsKKyAgICBjb25zdCBzbmFrZUNhc2U6IHR5cGVvZiBfLnNuYWtlQ2FzZTsKKyAgICBleHBvcnQgPSBzbmFrZUNhc2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zb21lIiB7CisgICAgY29uc3Qgc29tZTogdHlwZW9mIF8uc29tZTsKKyAgICBleHBvcnQgPSBzb21lOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc29ydGVkSW5kZXgiIHsKKyAgICBjb25zdCBzb3J0ZWRJbmRleDogdHlwZW9mIF8uc29ydGVkSW5kZXg7CisgICAgZXhwb3J0ID0gc29ydGVkSW5kZXg7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zb3J0ZWRJbmRleEJ5IiB7CisgICAgY29uc3Qgc29ydGVkSW5kZXhCeTogdHlwZW9mIF8uc29ydGVkSW5kZXhCeTsKKyAgICBleHBvcnQgPSBzb3J0ZWRJbmRleEJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc29ydGVkSW5kZXhPZiIgeworICAgIGNvbnN0IHNvcnRlZEluZGV4T2Y6IHR5cGVvZiBfLnNvcnRlZEluZGV4T2Y7CisgICAgZXhwb3J0ID0gc29ydGVkSW5kZXhPZjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNvcnRlZExhc3RJbmRleCIgeworICAgIGNvbnN0IHNvcnRlZExhc3RJbmRleDogdHlwZW9mIF8uc29ydGVkTGFzdEluZGV4OworICAgIGV4cG9ydCA9IHNvcnRlZExhc3RJbmRleDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5IiB7CisgICAgY29uc3Qgc29ydGVkTGFzdEluZGV4Qnk6IHR5cGVvZiBfLnNvcnRlZExhc3RJbmRleEJ5OworICAgIGV4cG9ydCA9IHNvcnRlZExhc3RJbmRleEJ5OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YiIHsKKyAgICBjb25zdCBzb3J0ZWRMYXN0SW5kZXhPZjogdHlwZW9mIF8uc29ydGVkTGFzdEluZGV4T2Y7CisgICAgZXhwb3J0ID0gc29ydGVkTGFzdEluZGV4T2Y7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zdGFydENhc2UiIHsKKyAgICBjb25zdCBzdGFydENhc2U6IHR5cGVvZiBfLnN0YXJ0Q2FzZTsKKyAgICBleHBvcnQgPSBzdGFydENhc2U7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zdGFydHNXaXRoIiB7CisgICAgY29uc3Qgc3RhcnRzV2l0aDogdHlwZW9mIF8uc3RhcnRzV2l0aDsKKyAgICBleHBvcnQgPSBzdGFydHNXaXRoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guc3VidHJhY3QiIHsKKyAgICBjb25zdCBzdWJ0cmFjdDogdHlwZW9mIF8uc3VidHJhY3Q7CisgICAgZXhwb3J0ID0gc3VidHJhY3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zdW0iIHsKKyAgICBjb25zdCBzdW06IHR5cGVvZiBfLnN1bTsKKyAgICBleHBvcnQgPSBzdW07Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5zdW1CeSIgeworICAgIGNvbnN0IHN1bUJ5OiB0eXBlb2YgXy5zdW1CeTsKKyAgICBleHBvcnQgPSBzdW1CeTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRlbXBsYXRlIiB7CisgICAgY29uc3QgdGVtcGxhdGU6IHR5cGVvZiBfLnRlbXBsYXRlOworICAgIGV4cG9ydCA9IHRlbXBsYXRlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudGltZXMiIHsKKyAgICBjb25zdCB0aW1lczogdHlwZW9mIF8udGltZXM7CisgICAgZXhwb3J0ID0gdGltZXM7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50b0ludGVnZXIiIHsKKyAgICBjb25zdCB0b0ludGVnZXI6IHR5cGVvZiBfLnRvSW50ZWdlcjsKKyAgICBleHBvcnQgPSB0b0ludGVnZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50b0xlbmd0aCIgeworICAgIGNvbnN0IHRvTGVuZ3RoOiB0eXBlb2YgXy50b0xlbmd0aDsKKyAgICBleHBvcnQgPSB0b0xlbmd0aDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRvTG93ZXIiIHsKKyAgICBjb25zdCB0b0xvd2VyOiB0eXBlb2YgXy50b0xvd2VyOworICAgIGV4cG9ydCA9IHRvTG93ZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50b051bWJlciIgeworICAgIGNvbnN0IHRvTnVtYmVyOiB0eXBlb2YgXy50b051bWJlcjsKKyAgICBleHBvcnQgPSB0b051bWJlcjsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRvU2FmZUludGVnZXIiIHsKKyAgICBjb25zdCB0b1NhZmVJbnRlZ2VyOiB0eXBlb2YgXy50b1NhZmVJbnRlZ2VyOworICAgIGV4cG9ydCA9IHRvU2FmZUludGVnZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50b1N0cmluZyIgeworICAgIGNvbnN0IHRvU3RyaW5nOiB0eXBlb2YgXy50b1N0cmluZzsKKyAgICBleHBvcnQgPSB0b1N0cmluZzsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRvVXBwZXIiIHsKKyAgICBjb25zdCB0b1VwcGVyOiB0eXBlb2YgXy50b1VwcGVyOworICAgIGV4cG9ydCA9IHRvVXBwZXI7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC50cmltIiB7CisgICAgY29uc3QgdHJpbTogdHlwZW9mIF8udHJpbTsKKyAgICBleHBvcnQgPSB0cmltOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudHJpbUVuZCIgeworICAgIGNvbnN0IHRyaW1FbmQ6IHR5cGVvZiBfLnRyaW1FbmQ7CisgICAgZXhwb3J0ID0gdHJpbUVuZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRyaW1TdGFydCIgeworICAgIGNvbnN0IHRyaW1TdGFydDogdHlwZW9mIF8udHJpbVN0YXJ0OworICAgIGV4cG9ydCA9IHRyaW1TdGFydDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnRydW5jYXRlIiB7CisgICAgY29uc3QgdHJ1bmNhdGU6IHR5cGVvZiBfLnRydW5jYXRlOworICAgIGV4cG9ydCA9IHRydW5jYXRlOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2gudW5lc2NhcGUiIHsKKyAgICBjb25zdCB1bmVzY2FwZTogdHlwZW9mIF8udW5lc2NhcGU7CisgICAgZXhwb3J0ID0gdW5lc2NhcGU7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC51bmlxdWVJZCIgeworICAgIGNvbnN0IHVuaXF1ZUlkOiB0eXBlb2YgXy51bmlxdWVJZDsKKyAgICBleHBvcnQgPSB1bmlxdWVJZDsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnVwcGVyQ2FzZSIgeworICAgIGNvbnN0IHVwcGVyQ2FzZTogdHlwZW9mIF8udXBwZXJDYXNlOworICAgIGV4cG9ydCA9IHVwcGVyQ2FzZTsKK30KKworCitkZWNsYXJlIG1vZHVsZSAibG9kYXNoLnVwcGVyRmlyc3QiIHsKKyAgICBjb25zdCB1cHBlckZpcnN0OiB0eXBlb2YgXy51cHBlckZpcnN0OworICAgIGV4cG9ydCA9IHVwcGVyRmlyc3Q7Cit9CisKKworZGVjbGFyZSBtb2R1bGUgImxvZGFzaC5lYWNoIiB7CisgICAgY29uc3QgZWFjaDogdHlwZW9mIF8uZWFjaDsKKyAgICBleHBvcnQgPSBlYWNoOworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZWFjaFJpZ2h0IiB7CisgICAgY29uc3QgZWFjaFJpZ2h0OiB0eXBlb2YgXy5lYWNoUmlnaHQ7CisgICAgZXhwb3J0ID0gZWFjaFJpZ2h0OworfQorCisKK2RlY2xhcmUgbW9kdWxlICJsb2Rhc2guZmlyc3QiIHsKKyAgICBjb25zdCBmaXJzdDogdHlwZW9mIF8uZmlyc3Q7CisgICAgZXhwb3J0ID0gZmlyc3Q7Cit9CisKKy8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCAtLXRhcmdldCBlczUKK2ludGVyZmFjZSBTZXQ8VD4ge30KK2ludGVyZmFjZSBNYXA8SywgVj4ge30KK2ludGVyZmFjZSBXZWFrU2V0PFQ+IHt9CitpbnRlcmZhY2UgV2Vha01hcDxLLCBWPiB7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhdGFsb2ctdWkvdHlwaW5ncy9ub3RpZnlqcy9ub3RpZnlqcy5kLnRzIGIvY2F0YWxvZy11aS90eXBpbmdzL25vdGlmeWpzL25vdGlmeWpzLmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyODI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhdGFsb2ctdWkvdHlwaW5ncy9ub3RpZnlqcy9ub3RpZnlqcy5kLnRzCkBAIC0wLDAgKzEsMTI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8gVHlwZSBkZWZpbml0aW9ucyBmb3Igbm90aWZ5LmpzIDEuMi4wCisvLyBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vYWxleGdpYnNvbi9ub3RpZnkuanMKKy8vIERlZmluaXRpb25zIGJ5OiBzb3VuZFRyaWNrZXIgPGh0dHBzOi8vZ2l0aHViLmNvbS9zb3VuZFRyaWNrZXI+CisvLyBEZWZpbml0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL2JvcmlzeWFua292L0RlZmluaXRlbHlUeXBlZAorCitkZWNsYXJlIHZhciBOb3RpZnk6IHsKKyAgICBuZXcgKHRpdGxlIDogc3RyaW5nICwgb3B0aW9ucz8gOiBub3RpZnlqcy5JTm90aWZ5T3B0aW9uKTogbm90aWZ5anMuSU5vdGlmeTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlzIHBlcm1pc3Npb24gaXMgbmVlZGVkIGZvciB0aGUgdXNlciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuCisgICAgICogQHJldHVybiB0cnVlIDogbmVlZHMgcGVybWlzc2lvbiwgZmFsc2UgOiBkb2VzIG5vdCBuZWVkCisgICAgICovCisgICAgbmVlZHNQZXJtaXNzaW9uKCkgOiBib29sZWFuOworCisgICAgLyoqCisgICAgICogQXNrcyB0aGUgdXNlciBmb3IgcGVybWlzc2lvbiB0byBkaXNwbGF5IG5vdGlmaWNhdGlvbnMKKyAgICAgKiBAcGFyYW0gb25QZXJtaXNzaW9uR3JhbnRlZENhbGxiYWNrIEEgY2FsbGJhY2sgZm9yIHBlcm1taXNpb24gaXMgZ3JhbnRlZC4KKyAgICAgKiBAcGFyYW0gb25QZXJtaXNzaW9uRGVuaWVkQ2FsbGJhY2sgIEEgY2FsbGJhY2sgZm9yIHBlcm1taXNpb24gaXMgZGVuaWVkLgorICAgICAqLworICAgIHJlcXVlc3RQZXJtaXNzaW9uKG9uUGVybWlzc2lvbkdyYW50ZWRDYWxsYmFjaz86ICgpPT4gYW55LCBvblBlcm1pc3Npb25EZW5pZWRDYWxsYmFjaz8gOiAoKT0+IGFueSkgOiB2b2lkOworCisgICAgLyoqCisgICAgICogcmV0dXJuIHRydWUgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgSFRNTDUgTm90aWZpY2F0aW9uCisgICAgICogQHBhcmFtIHRydWUgOiB0aGUgYnJvd3NlciBzdXBwb3J0cyBIVE1MNSBOb3RpZmljYXRpb24sIGZhbHNlIDsgdGhlIGJyb3dzd2VyIGRvZXMgbm90IHN1cHBvcnRzIEhUTUw1IE5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBpc1N1cHBvcnRlZCgpIDogYm9vbGVhbjsKK30KKworZGVjbGFyZSBtb2R1bGUgbm90aWZ5anMgeworICAgIAorICAgIC8qKgorICAgICAqIEludGVyZmFjZSBmb3IgV2ViIE5vdGlmaWNhdGlvbnMgQVBJIFdyYXBwZXIuCisgICAgICovCisgICAgIGludGVyZmFjZSBJTm90aWZ5IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNob3cgdGhlIG5vdGlmaWNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHNob3coKSA6IHZvaWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXIuCisgICAgICAgICAqLworICAgICAgICBkZXN0cm95KCkgOiB2b2lkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGUgbm90aWZpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY2xvc2UoKSA6IHZvaWQ7CisgICAgICAgIG9uU2hvd05vdGlmaWNhdGlvbihlIDogRXZlbnQpIDogdm9pZDsKKyAgICAgICAgb25DbG9zZU5vdGlmaWNhdGlvbigpIDogdm9pZDsKKyAgICAgICAgb25DbGlja05vdGlmaWNhdGlvbigpIDogdm9pZDsKKyAgICAgICAgb25FcnJvck5vdGlmaWNhdGlvbigpIDogdm9pZDsKKyAgICAgICAgaGFuZGxlRXZlbnQoZSA6IEV2ZW50KSA6IHZvaWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEludGVyZmFjZSBmb3IgdGhlIE5vdGlmeSdzIG9wdGlvbmFsIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgSU5vdGlmeU9wdGlvbiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGJvZHkKKyAgICAgICAgICovCisgICAgICAgIGJvZHk/IDogc3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBwYXRoIGZvciBpY29uIHRvIGRpc3BsYXkgaW4gbm90aWZpY2F0aW9uCisgICAgICAgICAqLworICAgICAgICBpY29uPyA6IHN0cmluZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogdW5pcXVlIGlkZW50aWZpZXIgdG8gc3RvcCBkdXBsaWNhdGUgbm90aWZpY2F0aW9ucworICAgICAgICAgKi8KKyAgICAgICAgdGFnPyA6IHN0cmluZzsKKyAgICAgICAgCisgICAgICAgICAvKioKKyAgICAgICAgICogbnVtYmVyIG9mIHNlY29uZHMgdG8gY2xvc2UgdGhlIG5vdGlmaWNhdGlvbiBhdXRvbWF0aWNhbGx5CisgICAgICAgICAqLworICAgICAgICB0aW1lb3V0PyA6IG51bWJlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogY2FsbGJhY2sgd2hlbiBub3RpZmljYXRpb24gaXMgc2hvd24KKyAgICAgICAgICovCisgICAgICAgIG5vdGlmeVNob3c/IChlIDogRXZlbnQpOiBhbnk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBjYWxsYmFjayB3aGVuIG5vdGlmaWNhdGlvbiBpcyBjbG9zZWQKKyAgICAgICAgICovCisgICAgICAgIG5vdGlmeUNsb3NlPyA6IEZ1bmN0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogY2FsbGJhY2sgd2hlbiBub3RpZmljYXRpb24gaXMgY2xpY2tlZAorICAgICAgICAgKi8KKyAgICAgICAgbm90aWZ5Q2xpY2s/IDogRnVuY3Rpb247CisgICAgICAgIC8qKgorICAgICAgICAgKiBjYWxsYmFjayB3aGVuIG5vdGlmaWNhdGlvbiB0aHJvd3MgYW4gZXJyb3IKKyAgICAgICAgICovCisgICAgICAgIG5vdGlmeUVycm9yPyA6IEZ1bmN0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogIGNhbGxiYWNrIHdoZW4gdXNlciBoYXMgZ3JhbnRlZCBwZXJtaXNzaW9uCisgICAgICAgICAqLworICAgICAgICBwZXJtaXNzaW9uR3JhbnRlZD8gOiBGdW5jdGlvbjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNhbGxiYWNrIHdoZW4gdXNlciBoYXMgZGVuaWVkIHBlcm1pc3Npb24KKyAgICAgICAgICovCisgICAgICAgIHBlcm1pc3Npb25EZW5pZWQ/IDogRnVuY3Rpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY2F0YWxvZy11aS90eXBpbmdzL3RzZC5kLnRzIGIvY2F0YWxvZy11aS90eXBpbmdzL3RzZC5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTYzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYXRhbG9nLXVpL3R5cGluZ3MvdHNkLmQudHMKQEAgLTAsMCArMSwyMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vLyA8cmVmZXJlbmNlIHBhdGg9Im5vdGlmeWpzL25vdGlmeWpzLmQudHMiIC8+CisvLy8gPHJlZmVyZW5jZSBwYXRoPSJqYXNtaW5lL2phc21pbmUuZC50cyIgLz4KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpLy5naXRpZ25vcmUgYi9jb21tb24tYXBwLWFwaS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjJlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorL3RhcmdldAorL3RhcmdldApkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvcG9tLnhtbCBiL2NvbW1vbi1hcHAtYXBpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ZTcyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3BvbS54bWwKQEAgLTAsMCArMSwyMDkgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisJCisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCQorCTxhcnRpZmFjdElkPmNvbW1vbi1hcHAtYXBpPC9hcnRpZmFjdElkPgorCQorCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5zZGMtbWFpbjwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJPC9wYXJlbnQ+CisJCisJCisJPGRlcGVuZGVuY2llcz4KKwkgIAk8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VjdXJpdHktdXRpbHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlY3VyaXR5LXV0aWxzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCQk8IS0tIGZ1bmN0aW9uYWwgamF2YSAtLT4KKyAgICAgIAorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5mdW5jdGlvbmFsamF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmZ1bmN0aW9uYWxqYXZhPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIAorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSB5YW1sIHRvIG9iamVjdCBjb252ZXJ0ZXIgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnlhbWw8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8IS0tICBsaXN0ZW4gdG8gZmlsZSBjaGFuZ2VzIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtamNpLWNvcmU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8IS0tIEdzb24gLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSAgaHR0cCBjbGllbnQgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBBc3BlY3RzIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5qY2FiaTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpjYWJpLWFzcGVjdHM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXNwZWN0ajwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmFzcGVjdGpydDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQk8IS0tIGxvZ2dpbmcgLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y2gucW9zLmxvZ2JhY2s8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5sb2diYWNrLWNsYXNzaWM8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZ2JhY2stY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPCEtLSBsb2dnaW5nIGVuZCAtLT4KKwkJPCEtLSAgLS0+CisJCTxkZXBlbmRlbmN5PiAgICAKKwkJCTxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7Z3VhdmEudmVyc2lvbn08L3ZlcnNpb24+PCEtLSROTy1NVk4tTUFOLVZFUiQtLT4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorICAJCQk8Z3JvdXBJZD5vcmcuZnVzZXNvdXJjZTwvZ3JvdXBJZD4KKyAgCQkJPGFydGlmYWN0SWQ+c2lnYXI8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT50ZXN0PC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPCEtLSBqc291cCBIVE1MIHBhcnNlciBsaWJyYXJ5IEAgaHR0cDovL2pzb3VwLm9yZy8gLS0+CisJCTxkZXBlbmRlbmN5PgorICAJCQk8Z3JvdXBJZD5vcmcuanNvdXA8L2dyb3VwSWQ+CisgIAkJCTxhcnRpZmFjdElkPmpzb3VwPC9hcnRpZmFjdElkPgorICAJCQk8dmVyc2lvbj4xLjguMzwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQk8Z3JvdXBJZD5jb21tb25zLXZhbGlkYXRvcjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtdmFsaWRhdG9yPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5qZXR0aXNvbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpldHRpc29uPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4zLjg8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkgICAgPGdyb3VwSWQ+ZGUucnVlZGlnZXJtb2VsbGVyPC9ncm91cElkPgorCQkgICAgPGFydGlmYWN0SWQ+ZnN0PC9hcnRpZmFjdElkPgorCQkgICAgPHZlcnNpb24+Mi40NzwvdmVyc2lvbj4KKwkJICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCTwvZGVwZW5kZW5jaWVzPgorCis8YnVpbGQ+CisJPHBsdWdpbnM+CisJCTxwbHVnaW4+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5tYXZlbi1kZXBsb3ktcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJPHNraXA+dHJ1ZTwvc2tpcD4KKwkJCTwvY29uZmlndXJhdGlvbj4KKwkJPC9wbHVnaW4+CisJPC9wbHVnaW5zPgorPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvQmVFY29tcEVycm9yTWFuYWdlci5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvQmVFY29tcEVycm9yTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjc1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbmZpZy9CZUVjb21wRXJyb3JNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWc7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkFic0Vjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5JRWNvbXBDb25maWd1cmF0aW9uTWFuYWdlcjsKKworcHVibGljIGNsYXNzIEJlRWNvbXBFcnJvck1hbmFnZXIgZXh0ZW5kcyBBYnNFY29tcEVycm9yTWFuYWdlciB7CisKKwlwdWJsaWMgZW51bSBDb21wb25lbnROYW1lIHsKKwkJU0VSVklDRSwgUFJPRFVDVCwgVkYKKwl9CisKKwlwdWJsaWMgZW51bSBFcnJvclNldmVyaXR5IHsKKwkJSU5GTywgV0FSTklORywgRVJST1IsIEZBVEFMCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQmVFY29tcEVycm9yTWFuYWdlciBpbnN0YW5jZTsKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKKworCXByaXZhdGUgQmVFY29tcEVycm9yTWFuYWdlcigpIHsKKwl9OworCisJcHVibGljIHN0YXRpYyBCZUVjb21wRXJyb3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworCisJCQlpbnN0YW5jZSA9IGluaXQoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEJlRWNvbXBFcnJvck1hbmFnZXIgaW5pdCgpIHsKKwkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKKwkJCWluc3RhbmNlID0gbmV3IEJlRWNvbXBFcnJvck1hbmFnZXIoKTsKKwkJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgeworCQlyZXR1cm4gY29uZmlndXJhdGlvbk1hbmFnZXI7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVVZWJBdXRoZW50aWNhdGlvbkVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgcmVhc29uKSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlVWViQXV0aGVudGljYXRpb25FcnJvciwgcmVhc29uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUhlYWx0aENoZWNrUmVjb3ZlcnkoU3RyaW5nIGNvbnRleHQpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVIZWFsdGhDaGVja1JlY292ZXJ5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUhlYWx0aENoZWNrVGl0YW5SZWNvdmVyeShTdHJpbmcgY29udGV4dCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUhlYWx0aENoZWNrVGl0YW5SZWNvdmVyeSk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVIZWFsdGhDaGVja0VsYXN0aWNTZWFyY2hSZWNvdmVyeShTdHJpbmcgY29udGV4dCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUhlYWx0aENoZWNrRWxhc3RpY1NlYXJjaFJlY292ZXJ5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUhlYWx0aENoZWNrVWViQ2x1c3RlclJlY292ZXJ5KFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlSGVhbHRoQ2hlY2tVZWJDbHVzdGVyUmVjb3ZlcnkpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0ZlSGVhbHRoQ2hlY2tSZWNvdmVyeShTdHJpbmcgY29udGV4dCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5GZUhlYWx0aENoZWNrUmVjb3ZlcnkpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlSGVhbHRoQ2hlY2tFcnJvcihTdHJpbmcgY29udGV4dCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUhlYWx0aENoZWNrRXJyb3IpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlSGVhbHRoQ2hlY2tUaXRhbkVycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlSGVhbHRoQ2hlY2tUaXRhbkVycm9yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUhlYWx0aENoZWNrRWxhc3RpY1NlYXJjaEVycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlSGVhbHRoQ2hlY2tFbGFzdGljU2VhcmNoRXJyb3IpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlSGVhbHRoQ2hlY2tVZWJDbHVzdGVyRXJyb3IoU3RyaW5nIGNvbnRleHQpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVIZWFsdGhDaGVja1VlYkNsdXN0ZXJFcnJvcik7CisJfQorCisJcHVibGljIHZvaWQgbG9nRmVIZWFsdGhDaGVja0Vycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkZlSGVhbHRoQ2hlY2tFcnJvcik7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbnRleHQKKwkgKiBAcGFyYW0gcmVhc29uCisJICovCisJcHVibGljIHZvaWQgbG9nQmVVZWJDb25uZWN0aW9uRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyByZWFzb24pIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVVZWJDb25uZWN0aW9uRXJyb3IsIHJlYXNvbik7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVVZWJVbmtvd25Ib3N0RXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBob3N0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlVWViVW5rb3duSG9zdEVycm9yLCBob3N0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUNvbXBvbmVudE1pc3NpbmdFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIGNvbXBvbmVudFR5cGUsIFN0cmluZyBuYW1lKSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlQ29tcG9uZW50TWlzc2luZ0Vycm9yLCBjb21wb25lbnRUeXBlLCBuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUluY29ycmVjdENvbXBvbmVudEVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgY29tcG9uZW50VHlwZSwgU3RyaW5nIG5hbWUpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVJbmNvcnJlY3RDb21wb25lbnRFcnJvciwgY29tcG9uZW50VHlwZSwgbmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgcGFyYW1ldGVyTmFtZSwgU3RyaW5nIHBhcmFtZXRlclZhbHVlKSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvciwgcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlVWViT2JqZWN0Tm90Rm91bmRFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIG5vdEZvdW5kT2JqZWN0TmFtZSkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZVVlYk9iamVjdE5vdEZvdW5kRXJyb3IsIG5vdEZvdW5kT2JqZWN0TmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVEaXN0cmlidXRpb25FbmdpbmVJbnZhbGlkQXJ0aWZhY3RUeXBlKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgYXJ0aWZhY3RUeXBlLAorCQkJU3RyaW5nIHZhbGlkQXJ0aWZhY3RUeXBlcykgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZURpc3RyaWJ1dGlvbkVuZ2luZUludmFsaWRBcnRpZmFjdFR5cGUsIGFydGlmYWN0VHlwZSwKKwkJCQl2YWxpZEFydGlmYWN0VHlwZXMpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yLCBwYXJhbWV0ZXJOYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUNvbmZpZ3VyYXRpb25JbnZhbGlkTGlzdFNpemVFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIHBhcmFtZXRlck5hbWUsIGludCBsaXN0TWluaW11bVNpemUpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVDb25maWd1cmF0aW9uSW52YWxpZExpc3RTaXplRXJyb3IsIHBhcmFtZXRlck5hbWUsCisJCQkJU3RyaW5nLnZhbHVlT2YobGlzdE1pbmltdW1TaXplKSk7CisJfQorCisJcHVibGljIHZvaWQgbG9nRXJyb3JDb25maWdGaWxlRm9ybWF0KFN0cmluZyBjb250ZXh0LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uRXJyb3JDb25maWdGaWxlRm9ybWF0LCBkZXNjcmlwdGlvbik7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVNaXNzaW5nQXJ0aWZhY3RJbmZvcm1hdGlvbkVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgbWlzc2luZ0luZm8pIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVNaXNzaW5nQXJ0aWZhY3RJbmZvcm1hdGlvbkVycm9yLCBtaXNzaW5nSW5mbyk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVBcnRpZmFjdE1pc3NpbmdFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIGFydGlmYWN0TmFtZSkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUFydGlmYWN0TWlzc2luZ0Vycm9yLCBhcnRpZmFjdE5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlVXNlck1pc3NpbmdFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIHVzZXJJZCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZVVzZXJNaXNzaW5nRXJyb3IsIHVzZXJJZCk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVJbnZhbGlkVHlwZUVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVJbnZhbGlkVHlwZUVycm9yLCB0eXBlLCBuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUludmFsaWRWYWx1ZUVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUludmFsaWRWYWx1ZUVycm9yLCB2YWx1ZSwgbmFtZSwgdHlwZSk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVBcnRpZmFjdFBheWxvYWRJbnZhbGlkKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlQXJ0aWZhY3RQYXlsb2FkSW52YWxpZCk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVBcnRpZmFjdEluZm9ybWF0aW9uSW52YWxpZEVycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlQXJ0aWZhY3RJbmZvcm1hdGlvbkludmFsaWRFcnJvcik7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVEaXN0cmlidXRpb25NaXNzaW5nRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBkaXN0cmlidXRpb25OYW1lKSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlRGlzdHJpYnV0aW9uTWlzc2luZ0Vycm9yLCAiRGlzdHJpYnV0aW9uIiwgZGlzdHJpYnV0aW9uTmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVHcmFwaE9iamVjdE1pc3NpbmdFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIG9iamVjdFR5cGUsIFN0cmluZyBvYmplY3ROYW1lKSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlR3JhcGhPYmplY3RNaXNzaW5nRXJyb3IsIG9iamVjdFR5cGUsIG9iamVjdE5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlSW52YWxpZEpzb25JbnB1dChTdHJpbmcgY29udGV4dCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUludmFsaWRKc29uSW5wdXQpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlSW5pdGlhbGl6YXRpb25FcnJvcihTdHJpbmcgY29udGV4dCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUluaXRpYWxpemF0aW9uRXJyb3IpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlRmFpbGVkQWRkaW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgc2VydmljZUlkKSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlRmFpbGVkQWRkaW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yLCByZXNvdXJjZU5hbWUsIHNlcnZpY2VJZCk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVVZWJTeXN0ZW1FcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIG9wZXJhdGlvbikgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZVVlYlN5c3RlbUVycm9yLCBvcGVyYXRpb24pOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBvcGVyYXRpb24pIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvciwgb3BlcmF0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUZhaWxlZEFkZGluZ05vZGVUeXBlRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBub2RlVHlwZSkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUZhaWxlZEFkZGluZ05vZGVUeXBlRXJyb3IsIG5vZGVUeXBlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZURhb1N5c3RlbUVycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlRGFvU3lzdGVtRXJyb3IpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlU3lzdGVtRXJyb3IoU3RyaW5nIGNvbnRleHQpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVTeXN0ZW1FcnJvcik7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVFeGVjdXRlUm9sbGJhY2tFcnJvcihTdHJpbmcgY29udGV4dCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUV4ZWN1dGVSb2xsYmFja0Vycm9yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUZhaWxlZExvY2tPYmplY3RFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIHR5cGUsIFN0cmluZyBpZCkgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUZhaWxlZExvY2tPYmplY3RFcnJvciwgdHlwZSwgaWQpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlRmFpbGVkQ3JlYXRlTm9kZUVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBzdGF0dXMpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVGYWlsZWRDcmVhdGVOb2RlRXJyb3IsIG5vZGVOYW1lLCBzdGF0dXMpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlRmFpbGVkVXBkYXRlTm9kZUVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBzdGF0dXMpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IsIG5vZGVOYW1lLCBzdGF0dXMpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlRmFpbGVkRGVsZXRlTm9kZUVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBzdGF0dXMpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVGYWlsZWREZWxldGVOb2RlRXJyb3IsIG5vZGVOYW1lLCBzdGF0dXMpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0JlRmFpbGVkUmV0cmlldmVOb2RlRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHN0YXR1cykgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yLCBub2RlTmFtZSwgc3RhdHVzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUZhaWxlZEZpbmRQYXJlbnRFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIG5vZGUsIFN0cmluZyBzdGF0dXMpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVGYWlsZWRGaW5kUGFyZW50RXJyb3IsIG5vZGUsIHN0YXR1cyk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVGYWlsZWRGaW5kQWxsTm9kZXNFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIG5vZGVUeXBlLCBTdHJpbmcgcGFyZW50Tm9kZSwgU3RyaW5nIHN0YXR1cykgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUZhaWxlZEZpbmRBbGxOb2Rlc0Vycm9yLCBub2RlVHlwZSwgcGFyZW50Tm9kZSwgc3RhdHVzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dCZUZhaWxlZEZpbmRBc3NvY2lhdGlvbkVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgbm9kZVR5cGUsIFN0cmluZyBmcm9tTm9kZSwgU3RyaW5nIHN0YXR1cykgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5CZUZhaWxlZEZpbmRBc3NvY2lhdGlvbkVycm9yLCBub2RlVHlwZSwgZnJvbU5vZGUsIHN0YXR1cyk7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVDb21wb25lbnRDbGVhbmVyU3lzdGVtRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBvcGVyYXRpb24pIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uQmVDb21wb25lbnRDbGVhbmVyU3lzdGVtRXJyb3IsIG9wZXJhdGlvbik7CisJfQorCisJcHVibGljIHZvaWQgbG9nQmVSZXN0QXBpR2VuZXJhbEVycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkJlUmVzdEFwaUdlbmVyYWxFcnJvcik7CisJfQorCisJcHVibGljIHZvaWQgbG9nRnFkblJlc29sdmVFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkZxZG5SZXNvbHZlRXJyb3IsIGRlc2NyaXB0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dTaXRlU3dpdGNob3ZlckluZm8oU3RyaW5nIGNvbnRleHQsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5TaXRlU3dpdGNob3ZlckluZm8sIGRlc2NyaXB0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dJbnRlcm5hbEF1dGhlbnRpY2F0aW9uRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eSBzZXZlcml0eSkgeworCisJCWlmIChzZXZlcml0eSA9PSBudWxsKSB7CisJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbEF1dGhlbnRpY2F0aW9uRXJyb3IsIGRlc2NyaXB0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKKwkJCWNhc2UgSU5GTzoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbEF1dGhlbnRpY2F0aW9uSW5mbywgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBXQVJOSU5HOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsQXV0aGVudGljYXRpb25XYXJuaW5nLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEVSUk9SOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsQXV0aGVudGljYXRpb25FcnJvciwgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBGQVRBTDoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbEF1dGhlbnRpY2F0aW9uRmF0YWwsIGRlc2NyaXB0aW9uKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIHZvaWQgbG9nSW50ZXJuYWxDb25uZWN0aW9uRXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eSBzZXZlcml0eSkgeworCisJCWlmIChzZXZlcml0eSA9PSBudWxsKSB7CisJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbENvbm5lY3Rpb25FcnJvciwgZGVzY3JpcHRpb24pOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChzZXZlcml0eSkgeworCQkJY2FzZSBJTkZPOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsQ29ubmVjdGlvbkluZm8sIGRlc2NyaXB0aW9uKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0FSTklORzoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbENvbm5lY3Rpb25XYXJuaW5nLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEVSUk9SOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsQ29ubmVjdGlvbkVycm9yLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEZBVEFMOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsQ29ubmVjdGlvbkZhdGFsLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0ludGVybmFsRGF0YUVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgZGVzY3JpcHRpb24sIEVycm9yU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKKworCQlpZiAoc2V2ZXJpdHkgPT0gbnVsbCkgeworCQkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uSW50ZXJuYWxEYXRhRXJyb3IsIGRlc2NyaXB0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKKwkJCWNhc2UgSU5GTzoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbERhdGFJbmZvLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFdBUk5JTkc6CisJCQkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uSW50ZXJuYWxEYXRhV2FybmluZywgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBFUlJPUjoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbERhdGFFcnJvciwgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBGQVRBTDoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbERhdGFGYXRhbCwgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkSW5wdXRFcnJvcihTdHJpbmcgY29udGV4dCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFcnJvclNldmVyaXR5IHNldmVyaXR5KSB7CisKKwkJaWYgKHNldmVyaXR5ID09IG51bGwpIHsKKwkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludmFsaWRJbnB1dEVycm9yLCBkZXNjcmlwdGlvbik7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHNldmVyaXR5KSB7CisJCQljYXNlIElORk86CisJCQkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uSW52YWxpZElucHV0V2FybmluZywgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBXQVJOSU5HOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludmFsaWRJbnB1dEluZm8sIGRlc2NyaXB0aW9uKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVJST1I6CisJCQkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uSW52YWxpZElucHV0RXJyb3IsIGRlc2NyaXB0aW9uKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkFUQUw6CisJCQkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uSW52YWxpZElucHV0RmF0YWwsIGRlc2NyaXB0aW9uKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIHZvaWQgbG9nSW50ZXJuYWxGbG93RXJyb3IoU3RyaW5nIGNvbnRleHQsIFN0cmluZyBkZXNjcmlwdGlvbiwgRXJyb3JTZXZlcml0eSBzZXZlcml0eSkgeworCisJCWlmIChzZXZlcml0eSA9PSBudWxsKSB7CisJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbEZsb3dFcnJvciwgZGVzY3JpcHRpb24pOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChzZXZlcml0eSkgeworCQkJY2FzZSBJTkZPOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsRmxvd0luZm8sIGRlc2NyaXB0aW9uKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0FSTklORzoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbEZsb3dXYXJuaW5nLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEVSUk9SOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsRmxvd0Vycm9yLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEZBVEFMOgorCQkJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkludGVybmFsRmxvd0ZhdGFsLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0ludGVybmFsVW5leHBlY3RlZEVycm9yKFN0cmluZyBjb250ZXh0LCBTdHJpbmcgZGVzY3JpcHRpb24sIEVycm9yU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKKworCQlpZiAoc2V2ZXJpdHkgPT0gbnVsbCkgeworCQkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uSW50ZXJuYWxVbmV4cGVjdGVkRXJyb3IsIGRlc2NyaXB0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKKwkJCWNhc2UgSU5GTzoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbFVuZXhwZWN0ZWRJbmZvLCBkZXNjcmlwdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIFdBUk5JTkc6CisJCQkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uSW50ZXJuYWxVbmV4cGVjdGVkV2FybmluZywgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBFUlJPUjoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbFVuZXhwZWN0ZWRFcnJvciwgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCQkJY2FzZSBGQVRBTDoKKwkJCQlwcm9jZXNzRWNvbXBFcnJvcihjb250ZXh0LCBFY29tcEVycm9yRW51bS5JbnRlcm5hbFVuZXhwZWN0ZWRGYXRhbCwgZGVzY3JpcHRpb24pOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL0NsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL0NsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDExMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvQ2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIENsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24geworCisJcHJpdmF0ZSBsb25nIGNsZWFuSW50ZXJ2YWxJbk1pbnV0ZXM7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29tcG9uZW50c1RvQ2xlYW47CisKKwlwdWJsaWMgbG9uZyBnZXRDbGVhbkludGVydmFsSW5NaW51dGVzKCkgeworCQlyZXR1cm4gY2xlYW5JbnRlcnZhbEluTWludXRlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDbGVhbkludGVydmFsSW5NaW51dGVzKGxvbmcgY2xlYW5JbnRlcnZhbEluTWludXRlcykgeworCQl0aGlzLmNsZWFuSW50ZXJ2YWxJbk1pbnV0ZXMgPSBjbGVhbkludGVydmFsSW5NaW51dGVzOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29tcG9uZW50c1RvQ2xlYW4oKSB7CisJCXJldHVybiBjb21wb25lbnRzVG9DbGVhbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRzVG9DbGVhbihMaXN0PFN0cmluZz4gY29tcG9uZW50c1RvQ2xlYW4pIHsKKwkJdGhpcy5jb21wb25lbnRzVG9DbGVhbiA9IGNvbXBvbmVudHNUb0NsZWFuOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvQ29uZmlndXJhdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTA1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbmZpZy9Db25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMjMzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5CYXNpY0NvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uIGV4dGVuZHMgQmFzaWNDb25maWd1cmF0aW9uIHsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGlkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOworCS8qKgorCSAqIFJlcXVlc3RzIGZyb20gdGhlc2UgVXJscyB3aWxsIG5vdCBiZSBsb2dnZWQgYnkKKwkgKiBvcmcub3BlbmVjb21wLnNkYy5iZS5maWx0ZXJzLkJlU2VydmxldEZpbHRlci48YnI+CisJICoqLworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHVuTG9nZ2VkVXJsczsKKworCS8qKgorCSAqIGJhY2tlbmQgaG9zdAorCSAqLworCXByaXZhdGUgU3RyaW5nIGJlRnFkbjsKKwkvKioKKwkgKiBiYWNrZW5kIGh0dHAgcG9ydAorCSAqLworCXByaXZhdGUgSW50ZWdlciBiZUh0dHBQb3J0OworCS8qKgorCSAqIGJhY2tlbmQgaHR0cCBzZWN1cmVkIHBvcnQKKwkgKi8KKwlwcml2YXRlIEludGVnZXIgYmVTc2xQb3J0OworCS8qKgorCSAqIGJlIGh0dHAgY29udGV4dAorCSAqLworCXByaXZhdGUgU3RyaW5nIGJlQ29udGV4dDsKKwkvKioKKwkgKiBiYWNrZW5kIHByb3RvY29sLiBodHRwIHwgaHR0cHMKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBiZVByb3RvY29sID0gImh0dHAiOworCisJcHJpdmF0ZSBEYXRlIHJlbGVhc2VkOworCXByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSAiMTExMSI7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHJvdG9jb2xzOworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiB1c2VyczsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gbmVvNGo7CisJcHJpdmF0ZSBFbGFzdGljU2VhcmNoQ29uZmlnIGVsYXN0aWNTZWFyY2g7CisJcHJpdmF0ZSBTdHJpbmcgdGl0YW5DZmdGaWxlOworCXByaXZhdGUgQm9vbGVhbiB0aXRhbkluTWVtb3J5R3JhcGg7CisJcHJpdmF0ZSBMb25nIHRpdGFuTG9ja1RpbWVvdXQ7CisJcHJpdmF0ZSBMb25nIHRpdGFuUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM7CisJcHJpdmF0ZSBMb25nIHRpdGFuSGVhbHRoQ2hlY2tSZWFkVGltZW91dDsKKwlwcml2YXRlIExvbmcgZXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczsKKwlwcml2YXRlIExvbmcgdWViSGVhbHRoQ2hlY2tSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczsKKwlwcml2YXRlIExvbmcgdWViSGVhbHRoQ2hlY2tSZWFkVGltZW91dDsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHJlc291cmNlVHlwZXM7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhjbHVkZVJlc291cmNlQ2F0ZWdvcnk7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0czsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZGVwbG95bWVudFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvc2NhQXJ0aWZhY3RzOworCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzOworCXByaXZhdGUgTWFwPFN0cmluZywgRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZz4gcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzOworCXByaXZhdGUgTWFwPFN0cmluZywgRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZz4gc2VydmljZURlcGxveW1lbnRBcnRpZmFjdHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiByZXNvdXJjZUluc3RhbmNlRGVwbG95bWVudEFydGlmYWN0czsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+IHJlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzOworCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBzZXJ2aWNlQXBpQXJ0aWZhY3RzOworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVTZXJ2aWNlQ2F0ZWdvcnk7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydDsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBjYXBhYmlsaXRpZXNUb0NvbnN1bWVCZWZvcmVDZXJ0OworCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXJ0aWZhY3RUeXBlczsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBsaWNlbnNlVHlwZXM7CisKKwlwcml2YXRlIEludGVnZXIgYWRkaXRpb25hbEluZm9ybWF0aW9uTWF4TnVtYmVyT2ZLZXlzOworCXByaXZhdGUgSW50ZWdlciBkZWZhdWx0SGVhdEFydGlmYWN0VGltZW91dE1pbnV0ZXM7CisKKwlwcml2YXRlIEJlTW9uaXRvcmluZ0NvbmZpZyBzeXN0ZW1Nb25pdG9yaW5nOworCXByaXZhdGUgQ2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbiBjbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uOworCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RzSW5kZXg7CisKKwlwcml2YXRlIFN0cmluZyBoZWF0RW52QXJ0aWZhY3RIZWFkZXI7CisJcHJpdmF0ZSBTdHJpbmcgaGVhdEVudkFydGlmYWN0Rm9vdGVyOworCisJcHJpdmF0ZSBTdHJpbmcgdG9zY2FGaWxlc0RpcjsKKwlwcml2YXRlIFN0cmluZyBoZWF0VHJhbnNsYXRvclBhdGg7CisKKwlwcml2YXRlIE9uYm9hcmRpbmdDb25maWcgb25ib2FyZGluZzsKKworCXByaXZhdGUgQ2Fzc2FuZHJDb25maWcgY2Fzc2FuZHJhQ29uZmlnOworCisJcHJpdmF0ZSBTd2l0Y2hvdmVyRGV0ZWN0b3JDb25maWcgc3dpdGNob3ZlckRldGVjdG9yOworCisJcHJpdmF0ZSBBcHBsaWNhdGlvbkwxQ2FjaGVDb25maWcgYXBwbGljYXRpb25MMUNhY2hlOworCisJcHJpdmF0ZSBBcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcgYXBwbGljYXRpb25MMkNhY2hlOworCisJcHJpdmF0ZSBUb3NjYVZhbGlkYXRvcnNDb25maWcgdG9zY2FWYWxpZGF0b3JzOworCisJcHJpdmF0ZSBib29sZWFuIGRpc2FibGVBdWRpdDsKKworCXB1YmxpYyBTd2l0Y2hvdmVyRGV0ZWN0b3JDb25maWcgZ2V0U3dpdGNob3ZlckRldGVjdG9yKCkgeworCQlyZXR1cm4gc3dpdGNob3ZlckRldGVjdG9yOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN3aXRjaG92ZXJEZXRlY3RvcihTd2l0Y2hvdmVyRGV0ZWN0b3JDb25maWcgc3dpdGNob3ZlckRldGVjdG9yKSB7CisJCXRoaXMuc3dpdGNob3ZlckRldGVjdG9yID0gc3dpdGNob3ZlckRldGVjdG9yOworCX0KKworCXB1YmxpYyBBcHBsaWNhdGlvbkwxQ2FjaGVDb25maWcgZ2V0QXBwbGljYXRpb25MMUNhY2hlKCkgeworCQlyZXR1cm4gYXBwbGljYXRpb25MMUNhY2hlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTDFDYWNoZShBcHBsaWNhdGlvbkwxQ2FjaGVDb25maWcgYXBwbGljYXRpb25MMUNhY2hlKSB7CisJCXRoaXMuYXBwbGljYXRpb25MMUNhY2hlID0gYXBwbGljYXRpb25MMUNhY2hlOworCX0KKworCXB1YmxpYyBBcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcgZ2V0QXBwbGljYXRpb25MMkNhY2hlKCkgeworCQlyZXR1cm4gYXBwbGljYXRpb25MMkNhY2hlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTDJDYWNoZShBcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcgYXBwbGljYXRpb25MMkNhY2hlKSB7CisJCXRoaXMuYXBwbGljYXRpb25MMkNhY2hlID0gYXBwbGljYXRpb25MMkNhY2hlOworCX0KKworCXByaXZhdGUgRWNvbXBQb3J0YWxDb25maWcgZWNvbXBQb3J0YWw7CisKKwlwdWJsaWMgQ2Fzc2FuZHJDb25maWcgZ2V0Q2Fzc2FuZHJhQ29uZmlnKCkgeworCQlyZXR1cm4gY2Fzc2FuZHJhQ29uZmlnOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc3NhbmRyYUNvbmZpZyhDYXNzYW5kckNvbmZpZyBjYXNzYW5kcmFLZXlTcGFjZSkgeworCQl0aGlzLmNhc3NhbmRyYUNvbmZpZyA9IGNhc3NhbmRyYUtleVNwYWNlOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMoKSB7CisJCXJldHVybiBpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcyhMaXN0PFN0cmluZz4gaWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMpIHsKKwkJdGhpcy5pZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcyA9IGlkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOworCX0KKworCXB1YmxpYyBEYXRlIGdldFJlbGVhc2VkKCkgeworCQlyZXR1cm4gcmVsZWFzZWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWxlYXNlZChEYXRlIHJlbGVhc2VkKSB7CisJCXRoaXMucmVsZWFzZWQgPSByZWxlYXNlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm90b2NvbHMoKSB7CisJCXJldHVybiBwcm90b2NvbHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvdG9jb2xzKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMpIHsKKwkJdGhpcy5wcm90b2NvbHMgPSBwcm90b2NvbHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0VXNlcnMoKSB7CisJCXJldHVybiB1c2VyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJzKSB7CisJCXRoaXMudXNlcnMgPSB1c2VyczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEJlRnFkbigpIHsKKwkJcmV0dXJuIGJlRnFkbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZUZxZG4oU3RyaW5nIGJlSG9zdCkgeworCQl0aGlzLmJlRnFkbiA9IGJlSG9zdDsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRCZUh0dHBQb3J0KCkgeworCQlyZXR1cm4gYmVIdHRwUG9ydDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZUh0dHBQb3J0KEludGVnZXIgYmVIdHRwUG9ydCkgeworCQl0aGlzLmJlSHR0cFBvcnQgPSBiZUh0dHBQb3J0OworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEJlU3NsUG9ydCgpIHsKKwkJcmV0dXJuIGJlU3NsUG9ydDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZVNzbFBvcnQoSW50ZWdlciBiZVNzbFBvcnQpIHsKKwkJdGhpcy5iZVNzbFBvcnQgPSBiZVNzbFBvcnQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRCZUNvbnRleHQoKSB7CisJCXJldHVybiBiZUNvbnRleHQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmVDb250ZXh0KFN0cmluZyBiZUNvbnRleHQpIHsKKwkJdGhpcy5iZUNvbnRleHQgPSBiZUNvbnRleHQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRCZVByb3RvY29sKCkgeworCQlyZXR1cm4gYmVQcm90b2NvbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZVByb3RvY29sKFN0cmluZyBiZVByb3RvY29sKSB7CisJCXRoaXMuYmVQcm90b2NvbCA9IGJlUHJvdG9jb2w7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0TmVvNGooKSB7CisJCXJldHVybiBuZW80ajsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROZW80aihNYXA8U3RyaW5nLCBPYmplY3Q+IG5lbzRqKSB7CisJCXRoaXMubmVvNGogPSBuZW80ajsKKwl9CisKKwlwdWJsaWMgRWxhc3RpY1NlYXJjaENvbmZpZyBnZXRFbGFzdGljU2VhcmNoKCkgeworCQlyZXR1cm4gZWxhc3RpY1NlYXJjaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbGFzdGljU2VhcmNoKEVsYXN0aWNTZWFyY2hDb25maWcgZWxhc3RpY1NlYXJjaCkgeworCQl0aGlzLmVsYXN0aWNTZWFyY2ggPSBlbGFzdGljU2VhcmNoOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGl0YW5DZmdGaWxlKCkgeworCQlyZXR1cm4gdGl0YW5DZmdGaWxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpdGFuQ2ZnRmlsZShTdHJpbmcgdGl0YW5DZmdGaWxlKSB7CisJCXRoaXMudGl0YW5DZmdGaWxlID0gdGl0YW5DZmdGaWxlOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldFRpdGFuSW5NZW1vcnlHcmFwaCgpIHsKKwkJcmV0dXJuIHRpdGFuSW5NZW1vcnlHcmFwaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaXRhbkluTWVtb3J5R3JhcGgoQm9vbGVhbiB0aXRhbkluTWVtb3J5R3JhcGgpIHsKKwkJdGhpcy50aXRhbkluTWVtb3J5R3JhcGggPSB0aXRhbkluTWVtb3J5R3JhcGg7CisJfQorCisJcHVibGljIExvbmcgZ2V0VGl0YW5Mb2NrVGltZW91dCgpIHsKKwkJcmV0dXJuIHRpdGFuTG9ja1RpbWVvdXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGl0YW5Mb2NrVGltZW91dChMb25nIHRpdGFuTG9ja1RpbWVvdXQpIHsKKwkJdGhpcy50aXRhbkxvY2tUaW1lb3V0ID0gdGl0YW5Mb2NrVGltZW91dDsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRUaXRhbkhlYWx0aENoZWNrUmVhZFRpbWVvdXQoKSB7CisJCXJldHVybiB0aXRhbkhlYWx0aENoZWNrUmVhZFRpbWVvdXQ7CisJfQorCisJcHVibGljIExvbmcgZ2V0VGl0YW5IZWFsdGhDaGVja1JlYWRUaW1lb3V0KGxvbmcgZGVmYXVsdFZhbCkgeworCQlyZXR1cm4gdGl0YW5IZWFsdGhDaGVja1JlYWRUaW1lb3V0ID09IG51bGwgPyBkZWZhdWx0VmFsIDogdGl0YW5IZWFsdGhDaGVja1JlYWRUaW1lb3V0OworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpdGFuSGVhbHRoQ2hlY2tSZWFkVGltZW91dChMb25nIHRpdGFuSGVhbHRoQ2hlY2tSZWFkVGltZW91dCkgeworCQl0aGlzLnRpdGFuSGVhbHRoQ2hlY2tSZWFkVGltZW91dCA9IHRpdGFuSGVhbHRoQ2hlY2tSZWFkVGltZW91dDsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRUaXRhblJlY29ubmVjdEludGVydmFsSW5TZWNvbmRzKCkgeworCQlyZXR1cm4gdGl0YW5SZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRUaXRhblJlY29ubmVjdEludGVydmFsSW5TZWNvbmRzKGxvbmcgZGVmYXVsdFZhbCkgeworCQlyZXR1cm4gdGl0YW5SZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kcyA9PSBudWxsID8gZGVmYXVsdFZhbCA6IHRpdGFuUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGl0YW5SZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kcyhMb25nIHRpdGFuUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHMpIHsKKwkJdGhpcy50aXRhblJlY29ubmVjdEludGVydmFsSW5TZWNvbmRzID0gdGl0YW5SZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRFc1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzKCkgeworCQlyZXR1cm4gZXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRFc1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzKGxvbmcgZGVmYXVsdFZhbCkgeworCQlyZXR1cm4gZXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kcyA9PSBudWxsID8gZGVmYXVsdFZhbCA6IGVzUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kcyhMb25nIGVzUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHMpIHsKKwkJdGhpcy5lc1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzID0gZXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFydGlmYWN0VHlwZXMoKSB7CisJCXJldHVybiBhcnRpZmFjdFR5cGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VHlwZXMoTGlzdDxTdHJpbmc+IGFydGlmYWN0VHlwZXMpIHsKKwkJdGhpcy5hcnRpZmFjdFR5cGVzID0gYXJ0aWZhY3RUeXBlczsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEV4Y2x1ZGVSZXNvdXJjZUNhdGVnb3J5KCkgeworCQlyZXR1cm4gZXhjbHVkZVJlc291cmNlQ2F0ZWdvcnk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RXhjbHVkZVJlc291cmNlQ2F0ZWdvcnkoTGlzdDxTdHJpbmc+IGV4Y2x1ZGVSZXNvdXJjZUNhdGVnb3J5KSB7CisJCXRoaXMuZXhjbHVkZVJlc291cmNlQ2F0ZWdvcnkgPSBleGNsdWRlUmVzb3VyY2VDYXRlZ29yeTsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUb3NjYUFydGlmYWN0cygpIHsKKwkJcmV0dXJuIHRvc2NhQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvc2NhQXJ0aWZhY3RzKE1hcDxTdHJpbmcsIE9iamVjdD4gdG9zY2FBcnRpZmFjdHMpIHsKKwkJdGhpcy50b3NjYUFydGlmYWN0cyA9IHRvc2NhQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEluZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGluZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHMoTWFwPFN0cmluZywgT2JqZWN0PiBpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHMpIHsKKwkJdGhpcy5pbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHMgPSBpbmZvcm1hdGlvbmFsUmVzb3VyY2VBcnRpZmFjdHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0SW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdHMoKSB7CisJCXJldHVybiBpbmZvcm1hdGlvbmFsU2VydmljZUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbmFsU2VydmljZUFydGlmYWN0cyhNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzKSB7CisJCXRoaXMuaW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdHMgPSBpbmZvcm1hdGlvbmFsU2VydmljZUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRTZXJ2aWNlQXBpQXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gc2VydmljZUFwaUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQXBpQXJ0aWZhY3RzKE1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmljZUFwaUFydGlmYWN0cykgeworCQl0aGlzLnNlcnZpY2VBcGlBcnRpZmFjdHMgPSBzZXJ2aWNlQXBpQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiBnZXRTZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIHNlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3RzKE1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+IHNlcnZpY2VEZXBsb3ltZW50QXJ0aWZhY3RzKSB7CisJCXRoaXMuc2VydmljZURlcGxveW1lbnRBcnRpZmFjdHMgPSBzZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZz4gZ2V0UmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cyhNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiByZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMpIHsKKwkJdGhpcy5yZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMgPSByZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdHMoCisJCQlNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiByZXNvdXJjZUluc3RhbmNlRGVwbG95bWVudEFydGlmYWN0cykgeworCQl0aGlzLnJlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzID0gcmVzb3VyY2VJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWc+IGdldFJlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gcmVzb3VyY2VJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdHM7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGNsdWRlU2VydmljZUNhdGVnb3J5KCkgeworCQlyZXR1cm4gZXhjbHVkZVNlcnZpY2VDYXRlZ29yeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlU2VydmljZUNhdGVnb3J5KExpc3Q8U3RyaW5nPiBleGNsdWRlU2VydmljZUNhdGVnb3J5KSB7CisJCXRoaXMuZXhjbHVkZVNlcnZpY2VDYXRlZ29yeSA9IGV4Y2x1ZGVTZXJ2aWNlQ2F0ZWdvcnk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRMaWNlbnNlVHlwZXMoKSB7CisJCXJldHVybiBsaWNlbnNlVHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGljZW5zZVR5cGVzKExpc3Q8U3RyaW5nPiBsaWNlbnNlVHlwZXMpIHsKKwkJdGhpcy5saWNlbnNlVHlwZXMgPSBsaWNlbnNlVHlwZXM7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0QWRkaXRpb25hbEluZm9ybWF0aW9uTWF4TnVtYmVyT2ZLZXlzKCkgeworCQlyZXR1cm4gYWRkaXRpb25hbEluZm9ybWF0aW9uTWF4TnVtYmVyT2ZLZXlzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5cyhJbnRlZ2VyIGFkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5cykgeworCQl0aGlzLmFkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5cyA9IGFkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5czsKKwl9CisKKwlwdWJsaWMgQmVNb25pdG9yaW5nQ29uZmlnIGdldFN5c3RlbU1vbml0b3JpbmcoKSB7CisJCXJldHVybiBzeXN0ZW1Nb25pdG9yaW5nOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN5c3RlbU1vbml0b3JpbmcoQmVNb25pdG9yaW5nQ29uZmlnIHN5c3RlbU1vbml0b3JpbmcpIHsKKwkJdGhpcy5zeXN0ZW1Nb25pdG9yaW5nID0gc3lzdGVtTW9uaXRvcmluZzsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0SGVhdEFydGlmYWN0VGltZW91dE1pbnV0ZXMoKSB7CisJCXJldHVybiBkZWZhdWx0SGVhdEFydGlmYWN0VGltZW91dE1pbnV0ZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdEhlYXRBcnRpZmFjdFRpbWVvdXRNaW51dGVzKEludGVnZXIgZGVmYXVsdEhlYXRBcnRpZmFjdFRpbWVvdXRNaW51dGVzKSB7CisJCXRoaXMuZGVmYXVsdEhlYXRBcnRpZmFjdFRpbWVvdXRNaW51dGVzID0gZGVmYXVsdEhlYXRBcnRpZmFjdFRpbWVvdXRNaW51dGVzOworCX0KKworCXB1YmxpYyBMb25nIGdldFVlYkhlYWx0aENoZWNrUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHMoKSB7CisJCXJldHVybiB1ZWJIZWFsdGhDaGVja1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVlYkhlYWx0aENoZWNrUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHMoTG9uZyB1ZWJIZWFsdGhDaGVja1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzKSB7CisJCXRoaXMudWViSGVhbHRoQ2hlY2tSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kcyA9IHVlYkhlYWx0aENoZWNrUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM7CisJfQorCisJcHVibGljIExvbmcgZ2V0VWViSGVhbHRoQ2hlY2tSZWFkVGltZW91dCgpIHsKKwkJcmV0dXJuIHVlYkhlYWx0aENoZWNrUmVhZFRpbWVvdXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VWViSGVhbHRoQ2hlY2tSZWFkVGltZW91dChMb25nIHVlYkhlYWx0aENoZWNrUmVhZFRpbWVvdXQpIHsKKwkJdGhpcy51ZWJIZWFsdGhDaGVja1JlYWRUaW1lb3V0ID0gdWViSGVhbHRoQ2hlY2tSZWFkVGltZW91dDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEVsYXN0aWNTZWFyY2hDb25maWcgeworCisJCUxpc3Q8SW5kaWNlc1RpbWVGcmVxdWVuY3lFbnRyeT4gaW5kaWNlc1RpbWVGcmVxdWVuY3k7CisKKwkJcHVibGljIExpc3Q8SW5kaWNlc1RpbWVGcmVxdWVuY3lFbnRyeT4gZ2V0SW5kaWNlc1RpbWVGcmVxdWVuY3koKSB7CisJCQlyZXR1cm4gaW5kaWNlc1RpbWVGcmVxdWVuY3k7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRJbmRpY2VzVGltZUZyZXF1ZW5jeShMaXN0PEluZGljZXNUaW1lRnJlcXVlbmN5RW50cnk+IGluZGljZXNUaW1lRnJlcXVlbmN5KSB7CisJCQl0aGlzLmluZGljZXNUaW1lRnJlcXVlbmN5ID0gaW5kaWNlc1RpbWVGcmVxdWVuY3k7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIGNsYXNzIEluZGljZXNUaW1lRnJlcXVlbmN5RW50cnkgeworCisJCQlTdHJpbmcgaW5kZXhQcmVmaXg7CisJCQlTdHJpbmcgY3JlYXRpb25QZXJpb2Q7CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhQcmVmaXgoKSB7CisJCQkJcmV0dXJuIGluZGV4UHJlZml4OworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBzZXRJbmRleFByZWZpeChTdHJpbmcgaW5kZXhQcmVmaXgpIHsKKwkJCQl0aGlzLmluZGV4UHJlZml4ID0gaW5kZXhQcmVmaXg7CisJCQl9CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRpb25QZXJpb2QoKSB7CisJCQkJcmV0dXJuIGNyZWF0aW9uUGVyaW9kOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblBlcmlvZChTdHJpbmcgY3JlYXRpb25QZXJpb2QpIHsKKwkJCQl0aGlzLmNyZWF0aW9uUGVyaW9kID0gY3JlYXRpb25QZXJpb2Q7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIENhc3NhbmRyQ29uZmlnIHsKKworCQlMaXN0PFN0cmluZz4gY2Fzc2FuZHJhSG9zdHM7CisJCVN0cmluZyBsb2NhbERhdGFDZW50ZXI7CisJCUxvbmcgcmVjb25uZWN0VGltZW91dDsKKwkJTGlzdDxLZXlzcGFjZUNvbmZpZz4ga2V5U3BhY2VzOworCQlib29sZWFuIGF1dGhlbnRpY2F0ZTsKKwkJU3RyaW5nIHVzZXJuYW1lOworCQlTdHJpbmcgcGFzc3dvcmQ7CisJCWJvb2xlYW4gc3NsOworCQlTdHJpbmcgdHJ1c3RzdG9yZVBhdGg7CisJCVN0cmluZyB0cnVzdHN0b3JlUGFzc3dvcmQ7CisKKwkJcHVibGljIFN0cmluZyBnZXRMb2NhbERhdGFDZW50ZXIoKSB7CisJCQlyZXR1cm4gbG9jYWxEYXRhQ2VudGVyOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0TG9jYWxEYXRhQ2VudGVyKFN0cmluZyBsb2NhbERhdGFDZW50ZXIpIHsKKwkJCXRoaXMubG9jYWxEYXRhQ2VudGVyID0gbG9jYWxEYXRhQ2VudGVyOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNBdXRoZW50aWNhdGUoKSB7CisJCQlyZXR1cm4gYXV0aGVudGljYXRlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0QXV0aGVudGljYXRlKGJvb2xlYW4gYXV0aGVudGljYXRlKSB7CisJCQl0aGlzLmF1dGhlbnRpY2F0ZSA9IGF1dGhlbnRpY2F0ZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisJCQlyZXR1cm4gdXNlcm5hbWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKwkJCXRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisJCQlyZXR1cm4gcGFzc3dvcmQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKwkJCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzU3NsKCkgeworCQkJcmV0dXJuIHNzbDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNzbChib29sZWFuIHNzbCkgeworCQkJdGhpcy5zc2wgPSBzc2w7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFRydXN0c3RvcmVQYXRoKCkgeworCQkJcmV0dXJuIHRydXN0c3RvcmVQYXRoOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0VHJ1c3RzdG9yZVBhdGgoU3RyaW5nIHRydXN0c3RvcmVQYXRoKSB7CisJCQl0aGlzLnRydXN0c3RvcmVQYXRoID0gdHJ1c3RzdG9yZVBhdGg7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFRydXN0c3RvcmVQYXNzd29yZCgpIHsKKwkJCXJldHVybiB0cnVzdHN0b3JlUGFzc3dvcmQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRUcnVzdHN0b3JlUGFzc3dvcmQoU3RyaW5nIHRydXN0c3RvcmVQYXNzd29yZCkgeworCQkJdGhpcy50cnVzdHN0b3JlUGFzc3dvcmQgPSB0cnVzdHN0b3JlUGFzc3dvcmQ7CisJCX0KKworCQlwdWJsaWMgTG9uZyBnZXRSZWNvbm5lY3RUaW1lb3V0KCkgeworCQkJcmV0dXJuIHJlY29ubmVjdFRpbWVvdXQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRSZWNvbm5lY3RUaW1lb3V0KExvbmcgcmVjb25uZWN0VGltZW91dCkgeworCQkJdGhpcy5yZWNvbm5lY3RUaW1lb3V0ID0gcmVjb25uZWN0VGltZW91dDsKKwkJfQorCisJCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q2Fzc2FuZHJhSG9zdHMoKSB7CisJCQlyZXR1cm4gY2Fzc2FuZHJhSG9zdHM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRDYXNzYW5kcmFIb3N0cyhMaXN0PFN0cmluZz4gY2Fzc2FuZHJhSG9zdHMpIHsKKwkJCXRoaXMuY2Fzc2FuZHJhSG9zdHMgPSBjYXNzYW5kcmFIb3N0czsKKwkJfQorCisJCXB1YmxpYyBMaXN0PEtleXNwYWNlQ29uZmlnPiBnZXRLZXlTcGFjZXMoKSB7CisJCQlyZXR1cm4ga2V5U3BhY2VzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0S2V5U3BhY2VzKExpc3Q8S2V5c3BhY2VDb25maWc+IGNhc3NhbmRyYUNvbmZpZykgeworCQkJdGhpcy5rZXlTcGFjZXMgPSBjYXNzYW5kcmFDb25maWc7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIGNsYXNzIEtleXNwYWNlQ29uZmlnIHsKKworCQkJU3RyaW5nIG5hbWU7CisJCQlTdHJpbmcgcmVwbGljYXRpb25TdHJhdGVneTsKKwkJCUxpc3Q8U3RyaW5nPiByZXBsaWNhdGlvbkluZm87CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQkJCXRoaXMubmFtZSA9IG5hbWU7CisJCQl9CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0UmVwbGljYXRpb25TdHJhdGVneSgpIHsKKwkJCQlyZXR1cm4gcmVwbGljYXRpb25TdHJhdGVneTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25TdHJhdGVneShTdHJpbmcgcmVwbGljYXRpb25TdHJhdGVneSkgeworCQkJCXRoaXMucmVwbGljYXRpb25TdHJhdGVneSA9IHJlcGxpY2F0aW9uU3RyYXRlZ3k7CisJCQl9CisKKwkJCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVwbGljYXRpb25JbmZvKCkgeworCQkJCXJldHVybiByZXBsaWNhdGlvbkluZm87CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uSW5mbyhMaXN0PFN0cmluZz4gcmVwbGljYXRpb25JbmZvKSB7CisJCQkJdGhpcy5yZXBsaWNhdGlvbkluZm8gPSByZXBsaWNhdGlvbkluZm87CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN3aXRjaG92ZXJEZXRlY3RvckNvbmZpZyB7CisKKwkJU3RyaW5nIGdCZUZxZG47CisJCVN0cmluZyBnRmVGcWRuOworCQlTdHJpbmcgYmVWaXA7CisJCVN0cmluZyBmZVZpcDsKKwkJaW50IGJlUmVzb2x2ZUF0dGVtcHRzOworCQlpbnQgZmVSZXNvbHZlQXR0ZW1wdHM7CisJCUJvb2xlYW4gZW5hYmxlZDsKKwkJbG9uZyBpbnRlcnZhbDsKKwkJU3RyaW5nIGNoYW5nZVByaW9yaXR5VXNlcjsKKwkJU3RyaW5nIGNoYW5nZVByaW9yaXR5UGFzc3dvcmQ7CisJCVN0cmluZyBwdWJsaXNoTmV0d29ya1VybDsKKwkJU3RyaW5nIHB1Ymxpc2hOZXR3b3JrQm9keTsKKwkJTWFwPFN0cmluZywgR3JvdXBJbmZvPiBncm91cHM7CisKKwkJcHVibGljIFN0cmluZyBnZXRnQmVGcWRuKCkgeworCQkJcmV0dXJuIGdCZUZxZG47CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRnQmVGcWRuKFN0cmluZyBnQmVGcWRuKSB7CisJCQl0aGlzLmdCZUZxZG4gPSBnQmVGcWRuOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRnRmVGcWRuKCkgeworCQkJcmV0dXJuIGdGZUZxZG47CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRnRmVGcWRuKFN0cmluZyBnRmVGcWRuKSB7CisJCQl0aGlzLmdGZUZxZG4gPSBnRmVGcWRuOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRCZVZpcCgpIHsKKwkJCXJldHVybiBiZVZpcDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEJlVmlwKFN0cmluZyBiZVZpcCkgeworCQkJdGhpcy5iZVZpcCA9IGJlVmlwOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRGZVZpcCgpIHsKKwkJCXJldHVybiBmZVZpcDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEZlVmlwKFN0cmluZyBmZVZpcCkgeworCQkJdGhpcy5mZVZpcCA9IGZlVmlwOworCQl9CisKKwkJcHVibGljIGludCBnZXRCZVJlc29sdmVBdHRlbXB0cygpIHsKKwkJCXJldHVybiBiZVJlc29sdmVBdHRlbXB0czsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEJlUmVzb2x2ZUF0dGVtcHRzKGludCBiZVJlc29sdmVBdHRlbXB0cykgeworCQkJdGhpcy5iZVJlc29sdmVBdHRlbXB0cyA9IGJlUmVzb2x2ZUF0dGVtcHRzOworCQl9CisKKwkJcHVibGljIGludCBnZXRGZVJlc29sdmVBdHRlbXB0cygpIHsKKwkJCXJldHVybiBmZVJlc29sdmVBdHRlbXB0czsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEZlUmVzb2x2ZUF0dGVtcHRzKGludCBmZVJlc29sdmVBdHRlbXB0cykgeworCQkJdGhpcy5mZVJlc29sdmVBdHRlbXB0cyA9IGZlUmVzb2x2ZUF0dGVtcHRzOworCQl9CisKKwkJcHVibGljIEJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKKwkJCXJldHVybiBlbmFibGVkOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChCb29sZWFuIGVuYWJsZWQpIHsKKwkJCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisJCX0KKworCQlwdWJsaWMgbG9uZyBnZXRJbnRlcnZhbCgpIHsKKwkJCXJldHVybiBpbnRlcnZhbDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEludGVydmFsKGxvbmcgaW50ZXJ2YWwpIHsKKwkJCXRoaXMuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlUHJpb3JpdHlVc2VyKCkgeworCQkJcmV0dXJuIGNoYW5nZVByaW9yaXR5VXNlcjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldENoYW5nZVByaW9yaXR5VXNlcihTdHJpbmcgY2hhbmdlUHJpb3JpdHlVc2VyKSB7CisJCQl0aGlzLmNoYW5nZVByaW9yaXR5VXNlciA9IGNoYW5nZVByaW9yaXR5VXNlcjsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlUHJpb3JpdHlQYXNzd29yZCgpIHsKKwkJCXJldHVybiBjaGFuZ2VQcmlvcml0eVBhc3N3b3JkOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0Q2hhbmdlUHJpb3JpdHlQYXNzd29yZChTdHJpbmcgY2hhbmdlUHJpb3JpdHlQYXNzd29yZCkgeworCQkJdGhpcy5jaGFuZ2VQcmlvcml0eVBhc3N3b3JkID0gY2hhbmdlUHJpb3JpdHlQYXNzd29yZDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaE5ldHdvcmtVcmwoKSB7CisJCQlyZXR1cm4gcHVibGlzaE5ldHdvcmtVcmw7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoTmV0d29ya1VybChTdHJpbmcgcHVibGlzaE5ldHdvcmtVcmwpIHsKKwkJCXRoaXMucHVibGlzaE5ldHdvcmtVcmwgPSBwdWJsaXNoTmV0d29ya1VybDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaE5ldHdvcmtCb2R5KCkgeworCQkJcmV0dXJuIHB1Ymxpc2hOZXR3b3JrQm9keTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hOZXR3b3JrQm9keShTdHJpbmcgcHVibGlzaE5ldHdvcmtCb2R5KSB7CisJCQl0aGlzLnB1Ymxpc2hOZXR3b3JrQm9keSA9IHB1Ymxpc2hOZXR3b3JrQm9keTsKKwkJfQorCisJCXB1YmxpYyBNYXA8U3RyaW5nLCBHcm91cEluZm8+IGdldEdyb3VwcygpIHsKKwkJCXJldHVybiBncm91cHM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRHcm91cHMoTWFwPFN0cmluZywgR3JvdXBJbmZvPiBncm91cHMpIHsKKwkJCXRoaXMuZ3JvdXBzID0gZ3JvdXBzOworCQl9CisKKwkJcHVibGljIHN0YXRpYyBjbGFzcyBHcm91cEluZm8geworCisJCQlTdHJpbmcgY2hhbmdlUHJpb3JpdHlVcmw7CisJCQlTdHJpbmcgY2hhbmdlUHJpb3JpdHlCb2R5OworCisJCQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZVByaW9yaXR5VXJsKCkgeworCQkJCXJldHVybiBjaGFuZ2VQcmlvcml0eVVybDsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgc2V0Q2hhbmdlUHJpb3JpdHlVcmwoU3RyaW5nIGNoYW5nZVByaW9yaXR5VXJsKSB7CisJCQkJdGhpcy5jaGFuZ2VQcmlvcml0eVVybCA9IGNoYW5nZVByaW9yaXR5VXJsOworCQkJfQorCisJCQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZVByaW9yaXR5Qm9keSgpIHsKKwkJCQlyZXR1cm4gY2hhbmdlUHJpb3JpdHlCb2R5OworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VQcmlvcml0eUJvZHkoU3RyaW5nIGNoYW5nZVByaW9yaXR5Qm9keSkgeworCQkJCXRoaXMuY2hhbmdlUHJpb3JpdHlCb2R5ID0gY2hhbmdlUHJpb3JpdHlCb2R5OworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEJlTW9uaXRvcmluZ0NvbmZpZyB7CisKKwkJQm9vbGVhbiBlbmFibGVkOworCQlCb29sZWFuIGlzUHJveHk7CisJCUludGVnZXIgcHJvYmVJbnRlcnZhbEluU2Vjb25kczsKKworCQlwdWJsaWMgQm9vbGVhbiBnZXRFbmFibGVkKCkgeworCQkJcmV0dXJuIGVuYWJsZWQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKEJvb2xlYW4gZW5hYmxlZCkgeworCQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKwkJfQorCisJCXB1YmxpYyBCb29sZWFuIGdldElzUHJveHkoKSB7CisJCQlyZXR1cm4gaXNQcm94eTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldElzUHJveHkoQm9vbGVhbiBpc1Byb3h5KSB7CisJCQl0aGlzLmlzUHJveHkgPSBpc1Byb3h5OworCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0UHJvYmVJbnRlcnZhbEluU2Vjb25kcygpIHsKKwkJCXJldHVybiBwcm9iZUludGVydmFsSW5TZWNvbmRzOworCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0UHJvYmVJbnRlcnZhbEluU2Vjb25kcyhpbnQgZGVmYXVsdFZhbCkgeworCQkJcmV0dXJuIHByb2JlSW50ZXJ2YWxJblNlY29uZHMgPT0gbnVsbCA/IGRlZmF1bHRWYWwgOiBwcm9iZUludGVydmFsSW5TZWNvbmRzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UHJvYmVJbnRlcnZhbEluU2Vjb25kcyhJbnRlZ2VyIHByb2JlSW50ZXJ2YWxJblNlY29uZHMpIHsKKwkJCXRoaXMucHJvYmVJbnRlcnZhbEluU2Vjb25kcyA9IHByb2JlSW50ZXJ2YWxJblNlY29uZHM7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIERlcGxveW1lbnRBcnRpZmFjdFR5cGVDb25maWcgeworCisJCUxpc3Q8U3RyaW5nPiBhY2NlcHRlZFR5cGVzOworCQlMaXN0PFN0cmluZz4gdmFsaWRGb3JSZXNvdXJjZVR5cGVzOworCisJCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VmFsaWRGb3JSZXNvdXJjZVR5cGVzKCkgeworCQkJcmV0dXJuIHZhbGlkRm9yUmVzb3VyY2VUeXBlczsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFZhbGlkRm9yUmVzb3VyY2VUeXBlcyhMaXN0PFN0cmluZz4gdmFsaWRGb3JSZXNvdXJjZVR5cGVzKSB7CisJCQl0aGlzLnZhbGlkRm9yUmVzb3VyY2VUeXBlcyA9IHZhbGlkRm9yUmVzb3VyY2VUeXBlczsKKwkJfQorCisJCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWNjZXB0ZWRUeXBlcygpIHsKKwkJCXJldHVybiBhY2NlcHRlZFR5cGVzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0QWNjZXB0ZWRUeXBlcyhMaXN0PFN0cmluZz4gYWNjZXB0ZWRUeXBlcykgeworCQkJdGhpcy5hY2NlcHRlZFR5cGVzID0gYWNjZXB0ZWRUeXBlczsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgT25ib2FyZGluZ0NvbmZpZyB7CisKKwkJU3RyaW5nIHByb3RvY29sID0gImh0dHAiOworCQlTdHJpbmcgaG9zdDsKKwkJSW50ZWdlciBwb3J0OworCQlTdHJpbmcgZG93bmxvYWRDc2FyVXJpOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisJCQlyZXR1cm4gcHJvdG9jb2w7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKKwkJCXRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKwkJCXJldHVybiBob3N0OworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworCQkJdGhpcy5ob3N0ID0gaG9zdDsKKwkJfQorCisJCXB1YmxpYyBJbnRlZ2VyIGdldFBvcnQoKSB7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFBvcnQoSW50ZWdlciBwb3J0KSB7CisJCQl0aGlzLnBvcnQgPSBwb3J0OworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXREb3dubG9hZENzYXJVcmkoKSB7CisJCQlyZXR1cm4gZG93bmxvYWRDc2FyVXJpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RG93bmxvYWRDc2FyVXJpKFN0cmluZyBkb3dubG9hZENzYXJVcmkpIHsKKwkJCXRoaXMuZG93bmxvYWRDc2FyVXJpID0gZG93bmxvYWRDc2FyVXJpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIk9uYm9hcmRpbmdDb25maWcgW3Byb3RvY29sPSIgKyBwcm90b2NvbCArICIsIGhvc3Q9IiArIGhvc3QgKyAiLCBwb3J0PSIgKyBwb3J0ICsgIiwgZG93bmxvYWRDc2FyVXJpPSIKKwkJCQkJKyBkb3dubG9hZENzYXJVcmkgKyAiXSI7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWNvbXBQb3J0YWxDb25maWcgeworCisJCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRGdW5jdGlvbmFsTWVudTsKKworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRGdW5jdGlvbmFsTWVudSgpIHsKKwkJCXJldHVybiBkZWZhdWx0RnVuY3Rpb25hbE1lbnU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RnVuY3Rpb25hbE1lbnUoU3RyaW5nIGRlZmF1bHRGdW5jdGlvbmFsTWVudSkgeworCQkJdGhpcy5kZWZhdWx0RnVuY3Rpb25hbE1lbnUgPSBkZWZhdWx0RnVuY3Rpb25hbE1lbnU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiRWNvbXBQb3J0YWxDb25maWcgW2RlZmF1bHRGdW5jdGlvbmFsTWVudT0iICsgZGVmYXVsdEZ1bmN0aW9uYWxNZW51ICsgIl0iOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uTDFDYWNoZUNvbmZpZyB7CisKKwkJQXBwbGljYXRpb25MMUNhY2hlSW5mbyBkYXRhdHlwZXM7CisKKwkJcHVibGljIEFwcGxpY2F0aW9uTDFDYWNoZUluZm8gZ2V0RGF0YXR5cGVzKCkgeworCQkJcmV0dXJuIGRhdGF0eXBlczsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldERhdGF0eXBlcyhBcHBsaWNhdGlvbkwxQ2FjaGVJbmZvIGRhdGF0eXBlcykgeworCQkJdGhpcy5kYXRhdHlwZXMgPSBkYXRhdHlwZXM7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiQXBwbGljYXRpb25MMUNhY2hlQ29uZmlnIFtkYXRhdHlwZXM9IiArIGRhdGF0eXBlcyArICJdIjsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBBcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcgeworCisJCWJvb2xlYW4gZW5hYmxlZDsKKwkJQXBwbGljYXRpb25MMUNhY2hlQ2F0YWxvZ0luZm8gY2F0YWxvZ0wxQ2FjaGU7CisKKwkJUXVldWVJbmZvIHF1ZXVlOworCisJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJCXJldHVybiBlbmFibGVkOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKwkJCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CisJCX0KKworCQlwdWJsaWMgQXBwbGljYXRpb25MMUNhY2hlQ2F0YWxvZ0luZm8gZ2V0Q2F0YWxvZ0wxQ2FjaGUoKSB7CisJCQlyZXR1cm4gY2F0YWxvZ0wxQ2FjaGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nTDFDYWNoZShBcHBsaWNhdGlvbkwxQ2FjaGVDYXRhbG9nSW5mbyBjYXRhbG9nTDFDYWNoZSkgeworCQkJdGhpcy5jYXRhbG9nTDFDYWNoZSA9IGNhdGFsb2dMMUNhY2hlOworCQl9CisKKwkJcHVibGljIFF1ZXVlSW5mbyBnZXRRdWV1ZSgpIHsKKwkJCXJldHVybiBxdWV1ZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFF1ZXVlKFF1ZXVlSW5mbyBxdWV1ZSkgeworCQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIkFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZyBbZW5hYmxlZD0iICsgZW5hYmxlZCArICIsIGNhdGFsb2dMMUNhY2hlPSIgKyBjYXRhbG9nTDFDYWNoZSArICJdIjsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBUb3NjYVZhbGlkYXRvcnNDb25maWcgeworCisJCXByaXZhdGUgSW50ZWdlciBzdHJpbmdNYXhMZW5ndGg7CisKKwkJcHVibGljIEludGVnZXIgZ2V0U3RyaW5nTWF4TGVuZ3RoKCkgeworCQkJcmV0dXJuIHN0cmluZ01heExlbmd0aDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFN0cmluZ01heExlbmd0aChJbnRlZ2VyIHN0cmluZ01heExlbmd0aCkgeworCQkJdGhpcy5zdHJpbmdNYXhMZW5ndGggPSBzdHJpbmdNYXhMZW5ndGg7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiVG9zY2FWYWxpZGF0b3JzQ29uZmlnIFtzdHJpbmdNYXhMZW5ndGg9IiArIHN0cmluZ01heExlbmd0aCArICJdIjsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBBcHBsaWNhdGlvbkwxQ2FjaGVJbmZvIHsKKworCQlCb29sZWFuIGVuYWJsZWQ7CisJCUludGVnZXIgZmlyc3RSdW5EZWxheTsKKwkJSW50ZWdlciBwb2xsSW50ZXJ2YWxJblNlYzsKKworCQlwdWJsaWMgQm9vbGVhbiBnZXRFbmFibGVkKCkgeworCQkJcmV0dXJuIGVuYWJsZWQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKEJvb2xlYW4gZW5hYmxlZCkgeworCQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKwkJfQorCisJCXB1YmxpYyBJbnRlZ2VyIGdldEZpcnN0UnVuRGVsYXkoKSB7CisJCQlyZXR1cm4gZmlyc3RSdW5EZWxheTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEZpcnN0UnVuRGVsYXkoSW50ZWdlciBmaXJzdFJ1bkRlbGF5KSB7CisJCQl0aGlzLmZpcnN0UnVuRGVsYXkgPSBmaXJzdFJ1bkRlbGF5OworCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0UG9sbEludGVydmFsSW5TZWMoKSB7CisJCQlyZXR1cm4gcG9sbEludGVydmFsSW5TZWM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQb2xsSW50ZXJ2YWxJblNlYyhJbnRlZ2VyIHBvbGxJbnRlcnZhbEluU2VjKSB7CisJCQl0aGlzLnBvbGxJbnRlcnZhbEluU2VjID0gcG9sbEludGVydmFsSW5TZWM7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiQXBwbGljYXRpb25MMUNhY2hlSW5mbyBbZW5hYmxlZD0iICsgZW5hYmxlZCArICIsIGZpcnN0UnVuRGVsYXk9IiArIGZpcnN0UnVuRGVsYXkKKwkJCQkJKyAiLCBwb2xsSW50ZXJ2YWxJblNlYz0iICsgcG9sbEludGVydmFsSW5TZWMgKyAiXSI7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uTDFDYWNoZUNhdGFsb2dJbmZvIHsKKworCQlCb29sZWFuIGVuYWJsZWQ7CisJCUludGVnZXIgcmVzb3VyY2VzU2l6ZUluQ2FjaGU7CisJCUludGVnZXIgc2VydmljZXNTaXplSW5DYWNoZTsKKwkJSW50ZWdlciBwcm9kdWN0c1NpemVJbkNhY2hlOworCisJCXB1YmxpYyBCb29sZWFuIGdldEVuYWJsZWQoKSB7CisJCQlyZXR1cm4gZW5hYmxlZDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoQm9vbGVhbiBlbmFibGVkKSB7CisJCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0UmVzb3VyY2VzU2l6ZUluQ2FjaGUoKSB7CisJCQlyZXR1cm4gcmVzb3VyY2VzU2l6ZUluQ2FjaGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXNTaXplSW5DYWNoZShJbnRlZ2VyIHJlc291cmNlc1NpemVJbkNhY2hlKSB7CisJCQl0aGlzLnJlc291cmNlc1NpemVJbkNhY2hlID0gcmVzb3VyY2VzU2l6ZUluQ2FjaGU7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRTZXJ2aWNlc1NpemVJbkNhY2hlKCkgeworCQkJcmV0dXJuIHNlcnZpY2VzU2l6ZUluQ2FjaGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlc1NpemVJbkNhY2hlKEludGVnZXIgc2VydmljZXNTaXplSW5DYWNoZSkgeworCQkJdGhpcy5zZXJ2aWNlc1NpemVJbkNhY2hlID0gc2VydmljZXNTaXplSW5DYWNoZTsKKwkJfQorCisJCXB1YmxpYyBJbnRlZ2VyIGdldFByb2R1Y3RzU2l6ZUluQ2FjaGUoKSB7CisJCQlyZXR1cm4gcHJvZHVjdHNTaXplSW5DYWNoZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFByb2R1Y3RzU2l6ZUluQ2FjaGUoSW50ZWdlciBwcm9kdWN0c1NpemVJbkNhY2hlKSB7CisJCQl0aGlzLnByb2R1Y3RzU2l6ZUluQ2FjaGUgPSBwcm9kdWN0c1NpemVJbkNhY2hlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIkFwcGxpY2F0aW9uTDFDYWNoZUNhdGFsb2dJbmZvIFtlbmFibGVkPSIgKyBlbmFibGVkICsgIiwgcmVzb3VyY2VzU2l6ZUluQ2FjaGU9IgorCQkJCQkrIHJlc291cmNlc1NpemVJbkNhY2hlICsgIiwgc2VydmljZXNTaXplSW5DYWNoZT0iICsgc2VydmljZXNTaXplSW5DYWNoZSArICIsIHByb2R1Y3RzU2l6ZUluQ2FjaGU9IgorCQkJCQkrIHByb2R1Y3RzU2l6ZUluQ2FjaGUgKyAiXSI7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUXVldWVJbmZvIHsKKwkJSW50ZWdlciBudW1iZXJPZkNhY2hlV29ya2VyczsKKwkJSW50ZWdlciB3YWl0T25TaHV0RG93bkluTWludXRlczsKKwkJSW50ZWdlciBzeW5jSW50ZXJ2YWxJblNlY29uZGVzOworCisJCXB1YmxpYyBJbnRlZ2VyIGdldFdhaXRPblNodXREb3duSW5NaW51dGVzKCkgeworCQkJcmV0dXJuIHdhaXRPblNodXREb3duSW5NaW51dGVzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0V2FpdE9uU2h1dERvd25Jbk1pbnV0ZXMoSW50ZWdlciB3YWl0T25TaHV0RG93bkluTWludXRlcykgeworCQkJdGhpcy53YWl0T25TaHV0RG93bkluTWludXRlcyA9IHdhaXRPblNodXREb3duSW5NaW51dGVzOworCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0U3luY0ludGVydmFsSW5TZWNvbmRlcygpIHsKKwkJCXJldHVybiBzeW5jSW50ZXJ2YWxJblNlY29uZGVzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U3luY0ludGVydmFsSW5TZWNvbmRlcyhJbnRlZ2VyIHN5bmNJbnRlcnZhbEluU2Vjb25kZXMpIHsKKwkJCXRoaXMuc3luY0ludGVydmFsSW5TZWNvbmRlcyA9IHN5bmNJbnRlcnZhbEluU2Vjb25kZXM7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXROdW1iZXJPZkNhY2hlV29ya2VycygpIHsKKwkJCXJldHVybiBudW1iZXJPZkNhY2hlV29ya2VyczsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldE51bWJlck9mQ2FjaGVXb3JrZXJzKEludGVnZXIgbnVtYmVyT2ZDYWNoZVdvcmtlcnMpIHsKKwkJCXRoaXMubnVtYmVyT2ZDYWNoZVdvcmtlcnMgPSBudW1iZXJPZkNhY2hlV29ya2VyczsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJRdWV1ZUluZm9bIiArICJ3YWl0T25TaHV0RG93bkluTWludXRlcz0iICsgd2FpdE9uU2h1dERvd25Jbk1pbnV0ZXMgKyAiLCBzeW5jSW50ZXJ2YWxJblNlY29uZGVzPSIKKwkJCQkJKyBzeW5jSW50ZXJ2YWxJblNlY29uZGVzICsgIiwgbnVtYmVyT2ZDYWNoZVdvcmtlcnM9IiArIHRoaXMubnVtYmVyT2ZDYWNoZVdvcmtlcnMgKyAnXSc7CisJCX0KKwl9CisKKwlwdWJsaWMgQ2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbiBnZXRDbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uKCkgeworCQlyZXR1cm4gY2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uKENsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24gY2xlYW5Db21wb25lbnRzQ29uZmlndXJhdGlvbikgeworCQl0aGlzLmNsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24gPSBjbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgaG9zdDogJXNcbiIsIGJlRnFkbikpCisJCQkJLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgaHR0cCBwb3J0OiAlc1xuIiwgYmVIdHRwUG9ydCkpCisJCQkJLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgc3NsIHBvcnQ6ICVzXG4iLCBiZVNzbFBvcnQpKS5hcHBlbmQoZm9ybWF0KCJiYWNrZW5kIGNvbnRleHQ6ICVzXG4iLCBiZUNvbnRleHQpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJiYWNrZW5kIHByb3RvY29sOiAlc1xuIiwgYmVQcm90b2NvbCkpLmFwcGVuZChmb3JtYXQoIlZlcnNpb246ICVzXG4iLCB2ZXJzaW9uKSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiUmVsZWFzZWQ6ICVzXG4iLCByZWxlYXNlZCkpLmFwcGVuZChmb3JtYXQoIlN1cHBvcnRlZCBwcm90b2NvbHM6ICVzXG4iLCBwcm90b2NvbHMpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJVc2VyczogJXNcbiIsIHVzZXJzKSkuYXBwZW5kKGZvcm1hdCgiTmVvNGo6ICVzXG4iLCBuZW80aikpCisJCQkJLmFwcGVuZChmb3JtYXQoIkVsYXN0aWNTZWFyY2g6ICVzXG4iLCBlbGFzdGljU2VhcmNoKSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiVGl0YW4gQ2ZnIEZpbGU6ICVzXG4iLCB0aXRhbkNmZ0ZpbGUpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJUaXRhbiBJbiBtZW1vcnk6ICVzXG4iLCB0aXRhbkluTWVtb3J5R3JhcGgpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJUaXRhbiBsb2NrIHRpbWVvdXQ6ICVzXG4iLCB0aXRhbkxvY2tUaW1lb3V0KSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiVGl0YW4gcmVjb25uZWN0IGludGVydmFsIHNlY29uZHM6ICVzXG4iLCB0aXRhblJlY29ubmVjdEludGVydmFsSW5TZWNvbmRzKSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiZXhjbHVkZVJlc291cmNlQ2F0ZWdvcnk6ICVzXG4iLCBleGNsdWRlUmVzb3VyY2VDYXRlZ29yeSkpCisJCQkJLmFwcGVuZChmb3JtYXQoImluZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0czogJXNcbiIsIGluZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0cykpCisJCQkJLmFwcGVuZChmb3JtYXQoImRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0czogJXNcbiIsIGRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cykpCisJCQkJLmFwcGVuZChmb3JtYXQoImluZm9ybWF0aW9uYWxTZXJ2aWNlQXJ0aWZhY3RzOiAlc1xuIiwgaW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdHMpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJTdXBwb3J0ZWQgYXJ0aWZhY3RzIHR5cGVzOiAlc1xuIiwgYXJ0aWZhY3RUeXBlcykpCisJCQkJLmFwcGVuZChmb3JtYXQoIlN1cHBvcnRlZCBsaWNlbnNlIHR5cGVzOiAlc1xuIiwgbGljZW5zZVR5cGVzKSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBNYXhpbXVtIG51bWJlciBvZiBwcmVvcGVydGllczogJXNcbiIsCisJCQkJCQlhZGRpdGlvbmFsSW5mb3JtYXRpb25NYXhOdW1iZXJPZktleXMpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJEZWZhdWx0IEhlYXQgQXJ0aWZhY3QgVGltZW91dCBpbiBNaW51dGVzOiAlc1xuIiwgZGVmYXVsdEhlYXRBcnRpZmFjdFRpbWVvdXRNaW51dGVzKSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiVVJMcyBGb3IgSFRUUCBSZXF1ZXN0cyB0aGF0IHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgbG9nZ2VkIDogJXNcbiIsIHVuTG9nZ2VkVXJscykpCisJCQkJLmFwcGVuZChmb3JtYXQoIlNlcnZpY2UgQXBpIEFydGlmYWN0czogJXNcbiIsIHNlcnZpY2VBcGlBcnRpZmFjdHMpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJoZWF0IGVudiBhcnRpZmFjdCBoZWFkZXI6ICVzXG4iLCBoZWF0RW52QXJ0aWZhY3RIZWFkZXIpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJoZWF0IGVudiBhcnRpZmFjdCBmb290ZXI6ICVzXG4iLCBoZWF0RW52QXJ0aWZhY3RGb290ZXIpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJvbmJvYXJkaW5nOiAlc1xuIiwgb25ib2FyZGluZykpLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRVbkxvZ2dlZFVybHMoKSB7CisJCXJldHVybiB1bkxvZ2dlZFVybHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5Mb2dnZWRVcmxzKExpc3Q8U3RyaW5nPiB1bkxvZ2dlZFVybHMpIHsKKwkJdGhpcy51bkxvZ2dlZFVybHMgPSB1bkxvZ2dlZFVybHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0RGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzKCkgeworCQlyZXR1cm4gZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cyhNYXA8U3RyaW5nLCBPYmplY3Q+IGRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cykgeworCQl0aGlzLmRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0cyA9IGRlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEhlYXRFbnZBcnRpZmFjdEhlYWRlcigpIHsKKwkJcmV0dXJuIGhlYXRFbnZBcnRpZmFjdEhlYWRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIZWF0RW52QXJ0aWZhY3RIZWFkZXIoU3RyaW5nIGhlYXRFbnZBcnRpZmFjdEhlYWRlcikgeworCQl0aGlzLmhlYXRFbnZBcnRpZmFjdEhlYWRlciA9IGhlYXRFbnZBcnRpZmFjdEhlYWRlcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEhlYXRFbnZBcnRpZmFjdEZvb3RlcigpIHsKKwkJcmV0dXJuIGhlYXRFbnZBcnRpZmFjdEZvb3RlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIZWF0RW52QXJ0aWZhY3RGb290ZXIoU3RyaW5nIGhlYXRFbnZBcnRpZmFjdEZvb3RlcikgeworCQl0aGlzLmhlYXRFbnZBcnRpZmFjdEZvb3RlciA9IGhlYXRFbnZBcnRpZmFjdEZvb3RlcjsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXREZXBsb3ltZW50UmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cygpIHsKKwkJcmV0dXJuIGRlcGxveW1lbnRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzKE1hcDxTdHJpbmcsIE9iamVjdD4gZGVwbG95bWVudFJlc291cmNlSW5zdGFuY2VBcnRpZmFjdHMpIHsKKwkJdGhpcy5kZXBsb3ltZW50UmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0cyA9IGRlcGxveW1lbnRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RzSW5kZXgoKSB7CisJCXJldHVybiBhcnRpZmFjdHNJbmRleDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHNJbmRleChTdHJpbmcgYXJ0aWZhY3RzSW5kZXgpIHsKKwkJdGhpcy5hcnRpZmFjdHNJbmRleCA9IGFydGlmYWN0c0luZGV4OworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBEZXBsb3ltZW50QXJ0aWZhY3RUeXBlQ29uZmlnPiBnZXRSZXNvdXJjZUluZm9ybWF0aW9uYWxEZXBsb3llZEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIHJlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzKAorCQkJTWFwPFN0cmluZywgRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZz4gcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHMpIHsKKwkJdGhpcy5yZXNvdXJjZUluZm9ybWF0aW9uYWxEZXBsb3llZEFydGlmYWN0cyA9IHJlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVzb3VyY2VUeXBlcygpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlcyhMaXN0PFN0cmluZz4gcmVzb3VyY2VUeXBlcykgeworCQl0aGlzLnJlc291cmNlVHlwZXMgPSByZXNvdXJjZVR5cGVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VG9zY2FGaWxlc0RpcigpIHsKKwkJcmV0dXJuIHRvc2NhRmlsZXNEaXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FGaWxlc0RpcihTdHJpbmcgdG9zY2FGaWxlc0RpcikgeworCQl0aGlzLnRvc2NhRmlsZXNEaXIgPSB0b3NjYUZpbGVzRGlyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SGVhdFRyYW5zbGF0b3JQYXRoKCkgeworCQlyZXR1cm4gaGVhdFRyYW5zbGF0b3JQYXRoOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhlYXRUcmFuc2xhdG9yUGF0aChTdHJpbmcgaGVhdFRyYW5zbGF0b3JQYXRoKSB7CisJCXRoaXMuaGVhdFRyYW5zbGF0b3JQYXRoID0gaGVhdFRyYW5zbGF0b3JQYXRoOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gZ2V0UmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydCgpIHsKKwkJcmV0dXJuIHJlcXVpcmVtZW50c1RvRnVsZmlsbEJlZm9yZUNlcnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydChNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydCkgeworCQl0aGlzLnJlcXVpcmVtZW50c1RvRnVsZmlsbEJlZm9yZUNlcnQgPSByZXF1aXJlbWVudHNUb0Z1bGZpbGxCZWZvcmVDZXJ0OworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gZ2V0Q2FwYWJpbGl0aWVzVG9Db25zdW1lQmVmb3JlQ2VydCgpIHsKKwkJcmV0dXJuIGNhcGFiaWxpdGllc1RvQ29uc3VtZUJlZm9yZUNlcnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0aWVzVG9Db25zdW1lQmVmb3JlQ2VydChNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gY2FwYWJpbGl0aWVzVG9Db25zdW1lQmVmb3JlQ2VydCkgeworCQl0aGlzLmNhcGFiaWxpdGllc1RvQ29uc3VtZUJlZm9yZUNlcnQgPSBjYXBhYmlsaXRpZXNUb0NvbnN1bWVCZWZvcmVDZXJ0OworCX0KKworCXB1YmxpYyBPbmJvYXJkaW5nQ29uZmlnIGdldE9uYm9hcmRpbmcoKSB7CisJCXJldHVybiBvbmJvYXJkaW5nOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9uYm9hcmRpbmcoT25ib2FyZGluZ0NvbmZpZyBvbmJvYXJkaW5nKSB7CisJCXRoaXMub25ib2FyZGluZyA9IG9uYm9hcmRpbmc7CisJfQorCisJcHVibGljIEVjb21wUG9ydGFsQ29uZmlnIGdldEVjb21wUG9ydGFsKCkgeworCQlyZXR1cm4gZWNvbXBQb3J0YWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0RWNvbXBQb3J0YWwoRWNvbXBQb3J0YWxDb25maWcgZWNvbXBQb3J0YWwpIHsKKwkJdGhpcy5lY29tcFBvcnRhbCA9IGVjb21wUG9ydGFsOworCX0KKworCXB1YmxpYyBUb3NjYVZhbGlkYXRvcnNDb25maWcgZ2V0VG9zY2FWYWxpZGF0b3JzKCkgeworCQlyZXR1cm4gdG9zY2FWYWxpZGF0b3JzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRvc2NhVmFsaWRhdG9ycyhUb3NjYVZhbGlkYXRvcnNDb25maWcgdG9zY2FWYWxpZGF0b3JzKSB7CisJCXRoaXMudG9zY2FWYWxpZGF0b3JzID0gdG9zY2FWYWxpZGF0b3JzOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZUF1ZGl0KCkgeworCQlyZXR1cm4gZGlzYWJsZUF1ZGl0OworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc2FibGVBdWRpdChib29sZWFuIGVuYWJsZUF1ZGl0KSB7CisJCXRoaXMuZGlzYWJsZUF1ZGl0ID0gZW5hYmxlQXVkaXQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbmZpZy9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDE1NzI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkJhc2ljQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5GaWxlQ2hhbmdlQ2FsbGJhY2s7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLklFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBGaWxlQ2hhbmdlQ2FsbGJhY2ssIElFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyIHsKKworCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG51bGw7CisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbk1hbmFnZXIgaW5zdGFuY2U7CisKKwlwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXIoQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29uZmlndXJhdGlvblNvdXJjZSA9IGNvbmZpZ3VyYXRpb25Tb3VyY2U7CisJCWxvYWRDb25maWd1cmF0aW9uRmlsZXMoKTsKKwkJaW5zdGFuY2UgPSB0aGlzOworCX0KKworCU1hcDxTdHJpbmcsIE9iamVjdD4gY29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCXByaXZhdGUgdm9pZCBsb2FkQ29uZmlndXJhdGlvbkZpbGVzKCkgeworCisJCWxvYWRDb25maWd1cmF0aW9uQ2xhc3MoQ29uZmlndXJhdGlvbi5jbGFzcyk7CisJCWxvYWRDb25maWd1cmF0aW9uQ2xhc3MoRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzKTsKKwkJbG9hZENvbmZpZ3VyYXRpb25DbGFzcyhOZW80akVycm9yc0NvbmZpZ3VyYXRpb24uY2xhc3MpOworCQlsb2FkQ29uZmlndXJhdGlvbkNsYXNzKEVjb21wRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzKTsKKwkJbG9hZENvbmZpZ3VyYXRpb25DbGFzcyhEaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uLmNsYXNzKTsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgQmFzaWNDb25maWd1cmF0aW9uPiB2b2lkIGxvYWRDb25maWd1cmF0aW9uQ2xhc3MoQ2xhc3M8VD4gY2xhenopIHsKKwkJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lciA9IG5ldyBDb25maWd1cmF0aW9uTGlzdGVuZXIoY2xhenosIHRoaXMpOworCisJCVQgb2JqZWN0ID0gY29uZmlndXJhdGlvblNvdXJjZS5nZXRBbmRXYXRjaENvbmZpZ3VyYXRpb24oY2xhenosIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcik7CisKKwkJY29uZmlndXJhdGlvbnMucHV0KGdldEtleShjbGF6eiksIG9iamVjdCk7CisJfQorCisJcHJpdmF0ZSA8VD4gU3RyaW5nIGdldEtleShDbGFzczxUPiBjbGFzczEpIHsKKworCQlyZXR1cm4gY2xhc3MxLmdldFNpbXBsZU5hbWUoKTsKKworCX0KKworCXB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisKKwkJcmV0dXJuIChDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9ucy5nZXQoZ2V0S2V5KENvbmZpZ3VyYXRpb24uY2xhc3MpKTsKKworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisKKwkJY29uZmlndXJhdGlvbnMucHV0KGdldEtleShDb25maWd1cmF0aW9uLmNsYXNzKSwgY29uZmlndXJhdGlvbik7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFcnJvckNvbmZpZ3VyYXRpb24oRXJyb3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKworCQljb25maWd1cmF0aW9ucy5wdXQoZ2V0S2V5KEVycm9yQ29uZmlndXJhdGlvbi5jbGFzcyksIGNvbmZpZ3VyYXRpb24pOworCisJfQorCisJcHVibGljIEVycm9yQ29uZmlndXJhdGlvbiBnZXRFcnJvckNvbmZpZ3VyYXRpb24oKSB7CisKKwkJcmV0dXJuIChFcnJvckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb25zLmdldChnZXRLZXkoRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzKSk7CisKKwl9CisKKwlwdWJsaWMgTmVvNGpFcnJvcnNDb25maWd1cmF0aW9uIGdldE5lbzRqRXJyb3JzQ29uZmlndXJhdGlvbigpIHsKKwkJcmV0dXJuIChOZW80akVycm9yc0NvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb25zLmdldChnZXRLZXkoTmVvNGpFcnJvcnNDb25maWd1cmF0aW9uLmNsYXNzKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVjb21wRXJyb3JDb25maWd1cmF0aW9uIGdldEVjb21wRXJyb3JDb25maWd1cmF0aW9uKCkgeworCisJCXJldHVybiAoRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb25zLmdldChnZXRLZXkoRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uY2xhc3MpKTsKKworCX0KKworCXB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb25BbmRXYXRjaChDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisKKwkJaWYgKGNvbmZpZ3VyYXRpb25MaXN0ZW5lciAhPSBudWxsKSB7CisKKwkJCWNvbmZpZ3VyYXRpb25Tb3VyY2UuYWRkV2F0Y2hDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24uY2xhc3MsIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcik7CisKKwkJfQorCQlyZXR1cm4gKENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb25zLmdldChnZXRLZXkoQ29uZmlndXJhdGlvbi5jbGFzcykpOworCisJfQorCisJcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKKwkJcmV0dXJuIGluc3RhbmNlOworCX0KKworCXB1YmxpYyB2b2lkIHJlY29uZmlndXJlKEJhc2ljQ29uZmlndXJhdGlvbiBvYmopIHsKKworCQkvLyBpZiAob2JqICE9IG51bGwpIHsKKworCQkvLyBpZiAob2JqIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbikgeworCQkvLyBjb25maWd1cmF0aW9ucy5wdXQoZ2V0S2V5KENvbmZpZ3VyYXRpb24uY2xhc3MpLCBvYmopOworCQkvLyB9CisJCS8vIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvckNvbmZpZ3VyYXRpb24pIHsKKwkJLy8gY29uZmlndXJhdGlvbnMucHV0KGdldEtleShFcnJvckNvbmZpZ3VyYXRpb24uY2xhc3MpLCBvYmopOworCQkvLyB9CisJCS8vCisJCS8vIGlmIChvYmogaW5zdGFuY2VvZiBFY29tcEVycm9yQ29uZmlndXJhdGlvbikgeworCQkvLyBjb25maWd1cmF0aW9ucy5wdXQoZ2V0S2V5KEVjb21wRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzKSwgb2JqKTsKKwkJLy8gfQorCQkvLyB9CisKKwl9CisKKwkvKioKKwkgKiBGT1IgVEVTVCBPTkxZCisJICogCisJICogQHBhcmFtIGVjb21wRXJyb3JDb25maWd1cmF0aW9uCisJICovCisJcHVibGljIHZvaWQgc2V0RWNvbXBFcnJvckNvbmZpZ3VyYXRpb24oRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24gZWNvbXBFcnJvckNvbmZpZ3VyYXRpb24pIHsKKworCQljb25maWd1cmF0aW9ucy5wdXQoZ2V0S2V5KEVjb21wRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzKSwgZWNvbXBFcnJvckNvbmZpZ3VyYXRpb24pOworCisJfQorCisJcHVibGljIERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZ2V0RGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbigpIHsKKworCQlyZXR1cm4gKERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb25zLmdldChnZXRLZXkoRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5jbGFzcykpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTIwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbmZpZy9EaXN0cmlidXRpb25FbmdpbmVDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw0MzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQmFzaWNDb25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbiB7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiB1ZWJTZXJ2ZXJzOworCisJcHJpdmF0ZSBTdHJpbmcgZGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWU7CisKKwlwcml2YXRlIFN0cmluZyBkaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWU7CisKKwlwcml2YXRlIEludGVnZXIgaW5pdFJldHJ5SW50ZXJ2YWxTZWM7CisKKwlwcml2YXRlIEludGVnZXIgaW5pdE1heEludGVydmFsU2VjOworCisJcHJpdmF0ZSBDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnIGRpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzOworCisJcHJpdmF0ZSBDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnIGRpc3RyaWJOb3RpZlJlc291cmNlQXJ0aWZhY3RUeXBlczsKKworCS8vIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRpc3RyaWJOb3RpZlNlcnZpY2VJbmZvQXJ0aWZhY3RUeXBlczsKKworCS8vIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRpc3RyaWJOb3RpZlJlc291cmNlTGlmZWN5Y2xlQXJ0aWZhY3RUeXBlczsKKworCXByaXZhdGUgU3RyaW5nIHVlYlB1YmxpY0tleTsKKworCXByaXZhdGUgU3RyaW5nIHVlYlNlY3JldEtleTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGVudmlyb25tZW50czsKKworCXByaXZhdGUgRGlzdHJpYnV0aW9uU3RhdHVzVG9waWNDb25maWcgZGlzdHJpYnV0aW9uU3RhdHVzVG9waWM7CisKKwlwcml2YXRlIENyZWF0ZVRvcGljQ29uZmlnIGNyZWF0ZVRvcGljOworCisJcHJpdmF0ZSBib29sZWFuIHN0YXJ0RGlzdHJpYnV0aW9uRW5naW5lOworCisJcHJpdmF0ZSBEaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpY0NvbmZpZyBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYzsKKworCXByaXZhdGUgSW50ZWdlciBkZWZhdWx0QXJ0aWZhY3RJbnN0YWxsYXRpb25UaW1lb3V0ID0gNjA7CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIERpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdHMgeworCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmljZTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXNvdXJjZTsKKworCQlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRTZXJ2aWNlKCkgeworCQkJcmV0dXJuIHNlcnZpY2U7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKE1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmljZSkgeworCQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKKwkJfQorCisJCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFJlc291cmNlKCkgeworCQkJcmV0dXJuIHJlc291cmNlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoTWFwPFN0cmluZywgT2JqZWN0PiByZXNvdXJjZSkgeworCQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE5vdGlmQXJ0aWZhY3RUeXBlcyB7CisKKwkJTGlzdDxTdHJpbmc+IGluZm87CisJCUxpc3Q8U3RyaW5nPiBsaWZlY3ljbGU7CisKKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbmZvKCkgeworCQkJcmV0dXJuIGluZm87CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRJbmZvKExpc3Q8U3RyaW5nPiBpbmZvKSB7CisJCQl0aGlzLmluZm8gPSBpbmZvOworCQl9CisKKwkJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRMaWZlY3ljbGUoKSB7CisJCQlyZXR1cm4gbGlmZWN5Y2xlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlKExpc3Q8U3RyaW5nPiBsaWZlY3ljbGUpIHsKKwkJCXRoaXMubGlmZWN5Y2xlID0gbGlmZWN5Y2xlOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE5vdGlmQXJ0aWZhY3RUeXBlc1Jlc291cmNlIHsKKworCQlMaXN0PEFydGlmY2F0VHlwZUVudW0+IGxpZmVjeWNsZTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgZW51bSBBcnRpZmNhdFR5cGVFbnVtIHsKKworCQlNVVJBTk9fUEtHKCJNVVJBTk8tUEtHIiksIEhFQVQoIkhFQVQiKSwgREdfWE1MKCJER19YTUwiKTsKKworCQlTdHJpbmcgdmFsdWU7CisKKwkJcHJpdmF0ZSBBcnRpZmNhdFR5cGVFbnVtKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKworCQkJcmV0dXJuIHZhbHVlOworCQl9CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRVZWJTZXJ2ZXJzKCkgeworCQlyZXR1cm4gdWViU2VydmVyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVZWJTZXJ2ZXJzKExpc3Q8U3RyaW5nPiB1ZWJTZXJ2ZXJzKSB7CisJCXRoaXMudWViU2VydmVycyA9IHVlYlNlcnZlcnM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZSgpIHsKKwkJcmV0dXJuIGRpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lKFN0cmluZyBkaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZSkgeworCQl0aGlzLmRpc3RyaWJ1dGlvbk5vdGlmVG9waWNOYW1lID0gZGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUoKSB7CisJCXJldHVybiBkaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lKFN0cmluZyBkaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUpIHsKKwkJdGhpcy5kaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUgPSBkaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWU7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0SW5pdFJldHJ5SW50ZXJ2YWxTZWMoKSB7CisJCXJldHVybiBpbml0UmV0cnlJbnRlcnZhbFNlYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbml0UmV0cnlJbnRlcnZhbFNlYyhJbnRlZ2VyIGluaXRSZXRyeUludGVydmFsU2VjKSB7CisJCXRoaXMuaW5pdFJldHJ5SW50ZXJ2YWxTZWMgPSBpbml0UmV0cnlJbnRlcnZhbFNlYzsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50QXJ0aWZhY3RUeXBlc0NvbmZpZyBnZXREaXN0cmliTm90aWZTZXJ2aWNlQXJ0aWZhY3RUeXBlcygpIHsKKwkJcmV0dXJuIGRpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzKENvbXBvbmVudEFydGlmYWN0VHlwZXNDb25maWcgZGlzdHJpYk5vdGlmU2VydmljZUFydGlmYWN0VHlwZXMpIHsKKwkJdGhpcy5kaXN0cmliTm90aWZTZXJ2aWNlQXJ0aWZhY3RUeXBlcyA9IGRpc3RyaWJOb3RpZlNlcnZpY2VBcnRpZmFjdFR5cGVzOworCX0KKworCXB1YmxpYyBDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnIGdldERpc3RyaWJOb3RpZlJlc291cmNlQXJ0aWZhY3RUeXBlcygpIHsKKwkJcmV0dXJuIGRpc3RyaWJOb3RpZlJlc291cmNlQXJ0aWZhY3RUeXBlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXMoQ29tcG9uZW50QXJ0aWZhY3RUeXBlc0NvbmZpZyBkaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXMpIHsKKwkJdGhpcy5kaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXMgPSBkaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVZWJQdWJsaWNLZXkoKSB7CisJCXJldHVybiB1ZWJQdWJsaWNLZXk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VWViUHVibGljS2V5KFN0cmluZyB1ZWJQdWJsaWNLZXkpIHsKKwkJdGhpcy51ZWJQdWJsaWNLZXkgPSB1ZWJQdWJsaWNLZXk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVZWJTZWNyZXRLZXkoKSB7CisJCXJldHVybiB1ZWJTZWNyZXRLZXk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VWViU2VjcmV0S2V5KFN0cmluZyB1ZWJTZWNyZXRLZXkpIHsKKwkJdGhpcy51ZWJTZWNyZXRLZXkgPSB1ZWJTZWNyZXRLZXk7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFbnZpcm9ubWVudHMoKSB7CisJCXJldHVybiBlbnZpcm9ubWVudHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnRzKExpc3Q8U3RyaW5nPiBlbnZpcm9ubWVudHMpIHsKKworCQlTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWlmIChlbnZpcm9ubWVudHMgIT0gbnVsbCkgeworCQkJc2V0LmFkZEFsbChlbnZpcm9ubWVudHMpOworCQkJdGhpcy5lbnZpcm9ubWVudHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2V0KTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuZW52aXJvbm1lbnRzID0gbnVsbDsKKwkJfQorCisJfQorCisJcHVibGljIERpc3RyaWJ1dGlvblN0YXR1c1RvcGljQ29uZmlnIGdldERpc3RyaWJ1dGlvblN0YXR1c1RvcGljKCkgeworCQlyZXR1cm4gZGlzdHJpYnV0aW9uU3RhdHVzVG9waWM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0aW9uU3RhdHVzVG9waWMoRGlzdHJpYnV0aW9uU3RhdHVzVG9waWNDb25maWcgZGlzdHJpYnV0aW9uU3RhdHVzVG9waWMpIHsKKwkJdGhpcy5kaXN0cmlidXRpb25TdGF0dXNUb3BpYyA9IGRpc3RyaWJ1dGlvblN0YXR1c1RvcGljOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEluaXRNYXhJbnRlcnZhbFNlYygpIHsKKwkJcmV0dXJuIGluaXRNYXhJbnRlcnZhbFNlYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbml0TWF4SW50ZXJ2YWxTZWMoSW50ZWdlciBpbml0TWF4SW50ZXJ2YWxTZWMpIHsKKwkJdGhpcy5pbml0TWF4SW50ZXJ2YWxTZWMgPSBpbml0TWF4SW50ZXJ2YWxTZWM7CisJfQorCisJcHVibGljIENyZWF0ZVRvcGljQ29uZmlnIGdldENyZWF0ZVRvcGljKCkgeworCQlyZXR1cm4gY3JlYXRlVG9waWM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRlVG9waWMoQ3JlYXRlVG9waWNDb25maWcgY3JlYXRlVG9waWMpIHsKKwkJdGhpcy5jcmVhdGVUb3BpYyA9IGNyZWF0ZVRvcGljOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU3RhcnREaXN0cmlidXRpb25FbmdpbmUoKSB7CisJCXJldHVybiBzdGFydERpc3RyaWJ1dGlvbkVuZ2luZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGFydERpc3RyaWJ1dGlvbkVuZ2luZShib29sZWFuIHN0YXJ0RGlzdHJpYnV0aW9uRW5naW5lKSB7CisJCXRoaXMuc3RhcnREaXN0cmlidXRpb25FbmdpbmUgPSBzdGFydERpc3RyaWJ1dGlvbkVuZ2luZTsKKwl9CisKKwlwdWJsaWMgRGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uVG9waWNDb25maWcgZ2V0RGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uVG9waWMoKSB7CisJCXJldHVybiBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYyhEaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpY0NvbmZpZyBkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYykgeworCQl0aGlzLmRpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblRvcGljID0gZGlzdHJpYnV0aW9uTm90aWZpY2F0aW9uVG9waWM7CisJfQorCisJcHVibGljIGludCBnZXREZWZhdWx0QXJ0aWZhY3RJbnN0YWxsYXRpb25UaW1lb3V0KCkgeworCQlyZXR1cm4gZGVmYXVsdEFydGlmYWN0SW5zdGFsbGF0aW9uVGltZW91dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0QXJ0aWZhY3RJbnN0YWxsYXRpb25UaW1lb3V0KGludCBkZWZhdWx0QXJ0aWZhY3RJbnN0YWxsYXRpb25UaW1lb3V0KSB7CisJCXRoaXMuZGVmYXVsdEFydGlmYWN0SW5zdGFsbGF0aW9uVGltZW91dCA9IGRlZmF1bHRBcnRpZmFjdEluc3RhbGxhdGlvblRpbWVvdXQ7CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBDcmVhdGVUb3BpY0NvbmZpZyB7CisKKwkJcHJpdmF0ZSBJbnRlZ2VyIHBhcnRpdGlvbkNvdW50OworCQlwcml2YXRlIEludGVnZXIgcmVwbGljYXRpb25Db3VudDsKKworCQlwdWJsaWMgSW50ZWdlciBnZXRQYXJ0aXRpb25Db3VudCgpIHsKKwkJCXJldHVybiBwYXJ0aXRpb25Db3VudDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbkNvdW50KEludGVnZXIgcGFydGl0aW9uQ291bnQpIHsKKwkJCXRoaXMucGFydGl0aW9uQ291bnQgPSBwYXJ0aXRpb25Db3VudDsKKwkJfQorCisJCXB1YmxpYyBJbnRlZ2VyIGdldFJlcGxpY2F0aW9uQ291bnQoKSB7CisJCQlyZXR1cm4gcmVwbGljYXRpb25Db3VudDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uQ291bnQoSW50ZWdlciByZXBsaWNhdGlvbkNvdW50KSB7CisJCQl0aGlzLnJlcGxpY2F0aW9uQ291bnQgPSByZXBsaWNhdGlvbkNvdW50OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIkNyZWF0ZVRvcGljQ29uZmlnIFtwYXJ0aXRpb25Db3VudD0iICsgcGFydGl0aW9uQ291bnQgKyAiLCByZXBsaWNhdGlvbkNvdW50PSIgKyByZXBsaWNhdGlvbkNvdW50ICsgIl0iOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEVudmlyb25tZW50Q29uZmlnIHsKKworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIExpc3Q8U3RyaW5nPiB1ZWJTZXJ2ZXJzOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VWViU2VydmVycygpIHsKKwkJCXJldHVybiB1ZWJTZXJ2ZXJzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0VWViU2VydmVycyhMaXN0PFN0cmluZz4gdWViU2VydmVycykgeworCQkJdGhpcy51ZWJTZXJ2ZXJzID0gdWViU2VydmVyczsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJFbnZpcm9ubWVudENvbmZpZyBbbmFtZT0iICsgbmFtZSArICIsIHVlYlNlcnZlcnM9IiArIHVlYlNlcnZlcnMgKyAiXSI7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGlzdHJpYnV0aW9uU3RhdHVzVG9waWNDb25maWcgeworCisJCXByaXZhdGUgSW50ZWdlciBwb2xsaW5nSW50ZXJ2YWxTZWM7CisJCXByaXZhdGUgSW50ZWdlciBmZXRjaFRpbWVTZWM7CisJCXByaXZhdGUgU3RyaW5nIGNvbnN1bWVyR3JvdXA7CisJCXByaXZhdGUgU3RyaW5nIGNvbnN1bWVySWQ7CisKKwkJcHVibGljIEludGVnZXIgZ2V0UG9sbGluZ0ludGVydmFsU2VjKCkgeworCQkJcmV0dXJuIHBvbGxpbmdJbnRlcnZhbFNlYzsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFBvbGxpbmdJbnRlcnZhbFNlYyhJbnRlZ2VyIHBvbGxpbmdJbnRlcnZhbFNlYykgeworCQkJdGhpcy5wb2xsaW5nSW50ZXJ2YWxTZWMgPSBwb2xsaW5nSW50ZXJ2YWxTZWM7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRGZXRjaFRpbWVTZWMoKSB7CisJCQlyZXR1cm4gZmV0Y2hUaW1lU2VjOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RmV0Y2hUaW1lU2VjKEludGVnZXIgZmV0Y2hUaW1lU2VjKSB7CisJCQl0aGlzLmZldGNoVGltZVNlYyA9IGZldGNoVGltZVNlYzsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJHcm91cCgpIHsKKwkJCXJldHVybiBjb25zdW1lckdyb3VwOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0Q29uc3VtZXJHcm91cChTdHJpbmcgY29uc3VtZXJHcm91cCkgeworCQkJdGhpcy5jb25zdW1lckdyb3VwID0gY29uc3VtZXJHcm91cDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJJZCgpIHsKKwkJCXJldHVybiBjb25zdW1lcklkOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0Q29uc3VtZXJJZChTdHJpbmcgY29uc3VtZXJJZCkgeworCQkJdGhpcy5jb25zdW1lcklkID0gY29uc3VtZXJJZDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJEaXN0cmlidXRpb25TdGF0dXNUb3BpY0NvbmZpZyBbcG9sbGluZ0ludGVydmFsU2VjPSIgKyBwb2xsaW5nSW50ZXJ2YWxTZWMgKyAiLCBmZXRjaFRpbWVTZWM9IiArIGZldGNoVGltZVNlYyArICIsIGNvbnN1bWVyR3JvdXA9IiArIGNvbnN1bWVyR3JvdXAgKyAiLCBjb25zdW1lcklkPSIgKyBjb25zdW1lcklkICsgIl0iOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblRvcGljQ29uZmlnIHsKKworCQlwcml2YXRlIEludGVnZXIgbWF4V2FpdGluZ0FmdGVyU2VuZGluZ1NlY29uZHM7CisJCXByaXZhdGUgSW50ZWdlciBtYXhUaHJlYWRQb29sU2l6ZTsKKwkJcHJpdmF0ZSBJbnRlZ2VyIG1pblRocmVhZFBvb2xTaXplOworCisJCXB1YmxpYyBJbnRlZ2VyIGdldE1heFdhaXRpbmdBZnRlclNlbmRpbmdTZWNvbmRzKCkgeworCQkJcmV0dXJuIG1heFdhaXRpbmdBZnRlclNlbmRpbmdTZWNvbmRzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0TWF4V2FpdGluZ0FmdGVyU2VuZGluZ1NlY29uZHMoSW50ZWdlciBtYXhXYWl0aW5nQWZ0ZXJTZW5kaW5nU2Vjb25kcykgeworCQkJdGhpcy5tYXhXYWl0aW5nQWZ0ZXJTZW5kaW5nU2Vjb25kcyA9IG1heFdhaXRpbmdBZnRlclNlbmRpbmdTZWNvbmRzOworCQl9CisKKwkJcHVibGljIEludGVnZXIgZ2V0TWF4VGhyZWFkUG9vbFNpemUoKSB7CisJCQlyZXR1cm4gbWF4VGhyZWFkUG9vbFNpemU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRNYXhUaHJlYWRQb29sU2l6ZShJbnRlZ2VyIG1heFRocmVhZFBvb2xTaXplKSB7CisJCQl0aGlzLm1heFRocmVhZFBvb2xTaXplID0gbWF4VGhyZWFkUG9vbFNpemU7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRNaW5UaHJlYWRQb29sU2l6ZSgpIHsKKwkJCXJldHVybiBtaW5UaHJlYWRQb29sU2l6ZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldE1pblRocmVhZFBvb2xTaXplKEludGVnZXIgbWluVGhyZWFkUG9vbFNpemUpIHsKKwkJCXRoaXMubWluVGhyZWFkUG9vbFNpemUgPSBtaW5UaHJlYWRQb29sU2l6ZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJEaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpY0NvbmZpZyBbbWF4V2FpdGluZ0FmdGVyU2VuZGluZ1NlY29uZHM9IiArIG1heFdhaXRpbmdBZnRlclNlbmRpbmdTZWNvbmRzICsgIiwgbWF4VGhyZWFkUG9vbFNpemU9IiArIG1heFRocmVhZFBvb2xTaXplICsgIiwgbWluVGhyZWFkUG9vbFNpemU9IiArIG1pblRocmVhZFBvb2xTaXplICsgIl0iOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIENvbXBvbmVudEFydGlmYWN0VHlwZXNDb25maWcgeworCisJCXByaXZhdGUgTGlzdDxTdHJpbmc+IGluZm87CisJCXByaXZhdGUgTGlzdDxTdHJpbmc+IGxpZmVjeWNsZTsKKworCQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEluZm8oKSB7CisJCQlyZXR1cm4gaW5mbzsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEluZm8oTGlzdDxTdHJpbmc+IGluZm8pIHsKKwkJCXRoaXMuaW5mbyA9IGluZm87CisJCX0KKworCQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldExpZmVjeWNsZSgpIHsKKwkJCXJldHVybiBsaWZlY3ljbGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGUoTGlzdDxTdHJpbmc+IGxpZmVjeWNsZSkgeworCQkJdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiQXJ0aWZhY3RUeXBlc0NvbmZpZyBbaW5mbz0iICsgaW5mbyArICIsIGxpZmVjeWNsZT0iICsgbGlmZWN5Y2xlICsgIl0iOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL0Vycm9yQ29uZmlndXJhdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvRXJyb3JDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1MGRmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL0Vycm9yQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5CYXNpY0NvbmZpZ3VyYXRpb247CisKK3B1YmxpYyBjbGFzcyBFcnJvckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBCYXNpY0NvbmZpZ3VyYXRpb24geworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFcnJvckluZm8+IGVycm9yczsKKworCXB1YmxpYyBNYXA8U3RyaW5nLCBFcnJvckluZm8+IGdldEVycm9ycygpIHsKKwkJcmV0dXJuIGVycm9yczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFcnJvcnMoTWFwPFN0cmluZywgRXJyb3JJbmZvPiBlcnJvcnMpIHsKKwkJdGhpcy5lcnJvcnMgPSBlcnJvcnM7CisJfQorCisJcHVibGljIEVycm9ySW5mbyBnZXRFcnJvckluZm8oU3RyaW5nIGtleSkgeworCQlFcnJvckluZm8gY2xvbmUgPSBudWxsOworCQlFcnJvckluZm8gb3RoZXIgPSBlcnJvcnMuZ2V0KGtleSk7CisJCWlmIChvdGhlciAhPSBudWxsKSB7CisJCQljbG9uZSA9IG5ldyBFcnJvckluZm8oKTsKKwkJCWNsb25lLmNsb25lRGF0YShvdGhlcik7CisJCX0KKwkJcmV0dXJuIGNsb25lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRXJyb3JDb25maWd1cmF0aW9uIFtlcnJvcnM9IiArIGVycm9ycyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL0Vycm9ySW5mby5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvRXJyb3JJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkYWY5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL0Vycm9ySW5mby5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yTmFtZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKKworCXByaXZhdGUgSW50ZWdlciBjb2RlOworCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisJcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUlkOworCXByaXZhdGUgRXJyb3JJbmZvVHlwZSBlcnJvckluZm9UeXBlOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNWQ19QUkVGSVggPSAiU1ZDIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MX1BSRUZJWCA9ICJQT0wiOworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEVycm9ySW5mby5jbGFzcy5nZXROYW1lKCkpOworCisJcHVibGljIEVycm9ySW5mbygpIHsKKwkJdGhpcy5lcnJvckluZm9UeXBlID0gRXJyb3JJbmZvVHlwZS5PSzsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRDb2RlKCkgeworCQlyZXR1cm4gY29kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb2RlKEludGVnZXIgY29kZSkgeworCQl0aGlzLmNvZGUgPSBjb2RlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKwkJcmV0dXJuIG1lc3NhZ2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKCkgeworCQlyZXR1cm4gbWVzc2FnZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZChTdHJpbmcgbWVzc2FnZUlkKSB7CisJCS8vIERldGVybWluaW5nIHRoZSB0eXBlIG9mIGVycm9yCisJCWlmIChtZXNzYWdlSWQgPT0gbnVsbCkgeworCQkJdGhpcy5lcnJvckluZm9UeXBlID0gRXJyb3JJbmZvVHlwZS5PSzsKKwkJfSBlbHNlIGlmIChtZXNzYWdlSWQuc3RhcnRzV2l0aChTVkNfUFJFRklYKSkgeworCQkJdGhpcy5lcnJvckluZm9UeXBlID0gRXJyb3JJbmZvVHlwZS5TRVJWSUNFX0VYQ0VQVElPTjsKKwkJfSBlbHNlIGlmIChtZXNzYWdlSWQuc3RhcnRzV2l0aChQT0xfUFJFRklYKSkgeworCQkJdGhpcy5lcnJvckluZm9UeXBlID0gRXJyb3JJbmZvVHlwZS5QT0xJQ1lfRVhDRVBUSU9OOworCQl9IGVsc2UgeworCQkJLy8gdW5leHBlY3RlZCAtIHNob3VsZCBpdCBmYWlsIHRoZSBzdGFydHVwPworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkVycm9yQ29uZmlnRmlsZUZvcm1hdCwgIkVycm9yIEluZm8iKTsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dFcnJvckNvbmZpZ0ZpbGVGb3JtYXQoIkVycm9yIEluZm8iLAorCQkJCQkiQ291bGQgbm90IHNldCBlcnJvciBpbmZvIHR5cGUgZm9yIG1lc3NhZ2UgaWQgIiArIG1lc3NhZ2VJZCk7CisJCQlsb2cuZGVidWcoIkVycm9yOiB1bmV4cGVjdGVkIGVycm9yIG1lc3NhZ2UgSUQge30sIHNob3VsZCBzdGFydCB3aXRoIHt9IG9yIHt9IiwgbWVzc2FnZUlkLCBTVkNfUFJFRklYLAorCQkJCQlQT0xfUFJFRklYKTsKKwkJfQorCQl0aGlzLm1lc3NhZ2VJZCA9IG1lc3NhZ2VJZDsKKwl9CisKKwlwdWJsaWMgRXJyb3JJbmZvVHlwZSBnZXRFcnJvckluZm9UeXBlKCkgeworCQlyZXR1cm4gdGhpcy5lcnJvckluZm9UeXBlOworCX0KKworCXB1YmxpYyB2b2lkIGNsb25lRGF0YShFcnJvckluZm8gb3RoZXIpIHsKKwkJdGhpcy5jb2RlID0gb3RoZXIuZ2V0Q29kZSgpOworCQl0aGlzLm1lc3NhZ2UgPSBvdGhlci5nZXRNZXNzYWdlKCk7CisJCXRoaXMubWVzc2FnZUlkID0gb3RoZXIuZ2V0TWVzc2FnZUlkKCk7CisJCXRoaXMuZXJyb3JJbmZvVHlwZSA9IG90aGVyLmVycm9ySW5mb1R5cGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJFcnJvckluZm8gW2NvZGU9IiArIGNvZGUgKyAiLCBtZXNzYWdlSWQ9IiArIG1lc3NhZ2VJZCArICIsIG1lc3NhZ2U9IiArIG1lc3NhZ2UgKyAiXSI7CisJfQorCisJcHVibGljIGVudW0gRXJyb3JJbmZvVHlwZSB7CisJCU9LLCBQT0xJQ1lfRVhDRVBUSU9OLCBTRVJWSUNFX0VYQ0VQVElPTgorCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvTmVvNGpFcnJvcnNDb25maWd1cmF0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2NvbmZpZy9OZW80akVycm9yc0NvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE4NWRjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvTmVvNGpFcnJvcnNDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkJhc2ljQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIE5lbzRqRXJyb3JzQ29uZmlndXJhdGlvbiBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbiB7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGVycm9yczsKKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEVycm9ycygpIHsKKwkJcmV0dXJuIGVycm9yczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFcnJvcnMoTWFwPFN0cmluZywgU3RyaW5nPiBlcnJvcnMpIHsKKwkJdGhpcy5lcnJvcnMgPSBlcnJvcnM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gZXJyb3JzLmdldChrZXkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiTmVvNGpFcnJvcnNDb25maWd1cmF0aW9uIFtlcnJvcnM9IiArIGVycm9ycyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL3ZhbGlkYXRpb24vRGVwbG95bWVudEFydGlmYWN0SGVhdENvbmZpZ3VyYXRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvY29uZmlnL3ZhbGlkYXRpb24vRGVwbG95bWVudEFydGlmYWN0SGVhdENvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmI1M2JhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9jb25maWcvdmFsaWRhdGlvbi9EZXBsb3ltZW50QXJ0aWZhY3RIZWF0Q29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQ3VycmVudGx5IGZvciBkZXBsb3ltZW50IGFydGlmYWN0cyBIRUFUIHZhbGlkYXRpb24gb25seS4KKyAqIAorICogT3RoZXIgYXJ0aWZhY3RzIG1pZ2h0IHJlcXVpcmUgZGlmZmVyZW50IGZpZWxkcyB2YWxpZGF0aW9uIEJlIHN1cmUgdG8gY2hlY2sgaXQKKyAqIGJlZm9yZSB5b3UgcmUtdXNlIHRoaXMgY2xhc3MKKyAqIAorICogQGF1dGhvciBwYWhhcm9uaQorICoKKyAqLworcHVibGljIGNsYXNzIERlcGxveW1lbnRBcnRpZmFjdEhlYXRDb25maWd1cmF0aW9uIHsKKworCS8vIEFsbCB0aGUgcmVzdCBvZiBoZWF0IGZpbGUgaXMgbm90IG5lZWRlZCBmb3Igbm93Li4uCisJU3RyaW5nIGhlYXRfdGVtcGxhdGVfdmVyc2lvbjsKKworCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVzb3VyY2VzOworCisJcHVibGljIFN0cmluZyBnZXRIZWF0X3RlbXBsYXRlX3ZlcnNpb24oKSB7CisJCXJldHVybiBoZWF0X3RlbXBsYXRlX3ZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0SGVhdF90ZW1wbGF0ZV92ZXJzaW9uKFN0cmluZyBoZWF0X3RlbXBsYXRlX3ZlcnNpb24pIHsKKwkJdGhpcy5oZWF0X3RlbXBsYXRlX3ZlcnNpb24gPSBoZWF0X3RlbXBsYXRlX3ZlcnNpb247CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UmVzb3VyY2VzKCkgeworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc291cmNlcykgeworCQl0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvbW9uaXRvcmluZy9CZU1vbml0b3JpbmdTZXJ2aWNlLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vbml0b3JpbmcvQmVNb25pdG9yaW5nU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNzM5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL21vbml0b3JpbmcvQmVNb25pdG9yaW5nU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5jb25maWcuUmVxdWVzdENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuQ2xvc2VhYmxlSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LlN0cmluZ0VudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQ2xvc2VhYmxlSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuSHR0cENsaWVudEJ1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5tb25pdG9yaW5nLk1vbml0b3JpbmdFdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ubW9uaXRvcmluZy5Nb25pdG9yaW5nTWV0cmljc0ZldGNoZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworcHVibGljIGNsYXNzIEJlTW9uaXRvcmluZ1NlcnZpY2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICIlczovLyVzOiVzL3NkYzIvcmVzdC9tb25pdG9yaW5nIjsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbW9uaXRvcmluZ0xvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKCJhc2RjLmJlLm1vbml0b3Jpbmcuc2VydmljZSIpOworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCZU1vbml0b3JpbmdTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKworCXByaXZhdGUgY2xhc3MgTW9uaXRvcmluZ1NjaGVkdWxlZFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQltb25pdG9yaW5nTG9nZ2VyLnRyYWNlKCJFeGVjdXRpbmcgQkUgTW9uaXRvcmluZyBUYXNrIC0gU3RhcnQiKTsKKwkJCU1vbml0b3JpbmdFdmVudCBtb25pdG9yaW5nTWV0cmljcyA9IE1vbml0b3JpbmdNZXRyaWNzRmV0Y2hlci5nZXRJbnN0YW5jZSgpLmdldE1vbml0b3JpbmdNZXRyaWNzKCk7CisJCQlwcm9jZXNzTW9uaXRvcmluZ0V2ZW50KG1vbml0b3JpbmdNZXRyaWNzKTsKKwkJCW1vbml0b3JpbmdMb2dnZXIudHJhY2UoIkV4ZWN1dGluZyBCRSBNb25pdG9yaW5nIFRhc2sgLSBTdGF0dXMgPSB7fSIsIG1vbml0b3JpbmdNZXRyaWNzLnRvU3RyaW5nKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBleGVjdXRvciB3aWxsIGV4ZWN1dGUgdGhlIE1vbml0b3JpbmcgdGFzay4KKwkgKi8KKwlTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgbW9uaXRvcmluZ0V4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5KCkgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgeworCQkJcmV0dXJuIG5ldyBUaHJlYWQociwgIkJFLU1vbml0b3JpbmctVGhyZWFkIik7CisJCX0KKwl9KTsKKwlwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisKKwlwdWJsaWMgQmVNb25pdG9yaW5nU2VydmljZShTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJfQorCisJcHVibGljIHZvaWQgc3RhcnQoaW50IGludGVydmFsKSB7CisJCUNvbmZpZ3VyYXRpb24gY29uZmlnID0gKChDb25maWd1cmF0aW9uTWFuYWdlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkKKwkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOworCQlpZiAoY29uZmlnLmdldFN5c3RlbU1vbml0b3JpbmcoKS5nZXRFbmFibGVkKCkpIHsKKwkJCWxvZy5pbmZvKCJCRSBtb25pdG9yaW5nIHNlcnZpY2UgaXMgZW5hYmxlZCwgaW50ZXJ2YWwgaXMge30gc2Vjb25kcyIsIGludGVydmFsKTsKKwkJCXRoaXMubW9uaXRvcmluZ0V4ZWN1dG9yLnNjaGVkdWxlQXRGaXhlZFJhdGUobmV3IE1vbml0b3JpbmdTY2hlZHVsZWRUYXNrKCksIDAsIGludGVydmFsLCBUaW1lVW5pdC5TRUNPTkRTKTsKKwkJfSBlbHNlIHsKKwkJCWxvZy5pbmZvKCJCRSBtb25pdG9yaW5nIHNlcnZpY2UgaXMgZGlzYWJsZWQiKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcm9jZXNzTW9uaXRvcmluZ0V2ZW50KE1vbml0b3JpbmdFdmVudCBtb25pdG9yaW5nTWV0cmljcykgeworCQlDbG9zZWFibGVIdHRwQ2xpZW50IGh0dHBDbGllbnQgPSBudWxsOworCQl0cnkgeworCQkJQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKENvbmZpZ3VyYXRpb25NYW5hZ2VyKSBjb250ZXh0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHVVJBVElPTl9NQU5BR0VSX0FUVFIpKQorCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOworCQkJU3RyaW5nIHJlZGlyZWN0ZWRVcmwgPSBTdHJpbmcuZm9ybWF0KFVSTCwgY29uZmlnLmdldEJlUHJvdG9jb2woKSwgY29uZmlnLmdldEJlRnFkbigpLAorCQkJCQljb25maWcuZ2V0QmVIdHRwUG9ydCgpKTsKKwkJCWh0dHBDbGllbnQgPSBnZXRIdHRwQ2xpZW50KGNvbmZpZyk7CisJCQlIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdChyZWRpcmVjdGVkVXJsKTsKKwkJCVN0cmluZyBtb25pdG9yaW5nTWV0cmljc0pzb24gPSBnc29uLnRvSnNvbihtb25pdG9yaW5nTWV0cmljcyk7CisJCQlIdHRwRW50aXR5IG15RW50aXR5ID0gbmV3IFN0cmluZ0VudGl0eShtb25pdG9yaW5nTWV0cmljc0pzb24pOworCQkJaHR0cFBvc3Quc2V0RW50aXR5KG15RW50aXR5KTsKKwkJCWh0dHBQb3N0LnNldEhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKTsKKwkJCWludCBiZVJlc3BvbnNlU3RhdHVzOworCQkJQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIGJlUmVzcG9uc2U7CisJCQl0cnkgeworCQkJCWJlUmVzcG9uc2UgPSBodHRwQ2xpZW50LmV4ZWN1dGUoaHR0cFBvc3QpOworCQkJCWJlUmVzcG9uc2VTdGF0dXMgPSBiZVJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisJCQkJaWYgKGJlUmVzcG9uc2VTdGF0dXMgIT0gSHR0cFN0YXR1cy5TQ19PSykgeworCQkJCQltb25pdG9yaW5nTG9nZ2VyLmVycm9yKCJVbmV4cGVjdGVkIEhUVFAgcmVzcG9uc2UgZnJvbSBCRSA6IHt9IiwgYmVSZXNwb25zZVN0YXR1cyk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQltb25pdG9yaW5nTG9nZ2VyLmVycm9yKCJNb25pdG9yaW5nIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gQkUiLCBlKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCW1vbml0b3JpbmdMb2dnZXIuZXJyb3IoIlVuZXhwZWN0ZWQgbW9uaXRvcmluZyBlcnJvciIsIGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGh0dHBDbGllbnQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWh0dHBDbGllbnQuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBDbG9zZWFibGVIdHRwQ2xpZW50IGdldEh0dHBDbGllbnQoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJaW50IHRpbWVvdXQgPSAzMDAwOworCQlSZXF1ZXN0Q29uZmlnLkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBSZXF1ZXN0Q29uZmlnLmN1c3RvbSgpOworCQlyZXF1ZXN0QnVpbGRlci5zZXRDb25uZWN0VGltZW91dCh0aW1lb3V0KS5zZXRDb25uZWN0aW9uUmVxdWVzdFRpbWVvdXQodGltZW91dCkuc2V0U29ja2V0VGltZW91dCh0aW1lb3V0KTsKKworCQlIdHRwQ2xpZW50QnVpbGRlciBidWlsZGVyID0gSHR0cENsaWVudEJ1aWxkZXIuY3JlYXRlKCk7CisJCWJ1aWxkZXIuc2V0RGVmYXVsdFJlcXVlc3RDb25maWcocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSk7CisJCXJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0FwcGxpY2F0aW9uRXJyb3JDb2Rlc0VudW0uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9BcHBsaWNhdGlvbkVycm9yQ29kZXNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwZjMwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9BcHBsaWNhdGlvbkVycm9yQ29kZXNFbnVtLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGk7CisKK3B1YmxpYyBlbnVtIEFwcGxpY2F0aW9uRXJyb3JDb2Rlc0VudW0geworCisJUE9MNTAwMCwgLy8gSU5URVJOQUxfRVJST1IKKworCVNWQzQwMDAsIC8vIElOVkFMSURfSU5QVVQKKworCVNWQzQwMDIsIC8vIE1JU1NJTkdfSU5GT1JNQVRJT04KKwlTVkM0MDAzLCAvLyBSRVNPVVJDRV9OQU1FX0FMUkVBRFlfRVhJU1QKKwlTVkM0MDA0LCAvLyBNSVNTSU5HX0NBVEVHT1JZCisJU1ZDNDAwNSwgLy8gTUlTU0lOR19UQUdTCisJU1ZDNDAwNiwgLy8gTUlTU0lOR19ERVNDUklQVElPTgorCVNWQzQwMDcsIC8vIEJBRF9DQVRFR09SWQorCisJU1ZDNDAzMDsgLy8gUkVTVFJJQ1RFRF9BQ1RJT04KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9BcnRpZmFjdEdyb3VwVHlwZUVudW0uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9BcnRpZmFjdEdyb3VwVHlwZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk2OGRjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0FydGlmYWN0R3JvdXBUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGVudW0gQXJ0aWZhY3RHcm91cFR5cGVFbnVtIHsKKworCUlORk9STUFUSU9OQUwoIklORk9STUFUSU9OQUwiKSwgCisJREVQTE9ZTUVOVCgiREVQTE9ZTUVOVCIpLCAKKwlMSUZFX0NZQ0xFKCJMSUZFX0NZQ0xFIiksIAorCVNFUlZJQ0VfQVBJKCJTRVJWSUNFX0FQSSIpLCAKKwlUT1NDQSgiVE9TQ0EiKSwgCisJT1RIRVIoIk9USEVSIik7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCisJQXJ0aWZhY3RHcm91cFR5cGVFbnVtKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdEdyb3VwVHlwZUVudW0gZmluZFR5cGUoZmluYWwgU3RyaW5nIHR5cGUpIHsKKwkJZm9yIChBcnRpZmFjdEdyb3VwVHlwZUVudW0gYXRlIDogQXJ0aWZhY3RHcm91cFR5cGVFbnVtLnZhbHVlcygpKSB7CisJCQlpZiAoYXRlLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKKwkJCQlyZXR1cm4gYXRlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEFsbFR5cGVzKCkgeworCQlMaXN0PFN0cmluZz4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yIChBcnRpZmFjdEdyb3VwVHlwZUVudW0gYXRlIDogQXJ0aWZhY3RHcm91cFR5cGVFbnVtLnZhbHVlcygpKSB7CisJCQl0eXBlcy5hZGQoYXRlLmdldFR5cGUoKSk7CisJCX0KKwkJcmV0dXJuIHR5cGVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0FydGlmYWN0VHlwZUVudW0uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9BcnRpZmFjdFR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYmFkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9BcnRpZmFjdFR5cGVFbnVtLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEVudW0gVGhhdCBSZXByZXNlbnRzIHBvc3NpYmxlIEFydGlmYWN0cyBUeXBlcy4gCisgKgorICovCitwdWJsaWMgZW51bSBBcnRpZmFjdFR5cGVFbnVtIHsKKwlDSEVGKCJDSEVGIiksIFBVUFBFVCgiUFVQUEVUIiksIFlBTkcoIllBTkciKSwgU0hFTExfU0NSSVBUKCJTSEVMTF9TQ1JJUFQiKSwgSUNPTiggIklDT04iKSwgCisJVU5LTk9XTigiVU5LTk9XTiIpLCBIRUFUKCJIRUFUIiksIERHX1hNTCgiREdfWE1MIiksIE1VUkFOT19QS0coICJNVVJBTk9fUEtHIiksIEhFQVRfRU5WKCJIRUFUX0VOViIpLCAKKwlZQU5HX1hNTCgiWUFOR19YTUwiKSwgSEVBVF9WT0woIkhFQVRfVk9MIiksIEhFQVRfTkVUKCJIRUFUX05FVCIpLCBPVEhFUigiT1RIRVIiKSwgV09SS0ZMT1coIldPUktGTE9XIiksIAorCU5FVFdPUktfQ0FMTF9GTE9XKCJORVRXT1JLX0NBTExfRkxPVyIpLCBUT1NDQV9URU1QTEFURSgiVE9TQ0FfVEVNUExBVEUiKSwgVE9TQ0FfQ1NBUigiVE9TQ0FfQ1NBUiIpLAorCVZORl9DQVRBTE9HKCJWTkZfQ0FUQUxPRyIpLCBWRl9MSUNFTlNFKCJWRl9MSUNFTlNFIiksVkVORE9SX0xJQ0VOU0UoIlZFTkRPUl9MSUNFTlNFIiksCisJTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEUoIk1PREVMX0lOVkVOVE9SWV9QUk9GSUxFIiksIE1PREVMX1FVRVJZX1NQRUMoIk1PREVMX1FVRVJZX1NQRUMiKSwKKwlBUFBDX0NPTkZJRygiQVBQQ19DT05GSUciKSwgSEVBVF9ORVNURUQoIkhFQVRfTkVTVEVEIiksIEhFQVRfQVJUSUZBQ1QoIkhFQVRfQVJUSUZBQ1QiKSwgCisJVkZfTU9EVUxFU19NRVRBREFUQSgiVkZfTU9EVUxFU19NRVRBREFUQSIpLAorCS8vRENBRSBBcnRpZmFjdHMKKwlEQ0FFX1RPU0NBKCJEQ0FFX1RPU0NBIiksIERDQUVfSlNPTigiRENBRV9KU09OIiksIERDQUVfUE9MSUNZKCJEQ0FFX1BPTElDWSIpLCBEQ0FFX0RPQygiRENBRV9ET0MiKSwgCisJRENBRV9FVkVOVCgiRENBRV9FVkVOVCIpLCBEQ0FFX0lOVkVOVE9SWV9UT1NDQSgiRENBRV9JTlZFTlRPUllfVE9TQ0EiKSwgRENBRV9JTlZFTlRPUllfSlNPTigiRENBRV9JTlZFTlRPUllfSlNPTiIpLCAKKwlEQ0FFX0lOVkVOVE9SWV9QT0xJQ1koIkRDQUVfSU5WRU5UT1JZX1BPTElDWSIpLCBEQ0FFX0lOVkVOVE9SWV9ET0MoIkRDQUVfSU5WRU5UT1JZX0RPQyIpLCAKKwlEQ0FFX0lOVkVOVE9SWV9CTFVFUFJJTlQoIkRDQUVfSU5WRU5UT1JZX0JMVUVQUklOVCIpLCBEQ0FFX0lOVkVOVE9SWV9FVkVOVCgiRENBRV9JTlZFTlRPUllfRVZFTlQiKSwKKwkvL0FBSSBBcnRpZmFjdHMKKwlBQUlfU0VSVklDRV9NT0RFTCgiQUFJX1NFUlZJQ0VfTU9ERUwiKSwgQUFJX1ZGX01PREVMKCJBQUlfVkZfTU9ERUwiKSwgQUFJX1ZGX01PRFVMRV9NT0RFTCgiQUFJX1ZGX01PRFVMRV9NT0RFTCIpLAorCUFBSV9WRl9JTlNUQU5DRV9NT0RFTCgiQUFJX1ZGX0lOU1RBTkNFX01PREVMIikKKwkKKyAgIDsKKworCUFydGlmYWN0VHlwZUVudW0oU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIHN0YXRpYyBBcnRpZmFjdFR5cGVFbnVtIGZpbmRUeXBlKGZpbmFsIFN0cmluZyB0eXBlKSB7CisJCWZvciAoQXJ0aWZhY3RUeXBlRW51bSBhdGUgOiBBcnRpZmFjdFR5cGVFbnVtLnZhbHVlcygpKSB7CisJCQkvL0FjY29yZGluZyB0byBQYXZlbC9FbGxhCisJCQlpZiAoYXRlLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisJCQkJcmV0dXJuIGF0ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0QWxsVHlwZXMoKSB7CisJCUxpc3Q8U3RyaW5nPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlmb3IgKEFydGlmYWN0VHlwZUVudW0gYXRlIDogQXJ0aWZhY3RUeXBlRW51bS52YWx1ZXMoKSkgeworCQkJdHlwZXMuYWRkKGF0ZS5nZXRUeXBlKCkpOworCQl9CisJCXJldHVybiB0eXBlczsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvQmFzaWNDb25maWd1cmF0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvQmFzaWNDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1MmIyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9CYXNpY0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaTsKKworcHVibGljIGNsYXNzIEJhc2ljQ29uZmlndXJhdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9Db25maWd1cmF0aW9uTGlzdGVuZXIuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9Db25maWd1cmF0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBlZDZkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0NvbmZpZ3VyYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpOworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxpc3RlbmVyIHsKKworCXByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbj4gdHlwZTsKKwlwcml2YXRlIEZpbGVDaGFuZ2VDYWxsYmFjayBjYWxsQmFjazsKKworCXB1YmxpYyBDb25maWd1cmF0aW9uTGlzdGVuZXIoQ2xhc3M8PyBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbj4gdHlwZSwgRmlsZUNoYW5nZUNhbGxiYWNrIGNhbGxCYWNrKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuY2FsbEJhY2sgPSBjYWxsQmFjazsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbj4gZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShDbGFzczw/IGV4dGVuZHMgQmFzaWNDb25maWd1cmF0aW9uPiB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIEZpbGVDaGFuZ2VDYWxsYmFjayBnZXRDYWxsQmFjaygpIHsKKwkJcmV0dXJuIGNhbGxCYWNrOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhbGxCYWNrKEZpbGVDaGFuZ2VDYWxsYmFjayBjYWxsQmFjaykgeworCQl0aGlzLmNhbGxCYWNrID0gY2FsbEJhY2s7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvQ29uZmlndXJhdGlvblNvdXJjZS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0NvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTAxZDFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0NvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaTsKKworcHVibGljIGludGVyZmFjZSBDb25maWd1cmF0aW9uU291cmNlIHsKKworCXB1YmxpYyA8VD4gVCBnZXRBbmRXYXRjaENvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gY2xhc3NOYW1lLCBDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyKTsKKworCXB1YmxpYyA8VD4gdm9pZCBhZGRXYXRjaENvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gY2xhc3NOYW1lLCBDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9Db25zdGFudHMuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMwNjBjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaTsKKworcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTkFNRSA9ICJhcHBsaWNhdGlvbi1uYW1lIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9WRVJTSU9OID0gImFwcGxpY2F0aW9uLXZlcnNpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19IT01FID0gImNvbmZpZy5ob21lIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfSE9NRSA9ICJsb2cuaG9tZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUFNTF9TVUZGSVggPSAiLnlhbWwiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fU09VUkNFX0FUVFIgPSAiY29uZmlndXJhdGlvbi1zb3VyY2UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1EQ19BUFBfTkFNRSA9ICJBUFBfTkFNRSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9NQU5BR0VSX0FUVFIgPSAiY29uZmlndXJhdGlvbi1tYW5hZ2VyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFMVEhfQ0hFQ0tfU0VSVklDRV9BVFRSID0gImhlYWx0aENoZWNrU2VydmljZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVF9DTElFTlRfQVRUUiA9ICJyZXN0LWNsaWVudCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfREFPX0FUVFIgPSAiYXJ0aWZhY3QtZGFvIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUExPQURfVkFMSURBVE9SUl9BVFRSID0gInVwbG9hZC12YWxpZGF0b3IiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9FWEVDVVRPUl9BVFRSID0gInRocmVhZC1leGVjdXRvciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9HX0ZPUk1BVCA9ICJFVkVOVCA9IEFSVElGQUNUX1VQTE9BRCAgVVNFUl9JRD0lcyBVU0VSX05BTUU9JXMgQUNDRVNTX0lQPSVzIEFDQ0VTU19UWVBFPSVzIFJVUkw9JXMgU0M9JWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX05BTUVfSEVBREVSID0gIkhUVFBfQ1NQX0ZJUlNUTkFNRSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9OQU1FX0hFQURFUiA9ICJIVFRQX0NTUF9MQVNUTkFNRSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9JRF9IRUFERVIgPSAiVVNFUl9JRCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUQ1X0hFQURFUiA9ICJDb250ZW50LU1ENSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVNQT1NJVElPTl9IRUFERVIgPSAiQ29udGVudC1EaXNwb3NpdGlvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0hFQURFUiA9ICJDb250ZW50LVR5cGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTl9IRUFERVIgPSAiSFRUUF9JVl9SRU1PVEVfQUREUkVTUyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX0hFQURFUiA9ICJIVFRQX0NTUF9XU1RZUEUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhfRUNPTVBfUkVRVUVTVF9JRF9IRUFERVIgPSAiWC1FQ09NUC1SZXF1ZXN0SUQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhfRUNPTVBfSU5TVEFOQ0VfSURfSEVBREVSID0gIlgtRUNPTVAtSW5zdGFuY2VJRCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9FQ09NUF9TRVJWSUNFX0lEX0hFQURFUiA9ICJYLUVDT01QLVNlcnZpY2VJRCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUCA9ICJodHRwIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQUyA9ICJodHRwcyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9JVl9VU0VSID0gIkhUVFBfSVZfVVNFUiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQTRDX0NTQVJfQ09OVEVYVCA9ICIvcmVzdC9jc2Fycy8iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9BUFBMSUNBVElPTl9DT05URVhUX1dSQVBQRVJfQVRUUiA9ICJ3ZWItYXBwbGljYXRpb24tY29udGV4dC13cmFwcGVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0JFID0gImNhdGFsb2ctYmUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQ1NQX0ZJUlNUTkFNRSA9ICJIVFRQX0NTUF9GSVJTVE5BTUUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQ1NQX0xBU1ROQU1FID0gIkhUVFBfQ1NQX0xBU1ROQU1FIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0lWX1JFTU9URV9BRERSRVNTID0gIkhUVFBfSVZfUkVNT1RFX0FERFJFU1MiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQ1NQX1RZUEUgPSAiSFRUUF9DU1BfV1NUWVBFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9TVVBQT1JURURfVkVSU0lPTiA9ICIwLjAuMSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfSURfRk9STUFUID0gIiVzOiVzOiVzIjsgLy8gcmVzb3VyY2VOYW1lOnJlc291cmNlVmVyc2lvbjphcnRpZmFjdE5hbWUKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0FSVElGQUNUX0lEX0ZPUk1BVCA9ICIlczolczolczolcyI7IC8vIHNlcnZpY2VOYW1lOnNlcnZpY2VWZXJzaW9uOm5vZGVUZW1wbGF0ZU5hbWU6YXJ0aWZhY3ROYW1lCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVNQT1NJVElPTiA9ICJjb250ZW50LWRpc3Bvc2l0aW9uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9BUlRJRkFDVF9MT0dJQ19BVFRSID0gImRvd25sb2FkQXJ0aWZhY3RMb2dpYyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RDX1JFTEVBU0VfVkVSU0lPTl9BVFRSID0gIlNEQy1WZXJzaW9uIjsKKwkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVURJVElOR19NQU5BR0VSID0gImF1ZGl0aW5nTWFuYWdlciI7CisJLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9BRE1JTl9NQU5BR0VSID0gInVzZXJBZG1pbk1hbmFnZXIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFQVIgPSAieWVhciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OVEggPSAibW9udGgiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBWSA9ICJkYXkiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVVIgPSAiaG91ciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOVVRFID0gIm1pbnV0ZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJub25lIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9PUEVSQVRJT05fTUFOQUdFUiA9ICJyZXNvdXJjZU9wZXJhdGlvbk1hbmFnZXIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX09QRVJBVElPTl9NQU5BR0VSID0gInByb3BlcnR5T3BlcmF0aW9uTWFuYWdlciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9PUEVSQVRJT05fTUFOQUdFUiA9ICJzZXJ2aWNlT3BlcmF0aW9uTWFuYWdlciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9TVFJJTkcgPSAibnVsbCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX05VTExfU1RSSU5HID0gIm51bGwgbnVsbCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNPTVBfRVJST1JfTU5HUl9BVFRSID0gImVjb21wRXJyb3JNbmdyQXR0ciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVpBVElPTl9IRUFERVIgPSAiQXV0aG9yaXphdGlvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVBUX0hFQURFUiA9ICJBY2NlcHQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0lOVEVSRkFDRV9UWVBFID0gInN0YW5kYXJkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVVJBTk9fUEtHX0FSVElGQUNUX1RZUEUgPSAiTVVSQU5PLVBLRyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfR1JPVVBfVFlQRV9GSUVMRCA9ICJhcnRpZmFjdEdyb3VwVHlwZSI7CisKKwkvLyBUT1NDQQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPU0NBX01FVEFfUEFUSCA9ICJUT1NDQS1NZXRhZGF0YS9UT1NDQS5tZXRhIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1NDQV9NRVRBX0VOVFJZX0RFRklOSVRJT05TID0gIkVudHJ5LURlZmluaXRpb25zIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RFRklORURfUkVTT1VSQ0VfTkFNRVNQQUNFX1BSRUZJWCA9ICJvcmcub3BlbmVjb21wLnJlc291cmNlLiI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19CQVNFID0gImlzQmFzZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBVF9GSUxFX1BST1BTID0gImhlYXRfZmlsZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfRk9STUFUID0gIiVzLi4lcy4ubW9kdWxlLSVzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfREVTQ19QQVRURVJOID0gIltcXF9cXC1cXC5hLXpBLVowLTldKyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX09MRF9OQU1FX1BBVFRFUk4gPSAiKFtcXHdcXF9cXC1cXC5cXHNdKykoOjptb2R1bGUtKShcXGQrKSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05FV19OQU1FX1BBVFRFUk4gPSAiKFtcXHdcXF9cXC1cXC5cXHNdK1xcLlxcLikoW1xcX1xcLVxcLmEtekEtWjAtOV0rKSguLm1vZHVsZS0pKFxcZCspIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRV9ERUxJTUlURVIgPSAibW9kdWxlLSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1NUUlVDVFVSRSA9ICJpbXBvcnRTdHJ1Y3R1cmUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfR1JPVVBfVkZfTU9EVUxFID0gIm9yZy5vcGVuZWNvbXAuZ3JvdXBzLlZmTW9kdWxlIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0dST1VQX1RZUEUgPSAiYXJ0aWZhY3RHcm91cFR5cGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0xBQkVMID0gImFydGlmYWN0TGFiZWwiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1BBWUxPQURfREFUQSA9ICJwYXlsb2FkRGF0YSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfRElTUExBWV9OQU1FID0gImFydGlmYWN0RGlzcGxheU5hbWUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9UWVBFID0gImFydGlmYWN0VHlwZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfTkFNRSA9ICJhcnRpZmFjdE5hbWUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0lEID0gInVuaXF1ZUlkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9BUlRJRkFDVFMgPSAicmVxdWlyZWRBcnRpZmFjdHMiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1QgPSAiYWJzdHJhY3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9TVUJTVElUVVRJT05fVFlQRV9TRVJWSUNFX1RFTVBMQVRFID0gIkRlZmluaXRpb25zL0dsb2JhbFN1YnN0aXR1dGlvblR5cGVzU2VydmljZVRlbXBsYXRlLnlhbWwiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX0xJQ0VOU0VfTU9ERUwgPSAidmVuZG9yLWxpY2Vuc2UtbW9kZWwueG1sIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfTElDRU5TRV9MQUJFTCA9ICJ2ZW5kb3JsaWNlbnNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfTElDRU5TRV9ESVNQTEFZX05BTUUgPSAiVmVuZG9yIExpY2Vuc2UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9MSUNFTlNFX0RFU0NSSVBUSU9OID0gIiBWZW5kb3IgbGljZW5zZSBmaWxlIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZGX0xJQ0VOU0VfTU9ERUwgPSAidmYtbGljZW5zZS1tb2RlbC54bWwiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZGX0xJQ0VOU0VfTEFCRUwgPSAidmZsaWNlbnNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRl9MSUNFTlNFX0RJU1BMQVlfTkFNRSA9ICJWRiBMaWNlbnNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRl9MSUNFTlNFX0RFU0NSSVBUSU9OID0gIlZGIGxpY2Vuc2UgZmlsZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RTID0gIkFydGlmYWN0cy8iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9JTlBVVCA9ICJnZXRfaW5wdXQiOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0ZpbGVDaGFuZ2VDYWxsYmFjay5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL0ZpbGVDaGFuZ2VDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNGQzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvRmlsZUNoYW5nZUNhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGk7CisKK3B1YmxpYyBpbnRlcmZhY2UgRmlsZUNoYW5nZUNhbGxiYWNrIHsKKworCXB1YmxpYyB2b2lkIHJlY29uZmlndXJlKEJhc2ljQ29uZmlndXJhdGlvbiBvYmopOworCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvSGVhbHRoQ2hlY2tJbmZvLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvSGVhbHRoQ2hlY2tJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzYjhiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9IZWFsdGhDaGVja0luZm8uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaTsKKworcHVibGljIGNsYXNzIEhlYWx0aENoZWNrSW5mbyB7CisKKwlwcml2YXRlIEhlYWx0aENoZWNrQ29tcG9uZW50IGhlYWx0aENoZWNrQ29tcG9uZW50OworCXByaXZhdGUgSGVhbHRoQ2hlY2tTdGF0dXMgaGVhbHRoQ2hlY2tTdGF0dXM7CisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXB1YmxpYyBIZWFsdGhDaGVja0luZm8oSGVhbHRoQ2hlY2tDb21wb25lbnQgaGVhbHRoQ2hlY2tDb21wb25lbnQsIEhlYWx0aENoZWNrU3RhdHVzIGhlYWx0aENoZWNrU3RhdHVzLAorCQkJU3RyaW5nIHZlcnNpb24sIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlzdXBlcigpOworCQl0aGlzLmhlYWx0aENoZWNrQ29tcG9uZW50ID0gaGVhbHRoQ2hlY2tDb21wb25lbnQ7CisJCXRoaXMuaGVhbHRoQ2hlY2tTdGF0dXMgPSBoZWFsdGhDaGVja1N0YXR1czsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBIZWFsdGhDaGVja0luZm8oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEhlYWx0aENoZWNrQ29tcG9uZW50IGdldEhlYWx0aENoZWNrQ29tcG9uZW50KCkgeworCQlyZXR1cm4gaGVhbHRoQ2hlY2tDb21wb25lbnQ7CisJfQorCisJcHVibGljIEhlYWx0aENoZWNrU3RhdHVzIGdldEhlYWx0aENoZWNrU3RhdHVzKCkgeworCQlyZXR1cm4gaGVhbHRoQ2hlY2tTdGF0dXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBlbnVtIEhlYWx0aENoZWNrQ29tcG9uZW50IHsKKwkJRkUsIEJFLCBUSVRBTiwgRVMsIERFOworCX0KKworCXB1YmxpYyBlbnVtIEhlYWx0aENoZWNrU3RhdHVzIHsKKwkJVVAsIERPV04sIFVOS05PV047CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJIZWFsdGhDaGVja0luZm8gW2hlYWx0aENoZWNrQ29tcG9uZW50PSIgKyBoZWFsdGhDaGVja0NvbXBvbmVudCArICIsIGhlYWx0aENoZWNrU3RhdHVzPSIKKwkJCQkrIGhlYWx0aENoZWNrU3RhdHVzICsgIiwgdmVyc2lvbj0iICsgdmVyc2lvbiArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvSGVhbHRoQ2hlY2tXcmFwcGVyLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvSGVhbHRoQ2hlY2tXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNjM1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9IZWFsdGhDaGVja1dyYXBwZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgSGVhbHRoQ2hlY2tXcmFwcGVyIHsKKworCVN0cmluZyBzZGNWZXJzaW9uOworCVN0cmluZyBzaXRlTW9kZTsKKwlMaXN0PEhlYWx0aENoZWNrSW5mbz4gY29tcG9uZW50c0luZm87CisKKwlwdWJsaWMgSGVhbHRoQ2hlY2tXcmFwcGVyKExpc3Q8SGVhbHRoQ2hlY2tJbmZvPiBjb21wb25lbnRzSW5mbywgU3RyaW5nIHNkY1ZlcnNpb24sIFN0cmluZyBzaXRlTW9kZSkgeworCQlzdXBlcigpOworCQl0aGlzLmNvbXBvbmVudHNJbmZvID0gY29tcG9uZW50c0luZm87CisJCXRoaXMuc2RjVmVyc2lvbiA9IHNkY1ZlcnNpb247CisJCXRoaXMuc2l0ZU1vZGUgPSBzaXRlTW9kZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxIZWFsdGhDaGVja0luZm8+IGdldENvbXBvbmVudHNJbmZvKCkgeworCQlyZXR1cm4gY29tcG9uZW50c0luZm87CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29tcG9uZW50c0luZm8oTGlzdDxIZWFsdGhDaGVja0luZm8+IGNvbXBvbmVudHNJbmZvKSB7CisJCXRoaXMuY29tcG9uZW50c0luZm8gPSBjb21wb25lbnRzSW5mbzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNkY1ZlcnNpb24oKSB7CisJCXJldHVybiBzZGNWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNkY1ZlcnNpb24oU3RyaW5nIHNkY1ZlcnNpb24pIHsKKwkJdGhpcy5zZGNWZXJzaW9uID0gc2RjVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNpdGVNb2RlKCkgeworCQlyZXR1cm4gc2l0ZU1vZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2l0ZU1vZGUoU3RyaW5nIHNpdGVNb2RlKSB7CisJCXRoaXMuc2l0ZU1vZGUgPSBzaXRlTW9kZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9SZXNvdXJjZVR5cGUuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9SZXNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTNmZWQyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1Jlc291cmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpOworCitwdWJsaWMgZW51bSBSZXNvdXJjZVR5cGUgeworCVJFU09VUkNFLCBTRVJWSUNFCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvUmVzcG9uc2VJbmZvLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvUmVzcG9uc2VJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3ZDVkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9SZXNwb25zZUluZm8uamF2YQpAQCAtMCwwICsxLDg0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaTsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLkpzb25Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CisKK3B1YmxpYyBjbGFzcyBSZXNwb25zZUluZm8geworCisJcHVibGljIHN0YXRpYyBlbnVtIFJlc3BvbnNlU3RhdHVzRW51bSB7CisJCVNVQ0NFU1MoInN1Y2Nlc3MiKSwgCisJCUxPR0lOX0ZBSUxFRCgibG9naW5GYWlsZWQiKSwgCisJCUlOVEVSTkFMX0VSUk9SKCJpbnRlcm5hbEVycm9yIiksIAorCQlNSVNTSU5HX0hFQURFUlMoInJlcXVpcmVkIGhlYWRlcnMgYXJlIG1pc3NpbmciKSwgCisJCVRJTUVPVVQoInRpbWVvdXQiKSwgCisJCVBBUlNJTkdfRVJST1IoInBhcnNpbmdGYWlsZWQiKTsKKworCQlSZXNwb25zZVN0YXR1c0VudW0oU3RyaW5nIHN0YXR1cykgeworCQkJdGhpcy5zdGF0dXNEZXNjcmlwdGlvbiA9IHN0YXR1czsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgc3RhdHVzRGVzY3JpcHRpb247CisJfQorCisJcHJpdmF0ZSBSZXNwb25zZVN0YXR1c0VudW0gYXBwbGljYXRpdmVTdGF0dXM7CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwdWJsaWMgUmVzcG9uc2VJbmZvKFJlc3BvbnNlU3RhdHVzRW51bSBhcHBsaWNhdGl2ZVN0YXR1cywgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuYXBwbGljYXRpdmVTdGF0dXMgPSBhcHBsaWNhdGl2ZVN0YXR1czsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBSZXNwb25zZUluZm8oUmVzcG9uc2VTdGF0dXNFbnVtIGFwcGxpY2F0aXZlU3RhdHVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuYXBwbGljYXRpdmVTdGF0dXMgPSBhcHBsaWNhdGl2ZVN0YXR1czsKKwl9CisKKwlwdWJsaWMgUmVzcG9uc2VTdGF0dXNFbnVtIGdldEFwcGxpY2F0aXZlU3RhdHVzKCkgeworCQlyZXR1cm4gYXBwbGljYXRpdmVTdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXBwbGljYXRpdmVTdGF0dXMoUmVzcG9uc2VTdGF0dXNFbnVtIGFwcGxpY2F0aXZlU3RhdHVzKSB7CisJCXRoaXMuYXBwbGljYXRpdmVTdGF0dXMgPSBhcHBsaWNhdGl2ZVN0YXR1czsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQlTdHJpbmcgdG9zdHJpbmcgPSBzdXBlci50b1N0cmluZygpOworCQl0cnkgeworCQkJdG9zdHJpbmcgPSBtYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKHRoaXMpOworCQl9IGNhdGNoIChKc29uUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisKKwkJfQorCQlyZXR1cm4gdG9zdHJpbmc7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1Rvc2NhTm9kZVR5cGVJbmZvLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvVG9zY2FOb2RlVHlwZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjYwODk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1Rvc2NhTm9kZVR5cGVJbmZvLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFRvc2NhTm9kZVR5cGVJbmZvIHsKKworCXByaXZhdGUgU3RyaW5nIG5vZGVOYW1lOworCXByaXZhdGUgU3RyaW5nIHRlbXBsYXRlVmVyc2lvbjsKKwlwcml2YXRlIExpc3Q8VG9zY2FOb2RlVHlwZUludGVyZmFjZT4gaW50ZXJmYWNlczsKKwlwcml2YXRlIFN0cmluZyBpY29uUGF0aDsKKwlwcml2YXRlIFN0cmluZyB0ZW1wbGF0ZU5hbWU7CisKKwlwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlTmFtZSgpIHsKKwkJcmV0dXJuIHRlbXBsYXRlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUZW1wbGF0ZU5hbWUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgeworCQl0aGlzLnRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgeworCQlyZXR1cm4gbm9kZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIG5vZGVOYW1lKSB7CisJCXRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlVmVyc2lvbigpIHsKKwkJcmV0dXJuIHRlbXBsYXRlVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUZW1wbGF0ZVZlcnNpb24oU3RyaW5nIHRlbXBsYXRlVmVyc2lvbikgeworCQl0aGlzLnRlbXBsYXRlVmVyc2lvbiA9IHRlbXBsYXRlVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgTGlzdDxUb3NjYU5vZGVUeXBlSW50ZXJmYWNlPiBnZXRJbnRlcmZhY2VzKCkgeworCQlyZXR1cm4gaW50ZXJmYWNlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2VzKExpc3Q8VG9zY2FOb2RlVHlwZUludGVyZmFjZT4gaW50ZXJmYWNlcykgeworCQl0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWNvblBhdGgoKSB7CisJCXJldHVybiBpY29uUGF0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJY29uUGF0aChTdHJpbmcgaWNvblBhdGgpIHsKKwkJdGhpcy5pY29uUGF0aCA9IGljb25QYXRoOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVG9zY2FOb2RlVHlwZUluZm8gW25vZGVOYW1lPSIgKyBub2RlTmFtZSArICIsIHRlbXBsYXRlVmVyc2lvbj0iICsgdGVtcGxhdGVWZXJzaW9uICsgIiwgdGVtcGxhdGVOYW1lPSIKKwkJCQkrIHRlbXBsYXRlTmFtZSArICIsIGludGVyZmFjZXM9IiArIGludGVyZmFjZXMgKyAiLCBpY29uUGF0aD0iICsgaWNvblBhdGggKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvVG9zY2FOb2RlVHlwZUludGVyZmFjZS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1Rvc2NhTm9kZVR5cGVJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDk1NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1Rvc2NhTm9kZVR5cGVJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVG9zY2FOb2RlVHlwZUludGVyZmFjZSB7CisKKwlMaXN0PFN0cmluZz4gc2NyaXB0czsKKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U2NyaXB0cygpIHsKKwkJcmV0dXJuIHNjcmlwdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2NyaXB0cyhMaXN0PFN0cmluZz4gc2NyaXB0cykgeworCQl0aGlzLnNjcmlwdHMgPSBzY3JpcHRzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1VwbG9hZEFydGlmYWN0SW5mby5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1VwbG9hZEFydGlmYWN0SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTczNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvVXBsb2FkQXJ0aWZhY3RJbmZvLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpOworCitwdWJsaWMgY2xhc3MgVXBsb2FkQXJ0aWZhY3RJbmZvIHsKKworCXB1YmxpYyBVcGxvYWRBcnRpZmFjdEluZm8oKSB7CisKKwl9CisKKwlwdWJsaWMgVXBsb2FkQXJ0aWZhY3RJbmZvKFN0cmluZyBhcnRpZmFjdE5hbWUsIFN0cmluZyBhcnRpZmFjdFBhdGgsIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlLAorCQkJU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb24pIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJCXRoaXMuYXJ0aWZhY3RQYXRoID0gYXJ0aWZhY3RQYXRoOworCQl0aGlzLmFydGlmYWN0VHlwZSA9IGFydGlmYWN0VHlwZTsKKwkJdGhpcy5hcnRpZmFjdERlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgVXBsb2FkQXJ0aWZhY3RJbmZvKFN0cmluZyBhcnRpZmFjdE5hbWUsIFN0cmluZyBhcnRpZmFjdFBhdGgsIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlLAorCQkJU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb24sIFN0cmluZyBhcnRpZmFjdERhdGEpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJCXRoaXMuYXJ0aWZhY3RQYXRoID0gYXJ0aWZhY3RQYXRoOworCQl0aGlzLmFydGlmYWN0VHlwZSA9IGFydGlmYWN0VHlwZTsKKwkJdGhpcy5hcnRpZmFjdERlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwkJdGhpcy5hcnRpZmFjdERhdGEgPSBhcnRpZmFjdERhdGE7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3ROYW1lOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0UGF0aDsKKwlwcml2YXRlIEFydGlmYWN0VHlwZUVudW0gYXJ0aWZhY3RUeXBlOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb247CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3REYXRhOworCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdE5hbWUoKSB7CisJCXJldHVybiBhcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3ROYW1lKFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKKwkJdGhpcy5hcnRpZmFjdE5hbWUgPSBhcnRpZmFjdE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdFBhdGgoKSB7CisJCXJldHVybiBhcnRpZmFjdFBhdGg7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RQYXRoKFN0cmluZyBhcnRpZmFjdFBhdGgpIHsKKwkJdGhpcy5hcnRpZmFjdFBhdGggPSBhcnRpZmFjdFBhdGg7CisJfQorCisJcHVibGljIEFydGlmYWN0VHlwZUVudW0gZ2V0QXJ0aWZhY3RUeXBlKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSkgeworCQl0aGlzLmFydGlmYWN0VHlwZSA9IGFydGlmYWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RGVzY3JpcHRpb24oU3RyaW5nIGFydGlmYWN0RGVzY3JpcHRpb24pIHsKKwkJdGhpcy5hcnRpZmFjdERlc2NyaXB0aW9uID0gYXJ0aWZhY3REZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0RGF0YSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0RGF0YTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdERhdGEoU3RyaW5nIGFydGlmYWN0RGF0YSkgeworCQl0aGlzLmFydGlmYWN0RGF0YSA9IGFydGlmYWN0RGF0YTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdERhdGEgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3REYXRhLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoYXJ0aWZhY3REZXNjcmlwdGlvbiA9PSBudWxsKSA/IDAgOiBhcnRpZmFjdERlc2NyaXB0aW9uLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoYXJ0aWZhY3ROYW1lID09IG51bGwpID8gMCA6IGFydGlmYWN0TmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGFydGlmYWN0UGF0aCA9PSBudWxsKSA/IDAgOiBhcnRpZmFjdFBhdGguaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdFR5cGUgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RUeXBlLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlVcGxvYWRBcnRpZmFjdEluZm8gb3RoZXIgPSAoVXBsb2FkQXJ0aWZhY3RJbmZvKSBvYmo7CisJCWlmIChhcnRpZmFjdERhdGEgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmFydGlmYWN0RGF0YSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghYXJ0aWZhY3REYXRhLmVxdWFscyhvdGhlci5hcnRpZmFjdERhdGEpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXJ0aWZhY3REZXNjcmlwdGlvbiA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuYXJ0aWZhY3REZXNjcmlwdGlvbiAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghYXJ0aWZhY3REZXNjcmlwdGlvbi5lcXVhbHMob3RoZXIuYXJ0aWZhY3REZXNjcmlwdGlvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhcnRpZmFjdE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmFydGlmYWN0TmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghYXJ0aWZhY3ROYW1lLmVxdWFscyhvdGhlci5hcnRpZmFjdE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXJ0aWZhY3RQYXRoID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5hcnRpZmFjdFBhdGggIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWFydGlmYWN0UGF0aC5lcXVhbHMob3RoZXIuYXJ0aWZhY3RQYXRoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGFydGlmYWN0VHlwZSAhPSBvdGhlci5hcnRpZmFjdFR5cGUpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiVXBsb2FkQXJ0aWZhY3RJbmZvIFthcnRpZmFjdE5hbWU9IiArIGFydGlmYWN0TmFtZSArICIsIGFydGlmYWN0UGF0aD0iICsgYXJ0aWZhY3RQYXRoICsgIiwgYXJ0aWZhY3RUeXBlPSIKKwkJCQkrIGFydGlmYWN0VHlwZSArICIsIGFydGlmYWN0RGVzY3JpcHRpb249IiArIGFydGlmYWN0RGVzY3JpcHRpb24gKyAiLCBhcnRpZmFjdERhdGE9IiArIGFydGlmYWN0RGF0YQorCQkJCSsgIl0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1VzZXJSb2xlRW51bS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1VzZXJSb2xlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzMzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvVXNlclJvbGVFbnVtLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGk7CisKK3B1YmxpYyBlbnVtIFVzZXJSb2xlRW51bSB7CisJQURNSU4oIkFETUlOIiksIAorCURFU0lHTkVSKCJERVNJR05FUiIpLCAKKwlURVNURVIoIlRFU1RFUiIpLCAKKwlHT1ZFUk5PUigiR09WRVJOT1IiKSwgCisJT1BTKCJPUFMiKSwgCisJUFJPRFVDVF9NQU5BR0VSKCJQUk9EVUNUX01BTkFHRVIiKSwgCisJUFJPRFVDVF9TVFJBVEVHSVNUKCJQUk9EVUNUX1NUUkFURUdJU1QiKTsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlVc2VyUm9sZUVudW0oU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9ZYW1sQ29uc3RhbnRzLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvWWFtbENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWRlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9hcGkvWWFtbENvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpOworCitwdWJsaWMgaW50ZXJmYWNlIFlhbWxDb25zdGFudHMgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9UWVBFUyA9ICJub2RlX3R5cGVzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUkZBQ0VTID0gImludGVyZmFjZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1ZFUlNJT04gPSAidGVtcGxhdGVfdmVyc2lvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfTkFNRSA9ICJ0ZW1wbGF0ZV9uYW1lIjsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9ZYW1sU3VmZml4RW51bS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vYXBpL1lhbWxTdWZmaXhFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjNjI5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2FwaS9ZYW1sU3VmZml4RW51bS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGVudW0gWWFtbFN1ZmZpeEVudW0geworCisJWUFNTCgiWUFNTCIpLAorCisJeWFtbCgieWFtbCIpLAorCisJWU1MKCJZTUwiKSwKKworCXltbCgieW1sIik7CisKKwlZYW1sU3VmZml4RW51bShTdHJpbmcgc3VmZml4KSB7CisJCXRoaXMuc3VmZml4ID0gc3VmZml4OworCX0KKworCXByaXZhdGUgU3RyaW5nIHN1ZmZpeDsKKworCXB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgeworCQlyZXR1cm4gc3VmZml4OworCX0KKworCXB1YmxpYyB2b2lkIHNldFN1dWZpeChTdHJpbmcgc3VmZml4KSB7CisJCXRoaXMuc3VmZml4ID0gc3VmZml4OworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFN1ZmZpeGVzKCkgeworCisJCUxpc3Q8U3RyaW5nPiBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQlmb3IgKFlhbWxTdWZmaXhFbnVtIHlhbWxTdWZmaXhFbnVtIDogWWFtbFN1ZmZpeEVudW0udmFsdWVzKCkpIHsKKwkJCWFycmF5TGlzdC5hZGQoeWFtbFN1ZmZpeEVudW0uZ2V0U3VmZml4KCkpOworCQl9CisKKwkJcmV0dXJuIGFycmF5TGlzdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvQWJzRWNvbXBFcnJvck1hbmFnZXIuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9BYnNFY29tcEVycm9yTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTQwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvQWJzRWNvbXBFcnJvck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yQ29uZmlndXJhdGlvbi5FY29tcEFsYXJtU2V2ZXJpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yQ29uZmlndXJhdGlvbi5FY29tcEVycm9yU2V2ZXJpdHk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yQ29uZmlndXJhdGlvbi5FY29tcEVycm9yVHlwZTsKKworaW1wb3J0IGNvbS5qY2FiaS5hc3BlY3RzLkxvZ2dhYmxlOworCitATG9nZ2FibGUocHJlcGVuZCA9IHRydWUsIHZhbHVlID0gTG9nZ2FibGUuVFJBQ0UsIHRyaW0gPSBmYWxzZSkKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnNFY29tcEVycm9yTWFuYWdlciBpbXBsZW1lbnRzIElFY29tcEVycm9yTWFuYWdlciB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TVFIgPSAiJXMiOworCisJcHVibGljIGFic3RyYWN0IElFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7CisKKwlARGVwcmVjYXRlZAorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb2Nlc3NFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lIGVjb21wRXJyb3JOYW1lLCBTdHJpbmcgZWNvbXBFcnJvckNvbnRleHQsCisJCQlTdHJpbmcuLi4gZGVzY3JpcHRpb25QYXJhbXMpIHsKKworCQkvKgorCQkgKiAvL0dldHRpbmcgdGhlIHJlbGV2YW50IGNvbmZpZyBtYW5hZ2VyIElFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyCisJCSAqIGNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKKwkJICogCisJCSAqIC8vR2V0dGluZyB0aGUgZXJyb3IgYnkgbmFtZSBFY29tcEVycm9ySW5mbyBlY29tcEVycm9ySW5mbyA9CisJCSAqIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldEVjb21wRXJyb3JDb25maWd1cmF0aW9uKCkuZ2V0RWNvbXBFcnJvckluZm8oCisJCSAqIGVjb21wRXJyb3JOYW1lLm5hbWUoKSk7CisJCSAqIAorCQkgKiBpZiAoZWNvbXBFcnJvckluZm8gIT0gbnVsbCl7IGVjb21wRXJyb3JJbmZvID0KKwkJICogc2V0RGVzY3JpcHRpb25QYXJhbXMoZWNvbXBFcnJvckluZm8sIGVjb21wRXJyb3JOYW1lLm5hbWUoKSwKKwkJICogZGVzY3JpcHRpb25QYXJhbXMpOyBFY29tcEVycm9yTG9nVXRpbC5sb2dFY29tcEVycm9yKGVjb21wRXJyb3JOYW1lLAorCQkgKiBlY29tcEVycm9ySW5mbywgZWNvbXBFcnJvckNvbnRleHQpOyB9IGVsc2UgeworCQkgKiBFY29tcEVycm9yTG9nVXRpbC5sb2dFY29tcEVycm9yKEVjb21wRXJyb3JOYW1lLkVjb21wRXJyb3JOb3RGb3VuZCwKKwkJICogZ2V0RXJyb3JJbmZvRm9yVW5rbm93bkVycm9yTmFtZShlY29tcEVycm9yTmFtZS5uYW1lKCkpLAorCQkgKiBlY29tcEVycm9yQ29udGV4dCk7IH0KKwkJICovCisKKwl9CisKKwlwcml2YXRlIEVjb21wRXJyb3JJbmZvIHNldERlc2NyaXB0aW9uUGFyYW1zKEVjb21wRXJyb3JJbmZvIGVjb21wRXJyb3JJbmZvLCBTdHJpbmcgZWNvbXBFcnJvck5hbWUsCisJCQlTdHJpbmcuLi4gZGVzY3JpcHRpb25QYXJhbXMpIHsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZWNvbXBFcnJvckluZm8uZ2V0RGVzY3JpcHRpb24oKTsKKwkJLy8gQ291bnRpbmcgbnVtYmVyIG9mIHBhcmFtcyBpbiBkZXNjcmlwdGlvbgorCQlpbnQgY291bnRNYXRjaGVzID0gU3RyaW5nVXRpbHMuY291bnRNYXRjaGVzKGRlc2NyaXB0aW9uLCBQQVJBTV9TVFIpOworCQkvLyBDYXRjaGluZyBjYXNlcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHBhcmFtcyBwYXNzZWQgdGhhbiB0aGVyZSBhcmUgaW4KKwkJLy8gdGhlIGRlc2NyaXB0aW9uIChmb3JtYXR0ZXIgd2lsbCBpZ25vcmUgZXh0cmEgcGFyYW1zIGFuZCB3b24ndCB0aHJvdworCQkvLyBleGNlcHRpb24pCisJCWlmIChjb3VudE1hdGNoZXMgIT0gZGVzY3JpcHRpb25QYXJhbXMubGVuZ3RoKSB7CisJCQlyZXR1cm4gZ2V0RXJyb3JJbmZvRm9yRGVzY3JpcHRpb25QYXJhbXNNaXNtYXRjaChlY29tcEVycm9yTmFtZSk7CisJCX0KKwkJLy8gU2V0dGluZyBwYXJhbXMgb2YgdGhlIGRlc2NyaXB0aW9uIGlmIGFueQorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoc2IsIExvY2FsZS5VUyk7CisJCXRyeSB7CisJCQlmb3JtYXR0ZXIuZm9ybWF0KGRlc2NyaXB0aW9uLCAoT2JqZWN0W10pIGRlc2NyaXB0aW9uUGFyYW1zKS50b1N0cmluZygpOworCQkJZWNvbXBFcnJvckluZm8uc2V0RGVzY3JpcHRpb24oZm9ybWF0dGVyLnRvU3RyaW5nKCkpOworCQl9IGNhdGNoIChJbGxlZ2FsRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCS8vIE51bWJlciBvZiBwYXNzZWQgcGFyYW1zIGRvZXNuJ3QgbWF0Y2ggbnVtYmVyIG9mIHBhcmFtcyBpbiBjb25maWcKKwkJCS8vIGZpbGUKKwkJCXJldHVybiBnZXRFcnJvckluZm9Gb3JEZXNjcmlwdGlvblBhcmFtc01pc21hdGNoKGVjb21wRXJyb3JOYW1lKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWZvcm1hdHRlci5jbG9zZSgpOworCQl9CisJCXJldHVybiBlY29tcEVycm9ySW5mbzsKKwl9CisKKwlwcml2YXRlIEVjb21wRXJyb3JJbmZvIGdldEVycm9ySW5mb0ZvclVua25vd25FcnJvck5hbWUoU3RyaW5nIGVjb21wRXJyb3JOYW1lKSB7CisJCUVjb21wRXJyb3JJbmZvIGVjb21wRXJyb3JJbmZvID0gbmV3IEVjb21wRXJyb3JJbmZvKCk7CisJCWVjb21wRXJyb3JJbmZvLnNldENvZGUoRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uRUNPREVfUFJFRklYICsgIjMwMDEiKTsKKwkJZWNvbXBFcnJvckluZm8uc2V0VHlwZShFY29tcEVycm9yVHlwZS5DT05GSUdfRVJST1IubmFtZSgpKTsKKwkJZWNvbXBFcnJvckluZm8uc2V0U2V2ZXJpdHkoRWNvbXBFcnJvclNldmVyaXR5LkVSUk9SLm5hbWUoKSk7CisJCWVjb21wRXJyb3JJbmZvLnNldEFsYXJtU2V2ZXJpdHkoRWNvbXBBbGFybVNldmVyaXR5Lk1BSk9SLm5hbWUoKSk7CisJCWVjb21wRXJyb3JJbmZvLnNldERlc2NyaXB0aW9uKG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKCJFY29tcCBlcnJvciBlbGVtZW50ICBub3QgZm91bmQgaW4gWUFNTCwgbmFtZTogIikKKwkJCQkuYXBwZW5kKGVjb21wRXJyb3JOYW1lKS50b1N0cmluZygpKTsKKwkJcmV0dXJuIGVjb21wRXJyb3JJbmZvOworCX0KKworCXByaXZhdGUgRWNvbXBFcnJvckluZm8gZ2V0RXJyb3JJbmZvRm9yRGVzY3JpcHRpb25QYXJhbXNNaXNtYXRjaChTdHJpbmcgZWNvbXBFcnJvck5hbWUpIHsKKwkJRWNvbXBFcnJvckluZm8gZWNvbXBFcnJvckluZm8gPSBuZXcgRWNvbXBFcnJvckluZm8oKTsKKwkJZWNvbXBFcnJvckluZm8uc2V0Q29kZShFY29tcEVycm9yQ29uZmlndXJhdGlvbi5FQ09ERV9QUkVGSVggKyAiMzAwMiIpOworCQllY29tcEVycm9ySW5mby5zZXRUeXBlKEVjb21wRXJyb3JUeXBlLkNPTkZJR19FUlJPUi5uYW1lKCkpOworCQllY29tcEVycm9ySW5mby5zZXRTZXZlcml0eShFY29tcEVycm9yU2V2ZXJpdHkuRVJST1IubmFtZSgpKTsKKwkJZWNvbXBFcnJvckluZm8uc2V0QWxhcm1TZXZlcml0eShFY29tcEFsYXJtU2V2ZXJpdHkuTUFKT1IubmFtZSgpKTsKKwkJZWNvbXBFcnJvckluZm8uc2V0RGVzY3JpcHRpb24obmV3IFN0cmluZ0J1aWxkZXIoKQorCQkJCS5hcHBlbmQoIkVjb21wIGVycm9yIGRlc2NyaXB0aW9uIHBhcmFtcyBtaXNtYXRjaCBiZXR3ZWVuIGNvZGUgYW5kIFlBTUwgb3Igd3JvbmcgZm9ybWF0LCBuYW1lOiAiKQorCQkJCS5hcHBlbmQoZWNvbXBFcnJvck5hbWUpLnRvU3RyaW5nKCkpOworCQlyZXR1cm4gZWNvbXBFcnJvckluZm87CisJfQorCisJcHVibGljIHZvaWQgcHJvY2Vzc0Vjb21wRXJyb3IoU3RyaW5nIGNvbnRleHQsIEVjb21wRXJyb3JFbnVtIGVjb21wRXJyb3JFbnVtLCBTdHJpbmcuLi4gZGVzY3JpcHRpb25QYXJhbXMpIHsKKworCQlFY29tcEVycm9yTG9nVXRpbC5sb2dFY29tcEVycm9yKGNvbnRleHQsIGVjb21wRXJyb3JFbnVtLCBkZXNjcmlwdGlvblBhcmFtcyk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcENsYXNzaWZpY2F0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvRWNvbXBDbGFzc2lmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDk5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvRWNvbXBDbGFzc2lmaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnOworCitwdWJsaWMgZW51bSBFY29tcENsYXNzaWZpY2F0aW9uIHsKKworCUlORk9STUFUSU9OKCJJIiksIFdBUk5JTkcoIlciKSwgRVJST1IoIkUiKSwgRkFUQUwoIkYiKTsKKworCVN0cmluZyBjbGFzc2lmaWNhdGlvbjsKKworCUVjb21wQ2xhc3NpZmljYXRpb24oU3RyaW5nIGNsYXNzaWZpY2F0aW9uKSB7CisJCXRoaXMuY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENsYXNzaWZpY2F0aW9uKCkgeworCQlyZXR1cm4gY2xhc3NpZmljYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2xhc3NpZmljYXRpb24oU3RyaW5nIGNsYXNzaWZpY2F0aW9uKSB7CisJCXRoaXMuY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcEVycm9yQ29kZS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0Vjb21wRXJyb3JDb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0NWQzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcEVycm9yQ29kZS5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZzsKKworcHVibGljIGVudW0gRWNvbXBFcnJvckNvZGUgeworCisJRV8xMDAoIkF1dGhlbnRpY2F0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gUmVhc29uOiAlcyIsCisJCQkiQW4gQXV0aGVudGljYXRpb24gZmFpbHVyZSBvY2N1cmVkIGR1cmluZyBhY2Nlc3MgdG8gVUVCIHNlcnZlci4gUGxlYXNlIGNoZWNrIHRoYXQgVUVCIGtleXMgYXJlIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGluIEFTREMgQkUgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24uIiksIEVfMTk5KAorCQkJCQkiSW50ZXJuYWwgYXV0aGVudGljYXRpb24gcHJvYmxlbS4gRGVzY3JpcHRpb246ICVzIiksCisKKwlFXzIwMCgiQVNEQyBCYWNrZW5kIHByb2JhYmx5IGxvc3QgY29ubmVjdGl2aXR5IHRvIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiBUaXRhbiBEQiwgRWxhc3RpY3NlYXJjaCwgVUVCIENsdXN0ZXIuIFBsZWFzZSBjaGVjayB0aGUgbG9ncyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKSwgRV8yMDEoCisJCQkiQVNEQyBCYWNrZW5kIHByb2JhYmx5IGxvc3QgY29ubmVjdGl2aXR5IHRvIFRpdGFuIERCLiBQbGVhc2UgY2hlY2sgdGhlIGxvZ3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiksIEVfMjAyKAorCQkJCQkiQVNEQyBCYWNrZW5kIHByb2JhYmx5IGxvc3QgY29ubmVjdGl2aXR5IHRvIEVsYXN0aWNTZWFyY2guIFBsZWFzZSBjaGVjayB0aGUgbG9ncyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKSwgRV8yMDMoCisJCQkJCQkJIkFTREMgQmFja2VuZCBwcm9iYWJseSBsb3N0IGNvbm5lY3Rpdml0eSB0byBVRUIgQ2x1c3Rlci4gUGxlYXNlIGNoZWNrIHRoZSBsb2dzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsCisJCQkJCQkJIkNoZWNrIGNvbm5lY3Rpdml0eSB0byBVRUIgY2x1c3RlciB3aGljaCBpcyBjb25maWd1cmVkIHVuZGVyIHBhcmFtZXRlciB1ZWJTZXJ2ZXJzIGluIGRpc3RyaWJ1dGlvbi1jb25maWd1cmF0aW9uLnlhbWwuIiksIEVfMjA0KAorCQkJCQkJCQkJIlVuYWJsZSB0byBjb25uZWN0IHRvIGEgdmFsaWQgQVNEQyBCYWNrZW5kIFNlcnZlciIsCisJCQkJCQkJCQkiUGxlYXNlIGNoZWNrIGNvbm5lY3Rpdml0eSBmcm9tIHRoaXMgRkUgaW5zdGFuY2UgdG93YXJkcyBCRSBvciBCRSBMb2FkIEJhbGFuY2VyLiBQbGVhc2UgY2hlY2sgdGhhdCBwYXJhbWV0ZXJzIGluIEZFIGNvbmZpZ3VyYXRpb24ueWFtbDogYmVIb3N0LCAgICAgYmVIdHRwUG9ydCBhbmQgYmVTc2xQb3J0IHBvaW50IHRvIGEgdmFsaWQgaG9zdCBhbmQgcG9ydCB2YWx1ZXMuIiksCisKKwlFXzIwNSgiQVNEQyBCYWNrZW5kIFJlY292ZXJ5IHRvIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiBUaXRhbiBEQiwgRWxhc3RpY3NlYXJjaCwgVUVCIENsdXN0ZXIuIiksIEVfMjA2KAorCQkJIkFTREMgQmFja2VuZCBjb25uZWN0aW9uIHJlY292ZXJ5IHRvIFRpdGFuIERCLiIpLCBFXzIwNygKKwkJCQkJIkFTREMgQmFja2VuZCBjb25uZWN0aW9uIHJlY292ZXJ5IHRvIEVsYXN0aWNTZWFyY2guIiksIEVfMjA4KAorCQkJCQkJCSJBU0RDIEJhY2tlbmQgY29ubmVjdGlvbiByZWNvdmVyeSB0byBVRUIgQ2x1c3Rlci4iKSwgRV8yMDkoCisJCQkJCQkJCQkiQ29ubmVjdGl2aXR5IHRvIEFTREMgQkUgU2VydmVyIGlzIHJlY292ZXJlZC4iKSwgRV8yMTAoCisJCQkJCQkJCQkJCSJDb25uZWN0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gUmVhc29uOiAlcyIsCisJCQkJCQkJCQkJCSJQbGVhc2UgY2hlY2sgdGhhdCB0aGF0IHBhcmFtZXRlciB1ZWJTZXJ2ZXJzIGluIGRpc3RyaWJ1dGlvbi1jb25maWd1cmF0aW9uLnlhbWwgcG9pbnRzIHRvIGEgdmFsaWQgVUVCIENsdXN0ZXIuIiksIEVfMjExKAorCQkJCQkJCQkJCQkJCSJDb25uZWN0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gQ2Fubm90IHJlYWNoIGhvc3QgJXMiLAorCQkJCQkJCQkJCQkJCSJQbGVhc2UgY2hlY2sgdGhhdCB0aGF0IHBhcmFtZXRlciB1ZWJTZXJ2ZXJzIGluIGRpc3RyaWJ1dGlvbi1jb25maWd1cmF0aW9uLnlhbWwgcG9pbnRzIHRvIGEgdmFsaWQgVUVCIENsdXN0ZXIuIiksIEVfMjEyKAorCQkJCQkJCQkJCQkJCQkJIkNvdWxkbid0IHJlc29sdmUgaG9zdElQLiBEZXNjaXB0aW9uOiAlcyIpLCBFXzIxMygKKwkJCQkJCQkJCQkJCQkJCQkJIlNpdGUgc3dpdGNoIG92ZXIgd2FzIGRvbmUuIFNpdGUgaXMgbm93IGluICVzIG1vZGUiKSwgRV8yOTkoCisJCQkJCQkJCQkJCQkJCQkJCQkJIkludGVybmFsIENvbm5lY3Rpb24gcHJvYmxlbS4gRGVzY3JpcHRpb246ICVzIiksCisKKwkvLyBbcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0XQorCUVfMzAwKCJNYW5kYXRvcnkgJXMgQ29tcG9uZW50ICVzIGNhbm5vdCBiZSBmb3VuZCBpbiByZXBvc2l0b3J5IiksCisJLy8gW1NFUlZJQ0UvUkVTT1VSQ0UvUFJPRFVDVF0gW2lkXSBpcyBub3QgdmFsaWQuIENhbm5vdCBiZSBmb3VuZCBpbiBncmFwaC4KKwlFXzMwMSgiJXMgQ29tcG9uZW50ICVzIGlzIG5vdCB2YWxpZC4gQ2Fubm90IGJlIGZvdW5kIGluIGdyYXBoLiIpLCBFXzMwMigKKwkJCSJDb25maWd1cmF0aW9uIHBhcmFtZXRlciAlcyBpcyBpbnZhbGlkLiBWYWx1ZSBjb25maWd1cmVkIGlzICVzLiIpLCBFXzMwMygKKwkJCQkJIkVycm9yIG9jY3VyZWQgZHVyaW5nIGFjY2VzcyB0byBVLUVCIFNlcnZlci4gRGF0YSBub3QgZm91bmQ6ICVzIiwKKwkJCQkJIkFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFjY2VzcyB0byBVRUIgU2VydmVyLCBBU0RDIGZhaWxlZCB0byBlaXRoZXIgcmVnaXN0ZXIgb3IgdW5yZWdpc3RlciB0by9mcm9tIFVFQiB0b3BpYy4iKSwgRV8zMDQoCisJCQkJCQkJIlRoZSBhcnRpZmFjdCB0eXBlICVzIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgbGlzdCBvZiB2YWxpZCBhcnRpZmFjdHMgJXMiKSwgRV8zMDUoCisJCQkJCQkJCQkiQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyIpLCBFXzMwNigKKwkJCQkJCQkJCQkJIkNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICVzIGlzIGludmFsaWQuIEF0IGxlYXN0ICVzIHZhbHVlcyBzaGFsbCBiZSBjb25maWd1cmVkIiksIEVfMzA3KAorCQkJCQkJCQkJCQkJCSJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gWUFNTCBmaWxlLiAlcyIpLCBFXzMwOCgKKwkJCQkJCQkJCQkJCQkJCSJBcnRpZmFjdCB1cGxvYWRlZCBoYXMgbWlzc2luZyBpbmZvcm1hdGlvbi4gTWlzc2luZyAlcyIpLCBFXzMwOSgKKwkJCQkJCQkJCQkJCQkJCQkJIkFydGlmYWN0ICVzIHJlcXVlc3RlZCBpcyBub3QgZm91bmQiKSwgRV8zMTAoCisJCQkJCQkJCQkJCQkJCQkJCQkJIlVzZXIgJXMgcmVxdWVzdGVkIGlzIG5vdCBmb3VuZCIpLCBFXzMxMSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSJFY29tcCBlcnJvciBkZXNjcmlwdGlvbiBwYXJhbXMgbWlzbWF0Y2ggYmV0d2VlbiBjb2RlIGFuZCBZQU1MIG9yIHdyb25nIGZvcm1hdCwgbmFtZTogJXMiKSwgRV8zMTIoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJFY29tcCBlcnJvciBlbGVtZW50ICBub3QgZm91bmQgaW4gWUFNTCwgbmFtZTogJXMiKSwKKworCUVfMzk5KCJJbnRlcm5hbCBJbnZhbGlkIE9iamVjdC4gRGVzY3JpcHRpb246ICVzIiksCisKKwlFXzQwMCgiVGhlIHR5cGUgJXMgb2YgJXMgaXMgaW52YWxpZCIpLCBFXzQwMSgiVGhlIHZhbHVlICVzIG9mICVzIGZyb20gdHlwZSAlcyBpcyBpbnZhbGlkIiksIEVfNDAyKAorCQkJIlBheWxvYWQgb2YgYXJ0aWZhY3QgdXBsb2FkZWQgaXMgaW52YWxpZCAoaW52YWxpZCBNRDUgb3IgZW5jcnlwdGlvbikiKSwgRV80MDMoCisJCQkJCSJJbnB1dCBmb3IgYXJ0aWZhY3QgbWV0YWRhdGEgaXMgaW52YWxpZCIpLCBFXzQwNCgiJXMgJXMgcmVxdWlyZWQgaXMgbWlzc2luZyIpLCBFXzQwNSgKKwkJCQkJCQkiRmFpbGVkIHRvIGNvbnZlcnQganNvbiBpbnB1dCB0byBvYmplY3QiKSwgRV80MDYoIkRpc3RyaWJ1dGlvbiAlcyByZXF1aXJlZCBpcyBtaXNzaW5nIiksCisKKwlFXzQ5OSgiSW52YWxpZCBpbnB1dC4gRGVzY3JpcHRpb246ICVzIiksCisKKwlFXzUwMCgiQ2F0YWxvZy1CRSB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5IiksIEVfNTAxKAorCQkJIkZhaWxlZCB0byBhZGQgcmVzb3VyY2UgaW5zdGFuY2Ugb2YgcmVzb3VyY2UgJXMgdG8gc2VydmljZSAlcyIpLCBFXzUwMigKKwkJCQkJIkVycm9yIG9jY3VyZWQgZHVyaW5nIGFjY2VzcyB0byBVLUVCIFNlcnZlci4gT3BlcmF0aW9uOiAlcyIsCisJCQkJCSJBbiBlcnJvciBvY2N1cmVkIGluIEFTREMgZGlzdHJpYnV0aW9uIG1lY2hhbmlzbS4gUGxlYXNlIGNoZWNrIHRoZSBsb2dzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIpLCBFXzUwMygKKwkJCQkJCQkiRXJyb3Igb2NjdXJlZCBpbiBEaXN0cmlidXRpb24gRW5naW5lLiBGYWlsZWQgb3BlcmF0aW9uOiAlcyIsCisJCQkJCQkJIlN5c3RlbSBFcnJvciBvY2N1cmVkIGluIEFTREMgRGlzdHJpYnV0aW9uIEVuZ2luZS4gUGxlYXNlIGNoZWNrIEFTREMgbG9ncyBmb3IgbW9yZSBkZXRhaWxzLiIpLCBFXzUwNCgKKwkJCQkJCQkJCSJGYWlsZWQgYWRkaW5nIG5vZGUgb2YgdHlwZSAlcyB0byBncmFwaC4iKSwgRV81MDUoCisJCQkJCQkJCQkJCSJPcGVyYXRpb24gdG93YXJkcyBkYXRhYmFzZSBmYWlsZWQuIiwKKwkJCQkJCQkJCQkJIlBsZWFzZSBjaGVjayBUaXRhbiBEQiBoZWFsdGggb3IgbG9vayBhdCB0aGUgbG9ncyBmb3IgbW9yZSBkZXRhaWxzLiIpLCBFXzUwNigKKwkJCQkJCQkJCQkJCQkiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgb3BlcmF0aW9uIiksIEVfNTA3KAorCQkJCQkJCQkJCQkJCQkJIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIiksIEVfNTA4KAorCQkJCQkJCQkJCQkJCQkJCQkiRmFpbGVkIHRvIGxvY2sgb2JqZWN0IGZvciB1cGRhdGUuIFR5cGUgPSAlcywgSWQgPSAlcyIpLCBFXzUwOSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkiRmFpbGVkIHRvIGNyZWF0ZSBub2RlICVzIG9uIGdyYXBoLiBzdGF0dXMgaXMgJXMiKSwgRV81MTAoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkiRmFpbGVkIHRvIHVwZGF0ZSBub2RlICVzIG9uIGdyYXBoLiBTdGF0dXMgaXMgJXMiKSwgRV81MTEoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJGYWlsZWQgdG8gZGVsZXRlIG5vZGUgJXMgb24gZ3JhcGguIFN0YXR1cyBpcyAlcyIpLCBFXzUxMigKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiRmFpbGVkIHRvIHJldHJpZXZlIG5vZGUgJXMgZnJvbSBncmFwaC4gU3RhdHVzIGlzICVzIiksIEVfNTEzKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIkZhaWxlZCB0byBmaW5kIHBhcmVudCBub2RlIG9mICVzIG9uIGdyYXBoLiBTdGF0dXMgaXMgJXMiKSwgRV81MTQoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSJGYWlsZWQgdG8gZmV0Y2ggYWxsIG5vZGVzIHdpdGggdHlwZSAlcyBvZiBwYXJlbnQgbm9kZSAlcyAuIFN0YXR1cyBpcyAlcyIpLCBFXzUxNSgKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiQ2Fubm90IGZpbmQgbm9kZSB3aXRoIHR5cGUgJXMgYXNzb2NpYXRlZCB3aXRoIG5vZGUgJXMgLiBTdGF0dXMgaXMgJXMiKSwgRV81MTYoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkiRXJyb3Igb2NjdXJlZCBpbiBDb21wb25lbnQgQ2xlYW5lciBUYXNrLiBGYWlsZWQgb3BlcmF0aW9uOiAlcyIpLCBFXzUxNygKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIkVycm9yIHdoZW4gbG9nZ2luZyBGRSBIVFRQIHJlcXVlc3QvcmVzcG9uc2UiKSwgRV81MTgoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIkVycm9yIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyBGRSBQb3J0YWwgcGFnZSIpLAorCisJRV81OTkoIkludGVybmFsIGZsb3cgZXJyb3IuIE9wZXJhdGlvbjogJXMiKSwKKworCUVfOTAwKCJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBCRSBSRVNUIEFQSSBleGVjdXRpb24iKSwgRV85MDEoIkdlbmVyYWwgZXJyb3IgZHVyaW5nIEZFIEhlYWx0aCBDaGVjayIpLCBFXzk5OSgKKwkJCSJVbmV4cGVjdGVkIGVycm9yLiBEZXNjcmlwdGlvbjogJXMiKTsKKworCS8qCisJICogMTAwLTE5OSBTZWN1cml0eS9QZXJtaXNzaW9uIFJlbGF0ZWQgLSBBdXRoZW50aWNhdGlvbiBwcm9ibGVtcyAoZnJvbQorCSAqIGV4dGVybmFsIGNsaWVudCwgdG8gZXh0ZXJuYWwgc2VydmVyKSAtIENlcnRpZmljYXRpb24gZXJyb3JzIC0KKwkgKiAKKwkgKiAyMDAtMjk5IEF2YWlsYWJpbGl0eS9UaW1lb3V0IFJlbGF0ZWQgLSBjb25uZWN0aXZpdHkgZXJyb3IgLSBjb25uZWN0aW9uCisJICogdGltZW91dAorCSAqIAorCSAqIDMwMC0zOTkgRGF0YSBBY2Nlc3MvSW50ZWdyaXR5IFJlbGF0ZWQgLSBEYXRhIGluIGdyYXBoIGluIGludmFsaWQoRS5nLiBubworCSAqIGNyZWF0b3IgaXMgZm91bmQgZm9yIHNlcnZpY2UpIC0gQXJ0aWZhY3QgaXMgbWlzc2luZyBpbiBFUywgYnV0IGV4aXN0cyBpbgorCSAqIGdyYXBoLgorCSAqIAorCSAqIDQwMC00OTkgU2NoZW1hIEludGVyZmFjZSBUeXBlL1ZhbGlkYXRpb24gLSByZWNlaXZlZCBwYXlsb2FkIGNoZWNrc3VtIGlzCisJICogaW5hdmxpZCAtIHJlY2VpdmVkIGpzb24gaXMgbm90IHZhbGlkCisJICogCisJICogNTAwLTU5OSBCdXNpbmVzcy9GbG93IFByb2Nlc3NpbmcgUmVsYXRlZCAtIGNoZWNrIG91dCB0byBzZXJ2aWNlIGlzIG5vdAorCSAqIGFsbG93ZWQgLSByb2xsYmFjayBpcyBkb25lIC0gZmFpbGVkIHRvIGdlbmVyYXRlIGhlYXQgZmlsZQorCSAqIAorCSAqIAorCSAqIDYwMC04OTkgUmVzZXJ2ZWQg4oCTIGRvIG5vdCB1c2UKKwkgKiAKKwkgKiA5MDAtOTk5IFVua25vd24gRXJyb3JzIC0gdW5leHBlY3RlZCBleGNlcHRpb24KKwkgKi8KKworCVN0cmluZyBkZXNjcmlwdGlvbjsKKwlTdHJpbmcgcmVzb2x1dGlvbjsKKworCUVjb21wRXJyb3JDb2RlKFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHJlc29sdXRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQl0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOworCX0KKworCUVjb21wRXJyb3JDb2RlKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZXNvbHV0aW9uKCkgeworCQlyZXR1cm4gcmVzb2x1dGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXNvbHV0aW9uKFN0cmluZyByZXNvbHV0aW9uKSB7CisJCXRoaXMucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcEVycm9yQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODEwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkJhc2ljQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIEVjb21wRXJyb3JDb25maWd1cmF0aW9uIGV4dGVuZHMgQmFzaWNDb25maWd1cmF0aW9uIHsKKworCXByaXZhdGUgTWFwPFN0cmluZywgRWNvbXBFcnJvckluZm8+IGVycm9ycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIEVDT0RFX1BSRUZJWCA9ICJBU0RDXyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBFQ09ERV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeIiArIEVDT0RFX1BSRUZJWCArICJcXGR7NH0kIik7CisKKwlwdWJsaWMgTWFwPFN0cmluZywgRWNvbXBFcnJvckluZm8+IGdldEVycm9ycygpIHsKKwkJcmV0dXJuIGVycm9yczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFcnJvcnMoTWFwPFN0cmluZywgRWNvbXBFcnJvckluZm8+IGVycm9ycykgeworCQkvLyBWYWxpZGF0aW5nIGVjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbAorCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEVjb21wRXJyb3JJbmZvPiBlY29tcEVycm9ySW5mbyA6IGVycm9ycy5lbnRyeVNldCgpKSB7CisJCQlTdHJpbmcgZWNvbXBFcnJvck5hbWUgPSBlY29tcEVycm9ySW5mby5nZXRLZXkoKTsKKwkJCUVjb21wRXJyb3JJbmZvIHJlcyA9IHZhbGlkYXRlRWNvbXBFcnJvckluZm8oZWNvbXBFcnJvck5hbWUsIGVjb21wRXJyb3JJbmZvLmdldFZhbHVlKCkpOworCQkJaWYgKHJlcyAhPSBudWxsKSB7CisJCQkJLy8gVmFsaWRhdGlvbiBmYWlsZWQhCisJCQkJRWNvbXBFcnJvckxvZ1V0aWwubG9nRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZS5FY29tcENvbmZpZ0ZpbGVGb3JtYXQsIHJlcywgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCS8vIFZhbGlkYXRpb24gcGFzc2VkCisJCXRoaXMuZXJyb3JzID0gZXJyb3JzOworCX0KKworCXB1YmxpYyBFY29tcEVycm9ySW5mbyBnZXRFY29tcEVycm9ySW5mbyhTdHJpbmcga2V5KSB7CisJCUVjb21wRXJyb3JJbmZvIGNsb25lID0gbnVsbDsKKwkJRWNvbXBFcnJvckluZm8gb3RoZXIgPSBlcnJvcnMuZ2V0KGtleSk7CisJCWlmIChvdGhlciAhPSBudWxsKSB7CisJCQljbG9uZSA9IG5ldyBFY29tcEVycm9ySW5mbygpOworCQkJY2xvbmUuY2xvbmVEYXRhKG90aGVyKTsKKwkJfQorCQlyZXR1cm4gY2xvbmU7CisJfQorCisJcHJvdGVjdGVkIEVjb21wRXJyb3JJbmZvIHZhbGlkYXRlRWNvbXBFcnJvckluZm8oU3RyaW5nIGVjb21wRXJyb3JOYW1lLCBFY29tcEVycm9ySW5mbyBlY29tcEVycm9ySW5mb1RvVmFsaWRhdGUpIHsKKwkJaWYgKGVjb21wRXJyb3JJbmZvVG9WYWxpZGF0ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0RXJyb3JJbmZvRm9yQ29uZmlnRmlsZSgiZXJyb3IgIiArIGVjb21wRXJyb3JOYW1lICsgIiBub3QgZm91bmQgIik7CisJCX0KKwkJU3RyaW5nIHR5cGUgPSBlY29tcEVycm9ySW5mb1RvVmFsaWRhdGUuZ2V0VHlwZSgpOworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0RXJyb3JJbmZvRm9yQ29uZmlnRmlsZSgiZW1wdHkgZXJyb3IgdHlwZSBmb3IgZXJyb3IgIiArIGVjb21wRXJyb3JOYW1lCisJCQkJCSsgIiwgdmFsdWUgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAiICsgQXJyYXlzLmFzTGlzdChFY29tcEVycm9yVHlwZS52YWx1ZXMoKSkpOworCQl9CisJCXRyeSB7CisJCQlFY29tcEVycm9yVHlwZS52YWx1ZU9mKHR5cGUpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGdldEVycm9ySW5mb0ZvckNvbmZpZ0ZpbGUoImVycm9yIHR5cGUgIiArIHR5cGUgKyAiIGlzIGludmFsaWQgZm9yIGVycm9yICIgKyBlY29tcEVycm9yTmFtZQorCQkJCQkrICIsIHZhbHVlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogIiArIEFycmF5cy5hc0xpc3QoRWNvbXBFcnJvclR5cGUudmFsdWVzKCkpKTsKKwkJfQorCisJCVN0cmluZyBzZXZlcml0eSA9IGVjb21wRXJyb3JJbmZvVG9WYWxpZGF0ZS5nZXRTZXZlcml0eSgpOworCQlpZiAoc2V2ZXJpdHkgPT0gbnVsbCkgeworCQkJcmV0dXJuIGdldEVycm9ySW5mb0ZvckNvbmZpZ0ZpbGUoImVtcHR5IGVycm9yIHNldmVyaXR5IGZvciBlcnJvciAiICsgZWNvbXBFcnJvck5hbWUKKwkJCQkJKyAiLCB2YWx1ZSBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICIgKyBBcnJheXMuYXNMaXN0KEVjb21wRXJyb3JTZXZlcml0eS52YWx1ZXMoKSkpOworCQl9CisJCXRyeSB7CisJCQlFY29tcEVycm9yU2V2ZXJpdHkudmFsdWVPZihzZXZlcml0eSk7CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZ2V0RXJyb3JJbmZvRm9yQ29uZmlnRmlsZSgiZXJyb3Igc2V2ZXJpdHkgIiArIHNldmVyaXR5ICsgIiBpcyBpbnZhbGlkIGZvciBlcnJvciAiICsgZWNvbXBFcnJvck5hbWUKKwkJCQkJKyAiLCB2YWx1ZSBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICIgKyBBcnJheXMuYXNMaXN0KEVjb21wRXJyb3JTZXZlcml0eS52YWx1ZXMoKSkpOworCQl9CisJCVN0cmluZyBhbGFybVNldmVyaXR5ID0gZWNvbXBFcnJvckluZm9Ub1ZhbGlkYXRlLmdldEFsYXJtU2V2ZXJpdHkoKTsKKwkJaWYgKGFsYXJtU2V2ZXJpdHkgPT0gbnVsbCkgeworCQkJcmV0dXJuIGdldEVycm9ySW5mb0ZvckNvbmZpZ0ZpbGUoImVtcHR5IGVycm9yIGFsYXJtIGZvciBlcnJvciAiICsgZWNvbXBFcnJvck5hbWUKKwkJCQkJKyAiLCAsIHZhbHVlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogIiArIEFycmF5cy5hc0xpc3QoRWNvbXBBbGFybVNldmVyaXR5LnZhbHVlcygpKSk7CisJCX0KKwkJdHJ5IHsKKwkJCUVjb21wQWxhcm1TZXZlcml0eS52YWx1ZU9mKGFsYXJtU2V2ZXJpdHkpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGdldEVycm9ySW5mb0ZvckNvbmZpZ0ZpbGUoImVycm9yIGFsYXJtIHNldmVyaXR5ICIgKyBhbGFybVNldmVyaXR5ICsgIiBpcyBpbnZhbGlkIGZvciBlcnJvciAiCisJCQkJCSsgZWNvbXBFcnJvck5hbWUgKyAiLCAsIHZhbHVlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogIgorCQkJCQkrIEFycmF5cy5hc0xpc3QoRWNvbXBBbGFybVNldmVyaXR5LnZhbHVlcygpKSk7CisJCX0KKworCQlTdHJpbmcgY29kZSA9IGVjb21wRXJyb3JJbmZvVG9WYWxpZGF0ZS5nZXRDb2RlKCk7CisJCWlmIChjb2RlICE9IG51bGwgJiYgRUNPREVfUEFUVEVSTi5tYXRjaGVyKGNvZGUpLm1hdGNoZXMoKSkgeworCQkJU3RyaW5nW10gc3BsaXQgPSBjb2RlLnNwbGl0KCJfIik7CisJCQlpbnQgcGFyc2VJbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNwbGl0WzFdKTsKKwkJCWlmIChwYXJzZUludCA8IDMwMTAgfHwgcGFyc2VJbnQgPiA5OTk5KSB7CisJCQkJcmV0dXJuIGdldEVycm9ySW5mb0ZvckludmFsaWRDb2RlKGNvZGUsIGVjb21wRXJyb3JOYW1lKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBnZXRFcnJvckluZm9Gb3JJbnZhbGlkQ29kZShjb2RlLCBlY29tcEVycm9yTmFtZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBFY29tcEVycm9ySW5mbyBnZXRFcnJvckluZm9Gb3JJbnZhbGlkQ29kZShTdHJpbmcgY29kZSwgU3RyaW5nIGVjb21wRXJyb3JOYW1lKSB7CisJCXJldHVybiBnZXRFcnJvckluZm9Gb3JDb25maWdGaWxlKCJlcnJvciBjb2RlICIgKyBjb2RlICsgIiBpcyBpbnZhbGlkIGZvciBlcnJvciAiICsgZWNvbXBFcnJvck5hbWUKKwkJCQkrICIsIHNob3VsZCBiZSBpbiBmb3JtYXQgQVNEQ19bMzAxMC05OTk5XSIpOworCX0KKworCXByaXZhdGUgRWNvbXBFcnJvckluZm8gZ2V0RXJyb3JJbmZvRm9yQ29uZmlnRmlsZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CisJCUVjb21wRXJyb3JJbmZvIGVjb21wRXJyb3JJbmZvID0gbmV3IEVjb21wRXJyb3JJbmZvKCk7CisJCWVjb21wRXJyb3JJbmZvLnNldENvZGUoRUNPREVfUFJFRklYICsgIjMwMDAiKTsKKwkJZWNvbXBFcnJvckluZm8uc2V0VHlwZShFY29tcEVycm9yVHlwZS5DT05GSUdfRVJST1IubmFtZSgpKTsKKwkJZWNvbXBFcnJvckluZm8uc2V0U2V2ZXJpdHkoRWNvbXBFcnJvclNldmVyaXR5LkZBVEFMLm5hbWUoKSk7CisJCWVjb21wRXJyb3JJbmZvLnNldEFsYXJtU2V2ZXJpdHkoRWNvbXBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLm5hbWUoKSk7CisJCWVjb21wRXJyb3JJbmZvLnNldERlc2NyaXB0aW9uKGVycm9yTWVzc2FnZSk7CisJCXJldHVybiBlY29tcEVycm9ySW5mbzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkVjb21wRXJyb3JDb25maWd1cmF0aW9uIFtlcnJvcnM9IiArIGVycm9ycyArICJdIjsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEVudW1zCisJICovCisKKwlwdWJsaWMgZW51bSBFY29tcEVycm9yVHlwZSB7CisJCVJFQ09WRVJZLCBDT05GSUdfRVJST1IsIFNZU1RFTV9FUlJPUiwgREFUQV9FUlJPUiwgQ09OTkVDVElPTl9QUk9CTEVNLCBBVVRIRU5USUNBVElPTl9QUk9CTEVNOworCX0KKworCXB1YmxpYyBlbnVtIEVjb21wQWxhcm1TZXZlcml0eSB7CisJCUNSSVRJQ0FMLCBNQUpPUiwgTUlOT1IsIElORk9STUFUSU9OQUwsIE5PTkU7CisJfQorCisJcHVibGljIGVudW0gRWNvbXBFcnJvclNldmVyaXR5IHsKKwkJSU5GTywgV0FSTiwgRVJST1IsIEZBVEFMOworCX0KKworCXB1YmxpYyBlbnVtIEVjb21wRXJyb3JTZXZlcml0eVByZWZpeCB7CisJCUksIFcsIEUsIEY7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLmFzTGlzdChFY29tcEVycm9yVHlwZS52YWx1ZXMoKSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcEVycm9yRW51bS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0Vjb21wRXJyb3JFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5Njc3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcEVycm9yRW51bS5qYXZhCkBAIC0wLDAgKzEsNDg0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZzsKKworcHVibGljIGVudW0gRWNvbXBFcnJvckVudW0geworCisJQmVVZWJBdXRoZW50aWNhdGlvbkVycm9yKEVjb21wRXJyb3JDb2RlLkVfMTAwLCBFcnJvclR5cGUuQVVUSEVOVElDQVRJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCUVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCisJSW50ZXJuYWxBdXRoZW50aWNhdGlvbkluZm8oRWNvbXBFcnJvckNvZGUuRV8xOTksIEVycm9yVHlwZS5BVVRIRU5USUNBVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsCisJCQlFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OKSwgSW50ZXJuYWxBdXRoZW50aWNhdGlvbldhcm5pbmcoRWNvbXBFcnJvckNvZGUuRV8xOTksCisJCQkJCUVycm9yVHlwZS5BVVRIRU5USUNBVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5Lk1JTk9SLAorCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLCBJbnRlcm5hbEF1dGhlbnRpY2F0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8xOTksCisJCQkJCQkJRXJyb3JUeXBlLkFVVEhFTlRJQ0FUSU9OX1BST0JMRU0sIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEludGVybmFsQXV0aGVudGljYXRpb25GYXRhbChFY29tcEVycm9yQ29kZS5FXzE5OSwKKwkJCQkJCQkJCUVycm9yVHlwZS5BVVRIRU5USUNBVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLAorCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5GQVRBTCksCisKKwlCZUhlYWx0aENoZWNrUmVjb3ZlcnkoRWNvbXBFcnJvckNvZGUuRV8yMDUsIEVycm9yVHlwZS5SRUNPVkVSWSwgQWxhcm1TZXZlcml0eS5JTkZPUk1BVElPTkFMLAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiwgbnVsbCksIEJlSGVhbHRoQ2hlY2tUaXRhblJlY292ZXJ5KEVjb21wRXJyb3JDb2RlLkVfMjA2LCBFcnJvclR5cGUuUkVDT1ZFUlksCisJCQkJCUFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiwKKwkJCQkJbnVsbCksIEJlSGVhbHRoQ2hlY2tFbGFzdGljU2VhcmNoUmVjb3ZlcnkoRWNvbXBFcnJvckNvZGUuRV8yMDcsIEVycm9yVHlwZS5SRUNPVkVSWSwKKwkJCQkJCQlBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uSU5GT1JNQVRJT04sCisJCQkJCQkJbnVsbCksIEJlSGVhbHRoQ2hlY2tVZWJDbHVzdGVyUmVjb3ZlcnkoRWNvbXBFcnJvckNvZGUuRV8yMDgsIEVycm9yVHlwZS5SRUNPVkVSWSwKKwkJCQkJCQkJCUFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiwKKwkJCQkJCQkJCW51bGwpLCBGZUhlYWx0aENoZWNrUmVjb3ZlcnkoRWNvbXBFcnJvckNvZGUuRV8yMDksIEVycm9yVHlwZS5SRUNPVkVSWSwKKwkJCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5JTkZPUk1BVElPTkFMLCBFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OLAorCQkJCQkJCQkJCQludWxsKSwgQmVIZWFsdGhDaGVja0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfMjAwLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCQkJCQkJCQkJCQkJCUFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IsCisJCQkJCQkJCQkJCQkJQmVIZWFsdGhDaGVja1JlY292ZXJ5KSwKKworCUJlSGVhbHRoQ2hlY2tUaXRhbkVycm9yKEVjb21wRXJyb3JDb2RlLkVfMjAxLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiwgQmVIZWFsdGhDaGVja1RpdGFuUmVjb3ZlcnkpLCBCZUhlYWx0aENoZWNrRWxhc3RpY1NlYXJjaEVycm9yKAorCQkJCQlFY29tcEVycm9yQ29kZS5FXzIwMiwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiwKKwkJCQkJQmVIZWFsdGhDaGVja0VsYXN0aWNTZWFyY2hSZWNvdmVyeSksIEJlSGVhbHRoQ2hlY2tVZWJDbHVzdGVyRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8yMDMsCisJCQkJCQkJRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiwKKwkJCQkJCQlCZUhlYWx0aENoZWNrVWViQ2x1c3RlclJlY292ZXJ5KSwgRmVIZWFsdGhDaGVja0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfMjA0LAorCQkJCQkJCQkJRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiwKKwkJCQkJCQkJCUZlSGVhbHRoQ2hlY2tSZWNvdmVyeSksIEJlVWViQ29ubmVjdGlvbkVycm9yKEVjb21wRXJyb3JDb2RlLkVfMjEwLAorCQkJCQkJCQkJCQlFcnJvclR5cGUuQ09OTkVDVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVVZWJVbmtvd25Ib3N0RXJyb3IoRWNvbXBFcnJvckNvZGUuRV8yMTEsCisJCQkJCQkJCQkJCQkJRXJyb3JUeXBlLkNPTk5FQ1RJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKworCUZxZG5SZXNvbHZlRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8yMTIsIEVycm9yVHlwZS5DT05ORUNUSU9OX1BST0JMRU0sIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgU2l0ZVN3aXRjaG92ZXJJbmZvKEVjb21wRXJyb3JDb2RlLkVfMjEzLCBFcnJvclR5cGUuUkVDT1ZFUlksCisJCQkJCUFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiksCisKKwlJbnRlcm5hbENvbm5lY3Rpb25JbmZvKEVjb21wRXJyb3JDb2RlLkVfMjk5LCBFcnJvclR5cGUuQ09OTkVDVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsCisJCQlFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OKSwgSW50ZXJuYWxDb25uZWN0aW9uV2FybmluZyhFY29tcEVycm9yQ29kZS5FXzI5OSwKKwkJCQkJRXJyb3JUeXBlLkNPTk5FQ1RJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5NSU5PUiwKKwkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5XQVJOSU5HKSwgSW50ZXJuYWxDb25uZWN0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8yOTksCisJCQkJCQkJRXJyb3JUeXBlLkNPTk5FQ1RJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgSW50ZXJuYWxDb25uZWN0aW9uRmF0YWwoRWNvbXBFcnJvckNvZGUuRV8yOTksCisJCQkJCQkJCQlFcnJvclR5cGUuQ09OTkVDVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwKKworCUJlQ29tcG9uZW50TWlzc2luZ0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfMzAwLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlSW5jb3JyZWN0Q29tcG9uZW50RXJyb3IoRWNvbXBFcnJvckNvZGUuRV8zMDEsIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJCQkJCUFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLCBCZUludmFsaWRDb25maWd1cmF0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8zMDIsCisJCQkJCQkJRXJyb3JUeXBlLkNPTkZJR19FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwgQmVVZWJPYmplY3ROb3RGb3VuZEVycm9yKEVjb21wRXJyb3JDb2RlLkVfMzAzLAorCQkJCQkJCQkJRXJyb3JUeXBlLkRBVEFfRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVEaXN0cmlidXRpb25FbmdpbmVJbnZhbGlkQXJ0aWZhY3RUeXBlKAorCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzMwNCwgRXJyb3JUeXBlLkRBVEFfRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQkJCUVjb21wQ2xhc3NpZmljYXRpb24uV0FSTklORyksIEJlTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvcigKKwkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzMwNSwgRXJyb3JUeXBlLkNPTkZJR19FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwgQmVDb25maWd1cmF0aW9uSW52YWxpZExpc3RTaXplRXJyb3IoCisJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzMwNiwgRXJyb3JUeXBlLkNPTkZJR19FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCUFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwgRXJyb3JDb25maWdGaWxlRm9ybWF0KAorCQkJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzMwNywgRXJyb3JUeXBlLkNPTkZJR19FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlTWlzc2luZ0FydGlmYWN0SW5mb3JtYXRpb25FcnJvcigKKwkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzMwOCwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVBcnRpZmFjdE1pc3NpbmdFcnJvcigKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wRXJyb3JDb2RlLkVfMzA5LAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlVXNlck1pc3NpbmdFcnJvcigKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBFcnJvckNvZGUuRV8zMTAsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5EQVRBX0VSUk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgRWNvbXBNaXNtYXRjaFBhcmFtKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wRXJyb3JDb2RlLkVfMzExLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5DT05GSUdfRVJST1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgRWNvbXBNaXNzaW5nRXJyb3IoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzMxMiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5DT05GSUdfRVJST1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisKKwlJbnRlcm5hbERhdGFJbmZvKEVjb21wRXJyb3JDb2RlLkVfMzk5LCBFcnJvclR5cGUuREFUQV9FUlJPUiwgQWxhcm1TZXZlcml0eS5JTkZPUk1BVElPTkFMLAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiksIEludGVybmFsRGF0YVdhcm5pbmcoRWNvbXBFcnJvckNvZGUuRV8zOTksIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCQkJCQlBbGFybVNldmVyaXR5Lk1JTk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLCBJbnRlcm5hbERhdGFFcnJvcihFY29tcEVycm9yQ29kZS5FXzM5OSwKKwkJCQkJCQlFcnJvclR5cGUuREFUQV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgSW50ZXJuYWxEYXRhRmF0YWwoRWNvbXBFcnJvckNvZGUuRV8zOTksIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5GQVRBTCksCisKKwlCZUludmFsaWRUeXBlRXJyb3IoRWNvbXBFcnJvckNvZGUuRV80MDAsIEVycm9yVHlwZS5EQVRBX0VSUk9SLCBBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5XQVJOSU5HKSwgQmVJbnZhbGlkVmFsdWVFcnJvcihFY29tcEVycm9yQ29kZS5FXzQwMSwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJCQkJCUFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uV0FSTklORyksIEJlQXJ0aWZhY3RQYXlsb2FkSW52YWxpZChFY29tcEVycm9yQ29kZS5FXzQwMiwKKwkJCQkJCQlFcnJvclR5cGUuREFUQV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVBcnRpZmFjdEluZm9ybWF0aW9uSW52YWxpZEVycm9yKEVjb21wRXJyb3JDb2RlLkVfNDAzLAorCQkJCQkJCQkJRXJyb3JUeXBlLkRBVEFfRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVHcmFwaE9iamVjdE1pc3NpbmdFcnJvcihFY29tcEVycm9yQ29kZS5FXzQwNCwKKwkJCQkJCQkJCQkJRXJyb3JUeXBlLkRBVEFfRVJST1IsIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsCisJCQkJCQkJCQkJCUVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLCBCZUludmFsaWRKc29uSW5wdXQoRWNvbXBFcnJvckNvZGUuRV80MDUsCisJCQkJCQkJCQkJCQkJRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVEaXN0cmlidXRpb25NaXNzaW5nRXJyb3IoCisJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzQwNiwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKworCUludmFsaWRJbnB1dEluZm8oRWNvbXBFcnJvckNvZGUuRV80OTksIEVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwKKwkJCUVjb21wQ2xhc3NpZmljYXRpb24uSU5GT1JNQVRJT04pLCBJbnZhbGlkSW5wdXRXYXJuaW5nKEVjb21wRXJyb3JDb2RlLkVfNDk5LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCQkJCQlBbGFybVNldmVyaXR5Lk1JTk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLCBJbnZhbGlkSW5wdXRFcnJvcihFY29tcEVycm9yQ29kZS5FXzQ5OSwKKwkJCQkJCQlFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCUVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLCBJbnZhbGlkSW5wdXRGYXRhbChFY29tcEVycm9yQ29kZS5FXzQ5OSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkJCQkJCQkJCUFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uRkFUQUwpLAorCisJQmVJbml0aWFsaXphdGlvbkVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTAwLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlRmFpbGVkQWRkaW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTAxLAorCQkJCQlFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVVZWJTeXN0ZW1FcnJvcigKKwkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzUwMiwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVEaXN0cmlidXRpb25FbmdpbmVTeXN0ZW1FcnJvcihFY29tcEVycm9yQ29kZS5FXzUwMywKKwkJCQkJCQkJCUVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVGYWlsZWRBZGRpbmdOb2RlVHlwZUVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTA0LAorCQkJCQkJCQkJCQlFcnJvclR5cGUuREFUQV9FUlJPUiwgQWxhcm1TZXZlcml0eS5DUklUSUNBTCwKKwkJCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlRGFvU3lzdGVtRXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MDUsCisJCQkJCQkJCQkJCQkJRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5DUklUSUNBTCwKKwkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVTeXN0ZW1FcnJvcihFY29tcEVycm9yQ29kZS5FXzUwNiwKKwkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsCisJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVFeGVjdXRlUm9sbGJhY2tFcnJvcigKKwkJCQkJCQkJCQkJCQkJCQkJRWNvbXBFcnJvckNvZGUuRV81MDcsIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVGYWlsZWRMb2NrT2JqZWN0RXJyb3IoCisJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBFcnJvckNvZGUuRV81MDgsCisJCQkJCQkJCQkJCQkJCQkJCQkJRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5LkNSSVRJQ0FMLAorCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wQ2xhc3NpZmljYXRpb24uV0FSTklORyksIEJlRmFpbGVkQ3JlYXRlTm9kZUVycm9yKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBFcnJvckNvZGUuRV81MDksCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCUFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wRXJyb3JDb2RlLkVfNTEwLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlRmFpbGVkRGVsZXRlTm9kZUVycm9yKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wRXJyb3JDb2RlLkVfNTExLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5EQVRBX0VSUk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlRmFpbGVkUmV0cmlldmVOb2RlRXJyb3IoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzUxMiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5EQVRBX0VSUk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLCBCZUZhaWxlZEZpbmRQYXJlbnRFcnJvcigKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBFcnJvckNvZGUuRV81MTMsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5EQVRBX0VSUk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVGYWlsZWRGaW5kQWxsTm9kZXNFcnJvcigKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzUxNCwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLCBCZUZhaWxlZEZpbmRBc3NvY2lhdGlvbkVycm9yKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBFcnJvckNvZGUuRV81MTUsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgQmVDb21wb25lbnRDbGVhbmVyU3lzdGVtRXJyb3IoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wRXJyb3JDb2RlLkVfNTE2LAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgRmVIdHRwTG9nZ2luZ0Vycm9yKAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVjb21wRXJyb3JDb2RlLkVfNTE3LAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJQWxhcm1TZXZlcml0eS5NSU5PUiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgRmVQb3J0YWxTZXJ2bGV0RXJyb3IoCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlFY29tcEVycm9yQ29kZS5FXzUxOCwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisKKwlJbnRlcm5hbEZsb3dJbmZvKEVjb21wRXJyb3JDb2RlLkVfNTk5LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsCisJCQlFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OKSwgSW50ZXJuYWxGbG93V2FybmluZyhFY29tcEVycm9yQ29kZS5FXzU5OSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkJCQkJQWxhcm1TZXZlcml0eS5NSU5PUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5XQVJOSU5HKSwgSW50ZXJuYWxGbG93RXJyb3IoRWNvbXBFcnJvckNvZGUuRV81OTksCisJCQkJCQkJRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkJCQkJCQlFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgSW50ZXJuYWxGbG93RmF0YWwoRWNvbXBFcnJvckNvZGUuRV81OTksIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJCQkJCQkJCQlBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwKKworCUJlUmVzdEFwaUdlbmVyYWxFcnJvcihFY29tcEVycm9yQ29kZS5FXzkwMCwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5DUklUSUNBTCwKKwkJCUVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IsIG51bGwpLCBGZUhlYWx0aENoZWNrR2VuZXJhbEVycm9yKEVjb21wRXJyb3JDb2RlLkVfOTAxLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCQkJCQlBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SLCBudWxsKSwKKworCUludGVybmFsVW5leHBlY3RlZEluZm8oRWNvbXBFcnJvckNvZGUuRV85OTksIEVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwKKwkJCUVjb21wQ2xhc3NpZmljYXRpb24uSU5GT1JNQVRJT04pLCBJbnRlcm5hbFVuZXhwZWN0ZWRXYXJuaW5nKEVjb21wRXJyb3JDb2RlLkVfOTk5LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCQkJCQlBbGFybVNldmVyaXR5Lk1JTk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLCBJbnRlcm5hbFVuZXhwZWN0ZWRFcnJvcihFY29tcEVycm9yQ29kZS5FXzk5OSwKKwkJCQkJCQlFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5Lk1BSk9SLAorCQkJCQkJCUVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLCBJbnRlcm5hbFVuZXhwZWN0ZWRGYXRhbChFY29tcEVycm9yQ29kZS5FXzk5OSwKKwkJCQkJCQkJCUVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uRkFUQUwpLAorCisJLyoKKwkgKiBCZVVlYkF1dGhlbnRpY2F0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8xMDAsCisJICogRXJyb3JUeXBlLkFVVEhFTlRJQ0FUSU9OX1BST0JMRU0sIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJICogRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogCisJICogSW50ZXJuYWxBdXRoZW50aWNhdGlvbkluZm8oRWNvbXBFcnJvckNvZGUuRV8xOTksCisJICogRXJyb3JUeXBlLkFVVEhFTlRJQ0FUSU9OX1BST0JMRU0sIEFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwKKwkgKiBFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OKSwKKwkgKiBJbnRlcm5hbEF1dGhlbnRpY2F0aW9uV2FybmluZyhFY29tcEVycm9yQ29kZS5FXzE5OSwKKwkgKiBFcnJvclR5cGUuQVVUSEVOVElDQVRJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5NSU5PUiwKKwkgKiBFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLAorCSAqIEludGVybmFsQXV0aGVudGljYXRpb25FcnJvcihFY29tcEVycm9yQ29kZS5FXzE5OSwKKwkgKiBFcnJvclR5cGUuQVVUSEVOVElDQVRJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkgKiBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBJbnRlcm5hbEF1dGhlbnRpY2F0aW9uRmF0YWwoRWNvbXBFcnJvckNvZGUuRV8xOTksCisJICogRXJyb3JUeXBlLkFVVEhFTlRJQ0FUSU9OX1BST0JMRU0sIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsCisJICogRWNvbXBDbGFzc2lmaWNhdGlvbi5GQVRBTCksCisJICogLy9CZUZhaWxlZERlbGV0aW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yKEVjb21wRXJyb3JDb2RlLkVfMjAwLAorCSAqIEVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiAKKwkgKiBCZUhlYWx0aENoZWNrUmVjb3ZlcnkoRWNvbXBFcnJvckNvZGUuRV8yMDUsIEVycm9yVHlwZS5SRUNPVkVSWSwKKwkgKiBBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uSU5GT1JNQVRJT04sIG51bGwpLAorCSAqIEJlSGVhbHRoQ2hlY2tUaXRhblJlY292ZXJ5KEVjb21wRXJyb3JDb2RlLkVfMjA2LCBFcnJvclR5cGUuUkVDT1ZFUlksCisJICogQWxhcm1TZXZlcml0eS5JTkZPUk1BVElPTkFMLCBFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OLCBudWxsKSwKKwkgKiBCZUhlYWx0aENoZWNrRWxhc3RpY1NlYXJjaFJlY292ZXJ5KEVjb21wRXJyb3JDb2RlLkVfMjA3LAorCSAqIEVycm9yVHlwZS5SRUNPVkVSWSwgQWxhcm1TZXZlcml0eS5JTkZPUk1BVElPTkFMLAorCSAqIEVjb21wQ2xhc3NpZmljYXRpb24uSU5GT1JNQVRJT04sIG51bGwpLAorCSAqIEJlSGVhbHRoQ2hlY2tVZWJDbHVzdGVyUmVjb3ZlcnkoRWNvbXBFcnJvckNvZGUuRV8yMDgsIEVycm9yVHlwZS5SRUNPVkVSWSwKKwkgKiBBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uSU5GT1JNQVRJT04sIG51bGwpLAorCSAqIEZlSGVhbHRoQ2hlY2tSZWNvdmVyeShFY29tcEVycm9yQ29kZS5FXzIwOSwgRXJyb3JUeXBlLlJFQ09WRVJZLAorCSAqIEFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiwgbnVsbCksCisJICogQmVIZWFsdGhDaGVja0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfMjAwLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IsCisJICogQmVIZWFsdGhDaGVja1JlY292ZXJ5KSwKKwkgKiAKKwkgKiBCZUhlYWx0aENoZWNrVGl0YW5FcnJvcihFY29tcEVycm9yQ29kZS5FXzIwMSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SLAorCSAqIEJlSGVhbHRoQ2hlY2tUaXRhblJlY292ZXJ5KSwKKwkgKiBCZUhlYWx0aENoZWNrRWxhc3RpY1NlYXJjaEVycm9yKEVjb21wRXJyb3JDb2RlLkVfMjAyLAorCSAqIEVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsCisJICogRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiwgQmVIZWFsdGhDaGVja0VsYXN0aWNTZWFyY2hSZWNvdmVyeSksCisJICogQmVIZWFsdGhDaGVja1VlYkNsdXN0ZXJFcnJvcihFY29tcEVycm9yQ29kZS5FXzIwMywKKwkgKiBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLCBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLAorCSAqIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IsIEJlSGVhbHRoQ2hlY2tVZWJDbHVzdGVyUmVjb3ZlcnkpLAorCSAqIEZlSGVhbHRoQ2hlY2tFcnJvcihFY29tcEVycm9yQ29kZS5FXzIwNCwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SLAorCSAqIEZlSGVhbHRoQ2hlY2tSZWNvdmVyeSksIEJlVWViQ29ubmVjdGlvbkVycm9yKEVjb21wRXJyb3JDb2RlLkVfMjEwLAorCSAqIEVycm9yVHlwZS5DT05ORUNUSU9OX1BST0JMRU0sIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJICogRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksIEJlVWViVW5rb3duSG9zdEVycm9yKEVjb21wRXJyb3JDb2RlLkVfMjExLAorCSAqIEVycm9yVHlwZS5DT05ORUNUSU9OX1BST0JMRU0sIEFsYXJtU2V2ZXJpdHkuTUFKT1IsCisJICogRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogCisJICogSW50ZXJuYWxDb25uZWN0aW9uSW5mbyhFY29tcEVycm9yQ29kZS5FXzI5OSwKKwkgKiBFcnJvclR5cGUuQ09OTkVDVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsCisJICogRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiksCisJICogSW50ZXJuYWxDb25uZWN0aW9uV2FybmluZyhFY29tcEVycm9yQ29kZS5FXzI5OSwKKwkgKiBFcnJvclR5cGUuQ09OTkVDVElPTl9QUk9CTEVNLCBBbGFybVNldmVyaXR5Lk1JTk9SLAorCSAqIEVjb21wQ2xhc3NpZmljYXRpb24uV0FSTklORyksCisJICogSW50ZXJuYWxDb25uZWN0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8yOTksCisJICogRXJyb3JUeXBlLkNPTk5FQ1RJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5NQUpPUiwKKwkgKiBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwgSW50ZXJuYWxDb25uZWN0aW9uRmF0YWwoRWNvbXBFcnJvckNvZGUuRV8yOTksCisJICogRXJyb3JUeXBlLkNPTk5FQ1RJT05fUFJPQkxFTSwgQWxhcm1TZXZlcml0eS5DUklUSUNBTCwKKwkgKiBFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwKKwkgKiAKKwkgKiBCZUNvbXBvbmVudE1pc3NpbmdFcnJvcihFY29tcEVycm9yQ29kZS5FXzMwMCwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBCZUluY29ycmVjdENvbXBvbmVudEVycm9yKEVjb21wRXJyb3JDb2RlLkVfMzAxLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvcihFY29tcEVycm9yQ29kZS5FXzMwMiwgRXJyb3JUeXBlLkNPTkZJR19FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwKKwkgKiBCZVVlYk9iamVjdE5vdEZvdW5kRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8zMDMsIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRGlzdHJpYnV0aW9uRW5naW5lSW52YWxpZEFydGlmYWN0VHlwZShFY29tcEVycm9yQ29kZS5FXzMwNCwKKwkgKiBFcnJvclR5cGUuREFUQV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5XQVJOSU5HKSwKKwkgKiBCZU1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8zMDUsIEVycm9yVHlwZS5DT05GSUdfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5GQVRBTCksCisJICogQmVDb25maWd1cmF0aW9uSW52YWxpZExpc3RTaXplRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8zMDYsCisJICogRXJyb3JUeXBlLkNPTkZJR19FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5GQVRBTCksCisJICogRXJyb3JDb25maWdGaWxlRm9ybWF0KEVjb21wRXJyb3JDb2RlLkVfMzA3LCBFcnJvclR5cGUuQ09ORklHX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlTWlzc2luZ0FydGlmYWN0SW5mb3JtYXRpb25FcnJvcihFY29tcEVycm9yQ29kZS5FXzMwOCwKKwkgKiBFcnJvclR5cGUuREFUQV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogQmVBcnRpZmFjdE1pc3NpbmdFcnJvcihFY29tcEVycm9yQ29kZS5FXzMwOSwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogQmVVc2VyTWlzc2luZ0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfMzEwLCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBFY29tcE1pc21hdGNoUGFyYW0oRWNvbXBFcnJvckNvZGUuRV8zMTEsIEVycm9yVHlwZS5DT05GSUdfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogRWNvbXBNaXNzaW5nRXJyb3IoRWNvbXBFcnJvckNvZGUuRV8zMTIsIEVycm9yVHlwZS5DT05GSUdfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogCisJICogSW50ZXJuYWxEYXRhSW5mbyhFY29tcEVycm9yQ29kZS5FXzM5OSwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5JTkZPUk1BVElPTkFMLCBFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OKSwKKwkgKiBJbnRlcm5hbERhdGFXYXJuaW5nKEVjb21wRXJyb3JDb2RlLkVfMzk5LCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1JTk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLAorCSAqIEludGVybmFsRGF0YUVycm9yKEVjb21wRXJyb3JDb2RlLkVfMzk5LCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBJbnRlcm5hbERhdGFGYXRhbChFY29tcEVycm9yQ29kZS5FXzM5OSwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5GQVRBTCksCisJICogCisJICogQmVJbnZhbGlkVHlwZUVycm9yKEVjb21wRXJyb3JDb2RlLkVfNDAwLCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLAorCSAqIEJlSW52YWxpZFZhbHVlRXJyb3IoRWNvbXBFcnJvckNvZGUuRV80MDEsIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uV0FSTklORyksCisJICogQmVBcnRpZmFjdFBheWxvYWRJbnZhbGlkKEVjb21wRXJyb3JDb2RlLkVfNDAyLCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBCZUFydGlmYWN0SW5mb3JtYXRpb25JbnZhbGlkRXJyb3IoRWNvbXBFcnJvckNvZGUuRV80MDMsCisJICogRXJyb3JUeXBlLkRBVEFfRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRGlzdHJpYnV0aW9uTWlzc2luZ0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfNDA0LCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBCZUdyYXBoT2JqZWN0TWlzc2luZ0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfNDA0LCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBCZUludmFsaWRKc29uSW5wdXQoRWNvbXBFcnJvckNvZGUuRV80MDUsIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogCisJICogSW52YWxpZElucHV0SW5mbyhFY29tcEVycm9yQ29kZS5FXzQ5OSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5LklORk9STUFUSU9OQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uSU5GT1JNQVRJT04pLAorCSAqIEludmFsaWRJbnB1dFdhcm5pbmcoRWNvbXBFcnJvckNvZGUuRV80OTksIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NSU5PUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5XQVJOSU5HKSwKKwkgKiBJbnZhbGlkSW5wdXRFcnJvcihFY29tcEVycm9yQ29kZS5FXzQ5OSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBJbnZhbGlkSW5wdXRGYXRhbChFY29tcEVycm9yQ29kZS5FXzQ5OSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSwKKwkgKiAKKwkgKiBCZUluaXRpYWxpemF0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MDAsIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogQmVGYWlsZWRBZGRpbmdSZXNvdXJjZUluc3RhbmNlRXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MDEsCisJICogRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwgQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogQmVVZWJTeXN0ZW1FcnJvcihFY29tcEVycm9yQ29kZS5FXzUwMiwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBCZURpc3RyaWJ1dGlvbkVuZ2luZVN5c3RlbUVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTAzLAorCSAqIEVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRmFpbGVkQWRkaW5nTm9kZVR5cGVFcnJvcihFY29tcEVycm9yQ29kZS5FXzUwNCwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogQmVEYW9TeXN0ZW1FcnJvcihFY29tcEVycm9yQ29kZS5FXzUwNSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBCZVN5c3RlbUVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTA2LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRXhlY3V0ZVJvbGxiYWNrRXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MDcsIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRmFpbGVkTG9ja09iamVjdEVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTA4LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uV0FSTklORyksCisJICogQmVGYWlsZWRDcmVhdGVOb2RlRXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MDksIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRmFpbGVkVXBkYXRlTm9kZUVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTEwLCBFcnJvclR5cGUuREFUQV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBCZUZhaWxlZERlbGV0ZU5vZGVFcnJvcihFY29tcEVycm9yQ29kZS5FXzUxMSwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcihFY29tcEVycm9yQ29kZS5FXzUxMiwgRXJyb3JUeXBlLkRBVEFfRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogQmVGYWlsZWRGaW5kUGFyZW50RXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MTMsIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRmFpbGVkRmluZEFsbE5vZGVzRXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MTQsIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlRmFpbGVkRmluZEFzc29jaWF0aW9uRXJyb3IoRWNvbXBFcnJvckNvZGUuRV81MTUsIEVycm9yVHlwZS5EQVRBX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEJlQ29tcG9uZW50Q2xlYW5lclN5c3RlbUVycm9yKEVjb21wRXJyb3JDb2RlLkVfNTE2LAorCSAqIEVycm9yVHlwZS5TWVNURU1fRVJST1IsIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEZlSHR0cExvZ2dpbmdFcnJvcihFY29tcEVycm9yQ29kZS5FXzUxNywgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1JTk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiBGZVBvcnRhbFNlcnZsZXRFcnJvcihFY29tcEVycm9yQ29kZS5FXzUxOCwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1BSk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SKSwKKwkgKiAKKwkgKiBJbnRlcm5hbEZsb3dJbmZvKEVjb21wRXJyb3JDb2RlLkVfNTk5LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuSU5GT1JNQVRJT05BTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTiksCisJICogSW50ZXJuYWxGbG93V2FybmluZyhFY29tcEVycm9yQ29kZS5FXzU5OSwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5Lk1JTk9SLCBFY29tcENsYXNzaWZpY2F0aW9uLldBUk5JTkcpLAorCSAqIEludGVybmFsRmxvd0Vycm9yKEVjb21wRXJyb3JDb2RlLkVfNTk5LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUFKT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IpLAorCSAqIEludGVybmFsRmxvd0ZhdGFsKEVjb21wRXJyb3JDb2RlLkVfNTk5LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uRkFUQUwpLAorCSAqIAorCSAqIEJlUmVzdEFwaUdlbmVyYWxFcnJvcihFY29tcEVycm9yQ29kZS5FXzkwMCwgRXJyb3JUeXBlLlNZU1RFTV9FUlJPUiwKKwkgKiBBbGFybVNldmVyaXR5LkNSSVRJQ0FMLCBFY29tcENsYXNzaWZpY2F0aW9uLkVSUk9SLCBudWxsKSwKKwkgKiBGZUhlYWx0aENoZWNrR2VuZXJhbEVycm9yKEVjb21wRXJyb3JDb2RlLkVfOTAxLCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuQ1JJVElDQUwsIEVjb21wQ2xhc3NpZmljYXRpb24uRVJST1IsIG51bGwpLAorCSAqIAorCSAqIEludGVybmFsVW5leHBlY3RlZEluZm8oRWNvbXBFcnJvckNvZGUuRV85OTksIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5JTkZPUk1BVElPTkFMLCBFY29tcENsYXNzaWZpY2F0aW9uLklORk9STUFUSU9OKSwKKwkgKiBJbnRlcm5hbFVuZXhwZWN0ZWRXYXJuaW5nKEVjb21wRXJyb3JDb2RlLkVfOTk5LCBFcnJvclR5cGUuU1lTVEVNX0VSUk9SLAorCSAqIEFsYXJtU2V2ZXJpdHkuTUlOT1IsIEVjb21wQ2xhc3NpZmljYXRpb24uV0FSTklORyksCisJICogSW50ZXJuYWxVbmV4cGVjdGVkRXJyb3IoRWNvbXBFcnJvckNvZGUuRV85OTksIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5NQUpPUiwgRWNvbXBDbGFzc2lmaWNhdGlvbi5FUlJPUiksCisJICogSW50ZXJuYWxVbmV4cGVjdGVkRmF0YWwoRWNvbXBFcnJvckNvZGUuRV85OTksIEVycm9yVHlwZS5TWVNURU1fRVJST1IsCisJICogQWxhcm1TZXZlcml0eS5DUklUSUNBTCwgRWNvbXBDbGFzc2lmaWNhdGlvbi5GQVRBTCksCisJICovCisKKwk7CisKKwlFY29tcEVycm9yQ29kZSBlY29tcEVycm9yQ29kZTsKKwlFcnJvclR5cGUgZVR5cGU7CisJQWxhcm1TZXZlcml0eSBhbGFybVNldmVyaXR5OworCUVjb21wQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb247CisJRWNvbXBFcnJvckVudW0gY2xlYXJDb2RlOworCisJRWNvbXBFcnJvckVudW0oRWNvbXBFcnJvckNvZGUgZWNvbXBFcnJvckNvZGUsIEVycm9yVHlwZSBlVHlwZSwgQWxhcm1TZXZlcml0eSBhbGFybVNldmVyaXR5LAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiwgRWNvbXBFcnJvckVudW0gY2xlYXJDb2RlKSB7CisKKwkJdGhpcy5lY29tcEVycm9yQ29kZSA9IGVjb21wRXJyb3JDb2RlOworCQl0aGlzLmVUeXBlID0gZVR5cGU7CisJCXRoaXMuYWxhcm1TZXZlcml0eSA9IGFsYXJtU2V2ZXJpdHk7CisJCXRoaXMuY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbjsKKwkJdGhpcy5jbGVhckNvZGUgPSBjbGVhckNvZGU7CisJfQorCisJRWNvbXBFcnJvckVudW0oRWNvbXBFcnJvckNvZGUgZWNvbXBFcnJvckNvZGUsIEVycm9yVHlwZSBlVHlwZSwgQWxhcm1TZXZlcml0eSBhbGFybVNldmVyaXR5LAorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbikgeworCisJCXRoaXMuZWNvbXBFcnJvckNvZGUgPSBlY29tcEVycm9yQ29kZTsKKwkJdGhpcy5lVHlwZSA9IGVUeXBlOworCQl0aGlzLmFsYXJtU2V2ZXJpdHkgPSBhbGFybVNldmVyaXR5OworCQl0aGlzLmNsYXNzaWZpY2F0aW9uID0gY2xhc3NpZmljYXRpb247CisJfQorCisJcHVibGljIEVycm9yVHlwZSBnZXRlVHlwZSgpIHsKKwkJcmV0dXJuIGVUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldGVUeXBlKEVycm9yVHlwZSBlVHlwZSkgeworCQl0aGlzLmVUeXBlID0gZVR5cGU7CisJfQorCisJcHVibGljIEFsYXJtU2V2ZXJpdHkgZ2V0QWxhcm1TZXZlcml0eSgpIHsKKwkJcmV0dXJuIGFsYXJtU2V2ZXJpdHk7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWxhcm1TZXZlcml0eShBbGFybVNldmVyaXR5IGFsYXJtU2V2ZXJpdHkpIHsKKwkJdGhpcy5hbGFybVNldmVyaXR5ID0gYWxhcm1TZXZlcml0eTsKKwl9CisKKwlwdWJsaWMgRWNvbXBFcnJvckNvZGUgZ2V0RWNvbXBFcnJvckNvZGUoKSB7CisJCXJldHVybiBlY29tcEVycm9yQ29kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFY29tcEVycm9yQ29kZShFY29tcEVycm9yQ29kZSBlY29tcEVycm9yQ29kZSkgeworCQl0aGlzLmVjb21wRXJyb3JDb2RlID0gZWNvbXBFcnJvckNvZGU7CisJfQorCisJcHVibGljIEVjb21wQ2xhc3NpZmljYXRpb24gZ2V0Q2xhc3NpZmljYXRpb24oKSB7CisJCXJldHVybiBjbGFzc2lmaWNhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDbGFzc2lmaWNhdGlvbihFY29tcENsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uKSB7CisJCXRoaXMuY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbjsKKwl9CisKKwlwdWJsaWMgRWNvbXBFcnJvckVudW0gZ2V0Q2xlYXJDb2RlKCkgeworCQlyZXR1cm4gY2xlYXJDb2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldENsZWFyQ29kZShFY29tcEVycm9yRW51bSBjbGVhckNvZGUpIHsKKwkJdGhpcy5jbGVhckNvZGUgPSBjbGVhckNvZGU7CisJfQorCisJcHVibGljIHN0YXRpYyBlbnVtIEVycm9yVHlwZSB7CisJCVJFQ09WRVJZLCBDT05GSUdfRVJST1IsIFNZU1RFTV9FUlJPUiwgREFUQV9FUlJPUiwgQ09OTkVDVElPTl9QUk9CTEVNLCBBVVRIRU5USUNBVElPTl9QUk9CTEVNCisJfQorCisJcHVibGljIHN0YXRpYyBlbnVtIEFsYXJtU2V2ZXJpdHkgeworCQlDUklUSUNBTCwgTUFKT1IsIE1JTk9SLCBJTkZPUk1BVElPTkFMLCBOT05FCisJfQorCisJLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkvLyByZXR1cm4gZVR5cGUgKyAiLCIgKyBlQ29kZSArICIsIiArIGRlc2M7CisJLy8gfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0Vjb21wRXJyb3JJbmZvLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvRWNvbXBFcnJvckluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZkMzRiCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0Vjb21wRXJyb3JJbmZvLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWc7CisKK3B1YmxpYyBjbGFzcyBFY29tcEVycm9ySW5mbyB7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCXByaXZhdGUgU3RyaW5nIGNvZGU7CisJcHJpdmF0ZSBTdHJpbmcgc2V2ZXJpdHk7CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisJcHJpdmF0ZSBTdHJpbmcgYWxhcm1TZXZlcml0eTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29kZSgpIHsKKwkJcmV0dXJuIGNvZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgY29kZSkgeworCQl0aGlzLmNvZGUgPSBjb2RlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2V2ZXJpdHkoKSB7CisJCXJldHVybiBzZXZlcml0eTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShTdHJpbmcgc2V2ZXJpdHkpIHsKKwkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QWxhcm1TZXZlcml0eSgpIHsKKwkJcmV0dXJuIGFsYXJtU2V2ZXJpdHk7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWxhcm1TZXZlcml0eShTdHJpbmcgYWxhcm1TZXZlcml0eSkgeworCQl0aGlzLmFsYXJtU2V2ZXJpdHkgPSBhbGFybVNldmVyaXR5OworCX0KKworCXB1YmxpYyB2b2lkIGNsb25lRGF0YShFY29tcEVycm9ySW5mbyBvdGhlcikgeworCQl0aGlzLnR5cGUgPSBvdGhlci5nZXRUeXBlKCk7CisJCXRoaXMuc2V2ZXJpdHkgPSBvdGhlci5nZXRTZXZlcml0eSgpOworCQl0aGlzLmRlc2NyaXB0aW9uID0gb3RoZXIuZ2V0RGVzY3JpcHRpb24oKTsKKwkJdGhpcy5jb2RlID0gb3RoZXIuZ2V0Q29kZSgpOworCQl0aGlzLmFsYXJtU2V2ZXJpdHkgPSBvdGhlci5nZXRBbGFybVNldmVyaXR5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0Vjb21wRXJyb3JMb2dVdGlsLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvRWNvbXBFcnJvckxvZ1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQ2MjVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0Vjb21wRXJyb3JMb2dVdGlsLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uRWNvbXBBbGFybVNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uRWNvbXBFcnJvclNldmVyaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uRWNvbXBFcnJvclR5cGU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTURDOworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBFY29tcEVycm9yTG9nVXRpbCB7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRUNPTVBfRVJST1JfVE1QTCA9ICJFVFlQRSA9IFwiJXNcIiBFTkFNRSA9IFwiJXNcIiBFQ09ERSA9IFwiJXNcIiBFQ09OVEVYVCA9IFwiJXNcIiBFREVTQyA9IFwiJXNcIiI7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEVjb21wRXJyb3JMb2dVdGlsLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVEFMX0VSUk9SX1BSRUZJWCA9ICJGQVRBTCBFUlJPUiEhICI7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZSBlY29tcEVycm9yTmFtZSwgRWNvbXBFcnJvckluZm8gZWNvbXBFcnJvckluZm8sCisJCQlTdHJpbmcgZWNvbXBFcnJvckNvbnRleHQsIFN0cmluZy4uLiBlY29tcERlc2NyaXB0aW9uUGFyYW1zKSB7CisJCWlmIChlY29tcEVycm9ySW5mbyAhPSBudWxsKSB7CisJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHNiLCBMb2NhbGUuVVMpOworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBlY29tcEVycm9ySW5mby5nZXREZXNjcmlwdGlvbigpOworCQkJCVN0cmluZyBzZXZlcml0eVN0ciA9IGVjb21wRXJyb3JJbmZvLmdldFNldmVyaXR5KCk7CisJCQkJRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uRWNvbXBFcnJvclNldmVyaXR5IHNldmVyaXR5ID0gRWNvbXBFcnJvclNldmVyaXR5LkVSUk9SOworCQkJCS8vIFNpbmNlIHRoZXJlIGlzIG5vIEZBVEFMIGxvZyBsZXZlbCwgdGhpcyBpcyBob3cgd2UgZGlzdGluZ3Vpc2gKKwkJCQkvLyB0aGUgRkFUQUwgZXJyb3JzCisJCQkJaWYgKHNldmVyaXR5U3RyLmVxdWFscyhFY29tcEVycm9yQ29uZmlndXJhdGlvbi5FY29tcEVycm9yU2V2ZXJpdHkuRkFUQUwubmFtZSgpKSkgeworCQkJCQlkZXNjcmlwdGlvbiA9IEZBVEFMX0VSUk9SX1BSRUZJWCArIGRlc2NyaXB0aW9uOworCQkJCQlzZXZlcml0eSA9IEVjb21wRXJyb3JTZXZlcml0eS5GQVRBTDsKKwkJCQl9IGVsc2UgaWYgKHNldmVyaXR5U3RyLmVxdWFscyhFY29tcEVycm9yQ29uZmlndXJhdGlvbi5FY29tcEVycm9yU2V2ZXJpdHkuV0FSTi5uYW1lKCkpKSB7CisJCQkJCXNldmVyaXR5ID0gRWNvbXBFcnJvclNldmVyaXR5LldBUk47CisJCQkJfSBlbHNlIGlmIChzZXZlcml0eVN0ci5lcXVhbHMoRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uRWNvbXBFcnJvclNldmVyaXR5LklORk8ubmFtZSgpKSkgeworCQkJCQlzZXZlcml0eSA9IEVjb21wRXJyb3JTZXZlcml0eS5JTkZPOworCQkJCX0KKworCQkJCU1EQy5wdXQoImFsYXJtU2V2ZXJpdHkiLCBlY29tcEVycm9ySW5mby5nZXRBbGFybVNldmVyaXR5KCkpOworCQkJCS8vIGVsc2UgaXQgc3RheXMgRVJST1IKKwkJCQlmb3JtYXR0ZXIuZm9ybWF0KEVDT01QX0VSUk9SX1RNUEwsIGVjb21wRXJyb3JJbmZvLmdldFR5cGUoKSwgZWNvbXBFcnJvck5hbWUubmFtZSgpLAorCQkJCQkJZWNvbXBFcnJvckluZm8uZ2V0Q29kZSgpLCBlY29tcEVycm9yQ29udGV4dCwgZGVzY3JpcHRpb24pOworCQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKKwkJCQljYXNlIElORk86CisJCQkJCWxvZy5pbmZvKGZvcm1hdHRlci50b1N0cmluZygpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXQVJOOgorCQkJCQlsb2cud2Fybihmb3JtYXR0ZXIudG9TdHJpbmcoKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRVJST1I6CisJCQkJCWxvZy5lcnJvcihmb3JtYXR0ZXIudG9TdHJpbmcoKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRkFUQUw6CisJCQkJCS8vIHNhbWUgYXMgRVJST1IgZm9yIG5vdywgbWlnaHQgYmUgYWRkaXRpb25hbCBsb2dpYyBsYXRlci4uCisJCQkJCWxvZy5lcnJvcihmb3JtYXR0ZXIudG9TdHJpbmcoKSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZmluYWxseSB7CisJCQkJZm9ybWF0dGVyLmNsb3NlKCk7CisJCQkJTURDLnJlbW92ZSgiYWxhcm1TZXZlcml0eSIpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vjb21wRXJyb3IoU3RyaW5nIGVjb21wRXJyb3JDb250ZXh0LCBFY29tcEVycm9yRW51bSBlY29tcEVycm9yRW51bSwKKwkJCVN0cmluZy4uLiBlY29tcERlc2NyaXB0aW9uUGFyYW1zKSB7CisJCWxvZ0Vjb21wRXJyb3IoZWNvbXBFcnJvckNvbnRleHQsIGVjb21wRXJyb3JFbnVtLCB0cnVlLCBlY29tcERlc2NyaXB0aW9uUGFyYW1zKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRWNvbXBFcnJvcihTdHJpbmcgZWNvbXBFcnJvckNvbnRleHQsIEVjb21wRXJyb3JFbnVtIGVjb21wRXJyb3JFbnVtLCBib29sZWFuIGxvZ01pc3NpbmdQYXJhbXMsCisJCQlTdHJpbmcuLi4gZWNvbXBEZXNjcmlwdGlvblBhcmFtcykgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoc2IsIExvY2FsZS5VUyk7CisJCXRyeSB7CisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBlY29tcEVycm9yRW51bS5nZXRFY29tcEVycm9yQ29kZSgpLmdldERlc2NyaXB0aW9uKCk7CisKKwkJCUVpdGhlcjxTdHJpbmcsIEJvb2xlYW4+IHNldERlc2NyaXB0aW9uUGFyYW1zUmVzdWx0ID0gc2V0RGVzY3JpcHRpb25QYXJhbXMoZWNvbXBFcnJvckVudW0sCisJCQkJCWVjb21wRGVzY3JpcHRpb25QYXJhbXMpOworCQkJaWYgKHNldERlc2NyaXB0aW9uUGFyYW1zUmVzdWx0LmlzTGVmdCgpKSB7CisJCQkJZGVzY3JpcHRpb24gPSBzZXREZXNjcmlwdGlvblBhcmFtc1Jlc3VsdC5sZWZ0KCkudmFsdWUoKTsKKwkJCX0gZWxzZSB7CisJCQkJRWNvbXBFcnJvckVudW0gbWlzbWF0Y2hFcnJvckVudW0gPSBFY29tcEVycm9yRW51bS5FY29tcE1pc21hdGNoUGFyYW07CisJCQkJaWYgKGxvZ01pc3NpbmdQYXJhbXMgPT0gdHJ1ZSkgeworCQkJCQlsb2dFY29tcEVycm9yKCJsb2dFY29tcEVycm9yIiwgbWlzbWF0Y2hFcnJvckVudW0sIGZhbHNlLCBlY29tcEVycm9yRW51bS5uYW1lKCkudG9TdHJpbmcoKSk7CisJCQkJCXJldHVybjsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2cuaW5mbygiRmFpbGVkIHRvIGxvZyB0aGUgZXJyb3IgY29kZSAiICsgbWlzbWF0Y2hFcnJvckVudW0pOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJRWNvbXBDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiA9IGVjb21wRXJyb3JFbnVtLmdldENsYXNzaWZpY2F0aW9uKCk7CisKKwkJCUVjb21wRXJyb3JDb25maWd1cmF0aW9uLkVjb21wRXJyb3JTZXZlcml0eSBzZXZlcml0eSA9IEVjb21wRXJyb3JTZXZlcml0eS5FUlJPUjsKKwkJCS8vIFNpbmNlIHRoZXJlIGlzIG5vIEZBVEFMIGxvZyBsZXZlbCwgdGhpcyBpcyBob3cgd2UgZGlzdGluZ3Vpc2ggdGhlCisJCQkvLyBGQVRBTCBlcnJvcnMKKwkJCWlmIChjbGFzc2lmaWNhdGlvbiA9PSBFY29tcENsYXNzaWZpY2F0aW9uLkZBVEFMKSB7CisJCQkJZGVzY3JpcHRpb24gPSBGQVRBTF9FUlJPUl9QUkVGSVggKyBkZXNjcmlwdGlvbjsKKwkJCQlzZXZlcml0eSA9IEVjb21wRXJyb3JTZXZlcml0eS5GQVRBTDsKKwkJCX0gZWxzZSBpZiAoY2xhc3NpZmljYXRpb24gPT0gRWNvbXBDbGFzc2lmaWNhdGlvbi5XQVJOSU5HKSB7CisJCQkJc2V2ZXJpdHkgPSBFY29tcEVycm9yU2V2ZXJpdHkuV0FSTjsKKwkJCX0gZWxzZSBpZiAoY2xhc3NpZmljYXRpb24gPT0gRWNvbXBDbGFzc2lmaWNhdGlvbi5JTkZPUk1BVElPTikgeworCQkJCXNldmVyaXR5ID0gRWNvbXBFcnJvclNldmVyaXR5LklORk87CisJCQl9CisKKwkJCVN0cmluZyBlQ29kZSA9IGNyZWF0ZUVjb2RlKGVjb21wRXJyb3JFbnVtKTsKKworCQkJTURDLnB1dCgiYWxhcm1TZXZlcml0eSIsIGVjb21wRXJyb3JFbnVtLmFsYXJtU2V2ZXJpdHkubmFtZSgpKTsKKwkJCS8vIGVsc2UgaXQgc3RheXMgRVJST1IKKwkJCWZvcm1hdHRlci5mb3JtYXQoRUNPTVBfRVJST1JfVE1QTCwgZWNvbXBFcnJvckVudW0uZ2V0ZVR5cGUoKSwgZWNvbXBFcnJvckVudW0ubmFtZSgpLCBlQ29kZSwKKwkJCQkJZWNvbXBFcnJvckNvbnRleHQsIGRlc2NyaXB0aW9uKTsKKwkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKKwkJCWNhc2UgSU5GTzoKKwkJCQlsb2cuaW5mbyhmb3JtYXR0ZXIudG9TdHJpbmcoKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFdBUk46CisJCQkJbG9nLndhcm4oZm9ybWF0dGVyLnRvU3RyaW5nKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBFUlJPUjoKKwkJCQlsb2cuZXJyb3IoZm9ybWF0dGVyLnRvU3RyaW5nKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBGQVRBTDoKKwkJCQkvLyBzYW1lIGFzIEVSUk9SIGZvciBub3csIG1pZ2h0IGJlIGFkZGl0aW9uYWwgbG9naWMgbGF0ZXIuLgorCQkJCWxvZy5lcnJvcihmb3JtYXR0ZXIudG9TdHJpbmcoKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJZm9ybWF0dGVyLmNsb3NlKCk7CisJCQlNREMucmVtb3ZlKCJhbGFybVNldmVyaXR5Iik7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFY29kZShFY29tcEVycm9yRW51bSBlY29tcEVycm9yRW51bSkgeworCisJCUVjb21wQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24gPSBlY29tcEVycm9yRW51bS5nZXRDbGFzc2lmaWNhdGlvbigpOworCQlTdHJpbmcgZWNvbXBFcnJvckNvZGUgPSBlY29tcEVycm9yRW51bS5nZXRFY29tcEVycm9yQ29kZSgpLm5hbWUoKTsKKworCQlTdHJpbmcgZWNvZGVOdW1iZXIgPSBlY29tcEVycm9yQ29kZS5zdWJzdHJpbmcoZWNvbXBFcnJvckNvZGUuaW5kZXhPZigiXyIpICsgMSk7CisJCVN0cmluZyBlQ29kZSA9ICJBU0RDIiArIGVjb2RlTnVtYmVyICsgY2xhc3NpZmljYXRpb24uZ2V0Q2xhc3NpZmljYXRpb24oKTsKKworCQlyZXR1cm4gZUNvZGU7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWl0aGVyPFN0cmluZywgQm9vbGVhbj4gc2V0RGVzY3JpcHRpb25QYXJhbXMoRWNvbXBFcnJvckVudW0gZWNvbXBFcnJvckVudW0sCisJCQlTdHJpbmcuLi4gZGVzY3JpcHRpb25QYXJhbXMpIHsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZWNvbXBFcnJvckVudW0uZ2V0RWNvbXBFcnJvckNvZGUoKS5nZXREZXNjcmlwdGlvbigpOworCisJCS8vIENvdW50aW5nIG51bWJlciBvZiBwYXJhbXMgaW4gZGVzY3JpcHRpb24KKwkJaW50IGNvdW50TWF0Y2hlcyA9IFN0cmluZ1V0aWxzLmNvdW50TWF0Y2hlcyhkZXNjcmlwdGlvbiwgQWJzRWNvbXBFcnJvck1hbmFnZXIuUEFSQU1fU1RSKTsKKwkJLy8gQ2F0Y2hpbmcgY2FzZXMgd2hlbiB0aGVyZSBhcmUgbW9yZSBwYXJhbXMgcGFzc2VkIHRoYW4gdGhlcmUgYXJlIGluCisJCS8vIHRoZSBkZXNjcmlwdGlvbiAoZm9ybWF0dGVyIHdpbGwgaWdub3JlIGV4dHJhIHBhcmFtcyBhbmQgd29uJ3QgdGhyb3cKKwkJLy8gZXhjZXB0aW9uKQorCQlpZiAoY291bnRNYXRjaGVzICE9IGRlc2NyaXB0aW9uUGFyYW1zLmxlbmd0aCkgeworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCX0KKwkJLy8gU2V0dGluZyBwYXJhbXMgb2YgdGhlIGRlc2NyaXB0aW9uIGlmIGFueQorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoc2IsIExvY2FsZS5VUyk7CisJCXRyeSB7CisJCQlmb3JtYXR0ZXIuZm9ybWF0KGRlc2NyaXB0aW9uLCAoT2JqZWN0W10pIGRlc2NyaXB0aW9uUGFyYW1zKS50b1N0cmluZygpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGZvcm1hdHRlci50b1N0cmluZygpKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBOdW1iZXIgb2YgcGFzc2VkIHBhcmFtcyBkb2Vzbid0IG1hdGNoIG51bWJlciBvZiBwYXJhbXMgaW4gY29uZmlnCisJCQkvLyBmaWxlCisJCQlyZXR1cm4gRWl0aGVyLnJpZ2h0KGZhbHNlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWZvcm1hdHRlci5jbG9zZSgpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcEVycm9yTmFtZS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0Vjb21wRXJyb3JOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkMTM5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9FY29tcEVycm9yTmFtZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnOworCitwdWJsaWMgZW51bSBFY29tcEVycm9yTmFtZSB7CisJLy8gZ2VuZXJhbAorCUVjb21wQ29uZmlnRmlsZUZvcm1hdCwgRWNvbXBFcnJvck5vdEZvdW5kLCBFY29tcEVycm9yRGVzY1BhcmFtc01pc21hdGNoLAorCisJLy8gRkUKKwlGZUhlYWx0aENoZWNrQ29ubmVjdGlvbkVycm9yLCBGZUhlYWx0aENoZWNrUmVjb3ZlcnkgLyogUmVjb3ZlcnkgKi8sIEZlSHR0cExvZ2dpbmdFcnJvciwgRmVQb3J0YWxTZXJ2bGV0RXJyb3IsIEZlSGVhbHRoQ2hlY2tHZW5lcmFsRXJyb3IsCisKKwkvLyBCRSBzZWN0aW9uIGhlcmUuLi4KKwlCZUhlYWx0aENoZWNrRXJyb3IsIEJlSGVhbHRoQ2hlY2tSZWNvdmVyeSwgLyogUmVjb3ZlcnkgKi8KKwlCZVJlc3RBcGlHZW5lcmFsRXJyb3IsIEJlSW5pdGlhbGl6YXRpb25FcnJvciwgQmVSZXNvdXJjZU1pc3NpbmdFcnJvciwgQmVTZXJ2aWNlTWlzc2luZ0Vycm9yLCBCZU1pc3NpbmdBcnRpZmFjdEluZm9ybWF0aW9uRXJyb3IsIEJlQXJ0aWZhY3RNaXNzaW5nRXJyb3IsIEJlQXJ0aWZhY3RQYXlsb2FkSW52YWxpZCwgQmVVc2VyTWlzc2luZ0Vycm9yLCBCZUFydGlmYWN0SW5mb3JtYXRpb25JbnZhbGlkRXJyb3IsIEJlSW5jb3JyZWN0U2VydmljZUVycm9yLCBCZUZhaWxlZEFkZGluZ1Jlc291cmNlSW5zdGFuY2VFcnJvciwKKwkvLyBCZUZhaWxlZERlbGV0aW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yLAorCUJlRmFpbGVkQWRkaW5nQ2FwYWJpbGl0eVR5cGVFcnJvciwgQmVDYXBhYmlsaXR5VHlwZU1pc3NpbmdFcnJvciwgQmVJbnRlcmZhY2VNaXNzaW5nRXJyb3IsCisJLy8gQmVSZXBvc2l0b3J5T2JqZWN0Tm90Rm91bmRFcnJvciwKKwkvLyBCZVJlcG9zaXRvcnlEZWxldGVFcnJvciwKKwkvLyBCZVJlcG9zaXRvcnlRdWVyeUVycm9yLAorCUJlRGFvU3lzdGVtRXJyb3IsIEJlU3lzdGVtRXJyb3IsIEJlSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvciwgQmVNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yLCBCZVVlYkNvbm5lY3Rpb25FcnJvciwgQmVVZWJPYmplY3ROb3RGb3VuZEVycm9yLCBCZVVlYlN5c3RlbUVycm9yLCBCZURpc3RyaWJ1dGlvbkVuZ2luZVN5c3RlbUVycm9yLCBCZURpc3RyaWJ1dGlvbkVuZ2luZUludmFsaWRBcnRpZmFjdFR5cGUsIEJlQ29uZmlndXJhdGlvbkludmFsaWRMaXN0U2l6ZUVycm9yLCBCZVVlYkF1dGhlbnRpY2F0aW9uRXJyb3IsIEJlVWViVW5rb3duSG9zdEVycm9yLCBCZUludmFsaWRUeXBlRXJyb3IsIEJlSW52YWxpZFZhbHVlRXJyb3IsIEJlRmFpbGVkTG9ja09iamVjdEVycm9yLCBCZUludmFsaWRKc29uSW5wdXQsIEJlRGlzdHJpYnV0aW9uTWlzc2luZ0Vycm9yLCBFcnJvckNvbmZpZ0ZpbGVGb3JtYXQsCisJLy8gbW9kZWwKKwlCZUZhaWxlZENyZWF0ZU5vZGVFcnJvciwgQmVGYWlsZWRVcGRhdGVOb2RlRXJyb3IsIEJlRmFpbGVkRGVsZXRlTm9kZUVycm9yLCBCZUZhaWxlZFJldHJpZXZlTm9kZUVycm9yLCBCZUV4ZWN1dGVSb2xsYmFja0Vycm9yLCBCZUZhaWxlZEZpbmRQYXJlbnRFcnJvciwgQmVGYWlsZWRGaW5kQWxsTm9kZXNFcnJvciwgQmVGYWlsZWRGaW5kQXNzb2NpYXRpb25FcnJvciwgQmVGYWlsZWRUb0Fzc29jaWF0ZUVycm9yLCBCZUNvbXBvbmVudENsZWFuZXJTeXN0ZW1FcnJvcjsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9JRWNvbXBDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0lFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2ZDhkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9JRWNvbXBDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnOworCitwdWJsaWMgaW50ZXJmYWNlIElFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyIHsKKwlwdWJsaWMgRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24gZ2V0RWNvbXBFcnJvckNvbmZpZ3VyYXRpb24oKTsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9JRWNvbXBFcnJvck1hbmFnZXIuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9JRWNvbXBFcnJvck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjlhYThlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vY29uZmlnL0lFY29tcEVycm9yTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnOworCitwdWJsaWMgaW50ZXJmYWNlIElFY29tcEVycm9yTWFuYWdlciB7CisKKwlwdWJsaWMgdm9pZCBwcm9jZXNzRWNvbXBFcnJvcihFY29tcEVycm9yTmFtZSBlY29tcEVycm9yTmFtZSwgU3RyaW5nIGVjb21wRXJyb3JDb250ZXh0LCBTdHJpbmcuLi4gZGVzY3JpcHRpb25QYXJhbXMpOworCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvZ2VuZXJhdGlvbi9HZW5lcmF0ZUVjb21wRXJyb3JzQ3N2LmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9jb25maWcvZ2VuZXJhdGlvbi9HZW5lcmF0ZUVjb21wRXJyb3JzQ3N2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1MzM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2NvbmZpZy9nZW5lcmF0aW9uL0dlbmVyYXRlRWNvbXBFcnJvcnNDc3YuamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuZ2VuZXJhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JMb2dVdGlsOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvckVudW0uQWxhcm1TZXZlcml0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkVjb21wRXJyb3JFbnVtLkVycm9yVHlwZTsKKworcHVibGljIGNsYXNzIEdlbmVyYXRlRWNvbXBFcnJvcnNDc3YgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERBVEVfRk9STUFUID0gImRkLU0teXl5eS1oaC1tbS1zcyI7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTkVXX0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKCkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5nZW5lcmF0aW9uLkdlbmVyYXRlRWNvbXBFcnJvcnNDc3YgPHRhcmdldCBmb2xkZXI+Iik7CisJCVN5c3RlbS5leGl0KDEpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKworCQlTdHJpbmcgdGFyZ2V0Rm9sZGVyID0gInRhcmdldCI7CisJCWlmIChhcmdzLmxlbmd0aCA+IDEpIHsKKwkJCXRhcmdldEZvbGRlciA9IGFyZ3NbMF07CisJCX0KKworCQlHZW5lcmF0ZUVjb21wRXJyb3JzQ3N2IGVjb21wRXJyb3JzQ3N2ID0gbmV3IEdlbmVyYXRlRWNvbXBFcnJvcnNDc3YoKTsKKworCQllY29tcEVycm9yc0Nzdi5nZW5lcmF0ZUVjb21wRXJyb3JzQ3N2RmlsZSh0YXJnZXRGb2xkZXIsIHRydWUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWNvbXBFcnJvclJvdyB7CisKKwkJU3RyaW5nIGVycm9yTmFtZTsKKwkJU3RyaW5nIGVycm9yQ29kZTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uOworCQlFcnJvclR5cGUgZXJyb3JUeXBlOworCQlBbGFybVNldmVyaXR5IGFsYXJtU2V2ZXJpdHk7CisJCVN0cmluZyBjbGVhbkVycm9yQ29kZTsKKwkJU3RyaW5nIHJlc29sdXRpb247CisKKwkJcHVibGljIFN0cmluZyBnZXRFcnJvck5hbWUoKSB7CisJCQlyZXR1cm4gZXJyb3JOYW1lOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RXJyb3JOYW1lKFN0cmluZyBlcnJvck5hbWUpIHsKKwkJCXRoaXMuZXJyb3JOYW1lID0gZXJyb3JOYW1lOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRFcnJvckNvZGUoKSB7CisJCQlyZXR1cm4gZXJyb3JDb2RlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RXJyb3JDb2RlKFN0cmluZyBlcnJvckNvZGUpIHsKKwkJCXRoaXMuZXJyb3JDb2RlID0gZXJyb3JDb2RlOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBkZXNjcmlwdGlvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQl9CisKKwkJcHVibGljIEVycm9yVHlwZSBnZXRFcnJvclR5cGUoKSB7CisJCQlyZXR1cm4gZXJyb3JUeXBlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0RXJyb3JUeXBlKEVycm9yVHlwZSBlcnJvclR5cGUpIHsKKwkJCXRoaXMuZXJyb3JUeXBlID0gZXJyb3JUeXBlOworCQl9CisKKwkJcHVibGljIEFsYXJtU2V2ZXJpdHkgZ2V0QWxhcm1TZXZlcml0eSgpIHsKKwkJCXJldHVybiBhbGFybVNldmVyaXR5OworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0QWxhcm1TZXZlcml0eShBbGFybVNldmVyaXR5IGFsYXJtU2V2ZXJpdHkpIHsKKwkJCXRoaXMuYWxhcm1TZXZlcml0eSA9IGFsYXJtU2V2ZXJpdHk7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldENsZWFuRXJyb3JDb2RlKCkgeworCQkJcmV0dXJuIGNsZWFuRXJyb3JDb2RlOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0Q2xlYW5FcnJvckNvZGUoU3RyaW5nIGNsZWFuRXJyb3JDb2RlKSB7CisJCQl0aGlzLmNsZWFuRXJyb3JDb2RlID0gY2xlYW5FcnJvckNvZGU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFJlc29sdXRpb24oKSB7CisJCQlyZXR1cm4gcmVzb2x1dGlvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFJlc29sdXRpb24oU3RyaW5nIHJlc29sdXRpb24pIHsKKwkJCXRoaXMucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisJCX0KKworCX0KKworCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlRWNvbXBFcnJvcnNDc3ZGaWxlKFN0cmluZyB0YXJnZXRGb2xkZXIsIGJvb2xlYW4gYWRkVGltZVRvRmlsZU5hbWUpIHsKKworCQl0YXJnZXRGb2xkZXIgKz0gRmlsZS5zZXBhcmF0b3I7CisKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJU3RyaW5nIGRhdGVGb3JtYXR0ZWQgPSAiIjsKKworCQlpZiAoYWRkVGltZVRvRmlsZU5hbWUgPT0gdHJ1ZSkgeworCQkJRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoREFURV9GT1JNQVQpOworCisJCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOworCisJCQlkYXRlRm9ybWF0dGVkID0gIi4iICsgZGF0ZUZvcm1hdC5mb3JtYXQoZGF0ZSk7CisKKwkJfQorCisJCVN0cmluZyBvdXRwdXRGaWxlID0gdGFyZ2V0Rm9sZGVyICsgImVjb21wRXJyb3JDb2RlcyIgKyBkYXRlRm9ybWF0dGVkICsgIi5jc3YiOworCisJCUZpbGVXcml0ZXIgd3JpdGVyID0gbnVsbDsKKworCQl0cnkgeworCQkJd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0cHV0RmlsZSk7CisKKwkJCUxpc3Q8RWNvbXBFcnJvclJvdz4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJCWZvciAoRWNvbXBFcnJvckVudW0gZWNvbXBFcnJvckVudW0gOiBFY29tcEVycm9yRW51bS52YWx1ZXMoKSkgeworCisJCQkJRWNvbXBFcnJvclJvdyBlY29tcEVycm9yUm93ID0gbmV3IEVjb21wRXJyb3JSb3coKTsKKworCQkJCVN0cmluZyBlcnJvckNvZGUgPSBFY29tcEVycm9yTG9nVXRpbC5jcmVhdGVFY29kZShlY29tcEVycm9yRW51bSk7CisKKwkJCQlFY29tcEVycm9yRW51bSBjbGVhckNvZGVFbnVtID0gZWNvbXBFcnJvckVudW0uZ2V0Q2xlYXJDb2RlKCk7CisJCQkJU3RyaW5nIGNsZWFuRXJyb3JDb2RlID0gbnVsbDsKKwkJCQlpZiAoY2xlYXJDb2RlRW51bSAhPSBudWxsKSB7CisJCQkJCWNsZWFuRXJyb3JDb2RlID0gRWNvbXBFcnJvckxvZ1V0aWwuY3JlYXRlRWNvZGUoY2xlYXJDb2RlRW51bSk7CisJCQkJfQorCisJCQkJZWNvbXBFcnJvclJvdy5zZXRBbGFybVNldmVyaXR5KGVjb21wRXJyb3JFbnVtLmdldEFsYXJtU2V2ZXJpdHkoKSk7CisJCQkJZWNvbXBFcnJvclJvdy5zZXRDbGVhbkVycm9yQ29kZShjbGVhbkVycm9yQ29kZSk7CisJCQkJZWNvbXBFcnJvclJvdy5zZXREZXNjcmlwdGlvbihlY29tcEVycm9yRW51bS5nZXRFY29tcEVycm9yQ29kZSgpLmdldERlc2NyaXB0aW9uKCkpOworCQkJCWVjb21wRXJyb3JSb3cuc2V0RXJyb3JDb2RlKGVycm9yQ29kZSk7CisJCQkJZWNvbXBFcnJvclJvdy5zZXRFcnJvck5hbWUoZWNvbXBFcnJvckVudW0ubmFtZSgpLnRvU3RyaW5nKCkpOworCQkJCWVjb21wRXJyb3JSb3cuc2V0RXJyb3JUeXBlKGVjb21wRXJyb3JFbnVtLmdldGVUeXBlKCkpOworCQkJCWVjb21wRXJyb3JSb3cuc2V0UmVzb2x1dGlvbihlY29tcEVycm9yRW51bS5nZXRFY29tcEVycm9yQ29kZSgpLmdldFJlc29sdXRpb24oKSk7CisKKwkJCQllcnJvcnMuYWRkKGVjb21wRXJyb3JSb3cpOworCQkJfQorCisJCQl3cml0ZUhlYWRlcnMod3JpdGVyKTsKKworCQkJZm9yIChFY29tcEVycm9yUm93IGVjb21wRXJyb3JSb3cgOiBlcnJvcnMpIHsKKwkJCQl3cml0ZXIuYXBwZW5kKGFkZEludmVydGVkQ29tbWFzKGVjb21wRXJyb3JSb3cuZ2V0RXJyb3JDb2RlKCkpKTsKKwkJCQl3cml0ZXIuYXBwZW5kKCcsJyk7CisJCQkJd3JpdGVyLmFwcGVuZChhZGRJbnZlcnRlZENvbW1hcyhlY29tcEVycm9yUm93LmdldEVycm9yVHlwZSgpLnRvU3RyaW5nKCkpKTsKKwkJCQl3cml0ZXIuYXBwZW5kKCcsJyk7CisJCQkJd3JpdGVyLmFwcGVuZChhZGRJbnZlcnRlZENvbW1hcyhlY29tcEVycm9yUm93LmdldERlc2NyaXB0aW9uKCkpKTsKKwkJCQl3cml0ZXIuYXBwZW5kKCcsJyk7CisJCQkJd3JpdGVyLmFwcGVuZChhZGRJbnZlcnRlZENvbW1hcyhlY29tcEVycm9yUm93LmdldFJlc29sdXRpb24oKSkpOworCQkJCXdyaXRlci5hcHBlbmQoJywnKTsKKwkJCQl3cml0ZXIuYXBwZW5kKGFkZEludmVydGVkQ29tbWFzKGVjb21wRXJyb3JSb3cuZ2V0QWxhcm1TZXZlcml0eSgpLnRvU3RyaW5nKCkpKTsKKwkJCQl3cml0ZXIuYXBwZW5kKCcsJyk7CisJCQkJd3JpdGVyLmFwcGVuZChhZGRJbnZlcnRlZENvbW1hcyhlY29tcEVycm9yUm93LmdldEVycm9yTmFtZSgpKSk7CisJCQkJd3JpdGVyLmFwcGVuZCgnLCcpOworCQkJCXdyaXRlci5hcHBlbmQoYWRkSW52ZXJ0ZWRDb21tYXMoZWNvbXBFcnJvclJvdy5nZXRDbGVhbkVycm9yQ29kZSgpKSk7CisJCQkJd3JpdGVyLmFwcGVuZChORVdfTElORSk7CisJCQl9CisKKwkJCXJlc3VsdCA9IHRydWU7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gZmluYWxseSB7CisJCQlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQl3cml0ZXIuZmx1c2goKTsKKwkJCQkJd3JpdGVyLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUhlYWRlcnMoRmlsZVdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJd3JpdGVyLmFwcGVuZCgiXCJFUlJPUiBDT0RFXCIiKTsKKwkJd3JpdGVyLmFwcGVuZCgnLCcpOworCQl3cml0ZXIuYXBwZW5kKCJcIkVSUk9SIFRZUEVcIiIpOworCQl3cml0ZXIuYXBwZW5kKCcsJyk7CisJCXdyaXRlci5hcHBlbmQoIlwiREVTQ1JJUFRJT05cIiIpOworCQl3cml0ZXIuYXBwZW5kKCcsJyk7CisJCXdyaXRlci5hcHBlbmQoIlwiUkVTT0xVVElPTlwiIik7CisJCXdyaXRlci5hcHBlbmQoJywnKTsKKwkJd3JpdGVyLmFwcGVuZCgiXCJBTEFSTSBTRVZFUklUWVwiIik7CisJCXdyaXRlci5hcHBlbmQoJywnKTsKKwkJd3JpdGVyLmFwcGVuZCgiXCJFUlJPUiBOQU1FXCIiKTsKKwkJd3JpdGVyLmFwcGVuZCgnLCcpOworCQl3cml0ZXIuYXBwZW5kKCJcIkNMRUFOIENPREVcIiIpOworCQl3cml0ZXIuYXBwZW5kKE5FV19MSU5FKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBhZGRJbnZlcnRlZENvbW1hcyhTdHJpbmcgc3RyKSB7CisKKwkJaWYgKHN0ciA9PSBudWxsKSB7CisJCQlyZXR1cm4gIlwiXCIiOworCQl9CisKKwkJcmV0dXJuICJcIiIgKyBzdHIgKyAiXCIiOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vZGF0YXN0cnVjdHVyZS9BdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL0F1ZGl0aW5nRmllbGRzS2V5c0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNkNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vZGF0YXN0cnVjdHVyZS9BdWRpdGluZ0ZpZWxkc0tleXNFbnVtLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZTsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitwdWJsaWMgZW51bSBBdWRpdGluZ0ZpZWxkc0tleXNFbnVtIHsKKwkvLyBHZW5lcmFsCisJQVVESVRfVElNRVNUQU1QKERhdGUuY2xhc3MsICJUSU1FU1RBTVAiKSwgCisJQVVESVRfQUNUSU9OKFN0cmluZy5jbGFzcywgIkFDVElPTiIpLCAKKwlBVURJVF9NT0RJRklFUl9OQU1FKFN0cmluZy5jbGFzcywgIk1PRElGSUVSX0lEIiksIAorCUFVRElUX01PRElGSUVSX1VJRChTdHJpbmcuY2xhc3MsICJNT0RJRklFUiIpLCAKKwlBVURJVF9TVEFUVVMoU3RyaW5nLmNsYXNzLCAiU1RBVFVTIiksIAorCUFVRElUX0RFU0MoU3RyaW5nLmNsYXNzLCAiREVTQyIpLCAKKwlBVURJVF9TRVJWSUNFX0lOU1RBTkNFX0lEKFN0cmluZy5jbGFzcywgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiKSwgCisJQVVESVRfSU5WQVJJQU5UX1VVSUQoU3RyaW5nLmNsYXNzLCAiSU5WQVJJQU5UX1VVSUQiKSwgCisJQVVESVRfUkVRVUVTVF9JRChTdHJpbmcuY2xhc3MsICJSRVFVRVNUX0lEIiksCisKKwkvLyBVc2VycyBhZG1pbmlzdHJhdGlvbgorCUFVRElUX1VTRVJfVUlEKFN0cmluZy5jbGFzcywgIlVTRVIiKSwgCisJQVVESVRfVVNFUl9CRUZPUkUoU3RyaW5nLmNsYXNzLCAiVVNFUl9CRUZPUkUiKSwgCisJQVVESVRfVVNFUl9BRlRFUihTdHJpbmcuY2xhc3MsICJVU0VSX0FGVEVSIiksIAorCUFVRElUX1VTRVJfREVUQUlMUyhTdHJpbmcuY2xhc3MsICJERVRBSUxTIiksCisKKwkvLyBSZXNvdXJjZSBhZG1pbmlzdHJhdGlvbgorCUFVRElUX1JFU09VUkNFX05BTUUoU3RyaW5nLmNsYXNzLCAiUkVTT1VSQ0VfTkFNRSIpLCAKKwlBVURJVF9SRVNPVVJDRV9UWVBFKFN0cmluZy5jbGFzcywgIlJFU09VUkNFX1RZUEUiKSwgCisJQVVESVRfUkVTT1VSQ0VfQ1VSUl9WRVJTSU9OKFN0cmluZy5jbGFzcywgIkNVUlJfVkVSU0lPTiIpLCAKKwlBVURJVF9SRVNPVVJDRV9QUkVWX1ZFUlNJT04oU3RyaW5nLmNsYXNzLCAiUFJFVl9WRVJTSU9OIiksIAorCUFVRElUX1JFU09VUkNFX0NVUlJfU1RBVEUoU3RyaW5nLmNsYXNzLCAiQ1VSUl9TVEFURSIpLCAKKwlBVURJVF9SRVNPVVJDRV9QUkVWX1NUQVRFKFN0cmluZy5jbGFzcywgIlBSRVZfU1RBVEUiKSwgCisJQVVESVRfUkVTT1VSQ0VfQ09NTUVOVChTdHJpbmcuY2xhc3MsICJDT01NRU5UIiksIAorCUFVRElUX0FSVElGQUNUX0RBVEEoU3RyaW5nLmNsYXNzLCAiQVJUSUZBQ1RfREFUQSIpLCAKKwlBVURJVF9QUkVWX0FSVElGQUNUX1VVSUQoU3RyaW5nLmNsYXNzLCAiUFJFVl9BUlRJRkFDVF9VVUlEIiksIAorCUFVRElUX0NVUlJfQVJUSUZBQ1RfVVVJRChTdHJpbmcuY2xhc3MsICJDVVJSX0FSVElGQUNUX1VVSUQiKSwgCisJQVVESVRfUkVTT1VSQ0VfRFBSRVZfU1RBVFVTKFN0cmluZy5jbGFzcywgIkRQUkVWX1NUQVRVUyIpLCAKKwlBVURJVF9SRVNPVVJDRV9EQ1VSUl9TVEFUVVMoU3RyaW5nLmNsYXNzLCAiRENVUlJfU1RBVFVTIiksIAorCUFVRElUX1JFU09VUkNFX1RPU0NBX05PREVfVFlQRShTdHJpbmcuY2xhc3MsICJUT1NDQV9OT0RFX1RZUEUiKSwKKworCS8vIERpc3RyaWJ1dGlvbiBFbmdpbmUKKwlBVURJVF9ESVNUUklCVVRJT05fRU5WUklPTk1FTlRfTkFNRShTdHJpbmcuY2xhc3MsICJEX0VOViIpLCAKKwlBVURJVF9ESVNUUklCVVRJT05fVE9QSUNfTkFNRShTdHJpbmcuY2xhc3MsICJUT1BJQ19OQU1FIiksCisgICAgQVVESVRfRElTVFJJQlVUSU9OX05PVElGSUNBVElPTl9UT1BJQ19OQU1FKFN0cmluZy5jbGFzcywgIkROT1RJRl9UT1BJQyIpLCAKKyAgICBBVURJVF9ESVNUUklCVVRJT05fU1RBVFVTX1RPUElDX05BTUUoU3RyaW5nLmNsYXNzLCAiRFNUQVRVU19UT1BJQyIpLAorICAgIEFVRElUX0RJU1RSSUJVVElPTl9ST0xFKFN0cmluZy5jbGFzcywgIlJPTEUiKSwgCisgICAgQVVESVRfRElTVFJJQlVUSU9OX0lEKFN0cmluZy5jbGFzcywgIkRJRCIpLCAKKyAgICBBVURJVF9ESVNUUklCVVRJT05fQVBJX0tFWShTdHJpbmcuY2xhc3MsICJBUElfS0VZIiksIAorICAgIEFVRElUX0RJU1RSSUJVVElPTl9DT05TVU1FUl9JRChTdHJpbmcuY2xhc3MsICJDT05TVU1FUl9JRCIpLCAKKyAgICBBVURJVF9ESVNUUklCVVRJT05fUkVTT1VSQ0VfVVJMKFN0cmluZy5jbGFzcywgIlJFU09VUkNFX1VSTCIpLCAKKyAgICBBVURJVF9ESVNUUklCVVRJT05fU1RBVFVTX1RJTUUoU3RyaW5nLmNsYXNzLCAiU1RBVFVTX1RJTUUiKSwgCisgICAgQVVESVRfRElTVFJJQlVUSU9OX1NUQVRVU19ERVNDKFN0cmluZy5jbGFzcywgIlNUQVRVU19ERVNDIiksCisKKwkvLyBjYXRlZ29yeQorCUFVRElUX0NBVEVHT1JZX05BTUUoU3RyaW5nLmNsYXNzLCAiQ0FURUdPUllfTkFNRSIpLCAKKwlBVURJVF9TVUJfQ0FURUdPUllfTkFNRShTdHJpbmcuY2xhc3MsICJTVUJfQ0FURUdPUllfTkFNRSIpLCAKKwlBVURJVF9HUk9VUElOR19OQU1FKFN0cmluZy5jbGFzcywgIkdST1VQSU5HX05BTUUiKSwgCisJQVVESVRfREVUQUlMUyhTdHJpbmcuY2xhc3MsICJERVRBSUxTIiksCisKKwkvLyBhdXRoZW50aWNhdGlvbgorCUFVRElUX0FVVEhfVVJMKFN0cmluZy5jbGFzcywgIlVSTCIpLCAKKwlBVURJVF9BVVRIX1VTRVIoU3RyaW5nLmNsYXNzLCAiVVNFUiIpLCAKKwlBVURJVF9BVVRIX1NUQVRVUyhTdHJpbmcuY2xhc3MsICJBVVRIX1NUQVRVUyIpLCAKKwlBVURJVF9BVVRIX1JFQUxNKFN0cmluZy5jbGFzcywgIlJFQUxNIiksCisJQVVESVRfRUNPTVBfVVNFUihTdHJpbmcuY2xhc3MsICJFQ09NUF9VU0VSIik7CisKKwlwcml2YXRlIENsYXNzPD8+IGNsYXp6OworCXByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lOworCisJQXVkaXRpbmdGaWVsZHNLZXlzRW51bShDbGFzczw/PiBjbGF6eiwgU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisJCXRoaXMuY2xhenogPSBjbGF6ejsKKwkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworCX0KKworCXB1YmxpYyBDbGFzczw/PiBnZXRWYWx1ZUNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5jbGF6ejsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworCQlyZXR1cm4gZGlzcGxheU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisJCXRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL0NhcExpc3QuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2RhdGFzdHJ1Y3R1cmUvQ2FwTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDI3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL0NhcExpc3QuamF2YQpAQCAtMCwwICsxLDMyNCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKKy8qKgorICogVGhyZWFkIFNhZmUgTGlzdCB3aXRoIGEgY2FwIGZvciBNYXggZWxlbWVudHMuPGJyPgorICogSWYgYW4gZWxlbWVudCB3b3VsZCBiZSBpbnNlcnRlZCB0byB0aGUgbGlzdCBhbmQgaXQgaXMgZnVsbCwgdGhlIG9sZGVzdAorICogZWxlbWVudCB3aWxsIGJlIHRha2VuIG91dC4KKyAqIAorICogQGF1dGhvciBtc2hpdHJpdAorICoKKyAqIEBwYXJhbSA8VD4KKyAqLworcHVibGljIGNsYXNzIENhcExpc3Q8VD4gaW1wbGVtZW50cyBMaXN0PFQ+IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVAgPSAxMDAwOworCXByaXZhdGUgaW50IGNhcDsKKwlwcml2YXRlIFJlYWRXcml0ZUxvY2sgcmVhZFdyaXRlTG9jazsKKwlwcml2YXRlIExpc3Q8VD4gaW5uZXJMaXN0OworCisJcHVibGljIENhcExpc3QoKSB7CisJCXRoaXMoREVGQVVMVF9DQVApOworCX0KKworCXB1YmxpYyBDYXBMaXN0KGludCBjYXApIHsKKwkJaWYgKGNhcCA8IDEpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJMaXN0IENhcCBNdXN0IEJlIFBvc2l0aXZlIik7CisJCX0KKwkJdGhpcy5jYXAgPSBjYXA7CisJCWlubmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlyZWFkV3JpdGVMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBhZGQoVCBlKSB7CisJCXRyeSB7CisJCQlyZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKwkJCWJvb2xlYW4gcmVzdWx0ID0gaW5uZXJMaXN0LmFkZChlKTsKKwkJCXJlbW92ZUV4dHJhcygpOworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9IGZpbmFsbHkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUV4dHJhcygpIHsKKwkJd2hpbGUgKGlubmVyTGlzdC5zaXplKCkgPiBjYXApIHsKKwkJCWlubmVyTGlzdC5yZW1vdmUoMCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBUIGVsZW1lbnQpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQkJaW5uZXJMaXN0LmFkZChpbmRleCwgZWxlbWVudCk7CisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gYykgeworCQl0cnkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisJCQlib29sZWFuIHJlc3VsdCA9IGlubmVyTGlzdC5hZGRBbGwoYyk7CisJCQlyZW1vdmVFeHRyYXMoKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gYykgeworCQl0cnkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisJCQlib29sZWFuIHJlc3VsdCA9IGlubmVyTGlzdC5hZGRBbGwoaW5kZXgsIGMpOworCQkJcmVtb3ZlRXh0cmFzKCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGZpbmFsbHkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsZWFyKCkgeworCQl0cnkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisJCQlpbm5lckxpc3QuY2xlYXIoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisJCXRyeSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC5jb250YWlucyhvKTsKKworCQl9IGZpbmFsbHkgeworCQkJcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0LmNvbnRhaW5zQWxsKGMpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVCBnZXQoaW50IGluZGV4KSB7CisJCXRyeSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC5nZXQoaW5kZXgpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0LmluZGV4T2Yobyk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisJCXRyeSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC5pc0VtcHR5KCk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcigpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0Lml0ZXJhdG9yKCk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0Lmxhc3RJbmRleE9mKG8pOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcigpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0Lmxpc3RJdGVyYXRvcigpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworCQl0cnkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0LnJlbW92ZShvKTsKKworCQl9IGZpbmFsbHkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUIHJlbW92ZShpbnQgaW5kZXgpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC5yZW1vdmUoaW5kZXgpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgeworCQl0cnkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisJCQlyZXR1cm4gaW5uZXJMaXN0LnJlbW92ZUFsbChjKTsKKworCQl9IGZpbmFsbHkgeworCQkJcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC5yZXRhaW5BbGwoYyk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpIHsKKwkJdHJ5IHsKKwkJCXJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC5zZXQoaW5kZXgsIGVsZW1lbnQpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBzaXplKCkgeworCQl0cnkgeworCQkJcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKwkJCXJldHVybiBpbm5lckxpc3Quc2l6ZSgpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxUPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7CisJCXRyeSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7CisKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgeworCQl0cnkgeworCQkJcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKwkJCXJldHVybiBpbm5lckxpc3QudG9BcnJheSgpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7CisJCXRyeSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworCQkJcmV0dXJuIGlubmVyTGlzdC50b0FycmF5KGEpOworCisJCX0gZmluYWxseSB7CisJCQlyZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2RhdGFzdHJ1Y3R1cmUvRVNUaW1lQmFzZWRFdmVudC5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vZGF0YXN0cnVjdHVyZS9FU1RpbWVCYXNlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViOWY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2RhdGFzdHJ1Y3R1cmUvRVNUaW1lQmFzZWRFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmU7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0OworCisvKioKKyAqIEV4dGVuZGluZyB0aGlzIGNsYXNzIGVuZm9yY2VzIHRoZSBvYmplY3RzIG9mIGltcGxlbWVudGluZyBjbGFzc2VzIHRvIGhhdmUgYQorICogdGltZXN0YW1wLCBzbyB0aGF0IGxpa2UgaW4gbG9nc3Rhc2gsIHdlIGNhbiBkZXJpdmUgdGhlIGluZGV4IG5hbWUgZm9yIHRob3NlCisgKiBvYmplY3QgZnJvbSB0aGUgdGltZXN0YW1wLgorICogCisgKiBAYXV0aG9yIHBhaGFyb25pCisgKgorICovCitwdWJsaWMgY2xhc3MgRVNUaW1lQmFzZWRFdmVudCB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBkYXRlRm9ybWF0UGF0dGVybiA9ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IjsKKwlwcm90ZWN0ZWQgU3RyaW5nIHRpbWVzdGFtcDsKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBmaWVsZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCXB1YmxpYyBFU1RpbWVCYXNlZEV2ZW50KCkgeworCQlTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0UGF0dGVybik7CisJCXNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKKwkJdGhpcy50aW1lc3RhbXAgPSBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKTsKKwkJZmllbGRzLnB1dChBdWRpdGluZ0ZpZWxkc0tleXNFbnVtLkFVRElUX1RJTUVTVEFNUC5nZXREaXNwbGF5TmFtZSgpLCB0aGlzLnRpbWVzdGFtcCk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVTVGltZUJhc2VkRXZlbnQgY3JlYXRlRXZlbnRGcm9tSnNvbihTdHJpbmcganNvblN0cmluZykgdGhyb3dzIEpTT05FeGNlcHRpb24geworCisJCUVTVGltZUJhc2VkRXZlbnQgZXZlbnQgPSBuZXcgRVNUaW1lQmFzZWRFdmVudCgpOworCQlKU09OT2JqZWN0IGdzb25PYmo7CisJCWdzb25PYmogPSBuZXcgSlNPTk9iamVjdChqc29uU3RyaW5nKTsKKwkJSXRlcmF0b3Iga2V5cyA9IGdzb25PYmoua2V5cygpOworCisJCXdoaWxlIChrZXlzLmhhc05leHQoKSkgeworCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dCgpOworCQkJZXZlbnQuZmllbGRzLnB1dChrZXksIGdzb25PYmouZ2V0KGtleSkpOworCQkJaWYgKGtleS5lcXVhbHMoQXVkaXRpbmdGaWVsZHNLZXlzRW51bS5BVURJVF9USU1FU1RBTVAuZ2V0RGlzcGxheU5hbWUoKSkpIHsKKwkJCQlldmVudC50aW1lc3RhbXAgPSAoU3RyaW5nKSBnc29uT2JqLmdldChrZXkpOworCQkJfQorCQl9CisJCXJldHVybiBldmVudDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZVllYXJJbmRleFN1ZmZpeCgpIHsKKwkJcmV0dXJuIHRpbWVzdGFtcC5zdWJzdHJpbmcoMCwgNCk7CisJfQorCisJcHVibGljIFN0cmluZyBjYWxjdWxhdGVNb250aEluZGV4U3VmZml4KCkgeworCQlyZXR1cm4gdGltZXN0YW1wLnN1YnN0cmluZygwLCA3KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZURheUluZGV4U3VmZml4KCkgeworCQlyZXR1cm4gdGltZXN0YW1wLnN1YnN0cmluZygwLCAxMCk7CisJfQorCisJcHVibGljIFN0cmluZyBjYWxjdWxhdGVIb3VySW5kZXhTdWZmaXgoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZCh0aW1lc3RhbXAuc3Vic3RyaW5nKDAsIDEwKSkuYXBwZW5kKCItIikuYXBwZW5kKHRpbWVzdGFtcC5zdWJzdHJpbmcoMTEsIDEzKSkKKwkJCQkudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZU1pbnV0ZUluZGV4U3VmZml4KCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQodGltZXN0YW1wLnN1YnN0cmluZygwLCAxMCkpLmFwcGVuZCgiLSIpLmFwcGVuZCh0aW1lc3RhbXAuc3Vic3RyaW5nKDExLCAxMykpCisJCQkJLmFwcGVuZCgiLSIpLmFwcGVuZCh0aW1lc3RhbXAuc3Vic3RyaW5nKDE0LCAxNikpLnRvU3RyaW5nKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRGb3JtYXR0ZWRTdHJpbmcoU3RyaW5nIHRlbXBsYXRlLCBPYmplY3QuLi4gcGFyYW1zKSB7CisJCVN0cmluZyByZXMgPSBudWxsOworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoc2IsIExvY2FsZS5VUyk7CisJCXRyeSB7CisJCQlmb3JtYXR0ZXIuZm9ybWF0KHRlbXBsYXRlLCBwYXJhbXMpOworCQkJcmVzID0gZm9ybWF0dGVyLnRvU3RyaW5nKCk7CisJCX0gZmluYWxseSB7CisJCQlmb3JtYXR0ZXIuY2xvc2UoKTsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGltZXN0YW1wKCkgeworCQlyZXR1cm4gdGltZXN0YW1wOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgdGltZXN0YW1wKSB7CisJCXRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEZpZWxkcygpIHsKKwkJcmV0dXJuIGZpZWxkczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGaWVsZHMoTWFwPFN0cmluZywgT2JqZWN0PiBmaWVsZHMpIHsKKwkJdGhpcy5maWVsZHMgPSBmaWVsZHM7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL0Z1bmN0aW9uYWxJbnRlcmZhY2VzLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL0Z1bmN0aW9uYWxJbnRlcmZhY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiYTE3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2RhdGFzdHJ1Y3R1cmUvRnVuY3Rpb25hbEludGVyZmFjZXMuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBDbGFzcyBGb3IgRnVuY3Rpb25hbCBpbnRlcmZhY2VzIEFuZCBGdW5jdGlvbmFsIE1ldGhvZHMKKyAqIAorICogQGF1dGhvciBtc2hpdHJpdAorICoKKyAqLworcHVibGljIGNsYXNzIEZ1bmN0aW9uYWxJbnRlcmZhY2VzIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9SRURPX0lOVEVSVkFMX1RJTUVfTVMgPSA1MDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfV0FJVF9USU1FX01TID0gMTAwMDA7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1zaGl0cml0IENvbnN1bWVyIHRoYXQgdGFrZXMgdHdvIHBhcmFtZXRlcnMKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIENvbnN1bWVyVHdvUGFyYW08VDEsIFQyPiB7CisJCS8qKgorCQkgKiBTYW1lIEFjY2VwdCBtZXRob2QsIGJ1dCB0YWtlcyB0d28gcGFyYW1ldGVycworCQkgKiAKKwkJICogQHBhcmFtIHQxCisJCSAqIEBwYXJhbSB0MgorCQkgKi8KKwkJdm9pZCBhY2NlcHQoVDEgdDEsIFQyIHQyKTsKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1zaGl0cml0IEZ1bmN0aW9uIHRoYXQgdGFrZXMgdHdvIHBhcmFtZXRlcnMKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIEZ1bmN0aW9uVHdvUGFyYW08VDEsIFQyLCBSPiB7CisJCS8qKgorCQkgKiBTYW1lIGFwcGx5IG1ldGhvZCwgYnV0IHRha2VzIHR3byBwYXJhbWV0ZXJzCisJCSAqIAorCQkgKiBAcGFyYW0gdDEKKwkJICogQHBhcmFtIHQyCisJCSAqIEByZXR1cm4KKwkJICovCisJCVIgYXBwbHkoVDEgdDEsIFQyIHQyKTsKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1zaGl0cml0IEZ1bmN0aW9uIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgRnVuY3Rpb25UaHJvd3M8VCwgUiwgRSBleHRlbmRzIEV4Y2VwdGlvbj4geworCQkvKioKKwkJICogU2FtZSBhcHBseSBtZXRob2QsIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uCisJCSAqIAorCQkgKiBAcGFyYW0gdAorCQkgKiBAcmV0dXJuCisJCSAqLworCQlSIGFwcGx5KFQgdCkgdGhyb3dzIEU7CisJfQorCisJLyoqCisJICogQGF1dGhvciBtc2hpdHJpdCBTdXBwbGllciB0aGF0IHRocm93cyBhbiBleGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFN1cHBsaWVyVGhyb3dzPFIsIEUgZXh0ZW5kcyBFeGNlcHRpb24+IHsKKwkJLyoqCisJCSAqIFNhbWUgZ2V0IG1ldGhvZCwgYnV0IHRocm93cyBhbiBleGNlcHRpb24KKwkJICogCisJCSAqIEByZXR1cm4KKwkJICogQHRocm93cyBFCisJCSAqLworCQlSIGdldCgpIHRocm93cyBFOworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXNoaXRyaXQgQ29uc3VtZXIgdGhhdCB0aHJvd3MgYW4gZXhjZXB0aW9uCisJICovCisJcHVibGljIGludGVyZmFjZSBDb25zdW1lclRocm93czxULCBFIGV4dGVuZHMgRXhjZXB0aW9uPiB7CisJCS8qKgorCQkgKiBTYW1lIGFjY2VwdCwgYnV0IHRocm93cyBhbiBleGNlcHRpb24KKwkJICogCisJCSAqIEBwYXJhbSB0CisJCSAqIEB0aHJvd3MgRQorCQkgKi8KKwkJdm9pZCBhY2NlcHQoVCB0KSB0aHJvd3MgRTsKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1zaGl0cml0IFJ1bm5hYmxlIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgUnVubmFibGVUaHJvd3M8RSBleHRlbmRzIEV4Y2VwdGlvbj4geworCQkvKioKKwkJICogU2FtZSBydW4sIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uCisJCSAqIAorCQkgKiBAdGhyb3dzIEUKKwkJICovCisJCXZvaWQgcnVuKCkgdGhyb3dzIEU7CisJfQorCisJLyoqCisJICogUnVucyBhIG1ldGhvZCB0aGF0IGRlY2xhcmVzIHRocm93aW5nIGFuIEV4Y2VwdGlvbiBhbmQgaGFzIGEgcmV0dXJuIHZhbHVlLgorCSAqIDxicj4KKwkgKiBJbiBjYXNlIEV4Y2VwdGlvbiBPY2N1cnJlZCByZXBsYWNlcyBpdCB3aXRoIEZ1bmN0aW9uYWxBdHRFeGNlcHRpb24uIDxicj4KKwkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdHdvIGNhc2VzOjxicj4KKwkgKiAxLnVzaW5nIG1ldGhvZHMgdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyBpbiBzdHJlYW1zLjxicj4KKwkgKiAyLnJlcGxhY2luZyBkZWNsYXJlZCBleGNlcHRpb24gd2l0aCB1bmRlY2xhcmVkIGV4Y2VwdGlvbiAoUnVudGltZSkuPGJyPgorCSAqIFNlZSBiZWxvdyBVc2UgQ2FzZTo8YnI+CisJICogSW5zdGVhZCBvZjogaW50TGlzdC5zdHJlYW0oKS5tYXAoZSAtPiBmb29UaHJvd3NBbmRSZXR1cm5zQm9vbGVhbihlKSk7IC0KKwkgKiBkb2VzIG5vdCBjb21waWxlICE8YnI+CisJICogVXNlIFRoaXMgOiBpbnRMaXN0LnN0cmVhbSgpLm1hcChlIC0+IHN3YWxsb3dFeGNlcHRpb24oICgpIC0+CisJICogZm9vVGhyb3dzQW5kUmV0dXJuc0Jvb2xlYW4oZSkpKTsgLSBjb21waWxlcyAhPGJyPgorCSAqIAorCSAqIEBwYXJhbSBtZXRob2RUb1J1bgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxSLCBFIGV4dGVuZHMgRXhjZXB0aW9uPiBSIHN3YWxsb3dFeGNlcHRpb24oU3VwcGxpZXJUaHJvd3M8UiwgRT4gbWV0aG9kVG9SdW4pIHsKKwkJdHJ5IHsKKwkJCWZpbmFsIFIgcmVzdWx0ID0gbWV0aG9kVG9SdW4uZ2V0KCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEZ1bmN0aW9uYWxBdHRFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSdW5zIGEgbWV0aG9kIHRoYXQgZGVjbGFyZXMgdGhyb3dpbmcgYW4gRXhjZXB0aW9uIHdpdGhvdXQgcmV0dXJuIHZhbHVlLgorCSAqIDxicj4KKwkgKiBJbiBjYXNlIEV4Y2VwdGlvbiBPY2N1cnJlZCByZXBsYWNlcyBpdCB3aXRoIEZ1bmN0aW9uYWxBdHRFeGNlcHRpb24uIDxicj4KKwkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdHdvIGNhc2VzOjxicj4KKwkgKiAxLnVzaW5nIG1ldGhvZHMgdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyBpbiBzdHJlYW1zLjxicj4KKwkgKiAyLnJlcGxhY2luZyBkZWNsYXJlZCBleGNlcHRpb24gd2l0aCB1bmRlY2xhcmVkIGV4Y2VwdGlvbiAoUnVudGltZSkuPGJyPgorCSAqIFNlZSBiZWxvdyBVc2UgQ2FzZTo8YnI+CisJICogCisJICogQHBhcmFtIG1ldGhvZFRvUnVuCisJICovCisJcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEV4Y2VwdGlvbj4gdm9pZCBzd2FsbG93RXhjZXB0aW9uKFJ1bm5hYmxlVGhyb3dzPEU+IG1ldGhvZFRvUnVuKSB7CisKKwkJU3VwcGxpZXJUaHJvd3M8Qm9vbGVhbiwgRT4gcnVubmFibGVXcmFwcGVyID0gKCkgLT4geworCQkJbWV0aG9kVG9SdW4ucnVuKCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfTsKKwkJc3dhbGxvd0V4Y2VwdGlvbihydW5uYWJsZVdyYXBwZXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIEZ1bmN0aW9uYWxBdHRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJcHJpdmF0ZSBGdW5jdGlvbmFsQXR0RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7CisJCQlzdXBlcihlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZC48YnI+CisJICogVmVyaWZ5IHRoZSBtZXRob2QgcmVzdWx0IGFnYWluc3QgdGhlIHJlc3VsdFZlcmlmaWVyLjxicj4KKwkgKiBJZiB2ZXJpZmljYXRpb24gcGFzc2VkIHJldHVybnMgdGhlIHJlc3VsdC48YnI+CisJICogSWYgVmVyaWZpY2F0aW9uIGZhaWxlZCBrZWVwcyByZXRyeWluZyB1bnRpbCBpdCBwYXNzZXMgb3IgdW50aWwgMTAgc2Vjb25kcworCSAqIHBhc3MuPGJyPgorCSAqIElmIEV4Y2VwdGlvbiBPY2N1cnJlZCBrZWVwcyByZXRyeWluZyB1bnRpbCBpdCBwYXNzZXMgb3IgdW50aWwgMTAgc2Vjb25kcworCSAqIHBhc3MsPGJyPgorCSAqIElmIGxhc3QgcmV0cnkgcmVzdWx0IGNhdXNlZCBhbiBleGNlcHRpb24gLSBpdCBpcyB0aHJvd24uCisJICogCisJICogQHBhcmFtIG1ldGhvZFRvUnVuCisJICogICAgICAgICAgICBnaXZlbiBNZXRob2QKKwkgKiBAcGFyYW0gcmVzdWx0VmVyaWZpZXIKKwkgKiAgICAgICAgICAgIHZlcmlmaWVyIGZvciB0aGUgbWV0aG9kIHJlc3VsdAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxSPiBSIHJldHJ5TWV0aG9kT25SZXN1bHQoU3VwcGxpZXI8Uj4gbWV0aG9kVG9SdW4sIEZ1bmN0aW9uPFIsIEJvb2xlYW4+IHJlc3VsdFZlcmlmaWVyKSB7CisJCXJldHVybiByZXRyeU1ldGhvZE9uUmVzdWx0KG1ldGhvZFRvUnVuLCByZXN1bHRWZXJpZmllciwgREVGQVVMVF9NQVhfV0FJVF9USU1FX01TLAorCQkJCURFRkFVTFRfUkVET19JTlRFUlZBTF9USU1FX01TKTsKKwl9CisKKwkvKioKKwkgKiBSdW5zIHRoZSBnaXZlbiBtZXRob2QuPGJyPgorCSAqIFZlcmlmeSB0aGUgbWV0aG9kIHJlc3VsdCBhZ2FpbnN0IHRoZSByZXN1bHRWZXJpZmllci48YnI+CisJICogSWYgdmVyaWZpY2F0aW9uIHBhc3NlZCByZXR1cm5zIHRoZSByZXN1bHQuPGJyPgorCSAqIElmIFZlcmlmaWNhdGlvbiBmYWlsZWQga2VlcHMgcmV0cnlpbmcgdW50aWwgaXQgcGFzc2VzIG9yIHVudGlsIG1heFdhaXQKKwkgKiBwYXNzLjxicj4KKwkgKiBJZiBFeGNlcHRpb24gT2NjdXJyZWQga2VlcHMgcmV0cnlpbmcgdW50aWwgaXQgcGFzc2VzIG9yIHVudGlsIG1heFdhaXQKKwkgKiBwYXNzLDxicj4KKwkgKiBJZiBsYXN0IHJldHJ5IHJlc3VsdCBjYXVzZWQgYW4gZXhjZXB0aW9uIC0gaXQgaXMgdGhyb3duLgorCSAqIAorCSAqIEBwYXJhbSBtZXRob2RUb1J1bgorCSAqICAgICAgICAgICAgZ2l2ZW4gTWV0aG9kCisJICogQHBhcmFtIHJlc3VsdFZlcmlmaWVyCisJICogICAgICAgICAgICB2ZXJpZmllciBmb3IgdGhlIG1ldGhvZCByZXN1bHQKKwkgKiBAcGFyYW0gbWF4V2FpdE1TCisJICogQHBhcmFtIHJldHJ5SW50ZXJ2YWxNUworCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxSPiBSIHJldHJ5TWV0aG9kT25SZXN1bHQoU3VwcGxpZXI8Uj4gbWV0aG9kVG9SdW4sIEZ1bmN0aW9uPFIsIEJvb2xlYW4+IHJlc3VsdFZlcmlmaWVyLAorCQkJbG9uZyBtYXhXYWl0TVMsIGxvbmcgcmV0cnlJbnRlcnZhbE1TKSB7CisJCWJvb2xlYW4gc3RvcFNlYXJjaCA9IGZhbHNlOworCQlSIHJldCA9IG51bGw7CisJCWludCB0aW1lRWxhcHNlZCA9IDA7CisJCUZ1bmN0aW9uYWxBdHRFeGNlcHRpb24gZnVuY3Rpb25hbEV4Y2VvdGlvbiA9IG51bGw7CisJCWJvb2xlYW4gaXNFeGNlcHRpb25Jbkxhc3RUcnkgPSBmYWxzZTsKKwkJd2hpbGUgKCFzdG9wU2VhcmNoKSB7CisJCQl0cnkgeworCQkJCXJldCA9IG1ldGhvZFRvUnVuLmdldCgpOworCQkJCXN0b3BTZWFyY2ggPSByZXN1bHRWZXJpZmllci5hcHBseShyZXQpOworCQkJCWlzRXhjZXB0aW9uSW5MYXN0VHJ5ID0gZmFsc2U7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWZ1bmN0aW9uYWxFeGNlb3Rpb24gPSBuZXcgRnVuY3Rpb25hbEF0dEV4Y2VwdGlvbihlKTsKKwkJCQlpc0V4Y2VwdGlvbkluTGFzdFRyeSA9IHRydWU7CisKKwkJCX0gZmluYWxseSB7CisJCQkJc2xlZXAocmV0cnlJbnRlcnZhbE1TKTsKKwkJCQl0aW1lRWxhcHNlZCArPSByZXRyeUludGVydmFsTVM7CisJCQkJaWYgKHRpbWVFbGFwc2VkID4gbWF4V2FpdE1TKSB7CisJCQkJCXN0b3BTZWFyY2ggPSB0cnVlOworCQkJCX0KKwkJCX0KKworCQl9CisJCWlmIChpc0V4Y2VwdGlvbkluTGFzdFRyeSkgeworCQkJdGhyb3cgZnVuY3Rpb25hbEV4Y2VvdGlvbjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCX0KKworCS8qKgorCSAqIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZC48YnI+CisJICogSW4gY2FzZSBleGNlcHRpb24gb2NjdXJyZWQgcnVucyB0aGUgbWV0aG9kIGFnYWluIGVpdGhlciB1bnRpbCBzdWNjZWVkIG9yCisJICogdW50aWwgMTAgc2Vjb25kcyBwYXNzLgorCSAqIAorCSAqIEBwYXJhbSBtZXRob2RUb1J1bgorCSAqICAgICAgICAgICAgZ2l2ZW4gbWV0aG9kCisJICogQHJldHVybgorCSAqLworCisJcHVibGljIHN0YXRpYyA8Uj4gUiByZXRyeU1ldGhvZE9uRXhjZXB0aW9uKFN1cHBsaWVyPFI+IG1ldGhvZFRvUnVuKSB7CisJCUZ1bmN0aW9uPFIsIEJvb2xlYW4+IGR1bW15VmVyaWZpZXIgPSBzb21lUmVzdWx0IC0+IHRydWU7CisJCXJldHVybiByZXRyeU1ldGhvZE9uUmVzdWx0KG1ldGhvZFRvUnVuLCBkdW1teVZlcmlmaWVyLCBERUZBVUxUX01BWF9XQUlUX1RJTUVfTVMsIERFRkFVTFRfUkVET19JTlRFUlZBTF9USU1FX01TKTsKKwl9CisKKwkvKioKKwkgKiBSdW5zIHRoZSBnaXZlbiBtZXRob2QuPGJyPgorCSAqIEluIGNhc2UgZXhjZXB0aW9uIG9jY3VycmVkIHJ1bnMgdGhlIG1ldGhvZCBhZ2FpbiBlaXRoZXIgdW50aWwgc3VjY2VlZCBvcgorCSAqIHVudGlsIDEwIHNlY29uZHMgcGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kVG9SdW4KKwkgKiAgICAgICAgICAgIGdpdmVuIG1ldGhvZAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZXRyeU1ldGhvZE9uRXhjZXB0aW9uKFJ1bm5hYmxlIG1ldGhvZFRvUnVuKSB7CisJCUZ1bmN0aW9uPEJvb2xlYW4sIEJvb2xlYW4+IGR1bW15VmVyaWZpZXIgPSBzb21lUmVzdWx0IC0+IHRydWU7CisJCVN1cHBsaWVyPEJvb2xlYW4+IGR1bW15U3VwcGxpZXIgPSAoKSAtPiB7CisJCQltZXRob2RUb1J1bi5ydW4oKTsKKwkJCXJldHVybiB0cnVlOworCQl9OworCQlyZXRyeU1ldGhvZE9uUmVzdWx0KGR1bW15U3VwcGxpZXIsIGR1bW15VmVyaWZpZXIsIERFRkFVTFRfTUFYX1dBSVRfVElNRV9NUywgREVGQVVMVF9SRURPX0lOVEVSVkFMX1RJTUVfTVMpOworCX0KKworCS8qKgorCSAqIFNhbWUgYXMgVGhyZWFkLnNsZWVwIGJ1dCB0aHJvd3MgYSBGdW5jdGlvbmFsQXR0RXhjZXB0aW9uCisJICogKFJ1bnRpbWVFeGNlcHRpb24pIGluc3RlYWQgb2YgSW50ZXJydXB0ZWRFeGNlcHRpb24uPGJyPgorCSAqIAorCSAqIEBwYXJhbSBtaWxsaXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKKwkJc3dhbGxvd0V4Y2VwdGlvbigoKSAtPiBUaHJlYWQuc2xlZXAobWlsbGlzKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2RhdGFzdHJ1Y3R1cmUvTW9uaXRvcmluZ0ZpZWxkc0tleXNFbnVtLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL01vbml0b3JpbmdGaWVsZHNLZXlzRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmI0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL01vbml0b3JpbmdGaWVsZHNLZXlzRW51bS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZTsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitwdWJsaWMgZW51bSBNb25pdG9yaW5nRmllbGRzS2V5c0VudW0geworCU1PTklUT1JJTkdfVElNRVNUQU1QKERhdGUuY2xhc3MsICJUSU1FU1RBTVAiKSwgCisJTU9OSVRPUklOR19IT1NUX0lQKFN0cmluZy5jbGFzcywgIkhPU1RfSVAiKSwgCisJTU9OSVRPUklOR19IT1NUX0NQVShMb25nLmNsYXNzLCAiSE9TVF9DUFUiKSwgCisJTU9OSVRPUklOR19IT1NUX01FTShMb25nLmNsYXNzLCAiSE9TVF9NRU1PUlkiKSwgCisJTU9OSVRPUklOR19IT1NUX0RJU0MoTG9uZy5jbGFzcywgIkhPU1RfRElTQyIpLCAKKwlNT05JVE9SSU5HX0pWTV9JRChTdHJpbmcuY2xhc3MsICJKVk1fSUQiKSwgCisJTU9OSVRPUklOR19KVk1fQ1BVKExvbmcuY2xhc3MsICJKVk1fQ1BVIiksIAorCU1PTklUT1JJTkdfSlZNX01FTShMb25nLmNsYXNzLCAiSlZNX01FTU9SWSIpLCAKKwlNT05JVE9SSU5HX0pWTV9UTlVNKExvbmcuY2xhc3MsICJKVk1fVE5VTSIpLCAKKwlNT05JVE9SSU5HX0FQUF9JRChTdHJpbmcuY2xhc3MsICJBUFBfSUQiKSwgCisJTU9OSVRPUklOR19BUFBfU1RBVChTdHJpbmcuY2xhc3MsICJBUFBfU1RBVCIpOworCisJcHJpdmF0ZSBDbGFzczw/PiBjbGF6ejsKKwlwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKKworCU1vbml0b3JpbmdGaWVsZHNLZXlzRW51bShDbGFzczw/PiBjbGF6eiwgU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisJCXRoaXMuY2xhenogPSBjbGF6ejsKKwkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworCX0KKworCXB1YmxpYyBDbGFzczw/PiBnZXRWYWx1ZUNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5jbGF6ejsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworCQlyZXR1cm4gZGlzcGxheU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisJCXRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL1dyYXBwZXIuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2RhdGFzdHJ1Y3R1cmUvV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZmQ1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhc3RydWN0dXJlL1dyYXBwZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmU7CisKKy8qKgorICogVmVyeSBCYXNpYyBXcmFwcGVyIGNsYXNzLgorICogCisgKiBAYXV0aG9yIG1zaGl0cml0CisgKiAKKyAqIEBwYXJhbSA8VD4KKyAqLworcHVibGljIGNsYXNzIFdyYXBwZXI8VD4geworCXByaXZhdGUgVCBpbm5lckVsZW1lbnQ7CisKKwlwdWJsaWMgV3JhcHBlcihUIGlubmVyRWxlbWVudCkgeworCQl0aGlzLmlubmVyRWxlbWVudCA9IGlubmVyRWxlbWVudDsKKwl9CisKKwlwdWJsaWMgV3JhcHBlcigpIHsKKwkJdGhpcy5pbm5lckVsZW1lbnQgPSBudWxsOworCX0KKworCXB1YmxpYyBUIGdldElubmVyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGlubmVyRWxlbWVudDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbm5lckVsZW1lbnQoVCBpbm5lckVsZW1lbnQpIHsKKwkJdGhpcy5pbm5lckVsZW1lbnQgPSBpbm5lckVsZW1lbnQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJcmV0dXJuIGlubmVyRWxlbWVudCA9PSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2ltcGwvQ29uZmlnRmlsZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9pbXBsL0NvbmZpZ0ZpbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNWRlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9pbXBsL0NvbmZpZ0ZpbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmpjaS5saXN0ZW5lcnMuRmlsZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQmFzaWNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLllhbWxUb09iamVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgQ29uZmlnRmlsZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRmlsZUNoYW5nZUxpc3RlbmVyIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25maWdGaWxlQ2hhbmdlTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDb25maWd1cmF0aW9uTGlzdGVuZXI+PiBmaWxlQ2hhbmdlVG9DYWxsQmFjayA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDb25maWd1cmF0aW9uTGlzdGVuZXI+PigpOworCisJcHJpdmF0ZSBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKKworCXByaXZhdGUgWWFtbFRvT2JqZWN0Q29udmVydGVyIHlhbWxUb09iamVjdENvbnZlcnRlciA9IG5ldyBZYW1sVG9PYmplY3RDb252ZXJ0ZXIoKTsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG9uRmlsZUNoYW5nZShGaWxlIHBGaWxlKSB7CisKKwkJc3VwZXIub25GaWxlQ2hhbmdlKHBGaWxlKTsKKworCQlpZiAocEZpbGUgIT0gbnVsbCkgeworCisJCQlpZiAoZmlsZUNoYW5nZVRvQ2FsbEJhY2sgIT0gbnVsbCkgeworCisJCQkJU3RyaW5nIGlkID0gZmluZElkRnJvbUZpbGVOYW1lKHBGaWxlLmdldE5hbWUoKSk7CisKKwkJCQlpZiAoaWQgIT0gbnVsbCkgeworCisJCQkJCUxpc3Q8Q29uZmlndXJhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBmaWxlQ2hhbmdlVG9DYWxsQmFjay5nZXQoaWQpOworCQkJCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKwkJCQkJCWZvciAoQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lciA6IGxpc3RlbmVycykgeworCisJCQkJCQkJQ2xhc3M8PyBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbj4gY29uZmlnQ2xhc3MgPSBjb25maWd1cmF0aW9uTGlzdGVuZXIuZ2V0VHlwZSgpOworCisJCQkJCQkJQmFzaWNDb25maWd1cmF0aW9uIGJhc2ljQ29uZmlndXJhdGlvbiA9IHlhbWxUb09iamVjdENvbnZlcnRlcgorCQkJCQkJCQkJLmNvbnZlcnQocEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbmZpZ0NsYXNzKTsKKworCQkJCQkJCWlmIChiYXNpY0NvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworCQkJCQkJCQlsb2cud2FybigKKwkJCQkJCQkJCQkiQ2Fubm90IHVwZGF0ZSB0aGUgbGlzdGVuZXJzIGZvciBmaWxlIENoYW5nZSBzaW5jZSB0aGUgZmlsZSBjb250ZW50IGlzIGludmFsaWQiKTsKKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCQkJCQkJCWxvZy5kZWJ1ZygiTG9hZGVkIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgY29udmVydGluZyBpcyAiICsgYmFzaWNDb25maWd1cmF0aW9uKTsKKwkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5ldyBjb25maWd1cmF0aW9uIGlzICIgKworCQkJCQkJCS8vIGJhc2ljQ29uZmlndXJhdGlvbik7CisKKwkJCQkJCQljb25maWd1cmF0aW9uTGlzdGVuZXIuZ2V0Q2FsbEJhY2soKS5yZWNvbmZpZ3VyZShiYXNpY0NvbmZpZ3VyYXRpb24pOworCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCisJCQkJCWxvZy53YXJuKCJDYW5ub3QgY2FsY3VsYXRlIGlkIGZyb20gZmlsZSAiICsgcEZpbGUuZ2V0TmFtZSgpKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCWxvZy5kZWJ1ZygiRmlsZSB7fSB3YXMgY2hhbmdlZC4iLCBwRmlsZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZmluZElkRnJvbUZpbGVOYW1lKFN0cmluZyBuYW1lKSB7CisKKwkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCWludCBzdGFydEluZGV4ID0gMDsKKwkJCWludCBlbmRJbmRleCA9IG5hbWUubGVuZ3RoKCk7CisJCQlpZiAobmFtZS5jb250YWlucyhGaWxlLnNlcGFyYXRvcikpIHsKKwkJCQlzdGFydEluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7CisJCQl9CisJCQkvLyBTdHJpbmcgc3ViTmFtZVN0cmluZyA9IG5hbWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKKwkJCS8vIGlmIChzdWJOYW1lU3RyaW5nLmNvbnRhaW5zKCIuIikpIHsKKwkJCS8vIGVuZEluZGV4ID0gc3ViTmFtZVN0cmluZy5pbmRleE9mKCIuIik7CisJCQkvLyB9CisKKwkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKKworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWdpc3RlcihTdHJpbmcgaWQsIENvbmZpZ3VyYXRpb25MaXN0ZW5lciBjb25maWd1cmF0aW9uTGlzdGVuZXIpIHsKKworCQlpZiAoY29uZmlndXJhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKKworCQkJc3luY2hyb25pemVkIChsb2NrKSB7CisKKwkJCQlMaXN0PENvbmZpZ3VyYXRpb25MaXN0ZW5lcj4gY2FsbGJhY2tzID0gZmlsZUNoYW5nZVRvQ2FsbEJhY2suZ2V0KGlkKTsKKwkJCQlpZiAoY2FsbGJhY2tzID09IG51bGwpIHsKKwkJCQkJY2FsbGJhY2tzID0gbmV3IEFycmF5TGlzdDxDb25maWd1cmF0aW9uTGlzdGVuZXI+KCk7CisJCQkJCWZpbGVDaGFuZ2VUb0NhbGxCYWNrLnB1dChpZCwgY2FsbGJhY2tzKTsKKwkJCQl9CisJCQkJY2FsbGJhY2tzLmFkZChjb25maWd1cmF0aW9uTGlzdGVuZXIpOworCisJCQl9CisKKwkJfQorCisJfQorCisJLy8gcHVibGljIHZvaWQgbm90aWZ5KFN0cmluZyBpZCwgQmFzaWNDb25maWd1cmF0aW9uIG9iamVjdCkgeworCS8vCisJLy8gaWYgKGZpbGVDaGFuZ2VUb0NhbGxCYWNrICE9IG51bGwpIHsKKwkvLyBMaXN0PENvbmZpZ3VyYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzID0gZmlsZUNoYW5nZVRvQ2FsbEJhY2sKKwkvLyAuZ2V0KGlkKTsKKwkvLyBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKwkvLyBmb3IgKENvbmZpZ3VyYXRpb25MaXN0ZW5lciBjb25maWd1cmF0aW9uTGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKwkvLworCS8vIGNvbmZpZ3VyYXRpb25MaXN0ZW5lci5nZXRDYWxsQmFjaygpLnJlY29uZmlndXJlKG9iamVjdCk7CisJLy8KKwkvLyB9CisJLy8gfQorCS8vIH0KKwkvLworCS8vIH0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vaW1wbC9FeHRlcm5hbENvbmZpZ3VyYXRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2ltcGwvRXh0ZXJuYWxDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzZGNiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2ltcGwvRXh0ZXJuYWxDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qY2kubW9uaXRvci5GaWxlc3lzdGVtQWx0ZXJhdGlvbk1vbml0b3I7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworCisvKioKKyAqIAorICogU2F2ZSB0aGUKKyAqIAorICogQGF1dGhvciBlc29mZXIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbENvbmZpZ3VyYXRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcE5hbWU7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcFZlcnNpb247CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbmZpZ0RpcjsKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2U7CisKKwlwcml2YXRlIHN0YXRpYyBGaWxlc3lzdGVtQWx0ZXJhdGlvbk1vbml0b3IgZmFtID0gbnVsbDsKKworCXByaXZhdGUgc3RhdGljIENvbmZpZ0ZpbGVDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA9IG5ldyBDb25maWdGaWxlQ2hhbmdlTGlzdGVuZXIoKTsKKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlUmVjb25maWd1cmUgPSB0cnVlOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXBwTmFtZSgpIHsKKwkJcmV0dXJuIGFwcE5hbWU7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEFwcE5hbWUoU3RyaW5nIGFwcE5hbWUpIHsKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLmFwcE5hbWUgPSBhcHBOYW1lOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFwcFZlcnNpb24oKSB7CisJCXJldHVybiBhcHBWZXJzaW9uOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBcHBWZXJzaW9uKFN0cmluZyBhcHBWZXJzaW9uKSB7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5hcHBWZXJzaW9uID0gYXBwVmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWdEaXIoKSB7CisJCXJldHVybiBjb25maWdEaXI7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmZpZ0RpcihTdHJpbmcgY29uZmlnRGlyKSB7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5jb25maWdEaXIgPSBjb25maWdEaXI7CisJfQorCisJcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uU291cmNlIGdldENvbmZpZ3VyYXRpb25Tb3VyY2UoKSB7CisJCXJldHVybiBjb25maWd1cmF0aW9uU291cmNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0aW9uU291cmNlKENvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSkgeworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uY29uZmlndXJhdGlvblNvdXJjZSA9IGNvbmZpZ3VyYXRpb25Tb3VyY2U7CisJfQorCisJcHVibGljIHN0YXRpYyBDb25maWdGaWxlQ2hhbmdlTGlzdGVuZXIgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBjaGFuZ2VMaXN0ZW5lcjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbGlzdGVuRm9yQ2hhbmdlcygpIHsKKworCQlTdHJpbmcgd2F0Y2hpbmdEaXIgPSBjb25maWdEaXIgKyBGaWxlLnNlcGFyYXRvciArIGFwcE5hbWU7CisJCWlmIChlbmFibGVSZWNvbmZpZ3VyZSkgeworCQkJaWYgKGZhbSA9PSBudWxsKSB7CisJCQkJZmFtID0gbmV3IEZpbGVzeXN0ZW1BbHRlcmF0aW9uTW9uaXRvcigpOworCQkJCWZhbS5zZXRJbnRlcnZhbCgxMDAwKTsKKwkJCQlmYW0uYWRkTGlzdGVuZXIobmV3IEZpbGUod2F0Y2hpbmdEaXIpLCBjaGFuZ2VMaXN0ZW5lcik7CisJCQkJZmFtLnN0YXJ0KCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcExpc3RlbkZvckZpbGVDaGFuZ2VzKCkgeworCQlpZiAoZW5hYmxlUmVjb25maWd1cmUpIHsKKwkJCWlmIChmYW0gIT0gbnVsbCkgeworCQkJCWZhbS5zdG9wKCk7CisJCQkJZmFtID0gbnVsbDsKKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vaW1wbC9GU0NvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2ltcGwvRlNDb25maWd1cmF0aW9uU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmNjRjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2ltcGwvRlNDb25maWd1cmF0aW9uU291cmNlLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5ZYW1sVG9PYmplY3RDb252ZXJ0ZXI7CisKKy8qKgorICogUmVhZCBjb25maWd1cmF0aW9uIGZyb20gZmlsZSBzeXN0ZW0KKyAqIAorICogQGF1dGhvciBlc29mZXIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uU291cmNlIHsKKworCXByaXZhdGUgWWFtbFRvT2JqZWN0Q29udmVydGVyIHlhbWxUb09iamVjdENvbnZlcnRlciA9IG5ldyBZYW1sVG9PYmplY3RDb252ZXJ0ZXIoKTsKKworCXByaXZhdGUgQ29uZmlnRmlsZUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyBhcHBDb25maWdEaXIgPSBudWxsOworCisJcHVibGljIEZTQ29uZmlndXJhdGlvblNvdXJjZShDb25maWdGaWxlQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIsIFN0cmluZyBhcHBDb25maWdEaXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGNoYW5nZUxpc3RlbmVyOworCQl0aGlzLmFwcENvbmZpZ0RpciA9IGFwcENvbmZpZ0RpcjsKKwl9CisKKwkvKgorCSAqIGdldCBhbmQgd2F0Y2ggY29uZmlndXJhdGlvbiBjaGFuZ2VzLiBUaGUgZmlsZSBuYW1lIHdlIGxvb2tpbmcgZm9yIGlzIHRoZQorCSAqIGxvd2VyIGNhc2Ugb2YgdGhlIGNsYXNzIG5hbWUgc2VwYXJhdGVkIGJ5ICItIi4KKwkgKiAKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZQorCSAqIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uZmlndXJhdGlvblNvdXJjZSNnZXRBbmRXYXRjaENvbmZpZ3VyYXRpb24KKwkgKiAoamF2YS5sYW5nLkNsYXNzLCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25MaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgPFQ+IFQgZ2V0QW5kV2F0Y2hDb25maWd1cmF0aW9uKENsYXNzPFQ+IGNsYXNzTmFtZSwgQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgeworCisJCVN0cmluZyBjb25maWdGaWxlTmFtZSA9IGNhbGN1bGF0ZUZpbGVOYW1lKGNsYXNzTmFtZSk7CisKKwkJVCBvYmplY3QgPSB5YW1sVG9PYmplY3RDb252ZXJ0ZXIuY29udmVydCh0aGlzLmFwcENvbmZpZ0RpciwgY2xhc3NOYW1lLCBjb25maWdGaWxlTmFtZSk7CisKKwkJaWYgKGNvbmZpZ3VyYXRpb25MaXN0ZW5lciAhPSBudWxsICYmIGNoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKKwkJCWlmIChvYmplY3QgIT0gbnVsbCkgeworCQkJCWNoYW5nZUxpc3RlbmVyLnJlZ2lzdGVyKGNvbmZpZ0ZpbGVOYW1lLCBjb25maWd1cmF0aW9uTGlzdGVuZXIpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG9iamVjdDsKKwl9CisKKwlwdWJsaWMgPFQ+IHZvaWQgYWRkV2F0Y2hDb25maWd1cmF0aW9uKENsYXNzPFQ+IGNsYXNzTmFtZSwgQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgeworCisJCVN0cmluZyBjb25maWdGaWxlTmFtZSA9IGNhbGN1bGF0ZUZpbGVOYW1lKGNsYXNzTmFtZSk7CisKKwkJaWYgKGNvbmZpZ3VyYXRpb25MaXN0ZW5lciAhPSBudWxsKSB7CisJCQljaGFuZ2VMaXN0ZW5lci5yZWdpc3Rlcihjb25maWdGaWxlTmFtZSwgY29uZmlndXJhdGlvbkxpc3RlbmVyKTsKKwkJfQorCisJfQorCisJLyoqCisJICogY29udmVydCBjYW1lbCBjYXNlIHN0cmluZyB0byBsaXN0IG9mIHdvcmRzIHNlcGFyYXRlZCBieSAiLSIgd2hlcmUgZWFjaAorCSAqIHdvcmQgaXMgaW4gbG93ZXIgY2FzZSBmb3JtYXQuIEZvciBleGFtcGxlLCBNeUNsYXNzIHdpbGwgYmUgY2FsY3VsYXRlZCB0bworCSAqIGJlIG15LWNsYXNzLnlhbWwgLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc05hbWUKKwkgKiBAcmV0dXJuIGZpbGUgbmFtZSBiYXNlZCBvbiB0aGUgY2xhc3MgbmFtZQorCSAqLworCXByaXZhdGUgc3RhdGljIDxUPiBTdHJpbmcgY2FsY3VsYXRlRmlsZU5hbWUoQ2xhc3M8VD4gY2xhc3NOYW1lKSB7CisKKwkJU3RyaW5nW10gd29yZHMgPSBjbGFzc05hbWUuZ2V0U2ltcGxlTmFtZSgpLnNwbGl0KCIoPz1cXHB7VXBwZXJ9KSIpOworCisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJLy8gVGhlcmUgY2Fubm90IGJlIGEgbnVsbCB2YWx1ZSByZXR1cm5lZCBmcm9tICJzcGxpdCIgLSB3b3JkcyAhPSBudWxsIGlzCisJCS8vIHJlZHVuZGFudAorCQkvLyBpZiAod29yZHMgIT0gbnVsbCkgeworCQlib29sZWFuIGlzRmlyc3QgPSB0cnVlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7CisKKwkJCVN0cmluZyB3b3JkID0gd29yZHNbaV07CisJCQlpZiAod29yZCAhPSBudWxsICYmICF3b3JkLmlzRW1wdHkoKSkgeworCQkJCWlmICghaXNGaXJzdCkgeworCQkJCQlidWlsZGVyLmFwcGVuZCgiLSIpOworCQkJCX0gZWxzZSB7CisJCQkJCWlzRmlyc3QgPSBmYWxzZTsKKwkJCQl9CisJCQkJYnVpbGRlci5hcHBlbmQod29yZHNbaV0udG9Mb3dlckNhc2UoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKSArIENvbnN0YW50cy5ZQU1MX1NVRkZJWDsKKworCQkvKgorCQkgKiB9IGVsc2UgeyByZXR1cm4gY2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpICsKKwkJICogQ29uc3RhbnRzLllBTUxfU1VGRklYOyB9CisJCSAqLworCisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9pbXBsL011dGFibGVIdHRwU2VydmxldFJlcXVlc3QuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2ltcGwvTXV0YWJsZUh0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Y2U3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9pbXBsL011dGFibGVIdHRwU2VydmxldFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDczIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNdXRhYmxlSHR0cFNlcnZsZXRSZXF1ZXN0IGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7CisJLy8gaG9sZHMgY3VzdG9tIGhlYWRlciBhbmQgdmFsdWUgbWFwcGluZworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjdXN0b21IZWFkZXJzOworCisJcHVibGljIE11dGFibGVIdHRwU2VydmxldFJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJc3VwZXIocmVxdWVzdCk7CisJCXRoaXMuY3VzdG9tSGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCX0KKworCXB1YmxpYyB2b2lkIHB1dEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMuY3VzdG9tSGVhZGVycy5wdXQobmFtZSwgdmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB7CisJCS8vIGNoZWNrIHRoZSBjdXN0b20gaGVhZGVycyBmaXJzdAorCQlTdHJpbmcgaGVhZGVyVmFsdWUgPSBjdXN0b21IZWFkZXJzLmdldChuYW1lKTsKKworCQlpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkgeworCQkJcmV0dXJuIGhlYWRlclZhbHVlOworCQl9CisJCS8vIGVsc2UgcmV0dXJuIGZyb20gaW50byB0aGUgb3JpZ2luYWwgd3JhcHBlZCBvYmplY3QKKwkJcmV0dXJuICgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldEhlYWRlcihuYW1lKTsKKwl9CisKKwlwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRIZWFkZXJOYW1lcygpIHsKKwkJLy8gY3JlYXRlIGEgc2V0IG9mIHRoZSBjdXN0b20gaGVhZGVyIG5hbWVzCisJCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oY3VzdG9tSGVhZGVycy5rZXlTZXQoKSk7CisKKwkJLy8gbm93IGFkZCB0aGUgaGVhZGVycyBmcm9tIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSAoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRIZWFkZXJOYW1lcygpOworCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJLy8gYWRkIHRoZSBuYW1lcyBvZiB0aGUgcmVxdWVzdCBoZWFkZXJzIGludG8gdGhlIGxpc3QKKwkJCVN0cmluZyBuID0gZS5uZXh0RWxlbWVudCgpOworCQkJc2V0LmFkZChuKTsKKwkJfQorCisJCS8vIGNyZWF0ZSBhbiBlbnVtZXJhdGlvbiBmcm9tIHRoZSBzZXQgYW5kIHJldHVybgorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oc2V0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9rcGkvYXBpL0FTRENLcGlBcGkuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2twaS9hcGkvQVNEQ0twaUFwaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9rcGkvYXBpL0FTRENLcGlBcGkuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmtwaS5hcGk7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgQVNEQ0twaUFwaSB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQVNEQ0twaUFwaS5jbGFzcy5nZXROYW1lKCkpOworCisJLyogTnVtYmVyIG9mIGFjdGl2YXRlZCByZXNvdXJjZSBpbXBvcnRzLiAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3VudEltcG9ydFJlc291cmNlc0tQSSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlsb2cudHJhY2UoIk51bWJlciBvZiAgYWN0aXZhdGVkIHJlc291cmNlIGltcG9ydHMuIik7CisKKwl9CisKKwkvKiBOdW1iZXIgb2YgY3JlYXRlZCByZXNvdXJjZXMuICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNvdW50Q3JlYXRlZFJlc291cmNlc0tQSSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlsb2cudHJhY2UoIk51bWJlciBvZiAgY3JlYXRlZCByZXNvdXJjZXMuIik7CisKKwl9CisKKwkvKiBOdW1iZXIgb2YgY3JlYXRlZCBzZXJ2aWNlcyAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3VudENyZWF0ZWRTZXJ2aWNlc0tQSSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlsb2cudHJhY2UoIk51bWJlciBvZiBjcmVhdGVkIHNlcnZpY2VzLiIpOworCisJfQorCisJLyoKKwkgKiBOdW1iZXIgb2YgQVNEQyBwb3J0YWwgYWNjZXNzZXMgKCBudW1iZXIgb2YgYWN0aXZhdGVkIHVzZXIgYXV0aG9yaXphdGlvbnMpCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNvdW50VXNlcnNBdXRob3JpemF0aW9ucygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlsb2cudHJhY2UoIk51bWJlciBvZiBhY3RpdmF0ZWQgZGlzdHJpYnV0aW9uIik7CisKKwl9CisKKwkvKiBOdW1iZXIgb2YgYWN0aXZhdGVkIGRpc3RyaWJ1dGlvbiAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3VudEFjdGl2YXRlZERpc3RyaWJ1dGlvbigpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlsb2cudHJhY2UoIk51bWJlciBvZiBhY3RpdmF0ZWQgZGlzdHJpYnV0aW9uIik7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2xpc3RlbmVyL0FwcENvbnRleHRMaXN0ZW5lci5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vbGlzdGVuZXIvQXBwQ29udGV4dExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1ODhlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2xpc3RlbmVyL0FwcENvbnRleHRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmxpc3RlbmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0RXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5Db25maWd1cmF0aW9uU291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTURDOworCitwdWJsaWMgY2xhc3MgQXBwQ29udGV4dExpc3RlbmVyIGltcGxlbWVudHMgU2VydmxldENvbnRleHRMaXN0ZW5lciB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXBwQ29udGV4dExpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBjb250ZXh0KSB7CisKKwkJbG9nLmRlYnVnKCJTZXJ2bGV0Q29udGV4dExpc3RlbmVyIGluaXRpYWxpemVkICIpOworCisJCWxvZy5kZWJ1ZygiQWZ0ZXIgcmVhZCB2YWx1ZXMgZnJvbSBNYW5pZmVzdCB7fSIsIGdldE1hbmlmZXN0SW5mbyhjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hbmlmZXN0QXR0ciA9IGdldE1hbmlmZXN0SW5mbyhjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpOworCisJCVN0cmluZyBhcHBOYW1lID0gc2V0QW5kR2V0QXR0cmlidXRlSW5Db250ZXh0KGNvbnRleHQsIG1hbmlmZXN0QXR0ciwgQ29uc3RhbnRzLkFQUExJQ0FUSU9OX05BTUUpOworCQlTdHJpbmcgYXBwVmVyc2lvbiA9IHNldEFuZEdldEF0dHJpYnV0ZUluQ29udGV4dChjb250ZXh0LCBtYW5pZmVzdEF0dHIsIENvbnN0YW50cy5BUFBMSUNBVElPTl9WRVJTSU9OKTsKKworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0QXBwTmFtZShhcHBOYW1lKTsKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcFZlcnNpb24oYXBwVmVyc2lvbik7CisJCVN0cmluZyBjb25maWdIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnN0YW50cy5DT05GSUdfSE9NRSk7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5zZXRDb25maWdEaXIoY29uZmlnSG9tZSk7CisKKwkJU3RyaW5nIGFwcENvbmZpZ0RpciA9IGNvbmZpZ0hvbWUgKyBGaWxlLnNlcGFyYXRvciArIGFwcE5hbWU7CisJCS8vIENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gbmV3IENoYW5nZUxpc3RlbmVyKCk7CisJCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksIGFwcENvbmZpZ0Rpcik7CisKKwkJY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHVVJBVElPTl9TT1VSQ0VfQVRUUiwgY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldENvbmZpZ3VyYXRpb25Tb3VyY2UoY29uZmlndXJhdGlvblNvdXJjZSk7CisKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLmxpc3RlbkZvckNoYW5nZXMoKTsKKworCX0KKworCXB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBjb250ZXh0KSB7CisKKwkJbG9nLmRlYnVnKCJTZXJ2bGV0Q29udGV4dExpc3RlbmVyIGRlc3Ryb3llZCIpOworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc3RvcExpc3RlbkZvckZpbGVDaGFuZ2VzKCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgc2V0QW5kR2V0QXR0cmlidXRlSW5Db250ZXh0KFNlcnZsZXRDb250ZXh0RXZlbnQgY29udGV4dCwgTWFwPFN0cmluZywgU3RyaW5nPiBtYW5pZmVzdEF0dHIsIFN0cmluZyBhdHRyKSB7CisKKwkJU3RyaW5nIG5hbWUgPSBtYW5pZmVzdEF0dHIuZ2V0KGF0dHIpOworCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQljb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuc2V0QXR0cmlidXRlKGF0dHIsIG5hbWUpOworCQl9CisKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldE1hbmlmZXN0SW5mbyhTZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbikgeworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJaW5wdXRTdHJlYW0gPSBhcHBsaWNhdGlvbi5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKworCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaW5wdXRTdHJlYW0pOworCisJCQlBdHRyaWJ1dGVzIGF0dHIgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOworCQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldFZhbHVlKCJJbXBsZW1lbnRhdGlvbi1UaXRsZSIpOworCQkJaWYgKG5hbWUgIT0gbnVsbCkgeworCQkJCXJlc3VsdC5wdXQoQ29uc3RhbnRzLkFQUExJQ0FUSU9OX05BTUUsIG5hbWUpOworCQkJfQorCisJCQlTdHJpbmcgdmVyc2lvbiA9IGF0dHIuZ2V0VmFsdWUoIkltcGxlbWVudGF0aW9uLVZlcnNpb24iKTsKKwkJCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKKwkJCQlyZXN1bHQucHV0KENvbnN0YW50cy5BUFBMSUNBVElPTl9WRVJTSU9OLCB2ZXJzaW9uKTsKKwkJCX0KKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9tb25pdG9yaW5nL01vbml0b3JpbmdFdmVudC5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vbW9uaXRvcmluZy9Nb25pdG9yaW5nRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTY1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vbW9uaXRvcmluZy9Nb25pdG9yaW5nRXZlbnQuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5tb25pdG9yaW5nOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRVNUaW1lQmFzZWRFdmVudDsKKworcHVibGljIGNsYXNzIE1vbml0b3JpbmdFdmVudCBleHRlbmRzIEVTVGltZUJhc2VkRXZlbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1PTklUT1JJTkdfRVZFTlRfVEVNUExBVEUgPSAiaG9zdGlkPVwiJXNcIiBob3N0Y3B1PVwiJXNcIiBob3N0bWVtPVwiJXNcIiBob3N0ZGlzaz1cIiVzXCIgIgorCQkJKyAianZtaWQ9XCIlc1wiIGp2bWNwdT1cIiVzXCIganZtbWVtPVwiJXNcIiBqdm10bnVtPVwiJXNcIiAiICsgImFwcGlkPVwiJXNcIiBhcHBzdGF0PVwiJXNcIiI7CisKKwlwcml2YXRlIFN0cmluZyBob3N0aWQ7CisJcHJpdmF0ZSBMb25nIGhvc3RjcHU7CisJcHJpdmF0ZSBEb3VibGUgaG9zdG1lbTsKKwlwcml2YXRlIFN0cmluZyBob3N0ZGlzazsKKwlwcml2YXRlIFN0cmluZyBqdm1pZDsKKwlwcml2YXRlIExvbmcganZtY3B1OworCXByaXZhdGUgTG9uZyBqdm1tZW07CisJcHJpdmF0ZSBJbnRlZ2VyIGp2bXRudW07CisJcHJpdmF0ZSBTdHJpbmcgYXBwaWQ7CisJcHJpdmF0ZSBTdHJpbmcgYXBwc3RhdDsKKworCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdGlkKCkgeworCQlyZXR1cm4gaG9zdGlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhvc3RpZChTdHJpbmcgaG9zdGlkKSB7CisJCXRoaXMuaG9zdGlkID0gaG9zdGlkOworCX0KKworCXB1YmxpYyBMb25nIGdldEhvc3RjcHUoKSB7CisJCXJldHVybiBob3N0Y3B1OworCX0KKworCXB1YmxpYyB2b2lkIHNldEhvc3RjcHUoTG9uZyBob3N0Y3B1KSB7CisJCXRoaXMuaG9zdGNwdSA9IGhvc3RjcHU7CisJfQorCisJcHVibGljIERvdWJsZSBnZXRIb3N0bWVtKCkgeworCQlyZXR1cm4gaG9zdG1lbTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIb3N0bWVtKERvdWJsZSBob3N0bWVtKSB7CisJCXRoaXMuaG9zdG1lbSA9IGhvc3RtZW07CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIb3N0ZGlzaygpIHsKKwkJcmV0dXJuIGhvc3RkaXNrOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhvc3RkaXNrKFN0cmluZyBob3N0ZGlzaykgeworCQl0aGlzLmhvc3RkaXNrID0gaG9zdGRpc2s7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRKdm1pZCgpIHsKKwkJcmV0dXJuIGp2bWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEp2bWlkKFN0cmluZyBqdm1pZCkgeworCQl0aGlzLmp2bWlkID0ganZtaWQ7CisJfQorCisJcHVibGljIExvbmcgZ2V0SnZtY3B1KCkgeworCQlyZXR1cm4ganZtY3B1OworCX0KKworCXB1YmxpYyB2b2lkIHNldEp2bWNwdShMb25nIGp2bWNwdSkgeworCQl0aGlzLmp2bWNwdSA9IGp2bWNwdTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRKdm1tZW0oKSB7CisJCXJldHVybiBqdm1tZW07CisJfQorCisJcHVibGljIHZvaWQgc2V0SnZtbWVtKExvbmcganZtbWVtKSB7CisJCXRoaXMuanZtbWVtID0ganZtbWVtOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEp2bXRudW0oKSB7CisJCXJldHVybiBqdm10bnVtOworCX0KKworCXB1YmxpYyB2b2lkIHNldEp2bXRudW0oSW50ZWdlciBqdm10bnVtKSB7CisJCXRoaXMuanZtdG51bSA9IGp2bXRudW07CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcHBpZCgpIHsKKwkJcmV0dXJuIGFwcGlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFwcGlkKFN0cmluZyBhcHBpZCkgeworCQl0aGlzLmFwcGlkID0gYXBwaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcHBzdGF0KCkgeworCQlyZXR1cm4gYXBwc3RhdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcHBzdGF0KFN0cmluZyBhcHBzdGF0KSB7CisJCXRoaXMuYXBwc3RhdCA9IGFwcHN0YXQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldEZvcm1hdHRlZFN0cmluZyhNT05JVE9SSU5HX0VWRU5UX1RFTVBMQVRFLCBob3N0aWQsIGhvc3RjcHUsIGhvc3RtZW0sIGhvc3RkaXNrLCBqdm1pZCwganZtY3B1LCBqdm1tZW0sCisJCQkJanZtdG51bSwgYXBwaWQsIGFwcHN0YXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL21vbml0b3JpbmcvTW9uaXRvcmluZ01ldHJpY3NGZXRjaGVyLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9tb25pdG9yaW5nL01vbml0b3JpbmdNZXRyaWNzRmV0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjFhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9tb25pdG9yaW5nL01vbml0b3JpbmdNZXRyaWNzRmV0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NZW1vcnlNWEJlYW47CitpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuUnVudGltZU1YQmVhbjsKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5UaHJlYWRNWEJlYW47CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmh5cGVyaWMuc2lnYXIuRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuaHlwZXJpYy5zaWdhci5TaWdhcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5FeHRlcm5hbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIE1vbml0b3JpbmdNZXRyaWNzRmV0Y2hlciB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbW9uaXRvcmluZ0xvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKCJhc2RjLmZlLm1vbml0b3JpbmcuZmV0Y2hlciIpOworCisJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgTW9uaXRvcmluZ01ldHJpY3NGZXRjaGVyIGluc3RhbmNlOworCXByaXZhdGUgc3RhdGljIFJ1bnRpbWVNWEJlYW4gcnVudGltZU1YQmVhbjsKKwlwcml2YXRlIHN0YXRpYyBUaHJlYWRNWEJlYW4gdGhyZWFkTVhCZWFuOworCXByaXZhdGUgc3RhdGljIE1lbW9yeU1YQmVhbiBtZW1vcnlNWEJlYW47CisJcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgcGxhdGZvcm1NQmVhblNlcnZlcjsKKwlwcml2YXRlIHN0YXRpYyBTaWdhciBzaWdhclNlc3Npb247CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwTmFtZTsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcganZtTmFtZSA9ICJVbmtub3duIjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NQVV9USU1FX0FUVFIgPSAiUHJvY2Vzc0NwdVRpbWUiOworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEZFX0pWTV9OQU1FID0gImpldHR5LWZlIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkVfSlZNX05BTUUgPSAiamV0dHktYmUiOworCisJcHJpdmF0ZSBNb25pdG9yaW5nTWV0cmljc0ZldGNoZXIoKSB7CisJfTsKKworCXB1YmxpYyBzdGF0aWMgTW9uaXRvcmluZ01ldHJpY3NGZXRjaGVyIGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworCQkJaW5zdGFuY2UgPSBpbml0KCk7CisJCX0KKwkJcmV0dXJuIGluc3RhbmNlOworCX0KKworCXB1YmxpYyBNb25pdG9yaW5nRXZlbnQgZ2V0TW9uaXRvcmluZ01ldHJpY3MoKSB7CisJCU1vbml0b3JpbmdFdmVudCBtb25pdG9yaW5nRXZlbnQgPSBuZXcgTW9uaXRvcmluZ0V2ZW50KCk7CisJCW1vbml0b3JpbmdFdmVudC5zZXRIb3N0aWQoZ2V0RlFETigpKTsKKwkJbW9uaXRvcmluZ0V2ZW50LnNldEhvc3RjcHUoZ2V0SG9zdENwdVRpbWUoKSk7CisJCW1vbml0b3JpbmdFdmVudC5zZXRIb3N0bWVtKGdldEhvc3RVc2VkTWVtb3J5KCkpOworCQltb25pdG9yaW5nRXZlbnQuc2V0SG9zdGRpc2soZ2V0SG9zdFVzZWREaXNrKCkudG9TdHJpbmcoKSk7CisKKwkJbW9uaXRvcmluZ0V2ZW50LnNldEp2bWlkKGp2bU5hbWUpOworCisJCW1vbml0b3JpbmdFdmVudC5zZXRKdm1jcHUoZ2V0SnZtQ3B1VGltZSgpKTsKKwkJbW9uaXRvcmluZ0V2ZW50LnNldEp2bW1lbShnZXRKdm1Vc2VkSGVhcE1lbW9yeSgpKTsKKwkJbW9uaXRvcmluZ0V2ZW50LnNldEp2bXRudW0oZ2V0SnZtVGhyZWFkcygpKTsKKworCQltb25pdG9yaW5nRXZlbnQuc2V0QXBwaWQoYXBwTmFtZSk7CisJCS8vIHRoaXMgaXMgcHJvYmFibHkgZnJvbSBoZWFsdGhjaGVjaworCQkvLyBUT0RPCisJCW1vbml0b3JpbmdFdmVudC5zZXRBcHBzdGF0KCJhcHBTdGF0dXMiKTsKKwkJcmV0dXJuIG1vbml0b3JpbmdFdmVudDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgTW9uaXRvcmluZ01ldHJpY3NGZXRjaGVyIGluaXQoKSB7CisJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisJCQlpbnN0YW5jZSA9IG5ldyBNb25pdG9yaW5nTWV0cmljc0ZldGNoZXIoKTsKKwkJCXRocmVhZE1YQmVhbiA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFRocmVhZE1YQmVhbigpOworCQkJbWVtb3J5TVhCZWFuID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0TWVtb3J5TVhCZWFuKCk7CisJCQlydW50aW1lTVhCZWFuID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UnVudGltZU1YQmVhbigpOworCQkJcGxhdGZvcm1NQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKKwkJCXNpZ2FyU2Vzc2lvbiA9IG5ldyBTaWdhcigpOworCQkJYXBwTmFtZSA9IEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRBcHBOYW1lKCk7CisJCQltb25pdG9yaW5nTG9nZ2VyLmRlYnVnKCJhcHBOYW1lIGlzIHt9IiwgYXBwTmFtZSk7CisJCQkvLyBBY2NvcmlkbmcgdG8gWWFraSwgdGhlcmUgaXMgbm8gImNhbGN1bGF0ZWQiIGp2bU5hbWUgbGlrZSBpdCB3YXMKKwkJCS8vIGluIFRBUywKKwkJCS8vIGp1c3QgImpldHR5LWJlIiBvciAiamV0dHktZmUiCisJCQlpZiAoYXBwTmFtZS5jb250YWlucygiZmUiKSkgeworCQkJCWp2bU5hbWUgPSBGRV9KVk1fTkFNRTsKKwkJCX0gZWxzZSBpZiAoYXBwTmFtZS5jb250YWlucygiYmUiKSkgeworCQkJCWp2bU5hbWUgPSBCRV9KVk1fTkFNRTsKKwkJCX0gZWxzZSB7CisJCQkJbW9uaXRvcmluZ0xvZ2dlcgorCQkJCQkJLndhcm4oIkNvdWxkbid0IGRldGVybWluZSBqdm1OYW1lLCBhcHBOYW1lIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gXCJiZVwiIG9yIFwiZmVcIiBzdHJpbmciKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpdmUgdGhyZWFkcyBmb3IgdGhpcyBKVk0KKwkgKiAKKwkgKiBAcmV0dXJuIG51bWJlciBvZiBsaXZlIHRocmVhZHMKKwkgKi8KKwlwcml2YXRlIEludGVnZXIgZ2V0SnZtVGhyZWFkcygpIHsKKwkJcmV0dXJuIHRocmVhZE1YQmVhbi5nZXRUaHJlYWRDb3VudCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1c2VkIGhlYXAgbWVtb3J5IChieXRlcykKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlZCBoZWFwIG1lbW9yeSAoYnl0ZXMpCisJICovCisJcHJpdmF0ZSBsb25nIGdldEp2bVVzZWRIZWFwTWVtb3J5KCkgeworCQlyZXR1cm4gbWVtb3J5TVhCZWFuLmdldEhlYXBNZW1vcnlVc2FnZSgpLmdldFVzZWQoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBqdm0gY3B1IHRpbWUgKG1zZWMpCisJICogCisJICogQHJldHVybiB0aGUganZtIGNwdSB0aW1lIChtc2VjKQorCSAqLworCXByaXZhdGUgbG9uZyBnZXRKdm1DcHVUaW1lKCkgeworCisJCWxvbmcgY3B1VGltZSA9IC0xOworCQl0cnkgeworCQkJY3B1VGltZSA9IChsb25nKSBwbGF0Zm9ybU1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSgKKwkJCQkJbmV3IE9iamVjdE5hbWUoTWFuYWdlbWVudEZhY3RvcnkuT1BFUkFUSU5HX1NZU1RFTV9NWEJFQU5fTkFNRSksIFBST0NFU1NfQ1BVX1RJTUVfQVRUUik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQltb25pdG9yaW5nTG9nZ2VyLmVycm9yKCJDb3VsZG4ndCBtZWFzdXJlIEpWTSBDUFUgdGltZSwgZXJyb3I6IHt9IiwgZSk7CisJCX0KKwkJcmV0dXJuIGNwdVRpbWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaG9zdCB0b3RhbCBjcHUgdGltZSAobXNlYykKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBob3N0IHRvdGFsIGNwdSB0aW1lIChtc2VjKQorCSAqLworCXByaXZhdGUgbG9uZyBnZXRIb3N0Q3B1VGltZSgpIHsKKwkJbG9uZyBjcHVUaW1lID0gLTE7CisJCXRyeSB7CisJCQljcHVUaW1lID0gc2lnYXJTZXNzaW9uLmdldENwdSgpLmdldFRvdGFsKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQltb25pdG9yaW5nTG9nZ2VyLmVycm9yKCJDb3VsZG4ndCBtZWFzdXJlIGhvc3QgQ1BVIHRpbWUsIGVycm9yOiB7fSIsIGUpOworCQl9CisJCXJldHVybiBjcHVUaW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGhvc3QgdXNlZCBtZW1vcnkobXNlYykKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBob3N0IHVzZWQgbWVtb3J5KG1zZWMpCisJICovCisJcHJpdmF0ZSBEb3VibGUgZ2V0SG9zdFVzZWRNZW1vcnkoKSB7CisJCURvdWJsZSBtZW1vcnkgPSAtMS4wOworCQl0cnkgeworCQkJbWVtb3J5ID0gc2lnYXJTZXNzaW9uLmdldE1lbSgpLmdldFVzZWRQZXJjZW50KCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQltb25pdG9yaW5nTG9nZ2VyLmVycm9yKCJDb3VsZG4ndCBtZWFzdXJlIGhvc3QgdXNlZCBtZW1vcnksIGVycm9yOiB7fSIsIGUpOworCQl9CisJCXJldHVybiBtZW1vcnk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGVyY2VudGFnZSBvZiBhbGwgYXZhaWxhYmxlIEZTCisJICogCisJICogQHJldHVybiB0aGUgaG9zdCBhdmFpbCBkaXNrKGJ5dGVzKQorCSAqLworCXByaXZhdGUgTWFwPFN0cmluZywgRG91YmxlPiBnZXRIb3N0VXNlZERpc2soKSB7CisJCU1hcDxTdHJpbmcsIERvdWJsZT4gcmVzID0gbmV3IEhhc2hNYXA8PigpOworCQl0cnkgeworCQkJRmlsZVN5c3RlbVtdIGZpbGVTeXN0ZW1MaXN0ID0gc2lnYXJTZXNzaW9uLmdldEZpbGVTeXN0ZW1MaXN0KCk7CisJCQlmb3IgKEZpbGVTeXN0ZW0gZmlsZVN5c3RlbSA6IGZpbGVTeXN0ZW1MaXN0KSB7CisKKwkJCQlTdHJpbmcgZGlyTmFtZSA9IGZpbGVTeXN0ZW0uZ2V0RGlyTmFtZSgpOworCQkJCWRvdWJsZSB1c2VQZXJjZW50ID0gc2lnYXJTZXNzaW9uLmdldEZpbGVTeXN0ZW1Vc2FnZShkaXJOYW1lKS5nZXRVc2VQZXJjZW50KCkgKiAxMDA7CisJCQkJcmVzLnB1dChkaXJOYW1lLCB1c2VQZXJjZW50KTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCW1vbml0b3JpbmdMb2dnZXIuZXJyb3IoIkNvdWxkbid0IG1lYXN1cmUgaG9zdCB1c2VkIGRpc2ssIGVycm9yOiB7fSIsIGUpOworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgRlFETgorCSAqIAorCSAqIEByZXR1cm4gdGhlIEZRRE4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRGUUROKCkgeworCQlTdHJpbmcgZnFkbiA9ICIiOworCQl0cnkgeworCQkJZnFkbiA9IHNpZ2FyU2Vzc2lvbi5nZXRGUUROKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQltb25pdG9yaW5nTG9nZ2VyLmVycm9yKCJDb3VsZG4ndCBnZXQgRlFETiwgZXJyb3I6IHt9IiwgZSk7CisJCX0KKwkJcmV0dXJuIGZxZG47CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvSVJlc3RDbGllbnQuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Jlc3QvYXBpL0lSZXN0Q2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYjNkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Jlc3QvYXBpL0lSZXN0Q2xpZW50LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZSB0aGUgbWV0aG9kcyBvZiB0aGUgUkVTVCBnZW5lcmljIGNsaWVudC4gRWFjaCBtZXRob2QKKyAqIHdpbGwgcmVjZWl2ZSB0aGUgZGVzdGluYXRpb24gVVJJIGFuZCBzcGVjaWZpYyBsaXN0IG9mIGhlYWRlcnMuIFdpdGggdGhpcworICogaW5mb3JtYXRpb24gdGhlIFJFU1QgQ2xpZW50IHdpbGwgY3JlYXRlIGEgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWMgUkVTVCBXZWIKKyAqIHNlcnZlci4gRXJyb3IgZnJvbSB0aGUgUkVTVCBXZWIgc2VydmVyIHdpbGwgYmUgcmV0dXJuIGJ5IHByb3ByaWV0YXJ5CisgKiBleGNlcHRpb24gb2JqZWN0LgorICogCisgKiBAYXV0aG9yIGVzb2ZlcgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBJUmVzdENsaWVudCB7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiByZXNvdXJjZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIFVSSS4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogICAgICAgICAgICBGdWxsIFVSTCBwYXRoIHRvIHRoZSBkZXNpcmUgcmVzb3VyY2UuCisJICogQHBhcmFtIGhlYWRlcnMKKwkgKiAgICAgICAgICAgIC0gbGlzdCBvZiBoZWFkZXJzIGluIGZvcm1hdCBvZiBuYW1lIGFuZCB2YWx1ZSwgdG8gYmUgYWRkIGFzCisJICogICAgICAgICAgICBwYXJ0IG9mIHRoZSBIVFRQIHJlcXVlc3QuCisJICogQHJldHVybiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuCisJICovCisJcHVibGljIFJlc3RSZXNwb25zZSBkb0dFVChTdHJpbmcgdXJpLCBQcm9wZXJ0aWVzIGhlYWRlcnMpOworCisJLyoqCisJICogVGhpcyBtZXRob2Qgd2lsbCBDUkVBVEUgcmVzb3VyY2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBVUkkuCisJICogCisJICogQHBhcmFtIHVyaQorCSAqICAgICAgICAgICAgRnVsbCBVUkwgcGF0aCB0byB0aGUgZGVzaXJlIHJlc291cmNlLgorCSAqIEBwYXJhbSBoZWFkZXJzCisJICogICAgICAgICAgICAtIGxpc3Qgb2YgaGVhZGVycyBpbiBmb3JtYXQgb2YgbmFtZSBhbmQgdmFsdWUsIHRvIGJlIGFkZCBhcworCSAqICAgICAgICAgICAgcGFydCBvZiB0aGUgSFRUUCByZXF1ZXN0LgorCSAqIEBwYXJhbSBvYmplY3RUb0NyZWF0ZQorCSAqICAgICAgICAgICAgLSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXNvdXJjZS4KKwkgKi8KKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGRvUE9TVChTdHJpbmcgdXJpLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIE9iamVjdCBvYmplY3RUb0NyZWF0ZSk7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCB3aWxsIFVQREFURSByZXNvdXJjZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIFVSSS4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogICAgICAgICAgICBGdWxsIFVSTCBwYXRoIHRvIHRoZSBkZXNpcmUgcmVzb3VyY2UuCisJICogQHBhcmFtIGhlYWRlcnMKKwkgKiAgICAgICAgICAgIC0gbGlzdCBvZiBoZWFkZXJzIGluIGZvcm1hdCBvZiBuYW1lIGFuZCB2YWx1ZSwgdG8gYmUgYWRkIGFzCisJICogICAgICAgICAgICBwYXJ0IG9mIHRoZSBIVFRQIHJlcXVlc3QuCisJICogQHBhcmFtIG9iamVjdFRvVXBkYXRlCisJICogICAgICAgICAgICAtIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc291cmNlLgorCSAqLworCXB1YmxpYyBSZXN0UmVzcG9uc2UgZG9QVVQoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzLCBPYmplY3Qgb2JqZWN0VG9VcGRhdGUpOworCisJLyoqCisJICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gcmVzb3VyY2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBVUkkuCisJICogCisJICogQHBhcmFtIHVyaQorCSAqICAgICAgICAgICAgRnVsbCBVUkwgcGF0aCB0byB0aGUgZGVzaXJlIHJlc291cmNlLgorCSAqIEBwYXJhbSBoZWFkZXJzCisJICogICAgICAgICAgICAtIGxpc3Qgb2YgaGVhZGVycyBpbiBmb3JtYXQgb2YgbmFtZSBhbmQgdmFsdWUsIHRvIGJlIGFkZCBhcworCSAqICAgICAgICAgICAgcGFydCBvZiB0aGUgSFRUUCByZXF1ZXN0LgorCSAqIAorCSAqLworCXB1YmxpYyBSZXN0UmVzcG9uc2UgZG9ERUxFVEUoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzKTsKKworCS8qKgorCSAqIGluaXRpYWxpemUgdGhlIHJlc3QgY2xpZW50IGluc3RhbmNlLiBUaGUgdGltZW91dCBpcyBpbmZpbml0ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIGluaXRpYWxpemUgdGhlIHJlc3QgY2xpZW50IGluc3RhbmNlIHdpdGggYSBnaXZlbiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzdENvbmZpZ3VyYXRpb25JbmZvCisJICovCisJcHVibGljIGJvb2xlYW4gaW5pdChSZXN0Q29uZmlndXJhdGlvbkluZm8gcmVzdENvbmZpZ3VyYXRpb25JbmZvKTsKKworCS8qKgorCSAqIGRlc3Ryb3kgdGhlIGNvbm5lY3Rpb25zCisJICovCisJcHVibGljIHZvaWQgZGVzdHJveSgpOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvUmVzdENsaWVudFNlcnZpY2VFeGVwdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvUmVzdENsaWVudFNlcnZpY2VFeGVwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGI2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2FwaS9SZXN0Q2xpZW50U2VydmljZUV4ZXB0aW9uLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmFwaTsKKworcHVibGljIGNsYXNzIFJlc3RDbGllbnRTZXJ2aWNlRXhlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI1ODQ3NzA1MjM2OTQ0MDI0Mkw7CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBSZXN0Q2xpZW50U2VydmljZUV4ZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqIAorCSAqIEBwYXJhbSBtc2cKKwkgKiAgICAgICAgICAgIFN0cmluZworCSAqLworCXB1YmxpYyBSZXN0Q2xpZW50U2VydmljZUV4ZXB0aW9uKFN0cmluZyBtc2cpIHsKKwkJc3VwZXIobXNnKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gY2F1c2UKKwkgKiAgICAgICAgICAgIFRocm93YWJsZQorCSAqLworCXB1YmxpYyBSZXN0Q2xpZW50U2VydmljZUV4ZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihjYXVzZSk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICogCisJICogQHBhcmFtIG1zZworCSAqICAgICAgICAgICAgU3RyaW5nCisJICogQHBhcmFtIGNhdXNlCisJICogICAgICAgICAgICBUaHJvd2FibGUKKwkgKi8KKwlwdWJsaWMgUmVzdENsaWVudFNlcnZpY2VFeGVwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobXNnLCBjYXVzZSk7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIHJlc3BvbnNlCisJICoKKwkgKiAgICAgICAgICAgIHB1YmxpYyBSU0NsaWVudFNlcnZpY2VFeGVwdGlvbihDbGllbnRSZXNwb25zZSByZXNwb25zZSkgeworCSAqICAgICAgICAgICAgc3VwZXIoKTsgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOyB9CisJICogCisJICogICAgICAgICAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7IHJldHVybiByZXNwb25zZTsgfQorCSAqIAorCSAqICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2UoQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkgKiAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsgfQorCSAqLworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvUmVzdENvbmZpZ3VyYXRpb25JbmZvLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2FwaS9SZXN0Q29uZmlndXJhdGlvbkluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWE5ZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvUmVzdENvbmZpZ3VyYXRpb25JbmZvLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkJhc2ljQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIFJlc3RDb25maWd1cmF0aW9uSW5mbyBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbiB7CisKKwlwcml2YXRlIEludGVnZXIgcmVhZFRpbWVvdXRJblNlYyA9IG51bGw7CisKKwlwcml2YXRlIEJvb2xlYW4gaWdub3JlQ2VydGlmaWNhdGUgPSBudWxsOworCisJcHJpdmF0ZSBJbnRlZ2VyIGNvbm5lY3Rpb25Qb29sU2l6ZSA9IG51bGw7CisKKwlwcml2YXRlIEludGVnZXIgY29ubmVjdFRpbWVvdXRJblNlYyA9IG51bGw7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSByZWFkVGltZW91dEluU2VjCisJICovCisJcHVibGljIEludGVnZXIgZ2V0UmVhZFRpbWVvdXRJblNlYygpIHsKKwkJcmV0dXJuIHJlYWRUaW1lb3V0SW5TZWM7CisJfQorCisJLyoqCisJICogQHBhcmFtIHJlYWRUaW1lb3V0SW5TZWMKKwkgKiAgICAgICAgICAgIHRoZSByZWFkVGltZW91dEluU2VjIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlYWRUaW1lb3V0SW5TZWMoSW50ZWdlciByZWFkVGltZW91dEluU2VjKSB7CisJCXRoaXMucmVhZFRpbWVvdXRJblNlYyA9IHJlYWRUaW1lb3V0SW5TZWM7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaWdub3JlQ2VydGlmaWNhdGUKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRJZ25vcmVDZXJ0aWZpY2F0ZSgpIHsKKwkJcmV0dXJuIGlnbm9yZUNlcnRpZmljYXRlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpZ25vcmVDZXJ0aWZpY2F0ZQorCSAqICAgICAgICAgICAgdGhlIGlnbm9yZUNlcnRpZmljYXRlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldElnbm9yZUNlcnRpZmljYXRlKEJvb2xlYW4gaWdub3JlQ2VydGlmaWNhdGUpIHsKKwkJdGhpcy5pZ25vcmVDZXJ0aWZpY2F0ZSA9IGlnbm9yZUNlcnRpZmljYXRlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNvbm5lY3Rpb25Qb29sU2l6ZQorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldENvbm5lY3Rpb25Qb29sU2l6ZSgpIHsKKwkJcmV0dXJuIGNvbm5lY3Rpb25Qb29sU2l6ZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY29ubmVjdGlvblBvb2xTaXplCisJICogICAgICAgICAgICB0aGUgY29ubmVjdGlvblBvb2xTaXplIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Qb29sU2l6ZShJbnRlZ2VyIGNvbm5lY3Rpb25Qb29sU2l6ZSkgeworCQl0aGlzLmNvbm5lY3Rpb25Qb29sU2l6ZSA9IGNvbm5lY3Rpb25Qb29sU2l6ZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBjb25uZWN0VGltZW91dEluU2VjCisJICovCisJcHVibGljIEludGVnZXIgZ2V0Q29ubmVjdFRpbWVvdXRJblNlYygpIHsKKwkJcmV0dXJuIGNvbm5lY3RUaW1lb3V0SW5TZWM7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbm5lY3RUaW1lb3V0SW5TZWMKKwkgKiAgICAgICAgICAgIHRoZSBjb25uZWN0VGltZW91dEluU2VjIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbm5lY3RUaW1lb3V0SW5TZWMoSW50ZWdlciBjb25uZWN0VGltZW91dEluU2VjKSB7CisJCXRoaXMuY29ubmVjdFRpbWVvdXRJblNlYyA9IGNvbm5lY3RUaW1lb3V0SW5TZWM7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCWJ1aWxkZXIuYXBwZW5kKCJbIHRpbWVvdXRJblNlYz0iICsgcmVhZFRpbWVvdXRJblNlYyArICIsIik7CisJCWJ1aWxkZXIuYXBwZW5kKCJjb25uZWN0VGltZW91dEluU2VjPSIgKyBjb25uZWN0VGltZW91dEluU2VjICsgIiwiKTsKKwkJYnVpbGRlci5hcHBlbmQoImlnbm9yZUNlcnRpZmljYXRlPSIgKyBpZ25vcmVDZXJ0aWZpY2F0ZSArICIsIik7CisJCWJ1aWxkZXIuYXBwZW5kKCJjb25uZWN0aW9uUG9vbFNpemU9IiArIGNvbm5lY3Rpb25Qb29sU2l6ZSArICJdIik7CisKKwkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Jlc3QvYXBpL1Jlc3RSZXNwb25zZS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvUmVzdFJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4Y2Y3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Jlc3QvYXBpL1Jlc3RSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnJlc3QuYXBpOworCitwdWJsaWMgY2xhc3MgUmVzdFJlc3BvbnNlIHsKKworCXByaXZhdGUgU3RyaW5nIHJlc3BvbnNlOworCisJcHJpdmF0ZSBTdHJpbmcgc3RhdHVzRGVzY3JpcHRpb247CisKKwlwcml2YXRlIGludCBodHRwU3RhdHVzQ29kZSA9IDA7CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSwgU3RyaW5nIHN0YXR1c0Rlc2NyaXB0aW9uLCBpbnQgaHR0cFN0YXR1c0NvZGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworCQl0aGlzLnN0YXR1c0Rlc2NyaXB0aW9uID0gc3RhdHVzRGVzY3JpcHRpb247CisJCXRoaXMuaHR0cFN0YXR1c0NvZGUgPSBodHRwU3RhdHVzQ29kZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSByZXNwb25zZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2UoKSB7CisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcmVzcG9uc2UKKwkgKiAgICAgICAgICAgIHRoZSByZXNwb25zZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKKwkJdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGh0dHBTdGF0dXNDb2RlCisJICovCisJcHVibGljIGludCBnZXRIdHRwU3RhdHVzQ29kZSgpIHsKKwkJcmV0dXJuIGh0dHBTdGF0dXNDb2RlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBodHRwU3RhdHVzQ29kZQorCSAqICAgICAgICAgICAgdGhlIGh0dHBTdGF0dXNDb2RlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEh0dHBTdGF0dXNDb2RlKGludCBodHRwU3RhdHVzQ29kZSkgeworCQl0aGlzLmh0dHBTdGF0dXNDb2RlID0gaHR0cFN0YXR1c0NvZGU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgc3RhdHVzRGVzY3JpcHRpb24KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0Rlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gc3RhdHVzRGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogQHBhcmFtIHN0YXR1c0Rlc2NyaXB0aW9uCisJICogICAgICAgICAgICB0aGUgc3RhdHVzRGVzY3JpcHRpb24gdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0U3RhdHVzRGVzY3JpcHRpb24oU3RyaW5nIHN0YXR1c0Rlc2NyaXB0aW9uKSB7CisJCXRoaXMuc3RhdHVzRGVzY3JpcHRpb24gPSBzdGF0dXNEZXNjcmlwdGlvbjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqIAorCSAqIEVSUk9SOiBFcnJvciBmcm9tIFJlc3QgU2VydmVyOlN0YXR1czogNDAwIE1lc3NhZ2U6IEJhZCBSZXF1ZXN0IEJvZHk6CisJICogSW52YWxpZCBjZWxsOiBDZWxsIHdpdGggY2VsbCBuYW1lIGRtZ3JDZWxsMjIgZG9lcyBub3QgZXhpc3QhCisJICogCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworCQlTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKCJTdGF0dXM6ICIpOworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZChodHRwU3RhdHVzQ29kZSk7CisJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKCJcbiIpOworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZCgiTWVzc2FnZTogIik7CisJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKHN0YXR1c0Rlc2NyaXB0aW9uKTsKKwkJc3RyaW5nQnVpbGRlci5hcHBlbmQoIlxuIik7CisJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKCJCb2R5OiAiKTsKKwkJc3RyaW5nQnVpbGRlci5hcHBlbmQocmVzcG9uc2UpOworCisJCXJldHVybiBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2FwaS9SZXN0UmVzcG9uc2VBc0J5dGVBcnJheS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRkOGVlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9hcGkvUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXkuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKKworcHVibGljIGNsYXNzIFJlc3RSZXNwb25zZUFzQnl0ZUFycmF5IHsKKworCXByaXZhdGUgYnl0ZVtdIHJlc3BvbnNlOworCisJcHJpdmF0ZSBTdHJpbmcgc3RhdHVzRGVzY3JpcHRpb247CisKKwlwcml2YXRlIGludCBodHRwU3RhdHVzQ29kZSA9IDA7CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlQXNCeXRlQXJyYXkoYnl0ZVtdIHJlc3BvbnNlLCBTdHJpbmcgc3RhdHVzRGVzY3JpcHRpb24sIGludCBodHRwU3RhdHVzQ29kZSkgeworCQlzdXBlcigpOworCQl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisJCXRoaXMuc3RhdHVzRGVzY3JpcHRpb24gPSBzdGF0dXNEZXNjcmlwdGlvbjsKKwkJdGhpcy5odHRwU3RhdHVzQ29kZSA9IGh0dHBTdGF0dXNDb2RlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHJlc3BvbnNlCisJICovCisJcHVibGljIGJ5dGVbXSBnZXRSZXNwb25zZSgpIHsKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSByZXNwb25zZQorCSAqICAgICAgICAgICAgdGhlIHJlc3BvbnNlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlKGJ5dGVbXSByZXNwb25zZSkgeworCQl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgaHR0cFN0YXR1c0NvZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldEh0dHBTdGF0dXNDb2RlKCkgeworCQlyZXR1cm4gaHR0cFN0YXR1c0NvZGU7CisJfQorCisJLyoqCisJICogQHBhcmFtIGh0dHBTdGF0dXNDb2RlCisJICogICAgICAgICAgICB0aGUgaHR0cFN0YXR1c0NvZGUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0SHR0cFN0YXR1c0NvZGUoaW50IGh0dHBTdGF0dXNDb2RlKSB7CisJCXRoaXMuaHR0cFN0YXR1c0NvZGUgPSBodHRwU3RhdHVzQ29kZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBzdGF0dXNEZXNjcmlwdGlvbgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBzdGF0dXNEZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc3RhdHVzRGVzY3JpcHRpb24KKwkgKiAgICAgICAgICAgIHRoZSBzdGF0dXNEZXNjcmlwdGlvbiB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXNEZXNjcmlwdGlvbihTdHJpbmcgc3RhdHVzRGVzY3JpcHRpb24pIHsKKwkJdGhpcy5zdGF0dXNEZXNjcmlwdGlvbiA9IHN0YXR1c0Rlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwkJU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZCgiU3RhdHVzOiAiKTsKKwkJc3RyaW5nQnVpbGRlci5hcHBlbmQoaHR0cFN0YXR1c0NvZGUpOworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZCgiXG4iKTsKKwkJc3RyaW5nQnVpbGRlci5hcHBlbmQoIk1lc3NhZ2U6ICIpOworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZChzdGF0dXNEZXNjcmlwdGlvbik7CisJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKCJcbiIpOworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZCgiQm9keSBsZW5ndGg6ICIpOworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZChyZXNwb25zZSA9PSBudWxsID8gMCA6IHJlc3BvbnNlLmxlbmd0aCk7CisKKwkJcmV0dXJuIHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9QcmV0dHlTdHJpbmcoKSB7CisKKwkJaW50IG1heEJ5dGVzVG9EaXNwbGF5ID0gMjAwOworCisJCVN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJc3RyaW5nQnVpbGRlci5hcHBlbmQoIlN0YXR1czogIik7CisJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKGh0dHBTdGF0dXNDb2RlKTsKKwkJc3RyaW5nQnVpbGRlci5hcHBlbmQoIlxuIik7CisJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKCJNZXNzYWdlOiAiKTsKKwkJc3RyaW5nQnVpbGRlci5hcHBlbmQoc3RhdHVzRGVzY3JpcHRpb24pOworCQlzdHJpbmdCdWlsZGVyLmFwcGVuZCgiXG4iKTsKKwkJaWYgKGh0dHBTdGF0dXNDb2RlICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKwkJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKCJCb2R5KG1heGltdW0gIiArIG1heEJ5dGVzVG9EaXNwbGF5ICsgIiBieXRlcyk6ICIpOworCQkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQlieXRlW10gc3ViQXJyYXkgPSBBcnJheXMuY29weU9mUmFuZ2UocmVzcG9uc2UsIDAsIE1hdGgubWluKG1heEJ5dGVzVG9EaXNwbGF5LCByZXNwb25zZS5sZW5ndGgpKTsKKwkJCQlpZiAoc3ViQXJyYXkgIT0gbnVsbCAmJiBzdWJBcnJheS5sZW5ndGggPiAwKSB7CisJCQkJCVN0cmluZyByZXNwb25zZVN0ciA9IG5ldyBTdHJpbmcoc3ViQXJyYXkpOworCQkJCQlzdHJpbmdCdWlsZGVyLmFwcGVuZChyZXNwb25zZVN0cik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJc3RyaW5nQnVpbGRlci5hcHBlbmQoIkJvZHkgbGVuZ3RoOiAiKTsKKwkJCXN0cmluZ0J1aWxkZXIuYXBwZW5kKHJlc3BvbnNlID09IG51bGwgPyAwIDogcmVzcG9uc2UubGVuZ3RoKTsKKwkJfQorCisJCXJldHVybiBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2ltcGwvSHR0cFJlc3RDbGllbnRTZXJ2aWNlSW1wbC5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9pbXBsL0h0dHBSZXN0Q2xpZW50U2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc1YjQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9pbXBsL0h0dHBSZXN0Q2xpZW50U2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDQzNiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmltcGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uUmV1c2VTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyRWxlbWVudEl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwRGVsZXRlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25LZWVwQWxpdmVTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xTb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5YNTA5SG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LlN0cmluZ0VudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuRGVmYXVsdEh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5Qb29saW5nQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQmFzaWNIZWFkZXJFbGVtZW50SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5CYXNpY0h0dHBQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5Db3JlQ29ubmVjdGlvblBOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkhUVFA7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkVudGl0eVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmFwaS5JUmVzdENsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGkuUmVzdENsaWVudFNlcnZpY2VFeGVwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGkuUmVzdENvbmZpZ3VyYXRpb25JbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmFwaS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEh0dHBSZXN0Q2xpZW50U2VydmljZUltcGwgaW1wbGVtZW50cyBJUmVzdENsaWVudCB7CisKKwlwcml2YXRlIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIdHRwUmVzdENsaWVudFNlcnZpY2VJbXBsLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFID0gMTA7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVCA9IDEwOworCisJcHJpdmF0ZSBEZWZhdWx0SHR0cENsaWVudCBodHRwQ2xpZW50OworCisJcHJpdmF0ZSBTU0xTb2NrZXRGYWN0b3J5IHNzbEZhY3Rvcnk7CisKKwlwcml2YXRlIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIdHRwUmVzdENsaWVudFNlcnZpY2VJbXBsLmNsYXNzLmdldE5hbWUoKSk7CisKKwlQb29saW5nQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgY20gPSBudWxsOworCisJcHVibGljIGJvb2xlYW4gaW5pdCgpIHsKKworCQlyZXR1cm4gaW5pdChuZXcgUmVzdENvbmZpZ3VyYXRpb25JbmZvKCkpOworCisJfQorCisJcHVibGljIGJvb2xlYW4gaW5pdChSZXN0Q29uZmlndXJhdGlvbkluZm8gcmVzdENvbmZpZ3VyYXRpb25JbmZvKSB7CisKKwkJYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisJCWxvZ2dlci5kZWJ1ZygiSHR0cFJlc3RDbGllbnRTZXJ2aWNlSW1wbDo6aW5pdCAtIHN0YXJ0LiByZXN0Q29uZmlndXJhdGlvbkluZm89IiArIHJlc3RDb25maWd1cmF0aW9uSW5mbyk7CisKKwkJdHJ5IHsKKwkJCWNyZWF0ZUh0dHBDbGllbnQocmVzdENvbmZpZ3VyYXRpb25JbmZvKTsKKworCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOworCQl9IGNhdGNoIChLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBtc2cgPSAiRmFpbGVkIGNyZWF0aW5nIGNsaWVudCBjb25maWcgZm9yIHJlc3QuICIgKyBlLmdldE1lc3NhZ2UoKTsKKwkJCWxvZ2dlci5lcnJvcihtc2csIGUpOworCQkJLy8gdGhyb3cgbmV3IFJlc3RDbGllbnRTZXJ2aWNlRXhlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworCQkJU3RyaW5nIG1zZyA9ICJGYWlsZWQgY3JlYXRpbmcgY2xpZW50IGNvbmZpZyBmb3IgcmVzdC4gIiArIGUuZ2V0TWVzc2FnZSgpOworCQkJbG9nZ2VyLmVycm9yKG1zZywgZSk7CisJCQkvLyB0aHJvdyBuZXcgUmVzdENsaWVudFNlcnZpY2VFeGVwdGlvbihtc2cpOworCQl9CisKKwkJbG9nZ2VyLmRlYnVnKCJIdHRwUmVzdENsaWVudFNlcnZpY2VJbXBsOjppbml0IC0gZmluaXNoIHN1Y2Nlc3NmdWxseSIpOworCisJCXJldHVybiBpbml0aWFsaXplZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisJCWlmICh0aGlzLmh0dHBDbGllbnQgIT0gbnVsbCkgeworCQkJdGhpcy5odHRwQ2xpZW50LmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuc2h1dGRvd24oKTsKKwkJCWxvZ2dlci5pbmZvKCJBZnRlciBjbG9zaW5nIGNvbm5lY3Rpb24gTWFuYWdlciBvZiByZXN0IENsaWVudC4iKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUh0dHBDbGllbnQoUmVzdENvbmZpZ3VyYXRpb25JbmZvIHJlc3RDb25maWd1cmF0aW9uSW5mbykKKwkJCXRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworCisJCVBvb2xpbmdDbGllbnRDb25uZWN0aW9uTWFuYWdlciBjbSA9IG5ldyBQb29saW5nQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIoKTsKKworCQlJbnRlZ2VyIGNvbm5Qb29sU2l6ZU9iaiA9IHJlc3RDb25maWd1cmF0aW9uSW5mby5nZXRDb25uZWN0aW9uUG9vbFNpemUoKTsKKwkJaW50IGNvbm5Qb29sU2l6ZSA9IERFRkFVTFRfQ09OTkVDVElPTl9QT09MX1NJWkU7CisJCWlmIChjb25uUG9vbFNpemVPYmogIT0gbnVsbCkgeworCQkJY29ublBvb2xTaXplID0gY29ublBvb2xTaXplT2JqLmludFZhbHVlKCk7CisJCQlpZiAoY29ublBvb2xTaXplIDw9IDApIHsKKwkJCQljb25uUG9vbFNpemUgPSBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFOworCQkJfQorCQl9CisJCWNtLnNldE1heFRvdGFsKGNvbm5Qb29sU2l6ZSk7CisKKwkJdGhpcy5odHRwQ2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KGNtKTsKKworCQlpbnQgdGltZW91dEluU2VjID0gcmVzdENvbmZpZ3VyYXRpb25JbmZvLmdldFJlYWRUaW1lb3V0SW5TZWMoKSA9PSBudWxsID8gMAorCQkJCTogcmVzdENvbmZpZ3VyYXRpb25JbmZvLmdldFJlYWRUaW1lb3V0SW5TZWMoKTsKKwkJaW50IGNvbm5lY3RUaW1lb3V0SW5TZWMgPSByZXN0Q29uZmlndXJhdGlvbkluZm8uZ2V0Q29ubmVjdFRpbWVvdXRJblNlYygpID09IG51bGwgPyBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVAorCQkJCTogcmVzdENvbmZpZ3VyYXRpb25JbmZvLmdldENvbm5lY3RUaW1lb3V0SW5TZWMoKTsKKwkJSHR0cFBhcmFtcyBwYXJhbXMgPSBuZXcgQmFzaWNIdHRwUGFyYW1zKCk7CisJCXBhcmFtcy5zZXRQYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuQ09OTkVDVElPTl9USU1FT1VULCBjb25uZWN0VGltZW91dEluU2VjICogMTAwMCk7CisJCXBhcmFtcy5zZXRQYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuU09fVElNRU9VVCwgdGltZW91dEluU2VjICogMTAwMCk7CisKKwkJdGhpcy5odHRwQ2xpZW50LnNldFBhcmFtcyhwYXJhbXMpOworCisJCUJvb2xlYW4gaWdub3JlQ2VydGlmaWNhdGVPYmogPSByZXN0Q29uZmlndXJhdGlvbkluZm8uZ2V0SWdub3JlQ2VydGlmaWNhdGUoKTsKKwkJYm9vbGVhbiBpZ25vcmVDZXJ0aWZpY2F0ZSA9IGZhbHNlOworCQlpZiAoaWdub3JlQ2VydGlmaWNhdGVPYmogIT0gbnVsbCkgeworCQkJaWdub3JlQ2VydGlmaWNhdGUgPSBpZ25vcmVDZXJ0aWZpY2F0ZU9iai5ib29sZWFuVmFsdWUoKTsKKwkJfQorCQlpZiAoaWdub3JlQ2VydGlmaWNhdGUgPT0gdHJ1ZSkgeworCisJCQl0aGlzLnNzbEZhY3RvcnkgPSBjcmVhdGVTU0xTb2NrZXRGYWN0b3J5KCk7CisKKwkJCVNjaGVtZSBzY2hlbWUgPSBuZXcgU2NoZW1lKCJodHRwcyIsIDk0NDMsIHNzbEZhY3RvcnkpOworCQkJdGhpcy5odHRwQ2xpZW50LmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0U2NoZW1lUmVnaXN0cnkoKS5yZWdpc3RlcihzY2hlbWUpOworCQl9CisKKwkJLy8gYWRkS2VlcEFsaXZlKCk7CisKKwkJdGhpcy5jbSA9IGNtOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRLZWVwQWxpdmUoKSB7CisKKwkJdGhpcy5odHRwQ2xpZW50LnNldFJldXNlU3RyYXRlZ3kobmV3IENvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5KCkgeworCisJCQlwdWJsaWMgYm9vbGVhbiBrZWVwQWxpdmUoSHR0cFJlc3BvbnNlIHJlc3BvbnNlLCBIdHRwQ29udGV4dCBjb250ZXh0KSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCX0pOworCisJCXRoaXMuaHR0cENsaWVudC5zZXRLZWVwQWxpdmVTdHJhdGVneShuZXcgQ29ubmVjdGlvbktlZXBBbGl2ZVN0cmF0ZWd5KCkgeworCisJCQlwdWJsaWMgbG9uZyBnZXRLZWVwQWxpdmVEdXJhdGlvbihIdHRwUmVzcG9uc2UgcmVzcG9uc2UsIEh0dHBDb250ZXh0IGNvbnRleHQpIHsKKwkJCQlsb2cuZGVidWcoIj09PT09PT09PT09PSBJbiBnZXRLZWVwQWxpdmVEdXJhdGlvbiA9PT09PT09PT09PT09PT09PSAiKTsKKworCQkJCUhlYWRlckl0ZXJhdG9yIGhlYWRlckl0ZXJhdG9yID0gcmVzcG9uc2UuaGVhZGVySXRlcmF0b3IoSFRUUC5DT05OX0tFRVBfQUxJVkUpOworCQkJCWlmIChoZWFkZXJJdGVyYXRvciAhPSBudWxsKSB7CisJCQkJCUhlYWRlckVsZW1lbnRJdGVyYXRvciBpdCA9IG5ldyBCYXNpY0hlYWRlckVsZW1lbnRJdGVyYXRvcihoZWFkZXJJdGVyYXRvcik7CisJCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQkJCUhlYWRlckVsZW1lbnQgaGUgPSBpdC5uZXh0RWxlbWVudCgpOworCQkJCQkJU3RyaW5nIHBhcmFtID0gaGUuZ2V0TmFtZSgpOworCQkJCQkJU3RyaW5nIHZhbHVlID0gaGUuZ2V0VmFsdWUoKTsKKwkJCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoInRpbWVvdXQiKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWxvZy5kZWJ1ZygiPT09PT09PT09PT09IEluIGdldEtlZXBBbGl2ZUR1cmF0aW9uID09PT09PT09PT09PT09PT09IHt9IiwgdmFsdWUpOworCisJCQkJCQkJCXJldHVybiBMb25nLnBhcnNlTG9uZyh2YWx1ZSkgKiAxMDAwOworCQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKwkJCQkJCQkJbG9nLmVycm9yKCJGYWlsZWQgcGFyc2luZyByZXRyaWV2ZWQgdmFsdWUgb2YgdGltZW91dCBoZWFkZXIuIiwgaWdub3JlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIDIwOworCQkJfQorCQl9KTsKKworCX0KKworCXByb3RlY3RlZCBTU0xTb2NrZXRGYWN0b3J5IGNyZWF0ZVNTTFNvY2tldEZhY3RvcnkoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHsKKwkJVHJ1c3RNYW5hZ2VyIGVhc3lUcnVzdE1hbmFnZXIgPSBuZXcgamF2YXgubmV0LnNzbC5YNTA5VHJ1c3RNYW5hZ2VyKCkgeworCisJCQlwdWJsaWMgdm9pZCBjaGVja0NsaWVudFRydXN0ZWQoamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGFyZzAsIFN0cmluZyBhcmcxKQorCQkJCQl0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBjaGVja1NlcnZlclRydXN0ZWQoamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGFyZzAsIFN0cmluZyBhcmcxKQorCQkJCQl0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24geworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCQkJfQorCisJCQlwdWJsaWMgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZVtdIGdldEFjY2VwdGVkSXNzdWVycygpIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJfTsKKworCQlTU0xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJUTFMiKTsKKwkJc3NsQ29udGV4dC5pbml0KG51bGwsIG5ldyBUcnVzdE1hbmFnZXJbXSB7IGVhc3lUcnVzdE1hbmFnZXIgfSwgbnVsbCk7CisJCVNTTFNvY2tldEZhY3Rvcnkgc3NsRmFjdG9yeSA9IG5ldyBTU0xTb2NrZXRGYWN0b3J5KHNzbENvbnRleHQpOworCisJCXNzbEZhY3Rvcnkuc2V0SG9zdG5hbWVWZXJpZmllcihuZXcgWDUwOUhvc3RuYW1lVmVyaWZpZXIoKSB7CisKKwkJCXB1YmxpYyBib29sZWFuIHZlcmlmeShTdHJpbmcgYXJnMCwgU1NMU2Vzc2lvbiBhcmcxKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgdmVyaWZ5KFN0cmluZyBob3N0LCBTU0xTb2NrZXQgc3NsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCQkJfQorCisJCQlwdWJsaWMgdm9pZCB2ZXJpZnkoU3RyaW5nIGhvc3QsIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUgY2VydCkgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHZlcmlmeShTdHJpbmcgaG9zdCwgU3RyaW5nW10gY25zLCBTdHJpbmdbXSBzdWJqZWN0QWx0cykgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJCQl9CisKKwkJfSk7CisJCXJldHVybiBzc2xGYWN0b3J5OworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIFJTLUdFVCB0byBwZXJmb3JtIEZJTkQuCisJICogCisJICogQHBhcmFtIGhlYWRlclBhcmFtZXRlcktleQorCSAqICAgICAgICAgICAgU3RyaW5nCisJICogQHBhcmFtIGhlYWRlclBhcmFtZXRlclZhbHVlCisJICogICAgICAgICAgICBTdHJpbmcKKwkgKiBAcmV0dXJuIFN0cmluZworCSAqLworCXB1YmxpYyBSZXN0UmVzcG9uc2UgZG9HRVQoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzKSB7CisJCWxvZ2dlci5kZWJ1ZygiQmVmb3JlIGV4ZWN1dGluZyB1cmkgIiArIHVyaSArICIuIGhlYWRlcnMgPSAiICsgaGVhZGVycyk7CisKKwkJSHR0cEdldCBodHRwR2V0ID0gbmV3IEh0dHBHZXQodXJpKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBleGVjdXRlKGh0dHBHZXQsIGhlYWRlcnMpOworCisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkSGVhZGVyc1RvUmVxdWVzdChIdHRwUmVxdWVzdEJhc2UgaHR0cFJlcXVlc3RCYXNlLCBQcm9wZXJ0aWVzIGhlYWRlcnMpIHsKKworCQlpZiAoaGVhZGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQkJCWh0dHBSZXF1ZXN0QmFzZS5hZGRIZWFkZXIoZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSwgZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIFJlc3RSZXNwb25zZSBkb1BPU1QoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzLCBPYmplY3Qgb2JqZWN0VG9DcmVhdGUpIHsKKworCQlsb2dnZXIuZGVidWcoIkJlZm9yZSBleGVjdXRpbmcgdXJpICIgKyB1cmkgKyAiLiBib2R5ID0gIgorCQkJCSsgKG9iamVjdFRvQ3JlYXRlICE9IG51bGwgPyBvYmplY3RUb0NyZWF0ZS50b1N0cmluZygpIDogbnVsbCkgKyAiLiBoZWFkZXJzID0gIiArIGhlYWRlcnMpOworCisJCUh0dHBQb3N0IGh0dHBQb3N0ID0gbmV3IEh0dHBQb3N0KHVyaSk7CisKKwkJaWYgKG9iamVjdFRvQ3JlYXRlICE9IG51bGwpIHsKKwkJCVN0cmluZ0VudGl0eSBzZTsKKwkJCXRyeSB7CisJCQkJc2UgPSBuZXcgU3RyaW5nRW50aXR5KG9iamVjdFRvQ3JlYXRlLnRvU3RyaW5nKCkpOworCisJCQkJLy8gc2Uuc2V0Q29udGVudEVuY29kaW5nKG5ldyBCYXNpY0hlYWRlcihIVFRQLkNPTlRFTlRfVFlQRSwKKwkJCQkvLyAiYXBwbGljYXRpb24vanNvbiIpKTsKKwkJCQlodHRwUG9zdC5zZXRFbnRpdHkoc2UpOworCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIG1zZyA9ICJGYWlsZWQgY3JlYXRpbmcgRW50aXR5IGZvciBwb3N0IHJlcXVlc3QuIiArIGUuZ2V0TWVzc2FnZSgpOworCQkJCWxvZy5lcnJvcihtc2csIGUpOworCQkJCXJldHVybiBudWxsOworCQkJCS8vIHRocm93IG5ldyBSZXN0Q2xpZW50U2VydmljZUV4ZXB0aW9uKG1zZyk7CisJCQl9CisJCX0KKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBleGVjdXRlKGh0dHBQb3N0LCBoZWFkZXJzKTsKKworCQlyZXR1cm4gcmVzcG9uc2U7CisKKwl9CisKKwlwdWJsaWMgUmVzdFJlc3BvbnNlIGRvUFVUKFN0cmluZyB1cmksIFByb3BlcnRpZXMgaGVhZGVycywgT2JqZWN0IG9iamVjdFRvQ3JlYXRlKSB7CisKKwkJbG9nZ2VyLmRlYnVnKCJCZWZvcmUgZXhlY3V0aW5nIHVyaSAiICsgdXJpICsgIi4gYm9keSA9ICIKKwkJCQkrIChvYmplY3RUb0NyZWF0ZSAhPSBudWxsID8gb2JqZWN0VG9DcmVhdGUudG9TdHJpbmcoKSA6IG51bGwpICsgIi4gaGVhZGVycyA9ICIgKyBoZWFkZXJzKTsKKworCQlIdHRwUHV0IGh0dHBQdXQgPSBuZXcgSHR0cFB1dCh1cmkpOworCisJCWlmIChvYmplY3RUb0NyZWF0ZSAhPSBudWxsKSB7CisJCQlTdHJpbmdFbnRpdHkgc2U7CisJCQl0cnkgeworCQkJCXNlID0gbmV3IFN0cmluZ0VudGl0eShvYmplY3RUb0NyZWF0ZS50b1N0cmluZygpKTsKKworCQkJCS8vIHNlLnNldENvbnRlbnRFbmNvZGluZyhuZXcgQmFzaWNIZWFkZXIoSFRUUC5DT05URU5UX1RZUEUsCisJCQkJLy8gImFwcGxpY2F0aW9uL2pzb24iKSk7CisJCQkJaHR0cFB1dC5zZXRFbnRpdHkoc2UpOworCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIG1zZyA9ICJGYWlsZWQgY3JlYXRpbmcgRW50aXR5IGZvciBwb3N0IHJlcXVlc3QuIiArIGUuZ2V0TWVzc2FnZSgpOworCQkJCS8vIHRocm93IG5ldyBSZXN0Q2xpZW50U2VydmljZUV4ZXB0aW9uKG1zZyk7CisJCQkJbG9nLmVycm9yKG1zZywgZSk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBleGVjdXRlKGh0dHBQdXQsIGhlYWRlcnMpOworCisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIFJlc3RSZXNwb25zZSBleGVjdXRlKEh0dHBSZXF1ZXN0QmFzZSBodHRwUmVxdWVzdEJhc2UsIFByb3BlcnRpZXMgaGVhZGVycykgeworCisJCVN0cmluZyByZXNwb25zZSA9IG51bGw7CisJCVN0cmluZyBzdGF0dXNEZXNjID0gbnVsbDsKKwkJaW50IHN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLlNDX09LOworCisJCXRyeSB7CisKKwkJCWFkZEhlYWRlcnNUb1JlcXVlc3QoaHR0cFJlcXVlc3RCYXNlLCBoZWFkZXJzKTsKKworCQkJSHR0cFJlc3BvbnNlIGh0dHBSZXNwb25zZSA9IHRoaXMuaHR0cENsaWVudC5leGVjdXRlKGh0dHBSZXF1ZXN0QmFzZSk7CisKKwkJCXN0YXR1c0NvZGUgPSBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKwkJCXN0YXR1c0Rlc2MgPSBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFJlYXNvblBocmFzZSgpOworCisJCQlIdHRwRW50aXR5IGVudGl0eSA9IGh0dHBSZXNwb25zZS5nZXRFbnRpdHkoKTsKKwkJCWlmIChlbnRpdHkgIT0gbnVsbCkgeworCQkJCXJlc3BvbnNlID0gRW50aXR5VXRpbHMudG9TdHJpbmcoZW50aXR5KTsKKwkJCX0KKwkJCS8vIGVuc3VyZSB0aGUgY29ubmVjdGlvbiBnZXRzIHJlbGVhc2VkIHRvIHRoZSBtYW5hZ2VyCisJCQlFbnRpdHlVdGlscy5jb25zdW1lKGVudGl0eSk7CisKKwkJCWxvZ1Jlc3BvbnNlKHJlc3BvbnNlLCBodHRwUmVxdWVzdEJhc2UuZ2V0TWV0aG9kKCkpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCWh0dHBSZXF1ZXN0QmFzZS5hYm9ydCgpOworCQkJbG9nLmVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSB0aGUgIiArIGh0dHBSZXF1ZXN0QmFzZS5nZXRNZXRob2QoKSArICIgcmVxdWVzdCAiICsgaHR0cFJlcXVlc3RCYXNlLmdldFVSSSgpLAorCQkJCQlleGNlcHRpb24pOworCQkJLy8gcHJvY2Vzc0FuZFRocm93RXhjZXB0aW9uKGV4Y2VwdGlvbik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBuZXcgUmVzdFJlc3BvbnNlKHJlc3BvbnNlLCBzdGF0dXNEZXNjLCBzdGF0dXNDb2RlKTsKKworCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCVVSSSB1cmkgPSBodHRwUmVxdWVzdEJhc2UuZ2V0VVJJKCk7CisJCQlTdHJpbmcgdXJsID0gdXJpLnRvU3RyaW5nKCk7CisJCQlsb2dnZXIuZGVidWcoIkFmdGVyIGV4ZWN1dGluZyB1cmkgIiArIHVybCArICIuIHJlc3BvbnNlID0gIiArIHJlc3RSZXNwb25zZSk7CisJCX0KKworCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCX0KKworCXB1YmxpYyBSZXN0UmVzcG9uc2UgZG9ERUxFVEUoU3RyaW5nIHVyaSwgUHJvcGVydGllcyBoZWFkZXJzKSB7CisKKwkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7CisJCQlsb2dnZXIuZGVidWcoIkJlZm9yZSBleGVjdXRpbmcgdXJpICIgKyB1cmkgKyAiLiBoZWFkZXJzID0gIiArIGhlYWRlcnMpOworCQl9CisKKwkJSHR0cERlbGV0ZSBodHRwRGVsZXRlID0gbmV3IEh0dHBEZWxldGUodXJpKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlID0gZXhlY3V0ZShodHRwRGVsZXRlLCBoZWFkZXJzKTsKKworCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgcHJpbnQgdGhlIEpTT04gcmVzcG9uc2UgZnJvbSB0aGUgUkVTVCBTZXJ2ZXIKKwkgKiAKKwkgKiBAcGFyYW0gcmVzcG9uc2UKKwkgKiAgICAgICAgICAgIHRoZSBKU09OIHJlc3BvbnNlIGZyb20gdGhlIFJFU1Qgc2VydmVyCisJICogQHBhcmFtIG1ldGhvZAorCSAqICAgICAgICAgICAgbmFtZSBvZiBtZXRob2QKKwkgKi8KKwlwcml2YXRlIHZvaWQgbG9nUmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlLCBTdHJpbmcgbWV0aG9kKSB7CisJCWxvZ2dlci5kZWJ1ZyhtZXRob2QgKyAiIHJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsKKwl9CisKKwkvKioKKwkgKiBFeGNlcHRpb24gZHVyaW5nIGNsaWVudCBpbnZvY2F0aW9uIHVzdWFsbHkgaXQgaGFwcGVucyB3aGVuIHN0YXR1cyBjb2RlCisJICogc3RhcnRpbmcgd2l0aCA0MDAgb3IgNTAwIGlzIHJldHVybmVkCisJICogCisJICogQHBhcmFtIGV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgRXhjZXB0aW9uCisJICogQHRocm93cyBSU0NsaWVudFNlcnZpY2VFeGVwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzQW5kVGhyb3dFeGNlcHRpb24oRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFJlc3RDbGllbnRTZXJ2aWNlRXhlcHRpb24geworCisJCWxvZ2dlci5kZWJ1ZygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJbG9nZ2VyLmRlYnVnKCJGQUlMVVJFOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisKKwkJdGhyb3cgbmV3IFJlc3RDbGllbnRTZXJ2aWNlRXhlcHRpb24oZXhjZXB0aW9uKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9pbXBsL1Jlc3RDbGllbnRTZXJ2aWNlRmFjdG9yeS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vcmVzdC9pbXBsL1Jlc3RDbGllbnRTZXJ2aWNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjI1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2ltcGwvUmVzdENsaWVudFNlcnZpY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmltcGw7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5hcGkuSVJlc3RDbGllbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnJlc3QuYXBpLlJlc3RDb25maWd1cmF0aW9uSW5mbzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgUmVzdENsaWVudFNlcnZpY2VGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZXN0Q2xpZW50U2VydmljZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKKworCXB1YmxpYyBzdGF0aWMgSVJlc3RDbGllbnQgY3JlYXRlUmVzdENsaWVudFNlcnZpY2UoUmVzdENvbmZpZ3VyYXRpb25JbmZvIHJlc3RDb25maWd1cmF0aW9uSW5mbykgeworCisJCWxvZy50cmFjZSgiRW50ZXIgY3JlYXRlUmVzdENsaWVudFNlcnZpY2UiKTsKKworCQlIdHRwUmVzdENsaWVudFNlcnZpY2VJbXBsIHJlc3RDbGllbnRTZXJ2aWNlSW1wbCA9IG5ldyBIdHRwUmVzdENsaWVudFNlcnZpY2VJbXBsKCk7CisKKwkJYm9vbGVhbiByZXN1bHQgPSByZXN0Q2xpZW50U2VydmljZUltcGwuaW5pdChyZXN0Q29uZmlndXJhdGlvbkluZm8pOworCQlpZiAocmVzdWx0ID09IGZhbHNlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWxvZy50cmFjZSgiRXhpdCBjcmVhdGVSZXN0Q2xpZW50U2VydmljZSIpOworCisJCXJldHVybiByZXN0Q2xpZW50U2VydmljZUltcGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2ltcGwvdmFsaWRhdG9yL1JlcXVlc3RIZWFkZXJzVmFsaWRhdG9yLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2ltcGwvdmFsaWRhdG9yL1JlcXVlc3RIZWFkZXJzVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyZmYzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Jlc3QvaW1wbC92YWxpZGF0b3IvUmVxdWVzdEhlYWRlcnNWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnJlc3QuaW1wbC52YWxpZGF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0SGVhZGVyc1ZhbGlkYXRvciB7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlcXVlc3RIZWFkZXJzVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVDb250ZW50VHlwZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgTWVkaWFUeXBlIGV4cGVjdGVkQ29udGVudFR5cGUsCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXApIHRocm93cyBSZXN0UmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24geworCisJCWxvZy5kZWJ1ZygidmFsaWRhdGVDb250ZW50VHlwZSAtIGV4cGVjdGVkOiAiICsgZXhwZWN0ZWRDb250ZW50VHlwZSk7CisJCWlmIChyZXF1ZXN0ID09IG51bGwgfHwgZXhwZWN0ZWRDb250ZW50VHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgUmVzdFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uKCJyZXF1ZXN0IG9yIG1lZGlhLXR5cGUgYXJlIG51bGwiKTsKKwkJfQorCQlTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldEhlYWRlcihDb25zdGFudHMuQ09OVEVOVF9UWVBFX0hFQURFUik7CisJCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8ICFjb250ZW50VHlwZS5jb250YWlucyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikpIHsKKwkJCXRocm93IG5ldyBSZXN0UmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24oCisJCQkJCSJDb250ZW50LVR5cGUgb2YgcmVxdXNldCBpcyBkaWZmZXJlbnQgdGhlbiAiICsgZXhwZWN0ZWRDb250ZW50VHlwZSk7CisJCX0gZWxzZSB7CisJCQloZWFkZXJzTWFwLnB1dChDb25zdGFudHMuQ09OVEVOVF9UWVBFX0hFQURFUiwgY29udGVudFR5cGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlSWRlbnRpZmljYXRpb25IZWFkZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBMaXN0PFN0cmluZz4gaWRlbnRpZmljYXRpb25MaXN0LAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwKSB0aHJvd3MgUmVzdFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKworCQlsb2cuZGVidWcoInZhbGlkYXRlSWRlbnRpZmljYXRpb25IZWFkZXJzIik7CisJCWZvciAoU3RyaW5nIHJlcXVpcmVkSGVhZGVyIDogaWRlbnRpZmljYXRpb25MaXN0KSB7CisJCQlTdHJpbmcgaGVhZGVyVmFsID0gcmVxdWVzdC5nZXRIZWFkZXIocmVxdWlyZWRIZWFkZXIpOworCQkJaWYgKGhlYWRlclZhbCAhPSBudWxsICYmICFoZWFkZXJWYWwuaXNFbXB0eSgpKSB7CisJCQkJaGVhZGVyc01hcC5wdXQocmVxdWlyZWRIZWFkZXIsIGhlYWRlclZhbCk7CisJCQkJbG9nLmRlYnVnKCJmb3VuZCBoZWFkZXIgLSAiICsgcmVxdWlyZWRIZWFkZXIgKyAiOiAiICsgaGVhZGVyVmFsKTsKKwkJCX0gZWxzZSB7CisJCQkJbG9nLmVycm9yKCJtaXNzaW5nIGlkZW50aWZpY2F0aW9uIGhlYWRlcjogIiArIHJlcXVpcmVkSGVhZGVyKTsKKwkJCQl0aHJvdyBuZXcgUmVzdFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uKCJtaXNzaW5nIGlkZW50aWZpY2F0aW9uIGhlYWRlcjogIiArIHJlcXVpcmVkSGVhZGVyKTsKKwkJCX0KKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWQ1KGJ5dGVbXSBlbmNvZGVkRGF0YSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCkKKwkJCXRocm93cyBSZXN0UmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24geworCisJCS8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKKwkJaWYgKGVuY29kZWREYXRhID09IG51bGwgfHwgcmVxdWVzdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgUmVzdFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uKCJlbmNvZGVkIGRhdGEgb3IgcmVxdWVzdCBhcmUgbm90IHZhbGlkIik7CisJCX0KKworCQkvLyBjYWxjdWxhdGUgTUQ1IG9uIHRoZSBkYXRhCisJCVN0cmluZyBtZDUgPSBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuZGlnZXN0LkRpZ2VzdFV0aWxzLm1kNUhleChlbmNvZGVkRGF0YSk7CisJCWJ5dGVbXSBlbmNvZGVkTWQ1ID0gQmFzZTY0LmVuY29kZUJhc2U2NChtZDUuZ2V0Qnl0ZXMoKSk7CisKKwkJLy8gcmVhZCB0aGUgQ29udGVudC1NRDUgaGVhZGVyCisJCVN0cmluZyBvcmlnTWQ1ID0gcmVxdWVzdC5nZXRIZWFkZXIoQ29uc3RhbnRzLk1ENV9IRUFERVIpOworCQlpZiAoKG9yaWdNZDUgPT0gbnVsbCkgfHwgb3JpZ01kNS5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBSZXN0UmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24oIm1pc3NpbmcgQ29udGVudC1NRDUgaGVhZGVyICIpOworCQl9CisKKwkJLy8gdmVyaWZ5IE1ENSB2YWx1ZQorCQlpZiAoIW9yaWdNZDUuZXF1YWxzKG5ldyBTdHJpbmcoZW5jb2RlZE1kNSkpKSB7CisJCQl0aHJvdyBuZXcgUmVzdFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uKCJ1cGxvYWRlZCBmaWxlIGZhaWxlZCBNRDUgdmFsaWRhdGlvbiIpOworCQl9CisJCWhlYWRlcnNNYXAucHV0KENvbnN0YW50cy5NRDVfSEVBREVSLCBvcmlnTWQ1KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Jlc3QvaW1wbC92YWxpZGF0b3IvUmVzdFJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2ltcGwvdmFsaWRhdG9yL1Jlc3RSZXF1ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZWQzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9yZXN0L2ltcGwvdmFsaWRhdG9yL1Jlc3RSZXF1ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ucmVzdC5pbXBsLnZhbGlkYXRvcjsKKworcHVibGljIGNsYXNzIFJlc3RSZXF1ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOTYyNjU0NzgzMzgzNTkxNjcyTDsKKworCXB1YmxpYyBSZXN0UmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9zZXJ2bGV0cy9CYXNpY1NlcnZsZXQuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3NlcnZsZXRzL0Jhc2ljU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNmViZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9zZXJ2bGV0cy9CYXNpY1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnNlcnZsZXRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzaWNTZXJ2bGV0IHsKKworCXByb3RlY3RlZCBHc29uIGdzb24gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOworCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0NhcGFiaWxpdHlUeXBlTmFtZUVudW0uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvQ2FwYWJpbGl0eVR5cGVOYW1lRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzhiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0NhcGFiaWxpdHlUeXBlTmFtZUVudW0uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWw7CisKK3B1YmxpYyBlbnVtIENhcGFiaWxpdHlUeXBlTmFtZUVudW0geworCVJPT1QoInRvc2NhLmNhcGFiaWxpdGllcy5Sb290IiksIAorCU5PREUoInRvc2NhLmNhcGFiaWxpdGllcy5Ob2RlIiksIAorCUNPTlRBSU5FUigidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lciIpLCAKKwlFTkRQT0lOVCgidG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50IiksIAorCUVORFBPSU5UX1BVQkxJQygidG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LlB1YmxpYyIpLCAKKwlFTkRQT0lOVF9BRE1JTigidG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIiksIAorCUVORFBPSU5UX0RBVEFCQVNFKCJ0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuRGF0YWJhc2UiKSwgCisJT1BFUkFUSU5HX1NZU1RFTSgidG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbSIpLCAKKwlTQ0FMQUJMRSgidG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlIiksIAorCUJJTkRBQkxFKCJ0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZSIpLAorCURPQ0tFUigidG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lci5Eb2NrZXIiKSwgCisJQVRUQUNITUVOVCgidG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQiKTsKKworCXByaXZhdGUgU3RyaW5nIGNhcGFiaWxpdHlOYW1lOworCisJcHJpdmF0ZSBDYXBhYmlsaXR5VHlwZU5hbWVFbnVtKFN0cmluZyBjYXBOYW1lKSB7CisJCXRoaXMuY2FwYWJpbGl0eU5hbWUgPSBjYXBOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwYWJpbGl0eU5hbWUoKSB7CisJCXJldHVybiBjYXBhYmlsaXR5TmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0dlbmVyYWxVdGlsaXR5LmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0dlbmVyYWxVdGlsaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2MmIwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvR2VuZXJhbFV0aWxpdHkuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgR2VuZXJhbFV0aWxpdHkgeworCisJcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyYXRlVGV4dEZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZmlsZURhdGEpIHsKKwkJYm9vbGVhbiBpc1N1Y2Nlc3NmdWxsID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCUZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZShuZXcgRmlsZShmaWxlTmFtZSksIGZpbGVEYXRhKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJaXNTdWNjZXNzZnVsbCA9IGZhbHNlOworCQl9CisJCXJldHVybiBpc1N1Y2Nlc3NmdWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jhc2U2NEVuY29kZWQoYnl0ZVtdIGRhdGEpIHsKKwkJcmV0dXJuIEJhc2U2NC5pc0Jhc2U2NChkYXRhKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCYXNlNjRFbmNvZGVkKFN0cmluZyBzdHIpIHsKKwkJYm9vbGVhbiBpc0VuY29kZWQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCS8vIGNoZWNrcyBpZiB0aGUgc3RyaW5nIHdhcyBwcm9wZXJseSBwYWRkZWQgdG8gdGhlCisJCQlpc0VuY29kZWQgPSAoKHN0ci5sZW5ndGgoKSAlIDQgPT0gMCkgJiYgKFBhdHRlcm4ubWF0Y2hlcygiXFxBW2EtekEtWjAtOS8rXSs9ezAsMn1cXHoiLCBzdHIpKSk7CisJCQlpZiAoaXNFbmNvZGVkKSB7CisJCQkJLy8gSWYgbm8gZXhjZXB0aW9uIGlzIGNhdWdodCwgdGhlbiBpdCBpcyBwb3NzaWJseSBhIGJhc2U2NAorCQkJCS8vIGVuY29kZWQgc3RyaW5nCisJCQkJYnl0ZVtdIGRhdGEgPSBCYXNlNjQuZGVjb2RlQmFzZTY0KHN0cik7CisJCQl9CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElmIGV4Y2VwdGlvbiBpcyBjYXVnaHQsIHRoZW4gaXQgaXMgbm90IGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nCisJCQlpc0VuY29kZWQgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gaXNFbmNvZGVkOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXNzZWQgc3RyaW5nIGV4Y2VlZHMgYSBsaW1pdCBvZiBudW1iZXIgb2YgY2hhcmFjdGVycy4KKwkgKiAKKwkgKiBAcGFyYW0gc3RyIHN0cgorCSAqIEBwYXJhbSBsaW1pdCBsaW1pdAorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb21wYXJpc29uLCBvciBmYWxzZSBpZiBzdHIgaXMgbnVsbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeGNlZWRpbmdMaW1pdChTdHJpbmcgc3RyLCBpbnQgbGltaXQpIHsKKwkJaWYgKHN0ciA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHN0ci5sZW5ndGgoKSA+IGxpbWl0OworCX0KKworCS8qKgorCSAqIENoZWNrcyB0aGUgcGFzc2VkIHN0cmluZyBsaXN0IHdoZXRoZXIgdGhlIGN1bXVsYXRpdmUgbGVuZ3RoIG9mIHN0cmluZ3MKKwkgKiBhbmQgZGVsaW1pdGVycyBiZXR3ZWVuIHRoZW0gZXhjZWVkcyBhIGxpbWl0IG9mIG51bWJlciBvZiBjaGFyYWN0ZXJzLiBGb3IKKwkgKiBleGFtcGxlIGZvciBsaXN0ICgib25lIiwidHdvIiwidGhyZWUiKSB3aXRoIGRlbGltaXRlciAiLCIgdGhlIGxlbmd0aCBvZgorCSAqIGxpc3QgaXMgY2FsY3VsYXRlZCAzKzErMysxKzU9MTMKKwkgKgorCSAqIEBwYXJhbSBzdHJMaXN0IHN0ckxpc3QKKwkgKiBAcGFyYW0gbGltaXQgTGltaXQKKwkgKiBAcGFyYW0gZGVsaW1pdGVyTGVuZ3RoIGRlbGltaXRlckxlbmd0aAorCSAqICAgICAgICAgICAgLSAwIGlmIHRoZXJlIGlzIG5vIGRlbGltZXRlci4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgY29tcGFyaXNvbiwgb3IgZmFsc2UgaWYgc3RyTGlzdCBpcyBudWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4Y2VlZGluZ0xpbWl0KExpc3Q8U3RyaW5nPiBzdHJMaXN0LCBpbnQgbGltaXQsIGludCBkZWxpbWl0ZXJMZW5ndGgpIHsKKwkJaWYgKHN0ckxpc3QgPT0gbnVsbCB8fCBzdHJMaXN0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWludCBzdW0gPSAwOworCQlpbnQgc2l6ZSA9IHN0ckxpc3Quc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKKwkJCVN0cmluZyBzdHIgPSBzdHJMaXN0LmdldChpKTsKKwkJCWlmIChzdHIgIT0gbnVsbCkgeworCQkJCXN1bSArPSBzdHIubGVuZ3RoKCk7CisJCQl9CisJCQlzdW0gKz0gZGVsaW1pdGVyTGVuZ3RoOworCQl9CisJCVN0cmluZyBzdHIgPSBzdHJMaXN0LmdldChzaXplIC0gMSk7CisJCWlmIChzdHIgIT0gbnVsbCkgeworCQkJc3VtICs9IHN0ci5sZW5ndGgoKTsKKwkJfQorCQlyZXR1cm4gc3VtID4gbGltaXQ7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBleHRlbnNpb24gYXMgdGhlIHN1YnN0cmluZyBmcm9tIHRoZSBsYXN0IGRvdC4gRm9yIGlucHV0CisJICogImt1a3UudHh0IiwgInR4dCIgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm8gZG90IGlzIGZvdW5kIG9yIGlucHV0IGlzIG51bGwsCisJICogZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlTmFtZSBmaWxlTmFtZQorCSAqIEByZXR1cm4gZXh0ZW5zaW9uCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZW5hbWVFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7CisJCVN0cmluZyByZXMgPSBDb25zdGFudHMuRU1QVFlfU1RSSU5HOworCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworCQkJaW50IGluZGV4T2YgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOworCQkJaWYgKGluZGV4T2YgIT0gLTEgJiYgaW5kZXhPZiA8IChmaWxlTmFtZS5sZW5ndGgoKSAtIDEpKSB7CisJCQkJcmVzID0gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4T2YgKyAxKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZU1ENUJ5Qnl0ZUFycmF5KGJ5dGVbXSBwYXlsb2FkKSB7CisJCVN0cmluZyBkZWNvZGVkTWQ1ID0gb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmRpZ2VzdC5EaWdlc3RVdGlscy5tZDVIZXgocGF5bG9hZCk7CisJCWJ5dGVbXSBlbmNvZGVNZDUgPSBCYXNlNjQuZW5jb2RlQmFzZTY0KGRlY29kZWRNZDUuZ2V0Qnl0ZXMoKSk7CisJCXJldHVybiBuZXcgU3RyaW5nKGVuY29kZU1kNSk7CisKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gZGF0YSBkYXRhCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZU1ENUJ5U3RyaW5nKFN0cmluZyBkYXRhKSB7CisJCVN0cmluZyBjYWxjdWxhdGVkTWQ1ID0gb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmRpZ2VzdC5EaWdlc3RVdGlscy5tZDVIZXgoZGF0YSk7CisKKwkJLy8gZW5jb2RlIGJhc2UtNjQgcmVzdWx0CisJCWJ5dGVbXSBlbmNvZGVCYXNlNjQgPSBCYXNlNjQuZW5jb2RlQmFzZTY0KGNhbGN1bGF0ZWRNZDUuZ2V0Qnl0ZXMoKSk7CisJCXJldHVybiBuZXcgU3RyaW5nKGVuY29kZUJhc2U2NCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9Hc29uRmFjdG9yeS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9Hc29uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2JjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0dzb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworCitwdWJsaWMgY2xhc3MgR3NvbkZhY3RvcnkgeworCXByaXZhdGUgc3RhdGljIEdzb24gZ3NvbiA9IG51bGw7CisKKwlwdWJsaWMgc3RhdGljIEdzb24gZ2V0R3NvbigpIHsKKwkJaWYgKGdzb24gPT0gbnVsbCkgeworCQkJc3luY2hyb25pemVkIChHc29uRmFjdG9yeS5jbGFzcykgeworCQkJCWlmIChnc29uID09IG51bGwpIHsKKwkJCQkJZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLmRpc2FibGVIdG1sRXNjYXBpbmcoKS5zZXJpYWxpemVOdWxscygpLmNyZWF0ZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBnc29uOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvSHRtbENsZWFuZXIuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvSHRtbENsZWFuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2JkOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9IdG1sQ2xlYW5lci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5odG1sLkhUTUw7CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5odG1sLkhUTUwuVGFnOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ0VzY2FwZVV0aWxzOworCitwdWJsaWMgY2xhc3MgSHRtbENsZWFuZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gaHRtbFRhZ3MgPSBuZXcgSGFzaFNldDw+KCk7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGF0dGVybkh0bWxGdWxsVGFnU3RyID0gIjwvP1xcdysoKFxccytcXHcrKFxccyo9XFxzKig/OlwiLio/XCJ8Jy4qPyd8W1xcXidcIj5cXHNdKykpPykrXFxzKnxcXHMqKS8/PiI7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGF0dGVybkh0bWxUYWdPbmx5U3RyID0gIjwvPyhcXHcrKVtePl0qLz8+IjsKKworCXByaXZhdGUgc3RhdGljIFBhdHRlcm4gb25seVRhZ1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybkh0bWxUYWdPbmx5U3RyKTsKKworCXByaXZhdGUgc3RhdGljIFBhdHRlcm4gZnVsbFRhZ1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybkh0bWxGdWxsVGFnU3RyKTsKKworCXN0YXRpYyB7CisJCVRhZ1tdIGFsbFRhZ3MgPSBIVE1MLmdldEFsbFRhZ3MoKTsKKwkJZm9yIChUYWcgdGFnIDogYWxsVGFncykgeworCQkJaHRtbFRhZ3MuYWRkKHRhZy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBIdG1sKFN0cmluZyBpbnB1dCkgeworCisJCXJldHVybiBzdHJpcEh0bWwoaW5wdXQsIGZhbHNlKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwSHRtbChTdHJpbmcgaW5wdXQsIGJvb2xlYW4gdG9Fc2NhcGUpIHsKKworCQlpZiAoaW5wdXQgPT0gbnVsbCB8fCB0cnVlID09IGlucHV0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIGlucHV0OworCQl9CisKKwkJTWF0Y2hlciBtYXRjaGVyID0gb25seVRhZ1BhdHRlcm4ubWF0Y2hlcihpbnB1dCk7CisKKwkJU2V0PFN0cmluZz4gdGFnc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8PigpOworCisJCXdoaWxlIChtYXRjaGVyLmZpbmQoKSkgeworCisJCQlpbnQgc3RhcnQgPSBtYXRjaGVyLnN0YXJ0KCk7CisJCQlpbnQgZW5kID0gbWF0Y2hlci5lbmQoKTsKKworCQkJU3RyaW5nIG1hdGNoVGFnID0gaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworCisJCQlpbnQgZ3JvdXBDb3VudCA9IG1hdGNoZXIuZ3JvdXBDb3VudCgpOworCisJCQlpZiAoZ3JvdXBDb3VudCA+IDApIHsKKwkJCQlTdHJpbmcgdGFnID0gbWF0Y2hlci5ncm91cCgxKTsKKwkJCQlpZiAodGFnICE9IG51bGwgJiYgaHRtbFRhZ3MuY29udGFpbnModGFnLnRvTG93ZXJDYXNlKCkpKSB7CisJCQkJCWlmIChmYWxzZSA9PSB0YWdzVG9SZW1vdmUuY29udGFpbnMobWF0Y2hUYWcpKSB7CisJCQkJCQl0YWdzVG9SZW1vdmUuYWRkKG1hdGNoVGFnKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCVN0cmluZyBzdHJpcEh0bWxTdHIgPSByZW1vdmVUYWdzRnJvbVN0cmluZyh0YWdzVG9SZW1vdmUsIGlucHV0KTsKKworCQlpZiAoc3RyaXBIdG1sU3RyICE9IG51bGwpIHsKKwkJCWlmICh0cnVlID09IHRvRXNjYXBlKSB7CisJCQkJc3RyaXBIdG1sU3RyID0gU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSHRtbDQoc3RyaXBIdG1sU3RyKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBzdHJpcEh0bWxTdHI7CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlVGFnc0Zyb21TdHJpbmcoU2V0PFN0cmluZz4gdGFnc1RvUmVtb3ZlLCBTdHJpbmcgaW5wdXQpIHsKKworCQlTdHJpbmcgc3RyaXBTdHIgPSBpbnB1dDsKKwkJaWYgKGlucHV0ID09IG51bGwgfHwgdHJ1ZSA9PSB0YWdzVG9SZW1vdmUuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gaW5wdXQ7CisJCX0KKworCQlmb3IgKFN0cmluZyB0YWcgOiB0YWdzVG9SZW1vdmUpIHsKKwkJCXN0cmlwU3RyID0gc3RyaXBTdHIucmVwbGFjZUFsbCh0YWcsICIiKTsKKwkJfQorCQlyZXR1cm4gc3RyaXBTdHI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0h0dHBVdGlsLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0h0dHBVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmMzRhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvSHR0cFV0aWwuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworaW1wb3J0IGZqLmRhdGEuRWl0aGVyOworCitwdWJsaWMgY2xhc3MgSHR0cFV0aWwgeworCXB1YmxpYyBzdGF0aWMgRWl0aGVyPFN0cmluZywgSU9FeGNlcHRpb24+IHJlYWRKc29uU3RyaW5nRnJvbVJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkJRWl0aGVyPFN0cmluZywgSU9FeGNlcHRpb24+IGVpdGhlclJlc3VsdDsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CisJCQlTZXJ2bGV0SW5wdXRTdHJlYW0gcmVhZGVyID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworCQkJaW50IHZhbHVlOworCQkJd2hpbGUgKCh2YWx1ZSA9IHJlYWRlci5yZWFkKCkpICE9IC0xKSB7CisJCQkJc3RyZWFtLndyaXRlKHZhbHVlKTsKKwkJCX0KKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5sZWZ0KG5ldyBTdHJpbmcoc3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGUpOworCQl9CisJCXJldHVybiBlaXRoZXJSZXN1bHQ7CisKKwl9CisKKwkvKioKKwkgKiBCdWlsZHMgYW4gb2JqZWN0IGZyb20gYSBKU09OIGluIHRoZSBQT1NUIEJvZHkgb2YgdGhlIHJlcXVlc3QuCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gRWl0aGVyPFQsIEV4Y2VwdGlvbj4gZ2V0T2JqZWN0RnJvbUpzb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIENsYXNzPFQ+IGNsYXNzT2ZUKSB7CisJCUVpdGhlcjxULCBFeGNlcHRpb24+IGVpdGhlclJlc3VsdDsKKwkJdHJ5IHsKKwkJCUVpdGhlcjxTdHJpbmcsIElPRXhjZXB0aW9uPiBlaXRoZXJSZWFkSnNvbiA9IHJlYWRKc29uU3RyaW5nRnJvbVJlcXVlc3QocmVxdWVzdCk7CisJCQlpZiAoZWl0aGVyUmVhZEpzb24uaXNMZWZ0KCkpIHsKKwkJCQllaXRoZXJSZXN1bHQgPSBjb252ZXJ0SnNvblN0cmluZ1RvT2JqZWN0KGVpdGhlclJlYWRKc29uLmxlZnQoKS52YWx1ZSgpLCBjbGFzc09mVCk7CisJCQl9IGVsc2UgeworCQkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodCgoRXhjZXB0aW9uKSBlaXRoZXJSZWFkSnNvbi5yaWdodCgpLnZhbHVlKCkpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLnJpZ2h0KGUpOworCQl9CisKKwkJcmV0dXJuIGVpdGhlclJlc3VsdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIDxUPiBFaXRoZXI8VCwgRXhjZXB0aW9uPiBjb252ZXJ0SnNvblN0cmluZ1RvT2JqZWN0KFN0cmluZyBzZW50SnNvbiwgQ2xhc3M8VD4gY2xhc3NPZlQpIHsKKwkJRWl0aGVyPFQsIEV4Y2VwdGlvbj4gZWl0aGVyUmVzdWx0OworCQl0cnkgeworCQkJR3NvbiBnc29uID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKKwkJCVQgb2JqZWN0ID0gZ3Nvbi5mcm9tSnNvbihzZW50SnNvbiwgY2xhc3NPZlQpOworCQkJZWl0aGVyUmVzdWx0ID0gRWl0aGVyLmxlZnQob2JqZWN0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWVpdGhlclJlc3VsdCA9IEVpdGhlci5yaWdodChlKTsKKwkJfQorCQlyZXR1cm4gZWl0aGVyUmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvSnNvblV0aWxzLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0pzb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDcwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL0pzb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKKworcHVibGljIGNsYXNzIEpzb25VdGlscyB7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhKc29uRWxlbWVudCBqc29uRWxlbWVudCkgeworCisJCWlmIChqc29uRWxlbWVudCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCWlmIChmYWxzZSA9PSBqc29uRWxlbWVudC5pc0pzb25OdWxsKCkpIHsKKwkJCWlmIChmYWxzZSA9PSBqc29uRWxlbWVudC5pc0pzb25PYmplY3QoKSkgeworCQkJCXJldHVybiBqc29uRWxlbWVudC5nZXRBc1N0cmluZygpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4ganNvbkVsZW1lbnQudG9TdHJpbmcoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmEwNGZhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9NZXRob2RBY3RpdmF0aW9uU3RhdHVzRW51bS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbDsKKworcHVibGljIGVudW0gTWV0aG9kQWN0aXZhdGlvblN0YXR1c0VudW0geworCVNVQ0NFU1MsIE5PVF9BTExPV0VELCBGQUlMRUQsIE5PVF9GT1VORDsKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvU2VyaWFsaXphdGlvblV0aWxzLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1NlcmlhbGl6YXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjg5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1NlcmlhbGl6YXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLm51c3RhcS5zZXJpYWxpemF0aW9uLkZTVENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXIuRXJyb3JTZXZlcml0eTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgZmouZGF0YS5FaXRoZXI7CisKK3B1YmxpYyBjbGFzcyBTZXJpYWxpemF0aW9uVXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlcmlhbGl6YXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBzdGF0aWMgRlNUQ29uZmlndXJhdGlvbiBjb25mID0gRlNUQ29uZmlndXJhdGlvbi5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbigpOworCisJcHVibGljIHN0YXRpYyBFaXRoZXI8Ynl0ZVtdLCBCb29sZWFuPiBzZXJpYWxpemUoT2JqZWN0IG9iamVjdCkgeworCisJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsgT2JqZWN0T3V0cHV0IG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYm9zKSkgeworCQkJb3V0LndyaXRlT2JqZWN0KG9iamVjdCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoYm9zLnRvQnl0ZUFycmF5KCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nLmRlYnVnKCJGYWlsZWQgdG8gc2VyaWFsaXplIG9iamVjdCIsIGUpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIEVpdGhlcjxPYmplY3QsIEJvb2xlYW4+IGRlc2VyaWFsaXplKGJ5dGVbXSBieXRlcykgeworCisJCXRyeSAoQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsgT2JqZWN0SW5wdXQgaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmlzKSkgeworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KGluLnJlYWRPYmplY3QoKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZXNlcmlhbGl6ZSBvYmplY3QiLCBlKTsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZmFsc2UpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBFaXRoZXI8Ynl0ZVtdLCBCb29sZWFuPiBzZXJpYWxpemVFeHQoT2JqZWN0IG9iamVjdCkgeworCQl0cnkgeworCQkJYnl0ZVtdIHZhbHVlID0gY29uZi5hc0J5dGVBcnJheShvYmplY3QpOworCQkJcmV0dXJuIEVpdGhlci5sZWZ0KHZhbHVlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBFaXRoZXIucmlnaHQoZmFsc2UpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyA8VD4gRWl0aGVyPFQsIEJvb2xlYW4+IGRlc2VyaWFsaXplRXh0KGJ5dGVbXSBieXRlcywgQ2xhc3M8VD4gY2xhenosIFN0cmluZyBjb21wb25lbnROYW1lKSB7CisJCXRyeSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gY29uZi5hc09iamVjdChieXRlcyk7CisJCQlUIGNhc3RPYmplY3QgPSBjbGF6ei5jYXN0KG9iamVjdCk7CisJCQlyZXR1cm4gRWl0aGVyLmxlZnQoY2FzdE9iamVjdCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZGVidWcoIkZhaWxlZCB0byBkZXNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSAiICsgY2xhenogKyAiIGFuZCB1aWQgIiArIGNvbXBvbmVudE5hbWUsIGUpOworCQkJQmVFY29tcEVycm9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvZ0ludGVybmFsVW5leHBlY3RlZEVycm9yKCJEZXNlcmlhbGl6ZU9iamVjdEZyb21DYWNoZSIsCisJCQkJCSJGYWlsZWQgdG8gZGVzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgIiArIGNsYXp6LCBFcnJvclNldmVyaXR5LldBUk5JTkcpOworCQkJcmV0dXJuIEVpdGhlci5yaWdodChmYWxzZSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvU3RyZWFtVXRpbHMuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvU3RyZWFtVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM3MWEzCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9TdHJlYW1VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3BsaXRlcmF0b3JzLkFic3RyYWN0U3BsaXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCisvKioKKyAqIFV0aWxpdHkgQ2xhc3MgRm9yIEFjdGlvbnMgT24gU3RyZWFtcworICogCisgKiBAYXV0aG9yIG1zaGl0cml0CisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3RyZWFtVXRpbHMgeworCXByaXZhdGUgU3RyZWFtVXRpbHMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIEJyZWFrcyB0aGUgc3RyZWFtIHdoZW4gdGhlIHByZWRpY2F0ZSBpcyBub3QgbWV0Ljxicj4KKwkgKiBEb2VzIG5vdCBldmFsdWF0ZSBlbGVtZW50cyBhZnRlciB0aGUgc3RyZWFtIGJyZWFrcy48YnI+CisJICogVGhpcyBtZXRob2QgZXZhbHVhdGVzIHRoZSBzdHJlYW0uPGJyPgorCSAqIAorCSAqIEBwYXJhbSBzdHJlYW0KKwkgKiBAcGFyYW0gcHJlZGljYXRlCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IFN0cmVhbTxUPiB0YWtlV2hpbGVQbHVzT25lTm9FdmFsKFN0cmVhbTxUPiBzdHJlYW0sIFByZWRpY2F0ZTxUPiBwcmVkaWNhdGUpIHsKKwkJTGlzdDxUPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUNvbnN1bWVyPFQ+IGxpc3RBZGRlciA9IGUgLT4gcmVzdWx0cy5hZGQoZSk7CisJCXN0cmVhbS5tYXAoZSAtPiB7CisJCQlsaXN0QWRkZXIuYWNjZXB0KGUpOworCQkJcmV0dXJuIGU7CisJCX0pLmZpbHRlcihlIC0+ICFwcmVkaWNhdGUudGVzdChlKSkuZmluZEZpcnN0KCk7CisJCXJldHVybiByZXN1bHRzLnN0cmVhbSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgPFQ+IFN0cmVhbTxUPiB0YWtlV2hpbGUoU3RyZWFtPFQ+IHN0cmVhbSwgUHJlZGljYXRlPFQ+IHByZWRpY2F0ZSkgeworCQlyZXR1cm4gU3RyZWFtU3VwcG9ydC5zdHJlYW0odGFrZVdoaWxlKHN0cmVhbS5zcGxpdGVyYXRvcigpLCBwcmVkaWNhdGUpLCBmYWxzZSk7CisJfQorCisJcHVibGljIHN0YXRpYyA8VD4gU3RyZWFtPFQ+IHRha2VXaGlsZVBsdXNPbmUoU3RyZWFtPFQ+IHN0cmVhbSwgUHJlZGljYXRlPFQ+IHByZWRpY2F0ZSkgeworCQlyZXR1cm4gU3RyZWFtU3VwcG9ydC5zdHJlYW0odGFrZVdoaWxlKHN0cmVhbS5zcGxpdGVyYXRvcigpLCBuZXcgU3RvcEFmdGVyRmFpbFByZWRpY2F0ZTxUPihwcmVkaWNhdGUpKSwgZmFsc2UpOworCX0KKworCXByaXZhdGUgc3RhdGljIDxUPiBTcGxpdGVyYXRvcjxUPiB0YWtlV2hpbGUoU3BsaXRlcmF0b3I8VD4gc3BsaXRyLCBQcmVkaWNhdGU8VD4gcHJlZGljYXRlKSB7CisJCXJldHVybiBuZXcgTXlTcGxpdEl0ZXJhdG9yPFQ+KHNwbGl0ciwgcHJlZGljYXRlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE15U3BsaXRJdGVyYXRvcjxUPiBleHRlbmRzIEFic3RyYWN0U3BsaXRlcmF0b3I8VD4gaW1wbGVtZW50cyBTcGxpdGVyYXRvcjxUPiB7CisJCWJvb2xlYW4gc3RpbGxHb2luZyA9IHRydWU7CisJCXByaXZhdGUgU3BsaXRlcmF0b3I8VD4gaW5uZXJJdHI7CisJCXByaXZhdGUgUHJlZGljYXRlPFQ+IGlubmVyUHJlZDsKKworCQlwcml2YXRlIE15U3BsaXRJdGVyYXRvcihTcGxpdGVyYXRvcjxUPiBzcGxpdEl0ciwgUHJlZGljYXRlPFQ+IHByZWQpIHsKKwkJCXN1cGVyKHNwbGl0SXRyLmVzdGltYXRlU2l6ZSgpLCAwKTsKKwkJCWlubmVySXRyID0gc3BsaXRJdHI7CisJCQlpbm5lclByZWQgPSBwcmVkOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIHRyeUFkdmFuY2UoQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24pIHsKKwkJCWJvb2xlYW4gY2FuQWR2YW5jZSA9IHRydWU7CisJCQlpZiAoc3RpbGxHb2luZykgeworCQkJCXN0aWxsR29pbmcgPSBpbm5lckl0ci50cnlBZHZhbmNlKGNyZWF0ZUNvbnN1bWVyV3JhcHBlcihhY3Rpb24pKTsKKwkJCX0gZWxzZSB7CisJCQkJY2FuQWR2YW5jZSA9IGZhbHNlOworCQkJfQorCQkJcmV0dXJuIGNhbkFkdmFuY2U7CisJCX0KKworCQlwcml2YXRlIENvbnN1bWVyPD8gc3VwZXIgVD4gY3JlYXRlQ29uc3VtZXJXcmFwcGVyKENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uKSB7CisJCQlDb25zdW1lcjw/IHN1cGVyIFQ+IGNvbnMgPSBuZXcgQ29uc3VtZXI8VD4oKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgYWNjZXB0KFQgdCkgeworCQkJCQlzdGlsbEdvaW5nID0gaW5uZXJQcmVkLnRlc3QodCk7CisJCQkJCWlmIChzdGlsbEdvaW5nKSB7CisJCQkJCQlhY3Rpb24uYWNjZXB0KHQpOworCQkJCQl9CisKKwkJCQl9CisJCQl9OworCisJCQlyZXR1cm4gY29uczsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBTdG9wQWZ0ZXJGYWlsUHJlZGljYXRlPFQ+IGltcGxlbWVudHMgUHJlZGljYXRlPFQ+IHsKKwkJYm9vbGVhbiBoYXNOb3RGYWlsZWQ7CisJCVByZWRpY2F0ZTxUPiBpbm5lclByZWRpY2F0ZTsKKworCQlwcml2YXRlIFN0b3BBZnRlckZhaWxQcmVkaWNhdGUoUHJlZGljYXRlPFQ+IHByZWQpIHsKKwkJCWhhc05vdEZhaWxlZCA9IHRydWU7CisJCQlpbm5lclByZWRpY2F0ZSA9IHByZWQ7CisJCX07CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIHRlc3QoVCB0KSB7CisJCQlib29sZWFuIGlzUGFzc2VkOworCQkJaWYgKGhhc05vdEZhaWxlZCkgeworCQkJCWlzUGFzc2VkID0gdHJ1ZTsKKwkJCQloYXNOb3RGYWlsZWQgPSBpbm5lclByZWRpY2F0ZS50ZXN0KHQpOworCQkJfSBlbHNlIHsKKwkJCQlpc1Bhc3NlZCA9IGZhbHNlOworCQkJfQorCQkJcmV0dXJuIGlzUGFzc2VkOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvVGhyZWFkTG9jYWxzSG9sZGVyLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1RocmVhZExvY2Fsc0hvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTBjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1RocmVhZExvY2Fsc0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbDsKKworcHVibGljIGNsYXNzIFRocmVhZExvY2Fsc0hvbGRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxTdHJpbmc+IHV1aWRUaHJlYWRMb2NhbCA9IG5ldyBUaHJlYWRMb2NhbDw+KCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8TG9uZz4gcmVxdWVzdFN0YXJ0VGltZVRocmVhZExvY2FsID0gbmV3IFRocmVhZExvY2FsPD4oKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxCb29sZWFuPiBpc01kY1Byb2Nlc3NlZFRocmVhZExvY2FsID0gbmV3IFRocmVhZExvY2FsPEJvb2xlYW4+KCkgeworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEJvb2xlYW4gaW5pdGlhbFZhbHVlKCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNZGNQcm9jZXNzZWQoQm9vbGVhbiBpc01kY1Byb2Nlc3NlZCkgeworCQlpc01kY1Byb2Nlc3NlZFRocmVhZExvY2FsLnNldChpc01kY1Byb2Nlc3NlZCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFV1aWQoU3RyaW5nIHV1aWQpIHsKKwkJdXVpZFRocmVhZExvY2FsLnNldCh1dWlkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVxdWVzdFN0YXJ0VGltZShMb25nIHJlcXVlc3RTdGFydFRpbWUpIHsKKwkJcmVxdWVzdFN0YXJ0VGltZVRocmVhZExvY2FsLnNldChyZXF1ZXN0U3RhcnRUaW1lKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVdWlkKCkgeworCQlyZXR1cm4gdXVpZFRocmVhZExvY2FsLmdldCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTG9uZyBnZXRSZXF1ZXN0U3RhcnRUaW1lKCkgeworCQlyZXR1cm4gcmVxdWVzdFN0YXJ0VGltZVRocmVhZExvY2FsLmdldCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBpc01kY1Byb2Nlc3NlZCgpIHsKKwkJcmV0dXJuIGlzTWRjUHJvY2Vzc2VkVGhyZWFkTG9jYWwuZ2V0KCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKSB7CisJCXV1aWRUaHJlYWRMb2NhbC5yZW1vdmUoKTsKKwkJcmVxdWVzdFN0YXJ0VGltZVRocmVhZExvY2FsLnJlbW92ZSgpOworCQlpc01kY1Byb2Nlc3NlZFRocmVhZExvY2FsLnJlbW92ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvVmFsaWRhdGlvblV0aWxzLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1ZhbGlkYXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjAzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1ZhbGlkYXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsNDk4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nRXNjYXBlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5tYXRoLk51bWJlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50ZXh0LldvcmRVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMudmFsaWRhdG9yLnJvdXRpbmVzLlVybFZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuanNvdXAuSnNvdXA7CitpbXBvcnQgb3JnLmpzb3VwLmhlbHBlci5TdHJpbmdVdGlsOworaW1wb3J0IG9yZy5qc291cC5zYWZldHkuV2hpdGVsaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyTWF0Y2hlcjsKKworcHVibGljIGNsYXNzIFZhbGlkYXRpb25VdGlscyB7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIENPTVBPTkVOVF9OQU1FX01BWF9MRU5HVEggPSAxMDI0OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBDT01QT05FTlRfTkFNRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW1xcdyBcXC5cXC1cXF9cXDpcXCtdezEsIiArIENPTVBPTkVOVF9OQU1FX01BWF9MRU5HVEggKyAifSQiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgQURESVRJT05BTF9JTkZPUk1BVElPTl9LRVlfTUFYX0xFTkdUSCA9IDUwOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBBRERJVElPTkFMX0lORk9STUFUSU9OX0tFWV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW1xcd1xcc1xcLlxcLVxcX117MSwiICsgQ09NUE9ORU5UX05BTUVfTUFYX0xFTkdUSCArICJ9JCIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBSU0lfTkFNRV9NQVhfTEVOR1RIID0gMTAyNDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gUlNJX05BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXltcXHcgXFxzXFwuXFwtXFxfXFw6XFwrXXsxLCIgKyBSU0lfTkFNRV9NQVhfTEVOR1RIICsgIn0kIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIENPTU1FTlRfTUFYX0xFTkdUSCA9IDI1NjsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBJQ09OX01BWF9MRU5HVEggPSAyNTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gSUNPTl9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW1xcd1xcLV17MSwiICsgSUNPTl9NQVhfTEVOR1RIICsgIn0kIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIFBST0pFQ1RfQ09ERV9NQVhfTEVHVEggPSAxMDsKKwkvL3B1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBQUk9KRUNUX0NPREVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXltcXGRdezUsIiArIFBST0pFQ1RfQ09ERV9NQVhfTEVHVEggKyAifSQiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gUFJPSkVDVF9DT0RFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl5bXFxzXFx3Xy4tXXsxLDUwfSQiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgQ09OTlRBQ1RfSURfTUFYX0xFTkdUSCA9IDY7CisJLy8gRm9ybWF0IDogYWFubm5YICh3aGVyZSBhPWEteiBvciBBLVosIG49MC05LCBhbmQgWD1hLXosQS1aLCBvciAwLTkpCisJLy9wdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ09OVEFDVF9JRF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJbbU1dezF9WzAtOV17NX18W2EtekEtWl17Mn1bMC05XXs0fXxbYS16QS1aXXsyfVswLTldezN9W2EtekEtWl17MX0iKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ09OVEFDVF9JRF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW1xcc1xcd18uLV17MSw1MH0kIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIE9DVEVUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIiVbYS1mQS1GMC05XXsyfSIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBOT05FX1VURjhfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiW15cXHgwMC1cXHg3Rl0rIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFVSTF9JTlZBTElERV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJbLCM/JkAkPD5+XmBcXFxcXFxbXFxde318XCIpKCohKz07JV0rIik7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gRU5HTElTSF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW1xccHtHcmFwaH1cXHgyMF0rJCIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBDT01QT05FTlRfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCA9IDEwMjQ7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIFRBR19NQVhfTEVOR1RIID0gMTAyNDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgVEFHX0xJU1RfTUFYX0xFTkdUSCA9IDEwMjQ7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIFZFTkRPUl9OQU1FX01BWF9MRU5HVEggPSAyNTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gVkVORE9SX05BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXltcXHgyMC1cXHgyMVxceDIzLVxceDI5XFx4MkItXFx4MkVcXHgzMC1cXHgzOVxceDNCXFx4M0RcXHg0MC1cXHg1QlxceDVELVxceDdCXFx4N0QtXFx4RkZdKyQiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgVkVORE9SX1JFTEVBU0VfTUFYX0xFTkdUSCA9IDI1OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBWRU5ET1JfUkVMRUFTRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW1xceDIwLVxceDIxXFx4MjMtXFx4MjlcXHgyQi1cXHgyRVxceDMwLVxceDM5XFx4M0JcXHgzRFxceDQwLVxceDVCXFx4NUQtXFx4N0JcXHg3RC1cXHhGRl0rJCIpOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIENMRUFOX0ZJTEVOQU1FX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIltcXHgwMC1cXHgxZlxceDgwLVxceDlmXFx4NWMvPD8+XFwqOnxcIi9dKyIpOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIERBU0hfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiWy1dKyIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBVTkRFUlNDT1JFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIltfXSsiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gUExVU19QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJbK10rIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFNQQUNFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlsgXSsiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQU1QX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIlsmXSsiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gRE9UX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIltcXC5dKyIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBBUE9TVF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJbJ10rIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIEhBU0hUQUdfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiWyNdKyIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBFUVVBTF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJbPV0rIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIENPTE9OX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIls6XSsiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQVRfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiW0BdKyIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBBTkRfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiIFthQV1bTm5dW0RkXSAiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFNldDxTdHJpbmc+IENBVEVHT1JZX0NPTkpVTkNUSU9OUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgib2YiLCAidG8iLCAiZm9yIiwgImFzIiwgImEiLCAiYW4iLCAidGhlIikpOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIENPU1RfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXlswLTldezEsNX1cXC5bMC05XXsxLDN9JCIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBBUlRJRkFDVF9MQUJFTF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW2EtekEtWjAtOSBcXC0rXSskIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIEFSVElGQUNUX0xBQkVMX0xFTkdUSCA9IDI1OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBDQVRFR09SWV9MQUJFTF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW2EtekEtWjAtOV1bYS16QS1aMC05ICZcXC4nIz06QF9cXC0rXSskIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIENBVEVHT1JZX0xBQkVMX01JTl9MRU5HVEggPSA0OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBDQVRFR09SWV9MQUJFTF9NQVhfTEVOR1RIID0gMjU7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ09NUE9ORU5UX05BTUVfREVMSU1FVEVSX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIltcXC5cXC1cXF9dKyIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBDT01QT05FTlRfSU5DVEFOQ0VfTkFNRV9ERUxJTUVURVJfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiW1xcLlxcLV0rIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIFBST0RVQ1RfTkFNRV9ERUxJTUVURVJfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiW1xcLlxcLVxcXyY9I0AnOlxcW1xcXVxcK10rIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIENPTlNVTUVSX05BTUVfTUFYX0xFTkdUSCA9IDI1NTsKKwkvLyBwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ09OU1VNRVJfTkFNRV9QQVRURVJOID0KKwkvLyBQYXR0ZXJuLmNvbXBpbGUoIl5bXFx3XXsxfT9bXFx3XFwuXFwtXXswLCIgKyBDT05TVU1FUl9OQU1FX01BWF9MRU5HVEggKworCS8vICJ9PyQiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ09OU1VNRVJfTkFNRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeW1xcd10rW1xcd1xcLlxcLV0qJCIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBDT05TVU1FUl9TQUxUX0xFTkdUSCA9IDMyOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBDT05TVU1FUl9QQVNTV09SRF9MRU5HVEggPSA2NDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ09OU1VNRVJfUEFTU19TQUxUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl5bYS16MC05XSskIik7CisJcHVibGljIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIEZMT0FUX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl5bXFxkXStbXFwuXXsxfVtcXGRdKyQiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gQ0VSVElGSUVEX1ZFUlNJT05fUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiXlsxLTldWzAtOV0qXFwuMCQiKTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFBhdHRlcm4gTUlOT1JfVkVSU0lPTl9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeMFxcLlsxLTldWzAtOV0qJCIpOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgUGF0dGVybiBUQUdTX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIjxbXj48XSo+Iik7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgQVJUSUZBQ1RfTkFNRV9MRU5HVEggPSAyNTU7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIEFQSV9VUkxfTEVOR1RIID0gMTAwOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBBUlRJRkFDVF9ERVNDUklQVElPTl9NQVhfTEVOR1RIID0gMjU2OworCisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIFBST0RVQ1RfRlVMTF9OQU1FX01JTl9MRU5HVEggPSA0OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBQUk9EVUNUX0ZVTExfTkFNRV9NQVhfTEVOR1RIID0gMTAwOworCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlQXJ0aWZhY3RMYWJlbChTdHJpbmcgbGFiZWwpIHsKKwkJcmV0dXJuIEFSVElGQUNUX0xBQkVMX1BBVFRFUk4ubWF0Y2hlcihsYWJlbCkubWF0Y2hlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUNhdGVnb3J5RGlzcGxheU5hbWVGb3JtYXQoU3RyaW5nIGxhYmVsKSB7CisJCWJvb2xlYW4gcmVzID0gdHJ1ZTsKKwkJaWYgKGxhYmVsICE9IG51bGwpIHsKKwkJCWxhYmVsID0gbGFiZWwudHJpbSgpOworCQkJcmVzID0gQ0FURUdPUllfTEFCRUxfUEFUVEVSTi5tYXRjaGVyKGxhYmVsKS5tYXRjaGVzKCk7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVDYXRlZ29yeU5hbWU0RGlzcGxheShTdHJpbmcgc3RyKSB7CisJCWlmIChzdHIgIT0gbnVsbCkgeworCQkJc3RyID0gc3RyLnRyaW0oKTsKKwkJCXN0ciA9IERBU0hfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiLSIpOworCQkJc3RyID0gVU5ERVJTQ09SRV9QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCJfIik7CisJCQlzdHIgPSBBTVBfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiJiIpOworCQkJc3RyID0gUExVU19QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCIrIik7CisJCQlzdHIgPSBET1RfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiLiIpOworCQkJc3RyID0gQVBPU1RfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiJyIpOworCQkJc3RyID0gSEFTSFRBR19QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCIjIik7CisJCQlzdHIgPSBFUVVBTF9QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCI9Iik7CisJCQlzdHIgPSBDT0xPTl9QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCI6Iik7CisJCQlzdHIgPSBBVF9QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCJAIik7CisJCQlzdHIgPSBub3JtYWxpc2VXaGl0ZXNwYWNlKHN0cik7CisJCQlzdHIgPSBBTkRfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiICYgIik7CisKKwkJCS8vIENhc2Ugbm9ybWFsaXppbmcKKwkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJU3RyaW5nW10gc3BsaXQgPSBzdHIuc3BsaXQoIiAiKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgc3BsaXR0ZWQgPSBzcGxpdFtpXTsKKwkJCQlTdHJpbmcgbG93ZXJDYXNlID0gc3BsaXR0ZWQudG9Mb3dlckNhc2UoKTsKKwkJCQkvLyBCQU5LIE9GIEFNRVJJQ0EgLS0+IEJBTksgb2YgQU1FUklDQSAoIm9mIiBpcyBsb3dlcmNhc2VkKSwgYnV0CisJCQkJLy8gT0YgQkFOSyBPRiBBTUVSSUNBIC0tPiBPRiBCQU5LIG9mIEFNRVJJQ0EgKGZpcnN0ICJPRiIgaXMgbm90CisJCQkJLy8gbG93ZXJjYXNlZCBiZWNhdXNlIGl0J3MgZmlyc3Qgd29yZCkKKwkJCQkvLyBBZ3JlZWQgd2l0aCBFbGxhLCAyNi8xMS8xNQorCQkJCWlmICgoaSA+IDApICYmIENBVEVHT1JZX0NPTkpVTkNUSU9OUy5jb250YWlucyhsb3dlckNhc2UpKSB7CisJCQkJCXNiLmFwcGVuZChsb3dlckNhc2UpOworCQkJCX0gZWxzZSB7CisJCQkJCXNiLmFwcGVuZChXb3JkVXRpbHMuY2FwaXRhbGl6ZShzcGxpdHRlZCkpOworCQkJCX0KKwkJCQlzYi5hcHBlbmQoIiAiKTsKKwkJCX0KKwkJCXN0ciA9IHNiLnRvU3RyaW5nKCkudHJpbSgpOworCQl9CisJCXJldHVybiBzdHI7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplQ2F0ZWdvcnlOYW1lNFVuaXF1ZW5lc3MoU3RyaW5nIHN0cikgeworCQlyZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlQ2F0ZWdvcnlEaXNwbGF5TmFtZUxlbmd0aChTdHJpbmcgbGFiZWwpIHsKKwkJcmV0dXJuIChsYWJlbCAhPSBudWxsICYmIGxhYmVsLmxlbmd0aCgpID49IENBVEVHT1JZX0xBQkVMX01JTl9MRU5HVEggJiYgbGFiZWwubGVuZ3RoKCkgPD0gQ0FURUdPUllfTEFCRUxfTUFYX0xFTkdUSCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUHJvZHVjdEZ1bGxOYW1lTGVuZ3RoKFN0cmluZyBmdWxsTmFtZSkgeworCQlyZXR1cm4gKGZ1bGxOYW1lICE9IG51bGwgJiYgZnVsbE5hbWUubGVuZ3RoKCkgPj0gUFJPRFVDVF9GVUxMX05BTUVfTUlOX0xFTkdUSCAmJiBmdWxsTmFtZS5sZW5ndGgoKSA8PSBQUk9EVUNUX0ZVTExfTkFNRV9NQVhfTEVOR1RIKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVBcnRpZmFjdExhYmVsTGVuZ3RoKFN0cmluZyBsYWJlbCkgeworCQlyZXR1cm4gbGFiZWwubGVuZ3RoKCkgPiAwICYmIGxhYmVsLmxlbmd0aCgpIDw9IEFSVElGQUNUX0xBQkVMX0xFTkdUSDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZUluc3RhbmNlTmFtZUxlbmd0aChTdHJpbmcgcmVzb3VyY2VJbnN0YW5jZU5hbWUpIHsKKwkJcmV0dXJuIHJlc291cmNlSW5zdGFuY2VOYW1lLmxlbmd0aCgpIDw9IFJTSV9OQU1FX01BWF9MRU5HVEg7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VJbnN0YW5jZU5hbWUoU3RyaW5nIHJlc291cmNlSW5zdGFuY2VOYW1lKSB7CisJCXJldHVybiBSU0lfTkFNRV9QQVRURVJOLm1hdGNoZXIocmVzb3VyY2VJbnN0YW5jZU5hbWUpLm1hdGNoZXMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVVcmxMZW5ndGgoU3RyaW5nIHVybCkgeworCQlyZXR1cm4gdXJsLmxlbmd0aCgpIDw9IEFQSV9VUkxfTEVOR1RIOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUFydGlmYWN0TmFtZUxlbmd0aChTdHJpbmcgYXJ0aWZhY3ROYW1lKSB7CisJCXJldHVybiAoYXJ0aWZhY3ROYW1lLmxlbmd0aCgpIDw9IEFSVElGQUNUX05BTUVfTEVOR1RIICYmIGFydGlmYWN0TmFtZS5sZW5ndGgoKSA+IDApOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVQYXR0ZXJuKFN0cmluZyBjb21wb25lbnROYW1lKSB7CisJCXJldHVybiBDT01QT05FTlRfTkFNRV9QQVRURVJOLm1hdGNoZXIoY29tcG9uZW50TmFtZSkubWF0Y2hlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWVMZW5ndGgoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKKwkJcmV0dXJuIGNvbXBvbmVudE5hbWUubGVuZ3RoKCkgPD0gQ09NUE9ORU5UX05BTUVfTUFYX0xFTkdUSDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVJY29uKFN0cmluZyBpY29uKSB7CisJCXJldHVybiBJQ09OX1BBVFRFUk4ubWF0Y2hlcihpY29uKS5tYXRjaGVzKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlSWNvbkxlbmd0aChTdHJpbmcgaWNvbikgeworCQlyZXR1cm4gaWNvbi5sZW5ndGgoKSA8PSBJQ09OX01BWF9MRU5HVEg7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUHJvamVjdENvZGUoU3RyaW5nIHByb2plY3RDb2RlKSB7CisJCXJldHVybiBQUk9KRUNUX0NPREVfUEFUVEVSTi5tYXRjaGVyKHByb2plY3RDb2RlKS5tYXRjaGVzKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUHJvamVjdENvZGVMZWd0aChTdHJpbmcgcHJvamVjdENvZGUpIHsKKwkJcmV0dXJuIHByb2plY3RDb2RlLmxlbmd0aCgpIDw9IFBST0pFQ1RfQ09ERV9NQVhfTEVHVEg7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlQ29udGFjdElkKFN0cmluZyBjb250YWN0SWQpIHsKKwkJcmV0dXJuIENPTlRBQ1RfSURfUEFUVEVSTi5tYXRjaGVyKGNvbnRhY3RJZCkubWF0Y2hlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUNvc3QoU3RyaW5nIGNvc3QpIHsKKwkJcmV0dXJuIENPU1RfUEFUVEVSTi5tYXRjaGVyKGNvc3QpLm1hdGNoZXMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVIdG1sVGFncyhTdHJpbmcgc3RyKSB7CisJCXJldHVybiBKc291cC5jbGVhbihzdHIsIFdoaXRlbGlzdC5ub25lKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFRhZ3MoU3RyaW5nIGh0bWxUZXh0KSB7CisKKwkJU3RyaW5nIHN0cmlwcGVkID0gVEFHU19QQVRURVJOLm1hdGNoZXIoaHRtbFRleHQpLnJlcGxhY2VBbGwoIiIpLnRyaW0oKTsKKwkJcmV0dXJuIHN0cmlwcGVkOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGlzZVdoaXRlc3BhY2UoU3RyaW5nIHN0cikgeworCQlyZXR1cm4gU3RyaW5nVXRpbC5ub3JtYWxpc2VXaGl0ZXNwYWNlKHN0cik7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBPY3RldHMoU3RyaW5nIHN0cikgeworCQlyZXR1cm4gT0NURVRfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiIik7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTm9uZVV0ZjhDaGFycyhTdHJpbmcgaW5wdXQpIHsKKwkJcmV0dXJuIE5PTkVfVVRGOF9QQVRURVJOLm1hdGNoZXIoaW5wdXQpLnJlcGxhY2VBbGwoIiIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUlzRW5nbGlzaChTdHJpbmcgaW5wdXQpIHsKKwkJcmV0dXJuIEVOR0xJU0hfUEFUVEVSTi5tYXRjaGVyKGlucHV0KS5tYXRjaGVzKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlSXNBc2NpaShTdHJpbmcgaW5wdXQpIHsKKworCQlib29sZWFuIGlzQXNjaWkgPSBDaGFyTWF0Y2hlci5BU0NJSS5tYXRjaGVzQWxsT2YoaW5wdXQpOworCisJCXJldHVybiBpc0FzY2lpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRIdG1sVGFnc1RvRW50aXRpZXMoU3RyaW5nIGlucHV0KSB7CisJCXJldHVybiBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVIdG1sNChpbnB1dCk7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVtb3ZlRHVwbGljYXRlRnJvbUxpc3QoTGlzdDxTdHJpbmc+IGxpc3QpIHsKKwkJU2V0PFN0cmluZz4gaHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KGxpc3QpOworCQlsaXN0LmNsZWFyKCk7CisJCWxpc3QuYWRkQWxsKGhzKTsKKwkJcmV0dXJuIGxpc3Q7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVUYWdMZW5ndGgoU3RyaW5nIHRhZykgeworCQlpZiAodGFnICE9IG51bGwpIHsKKwkJCXJldHVybiB0YWcubGVuZ3RoKCkgPD0gVEFHX01BWF9MRU5HVEg7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVRhZ0xpc3RMZW5ndGgoaW50IHRhZ0xpc3RMZW5ndGgpIHsKKwkJcmV0dXJuIHRhZ0xpc3RMZW5ndGggPD0gVEFHX0xJU1RfTUFYX0xFTkdUSDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVEZXNjcmlwdGlvbkxlbmd0aChTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uLmxlbmd0aCgpIDw9IENPTVBPTkVOVF9ERVNDUklQVElPTl9NQVhfTEVOR1RIOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVN0cmluZ05vdEVtcHR5KFN0cmluZyB2YWx1ZSkgeworCQlpZiAoKHZhbHVlID09IG51bGwpIHx8ICh2YWx1ZS50cmltKCkuaXNFbXB0eSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUxpc3ROb3RFbXB0eShMaXN0PD8+IGxpc3QpIHsKKwkJaWYgKChsaXN0ID09IG51bGwpIHx8IChsaXN0LmlzRW1wdHkoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVWZW5kb3JOYW1lKFN0cmluZyB2ZW50b3JOYW1lKSB7CisJCXJldHVybiBWRU5ET1JfTkFNRV9QQVRURVJOLm1hdGNoZXIodmVudG9yTmFtZSkubWF0Y2hlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVZlbmRvck5hbWVMZW5ndGgoU3RyaW5nIHZlbnRvck5hbWUpIHsKKwkJcmV0dXJuIHZlbnRvck5hbWUubGVuZ3RoKCkgPD0gVkVORE9SX05BTUVfTUFYX0xFTkdUSDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVWZW5kb3JSZWxlYXNlKFN0cmluZyB2ZW5kb3JSZWxlYXNlKSB7CisJCXJldHVybiBWRU5ET1JfUkVMRUFTRV9QQVRURVJOLm1hdGNoZXIodmVuZG9yUmVsZWFzZSkubWF0Y2hlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVZlbmRvclJlbGVhc2VMZW5ndGgoU3RyaW5nIHZlbmRvclJlbGVhc2UpIHsKKwkJcmV0dXJuIHZlbmRvclJlbGVhc2UubGVuZ3RoKCkgPD0gVkVORE9SX1JFTEVBU0VfTUFYX0xFTkdUSDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQmVlbkNlcnRpZmllZChTdHJpbmcgdmVyc2lvbikgeworCQlyZXR1cm4gTnVtYmVyVXRpbHMudG9Eb3VibGUodmVyc2lvbikgPj0gMTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpc2VDb21wb25lbnROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZ1tdIHNwbGl0ID0gc3BsaXRDb21wb25lbnROYW1lKG5hbWUpOworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoU3RyaW5nIHNwbGl0RWxlbWVudCA6IHNwbGl0KSB7CisJCQlzYi5hcHBlbmQoc3BsaXRFbGVtZW50KTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGlzZUNvbXBvbmVudEluc3RhbmNlTmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmdbXSBzcGxpdCA9IHNwbGl0Q29tcG9uZW50SW5jdGFuY2VOYW1lKG5hbWUpOworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoU3RyaW5nIHNwbGl0RWxlbWVudCA6IHNwbGl0KSB7CisJCQlzYi5hcHBlbmQoc3BsaXRFbGVtZW50KTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNwbGl0Q29tcG9uZW50TmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCW5vcm1hbGl6ZWROYW1lID0gQ09NUE9ORU5UX05BTUVfREVMSU1FVEVSX1BBVFRFUk4ubWF0Y2hlcihub3JtYWxpemVkTmFtZSkucmVwbGFjZUFsbCgiICIpOworCQlTdHJpbmdbXSBzcGxpdCA9IG5vcm1hbGl6ZWROYW1lLnNwbGl0KCIgIik7CisJCXJldHVybiBzcGxpdDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzcGxpdENvbXBvbmVudEluY3RhbmNlTmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCW5vcm1hbGl6ZWROYW1lID0gQ09NUE9ORU5UX0lOQ1RBTkNFX05BTUVfREVMSU1FVEVSX1BBVFRFUk4ubWF0Y2hlcihub3JtYWxpemVkTmFtZSkucmVwbGFjZUFsbCgiICIpOworCQlTdHJpbmdbXSBzcGxpdCA9IG5vcm1hbGl6ZWROYW1lLnNwbGl0KCIgIik7CisJCXJldHVybiBzcGxpdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TeXN0ZW1OYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZ1tdIHNwbGl0ID0gc3BsaXRDb21wb25lbnROYW1lKG5hbWUpOworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoU3RyaW5nIHNwbGl0RWxlbWVudCA6IHNwbGl0KSB7CisJCQlTdHJpbmcgY2FwaXRhbGl6ZSA9IFdvcmRVdGlscy5jYXBpdGFsaXplKHNwbGl0RWxlbWVudCk7CisJCQlzYi5hcHBlbmQoY2FwaXRhbGl6ZSk7CisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplRmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7CisJCS8vIFN0cmluZ1tdIHNwbGl0ID0gZmlsZW5hbWUuc3BsaXQoUGF0dGVybi5xdW90ZShGaWxlLnNlcGFyYXRvcikpOworCQkvLyBTdHJpbmcgbmFtZSA9ICIiOworCQkvLworCQkvLyBuYW1lID0gc3BsaXRbc3BsaXQubGVuZ3RoIC0gMV07CisJCXJldHVybiBjbGVhbkZpbGVOYW1lKGZpbGVuYW1lKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBjbGVhbkZpbGVOYW1lKFN0cmluZyBzdHIpIHsKKwkJc3RyID0gQ0xFQU5fRklMRU5BTUVfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiIik7CisJCXN0ciA9IG5vcm1hbGlzZVdoaXRlc3BhY2Uoc3RyKTsKKwkJc3RyID0gU1BBQ0VfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiLSIpOworCQlzdHIgPSBEQVNIX1BBVFRFUk4ubWF0Y2hlcihzdHIpLnJlcGxhY2VBbGwoIi0iKTsKKwkJc3RyID0gU3RyaW5nVXRpbHMuc3RyaXAoc3RyLCAiLV8gLiIpOworCisJCXJldHVybiBzdHI7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlVXJsKFN0cmluZyB1cmwpIHsKKworCQlVcmxWYWxpZGF0b3IgdXJsVmFsaWRhdG9yID0gbmV3IFVybFZhbGlkYXRvcigpOworCQlpZiAoIXVybFZhbGlkYXRvci5pc1ZhbGlkKHVybCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoTk9ORV9VVEY4X1BBVFRFUk4ubWF0Y2hlcih1cmwpLmZpbmQoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKFVSTF9JTlZBTElERV9QQVRURVJOLm1hdGNoZXIodXJsKS5maW5kKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuQXJ0aWZhY3REaXNwbGF5TmFtZShTdHJpbmcgc3RySW4pIHsKKwkJU3RyaW5nIHN0ciA9IERBU0hfUEFUVEVSTi5tYXRjaGVyKHN0ckluKS5yZXBsYWNlQWxsKCItIik7CisJCXN0ciA9IFVOREVSU0NPUkVfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiXyIpOworCQlzdHIgPSBQTFVTX1BBVFRFUk4ubWF0Y2hlcihzdHIpLnJlcGxhY2VBbGwoIisiKTsKKwkJc3RyID0gbm9ybWFsaXNlV2hpdGVzcGFjZShzdHIpOworCQlzdHIgPSBzdHIudHJpbSgpOworCQkvLyBzdHIgPSBzdHIucmVwbGFjZUFsbCgiICIsICIiKTsKKworCQlyZXR1cm4gc3RyOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZUFydGlmYWN0TGFiZWwoU3RyaW5nIHN0ckluKSB7CisKKwkJU3RyaW5nIHN0ciA9IERBU0hfUEFUVEVSTi5tYXRjaGVyKHN0ckluKS5yZXBsYWNlQWxsKCIiKTsKKwkJc3RyID0gVU5ERVJTQ09SRV9QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCIiKTsKKwkJc3RyID0gUExVU19QQVRURVJOLm1hdGNoZXIoc3RyKS5yZXBsYWNlQWxsKCIiKTsKKwkJc3RyID0gU1BBQ0VfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiIik7CisJCXN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpOworCisJCXJldHVybiBzdHI7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlQWRkaXRpb25hbEluZm9ybWF0aW9uS2V5TmFtZShTdHJpbmcgc3RyKSB7CisJCXJldHVybiBBRERJVElPTkFMX0lORk9STUFUSU9OX0tFWV9QQVRURVJOLm1hdGNoZXIoc3RyKS5tYXRjaGVzKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplQWRkaXRpb25hbEluZm9ybWF0aW9uKFN0cmluZyBzdHIpIHsKKwkJaWYgKHN0ciAhPSBudWxsKSB7CisJCQlzdHIgPSBEQVNIX1BBVFRFUk4ubWF0Y2hlcihzdHIpLnJlcGxhY2VBbGwoIi0iKTsKKwkJCXN0ciA9IFVOREVSU0NPUkVfUEFUVEVSTi5tYXRjaGVyKHN0cikucmVwbGFjZUFsbCgiXyIpOworCQkJc3RyID0gbm9ybWFsaXNlV2hpdGVzcGFjZShzdHIpOworCQl9CisJCXJldHVybiBzdHI7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlTGVuZ3RoKFN0cmluZyBzdHIsIGludCBsZW5ndGgpIHsKKwkJaWYgKHN0ciA9PSBudWxsKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gc3RyLmxlbmd0aCgpIDw9IGxlbmd0aDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVDb25zdW1lck5hbWUoU3RyaW5nIGNvbnN1bWVyTmFtZSkgeworCQlyZXR1cm4gQ09OU1VNRVJfTkFNRV9QQVRURVJOLm1hdGNoZXIoY29uc3VtZXJOYW1lKS5tYXRjaGVzKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVVRGOFN0cihTdHJpbmcgc3RyKSB7CisJCWlmIChOT05FX1VURjhfUEFUVEVSTi5tYXRjaGVyKHN0cikuZmluZCgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlQ29uc3VtZXJQYXNzU2FsdChTdHJpbmcgY29uc3VtZXJTYWx0KSB7CisJCXJldHVybiBDT05TVU1FUl9QQVNTX1NBTFRfUEFUVEVSTi5tYXRjaGVyKGNvbnN1bWVyU2FsdCkubWF0Y2hlcygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Zsb2F0TnVtYmVyKFN0cmluZyBudW1iZXIpIHsKKwkJcmV0dXJuIEZMT0FUX1BBVFRFUk4ubWF0Y2hlcihudW1iZXIpLm1hdGNoZXMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVDZXJ0aWZpZWRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXJldHVybiAodmVyc2lvbiAhPSBudWxsICYmIENFUlRJRklFRF9WRVJTSU9OX1BBVFRFUk4ubWF0Y2hlcih2ZXJzaW9uKS5tYXRjaGVzKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZU1pbm9yVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQlyZXR1cm4gKHZlcnNpb24gIT0gbnVsbCAmJiBNSU5PUl9WRVJTSU9OX1BBVFRFUk4ubWF0Y2hlcih2ZXJzaW9uKS5tYXRjaGVzKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGlzZVByb2R1Y3ROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZ1tdIHNwbGl0ID0gc3BsaXRDb21wb25lbnROYW1lKFBST0RVQ1RfTkFNRV9ERUxJTUVURVJfUEFUVEVSTiwgbmFtZSk7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChTdHJpbmcgc3BsaXRFbGVtZW50IDogc3BsaXQpIHsKKwkJCXNiLmFwcGVuZChzcGxpdEVsZW1lbnQpOworCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc3BsaXRDb21wb25lbnROYW1lKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG5vcm1hbGl6ZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCQlub3JtYWxpemVkTmFtZSA9IHBhdHRlcm4ubWF0Y2hlcihub3JtYWxpemVkTmFtZSkucmVwbGFjZUFsbCgiICIpOworCQlTdHJpbmdbXSBzcGxpdCA9IG5vcm1hbGl6ZWROYW1lLnNwbGl0KCIgIik7CisJCXJldHVybiBzcGxpdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVIdG1sVGFnc09ubHkoU3RyaW5nIGh0bWxUZXh0KSB7CisJCVN0cmluZyBzdHJpcHBlZCA9IEh0bWxDbGVhbmVyLnN0cmlwSHRtbChodG1sVGV4dCwgZmFsc2UpOworCQlyZXR1cm4gc3RyaXBwZWQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1lhbWxUb09iamVjdENvbnZlcnRlci5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9ZYW1sVG9PYmplY3RDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFjMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9ZYW1sVG9PYmplY3RDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDI3NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uQXBwbGljYXRpb25MMUNhY2hlQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLkFwcGxpY2F0aW9uTDJDYWNoZUNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbi5CZU1vbml0b3JpbmdDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbi5FY29tcFBvcnRhbENvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbi5FbGFzdGljU2VhcmNoQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLk9uYm9hcmRpbmdDb25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uU3dpdGNob3ZlckRldGVjdG9yQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLlRvc2NhVmFsaWRhdG9yc0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuQ29uZmlndXJhdGlvbi5FbGFzdGljU2VhcmNoQ29uZmlnLkluZGljZXNUaW1lRnJlcXVlbmN5RW50cnk7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkRpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24uQ29tcG9uZW50QXJ0aWZhY3RUeXBlc0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5DcmVhdGVUb3BpY0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5EaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpY0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5EaXN0cmlidXRpb25TdGF0dXNUb3BpY0NvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcudmFsaWRhdGlvbi5EZXBsb3ltZW50QXJ0aWZhY3RIZWF0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWcuQ29uZmlndXJhdGlvbi5GZU1vbml0b3JpbmdDb25maWc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuVHlwZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5lcnJvci5ZQU1MRXhjZXB0aW9uOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5pbnRyb3NwZWN0b3IuUHJvcGVydHlVdGlsczsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwubm9kZXMuTm9kZTsKKworcHVibGljIGNsYXNzIFlhbWxUb09iamVjdENvbnZlcnRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoWWFtbFRvT2JqZWN0Q29udmVydGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgWWFtbD4geWFtbHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFlhbWw+KCk7CisKKwlwcml2YXRlIHN0YXRpYyBZYW1sIGRlZmF1bHRZYW1sID0gbmV3IFlhbWwoKTsKKworCXN0YXRpYyB7CisKKwkJb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yIGRlQ29uc3RydWN0b3IgPSBuZXcgb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yKAorCQkJCURpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24uY2xhc3MpOworCQlUeXBlRGVzY3JpcHRpb24gZGVEZXNjcmlwdGlvbiA9IG5ldyBUeXBlRGVzY3JpcHRpb24oRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5jbGFzcyk7CisJCWRlRGVzY3JpcHRpb24ucHV0TGlzdFByb3BlcnR5VHlwZSgiZGlzdHJpYnV0aW9uU3RhdHVzVG9waWMiLCBEaXN0cmlidXRpb25TdGF0dXNUb3BpY0NvbmZpZy5jbGFzcyk7CisJCWRlRGVzY3JpcHRpb24ucHV0TGlzdFByb3BlcnR5VHlwZSgiZGlzdHJpYk5vdGlmU2VydmljZUFydGlmYWN0VHlwZXMiLCBDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnLmNsYXNzKTsKKwkJZGVEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJkaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXMiLCBDb21wb25lbnRBcnRpZmFjdFR5cGVzQ29uZmlnLmNsYXNzKTsKKwkJZGVEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJjcmVhdGVUb3BpYyIsIENyZWF0ZVRvcGljQ29uZmlnLmNsYXNzKTsKKwkJZGVEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJkaXN0cmlidXRpb25Ob3RpZmljYXRpb25Ub3BpYyIsIERpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblRvcGljQ29uZmlnLmNsYXNzKTsKKwkJZGVDb25zdHJ1Y3Rvci5hZGRUeXBlRGVzY3JpcHRpb24oZGVEZXNjcmlwdGlvbik7CisJCVlhbWwgeWFtbCA9IG5ldyBZYW1sKGRlQ29uc3RydWN0b3IpOworCQl5YW1scy5wdXQoRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCksIHlhbWwpOworCisJCS8vIEZFIGNvbmYKKwkJb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yIGZlQ29uZkNvbnN0cnVjdG9yID0gbmV3IG9yZy55YW1sLnNuYWtleWFtbC5jb25zdHJ1Y3Rvci5Db25zdHJ1Y3RvcigKKwkJCQlvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWcuQ29uZmlndXJhdGlvbi5jbGFzcyk7CisJCVR5cGVEZXNjcmlwdGlvbiBmZUNvbmZEZXNjcmlwdGlvbiA9IG5ldyBUeXBlRGVzY3JpcHRpb24ob3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uY2xhc3MpOworCQlmZUNvbmZEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJzeXN0ZW1Nb25pdG9yaW5nIiwgRmVNb25pdG9yaW5nQ29uZmlnLmNsYXNzKTsKKwkJZmVDb25mQ29uc3RydWN0b3IuYWRkVHlwZURlc2NyaXB0aW9uKGZlQ29uZkRlc2NyaXB0aW9uKTsKKwkJeWFtbHMucHV0KG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZy5Db25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFlhbWwoZmVDb25mQ29uc3RydWN0b3IpKTsKKworCQkvLyBCRSBjb25mCisJCW9yZy55YW1sLnNuYWtleWFtbC5jb25zdHJ1Y3Rvci5Db25zdHJ1Y3RvciBiZUNvbmZDb25zdHJ1Y3RvciA9IG5ldyBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3IoCisJCQkJb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkNvbmZpZ3VyYXRpb24uY2xhc3MpOworCQlUeXBlRGVzY3JpcHRpb24gYmVDb25mRGVzY3JpcHRpb24gPSBuZXcgVHlwZURlc2NyaXB0aW9uKG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLmNsYXNzKTsKKwkJYmVDb25mQ29uc3RydWN0b3IuYWRkVHlwZURlc2NyaXB0aW9uKGJlQ29uZkRlc2NyaXB0aW9uKTsKKworCQkvLyBzeXN0ZW1Nb25pdG9yaW5nCisJCWJlQ29uZkRlc2NyaXB0aW9uLnB1dExpc3RQcm9wZXJ0eVR5cGUoInN5c3RlbU1vbml0b3JpbmciLCBCZU1vbml0b3JpbmdDb25maWcuY2xhc3MpOworCisJCS8vIGVsYXN0aWNTZWFyY2gKKwkJYmVDb25mRGVzY3JpcHRpb24ucHV0TGlzdFByb3BlcnR5VHlwZSgiZWxhc3RpY1NlYXJjaCIsIEVsYXN0aWNTZWFyY2hDb25maWcuY2xhc3MpOworCQlUeXBlRGVzY3JpcHRpb24gZXNEZXNjcmlwdGlvbiA9IG5ldyBUeXBlRGVzY3JpcHRpb24oRWxhc3RpY1NlYXJjaENvbmZpZy5jbGFzcyk7CisJCWVzRGVzY3JpcHRpb24ucHV0TGlzdFByb3BlcnR5VHlwZSgiaW5kaWNlc1RpbWVGcmVxdWVuY3kiLCBJbmRpY2VzVGltZUZyZXF1ZW5jeUVudHJ5LmNsYXNzKTsKKwkJYmVDb25mQ29uc3RydWN0b3IuYWRkVHlwZURlc2NyaXB0aW9uKGVzRGVzY3JpcHRpb24pOworCisJCS8vIHJlc291cmNlRGVwbG95bWVudEFydGlmYWN0cyBhbmQgc2VydmljZURlcGxveW1lbnRBcnRpZmFjdHMKKwkJYmVDb25mRGVzY3JpcHRpb24ucHV0TWFwUHJvcGVydHlUeXBlKCJyZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHMiLCBTdHJpbmcuY2xhc3MsCisJCQkJRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZy5jbGFzcyk7CisJCWJlQ29uZkRlc2NyaXB0aW9uLnB1dE1hcFByb3BlcnR5VHlwZSgic2VydmljZURlcGxveW1lbnRBcnRpZmFjdHMiLCBTdHJpbmcuY2xhc3MsCisJCQkJRGVwbG95bWVudEFydGlmYWN0VHlwZUNvbmZpZy5jbGFzcyk7CisKKwkJLy8gb25ib2FyZGluZworCQliZUNvbmZEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJvbmJvYXJkaW5nIiwgT25ib2FyZGluZ0NvbmZpZy5jbGFzcyk7CisKKwkJLy8gZWNvbXBQb3J0YWwKKwkJYmVDb25mRGVzY3JpcHRpb24ucHV0TGlzdFByb3BlcnR5VHlwZSgiZWNvbXBQb3J0YWwiLCBFY29tcFBvcnRhbENvbmZpZy5jbGFzcyk7CisJCS8vIHN3aXRjaG92ZXJEZXRlY3RvcgorCQliZUNvbmZEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJzd2l0Y2hvdmVyRGV0ZWN0b3IiLCBTd2l0Y2hvdmVyRGV0ZWN0b3JDb25maWcuY2xhc3MpOworCisJCS8vIEFwcGxpY2F0aW9uTDFDYWNoZQorCQliZUNvbmZEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJhcHBsaWNhdGlvbkwxQ2FjaGUiLCBBcHBsaWNhdGlvbkwxQ2FjaGVDb25maWcuY2xhc3MpOworCisJCS8vIEFwcGxpY2F0aW9uTDJDYWNoZQorCQliZUNvbmZEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJhcHBsaWNhdGlvbkwyQ2FjaGUiLCBBcHBsaWNhdGlvbkwyQ2FjaGVDb25maWcuY2xhc3MpOworCisJCS8vIHRvc2NhIHZhbGlkYXRvcnMgY29uZmlnCisJCWJlQ29uZkRlc2NyaXB0aW9uLnB1dExpc3RQcm9wZXJ0eVR5cGUoInRvc2NhVmFsaWRhdG9ycyIsIFRvc2NhVmFsaWRhdG9yc0NvbmZpZy5jbGFzcyk7CisKKwkJeWFtbHMucHV0KG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy5Db25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSwgbmV3IFlhbWwoYmVDb25mQ29uc3RydWN0b3IpKTsKKworCQkvLyBIRUFUIGRlcGxveW1lbnQgYXJ0aWZhY3QKKwkJb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yIGRlcEFydEhlYXRDb25zdHJ1Y3RvciA9IG5ldyBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3IoCisJCQkJRGVwbG95bWVudEFydGlmYWN0SGVhdENvbmZpZ3VyYXRpb24uY2xhc3MpOworCQlQcm9wZXJ0eVV0aWxzIHByb3BlcnR5VXRpbHMgPSBuZXcgUHJvcGVydHlVdGlscygpOworCQkvLyBTa2lwIHByb3BlcnRpZXMgd2hpY2ggYXJlIGZvdW5kIGluIFlBTUwgYnV0IG5vdCBmb3VuZCBpbiBQT0pPCisJCXByb3BlcnR5VXRpbHMuc2V0U2tpcE1pc3NpbmdQcm9wZXJ0aWVzKHRydWUpOworCQlkZXBBcnRIZWF0Q29uc3RydWN0b3Iuc2V0UHJvcGVydHlVdGlscyhwcm9wZXJ0eVV0aWxzKTsKKwkJeWFtbHMucHV0KG9yZy5vcGVuZWNvbXAuc2RjLmJlLmNvbmZpZy52YWxpZGF0aW9uLkRlcGxveW1lbnRBcnRpZmFjdEhlYXRDb25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQluZXcgWWFtbChkZXBBcnRIZWF0Q29uc3RydWN0b3IpKTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIDxUPiBZYW1sIGdldFlhbWxCeUNsYXNzTmFtZShDbGFzczxUPiBjbGFzc05hbWUpIHsKKworCQlZYW1sIHlhbWwgPSB5YW1scy5nZXQoY2xhc3NOYW1lLmdldE5hbWUoKSk7CisJCWlmICh5YW1sID09IG51bGwpIHsKKwkJCXlhbWwgPSBkZWZhdWx0WWFtbDsKKwkJfQorCisJCXJldHVybiB5YW1sOworCX0KKworCXB1YmxpYyA8VD4gVCBjb252ZXJ0KFN0cmluZyBkaXJQYXRoLCBDbGFzczxUPiBjbGFzc05hbWUsIFN0cmluZyBjb25maWdGaWxlTmFtZSkgeworCisJCVQgY29uZmlnID0gbnVsbDsKKworCQl0cnkgeworCisJCQlTdHJpbmcgZnVsbEZpbGVOYW1lID0gZGlyUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgY29uZmlnRmlsZU5hbWU7CisKKwkJCWNvbmZpZyA9IGNvbnZlcnQoZnVsbEZpbGVOYW1lLCBjbGFzc05hbWUpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBjb252ZXJ0IHlhbWwgZmlsZSAiICsgY29uZmlnRmlsZU5hbWUgKyAiIHRvIG9iamVjdC4iLCBlKTsKKwkJfQorCisJCXJldHVybiBjb25maWc7CisJfQorCisJcHVibGljIGNsYXNzIE15WWFtbENvbnN0cnVjdG9yIGV4dGVuZHMgb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yIHsKKwkJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGNsYXNzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4oKTsKKworCQlwdWJsaWMgTXlZYW1sQ29uc3RydWN0b3IoQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4gdGhlUm9vdCkgeworCQkJc3VwZXIodGhlUm9vdCk7CisJCQljbGFzc01hcC5wdXQoRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24uY2xhc3MpOworCQkJY2xhc3NNYXAucHV0KERpc3RyaWJ1dGlvblN0YXR1c1RvcGljQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgRGlzdHJpYnV0aW9uU3RhdHVzVG9waWNDb25maWcuY2xhc3MpOworCQl9CisKKwkJLyoKKwkJICogVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIENvbnN0cnVjdG9yLiBSYXRoZXIgdGhhbiB1c2luZyBhCisJCSAqIGNsYXNzIGxvYWRlciB0byBnZXQgZXh0ZXJuYWwgY2xhc3NlcywgdGhleSBhcmUgYWxyZWFkeSBwcmVkZWZpbmVkCisJCSAqIGFib3ZlLiBUaGlzIGFwcHJvYWNoIHdvcmtzIHNpbWlsYXIgdG8gdGhlIHR5cGVUYWdzIHN0cnVjdHVyZSBpbiB0aGUKKwkJICogb3JpZ2luYWwgY29uc3RydWN0b3IsIGV4Y2VwdCB0aGF0IGNsYXNzIGluZm9ybWF0aW9uIGlzIHByZS1wb3B1bGF0ZWQKKwkJICogZHVyaW5nIGluaXRpYWxpemF0aW9uIHJhdGhlciB0aGFuIHJ1bnRpbWUuCisJCSAqCisJCSAqIEBzZWUKKwkJICogb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yLkNvbnN0cnVjdG9yI2dldENsYXNzRm9yTm9kZShvcmcueWFtbC4KKwkJICogc25ha2V5YW1sLm5vZGVzLk5vZGUpCisJCSAqLworCQlwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JOb2RlKE5vZGUgbm9kZSkgeworCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldFRhZygpLmdldENsYXNzTmFtZSgpOworCQkJQ2xhc3M8Pz4gY2wgPSBjbGFzc01hcC5nZXQobmFtZSk7CisJCQlpZiAoY2wgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigiQ2xhc3Mgbm90IGZvdW5kOiAiICsgbmFtZSk7CisJCQllbHNlCisJCQkJcmV0dXJuIGNsOworCQl9CisJfQorCisJcHVibGljIDxUPiBUIGNvbnZlcnQoU3RyaW5nIGZ1bGxGaWxlTmFtZSwgQ2xhc3M8VD4gY2xhc3NOYW1lKSB7CisKKwkJVCBjb25maWcgPSBudWxsOworCisJCVlhbWwgeWFtbCA9IGdldFlhbWxCeUNsYXNzTmFtZShjbGFzc05hbWUpOworCisJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJRmlsZSBmID0gbmV3IEZpbGUoZnVsbEZpbGVOYW1lKTsKKwkJCWlmIChmYWxzZSA9PSBmLmV4aXN0cygpKSB7CisJCQkJbG9nLndhcm4oIlRoZSBmaWxlICIgKyBmdWxsRmlsZU5hbWUgKyAiIGNhbm5vdCBiZSBmb3VuZC4gSWdub3JlIHJlYWRpbmcgY29uZmlndXJhdGlvbi4iKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWluID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oUGF0aHMuZ2V0KGZ1bGxGaWxlTmFtZSkpOworCisJCQljb25maWcgPSB5YW1sLmxvYWRBcyhpbiwgY2xhc3NOYW1lKTsKKworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNvbmZpZy50b1N0cmluZygpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNvbnZlcnQgeWFtbCBmaWxlICIgKyBmdWxsRmlsZU5hbWUgKyAiIHRvIG9iamVjdC4iLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gY29uZmlnOworCX0KKworCXB1YmxpYyA8VD4gVCBjb252ZXJ0KGJ5dGVbXSBmaWxlQ29udGVudHMsIENsYXNzPFQ+IGNsYXNzTmFtZSkgeworCisJCVQgY29uZmlnID0gbnVsbDsKKworCQlZYW1sIHlhbWwgPSBnZXRZYW1sQnlDbGFzc05hbWUoY2xhc3NOYW1lKTsKKworCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCXRyeSB7CisKKwkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZpbGVDb250ZW50cyk7CisKKwkJCWNvbmZpZyA9IHlhbWwubG9hZEFzKGluLCBjbGFzc05hbWUpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2cuZXJyb3IoIkZhaWxlZCB0byBjb252ZXJ0IHlhbWwgZmlsZSB0byBvYmplY3QiLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gY29uZmlnOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmFsaWRZYW1sKGJ5dGVbXSBmaWxlQ29udGVudHMpIHsKKwkJaWYgKEJhc2U2NC5pc0Jhc2U2NChmaWxlQ29udGVudHMpKSB7CisJCQlsb2cudHJhY2UoIlJlY2VpdmVkIEJhc2U2NCBkYXRhIC0gZGVjb2RpbmcgYmVmb3JlIHZhbGlkYXRpbmcuLi4iKTsKKwkJCWZpbGVDb250ZW50cyA9IEJhc2U2NC5kZWNvZGVCYXNlNjQoZmlsZUNvbnRlbnRzKTsKKwkJfQorCQl0cnkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXBwZWRUb3NjYVRlbXBsYXRlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGRlZmF1bHRZYW1sCisJCQkJCS5sb2FkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmaWxlQ29udGVudHMpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZy5lcnJvcigiRmFpbGVkIHRvIGNvbnZlcnQgeWFtbCBmaWxlIHRvIG9iamVjdCAtIHlhbWwgaXMgaW52YWxpZCIsIGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvWmlwVXRpbC5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdXRpbC9aaXBVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyNWM0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1ppcFV0aWwuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0LkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgWmlwVXRpbCB7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoWmlwVXRpbC5jbGFzcy5nZXROYW1lKCkpOworCisJcHJpdmF0ZSBaaXBVdGlsKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgYnl0ZVtdPiByZWFkWmlwKGJ5dGVbXSB6aXBBc0J5dGVzKSB7CisKKwkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKKwkJemlzID0gbmV3IFppcElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh6aXBBc0J5dGVzKSk7CisKKwkJcmV0dXJuIHJlYWRaaXAoemlzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIGJ5dGVbXT4gcmVhZFppcChaaXBJbnB1dFN0cmVhbSB6aXMpIHsKKworCQlNYXA8U3RyaW5nLCBieXRlW10+IGZpbGVOYW1lVG9CeXRlQXJyYXkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIGJ5dGVbXT4oKTsKKworCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07CisJCXRyeSB7CisJCQkvLyBnZXQgdGhlIHppcHBlZCBmaWxlIGxpc3QgZW50cnkKKwkJCVppcEVudHJ5IHplID0gemlzLmdldE5leHRFbnRyeSgpOworCisJCQl3aGlsZSAoemUgIT0gbnVsbCkgeworCisJCQkJU3RyaW5nIGZpbGVOYW1lID0gemUuZ2V0TmFtZSgpOworCisJCQkJaWYgKGZhbHNlID09IHplLmlzRGlyZWN0b3J5KCkpIHsKKworCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJCXRyeSB7CisJCQkJCQlpbnQgbGVuOworCQkJCQkJd2hpbGUgKChsZW4gPSB6aXMucmVhZChidWZmZXIpKSA+IDApIHsKKwkJCQkJCQlvcy53cml0ZShidWZmZXIsIDAsIGxlbik7CisJCQkJCQl9CisKKwkJCQkJCWZpbGVOYW1lVG9CeXRlQXJyYXkucHV0KGZpbGVOYW1lLCBvcy50b0J5dGVBcnJheSgpKTsKKworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJaWYgKG9zICE9IG51bGwpIHsKKwkJCQkJCQlvcy5jbG9zZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXplID0gemlzLmdldE5leHRFbnRyeSgpOworCisJCQl9CisKKwkJCXppcy5jbG9zZUVudHJ5KCk7CisJCQl6aXMuY2xvc2UoKTsKKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmICh6aXMgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXppcy5jbG9zZUVudHJ5KCk7CisJCQkJCXppcy5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gVE9ETzogYWRkIGxvZworCQkJCX0KKworCQkJfQorCQl9CisKKwkJcmV0dXJuIGZpbGVOYW1lVG9CeXRlQXJyYXk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisKKwkJU3RyaW5nIHppcEZpbGVOYW1lID0gIi9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NvbmZpZy56aXAiOworCisJCXppcEZpbGVOYW1lID0gIkM6XFxHaXRfd29ya1xcRDItU0RuQ1xcY2F0YWxvZy1iZVxcc3JjXFx0ZXN0XFxyZXNvdXJjZXNcXGNvbmZpZ1xcY29uZmlnLnppcCI7CisKKwkJUGF0aCBwYXRoID0gUGF0aHMuZ2V0KHppcEZpbGVOYW1lKTsKKworCQl0cnkgeworCQkJYnl0ZVtdIHppcEFzQnl0ZXMgPSBGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aCk7CisJCQkvLyBlbmNvZGUgdG8gYmFzZQorCisJCQlaaXBVdGlsLnJlYWRaaXAoemlwQXNCeXRlcyk7CisKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBieXRlW10gemlwQnl0ZXMoYnl0ZVtdIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJWmlwT3V0cHV0U3RyZWFtIHpvcyA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYmFvcyk7CisJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KCJ6aXAiKTsKKwkJZW50cnkuc2V0U2l6ZShpbnB1dC5sZW5ndGgpOworCQl6b3MucHV0TmV4dEVudHJ5KGVudHJ5KTsKKwkJem9zLndyaXRlKGlucHV0KTsKKwkJem9zLmNsb3NlRW50cnkoKTsKKwkJem9zLmNsb3NlKCk7CisJCXJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7CisJfQorCisJcHVibGljIHN0YXRpYyBieXRlW10gdW56aXAoYnl0ZVtdIHppcHBlZCkgeworCQlaaXBJbnB1dFN0cmVhbSB6aXBpbnB1dHN0cmVhbSA9IG51bGw7CisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworCQl0cnkgeworCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworCisJCQl6aXBpbnB1dHN0cmVhbSA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oemlwcGVkKSk7CisJCQlaaXBFbnRyeSB6aXBlbnRyeSA9IHppcGlucHV0c3RyZWFtLmdldE5leHRFbnRyeSgpOworCQkJb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJaW50IG47CisJCQl3aGlsZSAoKG4gPSB6aXBpbnB1dHN0cmVhbS5yZWFkKGJ1ZiwgMCwgMTAyNCkpID4gLTEpIHsKKwkJCQlvdXRwdXRTdHJlYW0ud3JpdGUoYnVmLCAwLCBuKTsKKwkJCX0KKworCQkJcmV0dXJuIG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgdW56aXAgaW5wdXQgc3RyZWFtIiwgZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNsb3NlIG91dHB1dCBzdHJlYW0iLCBlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoemlwaW5wdXRzdHJlYW0gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXppcGlucHV0c3RyZWFtLmNsb3NlRW50cnkoKTsKKwkJCQkJemlwaW5wdXRzdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy5kZWJ1ZygiRmFpbGVkIHRvIGNsb3NlIHppcCBpbnB1dCBzdHJlYW0iLCBlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0Fic3RyYWN0U2RuY0V4Y2VwdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vQWJzdHJhY3RTZG5jRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlODMyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0Fic3RyYWN0U2RuY0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2RuY0V4Y2VwdGlvbiB7CisKKwlwcml2YXRlIFN0cmluZyBtZXNzYWdlSWQ7CisKKwlwcml2YXRlIFN0cmluZyB0ZXh0OworCisJcHJpdmF0ZSBTdHJpbmdbXSB2YXJpYWJsZXM7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RTZG5jRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIEVSUk9SX1BBUkFNX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIiVcXGQiKTsKKworCXB1YmxpYyBBYnN0cmFjdFNkbmNFeGNlcHRpb24oKSB7CisJfQorCisJcHVibGljIEFic3RyYWN0U2RuY0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgdGV4dCwgU3RyaW5nW10gdmFyaWFibGVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubWVzc2FnZUlkID0gbWVzc2FnZUlkOworCQl0aGlzLnRleHQgPSB0ZXh0OworCQl0aGlzLnZhcmlhYmxlcyA9IHZhbGlkYXRlUGFyYW1ldGVycyhtZXNzYWdlSWQsIHRleHQsIHZhcmlhYmxlcyk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdbXSB2YWxpZGF0ZVBhcmFtZXRlcnMoU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHRleHQsIFN0cmluZ1tdIHZhcmlhYmxlcykgeworCQlTdHJpbmdbXSByZXMgPSBudWxsOworCQlNYXRjaGVyIG0gPSBFUlJPUl9QQVJBTV9QQVRURVJOLm1hdGNoZXIodGV4dCk7CisJCWludCBleHBlY3RlZFBhcmFtc051bSA9IDA7CisJCXdoaWxlIChtLmZpbmQoKSkgeworCQkJZXhwZWN0ZWRQYXJhbXNOdW0gKz0gMTsKKwkJfQorCQlpbnQgYWN0dWFsUGFyYW1zTnVtID0gKHZhcmlhYmxlcyAhPSBudWxsKSA/IHZhcmlhYmxlcy5sZW5ndGggOiAwOworCQlpZiAoYWN0dWFsUGFyYW1zTnVtIDwgZXhwZWN0ZWRQYXJhbXNOdW0pIHsKKwkJCWxvZy53YXJuKAorCQkJCQkiUmVjZWl2ZWQgbGVzcyBwYXJhbWV0ZXJzIHRoYW4gZXhwZWN0ZWQgZm9yIGVycm9yIHdpdGggbWVzc2FnZUlkIHt9LCBleHBlY3RlZDoge30sIGFjdHVhbDoge30uIE1pc3NpbmcgcGFyYW1ldGVycyBhcmUgcGFkZGVkIHdpdGggbnVsbCB2YWx1ZXMuIiwKKwkJCQkJbWVzc2FnZUlkLCBleHBlY3RlZFBhcmFtc051bSwgYWN0dWFsUGFyYW1zTnVtKTsKKwkJfSBlbHNlIGlmIChhY3R1YWxQYXJhbXNOdW0gPiBleHBlY3RlZFBhcmFtc051bSkgeworCQkJbG9nLndhcm4oCisJCQkJCSJSZWNlaXZlZCBtb3JlIHBhcmFtZXRlcnMgdGhhbiBleHBlY3RlZCBmb3IgZXJyb3Igd2l0aCBtZXNzYWdlSWQge30sIGV4cGVjdGVkOiB7fSwgYWN0dWFsOiB7fS4gRXh0cmEgcGFyYW1ldGVycyBhcmUgaWdub3JlZC4iLAorCQkJCQltZXNzYWdlSWQsIGV4cGVjdGVkUGFyYW1zTnVtLCBhY3R1YWxQYXJhbXNOdW0pOworCQl9CisJCWlmICh2YXJpYWJsZXMgIT0gbnVsbCkgeworCQkJcmVzID0gQXJyYXlzLmNvcHlPZih2YXJpYWJsZXMsIGV4cGVjdGVkUGFyYW1zTnVtKTsKKwkJfQorCisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKSB7CisJCXJldHVybiB0aGlzLm1lc3NhZ2VJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCXJldHVybiB0ZXh0OworCX0KKworCXB1YmxpYyBTdHJpbmdbXSBnZXRWYXJpYWJsZXMoKSB7CisJCXJldHVybiB2YXJpYWJsZXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZUlkKFN0cmluZyBtZXNzYWdlSWQpIHsKKwkJdGhpcy5tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgeworCQl0aGlzLnRleHQgPSB0ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhcmlhYmxlcyhTdHJpbmdbXSB2YXJpYWJsZXMpIHsKKwkJdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGb3JtYXR0ZWRFcnJvck1lc3NhZ2UoKSB7CisJCVN0cmluZyByZXM7CisJCWlmICh2YXJpYWJsZXMgIT0gbnVsbCAmJiB2YXJpYWJsZXMubGVuZ3RoID4gMCkgeworCQkJRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoKTsKKwkJCXRyeSB7CisJCQkJcmVzID0gZm9ybWF0dGVyLmZvcm1hdCh0aGlzLnRleHQucmVwbGFjZUFsbCgiJVxcZCIsICIlcyIpLCAoT2JqZWN0W10pIHRoaXMudmFyaWFibGVzKS50b1N0cmluZygpOworCQkJfSBmaW5hbGx5IHsKKwkJCQlmb3JtYXR0ZXIuY2xvc2UoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcyA9IHRoaXMudGV4dDsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vQWxyZWFkeUV4aXN0RXhjZXB0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9BbHJlYWR5RXhpc3RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFlYzIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vQWxyZWFkeUV4aXN0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbjsKKworLyoqCisgKiBFeGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGluc2VydCBhbiBleGlzdGluZyBhbiBlbGVtZW50IHRoYXQKKyAqIGFscmVhZHkgZXhpc3RzLgorICogCisgKiBAYXV0aG9yIGx1YyBib3V0aWVyCisgKi8KK3B1YmxpYyBjbGFzcyBBbHJlYWR5RXhpc3RFeGNlcHRpb24gZXh0ZW5kcyBUZWNobmljYWxFeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTUxMTUwMTIyODk3MTQ1NjM0TDsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgQWxyZWFkeUV4aXN0RXhjZXB0aW9ufSB3aXRoIHRoZSBjYXVzZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgTWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgQWxyZWFkeUV4aXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0RlbGV0ZUxhc3RBcHBsaWNhdGlvbkVudmlyb25tZW50RXhjZXB0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9EZWxldGVMYXN0QXBwbGljYXRpb25FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzNiNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9EZWxldGVMYXN0QXBwbGljYXRpb25FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBEZWxldGVMYXN0QXBwbGljYXRpb25FbnZpcm9ubWVudEV4Y2VwdGlvbiBleHRlbmRzIFRlY2huaWNhbEV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTE5MjgzNDg1NTA1NzE3NzI1Mkw7CisKKwlwdWJsaWMgRGVsZXRlTGFzdEFwcGxpY2F0aW9uRW52aXJvbm1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJcHVibGljIERlbGV0ZUxhc3RBcHBsaWNhdGlvbkVudmlyb25tZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0RlbGV0ZVJlZmVyZW5jZWRPYmplY3RFeGNlcHRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0RlbGV0ZVJlZmVyZW5jZWRPYmplY3RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTU3ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vRGVsZXRlUmVmZXJlbmNlZE9iamVjdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb247CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuIG9iamVjdCBpbiBBbGllbgorICogd2hpY2ggaXMgc3RpbGwgcmVmZXJlbmNlZCAodXNlZCkgYnkgb3RoZXIgb2JqZWN0CisgKgorICogQGF1dGhvciBNaW5oIEtoYW5nIFZVCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxldGVSZWZlcmVuY2VkT2JqZWN0RXhjZXB0aW9uIGV4dGVuZHMgVGVjaG5pY2FsRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXB1YmxpYyBEZWxldGVSZWZlcmVuY2VkT2JqZWN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0Z1bmN0aW9uYWxFeGNlcHRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0Z1bmN0aW9uYWxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmY2NzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vRnVuY3Rpb25hbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb247CisKKy8qKgorICogQWxsIGZ1bmN0aW9uYWwgZXhjZXB0aW9uIHdoaWNoIGlzIHJlbGF0ZWQgdG8gdXNlciBpbnB1dCBtdXN0IGdvIGhlcmUuIEl0J3MgYQorICogY2hlY2tlZCBleGNlcHRpb24gdG8gZm9yY2UgZXJyb3IgaGFuZGxpbmcgYW5kIGNoZWNraW5nLgorICogCisgKiBAYXV0aG9yIG1rdgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBGdW5jdGlvbmFsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY3MTI4NDU2ODU3OTg3OTI0OTNMOworCisJcHVibGljIEZ1bmN0aW9uYWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJcHVibGljIEZ1bmN0aW9uYWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vSW5kZXhpbmdTZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9JbmRleGluZ1NlcnZpY2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGI4NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vSW5kZXhpbmdTZXJ2aWNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbjsKKworLyoqCisgKiBBbGwgZXJyb3JzIGhhcHBlbmVkIHdoaWxlIHRyeWluZyB0byBhY2Nlc3MgdG8gaW5kZXggc2VydmljZQorICogCisgKiBAYXV0aG9yIG1rdgorICovCitwdWJsaWMgY2xhc3MgSW5kZXhpbmdTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgVGVjaG5pY2FsRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg2NDQ0MjI3MzU2NjAzODkwNThMOworCisJcHVibGljIEluZGV4aW5nU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKwl9CisKKwlwdWJsaWMgSW5kZXhpbmdTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2Y2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBUZWNobmljYWxFeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkzMTY0NjAzNzYwNDA2Mjg0MEw7CisKKwlwdWJsaWMgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCX0KKworCXB1YmxpYyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL05vdEZvdW5kRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4MzI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL05vdEZvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgVGVjaG5pY2FsRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01ODM4NzQxMDY3NzMxNzg2NDEzTDsKKworCXB1YmxpYyBOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKwl9CisKKwlwdWJsaWMgTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9Pa1Jlc3BvbnNlSW5mby5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vT2tSZXNwb25zZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODQwNWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vT2tSZXNwb25zZUluZm8uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgT2tSZXNwb25zZUluZm8gZXh0ZW5kcyBBYnN0cmFjdFNkbmNFeGNlcHRpb24geworCisJcHVibGljIE9rUmVzcG9uc2VJbmZvKFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyB0ZXh0LCBTdHJpbmdbXSB2YXJpYWJsZXMpIHsKKwkJc3VwZXIobWVzc2FnZUlkLCB0ZXh0LCB2YXJpYWJsZXMpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1BvbGljeUV4Y2VwdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vUG9saWN5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1Yzg2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1BvbGljeUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBQb2xpY3lFeGNlcHRpb24gZXh0ZW5kcyBBYnN0cmFjdFNkbmNFeGNlcHRpb24geworCisJcHVibGljIFBvbGljeUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgdGV4dCwgU3RyaW5nW10gdmFyaWFibGVzKSB7CisJCXN1cGVyKG1lc3NhZ2VJZCwgdGV4dCwgdmFyaWFibGVzKTsKKwl9CisKKwlwdWJsaWMgUG9saWN5RXhjZXB0aW9uKCkgeworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1Jlc3BvbnNlRm9ybWF0LmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9SZXNwb25zZUZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2JjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9SZXNwb25zZUZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uOworCisvKioKKyAqIE5lc3RlZCBQT0pPcyB0byBleHByZXNzIHJlcXVpcmVkIEpTT04gZm9ybWF0IG9mIHRoZSBlcnJvcgorICogCisgKiB7ICJyZXF1ZXN0RXJyb3IiOiB7ICJzZXJ2aWNlRXhjZXB0aW9uIjogeyAibWVzc2FnZUlkIjogIiIsICJ0ZXh0IjogIiIsCisgKiAidmFyaWFibGVzIjogW10gfSB9IH0KKyAqIAorICogCisgKiBAYXV0aG9yIHBhaGFyb25pCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBSZXNwb25zZUZvcm1hdCB7CisKKwlwcml2YXRlIGludCBzdGF0dXM7CisJcHJpdmF0ZSBSZXF1ZXN0RXJyb3JXcmFwcGVyIHJlcXVlc3RFcnJvcldyYXBwZXI7CisKKwlwdWJsaWMgUmVzcG9uc2VGb3JtYXQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFJlc3BvbnNlRm9ybWF0KGludCBzdGF0dXMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0U3RhdHVzKCkgeworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXB1YmxpYyBSZXF1ZXN0RXJyb3JXcmFwcGVyIGdldFJlcXVlc3RFcnJvcigpIHsKKwkJcmV0dXJuIHJlcXVlc3RFcnJvcldyYXBwZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVxdWVzdEVycm9yKFJlcXVlc3RFcnJvcldyYXBwZXIgcmVxdWVzdEVycm9yV3JhcHBlcikgeworCQl0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIgPSByZXF1ZXN0RXJyb3JXcmFwcGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBvbGljeUV4Y2VwdGlvbihQb2xpY3lFeGNlcHRpb24gcG9saWN5RXhjZXB0aW9uKSB7CisJCXRoaXMucmVxdWVzdEVycm9yV3JhcHBlciA9IG5ldyBSZXF1ZXN0RXJyb3JXcmFwcGVyKG5ldyBSZXF1ZXN0RXJyb3IoKSk7CisJCXJlcXVlc3RFcnJvcldyYXBwZXIuc2V0UG9saWN5RXhjZXB0aW9uKHBvbGljeUV4Y2VwdGlvbik7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VydmljZUV4Y2VwdGlvbihTZXJ2aWNlRXhjZXB0aW9uIHNlcnZpY2VFeGNlcHRpb24pIHsKKwkJdGhpcy5yZXF1ZXN0RXJyb3JXcmFwcGVyID0gbmV3IFJlcXVlc3RFcnJvcldyYXBwZXIobmV3IFJlcXVlc3RFcnJvcigpKTsKKwkJcmVxdWVzdEVycm9yV3JhcHBlci5zZXRTZXJ2aWNlRXhjZXB0aW9uKHNlcnZpY2VFeGNlcHRpb24pOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9rUmVzcG9uc2VJbmZvKE9rUmVzcG9uc2VJbmZvIG9rUmVzcG9uc2VJbmZvKSB7CisJCXRoaXMucmVxdWVzdEVycm9yV3JhcHBlciA9IG5ldyBSZXF1ZXN0RXJyb3JXcmFwcGVyKG5ldyBSZXF1ZXN0RXJyb3IoKSk7CisJCXJlcXVlc3RFcnJvcldyYXBwZXIuc2V0T2tSZXNwb25zZUluZm8ob2tSZXNwb25zZUluZm8pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZSgpIHsKKwkJaWYgKHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iub2tSZXNwb25zZUluZm8gIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iub2tSZXNwb25zZUluZm8uZ2V0Rm9ybWF0dGVkRXJyb3JNZXNzYWdlKCk7CisJCX0KKwkJaWYgKHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iuc2VydmljZUV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5yZXF1ZXN0RXJyb3JXcmFwcGVyLnJlcXVlc3RFcnJvci5zZXJ2aWNlRXhjZXB0aW9uLmdldEZvcm1hdHRlZEVycm9yTWVzc2FnZSgpOworCQl9CisJCXJldHVybiB0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIucmVxdWVzdEVycm9yLnBvbGljeUV4Y2VwdGlvbi5nZXRGb3JtYXR0ZWRFcnJvck1lc3NhZ2UoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCWlmICh0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIucmVxdWVzdEVycm9yLm9rUmVzcG9uc2VJbmZvICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIucmVxdWVzdEVycm9yLm9rUmVzcG9uc2VJbmZvLmdldFRleHQoKTsKKwkJfQorCQlpZiAodGhpcy5yZXF1ZXN0RXJyb3JXcmFwcGVyLnJlcXVlc3RFcnJvci5zZXJ2aWNlRXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIucmVxdWVzdEVycm9yLnNlcnZpY2VFeGNlcHRpb24uZ2V0VGV4dCgpOworCQl9CisJCXJldHVybiB0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIucmVxdWVzdEVycm9yLnBvbGljeUV4Y2VwdGlvbi5nZXRUZXh0KCk7CisJfQorCisJcHVibGljIFN0cmluZ1tdIGdldFZhcmlhYmxlcygpIHsKKwkJaWYgKHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iub2tSZXNwb25zZUluZm8gIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iub2tSZXNwb25zZUluZm8uZ2V0VmFyaWFibGVzKCk7CisJCX0KKwkJaWYgKHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iuc2VydmljZUV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5yZXF1ZXN0RXJyb3JXcmFwcGVyLnJlcXVlc3RFcnJvci5zZXJ2aWNlRXhjZXB0aW9uLmdldFZhcmlhYmxlcygpOworCQl9CisJCXJldHVybiB0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIucmVxdWVzdEVycm9yLnBvbGljeUV4Y2VwdGlvbi5nZXRWYXJpYWJsZXMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZCgpIHsKKwkJaWYgKHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iub2tSZXNwb25zZUluZm8gIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iub2tSZXNwb25zZUluZm8uZ2V0TWVzc2FnZUlkKCk7CisJCX0KKwkJaWYgKHRoaXMucmVxdWVzdEVycm9yV3JhcHBlci5yZXF1ZXN0RXJyb3Iuc2VydmljZUV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5yZXF1ZXN0RXJyb3JXcmFwcGVyLnJlcXVlc3RFcnJvci5zZXJ2aWNlRXhjZXB0aW9uLmdldE1lc3NhZ2VJZCgpOworCQl9CisJCXJldHVybiB0aGlzLnJlcXVlc3RFcnJvcldyYXBwZXIucmVxdWVzdEVycm9yLnBvbGljeUV4Y2VwdGlvbi5nZXRNZXNzYWdlSWQoKTsKKwl9CisKKwlwdWJsaWMgY2xhc3MgUmVxdWVzdEVycm9yV3JhcHBlciB7CisJCXByaXZhdGUgUmVxdWVzdEVycm9yIHJlcXVlc3RFcnJvcjsKKworCQlwdWJsaWMgUmVxdWVzdEVycm9yV3JhcHBlcigpIHsKKwkJCXRoaXMucmVxdWVzdEVycm9yID0gbmV3IFJlcXVlc3RFcnJvcigpOworCQl9CisKKwkJcHVibGljIFJlcXVlc3RFcnJvcldyYXBwZXIoUmVxdWVzdEVycm9yIHJlcXVlc3RFcnJvcikgeworCQkJdGhpcy5yZXF1ZXN0RXJyb3IgPSByZXF1ZXN0RXJyb3I7CisJCX0KKworCQlwdWJsaWMgUmVxdWVzdEVycm9yIGdldFJlcXVlc3RFcnJvcigpIHsKKwkJCXJldHVybiByZXF1ZXN0RXJyb3I7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0RXJyb3IoUmVxdWVzdEVycm9yIHJlcXVlc3RFcnJvcikgeworCQkJdGhpcy5yZXF1ZXN0RXJyb3IgPSByZXF1ZXN0RXJyb3I7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQb2xpY3lFeGNlcHRpb24oUG9saWN5RXhjZXB0aW9uIHBvbGljeUV4Y2VwdGlvbikgeworCQkJcmVxdWVzdEVycm9yLnNldFBvbGljeUV4Y2VwdGlvbihwb2xpY3lFeGNlcHRpb24pOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2VydmljZUV4Y2VwdGlvbihTZXJ2aWNlRXhjZXB0aW9uIHNlcnZpY2VFeGNlcHRpb24pIHsKKwkJCXJlcXVlc3RFcnJvci5zZXRTZXJ2aWNlRXhjZXB0aW9uKHNlcnZpY2VFeGNlcHRpb24pOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0T2tSZXNwb25zZUluZm8oT2tSZXNwb25zZUluZm8gb2tSZXNwb25zZUluZm8pIHsKKwkJCXJlcXVlc3RFcnJvci5zZXRPa1Jlc3BvbnNlSW5mbyhva1Jlc3BvbnNlSW5mbyk7CisJCX0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUmVxdWVzdEVycm9yIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCXByaXZhdGUgUG9saWN5RXhjZXB0aW9uIHBvbGljeUV4Y2VwdGlvbjsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJCXByaXZhdGUgU2VydmljZUV4Y2VwdGlvbiBzZXJ2aWNlRXhjZXB0aW9uOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKwkJcHJpdmF0ZSBPa1Jlc3BvbnNlSW5mbyBva1Jlc3BvbnNlSW5mbzsKKworCQlwdWJsaWMgUmVxdWVzdEVycm9yKCkgeworCQl9CisKKwkJcHVibGljIFBvbGljeUV4Y2VwdGlvbiBnZXRQb2xpY3lFeGNlcHRpb24oKSB7CisJCQlyZXR1cm4gcG9saWN5RXhjZXB0aW9uOworCQl9CisKKwkJcHVibGljIFNlcnZpY2VFeGNlcHRpb24gZ2V0U2VydmljZUV4Y2VwdGlvbigpIHsKKwkJCXJldHVybiBzZXJ2aWNlRXhjZXB0aW9uOworCQl9CisKKwkJcHVibGljIE9rUmVzcG9uc2VJbmZvIGdldE9rUmVzcG9uc2VJbmZvKCkgeworCQkJcmV0dXJuIG9rUmVzcG9uc2VJbmZvOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0UG9saWN5RXhjZXB0aW9uKFBvbGljeUV4Y2VwdGlvbiBwb2xpY3lFeGNlcHRpb24pIHsKKwkJCXRoaXMucG9saWN5RXhjZXB0aW9uID0gcG9saWN5RXhjZXB0aW9uOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0U2VydmljZUV4Y2VwdGlvbihTZXJ2aWNlRXhjZXB0aW9uIHNlcnZpY2VFeGNlcHRpb24pIHsKKwkJCXRoaXMuc2VydmljZUV4Y2VwdGlvbiA9IHNlcnZpY2VFeGNlcHRpb247CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRPa1Jlc3BvbnNlSW5mbyhPa1Jlc3BvbnNlSW5mbyBva1Jlc3BvbnNlSW5mbykgeworCQkJdGhpcy5va1Jlc3BvbnNlSW5mbyA9IG9rUmVzcG9uc2VJbmZvOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZXNwb25zZUZvcm1hdFsiICsgInN0YXR1cz0iICsgc3RhdHVzICsgIiwgcmVxdWVzdEVycm9yV3JhcHBlcj0iICsgcmVxdWVzdEVycm9yV3JhcHBlciArICddJzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2V4Y2VwdGlvbi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhZTE4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1NlcnZpY2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuZXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEFic3RyYWN0U2RuY0V4Y2VwdGlvbiB7CisKKwlwdWJsaWMgU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgdGV4dCwgU3RyaW5nW10gdmFyaWFibGVzKSB7CisJCXN1cGVyKG1lc3NhZ2VJZCwgdGV4dCwgdmFyaWFibGVzKTsKKwl9CisKKwlwdWJsaWMgU2VydmljZUV4Y2VwdGlvbigpIHsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1RlY2huaWNhbEV4Y2VwdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vVGVjaG5pY2FsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlZjJmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1RlY2huaWNhbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb247CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIEFsaWVuIHRlY2huaWNhbCBleGNlcHRpb24KKyAqCisgKiBAYXV0aG9yIG1rdgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlY2huaWNhbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkxNTI0NzMxODMwMjUzOTAxNjFMOworCisJcHVibGljIFRlY2huaWNhbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKwl9CisKKwlwdWJsaWMgVGVjaG5pY2FsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1ZlcnNpb25Db25mbGljdEV4Y2VwdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9leGNlcHRpb24vVmVyc2lvbkNvbmZsaWN0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5OGQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZXhjZXB0aW9uL1ZlcnNpb25Db25mbGljdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5leGNlcHRpb247CisKKy8qKgorICogRXhjZXB0aW9uIGhhcHBlbnMgd2hlbiBhNGMgY2Fubm90IHJlc29sdmUgdmVyc2lvbiBjb25mbGljdHMgaW4gYSB0cmFuc3BhcmVudAorICogbWFubmVyIGZvciB1c2VycworICovCitwdWJsaWMgY2xhc3MgVmVyc2lvbkNvbmZsaWN0RXhjZXB0aW9uIGV4dGVuZHMgVGVjaG5pY2FsRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXB1YmxpYyBWZXJzaW9uQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jb25maWcvQ29uZmlndXJhdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jb25maWcvQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTUzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2NvbmZpZy9Db25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMDQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQmFzaWNDb25maWd1cmF0aW9uOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbiBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbiB7CisJLyoqCisJICogZmUgRlFETgorCSAqLworCXByaXZhdGUgU3RyaW5nIGZlRnFkbjsKKwkvKioKKwkgKiBiYWNrZW5kIGhvc3QKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBiZUhvc3Q7CisJLyoqCisJICogYmFja2VuZCBodHRwIHBvcnQKKwkgKi8KKwlwcml2YXRlIEludGVnZXIgYmVIdHRwUG9ydDsKKwkvKioKKwkgKiBiYWNrZW5kIGh0dHAgc2VjdXJlZCBwb3J0CisJICovCisJcHJpdmF0ZSBJbnRlZ2VyIGJlU3NsUG9ydDsKKworCXByaXZhdGUgSW50ZWdlciBoZWFsdGhDaGVja1NvY2tldFRpbWVvdXRJbk1zOworCisJcHJpdmF0ZSBJbnRlZ2VyIGhlYWx0aENoZWNrSW50ZXJ2YWxJblNlY29uZHM7CisJCisJcHJpdmF0ZSBGZU1vbml0b3JpbmdDb25maWcgc3lzdGVtTW9uaXRvcmluZzsKKworCXByaXZhdGUgU3RyaW5nIGtpYmFuYUhvc3Q7CisKKwlwcml2YXRlIEludGVnZXIga2liYW5hUG9ydDsKKworCXByaXZhdGUgU3RyaW5nIGtpYmFuYVByb3RvY29sOworCisJcHJpdmF0ZSBTdHJpbmcgb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0OworCisJcHVibGljIFN0cmluZyBnZXRLaWJhbmFQcm90b2NvbCgpIHsKKwkJcmV0dXJuIGtpYmFuYVByb3RvY29sOworCX0KKworCXB1YmxpYyB2b2lkIHNldEtpYmFuYVByb3RvY29sKFN0cmluZyBraWJhbmFQcm90b2NvbCkgeworCQl0aGlzLmtpYmFuYVByb3RvY29sID0ga2liYW5hUHJvdG9jb2w7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRLaWJhbmFIb3N0KCkgeworCQlyZXR1cm4ga2liYW5hSG9zdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRLaWJhbmFIb3N0KFN0cmluZyBraWJhbmFIb3N0KSB7CisJCXRoaXMua2liYW5hSG9zdCA9IGtpYmFuYUhvc3Q7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0S2liYW5hUG9ydCgpIHsKKwkJcmV0dXJuIGtpYmFuYVBvcnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0S2liYW5hUG9ydChJbnRlZ2VyIGtpYmFuYVBvcnQpIHsKKwkJdGhpcy5raWJhbmFQb3J0ID0ga2liYW5hUG9ydDsKKwl9CisKKwlwdWJsaWMgRmVNb25pdG9yaW5nQ29uZmlnIGdldFN5c3RlbU1vbml0b3JpbmcoKSB7CisJCXJldHVybiBzeXN0ZW1Nb25pdG9yaW5nOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN5c3RlbU1vbml0b3JpbmcoRmVNb25pdG9yaW5nQ29uZmlnIHN5c3RlbU1vbml0b3JpbmcpIHsKKwkJdGhpcy5zeXN0ZW1Nb25pdG9yaW5nID0gc3lzdGVtTW9uaXRvcmluZzsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRIZWFsdGhDaGVja1NvY2tldFRpbWVvdXRJbk1zKCkgeworCQlyZXR1cm4gaGVhbHRoQ2hlY2tTb2NrZXRUaW1lb3V0SW5NczsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRIZWFsdGhDaGVja1NvY2tldFRpbWVvdXRJbk1zKGludCBkZWZhdWx0VmFsKSB7CisJCXJldHVybiBoZWFsdGhDaGVja1NvY2tldFRpbWVvdXRJbk1zID09IG51bGwgPyBkZWZhdWx0VmFsIDogaGVhbHRoQ2hlY2tTb2NrZXRUaW1lb3V0SW5NczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIZWFsdGhDaGVja1NvY2tldFRpbWVvdXRJbk1zKEludGVnZXIgaGVhbHRoQ2hlY2tTb2NrZXRUaW1lb3V0KSB7CisJCXRoaXMuaGVhbHRoQ2hlY2tTb2NrZXRUaW1lb3V0SW5NcyA9IGhlYWx0aENoZWNrU29ja2V0VGltZW91dDsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRIZWFsdGhDaGVja0ludGVydmFsSW5TZWNvbmRzKCkgeworCQlyZXR1cm4gaGVhbHRoQ2hlY2tJbnRlcnZhbEluU2Vjb25kczsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRIZWFsdGhDaGVja0ludGVydmFsSW5TZWNvbmRzKGludCBkZWZhdWx0VmFsKSB7CisJCXJldHVybiBoZWFsdGhDaGVja0ludGVydmFsSW5TZWNvbmRzID09IG51bGwgPyBkZWZhdWx0VmFsIDogaGVhbHRoQ2hlY2tJbnRlcnZhbEluU2Vjb25kczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIZWFsdGhDaGVja0ludGVydmFsSW5TZWNvbmRzKEludGVnZXIgaGVhbHRoQ2hlY2tJbnRlcnZhbCkgeworCQl0aGlzLmhlYWx0aENoZWNrSW50ZXJ2YWxJblNlY29uZHMgPSBoZWFsdGhDaGVja0ludGVydmFsOworCX0KKwkKKwkvKioKKwkgKiBiZSBodHRwIGNvbnRleHQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBiZUNvbnRleHQ7CisJLyoqCisJICogYmFja2VuZCBwcm90b2NvbC4gaHR0cCB8IGh0dHBzCisJICovCisJcHJpdmF0ZSBTdHJpbmcgYmVQcm90b2NvbCA9ICJodHRwIjsKKworCXByaXZhdGUgRGF0ZSByZWxlYXNlZDsKKwlwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gIjExMTEiOworCXByaXZhdGUgQ29ubmVjdGlvbiBjb25uZWN0aW9uOworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHByb3RvY29sczsKKworCXByaXZhdGUgaW50IHRocmVhZHBvb2xTaXplOworCXByaXZhdGUgaW50IHJlcXVlc3RUaW1lb3V0OworCisJcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gaWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHM7CisJcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gb3B0aW9uYWxIZWFkZXJGaWVsZHM7CisKKwlwdWJsaWMgRGF0ZSBnZXRSZWxlYXNlZCgpIHsKKwkJcmV0dXJuIHJlbGVhc2VkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVsZWFzZWQoRGF0ZSByZWxlYXNlZCkgeworCQl0aGlzLnJlbGVhc2VkID0gcmVsZWFzZWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCX0KKworCXB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7CisJCXJldHVybiBjb25uZWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisJCXRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm90b2NvbHMoKSB7CisJCXJldHVybiBwcm90b2NvbHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvdG9jb2xzKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMpIHsKKwkJdGhpcy5wcm90b2NvbHMgPSBwcm90b2NvbHM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRCZUhvc3QoKSB7CisJCXJldHVybiBiZUhvc3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmVIb3N0KFN0cmluZyBiZUhvc3QpIHsKKwkJdGhpcy5iZUhvc3QgPSBiZUhvc3Q7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0QmVIdHRwUG9ydCgpIHsKKwkJcmV0dXJuIGJlSHR0cFBvcnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmVIdHRwUG9ydChJbnRlZ2VyIGJlSHR0cFBvcnQpIHsKKwkJdGhpcy5iZUh0dHBQb3J0ID0gYmVIdHRwUG9ydDsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRCZVNzbFBvcnQoKSB7CisJCXJldHVybiBiZVNzbFBvcnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmVTc2xQb3J0KEludGVnZXIgYmVTc2xQb3J0KSB7CisJCXRoaXMuYmVTc2xQb3J0ID0gYmVTc2xQb3J0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QmVDb250ZXh0KCkgeworCQlyZXR1cm4gYmVDb250ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIHNldEJlQ29udGV4dChTdHJpbmcgYmVDb250ZXh0KSB7CisJCXRoaXMuYmVDb250ZXh0ID0gYmVDb250ZXh0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QmVQcm90b2NvbCgpIHsKKwkJcmV0dXJuIGJlUHJvdG9jb2w7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmVQcm90b2NvbChTdHJpbmcgYmVQcm90b2NvbCkgeworCQl0aGlzLmJlUHJvdG9jb2wgPSBiZVByb3RvY29sOworCX0KKworCXB1YmxpYyBpbnQgZ2V0VGhyZWFkcG9vbFNpemUoKSB7CisJCXJldHVybiB0aHJlYWRwb29sU2l6ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaHJlYWRwb29sU2l6ZShpbnQgdGhyZWFkcG9vbFNpemUpIHsKKwkJdGhpcy50aHJlYWRwb29sU2l6ZSA9IHRocmVhZHBvb2xTaXplOworCX0KKworCXB1YmxpYyBpbnQgZ2V0UmVxdWVzdFRpbWVvdXQoKSB7CisJCXJldHVybiByZXF1ZXN0VGltZW91dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0VGltZW91dChpbnQgcmVxdWVzdFRpbWVvdXQpIHsKKwkJdGhpcy5yZXF1ZXN0VGltZW91dCA9IHJlcXVlc3RUaW1lb3V0OworCX0KKworCXB1YmxpYyBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0SWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMoKSB7CisJCXJldHVybiBpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcyhMaXN0PExpc3Q8U3RyaW5nPj4gaWRlbnRpZmljYXRpb25IZWFkZXJGaWVsZHMpIHsKKwkJdGhpcy5pZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkcyA9IGlkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOworCX0KKworCXB1YmxpYyBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0T3B0aW9uYWxIZWFkZXJGaWVsZHMoKSB7CisJCXJldHVybiBvcHRpb25hbEhlYWRlckZpZWxkczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbEhlYWRlckZpZWxkcyhMaXN0PExpc3Q8U3RyaW5nPj4gb3B0aW9uYWxIZWFkZXJGaWVsZHMpIHsKKwkJdGhpcy5vcHRpb25hbEhlYWRlckZpZWxkcyA9IG9wdGlvbmFsSGVhZGVyRmllbGRzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RmVGcWRuKCkgeworCQlyZXR1cm4gZmVGcWRuOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZlRnFkbihTdHJpbmcgZmVGcWRuKSB7CisJCXRoaXMuZmVGcWRuID0gZmVGcWRuOworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmVNb25pdG9yaW5nQ29uZmlnIHsKKworCQlCb29sZWFuIGVuYWJsZWQ7CisJCUJvb2xlYW4gaXNQcm94eTsKKwkJSW50ZWdlciBwcm9iZUludGVydmFsSW5TZWNvbmRzOworCisJCXB1YmxpYyBCb29sZWFuIGdldEVuYWJsZWQoKSB7CisJCQlyZXR1cm4gZW5hYmxlZDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoQm9vbGVhbiBlbmFibGVkKSB7CisJCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworCQl9CisKKwkJcHVibGljIEJvb2xlYW4gZ2V0SXNQcm94eSgpIHsKKwkJCXJldHVybiBpc1Byb3h5OworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0SXNQcm94eShCb29sZWFuIGlzUHJveHkpIHsKKwkJCXRoaXMuaXNQcm94eSA9IGlzUHJveHk7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRQcm9iZUludGVydmFsSW5TZWNvbmRzKCkgeworCQkJcmV0dXJuIHByb2JlSW50ZXJ2YWxJblNlY29uZHM7CisJCX0KKworCQlwdWJsaWMgSW50ZWdlciBnZXRQcm9iZUludGVydmFsSW5TZWNvbmRzKGludCBkZWZhdWx0VmFsKSB7CisJCQlyZXR1cm4gcHJvYmVJbnRlcnZhbEluU2Vjb25kcyA9PSBudWxsID8gZGVmYXVsdFZhbCA6IHByb2JlSW50ZXJ2YWxJblNlY29uZHM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRQcm9iZUludGVydmFsSW5TZWNvbmRzKEludGVnZXIgcHJvYmVJbnRlcnZhbEluU2Vjb25kcykgeworCQkJdGhpcy5wcm9iZUludGVydmFsSW5TZWNvbmRzID0gcHJvYmVJbnRlcnZhbEluU2Vjb25kczsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0T25ib2FyZGluZ0ZvcndhcmRDb250ZXh0KCkgeworCQlyZXR1cm4gb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIHNldE9uYm9hcmRpbmdGb3J3YXJkQ29udGV4dChTdHJpbmcgb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0KSB7CisJCXRoaXMub25ib2FyZGluZ0ZvcndhcmRDb250ZXh0ID0gb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgaG9zdDogJXMlbiIsIGJlSG9zdCkpCisJCQkJLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgaHR0cCBwb3J0OiAlcyVuIiwgYmVIdHRwUG9ydCkpCisJCQkJLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgc3NsIHBvcnQ6ICVzJW4iLCBiZVNzbFBvcnQpKS5hcHBlbmQoZm9ybWF0KCJiYWNrZW5kIGNvbnRleHQ6ICVzJW4iLCBiZUNvbnRleHQpKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJiYWNrZW5kIHByb3RvY29sOiAlcyVuIiwgYmVQcm90b2NvbCkpCisJCQkJLmFwcGVuZChmb3JtYXQoIm9uYm9hcmRpbmcgZm9yd2FyZCBjb250ZXh0OiAlcyVuIiwgb25ib2FyZGluZ0ZvcndhcmRDb250ZXh0KSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiVmVyc2lvbjogJXMlbiIsIHZlcnNpb24pKS5hcHBlbmQoZm9ybWF0KCJSZWxlYXNlZDogJXMlbiIsIHJlbGVhc2VkKSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiQ29ubmVjdGluZyB0byBkYXRhYmFzZTogJXMlbiIsIGNvbm5lY3Rpb24pKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJTdXBwb3J0ZWQgcHJvdG9jb2xzOiAlcyVuIiwgcHJvdG9jb2xzKSkudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2NvbmZpZy9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jb25maWcvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzE2NGZkCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jb25maWcvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkJhc2ljQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5GaWxlQ2hhbmdlQ2FsbGJhY2s7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5FY29tcEVycm9yQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLklFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5yZXN0LmFwaS5SZXN0Q29uZmlndXJhdGlvbkluZm87CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlciBpbXBsZW1lbnRzIEZpbGVDaGFuZ2VDYWxsYmFjaywgSUVjb21wQ29uZmlndXJhdGlvbk1hbmFnZXIgeworCisJQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWd1cmF0aW9uU291cmNlID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBpbnN0YW5jZTsKKworCXB1YmxpYyBDb25maWd1cmF0aW9uTWFuYWdlcihDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ3VyYXRpb25Tb3VyY2UpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5jb25maWd1cmF0aW9uU291cmNlID0gY29uZmlndXJhdGlvblNvdXJjZTsKKwkJbG9hZENvbmZpZ3VyYXRpb25GaWxlcygpOworCQlpbnN0YW5jZSA9IHRoaXM7CisJfQorCisJTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisJcHJpdmF0ZSB2b2lkIGxvYWRDb25maWd1cmF0aW9uRmlsZXMoKSB7CisKKwkJbG9hZENvbmZpZ3VyYXRpb25DbGFzcyhDb25maWd1cmF0aW9uLmNsYXNzKTsKKwkJbG9hZENvbmZpZ3VyYXRpb25DbGFzcyhSZXN0Q29uZmlndXJhdGlvbkluZm8uY2xhc3MpOworCQlsb2FkQ29uZmlndXJhdGlvbkNsYXNzKEVjb21wRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzKTsKKworCX0KKworCXByaXZhdGUgPFQgZXh0ZW5kcyBCYXNpY0NvbmZpZ3VyYXRpb24+IHZvaWQgbG9hZENvbmZpZ3VyYXRpb25DbGFzcyhDbGFzczxUPiBjbGF6eikgeworCQlDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyID0gbmV3IENvbmZpZ3VyYXRpb25MaXN0ZW5lcihjbGF6eiwgdGhpcyk7CisKKwkJVCBvYmplY3QgPSBjb25maWd1cmF0aW9uU291cmNlLmdldEFuZFdhdGNoQ29uZmlndXJhdGlvbihjbGF6eiwgY29uZmlndXJhdGlvbkxpc3RlbmVyKTsKKworCQljb25maWd1cmF0aW9ucy5wdXQoZ2V0S2V5KGNsYXp6KSwgb2JqZWN0KTsKKwl9CisKKwlwcml2YXRlIDxUPiBTdHJpbmcgZ2V0S2V5KENsYXNzPFQ+IGNsYXNzMSkgeworCisJCXJldHVybiBjbGFzczEuZ2V0U2ltcGxlTmFtZSgpOworCisJfQorCisJcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKworCQlyZXR1cm4gKENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb25zLmdldChnZXRLZXkoQ29uZmlndXJhdGlvbi5jbGFzcykpOworCisJfQorCisJcHVibGljIFJlc3RDb25maWd1cmF0aW9uSW5mbyBnZXRSZXN0Q2xpZW50Q29uZmlndXJhdGlvbigpIHsKKworCQlyZXR1cm4gKFJlc3RDb25maWd1cmF0aW9uSW5mbykgY29uZmlndXJhdGlvbnMuZ2V0KGdldEtleShSZXN0Q29uZmlndXJhdGlvbkluZm8uY2xhc3MpKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFY29tcEVycm9yQ29uZmlndXJhdGlvbiBnZXRFY29tcEVycm9yQ29uZmlndXJhdGlvbigpIHsKKworCQlyZXR1cm4gKEVjb21wRXJyb3JDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9ucy5nZXQoZ2V0S2V5KEVjb21wRXJyb3JDb25maWd1cmF0aW9uLmNsYXNzKSk7CisKKwl9CisKKwlwdWJsaWMgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uQW5kV2F0Y2goQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgeworCisJCWlmIChjb25maWd1cmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgeworCisJCQljb25maWd1cmF0aW9uU291cmNlLmFkZFdhdGNoQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uLmNsYXNzLCBjb25maWd1cmF0aW9uTGlzdGVuZXIpOworCisJCX0KKwkJcmV0dXJuIChDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9ucy5nZXQoZ2V0S2V5KENvbmZpZ3VyYXRpb24uY2xhc3MpKTsKKworCX0KKworCXB1YmxpYyB2b2lkIHJlY29uZmlndXJlKEJhc2ljQ29uZmlndXJhdGlvbiBvYmopIHsKKwkJLy8KKwkJLy8gaWYgKG9iaiAhPSBudWxsKSB7CisJCS8vCisJCS8vIGlmIChvYmogaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uKSB7CisJCS8vIGNvbmZpZ3VyYXRpb25zLnB1dChnZXRLZXkoQ29uZmlndXJhdGlvbi5jbGFzcyksIG9iaik7CisJCS8vIH0KKwkJLy8KKwkJLy8gaWYgKG9iaiBpbnN0YW5jZW9mIEVjb21wRXJyb3JDb25maWd1cmF0aW9uKSB7CisJCS8vIGNvbmZpZ3VyYXRpb25zLnB1dChnZXRLZXkoRWNvbXBFcnJvckNvbmZpZ3VyYXRpb24uY2xhc3MpLCBvYmopOworCQkvLyB9CisJCS8vIH0KKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgeworCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jb25maWcvQ29ubmVjdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jb25maWcvQ29ubmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMDgzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL2NvbmZpZy9Db25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmZlLmNvbmZpZzsKKworcHVibGljIGNsYXNzIENvbm5lY3Rpb24geworCisJcHJpdmF0ZSBTdHJpbmcgdXJsOworCXByaXZhdGUgaW50IHBvb2xTaXplOworCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCisJcHVibGljIGludCBnZXRQb29sU2l6ZSgpIHsKKwkJcmV0dXJuIHBvb2xTaXplOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBvb2xTaXplKGludCBwb29sU2l6ZSkgeworCQl0aGlzLnBvb2xTaXplID0gcG9vbFNpemU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoIiclcycgd2l0aCBwb29sIG9mICVkIiwgZ2V0VXJsKCksIGdldFBvb2xTaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvY29uZmlnL0ZlRWNvbXBFcnJvck1hbmFnZXIuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvZmUvY29uZmlnL0ZlRWNvbXBFcnJvck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9jb25maWcvRmVFY29tcEVycm9yTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWc7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uY29uZmlnLkFic0Vjb21wRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5jb25maWcuRWNvbXBFcnJvckVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmNvbmZpZy5JRWNvbXBDb25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5mZS5jb25maWcuQ29uZmlndXJhdGlvbk1hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBGZUVjb21wRXJyb3JNYW5hZ2VyIGV4dGVuZHMgQWJzRWNvbXBFcnJvck1hbmFnZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgRmVFY29tcEVycm9yTWFuYWdlciBpbnN0YW5jZTsKKwlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKKworCXByaXZhdGUgRmVFY29tcEVycm9yTWFuYWdlcigpIHsKKwl9OworCisJcHVibGljIHN0YXRpYyBGZUVjb21wRXJyb3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworCisJCQlpbnN0YW5jZSA9IGluaXQoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEZlRWNvbXBFcnJvck1hbmFnZXIgaW5pdCgpIHsKKwkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKKwkJCWluc3RhbmNlID0gbmV3IEZlRWNvbXBFcnJvck1hbmFnZXIoKTsKKwkJCWNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElFY29tcENvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgeworCQlyZXR1cm4gY29uZmlndXJhdGlvbk1hbmFnZXI7CisJfQorCisJcHVibGljIHZvaWQgbG9nRmVIZWFsdGhDaGVja1JlY292ZXJ5KFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkZlSGVhbHRoQ2hlY2tSZWNvdmVyeSk7CisJfQorCisJcHVibGljIHZvaWQgbG9nRmVIZWFsdGhDaGVja0Vycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkZlSGVhbHRoQ2hlY2tFcnJvcik7CisJfQorCisJcHVibGljIHZvaWQgbG9nRmVIdHRwTG9nZ2luZ0Vycm9yKFN0cmluZyBjb250ZXh0KSB7CisJCXByb2Nlc3NFY29tcEVycm9yKGNvbnRleHQsIEVjb21wRXJyb3JFbnVtLkZlSHR0cExvZ2dpbmdFcnJvcik7CisJfQorCisJcHVibGljIHZvaWQgbG9nRmVQb3J0YWxTZXJ2bGV0RXJyb3IoU3RyaW5nIGNvbnRleHQpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uRmVQb3J0YWxTZXJ2bGV0RXJyb3IpOworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0ZlSGVhbHRoQ2hlY2tHZW5lcmFsRXJyb3IoU3RyaW5nIGNvbnRleHQpIHsKKwkJcHJvY2Vzc0Vjb21wRXJyb3IoY29udGV4dCwgRWNvbXBFcnJvckVudW0uRmVIZWFsdGhDaGVja0dlbmVyYWxFcnJvcik7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2ZlL21vbml0b3JpbmcvRmVNb25pdG9yaW5nU2VydmljZS5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9tb25pdG9yaW5nL0ZlTW9uaXRvcmluZ1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJiZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9mZS9tb25pdG9yaW5nL0ZlTW9uaXRvcmluZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmZlLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuY29uZmlnLlJlcXVlc3RDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkNsb3NlYWJsZUh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5TdHJpbmdFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50Lkh0dHBDbGllbnRCdWlsZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5tb25pdG9yaW5nLk1vbml0b3JpbmdFdmVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24ubW9uaXRvcmluZy5Nb25pdG9yaW5nTWV0cmljc0ZldGNoZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuZmUuY29uZmlnLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CisKK3B1YmxpYyBjbGFzcyBGZU1vbml0b3JpbmdTZXJ2aWNlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAiJXM6Ly8lczolcy9zZGMyL3Jlc3QvbW9uaXRvcmluZyI7CisJcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIG1vbml0b3JpbmdMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcigiYXNkYy5mZS5tb25pdG9yaW5nLnNlcnZpY2UiKTsKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRmVNb25pdG9yaW5nU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworCXByaXZhdGUgc3RhdGljIEdzb24gZ3NvbiA9IG5ldyBHc29uQnVpbGRlcigpLnNldFByZXR0eVByaW50aW5nKCkuY3JlYXRlKCk7CisKKwlwcml2YXRlIGNsYXNzIE1vbml0b3JpbmdTY2hlZHVsZWRUYXNrIGltcGxlbWVudHMgUnVubmFibGUgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJbW9uaXRvcmluZ0xvZ2dlci50cmFjZSgiRXhlY3V0aW5nIEZFIE1vbml0b3JpbmcgVGFzayAtIFN0YXJ0Iik7CisJCQlNb25pdG9yaW5nRXZlbnQgbW9uaXRvcmluZ01ldHJpY3MgPSBNb25pdG9yaW5nTWV0cmljc0ZldGNoZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb25pdG9yaW5nTWV0cmljcygpOworCQkJcHJvY2Vzc01vbml0b3JpbmdFdmVudChtb25pdG9yaW5nTWV0cmljcyk7CisJCQltb25pdG9yaW5nTG9nZ2VyLnRyYWNlKCJFeGVjdXRpbmcgRkUgTW9uaXRvcmluZyBUYXNrIC0gU3RhdHVzID0ge30iLCBtb25pdG9yaW5nTWV0cmljcy50b1N0cmluZygpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgZXhlY3V0b3Igd2lsbCBleGVjdXRlIHRoZSBNb25pdG9yaW5nIHRhc2suCisJICovCisJU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIG1vbml0b3JpbmdFeGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKwkJCXJldHVybiBuZXcgVGhyZWFkKHIsICJGRS1Nb25pdG9yaW5nLVRocmVhZCIpOworCQl9CisJfSk7CisJcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisJcHVibGljIEZlTW9uaXRvcmluZ1NlcnZpY2UoU2VydmxldENvbnRleHQgY29udGV4dCkgeworCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIHN0YXJ0KGludCBpbnRlcnZhbCkgeworCQlDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgoQ29uZmlndXJhdGlvbk1hbmFnZXIpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5DT05GSUdVUkFUSU9OX01BTkFHRVJfQVRUUikpCisJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKKwkJaWYgKGNvbmZpZy5nZXRTeXN0ZW1Nb25pdG9yaW5nKCkuZ2V0RW5hYmxlZCgpKSB7CisJCQlsb2cuaW5mbygiRkUgbW9uaXRvcmluZyBzZXJ2aWNlIGVuYWJsZWQsIGludGVydmFsIGlzIHt9IHNlY29uZHMiLCBpbnRlcnZhbCk7CisJCQl0aGlzLm1vbml0b3JpbmdFeGVjdXRvci5zY2hlZHVsZUF0Rml4ZWRSYXRlKG5ldyBNb25pdG9yaW5nU2NoZWR1bGVkVGFzaygpLCAwLCBpbnRlcnZhbCwgVGltZVVuaXQuU0VDT05EUyk7CisJCX0gZWxzZSB7CisJCQlsb2cuaW5mbygiRkUgbW9uaXRvcmluZyBzZXJ2aWNlIGlzIGRpc2FibGVkIik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc01vbml0b3JpbmdFdmVudChNb25pdG9yaW5nRXZlbnQgbW9uaXRvcmluZ01ldHJpY3MpIHsKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBodHRwQ2xpZW50ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUNvbmZpZ3VyYXRpb24gY29uZmlnID0gKChDb25maWd1cmF0aW9uTWFuYWdlcikgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkNPTkZJR1VSQVRJT05fTUFOQUdFUl9BVFRSKSkKKwkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKKwkJCVN0cmluZyByZWRpcmVjdGVkVXJsID0gU3RyaW5nLmZvcm1hdChVUkwsIGNvbmZpZy5nZXRCZVByb3RvY29sKCksIGNvbmZpZy5nZXRCZUhvc3QoKSwKKwkJCQkJY29uZmlnLmdldEJlSHR0cFBvcnQoKSk7CisJCQlodHRwQ2xpZW50ID0gZ2V0SHR0cENsaWVudChjb25maWcpOworCQkJSHR0cFBvc3QgaHR0cFBvc3QgPSBuZXcgSHR0cFBvc3QocmVkaXJlY3RlZFVybCk7CisJCQlTdHJpbmcgbW9uaXRvcmluZ01ldHJpY3NKc29uID0gZ3Nvbi50b0pzb24obW9uaXRvcmluZ01ldHJpY3MpOworCQkJSHR0cEVudGl0eSBteUVudGl0eSA9IG5ldyBTdHJpbmdFbnRpdHkobW9uaXRvcmluZ01ldHJpY3NKc29uKTsKKwkJCWh0dHBQb3N0LnNldEVudGl0eShteUVudGl0eSk7CisJCQlodHRwUG9zdC5zZXRIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTik7CisJCQlpbnQgYmVSZXNwb25zZVN0YXR1czsKKwkJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSBiZVJlc3BvbnNlOworCQkJdHJ5IHsKKwkJCQliZVJlc3BvbnNlID0gaHR0cENsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCQliZVJlc3BvbnNlU3RhdHVzID0gYmVSZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworCQkJCWlmIChiZVJlc3BvbnNlU3RhdHVzICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKwkJCQkJbW9uaXRvcmluZ0xvZ2dlci5lcnJvcigiVW5leHBlY3RlZCBIVFRQIHJlc3BvbnNlIGZyb20gQkUgOiB7fSIsIGJlUmVzcG9uc2VTdGF0dXMpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJbW9uaXRvcmluZ0xvZ2dlci5lcnJvcigiTW9uaXRvcmluZyBlcnJvciB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIEJFIiwgZSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQltb25pdG9yaW5nTG9nZ2VyLmVycm9yKCJVbmV4cGVjdGVkIG1vbml0b3JpbmcgZXJyb3IiLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChodHRwQ2xpZW50ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlodHRwQ2xpZW50LmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgQ2xvc2VhYmxlSHR0cENsaWVudCBnZXRIdHRwQ2xpZW50KENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisJCWludCB0aW1lb3V0ID0gMzAwMDsKKwkJUmVxdWVzdENvbmZpZy5CdWlsZGVyIHJlcXVlc3RCdWlsZGVyID0gUmVxdWVzdENvbmZpZy5jdXN0b20oKTsKKwkJcmVxdWVzdEJ1aWxkZXIuc2V0Q29ubmVjdFRpbWVvdXQodGltZW91dCkuc2V0Q29ubmVjdGlvblJlcXVlc3RUaW1lb3V0KHRpbWVvdXQpLnNldFNvY2tldFRpbWVvdXQodGltZW91dCk7CisKKwkJSHR0cENsaWVudEJ1aWxkZXIgYnVpbGRlciA9IEh0dHBDbGllbnRCdWlsZGVyLmNyZWF0ZSgpOworCQlidWlsZGVyLnNldERlZmF1bHRSZXF1ZXN0Q29uZmlnKHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCkpOworCQlyZXR1cm4gYnVpbGRlci5idWlsZCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL2RhdGFfc3RydWN0dXJlL0NhcExpc3RUZXN0LmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhX3N0cnVjdHVyZS9DYXBMaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZWIyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi9kYXRhX3N0cnVjdHVyZS9DYXBMaXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFfc3RydWN0dXJlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5DYXBMaXN0OworCitwdWJsaWMgY2xhc3MgQ2FwTGlzdFRlc3QgeworCXB1YmxpYyBlbnVtIExJU1RfQUNUSU9OIHsKKwkJQWRkLCBSZW1vdmUsIFNpemUsIEdldAorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENhcCgpIHsKKwkJTGlzdDxJbnRlZ2VyPiB0ZXN0TGlzdCA9IG5ldyBDYXBMaXN0PD4oMTApOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQl0ZXN0TGlzdC5hZGQoaSk7CisJCX0KKwkJYXNzZXJ0VHJ1ZSh0ZXN0TGlzdC5zaXplKCkgPT0gMTApOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlhc3NlcnRUcnVlKHRlc3RMaXN0LmdldChpKSA9PSAoaSArIDkwKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRTYWZlKCkgeworCQlMaXN0PEludGVnZXI+IHRlc3RMaXN0ID0gbmV3IENhcExpc3Q8PigxMDAwKTsKKworCQlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCVJ1bm5hYmxlIHdvcmtlcjsKKwkJCS8vIDAgLSA0CisJCQlpZiAoaSA8IDUpIHsKKwkJCQl3b3JrZXIgPSBuZXcgVGhyZWFkV29ya2VyKGksIExJU1RfQUNUSU9OLkFkZCwgdGVzdExpc3QpOworCQkJfQorCQkJLy8gNSwgOAorCQkJZWxzZSBpZiAoaSA9PSA1IHx8IGkgPT0gOCkgeworCQkJCXdvcmtlciA9IG5ldyBUaHJlYWRXb3JrZXIoaSwgTElTVF9BQ1RJT04uUmVtb3ZlLCB0ZXN0TGlzdCk7CisJCQl9CisJCQkvLyA2CisJCQllbHNlIGlmIChpID09IDYpIHsKKwkJCQl3b3JrZXIgPSBuZXcgVGhyZWFkV29ya2VyKGksIExJU1RfQUNUSU9OLlNpemUsIHRlc3RMaXN0KTsKKwkJCX0KKwkJCS8vIDcsIDkKKwkJCWVsc2UgeworCQkJCXdvcmtlciA9IG5ldyBUaHJlYWRXb3JrZXIoaSwgTElTVF9BQ1RJT04uR2V0LCB0ZXN0TGlzdCk7CisJCQl9CisJCQlleGVjdXRvci5leGVjdXRlKHdvcmtlcik7CisJCX0KKwkJZXhlY3V0b3Iuc2h1dGRvd24oKTsKKwkJd2hpbGUgKCFleGVjdXRvci5pc1Rlcm1pbmF0ZWQoKSkgeworCQl9CisJCWFzc2VydFRydWUodGVzdExpc3Quc2l6ZSgpID09IDYwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFRocmVhZFdvcmtlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKwkJcHJpdmF0ZSBMSVNUX0FDVElPTiBhY3Rpb247CisJCXByaXZhdGUgTGlzdDxJbnRlZ2VyPiBsaXN0OworCQlwcml2YXRlIEludGVnZXIgaWQ7CisKKwkJVGhyZWFkV29ya2VyKEludGVnZXIgaWQsIExJU1RfQUNUSU9OIGFjdGlvbiwgTGlzdDxJbnRlZ2VyPiBsaXN0KSB7CisJCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKwkJCXRoaXMubGlzdCA9IGxpc3Q7CisJCQl0aGlzLmlkID0gaWQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCQkJdGhyZWFkTmFwKCk7CisJCQkJc3dpdGNoIChhY3Rpb24pIHsKKwkJCQljYXNlIEFkZDoKKwkJCQkJbGlzdC5hZGQoaWQgKiAxMDAgKyBpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSZW1vdmU6IHsKKwkJCQkJaW50IGluZGV4ID0gKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMCk7CisJCQkJCWxpc3QucmVtb3ZlKGluZGV4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgR2V0OgorCQkJCQlpbnQgaW5kZXggPSAoaW50KSAoTWF0aC5yYW5kb20oKSAqIDEwKTsKKwkJCQkJSW50ZWdlciBpbnRlZ2VyID0gbGlzdC5nZXQoaW5kZXgpOworCisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2l6ZToKKwkJCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCX0KKworCQlwcml2YXRlIHZvaWQgdGhyZWFkTmFwKCkgeworCQkJbG9uZyBuYXBUaW1lID0gKGxvbmcpIChNYXRoLnJhbmRvbSgpICogMTAwKTsKKwkJCXRyeSB7CisJCQkJVGhyZWFkLnNsZWVwKG5hcFRpbWUpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90ZXN0L0NvbW1vblV0aWxzVGVzdC5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdGVzdC9Db21tb25VdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA2MjU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdGVzdC9Db21tb25VdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nRXNjYXBlVXRpbHM7CitpbXBvcnQgb3JnLmpzb3VwLkpzb3VwOworaW1wb3J0IG9yZy5qc291cC5zYWZldHkuV2hpdGVsaXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkdlbmVyYWxVdGlsaXR5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLkh0bWxDbGVhbmVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsLlZhbGlkYXRpb25VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udXRpbC5ZYW1sVG9PYmplY3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxTdHlsZUVsZW1lbnQ7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLkR1bXBlck9wdGlvbnM7CitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CisKK3B1YmxpYyBjbGFzcyBDb21tb25VdGlsc1Rlc3QgeworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21tb25VdGlsc1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworCS8qCisJICogVmFsaWRhdGlvbiB1dGlscyBzdGFydAorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlU2VydmljZU5hbWUoKSB7CisKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb21wb25lbnROYW1lUGF0dGVybigiMTExMTIyMiIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb21wb25lbnROYW1lUGF0dGVybigic2ZFNDQ0NCIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb21wb25lbnROYW1lUGF0dGVybigiMTExMXNmZDIyMiIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb21wb25lbnROYW1lUGF0dGVybigiMTFzZGYgMTEyNF8yMiIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb21wb25lbnROYW1lUGF0dGVybigiMTExLS0tLTEyMjIiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29tcG9uZW50TmFtZVBhdHRlcm4oIjExMTFmIC4yMjIiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29tcG9uZW50TmFtZVBhdHRlcm4oIjExMTEyMjIiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbXBvbmVudE5hbWVQYXR0ZXJuKCIxMSExMTIyMiIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29tcG9uZW50TmFtZVBhdHRlcm4oIjExMXxgMTIyMiIpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVTZXJ2aWNlTmFtZUxlbmd0aFRlc3QoKSB7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29tcG9uZW50TmFtZUxlbmd0aCgiZnNkbGZzZGxrc2RzZDsiKSk7CisJCS8vIGFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbXBvbmVudE5hbWVMZW5ndGgoImRkZGRkZGRkZGRkZGRkZGRkZGRkZGRzZGZzZGRkZGRkZGRkZGRkZGRkZGRkZGRkZHNkZnMiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVJY29uKCkgeworCisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSWNvbigic29tZXRoaW5nIikpOworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUljb24oInNmRTQ0NDQiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSWNvbigiMTExMXNmZDIyMiIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJY29uKCIxMXNkZjExMjRfMjIiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSWNvbigiMTExLS0tLTEyMjIiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUljb24oIjExMTFmLjIyMiIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJY29uKCIxMTExMjIyIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJY29uKCIxMTExIDIyMiIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSWNvbigiMTEhMTEyMjIiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUljb24oIjExMXxgMTIyMiIpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZsb2F0UGFyc2luZygpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMuaXNGbG9hdE51bWJlcigiMTU1NTUuNDUiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLmlzRmxvYXROdW1iZXIoIjAuNSIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLmlzRmxvYXROdW1iZXIoIjE1NTU1IikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMuaXNGbG9hdE51bWJlcigiMSIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLmlzRmxvYXROdW1iZXIoImprNTMyIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMuaXNGbG9hdE51bWJlcigiMTIuLjYiKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUljb25MZW5ndGgoKSB7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSWNvbkxlbmd0aCgiZnNkbGZzZGxrc2RzZCIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSWNvbkxlbmd0aCgiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZHNkZnNkZGRkZGRkZGRkZGRkZGRkZGRkZGRkc2RmcyIpKTsKKwl9CisKKwkvLyAxNjEwT1MgU3VwcG9ydCAtIEJlY2F1c2Ugb2YgY2hhbmdlcyBpbiB0aGUgdmFsaWRhdGlvbiBpbiB0aGUgdWkgdGhpcyB0ZXN0IG5lZWRzIHRvIGJlIGZpeGVkCisvLwlAVGVzdAorLy8JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUHJvamVjdENvZGUoKSB7CisvLworLy8JCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUHJvamVjdENvZGUoIjE1NTU1IikpOworLy8JCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUHJvamVjdENvZGUoIjEyNDM0NTAxIikpOworLy8JCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUHJvamVjdENvZGUoIjAwMDAwIikpOworLy8JCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVByb2plY3RDb2RlKCJzb21ldGhpbmciKSk7CisvLwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUHJvamVjdENvZGUoInNvbSBldGhpbmciKSk7CisvLwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUHJvamVjdENvZGUoIjMyNTUgNjU2IikpOworLy8JCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVByb2plY3RDb2RlKCI0MzUzNXQ2MzYiKSk7CisvLwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlUHJvamVjdENvZGUoIjA5OCY2NTYiKSk7CisvLwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVByb2plY3RDb2RlTGVuZ3RoKCkgeworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVByb2plY3RDb2RlTGVndGgoIjAwMDAwIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVQcm9qZWN0Q29kZUxlZ3RoKCJkZGRkZGRkZGRkZGRkZGRkZGRkZGRkc2Rmc2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRzZGZzIikpOworCX0KKworCS8vIDE2MTBPUyBTdXBwb3J0IC0gQmVjYXVzZSBvZiBjaGFuZ2VzIGluIHRoZSB2YWxpZGF0aW9uIGluIHRoZSB1aSB0aGlzIHRlc3QgbmVlZHMgdG8gYmUgZml4ZWQKKy8vCUBUZXN0CisvLwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDb250YWN0SWQoKSB7CisvLworLy8JCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29udGFjdElkKCJtbDc4ODkiKSk7CisvLwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb250YWN0SWQoIk1sNzg4OSIpKTsKKy8vCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnRhY3RJZCgibWw3ODhyIikpOworLy8JCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnRhY3RJZCgic29tZXRoaW5nIikpOworLy8JCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnRhY3RJZCgibWxrMTExIikpOworLy8JCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnRhY3RJZCgiMTJtbDg5IikpOworLy8JCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnRhY3RJZCgiISE3ODkwMCIpKTsKKy8vCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlbW92ZUh0bWwoKSB7CisKKwkJYXNzZXJ0VHJ1ZSgiZ29vYm9vIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLnJlbW92ZUh0bWxUYWdzKCI8Yj5nb288Yj48L2I+PC9iPjxiPmJvbzwvYj4iKSkpOworCQlhc3NlcnRUcnVlKCJnb28mbHQ7Ym9vIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLnJlbW92ZUh0bWxUYWdzKCI8Yj5nb288Yj48L2I+PDwvYj48Yj5ib288L2I+IikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vIGJvbyIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5yZW1vdmVIdG1sVGFncygiZ29vIGJvbyIpKSk7CisJCWFzc2VydFRydWUoImdvbyMgLiBib28xMiIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5yZW1vdmVIdG1sVGFncygiZ29vIyAuIGJvbzEyIikpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3Rub3JtYWxpc2VXaGl0ZXNwYWNlKCkgeworCisJCWFzc2VydFRydWUoImdvbyBib28iLmVxdWFscyhWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlV2hpdGVzcGFjZSgiZ29vIGJvbyIpKSk7CisJCWFzc2VydFRydWUoImdvbyBib28gIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZVdoaXRlc3BhY2UoImdvbyBib28JIikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vIGJvbyIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VXaGl0ZXNwYWNlKCJnb28gICAgYm9vIikpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RzdHJpcE9jdGV0cygpIHsKKwkJYXNzZXJ0VHJ1ZSgiZ29vIGJvbyIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5zdHJpcE9jdGV0cygiZ29vJTFGIGJvbyIpKSk7CisJCWFzc2VydFRydWUoImdvbyBib28gIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLnN0cmlwT2N0ZXRzKCJnb28gYm9vICUxRiIpKSk7CisJCWFzc2VydFRydWUoImdvbyBib28iLmVxdWFscyhWYWxpZGF0aW9uVXRpbHMuc3RyaXBPY3RldHMoIiUxRmdvbyBib28iKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vbmVVdGY4Q2hhcnMoKSB7CisJCWFzc2VydFRydWUoImdvbyBib28iLmVxdWFscyhWYWxpZGF0aW9uVXRpbHMucmVtb3ZlTm9uZVV0ZjhDaGFycygiZ29vIGJvbyIpKSk7CisJCWFzc2VydFRydWUoImdvbyBib28hIS5fIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLnJlbW92ZU5vbmVVdGY4Q2hhcnMoImdvbyBib28hIS5fIikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vIAlib28iLmVxdWFscyhWYWxpZGF0aW9uVXRpbHMucmVtb3ZlTm9uZVV0ZjhDaGFycygiZ29vIAlib28iKSkpOworCQlhc3NlcnRUcnVlKCJnb28gIGJvMTIzbyIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5yZW1vdmVOb25lVXRmOENoYXJzKCJnb28gIGJvMTIzbyIpKSk7CisJCWFzc2VydFRydWUoImdvbyAgYm8xMjNvIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLnJlbW92ZU5vbmVVdGY4Q2hhcnMoImdvbyAg16fXp2JvMTIzb9eS15vXp9enIikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vICBibzEyM28iLmVxdWFscyhWYWxpZGF0aW9uVXRpbHMucmVtb3ZlTm9uZVV0ZjhDaGFycygiZ29vICBibzHvv73vv73vv73vv73vv73vv70yM28iKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVFbmdsaXNoVGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJc0VuZ2xpc2goIm1sNzg4OSIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlSXNFbmdsaXNoKCJtbDc4ODnXp9eoIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVJc0VuZ2xpc2goIm1sNzg4OeaWhyIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHJlbW92ZUR1cGxpY2F0ZUZyb21MaXN0VGVzdCgpIHsKKwkJTGlzdDxTdHJpbmc+IHRhZ3NCZWZvcmUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzEiKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzciKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzMiKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzQiKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzEiKTsKKworCQlMaXN0PFN0cmluZz4gdGFnc0FmdGVyID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXRhZ3NBZnRlci5hZGQoInRhZzEiKTsKKwkJdGFnc0FmdGVyLmFkZCgidGFnNyIpOworCQl0YWdzQWZ0ZXIuYWRkKCJ0YWczIik7CisJCXRhZ3NBZnRlci5hZGQoInRhZzQiKTsKKwkJYXNzZXJ0VHJ1ZSh0YWdzQWZ0ZXIuY29udGFpbnNBbGwoVmFsaWRhdGlvblV0aWxzLnJlbW92ZUR1cGxpY2F0ZUZyb21MaXN0KHRhZ3NCZWZvcmUpKSk7CisJCXRhZ3NCZWZvcmUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzEiKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzciKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzMiKTsKKwkJdGFnc0JlZm9yZS5hZGQoInRhZzQiKTsKKwkJdGFnc0JlZm9yZS5hZGQoIlRhZzEiKTsKKworCQl0YWdzQWZ0ZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJdGFnc0FmdGVyLmFkZCgidGFnMSIpOworCQl0YWdzQWZ0ZXIuYWRkKCJ0YWc3Iik7CisJCXRhZ3NBZnRlci5hZGQoInRhZzMiKTsKKwkJdGFnc0FmdGVyLmFkZCgidGFnNCIpOworCQl0YWdzQWZ0ZXIuYWRkKCJUYWcxIik7CisJCWFzc2VydFRydWUodGFnc0FmdGVyLmNvbnRhaW5zQWxsKFZhbGlkYXRpb25VdGlscy5yZW1vdmVEdXBsaWNhdGVGcm9tTGlzdCh0YWdzQmVmb3JlKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVUYWdMZW5ndGhUZXN0KCkgeworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVRhZ0xlbmd0aCgiZnNkbGZzZGxrZmprbGpzZGYiKSk7CisJCS8vIGFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVRhZ0xlbmd0aCgiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZHNkZnNkZGRkZGRkZGRkZGRkZGRkZGRkZGRkc2RmcyIpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVUYWdMaXN0TGVuZ3RoVGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVUYWdMaXN0TGVuZ3RoKCJmc2RsZnNkbGtmamtsanNkZixkc2ZzZGZzZGYiLmxlbmd0aCgpKSk7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8PSAxMDI0OyBpKyspIHsKKwkJCXNiLmFwcGVuZCgiYSIpOworCQl9CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVRhZ0xpc3RMZW5ndGgoc2IudG9TdHJpbmcoKS5sZW5ndGgoKSkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZURlc2NyaXB0aW9uTGVuZ3RoVGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVEZXNjcmlwdGlvbkxlbmd0aCgiZnNkbGZzZGxrZmprbGpzZGRnZmdkZmdkZmdkZmdmZiIpKTsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDw9IDEwMjQ7IGkrKykgeworCQkJc2IuYXBwZW5kKCJhIik7CisJCX0KKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlRGVzY3JpcHRpb25MZW5ndGgoc2IudG9TdHJpbmcoKSkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZVN0cmluZ05vdEVtcHR5VGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eSgiZnNkbGZzZGxrIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eSgiIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVTdHJpbmdOb3RFbXB0eSgiICAiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVN0cmluZ05vdEVtcHR5KCIJIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVWZW5kb3JOYW1lVGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVWZW5kb3JOYW1lKCJmc2RsZnNkbGsiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVmVuZG9yTmFtZSgiZnNkbGZzZGxrLnNkc2Q7IikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVWZW5kb3JOYW1lKCJzYWRmOiIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVmVuZG9yTmFtZSgic2FkZi8iKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVZlbmRvck5hbWUoInNhZGY/IikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVWZW5kb3JOYW1lTGVuZ3RoVGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVWZW5kb3JOYW1lTGVuZ3RoKCJmc2RsZnNkbGsuc2RzZDsiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVZlbmRvck5hbWVMZW5ndGgoImRkZGRkZGRkZGRkZGRkZGRkZGRkZGRzZGZzIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVWZW5kb3JSZWxlYXNlVGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVWZW5kb3JSZWxlYXNlKCJmc2RsZnNkbGsiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVmVuZG9yUmVsZWFzZSgiZnNkbGZzZGxrLnNkc2Q7IikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVWZW5kb3JSZWxlYXNlKCJzYWRmOiIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVmVuZG9yUmVsZWFzZSgic2FkZi8iKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVZlbmRvclJlbGVhc2UoInNhZGY/IikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVWZW5kb3JSZWxlYXNlTGVuZ3RoVGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVWZW5kb3JOYW1lTGVuZ3RoKCJmc2RsZnNkbGsuc2RzZDsiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVZlbmRvck5hbWVMZW5ndGgoImRkZGRkZGRkZGRkZGRkZGRkZGRkZGRzZGZzIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaGFzQmVlbkNlcnRpZmllZFRlc3QoKSB7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLmhhc0JlZW5DZXJ0aWZpZWQoIjEuMiIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMuaGFzQmVlbkNlcnRpZmllZCgiMi4yIikpOworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy5oYXNCZWVuQ2VydGlmaWVkKCIxLjAiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy5oYXNCZWVuQ2VydGlmaWVkKCIwLjEiKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZWROYW1lVGVzdCgpIHsKKwkJU3RyaW5nIGlucHV0ID0gIk15TmV3U3lzTmFtZSI7CisJCVN0cmluZyBvdXRwdXROb3JtID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudE5hbWUoaW5wdXQpOworCQlTdHJpbmcgb3V0cHV0U3lzID0gVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoaW5wdXQpOworCQlsb2cuZGVidWcoInt9IDw+IHt9IDw+IHt9IiwgaW5wdXQsIG91dHB1dE5vcm0sIG91dHB1dFN5cyk7CisKKwkJaW5wdXQgPSAiTXkgTmV3IFN5cyBOYW1lIjsKKwkJb3V0cHV0Tm9ybSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKGlucHV0KTsKKwkJb3V0cHV0U3lzID0gVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoaW5wdXQpOworCQlsb2cuZGVidWcoInt9IDw+IHt9IDw+IHt9IiwgaW5wdXQsIG91dHB1dE5vcm0sIG91dHB1dFN5cyk7CisKKwkJaW5wdXQgPSAiTXkuTmV3LVN5c19OYW1lIjsKKwkJb3V0cHV0Tm9ybSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKGlucHV0KTsKKwkJb3V0cHV0U3lzID0gVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoaW5wdXQpOworCQlsb2cuZGVidWcoInt9IDw+IHt9IDw+IHt9IiwgaW5wdXQsIG91dHB1dE5vcm0sIG91dHB1dFN5cyk7CisKKwkJaW5wdXQgPSAiTXkuLk5ldy1TeXNfTmFtZSI7CisJCW91dHB1dE5vcm0gPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShpbnB1dCk7CisJCW91dHB1dFN5cyA9IFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKGlucHV0KTsKKwkJbG9nLmRlYnVnKCJ7fSA8PiB7fSA8PiB7fSIsIGlucHV0LCBvdXRwdXROb3JtLCBvdXRwdXRTeXMpOworCisJCWlucHV0ID0gIk15Lk5ldy0tc3lzX05BbWUiOworCQlvdXRwdXROb3JtID0gVmFsaWRhdGlvblV0aWxzLm5vcm1hbGlzZUNvbXBvbmVudE5hbWUoaW5wdXQpOworCQlvdXRwdXRTeXMgPSBWYWxpZGF0aW9uVXRpbHMuY29udmVydFRvU3lzdGVtTmFtZShpbnB1dCk7CisJCWxvZy5kZWJ1Zygie30gPD4ge30gPD4ge30iLCBpbnB1dCwgb3V0cHV0Tm9ybSwgb3V0cHV0U3lzKTsKKworCQlpbnB1dCA9ICJMYXllciAzIENvbm5lY3Rpdml0eSI7CisJCW91dHB1dE5vcm0gPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShpbnB1dCk7CisJCW91dHB1dFN5cyA9IFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKGlucHV0KTsKKwkJbG9nLmRlYnVnKCJ7fSA8PiB7fSA8PiB7fSIsIGlucHV0LCBvdXRwdXROb3JtLCBvdXRwdXRTeXMpOworCisJCWlucHV0ID0gIkxheWVyIDMgVlBOIjsKKwkJb3V0cHV0Tm9ybSA9IFZhbGlkYXRpb25VdGlscy5ub3JtYWxpc2VDb21wb25lbnROYW1lKGlucHV0KTsKKwkJb3V0cHV0U3lzID0gVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRUb1N5c3RlbU5hbWUoaW5wdXQpOworCQlsb2cuZGVidWcoInt9IDw+IHt9IDw+IHt9IiwgaW5wdXQsIG91dHB1dE5vcm0sIG91dHB1dFN5cyk7CisKKwkJaW5wdXQgPSAiTGF5ZXItMyAgICAgIENvbm5lY3Rpdml0eSI7CisJCW91dHB1dE5vcm0gPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShpbnB1dCk7CisJCW91dHB1dFN5cyA9IFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKGlucHV0KTsKKwkJbG9nLmRlYnVnKCJ7fSA8PiB7fSA8PiB7fSIsIGlucHV0LCBvdXRwdXROb3JtLCBvdXRwdXRTeXMpOworCisJCWlucHV0ID0gIklQLWNvbm5lY3Rpdml0eSI7CisJCW91dHB1dE5vcm0gPSBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXNlQ29tcG9uZW50TmFtZShpbnB1dCk7CisJCW91dHB1dFN5cyA9IFZhbGlkYXRpb25VdGlscy5jb252ZXJ0VG9TeXN0ZW1OYW1lKGlucHV0KTsKKwkJbG9nLmRlYnVnKCJ7fSA8PiB7fSA8PiB7fSIsIGlucHV0LCBvdXRwdXROb3JtLCBvdXRwdXRTeXMpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBub3JtYWxpemVGaWxlTmFtZVRlc3QoKSB7CisJCWFzc2VydFRydWUoInRvby5qcGVnIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKCJ0b28uanBlZyIpKSk7CisJCWFzc2VydFRydWUoInRvby4uanBlZyIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZSgidG9vLi5qcGVnIikpKTsKKwkJYXNzZXJ0VHJ1ZSgidG9vLi5qcGVnIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKCJ0Km86by4uanBlPD5nIikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vLnRvby4uanBlZyIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZSgiZ29vLnQqbzpvLi5qcGU8PmciKSkpOworCQlhc3NlcnRUcnVlKCJnb28udG9vLi5qcGVnIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKCIgICBnb28udCpvOm8uLmpwZTw+ZyAgIikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vLXRvby1tby5qcGVnIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKCJnb28gICB0b28tLS0tbW8uanBlZyIpKSk7CisJCWFzc2VydFRydWUoImdvby10b28tbW8uanBlZyIuZXF1YWxzKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVGaWxlTmFtZSgiLlxcLi5cXGdvbyAgIHRvby0tLS1tby5qcGVnIikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vLXRvby1tby5qcGVnIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKCJfXy0tZ29vICAgdG9vLS0tLW1vLmpwZWctLV9fIikpKTsKKwkJYXNzZXJ0VHJ1ZSgiZ29vLXRvby1tby5qcGVnIi5lcXVhbHMoVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUZpbGVOYW1lKCJfIC1nb28gICB0b28tLS0tbW8uanBlZyBfLS0gIF8tIikpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVVcmxUZXN0KCkgeworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVybCgiaHR0cDovL2dvb2dsZS5jby5pbC8iKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXJsKCJodHRwczovL2dvb2dsZS5jby5pbC8iKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXJsKCJodHRwczovL2dvb2dsZS5jby5pbC9nby9nbyIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVcmwoImh0dHBzOi8vZ29vZ2xlLmNvLmlsL2dvL2dvIikpOworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVybCgiaHR0cDovL2dvb2dsZS5jby5pbC9nby9nbyIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlVXJsKCJnb29nbGUuY28uaWwvZ28vZ28iKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZVVybCgiaHR0cHM6Ly9nb29nbGUuY28uaWwvZ28vZ28hIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVVcmwoImh0dHBzOi8vZztvb2dsZS5jby5pbC9nby9nbyIpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbm9ybWFsaXplQXJ0aWZhY3RMYWJlbCgpIHsKKwkJYXNzZXJ0RXF1YWxzKFZhbGlkYXRpb25VdGlscy5ub3JtYWxpemVBcnRpZmFjdExhYmVsKCJUZXN0LS0zICAgIDEzNCsrIiksICJ0ZXN0MzEzNCIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2xlYW5BcnRpZmFjdExhYmVsKCkgeworCQlhc3NlcnRFcXVhbHMoVmFsaWRhdGlvblV0aWxzLmNsZWFuQXJ0aWZhY3REaXNwbGF5TmFtZSgiVGVzdC0tMyAgICAxMzQrKyIpLCAiVGVzdC0zIDEzNCsiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZhbGlkYXRlQXJ0aWZhY3RMYWJlbCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdExhYmVsKCJkc2Zsa2pzZGYzNDVKS0wiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RMYWJlbCgiZHNmc2QgbGtqICAiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3RMYWJlbCgic2RmZHNmLS0tKyIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdExhYmVsKCIgICAtICArIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdExhYmVsKCJzZnNkZmhrajExMT0iKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0TGFiZWwoInNmc2RmaGtqMTExPWRmc2YlIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdExhYmVsKCJzZGZzZGZsamdoZ2tsc2RnOTA4KiIpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmFsaWRhdGVDb25zdW1lck5hbWVUZXN0KCkgeworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyTmFtZSgiYWIwMzdjZCIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29uc3VtZXJOYW1lKCIgIikpOworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyTmFtZSgiX2RELmQ5IikpOworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyTmFtZSgiX2RkLkc5LSIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29uc3VtZXJOYW1lKCIuZEEuZDktIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb25zdW1lck5hbWUoIi1kIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb25zdW1lck5hbWUoImQ/IikpOworCQlhc3NlcnRUcnVlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyTmFtZSgiOSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uc3VtZXJQYXNzU2FsdFRlc3QoKSB7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29uc3VtZXJQYXNzU2FsdCgiYWQzNWZnMiIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb25zdW1lclBhc3NTYWx0KCIxMnMiKSk7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29uc3VtZXJQYXNzU2FsdCgiOSIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29uc3VtZXJQYXNzU2FsdCgiZEEuZDktIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDb25zdW1lclBhc3NTYWx0KCJkQVNRZSIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29uc3VtZXJQYXNzU2FsdCgiX2QiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyUGFzc1NhbHQoIj8iKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNvbnN1bWVyUGFzc1NhbHQoIiIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ29uc3VtZXJQYXNzU2FsdCgiICIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2F0ZWdvcnlOYW1lRm9ybWF0VGVzdCgpIHsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lRm9ybWF0KCJOZXQgICAgICAgICAgIGVsZS0yXzMjNDU2JisuJz06QEBAQEAjIyMjIyIpKTsKKwkJLy8gdGhpcyB3aWxsIGZhaWwgYXQgbGVuZ3RoCisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlEaXNwbGF5TmFtZUZvcm1hdChudWxsKSk7CisJCS8vICogaXMgbm90IGFsbG93ZWQKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlEaXNwbGF5TmFtZUZvcm1hdCgiTmV0IGVsZS0yXzMjNDU2JiorLic9OkAiKSk7CisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNhdGVnb3J5RGlzcGxheU5hbWVGb3JtYXQoIiIpKTsKKwkJLy8gc2hvdWxkIHN0YXJ0IHdpdGggYWxwaGFudW1lcmljCisJCWFzc2VydEZhbHNlKFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUNhdGVnb3J5RGlzcGxheU5hbWVGb3JtYXQoIiNhYmNkZWYiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNhdGVnb3J5TmFtZUxlbmd0aFRlc3QoKSB7CisJCWFzc2VydFRydWUoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlEaXNwbGF5TmFtZUxlbmd0aCgiTmV0ZWxlLTJfMyM0NTYmKy4nPTpAQEBAQCIpKTsKKwkJYXNzZXJ0VHJ1ZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lTGVuZ3RoKCJOZXRlIikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lTGVuZ3RoKCJOZXRlbGUtMl8zIzQ1NiYrLic9OkBAQEBAMSIpKTsKKwkJYXNzZXJ0RmFsc2UoVmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQ2F0ZWdvcnlEaXNwbGF5TmFtZUxlbmd0aCgiTmV0IikpOworCQlhc3NlcnRGYWxzZShWYWxpZGF0aW9uVXRpbHMudmFsaWRhdGVDYXRlZ29yeURpc3BsYXlOYW1lTGVuZ3RoKG51bGwpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZUNhdGVnb3J5TmFtZVRlc3QoKSB7CisJCWFzc2VydEVxdWFscygiTmV0ZUxFLTJfMyBvZiAjNDU2JisuICYgR29hbCBhIEFiYyc9OkAgQVQgJiBUIiwgVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTREaXNwbGF5KAorCQkJCSIgICBuZXRlTEUtLS0yX19fMyBPRiAjIyM0NTYmJiYrKysuLi4gICAgIGFOZCBnb2FsIEEgYWJjJycnPT06OkBAQEBAICAgICBBVCBhbmQgVCAgIikpOworCQlhc3NlcnRFcXVhbHMoIlRoZSBCYW5rIG9mIEFtZXJpY2EiLCBWYWxpZGF0aW9uVXRpbHMubm9ybWFsaXplQ2F0ZWdvcnlOYW1lNERpc3BsYXkoIlRoZSBCYW5rIE9GIEFtZXJpY2EiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBub3JtYWxpemVDYXRlZ29yeUxhYmVsVGVzdCgpIHsKKwkJYXNzZXJ0RXF1YWxzKCJuZXRlbGUtMl8zIG9mICM0NTYmKy4mZ29hbCBhIGFiYyc9OkAgYXQmdCIsCisJCQkJVmFsaWRhdGlvblV0aWxzLm5vcm1hbGl6ZUNhdGVnb3J5TmFtZTRVbmlxdWVuZXNzKCJOZXRlTEUtMl8zIG9mICM0NTYmKy4mR29hbCBhIEFiYyc9OkAgQVQmVCIpKTsKKwl9CisKKwkvKgorCSAqIFZhbGlkYXRpb24gdXRpbHMgZW5kCisJICovCisKKwkvKgorCSAqIEdlbmVyYWwgdXRpbGl0eSBzdGFydAorCSAqLworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpbGVFeHRlbnNpb24oKSB7CisJCWFzc2VydEVxdWFscyhDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBHZW5lcmFsVXRpbGl0eS5nZXRGaWxlbmFtZUV4dGVuc2lvbigibGFsYXRydSIpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIEdlbmVyYWxVdGlsaXR5LmdldEZpbGVuYW1lRXh0ZW5zaW9uKCJhYS4iKSk7CisJCWFzc2VydEVxdWFscyhDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBHZW5lcmFsVXRpbGl0eS5nZXRGaWxlbmFtZUV4dGVuc2lvbihudWxsKSk7CisJCWFzc2VydEVxdWFscygieWFtbCIsIEdlbmVyYWxVdGlsaXR5LmdldEZpbGVuYW1lRXh0ZW5zaW9uKCJsYWxhLnRydS55YW1sIikpOworCQlhc3NlcnRFcXVhbHMoInR4dCIsIEdlbmVyYWxVdGlsaXR5LmdldEZpbGVuYW1lRXh0ZW5zaW9uKCJrdWt1LnR4dCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHlhbWxUZXN0KCkgeworCisJCWxvZy5kZWJ1ZygiXCJrdWt1XCIiKTsKKwkJRHVtcGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IER1bXBlck9wdGlvbnMoKTsKKwkJLy8gb3B0aW9ucy5zZXREZWZhdWx0Rmxvd1N0eWxlKER1bXBlck9wdGlvbnMuRmxvd1N0eWxlLkJMT0NLKTsKKwkJb3B0aW9ucy5zZXREZWZhdWx0U2NhbGFyU3R5bGUoRHVtcGVyT3B0aW9ucy5TY2FsYXJTdHlsZS5GT0xERUQpOworCQlZYW1sIHlhbWwgPSBuZXcgWWFtbChvcHRpb25zKTsKKworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJcGFyYW1ldGVycy5wdXQoImsxIiwgInZhbCIpOworCQlwYXJhbWV0ZXJzLnB1dCgiazIiLCAiXCJ2YWxcIiIpOworCisJCVN0cmluZyBzdHIgPSB5YW1sLmR1bXAocGFyYW1ldGVycyk7CisJCWxvZy5kZWJ1ZyhzdHIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgeWFtbFZhbGlkVGVzdCgpIHsKKworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXNiLmFwcGVuZCgia2V5OiBcIiFAOy8/OiY9KyQsXy5+KicoKVtdXCIiKTsKKwkJYnl0ZVtdIHBheWxvYWQgPSBzYi50b1N0cmluZygpLmdldEJ5dGVzKCk7Ly8gQmFzZTY0LmRlY29kZUJhc2U2NChzYi50b1N0cmluZygpKTsKKworCQlZYW1sVG9PYmplY3RDb252ZXJ0ZXIgeWFtbFRvT2JqZWN0Q29udmVydGVyID0gbmV3IFlhbWxUb09iamVjdENvbnZlcnRlcigpOworCisJCWFzc2VydFRydWUoeWFtbFRvT2JqZWN0Q29udmVydGVyLmlzVmFsaWRZYW1sKHBheWxvYWQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVPbmx5SHRtbFRhZ3MoKSB7CisKKwkJYXNzZXJ0RXF1YWxzKCJnb29ib28iLCBIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjxiPmdvbzxiPjwvYj48L2I+PGI+Ym9vPC9iPiIpKTsKKwkJU3RyaW5nIHN0ciA9IEh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiPGVzb2Zlcj48Yj5nb288Yj48L2I+PDwvYj48Yj5ib288L2I+Iik7CisKKwkJU3RyaW5nIHN0cmlwSHRtbEFuZEVzY2FwZSA9IEh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiPGVzb2Zlcj48Yj5nb288Yj48L2I+PDwvYj48Yj5ib288L2I+Iik7CisJCWFzc2VydEVxdWFscygiPGVzb2Zlcj5nb288Ym9vIiwgc3RyaXBIdG1sQW5kRXNjYXBlKTsKKworCQlzdHJpcEh0bWxBbmRFc2NhcGUgPSBIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjxlc29mZXI+PGI+Z29vPGI+PC9iPjw8L2I+PGI+Ym9vPC9iPiIsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIiZsdDtlc29mZXImZ3Q7Z29vJmx0O2JvbyIsIHN0cmlwSHRtbEFuZEVzY2FwZSk7CisKKwkJc3RyaXBIdG1sQW5kRXNjYXBlID0gSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8ZXNvZmVyPjxiPmdvbzxiPjwvYj48JjwvYj48Yj5ib288L2I+ZHZjJiIsIHRydWUpOworCQlhc3NlcnRFcXVhbHMoIiZsdDtlc29mZXImZ3Q7Z29vJmx0OyZhbXA7Ym9vZHZjJmFtcDsiLCBzdHJpcEh0bWxBbmRFc2NhcGUpOworCisJCWFzc2VydEVxdWFscygiZXNvZmVyJmd0OyZndDsmbHQ7Jmx0OyIsIEh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiZXNvZmVyPj48PCIsIHRydWUpKTsKKwkJYXNzZXJ0RXF1YWxzKCJlc29mZXI+Pjw8IiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCJlc29mZXI+Pjw8IiwgZmFsc2UpKTsKKworCQlhc3NlcnRFcXVhbHMoIjxlc29mZXIxPj48PGVzb2ZlcjI+IiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8ZXNvZmVyMT4+PDxlc29mZXIyPiIpKTsKKworCQlhc3NlcnRFcXVhbHMoIjxlc29mZXIxIGE9IGI+Pjw8ZXNvZmVyMj4iLCBIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjxlc29mZXIxIGE9IGI+PGgxPj48PGVzb2ZlcjI+PGJyPiIpKTsKKworCQlhc3NlcnRFcXVhbHMoIiZsdDtlc29mZXIxIGE9ICdiJyZndDsmZ3Q7Jmx0OyZsdDtlc29mZXIyJmd0OyIsCisJCQkJSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8ZXNvZmVyMSBhPSAnYic+Pjw8ZXNvZmVyMj4iLCB0cnVlKSk7CisJCWFzc2VydEVxdWFscygiPGVzb2ZlcjEgYT0gJ2InPj48PGVzb2ZlcjI+IiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8ZXNvZmVyMSBhPSAnYic+PjxINj48PGVzb2ZlcjI+IikpOworCisJCWFzc2VydEVxdWFscygiPGVzb2ZlcjEgYT0gYj4+PDxlc29mZXIyPiIsIEh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiPGVzb2ZlcjEgYT0gYj4+PDxlc29mZXIyPiIpKTsKKworCQlhc3NlcnRFcXVhbHMoIjxlc29mZXIxIHNkIHNhPSBiPj48PGVzb2ZlcjI+IiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8ZXNvZmVyMSBzZCBzYT0gYj4+PDxlc29mZXIyPiIpKTsKKworCQlhc3NlcnRFcXVhbHMoIiZsdDtlc29mZXIxIHNkIHNhPSBiJmd0OyZndDsmbHQ7Jmx0O2Vzb2ZlcjImZ3Q7IiwKKwkJCQlIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjxlc29mZXIxIHNkIHNhPSBiPj48PGVzb2ZlcjI+IiwgdHJ1ZSkpOworCQlhc3NlcnRFcXVhbHMoIjxlc29mZXIxIHNkIHNhPSBiPj48PGVzb2ZlcjI+IiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8ZXNvZmVyMSBzZCBzYT0gYj4+PDxlc29mZXIyPiIsIGZhbHNlKSk7CisJCWFzc2VydEVxdWFscygiJmx0O2Vzb2ZlcjEgc2Qgc2E9IGImZ3Q7Jmd0OyZsdDsmbHQ7ZXNvZmVyMiZndDsiLAorCQkJCUh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiPGVzb2ZlcjEgc2Qgc2E9IGI+Pjw8ZXNvZmVyMj4iLCB0cnVlKSk7CisJCWFzc2VydEVxdWFscygiPGVzb2ZlcjEgc2Qgc2E9IGI+Pjw8ZXNvZmVyMj4iLAorCQkJCUh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiPGVzb2ZlcjEgc2Qgc2E9IGI+Pjxicj48SDE+PDxlc29mZXIyPiIsIGZhbHNlKSk7CisJCWFzc2VydEVxdWFscygiJmx0O2Vzb2ZlciZndDtnb28mbHQ7JmFtcDtib29kdmMmYW1wOyIsCisJCQkJSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8ZXNvZmVyPjxiPmdvbzxiPjwvYj48JjwvYj48Yj5ib288L2I+ZHZjJiIsIHRydWUpKTsKKwkJYXNzZXJ0RXF1YWxzKCI8ZXNvZmVyPmdvbzwmYm9vZHZjJiIsIEh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiPGVzb2Zlcj48Yj5nb288Yj48L2I+PCY8L2I+PGI+Ym9vPC9iPmR2YyYiLCBmYWxzZSkpOworCQlhc3NlcnRFcXVhbHMoIjw8PD4+PjtcIiIsIEh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiPDw8Pj4+O1wiIiwgZmFsc2UpKTsKKwkJYXNzZXJ0RXF1YWxzKCImbHQ7Jmx0OyZsdDsmZ3Q7Jmd0OyZndDs7JnF1b3Q7IiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8PDw+Pj47XCIiLCB0cnVlKSk7CisJCWFzc2VydEVxdWFscygiPDw8Pj4+O1wiIiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8PDw+Pj47XCIiLCBmYWxzZSkpOworCQlhc3NlcnRFcXVhbHMoImFiYyBhYiBhIiwgSHRtbENsZWFuZXIuc3RyaXBIdG1sKCJhYmMgYWIgYSIsIHRydWUpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmMgYWIgYSIsIEh0bWxDbGVhbmVyLnN0cmlwSHRtbCgiYWJjIGFiIGEiLCBmYWxzZSkpOworCQlhc3NlcnRFcXVhbHMoIjwgZXNvZmVyMSBzZCAmPD5zYT0gYj4+PDxlc29mZXIyPiIsCisJCQkJSHRtbENsZWFuZXIuc3RyaXBIdG1sKCI8IGVzb2ZlcjEgc2QgJjw+c2E9IGI+Pjxicj48SDE+PDxlc29mZXIyPiIsIGZhbHNlKSk7CisJCWFzc2VydEVxdWFscygic2E9IGI+Pjw8ZXNvZmVyMj4iLCBIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjxiciBzZCAmPD5zYT0gYj4+PGJyPjxIMT48PGVzb2ZlcjI+IiwgZmFsc2UpKTsKKwkJYXNzZXJ0RXF1YWxzKCI8IGJyIHNkICY8PnNhPSBiPj48PGVzb2ZlcjI+IiwKKwkJCQlIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjwgYnIgc2QgJjw+c2E9IGI+Pjxicj48SDE+PDxlc29mZXIyPiIsIGZhbHNlKSk7CisJCWFzc2VydEVxdWFscygic2E9IGI+Pjw8ZXNvZmVyMj4iLCBIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjwvYnIgc2QgJjw+c2E9IGI+Pjxicj48SDE+PDxlc29mZXIyPiIsIGZhbHNlKSk7CisJCWFzc2VydEVxdWFscygic2E9IGI+Pjw8ZXNvZmVyMj4iLCBIdG1sQ2xlYW5lci5zdHJpcEh0bWwoIjxiciBzZCAmPC8+c2E9IGI+Pjxicj48SDE+PDxlc29mZXIyPiIsIGZhbHNlKSk7CisKKwl9CisKKwkvKgorCSAqIEdlbmVyYWwgdXRpbGl0eSBlbmQKKwkgKi8KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvVGVzdEV4dGVybmFsQ29uZmlndXJhdGlvbi5qYXZhIGIvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdGVzdC9UZXN0RXh0ZXJuYWxDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzYjJlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvVGVzdEV4dGVybmFsQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueUxpc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueU9iamVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55U3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5ydW5uZXJzLk1vY2tpdG9KVW5pdFJ1bm5lcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5jb25maWcuRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkJhc2ljQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkNvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5GaWxlQ2hhbmdlQ2FsbGJhY2s7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmltcGwuQ29uZmlnRmlsZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5pbXBsLkV4dGVybmFsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uaW1wbC5GU0NvbmZpZ3VyYXRpb25Tb3VyY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRlc3QuY29uZmlnLlRlc3RDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50ZXN0LmNvbmZpZy5UZXN0Tm90RXhpc3RDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBUZXN0RXh0ZXJuYWxDb25maWd1cmF0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUZXN0RXh0ZXJuYWxDb25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCUNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlndXJhdGlvblNvdXJjZSA9IG51bGw7CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0dXAoKSB7CisKKwkJRXh0ZXJuYWxDb25maWd1cmF0aW9uLnNldEFwcE5hbWUoImNvbW1vbiIpOworCQlFeHRlcm5hbENvbmZpZ3VyYXRpb24uc2V0Q29uZmlnRGlyKCJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnIik7CisJCUV4dGVybmFsQ29uZmlndXJhdGlvbi5saXN0ZW5Gb3JDaGFuZ2VzKCk7CisKKwkJY29uZmlndXJhdGlvblNvdXJjZSA9IG5ldyBGU0NvbmZpZ3VyYXRpb25Tb3VyY2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldENoYW5nZUxpc3RlbmVyKCksIEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRDb25maWdEaXIoKSArIEZpbGUuc2VwYXJhdG9yICsgRXh0ZXJuYWxDb25maWd1cmF0aW9uLmdldEFwcE5hbWUoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWFkQ29uZmlndXJhdGlvbkZpbGUoKSB7CisKKwkJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lciA9IG5ldyBDb25maWd1cmF0aW9uTGlzdGVuZXIoVGVzdENvbmZpZ3VyYXRpb24uY2xhc3MsIG5ldyBGaWxlQ2hhbmdlQ2FsbGJhY2soKSB7CisKKwkJCXB1YmxpYyB2b2lkIHJlY29uZmlndXJlKEJhc2ljQ29uZmlndXJhdGlvbiBvYmopIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJbG9nLmRlYnVnKCJJbiByZWNvbmZpZ3VyZSBvZiB7fSIsIG9iaik7CisJCQl9CisKKwkJfSk7CisKKwkJVGVzdENvbmZpZ3VyYXRpb24gdGVzdENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uU291cmNlLmdldEFuZFdhdGNoQ29uZmlndXJhdGlvbihUZXN0Q29uZmlndXJhdGlvbi5jbGFzcywgY29uZmlndXJhdGlvbkxpc3RlbmVyKTsKKworCQlhc3NlcnRUcnVlKHRlc3RDb25maWd1cmF0aW9uICE9IG51bGwpOworCQlsb2cuZGVidWcoInt9IiwgdGVzdENvbmZpZ3VyYXRpb24pOworCQlhc3NlcnRFcXVhbHModGVzdENvbmZpZ3VyYXRpb24uZ2V0QmVIb3N0KCksICIxNzIuMjAuMzcuMjQ1Iik7CisJCWFzc2VydEVxdWFscyh0ZXN0Q29uZmlndXJhdGlvbi5nZXRCZVByb3RvY29sKCksICJodHRwIik7CisJCWFzc2VydEVxdWFscyh0ZXN0Q29uZmlndXJhdGlvbi5nZXRCZUNvbnRleHQoKSwgIi9zZGMvcmVzdC9jb25maWcvZ2V0Iik7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROb3RFeGlzdENvbmZpZ3VyYXRpb25GaWxlKCkgeworCisJCUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBjb25maWd1cmF0aW9uTGlzdGVuZXIgPSBuZXcgQ29uZmlndXJhdGlvbkxpc3RlbmVyKFRlc3RDb25maWd1cmF0aW9uLmNsYXNzLCBuZXcgRmlsZUNoYW5nZUNhbGxiYWNrKCkgeworCisJCQlwdWJsaWMgdm9pZCByZWNvbmZpZ3VyZShCYXNpY0NvbmZpZ3VyYXRpb24gb2JqKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCWxvZy5kZWJ1ZygiSW4gcmVjb25maWd1cmUgb2Yge30iLCBvYmopOworCQkJfQorCisJCX0pOworCisJCVRlc3ROb3RFeGlzdENvbmZpZ3VyYXRpb24gdGVzdENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uU291cmNlLmdldEFuZFdhdGNoQ29uZmlndXJhdGlvbihUZXN0Tm90RXhpc3RDb25maWd1cmF0aW9uLmNsYXNzLCBjb25maWd1cmF0aW9uTGlzdGVuZXIpOworCisJCWFzc2VydFRydWUodGVzdENvbmZpZ3VyYXRpb24gPT0gbnVsbCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb25maWd1cmF0aW9uRmlsZSgpIHsKKworCQlDb25maWd1cmF0aW9uTGlzdGVuZXIgY29uZmlndXJhdGlvbkxpc3RlbmVyID0gbmV3IENvbmZpZ3VyYXRpb25MaXN0ZW5lcihUZXN0Q29uZmlndXJhdGlvbi5jbGFzcywgbmV3IEZpbGVDaGFuZ2VDYWxsYmFjaygpIHsKKworCQkJcHVibGljIHZvaWQgcmVjb25maWd1cmUoQmFzaWNDb25maWd1cmF0aW9uIG9iaikgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCQlsb2cuZGVidWcoIkluIHJlY29uZmlndXJlIG9mIHt9Iiwgb2JqKTsKKwkJCQkvLyBhc3NlcnRFcXVhbHMoKChUZXN0Q29uZmlndXJhdGlvbilvYmopLmdldEJlU3NsUG9ydCgpLAorCQkJCS8vIDg0NDQpOworCisJCQkJLy8gYXNzZXJ0VHJ1ZSgoKFRlc3RDb25maWd1cmF0aW9uKW9iaikuZ2V0QmVTc2xQb3J0KCkgPT0KKwkJCQkvLyA4NDQ0KTsKKwkJCX0KKworCQl9KTsKKworCQlUZXN0Q29uZmlndXJhdGlvbiB0ZXN0Q29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25Tb3VyY2UuZ2V0QW5kV2F0Y2hDb25maWd1cmF0aW9uKFRlc3RDb25maWd1cmF0aW9uLmNsYXNzLCBjb25maWd1cmF0aW9uTGlzdGVuZXIpOworCisJCWFzc2VydFRydWUodGVzdENvbmZpZ3VyYXRpb24gIT0gbnVsbCk7CisJCWxvZy5kZWJ1Zygie30iLCB0ZXN0Q29uZmlndXJhdGlvbik7CisJCWFzc2VydEVxdWFscyh0ZXN0Q29uZmlndXJhdGlvbi5nZXRCZUhvc3QoKSwgIjE3Mi4yMC4zNy4yNDUiKTsKKwkJYXNzZXJ0RXF1YWxzKHRlc3RDb25maWd1cmF0aW9uLmdldEJlUHJvdG9jb2woKSwgImh0dHAiKTsKKwkJYXNzZXJ0RXF1YWxzKHRlc3RDb25maWd1cmF0aW9uLmdldEJlQ29udGV4dCgpLCAiL3NkYy9yZXN0L2NvbmZpZy9nZXQiKTsKKworCQkvLyB1cGRhdGVGaWxlQ29udGVudCgpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUZpbGVDb250ZW50KCkgeworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShFeHRlcm5hbENvbmZpZ3VyYXRpb24uZ2V0Q29uZmlnRGlyKCkgKyBGaWxlLnNlcGFyYXRvciArIEV4dGVybmFsQ29uZmlndXJhdGlvbi5nZXRBcHBOYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0LWNvbmZpZ3VyYXRpb24ueWFtbCIpOworCQlyZXBsYWNlRmlsZShmaWxlKTsKKworCQl0cnkgeworCQkJVGhyZWFkLnNsZWVwKDUwMDApOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVwbGFjZUZpbGUoRmlsZSBmMSkgeworCQlGaWxlUmVhZGVyIGZyID0gbnVsbDsKKwkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOworCQlGaWxlV3JpdGVyIGZ3ID0gbnVsbDsKKwkJQnVmZmVyZWRXcml0ZXIgb3V0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUxpc3Q8U3RyaW5nPiBsaW5lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJU3RyaW5nIGxpbmUgPSBudWxsOworCQkJZnIgPSBuZXcgRmlsZVJlYWRlcihmMSk7CisJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7CisJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJaWYgKGxpbmUuY29udGFpbnMoImJlU3NsUG9ydDogODQ0MyIpKQorCQkJCQlsaW5lID0gbGluZS5yZXBsYWNlKCI4NDQzIiwgIjg0NDQiKTsKKwkJCQlsaW5lcy5hZGQobGluZSk7CisJCQl9CisKKwkJCWZ3ID0gbmV3IEZpbGVXcml0ZXIoZjEpOworCQkJb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGZ3KTsKKwkJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykKKwkJCQlvdXQud3JpdGUocyArIE5FV19MSU5FKTsKKwkJCW91dC5mbHVzaCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQl9IGZpbmFsbHkgeworCisJCQlpZiAoYnIgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWJyLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQkJaWYgKGZyICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlmci5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmIChvdXQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCW91dC5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmIChmdyAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJZncuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWFkRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbkZpbGUoKSB7CisKKwkJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNvbmZpZ3VyYXRpb25MaXN0ZW5lciA9IG5ldyBDb25maWd1cmF0aW9uTGlzdGVuZXIoVGVzdENvbmZpZ3VyYXRpb24uY2xhc3MsIG5ldyBGaWxlQ2hhbmdlQ2FsbGJhY2soKSB7CisKKwkJCXB1YmxpYyB2b2lkIHJlY29uZmlndXJlKEJhc2ljQ29uZmlndXJhdGlvbiBvYmopIHsKKwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQkJbG9nLmRlYnVnKCJJbiByZWNvbmZpZ3VyZSBvZiAiLCBvYmopOworCQkJfQorCisJCX0pOworCisJCURpc3RyaWJ1dGlvbkVuZ2luZUNvbmZpZ3VyYXRpb24gZGVDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblNvdXJjZS5nZXRBbmRXYXRjaENvbmZpZ3VyYXRpb24oRGlzdHJpYnV0aW9uRW5naW5lQ29uZmlndXJhdGlvbi5jbGFzcywgY29uZmlndXJhdGlvbkxpc3RlbmVyKTsKKworCQlhc3NlcnRUcnVlKGRlQ29uZmlndXJhdGlvbiAhPSBudWxsKTsKKwkJbG9nLmRlYnVnKCJ7fSIsIGRlQ29uZmlndXJhdGlvbik7CisJCWFzc2VydEVxdWFscyhkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWUoKSwgIkFTREMtRElTVFItTk9USUYtVE9QSUMiKTsKKwkJYXNzZXJ0RXF1YWxzKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpY05hbWUoKSwgIkFTREMtRElTVFItU1RBVFVTLVRPUElDIik7CisKKwkJYXNzZXJ0RXF1YWxzKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpYygpLmdldENvbnN1bWVyR3JvdXAoKSwgImFzZGMiKTsKKwkJYXNzZXJ0RXF1YWxzKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpYygpLmdldENvbnN1bWVyR3JvdXAoKSwgImFzZGMiKTsKKwkJYXNzZXJ0RXF1YWxzKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpYygpLmdldEZldGNoVGltZVNlYygpLmludFZhbHVlKCksIDE1KTsKKwkJYXNzZXJ0RXF1YWxzKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXNUb3BpYygpLmdldFBvbGxpbmdJbnRlcnZhbFNlYygpLmludFZhbHVlKCksIDYwKTsKKworCQlhc3NlcnRFcXVhbHMoZGVDb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50cygpLnNpemUoKSwgMSk7CisJCWFzc2VydEVxdWFscyhkZUNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCksICJQUk9EIik7CisKKwkJYXNzZXJ0RXF1YWxzKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXMoKS5nZXRJbmZvKCksIG51bGwpOworCQlhc3NlcnRFcXVhbHMoZGVDb25maWd1cmF0aW9uLmdldERpc3RyaWJOb3RpZlJlc291cmNlQXJ0aWZhY3RUeXBlcygpLmdldExpZmVjeWNsZSgpLnNpemUoKSwgMik7CisJCWFzc2VydFRydWUoZGVDb25maWd1cmF0aW9uLmdldERpc3RyaWJOb3RpZlJlc291cmNlQXJ0aWZhY3RUeXBlcygpLmdldExpZmVjeWNsZSgpLmNvbnRhaW5zKCJIRUFUIikpOworCQlhc3NlcnRUcnVlKGRlQ29uZmlndXJhdGlvbi5nZXREaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXMoKS5nZXRMaWZlY3ljbGUoKS5jb250YWlucygiREdfWE1MIikpOworCisJCWFzc2VydEVxdWFscyhkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYk5vdGlmU2VydmljZUFydGlmYWN0VHlwZXMoKS5nZXRMaWZlY3ljbGUoKSwgbnVsbCk7CisJCWFzc2VydEVxdWFscyhkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYk5vdGlmU2VydmljZUFydGlmYWN0VHlwZXMoKS5nZXRJbmZvKCkuc2l6ZSgpLCAxKTsKKwkJYXNzZXJ0VHJ1ZShkZUNvbmZpZ3VyYXRpb24uZ2V0RGlzdHJpYk5vdGlmU2VydmljZUFydGlmYWN0VHlwZXMoKS5nZXRJbmZvKCkuY29udGFpbnMoIk1VUkFOTy1QS0ciKSk7CisKKwkJYXNzZXJ0RXF1YWxzKGRlQ29uZmlndXJhdGlvbi5nZXRVZWJQdWJsaWNLZXkoKSwgImZmZiIpOworCQlhc3NlcnRFcXVhbHMoZGVDb25maWd1cmF0aW9uLmdldFVlYlNlY3JldEtleSgpLCAiZmZmZiIpOworCQlhc3NlcnRFcXVhbHMoZGVDb25maWd1cmF0aW9uLmdldFVlYlNlcnZlcnMoKS5zaXplKCksIDMpOworCQlhc3NlcnRFcXVhbHMoZGVDb25maWd1cmF0aW9uLmdldEluaXRSZXRyeUludGVydmFsU2VjKCkuaW50VmFsdWUoKSwgNSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvWWFtbFRlc3QuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvWWFtbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBiY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdGVzdC9ZYW1sVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuWWFtbFRvT2JqZWN0Q29udmVydGVyOworCitwdWJsaWMgY2xhc3MgWWFtbFRlc3QgeworCisJcHJpdmF0ZSBzdGF0aWMgWWFtbFRvT2JqZWN0Q29udmVydGVyIHlhbWxUb09iamVjdENvbnZlcnRlcjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdmFsaWRZYW1sID0gImhlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yM1xyXG5kZXNjcmlwdGlvbjogQSBsb2FkLWJhbGFuY2VyIHNlcnZlclxyXG5wYXJhbWV0ZXJzOlxyXG4gIGltYWdlOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlZCBmb3Igc2VydmVyc1xyXG4gIGtleV9uYW1lOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogU1NIIGtleSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXJzXHJcbiAgZmxhdm9yOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHVzZWQgYnkgdGhlIHNlcnZlcnNcclxuICBwb29sX2lkOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogUG9vbCB0byBjb250YWN0XHJcbiAgdXNlcl9kYXRhOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogU2VydmVyIHVzZXJfZGF0YVxyXG4gIG1ldGFkYXRhOlxyXG4gICAgdHlwZToganNvblxyXG4gIG5ldHdvcms6XHJcbiAgICB0eXBlOiBzdHJpbmdcclxuICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIHVzZWQgYnkgdGhlIHNlcnZlclxyXG5cclxucmVzb3VyY2VzOlxyXG4gIHNlcnZlcjpcclxuICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJcclxuICAgIHByb3BlcnRpZXM6XHJcbiAgICAgIGZsYXZvcjoge2dldF9wYXJhbTogZmxhdm9yfVxyXG4gICAgICBpbWFnZToge2dldF9wYXJhbTogaW1hZ2V9XHJcbiAgICAgIGtleV9uYW1lOiB7Z2V0X3BhcmFtOiBrZXlfbmFtZX1cclxuICAgICAgbWV0YWRhdGE6IHtnZXRfcGFyYW06IG1ldGFkYXRhfVxyXG4gICAgICB1c2VyX2RhdGE6IHtnZXRfcGFyYW06IHVzZXJfZGF0YX1cclxuICAgICAgdXNlcl9kYXRhX2Zvcm1hdDogUkFXXHJcbiAgICAgIG5ldHdvcmtzOiBbe25ldHdvcms6IHtnZXRfcGFyYW06IG5ldHdvcmt9IH1dXHJcbiAgbWVtYmVyOlxyXG4gICAgdHlwZTogT1M6Ok5ldXRyb246OlBvb2xNZW1iZXJcclxuICAgIHByb3BlcnRpZXM6XHJcbiAgICAgIHBvb2xfaWQ6IHtnZXRfcGFyYW06IHBvb2xfaWR9XHJcbiAgICAgIGFkZHJlc3M6IHtnZXRfYXR0cjogW3NlcnZlciwgZmlyc3RfYWRkcmVzc119XHJcbiAgICAgIHByb3RvY29sX3BvcnQ6IDgwXHJcblxyXG5vdXRwdXRzOlxyXG4gIHNlcnZlcl9pcDpcclxuICAgIGRlc2NyaXB0aW9uOiBJUCBBZGRyZXNzIG9mIHRoZSBsb2FkLWJhbGFuY2VkIHNlcnZlci5cclxuICAgIHZhbHVlOiB7IGdldF9hdHRyOiBbc2VydmVyLCBmaXJzdF9hZGRyZXNzXSB9XHJcbiAgbGJfbWVtYmVyOlxyXG4gICAgZGVzY3JpcHRpb246IExCIG1lbWJlciBkZXRhaWxzLlxyXG4gICAgdmFsdWU6IHsgZ2V0X2F0dHI6IFttZW1iZXIsIHNob3ddIH0iOworCS8vIE1pc3Npbmcgc3F1YXJlIGJyYWNrZXRzIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGludmFsaWRZYW1sID0gImhlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yM1xyXG5kZXNjcmlwdGlvbjogQSBsb2FkLWJhbGFuY2VyIHNlcnZlclxyXG5wYXJhbWV0ZXJzOlxyXG4gIGltYWdlOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlZCBmb3Igc2VydmVyc1xyXG4gIGtleV9uYW1lOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogU1NIIGtleSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXJzXHJcbiAgZmxhdm9yOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHVzZWQgYnkgdGhlIHNlcnZlcnNcclxuICBwb29sX2lkOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogUG9vbCB0byBjb250YWN0XHJcbiAgdXNlcl9kYXRhOlxyXG4gICAgdHlwZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogU2VydmVyIHVzZXJfZGF0YVxyXG4gIG1ldGFkYXRhOlxyXG4gICAgdHlwZToganNvblxyXG4gIG5ldHdvcms6XHJcbiAgICB0eXBlOiBzdHJpbmdcclxuICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIHVzZWQgYnkgdGhlIHNlcnZlclxyXG5cclxucmVzb3VyY2VzOlxyXG4gIHNlcnZlcjpcclxuICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJcclxuICAgIHByb3BlcnRpZXM6XHJcbiAgICAgIGZsYXZvcjoge2dldF9wYXJhbTogZmxhdm9yfVxyXG4gICAgICBpbWFnZToge2dldF9wYXJhbTogaW1hZ2V9XHJcbiAgICAgIGtleV9uYW1lOiB7Z2V0X3BhcmFtOiBrZXlfbmFtZX1cclxuICAgICAgbWV0YWRhdGE6IHtnZXRfcGFyYW06IG1ldGFkYXRhfVxyXG4gICAgICB1c2VyX2RhdGE6IHtnZXRfcGFyYW06IHVzZXJfZGF0YX1cclxuICAgICAgdXNlcl9kYXRhX2Zvcm1hdDogUkFXXHJcbiAgICAgIG5ldHdvcmtzOiBbe25ldHdvcms6IHtnZXRfcGFyYW06IG5ldHdvcmt9IH1dXHJcbiAgbWVtYmVyOlxyXG4gICAgdHlwZTogT1M6Ok5ldXRyb246OlBvb2xNZW1iZXJcclxuICAgIHByb3BlcnRpZXM6XHJcbiAgICAgIHBvb2xfaWQ6IHtnZXRfcGFyYW06IHBvb2xfaWR9XHJcbiAgICAgIGFkZHJlc3M6IHtnZXRfYXR0cjogW3NlcnZlciwgZmlyc3RfYWRkcmVzc119XHJcbiAgICAgIHByb3RvY29sX3BvcnQ6IDgwXHJcblxyXG5vdXRwdXRzOlxyXG4gIHNlcnZlcl9pcDpcclxuICAgIGRlc2NyaXB0aW9uOiBJUCBBZGRyZXNzIG9mIHRoZSBsb2FkLWJhbGFuY2VkIHNlcnZlci5cclxuICAgIHZhbHVlOiB7IGdldF9hdHRyOiBbc2VydmVyLCBmaXJzdF9hZGRyZXNzXSB9XHJcbiAgbGJfbWVtYmVyOlxyXG4gICAgZGVzY3JpcHRpb246IExCIG1lbWJlciBkZXRhaWxzLlxyXG4gICAgdmFsdWU6IHsgZ2V0X2F0dHI6IFttZW1iZXIsIHNob3d9IjsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHsKKwkJeWFtbFRvT2JqZWN0Q29udmVydGVyID0gbmV3IFlhbWxUb09iamVjdENvbnZlcnRlcigpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkWWFtbCgpIHsKKwkJYXNzZXJ0VHJ1ZSh5YW1sVG9PYmplY3RDb252ZXJ0ZXIuaXNWYWxpZFlhbWwodmFsaWRZYW1sLmdldEJ5dGVzKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkWWFtbCgpIHsKKwkJYXNzZXJ0RmFsc2UoeWFtbFRvT2JqZWN0Q29udmVydGVyLmlzVmFsaWRZYW1sKGludmFsaWRZYW1sLmdldEJ5dGVzKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZFlhbWxCYXNlNjQoKSB7CisJCWFzc2VydFRydWUoeWFtbFRvT2JqZWN0Q29udmVydGVyLmlzVmFsaWRZYW1sKEJhc2U2NC5lbmNvZGVCYXNlNjQodmFsaWRZYW1sLmdldEJ5dGVzKCkpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFlhbWxCYXNlNjQoKSB7CisJCWFzc2VydEZhbHNlKHlhbWxUb09iamVjdENvbnZlcnRlci5pc1ZhbGlkWWFtbChCYXNlNjQuZW5jb2RlQmFzZTY0KGludmFsaWRZYW1sLmdldEJ5dGVzKCkpKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdGVzdC9jb25maWcvVGVzdENvbmZpZ3VyYXRpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvY29uZmlnL1Rlc3RDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiZjM5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvY29uZmlnL1Rlc3RDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jb21tb24udGVzdC5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5CYXNpY0NvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0Q29uZmlndXJhdGlvbiBleHRlbmRzIEJhc2ljQ29uZmlndXJhdGlvbiB7CisKKwkvKioKKwkgKiBiYWNrZW5kIGhvc3QKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBiZUhvc3Q7CisJLyoqCisJICogYmFja2VuZCBodHRwIHBvcnQKKwkgKi8KKwlwcml2YXRlIEludGVnZXIgYmVIdHRwUG9ydDsKKwkvKioKKwkgKiBiYWNrZW5kIGh0dHAgc2VjdXJlZCBwb3J0CisJICovCisJcHJpdmF0ZSBJbnRlZ2VyIGJlU3NsUG9ydDsKKwkvKioKKwkgKiBiZSBodHRwIGNvbnRleHQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBiZUNvbnRleHQ7CisJLyoqCisJICogYmFja2VuZCBwcm90b2NvbC4gaHR0cCB8IGh0dHBzCisJICovCisJcHJpdmF0ZSBTdHJpbmcgYmVQcm90b2NvbCA9ICJodHRwIjsKKworCXByaXZhdGUgRGF0ZSByZWxlYXNlZDsKKwlwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gIjExMTEiOworCXByaXZhdGUgVGVzdENvbm5lY3Rpb24gY29ubmVjdGlvbjsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBwcm90b2NvbHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJzOworCisJcHVibGljIERhdGUgZ2V0UmVsZWFzZWQoKSB7CisJCXJldHVybiByZWxlYXNlZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlbGVhc2VkKERhdGUgcmVsZWFzZWQpIHsKKwkJdGhpcy5yZWxlYXNlZCA9IHJlbGVhc2VkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgVGVzdENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKKwkJcmV0dXJuIGNvbm5lY3Rpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbihUZXN0Q29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisJCXRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm90b2NvbHMoKSB7CisJCXJldHVybiBwcm90b2NvbHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvdG9jb2xzKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMpIHsKKwkJdGhpcy5wcm90b2NvbHMgPSBwcm90b2NvbHM7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0VXNlcnMoKSB7CisJCXJldHVybiB1c2VyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJzKSB7CisJCXRoaXMudXNlcnMgPSB1c2VyczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEJlSG9zdCgpIHsKKwkJcmV0dXJuIGJlSG9zdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZUhvc3QoU3RyaW5nIGJlSG9zdCkgeworCQl0aGlzLmJlSG9zdCA9IGJlSG9zdDsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRCZUh0dHBQb3J0KCkgeworCQlyZXR1cm4gYmVIdHRwUG9ydDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZUh0dHBQb3J0KEludGVnZXIgYmVIdHRwUG9ydCkgeworCQl0aGlzLmJlSHR0cFBvcnQgPSBiZUh0dHBQb3J0OworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEJlU3NsUG9ydCgpIHsKKwkJcmV0dXJuIGJlU3NsUG9ydDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZVNzbFBvcnQoSW50ZWdlciBiZVNzbFBvcnQpIHsKKwkJdGhpcy5iZVNzbFBvcnQgPSBiZVNzbFBvcnQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRCZUNvbnRleHQoKSB7CisJCXJldHVybiBiZUNvbnRleHQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmVDb250ZXh0KFN0cmluZyBiZUNvbnRleHQpIHsKKwkJdGhpcy5iZUNvbnRleHQgPSBiZUNvbnRleHQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRCZVByb3RvY29sKCkgeworCQlyZXR1cm4gYmVQcm90b2NvbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZVByb3RvY29sKFN0cmluZyBiZVByb3RvY29sKSB7CisJCXRoaXMuYmVQcm90b2NvbCA9IGJlUHJvdG9jb2w7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKGZvcm1hdCgiYmFja2VuZCBob3N0OiAlc1xuIiwgYmVIb3N0KSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiYmFja2VuZCBodHRwIHBvcnQ6ICVzXG4iLCBiZUh0dHBQb3J0KSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiYmFja2VuZCBzc2wgcG9ydDogJXNcbiIsIGJlU3NsUG9ydCkpLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgY29udGV4dDogJXNcbiIsIGJlQ29udGV4dCkpCisJCQkJLmFwcGVuZChmb3JtYXQoImJhY2tlbmQgcHJvdG9jb2w6ICVzXG4iLCBiZVByb3RvY29sKSkuYXBwZW5kKGZvcm1hdCgiVmVyc2lvbjogJXNcbiIsIHZlcnNpb24pKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJSZWxlYXNlZDogJXNcbiIsIHJlbGVhc2VkKSkuYXBwZW5kKGZvcm1hdCgiQ29ubmVjdGluZyB0byBkYXRhYmFzZTogJXNcbiIsIGNvbm5lY3Rpb24pKQorCQkJCS5hcHBlbmQoZm9ybWF0KCJTdXBwb3J0ZWQgcHJvdG9jb2xzOiAlc1xuIiwgcHJvdG9jb2xzKSkuYXBwZW5kKGZvcm1hdCgiVXNlcnM6ICVzXG4iLCB1c2VycykpLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jb21tb24vdGVzdC9jb25maWcvVGVzdENvbm5lY3Rpb24uamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvY29uZmlnL1Rlc3RDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1NDZmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvY29uZmlnL1Rlc3RDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi50ZXN0LmNvbmZpZzsKKworcHVibGljIGNsYXNzIFRlc3RDb25uZWN0aW9uIHsKKworCXByaXZhdGUgU3RyaW5nIHVybDsKKwlwcml2YXRlIGludCBwb29sU2l6ZTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworCQlyZXR1cm4gdXJsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisJCXRoaXMudXJsID0gdXJsOworCX0KKworCXB1YmxpYyBpbnQgZ2V0UG9vbFNpemUoKSB7CisJCXJldHVybiBwb29sU2l6ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQb29sU2l6ZShpbnQgcG9vbFNpemUpIHsKKwkJdGhpcy5wb29sU2l6ZSA9IHBvb2xTaXplOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCInJXMnIHdpdGggcG9vbCBvZiAlZCIsIGdldFVybCgpLCBnZXRQb29sU2l6ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90ZXN0L2NvbmZpZy9UZXN0Tm90RXhpc3RDb25maWd1cmF0aW9uLmphdmEgYi9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi90ZXN0L2NvbmZpZy9UZXN0Tm90RXhpc3RDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmNjk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3Rlc3QvY29uZmlnL1Rlc3ROb3RFeGlzdENvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnRlc3QuY29uZmlnOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmFwaS5CYXNpY0NvbmZpZ3VyYXRpb247CisKK3B1YmxpYyBjbGFzcyBUZXN0Tm90RXhpc3RDb25maWd1cmF0aW9uIGV4dGVuZHMgQmFzaWNDb25maWd1cmF0aW9uIHsKKworCS8qKgorCSAqIGJhY2tlbmQgaG9zdAorCSAqLworCXByaXZhdGUgU3RyaW5nIGJlSG9zdDsKKwkvKioKKwkgKiBiYWNrZW5kIGh0dHAgcG9ydAorCSAqLworCXByaXZhdGUgSW50ZWdlciBiZUh0dHBQb3J0OworCisJLyoqCisJICogYmFja2VuZCBodHRwIHNlY3VyZWQgcG9ydAorCSAqLworCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKGZvcm1hdCgiYmFja2VuZCBob3N0OiAlc1xuIiwgYmVIb3N0KSkKKwkJCQkuYXBwZW5kKGZvcm1hdCgiYmFja2VuZCBodHRwIHBvcnQ6ICVzXG4iLCBiZUh0dHBQb3J0KSkudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1N0cmVhbVV0aWxzVGVzdHMuamF2YSBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY29tbW9uL3V0aWwvU3RyZWFtVXRpbHNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGM1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NvbW1vbi91dGlsL1N0cmVhbVV0aWxzVGVzdHMuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLnV0aWwuU3RyZWFtVXRpbHM7CisKK2ltcG9ydCBmai5kYXRhLkVpdGhlcjsKKworcHVibGljIGNsYXNzIFN0cmVhbVV0aWxzVGVzdHMgeworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRha2VXaGlsZVByZWRpY2F0ZU5vdE1ldCgpIHsKKwkJTGlzdDxFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4+IGxpc3QgPSBidWlsZExpc3RXaXRoMTBJbnRlZ2VycygpOworCisJCWFzc2VydFRydWUoU3RyZWFtVXRpbHMudGFrZVdoaWxlKGxpc3Quc3RyZWFtKCksIHAgLT4gcC5pc0xlZnQoKSkuY291bnQoKSA9PSAxMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VGFrZVdoaWxlUHJlZGljYXRlSXNNZXQoKSB7CisJCUxpc3Q8RWl0aGVyPEludGVnZXIsIEJvb2xlYW4+PiBsaXN0ID0gYnVpbGRMaXN0V2l0aDEwSW50ZWdlcnMoKTsKKwkJYWRkVG9Cb29sZWFuc1RvTGlzdChsaXN0KTsKKworCQlmaW5hbCBTdHJlYW08RWl0aGVyPEludGVnZXIsIEJvb2xlYW4+PiB0YWtlV2hpbGVTdHJlYW0gPSBTdHJlYW1VdGlscy50YWtlV2hpbGUobGlzdC5zdHJlYW0oKSwgcCAtPiBwLmlzTGVmdCgpKTsKKwkJYXNzZXJ0VHJ1ZSh0YWtlV2hpbGVTdHJlYW0uZmlsdGVyKHAgLT4gcC5pc1JpZ2h0KCkpLmNvdW50KCkgPT0gMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgPFQ+IHZvaWQgdGVzdFRha2VFcnJvckV2YWxPbmx5T25jZSgpIHsKKwkJTGlzdDxJbnRlZ2VyPiBidWNrZXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJLy8gQVBJCisJCUZ1bmN0aW9uPEludGVnZXIsIEVpdGhlcjxJbnRlZ2VyLCBCb29sZWFuPj4gY29ucyA9IG51bSAtPiB7CisJCQlFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4gcmV0OworCQkJYnVja2V0LmFkZChudW0pOworCQkJaWYgKG51bSA+IDUpIHsKKwkJCQlyZXQgPSBFaXRoZXIucmlnaHQoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSBFaXRoZXIubGVmdChudW0pOworCQkJfQorCQkJOworCQkJcmV0dXJuIHJldDsKKwkJfTsKKworCQlMaXN0PEludGVnZXI+IG51bTF0bzEwID0gQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCk7CisJCVN0cmVhbTxFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4+IHN0cmVhbUVpdGhlcnMgPSBudW0xdG8xMC5zdHJlYW0oKS5tYXAoZSAtPiBjb25zLmFwcGx5KGUpKTsKKwkJTGlzdDxFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4+IGNvbGxlY3QgPSBTdHJlYW1VdGlscy50YWtlV2hpbGVQbHVzT25lTm9FdmFsKHN0cmVhbUVpdGhlcnMsIGUgLT4gZS5pc0xlZnQoKSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJYXNzZXJ0VHJ1ZShidWNrZXQuc2l6ZSgpIDw9IDYpOworCQlhc3NlcnRUcnVlKGNvbGxlY3Quc2l6ZSgpIDw9IDYpOworCQlhc3NlcnRUcnVlKGNvbGxlY3Quc3RyZWFtKCkuZmlsdGVyKGUgLT4gZS5pc1JpZ2h0KCkpLmNvdW50KCkgPT0gMSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUYWtlV2hpbGVQbHVzT25lUHJlZGljYXRlTm90TWV0KCkgeworCQlMaXN0PEVpdGhlcjxJbnRlZ2VyLCBCb29sZWFuPj4gbGlzdCA9IGJ1aWxkTGlzdFdpdGgxMEludGVnZXJzKCk7CisKKwkJYXNzZXJ0VHJ1ZShTdHJlYW1VdGlscy50YWtlV2hpbGVQbHVzT25lKGxpc3Quc3RyZWFtKCksIHAgLT4gcC5pc0xlZnQoKSkuY291bnQoKSA9PSAxMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VGFrZVdoaWxlUGx1c09uZVByZWRpY2F0ZUlzTWV0KCkgeworCQlMaXN0PEVpdGhlcjxJbnRlZ2VyLCBCb29sZWFuPj4gbGlzdCA9IGJ1aWxkTGlzdFdpdGgxMEludGVnZXJzKCk7CisJCWFkZFRvQm9vbGVhbnNUb0xpc3QobGlzdCk7CisKKwkJZmluYWwgU3RyZWFtPEVpdGhlcjxJbnRlZ2VyLCBCb29sZWFuPj4gdGFrZVdoaWxlUGx1c09uZVN0cmVhbSA9IFN0cmVhbVV0aWxzLnRha2VXaGlsZVBsdXNPbmUobGlzdC5zdHJlYW0oKSwKKwkJCQlwIC0+IHAuaXNMZWZ0KCkpOworCQlhc3NlcnRUcnVlKHRha2VXaGlsZVBsdXNPbmVTdHJlYW0uZmlsdGVyKHAgLT4gcC5pc1JpZ2h0KCkpLmNvdW50KCkgPT0gMSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFRvQm9vbGVhbnNUb0xpc3QoTGlzdDxFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4+IGxpc3QpIHsKKwkJbGlzdC5hZGQoRWl0aGVyLnJpZ2h0KGZhbHNlKSk7CisJCWxpc3QuYWRkKEVpdGhlci5yaWdodChmYWxzZSkpOworCX0KKworCXByaXZhdGUgTGlzdDxFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4+IGJ1aWxkTGlzdFdpdGgxMEludGVnZXJzKCkgeworCQlMaXN0PEVpdGhlcjxJbnRlZ2VyLCBCb29sZWFuPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWxpc3QuYWRkKEVpdGhlci5sZWZ0KGkpKTsKKwkJfQorCQlyZXR1cm4gbGlzdDsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG15VGVzdCgpIHsKKwkJTGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWxpc3QuYWRkKGkpOworCQl9CisKKwkJTGlzdDxFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4+IGNvbnRhaW5lciA9IG5ldyBBcnJheUxpc3Q8RWl0aGVyPEludGVnZXIsIEJvb2xlYW4+PigpOworCQlsaXN0LnN0cmVhbSgpLm1hcChlIC0+IG15QnVzaW5lc3NMb2dpYyhlLCBjb250YWluZXIpKS5maWx0ZXIocCAtPiBwLmlzUmlnaHQoKSkuZmluZEFueSgpOworCQkvLyBBY3R1YWwgUmVzdWx0cyBhcmUgaW4gY29udGFpbmVyCisJCWFzc2VydFRydWUoY29udGFpbmVyLnNpemUoKSA9PSA2KTsKKworCX0KKworCXByaXZhdGUgRWl0aGVyPEludGVnZXIsIEJvb2xlYW4+IG15QnVzaW5lc3NMb2dpYyhpbnQgZSwgTGlzdDxFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4+IGNvYnRhaW5lckxpc3QpIHsKKwkJRWl0aGVyPEludGVnZXIsIEJvb2xlYW4+IGVpdGhlckVsZW1lbnQgPSBzaW1pbHV0ZURCQWNjZXNzKGUpOworCQkvLyBLZWVwIFRoZSByZXN1bHRzIGluIGV4dGVybmFsIExpc3QKKwkJY29idGFpbmVyTGlzdC5hZGQoZWl0aGVyRWxlbWVudCk7CisKKwkJcmV0dXJuIGVpdGhlckVsZW1lbnQ7CisJfQorCisJcHJpdmF0ZSBFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4gc2ltaWx1dGVEQkFjY2VzcyhpbnQgZSkgeworCQlFaXRoZXI8SW50ZWdlciwgQm9vbGVhbj4gZWl0aGVyRWxlbWVudDsKKwkJaWYgKGUgPCA1KSB7CisJCQkvLyBEQiBTdWNjZXNzCisJCQllaXRoZXJFbGVtZW50ID0gRWl0aGVyLmxlZnQoZSk7CisJCX0gZWxzZSB7CisJCQkvLyBEQiBGYWlsCisJCQllaXRoZXJFbGVtZW50ID0gRWl0aGVyLnJpZ2h0KHRydWUpOworCQl9CisJCXJldHVybiBlaXRoZXJFbGVtZW50OworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY29tbW9uL2Rpc3RyaWJ1dGlvbi1lbmdpbmUtY29uZmlndXJhdGlvbi55YW1sIGIvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZy9jb21tb24vZGlzdHJpYnV0aW9uLWVuZ2luZS1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjZTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY29tbW9uL2Rpc3RyaWJ1dGlvbi1lbmdpbmUtY29uZmlndXJhdGlvbi55YW1sCkBAIC0wLDAgKzEsMzUgQEAKK3VlYlNlcnZlcnM6CisgICAtIHVlYi5mcWRuLjE6ODg4OAorICAgLSB1ZWIuZnFkbi4yOjg4ODgKKyAgIC0gdWViLmZxZG4uMzo4ODg4CisKK3VlYlB1YmxpY0tleTogZmZmCisKK3VlYlNlY3JldEtleTogZmZmZgorCitkaXN0cmlidXRpb25Ob3RpZlRvcGljTmFtZTogQVNEQy1ESVNUUi1OT1RJRi1UT1BJQworZGlzdHJpYnV0aW9uU3RhdHVzVG9waWNOYW1lOiBBU0RDLURJU1RSLVNUQVRVUy1UT1BJQworCitpbml0UmV0cnlJbnRlcnZhbFNlYzogNQoraW5pdE1heEludGVydmFsU2VjOiA2MAorCitkaXN0cmliTm90aWZTZXJ2aWNlQXJ0aWZhY3RUeXBlczoKKyAgaW5mbzoKKyAgICAgIC0gTVVSQU5PLVBLRworCitkaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXM6CisgIGxpZmVjeWNsZToKKyAgICAgIC0gSEVBVAorICAgICAgLSBER19YTUwKKworZW52aXJvbm1lbnRzOgorICAgLSBQUk9ECisKK2Rpc3RyaWJ1dGlvblN0YXR1c1RvcGljOgorICAgcG9sbGluZ0ludGVydmFsU2VjOiA2MAorICAgZmV0Y2hUaW1lU2VjOiAxNQorICAgY29uc3VtZXJHcm91cDogYXNkYworCitjcmVhdGVUb3BpYzoKKyAgIHBhcnRpdGlvbkNvdW50OiAxCisgICByZXBsaWNhdGlvbkNvdW50OiAxCmRpZmYgLS1naXQgYS9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NvbW1vbi90ZXN0LWNvbmZpZ3VyYXRpb24ueWFtbCBiL2NvbW1vbi1hcHAtYXBpL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWcvY29tbW9uL3Rlc3QtY29uZmlndXJhdGlvbi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTEyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlnL2NvbW1vbi90ZXN0LWNvbmZpZ3VyYXRpb24ueWFtbApAQCAtMCwwICsxLDM1IEBACisjIGNhdGFsb2cgYmFja2VuZCBob3N0bmFtZQorYmVIb3N0OiAxNzIuMjAuMzcuMjQ1CisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgcG9ydAorYmVIdHRwUG9ydDogODA4MAorCisjIGNhdGFsb2cgYmFja2VuZCBodHRwIGNvbnRleHQKK2JlQ29udGV4dDogL3NkYy9yZXN0L2NvbmZpZy9nZXQKKworIyBjYXRhbG9nIGJhY2tlbmQgcHJvdG9jb2wKK2JlUHJvdG9jb2w6IGh0dHAKKworIyBjYXRhbG9nIGJhY2tlbmQgc3NsIHBvcnQKK2JlU3NsUG9ydDogODQ0NAorCit2ZXJzaW9uOiAxLjAKK3JlbGVhc2VkOiAyMDEyLTExLTMwCisKKyMgQ29ubmVjdGlvbiBwYXJhbWV0ZXJzCitjb25uZWN0aW9uOgorICAgIHVybDogamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2L2RiCisgICAgcG9vbFNpemU6IDE3CisKKyMgUHJvdG9jb2xzCitwcm90b2NvbHM6CisgICAtIGh0dHAKKyAgIC0gaHR0cHMKKworIyBVc2VycwordXNlcnM6CisgICAgdG9tOiBwYXNzd2QKKyAgICBib2I6IHBhc3N3ZAorICAgIAorICAgIAorICAgIApkaWZmIC0tZ2l0IGEvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWwgYi9jb21tb24tYXBwLWFwaS9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nYmFjay10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI5YmZmCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWFwcC1hcGkvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2JhY2stdGVzdC54bWwKQEAgLTAsMCArMSwxMyBAQAorPCEtLSBvbmx5IG9uZSBsaW5lLCBzaHV0IHVwIGxvZ2JhY2sgISAtLT4KKzxjb25maWd1cmF0aW9uPgorICAgIDxhcHBlbmRlciBuYW1lPSJTVERPVVQiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLkNvbnNvbGVBcHBlbmRlciI+CisgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgPFBhdHRlcm4+CisgICAgICAgICAgICAgICAgJWR7eXl5eS1NTS1kZCBISDptbTpzc30gWyV0aHJlYWRdICUtNWxldmVsICVsb2dnZXJ7MzZ9IC0gJW1zZyVuCisgICAgICAgICAgICA8L1BhdHRlcm4+CisgICAgICAgIDwvZW5jb2Rlcj4KKyAgICA8L2FwcGVuZGVyPgorICAgIDxyb290IGxldmVsPSJPRkYiPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iU1RET1VUIiAvPgorICAgIDwvcm9vdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24tYmUvLmdpdGlnbm9yZSBiL2NvbW1vbi1iZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOGM0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisvdGFyZ2V0CmRpZmYgLS1naXQgYS9jb21tb24tYmUvcG9tLnhtbCBiL2NvbW1vbi1iZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjdlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvcG9tLnhtbApAQCAtMCwwICsxLDExNiBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYy5iZTwvZ3JvdXBJZD4KKwk8YXJ0aWZhY3RJZD5jb21tb24tYmU8L2FydGlmYWN0SWQ+CisJCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNkYy1tYWluPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCisJPHByb3BlcnRpZXM+CisJCTxhc3BlY3RqLnZlcnNpb24+MS43LjQ8L2FzcGVjdGoudmVyc2lvbj4KKwkJPGhpYmVybmF0ZS12YWxpZGF0b3IudmVyc2lvbj41LjMuNC5GaW5hbDwvaGliZXJuYXRlLXZhbGlkYXRvci52ZXJzaW9uPgorCQk8Z3Jvb3Z5LnZlcnNpb24+Mi4zLjU8L2dyb292eS52ZXJzaW9uPgorCQk8bHVjZW5lLnZlcnNpb24+NC4xMC4yPC9sdWNlbmUudmVyc2lvbj4KKwkJPG1vY2tpdG8udmVyc2lvbj4xLjkuMDwvbW9ja2l0by52ZXJzaW9uPgorCQk8cmVnZXgudmVyc2lvbj4zLjAuMzwvcmVnZXgudmVyc2lvbj4KKwkJPGNvZGVoYXVzLmphY2tzb24uY29yZT4xLjkuMjwvY29kZWhhdXMuamFja3Nvbi5jb3JlPgorCTwvcHJvcGVydGllcz4KKworCisJPGRlcGVuZGVuY2llcz4KKwkJPCEtLSBDb21tb24gb2YgU0QmQyAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbi1hcHAtYXBpPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHtjb21tb24tYXBwLWFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmxvZ2JhY2stY2xhc3NpYzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmUtYXNsPC9hcnRpZmFjdElkPgorIAkJCTx2ZXJzaW9uPiR7Y29kZWhhdXMuamFja3Nvbi5jb3JlfTwvdmVyc2lvbj4KKyAJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2d1YXZhLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSBURVNUICAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJCisJPC9kZXBlbmRlbmNpZXM+CisJPGJ1aWxkPgorCQk8cGx1Z2luTWFuYWdlbWVudD4KKwkJCTxwbHVnaW5zPgorCQkJCTwhLS1UaGlzIHBsdWdpbidzIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCB0byBzdG9yZSBFY2xpcHNlIG0yZSBzZXR0aW5ncyAKKwkJCQkJb25seS4gSXQgaGFzIG5vIGluZmx1ZW5jZSBvbiB0aGUgTWF2ZW4gYnVpbGQgaXRzZWxmLiAtLT4KKwkJCQk8cGx1Z2luPgorCQkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5tMmU8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPmxpZmVjeWNsZS1tYXBwaW5nPC9hcnRpZmFjdElkPgorCQkJCQk8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKwkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQk8bGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgorCQkJCQkJCTxwbHVnaW5FeGVjdXRpb25zPgorCQkJCQkJCQk8cGx1Z2luRXhlY3V0aW9uPgorCQkJCQkJCQkJPHBsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKwkJCQkJCQkJCQk8Z3JvdXBJZD5mci5mYXN0Y29ubmVjdDwvZ3JvdXBJZD4KKwkJCQkJCQkJCQk8YXJ0aWZhY3RJZD5wbGFudHVtbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJCQkJCQkJPHZlcnNpb25SYW5nZT5bMS4wLjAsKTwvdmVyc2lvblJhbmdlPgorCQkJCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJCQkJPGdvYWw+cGxhbnQ8L2dvYWw+CisJCQkJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQkJCTwvcGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorCQkJCQkJCQkJPGFjdGlvbj4KKwkJCQkJCQkJCQk8aWdub3JlIC8+CisJCQkJCQkJCQk8L2FjdGlvbj4KKwkJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb24+CisJCQkJCQkJPC9wbHVnaW5FeGVjdXRpb25zPgorCQkJCQkJPC9saWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQk8L3BsdWdpbj4KKworCQkJCTxwbHVnaW4+CisJCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCTxza2lwPnRydWU8L3NraXA+CisJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQk8L3BsdWdpbj4KKwkJCTwvcGx1Z2lucz4KKwkJPC9wbHVnaW5NYW5hZ2VtZW50PgorCTwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvY2F0ZWdvcnkvQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2NhdGVnb3J5L0NhdGVnb3J5RGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQ3MjFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2NhdGVnb3J5L0NhdGVnb3J5RGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jYXRlZ29yeTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyODgyMzUyMDYwMjQyNzE0NDI3TDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplZE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gaWNvbnM7CisKKwlwdWJsaWMgQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpIHsKKworCX0KKworCXB1YmxpYyBDYXRlZ29yeURhdGFEZWZpbml0aW9uKENhdGVnb3J5RGF0YURlZmluaXRpb24gYykgeworCQl0aGlzLm5hbWUgPSBjLm5hbWU7CisJCXRoaXMubm9ybWFsaXplZE5hbWUgPSBjLm5vcm1hbGl6ZWROYW1lOworCQl0aGlzLnVuaXF1ZUlkID0gYy51bmlxdWVJZDsKKwkJdGhpcy5pY29ucyA9IGMuaWNvbnM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROb3JtYWxpemVkTmFtZSgpIHsKKwkJcmV0dXJuIG5vcm1hbGl6ZWROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vcm1hbGl6ZWROYW1lKFN0cmluZyBub3JtYWxpemVkTmFtZSkgeworCQl0aGlzLm5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplZE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJY29ucygpIHsKKwkJcmV0dXJuIGljb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldEljb25zKExpc3Q8U3RyaW5nPiBpY29ucykgeworCQl0aGlzLmljb25zID0gaWNvbnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobm9ybWFsaXplZE5hbWUgPT0gbnVsbCkgPyAwIDogbm9ybWFsaXplZE5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1bmlxdWVJZCA9PSBudWxsKSA/IDAgOiB1bmlxdWVJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGljb25zID09IG51bGwpID8gMCA6IGljb25zLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlDYXRlZ29yeURhdGFEZWZpbml0aW9uIG90aGVyID0gKENhdGVnb3J5RGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobm9ybWFsaXplZE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm5vcm1hbGl6ZWROYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFub3JtYWxpemVkTmFtZS5lcXVhbHMob3RoZXIubm9ybWFsaXplZE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodW5pcXVlSWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVuaXF1ZUlkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF1bmlxdWVJZC5lcXVhbHMob3RoZXIudW5pcXVlSWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaWNvbnMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmljb25zICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFpY29ucy5lcXVhbHMob3RoZXIuaWNvbnMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNhdGVnb3J5RGF0YURlZmluaXRpb24gW25hbWU9IiArIG5hbWUgKyAiLCBub3JtYWxpemVkTmFtZT0iICsgbm9ybWFsaXplZE5hbWUgKyAiLCB1bmlxdWVJZD0iICsgdW5pcXVlSWQKKwkJCQkrICIsIGljb25zPSIgKyBpY29ucyArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9jYXRlZ29yeS9Hcm91cGluZ0RhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvY2F0ZWdvcnkvR3JvdXBpbmdEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTI0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvY2F0ZWdvcnkvR3JvdXBpbmdEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNhdGVnb3J5OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK3B1YmxpYyBjbGFzcyBHcm91cGluZ0RhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNjQxNDc1OTI5MTQ4ODQzODQ5TDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplZE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwdWJsaWMgR3JvdXBpbmdEYXRhRGVmaW5pdGlvbigpIHsKKworCX0KKworCXB1YmxpYyBHcm91cGluZ0RhdGFEZWZpbml0aW9uKEdyb3VwaW5nRGF0YURlZmluaXRpb24gYykgeworCQl0aGlzLm5hbWUgPSBjLm5hbWU7CisJCXRoaXMubm9ybWFsaXplZE5hbWUgPSBjLm5vcm1hbGl6ZWROYW1lOworCQl0aGlzLnVuaXF1ZUlkID0gYy51bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vcm1hbGl6ZWROYW1lKCkgeworCQlyZXR1cm4gbm9ybWFsaXplZE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9ybWFsaXplZE5hbWUoU3RyaW5nIG5vcm1hbGl6ZWROYW1lKSB7CisJCXRoaXMubm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVkTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChub3JtYWxpemVkTmFtZSA9PSBudWxsKSA/IDAgOiBub3JtYWxpemVkTmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHVuaXF1ZUlkID09IG51bGwpID8gMCA6IHVuaXF1ZUlkLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlHcm91cGluZ0RhdGFEZWZpbml0aW9uIG90aGVyID0gKEdyb3VwaW5nRGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobm9ybWFsaXplZE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm5vcm1hbGl6ZWROYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFub3JtYWxpemVkTmFtZS5lcXVhbHMob3RoZXIubm9ybWFsaXplZE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodW5pcXVlSWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVuaXF1ZUlkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF1bmlxdWVJZC5lcXVhbHMob3RoZXIudW5pcXVlSWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkdyb3VwaW5nRGF0YURlZmluaXRpb24gW25hbWU9IiArIG5hbWUgKyAiLCBub3JtYWxpemVkTmFtZT0iICsgbm9ybWFsaXplZE5hbWUgKyAiLCB1bmlxdWVJZD0iICsgdW5pcXVlSWQKKwkJCQkrICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9jYXRlZ29yeS9TdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvY2F0ZWdvcnkvU3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzRmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvY2F0ZWdvcnkvU3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNhdGVnb3J5OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4Mjc5Mzk3OTg4NDk3MDg2Njc2TDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplZE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gaWNvbnM7CisKKwlwdWJsaWMgU3ViQ2F0ZWdvcnlEYXRhRGVmaW5pdGlvbigpIHsKKworCX0KKworCXB1YmxpYyBTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uKFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gYykgeworCQl0aGlzLm5hbWUgPSBjLm5hbWU7CisJCXRoaXMubm9ybWFsaXplZE5hbWUgPSBjLm5vcm1hbGl6ZWROYW1lOworCQl0aGlzLnVuaXF1ZUlkID0gYy51bmlxdWVJZDsKKwkJdGhpcy5pY29ucyA9IGMuaWNvbnM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROb3JtYWxpemVkTmFtZSgpIHsKKwkJcmV0dXJuIG5vcm1hbGl6ZWROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vcm1hbGl6ZWROYW1lKFN0cmluZyBub3JtYWxpemVkTmFtZSkgeworCQl0aGlzLm5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplZE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJY29ucygpIHsKKwkJcmV0dXJuIGljb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldEljb25zKExpc3Q8U3RyaW5nPiBpY29ucykgeworCQl0aGlzLmljb25zID0gaWNvbnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobm9ybWFsaXplZE5hbWUgPT0gbnVsbCkgPyAwIDogbm9ybWFsaXplZE5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1bmlxdWVJZCA9PSBudWxsKSA/IDAgOiB1bmlxdWVJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGljb25zID09IG51bGwpID8gMCA6IGljb25zLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlTdWJDYXRlZ29yeURhdGFEZWZpbml0aW9uIG90aGVyID0gKFN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobm9ybWFsaXplZE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLm5vcm1hbGl6ZWROYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFub3JtYWxpemVkTmFtZS5lcXVhbHMob3RoZXIubm9ybWFsaXplZE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodW5pcXVlSWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVuaXF1ZUlkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF1bmlxdWVJZC5lcXVhbHMob3RoZXIudW5pcXVlSWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaWNvbnMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmljb25zICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFpY29ucy5lcXVhbHMob3RoZXIuaWNvbnMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlN1YkNhdGVnb3J5RGF0YURlZmluaXRpb24gW25hbWU9IiArIG5hbWUgKyAiLCBub3JtYWxpemVkTmFtZT0iICsgbm9ybWFsaXplZE5hbWUgKyAiLCB1bmlxdWVJZD0iCisJCQkJKyB1bmlxdWVJZCArICIsIGljb25zPSIgKyBpY29ucyArICJdIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvY29tcG9uZW50cy9Db21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvY29tcG9uZW50cy9Db21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmN2EyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9jb21wb25lbnRzL0NvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTExNDc3MDEyNjA4NjI2MzU1Mkw7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7IC8vIGFyY2hpdmVOYW1lCisKKwlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOyAvLyBhcmNoaXZlVmVyc2lvbgorCisJcHJpdmF0ZSBCb29sZWFuIGlzSGlnaGVzdFZlcnNpb247CisKKwlwcml2YXRlIExvbmcgY3JlYXRpb25EYXRlOworCisJcHJpdmF0ZSBMb25nIGxhc3RVcGRhdGVEYXRlOworCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwcml2YXRlIFN0cmluZyBzdGF0ZTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHRhZ3M7CisKKwlwcml2YXRlIFN0cmluZyBpY29uOworCisJcHJpdmF0ZSBTdHJpbmcgVVVJRDsKKworCXByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZWROYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgc3lzdGVtTmFtZTsKKworCXByaXZhdGUgU3RyaW5nIGNvbnRhY3RJZDsKKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBhbGxWZXJzaW9uczsKKworCXByaXZhdGUgQm9vbGVhbiBpc0RlbGV0ZWQ7CisKKwlwcml2YXRlIFN0cmluZyBwcm9qZWN0Q29kZTsKKworCXByaXZhdGUgU3RyaW5nIGNzYXJVVUlEOworCisJcHJpdmF0ZSBTdHJpbmcgY3NhclZlcnNpb247CisKKwlwcml2YXRlIFN0cmluZyBpbXBvcnRlZFRvc2NhQ2hlY2tzdW07CisKKwlwcml2YXRlIFN0cmluZyBpbnZhcmlhbnRVVUlEOworCisJcHVibGljIENvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24oKSB7CisKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbihDb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uIG90aGVyKSB7CisJCXRoaXMudW5pcXVlSWQgPSBvdGhlci5nZXRVbmlxdWVJZCgpOworCQl0aGlzLm5hbWUgPSBvdGhlci5nZXROYW1lKCk7CisJCXRoaXMudmVyc2lvbiA9IG90aGVyLmdldFZlcnNpb24oKTsKKwkJdGhpcy5pc0hpZ2hlc3RWZXJzaW9uID0gb3RoZXIuaXNIaWdoZXN0VmVyc2lvbigpOworCQl0aGlzLmNyZWF0aW9uRGF0ZSA9IG90aGVyLmdldENyZWF0aW9uRGF0ZSgpOworCQl0aGlzLmxhc3RVcGRhdGVEYXRlID0gb3RoZXIuZ2V0TGFzdFVwZGF0ZURhdGUoKTsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IG90aGVyLmdldERlc2NyaXB0aW9uKCk7CisJCXRoaXMuc3RhdGUgPSBvdGhlci5nZXRTdGF0ZSgpOworCQl0aGlzLnRhZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ob3RoZXIuZ2V0VGFncygpKTsKKwkJdGhpcy5pY29uID0gb3RoZXIuZ2V0SWNvbigpOworCQl0aGlzLmNvbnRhY3RJZCA9IG90aGVyLmdldENvbnRhY3RJZCgpOworCQl0aGlzLlVVSUQgPSBvdGhlci5nZXRVVUlEKCk7CisJCXRoaXMubm9ybWFsaXplZE5hbWUgPSBvdGhlci5nZXROb3JtYWxpemVkTmFtZSgpOworCQl0aGlzLnN5c3RlbU5hbWUgPSBvdGhlci5nZXRTeXN0ZW1OYW1lKCk7CisJCXRoaXMuYWxsVmVyc2lvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4ob3RoZXIuZ2V0QWxsVmVyc2lvbnMoKSk7CisJCXRoaXMuaXNEZWxldGVkID0gb3RoZXIuaXNEZWxldGVkKCk7CisJCXRoaXMucHJvamVjdENvZGUgPSBvdGhlci5nZXRQcm9qZWN0Q29kZSgpOworCQl0aGlzLmNzYXJVVUlEID0gb3RoZXIuZ2V0Q3NhclVVSUQoKTsKKwkJdGhpcy5jc2FyVmVyc2lvbiA9IG90aGVyLmNzYXJWZXJzaW9uOworCQl0aGlzLmltcG9ydGVkVG9zY2FDaGVja3N1bSA9IG90aGVyLmdldEltcG9ydGVkVG9zY2FDaGVja3N1bSgpOworCQl0aGlzLmludmFyaWFudFVVSUQgPSBvdGhlci5nZXRJbnZhcmlhbnRVVUlEKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJcHVibGljIEJvb2xlYW4gaXNIaWdoZXN0VmVyc2lvbigpIHsKKwkJcmV0dXJuIGlzSGlnaGVzdFZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0SGlnaGVzdFZlcnNpb24oQm9vbGVhbiBpc0hpZ2hlc3RWZXJzaW9uKSB7CisJCXRoaXMuaXNIaWdoZXN0VmVyc2lvbiA9IGlzSGlnaGVzdFZlcnNpb247CisJfQorCisJcHVibGljIExvbmcgZ2V0Q3JlYXRpb25EYXRlKCkgeworCQlyZXR1cm4gY3JlYXRpb25EYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShMb25nIGNyZWF0aW9uRGF0ZSkgeworCQl0aGlzLmNyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRMYXN0VXBkYXRlRGF0ZSgpIHsKKwkJcmV0dXJuIGxhc3RVcGRhdGVEYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVEYXRlKExvbmcgbGFzdFVwZGF0ZURhdGUpIHsKKwkJdGhpcy5sYXN0VXBkYXRlRGF0ZSA9IGxhc3RVcGRhdGVEYXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisJCXJldHVybiBzdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGF0ZShTdHJpbmcgc3RhdGUpIHsKKwkJdGhpcy5zdGF0ZSA9IHN0YXRlOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VGFncygpIHsKKwkJcmV0dXJuIHRhZ3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFncyhMaXN0PFN0cmluZz4gdGFncykgeworCQl0aGlzLnRhZ3MgPSB0YWdzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKKwkJcmV0dXJuIGljb247CisJfQorCisJcHVibGljIHZvaWQgc2V0SWNvbihTdHJpbmcgaWNvbikgeworCQl0aGlzLmljb24gPSBpY29uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFjdElkKCkgeworCQlyZXR1cm4gY29udGFjdElkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnRhY3RJZChTdHJpbmcgY29udGFjdElkKSB7CisJCXRoaXMuY29udGFjdElkID0gY29udGFjdElkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VVVJRCgpIHsKKwkJcmV0dXJuIFVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VVVJRChTdHJpbmcgdVVJRCkgeworCQlVVUlEID0gdVVJRDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vcm1hbGl6ZWROYW1lKCkgeworCQlyZXR1cm4gbm9ybWFsaXplZE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9ybWFsaXplZE5hbWUoU3RyaW5nIG5vcm1hbGl6ZWROYW1lKSB7CisJCXRoaXMubm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVkTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbU5hbWUoKSB7CisJCXJldHVybiBzeXN0ZW1OYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN5c3RlbU5hbWUoU3RyaW5nIHN5c3RlbU5hbWUpIHsKKwkJdGhpcy5zeXN0ZW1OYW1lID0gc3lzdGVtTmFtZTsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBbGxWZXJzaW9ucygpIHsKKwkJcmV0dXJuIGFsbFZlcnNpb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFsbFZlcnNpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsVmVyc2lvbnMpIHsKKwkJdGhpcy5hbGxWZXJzaW9ucyA9IGFsbFZlcnNpb25zOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SW52YXJpYW50VVVJRCgpIHsKKwkJcmV0dXJuIGludmFyaWFudFVVSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW52YXJpYW50VVVJRChTdHJpbmcgaW52YXJpYW50VVVJRCkgeworCQl0aGlzLmludmFyaWFudFVVSUQgPSBpbnZhcmlhbnRVVUlEOworCX0KKworCXB1YmxpYyBCb29sZWFuIGlzRGVsZXRlZCgpIHsKKwkJcmV0dXJuIGlzRGVsZXRlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJc0RlbGV0ZWQoQm9vbGVhbiBpc0RlbGV0ZWQpIHsKKwkJdGhpcy5pc0RlbGV0ZWQgPSBpc0RlbGV0ZWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcm9qZWN0Q29kZSgpIHsKKwkJcmV0dXJuIHByb2plY3RDb2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb2plY3RDb2RlKFN0cmluZyBwcm9qZWN0Q29kZSkgeworCQl0aGlzLnByb2plY3RDb2RlID0gcHJvamVjdENvZGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDc2FyVVVJRCgpIHsKKwkJcmV0dXJuIGNzYXJVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldENzYXJVVUlEKFN0cmluZyBjc2FyVVVJRCkgeworCQl0aGlzLmNzYXJVVUlEID0gY3NhclVVSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDc2FyVmVyc2lvbigpIHsKKwkJcmV0dXJuIGNzYXJWZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldENzYXJWZXJzaW9uKFN0cmluZyBjc2FyVmVyc2lvbikgeworCQl0aGlzLmNzYXJWZXJzaW9uID0gY3NhclZlcnNpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbXBvcnRlZFRvc2NhQ2hlY2tzdW0oKSB7CisJCXJldHVybiBpbXBvcnRlZFRvc2NhQ2hlY2tzdW07CisJfQorCisJcHVibGljIHZvaWQgc2V0SW1wb3J0ZWRUb3NjYUNoZWNrc3VtKFN0cmluZyBpbXBvcnRlZFRvc2NhQ2hlY2tzdW0pIHsKKwkJdGhpcy5pbXBvcnRlZFRvc2NhQ2hlY2tzdW0gPSBpbXBvcnRlZFRvc2NhQ2hlY2tzdW07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJDb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBuYW1lPSIgKyBuYW1lICsgIiwgdmVyc2lvbj0iICsgdmVyc2lvbgorCQkJCSsgIiwgaXNIaWdoZXN0VmVyc2lvbj0iICsgaXNIaWdoZXN0VmVyc2lvbiArICIsIGNyZWF0aW9uRGF0ZT0iICsgY3JlYXRpb25EYXRlICsgIiwgbGFzdFVwZGF0ZURhdGU9IgorCQkJCSsgbGFzdFVwZGF0ZURhdGUgKyAiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24gKyAiLCBzdGF0ZT0iICsgc3RhdGUgKyAiLCB0YWdzPSIgKyB0YWdzICsgIiwgaWNvbj0iCisJCQkJKyBpY29uICsgIiwgVVVJRD0iICsgVVVJRCArICIsIG5vcm1hbGl6ZWROYW1lPSIgKyBub3JtYWxpemVkTmFtZSArICIsIHN5c3RlbU5hbWU9IiArIHN5c3RlbU5hbWUKKwkJCQkrICIsIGNvbnRhY3RJZD0iICsgY29udGFjdElkICsgIiwgYWxsVmVyc2lvbnM9IiArIGFsbFZlcnNpb25zICsgIiwgaXNEZWxldGVkPSIgKyBpc0RlbGV0ZWQKKwkJCQkrICIsIHByb2plY3RDb2RlPSIgKyBwcm9qZWN0Q29kZSArICIsIGNzYXJVVUlEPSIgKyBjc2FyVVVJRCArICIsIGNzYXJ2ZXJzaW9uPSIgKyBjc2FyVmVyc2lvbgorCQkJCSsgIiwgaW1wb3J0ZWRUb3NjYUNoZWNrc3VtPSIgKyBpbXBvcnRlZFRvc2NhQ2hlY2tzdW0gKyAiLCBpbnZhcmlhbnRVVUlEPSIgKyBpbnZhcmlhbnRVVUlEICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKFVVSUQgPT0gbnVsbCkgPyAwIDogVVVJRC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGFsbFZlcnNpb25zID09IG51bGwpID8gMCA6IGFsbFZlcnNpb25zLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29udGFjdElkID09IG51bGwpID8gMCA6IGNvbnRhY3RJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGNyZWF0aW9uRGF0ZSA9PSBudWxsKSA/IDAgOiBjcmVhdGlvbkRhdGUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChkZXNjcmlwdGlvbiA9PSBudWxsKSA/IDAgOiBkZXNjcmlwdGlvbi5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGljb24gPT0gbnVsbCkgPyAwIDogaWNvbi5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGlzRGVsZXRlZCA9PSBudWxsKSA/IDAgOiBpc0RlbGV0ZWQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpc0hpZ2hlc3RWZXJzaW9uID09IG51bGwpID8gMCA6IGlzSGlnaGVzdFZlcnNpb24uaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChsYXN0VXBkYXRlRGF0ZSA9PSBudWxsKSA/IDAgOiBsYXN0VXBkYXRlRGF0ZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5hbWUgPT0gbnVsbCkgPyAwIDogbmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5vcm1hbGl6ZWROYW1lID09IG51bGwpID8gMCA6IG5vcm1hbGl6ZWROYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoc3RhdGUgPT0gbnVsbCkgPyAwIDogc3RhdGUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChzeXN0ZW1OYW1lID09IG51bGwpID8gMCA6IHN5c3RlbU5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh0YWdzID09IG51bGwpID8gMCA6IHRhZ3MuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1bmlxdWVJZCA9PSBudWxsKSA/IDAgOiB1bmlxdWVJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHZlcnNpb24gPT0gbnVsbCkgPyAwIDogdmVyc2lvbi5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHByb2plY3RDb2RlID09IG51bGwpID8gMCA6IHByb2plY3RDb2RlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY3NhclVVSUQgPT0gbnVsbCkgPyAwIDogY3NhclVVSUQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChjc2FyVmVyc2lvbiA9PSBudWxsKSA/IDAgOiBjc2FyVmVyc2lvbi5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGltcG9ydGVkVG9zY2FDaGVja3N1bSA9PSBudWxsKSA/IDAgOiBpbXBvcnRlZFRvc2NhQ2hlY2tzdW0uaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnZhcmlhbnRVVUlEID09IG51bGwpID8gMCA6IGludmFyaWFudFVVSUQuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCUNvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gb3RoZXIgPSAoQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgb2JqOworCQlpZiAoVVVJRCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuVVVJRCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghVVVJRC5lcXVhbHMob3RoZXIuVVVJRCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhbGxWZXJzaW9ucyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuYWxsVmVyc2lvbnMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWFsbFZlcnNpb25zLmVxdWFscyhvdGhlci5hbGxWZXJzaW9ucykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjb250YWN0SWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmNvbnRhY3RJZCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghY29udGFjdElkLmVxdWFscyhvdGhlci5jb250YWN0SWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoY3JlYXRpb25EYXRlID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jcmVhdGlvbkRhdGUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNyZWF0aW9uRGF0ZS5lcXVhbHMob3RoZXIuY3JlYXRpb25EYXRlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5kZXNjcmlwdGlvbiAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghZGVzY3JpcHRpb24uZXF1YWxzKG90aGVyLmRlc2NyaXB0aW9uKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGljb24gPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmljb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWljb24uZXF1YWxzKG90aGVyLmljb24pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaXNEZWxldGVkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5pc0RlbGV0ZWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWlzRGVsZXRlZC5lcXVhbHMob3RoZXIuaXNEZWxldGVkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGlzSGlnaGVzdFZlcnNpb24gPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmlzSGlnaGVzdFZlcnNpb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWlzSGlnaGVzdFZlcnNpb24uZXF1YWxzKG90aGVyLmlzSGlnaGVzdFZlcnNpb24pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobGFzdFVwZGF0ZURhdGUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmxhc3RVcGRhdGVEYXRlICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFsYXN0VXBkYXRlRGF0ZS5lcXVhbHMob3RoZXIubGFzdFVwZGF0ZURhdGUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChub3JtYWxpemVkTmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubm9ybWFsaXplZE5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIW5vcm1hbGl6ZWROYW1lLmVxdWFscyhvdGhlci5ub3JtYWxpemVkTmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChzdGF0ZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuc3RhdGUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXN0YXRlLmVxdWFscyhvdGhlci5zdGF0ZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChzeXN0ZW1OYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5zeXN0ZW1OYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFzeXN0ZW1OYW1lLmVxdWFscyhvdGhlci5zeXN0ZW1OYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHRhZ3MgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnRhZ3MgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXRhZ3MuZXF1YWxzKG90aGVyLnRhZ3MpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodW5pcXVlSWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVuaXF1ZUlkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF1bmlxdWVJZC5lcXVhbHMob3RoZXIudW5pcXVlSWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudmVyc2lvbiAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghdmVyc2lvbi5lcXVhbHMob3RoZXIudmVyc2lvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwcm9qZWN0Q29kZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucHJvamVjdENvZGUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXByb2plY3RDb2RlLmVxdWFscyhvdGhlci5wcm9qZWN0Q29kZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjc2FyVVVJRCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY3NhclVVSUQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNzYXJVVUlELmVxdWFscyhvdGhlci5jc2FyVVVJRCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjc2FyVmVyc2lvbiA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY3NhclZlcnNpb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNzYXJWZXJzaW9uLmVxdWFscyhvdGhlci5jc2FyVmVyc2lvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChpbXBvcnRlZFRvc2NhQ2hlY2tzdW0gPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmltcG9ydGVkVG9zY2FDaGVja3N1bSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaW1wb3J0ZWRUb3NjYUNoZWNrc3VtLmVxdWFscyhvdGhlci5pbXBvcnRlZFRvc2NhQ2hlY2tzdW0pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaW52YXJpYW50VVVJRCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuaW52YXJpYW50VVVJRCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaW52YXJpYW50VVVJRC5lcXVhbHMob3RoZXIuaW52YXJpYW50VVVJRCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9jb21wb25lbnRzL1Jlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2NvbXBvbmVudHMvUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViNWUyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9jb21wb25lbnRzL1Jlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZVR5cGVFbnVtOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTQyOTczNTI4NjQzNzU4NDgxTDsKKworCXByaXZhdGUgU3RyaW5nIHZlbmRvck5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdmVuZG9yUmVsZWFzZTsKKwlwcml2YXRlIFJlc291cmNlVHlwZUVudW0gcmVzb3VyY2VUeXBlID0gUmVzb3VyY2VUeXBlRW51bS5WRkM7IC8vIFJlc291cmNlVHlwZS5WRkMKKwkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKKwkJCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAorCXByaXZhdGUgQm9vbGVhbiBpc0Fic3RyYWN0OworCXByaXZhdGUgU3RyaW5nIGNvc3Q7CisJcHJpdmF0ZSBTdHJpbmcgbGljZW5zZVR5cGU7CisJcHJpdmF0ZSBTdHJpbmcgdG9zY2FSZXNvdXJjZU5hbWU7CisKKwlwdWJsaWMgUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZU1ldGFkYXRhRGF0YURlZmluaXRpb24oUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uIG90aGVyKSB7CisJCXN1cGVyKG90aGVyKTsKKwkJdGhpcy52ZW5kb3JOYW1lID0gb3RoZXIuZ2V0VmVuZG9yTmFtZSgpOworCQl0aGlzLnZlbmRvclJlbGVhc2UgPSBvdGhlci5nZXRWZW5kb3JSZWxlYXNlKCk7CisJCXRoaXMuaXNBYnN0cmFjdCA9IG90aGVyLmlzSGlnaGVzdFZlcnNpb24oKTsKKwkJdGhpcy5yZXNvdXJjZVR5cGUgPSBvdGhlci5nZXRSZXNvdXJjZVR5cGUoKTsKKwkJdGhpcy50b3NjYVJlc291cmNlTmFtZSA9IG90aGVyLmdldFRvc2NhUmVzb3VyY2VOYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gdmVuZG9yTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZyB2ZW5kb3JOYW1lKSB7CisJCXRoaXMudmVuZG9yTmFtZSA9IHZlbmRvck5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZW5kb3JSZWxlYXNlKCkgeworCQlyZXR1cm4gdmVuZG9yUmVsZWFzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JSZWxlYXNlKFN0cmluZyB2ZW5kb3JSZWxlYXNlKSB7CisJCXRoaXMudmVuZG9yUmVsZWFzZSA9IHZlbmRvclJlbGVhc2U7CisJfQorCisJcHVibGljIFJlc291cmNlVHlwZUVudW0gZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSkgeworCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBpc0Fic3RyYWN0KCkgeworCQlyZXR1cm4gaXNBYnN0cmFjdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBYnN0cmFjdChCb29sZWFuIGlzQWJzdHJhY3QpIHsKKwkJdGhpcy5pc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvc3QoKSB7CisJCXJldHVybiBjb3N0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENvc3QoU3RyaW5nIGNvc3QpIHsKKwkJdGhpcy5jb3N0ID0gY29zdDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2VUeXBlKCkgeworCQlyZXR1cm4gbGljZW5zZVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGljZW5zZVR5cGUoU3RyaW5nIGxpY2Vuc2VUeXBlKSB7CisJCXRoaXMubGljZW5zZVR5cGUgPSBsaWNlbnNlVHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRvc2NhUmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gdG9zY2FSZXNvdXJjZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VG9zY2FSZXNvdXJjZU5hbWUoU3RyaW5nIHRvc2NhUmVzb3VyY2VOYW1lKSB7CisJCXRoaXMudG9zY2FSZXNvdXJjZU5hbWUgPSB0b3NjYVJlc291cmNlTmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBbdmVuZG9yTmFtZT0iICsgdmVuZG9yTmFtZSArICIsIHZlbmRvclJlbGVhc2U9IiArIHZlbmRvclJlbGVhc2UKKwkJCQkrICIsIHJlc291cmNlVHlwZT0iICsgcmVzb3VyY2VUeXBlICsgIiwgaXNBYnN0cmFjdD0iICsgaXNBYnN0cmFjdCArIHN1cGVyLnRvU3RyaW5nKCkgKyAiXSI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSBzdXBlci5oYXNoQ29kZSgpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29zdCA9PSBudWxsKSA/IDAgOiBjb3N0Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaXNBYnN0cmFjdCA9PSBudWxsKSA/IDAgOiBpc0Fic3RyYWN0Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobGljZW5zZVR5cGUgPT0gbnVsbCkgPyAwIDogbGljZW5zZVR5cGUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChyZXNvdXJjZVR5cGUgPT0gbnVsbCkgPyAwIDogcmVzb3VyY2VUeXBlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodmVuZG9yTmFtZSA9PSBudWxsKSA/IDAgOiB2ZW5kb3JOYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodmVuZG9yUmVsZWFzZSA9PSBudWxsKSA/IDAgOiB2ZW5kb3JSZWxlYXNlLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJUmVzb3VyY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uIG90aGVyID0gKFJlc291cmNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbikgb2JqOworCQlpZiAoY29zdCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY29zdCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghY29zdC5lcXVhbHMob3RoZXIuY29zdCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChpc0Fic3RyYWN0ID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5pc0Fic3RyYWN0ICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFpc0Fic3RyYWN0LmVxdWFscyhvdGhlci5pc0Fic3RyYWN0KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGxpY2Vuc2VUeXBlID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5saWNlbnNlVHlwZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbGljZW5zZVR5cGUuZXF1YWxzKG90aGVyLmxpY2Vuc2VUeXBlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHJlc291cmNlVHlwZSAhPSBvdGhlci5yZXNvdXJjZVR5cGUpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh2ZW5kb3JOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci52ZW5kb3JOYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF2ZW5kb3JOYW1lLmVxdWFscyhvdGhlci52ZW5kb3JOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHZlbmRvclJlbGVhc2UgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnZlbmRvclJlbGVhc2UgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHRvc2NhUmVzb3VyY2VOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci50b3NjYVJlc291cmNlTmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghdmVuZG9yUmVsZWFzZS5lcXVhbHMob3RoZXIudmVuZG9yUmVsZWFzZSkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2NvbXBvbmVudHMvU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24uamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9jb21wb25lbnRzL1NlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViYmFkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9jb21wb25lbnRzL1NlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5jb21wb25lbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBleHRlbmRzIENvbXBvbmVudE1ldGFkYXRhRGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2NjEwMDE4OTI1MDk0MzUxMjBMOworCisJcHJpdmF0ZSBTdHJpbmcgZGlzdHJpYnV0aW9uU3RhdHVzOworCisJcHVibGljIFNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbihTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBvdGhlcikgeworCQlzdXBlcihvdGhlcik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREaXN0cmlidXRpb25TdGF0dXMoKSB7CisJCXJldHVybiBkaXN0cmlidXRpb25TdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0aW9uU3RhdHVzKFN0cmluZyBkaXN0cmlidXRpb25TdGF0dXMpIHsKKwkJdGhpcy5kaXN0cmlidXRpb25TdGF0dXMgPSBkaXN0cmlidXRpb25TdGF0dXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBbIGRpc3RyaWJ1dGlvblN0YXR1cz0iICsgZGlzdHJpYnV0aW9uU3RhdHVzICsgIiwgcGFyZW50PSIKKwkJCQkrIHN1cGVyLnRvU3RyaW5nKCkgKyAiXSI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSBzdXBlci5oYXNoQ29kZSgpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZGlzdHJpYnV0aW9uU3RhdHVzID09IG51bGwpID8gMCA6IGRpc3RyaWJ1dGlvblN0YXR1cy5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDb21wb25lbnRNZXRhZGF0YURhdGFEZWZpbml0aW9uKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghc3VwZXIuZXF1YWxzKG9iaikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24gb3RoZXIgPSAoU2VydmljZU1ldGFkYXRhRGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKGRpc3RyaWJ1dGlvblN0YXR1cyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuZGlzdHJpYnV0aW9uU3RhdHVzICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFkaXN0cmlidXRpb25TdGF0dXMuZXF1YWxzKG90aGVyLmRpc3RyaWJ1dGlvblN0YXR1cykpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9BZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDYyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworcHVibGljIGNsYXNzIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU2NTM2NTcyODUxNjkwMTY3MEw7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXByaXZhdGUgTG9uZyBjcmVhdGlvblRpbWU7CisKKwlwcml2YXRlIExvbmcgbW9kaWZpY2F0aW9uVGltZTsKKworCXByaXZhdGUgSW50ZWdlciBsYXN0Q3JlYXRlZENvdW50ZXIgPSAwOworCisJcHVibGljIEFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24oKSB7CisKKwl9CisKKwlwdWJsaWMgQWRkaXRpb25hbEluZm9QYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbihBZGRpdGlvbmFsSW5mb1BhcmFtZXRlckRhdGFEZWZpbml0aW9uIHApIHsKKwkJdGhpcy51bmlxdWVJZCA9IHAudW5pcXVlSWQ7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gcC5jcmVhdGlvblRpbWU7CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IHAubW9kaWZpY2F0aW9uVGltZTsKKwkJdGhpcy5sYXN0Q3JlYXRlZENvdW50ZXIgPSBwLmxhc3RDcmVhdGVkQ291bnRlcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisJCXJldHVybiBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKExvbmcgY3JlYXRpb25UaW1lKSB7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBMb25nIGdldE1vZGlmaWNhdGlvblRpbWUoKSB7CisJCXJldHVybiBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblRpbWUoTG9uZyBtb2RpZmljYXRpb25UaW1lKSB7CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0TGFzdENyZWF0ZWRDb3VudGVyKCkgeworCQlyZXR1cm4gbGFzdENyZWF0ZWRDb3VudGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RDcmVhdGVkQ291bnRlcihJbnRlZ2VyIGxhc3RDcmVhdGVkQ291bnRlcikgeworCQl0aGlzLmxhc3RDcmVhdGVkQ291bnRlciA9IGxhc3RDcmVhdGVkQ291bnRlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkFkZGl0aW9uYWxJbmZvUGFyYW1ldGVyRGF0YURlZmluaXRpb24gW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIGNyZWF0aW9uVGltZT0iICsgY3JlYXRpb25UaW1lCisJCQkJKyAiLCBtb2RpZmljYXRpb25UaW1lPSIgKyBtb2RpZmljYXRpb25UaW1lICsgIiwgbGFzdENyZWF0ZWRDb3VudGVyPSIgKyBsYXN0Q3JlYXRlZENvdW50ZXIgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQXJ0aWZhY3REYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0FydGlmYWN0RGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmFmMDllCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0FydGlmYWN0RGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU4NyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgY2xhc3MgQXJ0aWZhY3REYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTY5MTM0MzA5MDc1NDA4Mzk0MUw7CisKKwkvKioKKwkgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBhcnRpZmFjdAorCSAqLworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJLyoqCisJICogVG9zY2EgbG9naWNhbCBuYW1lCisJICovCisJLy8gcHJpdmF0ZSBTdHJpbmcgbG9naWNhbE5hbWU7CisKKwkvKiogVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoaXMgYXJ0aWZhY3QuICovCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RUeXBlOworCisJLyoqIFNwZWNpZmllcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBhcnRpZmFjdC4gdXJpIHRvIHRoZSBTV0lGVCAqLworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0UmVmOworCisJLyoqIFNwZWNpZmllcyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBhcnRpZmFjdC4gKi8KKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdE5hbWU7CisKKwkvKioKKwkgKiBOb24gVE9TQ0EgY29tcGxpYW50IHByb3BlcnR5CisJICovCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RSZXBvc2l0b3J5OworCisJLyoqCisJICogQ2hlY2tzdW0gdmFsdWUgb2YgdGhlIHVwbG9hZGVkIGFydGlmYWN0IGZpbGUgcmV0cmlldmVkIGZyb20gIkNvbnRlbnQtTUQ1Ij8KKwkgKiBoZWFkZXIgb2YgdGhlIEhUVFAgUE9TVC9QVVQgcmVxdWVzdC4gU2hvdWxkIGJlIHVwZGF0ZWQgZWFjaCB0aW1lIHdoZW4gdGhlCisJICogYXJ0aWZhY3QgZmlsZSBpcyB1cGRhdGVkLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0Q2hlY2tzdW07CisKKwkvKioKKwkgKiBhcnRpZmFjdCBjcmVhdG9yCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdXNlcklkQ3JlYXRvcjsKKworCS8qKgorCSAqIFVTRVIgSUQgb2YgdGhlIGxhc3QgcmVzb3VyY2UgKGFydGlmYWN0KSB1cGRhdGVyCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdXNlcklkTGFzdFVwZGF0ZXI7CisKKwkvKioKKwkgKiBGdWxsIG5hbWUgb2YgYXJ0aWZhY3QgY3JlYXRvcgorCSAqLworCXByaXZhdGUgU3RyaW5nIGNyZWF0b3JGdWxsTmFtZTsKKworCS8qKgorCSAqIEZ1bGwgbmFtZSBvZiB0aGUgbGFzdCByZXNvdXJjZSAoYXJ0aWZhY3QpIHVwZGF0ZXIKKwkgKi8KKwlwcml2YXRlIFN0cmluZyB1cGRhdGVyRnVsbE5hbWU7CisKKwkvKioKKwkgKiBUaW1lc3RhbXAgb2YgdGhlIHJlc291cmNlIChhcnRpZmFjdCkgY3JlYXRpb24KKwkgKi8KKwlwcml2YXRlIExvbmcgY3JlYXRpb25EYXRlOworCisJLyoqCisJICogVGltZXN0YW1wIG9mIHRoZSBsYXN0IHJlc291cmNlIChhcnRpZmFjdCkgY3JlYXRpb24KKwkgKi8KKwlwcml2YXRlIExvbmcgbGFzdFVwZGF0ZURhdGU7CisKKwkvKioKKwkgKiBJZCBvZiBhcnRpZmFjdCBkYXRhIGluIEVTCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZXNJZDsKKworCS8qKgorCSAqIExvZ2ljYWwgYXJ0aWZhY3QgbmFtZS4gVXNlZCBieSBUT1NDQQorCSAqLworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0TGFiZWw7CisKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdENyZWF0b3I7CisKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXByaXZhdGUgQm9vbGVhbiBtYW5kYXRvcnkgPSBCb29sZWFuLkZBTFNFOworCisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3REaXNwbGF5TmFtZTsKKworCXByaXZhdGUgU3RyaW5nIGFwaVVybDsKKworCXByaXZhdGUgQm9vbGVhbiBzZXJ2aWNlQXBpID0gQm9vbGVhbi5GQUxTRTsKKwkKKwkvKioKKwkgKiBGbGFnIHRoYXQgc2V0IHRvIFRSVUUgaWYgZ2VuZXJhdGVkIGZyb20gQUkmSSBBcnRpZmFjdCBnZW5lcmF0b3IgdG8KKwkgKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIG1hbnVhbGx5IHVwbG9hZGVkIGFuZCBnZW5lcmF0ZWQgYXJ0aWZhY3RzCisJICovCisJcHJpdmF0ZSBCb29sZWFuIGdlbmVyYXRlZCA9IEJvb2xlYW4uRkFMU0U7CisJCisJcHJpdmF0ZSBBcnRpZmFjdEdyb3VwVHlwZUVudW0gYXJ0aWZhY3RHcm91cFR5cGU7CisJcHJpdmF0ZSBJbnRlZ2VyIHRpbWVvdXQ7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RWZXJzaW9uOworCXByaXZhdGUgU3RyaW5nIGFydGlmYWN0VVVJRDsKKwlwcml2YXRlIExvbmcgcGF5bG9hZFVwZGF0ZURhdGU7CisJcHJpdmF0ZSBMb25nIGhlYXRQYXJhbXNVcGRhdGVEYXRlOworCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVxdWlyZWRBcnRpZmFjdHM7CisKKwlwdWJsaWMgQXJ0aWZhY3REYXRhRGVmaW5pdGlvbigpIHsKKwkJYXJ0aWZhY3RWZXJzaW9uID0gIjAiOworCX0KKworCXB1YmxpYyBBcnRpZmFjdERhdGFEZWZpbml0aW9uKEFydGlmYWN0RGF0YURlZmluaXRpb24gYSkgeworCQl0aGlzLnVuaXF1ZUlkID0gYS51bmlxdWVJZDsKKwkJdGhpcy5hcnRpZmFjdFR5cGUgPSBhLmFydGlmYWN0VHlwZTsKKwkJdGhpcy5hcnRpZmFjdFJlZiA9IGEuYXJ0aWZhY3RSZWY7CisJCXRoaXMuYXJ0aWZhY3ROYW1lID0gYS5hcnRpZmFjdE5hbWU7CisJCXRoaXMuYXJ0aWZhY3RSZXBvc2l0b3J5ID0gYS5hcnRpZmFjdFJlcG9zaXRvcnk7CisJCXRoaXMuYXJ0aWZhY3RDaGVja3N1bSA9IGEuYXJ0aWZhY3RDaGVja3N1bTsKKwkJdGhpcy51c2VySWRDcmVhdG9yID0gYS51c2VySWRDcmVhdG9yOworCQl0aGlzLnVzZXJJZExhc3RVcGRhdGVyID0gYS51c2VySWRMYXN0VXBkYXRlcjsKKwkJdGhpcy5jcmVhdG9yRnVsbE5hbWUgPSBhLmNyZWF0b3JGdWxsTmFtZTsKKwkJdGhpcy51cGRhdGVyRnVsbE5hbWUgPSBhLnVwZGF0ZXJGdWxsTmFtZTsKKwkJdGhpcy5jcmVhdGlvbkRhdGUgPSBhLmNyZWF0aW9uRGF0ZTsKKwkJdGhpcy5sYXN0VXBkYXRlRGF0ZSA9IGEubGFzdFVwZGF0ZURhdGU7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBhLmRlc2NyaXB0aW9uOworCQl0aGlzLmVzSWQgPSBhLmVzSWQ7CisJCXRoaXMuYXJ0aWZhY3RMYWJlbCA9IGEuYXJ0aWZhY3RMYWJlbDsKKwkJdGhpcy5hcnRpZmFjdENyZWF0b3IgPSBhLmFydGlmYWN0Q3JlYXRvcjsKKwkJdGhpcy5tYW5kYXRvcnkgPSBhLm1hbmRhdG9yeTsKKwkJdGhpcy5hcnRpZmFjdERpc3BsYXlOYW1lID0gYS5hcnRpZmFjdERpc3BsYXlOYW1lOworCQl0aGlzLmFwaVVybCA9IGEuYXBpVXJsOworCQl0aGlzLnNlcnZpY2VBcGkgPSBhLnNlcnZpY2VBcGk7CisJCXRoaXMuYXJ0aWZhY3RHcm91cFR5cGUgPSBhLmFydGlmYWN0R3JvdXBUeXBlOworCQl0aGlzLnRpbWVvdXQgPSBhLnRpbWVvdXQ7CisJCXRoaXMuYXJ0aWZhY3RWZXJzaW9uID0gYS5hcnRpZmFjdFZlcnNpb247CisJCXRoaXMuYXJ0aWZhY3RVVUlEID0gYS5hcnRpZmFjdFVVSUQ7CisJCXRoaXMucGF5bG9hZFVwZGF0ZURhdGUgPSBhLnBheWxvYWRVcGRhdGVEYXRlOworCQl0aGlzLmhlYXRQYXJhbXNVcGRhdGVEYXRlID0gYS5oZWF0UGFyYW1zVXBkYXRlRGF0ZTsKKwkJdGhpcy5zZXRHZW5lcmF0ZWQoYS5nZXRHZW5lcmF0ZWQoKSk7CisJCWlmIChhLnJlcXVpcmVkQXJ0aWZhY3RzICE9IG51bGwpCisJCQl0aGlzLnJlcXVpcmVkQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdDw+KGEuZ2V0UmVxdWlyZWRBcnRpZmFjdHMoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdE5hbWUoKSB7CisJCXJldHVybiBhcnRpZmFjdE5hbWUgIT0gbnVsbCA/IGFydGlmYWN0TmFtZSA6IGFydGlmYWN0UmVmOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RUeXBlKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0VHlwZShTdHJpbmcgYXJ0aWZhY3RUeXBlKSB7CisJCXRoaXMuYXJ0aWZhY3RUeXBlID0gYXJ0aWZhY3RUeXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RSZWYoKSB7CisJCXJldHVybiBhcnRpZmFjdFJlZjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlZihTdHJpbmcgYXJ0aWZhY3RSZWYpIHsKKwkJdGhpcy5hcnRpZmFjdFJlZiA9IGFydGlmYWN0UmVmOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCkgeworCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0UmVwb3NpdG9yeShTdHJpbmcgYXJ0aWZhY3RSZXBvc2l0b3J5KSB7CisJCXRoaXMuYXJ0aWZhY3RSZXBvc2l0b3J5ID0gYXJ0aWZhY3RSZXBvc2l0b3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0TmFtZShTdHJpbmcgYXJ0aWZhY3ROYW1lKSB7CisJCXRoaXMuYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3ROYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RDaGVja3N1bSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0Q2hlY2tzdW07CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RDaGVja3N1bShTdHJpbmcgYXJ0aWZhY3RDaGVja3N1bSkgeworCQl0aGlzLmFydGlmYWN0Q2hlY2tzdW0gPSBhcnRpZmFjdENoZWNrc3VtOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcklkQ3JlYXRvcigpIHsKKwkJcmV0dXJuIHVzZXJJZENyZWF0b3I7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcklkQ3JlYXRvcihTdHJpbmcgdXNlcklkQ3JlYXRvcikgeworCQl0aGlzLnVzZXJJZENyZWF0b3IgPSB1c2VySWRDcmVhdG9yOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcklkTGFzdFVwZGF0ZXIoKSB7CisJCXJldHVybiB1c2VySWRMYXN0VXBkYXRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVc2VySWRMYXN0VXBkYXRlcihTdHJpbmcgdXNlcklkTGFzdFVwZGF0ZXIpIHsKKwkJdGhpcy51c2VySWRMYXN0VXBkYXRlciA9IHVzZXJJZExhc3RVcGRhdGVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRvckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gY3JlYXRvckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0b3JGdWxsTmFtZShTdHJpbmcgY3JlYXRvckZ1bGxOYW1lKSB7CisJCXRoaXMuY3JlYXRvckZ1bGxOYW1lID0gY3JlYXRvckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlckZ1bGxOYW1lKCkgeworCQlyZXR1cm4gdXBkYXRlckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVwZGF0ZXJGdWxsTmFtZShTdHJpbmcgdXBkYXRlckZ1bGxOYW1lKSB7CisJCXRoaXMudXBkYXRlckZ1bGxOYW1lID0gdXBkYXRlckZ1bGxOYW1lOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uRGF0ZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoTG9uZyBjcmVhdGlvbkRhdGUpIHsKKwkJdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TGFzdFVwZGF0ZURhdGUoKSB7CisJCXJldHVybiBsYXN0VXBkYXRlRGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlRGF0ZShMb25nIGxhc3RVcGRhdGVEYXRlKSB7CisJCXRoaXMubGFzdFVwZGF0ZURhdGUgPSBsYXN0VXBkYXRlRGF0ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TGFiZWwoKSB7CisJCXJldHVybiBhcnRpZmFjdExhYmVsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0TGFiZWwoU3RyaW5nIGFydGlmYWN0TGFiZWwpIHsKKwkJdGhpcy5hcnRpZmFjdExhYmVsID0gYXJ0aWZhY3RMYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVzSWQoKSB7CisJCXJldHVybiBlc0lkOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVzSWQoU3RyaW5nIGVzSWQpIHsKKwkJdGhpcy5lc0lkID0gZXNJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0Q3JlYXRvcigpIHsKKwkJcmV0dXJuIGFydGlmYWN0Q3JlYXRvcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdENyZWF0b3IoU3RyaW5nIGFydGlmYWN0Q3JlYXRvcikgeworCQl0aGlzLmFydGlmYWN0Q3JlYXRvciA9IGFydGlmYWN0Q3JlYXRvcjsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRNYW5kYXRvcnkoKSB7CisJCXJldHVybiBtYW5kYXRvcnk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWFuZGF0b3J5KEJvb2xlYW4gbWFuZGF0b3J5KSB7CisJCXRoaXMubWFuZGF0b3J5ID0gbWFuZGF0b3J5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3REaXNwbGF5TmFtZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0RGlzcGxheU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3REaXNwbGF5TmFtZShTdHJpbmcgYXJ0aWZhY3REaXNwbGF5TmFtZSkgeworCQl0aGlzLmFydGlmYWN0RGlzcGxheU5hbWUgPSBhcnRpZmFjdERpc3BsYXlOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXBpVXJsKCkgeworCQlyZXR1cm4gYXBpVXJsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFwaVVybChTdHJpbmcgYXBpVXJsKSB7CisJCXRoaXMuYXBpVXJsID0gYXBpVXJsOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldFNlcnZpY2VBcGkoKSB7CisJCXJldHVybiBzZXJ2aWNlQXBpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VBcGkoQm9vbGVhbiBzZXJ2aWNlQXBpKSB7CisJCXRoaXMuc2VydmljZUFwaSA9IHNlcnZpY2VBcGk7CisJfQorCisJcHVibGljIEFydGlmYWN0R3JvdXBUeXBlRW51bSBnZXRBcnRpZmFjdEdyb3VwVHlwZSgpIHsKKwkJcmV0dXJuIGFydGlmYWN0R3JvdXBUeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0R3JvdXBUeXBlKEFydGlmYWN0R3JvdXBUeXBlRW51bSBhcnRpZmFjdEdyb3VwVHlwZSkgeworCQl0aGlzLmFydGlmYWN0R3JvdXBUeXBlID0gYXJ0aWZhY3RHcm91cFR5cGU7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0VGltZW91dCgpIHsKKwkJcmV0dXJuIHRpbWVvdXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIHRpbWVvdXQpIHsKKwkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VmVyc2lvbigpIHsKKwkJcmV0dXJuIGFydGlmYWN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFZlcnNpb24oU3RyaW5nIGFydGlmYWN0VmVyc2lvbikgeworCQl0aGlzLmFydGlmYWN0VmVyc2lvbiA9IGFydGlmYWN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VVVJRCgpIHsKKwkJcmV0dXJuIGFydGlmYWN0VVVJRDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFVVSUQoU3RyaW5nIGFydGlmYWN0VVVJRCkgeworCQl0aGlzLmFydGlmYWN0VVVJRCA9IGFydGlmYWN0VVVJRDsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRQYXlsb2FkVXBkYXRlRGF0ZSgpIHsKKwkJcmV0dXJuIHBheWxvYWRVcGRhdGVEYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBheWxvYWRVcGRhdGVEYXRlKExvbmcgcGF5bG9hZFVwZGF0ZURhdGUpIHsKKwkJdGhpcy5wYXlsb2FkVXBkYXRlRGF0ZSA9IHBheWxvYWRVcGRhdGVEYXRlOworCX0KKworCXB1YmxpYyBMb25nIGdldEhlYXRQYXJhbXNVcGRhdGVEYXRlKCkgeworCQlyZXR1cm4gaGVhdFBhcmFtc1VwZGF0ZURhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0SGVhdFBhcmFtc1VwZGF0ZURhdGUoTG9uZyBoZWF0UGFyYW1zVXBkYXRlRGF0ZSkgeworCQl0aGlzLmhlYXRQYXJhbXNVcGRhdGVEYXRlID0gaGVhdFBhcmFtc1VwZGF0ZURhdGU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZXF1aXJlZEFydGlmYWN0cygpIHsKKwkJcmV0dXJuIHJlcXVpcmVkQXJ0aWZhY3RzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkQXJ0aWZhY3RzKExpc3Q8U3RyaW5nPiByZXF1aXJlZEFydGlmYWN0cykgeworCQl0aGlzLnJlcXVpcmVkQXJ0aWZhY3RzID0gcmVxdWlyZWRBcnRpZmFjdHM7CisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldEdlbmVyYXRlZCgpIHsKKwkJcmV0dXJuIGdlbmVyYXRlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWQoQm9vbGVhbiBnZW5lcmF0ZWQpIHsKKwkJdGhpcy5nZW5lcmF0ZWQgPSBnZW5lcmF0ZWQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJBcnRpZmFjdERhdGFEZWZpbml0aW9uIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBhcnRpZmFjdFR5cGU9IiArIGFydGlmYWN0VHlwZSArICIsIGFydGlmYWN0UmVmPSIKKwkJCQkrIGFydGlmYWN0UmVmICsgIiwgYXJ0aWZhY3ROYW1lPSIgKyBhcnRpZmFjdE5hbWUgKyAiLCBhcnRpZmFjdFJlcG9zaXRvcnk9IiArIGFydGlmYWN0UmVwb3NpdG9yeQorCQkJCSsgIiwgYXJ0aWZhY3RDaGVja3N1bT0iICsgYXJ0aWZhY3RDaGVja3N1bSArICIsIHVzZXJJZENyZWF0b3I9IiArIHVzZXJJZENyZWF0b3IgKyAiLCB1c2VySWRMYXN0VXBkYXRlcj0iCisJCQkJKyB1c2VySWRMYXN0VXBkYXRlciArICIsIGNyZWF0b3JGdWxsTmFtZT0iICsgY3JlYXRvckZ1bGxOYW1lICsgIiwgdXBkYXRlckZ1bGxOYW1lPSIgKyB1cGRhdGVyRnVsbE5hbWUKKwkJCQkrICIsIGNyZWF0aW9uRGF0ZT0iICsgY3JlYXRpb25EYXRlICsgIiwgbGFzdFVwZGF0ZURhdGU9IiArIGxhc3RVcGRhdGVEYXRlICsgIiwgZXNJZD0iICsgZXNJZAorCQkJCSsgIiwgYXJ0aWZhY3RMYWJlbD0iICsgYXJ0aWZhY3RMYWJlbCArICIsIGFydGlmYWN0Q3JlYXRvcj0iICsgYXJ0aWZhY3RDcmVhdG9yICsgIiwgZGVzY3JpcHRpb249IgorCQkJCSsgZGVzY3JpcHRpb24gKyAiLCBtYW5kYXRvcnk9IiArIG1hbmRhdG9yeSArICIsIGFydGlmYWN0RGlzcGxheU5hbWU9IiArIGFydGlmYWN0RGlzcGxheU5hbWUKKwkJCQkrICIsIGFwaVVybD0iICsgYXBpVXJsICsgIiwgc2VydmljZUFwaT0iICsgc2VydmljZUFwaSArICIsIGFydGlmYWN0R3JvdXBUeXBlPSIgKyBhcnRpZmFjdEdyb3VwVHlwZQorCQkJCSsgIiwgdGltZW91dD0iICsgdGltZW91dCArICIsIGFydGlmYWN0VmVyc2lvbj0iICsgYXJ0aWZhY3RWZXJzaW9uICsgIiwgYXJ0aWZhY3RVVUlEPSIgKyBhcnRpZmFjdFVVSUQKKwkJCQkrICIsIHBheWxvYWRVcGRhdGVEYXRlPSIgKyBwYXlsb2FkVXBkYXRlRGF0ZSArICIsIGhlYXRQYXJhbXNVcGRhdGVEYXRlPSIgKyBoZWF0UGFyYW1zVXBkYXRlRGF0ZQorCQkJCSsgIiwgcmVxdWlyZWRBcnRpZmFjdHM9IiArIHJlcXVpcmVkQXJ0aWZhY3RzICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGFwaVVybCA9PSBudWxsKSA/IDAgOiBhcGlVcmwuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdENoZWNrc3VtID09IG51bGwpID8gMCA6IGFydGlmYWN0Q2hlY2tzdW0uaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdENyZWF0b3IgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RDcmVhdG9yLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoYXJ0aWZhY3REaXNwbGF5TmFtZSA9PSBudWxsKSA/IDAgOiBhcnRpZmFjdERpc3BsYXlOYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoYXJ0aWZhY3RHcm91cFR5cGUgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RHcm91cFR5cGUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdExhYmVsID09IG51bGwpID8gMCA6IGFydGlmYWN0TGFiZWwuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdE5hbWUgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3ROYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoYXJ0aWZhY3RSZWYgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RSZWYuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdFJlcG9zaXRvcnkgPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RSZXBvc2l0b3J5Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoYXJ0aWZhY3RUeXBlID09IG51bGwpID8gMCA6IGFydGlmYWN0VHlwZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGFydGlmYWN0VVVJRCA9PSBudWxsKSA/IDAgOiBhcnRpZmFjdFVVSUQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChhcnRpZmFjdFZlcnNpb24gPT0gbnVsbCkgPyAwIDogYXJ0aWZhY3RWZXJzaW9uLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodXNlcklkQ3JlYXRvciA9PSBudWxsKSA/IDAgOiB1c2VySWRDcmVhdG9yLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodXNlcklkTGFzdFVwZGF0ZXIgPT0gbnVsbCkgPyAwIDogdXNlcklkTGFzdFVwZGF0ZXIuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChjcmVhdGlvbkRhdGUgPT0gbnVsbCkgPyAwIDogY3JlYXRpb25EYXRlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY3JlYXRvckZ1bGxOYW1lID09IG51bGwpID8gMCA6IGNyZWF0b3JGdWxsTmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGRlc2NyaXB0aW9uID09IG51bGwpID8gMCA6IGRlc2NyaXB0aW9uLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZXNJZCA9PSBudWxsKSA/IDAgOiBlc0lkLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaGVhdFBhcmFtc1VwZGF0ZURhdGUgPT0gbnVsbCkgPyAwIDogaGVhdFBhcmFtc1VwZGF0ZURhdGUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChsYXN0VXBkYXRlRGF0ZSA9PSBudWxsKSA/IDAgOiBsYXN0VXBkYXRlRGF0ZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1hbmRhdG9yeSA9PSBudWxsKSA/IDAgOiBtYW5kYXRvcnkuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChwYXlsb2FkVXBkYXRlRGF0ZSA9PSBudWxsKSA/IDAgOiBwYXlsb2FkVXBkYXRlRGF0ZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHJlcXVpcmVkQXJ0aWZhY3RzID09IG51bGwpID8gMCA6IHJlcXVpcmVkQXJ0aWZhY3RzLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoc2VydmljZUFwaSA9PSBudWxsKSA/IDAgOiBzZXJ2aWNlQXBpLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodGltZW91dCA9PSBudWxsKSA/IDAgOiB0aW1lb3V0Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodW5pcXVlSWQgPT0gbnVsbCkgPyAwIDogdW5pcXVlSWQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1cGRhdGVyRnVsbE5hbWUgPT0gbnVsbCkgPyAwIDogdXBkYXRlckZ1bGxOYW1lLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlBcnRpZmFjdERhdGFEZWZpbml0aW9uIG90aGVyID0gKEFydGlmYWN0RGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKGFwaVVybCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuYXBpVXJsICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhcGlVcmwuZXF1YWxzKG90aGVyLmFwaVVybCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhcnRpZmFjdENoZWNrc3VtID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5hcnRpZmFjdENoZWNrc3VtICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhcnRpZmFjdENoZWNrc3VtLmVxdWFscyhvdGhlci5hcnRpZmFjdENoZWNrc3VtKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGFydGlmYWN0Q3JlYXRvciA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuYXJ0aWZhY3RDcmVhdG9yICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhcnRpZmFjdENyZWF0b3IuZXF1YWxzKG90aGVyLmFydGlmYWN0Q3JlYXRvcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhcnRpZmFjdERpc3BsYXlOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5hcnRpZmFjdERpc3BsYXlOYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhcnRpZmFjdERpc3BsYXlOYW1lLmVxdWFscyhvdGhlci5hcnRpZmFjdERpc3BsYXlOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGFydGlmYWN0R3JvdXBUeXBlICE9IG90aGVyLmFydGlmYWN0R3JvdXBUeXBlKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXJ0aWZhY3RMYWJlbCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuYXJ0aWZhY3RMYWJlbCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghYXJ0aWZhY3RMYWJlbC5lcXVhbHMob3RoZXIuYXJ0aWZhY3RMYWJlbCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhcnRpZmFjdE5hbWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmFydGlmYWN0TmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghYXJ0aWZhY3ROYW1lLmVxdWFscyhvdGhlci5hcnRpZmFjdE5hbWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXJ0aWZhY3RSZWYgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmFydGlmYWN0UmVmICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhcnRpZmFjdFJlZi5lcXVhbHMob3RoZXIuYXJ0aWZhY3RSZWYpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXJ0aWZhY3RSZXBvc2l0b3J5ID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5hcnRpZmFjdFJlcG9zaXRvcnkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWFydGlmYWN0UmVwb3NpdG9yeS5lcXVhbHMob3RoZXIuYXJ0aWZhY3RSZXBvc2l0b3J5KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGFydGlmYWN0VHlwZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuYXJ0aWZhY3RUeXBlICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFhcnRpZmFjdFR5cGUuZXF1YWxzKG90aGVyLmFydGlmYWN0VHlwZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhcnRpZmFjdFVVSUQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmFydGlmYWN0VVVJRCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghYXJ0aWZhY3RVVUlELmVxdWFscyhvdGhlci5hcnRpZmFjdFVVSUQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXJ0aWZhY3RWZXJzaW9uID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5hcnRpZmFjdFZlcnNpb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWFydGlmYWN0VmVyc2lvbi5lcXVhbHMob3RoZXIuYXJ0aWZhY3RWZXJzaW9uKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHVzZXJJZENyZWF0b3IgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVzZXJJZENyZWF0b3IgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXVzZXJJZENyZWF0b3IuZXF1YWxzKG90aGVyLnVzZXJJZENyZWF0b3IpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodXNlcklkTGFzdFVwZGF0ZXIgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVzZXJJZExhc3RVcGRhdGVyICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF1c2VySWRMYXN0VXBkYXRlci5lcXVhbHMob3RoZXIudXNlcklkTGFzdFVwZGF0ZXIpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoY3JlYXRpb25EYXRlID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jcmVhdGlvbkRhdGUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWNyZWF0aW9uRGF0ZS5lcXVhbHMob3RoZXIuY3JlYXRpb25EYXRlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNyZWF0b3JGdWxsTmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY3JlYXRvckZ1bGxOYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjcmVhdG9yRnVsbE5hbWUuZXF1YWxzKG90aGVyLmNyZWF0b3JGdWxsTmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuZGVzY3JpcHRpb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWRlc2NyaXB0aW9uLmVxdWFscyhvdGhlci5kZXNjcmlwdGlvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChlc0lkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5lc0lkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFlc0lkLmVxdWFscyhvdGhlci5lc0lkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGhlYXRQYXJhbXNVcGRhdGVEYXRlID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5oZWF0UGFyYW1zVXBkYXRlRGF0ZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaGVhdFBhcmFtc1VwZGF0ZURhdGUuZXF1YWxzKG90aGVyLmhlYXRQYXJhbXNVcGRhdGVEYXRlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGxhc3RVcGRhdGVEYXRlID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5sYXN0VXBkYXRlRGF0ZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbGFzdFVwZGF0ZURhdGUuZXF1YWxzKG90aGVyLmxhc3RVcGRhdGVEYXRlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKG1hbmRhdG9yeSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubWFuZGF0b3J5ICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFtYW5kYXRvcnkuZXF1YWxzKG90aGVyLm1hbmRhdG9yeSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChwYXlsb2FkVXBkYXRlRGF0ZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucGF5bG9hZFVwZGF0ZURhdGUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXBheWxvYWRVcGRhdGVEYXRlLmVxdWFscyhvdGhlci5wYXlsb2FkVXBkYXRlRGF0ZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChyZXF1aXJlZEFydGlmYWN0cyA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucmVxdWlyZWRBcnRpZmFjdHMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXJlcXVpcmVkQXJ0aWZhY3RzLmVxdWFscyhvdGhlci5yZXF1aXJlZEFydGlmYWN0cykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChzZXJ2aWNlQXBpID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5zZXJ2aWNlQXBpICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFzZXJ2aWNlQXBpLmVxdWFscyhvdGhlci5zZXJ2aWNlQXBpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHRpbWVvdXQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnRpbWVvdXQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXRpbWVvdXQuZXF1YWxzKG90aGVyLnRpbWVvdXQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodW5pcXVlSWQgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnVuaXF1ZUlkICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF1bmlxdWVJZC5lcXVhbHMob3RoZXIudW5pcXVlSWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodXBkYXRlckZ1bGxOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci51cGRhdGVyRnVsbE5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXVwZGF0ZXJGdWxsTmFtZS5lcXVhbHMob3RoZXIudXBkYXRlckZ1bGxOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0F0dHJpYnV0ZURhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQXR0cmlidXRlRGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI4MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0F0dHJpYnV0ZURhdGFEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworLyoqCisgKiBSZXByZXNlbnRzIEF0dHJpYnV0ZURhdGFEZWZpbml0aW9uCisgKiAKKyAqIEBhdXRob3IgbXNoaXRyaXQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzA0NjgzMTk1MDAwOTI1OTU2OUw7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwlwcml2YXRlIFN0cmluZyBzdGF0dXM7CisJcHJpdmF0ZSBTY2hlbWFEZWZpbml0aW9uIHNjaGVtYTsKKworCXB1YmxpYyBBdHRyaWJ1dGVEYXRhRGVmaW5pdGlvbigpIHsKKwkJLy8gVXNlZCBGcm9tIEF0dHJpYnV0ZSBEZWZlbml0aW9uCisJfQorCisJLyoqCisJICogQ2xvbmUgQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gYXR0cmlidXRlCisJICovCisJcHVibGljIEF0dHJpYnV0ZURhdGFEZWZpbml0aW9uKEF0dHJpYnV0ZURhdGFEZWZpbml0aW9uIGF0dHJpYnV0ZSkgeworCQl0aGlzLnVuaXF1ZUlkID0gYXR0cmlidXRlLnVuaXF1ZUlkOworCQl0aGlzLm5hbWUgPSBhdHRyaWJ1dGUubmFtZTsKKwkJdGhpcy50eXBlID0gYXR0cmlidXRlLnR5cGU7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBhdHRyaWJ1dGUuZGVzY3JpcHRpb247CisJCXRoaXMuZGVmYXVsdFZhbHVlID0gYXR0cmlidXRlLmRlZmF1bHRWYWx1ZTsKKwkJdGhpcy52YWx1ZSA9IGF0dHJpYnV0ZS52YWx1ZTsKKwkJdGhpcy5zdGF0dXMgPSBhdHRyaWJ1dGUuc3RhdHVzOworCQl0aGlzLnNjaGVtYSA9IGF0dHJpYnV0ZS5zY2hlbWE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisJCXJldHVybiBkZWZhdWx0VmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKwkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKwkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJcHVibGljIFNjaGVtYURlZmluaXRpb24gZ2V0U2NoZW1hKCkgeworCQlyZXR1cm4gc2NoZW1hOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTY2hlbWFEZWZpbml0aW9uIGVudHJ5U2NoZW1hKSB7CisJCXRoaXMuc2NoZW1hID0gZW50cnlTY2hlbWE7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZGVmYXVsdFZhbHVlID09IG51bGwpID8gMCA6IGRlZmF1bHRWYWx1ZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHZhbHVlID09IG51bGwpID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZGVzY3JpcHRpb24gPT0gbnVsbCkgPyAwIDogZGVzY3JpcHRpb24uaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh0eXBlID09IG51bGwpID8gMCA6IHR5cGUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1bmlxdWVJZCA9PSBudWxsKSA/IDAgOiB1bmlxdWVJZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHN0YXR1cyA9PSBudWxsKSA/IDAgOiBzdGF0dXMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChzY2hlbWEgPT0gbnVsbCkgPyAwIDogc2NoZW1hLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWJvb2xlYW4gZXF1YWxzID0gdHJ1ZTsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQXR0cmlidXRlRGF0YURlZmluaXRpb24gb3RoZXIgPSAoQXR0cmlidXRlRGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKCFPYmplY3RzLmVxdWFscyhkZWZhdWx0VmFsdWUsIG90aGVyLmRlZmF1bHRWYWx1ZSkpIHsKKwkJCWVxdWFscyA9IGZhbHNlOworCQl9IGVsc2UgaWYgKCFPYmplY3RzLmVxdWFscyh2YWx1ZSwgb3RoZXIudmFsdWUpKSB7CisJCQllcXVhbHMgPSBmYWxzZTsKKwkJfSBlbHNlIGlmICghT2JqZWN0cy5lcXVhbHMoZGVzY3JpcHRpb24sIG90aGVyLmRlc2NyaXB0aW9uKSkgeworCQkJZXF1YWxzID0gZmFsc2U7CisJCX0gZWxzZSBpZiAoIU9iamVjdHMuZXF1YWxzKG5hbWUsIG90aGVyLm5hbWUpKSB7CisJCQllcXVhbHMgPSBmYWxzZTsKKwkJfSBlbHNlIGlmICghT2JqZWN0cy5lcXVhbHModHlwZSwgb3RoZXIudHlwZSkpIHsKKwkJCWVxdWFscyA9IGZhbHNlOworCQl9IGVsc2UgaWYgKCFPYmplY3RzLmVxdWFscyh1bmlxdWVJZCwgb3RoZXIudW5pcXVlSWQpKSB7CisJCQllcXVhbHMgPSBmYWxzZTsKKwkJfSBlbHNlIGlmICghT2JqZWN0cy5lcXVhbHMoc3RhdHVzLCBvdGhlci5zdGF0dXMpKSB7CisJCQllcXVhbHMgPSBmYWxzZTsKKwkJfSBlbHNlIGlmICghT2JqZWN0cy5lcXVhbHMoc2NoZW1hLCBvdGhlci5zY2hlbWEpKSB7CisJCQllcXVhbHMgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gZXF1YWxzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQXR0cmlidXRlRGF0YURlZmluaXRpb24gW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIG5hbWU9IiArIG5hbWUgKyAiLCB0eXBlPSIgKyB0eXBlICsgIiwgZGVzY3JpcHRpb249IgorCQkJCSsgZGVzY3JpcHRpb24gKyAiLCBkZWZhdWx0VmFsdWU9IiArIGRlZmF1bHRWYWx1ZSArICIsIHZhbHVlPSIgKyB2YWx1ZSArICIsIHN0YXR1cz0iICsgc3RhdHVzCisJCQkJKyAiLCBlbnRyeVNjaGVtYT0iICsgc2NoZW1hICsgIl0iOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9DYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQ2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZGU1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQ2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNDIxMjM0MDUzMzc2MTIwODlMOworCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCS8qKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoZSBjYXBhYmlsaXR5LiAqLworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzOworCisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKworCXByaXZhdGUgTG9uZyBjcmVhdGlvblRpbWU7CisKKwlwcml2YXRlIExvbmcgbW9kaWZpY2F0aW9uVGltZTsKKworCS8vIHByaXZhdGUgU3RyaW5nIGRlcml2ZWRGcm9tOworCisJcHVibGljIENhcGFiaWxpdHlUeXBlRGF0YURlZmluaXRpb24oQ2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbiBjZHQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy51bmlxdWVJZCA9IGNkdC5nZXRVbmlxdWVJZCgpOworCQl0aGlzLmRlc2NyaXB0aW9uID0gY2R0LmdldERlc2NyaXB0aW9uKCk7CisJCXRoaXMudHlwZSA9IGNkdC5nZXRUeXBlKCk7CisJCXRoaXMudmFsaWRTb3VyY2VUeXBlcyA9IGNkdC5nZXRWYWxpZFNvdXJjZVR5cGVzKCk7CisJCXRoaXMudmVyc2lvbiA9IGNkdC5nZXRWZXJzaW9uKCk7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gY2R0LmdldENyZWF0aW9uVGltZSgpOworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBjZHQuZ2V0TW9kaWZpY2F0aW9uVGltZSgpOworCX0KKworCXB1YmxpYyBDYXBhYmlsaXR5VHlwZURhdGFEZWZpbml0aW9uKCkgeworCisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWxpZFNvdXJjZVR5cGVzKCkgeworCQlyZXR1cm4gdmFsaWRTb3VyY2VUeXBlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZFNvdXJjZVR5cGVzKExpc3Q8U3RyaW5nPiB2YWxpZFNvdXJjZVR5cGVzKSB7CisJCXRoaXMudmFsaWRTb3VyY2VUeXBlcyA9IHZhbGlkU291cmNlVHlwZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJcHVibGljIExvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworCQlyZXR1cm4gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShMb25nIGNyZWF0aW9uVGltZSkgeworCQl0aGlzLmNyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRNb2RpZmljYXRpb25UaW1lKCkgeworCQlyZXR1cm4gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25UaW1lKExvbmcgbW9kaWZpY2F0aW9uVGltZSkgeworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBtb2RpZmljYXRpb25UaW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiQ2FwYWJpbGl0eVR5cGVEYXRhRGVmaW5pdGlvbiBbdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsgIiwgdHlwZT0iICsgdHlwZQorCQkJCSsgIiwgdmFsaWRTb3VyY2VUeXBlcz0iICsgdmFsaWRTb3VyY2VUeXBlcyArICIsIHZlcnNpb249IiArIHZlcnNpb24gKyAiLCBjcmVhdGlvblRpbWU9IiArIGNyZWF0aW9uVGltZQorCQkJCSsgIiwgbW9kaWZpY2F0aW9uVGltZT0iICsgbW9kaWZpY2F0aW9uVGltZSArICJdIjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9Db21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQ29tcG9uZW50SW5zdGFuY2VEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTk1MTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQ29tcG9uZW50SW5zdGFuY2VEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuT3JpZ2luVHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyMTUwMzM4NzI5MjE0OTc3NDNMOworCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZWROYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50VWlkOworCisJcHJpdmF0ZSBMb25nIGNyZWF0aW9uVGltZTsKKworCXByaXZhdGUgTG9uZyBtb2RpZmljYXRpb25UaW1lOworCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwcml2YXRlIFN0cmluZyBwb3NYOworCisJcHJpdmF0ZSBTdHJpbmcgcG9zWTsKKwlwcml2YXRlIEludGVnZXIgcHJvcGVydHlWYWx1ZUNvdW50ZXIgPSAxOworCXByaXZhdGUgSW50ZWdlciBhdHRyaWJ1dGVWYWx1ZUNvdW50ZXI7CisJcHJpdmF0ZSBJbnRlZ2VyIGlucHV0VmFsdWVDb3VudGVyID0gMTsKKwlwcml2YXRlIE9yaWdpblR5cGVFbnVtIG9yaWdpblR5cGU7CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VEYXRhRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2VEYXRhRGVmaW5pdGlvbihDb21wb25lbnRJbnN0YW5jZURhdGFEZWZpbml0aW9uIGRhdGFEZWZpbml0aW9uKSB7CisJCXRoaXMudW5pcXVlSWQgPSBkYXRhRGVmaW5pdGlvbi51bmlxdWVJZDsKKwkJdGhpcy5uYW1lID0gZGF0YURlZmluaXRpb24ubmFtZTsKKwkJdGhpcy5jb21wb25lbnRVaWQgPSBkYXRhRGVmaW5pdGlvbi5jb21wb25lbnRVaWQ7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gZGF0YURlZmluaXRpb24uY3JlYXRpb25UaW1lOworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBkYXRhRGVmaW5pdGlvbi5tb2RpZmljYXRpb25UaW1lOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGF0YURlZmluaXRpb24uZGVzY3JpcHRpb247CisJCXRoaXMucG9zWCA9IGRhdGFEZWZpbml0aW9uLnBvc1g7CisJCXRoaXMucG9zWSA9IGRhdGFEZWZpbml0aW9uLnBvc1k7CisJCXRoaXMucHJvcGVydHlWYWx1ZUNvdW50ZXIgPSBkYXRhRGVmaW5pdGlvbi5wcm9wZXJ0eVZhbHVlQ291bnRlcjsKKwkJdGhpcy5ub3JtYWxpemVkTmFtZSA9IGRhdGFEZWZpbml0aW9uLm5vcm1hbGl6ZWROYW1lOworCQl0aGlzLm9yaWdpblR5cGUgPSBkYXRhRGVmaW5pdGlvbi5vcmlnaW5UeXBlOworCisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIExvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworCQlyZXR1cm4gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShMb25nIGNyZWF0aW9uVGltZSkgeworCQl0aGlzLmNyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRNb2RpZmljYXRpb25UaW1lKCkgeworCQlyZXR1cm4gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25UaW1lKExvbmcgbW9kaWZpY2F0aW9uVGltZSkgeworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UG9zWCgpIHsKKwkJcmV0dXJuIHBvc1g7CisJfQorCisJcHVibGljIHZvaWQgc2V0UG9zWChTdHJpbmcgcG9zWCkgeworCQl0aGlzLnBvc1ggPSBwb3NYOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UG9zWSgpIHsKKwkJcmV0dXJuIHBvc1k7CisJfQorCisJcHVibGljIHZvaWQgc2V0UG9zWShTdHJpbmcgcG9zWSkgeworCQl0aGlzLnBvc1kgPSBwb3NZOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VWlkKCkgeworCQlyZXR1cm4gY29tcG9uZW50VWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFVpZChTdHJpbmcgcmVzb3VyY2VVaWQpIHsKKwkJdGhpcy5jb21wb25lbnRVaWQgPSByZXNvdXJjZVVpZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRQcm9wZXJ0eVZhbHVlQ291bnRlcigpIHsKKwkJcmV0dXJuIHByb3BlcnR5VmFsdWVDb3VudGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWVDb3VudGVyKEludGVnZXIgcHJvcGVydHlWYWx1ZUNvdW50ZXIpIHsKKwkJdGhpcy5wcm9wZXJ0eVZhbHVlQ291bnRlciA9IHByb3BlcnR5VmFsdWVDb3VudGVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Tm9ybWFsaXplZE5hbWUoKSB7CisJCXJldHVybiBub3JtYWxpemVkTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb3JtYWxpemVkTmFtZShTdHJpbmcgbm9ybWFsaXplZE5hbWUpIHsKKwkJdGhpcy5ub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZWROYW1lOworCX0KKworCXB1YmxpYyBPcmlnaW5UeXBlRW51bSBnZXRPcmlnaW5UeXBlKCkgeworCQlyZXR1cm4gb3JpZ2luVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcmlnaW5UeXBlKE9yaWdpblR5cGVFbnVtIG9yaWdpblR5cGUpIHsKKwkJdGhpcy5vcmlnaW5UeXBlID0gb3JpZ2luVHlwZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkNvbXBvbmVudEluc3RhbmNlRGF0YURlZmluaXRpb24gW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIG5hbWU9IiArIG5hbWUgKyAiLCBub3JtYWxpemVkTmFtZT0iCisJCQkJKyBub3JtYWxpemVkTmFtZSArICIsIGNvbXBvbmVudFVpZD0iICsgY29tcG9uZW50VWlkICsgIiwgY3JlYXRpb25UaW1lPSIgKyBjcmVhdGlvblRpbWUKKwkJCQkrICIsIG1vZGlmaWNhdGlvblRpbWU9IiArIG1vZGlmaWNhdGlvblRpbWUgKyAiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24gKyAiLCBwb3NYPSIgKyBwb3NYCisJCQkJKyAiLCBwb3NZPSIgKyBwb3NZICsgIiwgcHJvcGVydHlWYWx1ZUNvdW50ZXI9IiArIHByb3BlcnR5VmFsdWVDb3VudGVyICsgIiwgb3JpZ2luVHlwZT0iICsgb3JpZ2luVHlwZQorCQkJCSsgIl0iOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldEF0dHJpYnV0ZVZhbHVlQ291bnRlcigpIHsKKwkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlQ291bnRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVWYWx1ZUNvdW50ZXIoSW50ZWdlciBhdHRyaWJ1dGVWYWx1ZUNvdW50ZXIpIHsKKwkJdGhpcy5hdHRyaWJ1dGVWYWx1ZUNvdW50ZXIgPSBhdHRyaWJ1dGVWYWx1ZUNvdW50ZXI7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0SW5wdXRWYWx1ZUNvdW50ZXIoKSB7CisJCXJldHVybiBpbnB1dFZhbHVlQ291bnRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnB1dFZhbHVlQ291bnRlcihJbnRlZ2VyIGlucHV0VmFsdWVDb3VudGVyKSB7CisJCXRoaXMuaW5wdXRWYWx1ZUNvdW50ZXIgPSBpbnB1dFZhbHVlQ291bnRlcjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9Db25zdW1lckRhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQ29uc3VtZXJEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDdkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvQ29uc3VtZXJEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzOworCitwdWJsaWMgY2xhc3MgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbiB7CisKKwkvLyBFQ09NUCBDb25zdW1lciBOYW1lIC0gVVRGLTggc3RyaW5nIHVwIHRvIDI1NSBjaGFyYWN0ZXJzIGNvbnRhaW5pbmcgdGhlCisJLy8gZm9sbG93aW5nIGNoYXJhY3RlcnMgOiAoIG1heWJlIHRvIGxpbWl0IDQtNjQgY2hhcnMgPyApCisJLy8gTG93ZXJjYXNlIGNoYXJhY3RlcnMge2Eten0KKwkvLyBVcHBlcmNhc2UgY2hhcmFjdGVycyB7QS1afQorCS8vIE51bWJlcnMgezAtOX0KKwkvLyBEYXNoIHstfTsgdGhpcyBjaGFyYWN0ZXIgaXMgbm90IHN1cHBvcnRlZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZQorCS8vIHVzZXIgbmFtZQorCS8vIFBlcmlvZCB7Ln07IHRoaXMgY2hhcmFjdGVyIGlzIG5vdCBzdXBwb3J0ZWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKKwkvLyB1c2VyIG5hbWUKKwkvLyBVbmRlcnNjb3JlIHtffQorCS8vICogRUNPTVAgQ29uc3VtZXIgUGFzc3dvcmQgLSBleHBlY3RlZCB0byBiZSBTSEEtMiAyNTYgZW5jcnlwdGVkIHZhbHVlICgKKwkvLyBTQUxUICsgInJlYWwiIHBhc3N3b3JkICkgPT4gbWF4aW1hbCBsZW5ndGggMjU2IGJ5dGVzID0gMzIgY2hhcmFjdGVycworCS8vIEJlZm9yZSBzdG9yaW5nL2NvbXBhcmluZyBwbGVhc2UgY29udmVydCB1cHBlciBjYXNlIGxldHRlciB0byBsb3dlci4KKwkvLyBUaGUgIm5vcm1hbGl6ZWQiIGVuY3J5cHRlZCBwYXNzd29yZCBzaG91bGQgbWF0Y2ggdGhlIGZvbGxvd2luZyBmb3JtYXQgOgorCS8vIFthLXowLTldezMyfSA9IGFscGhhbnVtZXJpYyBzdHJpbmcKKwkvLworCS8vICogRUNPTVAgQ29uc3VtZXIgU2FsdCAtIGFscGhhbnVtZXJpYyBzdHJpbmcgW2EtejAtOV0gLCBsZW5ndGggPSAzMiBjaGFycy4KKwkvLyAqIEVDT01QIENvbnN1bWVyIExhc3QgQXV0aGVudGljYXRpb24gVGltZSAoIGZvciBmdXR1cmUgdXNlKSAtCisJLy8gdGltZSB3aGVuIEVDT01QIENvbnN1bWVyIHdhcyBhdXRoZW50aWNhdGVkIGZvciB0aGUgbGFzdCB0aW1lIGluCisJLy8gbWlsbGlzZWNvbmRzIGZyb20gMTk3MCAoR01UKSAtIHNob3VsZCBiZSBzZXQgdG8gIjAiIG9uIGNyZWF0aW9uIC4KKwkvLyAqIEVDT01QIENvbnN1bWVyIERldGFpbHMgTGFzdCB1cGRhdGVkIHRpbWUgLSB0aW1lIG9mIHRoZSBsYXN0IHVwZGF0ZSBpbgorCS8vIG1pbGxpc2Vjb25kcyBmcm9tIDE5NzAgKEdNVCkKKwkvLyAqIFVTRVJfSUQgLSBVU0VSX0lEIG9mIHRoZSBsYXN0IHVzZXIgdGhhdCBjcmVhdGVkL3VwZGF0ZWQgY3JlZGVudGlhbHMgKAorCS8vIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSBVU0VSX0lEIGhlYWRlcikKKwlwcml2YXRlIFN0cmluZyBjb25zdW1lck5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgY29uc3VtZXJQYXNzd29yZDsKKwlwcml2YXRlIFN0cmluZyBjb25zdW1lclNhbHQ7CisJcHJpdmF0ZSBMb25nIGNvbnN1bWVyTGFzdEF1dGhlbnRpY2F0aW9uVGltZTsKKwlwcml2YXRlIExvbmcgY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lOworCXByaXZhdGUgU3RyaW5nIGxhc3RNb2RmaWVyQXR1aWQ7CisKKwlwdWJsaWMgQ29uc3VtZXJEYXRhRGVmaW5pdGlvbigpIHsKKworCX0KKworCXB1YmxpYyBDb25zdW1lckRhdGFEZWZpbml0aW9uKENvbnN1bWVyRGF0YURlZmluaXRpb24gYSkgeworCQl0aGlzLmNvbnN1bWVyTmFtZSA9IGEuY29uc3VtZXJOYW1lOworCQl0aGlzLmNvbnN1bWVyUGFzc3dvcmQgPSBhLmNvbnN1bWVyUGFzc3dvcmQ7CisJCXRoaXMuY29uc3VtZXJTYWx0ID0gYS5jb25zdW1lclNhbHQ7CisJCXRoaXMuY29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lID0gYS5jb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWU7CisJCXRoaXMuY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lID0gYS5jb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWU7CisJCXRoaXMubGFzdE1vZGZpZXJBdHVpZCA9IGEubGFzdE1vZGZpZXJBdHVpZDsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJOYW1lKCkgeworCQlyZXR1cm4gY29uc3VtZXJOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVyTmFtZShTdHJpbmcgY29uc3VtZXJOYW1lKSB7CisJCXRoaXMuY29uc3VtZXJOYW1lID0gY29uc3VtZXJOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJQYXNzd29yZCgpIHsKKwkJcmV0dXJuIGNvbnN1bWVyUGFzc3dvcmQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29uc3VtZXJQYXNzd29yZChTdHJpbmcgY29uc3VtZXJQYXNzd29yZCkgeworCQl0aGlzLmNvbnN1bWVyUGFzc3dvcmQgPSBjb25zdW1lclBhc3N3b3JkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJTYWx0KCkgeworCQlyZXR1cm4gY29uc3VtZXJTYWx0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVyU2FsdChTdHJpbmcgY29uc3VtZXJTYWx0KSB7CisJCXRoaXMuY29uc3VtZXJTYWx0ID0gY29uc3VtZXJTYWx0OworCX0KKworCXB1YmxpYyBMb25nIGdldENvbnN1bWVyTGFzdEF1dGhlbnRpY2F0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNvbnN1bWVyTGFzdEF1dGhlbnRpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUoTG9uZyBjb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUpIHsKKwkJdGhpcy5jb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUgPSBjb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIExvbmcgZ2V0Q29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lKCkgeworCQlyZXR1cm4gY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZShMb25nIGNvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZSkgeworCQl0aGlzLmNvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZSA9IGNvbnN1bWVyRGV0YWlsc0xhc3R1cGRhdGVkdGltZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhc3RNb2RmaWVyQXR1aWQoKSB7CisJCXJldHVybiBsYXN0TW9kZmllckF0dWlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldExhc3RNb2RmaWVyQXR1aWQoU3RyaW5nIGxhc3RNb2RmaWVyQXR1aWQpIHsKKwkJdGhpcy5sYXN0TW9kZmllckF0dWlkID0gbGFzdE1vZGZpZXJBdHVpZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJc2IuYXBwZW5kKCJDb25zdW1lckRhdGFEZWZpbml0aW9uIFsiKS5hcHBlbmQoImNvbnN1bWVyTmFtZT0iKS5hcHBlbmQoY29uc3VtZXJOYW1lKS5hcHBlbmQoIiwiKQorCQkJCS5hcHBlbmQoImNvbnN1bWVyUGFzc3dvcmQ9IikuYXBwZW5kKGNvbnN1bWVyUGFzc3dvcmQpLmFwcGVuZCgiLCIpLmFwcGVuZCgiY29uc3VtZXJTYWx0PSIpCisJCQkJLmFwcGVuZChjb25zdW1lclNhbHQpLmFwcGVuZCgiLCIpLmFwcGVuZCgiY29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lPSIpCisJCQkJLmFwcGVuZChjb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUpLmFwcGVuZCgiLCIpLmFwcGVuZCgiY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lPSIpCisJCQkJLmFwcGVuZChjb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWUpLmFwcGVuZCgiLCIpLmFwcGVuZCgibGFzdE1vZGZpZXJBdHVpZD0iKS5hcHBlbmQobGFzdE1vZGZpZXJBdHVpZCkKKwkJCQkuYXBwZW5kKCJdIik7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGNvbnN1bWVyTmFtZSA9PSBudWxsKSA/IDAgOiBjb25zdW1lck5hbWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChjb25zdW1lclBhc3N3b3JkID09IG51bGwpID8gMCA6IGNvbnN1bWVyUGFzc3dvcmQuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChjb25zdW1lclNhbHQgPT0gbnVsbCkgPyAwIDogY29uc3VtZXJTYWx0Lmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorCQkJCSsgKChjb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUgPT0gbnVsbCkgPyAwIDogY29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorCQkJCSsgKChjb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWUgPT0gbnVsbCkgPyAwIDogY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobGFzdE1vZGZpZXJBdHVpZCA9PSBudWxsKSA/IDAgOiBsYXN0TW9kZmllckF0dWlkLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlDb25zdW1lckRhdGFEZWZpbml0aW9uIG90aGVyID0gKENvbnN1bWVyRGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKGNvbnN1bWVyTmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY29uc3VtZXJOYW1lICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gZWxzZSBpZiAoIWNvbnN1bWVyTmFtZS5lcXVhbHMob3RoZXIuY29uc3VtZXJOYW1lKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChjb25zdW1lclBhc3N3b3JkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb25zdW1lclBhc3N3b3JkICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0gZWxzZSBpZiAoIWNvbnN1bWVyUGFzc3dvcmQuZXF1YWxzKG90aGVyLmNvbnN1bWVyUGFzc3dvcmQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoY29uc3VtZXJTYWx0ID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb25zdW1lclNhbHQgIT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghY29uc3VtZXJTYWx0LmVxdWFscyhvdGhlci5jb25zdW1lclNhbHQpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoY29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUgIT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghY29uc3VtZXJMYXN0QXV0aGVudGljYXRpb25UaW1lLmVxdWFscyhvdGhlci5jb25zdW1lckxhc3RBdXRoZW50aWNhdGlvblRpbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWUgIT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghY29uc3VtZXJEZXRhaWxzTGFzdHVwZGF0ZWR0aW1lLmVxdWFscyhvdGhlci5jb25zdW1lckRldGFpbHNMYXN0dXBkYXRlZHRpbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobGFzdE1vZGZpZXJBdHVpZCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubGFzdE1vZGZpZXJBdHVpZCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGVsc2UgaWYgKCFsYXN0TW9kZmllckF0dWlkLmVxdWFscyhvdGhlci5sYXN0TW9kZmllckF0dWlkKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvRGF0YVR5cGVEYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0RhdGFUeXBlRGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmNmZWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0RhdGFUeXBlRGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgY2xhc3MgRGF0YVR5cGVEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNzUxNzY4MzUyMjA1ODkyMTcyTDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCS8vICJib29sZWFuIiwgInN0cmluZyIsICJmbG9hdCIsICJpbnRlZ2VyIiwgInZlcnNpb24iIH0pCisJcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEZyb21OYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwkvKioKKwkgKiBUaW1lc3RhbXAgb2YgZGF0YSB0eXBlIGNyZWF0aW9uCisJICovCisJcHJpdmF0ZSBMb25nIGNyZWF0aW9uVGltZTsKKworCS8qKgorCSAqIFRpbWVzdGFtcCBvZiB0aGUgZGF0YSB0eXBlIGxhc3QgdXBkYXRlCisJICovCisJcHJpdmF0ZSBMb25nIG1vZGlmaWNhdGlvblRpbWU7CisKKwlwdWJsaWMgRGF0YVR5cGVEYXRhRGVmaW5pdGlvbigpIHsKKworCX0KKworCXB1YmxpYyBEYXRhVHlwZURhdGFEZWZpbml0aW9uKERhdGFUeXBlRGF0YURlZmluaXRpb24gcCkgeworCQl0aGlzLm5hbWUgPSBwLm5hbWU7CisJCXRoaXMudW5pcXVlSWQgPSBwLnVuaXF1ZUlkOworCQl0aGlzLmRlcml2ZWRGcm9tTmFtZSA9IHAuZGVyaXZlZEZyb21OYW1lOworCQl0aGlzLmRlc2NyaXB0aW9uID0gcC5kZXNjcmlwdGlvbjsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBwLmNyZWF0aW9uVGltZTsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gcC5tb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVyaXZlZEZyb21OYW1lKCkgeworCQlyZXR1cm4gZGVyaXZlZEZyb21OYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlcml2ZWRGcm9tTmFtZShTdHJpbmcgZGVyaXZlZEZyb21OYW1lKSB7CisJCXRoaXMuZGVyaXZlZEZyb21OYW1lID0gZGVyaXZlZEZyb21OYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUoTG9uZyBjcmVhdGlvblRpbWUpIHsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TW9kaWZpY2F0aW9uVGltZSgpIHsKKwkJcmV0dXJuIG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uVGltZShMb25nIG1vZGlmaWNhdGlvblRpbWUpIHsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkRhdGFUeXBlRGF0YURlZmluaXRpb24gW25hbWU9IiArIG5hbWUgKyAiLCB1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCBkZXJpdmVkRnJvbU5hbWU9IgorCQkJCSsgZGVyaXZlZEZyb21OYW1lICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsgIiwgY3JlYXRpb25UaW1lPSIgKyBjcmVhdGlvblRpbWUKKwkJCQkrICIsIG1vZGlmaWNhdGlvblRpbWU9IiArIG1vZGlmaWNhdGlvblRpbWUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvR3JvdXBEYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0dyb3VwRGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTNkZDhjCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0dyb3VwRGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgY2xhc3MgR3JvdXBEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNTY1NjA2MTY1Mjc5MTA5NDI3TDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwkvLyB0aGUgaWQgaXMgdW5pcXVlIHBlciBncm91cCBpbnN0YW5jZSBvbiBncmFwaC4KKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisKKwkvLyB2ZXJzaW9uIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgdG8gdGhlIGdyb3VwJ3MgbWV0YWRhdGEKKwkvLyBvciB0byB0aGUgZ3JvdXBzIG1lbWJlcnMKKwkvLyAobm90IG5lY2Vzc2FyaWx5IHdoZW4gdGhlIFZGIHZlcnNpb24gaXMgY2hhbmdlZCkuIFRoaXMgZmllbGQgY2Fubm90IGJlCisJLy8gdXBkYXRlZCBieSB1c2VyCisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKworCS8vIHRoaXMgaWQgaXMgY29uc3RhbnQgYW5kIGRvZXMgbm90IGNoYW5nZWQgKGFsc28gbm90IHdoZW4gY2hhbmdpbmcKKwkvLyB2ZXJzaW9uKS4gVGhpcyBmaWVsZCBjYW5ub3QgYmUgdXBkYXRlZCBieSB1c2VyCisJcHJpdmF0ZSBTdHJpbmcgaW52YXJpYW50VVVJRDsKKworCS8vIHRoZSBncm91cCBVVUlEIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4gb25lIG9mIHRoZSBhcnRpZmFjdHMvY29tcG9uZW50CisJLy8gaW5zdGFuY2VzIGhhcyBiZWVuIGNoYW5nZWQuCisJcHJpdmF0ZSBTdHJpbmcgZ3JvdXBVVUlEOworCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwcml2YXRlIEludGVnZXIgcHJvcGVydHlWYWx1ZUNvdW50ZXIgPSAwOworCisJcHVibGljIEdyb3VwRGF0YURlZmluaXRpb24oKSB7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEludmFyaWFudFVVSUQoKSB7CisJCXJldHVybiBpbnZhcmlhbnRVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldEludmFyaWFudFVVSUQoU3RyaW5nIGludmFyaWFudFVVSUQpIHsKKwkJdGhpcy5pbnZhcmlhbnRVVUlEID0gaW52YXJpYW50VVVJRDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRQcm9wZXJ0eVZhbHVlQ291bnRlcigpIHsKKwkJcmV0dXJuIHByb3BlcnR5VmFsdWVDb3VudGVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWVDb3VudGVyKEludGVnZXIgcHJvcGVydHlWYWx1ZUNvdW50ZXIpIHsKKwkJdGhpcy5wcm9wZXJ0eVZhbHVlQ291bnRlciA9IHByb3BlcnR5VmFsdWVDb3VudGVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBVVUlEKCkgeworCQlyZXR1cm4gZ3JvdXBVVUlEOworCX0KKworCXB1YmxpYyB2b2lkIHNldEdyb3VwVVVJRChTdHJpbmcgZ3JvdXBVVUlEKSB7CisJCXRoaXMuZ3JvdXBVVUlEID0gZ3JvdXBVVUlEOworCX0KKworCXB1YmxpYyBHcm91cERhdGFEZWZpbml0aW9uKEdyb3VwRGF0YURlZmluaXRpb24gb3RoZXIpIHsKKwkJdGhpcy5uYW1lID0gb3RoZXIubmFtZTsKKwkJdGhpcy51bmlxdWVJZCA9IG90aGVyLnVuaXF1ZUlkOworCQl0aGlzLnR5cGUgPSBvdGhlci50eXBlOworCQl0aGlzLnZlcnNpb24gPSBvdGhlci52ZXJzaW9uOworCQl0aGlzLmludmFyaWFudFVVSUQgPSBvdGhlci5pbnZhcmlhbnRVVUlEOworCQl0aGlzLmRlc2NyaXB0aW9uID0gb3RoZXIuZGVzY3JpcHRpb247CisJCXRoaXMucHJvcGVydHlWYWx1ZUNvdW50ZXIgPSBvdGhlci5wcm9wZXJ0eVZhbHVlQ291bnRlcjsKKwkJdGhpcy5ncm91cFVVSUQgPSBvdGhlci5ncm91cFVVSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJHcm91cERhdGFEZWZpbml0aW9uIFtuYW1lPSIgKyBuYW1lICsgIiwgdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgdHlwZT0iICsgdHlwZSArICIsIHZlcnNpb249IgorCQkJCSsgdmVyc2lvbiArICIsIGludmFyaWFudFVVSUQ9IiArIGludmFyaWFudFVVSUQgKyAiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24KKwkJCQkrICIsIHByb3BlcnR5VmFsdWVDb3VudGVyPSIgKyBwcm9wZXJ0eVZhbHVlQ291bnRlciArICIsIGdyb3VwVVVJRD0iICsgZ3JvdXBVVUlEICsgIl0iOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9Hcm91cFR5cGVEYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0dyb3VwVHlwZURhdGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0MmQxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9Hcm91cFR5cGVEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIEdyb3VwVHlwZURhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MDAxODE3ODE4OTA3MTcyNDk2TDsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXByaXZhdGUgU3RyaW5nIHZlcnNpb247CisKKwlwcml2YXRlIFN0cmluZyBkZXJpdmVkRnJvbTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1lbWJlcnM7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGE7CisKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCS8qKgorCSAqIFRpbWVzdGFtcCBvZiBkYXRhIHR5cGUgY3JlYXRpb24KKwkgKi8KKwlwcml2YXRlIExvbmcgY3JlYXRpb25UaW1lOworCisJLyoqCisJICogVGltZXN0YW1wIG9mIHRoZSBkYXRhIHR5cGUgbGFzdCB1cGRhdGUKKwkgKi8KKwlwcml2YXRlIExvbmcgbW9kaWZpY2F0aW9uVGltZTsKKworCXByaXZhdGUgYm9vbGVhbiBoaWdoZXN0VmVyc2lvbjsKKworCXB1YmxpYyBHcm91cFR5cGVEYXRhRGVmaW5pdGlvbigpIHsKKworCX0KKworCXB1YmxpYyBHcm91cFR5cGVEYXRhRGVmaW5pdGlvbihHcm91cFR5cGVEYXRhRGVmaW5pdGlvbiBwKSB7CisJCXRoaXMudW5pcXVlSWQgPSBwLnVuaXF1ZUlkOworCQl0aGlzLnR5cGUgPSBwLnR5cGU7CisJCXRoaXMudmVyc2lvbiA9IHAudmVyc2lvbjsKKwkJdGhpcy5tZW1iZXJzID0gcC5tZW1iZXJzOworCQl0aGlzLm1ldGFkYXRhID0gcC5tZXRhZGF0YTsKKwkJLy8gdGhpcy5kZXJpdmVkRnJvbU5hbWUgPSBwLmRlcml2ZWRGcm9tTmFtZTsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IHAuZGVzY3JpcHRpb247CisJCXRoaXMuY3JlYXRpb25UaW1lID0gcC5jcmVhdGlvblRpbWU7CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IHAubW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1lbWJlcnMoKSB7CisJCXJldHVybiBtZW1iZXJzOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1lbWJlcnMoTGlzdDxTdHJpbmc+IG1lbWJlcnMpIHsKKwkJdGhpcy5tZW1iZXJzID0gbWVtYmVyczsKKwl9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRNZXRhZGF0YSgpIHsKKwkJcmV0dXJuIG1ldGFkYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YWRhdGEpIHsKKwkJdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uVGltZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUoTG9uZyBjcmVhdGlvblRpbWUpIHsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TW9kaWZpY2F0aW9uVGltZSgpIHsKKwkJcmV0dXJuIG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uVGltZShMb25nIG1vZGlmaWNhdGlvblRpbWUpIHsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkdyb3VwVHlwZURhdGFEZWZpbml0aW9uIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCB0eXBlPSIgKyB0eXBlICsgIiwgdmVyc2lvbj0iICsgdmVyc2lvbgorCQkJCSsgIiwgbWVtYmVycz0iICsgbWVtYmVycyArICIsIG1ldGFkYXRhPSIgKyBtZXRhZGF0YSArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIGNyZWF0aW9uVGltZT0iCisJCQkJKyBjcmVhdGlvblRpbWUgKyAiLCBtb2RpZmljYXRpb25UaW1lPSIgKyBtb2RpZmljYXRpb25UaW1lICsgIl0iOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVyaXZlZEZyb20oKSB7CisJCXJldHVybiBkZXJpdmVkRnJvbTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXJpdmVkRnJvbShTdHJpbmcgZGVyaXZlZEZyb20pIHsKKwkJdGhpcy5kZXJpdmVkRnJvbSA9IGRlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSGlnaGVzdFZlcnNpb24oKSB7CisJCXJldHVybiBoaWdoZXN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIaWdoZXN0VmVyc2lvbihib29sZWFuIGlzTGF0ZXN0VmVyc2lvbikgeworCQl0aGlzLmhpZ2hlc3RWZXJzaW9uID0gaXNMYXRlc3RWZXJzaW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0hlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0hlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDQ4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvSGVhdFBhcmFtZXRlckRhdGFEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworcHVibGljIGNsYXNzIEhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4OTk1NDIxNzYyMTQ4NTAyODQ4TDsKKworCVN0cmluZyB1bmlxdWVJZDsKKworCVN0cmluZyBuYW1lOworCVN0cmluZyB0eXBlOworCVN0cmluZyBkZXNjcmlwdGlvbjsKKworCVN0cmluZyBjdXJyZW50VmFsdWU7CisJU3RyaW5nIGRlZmF1bHRWYWx1ZTsKKworCXB1YmxpYyBIZWF0UGFyYW1ldGVyRGF0YURlZmluaXRpb24oKSB7CisJfQorCisJcHVibGljIEhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbihIZWF0UGFyYW1ldGVyRGF0YURlZmluaXRpb24gaHApIHsKKwkJdGhpcy51bmlxdWVJZCA9IGhwLnVuaXF1ZUlkOworCQl0aGlzLm5hbWUgPSBocC5uYW1lOworCQl0aGlzLnR5cGUgPSBocC50eXBlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gaHAuZGVzY3JpcHRpb247CisJCXRoaXMuY3VycmVudFZhbHVlID0gaHAuY3VycmVudFZhbHVlOworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGhwLmRlZmF1bHRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRWYWx1ZSgpIHsKKwkJcmV0dXJuIGN1cnJlbnRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50VmFsdWUoU3RyaW5nIGN1cnJlbnRWYWx1ZSkgeworCQl0aGlzLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIkhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBbdW5pcXVlSWQ9IiArIHVuaXF1ZUlkICsgIiwgbmFtZT0iICsgbmFtZSArICIsIHR5cGU9IiArIHR5cGUKKwkJCQkrICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIGN1cnJlbnRWYWx1ZT0iICsgY3VycmVudFZhbHVlICsgIiwgZGVmYXVsdFZhbHVlPSIgKyBkZWZhdWx0VmFsdWUKKwkJCQkrICJdIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKwkJaW50IHJlc3VsdCA9IDE7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChjdXJyZW50VmFsdWUgPT0gbnVsbCkgPyAwIDogY3VycmVudFZhbHVlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZGVmYXVsdFZhbHVlID09IG51bGwpID8gMCA6IGRlZmF1bHRWYWx1ZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGRlc2NyaXB0aW9uID09IG51bGwpID8gMCA6IGRlc2NyaXB0aW9uLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodHlwZSA9PSBudWxsKSA/IDAgOiB0eXBlLmhhc2hDb2RlKCkpOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgodW5pcXVlSWQgPT0gbnVsbCkgPyAwIDogdW5pcXVlSWQuaGFzaENvZGUoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKHRoaXMgPT0gb2JqKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCUhlYXRQYXJhbWV0ZXJEYXRhRGVmaW5pdGlvbiBvdGhlciA9IChIZWF0UGFyYW1ldGVyRGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIuY3VycmVudFZhbHVlICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFjdXJyZW50VmFsdWUuZXF1YWxzKG90aGVyLmN1cnJlbnRWYWx1ZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlZmF1bHRWYWx1ZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghZGVmYXVsdFZhbHVlLmVxdWFscyhvdGhlci5kZWZhdWx0VmFsdWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlc2NyaXB0aW9uICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFkZXNjcmlwdGlvbi5lcXVhbHMob3RoZXIuZGVzY3JpcHRpb24pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIubmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCWlmIChvdGhlci50eXBlICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCF0eXBlLmVxdWFscyhvdGhlci50eXBlKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHVuaXF1ZUlkID09IG51bGwpIHsKKwkJCWlmIChvdGhlci51bmlxdWVJZCAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghdW5pcXVlSWQuZXF1YWxzKG90aGVyLnVuaXF1ZUlkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL0lucHV0c1ZhbHVlRGF0YURlZmluaXRpb24uamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9JbnB1dHNWYWx1ZURhdGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjMTYzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9JbnB1dHNWYWx1ZURhdGFEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworcHVibGljIGNsYXNzIElucHV0c1ZhbHVlRGF0YURlZmluaXRpb24geworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwdWJsaWMgSW5wdXRzVmFsdWVEYXRhRGVmaW5pdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgSW5wdXRzVmFsdWVEYXRhRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvSW50ZXJmYWNlRGF0YURlZmluaXRpb24uamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9JbnRlcmZhY2VEYXRhRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzFlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvSW50ZXJmYWNlRGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBJbnRlcmZhY2VEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjA4MzY5MzY4NDg5NzI1MDQ5TDsKKworCXByaXZhdGUgU3RyaW5nIHR5cGU7CisKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJLyoqCisJICogVGltZXN0YW1wIG9mIHRoZSByZXNvdXJjZSAoYXJ0aWZhY3QpIGNyZWF0aW9uCisJICovCisJcHJpdmF0ZSBMb25nIGNyZWF0aW9uRGF0ZTsKKworCS8qKgorCSAqIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCByZXNvdXJjZSAoYXJ0aWZhY3QpIGNyZWF0aW9uCisJICovCisJcHJpdmF0ZSBMb25nIGxhc3RVcGRhdGVEYXRlOworCisJcHVibGljIEludGVyZmFjZURhdGFEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgSW50ZXJmYWNlRGF0YURlZmluaXRpb24oU3RyaW5nIHR5cGUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlzdXBlcigpOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisKKwl9CisKKwlwdWJsaWMgSW50ZXJmYWNlRGF0YURlZmluaXRpb24oSW50ZXJmYWNlRGF0YURlZmluaXRpb24gcCkgeworCQl0aGlzLnVuaXF1ZUlkID0gcC51bmlxdWVJZDsKKwkJdGhpcy50eXBlID0gcC50eXBlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gcC5kZXNjcmlwdGlvbjsKKworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKwkJdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBMb25nIGdldENyZWF0aW9uRGF0ZSgpIHsKKwkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoTG9uZyBjcmVhdGlvbkRhdGUpIHsKKwkJdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7CisJfQorCisJcHVibGljIExvbmcgZ2V0TGFzdFVwZGF0ZURhdGUoKSB7CisJCXJldHVybiBsYXN0VXBkYXRlRGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlRGF0ZShMb25nIGxhc3RVcGRhdGVEYXRlKSB7CisJCXRoaXMubGFzdFVwZGF0ZURhdGUgPSBsYXN0VXBkYXRlRGF0ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9PcGVyYXRpb25EYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL09wZXJhdGlvbkRhdGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjMDY5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9PcGVyYXRpb25EYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworcHVibGljIGNsYXNzIE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE5NTE1MTY5NjYxODczMjY5MTVMOworCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwkvKioKKwkgKiBUaW1lc3RhbXAgb2YgdGhlIHJlc291cmNlIChhcnRpZmFjdCkgY3JlYXRpb24KKwkgKi8KKwlwcml2YXRlIExvbmcgY3JlYXRpb25EYXRlOworCisJLyoqCisJICogVGltZXN0YW1wIG9mIHRoZSBsYXN0IHJlc291cmNlIChhcnRpZmFjdCkgY3JlYXRpb24KKwkgKi8KKwlwcml2YXRlIExvbmcgbGFzdFVwZGF0ZURhdGU7CisKKwkvKiogRGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbi4gKi8KKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXB1YmxpYyBPcGVyYXRpb25EYXRhRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJcHVibGljIE9wZXJhdGlvbkRhdGFEZWZpbml0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlzdXBlcigpOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisKKwl9CisKKwlwdWJsaWMgT3BlcmF0aW9uRGF0YURlZmluaXRpb24oT3BlcmF0aW9uRGF0YURlZmluaXRpb24gcCkgeworCQl0aGlzLnVuaXF1ZUlkID0gcC51bmlxdWVJZDsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IHAuZGVzY3JpcHRpb247CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRDcmVhdGlvbkRhdGUoKSB7CisJCXJldHVybiBjcmVhdGlvbkRhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKExvbmcgY3JlYXRpb25EYXRlKSB7CisJCXRoaXMuY3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOworCX0KKworCXB1YmxpYyBMb25nIGdldExhc3RVcGRhdGVEYXRlKCkgeworCQlyZXR1cm4gbGFzdFVwZGF0ZURhdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGFzdFVwZGF0ZURhdGUoTG9uZyBsYXN0VXBkYXRlRGF0ZSkgeworCQl0aGlzLmxhc3RVcGRhdGVEYXRlID0gbGFzdFVwZGF0ZURhdGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvUG9saWN5VHlwZURhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvUG9saWN5VHlwZURhdGFEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyYjA2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9Qb2xpY3lUeXBlRGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBQb2xpY3lUeXBlRGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM3ODMzOTA1Mzk3ODg1NzgzODhMOworCisJcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSWQ7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKworCXByaXZhdGUgU3RyaW5nIGRlcml2ZWRGcm9tOworCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gdGFyZ2V0czsKKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YTsKKworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJLyoqCisJICogVGltZXN0YW1wIG9mIGRhdGEgdHlwZSBjcmVhdGlvbgorCSAqLworCXByaXZhdGUgTG9uZyBjcmVhdGlvblRpbWU7CisKKwkvKioKKwkgKiBUaW1lc3RhbXAgb2YgdGhlIGRhdGEgdHlwZSBsYXN0IHVwZGF0ZQorCSAqLworCXByaXZhdGUgTG9uZyBtb2RpZmljYXRpb25UaW1lOworCisJcHJpdmF0ZSBib29sZWFuIGhpZ2hlc3RWZXJzaW9uOworCisJcHVibGljIFBvbGljeVR5cGVEYXRhRGVmaW5pdGlvbigpIHsKKworCX0KKworCXB1YmxpYyBQb2xpY3lUeXBlRGF0YURlZmluaXRpb24oUG9saWN5VHlwZURhdGFEZWZpbml0aW9uIHApIHsKKwkJdGhpcy51bmlxdWVJZCA9IHAudW5pcXVlSWQ7CisJCXRoaXMudHlwZSA9IHAudHlwZTsKKwkJdGhpcy52ZXJzaW9uID0gcC52ZXJzaW9uOworCQl0aGlzLnRhcmdldHMgPSBwLnRhcmdldHM7CisJCXRoaXMubWV0YWRhdGEgPSBwLm1ldGFkYXRhOworCQkvLyB0aGlzLmRlcml2ZWRGcm9tTmFtZSA9IHAuZGVyaXZlZEZyb21OYW1lOworCQl0aGlzLmRlc2NyaXB0aW9uID0gcC5kZXNjcmlwdGlvbjsKKwkJdGhpcy5jcmVhdGlvblRpbWUgPSBwLmNyZWF0aW9uVGltZTsKKwkJdGhpcy5tb2RpZmljYXRpb25UaW1lID0gcC5tb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VGFyZ2V0cygpIHsKKwkJcmV0dXJuIHRhcmdldHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0cyhMaXN0PFN0cmluZz4gbWVtYmVycykgeworCQl0aGlzLnRhcmdldHMgPSBtZW1iZXJzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldE1ldGFkYXRhKCkgeworCQlyZXR1cm4gbWV0YWRhdGE7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWV0YWRhdGEoTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhZGF0YSkgeworCQl0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworCQl0aGlzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIExvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworCQlyZXR1cm4gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShMb25nIGNyZWF0aW9uVGltZSkgeworCQl0aGlzLmNyZWF0aW9uVGltZSA9IGNyZWF0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRNb2RpZmljYXRpb25UaW1lKCkgeworCQlyZXR1cm4gbW9kaWZpY2F0aW9uVGltZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25UaW1lKExvbmcgbW9kaWZpY2F0aW9uVGltZSkgeworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBtb2RpZmljYXRpb25UaW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUG9saWN5VHlwZURhdGFEZWZpbml0aW9uIFt1bmlxdWVJZD0iICsgdW5pcXVlSWQgKyAiLCB0eXBlPSIgKyB0eXBlICsgIiwgdmVyc2lvbj0iICsgdmVyc2lvbgorCQkJCSsgIiwgdGFyZ2V0cz0iICsgdGFyZ2V0cyArICIsIG1ldGFkYXRhPSIgKyBtZXRhZGF0YSArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIGNyZWF0aW9uVGltZT0iCisJCQkJKyBjcmVhdGlvblRpbWUgKyAiLCBtb2RpZmljYXRpb25UaW1lPSIgKyBtb2RpZmljYXRpb25UaW1lICsgIl0iOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVyaXZlZEZyb20oKSB7CisJCXJldHVybiBkZXJpdmVkRnJvbTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXJpdmVkRnJvbShTdHJpbmcgZGVyaXZlZEZyb20pIHsKKwkJdGhpcy5kZXJpdmVkRnJvbSA9IGRlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSGlnaGVzdFZlcnNpb24oKSB7CisJCXJldHVybiBoaWdoZXN0VmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIaWdoZXN0VmVyc2lvbihib29sZWFuIGlzTGF0ZXN0VmVyc2lvbikgeworCQl0aGlzLmhpZ2hlc3RWZXJzaW9uID0gaXNMYXRlc3RWZXJzaW9uOworCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1Byb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvUHJvZHVjdE1ldGFkYXRhRGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjA0NGMxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1Byb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZWxlbWVudHM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmNvbXBvbmVudHMuQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uIGV4dGVuZHMgQ29tcG9uZW50TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTg3NzU3NzIyNzI5MDc3MTE2MEw7CisKKwlwcml2YXRlIFN0cmluZyBmdWxsTmFtZTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbnRhY3RzOworCisJcHJpdmF0ZSBCb29sZWFuIGlzQWN0aXZlOworCisJcHVibGljIFByb2R1Y3RNZXRhZGF0YURhdGFEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBQcm9kdWN0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbihQcm9kdWN0TWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBvdGhlcikgeworCQlzdXBlcihvdGhlcik7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0SXNBY3RpdmUoKSB7CisJCXJldHVybiBpc0FjdGl2ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJc0FjdGl2ZShCb29sZWFuIGFjdGl2ZSkgeworCQlpc0FjdGl2ZSA9IGFjdGl2ZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRhY3RzKCkgeworCQlyZXR1cm4gY29udGFjdHM7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udGFjdHMoTGlzdDxTdHJpbmc+IGNvbnRhY3RzKSB7CisJCXRoaXMuY29udGFjdHMgPSBjb250YWN0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDb250YWN0KFN0cmluZyBjb250YWN0KSB7CisJCWlmIChjb250YWN0ICE9IG51bGwpIHsKKwkJCWlmIChjb250YWN0cyA9PSBudWxsKSB7CisJCQkJY29udGFjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCX0KKwkJCWNvbnRhY3RzLmFkZChjb250YWN0KTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7CisJCXJldHVybiBmdWxsTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGdWxsTmFtZShTdHJpbmcgZnVsbE5hbWUpIHsKKwkJdGhpcy5mdWxsTmFtZSA9IGZ1bGxOYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUHJvZHVjdE1ldGFkYXRhRGF0YURlZmluaXRpb24gW2Z1bGxOYW1lPSIgKyBmdWxsTmFtZSArICIsIGNvbnRhY3RzPSIgKyBjb250YWN0cyArICIsIGlzQWN0aXZlPSIKKwkJCQkrIGlzQWN0aXZlICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKKworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29udGFjdHMgPT0gbnVsbCkgPyAwIDogY29udGFjdHMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChmdWxsTmFtZSA9PSBudWxsKSA/IDAgOiBmdWxsTmFtZS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGlzQWN0aXZlID09IG51bGwpID8gMCA6IGlzQWN0aXZlLmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJUHJvZHVjdE1ldGFkYXRhRGF0YURlZmluaXRpb24gb3RoZXIgPSAoUHJvZHVjdE1ldGFkYXRhRGF0YURlZmluaXRpb24pIG9iajsKKwkJaWYgKGNvbnRhY3RzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb250YWN0cyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghY29udGFjdHMuZXF1YWxzKG90aGVyLmNvbnRhY3RzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGZ1bGxOYW1lID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5mdWxsTmFtZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghZnVsbE5hbWUuZXF1YWxzKG90aGVyLmZ1bGxOYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGlzQWN0aXZlID09IGlzQWN0aXZlKSB7CisJCQlpZiAob3RoZXIuaXNBY3RpdmUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIWlzQWN0aXZlLmVxdWFscyhvdGhlci5pc0FjdGl2ZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvUHJvcGVydHlEYXRhRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1Byb3BlcnR5RGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIyZjNlCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1Byb3BlcnR5RGF0YURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Nzk4Njg1NTU3NTI4NDMyMzg5TDsKKworCXByaXZhdGUgU3RyaW5nIHVuaXF1ZUlkOworCisJLy8gImJvb2xlYW4iLCAic3RyaW5nIiwgImZsb2F0IiwgImludGVnZXIiLCAidmVyc2lvbiIgfSkKKwlwcml2YXRlIFN0cmluZyB0eXBlOworCisJcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVkOworCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVmaW5pdGlvbiA9IGZhbHNlOworCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOworCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwcml2YXRlIFNjaGVtYURlZmluaXRpb24gc2NoZW1hOworCisJcHJpdmF0ZSBib29sZWFuIHBhc3N3b3JkOworCisJcHVibGljIFByb3BlcnR5RGF0YURlZmluaXRpb24oKSB7CisKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlEYXRhRGVmaW5pdGlvbihQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHApIHsKKwkJdGhpcy51bmlxdWVJZCA9IHAudW5pcXVlSWQ7CisJCXRoaXMucmVxdWlyZWQgPSBwLnJlcXVpcmVkOworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IHAuZGVmYXVsdFZhbHVlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gcC5kZXNjcmlwdGlvbjsKKwkJdGhpcy5zY2hlbWEgPSBwLnNjaGVtYTsKKwkJdGhpcy5wYXNzd29yZCA9IHAucGFzc3dvcmQ7CisJCXRoaXMudHlwZSA9IHAudHlwZTsKKwl9CisKKwkvLyBAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oYm9vbGVhbiBkZWZpbml0aW9uKSB7CisJCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIEJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKKwkJcmV0dXJuIHJlcXVpcmVkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpIHsKKwkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmQoKSB7CisJCXJldHVybiBwYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChib29sZWFuIHBhc3N3b3JkKSB7CisJCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU2NoZW1hRGVmaW5pdGlvbiBnZXRTY2hlbWEoKSB7CisJCXJldHVybiBzY2hlbWE7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYURlZmluaXRpb24gZW50cnlTY2hlbWEpIHsKKwkJdGhpcy5zY2hlbWEgPSBlbnRyeVNjaGVtYTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlByb3BlcnR5RGF0YURlZmluaXRpb24gW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIHR5cGU9IiArIHR5cGUgKyAiLCByZXF1aXJlZD0iICsgcmVxdWlyZWQKKwkJCQkrICIsIGRlZmF1bHRWYWx1ZT0iICsgZGVmYXVsdFZhbHVlICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsgIiwgZW50cnlTY2hlbWE9IiArIHNjaGVtYQorCQkJCSsgIiwgcGFzc3dvcmQ9IiArIHBhc3N3b3JkICsgIl0iOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQlpbnQgcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSA/IDAgOiBkZWZhdWx0VmFsdWUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKGRlZmluaXRpb24gPyAxMjMxIDogMTIzNyk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChkZXNjcmlwdGlvbiA9PSBudWxsKSA/IDAgOiBkZXNjcmlwdGlvbi5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAocGFzc3dvcmQgPyAxMjMxIDogMTIzNyk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChyZXF1aXJlZCA9PSBudWxsKSA/IDAgOiByZXF1aXJlZC5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHNjaGVtYSA9PSBudWxsKSA/IDAgOiBzY2hlbWEuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh0eXBlID09IG51bGwpID8gMCA6IHR5cGUuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1bmlxdWVJZCA9PSBudWxsKSA/IDAgOiB1bmlxdWVJZC5oYXNoQ29kZSgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJUHJvcGVydHlEYXRhRGVmaW5pdGlvbiBvdGhlciA9IChQcm9wZXJ0eURhdGFEZWZpbml0aW9uKSBvYmo7CisJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlZmF1bHRWYWx1ZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghZGVmYXVsdFZhbHVlLmVxdWFscyhvdGhlci5kZWZhdWx0VmFsdWUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZGVmaW5pdGlvbiAhPSBvdGhlci5kZWZpbml0aW9uKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLmRlc2NyaXB0aW9uICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFkZXNjcmlwdGlvbi5lcXVhbHMob3RoZXIuZGVzY3JpcHRpb24pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAocGFzc3dvcmQgIT0gb3RoZXIucGFzc3dvcmQpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChyZXF1aXJlZCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIucmVxdWlyZWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXJlcXVpcmVkLmVxdWFscyhvdGhlci5yZXF1aXJlZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChzY2hlbWEgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnNjaGVtYSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghc2NoZW1hLmVxdWFscyhvdGhlci5zY2hlbWEpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudHlwZSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghdHlwZS5lcXVhbHMob3RoZXIudHlwZSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh1bmlxdWVJZCA9PSBudWxsKSB7CisJCQlpZiAob3RoZXIudW5pcXVlSWQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXVuaXF1ZUlkLmVxdWFscyhvdGhlci51bmlxdWVJZCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9Qcm9wZXJ0eVJ1bGUuamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9Qcm9wZXJ0eVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWVmODVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1Byb3BlcnR5UnVsZS5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvbklnbm9yZTsKKworcHVibGljIGNsYXNzIFByb3BlcnR5UnVsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM1NzkzMzM4MjEyNDU5OTk5Nkw7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGT1JDRV9BTEwgPSAiRk9SQ0VfQUxMIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBTEwgPSAiQUxMIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSVUxFX0FOWV9NQVRDSCA9ICIuKyI7CisKKwlMaXN0PFN0cmluZz4gcnVsZTsKKwlTdHJpbmcgdmFsdWU7CisKKwlwdWJsaWMgUHJvcGVydHlSdWxlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBQcm9wZXJ0eVJ1bGUoTGlzdDxTdHJpbmc+IHJ1bGUsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcigpOworCQl0aGlzLnJ1bGUgPSBydWxlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSdWxlKCkgeworCQlyZXR1cm4gcnVsZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSdWxlKExpc3Q8U3RyaW5nPiBydWxlKSB7CisJCXRoaXMucnVsZSA9IHJ1bGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJQEpzb25JZ25vcmUKKwlwdWJsaWMgU3RyaW5nIGdldEZpcnN0VG9rZW4oKSB7CisJCXJldHVybiBnZXRUb2tlbigxKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRva2VuKGludCB0b2tlbk51bWJlcikgeworCisJCWludCBpbmRleCA9IHRva2VuTnVtYmVyIC0gMTsKKwkJaWYgKHJ1bGUgPT0gbnVsbCB8fCBpbmRleCA+PSBydWxlLnNpemUoKSB8fCBpbmRleCA8IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcmV0dXJuIHJ1bGUuZ2V0KGluZGV4KTsKKwl9CisKKwlASnNvbklnbm9yZQorCXB1YmxpYyBpbnQgZ2V0UnVsZVNpemUoKSB7CisJCWlmIChydWxlID09IG51bGwpIHsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBydWxlLnNpemUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlByb3BlcnR5UnVsZSBbcnVsZT0iICsgcnVsZSArICIsIHZhbHVlPSIgKyB2YWx1ZSArICJdIjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb21wYXJlUnVsZShQcm9wZXJ0eVJ1bGUgY29tcGFyZWRQcm9wZXJ0eVJ1bGUpIHsKKworCQlpZiAoY29tcGFyZWRQcm9wZXJ0eVJ1bGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJTGlzdDxTdHJpbmc+IGNvbXBhcmVkUnVsZSA9IGNvbXBhcmVkUHJvcGVydHlSdWxlLmdldFJ1bGUoKTsKKwkJaWYgKHJ1bGUgPT0gbnVsbCAmJiBjb21wYXJlZFJ1bGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAocnVsZSAhPSBudWxsICYmIGNvbXBhcmVkUnVsZSAhPSBudWxsKSB7CisJCQlpZiAocnVsZS5zaXplKCkgIT0gY29tcGFyZWRSdWxlLnNpemUoKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IHNpemUgPSBydWxlLnNpemUoKTsKKwkJCQlib29sZWFuIGlzRXF1YWwgPSB0cnVlOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJCVN0cmluZyBpdGVtID0gcnVsZS5nZXQoaSk7CisJCQkJCVN0cmluZyBjb21wYXJlZEl0ZW0gPSBjb21wYXJlZFJ1bGUuZ2V0KGkpOworCQkJCQlpZiAoaXRlbSA9PSBudWxsIHx8IGZhbHNlID09IGl0ZW0uZXF1YWxzKGNvbXBhcmVkSXRlbSkpIHsKKwkJCQkJCWlzRXF1YWwgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBpc0VxdWFsOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwl9CisKKwlwdWJsaWMgdm9pZCByZXBsYWNlRmlyc3RUb2tlbihTdHJpbmcgdG9rZW4pIHsKKworCQlpZiAocnVsZSAhPSBudWxsICYmIHJ1bGUuc2l6ZSgpID4gMCkgeworCQkJcnVsZS5zZXQoMCwgdG9rZW4pOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9SZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24uamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbGVtZW50cy9SZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjdjNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1JlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVsZW1lbnRzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTEwNDA0MzM1ODU5ODg4NDQ1OEw7CisKKwlwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJLyoqIElkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNhcGFiaWxpdHkuICovCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkU291cmNlVHlwZXM7CisKKwlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOworCisJcHJpdmF0ZSBMb25nIGNyZWF0aW9uVGltZTsKKworCXByaXZhdGUgTG9uZyBtb2RpZmljYXRpb25UaW1lOworCisJLy8gcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEZyb207CisKKwlwdWJsaWMgUmVsYXRpb25zaGlwVHlwZURhdGFEZWZpbml0aW9uKFJlbGF0aW9uc2hpcFR5cGVEYXRhRGVmaW5pdGlvbiBjZHQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy51bmlxdWVJZCA9IGNkdC5nZXRVbmlxdWVJZCgpOworCQl0aGlzLmRlc2NyaXB0aW9uID0gY2R0LmdldERlc2NyaXB0aW9uKCk7CisJCXRoaXMudHlwZSA9IGNkdC5nZXRUeXBlKCk7CisJCXRoaXMudmFsaWRTb3VyY2VUeXBlcyA9IGNkdC5nZXRWYWxpZFNvdXJjZVR5cGVzKCk7CisJCXRoaXMudmVyc2lvbiA9IGNkdC5nZXRWZXJzaW9uKCk7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gY2R0LmdldENyZWF0aW9uVGltZSgpOworCQl0aGlzLm1vZGlmaWNhdGlvblRpbWUgPSBjZHQuZ2V0TW9kaWZpY2F0aW9uVGltZSgpOworCX0KKworCXB1YmxpYyBSZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24oKSB7CisKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFZhbGlkU291cmNlVHlwZXMoKSB7CisJCXJldHVybiB2YWxpZFNvdXJjZVR5cGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbGlkU291cmNlVHlwZXMoTGlzdDxTdHJpbmc+IHZhbGlkU291cmNlVHlwZXMpIHsKKwkJdGhpcy52YWxpZFNvdXJjZVR5cGVzID0gdmFsaWRTb3VyY2VUeXBlczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgTG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisJCXJldHVybiBjcmVhdGlvblRpbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKExvbmcgY3JlYXRpb25UaW1lKSB7CisJCXRoaXMuY3JlYXRpb25UaW1lID0gY3JlYXRpb25UaW1lOworCX0KKworCXB1YmxpYyBMb25nIGdldE1vZGlmaWNhdGlvblRpbWUoKSB7CisJCXJldHVybiBtb2RpZmljYXRpb25UaW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblRpbWUoTG9uZyBtb2RpZmljYXRpb25UaW1lKSB7CisJCXRoaXMubW9kaWZpY2F0aW9uVGltZSA9IG1vZGlmaWNhdGlvblRpbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZWxhdGlvbnNoaXBUeXBlRGF0YURlZmluaXRpb24gW3VuaXF1ZUlkPSIgKyB1bmlxdWVJZCArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIHR5cGU9IgorCQkJCSsgdHlwZSArICIsIHZhbGlkU291cmNlVHlwZXM9IiArIHZhbGlkU291cmNlVHlwZXMgKyAiLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uICsgIiwgY3JlYXRpb25UaW1lPSIKKwkJCQkrIGNyZWF0aW9uVGltZSArICIsIG1vZGlmaWNhdGlvblRpbWU9IiArIG1vZGlmaWNhdGlvblRpbWUgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZWxlbWVudHMvU2NoZW1hRGVmaW5pdGlvbi5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1NjaGVtYURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ1YTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VsZW1lbnRzL1NjaGVtYURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbGVtZW50czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogU2NoZW1hIGFsbG93cyB0byBjcmVhdGUgbmV3IHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgYWxvbmcgVE9TQ0EgZGVmaW5pdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlbWFEZWZpbml0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcxMTc4OTEwODE5MDkzODA1NzdMOworCisJcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEZyb207CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29uc3RyYWludHM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGFEZWZpbml0aW9uPiBwcm9wZXJ0aWVzOworCisJcHJpdmF0ZSBQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BlcnR5OworCisJcHVibGljIFNjaGVtYURlZmluaXRpb24oKSB7CisKKwl9CisKKwlwdWJsaWMgU2NoZW1hRGVmaW5pdGlvbihTdHJpbmcgZGVyaXZlZEZyb20sIExpc3Q8U3RyaW5nPiBjb25zdHJhaW50cywKKwkJCU1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy5kZXJpdmVkRnJvbSA9IGRlcml2ZWRGcm9tOworCQl0aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7CisJCXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXJpdmVkRnJvbSgpIHsKKwkJcmV0dXJuIGRlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFByb3BlcnR5RGF0YURlZmluaXRpb24gcHJvcGVydHkpIHsKKwkJdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworCX0KKworCXB1YmxpYyBQcm9wZXJ0eURhdGFEZWZpbml0aW9uIGdldFByb3BlcnR5KCkgeworCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXJpdmVkRnJvbShTdHJpbmcgZGVyaXZlZEZyb20pIHsKKwkJdGhpcy5kZXJpdmVkRnJvbSA9IGRlcml2ZWRGcm9tOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29uc3RyYWludHMoKSB7CisJCXJldHVybiBjb25zdHJhaW50czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50cyhMaXN0PFN0cmluZz4gY29uc3RyYWludHMpIHsKKwkJdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzOworCX0KKworCXB1YmxpYyBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGFEZWZpbml0aW9uPiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YURlZmluaXRpb24+IHByb3BlcnRpZXMpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcga2V5LCBQcm9wZXJ0eURhdGFEZWZpbml0aW9uIHByb3BlcnR5KSB7CisKKwkJcHJvcGVydGllcy5wdXQoa2V5LCBwcm9wZXJ0eSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJZmluYWwgaW50IHByaW1lID0gMzE7CisJCWludCByZXN1bHQgPSAxOworCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoY29uc3RyYWludHMgPT0gbnVsbCkgPyAwIDogY29uc3RyYWludHMuaGFzaENvZGUoKSk7CisJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChkZXJpdmVkRnJvbSA9PSBudWxsKSA/IDAgOiBkZXJpdmVkRnJvbS5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHByb3BlcnRpZXMgPT0gbnVsbCkgPyAwIDogcHJvcGVydGllcy5oYXNoQ29kZSgpKTsKKwkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHByb3BlcnR5ID09IG51bGwpID8gMCA6IHByb3BlcnR5Lmhhc2hDb2RlKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorCQkJcmV0dXJuIGZhbHNlOworCQlTY2hlbWFEZWZpbml0aW9uIG90aGVyID0gKFNjaGVtYURlZmluaXRpb24pIG9iajsKKwkJaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5jb25zdHJhaW50cyAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghY29uc3RyYWludHMuZXF1YWxzKG90aGVyLmNvbnN0cmFpbnRzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGRlcml2ZWRGcm9tID09IG51bGwpIHsKKwkJCWlmIChvdGhlci5kZXJpdmVkRnJvbSAhPSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghZGVyaXZlZEZyb20uZXF1YWxzKG90aGVyLmRlcml2ZWRGcm9tKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnByb3BlcnRpZXMgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSBpZiAoIXByb3BlcnRpZXMuZXF1YWxzKG90aGVyLnByb3BlcnRpZXMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgeworCQkJaWYgKG90aGVyLnByb3BlcnR5ICE9IG51bGwpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKCFwcm9wZXJ0eS5lcXVhbHMob3RoZXIucHJvcGVydHkpKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlNjaGVtYURlZmluaXRpb24gWyIgKyAiZGVyaXZlZEZyb209JyIgKyBkZXJpdmVkRnJvbSArICIsIGNvbnN0cmFpbnRzPSIgKyBjb25zdHJhaW50cyArICIsIHByb3BlcnRpZXM9IgorCQkJCSsgcHJvcGVydGllcyArICIsIHByb3BlcnR5PSIgKyBwcm9wZXJ0eSArICddJzsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvQXNzZXRUeXBlRW51bS5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VudW1zL0Fzc2V0VHlwZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTMwNjcxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VudW1zL0Fzc2V0VHlwZUVudW0uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zOworCitwdWJsaWMgZW51bSBBc3NldFR5cGVFbnVtIHsKKwlSRVNPVVJDRVMoInJlc291cmNlcyIsICJSZXNvdXJjZSIpLCBTRVJWSUNFUygic2VydmljZXMiLCAiU2VydmljZSIpLCBQUk9EVUNUUygicHJvZHVjdHMiLCAiUHJvZHVjdCIpOworCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KCkgeworCQlyZXR1cm4gY29ycmVzcG9uZGluZ0NvbXBvbmVudDsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBjb3JyZXNwb25kaW5nQ29tcG9uZW50OworCisJcHJpdmF0ZSBBc3NldFR5cGVFbnVtKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGNvcnJlc3BvbmRpbmdDb21wb25lbnQpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLmNvcnJlc3BvbmRpbmdDb21wb25lbnQgPSBjb3JyZXNwb25kaW5nQ29tcG9uZW50OworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50VHlwZUVudW0gY29udmVydFRvQ29tcG9uZW50VHlwZUVudW0oU3RyaW5nIGFzc2V0VHlwZSkgeworCQlDb21wb25lbnRUeXBlRW51bSByZXQgPSBudWxsOworCQlmb3IgKEFzc2V0VHlwZUVudW0gY3VyciA6IEFzc2V0VHlwZUVudW0udmFsdWVzKCkpIHsKKwkJCWlmIChjdXJyLnZhbHVlLmVxdWFscyhhc3NldFR5cGUpKSB7CisJCQkJcmV0dXJuIENvbXBvbmVudFR5cGVFbnVtLmZpbmRCeVZhbHVlKGN1cnIuY29ycmVzcG9uZGluZ0NvbXBvbmVudCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbnVtcy9Db21wb25lbnRUeXBlRW51bS5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VudW1zL0NvbXBvbmVudFR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhMGI4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbnVtcy9Db21wb25lbnRUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zOworCitwdWJsaWMgZW51bSBDb21wb25lbnRUeXBlRW51bSB7CisJUkVTT1VSQ0UoIlJlc291cmNlIiksIFNFUlZJQ0UoIlNlcnZpY2UiKSwgUkVTT1VSQ0VfSU5TVEFOQ0UoIlJlc291cmNlIEluc3RhbmNlIiksIFBST0RVQ1QoIlByb2R1Y3QiKSwgU0VSVklDRV9JTlNUQU5DRSgiU2VydmljZSBJbnN0YW5jZSIpOworCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwlwcml2YXRlIENvbXBvbmVudFR5cGVFbnVtKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8vIFRob3NlIHZhbHVlcyBjYW5ub3QgYmUgYW5vdGhlciBmaWVsZCBpbiBlbnVtLCBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZAorCS8vIGFzIGNvbnN0YW50cyBmb3IgU3dhZ2dlciBhbGxvd2VkVmFsdWVzIHBhcmFtCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfUEFSQU1fTkFNRSA9ICJyZXNvdXJjZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUEFSQU1fTkFNRSA9ICJzZXJ2aWNlcyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9QQVJBTV9OQU1FID0gInByb2R1Y3RzIjsKKworCXB1YmxpYyBOb2RlVHlwZUVudW0gZ2V0Tm9kZVR5cGUoKSB7CisKKwkJc3dpdGNoICh0aGlzKSB7CisJCWNhc2UgUkVTT1VSQ0U6CisJCQlyZXR1cm4gTm9kZVR5cGVFbnVtLlJlc291cmNlOworCQljYXNlIFNFUlZJQ0U6CisJCQlyZXR1cm4gTm9kZVR5cGVFbnVtLlNlcnZpY2U7CisJCWNhc2UgUFJPRFVDVDoKKwkJCXJldHVybiBOb2RlVHlwZUVudW0uUHJvZHVjdDsKKwkJY2FzZSBSRVNPVVJDRV9JTlNUQU5DRToKKwkJCXJldHVybiBOb2RlVHlwZUVudW0uUmVzb3VyY2VJbnN0YW5jZTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm8gbm9kZVR5cGUgaXMgZGVmaW5lZCBmb3I6ICIgKyB0aGlzLmdldFZhbHVlKCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBDb21wb25lbnRUeXBlRW51bSBmaW5kQnlWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJQ29tcG9uZW50VHlwZUVudW0gcmV0ID0gbnVsbDsKKwkJZm9yIChDb21wb25lbnRUeXBlRW51bSBjdXJyIDogQ29tcG9uZW50VHlwZUVudW0udmFsdWVzKCkpIHsKKwkJCWlmIChjdXJyLmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlKSkgeworCQkJCXJldCA9IGN1cnI7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50VHlwZUVudW0gZmluZEJ5UGFyYW1OYW1lKFN0cmluZyBwYXJhbU5hbWUpIHsKKwkJQ29tcG9uZW50VHlwZUVudW0gcmV0ID0gbnVsbDsKKwkJc3dpdGNoIChwYXJhbU5hbWUpIHsKKwkJY2FzZSBSRVNPVVJDRV9QQVJBTV9OQU1FOgorCQkJcmV0ID0gUkVTT1VSQ0U7CisJCQlicmVhazsKKwkJY2FzZSBTRVJWSUNFX1BBUkFNX05BTUU6CisJCQlyZXQgPSBTRVJWSUNFOworCQkJYnJlYWs7CisJCWNhc2UgUFJPRFVDVF9QQVJBTV9OQU1FOgorCQkJcmV0ID0gUFJPRFVDVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUGFyYW1CeVR5cGUoQ29tcG9uZW50VHlwZUVudW0gdHlwZSkgeworCQlTdHJpbmcgcmV0ID0gbnVsbDsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgUkVTT1VSQ0U6CisJCQlyZXQgPSBSRVNPVVJDRV9QQVJBTV9OQU1FOworCQkJYnJlYWs7CisJCWNhc2UgU0VSVklDRToKKwkJCXJldCA9IFNFUlZJQ0VfUEFSQU1fTkFNRTsKKwkJCWJyZWFrOworCQljYXNlIFBST0RVQ1Q6CisJCQlyZXQgPSBQUk9EVUNUX1BBUkFNX05BTUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiByZXQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VudW1zL0ZpbHRlcktleUVudW0uamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbnVtcy9GaWx0ZXJLZXlFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4YWU3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbnVtcy9GaWx0ZXJLZXlFbnVtLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitwdWJsaWMgZW51bSBGaWx0ZXJLZXlFbnVtIHsKKwlTVUJfQ0FURUdPUlkoInN1YkNhdGVnb3J5IiksIENBVEVHT1JZKCJjYXRlZ29yeSIpLCBESVNUUklCVVRJT05fU1RBVFVTKCJkaXN0cmlidXRpb25TdGF0dXMiKTsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlGaWx0ZXJLZXlFbnVtKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbGxGaWx0ZXJzKCkgeworCQlyZXR1cm4gQXJyYXlzLnN0cmVhbShGaWx0ZXJLZXlFbnVtLnZhbHVlcygpKS5tYXAoZiAtPiBmLmdldE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRWYWxpZEZpbHRlcnNCeUFzc2V0VHlwZShDb21wb25lbnRUeXBlRW51bSBhc3NldFR5cGUpIHsKKwkJc3dpdGNoIChhc3NldFR5cGUpIHsKKwkJY2FzZSBSRVNPVVJDRToKKwkJCXJldHVybiBnZXRBbGxGaWx0ZXJzKCkuc3ViTGlzdCgwLCAyKTsKKwkJY2FzZSBTRVJWSUNFOgorCQkJcmV0dXJuIGdldEFsbEZpbHRlcnMoKS5zdWJMaXN0KDEsIDMpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbnVtcy9Hcm91cFR5cGVFbnVtLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvR3JvdXBUeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzgzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvR3JvdXBUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBlbnVtIEdyb3VwVHlwZUVudW0geworCVZGX01PRFVMRSgib3JnLm9wZW5lY29tcC5ncm91cHMuVmZNb2R1bGUiKSwgSEVBVF9TVEFDSygib3JnLm9wZW5lY29tcC5ncm91cHMuSGVhdFN0YWNrIik7CisKKwlwcml2YXRlIFN0cmluZyBncm91cFR5cGVOYW1lOworCisJR3JvdXBUeXBlRW51bShTdHJpbmcgZ3JvdXBUeXBlTmFtZSkgeworCQl0aGlzLmdyb3VwVHlwZU5hbWUgPSBncm91cFR5cGVOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIGdyb3VwVHlwZU5hbWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VudW1zL05vZGVUeXBlRW51bS5qYXZhIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvZGF0YXR5cGVzL2VudW1zL05vZGVUeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzhiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvTm9kZVR5cGVFbnVtLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtczsKKworcHVibGljIGVudW0gTm9kZVR5cGVFbnVtIHsKKwlVc2VyKCJ1c2VyIiksIAorCVNlcnZpY2UoInNlcnZpY2UiKSwgCisJUmVzb3VyY2UoInJlc291cmNlIiksIAorCVByb2R1Y3QoInByb2R1Y3QiKSwgCisJUmVzb3VyY2VDYXRlZ29yeSgicmVzb3VyY2VDYXRlZ29yeSIpLCAKKwlTZXJ2aWNlQ2F0ZWdvcnkoInNlcnZpY2VDYXRlZ29yeSIpLCAKKwlTZXJ2aWNlTmV3Q2F0ZWdvcnkoInNlcnZpY2VOZXdDYXRlZ29yeSIpLCAKKwlSZXNvdXJjZU5ld0NhdGVnb3J5KCJyZXNvdXJjZU5ld0NhdGVnb3J5IiksIAorCVByb2R1Y3RDYXRlZ29yeSgicHJvZHVjdENhdGVnb3J5IiksIAorCVJlc291cmNlU3ViY2F0ZWdvcnkoInJlc291cmNlU3ViY2F0ZWdvcnkiKSwgCisJUHJvZHVjdFN1YmNhdGVnb3J5KCJwcm9kdWN0U3ViY2F0ZWdvcnkiKSwgCisJUHJvZHVjdEdyb3VwaW5nKCJwcm9kdWN0R3JvdXBpbmciKSwgCisJVGFnKCJ0YWciKSwgCisJUHJvcGVydHkoInByb3BlcnR5IiksIAorCUF0dHJpYnV0ZSgiYXR0cmlidXRlIiksIAorCUNhcGFiaWxpdHlUeXBlKCJjYXBhYmlsaXR5VHlwZSIpLCAKKwlSZXF1aXJlbWVudCgicmVxdWlyZW1lbnQiKSwgCisJUmVsYXRpb25zaGlwVHlwZSgicmVsYXRpb25zaGlwVHlwZSIpLCAKKwlDYXBhYmlsaXR5KCJjYXBhYmlsaXR5IiksIAorCVJlcXVpcmVtZW50SW1wbCgicmVxdWlyZW1lbnRJbXBsIiksIAorCUNhcGFiaWxpdHlJbnN0KCJjYXBhYmlsaXR5SW5zdCIpLCAKKwlBdHRyaWJ1dGVWYWx1ZSgiYXR0cmlidXRlVmFsdWUiKSwgCisJSW5wdXRWYWx1ZSgiaW5wdXRWYWx1ZSIpLCAKKwlQcm9wZXJ0eVZhbHVlKCJwcm9wZXJ0eVZhbHVlIiksIAorCUxvY2tOb2RlKCJsb2NrTm9kZSIpLCAKKwlBcnRpZmFjdFJlZigiYXJ0aWZhY3RSZWYiKSwgCisJSW50ZXJmYWNlKCJpbnRlcmZhY2UiKSwgCisJSW50ZXJmYWNlT3BlcmF0aW9uKCJpbnRlcmZhY2VPcGVyYXRpb24iKSwgCisJUmVzb3VyY2VJbnN0YW5jZSgicmVzb3VyY2VJbnN0YW5jZSIpLCAKKwlSZWxhdGlvbnNoaXBJbnN0KCJyZWxhdGlvbnNoaXBJbnN0IiksIAorCUFkZGl0aW9uYWxJbmZvUGFyYW1ldGVycygiYWRkaXRpb25hbEluZm9QYXJhbWV0ZXJzIiksIAorCUNvbnN1bWVyQ3JlZGVudGlhbHMoImNvbnN1bWVyQ3JlZGVudGlhbHMiKSwgCisJSGVhdFBhcmFtZXRlcigiaGVhdFBhcmFtZXRlciIpLCAKKwlIZWF0UGFyYW1ldGVyVmFsdWUoImhlYXRQYXJhbWV0ZXJWYWx1ZSIpLCAKKwlEYXRhVHlwZSgiZGF0YVR5cGUiKSwgCisJR3JvdXBUeXBlKCJncm91cFR5cGUiKSwgCisJUG9saWN5VHlwZSgicG9saWN5VHlwZSIpLCAKKwlHcm91cCgiZ3JvdXAiKSwgCisJVXNlckZ1bmN0aW9uYWxNZW51KCJ1c2VyRnVuY3Rpb25hbE1lbnUiKSwgCisJSW5wdXQoImlucHV0Iik7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJTm9kZVR5cGVFbnVtKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE5vZGVUeXBlRW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChOb2RlVHlwZUVudW0gaW5zdCA6IE5vZGVUeXBlRW51bS52YWx1ZXMoKSkgeworCQkJaWYgKGluc3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiBpbnN0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgTm9kZVR5cGVFbnVtIGdldEJ5TmFtZUlnbm9yZUNhc2UoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChOb2RlVHlwZUVudW0gaW5zdCA6IE5vZGVUeXBlRW51bS52YWx1ZXMoKSkgeworCQkJaWYgKGluc3QuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKKwkJCQlyZXR1cm4gaW5zdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvT3JpZ2luVHlwZUVudW0uamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbnVtcy9PcmlnaW5UeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjNlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvT3JpZ2luVHlwZUVudW0uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zOworCitwdWJsaWMgZW51bSBPcmlnaW5UeXBlRW51bSB7CisJUFJPRFVDVCgiUHJvZHVjdCIsICJQcm9kdWN0IiwgInByb2R1Y3QgaW5zdGFuY2UiLCBDb21wb25lbnRUeXBlRW51bS5QUk9EVUNUKSwgCisJU0VSVklDRSgiU2VydmljZSIsICJTZXJ2aWNlIiwgInNlcnZpY2UgaW5zdGFuY2UiLCBDb21wb25lbnRUeXBlRW51bS5TRVJWSUNFKSwgCisJVkYoIlZGIiwgIlZGIChWaXJ0dWFsIEZ1bmN0aW9uKSIsICJyZXNvdXJjZSBpbnN0YW5jZSIsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKSwgCisJVkZDKCJWRkMiLCAiVkZDIChWaXJ0dWFsIEZ1bmN0aW9uIENvbXBvbmVudCkiLCJyZXNvdXJjZSBpbnN0YW5jZSIsQ29tcG9uZW50VHlwZUVudW0uUkVTT1VSQ0UpLAorCUNQKCJDUCIsICJDUCAoQ29ubmVjdGlvbiBQb2ludCkiLCAicmVzb3VyY2UgaW5zdGFuY2UiLCBDb21wb25lbnRUeXBlRW51bS5SRVNPVVJDRSksIAorCVZMKCJWTCIsICJWTCAoVmlydHVhbCBMaW5rKSIsICJyZXNvdXJjZSBpbnN0YW5jZSIsIENvbXBvbmVudFR5cGVFbnVtLlJFU09VUkNFKTsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCXByaXZhdGUgU3RyaW5nIGRpc3BsYXlWYWx1ZTsKKwlwcml2YXRlIFN0cmluZyBpbnN0YW5jZVR5cGU7CisJcHJpdmF0ZSBDb21wb25lbnRUeXBlRW51bSBjb21wb25lbnRUeXBlOworCisJcHJpdmF0ZSBPcmlnaW5UeXBlRW51bShTdHJpbmcgdmFsdWUsIFN0cmluZyBkaXNwbGF5VmFsdWUsIFN0cmluZyBpbnN0YW5jZVR5cGUsIENvbXBvbmVudFR5cGVFbnVtIGNvbXBvbmVudFR5cGUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLmRpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTsKKwkJdGhpcy5pbnN0YW5jZVR5cGUgPSBpbnN0YW5jZVR5cGU7CisJCXRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKCkgeworCQlyZXR1cm4gZGlzcGxheVZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFuY2VUeXBlKCkgeworCQlyZXR1cm4gaW5zdGFuY2VUeXBlOworCX0KKworCXB1YmxpYyBDb21wb25lbnRUeXBlRW51bSBnZXRDb21wb25lbnRUeXBlKCkgeworCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE9yaWdpblR5cGVFbnVtIGZpbmRCeVZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQlPcmlnaW5UeXBlRW51bSByZXQgPSBudWxsOworCQlmb3IgKE9yaWdpblR5cGVFbnVtIGN1cnIgOiBPcmlnaW5UeXBlRW51bS52YWx1ZXMoKSkgeworCQkJaWYgKGN1cnIuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWUpKSB7CisJCQkJcmV0ID0gY3VycjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0OworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL2RhdGF0eXBlcy9lbnVtcy9SZXNvdXJjZVR5cGVFbnVtLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvUmVzb3VyY2VUeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjRhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS9kYXRhdHlwZXMvZW51bXMvUmVzb3VyY2VUeXBlRW51bS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXM7CisKK3B1YmxpYyBlbnVtIFJlc291cmNlVHlwZUVudW0geworCisJVkZDKCJWRkMgKFZpcnR1YWwgRnVuY3Rpb24gQ29tcG9uZW50KSIpLCAKKwlWRigiVkYiLyogKFZpcnR1YWwgRnVuY3Rpb24pIiAqLyksIAorCUNQKCJDUCAoQ29ubmVjdGlvbiBQb2ludCkiKSwgCisJVkwoIlZMIChWaXJ0dWFsIExpbmspIik7CisKKwlTdHJpbmcgdmFsdWU7CisKKwlwcml2YXRlIFJlc291cmNlVHlwZUVudW0oU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyB0eXBlKSB7CisKKwkJZm9yIChSZXNvdXJjZVR5cGVFbnVtIGUgOiBSZXNvdXJjZVR5cGVFbnVtLnZhbHVlcygpKSB7CisJCQlpZiAoZS5uYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3V0aWxzL0NvbW1vbkJlVXRpbHMuamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3V0aWxzL0NvbW1vbkJlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE1NTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uLWJlL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXRpbHMvQ29tbW9uQmVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS51dGlsczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQ29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgQ29tbW9uQmVVdGlscyB7CisJLyoqCisJICogQ29tcGFyZXMgdHdvIEFTREMgdmVyc2lvbnMgb2YgYSBjb21wb25lbnQuIEl0J3MgZm9yIGludGVybmFsIHVzYWdlLCBzbworCSAqIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIHZlcnNpb25zIGFyZSBpbiB2YWxpZCBmb3JtYXQuCisJICogCisJICogQHBhcmFtIGZpcnN0VmVyc2lvbgorCSAqICAgICAgICAgICAgLSB2ZXJzaW9uIGluIGZvcm1hdCBtYWpvci5taW5vciBvciBqdXN0IG1ham9yIChlLmcsIDIuMCBvciAyKQorCSAqIEBwYXJhbSBzZWNvbmRWZXJzaW9uCisJICogICAgICAgICAgICAtIHZlcnNpb24gaW4gZm9ybWF0IG1ham9yLm1pbm9yIG9yIGp1c3QgbWFqb3IgKGUuZywgMi4wIG9yIDIpCisJICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmOjxicj4KKwkgKiAgICAgICAgIDEpIGZpcnN0IHZlcnNpb24ncyBtYWpvciBudW1iZXIgaXMgaGlnaGVyIHRoYW4gc2Vjb25kJ3MgKGUuZy4sCisJICogICAgICAgICBmaXJzdFZlcnNpb24gPSAxLjEsIHNlY29uZFZlcnNpb24gPSAwLjMpPGJyPgorCSAqICAgICAgICAgMikgbWFqb3IgdmVyc2lvbiBhcmUgZXF1YWwsIGJ1dCBmaXJzdCdzIG1pbm9yIHZlcnNpb24gaXMgaGlnaGVyCisJICogICAgICAgICB0aGFuIHNlY29uZCdzIChlLmcuLCBmaXJzdFZlcnNpb24gPSAwLjEwLCBzZWNvbmRWZXJzaW9uID0gMC45KQorCSAqICAgICAgICAgPGJyPgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlQXNkY0NvbXBvbmVudFZlcnNpb25zKFN0cmluZyBmaXJzdFZlcnNpb24sIFN0cmluZyBzZWNvbmRWZXJzaW9uKSB7CisJCVN0cmluZ1tdIGZpcnN0VmVyc2lvbk51bXMgPSBmaXJzdFZlcnNpb24uc3BsaXQoIlxcLiIpOworCQlTdHJpbmdbXSBzZWNvbmRWZXJzaW9uTnVtcyA9IHNlY29uZFZlcnNpb24uc3BsaXQoIlxcLiIpOworCQlpbnQgZmlyc3RNYWpvciA9IEludGVnZXIucGFyc2VJbnQoZmlyc3RWZXJzaW9uTnVtc1swXSk7CisJCWludCBzZWNvbmRNYWpvciA9IEludGVnZXIucGFyc2VJbnQoc2Vjb25kVmVyc2lvbk51bXNbMF0pOworCQlpbnQgY29tcGFyZVJlcyA9IEludGVnZXIuY29tcGFyZShmaXJzdE1ham9yLCBzZWNvbmRNYWpvcik7CisJCWlmIChjb21wYXJlUmVzID09IDApIHsKKwkJCWludCBmaXJzdE1pbm9yID0gKGZpcnN0VmVyc2lvbk51bXMubGVuZ3RoID09IDIgPyBJbnRlZ2VyLnBhcnNlSW50KGZpcnN0VmVyc2lvbk51bXNbMV0pIDogMCk7CisJCQlpbnQgc2Vjb25kTWlub3IgPSAoc2Vjb25kVmVyc2lvbk51bXMubGVuZ3RoID09IDIgPyBJbnRlZ2VyLnBhcnNlSW50KHNlY29uZFZlcnNpb25OdW1zWzFdKSA6IDApOworCQkJY29tcGFyZVJlcyA9IEludGVnZXIuY29tcGFyZShmaXJzdE1pbm9yLCBzZWNvbmRNaW5vcik7CisJCQlyZXR1cm4gKGNvbXBhcmVSZXMgPiAwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAoY29tcGFyZVJlcyA+IDApOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVUb3NjYVJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VUeXBlLCBTdHJpbmcgcmVzb3VyY2VTeXN0ZW1OYW1lKSB7CisJCXJldHVybiBDb25zdGFudHMuVVNFUl9ERUZJTkVEX1JFU09VUkNFX05BTUVTUEFDRV9QUkVGSVggKyByZXNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKSArICIuIiArIHJlc291cmNlU3lzdGVtTmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3dvcmtlcnMvSm9iLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL0pvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTI5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL0pvYi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS53b3JrZXJzOworCisvKioKKyAqIENyZWF0ZWQgYnkgbWljaGFlbCBvbiA2LzI0LzIwMTYuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKb2I8RT4geworCXB1YmxpYyBhYnN0cmFjdCBFIGRvV29yaygpOworCit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL01haW4uamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3dvcmtlcnMvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmJjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL01haW4uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUud29ya2VyczsKKworLyoqCisgKiBDcmVhdGVkIGJ5IG1pY2hhZWwgb24gNi8yNC8yMDE2LgorICovCitwdWJsaWMgY2xhc3MgTWFpbiB7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisKKwkJTWFuYWdlciBtYW5nZXIgPSBuZXcgTWFuYWdlcigpOworCQltYW5nZXIuaW5pdCgyKTsKKwkJbWFuZ2VyLmFkZEpvYihuZXcgSm9iKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGRvV29yaygpIHsKKwkJCQlyZXR1cm4gImdvIjsKKwkJCX0KKwkJfSk7CisJCW1hbmdlci5hZGRKb2IobmV3IEpvYigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBkb1dvcmsoKSB7CisJCQkJcmV0dXJuICJnbyBnbyI7CisJCQl9CisJCX0pOworCQkvLyB0cnkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4obWFuZ2VyLnN0YXJ0KCkpOworCQkvLyB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCS8vIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL01hbmFnZXIuamF2YSBiL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3dvcmtlcnMvTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDJjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuYmUud29ya2VyczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CisKKy8qKgorICogQ3JlYXRlZCBieSBtaWNoYWVsIG9uIDYvMjQvMjAxNi4KKyAqLworcHVibGljIGNsYXNzIE1hbmFnZXI8VCBleHRlbmRzIEpvYiwgRT4geworCXByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisJcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisJcHJpdmF0ZSBMaW5rZWRCbG9ja2luZ1F1ZXVlPFQ+IGlucHV0UXVldWU7CisJcHJpdmF0ZSBMaW5rZWRCbG9ja2luZ1F1ZXVlPEU+IG91dHB1dFF1ZXVlOworCXByaXZhdGUgaW50IG51bWJlck9mV29ya2VyczsKKworCXB1YmxpYyB2b2lkIGluaXQoaW50IG51bWJlck9mV29ya2VycykgeworCQlsb2cuZGVidWcoImluaXRpYWxpemluZyB3b3JrZXJzLCBjcmVhdGluZyB7fSB3b3JrZXJzIiwgbnVtYmVyT2ZXb3JrZXJzKTsKKwkJdGhpcy5udW1iZXJPZldvcmtlcnMgPSBudW1iZXJPZldvcmtlcnM7CisJCWZpbmFsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldE5hbWVGb3JtYXQoIldvcmtlci0lZCIpLmJ1aWxkKCk7CisJCXRoaXMuZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKG51bWJlck9mV29ya2VycywgdGhyZWFkRmFjdG9yeSk7CisJCXRoaXMuaW5wdXRRdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFQ+KCk7CisJCXRoaXMub3V0cHV0UXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxFPigpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZEpvYihUIGpvYikgeworCQlsb2cudHJhY2UoImpvYiBhZGQgdG8gaW5wdXQgcXVldWUiKTsKKwkJdGhpcy5pbnB1dFF1ZXVlLmFkZChqb2IpOworCX0KKworCXB1YmxpYyBMaW5rZWRCbG9ja2luZ1F1ZXVlPEU+IHN0YXJ0KCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mV29ya2VyczsgaSsrKSB7CisJCQlTdHJpbmcgd29ya2VyTmFtZSA9ICJ3b3JrZXItIiArIGk7CisJCQlsb2cuZGVidWcoInN0YXJ0aW5nIHdvcmtlcjp7fSIsIHdvcmtlck5hbWUpOworCQkJdGhpcy5leGVjdXRvci5zdWJtaXQobmV3IFdvcmtlcih3b3JrZXJOYW1lLCB0aGlzLmlucHV0UXVldWUsIHRoaXMub3V0cHV0UXVldWUpKTsKKwkJfQorCQlleGVjdXRvci5zaHV0ZG93bigpOworCQl0cnkgeworCQkJaWYgKCFleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDMwLCBUaW1lVW5pdC5NSU5VVEVTKSkgeworCQkJCWxvZy5lcnJvcigidGltZXIgZWxhcHNlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgd29ya2VyJ3MgdG8gZmluaXNoLiAiKTsKKwkJCX0KKwkJCWxvZy5kZWJ1ZygiYWxsIHdvcmtlcnMgZmluaXNoZWQiKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKCJmYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IiLCBlKTsKKwkJfQorCQlyZXR1cm4gb3V0cHV0UXVldWU7CisJfQorCisJLy8KKwkvLyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJLy8gRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChOVEhSRURTKTsKKwkvLyBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSsrKSB7CisJLy8gUnVubmFibGUgd29ya2VyID0gbmV3IE15UnVubmFibGUoMTAwMDAwMDBMICsgaSk7CisJLy8gZXhlY3V0b3IuZXhlY3V0ZSh3b3JrZXIpOworCS8vIH0KKwkvLyAvLyBUaGlzIHdpbGwgbWFrZSB0aGUgZXhlY3V0b3IgYWNjZXB0IG5vIG5ldyB0aHJlYWRzCisJLy8gLy8gYW5kIGZpbmlzaCBhbGwgZXhpc3RpbmcgdGhyZWFkcyBpbiB0aGUgcXVldWUKKwkvLyBleGVjdXRvci5zaHV0ZG93bigpOworCS8vIC8vIFdhaXQgdW50aWwgYWxsIHRocmVhZHMgYXJlIGZpbmlzaAorCS8vIGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oKTsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmlzaGVkIGFsbCB0aHJlYWRzIik7CisJLy8gfQorCS8vIH0KK30KZGlmZiAtLWdpdCBhL2NvbW1vbi1iZS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3dvcmtlcnMvV29ya2VyLmphdmEgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL1dvcmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYmU0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24tYmUvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9iZS93b3JrZXJzL1dvcmtlci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5iZS53b3JrZXJzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuY29uZmlnLkJlRWNvbXBFcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQ3JlYXRlZCBieSBtaWNoYWVsIG9uIDYvMjQvMjAxNi4KKyAqLworcHVibGljIGNsYXNzIFdvcmtlcjxUIGV4dGVuZHMgSm9iPEU+LCBFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworCXByaXZhdGUgU3RyaW5nIHdvcmtlck5hbWU7CisJcHJpdmF0ZSBMaW5rZWRCbG9ja2luZ1F1ZXVlPFQ+IGlucHV0UXVldWU7CisKKwlwcml2YXRlIExpbmtlZEJsb2NraW5nUXVldWU8RT4gb3V0cHV0UXVldWU7CisKKwlwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoV29ya2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKwlwdWJsaWMgV29ya2VyKFN0cmluZyB3b3JrZXJOYW1lLCBMaW5rZWRCbG9ja2luZ1F1ZXVlPFQ+IGlucHV0UXVldWUsIExpbmtlZEJsb2NraW5nUXVldWU8RT4gb3V0cHV0UXVldWUpIHsKKwkJdGhpcy53b3JrZXJOYW1lID0gd29ya2VyTmFtZTsKKwkJdGhpcy5pbnB1dFF1ZXVlID0gaW5wdXRRdWV1ZTsKKwkJdGhpcy5vdXRwdXRRdWV1ZSA9IG91dHB1dFF1ZXVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQl0cnkgeworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlsb2cudHJhY2UoIndvcmtlcjp7fSBkb2luZyB3b3JrIiwgd29ya2VyTmFtZSk7CisJCQkJVCBqb2IgPSBpbnB1dFF1ZXVlLnBvbGwoNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCQkJCWlmIChqb2IgPT0gbnVsbCkgeworCisJCQkJCWxvZy5kZWJ1Zygid29ya2VyOnt9IG5vdGhpbmcgdG8gZG8iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXRoaXMub3V0cHV0UXVldWUucHV0KGpvYi5kb1dvcmsoKSk7CisJCQkJbG9nLnRyYWNlKCJ3b3JrZXI6e30gZG9uZSB3aXRoIHdvcmsiLCB3b3JrZXJOYW1lKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUJlRWNvbXBFcnJvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2dJbnRlcm5hbEZsb3dFcnJvcigiZXhlY3V0aW5nSm9iRmFpbGVkIiwKKwkJCQkJImZhaWxlZCBkdXJpbmcgam9iIGV4ZWN1dGlvbiB3b3JrZXIiICsgd29ya2VyTmFtZSwgQmVFY29tcEVycm9yTWFuYWdlci5FcnJvclNldmVyaXR5LkVSUk9SKTsKKwkJCWxvZy5kZWJ1Zygid29ya2VyOiIgKyB3b3JrZXJOYW1lICsgIiBub3RoaW5nIHRvIGRvIHN0b3BpbmciLCBlKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvY29tbW9uLWJlL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvYmUvdXRpbHMvQ29tbW9uQmVVdGlsc1Rlc3QuamF2YSBiL2NvbW1vbi1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3V0aWxzL0NvbW1vbkJlVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzNTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi1iZS9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2JlL3V0aWxzL0NvbW1vbkJlVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmJlLnV0aWxzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLnV0aWxzLkNvbW1vbkJlVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBDb21tb25CZVV0aWxzVGVzdCB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlQXNkY0NvbXBvbmVudFZlcnNpb25zKCkgeworCisJCWFzc2VydFRydWUoQ29tbW9uQmVVdGlscy5jb21wYXJlQXNkY0NvbXBvbmVudFZlcnNpb25zKCIxLjEiLCAiMC4xNSIpKTsKKwkJYXNzZXJ0RmFsc2UoQ29tbW9uQmVVdGlscy5jb21wYXJlQXNkY0NvbXBvbmVudFZlcnNpb25zKCIwLjUiLCAiMC41IikpOworCQlhc3NlcnRGYWxzZShDb21tb25CZVV0aWxzLmNvbXBhcmVBc2RjQ29tcG9uZW50VmVyc2lvbnMoIjAuNSIsICIwLjYiKSk7CisJCWFzc2VydEZhbHNlKENvbW1vbkJlVXRpbHMuY29tcGFyZUFzZGNDb21wb25lbnRWZXJzaW9ucygiMS41IiwgIjIuNiIpKTsKKwkJYXNzZXJ0VHJ1ZShDb21tb25CZVV0aWxzLmNvbXBhcmVBc2RjQ29tcG9uZW50VmVyc2lvbnMoIjAuMTAiLCAiMC4xIikpOworCQlhc3NlcnRGYWxzZShDb21tb25CZVV0aWxzLmNvbXBhcmVBc2RjQ29tcG9uZW50VmVyc2lvbnMoIjEiLCAiMS4wIikpOworCQlhc3NlcnRUcnVlKENvbW1vbkJlVXRpbHMuY29tcGFyZUFzZGNDb21wb25lbnRWZXJzaW9ucygiMiIsICIxLjE1IikpOworCX0KK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS8uZ2l0aWdub3JlIGIvZGlzdHJpYnV0aW9uLWNpLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzYzE3MgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKy9iaW4vCmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24tY2kvZXRjL2FzZGMtY2xpZW50LmprcyBiL2Rpc3RyaWJ1dGlvbi1jaS9ldGMvYXNkYy1jbGllbnQuamtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMGEwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmlidXRpb24tY2kvZXRjL2FzZGMtY2xpZW50LmprcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24tY2kvZXRjL2FzZGNjbGllbnRzdG9yZS5qa3MgYi9kaXN0cmlidXRpb24tY2kvZXRjL2FzZGNjbGllbnRzdG9yZS5qa3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjMDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS9ldGMvYXNkY2NsaWVudHN0b3JlLmprcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24tY2kvbG9nNGoucHJvcGVydGllcyBiL2Rpc3RyaWJ1dGlvbi1jaS9sb2c0ai5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjJjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmlidXRpb24tY2kvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDE3IEBACitsb2c0ai5yb290Q2F0ZWdvcnk9REVCVUcsIENPTlNPTEUsIExPR0ZJTEUKKyAKK2xvZzRqLmxvZ2dlci5vcmcub3BlbmVjb21wLnNkYz1UUkFDRSwgQ09OU09MRSwgTE9HRklMRQorCisjIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4KK2xvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JXAgJWR7eXl5eS1NTS1kZCBISDptbTpzcy5TU1MgWn0gJWN7MX0gLSAlbSVuCisgCisjIExPR0ZJTEUgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuCitsb2c0ai5hcHBlbmRlci5MT0dGSUxFPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWxvZ3Mvd29yZG5pay5sb2cKK2xvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuQXBwZW5kPXRydWUKK2xvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JXAgJWR7eXl5eS1NTS1kZCBISDptbTpzcy5TU1MgWn0gJWN7MX0gLSAlbSVuCitsb2c0ai5hcHBlbmRlci5MT0dGSUxFLk1heEZpbGVTaXplPTEwTUIKK2xvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuTWF4QmFja3VwSW5kZXg9MTAKZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS9wb20ueG1sIGIvZGlzdHJpYnV0aW9uLWNpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MGEzNAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS9wb20ueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjLnNkYy1tYWluPC9ncm91cElkPgorCTxhcnRpZmFjdElkPmRpc3RyaWJ1dGlvbi1jaTwvYXJ0aWZhY3RJZD4KKworCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5zZGMtbWFpbjwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MTYxMC4xLjM8L3ZlcnNpb24+CisJPC9wYXJlbnQ+CisKKworCisJPGRlcGVuZGVuY2llcz4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmpzb248L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qc29uPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MjAxMzEwMTg8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5zZGMtZGlzdHJpYnV0aW9uLWNsaWVudDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmFzZGMtdGVzdHM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2FzZGMuZnVsbC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PiAKKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmp1bml0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCTwvZGVwZW5kZW5jaWVzPgorCisJPGJ1aWxkPgorCQk8cGx1Z2lucz4KKworCQkJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCTwhLS0gU2V0IHRoZSBKREsgY29tcGlsZXIgdmVyc2lvbi4gLS0+CisJCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgorCQkJCTxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c291cmNlPjEuODwvc291cmNlPgorCQkJCQk8dGFyZ2V0PjEuODwvdGFyZ2V0PgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorCQk8L3BsdWdpbnM+CisJPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvdGVzdC9CYXNlSW5pdC5qYXZhIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC90ZXN0L0Jhc2VJbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1NmIzNQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvdGVzdC9CYXNlSW5pdC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAudGVzdDsKKworLy9pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKy8vaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisvLworLy9pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKy8vCisvL2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworLy9pbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworLy8KKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuU2VydmljZUNhdGVnb3JpZXNFbnVtOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworLy8vL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NiYXNlVGVzdDsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRJbnN0YW5jZVJlcURldGFpbHM7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5BcnRpZmFjdFV0aWxzOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlsczsKKy8vLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuUmVzb3VyY2VVdGlsczsKKy8vLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuU2VydmljZVV0aWxzOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkFydGlmYWN0UmVzdFV0aWxzOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNvdXJjZVJlc3RVdGlsczsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VJbml0IHsKKworCQorLy8JcHJvdGVjdGVkIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisvLwlwcm90ZWN0ZWQgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczE7CisvLwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHM7CisvLwlwcm90ZWN0ZWQgU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMyOworLy8JcHJvdGVjdGVkIENvbXBvbmVudEluc3RhbmNlUmVxRGV0YWlscyByZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlsczsKKy8vCXByb3RlY3RlZCBDb21wb25lbnRJbnN0YW5jZVJlcURldGFpbHMgcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMyOworLy8JcHJvdGVjdGVkIFVzZXIgc2RuY0Rlc2lnbmVyRGV0YWlsczE7CisvLwlwcm90ZWN0ZWQgVXNlciBzZG5jVGVzdGVyRGVhdGFpbHMxOworLy8JcHJvdGVjdGVkIFVzZXIgc2RuY0FkbWluRGV0YWlsczE7CisvLwlwcm90ZWN0ZWQgQXJ0aWZhY3RSZXFEZXRhaWxzIGhlYXRBcnRpZmFjdERldGFpbHM7CisvLwkKKy8vCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgZGVmYXVsdEFydGlmYWN0RGV0YWlsczsKKy8vCS8vcHJvdGVjdGVkIFJlc291cmNlVXRpbHMgcmVzb3VyY2VVdGlsczsKKy8vCXByb3RlY3RlZCBBcnRpZmFjdFV0aWxzIGFydGlmYWN0VXRpbHM7CisvLwkKKy8vCQorLy8JLy9zdGF0aWMgU2VydmljZVV0aWxzIHNlcnZpY2VVdGlscyA9IG5ldyBTZXJ2aWNlVXRpbHMoKTsKKy8vCXB1YmxpYyBCYXNlSW5pdChUZXN0TmFtZSB0ZXN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworLy8JCXN1cGVyKHRlc3ROYW1lLCBjbGFzc05hbWUpOworLy8JfQorLy8JQEJlZm9yZQorLy8JcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKy8vCisvLwkJaW5pdGlhbGl6ZU1lbWJlcnMoKTsKKy8vCQkKKy8vCQljcmVhdGVDb21wb25lbnRzKCk7CisvLwkKKy8vCX0KKy8vCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZW1iZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworLy8JCQorLy8JCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworLy8JCXJlc291cmNlRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoInNlY29uZFJlc291cmNlIiwgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QpOworLy8JCXNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKy8vCQlzZXJ2aWNlRGV0YWlsczIgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgibmV3VGVzdFNlcnZpY2UyIiwgU2VydmljZUNhdGVnb3JpZXNFbnVtLk1PQklMSVRZLCAiYWwxOTc2Iik7CisvLwkJc2RuY0Rlc2lnbmVyRGV0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uREVTSUdORVIpOworLy8JCXNkbmNUZXN0ZXJEZWF0YWlsczEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0VXNlcihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKy8vCQlzZG5jQWRtaW5EZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRVc2VyKFVzZXJSb2xlRW51bS5BRE1JTik7CisvLwkJaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworLy8JCXJlc291cmNlSW5zdGFuY2VSZXFEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKCk7CisvLwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMyID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdENvbXBvbmVudEluc3RhbmNlKCk7CisvLwkJCisvLwl9CisvLwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKy8vCQkKKy8vLy8JCUNyZWF0ZSByZXNvdXJjZXMKKy8vCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsJCQorLy8JCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkscmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKy8vCQlhc3NlcnROb3ROdWxsKCJyZXNvdXJjZSB1bmlxdWVJZCBpcyBudWxsOiIsIHJlc291cmNlRGV0YWlscy5nZXRVbmlxdWVJZCgpKTsKKy8vCisvLwkJcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZURldGFpbHMxLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CQkKKy8vCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisvLwkJYXNzZXJ0Tm90TnVsbCgicmVzb3VyY2UgdW5pcXVlSWQgaXMgbnVsbDoiLCByZXNvdXJjZURldGFpbHMxLmdldFVuaXF1ZUlkKCkpOworLy8JCQorLy8vLwkJQ3JlYXRlIHNlcnZpY2VzCisvLwkJcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMsIHNkbmNEZXNpZ25lckRldGFpbHMxKTsJCQorLy8JCWFzc2VydFRydWUoImNyZWF0ZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkscmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAxKTsKKy8vCQlhc3NlcnROb3ROdWxsKCJzZXJ2aWNlIHVuaXF1ZUlkIGlzIG51bGw6Iiwgc2VydmljZURldGFpbHMuZ2V0VW5pcXVlSWQoKSk7CisvLwkJCisvLwkJcmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZURldGFpbHMyLCBzZG5jRGVzaWduZXJEZXRhaWxzMSk7CQkKKy8vCQlhc3NlcnRUcnVlKCJjcmVhdGUgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMSk7CisvLwkJYXNzZXJ0Tm90TnVsbCgic2VydmljZSB1bmlxdWVJZCBpcyBudWxsOiIsIHNlcnZpY2VEZXRhaWxzMi5nZXRVbmlxdWVJZCgpKTsKKy8vCQkKKy8vCQlBcnRpZmFjdFJlcURldGFpbHMgaGVhdEFydGlmYWN0RGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworLy8JCXJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzLCBzZG5jRGVzaWduZXJEZXRhaWxzMSwgcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworLy8JCWFzc2VydFRydWUoImFkZCBIRUFUIGFydGlmYWN0IHRvIHJlc291cmNlIHJlcXVlc3QgcmV0dXJuZWQgc3RhdHVzOiIgKyByZXNwb25zZS5nZXRFcnJvckNvZGUoKSxyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworLy8JCQorLy8JCUFydGlmYWN0UmVxRGV0YWlscyBoZWF0QXJ0aWZhY3REZXRhaWxzMSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHREZXBsb3ltZW50QXJ0aWZhY3RGb3JUeXBlKEFydGlmYWN0VHlwZUVudW0uSEVBVC5nZXRUeXBlKCkpOworLy8JCXJlc3BvbnNlID0gQXJ0aWZhY3RSZXN0VXRpbHMuYWRkSW5mb3JtYXRpb25hbEFydGlmYWN0VG9SZXNvdXJjZShoZWF0QXJ0aWZhY3REZXRhaWxzMSwgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHJlc291cmNlRGV0YWlsczEuZ2V0VW5pcXVlSWQoKSk7CisvLwkJYXNzZXJ0VHJ1ZSgiYWRkIEhFQVQgYXJ0aWZhY3QgdG8gcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisvLwkJCisvLwkJLy8gY2VydGlmaWVkIHJlc291cmNlcworLy8vLwkJcmVzcG9uc2UgPSBMQ1NiYXNlVGVzdC5jZXJ0aWZ5UmVzb3VyY2UocmVzb3VyY2VEZXRhaWxzKTsKKy8vLy8JCWFzc2VydFRydWUoImNlcnRpZnkgcmVzb3VyY2UgcmVxdWVzdCByZXR1cm5lZCBzdGF0dXM6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisvLy8vCQkKKy8vLy8JCXJlc3BvbnNlID0gTENTYmFzZVRlc3QuY2VydGlmeVJlc291cmNlKHJlc291cmNlRGV0YWlsczEpOworLy8vLwkJYXNzZXJ0VHJ1ZSgiY2VydGlmeSByZXNvdXJjZSByZXF1ZXN0IHJldHVybmVkIHN0YXR1czoiICsgcmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkscmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKy8vLy8JCQorLy8vLwkJYWRkIHJlc291cmNlIGluc3RhbmNlIHdpdGggSEVBVCBkZXBsb3ltZW50IGFydGlmYWN0IHRvIHRoZSBzZXJ2aWNlCisvLwkJcmVzb3VyY2VJbnN0YW5jZVJlcURldGFpbHMuc2V0VW5pcXVlSWQocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworLy8vLwkJcmVzcG9uc2UgPSBTZXJ2aWNlVXRpbHMuY3JlYXRlUmVzb3VyY2VJbnN0YW5jZShyZXNvdXJjZUluc3RhbmNlUmVxRGV0YWlscywgc2RuY0Rlc2lnbmVyRGV0YWlsczEsIHNlcnZpY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCkpOworLy8vLwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZDogIiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisvLwkJCisvLwkJRGJVdGlscy5jbGVhbkFsbEF1ZGl0cygpOworLy8JCisvLwkKKy8vCX0KKwkKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvdGVzdC9DYWxsYWJsZVRhc2suamF2YSBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvdGVzdC9DYWxsYWJsZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTRmZTlhCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC90ZXN0L0NhbGxhYmxlVGFzay5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC50ZXN0OworCisvL2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKKy8vCisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hcGkuSURpc3RyaWJ1dGlvbkNsaWVudDsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5yZXN1bHRzLklEaXN0cmlidXRpb25DbGllbnRSZXN1bHQ7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5pbXBsLkRpc3RyaWJ1dGlvbkNsaWVudEZhY3Rvcnk7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5TZXJ2aWNlOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworCitwdWJsaWMgY2xhc3MgQ2FsbGFibGVUYXNrICB7CisKKy8vCU5vdGlmaWNhdGlvbkNhbGxiYWNrIG5vdGlmQ2FsbGJhY2sgPSBudWxsOworLy8JLy9wcml2YXRlIFNlcnZpY2VVdGlscyBzZXJ2aWNlVXRpbHM7CisvLwlwcml2YXRlIFNlcnZpY2Ugc2VydmljZTsKKy8vCQorLy8JLy9wdWJsaWMgQ2FsbGFibGVUYXNrKFNlcnZpY2VVdGlscyBzZXJ2aWNlVXRpbHMsIFNlcnZpY2Ugc2VydmljZSkgeworLy8JcHVibGljIENhbGxhYmxlVGFzayhTZXJ2aWNlIHNlcnZpY2UpIHsKKy8vCQkvL3RoaXMuc2VydmljZVV0aWxzID0gc2VydmljZVV0aWxzOworLy8JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7CisvLwl9CisvLwkKKy8vCXB1YmxpYyBOb3RpZmljYXRpb25DYWxsYmFjayBnZXROb3RpZkNhbGxiYWNrKCkgeworLy8JCXJldHVybiBub3RpZkNhbGxiYWNrOworLy8JfQorLy8JCisvLwlAT3ZlcnJpZGUKKy8vCXB1YmxpYyBCb29sZWFuIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQkKKy8vCQlJRGlzdHJpYnV0aW9uQ2xpZW50IGNsaWVudCA9IERpc3RyaWJ1dGlvbkNsaWVudEZhY3RvcnkuY3JlYXRlRGlzdHJpYnV0aW9uQ2xpZW50KCk7CisvLwkJCisvLwkJbm90aWZDYWxsYmFjayA9IG5ldyBOb3RpZmljYXRpb25DYWxsYmFjayhjbGllbnQpOworLy8JCUlEaXN0cmlidXRpb25DbGllbnRSZXN1bHQgcmVzdWx0ID0gIGNsaWVudC5pbml0KG5ldyBTaW1wbGVDb25maWd1cmF0aW9uKCksICBub3RpZkNhbGxiYWNrKTsKKy8vCQkKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc3VsdC5nZXREaXN0cmlidXRpb25NZXNzYWdlUmVzdWx0OiAiICsgcmVzdWx0LmdldERpc3RyaWJ1dGlvbk1lc3NhZ2VSZXN1bHQoKSk7CisvLwkJCQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgY2xpZW50Li4uIik7CisvLwkJSURpc3RyaWJ1dGlvbkNsaWVudFJlc3VsdCBzdGFydCA9IGNsaWVudC5zdGFydCgpOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbihzdGFydC5nZXREaXN0cmlidXRpb25NZXNzYWdlUmVzdWx0KCkpOworLy8JCQorLy8vLwkJUmVzdFJlc3BvbnNlIGNoYW5nZVN0YXRlVG9ESVNUUklCVVRFRCA9IHNlcnZpY2VVdGlscy5jaGFuZ2VTdGF0ZVRvRElTVFJJQlVURUQoc2VydmljZSwgVXNlclV0aWxzLmdldEdvdmVybm9yRGV0YWlsczEoKSk7CisvLwkJU2VydmljZVJlcURldGFpbHMgc2VydmljZURldGFpbHMgPSBuZXcgU2VydmljZVJlcURldGFpbHMoKTsKKy8vCQlzZXJ2aWNlRGV0YWlscy5zZXRVbmlxdWVJZChzZXJ2aWNlLmdldFVuaXF1ZUlkKCkpOworLy8JCS8vUmVzdFJlc3BvbnNlIGNoYW5nZVN0YXRlVG9ESVNUUklCVVRFRCA9IHNlcnZpY2VVdGlscy5jaGFuZ2VEaXN0cmlidXRpb25TdGF0dXMoc2VydmljZURldGFpbHMsICIxLjAiLCBVc2VyVXRpbHMuZ2V0R292ZXJub3JEZXRhaWxzMSgpLCAiY2hhbmdlIiwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5ESVNUUklCVVRFRCk7CisvLwkJLy9hc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgY2hhbmdlU3RhdGVUb0RJU1RSSUJVVEVELmdldEVycm9yQ29kZSgpLCBjaGFuZ2VTdGF0ZVRvRElTVFJJQlVURUQuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKTsKKy8vCQkKKy8vCQkKKy8vLy8JCXdoaWxlIChzaW1wbGVDYWxsYmFjay5nZXRTaW1wbGVDYWxsYmFja1Jlc3VsdHMoKS5zaXplKCk8Myl7CisvLwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU2xlZXBpbmcuLi4iKTsKKy8vCQkJVGhyZWFkLnNsZWVwKDUwMDApOworLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZpbmlzaGVkIFNsZWVwaW5nLi4uIik7CisvLy8vCQl9CisvLwkJCisvLwkJcmV0dXJuIHRydWU7CisvLwl9CisKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvdGVzdC9DbGllbnRUZXN0LmphdmEgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTA4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvQ2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC50ZXN0OworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hcGkuSURpc3RyaWJ1dGlvbkNsaWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hcGkucmVzdWx0cy5JRGlzdHJpYnV0aW9uQ2xpZW50UmVzdWx0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmltcGwuRGlzdHJpYnV0aW9uQ2xpZW50RmFjdG9yeTsKKworaW1wb3J0IGNoLnFvcy5sb2diYWNrLmNsYXNzaWMuTGV2ZWw7CitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5Mb2dnZXJDb250ZXh0OworCitwdWJsaWMgY2xhc3MgQ2xpZW50VGVzdCB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworCQlMb2dnZXJDb250ZXh0IGxjID0gKExvZ2dlckNvbnRleHQpIExvZ2dlckZhY3RvcnkuZ2V0SUxvZ2dlckZhY3RvcnkoKTsKKwkJbGMuZ2V0TG9nZ2VyKCJvcmcuYXBhY2hlLmh0dHAiKS5zZXRMZXZlbChMZXZlbC5JTkZPKTsKKworCQlJRGlzdHJpYnV0aW9uQ2xpZW50IGNsaWVudCA9IERpc3RyaWJ1dGlvbkNsaWVudEZhY3RvcnkuY3JlYXRlRGlzdHJpYnV0aW9uQ2xpZW50KCk7CisKKwkJSURpc3RyaWJ1dGlvbkNsaWVudFJlc3VsdCByZXN1bHQgPSBjbGllbnQuaW5pdChuZXcgU2ltcGxlQ29uZmlndXJhdGlvbigpLCBuZXcgTm90aWZpY2F0aW9uQ2FsbGJhY2soY2xpZW50KSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQuZ2V0RGlzdHJpYnV0aW9uTWVzc2FnZVJlc3VsdCgpKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIGNsaWVudC4uLiIpOworCQlJRGlzdHJpYnV0aW9uQ2xpZW50UmVzdWx0IHN0YXJ0UmVzdWx0ID0gY2xpZW50LnN0YXJ0KCk7CisKKwkJLy8gVGhyZWFkLnNsZWVwKDEwMDAwKTsKKwkJLy8gY2xpZW50LnN0b3AoKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RhcnRSZXN1bHQuZ2V0RGlzdHJpYnV0aW9uTWVzc2FnZVJlc3VsdCgpKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC90ZXN0L0UyZUZsb3dzLmphdmEgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvRTJlRmxvd3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFmYzIxCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC90ZXN0L0UyZUZsb3dzLmphdmEKQEAgLTAsMCArMSwxMDggQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC50ZXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworCisvL2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworLy8KKy8vaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKKy8vaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKKy8vaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKy8vaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworLy8KKy8vaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKKy8vaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworLy9pbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworLy8KKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5JRGlzdHJpYnV0aW9uQ2xpZW50OworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXBpLm5vdGlmaWNhdGlvbi5JQXJ0aWZhY3RJbmZvOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXBpLm5vdGlmaWNhdGlvbi5JTm90aWZpY2F0aW9uRGF0YTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5yZXN1bHRzLklEaXN0cmlidXRpb25DbGllbnRSZXN1bHQ7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5pbXBsLkRpc3RyaWJ1dGlvbkNsaWVudEZhY3Rvcnk7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51dGlscy5EaXN0cmlidXRpb25BY3Rpb25SZXN1bHRFbnVtOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuRGlzdHJpYnV0aW9uU3RhdHVzRW51bTsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CisvL2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmxpZmVjeWNsZS5MQ1NiYXNlVGVzdDsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKKy8vLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXNlcnMuVXNlclV0aWxzOworLy9pbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuRGJVdGlsczsKKy8vaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBFMmVGbG93cyB7CisKKworCisvLwlwcml2YXRlIElEaXN0cmlidXRpb25DbGllbnQgY2xpZW50ID0gRGlzdHJpYnV0aW9uQ2xpZW50RmFjdG9yeS5jcmVhdGVEaXN0cmlidXRpb25DbGllbnQoKTsKKy8vCXByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIG5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisvLwkKKy8vCXByaXZhdGUgQ2FsbGFibGVUYXNrIGNhbGxhYmxlVGFzazsKKy8vCXByaXZhdGUgTm90aWZpY2F0aW9uQ2FsbGJhY2sgbm90aWZDYWxsYmFjazsKKy8vCXByaXZhdGUgSUFydGlmYWN0SW5mbyBpQXJ0aWZhY3RJbmZvOworLy8KKworCQorLy8KKy8vCUBBZnRlcgorLy8JcHVibGljIHZvaWQgYWZ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQljbGllbnQuc3RvcCgpOworLy8JCVRocmVhZC5zbGVlcCg1MDAwKTsKKy8vCX0KKy8vCisvLwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TdWNjZXNzCisvLwkvLyBzY2VuYXJpby0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8JQFRlc3QKKy8vCXB1YmxpYyB2b2lkIGRpc3RyaWJ1dGVTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKy8vCQljcmVhdGVTZXJ2aWNlUmVhZHlGb3JEaXN0cmlidXRpb24oKTsKKy8vCQkvL1Jlc3RSZXNwb25zZSBjaGFuZ2VTdGF0ZVRvRElTVFJJQlVURUQgPSBzZXJ2aWNlVXRpbHMuY2hhbmdlRGlzdHJpYnV0aW9uU3RhdHVzKHNlcnZpY2VEZXRhaWxzLCAiMS4wIiwgVXNlclV0aWxzLmdldEdvdmVybm9yRGV0YWlsczEoKSwgImNoYW5nZSIsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRElTVFJJQlVURUQpOworLy8JCS8vYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIGNoYW5nZVN0YXRlVG9ESVNUUklCVVRFRC5nZXRFcnJvckNvZGUoKSwgY2hhbmdlU3RhdGVUb0RJU1RSSUJVVEVELmdldEVycm9yQ29kZSgpID09IDIwMCk7CisvLworLy8JfQorLy8JQFRlc3QKKy8vCXB1YmxpYyB2b2lkIEUyRV9TdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJCVNlcnZpY2Ugc2VydmljZSA9IGNyZWF0ZVNlcnZpY2VSZWFkeUZvckRpc3RyaWJ1dGlvbigpOworLy8JCQkKKy8vLy8JCQljbGVhbiBhdWRpdAorLy8JCQlEYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisvLwkJCQorLy8JCQkvL0NyZWF0ZSB0YXNrIHRvIHJ1biBpbiBCRworLy8JCQljYWxsYWJsZVRhc2sgPSBuZXcgQ2FsbGFibGVUYXNrKHNlcnZpY2UpOworLy8JCQkKKy8vCQkJLy9SdW4gdGhlIHRhc2sgaW4gQkcKKy8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJFeGVjdXRpbmcgVGFzay4uLiIpOworLy8JCQlGdXR1cmU8Qm9vbGVhbj4gZiA9IG5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yLnN1Ym1pdChjYWxsYWJsZVRhc2spOworLy8JCQkKKy8vCQkJLy9XYWl0IGZvciB0YXNrIHRvIGNvbXBsZXRlIGFuZCByZXR1cm4gd2l0aCByZXN1bHQKKy8vCQkJCisvLy8vCQkJd2hpbGUgKCFmLmlzRG9uZSgpKXsKKy8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJXYWl0aW5nIGZvciByZXN1bHQuLi4iKTsKKy8vCQkJLy8JVGhyZWFkLnNsZWVwKDMwMDAwKTsKKy8vLy8JCQl9CisvLwkJCUJvb2xlYW4gcmVzdWx0ID0gZi5nZXQoMTUsIFRpbWVVbml0LlNFQ09ORFMpOworLy8JCQkKKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJmdXR1cmU6IiArIHJlc3VsdCk7CisvLwkJCQorLy8JCQkvL0NoZWNrIFJlc3VsdHMKKy8vCQkJbm90aWZDYWxsYmFjayA9IGNhbGxhYmxlVGFzay5nZXROb3RpZkNhbGxiYWNrKCk7CisvLwkJCQorLy8JCQlJTm90aWZpY2F0aW9uRGF0YSBkYXRhID0gbm90aWZDYWxsYmFjay5nZXREYXRhKCk7CisvLwkJCQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc3VsdCBtYXAgc2l6ZSAgPSAiKyAgbm90aWZDYWxsYmFjay5nZXRTaW1wbGVDYWxsYmFja1Jlc3VsdHMoKS5zaXplKCkpOworLy8JCQlJRGlzdHJpYnV0aW9uQ2xpZW50UmVzdWx0IGRvd25sb2FkUmVzdWx0ID0gbm90aWZDYWxsYmFjay5nZXRTaW1wbGVDYWxsYmFja1Jlc3VsdHMoKS5nZXQoImRvd25sb2FkUmVzdWx0Iik7CisvLwkJCWFzc2VydFRydWUoInJlc3BvbnNlIGNvZGUgaXMgbm90IFNVQ0NFU1MsIHJldHVybmVkIDoiKyBkb3dubG9hZFJlc3VsdC5nZXREaXN0cmlidXRpb25BY3Rpb25SZXN1bHQoKSxkb3dubG9hZFJlc3VsdC5nZXREaXN0cmlidXRpb25BY3Rpb25SZXN1bHQoKSA9PSBEaXN0cmlidXRpb25BY3Rpb25SZXN1bHRFbnVtLlNVQ0NFU1MpOworLy8KKy8vCX0KKy8vCisvLworLy8JcHJpdmF0ZSBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2VSZWFkeUZvckRpc3RyaWJ1dGlvbigpIHRocm93cyBFeGNlcHRpb24geworLy8vLwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gTENTYmFzZVRlc3QuY2VydGlmeVNlcnZpY2Uoc2VydmljZURldGFpbHMpOworLy8vLwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIHJlc3BvbnNlLmdldEVycm9yQ29kZSgpLCByZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApOworLy8vLwkJU2VydmljZSBzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKy8vLy8JCQorLy8vLwkJUmVzdFJlc3BvbnNlIGNoYW5nZURpc3RyaWJ1dGlvblN0YXRlVG9BcHByb3ZlID0gc2VydmljZVV0aWxzLmNoYW5nZURpc3RyaWJ1dGlvblN0YXRlVG9BcHByb3ZlKHNlcnZpY2UsVXNlclV0aWxzLmdldEdvdmVybm9yRGV0YWlsczEoKSk7CisvLy8vCQlhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgY2hhbmdlRGlzdHJpYnV0aW9uU3RhdGVUb0FwcHJvdmUuZ2V0RXJyb3JDb2RlKCksIGNoYW5nZURpc3RyaWJ1dGlvblN0YXRlVG9BcHByb3ZlLmdldEVycm9yQ29kZSgpID09IDIwMCk7CisvLy8vCQlzZXJ2aWNlID0gUmVzcG9uc2VQYXJzZXIuY29udmVydFNlcnZpY2VSZXNwb25zZVRvSmF2YU9iamVjdChjaGFuZ2VEaXN0cmlidXRpb25TdGF0ZVRvQXBwcm92ZS5nZXRSZXNwb25zZSgpKTsKKy8vLy8JCXJldHVybiBzZXJ2aWNlOworLy8JCXJldHVybiBudWxsOworLy8JfQorCit9CmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvTm90aWZpY2F0aW9uQ2FsbGJhY2suamF2YSBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvdGVzdC9Ob3RpZmljYXRpb25DYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0N2I5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvTm90aWZpY2F0aW9uQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAudGVzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5JRGlzdHJpYnV0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5ub3RpZmljYXRpb24uSU5vdGlmaWNhdGlvbkRhdGE7CisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25DYWxsYmFjayBleHRlbmRzIFNpbXBsZUNhbGxiYWNreworCUlOb3RpZmljYXRpb25EYXRhIGxhdGVzdENhbGxiYWNrRGF0YTsKKwlwdWJsaWMgSU5vdGlmaWNhdGlvbkRhdGEgZ2V0RGF0YSgpIHsKKwkJcmV0dXJuIGxhdGVzdENhbGxiYWNrRGF0YTsKKwl9CisJcHVibGljIE5vdGlmaWNhdGlvbkNhbGxiYWNrKElEaXN0cmlidXRpb25DbGllbnQgY2xpZW50KSB7CisJCXN1cGVyKGNsaWVudCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFjdGl2YXRlQ2FsbGJhY2soSU5vdGlmaWNhdGlvbkRhdGEgZGF0YSkgeworCQl0aGlzLmxhdGVzdENhbGxiYWNrRGF0YSA9IGRhdGE7CisJCXN1cGVyLmFjdGl2YXRlQ2FsbGJhY2soZGF0YSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC90ZXN0L1NpbXBsZUNhbGxiYWNrLmphdmEgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvU2ltcGxlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2IyMzExCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC90ZXN0L1NpbXBsZUNhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwyNzUgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5JRGlzdHJpYnV0aW9uQ2xpZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5jb25zdW1lci5JRGlzdHJpYnV0aW9uU3RhdHVzTWVzc2FnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hcGkuY29uc3VtZXIuSU5vdGlmaWNhdGlvbkNhbGxiYWNrOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5ub3RpZmljYXRpb24uSUFydGlmYWN0SW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hcGkubm90aWZpY2F0aW9uLklOb3RpZmljYXRpb25EYXRhOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmFwaS5ub3RpZmljYXRpb24uSVJlc291cmNlSW5zdGFuY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXBpLm5vdGlmaWNhdGlvbi5JVmZNb2R1bGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5hcGkucmVzdWx0cy5JRGlzdHJpYnV0aW9uQ2xpZW50RG93bmxvYWRSZXN1bHQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXBpLnJlc3VsdHMuSURpc3RyaWJ1dGlvbkNsaWVudFJlc3VsdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51dGlscy5BcnRpZmFjdFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnV0aWxzLkRpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudXRpbHMuRGlzdHJpYnV0aW9uU3RhdHVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5EZWNvZGVyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRmlsZVV0aWxzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkJhc2VFbmNvZGluZzsKKworcHVibGljIGNsYXNzIFNpbXBsZUNhbGxiYWNrIGltcGxlbWVudHMgSU5vdGlmaWNhdGlvbkNhbGxiYWNrIHsKKwlwcml2YXRlIElEaXN0cmlidXRpb25DbGllbnQgY2xpZW50OworCXB1YmxpYyBMaXN0PElBcnRpZmFjdEluZm8+IGlBcnRpZmFjdEluZm87CisKKwlwdWJsaWMgZmluYWwgTWFwPFN0cmluZywgSURpc3RyaWJ1dGlvbkNsaWVudFJlc3VsdD4gc2ltcGxlQ2FsbGJhY2tSZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJRGlzdHJpYnV0aW9uQ2xpZW50UmVzdWx0PigpOworCisJcHVibGljIE1hcDxTdHJpbmcsIElEaXN0cmlidXRpb25DbGllbnRSZXN1bHQ+IGdldFNpbXBsZUNhbGxiYWNrUmVzdWx0cygpIHsKKwkJcmV0dXJuIHNpbXBsZUNhbGxiYWNrUmVzdWx0czsKKwl9CisKKwlwdWJsaWMgTGlzdDxJQXJ0aWZhY3RJbmZvPiBnZXRJQXJ0aWZhY3RJbmZvKCkgeworCQlyZXR1cm4gaUFydGlmYWN0SW5mbzsKKwl9CisKKwlwdWJsaWMgU2ltcGxlQ2FsbGJhY2soSURpc3RyaWJ1dGlvbkNsaWVudCBjbGllbnQpIHsKKwkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CisJfQorCisJcHVibGljIHZvaWQgYWN0aXZhdGVDYWxsYmFjayhJTm90aWZpY2F0aW9uRGF0YSBkYXRhKSB7CisKKwkJTGlzdDxJQXJ0aWZhY3RJbmZvPiBhcnRpZmFjdHMgPSBnZXRBcnRpZmFjdHMoZGF0YSk7CisKKwkJZm9yIChJQXJ0aWZhY3RJbmZvIGlBcnRpZmFjdEluZm8gOiBhcnRpZmFjdHMpIHsKKworCQkJSUFydGlmYWN0SW5mbyBhcnRpZmFjdE1ldGFkYXRhQnlVVUlEID0gZGF0YS5nZXRBcnRpZmFjdE1ldGFkYXRhQnlVVUlEKGlBcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RVVUlEKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJjaGVjayBhcnRpZmFjdCBjaGVja3N1bSIsIGlBcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RDaGVja3N1bSgpLCBhcnRpZmFjdE1ldGFkYXRhQnlVVUlELmdldEFydGlmYWN0Q2hlY2tzdW0oKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oYXJ0aWZhY3RNZXRhZGF0YUJ5VVVJRC5nZXRBcnRpZmFjdFVSTCgpKTsKKwkJCWlmIChhcnRpZmFjdE1ldGFkYXRhQnlVVUlELmdldEFydGlmYWN0VHlwZSgpLmVxdWFscyhBcnRpZmFjdFR5cGVFbnVtLlZGX01PRFVMRVNfTUVUQURBVEEpKSB7CisJCQkJSURpc3RyaWJ1dGlvbkNsaWVudERvd25sb2FkUmVzdWx0IGRvd25sb2FkID0gY2xpZW50LmRvd25sb2FkKGlBcnRpZmFjdEluZm8pOworCQkJCWlmIChkb3dubG9hZC5nZXREaXN0cmlidXRpb25BY3Rpb25SZXN1bHQoKSA9PSBEaXN0cmlidXRpb25BY3Rpb25SZXN1bHRFbnVtLlNVQ0NFU1MpIHsKKwkJCQkJTGlzdDxJVmZNb2R1bGVNZXRhZGF0YT4gZGVjb2RlVmZNb2R1bGVBcnRpZmFjdCA9IGNsaWVudC5kZWNvZGVWZk1vZHVsZUFydGlmYWN0KGRvd25sb2FkLmdldEFydGlmYWN0UGF5bG9hZCgpKTsKKwkJCQkJLy8gYXNzZXJ0RXF1YWxzKCJkZWNvZGVkIG5vdCBlcXVhbCB0byBhY3R1YWwgZ3JvdXAgYW1vdW50ICIsIGRlY29kZVZmTW9kdWxlQXJ0aWZhY3Quc2l6ZSgpLCAyKTsKKwkJCQkJaWYgKCFkZWNvZGVWZk1vZHVsZUFydGlmYWN0LmlzRW1wdHkoKSkgeworCQkJCQkJZm9yIChJVmZNb2R1bGVNZXRhZGF0YSBtb2R1bGVNZXRhZGF0YSA6IGRlY29kZVZmTW9kdWxlQXJ0aWZhY3QpIHsKKwkJCQkJCQlMaXN0PFN0cmluZz4gbW9kdWxlQXJ0aWZhY3RzID0gbW9kdWxlTWV0YWRhdGEuZ2V0QXJ0aWZhY3RzKCk7CisJCQkJCQkJaWYgKG1vZHVsZUFydGlmYWN0cyAhPSBudWxsKSB7CisKKwkJCQkJCQkJZm9yIChTdHJpbmcgYXJ0aWZhY3RJZCA6IG1vZHVsZUFydGlmYWN0cykgeworCisJCQkJCQkJCQlJQXJ0aWZhY3RJbmZvIGFydGlmYWN0SW5mbyA9IGRhdGEuZ2V0QXJ0aWZhY3RNZXRhZGF0YUJ5VVVJRChhcnRpZmFjdElkKTsKKwkJCQkJCQkJCUlEaXN0cmlidXRpb25DbGllbnREb3dubG9hZFJlc3VsdCBkb3dubG9hZEFydCA9IGNsaWVudC5kb3dubG9hZChhcnRpZmFjdEluZm8pOworCQkJCQkJCQkJYXNzZXJ0RXF1YWxzKGRvd25sb2FkQXJ0LmdldERpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdCgpLCBEaXN0cmlidXRpb25BY3Rpb25SZXN1bHRFbnVtLlNVQ0NFU1MpOworCisJCQkJCQkJCX0KKworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvciAoSUFydGlmYWN0SW5mbyByZWxldmFudEFydGlmYWN0IDogYXJ0aWZhY3RzKSB7CisJCQkvLyBEb3dubG9hZCBBcnRpZmFjdAorCQkJSURpc3RyaWJ1dGlvbkNsaWVudERvd25sb2FkUmVzdWx0IGRvd25sb2FkUmVzdWx0ID0gY2xpZW50LmRvd25sb2FkKHJlbGV2YW50QXJ0aWZhY3QpOworCisJCQlwb3N0RG93bmxvYWRMb2dpYyhkb3dubG9hZFJlc3VsdCk7CisKKwkJCXNpbXBsZUNhbGxiYWNrUmVzdWx0cy5wdXQoImRvd25sb2FkUmVzdWx0IiwgZG93bmxvYWRSZXN1bHQpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJkb3dubG9hZFJlc3VsdDogIiArIGRvd25sb2FkUmVzdWx0LnRvU3RyaW5nKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCI8PDw8PDw8PDw8PCBBcnRpZmFjdCBjb250ZW50ID4+Pj4+Pj4+Pj4iKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihEZWNvZGVyLmVuY29kZShkb3dubG9hZFJlc3VsdC5nZXRBcnRpZmFjdFBheWxvYWQoKSkpOworCisJCQkvLy8vLyBQcmludCBhcnRpZmFjdCBjb250ZW50IHRvIGNvbnNvbGUvLy8vLy8vCisKKwkJCS8vIGJ5dGVbXSBjb250ZW50SW5CeXRlcyA9IEJhc2VFbmNvZGluZy5iYXNlNjQoKS5kZWNvZGUoRGVjb2Rlci5lbmNvZGUoZG93bmxvYWRSZXN1bHQuZ2V0QXJ0aWZhY3RQYXlsb2FkKCkpKTsKKwkJCS8vIHRyeSB7CisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNvdXJjZSBjb250ZW50OiAiICsgbmV3IFN0cmluZyhjb250ZW50SW5CeXRlcywgIlVURi04IikpOworCQkJLy8gfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgeworCQkJLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJLy8gZTEucHJpbnRTdGFja1RyYWNlKCk7CisJCQkvLyB9CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFydEluZm9fdGltZW91dDogIiArIHJlbGV2YW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RUaW1lb3V0KCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJBcnRJbmZvX0FydF9kZXNjcmlwdGlvbjogIiArIHJlbGV2YW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXJ0SW5mb19BcnRfQ2hlY2tTdW06ICIgKyByZWxldmFudEFydGlmYWN0LmdldEFydGlmYWN0Q2hlY2tzdW0oKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFydEluZm9fQXJ0X1VybDogIiArIHJlbGV2YW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3RVUkwoKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFydEluZm9fQXJ0X1R5cGU6ICIgKyByZWxldmFudEFydGlmYWN0LmdldEFydGlmYWN0VHlwZSgpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXJ0SW5mb19BcnRfTmFtZTogIiArIHJlbGV2YW50QXJ0aWZhY3QuZ2V0QXJ0aWZhY3ROYW1lKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJBcnRJbmZvX1VVSUQ6ICIgKyByZWxldmFudEFydGlmYWN0LmdldEFydGlmYWN0VVVJRCgpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXJ0SW5mb19WZXJzaW9uOiAiICsgcmVsZXZhbnRBcnRpZmFjdC5nZXRBcnRpZmFjdFZlcnNpb24oKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFydEluZm9fUmVsYXRlZEFydGlmYWN0czogIiArIHJlbGV2YW50QXJ0aWZhY3QuZ2V0UmVsYXRlZEFydGlmYWN0cygpKTsKKworCQkJU3lzdGVtLm91dC5wcmludGxuKCJBcnRJbmZvX1NlcnZfZGVzY3JpcHRpb246ICIgKyBkYXRhLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXJ0SW5mb19TZXJ2X05hbWU6ICIgKyBkYXRhLmdldFNlcnZpY2VOYW1lKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJHZXRfc2VydmljZVZlcnNpb246ICIgKyBkYXRhLmdldFNlcnZpY2VWZXJzaW9uKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJHZXRfU2VydmljZV9VVUlEOiAiICsgZGF0YS5nZXRTZXJ2aWNlVVVJRCgpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXJ0SW5mb19EaXN0cmlidXRpb25JZDogIiArIGRhdGEuZ2V0RGlzdHJpYnV0aW9uSUQoKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFydEluZm9fU2VydmljZUludmFyaWFudFVVSUQ6ICIgKyBkYXRhLmdldFNlcnZpY2VJbnZhcmlhbnRVVUlEKCkpOworCisJCQkvLyBhc3NlcnRUcnVlKCJyZXNwb25zZSBjb2RlIGlzIG5vdCAyMDAsIHJldHVybmVkIDoiICsgZG93bmxvYWRSZXN1bHQuZ2V0RGlzdHJpYnV0aW9uQWN0aW9uUmVzdWx0KCksIGRvd25sb2FkUmVzdWx0LmdldERpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdCgpID09IERpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdEVudW0uU1VDQ0VTUyApOworCisJCQl0cnkgeworCQkJCVN0cmluZyBwYXlsb2FkID0gbmV3IFN0cmluZyhkb3dubG9hZFJlc3VsdC5nZXRBcnRpZmFjdFBheWxvYWQoKSk7CisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCIpOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihwYXlsb2FkKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIik7CisKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjYXRjaCIpOworCQkJCS8vIGJyZWFrOworCQkJCS8vIFRPRE86IGhhbmRsZSBleGNlcHRpb24KKwkJCX0KKworCQkJaWYgKGRvd25sb2FkUmVzdWx0LmdldERpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdCgpID09IERpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdEVudW0uU1VDQ0VTUykgeworCQkJCWhhbmRsZVN1Y2Nlc3NmdWxsRG93bmxvYWQoZGF0YSwgcmVsZXZhbnRBcnRpZmFjdCk7CisJCQl9IGVsc2UgeworCQkJCWhhbmRsZUZhaWxlZERvd25sb2FkKGRhdGEsIHJlbGV2YW50QXJ0aWZhY3QpOworCQkJfQorCQl9CisJCS8vIGlmIChkYXRhICE9IG51bGwpeworCQkvLyBpQXJ0aWZhY3RJbmZvLmFkZEFsbChhcnRpZmFjdHMpOworCQkvLyB9CisKKwl9CisKKwlwcml2YXRlIExpc3Q8SUFydGlmYWN0SW5mbz4gZ2V0QXJ0aWZhY3RzKElOb3RpZmljYXRpb25EYXRhIGRhdGEpIHsKKwkJTGlzdDxJQXJ0aWZhY3RJbmZvPiByZXQgPSBuZXcgQXJyYXlMaXN0PElBcnRpZmFjdEluZm8+KCk7CisJCUxpc3Q8SVJlc291cmNlSW5zdGFuY2U+IHJlc291cmNlcyA9IGRhdGEuZ2V0UmVzb3VyY2VzKCk7CisJCS8vIGRhdGEuZ2V0QXJ0aWZhY3RNZXRhZGF0YUJ5VVVJRChhcmcwKQorCQlMaXN0PFN0cmluZz4gcmVsZXZhbnRBcnRpZmFjdFR5cGVzID0gY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKS5nZXRSZWxldmFudEFydGlmYWN0VHlwZXMoKTsKKworCQlMaXN0PElBcnRpZmFjdEluZm8+IGNvbGxlY3QgPSByZXNvdXJjZXMuc3RyZWFtKCkuZmxhdE1hcChlIC0+IGUuZ2V0QXJ0aWZhY3RzKCkuc3RyZWFtKCkpLmZpbHRlcihwIC0+IHJlbGV2YW50QXJ0aWZhY3RUeXBlcy5jb250YWlucyhwLmdldEFydGlmYWN0VHlwZSgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJLy8gaWYoIHJlc291cmNlcyAhPSBudWxsICl7CisJCS8vIGZvciggSVJlc291cmNlSW5zdGFuY2UgcmVzb3VyY2VJbnN0YW5jZSA6IHJlc291cmNlcyl7CisJCS8vIGlmKCByZXNvdXJjZUluc3RhbmNlLmdldEFydGlmYWN0cygpICE9IG51bGwgKXsKKwkJLy8KKwkJLy8KKwkJLy8KKwkJLy8gcmV0LmFkZEFsbChyZXNvdXJjZUluc3RhbmNlLmdldEFydGlmYWN0cygpKTsKKwkJLy8KKwkJLy8KKwkJLy8gfQorCQkvLyB9CisJCS8vIH0KKwkJcmV0LmFkZEFsbChjb2xsZWN0KTsKKworCQlMaXN0PElBcnRpZmFjdEluZm8+IHNlcnZpY2VzQXJ0ID0gZGF0YS5nZXRTZXJ2aWNlQXJ0aWZhY3RzKCk7CisJCWlmIChzZXJ2aWNlc0FydCAhPSBudWxsKSB7CisJCQlyZXQuYWRkQWxsKHNlcnZpY2VzQXJ0KTsKKwkJfQorCisJCVN5c3RlbS5vdXQucHJpbnRsbigiSSBhbSBoZXJlOiAiICsgcmV0LnRvU3RyaW5nKCkpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVGYWlsZWREb3dubG9hZChJTm90aWZpY2F0aW9uRGF0YSBkYXRhLCBJQXJ0aWZhY3RJbmZvIHJlbGV2YW50QXJ0aWZhY3QpIHsKKwkJLy8gU2VuZCBEb3dubG9hZCBTdGF0dXMKKwkJSURpc3RyaWJ1dGlvbkNsaWVudFJlc3VsdCBzZW5kRG93bmxvYWRTdGF0dXMgPSBjbGllbnQuc2VuZERvd25sb2FkU3RhdHVzKGJ1aWxkU3RhdHVzTWVzc2FnZShjbGllbnQsIGRhdGEsIHJlbGV2YW50QXJ0aWZhY3QsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uRE9XTkxPQURfRVJST1IpKTsKKwkJcG9zdERvd25sb2FkU3RhdHVzU2VuZExvZ2ljKHNlbmREb3dubG9hZFN0YXR1cyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVN1Y2Nlc3NmdWxsRG93bmxvYWQoSU5vdGlmaWNhdGlvbkRhdGEgZGF0YSwgSUFydGlmYWN0SW5mbyByZWxldmFudEFydGlmYWN0KSB7CisJCS8vIFNlbmQgRG93bmxvYWQgU3RhdHVzCisJCUlEaXN0cmlidXRpb25DbGllbnRSZXN1bHQgc2VuZERvd25sb2FkU3RhdHVzID0gY2xpZW50LnNlbmREb3dubG9hZFN0YXR1cyhidWlsZFN0YXR1c01lc3NhZ2UoY2xpZW50LCBkYXRhLCByZWxldmFudEFydGlmYWN0LCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRPV05MT0FEX09LKSk7CisKKwkJc2ltcGxlQ2FsbGJhY2tSZXN1bHRzLnB1dCgic2VuZERvd25sb2FkU3RhdHVzIiwgc2VuZERvd25sb2FkU3RhdHVzKTsKKwkJLy8gYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIHNlbmREb3dubG9hZFN0YXR1cy5nZXREaXN0cmlidXRpb25BY3Rpb25SZXN1bHQoKSwgc2VuZERvd25sb2FkU3RhdHVzLmdldERpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdCgpID09IERpc3RyaWJ1dGlvbkFjdGlvblJlc3VsdEVudW0uU1VDQ0VTUyApOworCisJCS8vIERvaW5nIGRlcGxveW1lbnQgLi4uCisJCXBvc3REb3dubG9hZFN0YXR1c1NlbmRMb2dpYyhzZW5kRG93bmxvYWRTdGF0dXMpOworCQlib29sZWFuIGlzRGVwbG95ZWRTdWNjZXNzZnVsbHkgPSBoYW5kbGVEZXBsb3ltZW50KCk7CisJCUlEaXN0cmlidXRpb25DbGllbnRSZXN1bHQgZGVwbG95bWVudFN0YXR1czsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlpZiAoaXNEZXBsb3llZFN1Y2Nlc3NmdWxseSkgeworCQkJZGVwbG95bWVudFN0YXR1cyA9IGNsaWVudC5zZW5kRGVwbG95bWVudFN0YXR1cyhidWlsZFN0YXR1c01lc3NhZ2UoY2xpZW50LCBkYXRhLCByZWxldmFudEFydGlmYWN0LCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRFUExPWV9PSykpOworCisJCQlzaW1wbGVDYWxsYmFja1Jlc3VsdHMucHV0KCJzZW5kRGVwbG95bWVudFN0YXR1cyIsIGRlcGxveW1lbnRTdGF0dXMpOworCQkJLy8gYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIGRlcGxveW1lbnRTdGF0dXMuZ2V0RGlzdHJpYnV0aW9uQWN0aW9uUmVzdWx0KCksIGRlcGxveW1lbnRTdGF0dXMuZ2V0RGlzdHJpYnV0aW9uQWN0aW9uUmVzdWx0KCkgPT0gRGlzdHJpYnV0aW9uQWN0aW9uUmVzdWx0RW51bS5TVUNDRVNTICk7CisKKwkJfSBlbHNlIHsKKwkJCWRlcGxveW1lbnRTdGF0dXMgPSBoYW5kbGVGYWlsZWREZXBsb3ltZW50KGRhdGEsIHJlbGV2YW50QXJ0aWZhY3QpOworCQl9CisKKwkJcG9zdERlcGxveW1lbnRTdGF0dXNTZW5kTG9naWMoZGVwbG95bWVudFN0YXR1cyk7CisJfQorCisJcHJpdmF0ZSBJRGlzdHJpYnV0aW9uQ2xpZW50UmVzdWx0IGhhbmRsZUZhaWxlZERlcGxveW1lbnQoSU5vdGlmaWNhdGlvbkRhdGEgZGF0YSwgSUFydGlmYWN0SW5mbyByZWxldmFudEFydGlmYWN0KSB7CisJCUlEaXN0cmlidXRpb25DbGllbnRSZXN1bHQgZGVwbG95bWVudFN0YXR1czsKKwkJYm9vbGVhbiBpc0FscmVhZHlEZXBsb3llZCA9IGNoZWNrSXNEZXBsb3llZCgpOworCQlpZiAoaXNBbHJlYWR5RGVwbG95ZWQpIHsKKwkJCWRlcGxveW1lbnRTdGF0dXMgPSBjbGllbnQuc2VuZERlcGxveW1lbnRTdGF0dXMoYnVpbGRTdGF0dXNNZXNzYWdlKGNsaWVudCwgZGF0YSwgcmVsZXZhbnRBcnRpZmFjdCwgRGlzdHJpYnV0aW9uU3RhdHVzRW51bS5BTFJFQURZX0RFUExPWUVEKSk7CisJCX0gZWxzZSB7CisJCQlkZXBsb3ltZW50U3RhdHVzID0gY2xpZW50LnNlbmREZXBsb3ltZW50U3RhdHVzKGJ1aWxkU3RhdHVzTWVzc2FnZShjbGllbnQsIGRhdGEsIHJlbGV2YW50QXJ0aWZhY3QsIERpc3RyaWJ1dGlvblN0YXR1c0VudW0uREVQTE9ZX0VSUk9SKSk7CisJCX0KKwkJcmV0dXJuIGRlcGxveW1lbnRTdGF0dXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBvc3REb3dubG9hZExvZ2ljKElEaXN0cmlidXRpb25DbGllbnREb3dubG9hZFJlc3VsdCBkb3dubG9hZFJlc3VsdCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwlwcml2YXRlIHZvaWQgcG9zdERvd25sb2FkU3RhdHVzU2VuZExvZ2ljKElEaXN0cmlidXRpb25DbGllbnRSZXN1bHQgc2VuZERvd25sb2FkU3RhdHVzKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCXByaXZhdGUgdm9pZCBwb3N0RGVwbG95bWVudFN0YXR1c1NlbmRMb2dpYyhJRGlzdHJpYnV0aW9uQ2xpZW50UmVzdWx0IGRlcGxveW1lbnRTdGF0dXMpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrSXNEZXBsb3llZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVEZXBsb3ltZW50KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwkJLy8gdG8gcmV0dXJuIGRlcGxveV9lcnJvciB1c2UgcmV0dXJuIGZhbHNlCisJCS8vIHJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElEaXN0cmlidXRpb25TdGF0dXNNZXNzYWdlIGJ1aWxkU3RhdHVzTWVzc2FnZShmaW5hbCBJRGlzdHJpYnV0aW9uQ2xpZW50IGNsaWVudCwgZmluYWwgSU5vdGlmaWNhdGlvbkRhdGEgZGF0YSwgZmluYWwgSUFydGlmYWN0SW5mbyByZWxldmFudEFydGlmYWN0LCBmaW5hbCBEaXN0cmlidXRpb25TdGF0dXNFbnVtIHN0YXR1cykgeworCQlJRGlzdHJpYnV0aW9uU3RhdHVzTWVzc2FnZSBzdGF0dXNNZXNzYWdlID0gbmV3IElEaXN0cmlidXRpb25TdGF0dXNNZXNzYWdlKCkgeworCisJCQlwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisJCQkJbG9uZyBjdXJyZW50VGltZU1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkJCXJldHVybiBjdXJyZW50VGltZU1pbGxpczsKKwkJCX0KKworCQkJcHVibGljIERpc3RyaWJ1dGlvblN0YXR1c0VudW0gZ2V0U3RhdHVzKCkgeworCQkJCXJldHVybiBzdGF0dXM7CisJCQl9CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0RGlzdHJpYnV0aW9uSUQoKSB7CisJCQkJcmV0dXJuIGRhdGEuZ2V0RGlzdHJpYnV0aW9uSUQoKTsKKwkJCX0KKworCQkJcHVibGljIFN0cmluZyBnZXRDb25zdW1lcklEKCkgeworCQkJCXJldHVybiBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbnN1bWVySUQoKTsKKwkJCX0KKworCQkJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdFVSTCgpIHsKKwkJCQlyZXR1cm4gcmVsZXZhbnRBcnRpZmFjdC5nZXRBcnRpZmFjdFVSTCgpOworCQkJfQorCQl9OworCQlyZXR1cm4gc3RhdHVzTWVzc2FnZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvdGVzdC9TaW1wbGVDb25maWd1cmF0aW9uLmphdmEgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvU2ltcGxlQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmZmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3Rlc3QvU2ltcGxlQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAudGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYXBpLmNvbnN1bWVyLklDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKKworcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbnsKKworLy8JcHVibGljIFN0cmluZyBnZXRVc2VyKCkKKy8vCSAgeworLy8JICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIiKTsKKy8vCSAgfQorLy8JICAKKy8vCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVsZXZhbnRBcnRpZmFjdFR5cGVzKCkgeworLy8JCUxpc3Q8U3RyaW5nPiByZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKy8vCQlmb3IgKEFydGlmYWN0VHlwZUVudW0gdHlwZSA6IEFydGlmYWN0VHlwZUVudW0udmFsdWVzKCkpeworLy8JCQlyZXMuYWRkKHR5cGUubmFtZSgpKTsKKy8vCQl9CisvLwkJcmV0dXJuIHJlczsKKy8vCX0KKy8vCQkKKy8vCSAgcHVibGljIGludCBnZXRQb2xsaW5nVGltZW91dCgpCisvLwkgIHsKKy8vCSAgICByZXR1cm4gMjA7CisvLwkgIH0KKy8vCSAgCisvLwkgIHB1YmxpYyBpbnQgZ2V0UG9sbGluZ0ludGVydmFsKCkKKy8vCSAgeworLy8JICAgIHJldHVybiAyMDsKKy8vCSAgfQorLy8JICAKKy8vCSAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpCisvLwkgIHsKKy8vCSAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJwYXNzd29yZCIpOworLy8JICB9CisvLwkgIAorLy8JICBwdWJsaWMgU3RyaW5nIGdldEVudmlyb25tZW50TmFtZSgpCisvLwkgIHsKKy8vCSAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJlbnYiKTsKKy8vCSAgfQorLy8JICAKKy8vCSAgcHVibGljIFN0cmluZyBnZXRDb25zdW1lcklEKCkKKy8vCSAgeworLy8JICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbnN1bWVySUQiKTsKKy8vCSAgfQorLy8JICAKKy8vCSAgcHVibGljIFN0cmluZyBnZXRDb25zdW1lckdyb3VwKCkKKy8vCSAgeworLy8JICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImdyb3VwSUQiKTsKKy8vCSAgfQorLy8JICAKKy8vCSAgcHVibGljIFN0cmluZyBnZXRBc2RjQWRkcmVzcygpCisvLwkgIHsKKy8vCSAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJiZUFkZHJlc3MiKTsKKy8vCSAgfQorLy8JICAKKy8vCSAgcHVibGljIFN0cmluZyBnZXRLZXlTdG9yZVBhdGgoKQorLy8JICB7CisvLwkgICAgcmV0dXJuICIiOworLy8JICB9CisvLwkgIAorLy8JICBwdWJsaWMgU3RyaW5nIGdldEtleVN0b3JlUGFzc3dvcmQoKQorLy8JICB7CisvLwkgICAgcmV0dXJuICJBYTEyMzQ1NiI7CisvLwkgIH0KKy8vCSAgCisvLwkgIHB1YmxpYyBib29sZWFuIGFjdGl2YXRlU2VydmVyVExTQXV0aCgpCisvLwkgIHsKKy8vCSAgICByZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJhdXRoIikpOworLy8vLwkJcmVzLmFkZChBcnRpZmFjdFR5cGVFbnVtLkhFQVRfQVJUSUZBQ1QpOworLy8vLwkJcmVzLmFkZChBcnRpZmFjdFR5cGVFbnVtLkhFQVRfRU5WKTsKKy8vLy8JCXJlcy5hZGQoQXJ0aWZhY3RUeXBlRW51bS5NVVJBTk9fUEtHKTsKKy8vLy8JCXJlcy5hZGQoQXJ0aWZhY3RUeXBlRW51bS5WRl9MSUNFTlNFKTsKKy8vLy8JCXJlcy5hZGQoQXJ0aWZhY3RUeXBlRW51bS5BUFBDX0NPTkZJRyk7CisvLy8vCQlyZXMuYWRkKEFydGlmYWN0VHlwZUVudW0uTU9ERUxfSU5WRU5UT1JZX1BST0ZJTEUpOworLy8vLwkJcmVzLmFkZChBcnRpZmFjdFR5cGVFbnVtLlZORl9DQVRBTE9HKTsKKy8vLy8JCXJlcy5hZGQoQXJ0aWZhY3RUeXBlRW51bS5BUFBDX0NPTkZJRyk7CisvLy8vCQlyZXMuYWRkKEFydGlmYWN0VHlwZUVudW0uVkZfTU9EVUxFU19NRVRBREFUQSk7CisvLy8vCQlyZXR1cm4gIlBST0QtVGVkeS1Pbmx5IjsKKy8vLy8JCXJldHVybiAiQS1BSSI7CisvLy8vCQlyZXR1cm4gIkEtQUkiOworLy8JICB9CisJICAKKwkgIAorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKKwkJcmV0dXJuICJjaSI7CisJfQorCQorCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVsZXZhbnRBcnRpZmFjdFR5cGVzKCkgeworCisvLwkJTGlzdDxTdHJpbmc+IHJlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworLy8JCWZvciAoQXJ0aWZhY3RUeXBlRW51bSB0eXBlIDogQXNzZXRUeXBlRW51bS52YWx1ZXMoKSl7CisvLwkJCXJlcy5hZGQodHlwZS5uYW1lKCkpOworLy8JCX0KKwkJcmV0dXJuIEFydGlmYWN0VHlwZUVudW0uZ2V0QWxsVHlwZXMoKTsKKwl9CisKKwkKKwlwdWJsaWMgaW50IGdldFBvbGxpbmdUaW1lb3V0KCkgeworCQlyZXR1cm4gMjA7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0UG9sbGluZ0ludGVydmFsKCkgeworCQlyZXR1cm4gMjA7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisJCXJldHVybiAiMTIzNDU2IjsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRFbnZpcm9ubWVudE5hbWUoKSB7CisJCXJldHVybiAiUFJPRC1Sb20iOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVySUQoKSB7CisJCXJldHVybiAieXM5NjkzLWdyb3VwVmFzeWEiOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVyR3JvdXAoKSB7CisvLwkJcmV0dXJuICJtc28tZ3JvdXBUZWR5IjsKKwkJcmV0dXJuICJ5czk2OTMtY29uc3VtZXJWYXN5YSI7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QXNkY0FkZHJlc3MoKSB7CisJCXJldHVybiAiMTI3LjAuMC4xOjg0NDMiOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRLZXlTdG9yZVBhdGgoKSB7CisJCS8vcmV0dXJuICIiOworCQlyZXR1cm4gImV0Yy9hc2RjLWNsaWVudC5qa3MiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5U3RvcmVQYXNzd29yZCgpIHsKKwkJCisJCXJldHVybiAiQWExMjM0NTYiOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGFjdGl2YXRlU2VydmVyVExTQXV0aCgpIHsKKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9sb2c0ai5wcm9wZXJ0aWVzIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxNTllYwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzQgQEAKKyMgRGVmaW5lIHRoZSByb290IGxvZ2dlciB3aXRoIGFwcGVuZGVyIGZpbGUKK2xvZzRqLnJvb3RMb2dnZXIgPSBERUJVRywgRklMRSwgc3Rkb3V0CisKKyMgRGVmaW5lIHRoZSBmaWxlIGFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5GSUxFPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuRklMRS5GaWxlPSR7dGFyZ2V0bG9nfWxvZ3MvY2ktbG9nLm91dAorCisjIERlZmluZSB0aGUgbGF5b3V0IGZvciBmaWxlIGFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5GSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLkZJTEUubGF5b3V0LmNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICU1cCBbJTEwY10gOiAlbSVuCisKKyMgU2V0IHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBiZWZvcmUgcm9sbG92ZXIKK2xvZzRqLmFwcGVuZGVyLkZJTEUubWF4RmlsZVNpemU9NU1CCisKKyMgU2V0IHRoZSB0aGUgYmFja3VwIGluZGV4Citsb2c0ai5hcHBlbmRlci5GSUxFLm1heEJhY2t1cEluZGV4PTEwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpcmVjdCBsb2cgbWVzc2FnZXMgdG8gc3Rkb3V0Citsb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5UYXJnZXQ9U3lzdGVtLm91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKKyNsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICUtNXAgJWN7MX06JUwgLSAlbSVuCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICU1cCAlMTBjOiVMIC0gJW0lbgorCitsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHk9REVCVUcKK2xvZzRqLmxvZ2dlci5jb20udGhpbmthdXJlbGl1cy50aXRhbi5kaXNrc3RvcmFnZS5jYXNzYW5kcmEuQ2Fzc2FuZHJhVHJhbnNhY3Rpb249SU5GTywgRklMRSwgc3Rkb3V0CisKK2xvZzRqLmxvZ2dlci5vcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscz1UUkFDRSwgRklMRSwgc3Rkb3V0Citsb2c0ai5hZGRpdGl2aXR5Lm9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzPWZhbHNlCisKKwpkaWZmIC0tZ2l0IGEvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTc4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLXBhY2thZ2VzLnlhbWwKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZXM6CisgLSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmdlbmVyYWwKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUudXNlcgorIC0gb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5wcm9wZXJ0eQorIC0gb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5saWZlY3ljbGUKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2UKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZQorIC0gb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5hcnRpZmFjdHMKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuaW1wb3J0cworIC0gb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5jYXRlZ29yeSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLnlhbWwgYi9kaXN0cmlidXRpb24tY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljNDQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9zZGMueWFtbApAQCAtMCwwICsxLDM1IEBACitvdXRwdXRGb2xkZXI6IHRhcmdldAorcmVwb3J0TmFtZTogaW5kZXguaHRtbAorY2F0YWxvZ0JlSG9zdDogYmVob3N0CitjYXRhbG9nRmVIb3N0OiBmZWhvc3QKK2VzSG9zdDogZXNob3N0CitkaXNyaWJ1dGlvbkNsaWVudEhvc3Q6IGRpc0NsaWVudAorY2F0YWxvZ0ZlUG9ydDogODE4MQorY2F0YWxvZ0JlUG9ydDogODA4MAorZGlzcmlidXRpb25DbGllbnRQb3J0OiA4MTgxCitlc1BvcnQ6IDkyMDAKK25lb0hvc3Q6IG5lb0hvc3QKK25lb1BvcnQ6IDc0NzQKK25lb0RCdXNlcm5hbWU6IG5lbzRqCQorbmVvREJwYXNzd29yZDogMTIzNDU2CisKK3Jlc291cmNlQ29uZmlnRGlyOiBzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvdGVzdHMKK2NvbXBvbmVudHNDb25maWdEaXI6IHNyYy90ZXN0L3Jlc291cmNlcy9DSS9jb21wb25lbnRzCitpbXBvcnRSZXNvdXJjZUNvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlCitpbXBvcnRSZXNvdXJjZVRlc3RzQ29uZmlnRGlyOiBzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cworZXJyb3JDb25maWd1cmF0aW9uRmlsZTogLi4vY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbAorCit0aXRhblByb3BlcnRpZXNGaWxlOiBzcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90aXRhbi5wcm9wZXJ0aWVzCisKK3N0b3BPbkNsYXNzRmFpbHVyZTogZmFsc2UKKworI0xpc3Qgb2Ygbm9uLWFic3RyYWN0IHJlc291cmNlcyB0byBrZWVwIGR1cmluZyB0aXRhbiBjbGVhbnVwIGJldHdlZW4gdGVzdHMKKyNPbmx5IDEuMCB2ZXJzaW9uIHdpbGwgYmUga2VwdAorcmVzb3VyY2VzTm90VG9EZWxldGU6CisgICAgIC0gdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgICAtIHRvc2NhLm5vZGVzLkRhdGFiYXNlCisgICAgIC0gdG9zY2Eubm9kZXMuT2JqZWN0U3RvcmFnZQorICAgICAtIHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAtIHRvc2NhLm5vZGVzLkxvYWRCYWxhbmNlcgorICAgICAtIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuUG9ydAorICAgICAtIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmwuTmV0d29yawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90aXRhbi5wcm9wZXJ0aWVzIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RpdGFuLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxZjRkNgotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90aXRhbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorc3RvcmFnZS5iYWNrZW5kPWNhc3NhbmRyYQorc3RvcmFnZS5ob3N0bmFtZT1jYXNzYW5kcmFob3N0CitzdG9yYWdlLnBvcnQ9OTE2MAorCitjYWNoZS5kYi1jYWNoZSA9IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGlzdHJpYnV0aW9uLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9zY3JpcHRzL3N0YXJ0VGVzdC5zaCBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvc2NyaXB0cy9zdGFydFRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2NTlhOAotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvc2NyaXB0cy9zdGFydFRlc3Quc2gKQEAgLTAsMCArMSw4NyBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gdXNhZ2UgeworCWVjaG8gIlVzYWdlOiAkMCA8amFyIGZpbGU+IgorfQorCitmdW5jdGlvbiBleGl0T25FcnJvcigpIHsKKyAgICAgICAgaWYgWyAkMSAtbmUgMCBdCisgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJGYWlsZWQgcnVubmluZyB0YXNrICQyIgorICAgICAgICAgICAgICAgIGV4aXQgMgorICAgICAgICBmaQorfQorCitpZiBbICQjIC1sdCAxIF0KK3RoZW4KKwl1c2FnZQorCWV4aXQgMgorZmkKKworQ1VSUkVOVF9ESVI9YHB3ZGAKK0JBU0VESVI9JChkaXJuYW1lICQwKQorCitpZiBbICR7QkFTRURJUjowOjF9ID0gIi8iIF0KK3RoZW4KKyAgICAgICAgRlVMTF9QQVRIPSRCQVNFRElSCitlbHNlCisgICAgICAgIEZVTExfUEFUSD0kQ1VSUkVOVF9ESVIvJEJBU0VESVIKK2ZpCisKK0xPR1NfUFJPUF9GSUxFPWZpbGU6JHtGVUxMX1BBVEh9L2NvbmYvbG9nNGoucHJvcGVydGllcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitUQVJHRVRfRElSPSR7RlVMTF9QQVRIfS90YXJnZXQKK0NPTkZfRklMRT0ke0ZVTExfUEFUSH0vY29uZi9zZGMueWFtbAorREVCVUc9dHJ1ZQorTWFpbkNsYXNzPW9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnJ1bi5TdGFydFRlc3QKKworSkFSX0ZJTEU9JDEKKworI1RBUkdFVF9ESVI9YGVjaG8gJHtUQVJHRVRfRElSfSB8IHNlZCAncy9cLy9cLy9nJ2AKKyNlY2hvICRUQVJHRVRfRElSCisKK1RFU1RTX0RJUj0vb3B0L2FwcC9zZGMvY2kvcmVzb3VyY2VzL3Rlc3RzCitDT01QT05FTlRTX0RJUj0vb3B0L2FwcC9zZGMvY2kvcmVzb3VyY2VzL2NvbXBvbmVudHMKKworI3NlZCAtaSAncyNcKG91dHB1dEZvbGRlcjpcKS4qI1wxICcke1RBUkdFVF9ESVJ9JyNnJyAkQ09ORl9GSUxFCisjc2VkIC1pICdzI1wocmVzb3VyY2VDb25maWdEaXI6XCkuKiNcMSAnJHtURVNUU19ESVJ9JyNnJyAkQ09ORl9GSUxFCisjc2VkIC1pICdzI1woY29tcG9uZW50c0NvbmZpZ0RpcjpcKS4qI1wxICcke0NPTVBPTkVOVFNfRElSfScjZycgJENPTkZfRklMRQorVEFSR0VUX0xPR19ESVI9IiR7VEFSR0VUX0RJUn0vIgorCitta2RpciAtcCAke1RBUkdFVF9ESVJ9CitpZiBbIC1kICR7VEFSR0VUX0RJUn0gXQordGhlbgorICAgIHJtIC1yZiAke1RBUkdFVF9ESVJ9LyoKKwlleGl0T25FcnJvciAkPyAiRmFpbGVkX3RvX2RlbGV0ZV90YXJnZXRfZGlyIgorZmkKKworZGVidWdfcG9ydD04ODAwCisjSkFWQV9PUFRJT049Ii1qYXZhYWdlbnQ6L3Zhci90bXAvamFjb2NvL2xpYi9qYWNvY29hZ2VudC5qYXI9ZGVzdGZpbGU9amFjb2NvLWl0LmV4ZWMiCitKQVZBX09QVElPTj0iIgorY2FzZSAiJDIiIGluCisJLWRlYnVnKSBlY2hvICJEZWJ1ZyBtb2RlLCBMaXN0ZW4gb24gcG9ydCAkZGVidWdfcG9ydCI7IEpBVkFfT1BUSU9OPSItWGRlYnVnIC1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPSR7ZGVidWdfcG9ydH0iIDs7CisJIiIpIGVjaG8gIlN0YW5kYXJkIG1vZGUiOzsKKwkqKSBlY2hvICJVU0FHRTogc3RhcnRUZXN0LnNoIFstZGVidWddIjs7Citlc2FjCisKK2NtZD0iamF2YSAkSkFWQV9PUFRJT04gLURkaXNwbGF5RXhjZXB0aW9uPXRydWUgLUR0YXJnZXRsb2c9JHtUQVJHRVRfTE9HX0RJUn0gLURjb25maWcucmVzb3VyY2U9JHtDT05GX0ZJTEV9IC1EZGVidWc9JHtERUJVR30gLURsb2c0ai5jb25maWd1cmF0aW9uPSR7TE9HU19QUk9QX0ZJTEV9IC1jcCAkSkFSX0ZJTEUgJHtNYWluQ2xhc3N9IiAKKworI2VjaG8gJGNtZAorI2NvbnNvbGU9YCRjbWRgCisKK2lmIFsgJERFQlVHID09ICJ0cnVlIiBdCit0aGVuCisJJGNtZAorZWxzZQorCSRjbWQgPj4gL2Rldi9udWxsCitmaSAKK3N0YXR1cz1gZWNobyAkP2AKKworCisKK2VjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgorZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMgc3RhdHVzIGlzICR7c3RhdHVzfSAjIyMjIyMjIyMjIyMjIyMjIyIgCitlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKworZXhpdCAkc3RhdHVzIAorCmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24tY2kvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL2Rvd25sb2FkQXJ0aWZhY3RVR04vQ2xpZW50RG93bmxvYWRBcnRpZmFjdC5qYXZhIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kb3dubG9hZEFydGlmYWN0VUdOL0NsaWVudERvd25sb2FkQXJ0aWZhY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzM3Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYnV0aW9uLWNpL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9kb3dubG9hZEFydGlmYWN0VUdOL0NsaWVudERvd25sb2FkQXJ0aWZhY3QuamF2YQpAQCAtMCwwICsxLDQ5MSBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLmRvd25sb2FkQXJ0aWZhY3RVR047CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgYWw3MTRoCisgKiBVUzUxMDAwNyAtIFN0b3J5IDogQVNEQyBEaXN0ciBDbGllbnQgLSBEb3dubG9hZCBBcnRpZmFjdAorICogZm9sbG93aW5nIHRlc3Qgc2V0IHBhcnRpYWxseSBjb3ZlciB0aGUgVVM0NTEzMjcgLSBTdG9yeSA6IEFQSSB0byBkb3dubG9hZCB0aGUgc3BlY2lmaWMgYXJ0aWZhY3QsIGNvdmVyIHRoZSBhdWRpdCBtZXNzYWdlLgorICovCisKKy8vcHVibGljIGNsYXNzIENsaWVudERvd25sb2FkQXJ0aWZhY3QgZXh0ZW5kcyBBdHRTZGNUZXN0eworCXB1YmxpYyBjbGFzcyBDbGllbnREb3dubG9hZEFydGlmYWN0IHsKKwkKKy8vCQlMb2dnZXIgbG9nZ2VyID0gbnVsbDsKKy8vCQkKKy8vCURpc3RyaWJ1dGlvblV0aWxzIGRpc3RyaWJ1dGlvblV0aWxzID0gbmV3IERpc3RyaWJ1dGlvblV0aWxzKCk7CisvLwlEb3dubG9hZEFydGlmYWN0RGV0YWlscyBkb3dubG9hZEFydGlmYWN0RGV0YWlscyA9IG5ldyBEb3dubG9hZEFydGlmYWN0RGV0YWlscygpOworLy8JVXRpbHMgdXRpbHMgPSBuZXcgVXRpbHMoKTsKKy8vCURiVXRpbHMgZGJVdGlscyA9IG5ldyBEYlV0aWxzKCk7CisvLwlVc2VyVXRpbHMgdXNlclV0aWxzID0gbmV3IFVzZXJVdGlscygpOworLy8JUmVzb3VyY2VVdGlscyByZXNvdXJjZVV0aWxzID0gbmV3IFJlc291cmNlVXRpbHMoKTsKKy8vCVNlcnZpY2VVdGlscyBzZXJ2aWNlVXRpbHMgPSBuZXcgU2VydmljZVV0aWxzKCk7CisvLwlBcnRpZmFjdFV0aWxzIGFydGlmYWN0VXRpbHMgPSBuZXcgQXJ0aWZhY3RVdGlscygpOworLy8JcHJpdmF0ZSBKU09OUGFyc2VyIGpzb25QYXJzZXIgPSBuZXcgSlNPTlBhcnNlcigpOworLy8JCisJU3RyaW5nIHNlcnZpY2VCYXNlVmVyc2lvbiA9ICIwLjEiOworLy8JCisvLwlAQmVmb3JlCisvLwlwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQkKKy8vCQlkaXN0cmlidXRpb25VdGlscy5yZXNldEluaXQoKTsKKy8vCQlkYlV0aWxzLmNsZWFuQWxsQXVkaXRzKCk7CisvLwl9CisvLwlAUnVsZSAKKy8vICAgIHB1YmxpYyBzdGF0aWMgVGVzdE5hbWUgbmFtZSA9IG5ldyBUZXN0TmFtZSgpOworLy8JCisvLwl9CisvLwkKKy8vCUBSdWxlIAorLy8gICAgcHVibGljIHN0YXRpYyBUZXN0TmFtZSBuYW1lID0gbmV3IFRlc3ROYW1lKCk7CisvLwkKKy8vLy8JcHVibGljIENsaWVudERvd25sb2FkQXJ0aWZhY3QoKSB7CisvLy8vCQlzdXBlcihuYW1lLCBDbGllbnREb3dubG9hZEFydGlmYWN0LmNsYXNzLmdldE5hbWUoKSk7CisvLy8vCX0KKy8vCisvLwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworLy8vLwkJZ2V0IGRlZmF1bHQgYXJ0aWZhY3QgaW5mbyB0byB1cGxvYWQKKy8vCQlBcnRpZmFjdERlZmluaXRpb24gdXBsb2FkZWRSZXNvdXJjZUFydGlmYWN0SW5mbyA9IGFydGlmYWN0VXRpbHMuY29uc3RydWN0RGVmYXVsdEFydGlmYWN0SW5mbygpOworLy8vLwkJc2V0IGFydGlmYWN0IGluZm8gZm9yIGRvd25sb2FkCisvLwkJZG93bmxvYWRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3ROYW1lKHVwbG9hZGVkUmVzb3VyY2VBcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpOworLy8JCVN0cmluZyBhcnRpZmFjdE5hbWUgPSBkb3dubG9hZEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKTsKKy8vLy8JQW5kcmV5IFRPRE8JU3RyaW5nIHJlc291cmNlQXJ0aWZhY3RVcmwgPSBTdHJpbmcuZm9ybWF0KFVybHMuRE9XTkxPQURfUkVTT1VSQ0VfQVJUSUZBQ1QsKTsKKy8vCQkKKy8vCQlpbnQgbnVtT2ZSZXNvdXJjQXJ0aWZhY3RzID0gMTsKKy8vCQlSZXN0UmVzcG9uc2UgY3JlYXRlQ2VydGlmaWVkUmVzb3VyY2VXaXRoQXJ0aWZhY3RzID0gcmVzb3VyY2VVdGlscy5jcmVhdGVDZXJ0aWZpZWRSZXNvdXJjZVdpdGhBcnRpZmFjdHMocmVzb3VyY2VEZXRhaWxzLCB1cGxvYWRlZFJlc291cmNlQXJ0aWZhY3RJbmZvLCBudW1PZlJlc291cmNBcnRpZmFjdHMpOworLy8JCQorLy8JCQorLy8JCQorLy8JCXRyeXsKKy8vCQlsb2dnZXIuZGVidWcoImFydGlmYWN0IGRldGFpbGVzOiAiKyBkb3dubG9hZEFydGlmYWN0RGV0YWlscy50b1N0cmluZygpKTsKKy8vCQkJUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UgPSBkaXN0cmlidXRpb25VdGlscy5zZW5kR2V0RG93bmxvYWRlZEFydGlmYWN0KGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLCBudWxsKTsKKy8vCQkJZGlzdHJpYnV0aW9uVXRpbHMudmVyaWZ5RG93bmxvYWRlZEFydGlmYWN0KGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UsIHVwbG9hZGVkUmVzb3VyY2VBcnRpZmFjdEluZm8pOworLy8JCQkKKy8vCS8vCQl2YWxpZGF0ZSBhdWRpdCBtZXNzYWdlIHNlcnZlciBzaWRlCisvLwkJCUFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvIGV4cGVjdGVkQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gPSBkaXN0cmlidXRpb25VdGlscy5jb25zdHJ1Y3REZWZhdWx0QXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8oKTsKKy8vCQkJU3RyaW5nIGFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKy8vCQkJQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gYWN0dWFsQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gPSB1c2VyVXRpbHMucGFyc2VEZXN0cmlidXRpb25BdWRpdFJlc3BCeUFjdGlvbihhY3Rpb24pOworLy8JCQlkaXN0cmlidXRpb25VdGlscy52YWxpZGF0ZUFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2UoYWN0dWFsQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8sIGV4cGVjdGVkQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8pOworLy8JCX1maW5hbGx5eworLy8vLwkJCWRlbGV0ZSBjcmVhdGVkIHJlc291cmNlCisvLwkJCXJlc291cmNlVXRpbHMuZGVsZXRlUmVzb3VyY2VfYWxsVmVyc2lvbnMocmVzb3VyY2VEZXRhaWxzLCBVc2VyVXRpbHMuZ2V0QWRtaW5EZXRhaWxzKCkpOworLy8JCX0KKwkJCisvLwl9CisJCisvLwlzZW5kIGFsbCBtYW5kYXRvcnkgaGVhZGVycyBvbmx5CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFNlcnZpY2VBcnRpZmFjdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9ueworCQkKKy8vLy8JCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gc2VydmljZVV0aWxzLmNyZWF0ZURlZmF1bHREZXRhaWxzU2VydmljZSgpOworLy8JCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKy8vCQlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZSgpOworLy8JCXRyeXsKKy8vLy8JCWdldCBkZWZhdWx0IGFydGlmYWN0IGluZm8gdG8gdXBsb2FkCisvLwkJQXJ0aWZhY3REZWZpbml0aW9uIHVwbG9hZGVkUmVzb3VyY2VBcnRpZmFjdEluZm8gPSBhcnRpZmFjdFV0aWxzLmNvbnN0cnVjdERlZmF1bHRBcnRpZmFjdEluZm8oKTsKKy8vCQl1cGxvYWRlZFJlc291cmNlQXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKy8vCQlBcnRpZmFjdERlZmluaXRpb24gdXBsb2FkZWRTZXJ2aWNlQXJ0aWZhY3RJbmZvID0gYXJ0aWZhY3RVdGlscy5jb25zdHJ1Y3REZWZhdWx0QXJ0aWZhY3RJbmZvKCk7CisvLwkJdXBsb2FkZWRTZXJ2aWNlQXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1VUkFOT19QS0cuZ2V0VHlwZSgpKTsKKy8vCQkKKy8vLy8JCXNldCBhcnRpZmFjdCBpbmZvIGZvciBkb3dubG9hZAorLy8JCWRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZSh1cGxvYWRlZFNlcnZpY2VBcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpOworLy8JCWRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1VUkFOT19QS0cuZ2V0VHlwZSgpKTsKKy8vCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZG93bmxvYWRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCk7CisvLwkJCisvLy8vCQljcmVhdGUgZGVmYXVsdCByZXNvdXJjZSBkZXRhaWxzCisvLwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworLy8JCQorLy8JCWludCBudW1PZlJlc291cmNBcnRpZmFjdHMgPSAxOworLy8JCXNlcnZpY2UgPSBzZXJ2aWNlVXRpbHMuY3JlYXRlQ2VydGlmaWVkU2VydmljZVdpdGhSZXNvdXJjZUluc3RhbmNlQW5kQXJ0aWZhY3RzKHNlcnZpY2VEZXRhaWxzLCByZXNvdXJjZURldGFpbHMsIHVwbG9hZGVkUmVzb3VyY2VBcnRpZmFjdEluZm8sIHVwbG9hZGVkU2VydmljZUFydGlmYWN0SW5mbyAsIG51bU9mUmVzb3VyY0FydGlmYWN0cyk7CisvLwkJbG9nZ2VyLmRlYnVnKCJzZXJ2aWNlIHZlcnNpb24gPSAiICsgc2VydmljZS5nZXRWZXJzaW9uKCkpOworLy8JCWxvZ2dlci5kZWJ1Zygic2VydmljZSBkaXN0cmlidXRpb24gc3RhdHVzID0gIiArIHNlcnZpY2UuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCkpOworLy8JCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0cmlidXRpb25TdGF0ZVRvQXBwcm92ZSA9IHNlcnZpY2VVdGlscy5jaGFuZ2VEaXN0cmlidXRpb25TdGF0ZVRvQXBwcm92ZShzZXJ2aWNlLCBVc2VyVXRpbHMuZ2V0R292ZXJub3JEZXRhaWxzMSgpKTsKKy8vCQkKKy8vCQlpbnQgc3RhdHVzID0gY2hhbmdlRGlzdHJpYnV0aW9uU3RhdGVUb0FwcHJvdmUuZ2V0RXJyb3JDb2RlKCk7CisvLwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIHN0YXR1cywgc3RhdHVzID09IDIwMCk7CisvLwkJCisvLwkJc2VydmljZURldGFpbHMuc2V0VmVyc2lvbihzZXJ2aWNlLmdldFZlcnNpb24oKSk7CisvLwkJc2VydmljZURldGFpbHMuc2V0VW5pcXVlSWQoc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKy8vCisvLwkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gY2hhbmdlRGlzdHJpYnV0aW9uU3RhdGVUb0FwcHJvdmUuZ2V0UmVzcG9uc2UoKTsKKy8vCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworLy8JCXNlcnZpY2UgPSBnc29uLmZyb21Kc29uKHJlc3BvbnNlU3RyaW5nLCBTZXJ2aWNlLmNsYXNzKTsKKy8vCQlTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBzZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IGdzb24uZnJvbUpzb24ocmVzcG9uc2VTdHJpbmcsIFNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uLmNsYXNzKTsKKy8vCQlzZXJ2aWNlLnNldERpc3RyaWJ1dGlvblN0YXR1cyhEaXN0cmlidXRpb25TdGF0dXNFbnVtLmZpbmRTdGF0ZShzZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXMoKSkpOworLy8JCURpc3RyaWJ1dGlvblN0YXR1c0VudW0gZGlzdHJpYnV0aW9uU3RhdHVzID0gc2VydmljZS5nZXREaXN0cmlidXRpb25TdGF0dXMoKTsKKy8vCQlhc3NlcnROb3ROdWxsKCJkaXN0cmlidXRpb24gc3RhdGUgaXMgbnVsbCIsZGlzdHJpYnV0aW9uU3RhdHVzLm5hbWUoKSk7CisvLwkJYXNzZXJ0VHJ1ZSgidGhlIGRlZmF1bHQgZGlzdHJpYnV0aW9uIHN0YXRlIGlzIGludmFsaWQiLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRC5lcXVhbHMoZGlzdHJpYnV0aW9uU3RhdHVzKSk7CisvLwkJCisvLwkJU3RyaW5nIHNlcnZpY2VBcnRpZmFjdFVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ESVNUUklCVVRJT05fRE9XTkxPQURfQVJUSUZBQ1Qsc2VydmljZS5nZXROYW1lKCksIHNlcnZpY2UuZ2V0VmVyc2lvbigpLCBhcnRpZmFjdE5hbWUpOworLy8JCWxvZ2dlci5kZWJ1ZygiZG93bmxvYWQgc2VydmljZSBhcnRpZmFjdCB1cmw6ICIrIHNlcnZpY2VBcnRpZmFjdFVybCsgIiBzZXJ2aWNlTmFtZSA9ICIgKyBzZXJ2aWNlLmdldE5hbWUoKSArICIgc2VydmljZSB2ZXJzaW9uID0gIiArIHNlcnZpY2UuZ2V0VmVyc2lvbigpICsgInNlcnZpY2UgYXJ0aWZhY3QgbmFtZSA9ICIgKyBhcnRpZmFjdE5hbWUpOworLy8JCQorLy8JCQorLy8vLwkJCUxvZy5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8vLwkJCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgbnVsbCk7CisvLy8vCQkJZGlzdHJpYnV0aW9uVXRpbHMudmVyaWZ5RG93bmxvYWRlZEFydGlmYWN0KGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UsIHVwbG9hZGVkQXJ0aWZhY3RJbmZvKTsKKy8vLy8JCQkKKy8vLy8JLy8JCXZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2Ugc2VydmVyIHNpZGUKKy8vLy8JCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvID0gZGlzdHJpYnV0aW9uVXRpbHMuY29uc3RydWN0RGVmYXVsdEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKCk7CisvLy8vCQkJU3RyaW5nIGFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKy8vLy8JCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyA9IHVzZXJVdGlscy5wYXJzZURlc3RyaWJ1dGlvbkF1ZGl0UmVzcEJ5QWN0aW9uKGFjdGlvbik7CisvLy8vCQkJZGlzdHJpYnV0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlKGFjdHVhbEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvLCBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKTsKKy8vCQl9ZmluYWxseXsKKy8vLy8JCQlkZWxldGUgY3JlYXRlZCBzZXJ2aWNlCisvLwkJCXNlcnZpY2VVdGlscy5kZWxldGVTZXJ2aWNlX2FsbFZlcnNpb25zKHNlcnZpY2VEZXRhaWxzLCBVc2VyVXRpbHMuZ2V0QWRtaW5EZXRhaWxzKCkpOworLy8JCX0KKwkJCisvLwlAVGVzdAorLy8JcHVibGljIHZvaWQgZG93bmxvYWRTZXJ2aWNlQXJ0aWZhY3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKy8vCQkKKy8vLy8JCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gc2VydmljZVV0aWxzLmNyZWF0ZURlZmF1bHREZXRhaWxzU2VydmljZSgpOworLy8JCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFNlcnZpY2UoKTsKKy8vCQlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZSgpOworLy8JCXRyeXsKKy8vLy8JCWdldCBkZWZhdWx0IGFydGlmYWN0IGluZm8gdG8gdXBsb2FkCisvLwkJQXJ0aWZhY3REZWZpbml0aW9uIHVwbG9hZGVkUmVzb3VyY2VBcnRpZmFjdEluZm8gPSBhcnRpZmFjdFV0aWxzLmNvbnN0cnVjdERlZmF1bHRBcnRpZmFjdEluZm8oKTsKKy8vCQl1cGxvYWRlZFJlc291cmNlQXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtLkhFQVQuZ2V0VHlwZSgpKTsKKy8vCQlBcnRpZmFjdERlZmluaXRpb24gdXBsb2FkZWRTZXJ2aWNlQXJ0aWZhY3RJbmZvID0gYXJ0aWZhY3RVdGlscy5jb25zdHJ1Y3REZWZhdWx0QXJ0aWZhY3RJbmZvKCk7CisvLwkJdXBsb2FkZWRTZXJ2aWNlQXJ0aWZhY3RJbmZvLnNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1VUkFOT19QS0cuZ2V0VHlwZSgpKTsKKy8vCQkKKy8vLy8JCXNldCBhcnRpZmFjdCBpbmZvIGZvciBkb3dubG9hZAorLy8JCWRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZSh1cGxvYWRlZFNlcnZpY2VBcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3ROYW1lKCkpOworLy8JCWRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0VHlwZShBcnRpZmFjdFR5cGVFbnVtLk1VUkFOT19QS0cuZ2V0VHlwZSgpKTsKKy8vCQlTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZG93bmxvYWRBcnRpZmFjdERldGFpbHMuZ2V0QXJ0aWZhY3ROYW1lKCk7CisvLwkJCisvLy8vCQljcmVhdGUgZGVmYXVsdCByZXNvdXJjZSBkZXRhaWxzCisvLwkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworLy8JCQorLy8JCWludCBudW1PZlJlc291cmNBcnRpZmFjdHMgPSAxOworLy8JCXNlcnZpY2UgPSBzZXJ2aWNlVXRpbHMuY3JlYXRlQ2VydGlmaWVkU2VydmljZVdpdGhSZXNvdXJjZUluc3RhbmNlQW5kQXJ0aWZhY3RzKHNlcnZpY2VEZXRhaWxzLCByZXNvdXJjZURldGFpbHMsIHVwbG9hZGVkUmVzb3VyY2VBcnRpZmFjdEluZm8sIHVwbG9hZGVkU2VydmljZUFydGlmYWN0SW5mbyAsIG51bU9mUmVzb3VyY0FydGlmYWN0cyk7CisvLwkJbG9nZ2VyLmRlYnVnKCJzZXJ2aWNlIHZlcnNpb24gPSAiICsgc2VydmljZS5nZXRWZXJzaW9uKCkpOworLy8JCWxvZ2dlci5kZWJ1Zygic2VydmljZSBkaXN0cmlidXRpb24gc3RhdHVzID0gIiArIHNlcnZpY2UuZ2V0RGlzdHJpYnV0aW9uU3RhdHVzKCkpOworLy8JCVJlc3RSZXNwb25zZSBjaGFuZ2VEaXN0cmlidXRpb25TdGF0ZVRvQXBwcm92ZSA9IHNlcnZpY2VVdGlscy5jaGFuZ2VEaXN0cmlidXRpb25TdGF0ZVRvQXBwcm92ZShzZXJ2aWNlLCBVc2VyVXRpbHMuZ2V0R292ZXJub3JEZXRhaWxzMSgpKTsKKy8vCQkKKy8vCQlpbnQgc3RhdHVzID0gY2hhbmdlRGlzdHJpYnV0aW9uU3RhdGVUb0FwcHJvdmUuZ2V0RXJyb3JDb2RlKCk7CisvLwkJYXNzZXJ0VHJ1ZSgicmVzcG9uc2UgY29kZSBpcyBub3QgMjAwLCByZXR1cm5lZCA6IiArIHN0YXR1cywgc3RhdHVzID09IDIwMCk7CisvLwkJCisvLwkJc2VydmljZURldGFpbHMuc2V0VmVyc2lvbihzZXJ2aWNlLmdldFZlcnNpb24oKSk7CisvLwkJc2VydmljZURldGFpbHMuc2V0VW5pcXVlSWQoc2VydmljZS5nZXRVbmlxdWVJZCgpKTsKKy8vCisvLwkJU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gY2hhbmdlRGlzdHJpYnV0aW9uU3RhdGVUb0FwcHJvdmUuZ2V0UmVzcG9uc2UoKTsKKy8vCQlHc29uIGdzb24gPSBuZXcgR3NvbigpOworLy8JCXNlcnZpY2UgPSBnc29uLmZyb21Kc29uKHJlc3BvbnNlU3RyaW5nLCBTZXJ2aWNlLmNsYXNzKTsKKy8vCQlTZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiBzZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbiA9IGdzb24uZnJvbUpzb24ocmVzcG9uc2VTdHJpbmcsIFNlcnZpY2VNZXRhZGF0YURhdGFEZWZpbml0aW9uLmNsYXNzKTsKKy8vCQlzZXJ2aWNlLnNldERpc3RyaWJ1dGlvblN0YXR1cyhEaXN0cmlidXRpb25TdGF0dXNFbnVtLmZpbmRTdGF0ZShzZXJ2aWNlTWV0YWRhdGFEYXRhRGVmaW5pdGlvbi5nZXREaXN0cmlidXRpb25TdGF0dXMoKSkpOworLy8JCURpc3RyaWJ1dGlvblN0YXR1c0VudW0gZGlzdHJpYnV0aW9uU3RhdHVzID0gc2VydmljZS5nZXREaXN0cmlidXRpb25TdGF0dXMoKTsKKy8vCQlhc3NlcnROb3ROdWxsKCJkaXN0cmlidXRpb24gc3RhdGUgaXMgbnVsbCIsZGlzdHJpYnV0aW9uU3RhdHVzLm5hbWUoKSk7CisvLwkJYXNzZXJ0VHJ1ZSgidGhlIGRlZmF1bHQgZGlzdHJpYnV0aW9uIHN0YXRlIGlzIGludmFsaWQiLCBEaXN0cmlidXRpb25TdGF0dXNFbnVtLkRJU1RSSUJVVElPTl9BUFBST1ZFRC5lcXVhbHMoZGlzdHJpYnV0aW9uU3RhdHVzKSk7CisvLwkJCisvLwkJU3RyaW5nIHNlcnZpY2VBcnRpZmFjdFVybCA9IFN0cmluZy5mb3JtYXQoVXJscy5ESVNUUklCVVRJT05fRE9XTkxPQURfQVJUSUZBQ1Qsc2VydmljZS5nZXROYW1lKCksIHNlcnZpY2UuZ2V0VmVyc2lvbigpLCBhcnRpZmFjdE5hbWUpOworLy8JCWxvZ2dlci5kZWJ1ZygiZG93bmxvYWQgc2VydmljZSBhcnRpZmFjdCB1cmw6ICIrIHNlcnZpY2VBcnRpZmFjdFVybCsgIiBzZXJ2aWNlTmFtZSA9ICIgKyBzZXJ2aWNlLmdldE5hbWUoKSArICIgc2VydmljZSB2ZXJzaW9uID0gIiArIHNlcnZpY2UuZ2V0VmVyc2lvbigpICsgInNlcnZpY2UgYXJ0aWZhY3QgbmFtZSA9ICIgKyBhcnRpZmFjdE5hbWUpOworLy8JCQorLy8JCQorLy8vLwkJCUxvZy5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8vLwkJCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgbnVsbCk7CisvLy8vCQkJZGlzdHJpYnV0aW9uVXRpbHMudmVyaWZ5RG93bmxvYWRlZEFydGlmYWN0KGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UsIHVwbG9hZGVkQXJ0aWZhY3RJbmZvKTsKKy8vLy8JCQkKKy8vLy8JLy8JCXZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2Ugc2VydmVyIHNpZGUKKy8vLy8JCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvID0gZGlzdHJpYnV0aW9uVXRpbHMuY29uc3RydWN0RGVmYXVsdEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKCk7CisvLy8vCQkJU3RyaW5nIGFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKy8vLy8JCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyA9IHVzZXJVdGlscy5wYXJzZURlc3RyaWJ1dGlvbkF1ZGl0UmVzcEJ5QWN0aW9uKGFjdGlvbik7CisvLy8vCQkJZGlzdHJpYnV0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlKGFjdHVhbEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvLCBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKTsKKy8vCQl9ZmluYWxseXsKKy8vLy8JCQlkZWxldGUgY3JlYXRlZCBzZXJ2aWNlCisvLwkJCXNlcnZpY2VVdGlscy5kZWxldGVTZXJ2aWNlX2FsbFZlcnNpb25zKHNlcnZpY2VEZXRhaWxzLCBVc2VyVXRpbHMuZ2V0QWRtaW5EZXRhaWxzKCkpOworLy8JCX0KKy8vCQkKKy8vCX0KKy8vCQorLy8vLwlBbmRyZXkgbm90IHJlbGV2YW50LCBkZXYgY2kgc2hvdWxkIGNvdmVyLCBxYSBjYW4ndCBpbmZsdWVuY2Ugb24gc2VuZGluZyBoZWFkZXJzIAorLy8vLy8vCXNlbmQgYWxsIGhlYWRlcnMgbWFuZGF0b3J5IGFuZCBub3QgbWFuZGF0b3J5CisvLy8vCUBUZXN0CisvLy8vCXB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RTdWNjZXNzTWFuZGF0b3J5QW5kTm90TWFuZGF0b3J5SGVhZGVycygpIHRocm93cyBFeGNlcHRpb257CisvLy8vCQkKKy8vLy8JCUxvZy5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8vLwkJCisvLy8vCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOworLy8vLwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uWF9FQ09NUF9JbnN0YW5jZUlELmdldFZhbHVlKCksICJpbnN0YXJfbmFtZSIpOyAvLyBtYW5kYXRvcnkKKy8vLy8JCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgInVzZXJuYW1lUGFzc3dvcmQiKTsgLy8gbWFuZGF0b3J5CQorLy8vLwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQUNDRVBULmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsgLy8gbm90IG1hbmRhdG9yeQorLy8vLwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uWF9FQ09NUF9SRVFVRVNUX0lEX0hFQURFUi5nZXRWYWx1ZSgpLGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLmdldFJlc291cmNlVVVJRCgpKTsvLyBub3QgbWFuZGF0b3J5CisvLy8vCQlMb2cuZGVidWcoImhlYWRlcnMgZGV0YWlsZXM6ICIrIGhlYWRlcnNNYXAudG9TdHJpbmcoKSk7CisvLy8vCQkKKy8vLy8JCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgaGVhZGVyc01hcCk7CisvLy8vCQlkaXN0cmlidXRpb25VdGlscy52ZXJpZnlEb3dubG9hZGVkQXJ0aWZhY3QoZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZSk7CisvLy8vCQkKKy8vLy8vLwkJdmFsaWRhdGUgYXVkaXQgbWVzc2FnZSBzZXJ2ZXIgc2lkZQorLy8vLwkJQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyA9IGRpc3RyaWJ1dGlvblV0aWxzLmNvbnN0cnVjdERlZmF1bHRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbygpOworLy8vLwkJU3RyaW5nIGFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKy8vLy8JCUFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvIGFjdHVhbEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvID0gdXNlclV0aWxzLnBhcnNlRGVzdHJpYnV0aW9uQXVkaXRSZXNwQnlBY3Rpb24oYWN0aW9uKTsKKy8vLy8JCWRpc3RyaWJ1dGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZShhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbywgZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyk7CisvLy8vCQkKKy8vLy8JfQorLy8KKy8vCQorLy8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUZhaWx1cmUgc2NlbmFyaW8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vLy8JQW5kcmV5IG5vdCByZWxldmFudCwgZGV2IGNpIHNob3VsZCBjb3ZlciwgcWEgY2FuJ3QgaW5mbHVlbmNlIG9uIHNlbmRpbmcgaGVhZGVycyAKKy8vLy8vLwltaXNzaW5nIEluc3RhbmNlSUQgbWFuZGF0b3J5IGhlYWRlcgorLy8vLwlAVGVzdAorLy8vLwlwdWJsaWMgdm9pZCBkb3dubG9hZEFydGlmYWN0TWlzc2luZ0luc3RhbmNlSWRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9ueworLy8vLwkJCisvLy8vCQlMb2cuZGVidWcoImFydGlmYWN0IGRldGFpbGVzOiAiKyBkb3dubG9hZEFydGlmYWN0RGV0YWlscy50b1N0cmluZygpKTsKKy8vLy8JCQorLy8vLwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKy8vLy8JCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFVVEhPUklaQVRJT04uZ2V0VmFsdWUoKSwgInVzZXJuYW1lUGFzc3dvcmQiKTsgLy8gbWFuZGF0b3J5CQorLy8vLwkJTG9nLmRlYnVnKCJoZWFkZXJzIGRldGFpbGVzOiAiKyBoZWFkZXJzTWFwLnRvU3RyaW5nKCkpOworLy8vLwkJCisvLy8vCQlSZXN0UmVzcG9uc2UgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZSA9IGRpc3RyaWJ1dGlvblV0aWxzLnNlbmRHZXREb3dubG9hZGVkQXJ0aWZhY3QoZG93bmxvYWRBcnRpZmFjdERldGFpbHMsIGhlYWRlcnNNYXApOworLy8vLwkJCisvLy8vCQlFcnJvckluZm8gZXJyb3JJbmZvID0gdXRpbHMucGFyc2VZYW1sKEFjdGlvblN0YXR1cy5NSVNTSU5HX1hfRUNPTVBfSU5TVEFOQ0VfSUQubmFtZSgpKTsKKy8vLy8JCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhcnRpZmFjdCBkb3dubG9hZCByZXF1ZXN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisvLy8vCQkKKy8vLy8JCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisvLy8vCQl1dGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLk1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRC5uYW1lKCksIHZhcmlhYmxlcywgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKSk7CisvLy8vCQkKKy8vLy8JfQkKKy8vCQorLy8vLwlBbmRyZXkgbm90IHJlbGV2YW50LCBkZXYgY2kgc2hvdWxkIGNvdmVyLCBxYSBjYW4ndCBpbmZsdWVuY2Ugb24gc2VuZGluZyBoZWFkZXJzIAorLy8vLy8vCW1pc3NpbmcgQXV0aG9yaXphdGlvbiBtYW5kYXRvcnkgaGVhZGVyCisvLy8vCUBUZXN0CisvLy8vCXB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RNaXNzaW5nQXV0aG9yaXphdGlvbkhlYWRlcigpIHRocm93cyBFeGNlcHRpb24sIEpTT05FeGNlcHRpb257CisvLy8vCQkKKy8vLy8JCUxvZy5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8vLwkJCisvLy8vCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOworLy8vLwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uWF9FQ09NUF9JbnN0YW5jZUlELmdldFZhbHVlKCksICJ1c2VybmFtZVBhc3N3b3JkIik7IC8vIG1hbmRhdG9yeQkKKy8vLy8JCUxvZy5kZWJ1ZygiaGVhZGVycyBkZXRhaWxlczogIisgaGVhZGVyc01hcC50b1N0cmluZygpKTsKKy8vLy8JCQorLy8vLwkJUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UgPSBkaXN0cmlidXRpb25VdGlscy5zZW5kR2V0RG93bmxvYWRlZEFydGlmYWN0KGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLCBoZWFkZXJzTWFwKTsKKy8vLy8JCQorLy8vLwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IHV0aWxzLnBhcnNlWWFtbChBY3Rpb25TdGF0dXMuRUNPTVBfUkVTRU5EX1dJVEhfQkFTSUNfQVVUSEVOVElDQVRJT05fQ1JFREVOVElBTFMubmFtZSgpKTsKKy8vLy8JCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhcnRpZmFjdCBkb3dubG9hZCByZXF1ZXN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisvLy8vCQkKKy8vLy8JCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisvLy8vCQl1dGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLkVDT01QX1JFU0VORF9XSVRIX0JBU0lDX0FVVEhFTlRJQ0FUSU9OX0NSRURFTlRJQUxTLm5hbWUoKSwgdmFyaWFibGVzLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpKTsKKy8vLy8JCQorLy8vLwl9CisvLwkKKy8vCisvLy8vCWFydGlmYWN0IG5vdCBmb3VuZAorLy8JQFRlc3QKKy8vCXB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RBcnRpZmFjdE5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbnsKKy8vCisvLwkJZG93bmxvYWRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3ROYW1lKCJhcnRpZmFjdE5vdEV4aXN0Iik7CisvLwkJbG9nZ2VyLmRlYnVnKCJhcnRpZmFjdCBkZXRhaWxlczogIisgZG93bmxvYWRBcnRpZmFjdERldGFpbHMudG9TdHJpbmcoKSk7CisvLwkJCisvLwkJUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UgPSBkaXN0cmlidXRpb25VdGlscy5zZW5kR2V0RG93bmxvYWRlZEFydGlmYWN0KGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLCBudWxsKTsKKy8vCQkKKy8vCQlFcnJvckluZm8gZXJyb3JJbmZvID0gdXRpbHMucGFyc2VFcnJvckNvbmZpZ1lhbWwoQWN0aW9uU3RhdHVzLkRJU1RSSUJVVElPTl9BUlRJRkFDVF9OT1RfRk9VTkQubmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYXJ0aWZhY3QgZG93bmxvYWQgcmVxdWVzdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworLy8JCQorLy8JCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisvLwkJdXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5ESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworLy8KKy8vLy8JCXZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2Ugc2VydmVyIHNpZGUKKy8vCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvID0gZGlzdHJpYnV0aW9uVXRpbHMuY29uc3RydWN0RGVmYXVsdEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKCk7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKy8vCQlTdHJpbmcgZGVzYyA9ICJFcnJvcjogQXJ0aWZhY3QgIiArIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpICsgIiB3YXMgbm90IGZvdW5kIjsKKy8vCQlleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvLnNldERlc2MoZGVzYyk7CisvLwkJCisvLwkJU3RyaW5nIGFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKy8vCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyA9IHVzZXJVdGlscy5wYXJzZURlc3RyaWJ1dGlvbkF1ZGl0UmVzcEJ5QWN0aW9uKGFjdGlvbik7CisvLwkJZGlzdHJpYnV0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlKGFjdHVhbEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvLCBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKTsKKy8vCQkKKy8vCX0KKy8vCQorLy8vLwlzZXJ2aWNlIG5vdCBmb3VuZAorLy8JQFRlc3QKKy8vCXB1YmxpYyB2b2lkIGRvd25sb2FkQXJ0aWZhY3RTZXJ2aWNlTmFtZU5vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbnsKKy8vCisvLwkJZG93bmxvYWRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RVUkwoIi9hc2RjL3YxL3NlcnZpY2VzL3NlcnZpY2VOb3RFeGlzdC8wLjEvYXJ0aWZhY3RzL2FhYS5oaCIpOworLy8JCWxvZ2dlci5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8JCQorLy8JCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgbnVsbCk7CisvLwkJCisvLwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IHV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORC5uYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhcnRpZmFjdCBkb3dubG9hZCByZXF1ZXN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisvLwkJCisvLwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKy8vCQl1dGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworLy8KKy8vLy8JCXZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2Ugc2VydmVyIHNpZGUKKy8vCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvID0gZGlzdHJpYnV0aW9uVXRpbHMuY29uc3RydWN0RGVmYXVsdEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKCk7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKy8vLy8JCVRPRE8gQW5kcmV5LCBjaGFuZ2UgZGVzYyBtZXNzYWdlCisvLwkJU3RyaW5nIGRlc2MgPSAiRXJyb3I6IEFydGlmYWN0ICIgKyBkb3dubG9hZEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKSArICIgd2FzIG5vdCBmb3VuZCI7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXREZXNjKGRlc2MpOworLy8JCQorLy8JCVN0cmluZyBhY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisvLwkJQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gYWN0dWFsQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gPSB1c2VyVXRpbHMucGFyc2VEZXN0cmlidXRpb25BdWRpdFJlc3BCeUFjdGlvbihhY3Rpb24pOworLy8JCWRpc3RyaWJ1dGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZShhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbywgZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyk7CisvLwkJCisvLwl9CisvLwkKKy8vCQorLy8vLwlzZXJ2aWNlIHZlcnNpb24gbm90IGZvdW5kCisvLwlAVGVzdAorLy8JcHVibGljIHZvaWQgZG93bmxvYWRBcnRpZmFjdFNlcnZpY2VWZXJzaW9uTm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9ueworLy8KKy8vCQlkb3dubG9hZEFydGlmYWN0RGV0YWlscy5zZXRBcnRpZmFjdFVSTCgiL2FzZGMvdjEvc2VydmljZXMvc2VydmljZU5hbWUvMC44ODgvYXJ0aWZhY3RzL2FhYS5oaCIpOworLy8JCWxvZ2dlci5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8JCQorLy8JCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgbnVsbCk7CisvLwkJCisvLwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IHV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5DT01QT05FTlRfVkVSU0lPTl9OT1RfRk9VTkQubmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYXJ0aWZhY3QgZG93bmxvYWQgcmVxdWVzdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworLy8JCQorLy8JCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisvLwkJdXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5DT01QT05FTlRfVkVSU0lPTl9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXMsIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisvLworLy8vLwkJdmFsaWRhdGUgYXVkaXQgbWVzc2FnZSBzZXJ2ZXIgc2lkZQorLy8JCUFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvIGV4cGVjdGVkQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gPSBkaXN0cmlidXRpb25VdGlscy5jb25zdHJ1Y3REZWZhdWx0QXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8oKTsKKy8vCQlleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvLnNldFN0YXR1cyhlcnJvckluZm8uZ2V0Q29kZSgpLnRvU3RyaW5nKCkpOworLy8vLwkJVE9ETyBBbmRyZXksIGNoYW5nZSBkZXNjIG1lc3NhZ2UKKy8vCQlTdHJpbmcgZGVzYyA9ICJFcnJvcjogQXJ0aWZhY3QgIiArIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLmdldEFydGlmYWN0TmFtZSgpICsgIiB3YXMgbm90IGZvdW5kIjsKKy8vCQlleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvLnNldERlc2MoZGVzYyk7CisvLwkJCisvLwkJU3RyaW5nIGFjdGlvbiA9ICJBcnRpZmFjdERvd25sb2FkIjsKKy8vCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyA9IHVzZXJVdGlscy5wYXJzZURlc3RyaWJ1dGlvbkF1ZGl0UmVzcEJ5QWN0aW9uKGFjdGlvbik7CisvLwkJZGlzdHJpYnV0aW9uVXRpbHMudmFsaWRhdGVBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlKGFjdHVhbEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvLCBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKTsKKy8vCQkJCisvLwl9CisvLwkKKy8vLy8JaW52YWxpZCBIVFRQIG1ldGhvZCwgUFVUIEhUVFAgbWV0aG9kCisvLwlAVGVzdAorLy8JcHVibGljIHZvaWQgZG93bmxvYWRBcnRpZmFjdEJ5UHV0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbnsKKy8vCisvLwkJU3RyaW5nIG1ldGhvZCA9ICJQVVQiOworLy8JCQorLy8JCWxvZ2dlci5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8JCQorLy8JCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZERvd25sb2FkZWRBcnRpZmFjdEJ5TWV0aG9kKGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLCBudWxsLCBtZXRob2QpOworLy8JCQorLy8JCUVycm9ySW5mbyBlcnJvckluZm8gPSB1dGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuTUVUSE9EX05PVF9BTExPV0VEX1RPX0RPV05MT0FEX0FSVElGQUNULm5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFydGlmYWN0IGRvd25sb2FkIHJlcXVlc3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKy8vCQkKKy8vCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworLy8JCXV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuTUVUSE9EX05PVF9BTExPV0VEX1RPX0RPV05MT0FEX0FSVElGQUNULm5hbWUoKSwgdmFyaWFibGVzLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworLy8JCQorLy8JfQorLy8KKy8vLy8JaW52YWxpZCBIVFRQIG1ldGhvZCwgREVMRVRFIEhUVFAgbWV0aG9kCisvLwlAVGVzdAorLy8JcHVibGljIHZvaWQgZG93bmxvYWRBcnRpZmFjdEJ5RGVsZXRlTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbnsKKy8vCisvLwkJU3RyaW5nIG1ldGhvZCA9ICJERUxFVEUiOworLy8JCWRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0TmFtZSgiYXJ0aWZhY3ROb3RFeGlzdCIpOworLy8JCWxvZ2dlci5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8JCQorLy8JCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgbnVsbCk7CisvLwkJCisvLwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IHV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5ESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5ELm5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFydGlmYWN0IGRvd25sb2FkIHJlcXVlc3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKy8vCQkKKy8vCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworLy8JCXV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuRElTVFJJQlVUSU9OX0FSVElGQUNUX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKy8vCisvLy8vCQl2YWxpZGF0ZSBhdWRpdCBtZXNzYWdlIHNlcnZlciBzaWRlCisvLwkJQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyA9IGRpc3RyaWJ1dGlvblV0aWxzLmNvbnN0cnVjdERlZmF1bHRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbygpOworLy8JCWV4cGVjdGVkQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8uc2V0U3RhdHVzKGVycm9ySW5mby5nZXRDb2RlKCkudG9TdHJpbmcoKSk7CisvLwkJU3RyaW5nIGRlc2MgPSAiRXJyb3I6IEFydGlmYWN0ICIgKyBkb3dubG9hZEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKSArICIgd2FzIG5vdCBmb3VuZCI7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXREZXNjKGRlc2MpOworLy8JCQorLy8JCVN0cmluZyBhY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisvLwkJQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gYWN0dWFsQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gPSB1c2VyVXRpbHMucGFyc2VEZXN0cmlidXRpb25BdWRpdFJlc3BCeUFjdGlvbihhY3Rpb24pOworLy8JCWRpc3RyaWJ1dGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZShhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbywgZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyk7CisvLwkJCisvLwkJZG93bmxvYWRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RVUkwoIi9hc2RjL3YxL3NlcnZpY2VzL3NlcnZpY2VOb3RFeGlzdC8wLjEvYXJ0aWZhY3RzL2FhYS5oaCIpOworLy8JCWxvZ2dlci5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8JCQorLy8JCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgbnVsbCk7CisvLwkJCisvLwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IHV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5TRVJWSUNFX05PVF9GT1VORC5uYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygiQ2hlY2sgcmVzcG9uc2UgY29kZSBhZnRlciBhcnRpZmFjdCBkb3dubG9hZCByZXF1ZXN0IiwgZXJyb3JJbmZvLmdldENvZGUoKSwgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZS5nZXRFcnJvckNvZGUoKSk7CisvLwkJCisvLwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKy8vCQl1dGlscy5jaGVja0JvZHlSZXNwb25zZU9uRXJyb3IoQWN0aW9uU3RhdHVzLlNFUlZJQ0VfTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworLy8KKy8vLy8JCXZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2Ugc2VydmVyIHNpZGUKKy8vCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvID0gZGlzdHJpYnV0aW9uVXRpbHMuY29uc3RydWN0RGVmYXVsdEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKCk7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKy8vLy8JCVRPRE8gQW5kcmV5LCBjaGFuZ2UgZGVzYyBtZXNzYWdlCisvLwkJU3RyaW5nIGRlc2MgPSAiRXJyb3I6IEFydGlmYWN0ICIgKyBkb3dubG9hZEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKSArICIgd2FzIG5vdCBmb3VuZCI7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXREZXNjKGRlc2MpOworLy8JCQorLy8JCVN0cmluZyBhY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisvLwkJQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gYWN0dWFsQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gPSB1c2VyVXRpbHMucGFyc2VEZXN0cmlidXRpb25BdWRpdFJlc3BCeUFjdGlvbihhY3Rpb24pOworLy8JCWRpc3RyaWJ1dGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZShhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbywgZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyk7CisvLwkJZG93bmxvYWRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RVUkwoIi9hc2RjL3YxL3NlcnZpY2VzL3NlcnZpY2VOYW1lLzAuODg4L2FydGlmYWN0cy9hYWEuaGgiKTsKKy8vCQlsb2dnZXIuZGVidWcoImFydGlmYWN0IGRldGFpbGVzOiAiKyBkb3dubG9hZEFydGlmYWN0RGV0YWlscy50b1N0cmluZygpKTsKKy8vCQkKKy8vCQlSZXN0UmVzcG9uc2UgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZSA9IGRpc3RyaWJ1dGlvblV0aWxzLnNlbmRHZXREb3dubG9hZGVkQXJ0aWZhY3QoZG93bmxvYWRBcnRpZmFjdERldGFpbHMsIG51bGwpOworLy8JCQorLy8JCUVycm9ySW5mbyBlcnJvckluZm8gPSB1dGlscy5wYXJzZUVycm9yQ29uZmlnWWFtbChBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1ZFUlNJT05fTk9UX0ZPVU5ELm5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFydGlmYWN0IGRvd25sb2FkIHJlcXVlc3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKy8vCQkKKy8vCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworLy8JCXV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuQ09NUE9ORU5UX1ZFUlNJT05fTk9UX0ZPVU5ELm5hbWUoKSwgdmFyaWFibGVzLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworLy8KKy8vLy8JCXZhbGlkYXRlIGF1ZGl0IG1lc3NhZ2Ugc2VydmVyIHNpZGUKKy8vCQlBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyBleHBlY3RlZEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvID0gZGlzdHJpYnV0aW9uVXRpbHMuY29uc3RydWN0RGVmYXVsdEFydGlmYWN0RG93bmxvYWRBdWRpdE1lc3NhZ2VJbmZvKCk7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXRTdGF0dXMoZXJyb3JJbmZvLmdldENvZGUoKS50b1N0cmluZygpKTsKKy8vLy8JCVRPRE8gQW5kcmV5LCBjaGFuZ2UgZGVzYyBtZXNzYWdlCisvLwkJU3RyaW5nIGRlc2MgPSAiRXJyb3I6IEFydGlmYWN0ICIgKyBkb3dubG9hZEFydGlmYWN0RGV0YWlscy5nZXRBcnRpZmFjdE5hbWUoKSArICIgd2FzIG5vdCBmb3VuZCI7CisvLwkJZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mby5zZXREZXNjKGRlc2MpOworLy8JCQorLy8JCVN0cmluZyBhY3Rpb24gPSAiQXJ0aWZhY3REb3dubG9hZCI7CisvLwkJQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gYWN0dWFsQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZUluZm8gPSB1c2VyVXRpbHMucGFyc2VEZXN0cmlidXRpb25BdWRpdFJlc3BCeUFjdGlvbihhY3Rpb24pOworLy8JCWRpc3RyaWJ1dGlvblV0aWxzLnZhbGlkYXRlQXJ0aWZhY3REb3dubG9hZEF1ZGl0TWVzc2FnZShhY3R1YWxBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbywgZXhwZWN0ZWRBcnRpZmFjdERvd25sb2FkQXVkaXRNZXNzYWdlSW5mbyk7CisvLwkJbG9nZ2VyLmRlYnVnKCJhcnRpZmFjdCBkZXRhaWxlczogIisgZG93bmxvYWRBcnRpZmFjdERldGFpbHMudG9TdHJpbmcoKSk7CisvLwkJCisvLwkJUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UgPSBkaXN0cmlidXRpb25VdGlscy5zZW5kRG93bmxvYWRlZEFydGlmYWN0QnlNZXRob2QoZG93bmxvYWRBcnRpZmFjdERldGFpbHMsIG51bGwsIG1ldGhvZCk7CisvLwkJCisvLwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IHV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRURfVE9fRE9XTkxPQURfQVJUSUZBQ1QubmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYXJ0aWZhY3QgZG93bmxvYWQgcmVxdWVzdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworLy8JCQorLy8JCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisvLwkJdXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRURfVE9fRE9XTkxPQURfQVJUSUZBQ1QubmFtZSgpLCB2YXJpYWJsZXMsIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisvLwkJbG9nZ2VyLmRlYnVnKCJhcnRpZmFjdCBkZXRhaWxlczogIisgZG93bmxvYWRBcnRpZmFjdERldGFpbHMudG9TdHJpbmcoKSk7CisvLwkJCisvLwkJUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UgPSBkaXN0cmlidXRpb25VdGlscy5zZW5kRG93bmxvYWRlZEFydGlmYWN0QnlNZXRob2QoZG93bmxvYWRBcnRpZmFjdERldGFpbHMsIG51bGwsIG1ldGhvZCk7CisvLwkJCisvLwkJRXJyb3JJbmZvIGVycm9ySW5mbyA9IHV0aWxzLnBhcnNlRXJyb3JDb25maWdZYW1sKEFjdGlvblN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRURfVE9fRE9XTkxPQURfQVJUSUZBQ1QubmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYXJ0aWZhY3QgZG93bmxvYWQgcmVxdWVzdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworLy8JCQorLy8JCUxpc3Q8U3RyaW5nPiB2YXJpYWJsZXMgPSBBcnJheXMuYXNMaXN0KCk7CisvLwkJdXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRURfVE9fRE9XTkxPQURfQVJUSUZBQ1QubmFtZSgpLCB2YXJpYWJsZXMsIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisvLwkJZG93bmxvYWRBcnRpZmFjdERldGFpbHMuc2V0QXJ0aWZhY3RDaGVja3N1bSgiaW52YWxpZENoZWNrc3VtIik7CisvLwkJbG9nZ2VyLmRlYnVnKCJhcnRpZmFjdCBkZXRhaWxlczogIisgZG93bmxvYWRBcnRpZmFjdERldGFpbHMudG9TdHJpbmcoKSk7CisvLwkJCisvLwkJUmVzdFJlc3BvbnNlIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UgPSBkaXN0cmlidXRpb25VdGlscy5zZW5kR2V0RG93bmxvYWRlZEFydGlmYWN0KGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLCBudWxsKTsKKy8vLy8JCVRPRE8KKy8vCQkKKy8vLy8JCUVycm9ySW5mbyBlcnJvckluZm8gPSB1dGlscy5wYXJzZVlhbWwoQWN0aW9uU3RhdHVzLlNQRUNJRklFRF9TRVJWSUNFX1JFU09VUkNFX1ZFUlNJT05fTk9UX0ZPVU5ELm5hbWUoKSk7CisvLy8vCQlhc3NlcnRFcXVhbHMoIkNoZWNrIHJlc3BvbnNlIGNvZGUgYWZ0ZXIgYXJ0aWZhY3QgZG93bmxvYWQgcmVxdWVzdCIsIGVycm9ySW5mby5nZXRDb2RlKCksIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkpOworLy8vLwkJCisvLy8vCQlMaXN0PFN0cmluZz4gdmFyaWFibGVzID0gQXJyYXlzLmFzTGlzdCgpOworLy8vLwkJdXRpbHMuY2hlY2tCb2R5UmVzcG9uc2VPbkVycm9yKEFjdGlvblN0YXR1cy5TUEVDSUZJRURfU0VSVklDRV9SRVNPVVJDRV9WRVJTSU9OX05PVF9GT1VORC5uYW1lKCksIHZhcmlhYmxlcywgZG93bmxvYWRBcnRpZmFjdFJlc3RSZXNwb25zZS5nZXRSZXNwb25zZSgpKSk7CisvLworLy8JCWRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnNldEFydGlmYWN0Q2hlY2tzdW0oImludmFsaWRDaGVja3N1bSIpOworLy8JCWxvZ2dlci5kZWJ1ZygiYXJ0aWZhY3QgZGV0YWlsZXM6ICIrIGRvd25sb2FkQXJ0aWZhY3REZXRhaWxzLnRvU3RyaW5nKCkpOworLy8JCQorLy8JCVJlc3RSZXNwb25zZSBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlID0gZGlzdHJpYnV0aW9uVXRpbHMuc2VuZEdldERvd25sb2FkZWRBcnRpZmFjdChkb3dubG9hZEFydGlmYWN0RGV0YWlscywgbnVsbCk7CisvLy8vCQlUT0RPCisvLwkJCisvLy8vCQlFcnJvckluZm8gZXJyb3JJbmZvID0gdXRpbHMucGFyc2VZYW1sKEFjdGlvblN0YXR1cy5TUEVDSUZJRURfU0VSVklDRV9SRVNPVVJDRV9WRVJTSU9OX05PVF9GT1VORC5uYW1lKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKCJDaGVjayByZXNwb25zZSBjb2RlIGFmdGVyIGFydGlmYWN0IGRvd25sb2FkIHJlcXVlc3QiLCBlcnJvckluZm8uZ2V0Q29kZSgpLCBkb3dubG9hZEFydGlmYWN0UmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpKTsKKy8vLy8JCQorLy8vLwkJTGlzdDxTdHJpbmc+IHZhcmlhYmxlcyA9IEFycmF5cy5hc0xpc3QoKTsKKy8vLy8JCXV0aWxzLmNoZWNrQm9keVJlc3BvbnNlT25FcnJvcihBY3Rpb25TdGF0dXMuU1BFQ0lGSUVEX1NFUlZJQ0VfUkVTT1VSQ0VfVkVSU0lPTl9OT1RfRk9VTkQubmFtZSgpLCB2YXJpYWJsZXMsIGRvd25sb2FkQXJ0aWZhY3RSZXN0UmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSkpOworLy8JCQorLy8JfQorLy8JCisvLworLy8JCisvLwkKKwkKKwl9CisJCit9CmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNjZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcG9tLnhtbApAQCAtMCwwICsxLDgzMyBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwk8YXJ0aWZhY3RJZD5zZGMtbWFpbjwvYXJ0aWZhY3RJZD4KKwk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisKKworCTxtb2R1bGVzPgorCQk8bW9kdWxlPnNlY3VyaXR5LXV0aWxzPC9tb2R1bGU+CisJCTxtb2R1bGU+Y29tbW9uLWFwcC1hcGk8L21vZHVsZT4KKwkJPG1vZHVsZT5jb21tb24tYmU8L21vZHVsZT4KKwkJPG1vZHVsZT5jYXRhbG9nLWRhbzwvbW9kdWxlPgorCQk8bW9kdWxlPmNhdGFsb2ctbW9kZWw8L21vZHVsZT4KKwkJPG1vZHVsZT5jYXRhbG9nLWJlPC9tb2R1bGU+CisJCTxtb2R1bGU+YXNkY3Rvb2w8L21vZHVsZT4KKwkJPG1vZHVsZT5jYXRhbG9nLXVpPC9tb2R1bGU+CisJCTxtb2R1bGU+Y2F0YWxvZy1mZTwvbW9kdWxlPgorCQk8bW9kdWxlPmFzZGMtdGVzdHM8L21vZHVsZT4KKwkJPG1vZHVsZT51aS1jaTwvbW9kdWxlPgorCQk8bW9kdWxlPnNkYy1vcy1jaGVmPC9tb2R1bGU+CisKKwkJPCEtLTxtb2R1bGU+b3BlbmVjb21wLWJlPC9tb2R1bGU+LS0+CisJCTwhLS08bW9kdWxlPm9wZW5lY29tcC11aTwvbW9kdWxlPi0tPgorCisJPC9tb2R1bGVzPgorCisKKworCTxwcm9wZXJ0aWVzPgorCisJCTwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+CisJCTwhLS0gR2VuZXJpYyBwcm9wZXJ0aWVzIC0tPgorCQk8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgorCQk8YnVpbGQudHlwZT4tU05BUFNIT1Q8L2J1aWxkLnR5cGU+CisJCTxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorCisKKwkJPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJPCEtLSBWZXJzaW9ucyAtLT4KKwkJPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJPCEtLSBHbG9iYWwgcHJvamVjdCB2ZXJzaW9uIC0tPgorCQk8YXNkYy5tYWpvci52ZXJzaW9uPjE2MTA8L2FzZGMubWFqb3IudmVyc2lvbj4KKwkJPGFzZGMubWlub3IudmVyc2lvbj4wPC9hc2RjLm1pbm9yLnZlcnNpb24+CisJCTxhc2RjLnNlcnZpY2VwYWNrLnZlcnNpb24+MjwvYXNkYy5zZXJ2aWNlcGFjay52ZXJzaW9uPgorCQk8c3ByaW50Lm51bWJlcj4zMzwvc3ByaW50Lm51bWJlcj4KKwkJPGFzZGMuZnVsbC52ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvYXNkYy5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBCRSAtLT4KKwkJPGNhdGFsb2ctYmUubWFqb3IudmVyc2lvbj4ke2FzZGMubWFqb3IudmVyc2lvbn08L2NhdGFsb2ctYmUubWFqb3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctYmUubWlub3IudmVyc2lvbj4ke2FzZGMubWlub3IudmVyc2lvbn08L2NhdGFsb2ctYmUubWlub3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctYmUuc2VydmljZXBhY2sudmVyc2lvbj4ke2FzZGMuc2VydmljZXBhY2sudmVyc2lvbn08L2NhdGFsb2ctYmUuc2VydmljZXBhY2sudmVyc2lvbj4KKwkJPGNhdGFsb2ctYmUuZnVsbC52ZXJzaW9uPiR7Y2F0YWxvZy1iZS5tYWpvci52ZXJzaW9ufS4ke2NhdGFsb2ctYmUubWlub3IudmVyc2lvbn0uJHtjYXRhbG9nLWJlLnNlcnZpY2VwYWNrLnZlcnNpb259JHtidWlsZC50eXBlfTwvY2F0YWxvZy1iZS5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBGRSAtLT4KKwkJPGNhdGFsb2ctZmUubWFqb3IudmVyc2lvbj4ke2FzZGMubWFqb3IudmVyc2lvbn08L2NhdGFsb2ctZmUubWFqb3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctZmUubWlub3IudmVyc2lvbj4ke2FzZGMubWlub3IudmVyc2lvbn08L2NhdGFsb2ctZmUubWlub3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctZmUuc2VydmljZXBhY2sudmVyc2lvbj4ke2FzZGMuc2VydmljZXBhY2sudmVyc2lvbn08L2NhdGFsb2ctZmUuc2VydmljZXBhY2sudmVyc2lvbj4KKwkJPGNhdGFsb2ctZmUuZnVsbC52ZXJzaW9uPiR7Y2F0YWxvZy1mZS5tYWpvci52ZXJzaW9ufS4ke2NhdGFsb2ctZmUubWlub3IudmVyc2lvbn0uJHtjYXRhbG9nLWZlLnNlcnZpY2VwYWNrLnZlcnNpb259JHtidWlsZC50eXBlfTwvY2F0YWxvZy1mZS5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBDSSAtLT4KKwkJPGNhdGFsb2ctY2kubWFqb3IudmVyc2lvbj4ke2FzZGMubWFqb3IudmVyc2lvbn08L2NhdGFsb2ctY2kubWFqb3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctY2kubWlub3IudmVyc2lvbj4ke2FzZGMubWlub3IudmVyc2lvbn08L2NhdGFsb2ctY2kubWlub3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctY2kuc2VydmljZXBhY2sudmVyc2lvbj4ke2FzZGMuc2VydmljZXBhY2sudmVyc2lvbn08L2NhdGFsb2ctY2kuc2VydmljZXBhY2sudmVyc2lvbj4KKwkJPGNhdGFsb2ctY2kuZnVsbC52ZXJzaW9uPiR7Y2F0YWxvZy1jaS5tYWpvci52ZXJzaW9ufS4ke2NhdGFsb2ctY2kubWlub3IudmVyc2lvbn0uJHtjYXRhbG9nLWNpLnNlcnZpY2VwYWNrLnZlcnNpb259JHtidWlsZC50eXBlfTwvY2F0YWxvZy1jaS5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBVSSAtLT4KKwkJPGNhdGFsb2ctdWkubWFqb3IudmVyc2lvbj4ke2FzZGMubWFqb3IudmVyc2lvbn08L2NhdGFsb2ctdWkubWFqb3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctdWkubWlub3IudmVyc2lvbj4ke2FzZGMubWlub3IudmVyc2lvbn08L2NhdGFsb2ctdWkubWlub3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctdWkuc2VydmljZXBhY2sudmVyc2lvbj4ke2FzZGMuc2VydmljZXBhY2sudmVyc2lvbn08L2NhdGFsb2ctdWkuc2VydmljZXBhY2sudmVyc2lvbj4KKwkJPGNhdGFsb2ctdWkuZnVsbC52ZXJzaW9uPiR7Y2F0YWxvZy11aS5tYWpvci52ZXJzaW9ufS4ke2NhdGFsb2ctdWkubWlub3IudmVyc2lvbn0uJHtjYXRhbG9nLXVpLnNlcnZpY2VwYWNrLnZlcnNpb259JHtidWlsZC50eXBlfTwvY2F0YWxvZy11aS5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBNb2RlbCAtLT4KKwkJPGNhdGFsb2ctbW9kZWwubWFqb3IudmVyc2lvbj4ke2FzZGMubWFqb3IudmVyc2lvbn08L2NhdGFsb2ctbW9kZWwubWFqb3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctbW9kZWwubWlub3IudmVyc2lvbj4ke2FzZGMubWlub3IudmVyc2lvbn08L2NhdGFsb2ctbW9kZWwubWlub3IudmVyc2lvbj4KKwkJPGNhdGFsb2ctbW9kZWwuc2VydmljZXBhY2sudmVyc2lvbj4ke2FzZGMuc2VydmljZXBhY2sudmVyc2lvbn08L2NhdGFsb2ctbW9kZWwuc2VydmljZXBhY2sudmVyc2lvbj4KKwkJPGNhdGFsb2ctbW9kZWwuZnVsbC52ZXJzaW9uPiR7Y2F0YWxvZy1tb2RlbC5tYWpvci52ZXJzaW9ufS4ke2NhdGFsb2ctbW9kZWwubWlub3IudmVyc2lvbn0uJHtjYXRhbG9nLW1vZGVsLnNlcnZpY2VwYWNrLnZlcnNpb259JHtidWlsZC50eXBlfTwvY2F0YWxvZy1tb2RlbC5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBDSEVGIC0tPgorCQk8YXNkYy1jaGVmLm1ham9yLnZlcnNpb24+JHthc2RjLm1ham9yLnZlcnNpb259PC9hc2RjLWNoZWYubWFqb3IudmVyc2lvbj4KKwkJPGFzZGMtY2hlZi5taW5vci52ZXJzaW9uPiR7YXNkYy5taW5vci52ZXJzaW9ufTwvYXNkYy1jaGVmLm1pbm9yLnZlcnNpb24+CisJCTxhc2RjLWNoZWYuc2VydmljZXBhY2sudmVyc2lvbj4ke2FzZGMuc2VydmljZXBhY2sudmVyc2lvbn08L2FzZGMtY2hlZi5zZXJ2aWNlcGFjay52ZXJzaW9uPgorCQk8YXNkYy1jaGVmLmZ1bGwudmVyc2lvbj4ke2FzZGMtY2hlZi5tYWpvci52ZXJzaW9ufS4ke2FzZGMtY2hlZi5taW5vci52ZXJzaW9ufS4ke2FzZGMtY2hlZi5zZXJ2aWNlcGFjay52ZXJzaW9ufSR7YnVpbGQudHlwZX08L2FzZGMtY2hlZi5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBURVNUUyAtLT4KKwkJPHNkbmMtdGVzdHMubWFqb3IudmVyc2lvbj4ke2FzZGMubWFqb3IudmVyc2lvbn08L3NkbmMtdGVzdHMubWFqb3IudmVyc2lvbj4KKwkJPHNkbmMtdGVzdHMubWlub3IudmVyc2lvbj4ke2FzZGMubWlub3IudmVyc2lvbn08L3NkbmMtdGVzdHMubWlub3IudmVyc2lvbj4KKwkJPHNkbmMtdGVzdHMuc2VydmljZXBhY2sudmVyc2lvbj4ke2FzZGMuc2VydmljZXBhY2sudmVyc2lvbn08L3NkbmMtdGVzdHMuc2VydmljZXBhY2sudmVyc2lvbj4KKwkJPHNkbmMtdGVzdHMuZnVsbC52ZXJzaW9uPiR7c2RuYy10ZXN0cy5tYWpvci52ZXJzaW9ufS4ke3NkbmMtdGVzdHMubWlub3IudmVyc2lvbn0uJHtzZG5jLXRlc3RzLnNlcnZpY2VwYWNrLnZlcnNpb259JHtidWlsZC50eXBlfTwvc2RuYy10ZXN0cy5mdWxsLnZlcnNpb24+CisKKwkJPCEtLSBURVNUUzIgLS0+CisJCTxhc2RjLXRlc3RzLm1ham9yLnZlcnNpb24+JHthc2RjLm1ham9yLnZlcnNpb259PC9hc2RjLXRlc3RzLm1ham9yLnZlcnNpb24+CisJCTxhc2RjLXRlc3RzLm1pbm9yLnZlcnNpb24+JHthc2RjLm1pbm9yLnZlcnNpb259PC9hc2RjLXRlc3RzLm1pbm9yLnZlcnNpb24+CisJCTxhc2RjLXRlc3RzLnNlcnZpY2VwYWNrLnZlcnNpb24+JHthc2RjLnNlcnZpY2VwYWNrLnZlcnNpb259PC9hc2RjLXRlc3RzLnNlcnZpY2VwYWNrLnZlcnNpb24+CisJCTxhc2RjLXRlc3RzLmZ1bGwudmVyc2lvbj4ke2FzZGMtdGVzdHMubWFqb3IudmVyc2lvbn0uJHthc2RjLXRlc3RzLm1pbm9yLnZlcnNpb259LiR7YXNkYy10ZXN0cy5zZXJ2aWNlcGFjay52ZXJzaW9ufSR7YnVpbGQudHlwZX08L2FzZGMtdGVzdHMuZnVsbC52ZXJzaW9uPgorCisKKwkJPCEtLSBTdWIgbW9kdWxlcyB2ZXJzaW9uaW5nIC0tPgorCQk8c2RuYy10ZXN0cy52ZXJzaW9uPiR7YXNkYy5mdWxsLnZlcnNpb259PC9zZG5jLXRlc3RzLnZlcnNpb24+CisJCTxhc2RjLXRlc3RzLnZlcnNpb24+JHthc2RjLmZ1bGwudmVyc2lvbn08L2FzZGMtdGVzdHMudmVyc2lvbj4KKwkJPGNhdGFsb2ctZGFvLnZlcnNpb24+JHthc2RjLmZ1bGwudmVyc2lvbn08L2NhdGFsb2ctZGFvLnZlcnNpb24+CisJCTxjYXRhbG9nLW1vZGVsLnZlcnNpb24+JHthc2RjLmZ1bGwudmVyc2lvbn08L2NhdGFsb2ctbW9kZWwudmVyc2lvbj4KKwkJPGNvbW1vbi1hcHAtYXBpLnZlcnNpb24+JHthc2RjLmZ1bGwudmVyc2lvbn08L2NvbW1vbi1hcHAtYXBpLnZlcnNpb24+CisJCTxjb21tb24tYmUudmVyc2lvbj4ke2FzZGMuZnVsbC52ZXJzaW9ufTwvY29tbW9uLWJlLnZlcnNpb24+CisJCTxzZWN1cml0eS11dGlscy52ZXJzaW9uPiR7YXNkYy5mdWxsLnZlcnNpb259PC9zZWN1cml0eS11dGlscy52ZXJzaW9uPgorCQk8YXNkY3Rvb2wudmVyc2lvbj4ke2FzZGMuZnVsbC52ZXJzaW9ufTwvYXNkY3Rvb2wudmVyc2lvbj4KKworCisJCTwhLS0gM3JkIHBhcnRpZXMgdmVyc2lvbnMgLS0+CisJCTxsYW5nMy52ZXJzaW9uPjMuMy4yPC9sYW5nMy52ZXJzaW9uPgorCQk8Z3VhdmEudmVyc2lvbj4xOC4wPC9ndWF2YS52ZXJzaW9uPgorCQk8dGl0YW4udmVyc2lvbj4xLjAuMDwvdGl0YW4udmVyc2lvbj4KKwkJPHNwcmluZy1ib290LnZlcnNpb24+MS4xLjYuUkVMRUFTRTwvc3ByaW5nLWJvb3QudmVyc2lvbj4KKwkJPHNwcmluZy52ZXJzaW9uPjQuMy40LlJFTEVBU0U8L3NwcmluZy52ZXJzaW9uPgorCQk8c3ByaW5nLnNlY3VyaXR5LnZlcnNpb24+My4yLjMuUkVMRUFTRTwvc3ByaW5nLnNlY3VyaXR5LnZlcnNpb24+CisJCTxzcHJpbmcubGRhcC52ZXJzaW9uPjIuMC4xLlJFTEVBU0U8L3NwcmluZy5sZGFwLnZlcnNpb24+CisJCTxtb2NraXRvLnZlcnNpb24+MS45LjA8L21vY2tpdG8udmVyc2lvbj4KKwkJPGVjb21wLnZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L2Vjb21wLnZlcnNpb24+CisJCTxhcnRlZmFjdC1nZW4tYXBpLnZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L2FydGVmYWN0LWdlbi1hcGkudmVyc2lvbj4KKwkJPGFydGVmYWN0LWdlbi1jb3JlLnZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L2FydGVmYWN0LWdlbi1jb3JlLnZlcnNpb24+CisJCTxkb3gtY29tbW9uLWxpYi52ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC9kb3gtY29tbW9uLWxpYi52ZXJzaW9uPgorCisJCQorCQk8IS0tIEVsYXN0aWMgU2VhcmNoIG1hcHBlciAocmVmZXJlbmNlIHRoZSBlbGFzdGljIHNlYXJjaCB2ZXJzaW9uIGFjdHVhbGx5KS4gLS0+CisJCTxlbGFzdGljLXNlYXJjaC52ZXJzaW9uPjIuMS4wPC9lbGFzdGljLXNlYXJjaC52ZXJzaW9uPgorCQk8c3ByaW5nb2NraXRvLnZlcnNpb24+MS4wLjQ8L3NwcmluZ29ja2l0by52ZXJzaW9uPgorCQk8YWxpZW40Y2xvdWQudmVyc2lvbj4xLjAuMC1TTTE5PC9hbGllbjRjbG91ZC52ZXJzaW9uPgorCQk8Y2F0YWxvZy1hcnRpZmFjdHMudmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvY2F0YWxvZy1hcnRpZmFjdHMudmVyc2lvbj4KKwkJPGNhdGFsb2ctYnVpbGRlcnMudmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvY2F0YWxvZy1idWlsZGVycy52ZXJzaW9uPgorCQk8amV0dHkudmVyc2lvbj45LjIuMTAudjIwMTUwMzEwPC9qZXR0eS52ZXJzaW9uPgorCisJCTwhLS0gSlNPTiBhbmQgWUFNTCBQYXJzaW5nIC0tPgorCQk8amFja3Nvbi52ZXJzaW9uPjIuNi4yPC9qYWNrc29uLnZlcnNpb24+CisJCTxqYWNrc29uLmFubm90YXRpb25zLnZlcnNpb24+Mi42LjA8L2phY2tzb24uYW5ub3RhdGlvbnMudmVyc2lvbj4KKworCQk8IS0tIFlhbWwgZm9yIHByb3BlcnRpZXMgLS0+CisJCTxzbmFrZXlhbWwudmVyc2lvbj4xLjEyPC9zbmFrZXlhbWwudmVyc2lvbj4KKwkJPGZ1bmN0aW9uYWxqYXZhLnZlcnNpb24+NC4yPC9mdW5jdGlvbmFsamF2YS52ZXJzaW9uPgorCQk8aHR0cGNsaWVudC52ZXJzaW9uPjQuNC4xPC9odHRwY2xpZW50LnZlcnNpb24+CisJCTxodHRwY29yZS52ZXJzaW9uPjQuNC4xPC9odHRwY29yZS52ZXJzaW9uPgorCQk8anNvbi1zaW1wbGUudmVyc2lvbj4xLjE8L2pzb24tc2ltcGxlLnZlcnNpb24+CisJCTxqZXR0eS5zZXJ2bGV0cy52ZXJzaW9uPjkuMi4xMC52MjAxNTAzMTA8L2pldHR5LnNlcnZsZXRzLnZlcnNpb24+CisKKwkJPCEtLSBMb2dnaW5nIHN0YXJ0IC0tPgorCQk8IS0tIGxvZ2JhY2sgLS0+CisJCTxncm9vdnkudmVyc2lvbj4yLjMuNTwvZ3Jvb3Z5LnZlcnNpb24+CisJCTxqYW5pbm8udmVyc2lvbj4zLjAuNjwvamFuaW5vLnZlcnNpb24+CisJCTwhLS0gYXNwZWN0cyAtLT4KKwkJPGpjYWJpLnZlcnNpb24+MC4yMC4xPC9qY2FiaS52ZXJzaW9uPgorCQk8YXNwZWN0anJ0LnZlcnNpb24+MS44LjQ8L2FzcGVjdGpydC52ZXJzaW9uPgorCQk8amNhYmkucGx1Z2luLnZlcnNpb24+MC4xMy4yPC9qY2FiaS5wbHVnaW4udmVyc2lvbj4KKwkJPCEtLSBMb2dnaW5nIGVuZCAtLT4KKwkJPCEtLSBTeXN0ZW0gTWV0cmljcyAtLT4KKwkJPHNpZ2FyLnZlcnNpb24+MS42LjQ8L3NpZ2FyLnZlcnNpb24+CisKKworCQk8IS0tSmFDb0NPIC0tPgorCQk8c29uYXIuamF2YS5jb3ZlcmFnZVBsdWdpbj5qYWNvY288L3NvbmFyLmphdmEuY292ZXJhZ2VQbHVnaW4+CisJCTxzb25hci5qYWNvY28ucmVwb3J0UGF0aD4ke3Byb2plY3QuYmFzZWRpcn0vdGFyZ2V0L2phY29jby5leGVjPC9zb25hci5qYWNvY28ucmVwb3J0UGF0aD4KKwkJPHNvbmFyLmphY29jby5pdFJlcG9ydFBhdGg+JHtwcm9qZWN0LmJhc2VkaXJ9L3RhcmdldC9pdC1qYWNvY28uZXhlYzwvc29uYXIuamFjb2NvLml0UmVwb3J0UGF0aD4KKwkJPCEtLXNvbmFyLmxhbmd1YWdlPmphdmE8L3NvbmFyLmxhbmd1YWdlLS0+CisJCTxzb25hci52ZXJzaW9uPiR7YXNkYy5tYWpvci52ZXJzaW9ufTwvc29uYXIudmVyc2lvbj4KKworCQk8IS0tY2Fzc2FuZHJhIC0tPgorCQk8Y2Fzc2FuZHJhLmRyaXZlci52ZXJzaW9uPjMuMC4wPC9jYXNzYW5kcmEuZHJpdmVyLnZlcnNpb24+CisgICAgICAgIAorCQk8IS0tIFNvbmFyIHByb3BlcnRpZXMgLS0+CisJCTxzb25hci5sb2dpbj5zb25hcnVzZXI8L3NvbmFyLmxvZ2luPgorCQk8c29uYXIucGFzc3dvcmQ+dXM3VVNpMEh0dTkzbkZZOTFEUHVRTEZvNmViS2NLWHY8L3NvbmFyLnBhc3N3b3JkPgorCQk8c29uYXIuaG9zdC51cmw+aHR0cDovLzEwNC4yMzkuMTQ1Ljg6OTAwMDwvc29uYXIuaG9zdC51cmw+CisJCTxzb25hci5zb3VyY2VFbmNvZGluZz4ke3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmd9PC9zb25hci5zb3VyY2VFbmNvZGluZz4KKwkJPHNvbmFyLnNraXBEZXNpZ24+dHJ1ZTwvc29uYXIuc2tpcERlc2lnbj4KKwkJPHNvbmFyLnByb2plY3RCYXNlRGlyPiR7cHJvamVjdC5iYXNlZGlyfTwvc29uYXIucHJvamVjdEJhc2VEaXI+CisgICAgICAgIDxzb25hci5zb3VyY2VzPi48L3NvbmFyLnNvdXJjZXM+CisJCTxzb25hci5leGNsdXNpb25zPioqL3NjcmlwdHMvKiovKjwvc29uYXIuZXhjbHVzaW9ucz4KKyAgICAgICAgPHNvbmFyLnRlc3QuZXhjbHVzaW9ucz4qKi90ZXN0LyoqLyosKiovdGVzdHMvKiovKjwvc29uYXIudGVzdC5leGNsdXNpb25zPgorICAgICAgICA8c29uYXIuaW5jbHVzaW9ucz5hcHAvKiovKi5qcyxzZXJ2ZXItbW9jay8qKi8qLmpzLHNyYy8qKi8qLmpzLHNyYy9tYWluLyoqLyouamF2YTwvc29uYXIuaW5jbHVzaW9ucz4KKyAgICAgICAgCisgICAgICAgIDwhLS1uZXh1cy0tPgorICAgICAgICA8bmV4dXMucHJveHk+aHR0cHM6Ly9uZXh1cy5vcGVuZWNvbXAub3JnPC9uZXh1cy5wcm94eT4KKwk8L3Byb3BlcnRpZXM+CisKKwk8cmVwb3J0aW5nPgorCQk8cGx1Z2lucz4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuMTAuNDwvdmVyc2lvbj4KKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPGZhaWxPbkVycm9yPmZhbHNlPC9mYWlsT25FcnJvcj4KKwkJCQkJPGRvY2xldD5vcmcudW1sZ3JhcGguZG9jbGV0LlVtbEdyYXBoRG9jPC9kb2NsZXQ+CisJCQkJCTxkb2NsZXRBcnRpZmFjdD4KKwkJCQkJCTxncm91cElkPm9yZy51bWxncmFwaDwvZ3JvdXBJZD4KKwkJCQkJCTxhcnRpZmFjdElkPnVtbGdyYXBoPC9hcnRpZmFjdElkPgorCQkJCQkJPHZlcnNpb24+NS42PC92ZXJzaW9uPgorCQkJCQk8L2RvY2xldEFydGlmYWN0PgorCQkJCQk8YWRkaXRpb25hbHBhcmFtPi12aWV3czwvYWRkaXRpb25hbHBhcmFtPgorCQkJCQk8dXNlU3RhbmRhcmREb2NsZXRPcHRpb25zPnRydWU8L3VzZVN0YW5kYXJkRG9jbGV0T3B0aW9ucz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvcmVwb3J0aW5nPgorCisKKwk8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisJCTxkZXBlbmRlbmNpZXM+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4xLjQuMDwvdmVyc2lvbj4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2d1YXZhLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2xhbmczLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZWxhc3RpY3NlYXJjaDwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5lbGFzdGljc2VhcmNoPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7ZWxhc3RpYy1zZWFyY2gudmVyc2lvbn08L3ZlcnNpb24+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj45LjIuMTAudjIwMTUwMzEwPC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjkuMi4xMC52MjAxNTAzMTA8L3ZlcnNpb24+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmpldHR5LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj45LjIuMTAudjIwMTUwMzEwPC92ZXJzaW9uPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXJzZXktYm9tPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuMjQ8L3ZlcnNpb24+CisJCQkJPHR5cGU+cG9tPC90eXBlPgorCQkJCTxzY29wZT5pbXBvcnQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjEuNy4xMDwvdmVyc2lvbj4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjU8L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi4yNDwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuMjQ8L3ZlcnNpb24+CisJCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjI0PC92ZXJzaW9uPgorCQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPCEtLSB5YW1sIHRvIG9iamVjdCBjb252ZXJ0ZXIgLS0+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+MS4xNDwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIGxpc3RlbiB0byBmaWxlIGNoYW5nZXMgLS0+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1qY2ktY29yZTwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4xLjE8L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPCEtLSBHc29uIC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Z3NvbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjMuMTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIGh0dHAgY2xpZW50IC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7aHR0cGNsaWVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmh0dHBtaW1lPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7aHR0cGNsaWVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmh0dHBjb3JlPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7aHR0cGNvcmUudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y2gucW9zLmxvZ2JhY2s8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgorCQkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmxvZ2JhY2stY29yZTwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIExvZ2JhY2sgZXh0ZW5zaW9ucyAtLT4KKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5ncm9vdnk8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2dyb292eS52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCQkJCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFuaW5vPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmphbmlubzwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2phbmluby52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjEuMi4xLVNOQVBTSE9UPC92ZXJzaW9uPgorCQkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+NC4xMjwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy50ZXN0bmc8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+dGVzdG5nPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjYuOS4xMDwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20ucmVsZXZhbnRjb2RlczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5leHRlbnRyZXBvcnRzPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuNDEuMDwvdmVyc2lvbj4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+MS4xMC4xOTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5qc29uLXNpbXBsZTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qc29uLXNpbXBsZTwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2pzb24tc2ltcGxlLnZlcnNpb259PC92ZXJzaW9uPgorCQkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0LXN1cHBvcnQ8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zcHJpbmctbWVzc2FnaW5nPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7c3ByaW5nLnZlcnNpb259PC92ZXJzaW9uPgorCQkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPnNwcmluZy13ZWJtdmM8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zcHJpbmctYW9wPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7c3ByaW5nLnZlcnNpb259PC92ZXJzaW9uPgorCQkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWFzcGVjdHM8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5zcHJpbmctdGVzdDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+dGVzdDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c3ByaW5nLWV4cHJlc3Npb248L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWZvcm1hdDwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKworCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7amFja3Nvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8ZGVwZW5kZW5jeT4KKwkJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7amFja3Nvbi5hbm5vdGF0aW9ucy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIGZ1bmN0aW9uYWwgamF2YSAtLT4KKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5mdW5jdGlvbmFsamF2YTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5mdW5jdGlvbmFsamF2YTwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2Z1bmN0aW9uYWxqYXZhLnZlcnNpb259PC92ZXJzaW9uPgorCQkJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJCQk8L2RlcGVuZGVuY3k+CisKKwkJCTwhLS0gQXNwZWN0cyAtLT4KKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPmNvbS5qY2FiaTwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qY2FiaS1hc3BlY3RzPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7amNhYmkudmVyc2lvbn08L3ZlcnNpb24+CisJCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKwkJCTwvZGVwZW5kZW5jeT4KKwkJCTxkZXBlbmRlbmN5PgorCQkJCTxncm91cElkPm9yZy5hc3BlY3RqPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmFzcGVjdGpydDwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4ke2FzcGVjdGpydC52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorCQkJPC9kZXBlbmRlbmN5PgorCisJCQk8IS0tIFN5c3RlbSBtZXRyaWNzIC0tPgorCQkJPGRlcGVuZGVuY3k+CisJCQkJPGdyb3VwSWQ+b3JnLmZ1c2Vzb3VyY2U8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+c2lnYXI8L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHtzaWdhci52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTwvZGVwZW5kZW5jeT4JCQorCQk8L2RlcGVuZGVuY2llcz4KKworCTwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisKKworCisKKwk8YnVpbGQ+CisJCTxwbHVnaW5NYW5hZ2VtZW50PgorCQkJPHBsdWdpbnM+CisKKwkJCQk8cGx1Z2luPgorCQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPm1hdmVuLXNpdGUtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQk8dmVyc2lvbj4zLjQ8L3ZlcnNpb24+CisJCQkJCTxkZXBlbmRlbmNpZXM+CisJCQkJCQk8ZGVwZW5kZW5jeT4KKwkJCQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgorCQkJCQkJCTxhcnRpZmFjdElkPndhZ29uLXdlYmRhdi1qYWNrcmFiYml0PC9hcnRpZmFjdElkPgorCQkJCQkJCTx2ZXJzaW9uPjIuMTA8L3ZlcnNpb24+CisJCQkJCQk8L2RlcGVuZGVuY3k+CisJCQkJCTwvZGVwZW5kZW5jaWVzPgorCQkJCTwvcGx1Z2luPgorCisKKwkJCQk8cGx1Z2luPgorCQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJPHZlcnNpb24+Mi42PC92ZXJzaW9uPgorCQkJCTwvcGx1Z2luPgorCisJCQkJPHBsdWdpbj4KKwkJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQk8dmVyc2lvbj4xLjQuMDwvdmVyc2lvbj4KKwkJCQk8L3BsdWdpbj4KKwkJCQk8cGx1Z2luPgorCQkJCQk8Z3JvdXBJZD5vcmcuc29uYXJzb3VyY2Uuc2Nhbm5lci5tYXZlbjwvZ3JvdXBJZD4KKwkJCQkJPGFydGlmYWN0SWQ+c29uYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQk8dmVyc2lvbj4zLjAuMjwvdmVyc2lvbj4KKwkJCQk8L3BsdWdpbj4KKwkJCTwvcGx1Z2lucz4KKwkJPC9wbHVnaW5NYW5hZ2VtZW50PgorCisJCTxwbHVnaW5zPgorCisJCQk8cGx1Z2luPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjE5LjE8L3ZlcnNpb24+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKwkJCQkJCTxsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPnNyYy90ZXN0L3Jlc291cmNlcy9sb2diYWNrLXRlc3QueG1sPC9sb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPgorCQkJCQk8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorCisJCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJPCEtLSBTZXQgdGhlIEpESyBjb21waWxlciB2ZXJzaW9uLiAtLT4KKwkJCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi41LjE8L3ZlcnNpb24+CisJCQkJPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxzb3VyY2U+MS44PC9zb3VyY2U+CisJCQkJCTx0YXJnZXQ+MS44PC90YXJnZXQ+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9wbHVnaW4+CisKKwkJCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJPCEtLSBKYXZhIENvZGUgQ292ZXJhZ2UgLS0+CisJCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmphY29jbzwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5qYWNvY28tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjAuNy4xLjIwMTQwNTA4MjEzNzwvdmVyc2lvbj4KKwkJCQk8aW5oZXJpdGVkPlRydWU8L2luaGVyaXRlZD4KKworCQkJCTxleGVjdXRpb25zPgorCisJCQkJCTwhLS0gVW5pdC1UZXN0cyAtLT4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5wcmVwYXJlLWFnZW50PC9pZD4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5wcmVwYXJlLWFnZW50PC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCTxkZXN0RmlsZT4ke3NvbmFyLmphY29jby5yZXBvcnRQYXRofTwvZGVzdEZpbGU+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCTwvZXhlY3V0aW9uPgorCisKKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5yZXBvcnQ8L2lkPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPnJlcG9ydDwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8ZGF0YUZpbGU+JHtzb25hci5qYWNvY28ucmVwb3J0UGF0aH08L2RhdGFGaWxlPgorCQkJCQkJCTxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9L3RhcmdldC9zaXRlL2phY29jbzwvb3V0cHV0RGlyZWN0b3J5PgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQk8L2V4ZWN1dGlvbj4KKworCQkJCQk8IS0tIEludGVncmF0aW9uIFRlc3RzIChPbmx5IHJlcG9ydCBnb2FsKSAtLT4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5yZXBvcnQtaW50ZWdyYXRpb248L2lkPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPnJlcG9ydC1pbnRlZ3JhdGlvbjwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8ZGF0YUZpbGU+JHtzb25hci5qYWNvY28uaXRSZXBvcnRQYXRofTwvZGF0YUZpbGU+CisJCQkJCQkJPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vdGFyZ2V0L3NpdGUvaXQtamFjb2NvPC9vdXRwdXREaXJlY3Rvcnk+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCTwvZXhlY3V0aW9uPgorCQkJCTwvZXhlY3V0aW9ucz4KKwkJCTwvcGx1Z2luPgorCisKKworCQkJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCTwhLS0gU2V0IHRoZSBkZXBsb3ltZW50IHJlcG9zaXRvcmllcyBwcm9wZXJ0aWVzLiAtLT4KKwkJCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5nbWF2ZW48L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+Z21hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CisJCQkJCQk8cGhhc2U+aW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+ZXhlY3V0ZTwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8c291cmNlPgorCQkJCQkJCQlwb20ucHJvcGVydGllc1snZGVwbG95LnVybCddPQorCQkJCQkJCQlwb20udmVyc2lvbi5jb250YWlucygnLVNOQVBTSE9UJykgPworCQkJCQkJCQlwcm9qZWN0LmRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQuc25hcHNob3RSZXBvc2l0b3J5LnVybCA6CisJCQkJCQkJCXByb2plY3QuZGlzdHJpYnV0aW9uTWFuYWdlbWVudC5yZXBvc2l0b3J5LnVybDsKKwkJCQkJCQkJcG9tLnByb3BlcnRpZXNbJ3JlcG8uaWQnXT0gcG9tLnZlcnNpb24uY29udGFpbnMoJy1TTkFQU0hPVCcpID8KKwkJCQkJCQkJcHJvamVjdC5kaXN0cmlidXRpb25NYW5hZ2VtZW50LnNuYXBzaG90UmVwb3NpdG9yeS5pZCA6CisJCQkJCQkJCXByb2plY3QuZGlzdHJpYnV0aW9uTWFuYWdlbWVudC5yZXBvc2l0b3J5LmlkOworCQkJCQkJCTwvc291cmNlPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKworCisKKwkJCQorCQkJPCEtLSBsaWNlbnNlIHBsdWdpbiAtLT4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bGljZW5zZS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+MS4xMDwvdmVyc2lvbj4KKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPGFkZEphdmFMaWNlbnNlQWZ0ZXJQYWNrYWdlPmZhbHNlPC9hZGRKYXZhTGljZW5zZUFmdGVyUGFja2FnZT4KKwkJCQkJPHByb2Nlc3NTdGFydFRhZz49PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvcHJvY2Vzc1N0YXJ0VGFnPgorCQkJCQk8cHJvY2Vzc0VuZFRhZz49PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvcHJvY2Vzc0VuZFRhZz4KKwkJCQkJPHNlY3Rpb25EZWxpbWl0ZXI+PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08L3NlY3Rpb25EZWxpbWl0ZXI+CisJCQkJCTxsaWNlbnNlTmFtZT5hcGFjaGVfdjI8L2xpY2Vuc2VOYW1lPgorCQkJCQk8aW5jZXB0aW9uWWVhcj4yMDE3PC9pbmNlcHRpb25ZZWFyPgorCQkJCQk8b3JnYW5pemF0aW9uTmFtZT5BVCZhbXA7VCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9vcmdhbml6YXRpb25OYW1lPgorCQkJCQk8cHJvamVjdE5hbWU+U0RDPC9wcm9qZWN0TmFtZT4KKwkJCQkJPGNhblVwZGF0ZUNvcHlyaWdodD50cnVlPC9jYW5VcGRhdGVDb3B5cmlnaHQ+CisJCQkJCTxjYW5VcGRhdGVEZXNjcmlwdGlvbj50cnVlPC9jYW5VcGRhdGVEZXNjcmlwdGlvbj4KKwkJCQkJPGNhblVwZGF0ZUxpY2Vuc2U+dHJ1ZTwvY2FuVXBkYXRlTGljZW5zZT4KKwkJCQkJPGVtcHR5TGluZUFmdGVySGVhZGVyPnRydWU8L2VtcHR5TGluZUFmdGVySGVhZGVyPgorCQkJCQk8dmVyYm9zZT5mYWxzZTwvdmVyYm9zZT4KKwkJCQkJPGluY2x1ZGVzPgorCQkJCQkJPGluY2x1ZGU+KiovKi5qYXZhPC9pbmNsdWRlPgorCQkJCQkJPGluY2x1ZGU+KiovKi5qczwvaW5jbHVkZT4KKwkJCQkJCTxpbmNsdWRlPioqLyoudHM8L2luY2x1ZGU+CisJCQkJCTwvaW5jbHVkZXM+CisJCQkJCTxyb290cz4KKwkJCQkJCTxyb290PnNyYzwvcm9vdD4KKwkJCQkJCTxyb290PmFwcDwvcm9vdD4KKwkJCQkJCTxyb290PnNlcnZlci1tb2NrPC9yb290PgorCQkJCQkJPHJvb3Q+dHlwaW5nczwvcm9vdD4KKwkJCQkJPC9yb290cz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+Zmlyc3Q8L2lkPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPnVwZGF0ZS1maWxlLWhlYWRlcjwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8IS0tcGhhc2U+cHJvY2Vzcy1zb3VyY2VzPC9waGFzZS0tPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKworCQkJPCEtLSBibGFja2R1Y2sgbWF2ZW4gcGx1Z2luIC0tPgorCQkJPCEtLSA8cGx1Z2luPgorIAkJCQk8Z3JvdXBJZD5jb20uYmxhY2tkdWNrc29mdHdhcmUuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgCQkJCTxhcnRpZmFjdElkPmh1Yi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgCQkJCTx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgorIAkJCQk8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CisgCQkJCTxjb25maWd1cmF0aW9uPgorICAJCQkJCTx0YXJnZXQ+JHtwcm9qZWN0LmJhc2VkaXJ9PC90YXJnZXQ+CisJIAkJCTwvY29uZmlndXJhdGlvbj4KKyAJCQkJPGV4ZWN1dGlvbnM+CisgIAkJCQkJPGV4ZWN1dGlvbj4KKyAgIAkJCQkJCTxpZD5jcmVhdGUtYmRpby1maWxlPC9pZD4KKyAgIAkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgIAkJCQkJCTxnb2Fscz4KKyAgICAJCQkJCQk8Z29hbD5jcmVhdGVIdWJPdXRwdXQ8L2dvYWw+CisgICAJCQkJCQk8L2dvYWxzPgorICAJCQkJCTwvZXhlY3V0aW9uPgorIAkJCQk8L2V4ZWN1dGlvbnM+CisgCQkJPC9wbHVnaW4+IC0tPgorIAkJPC9wbHVnaW5zPgorIAk8L2J1aWxkPgorCisKKworICAgIDxyZXBvc2l0b3JpZXM+CisgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgICAgPGlkPnZpcnR1b3M8L2lkPgorICAgICAgICAgICAgPG5hbWU+VmlydHVvczwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL25leHVzLnZpcnR1b3MudW9zLmRlL25leHVzL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3B1YmxpYy88L3VybD4KKyAgICAgICAgICAgIDxsYXlvdXQ+ZGVmYXVsdDwvbGF5b3V0PgorICAgICAgICA8L3JlcG9zaXRvcnk+CisgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgICAgPGlkPmFwYWNoZS1wdWJsaWM8L2lkPgorICAgICAgICAgICAgPG5hbWU+QXBhY2hlLVB1YmxpYzwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvY29udGVudC9ncm91cHMvcHVibGljLzwvdXJsPgorICAgICAgICAgICAgPGxheW91dD5kZWZhdWx0PC9sYXlvdXQ+CisgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICAgICAgPHJlcG9zaXRvcnk+CisgICAgICAgICAgICA8aWQ+ZWxhc3RpY3NlYXJjaC1yZWxlYXNlczwvaWQ+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vbWF2ZW4uZWxhc3RpY3NlYXJjaC5vcmcvcmVsZWFzZXM8L3VybD4KKyAgICAgICAgICAgIDxyZWxlYXNlcz4KKyAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgorICAgICAgICAgICAgPC9yZWxlYXNlcz4KKyAgICAgICAgICAgIDxzbmFwc2hvdHM+CisgICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+CisgICAgICAgICAgICA8L3NuYXBzaG90cz4KKyAgICAgICAgPC9yZXBvc2l0b3J5PgorICAgICAgICAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNlbnRyYWw8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5PZmZpY2lhbCBNYXZlbiByZXBvc2l0b3J5PC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMi5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPgorICAgICAgICAgICA8L3JlcG9zaXRvcnk+CisgICAgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZWNvbXAtcmVsZWFzZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5SZWxlYXNlIFJlcG9zaXRvcnk8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cmw+JHtuZXh1cy5wcm94eX0vY29udGVudC9yZXBvc2l0b3JpZXMvcmVsZWFzZXMvPC91cmw+CisgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICAgICAgICAgPHJlcG9zaXRvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lY29tcC1zdGFnaW5nPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+U3RhZ2luZyBSZXBvc2l0b3J5PC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dXJsPiR7bmV4dXMucHJveHl9L2NvbnRlbnQvcmVwb3NpdG9yaWVzL3N0YWdpbmcvPC91cmw+CisgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KKwkJCTxyZXBvc2l0b3J5PgorCQkJCTxpZD5lY29tcC1zbmFwc2hvdHM8L2lkPgorCQkJCTxuYW1lPlNuYXBzaG90cyBSZXBvc2l0b3J5PC9uYW1lPgorCQkJCTx1cmw+JHtuZXh1cy5wcm94eX0vY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzLzwvdXJsPgorCQkJPC9yZXBvc2l0b3J5PgorICAgICAgPC9yZXBvc2l0b3JpZXM+CisKKyAgICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorCisgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lY29tcC1yZWxlYXNlczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5SZWxlYXNlIFJlcG9zaXRvcnk8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXJsPiR7bmV4dXMucHJveHl9L2NvbnRlbnQvcmVwb3NpdG9yaWVzL3JlbGVhc2VzLzwvdXJsPgorICAgICAgICAgICAgICAgPC9yZXBvc2l0b3J5PgorICAgICAgICAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lY29tcC1zbmFwc2hvdHM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+U25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cmw+JHtuZXh1cy5wcm94eX0vY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzLzwvdXJsPgorICAgICAgICAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+CisKKyAgICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvZG9ja2VyLWNvbXBvc2UueW1sIGIvc2RjLW9zLWNoZWYvZG9ja2VyLWNvbXBvc2UueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MWZiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9kb2NrZXItY29tcG9zZS55bWwKQEAgLTAsMCArMSwxNTYgQEAKK3ZlcnNpb246ICIyLjEiCitzZXJ2aWNlczoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgZWxhc3RpY3NlYXJjaDoKKyAgICBidWlsZDogLgorIyAgICBjb250ZXh0OiBlbGFzdGljc2VhcmNoCisgICAgY29udGFpbmVyX25hbWU6ICJzZGMtZXMiCisgICAgcmVzdGFydDogImFsd2F5cyIKKyAgICBpbWFnZTogImVjb21wLW5leHVzOjUxMjEyL2Vjb21wL3NkYy1lbGFzdGljc2VhcmNoOjE2MTAuMi4xMyIKKyAgICBtZW1fbGltaXQ6ICIxZyIKKyAgICBtZW1zd2FwX2xpbWl0OiAiMWciCisgICAgbG9nZ2luZzoKKyAgICAgICAgZHJpdmVyOiAianNvbi1maWxlIgorICAgICAgICBvcHRpb25zOgorICAgICAgICAgICAgbWF4LXNpemU6ICIxMDBtIgorICAgICAgICAgICAgbWF4LWZpbGU6ICIxMCIKKyAgICBwb3J0czoKKyAgICAgICAgLSAiOTIwMDo5MjAwIgorICAgICAgICAtICI5MzAwOjkzMDAiCisgICAgZW52aXJvbm1lbnQ6CisjICAgICAgICAtIEVTX0pBVkFfT1BUUz0iLVhtczFnIC1YbXgxZyIKKyAgICAgICAgLSBFU19IRUFQX1NJWkU9MTA3Mzc0MTgyNAorICAgICAgICAtIEhPU1RfSVA6SE9TVElQCisgICAgICAgIC0gRU5WTkFNRTpERVBfRU5WCisgICAgdm9sdW1lczoKKyAgICAgICAgLSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybworICAgICAgICAtIC9kYXRhL0VTOi91c3Ivc2hhcmUvZWxhc3RpY3NlYXJjaC9kYXRhCisgICAgICAgIC0gL2RhdGEvQVNEQy9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cyAgICAgIAorICAgIHVsaW1pdHM6CisgICAgICAgIG1lbWxvY2s6IC0xCisgICAgICAgIG5wcm9jOiA2NTUzNQorICAgICAgICBub2ZpbGU6CisgICAgICAgICAgICBzb2Z0OiAxMDAwMDAKKyAgICAgICAgICAgIGhhcmQ6IDEwMDAwMAorCisgIAorICBjYXNzYW5kcmE6CisgICAgYnVpbGQ6IC4KKyMgICAgY29udGV4dDogY2Fzc2FuZHJhCisgICAgY29udGFpbmVyX25hbWU6ICJzZGMtY3MiCisgICAgcmVzdGFydDogImFsd2F5cyIKKyAgICBpbWFnZTogImVjb21wLW5leHVzOjUxMjEyL2Vjb21wL3NkYy1jYXNzYW5kcmE6MTYxMC4yLjEzIgorICAgIGxvZ2dpbmc6CisgICAgICAgIGRyaXZlcjogImpzb24tZmlsZSIKKyAgICAgICAgb3B0aW9uczoKKyAgICAgICAgICAgIG1heC1zaXplOiAiMTAwbSIKKyAgICAgICAgICAgIG1heC1maWxlOiAiMTAiCisgICAgcG9ydHM6CisgICAgICAgIC0gIjkwNDI6OTA0MiIKKyAgICAgICAgLSAiOTE2MDo5MTYwIgorICAgIGVudmlyb25tZW50OgorICAgICAgICAtIEVTX0hFQVBfU0laRT0xMDczNzQxODI0CisgICAgICAgIC0gSE9TVF9JUDpIT1NUSVAKKyAgICAgICAgLSBFTlZOQU1FOkRFUF9FTlYKKyAgICB2b2x1bWVzOgorICAgICAgICAtIC9ldGMvbG9jYWx0aW1lOi9ldGMvbG9jYWx0aW1lOnJvCisgICAgICAgIC0gL2RhdGEvQ1M6L3Zhci9saWIvY2Fzc2FuZHJhCisgICAgICAgIC0gL2RhdGEvQVNEQy9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cworICAgIHVsaW1pdHM6CisgICAgICAgIG1lbWxvY2s6IC0xCisgICAgICAgIG5wcm9jOiA2NTUzNQorICAgICAgICBub2ZpbGU6CisgICAgICAgICAgICBzb2Z0OiAxMDAwMDAKKyAgICAgICAgICAgIGhhcmQ6IDEwMDAwMAorCisgICAgICAgICAgICAKKworICBraWJhbmE6CisgICAgYnVpbGQ6IC4KKyAgICBjb250YWluZXJfbmFtZTogInNkYy1rYm4iCisgICAgcmVzdGFydDogImFsd2F5cyIKKyAgICBpbWFnZTogImVjb21wLW5leHVzOjUxMjEyL2Vjb21wL3NkYy1raWJhbmE6MTYxMC4yLjEzIgorICAgIG1lbV9saW1pdDogIjFnIgorICAgIG1lbXN3YXBfbGltaXQ6ICIxZyIKKyAgICBsb2dnaW5nOgorICAgICAgICBkcml2ZXI6ICJqc29uLWZpbGUiCisgICAgICAgIG9wdGlvbnM6CisgICAgICAgICAgICBtYXgtc2l6ZTogIjEwMG0iCisgICAgICAgICAgICBtYXgtZmlsZTogIjEwIgorICAgIHBvcnRzOgorICAgICAgICAtICI1NjAxOjU2MDEiCisgICAgZW52aXJvbm1lbnQ6CisgICAgICAgIC0gRU5WTkFNRTpERVBfRU5WICAgCisgICAgdm9sdW1lczoKKyAgICAgICAgLSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybworICAgICAgICAtIC9kYXRhL0FTREMvZW52aXJvbm1lbnRzOi9yb290L2NoZWYtc29sby9lbnZpcm9ubWVudHMKKyAgICB1bGltaXRzOgorICAgICAgICBtZW1sb2NrOiAtMQorICAgICAgICBucHJvYzogNjU1MzUKKyAgICAgICAgbm9maWxlOgorICAgICAgICAgICAgc29mdDogMTAwMDAwCisgICAgICAgICAgICBoYXJkOiAxMDAwMDAKKyAgICBkZXBlbmRzX29uOgorICAgICAgICAtIGVsYXN0aWNzZWFyY2gKKworCisKKworICBqZXR0eUJFOgorICAgIGJ1aWxkOiAuCisgICAgY29udGFpbmVyX25hbWU6ICJzZGMtYmUiCisgICAgaW1hZ2U6ICJlY29tcC1uZXh1czo1MTIxMi9lY29tcC9zZGMtYmFja2VuZDoxNjEwLjIuMTMiCisgICAgbWVtX2xpbWl0OiAiM2ciCisgICAgbWVtc3dhcF9saW1pdDogIjNnIgorICAgIGxvZ2dpbmc6CisgICAgICAgIGRyaXZlcjogImpzb24tZmlsZSIKKyAgICAgICAgb3B0aW9uczoKKyAgICAgICAgICAgIG1heC1zaXplOiAiMTAwbSIKKyAgICAgICAgICAgIG1heC1maWxlOiAiMTAiCisgICAgcG9ydHM6CisgICAgICAgIC0gIjgwODA6ODA4MCIKKyAgICAgICAgLSAiODQ0Mzo4NDQzIgorICAgIGVudmlyb25tZW50OgorICAgICAgICAtIEhPU1RfSVA6SE9TVElQCisgICAgICAgIC0gRU5WTkFNRTpERVBfRU5WCisgICAgdm9sdW1lczoKKyAgICAgICAgLSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybworICAgICAgICAtIC9kYXRhL0FTREMvbG9ncy9CRTovdmFyL2xpYi9qZXR0eS9sb2dzCisgICAgICAgIC0gL2RhdGEvQVNEQy9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cworICAgIHVsaW1pdHM6CisgICAgICAgIG1lbWxvY2s6IC0xCisgICAgICAgIG5wcm9jOiA2NTUzNQorICAgICAgICBub2ZpbGU6CisgICAgICAgICAgICBzb2Z0OiAxMDAwMDAKKyAgICAgICAgICAgIGhhcmQ6IDEwMDAwMAorCisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorCisgIGpldHR5RkU6CisgICAgYnVpbGQ6IC4KKyAgICBjb250YWluZXJfbmFtZTogInNkYy1mZSIKKyAgICBpbWFnZTogImVjb21wLW5leHVzOjUxMjEyL2Vjb21wL3NkYy1mcm9udGVuZDoxNjEwLjIuMTMiCisgICAgbWVtX2xpbWl0OiAiMWciCisgICAgbWVtc3dhcF9saW1pdDogIjFnIgorICAgIGxvZ2dpbmc6CisgICAgICAgIGRyaXZlcjogImpzb24tZmlsZSIKKyAgICAgICAgb3B0aW9uczoKKyAgICAgICAgICAgIG1heC1zaXplOiAiMTAwbSIKKyAgICAgICAgICAgIG1heC1maWxlOiAiMTAiCisgICAgcG9ydHM6CisgICAgICAgIC0gIjgxODE6ODE4MSIKKyAgICAgICAgLSAiOTQ0Mzo5NDQzIgorICAgIGVudmlyb25tZW50OgorICAgICAgICAtIEhPU1RfSVA6SE9TVElQCisgICAgICAgIC0gRU5WTkFNRTpERVBfRU5WICAgICAgCisgICAgdm9sdW1lczoKKyAgICAgICAgLSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybworICAgICAgICAtIC9kYXRhL0FTREMvbG9ncy9GRTovdmFyL2xpYi9qZXR0eS9sb2dzCisgICAgICAgIC0gL2RhdGEvQVNEQy9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cworICAgIHVsaW1pdHM6CisgICAgICAgIG1lbWxvY2s6IC0xCisgICAgICAgIG5wcm9jOiA2NTUzNQorICAgICAgICBub2ZpbGU6CisgICAgICAgICAgICBzb2Z0OiAxMDAwMDAKKyAgICAgICAgICAgIGhhcmQ6IDEwMDAwMApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvZW52aXJvbm1lbnRzL1RlbXBsYXRlLmpzb24gYi9zZGMtb3MtY2hlZi9lbnZpcm9ubWVudHMvVGVtcGxhdGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU1Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvZW52aXJvbm1lbnRzL1RlbXBsYXRlLmpzb24KQEAgLTAsMCArMSw3NSBAQAoreworICAgIm5hbWUiOiAieHh4IiwKKyAgICJkZXNjcmlwdGlvbiI6ICJPcGVuU291cmNlLXh4eCIsCisgICAiY29va2Jvb2tfdmVyc2lvbnMiOiB7CisgICAgICAgICAgICAiRGVwbG95LVNEYW5kQyI6ICI9IDEuMC4wIgorICAgfSwKKyAgICJqc29uX2NsYXNzIjogIkNoZWY6OkVudmlyb25tZW50IiwKKyAgICJjaGVmX3R5cGUiOiAiZW52aXJvbm1lbnQiLAorCisgICAiZGVmYXVsdF9hdHRyaWJ1dGVzIjogeworICAgICAgICAiQ1NfVklQIjogInl5eSIsCisgICAgICAgICJCRV9WSVAiOiAieXl5IiwKKyAgICAgICAgIkZFX1ZJUCI6ICJ5eXkiLAorICAgICAgICAiRVNfVklQIjogInl5eSIsCisgICAgICAgICJpbnRlcmZhY2VzIjogeworICAgICAgICAgICAgImFwcGxpY2F0aW9uIjogImV0aDAiLAorICAgICAgICAgICAgInByaXZhdGUiOiAiZXRoMSIKKyAgICAgICAgfSwKKwkJIkVDb21wUCI6IHsKKwkJICAgICJlY29tcF9yZXN0X3VybCI6ICJodHRwOi8vcG9ydGFsLmFwaS5zaW1wbGVkZW1vLm9wZW5lY29tcC5vcmc6ODk4OS9FQ09NUFBPUlRBTC9hdXhhcGkiLAorICAgICAgICAgICAgInVlYl91cmxfbGlzdCI6ICIyMy4yNTMuOTcuNzUsMTAuMC4xMS4xIiwgCisgICAgICAgICAgICAiYXBwX3NlY3JldCI6ICJYZnRJQVR3OUpyM1Z6QWNQcXQzTm5KT3UiLCAKKyAgICAgICAgICAgICJhcHBfa2V5IjogIng5VWZPN0pzRG44QkVTVlgiLCAKKyAgICAgICAgICAgICJpbmJveF9uYW1lIjogIkVDT01QLVBPUlRBTC1JTkJPWCIsIAorICAgICAgICAgICAgImVjb21wX3JlZGlyZWN0X3VybCI6ICJodHRwOi8vcG9ydGFsLmFwaS5zaW1wbGVkZW1vLm9wZW5lY29tcC5vcmc6ODk4OS9FQ09NUFBPUlRBTC9sb2dpbi5odG0iLCAKKyAgICAgICAgICAgICJhcHBfdG9waWNfbmFtZSI6ICJFQ09NUC1QT1JUQUwtT1VUQk9YLVNEQzEiLAorCQkJImRlY3J5cHRpb25fa2V5IjogIkFHTERkRzREMDRCS20ySXhJV0VyOG89PSIKKyAgICAgICAgfSwgCisgICAgICAgICJVRUIiOiB7CisgICAgICAgICAgICAiUHVibGljS2V5IjogImlQSXhrcEFNSThxVGNRajgiLAorICAgICAgICAgICAgIlNlY3JldEtleSI6ICJFaHEzV3lUNGJraWY0endnRWJ2c2hHYWwiLAorICAgICAgICAgICAgImZxZG4iOiBbIjIzLjI1My45Ny43NSIsICIxMC4wLjExLjEiXQorICAgICAgICB9LAorICAgICAgICAiTm9kZXMiOiB7CisgICAgICAgICAgICAiQ1MiOiAieXl5IiwKKyAgICAgICAgICAgICJCRSI6ICJ5eXkiLAorICAgICAgICAgICAgIkZFIjogInl5eSIsCisgICAgICAgICAgICAiRVMiOiAieXl5IgorICAgICAgICB9CisgICAgfSwKKyAgICAib3ZlcnJpZGVfYXR0cmlidXRlcyI6IHsKKyAgICAgICAgIkZFIjogeworICAgICAgICAgICAgImh0dHBfcG9ydCI6ICI4MTgxIiwKKyAgICAgICAgICAgICJodHRwc19wb3J0IjogIjk0NDMiCisgICAgICAgIH0sCisgICAgICAgICJCRSI6IHsKKyAgICAgICAgICAgICJodHRwX3BvcnQiOiAiODA4MCIsCisgICAgICAgICAgICAiaHR0cHNfcG9ydCI6ICI4NDQzIgorICAgICAgICB9LAorICAgICAgICAiZWxhc3RpY3NlYXJjaCI6IHsKKyAgICAgICAgICAgICJjbHVzdGVyX25hbWUiOiAiU0RDLUVTLSIsCisgICAgICAgICAgICAiRVNfcGF0aF9ob21lIjogIi91c3Ivc2hhcmUvZWxhc3RpY3NlYXJjaCIsCisgICAgICAgICAgICAiRVNfcGF0aF9kYXRhIjogIi91c3Ivc2hhcmUvZWxhc3RpY3NlYXJjaC9kYXRhIiwKKyAgICAgICAgICAgICJudW1fb2ZfcmVwbGljYXMiOiAiMCIsCisgICAgICAgICAgICAibnVtX29mX3NoYXJkcyI6ICIxIgorICAgICAgICB9LAorCisgICAgICAgICJjYXNzYW5kcmEiOiB7CisgICAgICAgICAgICAiY29uY3VycmVudF9yZWFkcyI6ICIzMiIsCisgICAgICAgICAgICAibnVtX3Rva2VucyI6ICIyNTYiLAorICAgICAgICAgICAgImRhdGFfZGlyIjogIi92YXIvbGliL2Nhc3NhbmRyYS9kYXRhIiwKKyAgICAgICAgICAgICJoaW50ZWRfaGFuZG9mZl9lbmFibGVkIjogInRydWUiLAorICAgICAgICAgICAgImNhc3NhbmRyYV91c2VyIjogImFzZGNfdXNlciIsCisgICAgICAgICAgICAiY2Fzc2FuZHJhX3Bhc3N3b3JkIjogIkFhMTIzNCVeISIsCisgICAgICAgICAgICAiY29uY3VycmVudF93cml0ZXMiOiAiMzIiLAorICAgICAgICAgICAgImNsdXN0ZXJfbmFtZSI6ICJTREMtQ1MtIiwKKyAgICAgICAgICAgICJtdWx0aXRocmVhZGVkX2NvbXBhY3Rpb24iOiAiZmFsc2UiLAorICAgICAgICAgICAgImNhY2hlX2RpciI6ICIvdmFyL2xpYi9jYXNzYW5kcmEvc2F2ZWRfY2FjaGVzIiwKKyAgICAgICAgICAgICJsb2dfZmlsZSI6ICIvdmFyL2xpYi9jYXNzYW5kcmEvbG9nL3N5c3RlbS5sb2ciLAorICAgICAgICAgICAgInBoaV9jb252aWN0X3RocmVzaG9sZCI6ICI4IiwKKyAgICAgICAgICAgICJjb21taXRsb2dfZGlyIjogIi92YXIvbGliL2Nhc3NhbmRyYS9jb21taXRsb2ciCisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3BvbS54bWwgYi9zZGMtb3MtY2hlZi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTBlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9wb20ueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKwk8YXJ0aWZhY3RJZD5zZGMtb3MtY2hlZjwvYXJ0aWZhY3RJZD4KKworCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5zZGMtbWFpbjwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJPC9wYXJlbnQ+CisKKwk8YnVpbGQ+CisJICAgIDxwbHVnaW5zPgorCQk8cGx1Z2luPgorICAgICAgICAgICAgICAgIAk8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUubWF2ZW4tcmVwbGFjZXItcGx1Z2luPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmVwbGFjZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjUuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgCTxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8Z29hbD5yZXBsYWNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIAk8YmFzZWRpcj4ke3Byb2plY3QuYmFzZWRpcn08L2Jhc2VkaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAJPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgCQk8aW5jbHVkZT5zZGMtYmFja2VuZC9Eb2NrZXJmaWxlPC9pbmNsdWRlPgorCQkJCQkJCQk8aW5jbHVkZT5zZGMtZnJvbnRlbmQvRG9ja2VyZmlsZTwvaW5jbHVkZT4KKwkJCQkJCQkJPGluY2x1ZGU+c2NyaXB0cy9kb2NrZXJfcnVuLnNoPC9pbmNsdWRlPgkJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIAk8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgCTxyZXBsYWNlbWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICAJCTxyZXBsYWNlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8dG9rZW4+X19TREMtUkVMRUFTRV9fPC90b2tlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPHZhbHVlPiR7cHJvamVjdC52ZXJzaW9ufTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L3JlcGxhY2VtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgCTwvcmVwbGFjZW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorCQk8L3BsdWdpbj4KKwkgICAgPC9wbHVnaW5zPgorCTwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9jbGVhbi5zaCBiL3NkYy1vcy1jaGVmL3NjcmlwdHMvZG9ja2VyX2NsZWFuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjIyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9jbGVhbi5zaApAQCAtMCwwICsxLDYgQEAKK3BhdD0kMQorZG9ja2VyX2lkcz1gZG9ja2VyIHBzIC1hIHwgZ3JlcCAke3BhdH0gfCBhd2sgJ3twcmludCAkMX0nYAorZm9yIFggaW4gJHtkb2NrZXJfaWRzfQorZG8KKyAgIGRvY2tlciBybSAtZiAke1h9Citkb25lCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9oZWFsdGguc2ggYi9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9oZWFsdGguc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkZjgyNgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NjcmlwdHMvZG9ja2VyX2hlYWx0aC5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vYmFzaAorCitjdXJsIGxvY2FsaG9zdDo5MjAwL19jbHVzdGVyL2hlYWx0aD9wcmV0dHk9dHJ1ZQorCitlY2hvICJCRSBoZWFsdGgtQ2hlY2s6IgorY3VybCBodHRwOi8vbG9jYWxob3N0OjgwODAvc2RjMi9yZXN0L2hlYWx0aENoZWNrCisKK2VjaG8gIiIKK2VjaG8gIiIKK2VjaG8gIkZFIGhlYWx0aC1DaGVjazoiCitjdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6ODE4MS9zZGMxL3Jlc3QvaGVhbHRoQ2hlY2sKKworCitlY2hvICIiCitlY2hvICIiCityZXM9YGN1cmwgLXMgLVggR0VUIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24iIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC1IICJVU0VSX0lEOiBqaDAwMDMiICJodHRwOi8vbG9jYWxob3N0OjgwODAvc2RjMi9yZXN0L3YxL3VzZXIvZGVtbyIgfCB3YyAtbGAKK2lmIFtbICR7cmVzfSAhPSAwIF1dCit0aGVuCisgICAgZWNobyAiRXJyb3IgWyR7cmVzfV0gd2hpbGUgdXNlciBleGlzdGFuY2UgY2hlY2siCisgICAgZXhpdCAke3Jlc30KK2ZpCitlY2hvICJjaGVjayB1c2VyIGV4aXN0YW5jZTogT0siCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9sb2dpbi5zaCBiL3NkYy1vcy1jaGVmL3NjcmlwdHMvZG9ja2VyX2xvZ2luLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTQ0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9sb2dpbi5zaApAQCAtMCwwICsxLDggQEAKK3BhdD0kMQorZG9ja2VyX2lkcz1gZG9ja2VyIHBzIHwgZ3JlcCAke3BhdH0gfCBhd2sgJ3twcmludCAkMX0nfGhlYWQgLTFgCitpZiBbIC16ICIkZG9ja2VyX2lkcyIgXTsgdGhlbgorICAgZWNobyAiTm8gZG9ja2VycyB3ZXJlIGZvdW5kIG1hdGNoaW5nIHBhdHRlcm4gWyR7cGF0fV0iCisgICBleGl0IDAKK2Vsc2UgCisgICBkb2NrZXIgZXhlYyAtaXQgJHtkb2NrZXJfaWRzfSBiYXNoCitmaQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2NyaXB0cy9kb2NrZXJfcnVuLnNoIGIvc2RjLW9zLWNoZWYvc2NyaXB0cy9kb2NrZXJfcnVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2YzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9ydW4uc2gKQEAgLTAsMCArMSwxMjggQEAKKyMhL2Jpbi9iYXNoCisKKworZnVuY3Rpb24gdXNhZ2UKK3sKKyAgICBlY2hvICJ1c2FnZTogZG9ja2VyX3J1bi5zaCBbIC1yfC0tcmVsZWFzZSA8UkVMRUFTRS1OQU1FPiBdICBbIC1lfC0tZW52aXJvbm1lbnQgPEVOVi1OQU1FPiBdIFsgLXB8LS1wb3J0IDxEb2NrZXItaHViLXBvcnQ+XSBbIC1ofC0taGVscCBdIgorfQorCisKK1JFTEVBU0U9MS4wLjAtU05BUFNIT1QKK1sgLWYgL29wdC9jb25maWcvZW52X25hbWUudHh0IF0gJiYgREVQX0VOVj0kKGNhdCAvb3B0L2NvbmZpZy9lbnZfbmFtZS50eHQpIHx8IERFUF9FTlY9X19FTlYtTkFNRV9fCitQT1JUPTUxMjEyCisKK3doaWxlIFsgIiQxIiAhPSAiIiBdOyBkbworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgLXIgfCAtLXJlbGVhc2UgKQorICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgIFJFTEVBU0U9JHsxfQorICAgICAgICAgICAgOzsKKyAgICAgICAgLWUgfCAtLWVudmlyb25tZW50ICkKKwkJCXNoaWZ0CisgICAgICAgICAgICBERVBfRU5WPSR7MX0KKyAgICAgICAgICAgIDs7CisJCS1wIHwgLS1wb3J0ICkKKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICBQT1JUPSR7MX0KKwkJCTs7CisgICAgICAgIC1oIHwgLS1oZWxwICkKKwkJCXVzYWdlCisgICAgICAgICAgICBleGl0CisgICAgICAgICAgICA7OworICAgICAgICAqICkgCisgICAgCQl1c2FnZQorICAgICAgICAgICAgZXhpdCAxCisgICAgZXNhYworICAgIHNoaWZ0Citkb25lCisKK1sgLWYgL29wdC9jb25maWcvbmV4dXNfdXNlcm5hbWUudHh0IF0gJiYgTkVYVVNfVVNFUk5BTUU9JChjYXQgL29wdC9jb25maWcvbmV4dXNfdXNlcm5hbWUudHh0KSAgICB8fCBORVhVU19VU0VSTkFNRT1yZWxlYXNlCitbIC1mIC9vcHQvY29uZmlnL25leHVzX3Bhc3N3b3JkLnR4dCBdICYmIE5FWFVTX1BBU1NXRD0kKGNhdCAvb3B0L2NvbmZpZy9uZXh1c19wYXNzd29yZC50eHQpICAgICAgfHwgTkVYVVNfUEFTU1dEPXNmV1UzREZWZEJyN0dWeEI4NW1UWWdBVworWyAtZiAvb3B0L2NvbmZpZy9uZXh1c19kb2NrZXJfcmVwby50eHQgXSAmJiBORVhVU19ET0NLRVJfUkVQTz0kKGNhdCAvb3B0L2NvbmZpZy9uZXh1c19kb2NrZXJfcmVwby50eHQpIHx8IE5FWFVTX0RPQ0tFUl9SRVBPPWVjb21wLW5leHVzOiR7UE9SVH0KKworWyAtZiAvb3B0L2NvbmZpZy9uZXh1c191c2VybmFtZS50eHQgXSAmJiBkb2NrZXIgbG9naW4gLXUgJE5FWFVTX1VTRVJOQU1FIC1wICRORVhVU19QQVNTV0QgJE5FWFVTX0RPQ0tFUl9SRVBPCisKKworIyBjbGVhbnVwCitlY2hvICJwZXJmb3JtaW5nIG9sZCBkb2NrZXJzIGNsZWFudXAiCitkb2NrZXJfaWRzPWBkb2NrZXIgcHMgLWEgfCBlZ3JlcCAiZWNvbXAtbmV4dXM6JHtQT1JUfS9zZGN8c2RjfEV4aXQiIHwgYXdrICd7cHJpbnQgJDF9J2AKK2ZvciBYIGluICR7ZG9ja2VyX2lkc30KK2RvCisgICBkb2NrZXIgcm0gLWYgJHtYfQorZG9uZQorCitleHBvcnQgSVA9YGlmY29uZmlnIGV0aDAgfCBhd2sgLUY6ICcvaW5ldCBhZGRyLyB7Z3N1YigvIC4qLywiIiwkMik7IHByaW50ICQyfSdgCisKK2VjaG8gIiIKKworIyBFbGFzdGljLVNlYXJjaAorZWNobyAiZG9ja2VyIHJ1biBzZGMtZWxhc3RpY3NlYXJjaC4uLiIKK2RvY2tlciBwdWxsIGVjb21wLW5leHVzOiR7UE9SVH0vZWNvbXAvc2RjLWVsYXN0aWNzZWFyY2g6JHtSRUxFQVNFfQorZG9ja2VyIHJ1biAtLWRldGFjaCAtLW5hbWUgc2RjLWVzIC0tZW52IEVOVk5BTUU9IiR7REVQX0VOVn0iIC0tbG9nLWRyaXZlcj1qc29uLWZpbGUgLS1sb2ctb3B0IG1heC1zaXplPTEwMG0gLS1sb2ctb3B0IG1heC1maWxlPTEwIC0tbWVtb3J5IDFnIC0tbWVtb3J5LXN3YXA9MWcgLS11bGltaXQgbWVtbG9jaz0tMTotMSAtLXVsaW1pdCBub2ZpbGU9NDA5NjoxMDAwMDAgLS12b2x1bWUgL2V0Yy9sb2NhbHRpbWU6L2V0Yy9sb2NhbHRpbWU6cm8gLWUgRVNfSEVBUF9TSVpFPTEwMjRNIC0tdm9sdW1lIC9kYXRhL0VTOi91c3Ivc2hhcmUvZWxhc3RpY3NlYXJjaC9kYXRhIC0tdm9sdW1lIC9kYXRhL2Vudmlyb25tZW50czovcm9vdC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzIC0tcHVibGlzaCA5MjAwOjkyMDAgLS1wdWJsaXNoIDkzMDA6OTMwMCBlY29tcC1uZXh1czoke1BPUlR9L2Vjb21wL3NkYy1lbGFzdGljc2VhcmNoOiR7UkVMRUFTRX0KKworCisjIGNhc3NhbmRyYQorZWNobyAiZG9ja2VyIHJ1biBzZGMtY2Fzc2FuZHJhLi4uIgorZG9ja2VyIHB1bGwgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMtY2Fzc2FuZHJhOiR7UkVMRUFTRX0KK2RvY2tlciBydW4gLS1kZXRhY2ggLS1uYW1lIHNkYy1jcyAtLWVudiBFTlZOQU1FPSIke0RFUF9FTlZ9IiAtLWVudiBIT1NUX0lQPSR7SVB9IC0tbG9nLWRyaXZlcj1qc29uLWZpbGUgLS1sb2ctb3B0IG1heC1zaXplPTEwMG0gLS1sb2ctb3B0IG1heC1maWxlPTEwIC0tdWxpbWl0IG1lbWxvY2s9LTE6LTEgLS11bGltaXQgbm9maWxlPTQwOTY6MTAwMDAwIC0tdm9sdW1lIC9ldGMvbG9jYWx0aW1lOi9ldGMvbG9jYWx0aW1lOnJvIC0tdm9sdW1lIC9kYXRhL0NTOi92YXIvbGliL2Nhc3NhbmRyYSAtLXZvbHVtZSAvZGF0YS9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cyAtLXB1Ymxpc2ggOTA0Mjo5MDQyIC0tcHVibGlzaCA5MTYwOjkxNjAgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMtY2Fzc2FuZHJhOiR7UkVMRUFTRX0KKworCitlY2hvICJwbGVhc2Ugd2FpdCB3aGlsZSBDUyBpcyBzdGFydGluZy4uLiIKK2VjaG8gIiIKK2M9MjUgIyBzZWNvbmRzIHRvIHdhaXQKK1JFV1JJVEU9IlxlWzI1RFxlWzFBXGVbSyIKK3doaWxlIFsgJGMgLWd0IDAgXTsgZG8KKyAgICBjPSQoKGMtMSkpCisgICAgc2xlZXAgMQorICAgIGVjaG8gLWUgIiR7UkVXUklURX0kYyIKK2RvbmUKK2VjaG8gLWUgIiIKKworCisjIGtpYmFuYQorZWNobyAiZG9ja2VyIHJ1biBzZGMta2liYW5hLi4uIgorZG9ja2VyIHB1bGwgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMta2liYW5hOiR7UkVMRUFTRX0KK2RvY2tlciBydW4gLS1kZXRhY2ggLS1uYW1lIHNkYy1rYm4gLS1lbnYgRU5WTkFNRT0iJHtERVBfRU5WfSIgLS1sb2ctZHJpdmVyPWpzb24tZmlsZSAtLWxvZy1vcHQgbWF4LXNpemU9MTAwbSAtLWxvZy1vcHQgbWF4LWZpbGU9MTAgLS11bGltaXQgbWVtbG9jaz0tMTotMSAtLW1lbW9yeSAyZyAtLW1lbW9yeS1zd2FwPTJnIC0tdWxpbWl0IG5vZmlsZT00MDk2OjEwMDAwMCAtLXZvbHVtZSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybyAtLXZvbHVtZSAvZGF0YS9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cyAtLXB1Ymxpc2ggNTYwMTo1NjAxIGVjb21wLW5leHVzOiR7UE9SVH0vZWNvbXAvc2RjLWtpYmFuYToke1JFTEVBU0V9CisKKworIyBCYWNrLUVuZAorZWNobyAiZG9ja2VyIHJ1biBzZGMtYmFja2VuZC4uLiIKK2RvY2tlciBwdWxsIGVjb21wLW5leHVzOiR7UE9SVH0vZWNvbXAvc2RjLWJhY2tlbmQ6JHtSRUxFQVNFfQorZG9ja2VyIHJ1biAtLWRldGFjaCAtLW5hbWUgc2RjLUJFIC0tZW52IEhPU1RfSVA9JHtJUH0gLS1lbnYgRU5WTkFNRT0iJHtERVBfRU5WfSIgLS1sb2ctZHJpdmVyPWpzb24tZmlsZSAtLWxvZy1vcHQgbWF4LXNpemU9MTAwbSAtLWxvZy1vcHQgbWF4LWZpbGU9MTAgLS11bGltaXQgbWVtbG9jaz0tMTotMSAtLW1lbW9yeSA0ZyAtLW1lbW9yeS1zd2FwPTRnIC0tdWxpbWl0IG5vZmlsZT00MDk2OjEwMDAwMCAtLXZvbHVtZSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybyAtLXZvbHVtZSAvZGF0YS9sb2dzL0JFLzovdmFyL2xpYi9qZXR0eS9sb2dzICAtLXZvbHVtZSAvZGF0YS9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cyAtLXB1Ymxpc2ggODQ0Mzo4NDQzIC0tcHVibGlzaCA4MDgwOjgwODAgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMtYmFja2VuZDoke1JFTEVBU0V9CisKK2VjaG8gInBsZWFzZSB3YWl0IHdoaWxlIEJFIGlzIHN0YXJ0aW5nLi4uIgorZWNobyAiIgorYz00NSAjIHNlY29uZHMgdG8gd2FpdAorUkVXUklURT0iXGVbNDVEXGVbMUFcZVtLIgord2hpbGUgWyAkYyAtZ3QgMCBdOyBkbworICAgIGM9JCgoYy0xKSkKKyAgICBzbGVlcCAxCisgICAgZWNobyAtZSAiJHtSRVdSSVRFfSRjIgorZG9uZQorZWNobyAtZSAiIgorCisKKyMgRnJvbnQtRW5kCitlY2hvICJkb2NrZXIgcnVuIHNkYy1mcm9udGVuZC4uLiIKK2RvY2tlciBwdWxsIGVjb21wLW5leHVzOiR7UE9SVH0vZWNvbXAvc2RjLWZyb250ZW5kOiR7UkVMRUFTRX0KK2RvY2tlciBydW4gLS1kZXRhY2ggLS1uYW1lIHNkYy1GRSAtLWVudiBIT1NUX0lQPSR7SVB9IC0tZW52IEVOVk5BTUU9IiR7REVQX0VOVn0iIC0tbG9nLWRyaXZlcj1qc29uLWZpbGUgLS1sb2ctb3B0IG1heC1zaXplPTEwMG0gLS1sb2ctb3B0IG1heC1maWxlPTEwIC0tdWxpbWl0IG1lbWxvY2s9LTE6LTEgLS1tZW1vcnkgMmcgLS1tZW1vcnktc3dhcD0yZyAtLXVsaW1pdCBub2ZpbGU9NDA5NjoxMDAwMDAgLS12b2x1bWUgL2V0Yy9sb2NhbHRpbWU6L2V0Yy9sb2NhbHRpbWU6cm8gIC0tdm9sdW1lIC9kYXRhL2xvZ3MvRkUvOi92YXIvbGliL2pldHR5L2xvZ3MgLS12b2x1bWUgL2RhdGEvZW52aXJvbm1lbnRzOi9yb290L2NoZWYtc29sby9lbnZpcm9ubWVudHMgLS1wdWJsaXNoIDk0NDM6OTQ0MyAtLXB1Ymxpc2ggODE4MTo4MTgxIGVjb21wLW5leHVzOiR7UE9SVH0vZWNvbXAvc2RjLWZyb250ZW5kOiR7UkVMRUFTRX0KKworCisKKyMgcnVubmluZyBoZWFsdGhDaGVjayBzY3JpcHRzCitlY2hvICJSdW5uaW5nIGhlYWx0aCBjaGVja3MsIHBsZWFzZSB3YWl0Li4uIgorZWNobyAiIgorYz0yNSAjIHNlY29uZHMgdG8gd2FpdAorUkVXUklURT0iXGVbNDVEXGVbMUFcZVtLIgord2hpbGUgWyAkYyAtZ3QgMCBdOyBkbworICAgIGM9JCgoYy0xKSkKKyAgICBzbGVlcCAxCisgICAgZWNobyAtZSAiJHtSRVdSSVRFfSRjIgorZG9uZQorZWNobyAtZSAiIgorCisvZGF0YS9zY3JpcHRzL2RvY2tlcl9oZWFsdGguc2gKKworaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2NyaXB0cy9kb2NrZXJfc3RhdHMuc2ggYi9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl9zdGF0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU4YjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2NyaXB0cy9kb2NrZXJfc3RhdHMuc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL2Jhc2gKKworRklMRT0nL2RhdGEvbG9ncy9kb2NrZXJfc3RhdHMub3V0JworRkVfSUQ9YGRvY2tlciBwc3xncmVwIHNkYy1mcm9udHxhd2sgJ3twcmludCAkMX0nYAorQkVfSUQ9YGRvY2tlciBwc3xncmVwIHNkYy1iYWNrIHxhd2sgJ3twcmludCAkMX0nYAorCitlY2hvIGBkYXRlYCA+PiAke0ZJTEV9CisKK2lmIFsgISAteiAiJHtGRV9JRH0iIF07IHRoZW4KKyAgIGRvY2tlciBzdGF0cyAke0ZFX0lEfSAtLW5vLXN0cmVhbSA+PiAvZGF0YS9sb2dzL2RvY2tlcl9zdGF0cy5vdXQKK2Vsc2UKKyAgIGVjaG8gImZyb250ZW5kIERvY2tlciBpcyBkb3duISEhIiA+PiAvZGF0YS9sb2dzL2RvY2tlcl9zdGF0cy5vdXQKK2ZpCisKK2lmIFsgISAteiAiJHtCRV9JRH0iIF07IHRoZW4KKyAgIGRvY2tlciBzdGF0cyAke0JFX0lEfSAtLW5vLXN0cmVhbSA+PiAvZGF0YS9sb2dzL2RvY2tlcl9zdGF0cy5vdXQKK2Vsc2UKKyAgIGVjaG8gImJhY2tlbmQgRG9ja2VyIGlzIGRvd24hISEiID4+IC9kYXRhL2xvZ3MvZG9ja2VyX3N0YXRzLm91dAorZmkKKworZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA+PiAgJHtGSUxFfQorCitncmVwIC12ICJeXC0iICR7RklMRX0gfGdyZXAgLXYgXkNPTlR8IGF3ayAnQkVHSU4geworICAgIHNwbGl0KCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlYyIsbW9udGgpCisgICAgZm9yIChpIGluIG1vbnRoKSB7CisgICAgICAgIG1vbnRoX251bXNbbW9udGhbaV1dPWkKKyAgICB9Cit9CisvVVRDLyB7CisgIGQ9JDYiLSIkMiItInN1YnN0cigiMDAiLDAsMi1sZW5ndGgoJDMpKSQzIi0ic3Vic3RyKCQ0LDAsNSkKKyAgbmV4dAorfQorL0dpQi8geworICAgcHJpbnQgJDEiICJkIiAiJDMiICIkOAorICAgbmV4dAorfScgPiBgZWNobyAke0ZJTEV9fGF3ayAtRiIuIiAneyBwcmludCAkMSIuY3N2In0nYApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2NyaXB0cy9kb2NrZXJfd2F0Y2hkb2cuc2ggYi9zZGMtb3MtY2hlZi9zY3JpcHRzL2RvY2tlcl93YXRjaGRvZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzg0NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2NyaXB0cy9kb2NrZXJfd2F0Y2hkb2cuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL2Jhc2gKKworaWYgWyAkIyAtZXEgMCBdOyB0aGVuCisgICBlY2hvICJObyBhcmd1bWVudHMgc3VwcGxpZWQiCisgICBleGl0IDEKK2ZpCisKKworUkVMRUFTRT0kMQorREVQX0VOVj0kMgorCisKK2RvY2tlcl9pZHM9YGRvY2tlciBwcyAtYSB8IGVncmVwICJFeGl0IiB8IGF3ayAne3ByaW50ICQxfSdgCitmb3IgWCBpbiAke2RvY2tlcl9pZHN9CitkbworICAgZG9ja2VyIHJtIC1mICR7WH0KK2RvbmUKKworZXhwb3J0IElQPWBpZmNvbmZpZyBldGgwIHwgYXdrIC1GOiAnL2luZXQgYWRkci8ge2dzdWIoLyAuKi8sIiIsJDIpOyBwcmludCAkMn0nYAorCitlY2hvICIiCisKKyMgQmFjay1FbmQKK215X2NudD1gZG9ja2VyIHBzfGVncmVwIC1jICJzZGMtYmFja2VuZDoke1JFTEVBU0V9ImAKK2lmIFsgIiR7bXlfY250fSIgLWVxICIxIiBdOyB0aGVuCisjICAgIGVjaG8gImBkYXRlYCAtIEJFIGlzIHJ1bm5pbmciID4+IC9kYXRhL0FTREMvbG9ncy93YXRjaGRvZy5sb2cKKyAgICBlY2hvICJgZGF0ZWAgLSBCRSBpcyBydW5uaW5nIiA+IC9kZXYvbnVsbAorZWxzZQorICAgIGVjaG8gImBkYXRlYCAtIEJFIHdhcyBkb3duIiA+PiAvZGF0YS9BU0RDL2xvZ3Mvd2F0Y2hkb2cubG9nCisgICAgZG9ja2VyIHB1bGwgZWNvbXAtbmV4dXM6NTEyMTIvZWNvbXAvc2RjLWJhY2tlbmQ6JHtSRUxFQVNFfQorICAgIGRvY2tlciBydW4gLS1kZXRhY2ggLS1uYW1lIHNkYy1CRSAtLWVudiBIT1NUX0lQPSR7SVB9IC0tZW52IEVOVk5BTUU9IiR7REVQX0VOVn0iIC0tbG9nLWRyaXZlcj1qc29uLWZpbGUgLS1sb2ctb3B0IG1heC1zaXplPTEwMG0gLS1sb2ctb3B0IG1heC1maWxlPTEwIC0tdWxpbWl0IG1lbWxvY2s9LTE6LTEgLS1tZW1vcnkgM2cgLS1tZW1vcnktc3dhcD0zZyAtLXVsaW1pdCBub2ZpbGU9NDA5NjoxMDAwMDAgLS12b2x1bWUgL2V0Yy9sb2NhbHRpbWU6L2V0Yy9sb2NhbHRpbWU6cm8gLS12b2x1bWUgL2RhdGEvQVNEQy9sb2dzL0JFLzovdmFyL2xpYi9qZXR0eS9sb2dzICAtLXZvbHVtZSAvZGF0YS9BU0RDL2Vudmlyb25tZW50czovcm9vdC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzIC0tcHVibGlzaCA4NDQzOjg0NDMgLS1wdWJsaXNoIDgwODA6ODA4MCBlY29tcC1uZXh1czo1MTIxMi9lY29tcC9zZGMtYmFja2VuZDoke1JFTEVBU0V9CitmaQorCisjIEZyb250LUVuZAorbXlfY250PWBkb2NrZXIgcHN8ZWdyZXAgLWMgInNkYy1mcm9udGVuZDoke1JFTEVBU0V9ImAKK2lmIFsgIiR7bXlfY250fSIgLWVxICIxIiBdOyB0aGVuCisjICAgIGVjaG8gImBkYXRlYCAtIEZFIGlzIHJ1bm5pbmciID4+IC9kYXRhL0FTREMvbG9ncy93YXRjaGRvZy5sb2cKKyAgICBlY2hvICJgZGF0ZWAgLSBGRSBpcyBydW5uaW5nIiA+PiAvZGV2L251bGwKK2Vsc2UKKyAgICBlY2hvICJgZGF0ZWAgLSBGRSB3YXMgZG93biIgPj4gL2RhdGEvQVNEQy9sb2dzL3dhdGNoZG9nLmxvZworICAgIGRvY2tlciBwdWxsIGVjb21wLW5leHVzOjUxMjEyL2Vjb21wL3NkYy1mcm9udGVuZDoke1JFTEVBU0V9CisJZG9ja2VyIHJ1biAtLWRldGFjaCAtLW5hbWUgc2RjLUZFIC0tZW52IEhPU1RfSVA9JHtJUH0gLS1lbnYgRU5WTkFNRT0iJHtERVBfRU5WfSIgLS1sb2ctZHJpdmVyPWpzb24tZmlsZSAtLWxvZy1vcHQgbWF4LXNpemU9MTAwbSAtLWxvZy1vcHQgbWF4LWZpbGU9MTAgLS11bGltaXQgbWVtbG9jaz0tMTotMSAtLW1lbW9yeSAyZyAtLW1lbW9yeS1zd2FwPTJnIC0tdWxpbWl0IG5vZmlsZT00MDk2OjEwMDAwMCAtLXZvbHVtZSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybyAgLS12b2x1bWUgL2RhdGEvQVNEQy9sb2dzL0ZFLzovdmFyL2xpYi9qZXR0eS9sb2dzIC0tdm9sdW1lIC9kYXRhL0FTREMvZW52aXJvbm1lbnRzOi9yb290L2NoZWYtc29sby9lbnZpcm9ubWVudHMgLS1wdWJsaXNoIDk0NDM6OTQ0MyAtLXB1Ymxpc2ggODE4MTo4MTgxIGVjb21wLW5leHVzOjUxMjEyL2Vjb21wL3NkYy1mcm9udGVuZDoke1JFTEVBU0V9CitmaQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2NyaXB0cy9yZXN0YXJ0X2RvY2tlci5zaCBiL3NkYy1vcy1jaGVmL3NjcmlwdHMvcmVzdGFydF9kb2NrZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5ZjUxYQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NjcmlwdHMvcmVzdGFydF9kb2NrZXIuc2gKQEAgLTAsMCArMSw5NyBAQAorIyEvYmluL2Jhc2gKKworCitmdW5jdGlvbiB1c2FnZQoreworICAgIGVjaG8gInVzYWdlOiBkb2NrZXJfcnVuLnNoIFsgLXJ8LS1yZWxlYXNlIDxSRUxFQVNFLU5BTUU+IF0gIFsgLWV8LS1lbnZpcm9ubWVudCA8RU5WLU5BTUU+IF0gWyAtcHwtLXBvcnQgPERvY2tlci1odWItcG9ydD5dIFsgLWh8LS1oZWxwIF0iCit9CisKKworUkVMRUFTRT1fX1NEQy1SRUxFQVNFX18KK1sgLWYgL29wdC9jb25maWcvZW52X25hbWUudHh0IF0gJiYgREVQX0VOVj0kKGNhdCAvb3B0L2NvbmZpZy9lbnZfbmFtZS50eHQpIHx8IERFUF9FTlY9X19FTlYtTkFNRV9fCitQT1JUPTUxMjEyCisKK3doaWxlIFsgIiQxIiAhPSAiIiBdOyBkbworICAgIGNhc2UgJDEgaW4KKwkgICAgLWQgfCAtLWRvY2tlciApCisJCSAgICBzaGlmdAorCQkJRE9DS0VSPSR7MX0KKwkJCTs7CisgICAgICAgIC1yIHwgLS1yZWxlYXNlICkKKyAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICBSRUxFQVNFPSR7MX0KKyAgICAgICAgICAgIDs7CisgICAgICAgIC1lIHwgLS1lbnZpcm9ubWVudCApCisJCQlzaGlmdAorICAgICAgICAgICAgREVQX0VOVj0kezF9CisgICAgICAgICAgICA7OworCQktcCB8IC0tcG9ydCApCisgICAgICAgICAgICBzaGlmdAorICAgICAgICAgICAgUE9SVD0kezF9CisJCQk7OworICAgICAgICAtaCB8IC0taGVscCApCisJCQl1c2FnZQorICAgICAgICAgICAgZXhpdAorICAgICAgICAgICAgOzsKKyAgICAgICAgKiApIAorICAgIAkJdXNhZ2UKKyAgICAgICAgICAgIGV4aXQgMQorICAgIGVzYWMKKyAgICBzaGlmdAorZG9uZQorCitbIC1mIC9vcHQvY29uZmlnL25leHVzX3VzZXJuYW1lLnR4dCBdICYmIE5FWFVTX1VTRVJOQU1FPSQoY2F0IC9vcHQvY29uZmlnL25leHVzX3VzZXJuYW1lLnR4dCkgICAgfHwgTkVYVVNfVVNFUk5BTUU9cmVsZWFzZQorWyAtZiAvb3B0L2NvbmZpZy9uZXh1c19wYXNzd29yZC50eHQgXSAmJiBORVhVU19QQVNTV0Q9JChjYXQgL29wdC9jb25maWcvbmV4dXNfcGFzc3dvcmQudHh0KSAgICAgIHx8IE5FWFVTX1BBU1NXRD1zZldVM0RGVmRCcjdHVnhCODVtVFlnQVcKK1sgLWYgL29wdC9jb25maWcvbmV4dXNfZG9ja2VyX3JlcG8udHh0IF0gJiYgTkVYVVNfRE9DS0VSX1JFUE89JChjYXQgL29wdC9jb25maWcvbmV4dXNfZG9ja2VyX3JlcG8udHh0KSB8fCBORVhVU19ET0NLRVJfUkVQTz1lY29tcC1uZXh1czoke1BPUlR9CisKK1sgLWYgL29wdC9jb25maWcvbmV4dXNfdXNlcm5hbWUudHh0IF0gJiYgZG9ja2VyIGxvZ2luIC11ICRORVhVU19VU0VSTkFNRSAtcCAkTkVYVVNfUEFTU1dEICRORVhVU19ET0NLRVJfUkVQTworCisKKyMgY2xlYW51cAorZWNobyAicGVyZm9ybWluZyBvbGQgZG9ja2VycyBjbGVhbnVwIgorZG9ja2VyX2lkcz1gZG9ja2VyIHBzIC1hIHwgZWdyZXAgIiR7RE9DS0VSfXxFeGl0IiB8IGF3ayAne3ByaW50ICQxfSdgCitmb3IgWCBpbiAke2RvY2tlcl9pZHN9CitkbworICAgZG9ja2VyIHJtIC1mICR7WH0KK2RvbmUKKworZXhwb3J0IElQPWBpZmNvbmZpZyBldGgwIHwgYXdrIC1GOiAnL2luZXQgYWRkci8ge2dzdWIoLyAuKi8sIiIsJDIpOyBwcmludCAkMn0nYAorCitlY2hvICIiCisKK2Nhc2UgJHtET0NLRVJ9IGluCisgICAgZWxhc3RpYyB8IGVzICkKKwkJIyBFbGFzdGljLVNlYXJjaAorCQllY2hvICJkb2NrZXIgcnVuIHNkYy1lbGFzdGljc2VhcmNoLi4uIgorCQlkb2NrZXIgcHVsbCBlY29tcC1uZXh1czoke1BPUlR9L2Vjb21wL3NkYy1lbGFzdGljc2VhcmNoOiR7UkVMRUFTRX0KKwkJZG9ja2VyIHJ1biAtLWRldGFjaCAtLW5hbWUgc2RjLWVzIC0tZW52IEVOVk5BTUU9IiR7REVQX0VOVn0iIC0tbG9nLWRyaXZlcj1qc29uLWZpbGUgLS1sb2ctb3B0IG1heC1zaXplPTEwMG0gLS1sb2ctb3B0IG1heC1maWxlPTEwIC0tbWVtb3J5IDFnIC0tbWVtb3J5LXN3YXA9MWcgLS11bGltaXQgbWVtbG9jaz0tMTotMSAtLXVsaW1pdCBub2ZpbGU9NDA5NjoxMDAwMDAgLS12b2x1bWUgL2V0Yy9sb2NhbHRpbWU6L2V0Yy9sb2NhbHRpbWU6cm8gLWUgRVNfSEVBUF9TSVpFPTEwMjRNIC0tdm9sdW1lIC9kYXRhL0VTOi91c3Ivc2hhcmUvZWxhc3RpY3NlYXJjaC9kYXRhIC0tdm9sdW1lIC9kYXRhL2Vudmlyb25tZW50czovcm9vdC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzIC0tcHVibGlzaCA5MjAwOjkyMDAgLS1wdWJsaXNoIDkzMDA6OTMwMCBlY29tcC1uZXh1czoke1BPUlR9L2Vjb21wL3NkYy1lbGFzdGljc2VhcmNoOiR7UkVMRUFTRX0KKwkJOzsKKworCWNhc3NhbmRyYSB8IGNzICkKKwkJIyBjYXNzYW5kcmEKKwkJZWNobyAiZG9ja2VyIHJ1biBzZGMtY2Fzc2FuZHJhLi4uIgorCQlkb2NrZXIgcHVsbCBlY29tcC1uZXh1czoke1BPUlR9L2Vjb21wL3NkYy1jYXNzYW5kcmE6JHtSRUxFQVNFfQorCQlkb2NrZXIgcnVuIC0tZGV0YWNoIC0tbmFtZSBzZGMtY3MgLS1lbnYgRU5WTkFNRT0iJHtERVBfRU5WfSIgLS1lbnYgSE9TVF9JUD0ke0lQfSAtLWxvZy1kcml2ZXI9anNvbi1maWxlIC0tbG9nLW9wdCBtYXgtc2l6ZT0xMDBtIC0tbG9nLW9wdCBtYXgtZmlsZT0xMCAtLXVsaW1pdCBtZW1sb2NrPS0xOi0xIC0tdWxpbWl0IG5vZmlsZT00MDk2OjEwMDAwMCAtLXZvbHVtZSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybyAtLXZvbHVtZSAvZGF0YS9DUzovdmFyL2xpYi9jYXNzYW5kcmEgLS12b2x1bWUgL2RhdGEvZW52aXJvbm1lbnRzOi9yb290L2NoZWYtc29sby9lbnZpcm9ubWVudHMgLS1wdWJsaXNoIDkwNDI6OTA0MiAtLXB1Ymxpc2ggOTE2MDo5MTYwIGVjb21wLW5leHVzOiR7UE9SVH0vZWNvbXAvc2RjLWNhc3NhbmRyYToke1JFTEVBU0V9CisJCTs7CisJCQorCWtpYmFuYSB8IGtibiApCisJCSMga2liYW5hCisJCWVjaG8gImRvY2tlciBydW4gc2RjLWtpYmFuYS4uLiIKKwkJZG9ja2VyIHB1bGwgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMta2liYW5hOiR7UkVMRUFTRX0KKwkJZG9ja2VyIHJ1biAtLWRldGFjaCAtLW5hbWUgc2RjLWtibiAtLWVudiBFTlZOQU1FPSIke0RFUF9FTlZ9IiAtLWxvZy1kcml2ZXI9anNvbi1maWxlIC0tbG9nLW9wdCBtYXgtc2l6ZT0xMDBtIC0tbG9nLW9wdCBtYXgtZmlsZT0xMCAtLXVsaW1pdCBtZW1sb2NrPS0xOi0xIC0tbWVtb3J5IDFnIC0tbWVtb3J5LXN3YXA9MWcgLS11bGltaXQgbm9maWxlPTQwOTY6MTAwMDAwIC0tdm9sdW1lIC9ldGMvbG9jYWx0aW1lOi9ldGMvbG9jYWx0aW1lOnJvIC0tdm9sdW1lIC9kYXRhL2Vudmlyb25tZW50czovcm9vdC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzIC0tcHVibGlzaCA1NjAxOjU2MDEgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMta2liYW5hOiR7UkVMRUFTRX0KKwkJOzsKKwkJCisJYmFja2VuZCB8IGJlICkKKwkJIyBCYWNrLUVuZAorCQllY2hvICJkb2NrZXIgcnVuIHNkYy1iYWNrZW5kLi4uIgorCQlkb2NrZXIgcHVsbCBlY29tcC1uZXh1czoke1BPUlR9L2Vjb21wL3NkYy1iYWNrZW5kOiR7UkVMRUFTRX0KKwkJZG9ja2VyIHJ1biAtLWRldGFjaCAtLW5hbWUgc2RjLUJFIC0tZW52IEhPU1RfSVA9JHtJUH0gLS1lbnYgRU5WTkFNRT0iJHtERVBfRU5WfSIgLS1sb2ctZHJpdmVyPWpzb24tZmlsZSAtLWxvZy1vcHQgbWF4LXNpemU9MTAwbSAtLWxvZy1vcHQgbWF4LWZpbGU9MTAgLS11bGltaXQgbWVtbG9jaz0tMTotMSAtLW1lbW9yeSA0ZyAtLW1lbW9yeS1zd2FwPTRnIC0tdWxpbWl0IG5vZmlsZT00MDk2OjEwMDAwMCAtLXZvbHVtZSAvZXRjL2xvY2FsdGltZTovZXRjL2xvY2FsdGltZTpybyAtLXZvbHVtZSAvZGF0YS9sb2dzL0JFLzovdmFyL2xpYi9qZXR0eS9sb2dzICAtLXZvbHVtZSAvZGF0YS9lbnZpcm9ubWVudHM6L3Jvb3QvY2hlZi1zb2xvL2Vudmlyb25tZW50cyAtLXB1Ymxpc2ggODQ0Mzo4NDQzIC0tcHVibGlzaCA4MDgwOjgwODAgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMtYmFja2VuZDoke1JFTEVBU0V9CisJCTs7CisJCQorCWZyb250ZW5kIHwgZmUgKQorCQkjIEZyb250LUVuZAorCQllY2hvICJkb2NrZXIgcnVuIHNkYy1mcm9udGVuZC4uLiIKKwkJZG9ja2VyIHB1bGwgZWNvbXAtbmV4dXM6JHtQT1JUfS9lY29tcC9zZGMtZnJvbnRlbmQ6JHtSRUxFQVNFfQorCQlkb2NrZXIgcnVuIC0tZGV0YWNoIC0tbmFtZSBzZGMtRkUgLS1lbnYgSE9TVF9JUD0ke0lQfSAtLWVudiBFTlZOQU1FPSIke0RFUF9FTlZ9IiAtLWxvZy1kcml2ZXI9anNvbi1maWxlIC0tbG9nLW9wdCBtYXgtc2l6ZT0xMDBtIC0tbG9nLW9wdCBtYXgtZmlsZT0xMCAtLXVsaW1pdCBtZW1sb2NrPS0xOi0xIC0tbWVtb3J5IDJnIC0tbWVtb3J5LXN3YXA9MmcgLS11bGltaXQgbm9maWxlPTQwOTY6MTAwMDAwIC0tdm9sdW1lIC9ldGMvbG9jYWx0aW1lOi9ldGMvbG9jYWx0aW1lOnJvICAtLXZvbHVtZSAvZGF0YS9sb2dzL0ZFLzovdmFyL2xpYi9qZXR0eS9sb2dzIC0tdm9sdW1lIC9kYXRhL2Vudmlyb25tZW50czovcm9vdC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzIC0tcHVibGlzaCA5NDQzOjk0NDMgLS1wdWJsaXNoIDgxODE6ODE4MSBlY29tcC1uZXh1czoke1BPUlR9L2Vjb21wL3NkYy1mcm9udGVuZDoke1JFTEVBU0V9CisJCTs7Citlc2FjCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9Eb2NrZXJmaWxlLnRlbXBsYXRlIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvRG9ja2VyZmlsZS50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGEwYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvRG9ja2VyZmlsZS50ZW1wbGF0ZQpAQCAtMCwwICsxLDMwIEBACitGUk9NIGpldHR5CisKK1JVTiBhcHQtZ2V0IC15IHVwZGF0ZQorUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCBhcHQtdXRpbHMKK1JVTiBhcHQtZ2V0IC15IGluc3RhbGwgY3VybAorUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCB2aW0KK1JVTiBhcHQtZ2V0IC15IGluc3RhbGwganEKK1JVTiBhcHQtZ2V0IC15IGluc3RhbGwgcHl0aG9uIGxpYnNzbC1kZXYgbGliY3VybDQtb3BlbnNzbC1kZXYgcHl0aG9uLWRldiBnY2MKKworQ09QWSBjaGVmLXNvbG8gL3Jvb3QvY2hlZi1zb2xvLworQ09QWSBjaGVmLXJlcG8vY29va2Jvb2tzLy4gL3Jvb3QvY2hlZi1zb2xvL2Nvb2tib29rcy8KKworUlVOIHB5dGhvbiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL2ZpbGVzL2RlZmF1bHQvZ2V0LXBpcC5weQorUlVOIHBpcCBpbnN0YWxsIHB5Y3VybAorCitFTlYgQkFTRV9ORVhVUyB6bDk5OXk6Q2hhbmdlTWVAMTAuMjA4LjE5Ny43NTo4NDQzL3JlcG9zaXRvcnkvbWF2ZW4tcHVibGljL29yZy9vcGVuZWNvbXAvc2RjCisKKyMgaW5zdGFsbCBjaGVmLXNvbG8KK1JVTiBjdXJsIC1MIGh0dHBzOi8vd3d3Lm9wc2NvZGUuY29tL2NoZWYvaW5zdGFsbC5zaCB8IGJhc2gKKworI0FERCBodHRwczovLyR7QkFTRV9ORVhVU30vYXBpLWRvY3MvMTYxMC4wLjAtU05BUFNIT1QvYXBpLWRvY3MtMTYxMC4wLjAtMjAxNjEyMTEuMTQzNzM5LTEud2FyICAgICAvdmFyL2xpYi9qZXR0eS93ZWJhcHBzLworQUREIG9uYm9hcmRpbmctYmUtX19TREMtUkVMRUFTRV9fLndhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC92YXIvbGliL2pldHR5L3dlYmFwcHMvCitBREQgY2F0YWxvZy1iZS1fX1NEQy1SRUxFQVNFX18ud2FyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3Zhci9saWIvamV0dHkvd2ViYXBwcy8KK1JVTiBjaG93biAtUiBqZXR0eTpqZXR0eSAvdmFyL2xpYi9qZXR0eS93ZWJhcHBzCisKK0NPUFkgc3RhcnR1cC5zaCAvcm9vdC8KKworUlVOIGNobW9kIDc3MCAvcm9vdC9zdGFydHVwLnNoCisKK0VOVFJZUE9JTlQgWyAiL3Jvb3Qvc3RhcnR1cC5zaCIgXQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9hdHRyaWJ1dGVzL2RlZmF1bHQucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg3Y2E4Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9hdHRyaWJ1dGVzL2RlZmF1bHQucmIKQEAgLTAsMCArMSBAQAorIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvZmlsZXMvZGVmYXVsdC9CRS1lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvQkUtZWNvbXAtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkN2NkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvQkUtZWNvbXAtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sCkBAIC0wLDAgKzEsMzgzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5vdGUgdGhlIGNvbnZlbnRpb25zIG9mIHRoZSBmaWVsZCB2YWx1ZXM6CisjIHR5cGUgY2FuIGJlIG9uZSBvZjogQ09ORklHX0VSUk9SLCBTWVNURU1fRVJST1IsIERBVEFfRVJST1IsIENPTk5FQ1RJT05fUFJPQkxFTSwgQVVUSEVOVElDQVRJT05fUFJPQkxFTQorIyBzZXZlcml0eSBjYW4gYmUgb25lIG9mOiBXQVJOLCBFUlJPUiwgRkFUQUwKKyMgYWxhcm1TZXZlcml0eSBjYW4gYmUgb25lIG9mOiBDUklUSUNBTCxNQUpPUixNSU5PUixJTkZPUk1BVElPTkFMLE5PTkUKKyMgY29kZSBpcyBhIHVuaXF1ZSBpbnRlZ2VyIGluIHJhbmdlIG9mIDMwMDMtOTk5OSAoMzAwMC0zMDAyIGFyZSBvY2N1cGllZCBmb3IgaW50ZXJuYWwgdXNhZ2UpCisjIFRoZSBhYm92ZSBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlIG91dC1vZi10aGUtYm94IGFuZCBjYW4gYmUgY2hhbmdlZCBpbiBjb2RlLiAKKyMgSW4gY2FzZSBvZiBjb25maWcgYW5kIGNvZGUgbWlzbWF0Y2gsIHRoZSBhcHByb3ByaWF0ZSBlcnJvciB3aWxsIGJlIHByaW50ZWQgdG8gbG9nCisjCisjIyBSYW5nZSBvZiBCRSBjb2RlcyAtIDMwMTAtNzk5OQorCitlcnJvcnM6CisKKyAgICBCZVJlc3RBcGlHZW5lcmFsRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBCRSBSRVNUIEFQSSBleGVjdXRpb24iLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKworICAgIEJlSGVhbHRoQ2hlY2tFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxMCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkVycm9yIGR1cmluZyBCRSBIZWFsdGggQ2hlY2siLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUluaXRpYWxpemF0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDYXRhbG9nLUJFIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKworICAgIEJlUmVzb3VyY2VNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJNYW5kYXRvcnkgcmVzb3VyY2UgJXMgY2Fubm90IGJlIGZvdW5kIGluIHJlcG9zaXRvcnkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVNlcnZpY2VNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJNYW5kYXRvcnkgc2VydmljZSAlcyBjYW5ub3QgYmUgZm91bmQgaW4gcmVwb3NpdG9yeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkQWRkaW5nUmVzb3VyY2VJbnN0YW5jZUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDEzLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGFkZCByZXNvdXJjZSBpbnN0YW5jZSBvZiByZXNvdXJjZSAlcyB0byBzZXJ2aWNlICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVJbmNvcnJlY3RTZXJ2aWNlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTQsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJTZXJ2aWNlICVzIGlzIG5vdCB2YWxpZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgICAKKyAgICBCZVJlcG9zaXRvcnlEZWxldGVFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAxNSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBkZWxldGUgb2JqZWN0ICVzIGZyb20gcmVwb3NpdG9yeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlUmVwb3NpdG9yeVF1ZXJ5RXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTYsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZmV0Y2ggZnJvbSByZXBvc2l0b3J5ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTkZJR19FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDE3LAorICAgICAgICBzZXZlcml0eTogRkFUQUwsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgJXMgaXMgaW52YWxpZC4gVmFsdWUgY29uZmlndXJlZCBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgCisgICAgQmVVZWJDb25uZWN0aW9uRXJyb3I6IHsKKyAgICAgICAgdHlwZTogQ09OTkVDVElPTl9QUk9CTEVNLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDb25uZWN0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gUmVhc29uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVWViU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMTksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBvY2N1cmVkIGR1cmluZyBhY2Nlc3MgdG8gVS1FQiBTZXJ2ZXIuIE9wZXJhdGlvbjogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZVVlYk9iamVjdE5vdEZvdW5kRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDA1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igb2NjdXJlZCBkdXJpbmcgYWNjZXNzIHRvIFUtRUIgU2VydmVyLiBEYXRhIG5vdCBmb3VuZDogJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKworICAgIEJlRGlzdHJpYnV0aW9uRW5naW5lU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMjEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJFcnJvciBvY2N1cmVkIGluIERpc3RyaWJ1dGlvbiBFbmdpbmUuIEZhaWxlZCBvcGVyYXRpb246ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVZWJBdXRoZW50aWNhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IEFVVEhFTlRJQ0FUSU9OX1BST0JMRU0sCisgICAgICAgIGNvZGU6IEFTRENfNDAwMywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkF1dGhlbnRpY2F0aW9uIHByb2JsZW0gdG93YXJkcyBVLUVCIHNlcnZlci4gUmVhc29uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlVWViVW5rb3duSG9zdEVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTk5FQ1RJT05fUFJPQkxFTSwKKyAgICAgICAgY29kZTogQVNEQ180MDAyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29ubmVjdGlvbiBwcm9ibGVtIHRvd2FyZHMgVS1FQiBzZXJ2ZXIuIENhbm5vdCByZWFjaCBob3N0ICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVEaXN0cmlidXRpb25FbmdpbmVJbnZhbGlkQXJ0aWZhY3RUeXBlOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwNiwKKyAgICAgICAgc2V2ZXJpdHk6IFdBUk4sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhlIGFydGlmYWN0IHR5cGUgJXMgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBsaXN0IG9mIHZhbGlkIGFydGlmYWN0cyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlSW52YWxpZFR5cGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMDgsCisgICAgICAgIHNldmVyaXR5OiBXQVJOLAorICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSB0eXBlICVzIG9mICVzIGlzIGludmFsaWQiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUludmFsaWRWYWx1ZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAyOCwKKyAgICAgICAgc2V2ZXJpdHk6IFdBUk4sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhlIHZhbHVlICVzIG9mICVzIGZyb20gdHlwZSAlcyBpcyBpbnZhbGlkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9IAorICAgIAorICAgIEJlRmFpbGVkRGVsZXRpbmdSZXNvdXJjZUluc3RhbmNlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzMwMjksCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gZGVsZXRlIHJlc291cmNlIGluc3RhbmNlICVzIGZyb20gc2VydmljZSAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBDT05GSUdfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAzMCwKKyAgICAgICAgc2V2ZXJpdHk6IEZBVEFMLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICVzIGlzIG1pc3NpbmciLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUNvbmZpZ3VyYXRpb25JbnZhbGlkTGlzdFNpemVFcnJvcjogeworICAgICAgICB0eXBlOiBDT05GSUdfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfMzAzMSwKKyAgICAgICAgc2V2ZXJpdHk6IEZBVEFMLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICVzIGlzIGludmFsaWQuIEF0IGxlYXN0ICVzIHZhbHVlcyBzaGFsbCBiZSBjb25maWd1cmVkIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgRXJyb3JDb25maWdGaWxlRm9ybWF0OiB7CisgICAgICAgIHR5cGU6IENPTkZJR19FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ18zMDMyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3IgZWxlbWVudCBub3QgZm91bmQgaW4gWUFNTCBuYW1lOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlTWlzc2luZ0FydGlmYWN0SW5mb3JtYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTAsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJBcnRpZmFjdCB1cGxvYWRlZCBoYXMgbWlzc2luZyBpbmZvcm1hdGlvbi4gTWlzc2luZyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlQXJ0aWZhY3RNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDExLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQXJ0aWZhY3QgJXMgcmVxdWVzdGVkIGlzIG5vdCBmb3VuZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlQXJ0aWZhY3RQYXlsb2FkSW52YWxpZDogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTIsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJQYXlsb2FkIG9mIGFydGlmYWN0IHVwbG9hZGVkIGlzIGludmFsaWQgKGludmFsaWQgTUQ1IG9yIGVuY3J5cHRpb24pIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVVc2VyTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwOSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIlVzZXIgJXMgcmVxdWVzdGVkIGlzIG5vdCBmb3VuZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlQXJ0aWZhY3RJbmZvcm1hdGlvbkludmFsaWRFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTMsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJJbnB1dCBmb3IgYXJ0aWZhY3QgbWV0YWRhdGEgaXMgaW52YWxpZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlRmFpbGVkQWRkaW5nQ2FwYWJpbGl0eVR5cGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTUsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgYWRkaW5nIGNhcGFiaWxpdHkgdHlwZSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlQ2FwYWJpbGl0eVR5cGVNaXNzaW5nRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ180MDE2LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ2FwYWJpbGl0eSBUeXBlICVzIG5vdCBmb3VuZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlSW50ZXJmYWNlTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAyMCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkludGVyZmFjZSAlcyByZXF1aXJlZCBpcyBtaXNzaW5nIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVEYW9TeXN0ZW1FcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAxNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIk9wZXJhdGlvbiB0b3dhcmRzIGRhdGFiYXNlIGZhaWxlZCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIAorICAgIEJlU3lzdGVtRXJyb3I6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTcsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBvcGVyYXRpb24iLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZExvY2tPYmplY3RFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAwNywKKyAgICAgICAgc2V2ZXJpdHk6IFdBUk4sCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGxvY2sgb2JqZWN0IGZvciB1cGRhdGUiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBDUklUSUNBTAorICAgIH0KKyAgICAKKyAgICBCZUludmFsaWRKc29uSW5wdXQ6IHsKKyAgICAgICAgdHlwZTogU1lTVEVNX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzQwMTgsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gY29udmVydCBqc29uIGlucHV0IHRvIG9iamVjdCIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRGlzdHJpYnV0aW9uTWlzc2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNDAyMSwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkRpc3RyaWJ1dGlvbiAlcyByZXF1aXJlZCBpcyBtaXNzaW5nIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVIZWFsdGhDaGVja1JlY292ZXJ5OiB7CisgICAgICAgIHR5cGU6IFJFQ09WRVJZLAorICAgICAgICBjb2RlOiBBU0RDXzQwMjIsCisgICAgICAgIHNldmVyaXR5OiBJTkZPLAorICAgICAgICBkZXNjcmlwdGlvbjogIkJFIEhlYWx0aCBDaGVjayBSZWNvdmVyeSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IElORk9STUFUSU9OQUwKKyAgICB9CisgICAgQmVGYWlsZWRDcmVhdGVOb2RlRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDAwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGNyZWF0ZSBub2RlICVzIG9uIGdyYXBoLiBzdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICBCZUZhaWxlZFVwZGF0ZU5vZGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDEsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gdXBkYXRlIG5vZGUgJXMgb24gZ3JhcGguIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkRGVsZXRlTm9kZUVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwMiwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkZhaWxlZCB0byBkZWxldGUgbm9kZSAlcyBvbiBncmFwaC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRSZXRyaWV2ZU5vZGVFcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDMsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJGYWlsZWQgdG8gcmV0cmlldmUgbm9kZSAlcyBmcm9tIGdyYXBoLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUV4ZWN1dGVSb2xsYmFja0Vycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkdvaW5nIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb24gZ3JhcGguIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRGaW5kUGFyZW50RXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA1LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGZpbmQgcGFyZW50IG5vZGUgJXMgb24gZ3JhcGguIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIAorICAgIEJlRmFpbGVkRmluZEFsbE5vZGVzRXJyb3I6IHsKKyAgICAgICAgdHlwZTogREFUQV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA2LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRmFpbGVkIHRvIGZldGNoIGFsbCBub2RlcyB3aXRoIHR5cGUgJXMgb2YgcGFyZW50IG5vZGUgJXMgLiBTdGF0dXMgaXMgJXMiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBNQUpPUgorICAgIH0KKyAgICAKKyAgICBCZUZhaWxlZEZpbmRBc3NvY2lhdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IERBVEFfRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfNjAwNywKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkNhbm5vdCBmaW5kIG5vZGUgd2l0aCB0eXBlICVzIGFzc29jaWF0ZWQgd2l0aCBub2RlICVzIC4gU3RhdHVzIGlzICVzIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgCisgICAgQmVGYWlsZWRGaW5kQXNzb2NpYXRpb25FcnJvcjogeworICAgICAgICB0eXBlOiBEQVRBX0VSUk9SLAorICAgICAgICBjb2RlOiBBU0RDXzYwMDgsCisgICAgICAgIHNldmVyaXR5OiBFUlJPUiwKKyAgICAgICAgZGVzY3JpcHRpb246ICJDYW5ub3QgZmluZCBub2RlIHdpdGggdHlwZSAlcyBhc3NvY2lhdGVkIHdpdGggbm9kZSAlcyAuIFN0YXR1cyBpcyAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIEJlQ29tcG9uZW50Q2xlYW5lclN5c3RlbUVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ182MDA5LAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igb2NjdXJlZCBpbiBDb21wb25lbnQgQ2xlYW5lciBUYXNrLiBGYWlsZWQgb3BlcmF0aW9uOiAlcyIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1BSk9SCisgICAgfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvZmlsZXMvZGVmYXVsdC9CRS1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvQkUtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTRjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvQkUtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sCkBAIC0wLDAgKzEsMTY5NCBAQAorIyBFcnJvcnMKK2Vycm9yczoKKyAgICBPSzogeworICAgICAgICBjb2RlOiAyMDAsCisgICAgICAgIG1lc3NhZ2U6ICJPSyIKKyAgICB9CisgICAgQ1JFQVRFRDogeworICAgICAgICBjb2RlOiAyMDEsCisgICAgICAgIG1lc3NhZ2U6ICJPSyIKKyAgICB9CisgICAgTk9fQ09OVEVOVDogeworICAgICAgICBjb2RlOiAyMDQsCisgICAgICAgIG1lc3NhZ2U6ICJObyBDb250ZW50IgorICAgIH0KKyMtLS0tLS0tLVBPTDQwNTAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgTk9UX0FMTE9XRUQ6IHsKKyAgICAgICAgY29kZTogNDA1LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1ldGhvZCBub3QgYWxsb3dlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJQT0w0MDUwIgorICAgIH0KKyMtLS0tLS0tLVBPTDUwMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgR0VORVJBTF9FUlJPUjogeworICAgICAgICBjb2RlOiA1MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW50ZXJuYWwgU2VydmVyIEVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDUwMDAiCisgICAgfQorIy0tLS0tLS0tLVBPTDUwMDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIE1JU1NJTkdfWF9FQ09NUF9JTlNUQU5DRV9JRDogeworICAgICAgICBjb2RlOiA0MDAgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nICdYLUVDT01QLUluc3RhbmNlSUQnIEhUVFAgaGVhZGVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlBPTDUwMDEiCisgICAgfQorIy0tLS0tLS0tLVBPTDUwMDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIEFVVEhfUkVRVUlSRUQ6IHsKKyAgICAgICAgY29kZTogNDAxICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBBUEkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMiIKKyAgICB9CisjLS0tLS0tLS0tUE9MNTAwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgCisgICAgQVVUSF9GQUlMRUQ6IHsKKyAgICAgICAgY29kZTogNDAzICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBBUEkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiUE9MNTAwMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfQ09OVEVOVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDAiCisgICAgfSMtLS0tLS0tLS1TVkM0MDAwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9DT05URU5UOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfSU5GT1JNQVRJT046IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgaW5mb3JtYXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIFVTRVJfSUQgICAgIAorICAgIFVTRVJfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyICclMScgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDAzIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gVXNlcnMncyBlbWFpbCBhZGRyZXNzICAgICAKKyAgICBJTlZBTElEX0VNQUlMX0FERFJFU1M6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgZW1haWwgYWRkcmVzcyAnJTEnLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwMDQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwMDUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gcm9sZQorICAgIElOVkFMSURfUk9MRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByb2xlICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBVc2VycydzIFVTRVJfSUQgICAgIAorICAgIFVTRVJfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXNlciB3aXRoICclMScgSUQgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDAwNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDAwNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBERUxFVEVfVVNFUl9BRE1JTl9DT05GTElDVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQW4gYWRtaW5pc3RyYXRvciBjYW4gb25seSBiZSBkZWxldGVkIGJ5IGFub3RoZXIgYWRtaW5pc3RyYXRvci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDA4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gVXNlcnMncyB1c2VySWQgICAgIAorICAgIElOVkFMSURfVVNFUl9JRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCB1c2VySWQgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDA4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDQ5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHNlcnZpY2UvcmVzb3VyY2UKKyAgICBDT01QT05FTlRfTUlTU0lOR19DT05UQUNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgJTEgY29udGFjdCBpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDQ5IgorICAgIH0gCisjLS0tLS0tLS0tU1ZDNDA1MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UvQWRkaXRpb25hbCBwYXJhbWV0ZXIKKyMgJTIgLSBzZXJ2aWNlL3Jlc291cmNlL2xhYmVsIG5hbWUKKyAgICBDT01QT05FTlRfTkFNRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSB3aXRoIG5hbWUgJyUyJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDUwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDUxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHJlc291cmNlL3NlcnZpY2UgCisgICAgQ09NUE9ORU5UX01JU1NJTkdfQ0FURUdPUlk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyAlMSBjYXRlZ29yeS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDUxIgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNTItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgQ09NUE9ORU5UX01JU1NJTkdfVEFHUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBdCBsZWFzdCBvbmUgdGFnIGhhcyB0byBiZSBzcGVjaWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA1MiIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDUzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHNlcnZpY2UvcmVzb3VyY2UKKyAgICBDT01QT05FTlRfTUlTU0lOR19ERVNDUklQVElPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nICUxIGRlc2NyaXB0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMSAtIHJlc291cmNlL3NlcnZpY2UKKyAgICBDT01QT05FTlRfSU5WQUxJRF9DQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBJbnZhbGlkICUxIGNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNTUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTU0lOR19WRU5ET1JfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIHZlbmRvciBuYW1lLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNTYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTU0lOR19WRU5ET1JfUkVMRUFTRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIHZlbmRvciByZWxlYXNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTYiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA1Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgTUlTU0lOR19ERVJJVkVEX0ZST01fVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBkZXJpdmVkIGZyb20gdGVtcGxhdGUgc3BlY2lmaWNhdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDU3IgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNTgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9NSVNTSU5HX0lDT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyAlMSBpY29uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIENPTVBPTkVOVF9JTlZBTElEX0lDT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gSW52YWxpZCAlMSBpY29uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgIFBBUkVOVF9SRVNPVVJDRV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gRGVyaXZlZCBmcm9tIHJlc291cmNlIHRlbXBsYXRlIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgICAgTVVMVElQTEVfUEFSRU5UX1JFU09VUkNFX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE11bHRpcGxlIGRlcml2ZWQgZnJvbSByZXNvdXJjZSB0ZW1wbGF0ZSBpcyBub3QgYWxsb3dlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDYxIgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZS9yZXNvdXJjZQorICAgIE1JU1NJTkdfQ09NUE9ORU5UX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyAlMSBuYW1lLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorICAgICMlMcKgIC3CoCByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisgICAgUkVTT1VSQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyByZXNvdXJjZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjMiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDA2NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisgICAgQ09NUE9ORU5UX0lOVkFMSURfREVTQ1JJUFRJT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgZGVzY3JpcHRpb24gY29udGFpbnMgbm9uLWVuZ2xpc2ggY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDY1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyMgJTIgLSBtYXggcmVzb3VyY2Uvc2VydmljZSBuYW1lIGxlbmd0aCAKKyAgICBDT01QT05FTlRfREVTQ1JJUFRJT05fRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBkZXNjcmlwdGlvbiBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA2Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBtYXggbGVuZ3RoICAgCisgICAgQ09NUE9ORU5UX1RBR1NfRVhDRUVEX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRhZ3Mgb3ZlcmFsbCBsZW5ndGggZXhjZWVkcyBsaW1pdCBvZiAlMSBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNjYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBtYXggbGVuZ3RoICAKKyAgICBWRU5ET1JfTkFNRV9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFZlbmRvciBuYW1lIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDY4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWF4IGxlbmd0aCAgCisgICAgVkVORE9SX1JFTEVBU0VfRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBWZW5kb3IgcmVsZWFzZSBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA2OCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0MDY5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UvUHJvZHVjdAorICAgIENPTVBPTkVOVF9JTlZBTElEX0NPTlRBQ1RfSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gJTEgY29udGFjdCBpZCBzaG91bGQgYmUgaW4gZm9ybWF0ICdtbm5ubm5uJyBvciAnYWFubm5hJyBvciAnYWFubm5uJywgd2hlcmUgbT1tICxhPWEtekEtWiBhbmQgbj0wLTkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDY5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MDcwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFNlcnZpY2UvUmVzb3VyY2UKKyAgICBJTlZBTElEX0NPTVBPTkVOVF9OQU1FOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIG5hbWUgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBjaGFyYWN0ZXJzIGxpa2UgPD46IlwvfD8qIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gcmVndWxhciBzcGFjZS4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDcwIgorICAgIH0KKworIy0tLS0tLS0tLVNWQzQwNzEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9WRU5ET1JfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBDb250ZW50LiBWZW5kb3IgbmFtZSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGNoYXJhY3RlcnMgbGlrZSA8PjoiXC98PyogYW5kIHNwYWNlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiByZWd1bGFyIHNwYWNlLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNzEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9WRU5ET1JfUkVMRUFTRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBDb250ZW50LiBWZW5kb3IgcmVsZWFzZSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGNoYXJhY3RlcnMgbGlrZSA8PjoiXC98PyogYW5kIHNwYWNlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiByZWd1bGFyIHNwYWNlLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNzIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwNzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorIyAlMiAtIG1heCAgcmVzb3VyY2Uvc2VydmljZSBuYW1lICAKKyAgICBDT01QT05FTlRfTkFNRV9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuICUxIG5hbWUgZXhjZWVkcyBsaW1pdCBvZiAlMiBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwNzMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQwODAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEIG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0lOX0NIRUNLT1VUX1NUQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiBpcyBsb2NrZWQgZm9yIG1vZGlmaWNhdGlvbiBieSAlMyAlNCglNSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDA4MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDA4MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfSU5fQ0VSVF9JTl9QUk9HUkVTU19TVEFURTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgbG9ja2VkIGZvciBjZXJ0aWZpY2F0aW9uIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgxIgorICAgIH0KKworIy0tLS0tLS0tLS0tU1ZDNDA4Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX1NFTlRfRk9SX0NFUlRJRklDQVRJT046IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIHNlbnQgZm9yIGNlcnRpZmljYXRpb24gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODIiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENPTVBPTkVOVF9WRVJTSU9OX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZlcnNpb24gb2YgdGhpcyAlMSB3YXMgYWxyZWFkeSBwcm9tb3RlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDgzIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdMKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlL3Byb2R1Y3QKKyMgJTMgLcKgRmlyc3QgbmFtZSBvZsKgbGFzdMKgbW9kaWZpZXIKKyMgJTTCoC0gTGFzdCBuYW1lIG9mwqBsYXN0IG1vZGlmaWVyCisjICU1wqAtIFVTRVJfSUTCoG9mwqBsYXN0IG1vZGlmaWVyCisgICAgQ09NUE9ORU5UX0FMUkVBRFlfQ0hFQ0tFRF9JTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiAnJTEnICUyIHdhcyBhbHJlYWR5IGNoZWNrZWQtaW4gYnkgJTMgJTQoJTUpLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZS9wcm9kdWN0wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorIyAlMyAtwqBGaXJzdCBuYW1lIG9mwqBsYXN0wqBtb2RpZmllcgorIyAlNMKgLSBMYXN0IG5hbWUgb2bCoGxhc3QgbW9kaWZpZXIKKyMgJTXCoC0gVVNFUl9JRMKgb2bCoGxhc3QgbW9kaWZpZXIKKyAgICBDT01QT05FTlRfQ0hFQ0tPVVRfQllfQU5PVEhFUl9VU0VSOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSAlMiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgb3V0IGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg1IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoCAtwqByZXNvdXJjZS9zZXJ2aWNlwqBuYW1lCisjICUywqAgLSByZXNvdXJjZS9zZXJ2aWNlCisgICAgQ09NUE9ORU5UX0lOX1VTRTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgJTIgaXMgaW4gdXNlIGJ5IGFub3RoZXIgdXNlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg2IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC0gY29tcG9uZW50wqBuYW1lCisjICUywqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdAorICAgIENPTVBPTkVOVF9IQVNfTkVXRVJfVkVSU0lPTjogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQ2hlY2tpbmcgb3V0IG9mIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBvZiB0aGUgJyUxJyAlMiBpcyBub3QgYWxsb3dlZCBhcyBhIG5ld2VyIHZlcnNpb24gZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQwODciCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDA4OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2Uvc2VydmljZcKgbmFtZQorIyAlMsKgLSByZXNvdXJjZS9zZXJ2aWNlCisjICUzIC3CoEZpcnN0IG5hbWUgb2bCoGxhc3TCoG1vZGlmaWVyCisjICU0wqAtIExhc3QgbmFtZSBvZsKgbGFzdCBtb2RpZmllcgorIyAlNcKgLSBVU0VSX0lEwqBvZsKgbGFzdCBtb2RpZmllcgorICAgIENPTVBPTkVOVF9BTFJFQURZX0NFUlRJRklFRDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICUxICUyIGhhcyBhbHJlYWR5IGJlZW4gY2VydGlmaWVkIGJ5ICUzICU0KCU1KS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQwODktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlL3NlcnZpY2XCoG5hbWUKKyMgJTLCoC0gcmVzb3VyY2Uvc2VydmljZQorICAgIENPTVBPTkVOVF9OT1RfUkVBRFlfRk9SX0NFUlRJRklDQVRJT046IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MDg5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBQUk9QRVJUWV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIHByb3BlcnR5IHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoHByb3BlcnR5wqBuYW1lCisgICAgUFJPUEVSVFlfQUxSRUFEWV9FWElTVDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUHJvcGVydHkgd2l0aCAnJTEnIG5hbWUgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMSIKKyAgICB9CisKKyMtLS0tLS0tLS0tLVNWQzQxMDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoGNhcGFiaWxpdHkgdHlwZSBuYW1lIAorICAgIENBUEFCSUxJVFlfVFlQRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBDYXBhYmlsaXR5IFR5cGUgd2l0aCBuYW1lICclMScgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEwMiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTE0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQVVUSF9GQUlMRURfSU5WQUxJREVfSEVBREVSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIEF1dGhvcml6YXRpb24gaGVhZGVyLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTQiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgY2FwYWJpbGl0eSB0eXBlIG5hbWUgCisgICAgTUlTU0lOR19DQVBBQklMSVRZX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBDYXBhYmlsaXR5IFR5cGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE1IgorICAgIH0KKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9CQURfUkVRVUVTVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMTYiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDExNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMcKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlMsKgLcKgcmVzb3VyY2UgaW5zdGFuY2UgbmFtZQorIyAlM8KgLcKgcmVxdWlyZW1lbnQgbmFtZQorICAgIFJFU09VUkNFX0lOU1RBTkNFX01BVENIX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWF0Y2ggbm90IGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2UgJyUxJyBhbmQgcmVzb3VyY2UgaW5zdGFuY2UgJyUyJyBmb3IgcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE3IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTLCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTPCoC3CoHJlcXVpcmVtZW50IG5hbWUKKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSBpbnN0YW5jZXMgJyUxJyBhbmQgJyUyJyBhcmUgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggcmVxdWlyZW1lbnQgJyUzJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTE4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTLCoC3CoHJlc291cmNlIGluc3RhbmNlIG5hbWUKKyMgJTPCoC3CoHJlcXVpcmVtZW50IG5hbWUKKyAgICBSRVNPVVJDRV9JTlNUQU5DRV9SRUxBVElPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE5vIHJlbGF0aW9uIGZvdW5kIGJldHdlZW4gcmVzb3VyY2UgaW5zdGFuY2VzICclMScgYW5kICclMicgZm9yIHJlcXVpcmVtZW50ICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDExOSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTIwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBVc2VyJ3MgVVNFUl9JRAorICAgIFVTRVJfSU5BQ1RJVkU6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVzZXIgJTEgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIwIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTHCoC3CoFVzZXIncyBVU0VSX0lECisgICAgVVNFUl9IQVNfQUNUSVZFX0VMRU1FTlRTOiB7CisgICAgICAgIGNvZGU6IDQwMywKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVc2VyIHdpdGggJTEgSUQgY2FuIG5vdCBiZSBkZWxldGVkIHNpbmNlIGl0IGhhcyBhY3RpdmUgZWxlbWVudHMocmVzb3VyY2VzL3NlcnZpY2VzL2FydGlmYWN0cykuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEyMSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTIyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxwqAtwqBhcnRpZmFjdCB0eXBlCisgICAgQVJUSUZBQ1RfVFlQRV9OT1RfU1VQUE9SVEVEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGFydGlmYWN0IHR5cGUgJyUxJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBUlRJRkFDVF9MT0dJQ0FMX05BTUVfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0IGxvZ2ljYWwgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTIzIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX0FSVElGQUNUX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgYXJ0aWZhY3QgdHlwZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI0IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEtYXJ0aWZhY3QgbmFtZQorICAgIEFSVElGQUNUX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBcnRpZmFjdCAnJTEnIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMjYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIHJlc291cmNlL3NlcnZpY2UvcHJvZHVjdC8uLi4KKyMgJTLCoC0gZmllbGQgKHRhZywgdmVuZG9yIG5hbWUuLi4pCisgICAgSU5WQUxJRF9GSUVMRF9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICBJbnZhbGlkICUxICUyIGZvcm1hdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI2IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBUlRJRkFDVF9JTlZBTElEX01ENTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBhcnRpZmFjdCBjaGVja3N1bS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI3IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNSVNTSU5HX0FSVElGQUNUX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gTWlzc2luZyBhcnRpZmFjdCBuYW1lLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMjgiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEyOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfUFJPSkVDVF9DT0RFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIE1pc3NpbmcgUFJPSkVDVF9DT0RFIG51bWJlci4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTI5IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBJTlZBTElEX1BST0pFQ1RfQ09ERTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBQUk9KRUNUX0NPREUgbnVtYmVyIG11c3QgYmUgbnVtZXJpYyBmcm9tIDUgdXAgdG8gMTAgZGlnaXRzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzAiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMS1yZXNvdXJjZS9zZXJ2aWNlCisjICUyLXNydGlmYWN0L2FydGlmYWN0cworIyAlMy1zZW1pY29sb21uIHNlcGFyYXRlZCBsaXN0IG9mIGFydGlmYWN0IAorICAgIENPTVBPTkVOVF9NSVNTSU5HX01BTkRBVE9SWV9BUlRJRkFDVFM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgbWFuZGF0b3J5IGluZm9ybWF0aW9uYWwgJTEgJTI6IFslM10uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDEzMSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0MTMyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbGlmZWN5Y2xlICB0eXBlIG5hbWUKKyAgICBMSUZFQ1lDTEVfVFlQRV9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBMaWZlY3ljbGUgVHlwZSB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTMyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQxMzMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBzZXJ2aWNlIHZlcnNpb24KKyMgJTIgLSBzZXJ2aWNlIG5hbWUKKyAgICBTRVJWSUNFX05PVF9BVkFJTEFCTEVfRk9SX0RJU1RSSUJVVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVmVyc2lvbiAlMSBvZiAnJTInIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzdHJpYnV0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzMiCisgICAgfQorIy0tLS0tLS0tLS0tU1ZDNDEzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE1JU1NJTkdfTElGRUNZQ0xFX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBpbnRlcmZhY2UgbGlmZS1jeWNsZSB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9DQVRFR09SWV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU2VydmljZSBjYXRlZ29yeSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSBzZXJ2aWNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCBuYW1lICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfQVZBSUxBQkxFOiB7CisgICAgICAgIGNvZGU6IDUwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIGVudmlyb25tZW50ICclMScgaXMgbm90IGF2YWlsYWJsZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudCBuYW1lICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gZW52aXJvbm1lbnQgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzciCisgICAgfQorIy0tLS0tLS0tLVNWQzQxMzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIERJU1RSSUJVVElPTl9FTlZJUk9OTUVOVF9JTlZBTElEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGRpc3RyaWJ1dGlvbiBlbnZpcm9ubWVudC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0MTM4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0MTM5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyMgJTEgLSBzZXJ2aWNlIG5hbWUKKyAgICBESVNUUklCVVRJT05fQVJUSUZBQ1RfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTZXJ2aWNlICclMScgY2Fubm90IGJlIGRpc3RyaWJ1dGVkIGR1ZSB0byBtaXNzaW5nIGRlcGxveW1lbnQgYXJ0aWZhY3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQxMzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQyMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gU2VydmljZS9SZXNvdXJjZQorIyAlMiAtIG1heCBpY29uIG5hbWUgbGVuZ3RoICAgCisgICAgQ09NUE9ORU5UX0lDT05fRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBpY29uIG5hbWUgZXhjZWVkcyBsaW1pdCBvZiAlMiBjaGFyYWN0ZXJzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQyMDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQzMDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTVFJJQ1RFRF9BQ0NFU1M6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc3RyaWN0ZWQgYWNjZXNzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQzMDAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQzMDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTVFJJQ1RFRF9PUEVSQVRJT046IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc3RyaWN0ZWQgb3BlcmF0aW9uLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQzMDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIAorICAgIE1JU1NJTkdfQk9EWTogeworICAgICAgICBjb2RlOiA0MDAgICwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBNaXNzaW5nIHJlcXVlc3QgYm9keS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTUlTU0lOR19QVUJMSUNfS0VZOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICdhcGlQdWJsaWNLZXknLiIgLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAKKyAgICBESVNUUklCVVRJT05fRU5WX0RPRVNfTk9UX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCAgLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgIEJvZHkgIDogTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICdkaXN0ckVudk5hbWUnLiIgLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTAyIgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ1MDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBzZXJ2aWNlIG5hbWUKKyAgICBTRVJWSUNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgc2VydmljZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDMiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUwNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBTZXJ2aWNlL1Jlc291cmNlCisjICUyIC0gc2VydmljZS9yZXNvdXJjZSB2ZXJzaW9uCisgICAgQ09NUE9ORU5UX1ZFUlNJT05fTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSB2ZXJzaW9uICUyIHdhcyBub3QgZm91bmQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwNCIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0NTA1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyUxLWFydGlmYWN0IG5hbWUKKyAKKyAgICBBUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICclMScgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTA2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIE1JU1NJTkdfRU5WX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwICAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXIgJ2Rpc3RyRW52TmFtZScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUwNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfSU5WQUxJRF9UQUdTX05PX0NPTVBfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBPbmUgb2YgdGhlIHRhZ3Mgc2hvdWxkIGJlIHRoZSBjb21wb25lbnQgbmFtZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTA3IgorICAgIH0KKyAKKyMtLS0tLS0tLS1TVkM0NTA4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFNFUlZJQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU2VydmljZSBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHNlcnZpY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MDgiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUwOS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0lDT05fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEljb24gY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgc2VydmljZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUwOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBpY29uIG5hbWUgbWF4IGxlbmd0aAorICAgIFNFUlZJQ0VfSUNPTl9FWENFRURTX0xJTUlUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIEljb24gbmFtZSBleGNlZWRzIGxpbWl0IG9mICUxIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBESVNUUklCVVRJT05fUkVRVUVTVEVEX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gRGlzdHJpYnV0aW9uIElECisgICAgRElTVFJJQlVUSU9OX1JFUVVFU1RFRF9GQUlMRUQ6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBkaXN0cmlidXRpb24gJyUxJyBmYWlsZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9DQVRFR09SWV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgY2F0ZWdvcnkgY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgcmVzb3VyY2UgaXMgY2VydGlmaWVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MTQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgUkVTT1VSQ0VfTkFNRV9DQU5OT1RfQkVfQ0hBTkdFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVzb3VyY2UgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9JQ09OX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJY29uIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIHJlc291cmNlIGlzIGNlcnRpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX1ZFTkRPUl9OQU1FX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBWZW5kb3IgbmFtZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9ERVJJVkVEX0ZST01fQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IERlcml2ZWQgZnJvbSByZXNvdXJjZSB0ZW1wbGF0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSByZXNvdXJjZSBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUxNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUxOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSBtYXggbGVuZ3RoIAorICAgIENPTVBPTkVOVF9TSU5HTEVfVEFHX0VYQ0VFRF9MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBTaW5nbGUgdGFnIGV4Y2VlZHMgbGltaXQgb2YgJTEgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTE4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTE5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfREVGQVVMVF9WQUxVRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogbWlzbWF0Y2ggaW4gZGF0YS10eXBlIG9jY3VycmVkIGZvciBwcm9wZXJ0eSAlMS4gZGF0YSB0eXBlIGlzICUyIGFuZCBkZWZhdWx0IHZhbHVlIGZvdW5kIGlzICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gc2VydmljZSBvciByZXNvdXJjZSAKKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX01BWF9OVU1CRVJfUkVBQ0hFRDogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWF4aW1hbCBudW1iZXIgb2YgYWRkaXRpb25hbCAlMSBwYXJhbWV0ZXJzIHdhcyByZWFjaGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBRERJVElPTkFMX0lORk9STUFUSU9OX0VNUFRZX1NUUklOR19OT1RfQUxMT1dFRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsYWJlbCBhbmQgdmFsdWUgY2Fubm90IGJlIGVtcHR5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gbGFiZWwvdmFsdWUKKyMgJTIgLSBNYXhpbWFsIGxlbmd0aCBvZiAlMQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uICUxIGV4Y2VlZHMgbGltaXQgb2YgJTIgY2hhcmFjdGVycy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTIyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9LRVlfTk9UX0FMTE9XRURfQ0hBUkFDVEVSUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBDb250ZW50LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxhYmVsIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gY2hhcmFjdGVycyBsaWtlIDw+OiJcL3w/KiBhbmQgc3BhY2UgY2hhcmFjdGVycyBvdGhlciB0aGFuIHJlZ3VsYXIgc3BhY2UuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUyNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFERElUSU9OQUxfSU5GT1JNQVRJT05fTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCisgICAgQURESVRJT05BTF9JTkZPUk1BVElPTl9WQUxVRV9OT1RfQUxMT1dFRF9DSEFSQUNURVJTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogJ0Vycm9yOiBJbnZhbGlkIENvbnRlbnQuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gY29udGFpbnMgbm9uLWVuZ2xpc2ggY2hhcmFjdGVycy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcmVzb3VyY2UgaW5zdGFuY2Ugd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEFTRENfVkVSU0lPTl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEFTREMgdmVyc2lvbiBjYW5ub3QgYmUgZGlzcGxheWVkLicsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MjciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxLWFydGlmYWN0IHVybC9hcnRpZmFjdCBsYWJlbC9hcnRpZmFjdCBkZXNjcmlwdGlvbi9WTkYgU2VydmljZSBJbmRpY2F0b3IKKyAgICBNSVNTSU5HX0RBVEE6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gTWlzc2luZyAlMS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTI4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTI5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMS1hcnRpZmFjdCB1cmwvYXJ0aWZhY3QgbGFiZWwvYXJ0aWZhY3QgZGVzY3JpcHRpb24vYXJ0aWZhY3QgbmFtZQorIyAlMiAtIE1heGltYWwgbGVuZ3RoIG9mICUxCisgICAgRVhDRUVEU19MSU1JVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiAlMSBleGNlZWRzIGxpbWl0IG9mICUyIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUyOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBBUlRJRkFDVF9JTlZBTElEX1RJTUVPVVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgVGltZW91dCBzaG91bGQgYmUgc2V0IHRvIHZhbGlkIHBvc2l0aXZlIG5vbi16ZXJvIG51bWJlciBvZiBtaW51dGVzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgU0VSVklDRV9JU19WTkZfQ0FOTk9UX0JFX0NIQU5HRUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFZORiBJbmRpY2F0b3IgY2Fubm90IGJlIHVwZGF0ZWQgZm9yIGNlcnRpZmllZCBzZXJ2aWNlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzEiCisgICAgfQorICMtLS0tLS0tLS1TVkM0NTMyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX0lOU1RBTkNFX05PVF9GT1VORF9PTl9TRVJWSUNFOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyByZXNvdXJjZSBpbnN0YW5jZSB3YXMgbm90IGZvdW5kIG9uIHRoZSBzZXJ2aWNlICclMi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTMyIgorICAgIH0KKyAjLS0tLS0tLS0tU1ZDNDUzMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAjICUxIC0gICJIRUFUIi8iSEVBVF9FTlYiLyJNVVJBTk9fUEtHIi8iWUFOR19YTUwiIAorICAgIFdST05HX0FSVElGQUNUX0ZJTEVfRVhURU5TSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGZvciAlMSBhcnRpZmFjdCB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzMiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAgIkhFQVQiLyJIRUFUX0VOViIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9ZQU1MOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVcGxvYWRlZCBZQU1MIGZpbGUgZm9yICUxIGFydGlmYWN0IGlzIGludmFsaWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NTM1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSEVBVCIgICAgICAgICAgICAgCisgICAgSU5WQUxJRF9ERVBMT1lNRU5UX0FSVElGQUNUX0hFQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDUzNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDUzNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorIyAlMiAtICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgCisjICUzIC0gICJIRUFUIi8iSEVBVF9FTlYiLyJNVVJBTk9fUEtHIiAKKyMgJTQgLSAgIkhFQVQiLyJIRUFUX0VOViIvIk1VUkFOT19QS0cKKyAgICBERVBMT1lNRU5UX0FSVElGQUNUX09GX1RZUEVfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICclMicgYWxyZWFkeSBoYXMgYSBkZXBsb3ltZW50IGFydGlmYWN0IG9mICUzIHR5cGUgLlBsZWFzZSBkZWxldGUgb3IgdXBkYXRlIGFuIGV4aXN0aW5nICU0IGFydGlmYWN0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzYiCisgICAgfQorCisjLS0tLS0tLS0tU1ZDNDUzNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBNSVNTSU5HX0hFQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1pc3NpbmcgSEVBVCBhcnRpZmFjdC4gSEVBVF9FTlYgYXJ0aWZhY3QgY2Fubm90IGJlIHVwbG9hZGVkIHdpdGhvdXQgY29ycmVzcG9uZGluZyBIRUFUIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1MzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTUlTTUFUQ0hfSEVBVF9WU19IRUFUX0VOVjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBhcnRpZmFjdCBjb250ZW50LiBQYXJhbWV0ZXIncyBzZXQgaW4gSEVBVF9FTlYgJyUxJyBhcnRpZmFjdCBkb2Vzbid0IG1hdGNoIHRoZSBwYXJhbWV0ZXJzIGluIEhFQVQgJyUyJyBhcnRpZmFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTM4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTM5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfUkVTT1VSQ0VfUEFZTE9BRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBwYXlsb2FkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1MzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9UT1NDQV9GSUxFX0VYVEVOU0lPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBmaWxlIGV4dGVuc2lvbiBmb3IgVE9TQ0EgdGVtcGxhdGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1lBTUxfRklMRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBZQU1MIGZpbGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1RPU0NBX1RFTVBMQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIFRPU0NBIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTk9UX1JFU09VUkNFX1RPU0NBX1RFTVBMQVRFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBTZXJ2aWNlIFRPU0NBIHRlbXBsYXRlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgTk9UX1NJTkdMRV9SRVNPVVJDRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgVE9TQ0EgdGVtcGxhdGUgc2hvdWxkIGNvbnRhaW4gb25lIHJlc291cmNlIGRlZmluaXRpb24uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1JFU09VUkNFX05BTUVTUEFDRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBuYW1lc3BhY2UuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU0NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU0Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBSRVNPVVJDRV9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW1wb3J0ZWQgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gQVNEQyBDYXRhbG9nLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NDYiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgSU5WQUxJRF9SRVNPVVJDRV9DSEVDS1NVTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCByZXNvdXJjZSBjaGVja3N1bS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTQ5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTUwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICMlMcKgIC3CoCBDb25zdW1lciBzYWx0CisgICAgSU5WQUxJRF9MRU5HVEg6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgbGVuZ3RoLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTAiCisgICAgfQorICAgICMtLS0tLS0tLS1TVkM0NTUxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICAjJTHCoCAtwqAgRUNPTVAgVXNlciBuYW1lCisgICAgRUNPTVBfVVNFUl9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEVDT01QIFVzZXIgJyUxJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NTEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NTItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDT05TVU1FUl9BTFJFQURZX0VYSVNUUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRUNPTVAgVXNlciBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTUyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTUzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjJTHCoCAtwqAgQ29uc3VtZXIgbmFtZSAvIENvbnN1bWVyIHBhc3N3b3JkLyBDb25zdW1lciBzYWx0IAorICAgIElOVkFMSURfQ09OVEVOVF9QQVJBTTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTUzIgorICAgIH0KKyAgICAjLS0tLS0tLS0tU1ZDNDU1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorICAgIENPTVBPTkVOVF9BUlRJRkFDVF9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCBhcnRpZmFjdCBkb2Vzbid0IGJlbG9uZyB0byBzcGVjaWZpZWQgJTEuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJTZXJ2aWNlIG5hbWUiCisgICAgU0VSVklDRV9ERVBMT1lNRU5UX0FSVElGQUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgc2VydmljZSBpcyBub3QgcmVhZHkgZm9yIGNlcnRpZmljYXRpb24uIFNlcnZpY2UgaGFzIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGRlcGxveW1lbnQgYXJ0aWZhY3QuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IgorICAgIENPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9MRU5HVEg6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgJTIgbmFtZSBsZW5ndGguIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IgorICAgIENPTVBPTkVOVF9FTEVNRU5UX0lOVkFMSURfTkFNRV9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgJTEgJTIgbmFtZSBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiLyJQcm9kdWN0IgorIyUyIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0NBVEVHT1JZX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBjYXRlZ29yeSBuYW1lICclMicgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU1NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU1OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJzZXJ2aWNlIi8iVkYiCisjICUyIC0gIlJlc291cmNlIG5hbWUiCisgICAgVkFMSURBVEVEX1JFU09VUkNFX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTU5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBGT1VORF9BTFJFQURZX1ZBTElEQVRFRF9SRVNPVVJDRTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogU3VibWl0IGZvciBUZXN0aW5nIGlzIG5vdCBwZXJtaXR0ZWQgYXMgeW91ciAnJTEnIGluY2x1ZGVzIG5vbi12YWxpZGF0ZWQgJyUyJyByZXNvdXJjZS4gUGxlYXNlIHVzZSBhbHJlYWR5IGF2YWlsYWJsZSB2YWxpZGF0ZWQgcmVzb3VyY2UgdmVyc2lvbi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTU5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTYwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInNlcnZpY2UiLyJWRiIKKyMgJTIgLSAiUmVzb3VyY2UgbmFtZSIKKyAgICBGT1VORF9MSVNUX1ZBTElEQVRFRF9SRVNPVVJDRVM6IHsKKyAgICAgICAgY29kZTogNDAzLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFN1Ym1pdCBmb3IgVGVzdGluZyBpcyBub3QgcGVybWl0dGVkIGFzIHlvdXIgJyUxJyBpbmNsdWRlcyBub24tdmFsaWRhdGVkICclMicgcmVzb3VyY2UuIFBsZWFzZSB1c2Ugb25lIG9mIGF2YWlsYWJsZSB2YWxpZGF0ZWQgcmVzb3VyY2UgdmVyc2lvbnMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2MCIKKyAgICB9ICAKKyMtLS0tLS0tLS1TVkM0NTYxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gInJlc291cmNlIi8icHJvZHVjdCIKKyMgJTIgLSAiY2F0ZWdvcnkiCisjICUzIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0NBVEVHT1JZX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICUxICUyICclMycgd2FzIG5vdCBmb3VuZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTYxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTYyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gIlJlc291cmNlIi8iUHJvZHVjdCIKKyMgJTIgLSAic3ViLWNhdGVnb3J5IG5hbWUiCisjICUzIC0gImNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX1NVQl9DQVRFR09SWV9FWElTVFNfRk9SX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBzdWItY2F0ZWdvcnkgJyUyJyBhbHJlYWR5IGV4aXN0cyB1bmRlciAnJTMnIGNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiUHJvZHVjdCIKKyMgJTIgLSAiZ3JvdXBpbmcgbmFtZSIKKyMgJTMgLSAic3ViLWNhdGVnb3J5IG5hbWUiCisgICAgQ09NUE9ORU5UX0dST1VQSU5HX0VYSVNUU19GT1JfU1VCX0NBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBncm91cGluZyAnJTInIGFscmVhZHkgZXhpc3RzIHVuZGVyICclMycgc3ViLWNhdGVnb3J5LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIHByb2R1Y3TCoG5hbWUKKyAgICBQUk9EVUNUX05PVF9GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUmVxdWVzdGVkICclMScgcHJvZHVjdCB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1NjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gIkhFQVQiICAgCisjICUyICAtIHBhcmFtZXRlciB0eXBlICgic3RyaW5nIiAsICJib29sZWFuIiAsICJudW1iZXIiKSAKKyMgJTMgLSAgcGFyYW1ldGVyIG5hbWUKKyAgICBJTlZBTElEX0hFQVRfUEFSQU1FVEVSX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkICUxIGFydGlmYWN0LiBJbnZhbGlkICUyIHZhbHVlIHNldCBmb3IgJyUzJyBwYXJhbWV0ZXIuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU2NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU2Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiSEVBVCIgICAKKyMgJTIgIC0gcGFyYW1ldGVyIHR5cGUgKCJzdHJpbmciICwgImJvb2xlYW4iICwgIm51bWJlciIpIAorICAgIElOVkFMSURfSEVBVF9QQVJBTUVURVJfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCAlMSBhcnRpZmFjdC4gVW5zdXBwb3J0ZWQgJyUyJyBwYXJhbWV0ZXIgdHlwZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY2IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiWUFOR19YTUwiICAgICAgICAgICAgIAorICAgIElOVkFMSURfWE1MOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBVcGxvYWRlZCBYTUwgZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJVc2VyIE5hbWUgYW5kIHVzZXJJZCIgICAKKyMgJTIgIC0iY2hlY2tlZC1vdXQiLyJpbi1jZXJ0aWZpY2F0aW9uIgorICAgIENBTk5PVF9ERUxFVEVfVVNFUl9XSVRIX0FDVElWRV9FTEVNRU5UUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVXNlciBjYW5ub3QgYmUgZGVsZXRlZC4gVXNlciAnJTEnIGhhcyAlMiBwcm9qZWN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTY4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJVc2VyIE5hbWUgYW5kIHVzZXJJZCIgICAKKyMgJTIgIC0iY2hlY2tlZC1vdXQiLyJpbi1jZXJ0aWZpY2F0aW9uIgorICAgIENBTk5PVF9VUERBVEVfVVNFUl9XSVRIX0FDVElWRV9FTEVNRU5UUzogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogUm9sZSBjYW5ub3QgYmUgY2hhbmdlZC4gVXNlciAnJTEnIGhhcyAlMiBwcm9qZWN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTY4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFVQREFURV9VU0VSX0FETUlOX0NPTkZMSUNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBBbiBhZG1pbmlzdHJhdG9yIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBoaXMvaGVyIHJvbGUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3MCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3MS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBTRVJWSUNFX0NBTk5PVF9DT05UQUlOX1NVQkNBVEVHT1JZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBTdWIgY2F0ZWdvcnkgY2Fubm90IGJlIGRlZmluZWQgZm9yIHNlcnZpY2UiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTcyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICJSZXNvdXJjZSIvIlNlcnZpY2UiCisgICAgQ09NUE9ORU5UX1RPT19NVUNIX0NBVEVHT1JJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIG11c3QgaGF2ZSBvbmx5IDEgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTcyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTc0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIFJFU09VUkNFX1RPT19NVUNIX1NVQkNBVEVHT1JJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlc291cmNlIG11c3QgaGF2ZSBvbmx5IDEgc3ViIGNhdGVnb3J5IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBDT01QT05FTlRfTUlTU0lOR19TVUJDQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogTWlzc2luZyBzdWIgY2F0ZWdvcnkiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTc1IgorICAgIH0KKyAjLS0tLS0tLS0tU1ZDNDU3Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiY29tcG9uZW50IHR5cGUiCisgICAgVU5TVVBQT1JURURfRVJST1I6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgOiBSZXF1ZXN0ZWQgY29tcG9uZW50IHR5cGUgJTEgaXMgdW5zdXBwb3J0ZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NiIKKyAgICB9CisgICAgIy0tLS0tLS0tLVNWQzQ1NzctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gInJlc291cmNlIHR5cGUiCisgICAgUkVTT1VSQ0VfQ0FOTk9UX0NPTlRBSU5fUkVTT1VSQ0VfSU5TVEFOQ0VTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yIDogUmVzb3VyY2Ugb2YgdHlwZSAlMSBjYW5ub3QgY29udGFpbiByZXNvdXJjZSBpbnN0YW5jZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3NyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3OC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiUmVzb3VyY2UiLyJTZXJ2aWNlIgorIyAlMiAtICByZXNvdXJjZS9zZXJ2aWNlIG5hbWUgCisjICUzIC0gICJhcnRpZmFjdCBuYW1lIiAKKyAgICBERVBMT1lNRU5UX0FSVElGQUNUX05BTUVfQUxSRUFEWV9FWElTVFM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICclMicgYWxyZWFkeSBoYXMgYSBkZXBsb3ltZW50IGFydGlmYWN0IG5hbWVkICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU3OCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU3OS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgLSAiQ2F0ZWdvcnkiLyJTdWItQ2F0ZWdvcnkiLyJHcm91cCIKKyMgJTIgLSAgY2F0ZWdvcnkvc3ViLWNhdGVnb3J5L2dyb3VwaW5nIG5hbWUuCisgICAgSU5WQUxJRF9HUk9VUF9BU1NPQ0lBVElPTjogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBncm91cCBhc3NvY2lhdGlvbi4gJTEgJyUyJyB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1NzkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgRU1QVFlfUFJPRFVDVF9DT05UQUNUU19MSVNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIEF0IGxlYXN0IG9uZSBQcm9kdWN0IENvbnRhY3QgaGFzIHRvIGJlIHNwZWNpZmllZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTgxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIHVzZXJJZAorICAgIElOVkFMSURfUFJPRFVDVF9DT05UQUNUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGNvbnRlbnQuIFVzZXIgJyUxJyBjYW5ub3QgYmUgc2V0IGFzIFByb2R1Y3QgQ29udGFjdC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTgxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTgyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtIFByb2R1Y3QKKyMgJTIgLSAiYWJicmV2aWF0ZWQiLyJmdWxsIgorICAgIE1JU1NJTkdfT05FX09GX0NPTVBPTkVOVF9OQU1FUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBjb250ZW50LiBNaXNzaW5nICUxICUyIG5hbWUuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4MiIKKyAgICB9ICAgIAorIy0tLS0tLS0tLVNWQzQ1ODMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiSWNvbiIKKyMgJTIgLSAicmVzb3VyY2UiLyJzZXJ2aWNlIi8icHJvZHVjdCIKKyAgICBDT01QT05FTlRfUEFSQU1FVEVSX0NBTk5PVF9CRV9DSEFOR0VEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiAlMSBjYW5ub3QgYmUgY2hhbmdlZCBvbmNlIHRoZSAlMiBpcyBjZXJ0aWZpZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAgLSBzZXJ2aWNlL1ZGIG5hbWUgCisjICUyIC0gInNlcnZpY2UiIC8iVkYiCisjICUzIC0gIHJlc291cmNlIGluc3RhbmNlIG9yaWdpbiB0eXBlCisjICU0IC0gIHJlc291cmNlIGluc3RhbmNlIG5hbWUgCisjICU1IC0gIHJlcXVpcmVtZW50L2NhcGFiaWxpdHkKKyMgJTYgLSAgcmVxdWlyZW1lbnQvY2FwYWJpbGl0eSBuYW1lCisjICU3IC0gICJmdWxmaWxsZWQiIChmb3IgcmVxKS8iY29uc3VtZWQgKGZvciBjYXApIgorICAgIFJFUV9DQVBfTk9UX1NBVElTRklFRF9CRUZPUkVfQ0VSVElGSUNBVElPTjogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogIFJlcXVlc3RlZCAnJTEnICUyIGlzIG5vdCByZWFkeSBmb3IgY2VydGlmaWNhdGlvbi4gICUzICclNCcgaGFzIHRvIGhhdmUgJTUgJyU2JyAlNy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIElOVkFMSURfT0NDVVJSRU5DRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgb2NjdXJyZW5jZXMgZm9ybWF0LiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1ODUiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1ODYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjLS0tLS0tLS0tU1ZDNDU4Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBJTlZBTElEX1NFUlZJQ0VfQVBJX1VSTDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICdFcnJvcjogSW52YWxpZCBTZXJ2aWNlIEFQSSBVUkwuIFBsZWFzZSBjaGVjayB3aGV0aGVyIHlvdXIgVVJMIGhhcyBhIHZhbGlkIGRvbWFpbiBleHRlbnNpb24gYW5kIGRvZXMgbm90IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIC0gIz8mQCUrOyw9JDw+fl5gXFtde318IiohJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU4NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU4Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUgCisgICAgREFUQV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IERhdGEgdHlwZSAlMSBhbHJlYWR5IGV4aXN0cy4nLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg3IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfTk9SX1BST1BFUlRJRVNfTkVJVEhFUl9ERVJJVkVEX0ZST006IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEludmFsaWQgRGF0YSB0eXBlICUxLiBEYXRhIHR5cGUgbXVzdCBoYXZlIGVpdGhlciBhIHZhbGlkIGRlcml2ZWQgZnJvbSBkZWNsYXJhdGlvbiBvciBhdCBsZWFzdCBvbmUgdmFsaWQgcHJvcGVydHknLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTg5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZSAKKyAgICBEQVRBX1RZUEVfUFJPUEVSVElFU19DQU5OT1RfQkVfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgRGF0YSB0eXBlICUxLiAncHJvcGVydGllcycgcGFyYW1ldGVyIGNhbm5vdCBiZSBlbXB0eSBpZiBwcm92aWRlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTg5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBQcm9wZXJ0eSB0eXBlIG5hbWUgCisjICUyICAtIFByb3BlcnR5IG5hbWUKKyAgICBJTlZBTElEX1BST1BFUlRZX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgUHJvcGVydHkgdHlwZSAlMSBpbiBwcm9wZXJ0eSAlMi4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTkwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTkxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBQcm9wZXJ0eSBpbm5lciB0eXBlCisjICUyICAtIFByb3BlcnR5IG5hbWUgCisgICAgSU5WQUxJRF9QUk9QRVJUWV9JTk5FUl9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIHByb3BlcnR5IGlubmVyIHR5cGUgJTEsIGluIHByb3BlcnR5ICUyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Mi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gY29tcG9uZW50IGluc3RhbmNlIG5hbWUKKyMgJTIgIC0gInJlc291cmNlIGluc3RhbmNlIi8ic2VydmljZSBpbnN0YW5jZSIKKyAgICBDT01QT05FTlRfSU5TVEFOQ0VfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwNCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXF1ZXN0ZWQgJyUxJyAlMiB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTIiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxIC0gY29tcG9uZW50IGluc3RhbmNlIG5hbWUKKyMgJTIgLSAicmVzb3VyY2UgaW5zdGFuY2UiLyJzZXJ2aWNlIGluc3RhbmNlIgorIyAlMyAtICJyZXNvdXJjZS8ic2VydmljZSIvInByb2R1Y3QiCisjICU0IC0gY29udGFpbmVyIG5hbWUgCisgICAgQ09NUE9ORU5UX0lOU1RBTkNFX05PVF9GT1VORF9PTl9DT05UQUlORVI6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnICUyIHdhcyBub3QgZm91bmQgb24gdGhlICUzICclNCcuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxIC0gcmVxdWlyZW1lbnQgLyBjYXBhYmlsaXR5CisjJTIgLSByZXF1aXJlbWVudCBuYW1lCisgICAgSU1QT1JUX0RVUExJQ0FURV9SRVFfQ0FQX05BTUU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEltcG9ydGVkIFRPU0NBIHRlbXBsYXRlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgJTEgbmFtZWQgJyUyJy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk0IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTEgLSByZXF1aXJlbWVudCAvIGNhcGFiaWxpdHkKKyMlMiAtIHJlcXVpcmVtZW50IG5hbWUKKyMlMyAtIHBhcmVudCBjb250YWluaW5nIHRoZSByZXF1aXJlbWVudCAKKyAgICBJTVBPUlRfUkVRX0NBUF9OQU1FX0VYSVNUU19JTl9ERVJJVkVEOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbXBvcnRlZCBUT1NDQSB0ZW1wbGF0ZSBjb250YWlucyAlMSAnJTInIHRoYXQgaXMgYWxyZWFkeSBkZWZpbmVkIGJ5IGRlcml2ZWQgdGVtcGxhdGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfREVSSVZFRF9JU19NSVNTSU5HOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBhbmNlc3RvciBkYXRhIHR5cGUgJTEgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzeXN0ZW0uIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDU5NiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDU5Ny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gRGF0YSB0eXBlIG5hbWUKKyMgJTIgIC0gUHJvcGVydHkgbmFtZXMKKyAgICBEQVRBX1RZUEVfUFJPUEVSVFlfQUxSRUFEWV9ERUZJTkVEX0lOX0FOQ0VTVE9SOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgcHJvcGVydGllcyBuYW1lZCAlMiB3aGljaCBhcmUgYWxyZWFkeSBkZWZpbmVkIGluIG9uZSBvZiBpdHMgYW5jZXN0b3JzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ1OTgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisgICAgREFUQV9UWVBFX0RVUExJQ0FURV9QUk9QRVJUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZGF0YSB0eXBlICUxIGNvbnRhaW5zIGR1cGxpY2F0ZSBwcm9wZXJ0eS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NTk4IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NTk5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAgLSBEYXRhIHR5cGUgbmFtZQorIyAlMiAgLSBQcm9wZXJ0eSBuYW1lcworICAgIERBVEFfVFlQRV9QUk9FUFJUWV9DQU5OT1RfSEFWRV9TQU1FX1RZUEVfT0ZfREFUQV9UWVBFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFRoZSBkYXRhIHR5cGUgJTEgY29udGFpbnMgcHJvcGVydGllcyAlMiB3aGljaCB0aGVpciB0eXBlIGlzIHRoaXMgZGF0YSB0eXBlLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ1OTkiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIERhdGEgdHlwZSBuYW1lCisgICAgREFUQV9UWVBFX0NBTk5PVF9IQVZFX1BST1BFUlRJRVM6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gVGhlIGRhdGEgdHlwZSAlMSBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzIHNpbmNlIGl0IGlzIG9mIHR5cGUgc2NhbGFyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICBOT1RfVE9QT0xPR1lfVE9TQ0FfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIHlhbWwgZmlsZSAlMSBjYW5ub3QgYmUgbW9kZWxlZCB0byBWRiBhcyBpdCBkb2VzIG5vdCBjb250YWluICd0b3BvbG9neV90ZW1wbGF0ZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjAxIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjAyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSB5YW1sIGZpbGUgbmFtZQorIyAlMiAtIG5vZGVfdGVtcGxhdGUgbGFiZWwKKyMgJTMgLSBub2RlX3RlbXBsYXRlIHR5cGUKKyAgICBJTlZBTElEX05PREVfVEVNUExBVEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIHlhbWwgZmlsZSAnJTEnIGNvbnRhaW5zIG5vZGVfdGVtcGxhdGUgJyUyJyBvZiB0eXBlICclMycgdGhhdCBkb2VzIG5vdCByZXByZXNlbnQgZXhpc3RpbmcgVkZDL0NQL1ZMIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjb21wb25lbnQgdHlwZQorIyAlMsKgLSBjb21wb25lbnTCoG5hbWUKKyMgJTPCoC0gc3RhdGUKKyAgICBJTExFR0FMX0NPTVBPTkVOVF9TVEFURTogeworICAgICAgICBjb2RlOiA0MDMsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogQ29tcG9uZW50IGluc3RhbmNlIG9mICUxIGNhbiBub3QgYmUgY3JlYXRlZCBiZWNhdXNlIHRoZSBjb21wb25lbnQgJyUyJyBpcyBpbiBhbiBpbGxlZ2FsIHN0YXRlICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyAgICBDU0FSX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFRPU0NBIENTQVIgJyUxJyBpcyBpbnZhbGlkLiAnVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YScgZmlsZSBtdXN0IGJlIHByb3ZpZGVkLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgY3NhciBmaWxlIG5hbWUKKyAgICBDU0FSX0lOVkFMSURfRk9STUFUOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUT1NDQSBDU0FSICclMScgaXMgaW52YWxpZC4gSW52YWxpZCAnVE9TQ0EtTWV0YWRhdGEvVG9zY2EubWV0YScgZmlsZSBmb3JtYXQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBwcm9wZXJ0eSBuYW1lCisjICUywqAtIHByb3BlcnR5IHR5cGUKKyMgJTMgLSBwcm9wZXJ0eSBpbm5lclR5cGUKKyMgJTTCoC0gZGVmYXVsdCB2YWx1ZSBpcworICAgIElOVkFMSURfQ09NUExFWF9ERUZBVUxUX1ZBTFVFOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgb2YgcHJvcGVydHkgJTEuIERhdGEgdHlwZSBpcyAlMiB3aXRoIGlubmVyIHR5cGUgJTMgYW5kIGRlZmF1bHQgdmFsdWUgZm91bmQgaXMgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYwNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIENTQVJfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUT1NDQSBDU0FSICclMScgaXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MDciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBjb21wb25lbnQgdHlwZQorIyAlMyAtIGFjdHVhbCBjb21wb25lbnQgdHlwZQorICAgIE1JU01BVENIX0JFVFdFRU5fQVJUSUZBQ1RfVFlQRV9BTkRfQ09NUE9ORU5UX1RZUEU6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICUxIGlzIG9ubHkgY29tcGF0aWJsZSB3aXRoIGNvbXBvbmVudCBvZiB0eXBlICUyLCBidXQgY29tcG9uZW50IHR5cGUgaXMgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYwOCIKKyAgICB9CisKKyMtLS0tLS0tLS1TVkM0NjA5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIyAlMSAtICAiSU5WQUxJRF9KU09OIiAgICAgICAgICAgICAKKyAgICBJTlZBTElEX0pTT046IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFVwbG9hZGVkIEpTT04gZmlsZSBmb3IgJTEgYXJ0aWZhY3QgaXMgaW52YWxpZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjA5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjEwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGNzYXIgZmlsZSBuYW1lCisjICUywqAtwqBtaXNzaW5nIGZpbGUgbmFtZQorICAgIFlBTUxfTk9UX0ZPVU5EX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3IgLSBUT1NDQSBDU0FSICUxIGlzIGludmFsaWQuIFRPU0NBLU1ldGFkYXRhL1Rvc2NhLm1ldGEgcmVmZXJzIHRvIGZpbGUgJTIgdGhhdCBpcyBub3QgcHJvdmlkZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gZ3JvdXAgbmFtZQorICAgIEdST1VQX01FTUJFUl9FTVBUWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBHcm91cCAlMSBtZW1iZXIgbGlzdCB3YXMgcHJvdmlkZWQgYnV0IGRvZXMgbm90IGhhdmUgdmFsdWVzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTEgIC0gZ3JvdXAgbmFtZSAKKyAgICBHUk9VUF9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IEdyb3VwIHR5cGUgJTEgYWxyZWFkeSBleGlzdHMuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cCBuYW1lCisjICUywqAtIFZGIG5hbWUoY29tcG9uZW50IG5hbWUpCisjICUzIC0gYWN0dWFsIGNvbXBvbmVudCB0eXBlIFtWRl0KKyAgICBHUk9VUF9BTFJFQURZX0VYSVNUOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBHcm91cCB3aXRoIG5hbWUgJyUxJyBhbHJlYWR5IGV4aXN0cyBpbiAlMiAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjEzIgorICAgIH0gICAKKyMtLS0tLS0tLS1TVkM0NjE0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgJTHCoC3CoGdyb3VwIHR5cGUKKyAgICBHUk9VUF9UWVBFX0lTX0lOVkFMSUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgY29udGVudC4gR3JvdXAgdHlwZSAlMSBkb2VzIG5vdCBleGlzdCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXAgbmFtZQorICAgIEdST1VQX01JU1NJTkdfR1JPVVBfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBNaXNzaW5nIEdyb3VwIFR5cGUgZm9yIGdyb3VwICclMSciLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWVtYmVyIG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gVkYgbmFtZQorIyAlNCAtIGNvbXBvbmVudCB0eXBlIFtWRiBdCisgICAgR1JPVVBfSU5WQUxJRF9DT01QT05FTlRfSU5TVEFOQ0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IE1lbWJlciAnJTEnIGxpc3RlZCBpbiBncm91cCAnJTInIGlzIG5vdCBwYXJ0IG9mICclMycgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNiIKKyAgICB9ICAgICAgICAgICAgICAgICAKKyMtLS0tLS0tLS1TVkM0NjE3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gbWVtYmVyIG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gZ3JvdXAgdHlwZQorICAgIEdST1VQX0lOVkFMSURfVE9TQ0FfTkFNRV9PRl9DT01QT05FTlRfSU5TVEFOQ0U6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IG1lbWJlciAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IHBhcnQgb2YgYWxsb3dlZCBtZW1iZXJzIG9mIGdyb3VwIHR5cGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYxNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYxOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC3CoG1pc3NpbmcgZmlsZSBuYW1lCisjICUywqAtwqBjc2FyIGZpbGUgbmFtZQorICAgIEFSVElGQUNUX05PVF9GT1VORF9JTl9DU0FSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBhcnRpZmFjdCAlMSBpcyBkZWZpbmVkIGluIENTQVIgJTIgbWFuaWZlc3QgYnV0IGlzIG5vdCBwcm92aWRlZCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MTgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MTktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIGFydGlmYWN0IG5hbWUKKyMgJTLCoC3CoGFydGlmYWN0IHR5cGUKKyMgJTMgLSBleGlzdGluZyBhcnRpZmFjdCB0eXBlCisgICAgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX0RJRkZFUkVOVF9UWVBFX0lOX0NTQVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGluIHR5cGUgJTIgYWxyZWFkeSBleGlzdHMgaW4gdHlwZSAlMy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjE5IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjIwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgIEZBSUxFRF9SRVRSSVZFX0FSVElGQUNUU19UWVBFUzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogRmFpbGVkIHRvIHJldHJpZXZlIGxpc3Qgb2Ygc3Vwb3J0ZWQgYXJ0aWZhY3QgdHlwZXMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBtYXN0ZXIgCisgICAgQVJUSUZBQ1RfQUxSQURZX0VYSVNUX0lOX01BU1RFUl9JTl9DU0FSOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBhcnRpZmFjdCAlMSBhbHJlYWR5IGV4aXN0cyBpbiBtYXN0ZXIgJTIgLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxwqAtIGFydGlmYWN0IG5hbWUKKyMgJTLCoC0gYXJ0aWZhY3QgdHlwZSAKKyMgJTPCoC0gbWFzdGVyIG5hbWUKKyMgJTQgLSBtYXN0ZXIgdHlwZQorICAgIEFSVElGQUNUX05PVF9WQUxJRF9JTl9NQVNURVI6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IGFydGlmYWN0ICUxIGluIHR5cGUgJTIgY2FuIG5vdCBiZSBleGlzdHMgdW5kZXIgbWFzdGVyICUzIGluIHR5cGUgJTQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyMiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyMgJTHCoC0gYXJ0aWZhY3QgbmFtZQorIyAlMsKgLSBhcnRpZmFjdCB0eXBlIAorIyAlM8KgLSBlbnYgbmFtZQorIyAlNCAtIGV4aXN0aW5nIGVudgorICAgIEFSVElGQUNUX05PVF9WQUxJRF9FTlY6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEFydGlmYWN0ICUxIGluIHR5cGUgJTIgd2l0aCBlbnYgJTMgYWxyZWFkeSBleGlzdHMgd2l0aCBhbm90aGVyIGVudiAlNCIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjMiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXBzIG5hbWVzCisjICUyIC0gVkYgbmFtZQorIyAlMyAtIGNvbXBvbmVudCB0eXBlIFtWRiBdCisgICAgR1JPVVBfSVNfTUlTU0lORzogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBUaGUgZ3JvdXBzICclMScgY2Fubm90IGJlIGZvdW5kIHVuZGVyICUyICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMcKgLcKgZ3JvdXBzIG5hbWUKKyAgICBHUk9VUF9BUlRJRkFDVF9BTFJFQURZX0FTU09DSUFURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGdyb3VwICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxwqAtwqBncm91cHMgbmFtZQorICAgIEdST1VQX0FSVElGQUNUX0FMUkVBRFlfRElTU09DSUFURUQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEludmFsaWQgQ29udGVudC4gQXJ0aWZhY3QgYWxyZWFkeSBkaXNzb2NpYXRlZCBmcm9tIGdyb3VwICclMScuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIHByb3BlcnR5IG5hbWUKKyMgJTIgLSBncm91cCBuYW1lCisjICUzIC0gZ3JvdXAgdHlwZSBuYW1lCisgICAgR1JPVVBfUFJPUEVSVFlfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBwcm9wZXJ0eSAlMSBsaXN0ZWQgaW4gZ3JvdXAgJTIgaXMgbm90IGV4aXN0IGluIGdyb3VwIHR5cGUgJTMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyNyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYyOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gY3NhclVVSUQKKyMgJTIgLSBWRiBuYW1lCisgICAgVlNQX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBUaGUgVlNQIHdpdGggVVVJRCAlMSB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmb3IgVkYgJTIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBvciB1cGRhdGUgdGhlIGV4aXN0aW5nIFZGLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MjgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MjktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyAlMSAtIFZGIG5hbWUKKyAgICBNSVNTSU5HX0NTQVJfVVVJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIENzYXIgVVVJRCBvciBwYXlsb2FkIG5hbWUgaXMgbWlzc2luZyBmb3IgVkYgJTEuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYyOSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjICUxIC0gVkYgbmFtZQorIyAlMiAtIG5ldyBjc2FyVVVJRAorIyAlMyAtIG9sZCBjc2FyVVVJRAorICAgIFJFU09VUkNFX0xJTktFRF9UT19ESUZGRVJFTlRfVlNQOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBSZXNvdXJjZSAlMSBjYW5ub3QgYmUgdXBkYXRlZCB1c2luZyBDc2FyVVVJRCAlMiBzaW5jZSB0aGUgcmVzb3VyY2UgaXMgbGlua2VkIHRvIGEgZGlmZmVyZW50IFZTUCB3aXRoIGNzYXJVVUlEICUzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzAiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjICUxICAtIHBvbGljeSBuYW1lIAorICAgIFBPTElDWV9UWVBFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFBvbGljeSB0eXBlICUxIGFscmVhZHkgZXhpc3RzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSB0YXJnZXQgbmFtZQorIyAlMiAtIHBvbGljeSB0eXBlIG5hbWUKKyAgICBUQVJHRVRTX05PTl9WQUxJRDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogdGFyZ2V0ICUxIGxpc3RlZCBpbiBwb2xpY3kgdHlwZSAlMiBpcyBub3QgYSBncm91cCBvciByZXNvdXJjZS4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjMyIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjMzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gcG9saWN5IG5hbWUKKyAgICBUQVJHRVRTX0VNUFRZOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIENvbnRlbnQuIFBvbGljeSAlMSB0YXJnZXQgbGlzdCB3YXMgcHJvdmlkZWQgYnV0IGRvZXMgbm90IGhhdmUgdmFsdWVzIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzMyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDYzNC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIERBVEFfVFlQRV9DQU5OT1RfQkVfRU1QVFk6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IERhdGEgdHlwZXMgYXJlIGVtcHR5LiBQbGVhc2UgaW1wb3J0IHRoZSBkYXRhIHR5cGVzLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzQiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2MzUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSBjc2FyIHV1aWQKKyAgICBSRVNPVVJDRV9GUk9NX0NTQVJfTk9UX0ZPVU5EOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiByZXNvdXJjZSBmcm9tIGNzYXIgdXVpZCAlMSBub3QgZm91bmQiLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjM1IgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjM2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICUxIC0gRGF0YSB0eXBlIG5hbWUKKyAgICBEQVRBX1RZUEVfQ0FOTk9UX0JFX1VQREFURURfQkFEX1JFUVVFU1Q6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAnRXJyb3I6IERhdGEgdHlwZSAlMSBjYW5ub3QgYmUgdXBncmFkZWQuIFRoZSBuZXcgZGF0YSB0eXBlIGRvZXMgbm90IGNvbnRhaW4gb2xkIHByb3BlcnRpZXMgb3IgdGhlIHR5cGUgb2Ygb25lIG9mIHRoZSBwcm9wZXJ0aWVzIGhhcyBiZWVuIGNoYW5nZWQuJywKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzNiIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0NjM3LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoGF0dHJpYnV0ZcKgbmFtZQorICAgIEFUVFJJQlVURV9OT1RfRk9VTkQ6IHsKKyAgICAgICAgY29kZTogNDA0LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IFJlcXVlc3RlZCAnJTEnIGF0dHJpYnV0ZSB3YXMgbm90IGZvdW5kLiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2MzciCisgICAgfSAgICAKKyMtLS0tLS0tLS0tLVNWQzQ2MzgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgYXR0cmlidXRlwqBuYW1lCisgICAgQVRUUklCVVRFX0FMUkVBRFlfRVhJU1Q6IHsKKyAgICAgICAgY29kZTogNDA5LAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6IEF0dHJpYnV0ZSB3aXRoICclMScgbmFtZSBhbHJlYWR5IGV4aXN0cy4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjM4IgorICAgIH0KKyMtLS0tLS0tLS0tLVNWQzQ2MzktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgcHJvcGVydHnCoG5hbWUKKyAgICBQUk9QRVJUWV9OQU1FX0FMUkVBRFlfRVhJU1RTOiB7CisgICAgICAgIGNvZGU6IDQwOSwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBQcm9wZXJ0eSB3aXRoICclMScgbmFtZSBhbmQgZGlmZmVyZW50IHR5cGUgYWxyZWFkeSBleGlzdHMuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDYzOSIKKyAgICB9CisjLS0tLS0tLS0tLS1TVkM0NjQwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjJTHCoC3CoHByb3BlcnR5wqBuYW1lCisgICAgSU5WQUxJRF9QUk9QRVJUWTogeworICAgICAgICBjb2RlOiA0MDksCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBwcm9wZXJ0eSByZWNlaXZlZC4iLAorICAgICAgICBtZXNzYWdlSWQ6ICJTVkM0NjQwIgorICAgIH0KKyMtLS0tLS0tLS1TVkM0NjQxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMlMcKgLcKgaW52YWxpZCBmaWx0ZXIKKyMlMsKgLcKgdmFsaWQgZmlsdGVycworICAgIElOVkFMSURfRklMVEVSX0tFWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIGZpbHRlciAlMSBpcyBub3QgYXBwbGljYWJsZS4gUGxlYXNlIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmaWx0ZXJzOiAlMiIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDEiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2NDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyUxwqAtwqBhc3NldCB0eXBlCisjJTLCoC3CoGZpbHRlcgorICAgIE5PX0FTU0VUU19GT1VORDogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJObyAlMSB3ZXJlIGZvdW5kIHRvIG1hdGNoIGNyaXRlcmlhICUyIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0MiIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0My0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJSZXNvdXJjZSIvIlByb2R1Y3QiCisjICUyIC0gInN1Yi1jYXRlZ29yeSBuYW1lIgorIyAlMyAtICJjYXRlZ29yeSBuYW1lIgorICAgIENPTVBPTkVOVF9TVUJfQ0FURUdPUllfTk9UX0ZPVU5EX0ZPUl9DQVRFR09SWTogeworICAgICAgICBjb2RlOiA0MDQsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogJTEgc3ViLWNhdGVnb3J5ICclMicgbm90IGZvdW5kIHVuZGVyIGNhdGVnb3J5ICclMycuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0MyIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0NC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtIEZvcm1hdAorICAgIENPUlJVUFRFRF9GT1JNQVQ6IHsKKyAgICAgICAgY29kZTogNDAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxIGZvcm1hdCBpcyBjb3JydXB0ZWQuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0NCIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJncm91cFR5cGUiCisgICAgSU5WQUxJRF9WRl9NT0RVTEVfVFlQRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBncm91cCB0eXBlICclMScgKHNob3VsZCBiZSBWZk1vZHVsZSkuIiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0NSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY0Ni0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJncm91cE5hbWUiCisgICAgSU5WQUxJRF9WRl9NT0RVTEVfTkFNRTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW52YWxpZCBDb250ZW50LiBWRiBNb2R1bGUgbmFtZSAnJTEnIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDYiCisgICAgfQorICAgIAorIy0tLS0tLS0tLVNWQzQ2NDctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAibW9kaWZpZWROYW1lIgorICAgIElOVkFMSURfVkZfTU9EVUxFX05BTUVfTU9ESUZJQ0FUSU9OOiB7CisgICAgICAgIGNvZGU6IDQwMCwKKyAgICAgICAgbWVzc2FnZTogIkVycm9yOiBJbnZhbGlkIFZGIE1vZHVsZSBuYW1lIG1vZGlmaWNhdGlvbiwgY2FuIG5vdCBtb2RpZnkgJyUxJyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDciCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2NDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiaW5wdXRJZCIKKyMgJTIgLSAiY29tcG9uZW50SWQiCisgICAgSU5QVVRfSVNfTk9UX0NISUxEX09GX0NPTVBPTkVOVDogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogSW5wdXQgaWQ6ICclMScgaXMgbm90IGNoaWxkIG9mIGNvbXBvbmVudCBpZDogJyUyJyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NDgiCisgICAgfQorIy0tLS0tLS0tLVNWQzQ2NDktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJTEgLSAiZ3JvdXBOYW1lIgorICAgIEdST1VQX0hBU19DWUNMSUNfREVQRU5ERU5DWTogeworICAgICAgICBjb2RlOiA0MDAsCisgICAgICAgIG1lc3NhZ2U6ICJFcnJvcjogVGhlIGdyb3VwICclMScgaGFzIGN5Y2xpYyBkZXBlbmRlbmN5IiwKKyAgICAgICAgbWVzc2FnZUlkOiAiU1ZDNDY0OSIKKyAgICB9CisjLS0tLS0tLS0tU1ZDNDY1MC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAlMSAtICJDb21wb25lbnQgVHlwZSIKKyMgJTIgLSA8U2VydmljZU5hbWU+CisjICUzIC0gZXJyb3IgZGVzY3JpcHRpb24KKyAgICBBQUlfQVJUSUZBQ1RfR0VORVJBVElPTl9GQUlMRUQ6IHsKKyAgICAgICAgY29kZTogNTAwLAorICAgICAgICBtZXNzYWdlOiAiRXJyb3I6ICUxICUyIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGFydGlmYWN0cyBmYWlsZWQuIERlc2NyaXB0aW9uOiAlMyIsCisgICAgICAgIG1lc3NhZ2VJZDogIlNWQzQ2NTAiCisgICAgfQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9maWxlcy9kZWZhdWx0L0JFLWxvZ2JhY2sueG1sIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9maWxlcy9kZWZhdWx0L0JFLWxvZ2JhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZGQ0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvQkUtbG9nYmFjay54bWwKQEAgLTAsMCArMSwyMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y29uZmlndXJhdGlvbiBzY2FuPSJ0cnVlIiBzY2FuUGVyaW9kPSI1IHNlY29uZHMiPgorCisgICAgICAgIDxwcm9wZXJ0eSBzY29wZT0ic3lzdGVtIiBuYW1lPSJFQ09NUC1jb21wb25lbnQtbmFtZSIgdmFsdWU9IkFTREMiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBzY29wZT0ic3lzdGVtIiBuYW1lPSJFQ09NUC1zdWJjb21wb25lbnQtbmFtZSIgdmFsdWU9IkFTREMtQkUiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBmaWxlPSIke2NvbmZpZy5ob21lfS9jYXRhbG9nLWJlL2NvbmZpZ3VyYXRpb24ueWFtbCIgLz4KKyAgICAgICAgPHByb3BlcnR5IHNjb3BlPSJjb250ZXh0IiBuYW1lPSJlbmFibGUtYWxsLWxvZyIgdmFsdWU9ImZhbHNlIiAvPgorCisgICAgICAgIDwhLS0gdmFsdWUgdXNlZCBieSBwYXR0ZXJuIGZpZWxkIGxpc3QgKHwgLSBpcyBpbnRlci1maWVsZCBzZXBhcmF0b3IsIHx8IC0gdW5hdmFpbGFibGUgb3Igbm90IGFwcGxpY2FibGUgZmllbGQgdmFsdWUpIChtIC0gbWFuZGF0b3J5LCBvLSBvcHRpb25hbCktLT4KKyAgICAgICAgPCEtLXRpbWVzdGFtcChtKXwgcmVxdWVzdElEKG0pfCBzZXJ2aWNlSW5zdGFuY2VJRChvKXwgdGhyZWFkSUQobSl8IHBoeXNpY2FsU2VydmVyTmFtZShvKXwgc2VydmljZU5hbWUobSl8IHVzZXJJRChtKXwgbG9nTGV2ZWwobSl8IHNldmVyaXR5KG8pfCBzZXJ2ZXJJcEFkZHJlc3MobSl8IHNlcnZlck5hbWUobSl8IGNsaWVudElwQWRkcmVzcyhvKXwgY2xhc3NOYW1lKG0pfCB0aW1lcihvKXwgZGV0YWlsZWRNZXNzYWdlKG8pLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0LWxvZy1wYXR0ZXJuIgorICAgICAgICAgICAgICAgIHZhbHVlPSIlZHt5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWFhYfXwlWHt1dWlkfXwlWHtzZXJ2aWNlSW5zdGFuY2VJRH18JXRocmVhZHx8JHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX18JVh7dXNlcklkfXwlbGV2ZWx8JVh7YWxhcm1TZXZlcml0eX18JVh7bG9jYWxBZGRyfXwke2JlRnFkbn18JVh7cmVtb3RlQWRkcn18JWxvZ2dlcnszNX18JVh7dGltZXJ9fEFjdGl2aXR5VHlwZT0mbHQ7JU0mZ3Q7LCBEZXNjPSZsdDslbXNnJmd0OyVuIiAvPgorCisgICAgICAgIDwhLS0gQWxsIGxvZyAtLT4KKyAgICAgICAgPGlmIGNvbmRpdGlvbj0ncHJvcGVydHkoImVuYWJsZS1hbGwtbG9nIikuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpJz4KKyAgICAgICAgICAgICAgICA8dGhlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRlciBuYW1lPSJBTExfUk9MTElORyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGU+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vYWxsLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvbGxpbmdQb2xpY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLkZpeGVkV2luZG93Um9sbGluZ1BvbGljeSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9hbGwubG9nLiVpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlTmFtZVBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1pbkluZGV4PjE8L21pbkluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhJbmRleD4xMDwvbWF4SW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm9sbGluZ1BvbGljeT4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJpZ2dlcmluZ1BvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuU2l6ZUJhc2VkVHJpZ2dlcmluZ1BvbGljeSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heEZpbGVTaXplPjIwTUI8L21heEZpbGVTaXplPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyaWdnZXJpbmdQb2xpY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPiR7ZGVmYXVsdC1sb2ctcGF0dGVybn08L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwZW5kZXI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRlciBuYW1lPSJBU1lOQ19BTEwiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iQUxMX1JPTExJTkciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcGVuZGVyPgorICAgICAgICAgICAgICAgIDwvdGhlbj4KKyAgICAgICAgPC9pZj4KKworICAgICAgICA8IS0tIEVycm9yIGxvZyAtLT4KKyAgICAgICAgPGFwcGVuZGVyIG5hbWU9IkVSUk9SX1JPTExJTkciCisgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKyAgICAgICAgICAgICAgICA8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9lcnJvci5sb2cKKyAgICAgICAgICAgICAgICA8L2ZpbGU+CisKKyAgICAgICAgICAgICAgICA8IS0tIEF1ZGl0IG1lc3NhZ2VzIGZpbHRlciAtIGRlbnkgYXVkaXQgbWVzc2FnZXMgLS0+CisgICAgICAgICAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5maWx0ZXIuRXZhbHVhdG9yRmlsdGVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxldmFsdWF0b3IgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuYm9vbGV4Lk9uTWFya2VyRXZhbHVhdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hcmtlcj5BVURJVF9NQVJLRVI8L21hcmtlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXZhbHVhdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9uTWlzbWF0Y2g+TkVVVFJBTDwvb25NaXNtYXRjaD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvbk1hdGNoPkRFTlk8L29uTWF0Y2g+CisgICAgICAgICAgICAgICAgPC9maWx0ZXI+CisKKyAgICAgICAgICAgICAgICA8IS0tIFRyYW5zYWN0aW9uIG1lc3NhZ2VzIGZpbHRlciAtIGRlbnkgVHJhbnNhY3Rpb24gbWVzc2FnZXMgLS0+CisgICAgICAgICAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5maWx0ZXIuRXZhbHVhdG9yRmlsdGVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxldmFsdWF0b3IgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuYm9vbGV4Lk9uTWFya2VyRXZhbHVhdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hcmtlcj5UUkFOU0FDVElPTl9NQVJLRVI8L21hcmtlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXZhbHVhdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9uTWlzbWF0Y2g+TkVVVFJBTDwvb25NaXNtYXRjaD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvbk1hdGNoPkRFTlk8L29uTWF0Y2g+CisgICAgICAgICAgICAgICAgPC9maWx0ZXI+CisKKyAgICAgICAgICAgICAgICA8IS0tIGRlbnkgYWxsIGV2ZW50cyB3aXRoIGEgbGV2ZWwgYmVsb3cgSU5GTywgdGhhdCBpcyBUUkFDRSBhbmQgREVCVUcgLS0+CisgICAgICAgICAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsZXZlbD5JTkZPPC9sZXZlbD4KKyAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKworICAgICAgICAgICAgICAgIDxyb2xsaW5nUG9saWN5IGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuRml4ZWRXaW5kb3dSb2xsaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlTmFtZVBhdHRlcm4+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZXJyb3IubG9nLiVpCisgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVOYW1lUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtaW5JbmRleD4xPC9taW5JbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhJbmRleD4xMDwvbWF4SW5kZXg+CisgICAgICAgICAgICAgICAgPC9yb2xsaW5nUG9saWN5PgorCisgICAgICAgICAgICAgICAgPHRyaWdnZXJpbmdQb2xpY3kKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuU2l6ZUJhc2VkVHJpZ2dlcmluZ1BvbGljeSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4RmlsZVNpemU+MjBNQjwvbWF4RmlsZVNpemU+CisgICAgICAgICAgICAgICAgPC90cmlnZ2VyaW5nUG9saWN5PgorICAgICAgICAgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+JHtkZWZhdWx0LWxvZy1wYXR0ZXJufTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICA8L2VuY29kZXI+CisgICAgICAgIDwvYXBwZW5kZXI+CisKKyAgICAgICAgPCEtLSBEZWJ1ZyBsb2cgLS0+CisgICAgICAgIDxhcHBlbmRlciBuYW1lPSJERUJVR19ST0xMSU5HIgorICAgICAgICAgICAgICAgIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+CisgICAgICAgICAgICAgICAgPGZpbGU+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nCisgICAgICAgICAgICAgICAgPC9maWxlPgorCisgICAgICAgICAgICAgICAgPCEtLSBObyBuZWVkIHRvIGRlbnkgYXVkaXQgbWVzc2FnZXMgLSB0aGV5IGFyZSBJTkZPIG9ubHksIHdpbGwgYmUgZGVuaWVkCisgICAgICAgICAgICAgICAgICAgICAgICBhbnl3YXkgLS0+CisgICAgICAgICAgICAgICAgPCEtLSBUcmFuc2FjdGlvbiBtZXNzYWdlcyBmaWx0ZXIgLSBkZW55IFRyYW5zYWN0aW9uIG1lc3NhZ2VzLCB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgREVCVUcgbGV2ZWwgbWVzc2FnZXMgYW1vbmcgdGhlbSAtLT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyPlRSQU5TQUNUSU9OX01BUktFUjwvbWFya2VyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ldmFsdWF0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NaXNtYXRjaD5ORVVUUkFMPC9vbk1pc21hdGNoPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9uTWF0Y2g+REVOWTwvb25NYXRjaD4KKyAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKworICAgICAgICAgICAgICAgIDwhLS0gYWNjZXB0IERFQlVHIGFuZCBUUkFDRSBsZXZlbCAtLT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguR0V2ZW50RXZhbHVhdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5sZXZlbC50b0ludCgpICZsdDs9IERFQlVHLnRvSW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ldmFsdWF0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8T25NaXNtYXRjaD5ERU5ZPC9Pbk1pc21hdGNoPgorICAgICAgICAgICAgICAgICAgICAgICAgPE9uTWF0Y2g+TkVVVFJBTDwvT25NYXRjaD4KKyAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKworICAgICAgICAgICAgICAgIDxyb2xsaW5nUG9saWN5IGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuRml4ZWRXaW5kb3dSb2xsaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlTmFtZVBhdHRlcm4+JHtsb2cuaG9tZX0vJHtFQ09NUC1jb21wb25lbnQtbmFtZX0vJHtFQ09NUC1zdWJjb21wb25lbnQtbmFtZX0vZGVidWcubG9nLiVpCisgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVOYW1lUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtaW5JbmRleD4xPC9taW5JbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhJbmRleD4xMDwvbWF4SW5kZXg+CisgICAgICAgICAgICAgICAgPC9yb2xsaW5nUG9saWN5PgorCisgICAgICAgICAgICAgICAgPHRyaWdnZXJpbmdQb2xpY3kKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuU2l6ZUJhc2VkVHJpZ2dlcmluZ1BvbGljeSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4RmlsZVNpemU+MjBNQjwvbWF4RmlsZVNpemU+CisgICAgICAgICAgICAgICAgPC90cmlnZ2VyaW5nUG9saWN5PgorICAgICAgICAgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+JHtkZWZhdWx0LWxvZy1wYXR0ZXJufTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICA8L2VuY29kZXI+CisgICAgICAgIDwvYXBwZW5kZXI+CisKKyAgICAgICAgPCEtLSBBdWRpdCBsb2cgLS0+CisgICAgICAgIDxhcHBlbmRlciBuYW1lPSJBVURJVF9ST0xMSU5HIgorICAgICAgICAgICAgICAgIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+CisKKyAgICAgICAgICAgICAgICA8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9hdWRpdC5sb2cKKyAgICAgICAgICAgICAgICA8L2ZpbGU+CisKKyAgICAgICAgICAgICAgICA8IS0tIEF1ZGl0IG1lc3NhZ2VzIGZpbHRlciAtIGFjY2VwdCBhdWRpdCBtZXNzYWdlcyAtLT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyPkFVRElUX01BUktFUjwvbWFya2VyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ldmFsdWF0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NaXNtYXRjaD5ERU5ZPC9vbk1pc21hdGNoPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9uTWF0Y2g+QUNDRVBUPC9vbk1hdGNoPgorICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorCisgICAgICAgICAgICAgICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9hdWRpdC5sb2cuJWkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZU5hbWVQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1pbkluZGV4PjE8L21pbkluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKyAgICAgICAgICAgICAgICA8L3JvbGxpbmdQb2xpY3k+CisKKyAgICAgICAgICAgICAgICA8dHJpZ2dlcmluZ1BvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKyAgICAgICAgICAgICAgICA8L3RyaWdnZXJpbmdQb2xpY3k+CisgICAgICAgICAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj4ke2RlZmF1bHQtbG9nLXBhdHRlcm59PC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPC9hcHBlbmRlcj4KKworICAgICAgICA8IS0tIFNkbmNUcmFuc2FjdGlvbiBsb2cgLS0+CisgICAgICAgIDxhcHBlbmRlciBuYW1lPSJUUkFOU0FDVElPTl9ST0xMSU5HIgorICAgICAgICAgICAgICAgIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+CisKKyAgICAgICAgICAgICAgICA8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS90cmFuc2FjdGlvbi5sb2cKKyAgICAgICAgICAgICAgICA8L2ZpbGU+CisKKyAgICAgICAgICAgICAgICA8IS0tIFRyYW5zYWN0aW9uIG1lc3NhZ2VzIGZpbHRlciAtIGFjY2VwdCBhdWRpdCBtZXNzYWdlcyAtLT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyPlRSQU5TQUNUSU9OX01BUktFUjwvbWFya2VyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ldmFsdWF0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NaXNtYXRjaD5ERU5ZPC9vbk1pc21hdGNoPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9uTWF0Y2g+QUNDRVBUPC9vbk1hdGNoPgorICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorCisgICAgICAgICAgICAgICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS90cmFuc2FjdGlvbi5sb2cuJWkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZU5hbWVQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1pbkluZGV4PjE8L21pbkluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKyAgICAgICAgICAgICAgICA8L3JvbGxpbmdQb2xpY3k+CisKKyAgICAgICAgICAgICAgICA8dHJpZ2dlcmluZ1BvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKyAgICAgICAgICAgICAgICA8L3RyaWdnZXJpbmdQb2xpY3k+CisgICAgICAgICAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj4ke2RlZmF1bHQtbG9nLXBhdHRlcm59PC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPC9hcHBlbmRlcj4KKworICAgICAgICA8IS0tIEFzeW5jaHJvbmljaXR5IENvbmZpZ3VyYXRpb25zIC0tPgorICAgICAgICA8YXBwZW5kZXIgbmFtZT0iQVNZTkNfREVCVUciIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgorICAgICAgICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iREVCVUdfUk9MTElORyIgLz4KKyAgICAgICAgPC9hcHBlbmRlcj4KKworICAgICAgICA8YXBwZW5kZXIgbmFtZT0iQVNZTkNfVFJBTlNBQ1RJT04iIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgorICAgICAgICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iVFJBTlNBQ1RJT05fUk9MTElORyIgLz4KKyAgICAgICAgPC9hcHBlbmRlcj4KKworICAgICAgICA8YXBwZW5kZXIgbmFtZT0iQVNZTkNfRVJST1IiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgorICAgICAgICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iRVJST1JfUk9MTElORyIgLz4KKyAgICAgICAgPC9hcHBlbmRlcj4KKworCisgICAgICAgIDxyb290IGxldmVsPSJJTkZPIj4KKyAgICAgICAgICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iQVNZTkNfRVJST1IiIC8+CisgICAgICAgICAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkFTWU5DX0RFQlVHIiAvPgorICAgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJBVURJVF9ST0xMSU5HIiAvPgorICAgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJBU1lOQ19UUkFOU0FDVElPTiIgLz4KKyAgICAgICAgICAgICAgICA8aWYgY29uZGl0aW9uPSdwcm9wZXJ0eSgiZW5hYmxlLWFsbC1sb2ciKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIiknPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJBTExfUk9MTElORyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlbj4KKyAgICAgICAgICAgICAgICA8L2lmPgorICAgICAgICA8L3Jvb3Q+CisKKyAgICAgICAgPGxvZ2dlciBuYW1lPSJvcmcub3BlbmVjb21wLnNkYyIgbGV2ZWw9IklORk8iIC8+Cis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvZmlsZXMvZGVmYXVsdC9jb25zdW1lcnMucHkgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvY29uc3VtZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDZmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvY29uc3VtZXJzLnB5CkBAIC0wLDAgKzEsODkgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCitpbXBvcnQgc3VicHJvY2VzcworI2Zyb20gdGltZSBpbXBvcnQgc2xlZXAKK2ltcG9ydCB0aW1lCitmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQorCitjbGFzcyBiY29sb3JzOgorICAgIEhFQURFUiAgICA9ICdcMDMzWzk1bScKKyAgICBPS0JMVUUgICAgPSAnXDAzM1s5NG0nCisgICAgT0tHUkVFTiAgID0gJ1wwMzNbOTJtJworICAgIFdBUk5JTkcgICA9ICdcMDMzWzkzbScKKyAgICBGQUlMICAgICAgPSAnXDAzM1s5MW0nCisgICAgRU5EQyAgICAgID0gJ1wwMzNbMG0nCisgICAgQk9MRCAgICAgID0gJ1wwMzNbMW0nCisgICAgVU5ERVJMSU5FID0gJ1wwMzNbNG0nCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgIEZ1bmN0aW9ucworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkZWYgY2hlY2tCYWNrZW5kKCk6CisgICAgY29tbWFuZD0iY3VybCAtcyAtbyAvZGV2L251bGwgLUkgLXcgXCIle2h0dHBfY29kZX1cIiAtaSBodHRwOi8vbG9jYWxob3N0OjgwODAvc2RjMi9yZXN0L3YxL3VzZXIvamgwMDAzIgorCisgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oIGNvbW1hbmQgLCBzaGVsbD1UcnVlICwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSApCisgICAgKG91dCwgZXJyKSA9IHByb2MuY29tbXVuaWNhdGUoKQorICAgIHJlc3VsdCA9IG91dC5zdHJpcCgpCisgICAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBjaGVja0NvbnN1bWVyKGNvbnN1bWVyTmFtZSk6CisgICAgY29tbWFuZD0iY3VybCAtcyAtbyAvZGV2L251bGwgLUkgLXcgXCIle2h0dHBfY29kZX1cIiAtaSAtSCBcIkFjY2VwdDogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOFwiIC1IIFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXCIgLUggXCJVU0VSX0lEOiBqaDAwMDNcIiAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zZGMyL3Jlc3QvdjEvY29uc3VtZXJzLyIgKyBjb25zdW1lck5hbWUKKworICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKCBjb21tYW5kICwgc2hlbGw9VHJ1ZSAsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUgKQorICAgIChvdXQsIGVycikgPSBwcm9jLmNvbW11bmljYXRlKCkKKyAgICByZXN1bHQgPSBvdXQuc3RyaXAoKQorICAgIHJldHVybiByZXN1bHQKKworCitkZWYgY3JlYXRlQ29uc3VtZXIoIGNvbnN1bWVyTmFtZSwgY29uc3VtZXJTYWx0LCBjb25zdW1lclBhc3MgKToKKyAgICBwcmludCAnW0lORk9dICcgKyBjb25zdW1lck5hbWUKKyAgICBjb21tYW5kPSJjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyBcIiV7aHR0cF9jb2RlfVwiIC1YIFBPU1QgLWkgLUggXCJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLThcIiAtSCBcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblwiIC1IIFwiVVNFUl9JRDogamgwMDAzXCIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NkYzIvcmVzdC92MS9jb25zdW1lcnMvIC1kICd7XCJjb25zdW1lck5hbWVcIjogJyIgKyBjb25zdW1lck5hbWUgKyAiJywgXCJjb25zdW1lclNhbHRcIjogJyIgKyBjb25zdW1lclNhbHQgKyAiJyxcImNvbnN1bWVyUGFzc3dvcmRcIjogJyIgKyBjb25zdW1lclBhc3MgKyAiJ30nIgorCisgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oIGNvbW1hbmQgLCBzaGVsbD1UcnVlICwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKworICAgIChvdXQsIGVycikgPSBwcm9jLmNvbW11bmljYXRlKCkKKyAgICByZXN1bHQgPSBvdXQuc3RyaXAoKQorICAgIHJldHVybiByZXN1bHQKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgIERlZmluaXRpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NvbnN1bWVyc0xpc3QgPSBbICJhYWkiICwgImFwcGMiICwgImRjYWUiICwgIm1zbyIgLCAic2RuYyIgLCAidmlkIiBdCitzYWx0ID0gIjljZDRjM2FkMmE2ZjZjZTNmMzQxNGU2OGI1MTU3ZTYzIgorcGFzc3dvcmQgPSAiMzUzNzFjMDQ2Zjg4YzYwM2NjYmExNTJjYjNkYjM0ZWM0NDc1Y2IyZTU3MTNmMmZjMGE0M2JmMThhNTI0MzQ5NSIKK2JlU3RhdD0wCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgIE1haW4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmb3IgaSBpbiByYW5nZSgxLDEwKToKKyAgICBteVJlc3VsdCA9IGNoZWNrQmFja2VuZCgpCisgICAgaWYgbXlSZXN1bHQgPT0gJzIwMCc6CisgICAgICAgIHByaW50ICdbSU5GT106IEJhY2tlbmQgaXMgdXAgYW5kIHJ1bm5pbmcnCisgICAgICAgIGJlU3RhdD0xCisgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgY3VycmVudFRpbWUgPSBkYXRldGltZS5ub3coKQorICAgICAgICBwcmludCAnW0VSUk9SXTogJyArIGN1cnJlbnRUaW1lLnN0cmZ0aW1lKCclWS8lbS8lZCAlSDolTTolUycpICsgYmNvbG9ycy5GQUlMICsgJyBCYWNrZW5kIG5vdCByZXNwb25kaW5nLCB0cnkgIycgKyBzdHIoaSkgKyBiY29sb3JzLkVOREMKKyAgICAgICAgdGltZS5zbGVlcCgxMCkKKworaWYgYmVTdGF0ID09IDA6CisgICAgcHJpbnQgJ1tFUlJPUl06ICcgKyB0aW1lLnN0cmZ0aW1lKCclWS8lbS8lZCAlSDolTTolUycpICsgYmNvbG9ycy5GQUlMICsgJ0JhY2tlbmQgaXMgRE9XTiA6LSgnICsgYmNvbG9ycy5FTkRDCisgICAgZXhpdCgpCisKK2ZvciBjb25zdW1lciBpbiBjb25zdW1lcnNMaXN0OgorICAgIG15UmVzdWx0ID0gY2hlY2tDb25zdW1lcihjb25zdW1lcikKKyAgICBpZiBteVJlc3VsdCA9PSAnMjAwJzoKKyAgICAgICAgcHJpbnQgJ1tJTkZPXTogJyArIGNvbnN1bWVyICsgJyBhbHJlYWR5IGV4aXN0cycKKyAgICBlbHNlOgorICAgICAgICBteVJlc3VsdCA9IGNyZWF0ZUNvbnN1bWVyKCBjb25zdW1lciwgc2FsdCwgcGFzc3dvcmQgKQorICAgICAgICBpZiBteVJlc3VsdCA9PSAnMjAxJzoKKyAgICAgICAgICAgIHByaW50ICdbSU5GT106ICcgKyBjb25zdW1lciArICcgY3JlYXRlZCwgcmVzdWx0OiBbJyArIG15UmVzdWx0ICsgJ10nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnW0VSUk9SXTogJyArIGJjb2xvcnMuRkFJTCArIGNvbnN1bWVyICsgYmNvbG9ycy5FTkRDICsgJyBlcnJvciBjcmVhdGluZyAsIHJlc3VsdDogWycgKyBteVJlc3VsdCArICddJwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9maWxlcy9kZWZhdWx0L3VzZXIucHkgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvdXNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNlOWNmCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9maWxlcy9kZWZhdWx0L3VzZXIucHkKQEAgLTAsMCArMSw5MiBAQAorIyEvdXNyL2Jpbi9weXRob24KK2ltcG9ydCBzdWJwcm9jZXNzCisjZnJvbSB0aW1lIGltcG9ydCBzbGVlcAoraW1wb3J0IHRpbWUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisKK2NsYXNzIGJjb2xvcnM6CisgICAgSEVBREVSICAgID0gJ1wwMzNbOTVtJworICAgIE9LQkxVRSAgICA9ICdcMDMzWzk0bScKKyAgICBPS0dSRUVOICAgPSAnXDAzM1s5Mm0nCisgICAgV0FSTklORyAgID0gJ1wwMzNbOTNtJworICAgIEZBSUwgICAgICA9ICdcMDMzWzkxbScKKyAgICBFTkRDICAgICAgPSAnXDAzM1swbScKKyAgICBCT0xEICAgICAgPSAnXDAzM1sxbScKKyAgICBVTkRFUkxJTkUgPSAnXDAzM1s0bScKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgRnVuY3Rpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RlZiBjaGVja0JhY2tlbmQoKToKKyAgICBjb21tYW5kPSJjdXJsIC1zIC1vIC9kZXYvbnVsbCAtSSAtdyBcIiV7aHR0cF9jb2RlfVwiIC1pIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zZGMyL3Jlc3QvdjEvdXNlci9qaDAwMDMiCisKKyAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbiggY29tbWFuZCAsIHNoZWxsPVRydWUgLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFICkKKyAgICAob3V0LCBlcnIpID0gcHJvYy5jb21tdW5pY2F0ZSgpCisgICAgcmVzdWx0ID0gb3V0LnN0cmlwKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIGNoZWNrVXNlcih1c2VyTmFtZSk6CisgICAgY29tbWFuZD0iY3VybCAtcyAtbyAvZGV2L251bGwgLUkgLXcgXCIle2h0dHBfY29kZX1cIiAtaSAtSCBcIkFjY2VwdDogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOFwiIC1IIFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXCIgLUggXCJVU0VSX0lEOiBqaDAwMDNcIiAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zZGMyL3Jlc3QvdjEvdXNlci8iICsgdXNlck5hbWUKKworICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKCBjb21tYW5kICwgc2hlbGw9VHJ1ZSAsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUgKQorICAgIChvdXQsIGVycikgPSBwcm9jLmNvbW11bmljYXRlKCkKKyAgICByZXN1bHQgPSBvdXQuc3RyaXAoKQorICAgIHJldHVybiByZXN1bHQKKworCisKKworZGVmIGNyZWF0ZVVzZXIoIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHVzZXJJZCAsIGVtYWlsICwgcm9sZSApOgorICAgIHByaW50ICdbSU5GT10gY3JlYXRlIGZpcnN0OlsnICsgZmlyc3ROYW1lICsgJ10sIGxhc3Q6WycgKyBsYXN0TmFtZSArICddLCBJZDpbJyArIHVzZXJJZCArICddLCBlbWFpbDpbJyArIGVtYWlsICsgJ10sIHJvbGU6WycgKyByb2xlICsnXScKKyAgICBjb21tYW5kPSJjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyBcIiV7aHR0cF9jb2RlfVwiIC1YIFBPU1QgLWkgLUggXCJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLThcIiAtSCBcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblwiIC1IIFwiVVNFUl9JRDogamgwMDAzXCIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NkYzIvcmVzdC92MS91c2VyLyAtZCAne1wiZmlyc3ROYW1lXCI6ICciICsgZmlyc3ROYW1lICsgIicsIFwibGFzdE5hbWVcIjogJyIgKyBsYXN0TmFtZSArICInLFwidXNlcklkXCI6ICciICsgdXNlcklkICsgIicsXCJlbWFpbFwiOiAnIiArIGVtYWlsICsgIicsXCJyb2xlXCI6ICciICsgcm9sZSArICInfSciCisKKyAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbiggY29tbWFuZCAsIHNoZWxsPVRydWUgLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgIChvdXQsIGVycikgPSBwcm9jLmNvbW11bmljYXRlKCkKKyAgICByZXN1bHQgPSBvdXQuc3RyaXAoKQorICAgIHJldHVybiByZXN1bHQKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgIERlZmluaXRpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3VzZXJMaXN0ID0gWyAiZGVtbyIgXQorbGFzdE5hbWUgPSAiZGVtbyIKK3VzZXJJZCAgID0gImRlbW8iCitlbWFpbCAgICA9ICJkZW1vQG9wZW5lY29tcC5vcmciCityb2xlICAgICA9ICJBRE1JTiIKK2JlU3RhdD0wCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgIE1haW4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmb3IgaSBpbiByYW5nZSgxLDEwKToKKyAgICBteVJlc3VsdCA9IGNoZWNrQmFja2VuZCgpCisgICAgaWYgbXlSZXN1bHQgPT0gJzIwMCc6CisgICAgICAgIHByaW50ICdbSU5GT106IEJhY2tlbmQgaXMgdXAgYW5kIHJ1bm5pbmcnCisgICAgICAgIGJlU3RhdD0xCisgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgY3VycmVudFRpbWUgPSBkYXRldGltZS5ub3coKQorICAgICAgICBwcmludCAnW0VSUk9SXTogJyArIGN1cnJlbnRUaW1lLnN0cmZ0aW1lKCclWS8lbS8lZCAlSDolTTolUycpICsgYmNvbG9ycy5GQUlMICsgJyBCYWNrZW5kIG5vdCByZXNwb25kaW5nLCB0cnkgIycgKyBzdHIoaSkgKyBiY29sb3JzLkVOREMKKyAgICAgICAgdGltZS5zbGVlcCgxMCkKKworaWYgYmVTdGF0ID09IDA6CisgICAgcHJpbnQgJ1tFUlJPUl06ICcgKyB0aW1lLnN0cmZ0aW1lKCclWS8lbS8lZCAlSDolTTolUycpICsgYmNvbG9ycy5GQUlMICsgJ0JhY2tlbmQgaXMgRE9XTiA6LSgnICsgYmNvbG9ycy5FTkRDCisgICAgZXhpdCgpCisKK2ZvciB1c2VyIGluIHVzZXJMaXN0OgorICAgIG15UmVzdWx0ID0gY2hlY2tVc2VyKHVzZXIpCisgICAgaWYgbXlSZXN1bHQgPT0gJzIwMCc6CisgICAgICAgIHByaW50ICdbSU5GT106ICcgKyB1c2VyICsgJyBhbHJlYWR5IGV4aXN0cycKKyAgICBlbHNlOgorICAgICAgICBteVJlc3VsdCA9IGNyZWF0ZVVzZXIoIHVzZXIsIGxhc3ROYW1lLCB1c2VySWQsIGVtYWlsLCByb2xlICkKKyAgICAgICAgaWYgbXlSZXN1bHQgPT0gJzIwMSc6CisgICAgICAgICAgICBwcmludCAnW0lORk9dOiAnICsgdXNlcklkICsgJyBjcmVhdGVkLCByZXN1bHQ6IFsnICsgbXlSZXN1bHQgKyAnXScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdbRVJST1JdOiAnICsgYmNvbG9ycy5GQUlMICsgdXNlcklkICsgYmNvbG9ycy5FTkRDICsgJyBlcnJvciBjcmVhdGluZyAsIHJlc3VsdDogWycgKyBteVJlc3VsdCArICddJwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzFfY2xlYW51cF9qZXR0eWRpci5yYiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV8xX2NsZWFudXBfamV0dHlkaXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNDdhMwotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV8xX2NsZWFudXBfamV0dHlkaXIucmIKQEAgLTAsMCArMSw0OSBAQAorI2RpcmVjdG9yeSAiQkVfdGVtcGRpcl9jbGVhbnVwIiBkbworIyAgcGF0aCAiL3Zhci9saWIvamV0dHkvdGVtcGRpciIKKyMgIHJlY3Vyc2l2ZSB0cnVlCisjICBhY3Rpb24gOmRlbGV0ZQorI2VuZAorCisKK2RpcmVjdG9yeSAiQkVfdGVtcGRpcl9jcmVhdGlvbiIgZG8KKyAgcGF0aCAiL3Zhci9saWIvamV0dHkvdGVtcCIKKyAgb3duZXIgJ2pldHR5JworICBncm91cCAnamV0dHknCisgIG1vZGUgJzA3NTUnCisgIGFjdGlvbiA6Y3JlYXRlCitlbmQKKworCisjZGlyZWN0b3J5ICJCRV93ZWJhcHBzX2NsZWFudXAiIGRvCisjICBwYXRoICIvdmFyL2xpYi9qZXR0eS93ZWJhcHBzIgorIyAgcmVjdXJzaXZlIHRydWUKKyMgIGFjdGlvbiA6ZGVsZXRlCisjZW5kCisKKworI2RpcmVjdG9yeSAiQkVfd2ViYXBwc19jcmVhdGlvbiIgZG8KKyMgIHBhdGggIi92YXIvbGliL2pldHR5L3dlYmFwcHMiCisjICBvd25lciAnamV0dHknCisjICBncm91cCAnamV0dHknCisjICBtb2RlICcwNzU1JworIyAgYWN0aW9uIDpjcmVhdGUKKyNlbmQKKworCitkaXJlY3RvcnkgIkJFX2NyZWF0ZV9jb25maWdfZGlyIiBkbworICBwYXRoICIvdmFyL2xpYi9qZXR0eS9jb25maWciCisgIG93bmVyICdqZXR0eScKKyAgZ3JvdXAgJ2pldHR5JworICBtb2RlICcwNzU1JworICBhY3Rpb24gOmNyZWF0ZQorZW5kCisKKworZGlyZWN0b3J5ICJCRV9jcmVhdGVfY2F0YWxvZy1iZSIgZG8KKyAgcGF0aCAiL3Zhci9saWIvamV0dHkvY29uZmlnL2NhdGFsb2ctYmUiCisgIG93bmVyICdqZXR0eScKKyAgZ3JvdXAgJ2pldHR5JworICBtb2RlICcwNzU1JworICBhY3Rpb24gOmNyZWF0ZQorZW5kCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV8yX2xvY2F0ZV93YXJzLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzJfbG9jYXRlX3dhcnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzZGVhMQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV8yX2xvY2F0ZV93YXJzLnJiCkBAIC0wLDAgKzEsMjYgQEAKK2pldHR5X2Jhc2U9Ii92YXIvbGliL2pldHR5IgoramV0dHlfaG9tZT0iL3Vzci9sb2NhbC9qZXR0eSIKKworIyMjIyMjIGNyZWF0ZSBKZXR0eSBtb2R1bGVzCitiYXNoICJjcmVhdGUtamV0dHktbW9kdWxlcyIgZG8KK2N3ZCAiI3tqZXR0eV9iYXNlfSIKK2NvZGUgPDwtRU9ICisgICBjZCAiI3tqZXR0eV9iYXNlfSIKKyAgIGphdmEgLWphciAiLyN7amV0dHlfaG9tZX0iL3N0YXJ0LmphciAtLWFkZC10by1zdGFydD1kZXBsb3kKKyAgIGphdmEgLWphciAiLyN7amV0dHlfaG9tZX0iL3N0YXJ0LmphciAtLWFkZC10by1zdGFydGQ9aHR0cCxodHRwcyxsb2dnaW5nLHNldHVpZAorRU9ICitub3RfaWYgImxzIC8je2pldHR5X2Jhc2V9L3N0YXJ0LmQvaHR0cHMuaW5pIgorZW5kCisKKyMjIyMjIyBjb3B5IGNhdGFsb2ctYmUud2FyCisKKworCisjIyMjIyMgY29weSBvbmJvYXJkaW5nLWJlLndhciYgYXBpLWRvY3Mud2FyCisjYmFzaCAiY29weS1vbmJvYXJkaW5nLWJlIiBkbworIyAgIGNvZGUgPDwtRU9ICisjICAgICAgIC9iaW4vdGFyIC14dmYgL3Zhci90bXAvb25ib2FyZGluZy1iZS50YXIgLUMgIC92YXIvdG1wLworIyAgICAgICAgICAgbXYgL3Zhci90bXAvb25ib2FyZGluZy1iZSoud2FyIC92YXIvdG1wLy9hcGktZG9jcyoud2FyICAje2pldHR5X2Jhc2V9L3dlYmFwcHMKKyMgICBFT0gKKyNlbmQKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzNfY3JlYXRlX0RNYWFQX2tleXMucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3JlY2lwZXMvQkVfM19jcmVhdGVfRE1hYVBfa2V5cy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODNkZmZmCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzNfY3JlYXRlX0RNYWFQX2tleXMucmIKQEAgLTAsMCArMSwzNCBAQAoraHR0cF9yZXF1ZXN0ICdjcmVhdGUtRE1hYVAtYXBpS2V5cycgZG8KKyAgYWN0aW9uIDpwb3N0CisgIHVybCAnaHR0cDovLzIzLjI1My45Ny43NTozOTA0L2FwaUtleXMvY3JlYXRlJworICBtZXNzYWdlICh7OnNvbWUgPT4gJ2RhdGEnfS50b19qc29uKQorICBoZWFkZXJzKHsKKyAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24vanNvbicKKyAgfSkKK2VuZAorCisKK3NlbGZFbnZpcm9tZW50ID0gbm9kZS5jaGVmX2Vudmlyb25tZW50CisKK3J1YnlfYmxvY2sgImNyZWF0ZS1ETWFhUC1hcGlLZXlzIiBkbworICAgIGJsb2NrIGRvCisgICAgICBzbGVlcCgxNSkKKyAgICAgICN0cmlja3kgd2F5IHRvIGxvYWQgdGhpcyBDaGVmOjpNaXhpbjo6U2hlbGxPdXQgdXRpbGl0aWVzCisgICAgICBDaGVmOjpSZXNvdXJjZTo6UnVieUJsb2NrLnNlbmQoOmluY2x1ZGUsIENoZWY6Ok1peGluOjpTaGVsbE91dCkKKyAgICAgIGN1cmxfY29tbWFuZCA9ICJodHRwczovL2VzX2FkbWluOkFhMTIzNDU2QCN7YXBwbGljYXRpb25faG9zdH06OTIwMC9fY2x1c3Rlci9oZWFsdGg/cHJldHR5PXRydWUgLS1pbnNlY3VyZSIKKyAgICAgIHJlc3AgPSBOZXQ6OkhUVFAuZ2V0X3Jlc3BvbnNlIFVSSS5wYXJzZShjdXJsX2NvbW1hbmQpCisgICAgICBzdGF0ID0gSlNPTi5wYXJzZShyZXNwLnJlYWRfYm9keSlbJ3N0YXR1cyddCisKKyAgICAgIGNhc2Ugc3RhdAorICAgICAgICAgd2hlbiAiZ3JlZW4iCisgICAgICAgICAgICBwcmludGYoIlwwMzNbMzJtJXNcblwwMzNbMG0iLCAiICBFbGFzdGljU2VhcmNoIHRlc3RzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIikKKyAgICAgICAgIHdoZW4gInllbGxvdyIKKyAgICAgICAgICAgIHByaW50ZigiXDAzM1szM20lc1xuXDAzM1swbSIsICIgIEVsYXN0aWNTZWFyY2ggdGVzdHMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgd2l0aCB3YXJuaW5ncyIpCisgICAgICAgICB3aGVuICJyZWQiCisgICAgICAgICAgICBwcmludGYoIlwwMzNbMzFtJXNcblwwMzNbMG0iLCAiICBFbGFzdGljU2VhcmNoIHRlc3RzIGZhaWxlZCEhISIpCisgICAgICBlbmQKKyAgIGVuZAorZW5kCisKK2N1cmwgIFBPU1QgLWQgJ3siZW1haWwiOiJHcmluYmVyZy5Nb3RpIiwiZGVzY3JpcHRpb24iOiJOZXcgQXBpIEtleSBmb3IgQVNEQyBPUyJ9JyBodHRwOi8vMjMuMjUzLjk3Ljc1OjM5MDQvYXBpS2V5cy9jcmVhdGUKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzRfc2V0dXBfY29uZmlndXJhdGlvbi5yYiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV80X3NldHVwX2NvbmZpZ3VyYXRpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhY2Q0MgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV80X3NldHVwX2NvbmZpZ3VyYXRpb24ucmIKQEAgLTAsMCArMSw0MyBAQAorcmVwbGljYXRpb25fZmFjdG9yPTEKKwordGVtcGxhdGUgInRpdGFuLnByb3BlcnRpZXMiIGRvCisgICBwYXRoICIvdmFyL2xpYi9qZXR0eS9jb25maWcvY2F0YWxvZy1iZS90aXRhbi5wcm9wZXJ0aWVzIgorICAgc291cmNlICJCRS10aXRhbi5wcm9wZXJ0aWVzLmVyYiIKKyAgIG93bmVyICJqZXR0eSIKKyAgIGdyb3VwICJqZXR0eSIKKyAgIG1vZGUgIjA3NTUiCisgICB2YXJpYWJsZXMoeworICAgICAgOkNBU1NBTkRSQV9JUCA9PiBub2RlWydOb2RlcyddWydDUyddLAorICAgICAgOkNBU1NBTkRSQV9QV0QgPT4gbm9kZVsnY2Fzc2FuZHJhJ11bOmNhc3NhbmRyYV9wYXNzd29yZF0sCisgICAgICA6Q0FTU0FORFJBX1VTUiA9PiBub2RlWydjYXNzYW5kcmEnXVs6Y2Fzc2FuZHJhX3VzZXJdLAorICAgICAgOkRDX05BTUUgPT4gIkRDLSIrbm9kZS5jaGVmX2Vudmlyb25tZW50LAorCSAgOnJlcF9mYWN0b3IgPT4gcmVwbGljYXRpb25fZmFjdG9yCSAKKyAgIH0pCitlbmQKKworCit0ZW1wbGF0ZSAiY2F0YWxvZy1iZS1jb25maWciIGRvCisgICBwYXRoICIvdmFyL2xpYi9qZXR0eS9jb25maWcvY2F0YWxvZy1iZS9jb25maWd1cmF0aW9uLnlhbWwiCisgICBzb3VyY2UgIkJFLWNvbmZpZ3VyYXRpb24ueWFtbC5lcmIiCisgICBvd25lciAiamV0dHkiCisgICBncm91cCAiamV0dHkiCisgICBtb2RlICIwNzU1IgorICAgdmFyaWFibGVzKHsKKyAgICAgIDpob3N0X2lwICAgICAgPT4gbm9kZVsnSE9TVF9JUCddLAorICAgICAgOmNhdGFsb2dfcG9ydCA9PiBub2RlWydCRSddWzpodHRwX3BvcnRdLAorICAgICAgOnNzbF9wb3J0ICAgICA9PiBub2RlWydCRSddWzpodHRwc19wb3J0XSwKKyAgICAgIDpjYXNzYW5kcmFfaXAgPT4gbm9kZVsnTm9kZXMnXVsnQ1MnXSwKKyAgICAgIDpyZXBfZmFjdG9yICAgPT4gMSwKKyAgICAgIDpEQ19OQU1FICAgICAgPT4gIkRDLSIrbm9kZS5jaGVmX2Vudmlyb25tZW50CisgICB9KQorZW5kCisKKwordGVtcGxhdGUgImRpc3RyaWJ1dGlvbi1lbmdpbmUtY29uZmlndXJhdGlvbiIgZG8KKyAgIHBhdGggIi92YXIvbGliL2pldHR5L2NvbmZpZy9jYXRhbG9nLWJlL2Rpc3RyaWJ1dGlvbi1lbmdpbmUtY29uZmlndXJhdGlvbi55YW1sIgorICAgc291cmNlICJCRS1kaXN0cmlidXRpb24tZW5naW5lLWNvbmZpZ3VyYXRpb24ueWFtbC5lcmIiCisgICBvd25lciAiamV0dHkiCisgICBncm91cCAiamV0dHkiCisgICBtb2RlICIwNzU1IgorZW5kCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV81X3NldHVwX2VsYXN0aWNzZWFyY2gucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3JlY2lwZXMvQkVfNV9zZXR1cF9lbGFzdGljc2VhcmNoLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmM1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3JlY2lwZXMvQkVfNV9zZXR1cF9lbGFzdGljc2VhcmNoLnJiCkBAIC0wLDAgKzEsMTUgQEAKK2NsdXN0ZXJOYW1lID0gbm9kZVsnZWxhc3RpY3NlYXJjaCddWzpjbHVzdGVyX25hbWVdK25vZGUuY2hlZl9lbnZpcm9ubWVudAorbm9kZV9uYW1lID0gbm9kZVs6aG9zdG5hbWVdCisKK3RlbXBsYXRlICJlbGFzdGljc2VhcmNoLnltbC1jb25maWciIGRvCisgICBwYXRoICIvdmFyL2xpYi9qZXR0eS9jb25maWcvZWxhc3RpY3NlYXJjaC55bWwiCisgICBzb3VyY2UgIkJFLWVsYXN0aWNzZWFyY2gueW1sLmVyYiIKKyAgIG93bmVyICJqZXR0eSIKKyAgIGdyb3VwICJqZXR0eSIKKyAgIG1vZGUgIjA3NTUiCisgICB2YXJpYWJsZXMoeworICAgICAgICA6Y2x1c3Rlcl9uYW1lID0+ICIje2NsdXN0ZXJOYW1lfSIsCisgICAgICAgIDplc19ob3N0X2lwID0+IG5vZGVbJ05vZGVzJ11bJ0VTJ10KKyAgIH0pCitlbmQKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzZfc2V0dXBfcG9ydGFsX3Byb3BlcnRpZXMucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3JlY2lwZXMvQkVfNl9zZXR1cF9wb3J0YWxfcHJvcGVydGllcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU3ZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzZfc2V0dXBfcG9ydGFsX3Byb3BlcnRpZXMucmIKQEAgLTAsMCArMSwxNyBAQAordGVtcGxhdGUgInRlbXBsYXRlIHBvcnRhbC5wcm9wZXJ0aWVzIiBkbworICAgIHBhdGggIi92YXIvbGliL2pldHR5L3Jlc291cmNlcy9wb3J0YWwucHJvcGVydGllcyIKKyAgICBzb3VyY2UgIkJFLXBvcnRhbC5wcm9wZXJ0aWVzLmVyYiIKKyAgICBvd25lciAiamV0dHkiCisgICAgZ3JvdXAgImpldHR5IgorICAgIG1vZGUgIjA3NTUiCisgICAgdmFyaWFibGVzICh7CisgICAgICAgIDplY29tcF9yZXN0X3VybCAgICAgID0+IG5vZGVbJ0VDb21wUCddWydlY29tcF9yZXN0X3VybCddLAorICAgICAgICA6ZWNvbXBfcmVkaXJlY3RfdXJsICA9PiBub2RlWydFQ29tcFAnXVsnZWNvbXBfcmVkaXJlY3RfdXJsJ10sCisgICAgICAgIDp1ZWJfdXJsX2xpc3QgICAgICAgID0+IG5vZGVbJ0VDb21wUCddWyd1ZWJfdXJsX2xpc3QnXSwKKyAgICAgICAgOmluYm94X25hbWUgICAgICAgICAgPT4gbm9kZVsnRUNvbXBQJ11bJ2luYm94X25hbWUnXSwKKyAgICAgICAgOmFwcF9rZXkgICAgICAgICAgICAgPT4gbm9kZVsnRUNvbXBQJ11bJ2FwcF9rZXknXSwKKyAgICAgICAgOmFwcF9zZWNyZXQgICAgICAgICAgPT4gbm9kZVsnRUNvbXBQJ11bJ2FwcF9zZWNyZXQnXSwKKyAgICAgICAgOmFwcF90b3BpY19uYW1lICAgICAgPT4gbm9kZVsnRUNvbXBQJ11bJ2FwcF90b3BpY19uYW1lJ10sCisJCTpkZWNyeXB0X2tleSAgICAgICAgID0+IG5vZGVbJ0VDb21wUCddWydkZWNyeXB0aW9uX2tleSddCisgICAgfSkKK2VuZApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzdfbG9nYmFjay5yYiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV83X2xvZ2JhY2sucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlZTIxNgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvcmVjaXBlcy9CRV83X2xvZ2JhY2sucmIKQEAgLTAsMCArMSw3IEBACitjb29rYm9va19maWxlICIvdmFyL2xpYi9qZXR0eS9jb25maWcvY2F0YWxvZy1iZS9sb2diYWNrLnhtbCIgZG8KKyAgc291cmNlICJCRS1sb2diYWNrLnhtbCIKKyAgbW9kZSAwNzU1CisgIG93bmVyICJqZXR0eSIKKyAgZ3JvdXAgImpldHR5IgorZW5kCisgCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3JlY2lwZXMvQkVfOF9lcnJvcnNfY29uZmlnLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzhfZXJyb3JzX2NvbmZpZy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjMxMTJjCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzhfZXJyb3JzX2NvbmZpZy5yYgpAQCAtMCwwICsxLDE0IEBACitjb29rYm9va19maWxlICIvdmFyL2xpYi9qZXR0eS9jb25maWcvY2F0YWxvZy1iZS9lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwiIGRvCisgIHNvdXJjZSAiQkUtZWNvbXAtZXJyb3ItY29uZmlndXJhdGlvbi55YW1sIgorICBtb2RlIDA3NTUKKyAgb3duZXIgImpldHR5IgorICBncm91cCAiamV0dHkiCitlbmQKKyAKK2Nvb2tib29rX2ZpbGUgIi92YXIvbGliL2pldHR5L2NvbmZpZy9jYXRhbG9nLWJlL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbCIgZG8KKyAgc291cmNlICJCRS1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwiCisgIG1vZGUgMDc1NQorICBvd25lciAiamV0dHkiCisgIGdyb3VwICJqZXR0eSIKK2VuZAorIApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzlfaW1wb3J0X05vcm1hdGl2ZXMucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3JlY2lwZXMvQkVfOV9pbXBvcnRfTm9ybWF0aXZlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTliMjQxCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS9yZWNpcGVzL0JFXzlfaW1wb3J0X05vcm1hdGl2ZXMucmIKQEAgLTAsMCArMSwxNiBAQAorY29va2Jvb2tfZmlsZSAiL3RtcC9ub3JtYXRpdmVzLnRhci5neiIgZG8KKyAgIHNvdXJjZSAibm9ybWF0aXZlcy50YXIuZ3oiCitlbmQKKword29ya2luZ19kaXJlY3RvcnkgPSAgIi90bXAiCisKK2Jhc2ggImltcG9ydC1ub3JtYXRpdmVzIiBkbworICBjd2QgIiN7d29ya2luZ19kaXJlY3Rvcnl9IgorICBjb2RlIDw8LUVPSAorICAgIHRhciB4dmZ6IC90bXAvbm9ybWF0aXZlcy50YXIuZ3oKKyAgICBjZCBzY3JpcHRzL2ltcG9ydC90b3NjYS8KKyAgICAvYmluL2NobW9kICt4IGltcG9ydE5vcm1hdGl2ZUFsbC5weQorICAgIHB5dGhvbiBpbXBvcnROb3JtYXRpdmVBbGwucHkgCisgIEVPSAorZW5kCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvdGVtcGxhdGVzL2RlZmF1bHQvQkUtY29uZmlndXJhdGlvbi55YW1sLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvdGVtcGxhdGVzL2RlZmF1bHQvQkUtY29uZmlndXJhdGlvbi55YW1sLmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJjMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS90ZW1wbGF0ZXMvZGVmYXVsdC9CRS1jb25maWd1cmF0aW9uLnlhbWwuZXJiCkBAIC0wLDAgKzEsNDU5IEBACitpZGVudGlmaWNhdGlvbkhlYWRlckZpZWxkczoKKyAgIC0gSFRUUF9JVl9VU0VSCisgICAtIEhUVFBfQ1NQX0ZJUlNUTkFNRQorICAgLSBIVFRQX0NTUF9MQVNUTkFNRQorICAgLSBIVFRQX0lWX1JFTU9URV9BRERSRVNTCisgICAtIEhUVFBfQ1NQX1dTVFlQRQorCisKKyMgY2F0YWxvZyBiYWNrZW5kIGhvc3RuYW1lCitiZUZxZG46IDwlPSBAaG9zdF9pcCAlPgorCisjIGNhdGFsb2cgYmFja2VuZCBodHRwIHBvcnQKK2JlSHR0cFBvcnQ6IDwlPSBAY2F0YWxvZ19wb3J0ICU+CisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgY29udGV4dAorYmVDb250ZXh0OiAvc2RjL3Jlc3QvY29uZmlnL2dldAorCisjIGNhdGFsb2cgYmFja2VuZCBwcm90b2NvbAorYmVQcm90b2NvbDogaHR0cAorCisjIGNhdGFsb2cgYmFja2VuZCBzc2wgcG9ydAorYmVTc2xQb3J0OiA8JT0gQHNzbF9wb3J0ICU+Cit2ZXJzaW9uOiAxLjAKK3JlbGVhc2VkOiAyMDEyLTExLTMwCisKK3RpdGFuQ2ZnRmlsZTogL3Zhci9saWIvamV0dHkvY29uZmlnL2NhdGFsb2ctYmUvdGl0YW4ucHJvcGVydGllcwordGl0YW5Jbk1lbW9yeUdyYXBoOiBmYWxzZQordGl0YW5Mb2NrVGltZW91dDogMTgwMAorIyBUaGUgaW50ZXJ2YWwgdG8gdHJ5IGFuZCByZWNvbm5lY3QgdG8gdGl0YW4gREIgd2hlbiBpdCBpcyBkb3duIGR1cmluZyBBU0RDIHN0YXJ0dXA6Cit0aXRhblJlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOiAzCisKKyMgVGhlIHJlYWQgdGltZW91dCB0b3dhcmRzIFRpdGFuIERCIHdoZW4gaGVhbHRoIGNoZWNrIGlzIGludm9rZWQ6Cit0aXRhbkhlYWx0aENoZWNrUmVhZFRpbWVvdXQ6IDEKKworIyBUaGUgaW50ZXJ2YWwgdG8gdHJ5IGFuZCByZWNvbm5lY3QgdG8gRWxhc3RpY3NlYXJjaCB3aGVuIGl0IGlzIGRvd24gZHVyaW5nIEFTREMgc3RhcnR1cDoKKworZXNSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczogMwordWViSGVhbHRoQ2hlY2tSZWNvbm5lY3RJbnRlcnZhbEluU2Vjb25kczogMTUKK3VlYkhlYWx0aENoZWNrUmVhZFRpbWVvdXQ6IDQKKworIyBQcm90b2NvbHMKK3Byb3RvY29sczoKKyAgIC0gaHR0cAorICAgLSBodHRwcworCisjIFVzZXJzCit1c2VyczoKKyAgICB0b206IHBhc3N3ZAorICAgIGJvYjogcGFzc3dkCisKKworY2Fzc2FuZHJhQ29uZmlnOgorICAgIGNhc3NhbmRyYUhvc3RzOiBbPCU9IEBjYXNzYW5kcmFfaXAgJT5dCisgICAgbG9jYWxEYXRhQ2VudGVyOgorICAgIHJlY29ubmVjdFRpbWVvdXQgOiAzMDAwMAorICAgIGF1dGhlbnRpY2F0ZTogdHJ1ZQorICAgIHVzZXJuYW1lOiBhc2RjX3VzZXIKKyAgICBwYXNzd29yZDogQWExMjM0JV4hCisgICAgc3NsOiBmYWxzZQorICAgIHRydXN0c3RvcmVQYXRoIDogL2NvbmZpZy8udHJ1c3RzdG9yZQorICAgIHRydXN0c3RvcmVQYXNzd29yZCA6IEFhMTIzNDU2CisgICAga2V5U3BhY2VzOgorICAgICAgICAtIHsgbmFtZTogZG94LCByZXBsaWNhdGlvblN0cmF0ZWd5OiBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSwgcmVwbGljYXRpb25JbmZvOiBbJzwlPSBARENfTkFNRSAlPicsJzwlPSBAcmVwX2ZhY3RvciAlPiddfQorICAgICAgICAtIHsgbmFtZTogc2RjYXVkaXQsIHJlcGxpY2F0aW9uU3RyYXRlZ3k6IE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5LCByZXBsaWNhdGlvbkluZm86IFsnPCU9IEBEQ19OQU1FICU+JywnPCU9IEByZXBfZmFjdG9yICU+J119CisgICAgICAgIC0geyBuYW1lOiBzZGNhcnRpZmFjdCwgcmVwbGljYXRpb25TdHJhdGVneTogTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWyc8JT0gQERDX05BTUUgJT4nLCc8JT0gQHJlcF9mYWN0b3IgJT4nXX0KKyAgICAgICAgLSB7IG5hbWU6IHNkY2NvbXBvbmVudCwgcmVwbGljYXRpb25TdHJhdGVneTogTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWyc8JT0gQERDX05BTUUgJT4nLCc8JT0gQHJlcF9mYWN0b3IgJT4nXX0KKworI0FwcGxpY2F0aW9uLXNwZWNpZmljIHNldHRpbmdzIG9mIEVTCitlbGFzdGljU2VhcmNoOgorICAgICMgTWFwcGluZyBvZiBpbmRleCBwcmVmaXggdG8gdGltZS1iYXNlZCBmcmFtZS4gRm9yIGV4YW1wbGUsIGlmIGJlbG93IGlzIGNvbmZpZ3VyZWQ6CisgICAgIworICAgICMgLSBpbmRleFByZWZpeDogYXVkaXRpbmdldmVudHMKKyAgICAjICAgIGNyZWF0aW9uUGVyaW9kOiBtaW51dGUKKyAgICAjCisgICAgIyB0aGVuIEVTIG9iamVjdCBvZiB0eXBlIHdoaWNoIGlzIG1hcHBlZCB0byAiYXVkaXRpbmdldmVudHMtKiIgdGVtcGxhdGUsIGFuZCBjcmVhdGVkIG9uIDIwMTUtMTItMjMgMTM6MjQ6NTQsIHdpbGwgZW50ZXIgImF1ZGl0aW5nZXZlbnRzLTIwMTUtMTItMjMtMTMtMjQiIGluZGV4LgorICAgICMgQW5vdGhlciBvYmplY3QgY3JlYXRlZCBvbiAyMDE1LTEyLTIzIDEzOjI1OjU0LCB3aWxsIGVudGVyICJhdWRpdGluZ2V2ZW50cy0yMDE1LTEyLTIzLTEzLTI1IiBpbmRleC4KKyAgICAjIElmIGNyZWF0aW9uUGVyaW9kOiBtb250aCwgYm90aCBvZiB0aGUgYWJvdmUgd2lsbCBlbnRlciAiYXVkaXRpbmdldmVudHMtMjAxNS0xMiIgaW5kZXguCisgICAgIworICAgICMgUExFQVNFIE5PVEU6IHRoZSB0aW1lc3RhbXBzIGFyZSBjcmVhdGVkIGluIFVUQy9HTVQgdGltZXpvbmUhIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgdGltZXN0YW1wcyB3aWxsIGJlIGNvcnJlY3RseSBwcmVzZW50ZWQgaW4gS2liYW5hLgorICAgICMKKyAgICAjIExlZ2FsIHZhbHVlcyBmb3IgY3JlYXRpb25QZXJpb2QgLSB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIG5vbmUgKG1lYW5pbmcgbm8gdGltZS1iYXNlZCBiZWhhdmlvdXIpLgorICAgICMKKyAgICAjIElmIG5vIGNyZWF0aW9uUGVyaW9kIGlzIGNvbmZpZ3VyZWQgZm9yIGluZGV4UHJlZml4LCBkZWZhdWx0IGJlaGF2b3VyIGlzIGNyZWF0aW9uUGVyaW9kOiBtb250aC4KKworICAgIGluZGljZXNUaW1lRnJlcXVlbmN5OgorICAgICAgLSBpbmRleFByZWZpeDogYXVkaXRpbmdldmVudHMKKyAgICAgICAgY3JlYXRpb25QZXJpb2Q6IG1vbnRoCisgICAgICAtIGluZGV4UHJlZml4OiBtb25pdG9yaW5nX2V2ZW50cworICAgICAgICBjcmVhdGlvblBlcmlvZDogbW9udGgKK2FydGlmYWN0VHlwZXM6CisgICAtIENIRUYKKyAgIC0gUFVQUEVUCisgICAtIFNIRUxMCisgICAtIFlBTkcKKyAgIC0gWUFOR19YTUwKKyAgIC0gSEVBVAorICAgLSBCUEVMCisgICAtIERHX1hNTAorICAgLSBNVVJBTk9fUEtHCisgICAtIFdPUktGTE9XCisgICAtIE5FVFdPUktfQ0FMTF9GTE9XCisgICAtIFRPU0NBX1RFTVBMQVRFCisgICAtIFRPU0NBX0NTQVIKKyAgIC0gQUFJX1NFUlZJQ0VfTU9ERUwKKyAgIC0gQUFJX1ZGX01PREVMCisgICAtIEFBSV9WRl9NT0RVTEVfTU9ERUwKKyAgIC0gQUFJX1ZGX0lOU1RBTkNFX01PREVMCisgICAtIE9USEVSCisKKworbGljZW5zZVR5cGVzOgorICAgLSBVc2VyCisgICAtIEluc3RhbGxhdGlvbgorICAgLSBDUFUKKworI0RlcGxveW1lbnQgYXJ0aWZhY3RzIHBsYWNlSG9sZGVyCityZXNvdXJjZVR5cGVzOiAmYWxsUmVzb3VyY2VUeXBlcworICAtIFZGQworICAtIENQCisgIC0gVkwKKyAgLSBWRgorCisjIHZhbGlkRm9yUmVzb3VyY2VUeXBlcyB1c2FnZQorIyAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorIyAgICAgICAgLSBWRgorIyAgICAgICAgLSBWTAorZGVwbG95bWVudFJlc291cmNlQXJ0aWZhY3RzOgorCisKK2RlcGxveW1lbnRSZXNvdXJjZUluc3RhbmNlQXJ0aWZhY3RzOgorICBoZWF0RW52OgorICAgICAgZGlzcGxheU5hbWU6ICJIRUFUIEVOViIKKyAgICAgIHR5cGU6IEhFQVRfRU5WCisgICAgICBkZXNjcmlwdGlvbjogIkF1dG8tZ2VuZXJhdGVkIEhFQVQgRW52aXJvbm1lbnQgZGVwbG95bWVudCBhcnRpZmFjdCIKKyAgICAgIGZpbGVFeHRlbnNpb246ICJlbnYiCisKKyN0b3NjYSBhcnRpZmFjdHMgcGxhY2Vob2xkZXJzCit0b3NjYUFydGlmYWN0czoKKyAgYXNzZXRUb3NjYVRlbXBsYXRlOgorICAgICAgYXJ0aWZhY3ROYW1lOiAtdGVtcGxhdGUueW1sCisgICAgICBkaXNwbGF5TmFtZTogVG9zY2EgVGVtcGxhdGUKKyAgICAgIHR5cGU6IFRPU0NBX1RFTVBMQVRFCisgICAgICBkZXNjcmlwdGlvbjogVE9TQ0EgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFzc2V0CisgIGFzc2V0VG9zY2FDc2FyOgorICAgICAgYXJ0aWZhY3ROYW1lOiAtY3Nhci5jc2FyCisgICAgICBkaXNwbGF5TmFtZTogVG9zY2EgTW9kZWwKKyAgICAgIHR5cGU6IFRPU0NBX0NTQVIKKyAgICAgIGRlc2NyaXB0aW9uOiBUT1NDQSBkZWZpbml0aW9uIHBhY2thZ2Ugb2YgdGhlIGFzc2V0CisKKyNJbmZvcm1hdGlvbmFsIGFydGlmYWN0cyBwbGFjZUhvbGRlcgorZXhjbHVkZVJlc291cmNlQ2F0ZWdvcnk6CisgIC0gR2VuZXJpYworaW5mb3JtYXRpb25hbFJlc291cmNlQXJ0aWZhY3RzOgorICBmZWF0dXJlczoKKyAgICAgIGRpc3BsYXlOYW1lOiBGZWF0dXJlcworICAgICAgdHlwZTogT1RIRVIKKyAgY2FwYWNpdHk6CisgICAgICBkaXNwbGF5TmFtZTogQ2FwYWNpdHkKKyAgICAgIHR5cGU6IE9USEVSCisgIHZlbmRvclRlc3RSZXN1bHQ6CisgICAgICBkaXNwbGF5TmFtZTogVmVuZG9yIFRlc3QgUmVzdWx0CisgICAgICB0eXBlOiBPVEhFUgorICB0ZXN0U2NyaXB0czoKKyAgICAgIGRpc3BsYXlOYW1lOiBUZXN0IFNjcmlwdHMKKyAgICAgIHR5cGU6IE9USEVSCisgIGNsb3VkUXVlc3Rpb25uYWlyZToKKyAgICAgIGRpc3BsYXlOYW1lOiBDbG91ZCBRdWVzdGlvbm5haXJlIChjb21wbGV0ZWQpCisgICAgICB0eXBlOiBPVEhFUgorICBIRUFUVGVtcGxhdGVGcm9tVmVuZG9yOgorICAgICAgZGlzcGxheU5hbWU6IEhFQVQgVGVtcGxhdGUgZnJvbSBWZW5kb3IKKyAgICAgIHR5cGU6IEhFQVQKKyAgcmVzb3VyY2VTZWN1cml0eVRlbXBsYXRlOgorICAgICAgZGlzcGxheU5hbWU6IFJlc291cmNlIFNlY3VyaXR5IFRlbXBsYXRlCisgICAgICB0eXBlOiBPVEhFUgorCitleGNsdWRlU2VydmljZUNhdGVnb3J5OgorCitpbmZvcm1hdGlvbmFsU2VydmljZUFydGlmYWN0czoKKyAgc2VydmljZUFydGlmYWN0UGxhbjoKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlIEFydGlmYWN0IFBsYW4KKyAgICAgIHR5cGU6IE9USEVSCisgIHN1bW1hcnlPZkltcGFjdHNUb0VDT01QRWxlbWVudHM6CisgICAgICBkaXNwbGF5TmFtZTogU3VtbWFyeSBvZiBpbXBhY3RzIHRvIEVDT01QIGVsZW1lbnRzLE9TU3MsIEJTU3MKKyAgICAgIHR5cGU6IE9USEVSCisgIGNvbnRyb2xMb29wRnVuY3Rpb25zOgorICAgICAgZGlzcGxheU5hbWU6IENvbnRyb2wgTG9vcCBGdW5jdGlvbnMKKyAgICAgIHR5cGU6IE9USEVSCisgIGRpbWVuc2lvbmluZ0luZm86CisgICAgICBkaXNwbGF5TmFtZTogRGltZW5zaW9uaW5nIEluZm8KKyAgICAgIHR5cGU6IE9USEVSCisgIGFmZmluaXR5UnVsZXM6CisgICAgICBkaXNwbGF5TmFtZTogQWZmaW5pdHkgUnVsZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIG9wZXJhdGlvbmFsUG9saWNpZXM6CisgICAgICBkaXNwbGF5TmFtZTogT3BlcmF0aW9uYWwgUG9saWNpZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIHNlcnZpY2VTcGVjaWZpY1BvbGljaWVzOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2Utc3BlY2lmaWMgUG9saWNpZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIGVuZ2luZWVyaW5nUnVsZXM6CisgICAgICBkaXNwbGF5TmFtZTogRW5naW5lZXJpbmcgUnVsZXMgKEVSRCkKKyAgICAgIHR5cGU6IE9USEVSCisgIGRpc3RyaWJ1dGlvbkluc3RydWN0aW9uczoKKyAgICAgIGRpc3BsYXlOYW1lOiBEaXN0cmlidXRpb24gSW5zdHJ1Y3Rpb25zCisgICAgICB0eXBlOiBPVEhFUgorICBjZXJ0aWZpY2F0aW9uVGVzdFJlc3VsdHM6CisgICAgICBkaXNwbGF5TmFtZTogVEQgQ2VydGlmaWNhdGlvbiBUZXN0IFJlc3VsdHMKKyAgICAgIHR5cGU6IE9USEVSCisgIGRlcGxveW1lbnRWb3RpbmdSZWNvcmQ6CisgICAgICBkaXNwbGF5TmFtZTogRGVwbG95bWVudCBWb3RpbmcgUmVjb3JkCisgICAgICB0eXBlOiBPVEhFUgorICBzZXJ2aWNlUXVlc3Rpb25uYWlyZToKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlIFF1ZXN0aW9ubmFpcmUKKyAgICAgIHR5cGU6IE9USEVSCisgIHNlcnZpY2VTZWN1cml0eVRlbXBsYXRlOgorICAgICAgZGlzcGxheU5hbWU6IFNlcnZpY2UgU2VjdXJpdHkgVGVtcGxhdGUKKyAgICAgIHR5cGU6IE9USEVSCisKK3NlcnZpY2VBcGlBcnRpZmFjdHM6CisgIGNvbmZpZ3VyYXRpb246CisgICAgICBkaXNwbGF5TmFtZTogQ29uZmlndXJhdGlvbgorICAgICAgdHlwZTogT1RIRVIKKyAgaW5zdGFudGlhdGlvbjoKKyAgICAgIGRpc3BsYXlOYW1lOiBJbnN0YW50aWF0aW9uCisgICAgICB0eXBlOiBPVEhFUgorICBtb25pdG9yaW5nOgorICAgICAgZGlzcGxheU5hbWU6IE1vbml0b3JpbmcKKyAgICAgIHR5cGU6IE9USEVSCisgIHJlcG9ydGluZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBSZXBvcnRpbmcKKyAgICAgIHR5cGU6IE9USEVSCisgIGxvZ2dpbmc6CisgICAgICBkaXNwbGF5TmFtZTogTG9nZ2luZworICAgICAgdHlwZTogT1RIRVIKKyAgdGVzdGluZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBUZXN0aW5nCisgICAgICB0eXBlOiBPVEhFUgorCisKK2FkZGl0aW9uYWxJbmZvcm1hdGlvbk1heE51bWJlck9mS2V5czogNTAKKworc3lzdGVtTW9uaXRvcmluZzoKKyAgICBlbmFibGVkOiB0cnVlCisgICAgaXNQcm94eTogZmFsc2UKKyAgICBwcm9iZUludGVydmFsSW5TZWNvbmRzOiAxNQorZGVmYXVsdEhlYXRBcnRpZmFjdFRpbWVvdXRNaW51dGVzOiA2MAorCitzZXJ2aWNlRGVwbG95bWVudEFydGlmYWN0czoKKyAgICBZQU5HX1hNTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgVk5GX0NBVEFMT0c6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIE1PREVMX0lOVkVOVE9SWV9QUk9GSUxFOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBNT0RFTF9RVUVSWV9TUEVDOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBBQUlfU0VSVklDRV9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgQUFJX1ZGX01PRFVMRV9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgQUFJX1ZGX0lOU1RBTkNFX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBPVEhFUjoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKworCityZXNvdXJjZURlcGxveW1lbnRBcnRpZmFjdHM6CisgICAgSEVBVDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEhFQVRfVk9MOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5YW1sCisgICAgICAgICAgICAtIHltbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgSEVBVF9ORVQ6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHlhbWwKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBIRUFUX05FU1RFRDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEhFQVRfQVJUSUZBQ1Q6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBZQU5HX1hNTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBWTkZfQ0FUQUxPRzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBWRl9MSUNFTlNFOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIFZFTkRPUl9MSUNFTlNFOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIE1PREVMX0lOVkVOVE9SWV9QUk9GSUxFOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIE1PREVMX1FVRVJZX1NQRUM6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgQVBQQ19DT05GSUc6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyAgICAjRENBRSBBcnRpZmFjdHMKKyAgICBEQ0FFX1RPU0NBOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisgICAgRENBRV9KU09OOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBqc29uCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyAgICBEQ0FFX1BPTElDWToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0gZW1mCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyAgICBEQ0FFX0RPQzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIERDQUVfRVZFTlQ6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyNBQUkgQXJ0aWZhY3RzCisgICAgQUFJX1ZGX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIEFBSV9WRl9NT0RVTEVfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisgICAgT1RIRVI6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKworcmVzb3VyY2VJbnN0YW5jZURlcGxveW1lbnRBcnRpZmFjdHM6CisgICAgSEVBVF9FTlY6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIGVudgorICAgIFZGX01PRFVMRVNfTUVUQURBVEE6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIGpzb24KKyNEQ0FFX1ZGIEluc3RhbmNlIEFydGlmYWN0cworICAgIERDQUVfSU5WRU5UT1JZX1RPU0NBOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgICAgIC0geWFtbAorICAgIERDQUVfSU5WRU5UT1JZX0pTT046CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIGpzb24KKyAgICBEQ0FFX0lOVkVOVE9SWV9QT0xJQ1k6CisgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBlbWYKKyAgICBEQ0FFX0lOVkVOVE9SWV9ET0M6CisgICAgICBhY2NlcHRlZFR5cGVzOgorICAgIERDQUVfSU5WRU5UT1JZX0JMVUVQUklOVDoKKyAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgRENBRV9JTlZFTlRPUllfRVZFTlQ6CisgICAgICBhY2NlcHRlZFR5cGVzOgorcmVzb3VyY2VJbmZvcm1hdGlvbmFsRGVwbG95ZWRBcnRpZmFjdHM6CisKKworcmVxdWlyZW1lbnRzVG9GdWxmaWxsQmVmb3JlQ2VydDoKKworY2FwYWJpbGl0aWVzVG9Db25zdW1lQmVmb3JlQ2VydDoKKwordW5Mb2dnZWRVcmxzOgorICAgLSAvc2RjMi9yZXN0L2hlYWx0aENoZWNrCisKK2NsZWFuQ29tcG9uZW50c0NvbmZpZ3VyYXRpb246CisgICAgY2xlYW5JbnRlcnZhbEluTWludXRlczogMTQ0MAorICAgIGNvbXBvbmVudHNUb0NsZWFuOgorICAgICAgIC0gUmVzb3VyY2UKKyAgICAgICAtIFNlcnZpY2UKKworYXJ0aWZhY3RzSW5kZXg6IHJlc291cmNlcworCitoZWF0RW52QXJ0aWZhY3RIZWFkZXI6CisgICAgIiIKK2hlYXRFbnZBcnRpZmFjdEZvb3RlcjoKKyAgICAiIgorCitvbmJvYXJkaW5nOgorICAgIHByb3RvY29sOiBodHRwCisgICAgaG9zdDogPCU9IEBob3N0X2lwICU+CisgICAgcG9ydDogPCU9IEBjYXRhbG9nX3BvcnQgJT4KKyAgICBkb3dubG9hZENzYXJVcmk6ICIvb25ib2FyZGluZy1hcGkvdjEuMC92ZW5kb3Itc29mdHdhcmUtcHJvZHVjdHMvcGFja2FnZXMiCisKKworIyAjR1NTIElETlMKK3N3aXRjaG92ZXJEZXRlY3RvcjoKKyAgICBnQmVGcWRuOiAKKyAgICBnRmVGcWRuOiAKKyAgICBiZVZpcDogMS4yLjMuNAorICAgIGZlVmlwOiAxLjIuMy40CisgICAgYmVSZXNvbHZlQXR0ZW1wdHM6IDMKKyAgICBmZVJlc29sdmVBdHRlbXB0czogMworICAgIGVuYWJsZWQ6IGZhbHNlCisgICAgaW50ZXJ2YWw6IDYwCisgICAgY2hhbmdlUHJpb3JpdHlVc2VyOiBlY29tcGFzZGMKKyAgICBjaGFuZ2VQcmlvcml0eVBhc3N3b3JkOiBlY29tcGFzZGMxMjMKKyAgICBwdWJsaXNoTmV0d29ya1VybDogCisgICAgcHVibGlzaE5ldHdvcmtCb2R5OiAneyJub3RlIjoiY29tbWVudCJ9JworICAgIGdyb3VwczoKKyAgICAgIGJlU2V0OiB7IGNoYW5nZVByaW9yaXR5VXJsOiAiIiwgY2hhbmdlUHJpb3JpdHlCb2R5OiAneyJuYW1lIjoiIiwidXJpIjoiIiwibm9fYWRfcmVkaXJlY3Rpb24iOmZhbHNlLCJ2NGdyb3VwcyI6eyJmYWlsb3Zlcl9ncm91cHMiOlsiIiwiIiwiZmFpbG92ZXJfcG9saWN5IjpbIkZBSUxBTEwiXX0sImNvbW1lbnQiOiIiLCJpbnRlbmRlZF9hcHBfcHJvdG8iOiJETlMifSd9CisgICAgICBmZVNldDogeyBjaGFuZ2VQcmlvcml0eVVybDogIiIsIGNoYW5nZVByaW9yaXR5Qm9keTogJ3sibmFtZSI6IiIsInVyaSI6IiIsIm5vX2FkX3JlZGlyZWN0aW9uIjpmYWxzZSwidjRncm91cHMiOnsiZmFpbG92ZXJfZ3JvdXBzIjpbIiIsIiJdLCJmYWlsb3Zlcl9wb2xpY3kiOlsiRkFJTEFMTCJdfSwiY29tbWVudCI6IiIsImludGVuZGVkX2FwcF9wcm90byI6IkROUyJ9J30KKworYXBwbGljYXRpb25MMUNhY2hlOgorICAgIGRhdGF0eXBlczoKKyAgICAgICAgZW5hYmxlZDogdHJ1ZQorICAgICAgICBmaXJzdFJ1bkRlbGF5OiAxMAorICAgICAgICBwb2xsSW50ZXJ2YWxJblNlYzogNjAKKworYXBwbGljYXRpb25MMkNhY2hlOgorICAgIGVuYWJsZWQ6IHRydWUKKyAgICBjYXRhbG9nTDFDYWNoZToKKyAgICAgICAgZW5hYmxlZDogdHJ1ZQorICAgICAgICByZXNvdXJjZXNTaXplSW5DYWNoZTogMzAwCisgICAgICAgIHNlcnZpY2VzU2l6ZUluQ2FjaGU6IDIwMAorICAgICAgICBwcm9kdWN0c1NpemVJbkNhY2hlOiAxMDAKKyAgICBxdWV1ZToKKyAgICAgICAgc3luY0ludGVydmFsSW5TZWNvbmRlczogNDMyMDAKKyAgICAgICAgd2FpdE9uU2h1dERvd25Jbk1pbnV0ZXM6IDEwCisgICAgICAgIG51bWJlck9mQ2FjaGVXb3JrZXJzOiA0CisKK3Rvc2NhVmFsaWRhdG9yczoKKyAgICBzdHJpbmdNYXhMZW5ndGg6IDY1NTM2CisKK2Rpc2FibGVBdWRpdDogZmFsc2UKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvdGVtcGxhdGVzL2RlZmF1bHQvQkUtZGlzdHJpYnV0aW9uLWVuZ2luZS1jb25maWd1cmF0aW9uLnlhbWwuZXJiIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS90ZW1wbGF0ZXMvZGVmYXVsdC9CRS1kaXN0cmlidXRpb24tZW5naW5lLWNvbmZpZ3VyYXRpb24ueWFtbC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxZjZhOQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvdGVtcGxhdGVzL2RlZmF1bHQvQkUtZGlzdHJpYnV0aW9uLWVuZ2luZS1jb25maWd1cmF0aW9uLnlhbWwuZXJiCkBAIC0wLDAgKzEsNDQgQEAKK3VlYlNlcnZlcnM6CisgICAgPCUgbm9kZVsnVUVCJ11bJ2ZxZG4nXS5lYWNoIGRvIHxjb25ufCAtJT4KKyAgICAgICAgLSA8JT0gY29ubiAlPgorICAgIDwlIGVuZCAtJT4KKwordWViUHVibGljS2V5OiA8JT0gbm9kZVsnVUVCJ11bJ1B1YmxpY0tleSddICU+Cit1ZWJTZWNyZXRLZXk6IDwlPSBub2RlWydVRUInXVsnU2VjcmV0S2V5J10gJT4KKworZGlzdHJpYnV0aW9uTm90aWZUb3BpY05hbWU6ICBTREMtRElTVFItTk9USUYtVE9QSUMKK2Rpc3RyaWJ1dGlvblN0YXR1c1RvcGljTmFtZTogU0RDLURJU1RSLVNUQVRVUy1UT1BJQworCitpbml0UmV0cnlJbnRlcnZhbFNlYzogNQoraW5pdE1heEludGVydmFsU2VjOiA2MAorCitkaXN0cmliTm90aWZTZXJ2aWNlQXJ0aWZhY3RUeXBlczoKKyAgaW5mbzoKKyAgICAgIC0gTVVSQU5PLVBLRworCitkaXN0cmliTm90aWZSZXNvdXJjZUFydGlmYWN0VHlwZXM6CisgIGxpZmVjeWNsZToKKyAgICAgIC0gSEVBVAorICAgICAgLSBERy1YTUwKKworZW52aXJvbm1lbnRzOgorICAgLSA8JT0gbm9kZS5jaGVmX2Vudmlyb25tZW50ICU+CisKK2Rpc3RyaWJ1dGlvblN0YXR1c1RvcGljOgorICAgcG9sbGluZ0ludGVydmFsU2VjOiA2MAorICAgZmV0Y2hUaW1lU2VjOiAxNQorICAgY29uc3VtZXJHcm91cDogc2RjLTwlPSBub2RlLmNoZWZfZW52aXJvbm1lbnQgJT4KKyAgIGNvbnN1bWVySWQ6IHNkYy08JT0gbm9kZS5jaGVmX2Vudmlyb25tZW50ICU+MQorCisKK2Rpc3RyaWJ1dGlvbk5vdGlmaWNhdGlvblRvcGljOgorICAgbWluVGhyZWFkUG9vbFNpemU6IDAKKyAgIG1heFRocmVhZFBvb2xTaXplOiAxMAorICAgbWF4V2FpdGluZ0FmdGVyU2VuZGluZ1NlY29uZHM6IDUKKworY3JlYXRlVG9waWM6CisgICBwYXJ0aXRpb25Db3VudDogMQorICAgcmVwbGljYXRpb25Db3VudDogMQorCitzdGFydERpc3RyaWJ1dGlvbkVuZ2luZTogdHJ1ZQorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3RlbXBsYXRlcy9kZWZhdWx0L0JFLWVsYXN0aWNzZWFyY2gueW1sLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvdGVtcGxhdGVzL2RlZmF1bHQvQkUtZWxhc3RpY3NlYXJjaC55bWwuZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTI4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3RlbXBsYXRlcy9kZWZhdWx0L0JFLWVsYXN0aWNzZWFyY2gueW1sLmVyYgpAQCAtMCwwICsxLDExIEBACitkaXNjb3ZlcnkuemVuLnBpbmcubXVsdGljYXN0LmVuYWJsZWQ6IGZhbHNlCitkaXNjb3ZlcnkuemVuLnBpbmcudW5pY2FzdC5lbmFibGVkOiB0cnVlCitub2RlLm5hbWU6IDwlPSBub2RlWzpob3N0bmFtZV0gJT4KK2NsdXN0ZXIubmFtZTogPCU9IEBjbHVzdGVyX25hbWUgJT4KK25vZGUubWFzdGVyOiBmYWxzZQorbm9kZS5kYXRhOiBmYWxzZQoraHR0cC5jb3JzLmVuYWJsZWQ6IHRydWUKK3BhdGguaG9tZTogIi92YXIvbGliL2pldHR5L2NvbmZpZyIKK2VsYXN0aWNTZWFyY2gudHJhbnNwb3J0Y2xpZW50OiB0cnVlCit0cmFuc3BvcnQuY2xpZW50LmluaXRpYWxfbm9kZXM6CisgICAtIDwlPSBAZXNfaG9zdF9pcCAlPjo5MzAwCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3RlbXBsYXRlcy9kZWZhdWx0L0JFLXBvcnRhbC5wcm9wZXJ0aWVzLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctYmUvdGVtcGxhdGVzL2RlZmF1bHQvQkUtcG9ydGFsLnByb3BlcnRpZXMuZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjNjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3RlbXBsYXRlcy9kZWZhdWx0L0JFLXBvcnRhbC5wcm9wZXJ0aWVzLmVyYgpAQCAtMCwwICsxLDMyIEBACisjIFBvcnRhbCBSRVNUIFVSTCwgZW5kcyAiL2F1eGFwaSIKK2Vjb21wX3Jlc3RfdXJsID0gPCU9IEBlY29tcF9yZXN0X3VybCAlPgorCisjIEphdmEgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlCitwb3J0YWwuYXBpLmltcGwuY2xhc3MgPSBvcmcub3BlbmVjb21wLnNkYy5iZS5lY29tcC5FY29tcEludEltcGwKKworIyBDU1AtU1NPIFVSTAorCitlY29tcF9yZWRpcmVjdF91cmwgPSA8JT0gQGVjb21wX3JlZGlyZWN0X3VybCAlPgorCisjIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFVFQiBzZXJ2ZXIgbmFtZXMKKwordWViX3VybF9saXN0ID0gPCU9IEB1ZWJfdXJsX2xpc3QgJT4KKworIyBVRUIgdG9waWMgd2hlcmUgUG9ydGFsIGxpc3RlbnMKK2Vjb21wX3BvcnRhbF9pbmJveF9uYW1lID0gPCU9IEBpbmJveF9uYW1lICU+CisKKyMgVUVCIGtleSBnZW5lcmF0ZWQgd2hpbGUgb24tYm9hcmRpbmcKK3VlYl9hcHBfa2V5ID0gPCU9IEBhcHBfa2V5ICU+CisKKyMgVUVCIHNlY3JldCBnZW5lcmF0ZWQgd2hpbGUgb24tYm9hcmRpbmcKK3VlYl9hcHBfc2VjcmV0ID0gPCU9IEBhcHBfc2VjcmV0ICU+CisKKyMgVUVCIHRvcGljIHdoZXJlIEFwcCBsaXN0ZW5zCit1ZWJfYXBwX21haWxib3hfbmFtZSA9IDwlPSBAYXBwX3RvcGljX25hbWUgJT4KKworIyBDb25zdW1lciBncm91cCBuYW1lOyBtb3N0IEFwcHMgc2hvdWxkIHVzZSB7VVVJRH0KK3VlYl9hcHBfY29uc3VtZXJfZ3JvdXBfbmFtZSA9IHtVVUlEfQorCit1ZWJfbGlzdGVuZXJzX2VuYWJsZSA9IHRydWUKKworZGVjcnlwdGlvbl9rZXkgPSA8JT0gQGRlY3J5cHRfa2V5ICU+CmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL3RlbXBsYXRlcy9kZWZhdWx0L0JFLXRpdGFuLnByb3BlcnRpZXMuZXJiIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS90ZW1wbGF0ZXMvZGVmYXVsdC9CRS10aXRhbi5wcm9wZXJ0aWVzLmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzM4NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1iZS90ZW1wbGF0ZXMvZGVmYXVsdC9CRS10aXRhbi5wcm9wZXJ0aWVzLmVyYgpAQCAtMCwwICsxLDI0IEBACitzdG9yYWdlLmJhY2tlbmQ9Y2Fzc2FuZHJhCitzdG9yYWdlLmhvc3RuYW1lPTwlPSBAQ0FTU0FORFJBX0lQICU+CitzdG9yYWdlLnBvcnQ9OTE2MAorc3RvcmFnZS51c2VybmFtZT08JT0gQENBU1NBTkRSQV9VU1IgJT4KK3N0b3JhZ2UucGFzc3dvcmQ9PCU9IEBDQVNTQU5EUkFfUFdEICU+CitzdG9yYWdlLmNvbm5lY3Rpb24tdGltZW91dD0xMDAwMAorCitzdG9yYWdlLmNhc3NhbmRyYS5zc2wuZW5hYmxlZD1mYWxzZQorc3RvcmFnZS5jYXNzYW5kcmEuc3NsLnRydXN0c3RvcmUubG9jYXRpb249L3Zhci9saWIvamV0dHkvY29uZmlnLy50cnVzdHN0b3JlCitzdG9yYWdlLmNhc3NhbmRyYS5zc2wudHJ1c3RzdG9yZS5wYXNzd29yZD1BYTEyMzQ1NgorCitjYWNoZS5kYi1jYWNoZSA9IGZhbHNlCitjYWNoZS5kYi1jYWNoZS1jbGVhbi13YWl0ID0gMjAKK2NhY2hlLmRiLWNhY2hlLXRpbWUgPSAxODAwMDAKK2NhY2hlLmRiLWNhY2hlLXNpemUgPSAwLjUKKworc3RvcmFnZS5jYXNzYW5kcmEucmVhZC1jb25zaXN0ZW5jeS1sZXZlbD1MT0NBTF9RVU9SVU0KK3N0b3JhZ2UuY2Fzc2FuZHJhLndyaXRlLWNvbnNpc3RlbmN5LWxldmVsPUxPQ0FMX1FVT1JVTQorc3RvcmFnZS5jYXNzYW5kcmEucmVwbGljYXRpb24tc3RyYXRlZ3ktY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5OZXR3b3JrVG9wb2xvZ3lTdHJhdGVneQorc3RvcmFnZS5jYXNzYW5kcmEucmVwbGljYXRpb24tc3RyYXRlZ3ktb3B0aW9ucz08JT0gQERDX05BTUUgJT4sPCU9IEByZXBfZmFjdG9yICU+CitzdG9yYWdlLmNhc3NhbmRyYS5hc3R5YW5heC5sb2NhbC1kYXRhY2VudGVyPTwlPSBARENfTkFNRSAlPgorCitzdG9yYWdlLmxvY2sucmV0cmllcz01CitzdG9yYWdlLmxvY2sud2FpdC10aW1lPTUwMApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9hdHRyaWJ1dGVzL2RlZmF1bHQucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJkNjAwCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9hdHRyaWJ1dGVzL2RlZmF1bHQucmIKQEAgLTAsMCArMSBAQAorIwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9maWxlcy9kZWZhdWx0L2NoZWNrX0JhY2tlbmRfSGVhbHRoLnB5IGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9maWxlcy9kZWZhdWx0L2NoZWNrX0JhY2tlbmRfSGVhbHRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZWJjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL2ZpbGVzL2RlZmF1bHQvY2hlY2tfQmFja2VuZF9IZWFsdGgucHkKQEAgLTAsMCArMSw1MSBAQAorIyEvdXNyL2Jpbi9weXRob24KK2ltcG9ydCBzdWJwcm9jZXNzCisjZnJvbSB0aW1lIGltcG9ydCBzbGVlcAoraW1wb3J0IHRpbWUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisKK2NsYXNzIGJjb2xvcnM6CisgICAgSEVBREVSICAgID0gJ1wwMzNbOTVtJworICAgIE9LQkxVRSAgICA9ICdcMDMzWzk0bScKKyAgICBPS0dSRUVOICAgPSAnXDAzM1s5Mm0nCisgICAgV0FSTklORyAgID0gJ1wwMzNbOTNtJworICAgIEZBSUwgICAgICA9ICdcMDMzWzkxbScKKyAgICBFTkRDICAgICAgPSAnXDAzM1swbScKKyAgICBCT0xEICAgICAgPSAnXDAzM1sxbScKKyAgICBVTkRFUkxJTkUgPSAnXDAzM1s0bScKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgRnVuY3Rpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RlZiBjaGVja0JhY2tlbmQoKToKKyAgICBjb21tYW5kPSJjdXJsIC1zIC1vIC9kZXYvbnVsbCAtSSAtdyBcIiV7aHR0cF9jb2RlfVwiIC1pIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zZGMyL3Jlc3QvdjEvdXNlci9qaDAwMDMiCisKKyAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbiggY29tbWFuZCAsIHNoZWxsPVRydWUgLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFICkKKyAgICAob3V0LCBlcnIpID0gcHJvYy5jb21tdW5pY2F0ZSgpCisgICAgcmVzdWx0ID0gb3V0LnN0cmlwKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICBNYWluCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2JlU3RhdD0wCisKK2ZvciBpIGluIHJhbmdlKDEsMTApOgorICAgIG15UmVzdWx0ID0gY2hlY2tCYWNrZW5kKCkKKyAgICBpZiBteVJlc3VsdCA9PSAnMjAwJzoKKyAgICAgICAgcHJpbnQgJ1tJTkZPXTogQmFja2VuZCBpcyB1cCBhbmQgcnVubmluZycKKyAgICAgICAgYmVTdGF0PTEKKyAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBjdXJyZW50VGltZSA9IGRhdGV0aW1lLm5vdygpCisgICAgICAgIHByaW50ICdbRVJST1JdOiAnICsgY3VycmVudFRpbWUuc3RyZnRpbWUoJyVZLyVtLyVkICVIOiVNOiVTJykgKyBiY29sb3JzLkZBSUwgKyAnIEJhY2tlbmQgbm90IHJlc3BvbmRpbmcsIHRyeSAjJyArIHN0cihpKSArIGJjb2xvcnMuRU5EQworICAgICAgICB0aW1lLnNsZWVwKDEwKQorCitpZiBiZVN0YXQgPT0gMDoKKyAgICBwcmludCAnW0VSUk9SXTogJyArIHRpbWUuc3RyZnRpbWUoJyVZLyVtLyVkICVIOiVNOiVTJykgKyBiY29sb3JzLkZBSUwgKyAnQmFja2VuZCBpcyBET1dOIDotKCcgKyBiY29sb3JzLkVOREMKKyAgICBleGl0KCkKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9maWxlcy9kZWZhdWx0L2dldC1waXAucHkgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL2ZpbGVzL2RlZmF1bHQvZ2V0LXBpcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2VlNjUyCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9maWxlcy9kZWZhdWx0L2dldC1waXAucHkKQEAgLTAsMCArMSwxNzc2MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEhpIFRoZXJlIQorIyBZb3UgbWF5IGJlIHdvbmRlcmluZyB3aGF0IHRoaXMgZ2lhbnQgYmxvYiBvZiBiaW5hcnkgZGF0YSBoZXJlIGlzLCB5b3UgbWlnaHQKKyMgZXZlbiBiZSB3b3JyaWVkIHRoYXQgd2UncmUgdXAgdG8gc29tZXRoaW5nIG5lZmFyaW91cyAoZ29vZCBmb3IgeW91IGZvciBiZWluZworIyBwYXJhbm9pZCEpLiBUaGlzIGlzIGEgYmFzZTg1IGVuY29kaW5nIG9mIGEgemlwIGZpbGUsIHRoaXMgemlwIGZpbGUgY29udGFpbnMKKyMgYW4gZW50aXJlIGNvcHkgb2YgcGlwLgorIworIyBQaXAgaXMgYSB0aGluZyB0aGF0IGluc3RhbGxzIHBhY2thZ2VzLCBwaXAgaXRzZWxmIGlzIGEgcGFja2FnZSB0aGF0IHNvbWVvbmUKKyMgbWlnaHQgd2FudCB0byBpbnN0YWxsLCBlc3BlY2lhbGx5IGlmIHRoZXkncmUgbG9va2luZyB0byBydW4gdGhpcyBnZXQtcGlwLnB5CisjIHNjcmlwdC4gUGlwIGhhcyBhIGxvdCBvZiBjb2RlIHRvIGRlYWwgd2l0aCB0aGUgc2VjdXJpdHkgb2YgaW5zdGFsbGluZworIyBwYWNrYWdlcywgdmFyaW91cyBlZGdlIGNhc2VzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLCBhbmQgb3RoZXIgc3VjaCBzb3J0IG9mCisjICJ0cmliYWwga25vd2xlZGdlIiB0aGF0IGhhcyBiZWVuIGVuY29kZWQgaW4gaXRzIGNvZGUgYmFzZS4gQmVjYXVzZSBvZiB0aGlzCisjIHdlIGJhc2ljYWxseSBpbmNsdWRlIGFuIGVudGlyZSBjb3B5IG9mIHBpcCBpbnNpZGUgdGhpcyBibG9iLiBXZSBkbyB0aGlzCisjIGJlY2F1c2UgdGhlIGFsdGVybmF0aXZlcyBhcmUgYXR0ZW1wdCB0byBpbXBsZW1lbnQgYSAibWluaXBpcCIgdGhhdCBwcm9iYWJseQorIyBkb2Vzbid0IGRvIHRoaW5ncyBjb3JyZWN0bHkgYW5kIGhhcyB3ZWlyZCBlZGdlIGNhc2VzLCBvciBjb21wcmVzcyBwaXAgaXRzZWxmCisjIGRvd24gaW50byBhIHNpbmdsZSBmaWxlLgorIworIyBJZiB5b3UncmUgd29uZGVyaW5nIGhvdyB0aGlzIGlzIGNyZWF0ZWQsIGl0IGlzIHVzaW5nIGFuIGludm9rZSB0YXNrIGxvY2F0ZWQKKyMgaW4gdGFza3MvZ2VuZXJhdGUucHkgY2FsbGVkICJpbnN0YWxsZXIiLiBJdCBjYW4gYmUgaW52b2tlZCBieSB1c2luZworIyBgYGludm9rZSBnZW5lcmF0ZS5pbnN0YWxsZXJgYC4KKworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBwa2d1dGlsCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgc3RydWN0CitpbXBvcnQgdGVtcGZpbGUKKworIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgorUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyCitQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKKworaWYgUFkzOgorICAgIGl0ZXJieXRlcyA9IGl0ZXIKK2Vsc2U6CisgICAgZGVmIGl0ZXJieXRlcyhidWYpOgorICAgICAgICByZXR1cm4gKG9yZChieXRlKSBmb3IgYnl0ZSBpbiBidWYpCisKK3RyeToKKyAgICBmcm9tIGJhc2U2NCBpbXBvcnQgYjg1ZGVjb2RlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2I4NWFscGhhYmV0ID0gKGIiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAgICAgICAgICBiImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6ISMkJSYoKSorLTs8PT4/QF5fYHt8fX4iKQorCisgICAgZGVmIGI4NWRlY29kZShiKToKKyAgICAgICAgX2I4NWRlYyA9IFtOb25lXSAqIDI1NgorICAgICAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoaXRlcmJ5dGVzKF9iODVhbHBoYWJldCkpOgorICAgICAgICAgICAgX2I4NWRlY1tjXSA9IGkKKworICAgICAgICBwYWRkaW5nID0gKC1sZW4oYikpICUgNQorICAgICAgICBiID0gYiArIGInficgKiBwYWRkaW5nCisgICAgICAgIG91dCA9IFtdCisgICAgICAgIHBhY2tJID0gc3RydWN0LlN0cnVjdCgnIUknKS5wYWNrCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihiKSwgNSk6CisgICAgICAgICAgICBjaHVuayA9IGJbaTppICsgNV0KKyAgICAgICAgICAgIGFjYyA9IDAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBpdGVyYnl0ZXMoY2h1bmspOgorICAgICAgICAgICAgICAgICAgICBhY2MgPSBhY2MgKiA4NSArIF9iODVkZWNbY10KKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgZm9yIGosIGMgaW4gZW51bWVyYXRlKGl0ZXJieXRlcyhjaHVuaykpOgorICAgICAgICAgICAgICAgICAgICBpZiBfYjg1ZGVjW2NdIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWQgYmFzZTg1IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAlZCcgJSAoaSArIGopCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHBhY2tJKGFjYykpCisgICAgICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Jhc2U4NSBvdmVyZmxvdyBpbiBodW5rIHN0YXJ0aW5nIGF0IGJ5dGUgJWQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGkpCisKKyAgICAgICAgcmVzdWx0ID0gYicnLmpvaW4ob3V0KQorICAgICAgICBpZiBwYWRkaW5nOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzotcGFkZGluZ10KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBib290c3RyYXAodG1wZGlyPU5vbmUpOgorICAgICMgSW1wb3J0IHBpcCBzbyB3ZSBjYW4gdXNlIGl0IHRvIGluc3RhbGwgcGlwIGFuZCBtYXliZSBzZXR1cHRvb2xzIHRvbworICAgIGltcG9ydCBwaXAKKyAgICBmcm9tIHBpcC5jb21tYW5kcy5pbnN0YWxsIGltcG9ydCBJbnN0YWxsQ29tbWFuZAorCisgICAgIyBXcmFwcGVyIHRvIHByb3ZpZGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBsb3dlc3QgcHJpb3JpdHkKKyAgICBjbGFzcyBDZXJ0SW5zdGFsbENvbW1hbmQoSW5zdGFsbENvbW1hbmQpOgorICAgICAgICBkZWYgcGFyc2VfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgICAgICMgSWYgY2VydCBpc24ndCBzcGVjaWZpZWQgaW4gY29uZmlnIG9yIGVudmlyb25tZW50LCB3ZSBwcm92aWRlIG91cgorICAgICAgICAgICAgIyBvd24gY2VydGlmaWNhdGUgdGhyb3VnaCBkZWZhdWx0cy4KKyAgICAgICAgICAgICMgVGhpcyBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGN1c3RvbSBjZXJ0IGFueXdoZXJlIG9uZSBsaWtlczoKKyAgICAgICAgICAgICMgY29uZmlnLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhcmd2LgorICAgICAgICAgICAgaWYgbm90IHNlbGYucGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpLmNlcnQ6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZGVmYXVsdHNbImNlcnQiXSA9IGNlcnRfcGF0aCAgIyBjYWxjdWxhdGVkIGJlbG93CisgICAgICAgICAgICByZXR1cm4gc3VwZXIoQ2VydEluc3RhbGxDb21tYW5kLCBzZWxmKS5wYXJzZV9hcmdzKGFyZ3MpCisKKyAgICBwaXAuY29tbWFuZHNfZGljdFsiaW5zdGFsbCJdID0gQ2VydEluc3RhbGxDb21tYW5kCisKKyAgICAjIFdlIGFsd2F5cyB3YW50IHRvIGluc3RhbGwgcGlwCisgICAgcGFja2FnZXMgPSBbInBpcCJdCisKKyAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdXMgbm90IHRvIGluc3RhbGwgc2V0dXB0b29scworICAgIGlmICItLW5vLXNldHVwdG9vbHMiIGluIHN5cy5hcmd2IG9yIG9zLmVudmlyb24uZ2V0KCJQSVBfTk9fU0VUVVBUT09MUyIpOgorICAgICAgICBhcmdzID0gW3ggZm9yIHggaW4gc3lzLmFyZ3ZbMTpdIGlmIHggIT0gIi0tbm8tc2V0dXB0b29scyJdCisgICAgZWxzZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorCisgICAgICAgICMgV2Ugd2FudCB0byBzZWUgaWYgc2V0dXB0b29scyBpcyBhdmFpbGFibGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8KKyAgICAgICAgIyBpbnN0YWxsIGl0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBzZXR1cHRvb2xzICAjIG5vcWEKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFja2FnZXMgKz0gWyJzZXR1cHRvb2xzIl0KKworICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB1cyBub3QgdG8gaW5zdGFsbCB3aGVlbAorICAgIGlmICItLW5vLXdoZWVsIiBpbiBhcmdzIG9yIG9zLmVudmlyb24uZ2V0KCJQSVBfTk9fV0hFRUwiKToKKyAgICAgICAgYXJncyA9IFt4IGZvciB4IGluIGFyZ3MgaWYgeCAhPSAiLS1uby13aGVlbCJdCisgICAgZWxzZToKKyAgICAgICAgIyBXZSB3YW50IHRvIHNlZSBpZiB3aGVlbCBpcyBhdmFpbGFibGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCBpdC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHdoZWVsICAjIG5vcWEKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgYXJncyArPSBbIndoZWVsIl0KKworICAgIGRlbGV0ZV90bXBkaXIgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgIyBDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIGFjdCBhcyBhIHdvcmtpbmcgZGlyZWN0b3J5IGlmIHdlIHdlcmUKKyAgICAgICAgIyBub3QgZ2l2ZW4gb25lLgorICAgICAgICBpZiB0bXBkaXIgaXMgTm9uZToKKyAgICAgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICAgICAgZGVsZXRlX3RtcGRpciA9IFRydWUKKworICAgICAgICAjIFdlIG5lZWQgdG8gZXh0cmFjdCB0aGUgU1NMIGNlcnRpZmljYXRlcyBmcm9tIHJlcXVlc3RzIHNvIHRoYXQgdGhleQorICAgICAgICAjIGNhbiBiZSBwYXNzZWQgdG8gLS1jZXJ0CisgICAgICAgIGNlcnRfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsICJjYWNlcnQucGVtIikKKyAgICAgICAgd2l0aCBvcGVuKGNlcnRfcGF0aCwgIndiIikgYXMgY2VydDoKKyAgICAgICAgICAgIGNlcnQud3JpdGUocGtndXRpbC5nZXRfZGF0YSgicGlwLl92ZW5kb3IucmVxdWVzdHMiLCAiY2FjZXJ0LnBlbSIpKQorCisgICAgICAgICMgRXhlY3V0ZSB0aGUgaW5jbHVkZWQgcGlwIGFuZCB1c2UgaXQgdG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpcCBhbmQKKyAgICAgICAgIyBzZXR1cHRvb2xzIGZyb20gUHlQSQorICAgICAgICBzeXMuZXhpdChwaXAubWFpbihbImluc3RhbGwiLCAiLS11cGdyYWRlIl0gKyBwYWNrYWdlcyArIGFyZ3MpKQorICAgIGZpbmFsbHk6CisgICAgICAgICMgUmVtb3ZlIG91ciB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICAgIGlmIGRlbGV0ZV90bXBkaXIgYW5kIHRtcGRpcjoKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodG1wZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKworZGVmIG1haW4oKToKKyAgICB0bXBkaXIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICAjIENyZWF0ZSBhIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKworICAgICAgICAjIFVucGFjayB0aGUgemlwZmlsZSBpbnRvIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICAgIHBpcF96aXAgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAicGlwLnppcCIpCisgICAgICAgIHdpdGggb3BlbihwaXBfemlwLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGI4NWRlY29kZShEQVRBLnJlcGxhY2UoYiJcbiIsIGIiIikpKQorCisgICAgICAgICMgQWRkIHRoZSB6aXBmaWxlIHRvIHN5cy5wYXRoIHNvIHRoYXQgd2UgY2FuIGltcG9ydCBpdAorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGlwX3ppcCkKKworICAgICAgICAjIFJ1biB0aGUgYm9vdHN0cmFwCisgICAgICAgIGJvb3RzdHJhcCh0bXBkaXI9dG1wZGlyKQorICAgIGZpbmFsbHk6CisgICAgICAgICMgQ2xlYW4gdXAgb3VyIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICBpZiB0bXBkaXI6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisKK0RBVEEgPSBiIiIiCitQKWg+QDZhV0FLMm10ZXk3RHQ1NDAwRVdfMDA2RWkwMDBqRjAwM31sYTQlbjlYPk10QlV0Y2I4ZDdXQnVaYC15S3xLRmQyYnJ3aWtXb19CCis7dSFybjwqcFF9SmZ2eWVHX1ZvZCZBOz1iT2JDRCZEbCM7bUh6V2NqN2t8SmZ2U3ZDITtDR21LN0psXzN5Y2dvNEx1VWFMKVQ4aT4zVWYhCit7Sy0peVVMdlg8NDNyUmxuRFRGS0x0aUN0YUVoR2sxdDY+WTspe1hDaE5fZUhoWWg7bX5lRTdqZkFPYFM9Xz9lbCNtT0NWSTtPdHRUNUM3CispPXl3V3QmUnU7TyhpcyMwMG11UyhUcU1VbW1sT0RRV0V2eHtvQyVnV3E1VTVUM1I5RncqWU1LXiFMbl5iNVhKV3EzPjhZen03aUhLPmltCitldUNTKz8+fnZ1U20zYHhMWX5pcUtWbSMlVCs1eVI+VnhUJVI0Uj1rakhHOWVhPHE7KmE8N0UtIWVDU25KR0BUayhTRnZSaiRTNkVpTDxzCitNcT43JSZPdk9zZEJOOU5UUXVydFVlcXJ1eHl6YntkbjtYT09ZfDEyVDZpWX5IX0tDRUN5R3BfbWh8eyFgd1RgfUhJNkwzPDdIbVNNRHBLCitTdHtSb3ArM0dnaWFGdypPRDgleUhreGRJSDNAK0ZANHlOSlBkZ2UjJTFvMCVBT2VRQlJRJVk+ZzlXTldVdHxWSSoqKTlKIVlidihuWUA1Cit+ZjkqTiM+ZzxAOyp6IWwzXzRjck89WWlzdUdlIz1XRTRTMkZVayU4YXBYWWt0QGFBKV9OVyNDKlZPcThPNXtTZ1cmbj1Rdj52MGF0NzEmCitgVShGMD9ibEYwYkB6clZOQmpUIUlwSiRPeD4lS3I7QFQxaVJYeHZpRnN8VyNCP0ptJkcwPTBzam8jVFFuYFhPPTcqQTRCbH5geExZPHE5CitIVjcoVztfWDMoa2g7Ny1rZDRrdn5eUE5OZn5eUlNLeUU8QEY5M1BObURab2o0KUBAP349M1JuPDx6WkJOYVN1WmJMUSEqTFkzdSFaYTxqCis5UnohWGZgMWt7QyQ1S2tfWT5fTUJWKEM7cFYrOFEpfWpFbncyJEV3X08rNkg4WihGO3pOekdYS0pFKFcyc3ZNfnRaZ2RyelBqS0k1MkpICisocDZQVUk7KyQ1aGpsJkVULWxFZj5ybj9MKlZ9P3kmZz5IdDVoI1M1VGpsdX0rK2BkUFpPbztCWCUkNWFiJVJOKDdEXzZNV3NecUwlbFBGCitLUitWWX1jWTkmUHRZKHQzWkVkeng8dDFZbEhgcVM/VGRyXzReVzlNPXYqMGBTJWR8Y3Nza158ZHw5OCFPSXFUcmVuT2JEKUNVOE8mTGM+CitneE5jPkJ4TT4meTMtMFhaUDlUcU9ZRExST2A9OCh0RThNMyhmcDB0ZH59JHNGQkhmSzFZbFo/OWp4M2xAcDAzKDx0cCZEcl9GJjQzQV9ZCit7SjIkMyFEYCF2ezQobWNRUnBqQ0MyakhoYGlCIVg2I0l9KWdTP1dtR2NMfT4jP2FwcHRyJV9yYThOVDtHcGU+VWokamlIO1QwJCs9WT1BCis8bF5kUFZScGM9OHx2LUdDPVBKaUpxZiE8M0M0VnwxQCEzWXdZZDVFRkJkbEN7UlheQUZWVk92bWBpZXFrYCYhSSlpMStucHRvST5iJStECitiUDkjaE1tO3woZyppLXpSMT5tUTM7Qnh9TTFLO1R9OUIwYnJiMkh0c3ImYUMyRDt+Z1MmWjQ3WTBjPGZuU2l6fV9KN3RidmhSM2ZXPiRhCit0TiVsd15yTTNIVm5LKjVhT1p+UHtLKlJvT2ZxUz1QUUVRdEVySV5tcnwqc0VCZmAzO2t6eTYtRytGSHtzJnchVV5HanxnZEBYO2x7Y2BGCitxKiYwfWFmZ2E3dUVeX3JBS3REeCVmY0Ymb3EtZ2Rpa2B0YV4ofEBIaV4tJkAkLWplfVp4V3hGbnJ+eGEpY1l5Nkdgbjt9JEk4TTkwSHkwCitKNDJjdUhEMztURTQ5d0E7WVZkaCVIRFE0YVItdjhpXnleRmg1UFhJZEdNUXd9VGM0cDJObjZAUEtEdDNjbzNDVUFZT1A3KWc+Y2xOJld1CisjSTZaUWBqTWFMQVdieTs2Z0BxSyNnNmFPbm5Zal92MWp1eEVsJUVqeFZwTiZlRF5OPmBTU0pFViZhOTdLMXh+RExkcWNkb3YyeWA1ayRlCitZN1FEaiZlR3E0TjhSVHwmVT4heT8mYyhHNzNfY2kpNTlVRHhzNzE/cT0oKEIwPmN6bChYdVhHKy05PEZkKzsmR1VWZEkxSytmTTlhV0ohCitofCZRPVRmcU85OXlSTiFxVjVicUFlLVRFUDljdHVYNCope1pKSD9ReEI9bWxVblVhK3wjdXhSZW8peyhgKVhmOEEkc29hWHltU0hYfEQ1CiteSDxGaCZmJnZ5c3FzViE8YllhZ1JWcE1NdDdOa3s3QkU/JVYyS1hGVFRvdXpEZio9JWwjaEUzT29ya1VwWHdmbDVxU011IUc0WUpFeGdlCitvditydGtjR2haRGlIZllCNkE3KFB8aCQoVWBFWChnR1RAa05WYE8yd0ByejlgTiFyaFVjV2BWWUVBQ2s9MUNwZElsM3U0X2R1KDBTbDV9CitEXlozdzQ9JXVidHVSaFQ5WEhhOD87IyhoI2JjU2x4dEJib3hBJFBCLSNiTnVSelkxQnpAaClDSmpKcT57bGBmRWYhIUVLU3A+MTgmKzxJCitRV3V8JSVYMT5oODtYSTE5dHZPLXIoVjcmeylYaFI5TW0wNz93YWZ9JUI1RE9BdyhocEd7eWZOdWg5ejxNPChKKX1CYWIrTlYrMFdwJlN1CithOGExdmhURGFLYEpKT3J3JXc3JVdJYVVwZFlUeFpQfHJiKk4/Sm9jT3w3NStrWGdvIXYqTV5SNnpFelRmfXYyOzgmZkRGSChabCVDJjZ0CitHaU0zRkdDSlgwZmtTT2duR0pacUMxNTdgKnwzYSRWdFZjKiFOQ1J6QXFYSkIjbkdiV0M8b0wjS1dhaFRmb0lxWCVOTWxIUkomQTl9TmBsCisqciRvZ3ojdDFGeDRTVXN6XihVbShFfDxaQ1R3YnlBdGltX1VOWVVrZzc/ezhNclFAWV8/JWZeRGVJa05lNmo4KFJ1Ul9teDVyeXAyTkBTCis/Mz9jdDdAdXF9ViltPHZkJF4rJD9+d2JWPVN3fUY1SmVgV3o0eWl2eTIzS15PdHtobVN9VVpDOz1KJERxaU1ifCZ6cWAmb1l8MEsmYUJ1CitZWlhIe1RPUmdYZWIjVz9gSDhtITVMZ0FUM3IjP31kNGhXckJTbENyI2UjTXA/T2h4N1l1PlFkUklYRWRlSHxgdnNPTnBUWjQxZ2ppITxfCitObHlkcHY4dXBQNW1CWCU2Sm5mYnFobTwyWTRodWhmPHQ2O28pXzIkKzRzd3p9cSVRZFQ1WVJ+US1CakJ7fiNpVnBiMD9BWERBOD9LeDJrCitnVVdGUTZaN1luPlZ6WHx0SUxRZEApX0Z0YWkyKXFmRCFzPndtPzxYKHp+aGtmKmpqdVFlNTZ7NiZkKkxAOzdBVWNmQGRqOXg+ZWtsNThLCitqXzFWSzs2VSU9IXdhaFRQRyVRLTRtdlJVNzFJbFQ9M0VqTT51JXFyMl5KT2hmPkQlcWtmaDFBcH0/KjxHWmRQX0JFTVVnfVpURTQqNG0rCitRKWJnYnFHUkZWcHZAVXQ5JHVjWFF5WVNjd25UOTEqc3wlVm5qJjc8REsycnJPLTNSOFRuUEJzT2VXWjZgejJAbHMlMU4jS311X1IoS0p1CitDJW1tb3A/XzVMMUZ0YSVXYUV1KTZMamFAWUN8RUk3eisjfHAlRmM+SnFwZiZqYCMwdXdCS2ZZbTxBO1ZZJFl0Tmc5bGNGRHd0UkopM1JNCisqVlNHZjttXzhyS2hHQDt3Qj4xPH1scm5wQGN7TFk0TThsRChFRSRvPClqbz9UVT1oIUUpViVHKz82bT9HPVczelUySkdpfjAyOWAwUVkyCisjSWBXR2BGfnBNQThTQSZeUVJLSFhxeStMeVFoP3spSXg1fFh9KXBXZVRFYHt0ZEstTCpjIT8qUjk3aTQjdDlvZj1LIUcweG92PitHaExUCisweEpwVns2KnIzWDd5PjNyRiMwJVhBQUBuWndVMVhrZ0R1TmowNGYhaFVPWUdTYXNqSUQkbiZjYS1ea0Y4akYhYF9rfWcwQ3JxVGdKSUxsCis+Kzg0ST1Xck5MQXN+UXVmT240ZVFNfExRZk1ZIz9FXmI1WFB4QXZXd281WmZvUShsZigzOUpCQj1tOU88ZXkoU258Kns7PjMldXFwRSkmCitpQTs0QmUyN3ZXYVItYnUhdHhISiF7dDtIb1UtX3k1ZT5hPUUjJX4jTFdUJERVYyhJT3wtWE4kdFc1I3BRcG1XRWhLRm43MEYhQiVAQ25OCitAM0pIWUoqZkNhcFZmQlVhM1F5ODxpZUY3YFgqZEF9U3ZNRTtsa2BxJjtzJHIjfTN9IU8/bHN9S1kyKC1ifDlDTSEkdmhiVSlLanJRfW5tCit7dnRCd090YHBrTGx1MSNAZ195QGpnKyZUaFA7TkNQRDE8IVRSPVdPKW5rKjgoIVVDSWM4RG9icnI9alhJT3YqK2pwRGoxX3k5Z1Vwez1ZCitJWns4K3xvMEoqSDBZI0pQNWJ1OD1QRkYoKFNpQHlae1lWc0BRXyNyaW00SFF2MnRRd0BaWWl7I1ktaj9XSzJuTTF4UzkmZFR2aiktU31uCistdUEmYSpnXjArMTAobigyOCtWTUk5XmxEZnw/YmVIaHErPFApcGAlTmJ2bU1pKzZ8dTRhZHFWWDQ3JFkqdXEzNnd1ey04b3VQQyYwJm9uCis8NGtpektlJWZCdHF4V0NLSHNRJE4wUXgoTjRsYiY7Jn41Nytwamhxej9TTn10RGJaQU4/PnJOLWQ4bDY4LWFKOFY+eWI3bzhDVCVzZ2d0Cit4NG9+VENmV05UNUZXVUEqfkx0NCp1Yj8ocCZeY3F9YGxLdmY7KmYzUVo9QFBve2pSTFo4e1BQNyFiIWt3aXhzPzlXR3Z1T303KCpzLUdvCis4PURlYzwydWJQPTtwZ018ZmA0PUBBTW49X2hBMl4rRWxfa35Ie2NiYzVhP3skQTFaIXRxMF4zdXZeVDxiNSN3SHJHOSZLOEZoUCtLO3VFCitoMlFHNWApVyQ7K2I0KyEkSE0/U0ZRX0VaPDJ4T01gc351YjsyLSo+Yk1MZUwqMTFZKis5ZXIpYGJCSzJTWj1NND91My1fJExHO0BXOS1vCis0PG5MYzJnaWVmUip3KlBlRHZeQzhLb1JtOSlydSpaK3J6JDBTJndZbGVDXmdXblVzfGdsZ3BQQU9vUzJGYXh9T3s2b2YqNVEzeHVPMXltCithemg1cHZUISQyJCMxR2Y2Tz91cTM0STgzRyQ0YEh5MmsxMF5IRjc+cUpBeFBrVkU2fSV1X3FURTR8cnIqWHU7K1AqaU5uWXkpKS1qb2tMCitfRTw+I2tPazFMT3RBMUM3cihMQz1rR0F2PURgKSs2QkVSV203dT9sYGFSZXZKQnhWWmNhcmpLTTVqeTF3PWFIQFZoUlZSRzJuVlNhTlFDCispb2hLT1NWREAkbz9mQm9MKURxVmJQfmMpN1BXdDFweiEtRCs4M1RBZTxjSmxrez0rQHVrIWdNNzB1LWRXekgqQ2VIKmFmKDwtYndDUTRaCitvUCpESH5FeCo1JEpUQGsmODdPYVN8X3V6ZDZfMk5GTlZFP0BPMGlGe1N4bD43V3tFRGhFJHp5QGo/MkBQK3AoZlc4dUQtKUchKFJRO0pvCit4YSpRKVMyeWZjM2xYK3RMN05iUFhATzVqNEYjNCFIVDluelFUcio/ZWJMblhyOW9IdVFEcHxYX3h9TTxPOUtRSDAwMDA4MFB+ZD1NQHZiCitoV2l0VCkwN3dEPTAxcDVGMEJ+dD1GSkU3NlZRRnEoVW9MUVlVNkRedSEhUWlSQEJJeyhjNCZ1MiN+RW57aiQ5RzxENzQ4TWt0UUtfUnJjCisrJXZ5PV5UJUFmYjE/TyR3O0dibSpqVEMhMEorPy0tMiY+dEI2TFBsTkJPO2hoOVphY2hTKTltMlkhZkhUZzE5PUktZyk+LTUpVVp5Kl95CitnIzExZShuQzJvJU5GQ3J1TjMtelNIbHlea3Z2JjRUKURBWUV2UjBnXzlQNUIpbSVCayNaa0J2IyZUOCl2IWdxPSElVGFObm1Cd0MhXlB5CittbTU9XkpOPFJueyFsWiktRVgzciVUbVpteXV2fUlxMkVJQVZyWH1POTtfSWR2OW5EZk0kcWN5YWAwWHYyRCRJR3Fgdlgycns4bW0kNkRQCitodXR0WkxnUV5VeSVhKjQ/JUBETiE4KykkZUYjQDZgdG98PmU8LUBYX1RCd0ladl4pSDtAV2IxPTRkaT9QbHBuO3xOVTJDJSlOeThySkV+CitTaUskI1MyOT5YYm5RdW9PbnxnV2F4WEtTdU85S1FIMDAwMDgwUH5kPU4xbmFjcy1fRDcwQ18wQDAxXk5JMEJ+dD1GSmZWSFduKnRgWkRECitSP0Vedjl4OGYkT2NJUCFhYjEpKVY/WTJtdXRJfjtIYlZDPU8/eEAmQ2UxYk1XMzJuc15CWHEjSkVecGNibC09aEVoWDg2I1BOP1AxTFA5CitHQTlvRVotMUoqMTszZFhwK2ZQUWBZYzc4ek9Rc1p3S3R1YWYxZFg3RkU+bmlvdChRRk9HRFZvTkFwbUFhSVNRb15AOEF2SC1DTzV+K3gpCitQNWZ3eCQjYEEqU3VLIVBvZXlxSSNqUD5yKzJBVCV6cjxtdkglPSlXRWIxPG9uS3xTJT5iQi1MUkN8ZlRyNSpGPGJoO2FBVVo5Smo3aHJaCitRa1FBWWloWWZlaUg5Tj1ZMzREbWAwaj0mMXc/OFhfUEF1YjdUeCR3bm1Ia2okKmZSMSYyekt6eHMqYlYkc01mUDlYdWpXSmRUKHt6bWphCit2TVhCRERKa1FSIUd7Wl5GJntBeDdzVX5mPyh1Xjxsc1ZHKV9UfCtLRm9rcFAyTHRCVlR2ITUkNzFNS2NIVjY8NER1fmt+O1RLJmxLLUNICis1SXNuJCVeIzNjTEdRKm5FflgxfHRQdk1ucTBuMyMyX3RjTXohMGNjJCt4KWQzIWc9aSNsYjlaYHJlc2VQPj1oeFNsKlRCcENyfV5jRklkCit6fSFYVjxyUHVQQEgkQDlGJlZtY0c1Ym8xYS14VVJ8SFJwSXpTRiZeTEZwaSEqdlF5TExFNzRNfkJxPUdCNjBycys8S15fVWQ2eHQjeHBRCitJTy1OMTN0O3ZQQkxwcjlgJX1TI2h6dWUwX0B8VEFGTlMhKFZRTT81b0k2KTd6and4QjdpR3AjO0ZfeiUrTmlQWG5iX0pWYXJjUE1ATilgCituOENORTxiTEZnV2JfZm5hV1BRcClONmtObzRZViRGe01TaTElRkhjJXlfVzN1Mj9MN1ZOMEV5ODJLUig7TGs8RCV5KzVNYiElWTVHdVEhCispeWlJZHVoaFE8UHZ9RWE0IUZVfDhNfTZ9MENIT0JXSURfcChXNn5hRFFieGNCOyUwMEchR2FmRFF5TUZsdWZ+SyFwZztqayU/Z2UkZTV9CitkUlBZPHhsWiFPMGU4OCR+SjFTdzMrTjg3VlRzOX41TjlWPkZJTSZ5e3BVaGk9LXdySUhacT1VQmRTXzBmQntVUHBScmRkV2UwNn1kJDAoCitgVGI0aXY4Ryp+YShJSDJCMyphITxmT1FKUlMqcjUhKm9HbDI1MUhOQHdtPmVZfk51MElXVWVmO2dXbTZWZWo/SGd8X2lsfmghXk5oZ3VoCis+TnNEMyEqbiV4b0AoRFlfT3xQVmJCYXZYSVpFTHlQe0Q7d2UhZ2AtRW5RKUZIWU0wTFFxRjNxSCswNUZ0SD9sSysxN3JReyhufXR1NEY7CittaTJ+IyF4djFaeG81d0VmTntTfW9ra3x4XmI+UEJxPXM8Wmw2KFd3KFh+KSp7V0xrT0NYJGQ9Q1RLVVU8dmQkV2hnbzA+cHZ0QnM9UWZVCit3RihoUnpJYTU8fiopaD80JWZKV0NTSHFWYUY2XzA9WkpuS141TilQJEZHMDFWV0d2Skt8NCk3cXlva0xoM0ApU3wmX31lPGRLVj4wan1CCitqdjl5bnAoQjZYfihCLU5JdC09Tz1DbCZWKCt7QW9rTSgoKzM8ZkhvbVckODNwSiUwPyl5clhFKHlRaEB7NihXYnJ7I2BHZ05MKGEkJkFSCismNCQoLShecDJOV15VOUw9bCpaQl9gKSVgJk1eSUBWI3RLWT1MRVJ8ams1Nj0tMTVvMHwoTCFaX3ArZilJU2dBdVh9c1NfWDteRk5yaEYxCisjOUBneTNVa1RYZUJwQ2chRXdIMXdHdTleZXhOSjBvbSR4TlNfWCVaNitaRm5HZ3AkJklrbmlNPSpnOV9jKFAzR3dpVD5ERit7RytiMy1ACit7Z1RkcnNpKXlTSCtlcn1rV3NjIVAkUTJJdSEqIWw/emNOI1NyJm9KTUE4eUlwXypgMjM1PFpTeC1MRkpzRUl8I0xTJCtyPlJCbFNCO1FACit4UCZhcj1ER1FIWDJPVjM7ckU7eFl6YEByPk1FUW9TKHhuekNZMUFDQHJ4e2R1MyFaYSo9IyNIUVVXMmxzUytCV0djQGJXJWlncXstZCNkCitVNjJ6N0p+ZygmTTdYTHB1TnJ7dlgxUG1lajx2bURsbktEQHIzJipuY3cmbDM2RDZHVGl8KzlyVih7c2hNOV8zVTxiYHVkX3FWdEhkIzJwCis8ZDRCflQlc294aSNKcEB9Jk5JaCgofGpCMyZLODtROD4zNlpOIyFONmEmalhLSj5OKjZoIT8yIylwSzU3ZThebzJrKjZzPnIhP1FGbztwCit4P15OajhXaEcxKSZVTm9XTll2RTVScjQoI0gkajxYZnskNno7dHVCTF5WaHY3RUJ8KDRSWFYrfSheWDRGfnFhTygqY29GOGJ9bDBNflhrCishMDNuNzNnJFQ4Zj5UM25vVHo5SjNKal9sQUYjRyhrR3FeTnArWXlKUUc9KV5LdTduLXY0SiE3bS08TWFUe1piPyhRWnNeOX0rQnRkPzxuCiswdXcqTEA8TnBEOW5pZVQrTXlEYmQ2NiZBcSNgSFdrKEZ+ZkNaSHl2VXkqRkI9YHxteXU+OVRUemBAWW89QjYkTnJyayFtKUU3KyNJRDh1Cit1RkMpfj01dHFPbUNvIzxadXshK2xDaXM5KUNfSFJTISpZRXhmTChaOytIZjx6Q0FAKztfenpgVV5RS05KS1RBMWdmbWxAbD9FWHE2fCFwCismSG85c3UhSG1oQVR3UkBXRCQ1YUEmOW9TUVloSUVWQlFUZUZYQytqMmkzVUZYfEYhZiVgTTA5Mip3WDNqPnpSXjNNKkBuZSFhREYtT3BZCitfMjB8YXF6aT1FU1RiV3cmZ3NBbG0pYTEzUU18OHhAV2B+bDlmK35tP3JAMDJiJFQwKy17Z01sXjxDTXkpbmx7YmtCK210SDhxY3dUbzBUCitiQUY+YiM3cnIrITc+dWlBMnRsWWx6e1JYPmRVaDVlVHloMXM5XztmWT9DSCE5b0piS2ktM05IM0ZuO3RkNF8rJjRyWjVmTWwrbm8zfE8hCitOPnBxfWVUaCNDWkJCPzJCIz1oP1FfI34jeVdTeD8hYHZtZTlLN3J1VVorPWxGPTBMPS0qM2MkJDJ2dzU/UnAyWTBuP2V6LUBWJTVkalErCitqRGRWYEQ0O2V0MWkhclBVZiZuKip0PT9neDNAZDhNXkBGWlNYNUA1aiE/MykkREFCO2xia0VaeSpeQmc5aSZeTCNwZWZkU1c+NkYrRDBeCisqOXROeClleyRFJDZxUj55YUhkM0plMXZeP059KVM4KUkzRG1mUWMjTil1WFptJF96Tz82QS0jNzVCRVYkbGFgeSFiVigpM0Z9T3NFTWZfCitGT2BiMXojSkhYT3tMUEN+eDBWd1NgPk14RjIyM3VJVClkJmdOSGx4MSoxRURFNFg7QnhVTW1NV0xeUCYhXzJ+fDIoXzd5YGlzOVopY1p0CitPTyVZLXIhcDtTVk93JE1ea3xJeGxUSHwhdHczdXlmbkIpKyUhb09YTWlOfGBKezF5bG8qJlF2UnN1cHh3PylGKmFfSWdnUDZFeDMyfGJnCitnPGs7cnM7amwwfEhEezdZZGopdzYlI2gkRl9yQGtgYFh1JlRDekhfXkk0UGMxZ1VvYXN4XjhJNTRAfENlYzN8IWBkeyt3RmphJSglKGg9Cis8MiswWENKUFlCNChuYEwjKD5iaG12NUhqS2pjaEhUflpOTCReSVdOZ2Z7XlpLc0g1RShkJnJrfStHVUs5JEVpfnl9ejB+bHJUPzl4SkktCituNVd6cWRLRG10bzs2RGd1RTU8fiFZSE4zVCVYI1FAWWZDdjtGNVRhQGN+Ym5iODVmSGhtWXBqVjg+TlMpJSk2cE5qUFZqQkRvLTN4Vmg1CitQI3ZsOWpXajdsSytiaDI2eGxFSz5RKnVNfjJKXi1qU0c5fDVSPiZWdXl1REI/TnFeMTcqMz4mK3ZNPVc3M3t7RXp4anVEM3IrSlYyO058CitlPHRKNGlQU0ltZy1mKlZJeDdHT1kjM08oTEhYMiYtdj42NVNSazV8MXFseENmUnkmPm01N3pPQ1F0ViUmI3xRSmBoVlBQYHUodkBAOU5SCitTbiZ1Zn1eTVJCTC1Hcj1UVTFUejAjdlktMXYzR2ZhYyFDTW4tRTZnUUgzc1cwUGsjYD0tdyU4QDRCfkded3ZabkdHNDdyIUMmcn42QllsCis/Zj40XyRHOzdSVyEpIWspUl9wWGlXYWVvRXRCZ3UoSHt1ZjQ5elQ3Z1hNUWpFJjJlNHZTcUU/JWk9XiFsfmNmTV9zWDxQX2xQOD5Rb1lDCitVY1hWX1Vqb1FlaW5ZbW9wODs7Y3E8cmBAMi1DT2A3OF43JkgmaVBuZ3FLTkVgeDZnJDckZFN4PHIjdW5faWJGNGwkQk8kN1lXRzZobmRWCitpZ2gwUFkjTn1QWWMzRTxMUVNiUF9KWnModS1eQXF+PHhBSzUyR05hPz90SjRjU2VAYWBhQ31kKiVZTEZeMVowKmk+V3REQz83PnVPWmMyCit5Wj9pWTMwQkF5YnMzZj1rUT5fO3h4VDBPSWBhY2BFM3lHJDR+WFROVmwyRz5zO3RlcCMmR3BWM0IlSkw3RCNYK3ZwKkF7YCg9SHoqY2J+CitWe1k1ZmBOKnJZYShWQypPdzBfLVRBO01uVF51MGdXT2BxfH5vKEYhN3J+K09Za19tPX58SXZNMjJWfTBOQEVvc2EhI0xQbXlUaE9Say1+Cis1TypDWTd2YjJwKVQkfHh9Tz1URUE/JCpzY2N6PEJnO1FJYyY1KXh3KFpBJTwmYHZsUERZZlQkVjdBKiVQPUNpamV2VnwoQ0Y7JSQwPj8oCitjdiFTcWYtKXlne256cnpqWFU2QlRgKmpMN2oyb0g+Rio1c1ptfXBaNUNQZGRvP3Qrend4YGVXZShOY0tgeWEjaEA2b1RnUDdrUnBTd0VqCitvOUNGRzt2K2s9I0ZBeVVAMUJKRkhsUFoxUVktTzAwO297bEA+P1pGdkxCazM7K1AoQzskS3YwMDAxUlg+YyFNVlJMMTBWUkNiMmF4UVJyCitvbXk+ZytfKHxgP3E1Tnk1bEJrYz5MckpNRzNyQ3B5eGJXbUYyU01jN3NuTzI1X2d4aUJubCs4PiVGND95KSU0fk5KKG91WDlVaSFHI3QoCitoPWpFQjlTRjY/RXNiV05RbnYwZm5SNE9La1YhSDJFdEpURjtpaVEtJHclNUk2TUx+R2UzOEBMKUN7ZyNDNzU0a1pnP3B8fSU2fGxnaFN+Cis2YWNxNH5ybm15e0hxQENUUzshNXxMKkRBLX5lay1NPTc4QGJ6M3JwNFVFLXd6T3QlU0BLZSs8Wll5RFJqbVZgYEJ3Wl5WSHFQaE5fNCVYCitlMVdrLVFjcU1LY1UhPT4+dEduKGIoTEQoc3FLJVdKbEY0MmxpZHVCOG47a2JUPnQxYnRnRVNzYnwzSipgPUxTUXszS2dSdWV6PkxNR3JICitBKVlyP1lmRmZ3SSh+SjMoYUsxVFVyOzJ8SVJLaEUoJjFDckQlJnp2TXFsc0JxS0xxJiU2eygyVjdJUmB1Q1VIRlU0dyY0e3RNQVFQeHhgCitAPGxTT1BydENiYHleeVRIU2tVUzBwKyhLYWpSSnN6MFIoVSt+NVE2TlFiTEFsWWEpZTYqKH11NSNUWDxBU1lXLWtEckQhJihVP3ZgaWdECitBZVIjYHRRS1g5MStja01qPHFwKCl7cmNnRXBXSF9IYjdeXlkwPDRBMyp6YCkxNEl7TVh5T3ZldCRufTJVbVliYm1OMG5EaG02OTY9OShZCis7aWNTJURaMyo9Z091RXstXj84aEh3Z3hwdkduM3N8QEBYNjQ8blVOaU5yVDZDRD8wbk1mP3VVREZNY3hqSm87R3AqakEyRiNTfVBZZU1oCitvbGUlQmB7dzExckt8XnxCQFNIWlBWfStPS1Bwa2lXaUNLUEIpMXtzc0c7U3IlQCVDZTRBJFpLSDFuQ1VfUkN5RF97KmFuS2R+PWlqVm82CityIWhUPW9MXj9OeD58bmhSYFFzPiQ4eUNra0dhdzRidjJNUXUpUWU8e0ZuWmpgKjRvJFc9QU48KkN9YylVemhGWG18SzJUTjlTPXUxVDYpCitaQmV3VkUyfHZuSkteVVB5N3BULXZwWj92VkErQXp5Xil0SFBmY0VWQCYpbGdLQGlXV0RkZUl9a1BOKSg/dGF2ZGRxZD1mUTMlZ0xqVFpICisqYSEzYEItcUpaT18raHJoNFE9djVXJmBQejd2d1l+UVdeUCl5amtHR1RTJSFvZWRHTmhUaGRGQDJjYC0lQ3F6eG0jMmYjeylBfFFDenUqCismeWNNWkF2MnVVbkV0SHx0cHtFOSN6N2I7MVR8M2A0QSktM0F3ajg8XnwmaW1jQkt4b2opSnRRfGJCPjhNKVI3dEdXdSt3eUp6d31RZXgmCitHRUJ2KXl8fGNnKmM9S0EjRCNrRkEwVlA0dTNAWj8xQEY+bDZIOXEtRHBOIX5Zd21rQnFnSmlIUihyQzBpJnArNnhoP0clI3VmM0chPmN4CitPdDtNY2FuVC16YXNOJUA9QWQhVjBueytUdytCYlJPJX19b0ZQNjx0eDlYTTAqMll0SG8kZ2ZrM2JlQG1FY0tLT0tMX0Jwa1FDdVNnZkBhCitIMzAtNUx3Y2VHKmR0VXNjb2BvY28tJFJDeDI0KEVSdiF1WnFAbGJgQ08oV21IUWxmcHRAMGpvVTBiT25CNE0+K1BiflR7JGBQLS1CdVhACitsUkg3V1I8UjEwSk8yVFJGan5uV1VxaVlpI0YkbVNhaUheMkxoRnVFQm19RD43YkJtPksqd09mdT5TKzBnSGtXcXU+QmlQZyo2NUJjeFB8CitxbENzO28zYWlQMFJ7Y2dATGQ4SHNNeSs1YnNkfTViZDNpQm1FR0MlTSFDcnE4MzBoa2okPEpkMVJhJjFkR19pRm9tYWQtUmJgPXBIUVlsCitURUJ1aWNBNFJQWVQ7aDg1MWZnLW1EaTUjbU1qZnd5TEx1RFk2UT53V2pyT3RBWGF1NTZBVElGOGA8WWdZa2taKzlRcW1pRHopRzBhX256Cis5WTdNNCtzLUxfeVV5ZW02N2JkZiRUUD9lPSNCTmFMN09Sa1E/RCZrREcmam1gcDF0ME9WUj0hM2Nab0FTTilvIWBvJkpJMktCZiYkSVhsCitQWVNCYDV4QnJYTzM2d01Tc00rcWNsYThDNXY8Nil6fmRvVT03cm55OTJrVmQ1N0wjKj1iSFFxZyZ7dVdmRzk3bFBNKTwyNkpHOGcmWFY7CityU29iTSRobSo5JjVuNmxmUW9eVEJMRjxiTUgjfTBeTnpyJFhJajxne1lCcz1fd2BNS21Fbj1EZmpIP01DSzF5flJJPihfQyQtYG8yX1ZCCis1T1IjbStCR0tlMmM5TVk9MTZKZj8lQWFHI0hzQTMrPyFIYW9wcFo9fHJxNjdOVlU+KE58eXtHezFHblI+TUBIMGJvSl5sdDd3PzwoIW12CishJmxTSi1mSF99b2JzVDFBPXw0Xj0+KGNoX1NtVl5uY3VHU19wT2FUS19WTWk5cUNXXj4odmFgY145cV41SXNubml2Kl9CaWYmeGdTRUJMCituTXpPZUluKGFsQEJoTzRJQTZmX3RNTV5oLXZGaDVwKyNEYzlCcFkwZVcofWZwPGdyYXdUZmhNJTw4MzZjWCtxWHFBbCg/ZiQ/ZW9Nejt8CisoV0FBNnYlPHV8YTlST05FSngjazJ8aHxEV1B5d1U+Qj5KfHQqeipqUm5gWDE1M29URk07Plc1T0gxYllMTUYxeWF0WExKOVNPKHZhTnJvCitaZ0ZeRjtKNClGdlpuUzQyUFhneEJmbzlhd2BYRT5jVHRqMHVmSWVke2E3cUN8dnwtayNEaWJ4YkxnJktpZz9BbXglJVg0MDRtfSoxRzR3CitGMz04eypDTlJjflFUc2t0MDl9UH1NV2ZkP0E1MWVlTitLMCNeUHpidiEycmxjTmN0Qn1fXlA9fmtmQmtnKGJNZmkrQTBMejEhTk9UWjkxCitNJCE5YT99TmklPW5LV2lLKEVxUm50bk12bHdeTjd8bXVNQ3xJd0Q7OV4qbUBiP3ZwPFVBMV8kJip6ZlNoO0xxdm1seXd2YT9aRXdKKU16CitDQTx1cGBJQVhwbEM8Kzk8bVYjcTAtPj4wXm0xdGBSKzMkZUY1Jmo5UGs5JSVGWXt8R3tudnVrSCRgbHFiRzVWenlTd2kjUHFaYT5eak1YCis8UWhHYlN+dmx+JCo+fVIkZUJOXyFGPWMkKm5DLVQrfk9yZEBBKz4zTGFDaThrbGkhIyZmZW1XS1JeUT03Yik8XmphK2x8QStJbnpOTEw7CisyUkB3VU95NkZzZmt1YU0qamVPVmlQeXFWSWYkXi1ZVjI7cVRaI3Q3MXVyWklve2tnJk9iZyUrfD0xfE9YITR1fERDd09oPCV5WjQyUjZVCishPClnK0Zsa358a29HeGB9MnVweyokamhqbG5oJjkqYmZ0fVYrbGp+cXBFbC1QeSUjRThZSCNAOHZSKnhPaVc2MyVfRWo8NTE+V0ArYT1BCitqQns7dGp5anAlcT1kZ1p8NlZoX2RWZnsjVF54JjgjdFUwaTM2LXAhKTxhdjFSZHF6QCQzO0ZgVjVscTQpSXdXTWNJOUhSeFV9PFEpS3lECitPV35tTWEpZUYoZ2V8TXB3NEpRYzxJWHVgNV5FdVdOeGomJX5aIXFvSj5HU1MyWmUhSyhLYEpPfGo5emB4LSE9VkY1UTZGZSZESmx8Pmo2Cit2a2kjMjZEQiM9TE9kOD14VkglbHFDX3VDISo2MjJOaTc3fHxMXnwtd3J9IUN2azA7KFh2IzFTTEQpM2Upblk/eXNGNEhtbkUwKihGN154CistTGRxPHxybHt0PnZqVil5YnlvckthMnV4WHwxM0tiVGJKWiplaHpBV043OylkZW97YnhgR24qNkd8TkkhLWhsJSpKK2pCeWVwajxjP0AwCisoKGJkYkNhSHxKTTNXN3dGMGFlS3tzT2tgWihffXlTam9ufSo/ZlFReChvY2xQaWc+OCU3RD5fcGojZHhTcmUqaFNibnhAUTQhZ3NDZDxlCitMdHYodTdsQlV3QVhtVkt8IU1aT2BKZURXWHZvbiQ8cVIpSDBvWi1QK3h+UW4oVyZXUTlge0diRGh6PnAoeUduRDI1UlhzQGhgIWkhIXtiCitwZEUqLWAqcHQjQT02OzQqPX4qVFJqWFVBbjhJcSFWaUZCQGU0MX1yelhyd0hgVUNpPTVZRmZYITl3PGQ4Pj85MTJoT1hYd2Y3cXAhUEFtCit4dn01MmgpKGZxRGYoNn5PPHRYd188UTN0TzRzPHE+ZStUVXh3cTlPSW1aeHd5QlhFSXErNXpSK3EqPT9Db1ZnZ2FsWnA8MlRTZj5CMkB7Cis7dSVZRntmP1B2WDsyNlQrK35EUU5UdElrPCpMZFR0aWdQQDd3fDc9MFVqanZZeiVoJDBmXk9aVTVjOzE+XjJ3QTdgb0lkUyRCWUVLdTdKCis3SXVyUUNvSmAyKj1QSGtiMGRqWUcwajI+dG01KVgkRkRxd1RATFFAIUAlQFMoJmBSSktMTTxZZFJlU1coT2pfbHJnKnVed1lwe29xJWU3CisoI0QkbFFoV2N0MnJ0bEBURjNsWTIyZnIkRVp7OVB6fExGPDI5bUVuX0dWLTBobDVUNSlzc1JHd0B5OXs1eCE2U21KZz13WiFZNmE/a314CitNIXg0Vj1neWpONCRuSTVNcy0xSHl4Q2B2RVpRdDQ5UHQxQXd2V2Eyb1hWbVg7Q294I24jNU54V1Y3S1dMLV41bUxgUntQZmxpVjd4T2R7CitMZ2taTXE0c0hWYit3ZUxFS18qLU81eXppZXVlbGtjWHg9cSE0VW8kSjEjcTs5eyV2cmNQM3shNS1rb21NeDIyc0k+OW8tV1lFSk85MWd+Cit5RHp2TWc9ZVQwSnIpcHJvMEZ1SkxQPjlOfXBgRUpYI3xkOGkyIStmQ24kYH55ZjlfYnolKVBzSEtyQ2w3eGE1JDZaRjdrRStuR1NFc2FwCitpSWxTUkEkV3w7cWxQT2NjMDw9KWl5eGQpcyR0MUZUJkUkY1Z3WUdvdFgtKDgyPCNNe0cjdGoqMCE3V3dSa05vSTVATkNTITQmTiRzSGJICit3fn5pLVJXSzspRj9hPkpCfnZgU0hOQzZINCg3dykoVFNCT3tnWV9hZX1mTEtZRDZBKWgkU2ZLNTlvMEp5NyhHRSs0Nnh2dGlEUiMoXyRKCitwZ1J+MykhJGVKI2ZKTmBJM3UwMTIyYXFnOVRoVlUlbXFJLUBzfFI2OThabnRHJGV8ck49LTFGTDNhUCExV3g7bzRKZmYkdjEteFctTkVNCituMWope3ZMXiY3JGdOcE5mQnZATVcjMz1eJigpfWZvX01JSFpxNTB0QSRKT3MxMkRIKSphb3spKVRySGIocngtPnxGO20oXih0TSNpYi1LCitKdD89NzVTPmJncEhxNk5BO3tRLWYwfFhRUjAwME84Xk9ZN3lSV3otZzB9dWNKWjgtbns1ZFopSGFBfE5hVntLJF9hQ0IqSlpnVmJoZENlCitSQlp5VUd1Y2x7Tl8xO2FeJmJtPXd9ITtFXkVZcjlGWEclO2VRRTB6V2E+T0BKTFBqfWJqb2dIbzF8R3hKQC1qT0YrYV5lPGZmWXVXRWAxCitycDA5e0NoUyhhNVoydHJudUo4ZUpBZiRZTFFAYj1nKkNHYGQrVVFQc04wYmRAV3lSPCNuXmheNzxed2JYXmApfDVyMnJlZllVOztXKTt6Cis3bzFIalZ1fjE4enF7eCtLZzZ0SWhUMzlPfmhNUlJ4NEBCTGQ9eWVSeG1HezQkLX1DKTxTMFo8dXNPNnJIVng/R0ZpWlhiLWZqVXdOYXpGCitZVk1VUEw/dnNaT2Q9ez4rMFNDNzNSVE96IWBJeUYzfWBNSVJUc0dibC1NKXR2ZHRHbys+OXp8a2F8WChoP14zSzUqZSkycmNwJSQ7Q2IjCis1MlZhKERvfHBHUEgzKHYlajl3TVZYY1UxTW12eS1qWH1XQml3cE04Pl5ya0I3TSMjQS1eUmBoYmU7K2Eydk1zV3ZFT1g8KWZQTjVIJmE8CishfkAjN31uNSY8dHpETn1MJXtfNSk4PEBJJj9eNzhmNylYdDQ4PGhgczU1VVIxO2ZNZ09+RVl2NTVYKj8zfT9gbkpYWUFVYGo+eTIjQSVjCis3fnZkQDdja0NlNH5XVTR3KmptMlE5IW5XeVNnbWJWTWxQWndvNipNK1JOUSRwbnB3Pz9KK1lvK29Aemo8Q31sNyhqcEk2cTZqZDtqTCpeCis8e2M+Y0pwIzctZHx0N09WN3tGVXRYcGN1aWowQ3NrNX1JIU1aKztNa0JCP3Y1fmhiV2V1Y2NtZzUhNmZoMUg8UEtYUnQwUkRaYUs+N3RKCisqX1c5cD1sQG4mTGpiZmBofWxlbD1HelV9ZU0zNTU9JldKdWl3bjY/RzEqQ01INk0jeHdLY1MhY2N0fTN1Y3M+LTRKaCRSN048VHJXNXpMCitNVDBaYzhBMTVyJXZiSFAxWGRRcn47dkA0cSNHYzUtIWIpZ3R8NGJOTCZDPjlKdHlGNlRSKFdVajwmPypJd0skQkd0WD5MbVkzQm47cnt0CitjTmo0Y1M1YlU7aDh0a2gwKWZjdEReWT1JYDB1eHpjZSttengqb35RRng9Wmxuc2hvZnQxVmVIcV9IKVd4RUU0YWBgJkxMSjJhKVo9WXMtCis3N1RNM3EhcTJxVF85TClhNUExT0FKUFBlM2hsPDBlbDgjeS17PllxeVVuckQmQEsjdFZPNEtvcWFgN1NRYX0zRGRNeW0yMHApOzg/YktnCitDR09kbmsyOSR5JG08TkZwUHxRU19xfilUYCtHYipfQ1MwKCNGTjRVdHxwZ3JleEY5O3tlQjA2alIhUlozKSpSLVZZSGcjWD8wPjV3VSohCis1dk07bF53QlhQaXx1JEwhSDFjY0RXamNDb0BQemZhNjQwU0FUQW12XytpYCk8Ryt7PDFySCFKMzl2XnxFfWhqWlQ3Xm8zbGdteGFYMmtXCisoJHV8eT5KcUd9bUxJOzZFUnQjPHxpS2xxYldWZ0F4UX5Cd2koQl99QHwzPVJgaStMN3xrSmMpJFFqbXh9QiR5TW5PXig5eFl6P15NKiRnCis0JHNueGtAUEdmSnQ5am8zRGVtc3FAKktuWlckMFA9bEcoLWs0P25TeU83d1hXYTVpbj9CQlg3JG5Lb0E5Y04yViNeYUJTKlVieFgodFBRCitSREFRNjVwZnd4Vn0hS31XbyV4YkNuRSMxMDt7RCN7d1FzRVJ2WG0mRkU3WkUrYFNqWnVKO25ISFRsPmhYYkBFY0wzYj4wbkJEVmxvezg+CiskVW8mKWolSSQhb3Y/eDleKEkqSys0SkAtPWJ4TXR+Sk9AaWhlTzxMe2pKMD1AWUF7bmNaYTghP0VoUmFUQFZkKmlxRl9JOTJ4SWoxUC01CitORSgzQ0o1fHExYjVPblUlbzFpezFEZTd5TV4wOUBNS2hxfVl2MG1kPXNOfDlnU2NDXlAxUUR1LTRWa1hvTU82eGN9fiRWPWJNeEpmZFZWCiteI3leV2pMIyM7UjV6fXZRLTloPyk/QzN8PkFecU9pZ1d+bDMhfGpOfnNaWThnVWpmQ2E8fWVZekZjQWI5a2w+R2VvJmRxSGpUMGJKayhhCis5QGVoTHM2bWcmUTZzZE1HTiFGa0EmcDh4aldIKmhZMUZQJW59WX1TIVNNfDFAUHMxenhqQzJfS2pvKFN1fnRDJWp4QUt8M1NiZHlyZEdsCislYEBwUzVubFgpKjMxUGotbnpwfV41PlJFRjh1YDRoNl9LeFZ1b2tuPGlZZWwwSjhxZW1CQGd+TUUzZlNvfWRVflZiOXFYbXhrcU1YdDlmCitNQUY5KlBebmolVEw/R01taSZ5ZkNfKTQqO1diKHMwVGE4ek1Ea1htQ0UjVDNwVCshTGNCJkA7cWZnI1U9VGpSWVVfVVNfbTRFNnp7bmpBCitMUnBZUjZuJmRvdEFpIyZWVW5OKjV6LSVIWVcwcEllZDgxUmdaIWo3P000KnNXeyRaWHJvX0N4bEd6JXdrVjI4KlpMdWdJS35rSGxAZVVGCitaalYpXk4ybHMoTylQJmY8a0w2KzgwQ3BAQzJNTFIlOX1LKU9IWXk5KTQjQWwxV25SaTU8QTN4eWtGT3pPcDxZYXgtNzJPUyQ9dX15d2t3CitNVGFEeT8lNHlKZTY1ZyozSCpJe3JtKTgldyMzc3Y9bysoMUZGcnozaFFSSSpBJFowP0hBckpXcEx2dyZmYmh8alVpcCtsSGtVOFZMXiNlCitCaVFtbGYyPTJsK1leNDgtTGtvbEVjJFEzKVRGVip3ey17PXwleTJrYm1SJDVVOU44VlpnbDFJUmRWakJSZGhRKztOdCYjcz1pNkJ0cm95CitpdmpIbSVMVlR2MUskSkFuP1JeWE49Y1UoUV5+Kj5kaTdBKn1CeDNAYGljOW9QTE42OG8kUT4tUSlrfUBrYnZ1R3lUQ0U4KGFfZDZQPV4lCisoNy0tX1ZhPH1LblBhKCFYREh2aWJhOEFaX3F4Zn1RISY7UCVyK3JJOFEpS0lnQDVOME5hdnhuTTI4PGBzeV5vSzJvbChVSH1IX2MyVWpMCit4T2hEPmBEQlBYUUlvKXxSTn1RakdkNWQ+Q0x9ZG5yWDkxUGRCV05ZYUp0WCVTaiE9JSg8NzRUKXpKNHRqdnB+I3hzV1R1Umwwamkwc2VwCis8ZSgtdyooUVd0ITBzRGZaeiklcChFeTtXT0UoczE2eGd2Wmc8PHF2fFpOZkhJIWpIUFh6OX5Paz47N3JnbmZhYjUmdyRsOH42SFNNNDdgCitvclRkcChkMS1vWWhDWj5uNzMwelgyM0NuMkFMNj9pSUxaSlJhTj5KXnhvVHEqSTJGN3RMYEhPRll7ezdvJj5qKnVoblBoSmZSZUN+R3FJCit6VlhsSWI2QClLP21MRSZDSyM4Wmh8fTtXVio4NCh4IUBVVG51VERpdiRufDQwJFJeX348fHhRMS1NcTlMLShrd0hPM3N4QXNkanVsTjxrCitobWR8VHJWPXFQJVVpbF9Ybl5ufiUqPTlLKyMyUT9GQTU8M2N4cHQ1bHB2MDNhTEVTUTxKP2hVa0wqamUpTSt9ajVPKDJMT1lsOzNCUkpQCis5N2smentaWjxpMj9HJH57VWYwdiUmenU5ND1mQzhgdmQtMn07aDAxYVBPNDhCQzlGYkpDKG9iTFBXV2dMTChNMV9hQ1Q7KHBZMyNyaX1wCittUikwUGdpJVN5WC1LI1haWEYmeDVDXmIjLWxwPTk3VWdDcFhIRHZJRHw0bjcoUEtNSylCSXxfKGMwbnlfVzVNNzt9fEtzZSVXaShYNm5TCitHV30hcm5VM14jKiNBP0NjU1dwTXZmeDhaNVhTTm5vNXEqe3deey18Qz1UbTxoYm5iRX1TMm9HY1cpezJGbFgzJnFGeHI1OG5xN3woT1p5Cis1Vk9neXold2U/JH5zeWh5OEZRI2Zqc0p4Nm1fJC1jaEBjJH47RXZvclloJnl9byZLX1FUfjdpKlIqSmVhbndneERpeURqKXk2MDglfmRRCit3TUxDRU57fEJIS0NrN1M1X2RBIWl5Z2hBcVpDezVeNSo5MUlgUCMxT3VTUUA1fCtzJjJ2N1ZhYDVOUEZYeFQ+JDBzYCh7TkJKeSFTZmNXCitlNykxQyFIVlZqaGJfdGZFdmJPZzU9ez4oS2o5alk2YGg4bktsPjwyaitFRzkxSGgzVCFfPXxvd0Bxb1ItUGtycjtZYlB3Y090cUJyQmE3CitWak1zbW5UU2ZyMSZrYiZAcTdCWk5BcUpAbGhOJmpRPTRQS2YrYno7KG1MUz84VCt3dVc9Z2FeQjkpLVU1REliaGA+KytRMzVGQUd2ZkwkCitDRk84IzRgMWIteDNqeHJyQytAUmJ7cUUpOHwoKEcoLSY2ciozVmxWVygtb302UmdLfGYzfjsmWm93eUh6bGQ2U19LSnJPfWMtOFlvI3Z5CitsMHlEMjRrZHNUSjxsTkgkVm47SGB2P2ROJXVuOSpYMmokUXdMWjB4TW9Le0tFQl5aTGEqNCoxd0ZwXlF0PnhfeD4oJTMlfjZwazdLd3gzCitFaTJwdygzNkZNYFFoX0RkRmk7NTI7RTN4M2prKCtaZXd+dGZ8QD03ZnpiT2ZfaFc9RmQlI0p3eiZxb3pCS1Q7KztfWSUlaWBWNi1RdjcmCisrRXZPPXliZGt+MipeejFsQVhyP2NaMGsoPHBKJE0lNCE/OGU4cn4oPFN4UyYkLVBzUjA1JXZ1aGUmS1Nfck5pI0E4WHAqWFN5P19ZZVFyCit1O0soVCs8aGk4VE5fSnMjWl5lc01GayE9Mzw5UUtYJkYyd0FkLSVqMDBXcTJ7Zl8hX1NSZkNzeGc9M3hFUFBkfVl0WGFrWlpXalp4U1p5CitAMlhhTyFsdTF4SkpxYTVJN24xbGdeQVkhUD9eTGtIODNxWGhmPzVYWn5iRkNtKncjbHYpdTxCTzhnIXwkUDNxQHkwSzFXclJIdEUtPnIqCiszMm1TNCQ7P0A9K3JMYnhsWmhyeExwJWFBfSVnTElPa19LbWx3JFZRcj59MF5aUG4qIz9TY1ZJV0Y5IUU3aGM3MUhjJGsqQjAtTUljb0stCitBMUBULXphaiotdHZgd0RxWmwraWdzMmh9V3cqMktnWC1IMDc+SXlWSUFeQVVSdTNBSD1tSFQxYkp9Z2ZeVTI9NWFMS3tPdDNJVUstUHtJCitBLS15K1o7WjFgYjlyRUUje29YazdOWlpHczxEfVFiKGJUKiVDZGtQLT1MKmROaEZ6QTA5WUolKmhySTthNFZ+YFR6PzgyI0F2TFNfPG1XCisqey01QWM0QG5rQ0smdCZIK250Y3Mjd0hSfChzM3ppXmtLd0xLQ19JWSFkMzsjNyhXNGQ0O3wtWnsmIW45U04jY24oJVE5NiM1TFgmellqCitGYTZwNnQ3WlM9YzVqSlVhKkVPfnB4cGVNaChxLUB+XjJtWlh7fjkpQmhGZ3d7THdIdlhqO0h4Zn4rVH49OzNQX2VweFBWNXYtI0c4X3VNCit4azBhPHdvdGA+SSE8UzwocGIod3xyKW1uK2grOFE4Kmo5aDB2bU45SmZhYmhwcFchcUNXWjJoNytJQygkUVQ5YEhwa2NARFRWe0hOQygkCitldHFOUG9aQCREZDt7YCtkKmkhdSlgY0xMMFMmUVBjS3s7Nl9VNWhNN2ApSG8xe09CTndyZz0yJFdtYkBjY2pvSElMcmx1JUNjS01zMkIlCitid24yXjxfMkJqJEE1I1c/SzAkUDFBc2RPT158elJhYWMyaHZNNG1mWihMYXZQaGlpQ2l2RFBMIXFISDAlRERSOEJsI0FvaztIJEMpV30zCitvPjxwOXJ2dVVIUT9mazB8XnRaZX5BZmwhPnVeQjFubmhySkJjKDVCS29eUGx9MzVwbX48R2Yzd0hLNTg7TFpzPEg+Yk1iNz4jMXBqbHVgCitmYCV1WTJsflpqWG02bHMlUDVUT2lUPkJgI0pVNm9McEhlQzNqMCZ+QUR9Nj03SEE7UWNOQEchVDRIbVVhdzt1PVlaUnAwaX1WWVBzeUByCitoelZ+KzZkV29CfDhvSSZ6VGdTZllVTEM+MElCY29xcDJPcFFDPXJXVk1GcWRpdU9JXj5lQ0NwWm5NI1oyY1RmNjdlMzhicz5GLSZ+STMjCitBNFlWTEp9TTdyJE4pWHRZfEVDO1gxPCt+NHkqbFhNfVZxLWd1eG5kJH0qfnpkKyYyVW91RkI9KVVlYXxoQE9MbisoNkFDbmtRPTYpfj1wCitkNHlpZyZHMzhmaz5CNmx1MUZMJUM3JGFAMjxkSUhDaW5JdiEjOEFPb3dVelpScnltejY/OXJUN3g9UVVXVCp7WFBodEMxS1pVKmFJSHxDCis3aTEmNnxlKnVWSCpsJG9ranQ7PmJaPSpmcjQjbTlJNDhCP1JgNGdRaHxQSFJkX3EkcEoxPj4xZW9sRG0qMF5TcHpqcDNXbkB5S3JYKjgyCiteVEtQTHwkM0ZfWSs/aTNfaih4N1c/cyRYdChQZWxORXNaSHhjdD5hZCNzI2NgR3cleEZQaSpGTDY0d1lLaGlFQWppJGBGQ0pKSjMyVGF8CitIaThPWTBIMF5Je0YjUWlIS2o9cEoyVFdKZj9HPzZZKEtQTjdGdCM0STBQJDtvWXc2ZSRJQkUxX1AjKDgyK08rK3h9fV91N1dTYSozZj5eCit3UEUlbilWQW87TUdiQGZmTmlEUSQ8NDd9dHNpYCM+I0dMezhtVDwmLWgtbDdGc1IhOSowPCpQSEhBJkswXlZyVUJsUktZVn5+JWR8RzlwCitkMmg8KlJzNjBhWFR9TyR9ZEMrUHkoOGE8UlFzMl94VF58U1VrOzhIU2FXVE1yY297IWs/TzhDS2M8NUU5N3ZUUV5QKWg+QDZhV0FLMm10CitleTdEb2NKJmN4RnEwMDYqejAwMGpGMDAzfWxhNCUkVWNXIUtOVlByMEZkRj8mQGJLNXFTenglSmlEJnJ5NSU4Yik/WilWLWA/eGt0RV48CitBMXw7YEMkM14pYSp2TnZ0VlNPT1VxSkgyMWdQYHY1PXlxLTNXJUgjQFU7bm9jODt6e0E3QyF9fHVqWHpIfnsoPyE+SWpaOU5mdFQlUGppCit0SXwmVyFLNy1lOyp2Xj1rc01AelJHbzBsdTZlWHI4MTlKbk9jPl9tSER9cD9JdSg5P0p1Z1glPWZaaEV7a2V1ZXkpcVBZX31VfSt0JjhtCitycCgkIS1LQD47TXcpTUdnQGZCKVRpZDBUPiY+RGw8LXRNUVkpPWpaZGB1JSUzaF91KF8xYG1re08hfjheekRtdGFWcCs2b2pqMHRiR2QyCis3ODh2PzFHPDk8bEgyV3FpNn5KOH0paSVXQE5wRUQ4Kkctfnx5SlRKOE5SQE89Ml8hSEJabjgjNmt0eEJDUX5MZXo/djRDPUNzcGVKJmA8CisxdzAyQnV1bzxMRG8lME1gKVJHWERSTHdIQ3RudSV7PW1BKSZ+SSYwXnZ6VSNXcVdvZiY7LW84SFQtX2F0UVNGemZaTUp3O3huUH1FK0JqCitycnNgZWJkWWllS1NKVU88Q3Yzc1lAWkdhfSF9PVBIfERjYmhhWDBHfmA8UXt6PEw2ez1NOyhOIUNHbyNHUGkxVGNxNXJLLUV5SDElOTY9Cis9QWk+dnYxRlNjJURCMD5GeDhFPVZ6fjhvPTx9YkJuU31MMWxZc09XeGtTZ0okUVh2JHRMV2YrMC07SXMkNW9XM1F4bV5VMThkTTRTPm96CislVT9KM3ZIe0cjJTN6QSYhfUNwMWRCY19VSm9ERD13Z0RRYXVwfD14UyFkMClZPXxJem16JWs1M3x8TDQ2fGZMYzIkKmNoZEZGTUo8PUxpCit7amZNR0Ryc1B3ODF9eVhUP1E4dkdBQmU3OW5lST5GSkEmWjhAVTU4UnFkbVFTMjdEdmMyRk5rOFM4TkI+SHIqVj5taEpRbTFfWHdlbGA3CitpZU10KXQpK2RjaH0kK0JoTm58SWpmIXlmWXRgSn1HZXJZYCVUO01wXk53diNlJE5CJl80YHYlc01VPGBXIUZJP2tObzJEPHxIKk1XTGE+CitLTn1UYklwZHAzY2h4ODE+LWJBV2Q8ZnEjKEkyQWByKktMTWRWZHVPbn1CTVRKVSUwP3x4RkBLNCYtdkBQJV9aNGRaT1peSkhHR2hZRnoyCit7ODVMeSRjK2ZtUEtfUGJafmFJODRPQHg8TmpDd2E7KXBCWjhzS0FldVRkK1ZYbkFZV2RsPnl5RWNJZHpvMkp2bnBXOHcpWX14QTwjSGk5CisxPXxWTXpHfndzaX09WjhMalMmenopX1hSMWFLR2J7Nj1ubyFKcn1qWGpoV0QzaEo3ODlyTFdzVkM/cjY9fUV6JlMybUxxQHFVNWB6P1RVCit1LSgpNXhIP1ktVXpyenorJnM2X1QoK35aJEMhMX0lO3g8fGRDajcqLWo7QnN6O0RBIUQwV1Q2SElIbzUlNEZWeDN6bmNxRFdBZnBFSFJ5Cit0LWNvQnxzZEJLbmAjcCRWdHAxbWZoKFRSbiF0Q0p4Ql54SGk+ZitFWEBqU1ZfJD5rSkg/Sy1kR3cmREspNHMxYEt7Zktxfj5EQ0xiVHNwCitGIWt2ZU1+XnBGdVozYX0/YWckPioyMENrUWI0Sks9bTMhNndOaGBLMnpaKmM8QnRjczlQOXFCPDZMcHNhPzJfbjNZaFk1eVohKWtvcjRqCitVOEdre3REN217UyVoXnRme0wzeEJWflNXcCk2cW9Ne0VTeUpeKkooWFFlTiRoeilzR0lpSjxPcW04M0l8bjVjZ0c+Vmo7amRQaXQqYFAtCisrP3xOS2l6az05cTRSNjhpUz1ZMVNwaT4qZH4hTUs1djVeTThtcVlLY21xMi1jc2pMVEw5QDtPRj5DO1dpO1IhUClmfW17WWpCXyhIdH19CitgUTs2V3NpVHdEKj9aT1IkUFBCfnRoQzE9cmB4aHdCbiVrbjlPaHMxWko+dSgzPDklXl84SHl9dGtZME1mSXV9MCQ7KEg4TUZFZXsmJG5jCitEKHt4Rkc+RWh3YXtFOEJSJk8jdUErNTdWQzJoYWlUKXdNaEYyPSg+a0xmQ1YhZzBjTik8cz0pe3NsbGk5ZWYhTE18cSt4fFJjfjh4KVBRCisxTHBgQ1djXkpiMTIyZC0qfVVOMDBIdEJ3X2E9XzY5ITF8TWtwPEVsPUAoTiMzbkREeUZ3V04kfElfd3I8cEVKZWxGVG9sS19pNyVaanFUCis1aT1UZFZRS0AoS01LcztJNH1BZkx6N2JITXFCeHdPZUNqJiUqcCEtR2RkOGY9biZpRz50KS1FTVBsO2IrJG59ZngtNUshcTxzP2k/bE18CitnQztRZ1pRYk13Uz8rXjc0dFlDZjk1NyVWO04oJX0oOEtqRyhUJGBwRipMPj5kTkpfeE5jPmZ7V1hlPnMxelNfIzJCfHg2R09IfiheO2FeCitfMHA3Zms9PDV7VkA3a1dhe2l6LV47b25JXjRxLWdgY09kWVM+Qlo1TE9Md3F5SnMyUCU+SUhvQFVUc18zSCFjb2lMK2ZkYk9jUllqb0c5CithVGFxe0YrZEA1b19aOG5BUGBvKDdfbW1VJG1ONTMzS1FAfGVuZDt6SHA5NTUrWCpeTU0rK083KHZYS3h7KDlmJkxwPiNtbSNITV9UclhuCistMF9NRXRVQHBmVWJgPkxLI3t1NUdlOz50U0cqMGhHOFE1JHJ+VFF3MmFZOzt6Nm5DPCh3OCRNSHF5SzdAZm5zV1gxO0V3Rj5GSXwkSWwwCitQK1dkSEFtRX13TT94Xj9DUiFUWW9CQm5KUn1OfmMhO29yaUQ1MVBpe283M01pdTBNQX1qSFZuT0tTMjJjN3xKJm5KIURETlFDMGVkelpUCitfbUg8QFB1bXRgOVFYKlV5MXFzKFVjdjBaVTtFPHQzQllIKylvMHlDRTx1fXMmdylNU2lEQCpNQCR8V1czakxqTndCVXM5eShIKXhUM01oCityR3g1bk0qU0FALVI4IVh3YFZyPCttOVUqTVNjfmltY2JBOVk0QX4jKDFRSDMmUiVFVyp0ZkYxe09YcERTa3F8QD9wbE1UZyVONVpaN2BECitxdzMoUkVAZTFAdkc/RyQqTHhmRmptI2VxK1BXemRzVG4qJCRiI0l+dzIwdHBsYVR2JTUydTl2RVhBflZqd1YyTHVzMUErTEdfVz54fURACit8YztwKlZkVlYyQmJVMTk1U0M1QkotKnI9cE1sNzFnRSNTXkIqSmJnMDFVNVFpZXprditiNEU5Kz0kcVdfSTJ1ZyZmaDZBI35oY2thWHkyCitAZnZfMH1jKF9JTVQ8LWY/IylodiQlaGdxY3ZadDRoR082M3FuI2BES3Z3K0RWRkhIVlNgR30oRT4pP0wwIzZqcVY1YDtxUX1YTz9yQ0pGCitwKHZVfEJAPGAhITl3ZG57ZkE5PFl3UlFwcSooOE8yWTh6Mlg0dWA3YiMkT0JDNFByb0xWT3NJenJyWE00STFHe0BHUWxpRnIxbUNyV319Cit5UmdUaW1rdGw8MTJ9bzk4cGx5PEVIciFsb2hFbUo0P25UIzckKj1efDlQUm4tVWBuOW88NXhwMXJycWRxXlcqcl5ZbWQtUTIlNzJYISpnCismcDRINkNUZ2FENG80QVlYO2N7dWw4KE9aLTlNR1kzKkh8SUp+NygyMDUqUGJOdVROQDctWkg4ZWVuWE9NNVc/UVQhJFpgRCg0Q1B8NilqCisjSTQoYS0ocWYkK080cUBxYHopITQ0ST5+VyVmdV51KU1haGg5OU5IKDdPSkhuT3Fye2M1WVdCKWFxWjRUcmZ1dWFkSDR9d0RMd15qci1ICitmWilFPkotaFpiQmMmIVZnI09xZl87RzA3c3A9PW80YChuU0l+Vj1fLTArXyNpQWdNO04taXNNKj5jVWowdDVKRT93ajUlI2ImaD55fSpyCis1MHNXQkRkeEVWb0sxTnBPQUopZDw5QCF0IzxhXlomKy1edER7eChoNklqVkMkQjZ5dVNsfk47S2o4RHBHZStVKUVzTz1PdEJjVnYoUENTCitfa2t6dFhMMz13QE83c2pueXZTNjBecXI7e3ZeVGBfbnw9dGFJQTwrdGtTTFowO0hAPVJsV19sYHokJEFjanIybHNPYjxwM0NzK0pYOGBACittbkU+T3p1KGVyRX1aQiN6Qy0tN3Q/USRlQTV1czZ8Wnp5eylXUmUmYEpfTkQ+fE1zdnk9Uy1+NjBfREt0fTYjU3NQWGg3MH1ARCVIOE9XCitARSp4azdVYWxVTjBzSmgxQVJgJDYtazQ+MGQ/SVheKWVKIT0xe1pVY2hHbi1kJEcpNU85RWR3WXIoR2g7WHo7SGkkeGdeVyN7ZWgkYiF6Cis/ZikycU9NX0wqdytwJEFQcntNYSZmaW90KXpMXkdebysjb3QkXiU3aEBuP29HbkJGZ3NQPD8rRTdaKzBmazB0UUk/I3pCVmVGYzVLTkMmCisya05FN2hLbUJWVjVNOzxrT1ZHcTtQRyQ7ND5tOzdMaz1IVDdLNk17eEpDe3Y/OFFWdGc8c1o3dW1YWHdOVDdhNVpKMzZNTV9TTHNQR2FnCit5QTxrP2g4ZHlCc2QyaFhpaTRJa1Nke2xyZTlncnVTPnRxT3hDWmQ7eig7ZUUmO0BQYzA9dzMtNmcoZzlzaH1VZTlqbGdtaU47ZDA0RE4xCityOEskPHMpMVRxSWZWdTJBcnshKTtXckA5PGVAVjQlN0pGKVlFazBLP0d6Nz5seVRQQm1DbD0yRGZ6YVF+MFRqSzRXZTZTOzQ1Pk00O2BaCitQSUM8P1M4XiMxJEleX3pFe05oNmU4MiFeRUR6WitUcnNFcW5mMWtJSWJzdjBvUnBzPUcyTGFSTih4UkJ0QDQzLUIyWTV3UFVrcW8xe0MtCis2TEZaVUlWI2V4QCtZZitsPVBTRERzJiZkcXJRU1ZKcmIkIWgtWT1GYjxnWVRrd0BpUzxOTjhfPnd6d1ktRkF4b21pSWtiUDM+QE8kPzM2CismbFR6I18tUmYtJU8jdVlUdkZoTHMofEgtTUY3ZTR4eT0tZ0Q9WGQlVU10b3hYM15FWj0lVEN0VS1hRkomTlVxV2xJeU9nX1d3JkNFV05mCitVKElOKnVEeEs8Pyoha3xkZSgxaVg/OWdkV0xBUUt7Jlk1eGEqdkU2fGcpSXs1MncwO1I1SXVZVD01Nn0mKXl3Qm0mP3JsPm93OGE7Qmx4Cis9NW9KJiY0djh7Xkg0LTloSjxzOWcqMk9GWm1NR1pLaDBEeGE1bnxneTBQPGpkO19Ib1pIJS1NY0pkTiRFPF5QYV51V3okdXkrN1B6PzY4CitjYGFrJC0wQWUmISEjNzM7X15uZ2tTfmR4fmAreUZ4a34rR1FXQGYrQmlIKVNsOTFaVXhHWTVpa2FYYCt6SU1ibkxlPXFiV3c7QUJfVXdyCit7ZnRjLUBJPW1JSWxFfUVfK0plej47aFFDRXs/cXV+JFE7RT1TV2tnK3RGXzMpTzR6e35UWnxjdVQxWGlofUU8Ty00QXQ4IThVQW1xYEAwCitiKEB1PD5lZzNtOS04aUNDVDN7UjAhZ3x1WXdUdSl0c1RIWkAjJHwmZl9rYzklfGJpeHNyY2paPVBYPFY2PEp+WnFYNTZTbjNEYHolZEFxCitwNUErUTx5NzJWcSYqQnh1QTQ1VVckMEM8P09YOTVRVjg+SEJON1pXI3cxYmBONGhrPVQ3aTUhXzBXNlN0SnNKUjU2fkltYURGYjs4STJHCitoVjVlUVlvQjFFdVUlVVdjfWJ8fkJlWGJyRCU+KGZUWk4pfmw5bW5BcXpyeCQ/TzwmYTFANHkpRH52YyRSdUtNUikhRD4+bWBfIylkfF5hCis+VWsyPCtVKGleWUlFYigxcTJaeU5OSFFRNTg2dk1+aSN1clkzbWQ5WnZxM0pqN2lHU3EwTiRIYH1aYlNlI2s2b05AKHE/ckZtd09GeHY0Cit7ISt1M2thYS1MYm1XUypLdVQoVkU0UnN6PihJdWxKbChONmJiOGBvMilEX2Byez1aa1EkKDVqUUh1SEpLJVZuOFI7Rlg/QWRieHpSLT5aCitEc198bnMwJnFCekg4fSNMbjRFZzJtaHpTYmQwPCkhaClFJT8qKSgrI2h0aENwaEQ/ZzdfVFNFc2YkND12TldpMzlRdk9HPStxQ08lLUspCis/dlNGMlBpYmFpWHk1MFModiU2STklemxUdTRJR1BONVRQNGo+fXVOKSRSNHgyMHtMZ093QTwxNmM4VlVKb0F0JlJ4ajVePzZBbU8kRF9sCit7bWpSZXEobHkkcTIofCVfbjQ7M3ZaaH5PdklHTStxc0VXVXM5MCRnSXtLKWFRPSN9cC1+djZhR1JzTG83b0k9YUN7Wj5+YGl6IXFDcEhTCitIZlBRWVVIUDApeWU0V3Y+UFY4IzdiKDZPTUVaTnF+NF8oNCQ8WTN3Z1M7SWt5Zm1Ac3J8WVR2NG5Jcncpb2tqZV5xKzA5KzdhcFk5UzB4CitDVXI0UzRVPTEoRzFrWXBwXmxkVGo5bDhGbCRfT21ySj1PUzxkK1B3OGhARU5KU01gQz9pUitmUEMrZEtSbVhURjQkK2ZsUnt7SVgjfTxQCit3VStJdyZiNzY7JiY3QzNuakc5VXAwJmAkTER0SHZzcSFfakVWT09xKSlNTFZDViNEZWRMO2s0UCNaajk7SFFoanE/aEFpM3s1Z0skLVVGCitsNn1AM2BiNC1vckFYR3VJZmlUbyo1PE5GSjlXdDNye3dpRFRLPEczaE5eKVlwRkxBJE9iY3F9LWU4UW49O3ljezlHWjUobmg4UD40QiZMCitYMWlQKTYmJmtXPSN5dyExYVJQOXw9VjFePHcoUGVWbzIqYVZ6KT9AeytFezUqT2FxXnxgV0hBNCFwbEJOYF5Bbj5jYSZheFVsdDJXXmJ5Cit4O0BBfGdGcilRODtrR1NjfUY1RCUjV0xCNXRDNHVBISkrJmlaMWtWY25VSWJtbU5pfEd3fm8tQ1dYK3ImPyUzOXViKk4+fV5EclklK0FtCitORnV4KnNze1llOEVydStPNikza29lSXdARmtnR2c5OSlfXiVjRWdgWEVJViRNK0FoZFNuNVg3TVF7Y1J+NFNqYGJhO25ZWihteTlnNFV8Citrb2VVdmYoJk9JbG5RNUx5aEFVWWZzOVRmTkArZzE5QllVRnohdXEqKjw4bGEmcCVeRHtOdT5hbSlKR0xCJWNER1o8WGNebWd+Yn0obVRxCit3XzxlP3A4VnV8JnRAdTtgbz5YVEFfLU1wYCtsUlBjVDJjTUl0Nk1wYTJaTUNoOFJvWVdFcUgwTEQ2dC1QNkEjRzJzWXE8SCREbnY1ekImCis4cHlYUG1NJThfX3Z1TG45NktSUExAdy0zY1Y/WT9sXkIqY2JqVCZIWWokM2NgQ2BKJVc+VWpPYSRvdGJIcU45QjUtMWUxYlopOFFtYGNYCitvPiF5cFJ1dClGfWdwXkZYcz07bG5oLUBsLTU7QDNQI35Zd0pVRXVme1g3NTg4IyVHbTIoV1ZnZktRMDt9SlVDanhVQ2huTm5KMGVud3B7CiskfSM+RWMxRFMyTTR8NnFIR35kZVoydSNhVEVQbGoxdUVGUW9nPy17MyZpVlhtVTBeN30rYWZfczVeYTd1bklUbSghbnJ2KXh6P0BnYlUrCithPTJFIzc8SkhzYEhSYTxyOGsmLUZZRWRtZ2hfRlkkXzBkc3FYdXdLUnBkTlVRIWshXlF7e3QqX2ByJT5ZIV50NTw0YUhTOGh5KD4wUTNiCisqUExMYyMzakFVWUAre3l2bVF2byNSWUdVJnNGTn1XWHE9KH1XRVZlNDNMNVQ0O3dqUXpQZn1HNT9AcTYycmorRWZTS2RhYWVpN0l9SiljCitiZVIoQk18cXBDS1YydCFCWDVTe0dXPlN4ZnJOVn4ma2lsdE0xRisqeX5PPWc3MjM/SE47I2E+THJ6VFlGYV8hM3M/PHVsek1KWGtEKHAoCitrcGtPVl4wVyV7cW9QRVZoT2dCc1Ihd0FoNTEwcjUzKH5iWlJDKEdnKXo2UHBUIUl4Mno9QmN6Syo3VFAjXzN0cSU9SU9KaTNHRVI/c0RTCis4YTlwPUwlaG9ULXIwaXFeRlMtMWRHSVgmZG83NHF4fCpOR3BnfnA5anJiMERRalhIXjhrUi1aXkR3TkdoWExRJDZZakUldDh0bz5VP0c9Cis5TGp9JGY0VjJ1TW1IKioxOyh7fGhpfjdaelIkZVMzO0piM2dDVitFYHdhdiQ+SThqMm1aNV9kXmZuOz8jJThlbGhEVE5oK25rT2k1NE9HCitEZ1pAI3c4Mj5qRCNebHRxIW5ZVmFLYHNTNTBMP2AzZmIhSU5QOTNMVj54OTh1NlZeeiRKc0B+UV5uJVFZRmlEZ2pgbHNVdChUUn1pSV9YCis3YDhDSl5+VS1rSTJhMGc5QmxyQi1xPkMmJmdLNTZLcHREOWZkYnM2dU9uPEw9TzBtVHQwMXx6ZkpWPX5ScWt4S3laJGI2alo8SDdXNkNMCitGa1U0OTB6IzxpJTN6M0xHcX4paEYoZ081UVIjQEJ0bG1vVnJiV1lVKXlnY35mOXV4ZVVBckpRXjt6cFAoVWgjbEFpJkQtTHJKQUYzJEBLCitybksod2pRM0p2N2dBaGpodiVnS3p2eCk5alpTQj5HKyo5Vi1vUUhgeCZfYktmQm11VUFRT088TEZ5RTxYUyU/cDBzbHlMISMmVDBmfEBnCitqJlQ3Vz5KTyhxNSs2bXhrWkBgajtlMUxCaU51dUhpSj9RSjJoenRreXVRa0VNMi1kQFFZcWw2bkx7PW4kQl94dDNMUEpvdFglVE1oeGxFCitOX0gwZ1hUNEZDZHlTOFRoTHNvV0RDbGFra0pSTDAxWHUtX25gJGBBdjBgPzUlS047e0p1Zi1VWmBAJkR3PEduNUlrcylmWEJEU25JakBgCitYTmhaNjtUVX5hRnY+S2N2aDRPYG5eOVJLT3gxfEFhRTU8JGJFYEZ7bnl1SmBQPlpiUzhwKVo1ZFJVTmZgODgrfiZAVDJ3ZyhuWmJldzlvCitKeCNaZGJAamdFUCR4Qm51dXpENCQ8bzl5akhQWT55dnxAck56OUhUcnt8UUBORzVSNlI4WVM/IU55SWZ3MGZ1S1VSSHRPcy00cHpENFAjCitFJipueT9JaXlEPW4jUjZRJjVaYXFKZTFVUFBNSU44QlgzK2BZVTBRKlFVe3Z0WGNPIylVJXZ4aFhPU19SbV55K2p5eGJCcTI7em0mfT58Cit3NG8qPl5teDhsVTxVMCp6UTl4M0FjKzVMUHhZVUB7TnxNdGE5WSozbU8xU09FaXt8YnEmT0lyMmx3JE5ePUFQYVBrYlZ0OTNMTX5jWjBCCitZOGJRRWE9fFh1PktpN3BIJE1DP3VWaVREeURFLUB3NFhhSGBCN15vZVkxSFlTOXF+dzxnOTw5fTVKamZYZTMoUzcqQThFPlAlNWd2Xz84CitSUWhmR2g1Vjg8VzckQXRwKDc/OTU7aEN4bTJAfDMxNFIkeShyc1cmR3Q9TDRiOHpENjBIbktjcWs5fE15RE9OKzB6RWpXYiQxNlhTWjVTCit1Wj57MzlALURhVm9NX1J9Jkg8TjwoWS12UG01Jnt2IXdCWElRd2huTGFoUXs4JDgwNWV5JnNkZDQkTDFEMHchYFBedjJsXng2IUN+NEdICisye2hoZjxiT2BKKWRgdGp6UjFJITFFVmJvfT1HbWlvbDsmdXRGRzNXKk1TbXAqdWsyPFB9cTw2PjlAfXMkJVU3JUsxZ0g/Nyk+OERsUDdSCitCK2ZERiMoZmx7NTJQJlNQOH5BZWtWM3sod2daZj8pR0FDZWk0KDV+dWF4TV9UUyFeeXA1ekdPYUlZM3NqZ2FlMnlCKk53QURfd1khQXNvCitDVFc5SGEmMC1HLU9mQjE5OEQ7WHJEViZKcXVmPTkzM3x7eUwmWGUtbWRaUEIyQT1Zbzs9cCU3YEdZRnlBWDRmWCRMUjU7QnIyKjkpLUA2CitCZE5oUm93MyojO2A1TCk8RGFoYmBecDVzKjZKTnE1NXpTYFBNOHlfR2h0KU9LY28+aV5FQWxIPjB4NFJIcGZmWSQqXytfeSFEbDlud3dFCisqMF9ifGpwX0pCRChTLXBNR0tHNFZQUU5aJUgrJXZvck1ycTkhc1o8clZ9ZkFCO2hQJlI5RlRDeVhHWFZ6RTBmQ0JmPyo9NmJDJDVefTA4Cis5UUhyNFNNWGllKF5LM2ZXdWpHaC16VGtWeChtRnZeUF53QDB2aX5EYikla1ZWc1hPdntsWVROPjlaKkRqYjhVYFQjc1FQfXk9IztjR3BaCitYOX1FWG95bTEwX3t3NkIhamBSX2t1JTdGUldvWTc7KEBqaSt0cGxNaEhSfDgqb2pXWElAaTklRjhKeEw+VyFWJDk9U0FhaHtgJjxKOVVRCislTW9HfW89PXBZIzVePCopJSEoKVVKTWglXnhXJiVreVVrN3lmJHUzYnN+NjEyeihAVDdYZGdLM2EoVUcpPEgmN0RtSk8jY0JqZHJfTlMhCit0NE1qWDd9a1I7IThDZz5rOGkwNkEjVEY0RCtqcW1lM0AjRElHMzA7NVp3c14zXmNWQXJYVVFjJmtaPyt1NT0rcGchSlUqWTliS0BHPSV7CitBeVBZfTQwP2Y+U0tKaGU9YTBnVzJodCMoWFBjSmI+cmIqeTsraik5XkNJQWxtY1JtPlktc0VSOyRfVHVpWmkyeGIlQ1A3OW4+ZF5NJSg4CitBVCl4e2JoOG5ie3MobmRQVzgyaiZBWFBTQ09DbT92WHFkJkA5WD82N19tZCV4KSNHK2lrU2heTnptOGZeXjstKGQ8NVN7cndLKVpYfSs7CitBOEVNPHFwSlg7OUFsVjc7IzIzNiVZODZNPH1uYWAoTl9RcD1MTCYkTk9pYjQhOWxiOCo1e3JNMktCeDJue1FvQiN3ailIPVdxRUttKTctCitjc1hJUCZfU1lXcnhiaVBMMld2TmY7TnA1bzVfNEB9a1IpK05oRT57S0JsUD8wYT5EV2Q7aiRkTyshbTFxe3hiTDZDaE99UXpzSiFMNEBiCis4KTdNcjhVPH1jNSVwdmxZP2tDbzdRUmRvQzVmRyg5OF9wVDd6K05RYXIhKyh3WjMmR05GKUJiSSRiOWA9YSZMd000c0A7OUgpT05lWUxGCis1fUFeXnV8LWtvdXUwJSVwK3VYZ3R0N2AlWSRDYz1tPD9VcmojKFJ9MzgkT0pob153KEFXTmR4K0k2OUpIVCR6XmNtQiNGPlMrWXN6Y1FeCis+c1FLc219Jm5idyRhbVkjMlJwNGtTfGBBbnkkWDROaypRYmt1MGV4byQyLT03QSo1aTd6eH0yVllrNkxLflVSI2gkUzwkLVIyaCV3ckVACitleU9RUz5jTntSR1VPUHVrIT9XdCRLMXl1dUE9V1RjNDYob1QwMDsyNGd5LUd0MCs2JEdaMCVLYmFpczxFVUdLNnljRllKYW4mY1V6aGAjCis5OSRYRCEqUGRGTzEjfCozZ1VOU088VHspe3tXZjVqdzVsJSVuMVJ0dnpCdGx+ITAwZCh3ZFRNRE41eCMmaTlORTgmQ0Qpek9HYjlPSis4CituaSRuaHNmaTRkWnF5V29KaVY8IzJMMiN3UyFjXkdkckdAK2F8OFJ7VE1YPmtpUGhgVGd1eVQ8MSN4Y1h0SUZlTGk4JUl5V01vYnIkVCswCit0JG9ORURgP29INyshODlidCQzMnBXMjlhSnJmWDNnY1NjcSV+KyV4Y0h5RiFNNz5sQ2NEek85VT9+PXZ2QERxK3NMITk7SE1acEJSP1B4CitCbiR8bENOM1pVWTQ5WChlbHhYPjtJMUcyby1eMiZpcz9+aFR+cjEtSi1tZUplZjc5LVReYFMze3tfZCF6PTl2JXRuWkp3Jk9kYj8+cDFeCitVQmRKXnQ4UXdmSnVNd3c8WTNQPUt5IVdOPTF7T0U7KDQtNlBNa344aWo4ZlpqNlZKRSRHTjxEeWUhKElNczh+TG1AbSpoOyt4bHcrUFdeCitVM213dzN5NVNMUSZRX2pxc3NqR2dIJTxWOXtxWCRGLV5CVGdTM2x3KztxP3g+P3lqdDxHTXtlUj04RitFQVYqJUI5MTYlZXBmc0t2MW56CitCZzBHY0FFPyplSzVGNDBoYSNESUwhbnhvYWcxfEBNakJGRWJ6dEF4VShBWjlVaCN8WDZuYVcxN2p1TElPcmJ5cnc1M2dwO2lrQVlyfiFTCitvMEVLbVAyPXBaO2pZIz1XWChwcUJKdEsyRyNkZml+RXI8VnJ7TUo9dHV6T3I2QEtuNFFQRjtQSU1WekVBQCpeT3IjamJHMjc9R31vR0RfCit8OVRDRkBJVkVocl5YZERGQUYmNn5EP2FRP19LJSk1R1M9LWprdWJKWXJLJFl4MlhVNlprR3pJUlFRbHt4Z2pZakh4YTxjSHA/PkA2RkZZCitXMWs1Qm5hK2dpMXk2OWFYaUJBXmhDYUp5NzE1KT9xe1hMcmZCdy1DSn4lQEMraSVvTUh+N1lTezdxTlVyOHM1Kkd8JXZEZW1WbERFa1d1CitgVC1wQz0zSE9USztJQ1o3SnhVO0JadTMofGEhe09Ed0s/N289QkN4SHV4QmpER1ZDUXFLaGZSY0RSXypoTE90I1RUezBjY29Kfi1nSkFwCitqWmItNlRjZGdNc0JmJCRGK18pPTgrPH5VKXRkKS02cUtoYS0zYyM4Kk9rciFqe3VPS0EkY2BzQzd2KmltaTxzRy1oM0p9fXdvJCY3bzdkCitKKFFQNVRve09nQV5qVmdDJWtATjdJVD9PalJ7YkwtNX12QjwySWN5ZWx4a0oqOEs2Mk5zfnhKVG8wR14paGlkNXh2VENeKH4rK0ZFaTRpCittdTJFVGszRiNKcHItblkjTj9ybzAtR3dfRn12QXM/TjdgdiV5dVpoNz5VOSQxWWp9U3A3d047ciMmalVLUUxyd15SJVlCS212UC1iZTEwCitZMC0mQD10NEdGcHktM3xJYGsxKGszST0jTHd5I0ZabXNzRktNMlJ8eyVEaj1efXFJQnp+TUQ+Mjl2UktDdkgxSlFffi0/KjUzazlkfGFUCit2QmlJMHNvbCRORmJ5RF4mMnxRN3tgPH1rTlJoME9kVjFJcU97WlElajtabW5tTjZWI1BqS3JlbVRtaUBsdDM2Um9COWB4aUtQKn1wcUNpCitLXk8qN2B9VThmRW1odXZDTFhXREB5SH1IcE49ayZgVjhgPXgqMnM1bDc8diZlP3NwWmgxQ0dTeiUye18yb21BX2d1YyttcFcyR3YhSy1qCisqUGowdThTS20hck0/QHFKKXAmLXlyeTRqbHdJMllySz87KDJFfjRCPCFqJnpMY2QxYiMkXmR1N2dkPXdUZ3JlfCkmdVJSeFpwZCtPPHBJCit3ak9DTTlLKjRDPD1GZ0p9OTdMaGQ+azM5bH5gN19sMlZJKCtnKGpie0ZUIVNzME1eeDgkSV8mfD5PNl47VUlrX14/VmdUdXJDXmI7bHBOCis4WGkxJmMhYm4kRl9RLTZPK35rO0JoVDN3ZFBrOVg4d2I7bjNAN1FAVHxaTkFQRk92UC0wTm1OOVdydD4oNCRjZypRY0U9aGtINmxJcUg8Cis0Nm0pNUJ5WSp9MDIzSW1PNVBlRlUhKn5SVlFxNnQha2dYNEo+JT5NYj5kM0BSKSlXJGtoMFRBUFpJeVEzPkJoJUZYOzxNXmJ8bkYqa0ZECit0UER6XmV5O3NLUmghLX1sfGtpOFhMQUJDfXI4NFFORnpoWX4mR1Y1TWNjaEA5K2JSfHxfYVd4cUFLXjBpemx+ek1vZWRYMGglX2dqJnFICitEWVApKm42dzI9TUlZa2Z1aVFNO1NIWWR7Kl5fcHR6K31ibHVSWlhtc3RBXyFkMFFNT1QoNCVzOUJgZ0YjV3xvR3diPm5udTFVMzQ8KWwwCit6K2sqYTR5VHhDOE9jPzhuNWRrPyVMS31XRz0jMjxXYlNwNmFmVU1yQHRrcjFsMjhGI2FtXzxYYkxGYXpYMmN7SENkU0Q9RFRDPzxnUDlACitMZExucW4wIzRNTkNvLT9LKX1ASExRNT5jI2sydmYqbHBjaGBfalBKdmhPRT5vV25uYFYtfERyQTwhJG15KnF2YVdCakJ3ekkoVjtkZTZDCitAZCN1cXQqNX1USEJXIWwhKkMzWWIqNldpN3V7SGJIMDBTTDVOQDBAZE1uJjEqWHNXO18kMDd1NlIoeHkxWCFXKG97Sm5eYGI8fXV5R3xGCitgdlJzUmAtRTBgZXNTbFUwUFckP19NOXtiUkIrQ0AlSHp5T0YtcGlWKGt7TDRMU151Z3hLTFZGKCFLT1g3YVFgRzl2Y2trLXYtTWYoQGEoCittO0Z4ZVRUZjZWZWI5T2V1OGtPKXNgNCshQj9yYSZDTy1pTz19Kit8QT0/aXI0VShVeiE9YzZRWnsyJEp+e202Tn5WIUNrWGNtcXg8al9ACitCMFNwJlNmMWhAI0kxQUBjazRvSzV2NSZgP0BNTGRIISV9dU1QLU5GQFlqRzRmfVU3KyQkZCppVThUaCE4dV9IS15aZWBYMWgpTWZFa154Cit2UiQkME5UMDI4PiZUcF97bGt0TzlrNEw1cl5gb0BfNVMoSWA/NXBVNnhCQ3Nkb0NJc3w3cWsrUUZwNUozTkV3KWZxQm1CMjd9dl8lKEp0CitoJSRhIyh0ZEs/QihPPHtWcj4rI0F5KFVNYHJvbjhPJUFoZXVjaSg2R3hhemJaXn55PVVLP1l7VnN1aHU+Mz9yb157fVJlITRrfl5fcXshCis0KlQ/JHRNZDFKZm1IPEhAKUNjaGBVPT5aS2hvY0l8O2pmbCUwUWhlQyZDREtkbzttamUjYHpwaW02VFAtUGJRSk9zcFkwU15TKzNLOyEmCitfP3pMP2RsaUpZK1JlVDtAXkV0RGlCU1ZVMmNRezsqP18lKlE9Sjg5Vzx+PXtFaSFQKWg+QDZhV0FLMm10ZXk3RHc0P1A1c3NaMDA4TCgwCiswMHBIMDAzfWxhNCUoZVZgWHIzWD5WP0dFXnY5Smx1ZEtmRmM2MEN7dU1qRXY+Y0tqej5VeHJJS1g1JjB+fDlPWWFRPChPSi1MSjxsaUl0CitnREI5MyZmdUhuZVY9IX48aHJpIWU+T0EoX0QmJXg4Mz4qRGM8NmkjRmt0Znk0Xi1FNilyIys3d2AqZ0ZMYzFNc0tYP2clZC1YTzMrRC0zCitPUlclaz5WYXZuNGg/bT5uXmpFSmROS2F5SVB6ZVNlZlI9Q0JVe1FXPjhxaXdJPU0hUktvZUEmQWspUztUeihpcXAwNH5IT150MHB0IUFBCitFU18+TUlRP18pbXk8aW1ySCZmTlowIXI5XnhJcnNRU00tQzg3cEBzJlheOHhrKlpLZ28qcGI0U3ZETWJvPmsxVylhMyNJK3pgQikjPShpCitUTiZEKH1UZjlHMHFjNWNzQnZxR3xHP3gkK0JWZypKSkJXaz41V2l3JFlgTFBfQT04IUxxN0dARnhvcVJYWHc9bT5oUjBwaFI8ZXF9SGE5Cis0OFheSG80Q20yJntrO2RjXlI7enN2KjhUaV5IU3skK2IpMkB4JjFCY3pmTW5ueyZpQCg5Tk1tKkFRRCt9YHxBa3hjMmp4dWZoQnt3akE0CitQITRoSVg2ZGpNSTxrK3RpRVBhcyVac2dVRzxSdU1Dbk1LZFpiQmEyS0JMbCMye3BtWHNkUmdmK0k/ajBGKk16Xk1KY3k/bnRoailhNn10CitQIUZZRVFWMSVxTVoqVTQ9XlIqK2djX3woQ2JqQFhzJnFhfFBaTChzMGQ0RHd5YDNGTjJfOFA4O29zYzh4N2Y/JEIxUVktTzAwO297bEA+Cis+V1V8T0k+RiNySlB4JlF6UzAwMDFSWD5jIVRaZShTNkVedjlwZWdBdmdIaj8tNnt3ckFkdlhVQiFpTWB2cUo+UjskWT9Ac0N5bEkqelBUCitQQip0V1FUdmtqMEhlc3c1UmhgfFdSaz1ROUk8MDBfIz9DaHRAM1RgSDVuMDJtQWdeOV9UK1ZEUCUhSEY9QHhxKkNqd1FIIUswbFVNcyE3CituMzl9N1Yza2wyWk89VXZNTSpwWV97QXJ5R3FTd054cz5aUmcrfWJiLUNVKFk5QGFsOXFJUyReNSFObFpwQCRhbl9NOHcla141I280aFApCisxRVI8X1lTSFlyWWhfQzNqakVjbVQtV0FCeXwrSjBgPlYzJEh+Ql8yYD5uRXt3cT4xdiprO1lqeXR2SihnMVM+NU5pVmtmSGw0aiEjaUZjCitJRHclR3xfb19+SilxMCZAbntJOGhzI1p4PkMtUXA2ZjhXMSlyR0Q5fHheViNMSCU9R2s8JVQrR1lVSkImdjhZc0N3Kl9jaykpcjVycWxCCitKfFZtVjNYKj9nckl2dSN5dzJ+K3o/UWsyeXVUanpnS0dobE8pKVl+OzdAazhUJjBYYC1TPEhfciUtKENGbFoxKEtHLSNtTUhkR1cpYCVTCittJGk8RXZMY3luZ2ZTVGolWEs9dDtVeitlKnpkT3JQbzFZbFlELUV7YSRBX1YrJnZuIXs/RTgwPGlhcyl9WXRaYCo/RSEoNDRXdlhKM15vCis3WVgxVSs/aGdXIVhHMGNnMTNve0VfaFpsZDVXWmBEOShHWV9ZIzY+THclN3FLX0JGZG04Wks9YW98SD1sTlBPTWl8KFNNWk1ic3hSUzR2CitCV0h3Kl4wcnUpKn19QnstSUw0Tm4tXyFgbiFaXzYzaT1aS2lAKWUpVFhqPHxSNjk+dElfPFl4Ry1OKFdzfG1sRyhlJCold3JjeWspMzJLCitCIyk3ZTNvI0V7eV88TDVBU3Y5OCktS2JgXnJEZU9NZEcxaUJmd2dLaj4jdjlnQ3gkRXUtdUIlTWt6YCUmczx7SUF7Nm0reHg3cXclaE4oCis7NjMke0NwZ01aQlEqRGU2bFR4NVBQRkpDO1hzPEp2ZEktMVJCPldIVkRDdlMoKEw5Zmx6dlNfTXVKKTkpTjwpKWQ8b0FxcCE2XnBmK1pICitOSjdLO0NANFRQUEhHI2hwfm9Lfn5sOWlyXmg1Wj9ibylOVnEjc1NNO3dNKjIkVmtESmhwcHQ+KG5TbENzS2FXT1h2U1JPKlp7KU5JY2xKCistV2BEYmlJRmNAPUxZOXs2OX59TjAtbEB7YG1VWT8xJEdFfDg/PjU1Kj1oaEkhPFdtSDY8fiNOd087SU1pdzEyS3p0cXowSW5XUGxFSWhxCismdj5GZ0BaYWxsb349PFlfVk1LTy1fcG5VLT1wOGhLQSlZUEpVVGZJS1BgI1FPPi1+SExlVTJ4MHQtKTcpTlE+MlE9Km1ee0JBVTNQQkVLCit9c25+cC0pcGVxbTVVPWoxZ3pTN2xvNTg1T3t4azlHQCExaSN2YHxhaDFvOSRwWDB1VlAqMkllbDZEVG9CRyFhWV4zPWNyNFFsY0xlTz82Cis0P2p7ZkM7SFk5Zkw2Vip1bmNrR3VvanF1PilyKGE8OVBWTVJBJFpkTSF3S1ZZfGpvbCR1I09kQDlvbmNncGNFMkpTezJgOTN6ZHJ0PWB1CitpbUw+eHVtNWw+UmdSZFhPJWVxKD5HP2g+KE41biVIVnl8NWpQTz5nXnZzand9K3FkaDIlTCU0VmdpWmVeKipUVD9+VGszdXgxKzIocVlDCitCIUdudiFxVmBrZCFgRF47d3t2MlZtN05wOUFjOTI9P1opXiFEb3gqdzJGNnVMRyNYWFgpJTBMMSNeQTJrO356QSE9MUZvQ2ZrR2k0VX0yCisqRXpfJm18TiZrQF4+bWF5YHhTMFZuZWRzaFBIZ1FJMGAjMlpNTVghSjdXa312bkckbHc9NDs4TkglQDUlSWpvRi0+QEJWITgoPE9felY1Cit0TXJCMDx2Nmp+MWUzaHVJLXBfSXcxOG9lQW55LXFTSG1aYkhEc2h3WTlmVEc3JWBnbmVOcGloVUFaeV5gN0g8Kzd4bSFIUnd2Zm9Hb1JDCis0Z1A0U01wcH1XfTJKPDt0TW0ofGlYQiNWMERWVWkhfVlJekhwS34rVnpKfEIlSWBxaSE9IypyXmB3Wk9+MWlyOFJuPD4lU0RSdWt0N05wCismUnE2SXhXUUtYJjBYKXZrdjBmcWtuISQwb3pQcE0tfmNNc2xIb1AmZVBwU2JCal8xS0BHR3gtZG99TSY5aUNyOSh1N3d4QCh8IWUhPFlLCisteUIjOEJ1WXoyPl9pWFBaQ2R6TlE3YyYlamVCOE9ANkZKJWg0NlFlaUhkJU5ye3JlQCZiIVVtSlg2ZiQjcV8yKXhMZDBAPn5IfV49e29qCit7MCtoSiMwc152UkFESD97TFlzS0pEXnpmR2d3YnFQOW9QRVFnY3tyOGctQzZASz8jMClGSnskcTxPK3BVdFpDZVg7c35wKWdzQk5uO2xsCis8U3UqSXQ4Un51dntjcXpJP1o/UjxjbG1uWlA7WilDRU5PJW1hNipmI1k2dnhYdnI3SSF2YHQhQ3dvazU9MTAmO3xkITBhZDUjMkw/dVBgCitrYzJ+YGBGRVUzJSNybVhnOWEjPDRuP1g1RTdCS2E3d2ZtPWMje1piIXQ3SEBaaUVhMllpS01OekVxKXRgQ0FWX31DdVRAM0Z3JStxaHNfCitNT1RYVWJqQVomblI7OXNeZCVwSl5kYkh5dHE3Z29ETXA/SGBlQnYyUnZES0h+dkQ3IXo2WWsyR3lOei0rSFlCSUxefWA7bk91eShhUTs1CitiWUJNalR2dUshOFYjMDRnV0M9STVEMD0tRXdfdSFxKjUjY3N1VHRDJXxRJHFDaEdiOVReQV87Q0t2aFU4KmJXSUo4MjFsR3VmQSorKWpwCiswfHs5QmhoSGRVSC1hfkJTezJrMmxKYylmJXFRZWF2MVVjdV85fi1VJXx2VVlEVyNSbVF1MmI8YDlgaEUrZHljUWtHN3AhSEtWWjRLS0ckCitRITMmeTRqfiRIfCRWNmF5dExvYl94bUNpS05wUWBVaVYwaXpkdj84NjxIWWNBQX5yQiR3Y3lvTGY4K1BhLXo7PnVlSCsyMzcmQzx4QVRQCitoWCpRSzlWSXFqSUpROFBsaHNCbGxjZ1d8dVVRbFliRUozQEM0XnNVe3NibmlUWnh3RVRuXi13JlBVT3pGKmtFZmcjeGFxZGpGMkFpeWBeCitnT2RBUyhaTTl2PztERUNONURLOWxiNVA1QTEqXnFiI2dQOzdiVilSOX1fPGlyO0BkMjBxXmJuPm5SYEVKTCUjQ0xEcnl0PyFvbXVhMERQCisxJElfPGBJbilvZmw9KWAtbTNzMzNFMmBXQyFwVHxBaXU5Zm1Ven16KzIzaHY7YD14TVQ1ejJoJkJqVSM5dTgyXzNFYW5HKCg8ZTF5ZzZXCitiQ2s/dWBoTnVxQ0ZXakotKT56UnJtYlFsQC1BJlZ0O3RFI3tRRTNsVzdkNTE2cEJVd2wpN2BubEZ6LW16Ymx3N2UpWjBLT1I+e15BPzh+Cit4S01QU2E+NT1mS3JiY1MpckNMWF9eYSQ1Xi0pJjhjbH1YRnoxeHJDSWViVDJHN14wdG9PKE1DfTY0JEw3NSp9RypmUmdZfFN3bVU0QjVHCit9Oyg3Iy1PN2QqdWFVVChiMHltQGcrbExwKWBDWVlvbWBUNUR+bXpYSjx8THI7PnNnZkZ8SW5xam0xQjtOODZVd001MEA0WiRTfGlpOCQrCitPT2lHeENEOXByYFd7RkBzVUN3QCQoPklrS3M8NWU2alQrUGA3czx7JGxIZ1ZhbXdJVDU5VEB+dz93SnpAaH1xZipWN3g8YWphMkhTaUtqCishaz4mR1FaaGo0WTVGRiVwe3VLWCtidzQpbWxKPXc/fihrRlRsOE42O1p3antQakI3bCNBVU8hZ30oR0hWK1pRZiRSZ1k/QWw3Pmd9TW1CCitiNHt8eHlIK0YyN0s7dkBZVjl6Ym5gOFJsXk5hdWZ7QEVHem56fm83JUg0VmFkTCFCTlc/ZiEwR2xYPFhVcz5wdTU9Mk1xeSQ2THZGeHEmCitDKmZxdT12KTltZWZETnRLMnVrYSVudTl3NCFeKHJ2UyRGVFZeLWplKWkreSYyI2k2Xj9STVl+XkI/JVFYSHF3c3JSSFkpY3p3aWkpd1cwCislUy1LUSRFemNEPlVHXkI0XmhWcGBZdGlmWGNUVj1JfmdUfjNoWSNMLW5vWiZoflFpRG8tQTFzejY7dSVYY1M0Iyg3P0trRXNAa3t5aTV8Cit3cFI+QGB8PXVDPmhicFJeNCRgQ00hJXQpLXpaRHxsSi0wdlh2fjZXVGVxR18pQmhTZlopPlREU2R1RFZ7dkQhdCNSWGcteS0lQVF7Ml5LCituaFlsVy1KWkJSIUFEYVohenN5Qz5oYUhVVipraW5zcVdfMm9xRW9OMU5zRXpBbUh7MCQ8QUM/aXdhYWR9WiMzLSM2NSFMUjNtPEZWYm16CitAUXBLZHlSYHlXajREPSNASzMtRTBzaD9lezc5aXQ1d2wqJV5reFRBI3FTWjdDVDJAcF4xUldnZSo1P2VUeVk1WisjQCg8aEYjOHg7VGtRCis4ZSl+OzlUSXlDfHE8TThiTUd8QWtpKl8+NGp7TlN8T2VreHswU3p8THtXXlcxQEBRfS1zRyl5NzRIVGN3aFUyM1VMdytsOFBxa3BXQk1LCit8VEh4UyluX35YSilhWVhyKmpBeVNxTUJOMzBpTSohTzV+QntNWWBkKURNVnpKJFNsU0JLRSMzOWohVzdiO3pRRygpUm5ZR3AtNyF4fipgCit+PXFtbjBCfkh4blNvQG01THhTUlM0cV5CZzJyMyMhRTxBUmcqQHVvbXdAYDwpKHlSJVlRaVQrVEl1OF9UdEQlNkRxN3g3flRmcjBwYE89CitldDZ6Z0Y5X1V5aW8ta2sze3xnRys1ZU5pSHhIZzlKP1B4Jmx8UkYzZShjdjxvJU4rTUd7NlQkaVpyPEQjJHVIbC1SY1pnQH1RVy1gS1BTCitleyF1dyUkbDlWRmpnQ2Y4YTk4Z1puUGVZS14kUkdFZmtpZjE0ND9waChBZmkoI0NGbVFBMjl5XkolSnEzcDV6dEA9Vjt7c2RpK35MPiUxCiteRn1pZDcrdGU2YiU/NHZYekFQSmNtYXJQamY/JUJzWHFvYEV4eUJGM0w/bHQ+Xk9vKHUyI3J4bUJGPk16MjVQcEx4M1lxRGY3YntpN1d0CitCfSZOZlZGUXpDPX5BWHhUZmpBYk9gU31maE5iaT1ZZ0hCVWw9KEBUPUc5TlU2UlA2aT54WlViK29CNX5kR14/VEJnckFAfkpkWSlYb3luCitPVEkjZnhYKCZWRzlLOG5HTXhCQjU9TUFmTVFHeWR0fWhYbVFTWCtXZ3didGRmZlRJVGw+dWkobmtAYTR2SF9pbk91UndMMUdKREVpaT01CitWYVVaU2NMUT00Q1JQeDR1YzFeaz5heTlmSXwwQ0JuSjl5IVk5KD9xRUZmJSZfRzFXbWdTV1drX1dvOCVOUTIkajNaTXA5b19iPWZ3NDA/CisjTj5jPnJvU2lAaGgpWWZ2dlpKYzM2dHUlP215O3RgbEhiYHBiX01BQ15QbTs1QnZMTEM2K1p9Y2htXjI1V3tGakVIQ3JBQTE4WUtrJDdKCis7dmJ0Y0ZZVXV3eE1aJDZzVyklMkFpQFIyfGEyNlJgeyp+REE3diZzY2w9aWchRkFLdyNafncwKz5ucyR0TE9YKDNfbV9yUXYhJWIzMnNhCitjWEYrQz9udz0wT0ZVPkp5eGg+cTl6UyVvQ01gR19GUm0qfVo7PWh7S3IqPV91aTZfbjlob3hpQ1o5bTxfRlVVKiNKSE9tPUlrQGVfaz84CitSfk50KWgpKTFKP3lpWiRKdjxIcn44NDZBbld2U3k0K2dvdG0kKkJDal9WIVgyZ25uaXMyRklBa3BTTGtOYXY1fHxoWmZmRzAqRlZNUGc0Cit0TSlhbn1QdWUlZEg+QWdUMmFsVncrVn0/cnY3NztKe2pDKW5aO1EpU0BSMlhhYyZzUml4YD5ISmomMUV6ZENgUW1NPHIqQGNjPjgkPytNCitLMFZpNFYlKzdhTjAjMlN1fnteVEVfeFdWeHtnQyR7QikmQWNjI0A8RD9PamVNazklVFRoJD9KNjxFK2J6QnU+JGZwPUs3b3RJUV9ATVhrCitrMUUpcV8/MzZGdUhgVHNkXmY+dWhDOXBIMXd+SkNSd05STGFXQzhyfSZQfE5HUXI3cT4ta0FzfVRCY2w0VClDdmVMZGAzIXQ+IWZTa2FsCitWem8pVF4oNklodyUrbk4zdS0hSnM9UHArYjAzNmNFPERtT15OSztmdm02cDlgemdYNSZFZGg2UnQjezJzYjF8X3ppVEw3dGBjckA1RyVpCitqO1dITSh5SykhZGZWeUFXMFNiJHJZfCFTckx5IUFuPnJMe0k8TiFrUW05TTJTNjJldTh3KHpWallaYnU3Mm5CfEJARzx0Nz4+UCp9fD9qCitUI3ozOEckOSU8aGQrVjVXUWFXKiRvXnNqU1UmQnlDbUIjKXwxRiRKJjcmV2xtNWt1JDFkMHF0MzZuZDYmTVUxdHZYfE5kNTtOTj9nQTVZCitFcH5pdXQoQzNjMEUhTnRtbjtWejZ7ZyVCIUAzVzlsI3RhWlljIzklRz1sQ15NKXk2KXxJfCN1e21XfnlHPkNiKllqb15sN301bVlsdWJoCituYTdDKHgpISRrfCk3dDxLcDR4Pm42OURwZVBuTyVQYnltd2VvKjt0OWVTZyY3ciQlJTdaSjkmenYmeUMyeXNecTBrTVhUKkdHPVFsJWo8CitKcXZeaHU2OCo7UU41Nj4/WSMxdGdVbTkjbkVma2lTQSl6bWcmeVRpYUkjJT8lUFU3TUIpNTRqPStaJip2bXhkSF5GTkprKChISG9XWVh0CishbyFjWUFTeHZWcWl4MmxaTlU1NXl6TEBpVUF6cnhuT0sjPjJvMEgyWXxRbFA8SzFJTzFqbFEhI0oxdSV6cUsjQm8lJSgxQ1RnUEBlWVhqCistenBFczRueCt2XzBUJTdfXzE5O2BRUyZvQmVJSipISnlnPX5SeiolQTxUeDRAMFlXREN5bnJXN21HO2NxTGdCTSRtaWYmMm50cVVQdityCis1Qk5JRllsYkhhcWN2PFZhakprMzlRZXVGanhieFgpQEZ0KiFrPVFiMjFlfmxvWlNxWE05Z3M7X1NLclBJVmVmd1otR0htTVpJMEA8e1U4Cis0X1FfTDNKWDdgTjlWJjE0K25pMCZ1eV5fVmdKOGcxWkh+Wip5XnJuQzF9fj1kYWxqT3c2V3dtSTVCWC1kNWhGPkhVKzMkKip+XjV4VlV2Cis/cWExJXAmMDdAWW1sbD55M1NQJT9FTGFubyEpQCQtKU8lZlhmXmhTY096eiNJdDtBO3YxdX0rQzI2Pk5sJUxqWV84JF5vVTNZSmZjRTAzCitNLW9MNDUhekgoe3VIKV4kKTlvTjs9aSpvKWhoI2Q8JFJHeXJ3MlhxVXsoRGgrb051bVFxPGlzNmViezgyMCNPUXMwX0sxYEBZakxYdTtjCitIWUJAM3N0ZFNjNGViUkY0P0R1WHtvJk1CSThQSCQtNzZqYTdBJkM7T0F3OWhgalk0Nk5TU3pYV3s8ekx4SzE/MkUpcmptSEA7K3tfKjRNCis3aHIxYXF3IzhAYUohO3VjcmU+XzE8ISE/Z1ctX2M1KCQ5U0pjeyt8KEF5VTlxWl5nekBFK3pjY3JvJk8pLWhVZkJgdldoaEUhOU1Ucmp5Cis+aik4dDBmYSNMTjlqOzN9Z1hncjhndVRPcG4+P3N3fDYjaW95dW14I3otb1BmWkAwYXZ2UEdYS2U2V1cpRXQ3KTFSTG5fa3Uld1JvNXwrCitvYVBiMjk4X05lQnlfMntvQ19qazY5ZEJpdmc8fko2bW9aUURoOGtzZW94JGczaVM+eWwqXkVRckRDYlRYZ08rMzJrPjJUTz9xX1lxTyFlCitaVyU/RFg5YzQ1STx7WnpDSWs+KjVRPihrZj1Beyp8K2xHSis2fjZCcTtnY1RrdShjJmw8RzZKM3trO25yKmklOWdtZj80ZlFMaVdCPmEjCituVERiRzQtRU5nSEFLcHVDdlBjUDJBYF5tPHo9PXNEbGAwVWhsTU41RGZtNzB+XktIJXlDaklhNUAyblVUYCt8eHNAMVBIVzN2PkpPbDx7Cisqcmk1QW9yd1JMPjw5dWhAWUBHJXg2cWJyMk5lQnIyT04pPmc3X2FWQiFEVTJrdlg8Ykd4K097Y0F7WW10fiopLXYjOWlZI3RTa2U+TSkrCitFdDJ6ZGxePkVgM3AmZ2hYPUJpfUQhPiZZPEg9NTtya29VaXVCbnBJd05ObUI1MU83JEs1TVB3UHBDTUVhdmdDQmlvdGdwYGpidTZueH5ECishfWJIanhDYncxQ3J1UCNibntMJlJDWG43OUt6PnpZJk9OMnEwSTZXRkllMldsfVY5UyhQU2ZUaHVzZjVGNU1jPmx8VFkqTVR2WWpNOV5wCittfXNoWFQkejZFcmdPOGdOIWBtZmh0TDtrb3lMKFhOOS0wSzYmPU9eKi03O31gKnwma31FS0BMbUx5NlNBVDslIVJ0JS1IZTcwVDc3bVR7Cit0ezdYeG9laGRsfXA7OyZ4WXwwaEBGTXJPcE9FSD9NSCFGe2gzRFhSU1B1O3gxVjFednZXS1BFbDg1YyVPWGQ3aFRlNihHc1Aqd1RWPzA8Cit4QDFJQ3dgWkhJMGc7KXJ6V1U4NTU/KChFVDZLP3dHV08xQzU1U004STJfaENYT0xYM1lNRWxZYnI/PDs/a1BUKmNlc2NnVXxDRF9EeSMrCitLKGVAOD9jcHd9S0E1TkZVMTlUbithODNnRGo8I1p+WnRMeGRvZFlLIyZsWjZjVD5DYFVEPDU9Oz1TaCpSX2tVQFJWOHt0Xkd7UXVNVXVqCiszS1deSj8wNSlrdE9kJjRqPmFYcHJ8PSopNDtkaFppIyNtdmE9RUA7XjlNXlooYz1mcFMzTnE2R1JGSmVCQ0p7Ji1PWEVlaTN5ZTExJFhGCitMPCMobk50YEkoUXBKdDJzPCV7clY7ZCZ0P2lKVmpiP2x4KjcpQCpPd0ZTTXokfGJiU0U9a2BqQ1I0WTQ9a0tOb00zYVYjZ25ZLXh1flkrCitveiR7NE5IcHpQKCkqX2NyMWl7VFY5eHFHcXtoeWUwd2dBazBRfDgodkh3PW1ENjY9PzUocHRSNHp2UyRXMHpiUz9qfXFCUiV2VzlISm57CitIX217YU5NXjBZKDNePS1nbmNkTU98YGRiRz50S09vfCpBVUFYPmFVYD4tWFpSfTAqPitVdkdxSVJZZ3VRano0RUw/Vl43dloxaipfT197Cit5c00tcU9YTH12LTYzY3t3O3M8aH1MeyVBQSt3JkQ9UFk8THFyaHg9O29JTGwkJTIyOT1BeHtvaSE/PEFMIyNAV0wtKXdOPzMrPnF8c21RCitQMEg2fmp1Qz1HKFM0UkRqPXkmVXRFIVE4QHJrPnB5PEdnd0AkO1g0QTM0PylReDNAbUZ7N1opNj9MTEo7flMpdnNhPC1+WkorMVhJNTdfCitkJmRsdkdibClHYyV6aCljYW1TNlYxXzg9TXZhQyY5PEVjNWpKcCtDd2RaNm4zUCpPRipFQSpmTCgpNkBvbyhWeHRrc0RBbVZXPlphVzRsCitWV1cwYi1OQzY7QyY5eUx3Q3whYzxpfUVsJn1XRjBVZnUrI0dIOXJSTVl9e3RUSH1kJVhZSkkqR3U+bz8+YHZpJGdjVzk5fVRvNWNHWUZPCis/amlSQnFDKShQUW1uWXEyalp1bCpsYF9vPG83Qlc/WE81JlFBWTxtUE0qTUBKYnw7MjNVTHNYVjIkR342IUJ7b3ElPlc3O1oxbHgjNCpSCitpQC1hKiR5NnBHTEdoXn1jQzA8dEo5TkZ4OC0qM2hPN207SSsqPCEmJlVfLSFjN3U/dH1YaDB9c0gpIylBMVdfckBxZ0c5S2lYVjRyQkEmCistM0lAXlhKI3g9MlV7NUpHMVREbFhpODhkVkN8NzgkMVllIUdpO3JWTzM0KnF6aDtKamEpP2lAM1otNStBJWYqd1dpJHg+fkUjP3BfcC0jCitOPTMwczhqd1JVN0ZfTTBIMWBFMXR0KjhsS15eQWE9UlU0dj5yPGtUUTsoQUBGSkx3JHJBWl4zSUdnNENCenUjTWthPXN2ZWQ3eylCUiQkCitvSjFNKU0pNFhNbWg/eVZ4fDM+V1ptJjZqflAjIzI7UURYU2h8bFFue2xSNDlaSE08anB8Tnc1XnJIMGg9fSkzSVhKP14tNkpNSms2bigqCitTdXsjT2V+WmNvYnApSGs1b15NPkZGbnxVcTxLSnBpMEAqTkk5MmFFaUMkcHZ4eGE8eDtZUUhvXnVVOXRSeGUzY3l5I3RsUz18I3RKP0UtCis+M0lFYF4oWk1BZyFhZThnTiRSTWFeVmxgcHw3K2ZRZGMwaEclMzZ8YEIpYkJoViY8VkUydzJsODNqdEdtNWQ2VSpOTCtSdEowZ2d1ZjF8CitrKlUrcSF1UHI9dzdgNVpqVl5eRE5SaWdVdFRAYlp9dSg2MU9wbWhWZlF7UnlubEp0ZVEqTm12NDt0dFNzeTw/Q3RtdnVzZ0xsd0h4MGVkCitHalh0YDlhfEpKSXpZVn5NITlfcFViRFdeRUoxaDlhRCptb3dkeXI/PjI/bStNNHVkVUFGWmpoN3UxI05HI28lPUFKUGh0eShzSzRDJFIkCit1aH47JDtuNHEqTTYqPlgjfH1rVn4memdeU2p1NTReZSR5bD1rdm8kI3pBdiprKWs3Z1VVUyZqPjd0PiEhYUIrSyFRbGl1STc1NmUlIVgpCislZnN8fXBLWnd8RTlVdlYlIzY1QzUyeHdJcE1eYVBKP0oqWEs8ck18azJTSGVHa3Fyc0ljcHUzZFBDQVgkSHohJCpeLVk8diNFMDtNdkNACit1dmtudTB4ckw7UnJXTntpZTIjbjBQfFNGe2RkSjh4PU1gLXo2bSlHaDEmKWZFMWZUYkx2K3ZETENlYlc8V1V4WFdpZ0ckbWUjJmxrJGZtCitXMCM7KzMjYTIoZkBSfktvVChrX3gkVnJzJEEpMWJDYTlCYGQrZT5kZUtVJFB0MSRwT09NYXtINCFKb2xvaDtzSEk4U2VfdGA9ZGZUbkJ0Cis0T1pLbXwqZWd3Un1Qd00tczZIRn4wamZAQVRCd0swQ1BBbTMzcEtGQFd2d3c/PldxdWRFTUBEREUtOTtYUEM8SHAkY3dtZV52XkxNc0dvCitnTSpIRz4re35fMlZfezVRZTQkdjZ6KkhWWV41c0pjaGYoezElczdKWTFgLV8te2krI2Y0PUtPNU5xZWE+QFN4PTR3cH5sKVhqYnQodTdeCisyZn07MUIzPHt4eUxgS0tFI3BDazY1alh+UDlmQj8qVztXS0w9djVUYFZtcyFGKlcrJCFPKD4zYHNOWENJKko1eylKU0p4YSthQndQSztNCispbnROUXd3PTFNbUBMS0pKb1NKMDNVYTUzalpieSRobDsqbWooWj5WdkA5cyshTyRsQTJoJHxYVGU3KDFZZ0lARzZkOU1mRm1wJGwjWXg/CitneT55eSsyb3lsYiExV0RARk17Y2EwanVWWEo4fCZMTVRieDliZyFMVio/QGUzUDNIQ1M3LUFmJExmQ08qdGM+XiYma1ozRFc3bU9MK3dzCitzKCk0KEl0bUche3dkSXhrekZtY1g0TzRCdUR2IzFvJVhKZVV6P2xPfX0hSzd4emU0T19BQTFQR3BrYktZdTZlSktfe1ZKYWx0RV5vOWBACis2WiQhVytZNnw4MmVteUpRSndTWTBDKWEwVSk4eV8mRiE+UTJNZjdHVlkmd3BKOD1WUV9pOzVfYypKLVVuPDJISHoxMmVISm9udXFxaXJnCit6ckZmWGBwdyhOKHxeREVYOGJTMSZRYT9fSWh8YV9acnA9di02bXViUzNVQjZ6fl9uITlnMztDdkdFaSpifSZpbzN5MWdQMj16cXNabmUlCitnZDZCV0V4IUFGNi0+Q1RKTFpFODJHUSRySjVTaDNeQkdFbT9XcTx1eU4/ViRidkhYXzFfaGxDMldrJFc0RXZ4Sz92KTR3YTh2WFg/dX5WCitXcUZebkV8eXQpPUozfkM7N09VX2h4TEtCPGB3e1p6PmBmbFY0PyQ3el4yM0lvdSM0QCRMdztOdEc9I31mbDE2JkI5QEI2KHBaM2hpNS1nCitnaW8teUgtSGdQTzdZcVo2aCYyIU83WSkhdz1FNHBqdSVSdTY/MFUxfSp5QVV2cjVMJnZET0Vke2JlME5vKXFYOD0oZ3h9KWdLcUNIZX1yCislJkhxV0czWVYmN09PS2hucmZxUm1NRmg7QCNeMlUtRHZFdlMxakxeYjNBeVk/JS0zci08dUZMITd1KCVvUWBFaCQ0WUIlI3FjcDJ7b2g9CishUiUwdSZ8JGs2XzZodTlPWCFYIXBWPDkxX3dHU195T25QMytEcyFoZktPY0dYV0MjJHl8ezBPMmEtQmAmPU5mI1ZsKXd1O3dOak1mWjAxCitAS0ZjNnBtWGZwX3spc0plRGx7ZXdoNzNYWDEwJSUmc0N5NCpsZy1RZSFeemA7O3J5Ji15NWt0OGY2MkZ6NmxhSE4hTjVpOGdeIXwhITxkCitWdkRadH1ydD5KO2heVkh6Yz1nREtLYTFNeXd5PF5QPGo+JEArQXdAPnJHamN1cFFENStfV1NzRnJaPDg8MTRgPnVqM059dm1rU2NMY0JFCisrS3lkc34mYkswKTZFISorb1kpJmxJSl9vMmhYSUpqcERwLTw/KU5ZSDQ8OUZTWnFsTU09YUtzWkx8PEwxdFp3bk1+bHZya3I7OUFWIWc2Cit0UVRHPU45fGpBTFooU3BDITIjJW4lV0hZLVphUFl4dUxZJGU7WTI3bU08aWxOZnhUJXtANCY9fEJWJlFhNzRodDYzdGtMZ3MhclI/QER5CitUTz9BSipgaFhDNyRibT9DQFcyVkNeK1k+SWVUREolfTdGP0xQSW1oKFV1WVd8Rk9BISFRPlpYek8oeHYpKWhwKClOT1hJeWpWI2xGQ3NYCithczctOHlCd31sYm8+eiNjNkpiZiRAYUZRdHZ+RFBwbGZqZlhAfmxCQjlIeHsoYF8wX1I2a1dCdzFsUnVzNTk/emxaPFUqU0BpciYmeUhqCitKdTZSaj9jX2FoLU5wUCNTdWMrZGN6QGo8b05MMVVuSF9nMEIjQjBBWEh3dnt4TkV6KSpYcFdiWSgrcz17QmFld20xODFGJiR3KTUhNFozCituVjhla15DZykyfkNEWEo4bHM0aH5NV0N0TVNMemFxfnluTW91WiNoQUYja2VVN2l4X3k1fSVOfU9mTzEqK2gmKjZlY2I0Izc3MDxRUWlsCiswVjY8RXhkVkA/YEM+amVCZn1SISNRRT10OUwzbntrTy1EeUBjOFcqKXMydiQtZH43RWJjcER0dEA4YUNPPWpiKF56eDZrNnZwbTEqKU0lCitySUZ1Zkl4b25tNzNoUTMhb3k0WCh2OSV4cyktKnReaVNGU0JTUk5LamlYcCRTRzxxTyZhY3J8RGxtKE97cHlAeHZWSG5FQmt1aS13e0JKCisqJHRMUCNHVHxIeUc7bVh3di03bTZUcmV2RXVtbUUzNzdqRUo/Z0JQbTFFcyN0QnpxRTNDKDMzUihaQkMhZEc0TClrOH5AQ2JeNk1NN28qCismSnchMVUjbX5jT081K3c+K3VWIzJWNWQ7RUN5fV5sI05vTioyXkwkYGxeO0h2Kk02Q2tMcm93YV9ibV54b2JaY2xuOTd9WVZORGY8ZUxvCiskKCoybGtrZFlxVSplTzFuMm5CNU9DUV4pWEtVPitLbnI1PHpKK19IJilKRWx+dzJjVDwoUz9kWVdJYWNZWXEqVk1qRlozRGwoYFlkfEJLCitCTTY5PzdZeFgwZTdwPnpLS2xebX12VyZ6MXtRN0hNQ2lMaEwqdjJTYW9Od3VgeTRmOW5MIU1UR0x6aS1veCtTZUU7R1ZkfkwwKFBuK29FCitqeWQ8ajRxUFAmJGVvP2dIRzZ3b3FJTzk4ZzROOHt1aGhCYzJOPUUwcmhqPW57cjZkVl4+OTNHfE43JExsd0omQmx1UiFTUXkyXmV1WGJ7Cis4aT04UzdsaGAjOWBYUS1LXitrOTNrfmBEKDhLO2xkJHh4dnN2SjlMJk9LKHpJJG1SNGpKI25pISE7elpDOFNtZnB6ek0wPUJgeWJRJTJZCitWM2JIXkRxdGFEWkthYXp2QlkpOzZGcVF2cHVeemt+cypfRkZtQjBwLT0oVSN8fF5MSS02SVglXmZodVo3YU8yUitoIStENHpeakdRKjJHCitiIzwmYGlgSyFrJjx5PSMkUUo8dXV+XnZWMlYoc0opOTN8MjVwZ29sKE9rJXF2K2lURXEoWWd1aG5XJnxuI31uTihKM3F8YktRYmo7fTF5Cit2eTtOY0N4d3gqT0Yqdlc7KlYybiNVY09aUEI7d1Bzc3swOGN2N2ZHdlElNntLU1hsP1JPK0BuX0R4MT47ZCtYZno7I0tfczs+JUlqNmF7CisrPyZgSSZgWUtHeHxgOChoUzBVPyY7YSpETDQ4OU9We1VefSlKVjZpRiE0SH1kNnExKVNgTm58Kig7OFRHc0N3eXYtWWlyJHpWRkwofXlwCitQbDU2VUFTJkVOe3d9PWdGM2slQTg+JG4kbHFBeDJvZTVyRiE+MSRqcFFqMUAmUD5JQnBXTFJfaCM0fjtQQCU0KkMqTS04M3NnUEJWZ1VlCitQYlRNKWtWWkpPcSZjI3Uqc05UWHx3RlN0TzlfSilOVjRHP1dkJDdKQlJqZlVPd01ebT16a0krUlcmRH5TITtTPzhEdlE9MXJefHY9WTQkCitrfEBgRzJ6d2UydyMpSmU5YXxzV3NBLS19KyMkeGBFSnhgM20pI2ZrYT5jVVV4JXYjdm4hQjR0MkhSbEB8YFZPbXpwKkM7OD1ud2klSmwmCitGWDJ5ME8xMWk8dX11amJNd1JoJSg8NntIN2soUEd3bGx3P15GJSQhP3JoWl9eLXt9b09kUmFLTzB5N3h1RzdIQGAkdGNVTkxSailFQ2UmCis8cD1sQSpsbEBeJjt6fFV6ZTVVTW8hRFBlYXdZRGF1KWNmbjZZb1F7OWt9T0pzQ1ZDY0RvQUY8IW97PzYza3NaS3F2MGBleGY5Jjw7QFR9CitGeUJjYGJQZnNyc05ydFYxIWdTZ2ZXQV9CbCo9OzJ1Xnxqbko/NCorQjM8fikrZUx0QGUkY1lMKyZGZjM0K1pJQyhPMVhvSlJ6ekRzWFd7CitPOD0rUy02SzMhJWgjbDs+LU1WS2UqY1VPUXNlMFVifD9nWlBUTkN5fn0mWHtScUJ+NEU3eFQ4TExxTm40OzBqMFFmNn43IXVaJTNZUXIoCisyTSljQVlKdHBKSCVOVU8pWnI7LV9aXlU1ZEh+MjRyaEMpTmxAMWBkbHN1UFA0OGhacTBwdip6UENTM3Q1NDs/bXZyenJ7NVpmPm1aeSlWCit9IyZiU2FpcGdHamhMSy1gRD0mMy1qREImZEVHJkVQemZjKHdfVFhDaG9TO2xafk8lYGtrZyFKbCtPJnV5akF0QHF9Nnxfck9+YHxEfkc3Cis4SiZkNzF7KXdyWD5ie19lM3hSMU5XaFJSUTBuWl9CZGoqZlhnRFY/OX1tYGRFOWIlND04OypEVigqP0xhIzRfTW15X2d8b3ZRWEVWZTQ+CiskRjtWVEdJXiZEbT00MDZ0TjlgP3ZkfS05TSpYSGtFIT16aSNjUW00blErJDtlUiRMa3N2KHEyKmZuekAlc2dkcnJVPFJXSzBtSTEobzYmCismT2k8cG1YaTleaF5edHhkY2RUZ3VAOVMpTHI1RWpPK3lQdnhFRjA/Nktod1lxNDZudmtPZ2RSKjFQSjZyZDFVcSNqdjRUPFJCSFYxLTghCit3QDVjVUw3ayh8S3YrKTR4VlhKJFMreV9YY09sel9PTWVTSGo/Rk11YWxlX2F+I3FDaV5nQDEjJGtian5fP3N7UWNuaEFSMTF9KGdXb0I4CitTYyo4KXVabDtMTTgmY1d0K1Z2JCojLXlpbXl+a2tlc3xXSW1SKGpvYihvUjlXbUJISUk/TXx1QGx5ITNHPCFsM19ER312b30mXiozRiFDCitWN1dvYEMxMUpAR0UwODZyYSRwPldYWDVXb191VFdHM0F1RE5KYFpLaG1OPGwkOUR4VEV5bCNMaTZHeGQ4V2JAekZQKEFacVVkek1tN0tvCis0OWc5eHhBZWhYUzRabExSYTEtIyh3X0V3ZiMkYUZNM0RkTzEpSGloNWBqQklFKENeVWl0ezM1NTg9RklZfEopSVcmIyhkWVojc3VKbnFICitmcGp8Zn5rITE2X1IxZExwKFJgT3JXU1hgdntDKUlUJHBabklGNHdvPyg+WlY5YiZMVFNtVD4yUXFgNFFFQzwoKjFJJnBicyglQSNmc28pCisrcWladm1rVjw5Q21MQ3BrN3dlQTxCIUMyNjgodT41R0ZBVkpiZkdkRk9+fE12SGhybWF3WFpCVHp0ZHMtVUlaQ3lGJWZvVUlibkFsdSUqCitTPVFZJn5odHgmSGI5ZStDPWAwVylPI1pkSEpIaD8tQy0zKz8mWDM1QU9wZmh0WGpZYT5FVHcxfj5NMCsmTUNnRUlEcll0ays+WXVwPUdjCitYQUlIe1ooZEYoMntfRVRVVXNiK2p6YHVKOWtxZjAwelleYT5iPUBOKFFTN1hRTWBfOHE1UzNDO31WV2JMVj4rRmM/MDshbkNMI0JpZXplCishM2t8fkgpa0NBez1tQFNGO0shenRedkZ9X0AqIWpWKSMqKDZtP0NTKHsrOGlnUTVUZzgxOEZjS3NFOXJzOT02amBwWjIkcGhQV1VhWUA5CitFTz93JXluWDh9M0F5U2JKQ2R5PzZVejZyYF9IUylqTV80aUdUVnVuTjRZMm5FP1Ywd2E0YXEza3tNNVF7JjJ6UkYoKFN9TDsrbX48NXFOCitPfUEoPjtmbnZ6WHpjU3tsTEwmVW0pWGpwcnp8I31FIyhaZituYXd+dTQ1OyhVPWJzTD4jT15hdkZQb2VsR1leYm5HP152cyU2YWcjVW9XCisyKmJuKCNCUD1RbkVrK2p8TkBaaDEtbXszUWlZdSVYfGw+aUl8R3M8MT9+MHBOVnMpUGMlbmxVM1hAcXdJJWRvOD5iM3dldDhHKHdaNnN2CitxZncyRHl7S01RWUI/Q1k5Xz1gMHJGRUVMXz9KYlApUV9eb1NpIXJRWDwqdnhwcjx7fDs8RmxrUis2dT1GbFNjOCQ4X1Z4ek95KTgldlUoCis3LWpBfl45MjBVY2FJT0FmPEgzNnpMK2xqb1FMViZDaXpJeXF5c0pfRGkpJEtNblErNGdROzM9O2J8MFVkYDRFM1U7dikyUUZmYXtyZWgzCit5UEI5SWElQCFtVWxPR3I9Pnl6OSVDTlZMXmdAWjZkVXUyMz14M044VnN4eWIhWWdeaypYQ057R1AoT1B6O0AyZCk0ZW9nWFNUb3UrPU5ICit+UlNFXlQ1Ym9jQHVSLVB8aEdNVDs0YTdrXns+LWM3bjI4Nk5VQl9NNHR1OztJeT40Rl5MTjJMPit0Q09VUHMle1hvKmlqYT5TTDJkSHtvCiswSjM2Izx9Xzd4WU9JU3MzdEF1eDwwMn1TMDZPUyZURXZoO3JOYTxaOXs4Q2NweS02YUwmSWtiOFMqUTslQVY5YHFQKWJNZnRyTDA7aE1HCitJZXFHI2Yka0t6T0k2fkQ4PkVLeSRTPTlZR0crTGo3KVJldTVLWmApZ29XaH1EM304ejF+OWd5b0J7bFh0SHhLKHtUVXlnazY/YmZfJj49CisyQHg8VDgzRTYwdD9DbWx+RnJ8eSMpMGMxbU44JjkwPHU/eH1rSXckJXtHMHp3an5+cWJecnljfnVUMDJBeTl9SWhOPmx6dEVKVlRJNktBCitaJil7JEEzNEY5PXltRXhNTjxjJTAtQ1FPeWRrcDVTJTVMbXo0NV93bz9qU2YrbSRYIUxXZW1JVyZ3I3Y7TlglOXt4Q25HdFhpSCpNYGJ+CituWDZLNXApUzJhdDIrTWs2Plh2cEw5Ym9XP0d2bHs7b05wMy1gRT9OOD05K2d2WCk5bVM5Z0EzUygpYGVEZk03YkQ7Nkp2SnNsP2F0OzJ2CithYWtfM0dwNCVKY0RoN3dSVEJjdGB6bDkrWVROeElxRzJoRWN4LX1RJG0+PlNFeTsmcDBnUHh6Y14xV2lsdVEkY318S3koR3pNQUxoRGRqCitrWEc1O25HIWdCZDtGKGZnbiM+b1UmekB3JXVtMC0kR2NoMFJAeWNobURQc0dHc0x+cUErI2VpbWBQYXdLOVhOays0Xm9jN0UjbzsteFdPCitrIXdVJSNgJndkbipHc3BtYG8rPSs2UzYtPlJzbyV4USZEMlZCb34peFV6V3s8JHo5eypIeDQ5TT1xZTFWNj1TNntoNThqYl5GPmMqKjNHCitaYm5McVVPPDx+JldBOUBnVF5KXmdIPno9Oys4aUBKMjJRak94VWlCX1JkPDw3X1M5dnBUPkpaMip3QyZKflMrN0ItWk59NiQ3bDNxPTR8CitWYm12NVNEKTNUeWp+Nj5fVmNlK0UtKkpCYjhtailyVll0NHdBSlNsUVlHbCRzZyZ7V05Gej9kPz11NnAzfUoyZ2BUaCEtamx4IU9EPlROCit3Nm9xVkVMQVNgdkJHR3lzTT90RH5JI2pHdX1OeEs8MEJ+K089PlclelpDaTklekthYzxve0gxRUBlNkRTYSlaSkA2Z157V0w+bkZGbDNECitjWkYyd2Fpe0N7dzJlei1UPSRyTU1BU1d8QDhfZXB8TVEheEZVUH12RyYoPiFtTz9LO0s0e0x3eklJMCNrQUhRPj93SkIyZnNgal5ndmBGCitlaytuNjRCTkZ5Ynt6bV90cDhnTDFgUih1ZEtjYD4pRUJeRDwkPzR4Vmk/N0QjMihEZnQpeWwpTV97KTItVk9lND83SWM+bWo9cTI3P2tHCis+PWFsSHE2SGpEQSR8NmtvWmBLYXplcWxzQlNiPUFKKjkqY2w4RlRPRF5kU3xPVzh4az10K1RTS2M0czd3aGBBcTglX1JOU2xufmh+LUJCCit7PiNGNDh0JEwlaU9TaD5iKHVCfD1zXiF4dSpSa0xOXmVyRnVgdXJ8ciFnMXI5YFRjPHJRNj1TVk97KHZ4e2d6WW8xNFo9OFhmJWktRF5zCiszanRzWndDRXhsa0xCM0Z+ZiYldTZOO3U7RUFMWCFzdX1WJEdicnRESyZNbkd8WlcjNSF3fENiMFI/OWM3USMzYnohZHZAOyprcjBqX1FFCitgfmRjeGE9bk1EZU9QY1hJQigoKGgxUUVPWCMrfGxyWChNPEFDOyZsKEpmLUdnQHdffWN9LSZQTmYpKnxwKlQ7TXYofDUxPnd1OXJ2Nj00CityPTdEfkY4RzYjRER+TF47R2ZCeFFreGJsVCNtbTgxbXwtS0h1ZHtyXmt1YllQKjMrPUlOeEA8Iz80bUlWVEVQWDJKQipFZl40N1ZNYEVKCitJSGQ4JDdDNyMjP1FwX0UwUEY5YjJAYW81Sn1VVUtpZ2tCMlNadWImZz07dUttZXo8YWNaS0BSQjdSZ0VqWUt3Qj5SZWZoJjFYRj5OM0wjCit9c2QjfUg+VF9oS3pMYHlEfWwlUHI7UnlXRjR0P2dqMiQjLUc8U0szUlE4MDFSYHg5RHRQfVAkOFJsPFI2IUhUZUVLNmF5VyFXTl9PJWhxCiszU3owNG03QV9xO1JeNTx+NklYdi1PJkZuMChvQ0A1WmtfJGdXQX5ySFRXNl5gP1krdkdtOTZmSjRDVGpiNzAlI15TdWBYWkpxdUhwLWhtCis7fj9yUjhzZ29aM0ZqQDdgX2EqSF4yRll6TD9meHBmZllJWDFCd2AhNmQjZjZCPjNjLWNZXmRkayp3SGt0KmRSRSs9bEl9U2JgWVREIStsCitRZCg9c3JabXQyUitBdjJ4PU9aZFEyMmRYP1N+TlJTcipULShgOE1RYVFZSHhpTGlPfS1sQUNlJjdpTD16NX1jI0NoMCtLPTJkQk4kKWotCis9JCklNTctViMoPkxWNj11PW5ERHNRODVPfURZYjk0RDNDSTJHQFFpU0NIdkJ1NigxJnpJd3hqbilgcSo3PGJ8QkpPWVE8Pz51YHRETERyCitSNDlGQlBYNF83WjdkaSNwV2k1bHhlQTQ4aXBvMmtvVUN6RjZ0PjxENmVRPWVyTzwlO3dNXll1KS1GPFBwdmJPOXYpOCtZNTFlYXFeaCo5CitQfGokUCVeJm9OZz47JXcmXjIyentKTmImMyZGYXtBUlBtcy1vcFBVKyklYiNJRjdjKSllamR6SV9FO0A7dT1KTXU0Mj89c3EhLT5tajJMCitSSk5zYnY3NWpTP3c7NnxDaS0zQDZQJCtVVVZGUi08aE4oXmsyeUd9JU9ucXo2VkVrMkpWUjE/Pld6K1FAcD5kSV49SHZiMn1jRSshZilICitWZEtZOzsmI0h4bFg5fkxAc15xcTR6cnh+KkdnVz90KW81O0tfbk90YC1aLT5jY1B8TGJofm9yTEM7UlJsKlNwNUFiKE57bXFZS1A5NCg0CiteUFZVSiRTe2pkNygmWWlDXjV9UUJ+VWNJKl93YzVsY150aUdJSUQ/QzdhVyRlcVBNc3dsV0BmWnE5fH1CODlLNEQ0MUdGNVpBRG1ASTdNCit3JVBwVitZb3E+dF45SVlMXk1lP2QzX29WWHwqJlhFT2NXPVlTPTtXY2wmcGdUSjBjNUBRTEw4U0Z2dCtkPF8/P0FWTSFhcFF9dG1hejtvCitjPkl3TUw4dnlRXn5gSTJ6aExPXkdxbDhiLVp8LTRhKUg4QkBLe05ibSEpYlZlKlJhZkpAe0s2YXVVRjZqe15RSTkwWXRZMyQkWDdISWVVCitTLVJEVl5SJkNwLXwzKThqUS1NR1p8dkBTQCk4QEtJYVN9MXJuJVohY0Q8K0I3WDhHckgpMWJ4a0VJK25tczl5aU1gdXZGa3A0O34yQUNZCitSPUtJZXJlN3pmX1poNzBMUkF7XjRaWiUjRi04VSgzUXwoQmA9UWJVTVgpQyQzPjMlWmFePmB3Jk9CdkZJUkFyVX1lcVdiLWcpb1BmVj9YCisrVFApaD5ANmFXQUsybXRleTdEcjNAeHBPPVUwMDh0RTAwMG1HMDAzfWxhNCYzY1ZffGVAWipGcmdhQ3lDMFUybyZLNkBCLXdVX0I0QXI7CitkIXAwKTBwazZ4b1NxQyltc2YjI3ppMz18RHFFYmoqemBZRHBATnlWKDhoSkA9QjVCYDI5fWk9dWduTyE4amRkK3JBaElVYkwlT2ZKMVBsCitAcSYtdlAkZmZEMj0lalloeSlqczxwbSNHb2RUeldteVg2b0FyN29sK1ZaR0BufigkUiVGP19Acl9ra0NpSiM4KShnM0VyZmpeKiF0Yz4yCitqXjhSQE9YdTMzcnVVV0Iocj88SVBKN2pUQDcqWnVRKXExTmI/TC1tRCVmezRwWE8kfWx+c3xwTSN1SD49UyhiTHk7OzBuV0lydGF6NypuCit4c0xVQGk/b3NRU3ErdmBlXnklezUjcnNkbyF9UCFlUz1XV091eUZLM3lnQz0oSEMwaDYoSUdsfGIpSjNxPEdZS2lNZlR6UmBwcl9EaUpPCityU3dDUk9mWDw1eUdUczQoJT1ISUt6OCQrPEJKVV5ifWJNOU9AJnoxRlZwMzQqWiZ9JDlOM0xhV05ve2dmYSpRemo5Jk9nM2NUPWooT0ozCithVE1KMUFKT2FZTkRmd1deanNFKkhtfWNCXlooOWpeWHZkR1VtVyEqI0UlUWRsPj91PTNWYXVnaVV1WHE9c3d6XjB0TGprTX11bmw7OXNSCitQTTtISClnOT1SXyVuVCNRV3Q+a0NjIUIxfH1VREB0Sn5nPyFEVTlVVSh5RHV+JE8mMF5+T2NGIURUP203dDc3WUc5I056Y2s4dVdJTHVkCitAfTZXJEJvKSt8d1d5N0FkSWUhcURKTTdgP3hvZUhhZz5QSSY4NmFVOWtvYCppP3l4X1Q4IU9QaDRGO1NOMEJ6YShUKiY4TjMrZyE8YGlsCit6bzA1JipWTXlJOCtaaVB3MF9tb3YqXlQ3amo5eCg1SXxKdTFjNDJuTlo+IXw/bDxlND5NKG5pUCY9ZXt8dUdub1RrJlFRbkAremtjNjtPCituNyt0JWU/RylfVT9RLTY8KkRHVkB9bD1AQ1Y1TCtiI1IqQjd2SnBsRmpNaXROS1lFYDVoe0ZHYkhXSTdFWE1OM3FuZUs1QXZqTDxXPjcmCitrMVhlVnpGN1dtcyh9SFVqdnxtdnI9S3FFWmlqR0lgKTBfa2llJjwzaVF6d2tmNlIwWGc2JTU3WCg0Njs4UkAmK0VGPnEwR2dGd3QmLUV0Cis9dEkzXmY3eU5qdC1NdVR6PHE+dXw9ZVMqSmlse0cjUCRSI15AenVRZ3lNb1QzaiEoeDkxOyFmYUtmN2EoVnYhMCYrPWB7OXwtWUFnbmNGCitoeVFnY2I1I2cjKHlLaStCTUw2RWpHRj0+MiZmdkhxbEhWWFp2M2RYRyMhb0pTOSMyVlRJUDUxbVgqM0QmeXtvUXJVZFlATHQrek43UGFOCitiN3Z2SnNjY24mIUR2PjtlbV40KWhJbkZieXcmcCZuQ1MjfVIyLWM1MlR6PCVnLW8zdU9URCZgZCVrSUlabGM0TmAxVyQ/eDt5KDJjSl4/CitWTzJDPWdeM2JMPikrZSYpfTN+N2Yrd3xhVVNgVHxaUGB1flhwN3olPFgyI08jV2FpbUlUT0FpfGtHfCghRko4V3otO0FmKyYhO1VsWXlrCitrPlZ2Q3xOeiZOT00yJXx4PEdyVUdHVW92NEd8XnckbGc/QyN7cmpGPzc1WSpTVWJ5M05xWUFhayMrWilCO2VgXmdheUFKSHBwQzlaOXdECis0RWZJa1AxPGw7O2FqNVp3TDlBY3I4blo/Z3MyRThWOTx8S3AlOCRxPzZ2OzNFQ2F9TEQ3fDJaUGkqb0ItNFg0X09MSUhzUz1XcU5XKVVgCityISU0ZjJSLUFKYlNtbEAmdzRBTChLK2YzdSpESVZnQ3wqS3ZmSStFV2NkZX1wek1KRkIpQUohQ2laY3JBOG09YVZSRlJZejE3d2w+cDBJCishYkV8WEdiKzkwPF91Tl9kPFJRR1ZFe2EjP0Itbk9CeVBSfnBBbT0mcmNvfEopVFRAVkA9JXBja1JkVEIpP1FoVTVgYWh4Tlh+dVB0V3omCisjPzlSQHNub1hoPFU1WCFGQGx9eXt7S2M5RkVVI25qYHVGdjhBJiY4ND5tdHt6WmpNXmk2Y1pnWXhTQWJjcSpLfWx8JjlwMSZQXk91QHVACis+fTYpWWVjWk9aekRzKzFzUC1CTkkqV3BWVXBGbXgwdlB5UH1fRV8ofCpQVTg0KWE5Xlo7U3JfOzNGV24+OClgNkB0UmR1UXtRPWEwaENCCit8VTxIV2RMMHZ2cmsoKGJAfGlWI2lfVmNzd08zcll4JUM9NDZEcGVPbUc0c0N5OD1NTDk3UjQmezZgSHVwPkM7P2Z3QTReTDdPMXBuRWR5Cis0QjtBbiRROEtNYHtqYnR7LUVpRnhQJlJGLSQ1TDkjQDxvVmNNWCNvMmFYUCRAMGJUJU5FUkRnYjgpWj03fnJKIWxXdjV3OzJNZzlDdyRVCis/SE5xTnxIKFhaSzsrY3BNa0VAOTNSa3Y4VUFgd0koOWUyOD5iWXlkMiM5TnVlNlktUHliRlg2aTlWJWpwYmdHcmJwPWNGdUd4dG5yMEA0CituPTZtMCtvNUNJWiUwJndvbHl4I2tic3BjelAmQ0BoOHZzMHVpdCl5PHJyJUtUPFRsM3FSMENKSnIhZSgwS19GRktYSjIhZVZNcVJ5a2xrCis2NiEyUSN1Tks/PndLZUR8Q2srfWxWWTlxMn1jZilzLXFBQzAmZHZfRysxY2RNZFkkYndIPHNhTDJHclpDKGMmc2E7IVdNX0dLeSREbW9jCitCTExfR3pLb088YWNEIWFYQTdmc1ErcCRFT1Y9Qz9fd0h+MEk1M2A+Q0FkMEBqfFFgVF42U0MpSFIkKXBkdW0yS1k9eHc5ZyVTSngzKlZNCisoMnFEQEZ0T0xZe3RjVUhpfEloJWs4QlBTRUUxNTw9dUc0bTdrQ21idk57UDFOXzh2cWVkYlZDaH1STH4yaEV8Y0xvfUthI2lJSkJqKWN6CitRJDItaXJ4Zyt6IU04OEA2TkJJMTJ1JVk0cTJBdVQmZy0rWVdqbT89MDd8S1BfeVRgJnVFPzAyeHMqdHVndzVZWCg5X3B0cEdqfnpoZEZpCitPI3Y5e21tUzkoUCllfH18ZC1KRGc/NCRNTlNGfjJldUkrI2p2NkplUXF0Iy08YFkwdHFhckg5enw9SllTMCNUa0h3ODlPUSF6OC1lYnlFCisqK1AmZC0tam1BYWppQ3JUdDR4fHFhUCg/aSpIPzshKVExN1NXd0dlbkFmPDJGaiVFbmNrcFQ0YFZzXlpzKz43dX55MT01WURpKCVyIyVLCitEVEdnQ0MtPmUmY3BfN3tmc1ZuR2VQZVc7ZDV7cmIkPVJvOz51TTcoV2hDYT5fMXF3dVYtdylAVllVNHh9dlheaGd7Jj4+UXpIYCUjY012Cis5O3A1TCtvKzlTWXMoPTV4WjdIcHY2c0BgNjNELWY5cnMyNEp3NnBUPEM3RFJLSnh3flUqQz5Ee30jRD1UZ1Q2KzNDampVMj8zZCRpVm9ECitISEVCfjlGbUgwQ0V0VytBNkA1MSt5Iytqdnc2SmNORyVaPCFDPTtfUktLRXMyXzQ2YyZQJHgocm9WaXx8NXp9bD5nTG0oKkw4UDRXT2RxCispU0FmWUptJXUpQ1RqZj5HcUFlJSVtU3hLYnVWSWZqMVk3MkQrekNqRiNHQmZUU1VzSD81bEhnaWJ2ZWZAbm5XPWV2KGkoJH11eXt8ZU8tCitVaUIha3xtR0cwc2JSbSpOKT1HTDNGMDJnfkJFTTVuUVJ3d3tFNkhaJG5eNUtmKFRncmVvZ0RMWnIpezk8d1hpZ1EjMG5CI3Z1TV8rTzc4CitKYEcpSjRNZTN7VV9FUV5KTGQ8dW1vTUN5OVIxQjxBX3xBZlIkbW9ZbnRzaV89ait7JUpvYDwlUm9Pcmd7ODx7O1dubHppPn0wOChuSG1yCis+RGtMcDMxOWk/RW83b29sQGc4ZkAoJTM+aH4lbkpeZSRyUGVRU2w9dWMjWlZYZ3tQPlI2eSshQmh5cWNyPCh6UnpHMHcqRkoteHRkLXN5Cis7NV8wV1RuPEl+cmBZWE5rbkZfPm1DbzZ2SXFwZEM3JEpzPDNaWiV5WFV2VF9FcmI/WV8md1B8JCY8Rj9RMXs7NUNEQVFJVGFVIUBIeUp3CitwVE56ZEdiOzB1S2xZKGkxeXshbHA2PDlNfGQlKiFHO1g5RU9nRWtlV0w+OWxLN2V7P3RNV2s8NDY1e3EyJmBQb0M1UzA2YVZVPnR0cldtCitCbCtYcVpsazxGUDwpRGQkS1ZxVG0zPiZGUXpGaHdCZEtNZ0tuMCl6diFHTlczPUNzY3x+QUgyNWArZXZRQkc3eVhnRyQweUlEWXJ3Skk+CitDSEUlTjJYNSk/PE1qMGA0Pj0yMHxYUVIwMDBPOF5PWTd5P0BeRGVeI3VSYE9BIUQ3NWRaKUhhQXxOYWFBan5iR0J0RXpYTEJ4YWQ5N0cmCitaYChFeXs7cHJhKiQ3MFR2Z1g4RCs4SHkzdUlSUldTJWJGTjNTQD4jJWUyRXhxQk4zOVZpZilGeVE0Jnp2ZlE5NFcqfntvbSVIYmxkc1JsCitHKFFqT0cjU0FBKnVFfjk9e3ZyM20rPm9vK1NMRlFjMmxBPmNEclVxPTxpaE84ZCQhZmRYZno1b3N3X3lGWmZhOTJvfkE/O1JqQ1lORF8hCitRYjtjND9kMi08YlUtSUx5Rl9qdTJnNm1xTUJ6Xkw2a0FuQDVBJTFYSHIra2lpMHlmV217dURAMlFSQzdZY3EqODJLRmUxeVd5eU1EVjloCiswa194aFc8MmlKVD9SZVE5ZjxPPklRM2xUSSNTK0VYJChocmZkJEUlaWduUkNiZEIxN3JiNEJwSStGYSF5cjlsVj8jJXw2Y0VaISRLR1pMCis5cGY8dmdJYWF0Q2QwP2F2QytwMGRIP1BARmZYdUBqQyZtdU11Ujwzb1o/PzRDb34qeE1rUUh1cHV7MEdoLUE1dkByPipVQTBUV1ZodS1BCitBdmF+JSVFbkslTHM8WWN0ZzZ0aUAqRV88Jjd7aGkqXzVoQ3Z8LTk8XmVfIT8qJlJFNnw5MUM8YCh5I1RTdVZuM3c/d0JeXkpEdjJ5UlJBCismbmhsUkl7RUVnNmA4d2RKQzdgM0o2JlF4ZVo3QyF6U1Zncl91fEA4YWJ2LXtATSF0KWpTd29Gd3R3Pzd5YGg8a3tMZTk9WWE2JkYqe2c2CitKcXhKV09+THgqOFpLNzlCOU5EMnRaZUkkYEp1ZWUtdW5lQlh9e1lYcHRQIWglQU9VN3hLcHRkeWhSd25JPVhNP1VRajkkS2B0Kkx0UE09Cis1eT4kJF8hRV8/M1k+aDdtfHx6KDdpSHVlKG5TQnNUI0pndFAzJWt4WD5PR3FEakVzblFEaD09Nkx7MD1xRDttfH0meXB5JDREcWFlZSh0CityKndMNEpWZT8+KE9qQmlwZ2twSGRAQUF5bnVlaHBPRSk+UEFDeE1weGxjKkNvOEJfVEdzXnZFKipPN3ViMDFFQ2VCUnpjVz5IKVRyWSN4CitQayoqeE5LdTFxNVZzWH5Uc0JvdGFXdlBVV1ExOE16VHBiSSQ2WSEpT05oYEc9MDQ4NTlqblcmN1ZIKWJTYDAmUng8NH19P14tSnUqakhnCis/Q35KVHhCd1RIYW52PFMleDZvMHw1aDAwVWE/OXlKJD59bUNsVC1aaCglYzd8dW5PYW80cE42JjtCbGlOaVpFOzFpaSlYeFB+TXQ3d2k0CitQU3h+dThkNkQ5MDZHJkQ4VyMoZVhiLVo0ZVBjVz1PYjVaSmJXdl89MW9FJTtjZ3h2bHpfO0NEe09yXzwtPm9uK1RVNWAzVmVQdCh0JTFmCit6PT8lQT1VUHQpJnFLfEVvQ180Rkk3SjFMeGRrNSZOS2g+SmBoWnZXfVNlMXJzZzRwM2JMQkcja3FzZEZGMGImQE00dUJrO2twPDdiOGhYCis+TXJiX2IyIWhJRklVanZrPyNJUWRtdXp7S2dmb3NpenBSK0dQbCU5P0FyaWdhXkwxZEswIUBRfTBmTDQtM3AwTGlBamlAQ1NuLXBfYChECituTXwjU0UocSk/N2RSM0s0NU4taFMoPikrY3I/TWNIZlopJHU0bF8oaGdtWlApaSYoZ0c0N0pSVT5VVUwkPn10P208VlpqUDlRX31pJDZ9Cis5K1Q2UGgwYng8fW50RWJhRFNuTjVydmE0Uj5MYjdwX0pXeEIqJTE/I25WUktrWXAxPUtZKmtyVG5ubld3LWVHUkAjYW1ib1A2SDVNST5aCitHSCNxN2xlX0pPTCg0dDslOE4kMEIjR3ZOQD5WPUNHdl9hclVXQlR2K1dyaEtEMUZselJkK0NVM1B8OF9saTx5K3szci1xY2hyNDV1UDBqCitRPEd2ZHhaaFlubGxRcyRjcilebUJTNShpMHVKSV9RUCRrI093ZGEyUn5II3E4UykqZyVfcDBDbiFMcXhnM2ktc3VAfXtPbiU4R1pPN01mCisjdzRfNzRAPDloZjRQdUhebGB+Kj5GMm90en5IMVQmRipPX241aTtkPmV7Q0puNk9UU0c5dG5wcW9vI2xDPXZqdVB6QikpZ21gO1l8NWFlCis/PF5AZXApfTNoVzZyViNKcVApTXNAZ3xqSGB8IXs1ez0hNjt+MXBqaTNaO3ppYGJtd3VHS0A/aGtnaUpWa151UV5Ud2p6cH50Ui1XSispCit0KCQqeXlqK01PRCt8RUptNUNaMFRFcSRvRCtPP1dKb3NIVjJQNHFSN3E0YD9senFpWFZTPUlRV18tYCM+M2JTPGUkTnFXT0J0PlR4UW98CisoLWdaS3Y5c2ZgeypkN0t7KVdYUiskakN2aFBVfFg2Vl85SiozLW9rTCViMlNwbGFwdWlic3JBSSslLVl4Sm9GQi1iY0o5MnpRNTJiTz1FCitjRzYtNEVtXklsYj15WFdNWlBaMUh+cUI1VkVxS2s8RFM3NGclbHt0QnMmbkF5SGBid1l4bWRyYSorJipJPWtEbXBsakhXU1VAVD5GT2dVCitlIURie3NUfTswfFhRUjAwME84Xk9ZN3krcEtyP2VFPExlb0Ijai02OTUxSmFBfE5hYjk3O0piI3FeMVopOWIyRV52ODBpJE15KUZjM3hlCitiQll7NlRlbUsxNkVScTRCKzEwKHB3Tk9+aU54Z283UjJ0fWYxZnd5RyVKeSptWVBRcV5fPEArN2o9SnAoeU53SGVqQzdaLXk4NE1VVHdmCitRTXtjMWxGckpaYUQxWHlIdkBVUXI3PnQ0eDxWY0txSWE7X242RF9mcTFLVUIxd3I7STxmRnplTF5lNXhqcUd7bV5QKWg+QDZhV0FLMm10CitleTdEdUErJWghfTcwMDhRQjAwMGFDMDAzfWxhNCZhZ1dvMndHYUN5QndYPjs3aHZFVEo4Q2Q7VDZ1JENZdEExfXEyUih3emlFMCgxYTw9Cis4MlQ1NV9LTG1rNj1JMV94S2AjUSoqRUgzeURlKGF3N2hSVDZRYF56YClmXm1PPDFeaUMjfE1fMjc7USZ4PnltWCpxaXg9SGRwRF5AQmdRCitaO1kwSmpJOVJSOyRWT1JfbERDPTI/K2NKR0RzYGNnYWQpd1JPQCZrMHQ8V1MoUiVRJElHXjlEOz51d1ROQzdEVVlCez49JE19JEooQmx9CithPXBvTjRHcjJpXn1WXihSYUtQY1ZjOGFvclkhVD95dHF5MytkUHxfJEdsdnYwOGpIKyo2dUZhQithZFB0aEJrU1pgJnJiP0x3fmBkJXZACitfOEA9OHYwWW1lPU97eE4jc1VMQXE9U2koVWBeNUNKdEAxaXE+VWpSeUMlUmFhc3BkakBvbiQjNlFQc0xLTVBKakNLLXB4UUQ4QVE0VDJACitoPXkqRmo5bmhLaF9kfVhOeDx5P2lkKyFsRzZxXjJ9PkdIJUtra2VJMnF6YD88TFMzJHBEPXVNTkFNUXk1RjdXWVk+cjlhQFB6Sk57XiR5CisoM1VfZUlWOHAhdGh+a2U3PzMxMGM9bjI4bWU1XzJPMXo8PTI8NTw4TG0keT9BPk96eD92ZVVvWU9vRkR9Mm1gMG1TPjdaIXt+U1pfWGdfCitHeXk8Rj5NUDMlb0dTN0RZekVFOUM2KndIJndhTmJ2O3VXQEJgalR2dWRXKyQoQGQ9PWF0UkB3fGhXZ2shK0NwKHp0SFl2VGJHcnJDSytZCispP3UldU5WdndkbT0mb21uaSQ+PTJMfTVKezEoLVZEJSYmYCR0IXclMzN5YjRJPH17R0U1TlRWK1h7THhJXkB5MXl3P2B5cUFaciNZOWxRCisyaC1PYF4tIzYtOU97NDg/SzdJNylaeD9UX0U/PDJZZkJvdl4+bzRENGUpYTdJZDw+cT4pTSpHY3V2QEB1PVZuJCFFOFRvYz99OWtTUUkyCitDUXcjYnZaUnk0PzhDb3E2UElzYj1WR35wU000NXNzIUt1bWJBJUIzUENZNyFBVnhzOVojQmJAaENCaF5jb2AmcDRTYVU5ZS1VKFVFYmp9Cis/b0Y3Jl9OZldpRXxLTHRqQHFYfHpoWDhMa3lRdkwoKWQ3UmxOSEo1ejR+dEV3eTtMPThvZylhWF57SGhIR0xCKWExJHptSHpmeDNCcT07CistMElmUkMlX304VmQrNzVfY0k0JnMteX4wSUkyP0teJG9xWDxfYj4wI1Ime2hUI3hkMVhGUFghbks5cjRlYU1vV2xQc1gxO3Awc3lSeShkCithTlJCZSU8Yzt9NUNrZlhpSiZxVkFsMl8/TXI7IXdjJXg4aDd9Y1UldHdWLWhjTVB+T3cwZXlJc31YQihUX19yMyl1MEU7dV5zKD0hfXVnCisxV0dXYiU1KjhkN29mPlkwPSY5ayF0UlN7VDd7VzdPPXx1dzYjUX1vUzNIKkVNR2pMTXU2aWA7eElIelo3c30lXkJgeitPZFlYa15kPFFWCit7diozaSg1N0RhZHthRlcoLTRsSHc8RyMtdnl7RmF5SDlrTlFoNWZPJFVabkxIcXtDPEViUnBkTElMSyt2RFRVPTckMzdXRyFoM28oaUo2CitQIU0wbF4kUGwrQU9rP3NaanozPz97NXlQbUAlM197NnhLdiZZVG4zNCEta35KYEhxZGt6QHRocUk8TnFMfTZROEtAYE1mVDVETjlyUDRNCitKaFRtJWxrVDgtOFBJeFRLKXt1N3c0UnJ7TWVqayNpNE51MUEkOG5zI3lMc0kqcDxUM3FaRjNPRHg2fVdHclJzPDdpQSVrbnQlSFBlR1NxCitOdkRBVD59JWo5NWZCPGdyd35aN1R0JDVWQ01ka3RYJERKfFA8bVcpeE17e3k4aDhhVC07czNpdDA3QnE0WkpoNWhTLU1zeXVIbTlNOT47CitZbzlCa2cjQSVWYFgxWTFUTEVrMD8kKFdUY2JWVU5NSyYxZytBLWg1a3BmM1hEUFZaKUpKV2I3aXZ+P3IhRHQjPEd1RCpac0UlYnpXOT4mCisyTnVAYXtNeXdodSVDcz1xe0M5NT9vYjQyfkU3SEdtWUk5SE42RVNwZll0Vk9UXkR6TH5fdTtgdHVZbm88JmJkMWFkMSFEdjZoUlZYQVB6CitoQWVYIWF7MDRzYU9CR0hUTChfUDtuZVdFK2M7JT85YCZuNEN8ZGYwUzdmVHozSl85SGc1dHcxXkAtJigtOGVEcF8hJDhIV299JjR8K1FrCis/MnFKcVB8VUBKXk8/aDVRZFVUbzdGeURrO1E2UTlgZDlUU2haZlhSbzNpS2ZOV3FZPDBecXQzUDY0TyokbFk2VmJ9QDBMWEUwfHVQfD8qCitAbiE/eDArdUZpRSNQdWNhMlRjekJsVllaM3cmUERwcnpTejMzSWdvMXd3YGpSVWQkeF5CVTtCQlYhNlU+PntHUjA0LUlhRENGVHBpVUdmCiskOHg9YUBvKERwYGg7YFE+NDVNNTlLRndDVFpofi14aXdwUTUkZyVYcC1xJDR6SWVncXlJN2YqSyQoRGUzQm5YO3YxS3FwX3dObSlidEdnCit2fXkpYDFJWTZ+UDMpJmwqblF4YWZOTG9jcWxPT2B2aVpgV3RmWmY0VFk+dHw9NXhROT45SzY0TUJvISM3K2VxOXpkRSZ3dmNRTGs0PC1LCitEQUNTI20lTHI0XmhnJXgmV25HTXM+O14jVE1XXmNRcTU9b2pORGk+JVFEaChvPClrUFdQUUdFKk5Kb18jYn0lTGdtKSFMfDN5JXUxWVRQCis3TDshZVQzd2ZCKn1ORTVZNEA7V31GQGI0b2dGKXZTcVNwSzNLdTshflZqSHEkckNGRUNpTWA9VXEpWkI0WjR7MVJhdXEpKGA3bXojQFoqCitockh1ZCF7cipOKzJvP3MpSXAhWC1EWDNCX2tgYEAzM1kmIzYwRSktZU50ZjBLZDJZKzAkQS1GQWhybXdAdFU+RDk5QVQjNUZrVkAmKEB4CitMYiMrbHlzUGZkeHFhekB6QlFtY00mdyVjdGl8PH10ZURgKnk/OTx6Q0Y1aD94OyNkI3BVNlIkPjNgZCUhdSYmV215Zk82ayg4Y0NGPFE/CishJV9pUHNkM3xTfEVzfXRIJSghKCgkd2hJYyFFaH0yPmNPUXB7ZkpXQlg0U0liJlFlVG1oTEs+cUx1KXZ4LVNvZXlQcSp+bWI9d0AtYURNCit1MnNvQ1RkYFc4JTBOR19AZHtkODclJD96fVpuNCRjTUJRVm9FR3k7MDB+aDZmMjhXUmpVentgJk9oYHNxI1IzbihgaXpEMTdvZDwlM0JzCis1VFg3QjA0PlBUZVZpZnVRVW8pRGdsYWV6QURlQnliP31mREZrVkhTNyQlI15RWT9iJigqVjJyfHlmVUE3RXUqZDBuaWExdEwzUFBmRE8mCitzfHZqaDVPaXFsZ2o7VlJ2bWZhVEx4UnR6XmhnVWF0a1EpYklJWlQ+NUdUZ2M1dFhuK3FiZm94RlIpMDUtcVpzZzw4b2Jnaz1DQV47fm0hCit3SXxYaXxjN3lhRGAqeWZwVVczdjRYTDZvVClzdnlLJHlzWitrektYJUZecDE4MSpZZ0NEVnxRbHNIJlNQK1hVMHxYPW02MnU0ZX45I3ViCitUMTslUU9lMmRzTG4waUlpMT5SbGEpdkpWV3NFUDxvYz1qdmxlcGFRNHp6a1lGYTF+fnhUbk5MfChmdnd2d0pCNl9YLXF6RElISnVKQlBDCitLaDlqO1RXblhmc0RrP1cyIzEtMUswWHlecTsoIX5FOzw5I35lT0cjJmtwciF7bFEoZUY7TSpoeTJLQE4zXjlNVUtaI3FneFBrcDt8MyZsCitWU3hIaHZDUjBfMlo4fXN5NyMzemsyZnhzflRiKzZkRSlMKDJlRj1GKU81b2ZNJE1YSEEzfXFKamw3K3I3ajtYdmtEem0xdWxwRG9wPWkwCisxWU0+UjtiSlI5VkE2cm9mdnBBZXNpRFpVQ2wpPXp6ZXdfMGNSdVIoVDJeOVkzM3l0eE8jKVZ7KEpBcFE9dEl+XnhDTl8oLW95TTMhZjxhCitkNUV0WmwxTjtmRWMlWGpqalI4REs+UDQxS3g8RCRQSDY5Zl8zSmkkNEp3UXxldT8xYVUyTnQoKmU7STdyZVhibm0wNilUN098dHx2Nn5HCitSKGFgQSEoNj4hamgyaFUlQmpAXlgkXm82PHFCNnsqWDQzNjs7VSV5TjdJZVo9dDJCdj8jQmUmJS13KVQ0ZktFdX1qY0pieWJQeiRXa2hTCitlWWopb2NTczJncCNGTlZGMjZTOENLTFcyT01BJUtDaiVma3RPXlc0cHFtYnF6Kk9vMlAxM3ZUc0EwaCZtdzI5bDAjP2x1UXpRZnt+KDA4CitCQzQ9PDRIV1JuaT82aCpuKzM+XmYxSz53NXxvcGVWQGAxeSRsZTVCTzcjcSVjQXk5Y2hSYVVUTSYkaDJlOEJXeHNQOEBMJE02aFN6UWYyCitHZVE+bD5XOUJ2VHpvcVhpTU0qJXZnTE1tVXBlKD9TT2hQYjQ+VlVyaGMlTFhvRTJENCpWdjUtamBNTD1BSWwofDtSPiFOO3w8fkVeUWB5CitHYkRtaVRXXnhQflFNS0RaJDVCcmZee1o9aUlIeEJKJERvaTBgZGAxeWFFJVpkYFdCN3ZPZEwkYzI7WUAwRGxWV0hmVDBYVkhTTGd+TkZfCis5NCN6U29AKVV+UmJ7V0FoQHQmPjgkVWdUQz1DcCFnWCQzS1dBJFlqelopI1oxV0ItLW5VOTZ3MmVUUjt0JiZ4bFNfOHEqKT80aHY8SG4hCitQZloyTmBYZ0w5P0olWkUjJmRVYWVCSGBgS2JBIV9jLVF1KC1YUm1TUEQtST9CZTgzcyNOPCp1WlFMZDFMU01remQycTY1JUFtcDc8dSpTCis3YEZDQFdkJjdzSXxUZVBRP3xsKlo+YXhQRFMpNCo/dnZXeXR5VEtFakE+MW16d30jbjk1flFtJGBPSSFLJSZOMTNKUHQ9LTcjQ3U9cWkjCisyJlBnJjdWKzkmbHBMJXlUUW1YR0J6TTxIb3Aydj9YbmhQYUJoYGMyRGNqTVdxYGV1fGxOb35CSSYzMXhHe3ohYkVCI0w9VnJTXjFzbV5JCispJkQzcVYqNX5MRW5+YE1aK3duPWQqfiE4fE84ODlpOS1MSXAwMlMwUTdfSmxKbStaSlR7I05Vc2wqITY0OTB+WVlXVTBUXipXRFo3WmMjCit0Kktqe1lrQyo1RzEheTt2RkVSZkoqQHUya3hGWmR8aUR2WihmUkh7c0dNenFTMih0clYlPUI5Qy07MVhpR0JFUkFyJnpjb3FeU1E7eCRYCitfR21LcVUhVEt7MWE7cDFsRGJ5aD5IN24qe2ViI25EN3VMMlF5ckljMHE3dj54KkpNWStrZXg5UCt5dD9VLTBwbFlDXy0pc3NYMnZKRUwwCitDe0hYI29PWiMleSNDez9edHApeUE2NmFAP0JfdzhFPkAlaHIwUkJkIU0kSWk0aFJrMkMkWElHV1djJCR6KnFeKjRrSnNldjgtRU1mV3Z4CitKR3M/X2RAdXpCQ0Uzb0hmfE9wQnZNOXtgdHtWUWJ2ITx0Q19xTDQjKSY9USlXWmdHJDBNUD1xaFMpc3plRiMrRTZhXz5aVUQ9fTNZKm16CislbyhgOTg3WnFWdEx1QTglblVETl4zcDN+Yyo9RCpDQml5biY/ZXYxdEgqWiR+X1crZXtTYWUkUz5iZm1MWG51YHM4cjBRZHJaJlNCZEFQCitsOWlkcjRiPDg7dDxQTnA5Q2lhMCpEVn4leGt1eDctdmQ8Tzx3dyM8NUIzTkh7JEZPIVd6RkFGcWx0U019WUpuUkNMe2o+aFokbHJrbHR4CitYJnRlcGs2PUReWi1gc2tpO280cEVVR3A2K1A2YnVGI2pVX31QZVE4MTs0SillfT1qN2dmPk1tKjlqQF5VYGNacGMleiUwVmlrVnxzPz5FCitKI2B3XnZxVEM7RX5TLU5mN3VEPU1WN0dURDtqZmNjeGpmJGxGdjtpRXdWUzlsejdFUkpVYEtlbHdZMnRhZmpjezclczdAajlaJEApUTJRCitNa2swVmJgI304RGNSTEtHJTUzYVBaZjd0MDF1MjtBcVFfZWErIz4hPFhPe1klQlNKPT0/JlA0RE88TUYyPDdeaVJYY0ZyOEVSMTlnJk08CitaaCRNZUpoKDZHQklNY15fZiVeSiVOXmN6U2h4Q0JaRntfcXdJRjI7Q3gzX3F+NjFyNEBodF4mYnEzKztoM3tBQTY0XiVvckV0LU1gS25zCitkQ1JmJk5ZPj5RP2pzdHVVVnkyNEdQPUxaQCM9OHh5SElBeyNfK3BfWCZkT1FXVzY7SksxSyk4cGxVfiVBSEpeU2BxUmUqe3crcX1zKHVxCitlNnlgeHtsJGFrRVY3bi1Pd0A5MWVKSU54RDJ2eiMmPms+Z288YGtoWmBiSW4pb1oqY2d3b2ozOT5NK2hEbjttd1VORjxtUTBJRFk5cUNWCitNZUJYVWBtWUNKbzE3bTc4bitVNSp9RDRQayFEfTUwWWdnbzEpWUpjWmg3VElqQikxQFc/endhcDw8d2poMkZALTN9WTl8TEVQTGk4KTErCithMEZPZVNpdjYrciVxU3UodHdWQF8oQWl3WWBOSns3WG9BfClCJEpvWmlhUiMtYUhGTWl5PEcyTGZCKjdsZmFMSkxwY3gtUWxxbjdpcmRKCis2WkVyfiRzTSNrVENxN2hUa0ErNUtxNHRRX1p4NnY1e2krTCNuI0V3N0g3TERnd0hpQnFFNCM+UmlzbXNmU1hnYHUmX19VNzIteHRWWDtECitMXm1ae2NvQnNqUDtHRj18MzkteztFd0U7LSVXIXAzPkNQUEBYNzQ4RTtgeEdDNWZqbEZpV08xI2pBfjVscUNIeHhpTSRtMHxxRkB4TiFGCis2PUMwSkFrfG5oSTk5blZQZitZX2V4MjEycD5YPWBmJVNMSktpcjFJck9UNUpLVDdINz1MNXpmQ0x5OWQrS144QW17b0tMYm02NzZfRmRmCisjdGJeJEdRY2BDSlBNamJPUXlpZXZEdUpieC1kZU1saWc8XyppRmtPPH05JllYMiVCPGlISnRlXldHWWJRTkZ6YDJFIXp8TUFhblVpKikpCistdWA3Mi1aJjxKPyYyMDJASjdUI1plJDNZWCpCZS0zKmtyOysjfHw4OHhSVjRZRyVMV0xsa3ZeWDhib2p7WnpFJG5VZHs1RUYlbDFUUCFECishPiM9MiR7Y3A+JUV6Kmc0ajRRUDxgMk1VVnpDPHM8Ryk+dmJyYFhCSUNqS1RLVFZ6YT1wIWROTj9Zam59PTZ4ZHVtKyEzczBEV0prZmNBCis4OSgxPWB0U25TJU09Z0tAJTdxNGdWNUJFTjMhZTZ7VG1XPUByRWhzWEwhUj41WlVsMVNwb3JLQzVsP0haa3lXIVkoWnskZ2ZGPX4qZmhlCis1LUEpc1FeZnZNKzt3dUZzQT94cEFnS3o4eyp5e1EpcWFvPDBjWjFmVjUtc3I0WmdZa2ohOU41RCVtdDM5ZTZKNW1lcmAqdj5Oei04OHQkCitLR01ASnVyJX0xRFF5JEdONyZ3QUZSc2xhSEpeKnhPRjBVTUdmbn1NR0olTmh3amVDb14xdGJ4VVoqPHdrVyh9JW9FJX03VDR2LUNXSFdSCitkIS17cXF5d1hLcDtPIz8kYDFGIVNlWmp9KDBTXigjNyhFZnhQZEdfUjVwKzRlYF9EfTl+blBmeHYoMnZAUDVHN3Z+ZG1eR1RuRyNnUVdkCit7djJVal5QR3s1PiZ8JSlfQjlmOTxUQzNacCswPHR6Q29BQ2ljOCtlR2xnKTBFb05UaHEyPytkRipDJFdeYUMrKm5pS0l0PjY+ayVFVEQ2CitMKzdkZzY5X2Vxcnt4WnkhOEJ1TEZ8PkApQTVCPkIzdUZ7NmJ4SXVeeXgmQzdJMGlkYTJ7YCNmdnI/Y3o+MVFDWTFSZUtgY2RUeyF2cCgtCitXQCk3OH5+RDF5ZUFyIW16KWMxTEN+fSFKaz9ARE1FRmQpbWpOfio3fGpBZHFmSW47c3EpWClybnQ9XyVrMUl6P1JxakY2cG5iXiMtS2FqCiskP2s9bzU+Y2BkKTVZJU1QdjdxYURfLVA5OSM8NFRVYmZVdHFKVHp2ViROOEg1dWR6dGc/JGMrJH4hQ00oalUxYEF5WTZLQ3g/QWpMUkxQCis4YUg1RjFUPnErOWVgRDIzJEQ+O3UzP2U+UzckTyNmTz43TkN1aDhQZnVSaXhfV1NPeCNlfm5ja253RWAqNms3c2lxbUVpUDAmLSp0QV4qCitrZGdXYi1VJWNyWV80fGE4Yi1oPnFwIWZROGp2bUomYl5PdD47KXNNWilpJXJIS2o1MkB2dHY3UjBfPF9Yb2UlQmxveVVSSylleT5NY3EpCitjWi1ILV41PDhfaTFhViM8elY8TTdqYiZvK2E2Yj1DTEV+dXR+dGlBN0d4IW5IeTlqQCEpXldVU2gweyhlKkxKTEh7MlAhQGVrWVp0dGokCitTWUx7QSF+WVMoMXkzQ0VFfXV5Q3Qje2xyRTd4eExxTDVkaj9gPkdNV1EqJWlFendscW03OClMPjtgVFQ5K1duMmpfUnFWKzRsQz0/c0xZCit4b3NhQnNfNyFoaysmKms0Wj1LUV55R05TQGQ1UjFebjhEPU51X2BOOX16YWVlQXZ8YyR6OFFFRiQkNGd8JXktS25FVSptTl9zKk4+S158CislV2JuKkdaMT04cnlDVThQdD5XPmdoNUV+TCt4I0dwdGQ4PjY3YFZ7QXBGUWI3YT0lT0FjYzw7I1M0TXV6cGN0Kk1MV0AhVT1eeShCISQ+Cis2V3d9Y0JJcTJ2TS1MK2xXZnE7P3taKCo0UHJrV2RJYi1URnJoVEYlMGdWKSpDcjxMY0hvSz9fd0s8dVN+e3d6OSQjIVY7aGxQdmRUQD97Cit+b3pfTElqdnBtOHZlZDheMi0qcllPN3dgfitLbSZfZmBvMGZpSHEmPCFZe2lAVXcmeGtUcHJLQyYrQHZpczFlRHx4YjJjYypBfDFfcTd9Cit9am9MMGlvWG1tbTtFb3J6Jmk5ZUw5VmQ0d2hhdktTYVJoQW1YZyZKOzVfP3owTWc4b0ljajJ7MmdrT31INHN3OCl5JUNGLWkycDxmMXJBCitqLWB1S3twX2JPPW9Daz9zeH5QREhSNXw8QUNnO3lQT1o8LVhkMDNBflhaYGdXNDF6azx+SlZZbVY7T25XR05KcGx6Kmo9dCtPKztEKUd+CitGfDd3JlcyOCl9bDlZfkdAb0BwMUVWc0NCNXwtcGJycDxlTmp+TDg0cCV4TmRZZ1MpTj4mN0JYPEJSOUM8VjJZST44RmVEdUQqWUJmaFNtCitCeT8lVDc+YnQ5LWV1QW5uRy1aTTNUTGMpWEltbEZlXz1uSF5oekU7Ym5kJDg7eSstdyVoTmhRO0NlTT8raytNPW1meExUI2hzNk5AQUVVCitxMXp5TVd1IyN9JGZtcXVKVE9OV2tIbk1VYHZIZilNcEF1OztuPnttQXdmJSMhKTcrI191cGBVREhKaF9icW5+SWtRbCU0fnVjIVBrSUVoCit9OGAhWU10ViZvPnRAeldufiV3X1g/Q2RnfEMqO3tnPG05UF9zZ3YzSTc2cm8oPCR5KjlfbEVvVi0kanAhQn0yIWwzYnY/KHtpNnUhVjNPCisqP1dfNV9nPyM7Wjc5KFdZQnFnZFo1Sko2PUo/I0M/YyRgN3lec3o0MWQlVTR8Yj1aOVVAUSs4cilgSiNSdmJWQ0U5b1R1P3RTeCFfREdnCisxaFd+YU5USz4yWGk5RG5DVlA+NGpFMkREZEo1V047S2NgRHBGTz5xY19AZCE4UnYoel8zQHN6OT8qXnszTEtfJEVmeUNhcipyWlgyVnZsCitxR1ImY0lmVWE0PC0xJnxMakIrc25pNTIxPnlpMD8zKFlySyEmTU13cj0mVzVebj9kJTF4XiEtIVVmKVVCaV5yXmNffHFAYVhWajdFfDYzCitnRWdCSTJ1WTMpRGVodDZ6MCRRZEs4fEw/TyVyYE15cihte2lucmJDMWVhKnopb0lEVkhoRD17TmtORnlCOFl4cDIqUyhtSSsyYG59IUJtCitleVVXbWxVSkR9YzBXciZreUAhfCh2OTk7ej9ZPkRoanxfeHlmbDVhUDlMeSQwNylaPE8hdXhxdFRfeGc+Tml5bThiQmVNSGMpX24jcyRACitSall5M1l4UFI0TVkzPmclTzYrR2pjYHooKXNGUlBxKnkxS2tXVkgqY2tEN3FxUTQ5eWpGd0A4UH5MN3NyRFFRZ1RjY0g5NSF6XjVrfTR9CisqaChHKDc7Km9rUSp7dCZnPmo/ZzVyZTdgS0xvYSE/IXJNYXRFTVBGMVA8KFFUZkhpYEkxfihZPGJYckRXcG10VkhZaHB5Xi1NbUdacVB8CitoV0lvPDg4USt9MlZvd0ZxR3EoSGI/OUBLVSskSEgqeHk1cE9WZylTZzRqYWJQUmojUiN6NHZ9QSFFIzJHYGlDPTJUYjRRX1FFej12RT8jCitQUiElbUU7aUp6NnRUSEZFZWF0UXltYDZEPCVMOWledVFTflJBNmV2UFpNVTd2cWklU1pCbHZKeDQ0K0d0OEpAOzBQaTMwcUhMKD9zRHorCitoU0lzVlQhdTx6KEdNVV8lMW5UTUY7JDl5dWBBRjRLOFJVfVAkanptMVdHeyg9R1k+WUc8KnRVOWtzSWF0akhxfnt1c0QlWlk/Zj9RQ0t7Cit2O0g3Qj5uZWQ8UzJALTQkdW5qOXFJVHhBd294JFoqe01oI01eTzFTbHd7a2hPIVpOJEMzaXpJTkl6TWszNDhMT3dXTHw1bzk3KilDJk5xCis2RUskMD1mZ1k5PUhtPHZLTmVSfDZHNTk1Z2MzbTVaOX5jTUBWJndLSDhnc3E4PWBycjhqI0w0PVFFSTQoS3JUQmJoSWBtc05He0k8MCooCis8MDJEa19OflVqQ0Uhc1JXUyQlbGV5MjhtNkNweDFWOVVESlBPeWB2WER+Pn5WcnAxVU4kM2tPPUhWTDlSa3ZeMF9KNDwoOFM+dG1UWmZ8CitoN2poNnpmVyNLaSh6RjBiZCkrdEVBVkNQV3dgdDExUT9xMTkmeCY9cjFmUjJhRkVfelh9OT1iZllJWXdUekNmVWBBX250cSg7aUxuPCRBCis1RktHX2NgJlhPVSheZ1ItVz9EWih6ViV5ekA5YkR+QWtrfVVBTjVfLUduTlB7e3Q1TWlRcipgOyR7bmRTeSlaN0koYlFyMF5NKFUoflA+Citrdjt1dihlPGJjbXBIcClMNXAzb2JlZCZRREJZfWpoOG5rRkY0eSstTl5CJSpnSlpHbSs/QFhkJHE1cDlnMHFHcVc7TXVTRjM0Sjx5antpCitrbX05TWQ9VEU1TXdZIWokPnlpNjtnajJnJT9BSHk1bHF2P1U1d0dzITBfYDc7Tyt0ZUY7bXsyeUpaWUtna0l5Pl58R3FiNXJ8PmRISyRhCit2JlJBcC1eZGQ2UXl2SVlyQWd7cnNsWEdqOFVlWnBRXkJXe1J3bk8qRTZyRkpFPFI3PlByIWo3ZHokQ1lyQ1c7YmdDQ0VQMFQ2cWw8SGkzCis+LTxVIyNISiZtNCpmOD5OTGZIeCUoVmc9UjkjXj5DfD1uWXpETVFQMHBYXmo5cmpoK2NXPjUhQjswfD9LS1kyPV98NmxJQl9leWMmQmZ8Cit1QnJuUjx5V0BIbzwkZGl2answI2tINm49PUZmZmhZLXB2TUpeYGhtNTQpc2QjTXFkRjlTSFNKSl5UTEFUOCt5QkJKaCFJclpzcmVsdGUyCisjSjA+VURYX2VQez5QOXhwIVBxTVkjfDhWM3dwZ2VCNnlKdXFLMUNBd2tYaUxKYnFLIVRWcDAoek5hbSFzOXdMYEVtTXVMcHAmT2BBSFg0CitOdjxadVRAS0VgWS1FWHl2bFY4dm92cj5IbTZRPj0+KWRHMXl3ZnklIzZacTZiaHxVWGJXQlVEWUp5PyRwcXZrVElQSUUwMlhMS3Z4T05pCitQanBWRmp7elJxMStXPSNBWU10IW5ubkVvKmhnRD0zaVZvREVnQlpiY01SI148YTlZPW1AeGYhZXs7QSFNb19qPE9fJl9naERWZE1ZPkQ2CitZMzwhJDk7cDFCOXl0KXdSbD1OK2E1e0lfP35IPjlKIW9eJi13ZWpmP19AWHR1RHpMQXJleyRVQztrNEY9M0BMVj5rcDJfPVVDS1JYOGExCitNWXpYcj9rbmdgSVAzYyElIWQ9Jjw8dER2bkwkTERoVHFCVGM/QmUyMzxgJE9VcFNEXkNwQXt6TiNiJSk9aExvS1V2fUkzRV9MMGBrI2UtCis5Mj5kTGVwYjNsOChLI3t6I0hqMGVpTHBWLWlvflNuSzM/cVNCVG1GPUpnfF4wJD9RdnZ+RGBoWGtmUHtxKGZnckBxNEFWLTRSOUIyNTVACityQS1qIzVDKGspQ3tCYXVSKTtBdFVKKlZWc0RfaGVQbE5FS1RoU3habXR3VXYkcUkkPFR3K15tYXt2ITs+NGRyM1ZVSURKc28wZXI3NzU8CitaKU5aREo9Q21nNyo9cD5OV25mX01ZJDU3QXpXVWtLITtiYWNLeyV5e1g9UWtCQlZ6cUNMakRaJjZsKUNGdDJyMHlkKX5qbjZXRkQ8JXt9CitHKiQ5PykoWGtjWSFgZC1eRE1aNVlqZmlTPkxZME5Vbm85QnxGQGVpJlg7cDs+Z3JQXnt4a2lBSGRYZTI3YW1UeytxanVmM05PNjYlfUlfCitKPSVSQ0prZEsrRFh4P1Q7dClMfk55MSUyYEs4dz1xaHZULTxmV1B1UmReeFEpNkxhMWZFbW9HeXVxKFF+azFIZCl4PWNEI2lPRXAtK2lvCitFMnVHYjt5ckw1R2s5ZWYkbm1OX1cxOzNlR2w9K1dpOG5haUF0V2JXSHc8YmlPMksqVE92dkM9NEZZQU9xJjJkaENyJFlyakRIOD9vdWkyCis9P0l2fDNDOzdxc3pDMjtWbys5OS1mKDt4WnVwYHo7WlNiZCRgeT9QRkkrJUA7TUkoeUx9SzNYdG9OUFpVZ2hPSCR2ZFN3NGt8dCU8dV5kCis7TjlScG4wdWB4NWFOPHEocWErIVZsdyY8T2soXlFJV1ZTQkhZWSY3TmkqKFNmND8oXzNRdER5bDRveHRyT1huSCo8TkJzc3AtVWYoKEMpCit0QURzRjU5VjQ+YVUlcH1qRT1TYipgSmM8RiUjXnQzTldeVXVHcExRdVhYI3B1QW5EYGF8MFR2fGdUU2BaM19LNlI0WktCYFo8UD93QWNQCitaWX1oVmR+JF8xRGNvTjtDfVFyRSYyM08xJmgmQkxeaTA1WHxLeldiMzRsVj9mdVpId1M4c2QzemswSjJ9aW9xND5fOzRpSVgqUS05XylJCitTeCRoNU0wQFY9QHNTJUNodj4mNXVWfXhPTlJ8YyFIOSUkdHFuQGBUXjF2PzJaN2dQP19wfFUrKFM9S3JSM3k3ZVA3JitAXnBXKyhhamQ0Cit1WD9hPyp2LUwmWVQwNXM4a09tVkVkNFFOdHZmentUPllfVVRxM04lbV9MLUcjMXN4Q3lPTDdfLUBVOGV5KD5AYCM2S3tVSnlAbkQ5PyRACis9KD1lMzc5fShkYVpgYDQoOH0pPTFfRnpPVmN6Um9oN3Y4aSpLPzw7bUUxWGpAQVdgWEk+Sm5kSWI2cm1Eb1NtUDM7fml9M15PVEkxc21RCit6fCF7Q1BHaU1wUDhPX09lJW4lWHomVTU2LTdNbnZVKWFuTVZRQTI8d1ZZT3podmlJJiNPSTc2cV9SKzFhWVk1T3M1d2ZUUFY4c21EUTVQCis4fnk9P2p1fj9xPyFDTk1OcmlAJVB+eVdPc3JnakduWWpYPCZ8fTJKbHp6VlYtI1leQEI0IXp7WGg7Z2UkJTUle0IkSyVjO1N4bUZeVmdMCis+Qz5na0lyM3kyTXlXV3U+T3tibXhKRH1CJDYlNVk9KCUhIUI4Y2pGNWl1PjhGR2xLenkzbV9mbG5pZXU8ZnElelRMPHE7bSZoZEJKUGJoCitSZzJNPkZpTDhtUDRwTGQ/ekVPWEhsRClhTytsIWBkZGVzU0A0MWRCOCR9Jj5tOG1hV3trantoZmNWajdFa1lseGlPNkh6bkZNc2cyT2pICit9ZGN5Pl5VSUZxMmN0cVpsbCo8ITRxWHFEcTt6OHtWNCVCMHFvbm9tY0lTUzM0PFJFODdXYmQzST1OeHsqXnlWbmV8TmxAUGljWkBGTSV8Cit6Xi1JSihEc1k5SV9ARytMOWVDem10SnUpeEdHWUZkdGJBbWtweCZpMSE8QVhyOzUxYEBJMUhVKEUrYTJyNlE3M0ojZXtvaDFLQz9nX0NCCitGb28laDtSTyYxR29Tc30oMT9CUUZgdURUYzx8T3E0Kl8rRzJaJD1TWTIxPktacWBDP3F6fEQ3VSFyPztwJElCaXFANUdqOW1ibyVCWUI3CiszSEVZTzBgV1chWEYhSEh6Vyl6T34wYTBDeHNxNE17VGFYWCRnY0h7blgzKmIyO3lBMHh3VWhNWktpWTJrWSVpSjhpayVDWVJWaDFQX3smCitjdWdLT0cwa3Q1T2IpfjEyQEcmPnstelFGNWwhfDxBXitNdENQdDgoXmNEY0I4KXswU2BCRz4henFDN3NnJT5BY1BRQTYkdChBTUpIdk91CitqbENUNDlRUmNhKHtiNkQ0bnc3YjNQMjRvJDl+Pn01QEsrJiZfKVRYfCFyWU0tO2VKTV9wQVUqdnlTaVFRUFp7d2UrS2VzakU/blF0e0l3Cis2U2soUGc+QWFYe0s4czs0RD5rY3ozdSpNbCt1VzU7d21qPmZRbWU7e0Y8XjlYc2JxWGU1amo1YnNmOChmNTRvX0tnbklRKTh5UHdyTjxKCis0ajZlS2loYipCTSgkQGFsfERQdklMPmFRaD4rYUwqfWxpMU9MZTEyQiRGaGZfYjs8cChoIVVYJmE4JSReMmFMd1FpSigtempkMXRsMmM4CitQcmlXX1lkUnw5YTVxXyghOFcmVTFodHZySnRXQGJOWkRIKHpERkxPSFAxdzBOUHFOeDgrRCk3Z3ZJUUpxQzlSPU5kJTFZe2ItTCZYcERaCitENHZ7cXJaaDZnMkxQR2gkSCpGM1R1R1FHc3IpcTB7YE4lJGJnR05oWG5JTGpKQzJuUCZWIzxDeGNeN280bFE1PWlGVncrQiU9azRBKTNACis1Wmh3TShjWjM2ZGdPWHdaUVB4UnlyPm57U2QxZ2JleTxZO2R3dz8zdXFtXzQxSHdDaTxRKzMqTGoyWUcqe2ZrPyFCfFFiSkxAdTMwdkkwCitXe0kkP0d9P31+Qzs5N2FMVDg8eTJ3bS1QWWEwZTA7MTB4T3czYVpSTXkxTjVEfm5aXk0yTl5Dfj1kJip4ZmRvSVBESiZKZjNTPCFgaXpiCis8ZkN3ZW8mP3p7I3deNC1vOURGN35yO0wzfkphSDZkVCM/dlZMbXR9I2gkRjg3bSpBST9PXnp1VkhFY0M0ezs0dWNPMjg+TmduQTAwbVZJCiszJnNibTFxQyo9SUxNe1ckLVkodE96R2srRT9wM09VOV92WGs1OVNVVThMV25fRmtnS3I1cXlBNkNwdl5TKlk1UzIjcGVkaGx4eTY+a15uCisqRUh2VUduVWYhZWtfbXJzbiplWCMwbnQpWGpeUyo9NlBURTdlVm1uQztWMEBqcnItTHt7Y2AtMHxYUVIwMDBPOF5PWTd5blkzRUxWKn4mCitJJW4xTWg3WFNiTmFBfE5hVXZfMH5XTiZnV1V0ZWklWD4/eS1FXnY4YFI+NitqSFcwbipEK3VMS3lMSUhHS3c0bWQ5MihlKkUpZXVrdzgkCitZPzIkVkZrU1d9YChRcjVhYns9SUtWJCFve25xQl5XNCZUd1k8PURwI2pYYDF3XiYrLUZ4bTlhdU9RUjYzbXNjdDdLPmhWcnBzbUtYYTNwCitmakpMfmpXYFVVV25peVQjPXNkSkVHRFhJazxObzlNfXQ/V0UzPDxYJmsrUUpxczJPfkZvP1UxSjdhaUdvQ0ZmYGc/PnNKMCF2RUhudjt1CisjPTFGXmJ2bF4me3h2SzNGUkVmSSkhYmJ3eCQoQkA0T30xVz1WP1VnezNeTjJSflRLYkh3YjheK0ZjVD0pcUdTem1zSEktKVUzS0A1V2BsCitedihSfmp4SUBGaUgjWSVtX1ZSTGc7IU0hLWRIRWJNd058ZDxiaS0mRj81d2lkMWtQZUN7RCthKzhJUGMwXypgKVA4XzVqaD5yc2h5ZDVZCitMZkFJM0N3OHBwRT9hMENyU1g3bnJJSWglakgmOHwoPj9gSHFOQ2VvTyZ9dlUyYj9QYWRMZHRfd0kpZG99XnZQIVg7bV9ZVEFHYUl2VWZpCitQfDteVGNkcVRFXnorT0xFKld7LVp3QCt4SmkjNXM/RkIyd1VoczJwdn4jenU9ZV5mbj9lUVlhZTFQJTNCVnN0ZWt3dTQ2YEUzIW5fcFZpCittenFrQHdYMG9+Pn03VGh0eEhTdDFVSSN6bU1lSzsodSNfKkNjM2N6d34wMEtrUntDQSZiTWRqaWlTTkBVbmE8KGRFKXd0QntsbG9nMDJKCit+YyEtc15GP35AUnpEJEsmSkxgYW1sQSZ4NyZ+VD1IWWpzSTU4I3p5WkNvOGUqP1F0d3pMMmJmbTVDQG1yMC0hKWU3ZzQhbkcxalpiPGomCithU2RSKHphZ0ppPW9WS0picGtAUXJXJG10aEg9RktHJkRnMHBnSnNfVHpNR35pT3pXRjVhM0xkZzFqV1JBQHBAYjB4JFF9MUAkMEc8OStZCiskKjZXP30lfWB7ZVkxZ29KKDZjNHd8NTtvNWRtIWlDeCp4UCZ8TT4yd3BFREBHS0JabTYzaS1neHlGfW9iRWpoME5ydTU2M3VpMk5rVSgqCithWXg2JVVfdyZlTHJvYjY0KlVUPT52MnRXQkcqRjBaYiM5Umc0ZzJJYT52JG1ZeUZzMWJTSF9OYn1vPVdQeWNuQVR1KSo1Pj0/c0ViRUNuCishSG09QlgqNEZSRlVQUU99TGZwJnc3MTMrYSVrQXo4dXNWc35hO3VhI2U8Uy1LSyQmKGV7SFQ8cWRKR0RtcmdWT0I0dGpGZncqQTx5cTFJCitSbVE2cGc4YlpvKChMLUFObXkmc1M4UyRuRGdNOzRyQn52dlgtV0MjQUFtQzV8ZWFOXzYxZTdEeSswRDlkSytVUCNuS0pSTT9wJUhiJThFCisoV0AjQkYlQj9+aHd9Ki1oYTFhZUNUP2t9ZDBhfFJ7SSRVeWJuRiVTcT5vSHZHb24tV2F6dEVBaCFUP2wqemliSEtFZTwjQUxzZFE4fDZ7CitSKGkrRmc7PUh8PHA4NHZzMVZURnYmJlotejsrTjc3b08rJmBeRFh5MEE1Ymd3VVkhcTIxflV4RmhUMktkUSNnbmJNTkVqRTA3KylUQHo+CitgJlcqQ3orPDNGY3FeT3NURzsqQHFKKChnSEF4P0dBTVBKNUdZdEIjWHEhdU8oIT1RQSs3KEROY0tXIVZyd15WVDUydz8/QmVhYSh6MTs0CitYazBTTD07JF59QWFKc0JoMUpUXmFhKHlSaW9UQUlRQ0kkcCkpJDw+X1UpbSQ7e1BGSSUkZHBOOz9VYTZPZihSYDkhYStWNjVwNCl+VGc+CitnJW85IUZwfTVnZlYhbHRhJXAwQEducUgwfFhRUjAwME84Xk9ZN3locUplKkdkbG5QRD5uZkU3eXRrT2FBfE5hVXZfMH5XTiZnV1g+ZWc9CitXTzhNNWIxcmFzP1J8VDk4QGFMUHxOMGFkPXtoOEJpWHRoUm1LRG9jJEZVUWdHeDV4d2FneUVqSXlfQ1hEUm9TQ2JHbjspV1Y4M1BaJmwmCitfPXc/JXJKKVlkKno0NiMyUCQoMSVnK2loNSF2VEFwdCM5Kz47PDlBSmUqWVEhVzBxWWtWfEpkLWRWMj9xZVZmZVV3MjBAZCUtSHVvekdhCisocTlfSzhBVDR8WGwoQG1NPj9BMWpjJEUhRmtkd1lCUGB9P29oQX1ZISpUTyFmeG1gSTwwZT5GT1NLZ01ob3JPQTQ7akxJWlNwfnk2a0A+CitgYXE/RUJtREdFMEhOYF4lKXpLTk1edVRBJEB7UktgY14+e0VRQ2h7UXloTWRfUm9ePUxsTjxEIVUqSl5VKC0laishdlJCKm9iXzctYHpWCit3MV5ZUSpRRWpHR1dQVG8jaUY7RFZiJlNjKFAyJklGRlhhLXJrPTAxLX5lPjQ4OVV5NmxLMWRtM3c9VyR5SjtlJjtfNyEjIykxM3pjKDFRCitfQ1I4PHYoKnxwSCUpLXJFbjk1VDhUUGM7bzZQOGtOc15ZNkBeJjI7UF9HVUQ9eXZ3WHtQdUtAIUtibmVUVzBBK1hEX34pI3B7eTJpJnBXCitRSmtONG9ZYUpEWlBYam9HK007VX1IU016U0N3JlgjcHgxMUFUTEpeJEBiOGxhbzN7UT56eEFSMmspNTVme3daU3pWI3dHckRgRlVzR01OCis9cmU7ekxzV2c7PnVHeTJRcTNXVkUrempiKT9fe24xIWl4ZUIlaTxkPXdkUz9uQl98V3Q9PXtsTnlZRU42PXtKenk/KCsrYUgwNDFIR2wwCituVW5WUjU1cz1xNWxLQE1UWVpTeDVvQ0QhSkMxUVole3NOZz1vUi0hNjtPY0BtfGRvZCl3bCo2SnF8WmZseGN3MmJae0grfVZRPmRUZXIzCis9LURGNDEhNktxKHZFfXYkI0ZJPmlVWSt1YDJPNCtXNE9yRlc1PGtKJUpgJTBtSDhfRzBlYDJLYEJzMGZmTFp1SUszekB7aHM8diRyPUBtCispciRwYGsrKzBqazk3YXhkcnBfVlYwe0wxNjkwTzYjKWo8aVZ8Rn5XV3RCJXM1c045XmkqWjJQYCVvcG0wMUtDR058cjY0Tk99PkkldjxMCit6e08+OSU4UDJIdmp3PkhRTXszX1dYZGlFJW15RE1kK2s8Zyl6NlptVGAhTjJXfEc2OUlQYDt+SmMqKHtpXns/TnN7PntTcSRsbDRodE5ECitBRW1GS0pWbDIoUnpQN3xpeEt9JktPNiVvdU1ack5hMSVMJGlET1FfMk1SOzNCM2VgOCQrK0IxdDtjP3RjdiZlOWhDblNhOEdGemh7SipPCit6ZX5sYkt9a087VkhyUT4xOU02V0BGIU1xOXZUZylJdGBLcT0kZzBhbno0KFZKelB2fXx8bWZ5MHFUbmJMJHFHaXY9PkpLMVBKK2MxNmRrCit8cjMpcW0wKlExQUJfJGNrSER3N1lQfTRzNmhYXnpEIV9VUGU4fEB3cj08fmlJO1BoWGt9emkmV0hAT0tVKUc+SGhHX3coZWs/LTdYQm8/CitfO1lmVHIwczBfazlhMW5ATUthZnYkQ00yNU0oRkRASzVuXzRmO3NxZztsU2gmKmYjekdXYThCKVQ9eHhWRXhGVDdgWCFsTCg/ZyRQYlNMCit9REI/MGNuWiFSJENnU19RI1ZvcVlrfnY+bU56XjZzSF5+SHBZI1ByWmEyakFOKmdUNjEpUmFwZ3Z5OFFKOEZ+cXY8VD48WmRDUDkmbEM+Cit8KGEoI01xR35IWWp5KjJrcXZpI3lHRFQrLXo9PVZwJWojZGxldDZqdilNVkVLMChfandsOFRIZSt2VlEjMjI0KS0jMV5uNipFJTdwQC1RCitjQ2JPUl5ocyVtdnBleU5FamhRa1pmPyZFeVk8OzZEOVpSYCtqN1c/Z29WOHVHaEdnfW1PT2k5fmtzKkktWDtXRnxeclJnPSsrPlc8IW4oCitPcmgmPU5SdWN1P15CQnZLPm54cEpuOWskUns3SXo0UHo/SXtObV95RmI0RjZFdUgzI0Q5O356aFJNNzdWOHo/MV5oS3labiZlPylfKVpwCitwP3dOeyVqaiFwNCEwQXUoP0JhRkhXRUdCSHdkIXQ7JkslZ3BZQjY4PHM8fUk2bV96bWhfPjN8em5hd2g9bzRefiFxeGBZWHN+VFp1cWN2CitBNnZCYnV4RnlDVkFMJEVZIz9ZN1FAJHIwPlVsX0FRdn5rS18zNmpGIUs7Tk5EQiVtP2JkQil4KFdVWG5GbUYzM2gqfUU7KykhbDtLV3lOCitOX1VNQkpVd359UFI2Iyo2alNmKEY4Snw0MmBXVnRseE9wKWliTldnWTtETlYoZVpoREtGNztUb049KkpKI1d1cSZ2UVl0QTE4fmNHd3NlCitoN09XTC0yP01wWnAtcj5MeWg/Wj1gc2s3Kyp6eWQ8PTgjOVJPb0JMVSFsI3xIUEomWW0xRmBtZnF3NytQI0ZzKW1fNlBKQ2F7X0VmZyh0CitENytnWTBwPkorVzdPZGg3T0dPO3N4ejQteiQySGdGZytlPkVDKmsoKmpMWEpYKXtnQz5JSjRyQmRUOEo/cFdTUDJkbVUySGEqRjt0IyNBCitOTmlmJHhTPkBzMXZjejNXSTJ2dDx5YmYqcHBNdWgzeXR8KmkjPWpXWG5WUmhNbUtpbTlCNnU7b35ifGBaNDUtckxkekRYPjh3MF5wS3MhCit5LSFjZzl3cHM9bWRIRmRGISNtRHs5MUhjJjlTd3NKI19tPzMkRyohWTVnYHhVYG1vRWFDPmQtZTNScHJWQUtQcmx5UmNTI1cqaFEoVGZOCis3JDY1YHhwVEF8d0lpJTEpLXBNTmc+cUVeeytETCoqfCN1cn5+TGgmWlJVbz1+SVB0dl5sb28weDxINHhXNEVAcFljKWtuRG54SnRtenZyCitKfjJXdSM+LVIyQHtEOUpTazQ5PHltd0IockQ8SkhyVX50SjVVcVFFU2tHRFJ7aXA4OWBUJUpnQU1kRz1oKFlRfmNjMSg5YikkS1VhSkFuCitBVTJOSGw1ZzRCT1c9LUNLJFltPWw8bVdBenM1NUYtPlMkbn1IRD9GPHdKPjRCI3dDNld5TEI3bCVDWiprS2VAKmZQYWFJU29PJnFBe2Y+Cit2V0xjV3ViNX0zIyomV1lRP04rdkhzYFokM1pDO1JDPnckZVN7aCNmd151WjslUGVDc0RLMjYpS0RJM2lecktGenkqUk8yTUBDJjkmYjN2Cit9M318LVFjVVBiYiVrMHxLRyo3P3c8PWhUO1d4PSY7dzZCekFkez9DempLOEdUalBJPkF6O0FPIz8+M1R5QHN9VVV1XlAlcjBTalJ7JDxgCis+alhnTHd2WWt4IyNGZndDUSFgekdXbHxIOy0hNmhxPTw5UiVuKG1+NFglc2U/JGpyRTloeUxCWEYhUT1oKGJCRGNUIXxtSW57cUlzKFlfCitjP0ZLIWdGcXRFOXg+MFN3PXhlQmEhYzctTklxTnBVUWFiU31kUUI0VnQoMlE3QFpQenNpYEJLfk87VkBNcXx1RT10MTJzKmxmUFJ1QXwwCitnXnM9V3ZPM0ttJS1Fa3YxTCtfZHRfNytqKUFRRnpjQTJqSXVAKml3I1lGbHFhO09fMDdxcSE8T1RQPlZEJjdHRFp0ZzM5MDxYPHFxczF2CitYQjI9cGBiPEE/bDRxUlk4NFQhNiotbkhQaXo9MEBkRmI5Z2t5LWE5QFdWSH04dlhxVjhgdUZYOXk9JVVUYEZlJUR3fEUjSSY+RDktfXUjCis0JGJTT3tpVm8jNWF5fEtIb00oOVdQXyl5e1lLa3Ite3pESndZYj8pb250c1FEeiZkPUZrI1ZXPEdrJkRVJj1DdntEWClIdDIxcjx5cDg1CitAR29xYEtgbGRMdT9xYWtWbyYqemJlSXk9PnpIfGJ+ZDh0eVBKQnFqUjxNVj0lbDtfT0hLZHpHWVp7SF9+MSNyWkVtPXtIUEJtTDBNfHJ6Cis2Y3Z2MDFJNkpvI3RyJXFlNVleZFM1dzMmVSlYIytJTUxVNFM3PXc8KSppPChyIWJXMStmUkZKSGMtJDw/bDYjdGJkQjJHNTdSZWg+Y0Y+CitVMCV9VWEhWSRLUzJfTVY8NkokR15mSlkhOTFKNj5RSjd0Qy0xKWQ7bUB6V0peJFp0Q1YlX1dgVEk5TmUqZnpBOCU2NGF4dXctUzl9Uy1aCisrYnNDd1YwZHpMSlRRQXpRU1B7WmJVYld6SzhEbnIjRDhqeEx7MG9xKmN5Xj8meml1VGZFZDdyXigqJlFseVpWZUcoelJvRDNrcWRrTiEzCis4Q35kT3NEWTwjWjQxPkw+ayg4aT52PE5BbHB1ezVCPClCdz9FOF8wO2lTdVhgR20jYWVYJkJDRGhefDQ2b0tjezRMM3V0by1fNUdGZ0l0CitOJHIwZktmYXNXNnYrRmd1JjhgN28mNUY/bD1DaVVkXlE0eHpsPnxsQFdqZmhjVThGfVM5b156dnlyUUxGNXhZfVNDRDdJd1pDNjtDSU8jCisyYUIxaFR0d08lbmdFWmdUJW9MRzMtI0JQRz8kNyVYJXc/OHZQN0Y+UmdBNUJNfVI5amV7QW1TZzJxcFJGK19WeShfenhVKWAqI35QTVRXCis4IW5DYX5Zfk5fR152cFQ3SnJjJEA/YiNseEVpeTc3fG55azg0X3RmaEtRczAqbTRWZUUzQ2oxTTctKklkR2V5M3lEUF5NSXdIWGpzPDxzCitrTFB2MDdpWCVkdXxBNy1hWiMpQjUpX3JMPGtoc0Ijd1Z+T0QqZ0ApWDJBMzUoOSk8bWlNYj13NG0xV09pQlYobTtJMGwtdlRaUlplI1FvCit2Y2EqQjcrZilSPiVLKFFJZVg+e0llbW5XQC1KMmg2YjIwXm1gbFF7Yjx1WTBxWU4zbl45e3ooSkxkWUhkSHB8dStKaj03cSNpZT1waHgxCitYO0xobHFEKSE4UGBhYSN4LW5KJTswQ3ZWakBSQm04dnM8cUNJVGdHQU9kUlNGKkphVVUzUn41emUoSjRFc0VjPC1PJWN7YilCS3JWKyFMCitjM1VBSUpFfD1wJCZ1T0ple2s3eGEtQGlTYXxKb3lCRmdTPFclJmhmJkZCeHh7QCghYyNEUWkldlkwNW5vPj1rPHAwSFdCYkYkJmJGPHxECit8MmZpZDJBS1ZzWChpIVRBfnxQaHBwMlpjaHdsYE88XikpbDJRIStwVHx+K0VTQF9uKEUpbyl3c2FONDJBQSlAdmtDbko0RnZqcSZTc3xBCitPaE5uNTI+anB3WEJaQXk+KHJUe144NE84VGVyMSM2ZFR4R0ApR2M4UHlXKj1MME1HVG9pb3tGPzs9Sm9sJFclIzVAY0NBQEswbFZaaT96CiszV1l2JG5RUWd3Z0I9SFVYWGozPn5lPHExdzNfRzR9Q0A+KFhUSUpeUChyP1d3cH5RaTQkYUw7Pj1LJUw5KGtGdm0kUTRDcmlwYFFabGdvCiswSzZgenZ6OG96P1p6K25TVEhNdFIrSlFSZjVWeHArUUJqbnJjd2lNX1VFO21Lbl5jcFp8ZmMxczw7IUU+QHtWNExfOyMqcVBJbkF6OWh9CitJVXR2NzlpdHJyPkQxVXFmM0YtPXhASG1mKW9+JjlpN2UhKnhOe2Mqek5RS2x1NDx4VnVsJWpoK1NtTn0jc29he244Yz1tRTMrVDltU2E0Cit+fiFRP1dSSURxOzR9KD1AI0xxKzdMcmsqRjxgczF+IytXc00jQmJ0KjQhcEB4I0NsTTJiam5LcV9jQ1ZQP0duTEhBc28/JnpedUJ7eWklCityTj9mT0dKfFZxKio8Jn1ld09oTVZlfiRIbD0rMWBrWX5rKiUkJEVHeH0kfD4xJG01JjxoQTM9YDxhXy0tVTlzaCF7T2ojWih7aTQ9JFV4CisjeGNxeiR3X05lSD9uO0lYY1N9ZjVURGZGeCohODZkWlloVVZkUkNTZmAlQ1k9Nn56dlVxLVJRbkJ2WU5AVXJvZlpyS1gmVipiXmN0dkN6CitgNU9wS0J2TX48e2s4RVBhYUE2fHlSPHwkJXEldlFPPWZ2VyZ0Yld7YjVPazMtPlR1TFpGcUM+a3A0eXs3ZDZjSlFgSDdLIT95RntSRlhKCis4dX1SaXFZKmcoRkFLYnFUYU16NClmJiZjT0M/cEcqbC09T1hvNmpSTGsjQ18pKWcxUSUqVG1YS35jT2dfYzhtYFpKKUpuQCk1Z0l9UUlOCitmfUwte00tWDIhP1Q7cT5vYHtESWF+P2NENTRCUG5XeGNpJW14VihiKTV0N1RZMj0manBydHZOMF5qSk44c35odjUwQiYhJXhVenk1Ty1ECitEdyVmaHQ3NEpwZERKWC1CSm9ydFlwLX1kMkp8MHFwN2tocjNfTnBSMlVOUkVSeHhKTFQqcEAhM2c/O3NtPEVSRjUhWHBeRGNvcHc4RylXCis5WXBIM1p2JXE9NTEmVEdHbUZ3dVhoWUo/fDZPVmVaO3Y5UkpmVElVcjYwdXA3O3lwQ19SXjkyczZFK2tDNEFtS01jZDxjUChHZTQkMUVICistNjQ4b35TYn0tZyNIKkZDTUpGN0whIWFRNSYzQSgxeHJYU0tXUng9PFltTlVfWWY4em0pXmRfaX1RajxzPGptcylRYXtsVipsOU97c1F3CishKCRzX087ay13VUVoemE2LTMmXmM5SSNkQ3l9eEl1dW1jX0o8VDdgbFk7S1R1JENVZnkjM2lnQkI8VVNATUxQfEpuVTJ8ZXtGRHcoQWhiCitRc3xUNz4hNilnZyFJUldhLUh2RiM1YHFxZVd7SSp6KUUpTXc2XjN5aXpyYjc/UHBNeW9FX2Neekt9bXI8bH1NNjtDLSVITCFCKWpJM0xMCitGKkBNRWctMCtVWU9wYE5gO20hU0gweHt6eURhV3FebFghaTJPZXREX0tmdUN7bFZ9Vjc+I34hdTsxeDk5OWIwVEl3bGxAO3pAZGwpcTdGCitDaiM+P3k4VFJ7dylBe3R8XnQ1M14mSHdNREh8QD1sSFR1Xk9uakgoKU9qKEFOJHNMMnIhNG00PTQkYFc/eT9wQnRiZyFVMSM1N1p5UT5eCisxenZQan1OQ2NuMEVZMnZsSiM+SSlzSjYlQjd5Z0QkdWpBeCVIISRMfXdVbjdWLSVLPGg8P00mVWZQQExRU018ME1PLSNUKFh0azErendKCitBO0ZreWAldEVlY2hLPl97MHBzZEV9aHg8VjQyUEtkamdxRUk7WVh0MFZtXzh2Y2VIMj9oa1RGIWQ/SHI0c0t7ZEdyPHI7bWdPdVpzcDApCisraEtLbihjVWQoK089U1JOOH4oNU5tbC1EZSFrcVN8TzQ4andffjt3WHJxYDVlUElEdzN8M2lyMCQ8UVBHa1pKPFdgfjFvZCgmRSlKfXRJCitpcXV6YVpaSyUhVCpjNzR4Z0w5LUJGcGJDYkc+VE1AWTFyPEZ+ezc/UmZ6dkNGU1lgUzM8YTUjKlZzPnlWV1crazluaXAhLWYkV3pRQyoqCitPUFpSTmk3KTA1flNnNW41Jj8hQlMrMjJ7KXtzSTtTLVF6bFdAbHNxflR5fFZ1e09gZDwrWkdqSjVud2tSVmZFXnkjaXskRWxCckNmd3g5Cit2djZKVXkocHYkbFJIV3VGJioqaWZXYH4+cTAqUER7M2JGUlNtU2ktY3ooPCU3Ulohbz43MiMheipsVmJeYEMhKitDVF9PeVojNz1XVmVgCit3NHQzI3c8UzVmJXhRVn1+eEFJKmJWPjA+OCVvKGF7KjRUIUJKV1JlKWBrRVpuOThGd0c0ZmMkdFJOcTc4O21SJkBAKygwKX5OZXNzaTZ0CittNTt5MWpZJkBuQHdObj1oOVVhdHNGbzM1ZXxqTzNJO25gOz5NU09pTituU0d2Y2opOFQ5Tyo7SztrSnNuMXF4V0BIe0NMST8xRDYpbHN3CitOKEgxQERnSj91Wm9uaFQ8c3VSPnN3PDE1R2kyMHNUX051X3BtdjB8K1lJcXt1XkYmVXQ7MSVtMSZKXmozYnNsITtwUjg4d2I7Tlo8eiRJCittZTRnJColVGliP1htMkt+SmgtdiZxfl9YOzs3QTFSI1F+I3g4cH55TmpvVGJDTjckMzJMLVlaejxLK19uVFdwfH00TF9OP3pEeikkIU5HCit+VTI5K1lpcXE7YlNrXil8VS0kfGZnSUJaR0hpSE4rPktLUVNyLXNCSCZVWjROQCl3aCNCb2Q1Q3N7ZnxBb0JFQ2kheT0rJHZDNE9qWFJ3CislMW8mIztXUTYoaC1rTn4tRktoLU9zfCZLKT1yQjUzejlxTkJOWjV3Ylk8QEFvZCMtJnY1JmlOKmdKYTl8Pi1VcV5UK2k+I1FLNVc8bk1HCis8KGEhdG1jJFFeSnx9N2lxbmN8X0k7Rjc+P19jPFd1b3Aqc1o4fXN0cmJoNiY9dTM7NnIme3UlR0Y9YlUyZCplbEFfVUBfeFVYWWhpRzwqCis8RSU2UWNEKSRleVQ7ckU5SWQwbDxObzYjOXpjPHZSMVNsM3YrbmNeVnQ1eWMrWUEmPmNAMFhsZnxZV1VaMz9tLXUkPSR7Yng3K3IxIzAwCitSZHxtOGRLK35YOVFjNHRVVWokMmFxQk9uUGZHYUF6KDU4ayFVKjYlb29SZytYPy1hS3F6PE8hUj9XcTRgQFpeWG9PJVIoVCY5Zk5vem58CitHWV9tfUVaVzNBd0wyWUVjLSVwflQ0QUtlc1MyVns5QmxQK3N9cHxmc0JNPkxIPFkxPEJPOGxsV3I+Pl5IUzx5T2JtVnM9eFM0MUNGe2lUCit3RCYlNkxwdG9eT0g/WEtvMSNULXwxdU5+O0pxWkYtQlNJZlVvdFdxOCZgUFB0SFVlJTREUVMpMWkrOzgzYll5RGpQOURJYF4qZXxVTTk7CiskIVYtalZmfUY+elIoNCFAUD5Id0Mrdn5gaVdRdiVAOEAzPXJWNyh4M3s+Ulg3I2JPbXQ8T2hEdXxLMlJgNXZCPzU0SGMrWTxsQW1INTViCitrJElKTztmVVlPUCNPfnl2P30+UjdqKlViWkx8YXprRz8lJUtkUDhJVHtZNGRzfWc/VEwjTDViKndFMWRQPjtgNHpOaVdjdDJwOV5LcDNzCisxbzRSeVREa3ZOb3dkdGFsSnRldT8hSXlXP0l9Yj4wN3U1P3xJbUdBVWxiPH5pakZfX255N0lOTGNeRl81WmBWfkNHMEBOVXFyNXszWGo2CitzMTtjKjdxZGU3OWBWa29RMHlFU3tsKFhyTXdzaVpkOSVjIWBscT5EZWNGWE5sR1VFZF8mcDJVUi13WE5DQjFCVWxuNzl9KDhZQTZxV28yCitgY1NnQEAwdkRqTFkzZiZwdlVPU0krcGsxY29+WFZMNjM9MkA2dWlNOWR4cWVwWDEtQVBSbTtiMXFzaUZERDREKn1nbGY1YWdua1g0bDxoCitFe0Q7UH5ISTU7Km9PKzMqd351NXxBcnc1SjAzcjAyfmFsRGpVZGJ4anhXTGpwVGclQWtke3VGIVZBVSV1Jk9TUjJqWT40KXRISkEpMmFECisrUko2czwjOD56cF9+IzZpJSZOQmdibGl5cmVufX14KzVRTElVaX16K2MmbldNRk1paTtPRmE9KElkK0t6Z3dAczNQSHpLWUJIcj9zQmdJCitiVjNNa0hzS18oMCNHcFh8T304ckY+S3UmODRUclV9ZWwqUldFZFpsfHhANTRGdTA2UWluS0Rub1laMWdBanl0UD8mUjZUfmBiaklnKCt9CitZNm54QylGQG9tblhvNS0hMGJiaEZJaj1jPT1Gbzk2WndDZ3VwIzRsPUZxOGN5azNOYE5kZWZOfT15VHRuNHI3TSFOM1pZZ35HMGhvdnV8CitvO0FAVEp4OSZjcDZpeEJIOGdSK2p6VVhXMjNoKCR9Z1NoeXhaYXVjTzw3RXBZVHVOZjUmVFIofURfVU1rcEV7QkdSNGAhcTleTTdLVlZxCitiMEBubE0tQ0xsc0JiKDV+SCEqJSpfc3N4JTAjfl95PUFZcW03IXVkMTJ9Znk3fS07ejFzUWZxQXtCMnordUt9I1lrZGc5MWwqIXp+RmN4CitTa20lVklAfXpNZl4kPXFzXnJ9LTVmI3YqdiZ+KFktPGteZTNEM3JhSHkqQntzfDZlNWVzKk8tbH4+MXxXO1k1Qm0zOVNtUUw1JERZRlAmCitTQ1ZXeytsZD4xP1k2YmFNP0U+T3loWVoqe2RFTiY1OXxFbDdvdmo7cHV5M2phQ2ZqSHZDdDNLeCNLVWR3LTxfUFRuKGl0TmNJemI/MERhCituWnVUOXkrT0Y5WCtDSWk/dFo1Nyt2a2BrKElzQT5kdllEdVlEUmE1Q15XbjlHYV9uKz8rVnU7I24oeEklbGgwQ3dlaDBJV21FbzZ0KWB3CitpVWJSUHBMNG9XdHlhSUxvNjllZjBSR2ImKjszWlAtNncke1gocj1MfURRYDEkcTFAWmteR0QkNTA4VXJ9T0RyfTFUVW0xRy1PWGw4ajw2CitjKG5XNjF3V0Z4aUF8eTBnYGx7VHFTY3ZrUn1ZdTBPVWdgTmZmJTklQFRlJUM4JmBNP3cyZC1PTCpIPGElUEhOKTh4cDJBR09AZjxMYWdECitoal43OyNVYGtpJGV8IzNzaHJXQlpYPnwoN05OMWR0S0ltKWBVOVRqbExxY0lvSChnNlNiU0pmZF9aXzVLSn1qNEVnfU5XcS1YRHxaVzFFCitoM09KUmEzI0tBSSFOUXs+Z28zR3tiYUZJJlplOCpnN1o0aT0ldCo4aiVmSjx4U3ohPHFALTktVnJSPDkpVHptK3twRVdOJmc1dS1tI1pSCitEa0BFVTViKkswPU5xfkd0S28qbz9eVFZ2IVdGd2tye1ozTGFgWkwqdT5XOyZObEUzVEdgWGYyYHl6I08pU3RkZXc3MnEmJlMzQnRhSk49Citfa0tLakVuN2JWWSZSV309aHFmTEc0czF8NXRsMloyKyY3b0ktaDJCXilkUFYkOVM2Qy1XUXhRczEtOFZfbUZ3MW9xa0IyY25yT0lzZ31jCismTkxBYn5OSGFWPiFyVGc/TiFLXklYU2hrXyY8UjBoNFV1RSohY2MzeXhIZGd8VlIjJld6dyYjTkNhP18kWiFuPVFGZlRHfTk7a2oyR0FfCitvOXNHbihMenBkb2R8JEMpd3pZI1c/NTQtQjhPSFRhMmVpS2FQUEJJN0EmV3J7WV51dCNRP2ZLbHBlTUtES0g9KklNUEhoUGBoK35BVWFoCis0X00peGNfXyU+JntEQCVrKEVDQzJHWUR7bEFHKVhKSDhRTWpXS2gke3UoQTwlRk9RIUNvWlF6ank4dTxmODtGI3dtQiVlZzd9e0xXUllrCitnKj1vQE5yMzRtVmdmcTVzP2teQGVIT04wc0EzQjYra0Q7UTFnITFhYVRyJlNEMmFnckI5YGo0PmJrRS1HNC1BfGlLQk9HeFlENjxuaDRBCitBMzhxaz1ONkQ/VHVhYD5+UWMkQGE2el48RmFkPGYoakNaV0NnNGBMZnorZWElWiFhK3dFa2ZnZ0YpbVpmfUluSVdQSGAwNyk5M1hDSDw9CisobTxFezluVnZifEdqMzg7clE8aU4tTD1wLV5kV2lpIXJkMlkmSHomJWhqeUN7dmczO0RgZEEmaTB0UmQzem5EZGU9Zj1sRHlOM0I7Q2NPCitkJEA1X0IrJF9+Q0FnK0o+YHpxMSl9TnNHRTBPVm1mQiF4SHoxN3QzdkNvX0Y2TGU/SilpcTEkQkBsd0Q/YE95YndreV8lIXRzZEAyUCkzCis/QX5hS0FZRndPRi1rV31rKlEpQz1ORX5WPXFgJkYkZntPQCM8X1BIcFJKeCtwUH1RPlBeaWBNUz9CQWhGJGlpOXVQNFFpT2JRVEpoWm1uCitrMyhXQ1RvdztzdTFmTzw4OWNvJmhnRHJBfU1KdUBuWG9NKiMqbVUjVzlxTjc/WEIhQ0shXj87K2ooPiN8cT5iWXItM190OTUqNHB3SiYpCitWKkQ0MHkyMz9gRzNAbk8pTiZiP1NBZjtvKH5GKVp1V2ptRTZsNiRQTF5zSDlxQ3EoIXRQfi1WUG4yPk10OHEqUntuTGVKOXo7TE5OJTA2Cis4WD1FdmA4WWpoRDM0anQtYk55MmZxITFgOXlkLVRJalRsaVI8O3pJMCUldGAxbkdwcGR0dWpPV31GITB8V2FTR0Q1PDhBWkNPakxeej5JCitRVEZmYGcoVj8rO3xlMmAkSkhxTyVUYlFHKlVQN1h6S1ZoS3tBX0Bpcj47ZlI/Rjw5Kns9SSgqTnlqKHV8SHlFVyZwMz1uQVk1eXBnezEwCiteNFZOPy1TKFZ3OU5pZypEP15UdHk2OWghUEpzdjhJZjg0REhPNW9kWWw3aHNMP3t0TUg4WDNfRUlAOXxIZnxPPlArfVZgWi1LUm9QYEx7CitCb21CUXQ9Rk9vM3AhdlBXVChtfDVxQmlCNGR0IUpWb2wyT0IjVWwyeGE7bmRnVEx1JDR4R1hBaG94RDNDZUdMTVN7LTdAJnp4bkxxWkpPCitSYGlJYzxxUnNRfUF2N2JeczYlbXM7IyNfVXlhZSo3MUE0Xi1KVE4yWWQlYzhXNDdea207Ki1nYiVneSY1bys0fTZBemBmSSZPO1AzOWZgCis9TGZqMW8pRjBGa0c8Y0VnOUBTO1JNUWA5SjxfcTJ5cU1YRHswRmFDV3kqbWFySzFQOz9CRUBjPyZEaXNmPDFhPGBlJl8xfXt3S2h0LUJrCitDP0NzSS1aMTIkVUY/TytRQmApNzhTXnBwVCZneUx5dWBXVmZCNn4rJmQ4dWkzJFFpZWFre2Q4JGVqa0F2UygmYjU1cT91VkxtK3M0V0M4CisoYFk2P3MhZyRJMDI0azhCZSNPdkxmaFNKbTYoZnA4VXY1X3hrNU56QkE8aUcrKEB7Kl4/MiNDb2JidXArY3xte0E7IVp7U2JPO1FlT0t5Cit+czd7alBHT0djek9uYV8rSTR8T2llYWd8TlgwV01CaWIwSTdPbEpxayotTTY2S2A8Qjhlc0Z6eDBJSSU1QmM1UGBtODNCOV8zbzUzIUFmCitSSUo7VnVhNVM/QT5zMTY8aWpDVnNmMzdnaCNHRXpDZk5VV3c8aXhlfVdQZm5EKk9nUyNAcV9TQUY7KSNYdCZMMTlmZz92ZldNeTNaNGNKCitUZTF+PTE+VFdzWmZMUVE/Plkhe31hcmRyJmA7QTh8P0lPdXMqKHA+OU8tKCt+Y3RyTHwxY3xrTXo0ZSZhR0FFZTRJdHsrJXNwNSpHWEMjCitZclR9cFd6c0d0KTx4R2psU31SJG1QeXdqPnRwUERFYGN1fVhiQl87djlFOXFiWSojSGBiRzd0UkpIekF1VGs1VlBKY3pSYnFUNCEqZ1hQCitFRU0hMn5nQ1FHMCR2X154dyN+ZTJSfUlxfno1YGAqU2VAWVY4eH1+RkdOREkhYk19ZG5CYHgoIWItcjl1T2pkfVFqbXUjT0RsUlRjOEN6CiswR2N4ZFgxSUtQVmRUQ1ZFampoKEg9NEBeVjBnejRMNV8pMmJvYzRRRnI/eTJNRiQyZXZgeW5XNHYkSXApMHU9azlaNU81Py13JSg0UWQhCitgNzJpTmF5MCFLJndOKGQ3eH1GRXwwV2VIaiV8Uz8yUGp3ZER3fDY/ayQ1SzVuZipaZT0pbUgrKjE8Tnd2VyFTWER9UVJxcDdedng8VDJZCishbEEqZ2tka3RgSW5TfU5CRUxGJkxGTjYodXR4IzYxNVFYakhAa1lUUCtOYzAmVT9lUXlRMGRORmBtQlVsczQ2Nnp9QiZEYyp+SlUmUlpxCitDdnRJVXpNSyRFZzYla2VeWnU8YFVHQmVAVXwlc29KKFhDZSZoVSM+ajJgZm09fWpFdWBpPXtVQkR2Yy1CQ0ZNajcxWk8/MW9xNilAe2EyCis/NTshQ1JfWk9AcGo0eVRLVm11bD9BS1ghOXg/PypeTztAYXcrZDVDS3FCNT0obm0jR3VRQXtMUzNiQmQkP2x0NUc1fXhlfk1ybX1JdGdsCis5ZzFvOWQhNUEqbVVERzwjQ2tOQ3V8V0FFMkgzU1JiWEg+cnpTYnQxbzVYNDVUZFN9WEMqYmVZVF5QfmhtfmVfXjRrSlV9aDY4aTgkNmgzCitlYVVhdlBRSUJxRS1QZjx6NVVDTEE+fEN2eHNBVnV0Vml2XlR0Pz9wYU9scTw9PXVUNjM5WT51RUllWmJla2ZHaCh1aV5PRXlER3wjOG1SCitJdFopd1dnfVEtRTY2LT0zcWhtYj0ybkpERmdsaXpaV05YSHMlQjNtKk5jeF5rWEVYMHx0WDZrYl9aJj91WU9vaztGVkFBfVcyIWRMUEM+CitleFNjTkNgan5gSWAoSEhgcj80U2BEcHw1WlloQk5oZmhJU181V35nOX1tVUR3aEswQmlBfD00bWolKjhfVl9WeV9TZXozWntHZCF7aHVfCit7cnZvUjU0K3JNaUtrKjVLdmZiKHJoUjM2KTw3WCQmV2VVZHVONH11d0hAPj1CKGo1fFV1X0lPM1piZ3J1cWtfQl5vMjVEXjZed0NNRUNSCitSYEd8V34lSyVjdE0kcjFpQmdnLV9uXyh2Yzk3e1lnaD1rVlFOMjtjUVQzWkAqJChLRGw/ZzZhM19FZUIjTnFET3lgR1l9Wj40M0E8Rz9fCitHaC0kZ3d0e3pibXhyZzM+aVUpckE+bV53YzxMMUVfQ3w5REl0Xkoqa2NXWW07QXVROUo1amBvbVhJcyh8eEAkYj1TMDFWfFg9N3E8MUZqCitOeXAyTUpYQm5BJl9uSE90ISljN1U1QCtKWVl4M2N8SE1WJHhSS1h7P0teTzhGQjhNPXhvTzxDOzw+dk14Y3omK2hPIUo7YFghcztiPyFTCisrQV57JnN+aHZEWiV9ZVZ0SSRgVFVAcE1udGlrbCtxKCZNI1JOTXxaZ2RiQzdwXzI3YElRPSpIejdTVzsqOWZDZEdma3JsQ0xWWmVtYWxeCitLSl5iTm4pTDJ2X2tBfUVSez8wPiErPHt3Uk08bk8tNDF2YFRmNyhSa09SZkJISn0xUjkyY3B8NWZaVEFzKzc5Yzk9eWdeeWR1RntsPDNVCitTdVk4cWtHSXB5KmQ+STFZU28rdmN1cThhKSRrcVo1fk88fnA+TDZxdGxmQndBPFBPN0lnNHhZfk8tM0F+fElIail5dCoqQFE8M0RWM1BUCityZV4xPTc5YHlCPDFnNjYwZVlJbmc2ZE0yTz88Tj5veD4ocURQclFzN2RJPXVJR2M7V2dLOHleP25xZDRQVHp2dns+R1pfU2lRd0ZVfWwmCis9WWcqUj9vaGdqNWljeyRxcSlYTSRPdmFlPFBzekBrTUloNCZGUC1AcGctY1FkKSY8VmNJZyVBcTQyZ1JsTSt6Q3wxIyQmeFNSXnhBT0o5CitFMUs/amZaaVVPQ1hPekEqfDJrdWpOWWBObiRxWmNLeTF3IXA5Yl8tZTxyLTwoN0IpP2JNVnF2dSZKa2w/bkoyN2RffiQtZXRBbG1GPUQ2Cis1NnlVQXpxVytIRm14PjVpZWRHdDx6Y3FTRD4tfnAqNDtST2VfMHZGaUVpaFA/M1psWWBoT0l8NF9SWDsyLXctOTZvXjdOPCk1ezB9MyY5CitpYXFGKzZ1JUxEQz5meEZHflpLdWdVcWEyXjtEbVJObyZ0O0ptdV5LTnNIMTRGc3tBcmMlJntkUnpuSXsrTVZDeDR6eFo+NCFvI1ZedlgzCitYeCF7SnBQT0YzdDF8M1QkaEB4MTdzOV5HZyVsSn1IVD8qbihhPGthJWFuRVFmcmlZdXJpN1V0cXZmYXJwdWdjO2s3e3EhNHJMQnw4cXY7CitaK0dGVk8pLWxRRiVCKSRYTiF3RGB5ZCRaK3J6XjNMWDlTV3FnNmJGPEZuMzs8KE5QUjNiXmsta0ApaWYwZj0hISQtLVV1c2FtXihJcX0qCitgKj8rfkpVbTlSVUZYPUpsd2QkK1d3YlFHK0hxXmNeR3hSJSZLI2w9LSRYUWZSTC1+RDJ2VCl4Kkx0QXoyPlgpOXxLSyhtPWR1S0RIVX4hCitjP2o/SzF1WG83KWVkdkcwTDtoQzM2JkA+djFLbFByanpxZzFNejgreiFFJEVkOWYhezA2QVo+U0wrfkEkMEQ3P3FpKzNEOFI1S1JmdlY3Cis9R3shKFl6MTJ+dEomIWZFT04hUEctS0FhfHsobWdXbi0xU3NyMjVkJTcoc3VKbFFjUjVVTXNBSn5VNVR7cylxdGwhWXozVCU5JWU/e3p8Citwakk/UUskZ2JFIVJUZWU/VFBtclhtTVN3VDxQe24ocUdzZCVtPGJmTHVtO0kwT21zd3w2XllISEAzZDJmU15xel8/WU1KMHN8OWE3PWg4CitvQEhkdHdrfWJlVE1+QHB8JlFTSjl4TTIzXjZua2ZxTFAqdjluN0l1N2NIeWZ1fUd+b2gjfFQ+SmE3cGpwR3spJldLKGRlfktrUmYwSEJRCiskbip+e2U1M1ZkM3AjcjZJOGBofSMwSSZ4XyVDWD1TIUpxLVg3UHBpPiozJkl1cUYhQ29nZ21vK3g5MDFqa2dkKHVNTl5gZyE7KXJKZHBOCitnS2ZnTERLfXZZd253djdya2V9dHJsck83NHluUXxCQTN0VHN5e0REYW9VXk84NU1HR0xQPU9EcHJ5IWIyNkpnV0JFWVgocGtSaTljVVduCitSP3pTV3xyU1M3Mi1SWGlrVTVmV3VvZ3hCMVFpKWdQMFY3e2pZUCgrRG5WTz5ST3ZmZUU1QEpQalBeK3F0UmRnYC08SCQxQDxPKHhmSV5hCis7OCZuWTFrUXgoWVBrOzMpYmdNUDh+PkhpWnN3IzFpRiZ4ejR9MForT3phbXlvfmw0YylHfVkzRCZZQGxIQWhJLVFFYXIqc0dVZn41VEljCitzTHZraGZrbE1Kbmd2Z2w/KWE+YXpQMU44OUF0RjFERUtrSGFvJDRsdlNtNzRne1Bwajh9UkN1PmdQRytTZCk9RUVkVHVwfiRCVTJqaEZ0Cit4UGVsO0dnO2FSNVghNGorayU3d0ZVKSh8KCN5S2doNEQjKThxN1p2RnlnZ2o4fSYjKTY3Z3BrSnB2V3teT2U3dlhYakJ6UmN+Wi1LRHt6CitjN1pIXlVLYVZuTz51KmhmMCUhLUg1JWIwSTNPMHItYERCZ3h1PHxyRUNMejhNRXcxVT0qVmhlN2U1VzhALVlNaihLNzJuYFFqJiZ6OWFtCitNdDkjVC1zSHNNfiFWSVcjWkVyUCFtSDUhSVd7KnVaXjhZS1o5SHUzS2JYdEJ6X2RjaX40Yn5VSUw0U2RDZXowKUwoXjRzOTtlfD9yNyFkCitKVCpAdEtsTTRFbHNsYEdzP00hdjAoSEVGTCN+JEk5T3MrNCgjNTRuRXlvUkd0fGJxNmwxeXA2YSV8cTVBS2hSI0dufW42KyZ3RCRGN2k3CitrN2VeNld2aSlkdylSKiRCSkF5Jkc+bG1ZfHVRI3hLZyFMRC1DcSg3bmN0NV5jZ3dhK2E7cWVCcFEtMm5vfTZvKXcyMk9AO1lQJi0wfF5vCit8Qmt2TFgqRSFkdVBPXnIpNiFDU0s3NGpwREY4Smhyb35gdlJMJigxcnxKMzF5K05iNUtxfW1eSG5+bkF4NjwqXmpDT2shanJwI1l5eVJzCitnclJYS3RzfVEpJVg+UzB7OGk3bD9wKU9LWiFwXjw8ZlQ8Izg2JWxoIzdnU3pgWld7VFd6fTw9QElkRGpaNUEyJT5xTiVWb3JVSVNab0tmCiteNUpYR1M0KzljK0ktPmRRfXtOK15lVVQ2JUI2a1FWcXgwTTE3bFdmaVJvaHRSalE+WlAmXitCY2UrKW8lNGw5eWN6TnEtbUZISXRoJHJGCitWSGxyfW58N0lAfj5yaV9uYHB3SiNlOGk5IShzPnBnUXUlQnlKM1JZRmotcyVOP0wxdER2aip1MjNZb21FRV9zNStVcCl4IWFrUTU3MXpiCitae1chX0dGbWwtMzFlYlNoai1RYDBsO3UhWE5NPkFidlcjTnF6S1VndCY7eDdVR3JnQk9gbnMhNjh2YnBXO0Z3UyhKSDFoaj9ROUlITzAmCitkbSRsc2s1fCtAc3ZeYV5CPWo5O2d1UXleMndPRnFqYis2bkVSNj45I2VLJXxaIXZwMyZtUXlCVmtaKypxaFFPdUp6P1BCQFZGeHk4Yjw4Cis4MFdlMz47RC1mLUdiZD5gOD5yZ25HdEBAPkAxOEJRcFUjbD4kd213aUYtIVRCOGRfLVUtSkc4T3Q8cChiU0ZtUXI7SXs2O24qLUp0NGBsCismQTUzdjJjdEA0OGQ7Tk9vVTExUjZ7UFVaNHlodGMwREk5O01qayhAKnp2Zz00cjtlXngrZEFlJCQxVXhhSTlmZ0NmcmdMJTFKX3lLekxaCit1Q2RBbmN3WXZiNX11MlN5Zi01fVJObnNgcE9XZWg+Yy1WYWp6O0ZVYER5ekooXlBhSy1HaFJgUnc1YGxyfEhRI08zMl5UaEdMMmtiUlQ4CitaNmVQaCghYElLSFkzIU55fmg2S0psZnc8fEFaVGBmVkV4PHgkflkkdkx3KT1YOyFsRjUzYH1RI31DMHtmez0taHU9dUBBS2p3ezg+WEA1CitNPkZITXE4eVl3Oyk0JlIrJW9qRzB2TEZTdGNJcj1SXkE2P3gzZUZVUmtEb288KmhzU2pEdzJHVXlodS17K2cxWVhoODt4JTtxcHdfWGZFCis0ITJ6WCE+RHcrX0w8d0VmRVpyakB1dU5DNXgpRWxgUkM+ZUwzR3wqY0U7Zk1ieFNQYXlfVT9pS1UlZnF0bnQoMGtod0p6JUV4bS1iQ31WCit5P2RMJj1oa09CNyZeMmskOW8jK2djREcofG54UWtDWlZ3ZHpJPTBAKUcwKUhqNm5qI0UobDRkRXJpcH5+PEltNUhWWCV0OGcoNFJheT4yCitPI1REQGxNekpIKUpwbWBBcDYtUHF1aXlTJWcpNDMtQ3grfGBrOV9OTTk7Y1A+bllTI1MyPD9WO1N1S3pvUnlmX14lYUFUSzIzRjZJNiRxCitScH10QlMtPGIhVlkpUz1VISl1SzEhKCV4QHcjJEl1c2ZtRGVBQ19KWEYtKkcmQCFkbTtaYlJpelhkRWI2IXB6am12fFM2ITRVNTBNWiliCitGNjBpR2NOfVBuaEg9fj1nKDc1S0hncSp9dnhaJjFyNXQ4bCV5Ym5oMTUydU9sTV9mfGFvOElEXjFAIzdmSEhKSz1ePkY/JVhEb05qT1hXCis5TXxPO1JIeD08OUVCYSRNYXNYIUlXKStgRzBVWEozcC1iPXFeenBtTCVeQyY0QERffFpRMnNFbVFeY3c7Pmk+cHM1TzZTVmFjP05DQkI5CismWjc5bmd0WStrdFU0a1BEWHsxQUhDMWYpI31TSmUxVDtBekhoJmN2XzJeYiRFZyEmaGc1NEA9O2FOZzQqZGgpZGllQEVjLW97cVRAQWwmCit8YmomQ2E2czZMfDJePmY2dElDTkhpXmdedVFUaUVsUUxXOWA4QFlPbnB+aEA3UmdWaCRhNVRGcDskWDhFSk1lVTlDQWw5LSVeRyM2bnwrCis/MWMtezBZcXpvR09qQUhFX2w1dUc2SyNBbENGX20tJGlrMiYkQipJfVRAWj97OG12SkBqNzdSKHQkSGdFOHs9eldARjQ0en1EbE4yPFpHCitsVXE2TXVKLSVBQGQmcEFNfXZMXlQySl5ZYFppS3dTXj07SDt+cVFHZG83T3tvJEt1V3AoQXRPRyNFZEotR3xee0VGRHwjJGt3WWllOHg5CitLTTw9UnxtamQ4YzhWKk9JbDB5SVk1LVR3MFNQOChZLVBhOXYhekJne2lrTiY/bTJwSDtScVBxOzFqZkE3dSkzNnBCbFBLUXgtRXFVJi0lCitffGNzMWAmKUQjK3dQcXVSWntHPk0hckptTjdkT0dOI21ld3twPj5uZmhnWDFtNU10IVhTUmJ9amUyWSkkYGlpK0U7VUtXJDVXQGFtKlA5CitPPXh2RHtMPnUqI2x3MWZ0SUhkQVF0fFo0UXtreEVmNGlkPFFVekBmUUctODFwWWVzMVJjaDcyOzJDe14kRVE/PGNSbmBeJnJjUTFWMjV5Cis5Rm9XKSRkPmI7bXpBPEkpbjhAIzVQMGQ0NUM0YURkRTkwT2dISzUoZzBAfGU/ZjREVSpRen4rclROQDJsYz1MMHZKb3ZeNnYlJnp7NSZvCitiIUMyc3RJdClKe3VRKypQYj1VWkJ2czh5c2lTSzV6VmJpKmQ5TTcrSjZIQkt0PCNuajllYjVwLUtKTkszVmhOR0paNW1saGhYV0pfJlFTCitpbkEwPEVWb1gqXkkrMllXeUwoQS0pI2A7JnRtQCh+WnxjIXBhSUE5M158Z0NWTCNhX0NHM2hzJWQyaTJjLX5XPGxRczVlVlNkX1E7MF8wCitgXl5QbnNEQEVGfChXeFJ9VUI1XjB1eF5CX3hRSWRQYmpqJGsmM2hwR3RtMH47UzBWSTBzWT5pNj8lcGx2WWg7IyhFZHFFdDdJJnN1dDhKCitQN3NIXz5fPnIqcWlNLXEyeGlUZTFHfkJeISkhQyo4ayEzIWYmSFJiOFZ9alRWQWR3Kj01TWgyJHl1O1k4YDtiNTlwKGNeMyZTUjA+ZjtWCisofCN9cmpVIXZ7Xnt3eXk0NU8+VlltfXlQeSUoRmk9WXBYO3xFeERCIVoyYT5XP21tUD03TCRtT3R9XjRKeExAT1FVTS1VM2khZ3FRfnc8CitffjA4NTIxRFJ0LUVYNCZBdF8qKzh8OEI7SVQlZDNlRnpoOWskYCpISXo0VWlxYV80aTcxeEtTOzR7Vz9ZN1l4TldpZH0/Yld+NSo8MEY9CitEPSk0Sn44dU12NWc/ZztgbHpgZ0liJCRFLSlNZyZ2ZkxzdGRVajJlJm0tcjd5SyhgR15gfCUyNFlXYSohSzg3UXN5M3RDfGRmbWEtQXlxCit7TFJnX1MkangpLSNZLW9gQTVaMShLREBNe1NZe0BZKDJidkA/eGxDai15TVBTSSNGYmI2VkNESyY5R3B6RXROM1VkRkVhNTJxfTR9Qlk/CisoRDhNejYwTz1+RyZaUj5OVkN1YzxEdzRWXkNgNE8rYG4wZD5JLVh6OT47bWY8JFZSXzJ+PnhsazVvTSZwNEooN2BpWCU/d0AtKmBRa0VgCitUPm5vdHNiNSt7fCNTeF9aU0w8SEJlfk54NTgrX2BwKSteVEFOXllBcWdBPyh6NWBUaFd5a2htQiNXeHZIJCVQOUtAZUMzNno3cypVVHwqCitSa1h4ZC17b2FpK3ZXR3RJRGVyJnBaPHNMXlhjaC0xUWJLcXVpJCFjJGw3WThwUXNLNyZUfnZjRkc4bmZxV2NQVERibVhZJEg4OWZFUD1ZCit0KkxTPWY+Y1N4NEZvZlBYeyFaUio+I0VxVG4wUkg5WXlYUF82T2x+bHthclVWUXE1REN5IWQpZVFEVE9PXm1WKGlnRClsMDYxWnB4d2JUCisod0JzbHBVVipJeyo8Zk9OSHp5TXlpWVgqUXJ2LXBsSGlYTEFtZW57ejh4TjJMPyVZKWc2Rkp2MVlaZ01+MSNIS1l0PnEqc2AoNjYtI3tUCitkTG8xNmJVeXlCd3lBQ3ZLQkl0MjR5R0BXZSFyYWRkYnNiYCpCfCUwPVI/az9jdHpzMzhjdmNtZHtrVD1uYX1XY2IzSVpfPChLZ2MjIVYqCitrZkF+YnZ6elFWUmwqbjMtQnBvOUs1MTdYZz9vYm9aeXppQ0goSS1oO2RAaSNMSEN4REFvb35iUEVwdjk0RllnQ3ZxRz1nIWhvK2ZWa3VkCitlTWV7TDVsUm1DbHZQLUFwQXEqPjJkaG9ZeDhUcmVyTG98dSg2bkxxRHpNKWBpNDFDSG0lYjhnSC1rSWEqXlgqQXc0P2lpeU07eVp0dGtOCitoKSlAdXdgRyU1ekZaWiFCeEpeaTlabTwqOEtzVjlGQ2BhOSMjaG9ZUktNUH1SJmZDSkJ3N2g2Yz5WPTkzYFh4I2xTe3AzSkNuaXdOPE1sCitGeyQpMzw3cDlPIWNCdU9vRncqcHFQN3s/IUtAQXZtKmBZUkQ2d3tVLS1DKjtrXkNtP1QxSFVzWFlVWnhPOEEtK2hgUjNeY2Nhe3J7PkE/CitJZU4qdnV9KUwmdXZiWkB4NFZDfSVMV3UtTnxUS0YweClMZ01iKUk/d1F1MiVuciUxYWs/fVY/SiE/aEdgcXZIXzhJe1dORUlrdkBQWVdaCitjaXB+Q3stYjMhTl5TSio9RCtvRFRGaFR1V3VTfWc/blpBOEcmQkp4NzRxek82d31fTjJOWlo0I1okV0BmRzI/P2R2Rmg1fi0zd0BWYCkjCitQYiY2cjBuVTsyc3U7P1RyRXVwV09MWnxrUkppSCopdVFwWT5qN0B+IT51OUZTMjZlQXhhdSRHb1d+Xnw3JXJqOzgwZDxEY0Rgdj1SZCZ8Cis8Jlc7IWRQb25BK3JjU1YrYkVlZX5jRWApPl5oKXRwVyFuYCFkSl5uQDZHXihNdEB4bFI5fjBrTjFyd0o7VF9SQEJqMEctcTdBV2xwJXpfCitXQyoyaj9UYDRIfnpYe2JSd2tuYHZTYGVSdCs5ZWJzd1YheWdHb0NvJHFleFprNkVSeHB1Y1koK1p5YDN2P0dNI00+X2h5YUxtb0o1cVg/Cit3I2ExMGdgNkk3R0k9TCtuTmgrQkNWaWtjZn5WMW9oQWN5fiY8ZHpPVGcoOWRYd35tdTA9RFJwckp8akRUXjQoeXNsSWQkVGZhVn5mKzt2CitkKEo2YHw8U1J0YS1Ld1FXSWNQdHc7VWlBKU55YEoxdFleXyg3NUl6ekJyKT1KVz5DYVAqUDxGYnh+WWNaJlRrSjAycCkqVD1tOElxSHEpCitwMj9aKVlJTihnV3FUI1k8K1U5aSgxM3c/YkY9MGI5cipMSnNlQ04waU1MWDdsemtfeWpmdDBQNHFRRmIkcUBXNTF5PDhIR0pRQDFLIyg8CiswaVo4MzBRMUBYUEgpNyZ8X3pQV1NKeVlASnlyfDVQY0YpY2xENkBoJWJAakpLYj9mQmNIWlF1a3ZJQGhOOFcwYWtyK0xLNiVlQWhhMVJ9CisoeHJAKHs1bTQ+dSYyZXtKWHJfYWFxPTJKYWZEUS0xWVI8ZkFKYX1IMTE8MiRKc3JQTzd1bU07dCF1YXQtaHhZRzZibWpHMyZ2Vn14MDtlCitEVj0kRGErVilFTDB2dHpXJiZlMT09VTR8KH1laU11dUlfWG5yKj5CO0c3dExoUzxEbSlySzlyZDQkJEQ7dShgb3BLc2hiSz9SJi09JkVQCitlI3c1NCNyUTlQbG5eQzxHeT5JK3ZLTEFZQ195bzREKGxjTykqXmpGMUhqYj88ajZ0bFlSdzF5JEFSeU15fHt7em9NVzFpaGtNJXtkOVo+Cited1h+bHBmV05EMkRpbyVzIX17MmBSb2hCUnB5QG9FY1BwVkBZI2V5SDR5KGp2QUlfLVlIPzclRGxBOXl6RjVOLW9wKFdVdFExMCNmWjRyCit8NVJpWjtnbSlQd1hvdnVsRX4yT3VZZVh6bGlGJEsxRWNgfl5ecCpvem87LVc1WFczc3NSZ0QqdTxANCUrdDl7flZnM3x7YitAIzQqOHd8CitBMDN9aU9yV3tTcEQ2JUNJRCZ5UFJEYTJgSiRAUH1vYGNOfG17ViQodFcxJWV+KmBvUXomMCFSTVk/dmpAR3hKJngkPik3aEUlaj8rTVomCitKeEx6WU5VZDltVVc5OENyXkFQenxlaEhKWXEyM3FQYTtNITwjdVUza0ghZUxyNyNrc1JKKGs1WDZpPzc5fUFSeitoSiRKUT1TYjtNSG5yCitnJE9ZY3UzaU17Qmw3QlAtTjtJXz1vVGspRDtEfnJjZm97NXxKNlJrY1FENkpYcCElKWlqPUN7Rk43bHd6ZmFjQ0ZgUGkraGp5d3QzTypOCitnam9keWFDPTFKdkRNOFlHUzZiWilkdH40eCE3R3JrXyRPclpDUSs7Mzg1b3NRSzQ9Qj1ARSN2bmYjeFJoNVdIJUEzbHg4emB8ez9YcFRvCis2ZG9YO29MOV8wRWctNVYqMiNlJlYlb2Y+Wk9HSn1ZYnpFajZKKSNaZyQkUFcqcDxBMT5lTVJLVzlAYkQkRD1ANT5fen5lWWJ0YHZ1MTItCis1OV5+ZXFIRzs9SV5DO2c1KWdOJmYwMXhxZjJPa1d6N1QoKX5oU2FOd1BeM2JzNFRZNlo1TzFgQnRVcHAjIUxzMlUhe0s3JVc+cWc1T3M9CitMYyM3ZGNkblEyQFZ1SD5ueFpgSWlZdlpqOTVma21VY0NrbVNZKXt8WlRObGxje3J5YyZ7UjlnSi1halE8S3JaWHU0PEdXMnNubDI/cD5aCis0NHo4akchNTI+N2BCTTQjQTRoVzxTYEJCdytkM0hvKkckbyZmN0lFc3U4bVBPUGpKUmVmeHBBTEYrMFhuPTR8VFJfIUFodEY4SzU/TmhXCitJNllsIzJVVn0yem8tSU0qWDAtUklvPGs0elhFVV9gdEU9IUpxWUJ3V04rSWglN3Q4KUVMUGBVJFJuVDZrYjl2T2lTZmlCWFZ6a19DVEptCistLWpOcyQ1MUwoJUExS3l8MldHQipyaHI3JUFONXRlT1otaD4rUSlSQSl4dHR8c0F5I0xVOXIkemJ+R3xOXnk1SlJ3VXJmVmwreiokZjV3Cit+XipAVm4jM0chRSsoLUpJaDNydHsoPmhMWkJucSNjTCVpXkB5PGw+bUBJXzhpTWJRO0VHPW45Xm41SUJnfUs7QCMjZTRFSDIqS2psOC1VCitIQXslUGRQWmd0a1dyc2Nnd1Z6SSVkPk4jJFdjIzRDdTBMQnl9NFNgPX5vYExufV9aJTstLUwkK0lYUHZmOWZIQnppdm5gKG5zcEF9OH5ECis/fHQxNGVhfHFofjNSYyMqNClMSHdPRHd2aVRNNHlDIVpKMzxnI1J2Tm48SS14VGZKJTVlPSZwa0Rec2Nhd2hYR0NfVmV2flMjZCg5ZU1yCit3TGcreTJqMSo/aVR7TzNoSW1Zez9UTXojbkFmNzVPUyFzUm9+Km9zaVB6TWJZKldVPlV9R3V8JEFZS0xLYXk4e18oUWhBJUxwKkY/YWFXCitTY2MzSGgrbHtsQFdTWFZEb3VAOVooJjIzQUdURyE0TUFefGFwTG5CaU9IY2xBQG10JSRfRHgrIzxKWml3dVBidmJzOHV+e3Btc29sdz0zCitGaz8mRHFJLTFTYXI1dWZ5TmJLVCNEJTVHRnlecyZsR1ZAUCZnbTJZRVFCejUhbUVrOUVQMjZwdkYmdDBUKVUxfnQ9amF8ZldYTG9wZEcoCis0Xl5GQCFSc1lHI2JrI0lYeks/dnhySkxwQStjJSF1VkApZGxuQClrQi10JUFPJFhMJGEjdnErcmJjZSNCKjVTP2AyP2U7UjVKZjJiYXQ1CitpZkE7KWcwPnxEd188fmU2XzlTPiNDWT53c0hIbVUod0lFQ3RDI2NfNi0keT9oZEd6UnE5WEpuVnp0Rik7WDdwSkZtXmMtdjArc085S1FICiswMDAwODBQfmQ9TV8/V1lqYjtHPTAwamQ4MDJseE8wQn50PUZKRT9MWmUod0FGTEdycWM0Y200WipuZWhkMzkzM1pvKTdPejR0M1RjMVN3CitXTzYtV2xYWTdQZjZ1PlBXQSszXnRLLSRPOE56K25rRVFpIV8tZ0JPeE9QOVdMMFhrcE01YyRVeF9TQkRJWXI2ZX1JOSZzb3FCeDtMKmY2CisjM2J2Vl59QDhlZ0Y9T2EwKkZEUjkyJGU+YlhTcmtXWDtPY2RZdlJvSXl0OU45QlR6dGpjOFhRKFB3OHpmWHtSNmZLZ1dDUUtpUVNAMWN2CitlXkFvcX1CRFk2Jnp9WWRReXcxK3IwO0FzPCtTajU3MG1Udl5za187KkoocF9XVzhDbT1Od2ZfeUJMblhfNitRRjVicG0qNWE1T29GX0ZyCisjcH1iJjRGelZMVWR2WXdoTnI8XzJKQjJDblBefndUQTNqejdRcTIzTDdGdTB8IVNZMmRTP3duISNIXikoMzVqVWBpRXUmLUJYME9nMSokCitnVj5kbVRjYUNuU3NaYTRIel9gOVl9PC0jKH1gS1B8OCFjZ1FBKSpGRGNFZDRDPjhaNkI/YztBOD8tVmBQUF9KMiFyS051cEg9aGtGaFdQCit6Y0N8fnoodE8xZXA2OHY7WGtITThLNCo7NHUxeFh4X3c4UiRPOUtRSDAwMDA4MFB+ZD1NPElLPjNlTzF1MFE0cFIwMmNyTjBCfnQ9RkpFCis/TFplKHdBRkxHc2NhKFFXUFhEKURneTt9Y288Rip6NS1HMnEpezRoRF5RPUQ5ajQldThaeUd6a3ZaODlXalpeaTgoJj1NOCVQTD8jMWllCitxJkItfWZHPUZRaTEteGd3aSF4TEQtbD1ZNDtDcTxuTmwtV0tJZkBRMVlgWE4lSn11aT9NMSRTdktHQUJycXRWc2RsQHxIekwjWDFRYnVzCitkNS0zWVIkKytObmBqXiYmPGckT2h7aGo8U2JsfTAxMmtgKU83WTJneEQxbyojS0B7Q3tqclY3K2pLK1hOPDY/bjNhbX5vVyNZWiVzOTxzCitNeiZuN0hKPShLTTJ1ZitqQUVySWtXKk10IWMlRyE1fl55VSpHaVM9Q253d09IbCRrRXVuLVI/bklWJVdLVkg0UHl1UTE5NEZjQi1lJEYhCit7QkB5aTM2JklsRllEWmBaMD55TCVWckZ6cDNQST9EVUApZiY2bkhEUjtgemd6JFJicitEajMyZlRxP209bTImTFdoekRCUjFZanxtbGorCis0Qnh3QE5AemdeczItT1VsP3tuaDtzSCRVSCNfWlBSZjd1V1khbXZgam1tYnxeV2VzXl8kYiNvMCotOzt+JFUmLUlFdUhWZkcxOFZedl9FCitaWWcwTDB7SU50UzR7LTcpNWZrUVBRSFMrYmE/Sk88VkJobClOaEA9IWM3ayVMQzBXTWFjNWRRXmdkM0JxSzIheGRGfVhyTmEobkU9WnxDCis/YkhvKmkyR1VZKUh3PUZuVk0jcGU0ZC0kKTZmWnhzJU9UI1ckP3xFQDtlRkgyeXI5T3BjSCErfFZiVUR7P340enx0SlU7fnpWPDJHaEw+CismcXpgKm5nMjxWSEdLcjxUbDhUVlBKWCloWFl+SCE+WWdtZz5FZkY9LStYb1k9ZCg5fW8zSXI4dGkmIWpQTjthMGI4PnV+ZUJSRV5Daj5zCit6PX5WeEgkS3BhejE7VkZROTs0PTxHUjA3cGlzcChfI2lUYUVFa2RFJGlxJDY7RTR9ITtrX3gmWjJMR0l0aDIpNHBHWGV3RWhVSDM8bDFnCitjVVgmKFlnYzF9TEMtTD8+a2NsRFNJalVyJmlzP14zXjZfOGlvWTFQck1fMTlvVnMzZWF4O3xVbHJTTSo2UTwwOzhsOSV2MF9XQz1GWlloCitzI1ptPWIyPCF7VEZZSHZGSnJ3fU9fRCMwWD9UM1VscUdSdGY/akw8JExXJlA9bmtXSiMwOyRCa1FCdWg8YHV4KU9QLWIxKH4wczMzJn0pCis7Z0RTeXsyVyslfn5eIStedVNjaWUtYHdtSGRCYz1mPnp1c1MwVGpYQW5YaTl9X3VeUEFHOHtAdG10RDNNOStZYDlNJTJSWiVYbGl5U3Q5CitFIz1DNV5eLS1BbEBWMm5aQXVtOCluPilTTEdweFViVD53WTQ1TzRrdjFCaVdzWWxVPD1hISlERDFGK3k3PmJReG1+Q0w1MiRFaFg4Xm9ECit5QU5CJTVpSDJGTTlhKiVnR1IzaD4zbWVwLTcjQzBIWkIqb3UqKj5BTjlIZk4zMFhVOXxodGMxR2VOUTNlJDkjazNhS0JwKTVxI25oMzhHCitjZCZMYSU5RmQ3TE5EQ0EjYlReZ0gpP0deRUshajJKKmFuak1JY1ohOT4haUBXb147ezNJM3JxdjEoWDJyU3NUPXA5YmlvVHk5Z2EwVDFuCitWYUVBPTBQNWFNc0s/WHVVSl5LITw3S2kwaGRpYXVeYUY8a1VXTlBUTk94Zk1AJlE8TGwyYDxsQXhgQXNLU0A2Q1VLTUo9UWlmVWFuciheCisoY0lOeEA+ZyhXKF5OdnlVOHdma0k0UGF5Qms2aVhjRUBZcVUoMFZXRDszMT0rSmx9cSgkdmFiYj5We011SWRTS0RPaWcoO2cyTkQ1QVRhCitjMzJfcWc/WFpQdlFRN3g2Y3duRXRSMip3YCtwUSgxOS1yMyhIYDZlMXVXMiNjT1dkUVZIJkBUdWc+VVpsfjdWXjNHSVJ3PW99aWtVNjJPCis3O2g4PWdxPEZPSEdASUZjPHNNY0s0Mn1tJW18ajV4JW5wVkloTFNmbG9RWmI0LUNUNU4pVmYpSGttPEQtUFJ6S0sqS2g5KipZVHJYNzBICithVChzaU15M09CJWJgdHNEJUZYQ0ctOWJAZFRydm19VCVpdEZZPDhtN2pYfXRJaSNQVT9FRk90VnpLUEp2SXZQJWNwdkxvK2htITJOYXU2CitwJVljN2F9ZHYjVjM+YUNYKEstMFo/WkMlZXAlNG87fFQzeH5IVyVHeV9XPlMtR0hzMkYqdW11OEEpVGVfMSMoNEk4KyRuVkQpNGkwTENLCis4bz5sWEsxbHR0YWp3RyNaYkdGTnVMRXdwU3dAfW4mTFVTKlFCLUxJZVViZnstdGBpN2A+NXgmK0UzfTdAVz5QY1B0eGpVdipmTmY8ZThrCitXTiZ9MDEyRUU7Q3J9SDhSNHY2dVN8YHh5YmI1IXlUeDA4TmckQSpTYXF7aFFZIT9vaj5qd1BQMmg5PElHfElqey0+YSl1Oyh3K28tYSEkCis0Wkd9JklzYUkqdXpeQ2d6JktgeCQoVl44ZEZIQUxpSXNNKWhjclRfd0tAbWM7M15yNktMOTkoRXBCOVR3QnkwUDdMOH17aTNePHtpcUpsCitqTT97THhsRTJnJUxLQHA/eitEUGRXdjQ3MCFCKF51c21seFRma0lDSGMzR2t8eyo5ZHJZRl9VYDc9ZWJHYSFQIyVfS2Z1ajh5QHp9QiVXCisyPCF1ZyNFbS0wKDhmSEhKd2k/WTxmaEozOzdCdXpiXzVXeyZrU1hmJTVtT2E2MD9ZT1pETmwwQUF0ZU1OI1hnMDVMUUNjIyg8ZHJlTWZHCitrMUhAZUUmKW8/cnpZXnZsdXd2KzZLXiNnVnlHU3lhPjMhe3RRfj1Ge3IpOTgpQCMyNSFZallafSVLd009VWVHO0FJVkxAODdqOzRUKXV9CitkYTFxdT5zQzR+JnctYClxT3ctWGJ4fiFCeVJ0Y1MrRG1hN2JURTdedCF2dEZPPVpeJF5iTWRGfDdTVmNhVyViWV8oLSNnZUtgSHRNZWVZCitEOEhGPG55SThacTwjT0V+d0ZjMWwpa2cwJHBaQVl6bUpNYFhNIUpxSDMwNlled0l2Qn5BakpRSThOP2prU3lfMkV4RT8oMVlSbnA2RlFQCitNQ14rMXs3b3FNeT5GVWR2U1FLZm0lN2o7aGgzOD1tMC10LSVyND5fbjYyS3I5STBWYWtEbE5RMTM4QihhI2tTVkl2eVljNiNLSUBwe3hECisjOzBRMHV2P0BnXktGMCQoNTY8RnZRU0lwajdkbndedlQzYmMwIyE1PUpoSzRiS29ZVFJJK2t4fFgoMit2KWhmTyR7YnhKU1I4cnVKRk8qCitjP0l+LSkrTnJPJT4xPXp+O14rT1hnJSVEZjY5dHMtJF88TyhwWChHLVMzPGhFWCFpU2EtRjRwPnJ1akF6SlRHNHpEK2o7PDd0KmV3aUQ1CitVaHJOcWBYeDg+Y3QrfFBxR0Y+JSRCV194WDtzakZVK0g3YFZxUmtwQ0RhakdAM1ZUdmk0TjBuKEZeJXJqZF9KZHJnP2VSPFoxaXYzPlAlCityJFZKfUY2UEN4Y2d6QmxeOEI8Km9GLVJ6WmJPMH4rLVowfkA5MmlDXyZ9eVctNUY2O1c+WGctbSpFKnstWXdgQzl4cGhRTjcrI3lgdDJYCitGUSpMRDlAI0JuOT8yTSRSa2ExSjVaNk5AV2M2U2ZNcF8xaz8zWHFYUitsOU5uIVFBaDY/ZnRPfmpKMmZjYWAoRDtLT259eVQ/aiZ3WCsxCismZTlZb3h1c0hNVGAtSUErJHJGWDY0SD4kbV4welI7PygpdnxmbTskNVhaP3Moc3oxbHJFVWxnKjEtZ3l4Q25OTnVzfFdOdUR4RH40Vih3CitJJWViKHhsIz0wPn1IKGRHPzJYRit0MntSVEJPYjNafENfbyU9czVLRitPWmZGOHRvSlVoXm1iU0ZPKEx7QGtUUipFYDJFI0UlRjJzUEBvCitjNzs0QXpiJF5CNlJxdn16dytOc2YxaWRhVz9zRUJfRzVsSjRMPW47NTg5dXMpWU9xJDErSHFkWERIVmY7fT17RS13I1JBYWhrZEJeb2BkCitwZHI4P0FDcCl5OUBgTmI+Q342cTs9OWdsMTk2czx6NDgqRURUciZfWThnP1JEYShobCtzZGtTeG8+VSRtSDxzJShgMmVRLT0tU0krS0tVCis8RE85S1FIMDAwMDgwUH5kPU1gQ0cpUFQ/RT8wTmBAfjAxXk5JMEJ+dD1GSkU/TFplKHdBRkxQO2xFXnY5UkpeZ2RySG5QOSN1ZlM4TVc5CittLWpPUHNkelVaJWRPVms/Y19gUmhxZSk0cDdXTHk/ZmduaiU/KHc1X3xqfE5aU1EwMjJJXkVYUnxIMnctPXlTbk10cUFoe2U0aGFhO2I0Cis2PVg9d3UpMnNuOEowbVc/dC1ibVRsYU9yRmtTKzlJQE03d3Q9NWg9MC1reUdhTD5GZ0t5WSpvYjF3SXl+JnY2am85Z3sqUlFeVnw5KVdhCitjPVUoNjRGSFIwSlFaOz9feShZRmRBYmRSMiFLbz0qb0xRa3hudHxwaldYXyEqKCY5biNWaDcqKztxKnlFUV9KNTlaTHdHI21tZU1CNG9gCis0PThfJGQxSzRaPmdoYWZgOV5JNF5YUloqajdxfiE/YExVTzhkNmM7c19QN2N7N145VktJMiRlJCMmQVU0X31tU0Y5PFluOHh7KkJ3RnliCis1fXoodGtAOSNSPHRrUWU0WUB9Wmw8VT5tNEQ1U18jIWZFKkNjMSZqbF45a1hyaDJQXiNMR2BKKlJoSm8wT25JOW5XV3U4SCR6KUZ1dGh5CitgUSRQblp3RUx1M3RUOzApMS1PQVpNTmAkPHIrbkclKTJuI1dETnQmUyFAbz5xQXBMQVJXK3sxYCs+ejVjPHkzfkxaITZeQ0tgRDBMdzYxCiswMHVsT1ZmNzt0P257QDs0fnlUP05PV28kQzN9Nmk9Pj1sKWcoNDw3X3VjLWw3cF42JlRlSD9EZUBwUCgxWEFZU3JWdHpYPz9WfFdhN2g9CitFcEZjNWVWV1h0WV8/I3heUDY5MTd0OyRpb0doUmA5SjVjZXlBTC1YPy0pU0xDKWFuc3Z6enk5YXtXOHxgfFNFKyUlO0VIJlptbjd5T3smCitBKzEyZ2tZem5vcj4re1F4N3FqYk0qZ0w/eXpQViRVdiNaJTFraUVPMUUpfXVhYmI7aXFydHxYO1BAS0cqVUMhPSk5fE5pUHYlNzFnYH5HCitJbUNoVEBIem5oKFp5cXdKMD9aXjQ7JjAtMkhUbWEkZys0Y0s1XmZTR2hVZjxjIUZWd049dVRXciU1MGxHRj48cCspS0VmRjAkUiNfIXgmCiszYFVge2x6T2AqM3I0RkA/JV5Re1ptJD9zNihTZ1ExO1lQRyhuUWJ9X2t7ezR5bzE4PSErRExfbzxTYH1BUm9tRHVNNXsrLXs9Wm13fUs9CitRcjFQYjEwNXN0bjw0OWBPfERNOWthPU53bWBBR3BXal5KRmoyNjhiMzxlUl5MaUBqcHdPI3gxMFkhYnhSQDNzKn5ONW4zRGcjZEVDO0g9Cis/WklHYGczM0QxRCRud2lJfVF1QnMwcEJQQWBaYms5OWJSPVJRKVFDeWV5N0dwKF9JTEc/amBObCtuJU5SRn1vQlh2JWc4N2xWUTB4SCVZCitjM2NhMU5WWiYqJHBPJmlYPVkraFU5akVLUjRGVC18K0NmSnAtZlIyNj9Oe0lxVkteVEpVKiNjclFVS1kzaFAkY1lPbzQ7M3VVNnBvUHxzCisxdD9aTkh1ciQ3TjF2byp5YVRFKEFWZVBMJjM+PWNeY2JUX3tOUUxHcSV5ZDV6M0xwS3R3OVUyKVRXJEJwZTFNc2VFbykhJkltSk1EQXpPCit0eXNVczwyPXI7TXM0Nns9ZVhrKD0meD9RKWwpXnN3UC1eNG50ZWVeYlRmKV9vR2VLbHktJWcxMihEYk9vMUg/YVchbzlTaEBWSiE7fDZBCit8fmJKKzJgMUYyYlpHOypMZjcrYHFqY1lqekBPOUI4SFJEJjB3OyZIaDc7ajZYPz5kO1VEZ1VJfis7PUAkVmI8S1hVREohJClAfig1bm1mCis8YGhWMCFZLWduTngmRV4+b3hvN0MtJnlgaDwoUmlPQWJxK05UUmRzMXBIK1QmVDwpWV51OE14VHIwe2lVUmZqcF84KGB1ZTdrYzVVT0wmCitSPzJARnplelJoNzswREx8PWtwYTxRXi1Me0VtJWNYd1B5VEZJaGIwKzZzdHZabWhQJnNLKmFqWjhqWHJke15hb19WPmg2Y0RfQVYxWCZSCis/aGx5NSpsLStfUUNtM3V8aDZxQlUmPE0jKkFgdGVQVG1kYGA+OHlGX1ohdTVSekxJTWpOI342YkhCQHFaXkNWbzl5en5Ebz03Xz9LMmJgCitUVVJZekx7MzwtQE5nRjh6dUZ0OSV9RUR7e0JJcSZ8fkFONEFaWClOejV1KWxKcWljTGdxb0RxdjFDcHF2JCpJLTBtNj0/O3ZrQmNtZTw7Cit4amdXMGUrLWJJRzY0fWNOYmlFWHtqRUFRWkZFcyU5TFZeblpZanBWV298QUZodStAQHolVVYxRy0/MGlHY31gUVhYYiNYR3A/PFZqTW5qCitZaDtpSGBEVm5AeGE/PUY1SnpZZyhMO08+X1RATU55Unk1cjUoNSY1SU4rYSlycFdTajI9TnN9UW1fJipfYVAyXmZ4KVlpRz1pLW1mJn1NCitQcW11RyV7Nz9ZLUQ2JH1kV3k3d1NRPlp4eTRVbTR4Rn4tbV5qIUNCQ3gpJHE1ME5XNTZPe0VrO0ZASU1PWFpjckJveXhofkdsPylLQXc8CisjPGU+fVU2cXNwQS11b3prZlFPV3dxRX5yIW9WWGlEajlaKkpyQmtgcz8hQTdNcVc7S1pqbG9aP2VWfj9GMWZHYFlXcGp3WT1aY0dXVFdfCit5fi1zSFYwIWR4ZnlEVXtGJUhKJk9DX2hCPnc/TFlBWWduSjZ7JXlYPDh3UUFjJklza1VtWllQUkxfQ0pWSF85ZDVXWiRwKT1HbFBte1l4CitIREIkeH4mX2AmaXg+NXR8bUIyVCVBNzs2JFpyTWFFVj5QXl9McGxValkhV3E9VWdnMn1gJnFrbGstbE1JQmNna044cC05RmRWc0xITCsyCitpQ3U2UTB5Ymx6JmozQTUxS1BYPigjOUdqaz1ITChMbzFCK25ZTTslSz12anR1bTx9Zj55ITBHdkUzTXBqKnFyUz83N3pfOWM2cHtjOE80CitKKWFDNFNrcTAwPj01OFIoMlNLJGtmYDNoSygxTk1FWTdScV9SPEgqPG5ZS355QTVhMCZDRGw1PWR0RilLZT4kQytoRSFJZHttfEMxYjZmCitoTiFseHtQcnotJXZiK2U1T0wzbW1YNj9LRiRWT3hOTVJWbXgzVF5HaDh2RUc0KztLQGNDNjEyXlNwY2w5NkQoYk4xKmt+bnwtMnpnYEZfCis2TV9gRjQ4eT1HN0AlMSg2UlY1an43dXhQK1o9clkmfWY9THVXcjlPR2MzaEdCU2QtZW10RSZ2bjhPUkBPayE+NkY/SChHaGAhZHM3KXVpCiteOyt1bHUoX1hhSGpAVWd9SU83JDRFNyE2WnpNX2pmdXRSKHdIPGxARU5uZXotfS1eTzJYKDZvdH5+byQ1KzYjWGxrWDsmbjJzV1drWSlpCit8NyU+PjVuXyk5TGx+KTU3fUI4NDc0JiZNbTNgb313KVpoNld2Y3I8RmZNYzQmMkZtI0Z1MUY4akQraTk+QXR9PjA/NipzbXQpbmlEeWFLCitBLT9mQnVzVDtzMVUpbVRvVFNHRGtzcH1CVGdTdGQ8IztfQUA+WlZBSVB6NnoqS04zMi1eazhwfDJJMGNNa1dBfVhqczN6aTJVJj8ocjJ8Cit5fmdDWUVLTTg9IzRCOGMjRyYqSyZ1ZyVPMztIbD5tKntORU9XSEdNZSZJI1M5LTFYSjI8K2dPI0UpV2xNO29JcDU8PilwSFNvKkJATjJMCitJLWdNd2FIRl9KS1VKTH52aEVIU0pJb04jIXJgPy1QSj11RmcldDBkSGJEbD83Pm5LVEswUmtgKVF9bX5gMkt5a2RjQHl5Rn1EZGo/IWBiCitoT3w5VkM7Tk4yR3QtcHR8KCZEaiM7Qz80SntWfUgkeTJBNmMxRS08dVJ7WXJqKlR9ZDY0NGllcWFnfk1OK0kyKyY3dSs7U1RraktMQUQhCitpQHtEPm9pTlI9KWt8TypzZmpwR0pyJTshWHBvI2hTTEJNS1paTDMpMUBOcVcxPVckUXZDeHUyJm9hSWhYN0Y3dXZSRnIhamNYVEpDPFVaCis/VWR3STE2ZykreiRsS09VP355a3BHdzd+MGt8cEY/NUlnaTFialVXbCFDMVVmMng5IWRzMlBvMEBtRTB6VjxtV2ZzKX5oVzQpdEtuKUtKCisyeHQ2b3x3N3RGVW91dih9PW4jQiY8TDZxY34rOzFxfTxvM2c0Rzw2QEgwIzA2WlFpSn1ZN0lOVDl4XlQ4YChrfl9qZklsNTFRYTQpakolCitlfkVmYUZDTkRRK3d2RWhJcz9pM1dqbjZZK0RlNFpBcFVANF4oRGtVdSRwPTVhPm9OZFAtcGt7e09OZz4zNDtIcjJHSXZLPCY3MXkzJm1rCis3bX1xX1RuKCliYWRDckR1UTFeSUheKGZeP3w2OEthRV9MNG5Ua1VpdTMpP1YyfTFHMFF+N0Q7b3hhQW0qZWotJmw7cHoxbGxFV2ImZ1NDCisjMmwqMGg9JXB6WGNlcHp5and5cDwoJGc1dmZQZjQ+ezZ+fHA2bmRGWmlEbGVUVzF+UjIpQmw3e0RtSkl0Sj1VRktpX1Y1UFBSIW83emhICitfJTJqfGk1fVBiYlVAP2pCMU9BN2JOKFFrSTIxX2hwdnQyZ3RwJitDJUBVbigxSSM5UXZnRXlFbWdeTHdiLW9aKjwpWXRfYEN5e2I0S0hPCitiaC1XRFo3UHI0XllHOUwhZWdYWHcwYUBvPmAkK3ZEMElAPHROKktIMkUwLVg+RXM8KkZaU0pTSXpIRzxuRV8jVjFaOUNlVX1TZlB1MDEhCisrJFFjcEl1cF9ed2h6MVBOI2xBLXEjb0NHQFVSTHhjI1pqUyN8cXhWeVZ1QGJwMVdUZUY2eUwmI3pxanFfaC1SZkk7eEpfLXdwQHYxbSZiCiteR1hld31FI3IqRThjWGt5bVg5Zjk1PFZuRSQxVkhqdERqc25TY2xZPXNmQWNoNTZYQD1vUE5IPX5CMUZnISsmdWdMQng9MExESmI9ZD52CitfPDxZNzxudTB5RTdmTUp3bXgpeDFnMGVNOSFnQ3oyMjM5KjtpYjZKYEM4dT5zO3NxTGxkSGg+NSt1RFN4cyFVKjxnV3RQTT0lUjA7PCVHCitQOFhhcVV2OWZ5dFMzZXBIaWhXcUhkZVAlNkxRWjYqc0EtZ3l5KXp2N2w3X2t7VztnMHBBbUFYM1EqUlQ7JTFkWVc9VTgqRFlaXzttMjQ0CituZGU7Mzs9SmBxJlQkVGAqTUlxS2BlITBlVSZlTnshWGB4aHpjRHZwI2d6QXZzNmZ3KkgwKHhfVzUxWj12TnZDXkleUyQtRSt3OD88I0E2Cis4d3Z2LV8la2NndD9DelVPSE9lb1FYY0t3NTg0PkQtUF5aUzVMXyFqTmx0QTQhZ1Q+UnlyPkxYKHVgWmp5YihkZlIlcU95Z3lvbUJDN19zCisyRFNBK2h7IykhIStAWHV0aXA9MXd0MTNMS2xURVlSbFlqU0N7a0teS3prNmduRXtgI35ATnN0KW5naD5kVX5xUHU0Z0VQKjIrRUpDbyZVCitndURaKFpuMmopRHl2NndAK017Ym5PdCFnVnc+bU41QFJTUTIrdUsjVVBjM2E7ekhpP0YhKlRSKXgqUDtkZml8a1ohKC0hNF4kZERGJnF1CityYEp6X00qbD1YcjtpQ2g2ZEExS3RqJWc0X29ZPklXd1oxMSh3SnYtcmMySj56Xz9ab2IqbUhVY0t4eXVOaSMyITg1TjJuYHFmMkswNmZlCitPSWszanwpKnFObTZgYmd3STt2aE5fKXI1YTh1MFV9Z2lKTTArPXtiKiU/ej1kZERPflIxWGlnSTU7YHo5RmJZIU9yQHpgIXQqIUFMeD8oCis8UGV5MEMqdGNTcXU4ZylUb0FHcTA+IzJhaT5OUGVUalpzPlNRc05gKFg+b2B0YkBHJihASStvUVkocF99cjRLNlopXlg5Vyo/RXZtTVZfCitXSjRTc0BsN1R3NStxYElAcFdaekIyYW1IUnhGVl9OO1B5IW9wRUExWFkxKGRra3NUWVdlUDZhNDlfZVNfYGc+SDdnNClSVU4rSWV3PCVVCitzeyFuM1ohQnd8O2B6bX54YVk5PDA3SmN0PEhiaGJ4b1MxfmY9YXZFd3ZZQk93SSRyNilScilOKXdaM2w9Yz12SmxgZ2ZkaWc9JmU3VzxTCitvNV97RCk8PX53fV9PJXBPaypsaCVzeXRrSTBXVkg/KVVKUUppX1pJODVjYExyZzlMYm8zaHlDLXJ9X1IlMjtqfDVvWkN8WFpgSi1pX3lCCitkUFgmaSZVPTI/PSlQd0pIWHghN35uZTlYdmlOTjUpVS1yP19aQWJVdWxgPz1zTjdoLSpLQTBPUHY1MDlKKHEmNFMwdkdZPG9APHpwTjhoCitjIWJCZ1kyVlBySHtlTE1Qb1g5TE8jQmdVMn1hdWh3Nk0jLXx8THNRSD82SHsyZFliRnZnIT5VdFRCRllxUkx3dDQ5d3pYfkNtdUNHRSNrCitNQVBEVFomJn1mTTE2YWpxdkwrXi19IUJPOTxkYD5XbERTI3thcU5aVEpnbWUybk4+eV9iclN7Tn5GJTYrb3BOTzhudWQ2JHFmYmtoQFd5Cis5REB6UFlrbD43I3glTi13fGZ4PFRzd0VwYSkoYV4/ISN7blUlTWluIXZhYF5lTitnbWFDP0s7RjdCUWkjdWwrLVhDUFk+XnVBRDVnViUlCitFZzNKTm90VnJWTT56I2FSZGk4KS0pKmM/d2Y7OUNfPy1wJVJlUlFaSjtDZiohX3l6KXlWK3I3XndKKlcjNHJFTDhFPnF9YCl1RlpeKFRfCis5K2lNKz1lSXY5TXVJY1ZNTXY0XlUoX1p4KFFaKDQqVndCSURrK2UyVD9EdlVjJFJsX0o3NCE0YXRCSGBqKUs4SkpBampqJVQ+dFckUWxgCitBUDZyKiRRTXp2QV85YGZTfVpDJUlld25zKkJLWUc4Rkh5MjxVKyE/c3VkbG1lY28rfDQrMTg7VkFjbnYyQnNiaDtLVV87IWdlc05pJHhgCitaNGhtPmZwelg1cmBOcy0lM0ozOHhMbDs5U3kyaS03JmEyNUtvYE5BZjgmcDQjWF4lSmMlcEt7YjF6Nkl9bW1gUGxwbnkmTVhxP2N9WT98CitrXmNGRkZpeXRvZ3ZOfipZOGRpVEdEWClWe2dXQHgpYighdEsyV0RnUzgrSjl1THBUXndmZSVtOCkzP2dFeHhsKkR5M0doKjFPUk5xOHRVCiswUSs/MTIqbTc7RHkqV1JwN1RGREAyV2ZVeGNeNXslcStSSz9kPj5gY283cyltWVM1MyMtZiZqRSV5QitIYD5takFYVngkUlkzMUlBPSNKCitVOT41elRQWHc+NW8lRU5ybSk0YFdROURMeyt2eTM9Jjx2MnM1NFY2cmA7VDUqWU11Tm5FQ3tNWDtTQV95eUxmfjV2dktnK2JaTjVDTjVWCitCcERzeGEjP1ViPitJUTNacjMtXylyTkE9dUpvK1gkY3VGU2Bhe21mSj45NnVPMmBzcHVHa1M7aUgrJjxFRmx6KCp3PGQ+azRSJUZ2c3BQCit1VzBDfDI1Mj5HNV53UnN1KSZ+SEp3M18qK3xBMzRlJHF1KjBEPztKVTB5OENBfWw2Rk1JbWVBbyN2I3Z0dXtmU3ZjdTwySjgkbUdQdVdPCitzbkJ3SUwtQWd8JV42WDs2YH0qfStjY0pNekw8S2RVbEdjcVd0Pk84cXRqK3NzLW5xJllMSnVkKGJERWZUPWdFKm5NKDM8TU1ZYytDRzQhCis2MFUzTjV4Xl5AaHckalZlaU1PeiUodVRDa3YoOVM/T2FHUGMpVD96dTFfNjMzd2ZyMksyVTNsZSM0U2RqbVZSWCVWZkM2Yj12MD4/MTReCis1ZWpBYTJfPm59VyQkLXE9QSEkZkVGWmxPdzh2KHYmV0ttWkZCZ1ZzeHVMX3IhU09RbTk+U0NqI1NVWmc1fiFecCVeOS0kalVqdUo2KzJaCitwQztNS2lyZTlhQjF4OXk5PWA7VFYzVTgmM24oYTclYTdqakNZVSVuVXVsSj5MbG4tITE7antiUVJgMFhuYC1LbT1qTENmRylLQy0mbmp1CityPistSihzblFmUGB3cDQrRHx5JENwcWh7ekplWWFhZ0E4cXxUcyoxSlYjJWhYJUE5TF5yJV9IIStDb1pVa3h1X15RKTZjdjE/JDdmZyUrCitgbDg4NlVwaGYwPG50eTtMcCpEdTNZY2UxUnNuKUloNDBnSTAye1RyVUpZNVh1dFFLTHZvTyZaJGw+YGleUGAqWVk8JSsycSQ2M3tMcklOCitvQTEmaDRiaSNjIUVuclY0bVZyJUxrblgyWFF9c09ocEMjKkdkYigoT3NIRypFRGtFKDlGcVNwTT1YOWQpVWFNVWZCSUs8SVJEcFRpSG5gCitUcXw1VHh9d3BFaGh6NWM+fUklQldST340OXNmfUxXUEl4QT5qSnQ+Mm9XZC05PWR2M05Pdih5cTd6U0FlUmEpbklMPDtwQ2Qjb05tPVU2CitAUlpOaVNyZHs8V1peeCMtcj5FT3Y7TTtoNFAhSno1NTlCXmooZTEkK3x+UllXWm11aGYmZ2s8WHVxZkMmZE0ycjN9fVNfOXk8dFcqZ1RWCis9QyFhRWZGSE5iJX5uWkEqT0NvMXNPWUkmWWQobmhYXjI+eytZV1cjP1NTLXAkUiZ0eDMlWWQmN1ZxR3FwfUtJMUNzeiV1aUxJQDEzNz02Cis7YEg4NFdxZzleTUtkP0AtN3Q8Z1Rle3g4ZmNSX0V1WWY5cnBlNXstQyF5PGNEP1J6Z0tWVjt1S1g4R3MkfTFSJDMocm1US3wtT2tAP3VjCithMTZAVFVQOytjOFROc0VfQUw+ODlgY2hnLUlvc0FVVXlXSk5mdDlhNTJNVyFje15JUmpkfG5HUHR5O3pGb2lASXVKVnh4MXNVUV95Rnd+Cis/fTN0ZEBObjt6fDtKXkF5c0JpWEFTJCg1VVY4P2RDKD9KZFVgJHxBRVlCcCgtMmo5UnFrKVEpY35Sb2QwVE17Tml5X3JZSj5iUz5ue2gqCit4UmBZRHN3e1hoUkFrdEJ6Z2klTlh2X29mJE90XzRjeFVJKHNuSjFPQ0s0JDRIdGMmcjxZaiE2MURFQWM8PWdQZFN+TVNYclckdz12Nj5FCitvbyRBST0wcFhPKiZJc21STz8oM2hiNWU4M1RAOTA4YEEkeWUhJFc/Y18heFZBaFFpJEk2eVFEeTktX1A7KlcrYSFWZW9mWTMwYTdtbXNiCis9N2gxUTNlXmw2USRXZnlFXn17VmxIfkgjKTszZFExUz9Ja1Q+YDZBQntQRGg2MztLR1kjR1R4JGRuWD9HWU18NV50UGh7ZzxUUTUtTn4/CisyZHIxZSVidXhJNk0kUDVQUy02TEVLfl56cG9WanQmMCYoQ2tsTTwkVDh4bDs1UzZRK35hMWk0bDEoVENuWCZ4d0laUENadVFfOTZfeSYxCitGOShjNn4oa2Vxe09tekpXMypOek9gLXMrJkh0Wk5GeClVc014b3s1Jm9sMkg8RUUyRHBWNXVYUWlZP3tDVTZkT2h+Tk1JR29kUishVkspCis2SXhoRXQrWURzc2RBV3FyZCVSVilyT25uKFFjSkNXQHxFLX1nQDQtNmNOQnhLKUg2MCVlS2hsKFl4NUAxeWx3diN4YVRxayVWNX5WTFBBCis3YU9mM2oqKn5VNi1EPTYyTXt9ZXMxfTA9R0ZwT092P3VAJVhvbmNmeVBFPTwoNVJoMnFMb3xPT2gzVVpgZSNHRWtmb29PQXpofUN8PGBqCismR0wldGZKbytNM29eVVRseDErVjBfI0N5Qk5TU0xuRml+TWJVWEFhdXtBSCtVRHJJUHstWVp6IXE2UkxWPD5BMmc9c0xlKHM7ZTszayV2CitxYDYrOzVteCVGNFoqfm1VJEJJSWcwUlMtT3hvQ1FIQlJyb0EpWTtUfk9uXzR+M1NRU2FzQSZ1akpwZk5rZmk8K3FtPDlrWFhRMyY4OGI1Citid1VRS3lPNHlVRytMe2UwZXRtOzIkQHB3K0VaaXloTCtneE9yMkBxTXU0KzZMPGJOSkI2e311VlFrI2wtU3gtb0pESmFGVXlgbjUrK0JvCis3PXBhKGNrWHAlWGRtd2xLdlk3ZXdHazEwTjRCQFdFM0NEN25uVWh+SjFuP2BEbXZXUlo3c2toTVNwKi02KEZpIV4jfjNLTC1aZ241V1NfCisxYGsoPyFDIXFIPFJHTSF5cSEhekZXaDhNOG0zfiRAfTk1MVJNNntsYEJhaXNhOHJycH5jdm0+TCQmVnV2JTJLMmBgbWdGO0syRUZjSEM2CismanBXUVIkOzQ4NSpOKyZBIXQhI2F4PWg4Ulc3bWBzMkkrTnMoXzdBWFQwK2hnJU5MNSRCdFkhJih3bEBgMSkldXA1VV4zN3RkOWdpJW9zCis0I1g1aXx8NSQ9YmV3dGVvTHFMKW1GNmdUczl8Xyk+MDQ/K1FQe29nOWQzUmJgQVRGMTVDcitoYEFHTD55dVMoZntLUHV5dCRKOS1QaDVzCitqKkNsQl5sITgrcHBTLUQ7UkdAc253UFVwXkt2NiVnR2pVTnRLKU5rVkZpSTFQV1graXBVZG9qNzJFKTJRclBCOH5Ae3BRbERhISR+fStFCit7bHQwe2tqRT81YDkhSnoxaXorZkx2YkRMb1pTTWlmY2lIeU0oPFNsWDlpK0ZIN3FYNWtnZ0hicEAjUHQ5UHh5NnJ7KmpMUW50QkFgPkplCit5TDFac0kkdCl4UzJ+ckg9PXtTdy1oS1hAb3skK199b1M5MHBHZkhAMzl3MzRXKCFtXnZRVjl3fTw9enduNnhUQlh3dDBlZXAocElmJE8hCitwYCN7JklkPF9iU2RzRFo4fHYyZUYhUTBvSWtpYkBSWX14bDgqZE9rSSojUnFMZyVpPXE/NDNtMnh8T01UUjJLMjwmejFsMDVsSDxARDhNCit7TmYtVCgqLTZJbl96MXRjS3tZMzFXe3QrfFU7bk49USZRb1Z1OGU3O0FeRl5rPCsoSVVrWiNHVSZwLTlncXA5QzhWcTxWfDhtd1VoTFYrCitCIzYhKkpyJXBoaWRyNjcjdS04fklZe15gVlZzS0llZ3MofV9rOX54PlFhOTRid2B+Nkg4VSNnfnMkQyVWVEZob3hyVnhkVys8UWJpMGZpCitZP2RmZEVkbDN7TDhTUjBIbDJtZ0pQTFQwamtqayNqMUFEPDQ0YEReWmdVVlgrYHcoSSMjRlFicHdGY0FRaGE8VTNgQ1h6UllKRWM4MXV3CisxckZ3aGA8N2hwT01mTTlDRytEaHhpISltMlh1Kk0xVUUzaSl8aGVgKUptXiFMTGNeNDg5dnNLJU1hI3BXe2pCbjYmejNHXzlDMD1qJWAlCis9SFNASmlZSThRR0dSITh6Q3daTGsoQld8Tnk0NH1DYEI8aWBIP1FlezxSM2A7Tyg/Pk5fTF87SSp+REl7VnxXV1ghMkx3aF51aCY9YmwrCiskbypOLWkyd2FpUmZjdmJ1QyN3N25mJVJfJUFiNCZyeFJ6PmtxVVRDVyNUd1p8X0g5MmNKcjEzVHdPKEomYEJfbSUjMmIpdUJGPFJvWmtOCis3Ryo9T0pDOUpCPSRVYGNLMVBWI0teLUc3fV9HP3ojWDxrI0A8dTI5QytoZ35xNE4lY09GSnk0NWBKbVB+ak1tfWJOUUo/O3Jva3wqdlB0CitfJXU5eW17UW0zc2J8aD4heXx6Iy0mYCVgQyU+JDItLXNDaHYjYlBIITNKV2spcmA+K2dTZk8mRWtzTld9dyRtP1QlYDdpTXBNe0VfYFU9CithancxcEhNSj5CZzBAdm9nSVJwRDNTeFlDTEV0dDgjVm8rWm5LTGRAe1p0Yz5UVCVZUD01Sk1HcCVASUtjaCphbEs4KjZYK1JJTmU4YmVrCitmbmIkanRzOzE4Tm4oJGxIaStvYVNpV09ZQHNjekt7SD9Jbk90PXh5K014NF4kZVJOcGlVUTsjLXR3dSNHTHk5VyhqQVhmbDVPdFcldnlqCitWQm92e0xQVUUtI2tUa2pNYypfQ1E2KV5jbE0yKEVuezc4d1k9KU9vaVRuWF9qQFJnNUplYyZsUzVrKEludG44UV9wOX1HcE8oSDNscDxaCit9fmBmR1k1RDUqMUJ7RFBsQjVOdnFgVzBJPlotOEA0WEtgKzF7eFVXWXRkYXplQS0qUVBDcHt7eHg/JW1AXjQwPVUoamQ/TXEjaDU9JDVqCis8IVooJH15SVYkakdfe0hpMH51LTF8eVM2aDVrJkdkQE8xSlY9S21XQ2V7RSg2Yk9oaSZQZGhtQXcxOzw7UC1pR2IySDhzRk9ydENSYVZzCitJSzdVbykkcmszQ0ZKbzFgKzE4OSVGMno/PUtnaFZJWGYobE9lLTVVRjw9bkx6fFM/d345eEZNfXorZFApaD5ANmFXQUsybXRleTdEc21tCitnMm47PzAwMS1zMDAxSFkwMDN9bGE0JW5XV29+M3xheFkoUFZSQ0NfYSVeZDBGSkU3MlpmU0kxVW9MUVlqWml5byEhUWlwYXwhfC0+O1FvCitkUCN8TjZFfWdteWljUG1kQn5oU2dDcWREPlNHRTx3MnxBUk1OSWt2fWd8RSokJFlwJmI3QkVTY2MzfD1sWkIlLX4mPVZgfDRTeWohZHM2CitFdy1CeC1XJTstZDhtQEhIOTd+fXZRYERoJjt6eT84JWpJelReaGYmfmwqP002bkYzSk5tUys+YmdfOzdTR0YxN3BoWWM0aTY7bkhRSHpyCitebXFDP2Z+Pns7M1BhTlZ9VGVLPENlT3NFNSNRXz5PTkJ2VD5TXys0aWAhbzR2VzdwZ3x3eTNiI2BqTXRKOEQ4fkRWTFo0JXFUbkw7QnVSCisxKUpIOzY+UEUoVXthN1JkRjBoM1lrajZIbiNoVXN3UzF6SiN8e2N2Q0pOMFM3YzNKdVYzO1g7UXY3aj5COWxEdjBxUzIwfFhRUjAwME84CiteT1k3eUUpKDNPI3N2VFhpd14oKkFwaWdYYUF8TmFVdl8wfldOJmdXVXV8Sj5ZaGBrNVg8eyNKVlJDQ19hJnM8bGQ5N0QlWmAoRXl7O3BxCitmYX1ZPnNVMTNldnRxQTQ7KzNGNzJ2WlFFPXdtX0IlajZed0hXS3R0KEpJMiFnekJgaFZCfVlaU09oOH50eWZAeEdfd2FINiZ6P01rTFh8Cis9O2okdmkxWFJxaT5HP2AzSnJSQlFPK2BgLVdUWF54Xk9XPC1YdzMxNk1FaTlTNzxKeDNWSDI/Slc5YjVfZEZxPUptR2tjS0Fme0BxWEtQCismeWZXTylyKWhMVzNHdURSZDE7a0ErcjE2QmMoVFRtNilUVj9vaDZhaFpYN1Q7dlBNaDhNa21fZEFLdk9eUVlBdFl2TnZhcGQwUypmZFV1Citjej9uPE1acFpaPmRfPGI8YlErSlRweCNZPzdpR3I9VXpHKl47QUJTaD1zSChBM09VTi11K2NgfDkwPG11JS1ffDVLNjxDNn16WTZfV1FRCishPjRgOGEwYW4jWUVIUmxjRik3OEsoTkF+KHd1e184WT9gN1RISkFua0Z4TE1ESlR1YE0jdlhPRl9rLXRAfDxDb2E8cUlFbSVMKUQrVUM4CitJcWVmaClXZ31gJU9WUHEzekskWXZ0K1dNWllgYXZaVTNHfkhAMGglSHgjOD9pXjlvKHh0VkNediUhMzFyQSpgYXY+Z307Uk5+UDdadmooCittOHY5bXx+elRsMDhRenRYbVQ0YEBXUkojSnRWRGRMeHZ4KG9LPUt5fGwqNUR8NjNBZkQ5ZDA/cl5SbjRieHYkODxneyN3P2RURkhXelMhCitXbE1JVVorez93ciR1Kjw1Sn02Q2NMSj9lVXUwcUxYMDRVezBhfmwlPCokbVh+MCNOM255fU9iZDJYYX0odHNQVHBOJjQqIWsmTlI1dk56CitANj9+JEhSdDAhQ2t7V1lPVWo9Pno/V1h5Z0J7ISN+ZDFsQjYyYjg2ayVNLUdfUEc/SzhlPGBmWkdCXkZNVlNod2sxd2o7RTh5KSRnbVBXCitXSmdiQE5EP0l9SXgwZHslcVRXVzJeKFE9YHc+MXFRb3IqPDAqMEwqMUVUcGteP3lHaDBWU3ZyUiljS3F3S2hzVT8pRmlJKEJYWkJ1SVdiCis9TXF4d2g8OGJRUjtQK05ENmdea1NHTUwkMCZUR0pyVG47a3pJZn5FfGZkXj9EYE43ITQhNiY9cFRhJTx8KkVuJCZsTFFMeDtPSGM7QEtkCitIYSMkNTBPckh+eCpJSzQqdmI9eWMwKUM0MX0oelhDSCZed1IqTE4pRn0yKlVwTWRHISgmd1lwKDcpP1Q+d1Z0U2hxWlQwJHdjNnsoQDZjCitzZnkyMkwqRGY0bWl6eUtgWVhYWG1RcT89X1EjKCN2KTVQUW0yfVooO0wxRn0kd3VPMk00RSliQEltY0N2MVJFYG59LTBGKl5lUjBCKEgzCit8bjl5ST5uUS12eHxATypDXzEqX3l1ezVZM3YxaGBCfHlAcVZlayFpfldvWjYxTDY+YlomS35TbXtAblIobj1JME1aMjJhUDJCQDJBLVk8CitTMF4mKVUzNjtSeUQmJntVczBhXzw4Xjx2P2VFKyNQRyRIdD9lRG4/R0gyYXlrajAoVzRsWWsrOGc9UGozeG5PfmIxa3RieSk8SzQ9aENiCisrQDh3cz9kVytDTnF6ajN9VC1SIVl7WkVSZmdGeWhRbj9SNl5QKzF9KE5vTUx4N3RYbFB5MlBuKXhrY09lP3lnODs0N1QldW0+KE5feyo7CitHP3sqV1VGKTwmTFdoQDB0RzwmbCUlaTkxfFlzNSkwd2clcUV7UTs3ZUgoe3koa2MtVzc/SSh3QWV5fk83bytQK3dWSF5AT3E3Q2BoLV5FCitId09IWUlELWZFNU04ZTJ7eXxII3lsc3NKOTRDQ2hqN2MoQiRVTXZ1NT4qWFFLMlRHcVJWNGJ6JCNFJnFqb2gqUSlSdypFO0ZXPCEpRUplCitSJUZtbGxZJS03KSNUU2tILW14LTZgR2NkPV8oekMtej4rYUY4Q2JNbGhFeHhhNEBAPTAzRn5uZkElMlJyZGpmPjdAPEh4aTBmVFdJPUMjCiteY2woYG07VSR8ZUxvUyR5M2p8bFJBUVNUbmM+d2M/Q2laPlFJXyVvPy1ARTxuN09pI2AxXnMxQHcoJkZCcG4xbE9rfCYrLUY2diowVURJCitMc21JfT51YH4qPlZkREB4Y1d+KjN4XyV+SGgqI2RLcFRAJStfZERQQWhCJGZ9Qj1gMVdxSkg7RThJNDN1ZjJ5TTZfYFNUNk5pVW9rVTVoCit2YTw5KTNLQjd0N19jd3lxNnU+cDs4SXg/S0tpM3pwYTRZMzBsPzc9a3N6aFo1LVZienEjR15VXll7ZDNTOSs9fUJrTUZ4KV9BKnF3VkxHCit0c3lkY1UkP3c5cHJ0am88IyE3dndYNGlsaHg5OWpnUGlLKGQkaFkyUysxPlhNcX1kOHJFYkZPTDdfd3VpWHVfRTNKJXIkY25RTShPP3NOCis9QUo1JWNLWEwpMFJGTk1FVzA0TzlLUUgwMDAwODBQfmQ9TjFYYm9AMiZzPDA0QE9sMDMta2EwQn50PUZKRT9MWmUod0FGSm9iMlhrfXc+CitaZ2deUVklZ0Q1WD5NdEJVdGNiOGQyTnFENHVVV2NNZld8JHEjSmdQRT9rO3Voems9djFEVnRUOGxjbG1pXlNWbzFRSGkpfDlnTShNezhaCis4WkstNlJnbk12OVVgY1RJaUtJcUxNeVYldTFURnojezZPTU9zZjdveWJKd29qJCklUloxVT5yKEpQczU/ejdVUGxUQzF3VUY9TUdKSTc0Cit3MFhXQFlvKiV1a25mVWFLJVdwWilzZz43ZThuaTs9SVZ2WkshVjIoI35Ed08mU0ZxMj5pQi1eVjBYSTJBVzd9Q0NSVUM9NzdmQXNycWpACisxYFhPOUtRSDAwMDA4MFB+ZD1OQVp3IVQ9QGg1MEF2c1YwMyFlWjBCfnQ9RkpFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ0pDVlFfUzFhCit4UVJyb21Xdzc8VGVtfi0oTWp2bD1YKGlCd1V7WWBfU2ZjKkZxQD0tUXlsZ0Y8Tl56RTI2YnJOelFpcj5wTFVhdlRWeDwpRFlzZVhGaVEpCit6SGMtWj1TRkdFaiV7NjlyS0RNe2ojYH5yQmJ2TjtnfVBFWSpZSX0+IytzYTB5c0BBUzZXLX5Ve3I+QXV7I29haW0jVmZ9TmVRfClkZ1NFCiteOT5lM19qLUtgPXBHMFkkU0AtZk5Cd1JGYW5peGdPMTIxMWI8RSF1ZilvUWdXQnt5Y1lMS2pYSmd8Pk5FRn15X20lQjg1ZDc0PnMqMjc2CitNS1ZMTjhQV2BDfX5lJXI2TloyanIheDJPSG5gbWZFKHhtMGp1TUltWm9peXx7MWs2WSZBLXU8cD4qZ0JLWjx6NXpHYExvJldiKD1IXmk2Cit+c35PSGM7MXo7T1FzeTx+Qk1SdHNaQXhueXc1XnxSVHMrdU41Km1qVmFlVihQTCklQz9NbHhYSHRZV0I8ViZaTXgjXntDPTZ6TGpramlXCitlNV9qIX5IN1FNQTxsVTxlJEQwPkxmKzl6PzRNZWEwYnJwNXxHJl9ITnl0UkRUYHx0LUVTdyhwKD99ZVU9cT5CcG1hTFFibj07MTs9X2p6Cis7cjxVYVhTX0dmKio2MnNWczUoIU5aekI7WFhMSmBuTl42NitCcV58MHw1TWtzWVBNZCZkbkV3QmN7TGVQXk05fWFnRztZSDkkcEItbCkhCisjVldEWHNsMjs3ZD9iIU91KHwtTGhQaE00b0MzZSVvPGlXekJXIT9ZSDJuQVEwMDZvbER0LS1kc19WOTtSJGlYJVhkN2drSXFfS1FhMTFoCit9OE54X0BkJG9Zb2hpfUhuR0ZfQCE9T0NQVClCc1peSVhGTWAmUEZnans0aHRqYUs5aWtrLVp0MmJBZSUpdU9QIzdLTDZ6c1M9elA9cGktCitNKVNReClENXlRQXJ0cGZRTmNIREx8Sm8rTiFqQHNSVTRrKU9GVnV0NUJ1M0M9T1VxdDQ7ViZpbjs/XmRKWG4wSWlgJWYhcH5JPF5DaUx5Cis5Zzs2WHtjP2BLdVIoO1BFK3tqX3UoTk1XdWRtSFR6TVYza21FfVRWTXooS3ZlQitPPE9PanxTYzg8MVNNPDF8UDgqQFVqemQyKlF4KWApCis8aT5LXzhwOGN9X3YyZylIfCNzR2JCaEB8QG1IVj9UVT4tYT9mTFcyTj9kK1EpbmJ+QCEwUUJ2SiNtWElWVH0rNmZaRTUxM0VAJkItTDkxCitXJlYoNX1qLSQqQzclbClAbl5janJVLTNwQHV7N3FFJGJnO35qPV5FU3Y2PlE1Ql9PO1dxVyo9TWFPLTBIe3ZsPiQ9SiRUPEB3bW1yYUlRCitQTFc8O0pATyolcVh2MXQ/LUdTT3daa0lAeThYfihHQiUlTlJ7eGR2OUA4SUxUdEN6bEY1ZHxvbFJnVzlOMmozP1kxV3NFcTtzUW4pbG1OCitZOUI3RSh9NkplSFNHMD5FIz5IM0F3bFEyJmt5Y3gyRjwxRi13TXlDMU84WHhKPiZSZjdjSG9vODU8OGNJaWhuJnVvS0BOdDhhPWUpRSoyCitESDFaZj5LcGpNbDNBeXlsWDBOYE02Y2R6Um5Vd2l3SDkqLWMtQykwZVJ0OTZDSWA+QDlxUF9TaVReYTFiamJkTEdxTUxvTWA9JSYxOSgqCit2dUBhOUlIUmNKM35rMSU9YDVhNHdpakQ+bytMbUhmQi07cGImWGZgZVJwYXBqKzAzKiZHbzUxZ0wmP0hWPmF3Q3IyIW9IJDFAQ2xBJFUxCisoKV8qRFo5el9SMXM4YSRmM2d2UEZLUTAtSTNfRHtGR3JqPzBNTkU1IT5KM1UzTT48fjxVbk5VQFckO1ZTQmpFIXFaQDh1ZERoKSl9K3BKCitrMGNYflIjVmVsNWpUeHxiaTtGeWRMc1IxZGBlNH5ZS2E4fllUU2FXajZUS0tZcWN0R2VLPH08QTU9RXZrMHArREE1bGRHNCtqOWF1P0U9Cit7LWV1OXN8JV92M3NHLXlMfnt0cUJMZTs1NkZaN3g2a0N7clBDPHV2VXs4NXI4JEk4ZE8wYCRCaThvQXxJVkIhO2cxSHlIY3VkcUttJjVoCitxKFJ3PW5MPD9WKXFYSjBaPlo9MVFZLU8wMDtve2xAPj01cz5ianYwUlI5TjB7e1JhMDAwMVJYPmMhSmM0Y200WipuaFZWUGp9elZ7ZE1CCithJkslZVZfez14V2lEYGVvbCg3UmdEPz1Ae1MrckFCQmVZKXF6d0k4QjFLViQ/I1EpfDtLdGE8SzNZWGwtbzBsPzExdUctMk4yd1N6c3xCCit1eXd3T3dEdGBMKzReI3c/dVJFeEcwTW9QPDgrMnNjYW9DNmpxLX45cj5AMHphQWM1K0RRaX5gbjFtaGtXWTx4SV9IajBkUUdNbyNNdX1CCitxc2I2WlZwT3ppYH4tbTgta0xSbEZqSmpzYTlOaEtlQXRUc1hiQTZBMVNRWGJKKFlkR1BWMlhIJDxudXVgbHdFT1hqSSR3PnJJS3sydVFgCishI3kwTX1AZEBMJFR4YFp5cGJwcTZ2cV5TKkZKTCo5R3hZMj5tciZRTXcyKWNjUnI+aHxFPkcoI0V9bVd6YUstelNAeGprRn1tcWRPaz5XCistciRUKWdwRGxqVH1XPD58NSomRWJqUXJQKDdMKXxJWjgtVUNTQGJGSEVyK0Q2WSV5O1d2NnlyRGN2ajNlNlloOSRNZH5mR2hEMFApaD5ACis2YVdBSzJtdGV5N0R2THBLNjtWPjAwMWB1MDAxSFkwMDN9bGE0JW5XV29+M3xheFlfSFZgeWIjWipGdlFaKWA3UFoqNmQ0YlNganRsfV4xCis1ZjxPJTNgeE4mQ3g0NX5SPXRjfVghSzBZVUwyRyp1ZVJ+bSk3IXdgcilPYE8qP158JjV3YVVGNEhBWHNsc255VT9GUmJaX1U2PTtJVFI9CisoZnUlSjZ0KT0lU0M2Rl4hRUc3fTA0VHxgJSNsalp2dm9ERXE4dW9NWjJ1Tz1LQ1I8QyMrKFVRJTNMc3leQ3tBPlNhVz13Y14mKUp0e2FtCis/NjFJYikpQFd7XzJfUjNXbHEwfW9KMzB8WFFSMDAwTzheT1k3eSVSbTwqTEpSLV5qMylwOUNJQTJjYUF8TmFVdl8wfldOJmdXVl97PXhXCituKnR7YmFIUU9GSm9fUmJhSFFPWS1Nc1RhQ3l9a1lpfUY1QHc8S25FOTBQNUJkdVM3ZG9gZC1iNH4mbiRYeU9ldUpeJXAxWnRPKDgxRit6Cithe2FpWHxHaEtBJDh1TWE8MjNEdTNQYC1tb2YhYDJKO1VLfUlRWTAwWTtEWUBrYyQoPmkmZD9wUyhsbl5ZR3AqdW1iR0d5N1ZIakluRyhNCitATEt+ZTloSll6Y2duPm8+bDxgN1RJYW1KTyRXamNKc3hGeCp4aCZHZyRVLXlzYWxANHNJWDdaJXt1byVPam9oVTNUT2QpWkc7RjFmWUJKCitMKDVpbD5mN01HUDRtNmtAe2lkUWwtanpGNjY0MzZYQUBXVFp6eFF8KlckcVZeTTBRbGUrKUw9MDlfNUNIQSFDfSZARTtxNmVpNWgtTmxCCistWVdoYzZEVXBOLUdRRk90SlVjKm9hMmtLeWc9NkZudld6KD09c2tmaXVgSTBrfmJTbFVDKjh6bUY/SCRFUlFfPGB0dCFEWT1qISVaNzRzCit9KGNBdy1QSUgmc0sxemlwaCQtKy15Sj1AfUIrMz5McSpzPTdPRjZfNH43UUt2ZUxUWGdGTGNDWDY+YGplMntTej5hMTtWSVZzTkZINk4mCityS3JwcFBTJDBgYjMlVnRzJXx6S1YxUypwPFIpN2FPbHNFPzMjPGV2cDw7PCR5Z0kmfklKflJWX1ZJYzljLUI2Q2V+dDNVM2EmTEhnPFJCCis/UUZUIVdtREcjUkF+VVVNVWdGVj5QKW5XKFdAQEdkc0I3c2hrTGgqWTZnZVkzPUx+R0tzIWlIQzQycGR8bXo2YTBkNz8kSm9MSzFEJnZoCitsLV5JUkNkKHpCMU1mdDZxdWlhO0RJXyhOPUdRWnRLKUl8ajNJZzZUcTkoak1OdmItfipHMDRqT2AoeWMpUFpObUIrTnYjeTEtQEg5dXFsCismNmxXcygobyFkbEM2Vil6KzhTdnlDZ2B0fCk9bHcrbUBfIV5qOz0xYWtEIX49T1kwdVpCS2RqQWN4IVhLeSVHe1k8PHI+Qi0pJVB2X0ttCitrP2xILSlDWkRXTCtpMGNVQUdnXyhJbzNXQUZmJTszXjd1Rk4qcTM8U0N2UWNLJUtlKj5gbU0pKzV9MEd4dn1wZntPR01Ifl42RjlIOUUjCis8RHQ4KDt0SFMrNH5IJUEwbE9mWiUpd1k2RCNQI0Qwcz5VZER5SWdIaGU4ancrUEd2MzBpcVdYSzFMamZqVj1vMGFzYCYyZi13bUFtbDVfCiteZFhrPFhqU25WZ1hKPV9aYzc4RnBBfGRAU1VnZDF+VndpcmVXdENoLW4hNnNPQ1U3QyhnRUBnUjlsRGQ9R2Q0VXdKUkhLYFIkUn5Hb2QoCitoTjZjayEyazY1akIyciU3VVg2cCNTbW8hKit0Siple1N8WFdeQUlgbmtnNkJmJXRgbWYzaW5YbndHbCVRMyt8RFJgNHglUzxhfVhsc3lJCitXcXNuRkFeQkZ9WWtXZyNyaEZDeHNmaTYqfUZ5SVM+YUxBbGlUYXN9KSs3JkYkdX1KfGQ+M2o7VD4+Zmc9aHNReF97b209UFMkVTdQSFg+CisqOTFReGBvP0UyfUVvI2JoKGRMMHBtSz1QIz42TkcjUVB6RzNGPyVJYWRfK3R+JWZHWFBPT1UpMm47VDxaX2RZeX1PWSg/fnhnIzsmdkYkCitoNykhP3o4LUlwUyg1Mk8pXi1SUSZvbih8ZjB8a1JyTDF5OT9feXI+Vno9SlVZKktMdTgkQ3t1cW4tUjlhRyMmcWpGejlvUGNSUU95cmVKCis4WEkqfkJlUF4tUWdSWDwrYkxYaGVJbyNWRz1YaEBeYWkzNzMlRyVVV1RII3J3VmQ3cURKWHFFRyZ4RjxSdG5NSVdfeFg5bDNvVW0wTEdYCitQX2NfQ0x+Rm1NY31ASH4hTyF+XmJmZHluRUJLYVJ5IVR9PUBoOWE8WW1kOUN8YV8xcV9PJT4za0lSWlktPit6V09VYTBHamhqd19iQGUjCislej8zTHxXbVU0YFhxKWNSNF5uUj5nJEpwS3M5RnNtRDVeTmVNSC1Faj5rSHIqVSNOdTJrTUNQK0pgZEl8TFV5MyNjKGd3ZWk9a181NzxECitiPmBGaCQ4ZVE9emgmYVJYM30zcSo9WjNucktURUBDJS02dVpCc2EoUjN3RDVfQ0s2WHkjJXF2WVYpK3lNdy1pLS1fMXdZJEAxSiFwT29DCisxK2F0Vz5DeTRUQmpELUZRc2ZlPnFJZ0t6WnhHNHJZR2gqVDVyNnxNOG11K3pNenMhcz9vTzU7NjM1fiZ2alVDcXA+JE9lYFYjMWJwb0FGCitgNk1SdktBcGBBTj5IaXwyRVR8eFBxIUF3RWB0I19PUUFlZ0IzIUEhemxxaUsrcm5Pb2Z1MSM0U3MlNz88bGhma15aSHQ1SFNeN0xaWHxaCitGRzdaUzVuIz0kNWNyQF9JTHV6RSV0cTNwJk01M3NtXzs7YCpQTlVhZVclN3haUzdtWCVCRjliTU5xWl4xfWk0Pyg+JDchclk2ayY/NCpsCisyVlUoOHh9OEIzUD9VUGsqK24rZT9VS0BjeTJgY3ZNaT4yPlooc3Q/dFd0MmtiWEk5UmVaLSo2V2tqZ1FBRnRMYWY5czd7RWVjTjFYU19VCitgJWtgMj58Mip7MD9mPjRpSDhYK345R0pARTNXTXI0JXtVNk1VaG4/PzdfY2V5OHxmUX49WENYUTVONCYjTi0mWFVXaStDJXpXMnFLeHUjCis2cyNNQyNuMm9nQSZgY2NtPmYtcmcoKz48Mj84SkF5P1NAZks3dDwhYk93K3E2cEJxcmcrR1gkOCl0JkxER2I8TVFKXnErJDJJVD1hd3oyCitEd0FHR3s5VnQpLXN3SUNRMj9PZWFubnFiY0drR1ZyJFlpOWhqajkqbXEpPDVEKS1uZ1pmVSNDYVQ4e3ZtZlY1K1c1WTl1ayRPSkFMS3IxCitpXi1RZS16RlUxcFMob1I1fktjM3hvV3dqaGtLJFdyKkhjVkdTTV4mamBuSE8+P1BAekVtWGgtQSkhTWNQNk19YGlMY2FsWX5GeTVRfnswCitZJEItRSkpKFE+bWVVZmtKTkZIUl8jQUxiT2JfTnNOMGotOGZAYE5EWG5fZms3aXJocitON01rTVl4NStfN0ctYkZ6IVhGdSsqcGdzMCVrCitMaH4/eXtaJndkclVBb0cmcjBlWSYpfEJuITd7eVVDKXNpSjgjKnBHan5iT0lheCRga0dhQDlpYF9IUzdHJUpJOXhHJWlqa2ZgYWBqMXBSCistOXRleCoqQGk3NGZtQVdsPz9YJD9DK1J9VU1wM3JDejNySGJhfEU0bDtFRHVFdWhTOENYQVIyV1dKdXduQkd4OEd2dUVlUzVDTjQkPFBOCitPQCF9Ri0rQ3o0bXgrdGJUbzMtUilFbl4rRWhCI3lRTUt4IXBwfjhibDt8MCVFdk98KFQjUVN2VDl8WmtgTD1Ed303JTQmS1BkS1RvIT5GCitgISltWCh8UShueXEhND1qKVEyY2ZAX35vcWxYaHd7PGFaRFBUKWo9ZXhwZipgVXRTWHxndSQ/cmllWDZUbVF1fC1Id3BaYCVwfXd9Q2BRCit8Iz42Uk8xQnlzZUdtc2UtR3R4PkVhXkdIT3EkQD5yUD9hZFMxZ1R1dzNtT0BHMXhHUFhvdmp4Yyl0NWh6YDY/QCh9VXJlJlNXcjQ7JHNaCitTfEFHbnRzNkstcmVwa2xKeC1iekUxSEd0elAjJF9vPStBYEFKQ2U2U2s9SGh5SXtBWmdwUyFELV9DMno3PWg2UDY4bTZEcGRXQFJlKjxwCitwMWZQcj9BK3lteX0+JlRle3BscFVYaT1tT24hMjdIcXhRJCFEeFdyZUF+Qkd6Tz5kdGVnYzZCWURDNFdScDxxRC1eITNiVSgtOVV5KmZGCis5akM2OHpJKU1gWjI+KDAyLVc1THY5ajhELV5Ea1F8P1lDe0lTJSVZJnVOb0Qhc0U/eXtTJlIzNHFVJVJ1ZW5rTmI7fnJmXndJIUdEZzdLCittVXlFQlRHMEgjZj91bzE8fENtdnRXSUBTO3cxcWhzOCg5KHpveUgqPGdGVEhfK0J8Kil+ekcoQkcxenc4IXFneVB3O1Z8fFIzb0EzPFAqCit2PGtoPmI3ck54Q3M+VFE/fWtWakZfYDNmYXBlbHNVOyhAQ1kxRmM2VkEpTlkwQGRpOSZNRUBBMUVKbXE8cWxGTE9JUzJwWjxxMUEybVgoCisrMm5nUEghJiZTVyh3RXd4IV40d35mZkp1dVhHRVozNig2dndpcDUpbCZjTzx1VSNXOE9VV3Y+bWUhU3FDX1BfZGxidDJjJDkqWCNyQ1VpCitZKXdYVk4xWnI/R1l9PlMqSENvajMhSjc9SDRMdmtTejA7dGRJQ0ViX0BaR1F4RmcpKikrVGhWcF55NVpTTTFUNC1IaXZXQmxebUJ5cShmCis7QWglVD9CZ3QqaHJ6cklhJUklUSk3TmhzU1VlKTBId1F5YVZoMkNzfWFqZ2AqKHh9NHQ4VyVxRmhgNSNucD1wTkVFeWxOY3kybi1NQjs1Cit5IXkxTV42YWJ2bUNZXlk1UUd5bGlTbVRzLWA0ayFNbk42JTNjRy1DbHZnJXYxXnV1SF5pTSg/NkRrd0daWEx8aSk5LUVCKV89VlclNmg/CitCeUpFbyNzJntXdW4/ckdEWSNFVEcxI1VPIWRDc1ZSYFV2d25gYkx7cVpfP0VANSQ9dklOb3N5MFVXVntxTEdGeUQzcyhNNCFReVNJR3IpCitpX3IyYEAoVEkoPy1Ment1SHlmZHB8NTtnQytCfSF8SVBLX2NkPHhFZWVvdEBwZDU2cmRLP1Rke0wtPUF5aDdDQ0dNMiokUW1vckpAZXtaCitAdWl2Sys3ekp7UWNwTH1yJX01I0p2akAqP0Mwcm1PRW4lR3VGKUQ0VDhiUzc+MU1PM3dIPz1rbmRDajJDRj81ck9gS0FxdWBXNnAjMTYxCitwbld5Wj4jLXdTPXM3PVFTMCFMPkEzJClgJC1FPE5ZP3VZay1iYnx3eXQ7NHtOYn1yPj1PYH1IfkQ7NmE7R0dsb294YG5yUyp4KCZPSDJqCitSeXtDIXE1SVZpdWFpQE8oPExvOEZsR3AyPjhSJVNoSHQ/aGNSYFQ3YnR3YVZeVkVuUG4qSHhxVmlaKU5jKmo7c00kOGQyKEdgIVc9Kl85CitrNUh4e2pjS2otQlJ5NVcpK0c9SFpCTFJlYWNSJDdIdlh4NFBTVkt3bDNiblY1YipSKXRUR01mZzJZe1JAJTIkNUlyPCQ2SE5rNHxlY3hQCispaD5ANmFXQUsybXRleTdEcXQ+QmxWI0owMDRMaDAwMVdkMDAzfWxhNCVuV1dvfjN8YXhZX0hWYHliI1oqRnZRWilgN1NYPjRWOGEkI19BCitXcFhaWGQ3VzBsWnNScih6NTZRJCRzc243JTAtVT5hITl2YnBxSGs9N1Q3fmsyb3lFNHhUWipmcSs8SztgLVpZNVM9JnFOZ1k4KHVIKmVtCismOEt3IW9CamQ/KnkkXnxnejlmI255PkIpZlpCPmwpTm0qTWRlZihASmUre2JkSWMkQ1BqZGp8K1l6VksxaGxsKzZyOSZqMCN0PjQkNTNWCitMZk87Mk11b20hKD9JdkdTSVg1dFNIbSgmX31wdW5tbzxCfShwcHtrKjJJNlJYQSFsYDlQc2ExJkBGZCEzMlRPUyRtWH5nMCk+bWV+eD1fCiteKElvPzR2WTQ1cXpIPnsyQShqNXM1RHZCXiowZlNeKGVyVUZJO1pLZ2k+dnExdlQwUzJLQTQpIThFR2xRfDM+K3dJXk9ofCtwQkY9WipSCitVRzJUS3ZDXzclM2RMJl81azBPPCZHQHM2fSYhaFc2bCYmY2clM2tDclBXY0haP2UtbyhzaVIpJjJ4Nld9ZHwpZUV3MiVMdUZ+NE5vQmM+CitZQDI3T3t5ZlFYP1VUSVpWTnNTKWZMP0UlLXROfHEoWHYre3RiZDs1ZVZ3M31gNDYwZzs2JVp4anUpdlBwJXY0SUl0KGZwJmZQZXVQXmtsCis+TClKbzQ7fm4lPEV7PClRJChYbzY1czgjTnNZXnNlRGhPcGpkUW8kdGtUb2pIWSMtQGhBSXloSnlhV05hemtkODFLLVFsa1M/YGE2RiFWCitXbyFUPz02YUs7SkI8UnI+MVZCVChsemxQdyRYalJ5PF84aT8pZi1fQTchfGFpbXludmVuJTQ7eGozbCFyVD1eZGxqMGFndzxrMD4wKTMpCitoK3VtQVBwWlNyVWIxSWtReCklOSQkJDZPbV5RVDcqbUdaQXlLNyszI3p3VzZAJnt5KEBlOz8wPyRCbFIkVHhfazR5eVY/PHdLKFdjSG1zCitecSZMdk5LSSU7T0dmNkpMYnliejZzbD5AP1NRSGFEQUc2N2RRPlUtQWRoeGQ5IT0mPj5ZOFk5QWBmfVl+aWdHRjdxRD96KTY9UHlOR2BHCitaa0NQRG4pfGZzO1hPPWB4IShNVEVGLSlCcFclX2RHSlBBT1NWLUVhbH01fHFEMEpReCVUYXAmPF42QDs+S2VQRldCQilRNVl2YilpbFNLCitTYGRRaD92ekRATHVRUkg7XmVVbih3NShOOWIyQ3Y/NG9CZDNZWFYhT0kwWURZRGAkM2Q4SyR7fislO2A/VS19JCUrYX53VjdueURXK2VLCishV0J+UnlleDV6dysydzU+fEdIYGlfcXtnaHlHZSQhenRaTVNtR0BPaH5sVDF+MVUlckRAVT9eWDxGan1hTzdyN2ctKDdRTn1WNGxjTmY4CitePHJ2bTd1bWMhJGltKDUlPFR4SSgqU0E0bURSUHI8U0VIczEofXJ0dVRyKCV0Y2olJE1nMTQ4eDhDV20mVnV3diRMLTd4YVp3a2BzNWVTCisxOThjJEZ2dTFkNChoIT96IyZsV1ZNKkYrSklCelV4ZjR8MGZPIylrbyoycCsjIThgUXs8NmI4JmRxVGAzRiEtMHxYUVIwMDBPOF5PWTd5CituO2xpMHVtdTFCKWVpc3dDSUEyY2FBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZLQV9UYSVwcFBYPThJUGFDd3ppVGFWZn02bl5KCitkYyZRTTlnIy1xcyl1UUYweUtRJFdiPXV2UVFNSVpAa3gza0kkQkRESEdZcVp6LX1sKEQ5bTNvP0pjTH0lJkVMNnZIcUE+ZTZpUDU3TVQkCitqLSozWExPcXw/YSsma0BOblduclojbGdOSX14WDdfZXVfN1o+Vmo7PVZaTEdkb1cmTmFXSVpnTEdHOUZVRzZ6KzZaWl9pKUhaX1phfWlNCitsO0pMY0o5QSl+TlJ7PllYaW09Wm9HYV53O15TK3YjKnRrfEE8YVFiQSZ6REl4LTZVfVVUPS19OGJENzk5alh7UzN5Ozl+YShmU255cGlGCitjTn5PTikpeGt1Z0p6Pj5edEZEQHB3eWNzPVgqeypKP0coNDsqZnhSQHZrcllWSzUzRzc9MDExMkNFfUVHN0JfT0w5Z2tMOFlRZXp9SF8lCitxT0kyOWc0LVB5MXVacyNCckY/JkJVJG83eTdsTl54NytwaUFMfT9VeTJneUFYbkokd15pZHRNeyFrR3hFRTdUM2BufW9gTk9IMHotVXY+Cis9UiNONHBQJWBaSnc9MGx5LVZ2M2s2I1NafEJ0P3BJZ2M7Kkk9U21fKnVMem4+WElePSRSSm4qRTVNP3I/TH1laXRuYG88WTdLdG8qYVdiCisxZmxkeHtlaX03aUE4cVUjZk85VmtYZihrLVhaJEAjUVdrd1VLKmQ5cnxaJC1xZlZTT2lhd0I/bjZDemdoSFZxfG1HcEgzJWVqSmg4V0VQCitQVXN3UWohd3piWn1EKjRXN2hiOHVscTRWKnFHdEF9PH1aNG9aXnUkckJGYz53TUU1M0FQOzA5WiRHX1RsMilFNUxKeV9zfl5FIW01LVkkCispUW1gdy1jJGoqUk93KVpWSDwxQXApJTBWZUdLMVE9RnBwekRfdSFrbHFuMHhIX0B8MF5sMCklKmdwOWA9QjJ7XiF0d25JOSElJmU/TU5mCitRWV40PlU2ZjB0PHdJQlNVaFRrN3tVJnRMKWFmeTkhbFA3cT9NOXR1Y2whbXswU0JiViNHLX05ZWczfXBaNyV3WUoxemJnOTdFJFFgTDYjCitea1hMeUJyJXA9SG5nQTlnMmR8TjZYQT80MXIkclk3RjZgV3NYYktaKjQ8KTBlamMhKGZaeFhpYkoqQjghXik3djhFc0F+WHZUdHlzI1Z3CislUEZ4c0soTmd5fkR8SSpqNWA8SHszbnBAWWhKPXJ9eTFoOERXb0ROMXU2QDJIPDVQX1RFIUJGM1FTdjxjU3Z8YWptK3lYQnhTc2N4TWB9CityUGEoYHdeezdmTnR1TyFVaVk0TzZSc1Rveld2U0g8aHY/bnxASyRJRF9rZ3Q8RSRnMD1yREI5K3dxMUc2NztPYmIxakhOQlFaUEBYbkw7CitId354WCtjI1MreCFvUVNHJEFVbzBjKiNMLS1Ca00oWEx+QHQjeVJQSHJ7S19aR0IxQUIlXncoSnE5ZUclUzEpOG5HV3dVfEUleU9sUHVZCitqaEJfOyExTlNZOSpEQCFSKmltN2hSOEVZUEImWUgpLWI7e3VpVlBNRzEpdFMrU2tFNUVZJiRyWCt9eDxVPiY/UVZfTWk1PUlYfiQxWkR6CittXzlLKSptfXJmWUU1cis5ZUMoX25FMHVIYGZ2eGp7XmRgLUdkOylkUCE7fHBEQzs/RmVHKWN2RD50azNqbWJ9MWdNKFh7QzwtUnUlWXtxCitYT1BSVVdxQSNoRH1ZT0E5JFRMYDVvNWh+YVJBfGFCTFRvY0NPWko2X0tscmR9cUJFfFVQUTxVO1ZNeFYoI0kkTiMmaiZ6c2srNUcwXktaCitpP1VIKkhtV0tOZl5Sb0Z0TzRlQElBRjVWYSVYRHVROUZjKjBxdil1VGU1IUprWDw4UT5jeFclK0ZPK1k5NjNxQS1ENWxYP1RnWGlpblY1Cis8dWwtS0hpRzxOSCoxQHY1RDlGNy18dCRPdk8rIXMqPEs8QnZIV15VcHB0MCRwfGhwZVZPYWFeQVZjcWNlQlpLZ3kjQylkfnlueD18b0BQCitAcExqWitMdTRteE9hfCF7VVArVCU2KUdVMHJrVnxtX2wxeTFFPCZTJT4hKjl3RGtULWBiI3JQZjV3Zjh5R0dKNm0xKHZJNSZ4PDk0UFFCCislRV83KUJLR1YmVyt2WWwhYyt8OUklSHktYztxZlVyPUZEYnZZVHZRKi02Q0FDKCs9O2x3S3A9KHAtU35XTlV4PUImVkcxdzMyPjZLakE1CitiPThXJXw9MVorQkV5d1BqU0BsN3hwOFMkfWstM1U2YEYjKE5scTB4JH4oYUlwKCtrIXxMR24mOyRPWWJHOE1TVVZmNXo+N0RobEMtVEopCitjYjR5VGR6N3tKdVBsYF9hYG1MfXczPndAdXoreCZ2fUV1dF9CezFEIWtsKTxAIVNsYmc0Vz9GSjlCKkZoZyFLUlNEent7Y2AtMHxYUVIwCiswME84Xk9ZN3kzP19uPSN8SG9hRWZAZCpCPiheYmFBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZMUHliWDw9Kz5kU3h6ZmQ3VzVvCitaYD9LI3tfYkJmQyohYk1wSDcjVHFQUUJeNHtlJj48JHh4fCNiYGVtIytzNXdVZENFYzZ7Kz1ZaX5SU19ra3BFTHY3UEg4aTFrN35vRWdxCitNXkg2ZiVzTWJJeEc9QlpublJJdGpeO2UmP3N7OEJURHcmO35tOTUlQ0JiIyk0emA5VXYrVHlQcllOSnphK0FjUjtpeUhpbEgtITRHKT52Cit6NDxOPzJ6eCR5dkx1Sig7RXtsSUA7VUgkWjUpUXpJUzM4Q2xyNmBxfSk2PEVTSGB9KFViKjEwTmhuO2l9Nkk5cCR5MHNVSH0jY0ZTUU8yCitnYkpkWT18KHVPZ3Z5RFdtbFE2ZDQ9cUcwPVBeb3FFV3FHdno7e14kNXRWQHRqVEdsSSg9IU88SUNfJSU7JndkaHBIfU1MPkJhdzEkdF5OCis+UnoqdSNIdnIzM0VlRzdLXyZAeF92e0Z1X19ickpIezclJFRMK09IfTYlQWV0Qm50ZCVOQUNENnJNQVM9IUxKQUN+JUk+JDRNckVHO2xkCis0VTljTl5VdUU3b0t+U2M1PUhEPyV+ZnIlSGslKHJyNy1+SC0jTlZoYVB7XlF6V0xeX3BlZnRIPjxGTCE2JEFpMEoleDl4SipjYG1MV1NaCitXPnBQSFVnNWlFVXIxe3hEYShELVlzI2dZZjsoI0U0MCZVPWsyOEBFSFJSPigwRWxtcEYyYHpJYFJZIV47bVd0cHlPJCNvTHpzKkl5TC13CitzelJhKGpsQTZuNWcqcnNtP0FydHhpNUFeSThfdnwpViNJVmxwRGJPSGx6X1I0KEF0TmJAWjAheiNWYWJpVXMzO0NzeUpnRjdtbGchUVczCisqaGhjXylvX09MMDZRSjEoTm9sN0BySiVpNyUoK0Z0d0oxM1NJZS01IWdDVW8zKTw8eX1QdGdwNEhNbVZzX1R3MEFWa1ZPKXNuS14qbDNHCis/ZTk3RU4/fGtMOXBUNzRvT1d4cGNsWX12PmVSYXA9NDRua2xTPUw/Mzl8QHZZfHxzRCpjWDJAWkU9KWpTU01WNUp1MnwtJCUyZmV0TDh7CitkMUshKTFpZXxISF54cnA2TVQ4bW9QeGA0SGhfUWVsO1pCISQmQl82TF9TTkNEVk58cmZkantFVEdYakR4WXpNfjsqekQ+Mi1DNWxDbHZRCismVmQjT2RySy1jUns/V288VmhDLT1QQ1dgYWdobmplKUtiKk9IdH5+JXA8QG1UcjtPaT5yK3l4OEtNJEY0NHNVM3RaSCVEMDc3bjY0ZnsqCitEYWVYYipaNzJSK2VlR1VvS0pyRFAhPWlAUCoobENpZHp9M14/KkRGUl4tSzRzeXE9e0ZfWVBfNGd7Y2IyUEhpbztMTWFocmNfek40JlcrCis2WDktPiUpKjgqN3x4TDh0VihMbGU4fSNJfWxjN3thJTlyKX5VeDQmdWtXTjFlI0UwNmJGcFF7elFxQzEyQTheVTs0a2V0Nz5fcHl6ZTtoCis0c1Z4YSRzdHptOWdkbVFsRW11SmZNOSZnKTdmJERSOCNlNF5hfU9wT21jUT52N01GQF9oM3U4ZlBCc0dPTVIoJE11e1NTaSteUXtWJGUxCitvMGRAMjhxb0ApVEReJkJAZFRwRmg8dy03NXdgYnUpU0lpZSErRWkrQ2trbWlCRGxSLTRfYyZCcUxedEJIWHslcD1rUEo/TWpZYDZUdjJuCisqNU5vKDJAbG8zanhOcHBuOHhnM3xMV0hIbXlUaX1NKzNQfGE9R1hVVnUtIX1BIylsbmdRY3BtUCRsZEllUHAhU1JUPm42c0hSTT9VXiZyCitqZWJaZ3E8cSgoV3RlWTQ7e3o3I1ZYQFJ2aEU7UXctTDM/K05qO29HKVY/RkB6aFklYVdyTFB2ZlNfdDxNOTtSdUhySHNWd2pCK1hmO1A+Cis8fiR3RWE9RD49OTcxKGg4cyY8cz0/aHhoXjJfOWgmPVQ5fGJBfjYjRnlgSVlEMXZ6UF5GS2M+QUtVPD0lSTg7QlZ2WWRlWDBkZDJRMWhVCitVJlA5IztWVHJuP3pIRkdJdXghVytmbHJqZzlhMS0oVEwkanxNPj1OS0kjd2U4PEdYcGV8JUtVMTUpQXJ3VXVze0tfU3V4OTlOPF92SzlOCitDSmMqdm9BU310N1FwdUtgLXsmfU57RC01VnVEKCk8OGRgaV5Xal48a1hkSnphXmpxe298RDFEe3l5TVgpIUpwRD9DUlhgWWcoQkxvYT9ICitwQ1NhZEI2MlFFQFJDJEpaUktRLSs4R30+Q0pIQD5CWGtsQGc2Q1YrJDQxI1EwQG04KUNMQ3JAfF5mTUp6ZDdRT01Rb090YHluMjQ+ci1HCitucGQlQ3RGMCheWiEzRDEoPzRuaz9UTGBYM1c9MlhMRWlNQmxpUnU/UFJWaCZ0LT5eRko4TV5TNElDTiZ0UWwpalB6cHlJP0ooJndZfj9iCitMJkxVb19FfSRWaTtLOUhKK0U2Q0FiczMpfTE2ZUFeYVgqR05iZnRlKyNZeEFqb2BZe2pUc19OaEJIJjRyZEM5c3FnRVBFUTdIa29lRiVZCitHZEVzIzxyNFkmJGZJZjRHVFYzOCZnK1ZCWDMqckt4T1cleEV8RUBQMT5qP2NLU0xmP14kajdeWEVqPkd3UTdIdTh6JFVIT0lQUiQ0OTd8CistMy1yb3AleClkSWxLZns/R1U/OTlQMF8zSnZ6Y3FOMX5iPFVad0V1PjYqRFY9Sk5xeCg0YU1TbnlPO0MpNzFgKCl5QFA/XndWR1NFUXFeCitXU3xRfmo1XjhzbnclI0o7cVZxSyVHQ0o+KXhmOEhiJGpZfDJOZW1WYVJ6dFg4TVFnMnloMHRqdy04SkBtazNCSlZXb2ZsMGx9OyZne0tDCishWTE7Pmc3JDcoJi1QR1NBV0d0ZHFISCYhWGNRX1BJeGp9R0dAN1o+dzFvNjB4KUhPRGppaSlZbWhveTxZQ0A9biY9VmVuNG1OMCZOSTdgCitWKmh4R3tnVFdyOFhXWXRgTkQwdSkpaGdrbjE5MU1yQyhrJE0yX0oqTns5U0Itb0VAMlRHTnh9fjVYWFU7dnhyO351cnk/Z25MY2U3SVNsCisoWD8pX0VJTVI3a2tgZW5yRiVZZXpWei1iaz1DNUVvU2IqdDNVMDZtREExdkU0KjF4YzxGNjFDU1R8TncxZW1IaWB6S2ZTY2hyTCM/cV4hCitjclM/VXc/PVNmRj0pfHchZF5SMDxkZV8qdipMb1lPTEsjeWVgO3w1dD5VUnVSYEFqRGJqa3t6T318b3ZyPlE1R1RzVTRtV3ZjKEVGcFViCitFQE43KV94eWNpMkokdUBHSFYqJilYPit7eDdvMGMwdSNFbHlQKWg+QDZhV0FLMm10ZXk3RHRQRiNYYElRMDA4bTwwMDFLWjAwM31sYTQlCituV1dvfjN8YXhZX0hWYHliI1oqRnZRWilgN2phJCNfQVdwWFpYZDNCSUs0fSV+TyNka2dobzB1NWdPJkEoR2NrMTJ7SlMmTmNJZ1h7RHo3CitoWVJNcC0hV2Upc05pNGNlYVBzI1lUYmE/XzYlaUMwUnVQfXphZGM4XihOTyN0PHp0a34wTjNNZ1omaFVVO0Y5NXxPVGVtPW9LelUlO1o7CitzOzI1b3FWSWVMTDh0YG8lc1JZblk3XjFJNUlpX1kwMjFUJkU7fWlqTndIWmZPUTQoPmkxJEI2Wio1YGI0azNiQmUyVUclUDdhTlRRIVN3CitzQS05TFp+Wl9iWF5GPE5EM1daQWRYMmFmNkNlY2dJMFRtYzBaPlo9MVFZLU8wMDtve2xAPj55OWFqOXkwMDAxUzBSUjlpMDAwMVJYPmMhCitKYzRjbTRaKm5oVlZQan16VntkTUJhJkslZVZfez14V3BnaUlVdWtZPmJZRVhDYUN2PUBGPmVBZjQyQWRuaW5tPV5feUlfckRrYHhRMzkpCitwbHFRb2J4LVgpUmFxd3cjVzxUd05pblZpcWhQdFdjcGohP1NqcFYkTipReHRfS1BlRn1ReG8hLX4+I0oocl5GVGsmeClVd0omcTYqYkZtCishUjA2dVpXXkIybmhhNVMxT197cFJgQmJ6UzNNYHtRPGxUfGc5MTAqI241TDV1YT42VzJJbG9VLUMlJih4LWQ9emVQb2FMOChoZiYzY1pNCitkZlQqNUxqXyRpXk9TOGZMaCtXaSRpT2JGc29LMTtnVzY2eC10KW8tfVYmcG9GNlhIez9EZzRSUF8yNSQ+d2JTMFo+Wj0xUVktTzAwO297CitsQD4/QXJ3MEY5MXBvbGQ0RkNXdzAwMDFSWD5jIUpjNGNtNFoqbmhWVlBqfXpWe2RNQmEmSyVlVl97PXhXcGdpUFg+NFUqVl97PXhXaURgCitlb21YdmQrY3BzWD9xOSpWQTFZXnQ1X0RTITd6blQ9T0BJUHY0NVpuenE5X0RmSXpAfm5RWHVJIzl7U15WTV5YfUhDKStUNnVfKWdBXlcyCitkWk97PXRKNipwQmFSdWtjdSUxa0R1UnQ7LUtuYFRjUzMjSFJxPD9CK156PUZePHVDSCtZeEA2anszIShTKktHRFpzKj13aDEmaHg0bElwCisrcDA9dElBJnF9OGdmTDNiaTxgPWI5bW5NP3tPUyFOKkxYdmtDeEdUVWxsQXRCZTJIIXg+cXFZOVdVQ0pkaTk+Pmlrc15eUkAxdzlHMnpyCiswSzwwIVo2YUJHb3UoO1YhfD5aZ00/RWVPVV9QTl45UkZEdjB+e215VDR1RFR6e0RhMmt6Nnc/ZDkxV2B8Y04pZV9tWCh0KkMyT2EjMXI7CitxQXpmKzdfVCsoViNuWkY3O0J2OHRAam5JY3w4fStrJWFBJFEjMHcxakE8Yms8PDV0e2Z9QyMqa2N9PXNrT25KKit1UzwwbG1oTHkrISUlCitgXyQ/VDdKOEIzbmpXWWR5YGJ1NzEpKmxwOyVDWnRzUUNudHFPKWNjd1B5bnE0PGNHITc4Yy01VjZTTklxMztEbyFDK1hxfnJaQmkqaFJYCitzMEBZckpZVEBeVTxsbz13I2RMb2F4d0tgRSkhcyMtKlN6YXgjdWIyMUpmY2p3YG9rU1BAUW5HdTJCO0ZjeXt9d0NXYUo/UVYhOHExZE5VCituRlVjcyYxamI5VmRYYiRAPXBeTDdyVShoZGNlbEdeQSV5YT19ZllDemc/OE9UQjlhLWxkUmckYnEqRWJSZmJkTis3U3J5M2dkSDF4c0Q/CitaSTtudCEycl88KXprMiYpTT5gZHgtKm4hfHBuRUhYQ0NkdFMqOSV0UXx7cEY0LWVWbjYrcGJ1VyprN3I8NT8qLVgwT0hGWWBFRVZqOXNFCitOJXYxKDZIXiNWJngwfHxhfH1Zc0xSZ19CQkdSSUQ+SCloMmJWSjdiR0JfJFpJRlc3Nkd1cS1aU09PfTZfcTc3RkQtMEFWcVNRQ2ojKT98Cit9ZztyUVUpdG9VP3NaQ3dQe3B6RWpGZ3cxWjclfk4jKTxLOGAhV0daZ24wUlFnIXB7K15UUmdSaEtpJSo7MVh6UkpYaTBpeTtXWX4rOyZ3CitIU2FnSVNmbE9hdSZWPkBYbWFJUnNqNmNZaCpeP15ubV9xZU9vQmpoJEZRKGh+QlRxPFRtMDh9TCR6ajtsQWdsNClNJX1HRFExRXQofSZWCismPjslTXReMUljSW5kcG4wV3tOej9+VnBpaSVPWjc2OXBMa1hYcnNGVXw2Qy1kSDB8RGJMc0BHQS1zZUtQISg1aVh9VWltO3tFJSFURFhVCis+djt9Z2U2dVdZPjNfQDxgXj1sIyNAVX43JXAtNDJkXzhhU3xeIWFhN20pWG02NyM1aSZpfVZ3SlNwT1QwbW5Aaz8hZ0tAZmpIeTJZbmR1CiskanFTeSFYKWg+TDZRRF9FRTFxWGYkK0FzOWlYSEFAT3QxUD8xIzdVXzkpNj5HNFgtXlctUFpOWj9KJT49eT9TKU0/MTskPzRVMmcjVT9jCitzZkF7WF48VCh3WnZzcWZmYjBIcVUqZCpaSzcrVDZlUEIkeSMjPF5NRVRgcTdZVnJ7K3F1SW1aJnl5RWh+OVNfdipjeHZwPjlKVjlQMWlVCitfXmtzYmVoMjNXQWwrU1YrTmp+fDRzSFk+ZDRHey1vPkckd3VRNCEzYWFJVHByanojUEItc1coRzswU3lkU3Z5anY8LXN4JCV3eXVVYXZKCispQD1iQDl1JDhUKmxhXn4tTkJPcCV0YER0JVBLbW0hVD5edkReRVlLMUhnd09ZZTJEaXd2JU1NbXxjLUklOVR1ZztVZD88OU4wanpTX0Q0Cis7PFpNcTE/ZmVffkgwZ3Vpbm42PlNndCFjM0d1I1JLKkNKSU87aWpxVz1CMjszTT10QGlwR0h7NG9TV2ktZTA/RkYyYWZea0JreCo4eDs4CitOdFprPiRlcXVBS0kpRjRWRV5IeV9Hb3ZmWWhTMG1jSmdraFNjZWteWjs8fFNpemZpaj9TfEtgY31GdE48X2l+V3ZnWSFjanxhZXV4WF4+CiszY3VpbVgwVUNlUmBRTXoxcl8ofDQhITV8U2kydComKFJGNTNNKTc3OGV9VyhVKFVWOCMpXnN8KF48P1RWPjtCP05EcnwrUG9hPUdne1FkCitTaV8xVTs3UTdHX2RNfUtiI2BrcEk0Ym1yWUpDV1FJentqMmYraVpZQ2dWKUZAaSU8alMqJUpEWilPOUtRSDAwMDA4MFB+ZD1ON0lQTFJICitndnswTD1wYzA0QExrMEJ+dD1GSkU/TFplKHdBRkpvYjJYa313PlpnZ15RWSVnUEJWYHliX0ZMR3NNWD4ocz1WUGp9ekVedjh1USUhSCVGCitidXU+UzglITFQRSMtSWg4em0/dzk4SiNGa29qdnZGS1dARUNtd05IdmZMNHF4ZlQ2YmcqZGh5fmh2Slo0NW1xKWdJez5RN04kZkF3JlhXCistKXlxTTdleS1vcVkyNk9JRU0za1E0fEpTcGdgS0dnaVlgIW0xTEBpMHtFO310RGgoOGZgfEtoMlRrWT9uKUtjfU9EN0h1NVpna2hsT35FCit4K3JaNjI9X2MjUWlPMjxkQVg2YHNSbUF9NTZGZj89d0BuTj1IVSF2fjVVYmJPNFl2WGBgamxWfF91dSZPYitfR0MjVmt3TjN1PlVRO21kCitadC1jfDdWWTtlYm8oPCM5KEcmWChMT14wUkp6aEZhTD80VGg3UU9iSHROfGd5K3lXIVRvcFk8Wm5UNnxvWFRvZG1aRE58bllebCRlZ3VACis7fn1DVGZ+Zkh9SXoyNWpUSnoyT0JYeEpfVjA2SnMhSWNiY3MmPk1SaiNMQyZeO2ZoKGVjZSQ7bT84JiY5ZU1jY2t7PXl7eFhNej5qbTE8CisjKXxHKXRHIzIpU3pTMWY1JFpHWDMlbShqWUF5PTsqNyhhX3lnU21CZVdyJkE9Vz5HYmBHZFJOc3ojTCg5KTBJPng0REBQNitSb3g+MkxpCitOOCtGNShgQnBXaCNIZkhKQyFBQldwIT1kU0JtQyt7PTRXSSQwb1VYfDlIbEswOG1RPDFRWS1PMDA7b3tsQD49WU4yajh2MDAwMnQwMDAwCitXMDAwMVJYPmMhSmM0Y200WipuaFZaKXxVSlZRcGJBVXRlaSVYPj95LUVedjhHajZEbSZLb0NVeGB4T2ZvWTJwI1IrQ3BQUU1Ra0VpaEM/CitASUBwMnBYUDleYHxfeXR6T0psQE8qYV8pTWVPQX0kcy1wMG15U1grcT5kemZZdXFoVjFsIUhqY2Zadm55NDM0T3A2MHdVfS1kOWcxR3NMCis3I0x3UXZpWEpWbW1PMkFBNTdDQmxvT2FLPXh7SkhOOF5mcXZTR1d3PjN+KD1+LU1fSEhRb08jO2lHOH5IKXJPbjtPNGZEVXxvQSpISjdqCit1TUR7Umx5OUJPZEQreXJKaGhyMHxYUVIwMDBPOF5PWTd5bSFwRjFHeT96dDAwe3M5OH5efFNhQXxOYVV2XzB+V04mZ1dWe2RHNGEkIypACitGSlckVFgpYlZpd1V5Q3crQmcpM0BCSXtLJGMxNF9pNEFUdSU/PW1GeEN0cU40dkApcWJ+XyVgOTYrcys4QSl1eStwaT0kNz43fTNiRnNiCit2T1B+SXVxdkshRjF3e0dvITBDRDs7VnglSFpVfT4wIWV4ZEI9ejR5eTFCM1l4ZGhlcio+Oyp6YlEpQnwkQVBgfFppc0gjVWg4NH1RPEc4CitOdEVIK2ZZSGVjPkRnZiVrY001MklqRzlOKkBBKUtUVklpJmVnYjs9eGVvSDl3LVRKPlooSChpUXZEST1OYUlDSTJuKmhzbSV6UHY9JWQ3Cit7N1E0d3NhNGE9eU9RdHhGdkBMNk1SakNPVzd8IUhMdmxlUV5Ld2RjRDZ+WEY4OHdUSGpxfjVSWiROY2NuJTtPSSg/MzV9N0FES2hlfiEqCiswbHJiO1ZBYzxmZSFaJGd5YVFOQDl0Sj4ofkpuVUckdkBJKlZEe0B7S1FuMlN7Km5eRDVFay1uZ1gqYHlJNklKXnxRKTNGdFNDVTQzQE5yCitlIy1TalNITjs8aElORWdVcXc3b3hvTnRJYClaKG17dnB7TykjfXpMaTdlOTxaNmpgLTRIbzV+QX4hdnp7aStmc1QmcT1JPjdJKzZwRCo+Cit7PnIwQCVmMEVmKjEoX35pQld4VW4hfENKWEV6Jl9Ie1hDc0xoT147WSlLUjQjZ3dkQ2BOUWFnNT52VWMhcFprNnI0IUBUbGpRbyNBKj9jCit6NStlWUMlXiVXOUgpbjAzdy1ANVUlYkpmX2MoSGdHKW00UXAhVz1NRDxRalctKVlSNiV9WXhDezRebGpzPWFqTU5JIX5kJU0oeTAwMWJJCishNGw0OTJSRUMlKT1LJm9me2E0e0xAfnomR0cjN1JRcjE9bztgWDkqP0p3SFA5PlBjISp6eDNKa2FwWntvPSFKT3YqTmhgeG9CU0JqNFlKCitsPjhMYVVFUWg+Q1dSdDllaT5PeHEhdDYpeVlSViFpckZ5OXBETUc0OChyNyVlbG01OC1ERGkqezNfVExtXioqK0BMQlNWTjFmNzlUUXxjCit5MThBTFN8I3pIQ2oyTF8wOypPO3cqaF95T3MkVEpaVXVeMzhLT1klYmRIQyhqSE4oT2Z3RVNiRGUkMkp4Pmw5cVYrQm1EaiswOzIzQHsrCisrRlBpfVpuKmpvdzBSbyE9MC1GSD5uKmpvdzBSbyE9MC1GSlh8Sk1NJVhMRXE+Kih+NkRIVl5vbyU+PSRAYkFqKktZflh0fkFOWEZ+Mnk9CitQSlVYRnM5OSRmfTdKO1R4Y3Y2QEJWbGotYX05RzUtYXNfO29UKSkld3FJUW5RJlpgSGtlSmFDfXBYeHA3Yik3eEBQRChBSDVaYUt4Pl59Cis+c2J0bVhVKlApaD5ANmFXQUsybXRleTdEeFZaeEdkdWQwMDFyfDAwMUtaMDAzfWxhNCVuV1dvfjN8YXhZX1ZZO1NVNVpEQjhBWmdYakxaCisrQl5LR2NxbzRkOTdNKVpgKEskeys/Z0sra0I5bVE7ZldQSTNQV3ZhMiMpJlpKR2l9aWQtKVoxVnlHfVpEbXFSUWNabihgYD5TZHEkRy14Cis3Mm48JkQ1OTV7aGNtLXhoQ3swUldYNmspJGV2ZTx7SzhxSFJ0WTJUNlFPZHRBdHkpMnIoPCR7ZHFHWVFYTChYZU83YmtGT3d4ISpPM0JzCitiWTxfKF5DKEE2UzxHcE5NYUd7OHgpc0BgSD5YT1U3eWB8dTVHRVNKeGg8IVNSPnp9eSpHYHU9YihyQFBLUiY4PjRzUSp+Q215OVZZKXxLCitYYyNfciVZIWl5UXR4ekphaCFzJHNSNG1YUUQtYG1AKFU/JHw2R2NhXiVVeSkxXyMrODEwd255T0NOWlBUJjUkR0BJNT03JTlSJSNQVUMxCit8bzk4RkBpZkRIdkhMR0VxdntjTSVDUHl4IztQbENUOWFQc2lxJjIyQXJyTzdJayktOzFPdXMwakpmdVFYS19Id1hnIzdoZyh9U09ebHpHCitGXzJHIXVeN21ZN34ocVJUK0U2TStzMl4hZHhWUkdEUWwoZXs5SC0zejkkeDVERT48bz1RYlFDIzVpYTAtfW9PeFVII0xAZFhLOU01YnNzCiszTF41ZCUzdmdqJnd9UmtJWjw+JDZlcWtDOGYoVmNjUGIhS0J4Nnp+RUNuTENXQEV0T0lBZldMPDUxRmszNHEkb01NVG17KlNkPG9lRkUtCiswPEBCJiozbzJ2Xj4+dzFSSGZufDUhTmBTeGQrLVkqeDF0Z3pPMDVWPileTiN9NG8+WVFKWkQ2JFhmPCNaTEtFaDN0JUJCIzxHN05WUlB3Cislbkg1JnB0WDxYUUl5blV0JDJkXkRRO35XPClRPjt8ajlAYWBYYUFxUDVrZkp9NzFMV0g/SG5MaShyV1dTWTlseXRIPXFKfFl5MiRBb0I4Cit0U1I9ZTs2PXA4V19UMm9NWVlCNFBlQSRRT3VWUio+b1M/SWxUOWkyKDlaTGtMTktEPUUtRzhhYHAlKFYkNTRBTXk+elQ5aXVKJHBvc1pqCitmSiMrcGJGJFVRQHFNVSRtMzxuZlprdzUzTTdfb2lsR3RsNEYyOEJWTVlXVXIraSZOTUdBd2pOMmpNPkFId2tNKzFKSXQtOzU0TTtYYHV4Cit1aiUxR0E0aWFvaDkqRUBDM3NHNXQ9OzRqPy15bGl7bjY7M1pmOUgyOX0jX3c7QlFDYSpCP2lKdEI/KSlDJj1lU0pBMXA0M2pDViFeJV4zCit2d2ArMXR1cCZoIS0xYSZ0VlhtcDlZVnZjRU9XSTFGeURyVGAjPkU8PHchd05sSHN5aTxkRj5xKVYkXjAtSHZ5YWg8Y2dPJCgxSD9lMCs8CitRS1NLP0hIR2Y5fnZpPFZkcGJrWShfTnBGUE8wfm4qZWMxS0NVYXd0em85I2cpd0JeWEFpSkM7SiR6YyNZPGRFITtuSTt0byVZRFZITGVsCitmSEw2KXdrXmR0QD5wMGFKbDFNQXYxR21DdSFLUkZUPWktVGRaYjBKS0ZJJUQhaVV2O01kX25kOVkzPEo7Uj42RWVtcUttbCRScmBsKXpzCiskJmVVV0lhfVFMWngtfS16fXpedDEyLSluPXdVZ2RnYG9mOEN+aTBucTlyQEhRZGhDSUwpflA3N3FBaE49bWdGVFJvM3olfjFCcl4+bVM/CiswSzZvK0NyU0ImWTloQlFqdXswT05UM0dyKzYkdFZqa1d0Mk5fKyUkSiQ0PzRCWD5rdGt9PEZ+b2xPRzFaRyhjVj02TUJLV2g0WiUkPWFyCitibX0kfjBoXmBffE1XfHtke19hRmNhY1c+Q21CY0kjWn4+TE8pWVhBZXhgNDJnJU96UTJVNVBPTCUpKTYlKiUpYihPYyFtT25rUSVebVA9CitTIV56c0Z6TVphO0ZmZkFYTnJPclRKPEc0fTRxR1dycCs5Q2x8JUxMa1ZoYkMqKFhVZD9XO0BjLSQxTC09NVlaVCtgKDVfUlkwSW9wU3Z4CitYSWBXSTQ3dXl1Yi1mQF9LSFFKWDBISlh9Pmo0Tz0qSG80I3QyOHBjenpSLSYwRG9fUztKJG87NmRqYXl6eG40WXBuNlRPN29xK2hrc0s9CitNX01sUEBoOEhxKyg1UWFnbV81VTJXJT9IUkFXeUw7VGZFX1Z7TGdKSEx5a1M2NjJ3dj4wUDtPJDtNUFdFMmhQcDVJKSlkdz1JQk80R01qCitvd3lZayNKSVRwSH4/X3s+RWAzflk3b0dQezg8ZCNlVD5ocXJuMyhZIWN1UVpzLTE7LUoqMG0jenUyd35GTmJ2Qi1PVDZMK3FMIVVBXms3CismdEUqNDwrWDJrYFZlZGNCaG4pWEJBSllDZmVLKV9wbntFZk4weigrSEZWbGUjO00qYlhgfWRjMzB9ZW4wellJP3ZCdFM9Zk5hRzRndHd8CitCanxNM2NLQjMqU35NRld4eVYhYF96a3UrZmp2OSFkRlhvZnc1YTdKV0RKWT5APUxIaik0NXo3KjU1WUVjJWg9QCFaZ2hQUUh1ezB9Um59Cis7dWhWMGEkVnNaQ0cla1l1T1lyMWpnaSQ8eTltbzN5VDluPl84SStOQVk2d2FFaCp0V0RQWVImREF5enFLfUw/UVUpSTBFVE9tI18oI0IyCitRV35adzY8VEh4KUl6fm85eUpaWW0tcVEoJTRwO2BlXmV5YFRBPjltcWFAdl8wKjw1TzZgYyZTRFNoWHdqKkEqSHVjYkxOMzdvMylLOSkwCis1eGNkaWhsKUY1XzAqO3dWKWxhbDtXeE9yZyRqMiZ1QnpKQmNLZDZhU1pgbHpjMEIrVUx2dmY1YU1fY3NOe0IrIS0+WVcha00zZEVSLXQ4CitIJTlZYz9TMm9zN2RDdmZLZCNuI3xFNjFDcyFgKnJoQVU2ND8tdyVVejVSdmRHOG82ISkwYDd9aWhDOTNDPH4tVUY3YCstOXVtNSpfPXw7CitZSExmIXEmSip3ITw7JmIqTHd+WmliJnh5U1FEU01jdUgrfjcqPXUtdH18MnVHY1NuYzBuXkpuZVNyLTs+WXExa2NQUHxpdUFaKXtvJHNnCitHfXU+UE9uJU5vJUhKRT5uKmBjIzZKRzZyUDlNeWA2TFRJOXxmZTZRVXFPRkhZSnFsP1pUeUdDV3QpNU14OytFYlFlYk1qeTdYOEgqN3FHCishWmFITStUYCF0K0U7cUdyfEtpI0l4WEtBO1ZFeXltbFh+QHNJdW5odDRUOHpJRG1zPXJtbDM5SmpyVXp+fCllXytxQ05lJFdiTUFwVz5SCitIYUV0I2Y/XkVRTT4kQUFfS2NeamBaI3ZpYlR6c2FQcnhvYl8+UnJmJnw8WWw9JG9lfCtkVTF9YTFZeTwtYUE2ZWJTcmBNNEJqdDtFIUx+CitEJFl9XlU2QlotWCFnKzxPemQlQ2hzIUVQRSgraC1naDYyWHNuRkBuOWZrJnY5UmhDbk9Wak97KUoheX1QenkxMSp4Y2pjUSYwaFNLZ3ZaCitmUHQ/emZ7NnwrNU8rZz89ZnRQMndtYDBzcjE7e1ZIc2I8aD1SKl5aVUlCY1RodjNwNzJTVUEmNWYoZWY4KF5WVXM9aElfcT8+TChLKGkyCitKVlNLJS02Kj9CME9YR1g4T0N6ZHZ7fjd3aEEtTmtgKkJWP0EhdzFDPzYrO2l6QkVMTnt7OVhaP2Nxa1opb2RvY2NzfChtdFQ9UEZgaDljCishMnM1SVhFeSMtZ0A1Umk1Sj9jQyEtPmZHP3VCTEg3bWdfezEqM2BGYFhlazM9V1pKalEpPVVWNkQrX19OJiNVOzQ7JSs+PCZydEJ6YXljCisrR18lS08tM2NJUklEdzMkYEYkKVRNUTkyUFpZRSNFa2pzY2JiUWs2bFBNXmJNTVRjdz99RVJ1aHxKJiR4RFJzKk5wa0A9KmczYmZlbmV5Citna2lRMzB1bWNqRDlJe2JGZl4mUFBaKVNKe1hoKFIxX0opVzA/dkRyUyVWVGU+WUBDd0N1Y2NIVzRtMT5fP2tiMjRPPlpaK3JMUXJjSl52Cis0VmpxUkBWTmA5dFE5LStlUFRrSFRIZG4kVy1mdiYtO2o+Zk90RShoPjR0ZmVEUEJIbmBqYFRYaiZSbVdXfWV0UHAkSEBvKj9manE8eS1zCit+OX4oQGVwdHJ3NEBxIShOSi1QWlhTQ2dYK2xpO1QkKE93ZjJJdTBOVlZyKEVuIXpLaHlNU29fSDIpdC04byg5Z219dkV2dHV7Z0JxKTwwCis+QDY1VyFEbSV0aUFzTFApaD5ANmFXQUsybXRleTdEdyk0JWY8PTwwMDJEKDAwMUhZMDAzfWxhNCVuV1dvfjN8YXhZX1ZZO1NVNVpEQjhJCitaZlNJQlZRZ3UwV2lEYGVqWntyPCtifDVoYCZTVXlwKkR+alRYUCVXITxKPihoTXxgaCtoSDk3d1dlYk1pZXltb3ZpJG98QHxXeSVPJGBMCitHYDBAQmlLSTt1Xk9taVordU57MGRURFYkaF8jKChESmkqUHxjazNLSi1oRzFnXit0KS1BfUlOVStUc2M8QjdGYjQrMX1vNXBeXiZvTD4/CitNTDR1ciRNKGhWbmp2UG57cklZMko3bUNoV2NVZikzUHtsS1BzXlY2Rz5CciF+NVhJKkpwMlpoaGZ5VGotfXFSR0xCQnNyMzM4WjRqOWloCitTcFo5bWAjNUdfdlFqUCFeZCVpNF9vOWJVVUZgbiFRaGVwTk0xe1FPeG92dmRAKVR4PlU1ejFYbUdZU01YJT9BMCRgWWF4b3M5QmlaIXRvCis/PnhORXBuKylPSUR6YjN3OTg/PGxpYSVIM0UpTUo8OUslcD9ecTdVZTZEcVRIRiNETzBOUVZweTFPZy1raF49bCY8IXVVfGZ2Xmc3JV5RCitSbzJ6dEVBdUU2JSpWUWRgNnZnYikydTtTQEV1S2ImS0JkeyFIWjAyaWk8RmNeUTRDe1pvcCg4cCpYfmdTV2FhSChaR0M4d2prYClARGt4CitwRWlWKTlWJFBCLTZYdipBNVJSNy1OajI2O1dTLWJ7TXBvdXRUOEVVNTYzckdOZ1l5MElkLTBZUzxsQWVDdEhqP1UmJndCYCZ1cTU1RDAmCitJZDVCJEZYLVJ6PzFAbCN3ZFNfdEdhc2Q+VVBGdDRNdygwfDcrLWZzN0lkOWt4am1nNGkzOz4pSDdvaz9vQU9YaGAmV3d+Tn1uLSlKZFBQCit3ZzN0SUN9fXJxTFl8YFZLfE1vO2Z4Y0xKWG02TiV0VzxnP35ePjB8WFFSMDAwTzheT1k3eXYjRmtNRjlpU3EwVGNpTDlSTDZUYUF8TmFVCit2XzB+V04mZ1dWe2RHNGEkIypARkwhQmZHY3FvNGRDZ2FDWj0qJkt7X2JDfk5efl9gM0NoZDJzUUtWSFBVRmdGTjUtZSpiVUdtbkwhaWExCit3WSRYZVJzSFhzV2ljIV5raDR5ZWlYdG5fSm9DIVQ/Q2RFUygpRV9iRk9lWEIoOXshPW15IXBNaTNHT2ZeOERoO0NiIU5WeGpHdnJVZERrCitXdUA1TitpKk51azg0cEtPWEdGcHswbFV7YkJfWDNMdldlNUIkSDkoeiZmOyROY3xtVC0qfk51PzhPYFZVJVZuPTgqIUg/ZEBRR0p6JF5gCitNbmJgM25JPFZ3ezBqeXM4JCV3eVhMXiNXaXkyI298dWc0JHs8THk2Zj5hZTZuSW1+SEElU2ViKTJBSiYyeDEwaCh2JW1qPVdxcyRgWDlHCitBYkMqTDhiU25uRiUtS24hV2hYI3h2KTZRdUAoQjtJTm5jO3VzZHQ8YUVneE5oQGh4biZTcSMxU20+TWFEMyp6VXhPR0lgS0ZnUFp5KGtGCitQOXc3WDdmQUx5PnMxbWJCYmQ2aU5gcllycHwwS2EtSEZQR0A4MSVwWVFLU2I5WCR3cEJiaDBBe3pPZW9TZzhTT3lYM2tePVdFSEhkMEgzCis4Xih8WCsob2xyT1FMKj9sVkliLS17SGhrZXdvJCpkemRqISooMnEjaC11bWkrPzA5YWgkKH02WVFsMWNwRWFOeDlxND0tT2VYR3BHK1o/CitKQFgzM05TSl9IUXdmT3QzezRhb3p4R3R1fGJxeCtsc0hJOWkzXjBFdz1eR3ljdE1rdzdsTWxxRyQ7d0JudntsO2RGSU1nS2AyYnc8PnVKCis7a19aWTF6djs/PDdjNnFmSWJpR2ZTS3EmVFV3XlJ0YStOYUx0MngkLUc7OUY/MTlQO1lubjV4UiUtJDZKY2M8YF9qTEEzKDVyMlFBTDZxCisyaDtUVzIyJSpkQlhQamkqPDBTeDklWDxXeU9GWVk9OUBCfkVYXmhyI3IyR09Bb0ZoSm9XVmZiPSNDTHR4YEhxfEpgRGZadFIwUDd1bmFzCis8P3tAVnpmXk5iM2YhWiF3bV96b3l7Z2lgMGNaQktsVD02cjx4PDl1MSUzemR+TiFGR2BNPXhidypjKmJ9S3FFekk9cVcjST5pbUpGeHBXCitOZWExSENmMW80OzxAQWIwQCRELXdocntXPlcrLUNIfn5BbWJUMVFueCEyK0s2N08+SSRaVTAkY3t9KCRXanxsK3w4PlRXQDAmJTg+KlExCitTRz8wKSV2KjBAXm5MR31pI2t7NEBtNFolM3FrUDBtPCRzc1QpI2lGI0tMcmQkKXdUejwoPkIxNlRFUEJNTSZ4JFVLMyl4NkpIVDdIYWQxCis9RXNGc2d0Y2l0NiNlbDQtcD8mOS1oakVJZzYmQDhiJF5MXmtsKz5VdSktKFFxdk9ZTiRMRy1nKSVpcDVBJHQ1OTFlWjU1fFFKUzZmWDwxCitCMm80UlR9V3NNNmkhUEpLWT97O1VmY04oWDt0VC0rPkpydGl6XllWN0EtV1BJRkZzJDg2c2FZI2YyNiolVUVXYGZYPUZmVjtVKjgpbVhECit4eEBqdX1pVHlFQ3VXQDxoTDdnUEFJRUwmcER9UzlufW1FYTtIZyVmQCtjQ3tub0lySDkzNFBZX2JHJmhANzl2aXlQKSo2WEFgSDQ1clJsCisyNV9Pc2MzdFl5Q2gpY2ZVcjAmZyZEeHFaSWxMQCNWcjtFOXZ5eE1aZ31ePD9yNTY0Znh2PSF1QCFpeGpySWdnT1E0OVl5aEs7O2heKlB9CitfcWorbXU+Jkl9fTJNbiF1YlVATEY8JVV9bUs4T1N6fE1kb1MkfGQ/ODxhMj9QeVMwfG1JcSstK1NSOEVTcTA1WlFGMiZzYldQfEojZUF5Cit4VVpmVmBwZW4jczNxQXNaa3ElUmBFUmJGXlo5NlBtODEwdkxFWl4kMVRARVJJYHBeWD0xSyVkPEM4RCVKWGctZiVReUo0e3FrUkYyMV4lCitrOHtKaERhUDNILXQ4I3lfK2lvSnFxJFVPOypNOG19QysxWXFMUyFeQE4xRyhTNippUko7P2toOSVYKSUtc2t0e1QmUl5eeSFhSzM0MG5aCitVMCNQZSFvaShpMyowNVBrSEBMaVN1bE9PbkdUVENaI007ZVBvZWVlMz1hWFJEMlE+WjUma2BVVlhjJm1LO05Kez5TeVBZciYzJEhyN1ROCitARENNOChAODZMOVllQHA/YnxqU25mWHBzMERKIWVQKWg+QDZhV0FLMm10ZXk3RHRxX0NtfH5aMDAza2IwMDE4VjAwM31sYTQlbldXb34zCit8YXhZX1ZZO1NVNVpEQjhXWD5OMzdhJjBiZmRGQHdRa0o+bUNlJjwmbDMyNnNmQ1c0dTZ3XzFyeDNgM3tXb3glemp3ZXU4KCM2VmhPQmdaCitNanN5fXt4T0phdz5LKTE4bmh2Znd5YH1vfWFvekc0a2BnRlp6QG5YczAxMD99cDFfYSYqakFPS2dpKzFQSWdSOTlrVCVQeEZrUn1MbDkzCitxbVM3OTxHNC1FRHNgb0Q1KGRXOH5INWpJT3xnYyh0YUMhekx6fDdxd2NnNHIqU0FBdG0wajdVQ2REOzhSVGM2alJvcXZvOSMqJkVJUHZlCitwaCRCe3ZZRE0zdkRDYzQ/eEtzQ0V0dChnUTFjeWwteiZsNGZYbl5sRTtIPChERXhLZjklfjFoU1EjcWVedjZzO089aHBOdl4tbj5eKjR4Cistd3AmaTthaU57SyE+QzgkS0Qre0tOMGp9eUE1QFM7dVVjOCRYallPMyZPN3BNcEZ7JGwqWUY9QDIzP3otLXcrdmVHWDQtX09DPmhacE5lCitnO2tEV1AjJnY3VlNldUp2cmlpVklUJEklYSZCNkMkNV84e2dCblp6PGxKWH0tJmxlZyZpbjtLbVBTdnxYeWlaOSZGYDklN0EjIzxAPVpNCit7c0ljO2MjJEBGQDNLVyUhTzlfSzhjcjVxKSQkcG1wZjVOaz1wQHpBVng/OVZBZiFuPlo3IVg3PURhO18oWkokaXtlKHAqdFZNSipPaVkqCitzTkM7d2Q5bTYhNms9MXV2bFVJLWU9b2JufFYmdyphU1RyX0xyI3dGdGltUGBiK3x5TXx0V2B4YWdgRTN+clFHQW9TPyFrKXEyY1BQelJmCitOQjtZR28qc1gqbn5gcEZkWlNyeDxnOEtWbjZPY3JCPGtzKEBAJm9sNkxOMG1jbHJlTCo9dDIqaGNgbmAhMndlZnJeMENnY1ZWJl9kfWUzCisrKmQ1ZnBNeGJFVkFZND10TyZ5QDFsT1duX3dVX3ViQHh9R05GWDBzNl9CVEdEajxnXlMzc2VxdkkwKCoqc1c4SUgpcktYRHEhTDNNfms2CitNbmApQEJEYVhNST15KW5pOzFZbUMzd3pxQlYobzxSRWxyKC1NKms1PkQ4PWR8XnBaKVVWNkNGKCM5YmIjO0I4ajZqcHY/UyFASyhpPDhpCitLR0NpNlJCRGxWT3o9Tm8jak53RGQlPlk2NG9rMH4pVig1aEN0KzQ/YVRqb0l1KW58e2c/JUtrS2FiN09WNUxaTiFJMnNsUGBsUiF1KmkoCis+SntLP3d3K3ghZFFuQVZFPmYrOUhoWjxtY0s0XnRjdzZYOTY5KSt1TW9XYHdUQyQ3bUc5aDtMZS10QndIP19NTDh7M0VFQTZiUEZ+RFA/Cis5Xn0xUnpONVI7Zk51XkBmSjd9alVKTilARm1LM2kqfT1PTGJFQk1WMHkpS3R5dzNScWNNLVk+RkRhVHw3REUyWFBBUkQzKD4tPERTUXhwCitOZlUwJHtAOC07cD12KSo0aEwmJDtHWmsmY3Ywa0F5QmFwfldDa2B1O2p3dll3UlVgRFE+R3dBNWZLeHU7VX10Uk8kfUV4TGYhVkVEJVBQCis1JCYjaXhmKUp5Qz5HIXc8cWRwVmgzVzxQM2tKN21zWTdkQGVxSH5tcThDdH1JTlVaTlFibTFEKGooTjs3LUluNXQ3NSElMFpnZzZtPWNlCitCPG5aK2olcT9NOFlrampJa3N+S1c0Xj43KThyc3FOazV5cy0wQXo4NWBDJXtadUQ/Q2RiQHU2VDJSczxucTVleih1fDNVJiZGQzYpeTxhCit4aT44QiVZcCUmUkhxeD1pVFd5O2U1LXhJWTlKIW0wdFBTM2NWWkIwJm1XQGt2I0JHNzEjPT5oPnJjP3p3ZX1Lc29oUThefHJDIWt0JjtRCitXWnolS3BZd1h7bjJRQS00SzElWlhPZHV3TVQ/NHBCRiNkWFAmbk9oPFN8aFpjaHBPZDxpb2drZ3JMSm9aZzhJMkktQGV1VCRSN0skTyRkCis4Sng5QkZ8QDRrP01AKGNCWDMjRjFxJFM2aUYmYzxaJmU3d1AoMmtFYz43Y3d5RHkqZWJMX2FGX01ibzxnZDNhMEh0SVNpMnRfRHpHPl96CitRIUJXc14/JDktazMzXlZsbWlCKUZSaFB9fEN1JiNvenMxSlNOSHp7M299V1R7Qyh6OXZudGg1OG9gfmZ+aVJkM2lxYnYxNElhTEpaZTNJCit+KD1ieGA/WXwrOGFIPSl3aVREODljUCloPkA2YVdBSzJtdGV5N0Rzfl9kLXEpZDAwMmItMDAxOFYwMDN9bGE0JW5XV29+M3xheFl8UWI5Cis4S0pWbFE3YFg+TXRCVXRjYjhkNCpCSVpvKTdPejJfP3xhaUU8PjEhI3c8NXw/I01McWFmN3dyZHF5eDZSZmptMXtRbWA/O2t8Kz9HUlB6CitkUyFiQ25LMkxPKDFvZHV8KV8rJkxAdUBxREU+MmshI0xtaWp1KkxlMyh5WF5ORE5eQEx7WXpMIyNoZDY5e2M+UW5XMip6eig9WGNzcTBICitFV3xHN0E1OTFeP3IxYTNNbGNER0t1YlQlV0RaQW1rYDt0bHF2Y0wzTXVoYiRUNWpUSHokWFQ2R2w7Z0V7Y2lSMnpUZldSNGl1ZztiPm9QCitrYXohRD1sfWVJdHEqaHVhMmBwZWQ0ZCVnWXRXO1gqd3VOV1lhJUIkN1E7SlB6IX4yVztQPVR5UVNWfVJTRktKRyR6RG1RO1g+K1dxUzgtCitEekRlVEsoKSEhX005RUM3fmhJQ1F1NVVpOCYjNyFAQ0Y+cTd0NFo2WFE0LVVHT1ZHZD1GZE0jR0BKckpnakdDI2NkeVFOYG1fK0xePXMyCitTSFR7cHpWZz41aVpoSztDSE1FR3BIeGtzbiFII3w7WVBiJnEqVFZzKHY0O3QhLWlYVzRhIytrdCN2e1FeKSswfFhRUjAwME84Xk9ZN3l4Cit4endmUGJ2VGEpU2R0VTlSTDZUYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSVZ7ZEo2VlJTQlZkRl8yJGQpcWomO0NwQHJqeXlTezlHUXVvCituWjleT3lfMHNGWTQ0PXRvWT84XkomczNCaTxIZWFNWEd0UnFzaXZLWihSVG8wNnxHZlBrKCE2enZHOFE1YGpYWXMhJXIreiNYeC15Qy1ICit2b2FXYnVxTihTNVUqUnRnYntfMUFxaGglIyk5YWdCMVY8eHJATVFuIzl7bHIxQGs1JE5EeyZWNmt9Z0FOX0E7RiVkNm1TWEU8fUJraH1XCit6N3JwVSF2RnxZNVZHNyZGfENYYl4haDJQKnFRaT0lMSVqK198WVUlPk1VNilDK05iKHdDb2g2QlFkMikzOD5nK2hJLWA2Nl9We3ZyKT5pCitvXmd3e09vKy08O3UoKEMpIyFFRVp4cW9pfXc7Q2V4YCU3dDVsQT0ydW1iSEZZeE8/KytmeC0tfTlwRGlpZ29UMj02VGp7az51Tm0mN1koCis9P3dLN2YmdzVwVCpOZEEkRypGaklJfmFwfndxQjg1JXRoQEpDfngwc2leKiQqQ0d5ZVd3LWBlVk52KVdtMVdXeFFlUVRlO1Upe0koYzh5CitMd01IWURHKXp0MGRwcV9eK2xRYD1oIWYrIzJofFRGS1Iwck9zN3sobiQ+OXpHPU1ocE9KejFXRClNPUh7Vz5adUJ6PVhuaHduQEotVlBnCisxdWNGeTRieGAhVlkzZWo8VFFwQHhveiEjbmVUPCkpeSM0JTNrPj5RRlQ0cmYyQUpiPEdTZTlOWFB5dWBgNlFFRlgyT3hmSmlrZkNUckI0Cis3TFMwQnBrVT5WZ25kOStCRmwpZ1hKO3NCYkRhciFqfipMaEsjLU4wREtXbSVNQ0xGZ2JjTS1LPjJvWG1PTHBjKS0mJFJIaFExPn4ld2Q8CitJWChpZCNrI1ZtSSl5M1g+Y2sxdyZkeCE7eCtRNktsI2BQNm9nfkZxeS0ySUIqR2JwZWdldmBMek16cH03fiExUEpAfiV9WTZuQDZPTCheCitUJUZWUEA4WH5EeEUhUj5ZTUxpSWMxNkxgOHVrcWA9WDQkenV3Z1UlPDUtLWQ2VUZ4bmFwYlNWP1E3aSYzS0FhTlhuNShmfTZTcVc/WSMrCit5PGNTSWFfMFFfQTVHR2JTcDEzflQ4ZSNse3syZlMtTGhyLWkjXlVGMTNeZ1o2KT5BdU5Fek0zbDN6QThGaT9NUEEqWGR4KTx1ISY8KFJACis2dGElbWpyX0Y4V1FDMX53Mmx+bnFGbF8rQVdtI09xO0lFMjIoUS0oI2k0VExEcU4pdjk4dz57UnZteVJfYWt4WS0jK1FHPXJ0bDMkejhzCitGay1yaElEWlpJNStxMWgkYFU+ZmpzUiRONntpOz1raVN+U3kmQFUmJldSamNOJj1HQDk4b0Uze0RYcz0tU19hTkxJe1JSS3whJSF7K3s5Cis4b3o+O3tfWlpYeH1gXkVaKjlwQVhmTnFIcDFLU3YxUkZlPUg2PFlZeCNKM3h4OUVLPn4hfHB3clcwOCpMNj55SntTTV51YWxZQ01UeXFtCitlRiNsI2lweW9lT2tNdHJUZXVxdGRyMnYlKXRpTHRjNkpHK0JLX3x7IUlQYihkbXtoYjxyd1dkenB4XzYwO1Aoc3BHY0xAOU5MZV5CWV9MCitSeit4bGBLUmJaYFBXczhDakFvQj95WHU9PmZXI2NLSiheaypBUEBHdl9ianZDfGllQig4eDRPbVBSJUpjfiFLZG5OajFpV054OUZMKDxKCitERUhPZkp0KitqcnIlaGM7dHlwYk9sLTdQd20jZjNKZV5xNndDI2pTdlk3Q009YVJpVi1saDJ8JFZiVWg9WFVWYl9DKUF2TklfJVJhdmtVCit+UTEwbmIhJHtQTT9zQ0x4UzRfYTRiOHNgLXZGbDlYJD1kOHNUciR6TEJkSmpARmlee2x+P0FyJDdkK1kkfU48XzA2JFRXVGV4QlNoRUJrCit7JWwhSmxCVWZeZWNJe3pkcjVATSlgb1E3I1QyS1BEPU1YO1JPX3FQJXtMWTxPSkdYVmBUfF9UMXkxIypvRyZZRStPSG0hYF9qaSgxNkZaCis4VzVNZSRnNjM/cHsqPUkxZnBzMWpFcDlxcTFhUEZBQ0hXV3dNQTszTTN9bjJSIXole0lxe34qI2d1PWZgK08pKnJGeH0oN1F2K3UoVkNUCit2RlUzZ3o5VVltM2NRZT17ViVgJT5kQiNxP3VzLTlqXiF5I01IRkRXbGt5SjJBI3Q/PUgwTW8pXmp7UT9iPS1rNERhcipIQ3ExcX1gIUdpCistIWF6dWZYUUZDSzVUcTNYZz1IQ0NXb2RQaiMxNVFnayleWWhoIXpFbWI5Vkw7I1c8czJpc0cjYiV0ZGh6a3klPSE2a0xITDtzN1g8czQ4CistUm9gfjVeMGhvdDJxb05lZE49Smt7VDVTTT0xOVp6KjF8aWQyJS1XOVBgS3ZSNUBfUSUtO3RgQ3lFSjNWQ2g3KyZAaDltKThuPGNFRjE8CitYanlBWmAtKGtCYihsRF9Be2psSlcoRGwpPzFOVT9lNkp5QDFxaj1FeXprMUhMdl9wantTWEtRdm1PTHkjKnE7bntibVoobHdhdVRJWkpSCis3MWxoNXR7digyLUhHU0tgVWZIak91S2pxOSlBNntZXlQlRiN1eEp0Ui1QfjZQM3tuXiVjNUpCYF5SfnFSNjdGQm9oVStFTG5RNjQrYH1qCitOO04rWVA0WHkjJEVreX55Sz87Rk9fSm05PSsjQTlAPSRLbXg9T1A3Ny1mZCRMQnI+O0BOc3I0NWZeb3FSRndseGk+fiFNRHVmVnlwRjlxCitSN2s+e2c5fnJBSSRxWHoqNU9HKylfaTIzLTRCektfZCpILV48PG1VdEs2V1J4ayVkbn5yXmp6JXFYWCs2Xz4lUFQ1bEVhWXU5NyRnMnNqCiswaDBBUyM9SjtfclMpPzQqcGo/R2RTeFhmdWVNX0t3MDAxKzNjfDdiRHdsTi1HNXE/JCNgQnYyJENuV1YyMG13dS14VEs2ZUJpWU9NRV58CitAeGJiY0R3dTM5bXpPZX1CTEdEV2lqZnZDSlh9cXMhc0RVNXJMaDl6WTlRPm9BSUFBfGs3SlJHdnooQW94ek5iSV8jMShsV2E1eWtQeF8lCitTIylHIXp+Y1JQOV9yMiRfYG9wLSlCUXFTO0tlWEZobWJKS3U5RDA9fDZ7UGtpd0l7ekIrdyNlRHYoPnhEJGp4VjxWaEZ1OGo7IVojeF9UCitZUnVOdytvdGA4cSlnezRUPlo3ISNmR35nZlo0X2c8e2VfQjAwMllwaTNmKEN1MiNBfjc+QmNCY0FNMVVieTk8I0VmR0w0OGZpdSYqPn1+Cit6eUlfS0ZLXj1VeHt9dHVuKWFxJnsqSkxPaXo+aiY2cCs9M3o7TEN6el5jdEI2MyNPOGZRQjh2ezAhfGEtWGIjZCstOENffFgyfCUmVT8jCis7cE8weCMyRUtZTSsmSCRfZWFYXklVTy1eZ3dwP1FVKXE4QWpKXm1CfnxRb3lrcldiUnJBRWZ9IVExQU5mNFlqR1NxZD1vaVhGNFU2KTN0CitzMU1mSHR9IUp8SXkxaE4pMTk1PWsrTEJxYXNFM0NodiZvQWNART4rX1MtU0k9R3xBb302V0BxZkhNZDJ7QEgoMkFnUkJPUn0tMDx8KXM+Cis3WHpLTChxYEZmWDtsRCl2dXMyMnl8ZlIzU2AtQnZLb3MhQm52SnQ9PGVoST1HY01eNE9uQHspV2A7b01AenVHZl5QQUh4WT5FNld+Q04wCiswVU5wT1JqcGhfaGlZSFc3XlNTcHZsWnktMWI3bW84WWp5TmEreyhNaVRLcVMobk5wO0Rwdzk1QiF4dmU+cDlYNTl4Rkc8cUJON1pKNyo4CitBbj0zelFjRW5GVntuVH54YWwhSl5BbG5aZillSj16IWJJfEBJI3s7Zzc3ZXJxNTN6d1k3a2IrbVktUl9JcXtXWShaMnd0WVNBUlgrU0FVCit6TzA3QSQ+d0hrcUF6d2NZXjlwYHFTN3hoRW1OKnUmUlFzcVBHOUh8dXh3KSRiIVpUd0lLWlFPPU5rTHx9SVNfYkY9a00kJSpxZnk1KkdMCitaK097fnAqc0VIfmgrRm58eml0XmQlNjRKO3ZHUGcjSDtpJE9wdUg+a0JkPS1DU2o7YEptMHk/VVJKb29WdVRmVlJfKS1tTUxqR1lXdlBaCis/eXp4MUZhIXVOV2RMUHtJVUNuOzlkMCUzY3x9YSRvbGckYWdGJktTWjZjVWZ6fnBxbFNQeCZESW1wKngqfTV7cWNMVHV5K0Exc0ZhPEJECitvPXlYSCQjLXtlQDF5ZCVhYHp3TFZLfCt9PT90Mk4lYHlnMzJlTV57VCUxNXVeeHtiNVF3WHp6JjVSaDZwfl5rS3IhcTV1eEQpN0x3Z0FVCitxMFM/TmZzS09XMSk0eiVUQmpEM2RATSVtTHlhXl8wWk15ejd5I3U7TUJyVns0YVFgditBKDQzZj9FRXxKaUFvbT5eJlBAOzB4UWcrZj5UCit0ZmptY3wqaUA/eVNwc2gqKEhiemxJQnY1NlR4KnQ0Xjc4V0xNNFMoZmxnel9gYUdYbk9+MiVZKGI7JTd3NFpwR2VoMXokQlImPmFQQ0FLCitqJjhrJn5TbUFZT3dKVkt4SX00V2ZlZEZIO0MxYWBxSH1JLXN6VHBHajAyYztiaSNvfkEoVWgkQSN9Pl9BNDY4YU9YQ01ucztLM3tuVkZ1CityOFIqQiR9QktAVXU4aElVLVRVbGNEfk07Q15RTTtUVzZARWxNekg1dD5AQEJselhUZVB3YEJPKSZGXlN1aCRHPSl1U15AWCVmcXtBZnkjCitmX2N2Skc0aUdXMClSdiROIzNWYlR8dyYrJCZudFE/ZThALSpjUFh2ekAhITZpJV9odjxwaVdYOEowQElBfU5mX0NydHhOUUhAMWI2dEBeCiskSCVze2xOTFdURmN2ZU9yIVo+RCpPbFJ2KGEmSGhUMVY8KnRFWHlvdzt6U1koK209Wk4zLWQwSyhxO2dpSE5aYFhiYDdwakM+SzdpV0BXCitsO0J7SDRzMn00XkJPY3dFfDxNcjhgJmBhSDgqQ2ppa2lIfVJQe2JpMCReei1nRihVWGFQIUhuQHxrUHZMc2FSPjI3dVpaWnFIdj5GUG9zCisqRH41TEwxcVN0dyVKMDBndShZOFcpbmdabmdwZE5BO0xuO3A3fkk9ViUxaHAhMiY9dmlWY2puRX5zNmg4bjB7bjAxdiZPfjd6cmc/PjctCitJSDxLIUAheWBMUSk8N2JXViNqTEgwJDZQJDhGYkEwaH1JIXhUVTEwVWw2KUZjXjc9V3ste3E5O3wwZzEhUUkkM1Z4Y3IyajNOQU1xJnZKCitvI2FAZVFGWEk4RnA+Sy0lUzQyNkRFT345bmQqaSUoYjk2KHEmM0BOOSZXSENPOWxFTThNdlRlOEFEX0FrUWt2YzJNMEI3aTsjTXc/WmlTCitRTj9eXjRuQEJGU1BJTiVjeTQte3I7ekNoTE5GWmcqWClUemNgZilfZzE1I1VaOCRTQT9nKjQ7SDQmWXJ7UHJMcV4rZz5+KF99eV9ASzs5CislI0U+bjw3QCsrfF84WHlfRWx1UWNAeURPMlV3fjNaQ3EpITQyZn5LOWNTeVp6R1JMeSp6ekx6LXpWOXU8O29IdmxXRCNSfXNudmlXTU5RCitIbmMqLUlWTCtRZXU+LTZYK1N3Km89Nkwpelo4bCo2cD47WTYhSWB+XzNkMGooeTdwU1VfejdtVXxueWV7U08qRCM5WEsoXzRLOGJrPlFPCitRY0E3UUI/bHVoPHk3TklmXkYkPFhDbjArcCYoYW1SbWBGWkxSKktoUm5eVihOZnREY0VvP0MlTkstb0NGe0NTcDFeSTN0fnU5ejVQciMtCitBKjIrMnxLYjZjWn5ZQChAX2dBOVJlLT16XyFnKXd6ZnlfVE87a203VD9XU1E1S0IjYG4zT0gyKThWTSFUfiR5ZzdTTDk8ZG9WZUVVcHZVCitpVW1oNklMSGxjOUghP2AtQCMzKUBZI1I/QSt2eSgtSE8/VUErekY9Tl9yV0tmVWhtQ3Qwe25nfGRHbGQyJUwpKkFTQUFRQjZ8Z2kocVh+Cit7NUZjPklpV2I5KHZKfEx9KCFDIU9AXkttRj1sRmR1QWY2KW1sUkIlZ1FwQEVURFp9ZigydyM3NEMpN003X0xrPnh7Kz5sU1pETj9ASzFXCit4VX0hY1c9UiNgJEBIMWE9X3poVmhHSnlyI0JLUl4teVFtNytGYCZgSCR9VSQwKVRoTk44RU49PmdrYTcpTEZXcW1taiEoWERpWHoxX3Z6CitYJVZqciFraGJgRSZ3KTUyTmpGS2BDSEgzcy0zbGtKTipmTHYxeEdtOzhKUkFObmRjSExQfSs4Ril2dSV7JFFfKWt2NXZROT1MT2shRDRmCitAIXAhd3c7VTswU31xaUglJE9KeWtgeXE/RGRHODhfcVgjRDcxdlUtbk4jMjdCaWA7JWtOQklLJCtNY1BpanhnRmpIIWYpYXlUSllnQ3xRCitpY1U5RldpVHEzfDJlaDRMMmF1KTMpdlBqUDJfTkgjPXp0N1MpQEw+SS11OXZGV31ycTJSMiNleEhFYiFVQ0xBQ31QTSp9Uk5MM0JNcm1WCituQV4kVm5HV1R6THNQO15EeGRQdTYmKXU3Nl9vIXNVJEF5emMye1QxQF44R1ghbFV+d0lKM0o8RytjKF50X2pDaSZyMHoqbE89SU97SkIjCitYelY1T1BaclkoZE58U1ExTTd7O0x3d053Z05YTnVLXmd5R2UwVSE7bipqYDZud2JvY2NeX2w1YkRIcFQwZVJAZjlhWG54Jn42T1hXUGtsCitRZnhAaU0+TlJVPDU3PkN6dFE0LVFaJkgtRjxsWlhmIVpIVkcwWDtpciNtVyhlIzMlT3NeNGoraENuNlFaUGI1TDhtIWRBMnQwbG9QfkI7Cis/VWM1VkZtUT5raWwqa0IkK1UhXlcmZlpwMTI2Jj43Izlfb01CKENhfEtMJndnbGUwN0Z2VzteWih0PWRzTitOb3NLJEpOZTE+MDRgQH5QCis2bXNqcCZLTmxpUUUqTjBhREJzKTFMRFE8KGB8N0pkZWNnVWo1Mit+UW9lQTAqVSZHbjYwcXJARTBLKjs+amxvXnhwJE9LcCllKnM8T3JrCitoVC1GJmtDakw4X2MlU2RrYFYraG04YjFkQTc2QT89QlF3cEhFRFZuVEpWI3k2Tj9tfnRzUWVJNn1IMDNQZSNJWD0zRDg7YHZYXkcxLWhoCitgO31IREMmeFFFcDJgUV9mOVNEMGxiSzNTJHVidUgrOWVycm4wOUU9bldRZG1gT1l3NyhpQ1Y2JXdjcjtCRG1YX2ZuUUNpQ2I8OyN8KVVDCishKWF4UUtrTDFreGFkM0RUcCp4ckt8KSh1TFBCTSg3X1dAY0lYcXxQeXM+fCEhJkh7bjUzMEdDTXk8OS0mMmhaWDJKbHpKY28xeiYrdmR5Cit1Rz8jUHRPOztyeHk2YWFJU3xlIyVlXk5EVXB6JkUmIUltaFU9YSpZSz1tcnNjeSZ2NDN7bTU+cVNIdH5CWFBDQGZBbD5VQk1AUDZ6bEpJCitqN2BRYkoyXmVHRyt+REl+bCUtcTxSMypyMlFyWkAxZmJ8TWJ5TzM8OV9TNjl5P1JtOTBeNFhIVEQhcno8RXd6MVEoaXQtbkVuY1pYQUljCitDZyVqSmR5KHBueEBYe1ZAUmBXQkVqMjxsSW40Tn1NfmI2YEwpYmImYjVIazRpJHRxKykkbG0laTtpNHlTT2cpWnRQcHNnMlleLXZSPnNRCitGbzs4RGNzdSU0dDs+JWZMfVhvZitidlRyRnliUFM3WjRiX1VRK1lGdzl7X3s0eTVINX1TOzt5bGdjRGElamJzSUZkb2NFb2UzWSReZFpiCitNTEVBOUgrODBGcmxUJXFTKD8wbHY1VGxZVGNVajliSj5pQzZ9cEViMGBxWTIzRV9udiFqeX0rSyQ0aUt2XmszQllTe2hEWFVfRExaRGt3CitmTEttdFRzV2FgJHtYc09wZlpVM21KZVhAXmdTWWtlflN0czQlRzRrcSEoI0xtQUYxfmJUXl5YY2BKIT5DIyQ7O1ZHbE9eQFIzcUBBTzVaCitVSTFJVEdEfVlDMTRYSy0hVntLc1EwX0A7cT5zNE5TKHotcSYzSm1EQHojeVBFRD1HVy1OfXshM2h7V3c7PmJPZjE3P3VIUzdFZn5Ra2c0CitSejFxIWEwcClhWFQ0PH1gSXwwPW5PP291JFB6e297OXRFfTdzV3tFKFYqR0BeTUIhdFB4Ty12aiNgRTZkQHgydUxybHs+YWEmJW0yeVVqCit0OHokZjVZfmFpR0xSTSt8RzdiVXpYQ1p5UHlFPWRCWDttUysqbUk5S3YtVDUweEc5e25iISROeyV3T2lScTZDZ1FSenVDaW55ND1XRzd7CityWHc2MkJOX3AySkxkbHBJWXlzZStNTnMrOU1kNk90e2JlKXh4Rzlhdig4cmpGIyFiUXchNHhTRH09ZlhmKHt8ZEQlR1NZSH1GKnxLalBQCit5YGtqVlF5WUomYUh5LWw1VENuYHU/VyM7eUc8S05QfjQhMG0qWUJ1MGNgNE4/ZnVMT25ydUptNU4mUkAwZEUmfTVBcURfXlJYWEdZPmJpCitvczJCfSojMHhBRkRlXm40ejU8bH5VSHAwUDh9YVlhVik7S3JRcU12c2pLQFBnRHpONjxsUF97TiF1MEZaWTNANVRlfFVoVz03WG5XQGtjCisza1AwcjFNTUQzfEIyeW9UIT9rMD9obXV9PFc/I24+bEx9fnRnd0VUP3BMa0hJUHl5KnpnbVU8MFo3TEdiJTwoX2VQeS1hMmU1YUpHdl5PCis2cEVQVkp2SzZXQnZ5eHdfbXdzQjx6WjdAR3trRm0hWHghPWJHYCY+eTBKa2RIMGdWdzZHSD0tOVQrSlRYe09jMlNHRzFyQjQjJlVtZ3VwCitudztCc1FofVdoNihVZ3NzODR6MTZoe1N2ZE1GcWRabTVZUEFlKU88M3FFKT9IfjA9KXU8d2t4eV9pOEhuaGJNXmxwTTs3ZGohKHFPbyFOCitRYDV8Xnt0WnlII3x1T0ZoeGh0UUV0clpHdFZLYmRuWVI8RDlqdn11MmhsKGJCM25FIShUfClDYWl9IVM8QjEoYnhXXkNKdX1zbEhMRjc+Cit0ajA2P1VUX3YqITl+YkNyNmc3Q0ooR3NrQylnKUMxb01iTTlpaTt2e0dRN2NLZzZ5TVJVVyk+PiYjTXtAeVNUVEk7JHBTfDQ3RkdiZ0VPCitDTmZwQyt4UEApe3szTG43UjBMKkdSOURgZnZAJFo7MzYxPmVDWjUlbykoY0VvU0RsKU0zbzNXfjNlVCEkaG91REsyUmE/MT1UaE5zVkt4CisxKEEkQVNTPUJUelJtSWtSKlAzeUh3cTtzcVc4Vj1tbU89bHlLamVZIzdOZG1+K2UyfDJuR0Naano7MSh6fjNWNjk4ZT5UdT5NI082YFdTCit0IyV0bSg1ansmTTMxcEdxTnRhaCFMPm1mbiZrdkZ6Skt+M3ttYWtBdXJCQzVZVj5kbGMhZjw0JW9ud1cwWHBrU2ByKXwoKCtecURBUX5PCis0WTB+S1Z1ZDNVSWMqU3BsSmdaZjVuQSY1R09kJEprKlZTWVU3VGJJK2F7XyhEd2RkNyZ+PlppMTg4VXgwfFZvc25gTGtkaUlFSWxue29uCitlUWFXVkBtfV9hY1RBYGpNKkZ1dWR1QlZtcnc/bGtSTHxGXzRIflM5TWIzRTNmQT5AKDVsdGRRbSZ9MGZXZTkkcEo9NkJrXk1ecT90UH1LCitvVjJSVk42O3AxaTdaYndBZmVZQXElTDJReiFxNiNpViR8YTZXNU5QX0tuKUdlQns0SDZyaSUpdmcwUmslbDQ7cm9rZjtMeEBnb31tYkdgCitkUT4qSC1BT0Y5Xnk3akIjbF8tQChObzc0PVlCSksxPjE2eypzYk01MT90NiF1Y29IMm87aFMjPUxpdldUVW5CQCkyS3Qha0ZNTCl+MUZZCitOQiZ6NSQxO0huNnhyRityLTV9THJ2N05udTEkOD8lPX0yWF5sU3FNdjxaRj89bGRneXRWWnY4QzdNfTxpbnpJLXFqMm9qcFBLJnFgXnJeCistRXxYSEg+JkkodDZCP35vWmMqTiQ0eGdDeD9xRmVrekh1PTJ0dV9ebX1PbD96Nno5eHV4d2dWKj98bVpKekkrPjBgenROaXxnSHY5TFZJCitXdGI7dUtAQn5EUVdNKD9taFdjYWhWZ0tWdSRMU3F1PEB4KjAtNUImVUB1VUczVjl8PSQhVnZ2X3BpfnZpR0NZV2lTemFubS0xWEcrNDNDCit1ayg7OEcoZj1pYGBEXkQ4OXhaTUN6S3RwZHswTEJmbFUjS3kwayNNKipFMCF4Q0olX0s3YHhZQGlxc0NyPkxeNmx4KmN0c2VCb0pQUSN5CitkdnlpbGQ3cVU5O2R0UT5wO1RyJmJtS05KdG9nbSlePVFmLSVyVyhPc157VzVOJmlkO3FRSz4/WH5tdnchSGFUSyg7Qz5GTSlkcVdyb1RACisoQ1UrdHo5PE5qVDA4d3ElZnZXM3t1QmgoZm1iSj05T1QmdDBEc1VuZEhwPSEkKShucmtHKkw3ekZEcFlsaDFSaV5RdTleSUoxUkU0azV+CitBVzUxY2AmSlhePHJGWDRzJSE3JCR3Z25lb2ZIRkIkYGZ3cUxJa0kwZzlZezRNZDtRWSE8VElDd2AtMWhBSHBaalg7SG9gSE19bG1PJUxzCis0S2NlYlQycEVGMUB2ZyEqJClkUFIlJnBqbiljZ1goQVQxNEUhTkwpNUVhY0VmUVZXeEE3NjJFQFZkdUl7RU5lfEY2dXFoVz9XeSZ1S3ZxCis/MnMxKipvIzQqTGp0NEpsMGNBPj90TUd9KjRETVRoRE9rRno3V21qMnd0UzBeV3Y8ZUpkfEtIMmszfHZ9b2VxP3hyUHQ8KEo9PSRFdE5RCitHODE9STB9QEJ8VDB4RFFraz1ERkkzc09NTzlFR2BtVHJgMEpEXzlYXz55djt6UklSayVVdD95OSstJUpYaUM+Kkp4KlNuX0Z9X1V5emtUCisoMGM8ZH42ezhPJE1qVWdjSzB8SDBfN3ZDXmtCQGZMWlpiT1V2JXdMKSl6QWwhVmdobVBmTTU3VXxCQDUoM1g4ZXZhUHptSVU5fjVnJEgkCitQKiooUlBFUUVqMlZhY2krKnpAQjRETU9GT3NkQyFgdHBrfXpKQl54MW0pTUcyUnFfaFJhZ3FYZkg4MHxsOEZXSy1PR2w4UkpIZVc1ZEx1Cit0fE5JSTZgMnpwPmwyKz8td09ydV51ZG10Yj1mPzA1Mz5jbFNzaFlIQWVWRkY2cUZpRD0xNWJtMTwpdUNDaCs0QElJcWI+SSk7Qzt2IWxjCitzYUsrNEpMWnlWRkcxUylQOGlgOF5IZklaa3VxYnA+Zj5KM1oyYFhOcDMkOSV6cntDb29IbXAqUHAlZVckcHNjJil3VF4ySyteU2xrSW5NCit1aDR1Yj9VTXojdUxsRHJMdzF0dzhSR1hTajJCbFZDYWBXKyNZWlkqT3Z1YEVlbFFVV0RaSWtVQFRCIz1+UDNUYUImb2djQlhtJF8zZnB7Cis9JSp9cnc8Ni15JEcpcUhhbVFxVWhrYT5sflMlI3l6UFE9K2R6NDx5RHE3VV88NU9KSCg2QSskcDxgQmBKZ2o3eF9sP292MkM8OHZsU00zCit2TlhTfkk5KE1OJX5lSjxRaDJFWkM5ZlI3YlRXO0c/PSUmPmxTamxzNFgyfEF0ZXd4bilrKDYlekdfTHtZMmlFdlJ+QS0zKHpvSmw2MksyCis/K2A2cj47MnZ2JmMrKW5AdF8kR2MmMD1KTkpPPWVsWGkqVW4kRm8hdXJtRGJ6cXR8cHl4Sj5ZMyY1UEc+aigtQDdTSTBre2tIejFQfE16Cis5TUpfRlVCWWx0XndxTkpvczMxaVpTTFkkQDdkNCQoTEJaM1poOXB8Pm9YK0R3IXRpeXtSdV42d1JPTlI3fkhKfWlTMV5nNXtTRldpZkg7CitoTEl6TzEhR01LfFNEVDk9NjdgVl5NRDtlbEw8PyRzMjh3b35GZSlGJmRObnM0e21aeEo3aFlwbkgraHZIIWljWipVRERjNUNEKnZYKFJzCis8b1cleFg7U31VMGt9Jj14P1ckJnxIPUNUbDBuOTdsIy1kVDtSdkM7RDZDPlUta2AqPnYxQUplQyM/aCkyVGN+V2VlSyZHMGQzY01LemRFCitATktrck1ZZjJ8ciRJVXZ0QzlIZ1diJXpEOyowY2h2YTtFYTJWcHMtJHt7RFl7K3R1MjxXSUVyeEdMKSFrRUJNYjk1cSUpV0xhckFhQitGCitFWDAxRWcqK3thPSUoeT0zazBaazVBTUByUTF8Z2xKdEdDaTtse3E0aCM0YFc7V0Q1VlhzOFcmd1psP0Z+I3J8ZDZxNkcpNlI8WXduTXRPCis2Vms0fiYtdmFLN0xaVl9AeSZkVm8/XlNZc3peRFAqfmJfX35eXntZI2xAeXt1PGtEU01JV3h5QFUxfCRERGI9WFFhNyFAb28oN2N3P2toCisrKWVRQygrQSE0am5faGBET1ZMel5YOFdnRjkoWnpgKmUpc19YX1p4dHNfM2c0dUg1cytKTDVjKDhUQlYrIVVDLTBkajdVTlh4KVlGJGF1CitLUlp6O2piKFZ5M2g3R1JBIUtURX0yNkspZ200X1MmO1NlaXdGT2RXYldIQzJhTCkxb1dINlYjOCV4RXZjbWdwc05LYXVTTmkxdV5telokCitvbmVYUXloYEdBdm96WXNuV3xyWShgPXZvLW1gc2p4b3YwKikwREJQKiF6WnoxNzF9cHZubDlvcWQoMzVII0ZUTSlTcFk/KlFzeG9TZDxXCitVYy07ISY3RWQ7MDdsKy1zWkpgTjIpNzxJRSs8ZCZId2VEPShrWkxuJS1KaWMybFdMd3wqO3Y8RTE0OFJXNV5eUUQxI0xTVHgwJFYyWUEzCitMNGZ1Vn4lWDY3fmchZHtyWiMxUSFNXjVuJi1hPFMlWUwodH5+V0g1dk0hZ0AtI0s1dXJ1eGJuK3UjaGdAKVo4JDAyPUlzNyY7ST40JEl9CisrKmlITzVmc0k7cj44d3JRPVZVKHlgeVgrSE5DT1Bhey1fWTlvI2pVYUBhcjtZNX10Sl5JJmpBM1UyWSlXV14xR2dxSWJBMUVySWVSaF83CitJR2B5PXNpVDslQjJ8dT8oSzFBank0MCNoJV8kdmxFR3cyNHB9YX1FZnA/O1l8YmIpKzFzLWg3NDY7aENebVhWREBlc3k2a0VhcUN9TUJFCitwN3k+eURfMUo2bz8oPClHWTMrZWwpWGI7dl4lUXVtT2BhNDlvMDw9eE5tNUZYcFApYTJ5M3o2KSo2QDVXQE81QjZ4WXVRQn5IT305VVclCitRaF5IR15BaCV7YUVITGNIbnoxRj5gXk42KTNRZkQ7NktCaUlXYiUrPzZPWHQtRklwRE14YXNHamheOWlLPUA4SHh6V0dkI1k8UEB+VVlLCis2TlRZM09eJCY0UThmeVpqc1IyLTk4ZGZeeX5sUX0kfm5AbEt+ckIzeVo9fjV0YlBma3puX3o9RFBUaHZ8ME5iMyU/OCVtbX13YXgwb2gxCitXdXA/YlpOMkJgYkY8NUJUVyQ2bXNSWXBiMDNqJC0mYXJ7VV5EKSE0Z21ZOzFNeXJRPi0jfktNenxKQ0ExZjY5aCo9O0NFSWJaTVljbi1iCit0TGJ+UWFPKFV0ZkcqMiZrMjk9emxCSmYrNmYtVVQoTEM1QnVTdzA4OVI5ckk/K3duKlRLYHpMWD1DNStVJCU3b35WKVNwe09FZExJYihSCitlTWZ3Y1d4VihAb0toRSstNiF4SG1LYXlmViMoVkFlQnlYT2c9X1h2Q2F6X2hoQGYqaXNBYWB1O15UJHROcTlNUy05R0ozRWplRTl6c3tECitGMTIqKmcoWEM7YmE1SztMWkR3Mm9CKig8IXJwbTMwX0ttOFIpYU1XR3ktY2ZmUnF2S2w+e2IkWUw3fWVHWXM/IUFebFlRNnRRWGMxXjlSCitmYkMwNDxlLXRkd3dGYT9BJWJYOV9NcF5LdzN3STxqX1JOaihJQEk5IShgclRZcnBRWlpzZyQlKiUjVz1uc29xYWJ9Rit6S3c3ckUjaFI7CitDTG50N1ZiWDtTMWpQYiM8O1J4enlYTWZSQX12N0RicD1xantCXnh3JFMrYEVKeGBoVEd4V0w2LUkwbnA+U0YlN09KaXdGfFBIcTFBYnUpCitXe2JocCpLYnxlY3JGUEJDYmttYFRMZnxjZ1Ird1FfRWZXOVpVRmIkMSNNMzVURiRabn5sZVc3Oz52Smk+Pz4zbmEqfi1VcWA+SG03LT8yCis/Y31ZWnc2VTApPEA5fVgqTGAmSVckOCZYTiVMWXNKaFo9ZGxpR01CVzlsQXduRCg3YE5hdCtfQWwtRVJjP1ZUdmhYK2xwaGdRRH0xcmUjCithemQ1bjhIcG4pSWVGJDJQT3RNe21xXnRiS3kqMlVKXjxsWmJHY09SU09sP1RMTTx7UypfUlBJMkJ5bHJLZFVBNXx7d3Z5TjdpckY9OUNUCisrZ1hxc2dAeVVubUgqWEE2IygtVSFWKFIjKzB3bEQxJVdVJDNfTTt1diRRbzhsQitScEVnUSF7SG4tKHpKb1R2cFZhbmQoVEhacStNUTRyCis5aDVVX1RZYVM5a1dScWByUHopO1ZJTGtaMz8qakhxdC1kUWVyYCpifmxxM0spTSZlSkcjY0BAYjNWQGJyMEclejFWSlpDTz1mJjBjckVsCitRKEwoJGNrUCtZZTdSSkRQelV0KjlJSjgrXnJWQFp4QClpUFpLNV5FRX1HZiNCeClRQFVTKmYpQU92R2VrVnQlK1JsQV96aUpncio0WFBSCiskWSQtMStHSyh8eig+Vm04SUBeOypfUSV7ejwlckxiOSRgPFJTUSZqWD45RXRaPEcwSnlTTHNaKSY9P3MyPTRNcUZxQHIldTUpWkd3RWx+CitjR2tNfFBYZm5aJU9iWHRqRzFNM08+K0k5WUFHez55e2krVU9VQ1FVbFRGUkB0S2N4IVNMdk5LR3FrMFdJdz9kY1dxKCpWam16fDZsOXRyCitCcChGYHpNckprI21vWVo/JTBuNHRhdFReR1ZSQlZnTUk5VDBXbUApOXBObWIlX1EpbHBkZjhJdm5XMlZyc0s0QWtVK313KnhUTU57T08+CitlU0JBITgpZks3bCZhJVpyak9ObTNadU1RS0BhZVRAfkplOHIlP3pBTEh7ZSQjWUEqJkA8P1gpRyhHS0F8LTU8b1dUZF5PRn1SJDhYJHMkCis2aUV4fENuQ2x6ZmJuUW8/aDwkTEI0dillNFVhcHNQIWkyMXBzUnklbDkhPVI+PmdVbmMrTTFXNHNTJl89Pkt6PVppKHVXZTU3NVYyOSNpCitpTjEmZFNDVypEK2NURDJ0YUdHfll2WEhOUkFgM0ZNeE9KLUZIez9mJHxUMTNpT0ojZzh6IW87Z2VVajxTTT41aHh7WD5NMkIoWGZ1JnxECitnLXN4bF8yVH5GWS1Yb3QjTlpieihidEAxUlVyJE8wMExQVEc8LSgtOFM+az1tZD1NLXhDRHlUb2dCTS1GYTlvJXx1U1NkMStydWlraUxLCit0UFcoPXViVXt4aytiUGRwV2hlKT5LZk53YFdxQjxvPkc8OXRhLTkjUDljaiZTX3duelROT185WkZjUlpUYVVAelAweDl3cVNibDZwJnQqCis1SSV0eihzJWhyU1pMIUM+JnJKZTY8U2EoUGt8WiZxQFleNSEjUyowelNmZ1JgaU9Lcn1SYDcpdEVpSHxHI0I8UEJHdjVoXilSIU5CdSpRCitxdFhKNzFFaERQO255Jll3dWloc0MjaXk2ezR+fXEyWTtsQmBDVjRrUk9sZSR+djM9Vn1sPHJ1P0EqaVpWPjw0S0liVVd6My12SVFBMGtWCitBeFhLZUE7KVIodVRRPFlOMzF7WGU0RTk3ZjRCZVV8R3kwWCpXfUl8LXVMZmpkaWVoN0psfT5Aelh1T0MofDtANF90TT0lYjYwc0lxNSlkCitBSE9pWWREXjBibjhoKXpRcmRyX3QqNHFFdHN9fSQ0bTdCKXpDd3UkcmN5NmAqWFloSmtIdkpkcCE0P2FZOzBMdWNpbn5QVmA5RWNpNX5TCithNmteWDxlSUglIyhpLSk9RWhLdVhwdVhvTm10IyFeUkQzUW1PUmcjTT9xXipodC1OLXZ7R00pSWN1UUp0Tmohc3x3ZlVpd2B7cHxld197Cit9VGZ5ITd8KSFUKV55PVZifFMtK3pOSz1qRWYoO3A0fm5CY0lqIUNmcHRVITkzT1k8TFI1e3l9PEJaPlVafiNNKTFGfTJtSmlCZkIxS3l6Cit0NzM1PWZeK3dfcXM1OHl9TlhWSk5mSSRuZ1FjUylfaDF2cl49TWpyUyVgfD49JjRpcCpXPWZSbEFgcmdUdllVbndyND5vK2NtN1dZVWpgCitTZnRsQ1V9dk1lUl5lQ0Y4WkxoTzYxfWpEYX1IVTApJXF7PTMrKyYxd21xRzNDTXVYdGBIQU5SRCVOb25tTS1zV0xPOUphYWw8ez9xcHlSCitkNCVHVXdGbn5vLVdPcz1+el4hZEQjVUtDUGFCQ2UhO3xtOUEkeUQtbzg9V1ZSMl5xVGFTakRfSG1VTEJOeE9PO3M0UjBtaT1RUndTJF8yCit7blA1MiQ7WHhnNF5hbj9sTEo7KWhOJHVQVldEZWk5WW42TEIzTEh0VUp1KXpCaUx3ckZ1dyladyRkLTBhU04/cDw8d35YbnY7TkRKSzdUCitjPTdaRCN2ZnhUeEY3dSNOUl8tNjJCVlctUkl9IVNCOU1GVWJpO2NzUkp6Nnc2UHw2eGIxNlRCWEVTSmpBcUQjYW5RJkpWI3diP3tHcn1QCitmZykyNHR9WjJYcU1uaE9YI2kjTFp2JTlPMShLe3spVkVGJWZAJXowTGIhbHhqKE04bXdMZSNmJmV2K1kwPGl2NjxPI0N6UFMmaVI7Y2dmCitoQHNGdjdabWBwMGhPeHU/eGlmJEF+SD5tJXhQayRqPSE8IXpoJC1pJUphODVyMztOVDs9XihQP0RlPVp7P1p0VUh+eDNBeihkLT4kUmsjCis8P0tlUzd6STY8d0BYMk1qYE9Yc2JVTT1EPSFSPFdlRWdnTDFVeH1KemhSTi12bWBTPCpnXmQlNEg9Jkp4OCFuPyZtfDJFPkJXfDFWcVpUCituOUpHWEZMLUBlX200PXJ5JjspQWl2YFZzTXVERmJjUzU0TjV6PlRqKmBIdmpORmU7XmArQk9aej4+Q0Zqd2dVNm9iKWR+VFg1YVJZbyleCitpUF9lPTdPPGlPXihOPkZUPGA/UXFeZXNyM3hyWmstV3dZYm84YDw+O3pfJjZTcT1afTw/Qz9RJHpiejREeXwqLTJJcXtfUkVjYmg1JnlpCisoX31rZSsjV15lVjNrXys1d0B4VihZYyE3LXhtT247Wn1WSWNVKXZUSWlAOT98djl6WHEzP3IwSj5mdzZsYzt+cWRnNkw/O15iXyNQSiFgCiszc0cwYnpKPEZkZzNnP3xGUVU3fCNkPTNodTRyUmhUNWBtOFhMK3g9K3A0RnNRLSNXb1B3WClmeTB6Q0tIZTJicytqWTJObkE/WXxsZiYhCitCbGA/KzZLZHV+SkJlTClPdEViITlPPio/bGZzLVA/ZUcqKzlJS3JUSlY3V21GeyVMI1YjTHY8fl5rQ0dsJD5QPlAjWi0mclpOLTUmWTBECit2aDl7Tj5YPnQ7emItN3VDbU8mRWwpcnBaODlfZ1VsSXREOVdfRSZra3RtVyFKNUBPQVhiUHhfNkxrXnRRXztQSmRBQWZDJiRsclI3KD0pCitMamw7JEZ9cERtUmxEPHFoJjQzY1NVMzQ9LX1ldXRzK3QoSHBIaCZnK2JFI1loPEEhKHJnb3pSTHhxVWwleUAkbDZSWFFGLURzOHdQNmQkCit7OHBlYHE7VzdqX0NFKT16SF8tZVk8VU1wTlp1Nll8NVJNLX51YihxPSROfGp2SFo2cztWRkNsN3JqUFdseEg1N1dpTWBpUHU4bkVQNCo2Cisod3BSVFR7eU11RkFUQE9OKHZTYUpUQFZDTWE3cmJqO2Jqc3FWKj5CWkpsT215PXQhKm12NHwhZyMmQ3l1fGp+JVhoJVo0JTRkVFB1bHV4Cit+Q0hWZ3JQKWg+QDZhV0FLMm10ZXk3RHZ2UGZDR0xtMDA0QnIwMDE4VjAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFFOMmJZV3MpYjdkCit9WWRGXzR1Ykt8Jj89PG9oM21+bDshYSU5YlpVJj9wUm9pcFJ6bzRURWtIPWElUW0zSzt9QipeQlBCREV4Q1Rna2lze3ErYUYwYUVocFklCitXKUt0WXBVYGZkPGZNR2BidHpqbDw7bD1zMjB6aT13KGROakJaYF96KEV6O1BCdXVkMHd4I08+dXFHQ0U0PileMktNTGV7bEB8YDZfdlRCCithKms8P3h3RGlpK2I3Sj1aIzNkdHZBJm8/fjF5YksrT3Z3bEo4JFdLWXg5M0tJdEMxQihFMDleRWE+R3prQihvQUt0JXRjWSFhVitgKkc0CitQdWB4dE99X2w2Wjwxb1FGMnpiejlScTxjMk01Y2hVTTE3JWE/QD1aRmBaKFd5NktXbFJYflR1dkBBTiY8WWp3c0FWMTlWUigkaTdgaHtpCitZdEAlfVQ7LU0+eG5SO2BSdz5RPyR2Y0Ezc0ImZVVZdURQejs7JGZZNEh8ajtaKSErVkZ0b2JrNSpAXjFvaT14SDAmTDhHdGpSUDdkamNECitzbEdaKEVhSWo+ZyRSRiVLejhmZzZHOH5PMjBHJWVJcFUjfj9zWlJhPERwSzxhLSlvI31LUnhKTF5yT3VuQ1plKyFrPXlJNWNULUFJZmV+CisqKF89a0wjNm9WYERyZSo1ekteVmVzdSZTaX5GU0NwIUJ3JDdWWU9kSWpicmY2dDMjPnFUfmg4TlJ5UT9FdFNaTn58aHNxJlNXIW57c3BTCitIfWxRXyV0RzRPdk1BalpwWD1lMH4yT2BLRUw/JEpOUGFkYHR2WE51XkFtNDk4OU5xUztCMGVDWUxGcXVfPE83TH01QmsobSVscnpwVUMwCitOe0VIfihRWkhPRFUrbjwqVml3cldqIz5Ve2AzfVJKXmNXRUxnRWsmYlYqWGwxWkwhV2RZNFRaNjt0VD9gSHlla3luQkQ0RiUwRj9ePnpVCitPa0w5USpLZXkxfSFTZ3EtVVkpJnU1aUpSSHU+IW9ScTZhVHRVYzlHcjdmPmltVSV0TTBmQTs8Tj1rTDxVbCk/YnRvai1yYD9uTyN9e2h1CitHc0ZXI1RPTmQzOGlQWndgfmM9IURMMD9QVEZoTUVgdWUpYk5ramt4aWJ1ZktnV0peJTROX0hqYThFQzdTaHZ4OWs9d3swP2dqdWV2QnYhCitCSmg4PVgqRnhQMDs3diF0YmslflhgRV43Ul85bW10UGs7dEI+fWY9akdUeDtqfXtHdGZIVjdHZXFmcHMwIyZJP1k7OUVAZzllOEdLJHNpCis2U3FIUnpNPzNmeTdZRiNSTkdRQFQjSXNzPThTTGVRY0F1NjNNYnw1JmB7N3tIZFFyZm4mUTk5MDRIWVp+eTdPI3hYPSpVeUJNajZ8N2tKCitfQVBLTWFpRTdZRkdiIUFqcGFFT05WKiR8ISFiYllJeihkOEErbjBETyRyYHYwPmtYWWohc1h3IUJOPW5fP0xtTT1aZ2goZGB2VWUpQlVyCis+QkZVWDgjYWA+LW5CSlpNVSYmV2dAYFNiK3pZYTdQQTZ2MWN2Vyl6eTJBKjEoUUpweG51VX12NDhYc1VfXyMtU3c9bUtvUlNvMk5VV21NCislPjAxTGVRRnEhfTxpKXVrSE18diZ6NmNrPy1ANUNCKjFLX1QoMjU+cilkZyY1OWxQdk50QVckZW5CZz93Jnh8a0V5IVZXfXpBNURnciRDCit6ckt6Nkw1RTFJJjUzZm8pUzxVIVQlVV83Tk8jP2FvO14zR0VjempkND1iaERRQmhrVnVUQnhYJE8+Z3dUT0lPOGQrcnFpKGJBPktma1pMCis1aCgoO0Q4S2g+V0I8ej5AZllDN1JIYngjJGE3YmxyQDBjeCt6M0VOblMyIz5mNSFMN3QyQntxV2UqekZeNWI1QVRFTjJFaTljTihEJSYtCisrVTsoTil9WjZRQ2A7SDA+UlZ6UiRpXkJOVl5je2kjOU5rK0pJXnFsZGpZYFVVeSFHT1U3LWo9bFA9fD1VVyErUHpgMXA0VD1GMF8oa08hCitwS1RPcll2NGM8byRLNnVgUHkrPzVVazZANlg3O0NRWEJmcGtPRE14ZHMoZS13PVpXLSY8c3RaSGdyaDgjT0JKXitMTitjNHtPLVc+eHZpCitZTU5YcihLSFZTMiYrfnd1UVVQPHgoUXo/ZSNlXlA9fjdJdChUWD9FbW85c0c2WTJHU0RDRWtGaXRWQ25rMkhgcGx7WUo1ajleUVhVQ2MtCitqYENUdWREKkFMYHV5I3AxUlUwSVRVNEVVRjJCJiopN3JyPzl+c0NWdnIwQj48dG9EV0dAclRVO2FlQkUxdlBYI3RhNDFGZEtnSmpxS0dPCitAV2lvIzVATiswNHZVZE1UTmdGcz83dGdxRTQqWkJvbVlDMzRlR1lXPF8yLWAoZGBKeCgmPjExSFphPGdhYClWMCtiO2Uoc29yQSloKD5ACituKnN6MzVKX09BKkh8KUg3TnRPKkxLN3BaeVB+TnBsKDs3cnd4USN2JFVtKHFLI3MjfXpqdT5jN1MpMTtSWHlHYnpuVmhqRFZFUEBeS2RFCit3eEA1ZzVRejZPKTYkKzNkb0RiTHpTRU5SPUchNVYpVXYzaVVIfmxkdys5XldIM2xKPiFaM0goLXp5eFZNU3VAY0NiSzQ/OHVJZGB4bjVhCiskJi10UjZJOXxndGlVTjtraVomOElIZHdWU2JNYzZCRDhQeEl3TTJQbWpmRWxxUj9OUGlEclExeXY2SVk3cTxtYkFtY3FrRjJBUkhZJnRaCitqSk1hOVc3aGxiR1NeQHFSaTg4NXt7VHVOMmVfKjhAbVByd248THdeTGE0QjQxXnJvfj1DY0BIVExvQDs7byNONUh6PVdGY21vPm50VjFNCitlPyktT143RXRVSjBqdWYmJVlRQT53XyZoVkUmV3J6OEB9M1MmTHlRfXhJRyEkUzZPTj0hN1VCRmNjbWFBUz1TU2U3REJXIT4hJk8kUUh3CitOaz1fMmBkY0hubVlhKSpUdDwkKT1kOyRiZHcwQjs9Z2ZqPlE2VUhNQnMzVm54P1hRZWwhPis0a3wwVm8zPk13R280aUJ6ND90a2xAcUcmCitWcjM1VUpSO3w1T0RfVHhybVhoS1Y+X01PJUlmTWZBcDw5S35OdVZiSTxEPiM9UTtCWmxrdHFrQE1YVGd1NjheX1kpYmBSdEU7YSY/MDljCisjeU85QGFgY0dqb2k4eU5tM3E7TD96aUI1dHFiNlFYVz84UTB+MEhQWklNcE8kNztIRiteViNRd0pzKVgofXNCJmlXdkteQyYxZil3Z3VKCit6Q15zeipteUBRQ1EpTlJ+Y0lOUjwmRj4kT0NYej5NSiZiX043TVFvZjdFMm8lNn41eXI3LT1sTDRTMDVQbVVUYnpncUs7MCUrU0x0empiCitwPXV0MEcoQD9qYVpsWStAZHBGNW08UE5nO35VYjZ+U3VAdHQ+IVZAWVVGbHBjSG1tZXp0QGo+XnZEYkBEdGZ0TmQzZkwkfUMhS1J4e3UtCitXfEJ8emheZlgyM05kRVhYZ29tVU5WVWtEZz08JEpfX003WDQlJlpYV0pWN25xdUJzVXNCc0lkanpPQVIhdkhyYyhHK3RWSiVrQnA1VEtRCit6TTQlc3VTVzUjMTF6KlZpd2AzMkZqWmZsV2FFSjt8M311cEJ0YUNJeF9qVXl5NVFJXjxVRFJsciNmZ0M+RVQ8NiUrY1ZaZGtlTUxzSF5DCitnfjJKLWVzcGZNUGNxfG10bm92bTA4QXF5VV5pRE89ZnM/fXBBRVluOUhsTndWI0dGam5rUHFZUExPSVd1R1YwfjUzVVVBYXdOMHVTRTB5CiszRHphUk92LV8/QT5DO1I4ISVtKEY3VEZpTCkoKnk1aHF3QD9HelRYbE5kKU9XPiM/NUdLeWd1cDt9NkdHRU8rcTBMK3Y3NTBIT0ZGclZhCismMWAxTzs5cG9MY2h8c2s9OXNLYW5aeHYwdHYwYGxgMyhvZGtqVCheWn5qWjVYT0Y7PWApQExKMTZWYnBKLUVMTnlWYCNoQzNLVF55Q3o4CisrWHtRWXlBO1glV0shN0d6UTJEM2Y8IyFtciV+Rn5ifkdHb0pWd15pYmJfbSpocWt9aDZyNThyazg5VVBXVjEtP0pzUm5qbmAkbzBsdl9wCitaUkMteDdGZSo/VGYhVk4oTSl0KDJQRjhnemMoYnkxQXtyLWhTQEV6MkUrSDFtJGFxODZfZzJCVXg8WWpzd2xqRmU/Vih2UUFveVYtOX1pCitNPWZONE9DWUJxe0xJbSVQZzxmR2lIdG5ZPHcrV0V+X2d8Z0QkaWZ3WXJvcnFKQT90NVVCU0ktUmUhck5jRHdzNT9ONHNVNzJ5UVJEMjdiCitWWEE7cXRRJlBMJTxyRVljPmV0b19eNyNseURjelFlVzVAPnxQfHFIaGlBb3J3KyNgaXw2eVVqdSl5cClkJnQ/JW8yTUZgNXZocTA5WHlKCiswTjlNdnJXVHQkfU9xMiY/UkEyNiY7KHxYTSpoWDQ4UUNJQUJGSnsraDRjJUwzRWY0WFo+cXZ4T1h3MUJWcEkhMDNEcjhEWnptYjZFI1RICitxKnxQRDVtZ0gmeHNsWjV4ck4tcDBoN2c/Jn4xc21nVks+YXZ4aCFfZlBeQUVOemk9S2hDY30/Xnl9XlUrdjZ8NGBXcERnVVVLSzRBWjYxCitCRyUmdip0RTBubUJ3TndgM15DaGMqSzktNUh9R3Q4fDN0cGQoeCt7YkojOXk2QC0pZEBVQ0dyU3I0MElLb0o/fCpoXig/NDR+bCh7alZ2Cit1SEFifj16KzFpQDZyX0M3dDReOGlCTWhRQ1RTYVRoMjhjS2ozRF4pOCpeMmRvPCtAYSpLTXhkJkFJT19HM2QkbVJuNG11S3d4cGlkZ3NCCit1KXlQT3EoNG1nN2MtYDhfQG5rOyM4dHJtdm9VKD9ITlZAbjZ8LXJsWDk7LVhxOTdzI31oemdCbXJQKj0tKSVoIVdKPUpPMHdjV1p5OVpACisycTNiVHdDITtROyhhS3EpOTFDS30zQWNLRjxVZm4+ayh5RDEyPyF2ezxzVnN6WmYmMG8yYk41MHs/e1UreklmbzdmZkFkcSMraDFRJWBXCitBfG49NEcrWSo8bURvY3pjd003cTh5Z3pocTlwYzZhYi01R0txZTktdF9WRUZabnxRPURmMzFINUJSa0ghaVVpNjd0VG00QEA5VWM0OyUzCitHKnt7c0o2IXI+cDlMLXlqPklaNFIjT2F3YiQpS1Z7JEpwMiYmbk96akEqQWIoRmE3OHQ7YU4kejFkemNybSNXWio3IXpQd2hXRWNnRX0oCis+LTJwM1kxVHhsJVJKWXRuMlVoVzk/NCF5KVFhdUBhMT08e0V+MU5uckQyTVlCVnEjWiNmNjNidHNWUklGcHN5cnl0STRgS3dlWkQyWlgwCis+VjJ7U2VQNChJbGJ8MW1HdFRNY05WKCVSbGowUWAqX0UyZTc/RTdkQ1ZEd04jeUBLVzNXKEI9TjJRN1FQVlpvZyU5RlJ7UVBQPEdLKiFKCitjTzE+dmYqTW93XmU7bGp5NXlGI0Z7Z31WKzVGMzA1aH09NSpWQyQ/cH41RkpBKClFO1QoQ3JMa1VIK3drTUpOM2BubClRam8zQ2skbl8pCithVmNNMlhANTNRd2UkZkpAPGdDUDB3dFlscG5zTExUOzEyciFrUSlLdE1sOVpURUpZYFVOKkJXTnx9d19Qbjx+PExZO0V0ZV9+S0VuJntDCisqZH5afUlBTHBkel5BWkp4OElrcnV2Q0ptdzI8LXx3KGF3UTcqPzN4KkMydiNoel5UNz1FVHtmLTNyR2MwZVZqTn1HYiV5YW8jajN5KWxCCis/OyRtOSNfPUA+PktzPHl6TEFSI340cmY2JStDYEkqXiV4SmFlMyZLPmN0bWtBJUArNDNDd2tXUGU4fGNDR05qITg3T2VjVGhfbE18WFI8CitMKGR2Sl5TRzlrKyZWLVRLbUAqYW1RRHBXfW41KGNBKmpwfXkzUmd5IX1QN0YkezhpfE04Kit1KVNuPlVfKW9nIUpqKGwoVUU/SWt+dzRrCitSZWtjUWpRY05hUExDMnRNLSMwLWhFRktMb1FDYzNCYDduKGVxK0BBczIlK0k2QWppcDl4OFNmK2N2NVdAPmhVMjZgPEU3KmZ2JjFCckJDCitvTSNGOG8maGxKUmIld2diKHdFbGJFYmc4cHc+eiVsbkckWVpoKFJHYyRnQGd1Qn5AeUc5Tm4+SkwoJlhsR1RUWTVPRH4hOUE7JTNNcFpgCitNSDg2TTUqbk1JRUtjVnF3czxUZ3xSQFhEYGIhb3wjZGN3OFZwJFFoZmdaSUxYcyh+Z0Y8KmlBTGN6UkFyVUk2VDUqI2AwQGVmRkhaRVZwCiskZkppQERLLWdVTiZ6Z3FhQyhWeUpJPitodFd0cXFwPGNGaVkyMj9SRjNtfj1JNFMrSVdYWnZIfG03eTU8bVhSQyRQblEkPzZQKyReX2ZxCis7dz89MldLXipWX0MxVU81Z1paWit6cSYxT0BuI3NtNnY5T1F5dHJncWh8dypmQGokRnxfcT9RZXFScE8wK0F0PSEpVDJxeFhmdyZCJDZaCisoPD90S0RHdEJzX2d+SWRUKG8mSGNPPD5INnF7UURzX0VkQzc+aSpaYn1mbyU2M0Y1cylpY0tGWXR7OzdwbzlUbkZQcUBRKUZ0USghaHtICit7JCpyVSlyVD9aMXVSU1V4ZHB6bjhlUEc3cjAxRGpRXl8lI0orTUN8YCo3NSk/WX5GTXtoc0NVSDMoYTVpMHAwQDkheCl0M0JeVitCRz5UCis5aHt2azhrSjN3MUJlMEJGUngjSGVoQ1hxK1Nwel4/emp8VlpULWItbmszYXE+X3ZHVk15JTRNPVJeJGpMQDxwI0hRbkYzaChrdE1YU3ZzCisjYkMzfmsoSE1QcT1aMjtZeVI+Z21panhwP3M8WHtnVURTeUtJM0dDK3VhOXJRPy1pc2klUVhGYFlsc08yK1I+WGlXb2dQXjBQTVlHND5WCitsNnB3NlFPeSshbnA5PzR2QWcjKHdwP0tJPlczPm85NmYpeEQzfHprPEBDc3FIYXpMXz56UDs8R0lPU1lpcSpXISglMUArZ3h8Zn03VXtyCisxRDBFUFVMTG9fdD9gbzNQcWo5NyYrOENGV019WiNSRXooJD5yMWIxSWpPNmQ5JEZ4IXpOdWg0VFF5aXVgTFhWNnB4O15lO2tzSyN1QjNLCismTmM8ZkwxfnF3KzRnYTRBdkRLITxpfjt+LTxCal82ZUl+c3pebXpQSm88KiFHPEpOT0I9NTtlMDJ+TFYxVX1sem1IVmljeWJ+Y34wbnl6Cis7X0FoT3ZKK0tyYkt7NDEmTys/aFN3aEMrRHlTRUVPOXJQayY2ZjRzZno0QjwzQ3BwUnlMSkg5WiY2Sn19bmh+UnZrKUFRVG55eyo1VlBkCitHQnJGWkc3PTNPOSRoNkB4IVdRUH4lYjBDWE5DbiVWZnQqaUlCUW81OT1LJGNofTY7I1luMVJCKF41UnlSQGBwVEYkTntNaEArOU9oeXoxCit9I3tFYUhAP0l6ZE4+bDMrWnVwUm9ZQmJldCpFa191eSV7eGEtPD58NE9GJipxNDFtKVU0NjxFPkRKQTNCKFF0UXFPNytGP2JLRGxeLVhjCis+ZWwjWC1EZzE2dzxrXmo8QlJ2S0VxSWtMaWU8ZllUPVFnV31ibnNrflRvWmh+cU02TX5tP3MlQSpyYDBzd2B6JU9VekRxVGh0fWdUNHdLCitFMzkjOzZKOW9zaCg3KEFkak9OZjluZSZ5NXJCMFNsS3VGPWZleDV4R20wdy1jeypBcTJWOUx8cnZ8YTdjT2dpaD40XyNqWkxNXlRQYHY/CitUPGJeSDIhc3krejlLQVpuMzZuQ0R7dHo5MWhiSE04JHd9JVpvNXJ+XjN5c2RmNFZCOHY+JC12YzI7RWhlcmchU2hCfE93SWMydUcqd3NsCitrMjdRWFchN29CWjglZzc8MkBLX2lRT1MwKDR6I1AhWVZ0YHdANnFuRlNCTkdudmlvQkxuJm09ajIkUHBIfk5BZllXPCZTVzZtOXt0ZT1qCitxaXxGRUIzaCNUUT47QV5HZGVLa3pVMzR9U2FsOH0pNnFfKihrbzR1a3ZwXkRvZTJtSG5VO0l8STczaj02WnpAdSZYdmc9UD9uMTZBdkVoCitZTyV1NDFNcmFHXmdePEZrTUBxJEhsNnNTYVh7UmpwQXxnPmMhVlA7QmowZ2dDaTFEMVEhUyRFdDcqSC1jRkwoZ25lOU9jV31qdTJUKXcqCitNVGIkbUwkUnZ0PC0kalQzfDZfcmZCKzJRQS10N2BoezZEcDRNbzUkPms+YHpNMkcyVj5nKE9FJmg1IVcyQVNiMHBXZjFsQ3dSXjhUVVJjCitPMzZQPHlJTUdPNShLLX5iRyNGKVRRfG5CQThURyg/K01hNGotfE0oT0hzSlJlQGtNRW14MipLSzckK1c/cGVhOUppc3xmfHVTQTlFTT1+Cit4a25sd252PnVkKDcyUk1TaHJGbENxaWlxM3IpQW5nZzhVcHVxRVpaXkNPPGMwK1clWnR6IXx+a35gNVlrXktrQ15yJXw1Nk4mVElpOFNvCiskIXMxYCs9eUVCdzQ8XmFpZUN7VEEkaEIqVktmeHkyUVY4WW1aWj5JOUZNSVMye3BZYylvTzImPUZxJlFHPSVmYmRFdUk4cG0hMjQkOTtsCitKO3FZI35WP3pKI0lFdCFnaD1uKSh4Ji1UK19XbVN0QHlBdVZDaUlhZEF8QUxePm1pKG18TXlqPmc7KGlLKCpFRU4xX1Z8R0ArVykyXyk4Cis1ZV5MS208JDhFXlcle3pyYikmJG4kTTkpUXRMcF9EfGJuJDZHOVVAeGp2ZENHKktyTEZYKFZien5XKUBVZl9eKEFpLW1yV1NNSX4/eWJKCitqV1dYc1loKmVjaGhjVC18UHs+S2ZJRnlsKCV1XnxnQXhoPXk0WVJXaCp9NFdGQWByS2F3MGNjYXFzaEZpUUEpfWhKOTJWXzh5TnFIYy1SCitkRFZSRF51NypPZW5teVopSUVzZSY0RylTdiV3PUUpNiR3dz9lZiNvWmhaPDcpeUZwLWBxaTZtbXQrSDErdHM8KFh7OHJ3SCF4N2tiRWpHCit7UDI+bllHIS1vWVBpSzV+c3Z5fHlHSiEjbjBBZlpOLUZDKHo4KF9RfiReUDN6b2tqKCEkSFcmJFBMdEpFRHZwWE08NW4ycl9OYjxUQUNaCitsaCNscllLZWkmQE5RYFJaSVptb3M3cCtBSHQ9RkM2ZzdVSD95UWQ+SXRiSCVEMm0/bG9TZSgmcH50eHEwdV80OHtWVlg7VFpKUmo4KkFeCis1YDdkcHNtR3wjMDc2ZDluRTEtXz5HdThsQ3skNEdDN0hfaVdhI2tNRiRTdXdHam5CSk02dl5fI0ZJVTM9ekdYaTQkMVZBa1dZcCpKbzM+Cit4M0tCUzlSO3FfWjVsWDZ1Q2B3SXJfMHkjMEVHODJiOUJDMnMtZ1dhP09aJSt6Sio8eVktXy1aeTVIfnpaZHsjd0VZQU1YdFluNFQrcHReCitaPUV3V05uODJ9ck5sUF5jMUxtTkkheHM8RzstNXs/O2Y7Xj1qezlad2lSeT5xVylvT1N9M2pAcU53XkRhZjV9Zyk/WVV0M2xYWHpOaHY/CitBaT4+KF5BeFFBbkdFTzZLY3YyK0M3bXA1JGstUUlDMnxrKiRpRmJ5THUzP2p0PUxfYyViezxSfFAwa0Y9cDNMLSUlYHp5cDRDMzw0Pm4pCistOHs5TXpkVk9iWC1NcXN1dHFLR1B8OHF0I2dka3gxO0RCUGNBX3xhVWd0ZUAtaFNfK20teF5nRXchKm1JcF5wU09lVX5POyl5cCs0IW1BCis5Q0A/cEY/ITI9KElmKVFie2R8WSh1MCRtRlZzfTlNTXFpPm1DPGtsMCpIKSRhM1pwUD9XfnFqa01RNGNSe3UrO0BZam8meGBYYkZAQH0kCis9M1k+SjJRVSNPMGRneV8yTlhrVlElcXFgWmxybDc3Tkx3eWZfKm5Zcm1HVnZJdlBZM2dGRlpwJmAlJWo+TiphaWYwa1IrPjBLTjttOFE/CisjP1BpZXhKOTtHLV9yT353WEpwQTJRME9md05KMXBZJG9BPjdAWSo7XmdgO3pAUVpnN3s/IVdMelN3VSlUV19GLT9WT1NDbGhMe3UwJSRUCitmN00oakMmVXllTCFjKT8pU0JXVTRhKiFsc097R2dqc20pJUZmdWtZd2FlR3xwKzZJcDdTJnI0OSo5MTlYeF83U0RsMGc1QT1rTiktQmM2CitmbVdrcSp3WVBJWmF9RGpFZTwmRXYzekJrTHZnIXZzM2VRZGdASlBANkBRKzdTcDBaQnBDKCVMdWAjbkFWT3VqT2AwPU0+QyhRbyghejIoCitNfTRtXmF0MnctUkZ8YUhKaCo0TmFoJUd0OSg0IyVlcEdtaGxfJnN4RkUofitoTzRYMD12LTJNbFg/P3t7Zyp7MCFwKmpJQm1QNFcoYSFRCityKDtpWnxLNXdqWGRoI3lFY2Z8TFI3PlpiSzF4QlJ9dDw4NFlZXnVUWm42JH5YS0lSYXBJO2IqN2xgVGV2PEZJRj9GZ0RDZGEjazQ/UWFzCitTSXlZYHtjeGVEZkghSmA3NEVGNEVDRGhzI0xtYVBzZUZtPGp2P09AOSl5dChIKyhQa0VYcDEjVTU/Zzt0e0hGalAlSXZuM2lINnR9KUwpCitLMFc5Xlh4MUdHTDNLIzhtdkQ3ckl0QSsmKU1STyhuYUdaKT40O0VQZDZtTlM0bWc1e3tfbjN7P2lBOCFwRjA7ZnVHIzNZQFM0I285UVBiCishTmsoTTQkOUpqSFh3WFNlbHc+K2BMaXIwTSlHTUM5PE5FLSlwXntWPTVCKHg5Jn5RYihrel8mZnZEYFNtbmdVJkk/ZitEVVFHVnIqRVJRCiskc3ZSakJiK0xRSDRUfkFLKkE8aj1QNUJZSDg3WXR7MThiPz0tYCZiNWF0fGRHbjEwWXh9UlVXeTtVU2FYVmMzeT1fSmBHWSkmUnV3TWk3CitvazVIYjQxVSt6UThoP0Q/bEt5KzwlVHZCIzhfLTd2Vl9HV1YwR1FBd3s3LSRLUzxJSFBwfHgoT0RuLTgjXldzJF94bG82UWJJcVlrZCN3CithYGltM3RpVEo/dXdlVHxKTTc+IWR0T15HYztsbkd0UE58PWdQaHNTSnwmJmY9fG1QQ0U1Ky1nSCh0QXNrOCVoVGZGYnxPJnJncCQ/PFJVCis4eEpLLStne1Z8PUdLK2lZRjhaODVgRyhiYy0haitEK3xVPV4pJnRlUGF9eFomIUltdnJuVnpqOEhvV0d3ZV5JPERqME11VT9oa2wzV24yCiskXkF1PDRjamBReWdAZjxhMCEqT2UlbUwoViFiR3MjSDItWWo3RHM1RWFYeGdtNXpRSGtjVyUhI3hRQiVSZHFGWHNqWjJEWl8jVyNMSEc/CisyK1FaPntZZnc1eU8lK1dZZF90OHVsbVJ4TVh+VTNmb1lpfkR4LVBwPFN7bkFLNyhBJDR5UkhAbGEjOW14VGkwJSpEMG9zekZ0e2A9XkZiCitDUmRGKEhtYWU9czRXK1pzNXczZ01WT3A1Vm9kaCg4RVZfK0U4TjElX1kjX2htdCpxQ34rY1BSIUEhQTk7N1E5SHlHJih+YnkqZiNIbmorCitFY0R2NktkSmkmI2ZQZG9xX0MhWXROQHVufCpkJFItOTk5c0VMfDVuQCZSLSVWYVZ9aCslPyE8OV80RyUqJHB4PlNEZygtYWNYT1h5QHlMCitQUU0haX5qMStGX2gtWihzKmxYZEMmQ3BnLTVwI0M3IzQzUHdVPmJqcSNSdmozTjRfODhFWXZpTSpIUWwjcSpZXn11JXglZThDTSlAYjJsCistQTdLWiU4d3lLaGJLTSh1em5hI3Q7KClUSFptRmA9RCs+ckNRZSZhZXRpXkUzfmM5Uiszd2B1JShxZkYwaXQqcH1OYSZZM0Q/ezREMndRCitzLXJ4TUJudTsqKDU0e3dPJGBlfXdHKWFJSF9fJF5NWDdVfD96O2xyUFVzcXlWXmx7MFhWKTdGa1F6O3JtejR0eEJSPHE3WHJVbVhkbWdDCitNX1l9QFR5UXMzP3gkMmEmNl81JDB0fipXPnNvPCV3YkQ4aXZJQjsrZiZiZitjSlhCUTJ2Zj9AN2RAZkxwOTd8aElEZW0mQmJJdnZqSk10CitvNW5DeksrdCY4SlA+ej5CM3F0RWBmVz1aMCk/TVV5aF9Ie0RXSWAmdy0xISl3cTd4N2gyNkprMTZRUkY9LXgpYnBJUmlgUTRVKTlUdWtRCis3aWxQejtDcENCNG1EcmJBdlAxdCU/fj87JFh2NTJhZz4mQk5pb3ZDVChqS0NgSDdDO14mJV5ONEB4Mnd5dHoyKF5uclVJTHNDYFpmYWRaCitOVTU8PHptYHl2YlZqJj1WJVZXJTd7OVRKUG0wXi1NeE1EZTZHI3I8X3Z5TyZvfGxgKldwR2RuMWxEXiR7JF9tUysxMFNgempDO045RXgqCisqJU4+fWZIR2F4K0hTKTtOWCQ8X0tIOFJ9bzNsOzN3Z1dwRzU0a3ZDcz5qIytCTnlVO0hOOysjQTd1P3V0SWQrZGFhckxhZmElSGZ6TGxoCitNZ1IqdWRZcDxkVyVGbHNpajxRPiNYPHVqITRKS1NKQjI3e14pdyk4VFEwY3V6T1VgJF4hVTUzakprcEteR0U4UEk9VyZ3eFlQPF94N25RCitBNHQpK3dTO0JAelVhPUltfSUzMW5UQ0RZR1JBM3ttUzB3MVI4Yms3MElxUEs+cEd6JUhTWnwqNko8Jl41cnUwfTk4KTJHPnRrbV50UnQ+CitnQlNLNWZgN2lkfC1ObEA1TzUmKXNmNiUhcEZCIXheKTBhNmdkdThnZSMzQz49V3ozPityVWR7cUNXWHxXeUZKWD9STGp6JVhZXm5ZbTg5CithNjtVZk0xYVhZdFlALXZQbD49THkwMHg0NWwpNk1eREhvKDsqKkA8cnFIakVXTnJxbWY1fDlvT2IpSFkldDJHKkQwQ3FVdmxOS2Y5P2taCitPazZyVTdqMDBGPGszWWZUQ3s0QVFMNykySn5RbjFtUFNKQzJhcjE8S3tvTWw5QCpUOWxIIW1RTXk0QWFLa1U0SiRRQ1JVM21KQEFNdCRRCitJSU1OPEJXLX1tV3A3RURENlElU1FPOCQ3N2VDOWB4UXo5dzlrJC1neGBSVlMqaiVOfUpRTD41NDwxYkRFLXROfllePEF3ZHp5OVlSX0Q9CitVMG92WU1rTnFBKDM2aGJfMkNkJTY2Kmt1M0FJTEF0RFZjJXl7NSZ1ZVNRI2gwdzBrbG1xdm9qR01RMiNlISM2Rnx6Nkh7VWJvRFNGZndDCis5X3dZQzZaNGJ+S3NKI2ZYWCtedDYqRVEwWXBkN147cD9qSSNxe1pmI1V2YmlCQistT1RKdT5+QGAreTR0MmE+aXc7cCMkNCVuOWAxOSUlCitGRmAhZ0prNCZCWkQraClocmJZcCpYMyhyKitkbGdEXyhiTEd1QnpFQWIybCpHcDIodFY+UilOWiYwZChiRkkraiM1UW9UUXR0TUNFcy0yCitgc0NSJiZ7JHlEYmhxLVBabXlxIWo0VD9vcmF3YkQ3PXV+TExyenBVUVBKNTFNRXlYI2Q3bzkjUCRhTVRKfFJROXFsSFd+dC1DTU5gY09lCitiMVdzTjJgTipJbHRwQFF+KUt+PnM3ZlpgK2h3eXR0ZzB9S3wkeFZPOEVfbGsrWmthfDE5NXIhdV80WXIkSkkwJENVXnElanFRZWQpN2UoCitfS1FwTiRBT3VFc0xnUHVWbCM5KDs5NnNBQEx6SlZ2S3U7N0h1REBhZyQ3MVlaMSkqRkhwaTgmJlJCUGByN1RpUTZPIz50KHg3K1JJZXVrCit2MVZ7PVVrfSt4TGpIZUdKMG4/WXJ8WGhPezwlX2skbHhZJVQ5Y2hjVzRrM2liJFAocTtSP25ZZjJCdl50XnNhdWZJUzZrMChoZm5+PChrCis3MnYmcjdpZlk9UC1GS2JQeXxBZXJJQmRkQ1BHaXpOaCVGPjlXc1hfbD9iPVZZLSsjRio+P3E2ZzNvS01VUkxYKHMzc21UVHZ9WVd4KSMwCitHQUkrRG92RXB2NSk/MDBDcUExMCp8Kk5CPzRLd3xOUGxBbWglVVM1R3xkajJCWlBmKXFQU20yc3BLZVgrKzI9KDQ2SmdvblR0Z1huJTYxCitNYDB8VHFYVGU5QVVwVE1TdVB9N2RYSno3fkRBdVRQUS0wVW1hQyslbVo4U2hIVURPWWlJe1lPZENrYyFgJGg/PWReUERvVD97e3x7MCphCitwXyNuWHQjdnY8WHpzSmtLZTh7S1A0Z0VnPE90RDtwMldVViVNTkNXKkh4Pj5UMz0+WWZaMzYqdVQ4SXIlR01RbkpzdzRiYWBjWkkwcjI5CitiKnY2X09ecip+NERtXj5oPS1Sfmc3UzluTkQ2K2pISkIkP2JfR01JQWpvPVk1T0RYIW9Lb095dzhiM1RYMEpIaiteeTFuKj41OF9zYGUyCitmMiYlYWBgMjh5eiQ5NmpEanpANERFfTJMRHQ3e21fMWxiR31CbU0jWig9V2hjJUFudmQ0RXpIV3k+a0okX3A8aTFYIX1lZSNqQCZZalhHCit2YD9NOT5vVn12aCZiZk08Nz1aUGQ1TWtsP153YDhxJHJeP3ZYV3c5eChNTV4hO2dnTk1saVo+UzhVcGRMc0h4N0FlcDw8Nko1V0QkK3NfCittZTAyYE9hPHdTYzwoalFaYz1Pant0JlVUV2xqTGBLUUtIeHBmV2Q7JDh+QklnYlNMXlIoZSF1fSR9bmZCYndNVzBtdjc/Yzl8WC0jSyF8CittWHJlfGlsYlRTN1o+cCFGcypOPnFuWXgoYVVeQX14ZV8oOyV3OW87ZFJgMURWeG1XdTJfOSFFI0hZeUVpKklSezFMOTF+ZjBkYDt2PkYxCit7VEV8NjMzX0pfQWttRWItcHV5PD1yWigjLVlQX296PX5KUVM3RzwyOEJ7ZERaJU8mdSN5QFJ0NyMjTG17Nn4jISswKUwxaUd3WmNPRHY3CithT0k4U3o3UnBuRThsQ0BlZGo/fEd6JHt8TVByTTxOblhWQHdfSUFXMTFYfkgoOHVkYGVFN3UySnhfaGFXYU1mSjwxUE5IbEBzIWdGZDc5Cis0Q3lFUGA7S308XipJMDA5PyFmXzYmKTNzbWZ0IzUlSUU/KzA7TD9hVzRjOz05WVppbU40fiUyWmI0cSFESip7fTdpZHdUaGY1P25qeypXCitrN1MpeGtPa2JJN1VeS1pBND80QSRKMFJvRDh9JkVBVzQ8byR4Q0ghMzxxdG1YdmVTTlYpX1EpLVFqRitCY0tFXyR7TVQkX09ePmhiS0VACitoKykpcW9BUTYtNXJlSGJGK0x8PVowQ3pFR1NffnU1d2Uxe0FpXjZIYkI9PFlmM3I8M2lhMlUxU2lsUHIlO0NrSlN9UnU3WEl4QzFKKiZzCis0ezl6diQjP0M7MzExQipjKTd0eyl3RHJKaTFYc1MhYVpNRTVBbUUlX0Z4cnJ1biRjZnR+TXBuZFFsTWROfDRORlBKWlh2ZE8heipaPCUtCis2KmhqSTVpd0g9MlUyT0IoWEVCendiUEV0ZXBsMS0zZm1raHRgTF5NdmtAKWVJSXcmWXE5eT5HcUFuUmRYMmtgIVRgQSY5O3NqQ3QjV21SCituOylqRnEjbzxra2d+ZjJHfWtxRyl1T2owXl89cnB6KDdqWk5uP197KFI0VEhpVVdHYXlfQWZ8SHIwb0k9UWQ8TFImciE5ITt9fClNWWgyCitHJmI+YmdpKklqPndMSFZxPz4tVVItb2RnVFZPdUI5O21OWmVtdGk+c0h4cyUyPj1NJXVLdS1ZVEMpejVBWXdtZVlaYElNWEdSUmZzIUczCitSPDtoK30tMHNIQH1UPn5QQD1zJT1tS3FjO3A1bGA3Yzs1Nj5qYThTJEp5PitxM197XjF4YGZqfU1udFhpfHpnNipfYXYqZVgoQFU8Z2lrCisyRmpPelY8Z1F0RDw/Zm5BfkNeRyZobCRRWUFeRWt7aV9VO0xjVXZGSEBIOXBGbCZNejhXVXZ5PFFvWWFAN3I+QEtJWCV4OXVSeG1fbG1XCitBaHt3cHprdXJhblZZKkRRJGpHWU5KP09sTzlUN2xxMUV9NzV4T0RiZVVwc3dUaXdEZFE0R2s4e3FodUpYbT5DajMmdWgrMTZ2P0ZMWm1nCitTVDJpc0wwOVdFSVlQP0l2RUp0ZHl4NitFeVNqUzd5fks8Y1coMWc+WHhxQT5eeVJsYCZudmgkUzYyOyF6PkhyfGB0c29lPTcydHtjeGJjCis8Yyg4TkNSdm4taXpSYytJIz1NZFM0S0IodjNSfTc/IUM4fjV0JjtgS0lUZ1hGbVJEe0E+YkJuMFV0UChISTdFfHpQeGVRTDN9eyp5cTY2CitvPWpCNEVEXmFJWiVhUH0+MSpraXRUKGojMyhgeGF4ZHlnS35NdWBiUGU1alVKbiVTPVkodnE/OzZKQ2RPSkVwcT82e21QWk4mU1d0N2t6CitNM1NgUzgkRXdTXmM/bnI7PDYoSF5lJjdWcVYyem5DRGlxV2xsPkpsfSZIOGMyTnpWdVVNUSsyYXtQQH09R0o1M2FIb3BuUnpDcCo7aCFnCiszZiY0YGpQWVNGaXk2VClrS295PDZQdnU+K1JAKXJwMH0/SkBPSjhYP1JEfSUyNjxSNDw5cFFOZ2NeSHs/WElLOW9oYiliYzdJZjBfKzVlCitzTExaYlAzWWMpXzMlTSFPbHAyRGBSRmlOZm9AY3dTcnE0JWBDODdJK1VZam44NkpyPm5CTGtwSzBHS18tO2clOXAyS3NqZ3pBeGYjU29JCitDQi07cFE3fjU+SEZOUElxUkE8Rkp2TUw8dXooe3UwYjItWD9BMH4zNVptMldQODxJNGwyeXQoZGVBO1Q8a2pGPHFkWlhPampzfHFBVDQ4Cit8PjZ0bWdUKiRHeSVXO1N3JkxaPXZYUChtNW5gNG9meDN7Tm8jV1FBdmYxfCpPLSZ7PXU8eGwxNSNufVdRWl8ob35hZkAkbHA1bWokR09oCit5Q3prdi11fGYycFQje0ZwNzI9X0xeMT1INUQzNnlfRkZze3QxM29zeV87RzRQP0ElX1RmVW56fU05bFNyVTc/b3s5YllXRVUrbF9wMXd1CitIXlRXIWhsQlYpJmYqJSUqYlZ8a2drdiowZWxgKnEjSzEqZUhFR2RRPFg7aEJfMkF1V0VIQWlldHo7SHlwVFhnbDVxdSM0IVV9fXMxO3FvCit8NEB4WSUhMGFFKE9KcVZZU2tgNSRPS3c+XjVWXlZIVFJsOWtPbS1TM0B1eGNAI1NifnZrSjcyMWRXbFFxfil2NGpsRzE5ZEMtI1BOTSN4CitsJCNnbDNiWHYmbDV8WkYhQCpLO1coRGQ1OVZUUEUpQCZyeFgqdUhkKmZfYEF7dWRhXkU7I1F5O3pSQko4eG5lTEQ8U2wzJj4wdkgqUUFACitKR00rRT5yU3JtKjtNe0BxI1B0X0FROGkyX2JtUWRUWG8rYmNvNi0hdXhJZ1lYMzI9JipgTmFJbnExYX5hNDwpZ288YndOdVl1JTd0cTlvCit2aFpTWWdZMDtsPnhPamgqeGY5QCFyTUZgPDdpU0BPY2FLbTNGdEkpal50JV49TSFac0dRPm9fXn4/dl5QSWhKe0xCUGpHUDAoRDdJLUhhCitCQSRBcXZWZiV3M2NwTEBubn4le3VaemNVNGhZam5tbD03UmR+ezBlcyg+dCViSF5eN2dRe21YNXl6c2w/Oz1PZ0R5bXAjITx3XyRCS2pQCis+RFBaY3BTOyU9azZUMFV1WnViNmNZITU2YmJrMCZHLXpxWGxSIzR8IUNMQiZUUGpZZmZ8Wk15JW5NX0FJRkFgMTFZYWVFSEh7SyQxSTlhCitxJE5AOD9FJHZIYV5TclMoTzApdjd5b2s1M0NvcS1rcXZCWE4qJVNDe29eUk5PJXkrK3E7TzBmY213MzQ8Sj5CWTxOYzdGT15Ld18+WUZxCitEMFVnZnZ3VzY8N15fPypuXl47ViU9YjJCJEBhfnxyPzZyZXMlP2pGU20zQ2BzJEMwNGshO3VRZy11eDtUazxPZmxxVUdKVnYzNVktIyhXCis8QF5JeUZlTWFpY09paktyb0FmZVdWSFZlQ2VoK3g7OXRjWTFse1U3UkU3I3VRdD1qaGt+OXp5WnxBe2U2TE0lfld0PWV0Jj1BODxrNzNxCisoI3Ama3JpYjA9YGZtTSNJKXtGZnFGdDhab0tIM0ZyPF42eFJae2dLdW9tbE1QSkBPIX13VVVlM3t7OD9qejx+VzQhMDFMSitWJWx3UEk+CitAQT4zQThvP2AmWnVvZUtEVmglK2AhfTlUJDFpIUkxYXh5TENpVFp7SzYtPkY8dm1AaD1nNGtzUXh2OGklMHtFekU/S1pyLSRtfXxtNWVWCitnX1BZfVBONkk2dmtuSVZ+b19PNmEqZEZqQD45PUFee2lUWW5hbD99O1NaV05+dVBBfDAjRWgqZWsoSig8SFFQRypxanFlXms1RWBPK0EkCitSTEdsQFVLUCFkZzhgQjxnY1dHbTtzJHZ8YH50bGQyYkBVSE12YlAmQX4tTVIjd1FGJDYxRH53I0BEPjhBaXJsMnZHbDVFaDg/dWFVS3FTCis0Tk1MPGlFNHVURUt7Vzd1cHtsbllBPHE0Vnx2e3NYazN1WWs5czg5bE1aaiZJO2lKfXxrbWd6RklkVEdqNWtKRGVBfTM4fnhmP3JAalVrCitSYFgpb2t1PTFtajYlM1pWTTdhNGxxXkVIYkhQRCVrPCEoU1JZfGt1b3ZUVShubGZmRjVGcVp3PTRwfmNCdVZ0bG1FeGFCSHdyT0dRTEEkCitMN0xUfGBhO31JTC0kazhIdk5rbzcyezR1KUs5QVMjYCltKGBvfl9QJmU3SHNYeFNhfU1SclJpYThkWkdlYCp2VjBxeTU5cnp+Yz1zLW1jCis7Tz4hKkxSYFhTK1JrX19BVmlnUHg5fm5eIS09eDdJbnU0JHdUYGF7MSNHalp1Pm9HUEp2RXMqfnh8TmlsWXdSPzw7Rk41WHooPWl5UDttCitlPCg5fHI4SEZsTHRnYkAqfUBhYzhiKklseSlNRV88JXUmRGghbVMrNT43emZjfWN1Xm1nPklZKWo3QGJ0YCM7aDxoaiNHaXQwVWFDTlRQCit6Z2lyMkh1QmhuK0s+UXViPUBtK3A8KyteTC0wJj96IVBuUmJYTHdgeW0lakctakQlcn03RUl7fldJd1chRnxzQmNyfDlpRUtZP1U2UGtOCitkZF8rQlQ8UFhYVXBHZnlFaTNJeXQ4RXQrZzs1QmBOcFhCYFN3Zkg7cUhhWjV5e3NfJGxYZnF4SDV4XmwybT0+K1k+XyYkfXE/fFJBYFJzCismZHdOdVJMWClsPldLUVRjNihwYChxYnEycU9mKEI1fTlpKGh1R2B0TVU3JHc1bGU3LU43V1ZUUTl6YGl7cX19PEJ5Yms9MUxybmJpOT17CitzdFVVbjZIPE5YM0pNMkpydj88SG9STkJwKTt0KnJLYDRDdnVzSTswTTUlSjJRd3cwVTxnJDtWQk4xdSZ3YlcmcmF4I2xCN3VeeThYTEMwCis1eHBnO2dVO3BDQmM5RjZ7TXdSRFdvSChqaSk2KGwjcyNvdTg4c2l5RSl7ZVJjYkN0NSEhK25+MF48UktCZlc5aF9CUnpCaDR1X1hpKTlPCitDT3xFJlYjO1Q/JHRhbTZzQylQPXs5IzdTOyQtTDd9IUhOQyFvcGx6ZW5fM3pGNCE+cDM9XnBgUlZoYlYwITxtfTliRHUjWmxEJVU5U0Y/CitKemFgajNIUyQzblp2KU5aPUMoViFLKGIme3lSJjtSWHE5c2VEVjNxai1fdU88ayg9YV9TUmZhSjhgRyU1PDtnSD1QNm97IXk+Mj4+Wlk1CisyX0g7UClMJDV3MUlAPTt4NnhfcWpvQXV0e3I+P19POUtRSDAwMDA4MFB+ZD1OOCQjflRuUUJiMFBzLSYwMn19UzBCfnQ9RkpFP0xaZSh3CitBRkp4KFJiWmx2MkZLS1JNV3EyLWRkRj8jP2JLNXFTenglSmlDNl4pOSUxb1R6Y0p7UkFvNXtORiktITQ5dkVBTDwken4qcWdlMjR5JHBiCisqaytNRTV+X3FfKnoxaXhmOCQ9cX4xPHohLXQxUmZzVl9qPl5Ob1NsQWclOTBgI2BGaDRHeSptOXBKfj9AUUB8O34xPHo5O1FNemlvQCFkCit8flJgLT1UcDxuZi19I3leUU5mKTtOQCFnSXdfclZGTXdvTCVxcnJwVmNDdkNfTChhYHRVZTwhUCkxSmNBbzlTcXd3dlQ4ZD8qMzs0QmBvCitOc3hxNSFObHw/Q3NVWDwtNk88Tkl6Ozg9UEE0UjtvYVRNKWdPUG5ge0N2bUE0MG5tdWBMVSEqKE8kLU9mMjJjdFhRdk0zaHJtMitAMER+CitUNGVSRllGV3g2O2lgVkdgTDxrJWpHdChecFBld2NSPGhXX1kkVDc3RDlwQ0lxWCNHYUcyeHxWU009fnclMGhhYihyVVppJiZScitQQEJqCiste1lFR2E2U3lSUktxMzEmRFlqKi1VOENeM3lTd1dAIyE0aF9EIXVzKlhwKFVgV2pGa1BFM1dqRTtwXipJc2Erd3tAN0hvbHhiJl97V0BSCitpRHBSIzJvdlVGYVFKViE3SklGWWFDZFM3eGl2RXc3UCt+YFQxWTxNfmNpamBkSXtnbk0obD1EPFQmcyMxWnhWKUNkPE5vOVhYJUQ8VGNUCis5LVpUKShBZjtlNExRVFJ4dnBQRU5rTHtQeFh7Wnx+KztANG1WR0E3fnRHdkBYQGA8OyF3a2lsYCpYaTMrKTwtJEM4ez1KTChrQDNGYWdlCiszRTFeVTNNS09fd2t4dmZseGgkI3F1WWY9IXMjKHZ1RHJmQDcrY3lXKlNSZ08wR2M2NnYkc2BkTlA0c25XNDU9V31OTVctaGNwS1Vyand4CitDUXg9VE14I2FiRDBIKFYzNzMxb2EyY0d8KldLbnkmRWNRXmpzd0FuKFFfSmM0anRhNUB5JWM3e35qMCFEUE9UVXljQnZxNDs5Wj1Rez5uCitBeUNVYXlPOCZJKXhgTVZNJlY9SGlCcnAtQjwyPlFmTiE/JXUrPlc7aFcoSVdOPzhscTh0WFI+czIjSlZZdHlvQHdJK1EjU0U1VERVWEtjCiszdXkra1Q3cCQzSmkwKEZsRChMJnJLNyF5Yz17e3gmQiVpSFp4QmojV1dSJF5VQXZKbH48WCNyeGwxIT5LPiZXZENUSmt1TmVBMTAteTNgCitBZG9FVXNqe0hiYXFZaGk+PT1qOUEkfGh6cz8/OHxudnQlXipZdWsrWUQqRl8+RGgzX1F9fkMxYSNeUzdwT008UFg0ejZoKjkxMCZMb1QjCiskS3BeeTxtTkc9dCpnbmItcHBXM15QRFp3O0wmeSV8WDQ4R3M2d208JENQLWR7ZS16aEY7MXRLfjtYLWNpKW9hcWZIMTQ2e1kra3VkKW1YCit1P3I/RlIhb1dmekQqMWk1b0wlNTFITU0wIVFVPilAVHpUVV9tVC05KEhQP2hjIyspQ2xRXyU1X3JQTSVCJCZTZjUoZ2o5T3I9R28maz5PCitrMTI9dl9Vb0l1fW9lY0hgQXdndSQqe2ZrcDJ9bmNwVldxJXAyX2sqcGR1I3AwNTRXREw9dzJ1am8tRnxESVkobkI2SHQpdDdVWUN2ZCZDCisoMGlFR2tidkAmU0I2fDxkKU8oTkdeIykoRjZSMncrZihtVH4/Xkd0R0ckJFVsdEV0cHxsSH0xfDIyfkc9fnozMTErITMlM1gyaXFlOHRfCitSfERiOCV0RHRHbEU/WjZCNnI5fUpyOWVxbE9rWGdGWTk0dl9FJFQzZWVCI0VCRD4kVHAyZzUyX05lZzx4bTdaPkJQM3olQz9qNFVLPzZKCitkflB7Q3s4TEpYQUVAeUp+Qj9KRVhwZDJIQ0pyMDBCYjdJTG9PQ21ffm5jUHtIbm4lN0JIRD95STQ+XzFVK1BpX3U5fH1mWUArX3c9b2BPCisrakdSJDZPeyV7I0lKNWYlODQ+UkIjUjlqbEJoOXp0X1Bza3lrRFdsQis7RE1WWmVrUGQqfSMmNE9iTDdnbkBlJmpNekBVdCRXc09PR05WCis8KGdRU0E2aTBOaUFnfEBNYjw9X2xqVWxoYU9UYGNUYz01VzApYCFJX1Z0Knx2d3loTH53YXsxcmxZSDQ9ekZ6b1o7PipGM3VUVHJvaE44CitBPjZ0eWpmQVNVJTlnRSM5fjxXby1xcGl5TjVfKiE2ZjxwZyV6JnMmMm5jP3hrQTFTODYwP0J8eFV4ZEsqakNxT04rbllKYXY8NTNeTTExCishNDAjKC1obXIrYl47I0dXUFJJcjM7cT9AZWVCSEAxJHVAQm49YWdjcms5Z20tTlAwOFhHK3JxSEElP2VAaVMwWjkhR1FMOTBhWGV+KndKCitrYyp2S3teP1BOQkRVWWZYKFpGaGE7fFg4XnROOHhgaGB1c0BUOWYlKWdlOTRGcFI9YEF9R0hUZWcxPFJEcWBebUlmN3dBcTk7YFpORiZeCituTCs5fjgmPjJ0N3BSb2NDZTkjTWNAUWIraVVaaz94WlJyPmQmNmR3ZTlSVyMraD5iOVFiI2wpLVVxTkNaeUFxKUghKHdNajBaUSFPJmJ4CitoeXhKfVNWUll9I0B6LWRCc3gxJElha1RNNl99Yn1Ycmh3I3lSO3EtIWZXdTl+I1JKVGtkPD5iZDNmXkdnd2lTd3lGPTw2X0x9P1AjazJECit9UGZobzhLU0x3WSY+dERhdU1KZntRemtNSWZGeDxodzV0QnhXcVc2SXBJU15qWF42KSQ8UWEtbSYhISMwX1p2bTRqZDtoQD9IIU1BREZHCit3WlJ4e3Ypa2pzZykmZT0tVWJAZjtZd2k2N0QxKjVZcktPdjZMYUs/dExsKXRDYDlXZU8mJUpoJFRJPktOY3F6YCsya05lKkghYUtgfCVmCitGfVRUI2JzWTFhQ2pxR1MrTiUybzlLeTRNaCNqbEJvQmxHKzUhUy1VJCZuX1UwfGxVMGNYM3k7RGpfSFgyWXdVJFRGdEVTRCtge1c1ekdhCitRSSFCVW9ieUNDNilkMW9TIW85ekBicVdmIV5xSW5QN3BLO3B+TkwqUVlNfXgpQ309LUZ7fSVfam1TOD1sVTJ2UUUwaG1IZj5MRCE2MUVjCis8Vk4+e2lQU01YcTJwWGh6Q35EdiV1KnclcUI4aTVoPzBfez5pcChyUilxWkl6SnBnRH50OzY3amE+O0lKI2NiamthRCNsMzYkJngwI1M/Cit3SzY2P0hgK2R3dUNXVXhUc0JeOVR6a0BFbHReMWdlJXJ9KkdkI3BLNFE1QXNzejdeXipnbDd1NlhINnw/akxoTnVlZTh5cX4zOSokSmR+Cis1OGtLfFNydUV6UVhFN0cmLXl2M0UqOVp7MDcwITJwMW82Yj1pZSU4aVZ7RG1oMUIwMHJZMnM8fSFqOT5BbWAtQl8pN21JUz8jOWRWbmZsCitaYj1VMHBDRHpLTH5LTHB7ZyFLbVdtTDtQVUE/Pm0/Q0dVej4oTWhjKDVRZjQjY19BMEZ4K0pfMy0yMkk8VW8tcGc8JTMmYXZLIUx5UlJ0CisoJlNvRk1xRFp+ej9jb149c2kxZWpuJE9KdSpONF9iWWJzWk9AV0ZYRmQxRWAoXlpOSTNLZGpOUHhJbmI+d1dPU2p+RT8waEdXOXw/Um1RCit6R3o2akQ2TDU8N3FlaEs/ND98LW87NHQ5Zm50eTBqKW1yazF4RkdCTF87akV5VzFWY3crIzJiJWJBQTxnQldOVSR0SUoyKmB4Tml9I0JsCit9aDNsKlVfTW40ckk0PmliKGQkMHRrc0dwJXorWD8lVTF5UVVMRlpBdThtTz88MFkpKX1yMkVrWnYzdSRnNFhwT1R8M3xOQzxFOTQ5b3ZeCitDeFhsU2E+XmN7Nkw8UG13PHFfcTZUO1J1dVhKbU5Ya2NacWpyOEBEUmF6YWM8U01xMH5nPWZXYUsycWt7JnElNHNkZU5XR3ZSO0U3Vl57CitROHN4b0U5LX5EUTBpckdLQVlHWTJRPT0zUCFPVVhtcnEzLW1AeldtTlFpU21mQjw5WVYjRWNFY1RrKWJxWiU+ezk/PCVNSlFUKDQ3UyNwCis+REtmSHRpYzxtdENBYzt1MGExTzNiNipkKjZSUnJKMEombyhXJGMmI2oxfnRhcnQjJSh1MTtDbjM1KHxlYVB5M0F9Qjg5ViNNMHE/XyMrCit8X3kyel8qbnZTSG5FQkRvXzB7I3x3QVQhUEE4UGd3LSFMPzY5ayZWd3F4VDN9bT1MKUcrWTJFT00+TGlue0FZa3JgJnJxNkw4V1hgaEErCitNX3F4clJvemQqX2F2QUlVfkt3P191PSFHQ2lWSD9QZEt5SCM0VStwO0MjKFBMeCQ7eCslOCVmNSZmMD5lTXVnMjxDUGFCKGQyMXVGK0pKCitmJkAqWE80OFZXTUBBMTM+ZFViYkpCemlfRVBuZXxyYHxwVFdDV2BneENqZUtkSUZydihxVVElZ31Ge09jYjBCVXd2OE1JUC1XQnIjI3JWCis9fnlQNiZqaXN5SThibGIhSDQ9MyVBWV9ZYVl3VSshKT5UTkMkS0MzVX16WiZATFl0YnNpTzUtYT9uKFYjb2oyKndHQyt2WDBxQWh2VDM9CitEUXR8RnM+clo7JX18ZDhGZkZ0cmo7cypiUU5ZJG1ne1UqS3orJjlKU2QrQlkwYk10RGB1TURBQE55alV2QDdXPGxmJVVpS00+aVVJYUNXCit6VExoXnkpMFd8cDNIIUkrPmZCaVE2VHZwUVRAMigmalpObWJ7S2tTfnVuWjZ2bzdsPnZVeFRxc1h7LXZ3NE1tKiNjRXVIX2BXQSleTnJ6Cis0NSomdTR6OWsqd2syTVgoYVh0PypiNGhXQm1OYGpDZFhRaDU1QnRpV28kQzZgWGR6eEpWemxkX0NYQSV1djJhTXV+UVQyODMyPytuZlg0CitRIz04NUhrWTZKSylWTF9Lais2QkZ1U0leQUQ4SGtLSjhzPGNXbHs9dDxJMVYzZHdAPSlxdDVSRD0ldSY2TUIjYlN2Kz0zb3dhPUV0WFlCCitERXgmbksqZlgkPUdkVjFfQEowR2NwVCphcENqO0lkdWBTWigocks7cUxBcCV3cjV9bmBpOGJEb1lQUTB9K0JMayh5endVSH5wfmhuNUdqCiswUDJlXmtSczZSdExYSz5CITkoREBSell4VjlUSGBgLWNRZ1kxUVFaJEdIdUp1KT57T3VBb2A+dWUqUXpudU89WVRpYjRJQSUlQiNnfUF6Cit8dD5FO195UzloYGk0QyRKayp+e0dwcztJe3k3JlFIQTYyaFQ0S05CV2dMV0x3R3NYTVJ5RD4pLUdKblFrcWFTRUFkeXR4ODA9WUM+a1hECitgak42XkEjQkluSFBCPWdzZiglO1FmdXtKOSNjOVVvWDU1djBHQi0tI3QpNVBifUNWdV85dWxycmleUVVeSlFCeyZxYmtjME01O1M4MEtgCis/Zj9RJURNY1o4fEF2JnpHe1QmJD99IypAdV96d2hMdzdec256Ylo1cng4cXZsNjk+LVRBYSQtbj5HT1p9VnFCVDg2aGNwbkM2JHZ7bm1MCitsd0RjIV42cGtqelc7SXdIZStCaGtITFI5Sz1nI0g2fFo1d3IrYG9IbkdqP05QUCV6SHxwZW9qSnEpPj9WLSV9PDRBNmA8VURrYyFUUHJXCitgJSZoUiVZIXREazZJekxAb0hLbTY+aCQ2SG44fUNFNDs8NnpLNWc5N0ttUzlGeGtXSihCay1MdXhMcCE5Qm0kUTxsX09Da0MlPG4pVyF1CitBWkxrPTdqUkk8ZzRVMl4je1lHemJrSnVtKXsqYD5XZk04T0ZlTDx2dzR0UjFleCZuVkwoVnNnWWpscyZoWVk0VXBTZUF5MCFJTj1Ee3QqCishZFZGVyNvaVk8JlFibkAtUjhSa1hQKXdIUGwoTj13OTFNUk47bnZ6JllmUlFTSDc+RkNRKUxMLW93MTU9WSNybXY0O3xDTU5qZTJJRTBUCitgdClhNllLVSopI0JpVWMkYDdxM2c5aVl6WW0qcEpFMkZucXV+Y2JrPFI3VW9kWkM1eVkrZWNfYEhSXnp+P2kpUyhzV0s4NlNDaV9ObWg7CitXZ0Zmcz1AYjdwLSthLUhLdko5bmJ9Zys4U3ZNPjBOd0VWdzxZTUttIUxhcz9JeTF5NiEpXyYjV3EmTlQ5QTZeJnRPQjJ1XkBrQFZiT3hyCitDMXh9b3pacn5Rd1pWYFRNLTZIKEUkcU56KndhRlExWk1UQFRacFVwdTxqbyRGTntTbXs+KWpHSHt9SmxTYy0+Wmp3YE52ejEjYVN7NiZ0CitnVG1CQDY+fExMKnp8bWNrYU9jS2VQMSlJekZgJHslJDFoSmp1YHBxZUYqVCtzRXB+WiNXdWxUOSY8K0EybFNQfTktWSFidXU/TUwpTVI5Cisrfl4wPE9COXAhIUN4IXs8I25VZS0mZ1dSeDkwQXUlIT02SnhjazstPzQrfk84WlNCdTRjbzMhVm49fkFiWSpydXF+cHRoQmk1STFKfkNPCit8SUNVVnBAQzM7Q1BQZCpEfG5BfDUkLTJASnBGSEY3cSZzaURPQW98ZiQ8cDZ4XmZWJj9fV2UhQEt8blljSWsqPSR3aSRxWX45MFFJSGQ0Cis7JklNY3gza2Q9UGdAK2lsND8zd31MS1pqQXN8XnNXMis1PE5sZn5EfFg1PGdSMGltVjlKYH1gR0I7ZCVgazJ2bD5RT3tqT35vPWFqPDVkCitzM31kVmZ0Iz4rTn5MaUFTZW1gQmxuZmtxZSQtb0JAckRRP2BoWGxXSiY8QklIc2U5V0M8fk53e158MTAjcmdnSHpEYFUjWmxoVVZeX2h1Cit5M0g0TnRrMCpCcTVffV4zNkZaU1l0TyNQJmxjK1UobT1HQDdNS3JaWW5sNSh2MT16ZVVCeHc4QSohbDMjUXAjZTF3WXAlam5BayVvRyVFCitORDMjLWUhJldzdld3KS02RU5RZmZjNyF1dSUjMTJ1ZUJnQ1dMI1kqdkRjeGN9QjU0R2FlNCM/Z1c0cDdZeiZ0M0ZPKlNKR1BJVWdJXk4rCitrPDFqLURFeE9heylVSStvVHxVdnFPcm5jUTtyb0p5Kn0qZClRMXA/P287Rj9uamNPKi18K19TQz1XJS1nTD03YFhtY0Nna2pASzt2TiZoCis/RzxTKUpjRjsqdThIYW48S0M1VSUxPVpnbERzYXdsK0I0R2dUTlh2TkpaKlNSPnZOa0xRa0h6RUo/X2YtWS1zcEw8aWJaNSZScHZ0YD9LCitSa29ANm9XJntsajglYiRAJDQyT15TS0JKXn0lbENGQDl0S1l+dChhdkN8UHktZj9wXzN1Zz9AU0lobSZtQmBWKHc5QiFwYV98Jn57aCZnCitLcjx2Tms4OWMoZ3A8UHc5dEExNVJoOy1PRDIrT1FVP3Y/bUVDUFRrSmBfSTx7V29ta05kTnhvLWkhbU8wSDRIUGF3dTNLMDJjRnJ3JHw8CittYXR2QW41dWBSTzBYT0Fyb0JHO2o5X3h7PDFoNEkkRl98VHNraENxI2w4M2YkQzQ7fDllaDlweE94RFI7akk3RG15bWg0cDZ1T1dffT9uCitYSkhSXiNXcGhtVVRYU3BYeHhKWkNeb0d0fUBmQWsyMnQra3I7NFpTMWMyd0lKQ1JaYXdKJHlqbTZqenJHMEI1dWFqe25kSHg5bH50e1FsCitAfW1IWihyWVk4PXlJfXZNeC1GdmZDNkh4NyFLO1JieX5gUzM8KTEteXJKZHBlNkYrenYkc25AcGNjbnojNzZCPmBSVnpFI24lMzNxJUpHCis5SStRRW9fO34yXzlDVD8kRXFLWXpoRUthVlRzfSFWPjFJWExOUmo9Mm47Smw1RU9QcntAakt8ITUrUm5aeyVRVHdYcD5QY1NvNlNlUmhtCit4QX17Si1iMU18I012KHk/PSYxdlhxdFpEZD5rQip1NEA5KFFmb2lBZmpRKzhKeHxidU9uY2RfRnBYdChJVGdHdTd2KEFXR0hzMiZmQE1+Cis7ZUMjUzkxLU4yX1Z3cHBMQ0slWmxkYzlXMSZFKyV3U1BqSmdCe1F3KXJIc1A1b2Jwcz9zQHUpP2JXXkU9TUtvWjtEKnJ0PT1TamBAKVJxCitmNXg/cCQqQj59Xn1QVDtLWWYqaWVeQTUyKmlQbE9xODclXlA2bT5xWXAlOXEoZ0M7VEh9PEZFMkk/QV9fIzErbEBHTW1LNUJjVjFIcEBTCitUcnVGcWd5bmdXUyo4YlA+SVVJb0YyZmNsZylBemVKeUVkYjE/UWQlKGJ3cjFiOV9vRmheI3chPiRCOW9xaERyREgzKldvUXhrYSV1fCZXCitURThiN0lXZEVkZVFAR1U4a2dFRkM3Tz5mMGQ9T2YzV3M/SUAoNjJLdkRlWkFmWnlZcHk/bHVUazhvaz9mbiV3ZjxBPF9kTihobGx1M256Cit+JEpieElgcjZ3YDkhdVNrWXd0ciVCd094eC0yaSFhWnxPXjR4M1MjbVQzc3NxR152Slp8OCVOaDtRfihQPyEhcnwzOWI4M2smKWleYF9xCisoTSl3fVE4WG98dDxYfjRkJHIjajVMRm1VbDVfeXpqVDEjUTZ0MWglSkdEKTxBZiRlbGxYcGBMKmBBNz1ta3FgUEh6YyZ1ZUdhJVNxR3g4CistLXpXKDQyK2R1TkYjaDlfQjxJOFBBZlhgPWlMZzhaU3pYYERWYDMtYCRwbHAzVXgoZXBgMXJ0NWlqci1pcnBYb31HTVpwJEp5QTFDe3B7Cis5QTVVSDMqYmZlQVUhb1RWLTB7dEMheD85c0Z+RHUqUVlkY35FRUhsY1Q4SnY2T1VvNyt0aXw2eD9EMlN1ekZMZlVZTUMmRkxhKiV4XnFmCis5WkBrOGRyVGNCRW5ncVlXTWhwd0x7aithRiNMe1B0UDl6I1o/Pnhrd3NHdDBjeHs9WjdDMzlPezU+LWRUMVROZXBXR1RPaHg5KG48JFlHCitxbzFxcTRqdnY3S0R0YX0lJnxRT3c/NCYhPiNvZjM4YyZUNz1APXM3cDB8WFFSMDAwTzheT1k3eXBJPmtaRkVSaUN0SGJ+Ujl7Pk9WYUF8CitOYVV2XzB+V04mZ1dXTkNBQlktd1VJWTtSKj5iWj5IVkVedkE2ZVFUSDdIaj9Qfnt1TkMzY3U2SHsrVWA3ZE13NTJkPDJXMU5sWlYlS1deCisrJXdxb3piayYxczJMTlhsKHhvZDE2NzFyUHYxTzZfRnM9QUx0VDYxUE1GZyN1OGg3WWM9dztQa2BPVXx5enF2Nzd8a1ded3Z3ZH48WWliCitQX3glSEBobGRVTj1HWFdFN2t8Y3pBWFN8OWwkIUp1aX03QEd8KkZ6S05tT0h+Qm0oPk1SWUtHSDktfDtRNmsoRXtvdTB4b0I+YURoc3xVCit3PyYjWElsT31wU3JzSkVVZVEkZll9PUlaWkNQZDZJeDhCNF4pa3pYWj1PQVFgclhUP2FyM3Fia3xHVkJlRTszNjd0ajlvIT5qTEt5dV9ECitLPyZ2NkFaXzI2KG1jUWhpcWVXRyZnUy1zbi1RUlhpUnpMZSo3NVBWOTdWN2g9VHJRIWI+VDZsNlBuKXZOLSlAclRURF8+VXFvJiRUanNrCitlKFJkWmNzMzY5ZklfSTkzYW4mMjZ8ZV9COyNXZmVAZj4tQkRgaXc4KzwpUmkqN3RuJTNyVjstd3xVKj5mS3ViJmNoNyV1c0ZVYWtRJVJWCitkbjR0QUNWdkYlSUN2Q2FMTy1LNWRLa15CSCFlTlk/TzhlTDkySlc1VGlYe0poUCFRMWEoKCo8a2V8dExNb0VLR2lUbyNkNnkwSGQjRm1YCis0YHl+UFJtVkpXS3xFS3VWMX0te3Z1MkJEd3tXNyFeRXZ7c19Xb3lOdTQ+YmRqUCExMEdHTk02Q0BoZWFxej43WnxLdVYxX0tCd25FXnl8CislIXJhO3l2RWtJPWd7P1d1dWc4V1gkcjVVe3lKK0NnclZ3eEU4cGQzc0pZVDNKeH1KPlN2dVdSKEN3PCg7Yl83VFB2PSNaMD1lZU4zZFJLCit9ZV9MaEtkWD8xSS1mcT5LUm8rWSZgNn1aWFMhTkFGezBFSDI2ZFA3aEU5ZzlvNWlTSFQ5ND5gMHJaOS1wSCg2Q3ZtdFNUVGUxMlkpWitCCit7cDxUdXExWV9XIShWQ3oyc3gqTDMockdNdkFHYGRwcF9CelhTX3h+SGVqRHgoTUc2Q2taUmQjZlFEK3VRR1RySCYtcG5wVH1xQTZvSDlVCitVRWd7cktoQVBoVSomNC1+QzNxRzE/PERFdWpVZWYhYnFKaTE2dTdZfFBWYXsxOUg5MzRJUmB0Z2dHUGhaKFp0TUlSez5rc0dHKnpYMkRvCit4fWY4e05WYHh7MyNxYCQhRFhadVV+IXAlQGk1TCk5K3FRVTtYZHJQbzN0UD59Xy1aeD4+S0BCXiNLQ0lrQlBwWj0+c0dedT5Bd09ASTBICit0SChjbF5KQEMreUR5KnEyJGpSQHJyQXZILWBAfXVpXzI7V0EyKWU7YmQrV2I4cD5wfkI3I3pNTSFsfGFTKVBBYTdUSmhkIVNWNiY1en08CitEdCU/OUQxIWtweURnYCUxZDBQYXQ5cV9wejJqMktMcmItaS0+fH44Z2NAbiQ9anRZdylDPk8rQiV+QlA/byY9QUI2QGJQUCpiS3ckSFdwCitpVzxxSEg0dmx9NE42SFJnV0A7dENjZz9eaV9hLWRCMyQpR3B2XkVoYm9ieWpZaF5OLV5QQlB6O2hOc1NtJG57SlolT3xwYmgwQHwzdlFtCitGJW5CU2FvOTtmJjx0Zk5PJTN4aDw9a0FnTkhVZkgwWURtb098clU5UHE0YDhZbXstdlQxNTQ4U0ApS2Z4aWJ2YW9LZTs9bUc5UTdkTndhCisqNXkoQWdMQipAaUx9Mlg5MU0/VllWJXJaU1p9Tzx5QWYoI2xiVGV8S09YRlgpTCR+ZXhGclJtNH5EYjIqVWtqSGl2YzlLJEgyWjRyYlhyCisqJjspMGY7IXBOZ2JYaiZBUGw4R093KzdmWmhfeXg1KFIzU0goUXdNOW80eG14MnJUajJ3MWFYOXZhcUM2RzticSg/WDMmJGpVKEZiLW00CitrbFpQTEZfTHQ5aW4yXmtJNE5ObSs0QVlNdm9KRG9FVEh1MkZjXm9WQFZea0pebGRTOUlTVU9wY1RLV01Jal5rRG5tREU5JDd4U3toTm5QCit6bWlaYSZRUmctVTRuTEFqdTBWUyUtME5DVSNuTCMmZXB4PEN3IWgqckJ7UDV4I2pDU3c/Xm12aDFLPUBvYyowcWM1bWRPfU5UZmZEc0hgCit4eTdJfF42UUdCQT5HVGppbkExNmR0WFI0fCkjU2g4K0pOP2JzTiVUQjJvaTJXUD03UWpsaSZibihDaj0yPHA0PlVFanArdFNlKWtoe29SCitWKV53SVJfPmQrSkg1I3FCfSR8bSZteE1pIUNyU2Nvfmh4ZmVUdXxVbmgwYUcqdStzZ3o+N2YlX15CXlEtMCRQOVg/VnZ3bzY3WkxqR3A1CitSaHspaHBAOVk1eHVQeTV3QitGJUB1QjRGKkZwdiNNZXMqZCpKfGg/KHRgUW9XQjB8c3lEIWNaSD44RDdSIzc9YXlgYVBSaCZPUmJxfmFCCitxdTdndXApKnlxQ1hDd3szJk1lT0Z1KWV6N1J4bGtQNkczZ2twOD1zTGpHTHMybSVyZHJwcFVhKCZlVWk2M28xNSRTN20wdWdnayNVRmEpCitZeTJWUztaUW8telBNdF5Vd1M1ZzVLPWhaZF5veXg3VU5mK1QqTSlreEhYaVdtVzFEUXZYOCZ2N3I+d0pENGtlKlRweUspPWNDTG9uU0ImCis/SFdlalNzdjFQK3p9aFk/dEJrYC1fYDBFTyN+aXZiQD1tUHVhSjRZNVVQcXQkVk8rcX03RVViLXlgUk17QzJiNCs2TW9yWiVGJTIoVkxFCitEPXl4N3tAOFcxX3FhP05tQzNSOGMmTE9oN2dqcndfRChmeiUofklWNG1ZM25kUl9MSE5QSDd6cT1oS2E3SShZXk8lIV45PFZBd3lNPDJLCisxS3k+Qms4bCFqcDQyM3U3P0A3OzAoOTRAdFJVdHU9Yj88UngkcVQlO3F3Z1lmTnE9diQmeXlYOWN7VUBDXnJtazY4dWZYcEM7OzZTPjZ6Cit0dWdlPGt1c1B9LUJBOClwVlc0Kz8zJUFKRjNQbHgmVz5DcDxWVTYkO0c9KT9He0l9akBeTCZ3S2Jzc2JZRnlEZ2tnNyUrM2VTUWs0bHh4Cit0PmZxb1VoUTxBJF5TSyVzS0NpN2kqYj0zemZYUjEqY2lXVXdGMDtWMWIrZ2kwcUcwJTY7cFQqdCojQFVGY1dTcWNVe198SisyUEZqck1NCitJPmprcEBCb3l7RmJYbFczT0wlc3JgYl5GNlRlMkJ1P09qfTJKMjhUQjBLQ19ydEs/WlRpK1hjKylFRHVSRChWZk1CKV82XnVKN0ttKmByCitPdnIhVDFLdjNJMnN3UEsza2FQUSMzKmBJdE43diMqXz5nPTcxPjc1T0g0WGxfbygwNUtjZD1RTDNjMENOYUxpKDVsNm1wfT9gbXEqU0ZwCitCWE9FVGFsSnp9akZeQmJQdlpoJlJndDA3WEAhJXVQR1BDZEt+dEBHUEhEOW5ZcztBS24ySlRfNV5hcTt4MUk8e3R9ZXZUKX5vRyRXOUQ2CisqVztIZEAmczwtPlEtKk9nSEJDJGR3MlA+a0lCcFRHa3sleE43NWFzT1cmUT9+VTh6S3RHclI7KmZOS1FnNG92VzdMO2pVRnBoelFeKGAqCis3cS19RDh2YGpYSEIydUEmbXhkRSV1R2pjNGZoIVRKWmFFV1laQnpkaFdLIV8mWUM3TSl9e3lueSpgISl4fFk/Y3d4QTs7SCVRfnstO259CittcEwwel57MTBJaUFTJVdja1BmYFchNTxZeTY4Zjw/YjhuYGRvaiRrMzAlPVZUTUx5O1N5KD5TdCg3OHFTJT0pTzg1V1l9aGImNW9vVztPCitSbURhUiRUdkktaXRwbDxzbCl9Kjdgc2dYe2lTaHQ9JXpzTFchczlLQkVEUFl5bEJqQnxEJl41KGpxVUE1MEtIcnJfdT9LeHo9fENfQVg2CitJZEMqJnheVDhhUXdGV0Z5ZkRFSWZ9O2BfU25KWE48WkF2MDxBNl5HRnU4d2ZyVHNCSHFEWG5HaUp9SXhHJFlmOE5kaiNXS1NsZn0mO257CitRWGg5YGhQdD51TjtnaChTVXphNyY8Zmg2TnB5MHpodSlTTzVWJG1mbTwpSDlTU1l6NkttZFMrWDAxZl9tPiRpXjglY3pPKmR0MkpqWXxuCisjTil3WSNgY3xCIzEtPztgRWdMK2U9MHZ3cll5VT5wK1olPiM3LXxga2w8VSkpVD8yJDBWUiRVI3J2am9WQ2Jvb0dCYVd6Xkg9eil0e2s2CitjS3JKdWIyYSpoa2xqUSlyRzIpVyo3cDI0bW92dldlZyFkKGVBbTtSI1BNU2B3JW8tSWdAUnNESn1lJXojTTt4WndlR2s+KUFMMTIpJUVBCiszSCNgOSUhTCVvaWpNME4/JTErcDNPV1hFU0o0YWFQaFpZN1NrPHdRXnhfQVgoTmxid0EhbT84U0hJWUJ5VGAqdEh+Q3ZDLT83akNyVzVNCis1YngoJDxKWnpKM09aQ3V4Z2c5MWBkeyFSK2RqJnAhYWdiPkRtRDF8RHNPZnsxb1lGMkp0e0ZHcDRPbTQza05gMkIofkJjNC17Kl84RkV9Cis4NHtmNVhBMVYmZ0VfNXZBdSNZb3VzazRwfjFpKEZsKHA/e2dpUEEmMm1pK2h1Qml5YWJ6VnRaRktwbEBsa2FHYiRPcHV9OXRKbl5gaGM+Cit1RG1rMFB3WV9LbTUyaWVDZXRzTSttRCghfWIrUlBYYnMqanJ7VFc/c1NMMH59S3N5OzRkI1NSJnNTXzRRTjstIT5WZU5ANEV1OG4wNmV1CitsPGY3NjcpdklpRUo9UjJqPSlALUU3ajlVUm0+dkpQOz9xTyZ6O3VgQz13KnVIfFUtTFotOGJrd2tlVXFpZGI/THVJOWJNby1jdkpCMUZECislb2dkdmp9azQxTUhNI0huTWU2N30qQHdwUVdrKkswSEVEcFFpc04rdHRBX2NJUzg7OUx2eGl3PjslbzRjIyRLITcrQCZAbjJnN2JqKiR2CisxRlV+cWg7bmQwJGR1aj5TQCR8fmUxXyZ2PTtfMCtAdjZLPGAlaGwwdWtJUzd2Z3FAcVFVZVJybDY/NjE3dGN3e2J+OU95ekApPnw1Ty08Cis5WTNSfWBkVjVNM2NuPV57NTFJXj1JMkkzPEtjWFNXWmVBRUdBQDBZVzJTbCltMEU7blZHfTdKZnteYXAxVGtGfmFaQEl+cDg3STx9YzkzCitiMEdGaktTT1BwMDtqeDRIVip7aHp3dGw7bHojJHhVKUQ7MyN0ZEczMFFaR0xzSHA2Rm8kKXN7NFMxYyV+bExjRldyWkVMUG9NelkwZjRmCitxPHtsNUNucWJ7VzhZWlIzYCNtZ057b1ZoSmBLMDllUCVzQCFocyRXKD0wR0lId1I9I0szJUV+fFdyPEJBRiMjdkI7IShgI0lKX35HTDg7CitVKVI9Pz5pMkNxdz5XQjNiX3pFWU1mbk5NPmQjYFFVeklRdnZvKVZ5c2hEaHFVR3YhVUZacnFWfXxAVGgqaEI9Y2Q+OHZzPmk+SXk4dFghCitNM319dEB6OF58ITBCJkR1Y2QkWFF6dHdqd2h+U1AxQSpjNHZKIUxed2UzRyNPUipHUE8tc1khZGEjVjROKmhmUU1KX2lgbHpacEI2TmlDCis+O2JebzY4UEBrdCtZejk+MWxxcForeFNIb09IcCpLTXtoMzlDWVBmVE4hflplUDxUfHgmMy13NiRGSjVlNjd7M1FiMT1CMlU7Vm1HRCU/CitEWCFufUJzdGE0dF5nYU8tNyE5NnI+Pn01dH53WWAzNlclWVJTTV8jNiZIN2w9bSpqPzliU1R4I18/YGY+dChHSVJxeE0kX3R7MGlgK3ZmCitiQGNlNjtRRlhtbGNvNHEyYFJzTTFhVVZzLVV5Kn43dHM1YipiZj5iJGRMS0V2JENRZkw3VChpYC15dDFMTFVUVS0pRDVsclN+M3BxekVeCisqc21qQ1ZVaXMrUnJQZmJofGJXOyE5TT07N3h+ZEM5M3I9PFZeVjduTEZXZzU9dk1MaFI3aipzIT8/dShvWGBIck1NMytESX04TjNCYHZlCitefV4rbj1sfi1LVUkza0YxUilMN0gmQVF3ZEV6Y1dCYiV9XjY5KUlGNyZnTGhfTCtgVF84PzxYdjhtOSE+VHxTLW16REc7QHY5cSM0Q3ZwCit1SEFyc1BoT0hSY3B+QnJNNEpBWWo2fmN5al5nPT4jbEhseD1fRjAzLVJNYllLd3FpdWxtPS1sVipNbGVRTDBQcTFqKSgqOWslNFc3NENDCitlM2tJejIrWXxMKHFaQD5JPmtMUktqayVCbUlOSkBSMzAzO04wPi0xQXNXNVp8XiY7dlZEO2hJQWR3U3VFT1U8Km1sdUBwc0RiYXxVaURTCitmbE0tSnAlRFZpNzV2UUFiLX4oWlQ4ZGZoeG0lMndLS2VsVEV6SGkpNXZLQnl1cEYhNlA8aVRiR2hpb2VnWistPGBNb20lWDtGWkdCeT8oCit3YjFMKWB7aHZUZHVPQ1htQHdDTlR1aV92RVUyc3V+SUhQKF8hYlExQ2godldWfFVpNSViJTJfPzYqZjdFdyN2R0U7UGpyPHhVZXdoPEhVCiszY3J4VHd6eXJWdzJKRlNocnx3O0d5K2N0KD8qVkRsaDZRVDFBMjY1V0FzKVZPWnIzV3tUS0VAbCUjOE1JMT4+dCQlYWQzc2E9Rnp0cXcwCitRO0NCemxMUiZBNUJAek9gZVBGP3hJUVd8LTF2fHJpWjJpdWczMF90VEtMQUU/b2khM2Y1dyR+QEhQTDdrQ3V3UzEoPTxNXk8ocmU3ZU8yCis9LVc4NXhLKl9HNCpQJiZYRVVFZUE/XjhCaj09RFRrQEVOMigzNl52bXlyZz40UnhFZEA8ZG1JTGl4Pjx1OE9Bdl9oQlpqZT55UHBQYzJjCitAQWJnWG0lV1U9LXBLKytAe3R2Z3dXNnBvZ25HSXVEQE1JUVRwYCEjXk0zKk47YmBpLXN7ODZaRTU5VTdAe3NidjRGNHhiaFolS2F+UHtxCitpP1lGcm9AZFE5e3d+QXpIZ21wY0xzJFUzSSh9X1UybUhhfDJ2XmcmJmlkIV5MVkFWOThvIWZLQjRUbng/JndPc0pIWCRab0FnWiZlZXslCis+YzxeS1RTZU53NlcxT1lwRGtgeV49d0Rkezt6dX5mPDVJKXoqZHotTEg4PEBpezRncigxSF4lKFAzOWttYDN8YXFHI25yUks/elFZfS1OCisjcVp0dUlfdiVxTlJzaEUraHE2ZSVqcDg8VlVQMDEzJUVFNVVvek48Xz9IP0ZKR14kalVRU2N9QG4qYHtETTI8dUhvJHkwZW9SRngxNjJUCitfNFpJS2cte0sxSXNkZlh5X3JOeFQxTzRsbkUzbTNMemN7NSt0P1pfI1kjZ3NfMlZ8bWA3MnZhUzJaT2p7MWtCRGBHYS17ZnJrSXtvQ2l9CitKJGJFYnt1aXF6UFBLM1NJVUstVkU0T3VEPXE3SGY9JWhfS0tlNm9BPEZCJHgpX1I2MFRrWmtLK282I2QkcSNlO3V8SVhvbGlzdmpIMUQ+CitPb35jSV45bSFII3JBRG5DdlZaMVlrVyVzbGp5dGpHbTBfOCREe1YtPyhARUZNZm53X1kxfF5HR3k4V3RCcDt0ZVkxcTJWN01qKk1wMEhDCis2flNmcXUjMSZpQ04mK3E7aTYrKWh2JmpsO0Ezfms1bGlqYytoZDNuSn1SQ0gjLW1mTSlobnNNaDNQVUBrN25kKkhGb3R6WjgzSkQ8KlBWCisqK2Y8MlgxIzw9WThGZjxtPStUZH4+dUV8e3RIbEkpcFhMRG57Qj1hJTluSHpzU005KF5udVc5alBfWXQlKzJLcVNyZUFuYl5ZU1N2VSNFCitWJE9xQ3Y1XkN4ZnJnLTMlUCpDJnJgRFFud2g1PUBTcF5lPikyUThESDYqOWpfcldrZz9MMVdPKEtgMFkyUlBefUdvYlJ4LXZYQX58Q05eCitlOykzaUc1dXpOQTg2WGtGRDVZWT9uK1R5YH5EYSR1fkp3YWwtYG1MZXtWViQlKiFfcng1Tkl7bzI/SD9XK29aR31TdWokSkwhSSE/dSp6CislPGQpQGxKIz9IIyFOUD53cio+RmEhMEkyTzQ/LTFHSnNAMkN6fXQkZXNgMEVKMS1VOW80PEZyeU09RFErO1p+e19WaVNTYjkrWnJ7bmxrCitCcX0/QlYqa21vSXxZbGpLMjJyfDZJakJBYSk0ams8P21geighTWwzUmRRQzBUMiVlcHh6SmslZWpQO15sP2hoQjV1O0ZjdmNzTTV7SGViCitaeGxwezdedWc3MGVQJVY8WWojVilTb3t3N2BHUzI4bTtRcFNweTBDRnVqbnRuOy1sWUVvVmx2SjN3dXhqVlJ1X3JYPkhYfUZNJDxiVD1yCitDfng5Y0B9Y2clWTcmU15gJDZ7YXkxREtIJkQrciFVYE1hZTYjeklmMTtsYFRASFNIUzB2Rm1afHhePT8+fGRUZjk3Qz85fmZ7QG5zZCFQCitLMys9OzxzemArTDkkLUtfJSNmPEU2enp0X1ZEVjRwfEZrJXB9Pns5aUE+fEwoNVI1YkszP2ZLXzJzbnlnd1JBWDdqRiFiP35iSjVhalR4CityQiU+d2d2a2hHMTg2VChGVlJjeUApYXJzMmhZTTlmeD50bmIlNGFxZUpmQFBSdHxnSm5EWktMRDMpWk8qWCVkd3c4ayVFeGhud0NxMyt3CitsaCRDNChJYkIhNkhLN3JmaWZzP2thOWN0OWtVYkstbHpxe1hJfCh9bTs4bTxXQkN9OU0/QG5+YHw8RSVHeTxEc0t9TytpTjkjcG9WcExTCis/c0xTcmk0U1RUazVDcWJUNUVyKkEwQEQzTEJ8VEp9cTwwWXs+REAoMGBkZnVaK0FUQjBtcWpaYDcxUShSYFdObCFjc2FNcHdLYmVCPnBvCitRUW5BU0Bfdz41LVJ0PDlDZ0lESjJ0WiMlbDUtU0BLazFGJCMmIyZKdFdIOD56eXNkYiVVKXp+MTZTX1c4XjJIYihJdVIkTzY4aE0oYSZrCitnYihfQ3pzbSRxTHUtRT1XIUxPK0RxXjdOJTVEM3M2M0ppP2o8K0s2T2peMik9WUZVWTkmbjljZjlzK15keilKcDJ+NXFgVjd9OHhgSiooCit2NG9lJndoPiUlJVM5ZChsPiZ2KlBYY1YtRUF2Izk2TjslKG9wQGk5R2Q3OUlzakZDNG5UNXZAUH1CPEFnSF9ZbiomMEAjOGEyRytaTG90CitFOzAlPTAhMWNFI2I7LSU/akRCQFNnSFFoMERPUnEzUlJnbl5sTGgkIX54P3ZQfjRMTzEhZV58eDZtbkN1UTFDTz91YUxPd0w0V3w3RkQqCispLXR3VXtqKFNpVi1RdkRNLT50eUktU0E/NWptWmh9O3puKD9WPDxjUih4YHl5PExmRzA5MHlyVzk2RGRHdm91ZWQzfGlqYy1lUWBpMDxXCit9eFdtS1U8bT98ZVkyNDtRU0xnaUVjWjZrYU5VcnVLVUprWHEwTnVgYHJYfUx1JGtgeSkhO0QqbFh1azNBQ1Vyd2JiQVJKT1crYjdefjVMCitRe1MxWCF8OW5aM29+WiUtKnF2OFJFUmowaV9SMEBQSjVxYzB9TShIR0FAaGNeISZVSG8pPmBRaG1KVF98dFA7N3RmYCFndW9HVnxlbENiCiteV0A0bSFzRzlOMjQhfXVtdU1lcDZhays7UnoyNTdRQz12OVlwfW1pYDZGYHRVaChJYHBrcGBDX3h1RkdnSSZtfEdlWnNLUWUoJkRVRjRsCis7fFZIIWo7e2QrcWRPUGpAI1BtMHZ+flJHQH1yUnB2X0NAdT1oTnl4JUlFaEt3aDE0OEN+e1A9WH5uY2VFfmt7KFpEP2o2bjR8bmZRKUorCityekVZeWlrTyRXd3F3aWY7LSYqcV9FREwtTjw0cXpCYnRyN3paOShHSnFsWXFmUSM/cHNPZT1SZiFpJTRoKF9iRSh7XmR7cV9SO3dNPGdlCisjbns2fkNwWn5GVDZ5VkZhWmJCaUdTaG0jeWxQWUpJN0xvN3hhKE9SWGdxOXVpT0liOC0jS35uKzs9SlY0cUwldStyV0w5cDtFdUJ7YFROCit2fTx5OXtqaWJ6WmN8THFHd2VRQFJaKFdNRVVhYGt+U3ZjKmdDKmxxOFA7RjE4aCtMQFpYRF5LS3tBblNRcUc/OCFOUG00aE88LTU/RloyCisqayhzKWN4bDM3eDspRTg0OCRXYkNwNntfcl5NVW5wZ2Y+WmNVJXJaSCVLNDMkXmpxbylYNEk5eHBKVjNydmVhJVRCbkYrQ0ZCbyNuNyVPCis+Pk8lQSFqNCNWZTs4Z08te3ZvOD05aURAaT80dERgekwxTVB0N2wlZ15uND9PTm91S3duMWREPTlpQmg5ZCohcygzditXRWxDKT1eSip7CisqeUB0V0tva2dvO0p4ZGVkMTNgSDItbzNOOD0jVCgmSThyUEIhRCFTUW1xYmJ1PztrK0Z0JkFLMG96Yj9YPFI7Kmx6VXp7PGVsZjxTcTdQCisxWlAkI1ZBTUQzamJ1UGhvNSkkcW9zZnsjMCsodyR9IUcjM3ZwNWlmK0FvIWljTnpxPDYyd3hDfGhgVyR4cko9UmA3VWhrfHApdmUtR29CCitMcyFMQ0M0VFBQYHhLVzdXMigrWjw8e2BMbVdZe1d1RUc/dGxNUmpBMF5maFZsb0czXnU0QClYMHk1V20mUXMxZk10Z0NQVzMwYn1CRiEzCit3TnN9Mn50X3pARFZjbkY5Q2hDK3laN3ZlWFleS1ViWUchTzEtSyp1QVhNZWlXJSNocXtefUc2UDk/VlBZY2NtRTQtKnlpUSFOLVI8I3ZLCitqPiYqbEZnRD9ZR01iV3lZRTdDQCVUcSMzKGgzRCtQRz1MISs4WH5Te1BQdGA5byFLRj9lPCpxd25pemE/ZDxSfVU9K1pLRWZfUVlAei04Cit1en1nU3ZMcy1Sako7aDt6VVl0TENAWktBWD5VVmN2dWAwe1AtQ1hSNzM4XktSYVpVTCRXPTA4YE1+YXpfRDJSO21SYFFIVlpqcmlzUWN5CitpYWVfezwwJD8yJUMyeXxMJE1RMSlyTTspdzs1bnt+WCNTQWtgRUNQUDU+RGtPaDEld1NtSnVGMiFzNkJqZT1OO0ZmVH5fYV58NlJQfVIhCitLRjY9Vn48VnBRcCQoZFVHPlBZZHA+Q2liPypkRFdffjNwMGx6TXt9PXctREs8O2U+Mj05TDB2PDNKbV92dGxEJlBvTWhKcmlvR1I3UTMwCitwcHZ+Nm1ZIzg/NTlkeTlLVjIzeUBeY21WQnwmbTxrSmFlZztFS3dXK1gzaS1sKUQrWFojaGoxeVZwWldJJj4kdS13I2AoX3w4QmZ+Nm95Cis0QzJLV21fMEJmbHUyT1FnJD1FLTdGN2NuRml0dU9PKUdGLWYqaX5YJkw0KmZ0N3RuMVc2S3BPcEF2NFE+ZGpGcGJQPmFGRDxJSEpRYVQlCitDQ35rc0g/QCtiTyQkPkdYQS1AdjVEMz01eSMzMitraiVLMTVvJlNwUyE/M0NnPHUjfW9NUWgrX05ENUxpbVVqZjJmO3F0TyZleT5JMFhvCitiWUU8KnJFRUR1KDY1YXFHSz99JEUwazxNbDs5N2g5fGtMc3glQVZ7dHRpbU9TQXJHI0pfQjxMUGd3RlpeUEMyQyorWEFRZVlkQ2t+TE9ACitsNj5GT3pJdDdMbHpsJGdnLUYqKlFzV1ZYUSpFOGd1P2A2SlF7Uk9kZyoyUnRBa0J7UG8tZihRRjZwNmBVRnpLTEtUZUdScTBMYTJfPSpZCisqUlUxKjF+QSgobSY/dHslJGhQMWxlWXF5RzctdCtefn1hUjFOJXY3ZitxK1NkbFEqRyh3bTJPUTluQE9IZF5lMWckQS1qfC18WEBmZV8qCityXlRDWDZIIyh4WnMpeH5IaGlHNyEjN1BUWXAzaD8tMj4jJUNTJFJDZGFENkMzNWF3Nz5yQHx+KyZ8bj56PlVWPE9+IVVLUHs4T2Nhb3dMCis9PWA+V3g7WilCMEB4e15GVlRtTlVJTV8xdTcjK3NrbmU9ZjtJZm54OXA8X1pUNF5DWHdUREh6RTl4T1V6PUs4RChlNUc8QVBTWHJJMHwjCitHT2orNTc1ZzV8fmI/UC0rMVBYR01ieVNJUC1aMkgrSj9+LWJiYE9lPVI3OF9mSXg2cj9qJiklSVQ+LTRpdk0oQF9peXNZMXplKF5mfVghCitMcSFkdGl2bkYmNE9rK3VvRWBVdCVne19DNXIzaD10UlREb0NnTD0jO1d9elZMIUVHWW9kSVAhMjBRIVQ9Wkw5THhpcWFBaHlERCFXUzJyCitkTyVBY3wmbWtJPEpiQVFebEpVck9LOUl1NFI/IU1wOVloSlNXaTE5Rk8rN0d3cEtmb0debz9MZWU9NTFYYHhkNGJnfmtQVElVaUtDRStqCitsVS1KfTJ7YVEqUCtwZDM8IWYrTWI1RFhkS1RVTX5QIWkqME1VLXt9IUtELWpzfTFHTUF2Vj12YmJUaXlUciF7fDV+cShlJWFFZ2tYNzlSCisoOFYkQmdPY34jdWttU1J5MCFlcGpHR3xLa2kyREZOK0BrTTVWe0R5Z2JRYmA9RypmRipEIzxCbkBqfjZhREkkc0NEdDVFPEVLVHVPVnZhCitmWGVJYF8hJm1IbntNMjE3Kl92akBoWj40PTA1KSo+d15YKTM+Y3R3cHdteE4mMlcySVdeb1l5NWU8Xk4xS0JxQ319bkoxVGxGWlZGWng9Cit1M2JrTlRNPSkkbkFLOSg5NmtTU0goTTVhbjYkKi1KUS03X05tS0c0c3x+IXVTcXRAV0N5Zl8xXjs/SXoxNjRvcnQrRSpCS0gzb3I7bFY8CitRfEl8OH57RU4peHY4VU83eU1NP2soV15UP2UjPmB3KFJ1MitITF5YenJyRU1BWE13QSk7XnMydEZMU3Y2K34hek44SWxOPEJvbWJJfDVvCis7b0dwUUJsT19sJEhTXiVDOFRqcVdmPCNVcFp3eXJZdyRTNTY4ZiY/Rl97SW54aT9LNHQ0S3FwMl9MVyoyYkY5QHN8PzY9ckd7SnVnc01OCitqKEB4TWFXZ2JNUGxzQiFIZk9sKFhsU1BTUEJsOTZIQl98UExjazlHM2Q0VjtQWXt4WHpJfUVWQkY0Xmd8RWxsVHRwRkBFbTFLSSUyTmhkCitzOHlVVm9feHkpU2EmI1RqTlk7YSNibFZ4VXwlZmxWfC1ZXmVoZ3YmUEg1eHpUTkNyN2VDbD8wP2M5YUhNJWNmRl9EQExBfHhjVnJLa3BBCiswd3JYPzZ5V24yfWhLKSEka1ZkayZQZlJ0OWJ3KmJLaj9vZTB9ZHJpRypZNWRoMlAtUDV1dVRlO0tpelF6OG04TkdJalRBcTRnX0QqSU9DCisoRFpJaiEzVjhmPGEtb2M7aWRUdjlhWHdQMlFBd2lpPT1iMmIwc2kyMnFwTEgmY3UkXkpLPEBRVEd6P2k5SEgwbD4tODI2fVJ+RTIzPSl3CisqbG5EJUxUSFlvRFN2TVlVNll8bUAmc1QqVkB5eX49TktjY0c4XldfPXtqNE5wbjxjTStIIX49ZkJaM2NfNUdMTWxTVnlKOFBfRzFhZT49CitJdHR3NW5FZ3JuNGFQNmU3d2ArOFVmRUtSN1FMci1aJkVKLSZnKEolWWAzeWAldllYOyZebnk7cGF4engheGx9O3xOWXhyemtzKD0mOD9ECisrSkRJd1Y1SihjUGB7PDBJNWNYYjJmOCNtZENaV2BEWWQ5eTxrXlp1OUZuPHAzeVVFUDEwKVZwVmghZkpJUT1UfWJZTn5seGRzQ1FTYHdvCitjd1k7fGR3dmw/alE5bW87UytqYEtSckU2Ul9tWms2TlI8Ql5aJkRtTztRb2Vwe2gtKGlLZmEpcmh3dlQ9bVlAbF5+YWg7RUJAa0pZKUVQCisqSEIwPnokeitIaXMpfWYwSHVlS04mQXdCeztnVCtOOzBNd2VuSU95djFZM1Rle0gjPk4yI3A4fkY4Kk90RHE9R29VQmU/eSYoVTd1PWx4CitHa2lTOSRoRmY8SFVseGlRQkw+WEhNe1dGRV5we1BVdX0yYnQ0dHJuP2VoKUUqbTxNbT1AdVdnc2JfQTtfYCFKRTIxWVI0dzJYaVh5KGluCismVXM1ODM9IShRWlVqKVUkPCFVZVc3M1BNYmo4Yzg3TEZXb1BJZjhDTjl9c09NVVMjaXo1TUNtZ3VYPDMlcitjdVZ4MlQlQHpUVDt3Oy0yCiswfjQ7N1NRYDdIYShZU3pfdV5NJEg/ODZjeT8kVm55TEN8JVBxT29fZj9TZV9GUkopSTVkQkdpN1Q5Zm9HZnJHPzdQV2xoKTZYc21+YSFOCis5X1orVWhJYXlYdz9xI0drMy1CZFVkZ2s+SyFGMzVQUS1JSzR3RjtSPCkkUDlLS2leSXczLW5rQnxJbyU/OFpOI1UqPiVCUDlEQUo+aSkmCit+LWVRMFhRQWhfbCkrV2E+TkplSD5Say01NioqNjkoPU1sRk42e0NgO2A7eVlsQG93MVBBS00oKmRNQGI1cj1aLW1eVkp0WXM4d3sjX0FjCiteazgzIyUtXkw4eT9TK3Z2WkVWbGRJLXE9IWtaWCF4ZmQrTFc8Z09JdzZmYEY5SG5WLTExSDFKIUVnbk97cnV2bU4wJVF5aVl8V297UExzCitHPVlPUVRSUXdAJlVQSVJRUE1IY0NDOHZaVWh2bih7cCYlemM7RF9vcE9sRUt8PXo7QUM2KkxDQmpUamA7KSlPJmsxaE5Ae2dUT2deQ3pOCitCd3pORXtoen1gNkVkPz9yOFNnX2k7dSF9cXRzUkQrdnJJezBnPCV2Kll3ZnklOUxQQShaNnB9PXgrWmEqKWVVZXRjRGMzPTdvUjYmaiNlCitsVDw1UTdBX1JnRyEkUExaT31YVCRtYSM4a3B0TGJmeDdjJUQlaE04RUsxYUM4cDBEZH09UGFeO09WVjFvQUclZ3lOdTdXPTlsamVjLStGCismS19lbVg1dkNBLWUmcDU5Y3krb1ReWDE1OFg1WjlIWm4/K1gzTjhrfnZxfFY5Qmg7emZLeG9TKCZ6Pk1uJiREUClpU3dOfkMycyh5bS02Cis3KWEpRlAxQHBea3duP3VPQ2wxQztweUFxPDFHbXomKkZeMj9geUMoQFhTV3l5OzVQfFIrVFM7JDh+VF5mZiReVXUwX09ONj5eVWNzQlU7CisycT95SmEyd191fFp2Y1o3RTB4PmpIRzVRUUs4MGRsNHJwSm1HTUVFSEM7TEF2IVNsWj9wYUk3YTgzbT80I1k8ZmdGWENjQUwkfUg1Q2JECitNUkF0VW5UbDI/fGhkMG5UeHlKOGM/cThMLTdKPVY7a0ZiSkttc1Utey1nPHBUc2pzX2ojJlExJW93aHFrI3RVTVdLWGZuQnIzPnJRbDRLCitQMDtIJXFDNXtkKGtgX0VHbV9xeFdUWlJac3M7cmhnTXRmTkNlTFdANm5ZNCQyRHEkNWVGd0tmJnwhTTxzWlE0dHFhPkgqYE5mSkljOFRlCit0IXlRUDNWMkhpQlAwU3ZJPlpgVntuNGI9MGxxIVpEST8jXz81NTUlNllGJVpsfS1ic0ZYZjgmOyk5Q2ItcUlrJWhndGV3NF5OSENHVilkCitTQCgjJExgZkBrPyY5YExnTV5BfHNKVDh2c1NpPFE9PzVyVGNqY0J+dD98Py1OV1d5NjdiSUdmTSVBY1M+Z3JRNyhhSFpiWXhwQ2s3WktOCitxMGtsbTVXb2RaJHcjJH11anRISUJmPjshMSFTRklGVUx6WXlUN09DUj5+WUB1SyVpa3hgOEooQXtaMWhwcDZ6cGRkYmNMJkBLOCMtRHxMCitnRXJFK2k+SHo/XzR6IUJTK1UlSHpPX29Vc2RuZFJzLWttTSZvWEdPTXZZVSE0T1ZjUFpKMG54NkkmWDFrcylARFclJCYlaD9FOyljZE49CitNSlRzWWMlQ2EpUihWVWhSYXIlQkFOelpePEYzOUZSKDRBVVN0aTxuVDthQyVqRl5pU2dZV1AzaSRVM3tAdDMkcEZERGp7d1Vyb19yX3gqCitvZ2B2TnwhJSZZV2pLXlRkWWt8dGtkKXVuUzZjT0FhJGVKVGZEVH10fUV8KXMhNChZc3kmcU0jVkc1XlloWUhsRzgtODR1LURPMUhfdClGCistJDhQcikxX3ZRMTZfNk9AcHpFLWZRY2RQeVJUTDdCJW1sSzE+dDl2cXgkaTNTIUdLKWp2K2B+P007Yj1QNSZsdWlSPHJCMFEtXz48NTBCCis7dzAofH4/Zz1Ea2h6fklDKGItYUFSSEFBcVlDR3k7O34zKHFwYihSN2pQRG13IXQqUnB1YDhaRUc2PF47VW1iamklcDE3JXd8aHM4TiZGCitNfio1IU07T31qOXo2a2RCUl9xclZZPlp4enc9PmRWPWc/ZClDVTtFYVpFVndTMkBBb1pJd3N9NVVOQjBSUWJoPE9Xa0l2RG8hY2I0al5eCisxQy1RdEl8RG9leCNYLSktJEVmYjRFYDUmQTxvOEZ7cUchQVJ+dipUY3ZAcCRhZ3N3e3J+TDBJdDw5T3UwS01NckVnKnRHZFZMVTZ8O0JNCitBelNkWTtHZ1lCQDYrelRNWjBQVyliPStCQXJgI08jSWpaJT96RXg7PDJ6RG1HbGxvN0dNMmZtKURxXyttLV9yQVYkfEU/RXprPT41X3RTCitjc0l0P2AxZ1N8dEopQGc4PHR9dUA4O3JSdEg2ZlN1OShgczZKUlc3dV9wR3dPIVhaQ156KDFQIXZSRVBeZ0VTTkwkTTFmOVdRYEFrNDs/CitQKDxiQCNKckdZQFZ6Qk5aPSg/IztOYzgoaGkwKm92QT5AIXpKOUtXdz87YkBeck9QJWVePUlgfjQ7flNDT0ZgYjVUeWxYeVUkPDQ+V1I0CitPeCo1N3I4Q0AofjVwUGc9ekN3Q2c1eVlPfGQqWGg5bkxSVTh8MkVzcV40dXZ0TkQ1ZV95PkZYVCRiZyNrPz1vYXNibzZGIUdRMHJqUHtkCitXa28hMWBkTlkwcVQjaipfQVE4bUZHcj5rTGBYNCVoSChVaVdzdUlfVWlIJiYxP1c1VEw1UzlHZ04+XyN7Uks9N2hTYnRPcHVkYXE5MzgzCitxMjZeNFBLcHxAeTMtcFQ3fGM5UGBGZ3lPfHszYzYxOHR5R1pKeXxtMnAhJS0lSVc4Sk4xQilCZl5+Vk9KQkpvIVBRcDNmPC1TN2I/P3BACitSS0A7O0FseDxwSXBadSEwT0o7bntpNVY8QHRlQnIwWSl5UmRPTkV6TTZHQ0FESmt7Xz1BKzUyOCtNP0A5JDJAdSh5NEUxR3NmJjlXekBoCitEYmR3d0FgeSN1Z3VhX0p5SyFObWxNVXZmWGJAWnQwYHJrWnchM2RDKE1EYHRIPiYjZCNjZz97aEh5RCtNTjVGZGs1cCg2K29jdExnRyM4CitmSjFvcXkpJVQpY3x4OV9Vei1OT31qRFkqcV5WRCk7aUtqNU80Z1MlbHF3Zz1jamZGU01qTDxpPmU0YTRDN3BXOHc/T2tNQ3NyM3V0YHdrCitGfX1yVzNpIWBvNzAmK2loWkYtWjEydlcjb148UlM4QkVzRzBNZlFufjJMaWspN3hsKiZsUVBhdU9BciN3fldzc0shMUQhe3loOWk3MC0+CitCMkc/PUkya0oyY01qTTdUbzdncEZEXzxvTTNQbVYyX2RMcjV0bjVwfnZtIyZ3OWoleGlHU1B4NTtDXkVIb353PCRiPVY8TmxwSWxJRzxTCit7KDluVzQwKTgkWWM4cGkmZlEzT3JYMHxIemtCQGMpOUslenpJZ2ZVYHxxWU5wMVM5JUcwYEJCI2lOVll4MkttTWpiN0l1P20wX2NnfDh6CitfV08kQzUxVj4qVzBHTypzN2U5QCNgc2ghSG1INVE4ITxhS0dgRXpXM0Jndm1rPU9HPD52VGpHd1JyPjYzPXtJRX14fDBEdT1DdHdWaURTCitJOyRDMmNIeDM9YCNnKUo0VFBuMGd0bmtCbk4/O1VFa1UxUWlLTnQpVW9yUGlJLUdYe14tKUN1bTskLWApbFYpbUMlaVY5WmYrSSVrazI/CitCNGdPQkskNjNwUXl3ektOOVhQPHJMXlBFLU5YbzxuRExhSmwkOHQ9Ymc3bXw4YjdzaWYpWFdWJGhPTm9yNEFKKVB9ezVua1h3OWNPVns/CituM1NmRzV1QWVQSTxjMlQ1U3IoWTdBYEZYPGc8U3NFaGszXzZ7XiE2KztraFl7cVBOQUxwJm5nR30rOFdCRVRFeUJBXkdMISFILUR4MG92Cit1NCVadUJPOGlBWSpuQGZKTU5EM19KUyg4QiZVeD4/al5kYEo4R21BYDBZZjtlS35+Z3NOYD48SmU+eF5MdyFBa3tHfDdQbyN0ZmpYdExnCiskQFJTIV4wZFA3X1duIUw9RjcyNzZSRD9sU0V6eUpMdnw7SWM+Unc1diplZChFazdEXjB1TnBhfSVYM2hpYj1qJnpZelJeIU1CN3FyQXYoCittdVdxXipfX3c2TzRaaitJakwkfnpVcilwekcjVWx1U18qKHtXKSNKNzdYcGhEbm9VSXNZRlhGX1ooJmhFaGc/aFckUCtyTnViRV9WZUBxCitgVylxT09yTnIpdiFIaGRHbz4lX3RFUGFzWGY2ZHw2N152SyNeSDlSMz17KzRoQD5yWWIrU1dQIXxRRGx9OG9gemI/VClAJCQ3TnN3Y0w3Cit1QnA1JGlvfiRJZnptV2xreHlzc1dafXtKdlJsTGNyPC1Zbjd3akYocClSeylUYD9kIzZIQlUmfmM5RU5zVlZEWW1CTEVAO0J6fmRII0BpCitTKT92d1hnVTNZbzhtWUk8fnI4Z1RiRTN6YDc/fDJgdExHfC1xU3FuO3lISU5ET0hAZT4mZCNxQjU8MnZXOExTJHI0cyhpTWhLU2J1aXM7CitMa29nUDRmS2cmcXchejI7NilaMXMkTHYrMTdjO08yYCp5UClIJSskUUclUVJCNU43eW1yLUwpNTZhKn5SYDNLc3w7alIzSGx6NUxxTlp3CitlSENTKGhzX3xmVEpkODR0RzlFU1F6PigocmR7dWMxOSlYSzU7TTM+Uk9Kc2NUfUArJTdZUGBneUJHa2xIcilzXmJjKWZNMVNWPysmI2h3CitqPntqbFNTQXl0PDtFTHA1MjliKGFxKSp2dCNzaz5mbkZGaVd6enVmYFhMdj9GJD9uR1NAfDJjVWJYTDhmQDM8TkQzTHdsVFhoTkdwPk5aCitjPy1RJXxpdGI5Zz1Vemt6ZnZJTzljfHh5JjU8dWtPYSpaPVVlUnM7XmBESEw2RkArcEYtZXJqZXM2OXZDYTcjOCpgI18mST0jKVBHc2pICittIVUteHc3WT9oMzdLVGk8PjdQeTE2S0RmVyEyUGsrMlRTQSNZUXlxYHR1eW1xdmNValNLeEJePDxGbyg2OEtoVFpWVHBac25fajk7VS1vCiswTzU2ZTJQPHlwQW59TW82WCZ0dTktODVkcistZlR0TGpVSGY2YFd5RnZ6PDFEeT11QFp1YyhzRTg9R2BHWTtWQiMwZ1VKdXlmQ1lZRy00Cit4MU0/RTtfJldTfH5gKzZZTCtCTHRaVnNGK3g0O2ZIRDF9NUJTNFFpVylWbW5aVnV+PlZvJSNLZ09GUn1jWWV0SU1wWUhGPjFyazNpTTt2CisxKVktPzV+aUh0ekxpU04pSks9VUFvNDZwKnokZm1rWE03Iyk+ZldsckpLKGRvcFd2e1VYUyN8ajx2dnRnSVYwYSticHM4YXQ0SERmR0xMCitzVzRpXyZTaT1wK1VARFY8X21QJHpiQmchRFAxMFM3NmZaJU1Wa1JmcUN2bU9Ba0hOQnRXak5hNE0wMVFKanIrY2UoY0ZRdElOdCMrM0w4CitQSStENnVHM2lqemR7fkglWSZleyNSe1o0VGBHYkNrO1FnR0laSVM1dk41NWAkRkdFZkZLKEBrUz5yOEhSb0sqU25jMH1SbXQyY01jZDw8Cit0TV5tSG43fih9aVp6ekZxSkxaXlNaZ001V20wcDx7PWR5LVZrQE41KT1PaEBvQHpydjk8I0Q7WEc2KW4oWio7S0cpZkZ3WDV6UWRXJDlfCitiSmE7RTY5cDA7dHBMcyVKZShLLSg/S1hPPyZyeEZDby1XXk4oNlohOTg/VG9KMEpLRko3YFU0JHZ0MnM5e2dKS216KlQxPzd3P3ojdCpYCitae1IwYUsrTG08dzRRV0R7fFo2US0oWU5PKlVXWStDRXBZVX5QU3shSm08XkpvfUhaZ08rcEU5clQhKylBRmBpSWVtRCo1KyRAaDNFdDM4CisoPSEtNl58SDhKbyNgIWZ5NUAwdXtETUUyaiRKN047Y0MhMl97Jk9JMVo+dFRoTmI/MjVfJD1wWFljKG1LXk8jYCsoI0E3UjN5UCUqNjE3CitqSWM1S219WU0jN180aHpaXlZDRSghKlRYP2hQcmRQcFFsTWQ+JFFxb1NkN3lsPHJ8bEIobi0yUkAkRGl1MHI1Nlh1MTcpPEg1cHhrbk1SCitNUSFFO3Z5UmsqUjBqVCl3S1pxYFNCeihUckt6UFdfJGFOJWJqNUFRPTtnb3dCdmQkaX1VaVlwfSttdlozRkRYOU5xLUpJe1E/O0NeT3o5CitNMiVNcWI/WDk8NnhLdEg9JWp0N3xENGZzYzckZj1mQENlQipXSj9kRlUkP0FHdXtqbWNsdS01UnhuTjIkVEVCPUVqLVZfJHIrfDYpPzU5CitfN3A5PCk0T1Q8SCRpYEdBTEVBYkV1MmdySzxOal9ia3Bsak1xKEY7IzV3YXZyaGwtP2F4VXJYODA2d1ExRjU+RSRoJHNlKk1VamlGdjJnCistdTE+VVEqME93JlQyPyRmdUF1UUtPVmhHPClPYntuVnt2YS03TSVkVj1mNisobUhrJE9mNlFyJDZzI1J9c2F0NDBVKn4pJm40byp9Y1c/Citzai1sZWYyVzQ9b3ErQXc3MzdBfkg5WmpvJUc7YF8lSklRXisqJkZ2aEFNTU43T2R8fHFhX1ljTEZ8QW5mZFMkN29ONER0NUF6KSMjeldPCit9ZipOdHJxTV9yKkIhfj90RFYyelp4P31JUEsjWD9BeC00SDtQXmM0dG8maHNrclRpLUBAdmY8fV9tYSVyaE42MX4hfmkwRHYtYCpkS0gqCismZ1I8ZEAzNkRKcyhDY2RmQVZMZ0F2O296elFnRmVyNzJhdXQrLWgkWS1ZdkZWfkxJfFRTWENJRUlCR0l6biZudWx+M099JHM8fkp0WiNjCitQLSVJdUIhSzc4SkFTZmkyX0grMEs/TWRyZkpCeWkzSDRvKF58aykwNTNlP1YwWjNCTz0yJEBje0ZedEhmNE1rN0xGMXNQdjVERnM8SE1QCis4KiVrQF9JOG8/fDc/Nyk+ZT1KUTQheWl2U1R5c0wrfVh3JjUqPTU2fH1adkcyY0VMamNmO3xCNGlIJTh2QEBrUzRBNjhRKSFXKlB3QE1wCis+YE4obVBaQlJ2PHh8UmRZTV85QHJ8fnxUcl5mcWYrLXtISldpZSRmaSMoNH5FblhEclhGSyNxe3w4VkAwfFhRUjAwME84Xk9ZN3lwJGpCCis8S28wLV85eUlefTl7Pk9WYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSVpERFJ7V0BVNDlFXnY5eDh7MloqSHVoYSNmeUEzMz19SnRLelU7CitWaEdHNTJvXikkOUt3ITdfMj57VEVWbDJ9cyZPT1RjfCh+c1lDNGdlQ28kWl9IfVEkNTVJRShobSsxRzIqPXlBdX00SUxRYCF0U2FZfGY4Cit4ayFYU0JsKFd4Z3FyI2o8NG5WWmRIfnxLakJZe2ByQUAqcHkzfHU/c21iKlNyd3lvdmdCJG14O19tKm1XVFVkdythKmJiNF9WbVVrdU5TCis8RFg0UEF8YG98TW0wYis0JSh5IW4pRFpyJXkrUkRPWlhXQX1AcHpTcVY2PmF3JUF2c0ZLTSFuPHVHSUVYZiNXRiRAKlN0a1MyOWooKUZfCitUYnt4bVIhVytMbk4pP2kxOXkpWkVRUzRkdXdUaVFWMGpeRHNhVUN5JlBgVWlFTVB1Y0BpSlE0cFEmNmQwMHNMfkQqTFN2cXRVI09EOzY+Cit7QClwaVdsaUFULUJ5dlFfT2g8QiteVV5Nd3Q1XlZNZ18lU1E/TmxWUVRUenIjU2lLeUxNJDspeik5SUEkdnlhe2gmeXUtTnJGVDZWQXg1CitIclZTYCRANWFvTHNeUVk1e3VmJWozakRZOHlVOXFgTFFASXV+bns3MTdEKDRaOXt+YkZ6ZHEwe1VwMXBzNkBac1dVYHIrWDZeNjJ+JmZFCitJIWYyQTI4Vyl6I0h7X2JUKG9JQz5KYGBqZUJSKTYxaWApQXpAeE4xZkY+O3FEdiUmSGh5dXtCZjFSbXd5Q2lCbGBwWVRtVnZ8aC03UTJACisjWDl7NXRZSC1oYHxTQmFMfCRSdFYrQG5hUjwjM2NYPXVjc3xfXjJRS2VYc0YyVD1JNmh0UyU7KDRCS2FQMktHNT9MdCpKY1J8Qkxke3EmCitLXiR2QDBYcVIwQVpITzYoVSh9dio+c3ZATmphVlJOfkNrcDlJbkx2c216Mnkpfj5oVGs3MDRiMGViPVhmT2V7cVhBIWB5N3dxTXs7NDZaCismJDFaXmF7MDIlfDAwVSZQTEEqNERmYFE/UEF7O3loa3FLJCVLQiFgZG5pQkd2IW9SLSNveWxURjFHRypTeERacSVURX43NjFaX31ZVl8qCisqZXRPNUtUdTImKiZGOWNROEJIM3JpaDQhU0tRS0l3JVA0YlRabXdsKmFYJWV4NjU2NVA+Vy14TGVwYn4lRU9ucnhQZmhuVHwjMTBaVjtmCitMYWVnVj83fTdOPHwya2JBZlFTUnZEQFl8dWtLcGg+N2tyez9JR2hQZ3s3MzZpVWdePHNLX2Flbm1nRkAxU15lNkdLfEttQlI2bHs/UFlrCitKdDY4TGR3JFJhPGplVShHOU19NzB2b3c9Q35YdUwtXml8Uzg3PkxmUmMrV1pjdGUtO2IxLTJAWTZYUjBRb157TGJIWmMyQE1hbChae3ZICitzSV9WaUkpcDNIPkMlb2liWHJvU0RKXk4jQDs4fWUxWl87NEl4d3wlOU5md3oyRTdORHElYDlyO0diZlgzSHotPU4wMTQmUEN5ZjRJUipqCitxPzFwVipeYHItaHckam5+Jjl+U0R5QGYwQXlxYlJ7RVM9KWQta019Pzw/aUVyKDVEdFpSP2JFV3pWKytQO3ItSmczZUJ4NVkxcExBbkpsCitlZC1GRzYmLVhYMHZCcCUxY05oUlA4eEE+PW43KSoqUnp9bXtuSU5gcEpMTk1BI1NAWGQ/YTcraztpMkBtQVkkbXtgcng0JDdZaztXTiEqCismSCFCYUh8YjF5cSEzb3EmSUdKV3oqWlQtakJuK0k5P2AxMT1+O1JgbEU7dCMwI2MzZEM8NXJtMV9tKXthUkpWeE1hQlBkTjtQcX5eO3hoCiskY3UoMFRhfmxUbH5eYTIjRDk1c1l6QWYjRHZ3M0hQNnQoKSY0dTRzJT4lWFQkRUxqblQ8YFopeDtAVGZIIVYhdCQkZU5xOHFgMyN3X20wCis2LU5vcnhOUklkcjNxcyhzfXthelU/NDJPO2hGTGZQK0xGZEVNYHZ9ZjctVmdrT2RAeVY+V2c0TmFibCNjRilFU0JxZmt8bkxTIXBHdjw0Cis2dT1tXj5TbCVMMT97ZlNiPGdIYSZudDBlflhNbDQlcGcxPVdzMzYoUEgmMHYodkV1MS10ZDZZaTFadTxfKGJUOCk4UEc9M3ZIKlVlTGkrCitRTGRvbm94dX0+I0RxPndzJVkrMiRpZXd+KDhvYE01SUpldUV0UH5TT2dDMlJgO3pjIW0ySSlkdilkIXRuRlZqdz5fI0JvWHhCMW1zUkZSCitpQUF5O1B+NG5ZNTxiZngxMnZZNjZUI1E/Mm59b1deP1UtJitqbGdXZzl+aUNLdk9JYSlIMlYyKzlNRmxDM3lMb25Jc0JyIUYjUG9LPS03CishJFpjdG1MZzIrSEY/I29sdVIwYzA+KE07QSN3cyMrJDM5dGtNfFc1IUY7NjV+ek8kMH0jYGRPYWU2JUxrSGZKU2Ipak4hUmhoNHFsP1FoCiskJCU4WFlwKTtqPjlaYCRlRENANVNWb2B7UjVwZ1BTVWooeEp5KV9TQjd3aWRXd31hczs5UExHdV5NRE48ZTBud3BRPnhiMzx4Ri0xMkBVCis0ZTV9bilSZlMlbEU3ej1BJXxJZ0goJTBiNWxtaU8qSz9UOD4wPCtQNis5KjxTM2xeJChncDdHUyFXeiVSRWooVEdqU0JgODJ7NEtHMDB+CitjLWRaa2MkR2FoU2sxdnROdWoraWx0aGRYZX1XZFZnVm1lVTN6e0thZlRWTD9PKkZDcDxHbyYpOXBHU3RmRWZVdCRubkVCKldmaDs9fGthCitGUiQ4M34lO3FYQ2JkP0VuezZrfENIdW82dGhSM0ljRX1ybT5aZ2dVUSlYa098NSlSJGUjd3g1UDU2QXAjaSopalE7YWgkQWRvQD4+I2AxCis3YzhvbUtWclNAK2J0QDBFSjlhTEI7MCshUWV8SzBQR3wrVU99YXw7d2NrRkEmV2AwNnd3V3Epdmp8ayhEd0o0bXQ7e3wjbHFYYHhucyl+Cit1cGBVMXpGUmlBa1k9MkxIOHNuOV5CMSkqVEZQU292WiVJWWdDPUNJZDY1Q0t6TCFiMnpHMmtFenlrUEw7bmgtZiM2aFgzTGx4eFVrRCpFCisqWVcyWVl5UHZGbkliY3tydT0rPnJZQHIkdyRYaEomKTZLLU4pODtNU0ZwU1F9YCNPZCNRYVIpNDxYZFYoSCphJTQ0X0FpKXdoVkN2NjY3Citee0xZQDZKZVlQKVEmTm8jbSY3SHJFUj1GSjRndCMxaUFkb0wrSm93JEpQfmRzTGpiaUhKWkN7Nm1aPjU+S0FKa01OdUVFK2NeJmwyfjh9CispNFM9eD9sX0x3dFBAdGNVWXtRU2Y9JDtyRzNvaFB9cGBnLSlXPFhWZF9YRUdmeHdSUSNOPkltZDBNQ0AtcTR0M2ZTX3hfYT5faWlWYCNyCit9REZBPGg2c0hPSzN3VV9OZ2c+RWNqeEBfa2JrR3w4SmUjbEZfdFZMdTNOeEEjY051ODJEdntJZTFmRU03K1o2dHkzWkhGcTF4KFZ3ST03Cis2alJMTytPO1hpd3REdz0jcVV1R3NoTFMyd1MwZyRfUlJkfnd4eF5ZN1MwOyNPWlQkYmh0K0BvI2doQEZRdmZ6ODxPOGEqVExad15yMGI3Cis4Y0VFSVRFJDg+PTx5T2d0M25pVF8/PnAkfVFvSXA1Q35oaDtwQjR0Ri1ZO302aj13KkNmODhgalk7WU1qaVF7TEBzclR1b1ArdCQ+NWpnCitZJT1BKGMtaDh5Rz8kSlY4RTlLc0lUcFY4fERvQ0dTNjNNPyl3UX5IQUhhX3IjTHZUMUdDUmNuJUFvNkcteCtebGszb0Fxazd5ejgwekBACisoSHxvN04oJFp1VS1TcGtWcV5aUnpQbVBzWkkmYVo2PWl2NnA+NmBjVV5sPVItNlVjUkFSSFZ5X0gmRko5TVFVJXFCeDgxfXIlMEd+ZChtCiskYChWP3NpY0owSnglZ3s5XkM9ZE57VGE7fDcjLU5aQ0hha3t8dj1tVm5lPmUrNlN8dD82K0VjeUp2JmopXmJ0WFg1Pkspbj9Ye3tYYktJCitJOHpXfiFFZThFak9GIUtDYmNiVTMjWnh2YFhPTndAP350ZFdjTmZ4K08yekM0fmoyTnU8UnltSSM+PUJ7Ql9icDhQSW5CbjVielg3VUZLCitgbiZMdVd5TyZ7NmxyMHFWQHJnKmE7PEkhXiR1Q3tDMWlDbHNIVF8/WUl6bHhaTmA2MmNHPilKZG9jKXw3Y04wfV5zSWkmRzVlTlA5KGVWCitWOTZzTj1iITczPkI8dUR9dlVMfmI9IVYyJW9GejxtPk15eTB1PlgjUWQ8KFlSU2piQzJMeEpuQHRAT0N7NHYpJnVlQkEzWipxQ2tsZnAwCithMk9zWTMpT2YtSDNYX3whfX03aUB9UT91NVBEaVM3YD4qP1VaLVRySUlaaFY9YzItRXRIeWpwXyNIajdLK2lRNFE/dip+Umw7a31RXk1eCismX3BLZUYpfStOOV5wdlZhNCRyOHdEdDA+VnVYYlg2OEg1Qz9OSUc/SyFMM25uR0I7bDcpS0Bqdl4oanBZRGVGPUJkOC0pcis2YnJLQi1ACit6az9qZGYjKStgOzkhVm8pTm92TT1CUGtwSGp8fW91cXhxej9hLW1NbFF5YTxocztSQzI3OCZnYG8tdTU2Tyg2WjlAPjMxRUklbnheKzJtCiteUWNYKypuSypsRC1Kezw7K213YCFDd01KYnU3emwlMFRgXnRGNGs9dGxTTC0rLUFqVEBybl59c0kpcXQrc3pvJHpBZHVjISUyQSZVSldgCitLX3NUTjtxYn1LTUJJMXk2VHk1RWVoanMlRXF0SzxuNUVIRm1MVnZtX1NaaWFeRi00OFpyQSooNDFvfmV9RTkmayhybEoyP1ZTe1MwWTBPCitwLWhnQjlXcSokPEBxWUxZMDJYemU5biF1a29+OXc0aFA2YWpKUCVEQ0JQdTBHTE1WT1lAQkgxZyEwN2I4M0QqSSQyU2MkMTtZKk49fClPCitvRjFXWkdZUmZXUDxwbi1mdyNkPG08Wm03S3A4R0ZJWG1SP1NFUEtJPDZnUHROOSpfbHk4OWVSQzNab0VHNnMoN35YSFl4bSl7czRFVD44CitkKkgmXnpUan5WYS1XS3shMVNWU0x1MDR9RlFUUFMmbD52Q3d7eUtle0kwfEQ1cngrY1gqQjFBdFpxZ0EqTV9XZnkxUlE9JGExMlVIdWs7CisrSXtKRD5tUGR1OSEwPHIyPlA4X0hoU3Y/eV8kVXdiKD1BUmY/ZCFAYCVwP3lUQy1YI203bDwjQjIpN3paVGNhSDtzWHFXXkhwTTlZNyEyCitQKztJbCp+IWJRa1A5MTR2ZWJuQGN4MWliR3wtJnhaJWd1S2kjak9kMnJuQDZVdjJ3Uj0kO2l+dHF3WG8oQ2F+cUYqYm5wQmhwIWY2cG0wCituLXwhbTM5cGVWQDk9dE5zMG9lYCF5fDtJSV5GSSFUaW9DJT59ITBCUz8rK3xsUChEUX11Z2tWfUtYREUrfEs0eFRzbnZoR0g0N2pgMmFnCisqIUt2WDY8MDZkbSYocEg1QGBtTTs7JTxNSGpkPngtfXZJYVpeeXorX29gQGA4cWYleVVtU3UhUGQ3PzdUdW4lQis1UHtaRkNWWjhQRkZhCitiPn0mNXVjSnJZPj1nfnA9Mm1pVkZmZTI3SnA7eXJ4JD9BPkZ3e1N8ZWBwSlU9UVNzcW0jc2pDUCFaM0N6d0hIPj1MTX57bTNoWXNCRWE7CitwQUZtKClDWVZWPTdLVSFkPlJ6MiZ4NEU+KyVaKmN0XitAek9aLVZzYyt4VmQkeFA5RTRWND5OOTliQzctRDNPfi1qTHojQEwhY2d8bWg7Cit0Pkh7PnZJWi1KQmR1PTstPGA7TTdjek9YfkgpdndZMmltcHwtaXkpZypmX0BBNno3TXN2alBNe0UxWElWLSoqR0lNUHgrJEQydDc2US1mCitKNzclfWxTXz9iezJJO0o4Z2tqeEIlckFYa1QqK2l1UXl3fGwrWFAlMiQjIXtGZkZDaTZLKWRyVFJje0o+T35WZVJLMyhDZVpBYXRXKzNWCis9MSg4bjNBZXJVTiUwLSpBSkk0cFF5YDlUMGMqc0VwRHZFe3lzQU9pPEJMemNkN29eSEpFbGRIV0x4UGNrKThCRU5zQERBQzJ8bkRoSiYwCiskJCFxITBqdnVOOTBPJT87b31vTXVjWDNHRCgmU3BBOVZHYj1ue0dDZlRRd3cxQ2xDNU0lZjlSeURfJkoyK0N9KXcod0hscm5UVTB1eSUmCisoTUIrTkFiP0Y1Z1J7R2w0I1VQP21INTR7RCFkM0BSZUYoanEmaWZeWCMoPz16UnA3KEtiaEJxM1E8RHBFPFR2UFZLSTNiNCpqamtfZS14CitCazt0e0dAbDJedEVYbXFTIS1tcHdLTVZwMyF8Sml8dkhxVHlkN291RHprcj9vYT0rfDcmVztzU1BGRnlZN25ZelpObVA8IVZBdS12aVdgCis1IU17K219JXVDNCtmO1JVPEZSUzQ7QGZpYHlDU2wzZkhQVVFia085S1FIMDAwMDgwUH5kPU0/RGQpMCp3YSUwRSFwQDAzSEFVMEJ+dD1GCitKRT9MWmUod0FGSngoUmJabHYyRkt1Q1JZaGBrQ0VedjlSNztBNmF3KVZTITEjZn50YV9iMGZ3JjdrRiVZZCVQaDUkb2JFWk0jVWZ5ITk0Cislfj0rOE5oKm1xXnVPO01KfHQ0MmJCb34kTks4QFp7VSVTemBLeG9YNSoyU1lPVmE3fWBHMFV7Yn4teUg/P3JvJWU2IVVnZT9LUHxae0EqCis8IUBxQ0hANFRUMGF6cD4lWjJANHZARCp6bXRCNGp2WnlFVj8mfEFAdjg/bnw7UjVKM0Q9JGVYWjR0dWEqbDJHOCtYdnJUc0UjUGU8OFFaCitmKUJkcl84JFM+Rkx1UmgjZDc1WjVkK0VuRUkjfUJ1XlVqTypwP1o7bmxhMS1FV0NucVBMczhtMn40SjQyJllhWTIyNEg2PUlEdEFtT3ZnCithISkmVEhDaUk9VyRgVnIkLWpvVisyUXUwRH0oeld1SE1JPHB6eXc/WUNoclR0UFV6Znk7TysxNkE4eEJZQ2ttU1J0ZW1Ec21iNmFVcHtVCitCWCohdkByQFZoeXAjRU97b3RwUXgzMXd5IUtlVURJWT1kKnttI1NVNiY9ZkJ6R0JhRz9UNGxJPWkzRVd+LVZpTVhueGMtQkdZdEUqfTExCitEP01NJTJzfGkxez1PcU0tKlhNaEYlTWBnPDl4eE1mdCpxeGt0JXZUdmspemwyKDV0Z1V1RmxOalF1eFRsQTcpeERvVU9nPGdnXnE8bm9kCituNzZac2VQZUZiZEw5aGYhT29jYTc1YiNlM1FZUlJGS1l+YXdgYVdqVmg+KjtaeiZuNk8tJjBFZVllRlJARiVsYzN7JGZvRjRpIShWRCR5CitacVdNMnJZKCNJMiFnVih+cDJIYWRzSndoeWw+aXtsMFFebEZlJGVGPSNgejNHSTslPDN5S1ZZN2M3UDEyWkZRUURpR0xsTUdiTlchVDElCitWOTI8YmZuTHBOUFBoZlhXbChJYmAqUVh+SyQ0S2B4NGE3WjxNPUNNYHs+TG1DMDVQcGxgZHgxblNjUDFZUipgSmhlIVRCeD8+ST9xVjlBCithQ2IpWnZ0ZzlwfntCdChaeGEpeEMlfD1iU3FzWkF5cUFOX208RCtET2ZON3FZNFQ3dC1Ae1BOJSVxSDleUCVHO3JEZDQxJXJnfVpZdkYrCit0UjBBKitWPjx9bCE1SUAzRUZkQW1icWZ9ZFNSKzdkKUFqOU04ak8yentsNExlNjloVykwISY9ekokPEtubD52fCV6QSgmMVE2WU9RY0g1CitaQ2FQc0N6VUhpMjVPamhmU2xud05jSHNIMCNyVzQtMiE9Z3ZUWnBfTyRybEFJOTh0JiF6ayo4aipPd1NiaUI3SDx6QFFkYHN0fTZoVEc5Cis9ZyE+S0ZRWXNLXnRNU29AeyFaOUMhJkR5TFQ+OENBVVo4M2FUdkBeTHZOaDx+OSNYYz4mWElzeyswbEQ3MzgzY3ljPmBZPV89N0kyY1I8CitmbzJBK0k5fV93eWN8dVNwVUZzdlBfZURGI1lmek9SOUNRNTBGZjRQQiM/NE48WWh3dmV6amxnP21gc0Y+K1VGVzhJe2h0b0lNLXU+aj0mCis4P3c5a1ZlezhQN0w1cHdmMjBvTnxkJkdeJTUrTWQqXzMrdTY/bVUpQ0V+e3VtZ25MT0ErbEZCKmU0I3VXaHs7VGI3RC1eNUBUPCtVTCZACiswJkZOITZeOXhgNCt6QWhncUUwQTRaT3ZiJnpSaGo0IWl1PU1eUHslYz1VTShCaHRuK2hpbmh1dSpSYmF2TSYpN0BicHMwKUNVckduVE4+CitrZnQtSmRwdFU/cShUeWlCYXIhQitYP1RAaHl8USVZNWR3USZ1fnc2dDB+RGpARTNeX0lsN3Z2R2wySldNU1hRYFhveG4/cXdKNHlRTHl5CitFND5rSHojLWhrTUxraDV4MG1TJDJhT0lWQGl1KXpLK144dj8pYlJlM35qM0ZtTk18JVYpNSpUe1J1flMwbENTa2xPdmZNI298RH0oVipWCit1c1BTIX49fGVZR1d4JH0zVHFEVDdYcGN+VV9gKFBZPCVDJGZiPFh6RClHJFFmR3ExWiE2XkhlODtuYEZ4eitxM3p+eiFOSUlBY2tCP1BhCitnWjBfQ1dnY0JJRV5wey0pVmE/VX4/IUspVzZzJGcpdFVKVXNnQFotN3B0ZiE8ZG4pO0ZhWkVBZWxmd0NfX0VydzFEN1JHdCRLWlRDIUhtCis0LWpGYU9veSskMCUhZTEhSEBseXNaK3IkcC1YI0hTdT5fNkFfbGJBc0NoejhneG00M0lhYjZGVEs8bjFmbXolIzk4TD5NbXZfSl4lOFBfCitSQmtEfGJ3ZjFUe2tVSyFUZjU5KkBRbWojbz4pZFY7QkY4PW1RSHdWMSl0RytZWCRJRlNtXiVZS1JWayNlRX18VUA0NW04OXooKk92OyFPCitNa0BWbG0oI3k+STsocVZATiZLKkpndnRySz9GdDtlVVlYXkRyQ0FLMj1ZYUhvRnNNcCkme2p7PGl2JlhiTEpCYnxZa3c5TH5xWjBZJkt7CitDNGczTGx6LXdMRnJWMiV7KkJ1Wk1FQVd2ZzlZWjxWYmMoa19sPDwqbkBFVypHUEpvKGxUdjJGaXN8REZCZFRmVEBuQDApV3Bjb1ZiaCQpCitCSnstN2h+Qzxtam9Gd05BZWlsOWRKcE84cGwxc1pZUGhSJGZHRUlsfHBXQ1VQY21RT0NLcGhgMjIoWmhFSms/VUF5e2E8QTx4RWV5UkN6Cit2VD9mbVQmPnchaHU8ZFlGdEpzaUhjPzFuK0tJTjBMUUtGdmQ3SGE+cGo7PWlxTH5ZcUB0cFcjT2g9JWkxP0ZMbUlYPnw/Xjg8I3ZxQTxHCitrbXArTV9GZzB0fXNJSkFeRGo1QU9ydEoqb3lkJkR0PSNqOHNRaS1fdV5iKn5QXzghJFlzISNNN08zWU85eFZqQTk5N3A1ZWU8IztoUkhVCitJSjlfdVhqKUhVclo1MjhCNnFYJjhfTyhrN0ZqTV4xV0djVUs/cWxHVHJpeWg2ZEExNjQpUDUyKSU5UUUtRC1+WkV5O148Qz4pUHkmY21NCiteLXxrYilFUjRCYDlCKnhjU0tGTXV+JmIoak5YOy1iWiQ2dDZ1Um9KVEY5WW5fR3peKXsrbCViTG1AUT05TSMrdWcqdFROcTFWTnA5Zzc/Cit1Znd2LSVEb0NzWWBQaEB9UXQmTk1SemdDRlkwODR6S1VjLX5ocEM/c1UyfnE/JGw/KkYySFpQUF5mKmRWKTZ9KCEpd3g7TCo5dztjKVJjCitQKWg+QDZhV0FLMm10ZXk3RHhEPD9+N3xBMDA2MyQwMDE4VjAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFFvRmJZV3krYllVKVZkRj8mCitAY2lneSp6eCVJWDxLe198b3RlZ05kVXRpfVlyVjsyPilYVzF2emA1QCpIej5aWkw4S3V2eSNTK3lVcVc4MFFmQ1puc0tzeT9lKDJzeVJqCit0XzFWSW80S21naWlsUDQyNHVkPStuK0dESHNhYElwSldOVWtDbj8wfFZfalBgQy1MbS1raTB3WXoqPTQ4S29WfnFvdWQ5LXNSRn5+dFQ2Cis2WllUOXNNYT0yYmFgUEE4blJTQktBTU08PXNzYD1Nb05uWCVfQGohdXNjemtHTjQ9Sio2M0xjNlU7an4qUV5tSVl0JXZaYzxmeEAwWVlmCis2ZHp6ekBfWjZzP31KX2JiZ2F3QHJKI2Z5PXxzalRQTGdLdlp+dkxyQTVJT1IpPDlqNTk2S2IoPXBxYj8lO29SJEFyU31eZU4qWG1ifWhzCit6K3lCLTQ3TSlvWVFkN15hQERTQ28rSzxeQVk4VThiMDcmJWlvRTRAU35PYypAJiFKZkg9LUx+cTxOdXdFT15yWmg2JW4mRjd0d2A5KUU0CitCUXZGXzNTNjR1MV49SGt1d2dqbEQwYG5xbys5SlEwZVZGcWw1QGlnPy1TV0REVXowPyhvbVkheCtOdkhXWjREcH4tOzd5OXphe1Bja35kCitANEAoKFRqRV8qR35gVVV7MFpnfmthVGhfZGx1VUQ7XjMtcWtoZDdFNl5DcFl8bCUmdkh3JkAoeWxzbC1VTiRNPzxyOGtUYTUzLXMqUyk4Cit3MWtAeVgkdnF2VXdEd1N9fGhIUVFJeXBGO2FyXmVqJTJHRjxAT00/aT5xa3Y1SDl7bnZUWkstKmJlUzlSUV8lNGx6ayE0RTlwMFRBKVdSCitiS1BWdXREQ2loM0poZCt5KHIrRGxkekMtbVpuKnd0VFR7U3pFeW5YfnV2Vj9gbUtOaWB7WndXRFcydkVDJWpfeHJEcSppKW09JmNWKjR6CispbTU0UWpjNEJvM2EmJXFVM3BWaGNjbUZxUU5DTylFX2ZYcj1DSGc/aSMlSVRJUmk4O1J2Z0tlaT4/SDluPU14dEZkY1VBX0UybjFxLSZMCit9ZlZHblpfOHNoJmVSZFk5VldUbU4taFRhNmEoTUxlTylAKXJ7XnJIdShPMXNIeDV1LVd2Klk5MDMma0RMSVN3LWBoNGYqbzIzOFJfSnhUCislU0hOanBDX2ZvVXZMNThzLWwyI0YrVEp1WEBCTnM+bFAxJkVTQ0JJeDEjWFk7ckt9Y017YGRwe3c3MDtrS3RTSlp2UitWIyg0OWtBfj5eCitDXzVNbzFOYSFVND92LThGfEQrSyliPjA3Mz4zTk0wUXQmOFdmUWNrczA0dl99RSlJUXBTdjteJjlJTjI5R3xfdHtTSkBeSlIqI1I7XkZICitTczJyQUNPKjB1cHt0YT4oU2RIWkJlKkk8MU9hP0w/XjJTP0NnN05eQDJDXkk7VWswSDJqKzEtJkoraVY5UCZNM3FEemJ4V1lkVVJ2PTwpCiteVkB7dlNeJmJVZTlwXjshISkqJVUrK0JveCN1QmlLUVdFfERZSnU/JnY4SEh1KVYzQDMpcH1+bTFkSzckRksxM0h5MkcrQFJtMExBYUNwCitISHFTVnJhViFLPXF2YGVmO1BgOWM5M3EkbnFeRE8wa00yKyV5bDlNUHp4Zyo/bGgtTDZRfUJQVzVhdXR7IUNFITE/fW0jd0s/eGFOJC1uCitZPnRKPHEybEZpTEpfNFV7OWckQ252blNGcT53QGVHWVlCcCFBOHp9KFY9WilfNExXN1Q4YHVhZFpedFE9QCpneEMta05AWW58NUgzaWZiCistazU8enxzUU5EOT8jQCtBQGRndHgyWiNOJEsrVEswZ0AqdzBYTilYZF90ZEl0fSQqU0wjeyYhdVpvITt1ZU95KXRhdEBIUVVWJiEoIy1GCitmRVUqKD5lVSFvTyhVKXdGQ35vSEBnTHBudGdZQWQ7a2l2dDEjNDI2cF5tfEwtUztSQU5+X1JpcUhQPz09X1YocXJYUytUTGl5RkJXUSN3CitiSCo+M0c3b2wxOVc3d2B2M3ckUno1RyZaanIqanJKZE80PThObVFwKWdgbExQT29fM18xWCNhR1c2KXt3SHhaQ3NUQShEOF5xQWlqJFlNCitpLXRoSVJ3SVlRZykmKn1gTVhee1lASjF6bTBjPHZKTiZVb2o4bVd2Z2N9WGZOe0RFKCE9OHA8MXNvPmIzeitiMExBYEduPEVHTXdTcX00CitTdF5GYWt5Sk95PUl6MjleQTh0N3FLQWU9cHE/SWwlQz5sTj0oPkx1OCNVfDhaND8yQWhKYElaYCk+Xlo2TG12U0NjdXhiYGZZfmhGdHFUCiswa349ZGhqTDllc1dEPUchQ0tTd35nTE09bkJPX19UUnhWUz9qTSg8TT8zPWBhJTVFR3JPPjdYP0BKQyk5YF4kQVpEZWZAOCpsMTxwbVVaCitOUmRJI1ErJSlmdzVLSnF4Umwjanp+JXk0MFpSaVlTfVVjVi0hcGt6KSgzODxXVG5mZVdDJitlMnlTO1hEXldGZkgxQHQ5e3cmQnl3fXMzCitGUkVMeDBUOTViWiF9QWptWlItXz9yMXYkcVp1N2hqPCktYHF3ViZPV0AhZ0IrVjFDNGErZkc2YEomczVfej0kT2hXIVg4STNCfj05Qmg7CislRU87NHY7NzJIU2MwN15ld0w1IXlFKktJV1VoRWV9ZGk2dG5ZQyZ9Km1nfE95SlZQSDJES2teU2A7eklBeUh7b1lCV3pENEJeclR9bX1ICithZUJzPERCNE57dkghPFNYSWt1b3h7Y0c+O19wWSp+cVlPUkt+bj49T3YxNjxHdCVoRFQwWTlUPV9pXld0Jj48amJQdUpzb1RIKTgrb0ViCitQentkfCQxRTNuREx0aFlmSzxGWEZGWV4xbmo9cCU5bTVTPylOeVBII0MwbikhN0ZZOVRydHBOYFIyTTI8KUo3eThOOGo3eyhAYmIqUG9pCitATGh1QzZrSitsdyVqR21WeD91KTNDZHx5KFpeb1RVQUJsSy1qX2Mxe3MqJVIoYTtVKiMkNWtjJXkrTEkyXjZXK1pMdmhXKS1RO1J2KDtJCitucX16TnNvX31URFlgKyRJPX4/NDFZc3E9USM3WS1FIVljTj1zJFB1S1l7OW87NiRUJndKTmVRWTVfWkZtWGBPZFNASnBUJiQobl5UWUw8CistVGg8RT54cERocFh6cm18Y3NwTFdiTD0qfHAqRmpiLX5qYW04NSkoJCk2P1QhNV9pRG1LVChURj9QckI+dzhzS1FsNHkmclA8JF44Q2heCitTYilAaSp8PUZ5JktQZXQwMW1Ec0k5cmo9P2glJlJAaShoX2VuJWk3dXQ4REcoanZiZ3FhPnIxQDUxYDh9OTN2QUNaJEhkIUltfUdtI0lKCisySzghcnN+bzhmPytSU1pSOSFKSnh6eztQfCRqWGpAMm9abSg8Rk1SUX0lP0ZITzFRNj8/Q1dMNDckdUVpKFhSTGJnMEdCaSMwZGhFYnhECitKPnR9dFlpTChSP14jVFQ3XylGczZtQDNAIUFHV3I0SFBzRmRnXiQremg1QVJ+RkA3KDlDcE8rbHsoMndrUFhSJV57Zjg2QWZpV2NFQGczCitFeSVSQXdfVnVrKWd4dWUjbDFiNFdwQVFFQ1hMQkctez5fZk18UFhEYmtkNjVgVXY2eWd3Y3pgPUxlQFYraE85X3Qtan5SPHBWRypyN1N4CitNIWNtSzUrUyQkWSsoK29NSn5fMnMrM3B0Q2sxXiEld0I0MXE4Kj53MSRFSSRzNG9gS1UqZENKfT1UUkApMk5CWXEyaXRgfSlIOzNsX1NNCitXTG5MUnFYOERfNiR1VitXNkMrWk4wRXMyUWwteUkhM2ZBaGl5VmNiJSMtPkp2cGcrTnsob303cGFrbT5ANWtNWkhsISZrR0RnTz9wPUxVCitpXypnVU8lTSQ9e3clZW1nej8hdVNtRSMqU3tAO05hSGdGZ19TN2pkX2diNT95NUM8OSN3SmppcjFuUENpdDhQYEsxTnMyWCVGMSNOfXlxCitWOGVETnFLbmJmRmxoQ094TGtHTFF8JCpPPD1hXlFkfFRydn5pdWd7Y1EhfkJgOEBKNl51eExRNHZ3KjBCUmNiM2U/STlSaE0jLTdSJjNqCitUckdHRm5ne2ZYcmpaM19leDJmX0N0aWBfV25SdFU9JHIhe0xLOTxub2RgTnFHPk44Kzlie1JLXkcpJTMzNUshMkcpdzQoSCkqIXtEWChWCitQMSY1WDQmY0tCQUtHTz8wWkJgZENqNTRNLSM8SjI1bDJCN2NZPjlMbkY9VSkrRyNXWDIlSHdBOHhRVzxmPH1TNmxlMHt+USgpcXA4UGghCitEZVg0VWNYem5+X0BQTn5vZXVYKH1LaFJlbSltLUFZJFNOSEw+SmdCRn1hSz19WWpRbE07OCUtSDEtfTYrY3JlTUxmWTEhcj10YzdZI3hZCiswVG8lTzNSanc3eSM1V3Eha0FTazJQLUJfYHwlc1BFVEwjPyYydUM0SmV4eGg9U0FpTkNge3BSbFZPUkMpMWtRc2cmV1paOSNnP2g1S09uCit3Yz1IMDxjSnpPSVh8fCRrWnVwMk1gRVdjaHlTVmtJUDF5RSRBVnd3NCQrOCZRSVVHYypDLTRQN3xiUSRZSk9AN1JlfCpHVSNfb1M0RTM8CitfbSopKUMzJV4qTmZJfV94RXZEK19SKD1PV14lZ25GOX1ycTx2RSFvZSoyTGVCWFY2dFg5IWs5KVdGVWB7SCh3TkJTI1ZZSj1eVyo9d3lTCitQLVk+YmR5QnNKcUg4b1ktaHkyNjVTVChSVG1YYHIxSEJGPXc0cGktcj9pO1A0KEFCWj1mMD9lcnB+dVU0UFZXJkB3fW83b2VNdGQoKjJHCitUSTtlO0xDKit+U19FWEg7UVdwV2QhSWotK2JzSz5IPjJhMk4zRmNqJT5tV0BZIzFKRHRadTV9V1IzPTBMe1ZeNTAtPzFlYjw/VjU5eFIqCit1S2o/cUgzVFAtS084RT9ISntsQHdMemo8bWd+O2BOanwjdnN9RCp5SEFoKGlVI2kheVdgckojPTtJWjl4KiZHdz12VVhjYEx2WjFyeWZ7CitlOUdJRnBVSkdUR2BNdFVKUE1GIzdOfXZBbXwyeTJNOCVuPyR8dlorV092UTApWHg9a0FZYCkxRTtWTTIxKkw7I240N28/fGY8flpgJkdqCisjXlMmKS1DYk1OcDB3JGtXNEV1M2d3cn5SMS1kT0gwQGpVOCZ+MmNfRiNicnc8M0h3RCNqYGRfcVMzVWQ/c3klS3hedU4kMEdmbDtMMmkoCitpKGxqQktTZFg9KHJ7Z2lGOXlfe2JhNlhwVVF5UEdCPDZHRFcqSkBJTD05eXBeUDV3Y20pV2c/eXRjJWI8ZSEhYk1wVEJfc1kxYEkpP0JPCitob0NSPWJLKiNGR3NUKX5fTnR4IUY9JEQtVHY5RFM9fW5CP1FGWkdvWTQwRHVMejFVOTtsTmludXhqdjROSD1hRHJAWT5oRVM3Vz5oZWxVCit9K1NHeVombil7SC1nbW0xYFF3UHQoT2YqTDsmUmB7RkYkQVprLUxfOVpodjFYaCVqK0V9S0RHWTJ+T3FuR25vZCtZIWoyO0UqaWpDJWBhCis/YVlTb2h8TCl4UGJrWTRgS1NMPEMpRTkjLXJvanRVZXc1b3BueiRwfkU+NWNNWVJ4TzBrTmhTMiF6b3hkYTQ3eXkrQyF2eTJzUmtVP2w4CithdjMrYkZYUHxfNHVoXjx1ezNRamJGeU9HX0xzfSl5cj4jKD5qUzJ7ZUwjUTBNMUB9TE9tKSMqIUNidSVUQiFocTZ+NypSMTM7Wj11akBwCispZjZtUUArR2dLZ15PQnxtI0d+TD07Yj1HYXk2Q2Yod2deIUojSUMkJjk1X1RzenIjbElAKFUzMHVXaH1YUW0zY09WMURteWlKNz17QVJiCis9PUt+WiEhVVNtbWxxNmkqRjdfdXBEeWhtUEo0K0dvTktfO35UKX5qLVFnUHlmM0tyTj1mcl9CO0hvajRrVUp4YXZYY2d2I3J4ZCUkP1BLCisxPl9UcEFafDQmcFVMQjU5fjJRTmxFbE9oVGFqcTBRQnxuWDRmSWBeQ09GTThoTnE7QClCNWItSzZFWUYmezZeNyRyVENNJDdLNyY+MFFyCitTTjJEYD43RCtOYHUqMCNOMiY/aCo0QGgkcnU7bVBtbmtrR3srX1k+RzJSXm1gR3d1NGA0KFhAKDEqWnFxUz45NyZ9dEk1NWZfcnNWfTJDCit1QGlkN1h0TmAqTX1hQnJgOHJ6P0c7QXc2MUF7ZnJeeHhnVkBNcGFVOHFoMj9ic1VTJFVLaCNydS1UYDd0QDFMS1RpMkk0ISs1OSZmKzJDCitKOClNTHI/SW0zIW81VXxodDAoPXsxWnd8MUB7dSlpT15Le3czMnc8eDl+bEc4ckJhVkBib1l0aDt1Qlk+dEZUTGxmIUp2a1lAQXk5aEBMCisjVHhsOE0tI0Akfmh5YllpN3hhSDg1UngtKyshOGBRIzFueGJ0dCQ8fUl4TDxOTyZHTCQoN3wzdC05JGplQ2ZBTXx+Nj0ybjArPz5DRWs2Cit7N3Qte2JKdFJjNzIpKENENmdNbnpTakUoflQoTz1HQClQbiF8Q29rS1UmTXc9JFREbWxJKChES3ooZ1BNVW44TFBMbGsyUnFSYUMjcWBTCitnSHs9a3VVQUplVTAlfmxwbTUrY21XUkxYTVhLRUI5VXQtPHNvZ3d1QDIqNC1wUmRPV3wpciNtd31sQTZQdyFXVXx5b3BoM0FmaW1aemJ9CitARilBS1RGYTZpSzA9VElINXRSWVRxY3IzO0xhdG94JHc1ZEwhPX1mc1c0fFRQM2NEOXUwdm82T1hSd31WRFp0TWowd3pgP3d5O2NHZWU1CistIVU8Qk5ESz8xJUIyYlY/YXsxWkt4JFIpPERpczcwQ2FSKEtnUyZNSkF2bkRzbiVvSXFATGVCUj42OUR2SnBuXkoyWVN7Tz45YzQjdztzCitEcUE3WGRlNk49LW9eRmd+TVAhOCpody1JdWRHYnNAdUJFMClec1QrPTJqSGwoOGstaihAYDdHPUF1PUNza2JXPSorKzNnZnRFQExUSXdaCit5ZGFRQ0kmOXRDU2t2eHl6N28kVjFiZV5GTHdNX3sjKDVXdntaeCl8PStkdFZENV55e3poM0NHTEhEYUN+JWxeaV5rZ2JzS04tbDUjNHpoCituTSFNbn1vc0dhPF9YcmswIThwYiM0XiRMNmdLP19wbi1rSC1DSjdCUDF+MCpAP3BwNC0pY08xYmF6QUNsQ2k+Q0RiJF8wbmg5QlJgSjtICitxUzR2WWtRJTBiQilMSHJsdEFJUXc7bGRPa0x4fTV4Sz91KDl1PVc0IXNBZ09JXk89Vm1rQV9DX2t2Ti07XnBDWXVWKjZIdWpiZ2lRNVF7CitQYXo3IUZDPyl0MDlTKmFYc35lIU87Y0U1SjZyPlhIS0hpUWVCRHlfcndEbk40TG9ucnBRckItQWxQKmpfdWBoaXAyOHI/VyZfZFpFfEJeCitIYXhefHRBMlQjb0RWYEVyLVNFNVFCUXZyezRSfVhPPE1kVWVGZGNXaG1iPFJAaG1mdSRhN1ZmZTcpI3NrMS1DMFd1JEh2cW5rR2s4MXdOCitxSTYjOEhqWip6V2EkJnp7bnlEVnNmWChjR281REk2TF5rWCRgPEglNmFueDhWcjNxYjl0RXtBJj5Mdn53a2xLaG1ya0k0VX5KdyUqRTxXCisyck88MFBDQlQ7ZSMxfXclSTkmK05jcGw1S05yV3g/eWt9SUI7bFpwNiM1RWY9ZHRXd3xXKzMhMW12S1ReXzh3KnhYYGlYSXF7M2ZzeXJZCityYkFyclhCPShiaFAqPTA+OFFeeVRgeVVWRiZ6c1NIWjl2SjhrXzxFS0JzI09RbC1VPlEre2JTZThvYDdMR0FZJjY+JFZRZ056MnU5XyYhCitzWDVXNEg5YyEqSlQzWUtRK3l2M1k1XmVIWS1DPGFGbUJLaU5PMHd2fG1gVHd1XzxaYXJjKnNzQE1oVS1CSCNLdiNoaUtARTNLI2IoSkhFCitUWjFqM1NGeypwPiQ2a2xRb19rQHIlcmcjdDA3TS1oUz1Qb0Y1R1ozajNVYTwkZl9ReStxaWd6TWNpZnIwcGQ/KWJWc1Z4QmBqUVojayR7CitfVzFfMEpgUylJZjI1bms2WW4zaStZclRzVXdBTjY0WmtQbzQ5bSYoJW9ZWUJ2WHVoI197OSQxY3xLeGxVMWN5YmkkaW9+cVVhUmdgdTVfCit8S3dNSjg1dSU3bkMjU3lLJFFfeGd4LUhFPTF5ODlEOD1oSTZUK1VNdyhPSClyJlhrd040Iz07TWt1dncyQnVEdGczY0BoQk8pY2FaWm1iCitiM0g7KVZqKUhkLUBAUEBXfDs9e1Y4enlJKkcxcGY2PktwOTdqWSlWU2owbSpLMmVMa2hxbnFjZV9OcnVRWE0/I3E/ZTVjMHMhUSNPc2U3CitxRXN4PCM7ciN9PSs/Y3YwTFlWfXEyViE4PWgrQjxTblphdHp0Q34rSjctZ1FxaT5BRlZ0WTlAQDZzbFp2JColOTBhRTQ3NWAzSGJQUDIrCitzWnIlV2VrKnAwUSs4LStjTTg9WW57QEdSTShvRztnfGpzM0trYVVkPEchYGlWKGtXbSF7eXRmdnBVST5pfHQ1eS0jVUteOU47P3hsRStOCitHVX0wKH50S1R7eXI9V2JzLVRyVH5lcXc5OyozcntpPSghQEYmN3RXcFIlNEJjekJ2O3lVZ0AyPVp3P2ohX1E9PmF+NWMxbGRRMiFocXhLCisxMS1wYkhYQHZybV9fVE42RkhmcitpQmkma2J3KUYoczZBP3x3XjVBd2t5dyU3Yk9jJVdaVm5gVSZzJlZ7cVF9X0pOPzdvMktKc0xJZWJTCis/NHwxanMpN3ZuPDVvRntLd1hraFVwR08/UGZROCo9X0VoLWk2TU8+PkdZbSUmNT08MU1OaTMmYio7X0xeaXNuKko+MyYoRXFtX3Z0MlVwCisocTduPz07aDx2WUJ0aTlfPVl4RDU+ZDxlS2NFT3FKJWF3NGt1aGJtdUxDIW0tPTk+TXApNFA5bWRpS3hLTjt9ZGlOUTJ6KFIlYVVJVFF+CitwZF5TRU4/QUkyNCUyYH1hTmZ5UEZFTndaOFAzUXtoRylNVl5PWnFWaWYqSDZWUE1lPSRSdnB9PyFeOHs0N0N5ZXM1RDk+MzkranhaNGBlCittbmRSeHRsOHBiKitPXmtFeEs1VHZsXj1WbEZAYj4jOW5gKG9jQWxnYkt6WjR4ISk2SDRad0VOQ1AqLTRzNm9VOSgxaWdRWkgrYiE4e1FVCithbEVBejg/fX47elopJmZIRGxYUTswO34yTlE+ZFpjRmNwVz0/OH14RXxAal5Hc2l+X2tnIU5Ic2EjNTJhZFNLKjNkQGwhNm1AUCVmS3tNCis9PTFMJUg7biVHLT15KTJPX2gqaGxPJDdCaCpGRj5DNkRrcjg7TSQ0SWFJR19ydzE8JVA3ZiRTPiooTSRDZ1ZsUmRwIUIzU09xbGxOO1BeCitKUmBsPHc/VkVEKXRLZH5tNitHPi1zYkNRX2wqa3xkJiZpdTNBKE0xPnMkcjxwPUU9RTVsflV3YEZ7fWMrdEo1VyNCNXc4PCFCS3VaZlJvCitSIVZGI0JQcnFyTVQwdCt3XndwNkc3PlFxbUxlJGlBPjdVPTdQKTh+Smg5ZHxNbnxNRWxqTWZ9NFF7eVRjfE9JMmI0aVArY3Y/Q0lwVTJhCitgWGEkTVRuQ0l5cngkOSorTC0lTHMrb15pVj9iMk0taH4jZkImRVVjV3Yjez1SM189fSRaMy1LV3B+XlB8R0JKM0NlMUxjSU5JYn5IT2FJCitETGEpcUQrK0hXYnh4PmdlKyhtYmBgSj1qJFVCbj9+fGAqLT1GOWowe0VrOTFIeyR8V1lxPzY5LUN4LXVxa0xzcXBeSmRRRCRRdnlfa0tjCisxYCVlSno3TFhDMiROOGxXcE9aSiYjKS00RiZ0Wm1EYnNAfj4ldVpMalZhTkRBdnFSPUI9ZHtlK1ppQnpeISQ1K3d4fiNwOEo7QFJvd2I7CiszcjJvMkQ8d2EpeDQyPnAtPGhRMW8oa0Y8byYwey1IZDtwWHp5I058XmQ3SVomTmtAYTQjPnd8YnJ3ODk5LXlGTztxP1BWMGEtZGo1K18hCit6a3U7fSl4RCthTiolLUg2RDk/dFE+aFB6bD8pIThEVUV8U3JicSR3KChNTTRYZnM4JWRXUkstfX5WdjV9Mz5mYihmUTZ8eGJHN2w0SjRSCis0OzR4R2skTkZTQ29eO2VXX0FnOVYmPD8wQVhTPF8mcj15I15gcnw2eDReMn1JPTtqIygmbCE8JnEzP0tHMFBYWGA0c148a3QqKnZWTnxZCit8JWsqZS1LWUt5PzdgUkVWTTledzgjZk9xOVM3JSE+VSEqI3N4LTJITE9xajZhJmNvKExoWHJXVkVwSjAoOzcmJFV1TCpPcU4kJjttZ3UoCitiX20tcDJTUEx8PkFrRWwja3llPV5nQ1cpe2gqQmQoSjs8Snt9aH45TlUlfTJ1NWImaFQrdE49ISNyKU5SdCl2aT1jP2J+Vn4xPVpWXilfCitrKCR8IVRvSy1UdCREPUdLaVRfTTlqJmJ2YDdafFU4Zn02PnM3cGpGKkpuUn1tITNTZXtjdzVpXz5mZVFPbFlON0ZURi1YRXBLVn1AbWhZCit8SWo0WjEtTnNrXlZjP3MkIVhwfEhQWXpBZDxqI3ReS1Upe2Izaj9neWNSajlhRzNqKCRyKUdoIzJwez88Oz5WZyVYdGY+eUhPXyE9Xi0tCitNZGdkYD1mfERCSG8xckRQIXttallFSGpffTkkPk1rdyZwb3F9MmlxWl96RF9GeVVXJHUkfT5oTSRMe3NxNW1jOH04O1hJTE89UjRrIUxqCitldio/UCohRDROc0w0XzkobHw2Wm4/Mi01NDYlQmx4MiRMOHQ0S0dSUmVMTih7K300aThtd1dDSF5KNTtzeVhVT2Q/fEdQcXIjWj5Ua0VFCitPeXxOWmF1cjFDNS11bSg/UHgyRSZgblJxWVR+RyhKIzhFZnYheyh2YXx0KUVMYEBlaFFKJWpLNjVUM01kNk0zdE5PZV9qaz51N31Uen1YCitHeXwwYTRQc2xub2d0fnx9KXZCSXpTLSZhblIhUyFJdDMjJSlVS31ibFpUMCk4NncxUHlzbGh2dHIlWlhvVEo2Tn1ifFdoVj4rNmE7KTFGCitSfHdNREVXTEdiSlAtV0ZmYEJ7aWlkayFQKzFGSyRxSXlgaiUqaTEqfCM+N008ell6ZHgrI1pBOXpmSXE7V0JGMm52Vm85NjR2Ny02JG9FCis0QWFoZVNEUHM1WDlkSjZ6bXNsSV5FMWx8S09+d15DX3J4Tzs1JiFQeEFtdjlvPkZpZHw8bl51e1NUbFA5Zz4lRlcrKzA0Y1hjUU5eXk4+CitzPVcpSGhhc1N7cFBubEF8QkpQVjAmMClxfUVfNUkpcFZOZTtUR31TYCQhQEBDUzkkeytrQjVLPEhJQWw0cD9hOHI0aTdBbndNZCoyP3ghCitSc0UyWHRwfk5gKzJGWERIKUlDO0oxX2Q/ejFqU0dXO01oZVcqJFJWSUFOMygmO0p1cCZNI0ZEezA1Njt2O0kqdV5nd1dfd1dXbkQ/blhZCit6dUVVYTtOPikyP2B7aWY5Mjx0JVVGM0dfNV9XfmI5VGtGdSQjKC1UeiNMIXQ9eWA1cys8fTlIPkokRjxtdUxDSDw+dkY2ZDhLUG8keE0lCitSeGlLV1d8TTNFZ21yZEcmKzRNZmFnUlNxJSFsKX1IXzl0TSlPK0BlUnVJJnB1X215c2U3Nk9VPHFyM3tKSmt3THhneX1xOWElP2JkaDNXCis/QWFnSUoxQig5ciFLV1F1TW5CQiFgWUZ6SyZqSTB7fH4/WiRzP3tVLVRHPm8md0JVOypweihRJn5lZ1JaQnU7XnkyRkxpcDFhTF9lPT91Cit9LXJ2KG5NVmRoY042Wm92XlY2KEsrdmQ4Pk9Hc0lyaGl3cjtvancqOUhmQmNJS1ZvO1IhaXAtfFgtZkMhbWRaPWo7dzZGVk8weFkoSTRlCiskMjNnd3olZSZEXnpeUEFrUW9FI2x0b29qPk4mS2k1MDNpQkFFbSp8KDBgR3kqezNCOFdicC1IUUspYmoqMDYjVU5jZlpwNDJ2Ml5JeWBYCittXj0oXmZfKHlmRD1tUXtGJHRoNSl0R0RXdHhaIXJMdSpWYmBKP2F9JFU1ajt4ZGJvQ1UpYD1XREFLPD1fbWdIPDg2Wn5eIzwjRDU7NTxQCitEOFUyRVQqLTd0RSFpXlFOSUx7dXpzR3BNNWRRREtGc3dsY0hicW9JRlo1MFl8X2Ymc3pNcktIN1NoSEJ4b3hTb0tad2klMDBnRXNPQ2orCitlSng0YnpTant1MU1pTVVlKmRleG1ReEV2K1dYTTl7WWBGd1F9S1ZwTWc8JiVDNTwtZHhfM19aMVgxQCVhS2Nwc2MlOVFIfUxPWWRwYnclCitkfTF4MF52UCZLKXhwZy0mQkIwNChJRnlVQTNVRklMUCEhMUswIUM3IypTN3cpaERrZEdtfXxTKHRiamgtTmtsZElBX3cwRUVOWndISTZeCit3KHpGNGkjc1NOPHQ+MmRuWXtIZUEmJT1QenJxX0BqbWBFY1FFaWpgKmIkREJCPlVGNFZxXklYUCZ8ez48KS00MUEyKmtZWkhGcnNJJERHCitpRypiSUI2Skx8RDJ3YDZKY31HP3lGcDg/JDk2biU1Rmg/Pkp7TFdYRWBlYHdNVkVeR2xTMXAyRTZUPyYhVjV7UVpVUnZ8QS0kT0V0QEcjCitPWWZLMG49QEtiSFZJQ0N+KlhUR3hNYGV7PEwzPTNiVW43Tj5MYEI+Jk5TdV5nMUJebGdjWHt+I3x5RiEwTll1STA1WHJSQXs5RSpNPS0tCis3RHY7T3lsPUwyN1VvZzlAd3Rge3pGMk9Vb3d+SHhYekZXYyhLWSFQfHE3ZFhJPWtkeWt0dkprPkJSRk11OTU+bGEyKnlpKkBsPmhhMktHCit5SnlsZHt0dXYxREZJd0Z7VGc3PGdMMXgxOUMwJDYwM0JCPH5RZE89XmtLTXlYUyZhO1hORVJHcS1VQW9KSkJNOzk3aiNtfEdKOzJseDJ6CitVa3thajxRe1NFO1Urb3NsTVF6fjdMaiQ8PklrbGFoNCZJRG8kQzdzcyN0YnpFUzYzYnReRGU9aEtqdT9TU1JBY2tYVU8laG1JMSQlS2d+Cis1ZCNqRFZjUzY2RWVybHVJUmtPVGxKVyRwOGwtWEQ7RGwySnEzdjdqTkBPQTh3elFsS3NscklJX2QtcUA/T2F1cjxRaUxZN19HNWAmRHpTCitVYz5pfkRsQUU7YzNadFA7WHNGNz1gJTkjYnZkc1A+SXlgUnVSKjdATHxPK3hXSG17JStfZnZyPzxNRXF3O0R0NzI1aSQxQ0szPSR+cHVjCitLTm1QVTVXJCFfSVpWd29NczNscCpmO3R3azJTdW1kfTVWeD1kai11YGxRWW1YQDY/Q0RoaSh3Z0NrJn0jKiloeEwlVlZ2fUdRRk8je0ckCitvV2E0UzVpPWRhWTtDIU4zUm9xQ1JWcXZsIUpSU1Y0bmI7eHVpYDQoJXl8VFE4fjVOKzJFbioyNmNVNkZ4TiZ3VHFieXtTWSV6XnY/KXQlCit3a2RETUZzNUF2UzY2fnQ3byVjamdsMG91bVMqbmZ6eWhLVE0rM0JqMF9+PmJtRiNnIW1OJV45eW5LS2VMWTs1Q1M3STVATzdkMCVlckdwCitFcVRrJCFYWDFGVnpNWDk9USZoP2hAanJ7QVBJVShBQDA2TFJ2NWNiLSRHb3tTPEI1PStJRlIoeyNPPyVodk8qczw4KyRRNEJVa1FMQVU/Cit+UkBPTzBhVGJnUnNYZEB0WHMrKTc0eWJjWXxlekwhNkNpe0ghaVFxVXtoP0NWNXZtLUA3eV81VEQoaTdlMWZlcnNeX1NNMDJqS2hCV1IoCit1ZjNQWitSMkNQPmVGS1BYNlZkcTBJb1ora3h6Tk4/QUVEdig7YVZNNntsXiombSV0Z1UoXm5lP1UyZDRxQkdaSDs9S3tDQ3VxdiZ3PyNgCitodC09Z3J5YHAyNWM9OSVfeVFCPEpmT2otZGM/WVpQUXU/eW04d3FeamFaaVJEcHQ7X3hjPUFZfiRFVWdjRSo0KlhCVHBYX3txbXtWN2d5CitaRz1idG0hdFhSSXdWfDNsRUN9eShjfFYzRHFRcW41UFcmTiMrPXtHPlVaJSNGRU5vKFIpY18xKVIoKTUheShvT1N+dnAlK3pwbHxga2hvCitkPDYyfFVTSTZuYyl+ZWQjb2JUZGVSbkYteV9MNl9UY09wJkFRMDJuQz1XYEAkaTNMPHx2O3BBQ3FGd18pJGxAfHxPaUg7fmsmdU5KQ35nCitoMW5FbChgQC0ob018TVBgRiMpKyU2P0JMeCNBZX5HaDNDNTF7XmF9MXdMbW4wLWAjWGBFYk9PK2EzRkR2fVJDVmlTbkNmMmpqXjgqR3NjCitMdUdIQztwcz5ZZ21ZRTZhfkdFMzhFPEs0JTZSWGshZiFSNHdoSV51MVgqZzJ6UGRsVE1MI1FycmZ6YU5PalpVcFFhbkNiWT1oR0V2PWVICisyVk59N3goSWBhUCh5XldPQDVMVGJ5Uys+bjdqP0A7eHc0QWZWIX16NFF+JDZIaUByOGl3VkItXzt5PXA3fDl7RzBgQzhocCstNDNKNGVCCistdkJHOG4haWV2KzVtTCQzVkUxX2g1fSYrUnpKMnEwIW9oQm49bkhlME5IQT5qNTh8PjREXzg8JjZCajU9USorSzc9I3ROO1AtY2pqOHhvCitrNnhGaXQ4X3I+QERaUiUyP3Q9QnIxKGlgVWtTT0cwfEgqaVZhTSEjMmxqO0pqenF5PXhhMjwkNDdQQnFxZCsmb0NHczFUWXJeUWAqP3x0CiskUWVAR3BLQloyKCFIazYoVnNsZVRuPXF8M05vYS1RWjVuZjctNVZaKzV4dXwpMSk4JWEwdVEjcXEhfk16bTJENDQ8UE80T3cjPyFuK2JzCit+TmBtY1RZKT4+OTZmZ3w7bV5Jb0JXVEBBTXxUO3g2V1BLa0gwYD9vSnE3SU9YM2kjYWhZfGpac2B5cUU0O1JVKEdqRj9VKD4rNFVMdGgpCitJQXFYQj5AVUE3JW5IVVJ5bzhVdCtVdX02PHkrOE1Kb0krUCloPkA2YVdBSzJtdGV5N0RzUXhvX1RyOzAwNEk+MDAxQlcwMDN9bGE0JW5XCitXb34zfGF4WXxRYjk4S0pWbFElS2I4bUhXVmBYekxhQ3htLWR5bV89NSZ6JHhnM2FQIWBSWXxTY1Amc0RVOT9HPjkyUThFTG1tWk0hJSUzCis4d3dhWUJMOE4hcklveDtlJTx2Jm5sRCohJDhiTVolbmM7QXJLYSNwJm0pfkVxUmg3JGZHaD0oYnpXZ2diOEN7R24qc0gyT0c7KmBtRU98Cis5eUtVX1dra15OaGl7Sj1pKXVkK15vOzttZVhRaStgRGlzYExqS09na0FEJXI8c3Q/emp3KnFkciE9M0dtNzF7YjFYOUVLYCZCYlIkISFRCitHfTJWa2IoQ3ZPV3NJLXJsQD17cUUhSVI2bDZPJWJkTT58TClVPW8wcCRJejVubkw5fEdOSS1CZGY0VyRWNChIekxjSit8XmExTEI1MXBoCiteJnhXR2B2dXdrJHRoME8wMlpJbGE7JEZzPzchXz9RU2RPdUlrJihVZHpKV3MlPjw0QE8xaTYzeEQlWCo1K3p0NmlsNjd8Q0NBPmF7Mm1VCitDMkJOO2VUXzA1JCU/UEdCRzJsa3N6c3ZAUT8/TzBxbGVqJkQ9fXA/KlZ7fjJfRXwyUURTTCZOcVkrTDUlekV1K2xMRzVvZFh7OGEkIy1DCismJCFJaHBNeGM2RW00ZDxWZn5efENIOH0ybURAcy1oayY3SlozYSU5VUFYSyQpUilXU3o9Pk4lVmduWVNKZ1h2YHtiKFNTYzZ6ZUhONFg7Cit0SUNCZEl1KF88elRqbzd8MFZ9RktNQn1CIVlVPHpXUCsrZ19keUdySzNxNHEqQ2g/Z0pJaFokNEMkSjdQSC09REEyTkU4aW40WCNWa0xoCiswOF5tUHVeOFdIUUF1bDV1MF9iVj17VmxaaDlrX0YobFNubHRkZyskTzE/RHZBTy1JdWw1aERhe0xFUDJnbDNNK0o2eF9VeEl6ekVQQVIjCit1TFFOKXtwfURZeSp9a3lfQ08/SmtQQT00ZDN9VUd4aUNuWFhLPlc3cEwoVHdpSVlYNkdkczQ4QzVjamMqVXdVNGUzTk9TKzs1Z3lwNGVECitEdUopcjN2XzN6SXsxe2RQWH1qdFZGREF4LXRqYCgpQ1UmTXchRnoxZyFyLSRKMnR5KT9RZSNua3k7Q2I3ZHlzMVYlRERvUkVsc3F3aTEhCitEKC1XcUFGPD9rcCFxbSN1cGRxWFFGe2pRblZ5SUBfaF8hcSQwUmo+MElNY1Budlk1NihFNmE3Ml8mSjllV2tkfDs2Zm89eTRUNGQ9ZTxLCitRWWo0bnpVRzwwZXo0UEJhJXU7NChjTnpDMkUyNnJTNVVYd2pxZEc8K1MyOHlYKzRyUWYxc1o9UTRHRThEVUBkdER9ZWsqYExkOCQrTCF+Cis7fVg8d293eUdkWHV7MHhmKmVIJmFNWDdWIXorTiVnS2lNQVZtYyFSe01xT0I1dV9nVD9+YWlKJmxRcF9aPkdhZTh2QEMxITlmTjt9SWI4Cit7YVItNlVHJT1fZWFJd0k7RH1sLVlFXj1PRmtwNio4cEIoMStBN31wP0BCNDA0OVd8dG04KHFufFRMVEcjQndwOCM/JT5IKnlsSFY1UGN6CitkY2gyQkJPbyp0cGEtbWU5TGh8MlNAWUVgLS13X2h0Tm0oPV9UZGJRNWVHZT5helFkZjdEK3xZRm9lcGcrM30oeyphRHk+d1pgUnY/RzxRCitgdW1id3JVYjY7IzRpRGYzQypFIWFjfClgTzAhPnhJczVAU1FFLUc/IzhxRWE0M2dIbCFCXmxgcnohdVRRJXVBUklwcn5BZDIwSThoeHMoCis4STRzRFUtNz9zZStjalNvXjF1X2FYR0tTJHgreGxvdExnd0ppS0BwNWdPaFA2aCZ6NSh4K1QoUCUjKE5Wd0Q2QUNzUiR5Q3RBZHMxc3lDCitkYiRoRnVVTlIwNn08N31mc0shQTVAVz0qU0ZudXNpb25RN3c2NEdBUyZkekkqa25yJGF8RT8mJjNvRGV0WmBKKkZUZlQzNUx2XkEyYnFrCisqZWYzYWktOWd2PThpRCY8JitvQ255TzRvRHE7bVJkI2BRdH0jMEZKPl5aMyNid0ZHbVpQIXRoN2NBOzNjX3xSK1YtIzdKUkk1aDBFKUNPCit4Q1dNODNSUiVkM2Q/T1d7PnR6OEk0bz9wdmFWc0c7ejdnTzJnPFlwRDwkSyFLQ0glMmtsfUFkZUBXfUhpSzRqMG9GZ0dYbzFKPlF0TVl4CisodEYtMVIkVDFpMyVjQTBANDE7flMxfl9icFY1fUBOQDNJVT1DS01sWWJgWjh9Pypub3VBeUxYMCFGOClWJiVmQEtaZDBgZmw1SDVjQSlvCis+akx+SSZ0RCt1ZFFEOH42Uj5vbEdWZlpESyNVPkFTNm4kZ016aXhfb14xe05IK1h2Nk1uejtOa1M3cUhxMDFRWmZWbz5NNUpXRDwyKU9yCismeTlGXlNaZW56V3pIajJ5TUNfQypmRUt4XjRAQE9qQlBWO011JlZCK1FZUHZhQkYlQEJuJkhISyhfQn1zdSkpc1R7NHA/VlMlcmwyc1NXCitwWHViOVVFNC1BemIpOWFyV3ZVQGtmNGpYcz5rXj1IRlRGd3kzUys+PCU3MngpUUwkRm1UKVZCKUY5b3NCJGMxRUdqbj5ZdlV7PzVCLWxfCisob21FMSZKLWh5cUhaVnJpant7MUxEX311Znw2RD5oYXJLSCgwKEJ3biYyNUl3PHF5Jkw1M3hASGo1Uzw5Vyl0d0dpZEZuSm42dH4+cXNhCitsJjJycHtqa2FNOTNYNT1aUHQqV2h3eGg0SGBzN0p4RnlCWnxEc0pOJDc+R1VeeEZheWBhRCEzXy1XNWY0Rlk7dkYzb1JOa1MraFN9Vzk1CithbUw4KzNCWTBuSHxeVDwqX2wpMzM/Nm1rNzdHI047Qm95XnkhanA4YTdXPzRZSzs9KFBTQWpXYTQ/O19xU1NzalZlQlVtNiNnJnsqbTZxCit2WnNqcFMtNHBwQHJIdzd2YCMhRkBxc2MlJkExb1A2Q1BsTXxKby0yKlYjeHNOViZsfio4YT9rRUAwVFVhVS1mQGxWbCkyVl80WDxnT0gpCit1Y3l1a09HPkZCa3NLcGx1U2NzM0A7ZW5nNUk7eEBAejFrQVNqNGZ3dEg4cDVBOSo7UnYkREo0Um85ZWYzVTh8IWJSZFN5NVo3eEw9dj02CispN3xFYz5EYylIcUhrNkFUWS1ifUM+V2Z1PDI8PEJLKDtnTj9TQUI3ZihVcyt5dkw8S0szeCtMQip3JCV8SGBfOXB5UyYha2hGSSR4OypfCitSWXJAdGxVZWxoMVNaVHwociVgWCkpaVFjTS1vVHZoZH08byNuJWJ1XmFKNzNfMXdnS0FfTUg4WiFCdGBAVFkocFZ8OShFT3liYEokWXJ0CitxQW9ITjMqdSZAUCRpK0lnJT9XMlpSVkdxP0Y3SzZ3RF5edH1COVVRO3FpbEF8ekE+dn5hSWk3U3VvcS1USVQwQUg3QEZYNCNTLXB5QjJBCis2R1pHJDNraj1lPndjZ2ZAU2BhZEJ6fUIzWCZRMTs1OWo+alZHe2ZXeTR3c0BXcDZCb1dGb29henliNj5hR2FWbDB3e3pOMjk7cEQoYT9MCitaPCtyKyl0JUlMa0p2MDYkP2JYUFJCfkFgSUVFOzlvaVl4JkVXKn1ZSSl+ITVpVUxaZiZgcit1XlN8US04OXVlUVNvQUZIPm5GKyZEKXNFCitvRlMjVFNuZkI7bV57YlU5TCR+MSptbio1OD1FO3pxWEBPeiFZOWw9Qj1eMipabDVPaTFnMVBeZzx5QmhQZ2ppWXR+Pj5hRDtpZHpBVTBqCitaMllkUVlmfk8oYXVeSiY0WmN2YFlqYn56TFMqMCZnZnQmWHhFTCk4eyZ5eGBEcG1tT0NaVXA1aFl2OyhabkUkd1ZHN05zPSZgKEtwbGlrCis8ZF5zWV9FQWplMVA3b0A4V182REMpM0psaGg+fkFFI3JKTUIxbTB3PlRFZXJqYFVxVyEpI3l6NTJUO19GYnVYYkszJiFKcX4tMi1FaURTCitKTWRVbzlwSythenNhJGxYcmx4SG9Rfk1JKyk5M1c/QD97I2ZHMT0+R3JFQSUySW1wVz9oOzRTI0M9ZXghQ0Vzb05iWlcoSk55P3JkTmtNCit2ST9jaCEqIz81XzFnUyooc2dVYHhZU3RhQXd2PWdgOzBiQlJeSTllTH1Xd3MmQXNxJXh4aTtXKWFwPVchQHU4S1UlP3NjdVFxJjVvfFFQCitYLXxhQ2tjMlZ9JEFBb0wrMm5ARSQrbERXTFl2UF8xbGAte3NzUlpEQX54STdJMmVwLTIyVUpSdiUyNmVrbUtzPE41KGJgbFo4THNHQ1p4CisxK19Bemh6dUY8fk5jTkRiMmVgQDYhQzd7SXlnOVE+MjViQUhlUl5nTnJeQUVrbkFqYSpfZk5kdGQ2bkREXmp7PUkwe20mIStDNHs5N1JfCis/akZPJCp4eG4ocmo4JCpSYUVTNWI0ZDxTTHN2cGF3PHZrP0pIMTd9NDQtZndeaC0wYHFNWCZLblJyZitRZXlXayMmNGojTDZzMmFVNWUzCitKMmglbU0rWXYhVS0zQjNKckJQcDt3WVolbWFwaWgqJmYtRVozMTUySDEzbCM2YVU7UispPkdEZ0p3QiVeI1RgSTVGZSU9dlp7LSslPyNjCitkWH1BQTU3dD55O2IzR3EjNCtOTWJrKSUmJCtYRnp1TyUkQTJqcVdTTmJveXtlKkw7a0FeWiFtZUcrJGtpIWAkb3djVkZQdDBWNXl5bDQ1Cis5dVdBR1oyTnMyP0hBYT8qfT4wdmVvdG1RWmxgWDRyfV9lZHc8dXIlVHBtcERaPiNFNyhQd0ZqeCF6JHV3UH14OD9OQFZ6SFhUalMwZXomCis+SVVEQWhCZykheSl0MjBVSUI7ZmtgcEJJMTNxc2BVJmc7fTJUeUBWcj8wKWdNVFZUPlF2Rk5LaTkpOHgpaVB0RG47fFRtOFApaD5ANmFXCitBSzJtdGV5N0R0dl5aNiFQcjAwM3Q8MDAxNVUwMDN9bGE0JW5XV29+M3xheFl8UWI5OEtKVmxRKUphJXBnTWIxcmFzdHZoUlQrYz1Xbl4oCit6cWpUcUd3Rm95WUZmb05KVWhQc1htJm1NM3c9JlRSSVE5MUVmIzNvJTc8MG5vT2xfUSE4RzBGblM3dlMpOVlSM1pfTE14KT18ZkRYeSp5CitCU0d+NzArKUBOVHRAWkFNbmxPYUJAaUE3VWZSeG5+ZnNqK2xhaCtAJCZUeXtgbzhVanB1WW51SU0qaiNzR0d+UTxoNyVCQn4mMiFecWBNCitaSGs7KzY+RGAqMXRhSDBtOU1EY0BENHNPS2A1LTNFNVZuUUQmWDZWVX5KMkJnfUFPNUJOdk9lWFlhMWdWKWRYMSV+I35AYCordEw3QyhRCit5ZSpmVkxVanAxQEVzOERTMT54Slc1UV9ZflElby0yUHdkeU14VmVHLSlMI28oZS1mPHpCJGNSQSlxTEJAaU5QN0Mja1FvMXY7I292biVfCisqeGlZYjw9Z3luYD1RfVZ5T0ptKHArXjh9TWNCfm04cXNjVmojd1dGMmRTdj9UcXRvSjFvNnQrSmxIdz0oSTswV01XVm1DJForJWZuSGJaCituKioodHBlcG1SNT1gR2Qza1dQd3JUTDdmbUwoYkt2bTJXPGQ7fjd5NGI4QnN0eChCbXQ9OG0kVVFKan5DYTt1Y3otOD1Wdz5mRmQrem4kCismV3VoWSU+Q0RPQXl4bDtBUTtjZllrZSlBQUd6JXBaI3pFb0NCZkl0ak84P1Y4YFVhUGo0bmFRWXFQWG5lN1A3JipsN302OFZXdEgqOERnCitZfEIkb05LbDN1dT1hJD9aRzg5Z2ZOV3tiKkcjSjQre05CWk5QfXZ6MCZafSVeVEAkSjJOUDA/MHZJZ3xhVnBYY04zbTFfc1FMODZfYmBhCitOb0Y1IVhfXjVVemU3eHVSPnNKVElaemgySyo9JEEoPUppZjFEPW97NnIkIyNeYTglJXVnOGo0TkxNeD89JCF2eW5meGJ3ISRrKVhhX3hNCitgeHJiZGFNNWk5Sk50dTYoPjB+TlNvKHRDWlRCP15SR3VzZkVLNEY4PVVQYFN3T2lkIVpRTlgxVzYtMXEhb08qNkBHT1hTRG41d3lxZCgjCitIKztBZ3RxPiNjeDM3RiZGfGJMcnt1QzAtSCYxMzE4UDElcTItX21Wc3IlN2k4OSYza2xaNmI0S3BEK1EyJmkwbz9gTk0tZmZWN2F5KiFsCitaKFo+dipnMVc9IypnRW9QZWxzOFR7WWp2LXJER1c0ezBDXk5aUGskNnZuLUthKCUmWXk0Z0cofC1sZzxtJkIqI3BRSyFlZkkwKyNwKDUjCitRT2QmKzJMKXUtOGNwVF5uSXV+WmM4fi1vK0cxTSFvdWJ3MmNQaj5TJmB6XkU3SCo0R2d8QFM8QC0jWVd0U217KSVwfGM4UThOVkpmaDUyCitmbi1UZmh7UXRGcUQ1KzJxVT1VfDRMOXRYQSM2Z1B6KX4rJUkwQVE2PURTPUImJjgpYUElSjQ8aCFtaHpKbVNFWHRfezRKcUp2YDxHcG1OCitzJnFzVDMmKipgZCE3N3ktJmlrckw3RlROVHskIVp5akFlX2sqNmhlSzglaWFDSXpRb3tXUCZpVyUjbmhiPk88R0R9d303SklZO2FWd1BVCis1X3lQX3RPTmRgSzttIWlYR19jaT44M3FseVZvQit6MypDMyZHPyorYUBvTWI3a3BYclZCfFA2KjU/YSZSYFhEcDZGUjdgNFd9blVoIVhfCit1ZHwqMHh2QSRkb1RxZz9NUXo0a19ZN0loX0RWbEZETGFCXzVnd3RYKjVCZklHTG13NyEwfTZaMjZVZkM1RlpGOH43Wm5IM3RVPWB1fGc2CiswM2l5ZDVJNzBRRkJPYWBNaHIoSyhWQFVaaVJLK2Jmc0xVYkh8dil5PCFrR2FXYkNiQTx8Sy0zJU05XyhOeWxPKW1UUHJuMDBfLW9VPkteCitDK157OWhaPV89bDNDfXN8eEA2Z1VZSDNTVzlLdzxVS3xgMylwWHE5cVdFQUFKMGJlfTc3OE0lXk9Ebk5VTTN2OWEoS21yemZ6PW5+OU1eCitadTMpaEw7V3plM1FGRnNKYUpeLX59ZD8xZjdmYitpbHB1bTY+OEtUTWFodGpOQUVfS3hPMk1AX1k4Qk49USpkK2klbnVHRntPcmJZbVdYCitWeTRJa3xqKXdmR2N3Yl9vUClwZzlRKDhLYk14ajtic3FlK1ZMIXkhWllheWB1cHBKVk96R3t7dmB9RWBGYndKMVJLTXdRflp4IVZzLUZfCishUiNtaCZxNllrc0kybGAyYnxQYEFUVFQ5NjNzYXFNO2VzWndefU5CcW1tPyspU209Yn1TdUAwNiVWRFZ5K1NmSHgmb2t2PittI3s8JUVMCitScDVLVlJTdWUjMUdOQiE+NX0haj9VSW9QdTBodjFCeF8obkRman51a0J9S1FHNm50dyZ6OTtuejc7JFYmQntIMCtmRmJIZzYqTThMNHlTCitpKz00cW9jYUc2QkchbD1yS1B2XmorMHFrfHF3fDFfciRNVjMldys8JG5gSiRRTW17JWNNXlFoJmZJQWdpNEEoI2cyNXs/THp7ZmZwZ0JWCitWJlp9RGJfbjU5RVojb0B6ZUlfeVYjbS1GSUZ7cGR1WUN8VHxiMXMoYWk+O3BURFQkZG12eChaKUtUSm5kX2Z7dEt4WGI5aDVvZTY8eV55CiswbiM1Y1FGb29IJk1CQiFeSEQySXJKI3JkbU89JFBxQFZGQDxwbUdRUG5WJSRoJFctP1paRlF+TTUwczFuLUw4bktSbzsmVnY7VVdpKk51CishXz1ke0JLUW1tS1RjVGpJQihEY0VSKU4wa3NWUmdwN041WSh8N2lIfFk8cV4rMjNLZTJBfCEzTiooezBXMTx+N1k1Yn0xMHhOK1JJcGNtCitqdjt0KiVWNFE/RVk2QzEyJmhyYUA+T2pXZFY4MzcxY1RpODJ0TjI7Szs4fT44LVFHdnp+OD9eKW03WmZGKEhtbldrLVlLTntadHAmeVMmCisrTGQ3NlFKJWVzTW97Z3JwdzQxVUp7STV6KEl4fUNRcFNBOS04d3kkZSYjS1QtOTBSS0I1NENvKj56PDV6cXo8R0gqeD1XaVlxPHYqTihJCitoVFhZVGhyJWc3U0dLeT1GPzRTYHl7U2h3X3txKUB8fThhTWBwSEV1RmxSeTxwVShIXyRMOGEwZjN5dFpROWlAfGZaRWZJKHEtLW0oQ3BACitMfHpOTnloTStLbzdVSm16QnAoSj42cEtBcE1Ja085eDBOP2RSR0BsfTNheSEmUEdWU3dhQE48KEtqal5la280X0F4Iz87aExzVU5YI1BCCitVa0lKbm0ocCY8SSNSNyZRQ25Pe3tJQlI1byg0I0BRXiNsTFBLbjYjPSNhK0R2amdseHtFOz49UChhdmpHJGVaKmpoPCZOR3JhfDE3K2p2Cis0KVBaLWB7OXJfKGpBJnkmYWpaRFZoM1QhSz9QfClBVkk8JExYWlkmOzsxWXNjOT1wbU9VUURJP2JoPnBvOysqJiN+ZG52S2lzOGRrQ1glCitLb3Bkfih2c3YmVGoyITs7PHEyNjh4WVlfZERZZzU5OVpIQDxtVk03aXJneCV4OGBMY1p3Vn0lN0JnVGhmRUwkPGFwaD43Q1ImPWAza0IwCiteMCMxRkdANy07YW82JHtVZW4yUi04aCQxJT9CRG0pYUJwflY5Rm94d0M8eXReJmxYWEdxYXhydzNSPiFfSDxBR3U3Pzk8NylvKX5DOWlNCis0dmBgI2xDWDs4bTg1UHc2O0FYTXtZVGxWdzJLMT4yPEVhdUNOTU08VU4lUENmVD0wMGA4KzR2VEVuVHZDQyRZYitBO0IyMnVSb1kyWmNjCittRmA/NndoMkhEfEdaYUwkb2NMaGxkQlMrflN0QW18UXl8LWNYR2khX0NIM0Q1c3xjbEFebG9tfT0kZFYrNFdiJGhNYDYwNHNZMUBvVUxJCitNNmw+cDtpKj07Wm1WSGZoJnZlYyk+PjhUckxoKU90UHU/OG4kMU4mPHtaYT0oTkg9Vz9SMEdAeH1NKT9SKy1VJCphJSNQZy0wVClsUlRlCit2VjtlZX04UTF9RFdNemxfSWMqXzItPSFxMnF5aHdXd245UVFVK1BUbkdkLUlBUUdQbj5IdyZxdmg8KSM1MmNDZ1JuZj5fTzhaMEl7bEJrCitoJVlxbHFlPDdweSFxRjkzQWlDUzdpPl85OWclcDBfQTB2WXY2Tig8NldLa0hgRGdLQVB4O0Y7cT8+Z2w9fShQPHFXTDhNQlI/YkZUbSUoCit4VGBxVW9iYWg1S0wrJig0PEI4Zk0jb1V3OE1oRSFhSjRYIW44SnMzRl47M0NqIzs3ZmJadlo3anlHMm9jdGhnV0dNXktocENaKjZCVz1XCit1OUZWKGEwJWpCdz1+QSM0e3orJEZkTj5ZS0poZW9Ua0BRcnozdHBZTV5gMyV0blZOUyFzND16bDtWbW5+MXdCYzA4MHJHU1hzb14/OT8qCithfVEpc2xCPXNUV2cxRGxmZU5wP1czN3d6JVA+Jmd7ei0zdkNtYHVJVldmaDkxaWBtSDxfckJ7b2YrQX54WHsyKDJfbkhSIXwmXzxeMXJXCis1SX5aV1k9Ry04TD9mU0MhU05XWm4kJS1uOUgwdzFtckBsa2EoSUtaSmkpT0ZTMmdPcE9aTSo0XntBckRXKyg3R3tQayZKPHFmZWRrJFp3CitlJXJIO0NpOWFrV0hBVVJeKVA4eGFfeUpXdkhnMVh9NkB5TnIwbiUkPjY/flMpKCFJOUwzS2lJOCgqI2pQbzMhM2p2YF9qbGFmbDN9eVoyCitoakAjWGI/Xig+LXorVWg5ejlDSzlmTHtAaEZTJHhMVlpgczk0NjFxcURySClRWWA/QGozKV8oKTt2Q1h8a1pvNlp3cFk9PTtwRj53MH5tCisqUSNBLSFWUmB3SWhJZiN5JTxGZ0VnYm83NTJjVGxBJUV9cTU9Mi15a0p8WD51UykzcFlPb0coRzBzbWRpUUpLMHw2fV5VUms1alFKfDQoCitnWU9WcnI1SzwzPVYlRSZSJio9MnRVeiQ1Qz9jSVk+Jn4oKElGbW09TDFlK3hnZihnYjRRcEh1ND87ZG8la2U0a05RKXBfck5WWlJRRClUCitlOHtqa1M2VnMrQXhPfTU1WlliMkA1eVA3MHh6aHJTTyZ5fmleKENtVHdxTWRuNChFKzVAOUp2cClmekl+cW9Dbit5VCpFVCVnWWpGdDVNCis8eSlGSVBROSg5YGRVfUslPFJiTkJAOVBPLUlpMWk4NzZhMXoweF47UzFffU1QXndSNDcyQ3F5eSFWRG5XUUFLRU1uJiYmS0klVSo0OXZaCis7fV9zOVVqT1FRTytoU2RSKiM5dEsrUDZzYks8NzczMW5MX1VBKiNYfXRGR3NvZiFZeSZzfHlWTmxqLX1qbUEofkJecFg8Uz5Zd14+aSFNCitZaDBSYD8lIyUoQHR3cG5SPiMqPFAtI142Y3tETVQ4fk5HSl55WnlYYklWKUxONXlxYlF7UyNRNTtHe3QkTTZocD5HMy07bk4+UTVpfjdQCit0TlN8eytkRHljNTIxclN7Pk9pU2U+Uz9uJD9MQyFUfmQ/VmtEWGd+eUs1KllOVD1eeFRee04jVFBVWnVxaDskP0VHX1o5aWx0WXBJMGxJCit+NWAyVH4mMmd4dnQ4Yk1xLWEzY253YkohZFB4dDE0ZHd0Q2s/Q3xpWjMyZCs2PnRVKm9DKSgzfSZ6MEElRW9YU2JSQnlMLVJ6Q0NuU2RKCispPVZkJkExQm5oaT5yaXZNND1gM25XMW02KnUrT3V0VEFDbEFUcDY7WU1WS2k1I3UmdVNNUjI/YG0hPkkmYjd0SGJNIzd0RFZ4bD1Ia2Q5Cis0KHgydzw5JGRsbz9XMUA7aHtyakBgVmUkQ2l3TnpJazVkKSp1fW9qYnE1WDZXNzEtZGJ6dCQ/fUZyZm1yc3RUbFJkbFMxbVVEd2lnM05uCitrPkIpKGUzWHVodnF5QCpHZSM8Yk5AMTI+K3w5TXNXaXF0YntvRnZNbEF0O1Jrcz1FcUA1Yn1WZ2x9YDElQ1dBYEFEOWlsSGVnYSlCeEwzCis/TXhPQk59QztrJk9EYS1ZNXRpYm4oWT5wU1lQR3txYlY2d0hxRnpIIXJgLX1EJjMmYnkwYEZSe1dmZk8pWkJlbzI0QlAleSF4UUshY21WCitBZGc0SEl0YkshYllGUiZpR31Je0s4Jk9uY18pXzBeIUZiKl5WMXUhelNPYk4tJmQrNDg7QzhLREozNV4jYnVHUyZ8QikydyZyZ3FQaGB6CitGMG8jT2VyMiFxPTVwZmZZOXYzX1h3Iy14XlpXMX52ZGFpeFBBPyhKXldhYHo9SGc5cU0meCMrVUZUWjZ1Q3BLV1JHM2BFT3UmaD0qWEMlCitMelNucVZAVG8pNSZfJi1xczspKjlifCNAVVV3b28oO2NVcEAzY3JNK0khI0F6IUQ5U3VpMXhnRFdkTyFnWnBzPE1ac1UzXm9ieUgoeEdjCitwWkdlRURoRyZVSytpQWJ4NitJOG5AfGsqKDA+cjBsUjEkcVFWfHZZP0xiSCQ/QEAkdDdWbm1HOEdyJT1KKmJPUn1mNDVVQlIqQitjSW1yCitSbVl1K0godFpnP0N6SDV0QVUjfmBrc0hCKGt6d3ljZ1RlPSVAdmooUEJkLWJ8NzhYPV5hUTJ2Xn0mWH18NFpsQShWem0+KDYzK2wmfjFfCiswd3pXYmViRT5FSzhkRCN3ekhVeGRIJm09SmY1KlQ9bSRKd3pnQD9pRUV4bHBIcV5naWxiZGFwdERfezY/aG0wekkkTGUyWks7OXJBPjkzCitKXlEmJipKV18rMnszKFRBQSl2Oyk8R0VkM04yJEpxaj9xZT9fbjskJWM5WWolIz9AYntQYGB1P1Z5TFYwYmtYJTtGakhsJUVheldNd0hpCitldWt0NXttckRYZT19Y0M/XiRaPml6Ky1SNTkzWmd1TFVxPUlnSmdlVF9zKHFIMyMheSg0dnNUeC1ze1prZ083TE0ySHlvMk42TjdxfEVNCitpUFEod2t9bzFLPEZjPT5Ofj9hc001dzI0V0xgQDl6JGowamFqJDhwUFV0anokb3JBc2prN3ZzWGp4MyZ2PWNZWGlGcGc7fm8kakJERi1eCit1cEY8QyFteHdSaCN2N3xwZmRYTzdjeUsmKTc4Y2xxVikte2EqaHlQc1d5JW5sPDskX29RQj09LVZiYS1QWGU3ZzZGM0ZMaSNwVVA4QDAzCithPkxfMHwrQ3BraXEmSGFIX1EtZitxKndJVUh6UjlNLXpidFRTUChDPkxGKlhyeDQ0WUZIa3duNSFeZlojNjBLWF9lUmVRfD9SMmpwTm1zCistfV91S3pkWko3UU1aT3w5c0o9NFFCZmx1ZDFBX3ZoTzZGR2FiaTApXzVAJF5xX1RTQCZKUCloPkA2YVdBSzJtdGV5N0R3WCNHfmxQSTAwCiswMTcwUlM1UzAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFErdkdBP0MhVyRlOXdVPS1FMEk2bkkkJHQybGk3RHpEczRqMyNGKWFVe3dUCis+PX0oaEEwRlZWcz1SfTBpUEpSRTQzSkEwOXlpeXZ1aVVNKSpyM0RTS3JmQ2l1UiN4LUBfaldSPjU1c3YhR1ZfVktFQlRYajhxKkw9NiY/CisxdyFVfiZZanMhZzN8aWxfdylKd14raHZ0PWlZT0ZvcU8pTj1pR2JGLU8zKzYjRiFYe0Z+Z3MjR1IkNV5geyFXKGA5QWBHKl5+YTEmQWdjCitZPWdFNXdPYTQ2aDdWblNOPWRXd3skKDs/aXtXJDtqK3dRKm1DdyVfRCs+emZQK0AxZlV5WXRJI3VGQylNUHVBUlZaQnx4QmZuSjcxe3k0CitBVl5uOzVOZTx6PjFWKTJkZXVHKDB6KmlHTGY3QjhhanNmKntweVl2XzE3Z3RpKTJOcWp0e0EzK0lTQVVQQkA4dihiLUhZV1YrVWp5TCVvCiswTmleVUR1TVI0M3YoN141TjZraWpzMmZ7JE5vYVl2QFkhLUBlTjNtNyZzT2JUUDU+NGBWPHE9NiNzbGtFbjtwUUQpcUI1ZC1WZTk/Y3F6CitHOWZVNyRgQ0BQcjFHWW5HWUc1Y1Vndk1JPzZFUHt9SXheeE1YYWdvZXNuMCFMUX0tKnU9eHp3Xndmdl9TSE5iQ1pBemVVKSErZUh2VHE5CitueSZZSzJLPzxHNGhRdSp1R1BTcGdWJG49S2BabjBIe2Uzb0htcTtCOW0yRykmfVV7anl3ODcyY0AxfjB7UnNlMCQ8fVp7JVVmYyY2bUclCitnZC0odFZgK3hKVlRKQ0RARzZPK3VfWnYkWSt2fTNFVXU8TDwhNU1UflU4LU9TMktxMGtzI2dVYjtZR1N9a3pjXmJpd0FTRzFlWjdldzFYCitqVXI5KWlFO1VkcHhXMV9gcFA7OzNoNG8wcip4QlojaWs7WDhHQlQkb0UkJEQmUnUpTj5KP04xNDFtb2x6cFdOe3xWNWVWXylVZEFYbi1PCitkVXxJVWNNcSRXRkV9OTRzczlTS2c3TXQ3QD9YdjFeOU0+d3FlUSZWSE5mVHxFeFVrUSkxPyMlfVQhKU03aHFrOCtRTVZkZ3VTV2g3ciFSCitpRHdMM2pKaFkxaDYtRnJAe0wlJHdeWkIyVUp4JlNSaHEqTnpTLUUrR3ZzKjw1Z35lalUoN1E4dSUrX0FqQiVAaktHcHR2TWBGM3lOT04zCit0b2ltUktTQSNIclBLciktI3o9Wit7aE0yUDBzalpheU9KMjFBYyhCJDcqKHlAaTQwO1hPOWUoR0VEYntuISktS3djViFHPUVqUDgkWn1kCit5NF47Rjl2e0NOMWgzdExZcWFwN2E9I3dPTHh5WCRlP2QmUmFfVmBrdSN1QDtBT2x0I0hPPk9gQEt4QFE8R1lXO3lMWlBHWj83Yz0/dWE5Cit3S1JsUWJQNzQqcU5WaW98ejtAaWZCYHI1ck1QYC08RlU4SHlrbWQjVl5Sd34pYHZpMFNzQWZldHFmPXtja043c0wkbT9VUjY3V0R8VVQ2CitUOFZ0ZkU4Zm1iPXdsRC01fUs3MmBBZDN7VzRDNTk/Qk05WV9iPWZuTEYpPUZVTlljJmNEMW0pcSpKMFl6ZFB4IXBVVmxtUVkqX2M0JG81CisxPyF6aG5DKE1afCp3OUI8Uzs/PFMlR3Z1d29XUSVjZ29mUWR6LXhITWE7V1glQ2hhU1k1dCNAWT58XnJCfHVCKDt5bSh3VFBQd3RtfWpuCitDeyFgcExmJHtudHtSfUwmRCNvRWEyZ2FiT2ljflYkIWpAVCRteEJIIW9BLVFXSz5xP2hReWczN2RpaVpPOCpqSEZpb0J7NlRwMUU+SW9NCitsdHwyYHpHRXM5dTd0UXV0JE9kSjh0dEVRTmRzLXJeVX04V14/OW1kfWwwUnZRMXZKc0NCXnRicUJPT2UldGwoRFV2dWZeS3MwKURlRnZrCitwKyRLISFQXnIkPkVPM2slRThVJUJeNHFDIWhQPVg5bEZ0SCN1WndJMG1JeUdLezAoX05XeUh6Y21xbT5LT29xcHpIJikzam1LRHZNbmZvCitROFhvIV4yMVNxNkJRT1hlSlBGdDQtI1AhJFphR0JzR3YwXntLSkYhZ30jTm4oNW9LaTA+KCRnV0k4WWFrPzgwSVhrcWtDTVQwVFBWPHIxCitwTnJEPDdaRkBrWlg8RCNAMzdUcl8+ME9aSn5OYC1WfD47QnkqMzFUJS1tZFlAd1FaRE9HR1UpYChHfjR2Xm1rMEZNSHw5Tko3fTFYZncxCitTSUs3ckZ0O1phOFlGeHNKMXRUWHUjbWN5bHZiTyYzUVIqODk/dHQqR3hWPXNvSEs8dGB8XzAoLXhNKXF1MzY/SGAlSDswTDwxZHcpdHhaCis1TjxuYSlRTEZDbGpCbHc8K0tyR0peVnA5cCVJJDtVRTEoc1c7UChgc20zOSs9UUw+QHxlRSRuWGlvX15DaVhYUGFeXiM+bEZ3aE5RU0RWCitIczM0Pl5nMUx7PWhHRW1DZUU9MW5FXlUoOSkmI0ArM1o7a3dwSi0kQS1id3R6b0VaKSp8Szcmc3l3STZFdVFaZFNCNTsqdE1ZLXlPU3JZCithY2R4cmtNeUdLR0Nea0J7fW5FK1U9SHBjQj4+dllvVl8jWFAlY3A1eTBtNnpWMHZmU0dEKWcxaGx1VTtHNVZfJVlDVCNLLT0wOVVtOzxxCityUH5lQEVJTWZFNGA8Pl53RV5oUVF8aFBRbkUyYUZwKGp7KVE5LTlNKzhFJU8haXRuKlIhbWtTdjJfQ1otRWE2eCk0PXY9P1EhajQ+VSokCitiUnM1MCNaVGJkPi1iekptOF40R0VDUERoQ1N2PklmTHhrR0plVWAoRmFwO3pNZUZVeWgyRnlPKFlWfCMoK2Era0FPJWswSmZrRHsmMEwzCitNTi0ja2VCOy1MdDszT20qSTJ0entHNmdaOEMmKnZWeTIoQm15WDMlbmNZY256ejd5SmBRWCowKm5XKCRGPSMlIzQ2bzl6aDlgYyRRYEIwCitJRW9QZzFNRF4+dSN3cjMkdDMmeWpOKlpgfnxLOHlGcjdxQnwjPHBPIUFRZSZxckItZ1Vga0R3eFpSTENKYWF+TE1kajBXfmM3RExiJFFoCitvKnlmYHpVKHUpS1c7MTVyRnIzbStxUWpsZ3dgZ2A4UkJaa2pVPmF3PjttYEs+UnUzO0NvYlMpNlltPTxJZlJ1YHhzKlAxa3AySjFoclFjCitOTXZkTihmZlQqJUBgPkJDTHtoJUZqRT1PT1FXO09ZST8kd2AoR0BOfHpPWjEpZWRBXnBBcEtON3FTMzxWZ3QwWkF5VytpTlVxWjNQSzdRCitOdGF9Y2xuUjdsaEpLYHh3LUFiZkhISD1nJVNGOWhaQmZ7SWB5MmQ3RiQ3YlV0cSZYKXk2Y09ySm4kMTgzPlBFKjhmWEh7Kkk5V1pPSk9vCitwJj1vfDtiQ2FLOWlRVT43PHw1UEt0NDJ5cVJJcDZFcW5+a3VQPVljT19ROEF3TFple1FFOTRiQmB9dDklN191UFlrfEhkcnZSYDZoNWo/CitFcnVZIVJRRkxaNERpUTZOVlY5a3Q+TX50OGRfJEhEaVY/cCooYWc9Vm9mKWY4cC1ZaUVINlJjKmchRzxvdVNzTT9pIWN7Jj9VMikzaHlpCiskaEdzdkBhUzJDfWJiMDRJQSMhVXpfVD1qYVJCcF57VFl7eXEpPiRQKilSPl84dkBEcCorPzBjRHwtaUVJeURpQFluUjQpVWslTUotNTR3CitZTjI8JCEkOUAjYipaSUpQfSo4PEVlP2JkPHpxT1gxNnA4KH0taE9MVyp6ZmluQHNIKnZuWTFsQ21BNkM1dXJFPVpnby0mRjdrY1AmU3xUCis0YiVhSTYoQnRGZnA5IVVIVjJ3dS1JQzlYcEdedlhtTVdYbSNKSXx7X0JQJU9NSDsyK0FeVT5uYkwkfCg9Q0BiYkxVaj8rbmh6Uk9OZzNqCitnUGEkcS1nRXxaQUFgXmhwaEw5QlBwU2A8Yk83cDtLc0MobUJgUiYzKDtkM2NzKnQoMXluIz9mR09Eem8wU0I7Vih3JmxDa1RvKyg+MnItCitIQW9Xe3smJG0kfmhGJlQ7MShwO2d6MUJsWmloVm9ybm1jYm1mPWt7PkpxIUw8VFVoYF47eD5aI1IhX1pNJCg3cExJeU8jSHNBJGNvVkViCis/NFY8MHc1M1pSQWJnMWIrK3YhSyFibTB4RFpCLSVgTlpQUFgxIVZDZyU2M08reCZIQTZnTHhaekV7S19td0wxfSM9TkVmUkNYTlJOQ1d7Cis1UkowNXglVVprQ2J0JVZFTjstNkZENF5MLT1aQzFZIVIhWFZ+NitPJnU4NlZtYz9EUUVsKHcyITZ+TTQ5JEZwZHthTF9Vd01QVmp8cz1ECis1VlN6aHMyb31xVCVmTHUxUSFnZiFza1ckPzF2fXFWOT1SfFdHdilwYX5VVTMoTnlGU2Q1S3hzV2QkVV80NiVVWihQKShfPDVGI1pLO180Citaalg0YVQxSm4ybEA+ZWQmJTk9UE5WIUdETExTQ1IzcWB5T3w/TzAhNXVgXzRHV2J1Tl5UZEk3WjlvJXJPcmctJTc7WCMwbnlTZXt2JTtfCit0KVNiIX5xUnZ+fUh2dlBTSiRuUSM4KVkqZ0RES0tqUDJUK2o/I0Z4cUNLI3pQMCpZWHVJdkozWTEyMmZ3QGpzNHV1VXg1Z1pJdlpzbEF4CitgRkIhIVRFR0YmcEw/OHNtaUAwU347b3YwclpOanMqYjlVZmFgZnRKdjdYQFJNRSFVYmZZQyU+TXB7YlVFQXlpYT1PTmxPcV8yNmRxN0FfCitoUGNXZVdPdjEqcSF8d1J8M097IXp1I21kWDA7TzNLUG9JJnYzNCtGKnhJZT9OPllkbD4jPzt2ajlMYWNEZE50Jit0Pl4lREMhYHctfSYlCitpJmZ4OCZZcitZRV53OEslMCo3PlJuKDZmTDMrZTchUW8rdjtUbD52eGhFVE9KcTIxRmRrfj9QVEpxJitBPFhWUiE1Wl54Rjs9QXVSLWJOCitNZWZ+V2dnJWU1V0VFY1QlYjtVdnNLZlBHVTZSeDQ5YjVPYikzeDheY1IoTVchYXY9OSk7WHNuI1dZYzlLa0lYfXtTVkNPcDRXcEwjc0xHCitOdldKTzhRUnVxTTFgKVBsMj5MO14tPW5FTnROTFApVis2WGsmYFh3fj1PUlZ2dlJFckJgQld1NWFPSjQrdipxVzdXKUQjRTt4eGArbHRnCiteVilMU2d0KlFYfWdqa0UwKzgjTSEmWjt0K25+QT5TKzFROWUkTDVBZFZxQmpOS1lAKihsI04jVCFFT19vUUl5RDJGekd2LXBKeDNwbFphCis1YUxDTENfcVRhLSl0KDtmXz8zSWo4fmRyR1NvdENPKElKWmJgUTJBcWF8PG9vYUR5cipOZip7R3x7VjlATzRKPUMqanFwJjdWcmNZNTUhCitMczJ+YihxKHNrbWNIeVJ5TzJjR3ZjMCQkU1lQYTkxejFpRyErSyFRS0ckMmhKeCo1NlRBTnpSYUNeKzkkXj1+VmUxQFF0YiluTH5MUiY2CitQbFRqUE16ZT54TTtscWh9WV5qMD8zfHpeNjBneVU8dW5UfEEpUjF9eSlCPSlDX3RuQDE4MHZXT0RsPSV4dElSJF9tN0R4KjRrWnh+KnpGCitOKytYWmFDMmJkY1JuRk98UWt2VFJNTVg1Q1RXPiMpNWR8I15WPXs7Y0w9Z0tEIz17WGVIOy17MHNwUWlTZi1DJUJsKEt1Pjl2ZmU2cEh+CitrPChGZjNlUEtoZnx0PGlXV2lqRlRmVilINDBZSGhvRiUlU15PMF9IJWZeKmN2JGhpP251ZztGIVFwdUlgQ0ZqaTBxflMlPz5nTyRXamtRCitsT15iXyRSUFY1U2U1WHQrZmJoeSUlKDIyQVJRc1E3ekh9USZgQkM3cVAoTE9veD44cmEyamNOcC1SZ1NTaWwtRXdiUiZvWmBTN2whTSYrCitlU0xjMG4qISlrPUZsfTZNckVUX3pTK19uV19oK1JqR0h2UE5uVnNrRTU9JlFKUWZMUzVISkdTKjwqNnsqUjJCUDJ0OzNtTTFNWW1RbkhmCis7TmB8NCFCQGJzTDJXRG1sOVQ7VUEoI0wqfk5eNE5nIUg/OzxwbmkpR2NQMnhwQ2V5aUxFM1JCXyoobk5FVEIyNHNtVjJrekB1az5rSEF2CisrYUE9XiM8MHlFaEZpYF5Zb3JwOFRkQ188SDZZVyQmbFMrUyFaVjNnNTI0Z0FRUkVUOD1oYzJoYDttZ2dZfnZgT3RJZCVqMXg7UFRuSDY5CitrQllgTlRhTTR3a0JRYmRJflF5UDIxRV9xWFpFP21FLThYM2R1Y0UzNjl7Oygmb3E1ZUpPSTJla2l2ZGpIKXo8QyZ5T28hYFdRbENFUm5WCismNTw8YypKKjk1RDBVfkhHYEVOVkhxWWZzKzlHWFRTUmAybzZMbit3O1UlUzc7SERgeWJBWit4QFN8Tm5HWENyc3huZThBQ0VleGkjV2ZBCitDZSk3eUU+bXd8UF42PEJVNTZjPWxDSlJ1NnpOJjJ7bjc1ZXokUjtVdnMhbnZwbFMhN01UPnlPVXlGQCpsWHJSKC02ZUM/O2UoQypSZTJZCitSYig4VWY5VFpFdEt2Z3dAO0JfUDImfD05aXhQO3tUVE1MU1YoNn03JEwpZj9naTtGXz50UzNQQDZFZlh5cDg8cmQpeGJSVlJ7anQ8TyR6CitTJUArcSl0RDZfWkVnPmRzO2pLTillO3E9UnlscEQzPUw1eSVwK3s/b3xkJjY8dDtvQEN7TDZ0NW5SZCRqIW5KOHw5RUkqI3FWKkFPV2BGCitlenZFVEl1Kz83JGpAZXYmWik2WWdidzxIK04lKndtPUd3P2EjSEpkVDNuWT1HSSgzSD43WHs2TDNkJHAoWlhyQHlhOXE/MD1eIWU9MEp2Cis2fj5FclU0T1IpYjwlNWl0Wj9haGZBR1JmTzdoKmUwWStqVStJKzdRN20pe3NWPyNYRmt4YlZFWHVYQXZyQV4+YmdBLWBZWjtrNDh9U3lBCis/O3hgQzZvOEEzb2VhVzw1V1dNS0MyZEcjWDl3QWsySUVGZktgJiNFO3VmSnd3PnFZUW43MVImMFZCJWwhRG50YUp8fWVIYX44cDhOaGR0CisoeDgrKWBfe3VXVipNdHJsblIxSDBybmJ9OUhTZmFmQGRyfl8wRmote2ooIWZgPHtiPXQhd1JzJmc3SC1Baml5dlVuZ1JhWGopXjxeMGZXCisoJFpnezRmbk5UI1BDJWNwJHF8aSttRGJObUN3enRxQXM+VypXSXZmQjg2YWgkbWRPamktUkdoV0FHeGhqVTJMISNpa3l3SE4hMjFFRjhECitZRnd3emRsaUxoJX1TQzA4RW5fVzBPUiMmKWE8VytBUjFRZ3g0MTloYSlSNiUlZSRpMVlHISspZmJWeEE4P3t5bigrYGpCbih4QW9yJnZDCisoRzMtJFR3b1EwbFJzezA2MH4kWSR3SWFldUkrIU8xYzRPVEU5YC0wPHMtMF8wLSFCYVEraHo5bFVxenBZWiU1YUczTHRoaWA2QU5RX3I7Cis1Qj9HKkB+dEF0PWxzM00zclF4d3luPGdTbDA1enprITB8YkxEYzJ+K1lRTHg8NlBoXjIxaCFNNyElKkwjdjxefXszIU0rRT1MZ3U3eCpLCitNY2ZAe0EhTVlKRl84M2h4YSlFfl5Qd0Ule0hVTGFpZUFBZDJoNXBBLWNAYFZ2aktDKyQlfiRSZyR1MGEzTVV1QHNEKnpBQnM5Y2V4YSlCCitgYiY9K0FzZk5XPngyZylLOFIwVnRVOXNUTlNGeDFXLSUmJU5lVzJkSDlfYXxafD4zSyNwemxxOWAhdEpIPGIzM1QkaFpTUkhkdmVRKzMhCitJfGpXO2V0NnBUenh4ezhpZXg2d2wtMUs5ayR+NmJ3MmtVOEp2bVRtYmlNI2tTTnpBUS1fQ0t9Y3B2QCV7bUZ4WEhTNUomVFlqd3EteXdWCitBKVZnZVhNc2NPPHAhTSpeMD9WTXcjTUVeUyh1c1olOEpPNldnKmUqfXgyOzduX1FlalU+MDNsMDslZyFXaSN1R1NEP0M9KWA/Yik8cnRZCis9JDVnKklndDxZd1ZLal9YQntBUlM2SmpxaT9xb3MmNTxeLSh4JmxKZ19ZX3FLQzU+WmE+fHRebHU3Q0s0YmJAdnk2c1Rnans8ZHZvdlBZCitnQEN9P3VzT0FSRXlOZEpwbGA8bmNhSjgqPzJHSzUqMkZvdnNhcUdzQiFFKD91cjtWZj0wLVhQbUxAc3NhRTtwSFMyS1UoTHdgfF9rPnd2CitZJDsmUExGWD5fXnJ1cEVhNUQ3WDlPa2pjb3s8U2VTZm8xWCpPY2Q3U0RQQT58d1k4b2p8PHY8IUlqRGladDw2bDVRbiUrTnRtb2hGMWgrCis0OWliP3o+eEwwVjw4VSpKYkstJH5WSmtvPUBvdFRhaGxIRDB7Z3N3UzQ3T3IrPjJ4Z1Z4dE01YnQmSjBpSmIxYWkpZjlOQDlLQH5BUHVBCiskekBZRXYmK3oxZzJHeUMzWTBncEdKUGdfPzg2ZTJBfmdDK2RQb0VmfFFNRW9HQlA2eH5URE0lQUtTQDJrdE5pUHZQXj9jNj5oWkU8U2YzCishUk5sV2E5PyFXcWpDQlFjRzFAcGh2K01Da2lNUHsoYnBlZWgxY1RgMkQmZEkxMitkTiV+Qjl8UT1feSNXUyZ4aFZBX3JTUW1fKlBLcSowCitObXQxTHU3fX1QdUIpe31BYSRJQVFMRTNEVyN3TE0kdHBTaSZeaUYkemZXdWVXenNtT0ttRT11RFJncCkrYG4mJU1WNGlORGstU2IlI3l+CiszQCUxRztVMSFgNmYtRTcqZG92V0I/KXM5UUd2SHluVnlrIWZ5QEU/aDQ4ZGg+LVk9YGFVS1IqT3ghSCs1eCZ0MjFTQ1JwKmdjeTdlVFkrCit1JDI3JT1tbkEySCZ7cklne3hVM1FLQSg3NGMqVktLemtNbzRyUFVBPEhIIyFhUDYxbVlzKCNZOXhVN0c9PXxFJUZKamg/VlJ6aTYhXnBOCistdVlsU0slIWMpIzx3PWdhNXAldVc+TUkpTEQyNEIkcExmckxfZ3RBcDh8fVJKbEVyWV81MHErZ143YGNNeT1rZnNnNyRDXl9SblhaTTtOCittQGd0JWNDVjRMRmoldCtDYT9WVytHVUEpXnp8bz9aZVBnalM9JWZ1KDw3KDBJYU5reWwpO31fUVImTiltenF1USplcjklJSt0e1JyNTNyCitJKXhIYngrc1hEaSU9SD5HaFZjKHA2UkUwU1VKMHVpa3Qofnkzal9TQjtFbGluUj8xODYmazJeQFo8VTxnR04+USV6K3VvUS15PktSUkI4Cit4PkhhV0h+bEFVcTY5Y21UY1pmYUIrekNjYkwtaH02M1NgKnh+MnxwbSlAIVEjPl4pNzsyQSQwUT51LXNnSGB9IVl1ZmJ2QE10QkpWcG1oCitaKGt4cVNpaEpscS1LPFo0KT1tI2V1TEZDR000I3t4MHI1ZCs7aERfJnZZTXx3NCs5RzRHfmY3UFBwJH5keWRPSWtKVmwyJkVYUiZ+bzJFCitPYy0+PGl2OXt3WWJXe2BFUTFSVWhKRXM2cH5fTmtUVVZ+PlhyZzQ0MFZwWXEjJjwpeG9nPW5aX3s7MjhifTs3bUtDc1RxXlVZcDZ2LT1DCitmU3pGK0JkQGNGMHxVR3IlOXRzaEFLPWFRdVFwczhvVmcpKj5rQyNuNkl2fCglKitVSGNANVokZylGJllBO1l8a1Z+aWhWQFMqSGxeQntgCitQeFc1SStqNmt2R3pFWDI0I095XmwtVWp1dCY+YEMpYXQlPnxkYzFrK0kqWW9fczs8aSteRThkNG1jbD9jQjsjSigjZnd4IUZ8MiZHZGUzCis8RW87PnhRWChVJCVKWVooMy1KVUE+RyM9O0pqQGYhYHMoTiVLc3ROTEdgSFVPfS11ZDdINmxAXiVGcj0mTXI/P3lLX1Z9M1AtbThsNjZuCispO1c3elNGM3I/RzFiKnlZUmNuMzMhcig5MzZtP1Jhcm5NKis9YDJlKmV8YWR8WW4xOXpxNmFCPmU1aDtXPiohKio7JS14PDVwdllzUF9DCis/KURVJmIxTmx6YmojU29CYGQpUDtMdX0xMDVTanhxYS09eT18RTJIOzUmO3Q8Q1ZgLVE/TzdaRDBHQz47JCFsUGZabDFXV241ayUySn5TCitqN2FSK2RiX0NEeEp+MCp4IXpNcERRaiFkekVnbTRzWWh4UG4/eCkqZ2pAcTd3UFF+WmBDcV91I1J2cUJXQHQtfG4rI2xzK1oxbHtoIzN7CitOdClUQ14kJF5DIXt2Jjw8d2lLVW9ESU0jJktfdzZ4JHN0cGd2IVJfdl57Q2lwd2hOWXF1MCZoS2w4NUwtOHNvKGA4OVNmJGwrVTI7IUtmCitQWTZiS2FGKXpBbFQxeGlOU3ZBS3dpVGloUCs2fUxnbVNeKEpWZlZCTihAVGlnRl9PfHQkb0NkYGgpZ3hsbVkjKFNpQmJHZFpee2xHbiQ5CitYWUNjRm9nanZpS09mT183VlNJNkEoMz8tNyhtLVo+OSFuSS0+O0NfdjU3N0lHQSlFUCl+N3tKMzRScVhMNGhQVX4tUjE3MipqRmtBcW9JCitkeFZHdUo1eU8oTklzdz9OYVRMeik5WSMmaG4lMWFSTWNhY2N0MT5RZShVTHI1VkVaM2t7M09fRz59KFAyKWRAazlxMyVGJmxYUnFORnRTCit4Szx1VUM1a0FuSnRkP1JKS09uZUVUe0h9PFpQIzwlQyQkNy0kJExEWVhBcSRqaCpZQHdTRU1zeEg2KzchcjV0N0s4LXAlY25aKzVOZUFjCit7MW44Z3VuJXQzM1dvOWNRVHBndm8jYHl+OWMjVEQhNXZYUCNOKHFxOHFtSzl0I3p4NDtLbzs3dGBXUzUrXn1xRzBsWj5WMkM2NlV5KFI5CitNYzVKfiZTUGx6QnQpanckLTU7Skp9XiRvYjxYYkx1NmM0O2M7YDwxTlNAX05lJHBoMElpI1E1bGpGWCMhRWBTb29kSTBvZ1NlIzd1SGFOCitNNDc2V28yNDxGPURFKG1wZlBYfWBldio4LXI9TTg9ZlUlfWZMNVB0empVYSV+RGBpNndZfDB8e1MxT1BVQXo7bVBARDFDYU9OTmcmWjJVCit7U0JSMEFDKWA7N3AzfVhwaVFfZ1h7aEdMNlc8d2VuKUZnc2VWbFUkXnwxYCooWjQpZmRaPUI8T2hqLXlkQCE4RWI3RGdtST9fRFh3fT5lCispN3w3ODVQaV8+dj5Aaj5SUVJeZmJvODhlOHgmQ1pld0ItRzJebjEyPWstSjZlciVUOEwrKUZjNWJ+Y15jVm18IT8oU3NWIShNQj9mJGAzCitQMz84RENZRGJ4TVJyb0o8RkE2Qz1ZVkomV1VUIzBqbXh9YGBVdXB9clN7QWl6T0pON19jenBhS29eX1BxK1NAPj9mJnJ8KzYlMWdTdEVLCitoPSR0dU1pRD9JezR1N0A8RXNhMTYtb243K0BOQHN4U1V6Y2c5PVgyclg7Vzc+RmxYU0VUcXJIZjZHSWFwJHZAa1JkX3ZWSSghPCtKdzs7Cis9ZGtLYXY2Kk07UlpeYDRubiFHazZsKHdadDhDejZkUHhhZzswX3pXaDJqUyZRZWdINlgpPDFzMW4hSXJ0N2Yhfm1pMXBnV3pqY3pEX210CitlLTgwUXBBYzJZSkpxOUc4c35aMj9DUnRqNWZ6KV9eYEU5VHFuPD55UmppaCZ+PjQ/NEdYWkpYIXZ1THJAcHhJUV9pMUZCPi1YJWJBQSZCCiteVGQhRERBV3wkJnJubVV4YyRTO00pfHx5MzBQZ0BVOWI3IWcpSm0rOEZiciNXbnYxWjxwKjE2ang+OUN7cT1nQSNNTElJWTR4Tmdha1kpCituKzZUfTQzfjFiU2pMYm9rT205UEA+XzsxcDBoaVJPKiEpezFSaStgRThhVFA3MFl4VlV4OVY/MjtsdTtPKXRjVExIdD8wYlZPR2NsbD5KCitJV1ppKEN7ZW1ZNXhoVHwjV1BnNn1ad2JNK0BFVHdgVip+K3cobzJsdilFVm0/OENlRHZxeTt7elMmYldEej5nPX4pKiErTylxPGp7T3BsCitDeXhOYVp1Sj8kb0JHPHxnSHl3c0xjRztHfmVePnNfSF8xUSk3KD9jK2pYPXhkaXduc0hIOGAyXykkcFhXKW8le0NQJk1WY3FaalJLYjlQCit9MFM/TmlhaUB7WUlQazhQRmFqMUhxIUgkTyN2VTdmanFYRk45UCY9Q0Qjd2xkVi1OPmtkYjdOM21DMT5eIXohV0smfjVNeElnd08zMyQkCitRPHtNT0hjU0ZpZSttX3FgdzdmS3lCMkFKb05fbUdQSXlEeCR4SWY0akZUIUN8Sjg+ajtuZSlqV2tvSjJPRTBPbDZ3Tk1idXUoSUxvZmlICisobUtONmNTZ3FifVRvQ3U0UmFKVW0xYWoyRkNRVVc+bk5+QFM5cmhCYCVeUG8jYD4xd1hKYm9BTk9lb2Z6aStFMXM8fD5TJU5wKklMWVI9Cit8cSF9YUdVNktYTikmWnxFZnFCfTJBd3FMczIrejczSmdAVmk7dzQxMlhfdVM8fU8mXjxWQyE1WTAxOzthWlFvPEw1Ul5nSDc2fitWVm1LCitoI1VAJGErSlA0Zz0mdjsmRSN6KEdFTD13NDNqeFFLaTFYP1ZhVnpOeE4pakFGZVJoX19DVHRnSWNCWEZ6QzZjTjNKSlluMUVVV0hTbVEkCitXZjNHQ2lSdERhUX08WGFnI0F0K3slNnM+WiQyI3VOZkNZUUBsRjVDMlp7bVRzQ3xLeFdzSl5zcXF3YVcmdzZhWTg8fVBBcjlUP244Vmt9CiszYE05THheWV92R0NrWHwxeVhmPzArKGB5cjhnfHsqQS1XQCFVenwrTiE1YCk1czxFb0RRO3dpb1poZXokS3lJWk5pZH41S0AjYUZ6JkR0CiszI2N4dyhwPHs1RCM3OFRNQm5EdDQ2JG5AWjM8N1ZHb3V8bXpHdWxZfWZ1WWkoZmdUWjFYJVEmendIQlp5YXFpYjtYNWB1dmc2NkxzNVImCitINWBLQV8kKFkpa0B2JXBlUHU9ek9mPFcrU012NDhAaWFDPTVwdEs8bnQ5UGElWDJMbFE3ZFglYHVZflpzej5Ud1U1YEJ4QVd1NDIlZnU2CitiWn0zVUlHZTZtcGV9d2xWMWxEVlNYOUB4aztAPnNCVjAzVSVofDIlTkFlQEw5WmJhQUBBXiMtVWsrN0RPa0RDIWtDJjxkSFFYKzR2XlhECitYQT94YCtFPk1Lb0cmMXc4NnlfZDl4ZjxlKGNMNXBYMVJZMiUjNFFqQC1+YURFS1FiVWp8dmhYY01QK3FFSlkyO1lye0B4V1lxaktaUlRNCis3ciN0b2cyfD8yTzdvTzc1Mj9WVU9ERHMrWlhBTFBhPCFUfm4xR0pDZ0lkcVRkNWthJGgrVSZtZiVUMGImKV8rU0koeFd7aHVEPjA8Kn1YCitnclApRj9LX0pRNmo8ZGZudUZaak51Y3N9Y3lNM2J9aTBkSFRWUXNZSCowVEtxS2dORG0kUiRlIyFNXjswZis9Xj1xa0dCT1heKEYtMFdNCitXeGU5KCNlQ3NBa0QwJjJeWUJNSE8+PGdRazspST0lPWdvO2BBJG1TXyhXI15fZWtWeytnbG82MX1SWWhqZHdHTjNuTVJ3Klc5RypwWXclCitqXlQ8KD4kTSM3SXkwYmVwQ2UySE54TDdzPlhsKCVNclNzZ2k1MFJQMk1yIXdSJDVTfWEoRWsreDltU3BXPDRAQGFBLUdGbUl5biNAZChLCisqPit3OChPYnp7biMmVG1AZHkqU21wTjRfWERsJHFtcFZLWlk/WSM8eWg2NkRNQWdJM242S2E7KiM/YEleWkszVXxaUWRsfGtxK0FVZG5VCis2PWJCSVhEVlNhUG82Uzk1VzA2PFRQZyp6bEN6JjxUaFJKfHtPamttQlVDeG5Sa3lyTEVKQEMzbF9hZFJhRVJSR3AtZERiRU9AckteRkZCCitZTm0/V2w1TV5+UnFTcGEtY1JLaGk1PWhwantIQEElYTtKZUdFIUNOS1N+KSk9TFNEKj45UnBHfXV0X0trJm9VMWdBcSleZSZkO0VBaCVrCitmZmBUJntgJUN+cCg3VjtEZ0pNNyY7N01pVSt5SWQzSCglaSgyTDEzMjFxZGxBLXg5NVQxJUpZSTExfVIlIW5wWVVWUUNlIVlVKVZDaWdDCis9SCNVeXdLcVMxUUZyYEF7cDgqdThTNE1MZFcwMkl0VjtBU2B4Rmw4PVZaciUqRzNNfjlnYW5EaEFAcFJ1Wkg4OUMhKG1ANXdlITY3d0dnCis8NHhIKiVucUE0S3Y8QD1sV1AoTzB2NCojKHJRVThsRHQ5Umk9XnpVSE94Zk8rTTJHWSMleXlKQ09pKTVfRl91RXAoJjgzd0BCWT9PRF5aCitPQnNIb29ZaiQ4JF48SWIzMkVmOWw/O2tTPHp7O2QkJC1TcyoheUhVT1g1e25qdX5RbTlxV3VqaiMjbkkyJGRMPTQ0SCtKOWNEfnl0SFRZCitDZT0+b2VTQ1RXS1RHMXgodEhVUG5jJG1PPkw+PmdZUnRJfjg5PFJ7MzNLSkZQWCl7VmReRWFlfWlpdU5PTmUhQ2shfjlOOFkjPkZ+KDdFCitofXh4NGA5YXQ1OHRzPFJfOG9vbEkwRWVebzkleW1hSGs8TjgxbyRLe2QqX01JSk8hanc5Qyk/Z3xga3pocXxHSCRkfDAwPD1DU3dXcm8mCitNSXp0fj8ySV9+RjZIZWp9K2x0eGVvb2FgUzBBKj45bmZvZFM5WCg1QExrPiFsQEkyOEtAZUVBP0Y4QlYkZ309e155cmB2a09zJmVrVHBACitwTiorS09NVmQhdDNIa0Y4T09MKzJiWSUjP0k2RVc3I1Fre3gyRHYlVXN8eWQ+Y1Y8cm44MEdjWmk0M0A8NXhZQWleQTVpWHUhMygzcTV9CitacGMkTnV4XyNAalk+eSVyZlQkJHJlMiZNQHEpR217YD5IZHQ9d3stdW5jdDZHfkwqeiRXNS0qIVVLRShzTU0zOzE5U2opYTR5dlYkTyFtCitgaUNLZV9HT2NFbkp8a05sPTdSZz8tWTJBPz4wdihUKE9hbCNnT0gyZTc7ZjxaYStJOHtFO1Z5NjhBXyNXQzVPdVU5YWJAOU8kUm1yQXt5CitYbWEzTEVuU0pRI180WGx1eVR+Yyk/YUchREhIM0YjMlhVSjB8JEBfcjk4JmVwajNobGwodnZ3LWtIJXVhcjUqIXh0dm1fdnlOVk5IfEd6CitCZWpwPSV5QWNoUHokci03bzx4fT9ZcThqK0FnUiVuXiRCe003RD1KUG1MSFpHTkZkK2YoS2U8fkNMTEtxamcyPm1PcndlWWlBJVpkdCZwCisoRjdZPUshfXFSTip0JUBNOXszWjIzVW41Iyt6KENqKE5vUmojIzJ3Y1d+M3dPQztjYFFrSEwpNFFKfjMxSzR5bUQlIXZxZVFCLStRU1ZkCiskIVNGYlVrJjIyK3p0eylIJXhfejxoUCRDTDx7bVA0WUUyaT91R193eURfK3Vsck0oUGEjQzZMR0BRPTJXWTNUfSk3IW5KPF9iQiZ8RnJlCitTbCV7aFRkO3tKNlMqdW9CbjtIazBtUTB4b0U7USh5e0IzMn5ESComPT0zMTl6UGVvdVMxKWtyKyVBNztYZnVLZVdiWlVrJG00YVN7cGtwCithJFA2OENiT2Q4bCM4OXBYaE50UXZrVHltTl5HZ1p5cXNqSEVqT242S3swKkFTbEFFUEV5WTJ8KnQySUpCVWx8OHwtUkM2IVcjUThnK1g7Cis4Q35eWEs0fSVWOXBGJCh8dmtHX2h2SSlSY2NndUkpeVBwQD51cTlJVklRJldUNEVkaXYwNm1eK3M5fDJLVGgmRWhSQnJpRzx8PEppTWcyCitKNU0/QTZsT21FSCQ3dFE+R1g7TFE8UDRMbEZTfiU4eW0yNzI1MTEpTSFpey1mQUkzR3B+amFWMjEjOTxne0xCWTZZTHUpVG4wZ0ZTblZwCis8aDBnR3dQaV9haVpheisrWVFQcUNPaXFfcS1zV2V6cks7MCVGdCp0eiVQVWI2KzVsbWVkUiFRTzBKeHlfMSVHO0clNntyMjU3dC1EUmckCitAMDYtX1gwRDM8bjFgb2t8YWNpZGtAVFN5LXZIUGpLPmZsfkZ0Wi11N3ltYl4qLWpLYlJkbndiPV5mSm9QM3tQNHxhV0IyVz9VKFF+YTlHCitHOWl+ZiVFZ2RVYTNQZlA4RzFoYzdLYW1aWTYrNGF6K3NTOF9meGpxRkhAWGhKMXFoemstbWg3bnVRM3A/YVVBM15WVF5aVGV7K1EzTzk5CitebCVMOF9yeUxDN3R2P0xKQ3lVOU03dlpYWXdtWnYoQTNMJkQ2Mm0zbWh2c3hfNWVjdH5PZ0VqUF9ZTWpiXl8rfVE9KGkzYFlkdEVERjxZCitII0BwK2hLY3pkbyprY0t8I2B6KE0zdWQmX3Jndl8+WU4jb159OV5fcHN0UUFkQn5MMC1lal5ON1BIMVYjRndoajQ8LUMtSVF7QSNQRVBVCit5blo3M09OaGw4TEtmWkp2SENKJTU4JCMyTUM4WlpQT0RMOzVAWE9BemJ1dWtxKlBMIXBwdDN6VnEtam1mOExrMXFGeW9+ck5vZ15GbU1oCis2UXt9WF92ZWNfR2w8NyEwWCZQe1ZsRms0a187ell3VkFiTiZ3TCtsJTI/ODM2MVQrVGJHQG90bU8rXkNBSFkofSRHTlhhUHBhNHNZe1F8CitXUytDRT1Pb3hLZkt4WUVCUklwPlhrISZBdFo1MH1tT2tHYTRQRj5wczA2VDIxSE17V1BhWFo1Wj9yUiFlK21VO3lZMEsyeVNPPUgoemU9Cis/TF56bDQtfWF1YUsoeUhnRWdOJGU5MT9DbTVOeGQoI0VGKnlRa0k+RG1QWUljeHY4bj9mISRTaWdrXyVfWHwqbDhVWGEtZDBeVWQrIXdOCitpYjdvUFpqQzlVRWxVY2JRZ2lmc21zfF88UUx9PmhIJU9pV2Nncy1LaCgtV0UzfH1+WDNeRU8hPUs+M2NyOUIrWDA5MX1jMjh+OHhNYVFMCitgSHl3Xk1SciZSN3lUU3Fed0VeIUh0SWUmaWhLeEFucz47M3hZeUxDUjhXcE44ZjJWPzVwTFF7bU9PbGl3dFg4LVN+T29yJiozWi1fNyM5CisjcEdfWFlsQlUjMXRiOWchLVp5JjFyNjxQbkVkPkBsdmtNJktlYEVgX21LQ3U2a1RBT1dKUFBhJCo8IzdzM0RveD43VnZAYEZQe183bjtXCitrMGR0ZHo2IzlJb0Z3eG8kc2dCVVhpejREPU8yV3R4QiVMPWJJIzd8NyZuMn1GQ2ArRiFqTHhWZXdhOFNYajJ0M1YkMCp7LSNnUyo5S1pNCituWVB4dFQwXlRofW90UnlaPkU/UyE3TzhrbS01WUAqdyUzcm5qIUtuVSQpS3BDRlR5bkAxbmtZN2E+Y2NGPTI4bFpudnVwQVR2MzVCMilRCitoNlNUSlc3XjRVKXNWLV5RNXt3Jn1+M0tGXi1AJV9LdWJNOT9xY20lPWJgOyMhVms5bz95QWotSm4xPCpJUUluPmd3fipKNTtQXm5IdEVgCitUV1dGZXNwN3Ftc1gpRWF5ZVUmMihQQzUkKylFK0YwXyotVjdwZUc0bXdOP01kVEs7WE9gS2RiODg1TnV1eFE2Pjk9UT1vRzhsWW5oJjR0CitoXiMqJjlLRCs3ajVQY0gqZTJZRmByQkFmWUFhZylDQVA7X28tO2NtSSZ7LWpBYFkxX2BTMzxDOS0hNGREX3pYR2wyUiFqdnozdzdUI193CitsUlM8b1RXZiY3T09gPTN5KDgpRSY5aFRuMmBjcCF5WmZBNk4rbXtFUiVudHVQc1B9NlU7YCN6VTQjUHIpSkEzKGNyRV52PkVWem04eiZWCitNSV9UMVYrZENfIXEzNjVJPlZtUGZ5WXJ+ZXF8ZTt8V2w3VFM4SEMoemlXY3NCeGErd08oUDtEVjAxRD5pYzZ7c1l8cHJ0WHN0NUpvdjFNCit7ZDdBWSZge2hEPWkjMSpHUGVGPXVzQnRleDQ2YClQbGdIRCohVHhYYW40flB6K1BOP1dYd0xPKTxIZlZ0Ni1WRzhPfEMwQ2s4WXBUOXtZCitDVnNYXlNibDBuMT1eSUV4V0Y0fG8qRzFXSG51KypIcGlZJWg3R2FiTEFhVFFhZUJyNkV0ekREJHE7VGpLVjZ0MU0kT3RGJVVrPVVlYl5UCitKMDJmPzRTWWpXd3lAfngwVnFga0BjWkQqentjaS16KmRyUCgjTzZiaXY+U1VDbzJlSWopJG40OFVUaUtjbWZ8M21QNzVUTDZpNz8/MHh4CitubmU8TlNyYmwlSUNISng5fT1RVysqJE9UVFlpVDxGRjhIKnlBZVhUSGhwJmtpeU1qTmkhQUp8MHV0KzZNUTtyIVNtNU48V2lvaD9qa2BrCis3Ji1rTyU5SXAwX0VQY09BZ1l3TlojMEc+RTRXMCRxbzZoQH1YemhWeiU+YCR3RkE5PT9DVmBEZiE+O1FaSShkbFRvczNnMFVAfDNvfVIqCiteVHJ0blR+QlJmSFRhK3k+ITR1dURZNC1WWUNMMj9yUWljYXVEWlRra1Q4Oz5qeD98RSEzKkBnR3t2eGpoQlcoXmo/N1c+YCY4M0NCQkF4CitARmxkOF5zZ3xZaEU+SHFofVR1e09HSHgyVFkrPjY7RSUxUy1+enR+dClifmFlbCpaUkV1fFBucXgrWn1eN1lZcVVJY0NDMChoJig1UjU7CitfM3s0Zz8yOXNudXNeVTNTTlRDaW1GI1p+Izc1aEYmMzI2R29gM0tEQzJQOS19VXozVjlzfjlRTVhPd2FnWUptOWBgZXpjci1WfjYhcTF7CiteeCE8LSpgaHdXRCZRS3FHU09HU0pVd2BXbm0lWnZKLT94UHpGOzFxWH0kfkMkbkk2bzskKiVtZGw5TSF0MHphXmxWajx4SE5UMUtzSHZDCitVWHJUOVQkQXlJcm1AZ0o/SFhzfmEpRXl+YXBFZ3l3U3xMcUY5YVVITHZfKkc0YHoxRndvJG8kUiVYRUpuQVlTVDElcHpLKG1hI0U4UTtsCitAOHc+KyVeLTl6bXQxbDReXjNlI0JVYmtja3xiWkB0PVN+NHRWTE0paS1JViY+RH5HN3Ijfj84VDJfXkVlMF52RVlwe351QWkpM3RWIXRxCiswOzs0fExPeVMpbWpnJnFeLWArQllDJFA9NUokMGpETV5nZXE4KGFvODdQbT9oYHVuK0E8b35TZDY5VWBWdzg8cGpGO3BKUWgjVWFjcCpKCitPP0VuSyRRdlFuTShgYm9PMjd1TilpY2M4UGJwQjReYn1mcElsYyQpNXgxPyUocU03bSlHJEdxa0JHVXF6K2lLQVRoVV4ybXlfSGZsQFpyCis3TWgqQD5KIWApYikrXiVHMzEhSHotRjE0PEo3RTZJOU9rVUo0MV5rMEVSaXo5WXJrRn5yKFduNG9wUUlwfHFzcGJ1K0w/O1I2elVPcUE5CitodGRJS0tIYTxoJVI/a3Y1Yk9hYGZWPSlMQWQ7dXIpUEpgPj5zTjNWQVJnaDUrbXUxaDhLdGpMXnB1ZGJkIStUVTlKZmhuKG1gRShMTG9SCis7RygmSj9GbjAqYVM9eXt8YzBrYWtZNUdrUWokM1VDWTE2Qnh5JCpNPUxjdHhCPWk+RFMmeGRUTDZ0UmkmX0dJcH1CQjxMZ2hNXkp3VjZXCitpdEhoMGZLSV5QYTZYQD5BKkRBQUxKOVpVcUpHN1Vsa2hRUjZ5T3BnT14/QUVkMkE0OVl+YXx8KFZOWUkoMFhmTWA9fUZyOX1NPFRwSG1NCisobGg0Y1RnMykjZmN+RHZ5RF5qbDlyfV4qPHFZRjhiODVMM3woPEw9MW9ZZlc/bGBeUDZYbHA3YV5WaTY8K205YEdkOCRZcz5iJjcxPT9SCitUQTxuIVhXO3dgQnJpcVYkcnJPTGpiXks0O1R4IXhgJFU3QV9pT3tlPzYwQ0E8c1ojTlllQGc5fE8wR1U0OTNgR3VReypDbnpwOVZTe1h0CitaWXdERzQ1cEU3S19WVFlVLWxRX15tMW5naTBXMTdOP19WNn5kV2VLLSNSO2JgTmdPKmgyaEVFb3FvbFQ2cGY+S2JKJW99PXF1Z15DM2E9CitTRkI+YFB2OWxRIyFoODd0KD9ZYnFWZkNUQjFkbUQjdyl4TGw+QWBgOFNoYXBwKG8jezhEKnlLOzhQME4+TUJDTGtVbFFmJiRZQGZYJmlICis+RU1oNmIrSSl5e0l5IXA0MkFFKmRYekMqKGVqKFNpZiQmZUUtQ3pQO3l6QFFqNWE+SjVEMEMjTjhZV1c7I1c4Y19vUypwNDdoeCRMMXp6CitDYDRFMUhaQVAtTFBHfDFJPnx6P3JVI3NxWj0rYyhiSmhZaDsoNGxXMW1JWm8lQEheIzdrJjEoPUdGSG1+NlRFfT1qWTVBfU5LY0d0UTw9Cis+LT0kKyFQKTtza0x0bGlwazNEKDRZJGNZJCFsKTQpTzxadVc4b35DZyVHRns8WU8pWFJtQFEzKE9hJlF9TUluSX5YQmU5MEJ6ZzJNNzc8CitKTygjcl8mdnlnWVFCJWZWY2ApV091ai0+ZE0pLXQxc1QhQ3d2aE5zdS1+NzVkXjlaUCEoPmxKfTFmKFQkWiM1NSFUITBoZ05saGxDdmpuCiskViRjamBBKl52JTFMUDxHNGl2OE9HN0FPeEB7Uih+eUpjdnpMRHtkRkg8Zl8zfTU0NTdFbXY5b0lERitNI3ZSZ013anRgNyN9QmJgcCVkCitmOSQqSDx5QjxFRXRrYH1kazJQUy1LVU52T1lTXiZTKl5TM2N0WSNtZjZLNXQ3Q2RoOVJGJUdlP2I9UTtGa2xlVWR6KX1LI3ZvKig2V3NWCistTjExXmk/SzZebHQ4aXlqaisxcW1yXlgmZGlfQTNgYzQ9NDMzfnRpRWQ8NmRJQ1pYbH1VaHl5bCpSKDtHSyQ3QXU5XnlFcjR9PWxEdzwqCis0Vmg0fXZBdV81P293WjQoaGp9RkRSfDVBS15ke2hII09NO09mOXNPP2pQT1o4Ry0rPH1BPSsySXlTQFZNeGUreiFrOSE9bzR1NCkqNT1+CispQ25hVk5gPFJYNEVZZnFoZ2Y/JGQ2emt5MjZIRTtrUmtVX2ZTPz1UTmlpPkViNDxOaHB2VklWSmZpelp9RW9tUTJRMWNGN2NjcklqI18jCit8JU9XPV45UCNYYitlZj99SUJIeTA0VGlsclZeSU89YWpFT3QzO0MxNzNRb1QrUGExUHFDSEg1PGB+WSVYb3JxazJaWVM5SHljMGRiNCZmCisyMzs5a1l+WXhYVygmbz4jJEtPSzVpSF9yN0JAcDxvaXhJclMlMW92bU1YYiF3WH0zS2g/ZTN4bUo4dGFsJl8jaC1nMndCcmtJNWwlRj11CitlJWlzTEQlKmIyVGxzdiNOQXQ2MGx6NlEtWWxyMUY+Q0JFX1lFYW1RIWhaRW04ekRpeG1GQjlNQkZ8UkJ3MmAwWXI3KUZeX0A/aGN7SCoxCit3Xk9NYTJ+WnBINzNDQSpGS2NNIWpgT0oybjlIMkI3P018SHkqQUZDZCNrKyFUKyh5KVdlQFN8P15OX3laXzh4YyNrcHx2ZEYrQnoyPEctCitzaHhwdlEoZzFiSWs8eGM1RGBnZn1kNWxSMEJ4PzFPeCZwKjdWWDU+RVRmaSMoKzBCKDtJNmt4SX1kNUdlamx0JU5HWTx8Yio3cD1uLThPCis+bCpRcFctdUE1I3ZlUmBNfldNZSFqY1BNYkB1SzckaHpOYW05NERYJnhnU1FmVUVYITdEKVBRISZWaC0oI1hGTyVwWkNSM05PQ3RMaEBeCitFVWJgPnIlKUtBK181dVpNIztSTHVwMzxfUzZadVZBLTl3IWU8ZkYycVBWR3gmYyVFPiZPUnE9bVBTZD17LSR8VDFVIUlyX1A7UU5kbjhuCitqMmhlbFh3N0BaKlpCMT00RXw5NyV0ck5NSUJDY3w+WmlRd31KVzVTTlZfO3pXbTZxMDIpb0UhbGx0VHFqbyZPfCUxOWlCNXJzK2FIcFZECisrOFVIQT1AV051cmFHQl5kSG8xOHhlJjFnLVhvNm5vKXJWRlglJUdzc0wtKUk4dik2K2V0Ymk5IVI4KSNKeHd2ITlkeHZhZGpZMkt+O0ljCispNyFjb0g+PC1nI2dObUsmUHBPY0JnLXd+fmM2QDZaa0Mxb1l1KDQzd2RmSGAyPER3PVJHVjlUdmBEVXRrM0pZVDhCP255YDNvST0/N3prCit9dSkqaGc8LUJDNlBUXkMkbX5wcD9nfkEpVT81I0RwfHk8Z1AwJXpsQnpBYEYqaCZgJGV6fF9XRHNNUiE1WWheZXc9TEdOYHdYT3I1YzdmCismZjhBOUo7Zjd7MWMzcXtDe0ViVWM4byNXKl9Ie05XNl40Nzdnfio+K3AwOGNFe3dFMiFseXlzPUh2K2BOJDhpV2AqQUQxc3cmdm5Mbyg8CitjYSVmM2NmPUFmdlpeRTdWYkwjcDlheTxOKkY9KiFPO2ZDMlJHT0hiTHBzVFQ7MXU7UihaV3syb3Y0RiFENjlyVzRLJGxqRHkwX1h3aWIqCitANTlueTVTbilAb2ZwM1Q7NHxCIUFfWm1jaTFAbTcjMkxBRGcpYG4lZ0JtK1ZFJENienBWO3l4Tzh4VEBUNCQ9UmQ2aGJFdEd7MlVrZy1GCit1VnxfcnVxOHdfNnFCRT4tOU9ERF4kT3BiSWFobzMmVEZCY2UqcGVHJSZmPlAqK2VpOTExNV91a01LNHJWXy1KbHw+PHpwOVF4OVlVeD57Cit8RXxnPFRwWGw1ajhnaUZLVDw+UiVofDNgczV4PSs8UH1wb3oqb3FWUlMyWkNqayFPWElvdWxgP14kWnBLdnRqVV9EN2xzMzszbClhfF5VCitvKC0kKFRkM3dgKEU/JiR6S2Biay1vM2E9JlV7bDx5P0s5Nkk2MShRNkRffVdRPlRNJngxI09WbUs8cnp5MC1pQVAtfGhee2ZraSVpPFd5CitzUD4/VCt7TjttJFl5U3FYbnRLRWFOVVV1MGtjVjV5aXdHYiFfVHg9ejwhak0kWUNHQytLdj48ZG1XPTtDUDxTRm9GMFF0eC0rK1k+cz5PCis1WEViXyRyWHAwNUtKbzB8Ujk4UXhDKUxHYT01RmAjXykqfT5NT1RCbSQ9YClhdmYxJCl6NlhAbEM7TU80M1M9fmVNMUgrTiQxOHE0QD9WCitaKSFjRXJ0Nkd3QShGeHw+WFkzMVYlJVB9OTIqelh+eXBVSz85K21TSHtVMm1aJCtjbytzTGZXezYpPEw4R1ZtQWNGTzxKNSRwMEdCYClgCitSaV4zRVQ1ciR5YHoyMilWeypuKkllIUUxP3xoQmVMYnl4bTEkcjlyaFFkdFV5fUI5WVk3ZSRNcl5fZUstWiU4XzBmPkdjPTRWYT0peCZZCitzTiRNYzk1RnU0TGwqQklWKktYT01rKUohRXNrblFUaD5DfUQ/S0N8VUM4WXYpWmB8b1MjQFE+K2FrX3ExU213RkohSWV9R1B3MHtfQz5VCit9bit8d0RhO0MlZztkXnd7QVojSld3Nk4rS05eRSVUUjYzYj9rKUJ+aVV+TlJkOHQqTHQ7ODlPX0VBWUw4O0p9Xm0mWlFxKytRJkAjTDVLCis4JlNiYDlZSlBXN0E0eDklM1h0NHdWODR5eFJ4QGlDfWVrJDBHR205M245Y00hezF2OGY0MkM0ejJqdmQrKiFVPyVVcEU7YUFqNE0yeWhBCisjQzRaWE5BSER4TGluU308ZEZkRGJUQ291YXwkam4kfTRaPiU7b15+VGFWJGtZPmJXOUR8YjFuSlM2Yn5fUkAmSEEydFdKaDlGbW5HPT1uCismVX0mRSplaEg/QD9NRmhxT0dTfDU5NFVPRG9nSmRzSX1jVFElcz1qdDN5KDlkV3UpUihXMXFgbDtpVVNNVXlKa2pBcUQ1azlAfCRQVjxWCitTTUcybC0mUytHQ3xsXmEzMmAtLUFWMktaWVFjOVdlZERFVllIa1BSbj57dlh4MkBhV0MjM0RhOEE/e0hmd09gfFpwI3w2aCspRFYqMzUyCisrSXhfYTFrWS1ebSlDNVZLeCgtamo1PjE+NWkmbjRHK1RAbklyUEA8MXdGNlJaSm5EUSlHdllrTHIlU2Mod21EVStrYFo7ak9TZj1xTEFnCitCel5HVU9jO3txUzE7KGdSakFsb353IXBKX1NtMnNwbz07KDhiSCNiJFBPfHNKfWM5O3F5RkdKPUtaV0s1MTNvSDAoNj97SkZjcGFAbCNCCis3eUJVUVpraS11WEhuNGFQcEM9Z2Q5SUlBfExQSCZgcUsjZGN7dmpTal5tUnJrb3c5R3x0T0Z3QjErey0ocDwxbypSeCMzNExnVC1gJU9oCitBdzRkKVkqbDA3KW1ZI2FCRTRpSyE5JVVuNTBeZTs7bnl6ZnwpQjF5b3t6aHA0VSgrdnhtM1pfLVV7KDdyLSFHUUckQ2h7NEZKVDFHaktaCispSmJTNXc/RmBJWGpUP09mTDVAZWdoPkl3bkkjTmgxaE85QnVPPFRyNkZ2TytWNHtiQ2dWO201JXRmOHJFZ2ZrUHB6T2VEalhKdz1KMS1GCitCTjZUNWBWWVRpJWRTenZ2fEx+P1h7bXlgJDR0YHtGV2pCUCgmNlBkcT9KaWIhblYrRllkOFlLbj93JEYzeHxZcj1uTERqfm4pWUVPfEJqCitDR1p2dzVfQmY/fnw8eyh3UnE9e3RGS34kRlRubXtyYW81c1hlWWNoXnAob0ckZlJpUWdkZztpQWBMRlplcm9PaSpCajwlYnk9eXlQQT5wCisoNitQb2REMmh3TyloTEtyZHdLZWhSZTleOWcqKiYhRj97YnQ3UiVkOz0xJmtyUTVCaUBjNnROVSNQVEx2O2x0bG8/Yj19MCg5MnhiNFk0CiswUWklaUJNbWA0cWZ4QDc1KyRXaiRwc2hBeXwxKl5SVEU/bE83aDhEdlF2dyQmN19DRVVFR2xKbmw8Z1FHYH11SExYRDBoWWMtRGpPSzVvCitMdnBhcFNrUlE7KUtZbnw+NWh2UEV0UlVVd0t2P3ZgRjheSzBEX0dDSS1qdSQlMEthaT9rcil5QWREZXo5e2BuZTRyKkd3M2xmZHBzdjErCitOYDlWOF9yYTB7d2QtIzMycjJ1XiZUUTRAWWp9PURBKFpgbCEkfTNBV19rYWswZkxjViZDTDZ6P3VuQERXKlFyQU4pMWR5PmFFaVc2WkBnCislPDNZX2RiYiFBallOdzJnanJnV3pqaTE1bSZKPE9NdEFhVV9tbSpDYXF7RkQ7QmNZJUh4d0okUzZIQ3I8eU9sKSV3Nz9lQl5rTjR1Rzg8CitZdyVBa0xfbTttUFFlbS1HSnRaJE1SezlTKjZubE02aGQqfFNpX2FBbWp6PWU1VDJPRExEUCN+JFZhX3YmcyZRU1NiYEBkQSZ5YVlNRWtICisqWTh1PDApS1ZCXzJjVmNNak9wM2VHPGZQaT9yc0FfTGxnY0IldXcmVyo4PT1tbHI9Y21OZ0M+M3d6OSVtZSZlOXZVJWJzJX16aWs4dTc2CiswTHdtOChBa04yeXQ3QCQ4dDMwWXR3NDt0NTlvcG1wdnlwV1c5T0h6eXY3SkN1LTdyfG9AM2c7S2h4Nl9CWHxGZyg2MlhjPTY+JGM/ellDCit0eyFwT1QmaVQ+OUwySlJrWF5+ZVJmU0xsUi1eUzlZJGxvfj9afXV0fmZRSypeO0xkLUpiS3V0QG9yT3EzSmhsb3RSKVU9ciMoOHszZkMrCitYYitrNjFgZyVTUHBYZjVsdDZ5QEltRSFjOU9YezgofmpKa3FsQ0E3RDE9Vn1IUHhDSCtrdllPKWRrR0IzNVNPdzVFLWYkKmM9bUVFTyhPCitJeX1QfChXV1AmdkBfQHp4XnRhdTheSVcofil6cF53dj1LR35ZX01wTlRPcmlCJElRKkomRWI3e3h0ZFBYZ214cnhtbSMhMHFOUE8+UkVaCis0PG8yWEZeczJxJSMjYzQ4Nj1WN2ctZj5sJSFHQnpyQ2lhbSNxZ2whKSRVS1UzTyNKQHlnIVdeNG1qdEt7PCRJJklaalhSKClQb3NVc29UCit5ZFFMTVV5aGVPMH18KzZ1anlfdWN5Q2psZWlmQFFpZEAqQTtQU3VPUGZjOEVmY0p3VS1wSn5nd0g3eXk9VjhMLU94PW5IOVBRJm00Km1fCiswKm9UX0tCTXIpSjxrcS07VlAzfmpuT3ozSDgzbn0/UitKZzlRUnlBKEZLK0RRcnhpRExYcVpqak52SFFgdSpXfWZCKTdZJEtrTHcyQTtACitIUHMxWktNRjFBcFcyVGlLe2MoMDlJJUxZeWdXNjlZNE5oXnplYCY1LSRCKyhtZnM5YGV5a3NGVmZEIWErUTk7SDcyOy0oeCVDQHVWbStoCitld2lAelJEWUc1KjdpdFFnQVlfSC0qb3h0clVRaFM4WkFvbDJ1YVYkYFRzVEtUZWlraWgyRytxP09RRzYhV0laalQ5c0AwOyo7b15JX01nCittTGRwYk9ORk04cUVnemAzJWdOZjtrVXlkKkpgSiFmO2IjS1UycXB7dkg9XlRYJThMNVdCPVI0JkE/bmR2VUo+ZFd1X0duejhafnEtYkJWCityXmpFX2QjYzxuUzZUdnhgQS1WWksjI0k3PkNxQUIoR2hOcztUdF4pKDtoKilqJHlsd0BEYlhzMUJHRV9sI2R5N2dBbk9mdjMxWj0kSTc1CiswNHhoTFchKHRoXlAoMHE9b21GbykzTT4+WDl4eTdPTEx8MipxY0JgTT5ePSp+cVRrYkg7SSgyKD1iRk9KYkxqUDRVKXFsODdqI3dSYWdRCis5MzQtQilRTl5XcGclciF3dk9MTUIrK0A1PDxaTzEmcEc4UypeOTAkV0tTNkotbDhxKHp6dG0lRkdnQCVqO1ZyWktFTDw2Qkp7QlZPVGpwCitQUXIoX3Jwc2NYQDBGeWZRQWFpeWdlY0JXYD0kbUF0Sih4YFAxT1c1fG5GaWpuRCpJYE57NFRjQk9uJn0rdUQ2YzxmbEE+e3xNcWFhS3NeCit9JCtmTlpoeko8anhRNlFWZT09bStlP0hVUzFaV0o7IV55YmEzPl96QkJ7MlUlUEZnOHJNfHN1a0xZQnYkVkl8M3sjc1ped1Jxd1psRzZKCitSUEBecGsqd2QqYHlzNWRZdWErelJqezFvOzQqUUx7bEBoV2M8RHUxZndrSE5oPGZzI09ZZ2VDYHtkMFVaVUFaOy1nU1l1VCZWbUgjTFdkCitXUjZmPHQ3dEdqak8+cEswKzQ2JDRxYC1wTFR4QDs7Ul84MFVkb0lkZVY5QVkpOSQxQV4mbUxeSC1kcHttM3RNUTdPdXc3JkhEZW5EdEd2Cit1MkZTaXNnVn0lc2p3TWY7blNESFg2UVpuXmBqQ0N6JHJHO2tjRT0lPD8qTlUzam53NmxIc3oqPj91UnZ+REArYVY0USRkIUk5aCtkQk0kCis8aXZCVDU9NU8rJTFSPzJHV2FKQWpSTl9jUz40VTdIPktwbkRCXk5pIzVFY2JNX1A7PT9rb2JqYkMrYSNqeExzX3RUIThGPWlPeUx2NHFtCis/SSZKeXspMF51RVEybkMwbDA/dVRRfmJkWWlPNTMoTF48RGUoM0xGU2htSm15LV5UP2VzdCtiTChQMFNDMDZNc0EpYHJLTmtLVkVHIzdOCitRYHJwd0BsWU1ObXY2entLNVhLNGQ/P2xHIyNgbSUrUW9Ma2IrQXx9JWpBZWlJUXxCYXIxRnoxXz50c3x5LTY8ZlYrYmxRQDVlVDYkQT5hCit7S1ghQ0dLOXIzOCp3eVgkZks/bV4hbGdBRikoMlppWjBzO197dTZYN3hJOyt1blRRaD5oaGs/WlpkbTtLNU5AJkh7OzdDQDx1am0xZTJSCitGJUVSMihIVU0qRj1EPWtfTEB4bmEkPH4zNX5rPzVpfCttSVh9V2A+LV8weT9HMlEqeEZDMHcoJWRUelJULWo5aHNONUdzM2FtQzhvMnNgCitIZmNTTXNsMilSYmUkUWlXd3FRYTcldFFtWj5ebHJleHp4dj9GdSNeWUhaTCN+VkI3Nm5aay1tRFJfR3RzNzAqP0J9LXc4aj05aj1oTnM4Cit0QmJZISR5NWEtcihvNUR6fDIyO1lyKi1xMWBAI19nVkMtQy00RlE/bW8pcDJNUjkpN253bXlZWT9oUDR6TlZJOWxtU3E/ZHZQe1FlWEc+CiteK3F7amlyNkMhb0NgTkNTNFpeZ0o0T2M9ZzJkUGBrSCs0bCRNVjtPUmlpNjdiRldVZHZ+bUdkRDdzX3U5e3d0Vip7IX59Z0VxIz1ZUjZ+CitWTXlKcDAlT0BgI3BsK0duP2ppWHBGc3d4PnpQdUg2NSVEU3BaX29Cd3llJndsdjZzLUQ2Myt8dHlGVTliYkp1NmU5elkhLWVAWStfVkloCitoTkFBUmpMNn02aDx0RSVwS2g7RGRkXzByRVZFSm4/dUk8NFc7UmR0dSUkMyojRW18aj8yJn10Q0YyN2ljT3N6bkgyKHU7Rn5QWmJQIyQlCithNEN5UXEoZC1LeTw/N3pUOX11YzlWJFgrUHc9IVFhVWpKT2YlQyE7ZzlmKWxBLX57NWU+dlZsOVE/TlUoR3U4TT5HWl8zSSZCU303UGJICitOe15ZZm10Q3RFcDg5c2dZP0hWXktHJFlKZylZVmxMKEY4Z0xHZjRod2dYPlBJNylMdmQ5djtCZXdWTl89NmVtO3I8aEtQQDxib0Y3PD9XCitDbm9IYExlJSYwYHd7d2BwWndsTHpZN3hJSjckY2RLYks8bHVHVUojeE0/X3hAZ1l8ZGpaIzY9VDIhMmN1PjU9JShrbGsjSU5xRUIwQGFNCitiTnEhbk9oOTQ4R0poalljMHBWKHkmKWB5ejw5I340JmJVRFVaUXFKTjUyZV8pVl9XUF8hZTM0SSYtZnxvNXl7endkQUFxbkRWJnpWcUFICitHdz5NWXRIakkmWm5xIVhvV09oZ2gqOXtFQE5NIVNNNmFTJVB8aWszXiNVUUVjbXprZm03KiNNSGw+d1dNejUpSGxuRHhhdHFmNTdtbUFnCit0VWheZ3lwWkQ/RXlWakFZSUw1ZURUTSk2SyNjYDBFUDcwbXdqaHpjNlV0e2o0XzR0TU97XzlKbDVkY1RCSnJTNXY8QERydyp1am48ZV48Citma3RyOFooaExNKUBuYHB6U2EhTX4xWUBzSnRzNTVIRWxQRVBzVzw5NXlDZlpfTXxnRzBHSkFPeU83RDkhcU15I055Y3AtZDEhb1ooMXhVCitjIT5qZ3pPZXhuXml3SnxVX24rODRTbFk5c3FDaEs2fHByYytQRTJzQF9lITxGYHVlbV9lcD19S3JkQUl5M29sVWphU3JPMkQjNVpwWGtyCitoPWFiMEElYW51Xk1EMGlOaU5ZaUpHWU5RNHp0K2ttRCZJdl5gVVZASXlnR1F6KTI0fnlJcFk/S2MrTW9gWXt2Xj5ZYXtkfVdvYU1laFViCismKChxRW9TODIyYWEkQXdIKDctR0skaEVwM3NRKnZOWlM7JHZ6e1dWPWBsdUQwTUx+bl81NUJyJmhjdyFxbUB6VnptSF8zY095TkY8ZElNCitBYC1PKmdzbENzY0pgY3k3QEI5SkA/QGB5Nmh8Q1h+RDcmbXBmJVJYIW9EIXtVRlMjbWlDVTRjZ2Vmb256N0VlZzA1T2JtUismV214MGBHCit5amZlYzV+Pm4yJWcxX1IoZ2oxVSNXUH5FPShmeG88a289UXQoXzc4X2B7d1RiLVBtRnFJZ24zWGEhSTYtP1QxQWhhJS1RKCEhTjxlYzxHCiswaEhNaW9EYXtZYjRFVTs+Nn02TTl1USZRUTlTTE9Lc3Q3NTFgeDBCTiozPmhVfkJARS1DSCl0b1g+TjMjU2B2MHwyVCYjSSZMejR3MDwrCis+VmAlaGY+TWN0JUgqeC1MQElmTTxxSip7OWNEVDRBQ202X3dURGVFVUY0PzVjT3EwKjN4eShfI19Ye3M8U3E7JGtHclZPRVo1cm95O3FBCis9MXtXdjtMUD9YVGpBVGs3SUFXfWR4eThwQCl2YDJJTjlXRDFUbFJ2fS0/Z1hDTW5rbnh0cHVrUCVHSH1aXkYjaGtUYyQ9YylyYTI2cyt2Cis9THhRcioqMWBMKCF1NHVmdCZKdVlRMnc/Rko2WiUpdztUej89M3ZDaEliT19pVz5JXyF0SWA9NiRwSG8tdkktX2hpZSsmcEQpZjhyTnJoCitGUGY2aEE4OEZoQUl1bk1HQSsmcGkzYTBvY21JT2x8OF5MZ0YlRUA9MkNaS3hBZmQ8P3EyPXFrTW96SDQ8UXF6eT4rPjxqZEIxeEJ7UDZKCis/WWJZdGNtfj8lKCMmIVlzbF5uUTAhVFo+eUQ9bFR0PUVLPlVmNiR6XlckYnZ2UHw1JTghV1dWKl5AUF87T0EmWWdmd3Y1Y0VOYGwhMTdnCitFZEpLMDE9WWs0MSpDPFRwX1NrSFAjUjAlezc8RkZTN15BY3NgekhtbFcqdTwzTzVAMUp4cSMkKUo0RiV+eERvNTJnJk9zQ0A+bHpeUj02CithWlBIcXxvSmY1fj00czhkdjJEblohdCZoOSErKGw+PmkqQWI5dCluIVVtUnE9KWE8KXspJjUzPCEjRVpSPUgwS35gWmltbU5lTW1FbTZ4Cis1MnxpT1ZYYnZ8Pj0lQDR0d1l7SENxOWtQPD5MUHl0VlNyRkgjUHQpbXV9Tj5BWFJISiM0QHJiRkEmIyQtOWxUZGE9cTxeZ3BTISEtT3c/CiskKXZ0YnxiIzBYPTZ4WnpJXy1NVnMjWUdLJH51RjxGP3JgRT5jSnRmKnN3Kyl9ciZrKU1WMypUO1J7YzgobzNNKEAhSGxwelRgQWt6fSNqCitJJkF6eFpxRiN3aG8tbCtfS1ZRfHY0LTgpZXFZd2dkTVF0KShXVy1UWlkpQjMpPU80WFRrfTIpNHEoc3J7IWVATUJmfmQpY0FNZG5vLU0rCitqRXZBcyNUJVZFWGwwZU5xQGwpXkVrWnpzUnlKZVJqck5xOHhxPThicz4yMiY8dyRgYzNjNHNGcncxJHdhKlh7T0pnTClZWmJ9S0w7Z0YhCis1fEZpWntFVTJAcHYpX28tRCV4dCVSJG9jPEdwR0NDcSgyWGAlJl80P15lO1dkTGkpbDlrK0NTWC1ybFM5am9rclJhYkVgfXtUQnZ0PVA2Cis4ZDdYb0ApPitKWlVKTU9XUjg1YkRmMSR6cFJnb1FoQUVRNmk+IWhuRndYSEd+bj9pdSkpR2V+bUF0dTkhfGlBJX1lV1l8XzUlaSlZY2JQCis/QGghJiMmT0tNITchRzdpOHVSUCtlJm9vOTJ3QVcqN3pKY1FpbCMtWUVJNlhFbSRBTChsLTNIbCZiRmlqfkAzdjMyQShrSjgpN3RscGlkCitCcGlIcGgqZSZMbVh+Oyp7ZkFiTmkqPk1+IUIhdUM9RFModHR0LTVvNzNBSVZBeSR3bG89S01jO1dMLURmfjxUdFZXcWRYa2x4Y3teJll9CitMYnc4OHIoPG1aOEdxZis7aHhjVjlTdnkhMGhrZnxxdlZCT1VlUiNXeXs5KmMjS0JQaCl1Q0Y1M1AxbFNqJX00MnBRPkglaiY+NkZNTTwrCit2ZCtBKEEjSG10SCFWIyhKI3xCP0EyfDRnRHxBNUJtMCQxZHcjWG1QbVpaVyhRWF8kPXtmQVo0WTJzQTVQfT04NH48X2NVJVAwPlFEQlE3CitiTC1uYDh9TWUoN1l6ZDgme3QmWXYhREB8KE5ubGNrNX5ANCt4enxBTTlpRFlDTylOPXNiJUBmfCQheyY0WTlrRyEyMXxCKik/XzJBUHlACitfcSttOUolPFBgMkZ9ci02UVhkfDRmUUM1QzEwYDdWa3xNN1FjOUwmP0UxKkFzJV47enk1I0dCZC1AM2l0ZHB8P1dkKlBudGk/SUFjeXdWCitnTU45PlhIWHhBcDxhMj9hSWRfVm5uSGgxZGdhTU1FYWF8R0lgQCpGP1NPYjY4eiR5RCYxbihYdT5WVXVVUGBNTzs7QzJsNUwhRFdlRCRhCit3VWpuMHRoVHluNmlSMEwzZ1Q4dGQ9Jkx1Z3UjTmchPHh1Qn4hO3FSelVIa3FJZCtMRmpCbUl2KF5+OSZDR2ZLPk1jfj9Dd0gpbntlOSgjCitGTHowV1Y+c2ByPVN1Nmt7a2NoJnAtNUxkbjUzfnwtXzwjJXdeYF5pNmIpdk1IOV5fO3FeVVd4OWlIJW9XYnlHRDFfbzJ0OSZPfjRqQk99CisjQ3xyPlBAQ2tRJj0tJlUqSj1AZWlFIT9tQnBodiktZVpJX3VwQzVWMlE9SVAyfTkmVSk0ViM5NDE9IWRZK0kjYk01UlJzWXtPPnN8TmAmCitVJUx2JlUpakFJUDFOakpMezRFckwqM1hHbG4/cEokM1FCSV91czA0UUlXJW56UD1sQDhxbUU2VDZ9ZmVRZXNMLWctfTxufEV3UCFkcWBQCitfMTJxYEBZY2ckZDhYY2FGRUU8Ny1YYD9jbkArdjt7JnVPaXAycCs7aUtwSXlRSlNhVFA1PDBlRk0qKSU/eTJgejA1PVdEaXtpNFVLYkMlCit9cj1JUyNfQUwmMz1yUXd1JXZFcFhBQlZXPUokWjRzc34qPCQtQ2d6UUpYTldtP0tmVFplcyVHRz5aKFZKYCR3Kk4zNG5qQHMmfG1+aFBFCitlJjMlQm0zJExuci1ELSYqZGAtaXljQT4zdSRea3p7dkpwe1BDbzhFe2FaaEJZekA3P3NxMSYoZEtnMVlJQT14WX5gRzVePzRQc2lUPiZgCit+ZSZvZ01YLWo/XjlYR3tRKGE+TER1cnh1ZjNnZ059TUR6VHYzbnhVcFdHIXo0V1F6V1UjTD5mdD42enYhdj10QmUxQFE7K1Bzakhlei1lCismNlApSH0+bFVVJUF2JTU5PUIzc1Y4NGpfJkBVMEwkNXBQc1lqamo1fXRiS0xgeXlPK084Vm5zZlYlWHNuPkY4Tzl3c20pPkJfUEViRSh8CitkWEhiYylLa3clRlZnJXJQZChiSFooIX5EU0hJekBobTQ0Tj5TMklQbDJGSF9hb19hUjxGcEJEPnVvJn1UbDAwJlJ9KFleOGM1PjshSmNtCit3dWBsdTYreG0wVjR9Jil7Q3g3bD4rNS0rSTw5LUtJNH1aX1ktK3VUckw7VU8oLUZ0N0BHSlVzSGE+aXcrKSNDPWVmbFF0TlhualltdX02Citnd0I7KWFmc3Z9M2BfbXJFY2BBN2RVWVZ9VllgcF8qUER2VX44MkU/YmtOZEpHSio4OSVvSl43JXJZSDA2YXltZ2tLJldBYkJiUD9+M0AxCitWY3pJdnxXRSt5NnQ7UlBYPGZXRSYjI2FaTCpoZmZrc2VZcWE8M2FDSiNJVnR9QT5sLWtNIT1UYz1zPyQpKEk1Ymw+O1p4JWxXam4ra2VKCitebTduY0txLWt3YlUjJkI8Q3JxeDxlVTVgdXt5eWdJVExvWXd+YXZAUlZITExHRmZoYHJ+c1NqODdfbys3JlNMaFpATjAtPVc9a0JgY01wCitYK3hISHFsSnhAKHAlK301JTZJU21nWWJiTD9JdVJPSWgoWUdiMCY+e2BsPkh6PiZMPjRaO0tPQXlecW5UIVU+cmB4cyMzISpBTTNmbklDCis/ejFVRzN4I2xTbEVjaHVSRzRvZjVCI1hDSEBGclUqdmV5aFVOQFZYeWBaVGxuTTUlP0lEOVlXYD8hY3g3JWcxfE08VlNtUGxiRzljTkRmCitPfCV5PzFGN0VBYkpZaTJtTyNycGYtfE5kcFBtPV9PUDBKIWsmKkR6eWlqLWtjc3hMTjI2LWFtbUp0SjYzWjsrNmAxdExoUjs/Zjheb08wCis2ZHRBbT8kYVpaTkM0RWE+YWhwY2pSa2V1eyheZSttd1QheWF3dVgkXmI8cGx0eiskY0gmcjZueEBLaH5RcDIjSnl5KUFLRXkmRnpqI3pBCitJWlhXVTtjOVB5RkdMaHFqak1IYk8zKXlJTkBXfDRWR1lfQU1lV0JWMEo7PjI8b0UwMTwqMWJlLVd3Kjt2cDdocGVMRV5mbE83emVsOz91CitHOTkzUUM7KmpHRGJRI05SRGdLZj1FUTF7cEp6OE1OdTZNQS1JanZJRGtHNG89VkRZb01uT1I+K2Zvcj5OP09hfkc9UDE1TzxBcz9GJmdOCitFVnR6dyFzSldWazx3eC11Xmstd1Q9fTdSMGBRbjghOCM5YGdXS1hhTG0qcCMyO2B1UWZFJT0hcVQtTVFJUlpNTFJRKSsqd3ApSytJTTE+Cis7VmJGejVadWgxVW5TOW4zcytoYGZGbyEkKChYZE1WVlRofXVENzRrK2ViP0x8X0FOLW9TYlAoXmFARStoU2F7Zk9QJkotS0hsRihfTk1YCit3aX45cThyOXhgKzV4M319ODhaZ04oeyVlRTBuVEk3YH1HLVB1Ul9sbHZXKWVwISpDc1l2bi1RWGBFYzNHPW5XWTl7ajhASjtvNnBjZWkrCis1dXI9R3pFankobUJAKHZAQHIrcExnbTtXNkU0eztHIV5jRDJOMz5sI304PnpjM1BpLW97fWJPakhoSC1aYj5STExTXlU9eExTeiVeZXNJCitTKT1gKUwkQjF4KzZSUGVJWVIhX2tKQlpGemJ5d0h2eFNRSGM0eSEoYyVUQyNVUGN9JkRuWUM2aFI+USthdUtDOTl3M3w1NyE3Ky07b0IxCitoNHhEcFQrWmxGNDN8YGRjKEl5MihlSUtJZTM9SitFP3s8O0hGRzdYSzdUX2tgJiY8KyNPS347Zj8jRFVQKWM2R3ljXnZnMDttZykrfDYkCitKR2hWdFB7PHVGcVkkTUM+QE5ITz1sTkhAV3RuN2EtYU5rVHtQSVZPe2lqWilaSmolRVReYjElKXErb0okdzlqIzRXJj8mYWVKXkBOSUVWCis5UXBvUiU5fFNofkAzQCgydV4+Zyo4UFNoMkNnMz8oJGc8UzRXKXgpNSpRV3lwXiV6XnFKXzdGdlB9dHdFXj0zaUBIYWUwe3hDZ2pSN088Cis0eWskZHY1fHpXJTJjbzUxVSs8MVhCfjJAfXteSHNoNTRaQVF4RV8wITJ+S1RuT2JORDRURkVZQUsqc1JKPnlQJUAjfTNUKn1KJm56Xio4CitweXBFVW1ZR19xc2E/ZDwoZ2MmN3xNfEBHSmVMY2lTI1IoQXsoa0A4X2tuWH5vPnxZQ0lXdSErJk85XjVVKERDVTJOeyhjaTVyU3o5VWdZCituWCk2a0RBbylWYlA4dnZvO2c1V0Q4JF95OXhAaEF+YkdXMFc2LUEqYE9BfU84NHlFfWp4ekNjaXMlT3p2UmxPUExpK1hrYDhHMmpqMDxECis4PG10eFRuK05BZUhMK0pra2BOb34kN0xQQmFaOT1DbHhiVnhJb0tBSWFuRkkrWVFsJC1kYmVXWmVzISY2UEgoPj9aaDFpaTBNVUVmZzNPCisjQlA9M0NkK243VDZEUSlqYHpLNExeXjxRYVQ/UTdia3FvKSNhMyQqclc3SVZ3RndZQTVsUUZOIWhhOEl6dTE0bW02fnFUR25ld1JiN0cxCitjfjFYdDwlbj48WGZ6PEtWWEA+VDR7cGVqO25Pb2dBbEctNihQKFBzfEl3JFhNPzUwY3J7TWJVRE0zNTtqVT89RWgyciRTeXlFZEp8U1ImCis9P34we2I/WT5EP2ltJDREa1RySmkwUlp9eHVKKWRKSi0/X2VpeWxEd058dVNpYEh5S3s2VF5FISpFT0JVbj96SWUwaVpFV1BlJFM9M0xiCitjWDl9b2krPiZBP1NXWHV+ZDBnPGteKn1zRmxsfjAkJXZ3MFBTLSVjYGFLYXkhTH5OSlk8MjJ2OzlqXjZBZXFXUm51MFQlVyRJV3hyM3UoCitnTzVSYUQrWkNeSXB6TGVMIWxxSlhTaUJ3X0FJXilAel5IaiEkcmUrNygmLTgzOXFfYzJHPCRiM3NrNWReYmZpRWUlKD8rcWM+di1NS3hqCisrTH5uTGBIJSlKfWA3UDUoPTFqVHZkKWxSVm4/PlZueGdsaUItSmw2SSNkQ3U5Sj1UfXdDNTI1UkltQ2VZM0psekh9dChweCl2WWFNVVY3CitFKDJDTWw4ITVUbXdBOUpiUG9rMDNHVEF7THZpJl8tNjREbjA9amxePm5kU1lJZUM0RkBock0lKEhqVlRRNC1fYyp9N0xWNGpVIyVpQSZDCitfU2gzfCooc2IzJVdzPmVCUWVDY3lnZ2s9YU9UK3tHe2t+cD1AfEdqWn5gX0NVOCVSLTNAXihKayF4OUB3R2ZNPkxUcUpyQ00yMkA2MiFICittNUdYTFkqNl5VWXpoaitxQiVEb3FNNDllTXdEe3EqVUw5bFd2e3N5fVh6KW9pWXFac2RvPUskdm1JLUw7KmxuOT1gNUVHVFVwNH1ScCFoCitoRDJFbHg9dXpBbEl2NilRVjEyNiNuJllefFdRbnV7SXo2ZmFtaj47djt0JmolYlBMPnNMJmRyb1o7aGBAe3F3dStmNz0+RnszQGVsbU9uCit2Ym9xR0ArI3FHYmVeeHx7UiQrVGI8e293WGRYanB5cnM+fUl7RXMwOX1GbFV6I3QhfilFWWNQYTJFJUYySDRNOWNme2lufDxjOEBlUH4pCit7eCF5P0J5NWV6MyVNZ0R0cShKY3srRlpxRntUTVNyJiVXNERaVCFMe0xLTUhWS1Z0a1dsUGg2MCZvZHdPbDBSVlV0ajJufWt8N05YWCVpCitnbF5+QGl3JmQyY0t6IVVvVW1+QC1aSVFoU3hSJmtTRj19Kl9VM2BwdU5HP2ZLKnVRJG53IWp2NFlAdjdXb3tgUzNFaCg5PnlZYS1YZ2E7CitGOTM4JjV6anBmN1hAfUZXTU5uO3VhPWJtfDBkcV8yN2I+K2dITDxVSDBRYjY2Z3k/UmY/SWAyVStmeTtfTlolVW53ZSNLPT1vRXxiWD5vCis8UXFFNiZObUVoMjVMKSphN3RfSWhETTxCSlJoKUpjKk95MT8jand0V21Laz5UUXkmcEtkanF3cEZQIXBIVUVoJl8oUkQofCp6WXNnfEgjCitkcDVwIzYhQmtrY1V4JkJjY0Bya2kkIS0yJnJXcj5WVjwyOTgjX3lzJT5rbURrfEoyfkJ5ZnFqVkIoTmpaaGEpK3R4NWg/MXVjNy1NSlhYCitmRFBKVyMlI35QMys8cEIzUns5O0o9czRsO2U3QmslMTtqRUIwY0VvWFQrKUZDeyZ9dTZ9TVZCfChfYmU9T2hYUlgzQ1NOfTk+bGVmPmMwCitEMmFuQkZkPkxrbmQ3ZFNPWXZFQCVORUQ1WmRscEdId0QmRDNpaj1ecmw9Q1BiS3g1OHk4VilnKmJkJmorfVA2YER7ZUp4O2VFOUY3eE19CisxMDRNWFJkMXJNaHgkaWFhaFVzdm1zejJGQmtxZUc3cjclWS1rRE5Naz5CeCFaYDs2REN1YkhuPnM1VFRMIXJpc3txUWpCQW1SYnJvUyhXCitGYXJMWUF9MllRZjQkRCFfUnlpYnUkTVlhfnpDI3o0R1BCUWM3PTQwaz5razZQTXVGPyR1aEVBT0NJWXE/YDltTSY/ZVo7NCZBQXg8LXY9Cit2NHRRJWdSMkN2UChQUHR9eStpa2l9d0lMMmlRXnB4PT0kaTlmfWBIP0RuUShzUDw3Z1V3NTZHRitvUH43RExVRkc0JWJkXiZhOHxXKEEkCitodH53dzQyX2R0WlhDMXZgdF4pY2lET1RtYUclTUhSQVYjX2BOUUVQbUFDNjtgY0U5VDdJWD1oaD94Pz1xaGk/eTJeZkx0RkgzR0pTP1A/CistO3gobktEfHxedE5hUHEoJTtiREhYTCU8KHlueHFNY3tCKntPJUlKWXdgUVM4VHc3cjkoUzN3eCowWXlqY35ZR3hePX1aYXNKI2JYY0RKCitMbiM0M3k0Um5jSDh0TXs3VDlQaE5XMjtNcUdqeGZBI09HenNFXns3YEc+UFZRa3xxKTRWKHJkYC1WLShAUC04OEQkfWBYO1pmVCVOXnIoCis8RWlKT0hjNXkzMEIyPmwkYWorTzZOP1JKJlJnKGVZcHAtRWhiN34tfEVnc2Y/JS15Yik2bT5vPHo5aEolZkJHbWohKTlNbmVVSXhkP3ArCitmQzw7K0NaTCthanl8Z2piK1lCIVZuZiotSl5jVGZLQ3olanZjaD41M0Fsdj09RX1aOyZHMUR9UGk7Z3g1cUgyQWdXcTRMVmF6cm9xaXJHCit1ZnFOemUqdVY9KFY9MGtZOHd+djZhSjMrMVp0eC0ldSZ8eUg+dHB3V30pXmg9aVJASEdhblNYe0k4M0FMRTBqSiZ0bGpEeD1DUTFnYE94CitlN3oqIUhTbVFSdjJ1e2BsQEkkZyl5T0pEc0J+dWUyI2U4V21XUXhSYWhjVWNTY2JkSVlBQDc/VTw7eGJPPF9veDtJS1dTbWM9Wm85aCE2CitIUmNEIyhSRn4mR2cqSXVzcTdCNC09ZVhsTSUtfjg0QFJhbUBnRzxSLW5tbjdKNFNaUW5OI2JnPUN9TjNkVUQ/KiFUWis8Vj5zMyk1WGJVCitDI1R1SyslVzJwZ1FBdUNtV0N2PUYyQjxUP012QVVBbSU1NDNOJmElNkN0SF9DU3F0a1l3Sj4yUGRMeGZVR1Jje195VGU9TEh5M0QhPikhCitgfVlgWipqO1ljN2pZKkBQRG9wY2t9cSF1ZDRObXBWSVAwfXtGcW51WlJKdz4xQTwtb2JBZDZ+elNzZm1gdUE/UXJGM01jPz42O1NYS28zCismN2pyPkB3XjZaRVJkfURmIXFEMXErN3N6N2VKMXg5UEE9dWVBQ1c/c2MxNnZpQkJOaiopRz1TczElWl81bnF7ZXd8UCkhYXUmTzFTSn04Cis9YFhnK2tSVVBEckYwV29hK1B5aHNxbTlSTkpMNnFQbypDO2sjJWlDWV5mQlFOTj1mRnQociowRis4fSRWQERsLVJRPntHOytuJnZpUSVZCitFbj0qe0l3OGc8Mm00X1c8Sj4mKFVNP1BSRD5taiEoZGRNRmtvN1E5KXZaMDRgN2tiRSpMSnVrV2h0ZkA4OUslPy1Fa0ZhQVhob0s0KEdwCitRRG4oKFlDTGk7RitQLXF7KSQhVm55Jl8wVGUpP3R0NilDQWhxanRUP21fTEx5flc+emtldzJuKSNuRHcxR3l2Q2VSVGx0azhDVmtYPGo1CitqN3BUcSlMUXA0OUZ3UjdvOSFkR0N5eUxUfjZfX1AoU3NKaEtvPlZAUF5MWTAyN0tpcEg/Nit8NCE2NyRVT0o3Jl4hciE9MDRrTFVAUFFtCitYPDg4dDh+NXpFbEZxJHVVcHhKVHJaMHRoPj5LZ0Y8Yl54cGZVVkcoSE0kdTVER3omVCN+S0VGd0x8VGgoY3Z9JH5KX0okfW0pQDNgT302CitkSHRwS25wRH5USHBzYXlgVjVTcCZMfGdtcCpEUUJSPFFXMnJIYjB7cGpiWGNDYG4tYFlGOD9LTm50bio+IWgwRCNIc3NIMDN4V1ZkQCNLCitxeWR8ejsyZSYzY1ZfMmZ9ciFGT1V1V1E/ZVBMZjNAbEBHTHM7WC0+RFVjMDJLbyROPE50N3M1S0RBfkRERXV1b1BvTWs7TnE5ez5sNXY/Cis1MiE2ZHE1TVQtYmBYYn1hNiRYWX1ZUU1UIXAoOXd6RXJjNEB3PkoqNzY1SnsyZmJjMU12QjYwcSRkV3U5OGpIRX5gS3woXjhzNUIwIzQ9CitvaVBtdGw8MUNHSVdgJj0/WjlYdW9FYGZsQCFVbmB4P29NYVAkRlpNMmVxVD80T2JJIUlfN24+YlhJYTJ5UV4/O3x4KkV+YyQkUCplJFAjCitkYzdqdXZUYUFjdU9ifDlWaGd2WVByXnFPcG1IMll3Wm5mQ2E2Y0dtNnEpbiQpQT4hSCpkdjI/SUFpJGtGNyReNVVqWWloMChxMDVvdTdHCitwcTU2Wkw2JighYVJvYWNBI2BCaEBsQStoLVU+Tyl5ekVRUzdXUFgkQSVhPXZ7SDliZEc+M2c4dER+e0lTPiNnSFZTK3xWK3FgcC08JXghCis9cEVHUzA5aC01WWQ2XmlQUDhGdEAxPkBLMmg/TzNBd1A9RytUMFp8KFF0Rmg8N1pxRlImTnI8VkJgZVNxKjsmZjNiTUNNZTBZO1JaRHEzCitJRitmKmhwdUllVldYbyheJllFaHZ9TUJGVEU0ZWBSSmRDTFNEOSt3SGFxc1dyM0ghTCNLUmBmPGZaM3Y2U2w4TkM/eFEjRmlHMUR3czF4CitYe2BIJWR6K1MjJnFDKGMjS1R6ZDs2dHlhMnIrT2xPeDh5V2JpV2NjbzYoST5xY2lRUHZ4RlMqPkdUUl9mU0xmYDFkLUI1Kz0lVntyciN0Cis3V3wqdGB8IXhEVzVWeihsK0d9bVFEJHtEc0NXPilOTCptN25fKVpUWExoWGRfeWkpITtPIWFFWD80RjlaQU80MkB8ZVlzUyttcVJeXlp8Cis7UmJLKGM3emdsRjc0RkJ5TEBFVEx6WUVGUmB1MUFCNHR5b14kdDtVb0p0KFZydXx+dE5iTGd4aFhpdjReb19xWHhDS2Q0Pi1tfDJIUWI8Cis0RjYoe1I7fHFncHZfVGJwN2M1TEluJFMkTXM7I0FZOVR1Jk4jOEVHezdobFAwSTUkZ21wYD9MNFUxK21pd1ZwbiVnWE5lVT0wal4zJVNmCitfVGVSYnl2M3BYTkVnITJLanFlYHMkcStgfFI4d3pXbHRgWm03aVlzbUZabktwPzgxKzZDSTdWZ2tvelRvT2UqczNkKFkxSlFmNSUwI011CisqYlQ9WHNQJFNANio/VD17Z35AVVRjKmBvdSs2K209TkhBWVF5VWpPZWBPbHxyMElhRWoyTk9hXytPVWhVWkVLQDVtMS1DPzxae3sqLTZ4Cit1QnlKaVhyYTJfeStnJWd5eG48JUgmSFIjYT5aLTd9REliemYzeWs0NDA4fW9sQlYoLUl2YytCI2g1RmFHKiUzQHI+Q354SHlUZ0lqXzJ5CitVY3smczwhRU9kWCkyXj9ZWElTQkxQRmxCIWxeOFRUZ04qSyE+TSVpPV8mX1lee2NPQ21ZJTQoPjhGe29VRD1veDJAPlQ8KTZnK05CRV9eCitAUzdrQyFLVmRlV3E0WjxzcVlPbFppQFBacE97UDYwSlMlUURxMmZIXzxaIWpyYzsxOS1DYTNuVmQ7LVVYO0V2P0FiRkZMcWhMb312QjFXCittNWR8JEc7KXI9ajJyWEJoMWNJekNPTnlUXlRvU05ZQE9qRWd6QjJ8NGBAdU80ZV56I3hnOTVTOGxUeWEqWnZFNSp1QitLcVVxKjhVWC1KCitxO3xGP3d0b21JSXF4PTlfYE57UVl8cCl7bzNfdUhkbD5eQVUmTCtTPiZ4Wkg+IyE2O00zZ2dwYHVrTng1MDJieUF8fk07RnNZN3d6cGEkCit3c0hqMmluakd5aG5UPCtOUHE/LWdNNXZiV0BmMCp0SXA+e2VgUlY2WjdvKDdAbnB8JEdqRyVHWSRAV1g7JGs8PyVjaE1aUDJsV1dYX2AzCitnPkMzWk4wM1U7Xn5rJj9iRGlmISswRV41SCFzU2JsQVlWJS1uODRudl9+WXEtPG1qZVRHcF40bCR+aWVqKkNGM0g+e3grTj99YTk1ZTY1Cisja25kZEVHPTMhR09NPzlieTlob2QqaHNMQlVeUXJuU2E3fkg7PEB1PVRGQTdKZDZ+QDFXTF9vbkR3KV5HeWlSNWZuS2ZrQWwzODJraD1XCitkPCEmUWVHcjhHRSpSdVF4ej0oeiFuT0VvNVctX0NgPShBRitkRlNgKHFeLTY/X0xrVX1FQFRASkg3RmE5U2ZxUHZZSm4rWjBITU54UXsxCisxP0NeKjI8fiE1O3tFbHsmZDgpcmtre1daPyE7Q2tWVzcxPSk4SVRxYytvPDxSeFctMk0peHBHRTBpNXY4fW1DVFpYJWhwRFRwcERDb01nCit9RjglN3V0bFFLeWBLWXZ4RGdoUDxFTSNiMjttJHRzYFJxS3xIfjVmfk5gNjMzM1RjQUJlaT9MfWxISE9nQSMhJFpTSnE4IX16VmJTMUx8CituSnZndmsqT2xua3hhKz5idDlHMFF1PHZAdSNzVHoyUjN5Ujx2Pns1KVA7RGpVa3xvIV8zQUZvPHgyVkIxWThCYExhbm1NeXUpO15zS1ZsCitHQFJ2V0pQSUQ9O0JNNVdGan5ZSzN7T0lyI2tEc1VVbFVyN2JifndPenhhNnE4LUBLIzM7JUlRR2F2KT83emJ4OHlmYm9YdW9RdDg4ZDU4CitDQGljOXRlUmNaVU9Ydll8MTRPT3RBJD12b34xQn0wcTlLTz9ocVdZOStyPm47P0BBNHQkVzVnLXNYQlFTQHtKbytJYVZSQ25DeWd+dlJTCityWGMpcmAwOE0xJGZndzB1UjJSPTNgcVdTO0oteT1IOHN5O2JtbHczMkxKPlBBRTd2KGskTGJ6YjZyJloyX1dtVGktalooWVl1N1RAa0JhCistJG0tVldaODthPG9lY2p3VmhzTjRFSjA3bi1KTkQrPkl5Kjk8T3tlRGtEKU0yb3xWVnZCfClmM21WalkpTUMyQD47UWN7dEgmUkRPUHZ3Cit0O3VUMzBPWjtReG4zXmQ5TnxqakhSVmN0KyZqMDR5WnxtOGZoTnxaZ1NtOTlEIzhkWWEkSmtTMn15fCk/OEBUVzN7RUg9LTlvSDVlPCk1CitRR1BEVUMtTkwwcmVFYmB5KHRjc3NUNTRESWsrZERrUlAmNVczQz1Ja1VVUWsxNUEmQUc/MT94WGlieDR+TDZBfjhRdSVEUyFLSnkraXh1CitsT2lse0xSNXxfPH4oMzErMyFmYWIwM2UjS3FZfWokR2VicVZodU8zKERzcGh0NXFNSWM/N2B7ZVBUSjUlSDdIdlZAPWZiPENQakJsTSM4CitzJF50KSpmP29ROHR5Xk08dlZIUHI1NTY1NFB6Kk1zJHokaCRfbSVCUXpHYyRlIU1UYFBBS3RLfTF6PHJROWs/Y0ZVUTV0cVcrQnx6VUBECitsVGxaV1BKbTV4a1ZoO1JYWGY0YlJ7RWpGKW03Q0BIZCNpY2x7Zygwb34rPUZicWBGVHxLVUx7TX1fUHdraX48c0M8UjBRZTMyIUZoUnhKCit4KngkZXtjVTUjNHoqZmJWcj5hRVRDYlMmRkBrM1ZwUUt8dzBsQm9iZ015PHB2WmpQallnWGlfeV9WLV8tZFNhRC1pPm8wI0FXcTZNVEclCisxemFffGhOfFR+dkJ7eihSJSpMelNTYzQhKGdwITI5PDRqcl5nI2tGI0BzemxfJn5uSXRZZ1YwJSVgRj1ZJUhlZFRnU155dXk9dHJXUj8oCit6c2x4X2FSZ2dQY2pKaSluZ0Uzbkl+MiglPH1FaDNRfi16JXZwMmtEckgwWlUzRnVYZiMwSV94PyQ9OHN0dHRqU3dPOHRUNUZFXlJgJWJ+CitSbyUtS054VmEoI2swdmRAQTx0Rz4zKT5La3p0VUxfMWtBMXY9PjV1NXRUK0RQKHNHZyVCaEk0e2lJekM2aWdeSGZLZFpST0c/PXAhe1ZaCitpemVSPEg7bGtMcTlUYy1kdU4+X1JSMUlPaDt4NkRVTm41SGE5RGFePm0tdHNgJVdEOz9NMm93eU5xOy0qc20zPWtgXlc7dU9jQ3N0NCtQCitpWFNhNWZqRGstNzYoKzAtaWdCSyM+eUU5ZypzKylnb3dEJEU7UWUmMHl2azQjeHRBKEpUUiZ3aUMhdmtlM0pPMDlFdVVzPHUrLTdrdCpxCitXPjRaZH5EIU9jMEg1O2VXVU4jU0c8OSRsfGd8UktBVFEqPk9uKDFjeSQmUDgjTmw7WiFldSFSVmYqcXBnS1owV1FOKXdWODZuaTVLUG5aCitgI1pTQXR6KFhMOGVIbXI2Q2J0JUpDTCpmVHA0bUtCT15oZn4+amBVal9GdURlOT5OP3NLSU13cFJNYEQjcUhRXnlrWj9jWks7cEVkWWpNCisqRG5PfFZPRSViMEcwZ0puVWs7OEMpPFBnUlotbS1ObUxuaz1kcjBwRVUkQ0Q/ZSZeSkIhZntkSGdieDMjR0F0aWBpKWw2KWRTeXw0Unc5Cit1Yz9FK2d0dmFWd0w7e24/bHdUNCE0YT9tY2BWdlVkSWJLUHx9YT8rbGgtJll3P004b042I0o+PVI7ZGxIblptcFpqZHxYTUBYZCp2RFN0Cis8aWxPfW5zOz8kU0U7WXVvN2M9LUY9RFpxbHsmaWI/MWgkSCFtMjlvUjdSVkp4ays9dVZ9K2UqOzRwdDQ5cEdrQT44T2ZzbkQlaz00diZmCitmKzh4dkZOT0U+NzliRlNSK1RHWShvYjhZNnN3M1VhekU2bF9zUkt2JUx+ckJmQDxLVjNxPmk2U1hZZCVeYEVsJit4dklTLVA3V0FDJlZ9CitJPCZVaGFrVVJgYWZ2Q3MxX2l3SVNQO0IzKiF0dTNpa2l7QFE0RDBKR3hfVjM0NSZVbmtwKE50UkcpTn5JKz42XitgcklGV2hIdEZAaShiCitvO0BsRWpJYklId0lxd3oqNV47K316fD95STVGTj1UM2JoentYNkhyd3UkJmUwWGVuVT0pNDhYaHg4c15OJTVqPTt6b20qLVlWaDxDRCRECitETCQlUHB7RzVEKHEqMnlkUkwpUiFufSNAXiYtd3VocmYlcjA7UEM9QjdRV3N0KW0lMyFAcSRGSV49OzBZajxKcWIjbzQ8Ym9xZjUpdU1PCit0QnNCYzJ+fHpGUTd4e2x1MVFKJlduI2MyM1gmfVBLZzQwMypEYSZ8NUNpUnFHV35nK3Y9dndEZVphRXlEZUYtcmIpIS1iNk1EWCRXc3o1CitybEFMYmM7ZFg/bV95RUpidjRMcHRVPmlqdjcpNVlGQ3RFSilSTDJFc2E2dWN2MStIfm0mPFJ7WEVQeE1vaXdjOGhAVDw1eip+aGwtKTBeCitIfF9pdjI2cXhlcGdvSEJlfDxgXjEzZmhBYWMlMHpRVGBHNjh8S3FwYSp0JSRuIzFhYWA7YUgtVDFneXZRJXRqcEhJU34jTVMhdWxOJm0oCitnN21SKWI9eTU8KjMlIyk+SVhLNT1eLSZJS3JOd0Ikaz9VIWJ6MjMkdW1nWDxAb3JoNn1UZUMwPnxybUh7eVJFTWVrUlozel5ueVR3ek9KCit1UXozXjlqcU4hcWl5VzMpOUVhTnw+RTJPQCRkP3VAaCNuPD5tLXJzTik0WCVnQC1HUVY/T2VEOWl6dD99UW1eSVdFazIlUnlsZHdkQHc9CithTFlEZmo8UmVQPUZedDxncWRvMkx6d0I3Kk15bUFjfk98VG1JY0J6U1lgYHppbHREUCg8fXV0M1kmfENkPG9haHhjdEkwVDNFNFgmb1Y/Cis8YWc+JiZ6cHo0WHdGQzwqS0RvQWQzaFQ/VGJ7RSNBdXl6I0k2fGxNcj51T2s/Z2NZWUlTYmlVRi0zTjdMeE9FclBkMTF2QzQ5aHBkM05nCislYlArMGVpOSglWnFHUFhjakhWS2FwI3JgS0AjVVpBYTwtJlJ6KjJUaCNVZEI9P3RoaHRPUVlmdDBmbiYpUioye3VeVkhKQyVNaG9qekxCCitGdEc3eFc4amppNnN4WVgkd25pcVgqMFUwODhiZn5CTGRWdVBvfVJZNGl8cDwzKlAyVHAwU1JPM3xEJjIzPTRFVWEjQG8pdVBUR2NDdTNSCitTb01HIXMtcmR4dj0oeGIoNjNAMHFmaHNzKTJSNnU9PkVkU1hjdktFZnY7YVNQTyshMlchNXRNIT1kYnRPSDtqb2d8fGlpPz4wLUJPY1pXCitWYTRmaW1PeD0wNHJefj05UitKd1ZTTzRfSDw1X2puOTtWKSZNP0I8TUMmQVcqd05feFRjUzlWLWNqb21FNCV6NHh1fj5HQHZfU2kkd2l9CitlbmoqVnc3Y0s9cFRIazNjcjQzfjchbGl5akYwLSZWKUV3MTk+b2lvM0glQ2d6UnFIZmRifT5wV1pNMDZLV1M0UTBpPHtRelkxdzc0PGtDCitzJmxxJFB+Ti1rPXhRQFpUWk9MQjQ3SSVVYyg5Vk0zbHR5OGg9KG99S0ApO2k2U1U4O3ZrWFpMSEo9RV5QP0IkbylTKHxwPEduQisxKj4kCitGZ0lzU3F2JnYwQzU3R1dHdStXPCZqOE9qaT52OXBfLTAoU3FuN3YzOTFoeX5RS0x4P25yN2c8MSRMbF83VEc1Ymcmb0VybituWGojcyN3CitLS0ZjcjglOy10fWU1JVc/Jnd1R00lfHkrT2prWGlOUXlsMDYpUnJibXEjKTx+enl4RXBnQjk2QmZUamBCcT48MyhNbiklOGtHZTtEamEzCitMMX5xYWtVZjJYdGtxRjEmQF9eeXtoKENjPUR1WUU+YFBtazJmQklHY3pqVmgoNk5MVUtBZU9EYVY8QnUkfG8rPVJ0K0BtUmExdFFBen17CitOMCZ9RX1ya25WKnpRU34tdi13RUhANnQhfTteXnVzcndfNDk/fXBBJVpEXlotIS1vYzJqUWlfRWU/dT9pSjZlQGk+UT9uSTQpbSEtY0lJCisyY1g+X2UraEJlPjc+OXZPRCk/JXgySHQhVXQ4aklfKmxnenV0UWluP2tXRUp4Zik3aGVtT1U/IztSZzx6O3JTKj1TQ0lrYXI9X2dUNUtWCit6YG87WT1fSE9DVSpEMCFiI1BvSFFOJVdYSURfIVBFM3BtYGZoeHVgSDU8V3MlOFA3QWVYdDZGcWdBKmJOJEVUdmY4cTVLVUJIIXU4UFlaCisxWEV9RS1QPj9Ee19yN1VOTjBARn1SeTZhTlk5Kj03Jm4jbEAmT2E2KikjNXVpLWNYMlNaYj12Xzx1Z0hkWVRHbFJTRm8kNTRRSjlRT0VwCit1ejgwUDtHd3pnTTFUclF5KDkpMHVaXmZ8dUZVQzQ5eFcqXlkjeHVCKGNaRj9DV2pjMzxFPkxYLWQxeCZTfFBXMiZ8S3hhZiNAKzBZa35ECis5YCkxe2FybHVXc0Y3RyhIU04lZSpuV1M1Q0gmeGlwWWErYU0rcXRaQWJrRn5wcyhxSndqSURmYTlfc0ZCaiYpYTY/LTEqUSFEam0pSjdhCitIKClJQkswJmUqTmxkQmVqTTdUMklLZHQtWllZISNIXlYwMU5BSUdUMWlIYWwtVFlObmFzJlY/UHprRE1gOyt3SDkwMGghMylIcVZ9THA9Cis1cH0xU3J6IT5LKWlRWUZNM1MjLVgrM2FnYmJoQm1LYFB7akhgN2A+TUhyalhwQ01ndGJyemA9dTwzT08jPjBwekAlS2FCLTtVeFVZR3xoCit7fSh6O2xMVCQpbWQ+fWVHUmtOYDFsRDlecSlAWD5DIzs8O2IxX1ZDY08laW03VTZ6Z3xleCtPJnk3SjYxQ0s2O01DdzIxck02elJCNUlfCitXQHhHLUJEOWUkQF91UGhVREVuX2Y7ckIkYDk0RCZGclZJSE9WfGZiWkJ+UD4/Izw1NmIyanVLTzFjc3lyYWc4K0tqdCtGYGVDeFl7bCVhCis/V1pPeCQtOWN4SiYyY0NCNSR9Q0xYQURpVCNnT09PU0FTISE3PlZgNmhVWVdsWHhVaEkqWERiMUk7KmlNdHxxVE95VGc/d1JHKmMlOWozCithc2FnYzBoOWdkQThGVyMrfjI+WnxUZjh6NTUyfnQ0PnU+QCVaUXdaaTB0UiZiKmFGWENFTDZoR1k+cH5EZjVLQXpNQWRfR2chSFdjKzZDCis1V3ZOQU5xcmdFdHMrQy01VlBDM3U9KDhvP19CPy0zail4SlluPXpgbUw+U0FzNENlZ3lwcGg3eWI9RmM4Y3FTV0t7alU8MUtrZl4hNWwxCitQX3cqX1h4b2cxVklFNTFmdkt0MzEkKyFMYT5vdzdye3dfPmpkXlVESVM1RUt0c0B2QWR6NCFLXzxaemZfVmg1NU5zeWNPPmx6WEppK3l3CitRbl92VD9hczM3KUlyQmk4ZztEeTUqPlNXcW1DVUpzazhiJHlHTz9rYmtOLXlpSnNAYlljJmllZGEqR0MxQVpuVFk1Nk1rNCtDN24qZnsjCitqQy0tNCZEMnJtZlNiJlkpbGxpZSY3QWV2aCNzOyF6N1MwQi0yO21aKmxOVUs5IXd7ZEJHZnRtUjMxbT8hPDUmKk1WfHgxUSV+RHc9e1Z7Citxc3ZUU0J4ODVCYSMpQzc2LWhqNDA8P2dPbHVGbyNsM2dJRUluKkBsc1A2RGEzX3RiWmR1UjN7V0dqKWpSM2pycnBsTFVkQERIfnFvMjdsCitrOEhpdklNM1EhYmZtZiprcmE1KUhzSFBVSUwlSGMqciorfG9xNFN0NHZZUUlrKSQ2I0M1PHNmO0NCcjs8eDVySUFPeio9IygkV201PUhVCitMYURhT0FHIVAhWTc1fFd3Mi1EYTU/MU9qN21hREFLX0J6Y2J4Rm8lWHo5UEg9e0AmeyVYb01OOH0yPlQ+OHRqIyprOSVPK0x8ck4tNVBXCithP0thLTJzeDNgbTJkfUx6JUViWldGJUxGJHN4K3NCRTN1elVaTn5UPGdBb2FGRl9tMUdLMGVDMzE+Q3kkQC05TUNaK2I2Q19RayZJNGUlCitKPChibEdObzVOaCE5QytkP2NAbnVeNkpIbTVJRHRBK3pkZ2RRcyt2MmRzKnV7bl8/SVFlYEpmJjhjKCNVRFRpRSZKNUhgJkRmTFY7QzJFCit6TGw2PG1rTzA7MTxvYDFxdWNoPE13cm82KWBvdVA4UTxYTF5CNjMhOCZoVzdOfCE1MG5iJnsqa0VhOGs7eEYkeil9I1BfMVVMeTJ6YEg5CitBJTwjZTA8ayReaUo/KjxRVnZ8S0ZePyQlNFhyeDNrOWJeWk9oNWZsRXtXV2A0ZmJ7QmxLMkE+OUhCcEdVRWJCOHxwY2o/eHpFUWRIOU9gCis1WDhyaSZYViZpb20+JiV1JilDWUVHJWVKTXM1cWYlbU5NOUxofkVWPVQ0ajlOOGJlVjFlTXEjPyE2T041QlJ0alQ0eHErVklUMWArSDl0Cit7JUpnJkVWLUE8NUdeaUdxPyY1JjExQTF5YGhTT0M+Z1NYeSR+IzMpVH1pakQ5aW1LZzFWOGk/e2I7JXZiSXtXRCowUG5qO20tRGB2OGtXCis/I302U1M5ej5tR2lGWlJpezRfVDhiTn1oNChDPkgocGBANjkybWZrcGBzKn1OMlU2PmlNeDAhRiZrIS15VnN5JENFX3ZjeiE5dDNZVENYCitlPSp7QTE4OWQ7a0YhezZ3eyFwSWFkNWtmO0lyb2tzcD12WFZibGxkVXIkIXJieHVYVzsqdjItJXFsaiVsZzJRdD9sKlJoVWQyOVBQdnhjCitvfVRhTE02WEdDUHhiPTFaTkJhSGYjP0Q0QkRRPldLZHNPQ0B0RTxTO1V5QUBkMGB2OWpuK0NpVnQ2a3tLdTNNeEdkX0c1JihLTUE3I3Z5CisrU3ppcGclUjBUeiU7KG1UWTR3Q1E1cyVwdUwkfjQheS02VzVIQnpOT2A7bmxfaWg4UWYjQyhRSXpJbmB0MiolUDVtNHF0dTVrRmsjPkImCispUGUtZkp0PkEhYU9Hbm5qaEAtWSV1S1IyIU1gMko8SUpINllodiV9NyNTSnFndlZEeT1eJnN3QWJ6O0JpdXIzYU4lNzdrTTV8RntPIWFqCis3KUFVZWI9MSFxVU1JbzNvUT5uO00oVnclNXtwWjE+elQ+Wl9fM3V1PEpPMmh5JkRgczZSd0lBKUwoSClHdiVBa2YreFJuV3tfT0FiUGw+CitEay0hQV9EMUQtcVVIMnJePzFNS1NsPylSejMwZHtxTl9WQFckI3t2Sjx6ZHhmTmV7SlpgX1JaR3N6RGJ0cHVLI3wmXnchYmMmXyYjPCZXCitkTnVHfGVpUkohZnZ8Sm9FZ3IxPHgmOV5zbmFeendxS3FGRTRySil1cWNgVGZYQTttOCh7LWRFP0VzWkB2QV94Xzk2RV94a3JZZTZWclQ8Cit9RHc3XnprUjNaciElTXlrZmBCVTd6alZ2dj1SO1UraDB7QFgrQlNNfns4XikkeS1TZH5APkQ+MkpVTHs+PDVQS2IqZ0NAa2RNTHJLLXo2Cit7ZTAhPkZUWTs5e0BhYn1udyE3aHN7UHxPWExqfXVqIXNSU1JaV3tVWn1DNyY3dVF3fndyPG4qcD59VFZKOU87eUBGU2hvazlPKG0tbVFDCismb3t2NTVAa0ZvUWVLZWs0LWFmdjV7c0RuTytUZjdCcH1MZkA8NUtsJDxJXilIT3c3IzYmZEhzV212MWxAT3JBM0puVVNNTGs0Yip8Pyo3CitrQ25fZ0otemZKJURjSy1rNkAoPTQ1OXVYUFVlP1dCMWxkKjlGMmdNSF9rfXp+d1YkJCN0UGY2dX1jbU13KiR7JTs2SEo1d0Roc298SitoCis0Uz9teXVuTzh5NDh1cFI9KHF3NlFPO3ZIIzEpez1BS1Nxa1d4eWxaX3FQaUtiRnxWeCEpWkJ0O0VqMUwtJGJ0V3h4NTVvQylNVldUcWhxCit3QDU2bTxmN0FWb0loXyohJGJxISFrMi0jdnY+QCVJan1ROFFHfmhsTUBVbmhLIXRTeERVKE09TTVTPUt8anRBb3Q+N0dtbkElc3EmVHJECitgRyZBQGhLdkd6ZGBfLTBTR1k7PFFaZykjUWNNfUlAMFQrcmk0OXszMF41ZG87JVFQYEppQjtDRiRyYEl2eHtmWEVOPGlFTD1zJnxOZU5ZCitlTXBHUExKZVE9aW87P0VNbFpyYFJCY1Uhbjk9aTxHSiZXZlNRIUdZZVUzei1ETzY1RXlIK09Qd1phc04hMFIwNyNMPHlOUFUjdzcpPkA1CitGMSFMYXJ1e2kmQGtRe19KPC0xYFhrS0MlbFZgNyV6SlZYXyReV2BmZSU5Y0ZvVzI5aExPKDc8aHd5I0EhUEIjQGFhdWtrMnVWUGZXRTZsCisoIV5WdWJXTilvUkR3UV80RzZ0UFctaDkzaThSISMjbTRpdX1pbHdYUW4zSnd+aG0pd3hMY0RtV141RGZsUWpEMHdVU084SEUrPUI/emI8CitmLUk/YlcrNXNMIU93RU47cEliWjBweyEwKS1JeUhmfjhgd3Z7YmJwJW1BbDZ3M0JKUFJ1M2k7dkAqJVl+TkReRW1EMztLMSRrM2RQK0o8CitlNEwqZ2wkOH5mRlBJfmhvK3MzQ15yJkgoTilMO1I+eXcoPVhSNjJ+b35re0pBVk5QKnBFWHU1RHRCTmBmej5gfW9GTkMrMWJ3YlNhU1N0CisjSHw4NmxlOWFWVCMyQitoTVRYXyhXciNYViRyfnI/UGRfJSNuMzUtak55ISNnJF9NRXFVOElTJGtQZ3pJY3ZGIUU7dis4TnUhSXpZRil1CitZbXEhRT51QSM2al9qZH1VOVRhckZDVFE5IzFIQT1SKW9OVkVjVjNmQGkxTDdoYyFYcTVReithVH1mQV9IUEMmUk1QOXQ8UmFlZ1dTSE01CitQIX5HUyZMTHlxcjlCTXolVUwjaDUpVlU3cmBFP3ZeaG10JEJoJjVpVFFCcFE8K0dzQj8xbCo9cWUxe1d6bGBXbyN4WVZefXNVQEpwbDRPCitQIUxmUFJYU31zVDNaeUwhRFowbj1wQyRsdkgoRVVRUU47N1NVUFBOMlJfakNUQT8rVkNeY15sWl5WanNUdFloKW9DTDBKTil6WTI3YD9eCislUXZKRjM4fXsxJSMza1QyKnBTRTxyb2MoZHkqZCZLO3dST2MjazgqNFNJRjEpWjQzI2BOK0NReEJNUDlXaXd1SHByWGt6c0tAMWA+ZVZACitFTkAmZGV2R3loUEw2SzgoWDs2QDJORl8kJHYkOWdpTXh9O2lpSHNoLXNmPkhUbVk9UjRuP2pENjhRSj5ZTzIxIzFoQ1ZNVkJSZlNEMWQmCitMe19MXmtPQXc7UjFZXnYjUTJAU1EwRjIkUmlWTXM/JjxyYEErWUBGe1N4dz4pP1JMVEMwKDV2N3FAdGtjc159P3A9TUtSaj8lZiZ1eVhqCitIRiZKSmFwYXdUQylJI3ZHK3pGWGN3Pz08I1J8cUtrJnwkKVlhMS1jajYqI0pQSkpHKllqNTxCZUpSWSh1YGZyQG53JU8tN25wcE90SHZgCitxO2htOExMKy1PcVQqVjE4az0taCR3X0NlTzM8alooVWU3PmZ5VzR4WjYjdk5ZO09zbyZvSWRLaUojNHslNCgjb3JXWXRCeig0KzlzUm49Cis+OX5LelQ8cXsoIUd+e1BxN3hvODNVV15WczY/dkpzaVIwMWcyMG5NRG5CRERIJmRVaV5lM1orPXJpPnhgVDl9ZXZDIz5fRF5+WERvdHJ3Cis9Q2VOcFAoY0d5SVY9RT4janVTcE5nISFkeEQoPyYzYm9jY0M/dlo9QEpGRDtRS2RqNVd7WVE0YXg0K2lDelc7dDN8OV5HVXV7WE5hX2RuCiticWUpOzN8e21VRXAkOXZ5OXs9VUd3PU1PVk10RnhBSVhSX2Fval5ufWkmUyFlZXo1VENeeFZMfTgkb2w+Izh1KlZJVFpofDM4KypmV2tFCitHVzVKI0olZk5PeTxxeVhXYGhCcG4rdz5GKWt0PWpxc355bkVObkU8PTYpaFVGUG5hUFJXQ0lySEJCTUB7d3A4YDVgVChZXkJ6ZSZPRW5UCitRMGVHe0NfUkl4QnQ1TD5paDMpO0dlJTxeMmhWPGY5dSVnVSMraWZIVEdafVgzWUoxbyFkNi1ROH5nSWVnM284PC1mTXFyTTtjKWM5Sj1FCitHJCMkMGhNaWElYiZ9WDVOMTZgWCV3PFUpbGpnVDxFZWpYWWt1bnZnYnw3TEteWVVvO1EmUE8/bjNSJVhofDAtSnB5NClDRlVLOEVBK3o7CispNmd4YThKM2w4PUE4eUZZakhLYWByMmRDa1NibCFTXy1yfGFwKmVMfnZoUkB0NURxNkghTVg+Z2pYay0+PClqKWpeLSZ+XjN7MSUpI012Cis1JCFIXnt6I2VLWChvSDVnbyhRbTNqS1F0I1BCVUstc1BJSDE2V1F3ZmUhZjFZanY9YT1lMUVAcUd4IVQqeUd4PG59Jnk0aiNgUGRMNGgwCis5fFc3OW9xNGRPN000N01fYHR1ZT8xT0liPmpEdGhaUDEpSiZTdk1Be2A3XjV7UkJASjwqSW4tbXJ3RWokans1NzRMTmlpSFhHZ3xKSkQ1CitJP2lYWSFheCNeRCsjU01QPnJ3aVVrTjM9biQoPERiVX5IbypffEBNfENpQ1lBI0E9Yzd2SkBXNS0xTF49bGdvSDtTfWFTS2h9UWhoP1Y9CitHRXlVX2pIOEpnZ2B8UXZWRGgjRzwjQmchaHZAdFd7YUVBcEAlcF5ASmJnWVl7MElCIVkoaDZCR3ZrP3RoPSptVENnZiZoaHZ5aDYrJEV3CitKdlNFQnEyNTR1V1czRmZPPyZkaGVrVTE9eSNKV149SytxITlDWTckZXlrWmxVbndscGxhSTUxT3NYbk1neDtaNkw/dCs2QDR5Y2ZQcXxECitoaGxvJExeZXIlam5vK05TX2I1VUdMPjxEMyNzVztxRl5jeCUjR1c5ZU1FcTUzfmIwQ3A4T0dFMGdEeVh5OGNYQlpDVVd5JVJKfkYhP0JRCitHWiNHTm58NSlZTXV6RE5IKnckSThqPHEtWShEMVpTVCk0ejtkZD9TYjk4dUMqNiQpKWxZYWNvWGIpZz0mUlJxWmt3UXNuT1hxNXl9IytHCithdEN5QGMoQnZaR0xEdj02VFVIZ3tyY1JQMVU1dGVwNzBiQCVsVyRWJWcpUTstdztaOXdqZ3xXODZmIXllc2JQT0ROJX5xVEh3RTh9d08yCitHcExPNk1VOVkrSnR3emFJMyUlOWh1RUFIO19JPF9EUzE8Z3stYzUpaFVsZHRjdHpyVXNtO2RJY3hDZldsfFZJPVdFWWliJXVoI1J7ZnVkCis4QjxzP3dTY0htNGIrZEhYIXd9YVc3IThWeWdTe0RYSDxlPlhzXzMwayNfUVB9bCRLNUo7WWNCNVlJNT9UXmpMZSlFQTFjd1ZJIzlzMmM9CiswfDVAVFB0JklzJmpvUndOQXdHJGVmQnlOP2xQR1k/clYjRExlUSZmM1U8NzRIMnA4cSRWYXZXUE9vMDRXcWVxOFNpaSMtfjRjUkpWZXhCCitteG1gX0o/THt8RWR1QFNeVU1fdUZyZVB+UHoreFdZPmd2SSg2S19XMG9ENElEMGohI3w7fiFMZnFTKlFqSyhzY2JmcntoSGhPSnRXNzQ9CitfMDQ9RCFYQXsoU3RJO3taWk43U0FHd1otXjFuaWNzYjR4KiohcnZsalFWQSRhIWJWP3BjaDktNEQ8TVVAdWFoakI2NyllNmZ1NDRCNEQxCitgPHJDe1MjbW5LcjJ7KjVVWCRObm0rQElHPWw3PVV6RDM2R3B6UXkoP0M8NiptNCNBZl99WmhtWlg0RiRkaDhtUWY3U2hOeyhtKzYtVGVSCithe1FjKzhfRDkkXmNwVChNaUxXfVhWPlBGQUVjYVUtJWxscEBfPkllUmRwdjVWPWlBJW5fcysrPGAtMTxPJE12cHtqUXc0b3t+LWtibzFlCitSRGl6TlRNWW4lUmVAJXxeRHxKUWp5ZSpRMEsxPkVDZlhZWilPWkY1aTBvSHxvaERZN0BkbSgxN0tOYWw+P1hSeV9tPT9hVTV4dDc5THRVCis5PyRlVjI0Kys/R3Q4WTtMO0dATHtzS25aaDRoZDQ2UkZjNDRKdTw7YzZJVS0tSlA0Skg5LUBYMFlKKWh6a3NncCohKGhDZz1WeUU4VyNeCitETEJOVmpVR1MlaUt5R24/K0RlRnBYZGVmcUB7R0FmNGM4ZzVkPFExVWlCTWYrcS1pNjFXcW4yfDV3RDV3c3oyQzFecFFCNSkqTjFocDAmCit5R34jc0k3NHY0Qjg1THA9M2F0d2Z7Z18wMnYhZypDUmopP3BQLWxebGkrRUJyakIpRV87N2xVQ20yQVdCTTJiUzVjRVhhMVMqMT5BOWRfCitKIUNgYE9mXmBJfDM2PkhwQ1lWbiFpKG5kb2ZncUQwbTAlUlhQPVoqM1Yxa3xtb2R7Z3pAUXdzRTdsfEglRjl+KUx0UzRBWHUkVyp6ITQhCitnY2Y/eHRYfDZRXk5aVXApIy18ZzYpeFopNTk8LXZHZWJDJjQpZiN8Mld4RVRuS2Z5UXYjSWJMcldiUUVgSiQzS1Q2YEg3KEwhI215YGZRCit5fSt3a0A4d1pEYUBXSm43V3ImZUhuTl5IKDJmJnoqeXFafXBfPE5KfVE+RCNlJnsmNlREbkhzUEVfb3Zhe3RAV097PUJIbSMjO2NwPW1eCitFMyluakxMQiU2TFQ/KlVCaChqI0V5cG5qa3FLSXJ5RnN7R3NUNz5ZfkFQSCNyQF5HeFVhcDdgLWdYTi0rTEdMNkwpZDlHfiRsRnQlbHJICitVVW0hQFVZKGFXSjZgcCVWPm0lWmQzVz0oVnsyNylAOHh+JVNoYGMpZChRfis/XmdHSUlEXzZAPil4azRMKlg2ay1wPkA7aUc2SSFgK3k9CitsX0xOUDJJRFN9N3BjN2FzSjFgcjZkaVU8bGB1RmU4bDlHfkdNbihvUjhqVnMjNiZLVGdGPzsjdG0pVjxkelI1b049cCRCTVVlM1AkYGZHCitPa19IOENOLUNffSNVVH5aYk8rPXNEVSkrTVo/M3EwSWthI2BCdWhiVHxzR1U0eytCNXtYIXVRdTY7YF4ofmRrPyo8PTthRTxyVDU4YEBvCitxVl5mQiR+KkV+WFZLYG5rZXUofWUlelg7KVIzREtnKEp6ZlY0LXN6TG07dnw4IUMyO3VpMU49ck1tTX1EdUJ7ND5lRDdWbmdQRSYxYzJGCitoeEBPKHRCcEwyKX0+LXExfT4wd01oU2E8UylIYnsreWMrTDFfdiU7OCVPLT1KKWg9MU81WDRuWUh1dypZM1o4SDFLfFYkZiMldlBANzVWCispNFM4QmBgU0ZWYnBJaERBcjBsRElgUXN8KT5vdUM2Yj9SOHtaWm84RHQ3LU4zTmF0V3JLKX1GNzAmPUVmT3hNdGFBPFh4Yl5BcUYwSiZjCitkMys2UXhVOTE1UntzJmhMLUN0OUNzSkw4JktnOVZUIT94R2QzVTdwYEB+dkUyIS1jbWZlPFdkJXliKWZVM3Zvajc3VT5KekJ5WG1nRD9nCitHcXRMPER+YmpHMUxsdnRwJTRMQV9rNipILSR4ZU02STtjVmxELVVXJlhjcm1qaGEzRjlkYTNTYy0hUk18cnVtMmdKYH1wezx4VlNpJGtkCitWTmhkRkdqVkppYyhATGlZQ0NaP2xhWEh3cXA8ZSo4R1FhTiZaTCZ2VVdkdll6X1ReOz9gIzZWSyo4JVF2VE9YR1BudVkpX2sqIS19WWkoCit6Yko2dzdue3NJQUxQWiYlWSZhQ1FIJDQ3ZTtiXkR7Y0N8MyZWeUQrbnlIZF5BNEhHNkpzVX47KFN2d0ZEJmhgZWRNcllSPlc2ci0hdSZBCitlWTYxUzdqZ2JtYkBoNUN4Y0ZKZDNPamVedUZqbn5iQzd9RTFDJWglR1BwP1BnZmh+SmE9UTF8VGl2PktWOyZ3Sk9yejFUa2RQMS03OGJeCiskcW9ZT0g0SVZ0MEJfPH1hNWhGJmgoVzZKUiFxZ30+ZSpBYmdWWnNFS202Z1R2XjcySWdGQDVAVV9QUX5ZejRKXjZgPUMoRU95ZVdqe0U2CitYZ2FaVlV9SEJaTXJuR3dYXkVza2NkJW94a0l5cXdFK0tsZGEleWxOdXJ4czlfWWM1dnBvbzNxZWVvY1ZzdlNAMSM1TWpoWlJ7N2NUQkpqCit2UE0/PldtUzc8UGBja3cwPWE/aEkjUkZMTzN5I3RjP2tURk1xSlRFdCNAPV9SJmckcjg0Nz1+QXwwI1J8NCYlXkZkXj4oe1Ntbj5LOXtlCitjN2o8ZSMoeVJUK2UzeSFyNyopb1BHQSRYS2RmVGVlQSUyMU1KOT1Ca2FwQnpob3kqb0BDI0Ngel5iMjtSSE1PRGAjaVZvKXZzaVN5ez1oCitVJUFBN3hYSWJvdDU7Y2RiK3pDWEpvYkhQZTI4YlAye0Rhb0EhRSZtWjw8cU1aJUdZVSVeemVUKz4/I3VnVnxJKmlNYEFodX0lRGFfOVpgCit9XnJ4JjEjcVVEI0g1NU9EOz5TfF81ZnB6cyNoPTFrdjNWNEtEYUMofTsrSXFXcVpJJFZQNWtaQFVxfHR1cVdBYGl6a3VTdU1lJW5+ezM4CitfcTFqWVozO3tRUExEPUdkSmloc2k8ZXhMNCkjZ2xsTE9WZ0t5MkZCSmVwZ0dOM0deWHZPTXRIT3A8MG17Qnw4XzlyPU87MEtYJVhYQi0pCitIPVdQNWQ/I3pZRTNKUTJmM1dLYVMjNFQzMGhEeyMxJVRrSyErKmAyVksoNiVfdnsjbEsoXnBNO05pWVJiN0pZfmE0SV8wMUBMMyFJLXBACit6b0Q5LWswSyFxV0k1SHtGZjtIV3tVciVPPz1qcCNqfCRRVyo9bj5uRmxwbktYITtYfDA7YFN5d3l7VGQqKDdlY3NBcGNtTkxGKjFMTj1TCitXJkZ0Wkh1MlJJLTtkKFFRdjkoTGUrdEU0Sz1EXm97MH1KcEhqMk44OyF+Y0JQRS01fjYjdUY8e3U3a0tsYXhYUnI3KHc1U1ZKbDdxNz0/CitqM1JoY2tfTnltbio5VVdVVi1qYzhpI1dVYUs0LVUlYUJLWEk2dSVlNjUyZzQrREU+SCNVcUpFYVF2NCtwe3wkPTJrPmM7NV89aE98WF5MCitORTZKSTVsS3dGQzZrPldvfUB3LSN9Q24kYmppYShzPFBvbnRxRGdHTjJlPj1yTFglb054bFBvPjlQVH1HRyF1b31ZXj9lcm1jK1lPYFVBCitsRGRafWtvOTdaVipGNWZLdn04WDZYbiteYzdnOV5Lc2dfd1RCdDVEYHRAXmRDKUBoPV5wNSN9SkBAZjNAciU2Qml5QzZIM1dQaEtHZ3IzCitybF9pMGxJYlRAfkc/fDlqNlA2MkA4KTFyfSk2RF9ZKW8tZVVzfnVqRVJkO29+VnYpP1VILTxtUXJ4PEB+RkNOZjVmTnNWYDhGMVcwRF9rCistUUpELURMX3YtSz0pKmQ5fnk/cDtXNWJfVGVvZzZgM29HfnlRbTR0WGx3ZShaUUhiTntiWXk7OzJ7RCRzeiZfcTI+NkQ8emZKM2hwT2pJCitIZUg9TVp7TiZLRXhQZFYta3Vre35rVSlGNGNJX1QmKFZ8N0NTbVhmeklQcDtXOXFJKjBNbHJ4WUpUZmppQ01HVTJ1NS1OcjxscDBRayQlCis2cGg/dk5AaGA2WG5JPCVEbyEyaHdIeTwoWV5lej9kJkRZZkthMWR6KjVyMD1QWHFhdSFyakVOSU9oI1p2aUM7WEVtSmFzQEpoU0tOfDcxCitnP1JZWUpmWFB4Zm4pdG1faj04NE0pPE4xfnp4M1oxT307Vnc9dDBXQ0Y9RiVmWjglMkF5SzVmNFluPj03Q2k3VXQjUDstbT5waiFUWTxqCisrQypDUUBBVFMrXjFpN0E0amBwMTcjMUNSZGpAUHJXPjZjKnZHWUw2RmErQjB8LU4pNyM5O3RqOHh8ej1JXldWWnQ5P1ZGcSVCV2B3PWh1CitfPUpib2A2bm0kM21jP3U+Rm5mMyo2P0pjOXZ4QWFle3dqMjRBTVNlQDJyRD1jcXAtSjQ2RX07YDRFSFluencyPkNePFlYUjc8P1ptfkh5CitmR3IrWX5VfGJsTFczLUpvKHZKfHs8bkhlc3U4cHFtRSU2VmZBMz07NTlxQWo/en1xSCREd15vOXBhJE03cnY0TXh6Pzx7KHE4Z1h0JkAmCitgUmw+YW1HVHV+Iz9zNFEyXkxMMTApX20pIT5kMll5JUF3bkswKWMzY185JmIrUiVqUlo4dlh9RzEqflhjWFoyYz5SJXpyUCo2eDdjUl8/CitvbENiQ1MkM2gwR1VVZTM4QlM+WkAkb3ZTc1lgKkkjRj1TRmFZYiFVckZHQW1xVzFLbUooQTNTWDdLJHpDT1NWP0RfVnlMUm5qMk0tPDt2CitjZFV0LT9NWSkmYXcwNyYkRnRrRHQ3dHVXJWxiWVNBPVp2K2kkPElLbVBjR0V2bn0xZVJAQX4lY2hfMF5DJTU7e3hyfjB5SWVTcTJEKyY8CismXjw+My01YWJHLV5lYHFIYTN7PVdzfj9ad3VxbCpAQUNeWmVxWGhUUFhsNSsmRkZKIXV3RDJCI3JMRTVJKksxZEBrZGhwTmZkdCQjYX5BCis4SCZGYjI2dSlrcWA7Vk9SQTM1ZCFSeW4xRSt5YHslJl9PS3l3LTtLKzRzUEIwXnkhMWtKVVhhNWJhM25OPTtOSlRUZWZfSl9eZkBHcDU0Ciswaj0rPnV8dElKfiMoMGhrUnlZfWNvVk96TyY/Jkh6TmdMVWZpYytXbCRIfHhgaTA8P1ZLZmshJCQrTzIxdz1GTklPQjBIJG5KczxDKlFuCitsendhVU9mSDxwVWt1K0NBUTx4a31abnNncU5TJDZRPUdJNXozPF9gfVVyJkVVfC13UjJsJUpMZkthQEkyaHEzRiR4Tlg1WDZMbnM7czF3Cis1YlFSdVNkSWVibSZDQjZ5OyVocn5FeFN3ZHY4LXFmWnxYVCQpSnZLa25oLT8mMHlNaG9HKyRKPHZmdGBsekpvQ357I2U3PmpUWUdUZCNVCisrUmkybiFlZ1VFWEs4JjEqTDZLRGZ+ZkQ9JikmelFaMFRyWDE1Uj9Ue31hI09TKjhjUipoMH5eYkxZK3xRfipBYT4peTAhUXxlajdhbEtTCitoOz5hMjVEYTFBbXJOc1pLJDNhZkYjZUlmSHhuZygoYD5VNVBVIUZ3YyZMPnh7VClGdTMmcC1jMlc2IXl0ZSl7UEduY3JXKGUqRnJ+T1Y2CitKXmVmc0A5ZC1qO14/Q2Q7KGdNPDZYR2BZIz9VYHE8aDtqZmUqPktYJntnV2JEIz9AQWBoc154dmdic0lUeVdUK29LV2JnUigqSXokSl5KCit1PChgKiF+MGszVnU2UHg8bFYkRlZAZ3p5SlB3UFY7WExmMS1pWUlReS18VnlQcnImbUtLYF50Rm5MaWxUbn5gZ3Q+e3AwRVh7OWgwYG0wCisya0QyR1p8bzR3Z2g0OCZCRitybTZoZFBRJmFPaExwT047X193Rj5LMTZOTTJXan5HYCojT15ncU9ob15VcHUkQUFSJUBDO2EkX0FBVHRDCit6SHMzSnpqKk4/S1lhS3dLWFQtVjIhfVclQmYkTVUjYWFJVGB8blRSdlNySjM2NEBlNkNleHRZK313eC0zbF93YVRuKmY/Sjs8WTd5TFI1CitDcktMfUtkM21BaSsjKF8oZExyR3dpdlA4MSpFcT5DaUBKOTA+UHV5fjtMQGNfeXU3XkpURiE/SzlwY303Xk5xbGg+UE8lWGA8WExtX15ECitIOyM1LXRHZk1nekY2Mzw9IzwoRlMtaTBeSnVud0g7eHxERkgoPiN4X29gcyVCWGUpIT5zPzx1ZEYydUV+MlB3bVpAYTlEdTJlLShke3I7Cit3S3dmV0hFdUs+XmY+MD5FRlBMJE5FK2tRTjA5WERkKmhUZng+SEBPU1h2eHBVYHlzPmQkRzZTRnxXanZZRyR7QHs8M0NyXnF4SUQ3VzJjCituNk1YNlYhJTxkRjxGUjBjYWJqNTE2UG92Pm45eDspXmM/ey17SDB7fll5amB9Uz5hYF9UST5hPDdGeXdQQ05uZzh6KmhII2lNTGc4dV5vCiswPWsyYjBsQCNqZmRsLUxQZD8jUD1iVTZfKFN9an1zRT5YN182WSMpZC12YFlaUk55PzZUJUp9JjxCOXUmYHdaQ3ote3gtb2E7fD05KHNeCistcE05TTdgMygwQWJLYmswXkM2I2V7YExqVmY0Z3p4N2AyczdlK0I8LStxTnhvY1gjKEM4R1pydm0jN2F4MU1vJGVxZys3YD5IQGdLaj1LCitOdXlZQj9Sanh0QWkxN0dqflhhVXxSZjdKMkglYlo2WD1VakpgYkx9Q3t7cjdZM3lfYWElI3Jma3pMLSh6bWNsbnN9MSpiVyR0KnVAOVNNCithQzQtVWA1OTBpYFkhXyZlPGM/RXc2ZV5kMEJAUGpEWG82X3IwfHBnUXBUZl4jcFRBXlU2MlpgNSswYzckYHlIbWhwbHpWTlRFdF9DbTlfCit4QVNnTGNBfndHKkNVPEs/YHNKOXw2YjQ9cz54biV1ej8rOH1MOCtVN0U4QWdhIzQqUG85ISE9PVVZKGVGQGhmcVFSSD1DaWpHZGY1dEorCistOU4zcmY5PW9rciFqKm97WGg3aCN2PX1CU1NKZGZxZyt1Sjs0QVFrTEk+SjdfelpsSGNBPVBQN2tDb1JhejJufmgjfiV1YGRYcVA8U14lCitmMlA3SWEpRTF1RCFGa1deZTt0NDdpeCtrNCozRm1kVkZCNzFgaipEJTBJJVBUemZrYDAkR0N1YT14MSE3I1BpZmZMQnFHNE0tdlReTThvCis9QGAyOVM7NVdJM1h7QlBkOCQhVk9hMmNTVSNnXnRHUnEla15mLU1ZbihlNik8T25ISXhlbkgwKWolK1UhWHAxUjJTdXBjLWRlMWBLbChECiswNGlvezQ5SW1HLTwoWVJ+QUN4XkkpKGJGV1hPSGNkVjV7PTRCJV4qckNsJEVPU1I9ZCp4Nl9AcDVuO0N0fE9McGxeJSEwWF9uQEFxJXlaCisleio4dEJmSzF3ZnckPDIwV3VISVVnYUA1ZFNecnY0cW9yWioxQiNYcHF9O1p9ZHNqcipALTA9fjFHZ15NX0wzTzMjZU9AYkEqNGk8U1JyCitqSz9eQ019NDZFVm13Z2wwX18zczNKdClZYGFORiRRWXdGRVlBfUNlYXRMMlpHJU88O0BUNUB4SWZgZilQSXdHR0MoKXBeWFY5UnVYWUAmCispZCNLIVphe2RALXB6PkZMTUQyZ0NOYWtRO18pfnVgX0BDT14wPzAjWGF8I15fRXVhRDghUUZUWl9Aa2ZQRyRWfF5fcEZ3YE8qRV9fOGVUCitVQF9+JjJZe09LeTkhTlBnYzEqdHV3UGxgRUoqUGNPeCh3OyRzKHdAO0xfNTRJNlF7NTFNdkA/dF5CeGhMeEckXyFKaj5nKUVMSk9XUE1TCisqPDd2Pl5XOEdnfClFNnIhT1pnI1VLKzY5NCpsaUgybU5WZFJmUWdIM3ltaz10fEZGe3dgcUkzU0pCTn10cSZYejJQJHF5M1Y9cFhCQGJ6CitQYFIpTkpnMGp7THdHTTFrWnA1JFVGKXlhS2wpdSRZdD11Y25nXlUmJlMxcWR+O3pTZjFoWjBtdU9mXkc8Pj13aGhNKV5kMChBUENERUJoCiticlBWb1hJYU1Sdjh7M1ooTylTMTl+MmJTOWQpNHErQUh0fFpvcGxrMSR7c0lkKDNPbFooXiolKm9KNEAlbURybyhYZ3A3aF85Y2Y8P0QhCitzaFZBKFU+WFF+X2g0SnxsYHwtSU07b0xNbm9FTjE9YUleNiN7QHZHeTFyND9gTXNIY2h4RXVifC13WGFIZD0+ejItfnwmbjBkS1NpO0h9CitnTmBnbUxVN34/TiExcG5geCttfi04OGFeWiVIY2xyUnM0YnY5Z05CdGQ0TkdKaTdKYE5le3JIQDhxOUhBVTdwNnVFOHR8WWAzYksoZ2RfCitRWlB8SXVlKTQxKmoyU2k1I0RmOUlXZElPSE0pWjBxRCs/Y3xSP3tAe21TT1dfcUpmQnh3VnFKaTROMlNtZmE8QFNzfD4yK2dZekFVZFZlCis+cGRsRlY1RVM9UTZ7JW5QYHx6R3xWSSNyVnxaIzhwO0BCankyeEAwRHN+SSFULWU5dnB+ITIqfFloJmI/WEVAX2R8ejUzKnVVaWU4NnxpCiteNV5BNSF6Vjw4WHdPNmdgWHJAMnViQDZAWDxqSVFET2JtekNtSSRJNGZCWUc2NV52N2RUfHd+PSMjPjFXUS01MDh0P3lzenJ6MW90K3FSCitHMERnMWwmYjg5ZWtkQXhOXjJaO3d7QXxUNXtJbUp0ZTdoLXRlPEhXJTRMMHEwd01AZ1NHN2JNQ0szWHNfakYpQ2VHfmZ8MzI5M3xMMWp+CitMRDxMPypqJlpqLTxvV3xjcGc5aV9lJDxFSUg5SnIhQXE3NClsNzc3fHtgUm1XPjFTWjs0ISNQJUMmKTIpJnYmdEF+JnQtQ1padCZid3tzCitJMXxgdkMoNnBkUj5KWkBuZENGVVReYnJLUC19cHVrR1F6Mzh9Q28hfipBdzZYOSQrQjRENk5JIUc4ciM7R1A7bGhPIylPWWU4SiRtcnU8CitZY35QJV5IcXpJWF4kMjh3Pl9NZkJ0O1l1RHx7RVRoWkA4N0hXKFo7RWt+WGVIQ09PJGZLQUs7Nlp5bl5vRWh3eyFhNmFSUnp9ZXRqSEtrCis8bzNMZitRT2dWfExMY254eyQwaFJLZFNqdVU+dj5YPSZOMXNpe0Bla0JXTCZ4cEV+Ukctd2J7TkohdmlXbzcpdTdobUx5N2NVbjBWMTVzCitMSz9CQURqMXZrU244U2J1XnJ6ck1qRF5UIW1wT3RUZUd+Wks7R2VIOXNGTmBZQnBDems4R1hfI1F7c1VCcFUlSTZnTSYtczteSm4yZX44Cit4PyhZKVZ4KTIyPTlzMTAtUzw1UStnO25YSEwtaypIKE5nKlNBX1N0OEdBQW1iPk1JOS04clBLJUwxTWd2OzFHeEAkZiVicWxFIXMySGdLCitjfCR0M2k5LXpoeWIoeipwfndjPik2aTdjV198TTY4MSNaQERlPTteSmJTbjMlfUJjSjBhXmQrYWV6dmJEZWtjJVdfQTAlJWE2QXVSeSNsCisjKHwzKSZ0QU5APXJeMkcoSmwqMkZCLWlyaWIkXyZ5Vk0pelN6dWZ7UHg+MXNfKis9ZXxZKWptLSh6JnYjdT4jdzIwNH5JckYhdG9fZE9CCitXQGRfVnIrS0J8Q0Q0RiYwWGwmaj14OWdfKSp2dHJnWVBqJHFwZV4pMGBvfD9LfUpIfGZ0RSVkQkxDKWhENUpsK3spNVFXYzMwJSk9Nj9VCit8dihNZkpvPUhoYjA/Pyl2OFhrWkFhWHh3U1dLajxvR25CTypnJTAyZ3tGT0NkJW5lfG9KKW4pQ0p2NDBaN18pOFg5KypGfnpxdE59d2d2Cit0dFVWNDRUajJUfnxveU5xKEBNK1ZnaUZ5REh6YHRMPWV0aGB3O2xkcXQwMiZrazRhJlMxYjF9JSo7Q3RXKzZGZGFrWTxVWVo2fmE/ckAtCitLSUhjZlhBckgkSTBzI05XWG15YUBtPVZaOWt7enpiezZNeCMtKi18K0JvdUc4c3dAN30jZEote0R2OHEoMWlaeipqPEZ+TFhaNTVRT0drCis1UEJaYFVjP3liPSY+d0Y5aU5YX2syRzt6YjtnVXYoVFFtWnJ2KHFLPjErWmtsS2YhQXRmYiskSHZBQS1kZXFTd1pJPWBqV1VORmMldlBsCit8QTlNWFF9N1JEWkx8Wmwwa2pGRWkkMGllemZJfVBhJnZSalFONkYrd1FDb3lEMjJ8KWBGYDw3elA5cEBRbXoyWjdsOUFlRWhwSW15Tlg0Cis3cCEoKi1aLU5JZk14bChBSUxkaz1gY2FmQWB1YDBaSHRfZX1kcnlwa3xOaSZDTUxkKT5tNkxffnckVV8zUDl4bFJrUT1UUWh1LTZVXioyCitJKGdaelgzcFc1UkJ5cmFGcjFUTHM9dnt+WClBeG1Vc1dyQEMoK1BXQ3UoQVIqITYrVDJlSylYYnBmS05+ZD0jeT5iQT1yXkY+SW42TEB0CitvK3o3aDMyeW8kZUVORUI+fjtZUmtqNnliYXR5N2tDSjVWYX1YNm9jYiY9UFRNfWZPIyNGfktaQ3ZxNUJMWGpBXj5tKVVDV20qI35SfWJkCit3Y3U4aW58cW1NZ0ZKcW8mXzN8ZXo3cStQflBaK1h6VWpBMW4/QmIrRDZ2JjFeJWNUTVRVVDAyWWU0K0xZYm90eV5QS0xmNCR1Njtjdl9UCis9cCExQXU/PVp+aThjMDdxZWsoVVVWMklKd3s1dkFmTjxhP0BIKlp4MV57PE9LU0ZadHZpfTBeMClOfjJGTzVBNXo/VD88SyE+djRrTnlMCitGOW1YU0RJIzlOb0gqZTt6eXorfFJYUWQ0VEspMTNzNTRqMk47MkF9S0t6LSgkNGh8MGc3MktgKCttNEkyR0t7VGtiRlZyOXRYUSFeIzBPCittbjU4OGspY25mX2VYaTt6e2BTZ3Z5JD90ZEk0X3Y1eTNJMzw/ZHpMYyl4KSZ8Vm54fj9fTCoyaileYFBrRlAtcDBpcGk2KWIzYlgpcyVICishfCFHeHg7YmNLdGAwT1dtdFpBbTJtJiE4YFBGMFBxJmYtTWU+LWVpdm5jXzZtTG57JThscGtFe1BkK3koeCY+en53NVNsNTMqMUlBOXNGCitYO2NrMk47aHFjQXxfaT1TMTB+OStkVDYpQzFucD1jQkpoS1NweTNxMVBhcXw3cUw+e0B+cXZAJWkyTy1MQH0renBgJERhdDRqeWI+Z0dqCitCcUxhO3R9dzI0Xz1qPUZnWDJnWmBmbXAwZnFmN0UkazlFI208RV5hbFBBfFFYTVFfJF41aXAmZzxoM1J2aS14UmdLWE4jQ2l7bT55OVZqCitvPFhiRzg8XktmIU1ZNzJ5KEByKVdXWWJ3VFUxWVBmWT0rOGFrISo2d3cxWmp5eUIjKEE4eFF2UElMcUx+P2piODt5Xm1sWSFIb3Y8TVo4CiswIShyYFdTWlYmUXVCaVVDJlZ9NldZdU9DZUVlZ3lVVCpvS1g1WE9Pd3VHODtaYytUWWYyVVR9YHswbW1nQjhgZ3JNUX1FaSFgS1dgT0FPCitCVjBheFdZfVliUGZzQ3g0cFRPYDxra2daXytVJmZsb050KXpiR0dXQU8qTmpfZ212aDQodGYkPEg0Q3FXbUlIP0U5N0ZYX3AhNzc5SXxSCiskan5mQCozeGRlJklaSG0mcEk7ZCp1SHhfMkh7MSZsKzJPeTBYX3FTd0VMJHtAVm9Dc0x3cXt7cFFDPTcmPXF2OD0+Y2RlZyRqZFNkMERZCitJX0hPZnkpUnZGWFl8dUVYVTxHbnltKWFVYURlUURgMilzQl55P1VsJntzcDJnYDVJRSp6dF9DKWFlVk08QUpedFl1ZUU3VWAteDZ3bS1gCitzYXshdXlYNDhDT2YtPTl5SlF3KndqeiphJWF+e1l8d2gjMVdQeUh6QWA9QmVeYyh0Km1pK2F6TTJLKnJNeDgze0RhTCl0RTFtbzlGN2YkCitqd09eSVMxYkFofURJUUEjYmxQXmhuKH1aKTktZEVXX1Y5U3J0ND8paXVPeSpiaGQ5cExjNnE+KUxrZXIpbnlBSzJQNDtkSl5WRXAtSE50CitSZHghK0oyKjxkeXNaVj1oVTBQdzNrT0tjMHx1WlA0KzZBRUJkeXRgbUJ+NW5xVT9kekpoI2o/O1dVZDswWTA2S3dVfWlhWk13dmh7bX47CitiSldqPiR6QSp3OU95N1NMbHpFOHR8aHwqM20lTTJPU2dtKFBPTEJLUGRTX3s7fTFTSHFeZlo3ZC0xX3tsdXlRWCs4RyhsfW1pYUZaRlElCitLUEVRZCQ1Ml5rPk1pcVExM2pJe3BYTnleT09gQjJ3OGFCP2dVP34mZnhab0VzP2FaQk8/ZE41eHFxck55ITFRZ2Q0eDtJNWxQcEVIVVdMCis3WlRecmVyY1J4alR+dCZ3IUIrUFE5SSRTSnZjUUEmYj9CUGptR3lubEdoc2F4ezBKUXJiUT5tRnpjZyl9MVRXNmE1STZ7YUpZMSp5WmtUCiteVlUyc0RrRnpVWnpQTj5qI0wwNXp8T3t8Uzh7RF5nTj12U2JkNUlRYjd8TExod0JDcX43ezF+I29lKkhyeEQ9alRlUy1OeS1CSEFNNmA7CitnQjtIKmk1MnomeUd0TCtBfm11Zm4/T0pNIUIwYSNfRUNIVWEkemJjTXpHMnh9U092RilSd3lTMyRpdzU/fkpjX3kzc3t8U25JMFBfT08/CitOQkRAZHIlaEZFI0w2WnBOfClNMDwySDNtKUYtPCtxNFBqbmFyfUR0VnFUSWtLamtqY05EP3Q+aVg/cG5WK0VATGd1JkN2KUpuSFApPmlRCitHZGl+OC0kS1UlVUVNNmdwLXxRfStCfHBrZjVfaSNIbUFKeStHfmw+NE04M1U5P0hDMCoqNkcwUCF7TnE7RC1uTCt4TVFTWVpIeX1xWWJZCiskK1cka3dvO0diLV9NQUMkdlFRNHNKQD1nR190NVdSPl9oKCNVTzsoKDdtPkhFJmd0aUtVLUY7TTlqNytZZkZDbyV0aCV5JDwmUUIxPmx8CiszcU1IeXAkTVF6YyNtZmxib3JxbTdVOzxIOFp7T2I4SGBJUjR6KllUc0ZqdnJxdzlEKGNgOXNlblBkbk56RyNLZzBxcGBse2s2fXN0K2owCitgPystYUlrQzE1UWRgcCFBaWZBQyUyQyVTbkZsXkA7bz1RPCZIYnB6ITAkc1pvNXgzJVJgTntBdGViQkxEUjUrdCp2QyhAZ34oZ0B1SlZXCis1PHImcXRSJmkjRUJFZElgRCE4MyZoJW1HV1M4NSEka1FqZG1CKzY0YWEwV05SekBIQ0VtS0h7TVZ+anVWS3tnI1hKeVdKQGhpckVzPm5YCitNfiltUj0pVClwYkhsbigjJktuREJfKXIyJi1lYm9wVU5NM2xsKlpCeDxzclNNQEw3Q147aDY5WTBATjc/JnVFYDlmYHNOJHtNbzU0PlY1CitIV0BjdU5DdGw3YzgzYFlEVzZ1OSliRT9pTEQ9UGJpPkZNZGFxMnN8Q3tqZyFmSU8rb1dINSErI2BUfkBAIWlVTnA1eWhtaj5VUyM3WERPCit9YUcoWjF8TnVPLXwrMCQ4QjwzfTJoP05IdVclTE5aJkVnZ0Nkdj0zVzcwX3AoJDBeJEp8bG0rXjJecUloT2B9WGI2dkhSMGVpMXQ1IXtgCit7MkpVdz1KT25SQkNfZnk0T208R0Z7MjJPbF9hcHVrTzhfZnp5azJuVzdWYFV+dCErXn1ILWo+SyR4QTk7KVhrdGd+ZWxnVHN6PjB3UENWCis/TyNFPW9VdGc5eFpndFhjcXtKMlc2bkZAal9tUFA2Y3YxKFhqTHs8WmFFcjtUbzNobmdxdDl5dTNXb0goOy0tdmFYMndMUm9gdV52VERMCis5ZWQrMTx9TENeS0dmSFV7PVlGaTZkQ3lhX3V1RXNtTXMlJiNwb05jPUFgSHB8N1BBSWY4P1cjenUrYSV0SHxKSmR4fkJYSURwNVg8R31qCitVbU12UzllUyZ7Q1ohNyl4dmomUU8yN01wdWRId3FKO0o9QCFFSn5UUWUpNHg4ZH40JFJIdiNTSSYtJUIhS0RDe1RMKGthTmB9UCpfWFcjCis3RmUhRlhwJDBUVFl7Pm9xWVpkWkwqSlpVYGFkXmJQaCRNRUlMbXYzQ1RhXiglYHFrZGtxWDNmOWVjO2soRnttIX58PiNrNTVJZDh4SHdzCis1Qn5qO21JIWllOWx8I2tQMGZlT0pfe0dLUWdec1pBZlpqU3FjVk1NVllIUyNNRHFYTmRvPHFhOSp5NDFSciY8eyR+RHE8djdLQnd4UkpQCis5KEtPaUkxQDBYfj1NakpmcE5KXmt2REYod3F0TT19ezdFZUQ+Nm5qflR7YjxifTRUJSF6RGUhSVluKklxO1RXPy0rKUVCaU18LTNHRTJECitEJktiO3smWTI4bHExUTg8SygjJD04dUBhVnk9TD5paVlNJk85KElNU31gWEY/JTtwcWAmTURKa2E0Y2o5UEhLV1FXfV94V0EyNXlBTGYwCitTY0x2YkI2RVh+QkQmVVFOM2xIV25rUVlDQVZVa0cwX05scmh0PzZKTDBkcUUjQUw8RVhrZ15CJGxpODYlLWgjWGJTcjQpJVdMP1pSKS01CitkK1g8KkpWZmJjOzVqVGtYUD0oKjh7cCZaV2FkWXh9QjRpV1E3JG5LRWFGPms9IVh9WjNAJFJwdTwmZXV9OHkhel5eTExTNSg1JE0lV20qCitBSSV2aVJZT14rTjhTS0YldDBnVjs/ZEtOPVRBelhoRWZfNzVteURXM05XYHw/WD9qKjBUYjlJN05rPFpyI3YyRTIjOTkoOzxyOTVRNXhDCit7eSYpc0xTdG10bUdTSl84MHA8bXJaJCtmQnh+Q2hgJmpSemlyeiNBKig2LWFuTnI9PTBiZy1LZWZkTGM4dWs9e0V6VFR7VlJLdGtRVDtDCis8ZDUrUF44fT1nZXdvSnBCSFFAcnItMylwTDBMZG8xZSEyclY/N0NSRzAoPT55PSZMNWRVNWQtSTxFX0pDMTRJUnV6UD9LIyNzZ3p4WjUjCitqcmRHUigpMUdrUm5qS0RiNj5tNmkmN1I/JFItN0R3KTdCZ3FQSWJpXyZSVFAxOGphTEQ7aU5TdUlpeTtndihgaW9zVFFaS0lrVnVEe0NzCitgWip2elR3RE9zNz5gNXw0NWREJWh2PEk/cTZEZnp2IUdSRWNRPG1hUnJkWDNBOzNRRWIoPlJzVTNNVip6Qm9zcClgSHpleHdALXVSPkwlCitNa08pXnpGbktyXipFKnBPJDs3azhgTlhLTFAzSmNebUdBN3srVkZpZSUtJHQ2IWUkdzt+QVF7KGU4M05rWUY8TXNKZ1BoME91YWQ5MFg2CiswMHhKWFIwJnQ4YDMydUtSVVowWFFEb0BpYHRrR0hWemp8Z21nKHUkO3tWeD1eTmJWRXxLZHA/e29MdWdadEZPSE1vekpYbkdJc3FtKmFnCitfXnxrfWg9fU5je2Y3XmlFJnFBez1pVl8wPEhNNj9ubFF+JW5yQWQrbnZJJW1uJlg8Y0opMyFUXkB7VHY+eV87XyQ3YHxJK2deTFR6VnJJCitjJWd5Xj8/QDtmZC1qbG8rY3JXdlEkOXM/V1ZlZ0NIS1kzU3NKTlB7NCk2VkJIQUFnQDxwSiNudUAlaEIobVFQYihqYzx6WTFtOCkldndjCitfa2UmfkN9eDN5bmF6alZKPntWd3t8YGFTMnIhVCpyfF94X14tSXN+YyV5I2Z+cD9oTT0pY3B8Vn0oOEVGZ0t+WF5vTENIWm1LP09sMkw1CitxVDMzKSZJJVd6ZX54Pkw1Rjk1QTlSaDN+aXFGTWVTJFcoUzIyKyg/VSg1WWVMdEJMWDV6fGo9eUcqcmN5SzdeQUZGPFVTRH5+YFEtVCZgCitPTm91Kj1NIVMrZGlOQT9EOUZ9Xk4/PngtKV9GaXpOeCt3M0FjO0Jtd2tXcnQ/fDk+PiomfHE/P0ohemVybXJTZSFjeUN7WCthQXtvPyNhCitfPkpgJkAwYUJfKnt8NW8/RHZ4MlFvblY2QEIzfT4rdjwxQkAxJFIpLXh+b1owOyZUWjNZOzNhRztrWUh6eW49XjApdHxMbDdod3JXZHtgCisjeyRCPEM3Xz4pd01FamsjUSpoVHtPfFZ+WmUoLWFfOC1oT3p3aE1WQUJyaGJrQDZmKVBlZHFOM3VDRyZRdDU5ZT5GYVVKWSNBIXhvbVRUCis1JXs7amNTZSU0ZkxaZm4kQEZMKkJWVDxgZ2JYU3dINSYob2V+aUFyYSRock4xd15gcUp2PUI0K1Y9cnpyMmxoPH55M3RwR0tuc2A2cDlwCitIVkU+VzZ6cmBIYjtOX2M4Z0hlSFFzRl9jYFdzI14qUG0/IU11XiYtcmZrSkA1T0FaPyo1RWUqS0JzJCRwPnU/ZXNoMCpWK0Z1fERwYnd7CitgMzZiXlooQk9ze2JQYVZGQ1JFQ0l2aGJGZ3N2dCEwdiNmMG5HIzNQYHcyUEp7MzRGYTktZGBNRSU9PUJ8JlMwSl90RzwpSj5iSSZEVCFYCitLQnMqe3lIV2VHX0ZMX0Y/SH00ISFSPjw4IVFSMTEhN2x8QDF2ZStVamVSZU5VSkdTSFZURF8oM3A5bkE9UVhjczA+T0ZTQ0VndTxWdHRQCitJJmhjQzE3ZklOQjtlVyNhLUdENnROcjVpfT9nX2pTN19Zc2t0PGlvSUpTeWF3a1FFYFV1Uz8mQGAhYURrMU1YJUdfNE1gSD1pUzA1ei1OCitSe2h+RW5WTzlHWSF5ZEpQNztIYGpuMUt0bX43O3I3MWJ6clorPGlJKEJaRyhtY2pTNGFaRWVrcUM5Q2xRRExoQkl7TUQ7USlXTlhPWWtmCitSfCNnIX4teFVnLUFGSilzOWVrQXxLQXpFNFlhNnJxWEhxLWhwdFBISFl7ZSQpSn0+RkJCVTREJWV8SW4/dGgmb3N8V1Bvdzl2cDBoamBkCitjTnJTbiYpYiZ4NlBoQUpyOCZ1XlplRzZkJCNja0BfTlJybkErQlF1Z3paanowUHx6XlBjN1hydVh+YW1FT08yMmw/b0g1YDlNY2pQdUZ4CiskQE1BbG5KKCg/VXBfQlU/WEM2TT08fGAhSHNhO0lKX281VHp3IUNiPU8tVHItPUBCO2Q+YF9DI0o4KWoyZW13Wi16ZVdGZUZ5dEs8QD0wCitwdkcyPmlBTnpqbWQmJjAoQHAlKkNhOzt5dS0kMV9ffDB3fUsxbCROezhgdlctQ0A/bH5lJkQqbThOc1c5UFh7fU1iUGVlaDUpcU9TR0N3Cis0Kz8rRFBHJVVDJVhkbz4zJS0pc0tSd0RONHtJcDZhYTt5fE88YjZ6aWRlZUNzJVNHODl5UVFfajwjPUVgdVc4VEJQJDlTaUN6dzVvaGAhCitaMmY8TmIlWHFmYi1uQzhxZXlAUntTfExZVmdVXzROKCRlYjt3YD88YztXYH5GMWp1LWRuIVV6JVUwVSFJQDRlfURmV3s9QHkje2o+WkZ7CitiJjJuX2tZb1VzczlgUD4tO3pTWn08UDRgaT5MKz1scDsyPy18ZjlVe3RgRUFicnJwcG8qWTlMQzFvY1h9ZjV7d0pXdWUhVFI3fkElITdkCitoZVFKWlZvNUxCUyN5UWprKVAqZXN1Z2MpRj1ieFAtayNvcnoyfHJAQF95M2lYUCp8blVjTjgtelVUWDtAOHk2VzB1OTxOKzg/eHohOVJ4CitKYWA8JT1LUzdoRThMM0l1ak1JJFFPd3tDUHdyRi1+elNaMilfPEpVTVIoaSZIPCRDPyNyU3xzc2UkKGVlcEk/MUFeQDhudSl4TUFXamA3CitYIyZHKCY4WH17JXJmY2x6MXpnVEsoLX1yVSRVKnh+dXpndkszS3R3PHl3WG1ySEdYaD5GNG19V1hKbTdTfGdAOCl8SHZgbXgoYlVlZTEzCit3T0k4WjxhKU87OUBaZWwzSDAxX3VWYDEtfWAqSH4zUHBIKnN0Q3pNZyUqPktoSlBTNGR9ZFJCTyg4e19ncFJSfWJIYmVzQjAhYG5MYDY0CiteUmkwc3JQeEYrVGczZiVjLXY0NEVga2VWRFJfQmp2PThUTHFhQm0lblNLOCNIc0hpZVNgWHJANEw5fl4xY1c5cDZZd0NafS1yRVAoJGRGCismXkpPNEJLYEZ1MyZ1MW1PX2IocyYxdWJiRGdnJmltMWhmMlNJPEJ5aVJyfW1iQlI5fGRNQF5TKj5rRHEzZVFXUFMzUiRMKV9CJT5qYGhtCismbm9CKE18Rnc3aUVLVVNyN35nfTRETjxZIUd6VGVDcXpJVHxjVkBHQCZPUzRuIVhpYilBUWxsKVkhTml6QXQkSURjdHprMk5mOUFNaVU8CitkbkIxT095S19YbW5MVyhPQzRtP29kaVlwPTx4PCFoQkRYeGclbkBncGlWVkA1JEBCRGUqLUBgT0JaRjA+JWBeYks9NFc4bUBwNWEtcGJDCitafF97K2MmPWk/P30pOX11fWU8aTYoYStZanlVX1BLMzRScC02KT5iNF5lWGVXLXVYQXVhS1NhU25FO21jaV9Ucnl6MUlfdjlmZ1dZMTEtCitENTgoJEtKQWNSUDc3PCFHNSFBezNiY248IytqR15RcmtLX3IhaT96cUVKa0h9KWUoeUwheGNgOFJJU0N7WnQkamZ6cERaZUZnVURjV0xSCitedSQxbnNQP2ZxcDxGcl83aCk+clZqJmBLJSNGS0FIfD1JISkxPzY+dDItYEtVSW1tQDhMIX5neW9UNUZgcmFvbUBVKz0jbz40dWNufGV2CisjKHAmbWFLYylTPSlGWj9hNzxzRGc4K0VFWUhZU0Z+UVlfRFdxREdldXVBWUJpKThjRVpiTVVQeVckVUtadmY1VU1RbVNrOXRVaEpjJj5DCis1UjI7OFlWYkxZZyVne3ZXZ0N9TFBnOTA/P2UkIVlSWm1YZ1ZZMTBhdChEND5XRTkteGQwZHtqfXhDYnNZIyt0QClKZHVYN0U3UHshNmp7CiskfWw7U2ZnezxDeHJkZj5WNk04QnRfezNqfjtBaEIrPj1mRj5ne0RyMGg4IyRgZSNXbEUtSE1yTmZoUDNjSTtKUTFmTGB8Xjt1ZG5OLUpRCit3ZnorRFYwX2tyS15HfXN1RT5vU3loeTtzO1drKnh2aDNvVUcxcmNZTns2YndXSSNPTHhjKHlEcGFVWXE1am9oUCloPkA2YVdBSzJtdGV5Cis3RHNHcXkkbl5qMDAwMWYwUlM1UzAwM31sYTQlbldXb34zfGF4WXxRYjk4S0pWbFEreUclalUkVyNxakpjdlJJREZuVDdGTmhVQU9BUGZXCiskaTc7cTFLQkI+ekk3SHtiakdVMWZpNGA8ZVAmNjIrcHdlKGd2NFNMP093RipKN0YldCNQZ2A1SFJxTFp3VU1pVWNeNTdacDYraV9RO1MyCit7Zl8oJiFeYV8oQWRwUDdWTCt3YjEqLXRXOEwmcXJwPyszJnNmK1V2RX4rN3JCR3huTENwQXN6azxMbDlPOXtHVWhvQEJiMztIKXpjMkxCCitoWVlIbE1yRjY0LXExXnRuRz9TZ0BleHs8fn1MeFZOQ3tqe0VNclVuI2lydTdhQS1lRlo8aHVmUkwpIyk1bkFwTDVxR2QzbzZgdnlGNUFfCis+YnJBR1Mrbl58R0huRiopPDJnQUchMVh1N35PU3pBaWdgLV9rVzd6VU0hN2JKdUp0eVN9VE8oKGZfTC0pNFVRaGB4WEw8RXB2WC1rSFc7Cis7Uys+OEtnJHJGXzttMSRXTGxSblI+KD1xN0tBUEVALWp+PUVyYnNUMlo9PjZwVklgdmg5NSV6eDNJQFRLeiFsJEc9UWg0RT9GdTBiP1c7CitHa0hXLVVpIWMhJTdGZE04Uj4xZGNpKHQ8bFBAdXlpJSl0U0NBcVojeCpPZUxZWjt2MX1xQDZrWTY2TE4lM1ZjdTRXRFdARG9fPURQMHZPCitGREhGTkd6P2h1NGVDLTYzZkFIZClDNlUld3Z8MFRTYlAreTdfVlpjTS0raXAzelQ7bkFSY3RNJlkldkgjUkAzVClTPWVlWTJWTkRmMDZICitFWCQhVmxyUUBPMCh3bnR3a095YTx1R2dSaDB+KF5KWSNJeHs1eCYtQG98NThXR0pBTndPV0kpYWhPYE43RTQwPWUjPjRBN0lBP1MmeTBLCitgdlAqTjl0WTBrUD1gVVJ3Rz5mKGFISlY9cDtqcTIzKkIqI09vXjF6UH5+Y3dBbmRPQ2hDUT5zNjFQYUkkdHtvaUdLcDVUN35PaUlHMWt+CitnaVh6eEhwIThoRjFzOTJUI2xQJV48VitCVHs7Zj5WTWs8a3hNV3Y9d0ZqYjtqKjBKZl8qdUpsWlhSfnFDV2psOShhZUBmPCtleX1pKG1CCithQEViOUk1ZnR7ODluKDh4cm5wTEYpLTFEYCg3KEVfO1B6KGYkQVNJaSVhTyZkZipJMHVYQCshQGJoRkczTGNnOD5pd0J+JUF7Wm8kYj9ACitjU2JUbkEoRTc9PX0rKlBkWXdGYHA4SGlhN0AmakNmbUN1M1NpcEpCKWglRF4xY08xNWhTTGxIe0JWbDhJfmUrWDF7TnpyJFlMOXd0UWlTCitqWEROaEFBNj5tN25+ei1vKEs3S3djJXR4Tn1hX31PTnlOfkNYQGIhWnkzLUg4KCYxTE4zKGVHSjhuaGhLclZzfDxoOWFvS3Rfe3dNJSk0CitRJGtPd294bX47PU13YkspYTVIcD8rNj91ZDNPcm1vQHZATSp1YkxgJDFUSzNwVjt3PW5aQkViRE9TMUJGdkk/aWNpSX51YTNoZ3BtJitRCitDI31TdHN+dmxweTJwQSZlSn0jOzhVUmV1a31tQUhYdng5NHVXPkhAejI9I3tDZz1ET1BJS2BmZitoNGU9IUQqQ3B8fFUhR21ESSVgOyhmCitIO3RFPzFXTEhhTlJ3WC1Gdj5Pcl5leHFCMT48ZmJOT1cxT0JycHgxSj4tX0IyUWFAVj1qfU9hIV9Kd3IyYmVsOXdubU93Zi0xNWs1cl82Citjez1NfGZ3VnxBUiszZlBJJUBMan5uMEUzYVYxPXZRSmVGUVpNKWo2JkxLK18qWFM9SmVENENOWm1BVXZ5eTRBSnszQjNMRUl1THs1fjU4Cit7YDR1bl9qb1N1RjNMZklaPU0jYV49QWFQOTwzeClQZypRaWFWWDRsWmAoJnliX0BVQTNeZVlBdis2dTUqfjElZU1mQVNoQnNPLUVlTiVnCitwPjVga3liNm8xXl4hYjRKdVk9KGFUMktZS0hSfUM8SklTeE5mbmwwKmkkKlhAQld5Q0c3eT5fdXtaPj1OJlZReD9xPTNKZ35XQkdscH5jCitDY15uUEQ5WU5qLWxLKzV2Sz0/YDBAJjRhd1AlM0R1aikxbzFBdygpRjc0Y19zbHA1ZG0tYnU0KVRyfCVVaW9kUHl5fC0+WSZie29MVHkrCittIzB4I28zO2hOUWVNZzE5K2VuMnZ1dXVncl5rLWhFPHx3fTl5I1JAO2FYemlTbWp3JVV6SEs5NGBOe3ltUWJ2ZEBAV0U2ODcjPG14dFc/CisweVZnV3UxMTs5ZEIlI3dCKGRJMlhvQ0Rmc0ZXKnBiTTc1ZDRCZSFRQFhiN2VOJlJTRUYkTW4tPkNZPU5TTVNkO31edmttOUg9M31NMDBTCiswWXNGeUd8cGJYU0dwJTthcXJeTVM4QVZpPUdLPjkwYiRPQE08OFI8I25hYTR4TDswdzZ3JTNPTVAzI2IwMmgjU2FjalFQJGEzOU9oIUV4CiteXnMjeFZvJVZ1fD1vIz42emsrdCtMdmZGMFI7eXo8TDEpWiVNWnxUNVgzNzZ2XyVqRmFCJmxFYyY9V2JaKGtITH1LcllFODRVPmF8dHlECitgUEtEbGxETlZyUjcyUz4wP3tqTW1zb14lYTcmaTdgYEwkSHclJX1GdypmbVYqRHRtUnRSc3tJZys3TnpTdmA7QE07fmBwcX5UVktPdGA3CitWd3RUY2pzTCk9O1MjRShALXg0M1ZodWBrU1JhNFVtcn40MnwtSkpgRSpPdWllVnJeTnJrfVZyQysxKnoybTJMJGpoeCViJEBrXmx6dGheCitLfGRtNjY5Q0dgez80WHxkSSM7VypuTEdaR3prQD5EZDZYOVFMMlJMc2JRYW0wenVTI0kkTmw+e3VxQWQye3pWY0w7REszdSFMP2o1TD02CismcilJUnVEbzgzMGpUNzd7fUhzP3thSklHVnVWSTQ5PjhYaDBXRCRRQU1tY35+SXt4Vj4yQ1QmazAyKjRkbUdRMEtlcyk2e3smcDhXYG4mCis5S2heUHU3ZWpPMHgka2B7bVZUMysmMjgpbiUxLTx2ZWtQWStyM2g4djhQfTZCLUl0WlRwZUUyMyZUYUJkfFZ0Myk+UDVXMUdrSmFnWVVJCiswRGc2eXl9RTNjNUU9KT5AQHk5ayg2eWZyQEZLe15iI3A8WEdANTs/JFBOMj42SW5RaXZ2fTgrV2hXNzQ5VUBHd3N+UU59VVI8WGBQLUJ8CitMWWticyRZdElLViZyRUJFdzMwQEArSExAIV9Pb05yaW5RdSlVWHxII3hvMkEtRHEkK1Rge2BYYSs1Xl5ER050ZE42bk9QVlhXQkNYZDktCit1V1hsR3JrbksrajRoKSkzd3Y+REpfMDhwWWQwRURfWTVZM3laQXlrMUp6YkNWO2Z5ZiswbWladXY8a31HU1RlVyZYKkc7JD1ma3RjZGpgCis1ZSZ6dl5tbk9nK2d6dk82ITlaNHA5KTx5ZyM3LTRpcDZQfTtaNmE7KTdFelprZ2wwMiQoRCt7NGZ1Tklid05lNlhTPHZHX18zTm8+NndaCitXb193Z2hkPiM/YVQrLUJAOUY4LVZLaT5qZDQmMDFTKyRnJHx4VmhPU1FNYExqSlp6PmwoXndKeiNxVVp0Z3RvKlZJTm5RdVZiXkB7LVY0CitPLShmbUBXflo4TDR4Xj81UU9FK09CKGV0QVNVXk1ATmkhTCZSe0glSyM8bEQjYzQmeFJmJFkmSHQ/bGxXUzc5ZkhmezNVaCQ1SnVIRyomCitfdm1HI3hrVyg4RGVYWVQrQktne0whKHNDXj5uPj8hRXA8dl8qKj5KKTVpODwhSWBvflhlVGspejt9elc2eWgrY2hifmg9NVdpPHhkIWgqCitadlllKSNDJVBpSmgoZz1KTFNtbCt9Wi1CKlFtZStCUE1MXkNldzlxfm51S2l7PjBSO0hyZFpNdGB6JnJIRFRUaE18PSlIJTtPXj89YCZqCitBUlBOMG1XPjs/JC1PQ2sjP0B3Q2l3YTBoY0ZZTkFXUCgjemBfTFBGP05ZXldmc08jSlIpbXZncXJEcDxNdyhMem9uM1FebypTSk9AfHg2CitWU2dfOFRkNEExb29UZmZJYDRxYTA8VGxuOV93S3h2MCRjM3p0UHUySF8maTd7ZmAweyp0ek83JW44UHAhUkMmUUQhYXJTPXl5Z084YWRwCis1cVRMKHZuMU1ia3JzcH5uOyhkNkdsdjFReSo8JCl0VSpaKWRkeXNqJUJYSTBIO2FMMHh2R3R9YypPUCQ2d3poXjhJbUttZG9STklHPV5OCishM0lOQigkbXFxR2NANTkzRmYlaChqenI5UmZhSGw/UiFFRXR3YTk3eyRrajJzWTswN3JmUDs7TCF1bWVzdzsqI3M4RENWa2Bhem5DSUA+CitSPmZhS1JHI31ZUjZ2b1VeXy1YemEhdU1EdUU3UWNHTFA7JWgyUHE3OFYrZH48eFhARSRFLSlPfHZ7WUhEfTljWWkxaTF6Sn1AcSRvV0UmCislQCM2cjErOXU+fGRaNmo/fkxpb1hmc3FscFcrZTlecE85SUFVcSZEOCo7ZWBueHg9WXk5Y2c7QEYwS2pgMHVhP3YpcT1ZU2tMMF5EZVc5CitFKUVRNEdlWkA+Jl5wYHd0OE5eWG0lWilOKmN0aXZOMyoxR3RodSFBM04zRnAtWUNTRl5CZmNsV1NhO3N4aF5oJUsjd1BxflE9WSlMYTM+Cis4QmZEJGQrLThyXi1yS3koU2B3ST5XUUI7cG1AbzZscGJUbiZ8RXEraHUhOWh0ODROXz1zUHxQR3FGUXN7UWY1REQrcmpDVFJLPlF3VGJ6CitTdyRPTH1vPSRtR3FkWUZ3eWF7d1coJl5OTHJKJU1JYFhpSU97QSFnWlhscEphM0FOT2VuRzBzemJhUDVTcU1hRUp1KX1nQmZPNjc/QW5PCitleCFUVXl6T217ODd7emU5MjZGWTw5PyRHJn5IWTcjeUxQTF5oeTlmYzJsKzE2eFo1RUt+d19RWCshaUYqazxXMDVCQGJgUWRhSk1+aGZ2CitvbCFpWCpeVU8xN2lFa2JmYXBSR3tFPDB9M1Z7ZTk4fStzYCU+ZW8rPGdjQnlpfFRoTD1ycT1eNF4wRyt1YU54VT1RKEYwc0I2dmR2UGBZCitDeTUyJTU4ekYya3BMYXdeQVdDcGxJbEtmOGBZP2VlWXZpMGA3TTR1Pi1gVmZkXzN2eDtqXlRAZHdiezFyT1JLKSlJaklIJi1zd1dKQE9JCitFJTJnPDdfZkg5TVEhbXZRI0h1PHY2JGJqKXkodylTUEVibz9nSjB4TlVYYG56TDl6az4jJCtnZClmRT9vLVN8RUgrbldjeCkxb29EYz9aCit6dk9EKFJ7bThRTnBpN19HOVNDVmFfalhVZmVKJDFfdDVPcSZHN29sRGtyc2N6S3dXWEdDU1N5cERgezlyUm5NMGkycTNidCo+QUp9bE8+CisyQyZ6eUAoMzF0cSZjTyZnYWZhaiRFe3o0JXYtUHA1bTY7V0Q9VWphcWJZNTRfbShJKV9aUCN9QjBpeD1gVmhrbjQlVEhfPCh0elhWdjAzCiszMnJlanFadGZPQU1jSX4tJmhAVyVsQTQzVDl2QkZuOWE2fVVRfnVgPCR1PjtQKjVDQXRYdmV0dktZZ0clNjB6bSNNRjtNJlV4SHY9R2kwCitSS2Q3YSs3dkY+WnFLeHtwSmB4d3UwdEVEQ2E+K0RhI0Q+cTV6dSUrPlJJPj4xaU4wMEpqWEh3JH4oc09ze3ptaDgrRipKU3QhZ3ZPTiYtCit6Jnp4Rjgqdyl2NE1OcWQ4PTZuQF9rOFYkQlFANT87MVJHaHpNQio0Nm5fc3k9ZVRCVGNZdmE/eW45TiVNLTJaPTs4TXdqNlpuYzxzMyFXCis5QHA0ck0/ZlBDQEFacSYrQEN4PHdHNGowYW00NTVjSFh2dU8xM0ErTiFeNFk2KkJENHV3KT56Xl9vVUxMcTRDKHROTm1Ma2dkUH5ITm98CitxUmBtTVEqLUJNfC1HRE4kK2YyX01lbm8ra0h1d2dJNmt5SzFUQnsjQDZrO1gpZCZ7bk1rRmM2cCpgdl9vYnkjZlJhT3VRVlgwYXl3WTd4Cit5dFQmdVcwQm9vTTFwRyNRSTRjMj5MRkxNUkNNUi0oIVZad25wM0IzPVpkQyQ0QjBTRVM0T2Q4REhUSyh6SXM1PkBQRkZ+ZlEzeVFxKT0jCitCQWFVJFBpYj0jMSRMSSNnYV89JXpCaGJAX3trdVl4anQkSXJhP1Y+djBTOHJNLUpPeWdZMGQwIyRwS3FebmhTNUhUZFMye2NAYl82clpyCitHdSpnbkpHKEt6cndQcklxM29pQ2NHZU9mMUpCRzJwdGc8IXozQShyZDUtUVR0MT1NfiZrdihYdjl2fTZiaHA9VHVaMEMqbE8xfD9aRTFFCitXJX4mcjNGTFBVSzRnO0o9dkd3cnw3Kl9yRU1UZk9AZ09hMCstdlglRC1EREIjVWxzVFdMenlMcTsodmpjcUs2JHBifS0xa3ZwI0oxJE5GCityTmBzSjlaRVdJbEA/QCo9Rz9YXkt+aTw3ZlIpN3F+UTFiMGhsOVFNeiklR1MyekFYO2U8djZ7bUBsaz9HZHQ0fkpiJSFnMTxkK0hqWkM9CitET057dn5NdnNPc1NFJEB6OUEyTWRGYSRyNmZ7Sj9zTFdXZl5NYHU3bHBHPVgzP3lFJFdHU3VNb193SFhwWnwwdW4zaXdATT1STUN3Z2A7Cit5YCsxUHMmeVVIanE8V202dXd1WXg4S3FecFY8eDFhNVl+eUckNHYtYCVTcWlPYTJ+XmtkM3deT0ZLT05rQ0cqIzFnPW0qcDMmfmtWQmk5CitZOD4wV044UiZ2JClPMDhRNF5MPm1pNzt6OXFjJWVaZkhKajZ6WjlgPUtKYipKKE1rfVVtV3ZCWnEzKDZPNU0jQ1doaXt3bHxob1lgaXR6CitFJSt8PisxUWt+TGFXUGhFQ0Y8PElubD58TkRDP3M+IXhZdSNxWkx2PyVZLVNmNFh7QmIwVjEoWjlCfVVtUDxidmwxKG83bEtLaEhweU9lCitEOHM3MH08TjdGKXxYYnc8PG1VfiQ8YHc7aSNSfHUkMWR8SG1gU3UrUkokJGolNCl2Ym9QVXhzUXxePkA/P05eZWY5ZXI+bXV1UFJxKlRfCituektXQz9Be0hHSH4xeV9EcWRxZ054PUpZPDdyXmRUfnZUOE8rUlRidUE1KCRLMHhMOU5PY18ofk9ASDE3ZDgwRj8oIWMmUFM5UEhHKDJ6CiskMXxIXkkja3ZCfTJVPFUobWE+dkUzI3tUd3g/Sjtzcj8zS09CRyZXPFNfUEB5ZyZXWHdhfS14V2gwJkU3XyUmJTJsPT4/STVHbEYjTkt7Cis+UHFxMEMtbFh0OUpGcWYkQCF0cWwzblViV1VxckIkU1FqcDU0Nk9tbnhSUkxIaz9jO3B8TldEWWFtNldmJkEkTSo9RSgqTGB4az40RkspCithVEFARSNHOzlfZmlBQ2A9TVNDcSh2Pk9gSyk8Z2Z4d1RGaWdKaE5BZyFpK0twOGkweWNrcW97TFdFMVRyRkZoQVJZdVhFdyY5YkRnPVJzCitOUk5zcE8/MjBpVkZYZDJrSE1SfXhUV1d0SmxEV1k2cmB9SlZaT2RfYDUzYFBkeFRtKVklPz5fant6VSlHbnFJbWBRRjstWCU2fGBUI2hkCishSm8pV3g3JGgzdF8wNlYhcFYkS1oyMFV0ayVUcyVpVnd7dn5yT1haISZhMlI2fWklWEo0RU5KLTUqSHk0ZCtZJFh9SWFgUkEpQFZZOFZXCiswKCR0ME5UP3V7V1VAMGROMUBAQXQ7akU+VUVXcFZoKTt9ajlKQkc5PlMrV0FXRUJaY3NuMnkxZHo+cGsjaitGQ0dGWlgoM1U8e1g3dyVfCitLKmFXUkY1MnxYU0c1c0hoaXlEMkcyMHtmNnxzR3RqY0BnPzwtQnxzd0IyZkpmeUF0SXB8UkUwMnY0TEFHVFJASEBOdDRMWTx0RmhVU0skCitYeSNmYGlWeU1TZzszZ1J2biZFdDQxd21sI0RxUHQrOzYqTFomTEordCVVdlI0IzxPcHNRNUwkQVMpMVghOVA4QXIhQCZZeCkweGJ6YzdKCis0RXpDV19DME1CT3olSUJVU2Qmbk1TbW9Ye2ImbUpsYjdXRCsjWDkwRlZYN0x4UiNxYzMkIzkjRmoqJm10TzdLfV49Rns4ek9yS3J9UyZ9Cis7P3gmdXE8UWxNP31WbS15KDVQP1N3UmhSXkVuaTZOeTZWKk19aSQhJD9hRmV7eiVffUtAM1lwYzxMeWR3ZzZrMF5DWmdzTyUyP2c8c2pZCitJKCp2c0cqJCRHZD5Rd24kfGdtODxrZGI7QjdYWGB5aVEzT18jX25QSGs8fjk8fTJtRUdAZStKeH49U2tRUVA+cTJLeVpmVVU9YTVwTXNoCiswNjF3WDZiRiUzWkZiO0hSdjtyU0d0ZE1UaGgtT25PZSFjajxTUks4RU5YcVJLeWpDQkZCfD48Q3w9WC1Pb0YqSik/X2paZF85bkJmY09gCis0eFE4I3kqU2BjJihBdmxYdHEhMXo4RWslUXU1Ul9SSUtvWTRwU3JKSEk3MnA/PD03WUx2VU45YDM8XmtCTyZOI1UhcG5UJkx5RkRvRT5iCitTVDJsdT5WTn09aSZMTCgzdDdlJWtOeWwjPFQ/Nk1haTg/PzRjTW5gaCFIRSp1dWYpSmYjK3pObzUyajI/XjklSX0teiY8ZV9gRyg+dTdgCitYUHU/MjRaYzJaZygmK3QxPkA9cCk8fndHJVdwUC1jQVdMbSZJSitGTiMyQz53ZkFnRDFEckV2flJ+KnNGOzxsd3ZoZXFse0ElND1UZzhpCishKU0wYyhzajtSZy19PHVDLVdVRTlGVjdQcy1gaT9RNjN2Q19BUU1kbEt0XyM7UT4oWEAqbn5kRiNKSnM9MTt+P1koajdMJmBsOyhOP2ozCis4K0h9WFFLbEh9JUdHSy1VcFpmbVhEY0pyLXReR3BLQnlDWkt8byFuTCo0MyN7fCYzSnt5SDtgKnlyaFAxI3VaTU94QH48RlFaYk9gZUh+Cis8M3E3Rmo/XkV8M1FANXN4dEd+K0I3ZUdVeUpFMExOJEl6P1BfO2g4TzhYdSVnZ2YxX3t6SzUmNThEZS1POzdDdWEmPEswKTJoaHRQeSRtCiskOFA/MytkaUwxS0A9fCVXOW4lPSR8cT5uYUI9MFp0UDdzYns0YX5Ja3FfTXg1KjNBczNaYk1FMUVYeDR7ez1EVFBxTiQtYT0/MTNGYGczCitgSXRPMVNAP2NLPFl6eFdaNDYrU1F5ZnV5RDJORSpIWk9AfDt1eSZTJDlzOCRZZWxldGtXMDdoS0ozN3sqIXBeLXZeQU1lSnNnaDViYndQCistTClQMVZ0WERCQUk1OWl0RzY+dlV6OE5wcVMlP3A/SiRtI1BDNW57fGxmeHk5dllgKnJ8QXNmKEtTd2JBVUluMUJ3ezd1bmpnZWtpJHFRCitLakomdjh3cjh0Nm9RVnshPFBnODNjMGNlOz9NI1ZOZndiUmJ7aE9QP1Fnezt5UHtKcW4lZkN7cm9fTypUNmcqOTdsOEg8SiY1RDQ+SClJCisqI3Q1fGdPemFZclk4ai1gWmNufSVuJGhGUTdpd1h9MD97ZVEpcjh8Z018N0cpJU5AJHE9R1NRTSZXRXJmOH5QM0VHRzdAK2ZRYE87MVhgCislbHpyezlgVCR5ITEpXjh3N3g1PGNZTXItXmJuQj1OVCshb0sjc2M5UlhmIVojP3JYc2xzbHooUVJnPVkxJEIyeDBWVVooeyhNYG4zQilMCitVK15IY1kzIWpeO3lPc19VcXJ5UCR6WGBJTVckeGB1UGk+JlRAP2NWWkVDX0U4azBLdEVQUypIeksxUC15fUElMFZaV1Qrb18mdyF0fXdnCitOfmU9MmRLUiFVeWtIRzFselRfVSskY05uciFyQ21qbG4mPkpFMDFmIXd5flRZKD15aDQtWVJiczl1eTVZYylLNU1HezsxVXlWekFSczB2CitwbF9edjVfXjAhcE9kV3hhQDZPTHFkXkJoanppe2NJUkV3PCZnNV5YTmc7TyFsN0A8PG1pdT5aZ311QHxyfn5UZyFCJUlaczhFYmdtM1g9CitqRk5ONCo1RVZZcSh9OV85MD19ZjVFd2l2NCN+VFVybVhtS1UoI3B+c09tUDdxajNQJlR3VDlGNzhadXkoRnI0NE1EJG9SRSFAMXtHU3srCitCJjI8NTZyNEdAcXZZQTxgUmcoeXk1RjQ/NGd6YUpKV2BnPDJiMmdvdztwQHFkcmw0c3R8P0ZXVU5lNkFpMisqKnB0N1ZZPEZ4TzlIe1BjCitzY00xT3lAMzcoZWUtWnZRKH5Se2B4SDRoWFV7KCpwM2A7WVg0Nzg8M0EpTVU3JSgwTDNkMVo4c3loJkpDYlE2TnBSKT8kPmQkeDwlX08hCit7KGRLVGB6N2tOY0tfPm1kYlIxP0pIPnEoQnBac19GJXR9Qk17OXlkPjlHNXBLYkYtSiQ4NHRRZS1zeHRzUUZPOytrKXcoamhmNV9gIV5vCitjX0A5PCNrXjIpQmBIejhwYWZtcCplcExTRj5mczBsPjJVLU5Ycl9eMClmbz5FaG03RDR1ME5eYFIpUHZgQGI+c2hmPTwyeDg5KSpBNWYrCitfUlZJP0pefD13eG9HKlJEUTcxaFJ0I0g3Q3huVzNCQnJScFlLaHQ/bS1OODsrKF9sJHM1WUxES0FPVnlzdzEoJE55MjNvT0hkRy1vOClhCis2MmJpTm5MSXNDMSQwXjZAZj15dFFyXjhVaVN7YnV0XzJ8JkNXT14kVGJPZkNoNnYtMUBhQlB8KFpNcHJIe29iTikpI0VnWF9WY0Ioe25CCisqS0l0d1ByJUpTPSRubTRUaUQxTkFqT0R0MVNaJThiVTdgQUtgXnAyTT1jYilsIyYyRTBxMjQoUExGQHpxfTVMZkRXK1p2dzY3Iy0wY0JwCit9Jldyemk1UldAWEJ6JGBaOTwwI2NLSWM2aG9CfXM1WnRqWGpeUFZsSmlFWjcyRE1SZmlEXlM8cGd+JHhvKkpVe0lCOTxrTWNJNXNpXmIoCitTQlhaI2VsUWMkKit4THo2VkdkNCV+emwleDZ5RHVfN2QkOFFmY0RYcUthV1lVb3tBeWQzaTBYajhrNkxzU1YyRFQ8amRBVldeaSo8P3J7CitILStlTjdraVpffStoamJxYjhsRjlhWCYhbXRacytRPSpUSiEkSlQ2QC1NZWNKbyROMmZpPSQxOURuS2o0MFk7JG89SFAwaThRWVJJPDBwCitWO0t3WGZCX25uMVNxI2E1PUt4LUV+WWJfSD1CRFVrP0goPGdBMFhvT0tgVzRhPk1FS0drMHBMSmF4NGA+SFNIaztPSUpmQk5GQSR7Ql4xCitiay00PzVpaCliZ2QrOWw4eldKJURaaGg8N0Y7Nj07e0Q2PXthXkhiX3NOQ0ptUz9AbjZMSXsxYkV3a1NFenJGWUR6aD1rcWBsbWFGQkRUCiswdDJTPm4rZSN0TDs4MypOblVrPEUhOGkxZmxUemdmViNeNEBSWiR0JCotaUZqQyk7NitnI3ctPWZeN3xHXklAeGY8N3ZxYkxrODRjfiE9CitlUWhVaUUhb3t5dnB9LX1COz5OcFBAMjlFNks8RThYZ0RqV2V5NjdXMFFYeV9AZ0I1MWhnIWF4PWZIYl8tWTxkb2ZjeDghRSNUSWF3KiV+Ciszb0hvY05eaikwbCg7U1FiVFVlNWZGVlR7YDN9NHlgNXtIfl5KWlRqc3tTfWd5YEAod19rd2QyOzJTbjhILXEzbGl3cG5RJENfTGwtOUF2Cis5b3dkUH4hWVBIcEh7XztnY09FJEEjQkp2RTdoPV5wenQ0V1dCWElNNSV5c3s0K2I0dUZMVypNSktTKGB8d2YrV0B5Rlk4TzRmNUZ+KjBjCithNUgxUF9ZTEM1PmNxeigld295an56YGBebXBLe3FGJFVLWnVVcDlCTmAlJkVYT3hAMU9+Uj8kdX5kOzxEbzstMj49cTE9K3hDenRufUs+Cit4dXthP0E0d3tKKj1BX3o+NCk+ITNkKypUZVkjKnFxK2VvNkVZSjliMTV9WEV4IzY7ZlEqQHRRRCs9T2BNLVc4QCVNYF8ySzx1VjklQEF2CitWMC1PTlFYa1F1PEh0ZDZESGcqK0V0cSVsNTNuRlBuTj4ld3hYZytJKUNadDx6a3N0fD9BajBnVG5IXig0Sn5qVnc4OXs1M1RIb2VxYDdHCitZMj49ZmsmflptMVIxeTsobjFUc0ExMmwrbDBjejRKbElFaVUtYGdeYWBIUi1lK1kpalNAYjhiYnk7RCEkWmQodHUzKU5yekh3cU4qISEpCiskWnNBeHpFcGhxNjFqTnZJRzBtbWpfSCFCP2xDPzBNbWRQYSlUJDw2KSpuPnsmaz1EPFhyPGl7a188Kk0jXnpUSUckQWhSWTZXZzdkQyZkCityelFORGNQdHZKeiNtKExgc2smMXJRPHo1fGZmZTJKMmkkSjZqe1M0a1MkMzghJD1lS0U7KT15MVVyc1VPMzZqMmVIT1B5cSQwbXB8byM2CitlMF4zcX4/Smp3WGhWMHNnJiN3e0Y1TjZeLVUhbFFISnhedVFAek10TDNnWlVgU31fRG50JSNLSX1QZUwlWmBoMntlVHk9VSFrLW9yNG8/CismJiMqcnAxPG1PJlZ3QjI+ZWhrd3UkODhKb08hZi1mXjQ/Zm03bnM+VEZ3XzRyJlNKKHRWYTFpZFFUZ3kkMm5HOTNQQUE9V1RTUkdXMDtwCitsJT5IOUVBPXZ+cFV+WjEme1MpOFo5U2VRMXh3MiZTeCpuc3RiJj9AdWRtfVlnYylDPWBaa2NvJHpEQEJxKUojVVo1PmAtfkQmXj5QSi1pCit3OG1SYis9M15HNmBRKFNrN14lTGw8Nk9CKX16c3whQVAqdCEtdTtaZjRPJUdiWEVYeC1JYFI8S2teZjgpMmA4MjNacWVvbzJHbVhQekVeCit+XzVUZU58P2lEWChvaCZZZEQ7ZWNaY0J7XkViMlY4c1NyTGB2dng7VDVsZkhPfVdZJiZ6VnoqZnsmeVpnUHg0U0VJfXtYIU9zeFA5U1drCisxWTE5NkozVGY3ciorSEpFVSUoVXtQK3RGTURXXnBYSXVNQU80a2drV2E0cThpPyVVUD9lTV8mP1ZJYCRLWipKSm52QVlZYHJLMzhrLUJHCitkX2h7fkxzd2wjZ1VAYV9DO3BZfGRPdD5hKz9RKiNgaT1HSUFMVHh9eFpjUDFgUHJ2M0U1RE0pSF8+Z05RXzRobHBPUmYwYU5CRitWSXE9CitWbShrKk4rdnxFZFNFQVNCc0NHNT5KJjwoSzNqJlNySVVJPmIrYWAhbWx1NkRSIz5lYXktLTNOYGt5fWxxZykqXjhrRGplMnRSV2pkK1gwCitvXzRwVHZWPk4hNWxDZSl0Mj9wIV5PaXAjQyg/bWlPSW49Mihfb21fVm1eJkloVzgzbT1oKj49Unx6ZFZPejh+NDw1R00/UUUoJjBTVlJ9CitZaGRrfih1YS1CfXMyaFZuZSVPQz0hYTlHMjhnPSpYKUhwQ287YUx4b3tPYWlOODdDaUtGfUtMQEpuanM4SWNib2FWPE9IN3g8REYtRkAhCitCRT9QbE1Te1FSZ3IjQT47SyQ7aUdna2RFUkxQaVN0QllyK1RpYX5MJTZXYUhWP1hlVUBTN3A1Qj5yQE5CX2hKRiMxTCReNlYlSzsrVyg8Cis3SGElMmdFO2RUeD1FYWlhe3pwVjE2VmdEPHVZX0JJdlQoeno3JUtfVE1Yd2s4cFIqWVFFVjEpNnlMJXF6TFZWRmgySCZkcGc2XzBWTU0xCit7d0EoQElVbW1eUGlzI3d4KFk2czVWYVopYCl3ZShjY0cjMUtqUzg5TmNGfCNzTHRDQFlGYzlsOWo4LTYwRjdAY3AjZ3s/aG0rZlJnPTs4CisqMUttTTctc145UiQhYGZlVmxGaXtVSkp9cSo2XnYmNjd1O1UzMlUmSU5EZHZKeGVEUzR4MWxBNmhieilsUm5qUkAxQGxwOCFEPVReaylhCitPU28qNSoyfiN+VTQ5QH0rJFBTaH5BNEIobGwqXl5GZ1M+WW4zfiRAek13SXlKdlEtMiRNVj5PZE8/WXZDP1RrKD83ez02PjI4WmIjITQzCitoeCtScVRObFJ1d3VoUXVtVWBuMWdRcWtTdlA5JnA+IVpNYSspQ1liZEdCNUMraHc0PSU/dWZlSl9pYmJpKSF7Wl96JFpMLVchdU4hQERqCitSYWlQNE8tJCZONX4ldERmSUFJVF5YdEAhZGp3X2ZiIV9PSz9uJHJgdz9WSCpjaE9PbD9OWkVWeHFFMWROK2s4VEMzS2VkMTVgfWl0OyNyCit+MS1mX1hxa1EyKnA8eiVZNE9WZGsmeSsralREM3MoYm18JHsjP2E1OVM9WXlxK1o8bmp3a0JGNkhAZDRwdEQ/NyR1VD0ka29nPHBmSFo1CitxbCtvXkNvbzlxMjImenFjZ3FUfUVIMF5ObTZjS08qY2IqYkdGSSF+QEA7azJrbGpeQF5hKHcpfGF5ZHQrdmoofHgwe1UzPi1vbzlkby18CitBNDB4KSEle3l8VWl7NEY9JmNhYV51eU10TTxudHdTd3oqWGhuPipTZCVtalNqIyNTZFl3IzxuU1M3bD1gc1VmKHI9Kj1aaW1iX1ZvMmZOCitkQ35pKSRFWHNFdXJfSih3SHdXWnpgR0RhI1hoXmx3bW1raDJeUXQqM2NLSEtXdnEmK0ZAUWhLZ1VDa2NHd1NYdk4zKyRBQ1Q5YjIle048CitjMnpzeDwrXndJdn5LdGc0Y0YjPyY9a0ZYdzA3KmZxYFdjZEZwe2FHdkszXlNpfGUzYXpxPEgxOzlAIyEoSH5sY3A8JFlPQnReK1k/YkVMCitZWHk9dXlGdCRtbjdSWnJlQmQ7MnwqeUlUNkFHb3Q0Vnp2SUVWUTdFcHVpTEhYYDZEeHIzd25tdUBnYnBKLWR7aCpPNU1LKUt9SjJAcVJjCit3TWVnS21MRmAobCFndjJoT0V4VSEjVkQwLXBRWlZnTmQ5YiRyVE80KW4/KjB1NHV2LTU2USgjM2dHZHkwVnFHVlQpP0ZwYV8+bDxMZG8hCis7bz1MVWJTTWxfUnF7dl5uV3lnYXxwY29yaUU5LTJXOUdhU3VOYjFja3thaHI1LX0weFQjOG45czhjb3c1UyUmbT9rTDZ7cDBZJCZPWl5ICitpP2VuTFZNdF5CalczbmoxTiQ5P04mO3tqZj43VGZ9TS0oR1Zec2I8bShRTUF9REZzZXJNcT5IUi1IWEE1PUUwYjVnXzFeOT1EMSZDJHR5CitYc3hXXjQwQjxNVko3MjUmY0d8Nk94JXc/RmM+IXk0N1pFKlhuX3ZtNWp8Mz01JE5PLS1hIWktfEI/KFpQXjZ0Nnd1fCtSJGY0YUc0K09SCitNNTI3ND10cCFBeUNgaCN8cDlIdTdLaHJBWTx+IWctV1dqNGQqUSFLY1h1a0dHc0hLKlU2fmlkVlkwS2QpbENNOWFKJDheenZBdDgjJGh6Cis2ZjNlM2l1UHR6RjY2RHs1YGhKWT1PTGBTYnN6SUg4ZEgmbWljZ2VQeUxLKSljfF8pdVg+Q1kyaGtvcCV0fDQxS0AhOUJzdEcpQi0tUSgqCittQnM8RChjITBvb210Iz5oZiRmejx4Z20kRXhASTBLQzUwKm5fRk1DN0RCVyY/bSY4d3AjMVAwZzM5eTFIWUohVmRoU2okUHhpSG45Kjh2CityK2MjaihMPGs/TkwyNyM/TVFQP3dDYXg1cWEzJjlkbjVGNXUjTCs5cU1PJmE+Tj4kbmgqUjReMyorRnQ4SG4oa15ZVztmVDJzWndlUkQmCis4akVGanIhcSk7b3hqYjd3QD9tPE1kNiFoTjF8Vj5IWGZkVkBzS29EQUheZm1CSUo1U144b0U4UylkYSgqPTRqdkNmbWJAOXZSX2Y+IUpHCitkUV95KXZ6Z2NaQmZEeSM2MFIlQGN5SyFuP3BLPWJ4VD48NUZ6Nj98c3tqXkF+WjNucUZ3QEpeMHdPI2lLJXV9KSNEOG95KHZufU1gXlVpCitkblA2PFAtfEMpbHNyYUcyK1VCd0wrZWJfcmh4WF9JWGluOEB1NXEwZjhFezR9Yk4lMVlUeF5Rb2hgVGd3dkIlYSRNO2JGdH0me0EjaWBNCitCaktnVEEhOWsjXnFAbktpN1dyPlM8Pz9mbS16cG1AVnJaNXQkb1pTKGQ0REQ3Sk05aGgkZ3JnK1BqWHJoXkhTNE5RfFFVZXZzXkoxfHFFCit3N1Q9d3FzVHx3VThEWHMjMk0+bWRXYFJKeVVkfmVKZGB0NERgKURfMV4mZEY2aUhDIWRgUXVffHxzK0R2U0JnRlRUMUJsMDd4JiRVUXNNCismb1kmYUt2N0pOSUFtKkVraFNeTUo9Z2VTQHIrT3pmNjBVd3QxYEh7eF9iRj9JZjghYmNKd3t8NHFYK3E4d1EoUndCNjAoNz58STM7Sj80CitGN3NHQkI3R3dGeTRMfjw7YTZtbHxlMFJkJTk7Z3ByOHZKI15VbjExMEtXVztSI3BjMkEyUX1iPlNBbUM0e0dkd2t0PkglKGVrNEwyVUE0CitJYEF3SzxkeSMwVHMjaHIqUVZjaHJFWXBKY2dZZD53fV96T2hOT21oNmBOZmcmI2NNTipJPTdGcU1VbmRmMUojJXQyLTM0P3dOdyQkbjFGCisxPW88KFdYMXtZYUxGYUklYl9YaG4obUlgcDk/Z35zP1lxfG9QTENZRFZmSyl5ZFZHbSg2WUspJE9kTVBecF97U1dsfUIkKj1fb1olfXViCitQNUdPZEAyUzFsdkQ1bk5lYUZ0Tnh8MmY2dWQkXllrIUpAQDIqTnhAST9iRF88fEpDe2g+KzA3aWJedkdiI0F2Mj1wIWNrYj1paSFxbDRmCis1ZlQ0WSlqJVM/WGRuXnFaeDd3I3RHJHU9eEF6VUM7PGRjKCY7OyMpZVZtRzQydnF6NkQwbkYrPEcxZXtLKm9RI0ZTWWkmemY2KHczWngwCitBaTMyJCQ5LV4wcmc1PnRNQChpPlJBQSopYERnUS1QdFZpUGJxREtzKShldVNMNVkqWlZCMnM9RnB7PSVBO0V8S3ZPcyVzNTI5emw/M0QoCitNakNsQk1ZQFhUdzlPSitBYUskPWZ2M1BOT3hKIXZOPGxKe0c5PSQ/fVFYeXxzVkBRc31fYEhBQFFDQjVgMW0qUHZPOWNqVz1JZU50cGQtCiswXldRO3I/QVgtIyhRcGlAJTY3ISNiZ3QxQDZjYCVedEw1RkxHNkNrV1dmQ2ZpKylQSkE/RTZJYjcjcEk1aChvY2x0ZnBmfGhYZ2ktWk9BCit4QjheQz5PbzQyIyEtVXJyRWB9RUV2cmU1JXI7e2QjSE9IWU5JMS1PMV5yeFRgLX0wUW1qVH55MzJ2Kk9FWWQ5OzlPNHx4S2dmKU52eU5nCit3K0dlIyRnSTclZkZyYmJfWm1pdDVoPk40K004c0FAJTAmaXNzPG93IShaWGFaTSFaMyEmMEI3Nk9wYX1POVl+TVNINTh3eytNQT9fbD1wCisjOWA3eDw3U3pGYy1JZEZ7bSlUI21pMXFXS1l+NH1aJmtxZE9aaVNZaWc5Jj8rPmwoajMxQSg8NHkmMH5+ekAtJCFLZ2dpJXBsdElsbn0xCitvVXY9VUZPZH0pV0lqXm1RfT9xK1lweXxheVdXaGxfaDlNO15eQHVFZH1RVD9KWHpgb0lFbzl8Qz0oPE9KT0J1P3JDVzsqKzgpSmlFUld8CitYJChpPT4jVmI8aVVue09xdi1TX1Myaj9jfD9aNmh6WmotdDU9MFVndU8rUGc0cCtXKV4jckZNanIrdj1aZyhaZmBOcio4MVBVPEZZXzttCitVTEJ7U3BSY21LYDxTM3lPdFVUQ0ZAQSkyMUJ5JF5oYTs5X0BjOVd5YmEjc0VNTlUwPDw0WFFYckslbFA7TG5DUWkyV0hzZTBDKHZlNSlwCis1P0d+N3NzKzk4a155ekQhYUFkJiZXUWR4eWgxTmojWDQ2ZG1uOUdsZShYaHFMR0VSQSUzKFA1QyU5IygwUmB4KTg2TmA/WUZMYlp4WHJTCis9THd4S2Y+MTJoVEBmdkorPip2c1YwLU0xfSpOWEw1O0wmflVAaWVqaUBpZz9zUVN6a1B0RnpHKlJjdWUhWk1BY1g/TU1BcD4tX0F+QXA2CitSMVoyX3taayl6aXJSNWFobCEoS0Z8TyZscktCUEVvc1RCcWJTU1lATnhaPioxUkI1diFgV1RQJE0pKW8lO018fkZiRlY0Vz1Rdkh6dCk4CitlPldWUD1XcyV6Jm0+Oz96dChGSnJ3cSRJS19WZX5SSGV7dEo0bEU/ZUBrYXRGKzckKllEamE4an18dlVXKmp3bGM9c0ZmUTVoR0dBcWJfCitwJlZBP1JTM34lRTljQXQ7TCRIN1hpWFo9SzFMY0wraWR5NUhKJjNKcyg8Q01CTVNWdio4aWlmO2sxO19pRXkheHYmbE5GJDI1d2FDb0taCitTcUtaN3pMJE9CRTgxN1BXVlNeTlolZDtDOTxqYSs/V280YVpmaC13aEBpSD1qe1gyLVNyKmtKPX1VKmg9eFdZXzAhRVlnbVVVOTsrZHxqCisqN0Qzcjd6TGhnY2U3RHwkWitNY1p0PUB4SmU8MmRPallkMkt0czBIKUNUTyMmTncjK0N2cll0dThAZyUkeWpHOC1FZ3JuZ251SDBhZE1fCisoZWs2MSZlcStXJEI2P04pRTA2c2xDTyRiJE8qRk53QVJ7OGJAKnU1MX0oV2whcUZXVlNvRXkjUkl3b313QzIzVyNzTmsyej11bT41WTtTCitCdG8zQCR6eEchQXpJSDBFdyp2LVdfWjllYyR2dH1fU2c1dWEtSFNAJVgzN3Q4VkkkdURkKlpjWmh5U31HZyU5fSNqa0E+PntDMnVZRSZZCis2NVdiNTxLMEotMEt1YUhBZXE2cnk9SVdkRX0xfCpqSG04QklaYXklKFV0PE08QCVqKThudDhIM3g5PmxUJmZDbGo5fkgpPy1VMWFeQ1pFCitMZGlqZmI5Uil3SVE8JDUwRF5NQ0E4QEdpPCYlLXJPfHo+bW82KUl3ZmM9aEo9SWMhTWd7WnBCd2AwSS1TK1pgIV54fmBaMEFqSHRSWD0yCitfanR0U1NnciQ7T25+KWEoMGttb3QlNzl6aHkhVHQ2Y2p7QEZvfHthJl9HT1h9I3Z4RHV1Vjsmb3FUc0tPSnVQMTZhKiVRbWFAMitlTF5LCitHeHpnTyZqJnxVNm5mI3A1Z0N5Q3lWUytvOGwhI1UkfDxncXJPKkV5ZGlJZ3dVQ2tMWl5jbXlWO3JiOGplfT9iaER9ezFee2VAciNiNUtjCisrclg+LW1JdU92Zmp3czxTQGY1e1NDNHZPZ3k1KT4jQVo9cGJNNWZneHhUdmJPX3JSaitDd1p+T34xUUwtek51UldBJUhqZHRSQ0EqTH17CitzRXJjPChDe3ItdU1LZSEyU1UxITYxcjJ3RVc3JFhqal97dmNUVFRzVnV6Kkhle2Z7dTZ8fXdlJDFNc3gmKlJEQHo+bGYtSGxfPCpNQCRRCis8ZDZFekFaQkZVRWVPbDBZUFl3KlpjenElUyZOXjIwNkRga059KkdDWU0rMGNucitYPSphcXd1JGJheHxpa31AeGBPeHMxeyRsZFNEWH1hCitpa3JmTyQ2UT1raGxFUXhXYVlfbXMhWWs9a0NZP1JkWj1fIyNeUF9WUyRpR0tHX0AkX3ZufExEPClKI1Y4WnIrNjwxTnVaJWRDcnBFQDczCitme0YhaEk4P3ZHKXs4K21CZkBeNFUmPXZMT3Q/eFBFSEg0RH0hO3FxUGI0TFV7T0Z+X21rPD18I1cmQCMxQkpqck8mRXx8aSgrOzRDU3JSCishNV9JRWA8SmNIYTdhUnMyQ0JTY1l4dkMhflV0M3xTUzNqKC0lLW92UlhsYj5jQjBSN0JGNW1IeyVsS2F6ZTdNVD5rbkk9TylLKm9jKyhjCit4MTgqRyo1a21wWERDSTVEdHVtbnJ6MX1QOzgtOFBUa2J9dzg1cWVQQk1uOTc+eWdIe2tIc1l5SypfSCVzckZ4c1ZkdjRvR3I1clN+STl0CitieWZNc1NGanZhdUIzfmVCTitvNy11Xzc3YmFxa0QoT199ZFBTM0o5Y2xxKXgraVl5cSZNa3hlYmA3WE87YXlBanBDT2R3T2djfTIpYX1YCitsa2kjWGs/cSVjck9rPn1HYTtXNmApa097PVdSb218XntaaWtGc0tSQXZZPGRjZV8oOVV7IXZQNzhoUT8kck1mUSs0ZHl3b1UheUlEb04pCitLalpScGkoTU1gc3U3aDFzeXg8bWZKX3xmUmd1SHJ1T0h0Z1UmMUdqQlZkSzxQYGMhMX4qOSorblRAPzZqPFl5R1N2JFBOUTluJlZ7fWg2Cit6d2AwPWxONGBfQGVPbzMyUzlNcnc8OTc9e2x8eHFaKUtEQihyZ3lkOX5uaz82I3tVRWIxSlBiKWRWQjleUHFxTV9rOXM9Y2Mta3B5ZnR4CisrbXYqSyh3XklVPklXZlp2dUI4YHFlUz1eWURQa2dPPmI0KUdvI2FzdjRvLSRJazxYdXtLSEZHWD98b2c3WD9IZ1Z5P1hCKGdlMkZoWUA0CitQejA4c2JaT2BVdGJHcEY5em41dk8mSEtlbUwzZjFkb282KGN+V1Z1YSpfNyQmZVg3X0dZbmZ8dCNOQjY5ejFXeUlFVDVvUzZoOXtmRyZSCitIMS1OPGVMemRYfkt4RD5pekl1PlFubkA+XndOaEd4OGphcypNQSojQGNaJl53JileNTBkblEmc2MkUXkkY082aWAkTCtPV3ApRT8odHJGCitYU0c2Un49aHFnaTFsaUFOZ1Jfc1ZSXmV+JWtLKXZffDc+RUlpQD14dmpkI3c1V25WRylIezlhfiREO2V9MTkpfj9jaGlZUHVfPXw7UFBQCis7RCtkNWF8MG15K3BydlJNQkNYPztGXnd5aD9uaTFubEM7WUxNSzZQMDU5aHhCJWZHRihtRUE9Yzs3VGF7UmtTRzJ7OEBJb3BFTFRMK0xqCitEa3ZHcjUmQnYmSikpeyRFJn4wUyROaG50JDtxYiQlfnF7Q0YwJDlzc3xJQjl6UkdvQmFEdTM9Mi1DQWRDPVNra1M2dTRGTlcjQ3o3YmErCislSkgqdkIpN3BAJHpsIXFBb2NfJDlDbi13ZGQ1UjwkcXI9RUpOaHJZeCVsVjhESn1LYVJMPUtfRTNRd19valR+RzhmNDh7V0c8fldgcVYqCit0R3I0RmZFeFJAV1ohKjMkX0BNQnQjJntgPTV6LWM2bnA2dUxRUWhwcDQyZ1hrSHBJdnxYX1cyRks9OH5ZVkJhTV5abmZnVy1IJlduNkY9Cit0U3pNOG0/YCQoJmFgI0VKKzZBUDNvSEwqfnYmcVY4R0JFOzw+WUdSUVhaaWE/ZG97d1h5RnhzbFVXZipSKiM/cFpCY0Y5RT48ISF4czBSCitSRjRmY0Z5dDBRNzk1JjA5S0gkcG9idE5ffHRiNXE3KkJlO0RIbjkzPCRpSnx2UVZJJk9RMyFsZ2hQZHVWMyo0Sn0/Kk1YP21VO2hQNHA+CitqcihBTD5eVWA9a2V2fXBhLXo0NXRMZnVkSnx4UDNnfjZreX1tI0phcTNEdkVwbFpOZl5vY1gyTFU5fVgkK2gwM2FtdW1ZSHdIeldnPnAkCitGM2J2WV53QlMmMTtTUV8hbHleYzQybzs3UDNYZzZzbz17JlgmSiNQY3V4MVJZWkxVSTJmT2tpeVQ3THNyKD8lZnYjSGVAdEIqQj9qZlhQCituTEoyKWJRb3JueCsoI3ZHK0VKak5iTVN0ST1wUWdvPyYlIVdLNWhmUkNjdzVEVGZeOzNaTWYwTHBnRko2NF9tVjVhRFgqTkNsI3hTdlBhCitVYUV2VFN1KVpadEA1RGpBc3o7TH1xJV4+P0AjRUNEZ2l9a31UYmVma3s+bjt9U3ZuYH56Nz85YXdFc2hfPnZvNDJKZCtoR2VXVyo5MFVZCitSKkdZXnUmY3dlRkdnPlJNLUUmOG5eMXYlQiVPNThyRkp6Y09YayQkRTQ8Uj5nOSNePDxXcHVAT2FUMEd7fm5GfWJRNjNhPlBydVJuQEw+CitSXyN4WjYkWWE3Qz5gWDNwI3RscWdRNntwfDNaVFNaUT1mPzBEVU5HP09Ya2xyKXc+K281NjVaMGlPKl4haFFpR296T0xkMSZBeCF2Xkw1CitpU3FwZV5LMER+aHdRVyM3YHl8IUklZ2NMSXNnazBnKDdtd3JuX2N9VlQ9JV9efTdzTCVmMnVaUVNNP2BydGI5PyNlcHdIdn5VMkJmSWIqCitmKC1iT0ZwbGN1PjFpVGJwNCRVc2A3UmBaMWl9cGoyK3xYR1Itd2JuPCohITsrWG8oJikreHduMXFuO15WdHREeVZ5RUgpPFlnaDgmR3lUCitNPiNvOVg8KHopMHI2RUxQTGNaWkVmcyR9LTlTNm5lamp5fX4kJlRfI1FySW9uSGpqZ2lVbEJRaVokSmBCfU9XQk1VIWBxY1k+S3BCZjxeCitaQnBrOXZRLWh1QTI8QG55WUdWbSk0JXMwVn1SJStkMEpucGNpI0RsZCYtNDBrVSY3WUQ0Mj5UajlQSFhEYmAwUyhPJXZXUiRiKXU3Yz44CitNemU5JFY7cFktUDx7cjB7OzJYcFA8MDkwJVQjfkRaUVdwbUNoaFc3K2tMWW5IVkFaNEA2T0xLbkpzX0QtbyFfY05KTDRwJkpFXmZ3eFFtCitlKXlHQV8/KVg7MEg1PkdCeSNNKig0VTlePnJZRnlyU243Q3ojOCNBUzhvOHk7THNuMSZqSmVoa2R8Pz5IMVApXnImUFBoRzlmZ2B1UXNNCitwVEQlZXBPZjJDVW0hfnFtN3dNPkg7dkJMNU84ZkBtZE1TUGJOailGR2ZyZ0kzPz90ZEpAZitCZ2gteDBQUj5XRktkfXxaMkJQfSkra0E0CitBY01IblpzZkwhI1hXdCVrSHIyPDd4JT1Jb0NEO3JIREdaRFdaWnM4Z0lNUiM3M0xpWUh0QFElT1FWOzY9JVU/NiZsbjtaR1ZhPVFHX3okCitOI19SZHxXIXUwPDlkVGBZR3srV2wxRTIjKDRkemNibSlEMmJDdmwrSitVTSpOdGVaY2d2JSlJfCkjak9OeC1EXyY+P1VnSDw9aVVvPVVwCitXfFNvKWdDS1MjPV9edCRgSlQwN1E+bW0xJCheaklCelFjSiU2eW9GJVN1JW8qRG1+QyNBKFBAQ2IqcjJ0UWB4TTxzcCllQyRBU0hrX0AkCisxX2liMFRUfUFZWElsKXpReU98WXs+Tl5sVjwrMFZ0OUowJW15T3lSbUhmQ1o8ant0MU8mdnBtcnU5UTBVPSU9NHUzd1dNIUx2M2pYRSZVCitlRWE5MzE1P2VzXkY7R3c2Z3hkeWBzaT9DTkpyVEAlOE8mUjdZVWtNUCRDSUpiQykkYzxhJDlqeWo1YWwzRlo8bG9mYitGeVZJcGRRcGVACis+eFFoPE1mbWReRz8zKkZAPChBbU95R1RSK3NVO0FVbkxHOFc1MTQtJV5XOGBfZVEweDUpbC1fKCZkVlFkbG1SNTN3X04jN2h6TnljYEhpCituRXs2anJWZSk2UG91cU1ncT48X2hpZW04OCYpKGd2SHVpRW1DN2R8PmtjalclXjkhMG9wK3BXdkkmMyQxdT49Rm5EdDFuUitXSmA7cGhzCitJc1lzQzZ3aTxVeH14V3A9QF89WG1xent3blo3UElkMytEb1lDKndqJjxHNSR+bi1edjc1fSRnRWJFKVpIJik2ajh8TDB2aDBIVjsreFBHCit1cDVzRUt6enBvMGdQOGIjfFcwWTBuWXt8d1JsSV4xclFpPjBTOWo1PExfNG5RfSsoIUMpZFdyOHVjaXkkZV8mfTFwNzluUi19JXYkWClLCit5ZjhHTnRHN0heRCp0YXFuQkY2c3tsR09kTUIxV2EzckdFITJRYzVkd0NHYEN+akM0N3NjNiY9PE1SRmppbUZffiYyV2RZYHdHUyFgV1FACitJOzBfSTApKE1AfitjY2x0dy0pdE9rKmg2fE8haz9lfXFUPj9pVWRtV191JWpPOWNXQyRobi10anx5YWxvbWs5MHdXI3VIbzlTQztOVHZECitCNFB1eTJ2TkNfZzxrb19QdyZGLSU1cm1ZPDdYZ1VaTF5TN3kyM2RCemdUKDI5bCYhWTE7fURvcHpPOyhhRk1qZVA0Kk5kWmpXamRgK3VFCitXPSp4KXNCJGIpMUd1R2YxQyoyQEBIeE5IPFhucjRtdFdMb21IemIybH04TU91b0NAN04kZUspejh9TFQ8P2VJRVh5USY1UyNKZ3dMZlVwCiskX3FzTmJ9OHlQTSh6Y0V5Yz5kaWRlNVZOVVpVdS0kaU1KUWVKSV43aFM1SzBidXNtPihqZTMoTTw1Yk5PVVFMY3UtbkRePiZrdkUyI3N0CitGaXFqI25SVkFAbkZyQiNUJTljWkJHOHF2aHsmUHh4MCtWeGpHOUdYMUtkbWVLKXFwaGdQdH5qSSVBeTAoQENJMUBoam5HWTc/NmhOOVF4CitJRFd4cEpkaE94OHlnPl98YnJ1Qzx4SnlSYzZTTjNtNlczOClrNVRkcyFMVjRfMF8oX3RzV09QSm1DWk9SMHBxTWAkUXNmQjFDSHtVTjttCitQU3Q2c0w9TVFfSHZFP0ttTnVfSXg+TVRRX2RSPDFFek9NPEt9bjRWZT9tQHAySXEpXjVXYUQ1NWoxbVN4dVojP2IhZzZicyM5Q1JlcC16Cit4I2srYHhDTG5JPURrSzN9VW5tVEJ+KUY9ajJBTVU8QUlETTtCTz5PWFJBcmxIdXB0WV4pbHwjNXhQZiU9SDF2QzcwWXYxWTteWEYzVkxkCit2YjdUJDNheC1mVSkjVkghcylOMFJjaWRSOCkoVlQ3Z311eEp7MmckQlghQDxObHwkeDJqRGZlKGx0cVdnSjgmLWpXPWgoSjdNQWktUW5+CitmP3phZyorcH5sMHUlOUkpXilBSFgmdGQwRXRyaX5jd096PiFNQUZkSHgjVW8tZHUoVmhGcmg9OXg1a1EzSGlGPkdHIVc/eEFLa1Q7eHk7CislQ0kje2R0UnRlXjgoVlI0S1Y4U09BZkx1Pn53PXlieEREO1lfd3khfFJmWH1TWnBScjY8JU0/UzxRU35WNDF+N15CVWtDX20oNj8mY1NzCitAISMpZWxvVHRPdk9sKiFfYC1jbjc2akdCVjdWNiY7SGl2MEM+YHI1bEkqZ1pkNGooY3h8ZEItK1dBK1MwS2hpb1ZUMygxcDhVOTt8Q3lUCitwdygtV0IoWn5uS05PQ0lPSzQ5TkpzUWdyaUhzaF9LNXxgbCE7bCZXQnx5Tzs9NjVIPWBHfWsyRDR+WDF9KCRHOUdWK2VHXmVUT2tRIXEmCitWO2FIMFhwYUJMQWVSYTNNPSo9V2hlOF44Tzg4Wm0zcmM0RXd+S0Z4UHc8YyNqYHw7ZCV1KVpQdEg+P0M8M3F1V1N3WWhGUUghblZCTlg0CitBaTRnNktfSyVWNWwmNVZXbExBNmsydzghbChAaHY4WCE4SiVxKlZTNjIxOFdnP25CY0F7dT84XjQ9PGM0UnxVfUZyYEszYGdCJUB0U2F4CityI2s8bnRnVjtrUT1GI1hhJUdgKnw4VTNxfTRmQT97SUorMjNhR0cjTG9nTi1HUC1wSkBIO2FSdSNkbDR3eTE/PXwhOzdqSypvTDdYOWtuCitpUSlpdUhmejlLNzBGMjBGR0dkX0ZHSm9xOVRtSCtoIUlNVjxJdkVOP3Bzc3hPYGlQcW1iXmQtME1fT2ZOODtBMVgpYEc/PldeeFdTRE1vCitFYVc0RC15THApdisyfiVVSUdyOzQ8MFlEWVdmIyY9RyMmRGA/I05QRGFvM2hwfGM0cVVYQHR5LUlTRTR8SkctMSlvY0NUUWkjbiRUUUs9Cit3PzllaVRsd1VmVilSYXdCfnRhUzxuQGFHaGtBZjkjYHYyVF40TWJGciE0UD5ZY00/NVExVDR0ZW4/bUlKZGktcUc0WGx0UV9SO1g7ZzM8Cis8PW1fRmk5V3BXWDR1e1l4KFV0cUhiKk58SVElanUhVXoxenZkaGlQPjFsQ1htNnYqKTJDUERrbjJqcX5kVm9IfWBDTyElc3VBKCNqTVUpCisqYEwpO2tET1BIMno/bUJFa3I2azdpT04oNnohVmElLUV4T15JQShxbGBadSR3WnJvOElhRDBDYW51V0N8V2AqS3ZhdGowNTB0IWBgVD5oCit1enA9VSRDUEl0PUZxRCFVTzxobX55Q3grcT9JMyNPQDQ/TUIzXlhLS256YyVwPk17WkFAOEBiWSp3Mks2VUslRGRNZGxedDVONGN8PnlICitJZ3RjdXlDaUB7KEQ1M3paNHlwWlE5VjYkWmIjTlp5RWZwbER7U1hMMnE7VStYNFF6ZldManIteGwkPUUlZTR9Mzgwd3A0b0BJS0J4Oy1iCis3PlBaMktQSUhGI3BNOThfd2FrUE57cVlsVmROSDZKLWZAdTNKciVrNThfPXozeyM8RWhCaEI2RXs5NVFaJT9rYDhAemdRNjtVSklzeSYwCitAbWhTVDNIVkp8PDU/Wit8aFZLYndrYX4+fSVFQSgoYGQ0K3Fiez90Z195PUZ6cUByV09iO0xUKihMQ0c4JjNgdF5oT3w2YXtzZ2JuZDF4CitoZl9LfDZNeG83K3pIbUJEM0dNMERxTl5fMChFZyk4UTRwQnVkN2xVaEAyTnRCKG40aiFxWTgjSnslcmZ4cSpRQiYqWWtvczhGQSRnNFVqCitDUWU3ZTc7a3Z1YWd4PHNPaUVZJWpsb0g9KXVVSUVIaEAwYHRfJWFRPH14Y15MVWlie1duXjFEQC0jMiRVe09DZF54YXljKy16REFeXmk8CithOFFSIyZ5YW9PVSYqOT8lZV49M3A4KV41MT09SCZ3S0RSO1NKdFpeN0thP0FIKWItSyspSkxlJGthKHYwfihBbHtgX2x3dnt5Mm1DQForCit4dlRselJ5WDdXMm1ROHJRPW0kazJtKG9mWjRYI3VsRE5WJSlGLVp9JSh5Tlo1Yn1NJVd6SnpZPE9iWl5ZcUNLfHdsKVJhOVd8bjQjNlllCit0XnRtX0llMnpWXipaYCtZcSYpIV4zcTxwcHFEVmEzd1I/RTUjQEp2eyUrR0hKWlhqbWJzRUV3dGlmTG5kSUBDUURHZzZ+NDY8PjtINlp9CitySjg3RGVOKWc0NHNGRU9NeVliQURBVzs8SmI4czNFTGpveGpFRWF+KCNFVUE8dU9TKmpabi16T3hOa1VyVCZAO1Z9eUFzfUlffHBaUSs4CitmalBEZ0ZoU18taSlNUj02d1Y9eEdyPW5aU3o2ZTRVRWJtd2xYVjtXM0BLS05fV1I/R2lySkR6X1QjaVVmYjkrSnY9dWdzdFduVEszeGhXCis3QSoxJVdxb3l5JGNEWlQoPUh+ST8oKiZXbktDUlBqYCE1dXx0O3ZiYV9hXkx1IXcxXnwzQSVvYjhRLThsYHRnKk5yPXJpfTdPfGV2SDVtCitRU0o0Rj5WNTdtX0wyQnhsUmo4dCt3QCRDZVZ9SzhabXlAWGs2Nm5wMGlFUyR0USF9VD0mbldPVEZLcTBsJEUwYE99VmZmZjZHVFhyeVR2CispbCM5eW90WD9UQjdjJF4ka1VPU35qPUx+UWoodz5Raz4waih5WSQ9VytsOGIxWSF5eD42NUokKHlPZCRlWT9JYXRMVStlbC1gcDIjcWYoCit2ZFpHJFlCbk1XQld1OHhuQyNNTklwKUQ3dHs2aUNOZWlMM1lKRjNnWn0leUorO0xiKnxUSGF0NiZPbjUjVUdQTEN+VWdlRERsWEpDPmNhCitrdUV7dkF8YmFoMHstITZPc21QbXt+RCYqTnBqYnV0VDl2PVZ6X3pEOzwoVCNRYURmb00+WipvUiYmNXhETH1MZyg4PDQlMTxWPzI0OV93CitUejNvVzEtMUozT3d+KU4qVDB+WSFvS1pKPzY5eDspRCQ2KjdeTzdoT1V5VUBSRUdKZ1BmMkRfOzc+SC1oeV9XS0Vydj1KbzEocTRzKzE5Cit6WVA7OWpzR3MpRypFbSMmKHRAbG5aTiQwVzxJKEhuXy0+V21iZDhfTkE/KWJrTUJYM3ckUl9UaHU9bX1BKF97SUZTKng7R05qdEE5ejZACitnNCU2WSRGMCZiWFNkUHwhelFAJGxSakhtI1MwTCFtbXp9YHd1dj40I1ZtcyhSSWowPj1YfDElWilnP0ZoST5hIWx2JVkjbWpRa0J2dUp6Cit3NUEockR+PihUWTwxcUBYMXdJUCY3WGgrcjxNcU1lRVIpUjFQPnNOKm1NK2JKNkJTJll2JiZOPDVTQE9SMiQlaG49R1EzKHteOFV6PkwjCit+PzkySWJsSG9jZ2JXKT19S210fjx5KmcjWDI+KGgkYk41TFYta1VXSzd5O2NyNUQlLTE9dERVX2FiU1duQzhmPDxvdmJlfip+TFhDMWtJCitzU0IkR1BXRmx4Q3lzfDJmb2ZOJERhcnlsU1I0Xjh0clpIUnFEZjY7a3tRVCMkPGFOP3ljMCprPSpjfEVZYG5GaFgkPkhsUz4qU09XTVRuCitwRD07NzV+aHVkbF9RNG48SD5UT0NKV3AjRzVvTl9eZEdDaTJsdGxgSTMpRjBgVTRsa3IlZXB3NXNVYjR1K3EhKzxFZzNCIWNSQEYjYWtBCis5WkFLcXhpaTZQTzc5a0M9SUxwT1YtJVV5MlNYe3slZmhVcTZac1RgUFheKHRCYTEtbkNla3M1ZFdmYkRiOWQlM0V6RnhDZDI8M1VCbzw1Cit2NS1DaXJNQFVAbHEwYj5le2dmKkIzQWxKQFhvdVlmfVgjOVBnNl48dH5oV1pBb3FgaHspPzdgV0dQSW1XSmwzNjE7dnxzWEV5JlB7I1NPCitoWntlfDhweyprU2hLVnxfR1FLQkA5P0clMnpFVGJAWEAzJil3KCpzSjRzM2orV0hNPWlaJHI1XmxNPiE3WTJvbztMTTZ8S3tYaE04VyZrCitFOE5wLVEjbH5UKUk8RiQ4fTEmenZYekItQm9GQmdXQTFJUHItQXE5WHtvJUF0eFEkdiltUjIxcVBRY2pjSmE/SigrZ3o7OElXTmw4I1VUCis1JjRtKS0jN3VneX0lP3R0JXl1d18kbE5RXjw2TVI1YHU5QFhXdmNxRUo9JH1XQyh+LSZsc2RkYz1aLWVTN0lMLVBWWmIzOSM8STdtRE5PCitMVUklRitQJkxaV24jcnNRMTMtSHc0cSNJNG9QMnY5RWFjQDlBUTFocTNlSWM7JjgjOyR2bl9IWUopNT0wRllkKHluKkoqVjdLMFg7d0VfCisobk5qY21AQCk3RG9pfTRPPUJZNzNfKkRMeTI8SElZRUhJaE1FNiRqayhzcTlifXlBfXpgNVVENCZseTAzeGJiQXRXKjVkOGRoM01vXztBCitJPT13KldwT05sVipfWEd4dXFGIyMkVTExck56az5vMVR5eSNldElfR1RVYVdvaTEhX3UzR2E1N1FMbiM0VlNZdy1NOUd+KUxkTSM+V0VBCit6ZjhIU1NxbT8tUW4kSDlSVXo4ME9sNGBPb25tNW5yLSlrRmxuM3whKm0rYDdCcEt3LUUpbj4pb2RMWjg4PmhfSnYzNj1fRXpjJDt4PjNoCisqPjdxNUNEVkhJOENeOHNYV08pVUhsZGdFT2ptKWd0WkhjSjhvOClQVHlnZiopI18ySENMMkMpY2AmX05aN3ZYM1dMQiNRTj1pXnRWfVkhCis7cnBkLTsjWndKKG9WKGlIc2tHPTU9endyS3RsK014eFR7NWE1bSQ2LTh9VHxCd0l3WkNEO3NPc3UrfURWTVZxKnl4aFVvPjE9U2h2THhVCit3U2tLWD0rMkZ6dV9sMTNDUSpeVjtYRkkjfilKY3d1NEtRLXQ3WDgtKShIMFJJbHpCdkN0KGF5PUBpcmdYOVlBPztJbXUzfCEwMiVlSFlWCitgPUU5aWc8UTA+OWRuPH5RMUslPFZZbDRheiFrTVUlTHF5e0xgRnM3YihJWkFQRFlJUndVZjxiJmtPZXwkbll0Sjw5dyUwcClibllSPCMyCitSWSkzPzRucHdBTXMmeSRJYncyaG48dj14YHAlcitYZmlSSm9hRSFNUzQkWHpgOU1ZWTczMHA9QzVrTGp0ekJDcT8ycnl0eUFzWWwydWY0Cisja1ZBQHh+RUhpSSQmKUpseCNyckdsZXQlO2RpKT8wOFQrQm1CSjNoMSZgcTZTXzdfcTsmKkI+M04+eCRGeDkrdFcxQjgkVXRPMGhXIWxpCitVa3F2IVg2ezQkY2BUN0JFTURpbHw4cCZKNnpabX58ZTckKlI3MFlgRlE7aEs9dEkmdlcoKGp0MnU5bjxFKllDfFA+MU55MTE4SnVKJEFMCis4RVBXJVlzTjJQa2VzQCRqXk5MTWFWNGBlOUFqMTleYStMIS1JdCN1N04+WWhNIXlvRylYQmt1QGt8OFhSSGtrcSUxbDZ2NHZVa3ZhMmAxCitAe3JwUmM4TkNDeGI4OUE5JlMqKntRYUR8JCF9JTZeb3QzXy1nO3tsdnRjYmxLWDNDamk8QnVNMkhoRURpTFk9cEZWVHlVMyt1TyFRcGQrCithMnJoaEQoN0NfaCRuZ3pMT2s9e1RSKWlTPClDa01pJElOcD0+RHt2fXl8Z1o4dzFpWXpHQVVKdChjcSl1VlEwdXpFQnskeUpaMEUxM2I8Cis1cno2aTByb0NoI3soNFB0di0qPjArYjk1QHZedGpsSFUzPXs2cnx8SFpTZlolcShNaCE5X3NJdzt8PFdIWGw0Jit1WWxoVHFzdjxwYXx4CitsKGJVeUJaRmEkRSFyUzBqLXF9entlQHtEZmgjVmhYWHVnRyFyOFJAPGtDdC14WlYtaWpQNEBoKWxKUzlWVjtrWWl5JklIdDc7K1gyU3EkCitlSl8qKihPVWlXUz5vSkZWNkd8S3EjSzI5I0BsNWZNd21vQEBBMSlFVV5ITld9WkFxIyE8eF9xdG85angzJktpdS1sWXtKa2p0QE8zRmx9Cit3cjtUWGJeMW9gSjVDQypRQFFvT2wtdCp9bzVLeVoqKDRwQzQ8YmR2c14+QTV2bUBfdFgwZ3YmazZiY2RydjR7VDw7KiFlNFlPNVdVfEhZCitpU29CI1RaKXIhR0poal8wWiphdVV8Tlc/cmY5WU98bSR0TCQtRnZwempYR0dPPjVpNm9pO0o1KVRnTD11SEsoYEA8U1A9S2J2KnVGZylCCitWfUAwWm99RDBaZSZnKmx3U3o2IyRyaSk4aFRiODZzQC10QGxWYFM0PUJMPUFIdEp2OGEmK1NGNnI2WihJP0AzaG1qTDY3ZE9ENF48WHR4CitkWT0tayowUE19Qz5FOyt0cFY9IX40MmBXSntYfDNCPkVrRW1vKm5ZdihlRndUdEN1ZngkVk94UmNJRWFMR2VoNntSfm1pdj8tQm5SZmsjCislPiQ7PVZOJU1CYXQwcVh8MlhTPV4tbn02SlUzVUl4TzFrfTVzekZWMGgjfH04KXhlVDUhSEp7SWc9aSZTQHlTX1dMTnspSWhNbCppKShkCitUamNKVnV7Sz5HS0dFX1I/bnBhQkllWmxXPEBgd3ZsKygxXlNTQihkJHRRa2MrRmZfVyYoaSszNG0qIVQ+Uyswb2xkITdLUlc8b1ZVfjNsCitYJj9uQHx0bTg3Y3YjSCVXZ0J9Jll4UCRsJTgyc0JBLWZ0Y3gxYjs1Z1cxSlg2QXB5Xlk8dnB7Rl45V25gUCMmO1E3eXtAfkBgK3dxKldxCitXKzRXNUxkRiUxVCN6M04jZWMrJDhfczh3PD9mJEY9d3BYTUl7dUo/djZkVCVaUVgwPiFxQT96Kyh2YjAwQ3g1KXNeWD0oZDdyR01gNU1qCisldiY+JXw+anUyVjgjcyoqQCN7ajh1T3piM3ExUSskTmoqflpoVlAqaiQjQEArTSFMTiZrMGtgIWB5cjxlc0c5Y14+VFJucyFFazskUSF1CitZSz5gNDdzQ0NqVGMzaykld0AwYlBiPGMhNnlWIUwyMTBedkNgJEtocTBnWEJDPE1mZyFXOSQxdVkoKFpxZklDdz9Nb15xPjZXNUAqLVBqCityPCpDX0gyI2hhWCstalNTWjJ6dFMmKUNTRTQlMz10T2NQfFBCeFopXngxI3peT2tZRn1pcXpTJj5ZMX5QX0ZKdD5sSUtfNEN6NW99bH1qCispZmRwTkVgTV8oJClSTmwxQlpOUk5PUiUtRkJjYHtVRGl0WSE0TWNmbEZ+QCEqT0oxVld6RCpHRDZwSWpBejQ+KjhYejs1TjhZK0IxbGFFCisqNXBAdmpuTFZfcU1iMFB3Q2MlYF5kVHRpO0dpeD1RNjtWeTI4eTxVcT9BNmdUOGRjeGN2NkM0JHx3JW1GbHU9KGRIRi0kQz1AQCNfdT1tCis7VlVzITRrKG9GMk5se09Rejhwc31gREpyVEBzTDQ+a30rfEdMI0Z2fTR9QipXI3FkcnVxcGQkaXtMQzs8eXdwRlRgamA0QV51SXYlP1UjCit+fVozNGl4biFsbUJzNmcjYWRuOFpvd1Q2WjxvOTdrQ0s5fGBfO1g5SWRJbGN8aSlSJDVjaFUyQVZGaUJ6YURSSFlpJkN1MHNKbnxYXzImCitMYkh5PVE3YWB4UUxUbCtgMTk5LUl0VmRGdmE9JVF3a3V3VWJWWTAoZTFWe0ZXcm0yO0U8MStYeEJeS1ZFKn5VdTVWa2xHVVNvOShWXittCitPPXtJPyQ3amxVRHs/Y2UqOzVJe31KaElBJFg1aV4kKWF2Q299WCklOXUkUmNtVEVMKVpiJUB6VT1EdzVgQE8kUTg0P1Jwd3Ixa3p5QHZoCistPHVSTVRyZChYcmFsVW9JZGAka0RfOENDO1NZSj9CXjVsQkdjLW9LMUcrZjNSSi1hUURMfVVWb3lVYVpPYHJqR0d7Qy0pcXFnaktmb2E4CisjKig3IVU3YCpIVCYoYlBfXk5kUHFuSWV7PWdmcldkKjZyISZeVklnRyhIWEhObHFJbmlpdT9TbilhQDFSMXhqQVljRDlqakZ9UXNRLUFoCis+TDxOK1dYPW0tOTZlfHR5My14az5lI1dPTElAbjNrNSkzQT9kSWNPfDFLQHg3ez1Oa3tkZ0VIU3g5MH07R3FXRU85O2tAfXJ5czslMV58CisodlBeMy0+V14kUmVQJk4lX0gwME4tamV1OUFtekEpcWopNm4kU0VyI28xeV9lO2JHfWlXSmc5ZUpoMTw9N3I4cF9aO2xEYz8hZ2BnQmolCitlPXpfNEZUNjNKV3tOfD56WGE4YjBDWDt3bXxvYkAzdzJWeCMtK3NmfWdkPk1hX1FlZEtxc3p7UGA7dVp2Nk1+cyhBaFAtZl5hQjt0Z2BjCitaUHcyPUVmVlpLRHljT20zcGA9cjJOQjhOR1g8aEo2T1UrVGJNSFBuMlB4VCgrQTdAKVpadysqbmozQzUhfVl9YT5uOzNUci1Dfm96fnN1CitgIysyTVBKbSNmZUZQKTcqXnMja0BiSkVRbWgtMTtkYld8IWpaYmM4ZXZOXjZ3QG9eaXYqZWBZazFwRlBQM2EkbUQrS2pJZWdjY1pBOSUwCis3YDRmREFmJlY0dVd3cCM+aHJfdiVte3N2fXZVMCRQQXwwJmBPVk5QMTs5QzN2ZSlNKEladiNhcUpUX3kzIWJyaCF0U1FrSzk4TkxQLXpsCit3ZStOVzFON3tGTmFuOT1hUlVTdWAtNlllbztVUDFSVntxcSRRPnBpQXRTcm94KH5xVjx4eVcjTWA4MUlHPHg4T1VxUzVxTkllM1h9TzxZCitWZTh5SytEZ2lSJlFubjhKdVVqMGBYcUx0VnVKX3R0QF5wJX1tdWZDaHVBOyg0QTAoXzwrZk1YJjkwZ1dNMn0tcCpzWk87QWtyZCR2NVZDCisoRkluSHpGQn1sLVIlLXZYQWI5bFg8NTM8Wj4qYmA5bTs3S0NaUkolM2tJN1R2NCN3TXRtYCNrQUp1RzsmeipAYik4UFYmKj4zUmBIUjhuCitxNihIfjJOYXZvcEY+LWBOdCVNYz9tcShWUFBob2tgOCl4dWtLP2hZVVVSfWw7bDhkX0pEKlV3I2NaPkxWRT9SZmx5NDNfdDhsM3Aod05PCis2KEV4LWZVS24hOyNDbmNqOTc3THpmVDkqU3FOVDs3NyNSVSREKXNiTm0rOEBYYzV1P0JBTkN2JnVfNGVUbW82a0pNcFJEQHRHclg0e3s/CitySGkmT0V+bEV2TD45WjxtZV93d1V3Ni08Zy1fRV5QVyRXYzxtYzxjdXlvYVluZy1aSSt+STBzcEdhKlNhR3dMY2NYRjE5dnEyYmE3RHw/CismayUjazdxeStFSm1UWCZsRU00WX5QbWZmfjBNWm1+Wll3SHpFYGdJMy1rWkBOUEQ1WUl8MzBrKXUhTVZRQyswMXBybTc8TiVga2NzTntHCit1SDlTSVZtTjJxTkNZZCMzV3xyPC1NNGg1NHFEMkJBMGtITXQ1YWdmXz1KSEROYld4SVE3YkJtMjs7Q0poT3VqKXZvcURCdyROMHFfcW1qCis+O2g/fEx7VDNeRyhKRkIrSEsoYFpzPm5jdDN1cCpGbEp5TWRkcTNuV15SSHYzWFp0U3d1ZlBgJExTeWtvXyM/dlJEbF9+VTZxWCglJmZyCittVXF9bkNJTlV7RU1ENTVRO3A2TXJlb192bFJBTEhlYVVJaDRuS0RBTH5nRDZMeXpsezVjSDtrZX5JJUp6Q3sxVnxBZH5FeypkfkdOMl9PCis7eVNQVUNDYWBxbkFGdyhxfW5XPyRQKTdvRm0zPm5DNV5BcW1zaF9XOGYwSylVOEgxQUp8LXk0ZHUhe1RvbCFtaD4wUXs+eSp6d0xRc1NtCisxZ0Q4dTEtfnR8QUEmQkhsVUI4eVpyayVWTWFeUCpAKlIrek4lXmNHY3RXdWBIVjBlX0RFNjZSfjJWZTFXNX52T3kjQk5oTkw1fHFheHt1CiszJmBXdEtLbkJUel4/dnQlOW9ZcWMrKjhSJDA2RkVReUpQTmZCcHxYdGRzSVJlJTdodiVJWiVreFh9PndAeTIhYk1SX3R5WVhDSmtPPyllCisrK21USCNlVXB3TExnYHNuSjxVa3tmYjQmZFNOIUtNaDVzUjV2RytnNkQ/YWZTcHpOaytQbHtKdV5LNDR8bEFrP3V5eTdtM1NLTnx9U0RiCitPKno8OStrbmtpbSFgTDhmdXZFX3QjI2YkRnl1a25nbV9ZSF93WjIyR0s3MVI1TntsdVRuNnRDRDRja3leZDNSZ2dfcTFDJT0+PFJJVEp7CitVcVdVVUJhVUBydWROMjg+citiODVXZVRhVmktNShERUVWeyRhTihPPWFsVGlkUGAtPlQxQTBKJjAzT1VGZTNpN2pDbD55ZDlzdGomalhyCiteKmFXZUIyQ05vTTMpYFlvPm97ZSpmUDV0flVjMVVIeyglRmxQR0U0ZlgkQzBBdH0oOTQhailzUCVMS2pBTVlMNC04O3p7Zl9+UnBGSnNACitGQFVsNGdhRjJBQ2s4T0tVMyVJOCN3cWBRM3Q7VTBtR0oqfDBPS19YTzZ8JkZzUXx7YHtYWXZ9Qj1vQG0jQDNTcTdebTw2I3dofj03XmhHCitHPENPbiUwdkxCY3xET1VGQXRtcXNWKCgxPXFPN3tjQGpFT3NFSU5hTmZ9KU5KaXNGS1RpSzVCS3BmZmxxP3A3OXszX2BJPyE7RTZOZkl4Cit2R2hIYkJ2bVgoI1FaPnc5cWl1O0MmT0ohejdYN3YhM1JFbFdve2h4RjFlVEQlKz9mdV42YH5KVE1BSjRobHgjISZWKyYlN2JKT3tBMT0+CitmKCUxTmsyd1V+S2FeRHk4Y2dvdDYkVGUhVVhpT1B0K3JJS1VZSGxqQl83ZkJGRjl1eCZSdno/aS01VyhPRnJadkUyLTcpIShjIX53Pi10Cit4WE92KjZUe0dII3h3I1c5d31rVV5IeFBgMmJAPUw2WlpGezNzcigqcDNzNzhgQ0ktaipndlI5RXoqeUk3MF9ya08jQ240WXhZYl98VEdECitBN351SzRtMXZRST8hMG80PlhxTWtJMXlPZ3wzc0dYUk1qZUhkcWB8KkpOYDxRKTI+VG5UdmQ9KEolaVlKa3k4KzZASTMxRUktcVRfQ3AtCitAN2dhUl8jZ1dGfDt6KG1SYWlwPU1JTVVjbzlCRkpManheJGFqdXd0SXs/ZmtYQmFLN3dCO01eRVk0b1VmPFZzQ30ofihCamczM280bSNgCitDeSpSY0BqWUFoYHJYfXIoKk5hR31AQmFOKSNsI2V0PC1RcX1OeiU3cTcpP1g3eDhoQDZMR0BnfUBHPUF3ZyhzKSFwKHp4JHRNO2ZeX3lyCitYe3NrMkRyTT9OR3RtSnVRd2pLM3dtLVBlVUFNI04+PkVtWlE0NipmWmlRI1hUK1MqNyUleT9GPmxiQ2B7cyEqdFZoOG8qQm93dV8qTjMwCittaDN1LVQqYEtrQjZZT2B5R2NHWXc9MDE3N2pKeV8kfShqZWNaUGlYSGBETTJSN0BUYSpSd0s9aXt0LShXODxldUg1Vjw8RStmclRPTWNPCitfVCR2PE9+elU2OXBrSm8qfE8leitEXzZhTT5OdTg5PCFkMExhSCNXVT5GaTRqU3c4UVp9aj5DVGJGMll0aXtKOSlaT3x0aFd+PEpPT3Z3Cit9YDxxeGJIWCZeYiN8SjNJXilzfnt6fkZ9VylQTXo+QSFPSUMjPEUrfCopcEV2JXc2SC0+JGJNaWlZSHxyWVI1cDU0Mio3VFRufGFvbl9iCitvNnBTKyRsK2UzJnNxU35yY0Roc1ApWVRIV185bEBwM1BsenFocCp3SDVNfjFIfi1XODtgKktBZD0zVjJZNVBzMi0oeX0+a25lYzIrbHdyCitxU0d0IW0+PVVGcDMoIz9wSjsodGR3YVVwOHU+OXBfZkFFcHpNNj9vR3F7eU1LcGY4a09ISXhNNmRkK3djOzBYKEJ4VTRsU007bGtXJVNgCispYTE/JWh1PWRod0FlQUx2XzgxPClONkY/V0Z3R1pnOWktI3pnOSQ5ODFXQE04VzQzTSlIOWcmZXhQRVhheihYejAtMVduSiMhYmJiRHJ5CitaKDtFQytQPG17R1paQDJoNi1LdWpgPHo2VmJFPD8jRnJWfSV5e2tLYHhAIV8qRDw1X3gtOWMzczwwaW1rTSZgKkgqQ1ROcEU5ektiPF4xCitvQHxTM2ZhbFRvY1l+cjJGdl9iNk15Y2ghQj85K1lOJVIqJndXXylRIyYtYSVDWiN3KFZpMlhSZkZBV15mZzc7I2FkVEpVJSVpaWYwZmlDCit4RnNzYzJSJSU/dT1HaF44ckduPEs9KEE1fldNX2NjejBKWF9leS1lcnpVMlF1c3g+KGl1bzthemt7SH4rYDZSWHheUFhUfHttVHQlOEJ2Cis3cXZgKVd0eUo3V3tOTE9RJmxFc04wPEhVIVJCMC0zVGducHooJW4lVilDdk42QG9YaDdReTM0UHB4dm9CYHhtZnFgbXswVyRSeyszPlYhCitKZXh6KmRHb3gqdU44VkZSYTgjJm0zbXdrPm5lTCtwaHJTc2VgXzc2SGZkU3RFYisrM2lwY0RYN1ZFQC1DdCZWMGJieEk4WmQ+VHlNRDdBCitKZFZNXlFrT2RGNEh7TE1gfDErWGMobFA/VERidEBhTm4+VDEzaypaK1RHVkw9VVBOfjlwJjVrYz98en1rK080JSVDaGtxWTJETH48JEF7CislWkMyTX5ARWlAa1FGdSZ4N3UzcWFrTyVTUWMwM0xvdmUkan5PWipyT14qPDNxTmQ3YDdKa319QmA+QVQ8M2plcmZZcm9lJCVIaWBSQEw3CitBSkBRPHJES1dzeGFkKTxTQ24/MSZAX0czPU8yYzUjakslMT8lI3FjKXw8YXJGXzNgRHpGOzgtTXdUSzFie3B6TWZDMUhRWTJDIVEyQSUmCis2KGV3M1kkeSo+UG4/Wj84NGpjV1hidjIhfWBVNXY8bT0oJV5heXVqbmVnPn41KGtwd2N4UUU0bksxeWB+ejVVbjAxQD48SVAkb3hkbndeCithR25NI1hUeHV4a3AmQ2IlVX1BTEhMTHl3ayo7cE5WM3chWmwoQTY7N1dyPV4kNlAhM0g3VVkpVTRwJSkmV3M3NzFtSkloQTducnkoMFNaCitlRStaYEt5ejRFVT98X3EmRVJeJTVMUmlzaF52LVMway00JXZhI0paVWszdkROfk9WZDdqdl51YTRWPTtocjhoVzZ4TSl9UzZJezVzLXBYCis/Wmc+YVZDTzA+MWdnM1FFO0lxazFpUTkyRGBHVG8qdGRGaVZPPEMoJmRZQDhYd3BhfTwtRFhyeHBfeWEqVn4yT2VeRVJzRFAxcEh+Kns5Cis2fk9NTHxre25SVy0qc2g3b2EwVHMqK2RwdD97bHFkfEtRKyRDTDxMdn1OOFAyY19FJkIyUmMrOEpxTzBaeUxJb2V2UmxDZXA+dn0/flJHCitAOHdZaGByUnltTDQqalM5M0tGJSh1UDZJQFJsIXBfK35oSUFgOXptNSg1KTBFYTtoM0RPQG9lSXlsd1IrUGR3JDJ9TyhMVXkpZWF1RHM3CispM0xOZUZuKTUlJk56aUUkbnc7T0I8R1JaWW5XVFozc0k3MTdJaWBtTWk+VnVNdFdQKVoqYH5UckpJS0k+VzlRU3MkJSorN0RAbGJ+YFY/CitTZW1UaW1vTThkZ0lZdFNpVVZ2UG0hIXNQd2R+Smh0JUR3Uj5zMzVoU1JFYmYjLTlZK3RpZCV1LTd+Q2YjdUxGJVVTX2wyPVZATH5faH5tCitWRkFGK0R7elN1UU9LWSFgbDxhdC0jR2JOY28+eSNRVE55JUxGMmVJQG87RmAkV3IoaUNgZnRPWV88NFI8JjkoaiFjSmE4WF96SGt9X1pMCitkPjg4WUAqX0V2VW8+YWV1PWN7fmFnPnNJUmlfdmk2bFktT3FZOHd+TCZiJDxucyZ5OGo3YHxnSDkzPztxcml1KXBle2hSfTtqa0B2Ykc7CitMey16OUxvdU89OWdDYHsoRmhhMFFGVHE3TDk/bkp6R0JPaTdXVkpkQW54N0J8QHpQXnsmUEk+SEViU3kzU05uZG9DfWZBRiFsX0dfcmpxCit5KUtFcURYQm9KU3ZOezYqSCFePnZ4WWJrJGA5U0hLM3F7cTJrc1goJjQjNl5tdi0+ej5wcFh6bWozTzwwP2I8MnVRczFUS24jMSttTVdHCitJTFBqVTdXPEcyTStJV0xYN2smT2hwSHFgZTBJe15eKER2Z1hIK0VXczZ1WnFQJUhTeDRwLUtpN0hGQ3AxRFlEY29zREpNblMyMDxkdjM3CitaOS1kZi08MExpQzlEKXhRZVBMYiRZeEAkRmphQyZKKyFxMGJ1d2JTRmxPUjc/ZnFUO01FRk1rKVgkJHckSS1TRFBpOEQ3YUUxZylBJT5tCis4SztaNGxXKyYlUUQ7TGI7SWhoRHJtZHU/VSpnZE9NYWZYdHN4UUlnQ0c+aD5HPURpbms9bW9HNVYxXlRrS0lqQnhXWj98VVk/UyhTKURUCitQdFFIY019fWJNRShCSX5FU2QqRX17XyplTzd5QVo9dUdAQWlQRUtBdiomKFU8IWBxUzdLS2B2KTBiQ2AmI0xCTzMjYklKMm9Rc0tMZm5PCis1cHgrMjUlY3s0WkBCeyE/fDZlZipicEJCYSlIMmFlTzhsOz0zQ2tBPyRjIT1mY2dINDlNNXB5JXtnKUxIaE1Vb1hMSzg9Mm84Mj8hTUBLCitfXyNXMmQlYXpTdlVzNV4/JFVuclNHYzRCSDNhKWFySVg5d25hZkBjPllpS0tENWMzM2pHRChEV01eVUpjTW5jc1BIOGR4TlRjMT83PTZxCistMihSP0ZBQ0x4SyF7Z3FedGxiU0BjJCpFO01nWTZPbCllUGQ9djZgODheSHo9SkR1Sz02WHpLWj9Qa3JHdGptbEFyUFVoWCZ9R181WiFgCitCKlhzaXc2Q25QNjRpd2FFe0l9ZlkzYF5RM0tCdShlWE99VTJ3JnA3RUxlaytefnAyfXchUUhSJXZNSVArXkZELUVOe143VnhxUEpnQlpUCit3WUxUK0U4dTBxSVJWZj83NlU9RUpQVD82STFrdj5BJEhyfTgpMTRmWihhYSlqLSohNWRTPVpSJlZWKjZCOSYxbE9SYHdYUjB7U0s0SzxRCitOYz9feTZfb28zPmcwPUtkWnc/aiZkZCQtanJtSW8wQytpaW5iNj1eM29mZTxYfC1YXmFkdnhqRTFrP1hoSVV0JD1XNCtHd3krKFhCdTRsCitwUlNMP180cmJ1bWpwQWRPe2R5O21fTXk5YnEte0EkNXZScUhzT2lQOHVVMEVibkx9PD5kUHtOZ1h1KE5VUG1afGNxY1M4YX5gUzxPN15nCitVTXtQVVIpJnpvWUtXZClDeUdgKjdfQ0lqIXZwWDY+Rldqcnp4VGlLb0tXOEcmRT8rTzVzRHlEX1o9alBfST1CYChpKlpXNHgwdX5fcFFpCiske1h7OWg7X0hlO0stdU12QyM+M0xaUCs1aEFaZ15HfS07cnleZmZJaTtsJnxzRytqezJsbVV6RUhLZkpCYUR0NC0zWEE2Q157QUw2QHR4Cit6WTlmPHI7P2ZZWT8/Yld1SFJBI0JIYW55JDE1LUA9clBeKFVSM19RME0ycWZHP1d5KTI7YF9wZmgkNHdyYFN0IUMjSGRhKHpDUlUxR01TCis2ITU7ZnZwSkQyfVBCa3prT1NeSz9QJSRZTj90dVVJTDN9VjA4OVV5eG1uPmN2LVBIVHBSdUMhWjVzUTFPekRsUXVTMVkoWXwrIUMhYnNvCitXam1zJXw3I0lFQVpXQWdePllmP1AwLVBHbWZwSWt4ZUJZcyZNYzQjUm5aLStBfD0hYndZdnVBdjgwJHtgUjQ1I0k3T1kjZ3s+Q3Q7eVowCitQNThBUnhfPH1OanBkcWZCdjA+TXtRVTkoSHtFI1ZicDAwaGg2NW5qeVV5fjI1THo2THJ3QmxMNXVucHlJITxUd3tOZXApS3BuVG1HZj5aCitibykheW02MXlrJVJaeWFtcnt6KiEkdWJGbX5Idk5JYFR2Nk83dikkJWk9dU1wI05wRSQzdCFrc1Z6Z0Qjb0AyYENkbXN8ZD1fdChicWApCitofTVSVTRmeXU8Z3BXSk1NUEQ4KktnWTIzeDwpcWZzQVo/KDdVdGFzODZZK3FsSEdyOFF5QVJXPWQ5LWlXdW1LV21qSUJDMUBTKWBhdSlyCitQSzFFWUx4UlVZPmktKjI7fkleYHFocWdWWkIldiZjcm9oWH44TmVpeXRuUCpNJkZuYj5Xd25JJWZDNm0meXlRPnNjWFA+cl9aKmQ3KlQxCitgQi0tayM7Rz1qWVZGNzM+e3NJSzJYS0JHbXMhKXxpaG91V18zJmJBc30rVFpZMXhGa2JZPUpUeiNXOyEoenR3bFY0JVUxVTlgU0NPJmhpCitvR0puMjVDP0IpKyspbE5Ac0kwelduUlVDfmJzejMwMTVaIV9lSDdhNUhFd3UoRDs7WERRZE0qdzNFS0NecCV4WXxSI3A9e0ljeU4tUnxHCis1PEZpeVplZThzZ21RODJZUjZALW82dTZuRyEzeXc2MHh7QjQtTl9uKylsMHZNdVpqbzE4LXtZJlRzLW8+fHdRcmBYPXdUUFc7eVJKN3hVCitRQzBUeWU5VDRobiM3K1c+M15oRUVPN1IyQVFnT1Q2e0ZWcEsoZyt9WDA7Uyo1RDUtVktrYkUpMVVLU1ZwUHdjWHdQaFliP2RgMTk+bzlVCithayNpNmZ2LU9aYiNLTnFBU1plQHIoYCV5QUJzXmJAcW5abHsoZTdzNXR2aVkhVnRAYXFGNWhwRCowYnQ+UDtUX0oqMXlZPWtjRFZ2RFk+CithbypuemhyWjVXQDN4N3ItOE1NbGp3fHwzUld5WSEtYWBLNHZTa2xPNE9kV0M7SW82ZXNFKD40SE8yUiErQ2xTTUV+V2d6bXJPd1cqMyYoCitGa0Ngci1GOHIrS3J8VjU0ZzxOMSNZU318bXhHeWk2Tmd+SD1qViNkeHJ7ZERUdTRIUGskdjd0O1RWNWtuMF88czFAc1NgWV9wKnA+Zmo1CitURHRhVkUoampQZ14tQ0dyQnpnRHZkI31qY1NqQ2BESD9kR2B6JipKMEtNYDB4ezF5fFlZYTkkcjVmM0AzQ0heZmF9YGtGUUpWbGQ5c3ZwCit+Xz83d19HaSEzenZxRFApVm55VEQ+fGo8OTkoR1l3fFlxO1g7Uk8kPSFoUFdWV2A8fihqRno2aXcydzEyUEZMeX5nSUY7JFAtRiFEQFhfCit0e3pOTHl4NUNoTzJTcXhXYzhGOz56KChKPEh2aUgkaHtSbXhhJnFXbnNQfmpFJXVvNmZMZVMxMjRIO3VyUkgjVmlMYVk2RmR1LWgldEhaCit0OT9MVEJSOyFlNjcjTHx7LU0/PVpufGFaRV9wVkg2amNARkx5fHllNUVFQit3KzhkV0pxYDJ7bXJ7P3QoOGpQdTw4b0o/bHpoPmM1IUMoCit6WiFtTE9LZCFicVpvVkNrPDxgZWloWCRrPCRZUjdnQXp5K1UjNG99MVhMZTRQOzVLQDZVUHdOdDFvQ1ZsYEUydXJXS1Y3MyotTyNhUlRICitue0lWZHc8TT9UV31JPGx0NGIhMW5xeXBWanskZVF4OTt2Oyt8UzxoQ0lBeEN0QEtTMjR2JUp5dH4+WX5DX01YdVBNKH1QZypidFBkbjdvCitqQFhlQTlIJUhNWUBPIyNfemJBUD1KKHdBKmw5U1QoVCRzY0VDPjt5I1RsJHhvRnlSKzNkaz5EUmNAZStqb2c+VDZ3ZmNGTTJBeV9DelohCit7diNpK0lvI0lET1hWY0hEUFN3dnopSWRDelI7eU17cWVBdFUld3txcWlUfHV9M01Zd0R6bEZJa2ApbVNTI0w9aT9mQlo3PWRaIVlefDhwCiswNDlPRnBqXmcwNFJpTHkrTkdHTlh0dF8rUEZfe01hRjcpeVk/c2A1VFpwWTwlfS1ad1FGb1dac0BmRExze1g4K0U4Tm4+K0ZfR013aypzCiswbU10eE47JVlMcCo3MnVHdC0qUDVWVjg3YW1tcXxecGxzakEpYGRUbFVnYkM5WmdNT3ImdklIJntefUJvTXJySz18R1V9em5XeFIrdFVHCis2KylBMVZHOy03OE0hX21ibGRpeCgqZHw1UUVvSHNuaTtBR0pkZmdUTzIhRVlDTXFsKHU9RWVecCYjWFFfUiUocWlaWFhgPDZhSmAyMHNlCitaezgjJishaDFffUAwPFc1WCZGOSlNNmBvX2lOcTJlfU5AS2smKEZBMTVvLW89XktHJjF7ZkohOzk9VVBjXyNleXJoREZHZWdaTCh8UFJuCisoZFM3WDdoRCZ2QV8pN0hHMU8jWUtHIU9FejtvVFRELXR6Y1ZVQ1VucG9KN1pqSWZYJHl6Ukp6fi01KGlKUHd+X0kyUzZrYXZ2LVVJVXtZCit1NEhiRytpSzdHKWNuRiE/bi1zZF9xZzVGYEA1UXgzZWprI1gkeno3dXlxOEc9ZlpFa2J6fUI1OHglO1pGZSpZZzRza2VNUH1NdkdqKz9OCit7aFM7RkhVV1VkRGhZX3pvKnAlWmlWKFlYQ1RpLUpNY2lialBmdnY4Rjh6dzZfKTJicXpaUDJtWmM5P058SDVnUClkQmNZa2UzNH5CJjAlCit+Z088UT1hcERrMmViSVN4fkg0cDFBXzlBJHEofCNSbl56M21td2w9KFJ3XiRxMipXaCskdXtOeClJbWxRPWRpfStId0Amb0xHVnhuJW55CitKJDUobis9fGo1e2VFdEhuVDlVTTxjaVQlWFpLQDNoYG8qd0QqNVdPRXFMdXdJKTdhS3cpbEA5NkQzbFYkKT5XJGgjK1R7ezszU0pjS31gCitnPWgwVHYrSys4PSkobVIpU24rSTxGTDs7Z1dIc0xYQVpVJGBCckpQZShQODVrQHRVWEAkaU5tfSlUQVlYZSVGaGkjTkRZOHVscDZWfVFiCis2TCNxQld2SmZiKERVMi1felpCa0pLTENtWU93UmgxbkpsTDR2bHMze0ZYSVZgPH5pJlpxKW41T2JpVCs9U0hgRSppSn1wbDc3eCplYzZECis9YVFANEYzMiNXPGUlJjIhTnJmVExNU0w5RmdXOTRDTjQwfTtyTGN3STZjXm9aXmBgcjZmdHhTajIrVXttTUZqNGY+KUg5fXglaT9iM3QxCitaRTVtNW17b3cpZ3FtQyhFQV45e0MrN3UjKyFQR1BKOXBBU2EySi0hVjEld1B9ZTQpfTJ5KCpKfHF4PEs3PUVnRTlHTSk8T0c5SXpXZUE7CisoODByNmFxMm9ZP0tzMD1wNSVzUSg1d0I/Y3QpZys4djdhczAkUTJnbUVAd1pPNF9aP0lTXl9McjcmVSgoJTxmVkJ6MGByem9jMG15bl57CitoWHRxPEBhWi1KOCQmRiZEUWxnSEU8NEhteiVtYU5ReDRhKVF2Mnh2NTZJTWNJSyp1YFR5eCtgKz9FXjlVZE1zbUpRdWU+YTxjSGAyKmA9CiszbH5RQzVMO3h+THtEa3JxajtFX25MOSh7OWliTlFCMG10IXA3dVcwPms4RkhgMHl1YGRwIWNaSUpLKEEra0ppanprekQla0xQTmQrQHAqCit5QT4oOSlwMENmZGR9ST1qQ35aayVBZnMwNlh+Pz0+PGM5YTU8LUgwcXllajw9N3g4bzFlUndfYTJnVTVoOFZ+eSgpK0I7V0RSNVJFTDFBCitRY3lvOU1BIUckek5SYzEkWmMrUkRHZHIlIXRCKE43SypgajU8LUt8ZFZQUH1wQTstc24mOX1jZE1SVnF9KWNyUWZaITtseXd4eWEjMm18Cis2N0RteU1TYlhGQE4yZDctVz5VNGFUQFhzcylhNl5WNGNpMSZgRT0lNCFVPzghO1BuNGcqUCY+ZzZAQVE1XlJ5JDc4MXI0aHo1X3Mrb2hfCislTDh9KTY0ZE9UY25ybDFORTBganJLRTtqY3h8Vz5Gdl5KcWllTiZAQWhoVW9vaDlfOWpPLVlaayZtPEBWKUl2cHtLJHQmVU1qMHNFWUNKCitDQXpsO1BjZCk3d3g9dzlwSHopSW9OIUsoLU4zNCFnS0hAM2E2T35jdCpYI3swYm0rfi1LUj1sdSQ/RSZfVDB7VVZzSng1Xz97Un51ZmsqCis+czFfQTc4SEwpPHcqVG1rRGlTRFQ7eFo2JTN5OHQpUjxURT9SNFZMOHE8Z01tS0I7dHxWKlpHcEgreTNPZU8xV2pjYlpMYnVfLW5BMW9uCis7UnJId0drND9DKF9gbi1aJjZzKXdRKU5sOCYtaHN+I2RvT2R0VzAtNyVMO1pGYXQxOFY3N0tNXzAyQmR6d28zJDtzYSRgMWJgMjZobDhoCis2X3lqPHtPPXBlVENqbkluNkd3aG12WCNlPGVnZ01CQV5lLWAzazUjWEFfP2BXQ0VlPT5oZ0A2Jj5ja1VJdG04dHFmUGFRMEU3RlYkOFhACittWDVDJlpgYj44YHdMdytCemU/UUZ7VSs+dDJJNTk2SGwwKkI0eUR5KCpURW17ejk+YVB2fEg9KTdWZWNkJGJQSHFQa19ZUzcxfjc/d1VoCitKVSpqcHI+N0FneDs1STNVVFUtbzBIWjtUYl4mT29MQXl8VjBUPUQ3KE95RCgmS1RXP3dzbDdLM2hvPCowdHNVPDZnMDMkSTE3PFV7eGFfCis3Pnh8dUleMjFrZGFOWEJEZ1k8TzJvSlRCIV5vMkRwUE1PM3EyPCtTKG5JdmFXVnEqcHMpK2pNZVM7OHFBR3N1SHk1T0lwKUh1RmQ0KXFvCitQJDBjRmV9WGcoKlkoSDBXVWs0S30wZnJHRUBRPGdvc3czKW10ZjlmY20mK2BaSkJIdVppYz5aajYkeyhZTTU3Vn4rKTMqLW9CKCVkIUZpCisyPXVqZG14fHRfdHtLSWZVNmFOc2FjNUdvQ0AxJkF2Q3dwRG93TDlzNmxHSkF8aUxgUnNHRCFRT3o2Nnw8Pmw4PXJje1MhYjZYejdaOFElCitMcmUmYXhMX3YyTDJ3fkpiJFM/cn0zT3xQITQ7ckVMQ3J4aEt+P2VPQSpDPDdGdHtRdXBkenM8TUJlKCM8LX0+bCg2fkNkR1VEa3kqKnhECisqX0l2YyNVPGAtNUpubzJCaExhJGc4PEU2KUlqV25YK2Q/NE9LJSpALXBUQnw1S3MhbyVTYCk5KlJtLXNPWD4qPip8VHZBLWw3SW9rKlYyCitTXkU1RCp2fDtuJmR2VkpJITY7Tmt7Pis8VyM8fDhGciVYK3VwbjhzWCkwZjRDQDt3e3VwcVF+TkU9b1N8JCEtK0VKQjZ1I2J5dDNJYksjCis7O2tUYDxmdmlQTy0jWnVTV0hQcnYqQVJHY2JxJD0pMGBLeFdzV1p3emhnTEclTUlESEtROUxWQ3J0QlRmTFpfMyR8Pj57MFdRUXxmQzByCitFe3FWaHMpUXNWJU1fREFAXmpVNVBeYUZ7PzQ3YTxpT0l4YklJMCtveFNkVm9UZjwyM2s9aCZWJkRxV3VSUyZ1az1vcWQ+Vlc9Q19NKm1jCisheEwhazg+WW9iS3FNMFd2I3RWOGQ9RWEhOSNII1R3QW96d1gzWj0yPHktMCMrflFJZCtpWXFHcXwlPWg/WnVeb2k4JVIlYzFOP3dWVDtYCit3LUZUKWApZSV4NGVuTyU9b1Upc1BaMVJGQ215Rzt8MD54JiF4QWE2Un1CKXUmSU1tYG15JGxpKUJ+JGdkaXopVXUjPjB7dGlXa1g+UiVPCit2dnMrayQlNFI/I3ZvRnJSbS1AVG5uS2hzU1gqKmIyaz9EOVd3PWZnJE1RcnM3Pkxre0taTlpyeGkxY2VWOTxTRWZjTihJPChjMz9iUXpoCismTD56Qjlsd0tPMDdEJGRFYEYxMjR1aEQ+fWArVEc/WWI8ZFJWN1N0Q1dxNCp4ZVZkKTlSWURmP15DQSkhMVI5OXpvaDgmeD07TkNjIzFeCisqTzBKQGhGVFFkTlg2bXhHMXJCRClJKV50M0xoJmdye1F7aVNkOHhZMyhaVFpwdmIwWFpWKy1+LXx5e0Z5KyE4NF5BND9aclVjej0oSHM1CitXbUZrcDBCd2l3PXFWWG8kaCtxNTwoTEFrdGMmVkApVTNQSVhHc1NQN3lVJHdQQlYqPX5BSUJfenI4ZFBQTWc0ZC1Ndmxwd0twMlg5NUlVCitFNEhZM1FENylTN2g9XlFiUiN6WG4wJXVgbkdaVkshNz0lJUImcTwrQnVZXm0tcHFhfXZ2O1d0MEZ5JHdxKmc3dmA9R2xiRG5HOUhPUGRGCitxYipvaXJGUC1YQTVrZXttYVlyVUZMelAwMCQ3PjVaTnpkTno3Kl9RR2xzJmFyPnQlUHBiME1VVSFnJnY7SSpuYlFEd2cqKUBzKnI/cy1pCithdG5gRWslUlFaXjtfZn0mUVkzcmxmSTg5d1BXP0xIVz00MDF0VmVOMHlAVG9UTHM1UHJMQ2FCcncmOXZ3UHhnbChhcXZVbHJRKyhTJTMjCisrYWpnK0JFNUxMOCMySG49SGtgYGdGK0s/fG5nTyV9Vjw0TyVjWXBEbyRnbWFVWFFLJnU9NGVgQlFsejlGezREQnAhT0Bnc2lZakBNP0U0CisyZldAY09RTn5XUkJJM0EySHdKUGVfY21PeiRGZm1gZj9VJTJuRShFJC1UNCYlOF5NR2FCRE5Qaj8hPHV6VGooJk41QDtpV1Y+a20+OV9KCispbi1xUylWelVZRHB9STlNJHEyMjxiSkZXRnYjK2VLMmwrcHdWbFVwREM4PXBkVGpgQUQjY2wzb1dLelc7amFhLUNpQEgzTWphYnFNbTQjCitYcj18T08zZVR5SHJHQ0xpRVorJGNVbUFnMGZIQUJwS3tlKk0kIUhHPiE3MWcwPTtPSF4pM2dPPU5MQG5OYkVwa3lfcWR8MTRmPUtuaSk5CitLVFF7JGUrWC0/T0JDRjA2PGpLMV88Xy11Tjg9XzAmV1hVQVBRK34ySilqWkBuMU9eJT1tX0Z2PWQ0Vy1pdkchT2xCX1R2V29ifWM7KzZOCitOWCEoVFhAfHgkRSNEWjlHWjhnWUp2b1N2RkkjKDhZZElYRSl7OUZVMXZ+d1IhMDYzWXxVSz9hfkBuPD04OTNVNTt0KG1EclVQbz5CNjVjCitYdj8jbG0wa0xsRWcoN157OFFRc15kMiN0Qk5aWS0tbGFMJDViMEdVNCt7MlZ3cEk7JXM0PTsyU3Awbj09dUhoV20qKnM3M1JDKjQwMigwCitvckpJRjs9TEdVRmM4RzlAMiROYW02aCEzNU90I0M7KE0+WDxnMmVSbUdgUkFQWUxJYTY+P3h1JE0xPH0makxxXzNvREZsI21HaV9TaXVTCitZZ08yRU1vYyQyPXRMJEZKOzcmTChUcWo/b3B4dVByI1Q3U0xodUlVJXhFaDhObEZgNGE5Jj0rOGxYMi0tSX4/SiljdU5wRj16WTIpekpnCis5TCZjJD1OO1FDQVRPekBlfHxKfFdCTURMcUZSMkpHeD8/QDtuYDxgbjtjSStLK3o9PTs3P3skXnNwWGooZXlQWWltUEJwdmQzaU85O1hLCitxVFpqPlkhKWo9MVg+QDRkM2VuUV42KFUyMSg4QUpEK2JZYUU4TXNjVGc4WVRKcT5AXm1IK0JxakE5MHRzbFpnVFpIQSFFbFZ6PH1TSFQhCisyS3JeOCFkaUlmWmsjY0d6TG4yIzM5TFNXWCU9eVole2J4UCZtcz5ZSSgtIy1XJVN6SEtSN2tiYn5+TDlnalVvbnVtY31RU2NeSz5RKUM9Cit1eDFkUGJyM0VGd0pVSk08QVE3YDNPS3Y1am5DP2FmXmpWaXg3WXB8WXF4ZUAxQCZsUWFKbzwkbDB8RH1nZHtjXz9Ed2IqX1NedTJ7a3g+CisqYnUwJCFTYWBFS2NIZVpsanVFPnA5ZEJ4Pk54LStBdGB5aFgrQ1gpJm84MnptWWxoXjk4cSh6JER9aGledSNTQSM5X3ZXOHMzVWx9PGw/CishRyV3Si1SdUFWOz0+UDRgbFVKUCFuaGBqdVZxbGtvS3chaH5uOT17cUwjWTUjKEpsTjl7O0lTbVp6S2granA1UiZgRXFWeT1rM0o7VjhUCisoPU9EdVhDNyVKIV9XXkVjdT4qSDl+USRMMTAwWilsSH5fY3RqQlNIP3E1P1MqX05uRDJTPGU8dDZQOXIrJWsjZ35wN3F8Z1BwblBAZjNQCitzcW5yQkh2PiQtQHwjcUVEQTI/WklLWihuRDxPXipJNXFGNmdpeWUpRX1BSU4md1VVRkBDSmFYUTdYbyhzOyRjUW8zVjJ5UU48KDRkNihDCis2d0RFZylQKkNWUWhTYnNPUCZuem1LNTl+TXJ3JVhadiNsQElnJSotej4lNUtSfiQpfVBILWUkST4/YklYJE1FbChxQGsyTiQ8dXhVSSZvCitZYWw4Y2FSVUFqRHJSNXlRYmRtRG85Z2hie1IqcXdgTiRES04+TEpiSV8kSm8oYXZiWkRxfmtjSWtgJT5weXNsRX0mdkJlYm1veXk1bVEzCis+RnhQLVdwPDhfRSVIODh2WkBqOHk5ejlGNkV4RHhTYDlBX0lBRD47dGE4PklANDw3UDxkTHFwPzYjYFQ4QTlmKyRyaihaclRhKnBHJEtxCitAamdIWm4/aTJGQ19RRFU7KVBwaDhPS0kzNyl3cmdBKFZhWHJVeiNhYkg0QHA4biZJbGM8PFYyLUNGOT5EU1NpMkhFLVVCbjU7UTlZMEA9Cit5fT5BRV4hPFcxeGx3bVVXSXJTJEpaamhpe3JSbkJXPmIlSFI1a15UdGEqOyRMa1AobEgoMUNtdjleeGZ+QUVWUzBabGF4RWs/UGp0M3c8CitsakNkeXd2cHFaaHt0ZHw5UHZud008RWB7QGZnSHxJRjdmJk5OU0VKQkpSZlZuVFIpeFZ8WCYrPVF5NUBjczBsSU5RLW9XPDlVZWg8OUkmCitlcEshYmNAcG4wMWpgJXVgdVI/cWskSlpqaG9hNV5lJiolOE5oKzg/MWNRcn1yPEpjZ1Ytd3kjSitfYzhKP3h+TSVgKUx4NDZXcGFTRVd+Cismdipje3xHO29MP0lIcnUmUEgqUFolWSVYeWRBOHdOakhhfk5sRGBWeEBTbGZjNy0+R2QwMEZNaX4kRD9DO2xMOXN0Wm5LVHNnbn5ednd8CitTZX1nb0RqfSt+enJNNjlxTz94bEpqemkyPDg8WlpuX1Q9KW9xMituQmdiSUBuQyRIZERCYjhFa2FpTSQydlR6LTkhdTg4cF8+MEQ8S0laCityT1JQcWFefU00WXpiMz51OGR8dklEb1FpKnJoTWRFRiZJelBMblp8NWs1NXB0cWxyPlI+MmlwQXJEN1J7ZjVwcHhzO1ZiPSlFe0swdzJGCithQUprOC13fFZOREB8dnZZK3w4MGc0WFgpU09aSFJSQFUhT3RCVGxFNkNTeGNiNnNFUlN+P31iOXZjOHxoMUtUXl9xbWtEMkU1SzVvRjYxCitUIUxvPXdRZzNaMTY+fTROcHh6dENxPDhJTzEwdUdge188VypGVTFDNnYmSFpDd3VrQk1RYEJKKHM2bVQhZmteREohRyNqZ1J1PSFmSThiCitOYjRkRUFUVy10NUFDX0pENjdIVVN+VCtuckQ/TnhhRnkwc2hMOVNLQGRuZzA/cXp2Tm16LVJKN0ZxdC0pVCo3azFgS35Td3lXOUBgZjRECis2YjxAOyZrKGA1Yz9naUIrZlJOO1MxWD81UFBIa15vVk5ucTd7aW0jJUVXPSVjVHhpbnJwe0FKeFdQaik/YFFgJk9GdnlXeGc4K1lSPVVfCitBNCt4REJpeXFoSHpDVkp6bVNlbUskLVFIV3s9LTlvR3UrQislek5gIyF3Ymw2biozYm1CbGY4YGJqb0Mrdyl2ZWdMTyV5RFU/VFM/MT9DCitWdXgrSW9eQ0l5dStHcTUrSyRfNVkoSkRZVVFaZmQ9STVES2FFN1lWM2EmSiQ8e3QhUUQmRm5+UmQkRE1uXy1LNW92RzBraEkpMEJPfHdWCityRmNqfiE/eVhobnlUSEtWQjs2VE5mcz9sN01hUWd0aXQ0U3MjMDkyWkBCJmtUc3tyQHJzOVJDSiY1cDA0aGA9ckkmdHs9fXE2bUl6PDt4CitUIStgTWY0YDN5ZVQqP3RqSSVlTCt+MmRkKWtLNE9PZFMzUXZLUWh8aWEhSU8pMTd8NWZLMXxScTY/T0pHZGJZNG9FNWx9VXZZVEdENDB9Cit1X2M0YTVuNVR0aGc3XlR6VzBePmNGZ0Y3Z3Q/RkYxbztUWmwlLVhaUHtkdE09KHRgJDJLIXY5fiV0TVckXiRsTnZKdFckbihoM2p+MjJuCit9T0Y7UEpsZCVtLUZuflcqSyRWRFdpNVgtVT1tVVZ9e04xI3IlUzc2V08pQik8XkdAPmJJWClCXlpwKUU5bSo7RCpQOHBfIXxqT205Ris7CitGSFBjWl5CNWY7aWhaSFAjWDklTD9gQVc9ZGlmMl53Z3E/ZEt8aylJeT9vdTtoV2R+NUFvMnk9PmA4PFFiX0htZlpuJVB0bUR4cEwoS3tACitee0p5aTJoRkVaJFZ+Q2FnenUxRktJTigwdFg8e01+LXZFJkkjTndGJXNEUG1NR004fWZrfVNPP1QqNzQrNWhoJUV5bT1WenE1dmg/dTlRCit8U1peNHpuc2RPbTQxKmdKKVVgdE17LWZUT1hebTxFdl5tN3Q0eGNGeEdAME5gZit3WHZNbWxHNTZ1VVR+V3dNZmR8X1B9X1lDPCRzcSRQCitLUVRCKlZfTUJta1FfXmhzfFBYYD8ldkdDZW88Q1FMeUpNZUh3I2F3bnVoXzJoUUBjNk8wYGxYTmQhNmklIVdkaXlrVTtpNT1fPys8djFCCit9WmVLYGBQOyk/K0BWMEJZJUl1T0RnQGdnPXtLWmx1WHpLO2BodkxLXjk0SVJ8fmZHZ2N4YiR4Mj1scStZJSklYiR3YihQSGMoeiVoc0pMCisocHBWUndzXllNJCh7VzVgflN+UnJDXnwpZkVvY3UyeHReQVMtXlAkSn0lJXAwYDN5PGx6e2FEYGx0bjYwbUI4MTVwYnF9X1kzJkVmTnUhCis2TEJQV1R7dmNxM2ZMXntGYmB4LWZmSE1XbTZmakBGWDlhdm16KXU3YEU4cW5JLVAmezVTLT87TT8re1FnOzRBXnQxJDs9cjUmQHFUQE89CitUZDIpSVlVbExHIUNwdDZJSU41Q2luI3xrKUEhMjFOdTdPK1ViYXNsNUVhRXBMZDB7JGRtZ01kbXU0bSUzaVRmaXMqalJNWFRhSkdRaTBfCitGPT9GNXBATC14cU1KZlFKUT9lfitrfW5wXnZBPlZsNnE1aSZCTEwlJnghT2lrbWtgN2loalpvZXcxVyVyaFRFNUcpZ2g3ZVdkKzMtYXY2CitlUXwqP3A3VjRWMDd7JEloK0gzeGQ1aztzYm5rfUsleFc8Kip1dXNMNXc4TUwzPGpSS254XzdPZTh2SDg9R1ReJWdlQVBUNXslP2EpRDQ1CitQQDYrP2g9cktvWnktcX1uRlAwV1Q4TkVnNkQhRjhBMTAhSyZqTnF3UHM4WjhDMC0wcGgxZSNORGUmailNfE9vX0NCIX5+akJDWGVSQ2ZyCitTSyh4JFBPTVdKVUptRGspez9LTHNffFhEYVJgOGljJW02ajs8LXE/b2tPVFFsVUA7bTJMI2F9a1ReZ2dBI3ImcCZNN2U7YSEyaHw3JTUwCitFIzBvYkdoNEdYd3RsZXU4WjF8S04+SlZ2M0I3UEBDSm1sT3o+S15fd1JhPV9qVFFiVlNYeyEtIXBJbjNRODs/ektGSGJ4KWFINHR3T2l4Cit1Nj5AUiNXYiE2Xjt8N1h5PSRRX1RYflR4TGR9NCoqQHhKSWFPSlN5KVVxdXRoJlBBaTBMbyVWaHEhV0dPNldJaF9WRCopVDBMej5mKWQpCit7c3kjMnk4UWZUMz9vV1NRNiRxY3lkbjlsb25HZW9BSFB4WGIjSUEzKipKb0ImM2U8bG1LQmZuNEhiP2R4I155dm11MCltNXBxY1Q1fn5HCis0YTh1RXV5YUtJYV9YND94d0xYbGFoRUtvNm0+M3AmaFpWdE1mdGloLSVVPkc5dCg3KWl1fCFTVHpFPzd1KytvNF8zdFBqJkNATzFBJjFQCis5b1BJNHlrbElSbTQxc248cmVrOXtKWEBzZCV+QXU/MHtMe05EYnBNRlB2Ky0qQ2g1KVZUfSQhWkBsVjh1cjhmMVNqQmx0VEp+UFdQcSZwCitBJVRPZ0U7KFAqaEEkI3RgbHFEKExIcFdyYDxROGtlfiNgeiNvdmJZSXpQUl8qfWA1I1AlLSEjOC1BVTJjV25BaChkO2Z9NTFKWFJgQUg8CitUcjNgYzJDZGEpbEo8RmItM2wlMSYkak0wMHc+WmIyX2d3MU9GfENSIU52UjdWQH1LJiRie14jN1VpKD0/YDNtaXtUdHE+JC0xKT5CT0Q5Cis5QiszUyRtdCNgWCsxJU9wWXw/cktJKXg4dCM7VHg2ZCM3O0FJcl5HPmUoN0UlRj1nbHorRVJLTCE0dTNxRUFaeGg+P1ZPdXc8Y1BoKXcrCitZYTgjZSV3VyE3NmZ+QE5HY3l8dEd0MW9ZRnNWMUJrJkJGKzxOQkNWN313VHZ2IV5ofTIodWlyP2s4P20zdjs8SmB3RFpvRnQtPXg+S2JuCitEQWs2dX45M2FlVVZHYjFMM1c9TEwzdjsze2NhaUQrJGp3MT17S0RLI25EeFRrVTVAVnVacX5eMDMzQ3ImKXx9PCRKVUttdGQ0VXw/Y2lqCitBdCUlM257NzNOTENPb2Ulc0ZlazlPWigoYH4+S205QiheKCVVd3xjUTg0RXs4YihAaXg+QlZlOzNCJGc3K2dfbCNsNFA8fHljU0J3eV58Cit7UHZtZTRtaTEqRz0/RCpeTjJ8MnRXQD1DUTslWUl6U3ZLZH1rNTVzdmY8Zy18d0QlbGRNMndrPE9nJl5HdV9mI3R4cDRRYjx8YzhpT1BiCitJMEclYUctQEFIQnBIKEooT2Z2Yz0oSiY0QGhWWURgTHZ6XmtuISFmfThXO3J2eDl3Z0Q5MHNFUF9obnAoS0MoQFRhLXFGVnlqT3F1WSZ0CitkZFFpWntTfiRGKlZJUlcpMVRydHxEM313Yl4zRjslfEFKOz1EKGYle3xrT009NHR3V3gmJGExfDhEbyFxeSM3JHw2RmVLdWR4TERQeWNRCit1S21QZl9wUj51Pz9ZMmMwYXlLPkt1RHAkTUhAQ3ElJHtLKDkxeHBLeWlYVkJqcTsjMm1kRCk3YCUyeilBI0ZJfXd7a0spbUpwMGAwSFA2Cis0V19Ralc4VWlacVl1ZFJSbWpXXiRWYDw9aFBgYC1IPmVFODlaamhpLWFgU19FNll+NUN8ZWFGc1N5Wjd3ZnhCdE13JTBxe2JSMkBCYntLCitUaTllU1kkYlEodkNgPmcjVyt6ZGlIYSszJGImUUw2Yz1fVDEwRW9VaS0heDhFO1p0aVJON2BOfCh4dVUpNF47b3xEJS1vYGBlPkUtUnl3Cit3KzR0K3JFUkpmNSVQJWZ0fFlxYj93JCYpMXptdjtFPipaTGlfZCQ+cHgpTnB6eSYlQXxpKzBGKVY4TWkwRn17P2k/TUhHSjgme0RRI3xnCisje0NhdVdAWUQ/QUdHOUpaUyZebUVxTGdqU0ArKFRsLSM9ZSF3Vk5KVWg/MFR8R3lwb3wyWH0lVmA2bzJXNT8rWUAjQnBONkRCNTNubWxGCitkd0NPV3UtZ1AlbXxKTDNBU0VONiMyWUVaeWhwdTNEYjIyfk8ldj1VJFhJKX1OR3hLQjMlO245QEUxUWBnWilTZD9uZlhKUHJzantEblE+CitWWWI/T1RFYTUtcTROdUZ6KmsmJkk2R2s9T1QjaFFfbWpyUC1XT19xdFg/PkVoezhuVi1KRUxxSDloTSl1UCMqfCNFYzgpYjtvKyZaTVklCitARlR4Zzk0KjVgYzJiVCteN0dKUldpeW5GMmNCV0h5NXxrbXh8bUchb311b0JhR29AKGMxb3A+dXNDfEI8RW5lKHZzfChHP2RMTCZBckw9CitPXlp1Zk9aenpDbnxBOUtJbShwKUZtZTNFKXE+PmVufiFyQkIwaSNyPjg1RzkoaVctZTYjcm1lTkdSNUJTNW82LTc9VFcpYmR9ZGAwR3pfCis/djRMeDk1eEhZQTdTPWBuRWZETzE3aWNRIT1GfF97T1E8ZW0oTzN+TkxLeiQwUFN7TzMtJU1tVCUycT4xKXkyWGIyPENldkpzdCkmNHU3CitFb0B2RGs5Q1lIdmMkK3g8bzd0PnNyWjZXa2VTUXd+O3J1cml7TFdAYGZzSn1UcjwxfW9aclBVMEJsOW93RUF1SnlDRyNXbSFRKSV0OzZzCitqSWojcktjPjc9bGs3ei1QaEh9V3gtYW89YyVHaiEtSHgwJH5nWS1FfHVYNmw/PnJoOyMweTk3M3RadUJ2UUAjJDwlVlJHPyE8QGpYIUdDCitpNCY5M0lNKmVuZUsqaCtJZDNOYCtzNE8jPUtoaCVBNX5QeWQ4THNpfWp3QXJYcDtSdW1iWFhedHN0dyNpVy1DZ2pYKFZ4Qm4xbnVFcUVDCitiTHlgKEF3dE9hKUhAK1RQQzl5Wl84I0d1UWdqVEZiQCheRU9RK0JZP15KY3JDMXlaN04zJk1qMVZ1emg0aGcmKG5OWWwzJkpselQxV0BPCitWO0N8ZSNjSCNwclo3NVZFZzFyWGJWO3thYXZkZn1GSD5yXiQ7bzE+amhobTN2WUYpK259OGArcT1Wcng0RWpTcT0rNDZaeVN0bFBib1hwCishVyYoVjtlaU11YHImdj1tSDcxS0MkRCt4fCk/fXZHdmdmM21FRiZ9X3hvbUszVldrQFZXbmBMQ0hQIyRXakBndjBHM0EtJipzTGtER3YlCis1JkVnS0UhbygydTJDTTg+d1ZnYD8/NUMoRyU4cWs1d3s4PnlYc2hUdVBQOE5qVldPflZ5MmJpQlp2dzxIK0dwJXtoWDBqfkUkZXljN1Z+CitwSjNvQD1zTm90I09vSDVKNTN3VjUrQj01UWFmMzslKDhqP0xQLTJYS2MoWTJDZTFqeVdLUil1YmA9VVBvaWdNSz0wYDxvMFFuWmdXam1OCitWV3tDVz0+QTNOdDJUJWh2NClFdk5eQFpifWxaQDM+XzVAJHh7QDxXbzR4UjJDMGZzZk92ZmRMTyUzQ0VIflhXSXxWRT1HcU9jTy0kMko/CiskOyF4MVZUbEJ5MU0+cU93Qi1RZmtjTGojY35mRm8/dyFjK0BiZmRRPjZuemMpKWI0QV49Kj1FT2RscXRAWTkwKUdYSzFzSUA3dSN5OzRtCitxaUprcTNZPyhINz8wfjQyKTM7QnJLQUlGRTE/RW4oNztnMDZxWXVjS25WQj02PCMoP2V2WjBsSFkmfWd7JCM9X0tUYjMhP255VSNsJjRaCitla2spfDxhblhMPUAtYTVZN0NYSE4zUS1JTXFTV00rWSMxYlhUbCQ5ZnooNEhnJmRYPTdfOC0lZGc7SEc5bUNRczIjSXNHRS1vMEk0fVpnCitZa0d3RiQ9Skp+KXR5OVdle19zQHolQUEjKWJZMF5KSzB0bFV8LThDbThgUTxCYEMlKndrWGFASiYxcllSLVlHJU1DPG44S1dtIWdaaUliCit2QylaQUk3T0A8M2lkRGFZXio7cGQ9a3FlTXBCJFpfOzcxcztYXjt3fFB9eEpfcXwhQVIpV3ElbTBGaEl7XjZDUEcmKFBUO1opQy1WbkxNCismeGBtKXMpKmtaYnpRcV5wRE0ya3JQKDk3TyhPRio4UjgxYEI3d1dTTnVVKkFzd1dBSVJGYzVTeyM2KHNeMFpjaUgrJlFGdGYyMjM8VzdSCitkMVhPZjFgelFOXzZDKFJkaEJtSFNQYldVUWBqRDx4Wl8raUBpKiVqcE54QX52dTBzTj1KNX44dF9eUkI5RCQ7fGZoSCR3c2Q+SiZfZX1uCitIc0lsUH5lX0AlLSgpZFRvJWdaIUkpe25+SWwyI2FQcD8wWEBnQ3g8a0taSGZMMXkkTn19Y2NVTHFGRWA+OT19RWpNd3tpSGZMZXRoRWwjCitzKDthSCNOY0F3Q0xVcVJ7dmRPe3k9Xk9qUSQyV0lMajwxbDR0fTR5ZnVfO2ImRl5gSC1NZzYkelQhanMhJmxKfl5QU1czXnZaYHdITSEpCityUDFiTztzU2ZZSH1rbGszJWMqe3ZibG0zMD92UkxpKGljZjs4R214Kz1Ea2JgP0htPz9saXw3NzxlSUV+Zj9MQmMhN3IoREl3Q0hZP2x8CisjMH5TOyEtYVMjcDV4XzV7K1JyMm5FYnYkVVl0TVJKSUs8PW82Smp9SXx2eSVqMVo0Z2Z8bWlfcSlYfX4ocShFUT1ATDFTYld5fDs5KWswCitPMkxsdkEtWHpFeDA1VyQxeCpiVzdxQ040aT9vajFoMGQ4Mkh0V2JfMXA4X0g4MClkYWZBKC1iYXIkelE/TGU3a0NPYmI+WHR2KFBRJTRECitQJG1jPUB4RVNMWCZTX2xKUW5CZSE8Nyh5TmVeRjZ8PkBLK0xsRH0xUlEjMkAxSkFMM2kjZCF3REJlOXcmfjxRNGVsJD5DWjI1STNaRTs4CithSV9zOERvTGwxeypYcj5PdjtZO192YSFSKUJGVUEjeWFzflhaeDEhPmxmYmF8WW1TZlYxcGl2JlBENHcmanEwemo2NCR2aDwkTDdwViZDCis2S0d5d0BPdmYqNmZxKTlxdEFCP1RkODRlOzI2dFU1MGUzPDd1akxxKmVjRWd4bSs7bFFPVUJIYmlhcEFabjBGSjtiTCU7cHN2PWhxIzk7CiswK2JMaGUzMVNEOzEpMiUmJjwqUT16e0ZreWhaVSFtZyEhRDBtR293TSFMU2ZaSE89TT5wUF5XenNJMDB7czZ3bXo3K0FaSm9TYj1ePHNJCitkVjBFZXVAZnk7YD9DWFRmZDNPaD5pWlNyTEUjakY1XyhKIyYkPzxrQGdFcjVEYlFxIz9nZ0tvOWI9Qk0kclZIU2MmNWREcm9KdG10QylTCitCRWpjdzh9UGA+WW51a0k5d2llTjdpOTJyUTBmOXFUcVB+RVowdWNFISNIKDh5P2RHI1YqbWQzVlYoTD5QbyFQajF2bTZlT09QJWZac1A4CitEVS07JFA3YCZTIypHdFhhZnlndWIxO3B4bV5CR1NpbEhuJXRwSVBKUCtgOzNiND9nWVRYJW95KSZkVFJlbzkwQD9wZGBHbGt3NVZBbiMzCisrcnEqczhmJTdTOT99QFJKZmJubDNmI0IhbStPRShkYGF6NSklMktZbHRHdndQX0UpPiQ5Y3sjQ2VtbGs/fE5JJnBtZVF2SnFXUSRkZEJMCit2Sm57V099YTs+bEoxSlRObFdxV2JHZG9FTV5fVyN6TlJ0V3ooSm0qb0FvMm9FJWlndkUlRjE+UDRPO0szdEREcUJZN1RySUxhSCtjeE5yCitwYyMpOXhhI35AWlhLQEorPzU+MTVxYjYhZ0JVZVojTj4yWnFeb01AMEt3dEFwQlRaaz8tXiVWd1VNSikhXzskK2EmX2hZdVBnUmxqJkBRCit5TXUkRGE7O3xpRENqYXxAWVNmUn5HWjQzM0AyaXAkT1pvbWlhUFhOUlpeX1I2OUpXWEdQRytvX2RucFV9cUl0bGdPKGYlYGVLbmBnQzAjCitoQ0Jha2IzdjshbUomZ3p4Sm48Knl6MWd8WkkoS3BDJWdaaHpQT2dPRllEVF45YXpmUGNSZzxVSE0yOXVAeDMjek9rfnp1KFQ+SHJYZSFOCitqcVZJY0F7bjdwYm04ZGd9ViFKazVtdnZkcEFoNHd4cz56LWlab04xQFJQJDZ6bGllVj9XaDR1RGk4OHE/PDMpRWo4Jjcrd082JUklUmQ2CitEel4kM2tzZitTOHw0ZGV0QkxCRXc7OTM+P0puQnRQTEwtWkJIQ0craFlOUnZRJGVfUE1EOyVLK3xHcng4eyFxTkBOJlUyN09yVElgUldCCitjMHZ5OGdSbmVARWxoZE8pV0hLejM8N212USEyVHx6diFheXEwQ15jMDB7eDZONjhNWkRvZlAzaikoUC17cW9UVkg+MkNFVS1CWjwyQ1JDCisoKlc4YTxfSUhXRG5TWiQhUVNWM24ydHZBdl9HPlVBKHdKJU8xKjtWaVhaQzlSODxJK0pNPyZxd0FIblV4JC1RIUBGY1pSaDVgKWw3WmdNCithTmk9SjNDQEAzXzBkY3teXklWd31rdSVaRyRVNyFsNE9pYH1NfW9hZXttYjd1MjdiRiFZcXZZOEhmZEw3YzFnfD1CTkZnJXFoRCYxJEtXCitMVUBNU2Y7P1JJTVhEO1dgV09hbExiUEA9NDl2UVdTVX5GbWRyUjkmUlFXd2gmREdqVntXI2ZGZzIkIU83YTg3ZkRGZ05mWm5sKHhVJm5gCitDZ2h+ckdFSE1NR0VFYXd2VmR7Jm4oSEstQldqV040QSVyKHJacj5DMDtfM2kmV3d5eVEqMyZRZyordUJhYColTl95TUZuI2hSKno2djBfCiszckhmYkBoe0d1fD0pVzwyb1BeOzFFYVYpfmlLIXghMnMpWD5YNkVGfHJ0eHU7QyZVPmVoNzMmMiUhRTw4VnY1eFF7fHF6bUFncG5RSHFwCitRd0s2bFpaUXB7czVDVyFlcyE/aWVZQyU9KW5ZXiV1PFlzcyllNnEhP2lTNnRLfShYS3tRJH5AQnpfR1RgSDFAZDYoMHlDITBAQDZAJEM1CitQU1F4dHp3N0o+eGJsSkRvOXs4a2FaNldKWVJgIzgjWjF7UXhDeikhRF8+a2dHR3p3I31WdXZMc3FleHRPKVItNm1UenIpT0JLd3ZeMGkrCis0RDI5TDNpJHNjRSs1WDJXO2xDRiEpQ2JBUjEwVzFmV1o3aXJIJGpVQDVWaEB+azhUP1JlMCpKV31nbyRPYmBFR0JYfShGMHdXfGImNUc3CitKMnVBI0Ale3AtZyk9fmpJVEBJMDxSSCFwSkRJO15EY2lLMUxydW1zbntLaz9HU2pFYjQ9KjIzSjYqKU9rflRIZiFjd1lSVjtTVCozfjN6CitjSl9FUjdXcylxISlaIzlqRFJLcEswTnBUMCRvKUtyUVhwfjYkaUB0RTQ3a2lSUyNRWTkzYiFlbENYPD0kYmUoS1VOb0ItfDZ7I2FDaSRuCityJXRQQGIwPVBJeCkjYndYU3U7Z1VwRUR8cGhQPGJgKGF5NkttPEVSX3RUVU9zJUBKe1lsakxwbyYxV0wpWW5hRGs4bmopTC1MSzc+cmBOCispQDNaOF8tRkxRR0FeOEQ5Z0dmdGwhXjdpe3U2dWVGSUwzKEpiXklYdDtRcS1SbTBzVHAkfjViM3d+Iz99VWk8K0Y1TGtaVXolUDBhd0FiCis2RS1sTWpqS2o4IWN1S3QqYkY3MXhvJkdPTndPeSRhOU0yP18/OGFWPWI+OHlqRnd1QFY9ODc1KjFTWFVmfGk1bn51Y0Iqd1dJVm4xQnd6CitkP2pNYGshLX1aODFfISZYa3VJZjt5ekYtQWROQ29TXkplVCpGPkpnNm1uYGBRcVVaaW9qTmclPWo8ZXgjdVpIRDVKcTtxdl9oRkRCIVpWCitQIVB5S2wka2lCfDBGRXIxV3t8JnJ4QlRWbmBNSCtuPHxleUIpWn5edyliU08hXndyZUElUG9FVl81MTdoKlk5Uk94eX11Rj42LSExZ2J7CitNK1VkXiR6Nk89bDs7fmpXJWVSQ0JNX3BzcEpYbllDe1BaWi1ERTRYaDI1OXtOOzV2NzJoMCh1RUlaenMyb0F9bTZjcHNOO2t4S0YjaV98CitVJEd1cGNWU1Q0OWJBPTBwKUB2YXB7YjswIV9rRSlqUjh1K0pqNmJDSXlVM0FqaHdCNnd7aHtPMWR2M2p8eSQrelcrIWspVlYzUnBYQjE9CitZeyEyIU91RG8tKXE4dHF1fXFiYVF8R20yWUIkYmtrZ0VjVTtkM3BDO3B8cz01NmgqK1RNUyl8MzRmNC0lYkN8aFgzcExmQWU+JXtqbzAxCitleS12dGhoT3l6S1F+YiNBZ1NaZjx1YEdAZjtQNkRgMTlHJT9mK0hxLX1fVXlgczQxSlIpN0M/KjhVXkUpXzQxR190dGp7e2RmOFBTTntICitBRjlYZWZ8SHE0anh2djxIeHd4P3t1SzUwWV4zbnhNZGtGVmV6djF4M1MyISRxcF8mflRpJj5ueztDa0BDe3BDfEhZZyhhU2FHaz4jMFlBCitEO3w1XmJ6ZmQzO2VvcWVlQGBUaXk4ckYmWVp6eFlMbE8jKzI7KHk5QVNYLUx3a2AlZXdJKGZ7JDJVc3FveVdiazRoQDtiRH51fTwhSlM5Cit2Plg3MEBoVHJod0BKclY1eFc7N2tEJTE9SUB8QzE5dzRLPzE0O15idEBncHFxZTF6Xml8NypkWDhxMHFYPWpDIWkkWVNwbG1CSlNwSGwwCitZNEcmISN8cVJlQG5vMTA8SVJZVCkrfG1eOGAjNkZqPkdeMHd4TD1DMTl3NG9eRE5iQ1hLS1U1S3R8a1FhfmNoZU1RSkNWNn1pJTAjKnBQCitVY2huel45NCo3Rmo+SHYwd3hObTdjZlNeQztgSS0zPjhvI1YxUiZYMGhJemFUbyhLWlNTNFZePCkteEM3M1FAOW1KNjZDVjdoPmIwITloCitnVSUrNGkpZEVUbEIwZDVDUStueVRmbGNSaXs8cGNgR0EkeG4yYH1gdUAoVXVKPnFXa2Ffe0BXd2hJMTJvb2psaHhQPCU0fHgqOzUlanM0CitmYUNFfEJNKDNOOFVJajloUEhjeH09VnRoJSl5U0tTbl40PDBpcFpiQXNtJCFtZzBlJVZKaGsmMDNjbyt1bmIlMGpealAzdyFqK2NVcjFlCitncThxPnFCWiReTHwjMDYkWCFlaVo9aUNEPk8zezMoRkAhMntSYjtqMig2aHo4Jl95bE5qTzdkeWlremNhMlVMQShJcGdEKU5FZDxnS091Cit4fGtQUDhaSjRyWWBKR0E3K25tVE0oeVQwa0J0QlpYWFBBbiF4ZGA2cWp4dzleaF5PcWN6WXIwNnI0bmNrbzM0ZWlvbnRJP181PEBCP3MyCitQdjhPVUJMUDAhbGs+QTA7TilOXloodShhOzlLfHNqX3wkXnNNbWxlMTNVJWFTLT8qTm9aZyN8cUJhVUw2WDRkfklPYDMzMHZyfCE/SDFyCitzME9MYkJ8My1qTV9hJFUxKnlDUF9yXjJBRU1qVzZHM1AydjxjPnM/TEJJSFRIUFhnPlU4MlNtb2c4QHooJTwwU294RUg/RFY4MExHNH0tCitafTtuMms8NCZpPGZuZ3h6PCF3e1pVUlJBeCoqTVA2cExfaik0Vjh3eV8wQHdwU0heOVJJNHUoJCZjcUc3TzV1REMpZlcwSFJ5ckJTN0IwCiswQGVmRFp9JE5yMGFWezNKbHtwXnpwKCN8TDJDUCMjdGZAUkduQTA2c2JsU0hLfE0wUkF3SGh4TG1oPGlRY3BDeEU+YjtLbVc2MztfSW4xCitvdnxSO0dSKlM0fWhQMjBMUmA1ZUl3dntmQ21MJDMyQFNBaiF5LTY5bG9gQUtZdDclM3UxVkFUTF5HcDQ1eHxrTG9KdypBQXFfc1ZER01BCitAWmNDOzJGP09KMEUkV3cqakVCbj4kb2ZrPil+NG5fNi0xSSNzZEY8QmZNYGMmIWMzM0thWWNZMUA/NlNTTCU3Wj8qZT8qMEEmRXxSfERKCistJipeTGU9eCY3YTBKc3cxLTNnck1TcGIoemg0S21aYDJlNHIySzVAbDBeQmk7cmAwWmk8RUx9fk11MSZzSztEQk40WnM9anhuYTJsXyZSCisoKGZXSE0kSX1fQHhDJiZ4MVpaXn5mckdtam49NVJWQzBPekpjOX1ORH0wUzI0Nj48RTl2KWs0NH1mWmZ4JFRwRUJXWGBHKV9mQ35rVigzCitzQkM2WEMpUFVZLSQtZX1MQ1BCZnY0NHAjSzMpOWwpcThOSC00IWdYU3pBRlQoVyN7fUE5OFMpQmY5ZkdlfHM0JWp+bEZkJkVmS3t6c3BeCitNKXxUNEMjaCswUkN6ZzxxRl95ND8tT1FgKX5gQ0wtXmJ2VU1zKkw3KWteS2pfPz13TWdtPzN1OztAKGV9ZSZ6U2poUHQzR2w+MShLYXEzCitXWD5Xe1VqUDs/O2BUKVZVeFAwWHtJM1ZOVGk3PU0/M1dNaUFrcVEyQiVnPUhnS142V3BuUVY7YSkyKXZhUjJLN28re3VuKSZYMyM2IS1ACit9Mi1nO1laVjVRVGtZWXxKNnlQTytgI2wybTl9KUJjUnktbz04byh6VzxAeD8zenpadU45aWNvUkpwTEhTNClfVXhaPGEmKjNIVno4ZT04CitTaDJ5b3xmeSFgOX1jLUx5cStibj5pKjhva2hqeyozXjhxc2I1e0N5M05fWDVFRD1YdSNjWGtIN3Q5UWE0cj8/cV5AcG5VY1JfejhUJGZGCittNWQ0KWlqPkJMVEw1NzN2K31lZ0g/bCU0dWY0TSMlVDt4aHhYRShYYUQoVipxe3hVbXAxMTFhUlk8a2FtRHEwZ1FWYWB+I2l7QFRzP1hUCismbjxuQmsqY35vITtTZTBzdjtiIXxQRWR6JjN5OV4rKllEXzc+PGIwOGEoemAhU2N4NTh6aCNsK2UjczBGMztFXk5Ie2FfeVdNKj9IQHBJCis4Xns4PDJIP35rKDJmQylGa2x4VSVLPUImZS18JSUyK01ZSGUjIXhRQDg8b3UySD5WVyZ7aERCQFI3WXhlZ0gyNHhOJEYhY040Jn1lWlUqCitvbW19UUE/R2J3Sj1YZTBYMmpNJTdlZ0o7R0FEO18/Yk84ODlDR1lfRlRMOHgjMHskU0ticFQmRjQwPTFAPmozc1Ywe3MpPCEyc0pJaGRLCitoZEFIZStNeSNHYkc+OyQpODR6U0Ita29TTkcwYkJySTUjWiRqVj9LdkcwejQ2NXI7fHs9MFNeY0dKJCZtaWUqeU9UMF80VEcwRk0yRl5OCis7NWFAUWxKUCZgQSpES0wybj9EfTt4SUo7SE1XTX5Iamc1bDB2JWFELUM/aihmYEkyXmBeKjAhUjNeeiFCfmZJUE9XNzFkZS0tYXFscVYyCit5dVRlQGBHQEp1dClmcXohOXomSUtySSpOQkZoQzVuZEtKTGNofS0kR3ctNDB7YHB4fE1yaWNYP0pEb2dQQFk7dzxCekFFZyNuaU9aYWt7CitsUnBuT0U/RW9xSUlofFI1V2BnZ00wV2B3dH1CQTRkPm9fJTBLflAhYTdBLUUzVTxPei0tMTF4NktLSTZlfGIqRCkhRHdKNzVpMUsqc3BLCitKZXA0JjxgJnpMLSpeMGY/Zjw0WiY7RGExVzMkI2cpY3hUMEIwKERtQ2UtKH05Zk8kfSNtNXRfIyNoX2NjSD0wOT56JiloVlQ9aERiKXM1CishN0UjVGorKE9rViUhT24hc1g4a3E9eCFXbHwkYUE3ME9hJXJtb29fZ31AaSViYktyKExKSU01ZW9rY15CQlZ6YiRKTXU4JWQ1OHRYKXRICiteN3d5KyRAfi1iXllnRCMrKWJlQD9EbnpmUSFgTjxRPDlGTlVKWWhkZnI5Pz9ZNjM9ZyZYRmo3UkFDdE5BYHg9ZyhpYjVJdmx5bH48M0AlCisxaHc5dytgcHd6I1lQWmRII0dmT0doZHpFMTgpTWk8UiktZDNyVUN4ekFyJXIjdUlOPV5rTzhlPy19VTtuVUt0YWBPYE9Vd0lAZz9ae3FYCit6UktNKiFUdV9tZiZTR2F7N3FOenZ4TCo8PUZDZ1hlYFYjN0o+MjNGcXlHKVkmJj8xJnJTPkQwJFFzeG9lXi14T3tzdjYtPSs1fEdkVWFYCitsKXlqSUxmIyZPelhCb2k1KWw4cmRYN145X2B9SkwyYz8zakEhfUwqfWU3bTUtY3xIZSM1OWxiYjYlWCs+UnZyTiMlUTNsPlM2X2QyYTF7Cis1eiVuZ1QqdG4ydyFDRygzUCpxX3NtcXp3Pzl0eXUmQWhoTHNyKj5McXBlZypTP2d3a3Uld2whUjMmZ2RWfndgTyQlV3pIPTlrJVl2WihMCitjS2B7M0xmfl5jaXA1bko3IWRrMnttQS03QSg8eVhLRkVCR0JGR2JBP1psUGsyTXElQksraW9XcVQ3PHdNbiY8YFZeY3VKQyFsci1IOUwjCitkNTl8VyZLdj1KVGZ3cEJxU3R8RE8wQTloYVAmVU5mfEZNRkRHeGpAZG8rdSF3Kj4qfExuOFIkb0pvVz88blZIKyNje1F3NHZ7QV51VX5XCisqIShjdmtoWUMxKj4tK2crNTxVYzMxbV4pSGNGUmx0NClIRUBXN0heRSslYU5XWGJkMi0kVXNpWF5aeE1LVypCeVpFNDJISHZ1TCs1ZFl2CityTjxUYFhpJWFgI3lKdVB3U3dkZ2xfUiV6P3d8TkU5VXFiMjZtb0J8YVNTZzBfI15VYlhzb0pBRUM5ZEtsSH5Dfmc5XnpCK2JpeT0+VmQtCitAOSt0TlpwTFAlSXg3enF5I0MhPEQ8QjNpQU03el9yTWM5U01lQkdhYyZDd0pYLTdyRlB8ZCYlT3x2MUlQdHgjYSUpPzxaTVZTO1Mob3U9Citab29xREFDSStpM0ZVTCEtekNpPSM+NSsmSHJRZm1yZm5qK1EpVWk2SXtzajM5NjQ4XzJULXYmcUkpWDBxcThAdWNlSTJUMTV2TzhXMWhXCitiaHRKTSg/Nno9bUFQYjk7UmcwQXhkSVRQJXsxJEM2bTZQQnAxR0VYREdTbk1Acl5ZUSFASjtCP1NjcXFfbmhAdFgjUjB7T3hhbEJoTmhaCiszfFlOO0hDZWxNRXFVZFlTNktlT2B8aThzcW1NcGZaUF9RRWRfcz16ZTN2WiFtNkRJQERBflB4SGAle2BLUkk7aDVJSzdFQ14+UUIxVVlyCis7NiM0M191Z0d+JkpkZ2lJJCt6RXIlZ1JNZk8lMXRse3dNTz9XbEhNbT5kMilfbXNuWkJwVVdXVjl9OzFGZk1aUDxCWThvJkByS0lZNGwxCit5UXdrTTxMVX4mKGdMPkFCbyR0dD4lZF8+PFBDK0piUkp0Y2srejkpbmFodyE1eXliOzNSMT54c0hfJm4tTW1PPVF7NWRJd3FVamdCZExICitNJnk7ZD97KTd6bHFpZ3R0UVk2JWhWKTIpX2Z1QUJGSElBXmdgNnt5UFg/MUw0bUBfPEU9Q2dMO0R3dVo2T0g0fipAc2d1RHg1ITZQdGtzCitAbjtiQFIlPjVDa0dTeSlnKGdDSzFrP0tEKyNUOGtJO0lqQE99YCFDeGoxJkBPTUpeMVBCa2I+UntZWTdlTSVCNVBsN1d8MnVAPTQmamVNCitgMHQmPGdZdUNHUm9SU2hOTyhlY0Y5YDMwWEhnKSRyYWhyfExpa3dfe3ZpbmVId2VFMCFrPSZvUHVoYDAoaDJIcDRebUZUcHhXTCtqekd6Cis7QkwrZiE/PFJEeG5iMWooNWM9UzFMUlk+fD16SUdKSl5HRFBjbnlUVjFIdjAye0E+dUgyak4jaF87bkVlMHw+dHIhdGFJZjVhLUklNWRNCisxelUqYHpsQTFJNm0zSz5BKlFLMFkmUH1sXyZ6NkE8KHpMZmtubjM0O1ZENS15dGwxblFveCU/Z19lO2xRYkBMZUdNMDA9KUMhY1RfcWIwCitHWFkyd3d1PnBNbWhOTGlpNk17MDwwejFqMygmQFU+M2lsX0NaRkEkJTdJLXZoJDtoVmNDJXtHQVlmQ1dMPHchWV95THVSezIzNWRNQD9fCitAPSlreyZUajlqVUEmTXF0ITlvKmVeNkJ4TSREYTt+Y0txRzRUZTJQOFQwTGRiQyFURyQ2RTNwT0R+ajw5Zip5Yk92eVNlK0VFd3h9Pm5hCis9d2FNQWpjfGBvaD5lUk00ZG1sdXdXRyZxbGxyNUZrZFU0fGd1NVhqTWpOazwpeHw9MTxaRUY2dSZfSW04a3Zrd2g/anEzeTk5SmY4YVIrCitzMj0zV0soYHlgdDJtMH54aFNCaiFUe3tFQGZJRH55NiZgdmdMSE47SDM+K0p1KVRLaipLPD5fWDREUDdgQ0poZXlOJmJFdkkqY0YxSmNLCitiMUp2MTBUUik/LXlib2NBZmItWkJCKmJpZlhASlhZITJAflN1PEttTSNCWjB0eFBNdGRYYDFrfUZGJFEhYFVfWVNXeHJ2NylPYV5xMWpZCit9fVokMHgpa2JaX0RULTIzIW5edjVMVjteUHVAMzFobztfN0AofHk+STlNQmpOTzhTcmxAckM1PVE2Qks7V3MhTztuaiMwaGNuMn19cVVnCitQaWByZjBBeCs0NithcEcmK3dSK28zfVRAWmZNeXh9IX19JSVDYGtVOz87ejgjfFY8NWFlKT1Sa15GOCtKKG8oPms9VDkkOTg4emJSOD4tCiskTEpBUz9HUlUkZC0mKzJncm8jUm9aIS1OUTxFViFhIWwrWEgtKjsoO2Vjc24mfWtqK055NylKSj0tVzB6SXh5Z1N4a3JANEYjI3VUe349CitPYyFafmB2Yl9OdVc1KztRaipOX3JaRkVtYzhsIztVLU9qYFA0blNqKmtoKCRGNz1LYk1kWUtzQSoyTjxSLUQ1e1hhZzhVOT93Q0dNeiskCit8OCtmN1cwTyZBPndXc01NTGB1d0w/YHdtYWdMT0wzcG9SUGtjSWZNUE1ofWRYRFEpZ2EmZlc4aDJxOUpiUmgtU2BDXmRWXnMrN1pwMU5xCitvfl5MTmpNZEUwIzI8QDwmJkxCMm4/TChkVS01QFVeSlI8Jik5UF50cWVzRFk4QntkR2NoWWsxUkhnYkxid2c8PXNoMkdVQ1c4T0R5P3RYCismaWE/Kn5NaG9LRn0ka296czYjJEBEV15YVUdIaV53VXExPWJuM3h0WFo+JHkhaGdhV1prLVRPanIyZWdBYlRLeE1qOzByWW4zfUBmdnYhCiteb0A1eFNKPF57N2RkP1JGdytncnA4MUJISWRnYGJKJHNoYSo0QzE5PWd5SmVlbSYyMGdOcWswbDU1d2xrKEhNeWNATkEtfDhReiYybGFyCitDWld3ZlFQJXEycEt1NU8jST1hVzhxa0VQMyhodGRDeHxLfCNgXmJhekk5VytnbGxTUU4oMHx1Q2dAK0M/NWt+Wjg9eG9kVEwtOyEmZDw9Cit3LWh3JTQ2X3ktflVxWSE9I2dudTh4P316WT57b0clQSUzcGZRfDVaSWp6VVJBaD1ndko0MkN8RjVJfHFhZThaQFhNVnclcEsxM0xIVSpJCituSk5Ue2tGYWZqdlYqTGkmVVpAPlEkKXdncSROOT0tYlgwbCZXTD90e1Z4Z157NDF7WHokSV4lfj8wOUBAMlMrYnlVXk5hIUdNdWg0RzdMCitaYj1vSCVPYFUzNTc2eStxWX1tSWlPUiZMRWNLR20jNGVDUGhYWCl2cztfYXtrblE5ejBoS2l5MVQhSiFsVU9Qe0Jgd29OQlNLRFRzblpzCit5Tyk9elhCZ0Q0OXdBKl5nVE5KbmJPa2ZTOX5SYC1yJnJqWkwxQjJhN1IyOCNFRyMlSXRWYkE9Rjk/M1ByPntwM1crWTJneEdxS2IwUlVJCitoYHNORlRsT09idDh+ZU5TYDVgPnRwM0o7eFpyYVk/IyFvKGkoOGxSPTdxUnspZSplc2JIfVo+SHt7NmRtP35hTHpBNl47UCt0YnElU3tDCistKUN8KERUU0k5JDQhSHh+Y0RnTGtleGVCXkl4OUswIzZ9dnwpeytidEZjd3ErZ0owRzd2ZkJ1SkdlKTs3YD16R3Jte1BXTT4xTmBRfmckCit3NmxUemRCTz5DXkErLU1pUFdQJDxHaWp2UDVpJFBeJng7MUxRO2hkK35rbkFnfWJ4OXtEJWNRMWdMUl8kJnhZYHtKRCsleChQX3lPTUteCitVcHRqNDkzeFArcVB9PSN+KipCKDRXJUpLS2wkT3NPVUd9ZF8hVVVQMDx9PnB3UTJMQn1xflokb2xRRVc1PUd+ekoyP1dGPU5LeSZJWmdVCitKVGxVV0BGTnxfMytBaHJfejsobXU7NVhWdUlNKV9EPVZVKnEyVVVfWDdLajs0fXxuUzAoQ0dGWCQlYFN0VCp4cGRAPXFIOTVfSFhae0FGCitTS2V9bnRDZFQqby0reGJrX344ZHlSYUhmZzl6RHdaVkhuVTYoRWNvaGRFdmVILWRuVkI8SGtqeHZjKGteN0VVeXEmQUpzVVJ3Uk82amxBCitKO21hdEJwSXpeUDBtZmsmTiRQaTRzMEcmPTNpZ2Y9aHxHKXFLSXxXXjRXdl5ibmhDJip5YDAxeWdYaGxWWkJifD5OSVlQaHE7dFIkbjxQCitZTj1AI15Zb2BzSjVqR0JlNX5mMXZYKTJ4YWNWdWZQNzwwT2pydnBlYkZzYSl0aSgraSQ7cmBzdF5lengoZEhaeT5KQT1udiQ0MF94alA7Cis5Jilae2o+YW9LODB+UEtJQzhpUHpMJEtKZHI9LVV6UzcwPComSWNAJmBPU0tGRComPVdMSlBLZzBqZG9qYUY5S0s2dCVRR196PSpzKzgwCitrTEJha3NaJVR1eld3JUZXPTA7ZFBDeS1JQGM4bEw/OENaJmBHRkFnNGVKaHVJZTczTzt+KD03Pk9hTU54UEQjVVd5WEpDe3NaaTxxQzM+CisjQSVCTWRgdWNoYi00SEFQUUJoSTd1Xmkpdnsyd31XaDxeTz4jfXg5TWczaXE5RnM0N3wkTnY1TSpAd0xFK3FhTF5tNkluPUc4fD5WSFVQCiteVCkpVU1sPFpaKCpsJHVVYUl7R2xCa14zbmZ3NDJoZj9VVzl6cG1nIzlPNWdhTih1Pyk9JER5dFMtSTgtQns8bSkzeC12TDhjcXIpYkUxCis8b157OXJPNXpuSkVqdHwkLVkxQGV3Sz1LYUBTZjZZRmBHMGljKGt6WHRhQz0ycTk+NXFCKihtNl9YcEhVaWZqTUNeTWxuJCQ7Ry00bWZ1CisjM2B1QVZjcWVQfSp8fnI3S1FUZGlDbm4pcWpTNlh6THZ4QC1LZ0tVZFoxK1ElfHJTVjBvR0dIS3BURFFYMmF5cSg5MDRkMnEpO057NF85CisqYEhIZGYwZmQtcW0raGtidTNOWDdYT3puVUJhQHdKUiV+WkN6T1JFbG1ZVkwyM2UzN0VKdyY9T0xBYmtXMTM/Z1ZZJEtia0xAbXUqJSg2Cis7ZiZjTWVhdjg+KXAhODFRYnAqJlQ2dn5iSEI8RFpsSUhrZCNpMmF3aCR2XlpOUkJyI1Z7Nmx8NEBvU3paYXlpRnoja3wwQmc9SXNRMU00CitgSkdjNU81Rkp5QEkwKUpEIXJFfih3NUQoPmw/QmBzRFFCey08S2c0QVNocX07ejJjQENne3loS0M3T3hCbTJeazljdW1iQkR3azw4bWZuCit+azVAYGRTLT8kfEcySUJhS31mNzghRzlZcTx3cVNPRX4jRE5VJnshRE1AX2JZdFF3I05WRSVhPHdpR2ZoNX1MSD1ZcFRGUjRfPG9NJXtLCitqX2lUWXY/TnI8TFI+eGo7MnJOIzRzbEF7KDtoSS0lJmNMbiRpVDY7UntpcHEwRWV3PitebklwUnJCcXlfTUpKMGlXPFg0Sn5kPEA5SHhDCitBKWw4PU1uPzk4X1BoeEIkOHlxSzRsTVVydUE5cHQlWXRQYyVoNU5MQUpXKDZrRUFjI00kellVP19ASUlAN0B8cD8tRFgzZW5ZN2RjKyE5CisyUkcoMT5RSik4NW4qP29ZMigoRShLISl5e2Mtc29VZnxtSTIqfFZwa3s2aW0pe3JuQzJmJU87cjEzNTNTS0E+NWEwcmBoXms1PkZHbUE8CispUEJ6PC1NREVibn11bSl0blVrYkZKdnB8Tkt6e2tgeFRuNCM1cVlRRj0jeGBtMlVQJCt5bD1laiNBcEpGKXE1a2g8V0RkOClLZVlGKHs2CitrJF5mJSp7RUlhdi1fN0wpPHxnVnhGeEB7akgwTStJOD8mY282NDRVcGoja2x7cnU9UmZ5NnJPQ0EqZ0dBfCE/fEZVM0hZeHRnI2A9c2gkCituX2F6a24xekhOdWVKekdNQWUza00jYHU3dHBnREFJY3pxJkU7c1JqPnhqJFp7dzJUXiE8ZSs9c09RWik3U0dyaEl5bXQjayF5OT1VMkU0CitOZyVeTEtZfFFTXipMVkRYWUZ5YENQZnxNe2o9T0FeI0tgcmVjV1FaI1B8cE9lKS1VJEx3a2FiUWlTfHR5TkQzVzQ5Yjh5azFQdz9WUDdsCitqVyQxP2VFJFImVCttYig9WmRnMj16NlViQTRLbDA7ODlzUj9oaDh7ZWI2YnJ+NGFrYFZjQGlicFhRNTtDKzFmSnkqan51eGY1ZUNweSlpCitIMzU5PSVQamwzYzZ2TWt2NFZ8JE98OGYtVlF1Zm8wIWVfTk1FKGFqKmtNfmc/JGNOYSN9dz9LeUdfNHo0aWxVOFBGPkdCODAoMnxUO1N+Cit4ZUJFPWtvPHlYfGlKXzIqU2cyNEB7KHB3S1p8O34oMDRSe252WDcwNVU4ZyVFaXt6T2c8YS0qVFF7OH1GPGlXQi1kWFYpQEAkYXdxKTwkCitnbH15XzszLSgwQ2ZUREdzXklpa2xgNjJMcGpRRHt9fXBjST4/WndxbDs3SG08OyZDSGZlO0RqeGx0MSVqRjsyNEQ3PkRrSEJ5SmB0fGg5CitIe1liRjdzO1A8cDRfYVNUKVRGU1J6MDZXdy0qa2hwQT4pJFAhflBgOFU4Tm5HcXk9RCtVfSVsRU8qalg9RiMtWT49Xm8zcmsyYDRoRFNoCisjcjY5djFrTzY8cWImVUl0eDdffDl8NDxmS2BHO357Z3Q5I0gkUnFUdng4N3AlKz5SV3dFRXJaZ2BUXlpoRz5sZSYzP0c5R3RVaU1iKmUxCisjS2NgZFhfdDFZQUgtXj8tZTM2Tm4wJGdtNyNEMjglV1ZBMyYwdX0jdUM9QD1pPnclcTxCfDhuX3tqKmprKUpScEIxQl8kM1NuIyp4QlMqCit+NVhPMjZJeUVaeDA0bVRvSklxOTJSO3tKdjl0VU1GT0RQUlFeJGwlb3w3WGxaRSVtalFvRiRBSkZYMjtaNj9TXnM7Ry0xck5gSmNzXnc8CispbGZJOzxLfX00PE41dEFGJlFCVWM4dmU7OVMwTGxfdjxYUEJrQjZ3ZTxVWipFPGQhMU03MntzTCMhUUhgUlpUZjZSTm1VWFNAZVV3ezJ8CityaEIwLVEoOVV8PWdwaHZrbHwpPiskPk08aGklZV9pKktWb2dBNlVTR3ArcHNGYGRmRyVlTzxATiZFRWFMejl3ez1xczxoTGF8QFkmQ1I3CismdENjUWF6TVIkVHVmRjw8d0w3UV93SW1EamplUF5RUmozUTBLOG9XM3s5JTFRQH5Wd3F5I25Lbm0qK1hediNldTBCa0ZURylQLUJ8fEgmCit0eHM2Zn01RClUPkp6PEBpXygkY2IxUSZWZjk5Y0I2Tyhufk1WaTQhTiVETzBBPHZhJk16XndVcSVDIWMoaEBxXj1nPFFIWVl6NXgzUFNxCis+Yi1wYlhmYVZtWlhWNWFaWm8qVUA5SUFeLUxDemBBKmpJPnRQJVZfPCM4SHRFXkMxWjRrfjxGQW47TjB1ZmVCb3R1emZ3STA1I3tFTS1gCitza3kjcGJrQFRxamBDRzZ6VCo7Xlo0PU9uVTFofl9pazFta2F5JTJeR0dnTmEoPHdFU29VejdnTCluMjE9YV93KTJ1IzJKfi1GcypQR1NuCislOGY2ZTl7QWt0NnJTUDNoZD1xdUd0YVBqNVI2O1lXdHlMI1BwNDB4UEo4dzBNZj4qY09GXzQweWRXUH5IPUk5fExIP1N7ZiorUENuS3JoCitxaHR8eGRwQV5TSHxJQnBePzRSRlU2aVlXZ0ZfKFVNYTA5S3NjPTAmb19pZktWdFhqMi03OE1vIXpIO1NDeF4oSCVpK0E2QkhfZ248V2EkCitwJE4+LUxvMkNOcS1DLVIxSkc/eFlFQWd+fENhKnVzOSkpa3pPejtQdG5wXmspa2hxQVFyMU14M15qY04yfT1ZS0ZUKVpNamF2LXo4Y0FBCithfmNAO1BKMTRFQUIybVN5UEl1T0ZSMWU/SDN4PkAoIUs5YSM/Szd4fGF4ZH5zfW01YkZjaDV2JmkqPnBTK0AmU01XOEthKVE+fEF1dTclCitSaUsqfEY2QXM1MDB3MzxNPXxQVkxIPjFmOXp5Qj9QTXE4QUl2YTd0UjAlTWNfQW5YV3RkY2xHISY+VGFWM0V+QVIhUUYyO3RFTmdhTmMjCistc2JLdVZxJG1xaDdeSG5kRCNASD9idVkxTnYmO0RZTnJ2NHByRm1EIXxDc0hfTVlXdCY1TXskfE1BUzZvWlFgZUBBO2tJYEpMYkVkK3khCis5YHR8RUN1dWY7cm9UPSpTPmh3Rz8ySSM7NHtgKng/UUlZPGZJYmFOP0c2b2EoNXt1enFCbHBscml3clJ+d2B9MjRhbFl1MUMtMSlkP2tQCit1KDlOOXEoRiZ6NGxPKTljUHpNMFJVaT0xOyFPXnNmXikyMjtSeHcqTSYoeGdkeDl7OFNYNjM1WShZPy14VFRJMnxRZkx4KUVuTENyOzVTCitvRDdoS2dUa2Blb2VQcmM5WlZDT3E4NGRPbVVEZ2RQTEBBI1coX0x5eTdkXlFsPzBXQCpfdmM8YFg2QTZ+PEF7KWNZWDBzNG99QGxCQipkCit+TWJOWWspUHVlYks9fWAlU3NlcmooU0ZUJCVTXmR3WUFnQ3gtYlg1MCFyVWJeQVl0dVQ8aGk9I2pacTsjO3QqU2chfH1aemJ9a1dkSXVtCitrSWdrRXBOSmxYcnxBRS13bCk9d016c3lKWkNoVWx1WjIoRHFUM2RUampSKmVVelgxckp1JSM0c1E4V2MtfCZDWHxGUnlwYklmfDlnJTsrCitVSDdqemVlVG5rJmE7O2xzdCF3Kit1MGcoeTlJXzVybSZeJXIhV15LSi1Ubn4mYjZANiZgTXtwYmN6TUdHZFVNUFdYXiskSW1RfVk1eUpaCit7TjcjQXxjVDQtIStSSEMhQW9wdSohR25IJTVHdzMxO0A8VThTZz83ZigpWUw/ZChIY0VeXnpHNmZye0RQaCF0WUl0IVJXPWwjc1I8NEwxCitNZGdvUGJQV1l4fklRWXg8Y1I8M29WIUFvc2A7SlpCQjxXOzZmb15TdX1TWnV2KD9CLStALXZDeHVacEZlLVQrTz16IW1UeCFUUDMxZ2YzCiswZGJEOHZ5TUY5fSZPeXp+YFZ7KTk7UmQjckFBUkYwbnozIXtxelhBTHUmbGskVzhRX1VPXjBZVlkyP1RBc31zclpSNG1vNXllQjdAMEJuCitmI31UVmw5R30+NUFBWEstRkRJSyE/PUIkZiMhczJTKGQoQGFkQUZsZ0k7NnstTnslQz9jJCN2OG03RXxoSkkqfl5gKyVzP0RyLVVlK0BKCitpbGsrdEE5ZHBCSCUhOSQ/bUB7K3tTT09SblZ9VysqVj5vKGRLPkZTSjl9YE9yRyQ7Nz9fJiokaiVUYlhuK091Y1JZUHx+JlNnKilDXnNeCisyYDl1Sk5uP1Y1Z2Z7IXtjc0pwYVFPdSR9bFg9cylCRGR4WShUJEhiaVFvX1IzJlVGTHlmYlV3TmtKdGlAUSN4LVFqQlRjKWVBSzR2OSZpCitqKmh3PVV2KWxlZDcrajFnSEVJbDN1NkxidUVuY0oqcmBPZ258d1hNWGo2VDxMPi00PHF0QVVlekdSPDx6UUdwTCZ3aiY3NClNeDsmbm9ZCitxM2BUOHtzeXxYLTdHJlhOMX5PM0hOdlArdSpkUE19cSEhUE9EPD1ENXAodytHTUFfKGBpJGtIcGdrI0lqeEdkcWlCMFN4OHdCO3FwLWd4Cisqe05lWjFOZSZNYD10ST4+UEhGakJGNypxaVRTfCgzVm8lQkAwJV8qZjJRQj58RE8yISg/I2RBNFYhSWVffXE3U1R5bzAyfEkodz4lMWNWCisrVTVzSUQ8YnVIenpXSG1WPUQoKVkjU2IoczFKU0AoemRtTm5tflRzTHdfTWhBNUJmfWUmSlJXM3o5VnwrLT1kZV42I3FPWnpVPm42ZnE5CisxRTk7cz5LWihMcGNiX14jWTdZZmV6OVZlSDI7a3JfUGN3ZWNVY0hSR2IxTjhxNShjdk5LdiZXNjZvNHFDYGZBMEFGSD5GK3xvcUp5Tj04CitOMUklb015NG9DfHp+b0gpN0lIKlA0XkB4aFI9LWM8RFRoN0I4aFBkKVdpQXZFQVM1a0Z1YihkKmJFYlR6JiNlaFQwNUtWQEZgRXhadG4yCitmVU08SHV3JVhjYCZ4WWBYPmdFN18+cy1nKFc3d0MoZmxge0FoUyRWamxiXmNMNldeIU18ZDdBNlZJdVlrajNJZFg9alFAfVQ+Nz98biR6CiteOGluPFVzd001cmgwQjtxMFZEJmNYRUo+dHw7fSQ8cnJASUBUQ347WXhXUGc8cT49Y29IMHx7SCtzdXREbUYjcFNEKk5+aDM8VkElcylPCitidnx4VzsrRWNEYFZCfnx6JCgjUEVLZkR+bko7Qj93SmEpI2dIWlVJSzVzVjZ+NlAkNEZAQVJlVE8jaiQlaVQ1a2t1M2Z2dGpkdlM9bUtOCitWU1QwYyRhNjNPUzFNfEFmT182bU9ke1JEWjtidWIjUkp9QFRhYWwobjFlbFkjeHxHMlR6TUVvNkVENkl9WTVuMzZgJEtKU2xTKj9HK0h4CiswO1JWUytzN0lHRXxaanl4dmRiaD58dWxZRCNqPj93NTlMRXAkWkVkeylkb0dTUE5JcEwkYm1KTnktVWpBNkFEeG9Gb2sxPyFgSDM4bn4/CitqT0htXzNHNlg+KDtHWDs+S1F+ZnhIUjRwcGFoJllsPTh7QTI8e0ZQfjtKZTMyYkFkZ0Q9JDskTGh+RWx4aUJaSmEqaXx6N3pYVCNEV3RzCitWQ01mIVZ+KW5Wej4zSWVre2RWak5NME8jMSNDaU5UdSVSTUFBTH53SE56IzNTLTxaK3xNK0JFd3J1aDMtQG1fKndNZXs9ZjZsbX0xcz40Cis4OXhCemlBJFMjZSl0QGBMP0lzNmJVYD5GSmZFNzBRcl5rNmZhcURRWFRldGtQdyRgaiFRejgwKWlOT2JtM3lBSUQzQXpWZi0wMSQzZGlBCitGVDhZZHQ+LVJrN201NHpSX0lNWUBLQ3RLJnhLKypDantteiZBKV87MWhlLW9kdjQpT1dqSUV4IypnSE1CRE0oMUMpSE8yeH53QEdOSWNkCiskbFJgSGNSZnxFKmlNYGtyfl9uTEBCM3tCaF9vYWtiZXUycCNZT2VaK1NaQFowRWBUV2d7KGQzNEVJcFpYc2t5Uk5SVHFPcX5EOTZzI1d1Cit8dy1VXmUobSF7ZntpYjRgaCtQLUkmdlJtb0JJKW1vQ2JoTlJZPn1zZDIxcXAjSEhiPFQ9UmMhZWlucVMmUSpwZExrQlA9N3pjVyVAWU9jCisrUz9iQClxaDtQQzY2bV4kPllCSXhwZCNCe2c/WlhIdkpiQzdYQ2RhQ3I5VTkhS088fk9WIzYjS2QkM0RYZm5GTT10fH1YLWR5aX5RQHN7CitncyghZ35zQEBBPTxUMUdWTERseTNHV0c3O1p6PEp9fEM2MWFlUSQxVj9yTyRTVXRlRmpYd2pscSgkbXdgKHhwcHY5KGVvcT9LKmQxVmpwCistOzM7KWdETSk7OXZsUFRPJiZVOztDWWU0XlI7PjN3X1dabW1INUwqdX0xR1hmN21ZTyRqbypzOTl4I3E7VkY/UVZTdCg0b2Q/fEkre3tECit1R1lFJmopNHV0ZjY0YFQ2LWV7fFhKdW1vTHxSTTt7b0IjSz9makFzY3hSSk1uMipTPW5OZDwhYlNmYyg5dzhmM1RQOzY8IUpOY2IxZnRvCitDVl97TT9ZdUk5S35GS3VaZGxiO3wxe0QkZjRPSVZwXzNQOX03USFCPT41UGAyMzB8X1E9THlDRHI4a3hkKi0tezNlJSs0M2JMKypJPDNQCithUmxaN3l9KShRMHghX3A9dUdINWI/VmQoJihKVW16NWNndCt2Vz1kMCktfiNXfWN5OEAjNGo1IWh7S0dfVXpmM0hrMD09X3o+cUlIJTRFCit1RlJgdHlqa2tmX0hINXgofE1aRmUqfD40ejY3RU0lOS1FS08wYjV3R1YxZFMlU3I/cDNmZD9rWGlAeXd9ZzVORzwqbmI7KyROTnZyVll6CitiPipyVGVkRHk8dlh0N2BJISVvbl83LTAwLTw9ZyVMeSZBeFUyXmRxYFA+O0p5IUZoMjAlIS12JkAwfCNgajd+TSREJHpZMVo+fDZJd0tnCitSd2RPTmBnfTtIKjdeT0Z7IU8yRjV9RD5EYU1qV31vMTJgO0whKUNePUJ7NDchaGJaZiRLdns7bWl3d3M+T3NsaT9QZ0g1b1V8JUs5Mml6Cit4NylfTz5Nfk84ckFGQlRrMnJYPzdFLWJqYkc9OSl4YEkmK3tTYWUtaFN5NmR6amthY09zOXxud3B4OTFjU2trTGBTeyU/NmMyNGRGYXJnCitVVjB9UzRxdWdmUjZoVXdeWklpKz1aO1YpbHk2enEkdyh4az1oTjZRPTJfUENNZmRnS1g9bCF5QTx6MVcrQG5rNj8qezlUKmNmP0BOKH1QCit3cEpWJT1hPlQjaGNTK3lzbjdOKkZrIWdINTxJazhpZylWI0tvbWs5LWZCTCQoSFEjIXJtdylXUjJHYlg3JkJSMSpVKGswWTc2VHZxOzReCiswVUwjYXA2T3tebm1IUDNmK3tPWHszcUI3PGk3Q1cmTUBnd21vdT4hRzV5Mk1JKmdmNmdGVnNkQ2x7Xl9AK0s0MUdkKkNodHFjTyFOV1ZzCitUPEdWbjU8Tzs/NHwtSk1tJWdzaH1JWk1JbmE0VTtNPz4la0Azbjw9c3pXSVVWdXsjQkFgN2RCTyZuSipZNEo8TkB0KDtxVCQ9O2NNZFM1Citec2R9Wl8pUTQ9RXhIfG43X0dtPVczaUE5Uj9xfCs1X3JuTHphI3dAIWojO2k1ck5XKjd8NFlKfDZ5P1FxOTdiZWYjIWxlfj4qUTtBK2V6CitAeztJX2Nic1h9ZSpmQ3l4WDthQ1V4MHNON3FzMzJsVmtzWXY4OXk1XzFXcmoqTGxyUFZ5R1hOPmklei1gQTdFOV5+Zm82YE9yZlRYYFo1Cit8bmFqVnY5OF8lXlg2WEgmMldyMm9VVlpVN3U3QU4/ZkFadT4/Vz52bklPdUpCRjZJTSQ+WlhQTnZFXj8wPVheOCZXPXw2TCFjTmpaX0p9Cit4dmQhdmBkX09Fa2FrRGk4Wj9nS0J0aVduMCVufHU9MjVAJXooK3VQZkZUfSFEPzRvQDg/KXN5NUAmajhoJmxrQyh4YEZ4Wm8rMmkkJih7CitGcD9qY2NSJGckI1lmYF9ATHdjZDw3SUBWMiFpNTVKUFo1JHteTiE7X3ZLKEB3bDtaSCNsS1NIRVpOT1V7e0l7ZyQ8NFBvfVRCK0Yhbj9ZCitfKyR4eXNWLStFM0t4Zzs9YnpRNWBWZGBkU1pFTGFhQ24/PHpwKSo3RlUrdj1jX0tDd0RPKWJaQEk2Y15mNzw2YEhqdTJ3MGtDe3IpN1dUCislVSpCaGltSUF3e2NEXjx5eFlDOD4qVUk2ZXtvRyE+NUEzUHYzeWVIVXRTfTxfI1o4KERxVUd4PTNuZnVqKF9SP2BoaS14bHdhN0s8ek1NCis5Xk9vXjlFNnJEKFUkTEBzc2xPYENUVD9vPG40ZStITl8pJiNSXyN5QSZZYXhPI2tWQDIrPCkoeGxZN3ljSVhPT1BJbkpESF8/Y1pXd1A1CitQPj5HYHV+NmNzdURkfnJOLSROWGtETm9fMEc5QmQ2OTR8VzdRZ1drfmlQKVdFcHlnOXIoKyNFaDBKe1JyYGNaWWt6VjxSYiVAc1cmM1VaCitmfmU1fis9QmpfaSYhTX4rODRVZ3QlUCk7UX4wYjVGQ1VXbyhQTFdxZUN8T0dabT5PSX1Nc09Icz9obVhhMUwoaSVNO0pzbXc0P1RCX3B5CitRMUNFWXRmI2wjfnkyc3ZyfXhaSj5Fe1lHd2ZWRCZufmN3PzFnclR6MDl0KTh8PTtZUEo2ZCkrMEF5VmVjVjI2cFIrc2NQUEB6UXd5KVZlCit3bng4TSgkZjg+U1lCKHFtMlBFTnhtS1E0VT0+Kmx0ckJhUVJja2RebzJ7TUpaWlo0S1I7eld+SSZHYl5JOz44cyVqJmtTU3Z7NX5GZzdxCitRa1BgMykjc3xeXjhHK25EVVo1YVE2aiZIMjMzTFd9MHg3fGFVe1A/bD1GI2NrSXBJQFJ1cVdzVmpTWTxwckcoJkVkTUcyNThfRWs2ZyUqCitaTkxkIXo2cEB6YHIoOVRlUS1wZCF8aX1MPzN7ez5KPjB8WFFSMDAwTzheT1k3eWYyOT9hRUk5eEdLRkkoODh2cDxSYUF8TmFVdl8wfldOCismZ1dXTkNBQlktd1VJYiMhVExFXnY5fWVRa1QoSGo/MFh7UitsZkZXR1g3bEFYISF0dX0zc3FiT3RUKnBebjNHcWN5eUZqU01SPTc+I3AyCispMTdHdmNMVzYxcG9tTWw7cTZwPyVpfCFCeXUraTZiZ2t4cHtoX1FZO0o0QGB9T0wrRFh0YzY1YmNrR1NHekE/Wk5zMTYxIXMjcUlLRlFlCiticnFifV5ZJTd2XjVEQ0FVMWUhbylLdl5NUHhDeEBmNEcwfUAkP3tXQDdmQCh2Uzl6ezxKcm1LSD1vWHFQRVBTNWwtbnFsdEdhMX1TKUp1CitHdWB6R3pDNDRXLWUxP0VUQVlXKHNrTCRjRVRlYk9KVE5hbzRpTVpqYVM3bSp2Pko7PU42QGg1OGducD52TVhrUjVSbihSR1VlO0d2TVJsCitjcSk8UygtLTZ5a3B4aGhKSEw4SEhrI2t3c0B7aX5pYD1kSiFGeCk8eHFSYTRKJHBARThme2syVi14ZEZWKm1uLV8rSHVybFEwZXNZcE1VCiskcilxTHw7IUA+THJnKCh7OStzVC0/Y3dxN3BwNkl+bz4oQThESWllPGpSTTJsNnVad3JBYEpze3tuZSkkP1pwU0cke0ItI2V4Qjw9a3c3Cit2bGcmZzEoTz5FeWg4VS1YPXgwVERSbGlsKiUzK2pTMFFwWE9fK3VkNGpEWnFGeSZNMEozaCVkWC1uPlY5flpLS3hRMT1FejQjI3FwdCM8Cit3QTdkJS1uK0IyPDlFUG1XIXtZRyRFb348Qj17eTN4JXE0VzF7VHx8dDlmeT9acWx7fUtzUll3MDAoN3gxd0RkU1pDWF49ej5HPyoobmJzCitkYCppWjJoRyFmcyh7e0U8N1BWLXJiUDRfMyZ6cldHN3FoZ0BXcl9iP3RpRlJgQThsK1BDaiFuQiNnZyQ9LW9CQDJRSWNUd0IhTjwhRncwCitKMFVLQ0JmMWs/Z1YxVjxhRVFaVFFaMDgwaWhmfHx4TUVmSFRCSjN6aF89M15NWkNLVXVPa0ZWayZvWSFebWRKPz5oVXlYeVdnSURveEZ1CitoQ3ghT1FmZ2k7JjlVXmwkUjN7MD5JMjNQaGVTZ0VZNy0rRiszdSV7YDEkOW8qKUA8Kz49ZDBHX1RfTEF7MDxING5yeEVwYSRqTUdsaHpBCitsKXZDKiY7eWt1fXJKPERvLSFWOUwyKU17P1VnSVotRTMmY3JMY2FAUEVqVWw5S35gbiNYY1ZNKVZaT2Fyb2BRJDF8IUJvIXxhNGpraG1HCitGVCN6M0tjQWh2UDBWKiZ6d0Zfa15WPTdyeTxiOGcxaXlSe2dyamlkYC03OXk8QVolRHMtOG1vVFdgWFJqZ3kxLU41fTl5akhYfHxvX3o3CisyN245TDFAQ151fURLYWtfZndCUEBJNERGJTtPKEg4MmtFNkN7PCRzNkdQdWxQKHFIRWx2U3MrNjZDfjw0WiUrO3E1UmoqVUA4UVJAUSluCitzKkJnQnRlTW9kTztmRFpJYjtmWXcmMTExO3ojOXYtc0d7RT92ako4NGA7PHR3PDJtNUQwPEx7YGVJNVdAMWl8RWJxKkJQK2N7Ql51RjhwCiskM1g2enV7PTY4LT5WITEkVG1SUyFIYkQmJGgyIXkqP3J7Mk5ZKGYhR2x1MmtwJlh6RDUqI1dDMmBoKUNeMn17cEJ2NmtBNUxRdUxjMUBwCislTTApbmRKVDlEZXtRUEZfTkJ8eTNSWUc4UGAyIU14OUZCXkUrek4wSU5zdTkybjswO05MJDFfOCp1aFZVJkApNjt2XnAoSEpHISFWOGBYCitxYz16KSZtY1F9OEA+NGw9JGc/flp7aXM1cSVgPj9AK0BmVUs7VyF+NntCOFhFb2ROKEZAJUR8TnFTQlpgdHxDeSE+Vz1MSGBReUcoP1N6Cit+MlBeIyF1KiZpfCQrYkxiSSFQQ2EoY1Q3aUE3NnVQT2dqOWM8IURiK0NJaXNSX3pMPjUlOEZTVmpyNXgpWmBWeH5XWWUlLWclQE18YSNNCit2RDQ3Skl7eEBAOEQkR1hidCRyNjZwcT5NP1AxMTd4ZyZWJUpzbms5KW0hUFlXdE8rN35SYFNJKiFjITlHQXpySGRgS20lM1hRYm5BSDtsCistWGN7SUY9Nj07OXxZTVEjX2A0NnlERENEYzVKTmpTQGAqQWZXfU5DJiVYSW1ZI1dXcHFtN2hWfVFKMWQmR3pTdHFvZkheTWBrZW18ZitnCitmUUtgcG1zcn5na1FoQFZpTkI0I0dYVXxCYGswcns7fm5KSWohKEN4RiQhJl5QPFl8Wkc/NDN6RGBZaFkpNEQoNjQ2bWBGWiNVO3BOay1SCitFPUZQU0pjdzhrMjtzbEB1WFJ5SFErKWVlOzUmZCFAYkYpTmh6KHRnZEwjIzA8IyNTR0BOKWgqSkxxejFTJmQxJWlYPjJUdUVePTJSVWc4Cis5IXNye0tWUz9ZczY3WW9vOFBKT3FXSWQtUmpYPD5sYi07LXJFcFAoPWtLfXgkJDt4PGF1dXdxcSF2bUB5a31NYWtoYFFmUlVCZ25fdGprCis8VGFxI1RmdityT34xMXdvb0RIfDZeVk89UmVvbSlVVFRlUUcob2BDa2RoJVB9ZDkwJk4ta1Q5RHQ0aGBydSNaTGVMTyZyRCp6NlR9RWxVCisxSD0/YChANGdjeFhnOFAoVWQ1aFR6UnxCMEo/Umk/OCVzenI9dFZ5RlUpdUBpUlZmUkNYeHk/d2xORG5LaTN4d0hUYXFaUE0+Pl90eHVWCit4ZWk3U053TUdCNCpxcDA7dEdnJn18YUB7M3xfMDB5MTYxZE9rMWkjIzliRG1UMkc2WCQ3TEF4UHl1Y1ZQYmY5ei07NllJQX4xP1EzPENOCituczU8QThyaSZ6I21MJW84Y0B8MGUpZCNXNEc+ezwwfTlydEZIYVB7Mzk8XmJXJH1tRzgzbFJOMHxUPnskc31sdz9qYWsmRVUwZ0NUNU1yCis5SDF9OHRIME44R3BgY351LWRTWGhOeFo2OGslaXh3ZmNJUFBPTTxSQCshZVFIOVRrV0JyMFBAMENXUDhCbGc1cH5VeXQ9e1lXMz1adjwyCitERDN4dE8xaFEhcEE3QTZRT0dtMHY/JCpZQDRqeDExa2smM2khbitTfD96emkmOGZKNktoVDY2clNYeGVvTzZYWWc5MEhRQSUmemQhbGt4CitrdnI7UH5KO199JVZUTC1uQkhTazg/dmkwVEc5Tk9GYkYqZUxuMVB8V1owKn02cUQzajR7MU5zPTdAJE0qKnh6ZmEhM3txJUFGLU44d2MxCitYJjZTMEozMVpWd0pxUzJVIUxkWE45SWBtRkhRVyFHTlFVSGUwMGRQQHJhcnszK1Y/V2wqTjtZS0hwJUdBQ1V6QzY3a2p3SH5EOVpGKDwpCitSbjF6WFJVMX5kcXRvRWVAUll9YUkjO0dHJXQlblJWNDJMKT1DLUlwNX4pJD4hOVYxPmtBN2ZVMU4jQi1pPjl1S0FucCh0QDJCM0RGMVFrCitwWWA/elVaN3lJQmpgMmlJMXphXnxGdXN2cGRuNTt2ZF97USUhVmFgemxxRj9aLXt4NVlCWjJFPWp0K3hfVXJ1bkFxdWlhUiY9Jm9ZeXR+Cis1MWczOGNPdShWLVJrV29BU0x7WUIySFBPbWdZd1dzbW17OH43V2xsQ3slTW51Rl89UT1eKWU0YmpwdUVNe3I2I2ZrMFAxISlXPiR5JCgmCitgZVg+YXw8WnEpTlphaW5Pb1U5dz1EbjYpUmNNJXFIYm5jRztSPkdkVSFyJmRsMjZAOzxyRj88MUhTQFE+KDNOZyliUWdtNit0X3lRKVo7CitVK1ZyM0JDa1dARUBzZ3NwY2Q8OEF+ZV5MU2tVcUooSHNIZDFtKkxBeHo9cjE/a2NGI1YwRFRIfFB1bVFHcElVZmV5VnFVM09oVHAxakUkCiswaXFLKVZfdWBDe2R5OTdYe2tOSG8rSkAyVld5SzRGa21ucFpfIVZ7Z2s4Sm4hQF5jISRpc0N6LX5NMFdOSHg1e0FrU2RjWWYlRUY4VHYqCiszP2V5czVJRzYoYHBpfUVJb241MllERCRneWM4fUJuMUJeQTN2YHZ3djJ2Jj91TlEhQyVsb0srLXFXbiZ+UnQqVH4zeSFnTTNvbVBJdXEzCitMLVpDKVhETTBoYWBTTDZuZEJ7QWBkeyVXWipXRGt5TWJ1ViZxZylyQ3slIVE/aDlDZD8rZTtuTGtJYSRTRGthe1hEaTsxKXpCQ1AzSWBBCitNO3UkWWxhP096MlQwYGVtajFEMExBKlFAPn0oRFdISmReY3RDdGlvNHBTQXFBITFUMDVCYzlCdSY+QS18NHgkSDZYUkcrUG4+YloqdnxKCisrc0kzQmh0cFZURX1OQVVkQSloNzBnOV53dTwkMFlrY2htVE5hekl0VEdTR097Z0hgVVdHWF9fRlBuQnRecF9AWShtfG48dk4kWmMjTlVtCitzNHJXc0F2VVZvcXhhTk5lJG9oVSgoNT1ZTlVJWmhJcSRXRmdPQUFBPExeXlhaWDQqR21PQXBeYXEhPEpleUlIY0AkKTIzdm5DfkAtPUNCCitxJGQwfX0wO01TamlBQU5jOHRvelFhMCEjIShreDNQMTRZLWk/SVRCfjNUfFNxPVQzY0deSnNZM3hZNzI2UzNZbl8pKiRVTV54NlpHLX1XCitUOG5ZRzdPdEcpR2BVKFU8KSVDbTRRSGw5OGc3WCg8QzRpS2EyJGM5VlB0Vk94VFd0alZnOG9RVz1SdUFhTCNfemo1IWRRT2d7ZV59JjV4CiszWn5xRVE1RyhQTzghLVF3a1NoVGtMNE5eeEswV2RfQlc4XkY5TU9YRHI/ZjVwdWIoOCF9VTgkRjgwWT1LeTA1ez1ueSNzKTAjRHR6fUwwCis1NFM/OCExMFZ4O1RKKTAkRihiR1FxOUU4dVVUbiVldTxNPG1GY2lMNn5xOFNxaFBxJUFQOWshQj5fUXl8TlBhbFhAYC0xbnxMTCV9UzdFCit5cUIxdkR6XmY7YnwyTjNlfSNEXkZ+e0J8QVdlIWtOZ0A8dXBqbShjVkB4UH43fj9iT0FeeXxOWEwxdzM+VmlgZFo0dXNwTCN8RGRXdTJgCit7e1ZTX3lAWVJ3OTFYKV5qKUdVNC1ZZkJHWFFxTT9yQThpPTtxNms7JExVK2MmdFE0ayhGSn5PUV4zUSFLZ2V8ZW5pX042I0ZBfU83MkJ1CituXkJvYj9BcElYKyVWP31gODs8RV9fO1ZydG5sVnNZamZENlBVdHhKVGQ2dDVZO0M5b0U+PzE7Y1cyJj9ueW9wNk92eSRNbHNPeGUjKU1rCisjSCMtUFIyJGs3JDNRT1ctREZYV3pZbWk1QGU+KE4xUFprbDx9KnRicHpYRzxVIXtWaHl5ZFZOQjVNT3xNZDVoYyNgdShoa1lHS19pKzZrCitLRjd2MnlmfjR0RDg2b0s5V2ZkMylVPU0zcX1DWkJ1JFZFVzlaNSU1Vk5LTDRKbmxfQThBQzNeJEpqZStFRGdXMSleVEdfdnFuNCshaVZOCitqYzZzNSNOdGdIZ2p2P0p3QilJYXVQUigtcGRmSGBqdktWTiU+eT5nOG1DKTtOSXsqWSFwRVJjNVMqbGlrUEZ4TUk1QE9yalRFWnRZOHhACit5RjJvfD47c1Nabjc/R1NlM2ZUITYpRDVkJEYhPS1ZTld5M2RuN0BseTRYSUtDS3owSDckUSFUfD96dD9Zel5sQHp5e0tvODdGTkdldipeCitMY28qSkV1bylLNHN4RFchcHVwUUpuRT02NmcreCFgPFZWV3lAO0owNz9DaXAtYkNKamB5OChfTzBlaFRSYiM+ZGkoKVhwP0VeaWxNJDgoCis+QT1iY0hJMEh4X0AhPn5mNUIhSTRXIyhJY2NUPitAO1E2MjMoaEpFQEVqNE0hezk0fCFCMVhVJT1tdGdGZClYKEA3N0hwYGMyaDREQjBICitDU1pwQ2VLSz1tfEpmMmxBRDI5U3ZSPD5jSX0oYnY4M0I1elhHNnlsQ3hPZzFXOGN5MENVamFFPktEJkdmK3hlMTJmJF4xNVoqN00zVFlUCitWP2RSLSFeSlRSZFdmSiM4TF5MNkgmb141WDxeX2gmSVY+OWglJSFZbjBqWTkydW8tVnIkNF9aIXZKZmVHP2o5UzA3JDhjcEEpJnwoS2N3CitzenxgandGIUFyZVkrISM4ZkxXckBmaitSUzVmO3YzanVIKndZRVU3ITNhY3FkbWpPXyFPcHcqTnNLVkJSJHM3akA+dEVJfGk+Uigkd0dpCitBRFRxWiNLIVBmNVVIRmBjWkViNmFuS1Z8X0s5SyN4clZuaHpJSE9vS35PVD5zfjQ+ZjVaX09XaXxkZWtua1pSITJUcTlDeUVLP3UoPCplCitLcylzVChNa1FBPmw4VHxESGRJcXx+QXZTMFAmOEZifVlZITBaJkwpZSZfcyFZeV5AcGh+VjdFbz58U29EbmNKaV9PVitmOSZBSnZIQytRCitCOHk3cV90ZU8tUF9aMlEwJWNPcH4hLVZvYkRiRzF1SVJmO0tQcShpVFl5alRFQ0pvXntafjglPDkjPmJQPj5HMHJRaH5RYjVfe0ZKI3FDCit1d2lAVlY0TmhaV0pEdmRjfkB4QmZvMUBiWTh6ITFHOU42dUdnd3Y4eGJjc1hBO3VFYSolYys9SkJzOzhCNExuPjxIVFkjbEF7biZ6JjQrCitnVEAxQGY1Qihta099VDFRY3F5KVlKTk18R01HRXV7SjZeQn0tJElse2IqPDYkPz1eNylYYlIjTTFaV09SdGJgX150ay11bWx8fnpxSjUoCitEKVYzVF9hTDhKSXRJR2AlaTxYN3U1WkQ9NWVraWxSTmFwbDxeYlhSdFN7fmAhd2pONUkhRT5abXBWOXstKXV5KGU7cXlkUnNOYXpvYXBSCitwZDglWkR5IUdjPXBVbngqLXQhUEkjKnQxJmR4SDclcnYkZmhmQ3JXYz5Ub3BxKHAjXlBXSCt0MSkoQDxualpoRnYyN1IocHl0P2xqVT0zCisyIWYqO3FpTSlPYkY3fjxOXnV9OG1saWhYdj02R1U8YzVpQjh3aWJuO0pobzxHRmBzSlMlSUZ5UEM+Vm4yRyYmbShXNkVObDZeKUc1TitfCitfMn5oWUFRan5eTXcxamBBfWx2WSEtTGt8eXgtVGteYXBrUntzO1EkPXR8czRpZlo8RHVeWTwmM3AqUFZaaDUzcHtNX0R5aEtmRTcpJFBqCit5OWtrMC1UI3MyWmFVMmdLPTc9X3NxTmBkSWNPaHowa0BAKHE9fXBRdUcoMWg1KHZEb2xManheYEt5PSY0aHlzQVRySEVefWhsMWUxcloyCitNKm40a15fO1FyMmg0UjlxVUp1fGp2MzgwRGIwOT93dW5oZygqYGp7ZkA4U1JteXEoU09vcjFOdn0zfjJUXztUS2VNTGdYVmdXekhIM0tLCisrSHJGYmUqVyNeTl8mTG41X0NvV31JakE5ejZ5THdGdE9RZENTPmZkekBndmBtK204TFpzXmIxeSheVUdtT3V7bmJ9cmpmMzYjcFcjRDkoCitFTWYwNXdFUXkhJXRqZyhUK0toQ2JvK0h2Jj10TjVzLT80KCt1fml0N2FIWVd8MGgjSD9Vemx5STsobXtoOXNSVWd9VkBYRWlPOXJoVShZCit7OytKMiE/ZTd7cm84bkJ0d29LalhfeHY4Iz47ejxmaHI9YGx6PHIxekFTI3EqK2RfK1FtY09PX0pGSEpXTzdWPFhGYTVCcXRUTEoybFJ0CispMEcofHskSSk9NVQ8LUQ1cW5aSjA7filtODZkVEFVRnQxRD8jfFUtT0taQ08oeV5fODRAMEFZRHtlZnNiR3ZNY2UjJnJDaTNYWmNRUHJMCitJPUk/Q0dVPlIzWT5sU01WNkktNjNSclRCPSk3Nz5VM0RndWlfdmZRYzlVWi1yKCkkI2Jtd00tMj8yfE9rTW5JUXdDRGZ1aFFGVnxPNWMhCitFZmchS1BpZXhRNyNmIUxIZk44XmB6ZlIzKS1tOCQqTUA5LU96YmpFWXQ0Tz1FdXpKIXNhOW0hN3txQjdPJCMramF2KXJQazEtQjN0ZT0qCitxPHRxJkdwb1E7ejtRK0U8UyhiO004SzY5dW0tSjR+KnJKZHRfdjZAMTJFO287dzg+cHJ9NlkjTCpFN3d4NXorIUFKKSNGZ1RIaFhQWDViCitpbDtMPyNWNz5ge1Fnc05edjZFWWBUPCVUV041NldtVHY2Z3JBbzdHZHJBUDk3S001bmhCM0ZvNUVNTkAzQChlLV80dTAzbjArY0NVOV9OCitBJFFhMFJ6KXEmUV40PGIzaiU2I2x0fU5eS0A8PlQ8dXZDOCNgK1BDKCZ0aDlCSjA5KndgcnApTGlUaGJEMXM8ST1UNSZGY1UhcCNxeyZtCit5Z3ZpWDRNPXdfbSRIYEI9I1EwNW9wTFBffW1VQXxuazdfeGRoUiQpYn15amkzeDNoUV5PQyZ9dWJeXlhMUDt2ekpzTTNaQzQzM3w2PkZlCit7aEI9LTUxTSlTZWpfN0RYZEAlIVdYUGFjPjtBLT1mfU5qYTM4ZUpNN1Z2VClrTXFXOGFrPWQ7YD9NWnlwNnhRa2U9cXM5czE9bEs9eDxICitBVFY7WnlrfWooZSRWZUJaVFNoI2h+QGpFSj9UYlY1bmJhTzJkJWpJWnVte0lqYEVMTDRBPDNXJSMwfk9XK2Zee20jKUtTcSZWUkM1OCtgCitQaEQ0bnIxTCMhJmgqSGpHKDM9VHl6PHI1c0t2eXdtb0JjNUJ6eih8TmxaTlNFfURUKC1+RlZnSUBJKHV1JWZOZmkzdm1QXjJPbig0QEhGCismMEpKZXpydDwqMWhXKEZSd3ZxPWhUWmhlaGFRRmQkXjJlSTwqNF9he0twandRKjwoOTxKVkdqZE5GNWc4TkZUP0lCRzFUR19NUWo0Jn1UCitAVEFTUVkjTCFjJVN3KjhYWSFNRzBtbSE7dEVvcDJHMklLPntnYTxMLS12N0xkPSpsZ1lrLWV+ZXdCbTNXbjZuPD9gRk9ZRzRkISpGNz1DCit+K0RpbX09RzJUeE9aS0wmUFZnQlRYM2BIeCtjMzJ4USo3WCV9P25NI2IhIVM4TChjdlg/VUB9fjwlIzwpKXkxXnh2cHtYbUI7aEVSM24/Cis/LUFXUEVvYnc/Py1BJDdFK1pZNXhjSlJtZjBqKHErJFc8JjdfTnw7VV9TRzRuQ2ZwezczS1RZWkhjYW09Xm9+bmh2cFYjfX1nKWVwd3A/Cis9VkVLMzRva3pEaHtfPz5kTkdRb2QqfF41ZSVwR1dabHNTWlEpZ2E3YERsV2ItYjhyWnpXV0pLPS1+M2AlPlhiIThgcm5eYC03OGpqIXE5CitvKUBjK28wRnw5X0dkaCRieGR5JUZpVzskaXI0fHA+VElHfkhNTHR9NUImY08rPDhKSVVCdVFAcUt8Pz5oPXMkbmImUyFYN2FyQ0FRdlR2CismUk5RMypPJmpVfTc/RF9ETkJmfUk7KTItRH47bC0xfWFgZGVlI1UmcnFxb3JlM3VQYXpPX0NtYD9xUkxFeVU3SFRKbjNoMXNrRFZ2JkFiCit2M2tVSmgtS3thdmExRm9ock5qI15HbG55NigwTko/TXJeVmpePXlPSCFhYW96dFlaQiY9MTQ7e0dIaDM0dyl4OFhwaXtjSzZoYVg3bEBQCitmJH0mY3R7V01zdjchKUtrMkhNYll6TlpuUWxnOVUmJn1kYnBPanBROWZkZVZRQHFfUW5pYE4/Mmk8MmFMRG00byN6TGA4d2l7WmFUdyFLCisldEQ3eyNGIXw3ISFEU21LIzkwMSZgTy1eIzIzUFYkZzgkLVl6cDAlVkpyfnw8eCRUOWdJUDJ2ODlaYFMxJUUyNHRpQT15Nk48ZSorSkYyCiswP2VYIXFaX25OJExJQUkqeDtQUGVqQlFEWU0mTG9rYUpoTFEpPVEySXE/cXsqSktqIUZYLU95eWw4bzw7QX5sbXBvPngoYjlVcStAeytWCittbjhjaVJUYlgxKSZDQTJXcXVuOSU1c0hLWTZ3WGBpbUQpQ0ktLTNtWnMoSjFgU2EwSVUmIUk0MGpjKyFKMntReXo8PnNxd1ZhR0x7QmBDCisrRipZRDtiMkVRI1JoQzc3dWNyOUBrRzk5Um0xVEpKYVVeQjthLTQqQjdTVVU9aEIlKVhYVjliVCU2eHZ5NVd5c0grUCMxOEdfai1KSmB2CismNTBPSCkkaUhARTw1ajZieFA1S0A1R1goYE45TnhGP2AoSkwrfX5oTU9HbiQ2Qz10eFdUWSlpMjtJO29WT3V1QCNrclZPY3RfKDBKSTRlCitCQDFQNSgrVmV5dGdNVmgpV1kmbXNGKWkkM1NoWEthaHxyRG45KHp8KXdRNDxNJEBnTzQ0PEIzT0RaNS0jVEpqIUx3VER2NnxpbTtleWpPCitMTXkqfTBiK25pQTtfYjJiUWxqSmBjYHFPVXd8dnM7OURNfGxTKl9PQGVINTkxdlMkUmV2TXgjMzVaPDNFZiZjPTc8KCFFa2BCPjtRaj5tCit6YW85O0NKMGRpPiQ4OH5kPUM4dn5gVDhPVkoyME5DcnFETSh6VCZuN1pIcT5ObG5SYiExd09uMkZVVl49PD5+bUNnZldndS0/M2F9PHBwCisrcDtTcGVWKXU7elJQREs5YUc5N0BacDhXPj0pIzNDM0pEYnZfJiMrSU5AdDl5X2ZwcWwqZmdBeiR1Z0YpLVNNRGszJW1NYEo8X0k5WW0zCismNDJgYj9YXk5xdDlzVF9sRi1pa3tXP3w+em1jI0t9PVlPVHBabkJSaT9KajYtQ2c9O08+aE9oTEx5VXdzVlF0M1U4KH0xVkNUTTBkPEFUCisoKHorNmUqbVdyKENeZ19RfTY8Y3o2Y2J+PlptVTdHKk1XMldFe35ZKkpnfjc9ZGAobzBuPEloVHlSbld2bFgjbjx7XlQpZnI7UD5WRCtmCitWVGl7OXcxalU/Ryk+cDlELWc0WnFSKz4+cXs1PVYxdTRPb1RxJkNGUShlKilKbHY0RzNBazlsbDVDT0grLW5WWnooblE0ZWw9TXxRUmQjCitJUiUoWGZWUytfMzwoeXllREh4eEZSP2w0KG4jRFkzI1d2JnFYVnorK3ZpaD03I29+ZGplVGBvaS1rNSZzejNXK2BtX35KSThyQz96VzA/Cit5Nj9nYUR0YWcldTVoWmpJXiZxWmxyYTtsdGNrbGVXSkRLaXd7Y2JpZnc5Z08qTVFrNTcqTjRieiVeZUVaPWJkSGVDKDFRVForOSh9WU8xCit6fEt6d30wQip7K0h6OU1URDh8QE1tKE5BOHZ1a3pXcjF5cCN2N2IqdUhvJVZxNS1qdn5tMCZYWVk8YWBZfncyP2JVc0JvfUleVSZhKmReCitNMiUwN0E8cmMwWSlob1IoOCtwcWZ7PV5VckA5flRAcF5TNG1YQ2l6SE8/X0FlK1FKMEdTejJpZn5jd2tlSHZUKHc0QFF4MHxafURhblkxCitsRSV6TT5ULUhoZFdtN31CRGlrS1pHKyt2aHdDZntkNjYrMzNedztVJGw2VT9pWCtzcnJpKWZfbjtVMiRrR0kkO0VvX3wrcDFrJWVleV9ZCis7X29UPzFJPFlKYnRAP01RNUppaVJiZiEmdldmQUNYTGU/V3ZmY15mbmx5WTVzTTltcmAjaCtXOFdRMnAhbGEkNSVgZEpvSjUqXyk+eitkCiswfHcyI29kakZHblVhJk5LdnQ3WlhxYkpFdD1+cCshVFd2e0cxQVdnZGN6NnVoI3kmVnklWHg5fGcyKjhSSDRwS1REezVAKE82UHk2fCU9CitlSSRPXk52em5KfiZnMj8xK0goPiotKDQjUnd+b0Z3PnYwTUEzME9WMyRPNGYzJEtZK3VIISs1c0xPY1NtclJsR0ZDQEdveHV8eW4lU0k1CiskMEFUX0d2RERlJGArYWkkODU1U1pTLUhUfDZHPlohXyNsZVY2X0o9Pk88fStDMiF5P3F0Vk5GY2ZgSGs8MDA1MU1YODRhbyQ3MVhEQCtiCisqXzU/WV9wfG9VPil1N3tXJGskU3ErbFUhWjAtTjdhTz5AOFpnN2ZnWEkxZWRraSRWSytjM295Y19TWSR3aUFzMEV4ZHlAaHkpZUNgbT98Cit5OGJaRUp0LU5OKCs+PlNEbjxFKDRsQXRQTntLSjkqa2wkKipPSXRAbl8+VjZ4QVBeSClrSVV8TEhWZF9RbGs9bU9MeEI1RiF6ZjhLOF5nCitgUFZLKldocEh0Y3JqbzM5aikpXnRyISs8Iys2TUx8VnA0UElBaEJAIXVgPX1SYTQzOTlTJlFmPD02NGg5QmteSjVMX0AycEhRd3ZkS3RQCitlJCUza2lGMGEtSW1WcUYlKGR0REIxXypee3pJNU45LUcpXyU8blQzcTtFSWl0OCpveGo8JjVscmphKz97YlA7NUc5emltJHM4NkwhKmpWCitDUmlAUU0xQnElJVJDc0NtQWsyT0tMPDw3SUljezY0OHZHc0QpMCY8UkZrdjhnJFh5dE1wWipKJWU+QDs1RmxfaVV3LSpkfE1FfDlATGg0CitvTHFjWGBaUzRQVk47NEE3d1k2d0x0Zj9rfjE/UCM1Tz5SZmFNNH1uIzFjbXJuUDtNSmFzMDVgcmFNNDx2V0MxKWtrMCV+cnpeaXVxMz4zCis8NmdkWCFTI1VzOUs7X2hINzhmUzlZYVpzUEN7MDxLcDxyeV54IzktNENsamYqNzdlMiZLb1FtaGM+XnVuQWlObGJZYT00Xy13RjQrbyUoCis8IygqVSUlYnYrRD5hRVpeZGJFKFpee0F6ZFIqKzhBNjhqUSZXezxlZT00NHBec0soRylqd3E4fXZGYjBIbHRGb2ZlRWY3dGJgKUZ0OSY8CitNPXJ6TXZYI0RSNCg+KmM1WktQZmg1Xj4yNkd4JGBrbUdOc0BSZFcjZzRWTyEmPFRmfEgrcHpqa242YGcxTkVRVjBZN0VMRzN3TlhhPVUoCitraWtUS3BvNUVmKjlXWnt7fmJIU1pFUWFta015VCYrcm9MTVRQb2dRQThtWCkoeDZqbHhKYT1DNEZUUVhhemJNYkMoOT4wMzNLTC1sRHNQCisyZDNTayZvdFh9YDg/aGtTMzdTSGFRVnUzaVBqRGxFVEVwYXc2d0p5aGxGPiNATmdLNkxEbVdsKnJjUXY3eF47UWFkJngzSDE9RzQ9aS1eCitrWUJGe190eXdpN0I+RkNFK2FNRGdhQVpEPUhBKFNnWEpQWHZPMCVnenwyVURlbmg5RnE7dlVlXko2QXBXbHczSHpgbXZUP1ZKWGN9MWAhCitfang4Tmt5V3o0Jm5za0Z2d3BBcTsqQEZSR253NmQ+cjY3eFlGU3pXN0h2JHZ7R1MqREk0Zm8/bGlMbTlAV1dpVz93Uz13PipqJE80JUoqCis3Y20zbkY4cW5SVzslXipoXz1uT1hEPCFuO2d7K1goVEA7bDJXbSUlRkY4V1dYZnFGZVY5SWdNc0B8cWk3TGFeSExrTX4lO2c4ZUV3UjkzCis/RXh1T19fKTFnTnhQQWktMjZ+TWErPGhxWDBeKFZZdHRwY1YwSEZLejMxfSFAejc5Pkhidn55ciptSThCen14UU4yZmpmU087QzFsTHNOCiskaz54SjU7ZEU7cmxFJj1vd1NkU0dIY0VCVFV6a3FoTHZhVzY4eFlCS3ZSI2whNHAhPys3PztKNFNZS2o+bFM/SU85bHg/Ryt9emwoTUF2CitVKkhaQCVqYnl1RFFgMz4hVmMxNmUxanFOJE50LXJzYEdQSDRaOVpuOGhGfGZZQ3F7b0o+M1VhTTA/M0M/KmFze0lpeGZ6P0dTezxSaWk9CitpQ29vWDVSZW08PHA0MUU/e1NGcHs9bEtsR2FCZSh3YztUNSM0SG9hZ2lpeGZOejllUWtSPHJQV1p3QilqUlRaZFpZVk80Wkp7TGp2bzNKCis1KjdAJkVgT3dCQTdkKzR0N0JxPWdieTduTmtAX2FmeTB2SDA/bExKZiFpOEExT0xlMTh+aE5Odm1HWiNnQSVjYlBZWV8pUCR+QT1KVkY3Cit0OWUhbWZkUkgxO001YiY2I1lOTnRWJndeUn1GRlI2bioleUhuMmQmb3F9MmolKmJrNDR5PS1gVVhyN1pYK1NlK0tTKnpxZm9ZZjVVbypRCitZanFEKjk5cyV3P1MrY3lsV1cjdUhyS1IrUko+cnJARFkrKmFTdDxmYzJBamRRKCZoQDMmOEBCTFRsX1pBPnRuNzhZe20kOHgkUUJ2SjxqCistQSM+eHUkb0tAUHdoPkpJSWUyNkpFTmhIMn5GJFE+WVE0QnpreDlZJmRITENpZ1pzU0lqTl9zYCRMZVpPJGVWbStUbT59SEhiJChCflZaCitXYEZmcCtYNm1EWmYyI34yZSVvaEVYNSo1eXxHY29ofCRaQjE4PjJBSlM4KXJQKnMtUHp7Wjh2VWhtUC0jVGpzb19jV3VKRyN9bVE/O0ltCitiKkAjSW9sSD1kNF4xUz48VUZ2a0w2ZyhBRFklXl5aUTNrKHVLKndtRj1KY00kNnRNei0jVlV6bVojIWMpIX1GUkZGPlA/Jk09PnVYO0tUCit0am4yYERefF88KzA2VCoweTlNQD1QKjZUZG54YzRuTStrMjVYPkN7VjV2LTBSbUpHemQyYmdQMHo7MCRzeWh6ZXR6Qis/a1RUZy1FX3haCitmJFVlKComQygzbFMpaCN1cjNrT0FnWCp8PUFvVHVgcSFqfn1DejY8Z0JvLU1ibCF+NE9udlk9ZGN7fHp0OSVOeGRDSktIUVdHPzUtdXVaCitqITw5VX1ON3JrYXhtZjd4QG1GJCNFSCM+WWpgRFdsfmEkY0ozSE5DIWdOfUpyPnpyOVVAZ0tjYCRiO0prTm98JjFBUT1OeEs9Z1N1cGRoCis0NGRNbyFRTyVaenlualFDN0BXNGhHTTRqSHYlPnM+OEVXSSNweFkqYyR2UzxQKjhENm9iLThmdjFPI0tXPmlrUz5lcEtqIXpJel49WHVeCitfPSQoUWk3WmRmd24zdGYlb2tLTD45I2VRQDA8K1RUaG44LVMlTHpZUTQoQF4+QExQUlgjYnkpVnpILTdFSDtOJTVNaT5gKFpzMUtKS0lzCis0K0JuYj5vTD5hSVh5YEl2eDw/M2EmPH41cHxuWkwhODM1R1FYJVY+QGwpZWRielJsQm1DfHsrKHR8MlFUVzdXWE1DNnxBZ2poQCl7NURpCitSR21IZnNAcipRPmE3e2ozPTJ9bzRtMylWdUhfNkUyTGcrYjdPTFh6eVF8YlBxeWgpeF8tMXx9YjdUeUZSWVB1OCQ8QUNNQ08hJlZuXjhTCitjenZKRVh5VH5kVEh2JSlCZDxDc0QrYVpJRXBAMk81eUEjQkhkZTx+KUVSbkFYTDZ3YlJ3P3BhZj1qMWZ8TylsaVk+aXdRJmJPSEYla2tsCis2WDVhPl9SQ2xeZHsxYkQxTDI1Qk0+bGAwPmF2U2BuRjYoV3FhOGMhdUoxU1N0SFlQVnFTRDs0ZG9oYGArbjEoS2RCO2clX18/RChrK1pMCit2Nyo/I0BAfmpibn57akU+P0x+cTtjSWA/Y2xHU3YkWGtaVDBNWEQmbEUla3B2cnAlM353OCRtbiU/M0xFQkdzc0FlfmR0MVExdT1xTD9zCitvSzFJKUlvNHV3VX5BZnleKTAjdjllc159KnBKTHZ0UkclQT4xdHVHME51LXU1RUF2c1FRZTNSSU9GOX1oIXYkS3o/UFpjJHR8N2JgYnIrCitVbG9kPW1qSTU8eVFZZE9xWmhTSnVJX1AoP0N9RVBwP0R4fTN5RHgobWxpO056YzdVe3NBcV5lMD4qcWRqTDRsaUBkZGFZLW88RnltRXtuCislcms9bCYjWEJ0OGxtfXlfOT5RKnN3Y0JzTiRPe3l5Xm9nPDJyZW1NY1FocHc8bGQ4NlN6JEx6ISlfaWhUWGxYTCV4TXdAa1h0OX5pZDhfCitzMT5NZlN0N3s7NlNrJldEcCUrYT9FJj5gPnA+eWBvRVpTK1olU1FRbTZgYTh8biVNKjhoT0ZnNFchSj1Gc30pcjA3Q2ZCKDFsb285eUdhCitmZHEoPWZNd0hsKjZlNXljPHFoTzBiQUpVQW9GRWliekZBNUA2LTd1UCMwbGI2KWxkPjUqJVdsdTtrdylsbFpBODtGVVZrRWo2bmlSTmp3CiteUGZKKlk4SFAkPWRmRlFvPWhMeU80bE9fM3lWRE1fTTFVZ3MyaTJELU1FOz57TWMpdDBuUEgkRDA3eCVNPXdAfi1hYX53SndtKmYmKD1JCitzKytQb354fGhZSVRUakJRO0MxOD0hT3gtVld0ejwjYkA7YSFEcyRkTyRZZHpHMyMzb1lGdT1wXitwcHA4em1pSUNte2NQI2VGeG5JOT40CitfQncmUl5yemxKXjRCUnNEe15OZmhQMyVTQW8tLTQxMlMlRlQzLUF+MWVRZlJ9VXREb1N7Q0glUXZsbyRse19HSkl2O3I5cDAhSnAzI0s0CitNSEZVKiNQYD5HPGo9eTZnbk1VakZuLWVXIWxgOypmNiZPUjFXZHs0Y2JuVm17WHIoTDlwPkNTQkF1VVY/fV92U1dFK21iQCZeJTNgY31pCitKbz5CRWokPCEmbkpRQE9ENHZ8Skd6SUZtVFdMTyRVSCNlP3M7Pno1c2tZKWQqO2R2Mn4+cT84K0o3WGZseXRicDNPJWA5eTdCRFVyZGsrCitZSl89bHFfVnFLK1N1YihKZzkyfnMzNWl2ZylsdFplaiRnKklUKnImKH5wQmpnVUsxdz8pWFkxY304KFZ7e2tfRElTRTI2KXRUZXZWP2EkCitsZ0AxP1A7Iz0jTE9iWnp7ZCorKmB3V3oxVjwlM09MNG1PRFpwNHVrUXk1VXlmck4wJWtnPGVHNmtvQiUwUXtXbCNsWnpTaWhOWSk9VHJyCitWRFh0JmxlKCpHYDJuMnB7dWB2S3BjalhzZFJue09oU0Q2bitTbD5DN0dIQntZT3JsUjVwKUtmIzYqbTMlTyU1e0FLJUcwU3AzYXsqVXNHCitxbT09eyo3cWxeKj5VXnIjIUZGWFVLfUhzYHk/Pn0mSEhHeUd1QSt1Uk9XZWZpSFh6eHVLfW15VSlSMzgpIWd6Yilfdjc/aTFGMmFxSjV4Cit+WTt2X3RUO2o9PStjanlvJkdHMyR4Nlp4V21NMFJMd3Z0MkJuK0FvSj87fF9ZViYtc1RvNFdaT1V6USFqeVQrSD9aTng9bl9MJGlgSWRICitTd3Z+RVVvKm47ZWoxOVpYWVVEdjF8WW1qXnBvXkxwT0FERV8xcTA0V0FEOFJ2QTxNRjVIZ3cwKDJ9Si1XQCU8Zntjfl9CUTx6REBnRTRKCitMZUphKDwlSDRAND9eTXReeF9PQlFtZzI7K0RuaEded1NpWXc9b1kxfHEpNiNCel9oOTJASlF5TD43OTJmPlI2VkxiMFJaVkUhYDVtcD1+Cis1M1h3Kl5LWFNkSE5DLXFOOFFmaTh8cjBjSVMjNy11U21Wc0hmWD9mbDJmPn18YCFHV2FBXkwxSWVwPENSUkpzczdqJCswKz1tfTFaTmBmCisxTU9XITI2PjtjXkp6UGIkP21WIzNPbUh8VztiN1gqZDwzTGNCI0dIcDtme1Bna2dqUCpmVz9mIV49S0gjNH1neVpsR3t5ekA4Yy1MY0QqCitXTiF8JVM4bncmOExybHtDTT1Ja0t0ZnNEQT1udlgqdD0mNnlBNkU/ZDklbmY5SGJWRGVWSWxERVp7fExfK0JOVCZScjBHaTRabiomUGZOCitPM31eNWZiMko8d2RLfj9TcDY8OSkwTG9peVlgQz1GO2huQGIkOGQ4dk9zT2wwNF9Je09Xbi0waCZYPmVrIUFjUChtUnNgVG9VVzN3PkNvCitEYXxhI180OWJpR1dDaX1RPE52TUJkKCs0YDxOO184RVNlNnp1PDMwSmcwVnFUJV5IZXwpPmxCeG5tKFFJREdzP3FkNHRCKD1AKHF4TkV1CitJdTdKV099Vz5wd35wNT11dk9nUXoqbGFKQ0k5Q2RRbUxrWCpgKUpVMFp2UUt3bU95ODEqTzJ1LSQ5TFUka1pPRXpUVV9+czAxSnRwfktwCitYSDJ1Umx0IWRJeyFxIWc8ZGZlb3xiQUZuTlJMaipqYyVGO3E4cl5Ud3wwdmVPTmVmKEdLPFVAUGJiZHQxKypRTHF6ZT5ZQzM3OGhyamA3CitDZThCJUk/aVc5dTFAbD5yUDNBSHl+ancye1duc1glaV9Aazh4KTFhPylxdF56Ryo4TTU4KUhuPlRPdj0pYUNVbj8mMkxEZjNNMnJkQGVeCitkeW9FbSZAI3xqRkhrYXd3d2FUMzIlbz4oZDtWZVhgNig7X155WjNnQmhwPFFkM0glMkAmejU3eT9yYGM+MTJ4R3hBNHczY1hTRmBEUEMtCit+aiswJm50TCpZJEBlaWZfTjQ+YHNjWVBYaz9FI3VqMkNHTjtTUnU3LVp3KylhSys4ZDMzYzc7QUh+dD10dWVEWWhLanUmRnY8WS14KUBsCiszcmVCdDZkIyVrSj9edW1vPUREaVJ4bGhpdnYlQjNhR0glU01aa145a15ZVkJ4dnIpYHp6eSp1JUleZDhgSzVHN0JVNTx7fWErZFdGSVFXCitmTT9CfjdZLU12fiF2amswWEZLYVBFOHZhR059KCRCPE1sTT57Wl8tMlFSc1o/Sj9MaSEyK1B9WjBJbGFNRWVgfHB4SnlnJk5KSkA8WTdiCisyUjxTdU5QYVJiOTYtfWB8bDMrfENwUXs/MC01ck1XPjshJUplVGc9alk+fUZWNDVsd3w+RHR7TlVHJTQjMD1RKCtfWFlwdmx2TkdxP0kqCityaG9iUVYoYXxaVShTRH5tajZLflliZFMmY1hIKD1fXm1UNF5pZlpJZH0oPz5SZFZETlU0OSpHWklKfjJ4bjh2fCRNRU1Ce2B2Q1Aqdk5DCitgP1Y/SmI7SUBxKXpMZzZnNmYqZjh6N0wpXmQoYlc1Nk0+IXJkaH4yLT5zaGVHZ2tJYE1SYSUxUnUhMWFvUzkwO0s4e0RqZXJBZiElaFUyCittamJwRClUPGExUTZuYDx6JSE9TEdEb2JjRTFeVStoczxKe3FycXU2YFNYZzAtY2s/NG5qdCE3RSU5dXM8fSk0U2puNldEJXNPLXdXS3ZaCitwTmklN0hOV2FfcUZMPnZkd05IOEw+ezZzOXlTRW5oX3xAYUFXb1VlRld6Qy1kJTBHS0E4WHVqTC1YKFBeSzJGPkhMTkh7RGYlS1ckaz5OCis4YDc7YlVPO3dKe310MUhYOWdgZXhycHRZdUludHEqOz9AI1ZqcVFOMVo/X2tecFgyYnw4cyFtbC16PGA7QipOYW9rJm9iekE8YjlWKCVkCit0enV4fCNLVjEzVCtuVHQ0P3ZYUDsqdjhhPT0qRytSe0gkaERYeTQ8VG9FMm1NRE1KZUNRb1lKTDhLNGhgTEJvUSZZc0MoeDRhM0FmVyswCit1ZWZWSyFteyV+TlgtUm9eYzZOTmF1Un5ucXtlZEBtZ1A4P0lGb094bT17JDM+TCY2M2dYN3Ymc2NEVk1pX3JMKVhWT1JgYWB8ZG5mSEBtCiswRkVhI2wjcShaQ2Nrd1ZBMnRCaHh+K2ZHSHYqJS15RVR3WCFQeyF2Q204ZTBJVHVKfl4wakN7NEs4OFojaTF+VzxwXnh9JiUkek9SYTZfCitVNUtCZHBhRDlrJEB1bj5FR1gkZVpGaGYxTUV9NnRTQUlzNDxyKD1aKiUzOUxld1VJKGZAbHpwXmZFNTBpRWN1Knc3Pno+SVVsbitYTjd5Cisqb1ZtRkN+ITMqeU5TJiUwKCk7SEJteGlyPkV+SktmcW52emFpfkFWN0ZLQ29qWXc9aTt+cCFnYVk2ZD5QYE01P2RYYSEtYWp9d2dDK1VqCitLT0xTTmVFV29IPzUrUnQ9O09nSzEpJFZ6bGRjalRrX2k4aTxpNWBOX0NXY1FWQUY1ITxuVm5vSXVyZnY+NkhPOWxeQUQmU1JTN29vZ004CitUeS0kR2JIP098QDNAandNQ2w+Sl5HSjxBMnMqKmgyRmg/RmRNIXVTSE8+c3k5NlJ1I0xxaGxCYXVIZmVnTU8keGwydG1ZVDN4cyh4VGNxCitrUlkmUnpNa2w5Ry1HWnNjUG83TVUtS2d6flFycm9SaTxSMGVDOUA0VjEkX3B1P1MmQkZnNFRwaTlwND5GdS1ufjZkUENwKEZPbCFOZCgtCis3MWpYcVdeNkMtX211R0Ntb2M0aHIlOWw7fEo5YW1tKj9JWk8lcmd5VFE3SGZUJkVqU3BfMmZPWGQoXmhnT29FWT5ITWViKGsoRW4yaz5XCitpb0B0S3hHKl54OEpRKnA3M3ZyTi0+XmcmZyRETGwyWktpLTZ2cCRafnRgQ04ye3lrVVNfSTNxKl9+UjtYQlVlNWBCfTMrPFkqNlhAd2VxCit2OSt8aHItKXM2djM8SjdjMD9OTXRvckh7dW9xR0Rye1UodWxgWCtVMjVOek4rTXp6bVU0aUs8Xz5eJiU9YHtfeXdYI2JTMG4ybFBwYHJKCis5SWVPVGM7ZEJobnM9e1EoZVlgcnN6MXVQOHlsdkdUP0xqKGcqOTNfPVdKT0o8VCQ+WH5RK3tTblo5YDRTJT1VNWNSc2IoelFWKVJ8PHotCitHY3BIcGNKQ0QqX0pDKHNBaXhXZ28pd1h4dXN2ezBTODtePmRHeTkoJUcpVW1wKk5uUVA7VkxfY09HJXZTd2haKWI/SlM8QzF4aG5XbmlGCitCVTNOKmZqS1YzNygoXzx+fDNZK1ZXSF84czM/Rk19RDBudl5rezRtKnltJVBENHl5MmhqIzFRQiZMPDZ4cEJ8MDU/M1VEYV4jRnlPPDJUCishdk58RU52Q2BtYkpPTiRNS0szaVlZcXtieTR6dFcyTnJ3TmtQK2xGS0h1QkhneitJZnBuYGozJDlObT9AM0Blc2ZIdn5MUEd+PGZwfH1RCis/Um0hOHskWHYmRitHeH5lT15hNGAoNHAhQ1NhQnpkOTUpT3s/RXckJnZ9azAqO29GZlBlT1kmSnQ7VFEzXn03P2dNOWs7M1hPfDRTWXAxCisxRGBGclpiX3pFMmpRNTYjckdoQkdPTDV5JVY4WHUtWHw7Vj1aSiNhaloyPFA2JFRIcCF5fU9zMnt7I2h0TyFBNmk2diMmVy1TNTdue05qCit8WjF8IXkmUHltSnJ0cTNCQUFPcT5jZGxqUj1uU054QHxLMHNoMG1mU0w7U1pTTC1LMUJFamlBVkEzQHx7WGZxMD4wd3coVF8jKkJ7JE97CitWP1EpMTQrNzNOaypLTTJSNnkzZEJVTUxwJmJSVG5qbmBUYGdiJEROaDFyMkV4KkVid0Q+fjRicmhGR2gpWGE8ckdPc09oNXJ9Uk8+aT0pCitKb0EzJExlI1hNQ3YxO2hnIzZnI2I8MWBXdnAhMmB7OC1SNDU/ViYkfVVESSRiQDE2KmBsZFEpZjVKMHdyKEVhJWRsR31fQnd1KSZlSzFDCitjKXh2ZXlmM3IqdW8qQCtFR2w7dEchc252YVdzM2NFO2NzTVkxYjgrMWt0TjtASzRIYClyN0xsVWhgN2d7JVZnaVdQO29CJGNIamUoekJqCitRMnwmekI/KFlFMnZmV15yckArUkBQNHNHKUZTYSRXcVFLe1VYOUwwTXBNYUpKS1J8eDE0Mml7Yk9zSWJtVGVBcWpLb3FAI0hWSUJgKUJwCitiJEF9fDVZOGJBbyZNdDk0eVM8UjNQYHF7QU5Dc2AzUSV1fipeOTNNPX4qYV8yZEFiMGxRbnx8JFNFcTI7NEteeG9ZeEYoc05pKjgodSkpCisoVS1oeVUtcytXaS1gak4mMGdFSllJe3ZjPiZGYjQ3aEQ/STJvYzhjaDV5NV5zaHxlYWd9MzAxOSkmaFIoKTFAMjB6K1YrJmt9VnlUaVlzCitiYiN1OVFJbjgxazRSNHpuZFBnZnhZUztSeGl5PFklRCFRcDZteTgmJk9FU15aeXArdlJlRXZVQCZkcktaVjZgXmtvVy1OOEpSPG53RE1iCit0WjI4ZHBVdHxiUVkxTEM+O0V+JXdTMmQtSjVQMl40U3hJeUtZcShwJnstfX1NTGtCZiZZVEl8KThUb3JaVks8PjteJSgmI3dGP09rIUJwCitHT3hLLUZ6R3dybD1peE9sN3dtJGIpa18lfHhobTZwailIWldaNC1AU2VUOSQ3Zzk/ZV5BUzV0akZ1b007YD1oLVhqNF9SJWkjRGFySW9iCis3eVFvQD9BcGopMmYpemsjLSUjYnFjKmA4QDxDR3dtbDdNYEg9JVdEMkFkYUEwb0crQWs2cGp6YVlYMTQ2SDJ0fWktVT9DS3JUPGlGIUMpCitGJmpWS3M5OV5tfV4/S0d2PWRlS25VKDVLS3xmZD1KJTMre2k0T1hiT2FfUj0tdDxic1c1X1pfIUNXOXQ0IyZHfFNWSFJhUk15dTlMdnpvCitoSndUTTw/SSVVUT9feUIxMUUqZChTSjVWZWhkJGpfemE4O15aV0swZlIzdWd0Q1dIalomNTRWS2E3MWhTb0pFTGx8YFZSWnFXMVVzZismCis0ZUQocXpJOV9ebVkybTZ2ciZiNldiRVNCPzNteTIxY1prb05FPzt2dmBoMyFHe248Mkg9VXslezx5QiY5MFNaMXhNdjE5YyVVNjRGa1d3Cit1NGBDNkFAMSlzO3dxWFlkeVV1clhWVio3cD9ZcyZ7IUtOQjRYMilPNnB4R1F4OX1uS3VZS0pMOD17dGlSeDc1OHp0XmdDNVBrQ3RzYSUmCis9PWFHcXNKP3FUYHA1c20xMlY4RztPQFU2RHxURmFLSEQmTmFAPVZRM242WmQ9cWp7JU9GJnt4T045dE1OJHVXaFJOO2s/cFojM0wxU1Q/CitoNitAVClHfk8pJUFHK15oXlFvRChvcXNtcHNVWnNkPjFmUUQzT1o7fEFDPiFSR14+MTxOYnd2Sm0rRjA9WSZZLVlLQlV8ZjJ+TSZ2fntECisoSWxRJWNnaDluRX1+Mzd7UVNkan4kMyRmWVhBR0A/KnglcDtIanZKOC1lNWJPJGJlRzNMT1o4cD50Jj1vfjxLSEtaYlYjdmhBXng5KnJ6CisoN3FhVHtfKWY/PWhGNDlhK31uKlBCaCQ4MkNNUHMyMmdfc0spdThEKitXR0Q8dFhMVmE4aD17TmdhdkIodkNKclFTNlA2aE93cHhRaTJ5Cis+Ti1SN3R1R1RVKXE4a2IpJEp7N0dUUUtHV2JxYlhkeShONH5zQWN0O1pxeyhpJDhOIXF4QjRfSnN1ezBAQEl9MkNKfXhuJUNPQXA2Y31FCitjdVZUfXBRTyhifmhZdC1ve1QtfjREbmZ+RG4hNXxUNXdeP0tgKi1Tek8tMDIxYTNtd05fQlJkaCplUSU2O04ldUkyTzFpanw0IyljZlByCis5SUZSODtGeEcqekdyelRVTjxWM2Bab1kyMGZGTjYwVTQhZjM9ZFFhJlZFXmZySj9neFoldyFsJTdqdSQtLUVeYFpQYDU4JT9sbXxrRC1lCitsMyQzZW09PTw/KUY2dmw1YVB7bCN1d0RhZUw1dkhmXkYmKnQ0dEVNcCFnK05JZz8rcz1NaXApTFIoU0Q7KGdsJDcwJTdkdlhCPkdadThnCis5aGc4eUF7QS1FbzFtcl9wYEdyQjR6Oz1aaF4pdi04bTFqKHM2QmJHP0BBYSVyZmhSNEZ7QTZUOXRVbjAyVj5OWUJ8cFN3M0dhbVBqO0BWCis2aF8mbTEjMFd3NXF8Y2Y/eEMySTFeYytAYCs0QVZNTnxFUHQzVUhgX2lYNSlHS0hXU1Y7TGlkSXF5QHMoR1VfX05faH1UeTZxLVUyPio4Cit1LXgrKk1hJmhxYFNhKnEwTHMmUm8qV2J1UEBfS30ye3MjfUlNbWZoa01wVnFGbXk3eURkYkRlZTxzXypVV0FtIVY3UitxODQkPVNPSUFpCitXZmszbXJjeV92bGIyY3FpIzduUmA7RkJ+XnBvbFpIN0NYdDZELXRCRzF9YW8yRn1DO3xOfFBVZUd6K04yJGB5TWt9NVpxYCpMYjhnRjk2Cis+fDs+bldkfEN0PHNxazRXPSt5dD1uJFZKPUdPRmlQfTkyQWtnXnwlb1did0lvNXw0ZHV0KDVOdFQ1VSQjMz4rZWVpTGohSSgpRXdjYjRyCitsb0JSR1dDcFZecis1dVYxd0J7eWs/R0Vidmc2QTVLK0B5fEJ8S0xmPDd0UDVmflo3bDVFYip6PXxjJTVOWHpOWVpsWXBgPU8hcnJ5KFhQCitjdzl0V3BXWChwYEVtRyhMOXFDTDtjQzBwI2pZbnc5aHxDNWdNJH5mPmt0ZyNoMk9uNm4kcW8qQXdhbzZ8SEpFQ1FwMEZhUylTJW9zfEVnCis8SGtgTEN4XjdKe1lleV9mOHRySmheUCotUE91RW9NMnA9K3xeR2gpfHVnLUx+JFh7QjxPJlgkP2lGMlNURzliZC1CQnFedmNHKWJFJiM+Cis+T3dnR1c1TmpBeVRzWFBzKGE7dV5hXnpROVpSJmdkSCtlVFZnOVZweTctO2RsflpAfDI5K2J8SFQ7TiE3a29IJkokdlVpfTk2ZklHdjdGCitCYmUpSkB+OG1IWjgwTVUkUjhEWUJeNi1jKl41XlkhITxfSlB3RDdQPjMtbiktX29RcT9je2A+YEgqbnRHKlN5K1cwP0VPOUtRSDAwMDA4CiswUH5kPU07Ujd3QkNIdHowSDBnezAzSEFVMEJ+dD1GSkU/TFplKHdBRkp4KFJiWmx2MkZMcV5lYjdebUdFXnY5PkpacEVgd3Z5bFZELWIoCis1Qng4el5XVCREZ3ZENG5IK25ZVkQ+bDNIbHlES1RXNmF+cF9CJDZkNSo+MnRaX01JNjNCKjJHa19pPW1BeHtYY1pGJkdSNl5UTDRwdG95CitYZmZfTlRBJU9UdDNpfColRyglSjlxdm9+PmFsWk1PN29ZYCsySHQ2KlNVSEVteC1kfVFkZXZAQ3U1eGE7TmBJVm4/X0VvJXo9NilXPWtxCisxMzVJQWBDeWVSRnp0YXE4dlFJckYxQWQtTDdkYComfnVfV2s/cy1kJGlKd0NuOGM/UkRPK2xORGR7RDV1Xm1VTkUwNlJ7VDFndHZLOEFHCis9b3c9aiVDM21HLUY4YFpeSm5pWT8zNVNiR0M/NmM3QSVeSl5jSkx3PSltM0pQbGA/b09ncUdvZDhTKGdYM3A+P01IYlNYZlFvT3BjQWVNCismTUlDbXAte2MxeXdoMnZAdFMhODVSPkh5S1V6LW5ufWxiYiZVRVVwUj97Z3ZXK1VxP1BTXmVfe0YlPng1Sk9sbCgrYT0hYkNeUEV4Z0EjCitpU2x7cmFBS1lqaUxfdUBvM3BvZF54aGlWekBPPm55Uk4hPSlyZzRmTG1wcT5lbnAlQGkyUGUte24xLVorMmk0ekRuTFY5R3srZHN4UE4mCitsZVIoX1ZUN08zX1F7JVhWTihIUm1OSztITTRWYURLcEtWcUEqbl8yYDk3WFZ1KDBKbmZJZiFndXhNO18hNyl8QFpjYlEocnNLQXFZYlVvCitCamckdHdLODVecExOMmQwdFhLTSE5TStvPzI0ezR+ZFVeX05RRkNGNkVod2dwNXVFTyhmTlFJYDhyei0/O3B2VX4jIVRXaCFDayFhd3M2CitWfmUjQ2AtNkNke2FObkk2STU7ZzgldGtQfDw+U0FMPkY/IU5MZ2tNN0VnYGJ1NmFASzg1dVFLMkEkY21qbEgpdSExJk54TTBZeVJPXyV1CiskS3RLcHN6bUVPUjcrJDZLWkBkPChHYWxEcFFOO3pvfT9DZyFpPj4kdzVJJjBWdih3JmgmOEFvRX1FNig7clMrdyVtcTZadTtqWndUKk88Cis0bFlucHowK18lfTR5VkNiPCRwWk51VWF1KXd2VlBeWSloMDBIXz91UHc1dzBWb1hNVGt4R3pgKDxOSEVnLVZkdEs1fD8/TjQ0KnhsJDNmCis7THEqSl4mVHxQX3Nmfk9vZC03YD1ze3lMdVgpeE1BaDBQNTF1RX5pcnNIQmxoQXlNYDUzK1M7TlJsUytBI3cpV2g2bEcpWjEqbD5HXypJCit7dGxnVlUqfXFAcnNgOXNAV093Wmhncmk5VE98Vz1sWWwrIVBTUFk/YEQlMWAtRH5JUExQfHlnX35fPkFeRzREaDBWejhtNkY/cUZLeG8jCitOJH5VYVhCcWV1MFMjPE9GMyE5NU96VmpfclZAdGptRnZkJUpSQ0NyO2FfZ1pTU2N3Y0FWRkhWc35LRWRPeiFme3AkR2s8b05kMD9hQSQ8Cis8SjtxMzJKWWRueDFXeGsqVz5KfEpeQz10K3t1Q1MqYitkWiZBSkszY3okNHlKXjFaQmVRWHUxd005KllZS01vJmF2KGtmKDk9SEowPkZ8CitgI0JsWTV2OWFkQmM1fmBEI1REQExJS19HWVFxYkNaV2V3VE5VKGU8fitxeGBwU3UkaT4qeGY7P1pMTzJXSFlZfSNTSTNRd0soWW1oUn1KCitKeyV9d2FYP2Focj1faTQ3elc7ZSkkeyRgY0NPZiNqOVB1UiheU0F6VFdGZFFFPkgtQShOeztSJSZURDNoV0d9PUtYdWZscEd2bz5rOChsCitqYWROMCNzKVQtKlEkTkdNRntTSm19aUhwTjw1NU9RflRZdXJAMkI+fjh5Rmtqej03aT94Xis7QmRXYGM7Rm1PeWY8MDImX0h2WGpAZjhpCitLQ0JZJVRhSUFaMmYlWEh3dDB3O0h9fi01Q0QhP2IyT3lgcGlMS1M5dik/MzkmV2kqe2IzZUlTcGgwbyFEUHxzbyM/WmFMa31rQU9hdGhkCishKm5DRXdubCtNT2JtejhzcCNscyR0dWlrJWU5PHwwaSRURDBXKEsyKTxRfWd4ZlgjX1l1VVVlP1E4UWtxTG80VzJhdTVGUGs+QldoaDFOCisqZFlkQFdta01fWj94YjM/dFpkYnZHKSpHJmNyPyRoSys0JmNfdGJLbD1LfkY0SyU2aWpaPTt9YVgpQ3JnWnpqUFExe2hsZTEhTzYoJjc0CistSGomJHBmMT1RMmw0YH49RGI9dSQkZFlfeHNvWHg7X0JTU3MoU0goV0h4d3JKaC1+KmdBeVNmYTYlTjk2Uzszd3Q2MzxxMWktMGlTLUc1CitnNFEhb3Bsc05Od0IlVygmPGg3Y2F0VjxnbjRPSkQ5bGFlWSlYbzxTeShAcHwmST1abGZJKC0pSH18ZmxaYWlqNFZ5aVFzOHVNQlhYWEVUCit1YFhEZn5kPHg5SjFEJnVRSnxAMk4tM1NNRTRlWVU0YnxOUGNCSGdwUUJzZDB6fG4/dl9gMEhPQnIkeF40MkdqSVdHSWsyZHJ6b05mM0V7CitsRTV+dz9LcDhZU1djVmNNO0BGX1R7Vk1FJTVCbSRhKEhkRWwldEEyWilrbmNzayY0RmlQRUpOYUNqIT9VMndiQ0RmJGxxNXIzXlozQE08CitaZGMqUCkwT2xgIUJxTS05MlUtJWVSSj1vVTtZdHR9Y31pTGU9c2hIdzRnVj48PXpsaEopK1pBI2JSVn18WSVSPURWT29XMTw1RFRnNitNCitzemx2KDkhMVN3V0xHPCtzPXNEJkQmdzlHSXZWWEhUang2UD82YzF9VjsyV1dudHIqaHBGSEdzSTA3WSYqd0x5TiNoaUFHfHpHe1Z+anFKCiteWSpMU29NQERibklzSDBZSWZsT00yWU0hYTBsSV5pMSNCQXBYK3RJMHg9Yn1nTz96eElRQ0QjeG1PSlEpfn4lOH00OCNFXjtabjQhX3dtCiskQUJ7NnRwOE1OS0oyezBiN2spczM5c0hISnZHRUF6Sj5pNXRQRXFCQDY3NDNSQj9RMUF7QT4yKEQhUiFyJShvZzk+R1Fzbkd3PTMlbVU1Ciswe30yUmhhTFJSaGBeS2QmeU5SbSZRSCZlaihYRHtQVHlVO3txQWh+P3pIQ2paZVFFcl5nZVJ2a01lKlcreEJsfng0fl4xSTlMdVlfP19sCitpWUMmJjFpOXJ8MkY4RHNAK1hxMjd1dCRGUD1QJGVlSkR5SnY5cXI5fDRNNH5APytfZ2xvPWtDYXVvfHxLJTV+UVlQNUJ4WE95ODwqITsxCit+cDdNPjt0dDcxd0c8IStOOCtlfitgOyE0OC1XVD9Gci1wZnw9VWl5WGk7I3BGOWdJeCtQR3MteXhmUlNNIy18JWhKP040eFheLUE+UkN7CisjT3k+Vyk2bSFkV1FXXkNTakMwWUZmUlkxT0daTTdIUUV1dTQrUlBkcGxhQ1dJdCVLdzExXl87TW15Y2RQanp5PHZZSyUyI20hN0l8NTdJCis4biRGYytpYX4/cCtmNDhvUF9KQn4/dn5NSFQhOEx8d3VncFprK3l1PzI+JGtPbHREcGhYQDJEU19qUTJBdzlfMjMkfn41d0BzOy12d2xSCispJkw3aSluWEhoZlh4VT9PSTdvKWs9P0t1SWdhe2orLTlub2VLYUQkZWN1MjwkJXoxbDslT0t0SihIbmJmNVB5TEVyXiQ/cE1kd3xHSmhMCit+XjltZWt3dTQ7PmEobTZAVkcwNnhiPnAoeENXakZNNVgtUWtYamNkeU9iKG1YO0gyMFNKUDJeKURsUyQ/WEMlMjdYN2d8Zl5KeT9rWHhjCishanpGYXdZdChaczY5KnllUGJMcjlTTExecTZnSVRTWE1yP1BmQlA2YzQ2QGYzeSFTKz4qYW1IYlomPiFHazhNQWZLR0ZYSFcwRnghT2B+Cis1fUUoYHN+eFNRS2w0ZCNjTT5oaXVNNz4/ejkhPiF7bXpOKitMUnRJbUZ9NmImX0VERntEWHUyVC1IQVB+T2peWG5MN1FpbihKNzBAZ0ckCitvIWw8OXglUmgzYXNpQUAoayloTVNhXl5RISkwd2ZpPXVZP2BxSVM/biNSWDQ0dEpfaykrNVk3VDhrVmxmc204SEd3VyFNPUQ7RGxQPHx6CitHS15pcSRWS1JgVTxBLXgpMktNYm9yKGFPdUVtT1FkaEd6JXs9eDdnIVJgN0liUUdSKm0oZExBN2soWWJeS3ghfFo9a0l8fDdqQ34qMX1MCitldGpRaSFkYzhmcHQ9SDR2e0p2M2w9bnVeSVMqMVJ4eW45RSpgfV48eV5TZEZpRnN3Y0txNDdyQSZWVGNEWSZCTmVYWGBLdWZ0KVBBaWprCit9e241S2JVKi1+d2E3Mm9tfFRWd1ImKCUrJjtROGdMSkVtIzIpZU1RVHt2fSEkTFJjPTlMe3EqNE1lemcpN0p3eHZ1WT41PzB6TXB2LWJNCisoTjh5e3IzZ0FBYG1sLTBJK1gyMTRGaThIK2Zfa1UmS2F8SEp6cVI1OT8hPmxGeyQrVT5LeSQ1JWlMQEN3MjdWWmRJPk08JS1tdXxkRnFPCitnPCFpMERjI2BmX204QXtzY354Y2pQX3lkUUs2Rm4xPjU4ciRLZmpQRmZwaVJmWXcyK2chIV47eVB1VUFPS1d+dURmRU0hblQhXm4ra2dVCisyNGhPQlh3OGN8ZXxQJXNecWNBWEZUY0paMlFhcnNCbmhuPHt0RUN7TzIxKThUTkNIRTlreipLe3BpTmRyOGkyRygjTkp5UzAkSzFaZXdCCitpNStTRXpNZVM+cy1OK0ZyPSN7N1R3VjNDUGU3en1qJk5WWDJPJTB0UXt3U3M2SDVreDFEbil+RD5nYm5sSjtyWChEIW5tODtxQHBZaXhmCishU0FreCVYcTVSdT1TWGRFKGY2fEVAOVhuWilxQHx+OD40JEF2aSZidF9qX09wKyh4YGMqZ0VoZ089djdPaj5SN01oS1V1WllIZFdgUnZrCisoTUpkU2d8TyM4aXQmMG9LcEt7UH5adD1jYzVNJW1DI2JhVUVmZUx6JGBXJDxMWjlFNXx5cClYX2kqajVOMj5QJUB5Pil4cyV0OHZASn1ACithfGhjRmZjblN0IXRjOCMzP2hjKCk4XkAyUmxiYGowajZ6QT9BVFIwUU5QSXEwK2Uhei01ZFRBdyg3c096QCgmZ0UlNVFxc0c9S2FUa0hgCitZXkg9JXArNWpGeChjNlBOeEs3KFJEQjB6akx+NmQjNUpwbCN8R3hteEptN1oyWFJ0RXQwTFRIdTsoc3RJJnN2TFBMOCNmKXU+KSRHX3M7CitiXndsdmRPQi17NkF7TkEmX2hUR0pfNlZoR0QwRUpVWTtTZygpYVojIVVgcD58bUhedFIoUlRUN0xmY3BXNHsyTE9YI1diQG4pfVA3Wj1ECitQTmpXOWpnaTdFZi11ak48aVFgaHVWVlpZbWowTXpHRSFsLU1iKCk0ZlV0dEtkS00rNm4he1VCUFlAR2s1TWJ1eHlOejtfKm0+UnsxZCR2CitZMlBrdypfK2tzVWshO2oyPFJ4Y1E0az8odi0+KlRAPnNoNHVZcF4/dTdMP2NYKWpaeFFiRGtqfHs3Rm1ASGczVCg0TDFoWkErLT5XZnBZCis3MX4hJiVnUWQmRlF6TlhZYko7dzVoa1BvdDs9Q0AxUSQqWSZxWig7OypKMzN7OStLdXI3LXpLKGRLfkpnV2dxdHEmdF9WdnB3emY9YUVQCitIfHwkfj9sYlFVVl5LWiQ8S3o3U3VvZGZBMGk1bitDc0hMPUslZTw7cSpNeSNWfVZ1XlFXNiNoZ2Q/em1SWWIxPlhscU5VTUxDJnhBUzU5CitVQipZcTBNVU4oTXNtLV5vcGRKVmc3SU5+LSEyT2tvPH4zNmRxWk8rPiNRMWMmaTg2RkEoWXZpPEhsRXIzWVRAN2QkKSlkJVg5VXc8IUFrCispYjE2eF5eQEQtKiVLfTluVmpGM3xHRWotYktmWXp5RVc8a0FZaj9qUVRJeikzbm9yaUskUj5yZXVKb25gKVRsanBoV3lXb0NAJT5qe3o1CitUfk1jRlR2K0BSSyklOWRvZFFJcSVEdioyc09qPWgmbjFXRVpPISZeRlBQUGJuM19ySnB1SWAhcWI1R1AhTTlJRG51ZkQ/aXtZVCY/JkxVCitCd24/ZTxWQTN5OUVxfCpPaEVSNVYkNjEtK3oxaD8oTGlEYE1YbkNvOWM8TGFuNCh3cmU+U3ZsN3FUWipQRl5MajU2cDxmOFZEUmA7K1o0CistQSFHSDA/RTUzQG1wclg7Iy0raVJ9Nyo+TntnSVhPYyVvcEpIUWxIRU1YWFohYm4rdU5qSSE/NnZ7TFdiPTBmVVBwTWoqYURqZnMxdyYwCis+dXhDUzk3YUR1bldAY2wxUn44IXdIS000WUNrU2Z6JnItcHVHailpOEQ1JXBpcDxyQkA1UD5PTUltY1lWYyN8YHs3JCpDUXNCbzV4c3FWCit7TFYjJDI9QU5iNDVjc18tZDQhQ3glVTBHPXZWUXMpKUpLOFNOO31xKHVCSEp1UGd8dntjdGFoKn1UOW1PX04pSW1MdE0hJjY0OW5fRFM9Cis1d0R5Z2I+SyN0XyZxaHFYZmBzOEE8dEo7UGttSkElbm49fjxjNVhwS3Aod2xteG5layVJMzh4fkB+KGN5NDEhOERMbzswN2dScntVcUdWCitKWXF5TzAhKUdedSZYYT5WVG1sRCVCMVo/X3dqdGR1dTwte0d8d1BOeCgmSWVLJDQ4ezF6SVQ4JXE+Qk1tOW5mO2NgI1glcDE1NndoKXI2CitZYXN7PCMqMkY/RyRifn5LeDcqe1NUNXs7QWx2SmhnYy1eezVKemVRP2FEbD5JMXtEX3R4R3B1aCtZKGV2dXZsYDlFZjI4QVlPNExtZkBDCit7dUQ2V3UzRl5JRnUkeT9KQjl+P3BhWWh0a1dVQFJZdl9wQDM0Ti1MakNjfkkpNkBFbSk8bHh7RCFDJXZAVUNmPXZfJlQ3cTxRUl9DNC0jCishbXM3SXtqNWtUY3NrfGRsc15JTT1VRkFwbHxMTU8jd2VSO2Z4WUF+WT0kYnZLa0VpKHhzWDZkcFM4MjJLJGtKbyk/OEJlI3gpbjdTISMpCiszXk0mI1FuKig1SGE8XlBCVXg5e1pZcmBFMCZmQyh3bGU8KEVrUUJEfWpIYS1RRzNmdE53QV90SXJZZ1U/P2VkYHgyeUU4MW0pIX5USFQmCitrd3pxaGZtfkRTd20xNylmcX5CRmRDd3pAe0NCdzttckleOXojI2k3THRrNytIfjNCKFRnS3lmOE9fY00rTnZSVCViKVI3OH1TfGMyWnteCispY0ZnTUFEcHBZZk0mbjRGQyFNRndGT2RxTUk4aVJYUkxtX1QjeX5zVGNveXhpJkFPTmRDdD55NyRKU1JzalR4PEo4e31eZlR8KUtCI2BfCitTU2lTUmAwdCtEcnRePU9yWkUwRDAobn1gTzNzYUV+cmk9cnJYKF5xOTc3PDhDUXl8VipgeVYtb010TTdoKHY4el9TO3tAend1REtKaGsjCitAdUxqZjdmYlZ4fD1NdCNqem1wYF51PV9TcTswfGA+KkEmfUE2NHgkU0pQNChLKk47PCgzOUYleXFrfWZ6MGJtVm8laDxLelIzfGRPRUQ0Cit2LUh7Qz5EPXQjbTFpaTxNQGNHXyZvSmBvK3FqaEtySElrQE5Bd2lyN0p6IUdUJXx2bzVZK0d0SzkpdVhgbTJmYztCYVhiKU9FLVVGRVUoCis4Q0FHZWBZSEhDdEFVU1lFPmN0MUNaRCk1aDF5YEh8cX1lNVF7ekVnOW4rIzB5cyk+QXBzTyYxfVVVajYzPkE4SHc7PEE2Jnw2PmNwa3wxCitEfkBSWkR2QUlRPVlEcEghXzRFbjBkOyVpJnc+ZjJaSH5zPkYrfiYoOTVJPTNlPl5aSjEwdG1oUXx6WFBGWnZpKmZPaWt4O1l+S15kNDE4Cit+I1krKSo9d3RuaG1razVVO1Z8NyhKaWJtfVlsRDBCKGNiX1lNbmc3JEw0RUpnckg1SkhnOzhGNXktelppcSV3JjJZNFRjMyhIVlFNPCtLCit7WFpoSHVHK21+NHB1eEBGbEE4VDcldEltMyh7JX5UekRnMDJZMmRlLT1RMEFkWDgobjB6WSQ3bW5WV0J+ZFhXXlc4YENAQE5ZUGlVRnpzCitPfktwZ1J0fC1nQj9fYSEqMT42K3xnYypecz8+IVIkezFrbk8rJUR4dTRxX2p1TWpBWSQ2REFDMmN1YEBFVXxaMXlZPW48OSNmdnE1JT5fCituaHtDODIlbkVCdDctXkpheiN4SF83OThnP1Q5cG0wK19eeGhoQCpzKU04RiV6b2lMfDc7aHdoXmJnMyQjfjBHe2djVypMUWJ9YndhKDdZCitFU0NGQWFYa3JsR1EyZD16PFhefGhnPGtQX0VLYTNveCFsUSFlSWZDMWMmTT5qUnxXK2NhYm5yWk8mS1dJJjdYcFNMOG9DSk5KKnpnd2d7CitnaUswVTZ7eUY5Iz9hfVFmdSR6Um9wSlRkViVtXylEYTg9enMtbmRKPD1hJXx3bGpffHU9RURYODFgPWFBZ147XnI1UiVubVlDPXlHTGtnCitpWlp5SlI8LUhQQCFtcHlYO3lyXldRN1AtWDQzU0h1WDQzR0NrQ1o5XiYhY3k2WmZvTTRMYChFMWIkISFhKUVYJU1Aem8je1A9XlkrK2AhCis1RUFMRD4rP0xgeThNSGNuT1IqMlo7KU9tRGxsLTVNKW11U1JKe2JIP2xoa1NZfU9BQDV+X3VHZ0BGJk9zQTgoQS0yRl9BITxYNG1FO0VECitHcjV0R2pBRUBNWXxvJVc8UkhRSDNLIV48RktBPUM9aTQpdiFPMEcqcikjVTkhUjtQb2w7S2hATFJ6MjdTT29JMkE0JGomPWd7fT0xITUqCitBeHRFMlU0VG0rZ1h9PkEoRlh7bk5JKD5HOFUlZzRNSz5yRDZ6ZEl1UVVHQmFAKygwWE54aCglQkEqNipYN3t8JGNGVFJCMEttTUphQnNWCitZS25nJng0bylmP0RfQXt5e31CYVUjYGNveUojfSQxT3dEYnpfUzI2XysqZUdiOFlkZnlXflZpOyUmR2V0PlNAO0dRLWtma1BzZFE9M3IyCisrbGxCOTlLR2plK0QjP0xjMyg2M1d1OUctdnE/dEx4eGlQdVJjMmUmWkFUYWJldzF9KEhPeXwrJEIlVCVQV012KjNsMGRgRVIzUz5mK0MwCitEfko+KjU8cHl7OysocWg0PTtUT0hvTlExOT9VWmpeWlFpcX5JTkcrey12SCpVOUpJZXU9NXZWYG8kNEFwOSlLTHU9YmxFYHBmO1NeUVU8CitUMThWQj9hQS1PazdzRVZ2UnsqXjt+JWolSmVLdVgtRyFIe3NiU2Ftc2F5RlZIXzsrZSNXJDVgfTJvZkZReTM0UTtRdzJxKmdDVFE2JUkkCitvI3FQYnNxakt9OXVRWl9UOUNBUDZfNnJea3kqUClrMWcwTXJVdExpUFEqanl4VHFkd2JXdlhOa3NaNCYxZUhAdjstdkRhZlY7cjw8V0I/CitLTXdwRjZtSU1efXhHRDsqNTxyZGJsVTRIQmNqc1A8ISYrbEl7S24qNHh0TTBNNjBZZyklZnFsfXdzcyUqeF5mP3c9eV9kVGNQeT5aQD4qCitOXyMlcj9AIV5TVEgldT89dVl+eG1nJUopbUxIQzlBVylYMCpaaGU1N0RYIW9YX08zTS1FJmB4a2UqMFgyQFJDeTNtYHw2Sk1wPmBJZjdWCitgSUhXanM2XkxLUE10e3dRJSlkRnk3VCYwU3cqNSNQYnt1S1d9fjVOS08oJHtWXyV3RGI/Kmg9P0JMdHhLR3JXVj02eEE/Iyk/PEsjKFpICitJbHxAbnl8ckpXflJOS0UqakYyQjwraU8ock08VSNpPnM8JnZiV28xQDJ2Oy03bzZqUTYmOSthciFPanBRZnYtV1NOWFR7WkJpY0stcVV1CisreE5PSmk7SloyKz9ebis/WU42ZG1yJmF+Sn13TGZwe0MxSTEwfVQ3e0VLOyVtcmQwPGZqVk5YPlVOQWtQS0VmKVRyZ1pTOV8xIW13fCQkCithTlQoOD0rKzdKJiNwZW4hK3xoSjtoZD14NXp2JllsUihZJE96UG0kKm0/WnImNWxXfWVjT0tHNUpyPGshNSlUazZmTXohb1B3MWtXcj5pCitJT1QkRDJUR3doZyE+Jj1RajFYOChUU29fZE5GO1BMS1FFNUYwPHkmMC02REw3UXNqK0YrXiZ9dSYrdkRjZipIY0F+OSZ8YlFqdGp0UnwzCit+fi0xMzFfQ0MheExIYTctJDF1TTdfLTZCVyQzak9sMHl6MiNkVzBuaEA8Vik9YStiPkttXy1zQztXbUMlZTc3b0JhdylnMTlEY314eStJCitCXmxBPDJLWWkkR1dHTXEyS0w+SVhKRjFOfS1KXnBCZW9QVEVEVlllJFM7RntnViFUYFdEMmFXMU0jbCt4dXpIJUd8Mm85S0UwfnFUYyFDCitRSjl1MVomJT9iSmo1eyRQbWUzdGhQNXdsO1hPZzRTb1dyK3I2O3F4Zkp0WUBeMH1pXmpfJEQ9QUtmdDUhZl5TaiE/eGNjRnQpM3FibmZkCitPOFcwLTRCfm5mMUVNX0NJZCsyUWJaU1hJM18hUGVgKUchYkkoPnZkMUAqNyYzaTtUdztjb152OGNRNG8/PGcwbnMqamU4bUhUcWZlJjNiCispOXBRSz4rbGd5RXlJNEJVNzlKUy1pZEx7cXUpP0NJJVUzTyZzbm1gKjQ1RVZfUTdqT1E0YHQ5ak8+QnlKUzNoPWhnZU9pZlJ4Yl4jTHQ7CitibyMmeU1xZGNeR0MxQyNGN24+RDspYzNHYj9KOTcrTllmeU5TKzV7LTNleTNsbTFWKHFTWnY/aFclNnFgXn45YS18RGolNTBtcjVjU1YoCisldmFRNU4jdExOZ2hHSGlkLWRjajQyM0pITEhJKFpXRGNzOztUcX4hSkVFfEJSYD0+ZktCc0RWdVVyNSZpP15XTzlLUUgwMDAwODBQfmQ9CitNfTk/czF3XkkqMDAyJF8wMj1AUjBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGTHlJQ0VAZ09TPzdlP3tSSz5ZNGUpZDsjbDVCRG9OSEZ9Cis0NUcpJGg9bl9qQGYodjlyUkR6MiF5Rj5gK0V5bkZpbTQ8VHd1TEtmTG1nWnp3WWdAZG5afGtpVD5EOC1reG01KEs7eDIybUx7UzQ7I2V5CisyIVJBKVVAcVFxb0Brbj8/PkljR05rXzFecFdlRSlkPWRISnlDb1NBdU09OSF1MmRGRlgkb3wpOSN7eEUwWklMLTxgUDI7JXpvY188dnttCis9Zz57UEwjI0RVVytEPnkxbklvMGh6Qj4xfjFVdVA8OEhibD1AZ2NtQU8wZHcxU0A/fG92P3p1WjtTQjs4eHx7ZDxjbFo+Y1QlIUZfQSl4CisrKnN9eVZ4aldVKFZYIXBBTVNPcisjLTd8RFc/OyFrWjMwYl5mMzF7ajJqcz9FVTJWVSV+dEEqcUB2cVY2Y3wrfEg8Tj9HMm5rO3lub0ghCit3fEBWNzBXMj90dEpsTUVPSDROST1PMiEjT1UzbllXPmJ6U284ejg9emBxLUNtJSttVXpsaE5iXy0qRG04KXN0YXNXPG5xaUZNbEhXaE97Cis9dz16SjRPfjJER19WMWEkYW9qeG9DXkIoUmMpeWBEVFRJO0pKUU4ke3hYSiVicFU/WDZxT2sheXQ0LWV5ZjBjT0dDSzI4ZnBFZU19d3B1CitUUURkTTwwdTQtQ3lyKzZwRlUzUGBoX1N4eztiMEhrbT4lS3x7PDllQHhOMXN2VmlMYiMkdTQtRH1eZ1p9eVpHfD4teDVFNDZIPFpfTypWCitfOTRGZThzK2VaYjBfWkBMKDY7a1VRJnxOWjtfXlJKR2FeYVY9KT5nS2U5JTd+akllTEtiNjF6YWQxTyRaSCQqOUdRNWljYyRXTCgob2lMCis3VylhcFRsdU1GNW0hRzJ6Vzg4IzBOUjhUZz9KVUozdS1rc35UY1phTys3Y1B9KXZ3QTRMNkdAZUlrJEpTV1d3ZG1MVSh2V0cpTT1RSiYjCitmJCN8K0wzKmpfVDhgNld6NFJfayk4dG5SZ0M/empMJHFwIW9OdiZeT3BmY3FmPUxiVWNXVTlQQStLPTIpOztYenl2d0w7PVEjT1FKMExqCitlMSZrdERFP3pRfFdWcVR5SmJYenNUdjxBI3pENDR6OEVXIyQrNVNLUGExVlFpb0xWNHx2dy1zfCV8bDlhQUFKTEFhZHhAbCFqNVFROVk4CitGaio4bm0+dnROXmo9b01vQE92MmthaFR8U3BKayZOY2pFRUwxYnRlXjEoaUx5RUQ5eT1RQUhYSU4/QSNhenstUEJLeCl2SEVAJF9eYU0pCis5UE5JJDBad1R5YiM8PT9tS0chX0R1VS1jNmVNbEROZl9lM2JNLW5GKXw5K3lQKDt0Qj4tfj54IXFKSyY4Tlc9anVvNU9WdCtFWXg3fTZ7CitqYEhzKURJUUMxfmAmRlhUJnVxSlE0fFBoYytxRk5pViR9cWRnfX1KcERsJSlMMEx8a0xveUopcFJOZE0hLWdYYiN7cj1UTyMkOG9XOUBlCis5MCZxQUt2bVFBcy1SN05kTVEtSWl0bjVoODlXeCkxTGI/XmBTWXdfIWo8IzJSViZvSU0mZndrRmVFZygjKXo1S3VLND1UUmcyPjMhPWZUCitrNiFHLWN1VnpFKkJZaiN5SmBBfmg4NWNBTU87OF9EMy04cW1tTjQ9UjRNPXZhVT4qVl9HYkI/TD5DfGJCKGJtfFY+dlM1OzNVWktSR05WCitQZXA1QnttSiZBSGtDJnlRbncmRyhQUj9OZF9JV0BtdXNWdHRYNzBrZyhqKWcwVzlwMnpOY3kwMHF2dWRAMSokQHJJK1Uzb35qJitnXjNSCitUVXtOWj1qVClVblhpKjZxZFokV0Vta1M2fE9eaWg1MlNhdDhWdCstRX5UTXdQMzRrVH1RaHJBO20qKm5DQVNvPCsqJDAkNlpCZClFdHpZCitpS2A9T3gjK1dlO2wodDMpIUh8dWteJEtlTlJzO1dyX2MkQy0mPSFZdzRmIyMzZH44ZW0mNj9gMTRwZDdxMld7aUYyMSRQemBrZmEzU1dICis/ZStXcEZvPUZsMWY7WUEyYypHZ2VqdmF+XyU0KHswMTZsalZoZVgrX2Q9dEpiU1VVQUZYRkF+LS1VWCl6fStsWmo0antKaXM/SXRoKE5TCitNWFhuRShBal9jTk5yZ009PTNkK2JLKCNRKT5kYkh6NHt9MS0kMkNINFBtYDA9I2ZkQFFPSGJycnd9TWN6MUs1IUU5d1VSZG9zck4wNjcpCistfmpfcHRma1pabCUkdjRWM09zfChOYncoUUhgT15kMzJ7JEx+aDxJcmJBZUBvPE1rUGI7R31wXjx2akk/ejBGTUJgalNOazczfDlHbHFlCis/TGNmUTVZLWZST1lsQHp8QTg1Rng4cGJte1Z+KmZMdGFBPlM4UnA/IV89LTA3azxTZnR2NSk4JllAZXdtalp1JXd6MDVBe0g9Yl59U00jCitvPXtreX1HbTYtJXk+aDdhP2B3YVI1Yj41NSNRMkVMSzRVaE5wfFh2WD1za25pfih7SXx6fDdISXFqJDtPdUh0PjxoIThLS1MtXz5UOzVECisqaUF8M0l0YGkobChPUmwjQD0ha1N8MHVwKjVuK2hDdlVsdT5rQiVAdzRCV3E/Slp9cyNtb2grTHJ0ZXRHeDtMYj1nK1dnZ195MHJIWFEwCitkazV5IUZDNClZSGtQanJ6QmJ9OHBoSUt9cSQ2Y299Jm9QIyNfWTk2Z3F0WWZ9cnV6RXVVVkp4fUtaWS1IMDw8MGI8RmhRSUtYflltI2AzCitBc3IpO29oMWdzd3pxeHF7ZGpKVkNLKWpaN2JMTWxWSFdmMSQlNl9ZNS1hJW9eckQkRG0tNzlDI3MyS2FGM0J6QmNnYz97cHc0K3RydFVoCitLKDhgRDZHRjFVQGlHVyRHQ3s3NkFpMFFuNVY1NXwjdHp1NWgmKHFART8tPXozY2tEMlgwUGwwTCNKXyojTXpJKVF3fk0pMiNvNGlRRSRWCitKez5VTFBGPmBCcGZgRnY+ZFg4RmBxdnlVYz53N1EhdDA3MlI2fEMwcnZII0J1cGBraCVgbmYrVE40dyQ9WUs1NVQ8c1lwQU9uazR3ZEBwCit5RCp4RVgpKDA9dXF6amRTfjghR0NDV2ckMmtuN0FmVHI0YnBidCVIP3NZfjsxTW02PllJNFA7ZTdYYlQ7fllGVmBkdEt4czFFPnlXTT5sCismJXhAcFVOUi1kbHptSFA/SUdvNk0kZUJ4VFhFX1RZcmBpU2NaKTNTakR4I2lyYWx6clJyX1VRZVdOMT8lbzhaLSpGZHNPNHdiYnZ4dXRWCit8bSN5dk8tWWN6YHFeamBXSFdSMmxtK2E8c3QkQjQkfTZeUkYtRl48diNEMGNpUnJJYz1tRlZkK04yVTw5cyVwOVBVKDZNWXp3a3NKeDhDCitHYVZDZiQhdjk4NUItNz8+e19OdTZFZzgocHU3VzkxMCZEJkg5RGxLTDlVOVU9JTYxMSNgVDZnOF5iXmw3NllAQypkS3gqNyN4OHtucE84Cis9IzJpQSppKDtCWCNLKjxtc31CaCZnPVJIJGlXTGp9fWI5WTFUKkkxQHBqMUo+JjVDQkshVT1kO1c0RktIRFpAdU4xQnRYKklNJDBCUGJOCitkNyY9UnRSMGEldHVEI2xiVFpXPngjR21zMXNvPyUyO2lIcG07bl9jVW9kPHlzLUV0YzRvWEA4KzdSJTxnWUhDaFFJXzUyXjlPIUQ0YExoCit1dSlpQTg0bElGM0p4UkpjKjkjO1FpWk5eNWFAXl9+WnUmeTU9KXJuY3VNI0goQFFaI2lVOVpVPSNGLXd0M3VDYmhnR0IreU1eTmcrYDdsCismR148V3BzY01haU9VVCQrfXotKDxlY2tpO3BYTlNrfTh5PzxydnotJHtrSzsmfHkjd1d0dmdKNVF5LVNXTTRjKCNSVm44ZUZoRz5YTEQkCitWYUc0SlZaNVdBWjYwZTdudnktQXdtUzs8KWxtQHQrV3d1WURKQChjS1dHV05MNWc8elpCK2kxTE9MbEM5aXhPdzdZXzhvQ3dGRjsqJlI9Cit2SlNPZHdTUEdBRzl8MlppM2hQRitoLW5HZGpaNFlnSXBxZHdNb0FmU3dpdXBsMVoyaFhMczFUbSs0Z247bzJWZDdRTnhqVXdvZGhEKUczCitrWk44PTYke2N1OSUyX2BZPmZUfSRVK31oPXYzNCo9XnZQYVlIdnUjR0E7RGNSNGkmKEw1P2JWNz1zVyZ8SjRZeEpvTm47T2w3NmhhbGlyCitedmlUblghTldURmZaYD15c2hhPzBUc0hKaSFBZUh2UWxYRE5GY3hXNipWbndYMVZaJm5NdkN5MztoNmVCMFlgSXl2QjM8NE1rUmhnRGxHCitSNWlSMCs/a09oZzZVVnxtbzNASlApZHxpNn1UOTg1Vnh0QCpwYFRUTVAqMzN6VF5oemlySUYpWF42ZXlOcWBnNWlQMFI+bnxPdGs8QmN9CitFYnYxODFtWU5SdXVMK0U8bV50UG07WSk+MyVfQlRWVGpWRS0zREl8VyhzTkF8KzBVKEsoanxBR01ZLV5aWXMwPCF9TWI0NWUhRiM4QUVsCitEIXIlekxuZm8lc1k+RnRTcSg8OT5mSX1hZVBPJWU5KDA1PnRkNWtQMiNuQnRuYF5vdHhhUzc8WHJVY3l5WVcmSVY+TmtsVTlTO0FtKmlWCit4Rkx1MTwlJEA+eykxI1lVdz1nIzleUFUoQlkmWWUtO3hoblRSLU1acmRGfHMrJXlFeEdwPCN8M0RKWkRLSkQ7blJ1OFFYRlZ0NFYhVjhDCisyPE1UWHc0I0FVa1c3dCFPVF9XWXtBYGt+Kyh8NEU8TmVQSVA0bHVaJng5eTtASDlNND1xfHpgSCghX34hYjNQfkxnWT4oRXs/dzc0MG0+CitaTUF4dVhpUVh5RThjS01MekpVVGQ3PyNiVjlzZURjbz9YXkwkcyt2bDVnS2E+SmpzUkBqRUJ2ODNmM1Y3SzJXa2d2akM+XldxXmMwPzl5CitLJVc+QnJScG5CZHl9M0tiYlpWa04xdkxXZnJmP08mcSZLaiU4dTFaSlBCY31WIXRpeEE9MHUweCRzTzQxKSkmMmc3K3Y2fCthbnYqM1QhCitQSWVpXkFLdDdPTjBRKil6SUl4UWZ9XyYjQXo9OFg+V0JOYi1sa0tpJG4qKGZRcVZfQiEoWmNsN25pX2VvU145K2hgXittdUcwPjNMeEkzCitrSl9OQGRRYnFhTipTUkskVnA5SFdBWT9SaiRRNTxRajJ8Yis7Pm9uTEZ9el5eQUlPYUNwQWdVbFdhRlpeS1JDRnZPV0V3PDNpeyU0VU13Cis9IzdvRzUmN2dKVG5DUDZtO0EmUGx5LWRLcTI0M1Y2S1NycGZfOTdCNWk5cnVhanpwVXQ8NHtrK3ErTjxxXmQ8cTdJentSJm1tSzJOPHg7CisrUU1ZJldjVUNCeHBwbVpNPS1tN0N5eVlrV2x4aSR8NmxITVkpKnxkPUlKaEN0TFcjSStYQCpYcXdAPCZhP0hobSZpUysrXyhKcWYzP2Z5CituP0ZaKWNOamVvN3FkJE13Zz9hdHwtVCUtYT4pansqO2E+bTk7QTReTUokOHZ4MF8mJD5YSmYtKW0kM1ZWMWpFKWNCSSNme31zdj5mblBXCisxa1cyTzN8KnA3S2ohJihSQmBSUUZHSStkazgqKD9oPCFGRXVhTmVVV3V7P253S25KWjNVfSh3S1pzfV4tPEZgdFhufDJjZzJNNT1kZkxWCitVfXpwUE5xb3MtWWhvc1JreFgoNlBtWXptdVFjPXo5SkdrQCRoKjxBSGpAOXk8NnRoeXBHPUU+a30qKHV0K2hvUVBtWnt7KkU+akcla3xsCitrWTAqTzB5Rz5zfjk7NjNwNXtWXm5SJTwpRD1AZWEqI3h3Q0Zjbm1ESW59b0xLU25ieChRSGo1X3UwT0ZHZ0FHWHtCfTx9fmdWQSN+czN8Cis9OEZ7fjRgRGBIYF9tT2AhZnYpTDZHVjI7amxLKDxtNVM8Q31kVE1uc05FcHhMYWl7fDBvdTR2UWchTnFvNTRwaU5rZ0s+Pl53TCNNTituCit+R0R4JStXNzZoPnZFZ1dPXnRpMUgjbzd7JkQpKEx4cCV2V2xAKnRCNkh7d2dramFKcEM1Vyg1bHJTNVAmQVZOUiFYb2sraCVgJjxTRGEzCitoMXImXnVUPFQhdjtwM2coUn1XWDNZSDx4QmBmKXt1fWhZLWBOZCk/fHNfXmBXfnNXS1BnS05SLSNAd21WMzl7YXwpKFNsVHV9dUBfaDYhCitLKW9pOVVCMWh+KSUpbF9wdFg+I3pBYlY7RlpUPXFqNV97RmxRe05DVWQoJDZuPC1fK3N8djlUYlZCeWdvRCM8USRGOU92QmpfbUxhTiZfCis/YyEzN2Y5NWk8d0hhREpnUUZGaFMjKXhKWiZBb3cwNHY+WX1Afn15PyQtYCNwdWRNeDZxeTBYRSpgXnJePmVxWVdLWFF5LWMtd2tHRlprCit1Ukc/LUJIPkYzJCROYENeTUlkUWRlcHZvP2JiQTl4NHp9YG9hXiE7bTRobiN4X0YyYGp0KHMhX2RlQGoheGxCJnNRcEwoZWN0T35odEdUCitfeHs9V3Q0NzRTZzZKYFhRN24qWXMrcntxeExIV1glO3ZZUTd7fVoqREdCP0d8JWM1ckYoPjVGUFc7LUlpMnk9eylWaSFBNjspejV+Vmo9CiskRHBzMUxjYXpzMk5FJUkla3J1cSU9PVImSFJ0YDxJRTRwRWY0SEw8UTcwM1ZiM28+NF99ODFMaiZieWhkYFpeYSh1cF4kKV4+cGd+PElpCit4MS1GbDtoTTgoMURVQl93e3NxUng5LU9uKyhWRSlkbSlGKHJTP0xJa3h0MF9NUkAwSmMtekBrekszI1gydTc4ZlVpI3JnUjlyd1Nub01pCis0Q0c/aGpCZj4hIXZXVX5yQTBTTz5AOHlfcUtPZFkjIXZrbXM2YTtYIV47Sn1ucEN8KTBIeT5JXktibTdlQCRfemxxUlghfUJDQEN0Qlo0CitNK0J7dGFBRFEwQDxBX25zcDd7VVMxdDBwbDZneUpGOTYzbmgmPUpmQHpFcCooTVZCTENwJUI1WkAhJU1ycWYtZGZaaGs2ejlvRnFLU1FmCitmfGttKGQmOWY+dzsmTVR6R0dmWG1JajlLIXpyO29wTFhGKzhCZSgjd0RuVzMoTW1QTXx1OyM7NWg8RUV1ZF52cDVoK3h5QVNfRDhsRUkkCitAblpRI0FpaTVKUjckY3hZO1hyNHRxXjt1JFJyd1VOZD8yeTN6YC1VO1dyTjdoYzR9P1Y4UXIpP0tDV2hTXn0oSlBiMnlJZDBwO0ctZWFHCis2QkJwTWhFVXZBMWtXcmg3bTNANzRTa3Z8LVlCN0NrWXkqJktHQ0dzM1ItWG8pJlVUNz5vUkNqSj0hT21hWWdHTFg0ITRSMTtgMm5mTyFECitCOSReQWx3IVY0Xkw/KiV1Vy0ka3A4cnZDfWltTnlJdEFHTUJuRkxpY1QlRkNDcTtuVWgxZyV+PTdmWXokXitYPDllVi1iJWBqaiRFcXRoCistKHVtdllCVWo9amgzc3xtZCtsa1NOLTdINm9QIUJ4d0BSeDNHXkpsQH5SUkI+MDVQb3RubnpSdlgyJlY7ZFJ7bkhhXndTSnQlfHR6ZjJUCit9cGVOaXIrZks9eV5MWElkYmA8fkxWNkJkY1B4YVc9PWJSRz8pQWo2bG9FKDV9THxYZUpXYmg7KDc/Yk0tWSVaeWpDLWIjSShWLVlodjNKCishNnhqaiVBZDlOTlFiYj1mSj9PU0ZgMkxCNEQjTj0kMjh8dzRCVXU5eHEyNlViLXA9PChSIy1UODlTXmtqanhGdWJ5UWoyV3ZVWlJuc2IxCitnQHZ0bSp0TTtpUnVZQVZ2ViFKaXYrUjFfX0VDOWpjcjVadmUpQmpaND97QmRUZmpsPi1JPD5RN1V8SmlYZWc9eE4/cEhGbXNJTmRSMTI8CiszJEA3YXVUc3hBSmNaI0tRdlBxbUZDcFVfaCZ+M0p+dzdjQWZmPEpMNTRFVCNDVTw1VlNkMGVnO0dPMVpGV3w+ZV80dz8xIUs0O2VnZjF+CitUNShEcDd3aHd0Q3xDKjFUM2JxUV5nQXVRflIkak1zYSQzSF9lVnlqR3hndGheayV4STJ5WXFodllyaUoyX0dSK24qMV5Zazw/S0kqMW9ECitAUWIwVmVLQUJBTHN0SX0kTj89WHtpUzNINkRYVEx9RyojayYodkdxNjRjT0ZZVUYlfGhzNUhtTUJCZTs8WmZQPTRLPDZObU9FVDlgJGU8CitSbWQmWmpwTWdPbTdvIW11YTVwc2ZLPDRxell1M0ElckZYeitlcGI1K3pVMFUpOUJeVH0hVWt5TjB3XlA7QiZMZSlTcF9KMlJfcEM+MWwhCiskVE96KGIpKkFUKncyKnlXMWBqQnJKOGUmclBvSj0mPFVtXl9pO2lTK1dvPHopJXYpVSZsaShIaSFYMmoqRDlXIVhRKGVpMnA4eigmV3NUCit0N3tMbGpOQHVZSmRMZjY4ez5eMSVrI2drRFkoTjklZVJWO1E1QT9DKip5djtqQ1l3MlJkTjRDIUomNElxcT8wR2ZvcTNwUzt6clNuUV5VCislfShtTzNfQkMjVDJPYisxWUNueXpSND0hQF5VaDJEXj9HRzNXUUFKPUJYdHFsODAlaXFRK2V3WEcqPEBBYkR3fXZeKGAyUkUhMz9nVEJoCitaYWdvZXpxMTklb0IrQWVeakJhYz53eEUxPHs0cT4yIUo0VyVEKWJsQUc1eWlpPDBJTzBaaXNybzdHYzQ8TWw+YiN0RVkjYll8MCshLTNuCitNRXdMP01VVSk9SXJzWT9TY0F3N0FEcGAxOHpfej58UCZ6aCglWWFLZnpVelVpRXZ5eHdIVzE1dDdUS21HIT98Rj56XyZhbHQ0R3ZnKnZZCitvaGtBeFA4dFVsJnxqV3tmXi1vI2Q1PTBONFR1NmsmcEt9cClTI0BreVV2TkBUa21GKTE1fGZxSExweGxSIV4zMWFpa19GbnU4UF9yPiRtCitPQVl0OC1wT0lFMEsmPFNsaFEyamVVIVMhYEUkb3Y5UEB9K2QmOCglMSg5KUI0PDBRaWNteFM0Qlp4R2FfVTY8blNCfVZKaE5qT3dgVVJUCit4Rmwlai1zYTUqYEEwLXVpQCF7PWt+O0IjKmBLM19oSml7UlRJTndRYj9CenJ3fWhgbUN1dmUpaGlkO1JWdWM+VV9mcH16QXQ+c3JHI1J3CitheH09VyRqYSZVaXxRViVtKkVPMUt3NGZLdE1VN3BaWVQ0OCFHUWRYZnVyQiZwQUFWVFFJPnBXQVQzRmEjPjYoZGVhRDtxY1dBdCMtYiNmCitfe3xIRyZIWTNaOH5yWCV5XzxfbmZfVHtGIUVoNmB4JVJuU3taaCZSPEstT3tqQFlfSnJ8cGhZJnBwcEAhfiVrKlVpSDgkVCspUCk7RGxzCis2VVF4KCZzXkVgTVkjSChAfGlJa15NYmp7VlpmfCE/RCFJZXd5aEdrWTRocWBoYkJkNE1DQXpJNVRrYHpPekZ6bHBGOW4tRnZQe0VFZnFECitTTTtWSjshMWshZCliUHNgbzw0e1E4dEoxaSFDTlVebTBIYHVlfVJYdWM1YGRBR1RpSlZtQmtLYVpMdVFeem1sRj5wUHkwOEhKJX5vcFN7CitYbTZzI3VAcCQ3ZGFvQENoNXdgTGRTaTs8ZVhIQSpnaSl+XlA+Q0k0dHhtYTQqLWRKNVRjM3Q3KVElZEJofiYqPTFNb0ZPQl80Pjt1SHUkCitXN2hTfWt1bT9RPn1qMT1OPz9OZm9iJEQ9X1RnMmkoPzFUQEooMGh3Rz9QSjQ5QiVMYElkR2xrJk0/YWRyNGM7UWtlNCQrckEoPHUtQG49CitfNm58Q1BRNmZLNiNIflJaeXVaNnhybjd4fG4jOTxRVVd7ejFoO05hYmh2YXhEYldjS0dqazFGJSsoK2Y1TmIqVXZGSXVtdX1iXktYaDx3CitgUztmVXBodm5+dTZSNVQqUFYrM19AO2tuYH1lcSNCYWt7IXNjektARmtYSFk+e0w2JSY+YmVHQUN4YippKD48TnJAVCFMKFNPc1VObGctCiteO3pkfV54ZF5MYmhFKlNfPUFuVUNLdSs4Kil5aXdfTGZiN0c/dW9Fc1UjQU5vREtQPHc1X2MoWUR8V3o4PWFWSkhnPnw9am1ue3FJeGg3CisybXNxTiYtVnQkUD4pMVpue3ZZWkYjKzBGQE1vbjBPdDdGfCVyOVFvfDlYbXgkTDtpfllRNGRJb35JIUYjK0VJKGw3cXs5SWR3cWctYVp+CitaUkV5P3xxa2ZpKTBOX3BKRmJubSlLNTJifiMlVnklTTx0UlQ5JHtSayZJcCp8aU88VUI7SEtHQUBCMCleVC15U0MxdXQ7P3RMYiEpTUshCis5WCg8Xkx8YClqTVlJZ0poQCFeO2JpVEhoMXc1aShFPGJUcHB+b2hgREA4JXhOWVk9Pkt0JXQrTDBBIzsqcm5EN2JGVHxeQUZkZFA2TWYzCitrZ2pROzs3WTh8QUxNUWdfXnc1N2kzOURwJGlEKTItUGFjTHc9VG8mV1YrV19aJDhMI0FVT1FhZm1nZ0I2WGJiY1NeTHBebi1hRXUjbGU+Cit7bXJWOz1zVD9tJSU/Rn5yTioqcld7SSlhVlVjRCtON2MpVElXQlAoPHdQZWFLMExYVSQ8TlJjUE5FNjQmVGRYRUEqUlE/cHJ6PTJHJChNCisxc0MpXyQqXmM4NWdDbTdedmc4TXNKMnF7Xi0rUz89UHBSOEp1bU9JKjxLTz1CVERhMWBNb0xrVDBIbk8lRGNmcFJBUHItI2BzZ055YjFnCitCQ2lDdU12VmVTJmkhRDlHVkM0Ql8mcnFMc3dlOXxRfCYqNXdAQUF+YDFzXm1ac0x3VDcmRWdWfVVCcl9hXnBRPjdCdDd5ZVd+TlNGOSYyCitTdX1QVzsmRDcoNXZQc15WTGoweSRfUXZVSzk4a0sqcGZkJWVBITk0aHsyI15fSSE9VlY/RVU4Sk5nUyg9anYkT1ZPQE50TGRRaUlDYE1iCitIWWtXTCFZeE1rQ2d7NUhZKVBoRCY0ZldnPDFraDRVYShUPlJJRF5HWjRQJGIhKVFsNlpkdCZNJShHOEdYeEVlWWNtXk1QRURKXntfYXdMCitmOVQ/QVl1TkIwPTd4eFU8RWZObmgrU1M9fkB9NGZjckd7VlNpbXRhfEdUVXNeJUNIUTVZUWIlelFwQzBYRURqTHIxPGw5VTdEM0x8bzVjCitiVzMhM1hvcVQrUDtAJGlGaFglUVZYPEV8K0ghZXAwXiVZbkI2UXlvQVFjajd+Pig+QVVvWl9AX3NxVlBKTldUP3dYT3MwWihFJEYhN3JQCitaTHh7cm43JDJHaXVPaGZub3wxQmxhM2U1bTZPVV8qRH1MKE0qYlAyR3UpeFRoQysqUStCQVgwPGFTSH17eDhge3opMT9+eVd0N1A8cnxzCitOQj1idGEpN2NhekBhRj5LcmQtTHlKVjRlOWtJT0JEZFYzKVYhbEN6NjBXPWBRKDswTj08aXNAdFctQEZDYjwlJCkoVnBWOUp4K2xrajAtCishU2IzRCVAYXQ/M0Z1SmJVI1YxJTtXZl8qXiNoOVFpJUxkbkM8fX0tcmZEMTMpTXxBLV8zOHhaT3d4UHxtakZhUSRrQklEJjVOPEwzKCo9Cit3SlNtKHFoXkpkd3l2Nyt9ZCpkVFN1PlhRbC19VGFrIU5eRVpEfm5pMERHdmhNST5sVz44fXNhOCtsMjw1I2JDeU83bDwkckY8TSNpUzRlCis8UXFgWmJFWD1SN2ZDNlRAfno+XnM0VG92MWl7RXVld2MmfUYwb3JjdTk8eT1oQmJgfjR5Y2AkNnhwIXVLNjNQQH1LYXRBaT9CSSRpTjIkCitNK3UhUE1SX3V6JFIyPCNPbkF4c201a1hsJSg+d3lmKmliX2hDbVFSbFhzZmVJR0lzeylRUXBvcnp0bURyKC12by17QGY7fl9gWUIxKWJlCitQZ0ZDMVc9bFgmPH58KkV3YiFSOTxzdT53cVkmKDV9Mj1rXnpoTGdmS0NqbTF3NWVtVnN2aS1GLTlreSkxPzhydEtpT0BSKSNHa04lfF5nCis/UGxHekc+e0xoMHBrQWdWend8fDl+dXleX3Z3JlkrMksrQjE3bEdiMWo4cGUlJCQ0Kl9HOH5Id1E1UituJnFSJXsqSShPMDV2QHFMQlpSCisoaWZ2fFpNUCY9PyFTJTN6TGx7aGZacnBfM2AxMWlzV2ViUkhOdDkkJiNaVT9HMGJ6aHV2LU1FMzktNTx2PyRibF9edzZEcCRnUEtKXi0hCitmQV41fiZ6SkBqMll3NlgkKzJfcjdVMjxXYWkmbDttYXdnaG11MyEzbmZFe0tJejRNJDdfc2U5JmNxb2w1MUFFaWdtPlR6cnUtP0EzKyZoCitYUC1DayYzTzAqNmI/WmBEZVpAVjNpMGExcz05PWplZiglSGIwMVBBciRjXk9kRntJa1Z4cj5rSno7X19vdH17YWY+b0NOfHYyJSVYRzdxCitpNCRNbjIoZzl5RnRKVTBEa1M9S3FiQyt5QH5fKFplVDc4OU1TYCZFV24ySlVBWTF3STh1Z2V1P3lKJVdQSnEhYSQ+R3JhaFFHSnFFWWNxCis8U2JVaVBVTUVUNEtwNlQ0eWNoKSQxYV9Qa1JmKiZvRmxZRis0ZWw8QG9NailJZilMJmJsT01JP2xSMHkke3VFJF9CeEQjdFdJcVB2Tn4lCitUJGcoPTxHZUcxcGw7MHkyTlJOVD1UcUlESV4qeWI3U0JrNEVRfW88QFhffXIoRlFuKTk3JWZqaVRBbj8wRilnRlpVbllIenhzYV98WlJ9CitYcGBnQXR+ZjY3TmRfWWdwemdDWHIqKCZzdVlKY3U1Z1dWcXk5YyhHTVpUQVFSPWRiZioxQUgmN2dkZV5iXyklIVdIJmYmdk1Wd1JYSSkrCitCaCpEUlJUNWhQJkFLQEZFQXEmUyRaQTdfczhqUU8pY1AmKUlLR3UmaT40Q2wjI3ctYWBqQnQ1MTd4N2VtSXdxcHphQTl9Nn57SENSTHM3CitoeVJsMVZ7MlNVfD5qRnV5OHIzUyhsKn5GWH12eEJTVTdLMkZrcWExSklfN3QoYyoyKkB+R0NmSDdNNkt9eXltPl49WShKY2hvWl8wPWZWCitlZnhWcGJhTXlyO3J+V1lrPTBCXz81N0F0e3w2e1BzRyQzMWVVO0tSbHBvPFlLKi12eHJjWUx7TzBXREdFQmh1fk9hVVlvJShGeVc9ZHVPCis7UV9pRXRsNzRsZXU7VTsoSU5JRGhvS3tTIz1VRU8zYHhmTmFgaDxOeSV5MXN7aGJ3djktSlYzNj9XRWY3SUA2UXxURUZGZSpTVihiZz5xCit6Oz4pal5HeThWTFVeendxa2ZlM1Z+WmNGWSY/Y09WJjxWT3QxQnA4cnNZZilrOTZAS1hwX2c2NGc5U3g9MTBJd19BIylPe1lXaHAkUVR1Cis8RF5ROTVtflRrYktYUl9JNkJvVnJvUTdXJG4+VFhETjEhZGdCYG0yKmJFQXBfISQzQjFleD1icU88ZkBRbnE8b0txflMoalM+LTIwaylXCitDYURxLSlQckorPT1wMCsqfkl+PWthPndXaCskVUl3IVFQMXdjQERaa29ybyQzWTNvKUZhQzA+MFRIaGJ+cT5vNTxVbDlUOEZWS2d0cUdkCitDQH1kamJZZWJPR19NPjMyS0xpa3VKbUZibz97ODFLalZSSD5qS1ZLK3FpM04jc2I1OF4yS3Z6d2d4YVFhUG9DR1NMPnRxcjFGWE8pRlEtCitgUXlOVEQtLVFHPlVeUT5VNitVX2UxajFJJjRpcj59TzVPfXdqK19iZkxJRVozKkx0WnR3T1N7PTk1P315Mk17ZnZwRlVmalNgT1Q7P1pxCitaVCteXkdkS002UkJPaDU7YSFBfmQ4KWc5YmMpI0FVentrV1hidU5CTj9gaWtxYzJ4Z0ViRV50T1Y/MkZzQyt4VEpobnctMj88bFBsJHN5CitFVHZhMG5+I2hDYFU8WkVyWTc9WUpQQkN5Zlo7X0s1Q0Z6al9zfTw2THFLKkt3ZXktQDBEIWRhKGNrMmR+JD1lVlduaigpYS1PSUdzNistCit1bjE4aUIwc05iX0gtezdQWVRlYVgrbUt5OFYmcEU7TldwR3xoTFJFfDkxXyZaRWwqemlAZiU+amZKNGU4bDJ1aHpXbkZ2SFFwdUFhX2h2CitwYWMqMVkjaXFjQH12RTgwRmBVeTNVdGxrI0t9SlQ9fnVlM2ErRykrRmtUc0g8MCtUYUlIMG5PeEN0WkQmVFNgKVlXPmRSS2A+UDYhKGI2CitLXnFoWFd5ZGZWZnd3YH5jKXBpKl5RVEp6eS1wdmtOP1JUOU1DJTheYTFAd2d4dSQ0TlBkSmw1fTBwYUlMWm5TYHpwLUdkJjkkZUNqZHJzCitteDZ8ZmB9aUZ5Xk9OMn13UmhoamRBVVlSU2xkQWU1OXlENWArZGZFJXNGXzZid09KfCE8NnlwcUtCYzZPIWE3TX0tZGZRamQqTSFGK0dCCit2WVpiSG1SbnA5NmRAQUhuREZOcnEyRHRkPXg1Nz1NTTE7fnVpKUQzfFFnU1o1XmhwOHk2VERpY0gkPW1yallAPzxKQWIxUkBIQVBtXit0Cis4dVAjOD9HUjg3dUVVI1BkQDt7PFlpe0Q3dmhyN1YpYHNySEZ2c0hQb0lKPld2PVFhZz88QlloWXJ8VEliWSl0ZFY8e1MoNDxTflJ3S18kCitEcSleTmIjZj9qfEQ/X2cySVFjM0ZrSH0hZzxBQjZGajtCTDhpZn5tQiVSU0tOeDYjUDVjJWxDPl9taGVfdkBkMDVOZ2IyTWREUDFKfjIzCis9UzN+YlU9QHhWOG11amp1XzN5Ukw8ND5CekB5YVVlbE1iTmBKQXkzYjwoXj9CUHBRSmYmX0NkaThOTEFtQ2kxN3klU2Y2e3VrOGdDQjFOCit0fihNflU4LSk+aSpsIzU9WSkwWE55bGopPGMqVENtc2xeczFxezZicGBRKHQqOUtVezU2XjJwTXtsSGByYlFtZ0NTbU1NTzhkIXo5c0RGCisral5NbXwmb3dJWWUjUGlwTSk4QkxyZHBCV2ElbGM/TT9qVTApZHdNQmF9RUxQQExxVDJRXkE4Pk82WmZsWDRBMmlxMkV+QWZCYUA+ckFLCit5WE0rR29qWHc4b3IlWiRBYmFqTV8oRE5aaDUtOF41IThpJWpoUStKdkMrYGJGV15KQH4qPm0wYGYmP2xecj9vZHZ0TD5qM0czbmRNen1nCitJc2sxVGQ5R1poJlc8SXliQkJSWnRKZ2BIXnZWKTZCMXg2aVd0KTIqNjMxaWYpOUV+WTNNTVMyJF9sWHE/c2FDY3h2U1RpcCVSbXRPP1c4CitUWk48ZFNSU25GRmApP1V8K0dsQV9JR0U1R19AeFVOY3JxfD5BeCRSSVY4MWxMY0NaflUjO2RAbnpeQVJpMkhGaTl2Y043ISk+YnBaKSpGCitEbyh+SiRJPXBEXz1LSCVrciRqak1gbW8tbU1payV5blBkZzY0SH1KWVVveWQ2SSFGYXQ8c29YT0JFekNZfDFvd35WfEhTT1N6bGhtMm5yCiszIV9DN2h6KSRtfWApMjBaK2U1b1cpVWMyYj5qOHxYYHZHNWMrZColQEc5N3wjXnxYcnI9WiVrWEcrZjdyPE45bERKJmNBcENESl9YTXA8Cittbjg1QTVBbS1TYjdufDh7WExrXnJrZUBecS0kPFRILTlAQU4hTkMmfn1QTFVLVD4xO0BkM2Q9LWs0NXJzUEJEJjcoNmEqcW49UiF1QDYmCisoM3B+O1o3OT8+QElKYUdsZXl7S291U2h8eChvXyEqZX1kNWNAWHpLdEx6VS0lWTV8dU92NnZGKUpMejx6bFgoUSZ8Tk50S3MwSWRoM0IhCit8YlVGc1l6P2sqT2wkckliNFVYKF5UWjxvQF9uPyVDOHtlUjN3e0J0WExRKC1YPDNjWVltXzEzSnckdiYtWig1K19zcmpmUiVSTFNgOz5aCitGcSZ9YzxSblVSVFhHTzEkJjl+QHE7Y3VwI0h5JiEhaShiPj5UYXVGYyZYPEdJSGcqU3NyU0J2S15IdUo4czdDXlJYOGEwMjQhJFJwTkRMCitfZy0oZk1KaTRJU2EzWD99RGUoXzJSfXFufjdTRUdlfVBMYF9tWXtxclgqXlY4fGZZTX1Lal4yKX1nTjwrV3ZaSntqIzNLQHUraDB1OXVVCit3TU9GRWJGSyZFakNCR2xrSntpO1h0SDFYc3M2flI3LWl9Ozl4aChVLUBzdE59WW89KnAtR3BePFZXXlgjIW9MKlI8ZjFHJEhpPEwofG1qCiskaVg5MnNkMmNYTyV9IURLbXcxQkxwIVAtdkk4cWpyTlNwRSNlIWJLSzYjQHY/ek4pZm0tMmBIWShDQD9sKit0VyRqLU9yJV9mNTcmNEM1CitoWTchSXd3Y3wheCViOUdraU1kczspb0w2cSZCSSlLNGlVbk9PdmRJKlhKd3UoVGw1bTRWQGNqajFva2xDOGBebXl4YisrZVlTdXcjVz1rCitefT13JTJ4ayU4dT9LbXA5NmdJJCYjPGlhJns4OHBqRkdQT0F3VEVRV3ZgdmA1REVWejlgTHRSNHE1OCVeUDt9Q3dkMklEZUtIVH5ocjRDCis/XmJCRENScEJHaGFhK1IpNGVKdChgeWxgWXY/YyZsbkBETE98UWBwXnE2clpqKkE+dnRVITxSY3YwNzN3Z31uPCV2WDBScj1LTVNIdHQoCitFe2s+Izd+JHQqSSheQXc3eExCej1SJXhJZGFxdE51OEUjUmY3SWtmMXI2QmZVfTEoTUA7UVB0ZmcjeVZGfHZWY1BSN0AkczdQd3RIdTE1CitXLVZLTXEwXkV9R0NPTHRfOVlvTWIqOEpLUHMoNWtrSGFgPXhedzhsM2cmKnNxT0FiRzJvTmd3SURga1FmYjclKWxCdWBkamcyJmB3aGp7CitAUGh1c1dKeyRtT3EhOCp4ZmUxWl9pKX1ZfDxnfDVkJTI8QHgjPFdHWkBPK21sZklZci05OH0odmNlQygoaj1TWHJGVzhRcE5JUyp9JiVZCispZFAlcyRrbDUqKkRlQEEtNGxoTndHRV5yLV50ZD9We24rT0F5KkZja0lFXjVFKzhrP0xuWl9lciVNfStwPEBANmlRbE5Lb3p4QD1MJkY/CitIPFZ1fTZjWlRrJDkoNEtTQWsyYmp3eDRTaCFfJmRhciQpQ2M8WCRoaiU+Mjk4S2BRbDlobXhGI2pub1cjdjVQQHsyfllISyZIVFh7fWBiCitQX15AWkchYkRXY15KcGFkeD80cHA5RTFQPmB9QGU1dStBRz9DTE58TXhffWNBPW47X3duKT5BZEJ+cmZ6SVRMVjtZcWxJY0FuNFcqR1V6CitVUGR8bmEmKmBnVHxYN2lFNkxeQVY1TFFAa1EmVFJKY1FGSzVLJFpFX0JoTjJtNipleDxoTjRFM1B2UyRESnElT0Nec2p3I1hrbWZtcDNYCitGcT85QzUzVnhoe2tDYE8xdm9obmRaMW9ESG9KPGAhIzdKaXRKMjtiPmF9R1R8T0RfY1FQWjd7V0IlbGV2KF8pQD1BT2lefiYjWSFPNT41Cit3JEs+P0FMXyRnWSE0OE5kbG04JW5HeFppKUFtWW1PamoycHY9QVdvYWY5fCQybE4tTilXbDFyPXtXfio8Z01Ga3khOSRZKGw0UGU8ZSM0Cit3Mks9OHR1OHtWeU1uN1QzPXNyNUBrSnlRVk4lSigybmhGeE48eEFOQnkmTUBiQ0NiVkB7QClfc2RmcmZ7SUwpQyM3KSpyfEpgZG1OSkBaCitrU0M0cW5RNGxsclVCSSl6WnAzIV5zbDZ5VlBuRDRMIVMte2A1QEJ4bTNNYHpTNUpmSktuPn1MQz88QWZ7KSE7QFZWdz1UPFU0eVl3N203CisoZTR6Pz97am15VU9LSkUmfGlxI0YqNTFyIT0jVmlFcUFpeHlXe0IxMEhxKCFJYHQ5c1RCbG1nQjw2VX5haGteWDdAOW0pQ2hCJV9KbmIzCisoOWt4R2VYUnQyPD9Eey12IWpoKWZEP0lyXntiTythXjMqMGl4dmtpYWQjSXRLO2BoT250fU4hO0JHVU5RdiM2Knk8O2ZNQmE/I01WQ0FSCitvTGU8eD87dih+MC0ySCUlSXd1dHRVQmtoQFQrJDFNVihmfk9XP2Nwc15kXnpDdG4qMjlRRytgRHFQQ3BGPVhYfGpFQXNrZSZJdEVXYFk4CitxZVMzd3hlM2R7QmUjVjlfY2N0O2pfaTVMaC1VQGtrQj1pMTZea0lEaFM4LXJRXmtjTzZgUm9nQV5yKSN0UnZ4TGYxMG0xK3hvT3lqYVUtCitJcWVaKjxPNyREUHRiejVxSD5vdUM8ZGJFV1g/SE15PGNHeXlnPzNFc3Q/R2J3ITBYM3d7PGRtTDBPaDRqPzJSQzt4RD5uUzVCemhfTHlkCitTRHRfdVZuYHBlOF9TTiVXRS1YeGgxKiQ8T2JgSXE3JnlzeVNoJHV1cm5TZy1JNXswWmNvdDs/YSN6RTIzbipGTTFmKk8/bnZUa0d0NnMoCitDLT40YWNlTDF6ekBod2cwViErbUZTRTl6e0NwQU1JUyloSDBIM0x5eiU3SEhIKjd0eGEkUkgzdGkzMkE5Xjtfb1gleiZBfUBiQzxFYVAzCit1QXdzamg9dlp1WEBnZj10fHY/XlpxQiZ+fXomeWVmZj03KmZlJCFSUXRic1BFKVhyTlg/LTVEKVF0dTUqZ0pGQmQlcGp6MDExSXlMeUBGCitLUXxETSFCWThmITkxUzx9UllBeClnYFB2aG9mUitLVXlyVU1CfWFqUks0N2cqdHd7fkF1Pllge20mTXpEQVdhQDhYRm9KSDZrS3g+NEp4CittSXUoUzV8YStmX0I8S1QzaHpme0FJZUgzWXQqPDJjeDhrVEh9V31XREtuN29mTXtjbmgmS0pFKFlVNW16UD5VeikxeCVPayZFUDtVdWNkCitscld3Z0Nefk89Y1JLPnkjfntoTDRAT0N7WEhWI3w8cmdQTE9SXm1vT1MwXy0qYm1jU0gyPWleTXZ+UmlVd09ZeFA3TXI/bDJlekFsc3hVCitreDVfRXlMYHFLZWRlZF5NKTtKfFY0eit4MmFVTzN1VzB1QGNxMihAP2dZbj1lXkdsSztaT2QlRypRYWx1ZDEreVZldU4/fTM2UVRYYT0jCiskPW9YMWxGbmFxQGFVMFYkcVFGVGBgUip+MzY8Xyh4OD1yZEJVVWhTaXNeLVh0PzlqY2YlMnhjfl85e0Uxezsjc2BecVUlOyVNbVNiS0RUCiszcExWfmAmeCFaRng8SmlXUG5CNTB6UV92a3g8N3I2R3grJGgoK3gjQjlxRzFvakZHJFpzNW54TXwzM3pmUXxsPUJeX3dodSZRQCNed0FVCitLLT0ySHo4KW8zUjUtYy13RVoteXAjYCR5KG9DOylrY3pKJD99fGxTfUNnN1JjZjE0QlR+PFpUaWA+aWwyfmQ4I3YqTXJeQ2xQdShMeXtZCis9PXJ+KlNBdlFEPl9mSThYPH47T014UipsKGVFeGJqNDx5YE13RylRRFFsbndSU0ZaUnFRaG9zQF9AUyVqRUpDXytMeGt3UG08SnZkRm93CitwVHFZZEVXZi1yMUtmI0VtTDZYcCRudmQ0ajd6V1A7RysqQmRSS0B7Nit4P1dqWn0wfSZJJDxuT2pvcDkje1pUQmk9WTVeRkE5O1Q/MyQkCitJIzAqVjI0WnlKbl9kSDtYTTAqfV5RIX4jSjRlPSlYUlJEbigmc3JWYTZ7QD5uRGteQzFtVXEyVGtQNmNhcEJHfF5YdFcob2s4fHtQb14kCisxRmEwKE50aWIoRGBiO2FjWjFwUkZ0OE8lOTd4T3gqYnVNWWYrITVET3xVI2FDWCViYk11MmFQQ0woQ2BTQVBFRDR1ejArVzRpISpTampOCitqY2lkQU0xTytMZmZAQzRKfTxzPlVhfE1tcGVwSUJKSlQ5YTJlSldaI3ZaKVduYTx0UntkLT4/JDs3OEEzNz4hSXdPZyV1Kz9YNmwzbClvCitNfnl6dyVPWHRyKjxleSp1TytNUVA/cHw3czslLUZVST9MJTYpZGhOVFVOP3olNlUkWCtGUT9IYEo0WXFJST85OzEqb2tOREp4I0oyRHdNCit3UXRAeXFqMm4zQnklaiU2Zz5paDxSVFYhPWg0SntIeTBqdmszZ2NSV0k9fHdfc1c0Z2A+UXhtI09AJXUhSmhmdTQqJDlVKm9MQksyaEJHCiswSWBtP3JTT18wfSkpKzx9cWZNa0lORjJsZzhKNjVuJmxMbGtzdEd3YkU5JD5OMiFLdGBxYD5MXmxjT2R6V285b0QhU0Z7bXk4fVRZMj07CitDP1ByN1VNeE5FM0VNJHI8N0toP25sVE1MJkZQcztXfW8yR0dvXmp0dE8qekc2R3tHQWtITWVyemZwM0BYRFRDe1E3dSVTOTRMYCoyPWBYCitqPCV9Q2pnKjZFTX1Oa19Sb1VXI2VWdCZiYD9RPXk7OU1LPndjUX14P1YhOT5oI2c0QXckZGppdSYrIWxRPXpTcy0tdkphaXd8JUh9YEp2CispcTNnSlRUOzZ0aSRQVmVvTmslVk5yeUM2MFBUbllFNnYxRFBXfSFUdztjdkZQMFhVSlUkSl5zT2VAMCo9XjYld3BLTHp0UDNgSTJfP09oCis3PHotO3spO2MzVEM2anpmPmc7aGVlREZ9NG4xIyZrO2pQTHooMlFFPFBuVTMhJk5LQXZiWVZ4TjNLd2JUWF89dG1AZntpTVd7eyF3ajtYCitAKUY+ZSsxPXF0ZURJNHUpVHFLbng7ZkVeaXskS0d6TGYob0Z6dyZVV3A/NGFMTUUkNTB2VGckbUQ+RE4kX3dSNTR5QSV7YVZnfC1Cc2ZnCis+a2M9VmVKNVJxRS1iPmZjI0h3PVAzREsrdk5qPStJMmc8QlFOSXpHXnxze0ZVTXYjUCV7PXQobkhvbSlnVHNWN08xMHRmV3VQTVNuZUwxCit+ZFpOYTNsZT87TWZ+azw+citPcCtRfko3dVhnVUw5dmVFJE84JkQmJnZgUWhtTU9DIWh3aHZmTT9KPFlWPTB0YzRSPkZedX1xS0JQfl5QCitYQHZufGZkb2padnNXZDJBZD9fX1d+WjZNOT5XWmRMPkBhYyNJSVVgdXBrXlkpMklXUiZmYDlSYDRvZTtDcndVbTxuaF9Laz1IKU9vYGFnCit2RzR1Z1BsMl4oJnBhKWs+JSFJYmhFdEQqWkcoX3IjKEE9ITg0TEE0R1k8QUM0NUBAT2Rtd0RJVWd4MmRCWlQmKSRqREJoa1RMbzlOPXtoCitmTUdCTCpoKko8JWBCZkRrVEA1MkpSJlppMmYtcWt5ZDl1OU9FMSk2SG43Y29ibj8kWmktYWlUZnE5Ql9UZU9xLTMzPHhiSDd3c1R7N3NnCit5THtlU1Q4V2dOfTxuVXJFZSZCPGMzbmBnfng3WXd3e04tWUwlWSghWm1vZmFndi0jVmRTWmBYcyVZKURLWUZkdzdXcWRJS35eYTNZWH5ZCitQRXRCU1NMX3RtaHFrNT8+RWt8OzZBSztTQ1NFMHReYnYhcFNXTHE1JTJxaCR1YygtNlNEQHBjajQoTF4pNFRfVFB4XmkmUHpqMURYQTZvCitWUj9QSkY5ZzAldk56dCNwJXFZOFpAPCZpPWo/TTBOfF5fNGZzJDI2PShKPWZvdztLY2F+Iy01SWVpTHFWamdAfkRaXlVXR1BnVylHZz9+Cis0b1p4cDNwZEJ8ZWcxZmBAQXgtKkR4eT1FP3lrUSEyWGNDPiV3XjNhRChqJjNrTmd3SlZ1anZZRXgpNyVJdlF2UDYkQzZOdHtJQVEzVH53CitBKSglKXs8ZyY3bnl5V0M/SnxDZ21qKTJlZC1eQGN3bWZocUMwKHR6ZzxxPDMtTDhpczxGKWs8QFpzeyltXz1HKHwxUT1yTng/LTR6eiF4CitXJSR7aWY1PCN3PyhYJHkpeUFTcj92fV8oa2R7MWZHfDs9Zko0KjV7dVFIN2tnKjQ5bmxyOWlHTkEhVGtePnt6OzZRe01+amQyREdldnU4CistfHNKV1paTERjUTVUMHZ5X0grSXo1XzAmNW5FQ0t7NDZocG9LanJ5ITZ2MGBrOWM+aFolVG5CcEE+a2szJCtlPXk3b0ZPYiMhfEkzWmVGCitZUDEmT2FtWVFFbEdxRTdJcjFsWHcxfHRVI2FZIzI1eHV0PzdrbE1BalZ8aj5TXmkoV2dfZUtmTCQtfDZ1VEJFb0tyVW1rOTI5I31jT2BlCitMN054R0FjPUNlfGJuNSZye0h9b0M2ITx4MD5YdnF3Kll6YExjVCR9aV9uZ0ZLUjwhXj1hOUxLaCF2e05TV0trTUd6ajZFdGtHSVM/X3lWCityWGAoTUVjI1RESl42bFp9PERGek8/cXlpVzQjb0g/SXFEPCteeFFEVipaaTVmSk5LdzVSSzNEfHtEPnhlZiZaKiNfTTxEQSNAcDhLVHR5CitCeHxkbj90I2FqYj1tTCpwTChVfjQ5UEZuPStSQmt0K0wjZlZUYDk4WXE0SytwXnhuTmReTiowbXxxSUhtUVpUTzhZM2dMZn1sVFdrOTllCiszNHZwKCl0dWBDeTE3Oz1Ec0ozIzRKNlhTOTZ8cGg/I284TEJ+fCRpN2lkWmFLKXJjPjZkUlp3TiNsKHxNRGlQayQ0RlllR05WZG0kKlkwCismIWwzQTlUQ3hfekJycF9ISG41amhkfm1aMVl2ez4wYGpUe04/UWphNitKRUBHWSt7OU5oTDYzQ1VJdSNVSCFOayNqLTsjJG91dC0tekM/Cis1b0FFaUVUS3J1M0NpPXBhR1IjMGNDY3dJYUI3MEljd15hRSptVnd2aWpETTVldkQwSk4xT3c5Vj1tJjNMeVYxbyhlT3ghI1lxWWUlVVplCisye2VJNEJtWTZRdDMtRXo7Z2t5SEorPX5MZVUjTkIwVFV0K2Q/RWdoMT5tRkQ3PnFMJWlXXkRURnN1V3FsPXFeJCRkN05QQSlHYWt4eW44CitrSExiMWpzQWQ3bU13VDw0Py1iUzI9X0l1fl9OKEY9KzZPSEU1P1k8Mk0laGIhJkpGIXI7NUYjOHdVS0N3fTVKfm1Nck44KnAoaVlYc2c+CitHbyslSmpnYVl1QXtHPVZ6M2FpWFRZT0R7ajtGe1NDQjx0SyRBMW4+O09+TmI3RHFadlNybWNSSXV6RUshaHttdUJjZDlmeTU8VjR0aFBqCityZFF4ZUh4QEdNQXVHcHBlayYoVT9lcStyKUl5bHFfdjB9fk1nYGRyWEk4RTc8UDdFJitNZEErI3glZ2c0SG0ycmRRNHhnV2BiY3h2O3o1CitCX1goX0VRc1JmTXMxVWx9U2hiMV4rd1IzOWxTJVcySlVNQ0lQJERPN0xUQ2paazM4VFJjNTJsXitmKWN0MyElaigrfWBjZ2hDJCZzQyZyCis+VGs9Z0h1dH5nYzkpYGZFcGlpaUN5Oz1eS04kSmBZWSs4JTtsNHFDI1ZVaEsjQVVaZEI5d2hlNU4qRE1Cc0VgJChYcFc1Mm9kK05ua0lCCis3WXlJLXlAOSRQaiNrP0kpVXJaUW47dnRmVz09a3pjPCQ1LWE7KnMmPTZiTz43OzVtM3JpaWdIVGZsSFVDNT0oXmgoQzskO3tXIXw7JE0wCiskZmlZXjEkclo0SDJTOSQ7NGBDU09xcHhuJmMwZjUkMnoxb0RZSj0hbiVKeHRFRSM8UVU0RWczdH1GJHRSUyhIeEhudWAhQ0pkO3chVklmCitUY0pPS3RkXndmcXBjcityfnRhZyFAUl5FV31GMlNqJnlBKj8lPVBqOEUqTV9ZYnBQMjVWKkpHaCRiQTdrMjcyVHdsKHs7bWdlKFpKMTw/Cit6cjE+UHdnfE8rMmRNO31WVXZ6O2EqfV4ycnJabjU4V0olRDFxNkEyMUNRMkF+ZV4zRjZEdiY3WUooSFFRWTErNWUxQ3JyN3gmKzlxS0N1CismVCNKaTVYSWpSKipmKypISlEyRyplWEVsdkVXWU8je0ZkdV5YZnAobkdgQDQqRjdgKkRCKDc1UEs4Yl82YGwkNWAraT4rWVNnWHsrenFNCiswfFlMTXZ+Y0VDUiNqJilobiF5RzZSaSpPY2E9KGNVZ2RnUVN6TE9kOXY5Xm8ofXVDTGxOQ3Bma2dhdmJUJTVjU0hUPCZBc0JSXjUhMUJYCitZdSRvOHdqSTRCUTImQz40Z0F4NTdnKiRjPVM/ancydXZfam19N3xBOXFhSkBGWCE5TXhvPTxNRWN+Ul5xVCg3QFgwbkQqY29FeGNPWlRRCitzJW4wP3JqUEZYZkV+NHhIfDJCRWZ8OEdmZU84eThUK295JkN2VkAjZ1lGe2k+cj42N1B1UTE8KEsjNU0hSjtFXytecDMmI0xDOWRmT3RjCitydDUxeG5iNVkkQ19GMjYyLXopSnZiZXxzMV53TmhhODNXPD02dzN6ciNjYSVKITw+aE5lZWwxdEItI1IyJV88UjBrRURGKHk3TURgNzhPCitmQ1pSMzI+e2I9U3ZPUFJNV1RkY2M7OSpDen5kU34yZHNybyVJY2ZmcjVUZ2V5RHFQJlkqKUQxMV83V1NGRyl9a25ENSNWKGNAIys/MTQ2CitsUEZRRlVDOTh9VnxJKn1BNDl6Mn1kWWY5ZHxKWGhRTj5NZ2JJJG10KkVPeTM3Jn0xPE1EYD5MKEI+PzhgMlJ2YTMjT2Vmfk5Xe3NEUzd5CitQS0VKdUkwRmZsbj57ez1mfCNQTjg3NTBvUUcofTkoSTFyTEE8a1dDRW5zJlgrR09tO2xGbCMzPWhSczdDWSpeIVFudlAtNH55USErUy1vCit5Ni1BTCZCQypBY25WR3Z1YWBGJCYoXzJZbXNtVnwhPEZHVjg7SmNgV2w2Q2VrSEt3ejdOKEkpXm1BflAmK195fSZpR2koY0M4Uj8heURCCismMjxNRWZBdVFaX3paRyRpOUF1ZkQrLWZnaCMhRUtWdns+ITM3YXQhMHQwdT96QVh3TVV5dDJydSsrKGo+PTNRUmpQYH4xIW1EOVJvXnBDCitHSUZMRkxPbzwwWWteI2U5ZyE4eC15Q1RJISgrcXJgbGBmLWQmUVRZMD1LWX1GQ3wzUUVJKGNjSzw5Y2t1Q2xwTHtpeGBzRkt1QjduYjxBCis2byQ4TWQ9RElrbUdpJmhMe3k3MzVDQCpZSyo8a31ZeFhMWEkxWnYjWUBKcVkxUDhIO2E2UlpAVD5TWm1zeHtKd2Q9Wnt3R1k3NlZAZz5YCit3akJLVDU7JnJANTh0amhhLV51RnVXYEF7U0wlJkBLRnJFOEFtIVkrQX0rPE96biRKOWFVeTF3dGNaIz96RzVwUmB9c2A7byUhY1U+VEgyCis/bkZMOXNOYmZjOUBiJnhQSzNkWUVsNiEyVUItWEZZWHwoYyE+PGl+bzhjJElaIVBAUlU+aG5RPlF5UiMrelczQ1p3bHt8QElERmVLNnYtCitSeUMyXkRASl8tejNHWDN6NH40Q2BIcFdAe0VYaD1GWHhRak9AT3VZLTZrfE82cz99WXdoWWBjay0rSnFmN3tLdkA5KWEjaSFHXl9haFFnCitjNmhtMHtPOXZPcSZeUVUoWUxBXmBYViFlYSFMcilMZyFgaG5+bFFhNjVsO0Rfbj9fcHp0enpeUjYtKS09RjI3Vm4/bUtqSWQ3aEJ9ZFM/CitgQDx6NHltYU1JJndvJSphQE00dj1nVitEQWI/SlBIbmdNI2spT2krbD1FNzlQYTRtSjc/fjtLanF3MGx6fXs2flMqN3s3VGBzWGV9Rj8kCis8V3U2O2F2I3RMVWB4SEowSVEtY3N0OzJocW9ReEppS3skVGo2Y0phQlRFR1NfI2lKQER0KEp6SU4ydVI5T0opUURlY3Y3bW1afHhDX1FeCitXSjZnVERedEY4P2d0O0J8Q0U8KmAyKDxOTHdYfnA0OWBwOVJiUEpYVUdnSlRCNWBUU2ktRzs0MUo4e1BMYERNUCkhdyo9TjRlUGdLciNaCituRko9Km9rdFJQZGdpQ3NodGZfRiFxMUVzYjZ6fnFmK3B0Szg5ZFR6dkgxTGBfUk8xbn5tKUlHUnw0VjNyK3thN0xNe1JnKiE+diV+YVg7Cis3dV9mOyRoM3NWZWBaSE84fnRTVD4qWllTSUo+IUN7Xkd8byVNe1R9RypkQ1d6UkVvNFZXd21vK056P1oqRTExeDAjK1ZrdmEmdEZJNC19CispVXA1VzZqK1hSTCZiWm5FdUYyd2dkaGh8PUUhME5JQUIjdyNjP0t8UTZ2V0tyRWxEOWo0T3tQZS0hdjVBc3chLWlISSFmdSZWe3RMdGp2CitBSnpONz5MaGY2MEsqb2hQUnxVYWpWe21WQE1fLWtwb0JvQ0N4I2deM19BKVNoQ25VNTxMWkA8djhvcHhSMiZ4QFBhVyRlYUVHZjx7VGQ+CiticSRLTXtLe00hTF5uQDc4UkRhIzt9c0N8eHEzLXg5Y0QrcUdKU01DPyUkQzNEej4lNmp1ayhOM2d4YT5LKjlVPzVOP2deV2JVJDY+JXs1Cit1bWJJS1huWkFiNj4oO1g0YXoqcytYVmBIJGB1cj1ubnEjTGtVcmlrd0VKSkA+eHBTP0wqMFU+R007KnslT0JNJEpkVEk9Rk9URG94cDh6CisyU1JaeSNWaUEtfXZkJG5rQk1xPk4lJmk+ZmB2RndSQWhzNUBldjlnNmFuRHFQRDFkVWhrUHhnRTFvKTItSzJVSG1uUmttMV9FeGZZRDl7Cit0I242QWY+MUpwSl8zRldAMExtQG9tajxqcSR3VkBKTkotUW03UDhWcWxuZi1BWmxpe2x8fnNXZ342dGtaZ092aDlNU0JtUXVSOy07diEhCitLeEstUTgma3lYbUNxXmglTm9NeDNPRkotTDgwM2VARXpaMFBQSDZMe1ZFckVEYispM0w9RSg0KyttKFQhJUp9Rk53T247VF5lezl4Uz8qCit7X19KaXIqfHdlZmQ8KFlrPV9NJFl5PHZuMCg1VE5WRCY9WDI8bTBHcUpGKnoqYF5sYUFyP2x+cEhCOGVyZHFtbEEhO1g7MkVmcDBmQj9ICitQNHVMaV5wa25OfD9IO1RLVF4jYVNtU2p3RWJab2FfdkZhR3laWXt2NUI4LUI5K1A3ejVocEN6RXpoV1FRKT5xVjlePV4hWmRaQ3pLPERzCiszZCVoQC0xMWZTdXlKV1JIOWhpQDtFJnJSNXYtTGZRYWlYKihOTlg/YmNQU3xNMlV7UUVrUGRpeHNvZ0JCb147VDE3PlcrX2R5Vj08Z2QqCitCZSNYNkRPNEw3cS1ycl9nRDBAajd2ZXljS0JrNjAkTDFrWSlFJUkkMko4OE9idTJKYF8henBXR053cStWQVVeOVIyVTctT1B1KUtTVnx7CitWMWk2e3ZQeDFMP0M1eGZHfXZ0PURZQTlFTCR2bDIqPypJeEdnZWo3MUwxKkJaR0Z3NE0jTGhuTm8tc3AkYHZCUXt5KUxXTlRMaUprWllFCitoOVN7b207dmZNZEhCM0VifkswO0stQTslQFFeZVg/fT4wKk0tdFVuRj5mWXIxbCtPaUpuMC0rVW9YMWdyV2laaCFsckJWbFRISWxHdyZMCitmQDxAI1NpUU9jZyEyNms/VlBKNlZjYn5fKmpCeiYmN2s0QTI2fVYyPF5sN1VgJipLPjw1JW90YyFNKzNSOTttb2lFM2lqKGUtPEMhNnk+CisybmR5RllDPmJyTy0zSz1jRFh0S3tzOXEyMT9iUmx8NUpZWkdVK3NvXnl1bmw+cHJUS0Z4QEBAREVPUSQ7VytQWmBgQU9LRXl6NnY7e0VBCitiUn1LYH51XyNuV1RHUHxRN0RySGElT3t4N2RTSGZqbVgpV0JxeTMod0NOb3t5LXxXaiE0Jl5CfEcwYldNVE1PcDlIfjRXSHAzaz8xdHpICitlTlJqb2FYNn5KOSlYZSN8a0FoQn1nMV9pIVZaXzN5eXZ0azVYcVNpfHBZPWo8OFkqMT5OM0F1NHo8Qyhhd3BPWjw0K3NyYFp8SSNCKUZtCitFbFZzQHRacjl5IXZHZSlNZE80fURSZz54KGJOfWtNcnEtQl9sP3BTbT4lZ0UkTzVHKndZK0xrKjdKdFUoblp3K0Q1fSl8Q0A7ZnQ3REJmCitUR2U1UVRBKm5CYSF4JGt5SyM+dUtVeDN0XzkqeGU4O3BpJk9DbiNRO0xza2MxJTtedkRDTGEmKVQ0V1g0ezVUWHYhMVEkRHJecHdfTGRTCispK0R1e2RtdWJ+MiNBbT5pK21TP2NQZHFBSCV1U0BHNVR1dldpQ2c9JXYySGZEMUZ7Q09gcTRTQkNadT4yNkFGSy0wbDhRYS14YVVDQ0k8CitwWV40NitUX2tVTEY2MnZqNklQQFohaiNlJDJoeUprV0EkUmQ4JVoxJVNBRCNnM2FBfX5lQk5uNWp7a3R8dXtYakpUOyRxPztVRE5DdDlCCis1Mk8tU1ctQi15fWs2RDh4aihGMCYrdyUyJl9Wc0Z6eE1naGNOOUVqZDUpbj9ReDhvKH09Jlo4eGZ5XmFrYmllN2ZlajBmTmJhYFdNXzNJCis/dyVDMnAzYCZIKHd9MjRkaFB6UzJjdVFLc3xReT49PF5WbC1sYHJPSldxVyV2Jkw9NSh3bzk1R24mVzQ2c1B2MyZIMTExR25eNEd4Vkc5Cis2VyFIUnxYJERyQXkzWk55PHRWJHJ4d3lrNU4wSHVfPkppY0BifT51JWlRLVcmVilfJWlvNEglPSkwX3c4c1AhcCFIOFVqKGg5S3YpWk18CitZS3UkS21nQWFhPXxuJDxWTDNwQXt5QnBNNFo3KjJua1BrIyo9VXh1X1A5KzVXcSpHcXRFaHt4e3AhPkdfTjU5bl5GYT5YMjYpPSlmRFk3CitYbzxoQ31pendrd0g1PXMqKkBmfUlWMjt1c3FXNmRtbEsxdmBFWERxfjs9Q2hXcE93RCZPRiFvcVhZO1dhRWdGQlJUWm5aeTM8aVgqVEBGCitBP00xNVZzUV9xPXhGcHErTDtRYWR8R25pWl4paXVyeio+QndubyFuJCt5amFkOCRSQlRmantvTENtTGdFVV9qRzxtaFJAdG9nKUN1eCRoCitUNUJCbT1jLWlhUFE9Q0txMmxIMkIpSz9VPnNDQWBHNElaS012OT1QQFZNdUlpQ1AoSjU1X3N6bDFuY3hEYEZ5UVZyaG1xe2FVfT5EJj5uCitiYS1ebiFLQz9IcXhhWnhnWntkSjRoe3ExbUJjKU52UChMOD1IcDxzP1Z1cE9zZTJkZiV0QF5hJjIoSCpEKUArYnJ4TnV7K01meDI3TmByCitJfEdTSilpajx+NypyKjcpaDtaQHVES0sqPnBRT1F3VyRJa2FLJUBnPDBiITVpVFg9ITkpJiN7JXA0PEhBXyE+bzNYIXBmfF5Ma2BPNEdeCit2biRpS3x3S09yQyt2Y0t7aTZJe0JqSE9KU2NxcWZ5fjtlO1E5dy1YZENWbVEtfHAjMWxNZCUhS1l8ci1IRXsyZFN8S3leVHVjT35jQypJCitMfD5QXnhAfnlFbEM3NTxOOG5iPU1zIVVyTFJnbntFPWpKIT8kJHFFemhPZWJOYm5JPWkodHgkJWI5fjVxWTx5OH5AcUAtZ2M+RG5lTkpXCit1cSVaVDFreyZDai1QSXREeFdjTHZDQyZIUXZPYzdFVmQhV1VQYFZXcHpsNEttSjkjLXRSV1ckN1REYnxpMStpcl8xY1pyTyp2I3R5SUN7CitnQnhlXjZNMyNBfTcmcCN4TnRVZFBuM2lFMk9kTUViY2wkXm1MMDwkaFNBR0JfNGA+V19RLShUVXt0byppMXpTcD9RI3ZAVSMhZzxSSko4CitrQiFeYHRFRE5ueFAzUH5XWkA0MTApKGIoUEorfTZMfjFyYXZsOEIjSiskTVJaRnd3TiF2biRFOE9sP08wTGEzd2IhZXJEOVFhPXErdG1eCit7Z3plZThMTkp0PSEwWDNyPHM2RUImZ1ctdjVwPU5+Y3JEK3EmVFMzPnZ3RzJLNzYhKU1GT2B5bURHJkphI3BzMCpQPig0OUgjMWVJR188CispY1laIVJyNW5ob054ZWRKPWxuandncllrRWZCbz0mJnZOYWZaZGRtemBsV2xoKzBvNm1PTSZpRXRBVEU8ZCRpJnJVanE0WEE/eT8mMjA5CiteaDJiOzBvUjhAK3VpV2hGOzNhYlpxd1YjWnF3V1E1Xz4pbCYtTz03IUwja0MoRHVoe2okNVFXaEJ4UHhHaGt1NmcwfSFLPzN1VEdxYVlrCitPQ19MWCVeZ2lJKEJRUE5sI3pPOWlXQ19vPUBvdENAQD08RENyR3psciloVj17TGJEO1ctVzMmb1IwUVF7I2kzVnpneChmJTcme2J0WlRxCitNbUp2NkcxYF9nQCFfJXNXKnRQYVl3TlVXQnJNVndSOERIY34oaX0/QGBMUzJ4V3dITHQ/MmpFaTw8RUooOCRNbS07QG11KEFXIzRFZ0N3CitgdHpHQTlVcHgxN0J+bmt+bnpgcnduVEwoMHBEMzl6dVRjQkk1WGNEWjJVYzhEUGkofGFQPiFoelNxbTMrNjNkRXkySC1pX196NT5CSnMlCitQdVVKOHMrQSphIzxIN2N2ZDM0czYtNFd7PmZ1MEg7USNGWDlIcW8laHxQSlZhd1QjTGcrN2lzeks7aHA2RW17KklIQChBfG4hSHpDTVBECityfTxPXjlFbzQyemwjei1nWU9RQHl6OFc/RWYxTEhOUUdkYDhGXmRNZEc3PDVjfUBtI3RxIXBwQUBDa3AxRUt+WSkoQ0FMZTFCaFB0SEFlCit0TFIlVFdDODZ5fmR+WHVrWDV4RmYmXjg0eipwMExTRkMxR2c5NzUqdjNlTysoKGtseT9lPyYoSmlMcVhzUFF1OE5WTWQxWm0hT2UkU1BhCityXmdaY0xuUjNrQDIrPmRKUmk8dnNEQi1hUSgtaUg9SVRiJnVWNztBK2VxYSVnNU01WVR3Mk1gWXU1TU55X2dxe1NRcX4lfnlvS1lmaypJCis+KyRzRCpya2owe1R3WWF4Vng/czhQMHxDayR7RU08PSo1akwqIThCTWFXemw7REJwYVZNYTIqM3l9O1BzWTUrY18pI2ZkKG1PPU4kQnRWCitzfkI9X0tZKilYUDMtJlNAR14jPSljTEpNRkhNaE9RSiZDdiQlSClfQGhlJlZXb2FVTVBqTTJafUVfQk9kRWY2RGpZKVlfdEg8eGpOOGheCitYPnJEWCV3IXdhdjNSSUdxK2dHRCUhdCU4PmJORUQkTGNjRVIxTWtaayFtWjxFb0ZNJCphTn5Wb0R4UThHNT1CZyElTCVARzYkUVk0fURACis1eztrOChiaEV1UWlkUGpSYVBkUz10YG1OSW9mKmUoSXZjO2NnemZsOzU5UT9EIWI4dXBQMj15Mm84O3VaO3VVaThKfFhtWE5FPX1GeDlFCitNTCVRJGhaRilVRHFkV1JnczZmMHBidlRsZk83XkFPPis9UG4/RU8oSjtaekxma0MhOWZme1pxKnA+N2N9WFRlYGJoKFFkdDt2UVptazVyCithYD1BKSlPOVR1QiV2aTw4N1psKmxxKWx1S3IhZkQ1eGY7PkdUX1J2dSZib3Jabl4mdGBqXjI+QEp4US1qaSZtYX0oRC1feFZtREVaNlRfCittJkpAUFBEU1phUXxwYTE9LTdESXZZJVFFN0R1PDFKXkttdTIoe2o+Kk03eFpkVG9rSElaWCN3cTd1MUN6LW41RGFVeXcpUGwqMmhtPXFvCitAfGUhMitGcy1tVUAoblVxdGdKeXsoXnlFaiN7cik9S2hNXk56X2VWIzx0M0BQSHoxYTErT144WHRrN1k2aiFVMkVpcXYwPnN3dyVKbnhuCitZQG4qUlpmYSh6ZCpPayYzVj9hJThuITxMfUNTR04mVmZjaGA7I1JNYT4zWDN9MU9XakkoelhIKFJHY1hlbXtObGZYQT9YZ2YtO0NrQTRMCiszMXN2eGBvekptYyttdng1bCVHdUtQJnxnP0NvU00tNU57a3QxMU1OVjthTEYpWnlANjx2U2czYyVLb29RIztnIVdoc3VrSnFRRlI+akJTCit1O3RnLVBAMTIrKlheKFhFJGt3dVUwPiN8JDJtazgqPjU5Y2lBeVA3ZWRsWFVRP2k/OWAwak9BIWE3Z28hZWYkJUZiSW5ZZSV8Tkd2QlZXCituOVhUNG9qIT9ETW4rJERIUGU3Znl2XlBnZjt4cFRmUDJUWVIxMTA3QTtqQygrUHV8bUN1eEskKnswS1pPPmIoejh2PFBGNnBjPzVKUXA7Cis+NTJxbl8zdHJuXkVYP3tPVTMwSDw5QD1Qb3UqUV4+YnxqMm8odDl+PSVKdzNlcCRqT0BKTGRmI1lBN31NV1JwNXlzLXRLWkVtSW0+KHQ3CitzbDN6d1hnZyhkWk59YilYOF9RclFAQy1fcEszckYtNkxFPnEyJGlVSVRwYip2aGw9ejtXUyhQZSktR1dNbWwjXmRGSWI2b1gobWFrUSUyCis3JmR4fnpNZzxsfkM3fTcqKk5aYjA2d2lrMWVtcj9VMGsxPTNZM0NMSkJCVGY3JkMwRj9SZGhzZyMoK1kqWmpQPEEhXnJBdDdFeG09bCpuCitlVCtmMHRpb1FjQG92UTNeJTJ7RStPYHlXKE53IUY/SDg3KGN3aGpJZ0k0cyUqIUErLWF0e3JHe2pldH1BRDs7I0p6LV9LUHVQY15JMU9TCis9Q3E7UzY/c3ZSLUdaVU9QNGl1cU1pWnh5TjkpbkwzYExBaU9eQnlIZVlLck8xI2A/KVlwM0xaPktObkhUaCl9TH0xVHJPIXVVcGY9KH4qCitXXndnfFA0NjkrY0JUV2c7bmxXYFMpMm5NLUhBMTx8QyNteG1JQ3w4NmhoKHRaJmF+JChWYUZAUzNabkpZV1BOT0BtNG9pKzNlO3YhMCN5CitocmZ6WF9TSE4hX3tDPjA1dD4yLXNZI0ZXKWZSVWhobDMtRSFlUEIxeHp1K20jeDNxZCFUcEJ+KXslel9ZMzVrPlUpU0grTyRJdnE3YjxCCis+Q3V8R0J8all9UWE2fD1uYiYkdGV5elYrPkEkRHAhMHo/WkZfQHFjcjNHeSp4JHt9QklaU2BXTVhlXntES2dUS3t9JEp7YzRMeVd3Zyp2CithPDVIdHtaLWFnMWk2MHIjQ1c5RFF2ITRBQndoQERpVEtqME10WDlIUmx7ZSN0ZGZgRDJzVj43fTwkeXl6SXM8T34wUms/d1koY3VwdkZKCis/YUdkPWlUV1ZhTG8jeEJwSiNWOTxWdDw+VSF3NGZESFNpRC1UVWZkKURtbGc+TT9XYTxyTGQ0MW5KV15naWJ3SU12SyQmcioxbkgjXnZnCittZnZVS3hmZnt+VUFgTnktSnRWI3J3eS08cFVgaD1BUWBFSE9UKUZ7JEA7K3xpfmRJKUkrbn5XSGd8UU9RNjRMWEdUWHk5el9hQ3lTK3VwCitCRi1oTWNISUJnfWNzTzdSSl5PXi1qfl9qZUY4KUZJT2lZMlkyUClAVWkkbnFjVT1VdHxjWXdgejRqLU1MeThyIUFvY1MjU202X0hTcD1+Cis9WlooajkjcGlCMiFYSUZWT09tanQwdEZSO0xCXkdUP0NpeX11RDIoRk9QPFpDXzR1RSFqQT0+OU0pUHkhSz91Wm9STHBwaGticVVNdGozCit9WW0qZU09fHV4KkE3ckx5fVVJRD1zKFA/U1M9PERPOXQqO353alRoMyZvbntSMEhLaFc5QjV8PWxEcSVHKzEmU3xnZlo/RX1FekdFKGpDCisocng2PmRuR3xzRiF3VT5FeyEhQ3Q8OSE8YUpBcCF4P2VBNGhoP0tHZV5PMnNQWjI7P2JGK2BNdHRJYTNPZHsoalVsMj0zWXV6bEFUS1EpCisxJXRPdDs2YW4xRW5MJlRFTkJYYzVvUUBrOCpHLTVUUHheXj09WUk9YiVFRFhmSHNQKV80Kko7NjJlOWk0IVRhaXN0YkVPOCNQcHhuU195CitBRUt3emR2e1N3cEdZWj1XUD4qflcrWWdnSEl2fVJZTTBlNFZMT1ZWRXhmY310VW8wYStudVA2cEFmU2I/ZTJ0WiF6XiZfZkNlYj8yRUx8CiskPmIyX2BeVmQmezdgZEtrIyUqdE1EcEF5RUo0WnZHOTdEcVEtMGlFM0ZWeDEmfVpwMzw2cD1KWTVAJHo4cWE8OVZEPkNHMWFQaUE8YFdxCisyU3FBZzs8O2VacXJoJlpCalNIKCVzK2pNSEotWnhpTl9KZiV7WW4+YzAwenJUY31JVHVORENqP3R3TXckV0xUYCY0YzxYVDIpPHV5UUM9CithR19NY01nOz1MSXtWZDtwd1Z6dGlQO2QrQGJ9X1Y+b0NuWFMxYW85Z2p7ZipJbWBfYTk2YnNZdlZZcz1gVztEJnI7SGR7WEkoYExsKlBSCishPyp+bVZ7aiZoeH5vJno/IXZmTzJAP258eXFSRHY4cWhQLXNHRWgqOHk2eTdqbj4wJT48Xz9RI35ldSh0NmhjMkZCMH5SdndVZHp8SnIqCitLZkdEZjRmQmRwM3UzJVpCU3gkO2U7V0VINUd0OTZJMHhBZktxTjJHViVBaEVsRnlxbyExcGBWTkhUfHx9WF9geWZac2smYDNHU00/cT9NCitfYW4ke3FlbHA3Xl58TDFkYD1OU2VCdiViQ1dgK05VeTUxaEk4eCQ4T1NwMVlwPSs8UT5Nem1WezY9ZHVDI1BpaXFUdDtFTUJvWldXMlkoCitOc3laKDUxQit3TTdBVlo4fjtLS1FlZ3JNdWlwUyZCOz8lS0N6YHt2eERRKlNqa3VTO2cxfnVRRmp5V2NAMFdXd2JwamduaVJwRTwpPHY0Cit1WjZuNT5YQTN2ejhqUCt8c35uIS1oPjkrSmZlTl5EOFQ7TGU4SSRXY3x2LVI0JjAqbU19fntjMDwoNjw1KnBLVWFtIWdifFBiVSF1K0JqCitNNlFua21nYTY3NVlZSGR7d0VkaykjUT9CbGdsV1pBazxHTFRDY0Y5OE85XndnYlFOZylFQi0xQS1HMkdOY0o5eXItZl54Z2I8Nmt3YkwmCitZZUYoRT02bUF0XkVJbFQ5ajBxTjEoQXdKMG1PREJ6JiplQytxOVI8YnAzUnF8PE12bCpMMVMqQmslXz51SztLUyR3ZDg5cmVGXmN+Qm1VCitsKHF8ZDdONSZ8fVhoQFlxd0JQREl8ODJoSkIycWxeSyNCUyozemsxMig4YCpnOyQ9YHAhYmxjQ3cmMnEzPE09PC0zJWtKek9TP2dVNWVJCit9ayY8QEF8Jjx1WFVnUm0mUnVPbmxyKyR+VXVIQDJhYEJQfjV2QlBDSzs2VlJON0AtbUBlRStkZihwI3goY2I2Q3NYcnMlUytvPygtdkJsCitOVUsqVnI3ZilFS0c0e0JgKGhROW9AOGcqfmRHTyFSfTZ7VmF7RmxlbD5WakVGfShuYkwkUmZxVFlxNUg7dTBTZnRUWjsmRXtCJFA0WCglCitpYj9ZJT0rIW5XdEZiK1kqKyo7PHBBX0ErYlIxQG5DJWZ+UlIteUQ+YkVaez10OEtAVkNTVHdENUxkNHZKNDAmaXg1KGNrUTl8Qk0zQXh1Cit2PSpzNSQ2TFJxP1N9cWJneTE2RXlKKTNKMStQdH1UTFR9dVgmXjQyTGZufkpWQ3cqbS0yTSRWMnUtaUsrJVJpMDlISWZ5aDE4SDFVSWF8CisjS3hLRj4hTXgmJDlEfDA8PEUjOyVPU2BySUd1TUE3RHp4OXJDQi1gRzsjI3htITUyeFkwVHZjSG9fblhzTypqaHE9UVF9aEEkaEQjYz94CiszVXlaRzZUNEN1SmFodjxRK2ZlUDZmTmckNiske2gmc0VycCM3V3ZvaXJqZzJUOGhfWExtandzYDl3en4leF47fGAwWVRuUX0ybXE3Qmk+Cis0SjQpK2pRe28qNDc4NEsjamFNd3htJGJuLTZkcEBoNCZuXnV8VUJjST1ATiQ4KmZXbVc4P2FMWlI/aW0pVmBFZDdZXld7NDk5MXJgTk9GCisyTlM7cjRWJT0yPWVTRUozPkJBQlhzQnwkalVxfn1OPFlUTWEtWGRMRk8tPkFRSk9lNFJfdjUwJDVveTd3X1o/PUwyXmIwXzFQJE5MbjViCitBb04rYCtQamFjOW5eJjtgam93R3tITi1XZUA2Vjt0Y2ExUVVKMil9KjlxaWtRX08hKVUrRGRTUzZZbD0oak1YUz89NjNBbS1uWVklcU5nCit9czdGWWgmb1ZQbSsrbmJ3fVREI2ZlIzRSNHAxMyRhfHYrWCFgRz9RNnIraV5YVy0xcGpjISpufVIoVTxJXyRPWHM1UD8jZy1NQH1CT2FPCis4TmllYnlgMkZXVnw5UkJIK208P0RVQGQkJUxHRXNZZHpuckUoO2stfD1HR1Fme0s/aT1GVUlgQWFmSmp2R2xgaWJrdTNye2ZIZSVuI29TCitJQjN+YzVpN2BjRmlQb093JkQ/ckpYbnpzK1R4KWBhXkxHczxGKUtRUD5oMT5QRG1nUF8tMVBzRnMzQVYhU3Aldz95NVJ7VysrU3FDSCY7CishfXRpUjd0fkFNbGZ1Yjt3bThLQmBsWkE1PjZmT3YqVT5Ndm1pMD9le0xOfVVmQnQmeHJyMi17enN0X3l4QTt4KlRQMSN2aXtDNWFfbXVjCit1Q3c+cCgyOG9xIyhORWY5cDxsV28+ejklaUpMVnozSiYoejY9PyFgRXlYOGlXZShBQGl4VygzWih7ampiUT01X3ZjN2VsMUB3LSN9dUVwCis9T3J8Q0QlXz1RKXw+WlRhWWs4dTA3V2IyOT43JWR9KSpTelZIXzl2fmQzaV9XLWJAZXxZRWxLflFjR215RThUeX1yOz03KjRVUWVgO3ZfCitFZ1dFTk9wMEY0a0x8PXNvVmxmaHE/RiUxPVo0diNFfnUkRkVHKnslalE1OXxTTW9CeT1qVXh8aEc8dSlDQm03dXB9I2g0eUQ1VnU7dUJWCit6UTxje2BSb2RrTEg5cys/QiFzQjJAaUsock9hQ3o2XzQjTHhpZzRfemcpX3ZxQElmMihNdEZgfmd8NHlvWnUqPVVWQXJrPClEeyhpSSNpCitjTkhtS3Nnb2shJVlYMmMyKE9CPDNAV1VlWGZZTDVXbXRSKXRFUERzQU1qTDI2MXNAM3AyI21lIWBqTzJTSnwxbSpZYTA5NzV1JStVdlN0Cit9PHFKZkBqU0gpXioweVBkYEt9dTRVND90eDwlcTxpQD1PRy0zWTJeVUI7UGdnaDNjbiNwenV4Z0QoV0xGdmYybUJASUBNN3YzZUV4M0NuCitiXnFLPzhjK15lWHFRMmp0R2grYjVNIVNqV0w/R2RGY0haISRCYnVPPUxFUiZ0O15fMEtSMEJsbjxJSm52bSpaRDxReWgjOGFrP3RrJkRuCiszSiMtYT0/XzdSeEN+UWYoNn5tV1ZkWi0mJWJgUyFteHtEVClKaXA/SUhIJHBUbUcydC0mY3gwaW4tXmdmNnI+MyNPRzhxUkhIJlZKVSR2CitiJH1vJGNhWGc5QH5WKlhOVVZXNWxTVCR5PWBRNSR1ZVo+UnJEKj1KdHJNJm9eVUsmYjVVPyoxNzM9YCpNZTNhSU1WPCt1RXJpMWdgQGZLCisrNld6YnYpe3prP0JXbSNFKGkkVGlyPC1zJVRGbWZxSGhVKj0hYyNLLXVBe2BNT1NXT156SyNza3ZrWCpmZWdJWE41T0J5VlcoRFVeJG5jCitRR2BEIX40YjFQNUVzZnR7PkBNQzE2IzJTMGcqcGlTM0c8Nz0oRkEqNkY9b1dBd19ZVjFQP0lZZnI8RGpsRFRHOSUpYnh+VkYqbVFONkpsCitMS1hwYUlWd21QJiZoLTB+bnJXYGYkUVR7WEwjY0t8V0QpeGgkTHc4Z3UmP3I2JDtXX0xrPnlGTH4tUVRBIXZoTF8oTVIpV0E3SEYhe0VtCitfYlZgM2x8OU59KVJ2P0wpfjEyIyNmKFRvPDQ8OHM8UWpPM0B4QXUxQGVPbmwzYShmYHZrMzFXOFVTYWY4TjRHXy1EZU01ODlxelY1Q0ZrCitaRGdiKHJAYUpCMXUhVTFlJjY2WT5gI0EjT21fVGFVfDxxKU90Kj9DUGA4JCo3Xkd6X3M7Znw4VjF8bUlsbF5CazhifEVsOXMxQDgrTmNGCis9QEJLeFlpfXI4bypLVH1zLVdkVFdURUE4bGVJaU1EOCteRmo7dDt6ZXh8MC1gM0JTXnEyOzthNUQjKl9EMXNuSGxDemQpOEF5U2E9UX5CCitxQmJxQGRhWVMtUyZSVStkIW1VNlFZTXp0TUEpTTRhO1g9KExfKFNDTm1GakMhZEUxKkg9WmFgRSgwP2B0VXdubkM9VT4lQSNFWF9Icy1BCis7bG1vR3Z8TiorPFY2ODl3fiZySXd+UCFBX2JKcGN4WHBvT0pfPT42YWdhcUEkWUgzP2R0Vng+THhEI20rRi1MfHhzRUdDSVIoRCswT2paCitiOXRsOFFGNkFGKT1eYGlNfW5iR0AxJGc8PzYmVEFDbGhRRH1ZfjY0OTx1R3w3dFEya3l9UDJubXJqS09rY01oOHNlIUJEJE9UUVdzUkNgCit+Z0VHPCZWY1QtMHJGX1N2SyFSRSMoZ3dCUG9CMWsmd3s7RDN3RU1MclgtJVdmPiMlS2Y0UmBZRCojKV8xN2pPUC0+QGtHaiZDWFghdGFhCitOLU8hLVJQYyU+MUJJNVRreX18WXdfZiVXLWJicFdUbmV8TUxReF5DNj5CMHVWWGV2SF9uSmByeEtIWCkoUT5UfG5TSz9HKjFCMytQZzBGCitZRTE3PmxCITVheS1uSkRUd1YhQSh7a0RwNmg3aVRJJjhAeF80QGpOVEIkZD1GNFlXVGdsbnQ9KzVraGJBNGN+d2B3eWhZNCpfSXM+Yj5WCis+MjUrYSFXaUt8TlNMZmd8enZidE5sKmhEVEI/SXgrRXZ+ND5FK1BsfEh7Y1BiQChYZCUzK20/eHI+RSFHYm4tS2gzNFlBUyF1TkhOJXprCitVQk4objVVa0pXO1QtZWZmc2ZnMGxpV2spNkh0M2c+UUg1bngyfCReM057SnF6Y0hqNExgekhDbSNHaSY5a1I1KW43Ym5qWEJjblNuQXZtCitXTzQ2WmVkeHttQVdofCs9fHZuc0NyPHJTM2lwR1BQbVAqaUQ5TnEpQ3dBbjFZUnBDbWQydkhOc0pEY1BxflVRRDg+dVdefXVaR1JxUyVMCistcj1zKT1zS3BESWE2Z19Qd3lvcio4NiFBdmspOTJ4Tm90RWJ0VDlvTkw/YzlkVD94ZVFnUHxANXo+TX0tWFE3bz5gSE82diFvKk5EKkxgCitzVk10NEU0VSheVHojY058MUJHXkdAeTBGXj4pblp5dTJncz9QUCRzKm1OQEFlem8kTGM9b149YFp4bVFNdmZeSSpFQXQjSDZtUVF7UikhCitvJHJgWH4+I1F7RlhQaUJyWndoJVpaK0hnMHM/ZExrRE9HflJZK1FKWXV4MlRvZENocXQ5I05yKWVAci1FemleQXJPWHJAX2xrNmwlUk1ZCitubjRqMUFgbCNwUlYyQUE1NU5MO0tHKnJ9ZHs9T0Recn5jQUZJRFElNHdrNHB9UWN6eEM3aFlmK3dyXlFTZzxQeDBrV0tkZzZeUSZAY2FpCiszMkljKFVkaShRcHkqLTEpZEJaPDdvfD0pWUx2PnA+Kn5PLXJMQENBZihsO1diYEBTJDVVQ0FRWnBRLWVhPj5mTkwjdFF5SUFfQlRpO3kxCisyXlpeRHVpTmtgXyg/KjhHQkd+b2VBezJXVSUpcWErO3UoNFhXflJxKEZzaDVLUE50RktRKmJEeX5SYFZ0JDw+OEE5TiRsPzM8c0dQOCUkCitsYi1hKzl5eWhGeGN4a3BHUyFndEhqemZ2e3c5UT8oYyE9e3lFND5QekwhWl5oLU5pYnhhNWhhXl5ATCRBNSgrI1NOdF9VRl91YX0wa0NNCitAK0QlQH5qckA1TW43ekg9JDZ0bExPS2M7ITJMXnNtMys/T2EzUW49ZXhRRH5jVystNXlaPT81PFcyU2tNTGNUK0gkTzhaSDhtZmRWYiVzCitsUGtSI3s+X1NCVDN5WDdueFpqI0M8TigmX3R+OTJAYTFEZjYzKTckcSs5c2koRzliRzhlYncmJTZrWkV8T1lvX3gyLXFiWkpPRD1hbHBxCis+OFcwZSgpJW5ieHg5bUx4cEVMbCR9d15ZY35XWiRxcFNveGEjaF9fXjJHdWJHYCYkJk5RP0NZZCl8fl5TVj96Qz1xdSpjdXxDVyt4RWg8CitgRE9PVDdNO0EpSmsyWkxnJkBLa0tQdnBGQG5nYkkwKUVFZ0N1ZT5NaEI1dURobEBZNj14cDAqSzVPeCthSEhrfkAjbntRX3BARnJKbkxtCis/WmAmU3R2aDBHWiNqflhDezIyRkdZZ09UQ0glcF9yWjZvP3dlO1lZYGh3Yj9GbFo4OUh7Zi04ZjR6P1hGSlBTWFVoKjt9eVdmaDErRFleCitIelJ5fFRhNnMmQkA/QD57MFU0PjdjMTUyP215aW4rVz1RPFhLQDN4UGY+JTFXUmFfdDQteVgrQVRafk02P3M0a3ZwYTNRI25TT2A5dFh3CitPaXQmeSRYa2NDcSo7K0FwRD5BZmZVVlUmdlVTJD9OQ1E9a09XOUlWU0VoWS18N0YzR3N6WGlLbCk0NlNxNTJGPjA9fEk9c0J2YFAoQ2BNCithRWEhY1A8cXhSP1Roa1NEcVomeEBkXll7blY9Qk95YXcwdHptVkZfTGRKfWJxZyN0KXdgSkdFfCMrPEc1WlZMZDIhNCg2cGcjbjlgTzV+CitRMShvM2R0QkBSNTByTEh5VSVzNElCV2FHdWt1T0h4eT43eWlvezsmJU1fKjZaZFliTXw5SCgjPkR8KSNtTmckckd7YUY0T0QqRXRTfWFACiteVSY5P0lvXn4mYnhQITdIS0IrPTJ1SW18QT4qSS1UVyUzUGxWfWQ8IVMmemp1JXgrdkRvcEV9OTtteS1pS04pOEMhQEdVTDwyNHJtQSMzCit8RXBrQXBRK3RLSzh2QHdrOyZmM0ZqeCZLcncrLS1YKl9CLXhLOSlfRGlUb1VtT09eRzxRK3VyPEplMWM7YWhxe3l1eUAtWH41eDUtJTZqCitYa0wqKyFAUkk0PEg+WmkmRUdgP0l8TEQpME52WWM0KjIlSigjMF83ZE81WnBIdlBhZ3J5JE1fbmR2dm1Qc2lyVyUqOStGdmJwKyV2R1c3Cit6enx8a2tkcD1ldnIjT0Y1KT1EWHlWMXBydXB2MSVlbjVoOVRsIyYtTUdPRzBnaXR3dj1Ucn55OUJ2VVo8SyRPSUN7dXR0Pm80ITFVVnZCCitiU1hTOFNDVVp9Zz01IUZpdTNGM3g/PGU1O2JDb05aJiQxd1ZOYGdLbXNxYjxZJkc3PHBFOHJPJjZ9Szl2Jk1TJFl0RUljVlo0ZlBROHJ2CitadENBezVjZ2pKIXBzbkFNbElZNCMrZT9PQyFPciVGPzM7Xn08bjIzKFlEJEJPIUNLa0xkWnE5dHJHfj9KNlVEKCFifG1eX3QqcEtoPWJACitMd2tVbF9geDJ1YXk0RCh3e3dZak8+WEM4YnEhcT5HbCQhcF5iY2R3NjJyQ29NTXNeOzlsSVlwS1BHUmVXeG5AcFRhKUNIejF2cGZMUG9tCitvUSpWJSFVQ1AzT24/YCMjeUs7T3Z9JntWc0RgUmRsV0dgZEduISo5djw8aWhGKVZpeUVKVDJNZFpaY0NhPVUkQyE9WTBjTGImckh1TTg2CitMWSRsUjIqdmxZTjJEakdQViVhNTB7WCk3fjcwYDNRdXVYaHU4eXhSb3VkaHQ8IT58Sio3S181e0hSKD9UaHg4N1VPY3VpPyN1KzE1WC0xCit2RUQ9SiZoTkpedD88e2opNzthZl5Ga3s2ZX1JWD1Cb3s9X2RqTT94JHxDOSN2PUFkSy1FOWwtb3dWMFJjYjV2KXtHcnVAQyVNY1k+TnotCitKa299XiNNY1lSVFhyYjkjYmhVblQ3MjIwOFhrUT95TncoZGhPWXRmJEwkaHxJQEp4USRnfms/aE1XZ3ZJTzhyVzlCWjJ8Y3VWZkZTZWtGCitTaGBqeTU2MUpUdGFwe3EkSXJ8ZE45WU89R2F0STN7OVR9fTR2OVAqZmU/azV9RiZvcCNEYDhvNDlxNz4oZ1ByNzVSdEJVdG9Wciltc0Y1Cit2dzJIcVFDd0g9YU0kZHcjeG10bzJnaTg4M0AzNEg/VF9FaUcqS21iOTVhKXFRQHhkeU1ybXo5RGU0R3tJMzBlZnF7JnVNWiFTSmJLNFJtCis7dzc4X1MtK213cHxIdUA3eSpiSyQqUSg2OClAfk4wZFlMPlUxQzlwIXNwV29fLVkxJWRQQ2JlYSpeN2xzOWU0bjhVVFA7KDcldW4+QS1TCitkbGlreFBLQnhOX1VsPnJRck9kZU50biY7S00yIz97O2U9dStySmQxa05wciN0JG5YfVJvUDMwPjErUSRuQkRCX2d4VEdgUit3dTAzU255CitPaS1wPFZ6RUdIWWAmP20kKmJCMUlpa1NGUmxpZXp1cVVAUSU+fU5MJUd0TkYqbTxqZnchVz8zYzd2XncjdkBsMjZMeG5sazl3ZnxFZGs8Citrd3cwOU99aFcmbkY9R2dCTXJwNFl1bkE3Yloha2xVVUp5U3dLbCg3OSRDY2UldTUqQGElO3lYd0NTSGc8PmkwdWMzYilqZldnY1Y5KWB2Cis9MGg3fW1GaGJ0JFlYZz4/bjIma081blNteX5WX0hvJGZXSTdIT240ME4wN0dTY2xMTFgpeUUzRHtwP0wmcTJmVCp3diR+YVROOXdJeiYpCitQZGIhU2FGbj55XkZBKGc3clJPSnFAZTN1O1BxaXlOOXNhZ345P21IYTE9cV5iNHl2Ymx7d0BSdG94c15AXlpoU2dRcDYhWVohU2AjQE14Cisrd0VAJkR+PnZ+dU19MiU2bDtHekxxLXw1OGAoPlEyUmBBbSZsYzkhdTt2TT81M0NifjYtJiRaKFpaXk5iK0VBZCFyRTZAeVRLWUZ0aGo7CitCP2t9dXJTaTE8VDJHO3c4UlMmRFR1IWd8dUEqPzE/ZjEzPHo2cyh0b3dJOGhLQ2QoK3Q7cTQzSWtwU3hfIWlwPWw/V012eDlNJW9PSXR0CitkO2c+QHtmJVM5cVNWYD8zdFpXJj1+V2JfYjZSeTBucSZ6dmwtP3NZZU1qRk1kQE5pSDxDOCFOakVtdDUzRmtHWmwtQUtAfXBWK0AqaVF+CitMNTsxRER6dmNAXlAlVDNlc3lNdnFpRVVQfnpAWj09VVYqYDwxdGFBfEd5JGRGd3dORz83YGp+djxNeGE4OF89d1hwdmMxdGNRcXNNZ0ZXCit4ZUYkWXhJfll5UjRMNF5oUz9gdmRjb3JDQiozUWpPO1I3YXhvYl83UnhSZmwxcjQpVzJ4LSZofigxRz0mP2R9PV9nI0sjdTxaRiVoWVFwCitJWjxEMEZNKH5TazJJQShJPWgxe3kwdlk4ak5ack1YYClXK1RIIXUhK3dORF4mJHhZLTNyJjR8Tj04PSZrTV59VDZRX21hN1BufCRUYWEzCit1TD5vTjE4XiZLZ1VlQV83JEwrb2dHaCFNSGBTTElEMSRDd0loUz5jJG40RCl2Tj5AYypGUlhJUyl5PEN6X1lCM0VvWVVeTTt9a2FBUFU4Cisrc2AjdFF5MGNeSE51d1BGbiNMMjEyOSk+ZXYzUUlqcHFPYWdnJm52O0J1VU90cDUrX2FLZEB+JCU8fHx6fGpKaitLKCRJaD5GO05PMmhECitjdnZmOW5xRWY/e3pEWG1QeF48c248TjNYV0sjM1haUHdkVE56fmN6ZnJGOzxfOCN0U2FNOyp9YXtSKjgrS0MqfGRBQEZhQW9IUn52NndDCitobG5yJW5TRTtSPHVqNzgqVntmSS1IJlloU01tSnZaIT4qMXopJShDSSpqSVM9fCM4RDtqYURPNUVnRG02UW18I01VTEVBank4ezE5OGFaCis2KzE0MXV8LSNubX5URlpnVExhZDEzJEhRTz83PFBTfkYreVVXbDxeeEIxYlBOSiZuJj0xe2w8YCsyYmspVklFQSVBaTNgZFNWRVFrYj9ICitrUXFhQ2UzUklBUyk8TyFyWW93cShxPH07S25+dzVsaHNAIVh4S3ZFelQ9cFpYWll9Izg2Sy1NT0AjMiR+a0xKNkZDcm8wQV9JcTlzZ0tZCisyemx0MlI3M3BUYlE+SmsjZ2ZxfChLKkFuZVpIWXY9eT13UX13PExZNzdjTUhIUVUleys4WV5vNXU3fjBwenJrWDd2TmleUnVVYmVPfS1rCis5MSMrVDd0PDt6TlowT0x9b0ReeUsweSF1K1hzK2Y2Zitzb2xCaFZyb2FATTt7PERXYFZMcCNIJCMrWCZQMHs0e19eQW56M3hFKV9CP0NNCithZWZ5TipyZVFVTHUlYXpkQnZud18oNDR3QitwQEA+ekhvNkg9QCQjdjlYQV9XamNfSEFKcGlXSjk9T2Q3RnAwazlLWSZjfjZSVDlJVihUCis2MmhnXnVAT2Rgell5UGlQLTQ8Qjhqe0FoOStYJXp5MUNje2EkMjB1WGxXZmh5MTdAZV8mendeKUEpJkhZbCV6Nmh0aX4/dTxCOC1WcTlUCitOdiNfRShFLW5YdDlRXkBFaUMhIzdESWR3QGlBMF9JTDd4YHZaPntXPUM9NHk3KjZwVSUhYD5hNUhOMFIjQmtje153KiF+MFJiIThDeXlxCithPzx7fW1jRU44THpYSjQoYG54KmxmeVdkYCM5M0FlbypTNTFXQmwkRyQmMjRIYzh9Vz5kbUFMIXY9eis7JUZ7Pnpkek1BeXZiQ2AhSlNDCitoODI9VDM5Sm5wQmBzOV9rYHJQQzlnJjw4c243WWg1Z0RhRE5Ee0NkQ09gYio/N0dyR1BsWWR5O0c2PX1STTw/UW1Scyp4bWxgPzMoKllBCitKNDlKS1dZOX4oeTl9K19JfEx8KylyQV85UVR2RCVKLUF7ZU5yO095X2hRKGx5KjVUWj0kUU43JDlHezclR2JJUGgzIVhQYV5oezUzKmxBCitSNUxmVV5nekMmSj0wMmpEKD1Tfj9QX0ZheUNJeExTS0h0SVFwcCFMbHtSeSp0KWo3UWhkM1A3YEtyPl4jaWdeR0NFek5ZVG8tQlRqT3YtCista1BtKjNNalktUyZnJlp7LXY+YUNaREAweE45TmtKKVk3REl5TmxOdz8hRmEyKCpTX0ZIKnptNWI5dTZuQFk/Ty13YVZRJD88WFIzcilyCitGfGpNIz93eTR6XjdhREJUdDUrY09yWUgrZGtxKTEmMURLNkh8UDB2fkdGU0MwYUIzIUwpJCs0OW8jbSh3blNtc3sxLU0jNUs+dHtCYTlQCitlMG9VK0l6NGd7M1kjdTVUQTdHV3RCfU8xTXhtS00oPkc+RDJZQCppMnx5b28yJm5rS31RWFR6NGI9VTZsVVQhWk8jMnhlN2phTXhUdWYhCitrUjBEe1hELTltbmFpayp4bCVWQjR1ZnNzNSpoZUJYRzNwRHBhQiFOPiFxJFJYMXJvQXN4JUEremNLWi1GKWdAUkkkP3ZnUEVtP2k0WmVKCitIXyFkcWN8VnBvRkVQOztANy0qbEJfNWN9WVE4RHJ7WU4mY2ZNPUpjPWJtaEE9fU1TJkJGcVoreEVPeE9aRGphdm55YyZnaENPODRMQUtxCis3KTdFQ1ZnWD43KEtFcjhDNkt3aDd4dnRtMHZYemEqZDJ6TD8/KlZhaVd0XntmdiVOVXwoYkAhOGFhfSpOLUoyeXxLTz03Z09aOUUtQ2ZVCit4bzlVVnp0eXo/X2UpYz1ofk87ZWdNZiZfdnwxayh3Z0J6VEVuSjs3bXVpditJYzhTXjJ+NVgySVVBOz08X098WHopMTtHYWRgdzRDbS0xCitSK1U5U00zODd6cEFCI3Q+S3Q5dyZII1U/YWdYMHlfY3dmemxeMTVoTV9kQkNycT81aUJIbGlRcjl3alJYZT96OUcwbSg0NkxCSl9LQ3wwCit0bGlBMXswKGJKV0I4ayFSckomM0JEb3RpTkwqX3U/R21jNU5IVFkxaEU5ZTJxcUYoMnloazBhfEV2dFkkeTFGOzJnbWZmPGBucXhjN3BACit6d2dpQSVHMCMyQ2liSnojN2RgeypwT0ZEWXxKb3whPmB2ekNmMjUjPkRFWTImLTM1MzhWVkQmZWhmaipIdnxWNmlfRmZBb31PKz0kanUmCithJmRYeWdsalg3VEVTdSNyR3lVfnNzVnN5MzcqbFoqbkAldkV7d05xNSU3KEIkdE93SU8rNU1UOCNqJDlTLSV2SnkjanI+PWtWT2ZYe2A1CitQVCtAZEsmQVBiPEJxc1NIfiF1SDk/Pnl2OVghJVE/PWhOV2EhZ310d25KdDg5YGRweUdDR0Fxa3M3TTR6IW53ZzNxbTtRalNOfkcwLUg1CitLTCVOXyF3bnEoQTJ7bDVaa21IaH1mNSRBYCtBViNUdXY1dSFlU0pjRWYmSEJre0xUemdRczIqU3VocCkqK3luSlIqOGBuM3xMZk1kTUtGCiteKzhEWV5yY2U2WHxBKHVvSD16SmhHK0daPU9oSDlQeFl4eHVqQVd4I1hNMENlVHxKZyNoSktNRzdAKCE5UUwycSlAemNfTld7I283fGZjCitDelNMTkV8cUBBM3hCaG1yOzJqM2l1Qj5IcUl8UE91SkZzRHpZSXFWRGFEQFQ2QzxkVVFxM2dTSm5AY0BsUE8mWmNoQ2p3YXojIzdheiZWCitJcUZnMT8lTWpydSUyR3RtM1pIcmkrUTc/bjNTJWFtUmplRTlNWG5pPytDemVTa2I/MEpvU2daWVFaSntuMWRmb05AdUdCYzF1blVAVm56Cit2Xjt3ZiZycGk/UHhyTXY/aTwoKStfRUo4bEExaCp5LXR0IWVQaHZKVHglVTRRMGdHYEI5cktCWEVPZWM9ayZCeS1fPG0lUylIYXFiPGxGCit9ST5tckpoME44KWd7OzJQQG5lfSFEc3I5PHRZTCV+Vm1UWVZJeSlgPWZMWkhwNCREb1MqbSUqRVNyMFh6Vkh4N09ESHJ1JlFLSCUoQUBgCisrOFBpZSVpbH5BRVkkKEZYazhJJFMrNWY2dztrYTtkM2RMUmlzZzAlfjklTk9eUWwtbiFrWDV2UGpqO3JWR3FfJHIyXktxMiFjT3ljS19jCis3SlM/QyZaZ1lWR1I5SlUmWClicjNRaVQkU2J3Xjs8cHxneXJTU3JAUjQxOWFlUzdja0J0UH0xbFBSfXk+N3ZIdmlkMGhfWk5USXxPI2lSCitRT1lOTGUxOzEwfClSbEI9PkxHWlZFIyNxX1hoJGNDSl9qfTM/Qkp+PTRZJEB1d052QHJJZXJLcyRzbyFzUUBtU2g7aXE7Z3BGMi1DZz89CitZYzJxbmU1VGpXPm0pTHk1RkdMVU1JKVpec1BkJUIzSjYxYEs3YUxFPCMzS21rRilMT2h5IyF2PE9QMnd7NlplKEgjZXQ0ZnJncVRZdnZgCisxPChUZnUjPWlRJSUheG4kbEFjUVNEK1BVIypLWW0wRmhuZUM3JG5mSDtnYUpOWihBWkhAOzBsMVVkZmVpZ0ZsTmpMfi1mM2JGbDZpVk5qCittT0JgTGdveElTQ0lLQW5NR3RtMns0bVBFWn5lSEdoV248VCt2VVh7ez9Oc01CQV5sM1gjbEB7IzMtZCtNfXlEdlc9c2Q7UHduYmRzQ1NZCitKO2ZobUE7ZFNOSlZBdVlsPjEmT0hxeDNieEgqa30he29CNW9rTyZ2TW0jOWVQTjxjZExEMmt2e1paWlcqVWo7RnRLWTRFe1lXQmpfZzdUCitVVStvWmNvYz4oeUBYdEJeVkBganJjbGY4b1JzQiExfE5udkspLXMqPS16QDx5SEdnO2QpUkYqfm5tXlkme0h1fEd8TWMmVj0qTTRjYGc0CitBQl9QYit9V3g4dj4tem1Le2JrfXRlY1pzcnNJZ2I/PDYraXlPKz4kNDReWDR5allUPUBQS21FK0omcHAzKiRxTyRvVUd+IVE2KSYkYHdSCisrN2Z1ZGFSVl4qNyNwPitOXmV6NUN3Iz5vO3VOXnVkUThaUWlvPTw4N3M3K2pzMlR3Ul9McmVmdkstQGFlJXJobVUtQV53e1RMZTBsdDw2CitETG83e21yK2gmeiR9NC0xK1ordSROemB4Y0s4d21ud2gkPD9AeFEqUkVJbmByRDFfLSowbH07X0J3XihXdFIhbGN2cEB3YGwzKi1SaUVwCitUaTxoVTg9dG9BP3JWU2wxMDdUa2NJQFFheGw3az40P1hQSHkrX1lwWVg1KmhPXntabjQ+bE0+TGNfdk1EZFdiY24kc3BzT3JKRDRCUXE7CitJWEcoNksjWDVEYF5janppOTVzNE9eNE55YHwyMT5nP0VMPn1gdjBmJXxCdnx9KEt8OUt4PS1KSkZ8cXlRO3MqPiY3JkpJPiRrMVUpISQmCisrS0B4TmpKfDBucUdMQnBuSWEqS0ZCKzErTFBiNTM/I25kflhzN2RZOVVhPFZVVXZNK003fEoldl93MzhqekNAYzAyUElqISRIPDhqNGQtCit3NDRxZHg8VVRyaFVZNkR3dG1NdnV+OGNaTXwlPX0rWnduSVpvJTtvZUtRX21XKjBqZmRpZTg2bGZkViNYbkA1bihvZ1g4P191cnEqI0FECis2ZXhVRXtTQzMkWkg5VFRaOTs0VGc5OWNQcHBgfiV5OEgtJEMye1I1dnghYzAhTkdtJDFeUERfYVhtclZvanhIZD5BV004ZnNpNWQ9KHJPCit5Y0IjQzlGKUEzZTVISjVJUHpCVlJxfEJ3S3tfZDdjQUcyYUpgeFVuMWh6SHJTbXs4QkpTVnAjRns7bEpzfnc4IzVETWt8OXh2dUJIRXxMCitKWnFEeTFmKSopMUJfQWJpQnxSa19CfGdyaUctUEhQQGBQfXQoJGlmUFBtYzxnOFQ3RkRfK0Z7MHk9STZeNX4kY0MyJV5tNiY2KHJPcUhxCitVZlBqJVBfajw7bVBuclAwa0QyQEA8M0QhSWRfUXF3MUctOW47cTk3eDNhPz9jX3JzUiRuPCEydDNZZlpfTyFsWXlnRTlIYXFrdUs2aVQxCitXP0pQYG52UDFNdnxUYWFkeEMjaFJPJUJHVHhTbj1XaWFDUiVneldWYS05WUw7MWs4RGY9ZUAhNDZ6QTwtKEVESGc7PEpjTEkkZ24+V25ZCitnWDIjbGhVKE52IV45bVFZYDcmIWhMOS1JZHxaPU4jXm1FbjU/d3krKVV3LU1FUV9rVHVQb0xWIVMxTnN5UUokJENATURxPDFNOTdFZFhyCitPZmRKKG99Uj5wUXBzUi15NihEa0h6Q1FHNEw+QmtYSVYyYyRsM2AxKUZYUXt3Pz9keXRHOWJ9YmhIUGFBVGB4ajFYU3IwaEJ4K1BJPC0wCit9cCluMkxSSERpNzk2TkM9SiZhQXluTkUpPGc8eUBEcnphVm5edyhIdlJ+aSkqSllGIVRmSEg3PHl4e1QyM1ItKTNQITdlIyNuYj8qKWRkCitMIWIxOEpVdUtJK2UwKlgoV0JxVSZDb1ReKkYreWFXbEQ0VTVCQ3doN3xvfVFDNEVocCFlXiM3fjdrdzU2aGc7cm55MHJVcD0/NyZJfDg1CitxenJIR19uK3JkKT1rWFBVRkVtSSN1bzZpWjVtRG1waGVKNkR5U3JIVl9qV3tzYXsjPUxReVJOcXQ1R3Q4K2ZPU1VSSSRERX15UGRBVVpUCisyalZrSzxJfk4hMi1XRER0SnsmbU1TSE8wO04pVClCK05Tbz0jek0lXypzPndBfTFXM041MHVQN2d7dmlfSVFLY3t7e1JITnxTcW9zcGgzCitMNnMmbHpye2IjWV9UfGJ2cGg+R3BgTDJaJHcoaEJnOzBFaTl9IXg9Qzs2RmtiTDtvMyFGeE8qWlpXSEpxPykzIzx7fDVAbyU2YW5AbihZCitBTGFhJSpzSyNmZm5wTjNwTkAmZEd2NmR5Wl8waUxGczZ0NkdCI3UkfCUqKyhCNSFhOWBrPHFtJEB3aDgmY0B4ZCFRcGhuUUo8SHJ2N0I4CituWCUoPEVBU3QpYE1MP1IqRVZ+UkRLNUc2aTI2O25lQTRSTU10I2hhRkhuRnY8cFN5RlBIb2JNcEg4YUBjQldkQ35UUmRBTU0le2lTflZOCis9YjVqbjRpdStsTFA2KD9mcjJ4P01ZVVJpKCg3Z1pzNW90X1AyPDR8WE5HR0JVRUtpTCZmOzMlbCF5KD1aUn1EYzlUeSk9WURqQn5SN09KCitlNnVxZFlhMGRuUFp2cChDemFYWEkzZGZtamF5fSM3Kz9xIUd1aDZXO1hSQjlhKDRVTmp1V2BybjZYS3RvPCVNe24lZkJ1dTFJakh6cUwjCis4PU0lR18tYzwkdjhMen5hWmhWako9JGk/blh7Tk1NSCl0LWtIe019ajAkd2REQyRTaFM+JW4lT1Y3OzdGZWhpbz9afkxYPF92UjZvX1NRCis/cClyWlZPS0QreD1BQCM5Uz1mdVFiXmVUMVBOKkxqZTlyXihtfjFOVlUtXzc3YElweDUtKiV0cncoLVpQWnR1VVo8TCYocWItS08oSkhFCitDMz1Re2J7KXkyZlJiZ0F1c3hLOH01LUVXYCVjWShHMmszMEU/WWZMT3NiOT9ARCpFU3A8PTJATXxWZ0szNVVOX3c4OzJPVm1QV0hPXjRoCitkO0V6Wjs8QCktdnEme0Q+WktkO2NFPypZLWI5JEE4OFUkelA7MyNNRUZxci0kQT9wST03YktBJHI0P2FTP18/QSFacSRpMDJ+UGZXZU5lCitea2xzQG8mQjhfVzIpSlJvajFXOXNmbVpZV1ZvKz5XMjlrQFQhVH4mcEx2IzxKZm1tTzJmQnZIRXpGPG8yaVZ8YH4wKWQ8P3E/JigkPlghCiszKDZCTkcqKnc0eHxCSFRRSWdtY19lOFZ2N0B4KmsoenVfRWJIVD11eGIkKGtuN2djSGt6eVJBT2M8eXpNT3hPfVQ8WWtRXm5aMHZOPWRpCiskJDw5cnJqeTF6OXIhO3s9V3w/eS1jNFQlfFVVcjUjKHZxN0lPJnVmNnF3Wng5ZDNvcyp2Zzh6b1dZLXxUekN7aXxLYXokNmokSmdaVUNBCit7KkpKcChEP25DMl8wViRiODIzekFjMiYyWSZEVmc5RlpfVGl6X251KWY1Nk1uU1BjPXRRcSo+T3BHRFZKWEcjWEF0K0tIQ2JlIzlTKVFDCisoZi1gSG1QTVFfSkJoJnpUfXBRKiNBMkEjUVFtRFhCNy1EMXsjMnJ4VGV7TzFhRj1xVTIkd1N4JFR+aV9GTipRe01WVjQ7fk81cjtPQzJUCitAbyQxXmRDYyVDSDlMO2liI2tOOXpIZCtPWXo4bUtqeEtTUDxERDI0WTFmRCpNOD1kOUlAJCNlSW80QTJBXzBed3A9UWlBdjFDaV5ZSj47Cis1VyRYJEBVPG1edkdHeiY4ZUNhKDtFfXtpLUllaVVPfVFMKEFEVDUkQWU5PERlTFBLPkRKflRkUC0xSnFtND8wRFYpQ05RPEUjQFZtfiNfCit8dHFfYyNTVHZ9SyV1VGx0KD1ybU5kO343UlpnSis2c3BlYlV6aktZckJCenYkXmhmSkBNcjVUWD1BPnN1Vz9MIVUzelYpaXd8dnxPVFFZCitgYihMZ1lqOVUpRjttQFQmPzlgMFBtI0o2NFVMbWEhTl9RM0FnT3w9KHFqKHR8VUBnQHI1NUBBUVZRSDtzdilSLSlxUWUrRDAmalZrYTxaCitHOHhvZjxMYEdvfjF0ajhyKHNyb3ZXWWNsSm1rT2hxa1ZwTmYpYEIlMTFgK2hCPy1KWGtqSmtmY1JvMGxTUGA7MFpaa1k0RkZKIVYtNCh0Cit1PjQhSjRMaHkoT0ZafGJGO0k2ZkZ3KVE2dHdiQ0QlRnJ8TUA/ZlZNRDQ5N0lEMXY5c3xuXkBBIUokT0NCIUp9cjsrb0peem9Cck92YFI8CitWfjhPJGdnbm0zdnpSazZrJlZhYHcyK094PWJvNWhIc2BSWDxobCl5QiRne3VOcjMzR2lMZ2dSQ05RUSREZyZlQVZRKSRqTk0pOXVEcTAkCit2QmVQPnRPKDFFYUswJkd7UWt8eUlaI3VtYm48JkgrO0d0OHk7WkV0dl8tNXohRj1ITGF0Vm5pfU9QPnNELWJBMyorblNhfVZgIz1jNlMpCittR09HMV4xKVN8T2UyY302UzgwJVdJUWlFe1IlREJadiN1SXZpck5tS1JOZktuN2xJcmhMfDlTcEBATCskJGZiVUo0LSkqfXMzaCQqWUJiCitaYEpua0BQOHUwTzhKdDxKVWxVSD5qYnw5U3BUSmRoYFJUZCZCRG5gfWE3Z3VPVnBhdWVxZjtCWjZlYjh1YExeZntpZyorZSMqJTZgcTl7CitPKjxHIXR8MlVeX0piUnxLfjBsO1FwWk85d2ZnPCRuVE56ZHg5S2l1PFZ7Rm5ATXV8QmptZ0BXY04oUSNPP15fUUx0d3lTSGB1RzlLSnh0CitkNSZ5OENpQHI0e3pZOyt4R1dlZSslTClSRlUkQz5taCpkNmNIYm85Y1RvMktRdWc8MEViJjYmblprMnRsbEA4ZWhXITYqXz1mIWRDbSR8Cis5dClgalNveHVQMD1hMlNGeFlse3g8VlQ2MEBUckxuSzRjUG5EYDxNVm9iSyNWY3w2X0xgTXF2YDUtRlNnais8QiVmciVpNUt1QDN7UCFuCitfYFAhYWVMRyQmdkxSYlFJZU1GS20pSWZCeSFyd0VQezkzd2JQYURaU2ghQV5vd2YtTUI9M0R5IzxBWHFHaVVxfj5RcG4kK2FrVT1uKFU8CitnNDFLXiVkSnBnVnp6cG94MnBqUWh+TEgtUlNzQmRHZXEjM344dzFqaDtYNV9+fGducVZQODBZTF5xRCMwaiVBcH4mKlEzTjNiOGlNV3d6Cis2OStGU2AjIVVzUSNTTkJzZktJXztWQHpQQkszclNXRUI+S0BtWD8hNjw/dTFhU208MCZqeHFWPHQmSHtfYFRPX2JJKCpgZGk7ISpzWndZCisreUxjKW9FfEA3ViNBTFRrMTRMWSVFYlFiQU1YWXEkelJwcl5XVDhuZjVYJFR3byZxTFNYPW8maX0mQzh7OWwmPWBUMVdpM2I+eCQjbnMoCismSFQ4VUJBRGkpKnRhQGd6ZEBHcVJ1YVYzLSVUSHNBSCM1eUg1YXdENlUkKk1SRHBkcE4mYmNYPkNmVkZAaHY2ZStiMGRYNndEUjFfY0leCitDMGBedTNHciQ3NTtWSC1wUD5PbSpRb0tVZ2s2TyZFXisjM0dxQG8hSDUlOSNJYkRkdXROSk5GKjFTKklVRGVaQk0zUS0lYTtZWklEOXsyCit9RGEma3piZmd4KHRoclJ7YysoXnVNZDFyTnY1LT1rM2p0b3JBPCVfSHJ9YX0pRWVaWnNXZiQ7NGN4MENUUm4oKTdlQlR3fXJpNzM3WmIqCithdWBILWVFR35aem1KO0d6d0lKIXRmeXpiMX02YC1FPl5VUEtKSzx4Rmh8c158PDRpPyRvaDZ5VSVVRmVRXldzWWE0TD9wYUoqMjRZKGd+Cit6fTtTdEpIfiFoPG5HemdoMXJSRD1qNj9obUEpPHZoY1lTZUszIWJjVEY7dkkodzs3Q3FEUmVwSHgyb0J1NmFLXmc1SkdyLWx0RVpAYXtHCis1cj9YdGRLMHhLWVUkelQtIzM/QDx1Jk4/MzJgclR6bilOP0RkLWh+fmB9U28/Tmw3ZHtKKUsjdFI7aSMwM2gyTHBFbmQ4c3o1NDJfPzg2CitUfldUbUMwPzhgNXxXSCljI1dPN3c0NVB8NmhDdUdxP15yLV57JjYoR3BZMTBtZypGKmVMYndUcyRZMTN4VE0xVntESz1tUGg7NXZFbHA/Cis2UHV4a1BkNGVjQ2o8K1ljUSRhNnI2YyVFM0o4PU10fEA2YUxkP1IoZjhmJGI3Zl9LSkFjYTcyPkMqUlpIKnIyIUcmRVRIMnZLQF9WKTlrCisyOXtTQGxOU2lsUnE4YGxQeyQmeT1Qbig7U1VAKnZ8RG54RjRGJU5gQWhHVktqKmVYUF4hV1dfKkViSl47PiRvMjdpSjdXN1NVe3M2S0VGCitZMmZ8bDs4OElZcGdNIW5yKzFHbmAmdko9XnVRcV5BcjFXVEpwUl80eUR2I3xRayo1YGBGbjlkdEdFTSlEOHhMbCVkYDVtN3lSezcwUCRZCisrPjdtc2YtI2ozfjA/N1NoTDxwfjw9d2Mwa0BJU2F9JGJxV3JManxRR3syfFZOQUcpb29UNmlOb0B3YT93NiZLIXV8NDcwdmNfWHx5WFdfCitXeUV6JWRiJCh3OUY9Z049ZCY4ajw7PUFVKmUycXpLZi1+P18yRShKXyNYY188KUloPUY2QENHMkNmRU8/cTB5bCFqMVlRSWtJT049MG1pCiswZjliQiN2QjteWDY0VnF6a0Red0NGYSRAcyNCMykkPGh6c31hTFVvVHwqaSFaKWw9ZyomYSRheE55VGg+dDx4XjdjcmwqR1Nzez4zK0BaCitEYVl7RV5TTWpvWHpzN2h8OyFrcDEtWGtuSXZJeXshZHF2SDxCZylyU2xePnptWWE7LX0jfEtoaSolWSk0Vn11XjVvYmwxM0JOMiV4OU4kCistOE9QKUdSeDx5d3J2PVNeZ2RqR156JTlZQCVyXzNPaTF5KzdAT1VwMU5VeStmaXBLNSpsaj13KF52KkNpQkk1Pk4kfDxEVko2WWp4cFFhCitjPWpYQE5ZQmRXRDRQX0EjNWlCTXFNKH1SWHBoMFpkdXdpVihoIUplYD0rU0k7WTlCVVghVVEmSChqPUNkbmFPZjxiNEJ8eFl0fTZHdk5mCitFJkBufFN9ZjN9ZW9QS2FqbkNQJVZvdkxvMXd4aEElR2opQT5aNVdgLVdHbWRScW9XcGlNKXQ/PCtISk5xJG42dktOSXJIRG1TQD0lUWc3CiskTTNhKihyOHBLPXk/akk7aEhJMi1nV1hMJHJlJnZHe00yaFBUeT00eytXJmdSVVMhJTlqQCpyRyo/Kno/YW4mejNBJSFqPip3JTJ1cGMhCitQY3g8QmclSyh4Xi07Qmg3Rj1FK3A9V35KR3heWGQrY1k8SGRKITlZdTdIZVp7SSVsPjhHRXZCUygmflc1PHJNNkRMbHZ1ZlA3OVR7P2Y5Cis5c1B4fkdpU35TeGhPOSRYSUN5PVZCaGA5UyFIRDx5TUZ6O2tRRj94eXtMYWtWNXxgZGpwc3RmbnYmYyFxc3JjckR6SioqI1hgQTE4XzVUCis7OEdIJmAlb25pQHs5U2c4QTVxIzwpfCVwWHIxKXh6QTQ+NyNERTxoRktZYCo7PWRJWTI2bmBuamYxQmMkUXZBOy17eUNAa1RgMGJaO3kqCisoMUVmandOI2VhP0JaPlJXMkRFQEpae3wmfGVqXmRZN3s3ViU3bnA2QjxVMSs9KUw5JE42JjRtYG0pLTlraD14ZnhjP1Z3OGRTdTRobWAhCitvTGFBalojNFZmP30oI3cqYHR7RitueikpYz1aI2FDMU9GcDN7ZkBoUHAhYmMjUU47eSszOG1yP3c4RDFJNW18QlR8RmNaeUdnanw4ZzlJCitXKlk3ZU1zdz9RaGFLRURycGVJUmQrRVNNKTV+Y3s2e0pOXkF2dzAjWHNnMHBTNUhPdFBSIUsyaVpkQU43WXUjNHcyK252S1lvJko7Snp1Cis0JiNGIVhNRDwxI3V2VEVfYDc9PEtrfV9wZD08c2xRdjVpSUthUyMwcn16c2Z7JVZUPEtFP2wtO19zcE9sO0AmVDYjcVFNdVhNIWtQQVQtCitLNncpYiRDbiR3QWwpX0YqO1M4bHYqXjBBWXs1aVdhaF9oPWBJSj5AeHZ0UXJrPzhYdTloPF9pJj8/TGd5RGdJIUpLYzM9R3JUQjl4e3R9CitBKzNkTFZmQHdaZF9MbHBsTSNqa0xSPzxzVE85KlRiLSNlYjBFY2NKKipEU2pCbUE1UVY3UTJjb217fXFiQWpwQ25oaWVMTGxtTDZ4UCRqCitJSWl5KDVIdmlOIXRLdCtReyhqJFFnWGQ/Unx0Iz43TkwjWVRwUU0/QHZ9PSs/RHNYV3pia0oxSHFkI2dJNHMkQi1vfEQldE5MMW5BcFdDCitIdSQ1TUBHa25RfVdTfjUjaFpmbERpezc9Z3U3O2w+S0FrTyVic1hreGBLcEE5KGZiPyZsWWxUIVVuNmU1fl5IeHpERmZhP2hTcDNjZWo1CitSQ1ZmJF8+X0taWSlwNzteOEkoV14meCk+JmBsMXxDN0klZk08OC0hWjFSMH4tYCFVNzdkWk5NUjF1T2ZqYFdsN1g/XiRJe1g8MG5LTX4rCitUNzItIW0hOFpjX3Q/JDBTemw+VmshXm5aK0N4PUpHNH5VSjhqIWtaZDFsc3p2WD4pSiQ9RlF2M0FxVikhaS0qIzBTMVVqPSpafXs/PT1oCitrfSohYng5NHomVzFmN2dkYWBufV8kVnghfXU7YD08JT9qQVYrezIlSnBCYVRWd01+VztJdHxmO2NmWHFMVXpQflleU1I1WjY4IXcwdUlWCitrKW17Rjlebk8rWD0qKHJETUcmKXMrNU8jdk1LJD1YS0FyZTR2TSEydDRxcGlkdXhMVkpnUXE/ZD02ek5JPWtIWSVSRCteMiZlO3tIQ2VjCishVjF3QV9DbUpKaztVSUB5WVFxKEs0M3RpZ2QrOVlJO1paYSg4SnVLPXVIeVZ4bDQoez5qMDt5cWgjfmFjUnwkRmEoUDZ2RWR8MEhVMUkwCitBYSE2OUhfeTliJFRQQXgkK0FXaDhDbTA+b1pMSE5wc3s2UjQ9cV9FbGFZRSVSODlXTGtxOSEtKnV1NTMzSTM3Y0IoQVpuI3ZsQTQwVyZwCitnKXBCNVJXUEdAaFdRe1RCXnJmZXRjZE92fDI7eVVtbFErX2o2NWl5bDN5ZF96KWJeSS1odGlLQ0w1enRHR1N1O1FOfXBJMDZKZTwxJjA9CitkbUBwWmc4RlVfeT1EaE5NSzFCdWVWWEZRaSo1N2F4QkRgNFN1IyZmcUhyenFwTyFHaX5qQHlLaipVJnErdikjK2h1WmhBQ1pvRXlwM0tOCitpaV95KWN7VV9SXlN3K1BRdlRheUlPJkctakFpPTV4PEkkNmtFI01ZZTMmR1dQUHpGU0ZJRlNCdFUyYHxyT20jKUJWeV5wT31WZHx2dTBkCit5JlEpPnU5WDdiTFVRV0BaZG8pSGFLX29UWHkjQlMkNksrSWFYMG8hN2c2QiRiUnx4a3tCQ1l5P1R9WHtgPkUyKFJJJD1yU35IQG9aOHU1Cis0XmxeYHFtR1gxPC0rbVEoYW9UYT9rVmMlVVNYfkhkZ2prUldgcD0lSGlhSyRpfSkkX0U8YUVHY2NvSyY+SlNyWE14UjVTP1pXTzlVclheCisjNmhEXllrRUhsaERFPD1eZTtMSnBrSypzNl8lOzM5S2pWfnQjd3FfPiQwX2FQSGxTVSpjNERjdnQ8V21BXlhjNUhTMSs4NStEX0gzb2xtCis8NUFNVzdZdmdIRkxYS2chbj4pZzMoPVUlUDZ5Jmheb0A5aUchKVVfKnhaUk9wZW10UVlHKjFxR3otRm5eTXZ7eCQlKDZVOH4yaWlaX3htCismTWhPfWpsSEpFJkNNOWA1RG8qfU5PWWRGWlp8RSF6M0NkQUxfSVB0VEBKSlVwNXw8bUpgUXktfll8P3tEVlc2YmArLUpLV1JRckUka3pjCis8eWlGZiVOYjdhbE08fm5zc1gwcT1fSFp1TG5FZD1obUtsRGEhcnlQV2soX1p7NCslVSQwKCV4RDx9XmY3czhAKlUjQGtLUzV1NmRaMDZTCitASWgmMUleVD0yNUc9eUUkPFVBQCYmNFNXIWVnVUUyV2ZvPipBYX5zS34lU0dYWWIlcXdzYlVkMHVNUll8Qm1PY3M0Oztyd291JkRwK2c1CitTNkBYOVR4LUBDaGdqeURIZkdjckk5MVRNKWgxaUNuYVF5RmorfmpuZHw0fjVzMGJrS1FMaXw8Qm1vSERFZXJOTmdPUDlYPz44R0U1cHVYCitxcWszYXIrcDNIQnJUKUE/ST1CNExPb2pVZElvO2BiUEUtbyY5QXQ1MlhXU1ZeQmJnKDRfZUUyaWBMc19GXnpOPEBARX1oNSh1VWcoPVQlCitWQzZNfX0rWkFeVXdfZSk7ODdHPl8pbndyJTQte098Kih7Ki1fNSNUUXRoO0BeSnpFdk5aNmhkPEg0c2h8RFlabnV7Y3QhRjtfPzZhNTMlCitGNlA0X3dGNllxO2tSKm9IazZfQV9IN2R1MSNmdFVEKjxadHZCfjBZLVZPPVV7ekpzWnckQGdvI1dxQF88ZX0jcGF5Ql5iaDw5VWtNSSlzCitAODc/bGZCNH50b2JjbHhlREh6NWB+M095e1FLe309WjZtOz0wfWJrNSNiUHIjdDNqZk17JDxGYHxpODVIZmBFOGktdjVgZ0B1SSFiOD5RCitgN0EjbmhLO3ZyUWhWNE9xWlE4VTZFR2EyQEJwQElGeXpfflFpdDJgUnwxQUVPRkpJO35tUlohUFE+UCV9O2VyYm5GN1ZSUVFVeys4OVhpCitDbmBzeW96Q3pYJUQ5cm58d1B4RiV9UGx8V1lxeVVZMWdoP2BZPD4jTSZ0fEdhK0wyMjU1YHxVVVclUCtyTntgflhMS202e3lANGx0SGVuCittSzxeSiVKWUw0P0JzI1FuNFEofDhKYklSTi04MDImbFBuSjU3SzYqPzVWMChFSW9mTip2SW1BTTApLTJzMEV7fmJHYSUlZ0piTkhTM2I4CituJG9XRjdTdFpvSCVocGwpOyVaWFQmPmpNNGd+SUVYPD12anx4RURLellES3h1TmJMJkxeTElCSmY4VVF2SyZCaG5xS1ZhXzVLTVo7KlI2Cit7SFlFSHsyQmJPVUF4QXE4eHIhYipYejRManNke2AoQCNJO24+VE9mUk9YejwlJVRwMXwwc2ByYH1QUns/dEF5ezY/TnRLQCNEZXs4cWZ3CituLWNWMGFNITs/M1BuP0BpYTJ8ZTtiSW1AXmQrb3dLcyt7Kk08JFVtZCZSOyp6YFBGT0pqIzZEfHw3WTwzX35WWmtgVEZfPihITVJLd1U7CitPbEs/Q3B3JiVzeUZnUiVoYnUlcW4xYFF7cXx1IUhCfEh9SGlWZkVNNWx7LWNhblVnU0xMMyhpZlNhYyhAc3gkWGV4ZnFSTERvdCFeUkc8Cis0YUBkQj19OVV2UEBePmd3dkhlK0dZUT5tMzA2NjtSNFRmeGw4dVAhQXc0TiNBaFpfYy1UfnBBLUs8MUNAZEg2VjN5T2hPOTMremdFcTgrCis3WnN4QTNJYk5jWkMxLT4oP1I2Xjh5MHtKQ1pDRWZkKHB2VFdBMztrUiN3JkEwNk8zYyNibEgrKDc9KD8kVnIxQVQqSGg/fClMRnE0elApCishdzZSYyhHV3kobFhHMGNLbTkxQHpGVlheYWl7b0dwVFUqKEFNI0tBNWVMKlE2R2hJIVNDaj9oM2JMV2xmalNPM2dXUktEQz9ASSFwMlJiCitwNDxIKDFOJmZxTURiV3ltbkRnTElCXnVPSjdySmxmeXhYPXZrM1k0PWkjbTdpOTdOQD8wUUMlUU9NUEBlKSpGJjlARWB1QDdaNEJhalBvCis8PjlNd19LQEhPVyNMXzsqdXU8bDJHQyhxOVdGRW9WenVmUDd2c2hfQ0BwZ3txSmp7M0BeSzAwcFB4V1NLbnhRd3J2OE92WG82MyhCP0hWCitHc2lgSlZIay0qRzxaSDBTWjQ7VlpkNWxneHhEXj85RkVwVjIwRGBCPHZZSis/QDducClmZzRkR0FhSldyJDFiZm9zWTI+MyV6PmUyelpoCitne2RDTCFrdy00bXRZdno8VTFidj1GfF44cD5iRjNsbFdwOEN9bCMyJF9iMlojaj02b2NldmBSRyZlRVQlVVdRT2A8bG5HcXAoJTUpQjxiCitrbEkjeT1HMkZPJEJyRXhAPXR2e2B1U1ZSMU45Z0VmbD9OejR8ckUtMFJHaE9AelVwMGA1UUFyXyQkKndgQVZXOzhQUnx6aDEkPGlNOGp+Cit4VzVgKkYyQmtpTzJCa2l1UDRlR0VlQlooT0whZzI5dWxrVmN8Nlk7SSFUUnYwX0ZsKzgpd0tsfTUyNE59YlNTaWQySntDRiRya1dPSkdvCismXzFiX1FxTSpjZHt1IWQtTyomXlllY1p1X3s2LTB4Yl5RN31xZU1YeFVkJE9pSmc5ZkVPZzlmRU9xZlAzelN0Tjc0RjgtKXo9d0UxQDxwCis5djJLd1VjT3QwTXw2Y3NBdCteWT47Tl99aDtmYERAZE9oTis/YVlVS3N+PCE9JVYkd2I0KkFCWUMwYFchM1E9Wks/SG8yMzYjPll0VDFzCitWbVhZWD4rfnBsRTl6Rl93I34rZjshUnxyM208PVU0I2psMFN5QFFENzMmMGVYVE1zZ0NGYF5qMlpCSlIxbk5KJkpPMTk1KUUkPTRRcSpwCitFbGFaYmx9cUohKVl6MDBvdGFjN2RaaitnVn5ubUoqTjtFaTNxfTQ3MjE2SD1nI3hJcnojRiYkY1pDK1R7Yj10b3VSKihzejZ5T0Nve3R+CitYXkFDeEo0WUxoPS1BcDVZbFczQDBwUCF7Ulg7RWVicEV0UVRwUExAWjNueFZLe00wQ0p2cCZNVmBTUCUhIUZpMClReXliOWdnPj9TTGpECitQIzE7ODc0ITMwamc4fSRLckRga1E8LWckaEN7dWVZdHsmJm1gPDZEVl80flR+S3Z4bysmMyNpWWFWV212TjV9QWdEcGtZI1B7PWBKMEF1CitXb31QS18yYzs2YTtZYTJqSS0/VyRrPyhQcDN6ISNEITRjSXtnSiN2NTtOakVmWC1FfGM1VWxpej47b2dhUUZnX2psVF8/OV9EMUojQjFpCitIM0xOYGl3VHxXb3NCO21LKCt3PVk7Y1R2UH1HYGowa1FjOFhoTWE5d1FvTjVlPDBpanhvakB0LXQqTnt2LT1Se3o8TmpLK0VIZ0toRUVMCiteRyFqfG96UzdzZzFHaTBAQUtfTkkkbGFOWSRoNStlSV4+dkNNb3JLMStfXl9iSG4tYklWUyF6KFhmRE1jIz4hK0NPTWo4N1BwNnJIWXZoCitzalBaVSZ7cH47U1NMRU1sRzxFP0Z6O0V1e3hlZ2xZKHM0VWxlKmU5aXBEQkJSQDB1Nk13LXhJN1gxUEFVPVR4NnAlUVU8dyk5YFBTcVhtCis7QWN1QmZNMTBGSFBwI0N8SVZBJjYlfE5Wc0JgbXt4dlF+JGVZKDRheEZTeUBeOGZoKzFHPmNIJlR2anEqI143VGgkMHV5enI/aXtQVz1nCitYYU1KSHtCTyYtM05fVDw1diVfeV9vLT9FQ2ZXaGpRU3J6NG4/SWR0b2U3UWN9WEZQTXp3WTtkWFN+dTF4VHRPPEYodTQoYzx9UCl8RzQoCis5OyV0VERXanc4TVUzZll1QnprSVhSaUhTK2o8dFUoVTxSO30obUImem08LSlhJFJteyN2djw3ekA9JDMtQ3RZZlZLKV9BJmZeY0FIYWs5CitlQ1FQYHVsfGtaOD5eLXw+YSNNJlNSJld3ZztXPioyPiZmeHdzX0g0WE5aRC1qfitkPVg9IU8kc2l+PEkpUSphQlNoO2N+QTJASXpQZlNlCitZXlhKZCEmcHIxWGY5OUVJMVV7SkcxN0ZhOXo1eEElTEk+dEJwYUpiRTxQZCEhXjRNdk07LTk/PXtJQnUtdEVia0NGe1ZtbTRBZl98TmlSCislfjJse19Ge3xYNVNEVCRBZHA5QT9KU3prbyt7LTZ5VEhvUXI3bjNFciRLN0JmO0k+R1ZZemtoISpNJWNBJG15aWVHNHFRPTJpZC1xPjBzCiswXyZuQ0Q8emhxNkZASyVFeCNuYWFWcktFR0N7SnxFYiQ5T0oraj8/aVpsZ00qKTB2U2YpXjJTTUkpVUZIUF4xJEB9QlZaMmtQUFcrKlY5CiteeTIlN1B0VHApRDMzPDRHUHF5MXB0eysobmowKj45VFFyT1I8VWlYSzlScXtgcmtyayRsdEI2WnB3Ykh1N3MldU82bEh6VEA/VyNmdW03CitxTjFZOWl4d143azNJSS0pa2h3QWdsQS1BMilAKDJRcGdmJEspbkUrenp1Wk5yM0dzYz0hWVRxPSVaMHJ1cFdWVkItfTdZTGZMX3FkTEFQCitHKktmZTFLZkNeZSRXKFYlPG1CWGhgPiVpZj5uODlfTj1nIWRJPDMmfkBXVClEWTE1e09hekxNPHRuRGF0MEFKdip0b2RTWTAyQjJBYnAtCitYSFpoYzNlP0w3Q3V7RihqOV4qN1dsJFVuKV8lWDgrO0lmaS1+OHltfUsmWVVVQTBXPCpyLW8xUEM7bHFhdWNhI0JXUHlqUzJeSXB1d0Z1CitzUHwxNWNRY0E8KlY1VE5xT3pKaGRoTl9WeEFFdTN4fFlEYTt9TTNqVUJ5MEF2YTQmMlIlPVNhWV5vdClsKSRNbi1heiQ7NW0xPj96NnR7Cispa2hUanswT3ZzVCt6M0lZTjU/eGs3dTR2UXlTSzJxJm85P29AdnZARiUrR1h8PnZwI0tSKWc9ZER8fTNMM3k0dFElN081SHpIdXIwfUA3CitJM1ppQlNGYVpNZ1YqM1c/NyRvSzBQUFJsRipiJCNWNjJVTGZJNUlXZnBwT1o2WWUpRG9neUN9OX18YFAlQUdyTHh7bEVLR2A+XihrKzFYCitrTjh1e35eRmBvOFd5QCk3Zm5DTC1LMlVqY2t+YmooPSVjYDZDNjJQNWg7fGVfTWY/QldkKytoTC0rbyo0ZiR6TllqKShfZDZRQXRWd3ZECitEZmF3ZyV2byFvRX1JckpXUHM9cEVBSDtqTUt7IUBLaWZPcGg0bjd7PylqWEZ6bUQjajktblZGKChyTWZRcUg/JWQ3WiQlREs0XlNeckNYCitmQDkwb3I4ZUBldTR0N2lFTzxLen5tMzspQCF6bjt2KEZ5OTBrYFMjXzNTWFcwZ0JwYklqRHk3MHNrUGpHNnBMX2g4UDA1PTU/Mmtpe25CCiswUHtFJSF2VE45ZHM+VXo4cV9lRF9tViZ8MTluZntGVSlQQHcqNSNERDdmPmJiI016Z1EpS29eOTBCZ2ByM05kXmFjSlg4KVhhdXkkPDlhCit2SUwlXjRsVHhKe3kpJDZUS0dINUtpWWA4ZVFhRz9VfUJBWilUbU1YYFJBViheNmt1YjFyUUZoMVg7JkJgVCpkcj10cFE9eVgtJX1VRXVGCitMfEUwY1gwcHQ+VzVhPnxXYF9YPSZ0d1ZxME9iMitvYXBPayohVjUxNWN+PEgkMENYI0JeQjZiYjlXdFpuNTIoJDIpeT5XQUtmJkZCempNCitGbkpjZS18K3VXezkwNHI5azViOzQ1IWg8JjgzKXc+MzMwZjR+WD8qKDFVekdQLUBDUG5iemw4aSN8NlFjYXppdm0xdmdXRGk/QCVeeUxwCitkbHFJZ31hTkJJcHZKZzkwdFVvJH5sQT9hWGNRY1Y3UWQ9MkV2UzZPOFhNez1xeCthc2JFeyUteT9waSpeQDBLeilWMDFBbyo1bEU+QTVCCitrbHIhPWstciZDbWljUHBhRmQrI3hIMzlBUDRBPSgwNzh6bX4oPm5DPGtTSTd2K0Y9d0UxWGooVD5yYUxnK1AhPUQhPHZmaj95VGM1PmQzCit5Z1JvPUBLQEY/ei1RMTFTdG1LVk5uLT4lbEA8RWNjN0hTT2N5SnVhejVtNjRKaDFRS1ojay1tN2Z8UTJaUThWSSl8bFQ2cEVtNkBXOHN5CitPTncmWSliZHlhTio8Xm97PX41P3NyK2Y9IXYtSSE0S1ZMU3ZXVio8dm5gfTBnTyl1SChBZS1UYG5KPTRNR0ZAUVN7JSVMYns9JFIoSiZrCis0WFY3RDE3ViFlLUdBSGxVY15GX1F2cWYmUTB1JVFRZWBPdyVgTz9gZj4qPSF5fTxOWVhWXlJXI1orcy1pTnpLMSE8RGJvSkJpdTAqd0lxCismeXtxK2BRY0Ztd3Q1SjIpUzhrbj1CbzV4Q3FBMmhpSHkhXjE7SWJHcz4ycj5vR08oVXxpcHdZVE5lRT91Tns9PigwPlNKSyNhNXstZko0CitUQz5ITTtkUWpuczgzaWxWTDNzZE9vQVBtVjR8bj1aQWpnSmJiNmZ8RUpzSmU/UFYxdDA+UFpYTU1WfCpGOyVBbSZnMSEyYCpFY2R6OU1FCitrQn41UXJxRE0rJmp0TW8qMkorRWB9cX5sNUMzdlV5NTBfR3J5cU9sdjZOPz9kMWVASnp9Tn0lMmxTNjwqVT1aRHQ7U2R1O31yUDhqJVRGCiszTXFkYVc1QT5aXyh9c1FyWXgyO3N7WmFteTFKRTJhaXs9WkhsPShnOHh5VHBlWHopYXReSStXTXs2SnMhJFBiZGY1NHk3VG1HdiFNKU9zCiskfWtxNDIjXldLTkxkbWd8T15qfC1vS2Z6eHU5NDZLPTdzelhYPDlfNWtgR1RaM08qfHs8ZVU8JEsmaGlOVDVjR144V1BWOy1DT2U9e3E0Cit7ZUhqZE89TkA1NGEoVis7JmooRW5eK2t9MX19dXBXI3hjX258cW08eThMNlokcUdrSDtsbDgrMUk3TjlkQGE+eDc8ZyMzdiVeVUx9OUA8CisyMnZUbmwpP0lCeGlsTUdNPEhydkd2PXRCZ0ktRylebzlyPSR0PXZ1aDFWUylzYVYmdGZQVWg0Pn41dXF1KkFrZU5naHBfe1VqU1QzNyFMCitUPTEtdV4lSlk2TzYjIyNFP3dZcmV5KXVKPFopT1hjP18zenJoJjNOKjNyfDZ7QXIkKXZTaTdVVmF8OVVaXiRgSkprWW1jTyU/aER0TzsqCis/S0lhZDBoOEtTMEplUDBASnRGRGFQJCFgOGJqfX4raVd4SXpXYWExUVBqYzQxMHRjKntmRVJlTXo3QWN9VGU3fG5kTTIhZ0xMUS1HZl5NCitUdyktVE4qRlRyejxyMylOe0pSWXZtZWI+I3V0fWVLKTRqQVFNX0MmYlFjUl5RI0hCR0ZJRUFvaFNhcCtmfG4tRHJLSXNhTHllTURZO28jCitaan1LPClDIW41Pzl2QnhVSytyTmRBY0cyaDRkOUNRTzBAQnJwI3RJfnp1NWMoPnR0RyokeFo3LU1nMyNiIyZrM2QmZ1YyKk98MEZRR1U0CitjKUQ/e0cpQz9gc2t4cyljI0xXXmFHZHxVflVKVnB6USVLdUdxaWdgPTNxX2RJR0ZadWFubztTM0FgUz0kVU0/by1BTCswZ3NTSiU2QW1PCitzcTN9dHpjTjJWSjthI2JTPG05RXk5MXk4Tk4wMyhgI1ZDJTAkcDdaO1ZAZylIOTlARncxM0ZvWDB4VGRed0xZaXBjfSQ/OUMjQDZZR3ZPCitiQEJsQis5PkVVfV50VyQ2VDJtK0xsU2UwNnRHRTVmNzw9Wi1uT1JSZkBrQSMwQFlHWEppRk9hfEY4ViZTfEJ3YW4xRzAjYG9wbnc+b2p0Cit+WEpvXlJKaTh9SV81I2k5NC03YkloRE9sJmdubDU7WmA0IWJnJDY5KF9VNkBpZkQyclctNV9zamdXQmsmMFUpMEU+ckE4aUtvSUx7QipXCiszUzdgbVJkOyEtZnF6NkNOSGUpP0p+U1BFU3dnUGRAcGluQk1ePnI3Y2p9TnxYPEhiSj4xXkFBRVQtfEZBR1o+OytLZGFwakNZe0ptIyRjCisqVkk+b0hzRTMyQDRBZ0c/YDJASyojTGF2JE15SThARVRUUmBiYnxDeVJDOTFxJjk0d0ZfbkwxRD9ZS3xDUE9zOzc4cCk4NHVFPWFHI05FCistRkUhZnFlcVhTUlBWKCs1UGQhTEdTRHMySUUjLVFJYTFLdyZ7fWlkdlFoZVJXcDU9VmtBMlUjfEc9TzRrR3lJOGFSSXRTdFEqSX4jRUE3CisqOzRvIyU2djIxMjJhMWtGa3BYMjVTJjt8b0Mjb3x0R0E1OEw9Z31BbUE5aUVUfDNgREc0Jlc4PmUmTks0NkwmKyRnRWppMEx4KnlkMUB2Citwd0ZGVylGO0pZRyske3JFTHFgdkFtO14pNjh0PnJYN3xCKj9iWjJaeUZMMFJLUjhXYEp3LSZvNnEzfVApRWRKV1ZNWEZVU1MwUE88ZTBUCis9S0I/S2F2PjtKSXp2d3hgJmc9X298fnBFcXdfJUY4ZG1KV1FFJHFudkBtZ2I1UzRwUHdIZUZrcGJkTzxESS1eZ3s+LXhsITUrPmBRI196Cis0dmU9PH4/X2l4NXl1UHFXdmk+RVMhWSZ1cUtaX0E4aWhGMyFfSm03Q0w2czN4dmYzOXc9K1A3JXhNb2Zeaj8xdT1HI2w/YTA2RzhrWH4jCisxcDFAZysrNUslVjZVcE91ODhzaXVSJUIzPGZCS0F6VmF2WTdXcEZ8WUhMTE1VbXFVSTgySF9ILXtzNGVFZlpfU1hkQUtTcjA1aj9WJXtRCit1PGZIVnprUntOb2pLTlgmNnVsJkhmUSYpTWYlVF9Obj5IIT8xcGpLQDQqS3Q4NEhXR1IrQ0clP3heP1J5ZT9KbTBOfD5+TUA+ZF54WXZUCitQRTBybCZUK1A0T3U+SkEwcnIoSjQmZGtnclpaKzR4KC1GM3VjNjRYNl48eGhPS3Q3O0hXPkpLfEs8VlcldHhxU0taXigkQWR5aGQlKlBpCit4ayFgUyZaWXlpJSooZEdwT1RGSHN1VnVmUDdmYUhsWnR0NSZVd1MrUWNwJDhXdiRtTUJsOTQ/e1VxbyZMZihLSjttMldvMX1yeStMVzVDCitpJU85ZFdnOSg8bj9XdWdDdzRtX0NiWnlgMS19T0JCQFBFZTF3SGVWK15OXlhPdWRId2spfF5ubG9YMWBXWCN0RzwjfXxqflYpNDxifUdYCislISE9R2YrO15yYktwKEMrfG10U0NEQDN6M0gxb0xEJktiOy1tO282JTloNTQ8Sz8qJT04dUBhVnk9TD5pa2p3MU85KElNU31gWEY/dlFgCit2YGBZWG5GfiskfWJGZGUkTk5IZCRqPTJ9K2V3Zz1SLWw/Wn5DJm4tc1F2cStaVFgtO3MhRmNpZ1hRemxYb1MldnQod1l2fDVpbjsxfDQ+Citmb2dPb2p9bjsoeEI8MUxLJEZ4SkNaNkp1Uz5Ie00pWUJHU058cWFXZGNAKjZRP2d3UylONEZleGU/fGhrV0VDPzB6TnNRZXdacFhYPGJFCitqRzZ6OU5zclojaUV9ZTBsTjM3c1lyR2Rxa2pETHM+I3o+VzsrXm0jcWB5eyNvTjRWe1E8OzBzTnpXTDl8PVkkemxKMSh3RXxTY1hrLVJhCitRZGo9QysxTWE9XzNDdE84RzxmKEFHbXZRST4tVDQ7RE57SkJfbVpYOFRKMS1lWX5tez9CRjhgfTYlRHleOG83bD12VGl7SU05VERmQEJJCitaZXpAYUA8NG0pajBeMU8lYm4jUDtnI31OXzlQKUtecG5VUntTb0V+TkVfYGtfNUp6SUB6RzhMWj0/ZldLdng4cyZ9VTtrMzJgeWNNJkdACisyPWd3TWpAeXVAZ1dgczhaYkNaR0gyOXorM1ckPVEjM3YwfCZEc09TeDZIWiluITNtdD00ZDw9N0dNdVo0bExLKHRuajZDQG9PcmBvWXdrCis+fm1SY3ZBd0J7ailSRWN4ZThwJEQ1OypfPDxFRj5pXyZ6dzBmVn1AI2FXPTIrQ1hoJjtxbUxZSGFMfn58SlVYUlQ1QHd3U34qPWQjQDxGCitoampEUzRTYXJ9fXFQV3V8MU1yPHdDQyFfMnZQPkRnSks5c1BUJUpCR0RycyMxa21hOzxzZCZYaFkkRWxgUl9HNHNzaHQtMHh6OFMqPjE8CitlSH5nREhuNVVMVD51aF5iR1JeYkRxUH4qKmpXWE5Kb2dvbld2Z0ZSMmxkVT9VPDRtbFFsSmF2Tl5ZLSU5PFdBOSM9KyRjMSVtaiRUTjJnCiszK2RIQjxlSlFUSEpwMSR1VWZjPF5sfWhRPzsqVnVldWdEUEJ0JTMtI1NHez5lN0oxKz1sJDx7TTw7eG0+WTBiU25mZmt1Mlh6OzxwVzM4CitPUD4peHlSQnU7KnVDNykkQF8pZXA3eXJRbGxMTVgmY3MqY2F6QGRPczBseCV6MSRHR3g0SUNTMjR0eWVUWTJiJX1VaiZ7SHlkM0RJQHpNCiswdTFabCFHe1dYdGhrfkxFX2BJO2lsNCRXRE9UVG89c3ByR2tOdUxacHFea0xBIXBiSjR2dEo5OXVQUyZvfGV5OG9KaV8oM21gJVVNZ0AxCit8ZClQWU5DI29FRHJKezhYXkpwfUM9aDtiQjhCTHhpRWZBO0ZNZ219OzEzYzs0YD9WVCltPjtoNW9zcH5CIzY+fWVjZzlCSCV+WEJ1Qk00CitoUl8la2B9VHo8YSleT0E8YVgtNCMmXn1TQUBOeC1rfjF0ZjVkLUV6fVViVE9ffUM8JX5qM3NueDtZYjI2WVZUN0d3ek85VFhxKk93ZntgCitSWTZ5Uih6RkBjVDx2dTJZO0JSJnJ2MH5laUZTcWRScWZsXzRjZXtSVUR7OHpVdW47M2Y2KUdAeXs9YHRYMVhASV9QWHZtZjFPU2pzIVA7Cis4cUQjP0QoOU97OylHZ0QhcnUkRz1zeW4xUnNrN152Pm1TZn0qR0s2ND4hO3tmPikrUkooVnkwUDF3Um1jKCRLPSMtUHFzd3coKkdadmhrCispLTZBfjRZNl9PdF5GWFpXdlJVc1FmSl8+MFgrQ0g+OHZ7QmdJVlN+YmtobmQ0QmhwaTNVOFRMY2laKDt1NzFIeEJeR29jfEZPS3NVcWImCistMGhkWHVgUGV+XkVLZV9YKGZmUCNRMDFDfEU3QTVhI3NDKlZUQiZqQyNYOXwtZ2Y+PTlAUk9idUtlU1FZNF8+OEtlJjwmPigpKWxBZE8pCitYZFE9KHYpZztZWXVBZTMyR05LQnhwcD8qZFRMSU0kblg/e0dpaTg8dzJLJXJmREQ3S0M0fStVOH4pckoqWWpRSip+Wnt7WTg2Mj4hTkZfCit5TyVpT3Q5d3xkKXJJSXtoIS1QdDw4e1RsN2w7UTstJDx8NFl4Tj1lIVRMJTFoNUR3IUolVis/Kn0+Qy1PTWBhQHA5KCRgVHBvTldfKiFzCit2dSQhVFlwX1JlTWFLRTltcHtLIU0yc2NDLVZoc1pmTGt1R2YkJWElem99dDk+NmlMOFIhKW44OEJuS019VE1ZKmNNK3sjWVA4Km85az97Citkemd0NEQ3IUJ9ZUNXanR2NytRPnBZTFlqcz03LTl7MUd+fnNRNihQR3FKXyRKekdDZyF3PXVARkBnX2VjeDJATVg1M21YJSpDVHdmaXAwCitLbEY3czR2VFppV1NmaGxkWGRGRENCKDFwYjxFS1F2P1EpelJ1Zj5nVXpWKVVUPnIyWlJRITU4TkNXcnM8O0BzWSVuZ1hkbCpVYkA5NkliCitnbEpFZihIX3xFc1g3clBhOVZsdHlHI0ZMUHR9Nm4/aytBWE1gXmdVbFY+UDkyWkVlciEtcnVAMXY+eUgxITx5bzlkbkZ2c0J4KHt7OCU/CitgWS1XYz90anw8TkI8VDlUPzBsMCVuNWlTQEw9RnFmel5UaUg3aG1XWVJXWShLQFNJdzNNdlhwKXwjfis+cHN5UCkzd29lKFR+d2opVzQ9CisqdW00em9OUGp+QWc1ZUZyYC1UcTxBNSZkWDhAMHk0I3omMzJqaGA5NkgjUH5tSD42fDgheXk0N1ZJZFBqdldZaEBraEh4TUBfb3Bxa1EqCitWSSg5cURCJn5jJUtxNFByRDQ9b01kNj8heXVJcnVQRSFudVJgTiNlbTReK0VMK148e09TZjEtYWtPe31JK15TV2xnPTlzMko7fmYtOCghCit6QTdiUEBWXntWeDV0ZGJfP3xAVEIwUyFSdiFKMmshe3A4KzspNmFQWTZlOVNvc1Z5OFI0c1JJYFR8aDhzcDEjdXtFWHRUVWBQZF9lV1BxCitwPTUtPFVwJDEhO1BiaXYjNCU9V2p0Kj5YUzVxSDhZXylnajgoPkpXMW88P2tPWnBuISRiQ20rIzcxOTVfT0B2QGtgakdAU15aJSF3Ji1JCis5TENtP0YtcEJleS11d1BAVFljY2RjYjE9M2o+d310UDEhdDtCM0lmMEZPWWd6PmF9XjAlcnhqN3F9fWhOSGJYVEJERCs7MS0lc1hkZUdMCitPTCkyRk42NypZOEQ9T2hXK0pWfWsrQS1TaylJS2NIWnIye3dkUWMwbnA0elVuUkw4NHl6dzI3K0A3MUBibElTal55Xm5zTnt0PG1MbH1mCitJRG1pYDAlWFpubCFwQTEoR0h3PkdNa0F6R1FjYDN2LXZ8WHF2bCEtfGQ/aTNsVzlfVzhNcGl8KCR6P3tJdXBsIU14eDs8MzdoamQzTmtDCitWRGlSRXVLdDZaRVV9cFhrUX5adyglNkNAfHowbWwlSUJqdHc9MEg0UWgwNCt7VHhfYDlIY0EhOHdBM3tWJVMqUSZldEtrNUlMe35tdzRmCis3NV9PWTd6UGI0aHA7KUk5fTY2PiNBI34zKUEmQSpvP2JGbnVHPzBDV1ZeOWFqQEBudzMrX3pfYG1QSiQkenV8SHZiKElgPXRMKntAbVg7CitBVVBuSCtMaE0+ZWg9c3o3Izg+bF4jSlB3dyp+JGZjcTduVjZRdm9aYEx8fTFXfmIoJj03RkZ0TDgoRSp3V0dCWXcyUVJ3UWsoZyt3enN+CitZZXUmO2k2bSRzZzYxKzBfSEVRR2k0ZiUkQ00jXnY8KE5EJkRePXxjWF4jJHNDSXtJdDtgfWh5e3BYNUsmZX1WckJ8TSZjTmBoUClHe057CitnbXpeSCgkMGxOYWpIUkNpbEchdjsrSTw3c2hiPU04bWswTlI3SyZ7OGExfnY1Pl9hZmE9PkhnWHdsK3F+d3ZIcSQ0SXNPKl5XQiRrZSZsCit4VG50e0FFZj8jQVpFKT5MMThzViZ3Ukx5Uz96SUZoP2ojI0NkNShMKCk3ayNRYzxJVnthclFeT3tQZDRfaWo/LXhFWGR+VyNLQFNXaiUhCit8bVl0WC1WKHlzckZUT1F9PEkoUjluO3dzWVUpa2VUP1gtUXYzTXB7aTcpVjAtfmdwWUJ2aXwxKCpXSFFZJD8jVUBkbDRTNWtYYHlVTnUqCis+VFdeWmdWYUhxQWJuNnNrU1FvQ3M5I1dBUD1hPWRjQ1lxO19PU0xDUUcxSG8tZzg8endaRTB4RTd+ZTtIVDZkQkkhfDQ1b3d1JkYmV0dBCishNn04NlFzQmNwMUcmKClDJHRMUCRgfDA5ejNBIVA9O2tyP312QVJePEx8dWsxTV5+VUwoI19TKXFoOU03LUQySFItM3J9bS1DRXQ3eF4qCitQbUFMekRGMyUqbWdTOWRebm5BKH0rUklnOSMmWEslZClLJSlQa2tuVUdgfGhzeSlIbTBBPnMjeDZOZDhyTlUrVCV7PktFKFJsR05gZHNqCit0I2s+c2hkU3V4R0c3UjJgLVhHZmBoUURye15SYyRwRUY2SmBtVTl5VCo8WnJIckFnPDtReEVlPX42d2p5amJePmxVVDFPR2gjSnBWbFpKCitwVmxaSnBWbFpgU2JxKVApaD5ANmFXQUsybXRleTdEdj5fM2VPZF8wMDAxUjBSUzVTMDAzfWxhNCVuV1dvfjN8YXhZfFFiOThLSlZsUV8jCitHJWpVJFcjcWtrZHthZ0MwRGpYWFpUak1kTTw2Xlo1clUjc3NhcWVkcF8pcSp4UkYjKksmeWhIKXlsNEBZPG5aOUFnI0MyaEIzU0J1RFkoCitQeVgjfGpAdlhabkV2VlNFJjxEPl9RSG0mM0w3Wj93M1RQaVpkVmxCNEJ4IWxMYH5DZz97cWRvPmNWXkRLJllVQE8mWTNmRmkqOD5iN3pJCitIdiFKbj1STGFvNjZ4clA3enVMdTRIamFAVEhfKXFIUV5KQCtNJkY5YVd8STJkNiFtQHwmRlQ0OWVONkZtfUpAbH5SeGFVNGNTPlBlWkZDCitUSnZaayp8T0BabyMheURUI14lXjU0Pnl2dHY8LTlGPmspYzlZXmNASXB6MUQ/fDY7O0EwP3lsdmBMP0Reby1uZWQhQmFvKklzODBedWhNCitpeEllMkxIPzBeQzktVWBJamEwdkFteWFgd1h1ai0xfTZyQGNpejx2KlU0eyFaO3k0RE5QWFNBQEMtVCVleDRFdFE7aTxBQC1nbTJ4an5kCitga3o5RmZneTNrZWduan5FOTA1c2tGJiQ0eSRXKU1MNzBwJDNrfH5TR3ZHUFRBblojVzBNS2Q+P3U5Qz5kaig8NHt+bnREZTt0REdMZWtHCitDVSM4cipTYl50dGIrSEN2LSVZMihJR3tDYG1FQyl7YXlRZ3tCYDtJQjNqUHtUaGpZWEslUSU9Jm9yZjhyIU5jSHJAK2BReiVOQkEjKTxACit7OGtjUmFlJk12UjR5c1FNPzhCUEU8IXAtbTtidVBJMzdDYTFxbW1vMj5eMDUjV29DUD1LPVB+akImd3MlZEZeRUklQ3R2d09HcCQ5VExWCitIbll4P3w/OGFeKm84YTN+WT1IPTtxMWJKeGtDRHJiJWZBdmRmKz9FMW9tYn4pXks9NkokV15qdXZJZDdLVjlgKWJHJSZpdnZhYTEtMGFSCis/T2NITWZ+R1JDP1olRnhJXy1fUW0mVzd3KUY9d1hgXm1DeGZOYlE9M29wVW9rY0UjTk52MTdZK2krNjthU2NjWHwrYF8yKVFqeTlfUGZgCitiVWBRJEVwYTtaKjN+JGB5NnRMIS1fKT40NCRXfnw8ZEVYRC1ZVG1IOW1LcTI5RiQ2cSVqOEp6RTxiN1Vob190cipTN2pkMztsYyRjQkMxCitxUkktVHFKcUVXJGF2Nk4wWFF4ayhfXzZgbWxZZGZjbTVKaWFsU3pZMjx+VmE/YilEbGJVWEs7KXZDRyh1KzByYSZ3c2ViaHQ0dDA7eT4zCis1PUxlcXpgcnJUY24xciF9RiVKSnN6Xk1+JXNwJDlGM0FkeVlNSSFObyQxVk1aQExLcFl4eD1hOGo+flNYTHckYXl6QSMjZHg9eD5NZTdrCiteMm82a2RCMHo9RkNZJHx0P0tien0hIUl0PUBPKl9KcEI2NEBjdW5nQVU+dllDejslJF9vN3JJZU4zanZYQmY/ZFpUZGhHOVlwT2N1RkJfCitocH13alZHY3swdjxudDMxfWk0c1VlZnMzUk1ENkpRME5hbyZCfEAjQUB9QjF8UWkwU2ZnKVA1cT05NmBXVnkoeUBTM0BoUTJ8aVBfXzc2CitnZyQ9P1NePjRvPFRJJWpJUmYyeDUzMyZZVyVvZX5YaUExNFdIMFQraW5Fczx0VVFjOz45NiY3THdUKzdLSkxKNz0yI2ducHwtOUExOGJXCitJd2NRWSZsZFR1SXpBaFVqKXxpaCRhO2NQV1JNTHZGX2RzTyVRTyNJSF9BKHEjIXYyS2tJTmQoNyZQVlJaXk8xNlJlTyZnRHoweklNb3poCislcyZmSkRnWFY4e2dDU1NePVNHUnEpMmBXfnszcVk0UyRZc3xXKmokMl5IMmNYJG5lMmNaNlYtZDI0eHJNREhWWG8yMk9gaFZaS29pZytMCitKN0xifFpsbWJOWlNBXnlOblNRViZpSHdnaVRkJXU9QTlWMmZoT1pQUlZiQXhrWTU0XlJedVZsPXFLWGBkfko3ZFJfbXg+Z3cyYnAxc31ZCitgU19FTEtBYl9hJDl1VTZQdko7LVZTTj8zVzNpX0FjR2xlUWR3WGxvNFVIcTJTN2szZ0RhT2ZYQ1BRMGctdElsRFlwZXN7ODFEfVpPYUs9Cit1UG97bWF0ME9gRkdqYjB4ez1aUmB2NkxzPV8+JTcrbERNK0ErVSh+XmM3ZS1SKEkqVDQjLStLcEgxOCFTY2NoJUY4VSU7WVN7SiVwN356CitMeSFzfnEpQD5+dXMyUEMqOU95UzM9c0U9WWtwYUVWZm0jdTAxX3VncHBpdzY8bD0pQUhUIVp+LV4xY25NMVM8ZENNbjNZemUhISlTNytMCis2cnReelhMRzdNUnNmV0o4Y3s3ZSpwM1NsckF8OGExaHZ2JmpRdDAjKSUtMzBhZz4kdDlhVT0tKWVXUnxsU0Baa3cle1VnVCFwelIxc3tMCitYcDA/YjQwPndPSEslamVha2RQPmVpb2hIazZqVyFpYmU/fWg+KTUjbiEhXylTMkExViooT3NCa2B2ezZiKHBpeWZUeHp+Qz01dmNiUEhFCit5MWhqOExecDgkb2xDeFhtTSRObz87SCkqciVuNEhDdHUxJkxxfXNMdTk9TnRVUn5ONkUzd058NHNGV0ZLempyYkttKCUrRTlzWDdpKmc3Cit7dFFNTWdNOH14QnVUOUMzWigkTSpCYCN9bFM+VzRDcGFaQFRZVGdUNF9VOTxqPDtaQzErUEkwWCRfPFUoMk1YWXN8UytnQEg1VUNOak1jCitsU0tRS1EmZFZ8Z0d3NkhSJVByOUJEYmF5Kl99KlJ8SFB5c3V4KHx1ZSltfWNMQjBwMFJFQXJFbkcrQj94dUk5MklHJFJsPjxQWU1Ba0FOCithRF5NI1B2VTQxblVzWFAwR3BFTik+UiEyXz5mYEBEa0VwU2VaNSZTJThEY1FuVWFWQXo/KHUwYH5eeXFxTk5Ma3s+ZEYzdzZTRGJESW1gCitEK0BuKGclS2JjVHBEODR5dkw5fW9pak9WeT5xYy1EYmwlR3ZvRlA9RkBKRiF3Z2trY2s9TWh9KHlHJlMhYWtpc2NDbSUoTTdoYz5zOWdfCitsUyhteEB7e0E+UE89a3J8Q2U+eyleSzVnJTsoSygpP25KYSlEU1FUaD5eUiRMNnFkMD5kRWRxNVpnRWA8KWl1X0l0PnpISWdrd0tgZTlNCitldll5cXlMSHtDdUN0V3AmbExqV2ZteDFtdkliXismbHxXTShzQTZKMEY9YWZwOCgxS28pX0B9Zk1gUV8pZ1B3QzMxJUc8T29wPSo3fWBECitAciRkbkFZUllwZz4mQ0k/NFZmOD5kalI1Yz53SWQ5NChxZyFvRDkhTURuMHQxT2lzeiYreCVlKFY8R0hnVk9la1M4emI/VXpCNkpWPW5LCishV3F5WHtJc0Z9XkklVj48b2RmZWkzZkNHOThfPm10LUJGXyh1ST4jVCpeaWFlcXU7YjVVdmVoNUQ3bH55NzJzVS1laTJKUnkzZG5VNiZQCitDd1NebnNIK2FNcilsUWdMaCpsZG9ofjx9MWt0QXV3MnVNNjlMVjVuVEA/OWN6I3lFIU9CfTVvVUcyRU85SCZXaGdkQmhGVHE3NytFSHtjCit5a1gpV1c1WT4rSC1YPG0/UCtLTWd0RU1oOWowbyEpdENgNnFGNXQhTCVfTDx0cXIzZGgjI2twKUtfRjV1RTEoKXo4MzVvPUxBflchUkNzCitlK3JQNzE7KXs8NlVFfUYzIUVgST0qSk1mVm51RzlIV3RKc0ZFQWohPUtxP0JDX1JZVTw0ajB0IVVlMXQ3cWZZPUtJUCFEMmBreUFQNDFaCit9aXVwKCNoPmJHWTNIPUR6PSpDZSV6Z1Noc1BIJTtHKHg1cXwrNnE9RjZWTFZ8Mk0teU13b09vWDNqR3M4O21ZVEBxaFhWbFRJI0EtMkZxCisjJHJpVEclJDY8JkZtfUMtWiRnT0xMKWRgaF9Hdl91VjZafntOOCtLKFJiantVX3dLVkl0Q3U1TnleNjBJeGt+Ynl0KGkmSiphODI4X2pgCis3fnJOWT5Id3ZNfDhraG02NUA0bz9kbHRXPn08P0hiRWdMO0JQUntAZmk0WjszdGMkPk5KSCkpPjdLM3pTX08kfWVSQzI5c09heGJLdCs+Cit3WGZwdC0mSUBfTExudVF3SFZXeEg3UX1QfDY2diNaWn1+MURZWXt3c185eXo/Xz1+PGR4TmV2ZE8/PSR4YTFpYE9OI19vISZseU88ZkNpCit7dVlifkl2R3Y4K1E+eHZhKEtgdTA2OT9BP0dUOz5zcjFZN24zZ3EtZmZVSF8mPDM1VzE4UEEhUik/WiFXKWhadCRqS0BiVlNVWVFremxVCit0d2dXQkBeeXwqKkUwZXVFSypEXllGbkpwVUZfPFVoT0FxTn5WP3YpbVlFPXVhOGV0RiZWd0N9XllCRzwqMDM+PjxDeWFwQzs0VSReb2wjCitvbWQ+NXxIWiNIMHs2SzYqYkcrMzs5amkqandzbjBaVUxkTy11UHI5JWI2YTlvQEk4Um0mVGJLcVF5Wlh1Jigpe3hQRyhSUGZyMHZJdXlKCitSQmpIYjJZWFBSQyRrQ2BBWGhsRyU5O21pJnVgbjBBIWUmY2ZwJD5+fGR0bkVmdVFlQyNMM3UtZy01ez4ofCM4RWNGN0FgSG8tXj13RzJACitTcnRKI0l7fCtxcH5wU2IlPEt3NGVuRCFqLTdjVTFwJEpBMyEyUD5oalhPeGdsUXZAZm8hRD5Dc0JPZ3NAd0tRa1N0KmM3VUdPdmpCO3NRCis3PjRueyFEQD9eXzk2M3djTmpLOXc3M3QyejEkWCVeYkZESUVOSyVIdzsrbnROQW9jekZ9SXE0IzkkYE8xRkNgaXQ5OWdHUHpXOCReQzkoCitLJjB6ZmAwe0Q0PEpXdkVrej9PUXBve2dZbkk3NkxvVE5Qb0ZRWjlzblRidz9KTDJoJHtkPFAtYEp2TT0oOFp3WDBoWH08Kzw+N3F4cl8qCitjVTRPcEUhV0k7N0FVZDk9XkIrZjZqd2AwK2dQbmlUQlk+YEU4RkVxX0k5YCk5aWZQKT9iTj92XilWbHhDUUd3VHo1NEBGTkhaJXs4bU0jCitMQEBNTDRtY0V9VT1QMH0wOT9XQ3xeI2BJNGBfTWM9Z3tCU3NFUFVyVzVvcSl7Nn1VanIhbW4/eilNbU18NEhIbzEkU2wjSU49aVVrQkRwCitXWW4hKGJ3SEJrRkp4KU07YlBQaipxJU1eZH1GTF9sZHF4VlcmP21wI2x7elZPbTlBT3dWITV6R2RKWGJEJTs/aj5zV0QlQztNZE5OKjc/CitQRGthP0VheVYzWiZWUXNuNWAoLTZ9WFVnNG9qPn5zR3NzQ0FefHhQMWEjK0lTWUFKTkdJayUtbHxpNSpzTGlec2AkeGE0YEhfb2N3TkY+Cis5ZSR0clJoQzFHWWlAMChMZlVnWXo+ezt9ams5XzQ1LWBtcVkmN1ElOExgX05ka1E8I152YX1pdlNzck5hSlEtJHRSV1QmVHBya2R4eFJ4CituKmBiIXBCeXVtSkloRkZjX3l3Q042TjFYRExtdSZJN1RFd1JoRnYkdyFoSGJiOCZaajNxYXEoUVYkUmQkT0tqMz00b0swbXozWl5hZXBqCitodVdjRk5oIShOfGJETmNXUDYmcWQ0VGRqVHlEPSFXYVNCazI7VV9tWlBoX1lvfnNDaEktcUN0cjdgQztPPERoT2UjelVVQXd7Q3wtNiY3CitDbnEmI0AkZSpIJnpgOCk9MS01QWNjcmtDfDBPRnk3Qi1obmJ8YkBoPmokLW1BO2hDcWw7T3lhMFhve1JXcFJoYGV2V3IyIWF2QTIrQkcwCithVlA9aVA7P0tqdnh4QV8xajB7VDJ0Iy1BUCNpXitGciF4amg8YztsQSFtT0xfeT91R2BeVkArOSV0MUtfKClUOTZ3Y2EmWm42LWhuWjxVCiswWHI2O2hHZF47cDJ6VkRjP2tDP012Q0tuYXhkVypKTTwqfiZSKiZtU254RTk/dyRXdStfcSMoOTZ5JDxlWjQlQ3BReUA+U1Y2XkU2ZmV+CithS3Y7Yl9QSHozcEZWbn0mOTZHSzItV2hDZHVTc317PWJYaDtTN2JGdVZsclleSVdJZDI8aWNtd1ptcThEc1pwMHhjfDRwVGtXP31ySjdSCit9KmUmNmxPRjxeVCNJLWRnMEM1R3VFVnFWPSlhMEVzUFBqWS14blYweUEyI0FgUCpSKFZLN3c+fEkpQDs+T1dTKihFc3VfaHdjWSNia25HCituayooPHpuMGhuMk1kZ0l5aXhnTiQ/OFBBSDV5d3FFbTdxQFZHX3JtdmsmT3NVO1Iqan1xQzB5cTZZVTRlWUVsU2h1KjElKFFwY1RMMyhlCittUilXa2puVDJWKCEyYSZeTSR+NyRsPmU8dFg9ZytXaWxZcjJkIzxwbkFMQl9gaVFBY2V4UmtlJVZWKXJDXm5mQ1RENyFfeXRGYCl6RnlZCityV1M2bioydSQ/UldQUCsxbnBNQGRfeXwyfGpraHYtSkR7P3c5QGdJWDFtNDB4Tzc1WlBzfVJWMysqKDhxN0xneH5rNlYwXktDYDVMSCtECitLUGJyd0J2czk1VXFuNHp7TUBtP2crckI/fXB0MSZQaD5uQkBmVnteT19Pe0BgLXZMb0d2Yn5IP0RnPWlyOTBgZ0pjUmN3WS1lKnlHWmkpCitNTT81YCgpNj9HX34rZmtEcURKJktWJD92JXNrM0ZqTXg+IUVnNXZrOFFocnRJI3A9U20/KUl0ITM9NnApc0lldV4zTVZ5cjkxQUZWaWw7Cis8RE9LcHRyYmlabGchVSNERn5edkh7YVpRTVV6JjdpY3NFVEU/ayRKdyRQdEltV3FUPiY9Mz1HUWRfISR1NXh8VjY8ZkNOO1AxbSZuNjFUCithKHxfRTlMX3h5MHZOVCY1Sjt0TyFkeEp5ZkU3WFU9VXMpbT9qM2UtKXZpYT1CejVtZVB2e1EySGNJTWhGZXQ7fCpQO3hQIzVIQDwlMkp2CitOb3JvJlRiU01XaUg4RX47Pkkla0FLdWNPNV9VZkBeVyZ3JkgzUip8X1N+SmlOOGJecGsrT2ZnQ3IodEUrcGFmUnQ1OHwhQUdgTEdpUSVACitLYXZ3OSphQEhIS2kweXklSjJKIWBSdm1YI3E/VG9MYnBuQVgmYiFPZVhNcz0kbW49aXY/UyR7PShyWFp2QFg7WnIteVEqQTZHcD1OdkJ0CiszTFc5YEExN0JxbHBOZF5KK2RxaD1eWjFKUVo8TUM2QG1iYTZOR2dwIUdaVDRJbGxSTCZYdzl6WCstY3xlRFUoRjIpQGJ9WSlvaz04RE5jCitEUipmXj1gWU1iPClke1YtI192OTtiK1pMek1RIzBFJnAhZ05GRk9GfEV3KyUrWVBtKXYkX3ZSQ0dITnc2QUxpclFET0JidX5PZVFRRDxsCitFfC1gfkFzYCFARClWclFEe3g/U0kkQil2V3FWKng/az0/IW15YmJAcX5eYlhufEk9SzRXWEJ1P18pQztrNzJVYUlKSUNmRVI9P1RuVH5eCispKXd0Q31ZZSZXZm4lemZyb3NKd0gyaT4yfUxBeWFOUyZmQFZHQEpuYUgtZGYlST94TDBuWiFfPnd0NiVzYmZIenhIbWpEfHtXbmhuQzdgCis7MXlAI01RU35XUWElTExPNjA4NCtKQUIjZGVCZHZpYiMmN0FCJDUwN1RRZVk1WU1Zem97dXc1U0swKXRvc2Z7QzttY2ElSiRjWX5rUTttCitXbUAlQUpVOGwlOFNYIUVDdmhaN1RkfHFlemVYRn5mdXF1dDNUTGh9PVk3QFZmI0J8ME81eGleYFNqYTNyYDZoNUNPKDBrXzZSWilTb2tCCitNQkk7WUJwUyV6Zk1RN3s7ZThqbjQ1IUVTKldAZ0VzM3k1JXd1KnhkZzMpZjtDaV9WRTB2JX5hdVcjbyV5MG1idElVLVdsd3Q5MEF+M0VvCis+QVcwUjJtUUZUY35JJHc7Jk5OKTgmSC11UDl7fU8pX3s8aUI1WEpvUk9eN2ZtOylGXiV2KUZ+PUloV30yPUZVN3ljPVNoJSk9b3YpZzt0Cis0blhQR0ROcWBKcnxIUnR+MC0kK2s/MHE0fi0+WDNJSGRnPX5BQ2w0blQ9YUM/XlEjeUp4QCVHVXU3clNFYUM7aENpOCRQfjEoPmslTG9eCis7a1JaSmhoY0BASmpIV209Zl9NYDV3XyhCaVplVzd2KD9vRk1oX1o1KnhFaykjVkJBSTtUKFkmSlU/anJKeXBCI2AkYlktYStKT3FYS05gCis1Vy1MZXJhekxXUWokS0QofEspaytpO2plITMtTyZPJUgkTTVQQ3BJaXhgcjBedVp0MXEhZCVPcj9aenNFUDFLXlh+M0VLV1FoYFBecjAoCitwenpUMnw/TnVPNjV8YXIyTjUteihpMUxgen1HSF9CYG5FUHcrPFYhQDJRbTRNKk4pLUxATnwkI2ojJT9Ed3AhdEBRVjRfekZXeVd9NXNaCitNR1UxQUY9Qz82eFdpQUA7fDMxNVEhV0hOKExWcTxoO2VGejY/OztIaSozRytybWBxZlo0cj9peHJlO0RobDtZQlJ5cV97WmQ/OXtOM044CiteSChIMVVlWEE9PUFxSUZubEEoamg2UzJCUmwtc3JNSz5SVio1cjJ+dmN4TihNKDNHSldKdFReRmxnVnpeKSNiQmd5K014YkhPYTwzcSE1CitKZSZhIS10d2VyaW8hOSRBSzxIfVlwI34wVEZDelhrK085K2ZhVDNqNVNZV1RuKUxFQnt5VjdBRUVCPFpkM3JrOHpLJVlgTWo8OGxXZV81CitwYTc1OFE2eV5EQXR3Sk8tMnkoOzNhclcqZFokYU9WZyhQWVBTekhNNlRoXmYkO1EmQ0tLJkdYRU10PW1IbGJXJCRSZHBYZHpGMEpVeW9DCit+Rm9iLXBDVXQjdThJJU4xK0FtNXdeY0VeY2JjTUdzdFFeRiF+N1NQYTcydyl5KmVIODNiKVZvMyp4ZGZib1c5cVlxQHF1PGFZVzBTMihICitVdlIyTiFPMmdDOEdJPHlybyhUYVZsRTF7MShLVlJmSTtYITVNN3tqcFdZSnExaj1LUUFtYnpCVmRicVRTZSVTaFdUcWR3bkVtMCZRM2xSCitqNHN8QVVYUEZ0Yjx7dzQ3Oz9BO2IwWjlqT0dQPkZxe1FAblB3UXMlMnsjYDYqWjxEKFokZFRobFB9dDsxXnQhTnJ1JDlnTzUpIyl1VT45CitSbWhvYGU4P0c5Tz1WRVo+SHtQOC16UkN8WGw5U1VTWkZGUH5HXkAkdk58SGJ6dCFuVTE5dW44Tj1mWldWO1MjejJmVF9tcGdIUlFfUEZyCitaRHsoSzh3cC1EKkxgNnY9XyZVVmBHVitEdmd4bk8lZ3NxeU5IMHRXY2tARUxLLXNNelcqTztUWHNkYT4ka000bEBZZSslNng5ZGMjan1gCit7fGRVeHE/I1hDMH1eU1pkZlI8MzhWb1BDYyZGYT1ATSY8ZF9KbEBjUGx3K1Buan1hP09DTFpwcUN+bTdWa0E/Vz8oR0Bhe0pVXjFYe19JCitOU35ENnNhWlp2Z3s8bjlCckghTnR4I0FnWUcofSk4KkNHK2UjRihhcmRqUXN4JElIcFM1byM/djElSnU2LWAmQj1gRzUmWVNnWT1zN0JNCisyayFyNmdAUWZHbzFwZ19aJmV5N0x3TVBHcisxRElTaTZUZEdjUXZgaUFhV2didDI/QCFMQTdnM0FVWX1WaTI4az55OG9vUUhBITZhTHlFCitRIzNKVGw8Zy1HZVRSLSM1e0RMMU9vTENSI1BAP3h4ZWd4WkBkMjFmeGNifmchaXo+bHdqU19XelBwczVEM3lgKSlPKD18eFQjIXdhdXtWCisrKCZpYX0tb3FeT0RGbihzNXAlQFgtU0dlSlpLYzBibmxwYjNpZ3FRYm92WE8qY1IoP0dKUFU8OVJGQmpibWsoTElHc1FWOyUpc2g8dFcxCitBJDliU0FpSEAjOFZPbCp3KFFFJXpVU2pDYkkoQVhyQDZraEc7aGMkT2pDPjUoQypnQj5gZHVraWw5dWZjJTRqcXtLayNydG9IQEB5WjRQCituRHctI2M9Ql9fOzZZfHNeUF5oNzNCK1VJLW5hPmZvMkBpZztzeHZrNVohemU9dnUoTz1aNkNKa2F2dEg2dE1WMTBqT3ZfSmdvM0hrdEA5CisqTWtsT2xJajhmeShgLSZUeHgyI0M0ZkhKKDY/MWhvR3I5X1hheyp8YjtlKil6bDVTdjVjTWVBJEZ9WUp2TkBkVnl5NC1kKEZ1VTdyN2I7CistSHtOWlYqKUU/XzFZeHFWaFUxSHx1Z1pFa0FaNClwZjhGbXo7cVU0amg/azhEOGhhKSNMOW02dHw0NEplLTY3RndrVypNblhaO0N6Jm9tCiteZHYpOGdxWHh3UllqQDZCSkBQP3BIKExBaU4wJmdNMEw2TEVFS2R6VEhzZEJEblE1UUpwKChzMmhfVUheb3pQaiNMVUckJDFCQyFYNGFkCiszNzZrN3AqOCtSUn1gSG9JdnAjb2twQE1PSVdXXiojKWBXJTY4cWtmSWZYcE9kemFhe3dmVXYpUEtNKnZtYS1FMD0lYE1VdGdJR3loOUdaCis/WDtxU3VKVH1+bkYlPlA9KDImRXJAOztyOGJtPyQwQDEhIzJjOF44ZWR1MjJMTURiUXByX1Y4aSMyVzsmWD0tPGFAY0U/ISRuclVtNWMoCitOWnV7VUo/OClDejE0b0d1bU5+U1JRcD0wbkBfMlBAbE5uWV9IPG1nTiNtNXxjREBNOzAydSNFaGlfbFF1Y1JFMThZeUswPXQxJlZPVENsCit5TEFUSyF7VEZGTTFnYGtUSWZuWEZsPGdMKGNnV299K2pQJlI+e2NXeUMkaHomfCtpWX5LS3xQUzZwM3AmeC1iaCNHVmhMZ0Z5cXZwPE81CitlZD9nPG88YWMzYE9uKmB6IU5tKzNpb2FYWlJIJk9YPFMwMH5ZQyVMZSlxRV5AWkV3XzxUZkErVVl7fDZjVT0+SE5FMiN8NW8yM0l1WVYqCisjUCs3PXxmZk1zQlJuYUhmb3w5e1V+fmFPMCpmI2Itb3xQVHpfYTVgdSZgI3JuN09EVmUteDZaYiowUE9kZU1jPUU9PFkha2dRfGpNamp9CitNZzdKZWU+bjUmQUNTVE8kVG07ZFpFPlkzKj9PSk4qc0F0aVQ2USFuOWE0SitGR3tZPk0yV09BOyg/NXtPIUA4dzwjfXBkZ1p6Ui1KUHtNCitlMS0mcVo0UW43M1I+OHhFSVJtVi1hJGdOaFBaXk5AU3YtOWhPSGJJdl9hXnRseXFBQ3ArM0FMNHElKyRlNTY4Qnd7TldpXjclJiQhTmVVCiskO2pNbkdjZjI9JiU0Jnp5clRVVWc+NFMpPGslOSp0S2s0KU9ldnsrOGE7ejI/fTlSeyMkJEdzTS11UE5kJXw2IXpOaU5VUHMyaj1DVSZiCitPRkQzUVIzRDhpeXh6QjY3UU9jbHBSa2Ioekh3eElpdng8amtRXzRyZiRBQ29lT2loTFFvKUY2eT5kLWVoOSkxdDReKU87K2BVYjRkJkxjCitqLTVCbE9AfiZBazZgfXVLfWMyOzNEZl8wSlVBYHZZJmtGV09gS0FkfXMjJmM5fGBNdXNUfE8rK3NrKDdLcjg3eX4qVHJPMT8qJEt6YEMtCittR3Yhdz9VMmQhMUV4KTlZJUx2QmZrM2l1NkFfLWxZel4hXndeMmtjMGIkYklicUUhVzdUe3tsSz5sQGFBWU08JChRR0RhbUYhJjBKJGVjCitAR1dCUSNlTEYpQyFaJjE1UGctMSZ7PyVUemFoe05rRmN+aj44NEM4UE9IUDVIWGQ7YztxcEskKE5jV19+eylSeyZnMmdEbEtjRSNlRXRyCistSCt9XjttMX09QFU9dCp6ejRIYUFycFdZOTtAR3R1RmM0P1d1KDQxMyhtUHs4dzY2RFVUSkF8MnowO0FFP2F9Q1BlKTlmPFBJWFBUIzVQCis3T2A3YzVlSGd1cjA+UXk8JG53MW5sc153NCtNdjVZPGF3aVVxREdiPDR0RmtrTHElKUdqbFo/YEJXZVZab0dUUEFhYm82azlyRTRER2BwCitOQ2c2eCEhNnQjOFI7eG5XLTJJV3YxfipJKTd4cWdRYihxLVh3XzhDJXBNaldLTCk3IXphWWJvb3dseW0pa3xRc1J4cThzYGJiSzRrUmh9Cis7Nzx8JDZzcmV9JTFyZnVOeDRpdGtnTj5YSHotJXE9bXx0NWxPWjMwU0lySTZwJVV2T25VQkZFYFY3OzdDT3BCVDdRc1ZYMF53Mn56Ni0rCisoPT1QKzxXfDBMPXpoIUtuVitGR1lrcSFQNV5HQlp1TGpHK2dXaG0tJk9jbSg+V3Z3MF5XOVZ0WWF4O1BAPCtrfDRjWjFxfGlCclMqTmUhCismRlp7V2VVd1htYlE/WnRvS3ZQRklCRE1LSXlna047dEVlYWtBcSlGaS1CaEE8Y29IZUtgN0dSfVQ3fGEjdzM1em1WSiZ+QCFHR2JDdns2CitHeTh3TStiREV2YHA/Qz13THBmOGVfU2tiJDhkdkk8M3pybDteMXY3bmhmPXJuK2RgNlRufWs3MjVBIX1YNHNLWmtjP3Z1b1NaaXsrOUhZCismSmNgeH58XmFZIVVRJlRuUnwjK1dAM31NbjZIbEklSU19JVRsMGFrQVVGdkROMkhfSiVMUX1Ka358Rk84ViFUblFWbElZbVlKcm8xNit3Cis3SzMmamVMekB5VTM8aH1EZy0/dCoyP0g5PH5fLUx4P284P1EoeXlmK0FKYCs7YEM+fnUwfUZIN1NJU1pfM3haPFRoVUZmNl4mTjRHMXQxCis3OG5fOVZ2cChVVWY5TEJZJl5GMERzXkw8akUxOX5qMklBR3M0djVnMU1rdD0oYD1uPk80MX4+SnVmZHM2aUZpYCl3aEIkczgwUFg7KiRsCit0PCk+eF4pcXAtMkU4eX1HMnI2VmlAbnp2U0d2T1NsUllfaDh1KTJZV0lGRjsyLXdrMGArQzVKdyRXQWpvRTM8OX1IV0BWQD5pViVGemUzCisrOyFjI1o/ZGJeWWkzNHxMbSl1ZmZue0NUblAlKktLUUdQY1NrV0IjSmY3RmF6a0h2ZzQ2VEYzSD89Zk8mfWtvaWY7czVJYTEjamRuOEc8CisxWk1lUFBnYkdxbjFNZF5OcF9PPyF4YC1DdGdvVGhPdVZFezVGMkEkSzdMKkN0MnhqLShXYmw0VTdpZXMqNFBxZEgzJUY2SkgqM0JyfjFHCitmVHpubUc/ajtuY19AI0U9SlV8U0poWUk5I18tVCQ5dlp8I3EkMC1YJT1BPFRpe002SWJOWHRnUUE3Tjk1ZFVjPUJXMyNCYVcrYlhuSSlPCityMndCSDs+WiFvWSF7I1FHNjl+cGEjJEBfLTJid1hyKHN7a3tRTWBwYGtCXzJ+anBvdDhYbUBaR0pPLUpTUUJjWllUbWZBQEZqY00tS3FMCitXKEtlIVUzSXQ9fnVWQStfXyFBQ2M0dzJ0QlJ5UlRxMSsxSmVzd0RXKlpmNTMoKDx1JGFeakV3VEZOfF9CVzd1YFIrQ141I0RsZ3dAITh7Cis8ezRHTGhnc3dCSyV8OEtgRjIqMVZiK1Y/SyNlPSpFKzEycz5se3BJTD4lKlcybEI3WVEtbjlOcCU5bTh9I0hqYiElRXlZTGEqNik9WWo/CitPSE5RMEV0cjBsNDtfNWJBRUQhOV5TPGwjMHk4XzxvQEw9KyEycHRpWSRFRkUzN1gqKkU7ZFpLZUlXfTxJNnRqND9rPUhvQHg9RmU0NXorCitIX0BGUSNAPkNkXzJza0k7RmgpUXMrWXdudCtLSUljRDByYk13cylWP1lYOzxKVnlidSpkPlE9YW1jUE8lNnluK3pLQW9HJCNPKEQlSGM2CitSJSMyI3szaFV1QiVzOTEweDZOYz5OQyVBQnJ0LXg1Uz5rUmlreHRzaERnTnw1KTZANjdhNlEoTDY/VjZldUlwfnNuYDNLbUttUTQ1e1ctCiskNkIlWTFAb2JPTm4rJmU4X0luVEc/fDgyZyNgdnV8Q0c9fD1FLVMqKCRjclAmKjJ4cj5xM30/VlVuTTc5Tz9uIUNCTUtSYHI1TUxyc21XCit8RTFiKFEmU3phKFB+LSFIa3pFPFJnI3RZTVNDTTRBbFJnUCprZGpTKSQjYVMhdX5ITzB4LWh5OC14M3dyNSE8ZmFWMnRGMGBKTkVUemdBCitJNDNUXmEhbFM2VFBtRFcjM3tBQnI+MjRoKVh8LWZhPncmU3s8RGs+OTNlQ2xgXmc8SkwyUXNaYEhfQCY/fTAjb2U/Xj15SClLbCNGaCNzCisreFd4ZzU4dmNeT0RwSXNnUDIqLXNgZDtvSkEoRFNmTzBZTSlMRylaKV9SN2A0ME03U090ZGczPy10X2ohZnVFbXo0VUtyUXx7dFpRTE9zCitHZllQWHU0eGZmbykqd358VmlEJFBPbWZVcjMpWHhzcHMmPiZOVH0zTlJ1SFJkbk89Sjd3cTgpOEtPU2E4TnlxJS1UVElrT0FLSk43YE9kCitmKTlBPzBAT1RSPXc9R2Iydnk3S2NBJXRFZil7YEUzPzF1YiFZNUF8Rk9CfEhmd2FLSGFDUXlFdlZePW95a1oqPXw8U1FaZ3I0fiEpNDZSCitTT3dBRE07YFRmRDNoUzM/b2ZZRyNFQmBASjgtJG9SNj8laURWN1k/d1BjWHVJZCE8eXheXiRiUnJtWX0kNno3JHp7I2ZhSiRoNUctYVdqCit7KE1NVGxeO1ckTGNVSjw+SUlXZiY/MSQmTWJCeytJNyMyZTBeWGZrTk89KCNvWExLZDVRNThxej0jXmZRakJuekY8QzElaFJRNU9LRTx0CitHRlkhP2NJSmtwJUh1eCpPM1NgT2pvPENBeypOO2tTSlJLJisqS2ltKihBYCg2JEN9Qk40RzZ9ODRHYGdrcGRiMytARXM7MDFedX4wNmRXCis2Qmp0SCQxVzRHZGZTd3NmPX1gfSg1b0g3cT8mYkslUVZVKyMxciFuKHdpPTBwRSZ2fFJeX3FLNUYtMUhrJVJfJHw0YGVSKD4/bm45PnZACitUQnN9RHxiSzZqQ0IrWUs/M2xnbWN8dWxANVdmcThmM05VUU92N2RsdGZ6QktUSiM2VVUyaG52YUFhZ0VIdjZBNG9+PG5BTX50RXBWMT8jCis9PCkocCpgNXVhfW4pKU1lNHJnTDYqclNZKEkjdloyMjQ0MnojTT45KGk7JT1QcTMpcT5Gd0VocjsjYnVAUHwtRFZAMnROenR3IzRAIXZGCitfNnB5WFlDO21TWU94fkI3U35vTSgoYTYoJjB6RCRXYnw1KWIwcnZQREl6N1VPNjxrbUNpQTd4eXdlTUktRjIzaFFjZHVzeXxXYCteM2wzCitWMytjWnBBXll7OyZyYl5oYk89NTg7UUJAaXFqJWNXTlZYYFBHTiNXcGFjRnxMKjh9fWlqa19pbC15dzU7YDg7UV9RZSpOY3c0TE9uaVdxCit+Zkpwc2sxN0VkR3EpOGk7S2V2NUteXyZaSUAjVGhhVklOdytXJm5Xem4jK01tOT95dnAkbFJhdmJLIW5MUTZLMHc+Pk4hSTNSKHg1bz4zCitSRDthMmBnYlk+M2pXV3k1dWoqQ1dPUlNTRCo2UlN7ZUB3citiRFdWbFdBZE9CbmZRPDI3QXV0RiNUN2w7S2BRRig/WlcxQ3B4SyplYy1JCitqWCMwdEBLJWtXMC1RQ2tBbVhyanNFUXZUSU0hKyNsRmNrKFVaX0xFcjJsaiN5ejA9UDFrdGcqQUd7Pkg/TkgzWjE5fGM2IyY+RD5zbCE9CiteQGwyOU5JO314PEBCQXJaQXsxK0k5JVg0RT9JS2JoYGRmVmdQU0cjMEt6WnlpYW5fKzx+Xk54UGZhVHdgJFM5XzlianQ5TTZFYGBHRGh2CitqKnVLejNebzlZPUAzeCYkI2xEMSglQlZ4R0JBUSgmI0sxI2JhbEdqZng2YHRGdVl3Nnd+fFJPPnU9Kz94cTRUYHBvfFBYWnQwM3gjaXxnCithO3pGelhPJj1fX3EzTCF+WG9vYmw8Rk1NQzZlX2c4ZmopTUROJVhwWCpzZU1kS2lpYy1ebH4xVzJjYllaKitSMiFXdDspYDw+KTgzMnRzCiskRTlXOXcrUlR5UGs1SmhLTnZtWEdtbl9fQFVOVEV9MjRpI0YwaG5eVmVBP3FSZ28zbHxAJn44Oyo5TUZSM2J3Sj9nIThUcyk+cj44Uz1nCis9RFFUbkB9al5fI0p7SWZ1Sil2TjVBeE9NJFY/PXp4QW83S2J0LXd+Y0lKekRCa3A8UVA0PVNhcTFHZCgqQVVmdnI+PHdCZXNIUik4KkQwCis3fS09TnZ2d3VES1dTbkFqTVU8SW5POyk3VzctMzlSdkt7TDB4RSsoMTZfKlNWbHZ+KDVieDtiaWZyJT9oWHg9TmlgU1hyLVE2eEd3Y0lTCitHTXJTUHRgOztHTSRyfDR7JitiVFk+MFVyM2RRK183RypTWmltR057blBVKHZsfTReV3V0RXphYitIblgwPmV9V2xoanlmSCl0dU1IUitoCitSJXJNWiReXz0hWFNRRkpBT1c5MHVSaHdfTUFAPEtGelBBbWMtRFQmPS04PEU5UWp9eldjMD4rWUwyQGMwJXw1bGBJJHRFMzlMVlFeNmJLCitsViFLSjA4RD9uOTVLWWFgQ2RII3MqZWAoYyZXMWd2OTRkUGgwZkkjcnlTSntpbG4jKiQjSzZEZkNpPF8qRiZrZklaYDBJZkRAU3lQNTM0CitjOS1jSjB9aXk7NXUjNDFiVVZlc35zbVh+IVJ5MzchO3hJYE85YChBcnMlO1N7Mj94UEFFbEJNKXZ6RzZ+eypQZGJwOCFvUThPRElFUExWCitgREtreSEjQUo+I0dEIU1aZk5tKUZ5OGBHRztCTUZsPSVIfEJiVjI8aiVsaTY2fDttdXd4Jng8RHJ9IzwxYjEhQSNiWlRFWEo3KUN5fWtgCislSzRheHUlLWNRZCoyRDNoLV9OfndwfV9VR15lIWh8Rz5BO3UmMmZrcis5TUBveUVEMm9YeHArYkl5R3ImYmhiNUlyc1YpPWJrfHVYQFlaCitxUjI9OHJpd0FQPGckWlZSYkJ1RUBxJF9CUWJFRUJ1SzFxPnRNPU98fWpXWHVfYVBkSXF5Pzd3PT9rXjl3PDRabEUxJFhyZzxsYX5DdklBCitHcGl6KDtjN1gkYWMybW1LPl9DMXNpVkJnNiFHNF9BPktFYnxjQVRLel9JaGVFaiQkUi14bjdaIzFyNCskeWJTVjAwTzdAa2lTY09iK3JDCitTVzU7YnZ1JGxDQ3k4TFh0Zy0qakFlakBYRmIzM1NFMj9ZUVp2KlY1fCUlaUh1TGh7Z1lgPG5jUWs2JjlvOzQpYjQ0UF99Sz09PlJ5REd1Cis0KG9zMTl4R0RxWllvblBzWUdeRVlQUCshYXpJaiFqcjlYX3t5Vyp4YS0oMU1eMmImeSMqXzFtKDt5dWl5cWlqPl5GfHR0KT0rR1M/XyljCitsSkR8RGl9VDZKUFheNTVudXFPfm1DS2xlVlBHYFdXPklYPXNfdHBiOEl5VHdpPUlkYitiUVpkVEV0WmJKaz1LeHdQQzFkc3ZUQ2YmWUMqCitTdUhKN0VWJVI8MSpCIVNodGhpcT5kKiVSI2J2QSpFPCZ1YSorTUIhYFhtfCtDLUc+Nz5sOXVmVT9NNHNmUVEhWGYwdktKTjQ1WD85a3lnCitKQlohVTgoXml4entWQ1RJJHtpRnZ9d0hAeitzdXQxQj5pKTZRJHVxcjxzVVg9dSZ7ZSRMYkdjPEQ9c3BWb3coPG5kPVNOMFI1bFYmJT15CismbVBqb3lgdiRvZHw0Izs7QXJwJWpCeHY1bFRLV3QoVURnM0kkal9kKWRfPjUkWlZOKXAjQF9FYk1PUGo2OSUwbmJiKTRjKUNQNGEhUCZaCis9YXRXKSNrOypGS3A4IVNHeSFtWEBeQyRYOVNXd3ZsRVl8NH1UWElYbFdJRFdydmtJJXNeSH1hJjg7KjVoaEY+JGBzem0tUHJjJnE+NlJQCitBRFdabmp0Nnw/MyNrXj4+bj18WUBZWDZjV0d3Z1JxKU9LYGkmZWtEcjNicTY2ZztLc0xHZTcyeDxRd1dVOzR0ZzdgKSttLUpXVnNQTzcpCisra2FBQlAwMUMqNTArZ0ZUQ0AhaV9PWE0/dERlTHUrcjNiVSpPQkpVS2Z5KU51eGQhdU9MN3RLUWQzYzZpJGNsTmNpNFRpRVQ9Yk8odHI7CisxWXZ5KFp4P1Z9Wlo8R1VJSz1hU2k5MFRaZlRWcSM5RXUyJThzVXo/YV9ffHY7RTtmPiF5PXs7QnNjRGgyV3gpUWc2RF40WWVSbkhgJFV4CiskKEBSYX4xRU5VOEFXU1dLRl47QCV2fjMxNylOQUs2XyplKClJXmZofCshTkghWUo4aG5obEklJkNBbV5AMFhMUVdgTXZyZnNaSHArVH5QCitoVEoxIzh6N2BtR3glN2k8WGJAZ31ueSFhWmJpVnclUVlaTFpkaWFwPVVrdW8maXJVIzsoUXUkbl5FR0tKTkd9X2pTOzFmQnl9OEU2cmN9CittMngtcUQrfkhIdXY0LSFzJHl3em5samM/Snc5SVlhJkt8OT1raXB8PCNYKjBxK0BjeCstT1lHdlZtWnZtX0ReWnI/LUdxakVQV2MoPnVECitaaCZiY1RBSHlxQDElMnxuOTtEKXY4ODhqQnU+LTRnYjleT2ZzZll7S2VHbDJ8JkU4K0piZT0mQlpjQWNebEVmLUIyRm0pekVASzZWaEkmCitLdjFFYHBKJn1wSzIrX1k+Mnc2MUlqME88QU5EJnYmQWtBPTwpNFQ3PnlUJE1nV1R3NyhwNVQxVWM0fUZWTmU9I3o7amUwWnlyUnNJQWRNCitMQWBVTipMQ2I1QlF5MyN6SUh4Pms9VEVnOEpyN3s+fDVkTT9qYmp+ZkdMI2FARllXdyZjWDBZQlllI3hQWFVNejRnR29fUDI5JCU4WWI/CitBX2FfaGlvaCZqa3gmYXd6MVI0YytlQ14zcGFsfXF5cmFCLVMqPSUlblB+cTgoMloweGZgR2BSfEE+YkEmMVIoenBkLW4jflNNdnBLSjBPCitfbDFfXiRrQmY9QUVQeG1JaEQqKERTIUJYQ0NHVjxBbilyWk5PcSFGP0UjdiszQHQ4X1luQF4oV3V+KHZxYFc5VVAyK3stdEY4fFRhfSpGCit9UWZhPDVrUDZBQj1zTj0yOSpUWl9IZl4/WitDPTNZT050VGFIRE59UWdMSXFhOFNYQ2dKT0JXSmEpQlJjWHpeUVQ1fisqenR+N3NreVcpCitvQmNsPmcxZCVQfHIpI2N1dTFBX1ZTeXckVUV1Rj9FUiNud2RyZlZuZ0BSSiQ2Nk5eWXZod0UhNVBrdUctd1pLZChya0d+MUIwTTt+SSVaCitTSkFmME19djt9SSE5KlltX0RRUSs2Y29zK0lKSTcmR1JJY2RXSEF7aTk5ZW9gengmey1+U2YjRSZUQ3lBYn5OUH44cFphY0xjKkh8O34+CityZU5AUzBjS2R5YHFtKFI2MnpNJnd+TEkqYHN8M15zeTY/cUwtWFBHcSpPMXpPeyN+RjspRnAyaytxJGhgTyUwfEQ0cXdhfGhtNCF1LV8tCis5X3h+RGN7P0ROXnJ8fHBqa29OPC1JOT08VVlhTzJpa0A3I3lLcnJNOFF4cTQyTSopZl8mWWBkLX1efjc5Xn4rYzN3QSlYcjB4UypVfDtjCitjVihOd28+MzNNdlp3JCZXTnJQMGBnRzswTUphPiZoeWM8T30rUHBpeUs1RG4zJXlFWXh0WUJIWUpQd09OOFNFakFLSnEhRmpPZjltMEdmCis/SHpkTzt9d14kaTRVbSQodjlDbShxNmliSktBTU9WYGBFXjFwT0dzcG4wVUxPMTUxQzB9KkNiailufExQOE5UZXxYP01WSHluLTNqVEs+CitqQHIhWT99K2JQRiUhQyYoRTspbSNiaCg1bEkoQChodChwT3N+QEwqLXg0Z0lVbnlqcl9STmlsZUFVYlNkaikqTk81QmBYVDBMIXNTfSNYCitMNlJuR2YqYiktOz0wM3hQbHVyYWs3fn5NUEd3SFRIIytjbGc7IV9FMURnPFdZVWAwTTFDTk44UCVNKXhubWE2MGVQRTRuTTJyQ1Bpd2hYCitSX2p3YF80O25Udn11WWlxPEtQUk10R1lmcSV9XnQ5N0VHUSluJGRDakRDaj40cithfDlLT0RyN2xXSjU+cSV4YUIkUnNjNzNWIS0pZko0CitCcHdsPW16ISN2Z3g1VilnM01Cc1Vke2RGfXlMYExveDRTbHE7aXAqLTNqVE5+KV9TeT96QUFGRi0rVz4jJEopWnh0ZVF9WUAkLT1GWmo1CituNyR8WDVHZ0V6UzFvPUZ2X0g5OUE0SyFhMXhaZnB5JmpiXj1RdmJhODVRbXJNRXRuQD9aX1NGfk1efjRnTklAemYhXllQS0ErJTB1XjElCitxLXNKfWlNaks5Yj9vWkRyTldUSWBpZTR1amdVe1U5X1F5KChtflVpfmcrY1F7bG04IXc2WWh7Knx6bjI3QEQoTipvVz0oaGhuJkJjO21CCisyViZXPXVOUGk8TlhWKzZIQlZSV0l1M2xuR2BIVD1MdlBQT1VKfFJsVTtwRVQ3fTxic2ZZJVZrQjI9QHowdT5jUkNjJTU7O2t5OVRoeiE7Cit4UlFGQmI9en1LVk17MTg1Zj5wQVd3dHJBbWVzMWIjOHNkfFVnQT1GbDh9a0hFTig0TD9KKSstXy0rQUdhIz4+QEJBS3lmKjVsVGokQ2FVCitGR0h8KWNnIVY3PW5rPCZ8YiNtbmlYMkUkeiNeV3JSPnV7c21jS3k/KzA7MnRSMT41aktIUz5YbG5tTz0xKWorK2RXR0RCIytlcSljbTc4CitTKFJ7R35KNlhxKEluS3lnTFIoOXglYj9Na3NYcD0hVyEwSkRPZHtaNnptPG45O0hPUXhKIW8mNzNgTkZtd3lweER+WXMpY2o/VFVMWG1RCisoVExKKlZweWJHVTkxKkRQV2ooP2g8RWFaRWRQTGgtNXRfe2AxKCF+ODh1I3gwQT5UP0w8bCM4PmArTyFvTjZWUEU3RnUqb2FtaGJZalBXCitZQ3leKSVeZlcoJDFLcTd1ZVhvVFF+IyFxMDN7QkBqcj1kaGxFfTFEM21zd0tFSmJ7fEx0VElhfFU/eHQmOVBWcnFBKE1gZH5sY0AlOH42CitGdE1kfipQVW5JbF9sQWNQMyZ8VUNucDgyPnowXkJQUHZOWVhGcUJVPlE3dXNUaUd1RE9zanw4YiNub1RJPEJVR05EQSMkYiZyWl8kRWlACitFVH14cmMjNFhIKGhKS28payl0JH1lKUBKP3prZFlxJWB8PXkhV0chdWB9dE93OEFzV0hYWkIjM01wdnprXmRgSXxya09xdSVtSD03ZSNlCitQKD9iOTtQOVNAMS1jSUUyZjh3XytsWnJBNFNsR0xwX28qO0UpTyo7WF44YismdXpocDBQdmteY1QqUT04fDFaRHA5V0xRVm42dVlZMjNBCitKamlZQGdUTTRGaCpRJD4/QmIkI056MWoyU3wmTGd6YklsUUxkIWd6QkJ6WG05WFBVXnN2ekRPTmc/QyZHZlNHWno/UWAhXzNOKnRieVpGCishV2sjaCVWSVFDeithSCNJUkorKTVtRlgyRD1wcz9aNU00UEE1Mjk3O3JTTC0qeSQ3R1FCX3JJa1dnfFFFcjN3UE5TZStxWnA+QGhDciZqCitzdXJ6YGZpemNkQWdqd2cmIUNLO2hGUChsY2Y2YjYkQz0weDg8Z3spOTZEM3IqSkckcCMmd0ZEcDJUfnJhSStaRiRJUWdGZS1EfWpCRTRvCitiMEttbEIhN2lyQipucVp4RFVGX3k3U0lscjRDdnsmOWVnb09JXypMU1lgWi1ed18+diVxJDhNN1pDYEtfZSlFZ09qSD1gXz5PTlEyZ0hUCitLUFR5JXZhJDdDaldPdD0lRyliQytOPkJZY2hlfW95OCQ3YTtrUTF8YmxyN0pNRCVhYUUpRGpsTWwqIWZGczVXUE44S0Z8YXQ0NFRDYj41CitabTAjVHN4PzApVmRpZTFMST5gNXhsQDtXVWZ7MGQlYTRnQk9jM01rWVFoejRsWEd1UG17NXBJfC0tQVFnclJ0IVNCemA0eW5kS0A2Mzc/CitDPzt3eTRZP0NPZHhKWTBsSFojd3UxQlZGe29mMUsyaXo8X24hPWJXVTllNS1xZ1NVOH1vaHBmYjlyb1J8LU5iPjBDYUxHVnN6fnk4SjZ4CitXTzdeTCtxJSEzPTE3Kkd1VU9ecWxndVdxTXkkOXQ5Kmw9dyZFK09ZSH5MNW12Klg+MmkjVS1pTU9jZyVrSXRoTW85UGV2RUs9QmdsNUhkCitTQEh7RyRINztRRnl2MDB8TDt1RXlgbCFodzJEP3pUJVZEKnZ0UHlJeClnU1VGXn5qYVN2RHppeVNMVEJ2VFNxPVpGUlh5cnF+Y1EqVmpICitRSWBMTHFZI2lObHhxUTdDJHpyKk1aOSp5UX4/WGstSUtNYVYmYnlGKj8lbnVLVSE8K0I0bj1BOHdKMEs0MjhycnAkYE0pMCFodnpQfGkhCisxWCNPek13QXtZNHZJbmcxViVCVFp8dDV1JkYpI0x+emdAUnVFOWw9UmpSPnhxX3poJDIxeyNLPDlybSsxQ0JNa25XVENMTTZjaT1KT2w0CitfRkpCPkVxKU5aQ1RIREc0RyZIbzxrdk5tbj9lUERfbzk2c1REM2skcW5rdE1IUX1iZm1CIXNiQEFDYyhnUjh8ZVJtZEhgJShYZnw2MSMwCiswRWRfNSM7VXImdWBfTnNKaCFqNVQyTyFeMmFWYERwRVk4fkhaK31+MmhDXzQ/KkJtSTxOYGNRalYkfFNZLW82bihaRmk+SzBNOTlKYVhpCitjWDQrKXR5VnhQfj59XzFnMHxhRCs7MnFtUDE5Sn0+aGs9NmRMVzZSZFQ9R053Qz4/ITxJbEhHfG9ebUVxZX55PSE/VnJoKilwUWkqPGRSCiswdl5QIStYNEhTQ0NIcyZRcFNBSy1qJF5fPiZNczYxaFAzQnZFO3gyS0NgdlQ3SkNPXn0wSlomNGg8ezxPY1Ikdk9aQCMzQ0NfdGREc29YCitHeW1kNDR+WEorRnV5QHNTPSR5JEAmNXg0PD18Q0lqRFVaY3xlSHAoSz80YXU0Q1M0VGY8JDxYJHhuaDdKYVpQJVU1NXowNk41V3gyNkJNCitiP3xkUmtAaDVoMz5xVzRlSFB7MFUqXn4pdW9KdkNGdmJeTVZ+YFNoVHFoe0QrclU/STg3SGNwbzVMTVU0U09CWU9qRX1ifH5md1M4QmtGCisjQnFlaFp4cn1laFEkfH1qUTQoN0J0MUVIcjtDUFFkWmZaTk45bj5RVXNiZ3NrT2l2REFVUnhVc0teQF5WNWRnWDVwfV5YQipEJllRRWpsCiteZzdxZ2lycCRwUlZ2fU0wKk57QXY4LXJafCVWZFcjWkV+dG8ybmV9YVQtIWBmLW8oQXJNJm5gMTx3JkAhWjxzT0dPKVZYTERJbyNsNyFGCitgdnleWG9ndXpHfFRjeXQpVnYwV0xUPlUwOFJeOFkmTSYoPGpKR1EmeEskfXZ2KkMoZEs0JGB4UDdlTzhkST9yMWIkZkxrOEFaTlU7WUdrCisoRyZkWkJ7bngzS0FubT15dj41QysrKVVVcExpY2txWl56RFBlb1hOVkc8YE02PF58SGpJJEJqdDFDNTxoTSNfVWgjfiQ+Q3V+V1lATWJYCit6JkpWUEQ9UUo8b1V5PCZpLT1RMXpvWEg/PzEoX0J5PllsYzVPeVJ2QHk1TjZVeTJNQDB6aUgkM28lVCV5PDJse2QlYDxkKmc5YkNpbjRiCisjaX0+Ql5aPzQ5TG0zdTNHJk1mWm0zVFhkeDJOVUYrM29udWsrKz4tPWRlQkQ+NHd9RTRfPlQ+QHUwRl58MlElUTNPJV9BQ3dNa25HdGlpCis9TlVRe3c5a2ExM2JhR247VDtMfUAmWmQxai1ibUl8Z1lIeTYlSU5OU18lU1NfUUE9bGBaeXQrSkBgME4oRnlRbXF5Kyg3bUpRNzxpJkJ5CitSeUk9bEUke2A0Mkc/enhuQ3BNc2N8QSRKNE1IaCkhJUNxYHEzQG9PSDdZM2FKe15+Y3piaCVhfVNabkY8fnVYPkVAPTZVZ20yT2gpdUtMCitgNGl5R3lSK1YrfUZtK3ZWRWFTYXA4YTl6UVUyZTwtVUlZViZufTI1PE0pM2JEJjZJRVBqeis9Y3wjQE4/dGtBTyhOZzFecXJHbE92TTQyCitgXmZ1NktmTEF0YGxLP0lQbk8/JHd5KFNEdEhKJEo+aSRCNWd4OFI2NDR9YStDajs2RndpXztPIytPYDFKPzx6enhgYk91ckE8NTVLKmswCistSlhkRGRGVV57TjtLaShkfl40Z2c3QztWOUhZUmEqbnEkQzI0d0JRWjZ0QzY4Z1d1YG9lYjNkazRGNF84QGlaZGJkKTF0MlI2V1FMKV82CitjRmJTQ2l3QnB5aTY8ZElBN0dvPl41XktlNnRRRShnNitjUkA5fExSdTdiP3k9em8mPDlHKkUyfD1uJnolajlsfkJ7RFVBWXktek5JMT1zCit3X1pYdEdmNTlsKFpsUE1RZ2BxeGtSaEhiTG0xZSR8V0p1eiZfPHA4WWdXK0hZY0tQMzBtQjd2T347RV9rQGhYMWcwYnZOIXQ+QzFVYzAyCitjbVJ1MzlZRTM/Z3NTU3g0ZnlldjN6ZV99dnx8UHYxYlJKYyFDc3R9Y0M4QSgxMDhgTGZBTkB3UHh1Xzxsb1pYfWkwNlh8V3R5K1VjI0B0CitYTSl6ZCEhbnhtZntLQipXKzFeKlpqOEF0e2JfZl9vNVdNUTY5PCliX1Q1N2plPEpgU1pLYnRUYF92b1BMVkMjN1l+KF9JJSN+MWdmQTchCis5ZVJyKiFDeEwtdyprJFpZUHdFZSt8WH1ZeUk9I0YqNj5hU15scCRWKklgbyFVTX1TIW8hVXJ1U0VFSS1LJFFZaWN9UE0tcmR1PDVOaGN8CitxPUxyU3NxKShXQjZ0eWFzOz9IPmU4SHFvbCtVcEtmZDBtfWtoeGx5MEhkckZ0djwhKVN1QkN1SnR8Z0hqcTthKT84PitMe2pnTHN8UDlTCitCZjxmPkVoM3ZpIVB4d3J1RChedCtieiYlZG9rXjsybkRpYUhZV094ajZNVTw/bDZEPmFFSjhoYCtHMV97eWJtP1E8fEhJYU92bD1AU0QlCit2Q2tKQykoZiZGNFdFeUlSTTI9ZFl7P09PPkxoOElxdTlaZV9UKkNPUyRJKlpnMnJIPCtMKTVSYmhRKlgrK0lQbk9iU2FJb3dIKy1OTmctCittT1hzeXBNcWREbz99ZigkSGpiS0FxUFIkTUlEeXNQZjxfKGA8TXBMaTdkWjQmIXh1aDxCWSNpZUB4MWQ1TCY4cHtrdk84eW8mYDV0WWFuCis5P3I+WTFHd21VSkQ0Kn5rZjhYPmhMJHZya0dMWCVMYmctbHVJZzBzcF5TSzsoMjFfRz1QVkZBcX14Z2M2ZEpmakYyTV9CQDg4S0JSUjtMCis/ZlMlV2d3d3lsUV9HJnJYUVRiPUh1RzQkcWh2WV43WT5Gd2hZbjdPcyRjbDBOd19AJksjZWpCdlhFVkU8eUY8NHZFWFFybnojQkJaOEJ2CitBMURjVmJ0WWtlU0RzQFVxKlFxaEVGZj4oPTdXX09UdT5NcTJVNFFwRH05PE0zM1Q/Ri1jKHxXS3Z0a3pTIyF+JHxfYFoqaHVTME9FTGE+Cit+YC1SeHlZd2toZSt+THdeVFNsZDY3RjB3bW9fKjVtZnZ6WW9HZGRZY2hUQmtBJWMmX1ZNTVN9QjV0WSgxPiZRRkx4MT4yaTRYY0hWfjQoCis5LVI2YnFEaVY5OHN6Ky05OVF7bH1semZCZk84aDFGVkQ2UUIwdz85T08qdC0jamE4IVo+S2M4bDJJcShNJUlPOHB0SHhfVk0pclF+RDd0CitEWkxYMHkmbE5EdW1HaU88KVEtb2UxYkJyMDYoNjkpND5nb145JTVyZXh+TXtnZ308MytGUHVSU2RIaUdWLSVDLXNlWjZuR2E8WC1HZysqCis5OCNsN0xudCYjaylgZ1pmaV4wRVExWmlURkhhPTItNmVkPD5MU3pCc0NKUzg9RzVFTTR3I1NHa3NKeVE0OTxmVTVOeileaiFtbjhqJlBDCitKWitNOzMpYENiUFYqOUpqJjJCK2Zmaz18eSM0PCE2Uz0jX3ooMjMqezUwYXNaeiNnUzhSTEVMfXJjWDFScV5Sdz5zX0J7LTVWaWxmZTJUCitEOyFCYVBmJHh3UUg0TjFxQ1RPaSRSfGh1eDB1TERqTHcrZyM4RyFhIWdZaktTejFmUFA8SHBXdTdzTTA3aiQzZm1KSCVqeVFNTF9hPGR0CitISVdYOD9nQC1HZ1VhPXc3PjlGdHBJTzxUbnMlSXBCalJlRGRAZlViUlRPaUA2QDljU2Z8OVFWPzJgT3pJUV4qMCgpJX5aPGhwUVY1X0IxCitqSTBKPCR2VmdAaGk5M2F6MWkjTig5Mj87Q0N7TUhZMyVVMjRsZXNyR3ZQU0p3QEF9SCVrTHxXT0BvU2slZyY7Nmp8RzBebEEkdUdTSEYhCistZ0VtT2NYZTBuSUlCIXttVEkpSmVFU3x4Nj8hMlh+MFM5Qzlxc34yWHsxJUhOIyh0V1JuOGVfN3hLMzFjTEpPSlhpWmw4ejQ+TnVpPVMyCit4TjFXYylXRWI8fmU+V3wlKCRQVjRzekElUTVEfE9yQ2haJmNWKjFeSkNHVEtLUG0/O2J6ZkhwOH16PzYhNj9VcF9tJE9HMl8waFFyRmJMCitgbSQqMGJKdCYkaEBSUXlPV0NVZlJuSEd6bk1tQl9PXjNzVTgqMXhEQ0x+V0t0QlFtZitvZUk9XmJsUE0wPEdGT0JJOXhIS3smdj8+bWBrCit4SlJBRV4jZ3ZLdXpxOUVNdkUkQS1PJF5EV0JyNGZEYGVvdWZzeiZ1PV9UNUZ6Sj9saUkrM0NMJjZvMUlSfTw5SmNLUW1oPTZOYD0mLUhoCitHd3glRnsqfWEzJmxvMldYfmZPRkwoMCVJUWBEb3MoKUVQKCV6WU8+UG0oOCoyKWpHY09Jck9QVUk1TStqb2BeWTR9bWRqXk1UVD9wWHVMCit2NCFzMDQ1K0EhPzVDdlZianYxeWxGdHhmUkZwQXo/cFYtKkBBcCN4OG95aDIwRnxHUj53clM9Zyt2cDhucCFAXzlubTR+PlNsfksyeUlaCitVb2I4VkA1TE1sc3gtYGZ8Tk80U0MzU2QmdCFfT1BmUDdGRmt2KXV0cF8tPmtTeExDYlRNeTRzYVM/RnpBRzVJVClJPS02cEV0Mz8oTll1CitjJGU0R0V8KkRWezQwYkQxJk1DYjZianRaQiVPYz1BQnkhVFQzcjItSF9sIWE0T3tHIzczUSUmbylZRFAoODl4bzt+bGhlZiNRXyprc31rCiteY1ZJI3JuQH1oMWg/OF9McWZYT34la3R3VV9tKG0tUTsqa2k/b0hyUnM0T2NidnU1SkE3KD1sMjMyT0huKDcjSHpAMUdudEhMT0NBKm5LCitTZGw9I2JhcjNOc1VRNlQ/WVZVZ3tETmo+TlUxOStrY2xAbyVlPFZ4ZW49NSgoeX05UVRkRWc1MEtmRTs3TU12clFrUCl6bFdqbjsjQkNgCittblBLV35fWnpwI0NDJmN2K2s3UHIqT09zWjxeP05UV2FEJjhtdCspYDN+YGxZUjY5RTU3eVFPJWY5P2h9UytjRSNNXzxRejFiOFlVNjNGCitpeGFLSi0mbjE4QGcwZTs1bWB2IWpTQ1Qlc3Q3PT5WJGBTU24zbnh6YmpVM09yRF4rZ0tITiVURkMpQT5uPC1qISRGMF5hWFczJlNGM1p4CitmJlYzcGIyZiVJQHhwcSRwUlJUWHAoIVF5TzVSOG9sMVNCMXd1Xk4rM2R8TnU/bkpWeVlgKlFaamp6aU4lPUV5KjNneDJYNWpvTSRvJDxVCisxb3tRI2tMY0BaeFF0dDs3SDhCN1YyT1hBaiokbldHVmpfWntHbV9UWmJUJlByKEJIV0xCQzVpZ2ReIXNsJChNeDVTZ3lpTHBKKjRfRTUrCitxWXYoT3NCQ04kUGYhamxaLXJjVzk2a0hXS0NFPmhtJDk0RE03dC09RW11WlJ3dU5TWmRKI3A0U350VF8yQ3ZVQUhsK0h8az1JWkJYO3pHCit+TChwZiVJNktCVUZtNTd4XytvcXEjIzQ7djRieikzdyRzbk5lQmJte1FtbnlPKn42UitSY3N7cHs5V0QwbnRNazc7Y3RieypuSCp5JCRDCitxQ2pNeENsWUJYdVVBaDd8MEk4JFBmO3NaM0plfUw0ZTEjIXZ7WFhxY0c2aDEpMGZHWWx2PEtzIXwhNSlKcTd7dmp5YF9XWXpWZ1lmKGNyCit9djY5fnZDXm9ERU84ZW54LVVfO2wqfUIwZkdhNzhMYEJpSH1jWSExKHhNXiZ4KEg1V2slbU09PWZ1IUFDSyExTE44O3RgKndGTWhKKVJDCitNKDlYbWhsMD9WSUtWNyMlQiRUUHA1OD5OaE4qXjNNWnFuUS17Xk0oczZwd2V0SXh4VUAkQmRPU1E/Xnh2KmA/YHsqQDRxWjA7YFNkci1nCisxbns4Nkpwd1k+OEo3TzJJdFJgWFNaRkhvIXIpSDUwPjRWZCZqOX1zQj49VFdAQU1jXzJlaXh0VmF0R34jbCFZOSFhMWpmMmV4a2FkJEhECitLIzlEX1NYfW8hdkAjZStpYz42WlErdmhQPCZ0czt0TlcpcGEjZyE5VCUxKjVHUTh9REJmfUo2YkM9YmQraldfO29IQlNpNGtxUDBnWiY4CitNO2BGS09hdmUoKF5WPVJINXo7a3FqKmlWTztJe0BOQTR1T1NJP3x9R3hfTzhaekpgRjFhKzlpMWdNc2pffkgqRmtWaE53QEcySWNJbilXCitHOXI3PGxtTFliPVB4KEVhP3FtPm4pT3xMMHd7SkVlP0xTMGZzKlR9UnhrRWVKcVlCWEljZjs8WCZuPF5ZMXtQd1B+TSRWNmx9ZH0zZUJeCittaG9TRSgzSWZZPDhuJUsqfVBQKCZXSlZLLU14Qmc0MHxDcVBNPXJ4UEljIUcjbmBqXkgyN1ohRzJlcEc2fDB8a1BZOypRKXFmX1FeeHVyCitAWGpmZXpPVFhXTDQ/aWt6bUstUVI+ZSVPVlZaV3NmY3BTcT1jczIjbjd1NTErVCplcyhDRjs0VDNkJjZTczZzSFdhJSRwUHxNfmd2bWc1Cit5SD83MCQ5S0s5IVorKEYwejQ8WUI0IzQmPEsjI1NBciN0QlVSfGd6O0tsaT9tTGt7MElNa2RqPDIxWnBJSiRPfCN7Y0pOenRoP20hUW1ZCitpNm8odipHZ0N7Z00heWxTIURuMGc9OTQ/c2gwZ21DUjwpKlJLZTl2aTE7RnVmXlhCa2ohZ3JEVzZlNn0qbGBVYyM4SUBrVkp7N2UmPF9oCishckNtNWNkPk8lP3BZcmZHUDRDY0Nne0E9QmBXNVQ3YWJEVjswcyF3Kl4reGMzVHZhe3c+IV5FKCQtOH12RzspWVZZLSh7aGpWbVBVX3JBCitAcHlGXkFfelFhbi1FYGtHUUpOPEVtZFlUKl97aE5ac3tlelg/QkhXY1poWmUhR2JnTUFHdDxzPUJ+dVdOSFN4ejZwO1lGMnF8cCR5Q3NGCitIdTc2S2dBMD5sek5gRnVMSm5GZnYtX2ptMClVWlFHVDJUMlZlZGtgKjxhPiU0fGJWJkx2OVAmM0YrLXEmakI5OSYpPVAlTHQtfX0jeGhOCitxaWxqYiFwYFN5Xyo8Ymo+Rkpudk9AQ3tsMT5fKH19WGkhb3NRbXhCOVg/d0xuNUtMMDY2eyF3c3h5UTEleClQRDRyOEhMWkQ/ZFNFUCNaCit1PC01Ni1ydUVSNXZIKUhgR3t3anN0NHoqfEdBYDI3fnA1bzlsQm4lQ0xRbz5VQCZMfjUjTT9gO0MpK0NlZyFxfVpzaGhGNElOLU94Q1FnCiskQ0gyTGIlP2k5V0otWmJTYnkzdn0qVWNDbU15P3ltd0YzfnhEIShMRkhYN2ZeQE03VnpzU28/Z3hUSDIlc0RRejM/MlM7emhiZkt6YnVXCitwdDtXOXZGYEU0VmdndlNfQ3RGP3lwI2ZkQmVYaik2KjwzRkBNWkxGckk4KGZ1ZVd+NktWJntuSmZPOUk1TUJgN2g/MChqZHlWMVUwclNUCitCems7SyRYYlcwKm9uVHRnZUxRI2IkcXszeDI/UUs1R3N9Y0BoQ0Z+JUs0Z0NKI2l7OXF7K09tQXJBUW5LeCo2NzZESUAxKDI+czNXTndiCis3NXd9VkVoIT5LOU5qZDdAU1JyZ0d5U1pQQ0ohYU1BQTFwSkV7OUEwY3UrSzt3cjlQY3FrSXtxWXhOJjtgJms7cTNDJFNeaD5wI0ZSR3t7Cis4cmtAZUVZU1lkdTFjajEkYW58I0tEYylDeVJISjMjemIkU1pWP2l0em4/PGpsa1gyeSlJeH49Sk1LTDdTSkNYRHlCSzsoPEQkbmBBcGhCCiswYFY4Z2RwfGlLZlVXT3JiazdKbykjNiF0QGw9KF93eUhrVD1KOWZwVGVIdXxiKEF1RjRadiRwJTtOQjN0JVdERCZ6cFhpIUMoJCFGWnwlCitpYXxEMl55QV5YQWdXUGhvXyNtOGtkPDBpXlhTTCRJezNScnBvQitYcX4rZmdmP1pnOHFIS2h5K3R2aHw3ZmlWTktfa0lJfExzWXdJJk4qCitPO2JBPExaUFZ7bz1+WXBHbHVTaikleXU2YUp0cEZ0TkAjMWNBTmFIdEx2ZXwhUC04NDBfXmlNSkdRYkppR0ozRGZZX3tpZiM+QG8tPG0hCitfbGtiZ1QmJjVfQlhfb1RyJUg/XnQ4SSgpSlJmOW98Rn1QWTZqZjRzUWkhNW9tUThJM3FFQyE0JUdIIUNVSzVgSXNnUz9TfXR2PEVSUWVeCit6Zm13aG5zNSNYKXpGbT9ARnMqRzA7bzBKamk7WT1sNi14P1Y4NSUxYlp5bFdydnU2PX1FXkpqa249IVY4eHItenFae050S3JIZ1lDMHJoCispamZ3K0F8ckd8RzsxQ2p+IUg0JFJeVXxBLVIrVy0oV3crO1BrTXo7QmVEYDVnZSNFMioxeFREMW5WYzJlc31lRXRQejlvYjZQcDJVc0g0CitwKlV4VW9vKVNmaylMSD8xSEZ2XmVfTj14cmVQaiYrfmNPRVkmaVFteVpJP3hiVS1yV0R+V3A/TX0rQmJZI0g0TDEyRylMZH1+Zig1MXFuCislY0ZkKk8qc0dtak9RYGAhWXtmcGMwSSlvT056bmNAYVFyKHlvYzhzdSMxRyh2TzhDeyhET2dVWWc3dE5BQGR6fGN4U0xCV1dJJkhXUTVFCismO21aengqIT1icVhiQDFrZGZkRiFDWU5qd1lkcTdmckJiTCR0fVprSE9WcXc0SjIxV1NJRmlRRnAjWlluR2poejc+TUJGc0JuSSNlOGg8CitLdm9hSVowJU96V3ZTQj1DcTZDcW1oYjg9MUVaa1d1Ji1vO2oxdXVHWWljakh+RWUtWFFzKSVfMFo2MTRmamY5dHhJalcoK2IwMXhsSWZxCistOHI/Qzk8RDA4NkQwNV5tViRUdE1Eb3tFcE9yYEZzTT9saHVNTkBlNFlFVlhNKEFsJUBqUkg8YHo3UHE8VVdANFJFajBxTzRkNkRFaVUtCitwM2Bobk9nfD53X1VkNVhBO19DX1hQZlJGOHxnTlpwfW91e0hiNTlLSjkjfStgVXROMU1senpqZHtnI3RFfF5td0pDUzRPYWM5PVJffGx+CitwNzZvaSY7Q197VXxvYjQ1IVBBISN0bXxKbj1mfnBaflNLcD0oSUM+QW0yP0BVQ0p+JGE9OzRqYFMzbXxfSV5JUmtLbklxUmI3R0F6PXNTCitWI0szUEtgI3JeZVBxTjw9P0RzaFA/UGIzYDRlcHQ8Mlk4T29mRHdEfiNSVTc2Qj85YD5ROXBATig8KUBiYSg+cCh3UU5VVTQwODY3bmY/CitlYTBEciREejhmeDl7ZWVsb3dyPk5tJjVYJEhGYE1tVWhGSHd+Y1FBPGU4Tj9QaldNMkNUN1ZeVUZ2R2kjP2VRX2ZGQTFyLXdKcERxUm98CitqMWY0TkVWTXI+RVMzM1NtMmJ1a3tseSpwQ0Q3Qk1KbDhaOD5xY0pAXnRiN1h5JW5BSXJHJDZNbmdpZEZtKFphP2ZkPkBJQ2M9e0h7STlUCiskYVZqQEA4SzgzRzEoSjgrTG9fPnZtbnJXT2lHb3tzbGZSWDB9TyozOT19OTx1UXcpNnUjKnY8TyV3QWJPLTczSU5nUm92Ymc0dU8jP2Q0CitqQ19vPlpCPyQmWkVKNTZWcG1ERENPKFF2R0ZRZGBoVSZKTFYqbk8qUTVYTF8pMXgwRjY0WTNWKWs4S0h2Qkw9cmd1NkRQbExxaWJAJVBPCis3SDZ5VlhjfU1KP0RRfDlAcEx4KEpnSFRVTU1HSFZ5c1Y2ajsqMWdranpWKk11Yn5jJFBVaDJzbzN+fit7JXNAVXFmK3h0Nk9URDROK0diCit5TkdZSCM0PjZEUGswODJtO24lQiQtNmgkQl8wP31XKzZGKjlAR1BoMjlDIXdke3ZGMjdod2xHTk1LV3phQTA4R01gamxoLS0hOTtVdVhyCit4QjVqYnFAQVcoe2NLOCpsZUYoTkF7ek54ZV8pKWRPUlN2Y0g1ekM2eU0yT2hlSTloPmU8cmBmNjAwPStFOSgyI2QtbjtEU2FKRGxyVyQ5CisqUC1GUntQaX4zUD5BYHJyWTJ7Y3V6SktuTysqMmI1a0c0bj1gWigqb3JeQzlxVXB3cGZnOVRoKilFbFNed0p0S2chdD15dklkdj8pTllMCitkN1MmLT8oYjBoVG0ycFN6aEtySFotIVA2aC0tPnt0OTd3TT9NLT9qUXwmYmRoNylydUVIflF1I019KGVQLVo9YmhTRDh4Q0RgRC1aXmFNCittI1A5eT5ucXFoUk5JUXNmPlNJPldKfCRoeUNnfDUmN0szMXhSQmUmPEJ5bStsdnhzWTM9K0whbk9EQUFUSEVLekU7LWdvPXdrUTFPKCVwCitRZCpHRD9abStzfEpleDBnJmBEVDQxNFdlIVNJJGJkWmNQO3o9WEZsKW9iNyNPRVFrVUVBV3x0WDU9XmlyUE08YD12TmBfQmUlJGpjKXRYCistPik3b2JzQk5YdkBeUmBjaWo3Q01PQ2cxI1BWNGgmSVU3WTdGT2xuPF8+S2pPdVpVQ1h4TkUlSFZAZDNCYWdwNXdIJCliQGNNMypvbiZJCitla25xWX59WUZVR2BqREY+TDBsOXwtMmBuQDZ6cCZYPmJRNitWfi1xIShFNnkmeTIpWEJwVWNBI2ZXNmVJbistLXo9SUJuNUs/NVFPI3xXCitMKkJva3tDXjEqLSVPMC1PSyZoMCpwb04rMXZEPnRTSHhzKzZhc2dwcHZoPjktY0BMS2BAQDtmRFlgQk98SVFZJGphMSNwelNVTk5IeXBWCitkbTVGJVRkYzQxKzRnZVBAPSpIQTZzVTIqYXNPVypaO3YhPkozbSFWdEBHRDZHO3NYI0VnMWx2Y2khaz9qbjB1c0wodDVfV25lb3tPSkV9CitHJXVSXihtN1FjfmJfSUU0Sy1FNF84TXg4MD48SkU/ajYzQHEzKTh0dGBQOWpHPWZIeWIoJFg7a2RYIWlUd3Mob1ZCSzZYWldabXNrWWAtCitCWVdkeCtqKG1zdEgjR0MhY3dGfVpscjVUQ2VxLTR0PXZHWngyNSslRk99cWVNMnlCQHNFQ1FSZ2VFbGEwKyYjWl5fUVpiKzNQKVAjZEQ1Cis3YkpGU1R6OypEb0x7ITdyQnhZd2s9IXJqRDxoMWgmXytSOyY7Y01GVTZpISQkVDV2aUF7a1BzNkY/SnpiJDk/ajY5VHRUYX1Wbm1CO1MxCitESE4tNCV+Z0I2VCpGYSZyaW9RcT59OTUrczZFQUUpZlgmdUpJS15NY2t8dDR3V21hXmRLPWtNSGh2NDhyMTtTRjZ1RipFSz5QKUBeOCljCit4c0Nkbkg+RSVRSSlDQlp8IWNsaHB3d2BEZzZWcW9vWEdJVVBrTT9IQ2Y5R1czPW1ySnNiQkwzPSpYTE4hK1lzXn1PODFlbWxCPHQydjgjCitNVVBYdWNNMiYpREFsRkJTPnlXJG5kcTlARDFpO0kzTW9LO2VQUFVTK2NTYVZ8IWB9aXs2MndnLVBzTikob2AxcWtyQ35wb3dkbit4VSkmCituODUoaDFkRzBHP1lIJjRWXlYrK3ZLQURxdj0rbzg2Y29reit3ITQ0cyQ2bDBCJFJNQ1VNTS16UHB9R34menNQcWU4JHp2U25rKXQtbT1oCisyKDBfIWAjVEtfQUZGTilTaHkmRGdfeC1QYXQ7VFlSX1VaKlo+OTlVV2pkKXAqT1NUNSUoeVBmVTlAUComRjM7eV8kbzJMVEJ+NyN0QCpUCis+Q0srSiFSUXx2MGpRKGQ4LVdHTChafSZKZkJhWXRxQ3trdSE2UDQjKmF2TDlSZmlzKFc0ZnUpPEQ4S0xRcE0zfmtNa3omTXYxdmBXMThFCitXdTR5aEd4ZWlmRHwyLXN6RnRPXi1gMDIjMV4kckNWJiNTZWgoQTlBYU0pQXdjaCM+dyE4a2tzcTxgTHh5KG0pRSpNQEQmUzVob3cqR0IhCitZMSR9c3FLRD05X2RyXyp9MDVpbkhudShHKTFxN3J5RmRDOWFNN1M0b3E/Tk4pYnlCKWhAIUJXIyRzYnhrbHNTRTBscm0oQUJ3UkIxU3UzCitLYFFraTs4TDA3SmJPdVpJbzRqQT9rT1UoNUluZkV6IWs9VWFtPCVnbmZlSTJQfGFmJSh9WWNPVVZTeTZ9YDd3SX4wSEJ4NTY1XkVQVlIqCistOC0oVmhOekljKFQhezk3UzdpUCFwPzBGdkZYWVRIKHFPdEMlalBaYDJ7TihVPW9HZnZTVTVzeUtPbnBiKThxSDdgSGJHJVR1OCQ4K3liCitUdXxBQm8qQUc0KEdmZFB0P3xBdUdqQ3RnUFAjUDxXPEB3M2V5QV9nezcya2cxTFRRb1BzJH0tMDk+b3ZUNW0qZ3d5NDVHd3o0fWlLfT1pCitoQ3lsdF80WCs7MThjfSF6aCs0Zj5CQnZfOU19MVp+RlNqbHEkX0A7TlZqR2BGKFhYMTdHck5LYmU1flE0Zjt2bjgzcm45ckZ1bFRjWH40CitxOTAqIyg5dEZKIT41ezd+Znppc1QzREVZSVRiSHcyNyUjWT4mVmVkPWVxTzh7YyYjPWhJOygkdXhLSkYtfkN9PTF5akxnX1RraHJDbDJGCitNfjUwPk8tOHh1OElhQmNeMyN5T292UXg/TC1DdEU7JGNuT21FO2x9Yy1mN1RPUyhKcGJvPSZVdUZjIUtgMlJ3fHhIaDliVFRacFhZaGJiCitOMkgtaHN0alZOPXNrcDFDYmpAI1o8UlhYQTZXU093LUFtUCFtTTE5eVNyZ1NtVUhnUyVPKGklQWwwaTlGfFVyaEo4Jnp7T3hWVTUjUip6Cis/Ynlwaz1odFYlMGpfb0dZQzNVWSgwKXdeTzFGOTt2M2dxd3tyNzRkSFFmMGtjSztYandoQ3JVdkNTXnlpXyl4KXBVcS0jYH5GSFg2LW5HCis2SCF9RTlZLSYze0FFcyk5ZVh3S2QySUBSUU1jej1ucTdiTU1Aa0grSCZXTGBNYDFvUT9zTDRAaHJWJk9BWlpBXlVOPF83VCVtcCR1KmpRCitGcSlCXzBISXlhOyZzWGJmZ1ZsKldxZ3ZFZjUxT0R6MWs8bzF0TVB8e3JuVzBLY19GTDRXcDJee3lJeSFWfVd5NWUxMTB6KUdmXyRqZUF1CitnR3RyaXp8MmFnfCFCIS1zN1o3K0dNQC17fiY3Nz1tKm0pK0t1fTAmemMkTmIoWUE4JV9WU1k9aHszNHM9TGRtfWclbDhzd1Z0OyptTV8wCitPfnFuXns8e000KEdmYlNlK3trI185fCpFY1h5aSl1YGUyX1FpTVRCNUItQ0JXJlNSalVJQVRnbTUzfmF7dHYoSnFZZ1UpU20lVGJLNEQmCis4cmlEPXNhM141WSpkazx2PXR6QWE1eEt1Sn1DdXFZJSoqPEVJS0lYdHA7Y1VDdkpwK1l4elJjcGxTSkdhYzdwfjxNTihiemJ9UmE5bUdgCitCSiF0MSZVOFBkSjFnRF5pRkFUNjdPfGtfPWJ3YGhaTG4kVzVNRkBlcHhfflNke3lXaVdTMWhtfEx6d0RZTTFYVV4lM004Qk9ReTMpSGs9CitzMVE2cFIpYnkwQjU+JihkLTE4JkJ1QEdsbXJtPzsmcVIpQCVsTXdeTkxfb0F2LWQ/QyElbGx+OTF3V0kmeGhPIz1iS2w4U31gYTVheHN5CistelJ5NlRUJEFnMjNOQUQyIVopZHpvKlRyMHhBOFRkQ0h7fUw+WVohfklUTkI7eGBiaVZoNVlYfi1yajRASTZ3YmdnbHh1NVktcFRCfmdRCitQZ3RHPSVVVVcxdnd2akxpLSpLPm5BblNoe2FLMEBoRyV5bV9MN2VvI0A3KjVGR1FeYy1hN3hfJi1pallZdz9TZihfZnFuKjloQ2leeCV6CitlZ285cEg/UnFBLUBxRTVrUlF5fEtrb1dzNHxpd0xseFN9Qj0tMjxqU1lkOVhaKHZ7aU5BdXNuTGYyNEw9U0pWYXdpUC02dn5PVlhKeEtACitXWUY5U1NYQ0RfaVRqZmA8M0UtN3VQZlp1K082bCYqWXpYQEVWYHw7MGBSYHpqUDM5OEVQSUpDQjlDeihya0VeZjRzJVM+PkBpSntqVmVFCit2SChINWFScCRGUU53MH5LIXAkfG9jUW12MUB5UiRXQS1YcUhTI2JkNF8md0VVKzQpNE5NNHZ6QilqeFZoaC1qOEdEWnIyNUdRXzB1ZUBxCitzRDZieDJDUWpaWmYldzs3X0tKdn1BSHFifXl5I2hCdVk5XnhBd294TEBVKH1mUDhoZlFeNmdXaE5ocG9afStwfj4hNVRta3UoXjk+KWwhCit2M2IlYHwlI302MjNoM3Mtb2FOJn0jRTQ3RVVqJDd3YitIQikzK192UCF2MllJcTZ5PGw2KDJJRVROJXV4MVlyP2k/PUBUTD12fUFLNjtSCitsLTN6YXY4JSpgPipFK0I0b3JgOGUxYmBuZyt+NlJpNUB1T1RXMlVNI1RLN21MfWw/PVUmRVM4T3NwdF9tO05xM2Z+XylARWE7SExZfWs3Ciswa2d6UEZjZEZESHZQX0twKTUlTCpreWpJazNHWDAzQTxCXykpYXIpcWlTeWlOZyhsalNlLX5YNDhoO1RMKjl2WCZSWXdxQzVoRCV+MjZnCitoI0BzMD43P29nOGxINCM4d3phb3krKFFzZX1ie2JNLXZuN3RzTjFWV15HOyFrKS09alZfZEVCYTB3LWAjVipVOFBLQj5BQmo1cUJLN3QyCitxMSpxRHpgQzJtbGk7aj1lbmlEeXc4LVBuO3Q/WndtWChsTFFDNTlNY1VleWZLQGdFfWRiYUhBKEdAWGxYOF9HXnlLOTJAdWxKQ31Cdyg1Cis4aSZRT25XflE9fWd4ZFI9ZmZhOHBINGRIRnJRfWd5ZVlHeUJXNTRTfFV6bW1lbClabVYte2luIVE0MjJ9eFo3XnphakszcURkQFQ8aCNNCisyKUV1K2FRcDAlMTBGYT8rQ3lvUWFVOU0+KUVNWGFmbSNzQzUqWjZwOUQ3VipgKUd6Kip0aHh7NjNwZUUpY1hBVzE7WHFBNSVZeTxuYzB2CispVik9I1hmWX5RV1ktIUV0b2x0I05OWTx3b2R+I2c8dCVxezBrJj5NRWc4VTkhMnRHO2pNUW5iNGw7fTd1Qm8zZGUyXnM4NEojb2U0MEpHCitAckRfJTF+IVBnO15XM05KfHBKfTtRPz5ONDlsJntAeSo7T1dkRVZwMG1MK0BKRjNkU1g4Y3t8MW1qI3p1bCEwNTJkREQtI2pILX1aQ2paCitDc3UxYmkqLTRle1MpTSZFPVI0QDd+V2MmcyF5TFU8bkJZckhJJCFQTFdnOyZUejFrVHRCPG51ZVBscXhUekRfK3paIyp0PWJEUXleenBpCitYT2ZDWFd8RlN6KSpIbEJnJT5gV2R2LUF0ZjN+dTdCNzZKPVlheVk4IzJxVUdVMSR8SUImUjF5cVY+I2dtdVo7aT1jMiUlTV5ORjBmaT11CitxJWlTZiVNPWRLVH1tTnR0KkgqdURZfiMjWjQhNnZpMlpxNzBqeUNweEdfY2tCeUJxRjJxOWp6T0ohWWhaVWcwOHU7MEIjcWMtUDw5VGVPCisxc0stLXI0ZUt0VWhVdVpPLTRRMl8qUDkmJkhIPkJELWVtP0M+Y3dtaF59a0xzTHNyR0tCaTQjRjBTSWt6OTNUZHIrOGBNdWJoMWptSVE7CitlSXU+Q3heemY+ZGI9Vl95WGRHeTdfVFdqPEAqZE5NaVByQDIoYSRKeEVRIyhLdGQmNSNzVHRFUkgoQD59a1N5TVlacXZYN3x7V3xCOTQ+CitvKjx7LURyeHhiPntpMTNnWkJsWWE9TVZ4PjBOQ3tWRDdiIWleX29WO0pIXndrUyQ1ZFRybGRnPlJ9UHp1I1dMVUYkPTw/ZXpBdVUoPk5oCitfVSZaaVdqbUBoU0glRk1DfGIkVkItR1FRNGZrOXdSJHdVaG1reUImOGBDN0FjbnU0QDA3I2VXdTMrRjd1e3h+bzhHVHI0RHM7O3ZkNy1eCitLcj96WTx+P19iOSp3TiRUR3BmU1h1Q2BGWHZpQHt5THpRWjw5YiZ2JmE/O0lebDEzRFM5JnhPNipfJHkwPXt5OE9Me2NxYFlyZEtnNTRkCisqemwyZ2w9aj8rQCg8X05WSypAQz5kZmMpY2gtRn4xY3YmbEFqcFFKREV1anVKUiVwdSo+ZyEhUDAhcSRhdjxFbiF4P2UrflcqbzYmUDtACit9bnYmND9SOytDUHtseEpDIT9eaUlRR3dkK3leKDlwP0hFbz9+dUlTRiVIUl82bFB9akd1SWxZWmEwUnY3NG9MfXRQbyhqaXV3QUZGV3U7CitvV1hTKCloUC1nRitfajVXKUZobkk7Uil6aTwmRkdQbDYrX3FgNig5VmhaLWNqZHNvNWg5bm54QEZMbzNTVkIoaUVCSysyIUxKJmppT09yCitzYzZ3eSUmJTJrZ0k4a243ZGhpVjxNN0ZieCgzaTwwTEpZUGZ9K24tT2dsXm9tRy1VVX0+WTA+PHg+cWFnc20xTSNBQlEtayNnT247eiRSCiteflpHPF5lXlM9KyhLYDBzKU9kZk44fVpSJmJxIXJGQlopYiNWenNHMnNuYjsoblZ2ZTYqO3xvXjlsTip0RT4oS154ZiZLNGo7cDJ5LT9jCitmUWA1JDxCYXVQWmU4UkkoWG9DQSl7KXd8dWA9VGxLZiYrI3ZgKWd2WFglbiFyYitMU2NwMzF5MHJJVDRjcSRiIyFjQzgqZCpAUHl+QkFWCitJeVdSfXhkLU55cnd7R2ktPiVNc18+ZVlHUGxSNWdwfCQlRlUjU1Z1M0NONTtqTipBV25+TmJifWcocGc2WVI2WiViMkg0WmctbzImfFNECitkbzFSb0JlVylWPnstaH14Sz1kZk5NbCtuSzBvP2pnVWlPfkktfW1pUzVtcVgxLV5NOW59JlZpbkZecE1EbGktT01VKyZjMnNXaiY5Z1lnCitte3t4R1V+LUBiZ2YjQW1VbnluLUxUbX1RXz9ERDZfWldjZ1E5Mj90SVVwYUQ1Xjcrb1lnR35IJTAlckFQajAxaD04KD40RUkraUkxWCVZCitFZkBBZSNSIzdWN21rKEBYe2dAVG56bHF9eHI/cVg9eGRJZXQrTj4mIVUwR2FOezVUWGEqNEhTdlJ7b2t2QF8maE97P0d+bXx8NCNBeSVzCitRJTh7ZVEhQmx+PiVtPHxNU3hjMmIhKHNLfSFQVFNXJEMwPmJzT0RMa1hJVVorUlRvbnkrVU58Q2JOZSYwcChlVDh7MUpgT1Z7aXo3ST5hCiswTVZFTkU+XnZDVHgwZGVyPkBURiZ3XjhhSz9FJD5aVDw9bCFKZmd0O3QoWXgmNEM0U3MoR3dTI0RxNn1OcVVYKT1BX00tMHB4OT4mOCVECit0ISZHQGZ3VmpPckAzOHV4aSVIITJ2clFTRztsI2tSOFc3dkcrZyloI31KMXNoViQ/TUUzZWkyVyNXbSFpWV9AakpCSDwxdFVTe2lxXnFgCitQNT5uOG1xKjEpUTxffGwhU301WF5QPzZsZGBIa3NUfU4ySWlHbyZXTzJuaytNZClfeGhIayFKKzVoe3t2S159WE0rJlpiIzZqQiF4eis5CitpY3hwcHZLWTM2bmo5eEFqJmx+cm5eK3NlN0VoKzc+Xm5uZzRffnBiUSgxQ15TNnFMaXgjRUB7KmJQbDZ3LWlIcFlKRj49TH4+dUlEUXBpCitGez04cnNOWXFXMFppZFlYYGw/SHxjeT9KbTRgT35hNzVBfWtfU2N6cVJlUnlIcWIjYnVkUENfQ05ZSFZ9ZnxKKHFZRjgoKndTQEpgeyl+CitkRjZ0cFBWUHd3YFZCYEt0fnI0ekJ5eUExY1ZefXoxUEZpKkE5YjZESHluVyQ0Y0o9P1hOb3xvbExrRCt2eipsQ3o8RDgxN3w/KUZSJnlGCitISTt5RkhrXm5Nblo1SXxyZn03JWA9SGotaE5Pd3dMUG0jP1YwRFRXbCR1KGk9K1p5enFKRGc1RVArT1Nzais7PXA2OHhSVSspZ21UQ2FtCitCOSNZdDAtS2doeyU0MFJ+ZEZQYjRBe301MUMyVyZEYiFhRj1AP2V2dGVoSCNxb187MEtASGpVRTRZMnJjdXF1YSZeO0RVITlDYj0qKFdSCis7cDF1WGAqSDtKYiNhYnZUampue3koQDFePjZlRG0kI1VhfSR7JC1NYDw1ZCQ/QjErfD5NQz44UmZmXyk0anVQeHNRRiN4T2clNGBZbFolCitwe2NfR15qXisjQXVtMHZAPDRtYSgxZUdTQ0pSa0dTNmhWb1d2bmBUbGBSVWtwRyV1VWRKMGxeajclZ3VDUlJaKzE9fT5efkVJZ31ubzl+CitDWElXPUNIPCg2YUNpa1poT2peQzttOz1HWSVuTW1IXlMraXw2ISNDdVpOfGhZT0hxPGRrRSFHc1ZAbnFWR149VjlFdGtzV2M4Jk95IzZwCiteQkxFanE5KlRNQ1RXcjRTb1pJSV83ZFBxe3YmSGw8UjxycW0wRlg7KXJRZlYhPG5URlFRPCM0QWt5c0lkfURDRlM3aXltRGxvZ0VpK3BICitVOWkpcmc9bWxjQzlLcyR+Ym5kX0U8JmZSPSteZ1Z7Sj83VGUmNEF4MS1QKT47UCQmaWZwNSRed2ooWG5JKUFJcH1EO0czfld6PHl8PmlkCitydE1GaW5tPHY1SHY0XjVsTXY/XjwwXjR5PnczamVMdW9PdzFsUGA2RHNEMk9KaUllJFQ7ZnNnTCRqbkR2MD01IVE/Z1FTU2N3RXB7fHMtCit1Y1U1STtvaFlUYlcoNEhjem5+VHRxfU5nOGgmbXptdWcySGNiZkxDfUsoS0lZbTYkZU8+fGMkcVp3VG5WaVNAMFhrezZwO3I8IWhKd0trCitRVUl6dXoyMl5Wb15WN31iTElAPENjbWEqQUFFS2lmUmlTPHJgWHYhPGZqPj1zdXRKdVkmNTsyIzNNZT1fXlhycFV3anRWb0JkWkluJlo7Cit8QWlteFdkVE80WSQwbHhkRXh3dlJPbCteUWQ+R0t7Vl8/WmxweFZNMEFwR2V6QDd7VGc8JENjZmQ/I1dJdjt7VSM2Z3BUVHRBVEh8U1VhCitCM2NDV0VRO3VKNldwU09va281JD9kRjQ5O19RQ0hlRlc5eXt5RCNYMiglPU5pZENmX0ZFbkFuMSNhS1Y+R3sxVFVuaGdZTTwpam90VXMhCitNdjhyXlJicm4/KUJyKCZ3d1pOWTFiVzBoa1o2fTtxTjJyKSowPFZAUj8kZnpPbFgoOVdtfHw9dV5KY3NRRUJSSWhPSj8kPmQmWT9DbWxVCisoP1pvRnMhbSo8MGJGcjx9OGFyOVMqKH14Rio/SmRRIXBAaygmUUpfKEdzfCZNPmBBQHZkeyVCfFpGT3lDJjJaYnlgczlxck1zTXAofEduCisoTkJHOSZRKFZkSWZTPWQxO2BfNHsxOUFBYGJiKH1aaE1wKC0jKzMrT0w5OX1qPUc+KWRCIUI0LSlNaXB2bDdXS2h+TWlDYW48bm9+TlIyCis+WipKYnkhZHMkMEJXcGp8VWlmUlo8SF8lbylhbWtVdm1lWnhsOUZ0dzNJZnl6ITRCP0RSOGpTXlg3MUcyQnpWVSYjYUdVOX5rYikmMyRGCis9fHRibnI/Qig8KUhLM2ReeD5Xbl9KWGZCYmJhKEpxJWwwTkpIOWRhQ3pDamxLTURYUWJ+UTVFcH1VdVh0YGA1O3pzWTFgZ3ctM0FQP0M5CitgQm5TaTNOK0lRejN7V1FMR0tSX3xMWDY+a28kMDhePVR+TV88ZFBAUWx9Y05PakFrSmFRanNSaWFhN2s2ZmZha3k7K0J9Tn0/aV49VE1qCitERk5XJWUkYTU+WVl8NCRnPipjVSF5UjcoWmVgfXUwaXE7NyNDUmx+X09YLXJWTCN1MCltUHRCXnc0b0dkNzBsd0s0Kz41JD5DI1lCK2laCis2QnsjNnUwXiR+bXZYZSMrX2ZTcER7cU9sWU5pPCpifWkoVWttUnlpKGBpJmIyX0FvaXVVPntJKHYqNk5kRDlhUVd+Uyp6YT9zM05fcU98CitvJXhPSFhaNDttOFBhKENmQGV1X0ZidyVDNE8lTj58JmREclJ5I1Z+WEJtOCZndT4lUWtkZG1AS2VmK1hoTlFkbS1NQHlKUjZ2cWVTJko2CitPbll5Yz4xcmFpMj90OHNDaDBxPmBAYjhFfXl5I1Ntd0N6UWhneVFsWUAjdGghVipWS0ZpTCtGaXw5b1ZXSm9ubWVxcjZHfW1pSXFjJEo9CitYbWl3NUZ+VXEtcilgU3Z3bUs+Pnl2NVloSjZvO19nP28hdEEjdEMmK3AzV0JQXm9MZ2RQOGFSQlVaPSRud01KbTk/OV9gT15qenAyaSR4Cis9Vn07NHF3Nm9UVmZzPTlNJVcoJFVBYWBCI2hESiE1Xjg1K35KM2liVlR7NjBEOSZSRClnVXtJYkEpNm1SV2JZe01SSUJtZF9BN3cqd21QCis5dEYjO0Z2aD93UEZkP0c0b3M/KVg5d1RkI2RSNHkyflpsayEmSlZsXk5jLXxmekBhaGBFR2gxQVVKbik0ek5kTFVoN1FucitoREV2ayNeCitpRjloMHFQKlJOfHg0YSlFOT9IKmBCVWdEITQ4VE4qQTl7KjZmV192OFpPK2UleSo3bmR9SHY4TGx6dHVxQlhaPDMqJEx0UFBUNSgpSm8oCitFO2BNNSRnU3xYfiRgbFV3YT5OYXpBOC0jbHQjdEFZbzJqbXNlbS03aVhZSyQrXl5wZl88c21zcWZ+IzU0Yl5YZUlfYCojQWFBUiNqdn5YCitiNmVxeXs3VXEmQj99X19uTFY7JUxUbCVQV3c+fSkqZ0h8PDlpZUZ9UDk3eEchPUM3TWorLU89PDwtfT5RSVZCI284ZFojfDVwXllWO35PCis+OVJ6S2tPPlZIcFZ1ZSslP1RLO302a29peklmXk5ueig2YlM7fmRCP3h6fTQ7PEJYQTI9X15hYmNOTW9sNzMlcENwPXJnKHYwcFRhPFpgCis/ZVlIMnltajJec0szX3A2OEBFQWpkMUg8OThHeDNmdHdPQnxIeDlmPEhuJktUXndWTHxzbFpGeXBoRV5BPSpCUSM3JiFGVF5WI1gqKmF1CitFXzE0bjM/RCpKO2NkSCY3fXxHZ29Ca0ZufG9MQCNMfEpOI2pkb0AwZ0Q4SmxKUVRPcSVCVyFwXlRJZnZ8IWkxUkFAYXlzWUlCMl5IUi11Cis0ZTRJRmhYP2UofmQjZ29saUxpUzxsb1lJS0g0X15vcGFCLXNLI2Q7OTJFM3UmY2AzPnsldFdgcVYmSSs7cFVje1pFUXQtQ2R9Yns+bzRXCit6NEg3KEhFdFN9ST9VcV9JdjslJWdDPDxHMSZ4b15HPDspYHdPVTtFZTV9TyNNbHU9VzlSQTFmJCtCUn51RUl8SFczWlNTekNXaDVaJUsrCitqUmcyMiRCODhnd2NZVz1SQXJjTTdsb0FXMnkmfSV4UmtgMSsqWHRaZG9qM282YXgkMXtpMXtARlp9UzYjYFlhWGVKNTNoMiNGQ20rN30kCisoWFRkfSR3PT1ebENZZ1BMKHY4cnVZMjBmKEZxYVJ5RVJjaiVYMEA2QEs+YSQoQiR8ZChvcFJIV2toS2xeJXhPckxYdnFlKThNbyFWPEJiCit0TGVfXnp1cFd4ZVlNWHYldE5VSyM5TXZSRWpeenNaR3pUPGgta25Afl5SJlNgUmFJRkJyOVBTMClRWjtOQWE+Qzx0c3U0SG5ZSDkyYVg/CitlQ0xvT1FCZD5HTDxneT59dX5gUnRLZmNHfjk3dFl3RVJNRGR6U1REfF5rWUk9TCQmZ3JYM35hZTIyUnc0eGxVRSlhVDspJVVqNEUoVHk3CitRWkcpYW8wc1hGXkE8SDY+aEBnWmVvRm1OViVSfmBhdSZQSE9CY3MwT1Z5ZH5AMzJ3ZFc/N0pQJXAmYlhfZGFTby0pISEjclZySjFPfTx6CitOfDYoPlp6cWNaYGs4PXt0R3ByQCZzXi1QZzItP1M/VHxnO1N2ST5vYjJ7ZSFueyUoTnc5ZnYoe2chazdwK20+b2hrQmU1cDdHXkN1VXA0CitvaWFNPypOJmM3e2V4UnRXMFpnT1lFTE5Sc1YhQ09PeDR3XytQRlpabEAmdVA7PG97JTEwZ2E7SE16VFVrNDZzMFNoREV1YVpMcFM1S0k+CisoUkJJaUZ6a0RSc3Z1aygmb0AlNXpUcDFnJHRaamtZPkl2NCkqUStxNG8oQ09wX1UwNWZmRGE4eWp3bFJSMipNYGxfbUQwWUo0QTxocE14CitHcDYreCZYU3hUMiNMJkhDPURWRVIhPCpSTGwqayUjSjtBKE5zO3x2bHRRJmtuXj5sJTV7Qno+c3BEKXFSdXJSSXF6Uzk+JHwrfGUkTHcjCitYIV5PVkJ9WH4qczJfM09DczRLYiRFYks4QSZJVllPRnRfMHNxPCRGe2U8dH5KR1lNfGslbSYtNUN7Rkxee1IkTl9EOSFaP2FaeGJLQ3xNCiskOCUrVEZJNlloJElYZiYrJTx0SWArU0wkMTk8I0ZHbz9hdiM+YE1ITShEXz5wQVk/NThEYGowKnVWNUB1OXtyOX1ONUE3OHslPygyWnFgCitNT0gqQjd2KHxjNSFtVkFrIXExbXdHbkNiWXJDRmd7T155dmkyKWR0TkRQX2A4Yz0pcjc4S3JkI3Vqdz8+az41SGxWY3h6bTdJKlZGRGJ7CiszX3AzMiktUVJKZVE4Z3BmX0FVdEFOWWBUTjZQN2djTzJgXmZHaVJzZD1ZclpYUlF1SSQ0cThTQDRiQ3tWb2BRPXFESmFESGAlWWx2NCFNCitzY01Aamp6TXxqJmtDVSZWNFRgRmpKQD9SOWcqTzwqTT5RTCtSZ2BuREFDUHxGSUlob21vfEtYTTFNdlhWQHx8dXd2WktPbmlBUFJNUWtNCit0WT1+PHN4OD9ZdyhQRlNIKjg0XjZkIyZyTSEjOXVNfF9SIz8zTmB1O1p9dyVtY1d8UDJ3YD1VVjdnJH4/NF9AeytIcVpiWWxYIXFTTWh+CitucT1YN2ZwcSNtUjhwTnRTTVlNVSp8NFRDazJlUmFEJEtqQHIreEtmRi12JWE+eDlePlJhIS11LUQ0fTlYP35zSkJWfktgdz9fP3g2eTdhCistYVBoI3t0ZyowMVFAJiY2K3RhdD80SSF5YUw7Y0JsPGE4TytFbnNOI1J6cC1rMWlibVpvbyUpVkF5PnQ2NGQ2QXtfV29aYTtaamM2fV45CitnQVBidl9eczttIShTQE48PyloWnlHcVh8T3NBcjZJfEF0MjloXnJiPEpLYkdrSFNJVlZVJWx5a2ZePFUyPThMeTxGYm1ne0RGWFEodFVnCitTbT98PDV+ITNwZnM8QSo9dl5UOyhLUihzeFUpRXcpMHpRI3p9RSFse0Rqe1AzT0RQVG5ZMCpYK312bi07aWVMV19FNnJYM1chXj4hckMwCis9QyN1N2duNU5EKk5YQTdHfXBzeWxWLT99R2ZTRnJFck40fkd6K0J7Tnp4MXo4QlZoX0whcEs8RHohbHcjP2AzfVN9Y3N4ajR1ekk/V0d4CitBcSpJXmpRaWtFWWttNkU7O2pFUXJvUlY7IWw0Y3ljY2I9NXlWd2V3MEdnZF5NbUQwUWw9MXRQUFIoeWpqJX4+ISVEJE5eVVVNMDtOVko/Cisrc15rQnsrWH51ekZYTzEtRXpeZ013bnZjT2VNVmk7YVk/V3JMMlJLSmJhfX5fdCgoSHR9dz1+em45M3N2MkYjQWgwNzg7I1FuKU5YTWt9CitVWlF2czBRd1ZFJE58I1J0STBxJlhEa3owIT1ecW4lciZJU1M/JXI1Vj4rSkooNHdQU1pIb05IZWF0Yn1wMFY9YGImbDxga0lvcjh4YGNiCitaTiVuSHxLT3xFYG04aG51fXFNaz4rSkVNQHNXNW1fd3lgRXpEaHtjXiVBdyghMnA/RktPTmdiTnd4e0VNV2ZqN1YlbDNffDZMPnBVajUzCistcjU9K0ZydHYhZXNBWX41ZCR+TDFgTClpbzF7eDF4JTgxUFBmM15RPFpgb2dTdFZVayRZcjgqUz4oITF2QE1XK3gzKHBPMCMrND5mS3oyCit1QmV9ZFVVMUZ0NkQ3aFMjRTw+YkNJSnhZV0Y1UlV8NnVFNGJFJjxYZGhGbzVmRjZVPjsyOGRrTk9QNlp0bDBgMUJOUzY8IU9GcEA1a1NfCitiQU9BKXl8RT9yKW8+MXUkO2FrWEBPZTVSYDxCRjlxY1NVJUkkQiQ0QWg+MWRuVCExdEpgWmRZZHxWVjZJflQwV0NyeVZZOTA1YTBLMXpYCitlTWxgPmY+X3k8PXVkMVckRFFYbVFrK1BoflZiOERNdDI2WCkxdjslfi04TEF4OFR3OXhwbTc4ZlNzbC16RTlGblVrTGJsbjBFJDRScHpxCitzVmNfUWcrSmpWfEQxdmp1ZnZta0JLZnsrJFB1Z2d2b0lqSDtSO2VwX2xpbz9kSEwyeUo1IVlSRUpST3NLRGEzKT1KSU5oTyl7PHg1ejhjCis8SWVtX3FZc2FRM0Q7RjUzPUZnYElTVTF+XjlFUWVPYV9gWiZHVz0rZFAhQlNeQ2xiKzNhZiVybG8pNzhlKGB8TTtsdHQrTSZ9R0xOaGxyCituSi18TnMxaWpnVEshak4pdUBqdnZBIXdGNXkyYlR4PWV4PntgdmtGaldAa05ZPFZGOHowJiZGUmMkPGRFTGJ1fG4/cFAkUillY0ZUd2dOCitqI1MtdEhWTWBBd1k1UjA/WEtOe313NXt0QiFFY0RLPF8kR1g8RURtdSErOHd1RFZ4Q3BHWHRzOU9ken5QQkk/WT4jMmdYR29vSHRBKCtTCitscjBsJVZ+VmRQT0AlcjxpPT5zPTVRNzh2UXFtQXMqOyZxdFUtNzVPWGJUO15uJHlRKkx0fEpuLSN+Yjl4a0tsKjV2YlUwYjBIe0RgPWltCitMQC0jbDhhQDBlMlk+T3BwRlk8MzM3OylKYV88PUYzbFYmdUIlLSMwKHNpS29nZHZxaCpWNXlhQ25tKHVtekIpdz9AM31Uc0JuPG11UCVWCishcyNJNHRqR3d8Ul5RejJfRXF6bmU1bU9iYkdvRUIyYWNhUlc2Q0pDKCV4SHopSUhqfWxGNzRxTm9JLXtnRzEpemlPeUl8JWdNWSF0WHp1Cit+P29oST42WSZsPi1XVEpoSnYydzkkekdQND80X3ZENjdDKyhrOHw3ezgwUlBxaUYxNkorX2E5eHBwSnolc2JlP1h0a3A1KnV4SF5FYzZCCisxfFdJOSg/WEt6Sy0jZ1hySVdAYkxJcEszX3c2RzgmMXFNKGwwSS1gek1zWDc3JGsmOS0jM1YoNHpiayk0K1I0O25GPmN4PGpMP3BWLUJfCitpUHtfTHA3YWFwKj51Y29eS29MI1h8eWZYZm1jZHhnZ1RNOSlnK3thRXhBQUNpa1k8MldLVDt3eTxjKmh3NTkze0hUcVlPMG1jWmdHP2NjCitrR090dHtNciNpUm5faWNPcFoldWJUV3YlMDB6Wj9sQzZaWGprdlZvQ083ckB9elFIdEk5bkY8c0wydHZzN0g+TVlUTnYxdVJGI21XIWY8CityPmhjOWF2S2xsaShMX0ZMc1BWSzY4Y1B4dDh3Qzk0KTs/aVcxJVA+JEJPTG9TUH1YLWp+K28oUFJxcXlgakV9RHEmMUl8X1h5NG5jQ05eCis2bkNnZSppanxDWHQ3QkA2bUBBWWxsXyFpJG1ARjh8YTFAJGA+cnZZezZLN1RDI3pVbipUUXBoJFZ0TmtzQ08oKlI1NnsoM18mQ0dKaTFFCitGbj0/TEdZQCszdV5aS1JhS2FTP2NiPWgtPSZTMHdpJmd6bGIkUGRnVVk4JWlecG9GayVJJChPWWZYUHlwdGladXwqIWNaRDRnMUpyO1JlCitSJCZPaHpjUnF0fClTWSRSMGI+aylAcVgqTHEyOVpuYjVPNXVKQTk7fSEwKHluQS1De1l8Q3VEfCVtX0dHemQmMHs/SHo3VEJoKytpcnxFCitaaUBsLUgtVT85NjNqPWZlLT12YjBxUEcoKUFZYFc0MTtwX3h2X1c5KksxaClVPm1UPjZgRnkxa0FWJXs1Z0JrPyhjal5vUDd6MW1vQSlVCitqK29paV5wVmxrU3o+SGhzZXxtKjlSKFR4R0hmeDYxQCkqIz4qKm9kIWtYRmZ4eitLZSkkeVRvNmlve3FsUzhRNnNOMjJOLXFDNXhhamtNCispN2g7cXJeRHhrXitafCZJYU5keVB5MWN0OGc0Z1pWKipjY3JzanU0fFhlYnE4aEdVcHRUKHAqWm1RTjBHI0Q8VnhOITFTfTJSK0pUKWtXCitLYm93TChHYVYzcHJQVEpaeVo8SUN+SS1SdXA1aHBHMGleLSk+dTUkVzQmZDxiKFRoeWUhVk1pRWxQWWImKGthe0UhJUVTQGR5VG5PcD4mCit3MWQpWTB0Tk5BWnVwRHtpTm5SYFJCaVBeY2FTSWs/RGV5LUZAI3Z+YDAlNHI8e21mXlM8T21Ge1hNSzBXPCsqWjVjfjB3UikkUD9PJGg+Cit3eDdOQGoxdy0hYGd6d3gxdUN0MTJiYHtjXjlHajk7fk5DRFFqX3YtfEN6c3ZYQjFGUF9fZHtJdCpMKHgpeTAjVG5gTTdPV1BJYUlPI1k/CitXMVhAP2l+TWxXQj1xKjszPDk+MXVtUDdzSilLJGhhTEBxdGYhVDJvJTBobmJ6fVRoTjU/bmY4NG0rT1Vjb1FsKUoxXkliVGkoOSkkbGRsCitFdGJBOCNyRVF3XiVxfD8ydXokNnhMRVRHeU1mPXY3T1RPVFMlcThkUTRmRWNqUDlmZ1dvYCVXMD9LfFZQWXdCU1ZKV3A2bFlQbkZHOG5ICitYQlk+KHxnamx0VFAyMCRuSW9gXn4pO2FwWEUhcSVefSZlbHNRZ3l7XjBGdkBIb3YhNjcybURickU2aG4qTDRFe29eWGl0I1BLNkJNXy1BCitGSEFgXyluLUU0a1VmU0VAcW8tTz1fTHFgJHc/KiFyV0RsSX5vSWdqWjFANThFfEZrMlJWPystIUIyWHNCPVkpIVAlcSZGXkZrdzJ2bFoyCisjZ3syS35VZmQxc2lXZTUyJlYoXmJzdzdYSDh9N19zfmRNUXYkMiZiQCZIYTRGfDE7TCh+RHYrKkA0RjBNZDNATkRZTW1URCF+UUIwe0xkCityYXw0dV47QmxAVEE2KmBxQGEkdzcxVGF+VFp2UU9QKylVfFArbkFRczw/TDVfKj5uJGUmdURnNEFHPiVVI28wWD1ecig9TFNIKm9CbVohCiskSHleP1k7dXkwV1Fod2VaOCErQldHZXlnOSkkVlckeElJJWdZJmFRdF9NKXY3NTEhRERYJHBtZmRpRn04UVlGKG9MTU8pajskd3lBLTM4Cit6T3l5cjBRdnk9ayFLQmVPUyU2M0JXNXpjTi1SU1VBdk5BNyQpMSZaeWNAPV5FZ0ArdFd6SXc5KHMjSGs8V142VnlJIWUjNmZGO3xDQXhPCis7NSEzM3JaZkU/dE8qPEc0ZmIrX2J0YC0rOzwjWHJfTl4laDt0akVsZ29IZVooUT5neylAY04qI0tpeUxtT0hScUNiTyltJjhQSnFlOXN4CitubW5+WGkxYmVXMGkoQXlCeGNPNjYhYCMhTjZnc25qPEFHKFRFS29Ne3V8S1hvVDlvPjBGWkIxaCs9JGlNN0w/Jjd0UT1qQnlfU3ZOQDdQCitvYlA4aFEjS19GITxqOUQxfXltezNuTGtIc3s1KyNzRHVqZDY/MHVXKXYrcmpiKmxTMT1YfXtyUUEpTmdaPDxFfiRNYyU/NTw3bFZUSns8CisteVR4KTZkdG57antNbW49fEojcXpwYzhQQWYtd3ItcStwaFVjUE99MCFTeERPRClfTzJLUGpqV2woNHNnQk5lPH0hQ01yfVJqXnBXUlNJCityVWFKeiF2RTllbTxWT3NeZURMNnBFUTNfdEtWMlhrXjF5P0VmbDdoUHhkfCR5QDEtO3M7ZD13bUA7NVk/dVJxemY0P15XPEExdmVfVkwmCisxWHpvPmNJQTE8eHRpcy0xKmc2ZGEmbmwhOWdqWiV7QkAhTU9ecVExRHA9LSUjKjwxIzE7Iz9JcFpRIUVnbm02ZGJTTUJuNCtFbjVFenkzCitmYHNRMH01X1hhSTFvYzc1cUBhWnhwPHNwbnRIIU0/TFFjSG56OSl0aCpXKSR1UmNyN3p4OG1DRVMhT1ZiZHFfWlJ1Vi11ekNPSG8oRGIrCituaEo8dkArXjliYlVJZV93ZSpZNEUzZyEwK21aX00obFFEUThKb2lqU3NLZUAxdVRQcGdJR0d0VktgYkI5O3AtZzlhQXVrZWlXUWRXbURMCitBSGpxV0J5ZnBnfEhrPjZlaXdsUlQ/ME9jKlYlWT57N09uLSUmVF5USldtQXFCJXQmdG17Z0FJd2diIWY4MCMyYitDYX1yJGF9VDVXR0lFCitjamwmQHtVbSprOU1Dbys9PSltKWZLZ2w5TzVwZFZaWVFXejZxV3V1VURTVXkxYHk/T05DUFNnVT1NM0d8eG5aVHVWO2clYFZvRmw/ITVrCistWSROflFtV0I5JlJoenhte25QSDdhN1ohVmlud3A8RFU+Z1MzUzhxJEopdyh2PSVjLWlhQDYpdW41ZVRmQGRgVXNhIXxJPnRqaFJWfU94CishRmJmQEhiTXZjX0xUJTw8bD82NitAO3RoPHhHJWxgXz5pPFhSfX4yemVXJkR7JSoxel4qeyNXRzdkSSRzQHsqQkUxfERVUSg3U2FAUDFYCitQfHlabVc+YzY5IXI5MHwqPGY8YnExNV5kP20tZ0xUc1hQJkdxcVZ4PHE4fWpMMjA2TjNJcnwlamJmU3dQS2d2WlRoUTZHeW9iOFZKQ3xiCitFZ2x5eXJacHxpSWpnJiheI1o2UD9EXnQlUUQ1PSMtTzhVJWs8RVhwcngjdV9KY2pXOFJhP2Z6JWRufjBoTVVfdjElU1VvTFBqQy0pXzFfCiteTVA1Qm4/cUM+Kzs8Nm08V3FfQEQycTEwWXo+RFdhSCZyKTJ5OTU9dVY7T1U7R21ma2dndk9NUHJOLXRtVW4jKnRhcFU0a1ZvQmsqQjh8CitLT3tVejhacW9sRF5oRDMpRU0oT2daXj5TalpWVDYmUngwez4pQFk2ZEczbT05S3hDMmM0PHRyUmNDZStWMEsrNDliIyslZ28jdlZQfCZmCiszJThvZztadS1CMWBWK0g8bC0wZyVyflNoVXNweSheNWF0R2Aod25DJXJrVTcwZWJqdXxUQXI/ckl9JFljVUAhe1haaT1qZE15RHs3LUV7CitnX2VGcEpxNTR4Z3Eoem1fQktvT089dC0rVHMpVWooc0YkYmNQcWF1I31eQF9qR3wyRTIpbklXZThiKCFANTw5cHJUPz1qZ3FDdClHYk81Cit9LV9ZSj9pWllWNVA0LXklV1h+MlU3KTlAdkZJKTxRVUJnRGtOeHlfZzl0c0EyRTV+RGNXIzNwTT9YOHRQTiFlWDdsfDR7ZCpMQEBITENQCitNWj59ezMzd3AhWlREZj1wQTReZWlidlVnUFdWQF8lQnIwZ2xtLWRSaVVZaWFNSTwqKTRCbHpxQ2djaH5hIU80Xk5EZSMraU0qfjNwc2R5CismUXVXdUxGKl9vY01vcTJaX083bko+PXZVNnFNcHpNakY/aVl4MDNDMF5KaXlLNUFyP3E7cUVSMjNlRChTYH0kXjxnYXFMYDJwaUd7Q1F4CitlWEZPbnFOXl9CbFghTDxRejVMa1NRUiYra156bnF5Sis+eXIjS1dUKCFLMU5JJDdqWTluM3pgcCtYRDwwWmRQKlk4cmxPTWgwWEZfLSg1CitIdUd5N1Z1eztOY1pFT3FfKUZiPjkje0MmO3VgO18rNWYtYnh3SzVQezx8ZVcqWUxhMnI7IUJjOGgjI0VfLWx9V3xMWDdlPSpPPTt7b0hOCit0ZXBnSmdxUHd5RU82aEgmeVF2SEFpRC1DPW1uPHpRRXhZVVBXIyE4cUQ9SnBydnVnRmRfcFExQWZkfCg8XnpiOChLS0EkJT56O2gtPkdqCitWJWBgbWAtfE10UiplfUN5ODgoKTZxKWxJSyQtbS1QdV9TZkl8PVo+OX55TFJ1e3lLbiEyZ05OUkg+K3N1MGp2aE9IOys9UWpkO2YhenxOCis4S3drM2FlSnYjUVUoYDB+ezB1ZkJGeGVeY31BY2k7YXxge1BlUHxNRnx5bmZrTm0mUl9XTEI0O2BlUGNRRlFLS2o8YWUqT1YlNDFxeXkrCitxRG5Bc3pYU31QTXkxUz9iaEFjcWkzKCllZnN0Yj9MUSN3PlZibT5oWXVNVjVqa3g1SEJsbypNdm9kaldeN0ZBdGhEcnUlLUxEbHg4OWFCCitDcFJ6dV9KVHMyZWVTJVhgRkdxclc5QlclREp9Y294blNYPCNzQWF2fDQtLXRVKl5BUVQmJnFMeyN0OFh7QjtTNSpIMXtBSUJEe2ZzVyhpCitVZSZiRCZ8MUpDZnVpIXVTZDtIdyRMc3puVXghRTZSVnlfXigtcCMoVWlUJDE/X0VrO250REQmR1pEUE4jaUc3bnRXQlk0Tz9BVF8rN2BLCit2TWU+Wm40e1lLSVYyeEZpXnV+STBYYm9JTk1WVTAtc2o0cWU/PmNAb3BWQnRQa3h6SEd6LTArd2IjQTZuLUdQJXglOEpHNTRQb3VFOCZBCiszbGNZZXQmdVdQPHI+SjtwdHhOejZSI1YkT355VWQ7RkF5VjhrUV5Gcm5kcEQkTVRhK0V6JGo2MmgpWjxFaD4zT2hAelN2OEREV2phe0pYCis+Z1ZGWCF2WFJZSXRnUlk0flYoJG8lSEpAWCskdF40MFB8STttcENwZ196WTh9Snd9dXkxZ35OKWtkOUhWSFJQJXokI21panVwfTZia0xgCittTUc/WTRJdzVBSmwqWjdmLWFlX21ZPGZzbVkkWjU3TjZ3R0kmI2pPayVjYVNOfmg7KVY8SjY5ODBPTz5gSlhzQUokPG1XQiQycTdsKnBKCitmKGxYfUUlNVZ3OV4/N3B9KihhcGdAP2YydWsjRXlITyFuRktMUDlwKW8rSHdXeDk1dDJIe307KHFZTSZMMyh7UVdvSDQ3d28/NzV5U2JTCis9KHV1e0lyMytXP21xPjEjOTdSOF5CdzIlKHNCTXpJS1lPQCFscjsycE83aTIzRkBnPlYlUTBUR3x6Y1NLdUd1I31lKnJoRW9GSVBCRHdrCit3IXdMcHEzJEkwJU9AQEU3cn0mQ3ZEJHJlKWAqPWdwZ0pPU05UX0tlPG1XJXFXO0o+KC0xa1RVPjV0VWNuc1VGLV8lMXt0Mm10SGRDNHtkCit1flFqVWNOb3c8dTJXMWF4OVRqUE13YEdGMFYrJm9KdThYcTFoQnhWaDU0YkMoc1gxc0hoRUNqcCM0IXglUWwje3gwIWp0PztNQXl4RnJBCitZdm1FPld3QlZpQGVCKjZfNWwlJFFBeUslXno1NE9ATSVkdEd+Nl9iPTFRTkVsfG0wcVExZ3JFKE5oVEshfU5NUnJ0RXM9cXFTK1JpaV9fCittVVEkZE1jLX5jZipWNXdsLXJrZiRTeT5yMSlaeVg5TnlXPTNiWkViKnEtbih6cEU1fkchcFVvNlh6e1hRaXA0MEt0Z0l9KC1sciUoZV9uCitxNkNGJWRXeVN2e1JaaXBTMj4qPldsTz5lQC1QSzZzV2JXblBaWVBjSDhYLWY4LWo2QSF8cX50byltWVFSPDZjcHFZN18pUFkzOTB0bnc1CiskeHdlUD0yRT8zfDJycWI8KnZtIUZZcSVxWXI4dilmVzw8IUNNQilMZEJMcEdnOD9Pd0JjPj0yTzZRaWk2cmlmLTxOe3hQcHctYllvXmctCitXLVl7bGopQGBIbFNZUiVfMk5wOyVMMHhvPjRHQUo5b0EqUXlfQVFlX0A4cj1IfEBgWlJ0Y3R4OztOOUo1N2VyZUI/dl5NMTBFdSRVbWM/Citwa0BDQ0k/eypgVFpTPVQpLUkjSDVOUCE0UWBvTnctKTNqbmg7Nys2Vl9JSCVoQX1Ud2l5X2srQi1TN3NgV3M3OEsyPUI9USp4QnomNiQlCisqQ2dMaXhBb0JWUnFIXmQ1USg7IWR0VzxLJCQ8OUBiejlnTkRmO3JpX3NlKHlGSXczI3NjNiVOblBDUnJnJmRWbDcmbEk8MFdjKyNBd2spCit1KygzVj1APTZyPzhIdDxKS3NscWZ2emxPaCpQeHJKZzthN1R3VjZsNGBSVi03ZGoye0ApSmIoTjM+U3MoPFJHQFU0PFp4O0Q5e3FeTW9TCitlTFFxUCUtdVFWY0RXVzZMfmdxMSsyKit2akJEKzZzLUs4RlEpVFdvSF5RPUglUHZfeTdJO1dAUSpQQXgkTWooOyVqcjVEQkt0JChXTzt5CiswVl9FNUIyVW5YXmhyS3RSNlNFR2Q1fG1kR2c7TEpvSHVHanhGUXdvbjJDc0pFPSE2TyFRKCQmT3JaQklPN0g/b2NTfVRrM21PTElITkZvCitQSlR7Q2Eqaz84Vyl1eU5vR35kUUNuTDJtVzUlXnA8MGNEbHQoNiYrcEZXRlMqKDI2YSt2IT1tYmJyPF4odlAqOVdIPVUzPjZnRURmTHlFCitmPSlfbmJkUk0oSSF3KD95NyZwN2w7S2RBKXQoYWtgVXclKipVKUNrdnpgOGBYVk88SkJZT2t0bGYyP2d+cGh5ZSh5d2lvVCZ1UEheSCFaCitITzJsRX07RHFRRU1WfTY5TnVEdmc3QThCQ2loWCZUUnNxI1BPVGRCfFlOb2tkJll2c1hPUDRZK3o+Z2RabD8pNzZHWjNOUj52eVBFXileCitTcXNGKWpUVWRvczM8LVhramdBYzMyWXopY0kyLUd8eURkWXhMQl9OYGReYlVvJGtnTTN9I0QqN19eWHkxbCNJJHRtNU9MUCp4YE9UJCFDCitwQXhIe1RqbHo0KUE2SGtzVmxvdTAzbC1lWV9TOXBHRTdiZkElO2NxMFpsZmBSanQxJmdqcEs9fFJqbUM2RjEzZjV3Nj93VmtSJGokS3ZSCitLM35feFUtRVNkQGltZ25sTnh2JVdGWCFYRkFUJkIhPXdnJG8qbHkyey1IRUpKMVgoJUlIKSEybiFjQkhqb2liIT5VT1g7bUh6cEROJStXCistdV98eHlvX0xUPntHWmFBY3RQZSNmbnNFJF5ZTElseDxeRXN0flhmRWZeR0RzYD48ZipOJH05MSVBaVojVDspPTg0UCpWT25KXnd2eXokCithOHVXPTFMZDdrfEs5d3A2eUtePVRxaHg5aEFMdTNIIUZzV1RfUCpzQ1dCOCtKeVZASyY3cXRYajxEO3JJMnVOcD05KEt8emg4M3JARzMkCishQHh5aHpAQ1NpN01IU0RaSVNHZ2R2aUE8bFUrNDt8d2MybEQ0R2RxYWIoKzhxbjMpYkpWIV5ecX0qSj1nLUJeSnJ9Rkgrblo3ays5PUhLCitoYDtZQklgVVFpRko7Z3omaCpWbkppVVZGOEUra0MtTmtqcj9UbGQjVT1CVkk7NCN7KD9MKFhZUngpS0F4UUxlN31fcGh0Smt7RHpPMXQ/CitrbiU4NGBmWFV9ZHF3ST14KTVJJExpSWdsaVhSSiFCPWFQaHRGQjlIKjUjPy0rSUNleiN8KUpMYFRpKz47bDNtekt9ZChmY2MlOENeVXd+CitwbDRec2lKWFlNbSpiYUo2RDd0bEJ7OCQlVDIrMzspbEdtJFA3aFBLPjw0e19WNkgxNVZMelN2O2ltVDR1JS1HSkctT0BxNUFGQXJUJjdYCitLY2Q/MCpAeyN1UmlEN1QoNzhPeC0lTSNaYjEhUHNLNWNVSDA9Nng1MFpRTXttYGpyMDVMN01oUElHZDVnPih7PVN7VTVWRlNpUHYzOypJCitrTCVVNTlxOD5UcnpzRSRXI2MpaVltRiZ0IVhgN2N3V3loe31mQWsmYVYqMioqfkNqbW5ubFcrcU1HS0ZuXllvNFZlPHRhb0hiKjg4VlV3CitJTmtrOWN5M05IYXtwT0ZpRmFfRllfJkU8JStBTDMwN308WmBJPDh5YU9uMjs/RVN0cDh+PkhALUFHb0A1LSNEQHhoJnBlTWolQlRINyRWCitIUzE9M2pkZUBrI0pXWWslRFUrYHZPdmB+PGE9eE4lZzByfWtqOSZmODApY14rRkM3Kj9zXnMmOE9RPCk4cnA1ZGtKOVNSVyFtbFY2Mj85CisqWC1HP3gtO1VqZ1p9PDlEd0xhIWs+N0RQRDsrZjxUang/P0M1N0NuaChAWHBnQSUyR3BaSip5VSs+ZHBTT2xSRzdIP2hWJmhAfEQ5JEt+CithM14janlASmtUSjI5ZiRqfEs5UlMzX1IoY31Ia1kyVV5YMWNmP3tTKGxKPml5SzQ/U3g7I2xZSDlVMkl6KlRIcTk8NlJ5P095O00oYVI4CitQfGJzSUt7PXpSSkZAZlhZJFNTJGF0Pkx4X0p3dWMpKDw9NFhsS04xTFZqbjN2WUooQFZUK1ByTzF1QyoreXp1RClCODV0UitLO1RfWG1HCitGK3c2dmklanRLQkJpO3Q1WlZtK0U3QE1KO0llX3VGQWJte185b3h3fX47WVY9e2EoKj9ZVzN2VX18RWJAQ3ErPUk3Vms+WkdWYzRTMlJ0CitNezdrTF80Wilpa3ZnVnA+cVJeY1V+VFg5T0FfczVUU30qbTJXdkNiSEB4RygwODRqVVRqRnNMd1U+ZGNVMkwwc2VRV2hxdCZWd0JkTUtWCisqVUhKeDR6SmJoZSFZYGxWNGVQR2ooaGdMOT9JUEx+Rz5zU1RpZjVwQlpKNk58IVooPXVMUHtnfWx7V2JTRGdIXmkpO2lXMj9SSHpwZi1tCis3b2FIeTA4VTZifWdzfFFWP3BsUFg9bXVpeT0yKjtzYiUmMDQ4OXJIcyhKcWYzPkA3UmE+MVkwRUc5S2t5MSFrTzBSTCFwNEt5RmNyMDN1Cis0e1YxNClKcXRiNDxsRXZlKHMwQXtxPVgtczBIRiRzLWVCTVRfKVRxYXZYbk1SN0khaUQ7e1cmUkRANmJFc1p2eD4xbUx4YkJGPGhKWSEqCis1ZFBAYkkyMEA9TnooeHw2OSU+Y2h8V2VfcFEpZm5fLUtVUUAjWTZAbDlpa3llNFAzdWsqI3smNX48PkVLNGBPQVJ7OW9kc1lGfkdkSGtVCit2OTYmbDhxKC1vcS04SENwdmtDfnpUU0lVWVBNfkJVY3FGVjFtfFJebDslKiMrPjhRPjloO1kxbjN0MGdZYihnSChCemZzOzhvMDJTZVFMCitLU0VWb3x1S0B3fTY+PFJqdXszPm1vbWxTVkw5VTU7PkdxdEFAITJeVSpRZEBRR1QzdlQ2UnslSEVHNX5WaVNgXkBfUEZgQmo0NjUzdmVQCitxU3ZyLUcje2ZaKTJJMnpJM2hPe1QhKHloY0Z0VT44TClPeDJfMnhCYjRMIz47ZCgkZm5CSGUpOyFAPjBfa21uZW0zQFk5VjxuTms3IW1ZCitMUGtRSER4PDV7dTJyRTdXWSlTdGVhP056aGoyRVZ7fEkwe1YtYTJJVW5BKEBhVG0hbFBSUT9KXiR1emxGN0NGZW9vTypHNCZnOzk8PjMlCit9M2VNajgmTFRuQyFFQk5tfkp4JSNgezBoYEZNUEc/Pl99R0U4Y0wmN0tjZFBHZCpCdj15Rik2OE9TdllIcFV1S0hYQjNtWFF4YFEmQXZ1CitfQTJPYShjOGxfdUYjd0AlUllOe01uTXVXNUYqZ21ZbXpQSmhIVDAqSERfdz55ekphYGwzS1ZXPG1LSUYmbVY4a08reU5uVHBOfXFMZntqCitkbnMyaWdLJD5oQk1LO3o0WlpmSytpMmNNWTs2clJkd3ZFYEdHZFYqPHI7X25aJFZpPT1hZnk0NE1fZXZCclJIU2MoYlV0Rm4/NS18SjJ5Cis3WlBJIUojPkFMZ3oxbzFzNSEqKXI2Q1U9UC1GNWpkWnBIb098eSYqTm5wMjJSMFpMKCYmNWpJZyYjbyhLcHFgbD08eVFYQWVaOFZQZkc5CitCUyVhazVEN1hfVHw1MU1ETUYmVyZwXyZDeVZySClJcVAzZnBAa2pGZnJDX0lPVUJHKH17IzBDYEohbEJCWTgkUV89TDZsUX16WSNRbVQ8CitFMz93V1BpNDNGKVg9cnZrVVRhdXxfNE9qVCNIMXdecj9APGhrbDFgJmB1VFdgZVdsV289SCVDPWxmMnJiKXlvPnhZcl5sPGMoSTZzODkqCitaSDAoWSNYXnFmN3VxdUJVfEhLI0N9PCVRdE1yPGpsYVowbj9vcVdMOUBBS25ORkBvfVc0U1AhVnJpVCkyQn1RMkIqTkBabDFwV2xvaTVzCis8KVklI0FXNjUpcDhwaFZpbmp+dklnP2AxJlBIZHRPWXJzUmRtU3JaRHFgZmM7Kl5qZWxXPk8oaDghdTl2bHB6Wl42KWBOaT1AVCsjRE5YCitjZip0MD02I3MrJlAjM205N2ZeRWRMMnFfVU4tKVpkc2hldGIpSXJPUXwyMGokVip4TklXQ288cFYrT2F8d1cwbHtwR19eTjZsQGlFKV9kCishMG8td285YHl2T2ZgYHBAJjk9UmVRbzlASUlnTzN+XypyLUM+bWdSe2BNJkk7Y088REx3aE9Ub3dhSUczVlZ1KGc3fCVGb1p1Pzx5NCsoCis0Zil7UkJrd3otQiFKREAxZmo+RFo1RzhXMGdIZyNoSWtzQ280RWpyR0tOIUo0ZDxDVkteRGQjMkY4cSR1M2Exd28+N1g3MHljKFQmbnlfCitseip2ODJSZXRiVUgtVlRLZEpDcHVrdzNOeG89VlU5Wn4pdERFfDsyJHFTOFY/dEVgcjR3cmxXPmhPT3d7PVlsQEtOfG80KjlWSEctMGZACitCX3BOXnd7SjtNRS11WVhQQ1hjNmp3RHt8T2tiSFJSTkE+LUxkV3RYb3dDVFV9WGsoWXlDaHA8cVd4aUp7N14rfXoxJnM9SlE3fVpvS24zCisqKkc2aWVUTm0hLWV5OXlwdWFJYj11M2NqSj5Sc31hSHhLWTZ1NzJLZlVkSWlAaF9eNSh3Njxub1l2NFM9UWJERUB8dUhYeT5yem1KdUZoCis7Pn0xJnM9WkRBLTs+eUBJdTg3Mk9LOV9HO1h3b0spX3w2ZztTNHJHaUAoK15GQ04xPWxMTE91LUByUXh2bys3XlI/NSE0TCVsNzFTJXA2CitzKWdUY3FgfnN1dTgjYDNMYUROcG57Yk9aZDdvc2czQTt2cyZBWnJtVihuMnY/Pl5gcGl4MStoUishWlBidjdaZihJMmBye0ZSTHxHVjBkCitsPlV3OTlzaz8+ZjBxeyMmQnhjO3BZVUgpeCZBNil6UkVCQj5kV1cqKkZKJFFLR05VVjtgODV6Oz1sRTJgU2hSa1p+NjQjfDE5MnI8QDVpCiskM15hTkVrQmh7KmZvZ3JtISVJdkAqMy14KlckRkItSihUfm1wR28tU0daSFImcURwKkg4bmRXYXp6cjBCKlY3KzlaRVBYXkJeTT0oUVNoCit9WjN+eTMhR2xmNjspVHlVQnZDfmdFcFNyb19eY091VE9jUUI+SWBQOT5KflhvQTR7IVomPSV3TWBJciVBIzBvYWc1R1VoUWdFfi1AVXE4CitkLUhTTDN9dz5lYnJrK015REA4fmZNNSNwP00qckYkfj0mcHsyPnJoVU9oSEN8PWNkQURrVDwkdnM8VEsqUWpoeThUeUZ1QDMjPGdXQTh1Cit9RmVfK2M5PjUrKFFaOE5BRFlDVVBFdnp5KXBoZTBzal9FVjtGTE9rPkllN0chNyM3RDF6ZlUkfWxNZTd2bSNxNDs/RWVJSXxPRFVTdilvCitfJHN8OGVSUyt5ZiZyYlNJZ25zcVdzVl9PcVJnY1B3eypzdEQ5VkBNa014Rm0+ZXcjP3BZOV5mPmpfM2M3ZEN+LUEkVl4kOEZ2bEE8TWJ7CitkX2pkXmZjYkQhVjFkbnU9Xm5PZFFqZ2hmWjNLS34xK01iTjlBaFZVPTVBP29CPTMwVVF5QC1CcTNQVyZpRlBVWiQhOWpmKF5RU2IhMmA7CisxZVZ7ISleKl9YeXZ0I3hiXiFPaXFDIWdETFpxNVVNemtwdiY2SDxIWWM1KipmXyMlXlNlQXtnSWFALVR0bTB8UkpgUDN8fSthc1NubjJiCit0R2hFJVhgKlNeJUZMRDhwfGM9cj41WmB4NnxrJXI2b3dBQSZZUCQ1cyZobEIhY0JuWkc0P08oY3k7a3VTbVFOU1JJISFIPytHZCtGSDYxCitrWGlFK1JlamdKVT5pXjBXNEsheiZENDx5czhMIzRYNTZOO3N6MjcjWV5VSmY8eCVObiM/Zi1Pfll8Y2Z6bCora2xzaSMxNVVVYEAtMih0CiteLShtQUNIRXdQWW9hOUkwSnFSPEJsb1FZLTswdHM9dG1JR3FwQEcwVl5hdjs5aiM9NTtJP1FQPF8mX2trRHxFfGd8UUs9QTBeV1M+QHIlCiswMmI/ZzV7RSNvZjw3MVNwNjZgUW0kcSZKdkYrPmFUcSZMQ243QDdWa2cwPmkkQ2c2Kzg0RVRqST1iSVJObmNmKWB3fkY5c0dzek59VitmCitYKjYrYTFuc0xVU3xvTkpNQml3TkVfb0A5KXxyeDR0NUV5KnlNMHJ5YGslamg3JXNjfUBrV1MmbSZZQERpSkBsPWxWbytTNFIxZ31idj40CitYcj5OTSE2NkdHYElvZSFaKzBaeEgtIUQjPjskIWpzX244KSZYZDxfaVJTUExzSXhDaXVjTThVOTZyaT5ORHtMU2MjdFVVam97NDxVR2wtCitoNlZlQ3dUaHw+MjQhZklZWihHX35KfkdQWVNiQHB6UmpMTHhSXk5sUlNgbjZ2NGI/ODl0eGolZ0dYbE8jfX1zR3ZLNENRaG9xflhVVEx6CitXPGtmaWx4TSZXOE00bFg1TndsNFZaYX1QVWI2YCZHNlFhKkh3dzVCOUZ4VkU4U042bUo8N2I3VXxoQnxDbElXb2NMdGczMzloQEg+SVJ0CitzM2tuRClHVFI2flRPaThfX1pJOVpsekNNV29OaU8pUFZqNCtxIUgoQXl6TlQxMzBqcG9oMldZWllJfWpoZTNHOSNCfGw+Yks2c34keU92Cis8VTBeJFNjQktZVjYjUz8tbjc3Pzkjb3EqI1BRPDsrNE83SkFUPm5JRmg7IT9fdys+OzBuRHkyRzQ9NVRgM09DPTZ+dENle3ArezxXd04/CitgeX4/eHlfNjQwIXIoTUdMXyMlVHpyZ0lKUjgxXjh8fl9XamNXU21IUj0wOWhWY1lENGl8QFUjNTJoO2tKb2okXkJIYDxYJWQhO3smcE15CitBYjVgKTxXJl9nTWBFNVJHJXE0O01nWjllS04tb3l6ZEZzQ0pfQWozN1BMTkZoOXZ5NHUkYzVpcENYQlF5V1g+NiRGbnpFcVVAVCFPcldZCit4ZUxMYD50I0FxMnRLbzM7PDxzfnhNdzd1V2BkN3pyMUI7NkkpYUhXT2EzUGpKViRSbW5KKkJgZT97VHw4Mmw+OUMoNG5hXiktP2BHNlF6CitzT21sclE4d296TFNAeSpuMj9sTUVJSjc3RF4lZn11UEorZVRYbF9ZbiEwV2RZdWdJSzRhUGZBPFhNJDUtcipSOXA9TSZzUFp4eHY8M0JJCisoR2BUe2E8Qi1vYD1fSGxySGNTLWs5ZjxOc2NLOWwodWczST8oemZidEFBbyRIYkRobzF5T1lxa0hqM3RwZGhoWD9ZRGkxT1BuaCZhZWd5CiszV0o9OTQ+QWoxUFgzWGhheC03NCl1dkpIZSM0aCVQZHg1YlNyRGN1VkZPZzFeJGNrPDlmM0JpPzNnNlBZNmstdGV9aDUjSzFfVFoyY2ItCisyZ25JJXohd2p6bjxzPCM5NGZ9MH4oYlhhRXZrbyZRTkIrZENINyk7U1ZZXjtOTylRPWV0aVJHaG1HfTFHWU9WJXtaR3BUJHVxVUNeTykjCiskXyQ3enkxKjBnaDtqJDRSJVNxKXY0azEweUU1YVA8eWQ5RGwxRnxzP0o0JCRMUD5udUZ0TjglajZJQGRheSFLPm9SMWludHxORD5iOGZ9CitaZ2RrO0M0MVhzPD4/PV9xVHNGPV4yeDlMalQtUCltbyVsa18rS2p0Y2I4RSZPUG12byo/KFdONGE5YFZrYC1UP1d4Mz1KWnVtJCYlRXgwCis/SWFtUDkoRTxNczBrbjlvalBOfFI4WWkoNG9iUGV7OXh6dntFOHw7O2ZzOSpNT3Uhb2tDZjFke1h2RkZKaSprQ1coUFR7Pjg+e1VCLTtACitmSj9aciFQNEhAVzNVV3pMTERlNy08ZnhfPzFgPWAoMjFBYT9EdypScEJUcm1eaG9ZLVlGSFdrRDRlKF9iLUx5TEsmbT96IWpLd3IkJjNXCitvMEclO0RabT8jZnVsMm51LTtSeit9T05UZzshYGJHWD1fODRrPndjVGB4OUAqZ2V+YChLemhaQH5mdF88PGszYUZpY0RMKjU2LXR8IVk2Cis2cW9HdD1FM2VmZGlkflJWSGVYUEpebE5FVSZze3heQV48VnpvcDIwenB+RmVzO0BgPCUqK2VZejhLKlRBSTsxPmRPK0RQTmRGdml6V19VCis+ZX1WaypQPypJc2VRRDEqQmY9aihlMDBCYkkzdj5rNEVha3Q8PEdnfT13WUJuWm91IXQoWCplQ3RxJVNJfERfan1BSEh6NzRyIyFDYW5nCispOTNVREVaKGtIdzM4OzlFV2ZBc0tDQXxWc30oVnpWTGw2RjdISVVwYDYpQmpkQkckYFRsUTN8bUY/OXlMJnteMjF9R0p2cXh6a1BJbCZsCitlQWl1ejFQK1RobDBCUHRuRG1DRTxWTT1fIVpuRkJ+bmQ2eWM5QHtAY2BAXiVzT1UhVmBiMUFGYiFZVGtzIUFJSGZuajNtd3JYck1GMDU7CitISCF0PSRFTlNkYjExTkQ7SE9KN0xPJG49PGZEPCh5Sj9Hdll+MD0pdjBqcUB5NTNCRX5ifGtHYWJGMl4hbV9pcHRuMVJvQ2hqZHwyO1g2CitqRXJRN2lIVTZUPGpMJWdKTUwmQzxFdkohVnRAUEYtYEoqMm59bSROfE5pXnpeeSQrc0luVCVURiFsTlE4QEtxTkI8ez89bFcpJTQkcmtWCitZVlExIVRkMkJIaVFSWXQwN3dAYnxDUH16JEAlTyhiWnpqWHkkNH1xUGBUNUwraGZZdE9JKDI3ZUxnV2hzbFcmV15lRkVwTkNHJG4pe2RWCiszd0hKTDV1UHcjd2ZEJD83dzY2cjdJe0pTJH1IWm1jX0gxMW99eSptJXw+Q1R5X2RmOD1PRXNUJFA0VSRqYlFIPGJ8ekdXdVMpMkJ9Izc4CitWeDkhbyRQYT0rVUVAJHopPTJhZENvbzZETGsmSHs1VW95WWE+dyswMjxVKmBvQ0VaMShLZz9BQlh2V3BuMXRwPmM3NlhnP00lVCojaVprCis3WTAxRmBCKSlENExiYnd5K2hxI2otVmRDaVh9ezQxMGFhTmNRKlFJUUg8OFMhflBOZTc2NmQ+KTVmVVopMmY1SUo8ZmBYRzhYTEhnKyMoCishYHxkPClEZ35SeXY8cWN5UFJHM0EhaWRtPEUpVjBzYjZxKl5WZ2lFUmRGYCFUaDVqJlM7RVQ4JWh+R0h0SiNBT0tGQSg9PXBwdiNxbVF6Cis2Pig7U25vX1IpO0A1WVRBKj13KThDZmMkJC1ndHcodnU3aClgWGd0cilwRTlQLSMmS2UmPntCcitpJGJ1JEIobWotK2g7VF9+RDFfbFRTCitXaktiJF92LXVhMk0mcC1jTSRWR0teSFQmZzxaYGhZLUlqZ08kV29PUXU1d2UyRVY9KG0oTmxiaHZzOShqSEZVZ0dgUnJXU2lmc01RXjhfCitrRVhvQjJkR3BXbntiXjQwNyR7eFctKUFKXkpiKX1HP2ByMTs/IWU+QkJVcCFoZFp7TWkpMGh6R0lkNiNyMyp7fVJRb3IxJlEme3djVGtlCitKT3FuI2xNTi0rYkk0QGl2Syp0LSVhdDRRflorQHw1SitwQ0I/NiVfJi1xbUk9QT9QYF9kU1Y9Q0p1UnVVa2QpbTVuUElKTmk4SlgqNCRFCitDeFJHMUlmVV5+Q05oNU5jRS1QMSYzTnQwak11cnZaJV5AaVF2N2c9UHhJQElIMip3R1kxUHNraXFFSWAlUEliMjYjcEwtZTszNitMR2UkCishI2l6a1hrezlOZDZ1JmpieSVlOT9wSVJFa2FBUkE+JDU4d2s2I292Mnt+KlFSTyE0MSFpX2hBeUItVmxJWSE5fUlnO0JLfiZXQDdnKlJuCitYcWdLbERjTkl2NWU/XyZKK007VHhKM2dhJnlXYz5KTlp0O3kyZT5sWllwIWw7V2VpNmxBTiU3Wkh7OHVVZDR2SyQoOyF+Y2hLY0BKbkRTCitvWGh7PyhNaWIoQklqckVvVztAQz5EfW1zMHFnUW03NSQ/NTgxfHtXNmlXeTR5S0J2em9LQkZMUVNPSUNzVkdPentVJntJTHsmNjIodVdfCis7VkAjR0smOFkjZWJJS1o9KDNTRGdJSDR8MXJne2FmYDI0OTA7Y1BvaGcwfmlyPCZ3VXJxN0hRMmdsPnw4fFBNZzVwMCpAcG5ARTU4ZEs3CitldjsrbT9pM3E0Jk5SK3M3VXFOanA/IU15P0FpQlBtIz1BRGR8YUhfOTNNTSZ0alV9X0Z0bEk0S0UxRUt3d0lRSUlnWSZQRk9DZG1iOD1YCitKMWkxRUVxdzxlV2pKM3AlclF8S0tybV5FcCR5WHlscEZUWiVERjMqYDcqbzZ7KSpNVW1mIUNtYCFAfFpTSHl8MEc3X1U5IUpCTV5nOXlDCithJSg3Ul8zVzNPdXdwVkUoeWp+ZzRHK19oY0Q1Yn4hMHAoO1MlV1FzcjVndmhiKyQoYEdePm5ReU5qPWcmdDNDVEVEYHBMb1YrcUp1SHY8CitNSTswYHhFPGV5a2IzQ2l1NSsqWSFHdVRFWVAySz1HNXVuaTgqJWtHSTRwY1J+VWtMcHBUMCVIUTk9TzlGQyRmMS1GT3taNVNuQiFkbWBrCitGX01tI202VUY2MXo3Rks+cXkoaTFmIUxuJlR+cj1FVSpjSXQ4bCRAYjRjd0ZvRFZSVj9gRGsqT0VzZWZhMEc+ZUBKdjl1e2hCWnBEMmhCCitJY1dTUntGQlc/VnRfKENyT3wycF87JjV1UTI+e0peNip5NEZAcjZYIVMmP2RaVHh0RkxLbH5SdGlqdDUpaDY1JFolIW1Ha01BeXM9c0k0CitCJEptaTMoQDstP2NsZy1rI05AO3tpXjleU0BoQzFmYSRNfFNGUC1vOCReKlFMR24tdWckcyt+X3dyLWA8MXo4RDBwcUxteG1JU0g2LSpuCitCZUBRQnUpYG5HWjg4OVI8LUlXalVmdyF1RitkN05vTmJRPlM8O2JlP1dNKFQwcWhXd0xiNW9BSmlmUUxeRXtBMChHeFc9O3ZmQUVJe0VYCitGVVcmNGxGRyNJZXlOWW1CKzRGQ1N9USgxPTc2QGlFVEw4fGo7Y0hAUk9FNWdRJVgqanZnRXJFZXhkakkjX0kqfkhyfGVQVF9WWD1EPmA3CitUQD91WX5zeSU8PkdvbkB6XlJGTkwybmM8R0lEbnl2PmZ+aXJMc0U8R0lVXlE/JjhpcSlDJitjd3x3PXdYVShwYjQ2cD12VE9AbVRNKX1PCitFdyErWDQ9LVpaOUhjUD93UjZARklKQEJzSWM2diNfYG19WHV0eSR3Z2d5NHlXOS1RJXBKZU9UdU5QeTVTNl9XcWowZC1HLSE4QHE/XlFtCis+OS07QlpNajkqWi1NZzBeSWRWamQ0TmlVVzhUO2FrRlc5TTVyJnZ1KjRnMj1uWmBuXmp7dmdIJXp5QTZ3YHxZPmkqeT1OIXktZkR3PWlTCis9YiE5QSM+eU17VkNzK1goTXNIMi10OW87P0QoTEt3OF8kREBsP19kLThMM1RUVGhwcHh4dnpQZzQ+YzRCPDshfXMxTF5Kdyk+VEZrQ1A0CitTMFF7MX1RS1B3e1cyX190STF5RDkhLTYjb145ZX45OFlebUczaXJ+R0d9QF8lKWxxVW0rKylUeHUkM2h5V3NLWChmMEdrRVl8LTEqcWEqCityYClVcnlje2syZXhVYGpwVkZqJihKPTdgdD16YzZsbXhsSz13e09kaUNvXlZTQHNANC1Pan4jPTcoejVJVlQ0QDhCUWAmP1g/RFRiQ1l2CitMST9aI2hJVWc5TXF9dUohRnMpYUQ4PWREd29PMiVrUFpVfGB8MCgqdC1aYmRgeF58TXlqcGJ7KEE3YHgzeH5taC1HaEJ9SzBPRUg+RHQ7CitHPjBjRyUoVDszPnk/azRANHh7P2pxZmNrZ0Y2MnY1eHt7c3A1OWB2dFUkM3lpZ1R0VTFpU2kjMTdTPWx+dFZmdWp1TTBnbXF0VDs+LTElCitRQFV+Q2k/O1hLdmIoejJrPUVleWlyVjBVLTlLN3tYXlEkIUhzVyF1PitjKGZ6dnQ9d0wzbUZzYFVeSms3JjBiZDtYNCh7SClKRDc/V0QjCis3fTtacnZJP3lTUTJzPmM2MmZvTFVOVFkrVTJgVS1mdlpicDN4WHBuQVlwYmRMfiE7fWNJakZeJjQyKk1Jb29ocCljPntgOz9+QEE9fXBACis0aD10QFV2ZmpgUS08aW0hQTZnPEJ3bEhhTnZNTHJfK1V2OFp+T0xxQTVoQmdDcTNkIXluLXYke0hQVytyRUFLXzk2Jmd3WWtFJEF2ZlFBCiteVnMzXmtoJHsqQUFFMlImNz05d29qZHYwVXdfVDFLanJWZ3wyYEl8Xy1DSmUjJWNifDtaSFBoPlNzVDNJLVMpLT4qcHM8b09wY0t1M2R9CitBalQ7eGlXSTVySmZldVVfPT81Ky1TNn10UXRiTXxPUFgpUm4/M183c0JJQGh3Jm9NTkVTQmAmMjtgZFJpZ09OeiVucnA3PDM7WU4jZiZaCitJdHpSOTwzK3J8ayR6SUUkWGYlb2F0cn08WjNlWmBMKkpJMFM2S1E2KXs0dmk3dWV2MEJlQCQkPHJGV2o8YSVSKEJtU3hRUHVDZ2tWbW5eCismJH1uTUM3aTtEKmxgIWE4KjU1SyYlVWUkJnZRTCYzV2N2KUxTcWJwSSYrS21ZdFFyP0pmSFVjR3ReQk9iMiY9OV9QTFdvNHl7JnF0M1E8CiteVEhFelhZQ0NKXzJgYHRFI0hfTTwwRDg/NFVffFkwTSlhJD1va0x7YGd9KCQ9IUtNKHxQWFBJc1ZnNkttR2pQZCslLWdeMjt3anFyQT17Cis5TU8zbil3Zn1VISVEPmNxeGpRITNWRkYrO0lGLSlMMz5kcSs2KCtPSXlBSFBIbDs7LTMxYDwhVyR0PzItU1BlentQKm5IdngzVThDJkAlCis5WHhQMWJ4NDw5ckAhXkxiaVpifjheVXNBSElIRkVhOVR4RE5jaXNeJT5JVFhLNWFvdXRnRSgpIV5fSVhOV2t+ZyhxWn0/PylKX0A2aHdTCitJY3tRfkB7NGlFaCFffUE2ZGFxNVBJezZ8R2FeQFNZYzFeI2Nwe1dnRjdfMThJLUlqMXFSc0tla3QlSHo8WEwqZlBRMk0tPDtiPi15QWxmCituIWQmO34lPlApfEBzei17eVFvTShLPGBQZF96TTtfdlFASUtETmM1eXphbEppTSNhe2psfG9jfiVeX1lUI1NGMjlTcDh+IV9YPnsjOHFjCitrZnt8aEY/a1RDQ1dxNDBEUXI3QEQ9bytFUHktQURFbSk4e1p6YSNnWGlFa0BQITxKN1RedjNxbH07V21VSHZfb1g0RXRKbytmLSpCc19OCis7dm10bW0tN0tjTCpJWEwtZzcoV0Q/akdeIWk1V3V7dF43Q3QjYGVeVXdnSCgoQjN+JlBmIW1hRlZqQmR7TXdWOCRHJTdXMk10c1AhezZlCiszREFBRG4wcTFvV0lMfCFKZEg0PzMqMkVSemY5QXs/JG51SmFoPWBzZjMjRmllJUhhfVBmRDdhWkk1dE5JX3pzPzxqMzc2VmYzJithWEE9CitsYkFwRWNVTllYSXdVQ3pmNHR8Tih0VkkoKkNDbmYmYj97TUR4NFIhd1IzaH0ydGdLTzxTPGUmTkBqPDshPFhtU3B8cUFWYStrUFZGdilOCisjbGU8UjB9eGdReXBIQ1YkVFBeK1pFRiReWkJkQm5fakZhWCNYME5rY2YqZ3t5YVM5PWh8Nzw0PGt6Pk9PdD80NU07YmlGJF4lcjh6bnY+CituK0lfX3ohPmQzeTZueSN7SWVCNnhDN0NAQ29OfU0xekhCKiFVZzRsSUtUeUE4cloldnVEcTg+U3IzZ3BoMF56SStgbiE9SUEob3t5YWF2Cis/SkBxJGZfVlAkP1BLYF5jYCpXc280KD9GPlgpMlB0bH5Ub0gyaDF8WE9mdndUNzVudz5vZU08ekJePW45ezdmPSk3MFdOY2JUZmRwVVFiCitmV01wSmRZUl5sN0tqZnEtOWd1cy1ieUdTdFN8SUM/cXQ2YSs7P0s8KyNoPHAxPThxU1M1ajViTFM8VSY0aWlWYG1JOFB2KXRwOVNXJiE5Citvbz1Scyhiczc+dWRaQmhAU3E1RD9adyRpaHRJc0FMfT9DRnchPmZfUFJVczR7Wnp2dklOdk9zLStVODRjYFFAaDcyQTU3O2olcGIqe29qCiswMDRNS25Be0d+aHw0X0h6YyZGckR6MkBgYT45dEl3Yzh0SXVlWWg4IVRpQDhQXlpYZHdPQHdeOTgrRDNVcVM5UkFlYTM7Q3pJd2k0cVopCitII2d+alRYPj17LTduPDB7Jjx4VXQ0MTBGV25pPHwzKS1DTG9fXlRsbFR8QHo8RWp5KGN0OEsrRyR5eihJJi16KUtIJjZnSTFxR2dJMXI+CitDV1hFKGt+en45ZjdDUGRGRXF8X3lgVnZSbzZeeC05bm9tUHZ0e3VKez5wLXB7R35naGBTVjNZIWAjdlEqVj1GUjJqP1VXJHdiND1VbFI+CisoXipMVkVYVld7Zk9eU00zX1JtX0kpUUBRQl4/SX1JbEU5ekZfYll9QzhgaEo/RDViejM/SUl2IzF+ZyNJcXRPQzRedElaITQxVlp1Rj1vCitLQ3k/NnhReWw0Yn1uUH5WcyhYZkdOYztsZnd7PnU7NVNKYz40NlA8SVlPcm9ePHRpfkFxYn5LTWErNnp0b01+KW9YN2lGUW5zSVJ+cXhCCisrKks3UFMzbj89aTFJeU5TTEVlSCkkfk9RWk5VcVQjaGdCbCpTIShmbWNDcD1vYC1wVzM5PWI0K34yWlI3Wnw+e3duaEpDLWpfSCo8Jm1DCitqUkxNI3s+PVRWfmp5K2pMe1BRKVpQcEVDd3hge1p7UCg4b1BhbSMxTXQ/JDFafStnXyEjeyFYb1VSbFN2SDNNbFc1cFZHO0NUKEcqRGVZCitlRmhDckRIPE05R15fIyp3fnBnP1hBdXBWWDEqeGhCNTEmYUhmZn5XNy1RSko9SCh4NDJLcTNKQmsqcTZ1enxudSFWNFZaQkpGaUFsZ3JoCitVLSt1ZHpBQTNCTj88JT41enA7ZDlwdHxyWChlTXZkcFYxfmdYJj1LTUQ7VUdxPTh4clRhJTE+Q0lWU0VQOHR4KCptSiRzTWkzVTdQI344CitQfih8cjJfezdEdnN7RjdYbGZ8azRQeHtKVH47KXtad0UxXlQ5MSN6OW5VKik/P3VpPSRNIXxPellzTHc8TCs5YSgkdWNKMlUoU291MyFUCitjRDBBSk1ScVhqbzEobCN2YFEkdUo4PChJJVBQI3UlXkdHfmZPTWVAKl9RcW9leCoyakk3Qyopa1VtUDNnRUNFeC1NQ2ZxJWExVlpMdWdFCitaPG9ZI2F+elRgNHpZTnlrNjFwaEAjPE1sQjFRa25SdDEmcXlkaUBWXklIYEs8e0g7aX5qZDVjSW5kKldsc0k/PldMRjQjXj5oZHo2bzRXCitBNWpNdUVtfGFLYUY/JiZELSVHfXNpdCRSPUFJQXN6VF9IWHBndmNxYHJQRVg/RHoteHF3SzkjRTZSYUN8TlFlfT8xaXlSZDNpYVhKOW47CismaFJlfSR4aVowbkhmaHRNRTJ6JnpMb0BBNk9IVzdlWTFPSiN5UXVCdHtyZEllJDtydzVuUDtCaT0kOHUlMyVTaV48MTFGSTVjVD8jUGQqCitYdDQjcTt3KEVffkRIPXdQO1NQMGAkJW0/dEdKfEJKNyZNJXkhYE5xPzhVRy1UVFY/M25sXkQzJGZ6bFotRFpAZ2lrdkNiMz98QTdNczQkCitzV1kldVA+RXVjM0JTbCozYWBKO2YoWG43fTdicDNFeU1EKTw4ckppeW5pU3RJYmx7MnVzJTJKezghQ3AwPVJoWEQ7fVBhJWlzM3o1Zk9oCituYiZ2NCoxdmNIYG1XPzctUChwVitfPTF2YEcmYUI/QTU1b3F2clFITDUlQEY+d2p4aGglKjwmSElQRl9TJFBOUVhTXngkQlQtSklNb1JiCitgKnFoe0MmbWMtX1UjayQwTmpCcSUxRHpkdHZvOzxXRG9Oa2pPJFBxczFLO3FxQ1FoT3hZeV9CbzdDc1NUYntyO0BSMkpLbylJSFB0YTwzCis2aHJ+SnZAPlhAMzdaKEB2OCphRlBfditQKV93VjFJKTdWPHowejZQUisrV2IzeS1qSnMzel5jPU0lKClLVzMlYGhXaWl4MCVQfEp9PU5BCitebkAtNnF4PHshUGFuYi1hTD5wTjg1U0dAa1BjSXtlVFQzWShePmVafEgoeHBwKHozSFojY3VyMV47NSpHTGcpRCZ2KUM8ckYrKDFXRFRDCitmSXplaSg5KEp7b2xlPmsqaG8hVlAwMmxwU2JrPHt8UldlaE1EXyhlKW9ocm48Vz5LUl5Hb0pNWDtuQkppOXhaSkt5ZHIhXlZ8Mz5kKVkmCis2Xzk2MGV5ekh3eGlKamUxWDVWPThMJWpBbkY2XjI8aylBYGk/JV5lZVF3ekd5OCs8Wj5VPzRmMENzcW1uPlFHRjZ3RH5kXn0mVVYxWHpICismO2IwJGpUXl9PUG9GTl9RM2p3dmRxSU9YQDVOalU8Nz4hMEBDMVltZmlgIzkhazd4LXNWJXY7Y2trWkFIKk1OPDU5U2JtMjdreVZVZFImCitHbzhibiR1O3kmSCtlUTcyamc5M29GKUA3NXBoMlA+O0V5Oz4+MWE7Mnc3UWB8JFB3QkQkUTlhU2wlMk18S3sjUSU/TW5BQTFwWSsjaXM4CitlRF9hcSpjcUNXcmdwWl5wemZJbkNfcjF+TGZOS0gtVTI/K144dyRgcy1GWXBKaSFFPX5fSHxoYn1BR2wqfDNpLWlVOH0kSG4wQ2ZXQ3E3Cis1ZThGSCQ8Q0F0NTAjUlBJbWgtTWlQeDxlcmJ1bUV3PGwtTiEhflUtNHFUMno7bilJZ0tyRnMjdyRxRHNOOG1DUyhBODZuTHp+KGJmfnVqCispSkZYfDZoNks3NT5zb0ZOcj96QU9IQT1oekRMMXBQYmFUJjc/a1owcFklei0wbyZfLXtWVTZaXlpadzt+JXZEUjNCSHVqYHtgJlR1fFBxCit2bX5jdEVIUCkhOU1RSD9UXkljdSs4VzVXQ1dvajhzRnhAYyRPKn4tWkw8NCMyeGc+PEdEM052S1BQKGUjV0xEVz88PlVKZ309TTN5MzRTCis7WXkmc1kxc090SnhjbHpBSWtqMSRwTFR6TW9BeDNPKzhNTShjcHlLUjZYNkIhcHpEYnpwMT5POEl1OCR6S1o/NXhle0s5dns0TkN6VEQjCithQjlwRT9HQW5Mb3RKT01JPXpQNmIpZVN0czlNakp6NVVrN3B6U3B2XmRodH1kU3t+emFqQm1DWHZBOGthX0tESD8+ZkxMUm5GPUdhUUBXCitCVSNlN29+cWRsMyRAMVgraDJlRUBMUl9ENSkzYGBDWDBjWShrQXtGbk5rbTVAdkhMNytvaD8/P05Bd2hzTX5KMDBOZD1GT1k9IXcpfCE8CitYTmwzY3ROK2VIamktPT8yczk0fEE1LWU9Ujc/PHwwfXE9QE9TU1EtTiFLUVcxR3ZCM0VwKzwpYHxGXzMqa1c8QFAleGw/RjIwdj9sZUFxCitfRHs8RENITW11cyRXOT5zc0FxMz0za2VpTU8qWEtfVX0rT2E2PnQwZHZZaTx2XztyVXojYkg2MHEmSD9wSmBfPGlAKkUmazJhVU9UJHh+Citla01SJWUqcTZmIyojZ3xaZjRedlYhMntHKyRVRT55SnNeMnB7fTx2ZUBPTk1UcTt8ciF7c1M3JmNWaGc0Xzc4R157cz9fMWMjSnRHYyNtCis/PilefH0zdSVwZEtUWj92IzxgaU9JZ0p9TSVhVG9ZUWJ9dUxBRXk9cmtUTGdiPy0yIXxEamdXUGNxbCt7fmE4ZztKVSt3ZjQ8QmtYRjZSCistTD16c0xqVTl7dihfdEd0KnhtITAkR1UwXj1eO0BFbGZzdSZ3dkQ8UFR3Vig2KSRQQ0BuO0wweXlkLVNSQ351PTIwS2YzYnBHTFk7ITEzCitpPkUkUF9WbSNWLTtNaUFlVEBGKiFhNjBCbHtCJSZpREFKX3k0dGJ1Q1k7RVJ+I1JiUCpBMCt7ISs7d1Q2eUo5TlFraE1OPTIhazNKRz53CitBczU4Zmwjc0FFaUBuQ3JVOWZENWpmPmwyOXM7SyZFeXo2Vm94cGwkY0lpU0FhRlVpc04qZ3o9UVdxMkMoekpDY1JVTX1XMmJ8UE9xRTdHCitjJlJsIUUhOFZ7dXtsYjtUeVgmMn49Z2hoMXA0YjEqLVB6aFN1X0U8OGFye09jQUV4QXNkPEljVHRwYHJrcHBgQ1NVJDV9X1VrP05WLXhCCitmdVFlcEYxaFJ3MXdWKHU/IUU8TDYxS2FXe2YtOElXOXhNRXskKVBsaGp6V2h0ZWRnPzk5eF5oZU1HOTNAeD5sYkl3cDhadmsrdHJGV0olCismOUtHM04pdS1vN2pCKCFZZFZ4Kz4hSGg9Xl49TUdWWHs0MiM1KERkTFRyclBwbm9qOU1yLS1gQVg0PyZhSC1fNTFmTkVCQihMZWA2WkBVCitsS040N2N8RypjKUQ2XnFVel5QJT5OJjgrIWkqc1B1Ul5APUBgcnV5Yit1V2UxKTFnd2Ite3VFdnhzfFUxN1okKnktKXR4QktfKy18dkc1CitWa2h6a3szQ1c5VXhja0RtTCpRJUpLb2RRM3tLI01VXzlXUilVPzVPc0w2d3wlfHhGWks7KW9SQjN+JDFgOHwwcWJjdiZwaU9QQTFvN0BlCismPl51TG9AamtHIW1xellYeHxxfiVycyN2RD9fVD9teTU8M3k7Sj0zZGFuKntwXyslWSh1VHVrREtXdGdnNEI1RXAlNDtfNnRKVio9XiR+Cittc29IMHdoekNCcWRHdz4tUWZBeHp2KlhMZWAhVDF2YyF3ZGZCd1MkJGkyMVklWW4hS1hWQCRgXzVkeEV6fmVlQWNmSFpVSWE1c1Y2fjZQCiskNE1aez8qdWlhdmZePG9pe1BqZzk0UXlqI1Z5eWJAY1ZYbklgTTV+PTQ+TXw5SCVkaiZ1S2M4V2djSVQjSUM5fmN3KklSNio2ZU5nbT9mCis4MURVRCpnXkh3NHtTaT15aTVJY0okX3VefVk4ZV5NRjQzUXVIeWAhQXV1QmBqfj4jTiV8c0JAKmd+UyhDNmpAK1VQbTJIMUlaUnNeQU9NCitnaXJzcFc9NzAjPXApTXQzMHxgUVV9SjV9M0doeGdlZDNDU2hLOHpiK3FSWHZ1fiZHWVpofGFtKVlyazk1KVIlNiZPfCpGZUZTM3kraH1wCit7ckw4NlFAc3NVQSQlRTkjLVU7a0dtM31Hfm9RZVQ2e3VnJVNPMXVsS2g/KnZ+YWl4I2MjbGNzPUNNM3E/Jn5KUzlObDl5Jk9DUGc7SCtsCitTdCQjKEFDPXw2UG5rZExgWXpFNkQ0ZVp2YmY7UHNMb2woLT55Nj9JazlzY2ojMUBDRGBzX3l8fkdiNzFNWDN9fGl9NFItNitmOUJTZkVuCitCTER7ViFNZTBDQHFxOVd1ZjhBZEF0I0tVIzE4eEpjcHopVGZoOWVmPFUzb0IoSXE/Y2lrRjkzRSY9OXxoZn4jUFFDKkMoblBDcERfPUtgCitRMTIrOEBvZUpHaHMlM3VtNFA5RU1ScnQ3ZCRqTVNmaV9iJUtreHJfd0w+UEJTKCgtej1udiY7WH4hc1lUWTF3QVBlamYtX2dLdFBpJmMoCis2TC09X20jKkU+e3U1KHctTVkxRSRCckc5JFlJflVlYlZrPmNrekFMZXs9elBwb2BGVVZAQH0mVUFCZz1UQGlDNE1JUzVqJEZae009O0txCitVYjVQU28jXmhJR0V7QG1JUT9XMkxIaktydW8tNDlPdTN4cnB7ezZ+P0s1bS1PJE0mWXhraVZuPDd5VW5ePT0qJVd6dmJyVSVET0FxYlRBCittU2NKMTBGXkUtR193bXtpUiNzfUhsOT12TTMpdyQ3bnI2cGdrMXlLNEpYP1c1KV4/WiU+LXR+N1pZbGA/TUNuc2xkVVMzYFVfdERoVVJLCiswJXZgWnY1QHVlRVhHTXAqfm15TFlkd1U4dmojbmUmU0wpIUlobms/TkNhXmVON31CeT8tcV87MTAyMSpeb29tdzZ6KjkkV0AmTnlKJiFuCitsKT9XZU5SPHVQOH1RTiRKTj9PKExMKilyKz5obz9OUzc3NXF9SlVCfm12b0VHKDR1Uzlxd2N0KDlgZTl3Pn1OPjQyJnNEfTR9dDsqKk1zCitpYytEPVZHJCRvVV5oQWNPZ1U4c3ZKJGR5RD1SRGVINWQ7eWBjPG58UyZSa3ZuKClpeGNtWi0oZFpeWmpzOGB7dUpgKGMkdUlUSGkkal5zCiswYDttPkFUODY2ZSgrOUJ+QH1gIUg0cEtgOCpJPDZRYVJrTnl5VEVudWYtSkR4Kmk4NjVja2JMaT9kfnVOSXNmPFUrMmlsKj9EVk9lbntrCitHUigkWjNFe2B+cFleNXg0Vlo+c0w2QEZDN2FaPE1gWVVFLS16ciNkd3xTR2IhZD9IfjUxcktQMnV7OzB8MF5SWVEjM3YxVnxsXjhTZ2ZeCisldWVLLUdBT20lJnRzK3I+UWB4KEN8aF5peWtDP3dTUHRDPT8xdytyVX4/UmFhIVprVHYmPlA0NFVLSkFSTH1DNEp9IVRPO2xObyVtMk9ACitYMz1XdDsyXjglVVV0RWsoIWdqNnpgTF5xekBoQ2Y2Km9HU0g8QVdKJXZsYzEzQ3VBTEgrNT5uS05wZztRaTdienlHX2JmbnNOe2VUO0s1CituTUQ3RmcpRFl6Y0t6Z2o4XyR9Zy1SSHNsbiNzT1IqKj9pPSZLO09GPkRnUDNuViM4b0tmNjFBb257fVlgPikpP2JHeDE/YDRzKnpXMiowCitqSzBiYyo9K1QhVms7c1JfTSVfNGU/QVZXdkEzcnxIPyFARXFvMSV8dSEhWUZrI1d8MVl4P2I0UChRITdCTlhZUzJLOCRlfGJOWSg9ZGhvCitPaDdjTmp8e2FFeGRBb09wUGN9US1Jek1jPnskalUkMj4hNU4pZUJGTGNjNkNOdyYkO0x7RmBTQkwpU1NZV0pAYy1lR1pDTCY1QEYzKC1rCisyMDBZeHJQakcxcFgxPGM8YVghKiZqUT1HTGQmQENWe0pqY3NCYyFLLT97cXhhYDhTa0cxNHYwO2dtSkNRJDx6bWhBRXQ5VjdPYldyZEcpCis9RXdlQDh+fnRWQC11SiM8P3dXdT1Ze0E0e352R0ZMRlFmS0p2fmJCSlUpSUEqTzxGPj11bjJoSXNNQz1XQXNqPylLaXRjMT8jbTB5IUo8CitXMVIzb1k3T2RaS1lUKlFUZn0/QmRjPk48eTV0LTJMcHg8MzxReFRwNTV7bHg+ZVVrRyMpY3Q+ZnMzOGk+RT4qaVBaR05teDA1JUpKMmVLCitETmc2QnZZRlMtRUY3NTVARzlGfSYyKUcoIWlOMik5Oz1MRD1HVlg2SThJUVRTKl9WLUBAQyh2emZ5dUZjSz4xU0kkKSs0QFhyTkVabE57Cis7P0t9bW05alglMUZ0dyZFOCVNfmtETlNSYCU4T3kpQzk8ZmVzVW5iWG85PEtqfV8yI1FsdTc2b3dmQTtLSThMTyVGSU17N3NGMikwVT5nCitJKl9fO1I9WWJHe21Yd0krJGFAUlFLVEFDVmB9SCtFVjB7JSE4LXZENUhQS2dhXkNoPG4wa1ElfllyQEAjemYjZnVqd1R9eH00NlZGYypoCit4VntAWHd3fChvSEA/JWRIejMzbzE9TD1YPnp3R2MzaGpxal8yfGRgPmoyc3Y1ekBCMmU4fVAheTNEdV5OR0ZJOT9gc0IrZDhxKytIQmBjCitrS0FZTkd0UVlGeHkjeGRFejJKYzJQKVRCRzxmUE9FMl9mVG5WVW1aa0ErTGgwK3Mmb2czNGU/czUpR3xWYmcrPT5kTUZiO21Td3I3Ry0pCitXe1ordllmdzIwOCFSKlhNazlzcTZLS0VJVkN1PnReYjZFWnM7YSZFJip1RzkmODRpP2U0aDEoZ0lHQEZUTFY/PU5mPWJ9b3FFTjZkU1A+CitgPGd2WTtoZkJpKGd4UmY3MHtBUXBvUH5vWklaKzUwWFR2JTBDeSloOFZebFQzMW0rPDN4Kl9qKnM3MiFaO1BTKE9IRX1rSTFhQkF2VjNuCislZkt3USY1ViNwa1NyTn1mNElgOT05bG1saUh4UiRUMTdkR1Bzdl9uRl5tcmxfNWFiVnRyZGRMamRuIUFQO2JQT3AhKiN0KzIxO0AkQ3tjCit6PThfSntGJndOS2VkNUVKK2szaVc2bXRgYjJCdUsleShybyM7dHVvPn1icXNDaGNQOVVhbEdYZm9PekpzPDZmX0QxYG8xSlN8Z05ZX3xiCitPe19sRjlCWWxXI1NYK2VWcUxMaHRVR28tKSlWV0VeflZOY2dSem09U1dHa0s4Zml3bDtXNmVKVVNvLW9YQX5Ha016T0taQ15LcXxkWlhFCitCSFFJfj1NdSpYNUIjbXo0eXdQdEE3PXktJEY9bEF5VHI8cn5IJENQJihgem08XlVNT1gkU2dNM25QcH47UyNMSSp0IUE1ZiEwYSUpJSVzCitfRW87UTJVVWJFakVGYkI7TWJJakRAYktgMDhedGROSlB1ekY2eGFZQld5MTNJQ2FpYDdWVWZVOXkrYHk5R3Yrd1FmanIwcFNqWVR3bHVBCitaaSs+bUdmYz8kd3YqZDN1NDRedmQpYXk8VHREVGxGQDVzXzVsR2QoaSY+P1l+ZTwwfFhRUjAwME84Xk9ZN3lQK3dhdHtVaVZZZ09+c1M4Cit+XnxTYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSWNXN20wWSVYd2w/TEdaPitjdUtGPiN0enolXzl7eyV0diMqZVNZaWlJZj5LeUhuSUl8CityYD11MFdoZT08OEF+SnxObSleTF9rWHxuMDY+NVFDRTBFRl9URFhEOCVxPjAwMHg3PmR8fE5UNElkQV5hVytaUD5wZ0UjT14zaDdIQCUoCitTamB1M2RTNEREdFErZEl3elc0bTt2dX1wKiZrT0l6QiNsP3pkSGdCS0xuIXQoOEg9PE82UiptPT5QQzJ7dExpMzh6NEw1WkUjcEZYWj9aCispP2lLXyhPITNSLXpGfD9PZk1LVzRjOEdPNGdncVZ4OExSalpRY3lFdGg5VWgrX2hTbGZGaV8/a3M+ZzQkMT9DOW5EaTw3ZitkPG9AeCg7Cit9T0RROFptdGkkWCtebSgyNjVyfnJOZkxsTXl8c1lEVWElM2U/WUZwNWpAP0Y7bnslWnk5KTRmLWFrV0c/amdxXnVUSUdBbCM7bXp4c3ZJCitHTCRkPUF0YSlZWjJpdShLTU9xbm0yS0lHZlBKNUVCc0woS2IyWGtLRl9sMllyd1lwbigyPEBTKCR2ITxMWEFlQ15ZMnFoV2V0dXQjcUFBCisleVk4flVsUlZ4LTQwY2txdiVjKUJ9X3BTNFpQUGRLPE1WLT1kczlmVDRkUkFIaXlRJngoJTQ2WD52WEF7K2lAKDBPcjcobVZoX0YtMmpeCitYVHQoRj8kQ3Q/cmtTJD5WRUBRO0NmXnc5V1JYbSVDM0FSWnlVYmk8RlJnQzNUKj8wMiR6PFlPaWFxIy0hO3ZqbCteIUQpaDtONzlEZmpDCitnNTFNSmRDNCR9LW9HKGRgaTVtcGhSWntXUTt8TTUpM0t4XzJ6cnZrfFZLRX5yNEczYV5pWE48cDBxUClsZVY2X0B9KlBARShXclUqe3opCitaeEdOUE5iWSVLOyZNa2AjVH1FczB2eXYqV0NvJEZ0OyVuRWMyOzQ3flNneHliUUh7cUM/UnZaQntSVDdWVT91WlNYcWhUcWI9QWQxcD40Cit6JTZ4Xns2TE09cn5JU2M2WX1jTHgldkV4NGFSbG1rS2N2NlFLMWVRZWEkRk1GNnVtQGNldzB1a14keD1gezJFZG89dWBjYzs8bSsyTmFgCitLTGI9aCY7NmQ1TDJhbE49Q2luKCFVI2ZgSTJpMFFzY3IpUVEreVlAPndhMX0+VSNVfCVYcFVmdHtNcm9SdG5jfFdCOUgyPEtiQyF7ezlXCitXKHF0SVlsK2VmTUUtbkohNytSVzV2ZFpyeDBAQUdWWTU7cUx0aHxWPz1rWHI9MjRuKHRzOX4hV3w1NXA8XnUwJGszS0w8TWQoVz9Xcis8CitPTWdzN0c4P0hWPEUoMGwmTDc9fjQjY1gwT1YybChDUURLcipedGVfdGowPXxxejsxN002d2E3USNnel5uUWRVPj1LQUxsMWZme31ubGsjCitvWGRZWn1LbnZGNCRnTihQQ2diYkdxVWZNJW1fT3d+azh5JElHK2F3bnBBbG1ycThKfl80bHBmMGhfeihCeTJGMlc/eihmODk7XiFvN1NgCit8b2BOcmlMNUZjYG5qUDs3XzFDVFk+eE89O0RYeV5lXnVZLW84Q353STFldFRiUihyX3MyKUNQRl4yST1TUDElXiFySFVGVj14eDdAIUxRCis4JiZIMGUpdVUlKHRyeH5qWEFMSkR6UUI/LX1aV243ZTs0P1BAeGRTdVltXiFoNDFebDtFJCgmTmF4Pk97eWU8ZT9lfldHXilDSkghKDxvCitWSm5yYGJkTm5kJF81YUFsXjNgYEFtYj5zZV96PzFreyRtTVlsO0JWRE9JK1g9RWAlak1ndio9Uj98UlRVdmQ4ZX5ge1I/ZCEmZTlBaHUrCitgdUpKNygobGstQyRUPFNEQEp3R30qe2BFUylQMFF5JDlLSmpfez1VYGRzUEkzT2s5V1Noe1B7IWlBLSNHRzZRenAyaE9PdTV0KmdlKjBvCis0aDx6V24qP3RLRn52e141TUwtflVrVjJJMXJXPytnZzFmNFRWSzxRU0B0e0dHM09IVGpKbmYza2pFYG95fWtHQXU8LXRuLU92b0srVClPCitvMDFDSlJlUEJGV2Q3blZAYkxUPSsoPzEyTTc/YihIcWE9dmg/MThJMG9CY2tjfmN4YW4oMjBIZ0xTOGlsVSR0diNHSVlATXtRcjgla1FSCistJDNpbyt+NTlUe3xAcW1lNjhXZGxMPih1YyheSSFXO1hDWll5ZXBpeE5FdCNmbEYyNjNTaWNDK0QoUnc5TDJaNWZMbks8NU9aTW5qWG9JCitkKXxIVTR3bUsyIVNzdihXeCkkKGs/ez90YmN9WiRPdW8oZU49UG14T2A/PVNXSSZnaktwRCVCKD5UWFl5YlB+PDgkenJEWkszJlhhajZkCit3b0s4Z1h4RnJZRDJVYD9CYUM+T0l6NHp4eXJDWiQkNlleQk0rX3tYfWR2bj1sRD5ZRHorN1J5eVNkc3ZzYVI1aD5HYmxHZUdfeTZeWEZYCis5QmAoPDc0QU5EMmNeb3lNYj9LPlk9QVUoWUpkSDQ2ck1UPCRJZDtlPj5ZJHFHcyg8RGowaGRYbns2VHRMRG9MSTkhd1pLZzN2X14ySUwhCiszY3tvMlE3eU1nbEdMR0s0d0J+R1R3TElHWTFrPm58VkNHTU9fOVByMyNsJXVleFNFeTItTHpENXAzYCV+TzhEMSFIclJ1ZlA3OXs9VDlECitmWkVYX25OM0o2Tm13Y0hOUDRFS3M2PmQ7M3ItSkR5JSoyX3ZtYV5AXm51bytsSj1raiE4MUsoUkpvI0NvSGdLXjx4VHdqS2ZkKkFgbXxVCitZc1ZWfUlNPUo8c0NiPkBjLSstRDNwODxGPlVHWD1BY0dXMkdJUmExIzI9K2lkYW1zXjgkSEg1YkFoJn1+OHtFTmZsZkded2JPSXIyej1tCis7PjtaTmctbmB8K2dNQkV1RCE1ezIwZ3ZVRWw4ZXI/UmUjJSQ7eypvbHRFQmkrZkIxbDNAVmVFZU13XzwhbEtnUXsqYDVQIVl3NmdZYmhYCitTYyt5cXBBPCUlbGVGQl8lTnBvN3hENTFtSTU9XlpDa2V8NldoNnwxXkImQz1sc0pCJlN5MipSWHstR0JJMkIyPExHJXo2bigyKjBQem1SCit8O3dZMEI5YXc3YTQzZSRyI3EwLSl8SyZoZT9XcXBVdz9UcyVPVkw2R1M8Y0FYfntTOF48JEc0SWVoXm5Ea2pVXyE+KnghZD5jTClzbE9KCitCS3hxYllYO1NEPHglU0Itaj12Xzt+TzdJRWNIQGp2Y1lYRFdRT0kmSnc3O0poTEYyPHU0cmFoK2pHbnJLRnNFdXJqRWNyTkA8O1gpSHpgCis5ek8jMTY8RSE1NmQ1O1IoN1N7RG5CRSNMa19TenlPI2lKN2MySilBViopKnJmSVhsI1lVekt0QERleEU1bzhucXI0c2A2UlExNUxXLURPCitAVDBWbXMzVTxTdUU7PS07JFJzS3NFZSspVHs1ITtsOU8/TGlMWikkUntqQkNvTD9GfDw+PSNOUlpDX1BqcmZJcF83QlJZWWh7JVBYUUNMCitFTFI1Nzc9YG0waU9KLTVaOSZJJChmeCh0MGp4OTVTQm1CSmo+QXo8Nnp4ZlJ9WlY5WiN8LVp8ST5KIWkmN1AxVXprR2VLb0NfcX1SNVV2Cit+PXU4PHEqdnxMLWlsKHNrbH1IUDNaIyNlNHZyekd6Kz5QIXFFVjZHd150KjlSd3NrMU5TTUw8YiV1R1NueEk0SDFEKlNaZmt0MVZwM3VlCitRY3lhM1B7cjQrX0VEemckeWFoUmVZMHI+MypxRmVCSmpEKiM7NmJ5ZkchMUorfXYpSjJ2e2RnJSprI3l0Z3BLRiUwVFNHVjFzUkxrM30tCis3TzQyOXRYcCk5V1pIQWwhb0ZmOSpUckVVPC1qRlArUCtOaTJnX2l9fGZVcW9rOGM9TDEkUX0qNDJEKEBicy0tMCVFJGwoOURFbyFxJDkzCit7JFk5b3xJVlFvNT5pdnh7U19Ba01nc20lKFBjVG1fYWJMb0B0SihNUENsUFJgejNQaHdLZm1lJGh4X2c8VlJnbTxGNVF0V21jVUxXJCVCCit1TVhEWjR2fWlLSVZlYEx9bXZ4MiE9bStPN2gjTkw4JWJfMDtncU87byNIbjNCfE5nQis4I2NOQ2hrRlZoZ25INFIkT1h4Y19vX2N+WmthCitUYl83ZzMrYE04eX5HekR2dDtXTDctampGQj4layR1LWBlI0VMWjhFQGsofWMoeEV5KkghV2xrcGwyUEZeKDVkPFdZJkBgeGU1R0tUa14zCitjdTR3NVRpbUg+QSNoTTg+dGJLYjc1JmR4bD1xcjt8RUNgZzU4cFBJPkhYJU09REwjc3Z9UnY9NjtXYnFgV0ZMcC1YKT8qb3w3Zn04eUcyCiskPnNNdT5faGVkQD9QKExVPkw0VC0pRUd0Xmx7YUQocmBNOC11KG1OTVIzVTFrdWhieEBqNDVPX0d6TE0mZ0wjTlhkd1dWYFRpaT8oUGIqCitRVl9SKig8RU9aWlFVMiVhK19fJH13eEk1a3tqNilRNlhmanlBb19EPUtQZEE3XjIjYlduMVdoUzkzfGlQKUFNfHRORCs0akB1LXRHcyVhCismKytYfEh1ekFtVH59Q1p5NE0zem9WOExgJUpIUzxOTk5DN2Y7YVlyc2lLPTVQO1hUQilwKkxIfjAyPn1yYzE+Kn5JMT04KXY8QT87RVB0CitFfTJjV3RDbVdZX0V+NyRBdSg/NU4oSVMkcDI2QGwjdG85U3Q5alltO28/PEBTZFZWM1pLNCVJXztyQ2Y5NW4pc0p7aGZQeXQxJTkyYXs0CithQFR1KWd9dyNzQUpsajZQSVVgS3Z5Slh7OFdudlBaWDNSbFU5UH5HWlpTNHxYWUMobzwxXk8jcGY+dEJPeVJYYiZ9b2hgP1M7Z1JeYjF8CitBQntYMFcrTUEjPTxYeDk+OSE1diVgSUtBb0xCLSg/IW0lLVRuST89VjBmT3dzditKdz9SeSRZYjIxazNFd3trQzsrV2BaPTdHKUpVaWc2CitATnhGfXwySlFkT0MrWlE2bU8pQjZMe2prNzVqVTMyeS12PkFwPy1CVE1JWmwkY3VCSDFrWHp9WU0yMzxyMilHdzQ5aGAqSFRnTilVezRqCitFSE9UWjwwYjIjbGgld0dkY2B2UWxKQVdSa0xwSGtFUntrcEU9TTBSRmV2VjIpQyliZipQc009WnBRdFRGOGxILXpnM15aPWMxc0dzYCV6Cis4ZldfIzBoVEEwfXRxYyMxMiU3KEJYPj5uSTFBKDJUaW0hUSQlcnhzfmQ2PGUkKndwM0QraWwrcW80KD1XfDQrKXRpUUZnUj99azVSU0FNCitAeEplMVQ5TkB3TGxsMSsrYmFfKDN2Y0B9e3ozQHx3QzMlZDg9b0B5Vm9FR2Y2NWotUSkxeU1AUWw5dCNONXFXezIhZmd2SFNkLUhSSE1+CitESkE4Rj1fU3p0Tz5ZaGN9bng9QyNpLXZLO05tRVRwUSNFMjZSVyNuTUxGNlZtaz9BNygwJkJKRFckaHhQRjBwTTFxJCZmKSFvTUQhIWdsCitgVj9aTCgyWW97PWBFczVhNjtaNDlyTXZMcGZ8RWI2LShsbn0hXm9eOTI1VEI0Mj1XUyleaSRyIUhmNDdIajM+I3l6O19GaVNidTQjTGJCCitsMFRAMztjbj4ofio2OyNNeGskdXQzMEVFXzswLT1idGV1S3AzNXQ/YFN8U1E4Wkc9MUdjUEFyJGJ+Jl4pRWopS0k3SzRgSTE/RSY4U1F0CitgbG1MKFhCdXEoRzJKezsyXnhmMm0tKHskZXNzMmRiT2JmYXdINXAhakp1YS0qb2slJnJtfCN1TTBLJnRZdzZOYUtUUXxQdUFHIyNXYVE7CitBa3QxSzR2eEJWN0x2fVdnT143Z3plfFN7aEVKX157bmxOb2lwOGNMSFFadjM0bUdgRnUwQmE4bmF2YmI4I3EoUW1NfWdJLVQ9bX1VTmwkCis8d180WU0/P3cmRihyVEtxalNCRj50V2xkSUM1YFp8SyFrOX42S3dTU2ZvZUMmJEE7UHNVITVCRlJfZUslPit3I2ZmN3xpaUJuNUhyWUI3CitiNF5kPj44VzJ3RlV6JDFwemxVPVZ5M2UqNkNoNX5fNG9kb2l+QXVZVmJrTDRLVG9UX1piaGhnam4pUkxlKDcjanZLQytXZz14PTcwfEJiCit6WVlmTG9oeDBWYH58Yno0PTdFVVIkS0QjfTY0aylaWjZwNTFvVVErMjI0bzkwXlhMZXkyPGxWdm9veSkkdnMpM29vbFAycDNSZCFgYlJhCitefVJ7d2J0eTBpbDdGRmNAUGl0SEkxKnw5Sl59Q05rIWhLcmt4bCUmVEB7THpsQEwhI2I/blpofn40az85K1ZLJHdEMXZuWVQxZEE4b057CitlSFdNOGNUc0opKz1RfElqPGFRSl4pKi1Dent7IXxHSGIqc1pnKW0/Qn4mcXBkSXl3Q2g4YX4kdlRhNW9KIUVPWCV3clh0ZGk9R0dmKnNKCisrWG1oVHorPyRDemtPWj1IMjRxO3FjY1NoSndoZzxZWCMzYE9oPzJfTjFTRiEwJUI5KVR4dlVmRElJVHtSRjZKMXlGM2BfZ2NGQH0tSDVjCitpYFZUaExGbzFgV00qS0JxVDlVQjtTdHAyWEhzM3piQ0pBSWs3LU1RKSswZkZEUE8qTGdIPG5hbkFVKU95X2tZWmVBI1I/UT81VXhONDk/Cis7XlA7XjdnJFg5MyZEPCN5MjNpaVMyWFRVMV51SzM4NzNOR2dpKG5oQmclKnNzVCRkfGFqempkJFJMSEZnMkxQIVRyfF96TVdgel80Pzd6CiteQTJiWGx+bW9UQzd6XzZ9TjVJYk13Yy1SMn4+YnUlaClgZ3gqMH0wIWgqdG97e2pUSzxTYFhoOWJvN3FKKVh0STRwVVFXe2N+YWRpXnBBCitfbDs2b2YzbFV6JmlPKUlyKXN3aWxye3R5Sn59P1hJQyVUXkBDPzc0fDhRYDJOVXg8fnpLIV9xRXY9P0Y9ZUQrJG4meiYjU3k5OE08K0hvCitBQWxZOEhKQDMmWmReOTBSJSNNMmxFVkJNLXpVfHdOWXlXJFpAe3lRNW5wfE00R0p3JU0wYzJNPjB+I0QybUJVazM2ODI7VERPJVRzdWRFCis0ZWBme31zNz1fYnlLMSZAUmUtVTN9VGY8dU5ZPGJwZWwmQDNNb3hZbFNfajdLM1lOSkRBRGcoNTgqfXR6RUZGU0VCRWdtMWF3Wjt8ZkUtCisyeWgwdGspWVBlfnZLXnVwYz4+TD5rQXBqcCFOaFBabGVQfkFsUiRlWUt2dXB+PTdsMj0xJTg3fDVvWHhvcWFVNiFiM1omODMqKWpeJU9kCit3emxLazR+UUg4VCV5O3JhSEVUMz47bWlqaXg8UG04JmZVR1M8fCM2KEVYV2pFXjdSRjN9cyU4U2x3cXM+KGhmazJmfDkxRUZeV3ZMKFh0CitLN05FaHU+M3hMZ3ZDPTJNVUB8KmMpJF4hJFlXen40QTMjfmNweWNwV2RnMGlGSm4zfSQ3RWJCWWpZa3MtSHtSfCR2Q2MqZVN0ZnRuRkphCitkZktpdn5eZC10Qnh8anh+a0YxZlBNaVZ6NjY5bXklZzdHOyg5XipwZmFYTWI5VnpRUEl6STFfWWpYflRTVklWQjs5fD4kRlkkaWM7S3NVCisrWSEkeG0+RTBvM0NmTWVoZ0NAP3wraklpaWtmTDE+c2ZzQT99NEgtfFFma04mLUZpdTExbHFVYGNkZ3hOOzE3YyYqcFdPKWJiMWlecV9HCit8KmZaMyRPUkNETzJHM3xjNkh5RjxAOTw3PHlYcTR6I0lrMzQ9ZjspUFNfYSFub3xLVn1qY3U3USh7M342SkdoYmsqYSF5aUFRaTJVKVJaCitCP3A4PjAlV1gzelFeQD10S0Z2PTlOVVRAR356M3drcSZUZ1FLZGhIT2leaXVyRzdxYm5uKyR7cl4mUzNHTTlQNmZAOFlNS058SFlqND5JCitza05nP3xISDw1K0YpSWB5aFNMfE0qRERBRVJxPSQ7VFIlRU1KeWRecnlUfjxqQX4pNVp4OzxnKEMrR0R8RDJlbnpeZU15ekRxRDh7PXpICitDZmRHMFJ3NXR1UVVpRXY7bWh+X2pRa3pmU1R7ZU9gP0NgY0JQfV9zSUB2eWgqTzU1PDItTTg5QldnSEVvcF8pYDs1T1Fhbmw9MS1iM0dTCitkb2RZJGkmcmN7QXh4NyslcXtlYSFZQElqRmRpa2NTaTx8N0Ftbk98e1BkJD5nOGBTZiNwSW84SWtYMCRhZVJBKEp5MnstRVNtYkl9Wld6Cis9RS03Szl6KntJRWYjVnA7RChwZClCZzRkIUZXUzEzQnI5XnNkUjFfMVFDZj8mQ3pWKyU+dVQwfE01KD4jd0skWmNqe3sleDxqRURzc01QCishcVIwWm03KCNBKFNWSVkmSUxrPDZEYUltKj85fTdeNSolI08pYW1pJW1lXmojIz1LdHQhJDA4USR3YGZkeyklYVNpZylvZDk5JlpGVlBTCit0RkxUZThFYF9XJFg7R2lNSTxGPXJuTFdLeGBxWiR1bW9lQnVtPmZjczBiMml1UzwtJDVxeT9lYW15PTdDMmFganctZnhfdW11N2hNQ0RiCittJms4aGB4YT58bGgkbV9GJEFneTlFTUJCem17RjNvPGU0VXpIcSMybl48O0xBeDNhdDtrZHBqezFPald2cz5HNSpuSnRSM2tvJT9faT0hCitCS1ROYm1kY2xiQzFHNyoodU5DPDxLMyFETiFsMkB6NHlhR0NhK3pGfGNgK1NPZWZQUnV2ayRvVm04Vk19Yzd8OWs8LUlEeXxFWlpGeSgqCitaPz9SV3lUdiYxWis/T2d0a05XMERoRUhHdWNqdVcrJmVRJXMta3o7KDdzMCohYlJzeGUqXmctOSFxO1EwRl9MczZXeU0maEBQUmMmQlRfCit1bnV3SzlPNExyKUE1MVZtX1VBRm5vfHg/YHRsclRYOGRGdmY/ZjtwSUA9OXdKTCZvPkxZVUw8MVdsYXk4RmA9Y3RjU0leUTVIVUg2cTcqCitvZUlMb1hDWU0mcXRqVDZlU0VnMmp+cT9JO3tDb1h0ej8rfXdoVXVGKT1zUFh1YFVgfUo8PT5TK1VTe3gyNmZPeko1KiFmKn0pYF4oYVlLCit9UzJWKSktUmhieTNGTWJlNyhRfitecHRoWW5PMSkmMjAqVXxCZWgxTF9WJDY2NDchWk5ffUZtfjNqN3s5NXByQ1VrOG1zQkt1cXxvVTEzCitRWCRzS0NuMyFMNHFySGwzY0J6bHk7JSo3RGNaYE9ATFhYX2VNLUgzYFBueG51QkpTYnhyVjBjQTUwVz59RD96YE9CbkBUODR2SU98YlA4Cit9MzxgWDFMYWNAVk5ob1UtQEZAYDs3KFJ6dGx0cHpZaENLQENqSlotWk5NRWgoJSloTytvc1hzQWlBbGFaMGhVUXQrZypCO0UycT9DeGxSCittM18jRnEjaDNDXnBXeUhvMCFCcHY2UnhoZHwmJkJhN3JQRHIkITxLKD18YTEwJX1iTFByOE91ekhPaSFqMF53O1pvaiZBJCshRy1SZ2xBCisxJlk4ZztOcz9oSEs0RWRDQyliWTdAdXU5YC04WjtkVkNPYk5oeF52MkJBVW1Nek44VUZsY3tGYjEjZFVFSFluaGlZI3pTJElTO2xtLX1qCitVcHQ9Kk9Cc0NrbXI9STIjMGcmcX0kKUlMRVE9NUI8aXdYdEpZeEdrcmE+NU1zYjt5MD9ZPUZ9Xm5VJExsVWhhNksxIWNgY2AjSXRrbCsyCitxckZVZzJQM2x1YiR3cCtnVyRVUnJ1cXl6dEB0MjwpaS17VH1HS1kkI3s2fUZGaD5fYXZXST5AR1lHRGE4RXNiaDtEdWpqYDJwaG82MHhKCitwZ1U/UFMpS2VgT31FSUAySyM7ND91fW1wTzNXKEtwaHRMKDgxQkpAe3QtdXBefjVmYUFaeEkkWCNoZmVJZGhQJX5hcz0lVD9TSCR2d2tECis3VjtzRDJkRih0a1NBdU5TMUNhY1pyR1kxMyk8dTczPmNFNXpYMno2JiM7I2RmZjQoMlUjZEBpRipuYEoxeGlxaCZHQ1JnXmgpbjxrQiRWCitsdFI9bENEV143ISRGcjJoSEpwZUUqVClWUG1WUzZXZjduNzB1ZiRePmJ6bkhFWkRHUFp6aXRlQHJySGs9K1ZxREpCd1dRIzdaVjZYTDFXCitAeDxlZlojSFYzQzxeKW9kVjR6YHc/dmtLdjBRO1cqRVBVRT1HS1l1djl5VSFtSXhFaDxgQ3VCY0g2fSlwIWJUSjJAVXwqM3A9dCpLO2o/CitpXnZOKHN4eUd7UD5LMSRLV09zKG5tMSg9VTlGJTNJJl5SZER8ZnRpLXNPclUtQWRYYTN9aHctXig/QCorfTFzQEBfWktOV357S2RvRFA4Cit3MlV5N2JXezU8T0NscTJZUDVkNyRRaUA5TVRNWj84Zzl2ZGI8em4oSFpmKm44NkZie0ZQX20/b2dzLWk3NjIzWkolNjZ5KmJgeENeSlZSCit5ZkchRjY9QGRXRTZeb3VyK3xtPHoxKX0kOTMxYnBGR28pOU56MTZWTXgxYk1NX29zZSkoa1BJX0U5JE88PGErTE1SNCFQZiQ5WGAyaUJoCit7ZyhOYlBRRGg1alpWTWpWPVEqdVRQVlhDZGpIdF9UcW9hSyFAJCZvTT1UfEBgej1jSG9icEUlKk4rRERQYHpCIV9PRDgxfDl5VVA+eztZCis7S2t7ZjIqTHJmPDNTRSteRGkrem82bWhlZl5aeEIwLUtZWWx5ZERnND9lIXEyJVhXdT1Bc1Q/IXFoRmZCM3xBKyZaaE98Jkw2ODt6SklLCitFVnk5RTwmWEtWUDhheTNaU0xjIUE1IX49OSRVeHkpVzc9PVQ9dUUoJT4hPEM2SzgjNTd0N0N6cjxBSlBVKCpvNUY7eGVYIU0mMTx8diprCitfUjJSb15XNVp6NiVNMkBXM19gaCRCcyR0OFIyMypFZm1vNDdWdysjYipQezFSTUtDKVZNNnBhIT0rdE9weyQ2Jms4Nm5tVmo7b3Fwc0QqCis5IThFd3N0JV5tK1d5b3ZiI0ktezFQU1Q7NG5wNVJsNEdDO2BBRDBIJXM9blFiQmhRI2NYfVJoTzN+QyZna3Nocjd6PH1uI1Y0emt7JX41CittcURaRDRKZEd2Mnk9R1BxeXtwUSgmXnQ8NTNHaX5uLVdfX3MwfUQqbXQqSHQlOHUmcktNRUJwbHw3KnhYYXRjdz50RWc1JStvbmtvc2d4Citwcj9JdkRjamxydUExTVppKzkpY0FXRSFibGRHMXRIZyQkZjxuMVg0MD5EaEhzZmI1WHtfYFpwLW17KX1tJTckYmR6PlIya1NmTlJSbEZsCitAPCVVc1gwUTlSPiY3NCVFb3EzST9BPU5WVTRaJk0xP0tvMmopd2BOe15tbjlSOURUTkleXmAze0hfc0Z5JDB+dlBrTnxMOXg3RWQ9Jkc/Cis7PllxZUlYaWtRZHBmRiUwUGt6clVGI2pRYXNEX3I3VGFoTil7Qj0kP3N5KGdmKD1DNk8+ZlkmNnojP0VrcSRYTFYjbHgzJUgkJmxpV3NuCisxQSkkNEFIK3doQlRlSiFwTURhJnF6aDVlc2djNT1UXnpQdGZiPFcqNVdvYU50KXJicDNQT3x1RVEpMGFmZ01aaDh8VWZhN1YpT1ImJFlTCitlSzBKKD9TdnQmXzU5Z1ZaVmgmZz1tQXd3S0VUNmNXKEJ1eDROdVdZMlBtQyp2YV92a21VQVpULWY5bX5VZyU7d2VZdVZHPVNSJl4lZ20xCiswJE9jJnBgZHF+ME49Q1ZMdEJQeVliSFdIMzMtT3ZGOXU9ayM9SnclWkdeaEtFd3lteCVKUFAjKGpJRzVGMENrPVJ5NmdzaGh0Q2d3QV4jCit6ejcqbHYkWiVRQ0hjVU08fSN9d0N0VSReSyZqYT51a2NsQlZgJjhNdXA5X3VoVFN4eWFaO0JCSF5kfU14Z2I/UyNubldwUVczSChxQFk7CitHZFdSNjl1LUAhZF95WHRwKzY/UTVCdWc2IzZAU1dDaSpYfVB2TWJie3YkN0FZQ2JWYUoyRD1GVjltYHtRV2U+ZjlYaiNtNWlxOD1vMmxOCitme1drMklQJWFVSUdmZksyeEA/ZCEkbkJzRHJ1UXVzLVRCZmUrfGZ4T24teD9sM2hYJmtPUFZ3WCh1SF9HT2l+ZEZ5QEolMUIzbnRtSHFpCitQfSQldV5BWiE5djNDSXpzOT4lMylCKDt8R3p4TGMpK2VHWT5VNnVgMGUpdyU+Tih1ZERRSkVrN3E+aU5sJUhHR3tLZnN6WHFVSDB3OWorCitmNG0wUllKbWFIa0dMd1VFK3lrTzNJeG0jcW5SZmByRD5kTyNZakpNMzlvaDklVTZBTzNyaH0paC1jYT97I1V4RVp2MmBNJD5uME5VR2hmCit9SChxLVdOOFVrYWxvQ280blM5SzlKUnN6IUlkR3RFTytnQHJ4JXl9UW5CQ1hmZlpASFFAS3g0ZEgoMjl9cVZAbz5HNkRuXy1hbkVMaGF2Cis1RkxPKjhFfDs2al9nVnZufjFyenprZXZvQ3VnWEo1fUktJWF0YXB0QWg/K31GUillZjw7OGVlSE1gQyRDVFIoT0lKWmd6YUpmdWE4M0E9CitsSTZmTT5pZ0xZLTVgdjh7TjlyTHlsQGROQnVDUTQ4NkwjOCt1cEpWPEl6aFEmPE1WeHUwVz83TkFOSFlKYGxwZklScD4kKip5azxselROCitJXiZ3UksweHh6NTBDc3QyUyt2XjhyZzdRPGJqN3A5dSk0a1JpeUY1NH5YMzdhTDh8WkZ2TkslZ3YzfEFZTEdSPGN7VnxCWVFiN1Bab0BNCis5PGM2ZFk/K0ZOTCpodHV2M19MUndVT2JJU0tLZityRSNwOzRZZ1JRVDU5P2BRUnUmMUZEMWclXmFSUEBpcTlyY3MjTiZJVUhRJFByb2lqCitsdSlmaDRkbENCLVBzU1FlVjM9IXVZOEl7Pj1ROERYYSF2TDJ5MSlpY1lJe3BHMnFzKzUoTFUqT2ZeZDtDX0I2Uik7Tzclbm91NE9QYWFFCit0O2gxVnV3Z3w1KzEqRHZkP3lRRDdVVHE4US1PJFhkRC1PV2g+aipuQEpkZFdCYVowS0pHaHhIOURJNzlpVChXRGBveFFMNiZkP3UzbSh7CitpSkMzTWR1OE8+OX1XQjs1O2IqKj8/d0VnUjZgPSlAZHRKJH5IPCNGVzZOV1EwI003bVowc2dCc0NnfiQoVXx2bD5eYFQmQFgybCNjO314Cis5fkhIN2tfalU+MzhnOShPTEhkSzBIYVBuYTIpNHckVnVMbzMwaElIUWRUNl89dGluKnBrSz9LSEtSZXVtVzJqKXs3TWIwTSZXPzcrSz5zCitSayN8SlMzPEZfOER7PUU/ZXJPXzltRlleN0FycDtEKFQrc21YcFg2UnY8dW0wTXohIUw2V0Z6YUxeKEdyQFJCRHxpYGh6RnpeOSNtNjEmCitvN2hJST80ZkJKclNib31Pb3ZOcCtQVHAtdGlsTEp1JitXOU4oYXFGdXx1KTtvQmVVKU8/a2NCeTJpT096KEMyaHA+akJESW1CXnpqMCNJCitmemM7eVd0WXhRI3QlPjVtI3Mtb0VONnJ8TmZKci15V2t4JXhYcU5abSE0bmNaZzshc3RLP0tIWU10ekRecjtsOUZ7MiReZk5Za0JQVklKCis9LSVjRzMpYTg8Qmd1ZlhJQl9mYER9fDB0RlRZeTshTikyQyREYi0wfTt6cXJUOFhOcnsmd29jYHhVdSF3X3pwWWhIMFE4K1JWb049aGQ9CitXKGw2YiEmXmokRkozKERaYCU4UE1iM3tmUHBefEs1PUVhNVF7YTUhVUkmaFgjPklJT1R6aDtSTWFvR0gqdlhgJTxQOGklSFgkPSp0OE5TCis9I0NgdEx1M3tycEI0M2pPQ0J1R0hQXnhZTkl+JUEkWiVZNUdfTW0mWXU8dmJSUTVEKFQ0cUgxcUs+MlAwNHdHO2dPU1pTSUQ0WmI9Yzg3CitsZEo2bDNXJEJuQXs9Q25SQUtmKDVqSndDc1VhKnQxXmc2fUc5XyQkOX5aYSpFbjwwPnZVZWZOUX1kbVJZWWF6bXwkT0tHQitJT1I7dCNlCis1YGhLVF9NUlJZcG1hYnh0SV9vcUJfUylAYkRvc1I5eGcwQFI5RW45OSRUM0dGdUpUZT1CSzdCRWBUTj9taHZQfU4qSFh3TmVnUCpMR3dtCisxVG1OOGltWlVEc0xYQiNxJDtiWD1SQmxmI3t4aWtpQmV4QWBLJkd6Snh7N00xMDM7LXwtRzY2QVo0RitwbTMtQ3lXa2xPbjhBY2tHdGF4CitkXyhTWTQhMXA7OXElPSRFRThkOW5pX31SYj4/YWVFZWxmWGFZdnIxWEY4Iz8oR3QlX2xBZTsxXnppd1llVl5fVnk/NkteSnsodUcmbnRTCishMnBCI0w2ZER9WEVeUyFUPDVeYVVWQ3BjcWJuez9tYyNsSGc4dCZpNHxCZUF6VHhXTXlZKW5JUjA8MCYmUFdkVjtiOz05c1g8ajhqK29NCitgNUR0NCR7dHQlPEU9Nz8oKzhDUHFrUkJlQFhXTVpgI2IhVW9HM3FZTTNScE0lNndYSWl5NEVAOS16MnRTIzRZYnttUW5eITF1LThMPHU4Cit2NUU9PXhibkd8QzhlIyZ6MWNlcFB6WWJyQjV+QiRiVTY2e1F+ISYhWTQ5Wns4Z0puSDhhVnszJTJFdVlSeG04ej9AX2xRZzYyWnd1czRmCitmM1k2MmV+Z25VbUFNUDJKIz5Dd287dHxSVjZXJjhxWHkpJFQ2aF55Pz4+JHB9K2BAaTw/TjVCU3RiblZgK3JGTmFpYCZOJV81ZlVKdmh0CitycV5jVDZkeH1SWTErJU45bn4jV3JGTVptQDU4QTJ4PGc/SkR3bmszTEs2b3NrST9NT3gxWkV0c2JuM2owSHE4RjNJbDA8MWxmJCM8YnA3Cis8b0t+JkEkT1Q3KWUpQ3llMFcjKXZATzJVdyVmITV1WmNkaGNkN0dkZ2R8Mi1HcXV8NURfIXIqJTQjdElXRSQ0c1ppYjBsTjw/UFZSNEFpCitDN148OUl1QnRYUTBIKSZPSkQoIz1LT0ZTbG8pNEpuQjwtIUtoQDA7SSRPRT5RMVcwIUEzMEA4UyMjPzZEY296VVJWPWloJURlZndmZHhaCitrVjszOytTcGVMLVR1JjdJdklCJHtrel9XJWk+eEpyIUA5Pl5BTEV6JChuYW9sV2dkNG5EP3A4eE9tVF4xZjw5Xl9ocEsxcn0wVHZRJChSCit7eFJhPkxOeWgoeTd5d3hHYSZ6X2ROMiQkIzVwSiNkaHcreXlgU0JhOTlneWgoazA5KFFpQjZ5UjU4fkhGeWtzRkl5QlV6K01ZdiRSdHA1CitxP0B9SEhzbUdZJFBzRXBtPX1Ye1hLVy1qcTlZWCg0VVhRT015Rj9vel4lMnhwIzs5JkA3cD15V3VJOUJPZiV9KDZLLSVLNVRyPVFze3RNCitMdU9TKmc+Q1B0dUdaQSl1RFRpdj94YEEpJkVATzlARTVjdkFFNlI+ZU58NTZ7ZUswfktLQUhfa29CJWU9SSoxdUg3cilLO3tlMCNCNzkrCitSZGM4cjxwbFE+YXxOP2w7dD4tQW9weWdOTyhJQ31aXkZ1Rk1Teyt2JmcrQ21BK0R6b1A2OSFvSEc1VF43KD09PGQpUWdqOV5aN3E9bkRHCit0VEZiZE9ZJWVTWGh7YGFEQE4tTVFmPG01PVReJVB5bUxRdTJHSzJIaDlMJDs7c3lnVnZNV3pOVyN4cCZfQUFFYDF4SHl2ZDlmSTxJWWhqCitiR0kySHtRWkcqTXojXy1Sb09uPl5TRUMwWj5aPTFRWS1PMDA7b3tsQD49TT9gUW5PMDAwMEkwUlI5ZzAwMDFSWD5jIUpjNGNtNFoqbmhXCitYPilYSlg8eyM1VnFzJXphQnAmU0ZKRTcyWmZTSTFVb0xRWUM2Qj5RMTJHSWxAQS07UiZKWUI+QGRySTFAZHFmSWMpTnpJUV5nTHx7eWk/CitlJjVTJnc9TlJLaHVkfFYmXmVhPXZJe0o+ISE/ckZzS2BsJG9xb1ZPTEA/Zz5AdGJLc1JYaD8zRE82YnkjNnZBMDV8OGt3NG1YPWswKTV9Cis8PTZ5cS1MMjY9Z1UjKUE1bXpMczJtdTY8YkFTeFctV3pBQlkhbjNedkhSIy09Rnd8cHBnemhBO09tVyNwKj5mJTlyTzBOJUxUUT08ZnxHCitjfVF1dU58RCU8YGdFe1I4eW5ufkV1SishX3xUKD51KWlwaF9YZTgyJGlJTzlLUUgwMDAwODBQfmQ9TjNWKTZXekdRcjBMdWRhMDNgcWIwCitCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGSkVGfFZ7MzQ0YSYjfGtYPigmUGFDdj1HIUVXMHk0ODd8c2h5O2I1RWl0eTloNXxYUEs/VmRFCisoeEZMRCF5dzJxb29HYGVMISE2JT88ZCgmPiEjUnI1bCErdkp3Q30oU2lEPCt3M1JaNEo3fXExZTJOKTFXbTh6JHJnUTNXQio8NFl4YyVfCispN1dQTWtaeWc9MmZ0e2BDazhsV0lZLT1oKCU5PGo4YzhLdEd2cyFPPT53P1klIWM/JCYqek8tVV9mUHdXJDZaV0BKfm8rNT91R28tU1Z0CithZT5wKz1He1o+XmdHKU9KSE44ZS1YKjJ1ezFpLTJIRW9neENQUG0lOURXMUlgRUlmb15EJiFtdD88aDhSVz9yck5OV14pS2h0d3BLKHhiCit8cW16P2w3RGpGSWNeNz0jcjg1SUV0JmAtWDwkU3o8JTU+RmFDZnRRKExPKV5FRz5yc0s4SkkxbEJySnVFcnpjZ3wtNkNAdXs0RVFma09ZCis5PSFYTXIxYTdaZ0VKaEdqSmg7X1lwSHpvI3FOV0ROSClJOylFbFd7ZTA0RGpmMChPJlEqZXFXKklXTUVxeypHVVpnMG1qMzs0YVUhT25ZCitYUnBrPlNSNzxvVSE8PzM+QCQmNVdsTU52VihRRHx0Un4xR292IU5mJCpFeHVXaz17b2VJdW8qPkJWcFRGQlZWa3t+WDBkUyRKKjUwViQ/CitLTk88Yj07b3IkO3YoWSZvdWhAazAyPlklWE0kUlhBWm8pa2I+ZkBhVTBkcHt4O0tvbmo8YHdwT1FEQXYtc05nKkE7YSMhNlApaD5ANmFXCitBSzJtdGV5N0RxSXgoYUswMTAwMSYlMDAxV2QwMDN9bGE0JW5XV29+M3xheFl8UWI5OEtKVmxRN31WUGs3PloqcGBtYjcqeVJYPjJaVmRECitUMj9aeVUqeC19Tmd4NmJ1ZUdedSpSMzdJJDlnNHZ5REdqM2pIcmtMK0ZxZmZ8eGNZTkZ1YEdZYHgzLXYwTmlYRnEwIWxHWGB1aCg2ZFByCitAT2tVeTUzenFyez9pRGtJa3hEPWpIYTk+RHRaWHxHLX5QUEVTdEZpKXckVV5YK3dPa3syXmBfVD1mQWBFWUhgK2UzUkBtRjlpNVg+WVVJCitucGFnPHVDcTM7JGBtSE94N1BnV15eMkUzeW5tVXRwSWVpYVl4Q21HNDxGdld7ezY9Zlp7RUdmQTdSfGRXSFJ+Sz0wKUJmJSUmPz5JSzQ1CitPc3M+IzQyU0ExPFg3JWJpfEFnTipkMGB2K1pKcFA0KW1IVnZ3NihRT2RVRXA5UGReYzI5P3JEfHl3KzdZWjMmIWQ7YzBEfnM7Z0hQN3I4CitPOFB6QXIlV0BwPEJ1K0kjVF55aDJeLX5oOWVsWUY8WT5lZl9eZXJnVz5XMUY9bm80VlM7PDgrXzMqRzMqPiVMYyNkeEp8anMrTGltZHMqCisxdWdnOEd4Sz4jfH17c1JDKVU4aV9xUVkzc3dZNjlhJHBWRU5eWXpBaz9NKlIjZEBrOGpfO2RIM1B2X3ZZTXVzNV5VTktkPGIqSExxI3glCitldD1XWFhCJF5Xa25OMHJgN2tqWWg3ayoreD1+cz9UJGohMFJaY1ZzdkxtWSo4MmR8dyFRfXg0UkR8cWk+eFJYMzsyRjkhSlJgK1JMajNqCis9RWk7MSYlMHt2S0k0dylYWmA8ZEdOKDE8a0E2ZG0hUk5jYDZhOFFCXmNPLTNLZktARFJofHtFVT91cjJnN1dnU1VBZUtsPzhZdXdNaE9VCit6cWhBKndXdzg1QVorZE9GZERHZ3VIdy02dDw8Vy1gMndiRXFfdTE7a3VNcSVfOWAmWE1PWjB9fUd4e04qQ2Z9QS1aNUpUWEZyalFGbW5TCitFeUI1TjgkXmR+Uk5Qa0NMSEo2ck9PJlVqMXJGaFUzUmQza0lPWHh6SWpafHZJS1VmVUElbmhaYyZmZU0/PCt+bEQzKXk3bk5UYSVlRmlBCit9ZXU4ajJaQSUyJUwrNFokaWFQfCQ5VmYoR3psYUFxMXRnS1VWKiU/d0IjSm0yU2dKMHBiYChzWCt0aC13Qns+fj82RFIjaks1WTR4UXc3CitRbDN7ZWdPSE0mRE9zUGF3Km8mbnBJV2ArIX15SEZtWDVRZ1ROJnYxTzZPQ1JYNl8tdTx8d3NeTSZUb25PZDVRNnRQNiRQVXlyT096PFlsCitpLXZJVWRqQktyUDw3aTc4bWo5KjBEbDhiNH5JQnlVKXpsZHZePzF+Xj1mVzU+IXpLWCFqe3xpYHV5cCktI21TQ19WMW5+dmdjJjUkPWN4Cis1JDM9Yyk0RkNZXlk3aHBCJmhQPCVNWjZJWE5EUFI9KGBRYVFtZlolaCFuckIoSU57WjI/cz5sOXQ/ZjM/TFg5I0A3PTdiQCE2bmskSSZXCis8UEJXRnpEcTUpMUlIVklKJkx4aC05XmYhNmdSP1lSP2RAUz9OPjRffExvaSg2emJ0M0wlWmwoJWpJYGl2MF9VbTc1K3BhRnZEVyRgOC1ECit1Z1BIfThXVD5PbTFWIUg3T0QzVVFiRkI1VG9UR3wkWkgrT0JUTVcjZFcpKkY+ZGFEZz1zPmtiKWBNdCtLfHRBSC1LOGE8aUVeS2FYJkBjCitOUzdKbzVkMjs9UHp2YmkmJDdoR3kqfSRAN056QTB+SlVOLXNJfDBiNDhsTEEwV2cpI1ViTCFGX31sayE8YUdla1VnOHk8ZlhhTE4wKWJPCitWYmcqYjA8cX1PbDE9JXI5WG1CPlZhPXxCKihtVl4mfEhENHFRdShJcHQ7ZCNHU0Noelk7cXFNaEVxUllYQmZeQFRgVChAK1IpfnxmekUxCittVzdgR0B2WSt4NWdrZm5xaXtKb2ZrJTt2RDtgUkdpdVYxfU1Lc0IwbmZuSXdTdWp1KGFARTZTVHlvdX5KQCk9cGZudkNgZiV2czV0cFZyCitJaSV3IUZ6dlJ9ckpCSEo+KClsdSpATXJQYWAxKEpwWTlGc0pCV3xuIXwrI3ptV3cqaW1VSEIxUzBJQCo2ITRmbGojcEY1dVpgT1d0KUx6CitjUjZGcXhuLXJUb2t4dVZCWkpocm8tVmdSRXtVbFE+JUQyMFg+aTB4YlMtUSlKc19jOHRQdDB2PntWcEVuJlk3eEQoNihyLStlJW9wNFE3Cis9RD9KZ0IhNFZqOFdxZ2lEREVPUDw/JHdWZ3lVZHZwWkNwKX1kaiU1fklwb0pmaHd4bnp6P0lJRGw3ejhtJDttP2ZeKTxlRG41KUh5PCM8CisyTmMyb19FaWYycjhMKDM9QTA5YilLNTk0aWU2O3l3NXJHdkZaOVZ8d0lgODRkNj1jRnBxUUFnWlBWckAyT1BXWGZSUmsqXkVlcTg9IWpiCitUeW4jVlVZPzBTMFZLbX16UlczVE16YndJQnBzaXJYYXVWdXYmayt1Xyo7OVJYRldFaEhMREM9cHQ1Rn1EMUUjKGdeKFd1eEMobnBpbDRwCitiYTFOdEY0TVVweFVHKG0xUCV9UW5oM0xIKWk3eSUzK157b0o4eVdaSHBjZWFHSTkzdVF9UTdzPWc/VitHKGYoRnFIU19sMHRFZG1BeSlUCitRWHc+fjxTdjlSKnVgXmZgViltTldxeWRETURBemhrbV8+MD54aEtiZWhRVExKWlNGYFM+OyYjZilqaUtQMX1BTyV3cmROeC04R3EzOXM4CithMXt9QX4+QCFhT3hBe01VJEFUbitFM091cSpRTnJhN204WjchJnRWfUwhVUBlM2BCb1JlVkJWfStNeCk+KmopRnh5MjhGMzJQeHB7WDBsCitNaipKTDVJcE1AVnZZI0JBR0dVMGNGfS1rMSV9dU00b3heKGU3ekExMnZaVnBGNFlRRm5ffntkXzdFaGNtUSk1a2M/TXcpMDBXNXVOS0k4CitYdk4oWGpoXiEodzVVZU9NPGcqWStUWCZYTnd5Y1ZMVyV5eF5mXjZBKWFmSnghIUZvfHdwbjh2d2tFcH42LSt9SjMzYihrX2hQTU1wdUJzCis5UTFQby13XztEPzM1NmF1Skk0PSl3NFQ4WXlwdWh2R2JHdUhKR1JrMGU7KiNySExMYE5KPCY8TVJWbERCe3VAeUs2NzdLMDlkSlU2PjI8Cis0K2lIYWpOZ3I2aHNFZWgmb241VHt3ciRlQjEwaEo5VEA0NS1gaUtVR0lvMFZGKSRrN0w1ZGB2Wik/e1hyOVdzNSp9QnZhLWVCOD14QylNCiswKlhLYj1haGtNeiVUcU9uQVhGYUU+NWojJT95NEA+TldTJVVPNkoqOUUwVUsoUHY9NWxDPGtXN3Z2cWh4dDAydFFGWSlZKnw+Xm1NIVErCiszMk1pVGh2KWNJMXJAMmswJHNpR01zVilSNilaKW5BMmZZd0cyUS1ASEBSJUV4MkFLPkpqaGE5I1Z9K08yP0RSQzU7c1NTJW9jXj0wa3Q/Cis5OVNpOFRHWCtXIStaREQoPUo5e1VjOC1VPyZ2N0Z7RUFMM0l5XlJwVDdxQlhPQyVQNkBYMUVrPFl6Q0FCd2drNSpaQGxFVUxJN31IbCFICitaPFpGZzs5YkZvTiooJk08QDFKXygqYW1KTzBtUUpybWMwNGtmTT5kfEpzelJZdFZtRFE+SFZ7UnFzKVc0YD4mdTFNOG1iQFQpflhFKD9GCit2Nl45MiFrKGV0JHFtbXd7PVRPUWI/dWZKbl5FdmNyTnElaEQkRChqeEFTUGd4dC0remMzTk8rc1o3M2ljb3M1Qnp5QUhjQFhHMiQ3NU1iCitCIURqOER1ZyNweUxqZ3psWSsrYn1MRnBgOypYUE80PGh+VkRTfURwcn40QXZrYE9kOUhrNUFxT2xfdzBxQmk7NjBPb3QyMjBxQSZpZUdNCitVZVVCKDI8Rkp9UDlCZ044JVp1Wjl5diVEcTdWPWJRekZaYjFuYy0xI0V3PSR1Tm47PmpLLVc/T3pzZXJ1dkc+bTQwKjFFNDFvPHgybHt1CithcU0oTX1gS1Ztbm43Q3VIJm0oQX0xU3UyOW5LZ25DWEpOLTIkdjhndkhgdk07VkpkUm1WaHk0WXIkdzRmYVkpMFo8fT1vMHUyaTZCckUyCitIK1Q3ZTFDLThqTllUTVEhcDxHVVMoZS1UVXsyNUpEPGl+YWhHaiYwcWtgN3QxSFA+ZG1VPlBsWipyKG1RIz59QGxPPXREU2czZjJaZldACis1TjNmQEs5aHRgbGVDczBORUVoTD1qPkFyUlNJc3E7fDVpaGBfdWUoa2JyKnUwbmxZJiRmUmhpQHNeK34oclI8c2U3em0rd2NEYnBlO3tfCitYdXVtemFXRSRTdUBFQ0F8byk4bmcjMTBzfVg9NE1NZF8mNHp0Y1FjP25SIz9jJjFvWG1DJX5ffj0pVVR9YCZhO0xjIWlySilRSyZqOWRmCitNTF8oVEA/eTtBRnByNURsNTAjbFVXP150bEN0dENvfV93VzhoQyZ2TVpnMzZQRmN9LVBQNFk0YDFWKjxeTGk3Kk1kcEd4bnlic2ZQK2sxCitVY2l4dUYkJntEZ1EwT2VxNUZ7Vn5eTC04YlEqYnF6MjF9TnNQVHdTYE59Ullja3N0flN0VUtWQDdhbiF2YjI2eVRHdGIjMDs2ZGt7NCFoCit5bzR1MWQ2TERBXlpnKmRJSypRU0A9UV9gSyZiS0xtdlA/fVVBMkA0TDYrSFBPaURBO1RjeFkwWiZuV2FORURwTSN8QXxWeFM7ZzZpYk1rCiskTy0xQlhTRTJ5UmQ+djJGKkZaJjBJcWxKMkNIP1FwI00hQCtSUFlAbzxQUG1aNGwlSTRBX0VUeE0wO1pZayg2JlQlUjRqQ0p5NyE4PWZXCit3JGtfUHJ2PjRLWm5iIVZNcnp+X2BERzFPTFJsZExCbCtER0c8aFE+Wm5pfjwzQVZxaSs0Nyo9aUdFNTJIOFMjNmxqNkR1QnNjMj1YKFdfCitEOCFUcUY1PjEkXyh8Kng+NDBiVUM/UVRZanVVWjUkaGhmPlZsMVRkNntiNjRJd15vNzVgNDVIei1DJGw/fFlkY0Fwd3t0cEBnfHBtaFdHCitgT0diYFkjNShHVkpxemg8VzhtaW9NdGVYR0Y7P3gxQ25tUF5jTTtPdDg4dVdNJCs2OWUmYF5XK0Rga01AOUZxViF1eXNZJEt3RDRFYktgCishV25OTH1yVntMLS1AQ35GUCpjTWRoZCR5QDlYZTAtfE1UViFsdXVjMmchZmRIYG9rR3NwSDVrWmIjY2coSXVufnErYEsmP2grM2YtNHZlCitnPWs3PTY/dzZ3dHMlTTJEP3xBfjFjYzJge0l9am9zX1BEUShgYyZLPGYlOTBIYnUhaG00cTFEZEw9PFZkVGlSXjBzc01DRmI0VktuKEpGCitTMShtYXk7S1FsaWpDQEhjWjROeUQ7ZWBae2s8TlB7JDxAeFU3RlI0LSNxaEM1U09ydSRwe3I7fGZiVUN7Ql9hP0FJbEkwcXI9N1EzPG81Cit2fEdaaDJzPzBeVD0zX2ReJUh+emI+MmVjMUhkcGFMPHktJSkrNzxFI3NZS05lQVYyXkFEcTxIMktLMiZGYC14JkxQb25JaitEbE1sZ2E+CisjJHJ+Uy07NW1nV3ZnalR+Nm1tclpLQG1xOCFnSlZjcHNBd0RCPSk7M3NtO3ooIShFIURKT1dIUyo2WXBnUUBYPDElUG5wd1BMdnVJdTlZCitgVVhCI2ZzPHZXTlJGYStWSHc/KS03QENeQ1liTShPVlYhPngxWWRPfXc9ZkxFPzFBZi1WQUZiSUBxdktMc0J7bShQNUx1OFREbFl7cj8jCis8b1g4akZqUHcyKzYkJF4mUzE4ViZUREpaIzdDSV95aHcwamF8WiFlWm97cl5nSipuaWI0Z3pAbUsoLX1oQndgbHktcVdFPkNPOWp0THs5Cis4ZWRKSlFpYiZXeGhRO2FyOzstO259aE04eFNNYGtRZ3MtTntCQSh4Qjw7PFlfWHZxKHRoN1kyc1M9JlFMPShsN3dvPDRaUkFjVCt+cmIoCitMJmxnezBZfCUxJVFAT2diZChqUyYqdnVXc29gMjgkeHFsY3FkRyV2YWBoPyZFN1Z9TjUmNElwOXw3UzApPU1CZjM7fCVmKD4od1hnQW9BCitZdkRTMUxwNEJhYjJxP3VhJDhFayZmPVVSdkNhREEpY3NBJFNKQVNGRlpjaWF0OGwoaVN4bTNiPTw2XnNoY3JWeWNRYCRoWjxzOWhUIUFwCitGc0JhOzBgZCszUl9vOCh+VDgrVzJLUnY7QT1jKnc9czx3K2tlJno5fnVUVDBWfmQ7IXk2a0ZrWkBjbUh7OEEkYjN2WUB0UzZrZlNBfUpQCitGI3kxeEp6ZWtwZSE5c1FebElLR31aQl9takIrPWQhRkNkO1NFfXM2SCZ9dTdyO1J2alRjfTMmRW90cjs/bj49YzN3ZlpOSC1NMCg2PEcyCisrMUNOU2lZcGdRZU4xdVhWfWAhcCVoaVFGZ14zZmZuQitfVHFUJCkpPkg5KlEtdnwqVTxJNU1RKCtReitqSlotbzE0aUplbSRFfCFqRmpRCitlND00V0s3QzN3T3J1a0tPZ3E2clFre3REPHFpa1lELTFkSGE2KCZCXl59R1d0ZD9DfnZ+KEpWSkdpZl9QWWBecTxxU3ctNmMzbDY2MTRDCitIQnxNQWkrSWBvMFpzezs/MGhfeDBvdG9iUSpIYWg9QnMrJWhpJXo9K2ZTXjVLdnhpdXt3UWVXUyV+QWJ7SnwmWk1gLU5GSE50YSpGVDxlCitBXlJxSFdBWTwhRU8+SitUTTJ3fFVfcFFwR3ooYFVmI0ZWaWBUdzMkd1NxMlc0bzBYUmZzMFNfM1dTYHFpezJtTTl5WThPLTVeWFZta2Z7CiskbFlIIXhmJDhrTiM4JHdSMFFOJHk+RTVgYnlqSSlpQUVqPFBJQVhQQXg5O2hRXjJfVUJgWXdFYEpiQUtlNHw2X1Y9XnlNQnI5RklteFAxCitLPWBTTCRVP20yfWlGOXZ8JUMyK3tzU2hDbklWc2UtbUg2ZXJBNHReMjtSVWQ1TUQzekQ7ZXhteUYtWjlFalckQkBTZ1RxIyo/fT16ej4mCit2dTY8KShCPmVKZ0tyY29nXlNHRyZYMWdaMVlxTFdtYVdqWj9aaUtSbz5HRTRTKXB9OGVTTCZpMjExeDJOT0o2SzVlSlFJPyN3TmtFVFpKCitWUXdHZSZfflplMmhCIWBOSTNTPz92ZFVESjBOKH5vYlV1KFEzWnVVRFBjVWQ4M25QPWIxKUhiUExqWCpyKH08NDw7M3lNaU0jYChlenZFCis5dVJKP2Y7KnhmXjVHaX1gdypxcyloa21TQnxsdEdkRjNeb3dpZDlIVmhRZmg/X3I0TV56e30tZDxNKns8K3BEKnR5Wl40ezJUZHghRVpACitDSFRKbWtFZTU1NUx1Vis2KHVRYWBJX3loMmB4cm5xfm9ZQCpVeFBAYGYybU12SHF6QWU7RmRvTTVOMFA1Kyg8fGJ9PCNeTmdRPyQpfVZsCitOKVJJVHo9K3R4U29vTXR9PEdIZG9vfmM/anlpNTw+WWJBaEEwbUhgKHlzamdENF9jZ1IqeVJVUHU5fShSKTxpPitrTSolR2V3VEBeNEY+CitMU0tlYTh+dlBJT2dJTWV4YipwXntKaXUkbG1EWCNaLXwmKml1c0RrNExEYCl6I3dFbnh4MmklMV8jcEtTX280b1I3dD85Rl5JKUZuQz0pCitxTUYqKk1xWTFlYUIhRXNNPzBWdyFZKUp5JDlpOXAzNFlnfWpZQERwMlgmNiZyPUolfVVESkY3PCRMM1ZtKCkpTnwlQDZ+K2V0e0woNHlLCituRkYyc2AmZCNxSG9mTH5VaS1eMFpeelQtSFZmbzZwKTRnKiZLSnw0Sl4jO055MnBOYDY3YXBvfF80Qns+fmA+d2NhbEE7S3UjKGN6NWpjCitgbigjRURRZShZdkM7d0ZIelZgdmtqJnlNb1FpZ3g2fkBVVm5aNG1TIzxxVkZVLXEpMWY2RGw7T1RfQFVFJDt2OyZVPFUoajgmNW1kVTZRCit6cVRRd3lGdihOVjxqUkVHTk5idVFaUEskazxCaCkkQGNeNHl8VnR7ZV8jXzNseHx+NH5QVFlxPHtTJjBHS2JFdWJaeGdRT3x5YE5Oa0FzCitucn4waEhKWj5lQHhYP09VZGwzfElVM3dBbD9AX3Zed09EN3M2UCp+LWUyIXNvTXcoVEZANWQrYTFqbnwlNmpkLVF8VzNsbVp2Jm1OMzhoCitsPFV4Q2ppaHIoKk4mbE1mdkcqZzFLfjhTKFNsI354MG1RaWpgMTxZUWA8SmkmXmM/YjswMy1hOVF3PWBuNVVwdERGNWpZX1RhZGlsdGhqCitOVEY7V0IhUHcoOF5AdHo+NmI5em4waSlLX0tpKSpjbDY2eGwhMXhnc3xpPG80X042dlZBVCRWZTY0Qk1ZeTlSWXV6YDFKb0dhU0RXSUdQCitWfENHWnVCbHpIMElPLUhTaUd7PiNoN3QyZ2lke1FTZHYldi1zJXU+RkZgJkArPW5ISkdgJU5XeHI9YktLZUdvQ19DSUVJTVRNV0FZS1J4CitsfXpLMjhrMHswPnZONFVAO19mND1uUFltdnJ+cFM3fV8/ITIjcCsreU43RDI0Rlo5OWFsSVM2OEl5QGQhTDZGTE5WcyM1Mmc4RCVeVHdoCitoWi1ZeSkwNDVuczx6aCNlT140OHc5Q0pjZm99LUE/LUVBNT85fmhTUCgpZm4rKk9hRFVuRyZmREJHOytlRDdQOylWPUVCPWZEI2xURmEmCis5aT9ocF8ofEdeMEhtP1ZOZWFAJCNkXkAyMkdGJX5UZlo4T3dnQ1MzKCQhUHA/ejk2TU5HdVdFYio0WUFrTTVJc3trYWordWhBZH0qTz9jCitJdGZlSklWRCUrMXFXUlAjdmt1anN+JCglViRuTk9sJVMqQFh4b2lFcFUpQ1g1e0kyO3FOaHZrP1Y/X1UkUUxTczcoVWp5PlpPTERtQW4mCit1QGRjVENZenF+Z0tsTlBON3MwbEQxJnRfIUo1NWlxJDNGKUhEWE5wYU1NP1BVP1F1fmBrQ3huMzBVb0l4OSUtfUs8czlfYjRxYmEwRkshCisobEh+dHRtI15qfmN6MUV8eSg2Z2hfYlp3PmV6ZUJSRHErP1psaWtjWHJwUjBhY343WXVYeVJqSFZrc14tVkNVISs5QW5Ca3JIPlZaOztxCis9d09mIVVQSz95JXh9KW0jKlFNIyhVZSktM0kobktlcTRrP3NGazZDWk4pKWtTalFCelhLcU5ua0dfMilKWmYzbjs+YzNjUCFZVGpCK1RZCitpZzZwYmtGPzEyanBwbEd4Xl9rdyMlbT1DOFJ+PCtNN0tVR2Z1fXZ4NSF4U3Y1d2Q1Vjljdz1AYTR8RDBjKzJ2KTIqNlNieUtCaTBKOEBhCiteZk82PWQ2REw7MldWezctISY/KGYkTkw2Q08xXm8lUk1eO3pOd2tndD5ENWxFRlh9P2AwdlBhfjhEdldvMUpJU1ZobkRMIy1aSGtxal9PCitRPWFSSVhURVcxPmJVI2xjRVR5UD9qOXB3MWI+TnlEUj8hVGxjVClQIVp8eiV6V2M1aFVye21XZy0tQVZNbEk5aXFhIy1RPUg8MitabztPCitPYVNRZ1ZzVTAtVzZjeCQpSUIoenNqPExOTFcmN1BQVkcoOzNudndJaHJNaCFnYUA/bGVAeDZGQz1rJSUpKC1DYmkrbFJTOTh9PFFmJTNxCiszey1iQHlYTjI/ZDspdzxvRWNSdjlKIV9QOzlQQk9tKSNiVXdkPF9oQV8qKWk5QXhWbktHNjA+MGlTV2BwP3J9MF9sKWJZe0Z7VWBAdkE2CitweH1gJlI9QU97PHooKUFZKHs2NlgkXkFUKTxzajZSUFlgJUF3ZVM7dmtraEZzOClxSG5LSCY0QWI+enBGVlV8OH1FSWNeJj5CXmZEd3orCiszMW44V0JFPjhya0MxRGxgRUxxc2x+X3pPVGxBOSlNUDM0PFh8Z1YlNXs3Y1NyKl5jZ1ZOQGxAOVImQUZyantWNXtsbXhKMjhLNDswbGJtCitzeWk0RGBoI3EtNEFiX3t9I0FQI2tvPmV0eGZIS1R4e3drbm0tO3FWX3V4YSNnY0koK1ckY2U7ZnRXRX0/V09OJkZfT3VnRk47VForQ2kwCit8X0hyPWQkYENnNVkhe0JOMzY0NUMwYVdDRU9vQk9pNGNlQGI+d09LbUoxKiQlMDxNcWEyaCVlaUc2ITdXQFJVMFp6d0RCcEpQX3QjSylpCitNRFY1WDdLQX0qS2IyTmo0MEs+V1lBbDR5ZUgkSDFQNUtAWEh4Sk9RVUJPRkMwaU9nY0ppMkl2ZXNPOVdhcWskckF9ZlJ8KDB4QU1qbyE3CitCO2QmU0Y1JXJQPEc1e2l0MGVSM1I1SiRlZkYkMmlHcDZ6Q2ZyfHlxOXNna0M7OSl+ODZuI25ZcCNVP1IrITUyYiRXYyZfNHEhNCEoXzVBCitVMjdGVjdCWCRlazlxaF9rd3p2QSFHUFBPZk57TUI/TG50NDNlektiNlpPMmN7U0kxOHNNKkg/R3Q7YTQ2emQwQ09XUl9gN1ZzOHQwNE90CitZYEpeSDxgbWNyaGpKPmZ1U2ZBbmxYLTR9K2BNNVchaD1xZExZPGJNSWZzK2JKRm4+M054NE4lRHlVYnUrdVBRNztMKXg3cX5gb3wwX14+CisjR1lfZXomZ3ZXJE8hbGNsRk9KRk1PcG49ZWU8WWJsTEJIdm0tQXokYipNXjctfGhSKkVWdUghS3FBbWVOKX53bkVLYlY2eXUxQkh2PiQmCituISs3VUheTXFQejw1Y0leO0hrX1IrJVV9TDNPKnJET2NMRHRuMmJ8IXBPMGt1WkgmeStAejc1aHNDZHFeMCZfQXNiRFk2KHhZNXxVXyN0Citwd1pWeDZ6V0o2XzdCbGNHOWVSYT1jQCslNWliVSFrSVJhQj5xSG15X2VrdDswe0hEeWd6R1lJWjNIZllJJCk+U34mO3k7azhQR2ZNMzRZCitQWkJpOXc/UHBCIUYqU1dtTl8kaWJoRysraWdQekBDREkwSFlVMFp3e3tGZF94aVB+IylmYUt4Iys4JD5uJTg+ZyRIWXh4M0JMKVIhdjVQCitHX3VuV21DdEBBXlNEYnFFR3MmQ31ufWlARDQrT3thUlZaMHY1Z1R1X2dtMDJJNiQpVmwpXjJublBIeXh6WFpUVXUpSDhiMEpXIStHZWNMCit0VyhncW84U2QqOURGa2o5bzJ2YXZKezglZH17KGBLX0RMKShwP1lARC1pWnh5MERXZDtBOCZNc0tVcGRedlorV2s7Wm9INns2fWRQcHwqCis2aXBpZjlaJH1wQmV1fDNOSF45NGpSbFBVOXJqM1Z6dERmbkZLMXQ4Sjc5OVB7OUNebkVhdGl4NkNMcCh0TTlRVzVuQ2NuNF5HeDdUTl51CitSaTtUYiNnajFtb0pHP19TanFfYVFJSldtMyYmY2BaMSt7Z2kpVVhSNTtlU1p6ZE9JYSZlbipjbS1MV0dCSX1ZSzIyYVcmK0tMPW9yOVhgCiteO0pJKT9eZW02WE55eEBsNUJlPnExVmpNcWxUd3E2M0ZOKX4taUxjTX1kOyZJXz9fdWRpbzMpKjdhP3s0ezR7P0dgSnxYei0/LTwxSSN+CisjO05zbCtwX3ktS2BqdUA5KFMjUDQpP0Iqb35CNEs7amh4VlZlcDNMO21YMTVvVjk4X24wKF9xNlRiUnlEbD4rUShWJE59LUBuIzlzWlgoCit0YzNSSCphZTkjdigyeCNIbGVRU09Xfj4mRVRqVmthODd5UzV4em5nMy1NK2M/T2pZYkRORW5EPjhrSG5vUVBvcnNSOHBCQCVfTkV4PXxwCiskUXkjblclIUIkKzR2fFNTaGVGNytWRWpxeGI5VVZNQHg0RGtKbF44X093NSYkQDFieT5hd0g9Z1dCdnpzbSheb3ZZR3o7PGQ+O3lyPFZlCis0KEI/QnpyRzB1Q0pzc0M2dGJNTlltNGY3JVhQMnxGVWFNMClVY25wey1KI3c/WlIxamU/dEJ4fTZNSmQ4PU84bGdFLU15Umg1UUIkPiNCCitvVF9+VmlLY0ZhVXdYMmB9UFROPCp8bUcrNXkkMG5Rd1pRWFpvZik9M3Y0XlRAMzFRWS1PMDA7b3tsQD4+RDc2N2dHMFJSOXczSUc1cjAwCiswMVJYPmMhSmM0Y200WipuaFdYPilYSlg8eyM1VnFzJXphQnAmU0ZMUVp3VntkTHxYPWc1RFdAcWhIJVp7NXM1V0xTPGpGZjkpcX0rNExECitOK3VSSGFTQHE4bFp2SjslUEtKWT5YYEQrdFdQT0FSY1NqVzBaXks+Rig7OURpYD16NjV9Ti05aShfVXNTby1xKiVZKE44SU5SamYofkwmCis0dUtDXktoWVU5clB9QWZweVRHbS1Xa2t0dWNgOFZPUDBqXzY2d2JkT0UxYDtJbj4lbkJfKmZ2VG8hTiE+KE9Rbk0zYTB0e2JDJU5yfnYrCitgRXFVIXBSejt2SWhOUW5xUUVSbU49enl0bUZAeSFoP00zLT9QenxYfT1gVDZ9QUZJVDgoO3E4IzBwfilsM1hEY0lJVnR3V0x0aGhxVmZACis4JWx+O3psMUdRP24zS3t6bzlOTXFKSDk/ViZRUHRld1Y5Z25CTzc8blBSPnJROFZZb0ZNTDBTOHA/NnNgSjdqUGBZQT9NYCRPX2hjNTFFCis0dT0wZzExaERGUXxocEdwJXluKyYpbSt7SEcqcW03RnlmcX1hKHRtM2FHIW44ME1jVmI4UWZxJSEyPTEwQWdEfFBKQm5AYlc7WiNYfmtkCitFUT1rYm5NdXlfclEmKjs+RFRuMHBYel5wYEZSSmVsRzkzZ20rMC1UYn5NJjsoOEwrTXJLJDQpKWtnQHkqNmlwcDFRKEo2IUdWT1FgSWJ3CitAJmE/YS12KFBqZ0RLayg+eUV0KEtYUG9xS1lGNmFiYEdkPF42JTkpe2I2JWxjSiMtTCFjc3pTeFZhOGthJm0yWWk7RWt2aXc+QDA3WG1xCis7cmxCMFcqdTUmKGpyPD9ZY1NNdTs1fmZjNmBHMXBwLWVtM3VEPDJ1UiYhISF3Pzl1KWdQKWg+QDZhV0FLMm10ZXk3RG98M05GZUFRMDAyCismRDAwMWZnMDAzfWxhNCVuV1dvfjN8YXhZfFFiOThLSlZsUTd9VlBrNz5aKnBgbWI5ci1QWipGRjNYRClEZy05N3p4K2N1S0ZgPigpQyRzCis/NldibUYrYW9MamZndjdPZX1CPSlvMUc8JnZKcCh3fj1PcCNpR152Q3ZrZkJWZjAwMV9aVSt1MyZTaHQrIytCb1lgNWZjYyZRKy1JWF9CCitOazx8SUtBOXZXaWNQVSN3VG4yd0xhVStSKEUtUHhoUjt3SCgobnRVVCgwezEhdT4xI1VlfURJR1l6WVZiMG14dFcwTk41b2MpdG95TUhBCitjWllpaUFJMWtrYWEqdTNvdzI+NjUycSlHWis8eUZJdkx8Ylh0Jm51Xj4oOSgzJkR5XmYlRjYqbEZzQUhHQUQyPlBVbCZebCVTI2crRkhDCiteV3FFPDxAPGB9a1NAa1hGYGtTfkRZeDZ1PyFwbVM0NzdNMUh1Zmx2NT1SO14yQ2lyfTwkblVuLTc8Pyt3aHlYTWJKWVZDdDVubVBUa1h7Cit8K2Q2cnZrX28oZUx3UG01T2A+dzRgQ1NqNkhDVHhlRFE3YFkzN1pjZkx2WTU9e2dzMCg+ZCZBYnQ+bzlqZTczU2sqYypQTmo2QjVwP2BGCituem1NRHdackFQRWF4YV9ickcmRSVUcjBgfGR0QmNjVWdhdkxub3pNM1VHeT9+WE5AajA3X2FMeS1zLUZeSnVLKDEhQjFeQ0glUVJYU0wrCit0RkxLOEFvR2RCYTl4am4/TkNSLTF+c3ZAfkFBclh+SmQwJD8/aDJlO3c/ZFBUdVR9NGA0P1dTcCt9fmhgISZ6JklVMFV0bm94Qk5jeyRVCis3S0pJQmE+a2RkOypQPWFWU2FnaV9UcXZxZkZoPXhyen4yOD1fUXtMQ24oO0RnQFJTNDFPciRBcmpmX3w4b21SSUF0RyMqWFAwQG5XUWRACisxNSlHdGJQT3ZNeyZDQ2FjYVV0TFZfR0xSZXRkfHgmTFpHKmJyZSZQV2RjYSZael9aY28/VGFBRVpnfW53K15nMGVrUVZWdjdOQD98Y0JtCitLKTViM2t5ejRlZGR7fEhgb3FJNzx+aXE2bGtUYDBZTEB1JWF8I0JLTmV7P19LYnhZMl4wcE5HclkpfXxCNSYzYDQ1bDZfKks4SWlFajB8CitCJExJU05ZVl9yfH5vRTErbW1eb0M2Uk8wcDxTZFZgdTw8VURFZ1NmSiMlN24kRHNZKnI+KjBLaj1WRnUpaiRjYmI9eUpre15GQUBCLUZ6Cit2STgyeyZlKFZeNSZQcmNsKXBldHFETXJYbnUpe0dLMUh1N2ZBfTlpWmJXYlRScXB5QiUxPFRSTHxHY2VBMjlfQUohPDZfeiF9ZGk+JUIrCisoUCpoWGtKQX4qWFdlV1hNcHlWOGdrZnxRVVVKK201XjBsM2tjKDlrN3JxeUdMLXVrMk9rTVN3TkdRLSllKHtATjI2YTxGNEhwXiMlZjxvCit6PDlpQFNxP2A8KGc7I2U3MT9aMlc+TmpMfE9BdiZ4I2xveEYtXjhIYmJuNzQjNkgmbFFFZDJyTUJ3X0VfV1c0diYhVFc9OGZOTTJoYEM/CisjRmhQN3ZRTTxnXlU/fV55RlJWTCF3JHRuakdiUEtEYWVsSWRtTGslKnFoODRXPEJeYy12ciVfVlFJQ2xSezxQbmhqQDlUJV4rMkR+ZFAtCitCXkpLeGxzOVE4NWgjfDl3M0dGeEViM1k5cEVqMCNxUjNpSylBVGxrbXBXP0xlIU9rR20oNmxZYEBUJkB8XmtscjJ9dEpHcG9Nbn03RFYtCishN2owRmdYN21OMFM3Nnk4X2Bja3B3R3ozMHNTWDdJa1luUiRJS2w5ZlQ9PnZoX1UkIWR6NEpzS1BtajMlKFJhUT5pVTBnPU9+dnAjWFRSCitXbF9UenU9RXAhNzQ1b3dneGp2KVRILXslMmVEYjxVe2U2VmhDTmJKTFc5aiMqbFduSCE9eG1kUWhue05fT2klNno4WjA7VV53V2xIS0tZCiticiZ1JjBDQGtjaFJrTkhndnVwMHlpOFpDVik5aS1IalJ3PTFrKVE9SWQ1ajhPRnJiNHQxKkghWUx4cWxmaXxpQDt5NEpSfTByamtFczVACisqSE19PT1+eXlgSjlOUyVsPD1mRTJnUCVqd0ooSVQ2RVh7P2pmYnhna3ZGN3ZFaGA3Wn59XmB+fSNWMS0ze3hzfkx2VEFYMkBpIzExKyMlCitNMUxxQDZfSm9OMEA/ST04aUErZCEwNHpnaU4jLSFPVz0kKmZ1P0FaQzVgX1ZDbUQxMnpNQDdybCQqaj1eVDN7aW0jOXclfEVQcHx9dUNkCitNY3Bpei1+WlFsWW8zbTMrY3pxY29EYDQhcHI3dFB1aFMoUnRqI3lueE1EQ2tTTzVVZzVScGdzN05PdDReR0MxTTt+Q2pqMUdhK1BOYktOCitNdzlWUk08PUl0KTNmYllqeTk3SU4wYT57WS0rcWgpQWhPYVU8MTNKOUtjYy1oSTB6anR4UlI5MjAlKDRkXipeQnBlPFU/bGQxIUZoSG5wCitsI0JEKyR7MkAjRStUQHE8IUhHN1U9IXRlOSVCZCpHNEktfiNEMHorXkQzU21sQGxmJmBzNmdiKCYpRCFZeF9oK29VfXMtfV8rPzNhI28yCitFSGx2UGtIcHh5Nk1oZUFnczBkbFkhUis7MiVOc0RBbkFtbkFaVnhRfWdLTD9WNjU5ano2eWtRYEtHO0BJZmUwaXdzZCVePlpmOGBuazh2CitDX0phcW9raVlqQUNpc25kOT9VcElKYENrN0RNTlM8RURkNnFoWClVTypySStAO2gqfnl+UF5RJHkhIUdURmhgVzRffGYlbDJ1Znp4ci0+CitBVXRPPD1aUU1OOXdMXzh7aXtEdWZiMTQoQTAzMHUoNTRzWGlURUsyTDZER0dYXzNgPGA7a3Fqa1JXKjJ0PmA9bUB6MGhDdD81RkA3Z3hOCitTNGRqTzUwK3Z1bnB1bTR1WkZBPEtKY31ZWHdTZDB1OVQ9SGx2O2orQ0oxSCFwfmFPSk9AbUx1dGwze3F3TTBZOFBfdF41ZFUwQl4hZW4+CitGS2VScDtAYzttfHBpPXghc0hOM0BgX0pkOFBIdUFXKEh+Kn53T29wMWhAU1g3RUU2NGkoTGAhSHVXRH48NEVyUT1SOTlgcUJNREdMQnJECitVSlo9IUNTYFg9NkxPYW5qTVdIaH1zVmp2YktfKi10VTUpdjR0QE8jcUxLdnxFWDl2bjwwWkFHMzQ0Jjcwcm5QPFJCIXF9O0xARnNPeG9+CistT3ZTISp7N1B8bzJyRCt9Z2pWdUxTPGM9SCQ+RTgoI3A5THRDP2ZPXiE5Uz9uR2tAOSY9T182RGY5ZDtpLXIkd2cxek5oPG9LQSNnaWRSCit0dGc2ITZsZEdMcj18MiNrK0xpanU0LVBgQXdWfSRqQF9fKEBtQ04hMz1EWHAhZWJKJD9wNHVVeW58SD9wWUxIYiE9Slg/I2JPWkxIOHRHCis2TlBuemRBXklNZDY/Zn09c3t4dlBvS18kcj9WYj0rNSohMkclYyZNP1R3M2kmRCFYQCg2LVRhcXAzcUluaFJ0QVIwbjUkOWh7WllYb3JaCityR0ZIZ0ZXRmRSNlQ4fjY9bXZDfHZsdiVNJDIwelJKUilVbUY3Xmk0YUFqb3dvWGpmcUBiJVZxWXRPPkc0IWp1Mz1PQmhAZTB9ZTdnMXt1CitnWjM1N0o2STYkOWFAVWxkXjY+VkFfcjdVR2pRSzBWKDI1aVZ1ZXErRzF0KFFKSztnP3xLZmY+YTQ0MEA4RmZyJXA4ZFpOdDc7Rl5lK2FUCisyMXozLWZ7PUxqezEkdm4talo8KUJDd0VzN1kodV9vSG5uQj0jJUwqRGJ4IXFHbz1OQkAxSHsoVWp9JiZrRX0hTVMrMDFPTkhLdndAOztpCitwMm4mbW58NTFAQkdRUkAxSD8kZk5gUHpCfHkmeD1nc35iJmk9bzNicFBHcCtzRWoxQEh9fF5FNnN9ZjBYLXFSUmk7Q05Ze2dUOS1ncWpyCitJeSlYXmJ3SiM0NDRqTGRvKyNuVldtc0A3cUh4N342ZXliNEM/dyN5QWBXd2s2NDVXO0ZkWG0hblU/cyV2Sm1ofEFpKHF+MVJ+fnBlVUFqCitBZFk7RUNlP1NgUXAjWkBXZUcrNG4xSmEqOSFtO0dqdmY8SkttIVQ1WitJekAwWTxDdmxVVGFMT0grfVpgJHJGIzxIJGI9R0lrMyFVZTFOCisrOSU5ZGlxYXdQI05QMz9RbzZ8eypOWkJodktvPjBJVGQkaUBBK1JuMy10aXdrTE4tSTsrb0w4S0opej1RMnNrRiZRbG9nSDRpOUxWZGExCisxKmRsWG9eV0ZtQkhPaTZkJn5vPTV8YlI/QFNxaVhxXjFjKXJSSz18UTd3TVVCaUBORF87fVNCdDJ1YCUyJGB0bEFOYWd2PGt2KT8/QyYoCitOUCZLcjMxYHNmK1IrWDEtX1hBRn50VG1razhsUHljMTNjM040NU5qUl4mK1NPQmVFRT82Qy1SbyV4Yzk+dVZiUUstQl5ER3JOXyRxMWw/CitRcTdtXzc+WCZOclVUb1pVLU1MZmlwalkmbnQoYF9WdztRPWphSH58M1kzd0NGSn17VCNlOHE/P1lyRnskR0JWWF9OJVhaJEgoJSFURTNlCitGJTRpVEllJHshdnpHcDhDaXZxWT5vNU0xc1Noc1kwMH5OOGlMUEpYKDhDVExjNUlvRiorb2tvM14yM3oxX1MrYEVFdjVmbUc9IUBEcV41CitMZTZZQ3JeKipaTWplMkVTS1BJdTtuT2ZBNTUhbmpNM2AtLT8te0dqMmUxP2dmKHUrdlpuISlBdkpUX09KVzY3KHw1NWsrU2dqbDlnSGJkCitUSFIlLTJIJDheKHB5IXBJQHBZI3ReRkJ9eWRxUWZJVWg/cHA7akN+JmNNND9abkE/TzVEN15SYzAmVXkhRTxuNWdTQzJlSGY5dEwrUXROCitSRyZIVi17Ris7Q2ZCeU9PZipZNSE7QyRkdyk4aGJfcSlackhaXyY7ViVaUl4/Z3xHLVpNd0V7U2pYYGg7VXZ8P3UmVHZZelo1VU54QlBYCitUaDBIbj9lPGRjcEZoQVRCTyZseWc2ckNKcjlyN3BfdTUjfXJIWnc8VEhlM0xvZkBffDluIVhLNW9DP0BJTClnK1pUeXt2JUghd2EySE0lCitZO3RHfWVBWn5MfG1qMypjNDJocUluRFc4U3M4MUEoZCl3LXU0UWhtWU1ZczhKdGwxLU1HcTR4MyVUbSt8OWFKJEdFb2xWSzRpN0VeKXwxCitNND1nQih3V2F9JkMjZWVHbl5yYUw5bzh7UkcjVzQ2eTBPRSR+T2d3blohPSU7YTV4YWNmPylFOE16Rzdsaz01WXBkNUclMGlMPih6YXZzCit4e21HZGRhemJQcSM3KVcwNGd1IWRrSXtIYHU2PDZEbSRSd1haQE9iVmUqR25NU0d5LWFRV2lKKUF+ejtfYFRYb2I9NnJTaWdeXi0rSDljCislUjR+STFwOGJXenhYWD9yRVQlKzN1V3BCTVJqJW8+MVU9UmY9fkppbSg5cjRhT3B2VUV3c0lDKmhAKS1CcUVQUyk1TjRwP21WdD0mNSlyCitKb2MzTnR2dD88ZipsJX5FQzFVR3dIZVE9QyFfMWJkYH1lTTE1VWxjdW43akhwcmAwbkBzQnUtcChCUDJ7YnB0K0YyRWore35gQiNOdEdxCismZDR7Vk0mXm5OM0EpfUpWTjhgZyFJMz1YQ3BwR2pmU3ZhR3ZMfktheyM8VShANHgpRWxNWSRYVksrUC19LTtDR2pGRGlPMCpIVj1NOSs0CitEQmwjUWliaWM4ZD9hU0Q3Rio5QmVATVJIIVlqVmRxbihiLWVjZ01IS15uVCh8QTFMSiZII2V3N1g4cTZkSSNRIzVNSj8xfFoxQjZEKGc0CispKzQ4cGh6JEQ2RDx4Rno4OyQpdHllVyVmV08zcEIqcTwrYEUrSVhpKlNDSCpXP09ATTlNVWB0eUpOTGhHXnF7fT1pd1d4SSE7aEFLME5lCismN3cqITxRcztzT31YdkEmSnV+aj5SPH43aTs8Vi1sVUVgODskVSg7SG9RdiR+biZabnJrPn1MMWVZbGtXSWxNeWprJEgtZWQpZXFKMyZHCithIXRYd04tNnlYKGwrTiZrP0R8THhBZGIjMlk4VTxwTFMwVV9DMlh+QFg/JDRuSSNhP0VkNjZiO2xwVnkybjR1QihAP35ibz9DQEB0aEFRCitHQDlAcTMhVDZOV1lsfTBaO2hWemA/elJ8S2NlRnFKdT1ubmx7ZSREYkhrIXYpQHNleWlLQjdpbXUpM1JoI2BBK3Uya0hnQzw+bV98K1VhCitGaSVIR0MofE0weyFiNytxKFlOYUNZUlhJJnlDM2xZeDFea3dLKjV1TEV6MHFxZUlzUDRAKk4rWCRRZ3UlfGByTVo8Nyk1YHIoQ19tQiF7CitHQ0lzKkN+ZnRAeWtSVkV5ZGIxPyRzR0h4UEtnZXFMcE5XU3xEYTY/WEklZ1NWP0hkaDZSKyUmZWRgd3k+Syo8RXZXTVZ4Xkl1PERWNkxiCiteMkJ2aztfTjtQRGxpZU5FMnBYP08xQnRSPiFJNyNkcHJrSi1jZHZJKCZwOXl8fjghYnR1akk0QTVFeUtmP1VIRkk3cUooK0pIcExudF5jCispWjt4UC1gOEhOOGo5Nz9WUE11UlpRKkg0TTM8ZVpkU1dTT3dFJmVoKipzOz9VY3BkP0E1R35aNiYhWEZCeCEwSlFqSVNJbUxrZ3dLSiQmCitUUWVBbUJGbyY7Q1BDUjtXc2lXPG9gfFM0aTdVVUdpdHBqaUZDUUxENEUzaVQ9cURaIWhWVEZfd2ZUQkB2K3ImQFRZd1MyezFQdExsUjI3CitSbUNeOCg9UyVUV2RTcmApdkQrQHZgcyo+JVdLZyp3PUtjbGNUdFZ2eTlLKFBVbzx0VDdLblAwfjxKfG9GfDZETnRhQU1XWXxzKyVuSDlLCispVkV6aW10Rj9waihvJjZjfj9VM1ROM1kxTjB5WTI0KjgmMyo4dFNNKD1zMV89aGNrVzg2K3xITVhFPiF4UGJCcC0+Sk1yKXUjXih9ISRpCispVTc0ME43dkFfRHsxKTFCOzteQnM2dDU+UiYrMklfMEhwOElffn12ekF7WWI5OXBjXiNJJVltbyZhYjt+SipEPFk2aT5XZGVnIzVnNE5lCit3Pm5fZl84cV5+O0Nfd01TI340bit7Z1BjVm48XmpSdTI8YCVROUxwdkJaOEB2cykrPlh3dDQzQlJrXzwkOzEmZChJZXY8dldfc3h2TWIhCitxYXdXK3dqQX1TbCNqdGV9dUFXbmU7aTM7bTd6TEc7M05lYztUWlQ9ZTFYQ0Z9UWU9ST1xQUUxYlhIMW4rMit+d0NeTSZoVlJDQUl1djRECitxbk5UIVNNbnR5QTZmPzNUJkVaQ0U3T3FnPzNyd0pYeCs8O0heK0E8VGc7ZEU+eHRxTDxHQ19MZCg3STdqcmwpbiUtQ3YpYTBYKDxoOURvCitYOFdYdnsqa0h0SlpyVkJifEk7dT9uZmdCPlBmMGprR3MtI14/ciYxUEF2diRKVHw0R04xfTk8ZTBJWkZTUX10VmV6QkxQS3ZENEVTbDhmCitIc2dTQWE8ZTNtLVUwJU12LT5tRjhKOy1jKF5YeHV5NkdRbTNCdU9YajtueSUmQ0RDKGdIO1VrNDRHej5QVD8yQVRsajVsYlZUKlc7dFpqCiswWEU/ZVQ7TjxLZF5Nb15mWip4ZHFDbTt3PX1KNSpYYHJIIURObksrRE96eSRRazdVNzNhV1d0cnQoQXJDSGhGPmx2S0lYSmY4fjlqbE5SCityI0tsUFc1NnA+fjFAcXMtPFRpcT49RzNlO3VXJTxxdmRSanJfNG5rVkF5MD8qTyheJWxTS1llRnZ+M0FAMUYoSDtjUktAWkpYTWB1VzEpCitxN2lPeEBrTXBpZiNTcHBPLSlqa0gqM2stc0FeZ0MwSTJjO3tTRlgyZXhvWkx4WXctcFllUSs3cn5ocTBmczgmckAoSFk+Mz4tclBQZWtaCitPamNiTk93RXJ4JTgzcjdyMzhIP1U0I3JxVVhPd042SzcrenxEdTBnQ2grPmlqdW5LWjw1ZE5vfTJkSXVKRjk+Q088MUgjezB1ZmElXmF7Cis1YWpxPXc+RTtBYm0yezx6PT54NngrUyY0MSlRWEdHQUY/OUhmTko+KUx1fUdLP25rbW1NNnlrJVI3NnZ8KCYzdUY7S0RvUW04QGY4dnI9CitPWURIODB3aV9aQ3QkbG1mVGR3UCFmX05scThiTzdZNiF2dUwpUktkT305YS1tdWs+KEwxaChkN29Saj9ibjsjTVl6ZSl5MXded2wpe35YCis3NGRIWGVeT1ByQSFBalZyXncmWCs7X1FFPjdUUUsoe185e2ZjeDVCSTQ4TFQjMFJ2K2lIc0dLLU9vfUlWK05FTVBnendtRTdoITt6cyFZCis+UXo/THZDJlIpSTxIaXJ4aF9+OzczakljVX1jNC12RHtQUWVwbXVkOE07OCNgeVZUcH5aMkJNQktMeH1YU1JIYTlFKnJDMHtlUmhoKmNVCit7fj4wY1dCaTZjJShJTDBPR3g3NlljUVI5P3BjTzZyLUFtMSZITjBMSDhvVkg2cmNEYnBUYjliPUZSKnI7YmgqYE4hWlRBaHFWVX0/RldmCis9TGZVJXk8c04mV3Q+JVRAd2JZZUdqQSsjKnZfMXhrODQhO1lyZClSKTM1VkVVPyQ9QTlkKXdxYng8Kkdkbmc8O1BIdWpUZkBITHNSRURhCis7I0BwR3pqPU54YTZBVjhHWkthbV9TZStKJmk9O0VpO0hLRWZZSEpmPEMyeT1obzchfGBmajJQN1MjV2cpQihjQzxDJTBGYTZhSVRNK01mCis+Tm88TFBULTJWTFJaRzwjeTlvTmooZG9ncUJ4X2spN291enxhJlI7dip4PjBNK2crYHdKUTB9aTZPIX5kUDZeKmZ0e2A2cXgoTCp9VldRCitHNWJYK3R7RlUjLX00fm9WQCp8SWFycGdBQ3N7fEdGUHR9I2ZASHJpK2w/Vmp4WUJ4Jmd9TVA0SyV0UmdKfktuRnFuK2NIfmNAMn0lSHYmCitUUW5idFZrPz97bjtmTU4kQiR2cjlMbEltcWJ7MUNTbXRPPWkkQVIld1M9KXJBVjY8fmh1JD41NW56aWJgM35hbzAtRllheVBwQCYzPH1aCitkRS1kYy1PKkpHMXh+ZSVyTVV+MWgmUWtiTHUoO2VANX4/MD5LbHI2MUpPNSRaZVUydjRiR2BQVVhkPSk8d1YobnEpSE9CdmwkTmZUKjtSCiszP0t6cj92Z0xsU1oxYl9TKTRPdFh9N2wzSSNlJlFjLU0pKSlhNTE0UHYmb19CZCgtYyNNPHIjcGBzIy00b0lZaEAzT0tBMWIpSTMwKl9lCit9V2U/YUNQYlp4V01zaWVuRkJRcWwoJWYyQzBPa0FWPEwza0RDaX1PJEszdWVtQTJHWVN6alJsREdSPDslUGxnWCZAMlRfckxzQ3R5Oy00CituazZ1N1VFWn18Q1JHTDlERXRMMj44dDdSZGV5Y0AmRGl+bzV0YyU7bjMmalVoQ1VhZSRRMlZjdEBFelc4eiY4bD59dCFeS25PUCRYQTdKCitYQVdvT3Y9O1clTHIhb2YpdSN0KiRWK2d6OEhBJD5jWXNxZngqbHlwSGZuaTk8UCZJJmlNRDxHfWE/dCQ4dCtLayFzZ2ByeituNEE0PU8wCis9MmM4KXN5WVkyeWBfIVFYUl5yYXdXdm4hRnd0NFdgSVJKa0pWWClqeklvdEVwTzRZak1JYnkkWT5WPHElc3pacz5ldituVG1ORkhLSDNhCitzVWN+RXghVkBDb3JWNUwwSz92YDt6LTYlV1I2bEkzMShKeC14akp1P1Q9fS1Yano+O1VhKFZ3SnMzLW8/QTR5NUg7YGZAT3o+PlI8d0FNCitrVk57czYrVWM9akRqZXhqWGwtfmp7Kzk4fWZHR08jTGA3WCY8SHJJXkxSVnA0IzhIYHFJWmxReUlsfXlqa05wNTFKal9lIWZ7bE1YQnRWCitOV3BXKVNnMUYyP2trYXV4Zi1xSHdId3pKekZMdm9gWU4wWGg1OGN9fHJCMzdDSXNRNHpxRi1Hdz51ZWE8Y1ZYfDY7JT5TV2NLYXMmZXVeCis0UnhUTygxWG8yN21jPWtlfDZvOFhvQ2R1d3lGNj5SOD9qNztIUmhPeD52cl5zaig2NSMpaj1xNH1iWio1TSYlRnVtYXU1PVhgP0NNcD5aCitlTVJydyFwN0dPYmVkaW14SzNQbzJOc0BpKWRoaWliRSUpTHMqKSlUJClXXloyKTlJaSVQOG84IT02d05RNlQ+UiQ8aGBzNmZHNnlkOHkjCit2QGlmQ09DK2xSX0U3VHs+QF5oKyVnJXlzajtmJH50eF57PTsreilOaUUpdn1iMzFhMlJBTiRKdCZ+KiRYTlVDfEVgeDhKZl5PVmNMS2sxCitAJVJqMHtiOE5UNk1sWVNgcFVvKiRANHZWSl9YZlFvaSkrQWBXXjNHbzU8a2FOTyR2a1VGVihlZUNOaT1jRUQ0Y2A9UzBlQCRqRWJjanBoCitFfCgte2U7PygzUnNiQz4+N01NbHdETUB2VW5GPWtqek9vR1JaOXJXMyFQb0s8Iz9AanNmMU4oNF9xKChIM0ZuNXM9aFh3JGgxe0xpNio2CitTOzVhKHVpO09ifFNiSXZDaF9PTyZJVSF4RDIpP0FLWURsZjF3QEY3P1FTT3JTM15RNEY9YUpKaDBSU29zRUtoKSQyQyF8SHwqJEZYVURCCitMYnRzVEhkO2NTMkVAeGlVRj9iP1BDeD0wLXQ3P1ZSMVFvR3V+ZjY4aVJaIXh1MXVySzxgS3UjeG95enA/OGQrYWZ2WDVGQlluak0kVW15Citxe089LXU9PWR6eD93fXQ2SD8jbVdAdDJkbFpWPzh4UkV6NyRjMnRaWT0zaD52MityI0ooRFZTMyVyUiYoQWhFKWB8Q3NpMDdlMSNiUm9lCitpJm9KPS1sTzJyPTBQKEJXVE1aJjsoVjhTQkhhXn14a3AlTllsVkRpeXNUaiEkVTAtaiFMT0BxenZ9WGdfQVFRJUg7PCtYaE9vNHQ2RXh6CitlKDh5d2VYPDF6KHVfeSY4QXJDTVBkN0VATG0pPkNTeSpXZyhLa01Ic0IwZntlMGNrNktuQWsxRz9ebT98amVQTzJMPTx1OUFCP0BGI3JNCislXzlCaF91Ql9aVzZvYHBSezZndFpjemF3U21wU3lOQHdEPSl6PW5zV0ptWXFSJjQ9Q1Y2aFUxOHVAXjtkR04oOHxWR2ZQeDBCaWRWYVZaCitiX2lnLUtCaj9NWkZRfmxgJiM2JCQ4X0h5PzFzIzNvZjE7LWwrNkt2OGdLVHZ2NSU0dlRUWkV5fWpERz84ZGx0dVNWYjRXPlV+KSZRQGcoCitMWWZRQXBMd3dKcTBGfEJLfTtETmlob3o7NzNSd2ZDez1CUCQ1emx7Zyo5b3tsJU9IcmRjVjdPSDJ5VCVLUkFBT153OytYQTVKSHl5QyoqCiska1E1aVpGYVEtPEFUNFhtKWhQUXIhJVJzJGpnej56MTJVdis0ciVOcTxgRzBsTiNaRVBEMnRzTXUzfEVSVTFxOGROJG1wKE5HeEdUVXNZCit4O1p9ZUdoKnxgaG5UNmplQk9JMlJtQDt+YW00V255MWJFcTIycGhPcEomJn50YzErbyZZLVEqXmA2UE9EfXYkb0tPa1ImeXpeRlRXNXNwCitkYXlmVCZNJiZwN0NrQmB3aWhveitxPCR7Y28kIWI5a3pOVk9mPCZOdSkhaD4paCk4MFNhc0JBdE1wQEs5RVQ7WGJkWj0hb3R3bX1MPV82Cis3ZzlCNVhATFBnKVVPYHV7eDNiUFNzeiFERCRqfDU0UVB7VmB2RXxHRUJvdW88RXx9Y2FBeXtQbHRIeFY7WG99LVNEISQyam47QWBFP0ErCitNIW94fT0xODtob0xPNlMtb2xrUl8qSThETCRzMGM8UWoxPG5gWEJ8YCFLVW5kZ3pNbEBrTXdJPTFTZlV6X2hCNXp3KldnSjdTaTUtKEImCiskP35mX1hRMlppent4S0h1R35zRjt6Rld1Rj1pLV9CUDZxbn16QCEpY3kmcFhMVmVzOSRgaGApTEskYn41aj1scXBmKjtiNmM/ek49NlduCituVV4+TldWaV5SUmFsYlBUO25yRWcpPjYpRzxmV0JQYiZiX081JUhuJihOXjtiOGxqV29ec1MmZ0t4JSVBOHFxWFhTbXpsV2p3WChhdVohCitFJWRUIWFERCFlR1FWQFNHX21uTE1DJGp5bz02I2JvdXROQHFPKk0hSzdNUnF+UEJMUH59TkQyfCNzQWdOPHtYN2FoKyU3dVkpMXZ2VTFZCis7JU83c0RZOGQ7eUByWHN2WG9hY1UwVzErN1oofXg7dl9+WFApbHhVQEJoRmome310R19gMkdrOTA4ZXsqYHRkaHNIZnBRQlpWM2ZrNWw1CitrQilzdTlubndTKkQ2VElpJWpYb1ZCaT1Jb2xLQ1N2SEBCcEZGUlJJT18tWFJjVVM4Vm5LJWpzeWN6X31kYi1NYTY/TFZjQTZtdlBrVFJPCitgMiZqMUxPWShUUWkwYXBYMmMleTszPn1+WHc2QkN+ZGg/RyZgfEhRNGlRWHwqKklmWWVjdyY4JiNfIVQweT93Z3BfNmx6eylgUDBzUGdVCiskaz5eI2xNK0B+TUlDVnxwP0R8QiU/YWwjI1NFU01qWW0rOzg7JG1uTEFvMFQkQDQ7R0N5KWw4ZVRoVipKPGdlRU03JisrNkpVWWs+Mm17CitYTkZIUjdmWUstZ2h4KCopKlhKYDhnIyEmYHdUN0QwWSpKYlUoUDxIMm9IYCtMdH5RVG1BajNkZWh0JGljNlpEekBNdmpYcGIkS0BvPTFhCitIcUE+Q0cqRn1kbVcqPXgtPFRyN1AmdHhZRl5YI045SFB0YFlYdU8/eURCYkAtYUw3UlU9JHI8Uit9WVItIVckSSRfZil4N0xeVGZxXykwCisraHlZZGl5dm9VNWdMREUwcV5ZeCt0SUh0TyYjRSNAZX5aQDlCKDV+IVcrQmtELXVqcWpHaHNLSygyVVV1TEYoa2RyIXFTcXZRUkFmTUtECitqX3ZnaF5LfHUpN3FoPHlzKSFCUUBvKX00KXtUUz5qKDZlWVhuTXNIMHN3I09nYnl9Wk5RZXojZklObytPb1NwVT1TZEhibVczfVJxRXspCit4PUlfe31fa2E+aCNvbXJgJkkxa2E3VkFPNFYjdHdTTl4zVTJCPVVYMT9RUWEyaXgkbiV5S00kaCtEZys2KDM5YT5IcUoqMVRgTCtLOFApCitoPkA2YVdBSzJtdGV5N0R1NSZJOXA+YDAwN2Z6MFJTaWYwMDN9bGE0JW5XV29+M3xheFl8UWI5OEtKVmxRN31WUGs3PloqcGBtYllYSTRYCis+NFVLYUN6T21lUzZ6QnZOLXlgS0x1QWxJaEdQeFlkSjRYZWUyJWlCdT90NWotQUpMSHREOWhEa2FlfUghYFYxUWdQaGZ7cUE/KDBPRjA1CitvVjRmT15WNG8paTNBMSVVQCh7JjN9IWFCenh9aFo4Qzd2e25hLTJKOyZ4OzZrQWU2K1UpJmJ5PzVje28md0o3QyZkelJoOTJhSHVZRlNvCitzR0VVfnY0fERrYVVvLVc0RmluMWhkSSQ0KU1EQHozTlhuJTZvSjxFQm9BQmFJUWUzQkhuZFZzKHJEWVVkQn1GcDZqYj1yaFJtcnA7TVZDCitkQUx7V1lqT3xJZiVtY1d4TGtEQHJjalRUOCE8ezd9cSQ1b3RXWCpQQEVENEdDPFNVanEoMEE4NzJSeVQyeFYyeD1NbXR7VWxWKm5nWV5VCiszbCQkKlE8WTI/bVo2R35jYlJwbHMoe3MmI3RPVU5sWU9JYmZJfVRxdHBfO1lLJVViKEpxR2ZCYCtMaWdiYnlgJmYxfFVyckcjUlYxM0gqCitEMUZzVX1RK0pnPUx4YTBTMlBxa0ZONytkV25BJT5oZllhb35Qd2lLYm9mNCFneUsxIXhBNChrX19yJD1sK0AoUUpLdT0zP3MkUEBGKkRBCitfSVZodnhkbzFVNzBEbyQrez5HKnsyRlRqakprdDNFMEBiNjB8YTIpc041OShEfDNKYklRJTEtUlEhfmh5M0ZWRXswNGVXY3gyTlFkdDJfCismVHdnJGVjJHxNdXNGekdlUUk9UUczJnNtKWo0QC0xa2F5KSg0Q0U3eTVpY0g5S20/YCZwR3NlYF5VRT5OVHZud3BRSCM4d2M1dygwRSE3CisqUXhyPzY7cXd+fDM3dy08djR4Xio8PSpgKmItO1ExIXpLQSpwPU1nO1VeckxyMjdlQWY4eUA7VTUqfT0paEZWWDRDPS19aitERWomNjxPCitSO3Q7cmxtZGh2KDxmPX47QzJgcHhtdDtmc0VCYm5eVzg/VGUkNlM1Zm9+PllraWxNOGArM2sxaGM2I2M0IyUzY1JEa2JBU09icXR9T0wmCit3cWpeMmhXYTxrMWw/SkZAMVMtYWV8UUg4dnVfRXFVZz1SKn5RV0d4NW8kWUdrV3YoPzlKKTxBLXAodzBXZU5aUG1XR3JvPFhDQnVNYlp5CisyN3YhYjFXJSpyQE5lKXRJeyllNV8/WCp7NCZGa2kmSHlzTmVTWjRwbSRSYytLVjFOZnBIN2NvOU9DbjVoayk/R3YqU1o8bj56Z2JffjdWCit1S1lEVFNgcnk/ZSpGNlBqZkM/NjZxeWZnZXBBUHZjRz1CZ1g5Nll9YEl6NkUtSzBpSVZJRF9BUDc9XlFvOHA2QXleRiEkRyFQKEl7cGJzCishIW99RUhWSVA2ZGoybGZRKG8qWGhMb0R6SExwYX1rY2R5WmRtSlBDc3JoWD08MT87Tlh9I2N9UjAzbjF7KD15Rip0aSkxdjQocmN1WVhpCis9bkQxeTNfdHlCaXl3UFVrRiVyeDZ1TCVEZ0drRG5UTCNqdFY0UlQqcC11N243Xj5iNWFobF97UFIpXmNqe0NSMHB2OFFSaEYtbEZ1cHJ7CisxMTMxWnpCQV95UGQpSmdQamk0aD9sP0AzYUVmakg2UShUeHdEZnpMU0VZU2N4ZXgtT0BWYDlDOTN1eEZXfWM2dTtTcnhkdU1saF9pOzQqCitadHYwVi1wKCszdW1jUF8+YkArfWVnd343Q1N4a3JpfmErbE9nQCtDbCl4YUFxdkBXcFR8YGZ4SzdSVmQwe1dQTnt5bjtlaiZILUR6LXBRCismKlcrYXw2TD5gZXRHKHB6KHwrKGRrNTFDJEk9TX1YSzdOfSF7cCZ8KERSVDhgYmRsY3hBSXFpIzdfM2NtemQ1MV9EJFIjN1hYUzBGelVLCitOSEcrTD9lTmx8M0VgY2I5Vk5uTk58UElOSjNNZTJLelk7MDc7P2NONUN0dnM2KjN0KyVFKH5hY0lCdzE4fihQMl5LMSgkO1kmfEBlOHxECitOTy1mUGZ2VDlGKGAkXkVDU3UhTCt8aXZ1Uz0pQkFFZjcweEVoaypvbGZiRXJEXko8UHxgS2ZsUDN9QmR7QSViO0s8cTtwfDc8Z0d4OSptCitGYjVuX0c7dWVSaXBHRz5KQT9jQU42MSMwKipPT3hOVHNlJXA1MWNOMFMxV0ktbW1fSEBlRV9RYCFYPigwVEhfTlB4ITlaP0RIVz5eUjRPCisrTTZRJTQzc2lVdXV1R3JPOGJ+VTBNdCFYYGFMeX1DLUhTKzRDNFllWEI7fE9iMyV6fjQoe1Z4bmFfIXxLNkViUDt3OEtVRXskSzB2ZGJMCis1cnNZVSMkcVJ6cmBNOXdHLTJgRzhzTzZiTGclM0wpcWFVSiYpPGxtKzw3R09wUWU0MXM4T2VgdzFJUlk5M2hGbC1xa05JejxmdGJEYGJ+CitvZGAmMUhiO3FOV25LP1A/anU8O0dUN3o9Znt2KGpFeWVoYTlSeDV0UWs9aHZOMTYjOHJ1YiExRTJXbnE9WmxQVzFUbyprYil8TX5wcj99Cit0JEpAbythI1hgVz1XPkkhJD5NVWhWdSp2VVp6OHFmMnxyKmgtJEBjSFQ0MyNuZCV4KH1TanQ2ZTBNeXFLMDd1VEl7TVZEQ0E0UFJKcihECitXYl4wY0BzRiZFUypITlkpTkItNSl6MFh1dF5AaGNQc3ctV2R9WVR2KVVwcig9VFNsanBNX1VSfko4eFA3WW9wbWN5TUx1WiEzNW0tS3BoCitaNkYoeTBHUjx2dExtQF57ZHxZJnhOT1lvQVlIc1hkWEU0ZUtWRGZLPVY/KFNtKFk8KlY2KVE9ODBjM1F6cX5vNW9gPEZ2aDFKPHxqPUxHCispeT5WY2M1NzJ7Q3tQXlQmVTN3VVZQT1BzQk9DcF5uWUJsI1omVlBCVz4rSl5YbUJNNVF6e2N+UiZVRT5RIVNiM2dxakhmPFExcUxeekJACiteUFBIUGsmMSo7TkN5NDdBQiloI3tfUi0yfGtte25mZlpvRTh0ZDghTFBAZTg5O2FoYmE8cGZzZHdlSFc/KWlAUW9eJVkwZSNYeVhkTjhsCismVVdsVUc4TzxJWnUlcn4pTzNneShyU0JQdWVoMnFsZz9LUX5wTyFCJG55TEVKcCZIcUpYMVZ5YTVIMEk/KHk8bGdgRUxVLXAmYUt2YU80Cit1O3p4ajB+Z1hPOWxIcFkoN15ZVTsjZ1F8TFJ5KnBSS013bzlBTn5PUjBRKmRXX1FKJGkoNCYkRTx2dzFKTUhpYihgSUlkd3l8bkhVY1U0CitefXoreWF+Ry02PyhxQWtQb3BsZWtEa2JXI0ZLUjBWRit0QVIjTV4zIVRZKmAmbyRqe2J7RnYlLVBudTZtamBjO0ZZNVlyPikqYlcmXkcmCityWSRxVlVCZHFGbjBkaG9qMXJvOVhVb0lDVSNxRGpKemtUeHRiYiFNYkJiPXt1bHh1fFpeckhqKVAxczkrIXlsKGVTT19SMnlpKXMtVDg2Cis+bVlQSXp2O1UpYkBJNzZfd3lWQ2xSeU8zSXxAelV2UzFqYSYlVUtQbndYbz4pKVohKjtaQEAmLWMrSj9xJnl6Ynh7TlQ1Q3NZcXdIK2hFCisxZGNCNVUzSG95UWBHMFBJR2s9dXkhMDdnPkxkUDdXZWpmZzN+fGk2OXJuTzNFR1prfnVtJmVuSHJEN0lBZmpreyQ5WV59UzRnQ3UjMiojCitydXZzSS1PLVkja1Z2NXZxWio3enY7XndffkNISG16VGlxVlp6M0AoYmNyVHtpYU1SI3R1aU5NaUN4JiEpVXJLbkB5dGBCaUx9WnlkSHpaCisrOXhZVjR6cEc4LVZTUyYtVyFDKGY9ZWsjeT95PWNAVF5BYnBFTjMrbjEqT0N4fTR7NiNVc18zMWZFPzdwNVp2fDBqQkVyJT10fnpLbzIoCitse2YhKnk4RUJBYjNNMmF0bElWM2xPfU9Mej15TjxAQ055T0VxPkFUKlopeGckYm9CQz1fUWpvaXhRa0xAJjVDVXkxV1VzRDxCfmdlTmxQCitsaWcxfXM7O0xhMWZBUFhCSjAkQFI0VXRJOCFVOWM3fXVvTiZZRjZDZllpIy1OTjtEY092WGN0QilXTWt2dntPIT87RDU0VU5jMSk+czZHCis9RDF4MWdealV5e2pedFJOVFh1WEtnb0shc08rZ30rX0Fta0w5dGYtP0Y3OSZnVk00XztfSUJEKypmM29YQ05WMnszZGB8ai1NOyFxKUFtCisxS2pBUVN8V3I7ZDktelJnQDcteyNxdHp1YCVrcnN1NiklMnFIMm9eNXBfYilgO3h2SFh4I2spYC1BN3RVeUhTb0VuSmlKUE1CcEc1eyFQCitBaE5SP01ubn1nNVpNezdLIW9kait0Tis1Nm03NVI/X3lIX2RSVTthPWo4eC1DOWRedUMjI1RvUEpuWj05KTVXOHtGS2JCYEBveTMlazhICitmTHJGSllxU2lsNERsK1pnbUtCO3hDT0tOPHlTO0RoPnY7fmkwaF92OSZMZD91ezNoWFBXMTN0N0FKNGtMQEw4fHhNKykwTW56SGh1bC1fCitxYm8jJU41VFBOJWohdXJ2czZxQmFEVTdfX25pK1JWWSZAeFVJYGhsdi1XKlF1djBsYG5ZVU5jbXJOVUNMI01kZ1AqTSgxUG5Bbko8N3hzCis1MXglVSV4QF9tajhCajY2dD5pMk9ROHc7e0AxO2NuU1RGOV8rJkdARXV3TWBiKkxSdTw3O19NYDNMcDVGZWNkbXJgfEFGWkFZcmIkRDgxCitePXwkZkd1dnN5YXpGTWlgKGk3UGJjVndqVSpqJXB4QSZyXmk3VnxnKSR3MzZzQjQmUVBeXnpfSk4tJllnLUM1Jjt2bm5wNUZ7cTJUTD9wCitLXzRlcU1WREEldWtOZTFfXkEpdHFoS2ZRJTZ4UjxhKzBQYkVZYUNpci14QEhvZ0h9Y3c1S2JJTiR6akIhNVRJPl4meHY8YmQ8cGNvS0FsCit0TDRgX25KMUlYQz18JCRHVVdeSyU5c0xWP3BXP0RFOyV0XzVuVUh7QGhDUjAlS200I0NKJDBUdipheiZWLVNSXlU8VCg2amshcl5DaHkkCis0Nk4hYmlVaVQkVTI1cE1Ud0VoO3E4KjBpYzZSbkwrOyhXSjFVZWRuUTQ1e3UtJm0jfUA4Tl9JbVNXMGBzLV4yPnRGRjlpeG9HSj5yZnAwCitUaGclTExhKHBISWVPZHw0X2ZYdEBDSjA7SyEme3sxZSkqZEYkSityeG50P1dJeClBX2NhcUZxQEl8TmFBS0RLdUdjZ1lSZUtkK1FyNH5BCitVYzRCOUA3eWZANCQhKiUtdUFkIzEtaWpmRURUIT0+KC05Zm01JDlsOzhBdVY1SVBxPHhhd05HKWB5UnBxUXJgaXl+UXx0Uk0lbzE2V1NzCitvPTRyPyQ0fWZ8c3xCK1kwcXA8PE1OZ3lxX2FpQ2U1THJvRCNsNDtUY18rR09tZ3pAWHVjdyUhRVQwfmI4KikwSXh9aH5XNUJpSSNuQnlZCitMcTh+eG1mQmQ4d2hrOSsqRTNleEB3RnQhVDgoYndPMGl3IWNHPmlTKXYwLWdTQDg3P1YtaHRHZFVXNTI1R19YfHk2PCk9ayh8bFJiUThZCit+UDQySmh9dHo8WSpYa3NWJTUqUXclY1BjMG1oNjloXkBRS1Bgbkp3YlVyKjd2TW4yUzgoMmxFYU1EekxFKVl5NlFDOy1aTGV5UypqYChLCit2NDlBazlGZ3RoemVASk5pJGMoMStpQipLPCgmQGtmKH5te3BqTVN7bnJPazRaZUFqMyFyfiVIPygwOVdPNXBQNjJPIyZoYTErUGZmMHAyCiteSkU1ZXgyWSohY2RESTJQK3N9VUwpWkh5I2ZJJUVWU3JlRHoxd0Y3JFU9P2pwcFZtMTw/JHEhTy0qNE85ZHBZcU1Na15nTDhPQWI2VWJzCitDbmM9ZTM3WEFDQ0BfYCQ1fmQkWT0oI1JZaE48dy12M3RKRT0kUHspZDRKS1A1I1c5Yk1ocmlsV3paSSl1UiQ9OSVDcz59TDAyd2Q+Ql87Cis5WT1malNEfEhTQTZ2X31wMXEyXm9yOEFJMnA7eEZ8Z0xEPCRCbkJGfGsqZVdfRXAzP3pFYFlNYDNfWTx+dj8/ZEY4UyFGI2ZiLUlJRDBjCitZaD1gKX5GITB5OHllRSoyKy02YF8kQGVAXktgMXJ9KjxLZ2JkOUBFY1ZTe2JpeVdnS29yc01QNkgtKT56PElBN2VOJjxoZSh3PTU+RzhKCiszazJFQkVuOyglayhQeDlUOClgNytyO3E7Pj9nayZNKCZmVElgeChXUj1GbVVRbWZYVik4P1BOMEZiQWhUaXhVK3F+KmItbiQ0bFllcGxvCitGVzNjRShIX14hcWkydk9sKW9kMUJRSTRtPCYqMz5KRmRXQU1XZnZ2ZV5PaCVwOHlKRjczS2hBRjYkX28/PjR+cnk/ZmNxRGpBPnk/clQxCitTd21wKjV3PUxyYExMQEdXdl5xe0VySChtVlIzeEUmWmtgXitlPWwzaXdzfn52cGxZRHVzZiU3Ul41OE0ydjY3KDxhSlBqSkMhWDR3cF9GCitVbDY0a2YhczQyQ1lJc2k5KXR1RGJgSE1BazR0bHkrNk4wK0hBQlVuakdndCR5TXghYzUhNWVtWWRmbn1jJCowY3tVe21TfEJrUEtaTjQ/CitwJC0jazBrYjtrQ2E3ZXtDNiZENEpMezNyY3BWIXRfaGQ4KnpsSXo0ekwqcyl6aVVQVD57clRiRDMtO3YoMD5mUEF5UHxeUHZuUmlnaXVVCituSHgzZ1dyKGhVKTBIekYycz9ZUWZgRzNtJmZvazVAaCh1YlN8OSlxPS1xM20mSH1jJF45emY0Z2BPY3ZMMUheaGlPeEZ5NVNjY3g7R1RzCitIbXhufEFlIyNFQ0FhKyooblgoUmhpZ1BJODs9LVVFRi0ofDckTSN3cSQ4dmAzS0M/dkp6b1A+JUV7VHF1O3x2JWAyRiZmblY2OVVOMHdOCitDQEp1Sys8UiYzd2NxMGgpK0ZLbHBTMTQrRk5ReHBVJk9gLUBuUWsxdjVVWlpVSjA5WCtRUDk1MGF1b31uUlBtWWY4PVNfI1dGRDdsWCtaCit7c3wyJXZMKit6TDVCc3dpU2NHO2k4UiNLRy14MDJUX0B6U2VpWGtYYUhHbyUxbUszMEgpZWI1K1J0Wi1VZ0ZweEB4YFE+ckpoV2dmR3Z0CitDZUw4Tnt1QyRSdmA9bE0xMklfUStMRjZqN2tvWCU8WEN2fDB6SndiN3UySFFBQ0AkcV9IQE4hVEdCJD5tTSNOdEFrQXhRKDI/Um9rc1FJCityfk4lYF5AOHQ9V0BET15VR0dKbm8wcml8Vzx7WWtZNiZNfWw8KGJQeTxyNDtnQigoPm5zTFJKfUlmaG8+Kl5pbSRRTHdFenk3VSlCSV84CispKDhidksqSm1lPWs4JnlDWkNKKD96ZkFZXnZMRjQlKGR0VFRQXjdMazdodGdaMFQyJEc8TkB2MXpaIXtUTG5SSF48NTZXUkNSTldwaVNVCitJPXRNVDw2OW5SRl5mWHlgRH5naj9XIXs8UyFud3NlMnl4Vk1DRGtqdGs1UDtQQ01yRGtGc0NseiVjZ2NPZTZyfTNFRVVATDcyWWFfQShsCit3Kj9jdFdtZFg0UTZ4c01YQUBBP1I1ZFZseHRBamxDZmVtcEZ0Pm1ZcHZscGkpJEdfTXJKWnk+Yl9UM3IyanNDXklwMk1EY3A/K01QeSorCit0ZSpaY1BlWjBNc1l2fFlzfDk+e2ljRyRmdm1vKmtWV29jKz5xNm1kZkRVOzdNYGlfe3U3XmxFVTRvez4yXyQ5M3gtcTdNRyMkJiszXjc/CitYS2tDTnZVODZIdXshNHpQXiFCeVJHKztTcHJkUlZKe21FKDJBaVNQZyhCTlAlRnRTLTt8bmRWM2wlT1pEak1JbFV6IzhYYXwmV2JYc0xkCitLeGQjKGwkPTJuPFU4O3wxXzE/KmtaN1hHUmEtdWUqeWU+ZXllSWBOaXJvZjw1bTFRQSVjWTdsNypNP0A1JGM0T1NCWF5PbXhlbllUU1VfCitKcz9wOHNlMU4leDxDTTlfYDdSdUdpZEErYkdCWD8yTyRqRWF4X2s0WjtqRFNiJnBQQyRfbXo0WkdxcT9gNFNgKjd6MDJocD5Je1pOYVNFCitNTn4qfn44O3hZXzVma0pMI0FuI1hOXjI4R016ZklsP09tMnpwTCZYfTVgQ3Jaa3swZ0o2LSQxc3ZqZF9FQU09Ynd3UGBKWjV3SnoyTURMCitVT1lBIVNOIz95QjNRJitTM281M248eU9gaEolTlYzRyVYWCtiaSpuIUF7Vm1zdWMka3JsMFlYdVJ6RnVoM0Ykck9zUkxQez82fFdNZnkyCityZDVgb3A5NXJwVWtDY0lDMCVtbHtufjRiU3RgKTI/OTtyQyFzQ0ElNkMwWDZjfkFuRndONVRtLStgRk9CQlpTQkh9Yz9sbkk0ZG0pJkpUCishUUpWX2RiJT0kMVl+RHdBOHlEMlE2Zk9RK25nZnE8OHFeT2xAY09kJmlnUXk7ezA5YCMxa1NQc2lULUNodkZtISY8eTIrSUEycTQqMyFfCis3eHB2UCFmZU9hRHlaWEJYRnJTJms0IU88X3hTYlVaV2woP2hvditmOUZRVX45dlUxbzJqcm9uKzMjSCtrZ3diWHN1U2JvYG1Jd2x7KGJpCis9PF8ycDA7WnAtSj89VWxLa0xIeF5MTUVZbVdoVTJuc3RYN1ZwOGI5SU1XVUR0VjBHdXd3P0k3KTBwZkE7NzdUWFNXdHg2Rj1LMj9iQioxCityTnNYOG5rS1EjRX1NbD88NHZKVjtpaXk/Rkk0JUswWm9nVkdyOGRaTH0qTUxDUjVPRXgkYmxRV0I+UFdlNUBPQ1l0RldkWXs3QkR6fSVNCitRb0d1YjFzV1B2IVVALVM3THhpeC1ENGp9STttVWohV344JGE3TWZZJTRfTkFJMjtVN1goeWZgITU4XzJLSyRAIXtWTmtNOU8jcj1EfjRsCitQankzeUtOcUp7ZVpfYGNtal9sMktaMDYqWCFBJUg1IVRXdmgoWkMhfCM2RzlYfFlaWFNqcF5iKXA5Yj1tK0dFenE5LTYhfCVUOVNvVCFDCis7U0UzeERzaV5Eb2RLfFdfbW9XVWl+SUhXNH0wNFdZZEw+MkkoendpYDJGTUVzRWx0KkpiQWZabUs5MT0oYjQob19TMmAyenV6OX1MI21oCitMZk5tVSFkd251NzwxXkg+JW1vYmtBciM0QzktfWk0cFEpfVBqc3ZtMUJrdnxMdChFRiVpdl43XlJqTSYrLXcleSMjR3FaO09Va319PiZ6CitaKillclc/Mzh1Tmh6ZChhaz9ERUpgSDNjaDF1TSFpRUooJVdGOSkwQmlBITsjUj9nYjg/Qnt3WWZuQEZYc3tAI2koam0+fmAtTGwkfHdaCitqT01gWUU1dygxXihVVWk3MFM2YX5nenV+VU8/PXhvZmFfQSRVXjwta0Zld181cVFMWSpXezRXODVSSVB5RDQtP2laQER6OE0xRiVnKThlCisyeH5lNmdKNkE1Tn5oZFZwXl5zenlQbHtQbSM+QmRTfGBxNVdgPUtwdih6VGdtcFB6bVJIXjBua3slb1ZsQzZ0STNNbXR6dXA0RzU4bipXCisqZD45NEszdEowc243YmJfdT1qfjhtZHZMbkJqZldAdjtnNCFkWlI4ZW1waz9UQWQ0Jm9hWDV5dHcxLU4jQVQpS0NYbEl+S3xjPXchZlA9CitEeWdBPjs+NWYoTjxOUW1fR3BeJj9zNTgmPVB1aWl2XkZiJWlPajtZWDlGWS1ZTyM9RGtrcEB7cSFzfT1SWCVIR0ZLPkJsQGYrfUJwcVRfCitvWXpsQCNBM2NrND97bDxJSVp6OW89YDsoKUFGfDNydnotcDd3IW42R1JPSCVzbmhscy00YDFJaVhYU0RPPlFhLSV+MGU+eEUkWlp2e20rCis8TDFaWklwd3gxaWAyUkl4O0ViQSVfUTVVaUEpdjxjQWBvQiooRGVTUF85bndTeilOYz9lajNgNSpEdylRSWlsdz9kRGh8fU58ezZwcF5fCitVUyt4aXN6TkdeP1RmNk00aipNX0teM34haXV3b1MrU14oTklJbExARjM4SVR6YGBreihXbGZCJWNzYVV0Mkx4RGZ+a2EoP3t4Wjk/djNpCis3X3syLV9GOClXI0hLNSV7aCFlejg+PXNLeTZfdS0zRE9NdGRiUEh2K29VJUx0UVRuV3NvaUZpJmpTSGRNNTd4RURRdlZ4Q2BKWXtWR3oyCispZFgjO1hTS344JF44WWkwYl57QXNsV00odXQ3Slk4dGxCZCs0JWhQMDdHSmFrSzFlMWo7ZkdEP2omY19oLWMmYk5DZG5yZSZmeGp9akB7Cit+Y1FuZlQkaypoRkJBaiZmamZmKXd+KVBNM0Y5O2VmM2xXZDAwJl5iRUdYfnl+RXpVdzJ7OyskZ0Y/T1dvVEombGYmcDY5ViolfWl+QTU1CitsVTsxVXlINHJKd25OZDlLLSF2NUxtOWJDNXUkP0hLRyVZdyh9TyQjYyNVT2dBWj9ZJTx0dHNGP0U0JXI4eXZzZ1A8Q2s7ZkYoNSMqck5HCit7WD1fZiluayQ+PE5FcWZHe0RqPWotOT0lVnZwRjh1MEROUnFhRWRLNWdzUmtnLVFBQ1F6RGdec09Scm9fYGhMcSNPZjB4c3NiI3tzQzFSCitMSEwrajdgaHI7ej8leX03QEwwY3V+SlAxR3xucmdlNUUkKCVrbjA5aj9DV1pRbUNuRkhFVXtoaE5wODl7U2YqM21OYGhQPUpSZlRhelRyCit3KEh2P2N3Sl90KXc2YjJGSGRybl87WDw3Pjh7Klk4dUhzSUJ0NHV7TCF1ZDV7UEorWj5BVSRQMDYhcClibHZOaUpyQmg9WUJCLXlURDR7CiswZzh2MGFSeWwzJH5KQ2MjNVl8dUB5SU9DaDVlQkUjQCVDcmRUWXZAVkl3dHB5OW5NJj1RWFJtNFVUKVJReilOTXhBUys4XlMlTGk4T2BTCisxQlBHVmxleWxpSCtiQ1VsZm1IbDN4WioxYVJPPS1mRihpXnV+bCtBOThhZjIrNnBYajdmMT9iJDw2cFQwRjZVPElkRGhpWH50XmorYGhBCit5fm4hKmpnezw1dWF9I1NMRnY3a2ZDREJyKUBAY1pKXjU4WjElZylrM0Ilb3soa2xTdW43WDUqfF8pPDdoaHA/M1RtSz0kUEEqPWchYigzCit5SSkwUj16VCsrIXRoOEBTY3V3MDFsQjNgdXJGaSo+Zkc+bUIoRzh+Kz5vbjR3WnYwJlJYdlZ3XjVSb208ViZjLWNPSHl6aDlDO28kNERVCitETEkrVUlSRnhUM3pBbiZSWDU9aGo+N3pZN19XJVpBVnArRnJgcSN3OGl+PWAwT01wZEM8ZXtjRl9LTVp2eCFTQz1NI0xTKktSeTtTSkNMCit0RnohflU8SXVaa2I8VnczOVZyQ3hNJn5LT1V7b185XipxOF4jb3whTGZFJlAzI0pHbERmJV8zZFdhQ1grUjBReiFUdXgwQ0BaVmxHKld5CitObXdDQWVEXkBsREhhcjY/ITNVcVJLaVpWUHx9cVcyYytxYmMrTmtjTDVub2Vabm1IVV9vNztUdUVyYHtvXykmWjRsYihie3wlO3J5VU0yCitCdW9iK0ltSyNabVhGcV56fXhDJXsmWENmIWJeQUN5ISUqNy1Yak9KbE8+VUNRNiNmYzN2TWF2Xk5yP3c2QmN5LVZnPkYqUEBCcUIzZ1ZaCitGLSQzWUhqYGpzWXpmVSgxVW1CTXFiJXIxZDRTZ2dZeEJENzJyKSoyTkp+MDlIclh8OVBwVl9FWkdCRnM9b3pQQChCUiFaVDA4NzRoaiZZCislJFduR05SbmZofXpMS3J5bXpPMl9sSG1nQV5XSzFBfDZId3A5ZF4mNChCPzs5PzNjM1BfP3x3PmdoYjVRcXojUXJTV0I7OGdTTCtNNnAxCitsP0cpPW11MUtNQEdVYHNCS0E8Vjw/TnMtSEQ9JHl8JiolNFktelc1JFMyKiREdzAxO0h+KSZnc0gmZC1jLShRaT5BRmhgdnYwQFdHTT1SCit5WWNON1liKzxwfVVuN0pARmhLSmBfRmRXdmFFMThje3VpemJlYGhCVz5fczYrYll6KS16PztMTlQpSXU8QiVucEtlPllCfnc5JGhROUpkCitiKjFpVFNqPj16PE1adHJ7T19qMnEzREtFOE95PlZmJUNkRE1AeHtRO2RfNUEmelckeFJfa3A2Y3p9fUo2VThXJVl0K3l2NXd4czVTdyFCCitVVVFKQHkoPX5Ea3FEZX5DP040MSlNQXhPc3ZNM2gpVEZ6JXtidHYoQmdTbThzUComYTIzdCpmaXUtNnp3Q3hPckRpeyNQeGF4SjliKHpLCisqZnBgTGxEZG4teU1iJjxFNGI1JVZNZUlKXzVyPHM+fEt0bjNEKTtydV8rV0Zian4pO2w4LSMkRHtxMmVRZm5lVW42MWw+O3RtZDctNH5ECiteVmRmJV92dFJicXgofH4hcnAkKEprO3ohKz1IS3o7dT1nKlhiNTAzSCpQY35YNW51flNxVmNoMk40Vj5QWj9nb31iJjhSdlN6VG5zajJuCis8NGRVd1lfTT09T2ZfbTQpUjR1WihIUUAjTDl9NFNpRCNmMVorUDtSIWtUJUpPTnEmVVo2KXVTPjR8KkIzPWZZMjNjbUMtPSo2cWBFIShJCis8JSM/d3lDVFZPcCg2ZXA0dSRObjhLUzE+OC1ZYk1pTWtXKHR6eW5CVS1DPnNZZXVncndTQkwpRGdUem5edDhncztOfiNebDtFez9kU1J8CitwUGkreGNRVmk+cmo5M29DQWU4eyNRMTYpdWA3TmIrS2JJeSgkWk80M0xEPHRaUUswMW85JnVnUUN2bVdkMDdSSUc+Q1NiZ0RaMXBCfn1aCitiPFo9aUF3bkVTNnl1bUhBRHhLcWJtM1d4cENHTXxxbWh2S2A5UjJtd2FNWGhUJWJiZ3xMQ2MwXiohP2N1MytTelRaNEooLUFMZ3dWcF9wCislKjhLREskKSRHSC0lP2hVSCtzZDlhXjZwaUtZezV6KkdBTUlgPnNhRyg+MntMP09RSUxSRXNzdiRpRiZ5I0RiTnRiMEdKTi1nKGp2VmRJCituPWJjNGRxMT1WX0xodzcpJEpQKEokZE52SH1lLSRNMzY9ak0+R0tYJGdRVCkqbWJUOyt2SGlrVnRuclhFYkFMKSRvOE1BNz9lb1VzMGp3Cit1cElCRi1ISEJZc0ZDUW41dU5Cd1R4VktoaTNhISptRXR8TDw0Uz8tMCl6Y1MtXkg4VGwyaG1aNDtmUUdGY1JYdm0oSilQTSt2cTgrTTRhCispMjZmUF4rJj5LQnxJdjM4Nmg3SCk3V3tMMW4lRns7RV8hMEVxXkMwVUpiT0NCV25YMyFTUHVVNiEyfH5KX2tZXy1ad09eengyJkBUUStOCittYzstLTZ2YSZGeDZuVHVgVnh4KnBkU2JicEpNSXJucSh+RjlVbUdpbGp8Ml9GXyt+R2xPPms+VXQ7YlNjdWVyI2RxIXNAOyt+Rj58SG5PCishT248Vj5ySVhGSyZ7Q1JZS2M9N0czX24qQCpmWGN8PyFacSo+Nzs2bTQ1WkJMantIMDVzLVJUK0h2JD0tYFZMeUwrPTFDb0ZDPD9GKnVVCislLTxTekQzZHUhZikhPk9+T1JgbkA/a2Q5aC1vMEF0K19GKHQxSjM7UU8yRktjZWEwWXNleWMzaHomRDFpQkRaXitFQy1ue2BjZjxUYTFaCitBSFghRGp1YShRdXVlakNefF8rUVVFI1JxQ3hkQFFzQFNeJH5HcVYyUWY1JVUtbFQ+RXlidDkobmBCRkhSPDRTMVJYPygmbzE0UVBsQ2E2Cis+aXtxcTMqT1ZvQGdZVzlneFFNYyl7ISExRU1oNWZucEFOKkZFUCNCNjMwP3VadExzTzQ4Q1VeV2ZQO2NzRi1+eVg2V0huQT9YPG40cDxwCitkP3FeQkdQYGthcFFQK01+Y0tIVU1AantlUGM+Jk4+PHotMCtANmtqZXwyNXVkQUMxYStFKlpERj5WVWF9ZE5EPHZ4MSEmLWhzc0ImOTY9Cis3dHB5ITIoVlh2UyVHMy1NQ3JwZjIpXyNiKEpyU047MjtyQnA2SFl7SzwhXkQ2Ozd4OTtvIzA/PnckdTFCQ1ZXZkgqYWpfOH1pY3JON0M4Cis0Uz9VIT4qXjRjR3RvSX5gfTA4XjxkKTJATHBGZENIV1FGTjY+KyVTMDNAP0BoLXQ8Zyo3Y2FPZ3x4NSN7el9gZlJqej9CcWAjSjxfRkY5CitNSmdeT1M9alhLOyZkTCoraE0raHw7TkRhdXpCeyFPNlglVm5NTVpuX25zYHUhQSR3bnE3RjRRKEl5SFM9PUJmRXReJEdNXlc0ez5kNSszCitGKEI8NGEke2QqRnRXemN6cndGKm4hSE9EZTlCaGprTk1JbVNQITZJYmB+bmpMK0JTKUU1KyNNclY0biRGVzlmeHVaMyRXU2NfZ3JFeFZkCitGdGVZYz42bCFvamM3ZFlndEQodnhhY3xoRUU2YXtWRlU7Qnd3USF+JlBLPkE4bVdNSiRZMGNGZ3toPytDME58aGhybipMXjQ2fndgNH57CithVTA1NE4haXxwdjZgSSpGNnJSYiFYe0JBMXNJZVNONG4wXmp3XzV0aCFBR0kwZV5raD9vKHh8fXYjeD5nLVQhM0MrYVhlVG1QPHBMeXlRCis8QjsyND9hemMmWUdnTHJOelhHWkN7WV9IX2E+N2VRbWVTWVQ5ajdnX2JaWiM3fnVWVHwkWSVSa0RXP3VVRDJiZ3d8ZSQtVGBsS1Q+ZEpMCitTIV9lRXFecUVaLX5XYylZbGB9UHVXc25ve3xEQ2w8VGl1dmwxMiRxXndpVmFPOXE3JTkoc0k1TyFFMDtadTRpRUVDYiFvO3wtI1kkbj5FCitqVXAwO1p6dWxfSzJCTHF5OzdIai0lZzJ7USkxP29rbn05TmdtMGhNU3pqV1BiMzB7M0tHPSZhUFZFI1QoWk9ob0JJPypoXmVXdTUzQyEoCit6Sig0dnVjS2h5Pm5GWSNkc2J0VVF5QDZzUnU8WTUpUitzdj5yOEg2IU4kJX1PUkVTakdJMkVPVi14R1F0alRgIVpicjBYb2ElZD1sNX13CitrSFdlajZNNChnNWFjTHt+SXVYOFokdDZVZj0peG16SlQqOCtiaD9Qaz5pNUUkeSFPQ0s2NFIrTGUlSzFvUDs5VmIrenwhRDNRT25TfFVkCitLVnhWZCVfRVl8WGJKU1FzOHI4YUNNJHgoR0lxYWwlJHc+eFN5Kz4/QG1AV3lgTkBxKXptPHZYT2QmYX5pcHVJO2AkUEZiPH07OHlZaHZvCitRNiZ7Ri1oZm1pPUBCX0lEO0NLTSp8LV5sdyVXQE5NeipXdjxMeEJnSXJjS2hMMEZLeih9TEhZNlNFYWdgIzwkKTdAPnkkV3lvQ3dTV09GCitMV2AwVVlJWipNP00xMz8oTk53eyZeX2okUH5hO1llQXNkfWt7UGpQLUs3NXpwfUVzKChCP04hQ2RQKDByIXdMfGtkcjFHb0hNNjdIUzNCCithdz4hX1ZkRTdLSWBpKFBkai1DbEhrZXt3O0d7MSVAKTwtRlg0a3lyU0w4bXJ8cWM+UzJ2RDc/bDlhMXFrT28mdnpjRD5WYHF6WGptakx1Cithbz9Oe2dUenxlZW5tRWIxNj9jQDB3biFfZDRvZjlLZTZQKmMlQDI0KnBsSHVCdl9WM1BiUjJmXlBhSjdzOSM7LVRHc208c2pESiEtNFR9CityTSUoNmJ+RjMxN1lWR0QpYmZsQlEwbDx0PTFAM34tb3crWmRsVGl3QDQ4QTA2b2xzZTZYNGFEPX1yey1YbG9YQTtpYntNNUR8JHY5e2JhCitqemVCRWtsbHhuOXh7JEo+U1VFdCErTiklZm5wKUgqOykzXyM5fS1IN1pgSTN8X188YHZ5aTF7JGMyS2NvQnAkcktpPWNlPno2VmFrRkomCit3KzI4OGllQUdaaHQjRHZhQEh3JWtabi1HVFo9P09pMWJHJXtmbSkzJCpMckc3dkUrbm1PaTk5NGM4Y3JHNUEwT2dFVSQ8eE1ufDFyYllGCitUV2llXm95LUFuTyYwSTY8Jl5nfXppRjdGZzhrSHlLRFVLKEUkJWk8RDMxeVdHUU1zZ2ZMR3RkMzw/PD1obig8dzFtX3cjUXYxSDs7U0UjCis7PntzN1g4NGsqLSQlRXNmOVZtKnxlJDZvVWMhZUJLfHlqYkVYZUd3SzZCcnc3T1BzXjBAXi1odjVsPE09UzJIWG94MCNKQVk5Yj1geTRRCit7KFAjJmtaWCY3Xl5NVE00N2cmOSFtbCY4eGA5Sn5oTTA/Q0NgOVM0UT1JQj5BMSFsYUs+KFB9YmFCWkFxK05gI05HN0w7TnFZTCREdThYCit2Z0lvKWU3YHY0am5MaHYofjFJQlc8TytVUTBaYVpiRk9lazFWSSg/byVTZ3I8U2VVNkw1bkBFSWlHe0JBQmxYKkJwdk5sMjs2S3F2YEJGCitlQS1KUXdLLWRLXnVhYXBOPVVlMGxHPmlGV0ZQaXEraj9fJGAxMHNJPCQ9PkJgNG1qYkJXKFdxVlM3amteZ3ozSSsjd1dYRFlwaiZZcUJ3CitIYjAzaUhhLXA4Iz0rSXRZbWFgT3NnKiVyMypzWCU1dWlwZjg4KXdTNzM3I0F3KGhfZkdQOD0hP2wwNkduWWliYSZCTVBka0VUK0FUZypXCitwODR+PDRHIUtwU20oJT84RFBiQGgleHZ3Jik+Nz9XaExfcyNee3BmPT1jJGgreVRzdm47UmZ8TygqZjQrPzE2e1BtcDQ2JT4yV2RPSytCCitnXktlMWZldGM+X2JvZmM0N0g/cFIobkxhWj57VTh7IUxFTCpGTF8xT2lLKyV6KHI7ZVBMRiRQOEd7M2d6XzAwY2cqTERUU14qQlh0aSp2CitoU082ZVFScT12I0UhPkRfZ1FfJitiXjs5Jk9fIWJwMSlLazQjJUQqPzVZUExYR0ktJDhEeW5rRkpfLU1PP2MjRXojSm51bG8wSzUwKDVaCit4WW1xbzBRISo1T191anpUVVghdk5jc05rMkk9MUZfUU5OU0Q0bEhRLXAtVCEqQnh3P1ZUOTV5NjRaeH16aVNEeShhITRAQGghK2wpMntxCismaXZALUhmKXVsST4reipKYmQ1SHJmfWA+MWN0RXZmRyV1ITJDJV41ZiE4REhqJGNWVjAkO0N7Ozx6MlQ/Y3Q2O1c+VG5HcEdTKSRyQndNCitkRGljK3Nkdn12Ky1rWXZOK0l8dDVSYXwzYmhCRGdjVXJra0ttSyZjRGlwKjQydiM/OzE9Iz92KWF8TVRDRDhBMDNuSSlsRnN7YHowWChDCitjSTFVYXF4NCs1aGN4V2AwTEpgbEVQbyh4IWhHR3VveUlsJUJsKGZjeG9NLXZnckdVNXR6WF9FJXFsdkUpY3pNQklfcHY9V2R6VHx3QlRuCitnKGhpZW1AdilAOXlrOHR3I2VXIUlxQ2heZz88bHMkc0FJTzY1QldWI2NUQl82Rjh5cEVYeSZESj59UU1kR1RtQEtGKjliQjZ8NTFhdV9hCitFOXF1eUV5Oyk/dHI1Xj9GSj14PDZqQ1d5PUo/aENNP3BLdz14U1Ahe0czJCNvTEdmMk1UMk53PFAjaj9aamJadWZPO0pea2QwSDQkSzFPCit4U2ppYSNUVVE+V1JSU0V7KEo2eVE2Uk5LSEhmYSVtZlZvNT8/Z2RoKHgzPDQ/a3ptVHgoemlQXjZ4VGBwJjV8U1cpdVhIWTByPmVpbldiCis0fjxaJENidT8reUtQNHFlTT48O35AYFpZNVkoNjFiRHNSQTk3Wn12RVFaaFdFc2EtWVJLUndRSkxWU1RlbXBgUzRhb3BiVW9XNnlzaEpoCit3dHxYaXQpNEkhe1VwR2hMIzZtcVk0YSlvSVJvLTJnZEd1OGhzcWhzOSZEWiZPanRwOFdHbG8xbFZ6dTBmY1ZleWN1blZiM3pVJE9pRXpSCittMnw7c2tkQTN6WCNGUUtLPVZed3E9MiFUZm08RXJ8cVQjKXxnOTZYcExDfT9wSVFKPVk0PkRtcGlQOE0lR0JBRDd7RX4rT3xSUlJWVHVqCiteTlE1KSE5RzZWUUdDR25DQ3JXSzljOX09TUtDVT1vWXxhciR2NSNBUDghd2BRdmd+Mz5HV1dsVGxQVUNoWllmSG1Ne1R2TXMtQmBgV255Cis3NFNVamhgKmUtTCpLWDdAViRGTVhARUI5dSRQOFFKMH4hNXErXlBkc3NJQG4xLUk/Yjc4bX5OfEtMS3NkQE1WPHsqWCRrMXgySXg1NENZCit2dEVuZD1RVDNHK3k0Qko3eDFiYGhneWBMUmZTT2ZkWmVsMChUZkNkdSljSEghU0hnSnAtSHAhUCspeTFSKmg7TTVYUDh6X0RwWEFTRU1wCit+aURzKzlEbztpSVF9IV5jbFBTfH5ePF9BaEJsUkJvZFlORStBfiQ1WEFfbkBJNU9WVzAlVktPQ0xxbTAoQDVpbnBAfGl1PWJsSnJnVTV6CitwQyFmNHB3e20oSnNVdXMmeUlZXllEcE5XQGVXZUtHX0BZSzYxKjRRPnJlc2ApRl9ZJjtfS3RRRlc8QFBkRSM9UmpPOFB1UGokbmQ/JWkhCitWQGJ8RWVFaSk8PiVITUJydj9raz9DbkNpUmx+Sig+Z18meHl0bilQPlV1TWAtdUtfX0o+MzAlV2ooX0tSZ0RLIStrNSEleU5gWkJhWFFyCituQTNfX0M5dmNOfjFGZkl8dWxGN3xQPkkxY1BlSkpWK2pyemBCbkNrKGhPazh1STJneil3YD4lYlk+VEZ0dFJ0RG43K143LVF9UFI3YjYzCitfO0xfSyU9KFNoPDRNIXtRQWNia1duRzRiTiRXZ1ZSMXtzcH4yTSspKDRtN2U2MiQjUmhiMmMjaER2ZWhsS3JJQ0cpZVBKaHd5OEk7ZlJ3Cit4JU0qJWxydG45T3NSZz9hbTlHZGpubGY4QHp+bTBWTWBjfSglRUt8TSR+SDc3dTNaR2khKT1tVVgpUTV5TDlufWY0K2hvJGtZIUd9K3VJCitGPX1LeFIxUUohY0tKUE19ZWNNI3luVHJUVWsqWC1ZbGQqSmtmQ1hxYzE3cDJNO2MzdiQxTVg0WEo4ejREfUlwcV8odSpNYzkoZz4rbjQpCit4UkFtbkFrO31YQXhSUmlLRVMxd1FWWG1sJip5fnlxbzswWFFDeFRVK0BxJXRfYTElISpld1c/PmZETElgeXVrUlojM0F+SyZANEltUiNxCitiUTZyY3h2dVRgRnlyTldDMEpTSm5sTk49UihofWFmTntxM0U9PUR+aEtDcXpHWDE2PnM8T312Wkw1cWBaXnVmYyRgaC1XKnV4eUtIT2hICiswRVpeU3w+S2Z2UTRfKmNEZzF2SEVWKS1FezdCQGBCKDxWU25WQFF9ISk1YHg7JUlgTn18Y1o0bThXS2ViRGR3OWBXanFkWl9LMlE9TDM0Cis1d34mODc4fHpeMCtzcnJSb0FWQ19aUXdNWX5nJW1GaFp4aHRpSE9JLUlgdmlzaWchfDtlUFUqO0o5b3QhfDVMfWtmbFJpayRPaHVPcHhPCit6SisqNmoybEFfWjNpYmxaUWFVJklIPkxNZVdCXkZSTSNFeHM1aTdHZGsxeTN9WjthYGpJUlp1eVEkO3hVRzI8UGVCal5EaERFOUs9KlpnCitnS2BpWmNuX28zcGNARHIleGM0KVFJKitLZDBWSU4tamdUOEw0Kzl5eWh8Tm8hUFp3Y1pfcE9TU0x5SUlEPSV5az0/ZkBjZkBITTlGPD53Citfc0VtY01oMFNQfW5eZVJpKVlJR2B0cT5sfHR4fkJgSHxjeXt3QFl7Xl96d3JzUz95ZWpDUDVZY25qSz1EK2dyN2Iod3NDYXhRP1VpVDs9CitNKkMkUHpAJUdfNkZMUUxBUkVzc0oqJGYxelZxT0A1RHMmNnImYC18XjI9LVM0XiFITEJ5Nn12WGVtZEd7aEhLdk1edWQ7RHpzKHNoQDBnCitEaV4zTkNnLXlLSEM9Z1kobmxnUmBVYWstUztpMyQkK3JUSmp2Q3leNzt5STxHS21mVz4wIW5PRTt5cnY0NGpHO0JnclNlUWI9RFhCaFhgCitIZWlIQzJ0fngxZEdlUmxHfmY2PSg7TWhvUEZDVyV3PW5pWXowZytzKFE0UW1lNCtAZ3t+KF93IylPa1p7RDFxVF56bSRaSkhvcmVvN1pNCitoY1dxclpPPkMtI0ZUUm5tOG94ajg+dGcqai1XJHA4amA+cFo4PnpkTyFmLX0hRk1WTDA3ZlBNVndqdHY1VHYjRkVnZXFLbD5+KXxlSlpoCitYUGpvam9nelhaVVQ3enA0OEh4VlBYTmlzQ1pEI1MhUj5GQHQmTjw2T2JaND5jbDQqOzg1U3x9UDZubU1kMl9Vd3RFYHlMdTRXbiZ4Ryo2Cit0VE4tQ2E8QXU5T2BudVR6fktvSyV5b0ctX0d6KkFZNDQ3Jkc8JShzWnBzOFEtdDBUVzlMUDNnRWxXPj1CV2pMUF8wJXxAOFF1PHtfWkQ4Citzem9WN2BqZ2AkT3AxVWhYMldIUz5ENGp8N19ZRWZgPDM5dVNuZjklU29TaXt+MjN2YG9mZ3pORnl4Zz5wWT9KY3hVVDNDJWN9PHBmdzNPCitmUFQ+UW8laHs4cmgkY2g3RztBUlotSE9pPylLTEReSFZveFBYRDtiSCoheDVEfXQjO19JP25LM2t9ZjN3Yn1Uc318dExqcXs1aU19eXhUCit7LTNEQSpLdnNIKX1DT3s1QyF6bFJyZXE3bjd5O0ZQSjB3fGNUdklIYTZKJFlSXylwNTwkdHZwKjRZT2E2MCZDMXFSKDIrX0NiVzJDZ3IzCiteJDg+NEo5OGMzYnBvdHw9dGhmM2N4OGJEeG58OHxzXlc9dylTV0R5YjNpUU5pbE5NSyFxTjN2TEZTVSRDaFJ2PVQ1dDdfY2lMZVdwTWB+CitSakcyNlVuYWV0QStVOGY9UUxRRnMkWTd4OXcpKHphSihRWG96P1JhbEVYfUc4SWw5Mj17eHtRe2tHaTNVX0lhZV84PTZRVndvJGN6bHpJCitvP25wQTV8T1RWTiY/QlpVJmRFNDl9SzhWS0hBeXhleyZTNHlVc2E1ZSZJVzBLZXxEVjFmQilAbkl4LXZtYW8oOXZQSkkoQCVKcVEqPUI7CiteLWptQmBgRWoyUHRwUlQldSo8ZzM9fCV4VCZYX2tKJkt7Oy1FfTAob0pfPGJiZyZhRnI1OypBTzQ/VHZ5VHNZemgpZ2U9KDclJTc9WXhaCiteQ0whQF9YcypRT2dheXhzc2pwaShILV9FPXwkK1k5UnkwclllYzZvPEFlbD5uKjxYb1p7YnhrOTRDcHtiQnAtfVVgOSFtQ3I5IVF5SHM+CitjPDJQQn12LXhlTFJzTitNQlNTd1ZVSytlcmdGbjYlS0xudEt4Qnhhe1FjPyNLb2diWT0hPHtGT288dU9NSjNQPTdDeT9SYSZfT3lxdCs2CittQGI+SCZsQW0yPTVxXiF8NFl3aGQ0KitaYEJkZiRgM1Q5JXx5aSlYK1Zle253djJoYyFrbE4/dUxNJk1GekA0I3M4blp0QiU4cj5gUkAwCitBIXFAbT9nc3A4Smt4T0srZXJ0RmRsbFo1NWtwclJxU0ooa2BzNWBJMyspUUpXI0tVcnQoKWZkXipKU3NXNWNhaUZ+eWFHXjZMQVZHfmA+CitZUFJGeHA5R0pPY0EkWD9JMT58cXJsP24hc19Xb3V4OXBRJD9PfWA9TCQ8cmp2bj1yMW4+ajsjbkxuZFRyXjl7Qj5eaFo2bkBLaz8yTmotCisyMV9UbG1rdTRDVz5xamF3e24oMkRUTHZtZTZ2ZSZGOEJCV2c/R1ZKeSQ9Kyk/Wn58NSExSkx3RHo1NFlyQjQzYGBUKEo/Mm9vYytKZDA7Citqb0U3bURiRCppQkRBUHMyMDtZNHhgSGolV05ybEg7SUJiflRTUylucXJ2V2s8MlQ8fVFNbWklYThYWXdMdXBiUXZ5QVAyIyNmK29hR09qCitZKkIrQn03c3s+M2k8RF9RQSFwMFQ8P2s7Z3JSan0+QWhRJHtsaF5hWSVKWn57c2xmOGpjQEV4TDZWRW91WkYpJHBpbnZkMDU4SUM2SHRaCiswZClBWlJ5PDFNUU0+aks7NzlpPlZ1ZjhFdXZKajk2b0M8NVFDeSVTNm9XJCh9K2h3V35SU2JfQz9WTDdCUXFiSHpgcHkpPTtwVl45VERrCitWaHwlNHYkfSlgXiFYOGFSWFpQK0J9USlibE08LXRCYERXS1dvUWpvZEY4OS0/JVokYUQ3eWNaPVF9PCRIYHgxPUswQGQqQVg0VUZkR0MjCitlNHdjZ2xvOERlXkRUNSp1WlY2RU02SChDJE5RaDVJTGMlQGdRMn1mWSYqUEkwZHxJNjk2OT9VVkJINkApdEk9RVB1ZEBXK3xEfTQ/ZkElCit2akEmISVOalRQTTsoWnRMaXxQekhnalE+RHk2TThqLU9UVDZiIzFzLSpNYEJhKiNgcWM4ViQhNj9XWSMyNEFyIVV4aUBDPEB7VnRNYjhYCitYaXZgS3NMZnxme14kOTdmfDhoNypQR1QwYUtOdiEyT21lX29Ed3UkPzhtYXJCQzU/PyVARU97ZUVGYGlNaVBYWXJWdFlDRyVGTDc7bXN7CisyM2t2Zz05RHNmPStqTGNpQk83OyYwPkFaPzB+ZldDKnJtOUlTZFhmZEgkRF5AUCFoU3pQMlRAXihqY1dINm1ld2J+VHdpSEl6QCVXKHwyCismX1AyWGxufFZqdUM4PzVeQWhedUQ/Jnh3Tl53T0tNaWd8OFFNXjZ3TipeUihxPFM5ellaUy1wY054a1hnIW9APlhxcFpGUHdDTFBad2U/CitFRz5Jc15YdnxyWDd9NENjR3ooR3M0KUozejVCd35PMT9PSjtlKSQtZWpMIzRATlRFeT4zdileMXBNVH4tcm54VnpPP3NZaGAtdX5WJVMzCitIWWFBbDFHYlkwKFZpIVhZJEYyO0Zselg+dlU3SV9AP2JrT1ZXZmFOTHo4PytVbEFecnY0PiNXX1RfV0swSW5mV1EhdUBGMTN5OHNLNH1gCithY2xXPW9AcXFgZyhhS3c7eHg+NjZGeHMxNUp5THwzcytXc2JMYkdCUzJISCprclUxX0I0UG1RfTF2JmMzM3ZWWilkTklzfGUoejt9MzE9CitldVEtd285SGJ2S0YoeSRWR3lsTlZBYk1VTl48QmIjdkBWMkJNcGp4eTg/bjxHJUpmLVNlJmt1VnRrYFZDO1YjeWBGaChMOUAhJlZZe2tfCitWdSZGdiZJVmVYKkBOPGs1VX55U1gjVTUyMVpgdnpUUlAmKl5uUSMjdTtPcD89VCR1bnc5QyU+Nld5b3pfQXYoMzReUnRne0lSNFREX2lYCismRzA+Q0FGVW99XmNhTzYxeT1QN2Z7UmZ2cTNtM1JKNXRMUm1NVTg7IXxUJFVVbEhoZGwqQng0VVR8fFNPNF5xczhKQ2QkOTAwcFVNfiZnCitENTQ4RmJVMkppOTg+UkpLRjM8LUd1ayVuNUdeNXYtJVRkV3dGLWp7LT0xJkgqZm9rRkQhJCtYIXtZY3NFP3RDZXBUM3ZZPy1aPXRpVW03CitiQHFZND9vdWtJVTtzKExfSjhFQT4zdGR6c0UhJmglWERQK0NDczd7OEVtaW5TPzcmWHZhZFIycFVhOU57YmQzKEsxI3EoY1lJfkN7SXIqCiskZUdwWng0cG9Mc0dpPmhxc21STEFxUlQ2fWl3d3NAS1B2NzE5UlVtbT9ZYiUmPlJIZmdBPT5fcWpFbXBMdVQ9WEwweUUxbTV0PG9nPHpJCisjMEopMXZjdjM3UXYrMjdpPlR2TXt2ckpWSTw0V0kwTThiTipkQHI4eTZ+X01kX3UpOXh3Nm0kQk5gSHBVdm5zcnh+TUBSYip5NlE4JndACis+dkM1MTVibmRNaXtAZWF0LXV3QENIek44VS0kflMwUy0rOWx2a1BEbX4laWVxdWNkKF8kcnhwI00hclQ4PilkLTt2Q3MwcWJlVCgwaHxGCitObEZxV2NOSmJjanFqV0piNUdnO1VpISRRLWYjfD5AZnBLTmdvNXg0WmheVk0tclF6KT5TUCU9SEMhWjYlSGF2N0kwdjA+U1omQj1IWDNOCitLdURESzlINEEwSVFDfHFNU3dIYVgwI1Q+M1FyOVotKV85KlY9a0p0KnNVanIxTGYtTnhMJTJmR1hsaFpyN1JQYVdGcl98Q3Y2fnM4UTw0CitGckJjQnJRazAxOGlhRmRZendzaiFveHNeT3srQlVLen4xRzdXKjc2c1gtK2hhVShRQmVgPFFAVlFHbF9LVktAejZaMztKWmAyYj5kV3RrCit8JSY5O3xmTDw1TD14ST16YE02VCpqQ3lPdWc1eGBwe29CTzAwKlZpRXJQXmVCJU1KVUlyakZXaENLRG5zfFk3emt8XyRxKHlseUZ+OH1ECitNRkcrfkRRMnUpZDE1WGlkODdre2BfUCZLaEZraVBaVlBCc2Z6KnA2a1o8JTlHKFJNaT92bkJ4NzcwPmomKlcmKVojVj43Z1hsTnh7fXdXCis2YzluXj9pWSp2RTZHekg1JTM+TE00fXQyKFMzTCsmS2laMTc9I21BZ25+fVFnVT0lZkJhWWlSLTwlVEx2UkxIfER4c2k4M058P1M/TkxACitGVjxNQV5pWXIrIzZwY3gwdUVuXzlEO0BAT1dzZV9iXnNFPnpeRFNFZ2hRIUNqcGR7eW1ZQTArcyQyflh+dU9wXipUIURRJkpTZFg0QDNrCis3NjEtRUsrcld1YXheZ3U1Yz11aXxXT2RVSGJPM1ZQbXByNWt9YGtoQF8tO1lwXzJzQGZeeTglTGs7PEswbU82P2c/a2tMUXdTcntsUCEkCit2dEVJVzR7PjVufTJwTnJobGd4PDYmRCZVbXd1LTh+bERWPyk+YCRtaHs4KyQjOGkzdihmQjZMZXckO15LeVhkKHR2MkE+Xmd4RylrbnQpCiskYmZYUHF7ezBAey17RSYtc0VeNDJLMi00TjRtaCtFPlMwbDk/ej82bHJKUE1RUXhUTjc7Tlp5QH07VikrSHF3MzE1aDEkbHszJU0qaiZYCitXc2VkWDV3SXM8MWpFJVMrRF5yaV9gQSpJPTl4d3tpN1hXNkJoNX44UE5rYnA0a1RXYG9OM15kZUkzQWFqSUU2endzeEZoQFYlckxueHRXCisoK3pMYGd0TTtTKVcpUUx4fHZyNUApOEA7al55NHRoKGkmPGFvY0leUF9KeUVgeUFXUStVOWdIbjE4b3h8JW1LZkkjJnlvMWRwQyZ7dFczCispcHZMPW4lNmlWRythTG5KRys0YnZpRkcoKTZxJXxVYldoano8RyVXP2Ate0hMOVdneXE5a2xmIUMoRXI4PGkpZWBOQjBXP001YGlEbyN4CitJPX5ScyZtP2xtYztDbUM2RGF0OGw7TlhyQyFGUmJJOXI+SlI0IXVsZXpeNGF5Z0dAKmpMaFIxa2U+O29GNkFpIytqb25Bb2pVd2dWbmp8Cit2I0IkK3hgfERkZH1CcExXbTM9YlhgKWtIMl5iQG8+TGl8QURZck4mb0JLKFFlTjYwPmhvIXoyMHFSO1p0IUtfTlNiMUFxNXd4big7MXMzCitnSCp9OWxURk5tOzEmLVY4ZEZScFktV3U5SVUqcUw7KFBrdjdpWlFeVXF2dnNRc2UpZHlHWm18ZFBWeTQ8WF5ZKXRiamVMNSU1KVBaa3lmCitLYCY0RXBaWTxic15GYF5OR3hxI0heaWE9Pks2eCQoY25pMmVwNCZ4XyQ+QjRCPVhxQCFYVygtKEZMX2RDKDVIWENFPCQ7ZU1pK29Wal5kCit3RSluVk0xNXNhWnB5VEFkPU9rOTkwX0hFKWY5eitIJTkmPCtvdkhSZFMpQ3dCZzl1V2FwITtOe3hwO3I4WFV5ei09PCMpWnleYUF3P3FrCitaN202SERBLXp7YUtnJXBDJEFCaEt3OSErTmlAY3NLbF9iMVhRMD4yMzR8Uk9NRDYzP2hXaElyZER0VzNTYWdvNW17ZnBTOXczbD1SQilACismQyNvY2J2QSp0U2RRb0UxVTAkO09PIWZGTHw4NXROenZJaEZrcUtXT2pnVUxHOGpzVjBHfG1VQWR+LUlCR3lvTVl9WjUkRntUKlU+NGFfCis7RH01VGJvTW94QGkpJnk5YnlOVi1sfjNPc297VX19VWk+ODI9dkRYZWtfRUl0RTBkaCZPWVVWfWhiJk0tcWBYPlQocDV2eUpvPiQ9b3ImCitHRXNtQ1ZUPXc9U2t0ZSF4I01LVkpAaDtsQHJAKVA2ZiVqWTxxPEc9e0tGPlBFVj5nZ0IpKG1QITJNejUkc0ZsR25Ncjtiez8hcDtJcTIrCitzPWwma21vVHAxdDZKJG9LRG14YH5UZjhNMTB2UnQhVWQ/YCFvUHIpKGtkMCN4ViViRklYcnt1VE02Tk85Nl9nMHo/djslcUhkRz4pS3RUCis8cVE3cUhiQ3kxYT9KMy0oP15lNml5NmN2N3pqMz1ecXt4VT9YIyZ0azNBell9IyllMigjYX1uampEIXYpfEsyM2oqV2NjZW1RQWtEPloqCitWfF82YiNNbHBBVWtgZX13cFF2YS1lJiNeMylHRVI5NHRfM0QlQT5UIXM4fTEzfSlyX1ZZbXFtZ0hfIWgyNzRVO2J6amU5Jmc1QlFLIVIoCitNbVNUME9eYlZCcUZOWlFING5qPT9WZXJRNkluYlFwaVM2LWRmYWt6KSN3ZDBNV2dRP2xZaig+UmYyYVBzOWNoTkpifmkjR0klYipeKzBeCit4d3c/LT5nQWpMJF5tIyU9YkF7SXtlSlM5P2ZpQkVRYiVlViVZJkZFIXt2TiZHUXBxPS09WUBXRWk4QjdpUGZOI3QtWHA3KWowe2dCYCopCitWMzI9SSp8SGF0WUd+YT5xPHU0MlpqMVJYIStTZiRQS1JyTThNUz5jOHFrRigqY1J8N1YzKCplTEdIREkoJTVyWjtvckc0PmEpd3VzREtFCitkJSRYPWstI2hDJXFPU2BZcyklUU1JSWYpJF8zVXNxLTlKSiN7NFo0bCFINDdReyo4aHp5WHBtbEleYW0mXko1dyZWSDQ/fiF3fHg4RChoCitfX1NaczNMQWx5T1g4bUlmMlFpbDFrelVed29ZTiZOZXpKZEQ7NUo1KCVFb2B7K3VOPyUzQzQ/a0NSSl5lPl8xaTVuZmJJSE0wMWR5dytYCis8ODB6elhVPEhKKXVrZyZkI0QpMVpfX354U1hjQzZeM1FGSzBaUC1vdDFZYntGZmE7eWV8SlQ8fXs9ZmJRQ1NSNzZlWWc/UUk5SCE8KUpHCitlKFgyb29PS05fOVdIKlcrTGhRP1RtKU4xIVYkZDQrSDJqPkNoUi0xVEhOU0NafTRKd0Z3M35aY1E0O0hBNyNMamM1cUZLRSsweFFGRzhSCityfFQ+Q0s7YEJ9azByMWhtRSFsYH1xTFhpK1V4Z0dOcV9DZEh5ZmlMZ1d1UT1qMHc+JW1qT3xMQFA/PlR6RmR5bzJMNmArZVF2UXpPSkAlCistXj87cno/eHljfVVATnB0SnxJYklPaEt1TzBXaDR8eys7Xyh0MzcxKitmSlZlMl9RN2AlZGlVWWQ0aUJ+MlZyRXMtWTwpRy11RzZDb2A5CitVNGNkejVNSXZwMzZhKl50PS0mUT5qNj11eG8zNFh0MWt3clZJKXNIKFh9VztsYTBkKUI/eyk2NDhqPyhxdGskP1JIU2FCaGJWaW1DMnFDCitaKW9oVjFUO0ZHX3A0PiQ8IVYzWXhkNSkoNEJZbTspYlhrQT4hKH1OfDMmI01wPkNhI3BwN1FtLW5yOTV3Vkh6LSE5LS1IYVZMZChvRnhGCit1TT4qeWdoVlRfKnJlZkxkfmY0UXdzYCl3eCRVeEdFOTlEZCYmS3opWi14V3Ipblk4JEk+VjtvKUs5RE9gPTNHdnNKdEgpb3tPc1VTSVpXCitwV1VXd2pYeyU7I0VmUUhGRTByVyohWHlwemRmdE12JnlzO21oYUNGNEUlTHh6SnMwZEB0TXk3PXNPRDI7en5ZMURgT2VZJm16Nk53R1RkCitoYytKJkAhYmV8TmIpcjNYNWdtSzRWYUpUSUkwMlhRV31MKj5xZnFGfHpEajEodWJ7Z1hrekRQTGdhaE5tVnlGT2xfOHlXUj5Da2JLPUhZCitTUjl7P28zKCRaX1E1b29HbmIhblRvYU8+e1ZVUFVAXjt7aT5nNFRsYmw9UUJjUiQrZzE8czQ9KDwtTnxxYk9mdUZ4Qk5rcFlgZiZlQX5WCis7NTJJakYqcVdUWVRCR2dwP2hZfCltNFVfdi1nND17S29LKXJEKkx+O0tldUcjWWFnRSlyaj8rdD1iN0BfJip4Z3Q8XnR6KHdYfmc3UmBfCitFLXI+ez1HPTchM3x5QF5scW04VH1VR3R5VWJMfWNUUmlSTDk7QihkRWZgcTl0SEV1Wn0yYDQyTDxETTUtQWJXRVI2bCQ2QGMxVi1WWUB+CitxQzhwYUVpblkhRE1UQGp7X31tT3lZPVVpMCE4QyQyTzRiJmRnUTdUWjw2SndAeEpiezk1QXFHcWwzSXNLPn1MP15xUzwkQzRzWl9MaEJ8CitKZ0R8ZzJnPSFYK3pfTUNLVmczO0AjcTw8PERncVVeR1ZqZEYyTFR5R3c5KlYmIVAjYy1QUD1zRUlxM3lPUCpFQ0VgcX1FPipOMSlyMzdZCitFJUE7PWwhbTY7M3pJemAoKG1FKE8/LTJjTF5xZ0AwQnpKYDM+UX5wP2tAfGY0Y25UMEhja0hAM1FAJEtBbWo8Oyp5bG9AJjhTNGAjJXxxCitRPD99JTIlb2Alb2p4fFhYUz9KclIyd3RSfDFydyZ7aC1TbEhBRUFrJSU4VmR+TE5rYl83b0gjSyZJamV6cGhhSXordE9EUClKTG53UXFwCismQWhtSU0pT2orSThDWTJYPGZDLTZMeElWYGQ3TD9iSSV3ZHM9d1RwOT8mJmN5fmFFWnhkRiYreyE1Q1gtcUNLblk1WEBsc09lMklMYDx7CitIIVZeNDd9aEFfIzdraEJLI2ZKR3VvM2N0c3x5XytafUp5e0EpaEBacX4xO3Qya21qTCVrN0V8TilsbmVydGQ8LX1rcUFgVjAyQmg1UTVLCitpdGBeZkk5RWM7b0ZlWTF1cUhxQXFoeVdiZH1ueDk1M1FKSWE9M3xgOXFHczJLO0JzYmdvMGdRQ1MmeCooe29SM15uNWtpc1Z6QiEtTnQpCisoOFo5N2NMZitsdncjXjhAP2MhJV5KVD9SQ0FxM0JBcXJ3TD1lZU1sUihFQ28hdDd0WTxWPn50KXdLQkJIe0t+JVY9YHpAM3V2YitGS2NGCis1bXpIaz5uVn5NIUV8V3ordlRvITAjcG1ISEVHUEwqcEN6d2B1ckB8bl5NYm9qPnFIVHpiR1I0d2JGLXQ9NX5+cmZIenthaF83Kmx5Pj5JCis3djA+OTRqZCo5Q0MwYkBgaFJ6XmpNamFKQFg8RV5xWER6OVJXKGh1NTBLTDJjTD1CdzszaDdXb1VKNHVIeT09QWh+dExxTE92WCNlR0teCit+dX4xQzlpTnBZWSp+UlcocEU7NlpIR0FZUH1HWF82ZVgtMUk7KiFoZjZSJTRLeTtHMmEqenZeJW9nPXk3MS0pIT0rfGJiZmFEcypBPGx1CittYyQleT50eTJAVF9tYm9GPD14a3I2JXJhJm8rYD50eiVQQU1HYWkhcTFGWXgzOUo9QHVKMXpZRWtAVS0rYzlmeyhLQXVMWmF3Xm9jeGorCis8fnYyPVRwT3EkT29ePiV8Rj41XzR4N3ZpeDh9IX41ZyklYjIhezFtPjMrJCt6d0UrPntgaiF0KEd8JjFqI3JHPWRYcmBrY2cyUy1wNU1mCitgV3doZyRsYGNxUEhTYVl4Z3piT1cyQEVLSHtFcFE7JUFqbk0ldzhPd2d+LWd3KC15OWFjWFY0U1RpMSNHK0F2V3FtQ1h5Kz5TSWhIRUl9CitqX2VCdiEhdnl0YU53Uk8rRFc5YD57Y0hELWJkQ2kqWkhzbih3cXJBYUVVJCpRQUN8ZnR8Ml5iMyRtSXB8Sy1iT0k2Y08mbiRvWXJEcnltCit5PjkocUlEY3okLUwhMyhicnxzSE1wVGF2QHgyeWFiMn1gZD5xXyFyQSljPVR6TUJgejNpT08/SFpwe0MkdzgldH4zUy1XZiF0ek01VEkrCismST5xQERaPllPX2RuIVd7VHFjO3MhPnVZWWNTe21hZmZmKnM3Xj9TUlhScElYM1pgNl5sRklxbW8pZUV5UVA1JW5XPkhVeVlBOV9ufHhkCitlIUx1T3dedn5mJjNrUzlmJiZeaGNnbzFQMzJjREFuITkxKVpHVWNNJC07QDFAb1JKQ0NRQVZZTjBKeVJOaW9qTFdGTzUhWlU4TXpaSENeCitnYzwhQkZzKzt8cz4tIWQpbzk0QGsle35II1pqNiRweGxlbkd0QmBVflR9eHpWWD9sVDtpUkZpUG5HMjM2a1ZVYEUlVj5NUHdUJWAlT09zCitueGl6TzlaNiF+O0hYKnlKfj9GOyZHSyFmIXJUelZDdHFKamYpdjh6UGFXSz0hOE9nLUotaW5hb1lBZ0VnQlVpc0kxQ0JAQ1EqSWtWZnVDCis/WSF1cFV2Ji0wSFlBVEpXZTFRdjs2WShLOVBecT5jYXFuX1U/MGExVDI3cnV9PTxQSl5gTmV2QkB3Um5ZZkh5VnIoI1NoJXE8QmIlQVllCitiPDxoPkdyKnlVSCZKK2ZBO2kwJjMoSF5BP3llOWQ7JUlkZUN0fF96NHV9NyR3I0IqNFptNHl8OWNSanskPFklQ0RHKmpxQDdOJDMwTkRZCitUSHI4UE8jOGZVfEpkbiFUZyRxWGdkdF94IUhiLXtlajhsUjJ2ITdndDZAZlJFbDVSendxZypuX25DYz1yfjFeZUZJN25xRmZTY1VyPUk9CitESVltKkF1UV94fG9aYWZ8a2drY1R0RnNramxiRmFJIyhrWFFjQGcjJnUmTzQ1dSR7KlF2ekUhSC1PZEFfN2o9P1dQQy1GKHphQSRMfEhyCitvfk11ODtRa1NHSDI9UkJvczdadypVbFp0JUxmNzJqbnNFRnNvQWp5RSFKYG1SKWthUjwpeWg1aT42UFdCekk5RmBTaXppbilfX2BTQzF0CitNJD56dyFKenU8YjEtTXdmKkpueWhfZVZPLTNYbHFhKX1SPmVscSRyYWB7dk17ciZfRXxeTGx9YEI5UGUyNEZUWT9FbHA8a3lLYCZ3KDw5CituREZHNz1GayZrYlIybiNVQGF9dS1QT2gmSCo9WmZ6STBZTnQ9MiZ6JVNqLXZRKEVWYWk7MUtQcVZURGIqQ1leYDNwPy1Kc355VzltRElwCisyWUB4NlAwPHUyJG9oRUotUjt2TUd9NihZPmlibGpRK0BMYWUldXBKJCMjZyFSRFBYfF5DPktMVDB5QWRpIUkpcSU3TEczTjZuTFVOand9CitqVjFLYF41OylmTGAtSTNYVERzKFJydkB7VzZGd153UG1edDM1cDFqUiZhbSFWNEF+fiEpPytYV3l9RmxnR1lwYGF2dnN6MUZKOWVVT2ZHCit+QThmNitxLTJQJjk/Ui1lRGpaMntKRz94dERzJEpGNW1NUSY4R0crSDcmWlpMPVdeUDZeckxWX3Z0WC1ReihLJFhTZnpUaXJIemphPnVnCispejU5XylDSXgzeFp3d3loTTdqMSE7OzJYZiVkVHtmVkEyTzhkc3E+TWV+MENnUX5xSmVGZyYyYG9LezcwVXVaZU4xYldqei05clo9ckp1CitmfFZ7QXpBfEFLaH1eMDwyYHNvVjJWTmRLRFpYOStEXzF2aH5xNXMtPXdOOT8+TW9FT3lvcHJ2RnNaaGV3JHJ9UjR9SEx3XnxsQ25ySU98CithPFpta0VqZWU7YSo1U29HPEkmMyg9MitJVz5kVlRzX2d4c2hTI3tXKnJCWUpePnFgblNHaUdPd3UmKndpYkNOaE57YkBwezlUZmdOPXNiCitXPVI1RDxINWI3UC0rYiVhbz84NnE3fTlMfCR1VExWNW5aSGoyUXBEVm8jNmtnWmpDcUg2Z1BPd2shMUdYRG02M1Z0YUUpOG48KHt8WCMzCitlN2MzMkE0ZXRhZ1RIY2hTVnJETG1sNEgycnAjWT9DNU90UEpIVG5NM2ZxaysrR2lhbn19SGlkQXwlYnlhVVBPNWw1KlAqSmJ0TnFSWjZmCiszRDRVOyYzKiQlPXBDTn5KbkRwYWRfdSQle3xVTnd3QilCPEBXVzx1QDZ8ey0pRkxiUnJxKlFuYEEjeikpbzVBWCstOShXajxyYXRSQyhQCitoVSVyXlJZQTVrdjl+KnElKXRZWnJ6Z21iMlRGSDZAIyNHPz5PdWtgR0NjOXpFQ2NIdWB5P29RR09JQXRnckJwRmdycnc7TFROYFUxMzVKCitLXl5TSUtIemtXUSZQO2NQcWw4TV8oOXA5JEhsfnZFJWl8dVVuVUxsI2Y7SmA8QX02IXdUOG1WcWAjQVl3X2BgMS1pJSk0YUBiZG0oNVBDCitQJG4/PlYxLSpZeihWRkl4OyVacnQyTUJCZG5aTjlXRmxxc1goP00kUmA8eSg/OGMyJXxvK2FvRTF9cTx5QWFoX3NeRlAyK25FWXlnOSQkCit+QWFUTT1HQHhUYDYlO0UoRHd7djVqQ3dUcTN6KjJmYD5HZjNLUzxBeE1JSjlHd3ZGUVV8Ozd9TVkxfDs5YEBSKmpWSExqNGNpe1RYQFRhCitVQkE0K1F+LSFie1Umd3lOO3QlMyQqaWc7Z2pVcDY8My1HRDx9PUxSdE03NElBJDFkaU5AKnR3dGtjZ0QlNzctbylxTiFvR1FkRD5tTFMkCis8c0g/WWQpQD1VZTt2ZEhTZT9wUn5FMHg9Vj5fP20hMFRIeGo+bW1jeGtFNyNgcWoxLWZMWUpsLXx5UzJRTDttRiNQZDYoWDY8KG83THRXCitpZCo5N1dGYVJqLVVue095TVNRTlRnRChGX2lNeFBzPntwQTFWPH1MdGBDc0JpcmNfNG5gNXEhLX1KRTgyTmBRZmQ0KiU5TmxVYk0jTXZiCisycyk7UXQqVSNWQXFzNTFtfEZuNT4pSyQ1eG9kUFhjczR6SGVaSDxkckJKUjVKci1WK05ka3Z+IXo8e2U+ajxEaUxmVkh2PVd6bFdCTCFyCitIeWsoZnIoYWxPNypAdU18UE0oWHZXemo7P040enRmYGshTlYyWUdNfmJSdUs+I2VLcndoNW9wRjU9b1FkdEImZGd8aUlXV1FubDBUUGA2CitITjxTUkp9Ryp1SF5oJm1YeVZDYzc/IVUzYiooJTJXLV9TUWdWQWA2djA9NjhscXAkPkMhYnpneGw1UD8xKSgkI1B2SkdZWnMlKSV0Y3FQCis8KnRfUn5KfTZyPGgxQWl2fVJeYVk5XklHaHgqYmJkVip9NDJeWGB3Y3sxLSFOIW9aanlFKzgmXlNrWDF7cEw+KVhaYGhxOWduTGheTn5lCisycCFifDcxWjhKY1d5Q2l6RlZfTDZ9IUVEQm5+cilgTXR5KzZxfHhpOys7NGd7fGl8NURxRWNDTylrbzVxVThxUGRTRHNYKjNNJExZMkxVCislc3Z4SWBHTGxkYURrT0Q5MXsmVmBvJSR3RzVCeyhZJGQrV0VQNnRqZz9IUk85M0tCQ1JzMnY/ZDx1JjwjRTxweUVWVlloTG1Fd1ojc2krCitnU05uQT5aSCNgaVdsT0doTzFKRGRMRz4qRH1Xey1BWSV9dXNWJVgqQSFZI1R7ZSQyUE59Zytkbmpud24lIXJMdUMzZ2NCQlBSNGhhY3JzCitpMDRvNGZgT1k1LWVTZUl5OCE4a3ZMRz8qZSFsUk4lN2QhM1o8K25HJUxwQWx1ZklXdW5TKndvPTdxbk5MIXBRa3syRyp0fmZ6Skdud25uCitaNSZXSnBZN0dgR0JAPkk+NHpERVMhJEd4dT40WDk3WG5iPFEmSWwlUlAzcihxXiRnVjh2RDMxcjMrYztfOXxjQy1MMGZTMipGcilNemcoCisrTTIwPTFKXkNeRi1OVmpUK1BfQ2RXYFAqUjBMUmltMWU5cnNCPWVrYWxtQnNvMzdoRWMwJD40WWUoYERyUD4le0hDaVc4KGg7X29zJFBXCis+UCZKa25LWTF1amF3b0pDSlJHQ1RoWUtfXmdqODtOMSNlMTJHS1Fibj1XZ0FZYi1BZ28oaHhMVzd4M2IxMn5NVShodTlOfXtSandTTEFwCisxR0VONldOcW1vaz8yMEVMViR2TiMpZjticjFIMClnS0BvOEk8MUhwNnEkSDtNb1ZuWHFoaUJge2M2Ukted1NiTGpneUROMHBLRnRjdi1rCitSckVHSW49QE1WWEc4RkB1K1Bmd3JEIVNCLTQpYEEqPlBGeSZoRlRwI30wdldzcCZncTJsbzFnV1FlPTFuVG5FSUkoaXY0RGx6N2J2I1R2CitCNTdaV2N6QUBzbW5XdEhMbnxnY0lANVNOSkU+Qk5ieiltXnBAe2pAaXoyMWppdFczS2xWNyFoX2FBVDxVcDxAUHtjdD1jc0pjQlI8THgwCitURyZPPlllfk51PHp5ZEw5eipkd3QhfENYSjhHZGU/I3VRKnsyR2RyRi1uPUIqNCRTO0JNOUdPR1ZKaHJlPkRVWns3Rn5vdUkxdGU9N19lCitUVkRAYWZgUXtDeiYoQSp6Tjc1MXBTPlY2WUcodEpZTEdienVXZGd8WiFRdFdpcXd8WDxNYyozbShDUEp4NXg8S05RfDhOSnFWTE1NTDFwCisrWSQyMyV7KDh4OUdpVmM9R2dnSlBhU3RXR2NKQ0liKWFqP0tVWVo2dn5qP2RHfnNUKmAzTUBebE9aaT17V3AwSUshKXU/aGlaRzVuO1p1CituVCUjSGg3SVJsdzIlRCghbDJFYXduSzg7WCZDMSRsXlNickhJbmt8fWw4ekROT3x4TFFxNj4mcGo/eyFIOUI7VkJNSEBWPzJyeE1Qe3hFCislbi1UWnt8cGcmZUdDWHQ9QXRyT21WaX0oKCoxc2U4U3I5ZyRINmJOQDdgSzdpSy15RyVSOH5naUFSSylRKGB8VGZCTnVDRCRGTig8KVFyCitgaEJqRyU7bG45MUYrQk9XTmpXSitxZzNyU3c4S01ST0cqN0d+Sk8zXl89dGBWRVQrdXhvUXliQlBYaW4wYyUrSjRUeWtMX2gwK14+ZSRPCis/JDNNNXNsfj9AdlBpSGtFSDFpcURFU2doTkVFfUtEbTVOYklvfmAhKz4/dFJLQEB7azlSaTQ7QUp7PDk5U312Zjc0RiNrT2Mxa2p4Z1MlCitRaW91fTkwQUpuNXI2MHBVaTtCaFNrMWBKaXtWZnhQTSlPOG9QMz01cDtHREtfdj0+aEwkRzk4RWxDPV5uPW9BY2N5KDU+bU52bG0pK3IyCit2V3dGPCtGeyheTEVGSCVYI1JoTlNaKHNieENmS21fPFc4Z1NfN3Nsa0pme1FMfG8lX3s5T15Rek81ZmJGS21UKCFvQGw9PWtPQjE+Tn48Cit8Q2IjdiZIZUZWZGspWT15WDN8b3coRHZUOCtHTylAUXlBa0V3eEBUZkskWEdgayE4SWFBWH0pdkdRUmhTPk5yUXdjcEp4JlUoPlNufXlxCisraCl3MmoxfFo9ZEReKmh5JUhPLUdIe3ZVcnU5JWE/Tz08V3NlZ3FMQVNLSW1Eel9WZlg1Pk1hb1lpKytNKVdSRyhRYDtHJVg1bSVHdEVLCitIOTt9fHNuUiZreHNHK3shTnRFP3JfbGBGX1g5al9wX2swQD5TZWg0Sk8kMyUtaHJyVDZWN1UkZ3sofDxXV0tOX0p4Pmt4RzxiVEB1cGZ9Cit4UkticVp6PDU2NDtVPVY3MTFIRz0zbSVHWEptcTBMVXF2Pl44VVNGfXFQaVFnS0E+JHxGLWpCM3p1TzFiJVpPenB+cVBYUnRgMUszUG9VCitKWHdXWG5CMTQ5el9hLT9id3huTF55M0s4JDhXWWFCJjNBbCtkVWVaUzlkNylEb1ctWGU2fHApQmxfSW9gO15zQUBaeTkjIzgjclpMS05UCitrfnNkQW5UNT1Kdl5PMSRyNlc/Tjc/alJMeUtWdjlhPTlDVWhLbFRgRyZTUXYocCFLYGRATFJIXlNobVdKWXBrQ2RZR1oya3wySz5BMH0jCit4TEMhdXArKEYoYnZENjlRX0ZSMjFrJENnMHZAUDkweiowMXlTRHY4PDdxdmpQNnxRR20lS1NzVVp2ZHZ0UnxaaDU0T2NoeExlbDFWQilfCitPeypxP3UpbTA4Z2MpNGxrJWYwdT9PVUk2K25ZODcpdE5yOV9feE1vWlY3M3R6d0skX19IdmViIWpydW9ON18wMjBvOzs+TE97byRDISp6CisoK0JVJj4rZXMheEkmYW1rT0NwT3g/NVptQSNDaEwjdmBaP1lNYDBwaCFgUEo+TzFEMTFMMX1yWnReNklZMitTenBLKl5zfDc2IzMoaUtsCit3Uk1zfHB5XlJXaXE7YXBrYU9jc18pfSVqJTYrWnNsal9VcCZWSWQqcDl4WihOajEzaCUjTERRd1hLIzwkP24rJmoqejNaMkB9fDZ5UyU5Cis3b3BaJWU2SWpXbT1ZT1Nmd3pUNj1xS2FgRDZocWFARkomYWhSM01MT2ctT0RUSH0wPmlZS1c0bDYjVXhzZT5CNzBHbHxESEg1Mi0kY1FYCisje3NFbjlsRU5VbXYwflQ2cVZyeHJaMVl2Kz5HfSFBMnV7NjkzaHNmPz1hZ3BTTCNAZGE9bD9IOSYpWlBMdnczMnstZFViYEV9cmlMUmk3CitFcCY2Q0VTUT1icC0+ZWJmMXRKamAtaDQjeTZsXnZtZlJWNko8amRLVyNJVVo/IWNHUUZPNVolc0tXVH18XiRiKGY3b15aZXB+MDM5QjtUCiteclhNPm8rRjNFTmQtJHZkO1c1NjwtSU47X0llIX5ncWliYiR0TCEyeHR5dyF0M1duWUQ5dFReey1MQmpKXj4wUV5QVFFjUCQmISUrWkU1CitNfVNTNDJLMTF9X28lRi17TDFKeVN2ND0oKlA7SSQkMSs7MlY8MFhrLWJkPlhfQ340c1J4TUBIMUlDT14/d2N0VUF0JTNhaGk5d2d6V3RaCitOQX5sY0NocmhzJDNlIV5VWWN2aD9WZ1hQY1U/M0xvMndkQ0JtPFdHMmQjWiNIPDUhQ3MrOEx6YnRJKWtzVXMtKl5HJTxWRSk+SGU7ZHQ9CiszPU8laUJZMjBMNDl7IXEpTV89LWhfZWchSUdNeXRJP1VKUmNJVkRDMFF2YEJLOCkrNTA2U28kOVVpaT09V0YlSitWPTVkcig4Ri1XeV9wCitUbj0tKkxjVitUS3ZgQWNRVCZxS3hZc31xez1EeXspaUtDOXYzYl5ubnoqT0lgND49QVptTz1NRyZucSp1XmlAM1prY3grWnh+ND9kZFQxCislfVlkfmRJKXl5U3skXnglS05rbnZBJmc+cSUhJn1Cc2MpWG09Q311NmtHXishd0J9TEphRGg2Kj57SUlYJHE1PT5iSnIxNChqZEVhc3tUCitpbDs8cHxiWFhuXmd3WC09Mng+IzczZE9JaXR0ZSNEdlJLNFZndktJVzkyQjskRFUkcEVkeD9scCEzYWRRfWk3VW4/fj1AU3dhPndoe3hZCitjeVQrQkArd15ZNjQzd1FVXitrX3Y2ckhCWnFmJUBmKDl0WlJlTlVkY2pNXjRaT0koJCl+LTt2X0NKMmBldE0kLVFMKkhLWil2PzskP0ohCitNMl4lX2N5NmJRY0o3ND13Qy1ScXU9I1NpZ2FKPz9aRkUqeVMmRXJDJjFfdzhIZzxLX0xgK0ZeelRVRFhtQ1p1cEpqKnh4SEEkO0ZnNjBhCitRYTh8RzVsPzxWUW17Q00oZ1JQQXwoOCNzaUsmKFglN08rR2N2ZER5QHNmU2V1K3ljbmBUTUk7Pm5+WXFBIWcxNDF6dEUoZnpsPTdBIT0wCitUK3lXZ1hpM0MxQGwkazhxPkNkK0hTNkgmXmN3bygweFI4N2ByT3gyYHp3fk1DQmc3MWNrQVl6NkA9YWVeZTV1NWl1SFFVSSVLb0pBKGxVCismQ3pVZGpCeyhwJlVHayt9fURXOGJQcFd5OHt8O1o1MUY8ZWF3RChzSWtIK1o2ZllOY0ZqZTErOGgwcWxUM1ZSdWdwYVJPdHhjdzROfUFrCit1JW5iNkA0T1AyTyFlaipMMlA8X3xjbk5wd30kZzllbWw/MndEbiY0PCVwMzE0WCR+bUpMTzU5aWA8KyombUpBSk19N31zQmNRJEJGJnJRCitZdGVPPUk/NUpNPVomNXlpZU0qNHMjbX5gQGQ2ITFOMGZkVkgrSSFwdV9sU0d1Qnc8dVgwOXhrNiZzUTFIakw+MzhoMGtnWTxPY3N5OXI3Cis9OH1lTmlePzt1SnpmZW05MVFZLU8wMDtve2xAPj4pbilAdEAwUlJCWDBzc0lZMDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJVXRlCitpJVg+P3ktRV52OGVsMjI+Z0ZjOEo+YFZAbXMzQW07YD80XilIMztBPHNBJX0lTWxwLVgxPj5WT1lXK2NiaWVFTj1UP2B9aFVrdWBjVkAyCis2Kkx0PH1eMV9iKFZOQ2tqMXlhJX1rbyZMKFVqMkZPUSohXyR4YjtTcUZFP3pCb0hIcT1wTEdzUkhEVUtGSnI4N00pRWlUV1ZESWY2ckk7Cit4TE5OZDQhcXI1JTcmdDdOZ2EqaSZKUVVSK3BLNDMlMlpzKGNeJDJDeiNSdUZELVVkQ0woaVdVfkorbTNTdkltdGk7aDw/JE10PFNxLXM4Cis0aDg1WCQ1QlEoYTIjamhPdG4oP1o/QFJMbHgmYVJsQGltKThJRjFJSXwpSGBhMGhZM2FIRUhsWD01YExwdD5DRVRhXzc2JmQ9Z3t4JkJSCitldEYreylJKnRQdihAbDl8R3pQWk8pfWBwRGpBcT9lKDkkYTxpTGlueFAkUlUpUSUxSHZaOEh8VC04dEtKTzNDZWNzWj92fit3I0QrRk5qCistYkEje0BARHpgbmlfTCVvbHs8KVVfNlZCR1plQVhTNz5Md0ZFdll5X3JBZVZ8IyMjcnk9cUlkOHxVLUAoZWRPXkZxb0VifnVCYUUmVFRwCisjXmBwcnxpcWBtZWFqPVAkVn1qYH5+dSl5WXIhNF5UQDMxUVktTzAwO297bEA+PmptVTU4SE5kTiNAUXZtPVcwMDAxUlg+YyFKYzRjbTRaCisqbmhhYlp1LWtZLXdVSVZ7ZE1BYllYNkViMXJhcyZBbkB6OCNqX0pfKzd0KHF1RShXWEgrKXRNVml4blIrZFZhWmUyWE94TlVjUHl+KWZaCituWFYrMG02QHo2WTBtdWoxTE90bzh2djNsYkB4OEl7cSRvTUJMWUFHMm1+U20wcHUjcnchUG5lVE9HPG45ez1gUkZXSygxeXpCK2JCMTtjCit0ezlGQ3xhVzZgKWxPb0E+azkmdCo1QHUyU1RiaCh7OTtDJitkcmdfNSUjKz52LW8xLT0md0dGOXowRyM5YGRqXz1VLXg/SWZBQEVYRyg4CitKOUtefXl2O1FqOV5Yb1kjSkZnPTZtQnxHKjF7aF9LYjR6YGJiZEF2YDlGcGhkUk54QThMYHVGRzBwRmpLTnteUHBaV09wNTtOcHotcCtHCitva0c8ZUZkQSRldXkhJUlqKldmLXVZVEk0c2w4WExVUGdzXyNqM0Q3ZEIlSEtfT1MrZWJZcihRN3pVKXQxNTl0QEE5KiZ2eC1tbihYNFVjCit2bUxuWFVTZWUpX2VOQypPMnZVR1B+RVdwUUd8TGpuX2VYYzlaTyk/NH4jeTNAMVpSPHJmdkNjUFFFX25zVTl9VlleaHJ7RSpBNSk+ZCZJCitANTE8elgodFNKaXZNaFA5cH5rbERpcjVRPXhPSXxqY05FK0x3IWkyLUdqMlhqQylPQyNYeTxTMW04I0RoblNnOXxOZF9lSE8tVWEpdmtRCitocFdReGtkVGZaI1IjfD5gbWVmZSphaU0rYHk8bGdDIUJxQWdHdnNoI24yXm4jPV5AUHk8eWpHTClwfCY/LTRPPCZxI0JXVSpVWkYmI1JGCis0cWU3amN5cG9HcTxmMnJ6VFhYUk8odCZZXihtajAmcUJDOHc3Uj1yaHsjITRjS0c3aDNzP2NBYTZvP0BsOVFfSCF4JF9faSF4Q14kYng7CitxVnJydUAzV3B0P0oybEFZSGFudT54X0RJPipxVCUwOTRSWm4hTG1ad31Ea3pUUHtNOVY7cGx+UVlfemJNPytfbj9UPSltZk5raDA8X210CisyOWBqV3YxRShjZFZBez07PUQjWm1YaEkqVWp3YiQkQz9zRSFEIWdqRD0+cVhsdkUyPV8yKFlKb3d7LT93Tk9MemRGUTRzZyhOSkhwbm1VCitRdjNmej9ZKU9ES2ZaYjBpP1g9VChAOUlISVA5emFWNHI3VVR2V1opaDRNcUYrYlhfISlYQ1QjU1NZZT5UeUF1b2FhdEhEY1dQez5PNG9lCisldjF9KHR0OCE7SmQjfjJKT3ome0wybWtUeUEzWlliWXR2ZjJ7KzIjTE1yWn0hdHBUbTh6TiFWTjtScFpyRmJjfXhRU3JjOSpvdFlyWUo5CitXZVhTTGU/SFppOGtWY2plI0RTKzFTYlBQb0EhZGFQQkdwP2w5akxYTEUjPWZsQ3dKekZHSjZeeEJIYHRod1JrdC1xaGtjcmFmdlV2ZHh1CiskMSV3JTtvQDRIO0ZGTm5edGR2ZXJqeDFlfDY1d1dJdXBVWTU1Z1okbFVXKSFvQkNWPit2UD8ldlNwckVGSy1yNXp1e1J8alJwPlM7YWZ0CitgMz19KWQmN0F7WHglZFRMJGc1XitOR1c7cllyfGdkfXlnPThAQjJSc0h1YU85NT9FZ31UOyl3P31wfVJiUmZrOWMlalNXbjUyd2xwVTY3Citke3p5PypEbVUraFRnLSEtRzZrZDZ8RlM/IUIhcmVZLUU/ITRIU1BAMyUoZ3FQRkZKKmpxfW9JQEg7QVJ5LUFxMF5UI3tQXz89cEBDO1p6CitaWkpDeSRweDd3ME8mUiE2N003cClleWlaWSsxVWZGclhEPGRfdz9oPktVX1RjTXRQajJ3VUg3MyVScF9NSFMzS1c+MkBeeFZZYzFJKHJ1CisoSns3Ynw3Kl9yME9yRkg4c19SM2ZMZG01Kzs5JjNick53Kj8ra1BYdDd5eUp+cVZzTn5VWUpidDRgbGB4JDU2PlFYIztZMmZ6aGslX3NBCis7YlV0Q0UwZnpWRTt+d2VodndwRTt8VSREXk0ycTczZTtFJCVTSm04fHspUmEocFRecWA3T3J0UGBxPzhUMGRKQiN5ZUNaeEZ1NUgpY2pUCitCK2BtdWp7Jl8+cUN0SDV2LUY9WCZVTTxNWkp4RXQ+eGx4cU1rfV87QkZJbWh1WGZYQkRkNF4lcWc4Sk16eTI8MyNwczVtUjBedlo5eTVJCishNlImcXtkcCZqWkI5S2hkJVBZWXZyZlAzdX1nTmxJTnl9cGw8V0JFcj1OTmlxVml3V3pVazlXTjFKWTJ0M0FTKTdLdzdEYiNySFZtSTt5Cis3ekBBPTBnXnErUjxIfW9GQzMmSFBvUHFMe3k9SGJSTlQtR0w7K1QtcTcrPnpQOH4+RSZkQTV0UUwod2ZsSGFCXyN5NmhKezVWaTFfWCkyCitCfCo0YWlpSTdiVyZHa0NwK3xNcE8/bz0zJV96byM4ZmZYRVdyeVNHdFMpbzk2TnRLMnUkcGUremJZajU8WW1YVWB8MSY/flZoRitZO2FgCitUWSF2TzdjfFBISHchWFdRMXdvOXR8KGU1Y3xwJGg4ZnReaGpMbFVZNDYrY2MkZCQ8U2dtWmRjRFRDTm0xJWVWU35zQD82dXB6ZXJBcVRYCisyamBDaGJvbmgqblh9JF5jQipqVytoT0BSPFA1blNvTmd0ej88eSlNMmxZfHotPkwtcT43JlQjXjZuakl5UEhZPkVjTjchZEtvcVpuWmNUCitDI0ZVOHNgfk1eODlmUlVIZFMjSylTcXdmIWk3Ry1zYSl0VHtVYUYyKVNqMkBnMCF1PV9wdlZDM3lQbFZjNj9KS09wfXA1RShuN3JGbk98Cit0Y0kzWTRKPERfP15xfDklPC1aJnMjIyU8ZHFIYkhOT3tIME52SntDbUFFPnB0ayFOaUZNV2N3I3NONnApVTJTUTVlJWh3WEVJVyZYSmhoCitJWDlNeDlEdjJwPmt0WEMwfS1sO2ZsVGtOakIpXnVPakdvTm18YkFObnViJSVjMF5BJHdkejYhTW0+diRKX0p7eD45SThvenVsQkclcjNuCitkUW16QmhReDZTUDtHPk4qZWhvOEYpYih5NSlJWko8ey0mPG9QRjY4dihySjtLODlwVGZmTUE3TnFpUGhueTdfcD5ubVg4Y3R3ajV9QnUtCis8PF9fZHBvVnNOT1pxZXBZMVpBeThnSUhpcUBYcy1mbVBheVViYUwjQiohWXc3Z2QjQW12P21hTmR5bj4+UDchcGkxfWxzJTM5enRFO2BVCitXZnB6QDJPSEhAYmhsaTRCRiZhcHd8U2pxUUk+cyQqe2o8bGZ2S0MtJEFqXiR3ai0rSmBNVDJISGpCSiRZPzNJN3dLdWFybHFXfkslQUJZCitVUjwodU90SU83TEgpYDN9JXFxKmJyPmZVOWNkRT1hOFNYSENVVzRsJkEzcX5GY2p2P31IfiUwWFZWdElTbEhSNnJNZVpMR3d4WWc1bnN4CitJWU9gIWRIWVNHaG1ZVlQmRkxrKVIrYngzbElRXylpJUw5ZWttazUwaUlkakF6YF9MI0JYc1ckVEw8eyM3PXMpcGBpeykrYlEtcCowNE1yCityWXxRVmpLOVU1bCRpbDBZPzBIU25xKEE+cjZuOGpAcHNMYVVwT3ZlMmU9OXBUYEZFOy1kbFErMWhMRHojP0AqNHFeS19PdUludmhuV09sCismdjBWc3VxfUxTTjhTJGx6eSh8cnJwLU5eZU9SVmJiMDZLT1AtdjtfJlNiR2o/cm07cyFoMyR0e2hQIVUwWlF3cDtoNlA8SHswYWYzbTRnCitwP2dIfl4pK3FGNVlpbnE8diokMkh0QFIyUlcoSXQoQV4hLXdtPlc0UGxANiMoVXtZMWUkXlA7Pj5PRWVFaCkzJDQ7eXo2ZHQxKThGSDJUCis+NF44ME44e3dlRWJ6KGZlViY9Yk1HLXpwXlgjZCNxQXw3Z35gdzk7MVdwYCg+eFAkUDIxc2llJi1mPUdlLSgqMkErJmp4OSlfTm12cykoCitDKHJfVl5idmRIY3AlMEhVMCMhZFZea3gmfVB6bypIc2pVOWhRYjhVdVBfckIra3U5TXJ+byZsZTxGNUxRPlU5K1JZSXwhfkBySUZEdEYyCitnKzhtLXlASl9ecGFgQH5ha3UrQXotMlU+RHNYSEhNazRPU1RwQmYhdVlMTTg8czRqYDNOVTJUN18hPEROWUtqfTVOWjtGU0VBeSZ6NHE4Cit5JXpFOEFHTk84bFN0YVBYT0Juc2FHdjs5QnJ+ezZScWpRcEkmPlUqdChpV0d7ckwzRXVHeSNMNkclVDd3WUxrVztUQk0+OEc+OUV7YSNsCitQRko3am5XWT5XUklmdHk5K288a1IyOyVmb25ObyFjJSFjWD08fF9QYXZNaWxeWmZVe2QlRDMman0qOFBRblJaNkUlKURqYHxadW0le01vCityWj9iJi0/TztCaWV8dVp1K3ZBTCYrI0kydmVmdmZjUlI0TU54LUM7JnVsKXN2e2VKJmpqY297VClzJFp6PER8bTMjOWVJc155WVFWaXM+CitzQSolZTF2c3FvKzQqVyotIyo8UShDQk49K0lSKGJYJS1sLU0mQFVLO0U0PjZRfnQldlp9JDctd0g/XkN0WEEzWilvNjkhZGVAO0ZpVCQ1CitEIUhrWTYzKl8mOEN2ezlQLXZxY3BZdEpXZGp3ejtDP3hNcGBPdmxhbXpMTmVjZyVGLTM4YnFGVE51aD1RSGMwNmBVPnpVYE8+RXctQXBRCis3aUFkJEdONDk7dnpnc1AkcCRQNTVHUlRjVGIxLWcwbFIoV2JwVzBFbDs0Nl4kR0ZLcTcleypaOyNfd057SnEpQEMlRFVAM0xpbm9XZF4kCitLeVFfTEtTNUlGJD5vV1REdz1GfVZ6fGxeVHxMfT9SODRySGM4NFRMemthcihEMzZPMXtrQEE/M2k5fWI8UzVmSDJ+Vmt0cGghOzEkNUw2Cit7cnp1V0wkI1B4aj82P3l8WCU9NEFkQm4lKncxYTx+OylLajhnU1J9VCo2KmJJTG5RJDVpTj9iMGcjMFJrYilGc2VyPk01dTtNNVJDcnxACit5OSUoVzlENyRxbHE2ZVpVdTJ1fTFrSXczQ2Nie1VgTyR0c0R7czVyRyFSPn1JMXBBZV4ybVl0a0t0PmFIblhmTk9uQnF2JGsze0sjT0MtCis5PmFgMCl3KzxPRl90MDxaSWZQRXdwMkBYYWF3TnV3KGZHeEQhRytkWno2ayY8biZqKGZAa1ohJmthcWpEJXNUdmNnejltQnQwUz9OaTJTCit1ZlolbTkqWkJOb3Z2XyFlTCtDRncka3FBaVI5NlQlbGY0bnd4JndJRWVHZF9tQTxhSVhjbXU/VE92MUl4OUZxUVk2WTF4amp5bHA0aWJWCislbC1zS204PHFvdSErQEpBNUt3fUMkXz59YTYoel92T0Ixb1R+QEUmUSZmJE17fHtVR3J9bTUhbn10clpJSDlvaVheYHdYTz5CXnpRbEVGCit9YVM/fjdfdEdZc2JIYUBLZTl7NUJnTzdDRGY7ajAkc2V3Q2ZoTHc3NmBNZGx2IWteVHEjdjNfOGF6ZFJSUEtldmhEVTBmTT56Qnc1PWN9CitAI2I+VVleMWxNYHghMk9gIzdQelpYP1lNeWQtKnx2a0tXYmgrRHY5X2ZeeWRGKC1nbmkoQW9+NEtsK1d3WWR0eHM4QlE4fmlkJWc/OEA9CispRXU9ezstJE0wJDFfO051PVFSSEpgPV5qTVY3ISNxcHZAKHU2fjx1YGV9bDclYkM5WkleKi1uR3FRcW12YzVXQ2dpSCR5JE8kKEhlQUB2CitlaihfUUIqXlltKXhlYFJxazk+UFI5dXdfcyVNJT1ieWBAIUVWaUVzXjJIZClVaUEmUjBFRWVzc2Vyd14pb24rK3V1JEIxKFFYLVlhQHtsCitPJVhGRnpPcClFYy1WQ2RiZC1jQGcrNj9eRDwxY2hJfnRecTlgfit2TVVRbUl5I0RpWEAxZmNpU0lLUWRxRlNuczx0dygxfEY1SXJaO34/CitKNzdyaVEoRk1nWjlTRk9zPE5uYEZSUXFvYF5WZ3hAPz59dlNeJGErX1VvR0trU0EzLV4kOyZyYzZkekdjJT84Pyh1ZVp3Zk40MUBgS1F7CitEXk1BPFlHNmsoRlEmVGlzNylXXjQ2ZHdyfHpufkxKTXY/WH58N3h9Y2BwREo9X050ejxCdEUme25rdjN8QU5CNSMrb3M/ZH04dVJHaENjCitiXnZOdS1jMTlXZ3RzZEleY2leNXxpeGdyKWxUbzJxe2dBM2J7MUVmWlJ0IXNkQTtQY1FYb3slaH4wOHNxeHlqJUwyfW92N3dZbHhpdT88CitMS1V8cmxCYylTV2stYkIlQTNgSzRiZ1ckb3dAbmVAKUNeKUJFPlN5WlF2Xm4xc303cXlEPU1PRWY+QD5uYWZeSkxDeEZeSTFTO3VlWXRgCis/TyNqdG12KGQ3c3clNnpgQjU5UiY1ejNQR1ZQbGFrSjx4amVuPUtkZVNmYk8oTk4jVl5ZYHZTckdPdGk/bWNNRHk5Y15OZXh5aU17ZSNMCitaZWVrJlhRNW5TVEZKJjBEZjdUdnBgPlN5fkBVd08+QFZsdn1WdFNkV3tWNEc2eS1OMkhLbGhWN1NIZn1+PmBHfEwrRz5fYGBxKUdidWM2CitUY1pgRCs2Z0ZPZz5Mekg5fE5wTDdMPHd0ekpVJldfKHJQPyh+TDA+MFB7QjxTVDE1IX5XKGwyZFFyYTx2fDdsT0VyV2wzdClzfnlwKGlDCitnRE1XRCN1LVhfQFMrejRtXlQ2azZmWVBfIVp+JWhaWCVxSi18bENKcnlfS05YKldzdSVTcmBJYzN2SW8kK040MnNJWGJxQTw4RVZsXyZXCitNVztgenpgb3dSLTxmfWVuejE+c3MxaVNqUEojUnBvLVQpJCoqYSVpS30pTyhZOyRgO2VxRDdVYlN+KXZyVkl3Um1vfHYjSjBeNXhLc1YyCitQOXIyM2xTNnEmVVVpWkcpKFg2T2NgSiNGenRuSFhSWnF3MTh3MGZwfEU8eUN6ZzZlSj1EekREeFE/cnIqTDFZem84R0haUml0bkcpSk0tCitAKDdZQkdmUkF0UGA1SjA+ZzR0Kn5lJSNhWHROIWgqLSY2a2BfTWJmTV4pNWNXZjdrbyk+YyFpTllDNCZXTXZvaCswWEN7blo9WVF9ZkEjCitqX1N6WHN+RmYoLXg+JChPe2RhOWJZRko1MnRVY2RYeCp9VjZrcFdjMFpeNn1OWHg0a3p7LXY3Qk9IfGBJMHZBV3p5bStLR2Fze0N0M19xCitPLXAmNkMlIWQjXjcoZSFPXyFkKjF1WXRCKV54Rlc8ZlViSk9ILVhxcF4xTzx3ZVImKSQ5ZHsjY1c8O2l6eFFQM20mUFgtYCVCez8jdzwtCitoTz1ZeF85eVZee1hFfnkhejAjZ0pHSUJebEdAQ0okZG9zOyhiZHBGKGxePSQtdUJlbDs/diFgYTclb0pBQTR0ZWU+P3d0TEx2JkZQcUxqCitlZjlxN3IjSGBFVTtOYTJeN1FHJittQjU8VzNXRTIrWmljVmVvIVVleW4zeWdHU2ZEaSg3LTthMlhAK1QybG5aY0E3MUg+SG0hWkFoeFh9Cit7X3dVfWU0YjRxTS0hfjEtRmBYQ0JLYzQ7WT8kdWpXKk5maGgzZyNLPChQIyE5cDRMMX1oN0ojfVVPZjV1PkhTNlQtR3dWfiYkPEx8RyNqCitBcWlATlVmWEMzfGYjcU9WSTw5U3liT2Z+Tng1JmRhOVJgV3E0aGlZb3xBaGlTTDZ+bj1+RGJ9dFNITkB7PHk/QS1OK3xiQ3RlQUpZQytCCitEWSlvV0l6PjZsKyhAdiRuYVQ8PFByIXdKM0pLfEQ/cE5tQzZDQ1pXaFF1YWR6PW1OJmJoSUVzYV5NXkphdyU2ZE08Qkt5eUJWJGorTyFACitsNXJzKSZkYDJ5PyN+OyRaUn1BVUcqdiRYcUc7e2ZBWnwyOysmVmsyejlwMFZCcG0rbzwlVWhOVmtnc0k7fFNISkZTOF9TWkcobCRZU0JoCis4a2lxaDEya2FtOG8yT3cmUkdHWV5KJmtOZWNxSXZiKiFKQz4oYjkmSi1LKilxNGxEJkooY1R4KFFHYzN4dHh7QFo3aT9yZX1lNzR7JiR9CitoKWdTc09jVHJpO0cwSGJxPnl3SyNzZEEwfWJ7a0d4RTQ+MFA5TyM9TEgwYn1OLXdPIXshczs9JnNAT242N1k9eHREPDdvPkFOcXM3QHI8Cis1P05nZylUNjFaQG9wVzZ6P2dUOF5UQCo0VXtkRSRkOyhsLXYpbFhiM2tecm5gK2dmMUwjeTU5dENeYGtpJC12KGgwekNwaT44dDU+WDgxCitMPiR3JDY1LTF9b1dxQ0Fie1QzfklrbUtSLVkwcyEpQWZXcSUzPXc0MiYrSX15TnoxMSYtXjdVT3ZjUkZTTXJefWA3YEUwWio4MldjZHMzCitrUTZ0YklLSEslJj4oR3s5Z0hlTUgmPHYpOGIkWFR6K2thRTxQdmxPPkQrPSlDV0NKeUJVYDY8TFdZLXNlZCM5Q2Z7WDtHKTs7WUlUKGdPCittTmQmb3c3JDI2Mig+dmdII2FDMj4weEFNXm17VzZ2Z3lOaUE3MkBVJEhxJjNgalVEJEd6MFNWLTQ4JDQ7fkxCdndzMyY3PGgwYUhmIUxlCitvcTlIKyhHRHgyI3RMaURgR0VzalVjRT1OdERldl8mamlDdCZKUG1gS3I5MT44aio/YkQmTHdvPWczVEombUNPTG9jRkNeOSNGezFkR3xFCithOEZya1IyeTg1KTQpIVFYMXMqKiZXd1BrTFhYbkt8VnkwdUErV0NXbTlUJkEoOU1LTHM9T1dkMWVjUE4wSk82KDZRQlBTQzFHMTxuMU1XCitaPzs9TyF1UXJeOzgpNHRhQ0hreiFEV001QFJSZEhWVFRePil+UT5PPngrTWgxfmZYSGxSeGBaOzhAYTR6N2NLeVc/PVZ6PHJARzBoZFUpCis+QW8mIXhiVUNKc00mO209Jmp7Mk9FVX49VUg/SlE3UUktcmBiV3pfMzI/Vm4oUyR3Nj12aUVWJFZeYjtPanVFWCslKDdXQDl0cCZ3UHZPCituRyZRdCpjZGY4aGVDVnlDKDs3d19PbE5STW4lNmMqcyVYQlNnJkl2K3sjQStCOFNXZTFUSHFEakxwPE92ekItYTFTdztYI345PU9JWUMrCiszZzQkTkxEM1BlbVIrJWhla1VrK1pWbWJCQFVgWjw3Sk5GWGtfMyhzczwxbVVtZ2ZFT2lAYygkUUFGJmhhM1BLeztXLXRQVkF1O0xJdFZTCitfQmJHRFF2UF80RUtXJnxWayg8Y3RIQDxQN35pKFMxQmw8c0B5VDNibXZmMiVkLVg3P258dm00VjVOUGJRNkkkbzYpTWM8YCh1Yio/WCRpCitePCYkMmomMFZ+dG5aIyViKClIUzwlczRXNiQ4bSgpaSNtdDtRSGhhTTgqZVB8RWtyQGQ5ZHp7WXo5ZExuNmxqUHB0IW03Um8lQnBTUT9lCitCfEokPXpRUiFaN3hAJGM0NiZ8Tk4qe2U4U3grRXUqfWQxM3VIfkRNIy1qJFo1bH4xU1ZuI1Y/IypQJUgwXnhZRXYrMFB0RXE2JUtfU3tZCitYQ2c3fVYrJGs0R1l8IVh1NFUheUt3dypeUShxZGJqUSNLOD9GJDFQOCFeQjVfX0FLclNkant9YUE1NG0lX1ZmPGZhUyg4S3g1PmBOI01lCitUbERUVXBfa3lpRWNuY1R5Vz9gMXIxLW98XmJtNCZPVjxoWlN6ejdGI0ZhJiZHZSpVMS07NkVyT28xMG1sdGRAZEF0eEdSaTA1YWhlNCQhCitpKjQ7YTtjdWBkIT5WYH1wPk9IcFkyOzlTQ2F1VHIraWtkUjU1RWM0e0Jney00N19FJXRUVWxocH00SEB+bzs2Mj8pXmFWVl9DQnFnRFAoCitQXiRvNDFkOFp9LVp+dFR4UkhZP2BLbD1QV2Q0b2p0ZHUhd0JrZ3tyIX40SkFhfDE+Nn0wI3UrTj18aWgjPFdxLTZaYGZqSCFlUXJTNmQqCiteJHZNJiY3eHZAQyN1QW52cj8mUU4jWC1wOX1kcipsdVlgTWdrcmcxbmg8dkc4UXYxM2l0KGlZNj53TjA+UXI4MDUhMlNoPXpHMzU2eV9ZCit1OzxFKj9+NjRJWWNxaV9vSXdZbClzcjgmRz04UU5BTnE5K0drK0tARXQyUGxHX2A2dXdAOHxRJXQ4bzs3SitFdCslRW5oNFIpb3FYNj01CisrUmcwRE8hcmxwfVpTdUtIcihRbUomKnU1aWpQSmBKakxvKCZnYlYmTXNIXiRFNE01QkBtZjFea25CbmZmT3d5JjJARERuMzI1N0ome0owCiszPEpvJXpPSkNuWG47OHNxc2EkZlN7cHo3cjJIIzlyTSVmcSVacFkqQGJlS0RpdTlGTlYwYGlpJXJmZjFscmU9LTQ0KWU/TnxTTVBYem5xCit+V25IXyU4ejdZPjtBJHlmanZFfGkhdnlUJlZDVUNgRkFYb19IKnoyWkdHbCtjOSgtdWh8fithcUwzIVMoQklgUjcrcSo1SSp6IU9DTVd6Cit2N0BrTktuZnxTdSFlYjV9RHleUUdOUCpaPFZoREVqYTg/TS1HOUF3ZStXYExGfj41TCVnIX0mbHFFIUBnOFYyKSstaVY3LXozYV84PHBDCitqTUN3ZjwhSzdJKi1LWHBUaUMhcWlSQyZQMTVTY3QqIXo+TWV+bkUzJD8yK0B7eSNaN1hhWkU2R3lrU3ZmMEYkJloyZWlwSVpadSg3UTNGCisyaTlaTVhKJm0jdnlnJG9MWUJVOWNkSlNeQipKZ3RNP0RYMm0jR2pwQm5eczs2WnE0QW51Si04dnp8ViNKRWttQDNBLUBpYCVaUiRVMVkmCisxKSNkRzljeSQtNmM/WGcoX2xsMyhSY0BWZ0lFcDJ1ZkZSIWhrTUJfWV5mTkprc2V8NjtoYGROMGNIeG5lJTRlZEtQYTs2NkdAKHRTS2FOCit8QDtRJDNCVnJ3Pn19czR0cVl5PTh+UnNpZGpnR3N7MGpecz1Sfi1OVFdlS3pONjlyZ0AlYkNfalM1KC05TXlqfnhQd045PTE+eWtyPVJFCitSNXhSanhEdDk5MUdxKT0xSEp1K1NJLXJgcTEyUXMzb1M1Sk1VNjNRQWEmJkpfZUcrR2ZqTy1WVFRKPUtEM3gzQXVvM0UmXyM7RVZqek4hCiskZHxAZHBEK2tJVnFWJjZ0ajVOJkZOYWFVQnB3NUclNlBsPHh4bGglOFV6RElgUnZrJjJgci0meXwobyFoOHMtY0ViTWphanVMdmZPQHVMCituc3tGQ09pSC1NI0A2TVVYTT0pZ3FoZHFpWXdzPzBVRFZDXi1kPDBNZiZOaFJFcz8oSntEc3dJZmUwbDtyM1khRDdncD0zNzU+aEVtWHpjCitRQCQoPUFnZHhLKypJU3dBKUBZWjB+JHtWJGo5SmF5fT1wKT9yQ1FnO1k3T3Q9dmdFeTh1IUVVT34peF99YFQrQkRscHFpRVNNKT1rIWFsCitqXlAqblRURWJKTyM7YTx8NVd5X0d2RHE3IWZCUEtwRGN3PiheQ2Z4VjVfTDc3fn56Rn52TSheN3JoQjtuOzloPDJ4RmJmbmByVH5XcjctCit8OzBzdm5JMEAzYHglMF95KWU2eGhuRDJvQHBhflo/b0BKVzAhXl9YIXk2O3UwcEJwb3x3SzNoPTgwLWN5TW9WVT1xWTNLfE49ZExxXk5mCit5bEYoWkJWcVV7a3ZXbVpJVX1WbUA3cExsZlR6VjNzVW4pbjNaSVAkPWdpcDNNTT8oRjJRR3kjQ2dRTnNESTtCIUdEPFJjM0F9LWx1Ryp+Cis0aUtvM0k4c09DQTNreF96VVEtQ2h4SjRuWXBgKD9fbVc3MU1INUZTSll5U0VjK09ZPl83Sjs+NUp4cTRrMjN8XlE5I3xOVT41P0ZEMT4zCitKd2wtMSU7eypjRT8rZnZAZHRuYX19e3NWVjlUMCp6QyE8Wnw0QTdBU0xndE0lOSZndWd2TV5LaHNCckdYVy0oZ01BVENBfX5zc3EqXjQkCitBX2ImVCFeLW1GY1lOaDkwdUw/bDB4THhDfX40dEk4MSpURCVSbGRYSSg8Z3spI0crQiRAeCZkPipUO0s5bzJVVjJ6PTJ6fUctdEkhZnsmCishRjFsRyNoejM9TnE5SnQzT05RNHtWZ0Jxc0JKZ1JvNyZkRyZFS2wrYE0tP0xuQlRjMVo2MzI1WGFlWElkNzFfV1BCTGBlc3tyOVJgXngjCitENGRGOChSVW45QnswSU5hSVc0X0lGK0dmaVckQjdFP1RBbWZAbkNnZXJLQzJWMzJ+VWtwKjJpVT1jcVpoa3pAaSUhfkBnXzEhaUpiM1hZCitxb0FeNyY8fjMlPXlNNFV0JkgpUEBHSzt7N14qZzkmV1FlfFZnZGhNYXQtZSVRYiRLU0Mza1M+K0dtKzRSMlRiQUcwTkg1b09tSC1zR0hsCitAaG1EKG4kPyZKOFYhc0tLRWswSiswdjctXjk3OD82UXBpX0dgYWVAMyZJJFFmZUtMSksqS1NOfTR7bE1+UFg3dllLJSMzTE4hMTspI1RSCisjeGMkZzF7fEM9S3k7WDt6K280PyNJQ0Bte0d0SS1+KT0haFNZVl95WXVDeGRoUEtjK1VlSFckKEgrLWxLaWJMen5EX3kpcDFnQ05RNUVDCitAVXxwUHQ5aWdFRWgpeWtSJXw5OH5BOEhJQVZ7MUN9PExsZUN3K1Q3NCR3czc4Yn4hWlg7WCZEUTNjcT8wLTZKbkRLaTVKO2koSGFHYyo/Cit5bEM4e21fUTIkQ2NSdU5gMWQwOHlhYnEyMj5UMiFRP093cV59VGVLNXB7Ym5vI2hGWXB6e0dWMEooKUs+JDF3MEhpMGttITZ5MiZfbUl1Cit1S0UzQyZITCRTQkFPJldAKXpLUG5semM4fVdKRzdeQjFOMmg7Xk4pTjVwb2JLRGtvNGJJcH5PI3BJYnp9UTI4V3NpMG9NVHUhQk1iUSlSCitFTFghJWtnTVhZO2hxcFY9fSlXK05WVFhqMyg/dldRUz9SR0RUNzRWaUZeaFVnSzlOb30oKmJPWmJKN150eUBuV2NAWHhPdldfaDNiRklVCitxcXRLSUQ2JCMyX1U0Ni13KCtjbjtfRnkpUlViODRAOCowI2s/KyVrUGxKJipDKXJqSEBLYG1GZkQybS00UX45MCYjKlA0KGczXk4pLSQpCis5fUk0b2ttQE1YaVo3QWFlYFdFTFdGJWpTZWheZmY9X2xRUjE8TXlJe21Aa1JFK3E0KnIqLXVTWi0pVmFPfjhzQX4+cUJEaGZNeTZjP3lJCitCeF8xZiFZTmdpYSNkZjAhMHdCWWNaXipPQGx7VEQwMD1DencrMGc3JV9FPzNAVm5BSnZ8UW95ZmxjR00md2Nge254VWxudj1lK25mKm9ACitKR0U8VGRoWjlyOXcxR2xyU3Z8RThtY3ZTd1M8ZCtSKG5pXnl4UStMamZSUm1QZCo2aUxlQjE9UzRnVWtTP2piX1VBTmJNK0x2NyNQTXArCit8cFBJeGhKcnB9S3EtQFNqXkkzY2tCRSp6LTdOTmJofigoRkQ4SEg1Qng2d0JVQiM+YiRVKiVBO3ErQm9xMlhzSTdVMj0jK1Z4S01oNCtHCitAck8lRSRKVjFlbj1sIWcwM0Qzfj1YRVczdGwhI1d7QFV0aW90KURJdig1XiN4NXYwX2xtRU9heUB5RSY8MW1QUW5jM2BwRjckTyM/ViokCisqekRCMlhaKnV7bHFibEt0ZE5UbkExTDE0OT9VKDB6PDxMLWx3ST0rPSZVIW5XMGxOcy1HeSN2Sn05RDNua2V4Qm1ZVDtTK010aXZXM2JGCitfYV9kcyVxNFc7ZkpLLUVNXlhBQzVYTy1DTytzWXxWQzVpMTN9N1BBLVhLNSg1fE9NbjVeITslSW02SjRHJkcjSWV7ekhsbGhWMjhIVytjCis9VmB3Mj1ze2p7P2VmTHIzZyFRXmg9Km5LJD5KdElDNDBTP1VfOClhN2E8NUJKeHhNIWNlSlRpaTJGeTdxJGUpamY0Q1drczt1V3tBd1htCitWJV9EYVhAX2VteEpQOWYhcFhOMyR+KnVXcDNAcFduaEJZcz9CbUlIWH1LWFNDbV55JFkpUjVCTkU/QXBrZGBqS1c1d198PmNiODU5ZUFhCitkQWQ3VEFlMGs4Rz90R3lZI1Q9MG1JPkF8cj84OU1PYzkjP3NuLSF1dC1yamZWS3FSek1nT1hYJSswey1aT343QEtRMyMtXmRhMiU4PjxXCitxKm1JSDRVPDF7NFh8UnNMNWY+aH5RcncjPzBMUldZPWU4PHRLPGd2SWMqMDhaakYzQyNNbEptcH02KDRZKzZjR3Zfa256VVIra3ZvS0JuCislKTRKQ3AkaThyaGpqYCNSYypUWnZwb29BZWZAMHI3ZUBnPEpOLTQyX3BAMjV4Xld8dnpweD5QYj99Ukg4KnZXKWkheystNWM0JSgqanZBCitGKzd3TGlVKmJJYk9BP2l2dF58KT9nZWVCTF8mei1QemBpYHJnbm5AYiF8MjY7PF8oOHgwblp6T3RydE96MnBLYSRzZlpaQjN4WmFNYVp+CitgZWFGSWg2eit9TkdYRncoa0xrLSlRKn0hYE5JaVVHS0BfaTdTWEh9cCZFOHhPYG5sWXN9Sl8xYFIoUWgoPmE0YTNMNWslbExVS083YT0pCit7e0MzYldzTTtyIXxlbHZwNU5KejtvaTspd3diX0V4YEdocXF5WkNpd3lZeCsjcShFKStFMmNUXl5YQWFGP0ZCRiotPUIjZG85cD5VQk1ACitmWnFhNC1yeVVQKmNZb2oqXlQ0M2k1NDF7MH00fDJ2RkN8TE0/JXNUY3tBSXooT0gqZz8rdzM1I09QT1NeKlZWczVNWnJoMXZrTUF7NTcxCitCPldvamdrQH1EITEkYjVDP0lAOF8+JnNaVU9XJEo+ZXBZJHAmOCtQRDNGaXFwb0Y4aihGRWxIVlFUaDltanJNYGZfKl5GUWg/fXh1cVUkCit1R3FxMTM1cFY+blNDfTtUMFUtTjR5WTtmNjUmUit5RCN4MlkyPmJ7MTxffCN+YnFyUDBqUEN5YztQY2l5QVI1ayRWRDlNNTdLdDRKcFY8Cis9Rm42ayp+NGA5aj9AV3lgUTEkRXBJSlV8PzBES2gjRGVAb0Axc2sqU247VD5zSVk/PClMe25nbUxKV3JmM2pfJHE9TjBFaTBwJFo5P1V6Cis0JUNXUTJJd1hkKTVOTTJ1U0lDTE5NfFBZb153M0xXWWkySHZuUm9ZQj1HR2hONGF2I2VmS0xlRDE+O2ReZHI4Uzdpbk0pJUkpXkRKWF90CitaM30zMmJ5NDdmTEF0OFY3TXdVP09qdyZjQHhMKnZrfFJXK1N7cEYlZ2JhUGwxeylPbH01bWg5OE98VWdvMjNoPGBwN35OR2ZySVFEZ1N4Cis8X0ZrN0hBPCM3XnFHZ15pck5ackJ9fTZ6eWdNYUhOIURkXl5yWVFuKCpjcXtQQHdMfmxLWEx4Kz5ReCM/UjVZWjstPHJHU3paUkBYM3VmCitVT2IzODJRfml0YFpONnw9RHxGRnkxLXJ0USktbH0jY0EzRC1mcnp+e0k8ZW8ta1Fee2didTVMN1c8PDB6WW1rQ20layorRUgxelchIV5lCitPUjJ0RmI+KXN1eSR7dDI/LW1XX1k+MmZiKnExdHs+PEEtVHB2N30kNzc9P0d+OE9Kfn56MU43ViMhWDY0Klc/TGBmcmM2aXt6O0pmXj82Cit2NiM5P3NENF9rZlFYbyZyOCljbiYhNmRIV0xKSzcmbUwmU2M4ZnkhLV9Db1olN1IlK0FYTDtMUUZmPlE9O1g+UT15VD5RPX5iPks2MCFCCitmdFgmcXF8ZUM9MH50STw8YT5PPmBaeGhlJXRgUVdIe0t3WEBHX2tuPTY3WlZjRTw+PTBCcUduSn1FamhafjV7RmlZcmRnb2dYdlZlc0UpCitAKG9RcEhAbCV9WFgoVUNUJDc9dzlAOVF6YW9FYlktZ3FlWDstUjtnRmhidUMxTHBUWSFeSEQmcGtaUXU0PlV7eWokcy13enQ8UWg5Xz8hCitxQmJMJUA1K2ZHN1loczZjYzh6SG1AJGctUCY3b2syKmFVczI5b0YlXzt4Zk5wPmhIajdxWXt9T0hGVipDOXMzeHx4UU1yalgmMiRHV3J5CispczVTd2lINjxPMld6Y0MxJkFBQjFQLXhONUlKdHRMcHold0YhXygmUnpWK2V1cHpJTEYmQE5OUERDcFRzIzs4enwqWGd3LTw0Z31nbzApCis+TElDeXpYM2c7P2ZuKVFxX2RSVGpYQihnLWZXWkxgSU5BZ0A5YyNNUiNwdEdHfGRvUTRvNykqfExjJnRpbUpUTDVQJHY+d0dIMW0zLWomCituMHg+ZzJsVSs3IUIyQllCZHpfMHgkN2tuK3dIem0+NH1VMUN4YiRWVz8laDR9c0JOZlVsTzRmR3ZFJElGQ0g5WT0pSzxqKEFHQUEqWTA5CitTQVJ7d0VEYT5XUmA2fCpgKkg5dlhhP2NQUG10fVdwa2BeelZhTX0pUH5MPEYpNUA0fDx6WDZFPVRVNCM0d2l3M0xZUjwpPHgtTmd5Q0cjCit8SGkhPyN5bzhFcVBfMHtFP0s1X1Q/OEZTYDdEdGdkbkx2YV9WUGsoc1MzQlgzX1gpS3t7M0MkM3EhMHo0SW01Q0opNUZycF9ZX3UyMXdTCitPRTRgcDU/e1o0PzAqfDlgaWNgQHpGQWRkeThadD8jajchKF5FSFZ0MEUkOzdVITVxOT9KS3E3REgyXjgkVihvdnI8bjNXc3U5JExXP29SCitmcigxeTd5VXVjZDxSSnxSOWdHQjs8fiFVcnJVQGVYMjxiR2B3QjZDcHBUZFFTQXQ0dmFDUnkpZUs3MHZlMU1GSFY5TDlKPk5pbU5ifmlHCiswLUtBPWE2TGQ1VUN5QFdmfDljWTdDP293biV1MF9qRX09Q1V9N2I3Zn5DajdeU0kxO0FTPUszeXcxMm9nRD5MYHpMUmMjSTQqdnI7T25KCitsUGx2UG5RX31WVG4kSmw1NF43aSoxbWQ+bDVqMiZORFk4KDgweTw2QHpwKyRMK0BaIyp5MGZTaGc0eGpJNkBZKjB1byM8azlVb0RrMG9eCitCMGJsIWNgX3Zfe1I2RiYpaSVBTHRHSmo0cTZjVChSOzgrTnMpMzl1fVAoXlIlRj92RTFmP0hEMk9VZVgrVi0jN2gxXjBuU01hKnBtMWc5CitGSWUlZT8xZ0ZiXjFtTyQhZldYRmhCeikrU0R6MUFDOXJXWG91Yys8PXg0dio7Qi1OXjNsZkgyZjhKWDlIfSNacThUM0dsakc2Z1N+e0xeCit+Qnw7bGxVQFdKSWVYK3dLQUB0RTdOYiY1YCpTKzEzPF9ZeXYxVmRaUnxlZWZqdU42MlFIfGplKTUxSj52IT1IfFomMzNvcVE8KWAkMmNZCit3PWhpT3xicSp3clA3cyVyPktSaS0kY0ZFTktyVlktazVAd3YkZUgkb09uYD5xR29icUo+eVJsIWpTdUkyfEUkdGBLPTxsPG8tTEw2b0l3Cit2OzYpSyEwZXFIaV8taDl3U3V5NygtJn5vPT9FN29zMD4lb0dSe2c3dTBZSHtPVDM3fDRnOyFDLXhxT0RFaW1PeW8pKVBIZyk/fVZNWVB4Cit5UWMzSlMlWFVLYmg5ZUohKVYoQ3p4dXNmMjhSY0B+UilpMX1YRXYrSUY8ajxeQkhfVD9uTldiZmM3U29RLXRFUFIzSllhTEBaMUNAQ1YwCis/RGdJOW48XmJXa3pAa355MSpzJEo1SnZTblpLMVp9OWBvakd9ZmlLQ0xfeGtnZExCLUR+Pnk8UjVfKyRjdkdVZ1BLeHI4b1VhS1d6ekFrCitpK2lVTGpycjBwRFlZXztGMFJBYnxpYlQmVmFBMF9IWW1wQXtlODZ0NVBlX3Fla0x8MkFIVUYmUDRHc2Rpd0hZWE0mXz05R3xgZ2YzaCNWCitoVHczUUJaYUBrZCUjZ2B+JG9+NnpqKSg7dkFXLTJ4aTB4U2BGWm8kMDs+QkEqZzUrbUI8JkVRSHxhdCYzTkkrdEFjWTl6SjxFPkI4dlRCCitXY0dkPmFhRCpoNVRYUllWMlV6NzV3VkpRT3BOKUhGRiN7TTlyY2Y/Kjs5QHIocCl2VGZOc0h8ZG59SWJAU3V4MGR0RlcjJXFRWCFiOFg7CitJQkpxYG9ERztZdW9sRTc0QmRCOypRTmlgKWs5Qz4qV1VAeDR7UTN0OGs1MVVINXF9XzlPdEJFQ0VCaVExITB9eTwwUXF8SCl3TU9pWGdMCis/Rjc2Wj07YVpVcC16V3hLQTNiOU1+MHJ3OVQrbF5RJFdwbWtuKWhFIXhmZ3VyTiQqX2VCJSNqNnZlNF9YXnRaRHhSa2MzOD5SPlNRKzQkCitGV3FSbmVRWUZgbzRIPkJDaV5wOU5iPkJiKVQlaVohbFR1cSZsNVB+OCtVO01GUkBnQSVKSG18VSN7b0M+NEBmaEtIKWpIK1o0WDN8JWB4CitBNHtQMjleZTdGR20yMkQkdmBzKyFAS0F6I359Z3ZVYm4hKTIrTGVxZTN2UVNzci1iQnYlTCVMbWxFXzM9S3heOUJqX2pVTyMzKUBqdXdLCit0Ml90PyEmO257N0lmaFM4e0lwPTV+Pmo2aENHemVnJT48UUVmYXk1MHg9aGU4NHljRzQyaHchS3V7WX5NdlBpY1YrbWImIUJvcStLb0NRCitzWih9TWtXNWs1fDc2PTRZQj9rTVA1WD0/eVRjNmZiUFQzTTgqZDhtI2BaZVJYTWxMUTYjbiVfRzljSEZ5WWs3PT5aQUNoUSRWT1JQdWh2CitJRUFma2x9aUVIYUVkIXVqSDsrTz9qaz1HbkJLJiNAKGRiOVFAb2BrNSRubSVAZllmbyFaVk44Mjw8cn1NSnYlXmpsMTZCQjtoPX5PVih5CitxbX02NXU3UThqJTRydkBrU1RWP3VHKVdWQkJzaThvd0hVRUE2Yzd7c31lV3cyaVJVaSk3d19aKzRxOV9kJk1GQzZubG1xJFUxNEBVJTBsCis8UEZXeitxejItdklAfkpDYmJod3F3eD83fGZ9aTApPT1xKHMkTiRLNEYyY3l2PyN7MEdvVTVYbnNgWGUjdlNyVWVnRE1Uc0o7QnU7dyVGCiswSnFhTG9MbUQ0TVJpRXtOQm1xXnpnY1J9Mn4zJWBjdHZJeyt+SjdtKDt2dUBnO2xzTmckV29TUzZKRFlfVXVkPCRFTXFpNU0yITlAbTE+CitvbHRoSVNOTEdKa3A4Q0hKcCllZyZhMkBCUkJAKSgzeWNTfEFrc0E+S0hqPSN3bEFLK1gwRWwkdT9BVilObzF9PVo7QjB2bDxRI0R3USNCCitrSTl5M142TDdnIyU/ZzY0e3g+IWJXLWlgYitnXl8/d3RaV250S1V4Uzh2THV8YyE3diFPUU40LXRrVVNkMWRwNVI/THRVM2VFRncrPGJ0Cis2JHxDPShHSWJUaXdRMnk2fVVCS3MhR0Y1UmI7dUBQdno9TUBia1A7TU5wTDFwRF9LNkpuXzBXZU1DPiNqVWUpQE00NXo7OFpfNmM9MnwtCitoQUZ+a2o2e0wyTU5jREFfLWtNVjU0YTA7fH5lTmVQUkp6eEtPZVNqRmN1RV59JVVpcUNLUiMyODJmdzwyREtDM1lWeWA5MX5sZmpBU0duCistM2NYaDtlYnQpa1VxWVZzUTxDaVBTb05VOEFGJXNSdFViJkJQeElvVF98N0gydSQrM18meTRUVFlmOEtOcE0oRjYjbXJrbHMqRE9BSTtECit4P1NBLTZuWHs9cmVMWDRKOGI/VmotRSlCVj1HZClJJEpLUClmRFpgTmtFS0RaaUpGRkpoXlQpQnJ7dmM7NEF4fHF1fmtXb0ArPlJ+OHVICis2UTBVX2N3aDJROGRVS04rP0VSX2NOI2B0PnlmfENseCRwSGI1WE9vUHJFaWYhVWsrSzVaKSt1UDdLYW0xR25zaFo+P2M+Y2h3MzUoOzE5CitzRkJybGFzcnN7JilvI018cnxFK1gmfiMkZW1WM3FsbmZ2OEMwQjUhYiReayRIeFUrUWotSzM+WHJoUEojY0tBZm1Iayp1bjw+RTxYdH4wCitpNSloWTNfR2g0SCs1dm9makVCbilrYWk8d2smaWNjdWtnJHhwPz1WRXRZOCo5YE5lYDFsSz94YEk9YigmJnB6PnIqREBLdjJnfmtLSipACisoZDliRnJJSjEhZVA0PkNIOFpmNiFhKj90ZWQmeDdRMSY/Qz9uTF44JT51bWVrcVY9WiRqY3g+JW80e1NzZHlPPj98WTxWSCU8WT5EWj5tCiteaD9EXiV4dkJMYjg/WUdJWFdDPCspYjU0JjtEOU88QUhQOT5BciZ0VyZLT0tMMzxuSEhOS2gwWSQ4N0BXKWdmIzQ+N0BXSlRxdjhoZUZtCitHdkNIalU8MXorS2JHbFV+Rmg3bDFYcHJ5JjgofTs4cmd5M21VKi1ONFhgNG5eYjZzZFRsYVMrZjl6KTt7OHErQyU4Y3M0YyZBX21pdy1JCis0VDIoeG5pXzVPQks1YzgoV00oeHJLcjwtWXsxQ2pLa0lGMHQ+RDxTS1pQTFFlM0NTQipJVWdDMUMpTld6TS1eaCF0dzM9d15UQz1IdkdICit0XjBHMndYLVh0X3xaLVRQaVErZyN1MUNJdjktZE5TeU1YNlhzQWJZRHxzdTw5UWYpM1VAKUs5an1BZEw1cEt+VmV3TTw9RVI9d1dZSCZtCitpMkBtR15ic0Q3SD8yX0d6JlI2bTlIMDV2UGU0Xm45ZzJuI3FGRmpMI25tQk1UVFloZk99U0FVaD9RK1opbGwjWXh8M3N2IzVsKFFoKzh7CiskTlgtfDFDYFZ5dDFuMVp4UWpKbk9ifnZ5d2h+NDFiRz08YD5TdD52d0lkO2dVM09pMFNWV2YhMU9jQGhqKEsoX1JPcFJrQz9gaklrI20rCiteUUF8TH1Id288WW5vMiFubWQhQEVAMFJfN0RITkI+fENCfENFVDZgLTshNEpOYnFUeHs1eFl2X3ptTVBzUGduUzloMXVXOHNLVHdDKjJ4Cis7fEkqLSomUXBuUnhRYllQQUVhR0cqPDMlO2IzJUNBQTtVQHpUZjJMJDs+T0E4VCVvN2ppc0FRXjtTI0IlMmhtUXFNNDNXJU4pXnJ7MVY8CisheDVQYXh3THB1eWpJI2I5QE1zcFlmaV9ePnt5SkhMPngmRklBbTAoS2dyQFNvLUl5a2RlTzkjNnFAcjZLQmImWHo/PDRFMSh1QV48aHFHCit6JWl3MUk3SWZ0a1B6MVVAc1JyTGhBJlZJc1B7S1pgPD1LbmAoZ3dZblFHUEBXe0pUZzk1YGxBK20xYkMybS04Z1FpdmpAbilheU5VVDlGCispSWNAVTFXI3dgS1ZzTWF9LTYhODVyKTQ+V0AwSno7bjxRanpJKGBndm0tcTh5WEBgRTVYQVRqPSR1bDhfdTlsVzFTT313T0NnNVo9VlY8CitsSHBARWt3MkpzKkd4ditsb1BDNndwcEohbCUlOHU9O3ZKcmdkZm5fJlBPe3s/RHcwR0RpQVhIWl80byM+Q3NiNkdRWUFgKXRGPWpaRDR2Cit9aF45YFo8PG1qUig8PHt7ZDQ0Png5KHNVUXdGRWFhQXg0VG8/KGI9PExuLXJAfSMjM0JXZFElOG1iI3NsYWBnVioyfms2czgyZDFoMEJsCitKYXlBIVVWPT9TZEVsZ2IxYWMkOHNpOTQtLXZAa25CV1Q4SHNvKDEyZTNaMj8xPm4/eU9yN2RYZ1VzeExtbyVndDRMOyVaKjQwRikzTCFJCitBZiF9JSpyYzhpTH00cjchaUNhbk9DeTNoUHVlSUx1UlIyVzZoYlkmcnM4dTZVQVNQKmxTWTd8ZzUkWCgtMW57IV55PTc1QWBUZFEzYCFjCisoPCl0T1N4WitNSFFRT18jfEstRE43RXlaVGtpXktAQ0xzYGVVcXoxa016QFF5ZWE1S2o5VilgfSFaMTl5MmQlY35SeHN7Jlo0Wjk8P2dpCislbns3cm1YWCh6c0l8Mk9lVEM1NXtkTkt3JUpBUyo2dT8+Zkg3aXQ5TiRAJT5WfVlXX2ZgI25XciUkQC0kJiZodUo2WnZPMTdIJDRkPC07CitlfjghNGx+Vkx0TSg8U3pvTGkxMGZ6anZzbVpudkV+SGpfcHopRlM/XnZzU1IqJXozJDlXPWY8PjRUWng+OWJ2NEc9WCFeT1ohJDlkJiRTCis/bjgpLSlHcHUxcz9sNDtMZzQqWj11RGR5QWdyS3c/VDxzZWo5V09ndCFUTUY1dlBpc0xjVzI/ISREbGRXWW1vXiR2YjEqbkAkSU1XaClsCisjZTl9RCN8ZX4xUD1yKHpAVn5hWmkpQTlMKWlvPTM3b0Nnc0lYZ0lANTtCOTx1MXt2Smp3UW5QQ0MjMF51TmhzdjZOenRETHpGOXFXWilnCitBZy1QKCR2OHRUKEZvJld6ZilzVyhSPnp1QCpvdlVKND1uT1hOSzEtRDRebTdVYV4zPm0tYGNeWUtvLWRecGAqMnNwd0tKYDMrelo3czB0CitDaDBJQGhKQUB3ZyNLQ0pQUUw0Sy0+Y1YtTUQ4QUV0SWFPVms9MV9KNUomV01UUCUzckk5MG9zaGFwK0pZQ0lFd1VyWD49JDNHXn5yWF5pCitzM2k3ellCNWt3UiE9Q3lZRFA/d0J1LSNuejVQdGlaZnpDMUhIe0l+UTwxe2s0V2NxdmF2Nmh1fUtzcytwZHtMQDFAaztNTjRmQm5yYzhBCit7MjBMI2xsYzR2QlhkLWtheGFDMDteSmtnRVhaQ1IqNklVWFJ3Tz9DTFImbmFXO2xwNTdycCV2c0Fua2ZxQThDXkdIdXMoQ3xSZyEzYThHCit2VWdyX1ooUChDKF8wO0d4bTspazIkbCU4OzRPXmBqXnxsTkJmQzEweUVlRGltRzN4JD5LNXhvIWY4WT5tR3ImPEJKbTA7MjlPYUxLPkl0CitXSklDZ1NJWilgJl87anF6M1VeRikjMT1lWUZ4Z1JLMGwpR2h4KXx0Pz1pLVc9aWxFUWdSdjBxa1YoS1Y7NU45QEtGd0VaMikmWmlLblNkCitZcnotQCE0Jk5eakQhfjI+SXtqO3lYbFhHPXNwNk0rS0x7Y0BGYGU8KF9WISNqcCpZSVFDeG96Oz1ONHU9KHF1cCVEJD1vUE9GVkVzKT8yCitjY2FXaVRKQ1B9UUV0OShqKnFKbj5KUG1HPnp+VWJjZE8+JWFtZ3I8czhEZzg1ZWgjSkckI3o/PDwzIUhLKXJWeT5uMGhebnQmaVVXNnVfCislLWBga3V7NmZYQTNYeypXd24wVTgrc193JjdNekFAOzBtSHFxdk5EazZAYj9mVGtLdFA3VzZPQjxoeSk8JVNvMSlZd0dOOG15V2RuNFE9CislKy14X2xTWWk3b2trUyFmM3s/SXZsSVN+bmZKezFHKm17WnZkQnJ4STh+T3gtV1IwIVRTNEA2UkU4V3txYF9zQkwoNVFkSytUTTI5antKCitoKXxaekRLKX5iPXBlWHBVLTYzdSNYWnE0VGp5VnZRJTN8Py1YPkA8WjhSPENhJFpXcTRIQnRIX1cmVVRCc3RiPU48NVhQKzxHMlMwQl5qCityPyZrK0Y0SG0mZ1N4MWxydEdmPGcpWTZ2cnppakVTIWMmY2ZSeXNNMH1hcHtaNjhKJCVqVFA+NUh3I0xNWVBnfjs8QmVPbmpPKyEhSHt2CisyPVpXWSUrPUsta1UjQXtnUWo1ZlI+T0FKZH50TkohMSh2ej9kI0dCK1RCXjFVTXI4OztvbTk4TX1JIXQoPjFLdnI8MURvZjAmQG9FQndFCitqKysmNE88Rz4hVVpPNCZXZ3FlPTlJLVRBK1lzKjFxQChMcEkxUTdgRjBVP2d1VjtEbm5+IXcxPi1XPjVLaj9nWXllQ29ibTBOPiE1Tn1XCitINm95c1ZEIzFHKVVFXzw7USs1YGsmWH5xNkVeOURwZ31WWVEtJj5rS3h0Mk45a2wlZlB+RW5WTXNSa3s0NDQoTlMjNEA1Z3BESGtILWFUCitpWDcpRCgrYWomMms5KnlgbWdwSTExdWtQZWpOTTFaYGAlV3FWNFVBP29EdmpDeklYJi16Y0o3RFJxfT5tKzBkaGFRPURuPHNkOHxpbDtOCitpMUQpZ1MpMXZfYzUhXkBPKCpgLUYlSEpGJCZ4S3U1UUgyVVY+ODZyTUMwa2M3KT09ZHBTeEZ8N1hPa35WUmRmMkJ6KDdEdXY1bUBsJnFOCitaKjBZI01IKCpVKkl6JW8wMUNHTiF5aUc4cWgre25vOFU/e0ZmSDA1JTwhUG8pbUtzOE53NDBiRHB4TzhwN3xnajJMNlFWUjI5QmF3aiVCCisha0pnMXdsaF5pKmFacjlCflZBKnR+QDJaJTJrWTctNDVJVlZ8cTg/MXNWQ3M4QXczWH5ybEs0MUAmQUg9Qm43UEc+WDMhMHk3Xkk0NUs9Cit6bnZgNnZ6RH4xKVElZFlxXjVeNHF1OHopNFRnKj00KjNjd24qTk1WTyhPPUVuSFNNRFA9fW0hSmhFWi1QQW1xNExRbDhBI0BgPXlBJHgpCitiYWI7XikpQSpKREJHe0YpbWR1RDskJSkxT2Y5MEBpbWlXfm5EQzFteittZkM7alRrR0lHP2k7SlNOXjh9QG5hdz5WNDVpS2VURk9+RDN8Cit2cW1WaCZPMihaal5Idl5RKmB4QXpWVHdJRFV4fEtnOUl2bXlFenlUcX1yQHwqZE03WHBfQUZ8RyFuLW45VUk5cVZlVjdlREVXSGBPQEhECitOZzRtIU9LdyU/TWJ4SW8qdDRDX0EpNjI0Z3xiJm5Kd2FELSNrPEh6U1peVitVYXcmUX5kN00ofGFOZkR3Rl5CNGgrenI1RnBZIzhyd2hXCitCNGtDVjJndm9mSi00R3VGMz9PMWFAZiEtLSMxJGwjekVTKDFeVEMwajYtNTs9Y3V+Q2pPT1JlM3YzKnhWVEZaT0FQSyg7OEgqPzU1a2RJCitvTGdWSktQTHA9ckp3PiRzMjA1UTlXMW1jP295IUlEM3c8dVBfZXZhNWVhemlNUX16VmhCcm92IWhxQz0wKmg7e09VQjQrdClkVzNJaHV8CitgZTFqJCthUHRCdzRpUihuMHg3fCk8YUx5e2xHbmtheV8tUCRpSHZqdkY+O1pTNG5zUylHU2JtaWxPTHdgSD54SjFufCVPI1BFJj8xUXI8Cit1cjI/RjAwbHlLbDlwK3IwQ2hiSGh7TEshPDA/aFRTcSgwREpSJW1zPChmKGE9VFAyc3k/TGUxY1RJPVU1Kz4tKHdCUShHNyZuY3Q2JnI2CitSVyZ0KSFHZjM8MHFjXiM+OW02WkxgSWlLcFp0eC12SURBfkAmOTZUUWZkaFo+TjE8eF8lTlI/dnUwQkNuajx1PTJ7V1czLUp0Vmg5RU9hCiszZCstK296P0ZYUE4jRCQqX3tKRnxVcVVoSkxmayFmM2JJKTR2amdtRWx+I2IwNU09VXhyanpMSjJPI2QhfTsrYXxvV3tedj55dztoYihUCitNXyE2akcmMUVGZ15XOGlmVD5WZU13IXVtI1puQjA9PlorV0JFYEIwJCl5PHMke3gqKHpgUU5PZVUmRzwoOXJUQW0hTSkzVD4tJjJ6Yjh9Cis7SjY9LSlHbj4+PT4zR2U3dSUmaGNsPDw5c0NFQmdnVXlrRiQ+Q3NAc0lzIXFDZmp9eUdBeWReYiZRX30wZ2JgJTJpVUxDMDUrLWFqUHRGCis7KGFEbU4tZ2NnQTR3X21eb2hCM0JZV2diaSF3ZSFNbmsofn1adjlMQzMjT0kyeEh7RW87ek0xcVh2Yn5DcHszT2VxNUNxMStJSnA4TmZqCitTYn1FSD5AdUNuNXFaOTlYaVo9aSFqMVB7Q0l+MzxjdWFpe051U2Z7Rn53ZkRufGpGazxrUEE1TCVkI3RmIzxGIWMjZSZ1QiNxcmFPUXVmCis+VzklR0RqNiRaY3Q7dyRqN1pQNGpwJmRpPjtjZlZeWDtkaVZaWGN7SUZ0Y0tTflFPSSVIIzshMGo5e29ObDI5MWZgSCMkWThvYDk/QmFjCitNWWJ3Z1dLcGErV2NaYzxeb2chOWdFYHVkeHAyJHtsLVVPbmMkKHJjc3ohKU1zMkp4dkp9OXBFMTYjTmxSPkEzblZgVE40S084IVF0eD5fCitMKndgKjZ2U0MmTjQjfnI8KUN3VzhLfl5AMylgPWBmezBSbXE+amFqNGgyVnkpR0ZDJVc0eGpGJE9+bUBIczZAY2xBbkNoMGMpPVpVa0hXCitGVHBlI0d9ZGdwcjMtK0lOVjlVXlY9OD9YWXIwdnhoYj0wVE5+VnQpcU5xMk9iZmhfUzZKTHdCZnojMCZ8Xz1+RHp8SiZPYnduTlQlbEZjCislPXJlXn4wOUNjcTJgTG5hUHgoYGgpaDVmRUh4Jm4wKEZZUkBAZ1dTKkJxYVByZ0NNcVQ7R01kQTJeUmY0fTdjamZPQ0FHRTtTKjlpS1dRCitZNHo8PzxVY1JoRitgbzVJVG53R2UkYXg2QUAhWVN7ZnNxIS0rcygjb0AkTXBnSWd2aDNjPzc0fWNDeE95RXZWWH5SRzQyZXBWVj1MfW5UCitmYkVPTkx4d0Zweik9R21GPkspaFYpX30lTnFQaHBEPUI3I24wY0JrUFV0Jmx1dmxZYiFmZmE/e3lkeHUzXiY1SCQtQWl9TlBEP3JkNHpiCit5aDcyYzt4aEFuPExsUGAySCZHJlplVnlCPUVCYDNsPnZITWZ1S2NXdmI7Kis7MjV1fTZ2QFhHZSVyMyhtU2xNTSRNJG8xdDNKQX1KRmd4CitMJVVeUlM2bFAwaTtGSzw9QWckLTRrJktnNU0hb0Y0cCRhc1dvJD93KCFZYE1ofkFjVWlmO0ViXkVqN2FmUz5wbzY/JH5kSlgqYiZaP09XCitTKWdkWk9JS2QyR0gyRiteNU5nOy1fdVo1KUIpMmsmTUFVVktKMlMyUGYpWWNDPVJGWU96MUdsQkl4SDN9dVpMb287OWwyYnBhdUZqZ1d5CitnQjx2ZlVOPjk5NEozIUheayRTUlY9OEhuUjVZTGMla0lgX2ElWlo3U1N3ZTZnPyRLV3hTN0VtUlhFNTA7RmA2YmpwaWMqOXVDWEtwKDs5CitSdFJ6M2N0OGx0SkQ0enZ2UH1YNld5YER9by1rWTE7WDJzTGc5eFZ6YU8+TH5XTWkpKWwtOG0rX0R4P0RAK0M7cW4qYmc4KFhASVMwKldiCit6SGNxNVlRfW5NWmI2UE1AdDlsWjEpdj49dDtsJjFzbFBaK2hLfU82Kkw1XlRWQFJBPjx6fCZvMnpLXzJvdXJXcnNjMkdLUXo/QEt8dzspCitqPiNEWUwlRFc5bW92dEgjKmZeZzZmaGJyWXd3dXl0dGF9Tz1ITlBJV1olPD8maXl+b0orTDdhUlcwWGNCcWFVaGAhN3RGZzlzJFBuPkEhCitDQmApQmJxQjxVa3E4Tzk1UUNQI1NZXkV4LTNTMGJGRHg8RyR1V28rRS1xPnZXOX0qNnZ+PzxpSlY4YXx2QklWRFZgYEVaYyopZyRZeWVBCitmSX18cSpAPVgzbmhZfG0wXl9sRUUqYkA/PjhBJGRKeVRyYzw7JWlTcTRPRTkhZHNHSlRpK1Q/MVE2TyZEdUhhRWxKME8/TEZWMyEjd1lPCitBRFd9I1pTbUc4Sn43VEJZantSKiZmSitXKmdVMj5Maks5WV4yQG5JKD5GUk0jN0ozUnZXcH53WE9tSDRIby1DPDchRDg7SzhRMEw1PWxxCitIVlNVVDUqK0tmYFlxdk90S1pzK1kzNGBoUSQ4MHRTcCtJT25rak5We1l+Y1h5QDdAYHVkTSZoYDtwRjt6dk9TUTRyb3FVRGhEVTFNJE57Cit9LUhtOCVvNVF3fXhIbHZYODhDO0MwTGhVa2I/Y3ZyX3BVZTVmSVR9SW1EWnsoYytPQ0RwPUJvRypBOW0yUyZSaUN1YHlyenxRNGJsQVdGCitpaUtjJko9UXQoJUJGSGl0XnU/aCpJSmR4Mn5AXmlhcVBWKHtePUlSelU5PHoqfHQ+MEF7P3MpQ1hjSlZYK2ZMYV54LTBMfnZjN34pTCpJCit5TylKfDFXfS03UjI3WSY+TH52bis4Sk9zPGR1RlVkI0s0KjhSYjJONU54UmM0VDIqJWVUdEZvfS0qRlJDYmltNSg3SX09JThpOSFoPz54CitDR2t0THt0fXFBST4rVXo4KnlsaFlgTDJfVnomcFV5eihSME5UI21mQm5vcE42M1cmZTtCbUFZZHk8V3d5PlRXNGd9Z09FRz85fmFsZ0ReCitMVHAqa3xHVjFWX2szT0l7WnV0WCo2VEVlUCVTUnE/VDVqZG5RO3BFdis4czhkZWFud3NvV28kZldpeUsmTzF6fm5FMUlRc25+RitpZlF3Cis0ZENfUmx0Pz0wU20kMSNsZi10ejZZMEhTczQlKztKdz9ENjFaYis/JnRZO2F4VkhXeXQkUDRlNVhYNStZWnJWQGlLNHh8RXtSb29zVlM3CitSVz12fCYyTSpWTkdvPnZRakJMX1ZgaTU9clI3MTExTi1OWS1iJEVZQVRhWUJNKlYmRFo1ODFYPyZTVG1IPExlQ0NnakFUOUU8R3EqLUVLCitSWTlEPG5YaWJjP2ZLYnEhcSYhSHQ+cn5qbHJkYkZFVWFHWE5TS1RqT0AhVntGcDI1Rk1Oc1A1e0ZkLVk7cz5qMExfZmU3a2t2dTA2V2VZCitPelRzezFBTEk8aSEre1AzY29ueGlTZjhHVWtkOVo7cjdlVGo9O0tpfDkkVkNHVWs7Mzc7b2NVYEJiVG5BazwmWT9mcyRtVXNhakBaTkgqCitfe2B+b35yV3lyYD5KSWUjZlgoXyV5LSVKM0hmWlJ+QkxFJCtWTi1WUzFoNyN2MytBe3whTng3ITF6P2l+VytLWjlIZj4+anp8TEQzd0w3CitjWjcoUyk0Xk0tQ2pXdUxUTzBLdlgqPkU/aHZaUmpTJV5SdT9VRyolYV9nYzBte09aVktzPUtUZ1hONHhWdUl8ZWhyJT1tJHFgS1gwcUtJCitVZnAoQyp4ZkE5JFgoPDdjdl42cyNSVGIzMDRIK1ZPaXZaT3EkNkxpTCZQIWBSUXdfK2lmSFg4ZnEjY0txaFZ2bCYwZyFUZm0obzdIazFACis0X3JuJklWLXBmbS1NZnpVd14qX3hne3o7RGd6dVUmSGh0MX56UEFMJT0zMll5I01NM3F5VT13IVNJcW4re3NvMEk7QD1EY1lFaFRHJEElCit3JXNZKG9sYVpXNnRIOzxvNDJyRlMwdU5pQG5BbGtYPFNmKk4jZnZVUXh9JjklT3VwYHF7d0VvJF42VlRRYDAjR2lmd2tAcEx0NnhsWGNhCitEPlIqQ3dFe217ZTUlckctOCE4XyRFQEYqYUZFMCZyLSoyYXtrTGU1ZDFHVnlOYVA9NDlsZCVUeCVsYzBQQTVHNjR7Kl49dyRCayRWaVBrCis0RDtlT0lAcmRhPUJweSVoIU1DbV5hYlQrN188d24yT2JXQHhTaExFVVE8WlJpaWgwZDB+VElfODNzfEMtTnoqX1dkOExXbFJtY207NlkmCitvbjIoM1Y4flc4Nlo9NDBSPjY3RU4xNVl2SHR8R35DWmVRKWpaKnhyWjwqKyNWRXVrcWlyOztEdHFlMnJyd2U9aXxBNj89UGQodyl7UVYyCitkKCVpO0JVWTBMOXx9I2krREQjI1lUQzIraEFBOHw3TCZJezRuVGJ4JUc7IU1zIUg4TXRNYjJCZlJwYjVuZFVvNWdzd0E1SSN3JTVndVd3Cis1Z3k1PzVneV5GNWd6JWQ1Z3JrIzVnc1dpbHhFU3BsJHd1UCZGQ0x1Yl9+SCNRdjViX1hsZkI/TnpeWVVuOVM7VnA3b3VYUkBoWUUzPjxWCitXWUQzYThRRTVYRGUjSDJaaXl0JDc/QlhYRDNtJWR3UzI1X2oxVjxELWh7RGYjbEJTWXU7KiNsNFArYzwzeGw2TiZtdzl9e002XnNVdnQoCis5SGl+aSRgcmJPKXhsV0JqVHd5SlpfIXJnflQ7VnklO3RUfmtXUzdEV0l0c2VXO1V1ezFHc2pGfWAmMih0LUMtdEV3UVB4RGY1N3gxRlBmCishR1l5PE4yWGs3cHw/aWNQWEFmM0tCVl80alozaGUwMjlpRWVaLUlGemZaUDR6RjA+ZHxSd2tVXjBJSjVTczNHS2BXaSslSUVDbGVETlhhCis1Uj1kWjh9U0JWbj03U3M5b0F3O2kyZTYtSU9qVyt5O1plKmVrWCpac3dLNElMKnJXdW1nN3BZc0RmfXpKSXJmWl85V1cjZ1VxeitnZEViCislUSN3UGA4RnVrZjRnXihePlEjJWp6ejZqPk9UI312JEolbEFeb1FYPjBFbWkjXjI+NWl9QzEmdylwflBIKHkkNCQwcGFnI1ZMZig2NkBJCithR315RTVJeU9URV9FfT9rWFghU19zJV9HPiQxMVM5dXNlMyFqPWk+SHJ8c0JoRTNqKm9iIUAmSlRXYG40K3ArQy1ZYFExNSt8d0tHaVMxCitURnJzSFhuVWt+UTxmaCE5WXckPT9jTGQkRkNDZndydHt7N0ZPUmpiM31CPC1HYXRRRTE1NEBOZHg9JjhaaktgU09eJDRNcHZKK2FZcG0hCitDVDVWWlQyKE81KFJ2VDRYeH1UP0JxUnJiVmpLdnR0QilFMmwtO3JFTE4rR1dOaHM/OXcpWTcmdj1Tcmdwej0wKWFmWWsjPWRES3JsQTVrCit2OFd4ZnZ2PnNhaGE8TWo/c2oxWWM2QEVGM0FWQVJfemRialVSTiRnaHROMHJkJVFBczxmSU5QUCt6OEJSbDZxQXhFNzlyalgtdG1tRnkxCis/OHIhSXtNPDFCWVEja0ZCYjB+MiZnVnpRY1IxYGB3TWptaVNeSWtoYj5sUTA3UEowIUZ5STVnZDBaUVZxQSFoZy0zOWtyLU4zbkhsWGp9CisqKUtiVyUpMlV3cnJHQ3x0YGdLT3k9QDZ3SWVvKSQ+Y2FNOGBITVhsSy1KYWhPcnwqY3JjaWghRz1IKnFtVj9DN2VYJUB3e2FLa2ElO3hnCitGJW9fUEl+ZWQle154KmVhflomd35NSWdkSUBXbTJkO3VDWk90TylKTn1DeSFOZT0haGgjYWBoZ29FNUtBJjtNI3d4NW9oV0w8NUk/QGpHCitNSXgpNF50UCkhYTU2c3MzYDExQWBwNiRlfT9GVUY2NmhNPW8rfmtZZzcpRzAySUZvRXFmUk1WPWV2eHI+fGBxJiowKF99IWt9b3s0RFFmCis4Vj1UV3wjNXE8TDc7aGAyUEs4U3koRV97cUs3SHk1eFBGWGVyPkowZSg+YVN9WldiN0U9YSFgN3pMVTJ9VFgqVmkobmJhU1BEejlNenluCisrZSlfOCQ3YyNNWjZINGNjQGJhYWQ4V1ZjYipfJmklMyVHR1N6aEooZ00zOT9LS3ZgWEA+ZyoxPipGNTc4I2FFZT4ra3JWREEyT2A+I3ZYCitRLU1oRVg8NWhCN3dYRUR+KSMkX1AkR3l1KEo+ezxVRSs2LTxkJiNjMTMkfTVnJEVOcnVEZFRQTkBSMklvN1gwaHxPPENeMGB9VyhMbzExCitUTE0mRCVsYGRlK2ZlKX1kVUhgUmFNeXVTYWRze1gkSTI+WDUyV1M5bTsoUiZ0QCFSeEZqe3UxUTdXVmUzIXNmaEZEPz8+Tk5vIUtpZ0w7CitrK0hvKlE0PmhWZnAlREQ9PyQjbmteQlApaD5ANmFXQUsybXRleTdEb2tjOUlYRkQwMDNqazBSU1RhMDAzfWxhNCVuV1dvfjN8YXhaOWZaCitFUTdjWDx7I0ViWnUta2FBOShEV3BYWlhkRl8yYGNpVDkhO1A/Q3JqJmYhci0/NVpPX3E/KzAtZ1JDKklYQUQ5Y3BrZ0hJYXlrU1dSNTlQCitPO1QzV2VmcXl8UlJKTEpCdGNucm9XOEEtNkg2cGUwMUFhZFJpVWFkRk48YUw+Qz0yJnVTQHBuUTxOQE9NT2pEalN5ZzF+bnRrSEc1MkdaCisjT3NsbFc1MkpPUyZXZVA2JUY+I1phYVBAI0JaeVZIbnRyLXVjflg/cUQqWV9zWXx7R3QofntOa0VRX25eJks+YyUtbVZ6QHFNQjEjSHFCCitTLXh+ZllTRk80XkthbCFLUkNzdndPcGZFZElyJis+RShUfVA2WCFffGF1OXooUkl4YTc0NWJIWFhWYCFldWlvQn1oeXEzP0stP0JpcGlmCis4UVVkMGZVYkt0Z3BHI25taUx8R3J3V14za2hlMUZkKX52Uk44dSZvajFVOXFgWHRvVFR9cHVoPVkhPnNTXiNqN3NnZHVNIzJpMVNqQXlkCitlMnNJUytWRHpYS1lvfD9CPzszKGRoaHJ0QyFpIXlrPzZzI3d6Y01HX1R0fUVhVW9vblZxb0R3WGNqMVprK3NrVURZcCZsQko5TXhVUzNlCiszPCQ2UyljUmglaiNvWmwmK3B2MWxkeVMyIXk2flg+YDxrWnFZPVlqcXItXmhLK0F5WHFjPXMpNCh+K0dyQF9QRFBGfXh+VHxZVzAqWC1hCitpNiZzQzQ/K3x6dE0/a1h4QX1ZI2dvQFEqNHI1N3dKJmk+NzJOWWl4ekM4KUwwaCRffSsoVUNeRCgqPihmO1AoXiRkI3Q9V3BjKlR2ZlpkCis/PjtRaVU1citkeik5N2Y0dGYjPWFgcyRpclV5IT4qWVYobXA0RkF4QVAzbUM1QkcpTFM0RDtOeiRYRTBpQzE5cDVQWkB6Vik0dFUqcGskCitnKG50Tl98QyU5aTwhPWooaWl0M2l5RTkhQWYyTDYoZT5DeUgxMkwxM1JnPCF0bG0oLT5oS0AoTVZKIXdBYDBDN3dKPlhTR3JmS1hWfChTCitUMih7UkhPTGBCLXolUjB1TnRTVzF+OEwocz1+QG8+dFkyamhvdHNvT01yTWhfUmdMb21NfD5pJHs/aGRKNzJmV21hZjxiKmxDS0JoK3NtCitYcUNqUVZVTVFhczhUMXEhOUw2JHBBVXRTXyE0ZkhKSEZ5ZXFudClSRnJiNSZfIUUmVUdKKjlCSF8/YiM1Xik5QyQpYUsmamFObGdyRHhmCis7PkhSWCFWMitrN0lpTG9TSFFaP0BKPFpiXmhFbE8/JmVzYFZQVkZ7JClPPyNfXiVNRWF2RXE8NyZGWjVVdXUoSkwhb2NNUkozSzZfMXV2CisrfnNOYEJMdFl7TElhZip5RGtDQHl6cVJseldWYkZ4MGg/T04hVXxQe0tTO0liMUI4RFh4TGYxcyNPKU89eDhnUFlgTVYyOHV0PE09dkVuCis8K1cpYU5rQDZqPklYd1JGSElrfG9tITgzWnoxamVBNWg9O2F5b2JwfF9II1MjRWc3VkVgJVF5K0o7S1c2Rkt3MiRXeXI3TUd3SUghXkQtCitjdHV4V3BTQSVMPkRhdVAtIVNvQEtMbypPJmZxRz1ZWCRleXY1I0BZP1orekNBNSYpYlRMST5GO0UzSHhIKFR9PVpMQ0hSPkY9fjYteGphCitGQSNqJko9bFA/SWMkRjFqbyNhezJtaTJSXlIlcExGPztJTkgzUj9ASVRjaUpCKj53S29RaXBaYVVpfHdUIUckbmI5UytkOU8lc3s2fmBTCitNeWUlJiQ8YGJXa0JTbWBEM2Vxc357cHJVJGBrVTFgQChnJkIhMSVfZVc2bnJzU3RYV2EpMzFYQW54Vz1CUEBqXygkYDFfcTlsOypjVm1wCit4Ul92My1He1Bfa2dTfFNRTTFofkwkYUx7cmdvNz1KM3RpQlFSVyUoTGRxZ2Q8ZmlsbzxzKSNBWl97S3YmNkUqQk43ZD50MX0lZGJKXjJiCis0NndePHF0YnBoKXhHR2NpYXlqK3ErRSFDSEgoT09XWEx3NC1nbDRGI2Jmc1F0UUFLZ3VJTWw/e2U8dGR5KWBeO2xzbnUofnJBO2pFWW9YCitsdzdZMVkheHVlcE04IUBxelhKM14wMTNKPl9mTzY4dEAmd2NhNmhAKDFgJSomfnx1KDNJRVM1TGZ3NyQ3T3ZJRkpTVkNnI0J3I2R5eTNqCitkV3c5aiRnP2RAT2hRXkUtPjslMmtmcC1nTW5BNjhAfWUzPV9vR3BrRUA2RW9rQDZAbjxTJnphbSNlcklCKDljSG5WWT5IYmdiI2BDNnphCis7MG1jR347bil5LUVWdnx9c2R9N2VZRlpIaFdIYmA4akteRlh7RDNjWTNkbyNvbWl1V20tciZ7fio2UHR3YlBxTjwoMj0wWnk8TUFaQWg7CitUPm08eyVCIzM5OFF0ZDMtaGB4T3FJS1hzSzM+Vl9OSF8qdFJsIXh8VERHNz0ybWFaWDJQNEU3V0RIO19xMkEzYXE3ZjUyMn5FRiZoJVNvCitpSjFlTXUhQGJ0QTFSckVJaVZxXnF5ZD9vT2spbiNSfjtXOWBOai18bkNTWmJRYXZLR3llN3A4P2BKaXBAKmhealpEKEtqQSZITWdJUE9nCitQZ1UzKFFPO24xal5iUChlWWdEOFlZKGxEZCtAYjlOZXIpQiFsbFdYfkFqc29LfUQkVktjNWMhdlZuIUhNKWRSSDhORG15fTc5WWcxfT0/Cis4Nk4qWDlLYD00WCRXQmViPiY0Myl1RVhzQFBRPVN2VSsrKT9VdUA5dXErQDA2JkBpMistcXA7b31wPDhDNURoQEpoTnlQYCNReihPN3hzCitRX31IQGJ3OEQ4ZUVqRlM5akZYd3RJUGBOWW89eXAkdSMhaHs0dD1NfWxnfmlFQVlkbGVRY3g/QUFjcit1bGhmJmxufnoyeC02STdOUVNeCitSPEVLNVIqNj1SWDNRTUtXPT14R2I8Qld6eEFVUytVJiRLRWE4d0QyQUhndVU/eW5iQ2J6RUpsWmJtZW5kdFhNfnNncFloPXo1SVlCNXQ1CitKXkQhcSVhTks8cSlNSEJPITEqTUx+aTZkaVVzPzxeMUxNdTZGYD19YVQ5N3o/enVyOzxWfEMzaUFhb3tya0wzVHluSitoSll4ajNSMWZBCisoQSsyaUZab3o9WHY1TyUtPCtRcEI3NlR2dlV+eWx+Vlh3RisoLWlSYW1ASTNYXkgjSVo4e2VeNmd1ZDhLYTZxckVzRSVHMn0oTGo1RlgyCisyfD0rOEt4aiYtUnJ1T2xFfV56JTFjJFNBS0sjdHFXZU1ZYiEkcXJCUVV2Q21PVlQpPEpwOS1RTGVeVmFBVWN6QzBEc2VSNiFvI2ZYYGxoCitNR3I+P0QwUjZCbVV9VjhLWU8hQFg1O04rdXhiZWJBPH1BRElZa1V1R057KkUjUCE8X3xKWnhKPFJlTWEyRlFFZGtySnNLfXUoYnRxPllkCituZSVUIV9qPEJhOEZfY1J7aHojaE9aPkUqRVEqO0kpSnhKU0lzPmheNjFHflNJKSMtfXVSO04zWW11KDZ5UG9vUkdkNT1OcmE1dDdYNEJQCit8a0dmJUNIWDNEejc7MnlBellZYFokZ1ozNVRoQjQ1VmsxI0VyP1Q+fSN8MSgzIUQ9UjApciEtSDtjVjt8YUcrajk0U3QlVmFQNj9wSzQpCit2TD9Kc0pyYE9ud3wxWF95amo3KSNtcm0rPl5XKmNDUUhoKmRudD5LPUNhckh4UUQkI2ZqS2NQJS0oUTsjLSVKZFgwfHo4JnVmPFMzNXg3CitNaVhpYXA9Q0kzUENePUF2dXFxXytvNSM+JSY7en5HckxSTXFXKypwNmBeNT1DVkF+YTRYVUVZRjROMWE0e0F+c1YwTEl5UjlCbGNFaEsqCitLRF9JNkVqSGcqcWt2USt7MH5TVU9ZKiNwKlVGNXxrVzY2UmdtZ2EjVWJFaDVVenxBZztHP0ByRmMhQ0QwMmBDWE1vP0p8LUIxQEJYV217CisjZiYoRUNLSj1RdGpGOSlpKnstMWNWZkApXzVHSUtOc1pNIS1MTygoN0lSbmhhZUZCRVpJQVhNdGZAPG42TFIqWSswaEhJK21XOUFqNnB0CistTy04TWl6fnJ2PGU9I1hLUU5fdzVWQUV8SmNDP2F9bTlYc2J9STN9VTxGb29UZlBPTGpIMTJ3VTIxKUxeflVaT1hGNWtjU0U2U2YjPyZpCis5b2w9ND5QZHFXKGVzd0soLWNYd3Zlc0A4PHU0Z2VtRj5uOSpRfUhBMUMyPzZaI3BiWlUhKUI7ZTtUfWpxKDdFbmdGPEdqQ1dCdmhDXmRXCitMQmApV1lsZWZSZkNrWWR2UnFkKzlpMihnKz88Z29zTGl0MHFKXz1LPmVERUNJcDxDO15PUGxyeWlObUw5TnYqbDx4bkJxMXo7KmVOLUV+CitDUFBmc014MzYoWHNGMFV2YyokYkV0SFctO299SHNkTlEjR3pjLUVfXihPaUZaOGRoa1E8O2paZ09lT0gjIUY5VWVKfSk+PmhOeEkmUD84CiswQ3tGI3tldX1OdS1gKy1oem1JcD8hdnhWTVVHMEpldG9Rcjw9RDY9V2gob31tNEd8PiFnVnNaZSl5XjtZTT5SSitMWWpvNU1kaVd1WTVFCisqdkYqTy13MEB4ZVg3emBmc0EjeDw9QiZjWl9kVWI8KyFBIVU9c2A5Pi0lUHh1ezt0NEVgTXtwKCtvYnE9TV9QJiVPKEs8SDkkSnAhJEBDCitEKiRWbCV9fiM2QmVUdDAlbWc9VSQ3UCt7TEI7ZCFyNHlzMHJUQEZ4eDxhISozdVA3MmpzTUpwIUJpcmppTndIK1hYKW5IO2ozNytUTHBQCis8TDlSaHUjZUkyVFgycG9qJkRjODR9Pi0pWk02fiZ8NHxhdnRmQHk3KFJ2JXVXKzt9MzxfZUlgclFFQDc1LTRIMGpiTyU2cS10ZjUkSz18Cis+KTVuaHw0P2lrbWpDOW9AVl5UOXY/JF5nUF53ekQ8R2hwRXEhRUhpRUFVWUE1Jjx3NTEzfWgoZiFRYkQlOHZVWSkxUSY8VkJeYDRxUH42CiteNmZSemghQlQpeHIzb1FEMEZGIzZDU0BZPF5tT35TaypAWDtqZUU3IT9nSGZTMUctXzx6TGJlPWY/b0BfVStQKStqUClqMmZuNUVJMVlGCitARyoqUmNNI1NRO09eWGRYQzkxNnhPKUVYJSRWS2FHO0pJR2Y+N0UqOFZAY3clTGgkPG95ZFhrYHNeVHYwKUlARDNqUW9nU0VfeGwmeHMlCis1K3VCdjVBS3Q9JUgoVHZSMXYjbXt8Iyp4I31lOGQ9N2tEYGspZGVAPCZoUUJjbGVZOGdqSnctOEVZRjhDWk9kWE92YTNFPHRFVUImUXspCitEMzlCaEA4ISQpQH0mVTxhMUE4XjJHLSZ+cHBMcyNnSUU2M2lCKzshbTI4ZzE9PSojNFprOCRJQm41PWdwJGZfaVI5SE1iWCYhb05ITkI3Cit6b2MqfGY7aj9UUjFGMyQtIXU8RFp7QFltPTtidHNmKWFQd14xcFNJWHYrOFZEWGhOIVo7cTUjQSEhQXs9Szs+aHkqYXp7O0U/MXxecnFsCitfMkhfR3Q3YVVPdT5gMHIhPitib05vNFkydEYkKzArSkBZTitCMEAxTiFkVDcqSWxLPVpUT0JkKFYwe3tJdHtAWW8kbkc2MllJVFFUVkNRCitVZUVgT2ttU1BwZjJnQT1aKXR4VmpNTEQtWlBRTE0hWW5tOUxrQDQ3TzJAVmZnaHt7NCZaUl9oQE1WZjRPSEwtcilLJkoxWlZ7XjtaPHBOCitNQWhqUW9lWF5Ic2dqKmJRc3F9XiEmJGh7ViFqc3R5PTI7Xyk3aHhtaW9VfERSZDwkRklrKntDUWM+QWdKWEsmRH4mPSlPfHEkMGhhU0pECiskNXVfRS0lSGx3S3xYT30wKzxqWDBzZE8haGk2O3kmS2ZvQm9oK2Amd34tZ1lwSEp6aHZ0K1VeK2o3c35oZ0ZKbVVTIUVSTSN4bVdJRGgpCitRZWQ/KDwyZTUwd3B5amd7QHxqVHd2OXxgMVUpXmZ0R3Y4aCMtP1BzdlU8YFZsPWtsM1YyUiZvQkQ/MlpiemhDcDtXPzIqeGl9QFQ+SDdiCitmZi19MFlVJHN9UXlETV9jaVghNU4yWkl3O3kqP0EzO0xkQT5YJmxDRC1tUnklfUpmcn1yZiFMdDx7ZWdhKVd3I1liZD5PRkpiLWR1RT5CCislZWsjMyowS1hCb1NVdm8tR3B7cm1fMlhfWUtOLVRCTio7YTdfJGBRdlJ7IWxGIWM4KSYlYHsmSTd0JWFtPS0zVGd8I0p9SW1uNDxHWUpXCitUNnhPJVA5QUdiez5RTm9xPzFJJWQjTHN8Tk45Y2B5aWhnYisoUT0rbnpjPDYkTlR5dEM7MjtlO3d6XkpOVlRVKH1uZS1PY3lETEgqfF53CitxSWl+OGhKckUwdCNAcG15TVg5IVIjaW8xaGhfSjJBJnoqfWE7R1d+VFotMnVjbWN3ZXxHUjxNcyhAYkomPGQ+QnIhZFcrQlhGdHs7VnhXCitYNSFHfHZpTDBWcDBkczlBRlMmQ3BZMlI7MXJ9a2pHSnMycHQoYntzQSltYHVtUX14fFFjU3lxazBPR018JXZjc3hvb3lwezJuIzkmWlo/CitnXkZWV143WEh+KHkobyNBWFB7MnRgMEl9MypZbzk8KkpqPHlzWEIrSTRMeEpRPTg8JVJEXkNmTXVzKVdDTiVDZ0xRY2khPT88blBgVzh8CismM3NrITw8ZjZYZGZgQFRVYkR3eFBaPF5QO0dHJUZOPUcrPVFUPzspa1VQV3the3x1U0I2RFRRQm47PXooaktQI1FHZnd8I2JYcjUmfkZ0CisjcDNtQzBAdjFXKCgrUWhXYSk0OT53LU5qNVNCMlNlcEMlYUw4KDd4Qnw2YUZ1OFBwKEY/SDZyPExseXNsRnRLIz5EWEEoMypWVUZzLU8oCitMM1hAPnswTzRmaj1DSlo/dHBTUGRWMD1nN2xhdVFzZ2hMSyZDb0ppb2ZxcFk7WGRjKldHNThNJUBGfj9WYT8yPWVLQn4rOT47UUI5ViowCitpRENweColJWJEOyhUeHFlcko3QGVwTDElU1BydksocD5lb3VmcXMrYll2eVI5OWdYQjNjNkY1P1JEVDZvPDVZdEFYdFFXWHlhSnZ5PEd7Citpamw1NUVhLWVCSlhMSWNnUFJDNVJBX3VRe3QtM1BkWjk4RFR9NENIN3VxVHMtRTdEMyhQbGpIbUVrTjxoe3s5aCt6MVYmP2pvR3BOKipYCitQVG9qc2h1fmgtenIoN2QySmImMzhjO1lFX34jUTNwd2kwfiNGfExuYj1sWnNnTDErJnArazJSOCpVeTVkTjw0JHR4MyFVODtRPXp7X3FeCitudUMhe0dJSns8RFBWbFlfTnl1THFsPUFXfmtRVmhBT2dSVlRTVUdzZC1mXzdPZHBfcXJ9TTRxIVBoO3lnaE9GNE89ZFk7VVNHa29sIUo2CitleGhZN2pwfTFrSmBOKzB6PDgoYGRed0VoVlJ4KXE2QShYYjRmQGpEdHhQa0hYSHoxM085V35FMmdXRkFAbjktZ0FQWUhrakpTb2FlKT0+CitlbTlJaDxpMUExYWFZWEpgNXFiaj5sPDUyRGZ5YWM3UVlzV2RjWGFFJEU5OGx+azxTWXswdVV6SjdJQ0xzemBLVn0/dFQzRGkmZFMrS2VACitydVFIfU1jSVZCTjVETHwpMXVXJntvNEV1WkFJPC1rKWAxX3YyVkBzN09mejxSZkQpSFB7QkYkOFUyZEcoK0U1TSpBSmViY05wPE0tbE1PCis1S2M1eFdqd1ImbjZlMWZJTDgrdF9NY0VfZWUwaVEtfld3UjtLaGxoO2lxMEZkNj55YTB6JF5Zcyg5cVFfWmlNVig7KzlUXjc8eiNXYGQzCis4bStLPUUxWVgwPl5xMW0kNWIhOypOKk42ZzRrTVV+NW0xPCM4fmB4ejFVKDBfR0A9PEB0JkVhQEZ7RiN8QFZSUlktNlZINkJNaHhPOVpjCitiNlYhJUAmfUd4Z30rRE5HeTNBI2NHQF4meSY9ViskPFdeamFkZj08cmw/PWEhTFdxUmQ3Vkl7ZCExWEkjTHdMYnZ+XlBjcX44Xz1XKjFwCitqWSoyUGNGLVgzSS1LQ3pRWElSTyZCTiNiTCswcFNGVnNYakpHRUVZZVB1PTRkIWhyMFo1TzRnPmBVbFJ6Tms9fmE7NTRxSV98dlUoXzhBCitTc0VTViVDPGlYdjk7YC1Vc2laVSRwe25vOFZaczRZSz17Mis8VH1iXylSV0ZLNDYjcENTcjVQKHZIN0NLM21kdTY/SEJ+XkY9eDlZSzRDCis7TDdRTSF0MnJRKGd2NzB1MnElWEV7KER3N2diQCZraF4oUjw/IVYrcDJEQVReQXJ4aD89NDxJIV82QXBzMnZReWQ3MWZpMlMtMUFFaVQwCis3KWhrOWBHPW9xUTh3Pzh8ZHdJM0QxMzlKPHUxMSUlOVNWVDgyZmVEe1RyXmwrS0dAckI/fD0+eGt+P3NZIVdLUF42JDxkUkxrfHtAVGdvCit4VzkyMmJ1dWEoSyUwQ0ljKiZ6Z2BIbipXOF84fTR1UkBCZS1IcG96YjNXO3Z4aHUheChVSk82KGcoM1YlaEs3KXElOTwkbT1WQnFRbFM9Cis8UG1GP01kdVlwdjJXRUh4YGMrZitla1dIcFlNZjFmbCZDSVd7Nio2eHdKZFV1PF5fVXwmeCY+WklBZT09d3c+QG1kellFUnpjLStGY0pBCis2MyMzPEEqeU14ZGFCJiVZQ2l4VDlOZE9Ybl5OSHtWRkReeXlOVXpPbGVEfjhsREJTcWNKcCE4JkpjeUtkUVI9ZGl+c3JzMDYrUXk/bCtgCituST8qKWxIRT9FZHx2UEFHfkxpOHtKYFAoRk1aSl5icm18TlArTGdOT0k7YCtWMyhsbCVBTTxUOT5gY156ZVNxSmE1a2BYR3Z7NE5Fe0NgCis5c3RtaX1uRGt0XyZoJl47YGsrMiFMZWxsNFZpUElLMV45NFghNzA8THVoM1IoO3BqaGdLVXt7dmpKdztoVFhDZF4zSDdGJUVHeXdBUWZsCitnRyUlSDcmZVl3Tk1NKEY9WEhqU008Y1VnIUAyXjJVeEIhX3M9SkpKTlJ7cmdwYXolZVN9LWZ8Qk8+PmZvUUZCflFTTElHbD9BZCo0Z3luCitgbHNUKGAlZE43YTFRaXVtYSZYcyFxM3I8LTlken5aOzlmeEE+fihiQz59UGJ9MWRhfFdSa0xgLVYyNTVWcj9ea0FybEV4NnVQZG0jQTRHCitBbFdUND0wTnlZLTx4MHQwRVohbTxOX2sqQ19IVWFKRztUfmE/RVE+I2Z6e0ZZbGFVQkN2O0w5ZDFuU2ZUKlhuKjF8JUFja1c5ek87VjwqCit5SV5eeCl5KyRFfHBQJHxKUz1aRD16Tj0tJiRIZStLI0khSCY+WitYZD04I2BZfCsoTnA8SHFndkN1YTduMEk9TWc3KjYydlF3UWo3WkVACituc3g5WlhyO0RYP09GQE94PUdgI1FmdnIhOGVtZi13dnQ9KG1fKGpeQiVyb1J8KmcqdFYjb21TSHBWLWxvWkokey1PMHF0NEtxMzlLOX1ECisrUjdBbFN8Qk55ZytEI2BeVFI8eSljfUI9QGE+fT5JaVJWJmA2aEBeM2F4YSUxaTR7bkhKaEV3Si1QU15te0pfYjVCK3RhcDVzX1MofnkxCituZV9XI3czeHgqNV4zRn5ueldoX29PaXpgekQpJTZgcUhnRlN3dWllPz18aHVENUJ6eDtSQk03V15OMUtyUSU8IXMkbUR2JE9qKWxVTHZKCis+bFg/bktBPGJMPGpaaWhYKWZCRXA/ZVJ4UWptPnkybC1jOHxrcEo3N0o2S0pMcSMxSHVeakNhSTBeJEl1MXE0O2hxVEtJTzw5enFhVEEmCitEeSFoMERNK1hvaWR3a1BnJDJkSXM3ITFTcnFVcTxvcWdGd1ZGMklweWlFRWEkJU5qPTR6Wj5pcnBmTzUoNyRuSXwhbXZ2b2FMNiFpcD8kCis1a1VvdTBhaDhXe3Y8ZT85Yj9Hej1fRDxqdUpedj5VaU8mT1pEVDshTFprWF9MfGxRNC07Z2BUUV5BZThSX3QkNzR6Syl0PDRYfjQ7YEt+CitPVH5UZWE5MThuXkYjRFg4PGRAQig+Rkg3ZSpDXkQ+TTxUe3I+eDJSRzlKbGZmSzVkMGZuI3sjT0NMUTNtOEV8LUQoWjlQT2duSCFgVnhzCisrSTVsQTMqZkdtS2opYTApVmp4em8jTTBXcD50VG5oPTFIRkFgP3tZSV56dGdKfEtobEYrJkh0NlRlRWEoI295KHlHb09ZdjJyZjZfbHQxCitDe0xPMzNOZzFEYUI/SSNHNlpmdDYtMmtfeFBAKGxOM2NfKTBke04pfDhqcDA4NDFWZmh7Tz9lPkt2JE8oJVdDbzA1ZH1AdVZWT2NzTGN5Cis/Zjh6bk9OdUZnKC1JXzBocmZqNk8+RFdYYj5KPiRrKzw/Q1JQZl5xPktEKTlSckw5JGtDM1ZaK2gtVi1BTURHPT50JHRXflQhXzdeYn0tCit+UTZhJTVSano/cXcocj9pSnwhcVdVbHgrcEJhT3deRmAheTR2NnshdUxTSzxKdyZta3c3OG0lNTRjUU4zNU5NaCVgM14yejU5X28/bUpUCitqckkwcnlBZ3k1bXNsJmR0YXVMN0h4Yj85SzJUU2Epc0B9bFcmWW59WFE/cjNnSVczbkFHKFU4JmwlNzdmZkp0Pisodj1sRFdnWmoqQ243CitnMXkyUj9yckB6dmw7Z3dNanxRcSVwVnhOeDFoYnZjYzdpRVdpa3kwTXd5MjdBcDcwUSRDQzA/ISpEVEYxTWgrbClUaik+dzNROWlaNmBqCis0cmc5NVhVPSZPNlhIdGxIbFUwZHQ0MEUxbjImcEBlZD4mViptalVBfkRJc1RMS0koR0tFPGljMzhJRXpTYTlsR1RZUUZqZm47aFhWSj5pCisjWD5YJndCeS1WX3JnbmAjbisxXzchSEM9LX1yVl5Xe1RgSn43I1hKZ05iK3hJNH5ac3lhS2IkP0decUVoV1Q0NzJPRj14PSp9QHVPVmJVCis8N2xVM2EyYHxSO283YlZ2QzFkcFJUel8jd0J3byljfGlxX0Rvak9PJWclZ3hFK24+MylXbWFxRnlsfSt4VGVmanJeY01DWUxnTChVR2owCitQQiRpKURDOUR7bEctUHd7enZXRE0wOTFzLTdNWFJ4RXNsRlZ6QHpFTVNua2VHNUhJMy1BP2gmeVlxTjxmIUU7QC1eO2VxaFJJTWA+bCZPCitFQ2kyUG40QTJRWUVCWlVYVXMmVztKZnZlRCV3bTl7Rmp+QzM0bnQoKyE2WE8je3ppVk9VMGZlVkZtUn1oZWRmSzVGXzsxYT1gKj9rI0BqCisxTzRvUWcpU3Q2VnFWMSZtWHAxeW9Kc24jb29ReVhvSEB9aW5MTEN+IzJOOXcpQ1E7RUdOVGc+NjBrJX47Pko+QE5xTjklZSVgSFRBbU44CitULUZLKH14KCN4QSU0VT5tYjA5ITZYWD5uPUtrYFUkTHVwT1YtJWdue2ReeDU4QFpoLXlfRWFmKT1FMFhHemN6O0YwVGYkbGN2NEVKJC0oCitnWXxHZz5uJVA2RmV0cmgyQkRtOXJHUEoxUUFRPzgzUH18OXtJT0JacVUjVm1BQk9YR3Z8I35ZN0tZMXQrTGJhcUBUKC1Uby0xN2JoNGRmCitucFQrWGFfM2pCRl9CbWMqY3dIc2JgekcqP1klLWhlSilJJGJtQDFyREMrMzwpaFBQQ0MqNDlRNT1yQFY+R2BKUWR5VUI0UmVgcTZ6aiRMCit3Wj5zZCo2SW9AZC05YGYkQkYlJThVZTBrQllrNUh8bko8UDNAJVprQkhQQl5wa34/aGhtS0A/TzAtRE5DcGRiJnQ8P2xvWlJsQXAqJSt+CitVR3NiZXxDe3woRmwhYlluciNQR35ueFhHR2dSRkxeb2NHQX5MTnltIz94UWVZQzdsZCladjNtLWAwfkYkeGo5eFlXTU9pRjtEKHl8Rj57CitqaGlnPyY3QlRobHwjVVk/SXpVQjZNPWApYFc0KEh2RkA8bT1rP2poPFUyaFlLPkA9NTNNdiNvMllxMU5KWG1iQCE+cy1RP3tUVS1ubnFFCisqc2FFTndLYWMjZUF+ZFBCX29GbEh1OG45WmwjX0ZBRmhgRm5WeU45NypgN1BfNGdQOXhNRWE2aD8qIUhZRU9iVEMhenYkO0pyQXR0JU5SCitoVzIyLWEhcWZySmFsN25eTTdZfighbmIleGwoUzZTTT5tTD1DPC1PVCs8KXdDRHIhJkxiWk9nb0FiRWRFSWAzcSt7ZEpYNipAeyFWMnhNCit6I2hxI3N3MHFwWXlXJU9XQ1V+ZGtCK1lTQDQqUGV1byM9bHFTLUZqN1cmRzF0enJnIT9XIUFnVmU9QGNMYE1xUndlbWc/U2JDWGNzIzVqCit4MlFGY0huekw9dzZVKDFeI15YUikoJC1afnMrPEFRZHJwVnV3P0YyZkBkYFczfkBZeiUmX0JzWEo9RGNtRnNRWnAlaEhFPXRPNi1yNXF7CitOST5jdld2JXIhemkreEpuYV9weyRyKXtKMVZeYFpkRytFX0FBdDA2dClIKyRkPlk7IU9hJklOakpZTj1QSzA8SVBqTnF3c3dwdnIrUDI+CisoYjAxRFMlPkxPV3JuYVRqRT1qTUd6TXRwUW42SD5QYnV1N1N5MWJ2cl42K281X1omSE96UVA5QlE1USZtMD1+KipoMFB2MlZtTGBHKUR4CitScSlhbj1TLXxoI3dvNXNQMS11RWcoZFpoempEdCRXbVkkNDktZ198JTJKdlJCSnJmUStRTm9qKjM0T1gpTGJ9a0h1cH14YTh8UHBXeyo4Cis8bGdLVnpAUCl7IWtTJlFpIzdkPlViSCNIUlhCbDY1V3FSUXU5QyVtYzFnQHMpWWlxY09yP35jX0haU05UKWlebW5FOFI8V1VEcmZZYGw2CisrJG8peCVTV3FkSUozSTRjZEctOTQ3JUlmSmNtM19fMnlgP2hGVVZMN3olcjUrRXhwSTNMQFQ5R1ZoWEZxSGJRa3Q4cTFlKlFvSDMlSmJWCisoP19WQX08d0NBSU5yekZJcn5EQUpAR2AjXjdhQGYxeG0tU3Q1ZTNBQE9KeStXfHkyUCkob0RJRkQ8QllsWXYtTnB1TSgqTmUzQF5uZUwoCisrIy16JnxNclBoSjx+I0QhQGhua0tKPHdpJVFeS3BDPDkjLTQxT0NSeGA5Nl8/JDxZPX5UQC1qWmNZKmFBRFNXSkItTD11VWRAe153aXlZCitOc1BSN0dfIWl8c1p1bU0yWWxtdWZtISpqJnAhcTRedERSa1R9PHhjYlE3O1Jub0FHS0RxR3ImWiRXQ3RUUkFUeXVXQmw/S182MTQ9fGg+CisrYEgrJUpBSWR6Pz91dzs3Q1hrI2srNHlidE0lNSU4NCNxM3pzRz9yMGVlRlRJWDtebjc9a3k5VWFhSnNEUXB9T1VMOWZLKTFLJU9AWHZqCit5el52VzUkdFdVfXF0QEx0RWQxPjRWQXY4UnJBNjxmb1Rod1h+SEBxN1AtQGR9YzQ2KmxYOylYfWFBT1dPSCstVDkmd2NVaz8wfn1KUUZ3CitqYWJWc2chR1k9NzJkeF5JNGw3SzMofVlWXjx7UylkO0JLYVg1bGBRWXRUcnNia1N7Rmc5I0o9RHtCdypAQDh5b0Vge0hvV3FAK0FKUylzCitJNGMkMG03OXA5O3EofEwzaFBldzZHb2BCOCMkU2lQZTZhclB5RW5relZ+I1A8NUhxNTBIPDQ5LSYoUVFAVD18RnZKX3RoUXxYJldjWWlDCitYZCpjN1Z4OCE1bypLd2xHfk5EYEJ0QW1BcVVsOyokPWN+JnVHTHJ5JTliVmM4Pko8UlpQUlEjTG9ZMEE3PTMxMUpXNzJ7d340dGlaMEN5CitTITstI1lUfXZeaW4+Xiprc0JaWT9hSFdaeCtrVWt3OyhRLWhqYWxtO2B0QihEIyQ0dl5sMUVVfDZOJUpgTk5KVGVBQFdxTTE3VjMjSGtaCithYSV5fmVXYWkpPUpfYVBlalRlMEw1WVlBc3c3Qyo1WiZ0YT8ka2xRTl41aXNRVkxWUF5KQjhpNjU0UntiZG8+dCpuNGsxTGBvUWFAKkNxCishbyQ/VG91IUBfMEZLRDZSYjE+KnNGdHApT1hEdTwzPmIzT3lAfSlmPXxLT0FrOTt0VWVTPU1tSGN2VzFoXmxtfilmclZmMzk0PkF2VGxlCismMHp8QEI0Xl5RJjwpb0dvU0ckJmdtQkQxWF9vc00zTjVQLSN+WFNZR3M4N3A1TCp3ISRSOV96dlZWd2I2dTBhb3Q2Oyl6dyhoZ3lNZHFVCithPytyMU8yWl59N2AyK1BkczZ4QkE5V1k+XlNCYXpnNFg/NjNkLT0kPkJHbUM4IWtUWTshITJQMmVuKyE+U0dVIWFkO1Y7YHhZZnM9RHYkCitBRGh4VlJaLVozak1hNChhPSljd3Y7TnYqKzw5OUpORV55TG1IT0BCaXd4VyF+UU5HU0hiU2gxT2dCMlMpYDN2OUdKXlhlIVVZc35GbDEhCitUO3o8WjtfPD5ZNV5MUjw8WTNSR0YqZH1kUnQ9aUpDZXU1ckV7cFE1KkhsaUp1ZyZvQz57aGk9eHZOQGZQLWsxbz5kQGYhJT5NP3M+fF4tCitQNzxKTGRfPHRfflhBTjhgP1IyUkxYOUljbnljcntOSFFncGBTRSU1OWNJUXE0bXJiPlA5OW5AdmRgaTF9YEwqaVFHZ05NYjFObzAmU3x5CitUZzFgQFV3ZUhhRGskTHRsJHModnd9QjBAMlBFTTI2eGcoczMqKVdia1pFZj9MYUZ4TTtFUnZfemZ2SWF5eSM9M350SmpgaUhhbyY8dVBYCitsPThpKUNCKiF2PVZfTEJGbkRTVHtQQHtHMT1jSFh7TFlfKCFyd1dFdWRgbWJSfUYyN0A1UElYcEckVE4xI1JicXhjeEghRm9RdkhkKTtNCitSclhYRyhObkB5UW4tVjVIK3RGaj9eeX48QGEhY1BnPFhQdWVINVQ4YmhCeUs0QjdgZ0lobGpfKCZLYDxFbCMrelErREA1REplJn5DI1glCitXSV9BI0ExT3pGVUIpciVgUTNwNkNEdm09ZSR5U3RMPVdrR3FSWVlrdD1FNG0jbE9KTjMxQHoyTEBnJiZPJVNkIVp5bEJCPFVWd0NeSS00CitqSEwoa3RWWjQ2ajlAV1MxQ1I9SHY0MmRxLU5VMCpWOzIpY3tpaGN+Ui05ZjRya04+OFdXSDE2aW85RkpSNFd1SCNvODJwQXtwUm1PWUl7Citqbk5EcWQlfVF2VytSKXBfZSQyTGFPaHdCMz0oKTlnMU1iViU1LWtePShCdXNRZkIrbUMkSW0jJFUme0dTYytUeT4rey1VeUBYPE04K31UCit7YFJnZUZLflVAZFBLcnFOY0ZnNUQmamRpZShwSEZYbEJLJCl7amlQOEVSJU53NSNEeHE8WDFfV29FP0ImbSNpek0jdjB3Sl98dEYtIytZCit7QyNwNzQjViZyVmtKXykyPyYyRCswM096YD8/akBuNk1kJjUtVlI7YUJJRz1yPm1xN3BxT1E/VUhNbT5vJVhkdjM+ZzFaX1RkLVNOITJLCiteZT5GQSlXSjlefD5kaXM4RHR2Zno4eVJMSFlVQ3BYbSsle2c5c2trfj14JEFNU1JgJVR9Z1MmMCt4Kz9+WE0+alJZdCRVTCkkS3Y2UnZuCispczBsTk01YShQNTY8O3tuUDVpJVh4U3l+RmtQaFJwM2oqPWhPP3c3RHo2QVJDMWY0Z1hyTVprTHBKV2xScS0ocCl2TzFeSEQ2O0xsRSl7Cis8fTc3YFplMjVkZTsxbjhwVDQ0cUomZVFNTzFlJXpmQjh2UHdBdXZweDIyWUBfK0JaaXc0S3RmWlljVl84c2AzQnY2IWIkdlJXPW5teDJxCityQFojWnU0XldGdXEpakY/VnxqPEpjJHQ5eyhaIVlNTT1TYHs5WWFMXmdmWWl1JEBSKD5iUntEWk1lZDFQZ1NPdzNjNihGdWZUZThzfT4mCit5aUY3QXREbnRiN2JuM1hnSlhEMGxSOHt5U2JfZVdQcFB4ckV3VUx3KVdzSil4WFBmcmYhVzB+fSF3UHYpWl9Tfkk2PjRJRWNnVDs/cDdrCitEUz58aDVfJH1BdCo2Rj5UUjtNdlBYenxJY20jfGN9KENQT25+b3xua3JBcDc3ckBUQTchZ0BmZmtBO1FvZXxNTT48OzhEeSYweFNrPjE4CisqVW4lMzI+eXxGWlZZNHdOQ0gzLSgxQ1pHV0JOPTYkYFAyKFhAel4qJElgZTh4S096VGdgMXQ2fjtzPX0mWnBXQE41KW9GciZ5eHZFMVppCitJPXBlTUxeSn0jalREdEFWJWE8TVZTcE43TUhMYXAzeEJua214amVQVWx8eWQzMz9IbzEjb0Fwa1hoVDZofGVpJClFVz9GM2hlY0BFdkhaCit0cEY9Szt2OyExZFN8UTxlPG4/a3FFfW5uRX5Bb3RtKX1Ya0dBKTBrbGUmIT04VW9LYkVvdVJJTUBHdldjNDRfOV9Ia2I7dE5uVUM5TT9CCitPcEh7K2AqKV58blUqcDhKZUF8U0soZm80aDQ5aSo0azs/RmplaDBxSjEmY3VCKTNWMkdOPTkmTXIrclZCQHdZeDJpOHh2ZVMpJUNKTlFUCitEWjZDTX5sI19oUkRmeVopNmV8Rz4/dWZjLXd3bGd0aXo+eWoxTEx6UTxfXz9oYGBVMjg1Kjw9UERudGg8PzsjO0VSaG1vdmRAWnB2WUpqCitMJnticC1OVUg7a3R1NWNQXnNpZnB+aWYxdHFCdDNqZU1AdkpecWc3ZCFFVHk7ej0lVjc1alNRY0ptNmVxISNqWnNSNCgoajJJMF40V2whCitZS0omSFM9PFA9NSFgKVliO3BLTzR2WU5hdDZUSmZ5KXZmej02PHxOaTdiRl5TU3omSXRLUyZDdnk7ZWp1VEFSamc3czJiPS0oYWVTQ3R+CitmYChZUyRoKWc0anRMWm5LKkN9MzNyR2MxOF8/flQxMkNvKlpGNTJ8N3w7RG9vczFZeEx7ejRXXlAycCVAQ35NYiMrPWI1QmAwP3JffXE9CitvRFF8Y2l4UW1XVD84aTBVM3NGI3wmJnc+WVRJdGZIVGJHRX5NWExjR3g+dkcqZVltXzxMJFhFP0FPNypmbSFUb2Rja3ZxbVRATHtAODlCCitOSSYhfSsjcShnRU1sNjN8c0xsXmp4PHJxZHRTNnw5ZFVRek5xekdQOVhmbEpjKW9SIT9eMVNiIzg0NDhXRWU/fTdYK2JHNk0zPkc8JWs4CitYRGxPPXFHY0Fha1dRYWI7XlU8Nk1KTW9ycC0qQ019Skx4ODNjZVYpUntKVX5adjJCczFnbiRlbWgkcX05QXI0QUEydnVWU1AoIVZjWDJuCis/QSlsYUI+X09EKjxrfEx6dTVDWlYlbClqfDdrQ2dDYE5ZTjxYViVxUiZxRlA7PlElYXkxPyopNENMUV4pJj4oZ0UpSWFeTHB2aTd4eHEtCitIUjh1JUFhOWM8XnZvTUk/bGc8e01aLVVPP0FVUmQwVUl2ZC1QcitKPH5pSypyZzM0T1olYnl+KzZ8aFVkKyFFbkZYOytlY3BgNnNLYXZuCituKk1RWDR3RXVCNEh3aCN+MzAlNCtkODNoMTYjMnlxJnFJUXBvb30tajZnaVdOeVVBVjw9ZGBgfEFtSFopTmFOS2RDSXcpS00tN2NSSUVECitQIUFxdF9vRGMhYz1OO31APj1qdUc9ezNqO1hTaDFNUGlzJV5GQVJkUTtVP1JXXnVNSDlxLTg4fVhZTFp7VkhRaTQzcD5RYTcwXj5lTUh5Cis2TGRFRG9LNmVARTlkTVE4RXNmPStpWiVMcXh4TigkYTRHcTA4fFNkM05eUU9MZkJjQHVtcmEhPCh+STZ+ZTI9TiM4c3gyKXFBMHBROXVoCitjTTJxXihFWE5RP0FGbEM/K2Z9dnUkWDZLLVUyR3ZAIVAjRFlQWEEkQFdBSVQyUGhxWHBpS28kSEBVWFN1YHYmOV5wSGw/NWpmdnBjRihxCitkRFpVVkxwd1pAYW88KW1uZHhqYFN7IyNoVGtVNFpjR2BecWVZcE9zMHZ1RXA1ZEctblo1WSpQXis5TVgoR2dEO0dZWGljd3Ura2BKTHBnCitBUkk0dER6Z01LcEZiMTxEPCswRFJZQE0qOTQmRSNmYUNONUlGPm8mZHg7VT00YUIhczd0Pj9KPztkZHd3VlVDVFVoX0B+WTIhVjhZe3xACis2QF9fNCp0K3B7TyVJMVVOXkt2S2dHQ3BXQ0VYQGI0b3lsVDZTYCZ6N154PXRle3JqMSZ6WFhsZVNPYXxUKW5zNWEoaWgrbmArYkdUIU1WCitaIztPVmNwZCtfekMoPUlWVkw4K09Kbys5PmUweFNDQi1rR21fdTkmQE5BeUckIT08PEVjbCkxTThuPXVZKjdaYTl1d3hgfnpgKTxUITYyCishTkx1VUpYb2xZVGwzV3A9SyoxVFRpaERLKEM1b158VitFYFE/R0wrOVR+RHBISGp1Y2hPJVMtPzFoX0s9e1ViVmIlV3dDS0t9MnxKRGltCittOVc2aW4rYWBsVSFITjNkbHJNZkM3LTJzVmxTVGc1Y2dGeUlQKlhnMlJMcWdjRFl3aVBfakU/XkBjSTctPUlEUnBjPTU0d3lvKCZnPUA/CitLV2wwZSVRYm9kZ2haSW5tWngxNyhFSD1zWVdDO2Z0KHheOVMjU1diZz1HYT8yWnk8MkU1PmZBQEJgRkAjSTxQT2lvdHQqdGZ1WHQxKSFECit5SWtDOVE+WkZ7VH5XNG9sK1dhWkJ+Jj95XlBFZjdDREBZIU1SO2BOZlh5Z3haRnE2JkNQI1BnSEZWXytqXk1NKHIpO3E8YlZAM3Z3anApCitgalFhZV5kQHZ6MEpCQVY4TkxLe0YkdTYrWnRTQWl+WnRmLWlOczEoTUIqanIocTYjYV9VVHxESCVRezBOSnFnVmYlKHczc1NyQVJOUjMzCit3VjFvbyQzZWAkcEo9ZTdHZWQ9RjZka2NybXxVPzArLVV0NisyKWsyQ259WmFvTD9PUlk1Mjd2UkVuJCYlSmM0JCtENDB3cE49QUo1eiVWCitRKyh1QkcydUpWPGwqJHVrZyl5K2JXbjcpSEluTmYwblEjZk5nJlJ1cUteaFJCe2ZzKGZJPkA8UFhzUHpsV2NTJTtwKEprdy1EWkpiWmRBCitaUVM4RTJ1MHxRKFBRTSpXODlAX1N4QSh6MmMzbkF9NGo5Y1FUPExSMyUmbHRYV2gkNnZIdzQ1ZCp8WWhMV2VybytDZXNCMWtwKWZVeFY2CismcHsyQDtfaUM2bDlCKig5LW10cXwtU19nfmB5c0xxOSMzLTdXWmEpRkkpTEh5RXh5QTNna31kVjU0aC1UTC12bGNhZTdxIW97anBwQVQ5Cis+IzZZTSQzdSUzZ0pgU3s3Ql45M1EhNyl4RHhRUGtfMF4/OCY3QEcwcyZQJWdIY0ZAPXl8M29jR0l0XjBHTExValo3fVBCQypWa28lSHMpCis8fD9Qdj82RXJCKiR8YDVpQD4waDF9YWljJmJEdVM9VWBBOTRiX2wlNVohWEJZVnx4Syp0bzg8NGUteXIjaUUqS0szZz1qKzlJc2AkU31hCithdVMmI01DcjhGdXlHZHN7Z0BLdUl2fnVgNjNUPDNofXBRUUVSdGxePyl6cyZVQmchKVQ+R2ZaLWdPIVBEaiRtMEVBLXVRT0ElPn5Naz1JCitGQUd5K2FTfFA8WDlHbVpJNT1eVmYxWFpzMTV9OUwyVCglOV8odldYeTZFQlMwWmFSXkQrfVUhI1RGeilLQTN0ZWNxMWtXfGlSfnNCNXctCit1PmRWek57N1dye0wxSD17YFNAIy1kR2x8VEw5MkVGfUBueW4zRH5iekxJSnFwZ1NgYClkWFR2KXhAVSQqWHBwfHNLbTdaJURycGYodG9iCitveFlCdVl6JV9KdSFBQHhZVXV3NGZmIyNSKVg8QChwWGloKVEmXz5meXcra2pAeSlIe1ZPVm4pd3REeHx2d1RkfFZFWXZsdn4lRT9Mdmp6CitmTnVSSCtWUztwI1UjR19zeiMmdHJ1dCNjKkN1IyFubXB9RHxfOHh2ZkVDMzRLRWUyNTRtcVM3TTQxKm5lU1k4UzIjUUwyVlgqSF5oZTtRCitWNkIwTUNSWWp2OGZXITFNa01jUnEwPkJsTnxpc2w7ZmZQRk9IQ1Y9d0YqQlckMz8hbnZqUEBmelA1UWJNO3xBbD43UDE+YTVSV1J5MzttCitsJkRvMVlHfW5AQEw5YHZzP1hiS0VXemlxSkw/eWNVN3c3OSloNms+RVpCNk0xX1NuUG8/PyYkI0lqKFh7a31eUGJjSEFOQ2l7UWZScylJCisqdyttTD19KUlPOXpnV0Q1fSV3TTNINX1WdWMqWUNNeCk2ZnF8RV9tJCVQbFIxYnlKc0thYio5X0trNU4jfHVyMSVZTnJDOHZyeHBxKy1WCitGS1MxTHUyIyVYe3wrTkE8aFczczlpQXVeKU02MH0ycGYybiF6NTd1fHBnTE02S1J6I252QkJNfiFCeE04YChlS3s4bj9RPzMoWjl2MjNyCis1WEU7PjhPTEIoNzZlbDdaLVNhIzcmWSspdVR7ZV9eU0Jzd0xhSWFeUFNJUCVlITxhe0slajE5WkY/YTNzekl+KTliWCNwJSpOey1vN2lVCis2amZ7d1hBJEY2Vkt4S1JvM2lXc1ozaE4yK35uI2RISmhKR1dAI0l2Ukw8IUlfe2Umcj9GdWw8OTFUeH1kO2dmQWJeeD53akM2cU5mY3MjCis1WXJXYTQ1ajJSUTwxQ05tN0kreC1iQGA3U3QrLV4xTEVTV1hLWHEtdV85OGBKYnZ8ZzV3dWpaOHhlaU0pKkw2YXo5fn1MUG9iMnw3ZmdNCisjfVAxXyNnOE0wJTBaUSlyNCRteGd+YW5SRn4tazZqaXBRSnNjNTh9QittRTF2UmpjTHhBTFRKeWlHUFhCd2Y2aippP21LPHFLWU98QD88Cittfm1ZN2FoT3FXUyYhZmkpZjVzfXIzM2JsdmQ2WFJYX1g1PGt9TUh1QkBVWFMzdExxQm89ZW1xMWNHN0o1QWMzODshTkltdFY4O3ZkdWgzCitmJkBnZkJLWj5ZNW5Qd0FaXnwpQWFUSTRMRSUoOytFdzBPVjgmKFI5cnVNX2BLb2ZPXzchZF83ZVI7R2ptalZCKn0/d3FRNjYmOXBVTCFrCitaKWZZaXQ8PHxzT1pyMTleSXhfWnhJcVpRP2NweG90c3h9aWVuO0dqK0A2U1J3VktZV2lIQyVHaXU8PUgoKzZ4WkN1UGRATXVCd1VxSiZPCitHemJCTE1gPWAmMlBtYkA0dFM9UGJGXllhS1JgZmtZIWFaazk0Sld4Rlp1JmhxNkNLeUtufl5LUmM2YTEqKHxYQSY7aUhBdUhQVnRKJXs8CitFaElxVWhIbzVHN2MrZVlXNCEycTctMkFyZ3J0d3twSWdKdT9PaXQ/aGBXb04hN2ljJmJOTkNvMCV2VypZcVgwdVUhQWFUMj4mPVlkUFRfCitPMyYqI3c3cXw4QU8zTlFKK1p0bEdnYURHdStAMDBoc1JjaCRGez0zMDQ/diZMUGVqWVplJWkwOGdhamBGVWVXM1FkJHp5Uj5SKiE8dllhCis0WjhQJiF1X0FzRWs2fF81QHBVX0UjRWh2XnFwdD8kKVkkJVopckAxKUklJSExclI/YTx3UCgjcCEqLWh0QT82Wj0rVGtyRkVUX3VEcC0kCitidEJoTSVIZWIlUk1KM3FFKEFnQXlfYWApVURBRF5iP0dIfVNAcSpfeFNWbTk0bGBMUGN5T2loNlZmKDY7MzVBPkwwRitYbFNRZ0REfS1ACitHI1RBRG8zVERJdWVye1opZ0J6JT1aek4kQ0dkOTsrSEZpckwqeX1wRTRVbkZORCVqfEBsQUFpRj44PktFNDN0IXdYJGpkfD9uZUtWe3UhCitFJjFaO31tO2FJPHEoKXUxYj1RS0JZbDNTS0tsfHNDcjVLK2Y7YzhoJDAoZUl3P0Z9KHN+Rj5rUk82MV4wQmI/TlluK0IteDVaUmQ4eUh4CitINW5qST9HYmkjcnFIc3d3dSY5ezI/KXlSSylydUgreT9iYyRhRVFoTTtBWGlJKVhrWmFZM1E2M3xpREY+YjEjNFkwPnJ+PkNoY3tXRSpsCit+MHRJP1VgKWUwUWlqT0VhSHJEODg2Yj0/PmhDbDdpRjt8eSFCLXJaXyYme0AlP3hSWkxUQTRyO3kwe1dOWXN9dmlFeVRoTm91aUNlPGNRCitxRyRZSypXV3Q9X0JqTUtOMjdOYmVJdXwmWSp8eFAzQ0wkdF8yKUAyI3BtME1RNipRVUZRZE57PDNyS2Y0Qko5JEJTaHx3KTR1eT0wdEJXCitqVVBOVkZMZSZVeSR7a2V2bmUhJXIwaHdycG9NOWJZbk9CQFFCODR3XmVpdUYhd1ckTkUwKjslNkZ4SSFfJX1yWUJ1RWRwbmNlTER3T0g9Cit8VmlDM1BHWVV6Xjw4JkZ7QDdlNzRXNk5KWnRxQl4tLTUtT3ktT1hNQlZefH5GZll1MCt3WGFwYigyak40TT8/d299cFljR254fWtVOGF5Cis8eSZKNlR0RTsjWSplJHpAUl9NRzw7eEAmJnsrbE5FJEU8YEJ7cFlzUmlBZmhEN0Vhc2RoPXl2WmNOeXZlSmtKKSFmOHAtRTVMJXZtRiFkCis3JGZLWDU8PWZKcVI8NzFZdjJvdVImO0dmJlVWLWUhaTQ+TVBKKHZxOzd0QypSKkd0MSVlRiVXezAhe2ZSMl5IamNSKndqdEleYkleYU1lCislcSF6N1Z7YnhrK251Pi09UDYoRTtNejF6U2l4c3BPXzVxUiQpfWlNP2JPZzI9R25TQkhfUzBjX2ZSfjtxKC1DWnpoTUkmcEpKTWlNem1BCismbllmeT9sZGlAMm1jd1dxYEhlSmlEb0FYXzx2R1FaQEVyfWd1P1BTQighRkJNRC1OdX5ZP0d0RmExZDwyb0lAYjZzQURTb0NyUjIraVh7CituNEp1QkNvKG0qfTRfZE1GNmtfNFJNVXNyR0opQTFwOyNXdCYjcGtxYGx7JWlkSks4e18/ayo/Sj5iSjlIMlZmWUw7MzhPaWspJUJMPTJICitofjNkT0smQUFPZT54b31KcmlDail4TFZUK0lJREIkanxsbX5BZyYyZCkjPEArVksxWXhWJj87KlE1PkFTdi0jY3ZiM19IKmBlJnBCcFNRCitnKC0rPXsmI0dZKjA+Kj4pVWw2WWA3azlOTGBLeEowMmhobypNNm5fM0opMHJqcndieyMtP25ZWSE2WndMNzE4aSotfWUrfVVaKEN4QWxMCitEOyRZKzh1amBQVD5RcGFYQHdjQTYxWi1Xe0Z7Zz1QUyY2clYxa0F5RD9xWjNXUV83VyNsJjBkVEJNcEdII0FISzs8KXJkb251SzV1NmUoCityKW1CY3craXQ1aXhRbl5BUHVtKFdyPTVtY1ctVyNPP0RrRyV4fEhQTzZZZVRFNkZ2Ynl1Rj5WS058JE1kSntOXio/TG9QSEJ5WFIoS30oCitJQyMofW4pdExIdjlLQVBkQ1ZKKX1UYlE2SEs+b2VYMk1VXjtmaDk4diQtR0tKeD5fOXNuan4pRGFJT1QxKGhZakcreGA5ZDg1ODh3OUo/CitqVnJTUmRIME1Ndj1ZJGxoaVYtZiNzTGAqTlRvYTh2cTU8WXZgPnE9Vj0/YzkwfEtsUSU/QzQhan1PPExmdHc2RllDKGFjdXktOTh9X31eCitWWCpUe31qamw5WU9xNG5VcEtxeklHZXdsfTVRSVN2dFR8WG4/b1BVUWRPO0xhWntJMzNNT1F5MnRheWdla1I5LSgzVSlQWlB0JE47ZnVsCis1TWxEZENBIWVRdSQjIzg2O1kjaHE9d1NlSEgwWlcmYHxobWlCcUU2JCNnU2sqJVNCVXcyUmBFKF5vVWxubFZaQz00SDFeQnolaG54JkR8CitkTVN0ckd5U207V3BRT19gZHNgIVVhR2lIVl45K3MzRih6dHx0O0l4e3Z9Yj5iMiVxNzBwNVB0czhmOSpVMjVKI29kdTZrXkpifn1Fbn0/CitzTWNCPTc0ZDs1LU04UGF5QjwtWFUycipxWmFmVEtEdk1XMmckdityRVotWktMVCZEeHJULV9zZjdwSmVROzRzWSt5MVRLTSZAcUxtVUtVCis2dEJpSGBGdldfKnBTc0t9JTlWdU0hcT5PN1ZnaG15eSF2YnA+KGJNPXE/PVU8WTRueHxpYEQ/Qj0mMitrUC1yM2FHT1olcyUoJElrKFQtCitxZGt5LXRPRjU9Q3Q+NChaMV9CKWZjek42dXA8akR3QnV5cEh9SlU/XmkkdlQhaCEtRTQmTklUJVJKQFBaWihDP19LeUlldWh9ZzFIOElfCitWPmVvei1gSV5UYVY7bDRkbGRxOXUodTUxaXlkYn5LcE9rQ2V3NC1MKkolMjxYXlRkbWF7V35xSFdhJiY7N1UlYihMbDRzb3tTfHMrZHNUCitVcjwqbz5MfUxgIypFd0Z5JmBSZHlNPE9CfV56c01WMD00IVFLLUx9JkMxc2FvO3xne1NXSGRYNzhoZl5QWHFaJigmX1krPCNXIz5wPTY0CitKSCZFIz5EQ1haMDdMRHdwfWlKUyt9TU9TaT5MQ0dhe0h5UUxEeyt5VkhYV0N4aXZ+dzZAQ08xbDs1aDUxQjJeZ2ZuR1ghT3VjLXkjaCRfCit2NEM1ITEzd2R+clheOWFQdU84U3dhNkJJWk10M05Paig8Z3xaJVJIVCtyQT4yMDJwOyFPQmZmZXdjJCNqfSgoayR8MzdMTHVPeXZzRygjCitGYXdoJCpvO1dVKW19JldDcEJ9czRvVD9RRXBCLTRWSUVfcD5CJHMrTVhSMzBwaFB5Skg2cStycldNQElARVFBKUEqSjMwamkrJG5BQCRXCisyM3xkKjFIX2F7KlFxQGtOPz1qN2FfKnB2ODdfLXhIP3dWSVlNYlhLQ2VOamE9UHJ9JUszaE0+KX5gZCtgV2l5QWRTKDE+MztVaTc8RjVKCitpMyRUKUN6ZTx6em1rSE1qKFA7TkNXXzUqTVglS2dmI25PTmJpXm5vZ19YajA8bGI7PUs/bShZdmNUZSMlRz9CZjV2WjQyPCRqe0p3S1pkCitKPypCcFN3VHxvTGZBMStKfWpQM2J5UUFIIyYtMCskOTl5eEdURUxvaXs+Q1dJelVPWXNweHx2OTs0fWlfdE89YWYhZl9sY05hTmJrISl9CitKaV5EbWJxeGNxXlZlRF4tTH12a0ZKRFRmfi0kYCRyZFMzKT43eSlhKX08V1UrbmNmSCRBTmUjdVNLRjI2Nn1fOXtFWnRPJnZucE9kQ1M9CisjMjBSVm1fYCVNY0dOYz1lLTt0dHpUO2pjITlHaz1ZWmM/UVBAdylwJkBySD0/dE9NJE1CISs8KzctVlpLTG4qYjI5IU9gfjYrPnl8UWl5CittPTJ2bjlDcU9nSVMmP0tkZF9XcGNuRlBqeTd2QnVIXmlDNDRXbyo0bFBlfWNCXmNoZFhZbnJFMVIoM31uMzZjNGs0K3c2WEJSdC05U3N3CisxcSUjU2wpOGYlVFI8clV6KEpoPk4+MDlhej05MW9UaFRVZkpfSFM3YSRmYV5LPnwhNUlwK201d1ZNX01qaT07bFRkWTVrfVJQMX4xO1ckCitmYyprd3Ajc2hhKHohQHx7elR5SyhiQUI7eVhIcnJgMj5BZ2JkV2dXIz9SVyFxRDJtUGdafEp+QHg4dSNoPzlCPGA4RCFOQHsjUnVwbnRsCittOW5afHIjJj5raFhYd1QyeShPaHBUQitzclBGczU5fV5CezwkXm4mRXgmYy0+NlVje2shTXctI3N6amUrTXtLfFlpRTwka3dVKlM8Q2NzCitQMy1VcGk9TDhhPllzWlgzbm42d3VZUXVVMldCS1VrU21gVTZQJj5QQ0ZvIVB2dUkxO2BjUnNvdFk+T0p1dW9RZE15P143YGZOdzF+aDE8Cit4QFQoLSlATighYFImZ3lpanQqXm9WQHBQan4kdiRjOGF4QiN4ZCpueWV4aVZ1KW8qaSk2cDMrc0l6b0lmM2prQkAjREl2aU1kSk1iezN3CitNYTVRNmhad21MRE5DLStvOTU2e1E9P31TN0I7aGpMaH5ZKTZAYyRYKHE0RSN1fDN+IXlIe29FO3pvaTt+cjJxZCF8STZUZT5UT0VARXlFCitCME1qMkpmKGg1KG9AR0JzOSZIdlVoez5fVWFofnYmQzxZbHJkMzMyODZqTD1gdmY2RitfIWxBKVZNaktVQ21qJit+ZGBtQyo2fWpzKHskCit+e3F1aWZ4eWxjUkMyc21ITCtFTmtIUCRUMHt4UFg0e0Y+SlJfOzBUdSkldG5BKSRSI2BsMlgjVkY+b1lqa0x5RTtkTzBLV2V+LUA4JUopCitQY3M7WVJfMlQpJGRKQnlrOWBBYFZ4UWwpeT5tb1QoZW5gNighWj56bnt8WXUpNTJGOHY+ZEt1WndgfXB0M01zajc3SGB3KlhGPlhGVmB4CitTLUp2QWl0dm96LV5DdHhHb3tYKTBmRlRTUisrT1dedEhESnAkQj9hcmt7QnwhcTAyfEFmV2JnUnBkWSVlNXxhTEZ2UX4lYDhXKHgxQG8qCit4cHF+TFheVUVUO1djbmNadihSeFE+M3FKMVJnZjt1aTR6ZiFYWit6U2A3aSlWKXZUNmZ5cG1BYmhwKiM0Y0VPPzR1PDI0PzhXOHd8ST9gCitXJW8pdnxsZmZ3fCh6czVTQiNpOW0kSnIxakoqNEI2dVIlNmxEXyN2IUQrMTdhOVV0PHhrc3xvfmB2dXJJWXt2ZShfITYmYC1WVENSUHtrCiteMkd5KX5Bc2xyPih7KlJVRkJUVHA3ZnA8VFlXVz5LIXJWUjBfRHFINm9Rd3s5Xz9nUF85ZXoyKUN+PiNYcWxIaVppNUk9NFU/I0l3ZUE3CitNSj5oYFhIVyR1YyZIT3M5cEV+S0xkTEpJO2xZTU4hb2lBN25XYV9YS1BAWUdnKyhzLUIqezNrSHkpKSQoWW5VYypgSTMpVFpzTjxRcFM+CitmOFcwPVdAKm1pYSM2LWYzUVByU0ArVXZZQ3E0RENTZSZXI2BJRkg0PW99I1RDajNyJig9V1FFcGdsaDIkXj1HM3NLU0o7TzZiTHB3OT0+CitBT1Y0I1hgIztxK2lla3daRkozJjt2IXMpZz9PNEA5PHxSczF0Ylk1Uzl4RkhBc2Y1P1FiWH09TEA2RD9AejIyTzUla215OXdkZ3l+Um81CishTWNEK3xkOTVUUEBHTWlkQUp8Z0JVR05IUGIhc1lPV0hMQnVOJk93UnVvR3FaSHJYaDJCIU00QC07MmA9UjUhZDNsczBpfS1KZjNrV0ttCis3XjREKkxlUlFRWG4tcTAhcXhPQlp9JEdVSk5vOSNWYW4xLVgmQz8tKygoSFU3SUpVLU5Cc1ZIPG5YUlByNiNNM0hAR1ppTj08bW9RWGRHCis8NEdyP2pJZH1JfldFWE03IzZYdWg2TXRORT9vcylRMjJrPCMqZEhAWig4VUpYYVRvRzZnYGUmNSFESTFPbnsmRzdFOVE8cipCdnolal8pCis+RGp0dyZZUmtLdVI/b0pUYG9HQ3c+M3ZrbGtOXmYjczEjZilyNVZmenBBbzRYaGcpYm9kZlNVcCRvZGB3JXRhczs/b1JObUFvNXVMJWZoCit9KDhzZmp5eDMkY1MrSW1nPHhNSTV5emliWmxzI1lPM0h1Q0NHSD0zfmdKPT54d0NXOUY/QWxwZGp9dndIKjswXktGTWhoKiNNUiNRLUNyCitIeHs+Pyl8RFMxUiU8QGFoQ2BINTArYmNSPndBb0Y2JkQje3RvUUN4MUZhSE01Y2NoJjk7e3pkLVI8Jnx6Iz9ZVXlEdiMhZit5eU5hUWVJCit+a0EwYTZHfmg8X2FGc2l5X1JTdTFDb1BjKE9+K2N4Rkw/WGNmMms7eElQMF9TYEdRZk8tMW1zX2lKQ3dKa0Y/YmVNQjZkJSVqWjRieUZYCitRMU4zcDI2UEJSe2h3TERMRXYzKXYkZyUybTEwU2hgIX0jd1NMY1R0P1U7KFVlJnVPWUdEVSY+ZGY8UV5yMD9SR3oranJYfEdtNTA2WDReCitkTihAWmpGZGNGU3JWUEdTLWJ9M0wtKlJFTXs1QyhCQSRKTnlUQnJee1NKfXdlSSYkZjEwdm1KMjRnMk41LU9scUd+TFVJUzdkU2RBbHBXCitgaWw7V302c2JWPXA4OT8wVipuM0tRfm5TSUhERCkxJjJTUnE+ZitoY2MxP1RZTkYzM0JmUWw0JDFMMWJwOyhEbXlZfG0rRF9tQSYoSiZWCit5KF9DVThvbUZXZ19CXlIrNE5mUUZkIT9ncHtvS1FxaTFJXn4oekxzSCt6RFFyZ3EmRndnIWhFeWV5YmFQUV4hMERPdUhZSXVJPHRicnJOCis1SDFoTz5CSEBLKCRrWl5aTGtCTkdKUmhsNlVjKTckZ3drUX1aeGE7Tz5ibXh+PD0tTmcwWUl5WFEkUU09IXg8T2xudT9xLXQ5PTQrS0IpCitNP3YkNUpTTChVK3IjKVVKdjV7VColPzhzTXRrWjJuQFglVGp0K3AxVmg2SlJRfVNnSnJ8WjwmWjc7eFMycFE1K2N1WXx8RCFyVlh+VD5GCitKSk1YQk0oaENEd2tRPnFYZExJO0JfX1c/S3RTLUQ2aj1HUmRydGE8REBqN3ZFP2V6K0F0LWkoWW1rSHBIUSlSP2dgbHJsSz1Ee0h6S0NHCis1bFN5TyRZSkh6amFNY2E7T1VEMmpxdWwhKitHQ15gdUJxTV9OOExZVzZzRyF7TVJwSyM+dGAyTkZtbmMqN0wjSk8jeThpUlRpVEdRX25jCitiVnRGU2ZINTFRTkF4fUdlR24lTGxQQ2UyVzZIOVluOThuK0NKPXs9d3hIMnkqOSM9ZXxzQDdVVCZlcX02cG17OXVTVDd9WnpgMVRqJStxCitaJGtOJkA9fCNOJXNhPlIkYHt5YCMqPyZrZHZ6dmI4a01wdSRXM2pyZCpMKWFaPCVPWGM2bCVvUk9wZXQzJUVxJkNJaWhnblJfSkdTT3smCiszJH1DcCpNdntifHdxSURSQCNBNkRFb0MwXz9IO1pafUxjajw2Y3hUelFRaSo2PFFOZWU5WSVBTmI9KTRVNHg2b055Mj8raDJDVXJ5Pz5OCitpOzNAIUxQZlMtPTBFVD43ZyhfVT9QPENobnRvcm5SdUhwSkszMTtOKHdvR35JVWNKQyY5JkRiTD1GYyVrRCNOLU85ZlpqNlQ1O1E1SzEqCisxRnswKSlpOz9PfG1KVX57YiZ0KW5KYDxLdyh2fSpgIXBDT28tWXomNCtRJlpHIzNYJkhFQkBDYDZvMHZNPU1HKXFWP19TcUAmKj5PVTlxCitEUD1RPHo9I0VsY0A1anRoTGAzQUJlO3JNdCZQVjluM3JFe2V8K0YyMXElZXxDJE43MnV9WGsyQjR7Z0FCWjFpbnxOX35hdm9tfnk3WHlVCitTZ31BMWtvKkVeN1hza0pYK2M4bzAzY3VIfkF+S2hHRlhDQ0l4dThqYWAkK0xNWDdDWHRqQTsxdn1pKzJzRU5QKWg+QDZhV0FLMm10ZXk3CitEcWJJREdVVl4wMDZ+NjAwMUJXMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNGWGttMF5jeGBNaGFDei1wWkZBZjxsSyFxPSE1d2VQCitHcUVJLSEmbTZteDY5WTZ0eEI/Y2Q4dGpFcjA3NXJ3OGw0QChHNGtFY1MtKkgwWiRYYXloKFBGeVdLQ1ZEKSNgNT9uZHs2MkdBVWl5VXFICit9eHcre2NoS0clfnhwNVlFX3ZfOHpAVlp8dzl8bXpse1pwcjF5a0dRLV8zRzRsU1NefSREe2h2SEwyVVQ0S1JGcTdIYlM+UEBYY3ptZE1rCislSVcmWFRidWxqK25oRitVNV9gdHRkX3g7flVAWl9aQ3l+dUMqIyhDcFJDWDx1UDdtdXpSY3hVUChPc30xdjlCP0F5I0ZtcjA7MXJTSjZiCitVJCQ7Kmd6YzxXeVM1YkRgej1wNWdjYmFaMUNYKn1XanFjRHhgM0MkPSZQKn54dnckcVI1USpLakpiVCFxRj8xdl8mdSktdi1EY0lJaGZJCis5VWN4NGk5Q15Qb2ghWFBZe2x1cS1IMXx3ZnY7U1AtXjF4UXkta1gpVSoycT1KRStLdntLIzNiKXleYHJLfDBmYjcpbip3aUNGKEN2YkI7CitTS3dteUFUVCV3QTwyWVJDTTIxfUdqPHNLM0clP208U31zKSVnS21pP05BZyFuSGY3SlNxOUR8TCtjKD9PbWpqWHspQ345SnErMlg5I1UkCitCaUFraThyVSotdVkrKiY1WU9Yb2E5OW9mfFlCd1RFbjx5fF5RQjBpN0VPKFRwIzQoOCFRNXJ7Zm5JZjchRCpWeWFzMGcpaThEZ2szdH0rCispSz1DZV9sYE5lMzVnI2R2P0NNOCV4IWJ4czk2KiRaIUVuYFI8bVlVPmVEU1QjYHRFYjUzU34hYm4kbCVQMTlHcyNzPklGP3ZTfm16eFJ2CitBdThRS1c4YUluWVd5U0tDUUZJRmA7JFpsclRLbWlvcnwpU25aX3c7WnpVbj0+S3g2WEY9Myh+eUJmeHIkYiloaGoxcTJTJU1ST3B7Q3RDCit4c1IhRmpIcFpBfX5gNlc9ZGVEbmV7b05ES2hKR01wSTtaUDFDRng4KXtkPVBEWTRqYmBOSFJTbXFoYTg2bFFnIzQ8dUdeOWB5UUEobU9oCitHQ3Z9WW87fncqZkxWeWUlfGYlZFN4QSVHOUxvcndFSi1afitjVUV7bU5BLT9uUyhLN2o1enZhJVVFdU5NfEU/eVdPVEErc2FjZFBPXjlQCitCTy1VOz1YRmBfNiM0K29oNk5XaTNKUnVJV2EqSldeIVBWU2ltPWxKJU1KJVRyJVloaSNpSUN5QmcoVzlnYT1aMCVmK2VARzxPRUFAdm44CitpJiQhJWBybHBERnBqbDlzZ253SzxiWCU1KGUweFdFajZja2AjMTF1PU8hVWtBU2ZRMWRHcGx9S3NQRHhpbElXST55Tj8rZD5DMXE2VW9CCitOXitwazQtTUV5eyR7bGV0ejsweTdsVFAtMkdVQzNTKl4mY2wtN1ZsQTBEUzQreUQoazRsbihpRXZhTWF3aUM/V0QxaE5sN05OU19OQFRUCiskemNCX0d5Vz1mU3Rfdkx1WXR0RlMzZTR1N2NRZDs5KFZNUjZUamRvdkR2cCF7V0lHYWpObD5AP15DIzR0Y0pjVTRDZChXaXVwQlk9b0grCismUyolbHlLSSk9Y3lsZjY9WkhjISU4P1ZleHs+Uks5dHc+Y1ZFe1d9c097KSRSSkpNJU1WPW10ZUJCNmpCaTBTJFlFK09gWTJ1MTAoJTlFCitfVnkoYCFLV1U7SG5ZTlFzZk41cHlWODY/Y01CQit5RXU3XlQkXypOMkhhMDJeTFojeT5RODlXWShARWwkdn5aPVZFfkZNWG0xbVorQClGCit8Y3F0ZEo5Qm9rUGZmTWtOZ2E2KnleXl9vQCtVVFMydFVSNzhhVkV8c21SeWBzMEVIRTVnKERFYksyRDRLOGxMT319eDU3Q0luX0ExT0M/CitUdUR3O1lsd0c4MCF4R05zazMkWn07WlNFTjtxWnBeKjtTa3VhdStKb3tWR2VoSG5IbTRkfWUoMGpocntAQ1NXJX1nei1JTz8kS0tYc3g3Citycjt3ey1pbHByLTxjSXBkSyh6N09oeW4tU0dSe01NS1hWUVlmSGhXPnE/N3dsQU1HXnNJQjVXNm5zd1M+TSRRXzNXYWFUNmlOTGd8OzRECitlMHNwfT9QMkhCPkZMfGtHZX5mTzF6UXktcVolfGRYTG1AS1R4aFNXa1JBLWV0azVORlJfVVJmKU9BQTNSJCFgOVhob3FPaWVpMURNT2FKCit1VlhsWCREMlN0WGt0e1ctNyVrMXc3TF9xXjYzZH5ZdyR6Q3p0NVcjR1R6eXREVXRqMFUjfF57K1UyTCZIQUVTKCg4Q1lvTVYkcXlSU2FYCisqIXg7YT4pazlDJml4PjQkZWhLMTMmJXlMc0dGbllqWF81cCpAMHx2YEFzO3RvMDFFVkomUl9lSkBjVFZBP3t5MXFtb31STHlDciM8LVBYCitxSSlrT25idlkheWgwbEE0X19EQEBYZ1pTNj5yclk2ITxNTX4tIUZpZyRPQSk3UXNaaWB4cUU2dlJtODcpZD83OX0lX2xGXzFNZnZwMGA9CitQYTxiQmwoO0tUZzR3JGlsTXBXdlY7bnwjTSZXT3YpckpPPClvRHhHX3N0a1FuTGheUyVSRT0mZlRxSWleYF9KdFo1IVojSVlxQkorOXsjCistYU1xVERLdEFTQ3MqXnRxKmhMQD1KcG9QJDxeRnVPSFF1bDdTKzVVJVl9S3NDfHMoanRqYDdjVHYmSnVeMH19Kzd2eXQ2QFR5aUE+KGFfCitJcjRgalp6QTFBe1RCYjZ2XkBedmZ1OGY1MzBhRFRkUWY2a3Ftdzdea2l3VEdCRSYwSmxIITdjUVUpaEx0Z1h1PTg4Iz8oYmRnODRUdnBRCis4MDV5I1k2NitRTT5ZJj5hWUQ+ZyReQiY4PERzKkRVfnVAPXQ4KHFUXjNsS2p3QGlkJVotIzdebk50fCR0NVczY2c1WERRQ2BjSlgjR1k9Cis3aEEpMy1fWHNXNzVySkJsb2FvPzlkUHRwYmJhYDhQNz5CYGIram5uRS1zbktaSC1sMVomaE1sellUbGhHLWdTKCUoPGElKDNpSkdxcjlOCitUI3JNTzhTMU8zfmQoQio5JkR+STg+UilrTVZ2SmtBcW1YPTJsYSVXYUhZOzNzKk5oWFojOWs5RSEmSlE2XihGSHU2WWNyNnwzekdDdGo8Cit6Q09DLWlXR0ZHbXhmZDJiZj1mKCZyJUhJOVYtUFU9a0x+dykkfiQtWWsyQnhVRlgtY2xhbStELXhrQnxgZUFUfVRYQ31EY1ZiVkklJkQoCis2V2VTezFfQyU2MU1RJFdIeXhkUHVvV25uamsoXk9ZUTd0ejhAV2VkUXRuekU0enZTR0FiMi1XVlZreEdaJCYxSjc8eUhHcmRSQVRrN0BQCisoXyZuQn1gQEB1fCZFQjN7JkUpTnZXNG1lbFcodWhvUChLKEdZXnYkcjU7ZTVPUFYkbHklI3BxYGoyJnZKdF5tM1paI1VTcF5kbnRRQW9qCitLaWw8MHl1K1NWNjJtQDkmcTNWVCQtPipIR1dRUzhDTVdtblg5cTJEeHRpdXhoe0xMdnQmMkQhJU4rKjNkQEFfKk9qTEU5TDJDVC03WlFXCisqMGp2YTV0SkVyRV8kcllWejVSKnJGUkg3cm5EdTU2KU5YbUFFKXElRlgrOGV0JDJRYShhMHk5PX4xeGN7UHgmb3NlTVl7T3hBX2FOa2Q3CisqUnVtTmE8WmpaTyppaV4mJUVvSV5YODQ/OW5NQWJER0I5MEg5bUxkMlhaQExlWTwlTzJOTHkwQGMlU2lJa15oWnNfam5BYChBN1lfKHpjCitgP0BvM153b3E3YVNgdmVBR3JROE9fMiFOKjdxc2g7T1BseE91b3hhVEQ9OVQ1LUp4Vk5IbnRLXmIqMHNReSV8Sm4xJihIdThuSDJyQGhFCit7eWlRdkQhcHs5RzdsPyZOKShmVipKX21BeFYwV2o+anF5RkFHM1kwQFV3Q0xxeFl0XjsyUzVqQHlxUWg2TVcwalExd1JGdy1nSTttdkB+CitpI3F1dFJTU2wpZFg2KFJhP1BaQkd9ZmApKz8zPFFYV09jRDtKMy1wdWdqXjFxJF87VH5eYThoeHR1NHpKaG1nKnFnaT85MEQ4N3RAbkZ7CismK0xLO2dOblU8Vzg3V0A9cVIkVVpmOXt5RzdzMih9ZWMtSzlEPXVjUXo2a3xMXjJWVHBZcG8obW1hbFE9KF4lY2ZGTWRyelJEfD5mdWdvCitfI29gNlQmVjRLKVVIa3NpU185JnJyekV4K24kY0FBaWRvSjxFWl84NzBrMXhiYldrcCRaYXV2eVojelNtcHF1Q0wtNkBzQWlXO2JVaFVeCitHK1dvQjMtaXA1QV9rdzFYUSpOZkM+VEc2e1RGNjhCbStROzg8PXlHTEkocGJpcWVtNHpHd30kfDxucHVyZGc2UjA+a1lhKil6THpMbk53CitMZFpzaGYoZmc7Nik5b1d2Jm9vUmRBZjFfVDFGUGE1az01YHlyYWkmeFB7R2lEMTc1UTl8U0JtXm1rc2xUTGQyK040cHVmcWI2MWk2N0NxCis8QDslJjR4Z3NqTD1KRSNgcF83SXlNZ29yYEZrWl5acVFIPGErdytTUWVXOGdeelUrYzEheytWYF5WeHRGQzYtbzJgPWpaSj5DVENjdnBUCitZZT1BNn1pPDNtZmd6WTw+aSZFXjNHMFFVITQ4dj5nd3xCPmd0Rjh4VnJsQj9DUDxPPGlBOFV4fnM9RnpJeUU5c3xWTmY9ViRvdkt8NkU7Cis3bkNVKWNaeE92MkFXM0UmT0Boek4qN1RfM0Q0eS1oeCFQViZZVXhKWU9aTDVZMzI8XlRJekpGO3xET3todi1CWUBza2o9MjVsQVBiNDgpCis8dz1zbFQxYDQ0VExNP2BjcilVUnsxSj95ciEkRjk0aDt9anVnezJALWRPO0pTKD9wPCpJdmxqNjQjWSUqaih7MThKXisrSyQ1a2l2KWloCit4VShfeHJeKG55MzZubHhuU0FnJk0/Z3wkJCQwbClEPDtabGYrTHM2cTYoQ0t7RGlSTVo7QC1ZKG1ZOXREMjFiOVhmQ1hPTz5ZT0dGRkdmCis9USNJY2Z0JTFeN1poMih2Xks1ZCg8S1JaYDMrbWFreEUwZlpUVldub0FpZyQwV01LYTEydHZlLW9AZm1pfUZObFBwaEdHajw2I3VPSGVECis+cW99ZmclPUchJTlzdipPPDloQEg0YFBWYVhVUjhOLXNYaENGTEEoazllX1d7VzhXYDZwbnhMKUxORTFORXNCZlkjSmVJXjJWcysqNUF5Cit4cEleSFExS3pfJERyXyUxMFVgeUZMXil+Zzl3eVNobDlkUGp3SW5vT2RldGphc2JDOyNLIT5+MlhIKVRLO2FNbzt7YzJVRmtWQjNrbTVqCishMH5gKWlJSEFJXlBxPzZQMDBIbD9MXlcyck0obmxRNT0lezBRfHZXanVNdkJWKmxRbV4pX3dAZXNpUCpZMH4kZnRISEJSeD8zJSleTCtGCitHRmIpWFlzR0NCb25Ve0YpPylDcHotMjZhKnNPOTU2aDNAfmlPbmtBc0gjVzJpQzlzOHsyQSQ0TDx2Y2UlJiElRzZMTXNuMittYVQ1IU1UCiszd0R6WnpMcFEmIWFpOW0xfnhlaHUoemFPZ0NpYTwyaG00ZjNRUmtRKEdoNk5JMWBDUm15ZlFnblZhKnYxVjMoZzJXIzBCSGI3MTMoJWUoCitFeTFDPkNoayU4ajdidUpQaVZBNUoqRlRHfSFuSm91PmBYJjw0NUQyJH5TTihOSnRId252TkRURXh+T3dpZENxNmpoNjtUM1klUiFMPG1rCityUXE1eTAhXnIrPTR2VXA3UXdYP29CKW51dUVxdE9aVVUjOXp8fHQ/SlFkZyVCSm57KFZudl9+bG9ZWEpNMXVKUmdEfSFXYUgjVkQ2blkkCitmMnx5P35eZilITzBXRTU+ZnVtQ1pQU00xbUc9UzRvdn5hSFRWJGlYcE0hR3E1a09yTH1maE01aWZDOEB6ekBuNDhpPE9UWj8henZAJkN9Cit0dz5LTjEhTlhJZEtTM3xaMjNvR3gqcWZPQiFMWj9CZWlfdVkrdWppPlhsezVmTktzaml1c0hiKi1xJXxtNUtHWHNhMHw1cEMzPE1ZbVgoCiswNExCa0k1fG1QfiNLTVdaPD1yaX4mezJ0XzBtSEp9fGpGPGd1eDg8UnpiODV4Yk0lYDdSUzQhcXxMYnMkIXw9K3V9LS1GPWU2P31ubGlQCishWGdlNUpnOChibnBweHB3fEt+ITV9Njh0RHE1cWs8Tm9fU2FuR1NidWJkcE5Qdi1tTXUxaWFXVig9cEhsUFpnRSsoTkVMaEFDOXY7e0BUCitVRV9nYjBKVnd5Zk5VRn0oXypBO3NEbHdmVmpWTylqQ1lEUE1ePzw7bU84PShSWGNMLSV8cDxiSXQ7WC1QN0IoaHF1aTkwcEYtMWpSVnFtCit1ZmhKKDc4cFVeZ3E3aGdESXhJdi08Kj1rUmJzRXFQOVMqVXMxX2NZTD5kWDBNQyV+R3Bqd19xSVItSEVIM1Z9fWtVQjhyLXdKbiROejI1CitVUl5NMVlqazFMYVB7VHBCWHpnTksreylnMVJwSUZvYTxTM3ZIUFEjRFl1YFBVeDFRb1RJWV9FMjBLKiFwWiUyZmRJbmBfZ1ozWEBEQ0dFCistc3h3eGFTI29mdHpfKk5NTmxMV0YzMlNRWTtFNjBpWHMzJSRlST8oYjVfZU9lKjVRKH1FbUojfDxxZVhLMG51NUA7Yjh4Sih0RV4oczJjCitYMHpCWVZyWG92MHYjPmIlTUhNdDIrNS1kR1hLazskITgtdVBZKUIlTGtPc2R4ZTg4NH1Me3FAV1QwS2FkKkVJOCl2eDFle3p0TyFlMVppCitNVD5WO017MCEwPHF1Ym4odj9USWtwRUpDX0NNKl96cUBEYj5nPyp9Ym9UMT57UG8zfkttTjxfSzdhQTItYHsqanVrRCY4P3xiTFp0OFUkCitrcDt7fmx2Ni0meGNjTC1oNXp9e3FjVmFhaG57cVN4PygoWHwrcmFRTntDUDVkUT5lWmN5fTRQZTdRQFpXdj1fX25SMngjaF9peG5ldV9OCitEYnd3dnw2dGM2em43d2QrakJ6bDlfY2g4QlkhPzV8UGVeVHkjQmk+OGppfWdkajZiMHtaXll4dHk9SG5WdEhYVE9rYUA5VTVLTCVFPEgrCitQaX50XkswKWplNDgqXmFTNj9IQz44LWRzcSh3dDRiM3sqek5iVDYxZWsyT3ltazJHTWBXKWJoYjUhdnAzMDtDYHJ2SCRCdnVXZ0tmKmUtCitwSE57UHJgX1ZkdCZUKDgyaVh0QU5FSSVgO2hiSVIteWRrJm8tTnp3YihSNWZ3IW4xMX5EZUpkSyp1KXpuNjswPilGbjBsYyZ+RHl9NDYqCis9bCNHcEw7cW5oKylnS3RPNkZwK19YPUE3QyNRNE9tYDtvanowPmZPZEtYKVp3fkxqZE9nT01HSW88eiVQckw3cyRNNWwjdnMqN0BxX2ZrCitiJHM9OWVPSlduU2RLKXlrOWZ0ZGgqUk1aKF87Q0tnS1ZOVSZ6TWl8VGB4PnNpe3VSTmZ3LSlNY2Y7Mz1mYGdKaUt5a3J7UlY1bCZNXzR3CitFfFJnPXYybSUzY3koRUdIN3tzbmYmNEtVaG1XbFRwQj1FKiZgMlBSJChQdE1MSjNOdk52QE9KPXZmU1pqeSFyaVBfMURERlllSkE1dTRiCituPH5EP1hZK2gpRHtsbFNPYCpTNFlZaF4mLW1BdWNFZmxRR3kzKG42M09nQVd4bkV5OCtgWnJvdipRVUt2bH1UQzt2b0ZQRyh3bWBgVDJqCit7QHxxY3BVYkBgUjxpVz09QGB0OUt7M0VOPF5HM0pZRzB8a0A+eEc8Yjhnb2xIOSV+e31qa0BhMi1jV2Jeayl8PGo5WW0tQFdLSmZgP19xCitkQUNAI2U3VChOKipscykoZypke1AmeG5vbXRRI2QlR0FlcXI+UD47PnFmUHJaLXAhPDRBKDVebC1AVik8R0s/U2JAcENZWmNRPEpZQ2ohCitaNEMpbCN2WiFFflBGX3hDPlVTUlF2cEE2Y1VZXylAQEJFalY7OFV7WXh1flFZcl9VcCQ5Nmg/cCRkYigpZG1gRHhZLV5SYmVeUkV9YG99CitHTD59ejMleWJDKmFodWBUT3xNRmA1cF9EUGJ2bXwlRkVXP3pNa0QrTk1HTFN3Qy00VllJRk47SCloSTRXTigyazVeWSVQb31lQnN3SEpACitTVSFZKGNIUndZMXh0Y2lZPGtKJmVDO3BGUm8ycnw7Sj5pVDlDendQKHR2X0VYK2JxUWwzWCVmJFJEViF6em11TS1ZJSpjUWdgYWp1XzlvCitnQDE2RC1xQDQ5KDRMZ0o2NlNwcishKVM/QjNufSpeYkpyWkNDOXgrZkgpci0rfCtnUiNBLVZCfm04Ryk4fUVlPHZEKDxjWFlYfCZzKlkwCitTNzheTSQjPFcqO3JIcy1JTz9+NnlVMDkmeUx9KTRTZjdJOVA3dX5CXzB5QHREaHxJS1RHOChhbTRySTxAT3opeCReUWFTTzlLUUgwMDAwCis4MFB+ZD1OMWJZajNEWF9gMElfPWowMyFlWjBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFFjS2FDTE5aYmFHezNaN3kobT9MQkxBK3NLCitqTV4oJGJnd25XQXhteStLcSVQSCVYeFh4PzR7Sjcqdyl+UF5wTk1RdjZTT0M7eGxsfH00LVNhQHQwfkdEdSlMcXF1bTNZTyRPaXhjd3pvCishU0JTSCZ7QXhSfGUrUlY2TWlxSTZqblJUQ3dYeTJ3X0l4UkJvbShKWn1BPiRKIVIoSkRgOyNZfGplWChPczZ0R0RJfHFEOyV0I2tJKDFNCitLITleVE1lZlh4Nk1VIVNCaFktKFh6TX13ZUVZX0gwOHhLT0dWeW5aSypiI1g8Ri1WbURyTVNNJDttJW48UV97O0ZJXktnUXpaKHNXYGUhCitzJD5lZClxXk9ociltMERIMDt9I3ZKfS1jc1lNcWdrOzl+RXpKTEtBTVZWQiFJSnVwUXZWcH5gQS1kPFBObiFjMkYpZWlLcj4yNkBae0JaCitoSFB6a3pSczxpWCRLaFFnWVVtJmNadUV2KVBwWWJAV093eUVJQGtvKFlDYWQwbjd3Jl9oLT5Oc0luOSF+Yn5eV3AkPEpjaV5rb25IbCtiCitCd1lkZDtaPFVfVTEoS1YwYG1SPzgySlpmbipGUkV4Jml6djtiPTJBcHVDNUErKllSbE9KU19gWk0oRWU1QXdQPD4weiZGYmdRQ2FrMitMCitPM1gwUHo3cmJVPlc8eEE7RE80QDVwKmdFTmZxLTJlPikwNypGNHVrJUdGNGd2MmcoSUNobUc1KlBDbiM4Wi1Le1NiOSNzQ0ReS0VGPH5iCithdFZJRUg1dFY2PlFAb1gjfktGJiVVbjQ8TUhtMHtffnZ2SiowbjZzQT1+VXw5eTUhVXRZa00pOHBndTVkVSs2VXJ0WD89LTw8P1VsMG0/CisqTUdeako9MztsKzgmdjxOMmN3dVg/dHdpb3x2e0xydFBVfGR1ck9BbllMJTk/WVVgdFpyV2Ekd2lsLUR3UHx+OCs3MzxJcD1tb1paQVlmCis8KnQ4dit3aURCS1Yla25rK29eOGI5cVRzdz4tMFFedChyPihGc2ZIMk4/VSFBNn1mMSl0Q24pTDllbntnZmhRNUQhWVlhQ013QlFeWCtCCitGVTVJPk51RDlMQmh2PVg/LT9lT1IoWjd2bEVXUVdVWTFjQ2AjcnZ7WShRa1R7aWpHSlBXJjdoXkppckghXjBBYGVDbk9HemxnTWs5QV5mCitzVXJtMDhqTlMxOz0qMmYlNl8yKSRsU0ZDJCF6OHJ4enVxODY3O0RgZF99ZkhHWntYKG9EVys0IU4rSHxzdEVBb088UHVVfVdrJiZSO1NACitMd1EmeXdtUyppTDRnO3paKHdfeDRnKE5DZD18ZGNmJnFxaz4qbCVROVFAREJxZjdMeyY5K2I/Q0YrMC05aSNGKmtEPCpEfiktcXAqKz90CitQam1+MyZ0fkFCPk0+Nj5seE1vLW5RblEkSWQ7JFdtPV93IzMqR1dzeDRobVF5RikkWlAod009RWwwWkxjeXNLSV5fVVk0PHdVb2Y+WHleCitadjZEaFEoMGBxeDB3JXFGUUxnZjd2cjE1fEplRT1fXz1ReCMkTjJCd243LV9oQF9xRTB6QzBlfHpmVFY3JVR4T0RPbiFOR2F2dH41JHtyCis8Q0ZyOD5zcmVHb0pGRjl6RlVWcDNvQD0re0taZWpMK3swNWY2dyYzNnhoLTdKN0BIbWQ7VzBZVjdUVGBiUmJWYnJjdngwPkRHUHhHZiNCCis+OGkxb2tfdnFUKGpzQX1GNlBfNDZudHBDfVZjQFd7anJZK2pVcl9OV19qMXVqP2xSZ0Zwbj9MVk5sVDlTKUlsTSRld0w2QzVZV3M9X15ECisoRiZ5UFJwYHIwJXxUUlpYIUAqcHMzT1lDd2t3QHxNYUs1ekZ2c0xXaFVtfW4qeH5UOy1YaUpZKDd3SFZtPUV0azdPJGZFJlg5WFJJNTNOCismZCUpeldsXlZ1R2R2cFowd2JLR3VBYE1qYEQhXjQpY30/ezJTdzFMKH0qbDFSSmh3enB1UU5KP3taNUszT1h8XzNUT00pdn1mYjxeTD5qCitgNXp4YmZDPSs+KSNgbXxKQy0oVD1jMEg4PHwyQFpVRXZtSDtTQmglVCZoVWxaNjV1KV8lJEV4MCNZOGF7eGhURE1WITNgOzkpaX01c2tQCitqak9PT2pmbnkpb0k/Pyo0eWFDPztzPG5TT2cjX0V+a25zPlc1RSFGI1QtbVYoPGYyTE1GIUxfaDtnVCpGMCpVbzRvcmlkc0JmXmR8U05qCitScGYkTio1IS1PQXt8VFRkU2l5UTdOUzlTalR1VU9leWp6WXtmVzg5TjdfTGlgfXJnZFdfQW4jfXxibXVwQz9XJHozek1weE1KK3VKcHFiCitGZDhHQFcjeE5DVyNLWEQzNTN4b3oqZTtxWGN+S2VBZEh9e1Y7PnpvXi1QaGspOX1UZ0hXcilNclE/I2FOJCl7VndzVDIoKlhyX1hkaHFPCitEbzhIbU8rRkwxa3ReOV94NyZMeWhNZ0tmTitBZE9HUlRpRW5oIXZmWkkpNSQhUmh5a05xbWMhbT5zamRRfmItMlA9Y3ZIPkQmZVRRZj5sCis9KXtsblBzYG5pY2lYPnFfN2F3NikkVClMfFVUMDVoRiFUbUNjXmA3Zj1OMlNpdlYyN0RUZ1ckfT03QnIrPVYjayhAajhDMFliXy1sJTklCit5bEhPdWNpZGNAa2M7UXtadjcycGlSdkUlbHN4QmRHYTJ6ej9ZOUBnKH54ZEo8aDt9TG9zejNMantYcTRLJmUqV3EwbzRpfiNUSzUjSVlBCitPYU0hRV44cTB2eGM3bjc4O3pHfDlvfFk2YWlYfEMpKTB6QTVQanlpOyZpRiF3UFAxYGYrdGpzRSlpXk17WTNFKD9oMm5NJkE+eyNJMDFRCitCb0J2a2h+OWYlX1ojZldWTUw0X2J+azNtKTJfQmtFVTVzaTwqMz9YXzRuTHJXLUxoSU5BUD5LZj42MFIxJXl+UTd3SzwhU05DVnQwZ2l4CitrMjJDYmgpeHE9K2J6a3p1IXpmflBNVzRORH5OSVdtfEk5VCk/NHZOQXY8V1pkaV5iNUhyQiRoIzxzTG9CUD4mYHcrWCNOR34yamE0ITxOCitSZ3d+JHs3Rz03NkBsbGR2UGpPcGo9YD9NIUl9R0E1NTttfGZyVW94byRITE1yamVUfVAtY2Q7VEVFSE5iOCtWeElOcC1pNV5CQl9eZShNCitfX3poaUZLKlopdXoqWGN+dV9IeGgtQ2loKERvVDg+NnduQ18laXp8Xyp6az5QSHpDT0BhUFRDfF8wQlZ7KnhXazlIbHZBYnk9RVNnfWcxCiteZnduWmckcGgpO19PUXhUKlZoUEMpKjF0U3FUN3pSdk9NNVJWfFQ0YnhHJXowI0tFfXtuMFdkS0x2V1NzdkNrbHwjTkhBbTxQZSomejVwCitMV040a0hfN3lmIXYqVFF2bFcqPSNXQml1Y2dhVDNacilDeVZTKipDSUw5SyEma3REKWVfK1MzSVVOS0gpVWpIWnp9fUF7T0lIa0J6S3VUCiskPGhnJU5fR1puPU5Kbks7N09vIzYzeE1hNTlLejRfQWpQTU1vb0ZMNmlEJHp1YDJfRiFDRkNhN3hYbi0xPFZDUWFRQnVnaH1Le1ZKeWVFCisqbV5QWHcrKlRyR156Y3k+eUBCQU42d2BFYGlyR01wVkc8LUdJOVQwbXp9U0JRVCUzdVReMjhZTjlscmt3azxKcHRWPHYjaERoakI8Ykg/CitPU1FkMWY9MHo0RHV6RVo1byNMPnRKbjl7ZEphWWNrcHFMKD1BbUZ8eCF2eXRZM1heazgrVFF1YnNYOSZ3MHB8O3AwaUtqbz8oSS1UeyY2CiteUTVENWcjX1JGOEtjSSUwWVMlc35NLWJhdXdLWCl1OTB0NDZLYEdAQEw8NyFjSzJBeWF6PGhCbGp6QyVYdWUyYmh8eUdVK35hSHthPWVvCishZExKbEYlUTswdS1kJXBYPnZBOUM0ZkZqUWJkIT9DeClsMHpJN0MmMG1mX0pebUs3U2d1OW8wTURFeDs1bFVoVGcrWTA/MFpuJGAlVi0rCittclVXQHZ5ZVVucTxlcFVLeTYyQ0FebV4ke2B+VFIqUn02PXEkTStkO0h9RVQrPEB2M3omJHNsT2hOamwoXlh9TUpuLS0+SnAlYEclcDd0Cis8aTQhZHwyVD9DeEhTXil+NzxfeyUxT1hzYXVAaGNsV2MxMFRUZDxgN20oOCh7X0stP29GMTYyTmJabF9xT045PW1PJTZhJTFNU0tQajAyCitDRHdgbn5UZGZVJj1JclVfQTJrRjx0am0kdDxfN3dwXkUwdllGUEsjQm9sM1kjejJAbF9gbVlTbURBWEk3TllKRUhnN1BnVmJQVWhSMzhHCis7aVc2PEtZMiYpZDxsMDV3bDglK2JmXz9KM3olYzNARDArWEdCLUVwKzs2Zl5LSjByTlVXKjNHQHdiWWp0M0BoO000QWFzNDNBOGZzO2BCCis1QXcwTEVPeWZNYy11ZlYjWFpYKFFCbzVFbDZDKXlINCo4X1RPPnhEe1RWTncmTVppcUk+R0lTKWJ7M3JiT2w8VFc+ezJkV3hibGI7U19UCislLV4hTGQ2YThAcWhgPVB0R3d5JGU5ZDxUKGJ6IVoqK1FCSzJicjchPWk3JTBwYyNRMmlZKl9DYzlMb2lqemFlJlhmT0R2Z0pgKHhyODViCitRQmtBIVNgMjc3KT1VMlB3P0UlczAhPkdybmU7RG4wTnRfPDEhQHo7VylSREM+SGl2JkNOSHhxd0FWOUFCVDgyVC1SX0pffl8rMUlSTj8+CitzPUhHPyRgWSp5ZVold0dpUTRPcEk+eX5QP2VjTDN2dmtgWntgKmdFa2ZrUyVUflNLeXpvMW55eVNvdXBZWiQ7MnA8aT95aEteOE9TfU9pCitxNypUTFF6dUdudEojZ3B1WT4kUSgmI0haIU5fUz9sQEheQWV5cFlLVzZLS1k5QjYpcSRoX1pRa0dzVTZnN0g2PyVPP1Bvcm9GaWBjVEkmCitDYVdfQ2V8JmZ0bWtLfW12ZitDZ1hHXn18MitNR2tuT3krIzl3TCR2dCZ3QipqZW4+OHA0K05hV09aUmxISkA7JH0hTWZIdzsybnNGUF9DCittfX5DOzAyPzA2NDdaKyMldFY5YHhZdEhiRHZXYG5XTGchcVhXJXNwYHU1USNGdmx1ak9DUVNnRiZ9WXsrMTFfMTNyQ2hsMEItMjxIejZZCitwaCEmT3dJRE9hJHYoUkQpfDk0Tm03QHhAYGtmcGJFK0I8c1h5NyNENEY7UUpxR1B6RU41dzZnd1BPd3dBPDczbiY8NkhEIURWYS07VWc5CitIa1dxbmNYcmk3bCg4PX1aZiYtYnh8d18hbk5mNzc1cW9kN3Uwe3dUZUZVMUdwOERvKTNEMXE1P245KipJSTt5NDVUWWF8MElnVjUtI09ECis3TD9MPmRzM1A5UG93UXE1PUprdm5LSXMlUVl2eCUhJTteWnUzbD9IeFQkenAoZ1BKblJXQGR2ZkJjSE8hbVpSPn16bW00Yyh1P0g8dVY1Cit8WFMrQGBkUXAzNm9kZEYrIUlsJHVjPiRkcX5EU2V3fDI7Nl54LU4/VEd2OWtsUEMqMlhUTH42bGhlLWwlamp3KlBFKDxtYE1lS0RoPE8lCit7OHpEeEZzc3xyQEczMj5vVUM1PEdISXM3RWdjS1NmfU5nJms+LUFZPkJ8YEFMKCtVQFg5RWxjbHl1WHFxZVdHJCUzanxWYWUxSUVKSmR+Cis1SE5DI1deZERmZW4+JHBqMCUteU4pfFhVKGdzd2Vjb2E4eT9mKyMmKk43JXV8VCY3KnBgamdocEFDZ3FBQChpWm1ydnZZMz8+dTE0VFRQCitnLWJWPj1zQU5aN2o5bGlqZiFnNiQ7aGZWam5JTVBIMyU8S1Y2PVBmK2d0P3VkfUE3fWgqJUFWZGgkdX1mZHlqYDl7eDcrJmFLPGk8dUNvCit9Qyo4SzBoPjI5QmY2WlpuQW4qTHBXVl9VfVBJZH08YUhnbTBiMzVASjw2cWRsaiMwSnRkMFglUG9CbmRkMT49aVgjVD9abW4zSExwcmMmCitgclJOMXE8RHBwblJJR1JFR1NIYFB7JURKMXd2c3czNlV7al9nTDJwRWJZfG95cjZObHk9bz1OeTF8JSYzNzxpZFJmZTlpPloqMExKeH1oCispMjF+fD9JZ0NWJmghKE9DQmw0RWdqQXNhaTYpMVIzc0MzS2dxOFNabTRjTkg4OSE1eSUlX3lXcWdCNmopKGg8aUpJaG9oJWx7JG5TaVEyCitMRSsrWUJWek9GWFQ9PE1jZypIZyhjOGFqKiRzX0Zecz1YPGVyUj9yS2NhSncwYlBUVWc1enBlVVV2R2FIQDc+MUg1ME0lY245WDtNKDBTCis4fjQ4PFg4biphV3hNIyVMMl9mWE5UUDVZcmZlYG8tNitrRVpoeit8fXE+Si08X0prYDZPZnE0X2FwSldIPFQlaSo0KUpBdXlRNXtoKTc4Cit3alkmKSVjZUc5MTIwR35OJmBGSiVRO2dGKXYmRkAxRUMpY0ZwfCV7MEw/bUslWFNMc1lFViFaZzFDYTJ1Q3xJaG1waT4yKXMoZDlYaDYpCitTbjR4aE59JSE5O2grMnMzVE5vekp9TVVtMlNtbGtxSCQobzBUaXlOYFJjLTVtNXAjcTwqNkdWdUR2TXNPbTRCQSpsI1hYeClne2hEJnUkCis9VmRKSChycTd9MlBgTGswKWRfZytNXkl2aTkjKVBXSTRjMENSLV5QVzBBYGxOKjVLSDI+ZUVNaWtWMFQmJjYleVdNRFU2WGp0XmBQZW85CitZMWhKJVNNMG4rYCpmTiFiZyQ8QCV2STkjV3RVeSo5VyZrYmNeP2piKklWbUJLSmZLSCRCVHQ/MUpURzRxT0BwQl5oIU5JaDR2fVZQcGN0CitTRGxfJTd6QzY8Rk9VPDtzU2o8RzEoeldKKTZvYkQ2fTRMfUpjSjhoOXYtS1k1PkRMbjlzbGhscVBYYXQzRzBXTSZzOHFALW4kbk5Nd0VwCisyd3R0fWhCT2xfYFd8QEBPcHBpNlpHNkVZY3ReN09OM3A3bjVzQllFTSNtIyk2TWtGZ0xJMFh1SFlvMD5CaER2YCtIRGoxbklPZFZlWWcoCithLTFyZkw9dipCbHU8OytOfWJRcHhfekQoOE5meTR3cF5HYkE7OHlQOyVNdFBDPWVtUH1KZWd4dGxoMCRLZ2o2bTkzRXxEdXQ5ZUY7KW9TCis3Z0wxR0JtViE/TVJYUUVkezFTUWc4YzYpaUdOb35iUkRwTE9sfjR8OzUoRSVybGQ7bEtgcllRWHU8TnY5Ty1eTU1WN2YmITN7YEFiRmMkCit3eWtieS1NM2h3dTZ0U35VUmRUY1d4cFA9YWo5al5+O1FFTyRgKUhpKnFQXyMzPjFwIXl0eiZZd09mJjJhcWlfNThvakU5YEIxJDN7STxuCit9WVgwVSh5MCpCbXF2d2BNOW4xbUFDTH44fjRZRHg4eSMyTj9EbGlqQHlrJnQpSEt2IVRQQklnKFJLcS0+JldKbUhMUmNubnlHKkpfZyN9CitwTUwpb2NZPy1zZ0NCWk9APWlHMSM4T0h6MXxPTytEUCpkJEplWCN7aF5zcXRUcUUpMWBxPzRDKnpuPT9aTklVVWUyKl5AYlJCWENUKHhkCisrQipoZmZlUXxmKGQwSjlzV15FSyh1c2dGSVdjSEY1KEQxRFpvV2tXUS1obip1MUwzc0BhZk5zej1+SnBgV1UlKzErKlpkJHckQmEtLV49CismeUdxeEBBVTdKUW5yd1A3YkkrNmtmNSVPYF53TnUpdTx6Q2N8bDEyUDR9OTNSVFg3cnhATkwocTFDU1g+P25ZNm18dCQ9aEU1OVJCYFUwCis8WTBWcWhQV0plLXV8bmlsUUlKPCstMz9sOEdfeWVZNTs9PUcmPnw/RSgzIT5QVV5WQzlwSjdDRiZ9d0AmdT8kUXJBdE1gX04qRDdQV1ZzCityYjdra2F6M3twc3NKQjg0d1lzam5gdmV7YntVWGRtX19JSl9gX1ZPVWBYa2grcCE1OD9LNio/QDB3QSE0M0RqZGpDRUY4RU9TMmIkPythCis/WmpaZjdIWU5YKkdhcE5TRThEZnNHd0IkRmgtKDxTLUZnZklIUnYzbFNxWWRUKHsmXmFHV0BxNlp6aG9RQjdKeEc1SHhDMCtqQWVBS1pkCitVUy1XSSpuJCozfGwqfklmY345ZXFgPkB4a2YjbCotXjBfRUIyUndeJWJlJEFlQXIpLU5VbWBeaW58JSkkQlZpO2tnVmM8eys0ekp4d3BWCitqMWl6TTZFNCNpR3p6I1JYRkt9WWo9ekhyYVleZnJvcFh7NklJaVIjMEk0MUg0JHZNJV5DWm5gYTtpfC1ETDJYMkZhaTFlNHc+ey1qT0NTCithfEstemFRYTVSe1lVREwlSldUK2xmdiY4MSR4NGZXWmh9RjA9USZSNlYpKj58bE5aQz9jOzlqS2UlbEpJWEB1ITRrTz5UIzdfZCRTJEAtCitrUkZ3USs9KjUySntzYm4yTzxxUDRNd3Bgcms3WFM5Rz97KTItVj1DNCtGJHwxJC16Vzs8OzVqe2JlO3xiez5EXyZiJE5sb0o7WTZANm5UCitRP1YhPTZ4ODFiNUM1VngtRWhCJEgoPTlPXit9e3AwaWRvIz4jbThaMWBzRGhwcExobjhifkZEYDZGS0BeQSpiVnRkM2t4KHgtYTN0cjxxCislcnd7IVozTEApVWl+KT53VlheTGY2R0YzNEdsJlZwJW8+VGxUe3dGRkdub3FZZ09ueihBJGFsfHUqJHJlI0BuZ0cjeH0yJlk9Nnh5RD8zCitTeFE8Y3ktcHI4MHJmcERpdS1QbUhmalZpNXFHMn4jcXYwdlZpQEBrTUBMY2swJmB0X2BGIzMoS2lWUHcrIT9JdHdmcHFxP1RQQTE5S1NSCiswZG1PU0o2UntURnFyRGQxcXJESjM9eUF3OzA2WVdrSD9BVDdRcG9pQ0JGJUdrMCE+a2FJaX47dGUoWVElUiFPUmApcWRQfTYlRF9HTTxiCiswez1IN0Y0JEhJTlJuS0lnIT0+ZEtrJlcjRkZzQXxoYmJQXz9tJmh7VWpfb0g/aXB2Pj8maSVrVjRyWE58VnJEJTxWZG91WT4tO3QzI2pLCitDaTQ9QFNWMncpP2I4KlpaaXNYZ3pYb2ZEbXI+JjZUeklaOXQ0WUIqdTBLUld7fEdXa0Uld1BVMTB+KFVyei1UIVc3R087WEY4JClKQGoxCitfJUBMWGBfP2cwZkZ5R3duO1Q8V3hFTWFFYyl7IUtJM3c5I0MjTmhnc1FDTiVpPnNtUlY3MVYhelh3MmZRTH1RJGFgflY3T198LUNMUHxaCitlOEN3XnBqWSNPOGEjalU5eWBOJExfJE9zRmBoI3w9LVBhcjlUJmI0QDdeJFY9QXNkaXVZbG1NSH4/RDlELVhqZ3kpdm00ZDcmMHhoKmxSCis8T3hpTHdNUHw4OUQhUysqVXckUXZTRU1SYTJmQShmZGAtdk8oU2x4dE1mRVFeUSNlP2t3MUJ6ajcjfElpd3h1d1Q7RXw9QlheeFBtQncjCitFfXZLS3MwRTJIND1KTjU5a1UwKlFBKT0+Yllie1lHZiQyMEVDYn5TWmA3Ym1RLXV6RUUlQGNJcEMtTGg3QSt4VlNKdVYma0NjKnN1YUZnCitKcXJXQlA+PT8lUE1taVRUdE48cmBnY1djemt5XndLQDNidU1SeileUyR1bXh1Oz9ka1plZCNiNyk3YUpOVHdtUHIhPUdjcmAqY1JKSiF0CitOU1ZRemQ7MFZaJVg/QWtaczkmSSlPVT5WQmFSdiEwZWo+JlAzbjBJdi1uMkkpbCVgIVJLRnFNRyVmbFpfWDlvMjZ3KDRyQGl7ZDdnLWYwCitEMlRmclRpYnZXekhjcjZORkw2ay1kclFQXjMrPztWIXNjSFpTa31QPTN2NjZWZT99fUJgZn1AND8tYFZ2fkJKdUVXI3Y1ZzFeKkQ1OCNICis/aD5TdGh7PlRDd2pVK3wtV1hYfV5oeCM2fmZoSDRGQzNgIUshdmorX1VDWl9TRFZDOXQ2UT02JDB0SjZReUx3JnA0SUp4MThGKmIjNz52CitnQGRKbygoKUg8WWpKaWghUk5iLU08OThgPGR6RFVZe1RAdFZ1SkZDYH01JCQ9VDg9SVBnN3d0TE5RNHY7WGtwSWk/QTs+YXwqKV5KWCt1CitLbCVGdjV0RXglNCskZV81OGtOQUtNcm04eXRraUg1KWViUEhzWElVI0tLajxkQGpZRVM4OUtTVXcrUW56YjtZbERiVHFwIyhANkFORmRhCit+O1RZdmBYY0chRklRLXheNmVAPWhkP09UeF9zZXJnWUJWR2dCJj5NMnF3cT5uJjltSkRzMyFKZ0E2ZT9HRGwxWTEkP2d1RnpPY1g3ST45CisqanxwS1d6WHByTVN5YUE8U1h5YD5VUSteenlFei05eFRFQ1J0dX54IX05TXBtO345dV48JkxRbz0kOyNaanc3JEkoPHZeNUY9TVlVR2VkCis2JUxhdlA/QzxPYS1gWEJ1MF9QJHM7dCR6Nj5sIzc4QV9ncTU4eWwjJiQ5KkJxUHZHP0dBUE09VCVfanVQcllOMFk5Z0QzaWFCP29jS3Z4Cit3TTN9d2F9I1I7ZlNnP2N+O047YkVGV0Z1ZHY2dVREXmxAIV9gUHZESm1FUk0ydTkxcSthd0pqcl47fWlAcnZPNFVQTWRzY2xlKShXSGo4Cit6UV5nZ1VjSzkySDl7Pj19NG5reCtKRGllZGVaS2lhKjNIUl5QZGlJYVR4SWF2aHlLZH0zZyFWN2YhXkpkK2BsWWNfeGgxMGlXI1NKMnYpCiteODI7Pz5rLXpRNmkmQnhfZyZqNVc8eEpmbUhWKTBGWF5gVSUwZHNsMTYzYjNCVXlFYm4oLTkoJiFeN0NsNEdOPX0tNFRtT0F7Z1dOeT1HCishKl4pOT1Uc1JpMXw7eE9KRXNQamBQNj1YJEt1PlRZS1BvUmBBUTFlJDhzJD5ZfXl1T2dlTEtEXz07Y2hYXz53JnlyQUxTWiZwclgkUDskCis7Sml4ZTdTSVM3I1h6YVhEXzBiY288c2RMdlN4Z25YTldXLU54T01tOzcwWWp7JCh5OGhPJjRiRmEhU25BQkI/LUNrVSFMYmRJTTkje0Z9Cis/OXsha14wVyNhOFI5KUFLUkN5dGlWa0dwU3JWQTdYZ19hVVFocmYlSUw/Xk9wRDkyfXE+OVotbWBfNHVBd0FXdUN6dVk4MXZobzVsT3U+Cit6LUZ5Z0deVHtkaHc8VjJzMUUhfDZ2T2NoeUtOaS1nNHVAdHQmV2FIeT09UUtQQiYhbDhJKU8qe1glcm87aSNJbktKcD9MTVQkZ0dDNjYwCit6fWg2MSNfbSR4SjZNVCpxPUB7dFchcjFMZyg/bTlRJDNncGBte21NZFN1fFAoKGZicHAmfnRAO2tEekBeZnRlS3ZBbjdVVXJEUykoaihaCitrVUghe0l1OEtZaD1BWHtQaW9xNCplZi17Tld9VntgMSFXbyl0fE15JXMqaVQ7ZUxFQURiYTlEak8oPGwkPmxoMTR0QUVlT3VKeDhGVSpCCisjUWw2dldufXxEUnFWbCt8aVMjVVpCWSsmZ2J+ZzhnOHIrVXtuTmFXN1M2b0EpMCY9bisoeWZ6PmwmRy1+bW8oKTQlTm9tY2tyI0F0SmF5CitsdEZoYEM7T018Y09wezF6IXplKGBxOEVBX0tQazYzRXImLUIjVDIhajAqbnp8eFJvNHRqbiluPDslUXQhQnomJmlvMHElOWpTTFZVZ01ECitUNVAkcDU3bkQ9M3t4dEBTYz9zalFGSVduNFVgYSFDMyQ1cF57UXkofXlWaWtxOCk5PmhfU0VzNj89elZ0d3FSZT4reShXa3ZIWTJVMH5VCitGN2heT34zYUNZY0dBcjF3Un01Mit+IzJaYkcqeis1bFllV2ZYayMqMnVOKGlDVFdCSEN5TilsYnxHMmAhSnckQTledT9vaX1NK0ViRW1+CisxSWA2X3E/QClVeHxMVFMoSjlFPTVKPj0yPl8kRGhYRGAhYFZUU0ImXjd9K1QjQHlKY1E/c2NsQFdrNklfPElITlU2QyNwZHAyanxGe2I+CisqcWQ/SS1QYWBeRCs3YmJ6OW9qZCRTUTE8UmxjO1NxdEk+fWMjY15acWImWHBvSmN3bHFRTygqRkViJGd7SyZHMzg5dF9FK2Z0T2NVZCp2CismbmIjd1B7PE00OzJVYiZ+al87RnZGdD1IR2I1cGY1fHpeYFY3TUgzPEV2ZG4zRkpReyp9UGNZIVUobGwpQXktRDVJbEBOdVdTZEI8ckdRCitHQ2RSZWhoP2VFVUgxZjw1eShkJEEjYilvZzdeT2dCYV5Jei1zKHhIfUhYK3p2OXNQVjhQWSpvTipTYD9sc1V0RCsmVU1IZVpjb18lcEtmCitjQW5jOTlXWXo+WEZ5MTw8Rm9KY0pJfnojP1NnYVh4bTZ9Ymx+PmJZeUwpZ3o+a15hOS0lT15KXypkKTw+VUltb25JPFpuKFMyXilWQjk9Cis9cj01UGxWekB4YDtnNTA+dDQ1QkVkZWI8Y2RfZ216Tz1Ocj9XY1hLQjM7WDQtPVNESFZXS30/diUxdlEje3F0JVlARzwpcFRfcXFhUCV3Citme0dXWWM/PVdMVTl1IU1FWmtVJn0tSHdqJTVTcFV2T1hYZnRaN1JLSG8zYlROZjQ0WipkS18+T2I8UVBGR2MxaCtKRihnQT1vN0g8e0dBCitlQlk8M1ZiTmZMZU1NaU14UTVPSyt6ckZGWCQyO3UpK04qOTBwPyR2Q3d0STRkTWNwe25gQUBjVTxrZCFgcnQqJmE5OGV2TTFmZGtXcUJECitXTHJiX244NjBGZTkzOTdIKE95SnhaWkRZQlYhXmt8Tz9TdkhTPDQwO2A+NU4+RjQjJUE2Mz1reWJLLU54aEZsKS1sTkJgMEtPdlpVP3psCitjViMxI3BXYXlJSi00MXwwMFRRZD9kNTItWGk5YG9DYUFyT3I/NzxeeGxvTjFgbihEZmAwWlVhODJERChLMX0ra0kxT1JBRWByblF3OUVuCitqbFFNTCNaKlAwTntKRllicCQmcjFpZy1fOVpxQV9WVFpYYHFoblk1d3srVERIRXpYJCN+T2l+SjBybEl8M3Q0I0grOHI4bjBmYFNSa2BmCitYRHNKMTMoPENuZFBMaXB4R3hRVVlAPWN2X2B2IzdfSHFMSD4hQ1pXeiFmKj89M1d7ayZAVyo4YyY7SjJYTzlLUUgwMDAwODBQfmQ9TjY5CitKK2AkaU4xMFFeSiUwM2lTWDBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFEpSFpmU0lCZFMhQWhhQ3hPJWR3MUo1bWpCPE1mfT1EbURWCitDSV4pMTVpJSNLfW9oUHA0Oy1DTVJ+PW5VeCRaTF8hajN6Q3dfKSliVzF6eSRecntDNlFFaWVPZUo5ZnFRfEFgfXBBISVyWitOWiQ0aVpkCis2Q0thKyo0N1NXVnQ2Nkl0aHpoJmJkREYwPH0/RUNHcDVCViZ4fStvUUVveG5GI2dTbmR5X3N2bjVqN00mVSRARSZnQlJEJTYmeSlWQGUxCis2NXRaSSlAblA2bDhyMno2PEhYbiNYSj82bVkmZDlyfTchTXBYQUElak1YMTl2bU8zXl5ad245eT1mWnhOdnZ9Yj1PdENAYitieilqUTAkCitsPH0lTGJJbj9MYllVXkZYO0dze0hzISRISGUhcVhfd2Z9d1lZVmdRPUZMSG5GM0N9UnxrZVQ7VnEtbSZwayVLNS1KJDtHeVVVaVdneSNECit5bzlyM0hfU2Q5TzhHeWJuPDxOdWk0bzxGVHVoYk5DTC1nKjk3V1d0QWFedDZPVWp7e0d9dSgmRS1icjAkU3soRkgwcHo5QCtvbmdRekBGCitEIWE1TCo3X3lXI000PWRlOFFWWlRvK2dBKyhUXjRANCZNQUZPRzUqQXFKcDMrXyphPyNhc0c8bmsxPGVSUHJwaFRtTkhsVENBVVZaeGghCit9Wms9bGA8NHNsUUxoNlNtbWg5QDZ9ZXRnSmtpJF56LTJiUVMwQDNwNjJKSUx8KEc9eygrcyZWTzdefngmSE0+VDFkRkI7IXdyWClBPXEwCitPVW08MUV4QEdwMVpiUVFHMiMwJSZCWT49YX5hQT1xUDwqdCk0dTRCeXVNZzBHUD9SJTY3TTFeMV82anNRISRnR2VTKio9U0FIbXx3Tj9RCithaWE7ZTtTa1JBSihJcmckeUR2cU9ReG9QMkJoOGJ6Z00lO1BqaUJMeEtTNjB3NXZDIURoT2R8K3grfWhoPUNhQz9CSkNvY0w9Z3hRZCFXCit2JkdGNnNDckVAQ3Q5VTFaXjd2U3h2eGE9QnZwaFRGXjxPN3hRV2tWTXhNYnN0OVR5OWBLVzFTUzRQbUA/RzgzdGV4OVNvTGc8O1ZuVDtOCitHY31CdHwrKmE0Q0d2aHx5WSNmUztfTmNNeEJIT1U/ZEZ6dShkQ3p0aXR1PSREOG5gaVc/Y0RvJUA+MyVZfiFvIXFTP2pybmR0KGhiRmU8CityXytQel8qQXQ0TFRBalUxVkpGbF91QjlBdTItOU9JQyRna2tuKGomM1NlQ2MyZVlLeik2fUxVN0BuLVI3cS0/dmFIaUFTeV9BZWY8SUshCitCQkRrYmpNXi1aMko3Pj9SI1puS3F8dCNjdXBCQy0oNWRpdz9WIVhZIVBAVm5ESkFpJGkrRGk+c2Q9WDQ1fiMzOWYqbG96VkdlUikhLXVrCitweEN2QGgybGFlU0VtNmEkS3FKamJ6X2VAeSYxKW0qe3N2cXsoIVhVNzZAZ1FXIW4ke2dMQDc5WSU8RzxJM0g2U2E1WVZXZ25nYFg3TkN+Cit1YHNXaGlXaUlgbCV6WjtmaWwhQypQMFQ8VlJDWCVSKUNhayhrRihiSzk7aHdJdk5MPjFvQGdzODBUKjN1dHJWV3FIK0M9dFJFPmdzYzZYCitFSmBma3pLbyhxO14lZnRfcmUjTGBNI1omdD93TGFhZEUoa1pAOExZQkl6emZXMiQjNVRJZ002OWpUQGs1bjxHPmhufiUhRz9URjQ+UVFLCisqPExKQjIyWXhCODtBRnlmbmZzRTh8IzFkdnxuMzxqNXpqIWQqJmkqTE5+Jjk1Vihga15QdjdLdUxDJmMheU9seUVBRzZqdnUxfVlufDRCCitwMm1qeWFpWEFDSm1kMTNndTR9TUchYHVqPFNJZyFkRGlTRWBWPHE7KyFKOyQ4PTl1UlJ7LXtgQHZgQ08jPDtEb0QwSTI8NGtELWsxRkp2CitAMmUzc3w4WEpVVz9gUkQheWJKcERELSh1YngtdGMoUVJFM0NAbFlDN2daZVZAM3F+RFYpZSU1fF9Db2t+PShPMk1FPGA5fFIqbDhWdytnCisjaGZwYm5KQVFWWjI3ZklHP0VTNUFpdEVnMWYwTXVkYzdFRWxOXkY2PmE8VjtrVEJTemMtK0ZyS2hEdFpvRVdtOCMwRVJnWF5ubzRHYCQjCitVN3ZVYD8mS2dJUEkkRSZWJW9idFAmLUpqdy1XODFUSGkkUmBZZkBNO3RjKkhpZStoJk03YVBeSklFVFVwciY8ayE4Iyo0KiZBM2A8Oz1pCitqfnY9b05lOU1JfjFpMlNLd01pNXExUERrM2dORSRYRFZzanBKb2puT0xwdD0hMEVzKnVkNWF3YFdgb0l5cURoJWZLPUFoIURTY3EkXnpGCitZLWI/VTNoPU4mWE4xJGJXd2UlN3xKRCN1T0F+QGh6eU5DdiYqX0BVck0tZiE1V0JTclJ2a1A1TS1lRm9QWHpOSzFHYmVtKmJMbCg2Xm4hCitBbVUqZXY5WCN4aUVhKG1hJkRnKllDaFk5Kz5WdzdTd3NPaD5VXkArWCMmbyhqN3FnbT8qcVJGKG51UXRRa2Q0YjxDKjIkKCNqcGF3TSN9CisxOWdIb0pXdkIheUNpQEBCeCZ4RkM2dklBKikzYG5DUUdMYTt3RmF8fkFEYmhzWSM9KTNGbnJOZHg9QCkqUyR1SlMhYXt4YVh2QUBTU2wkCisyLX5VfF44TTtmfjg4VXM1VVp2NX1tdXNxVHFEKTZpSCRDY2hMYVY+YDx2cTROeSYqbH5lP3I/a0QyZ1h5QVBnelYoQ3BSZ1Y+LWV4OHNkCit+PyVDc3psSk4yUyE2V2N6fCNAPlJMZGozKW5xb0oxKFpGLTNFWnVRLUhkKlQrVVdxYCMxIzg1YHYrQFR+K0soUVlTYE9gem02ZG5lfE4mCisqdlNZeEkyNWNubj0ld2JzZ1BYQWxxSSVGIWgmXm9RekY/LTdLTlNVP15WRiZXMGlYd2clQFBpYiYkVWdJMHoheHNnK34lYVR4TE9ZViR5CitqY1NFNDF0RXdBaj9Ud2cmTXcmT0ZJVktPYEF1UigyNi0hTTNnJStXcVNKdGYjRko7e0JXKG1FUHc2Sm50YHQ+cVlSSVZPcGwmX1Y0N2FOCis1T0l+X1N+cVV4OWxAMDFgMUUySWJQVEBSe1RIaz52RnU8YlgtbUIxITJHc2Fza01vWmJPUHohUFAwPExjYGk8WHNJJURie3FackR3K2pkCitYMH5wO2FtfWsrVGU3ND1uKmspQjBCR1l6dGMkPD11dCM9VW1mazNAOSExeHRVZE9GYlVRVURxUFMqY1E8eG04PF4hOVNMK1RwM0o1Y0hkCitqXzUlUn51dEV1eXRKa3tfemAhKH0jJkpsc35vKkx9PWdhSCVoaVk4JS07Myt8YTxBMngxRU5CWTt1R1lQKG5APG5iMUEjU3c4cWxKdm5ZCistckwtcU5YekxvUUZSY2hPMj5CZFI0T1ZKIytrJWpaRTQxWUhtU0k2QTxUd0xLUXZISWRMWVUkeTxQaCpoP35ocCE0I1c0QVV6IT9zR2otCitHd2pOX1Z2Yz9TaShueFUtckUwNCFuSV4xQFJUdE1lajIrWFl5NllgayhpaTxEJjNqMkJTdnt2O083aFcwdyVrZ3Uld0ZgRFNhRnRQNFF7CisqKiNKTU9tJDwhWlg1cDJmV3N0UH5RcFlJcUQ4QXQjYkIzJnlBemp3YH4wYSQpU2o2KHh+JTVfQCRiRXc/XztBYW5MQEZRPjckOEVeYXd1Cit3fldeZThiUipaKkc1aTBlaWM/SWVHKno1P0FSMVo2TnM1Z1B3VjdxJHk0WFZ7PiVyRmk+fU5gVkI4ajxQSk53Mj5MZ1ZocEhId1IqYSRYCispUzdpM3IofmZLaig2bHRhdypLO25ZYUppN3B9QG5RaTE3b3IxSWRnenFaSURLb0JIez07MVYkeVk+Klp5Q1FnNSMmWmM2b3Z3JCNIJWZzCitIQD1xQz8lbHNaIXk9UkJVT1J3O2g+O3R3bks1aS0lb2JYeDI9SHJkM21ZeVo+OX5DPiV4Iz1TOyVzY2JoNnVZX0pGQncpIzk0JTkocGdkCiteY0pKZ2s1Q0NEYk96aWdWU3Nmfkc7eGhYIWFMe2V7ZCFrfmVZbFFFNUxqQFAtVzt3cU9kUyNye0l+M3dPdSpYN2g+Y1Q9YCZRNlUqPzYyCis5RT1TZWYhKylXXnMoM2Y8ekFmSDhmJUBnJiVZRmplXl5PRDtzailDalMtcEtWaE1QSmg1UHpnZzVFd0NfY1IocXI1e3I0T1RAcGJ3X2crCitAV0BwbntQPUd3clB0YEx7SWo/WTk7NTBOYDkwbHtQbXJLVEU9dnhOOzFAYUYwNWlETiYydmhQV1c2a3ZPMXohfitLMVR2JmdNPHIxUEQjCitYbkdPKFhKZyRkYEE9aUJUMXErYXF0bjRwR3stfVA/XklUJSQxJU9uSWhDPUN1bndkSHFsayhCSGgkTndQQ0pmPDEoKypteytlZExSQmBRCisrTFQrV2RvczV8K1FXUF8xclp7bElXKG5kOUhPNmJUNDYxfSRoNjVRd0x6MD14WHtjRCR3X0cramVMNz9AcWA9OyNYbyZsSWdRJTxhOVo7CispZmstJUMrc1RQQXxJdWRWOCglb0lHVG5hfShlVUQtNXxqS1hHVmFLVnFNaVFYSXtfI0FhK3RHNiZ0X0xFcnshKVpaPUNrPXFgYV43eXZrCitnJiNRc29HIVE/QVY/RmRqVktoOVc+SVl+WDwlV1kjbDZlKE04Yj9mVSRXNDc7ckZsQldQP21EcnhPZ3h7IXNPbk5LWW9Nfn4xKi0kIVZlCitfe1U8JExpazVoWWVXaUJtSVp8MCswczB3LXJ2Rkh5YjUmTmkwPFJAREdPK3xweilRJkJYJkRYVE19bVNlSEJjfG9jIUJ2PVMlNERFe31ECitwY1Z3UX50VVlxUFJRJntSdVhJRVIzciYyMyhKZTIreHBKSF97QGU9KypoNnlgbkVeYUpodjxIcWwwUyFlJGJ2N0R6d0klQjgxVW4yUzRjCis7VmxlVXM2ZCZoUDlWTnd2UHFPTDlvP2BBdmxFRWx1T1N3ViVWQH1HO0pFZH0qNSk0SGsrQUktSWwqZjJySiVnQEFfTmI+Z35TJCQ2TlVpCitoJDhTLTwzI2BxUi1nZWAwb2FCRTBUI2UlczVOWE8mO3k/ZnRJcGV4NHtJJXZoYHBVcjhSVk1rSiNHbS1Nby1yQVBNe1BLZ2YodG87Tm9kCit+a0shaSVuMj59QD5QTGIwSz9oJjImKmx8NkpTb05IPWRxYFE2UENtNXpGPWtVX0NiZSZ+KjQ4UkRQfiNNezNlOExRVHJ4KmBOODhEVGZOCittLT42RyUjXk4tREI4PXcmQXtqMj0tSTQ2JUVtZilQUCRUSCtMJit1d215MERvX3phYiF6ekdXfkxWaGNrbSY7WEM0eENuYlkjTno8MShhCithYHhzbHt8ckoxOGRBTjUpazt3a1lkU3MqO1NJN0x9ZVReeTxDUGROOUtGRXB2YCtiJjI1eFlLV0opYkZDe0M4TncqNntZTUpSPk9lJnM+Cit1NkpSNXR5Iz13cyMmaC1EJEhwS2Q/fFh3WCpmcW1Tei0kRCZlTjFiMzBIbmtyQmhwfVdtU1JjcmQ0ZWJyUGd+c2deO1JCITJRVjYjZXk8CispeiRGcXBGT1crLWVWOVgtJH5eRVBwNGtVIUplbWwxd2UtcVV4OyRvN1dFcj84UG1VYz5KVT0pVGJZNDVLUWxuTU5uO3QqaGFETD9kIX0oCitzKXdNTyMqZ0VpdV9nS20hVlpnQV9oRShhI3VYeF9ETXU2LU9jb0JGVyEpVDJwcj4/KyZDc2RUOUplNFIoKGBHfThwMTIjZGJVYiF4RGw2Cit4eGwtbkBKRjtrVDxGPTIhMm8tZTNLRWIzTVpJc2E5dHwhWVREa2lreH5zYSEjdTVRK1JXOF5YYUdXZjRSQjNvX049WXZrVm9kMlk1QDVqCisqQUR4I3VJZSM3Y2RKMUEzV3FkTForJG8pbCRLWSNtLVEkOU51MUUmcCY/cEBiVCk/JX0tYT9NOFNSWnBJODY8P1pjLVphMDxaM2h8bnxICitvNXxzNWFPXlBWYExBIUAmNDBSe3xNS1o0PklsK2BWPj8yOGlSJDRLP1hOKl94KkRGTD1MaTZYY0p0eHdoai1VNWY1WD9iX1UhUnNJbWc4CityXms0R3BrNV51aCV3cXhZYmd1SmF4Zn4zPW1ydT4zezs9JXFVQjJARUV6RG11Y0VYM1lVbjVLNTtmQyhBX3EqNSNaaEhhbCFHflNyVkVDCitmPD5NY2F8SX1hU0peWjsjby0jbVp6P0IhRmpLYTd7NnNVYkIzfDVFWCM8Tlg2SSF7dnlOYFZUTThOPy1hMmx7JCV7MVBfOUV5dmZyWkx7CitOWTIwcHtmbnF+JV9xbVA/NU5IezZ4b295Vjc0bmY5Pk95RGdpanJQflM/Mz1iO3xzJjVWXlZCVUgjRy10Uyoyfio9fmJeckZQblQxMXMrCitQbFZgYGkpcmlaYnZTcS1jPW0lLUlsO29ZYWdaZ2ooWTVrKXZ9LVZGaHx8SCNTeCZtQztNTGU7KCR7b2F8bjYkKjFUVHlKOTZlI0toaUhsCitFISlaQXNobT9PJUNJaU4lYkx1NFokVXZ8e0pxO2MjfW9wWkx0PWtHVy12dFB0Vz9ZVG0+akxGanFKaSorYTU7bTkhaXkzKVZaS1hMRWp2CitKOHlpZHF4Qj8/QEJmPXFCTU9sVTNVQ1RVV0tEWDEwaX1DWkBtZXcjTnE8Z1Q7bTI8blRGQlhtakE2N2w7OE13b1IxUXlpNklDK31uVkpyCitOQEsmMFlBOXl+PHlfSCZ8dXp2Mk5ER1UhZUpkLW0rdnYrP1pOY2g2P2V8TjdWUT57fUA0K3cmZWttczJuKHw1P2ZkOHJsP3BaLT5KUDNJCitoRHQwaExGPDk/dVNZPH5SJGdRfXU8N19VT3hgWVA4anAmU30tXjZHTUtgbn1KN08xfjh7eT97R0FuXnQyeU9PPkFMTXFqbEh+N1VrJC1SCituSTBJcnxoIVR3NDtPPSN8aHdIQVZiZlE9THc5IVAjTjFjNk9DWjFgeVh7cEJLKnYwZlBec3AqOEheKXN5ZlVpWTlAY2B4REI7dkxaX3EjCitlUm9MeDtaY2R6RnhKPE5weHlpJEdSVnpsKmx2T2o8STJ1NSp2b2A3e2JWK1BwWHVqRVV9RHFIIWB0KU12KkdEaDJLeVRDWWchKy0lS2N6Cis5STNCSHo9QUE3WnQmUGRhJnpHVmh5b1BnXkFfTFh4ZT1lc3pkR2ErPWFRPTdfRjFPbyNuMUZ4UCtTaSl5JilTP25ZZ3RQfWd4bGQjdlJFCit2UmcwMEEpLWxRKHNTYGZqXzxnfD1GdytGJDlRNG89dnM5WipmZlR8JU01MWpgUXtpTnZHOU0meFdJKWMyTVk0bHpgZVhMKmd5dktFcmF8CitBb3NQUjlkdXpkeWs9JDYoc2A5XyEyQVc4SCYtSEBHdTlCPUVqTmpAZlckUXdEb1d2cVJSc215Zmo+V25IXlIlLUBBTmAjOXdvdChOKVAqCistbG42QU18aHUtaThUJip3OHgkVkk4YEFBT2tRND80XjU4VS1iQHd0T2UwdTJiYXJVRm8oQmcxbnFUQ3ozZiY0ZUg4YEFwUTVvSG0mPFhUCit0eXZIMkQ7Ylk3e3pzKV5WQFIkZEs3WDU4YH4wfT5RKWltfERiJERYKDt0JUdNVGNvdnhWeE57Q304NnZiNjM8RGJBVUw8IWR8Y1VjYCZeCitneT9GRl5HU2xWUHcxMnZObkI5K09fWWVLKU93YUNiJi0pS09RfGRqOzJHZHpFTGh2Kmo0eGZBakJvMWZpaHtwTUpgaFl2UyVmV1B2YmZJCispSHtlMURfX1F+SntscG5xIStGZ3soK3hUV0VNKXktSzRPJGlFTCYqNlExWUNqaFFwRXY/ZWI2Jn1RSFUyYjN9UVpQVX09VTxsbiNDOVE4CispQCtraUE4UmhrP0c5ODlHN35yISl+TTkkZzxgTG9sNUYxO29hNEdhO3pIPTxqY2tFTFdYfERqKVI2e28oWjR0dmlQNHtedX59TGw/QEN1CitUSU96Pyl+LWMkPlpDQFMmKG56UjJGaWxrKDxGQ2lFMmh9d25HZ2NITjVxfTJzfj5ZQH1BQk85ISl7VCNkdnZweypiS31Vez1CVDxKWTVFCitAQzFIZShgN2Ile1Ypc3VePSRPKnxJOCtATz07anE0LSk+e0tCKUwxaVhLd2BBPFpBcz9aZX1UKFpkV3NLU3pCdjw3JHsye3cqPm8/aGMrCitGLWBlOGV8NCRFXnc2QzVte0ooNDh6OSQ0diMxVzRPRzw/UUJzUW44S3FhKXdBOH5MRiNvekUzS25hQGl7M2k2OWE8LWJkQ2BFd0VqekBXCitYJWR6cCpObzI8WnBRJGtEaDwkPXVrIy1WNlFHUVFDQWlXMyFocVZAN2AwQGgodkokbk9qKU98b35HVThjdD01TylicXg3KGdNfmEzU08hCitIfXgjKCVXcFVVRldLemEqfDBjJGdyPWV8cTZ3Pj5QU0dZbyRIPDdkUDtle3ZlUyQ/JnErQUdWKVgpTUwzeUUlR05idVBDQ1RwTlhpdmJyCitfbXBpKSk2X0M2NWBBNyV3MHdadDdjcXw/OWYzX18oVDt3bjk5KkVfe1V4TChXO2E0SW9KUmtOdSVLMzRuTG5hMHNNYWZQKWg+QDZhV0FLCisybXRleTdEck1pYkw8TnAwMDRuMzBSU05ZMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRWik7XzRYP2tVSEVedkE2VTMrdWVIbiNzCitpcDh9PDRZSDRlIVBJdEdEdmAjMDk/UCtHNEd+MmokdilBP2Ioais5WXJidnxfP1drP09gI2xGQk5SUnxZUWxlZmxJaHt0OWZDSno+ZSZeCityLTFWKHtCQ0QrJVpEMnhKbmVOQ0x7JW53M2gtWjA7ZExWN0whSnxlYnI9UDx8amohNUo9bVQlSyoqOW1FMHk2bi1URnFsN2lNQnVSfDBYCitnOVg7S0tuS3gjbGhYYFUmeTstXzF3I3krdm1zZDJMU1ZTckdWdnM0KzdjNUV4LTZFWj1waDYrIzxLX1FJeVdNPlBJPFh1JUptPjRuTCFZCistVT5ZI2wjRnUzd3B4SmljdjNnTFdoP0FaWmdZcGV4eEROSTErI1RHTW14aGl5IUBhOGtFKHRvdnstX2AzWmYwOGg8P2Q+QWI5VD0tKlFCCitWbV9sI0VIdVgjJCk5QnYweT1ZSGJXYFpPR1F6bUQ8SVNSd2cjazZFdml1Smh1WVA9cVUlJXlGJWFVUT5QKzg7eEswa1VTeHEqTHl0bmk8Citue0kzNyMoSWQrUmlFd2hmbGc9TUI9PW5GbGZuZlNWVnVvUm1pOzJVQ0M+ZXI/O2o8WX47KloyUW9qKTlKJXQ7SSVAaFgyS2pKbCh0NiRKCitxXyNwJnx6M0hpWnlaSjtyc3E5JU1ZTHhRd0xRRmwmbUM9IzBtekN7X01jOXRVV0VUa0R5Q1U5Ozxwe3w3X0lwcngwQyUlbjstMmdBVko3Cit+eHI0dXxDM3lMVU5hb082UU84e2FgYEsmMmRLaUQxVDFAPE5jWD0/SUwtQHRwQWJ4YCkoYGgjKz9hPkljPldWPm8mM2QtTW50SzRBMH00CitiNzhfQWNEVW0jI1B2K3E0KitoVXdLP3FMKDYzSiU7b3hrNzhGLWJldEgmJGYkfXxYQjtZTkEpRG5gKUZoVFVXZiVXbm9Se0UtVHYhNWo9CituZ1ZqLUwpekVAY3woSmRBQW4mKTJmQDAlSjVYVj8/KGVle2JtSWVoeTAxJHIlRihOfTxhY1VeLXFKOWRhaCpVKElpQFQxNiRZVEhRY1J5CitSJWJkfTMqQmtAa2IzblIkYHo4eXx7VXxgakZlcXwpbUZGfiZnenh6dXdpJWpsJWkyaWpFMWtXN1pwTE8xODszOWozIzFmTUo0OzQyRWcqCispMVBZWGw8WDEkQz5BTXNsS1ZXUDdBajJaKmgjQStQZGU4JXFLenh4VDhtQHFETD57dylDMCRfUzxuRCtsYWwtTkUyPTc4b3pyVkVBfm49CitsUmBvQ0pPfW9eUyUzTm5wMzBqWns1eVBsNEpVMXcjJU1vRkhoNDBmO1opQ0ZUeHdaM1E7JkMqV35GMTNeb2YrRTRfKj1KSWtMZUlNcDEhCitaLXItRkR5aEBRSEdnaUV3QStOaCg7KFM/dlEkeVNBQThoTEtEejZaRk5aZ2c5OEM/QWV1MCgzQUkmP3hPWkd2NGtvS3MyY1ZlSDluKGZFCitNTntUeyFUITZ4S05BJX1JOCg8MUklJUlfXyUybWk9cVh8PXtFa0xHcjA5WCFsTEZXWCN7T3g5O0cydm1pcmN6MC1rXlBSJnV2XkM1ZC14CitaTikoOT5YYTF+ci0yWUo0Z09zMFQmRjZ8Q0w2P3B+Ull9b2JNcE9EYW4lPmFoNEJnaX1oRnlwS0s7TEs4bVRUPU9AXzF8IUdvQklaMEFCCis8MCVWKzIzPWNtTEVJR1ppJFlzbjJAMiM1aClRWXMmdFRGdys7MTRASjZIfDN3O3RPTHJ4eyFEQ1BOTTFydjtXOGckMWhEUF55cHIqKUw3CitXa1pPUW5LKUlmQj9JbDswTnkmYUtNc1JmXis3QTJtKDd3dX53I2V9RH1GR31AQGNKWH1lQjJ1I35+NF9gayVQQXl8MypxOVlpTitGNFBHCitRVEg7ekQhJDFldTh+aXcqbnAmTVNtZUFoKll6alhDZXJ8ZldpVDNuY2tTaj5ON1FPKFduXiZzc0k4Q0UhKzFGTG8jdW83UHFeVTEodDswCitTVmdnd1VPIzZ6N0IoYkRoWCFYTUo1ZXd8RTZhbXFKV0A3UktsezdCejNqTmI0fjdFIVhvIVpjM19hRnM5PDlKdzk5M0RjKmZhSkxeeUNECis4PW8hWkZIOzdWdE51VDtoTEkmQ1BwZk1CMXIhK0ZBTnFoO1EzdVp1a0d6RiYwS1d6KyFwYkpLZWpEZGI+T0l7fCN0fT1DJlJyZHNhaW17CitVQkYjdDVfKm1NVXRYXztZSUgtTTtRLX5wUWgjflNlMWNXITluRSomandfWVMlT3o1Q05oaDZSNW1wRmV5XkhHO2FwJHpKZEh7cHJgbyRLCis8O2NneyR4ZmQ9MWRrMlFiT0MtQWp1LWc7SX0/JiNfIXolVyZoQDI9VTghWHBDaCE/KlZSajt6I0hfVykhclZoan09VW17N25UPTE9THd6CitiOEY5MW4pZmM/YFVGdlhsRiN1ek91Rikla0tGMl9fMFFJQGIlWGsqQDUpPFopZSZuazlGZFh0OSo1P3RAMkgybUdqZTZvbD4yanA2UlAoCitPZDYoI2U/WWBXIWA+ekRAQUQoOWRWWVF1fDlnKUFLSVVLNDUrRlhKMDxaYW5CPXY+LT1JPjJ1e2F4MWxob3RvbmBPUUNAKCl5PllgSzZACit3clRwZnJybko3MkhOVGQkekx3djcpMEVhWHZnUntNPnpWeEtjfmVAP1d6ODNvKShpUX5YO1dJS3ZnVm5qYnRiPCNaJVhTdChXWVpiT2QjCis0LTlANmt4OG9GeHRzMHFhSkAtNHojKHRkclkhemFuRnNTbkgkZ1pieGlSP1AjQCF7Q0xIVXRZVyZkX21zSyF3Sk4kSDw5RG8+YC1MbnorCitkPHRPdkxXfTtGZjh+Vkk8KTJjJFlrWF49N0VXNH14JExxeik/RSYkdSlIVzRlKT08NVFuSXE1e0B7RCs0QD44akljTVUhLT9Pbzw0Oyp3CitjalY3JHpOV2BVcF5JKChhIWB3cnk+QzdXQk9LJnp7eVYtQCFVSE1sTyspI1ZoOTAwY25UNWtsaSZHdDQ/QEFyJW5aWThrPj1vbyFAP3J6CitrQDU7N0MtVFYmMkstTzk7Z1lqaklZNSM2UTgtfDk+UjcoKGRxeiZQKUwxb3dOSVMlVUhrfSVYSVYjR2NGIWpuenk1aXMmTCV1bDhoM1E5CiszIThrV2pOS2cxSVNGIWQzQD1fI1ZLbWFtTDJlaSR8Z0A4QjtRNmdZdEF8Y0BVQjctfX1wblBoRUlHYXVnI2Y1PzRwQmcyemokJH18ckhVCismSnBEJk5FJkA8KzskfmYxezd3TiZnMDBpQCRhZkkjbTMhO0g0SiV1SDVIaTRZc145JUwybGFtYmpKU0opY3E/UyZ7JXd4Pz1NfWV8JlZDCisySzNwRTB8VFdKSj5XRT1ZazwlQk96ZUE7VCNpNGtNbzdXQHo5fmBGdlEwPnIlT2tvRyUxZVhAPmBvMSM2QT4ka2xnLSN5NXpERilnQm5pCitee2Zob1hFRCNNRUgwa0xjQF8wdXNGd0doellTOWUzcUUrZG9uSFZsVjcjd2loNjtIUCliMmUlezQ8bUFrUllMUVdIOWJPMm9eN2lBMGAjCisxa3RVdU4jNkRRaTRTdkhrN3F7bz96S2RucGJye1ZtSWZ4JGpHRDl5Mz99Q1YzYzxNOyFEfk1ycFhtN1pUdDZ9QmB4eW5UeEFSezdMeS1YCitzSUwwJHd7UktQJlp+I3dMb1RzWitUYiMlfDMmcUBwI35MS3wkWj5qK09yN3kwNmQ2Kl8jNipHVWBILUIrUmp3PkNPcng7UzUxP2RCWTMlCit3cHJiezNLYW0qWGc2aHA1NTcrSUhwa2ZTNk1IY0JGYT4jI3FhVkl1Oz8xKVE2Tk1LezFSJSt9emQoMWhrXyNlanxAVjZ0RH0zcW1EZm5eCitGSj0wRz98TTckd2wzVyYwXnxJSzctTENIV2hURip6ZFpybWxueUNubWVUckVfK1RGN3EwfmdwdT1KbFZRPE4hey1MbjxGKngwJF9oVkNoCitSM3wlc1dGQkxYQ15XP0lKSCRvbEIzM3BQdENkRDlBPWFSPVgxcCVrVkxWS29GdiV7Pn1IYDlsU3RGXl9JVTxjNUpRMlI1RD8rZ1V5ZEhnCit7OFFrdCE9MVJwPWhoYUBOPStObWl1VTRfb1Ehemw5K2U4X0AoSDM+KEcmJjZBRWBHNlVZITdmZGNDdn1aU2VYcEl4aCliR3JpKzBFUDI8CitVbHUlczBSc3F3WlR3aXF8cWtKfEtJP0JpM3V1P21LakVCP0hqKXd6OENLQWxWKWFzKiVRazVDXmlzfU5yRjBzTCUxQCZYRSkzaGVXUGJXCitzMSR1SHAtQFR2OTxgNUpuNm54UTM0PHVhQVIpZnpoZSotNWQjOEo8MTRzdUt4cFBNO00mdVBGOEF5KndDNSN0SmtjelBmO1dEYUx0KW1VCitJY20xYmkyYkVlSVEraU1UXz5ETks9SjM1JjcmWj9tUDE4WTBacEZSUik+JmRFbipXbDs/MGdSPHhzJDNQPFBlQ1p8WkVLV2ktPndvYnNrCithJlREI1p3PiVpX2t9ajcpWWhiYX5PUVItZE0wVW9TaDQrdnRaP09lbG07YDctZHZ8dGw8a3Fga0hsamJwUV9UYVQhdyYhJlYzbUpsbG85CisyKi1lUUxKPWNTKyspUGpieDF+KXJNaEklOVgrXlVIcTNlflRzIUNTIVhZbTJeTTdQZ1hAdjhgY3MoQVBXS2RqTE0oNkY4dClQZVRoSj4+CitIS1JvMklaTXBsJFNGJGYrellicCFSd24lRFllSGNwVCNZIXVYTGVOZTN4LWo7JWNNbEhGUyFveyhrSSEhaGhib1AlKjYldns0VE09IzVVCitXPGxhbWFwb3E2XyFJWDE0ZWt3S19KSys2JDl2cShWQm1RMU8tWX5Ya1JxVkBuN1VKP2t6eX5pSERhRENoa3VfSkBQPF80RE4ocVFEODxBCitKWG9PRyZyKkhAUStKYCtJbnkxTS19TCVKS09aPk5ITmJ7RHxjQDk1SjRhI2Y9NzB5d1ohMWtrSEN3MHNnUmZNY1d6MGd9N2hSPTh9fDczCispbmo/WSkjX0hxPWUzUW0yYGxJS0xNSy01JjFSM0phMWNCKFIkZlhEU09BZUdoTjN7R3gqdnhYdzd+bz95aE0rVmprcEloJmhoeyo5KkgxCitVfWglTmgzX2tZRndmNC1lWUttMjZxKiZHMDRCJS0yJDAtKTREeUsmayFVfm5CZj8tMzBQe1ZiQUNEMjVrMD9pcTMxPXkwdXJUY3VHdVY3CitLbTJkMGRgJXo4Jm02TXkzO3VKRldEaj1CfClENVhTQTEqRGllMU93MWxIeyFYdFlDRVA3dEJAa2FzeGMjYE5AN3h6aipTQ007cE12WGxBCis0N1dPb25aaFBvcEg7QUUpQE5LVHdqeF52YDJSPXxiTSptTGZWaUN9PGVBeG9OWHQ7MmFjdVhHYisrXi07S2RVTnZLQ3haY0lDPGxZNUZqCitueHYmPXNhQVJYel4xOyQ0cD1lQ1l4RiRRKmdCX3grWlBaVy16RW8rKG1eRXIlelEoQC1vNmhrNWtYZ25hY3Ahb28lYVloIVNxPGNXVGtkCishJTFfS1UqMUZaaUBWKF9kaH5kZWdWUGdUVzdxOzNBN0d5b253KVhnPk00VkpDQER+YldXZ2kwPTFuJElZX1NQNC19eFVAQ2ZGOE5aKkdvCit4UCUoYEUhd0lIOzJxZGpmTmgmanVDY0F7bTY8VXNhQXNqP3RrdCVqcl9GViRVY1ZvbXMrVD1ZUkRJQH1BaWBEPHleRWtYc09mcEYrXkEtCitpc0Q3Z0tSWjZGKDxXPlhNUGIkSDZZNmlFXz8zN3dBaFV1VihSbXM1NXRFWn4yJio7VkN2fD9eKXhNRWNlREM7SyV4U044Zjw3PXBsU1A2CitLLStmU0ZPRV5BZCliSyp+Z0t7bC1SJSkwZ2JkemFje1lEKkZ5RGl7ZlJmSiteVnIxNyt7TiR9bWZjalA3Q21nNUk9KyNHQWsmMmhOajFoCispeH47U2M4Nl9+c182OHNFd0BCK3NLVE42R2VhNkFQI3F6NTxGe01aUndiV3R3ZV5QMWI+LXQ5JmhaYTEoYHR1XiRjcyspcCpRMGI5TUw/CitPeylmRThqZ1cqPmJ4dVFJd1U+X1lZVjt7UVg9JmxtVEspXzNtWUN3Mkl2fnt5MVZVezMpJmk9R2s3e2pmYlpNPjtneURwX31kU3YqeFV9CitmYXVHNnJGTVd7dUVISz1RTjBFdnI/OVVAXikqMjlybk9Fa2wlbj80aHN4VGhyZCNhVmcmfFVadjxeR19kXnY3dSFBTE9CR1Z3U0ZhKCNGCitgOTQ/O3xUXkFlQ1k/cGZSR3YqbG5sWWEtUVpMQld+bmlJPWgzNyFeYSslP14jQlJgPFk3Tk1va3B8RnByP2tlLTlHe3pze19LfTdEdFdqCis4MEomOTFUU3d7SyRvJDwtOzV7ITIjZVdyTn15a3pvUFIkc0d7KD52dmREJlZmTGJvdj51UCRiKk07PXF6PSleNkA3TTViKVE1N19jLUBsCit3JnFXYnZ5O3hIc0N5Qk0jO3dTUkkrM0hMc1lfbU1rQHtIbzRVKlFBbHhkJF8oYnVxdFM+VFplKGItSGZvYWxCQmFwR1N6Rkh+dj0rWUFVCit6WDRmYWgqWTJVSk49I1RgVVA1a2doYCNXZSRFNXE5fUQoRnAkOFgxJioza1FOdjwxJVRpUGpgejNwUUchbVVLPG5PSnhOQVhmKitUQiRICitgdWNlcy1PeDVMMThDXilLUXxzNmhaPyU+cndAV2QzcW18UzdaPVhLUj50Mkp2OXd2UjFiOGJtPGhlZD43PX13MCZ2enN3NXh2e1htXypxCitEUUEtNTdBQzsqNitfJGh+SWNhbygkekN7PkUtPmk9bFR8cz8xdHl5Yk9sa3gxZzYmU2I1dUJ0UUVSUm5ySHpCTyg5elV0aEtgUHprMlFfCituKC09OD10eDU9KXEmZ15fTm1HQTFGMXluMUVyMzxVfSFYPFdMUlRveVIlQXFjLStES1RuRUY5K3xnNEZgNkxIaHlEVjlFSUEpTVMlZC1nCitGQ2BQV3R2U2FORVl3Pj9wVkdrQmlIVG9Kb19uTWBEdVFPQzxJQyhleCNmZFR3cEdTNElaPV54akNoQjdaYnkqX3F+IW5QeUVVRkpOcC1fCitQbn1NO3k8Zzd0aUUwRGlFVkRveWpJITRUciFYdnVUcXFTSmV9JDFgX1kreEUyaDh1PjI9WjE+TVZQV3tKQEdTWkhSbHkxWENQaHFiJV5MCitBS2tjZyZyfGQoWHlGelVfRCVFa1lLUWtXWk5JWHB4K01OeUJ3KUtGZXdWfndsfHgrO2Y1Uz1xV3ghYjxLJjwzUF5NYF93em0hWSZkSEBlCitjWGFSbGdnK0Zadnp3IXt8NWBWejBRN31XMyM7T341PHY2WmF3eHh1KHVeX2M+Y3Z7bl93eTRBKEw7NX41b34xSHs+eHVCSUpLTjxUPi1TCitAKzwkO2E4dHx8bmFlcm80VT8kKGoyMntQPFNyYyUkezEhTCtFOz12JDlCVVUjflNhI3NqRVBjOXcrZjh3NFBxNjdEMEc0aWpDaThUbCpNCitaKFBLeU1AS009TSNpSzYkPjxudn18Y0dxMGVsWk9eNks1dFp5e21sVWV2Y1o9enVUQTIxPWwwcj10eG9wS14/TUdZSHlCfWRHUVIqJkFsCit0Ujc0S1M2TkRSVFdSb14maHA+YFZtJDljSnhDKWgocUo+MihLcFBIIUd9dzZmNX1oQnViSnBNU3E/IXdmdW11NE5HdEwxSWRMOWt3SVg0CitPeGNCbDdxZTxvZEdfTFJxMlNzVE8kKWZpXjM5PnZyUkUpPTBwOXVmSHRxez1CcEVQKGs2YURTcDZhZUB7eiliQjxlV28jO2MwOEklPHIhCit+UDdhdE9wWiF8cWB9NiluWjdsQ0JOX2UjQmZjdWdJdTE5JEVGfHZ+JVlzWVdnTncyIShtbFJwUGNTbk96VCZRQ2IrcCtUSkMmdzNMZ1I4Cit9Mz81cWozQEhSKCYrcz1mRml8cjhyO0NIK1lHS2Y2SjgkfURzUUlkITFOam53SUBzc2pRO3lOdGJ2WkA3SF57OVJFbFNiWH57LSp7VDk5CituZDRgLXwzIW1LVG07I0hXRi08fikzUiZiPGpRSFhpYHdhQUlsaHdkdmNNWC19Tm1zNEBRYnl4Q0cqUSstOWdQI3o8bld3RFNTKiV8bzJLCispXlM9LVZPSy1xWiFqN3h4bE81Q1kta3shTXorY2g1KjElNENPcFdYKGlYWWBRIzQwNTk3eGd2azxRLSE9dm9ZNXllYUM7eWNaOV5ibkFmCis0anZLczJaMHJqdiZURS07TWFpUzEjPXZNWERDPyN5OE9DbVhHKmgmQ0tvUD0jPEE7Zmhefn4hM0YmRS1yPmYkaitvaUxMZ3R2WDhmKmxGCitBYWlBfEh7c2dFT008RUJpYTNDa1Y2K0l3cUNUTnQ4Vk1qQzl2NEEoSmpwOzYrI14obHRpQ2N9a0tYPX05Jlkzczw5VzVOfD9+R0VIU3xhCitvWHZwIyg9c1EwRzNKTmEldVpkfiFPPlJuMyliUD48bT1jbnQ2Zkw0dWV4SDBjb2hHUTJkXkZWdzYhQjNxXzYhdkslVWtZLSZqbyFaK2w/CitZe0sjdzBTenxCbjF7O2dWc0V5UVE7cWZBTXJRXlRYOFR6X2FaaEhmO0FUMEJAYn5aMk53ZDZpOWRvKldpd28rUFVaYl5lc0kyZHxXPThVCitRWTNINCgyNGVsPSVPKTxZNElVNXpOUE0mS1A7V15BNmAjVml9R1Y9N0I0N1lYPnxgblc/UGImOXUraSNZdG01QkNvYX5wcEhrIyV1XzFrCitkOTVwJDEtP1pZNlNyVyReYiVANGh+cGooSzwkUiU8YTFITlk7M01xMH1lS3V3Vk1XY3t+cWU9NWZRaD43bXNQRlZMcFdiVV5WbHA1cjNACitIZFo3S3pkUjgxLUU3cnJmVEo1fmA5SWo/TzhLPD93X24kUjFxTmstc3Z7RylXQ3ZwXj09aTg0Y0JRTCNAUGhGRSlUWVRCVShlfmlUXjkyCis7S089RDNSXmJ8Jjs/clF2MD59ciVyeUBKODBhN0YmZ1ZASVBiYHZ3eT0lZnJfJD9KMyl5WUFiKlJUX199MiVSI0R6M3lOM1VLaSlQPHVXCit7Jj1ueUtGYVU3fHAlI25NYH0mIVVkZnV5S3smKl48PVJ7N3Q3I3tMdT45JndPeFc1c1ItJGVNcmlgaiolfj9gLUt+V15HYmd9VVlXTyluCis4YyZeIzFhTUxKcUBfK1l3WC1uOylLTHhAIz8oa3g/JnF4OyFZRyY1eC1SeGU7enBqMyZ+VUIyZEtCQ3IoQytxY2E8QHxjI1NgcVFScSsyCisoNk5CQmElYnVSWj1QPndiSFpWamptQ2FFNkMxfXhAdDxLcFhEO31fcDdoS3xOcjA0PUZIeEl9U29IaHMxPWxwMj8zS30rblBIWjEjQzhKCitFOV40VyM7QDhOK2s2Yz1iNnooVUVIUV9yOzlRWkxIcmF9JStvNTl0ODR8ekR1anpOIUliITx0aUxRXnhpamJeOVJhLXJ2Ozw5bnFDYjc3Ciswe2dMTWxuVG8kYD5yUSZFKDdLMVlGVGFITnlEVHlNKiFXJHNmUjE7UnpJZitMalM7UDNDcjxZLV5sfmBRPEBIUVEqPCMhekp2cVJ0JEdhCitLVH0hXyZqdU9ibTwkT3YlPnk2fF5sMFBNayNWJl9eMFM5cmxsYW9gcylaaHxlS0B6SlNrKkw5Y2Y+JEFiU0FtMWcrKWpyZElRXlZ3bms5CitpT0Vuc0Zmbl8pUGdhe0AjeFZ4V2t6O0NvJSQ1Rihse2VvYVJudGdeKTNFd09+MEMpKjx7cWJRPVM7Sj0qRCVkbW9gKi0/UnlsQFlNUWY8CitQU2JCezYwLWFORiRaZCklRzZQMFRNVndENCk9PDdjKiMlNGRaY05PWilYYi09VE9vKG9XJilGcGcobHpnRj5DVDZzP1JrRXN2Y1ZAfChWCitLVm5qWVVESGFGZEdiMTtBRWVrRGdkdz9TN1p1cXY2WFpYTDE8a098MCp+YHxCKFpIQ3RWbFlgMDxRQGgoMFp5WUBnUV5eSGl9NzIhOUF9Ciskc0xmT0MlMkM9M2FzQG56Kz85IUM4Umo8RkxxTVB8TVJaTjtfRSszYUlfUTNeenZXNWMlTiohMyROaEpIM0VVVTxwWkU7KEw8SGF+VmheCiswe1RvJkNhNFMyfigrPnNpN3I0OEM/SXZGME1Xd1VtTGNeVkFTc19jWlVVZTxiRVQ9PEtfKj9gNz45M0BBUzBka3QyO04jbE55eyhKa2NQCit3bCNYJDRnKWgqNWdhQTgoTzY1c2BfPkF0WmpGO2tQa2JMe0N1fVBQUVo1N01BcWo1UnpINUhLPipXZztJUXZEKVElQ1lkV207Qz5yT1lPCitIOyRLXzt0aTIjUEYycFExVD4kVS1vbSVMUnlsPlJvI0ZEcUg2Q3VRYFAoa1NxY1g7QUJJSDVnP2I3V211cjRjU0YhP3AyY3cjbUNpUjQ8CitOVWNrdnVZVTFYe0o/I0tLZTF4R0dfYT9taUl+PFVLMkRXWD8+S2ZQUF91MGtFaHI5a31ZfE55M2hnQGFGQ3MhUz53Mk1zfSpSQXo0Jjc7Cis2RHRfKEBFbEJfTGgyQz52ZXBpO0cyQEIoblkmaWEmblctX0t4PFh3MUlSamJJPUZSSmN9TzdGNz03MXozditWOF5KOVctdiE/SXotPztjCitaSnJ3YURYYz5KWFdkVlVfOzI9PEsyaks1KUZSO25IakZBYTEqXzlWbkh0eGMoZFpKQn5ec3UyKFVzOVVSKEEjaktCVmBHaXBVK2QyQ2JNCitZVT8ockNReHNtK0hqNG4+TGtnJlVySihkQ1lLPz9NP29AT01EaldJPmV7QT4oX3tvKS1NS2IpSFFES15LPGRwI21fJClSbDkhaT1AfHxkCitla20kaWAxeXNRK3dGQF93ZUlWTlUyQkpMbUkzOVA3ViMtPVQjVEQ1LU1vbTtWc0hNMlpeSGMtbyF8UmA8eyUqWD09UXxvbFJMQThBc15xCitpQmpoPktgbWQwV3E+RzxKdkQ+dHNrU1B7RTZCVmNVYFBELWRAPns7SXh7OzdHMXJFcnchdXY1JCtPKj50eGNFdCsyUlRIKDlGbHUrS3htCitINnI4KVRIKzJEVHgpMG1JNz03JiZ3WXo4O3htPi1kdXpBaDV1N2teJntQYUd8ZnZLP2xiZmxjamlpU01+e1VLUlpeM3pmR35yWkB3fWI0CittfU45PiNDJjxqNWQ+JXhvfGBqdVotVl5iVF87bmVHejIlbFZuZSNQfnNXbWFqczhPISpFUHQ0YU9PJSRxKX4xWCN1VyFLZG94YH0mYmQ1Cit2ako4KXFFNGJ4ZDRvQ01oKj4xTGtzMWcjR04+QnBlaXN9RW8pYnNFeFIoMCp1UFo5SXQ1Z25WJTY1KSUweGtiVnBkamskQEBoLUgmPTgxCituOyZBYHZscTJ6NVVyczxKQVFWZWY7YUpAcXgpY0w5V1hXRileNUMqLWE1QWAwdUA8eVFSY1QySlRgTW9VXypEamtMZ1ZYT0x6OCNydyQ3CityQz5BYkspI198KVVCfHpYR1pRLX4+N2I7OGw4dGF7NE55e1Aha2YqWWchaHpzbmVJSUU/Nj5pbTUzKm1aZztgRDh0R3xjRjtrTTFiZEJ+CitkX3JxTmAmblV9XiYpOEJge3BnUXlNNCokQW88eDxuaU12KGJuN1ZKdl9kRHJsN09LPTFJPkVOYj1vOTF3e2MqJUhjdDhFMXY9dkxicnY4Cis5Vlh3ekp4e1NVfWFRWlFBLWZ5Vn59VS1SJXlmaDFUTHN5MWRYMWFIfFZjTj8mY1BMWFY5dXg3R0U+YDxOcUZ6X2lQZWNVWlZ2U2h6QDRZCitjSUR8ZGozcj13ez1qYEt9biVqMlBMfT5DNnktcFV7Ylc1M1Z1QTF7WW5jTWBRck9gb1JDaEhgUG90QT9BNlBRPCNJK0YoeChoND1uczcyCitXUiM9cU9YUEV6VVVESzFrNEd9dSM7fDFCKzVZayNuPTIhQyRiWCRtUHhGPVYkTGJmZzs9MlIxdDBETGwtP0ooKjVGZytuNFo/JkxiZi1gCit4UnV6NV4tezZaVTslMTFlc31nJlpNZEszKWMmI1VjRlJyd09ePjJnZWRuJD1iaEdMaE1RfnpVODhwaU45Mi1SfGBjfGNDNz41X1hWb0RlCitUXlR7NThvQzR0RnI9bXtzTEN0dURJd0BEPVJ1PFEjel4xXnNETGtzXiVFK29wQmFhIzUlSW5IKDtVO2xIa2lORk5BPV9Nc0t1ajtLZ3c4CitmYD5jcEl+bjU0X0dAT3RHUllrTlQ8bVp5S3hQS1Q3WkcwRSZ0ant8YGAwMHxYUVIwMDBPOF5PWTd5OXY8QndWKzg7SiF3ZGliOVJMNlRhCitBfE5hVXZfMH5XTiZnV1htbzlDSEVkfk9GTGlXalk7IUpmZDV1PEtaYChFeXtxQTNKUCpHSU02Z1NDPVZHRVc0VFV1aSsoNSptST5fWnZ8Cit2fjslRiRmUTcwaVFTX0FlZVdwUW1ZdD1tUUI7eGM/KHo4VS1qT3FCbXNBdzlIbmZoNWc3bVZuRXw4amZUZXBGVz9tZWVVLSlYT3skKkRFCitFdj10WSU0KHdGek4yOGZ3Z211R3k2YUxtI1pPdkVzKUxSP2ZqRWclcW0zM3BVUn54Xjt0NUFnSzdUbyVMTUVMY2wpdl9MUWFMbldLUm4xCitFXztSLUxMSlhKaFhaNUBoZTlyM0U8Q2VaNWBefnlReDkpYkJMJTRrIytzOyl1NjF6amg1d2pgKElFcio0elVUV1d7UCVoWlhIfF5pSVNaCis9Tll6ZiY1WTs8RWlPQGs4NXt5IyE7OCloMDtmR097eUtXdzM3REtPVGZQbEQ7byRZcTsyZ2BRISR2S0IwSEQzTiExTG97U0NESjhMczFhCitpXlUtcjYxZHVLY0FjJjwxdntgR1YlLUMpKWg/fEFmOztPaSRLI2dnJDNoTlpTUFNLQUk5fEIoNDM3XzdiZmxMejdIYTAqM3xUQzFFS1lACis9NysxdkAjIzsoc1NjamxwZ1pLVm9vIWwkZH5vPlViN1dSNztFMiNTWWNPaVliUzMhc0gpVypiYz5ATHt1NG1EcEpYZDUqT2oxMDZEPUAmCis9P0s0TWFtM1RPbzctTVA0PHc2PGwoVV9LSXRySHV1RklCXnZAYjFsemNkYntmUD0zQnNiXjB2JSpmRXpwJWVyPSZNWEkzejxBWDlLcl5QCitEWV4+MjIqRSNETFJoc2lLa0okRWBSczc7ZFg0dzMmTmd5I0pEXkp6UXg8NCt3QyozRi01P15gfVFgU0YpNikqend3RmVDWFhAN2FBTHQ2CittKmxhKnk+Q21ZNmB0a1BgbTtVKUwrd2lkQFBYWXR4fUYobl49MT1PUmd4bXc0KzRJM3dTMXNuSmw0dmtofEE/OVdIaD97N29lPSU3YEk8CitLPnB1OT9VN3NBUVpGS0sxa20lST9GbD1aQnJ1KXY2Ui1fMFlfLUk1b1phLVlNNDYmWiVMSVVgYERxPHdqdkJyRkl8TWUxP0F8anJMNUMpCitaQiFqR1dWeiM3LXtTTjE2Qy0pWW4yV3xvJiF5fjk7N3x8WUFUQztna19SayZOdDJuaUJLNF9xTnBfQ009ajNiRk1fZm5hNFA5Sk5HO35QCis2WnpmVSlQeGxLQXQoM30kP3khSFA7NEIwaVFgeHd4MEEpPXZyXmclMEoyMlFXKVA+ZmZOSlU5YHg5TipDK3cwVTFrKUFAVF9SMFdDQ09BCis1WVJWNz9pK0pTPzVFcDRYZk1xREFMaldFXkp3cWJ4Mz9zWFhfPnJCWkVjfj4pKE9PP2VROU00KSpvfUo3TVkxMjRvMWFIZHRna25PZ3NLCitSXnpobmpgUnd1cE1YUV5ZVj0lPDd4MTF3ZHJmbEpsTkcpSG0rPWRebEp8JEQpaT5KVHZpMHJSSTZwU3ZsZGJgcGdEJiREWWdmVj5oYl50CitiX3syTHl5Qk8kRXM7P0BUSUFRXn5xKH5VZjUxfXt8aHFNO1EmTkQjfEglO2hWTU1aSHJ9KykxXm9xQzN8blQtTERKbFVLdVpHPkl5SDJ3CishRUApNkA4TT9nakN5YUU3fSFETXAwTElRSGxecz5POXhkTDE5MitjdnYhcSVOVEYha1Z1RjlUZTFBckZVWTspaShadHpFKF5sNk4/aXJICitlIUtzXjhEeVRsZ0tEKUdMKHxzMCZveXAwdE4zQ15MRysmP0dXYzFxd292ZFc0I3NnJX1ebExRekZffUQkYUpvZ2ZKVlpGJUJGTVFyPlhMCit1I1FaVT5GcX5IcUY3c1d8V1I7TVRVKEdRZ0ZyRlBzV296VzVnZExiU1V4K21SQjwreDk+QDBwJmUmMDEyZj8jZjJ9YiE3V1lqbV43Kk9uCitkVnomPk1COWEoWWQtI0A9VExgJXtpd25GXyUrbyFedjJ3SDVURk9DfEZlX2JSZk8pcDJzK19FMTkzOVV1Ujc1bFV5PnYhfG5UeG0xe3xWCitDMmkhVTk7ezVyKmNpYHd2Zn0yYSZwLT9JPWExPXpYbERnWFQhNXtjVDB0S0x8OD9VY2hlekJ2SUZnbDgzYG9DUSh5RU1DaUlrYyVXZmdJCitWR21XXmdHfDIlV3Rla30hQHdEa3VAQnRXYjZ+JWduNDUzcDAkKH0wd2lJKnxhbGctfXBKY3wpekp1YUpYelc5I0x7V159MjJJR1JVX0oyCitLUFptcXorYXZvTGpyUU1ucjYydFpQKWg+QDZhV0FLMm10ZXk3RG9VODAwMDYyMDAwMDAwMDFaZTAwM31sYTQlbldXb34zfGF4WjlmWkVRCis3Y1g8eyNDWD40PzVhJnM/VlV1a1k+YllFWENhQ3JqJlApaD5ANmFXQUsybXRleTdEcG4wYF4xJDEwMDE1VjAwMVFiMDAzfWxhNCVuV1dvCit+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz9WVnF0Uy1FXnY4ZWp6SjI7RmJvOW1ldWEoK2dnJjZxWXJpMkpNLUQyRVJWPXlodVJ9flJiCitaXj8janVlWD1mRWNVUUxXc2J9VFooflNSWj15PVloR2FFND1ZUHZwa0B4VDVoZ1kmS0I7cHFCKERsalBSKkhRZU5uTGE/eDFPLSp5eDx1Cis1R1NQKzdmYDdzUHxyYERfVSZAdihQS0JaOEAwRUdSLXlLQmhCS1Q3IWFPIzJHSCtJWHI/V3JrQUpNbClOPyZ6ZlApaD5ANmFXQUsybXRlCit5N0RzOyRrV0xeMDAwM3xUMDAxQHMwMDN9bGE0JW5XV29+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz9YWTtiNXtWcjZ0YFZffEd6YmFaCitsUVZzJig3YjFyYXNiJnBNSiEhUWhuQEJTNGNydnlVU3h6Tzc+KmxDQ0VSKVNHdFd0Y2l+a2RATj5gYEpsNStPXmZtQU1ZYlE+ZSU8N2J2CitNYnhxJjMpbl5lbGkpQE5OPik+JTliSFBjflJUbHJSbXBeQGc7d0xYMGpiKXVrVFE3MWEjfVFjOEg8RDJUUUV3JSQydkJ7bTR4KyFxXlNHCitWaXQoTWR5fUFmelJiPCRMI3JyXj1yXz87NEBhSyk/bzxuVk88bzttK3txbERiX0JBeTB+Sn0pakFMNHkzNn1BITgzP0koZzFkVlRlZjtkCitxX1cpIzlXdDNtJUlYQj8qPE8oNDgtS0RBdlJ5eVFvWC1FcVI0QnAkd3pwZzQjWH5CWTRjSm8mQ3YrMn41aDNuUUNjbGd9RDQ1ayV3Q3FECisobG4pSkYqT0JJfSFAZTtIPU05Xz5afWsoKUtoczA5c0g1LVZAc1BXLWlLJklUT1U7Jj9TIyM8YVApaD5ANmFXQUsybXRleTdEcDkjY3s7CitjUDAwNm9RMDAxKXAwMDN9bGE0JW5XV29+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz9mWmZhIz9iWUU+e2JZV2ooWGtsYDVXcHBsWmQ4CitKbE9aPTVnP3o0SSQ5cyVTd1h3Q0FtSU9wZClZd2BnVEtGYSNeY0NibWhzaXRedjxGPHV0M0VGc0M5Xz9VVX5AdHl9TnRyfGpVKSE5eDFyCitHeilGKHc0QSRxZU4kY19WKmJuYDc8fE0kJjdUODdwZXAqeENQQ0dpSn1USUA8Uy1TWDlsN3VEZy1seis7SExDNjh8dm9aXztmPG9Sdl95CisjOVZTcVg8fFRCODhORVUxIU0lSSVmUkpCQEkpSH08ZztQdjtFUFo1MHx2UG87RyVJfWhaNnVzUyZVXkNUdHdXdVZiczlOY3pEJS1Xd2NWCitBRVp6SExudH5oaE42QXFJRXkkNGpaV2okdEUyVzg1azAxJGBDa0BUa2dKJDxGbWdFRVBWIVZyWTY5LS1lQTZOSFolZTF7XjVBaFZeO01RCitZRSk7TnFAczI5Z2Y+Zj9OYHIha1k2YTJaQjJhUlZ7VmY4RGZwfEFxV0ctODE9cjVEbCRoMSgyZDwrSkdmNSt9NEJAd3F4U1I/T2JUaDQ2CitVdGdETGklam5IRVl+a2R9c3QtWj01WFkjYjdtVjNucTJzN0pnXkd4RSR0MmdxSU1xaHprPVVHQXVCT3A/eDVBMzdodlAlQmJkdWIxLT9YCitqbTxtLUYkXjtlKTAlQnA1IUpCWHxvSkk+RVEwOSpQUj5CTUI8QkpsY1JCfjdmTUZFKlQ1Yj5acHRAPDxYdzk1SGlTOE4mJW1fWnAzX1VACitebjskNClvYHxNYTRLMmtiX299WVBMUykyI05rRHBvPUU2WlQpanNfdH5NNl8qYEt2LSNQN28/eHc8ZUxhYDd6fFB1JTtuelB2PHklYyRACitwLW5uemxyMipZTHhAKVRsO1B4TzBHYUlxekFXSEp1QDQpUzcqfH5BfWE8LXZ7WV5sK0hrbFgyNC0mUTNZdyVhSjctKDBIX3o3RXYmNDhgCitlb08zJk5NRHI3bT1ebkNFVHZwTVhWclBiYzJ7bU9eTVlhKUNUU0JuODdOckt3fDNOVkswZWQ9KjQoVjJTcSFhajl5cmwpPnYhN3AhQm9CCitUPj05V2xpVXkmZl5ZRCtzamppc0dmXzArd2dgc1VmVj4kP15ZNDg5Vm5rO0FSPG9NbjRSdjxzQXhRRW5YI0ZLSXVFeyYyOFBqOXElNmYyCitUKTRgMVFZLU8wMDtve2xAPj0zbmFhU1Iwe3tTVTVDOHhxMDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJV0AmNzZXcFo7YlktdyhFCitFXnY5PlNNNiVzRmNrZ29yP35TZElGUks1MCVNZGVnRiNveStLc3t9TXohVHV0ME5nbj5CcSsyZWZMVlQ2RE0rLWJRPkc8cEcxfiliazY8CitLYiowckReMU5FdWgzMHQ8ViV7aWlmbjZDQEZEJWRmY25xYnU2R2tYR2hKX1NgRHRUVEQlUWRTX2wybjgtWH05S0ElPCVBVFFZZExHbGgoCitBZU1hZTlpKXFLd0o8cnd0Wl8pZHdrOVZMU3hyZU9zP3g/ITNYJGlYQ1FWfFdjfEl7QilFJStfV2BOczwmYkdYez1AdkBALWgmU25uPFohCitBaDFPJXVTVSFSYzw8SjVsNGwleFJrVkwwREd1M2hoUVYkbih0YngoZV48UTROPGw0PkZMPW0mPE1ud09ELW4wV0RhK3RKeVZpSncxQVJjCit6JjM2WWJ2RnxzI2A4V05MVzMzR0lTdDRfT2FvSjx+RHZ3WF9Re303S3FCUExDYEVjdnJPQV9jQWJ0UG95e0JqTmRNT20+NSope2Y9WihgCispUFRJOT4lfiZvQ01yRmUzQnk8WCZgfD1aRVJwb1BUViQ5TUcqcE5eZ0BlcXA+eWImfTBLVFhBSD1SMTdLU25XWDQkY1N7TGp9KWg7VFZrCis3NXclZlhqdU0kYzc+QzdadnlkR1B5Km13Pi1TSmZDNnRMbSFHeiNmbWopdn5NMn4zdU90bjRNemo7RFVjRWY2OVhHXmNGaUJgXmI+YjZoCiswczt7amY7R1ZOayokdXprODhFajlLZTA0WCh4SUprTDw2Y3o5eXwhdU1JSmFLUFBnc00pKHVMWTREeTZwJSFhRyhrb1RtYTJzKWd4Z3tECitBIWZJY2w7KWk/TXIhbTM9VXo5cUFDJCZONzNaVTc8QWAqaWpaZnhMSj0mQipmI29vejtGcGMoRDRXYXlRWFJjTFVWIWVnYHItPFhQX3lpCismS2h+e2s1diFKfXpIY1gjR3M9azU3VkFPZ0ErezFNdnF0NVkqQWo+aUY+ZSRAJVEhSldZfWY8WWspNkdNKzJELVk1VFcoZiQrRipfKFUrCisrSDl6KDwtc1RZNjR0MERpfUdMRGdMbktzI189U3hnQThscSRjJiY9KyZnRV5ZO20pXlZzTTIhMWxNPkN4SVNwV1pwQlVFYUxGU2dZK0lZCitQQzJXdD5vWVk2K19WPV9uMHNxTWsyUDA+SXJFQWBuNEsxfkFYWjs+RyoyUGZ+UyFTS1RXX0hMclREVnUlSj9uTyVRLS1zVFdfTFV0O35xCitea0dORjBDN3hvNlklU2ZsI3J2dnJIUSlrUGtGOG5wSyN6X1JyKCQ5b2NIaytSdXYyQSRKdSZ9NSY+VUE3NjZmSmchSWFIfHlfRTh1V1lqCitqcz8wc1pPZjlTeFE/LTt4UyVScEQqKkgkTXBpaUppVShUeDZNRGBqJnM+ZFUqKks3Wisyd3poTUBRaVBnfFlZJWZYUyZES0oyJUN6QiprCit9Q3ZVM3MjRzc7WX56fnxGLVB8bm4/WkwoRUNaPU5fOEleUlkkLW5iP0Z2TXRSQ1d7O0MxUEBDTy1qQ085S1FIMDAwMDgwUH5kPU43MGpTCisyKzBOajAwYiFqMDR4OWkwQn50PUZKRT9MWmUod0FGS0JkYVkmQzNZVmxRVENZOzxMRWIxIWRqYlpLdkhWUWgzXlhMQnhhZEZAJENrSn5tCis3elZFTUtvckJoWjs5QHRBTHkjMEdnNT1tc2F0TSRIMX0pTlNBK3FSX15sdHBgSjJSOWxpbFNgRWs4S1ZXQVgkJiRhMzA/Ymh2VEpJWWNgCispUnd8MS1MZTlyUnFNcnE2ViFsK192PD1qMXxPeXJOYiR5SiVNWkpCM0UkYSNAbHNkLV47WmtFVm5SdTcjb3hSRXpFSCg5fXJWVzA4PiRaCitxTjclc291cy1ZX19YVHJ5TVMwPV5ucUVVVU04WV94cEwpejtqeF94dDtNeGNeSSlhITw1V25weVFqbU1rd0JHTUV7KSl0UE1BO0VednFaCituPEhsdmMjck1nfnUrSmc9blRybntsYXxyIX5TQ1lmbClaS3FjRGE1NndnPj8jKGx3cW1BZUQmX0prckoqYml7V3VeUlM4KFRRVFBUUDlnCistQTJ+cGU0RjZZPGE9bD9OQXNSZEszbEhzN3lkQm0rNnVeU0Q8KjxsS0thZys/aHdAbm53KF9IJjBLOVBWMkJyVWdVbzlsQzB+T2VzaXpYCiteR00jb09acF96cGk3YjVTS2JFM2JfTllYJTZybnNNI2FKT3NGU1o9QC1ubV9LcGlKT1N7KHU1PiUrYXV8KygtYFJySiRTSW8jMlVmb1M7CishME0rOFQqdmc7eWdPWmJCUVN1JVZOKCN5M2haREpTK2dhZ0B7QDdPe3p3YSVAVGc0bkdqVGp0dXBfZj1qIzFpYlJuMFE4OCs9VUUzSVhKCisqNFEkKzh2S0pPZ3kyej9AfWpqYTBLMUdjNiUwbH09cTgzLWFHaUp+K3hyM0o2NmBBOEpOc0dUbzFNU2c2em5JM3oye01PU1R4dVA/NSgjCit9bD5ZVyZKYkAyN1VlZF4ofWpuNDNlbSNzYzN2N0xeVyYzUF84JDI3WSRvNyZeflUjTExaUzc/O3xqLXRvdWM4PHRjR2c0Ul9kYzVrbXR8CisrRFg0NzdFMF9Raj08TktjNylHITgycitKbmYjZl9qZzNydFhkMEx6KUFffip5a0goPGNaSi1PViZ2bFo1KkFaZkpKKFg9K3skOHlhaTc1CitoJXU9JXQjcXVYPnEycDwjNDl0TD4hRkRUZHo7PmBnUkBSJktnWFUwRl80QHUzMFFWNGY0eSsmel89T19KNmlXU0krKGtmUjBRcmJzVkd0CitmYlM7Q1ZoVF9XczRQcWFWO0xnbn5vc2Z0MjkwZ00qQXlfO2Y3KjktaldKOEwhd3sma0tAOU9vb3UzMntsTDFKO09HSUNpMlpRXmtXOytmCis1e2I+UTklQnFMOG1jOWxXaHlxPWUqKFclVnYoPVlwPlRhdyNmYnp9RlN7d2xmI3VJWWo/PmJQcjk1cWZyVFZ2S1c2Z0l3S3RTY3xHRXdUCis5djAybWEkfTcmcWZodUVkY2l6Wk5AJUokJTR7bTc9U1RvZiEkO3tULXp6MmdJQyo9PyhIQDV6M3BhVnN9Rz9SWGFhN0JRUi0kJGtwJmtpCitXXn10JEZkYDI2USohYXF0aHEtTSQ+NyF5VWp+ITNLP1AoV3hSdyFDek1rI0cqZlFpbUlDJmNfbEIkMEFtWWB3QFZKbVVQTF8hM0FfaWgtCitQcEA8X0dOOyVhKjJ+c0wpUEIqQXsobz4tS0U+WWdjNWNgU00kKkl0OXleUGxReFdOYzJ7TDl0I3gyfntIdDRjU20zYSNuIU8yMzluSm4oCiskdDw0SFlPVSFTfHNDcCMyNVk3YlUtM3VRYFA/Yj9BQWBDdWI3cX1gMHN0QTNUOHl8SkxiVzJqezteUlR0anhKczBrQ013O2MxRj43JGNvCit7PDh0UTglc09nKjUjcmFZIW5JQXZIaHhBaTx4R2NSPT9SakRCej87bjRLeFVfPT9YNyEkSVJIMXIhTEpJZTZ2X01lfVdaSjJ0OCNJRTdSCitVdS01Qko1eUNHXkZEbDtmPHc0QXcpa21nY3ZUOEk3MXs2aC05d15gN15LKmNyZGFkXkN+aEN3bjB0LSZgfkhKREdPdSFtKkUqfmJCYWU5Cis3ZVkmOHBicGVGJms5KDVJYVpGTENsYGd2ZSpDamw3NmBEbmBKaSl3LUVVcn4ybUlDNDNXck9QTFJCZ1lWUHBwbFNlSG0zVHE/YXorM0Y2Cis/ZHBLWGhgM2xiMGFLMUB0PEJuNy1JNjwzaiRmZXtramU9PTUpQ3o/Q2hSaUg9OzROUkV7TlNBfWR+VDwmZlhPOHdjfWlFUTMoKDVgaHw8CithZmJjO1NuKGhpJXhCV2U2WWMmfEp9X3ZFODd5dWgxbzszTkd8YEJlTHE/I1lqMUlISmQ/MiltPX1KelpiWV4lWSVUKUFofDVvKD9COGo7CitARm1gfmBlYXJCalN5TWc8WHxpRnkrYlBnRWl5cVZRJjBqQT5TIXcmR3cwYTgrQHY1JChRPURRQUhFdFlYSFNFfXF2ckpNJUVOeXUmfWx7Cis7MkRzY2ZacVBUJkEkZkkyQFI5OSt6RD9EcCZZTF5WSzBoNktlYEd5QH5FcF56Zj1mcEh5fD1GcHlQbXUyPXMjTVRSZUlgbX5rcGBpaChqCit2QnVOU2t6MishTmV7Y0U5PytqKSNfb1h3UENZeH5VISp4dHw0ZE82NiNzR3R0YVVaVGhHXjdFRWxZS35OWXdIaCl8VUx1Y2pfZnQ+OF8hCispPzw0aUpOfiN7KTs5YU9zLVIrZWVZcXkybiNLP3t+WHFwfW8kRVFBRG9YZU0mcT4/fHlhZ2AycVRMLUFyelhBdW0jJW9mP09ZO3wlPm9XCisoZlNUQUlINk1aR15wbnkzcUZNc29Ucz88dlQ5IVZFUm4peDM0WFdLbkdWSSQlQ0tiWmFfRmc1NlNtY3I0eHc3clZ2Pj02bjNsLTNaQUxQCis9THdFZ0w9bDFKPDJpUTtsPHIjPlVINjA5N2x+ezBtU14wfFhRUjAwME84Xk9ZN3lJSXJaUHU+YiU3VTt6TENERjZUZmFBfE5hVXZfMH5XCitOJmdXWG1vOUNIRWR+T0ZKQF9NYlkqZ0xGTFBtVFg+QDZOV3BYWlhkMzg9cDNjQGZELVJCZ3VZQHpmM2Y/SUs2U0dwaDRXJihxMEJLZTRWCitkWWgmZDM7R3JWXkx7Ky0tM1cqfSNwRFNRYylVM3VMSDVDITZiWn1VZlp7c2BjRDh8SmQyb3UqYTNuOEg1SkttVWM4eXskMTEoJHxxfip2CitqQH5lOGhiZkAhNWNLbCF+Z2N5dHIwUztgWSMlaipEPCFPSFM+eiNsSml1QU5RWiRQWDk4TktpcytJZmlYTiozNntjVkdLMmt4PiRSJGtKCit5eCZUS1dgZFNob0A2NUVvREN6RFl7Nm1MKlYwfFhRUjAwME84Xk9ZN3lXM15mcCY7YkFkYl80KGJEZ1hjZ2FBfE5hVXZfMH5XTiZnV1htCitvOUNIRWR+T0ZKQF9NYlkqZ0xGTCE4WmJZKmpKVlBqPTNhQ3d6Zk8+NWpSNVdWWUgzPEBETz56ZWpqJFJQeGAqVS0oT3V3OGBLOXckbTwkCit3K2UyXncpUmZrN1ZVZDN6PnNwelRTSD9tZlNrcWZlYEh3MjhUamA+VSEkfSRiK3xmMnEtNE1mSlF3anVkRkZ4RnNpbDwzYXRWPHNYYiRKCitrMytgVjJ2O3NCO3ZoWkZ2OWgrdDJXZiZ8dmFXN3FrZD8qYERPIU48V3NUU08oI2V7VEp6TSMzMzduUz9SKygmLSRyOzw7VHdQYU5AdVRgCispe2lIJk5NQSE5N1c1IyNxZSF0O3h6USg2NlIlX2AhZHtkZU4qe0hVaG9jdD9lS3NOVD1JUH5iQWFGSSNgR305azY5eihYe3krZDlBNUJOCitKc2htIUFNMTZ1aXpyMzI+cTFsZUZxM3k7ZWFCSi0kUTspMj13blRaJWF6WG5fREFsT0dWcGJRKn5FZEs9KUV4aHkqV15DTj89PCQ3MHB4CitVe0hfUFFuSTthMSpwXz82VHdDUVNwYHRHR3FhanZMdCNZfTZHTWw8I2g5cjdJYjhhfHZIcWwxNj4zdDFgYH5EKUtLKXxBRzdUS0FmQFB0Cit0TFhmJjdFRn1pRDtmSmVtbE5EV2psamdeWn4zJTMrYyZOZik5NDJRemtndTNeaChTJGl3cUpJPzlnY2IzQ1ooMVVkeUllWlc2NyZlMF5OCit5NFQ+ZiltcnUqI2lUR3hAX0VZcHFFT0ZecDtyQGNASlRuX3tgcEhncTxAS2w8MG8xQTtnRFV4TUZDP1Ngd0xKQDB8WFFSMDAwTzheT1k3Cit5MHhgcW41Q0glSD5Iej0lRCp5bGhhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PRkxQeWJYPD0rPmRTIUFpVXRlaSVYPj95LUVedjhlUTkqCis4bEZjN0BeNilTcHkyPU0/VSlLakclK0ZsYTErJDt4e3UhXnpLK0hUYW96NkxqPlFHS3otSjNCTUc5QHRKRzxxJiplbG9EdX5FcWhRJFhMCitheD42RTJ+clBqWH5VM0JnY2pkejZ8eXZlSGg3VmJRM25ZcC1YLWlfJk4wdHYzMmVKN2lMdHpMQnJRPWZtc0VldFEpe15mPHNxJWdNfGtJCit4bGlmaFJjPGVGaiRfSFo/WikoTE5xWjhuTiN5LTRWRDcjJlRlPH1seT4mNnM4X31Wdn42MyVlelphTmE2I3gpSHpOM3YrflowfT43bl5NCitOXzllaWkxMV5EYEJFdVhHN1owPnBsS2xHczwkOTZpcmtOeHw0KzVERilyeFYkQkc9bnlWMyFsbUBWZy18QyRrfDs1LX09UityU3I3PU8tCit5c35BbG08eHx8V3l5Q1c/TGlfK3dPOUtRSDAwMDA4MFB+ZD1OQjhsS09MaCRhMDU+dUswNUpkbjBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDCiszWVZsUSlMYSVve35YP2tVSEZLQmRhWTskRkRYPD0rPmRTIUFoYUN5eGVZamZLK14xRlRvTj41XntrPnhhWntjeUpCbk92OylHTTYtJiRlCitCeVckKj5SIVMqWkNjMG1AUEBfdXA/OTA3Wn1sREpTakJvaWFAJWFOb1B3MmYoaDFFRm5SI0RySCUpQVJzKSt2cUJRTzZqQHdLN1U8cy02Cis3ZFplSldENX1PbkkwXkVRcTtlMSZ6Z01nKFB5R1BsRjlocXBYKzt6T0NwO3d2fmIwPCFtJlAjcU1sRztHXkpJV2c1eVhpJHcpbHUmNH4jCitoOzJpYk9ZJX1KJldqPXxHKlY4NTctPzQxWF8lISMocDJ0fEh5TXhTRi1zViVPfj99SEdNWVlAdmZ4V2wwK3ZLaEwtdH0jM21Tc2RxTCl3CisrTXBWKzg2I1VJNE0rKH57b3xfKlBjNzs/KlVZUC0pcmg7enFLZWJ3Y0ZjREhUTFE0KVpCYzM8P0hSR3dAZE5PVnMzfmU0LSoxRnthLX54Citzd1FxcU5oVGQtQlpAKSMpVDJjcC1XbF4wcDZ8NTRCPWpzVDtEKGleY0B1bWhsTG5aKExLSkh5bClEVEU0OEpxaSs8MU10ODlxYUpZKWwlCitlPTVFQzhuT2VTSDcpPjMyX21mUjhzT3ZsO25MPnpmdGlaYkNNTXJ6OGU3e21LaGQyKVJWfjxGT1ZES1N4QnxAdGg9T0Vjcj1UblEhbTZKCitzZSpWLT48bVNHKmJMR1Z7JUVwODxWV3EhJk0oWSVfTVFjS2VPNTYyWkJpUXZ9ODd+NGZ6SFBedz9gYyFVSURGYmJXVCNWWSZna3NJWnhlCis2MENlbkMze1BHYWg8JllkKiU9JjVeeCg+d1VecC12TGIyJkU0aD9qc2whS1ReZUdve2NGemliKyRETk1hdEpUNT9jLVJVbFdjP0VVUnxGCituO3xRTWNtPV5JKWBSKn1JXjc5RktkQEpFXkNjfGxtUilfbnw8YGMrI3J7Z0RMRTdGTkE2TCZyWXY/VXk8MVpoY2E7KmpDOTNHdl9TYyUzCitVQWJHPCp6K0kyeHc1cmJMUGFAJnl3IT8zPmopYmckfHoybGgqeSYzcmR2TElfYktyOFNHM0FMcm0xUU1sRzshVSZWdVBsQHxfIVdkTTxRCithYTB3RTQrbGFabkM5YlJQYHp0XzUjfTwoX09CdWBRci1AYFVXPWE1Mn1SJGk+MUFNcTNMLT1gNFpsYnp7Xys4MHReUnZybDd9UDdSWUQ0CispK2MtaX5OdlR0X3ozYT8jPEdjMnNjakhDMEB0RGw7JTA4PmhEKl45cDhzSmRjSD5LYSVJNCZ2a1J1VE8he0hvV2UoMmhrc007U2tfWGFfCisrYT93YWIzKmBxJW5KLSVEREpzamBgKT9OPEduVzVhfGhSY09FPV5fK0NDRUo5KGhGa0hRUz0lSF95JktqbU5EYDM3dHR3e0hqZ0BmJEBaCit4YUh+UFA5MVVWJFdtSmhvPWJMNlJeX30lQCh3bVhTUm5tJUVnaHIhTDcoPzRheyZEXkspcSlrQSN7NzU0dHZhNTt4KGVAeig1Zz0lem0qCit3bSo7fHQzNT9VPT95bHs7TDJvcjIqVCZmZ1JaK2lVezZAPXd1P15xWFghR2F8ZEdINShpVGYockVecD1RU0QoU1l0REAoV3heYTcwbzAyCisyMEFmXylCWXsmJTNRYD5TOXRjbW9XJSVZeVA0R3pwLUs8V2JwX1MjPiVmQVohI1RxJUVsR283eUpQJX5UTX1mTkxSfF52ekA0JH5CJXE+Cit9MnVBPl5SUWElbn5qXzdSTk1ZODM8eD9xO2JCY09EMV47YzQ/P3g2WHorcUhBdEFHJUgpRGMrYnF+dTwtej9MU3tQLTNyYiVjRDB7dmJ1CitZSWtTfVZBMXpGVmM8PU9TTmopI0lvJDN8K01DZXBgV1NIc2VDd2QkYXhxZEZec0l3VSpPNXIyO1hobnh5VWp0ViQzY2tnQFFaXiQrZFdECitoO312Z1FfYXk7ezNJK14oIVEkMH5lRWFSKUp1UG05bGBCMlpkeD5+engzfjhHYmhIUWlDKT9kYXNvNlcoMmtJMk1TYVFvQGozTyZ1MiQoCitGPW1fWSYmSVNjdVV2dUYlYTdSRmA3JlQydnF7Ym0/LXBXQ2ckenQmOHlwPTt5VjAxQWR2OXppVX5vb2RgNkdEOCk0JF9UKWJ4fHptRSZRCitgYytRSCEjJE02OX5HPnhBZ0E3e0U8b1Nvek4rSUp1QDA9JT5keD1sb1hrVnhKaTtHQzdieTw5LWpMVkllUkA2ZVNwfEVlPmlpRDxMeX1GCisxPSZWIWhiS0FGfTBTV1J1PkMrQ25yekltR0tWOzBXKnNiWXo3ZHZUKmt+JEdFUXIkclRRQG5oNmsoTDtDM2lOJmoxa151MVFGTkNATkohCiswVHgmUlNWaWJOJCFKdDcrVEJHblclSkxpQ2RlfHBNajtvLXYyRmVpVlo5TF9OOzltN1RqakA7ZnowckQkcVluOXUpelN2WDt2Z093dXFUCitINmN2RVU7UU03IWZAdnVIRHxhIWcjY1pkQ2dKRVk3Tko8bHNyYUxyaCFMZHQkIVU9TFQxN0JvaTBxSSo3ajdgWmtZP0tlTFUqVHded0B5CitAM1FGOVV3TDMkdH1rSXxGKEJoU1JTTU5vTSpySz1UZVc1OGVUZkZUNEs+XmM+QWQmcVcqSV9ReXRCYH5HfHBAZ08/R3MxazlLeXBgYzFyCitiYDRuaUJzU2N2QHRfRUNIUV96e3JiWjNsc157RG1MfHNJYiQkaDFHSCh+bWtrc2F4MVNkNHRkST0waTlzTSV4ZHFtXld5IUI0PFZNVTx0Cis9UDVxNjdGS1ExO2N9dzdkKntOTkdWKVUqbXUjKXRHOz1jNVNPNFQmfkN3OClePk1RSkdicCQ+ZzBAREpkODhKUEU/LS1Kc15hdzc4clV+CitsUyt2aXlIcUN6M3dWSSMrNmd7T2E9RWoxI3V+XmZEdUBWQzAlfFVLNnRRJFhDRyNueXNmJUBTWTYoQUJsSERHN2lfSTxTcHVOaXoqZC1pCitoR2woOGROMCRkczVWTmpVNUF6NiQpWDBuWTcqLThhVndsISk1KWhRVSgtfmVrJjF+c21ZTyZrITMpfnRpUHxILSU2fm5gZkdRQ1QpZHpgCitgYFZIUlp3KT44KipTdC1ITV9MOzxqRzRjenhfdXQyU2lFPFNDPlBFM1J7fVN3aHlXTng5aEhuNSlkLSY4aXRJOF4xejYhc1Zwe0lSdUVCCitsVD8tQHVDMiMoP35hUE91ME8xIWxEeig8dW9DKUk1VWBOOUpkenIjU1haWj9nPGBfIUt0Qlg/fEtebyE7fDFlaFFfdHhVdzxyLXA0K2dJCitqKEUpRi1vVTxyUkpFMWVibSVGdXs0Y1ptMVFLUGtXQTspQ01PWmR2fWdFclYlVnpUU30pdm9mWDNGO3NmaDFTSWp0aWZeKzJER0hYQyhwCis0RTN+Vk5GcT5yWWMrKjEyMTNLLVRXM2BvV0t5NHlUTjI+R2p9aWlEMCtlJkcpZFojJS0jekBxZVA7V0JYO345KFlxZH4xfEcoJX45WmBSCitVSS09XnRqVkBUaz9gZUY7aVYzTTAlem55Sld+dFpVVVkqKzV5KG5+RC1CSHNTTlZYQzc2eEkxRExPTDR4cmMmbkdWWn4hP3VVem9lXn1yCis3YnE9OChraWdLI3d6RHhidXN6PWFFUjg/T2k1VjZrNklLb19gVDJXSUQtazV4TE8+Ykxfa0pQU0I9JDBwQ0xmQzQ+TGs+djtEdjJ0QlBgCitfZj5lYntxMUB2MHpjdz4qUlB1ekhsUUhBNlF7dEdZQUR4ZEpOd004QDRwR2JsbUBzVmRETW0qUiojdz0wUU5ZNyo/ZEFPTjgzJUwjVmxuCitRQXdVOTJTOTRnJGopIzh5a2IycyErbG5MS1Vjdjx+X3g1UDw8UTZWKXlsaVhwfGs5LU5CclFsZldMTERHbGEwcHJoYiFKcEFQflp3ZiMrCis0S3BKaWx1aVpGSnNeJHI2VERseV9+ej0oaXxlMT8mZERRekMhfmZuangzJilOTm9CVkI4U25FaGM2QFZsbHVVKztfK2xnaj4rNWllfURECit6MUBWQiNhbX1QQTtXKmY+SWYpJCVxUkUzZWQxVWVQOyhHcXQ4eFpedUlUc31PS2FHNXQ/I0pZRU14T1FgU29iNCkkS0R9aXtPRHYqbEBFCisxJjxhLU42aXxgMCVLRC0qKyYtaEUmNzFmWjBHMmJ7S3M3S19VMUFGezVJLSV5I01nOGVOWFlZYHg0dXsqSGhMO2Aqe0coM2ZZdmY3U2JRCis2cEF4RXFaJiZDOU9qSkk+PEJzO2dDaFZiRUZ4Yjt1eihqQEpQNzYqKFQhRXQ8Rkh0figyUj4kU21nUE4+UnZaYEFHVUozNypzTExFKDM1CitwOzJTRm9jfXBeRkMkVVRvMyZocj5OYkZ0TE45eGR0I3p2R2B9SXJtKXlhME4kSGNCN1I2eWRFTzVBaWlqUThIPEIqRXE5cD1aM1Jpe1JpCit6WWE9ZEJFcX1TKFRIZnlUUU5tX2VeZ1l4eDFsX1I3aDBPNGVUPiFQPCtfRkl4akQ0cnB5eGpKZlFRMzEyTmtRTVIlbX55YzZZVnBhNjZWCitCSEwoUCFyc3swO3c0IzJHJjNBcGVoe2RUOW4md3ByeDNFWCNgcHdtd0d4OGomXlBWO2xXdjxGNClOfVdoQCpVVmAmKSo1THNVVmI4NH5zCit0ST50a340TkZfclVjWX5MaTNWIUkkM2F0Q0ZjZjxPMyl0ZUhYd341cHNpNTdzd1NtclZGJE5nRGNNZEFUY28+dm5aeE80NUBCZVFgalF1CitTMmJUU1UrdnJQPlVheSZBNz9ZZ0NgJVFxLVpQVS0kQjNuayp3cXdpQntEQlU9PjgtPVU+ODxJV1kkIUI2fCRzd1lyPEs2PU05RnQzYCtgCittS2FmeVAyQTZVQSN3IW9Ua29mQTdJKDs+SER4MVREJmU0dVVIO25Sb21fJUhafj5TQDt0NSNCMzl9K1BHV3tSOGY1NURsOzJkcUwkNlZWCit7REpzIyVIN3doKmRMWFZrPFhxZk83STdtX08pMStqeUFrUElMeE55P1BLTmJxcmQhWiRsWTRLTCVYUjw5anQtVyloKXZUQF9vNik/JmBoCis+enh9RyZwVUxwQkVnbUZ9KWgqYnNpYE01YXReP0BhcmNqc3JwfkxtQiRtSGEtJDhXPFg9JXdjKCpSPlYyPSlKOFQjYCEjcnUoJGlsKX4+CitmbkpKXloyVXYyeH12fHt9WT5nZ2tLUyt9U0lXXyp6KWlud0YhKlpNYTRIPHVtcGk1V1JnUDZrSH5ydjsxdl5ebDUwekNoRCZQRUg8KWxhCitvdjlJSEg8ODJCUWFHbmZsdTN4bm56a1FKXyVIJno8SzcyKHkyeVJvfWdTZm1PNzhGIT9HUDFxLXY9NnJNKGRWfjMqRGQ3RFZ9ZGJLZHQ4Cit7PDYoQi0teTR7dGUpfFBGKHU3ekNyZ01vMHNVRU8/bUlFNGFnbjh4ajRDdT1KR3hzdU5OJGhTbiZtQz4oKThBXlpiNVV6NGZQRjE4PDdyCitLRHsxNDs4eCZhTTkxVD88S2pSWUt4P1I4aXx7XnRfKDEwRy1vMUg4VWU2YmM9UmVOTFB4SlpKe0t7KipySClZZXZIKmA1KXZ1NntneClkCitqIX5gT1QlQjxLfl9ucjBLTEdgfCpjOX5eNT5wclRiQypee1hNTUxKJVhvUU0xN3lZQHF5NjBKSGchTWQ2Sjx5a0kxfmdLPnRuVCpJfEIzCitObVApaD5ANmFXQUsybXRleTdEb1U4MDAwNjIwMDAwMDAwMW9qMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFKjxXTU9jMFdwCitaO2JVdGVpJVg+P3ktRV52N1IwOG1RPDFRWS1PMDA7b3tsQD4/alR3ZjN4MHNzSmcxXkBzazAwMDFSWD5jIUpjNGNtNFoqbmhhYlp1LWtZCistd1VJYmFHezdWUHMpJmJZKmdMRkxQbWRFXnY5WlI4NFEmRmJ1dXhSfWViY2ZhZjFqcG9iIUJmZ0toVSRPYTUzMHo8THNSRTtiZGxIOF5rCitfVE5ZT0U0R3RoSiM7JFFtUGtINktHN18jc1VYWUIjeTF3VDN9alVzPnB8P0NRSHtyfStiMi1TU0x2a0Qye2M7ZnJvYz18azUod2hTUSMqCittbH1lcEJydTRRYjNiWF4lbyVkR20yK09URS0+Tz5teyVNKlU/WXorNWpZKjRfI2B5PGhRU1M5QUVUcF8qVnl3MVUlNDFmRXh8VnRteEE2CitOOUR+Kk5qSk9PMkxxMUt8cDFUO05lRXBofkB1ak5XI2c9KX02QGVLbzd2aDBDQ0k/JT8kK0d5LWRWYT0wMmI9eGhHNypqRkUzTXwyIWpJCitAY35nZ1QmMjs5Mk5HcTN4NCEmUjBTeSp4ZGQ0cVR+VUFnej4yVDswOFA0dW1HZE1UZmAwbngpKzdFNVdRemdkUnFWMDxWezhLUVFYPzVZCitSbns8dnJwK2R0RmlEaSg4dCNLZCo+VVM7bCpzczw7PytnITAjeFlAY2VzP3EpbHNvOyRnP1BxbWgqRT82PChGZll5Mm40SilXM2IlV3l9CitzdihHeU1TSyV6e3QkYmYwS2N6bHt+b15NSWZrSCVjRW4tWGxUbEJxNU1KPFlHSzt5b3U2QVdTaT1XQU91UHxLQWRKXyNQTStxcX1Pd1JaCis9e3QlQkAkY0d8WTUjfTdIPld8dnBvUGlDY3Ble2JZa1ZQcitnP24hND5FZksrZTxiISNRZj4zQ29gbkBUNE1aMihaeGdhampeZkt+XlUtCis3OGY3ZVExbkpTZEZzSiN9Pk8jJlApVEhaT04rND98fW5yMHlYc1NuemA+SGFUbWU+Myh1Vn1pODVHJGRsU2FHSCMjemZlbTkxUVktTzAwCis7b3tsQD4+IU9vISMtMU9OYXs0RkNXdzAwMDFSWD5jIUpjNGNtNFoqbmhhYlp1LWtZLXdVSWJhR3s3VnMmWTNXTXkpNUZKRTcyWmZTSTFVCitvTFFZb21OZTY8MkRlel5IJlZLU2t6dVAwe1U/Pjs2c2BYKzY5XnYqbWRfKDZiM0RnWjhudFhhd3QxIyhmezVWUWolcGthZjlSJStac01UCit6Vn5MUihQKHJIeHc5N1lVfGE9bTRXJW47aXYoLXVWTzFNam19JiFzUytDSiE3MnZeQzF4YTEtaF9McHFSNmo1N2V1Mld9YjskKmtEWWJCCityZCg7NnokRmN+NkswPDEhQEJyYXloYl9ueW8/T2twVmdiUTFqeHkhV3FGQDJ4OT0pfkB3b0hPJU5feyhsWXlMSUorVDNjUWhVaXs8PDckCitleWtzVCVrbiEoNDAqaT01cl5RcFJWVyV9aGRSYntaKUF8YUdEMXZ1Xj13Z3sjUT0rYDxJd3JhVzNnanclSWwtO2BtVlhTU354X1l4XkRJCisrcGV7ND5FOz8/ci02SlZqPHg9fT4hJnEjNTZNVVEkdTtic242Yl4zZjFaQEtMXkg0ZElEZTtBNXkrNU1DNXlwSGVAOHcmWS1pTjgmN2BDCitlVzRSNFNieyRiKHc7YlordlZgaVk1MlMhZnUoNDNHbno9WjlJeU4tLSswTHxKPj9OJkl5Y2omNERSayFIPDR5OTw4MikpMUZ9JVdXcTwmCitMNzlzOEgtVGJHUExHdzg+O1pAY01pZTlYcTI8OEcyKkkwRzlnd3xtMTlsXn0hJlApQU1uRjxpUXp0MmBUbk1hfXFoeTFtTDNpO35PKXhICiteIzZVT01Ba316IWFZYSlAIWN3JXBTbHJaKmBWXjlSYSV4eE1AIVRiSG97RXs7VX0pcFpWNHNuclEmOXg8Jkste3pjWDhxKXdfSlBERDdhCitHSlB2RnghY0ckdHRSJXJPVGlZd35NYTFtMFYpUFhWbWt4JCNhTn1oZ1U1NEFPYXYmbzRUUS12LSpaOFEjQmxXIyVpSXF1a1NvdjcpbVBgCispOXBmbTFHe001MyFyQl9IcGJCOU1eZVRTbnE4O1R+dTxFQ2tQYTg5PDc4M3VsKEUpSXBUd01hTl5yUT5mOHNxKlRuPmE9RVVoJjZaMXZ4CitBVDBpNio8ZDZUQmgkKVpweXRPJmd4VkVhd2Y5MENkamElMXwhU3JVQFd4JjErSH4lIXhFRk07VFlXO29pbUwme1BWOTtpcHpqcT5tXz9FCitySGp+cXI+IT0+WFYwaGI7bHNtMGB3ZE5JM2l5dT9AZXxLQ2ViUVlpTGVDRG0qdXdgQ3dzQmE4RF5gVy1vbHNVMHVpZD1+VzJNVjNHSTQyCit+IzlpPlh3RnchNnVwJCU4OXchLW1OcE0oMXl4IWtsK25QeWVrMjV1VkhZIXs+O3l0ZmZqZnhHO3A/P1d7e1BrYGkyNH1FUVNiYERVNVU+Cis1eUBMMVo2IUx5UHgjUSNBaU5pamduJmdld2pVTUJSK0JxWUdjb2c8OzZ0QyMzTkowYEBmRHtDSGxIXndWWjFvMT5eJmdWVGVGZyY7UitFCit+NF5zZysmPEZqJnZpeyMqKm48dz1SUzx8K3g7U0hwSUlRPVV5I1ZXazZLK1Q1RGJ3MkU9Q1diSFJ9PTB7dlV4TjVGb2R7Y1k1NyVrc295CitQWSl7PWNIdF9IQjY+TSUySm5COyFJd0BLcXRNdDk1OyY2cEZ8ekEmNnkrQFduP3tgSHo8cXFNaXpFR0h0Iy1XKSpaT19DK1hibFYrbVVsCitDKVokcCVzTml9O2B1eHNlcztuKmppK3VmQGYlcUc9e3ctSjFzO3BMRyE9TzZZUTk+VUQ4aEs+YWgpfGNHN0NlMi1DYSNpNVNZUWhEWlpJCit5U2syQ2FpI1NiM3d1RzktSmdYZ0cmWXZ4TzJsdXlNWiRDcEdoYnE1NmEwS1BFN3xBUk94aDkqekZJIVQqTnx2OTFxJnI2bnZVcjEqY2Q9CislQyVBaHhUYCk/djA2NTYyXnYyIWtZNWtzPCt2WGkycip9dTFfZjNPUDJITHFsbUleJXo3eXclYihuQChAT0g8fWR9VSQhZkM3I25zZ0k9CitzO2A4bDE+JCEqNSsqPCkqc3otdVc+JT9RZk9HKy0paSZiRmNwckdrUS1XeHEjdClyK0RnJmhUK2doQXYtPSt7cyZNPzB8WFFSMDAwTzheCitPWTd5eTl9d2FMazw3e2syTEBRRGdYY2dhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PRkxaS2NXbnkoe1ktRDl9YjF6P0ZWUkwwSmFDek11Cit7Y2p0JF4+X2FqdGIoOHRDU1QkZmAtbX1aWHgoSHB1bW5NRVl6MTc7cGlZIzs9NSRuIXllTXYkfDkkVTBlaklzNiQjVDtsaDYkKTYtSTRFCiskQDArajdNczMqTC1MZkBwQmt0fikrLXl+MjdAdW9ad01OfDgtJjN9YkFFY0o1cDBjKTxyQ054KU4qZEFkTn1udGQjOHomTHlBUHNYc0hWCit7SnFsYVV9TXt7VEh4OGxTdUR+ZUxwK1ZJK0Z6ZUphNkU5PSRFTl5Bcj9vLSlKZG1BSV82WHZ9THMpVi0rck0oOGFzZys0aVghbWloWF82CitvTSkleyRSKCN2OCNUP0dwPk9UWkB7KEtHNlZocnNoQTEobEZzKyFHNzVGejdAaEZXVG1Kb19gJk9pZjU1aX1JQ2pxdmMmaD1oUUVifT9WCitBWmd0WUJ0OyRLbWhRRnpmbVJsSk5Qe1VMU1B7UTBzd3ZWMWtuPnZvVitGbSpvP2hWSEF0JEcrSVgmQ15EUjk4PCVHY3AtPTRFRUFvXkpWCituYFliLS1ESnZNIUdWYSRsJE1YP3R1ZCt8OW9vWUYhfD5fTnhSZFM4WGwqdnQ9eW48YU9sfktBJmA5RUUwOU10PUt8MjFFaHR5VSVAPHtGCit9ZVMwWE9GTmJLIVo/Z3loYX1Ua0dCUURLUm5BTyYtOHI1ek9PSmVVe1glQSt+dUE1ZCZQQ2xLU29SayZVOG5rMn4jI1o0Yj1MQzVubVNFCit6dG1nZXFtMz19U3tEWT5ecV9oXkxNU1IrOFNISmwmWDQ2aGxPX3kjblk4TCYwZTJ2TExgMiFOZkU1Z05YLUtMTldjQmA1MlhXPSo/bDAyCis/LUshSEI/WT5eQXA5RW9vaVpIdU13TXYkMU1PKzBucjA/THc5OSM9bzhmY3ByR3hkTWZQcUVIdTh8UiNJclJUPVlsdVJIRiQ3SyY5R3spCitga2FRKXJ8IThoanBpbmdaQmdMVThgej1helMzRjQmUm5iYTZDdzZ3OElnUnV3SmZad1JsNV81Z14oUnVBfDN9cGJZSD11cUhMendBdXRuCit2TSNGQCp5Mj9jOTB+KSh1bVMhUHBlVUwqdmJ0dnFwZnkkbT16JS10P3ZAb19Bc3ljWUl5Tz9IfEtxaCNFJH5DeyY2Km88ZjtGMjl2fUxDCisxQXpQcTA7WDcocEw1ZVVWOEtwMVdhWFRORXl0MU9xeUBgWWhQVmlJdUc3eztHLVExPXg5Z3AtUEc2SFFIWDlKUDtjVVowcmRmXmNwNitiCitDaWs4ZWcjXzNUSVpeVyRqNW8/MlVVQ3FGc0RkIWJzeSR8Q0N7SHVkLX0mOzwxdUVXSn5KV2xIZ1IwPHtxayQhaitIXkhhXjk+YzBAKDtiCitmLWkmSkx5a0FHUX14NTZDMUlEMCs7Y00zMzRHVyhvUGkxKWllIU5AKDRRU0YmazxSYm1iez5rS0FpRHB7M214WVBwbCUzTi0/KT5PcGVXCit6KHBwcXJ4VCgqV2VjJTVlc2hrKUlJKUl6IXsxZURyU34wVCNJeShUWEI5ZUNUaHlJTj14K0I7MWxOcjRBKnEzWUlzQlRNLTBYfDhHMWZOCiswNnxFeE9abjJHRD9YMjVpelNsIzZiXjBxPH0oZ3A+S1N4IW9JQz1zakxSJDdfZWlnMXwzdiNCSSNJZz0wOEt1diF4Pj1wYVgoVDdqbzdGCitVOztgbUBQaXJqV2wtZHphK3lZcENPOWNjQUJHLTd+VjAoKGg/a3pufSQkRWBNcTNlSCQ5TXFsd3FmLWAmQ24jN1U3TkM8X1N2UVp0LUZmCitfbHM9dEorKz5veEtVVVRnTjZiVTNnKG5SZVE7RCN1PDxNJnhmSlloZmxAQl9wZ3k7ZHo4cmxHaGQldnp5Z0tyUmR2WnhIMjUpTDImaEhFCitjdkxZODMhNV4mRWZkdk8wRVMqRnZqMVBuUWlIO1Z7WXlPcURYSW88fTIlQWc5S0cxdm1oOzFEM2I8UzwlWV5BfigwK0xuZnIta1pBS0lFCitHeFBRaGNUUjEqRDU0T08+OGN8Uj5SZ0BVbnFFOW9CZHB3MV9NOypXcEdvWlVrI28wbHIxc1l3VkF+WkBJSUN6bSFmYEM4dT54STNlfVNACis4cGh9JnFOTFJ4VzhPcj9gPDdRMXMtPkxiY15uKnh7NFp3QVIjbUJycGZiNm4kKmFATmBUNlBEWk13YHNAKylVflZFIXwycHk8byh3XjB2Cit8P2o9JD9jSkt6ZyNHaTwtLV82KXJtYUteTjhUJmQ5aGozZCo9a2V4cW1Ydnh0Zm5xNTRQTUlRaHk3eT1IcFJYZEc9cGR7O29LZlZ6WmIyCitLNlV8UUtkJUJDR3VSR3M5MyNZdiV1KTsmODBvT19DdVFfI3Q0QFBPYThwem9xZHQweiRIWkBJU2gmKWhEKylgYi0qJEpsT1Y8NFRrWmZfCis3QDEwKH1RWi0wSDVEbkpYeCZIeWZwJHZqN0xlISlebFFqX1YrI3poQSVwMmxJQUF5SWMpKGE5MnwyMDhYcTY0c0xMM3czbWRIO1M9X3FGCitVVip8TWdZRS1WVjdUTGkyPXA0Zz1RQiY2VkBMQ0JqR0YmI2JjbCg+P1pPX3B9Y0ROcz5sQSlKc0t8R1ErYHVYa0g7OT1IPnZVRG1aWnV9CitDSnhZZlRiVmIwSW8yPDBXNDduZHA2enpLVil1MlNuJEAkajdjWDhzYCQrd1IxM0NYYmZXeUtKeTk4IURpTCk0TDA7Uz1GbU1aV2lwKGB7CitqKWNCclEwODk2VmlBaVY1S0NPVCNnJmBHYFNYMWg9N0pUdjJ5SWJ0anhnUk5WVD1mPHpKPTFtSGxKfmY9X2RaPTxsaiZFR0E2YD8+YU1wCitKPFI7MW9xWDZiTHpsfnteU3tWKGUpWS1+RFpmZmB7WTM+Sn0lPGhBa0RORjsqR0NFSDt5TFRqSU9LeTJHI1IlT2FIV3B4RnJSSlI3b1V+CitGMTs1YlIxYC16UH42V1A/Y3xGRndMKVFFRVFKYH5hUXEqaSR6TzR0KjNJUHUkQUhxVXIrezZFb0s5YU5hbzlabzc/Q0ozQ0lXK3VDU2gxCis1JTwteSUtOFNqO1U+OHlBVSVjSSFkJUtlc3VJaEdRdSgrIWtGJDBkb3VBbGp3QTdOUTZWTGMra1p6aSolJH5jI1I4YkBodWwqcEk2UTwlCitQd358TEM0NCR2cWxqUF5yfUt1P2RXJXtjbjx3PyVvMz1FMnQqVTNkMDNOaH12VWBCWHRDZWN0eDI9T3pnSGFHN21ve1JuMGZSMGZ7RTlgCit0PTZrflFSK01ybk9BM159cUk9JjtCU0tQNDFAc1c7MDh+ajB1fWtCNSk8IX1kdmBgJSZzM3pMZ3hgPDhWM1NoQ2JiRjYyIXc2SjRAWlVgCitgdyNnWkR4VDRNd04qUmZEVjspc0ZaZ1B0bXZhU1RaS2lqKWFDZ008dyYoVSQoOUlzaWApP2d0OFhySTx1dm90e09jcHh3Q2dhNCMocmFECitgcFkydjNATz97eE5VeHNrVXF5S2F4cWNybz8yazlfcU4rdXU+Rnt+PGlzS3xMV0h4UjlWKkUyQyM5Plc5JClrckR9Zkp+VyNydyFZbj1WCiskNmpOTl9lRXQ7VEtlRiEoPHdTYjJga2loWTd1OHJ+UEV5YXJnVWtJMkdkPDBHIXlpN1FDcT5yaXIjUnJrcHg7NVhULSZQanUqTSZUfn0hCit1fTNZSDQhTVBZYGdMQH5vMlcqSE98LWVfRCZgM3lkQ2deQS1Ke0lPZm5yVWIpWDgwPG8rYS1eJnlSe1lZfSNQISRRdTdMIXQ4OHgmUEc+CitnTzRvY2ZkZCFzKSNWZ29OXnhOaj5WfFA8fWx6Xlpva0FqMDghfm1pYiZaa0xNSlpJMDdydzwoKTkrRkZZdmUzQEBiYD0lOGhoYitjV0B8CitRNEY5cSEyKmwyVDxDS2crQDlaen5UYVg1P1lvWGVoJHorKF4oXlIkRVA8KndOLSl9bmt6RSZNdTJUWUxsdXB9fjJXb3Y8TSg/KWg0cDs+Cis1X3w+VFpBTiZle2hOZG1DUDBRWWYqVGh4Z0Flb3Nme0hWYjxSLWdzSDAmc3lsfXpUPmMlX2dpUUQzM0EwPXg1YTs4VXZIe1pPcVUyYX1wCiskOWkjVmp9OFpKM19KWHhhUWQ0PzdfM2BHSClHNFV1fXVmMTVLS3RLY0BeMHd9biZAfEp8RjE7bVc/eXFUSC0mdEFEU1F6ZWgwWW92MzNDCitQbntYbm9QTX1yWSF+a0BvUDB9Vyg4KT5haUtPb3RtaTk+ZSZYJT0lc0M0JnReIVVkNSRqPHczK2olOSslU0VAcUtaekZVZCZxSiZAZ28wCitaNnZaPUZUdF5qQXNJfWNTbitINyY1UmMqNzBVQl85Vk9zKCoqSGhQSj9PKlNKWDFNbU4pT098flFIeVlxSVhFUXJpWU11XnFKUE8lI0ohCisySjZBJVN+K2V0KXBzdlleR0xUXklMVnFienlXWlN7RmU0fVlXUyt+UDlIKlY0JUptKSY5e2JAeDMhRihMV3lsSzh3RnhqVzxhYStlN1pACitxVUBkaDQ1cnNCZVF3YmZaMkM1UEYlYDxhX1FXP0phU3lldmJnQEpScERsbjtnUnhyMTdRQTxDa3ErUW1OeC1oMUBZak45MXBsSSZxXnt0Cit0Zk1KU0FIOSpZb1QkRiFqMjswRHxHVTY0c01tTkFqY1k5eSFUbEYoR2pKd1RHTjl9JU9ePiF2ZX1sRVBJcGsqJmU2a1EtVm1vJiUwcWckCis0T21sUz8jRyFeb2FSbnNWQzR5I1UqcTlpZylPekREWWE1S1o0R201bFBNY3s0eGlkOykoeW5ySiRLU0FgUU52cXRPdl5uay1ifj9NeTdvCit4SUBHSmpfJjJuSSZhPkdlSjIjdlpvNVcqK3QtcSlsMiFiQGwpdWVsZDYwXjRyYH1EcSNjeFhtKE9LMHdIKEFpfmVFbzJpLTFQTllpWSROCitQPVpFVndgMlokT2s7OGl3IUNDZVpXa1ZEaChkS0d2N0BNRUpASWAtZyYyVTwoYFV3Znk3KSF0aC0qRHl7bW0xSF8ha2RMNHAhbyN8am1yCis9QWs4RCQ4VVl3Xj5gJmBiUlckfiV9QSR0TSFzX3lrPik8SSpCbCgkN21ZVmxkOy1yMFJRQk5Xc1YxN3hEUHBnUDtCT2FYZ0h9aFNZQ0BDCitNUWh0TSlDYiQrZkpWNHpDSCg0SlBka3goZj5EV2c8KiFHRyt0Km8/RnY+eT9NVnFLd3szenRBOFNXPzB2SkQtSWtDLUN5VTFTUV47NEdxCitTZFA3ViVPWGVocnZALSZJWilGPkNJdnx7NG4lfjNEVGRkajV2V0YjdW4lVihLXz4lQlo+YC1yZHBCZzwlbktZflJiZTkmN09yQC01Ykl7CisyZ2R+P2htZld9NShaJHx6X3g5bkshNndfeCV2SD9QZGcqRldLZmdSTXU5IzVSQElhdnBQe1c0NHR5c3pJZzJnITVsdktGZWtzIUs4Mj55Cit3ZXJsbG89K01LM0VMP2lrZjE+QTEtYkk0OWx5IXtRc2M1TiMxdT5PZE0oTCombm04PkhoMWBKcyojSyY+S08jU3hUMTc3SnR5dzMra099CityKHd7QEQwJk8zRFp2djV7aSZ2UisqQ21HMyU8azJFM040QFdOWEo7SWs7XilPSStvMyg4JkhUM15LJkBgVWMxM04qTU1qXnhpSV5XSHtrCis0SzlJPGhpNFQhTX5McGI7SWxOMnQwaEpLYUtyc013OCpKM1NIdE1mLWgjQyElM3pITmxxKjY3an4/TERMNiUpZClXd0pYbEohdl56TilRCit6dD0/PFRZQXYmbDIwNEMhWlp+VVFXe3xeRCtRJDc3ZW5JcTlHaG4rYXFmUF5WJkthQyMxXl8hU3dvbmo8VHFSMmhPdj91dXBlR3s3X2dzCitkaGBxUzBrWCVqeT9CSU10PWxKfCFnd3dOUkRxPyh+aX51XyoyOXVDfV9hSEN4RkZMLVUlclJHQGZ2N0VpN1J9ek4mYWxLRGJVUjFjTUZZCis0bExTbU5fYUpfRnFHYSNGfCN+Uk5OaiYyQiNjQVJ6dGI1eiNiQENFVkhVaGlwIzQqIXAhcWJCNzMzczZlfjFRWS1PMDA7b3tsQD49fkRsCityX0YyTEojU0FwaWc8MDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFHezdWcyZZM1dNeSk1Rkp5MFJFXnY5Qjhma0NhSHVTckgxCisqOzs2eWVkTjFrSEp6UFAxM0V7a2AlMndZKUF1dnZGTWJvNG97P1c0RXluV3EpM1hTTlpFO2lDSzM1QXpKdT5qUzZ5NDlxRjhQQ3JYeGp4CitYdVdQYmpfP2dAc3xfYmJ8REtfZS1jZCV8Q1BTTnNGNThrNjczSE1FNmBSZHdEPyNMO3VKUklvRCspRGpENzxGcTApU15+QHQpdXg5YSQtCitpVCpEU09tPVUjUjdNRT9xSUJxITg4KWlYNkdgSj5namhEb0xZJmZtVmNITmVuaW9DfjUtZ2J9YjdZSkxENn1sei13NXtLNVhqUElmZytECisqaz54JEgqO2g0aUE9WjctezUzSGpqR31AaVgmMUhvZEwmdXpWZV5BRUxfVTFjVGEpbEAhIUtOcmMzQWB2JE15Z2VZTktlRTk1fDd4KylmCitUVypmNmFWQ3BsbjZSIXx3PX51MGZUTSFsc3BEa2Q1QWU1bV5xe0hCMEM3K3peYGszPmVgOCRfT2l6bzFyXmdaT0RZY0lpTVlES0I8bDQpCisyflB+RWs5fH1vekNEPD93OHxxdVRsWVZfNCshS3BqU1UlJihXJnc8T2B5V2dRQjBFPGhYWF9fKDJ9MCNGISowYXM3aTgjY2pZT1ZkQFV5CitUaSt4aiFWcE91KH1xbl5ybDQ5eld5Q0dEVyUmbDt6PU0tZ1Y5RSN0SXlacXIlQ29MKEl8cV9majBBODRDLXtiMEBDMUYjaTM+JUN1RG0mCitOdkdTYkk4P2ZeKmVCUXZgZyVyVFgrWk05c1Z1SDxlKlJEeSZBSllvZ0h6aygxaFhfdDY/QypGKWg3eURMPDxvfmA5YHNHfjtIR3I3VytOCitsO0BRYiRiT14/QFcodiZDUEt6WjhvdUlpLXBMTFkwfl5Aa0grQCRrMF5OPDZKLUZHdzIoSSNgZWd1R3A1Qzw0aTVUQk1eX3xOUSYhOSFUCit+e3ZVXnVxLTRlM3RYPHdtfE9KQXllOGdvUERUTDNUY0pWfmZrIXt+WTJyWGV6azdHN2hKK0RUTXR4c3dQMTtzMjtfM3V1QkhQdkFQJT1DCitAISpYMClyaXZJJCZpLXJqRkZAOW9nYjRwazE0I3E5PlQ1QmlDK1E2bDhPMmM5ZEItajR5TSlEZTFyO1Q1eGp6UUxjTl4tdmJ5Sy04PlJtCis5MDlLNnZEOGJrPi0qJTJjQzJUKmB6YS0lYWZsbVBnVDUwJGtfP3RjVylTVmwlUz83WW1gWUttbWElMl9KZTdAVFdvU3JiV0E3T0QjO08hCitxKnMyJkgzaT5QPSRoQmkrTVN0Zk1XI0lAd3MwUlFTOUV3WGZpbz1XTnBBRHwpaWpxPWYwI0k8T0RaRTAtVkZFd3BJfXtkQ0QmWj8paWlhCitXQCNmY1ZTN29VNmEtYXhfUTVZNDkzTiNzJCorfHYmZ3VNI0thYTdzd01JQ3pBZVAjd1J7VC1XczZjM0ZYdVdybTJtemc8PjEhVmsjcnExCitfPlZvaEdnZnNIWHNPZzgwLVdHbTJKV3QlZE84NUo5QD9pNDhSZFdmMzEleW9XYUZEKjQ5aUQhSS1FNT5LcXEzQHd8NFF9OzswSnV7Z0RJCitkJEJrQlZIWTZ0JDV7SnNTXkgpenpuSEhOPmwyRlAxTH1ybSo7TlptZDtoVnBzUjtlczRZWG8mdzBwbnMlT3BOS281XlM+cm5PdnFXcDJLCisoPkhIX2tqQWc4YHBBfUJTRitTZy0xdUheWllzTGBQITIkUCNSRnVJM0AlMCtQX0hEYC03bj45WXZfaW5OdihKWUApJkBpUCg3VjMjMk5iCitfKXh1PilvPExeT2hJNylHOWNxZjxke25sez8peW0zNXlveio1WiFgTVhKKWB+amloMzRARV9nYjhqbFZZcGVrRTlhVylqKktvQFQrPkReCitsKnY1XiYjNWwhanp0ZH5pM0k1dkRaNUdTZHFkdFV7bypZPTRnYUx2aHomYnVrdytTaWpUcyZ+NkcyZFBlYUkoPGQlQG1Pe0VifjJjXmxoCiteaXN1U2t1JD1iYnRvTHYrVkIxYC1TWk9nYWkjXjxPMVp0aEgxfUBHIXo7PHVwb05ObjI5TCRnY3N7PXBjP2V4P2J9VVVPd3QjQ21PZkQlCitubjcyKmNYPXZ7UEg3Nzc0OSMzNDw1VnNTamI4NHlGfD1PXnhOXnQ/fXJGaVJlUnNKbFp+dkJHM3pVTkFjUl5sPl5FWGtqRCMzYnFBUnkmCittIXItN0xKfXppTWo8WEV3alZFNVdoPUhnYClnNUxUJU1sRSh2dUVXJX0xb1Jsdlk2OyhFS29IM1BRd2QpSHNkYGtKTFRFbXtLc0R5dWZ1CiteYnRAMzRsYSsjVlJ9SEVYPkNwY0xWc2pqbyEkX3lBQzZKWip5MVBLJSM1NlUxUG4qVj9IbD1YPypXK3dxJnk1eGBqfj99Z0tmT0hwYSg7CitIUEM+RFF6SmRecXgrdDxkMkJTdDtSYmxiWEtmSlZ3eCtBMDt0eX5uQ0RMV0doZT9qYnxqO2pgTzwrMStVJE58Tk5pSkAoNUIoMSp8aitHCis4bCRWflBDbjdCPG58NHNBLWhrTV98fCRfJHlLdnx3NUNvY19mVSolU0NKMnN0R31mTCl3Ymo3QDthK2BzWDVeMCU8N1MhYGVHaSFYVD17CityOGBhZXw7ak8xNj0/LWlRfiFUYEVHb3E5dUUkTFlhSlgrOFZrdCZETGMpbCRZQ3pQWjk7cmEjSl58cDR8eG03bDxFYHxuOzQ3UWJZY2gqCittPWp3PWtWeHVNdz1FbjdpOW0oWm09QUgjNk9rMnRmV3xVSmArQz1qIX1QRXt0YFNRKnBUc3UqMnVFPXdkTSQ2VHpmMShAZ1dfPzw2PDZVCitJantGMkEzVjtxYnc8SHhgenM0VmlWdUxUdSM1JVkpRylya2IoSlBlK2pKVXFeKH5zczl3MHchdldybktkMShURHdpNlkwNmJsVVlBY0hQCitlKV5RdjlxRChwYnwqKj1KU2w2RVl1RUFNaT9mcUVVN2VnY0N9KV4/bmZYPl5vb0taN2dwZ0RkWmBCYXU3ejJYOVYkY1NmKCFvNE5aUCpYCit5d3IqYiNjO3RQQW5fRipnV2loRzFyMzZgSklHZ15+bztXenhWalVRb1RaR15KWFc8WkZ9VS0mQCtHLUpST2lwSGhYSDw9a3hjNS1wJXwkCis0a0QhNnstbWE3diF6emk0YXp3fDZrMWRafmY9OzRHYklsVWplRH17e2lOK3t7Y2AtMHxYUVIwMDBPOF5PWTd5VjkkRmUxUFRCRU8pJnJmCitEZ1hjZ2FBfE5hVXZfMH5XTiZnV1htbzlDSEVkfk9GTFpLY1dueSh7WS1EOX1iMSE5ZGElRSpNYUN6KzsraXUmKV48N152JWZKWWdyUCp2CitBZ08hMWVGTkp9d1ZgTHA1aDJqIXBYKFkzeU5QISRWY0RNUVdwMUZ+OElpeDZXKHc4b2cqYjtmfXc+ZmkkVWUob3hXWjchUmNRd20wbDVlCisoRSU/WjcwcyQkMWtyb0phK25McCVCVVg9O2ltSEREdHZhSEJDdDcqfHBSKVdNZi09XjZFRTA8TkJIdTxCVyFgVU94X3x1azZDaStlZEEwCis8WD1WNnI+ZkZuekRSbmNxe3UtNHk9KU1POE1PbWJAXyErOFlMPHEjTT8zPjRMUSZKRHdOcTw0dntQNzNfajhjdlV+P1V5fSlePiNTeUxfCitQOFo4NUR9PHV3dDJ6Zz09WFUza0ZVM3tyZUVYcSlpano7Q1gqI3drdX5HekgjS0FMYzZxVTZiJG5qMTRKKjAwYi1DSDlGTypBanQjKEJyCis/JDBqM1ImNHJxTGcyRkNmblA3UzR8YGZ8PFZVY2xpPGFzcWFZVVBDRykrT0JpOX11JHZ9cGB2RUc/YTBmJW1pPTt1ODh+U3poS20laUBMCis9dDM7WUc9P3BvJHMhQUl9VG1tcjcxUERrWGUpVCsrMVQ9e0pqS0REXm9+TSEjVEVRNUwtX1VnfCNkR0w5P2BtYjVQOTE5YnMoVkU4aDZ3CitmRjJLPU80MGA2dTlLQ0BNOT1GdlVoNnd6JkI4TiRKNTVERnRHZFM+aDtDdlJfUXQmQXdkTVhiRUloZ2NROVp2Ylh+aSRKVWp5NERaZj0mCisrNUNNdS08Mjt8JDAra2p4LWR1P1dIfldUUW1DQTJuWihudXJ7YypmTnAkPShAOUpQfXxCNSpIZi14ezBlWF4jaHd4QkkpcWF0U3tTayZqCitsfW9yRyZGV0FrMCopTiNFT0ZVdUAtTXpTNmYhfHJgVjg1U19PU1Jgbkh0OFFYY2M/dihvdCsrTTwoanBGeHlOaiNaNHZmb1hLV0lFRnczCitfPVdSMnpre2B+KigtdDNvSnkzPy1YNXVoKERzSCRfNjBjdVZ3QDU3bV5WQngqQV4mUTwjb2U3QEsydlVrej5OfFM8VDNYSzlNXntERSMyCitDTXcyaF9vbVhVOCFTbFJIKTZ+SVRSVzxuK2RtPyNCM2c4dUVzLXl0VyNNNWIqa3hOI2YlRmhBZzdVUHFVMlVfZnlWQXJYWExOQm9hMXxmCitZWUNEMz1zQl8yWFI7JlZ8UTVtNGlCdVFtWUF7MCk/MUAleUxTWDtAUnhOQEVjTk03JmhERHVaailxTkhAUWcyP2lrN2xCPFlCd2xQRkY/CitpYjY/ITdWQ21IOUNLSlRnWEhtcztTX2BDRHdVNytPdyp0SWVWZ2V3SkslbU9GNFFtXyFOfFlaT2E9aGx5anBQTDskeyVgQExVWkJEQ19uCitAKy0wSGoxSlQlNmh5T0xBZXFzTGB0OXw1RVh3fFJ0WUYxVDNHPGNFUHEjM2dfayExVDN7OGRiZX5LO2BSSH5GVTkmUVB1RUs3QWhNN0U3CitTZ2B+aEQ4VXczQ3g4UGxBR05LNno7P3dgeyZ+bTFyT2M4cTBvN01tcGBkeFdXUkV+N3RSJk1eSzhyUDhrMnRSUWlnXyMlNzJqdVNRTHwwCis7eih5SV9AS3p8fU8oKGw5I0I/X2gyJTZgVGErKXw2I1g0KXpKWEpoSzB0YzsqMFBDOzJ6ITVLS05RZ3FNalBfSkYzSFJlbml0cUpreGY+Cit3O3oxfENRRGRBKiNOckk0RkAteGl+UW1NM3F5JFYrO1hSNjAyaDNDZ1YtS0spaDImRyV0NXNHKVB4Ym9QdDUkYnVURUYtPSpUZWlxb0lhCit8dW0zMkB0RGdRaWJ0M1l9Xk9QM00+R2swST1wQ1U4UHQ8OTAoJHQjRlJYcHY2Tj1kVDYtdV9vSEVjPT1WalI1KDVibWgla15PSitNWWJyCit4WXYtJE89KlJ1cjtYTHspJDB+Zns1Rl9WQTU/MWIlJCE+aWp+JnRKajd9JSFOO14jWm8/KkU9WXJITjJxS0IwbjwkLV5VVWdNZkBLaV5sCitEWTVMIXdZLWxNSVApbSYqMGZNUzNgIT1Zd1olfFQ1JkJfN3VJa3c2eFFxeXA5JC04fGZCX085UCRMQ2Z5aU59QipzdGY5KEN1Ykc+MFpDCit0R2JBJSUocW96NzBnfWpvVWBPK0AoUGVONFpKWikxaGo7Wig0Ql5CTTFeUEhiaV42bnpJa2JJTURSNFlXVXV4MFYpYVdXUEcqVTc7TmImCit5SDZPPVB4SShpMndUXnNjOEVlWDdITjhQVmR4ZyFONns5Z0pAXzljZGE8TXAjQHVgP3NiYWpzWEBYdUc+Ql4yT3k2c0BHRWsxP1kwPSQqCitPNms5KE1IZTRgPVVCWn5sSUxlaTk5SmhGWkN2TnRrOVhed2J8aUFTMExQN3hsLWBYVik1aXdCRzxIanR0V1heb2Z3TWkkZks2QzZvP2IoCisxKXI7eENeeTtgK0hIX0VWbGN2VFZMNzJBLW1BdXc0RHlLaE91cytINXt0bipjdWpaLXhgK3g5Y3ZoSTU9U15SRGFJdGskZ3FjP3xNPV9xCispbEsle3tyajU7PCN0aWlfNG5kPkAhXi1oaVZ1ZGZBUEReY3xCY2wtRSVKWX15NHs/Mmw8Tm5pKGxyTGRqUEVzR0JIUFc5JnRCdSg5b1RKCispS0JOUFdJOSo1Qm9+SkFBUishWmwmPExqWiZMbmM/NmNAQXx6X1dOdHheYWRWKG1oaXNFN0p4QF9WdHVxVkQ+Tl9LJn5JbW88RThAYjsoCitnZkF+Nm1WS1RoQllJcUdlSClmTC0/N0FAejg0QUx5QVk/KTV2ZTlxeklrKEUxNC0tflhwZ2Q4bnlGUDF1YUI2SjZJU1lLdyp7bSlWSklUCitIVisxfjE3PUBgfVZOenshdX4lYHxhSEJlcnRYZip5ODFiREJmQEIkbmF4eH59UnRHRyMjeHN9ezVyYDFrWmRaSy1qNiF6NUZeS1pGITVtCit2VUMrWlZHemhgdjc2TyV8KjF8d2ZJcnpwb2hUfEttVHhpRUYlMilfezRJRF4yVlNlQFBMSnlEPm1AZilZKzBVPX14cjQkKThje01DWHNOCisoZFYkdSpHSl9FUyVXIV9udU8/KXdBfC1lUlBBX3lae2JGJCotKlo/N2R5b0VvSH5gYTk0WnNjPUxXWlRHJFI/UE53LURwZmIxQHQjMVBRCitUKHNmPCF3b00jckJDYylDUj1KIzluNHxrdC00WXduPTV8T3gkVD8jfWdAVD47aU9ZKStRKX1HTmtmXnhUYFpFUSRmaXZmeTwyb1JGYj89CittPWNkT28reDtHR1RKNkl9TmZpUFRaSSViRlkpbStjPHVlcFJGR1QwSnw2UiFpQFpMYTx4I1RmK3EyT21fPVA7QE5DN1BqZHFrQHlpOEhrCitoZXVDPDx9IW5WKUBpQCVzfHVfbyRoUG1IVERpVnE+MkA/T29gO0A4VnxRWDU+dlVzOFhaZEY2Xi11LXM+SkVpcz5CKGBhNWhDSVp+eCNTCisweH4yc25wLWp6UDIyJUgkVHptR0Rgbmg8ei13eSpvfTBoQV9pJXBwJXJVZVkqPlFaLWQzIX1Jb0liO2EjM3g+ZTFzQjMkdiVjTVUzaEVnCit5YnghO3YtUzxEXnMtITR1JDgleDU4fjsjZW0oNWMhdiEoSC1xI1ZJNUE1M2lZfUA8V19VbilEeyZzbyNmN0hHSWZ3dFQhT01rWjl2Z0huCitsalZyfEIhaSV2LUAqQjFCcUs3fGZPYjAoNFJRUzJ1JXtAMzJ7ejNaPWMzRnlZY18oWFhSV0l8Qik9JkcrNmtSdiRQWCZfIXNeRiZMVURICitwU0xjWTQ/d0R0JChucVYjKEFFRm5NSXBxQXpURHAxQEFDVz9+TzZ9bVE3amJNP2lvN30jbmsxfFhWJFVROXtxZUBjUDREaj0qdUhMbSE4CitHJWB6WE4mX3J7Uz4xbDZ+dU8qbHFafGg4aD56dU8rTHE5X3gtaEd0fjl0UkFTQkFGezJHMl9ObzRKazsqTk03UzZ6JmRsfE0rKj40YH1WCiskaWlKZFpPdkdGcTYmfUZuOFhIOSgtZmtYPlBtYHJrWi08NFVSVHkmKFBCKUR+P1JlMnBFflJMSipqanpMNWExPUgkaSY/YStFZXApK1RTCitBUDN6US1IVkdPbWFgJHc9P2MyeHtefXklcjwzbkFMazZKeTR7OWooT1FLJCY0KDs5ISFUWE9PZn1sP1d5dzJiZzMkZHNjdj1FIXkkOzc7CitfYG02azcwU0d3a3VMZmY4dUs9YyN7e20xOzB8WFFSMDAwTzheT1k3eWxiPEV+QkBGLW8mbyUlNkY4fX1sYUF8TmFVdl8wfldOJmdXWG1vCis5Q0hFZH5PRkxaS2NXbnkoe1ktRDl9YjEhOWRhJUUqLVk8TypLRV52OWg4KjZYZE0pSkZVI2c+NX5Ed1NDJFVrPk8rMFRTRH03KWE2fWFqCisjZG5LNEx8I0VYRVk2PEMxb0N6NU1yXiokMjcxVHZEPTtJfDZOSmFeNT5MSjJQQWJMR1pwem8xQnFWU3JPaUJ3YEVtbCNTTip+ak8xVDhkCitCcDA5IUVMc3pYdGomVEJ8T2hrTSMtOTBhS31rcWw3PSV2SW9VTUhkUXo/Z1lDLUdsdTBfTVErbWlFYW5YQF4kJisydkEpUFJQSlJ1I1I7CitmZDg1JXc7VHt8OEElI21tbTkpendxWnAqRGQ+ZylwRWEkP3ZTUmQ+RUxuWmVTVjFhKXBxejBqUmEpS2A5N0gyUjFkdUZLTmNUWEk3RFpWCitEIW5SQEBZMF5BekJfZ09IfDEwNUptU24zZWZwPEhoI0ghNW1AKmFoeHB6Q2JgM3tjJktxUWN2JTFsJGUoY2B+X1ZVdXkjOU9VZXhqJXUhCit2VzQ0OWxLZ0gkRSgqQllJYiQhLWZlcChSTEI2NFk9cWBFM240KFBGMWlmQ3Mxe05GKyY5JX4yMXckIWJFJDhMakMla3A0R1g2I3l7X2Y/Cit6VVBSYmFDP1VOdj03dXtiOCMyR14zJUJgQD0pWDBpTnhQU1dmeTw1XmtFTm1GRD1uWCkqfllGNSNsUGJMY0lVZWV8ST9+M1U9elQ9OGhxCisjNDlaU09mSmVPM0glUTZtNmoxeH1xdkx7a255QmgpUzttSkJwaWwqPF5YakQoPDNadSlZa3V3M1hhJlMmY2phZnR4KFAjQWdkflN2NzFACispMD88ckh8Kjtjbz5VQl4tZlkxSyF7RT5HPll2fVBwVSVGOChiSEtsbkByU18jeDwtTHp6VHhWc2VCailsJjhUZzAmMmhgJHRtWHFSPF4tCisrbWpFQUAlUCVhY1hGcEV9VHEjP0A+U1JTJCQ4cEc2ek02fD1wT2I5Xm98MFVvYjJNKHZIVyNWRnp6WUUqZ2FoV25PUk5fZjY8K0ZGOCRlCitTODBEYXBOYiZyXj9GdEt1Q1d6UD5+O1JxRWNZZ251Zzs4K35xVXRMZEh4XiVsYE1TNjtfbD80PjdGJkB6azcjKUhxb0pCTkUza2JEUHk9Cit9b305ZzcmQ1BoMC0zMHVfVlVEMCpUX2JXM2NBP2slaDhVMSQ+b1A3YEVQR2hUbVlSWXZwZC0+ZUY0SEw1JFFIe1AkWmc2MU1XN15jZEtSCittb1pYQ2QobzI7RHo/JD0pIXl2OGZ0T1A+cylmdTlPcG5RZz98PyhoTCtpaVY2dDBOUFYyaHJLbSV+cHo8XlYqZUs9KXQ3WiRINDxQRjQ8CiskZTU0XklxTHliY2FkRD9GbkUkRzR9KEIqIUdOemBNU3d6c0x8RmshZ1NFfnMmLSMxfnkrUmpKeF8rRmNrYn1MNWBmP0Z2TldASypkbzxOCitvVEJrOXVhaFpZX0tiLXc/ZGluZHViOF5JQTJJUXptNVVtemxWUVJEST4+eGdZI2ZieipKUGBrVDMyJVVGXyNoPSluZFQyZFltTkZhR3tkCitBYEppfFR5YkhxX0cmfVR9ZjxTN1pJRTBaNnxeVndYUlc3YTJ3RExfWClyZXF+U248amIpX2lMOyNPZiY/Qk81aVJsOHk/UUVQKGE3UmAxCitHJWohKlpDXjBsZkVmPmprQHN0fE1OVT1gcTVKM35GUHQ5Nn0zZjA8amUqdGpoJHIwOWVAZy1Zc3tLMWljd1RxYE00QzhCeURiZzJ4NGR7CitmRlc5SjtEPF9EWX1DI0ExYWt0eFltWSNmeWF2bGN8TWtPel5uY1VASVMrfHF7WGAzIz97XnptWFBSX0BRM0hRVzM4X3o7YkQxZ3lGc0RsCitgRUZoeSk9QDd0QnpyV0xTLXt3Z1lAQHlTO3JKTW4mR0dUZVZhcjlaT31YYXQ/alNZSUA/WndWWS0tNHA8JFg7YndzTH5WJXY5SzJ4KUh+Citjd09mM3lZWCVkbzsyVDtlWWhCXkJePTh5bmlqalpfNGZGUXdwczk+VGMhQX1HZnticGV2ZXx+dWB0QmxEJmpJdHFKN2tfIV9MVkhVSXkjCitiJTd7NG1gXiZXRy1mYn57OG5QWUVCV0lYbFRtc1FoNVNmPkFEbFlmQTFDcXpwZjZtbVZgSmR6ek0oWGNxPzA/dCY0KW5mVTQ4VU1fZHpHCis2dGVmIT5PRDEpcTZ8bT1gdHY5bkJrTmduVDRYQldTIWZ1eCQrTkk7flVveWIhN1N2O1UhUCpmRWlQaTBmXj4mOCk/ZEBXVkQ5Nzd3cTdJCis8M0NZVz5eem9MJXpVKmheWUVPY2BGJWFKNj9MKGdkZHw7PUx5PHtMeFpTVmY3amRhXjApfHhLOTszbk17PllEeF5TNl9RZmglRTsmaUI8CitHTUlTMC1wdWIwUFNRNGB2OF9WRXhtITNJTDNDZkVuX19RNjZleE5wezZCNj1USGorXi0pP0lmPyQlQ309fFI0KEd4V3lrOXZQbWBJfDZ6Cis9UmQqWndRM1RQS0dBcUxCdUkqUCM+NHtGSzNqSVhlI2UhWTVGMlkxdiZERWs1cTk/OVBEQ2lePTk1K2NCTTtoSXx6M2J5VSkoM1R0OShlCitlLVVrPlQzPiUjYG5kUlc4QjxAQHhHb2gjXzMkTzBMJVpgVG5TQCY0ISU1JG5TdnVCJF5jJG1jZUYqQX56WnM5YE1CVz42LWw9dCljQVplCiteOCUqSHBXOUY2eWpYKFR6O2loQitGbVpOKl5kSCRTTklLO3BQYUw8UDxqZ3hrVzFJV3V8Z3VSc3BvX09KV0lZO31sRkJPel9TMnRQRTFUCitsc25OLVNWKFElR0JlaGZwc3klfEI+MCtxWlgjJiQhSHBXT2ImaVBgbjhnOzlKUyZjXlI7WCNMTlA5bmozO3tWcyshMUNmdzVARXYtJX1RCityfkI/d3J6NTRBZSYwP1NSY1FCfj5xZ2JmRVpifSlJYSkqV3QkUU00I0BlNF5eRFJ4LStzcFV3bCZQVnApSEM8Ujh3eFJKQnlyVlNeP05QCitJU0xjVyFLUytoKnR3QmZNYmVgfGRRTj4qTTtOZmNMJnVZWnBRJG8kJGQoUykxbUNPNjhFIUR5X09LTkFzQHxkamthKi1ld2V9NDBuYy1BCisxaStsX2l+JFQ0IzA0YGVFZz9fMEpyWWZXTFh1X25aeDM8PlBJMHNrMThuNXk8NWAxNlE9UXghVmtUfEt7XkpHRklFdk1PUCVeI3Moall0CitQNkp1a2pNeittZCtiYClPT1k/cnZuWnpDem05S3dNYUQ7I3BoWmgmRjdeLWBVdD5DQUQ1N0lLQzMqQSMzcGM/TFRiJCRKX2w7SGthfEheCitTUjAja3NqJm5qWFN3M3c9d09wLS10ZiM5TTBQWEk8bU1DPjJPfGpHN0syVG5rXlUhTXRzcm9JM1krWWRlbn5IVWB+MG9qYG90dDV0ViRWCitRfS1wa0BxZUFASU0wb0hXcjRtbkgtPEpJSj05aF4rXktnZzlPX0RVPit7fFJBKGdoXmZIPnxGMzx+OGdwTVJ8IWEmdDE7PyhjVUFpLTY3CisyTGJEWF9YdmBnPEpWdD4wMUJoN2dEMjZHbT4wQ1gyJjB1ZH4zIz4xRURHd2tBOVBWXllFMUpPSHV5cTJ8ezx1MG80M0ZeckZWQ2BRP2FTCispJjheVXlSbDBGbGxAenZrXmJDT1d8VkshNSYjdG8qUisoYWFpeWdyRlhIVTM5SkloakxfMkB1cERZXkB+dyFweC1Ua2RtVFd7KGRIME1YCitQRjlLQGY5bD15UnZ1NS0/Nlo/YnkxN2VJbFhWRHFEbD1ZV3QxKmQ5MnFQX19tUT1JY2w1fXp8JjImWXE+c0UxSSpTPmhMS1hJdEVpMks3CithJElGUlc2ISU3YEYkWXRafSNpUTV7VGdJXj4rQjcmO2NCUig7XnlNTW4tLVMpWGZoJXoqdSNZOVg4Xigob3dWZztfXlhNeTRCa2FnRmNOCityalVCK1RfTHMwKmNSLSUwS29gY3kzbVYlYiNtU0VHZ1RjUDJXU0BsZmp8IW1vKzREOUB2ZWNNY3slbUVeRmRDY018VnV2ZWsqUnhCPm5ECis4SSojJjt5MVpxRFZLMjN4aV5vPzF7dU9qKUdtYnxvMFI2LU9HTEE/b0FwSW5gd25oezxBM3o0U2p7Mnh2Z2cwUzs9ZyllbDRHRyg5PnohCitgbWdTbVNzJllrRD0hKTRlM1clZi0hTklVZDk7SnQrJVhsQnkqVmN9OG9VYDMwdklLfiR2c0BocSlSbnlkMzxqY15JJTZtdnwleEhSND4tCitkdEwhPmpeZ09EbE5lUnhzWXwpPXAhKU97Qi0tSjxXOyg9ITVZP2AzNDhFUnU7akBtd3pBS2xWYDR1cEkhUyN5UG0hRHBmI29HN3VheXs5CitFOHM5T1NVVkV3MEVxUGs5anQ0VT5ePlJPLVN8dUdrYlJsTz1JPEpgdzh7KT1ZYiN5UEFmKWhDWnVYQEQyfW5JdU44UGJBK01Qe3pOP1BxCistcVJmKFFVPUFKbGwhdXxnLVNUOTBpVz89VDchZ2Fxc0c8VVZkMnVDTSNZY2AxRnFXMFhfK3t7dFlpPypOTEw3Z1BzRXxRSEFWWmUwKEltCitwalNPTyFjJSZLJlNVbC1sRmdZbzJ4Rm08UUx3JWVueWhAeHltSXt7Kk58MmVHQClJSXdYT2oyKkkhbzUtNmZ+QDZKNU49b3RxWVhCIXYoCitvTnQ3Qi1VbzA8WFVKI3R8Sk03ezRBaXQzTmZtaz1DSWozWiklU1AqU2VIJTdLWTJtZFVASHFqZjF6OGJmY0dATyE7enJLRVZhVmsmWFAwCis3KlZfekE5WEYhejNKbVJVTldMfEs4SS1ReTcrbGVmfGo5MlZOfkVPb01JaSF3Q1Y2RytpMiF9PDAhbjMwellhdzZ2SyMqMWslbGBuPXpaCislemA/aXp+VjdiZHI8Pj9EfGtCMGM2ZXVtJFltIXA4bk84UH1TfCo2dXJze0YoRmFxa2VeVjZJaHA9P2EmcSRnRlZuJVo1azgkcSZTYld9CitGeDROfDElWEVsRDIpSl45YFJgfk5OVkozcUNzTEI0MjlScno+U3w/ZlotLUBSWk5mRThGWSNoS1Z6VUklfm1UV19BPGMpR0wqWVJqSUZZCituQXVpdXVlMnpjQXtwSHRwWFlxJmd6bl8xS1V3ITt8e18wYUs8TUd8XktOKHNJMktzMHw0dVJDQ1pie0g2SUcmSktWJmZLS3NaRzd6KVFsCiszbWB6MSMjdGtlejRva0dCQTF3YWx3cVRaZWN3U08jTmstUTNVcVlKS1FtVXpZdkNYX051MGc8QHomQUQ7PjkhIzckOWNxaT9sb1BWMW4pCishajxMO1hTKFJaeVQzcChXPHVAUnZSQSgjaStmJkFQVUtyIVpRZXg5ek5rSyZEflBKYFU4ZDVKfntyPFlHTU0zezl+dlo7MyErPzttIU9BCitEUHM3SSNhVEtwcVpmTl50fFFaOXgpUGpsSkc2QTwhQD1mTzQ0em00PXU9ZihvZmphJClOP2ZaPEY5fWMofXpVY0E3d1FUb0ptMVo3LSh6CitIM14+JmA5aytZMndteCNSMiZ5RmRyPzJRVlVKSFpjaENrPGk+aGluOWRnajQ3WVNCVTQ7QFRrI1hiMmlQKWg+QDZhV0FLMm10ZXk3RHR+CitwZUttIyMwMDQjLTAwMWxpMDAzfWxhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFK0FWUWd6PGEmcz9WVXVrWT5iWUVYQ2FDeXlHVFd7CitNbzZuQHZRSThfbDs+VEZAeVY9eHllKHJubm4rRzYjKDR5aj08NV5ifWdNVUFBQWRQVj5IJkxNU3w+XmpAYTFTRlFwYkxWJDFiUXAjJkF5CityY0gpQyFlQCtRNDNBclFgLVNOYHRVbUdiezJmKnF2NzhiX2JjKllgRXNSZyolYUYxe25nWUlpSkNuPU1BbTg8R0JIbUEoPT4tIzBCSjZoCitDYHVJYyotLWxKPlV4V2w7VXIkMUZ0bStmfkE1fmI3bmEoQWokQis8UT48fTkwb2FtMERDQW44UzM+T1JFZXU3NXx2fnM1Y0AqJUo9eGMxCitTR1MrZ01UcFFHaU5zNlhgb3ImX0RYR2Z1JHlTeGVYY25gcjZvWD0oOExrREJYeSFCNmI5NGxDdXsoMEtRbyMldUNHa15sT1JxWjUwP2xvCit5YjRRZ3xhWVBTQlFBJmFeNDEteyEpZ0lSQ09eSGw9eSNfUXVYJXV2ZWY9a1FTe2AoQldlPWlLJElmRjc2c21sMFRJQCFfJCFGcjlwQUAyCitmaSFZI00waXtUOHlxUj05QF5wPmVUZVErfEpVZUZ9NzY5JklCdztAMDhXd2pZVmAtRFgpQ0dvQztwdDg7IU9sNWhKKUR+a1hqYiN8UGRaCitWO0xudENfbTgmKm9ZY0pjIzw5Qjwra09BIXRXYDBfT2YwO0diVDB9JkF9QHpgaDNvRDhHbVREKD57RTxTJkxfa2g3U0B1am1FQmw8SFowCitDWXx7bUNTZmQtIW07I1gmajc5alUjdnZiX2NobWthakx8Rmw5bVoyMk5iOTlPZSRRSW9vXnE1cV5vKTtaZ0l5Tn0mOzFoJW0hWmhRWTgzCitFQUR4bXoma0lGWFdmOShiSSlYbk1sajdVZ1c7WShETzk+ZE1SK0MmZW9naXc3eClSVS11eVpVI2hBVDV1emBxYjg4fF42e0pEPnJKcHojCitSck5edkR5TlQlaD8mfitlS05yZSl6Pm5tJDVCRUdJVkpeaVRpcGRlYzg8dWoyP3NEfnpRekFib2VkbXRrZ3JJOUxYejhqeitXQUs1MlpaCis5cElUMHNnP2BXNXRkc0E0ayRIZE9NJmI2IyNNeFFMaSVIVWBCVVBzVztfQ3RiSChOKEZiVEZMe2txTDJhKStaOTlKTTdWe0olSDt2VV4wCitLUEhNX2d9SV9eUkIrQVd5YWxHe3pfMGtTS2piVHNMcnVEQEM7MEt6YEFAQ1E/ME1DZFNeK08tcXQxaSlSUmZUKXU0ZGIhbXw8c3Rac0omCistayl1bm9GKypnY2x+Y0ZkPHcodnxpS05kT2Q2OCM2NkM2UlVPeXNoelI/ZTcpejlmbGA1KEYrNn5kSGROYyNtWikhQ3c8VjNFZEVoN3laCittdEQ2T2l2fTVlWE03RTt0NiNVJG9eMyN2PXshcHV4S0cqOVJRUil2WGdKUVp6KGYwIzMxanNyVn57PDwwRzBSNDVwb0F+aSRQb0lsMEpuCitHQTNqe2Q+K0FRfHpkYERuJW5yd3duUn0tVUxNMGgwYVJ8bXVDanJhPD9MLWR4al95ZWs+YCZKZWkoZWdHKUhrV3FrJWpAUWdiYWRCOy1WCitKYXo2RHx7Tz5xdiZAJFlLS0cpdThnRjVTPSZgUHJlJG9QeV5XeTMpYFhuZ0JlKVU5QmNzPWJ2TTAhKWREb3J7JFpGeko7cV4pOzFhMmlsCispU1VTNzVSM0VEYUtQV0tNI1c1NyhrZlFOfUNfUzgpZUVXXmwlK2RuOUN4ZmBpflBnRD45ak9CZmpHd0JUeChke1FFaE0pS21YQllgTDQqCit3XlZDc3E1ZWdPYUhUbDl0VkRPaStxUF9OMVYzXkMzXnQzKj1AXzcmUUw4VU4+JHBUdzU9O1J3TnV8OyExclQ+b0lxU3Bge1U1XyZONk02CitZKWVqRz8rYmdOX1dAfDA7eislOXdTUzAmTiYjJmQwJCNYc3tlNUVqJCljUztsVi0hKmdnYzdgYVd6cCNDWitwMFJBTEl2SHt2cyZmRkNfCitNTDFhdlBHblRwPEBzREJPbFI2ZUxxSFF9UlJHbCg2dm8yI2QlWnt0OCNQcy1qTD5AdFA3TmZjIUZVJCs0Rk42QERTQlJROUwyK01XMS05Cis9TkBXYkdeOEJUIVc3T3lyMkJJOU9iMlNvfWRIYWxXY0k+V0l1LX1XVUVVbmY0a25EaVNCaWl3KUklfEklPV5FdW1RZSVfYE5fOWBQTUV4Cit7WXEtYjhVY2lJN0lwXmtIPT05cz9hMGA2S1hZMWRoKn5wNXdAQWdmPGVVMFg3TW9IY3BTaHN1JEpwaikrRiF4aUV7NWAwKzczZn1yWTwyCiswKGZXaFJlLTdtRnxXeXN1QV96KFVnfm9xeDRYbTZCR3hkT1QoUktXOE8zUHVHRjRkfEEyOXZIYyNlcjNePmZeUWB5dCtqYDE7RnVUPCpXCiskJSM2N3k0RHJ0dHJZMW0qJVp9Oy1KIUdtKXRqczNwS3FfcHtFI3ExfDZZVzJoOV89bF8wI3dDNDJIZmxrS3QmWWRraHl8NTNtRmZTMF8lCitMTVohT30rO31ROHJXcFFaVkU/fmlaQyNzOyFMak52a3BpdjE2Rz9FNk1jPyEqS0J3dU91eCFHdjxMVEhMPkFzUXVNfm1LPmk5ZWpXYHw2CitsNjlJc1ZCRzR2TTR0bUFfbW40S3pkRCY0VnI0cUxwc1ltdzJmU3hpY0JEeW5Oaip0S0lBTENwanYjQ3hqSypJRndiZ30+K1paI09oYlRLCis3fCg/PTlCZlhkSWlyYC1DNiFZVWNHcGlpM1h1UCloPkA2YVdBSzJtdGV5N0R2cylHX0x7JTAwM3FpMDAxY2YwMDN9bGE0JW5XV29+M3xhCit4WjlmWkVRN2NYPHsjUWElRStBVlFnejxhJnM/VlZxdFMtRV52QTZTVzlta0h4Uno+dU9LIztSalVmXlJqN05oNihERk0yYVZEK0ZvRmZXCitPV0JOOVQhQmtEYVJVR00maFdNNXpUX3g1PFdPRjtCeGdRO0dhUWJGK3skYEtAX2MoeDJnJmxCQFpHK2FpcVB3KHRgM1VqcmF2Ym96dm02CitGI2hlQGpGWTEhejY8MThzcyE2czh2RkgwbWUkUFolJVNGUktJVUwxNHNhIXFtKl88Pj1hJmU8T09fSm19dHR3ZFdqOWpHYG0qO09AdUdYCis3JFBWanM0PyRydUVIPi1kMyhDVisxbj8xakw9fDE3LSNwV0c7eTs9WGN6ST9rKj1MdTxCeHsteyVyUFVwaUQ2XzdgLT5mKnVoVHBTYj02Cit6ej1mNyhAeDVgSGJ+SFExTFZqdXZwbGZyYWJtPiZ1SChWdXwpOWFuTUwwZT5hV2FYNEcyYUNUIVF0U0BZYlM/T0h1O3VVRkdPR2heK0NzCityMl99dyk1PGQpUzkrZjZ0IXArNns+T08tUGdRYVJjeXkjNEVBTUQzd0N9PkJgc2g+bzIxaTYqbVV1czx8NkNOJSN0SzIqX05tfSQ4Rjk0Cis+JDstaUY2WX1eKVBrTEQ8YmxuV2RSTmprZUprbUgmbV5JO0s4VFYpa1N1KDMwMHNlP19lP3VxPXN3JSspcXs7MVB9ZVlnT1RkYW8lUGpxCitOISlVYmRHN0pQRjhIQmJWNzZCV3BucWU3KU9eZ0khTGNEOW82JTAtRFR4WUdTUmNuJHlzLTV5JG5SZ2QmdzdjP0pZTzxOSmFNVnZCaXtKCisjIU5HK1d3b09jYEBFI0BZVFRuOGdRam1XSTFYdyM3UFhrXypFMlVhTGMzd2hAYDdoTDZlKjA1Pnx7czdVeTYqIyFTRl5DdVpOa1RuezdPCitOTEprTWYyQU1mR0MwSF5Jb3RtNld3P1JUKn5lZGJ7U1BAQSlxJjhqdm5ZYGtGfmpFQj17ajJ0NHY3UlRPNEc/PWU4Y3B4ViRJM283VzI+Cis4TGlKYjMmRHB1LVVoP0lsdHZxRFZhRVg0bW1FZzYjUnI/PlF6U145WTlDRTJHM3pRX359Xn14UHZqUy1xVkRQbnF7WipuaGAzPj11bylSCitIT2MxKlRLQlglYmsmQWJ3bT54Tj48SE1hKWQ/NDdaeCM/dHlDJDI+NSliamZTeWN3MXUoRXJNTDRYKUE9MkRhfiEwaE99JU9Va15jUW5qCitDXzJxNFpYPG08RUhWVlFnJk5HSXBKfVZ9Kyh8O2ZyTCthNCtrOXdyQWlzYEo0VDV6T1AkRDtRQzVkQ3BPdzRiaSpqOzZoK1lHYztfYihtCitGIzEtfkwqZVpaRXlQKzZBc1JRJDxeJn1JV2phZFhudml3MCFTZjJWcGYlOzJJTkpxYlZKNXdQbXhwfEh7aE8kRVlKbEdvfGNAWn5ZXnR8Cit7Y1NaKmpXcyg3PGpLN2A5dWh3a0JnMiVLfVR2JSh9QFBGVXR6NjF7X3tnMilGTjdub2hjNlRWLVhobUs3NVFqUW0zSStkJDNVaHA4QTloCitIYExsNnl2cG0oZ0FmSnlIPVAqTShFMlVeZC1OIV81MV9NJVpSZlhvTXRecCplRkpTTVM4X2s5aVd3aT1xVHpQeyFlfVAwT181SGJGKXhECityT2sjfkh5fkJrZyg8TG9Nd3BaUjtreDMqaX1EUFFKV3pPT0FkJmNQUUEtSzZaRm9QNDQyYko8bzAtUHspNEI/N2FpYD9fI31waytyfEEwCis9cDFMc0JLUVZtX3IyJDdUNU4kMiFpI3QrKmMrMHlsWmhhansrbVNlQEUzT2BiOWg/bFNWPHBFX3M+T0F9eC1rQmE0SmFNTm92MSR3I3xpCitHLW84aH0oUHxMa0JJJEJ5MmYrZmsldCtLeW40WmxXWT9QcVo5eD91YCR7MTs0N1VOciVxdWUoWUMleVNPdU4hTyp7ZzBjcGV6Mio9ZjteCit0ZG1VUXd1VndQaCF4ajlvMGp1P2B6anQtcU4xYEgkY043RCsqRUFacGNsUldRcUZ1UkVCfFVJWSt2d1BQTjxUNG5vbl8zTHstZGk3aDdeCitSV2VZMkdHI3xAPH04QiR5YDVgb1NoTi1fTyRGQng4USFeKCZBNWMhQzghXlVwTzJkekUxVlF1dFpiITlxezJjJmhgMkFmUElhWWc0VVpACisoTFFfaUFxTVhAe1E5NitkQFhPaStKa14pUCEoQitGSX5mUWAkcWFGZis7RlREJmslWG4yLTNhPiRAVztLMVJBU3tsfjJzVUVBbXtsb0t7CitpMSZuPX1vRDR1JEVWUkt0Zz1paSRDanNyaCNNQUtIZHUkJnVifFRnUVU2PiZVMjBZd2Yhemh1ZDdYV05xcE5OQ1I1QGhHbXlmUkVKZzQwCitpIVR7ZU5sWHNXeyZYVTxtWjJfKEtFc2soTXphJl8mTEJwZGtUWGVNJilKN2xDX1MpR35DRkhnISZ1MF5NeTk1fWVjRjJkKD58MUp5cjUlCitfZGB5KkxRYGxsVn0obVc8dkYmV2c1NTI9X09yOWdnbFZJeDlkcThjdSFnZiUqdzFqMz82bU8zdUticylfOVQ0XlRAMzFRWS1PMDA7b3tsCitAPj54dUw8TSUwUlJBdjFwb2ppMDAwMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFHezdjVlRSNldwWjtiV04mUlFhQ3d6ZitpdSUxCis0MU09az0rT29RZjUzbnwxZGNsZFRrUnJzKzZ9YFhDXnA+K2xgb0x3cGgyO0pwUUk+cTlKbEdGMlZjbTsheX1TWEV4SEJ+UVYoaG5LblArCitALXdCMjJQSWkxeUsjdTx5UmN5fkI+c3BNNG1YJSF2Z2ZqKCNhdjIxKjtkcEkkVDxOelgkVFkteDsqKlcrc01OLXc8V3gjajIhS2IqVXFGCitQYDVvY1l5ZnBRUiU/T305QVVqbjM4MXZQcENXb1RFUkRDMDdlei14P0paRSthMFNaeXRfY0AmMnAmfCtiPSNIJjJuLWxrYldpbDI4VyQ/Cit7Yj8yQUwmNVNELXk9RysrYjZqKkIrbktLbyhFUy1HeTx1UktUdiZBSkxhNzRWcT8pfXFpI0RBRkg9JjVWemRsR1U8VWxLVjYlKV9HPGYoCitHXlc1OGpzV3Vsbi16PD9gaH1oX3RiOER6R3RlR2taNko0eyFHa3VDIz1nVD1TLV41QClgQDw+Nnd1NjNtandeVTVHc3FZQ2VuQy1DQ1lQCitqRT5NYXFnalpTWjUrMTl2WnAwJUh8c2dFU05raVJxNEFNYGNPflZTd254OVUxWiYjYzhlUUBMbXZBK005ej8qU3MldzAlTHZEZ3lyTyhECitAKWFaTC1CO3Q/TEpMRUghJHVyfVhzaHB8eEtYcDNFWiRJZXRXUmV7MHpsTztWdXxHIz1nWTBjTG84PyNVZTFEaWpmNUwxQ3A2dStoRiUjCitMXz58MiZVV19ZU0JJS0xpbG4yXmZXP2Z1KXFAbVllfVY8IXxEeXNDU3FQa0g8RklZJkUhQ25SQE5LeDszbiZwQ1JKNGdMYTlPOUtRSDAwCiswMDgwUH5kPU0rNU5tRENQdEowUFliMDA0Vj9mMEJ+dD1GSkU/TFplKHdBRktCZGFZJkMzWVZsUS1aV28zNl5ZLT9xNWIxITlkYSVFKk1hCitDek5XUUUlSGU1UHNMTVZBVTY/US0hQThRJnRiPzV+bkR6QnRfPDc4O3MwZ3FfYShnNzZwPVdWK3tUOHlDV3I4d3h6QD1Ga3FXckVSJVFOCitlZlJOPnEmP1NhI2ImZDRXaClKezg1NjVnWTBMUFhRTD9meV5XUEplaT91TDk2JHpeZmsqT1NKUWRyUGpuam8teGF+ZCN3PF4rfjBESXYzCitIWVp8bWBvcjh3X1R4MiRZaFlVKX5LRG44KCk9R1FkN05pQUktWVpBMUp8TUNpMDs4djYlU01iKWZ9bj1jNUNrcW5EYXYlVmg5WHh3SFI3CitRT1c4dU5oPzUxcVkocT58SSN8X2tEWD1SME1RKFVSTWw1b0tAdE1zUCtLeE8hMXJlT2dPQn5zOWtXQD1SbTJ+cWYwSDJ3NEk/V18xfWwpCitqMz9JMCU5cT00PTZXSmtiQ0BSWUReOVhlP21gZ3syYCgoU1BCaloweXRRJXA/QXdefWcreVREZXpEYU12eFpYUUdnc0pkOUpNQTJ7YnNhCiskXntve0tuLXlHSUsodFNFeyZ5dGtPb1RWTEtVYipCfWhUazJxSF95OThFcFpBRGZ8dTZLeFFDXmVYZFlsNWMyc29GXihYI3VUYmU2Mip6CitEa0Yqb2BudUBrclU1RyRPRC0oMUk4RGc3VllXZ0whQGRaK2JPaCNEbmQlR3J3USFqI0VDeDlaK0w0byNQMCRvIUhCSzxfRVZsRCt7ayRsCiswY3dsUG9hQkN4XkFkJjdHaF40VEc2NWpFQm0kRERjU2YxVUpDb2VLRVNTRjNUKiYyUk5oSTdkbUVUbUVsNmEzXnRoUyhBZUhUTUF1RU5PCiswJGlZTCk5cnR9I3EkWGhnJDROPV84NC04TlooOVhxO0F8em9xeCRHcypxTGFBMG4oY2RDdTIrYjg0Z19FIzE5RzBZRDRoelIyTn5rdFFECitFa25henFBK1V6Xy1wdjZ0KTxjOF4jckV4UTlwS2BVak8zZmFNTjlXUVkreGAkMHR0N3tUMylXYClzRnZya3RTYDtrVylwQ3p4Xll9OUlqCitoO0AlemZUZk1sVXU3SjduOyFHOSMjaFdAIVdFWmg8MzJBTnVnfUM8aT1ycFFJT2RwakMre1hERDtzYzlhMVFZZGpONlRIcmJ3RXBaJDZ7Cit6TTlOI3VDRkpRYn58dSFeV2hgQ15sNEQlVXBJSztsSSNUbyokcD11dkdEeTF3NE1DJWRIaUV8MVNsQ01IMl5NMyhrb3EpSUF0NyNXcHlWCistXzZmSjhxJSYkWiM9P3E1cEpMZCp7fCQyV1JMYHoyVUhWKDlgJShKVjlyc0cwUXZ+cyZoQyltbitIKW5Abj4+SmNpTXRHS2dOREdXNzM5Cis/TipkTSYwVl5JYGJaYCE/Uy0qPzRydyF+YEw5ekxsWGRMJGZiPHhCPUBuNkpRO0pSe24hKXRxZyooNWZtO15zSGBaa1B3NzZ2UikoR3d6CitFNWM0JUVlZEY9KV5eLStNVUJhYktmbzMwcmVuKFQyXldGeEcyODVhS1N5MyhOfW41OXxjUEc5djZAS3piZ1J1X1pyXklzKVBibnspK0AtCitwMjdRaElPPWlhZmFwWEw/Q3EmckAkajx5TH56U2QwWkYhJlV6MHdyd2YlWjM1QW4ycm45N05sdWtkXlhUXm9rIy0xKGxZViVEO01OZ1R6CitgYWt3Sz0kR3dqa2M0P0hyPz52P1ZCMDxaZlR7STlzUWk5djJ3ayZ0ZjxBZyk0VyF7Ml4oMmtodn4wRThLbksoP0RLQVVCQkRjbXpAUitfCitxdkVGb3VeZnZvJkEkTnMzeE49fWh6WCZgR2lwOVVFaihRb19PZ3olNFVYOSpgezt3Pj8oO25UYnJGJGhXYXhjSihRUWE4ZFI+PFZwVSZ2CitfNS1hNz9yXlhjbzgrbkJ2KEN5eiR6Nyo3ZX1KOWN2RyFxVkc2UUBXb1dDZiU5O0tiNEVPKmUzRVozO1RRfTJhLUlwOUtBaU4oZXpLTCVBCitWYE9HWkx3UClqY344QDBhKiVOVmlmYF9oWWdpaXVZM3RJdUtIMlQrKXB6WCNPZDxiYm1ZMG04fEZnaGlMRXJnZ0UjY1ApaD5ANmFXQUsyCittdGV5N0RwYEB1LUN4PzAwOEMpMDAxeG0wMDN9bGE0JW5XV29+M3xheFo5ZlpFUTdjWDx7I1FhJUUrQVZRZ3o8YSZzP2RXb35uNVg+KVhQCitXbnBiRGFDd3pnTz5mJlU0ODctOWFOU3xmVTxCSz5Lbl9gdyErPDYyUnMtdSQ2b3pXa3NiRTwkRVpKUSM/N3ZVK04zN0tMbihBVXBBfEt6CitRTkdUfikyNFI/I3JZdFpGZm9IaVk0NnB+U0x9QFQ9PTAzIXs7K2lZekxuKFFyVmhqYTBTVExieXZ4RzFYRERAKj5NNUAzSjxvbGp3SUp0CitXaHRiUFBPWjEpPTxaZz0wcHtjNStweG44WmVLNVZZbSFMTXVrNktycFR7e3d7a247TjczSFlAQVJEcCltKD9lRnpoQUokajktRjY/ZVkhCitAOSFfYG8hRml4eXNMIT0leU9jQk9jezZffXgyXkZkbFlJJWc0RChYJlZ9dHN5ODdlPT9DYDtuaCUhZXFudyYxM098Jlk9UzlTVmQhWlROCit4TSR0SiR4eVgxUGReYTJ2fGBSJjxkVXFBfEBmSDA5QDlhaTRzQ1JhZGBrR0Ajdm95U2FEVHFTaTtfMlBnSyNza3Zxaik3KXpePE9NQHI5CitKSiVxVXNXREVDSXh3U0Jsc3k+RHdBWj0mT3wxRlFtQnVxaTVqT3hRYHdzV29lZGM2a3F2UXVlZmUmYUpgQ0t5NSp1Nlgyb3UlTG1fVCk0Cit8LVgockskPH4+R1RHX1ROQFY2Xkk8dWJNbiF3bUJ3U0dfKW1Ia3JWMyolYSgpV1d4P1ZGaz1lLUsmfUxIdlFJVD0qUjl6P3NFNyVnNC1ECishZVpMTjs7NkR3UWs2JjQyTHUjZmZVPzt2eGo0OzNZQEg1dysjaW1+QFgtOEIoPCoxVEB8aUJjRUB6NE93WnBBVHMtWD98fUJSUmFfaGRaCithPXB1PDJZYVhiYmhTXz88ajBvekF8eWNyPS1+eENkc0JzN3woKD9fTEF2R3plejdjQEVnWWJIdmZGS2N3bDhzK2t5NjsjNiY1Qmh2VG8oCis+PVVmKHBDMnNsK084Yz9RQ28wamgjRHcyI3N8dS0mUjltJlhZZ3kmanAzazhDS0hlU2x2QFVvS2c2LSo/OHIqTV89ZGkpdVZNcHBeUWYpCitQNFJEXm5eUXl3RW05ZVVeb1p5YjJFQmYtVVN7P244O348RHV0OXxPcGBCekl0SD9hKD16V318WD9iezR1bEx9QW8rIzRrWFp3WEhkSnRVCitfRlUhempVZG1MZUMrUUslYFJwSDFPOUtRSDAwMDA4MFB+ZD1NPjhKUzlWckY/MEI5RWcwNClGajBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDCiszWVZsUS1aV28zNl5ZLT9xNWIxIVVvWkVSKDlhJUUqTWFDemxlLUVaNEE1UCRieUxBZEJEVlR3QGlZM1A9ezxPMytNcmJYd1dERlE+RkNFCitEZ25lU29DVzFqR0xLLUk0a3JDRURxaHIodTNiV1ptOEdqYHZPUFdMPVVoK3FKcnRFWHhRbG5fNmxAeDJoSmNXfHtxLWtiPldII3BAfnxaCitOPkF0VjQye1dOaDtLMGhZJF5LKChJbTlNSi1kc0E5QF9rOSgxTjM4QDh9KTstTTVoamNMaTRlVndOR3lsdUhDbXtoNXUzPW5qbU53I01YCitPXjE+OGx4I34/NTFiQmZgR0pEZ1FZO3BXZzYjO2E2ck4wSjhMOVpxZzIwRkdoJDM4KG80Ujg1NFNwbTg3Z1hrQGRCKzZzIUk+K2lYX2QxCitgQ0Y1ITBuVjlOaSlFclR6MXcpVFQlVTE4c2VxMUpHM0QpcGpGSnJKVjdnUTxvdjk1SmdafnRKcT95JUFKRWFNZnxTciNjS2JfcURsKFRsCitIQUNSb1dUWlFPTVpiZjIwWnpATCY7SylUeHVCc2RrKlg7SjZBK1NNdHFBY18/Z20rUStCZHhudEdyaChXLW12eFRFeEF1N0tDcUdVTTlNCit1eGVvSz5gQkB3MV90Yn1NK0VAIzZWVj5RUU17V35+JSk5Rkwme1RhQWEpSnRRWHZZb3R7V1RjRnxGI3FqYmdjI2F0b047SHopXlNWYDBqCitDb2Y5bVk7aEwldj5hWmNeb0FlSFdaMFpEWFNve0w2TSg2bkMtd2I2dlJsTlQ9V0RkUntAOGs+LXUjNCFYNSo0O0BXb3lFU25MY0h3MWErCitsMmRocFJoX0NpP2BrTmxLNFlKJUV0YHpzailZKUpDUyp2ZGdtZnRaKik9SkBMOHVHQWRHPVdsMz5eKnNlOFBZYSlaeTdAOFQxMG5AY2dWCitHbyVYUFFyWkd5WiZFVT4hTiV6PXNPdXhjRSQzNURNUG8zcz1yNV41KyM3dmQwV0s0Rm93Mnk+VzFLSzhke0N8NjUlUjR6K1pfSENFditNCitYWGJYaGB4e1p4SzwrJiZ2ZjB0NVZZZC1RPVNzPG18cWF3T3l4OWA7b25zUTFuYj94XmRlM340TlZlP0ZafHE5WjFOa0hhUWQ9TGJ5eSgkCitnaiE/SX4hJjtCenhCVz99NU85NzdHP2xVYmxSKUxwZSNlRm57UWV7QElqZkx4c2JqTG17UVNVQV5YJG5gVVUmSl57V0YqemVFfEdhJipiCitzVHBuXmdVVF5QUHBodTM7Z3p1M3I/OWQrYnJBR3dLJj5Ba3ZSQyVfaGR1Q0cyaHl5KWV5WFpXbHFScVNFeWV4fEZQaHluUDgkYTNVeClsCitoU2xqNDY8P3M8JXtyT0YwWTArNG01U2Y5ayRBaWQ7T154cGJJSnhPdTxMYVQhKld0Si1PZ3Fqc2xqbDw/PVBNZk17dVJYNU1FRkFwLXZxCitzNElSWDlPZ2s9TUl8TFF8UE15QW02LWhDRFozdk57N2RIXkhPTk5FNGBmQTAhIX1FPUVFSVZ2PCtYJnp4PE9Od3s3eEVAM2VrPmQwWm52CismQE0ySH1SbF4+fXZCY2RmWEdUZzd4aC1DfjkxRXdPN3dQdH1RRmprTmI0WkxvdmcxbDVxQCk5OUo2PXhsfHpQZW99WmcxLXcmUnxeWkVLCitrJDtTdGUmI1BJUHBNY2xyTH1famd3fT4qUHRPWmw/Kk80UGZpZkFGZ1omUW9HVFpNYHhgdS12ZkleU218VXMjKU58SmEwbCh2LUxpcX1fCit0UjdsX3xvWGNpUld1SXVLfElhcFdFd1VkUXEzQ14jdEk+YCorNHxaaFMwYDhHVFBGeFQ+SXNLQXlrXz82PlJCTjhzO1BaX1pYNSV3RHxHCitIUlFYV1QhcXMlNG1wMHs9SVJORittQF4jeCtZciZ1N3NwNGN0enpTPjheQzFUdUY2KWZjemg/IWxgKWAmMXxDayprQVBGJSFidUIxVjVNCisqcy1aYStBdihuSnJGJlZvamVGfHxBSF9xTT9oZ0lPOylhYSRzfkZNO1hZaWtZZDlRSyp2emRFT01hIV9sdT9ib2JsO1BWSCN+JkNRaG1ECisma0gjQDxVJnRpTHc9R0MwQFhjV1QwJDJ+dXNgN1V5Tjk8ODhaeCEtPz87fC1gWSozMi0lNXBqPylBbCk3bU0pQUFQKXZzNSFpayE0P1c8CitaS1J2ZlAmOTJCO0FSRm5ySDh4KVU+TVA0NmVha2t7QzZyfWZ4UGpCNzVIelE5IzBKVFNXVWokUCkrO1A2fWdmIV5jJmMoXlBxN2dNT3dHCitTQDBWIVFxOWklb2xmSklXVUtOYztFZVMwRyhRUEpBUCFwZCtwelNaJFMxcHlBPU5TPU9AQHxiZT94VW5kajtZYShqRkdoSjBsdHJ4a3t7CitSblE1XihybGhLTXN+eSlQb1kqIT1fU2MpQFBLU3ttXkA2KjMqIVllKVNNeiNGSW4+YUtAKX0qMDl5PlUrLW5NUEc0OWt9JSFBRmhKSSM8CitlO2l7WCZieEo7N3VHNjAjSnFiSnhgZyRobXMwO21tR3RFajkmTX1NZXU3JnRQYDdScWptQE9hNjt7VEEwanoxPzgrczB1PmgxaztrM3VlCishPHMlMSZWa35GZjtuRjEmNVhQekheI2p8JiVjPTB6LU85S1FIMDAwMDgwUH5kPU18Qyt6UGBtO0YwUjlMNzA0bzNoMEJ+dD1GSkU/TFplCisod0FGS0JkYVkmQzNZVmxRLVpXbzM2XlktP3E1YjEhZ3BZOzB0Mlo3eShtd04+QTErYnxHKl9nXjlNV1A+czZ3YXx3d0hFVzx2TjFBTzlUCitgXzhXP25Hb01OT0lhUl9QPFhqK3AoT2UlUX4xSTVfRzVnP3peOV5sJm5jblJFPXBBNmFgYFJSd19nMmxhezxPUF8qfXlseClXfGxPaVJKCitVfjVASSFJPVI/eHNJWD1GPHh0KW05b3laNGQ/ZDEyZkFOUG0jWlNiJCMzKDtEa2JeaVlQZnVsaCZ7OHIreDl5RHc3NlNOS2k9ZlV4OWo7CitUenlDYSk8dGRxNlBuWGwjRHFyNHJqPE8hUWMlbUE1VllaZSs4IUMrTSlqUD9gb0k/Iyg3RGRzVFE/MUVMMGVxdTsxMWZnciomcytSOUd3Cit5Pm4tN2V3Q31JdH4+ZzBJWHZ5ZTdSaldDUnBPUnxzeDQhVyZeOWd+ZWRtUkN7eypqVztVMzQoWjt1YFVOcGhnJUtpT2NOb0UheXJfWVU2CitQSlpKZmRRNCs8V1YpJDllZWhoK19YKWEmWkZYSVN2P3t6Q1ZgKUtXSE8yQWNtbXZyc0xqUStVNnVjM0QyR1pGSSN7eGd7b0NQT3c0YEBsCitTZ3VTTmhXIXtIVHhCUG9gZisyKVY8SjBDU0VCVyVjMUBpYEc+clpgVFJ2ezVIcGFPUCojOGtJUTlLQWhFU0FnQVlVbk9BWGlHTmNyeGVRCit2WjxqWVM5aUJ2bFdOPFl3N3ppRFc2fENDa1FaaXQkajEyN0o0dkYkeE80JHZGa018IUJILTFwRjRvQms/Y045XzZ9NEV5KFh0cWA3cW11CitHTTlBPUdWZWNtb15wPnVOU0gwbE5hejEpVmpacytKcFRBQkRnRFJ7R1hXR09MMXRzanNaYkZASFY2V3BPUCM5O2BkM14+bT9NKVV8NVRoCit+KW4mPTBvOTElXk9DZ1hCVklmal9uLWZsJVpFWnAoZGE5T2NAe2F0cztAM2lIaG8wYShCSkFIRiMwdGM8JFcjR2JucDl8Wj0qaDRzNV99Cit8VHk2V2dARGI4IUlJQFlYPU5neEY3cUdVSjRfUU1TfihXXmJYcWhWPSZHenFNOyRXKEBzb3NsQVh1bCExV1dpbHFBcmp9Ymt6d1hEJSllCisyQjtga3wzSFQ4SzMpPkN1ZihVdEAqTERLZChmTyQjSnAwSTJ5NExAPHFoUkc+THUjUCloPkA2YVdBSzJtdGV5N0R1VTctS2Q1RDAwN2hnCiswMDFRYjAwM31sYTQlbldXb34zfGF4WjlmWkVRN2NYPHsjUWElcDhSVXRlaSVYPj95LUVedjhXaldHX3dGYnFaYW9XY2pGSH48bUA1KTVuCislPmBgYk8keF8teHd1OHYrT09uRVhDcUkyWnxHO1NoWWVVaChYZjRvXjZEem88cSp4VH47MFpqdk5HUG9ubCRHWT4oTUQyYTdzWiYrZWpJCitaQiRgMis0Q3ZkTkFHcDYoRGhzeVA2OzR7UFhQRncheFVlNWcoLSFvPX5UTXdfeWlIRGs8aGB9ZzBhQnRZOTROeXgxMVFZLU8wMDtve2xACis+P3pWdWgxXjBSUkE+MHt7UmIwMDAxUlg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUliYUg4QkZKRUZ8YjdkfVlkNC1aT1BzMTx9Zz9JbW9RCismfCFiRHdUbnVRVT9aRDVRdzIkUmF0SSZYKUdLJkA7VDd7ZCthISZOdCs2OXchZTR4LXIwcFU2PndmT3VDZDVEJGZgRWhmIUw4empZQSZ5Cis4U0xlXkJ4IVU4amg0Q0RCVWpSKTZeYS11TFhGJWdnfUwoeF4rbiFBVH15cG5qTzl1WSFQLWhweTJFdEl6Xn5iQ19QaXIhTWVibEgycUJWCisldkVWI1N7K19rcTl0LSV3NkQ1U0kkZV59WiRtOG42WHpWSjU2IyFUUEg4dDhLb3d0MC17O3Atdz18QjwkPX4pPztNTHo9I2dmMG9uZiQkCitES1BwJmk/OV9MUj4mP1ljR2FPSkMmc0taIUBPO3AoJithU0szakBHPF48RDh0WmooKCZvbGp0Vmhyc3NeTUFSYnNBMDNMeCs9MFYoMCtfCitSeTRBaUJLY1BfaUF7TUFJPWdhSzUkO3ZkY0tIey1OPmdRVzw/ZmF7dUBuJXNWPXFvT2VYbkQzdUhmRH0waz1rJTI8cHlNfXZNVHFsZnxvCis4XlB0UFBlKmgqUnEzQExpKWU9aE5sOzZqcVJKPSVGRiVGdVdwNF9VRjIxS2xaIzM5bGBsKnNvaG9aWm57TWEtI1Y9NHgwfFhRUjAwME84CiteT1k3eUJ2cVpNclUzdXxuZ2pwPEJMRHlaYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZMWktnV2lNbzViYUg4QkVedjlCUXA9OXBGYnVyCis9RH5PekEhMC1ud3Uhcjw8PXcobFBEKylvZT18cnQ4ODZ1c3t7ezR6cDU8QnJDTWF2VDwmV3R6fHlCSz1WeCpLX25zNVJKcjIkOHw7RDdjCitZUD1XXytFSnpCRUNTMUB8cGdjaH40akx8cU1pY1UwSSFfbmV9fDA9bTVfX21jU0JMK0x2YGlRO191X2stRUtwOVcwYEYrNSVQXzFge1J6Citsa15Vbml4YVhxK0xNPyQhQ1NkQDNNQ2koUFZKeT1BUXhxM2JHWCVBQmhiJkF+KjFYQ1AhJVVUP2IpO1NhdXBeJUs1TUlqSUZwIWdrO1RMCittR2k2SG9pZlhQfVNWfjliNihCbnsyJE07YGJPc1JHWTFIQCh3e2k2MmxJRyghfjZwSHN1WGgrTDE9M3A5RWhFUGNDWkh3bzA8SHhCfHA7Cit0O0l2fm0/eTZgb0JEVUtldTdmREdGYCNaeERsYDMpMVVTJF5Sdz5ITUVSQShDc01KUGRKe2FHR0BJKz42TDZzdEZ8QylzT25LSEBOO3ZkCitxX0xgViNZRyMjN25yemBHeWxNQ15mcShSYSF5WXxqbzQ/X1B5aGokdGtHc0NKS2w3KFckOzJVSVhIVTtCIVEmJT15anZOKFh5amw+T0dVCitwfktJbU0mNXFfeG9EU1AjWDN4MUVwfEV6dztgLWByOE5CX1UjblM2UVMxNWlyPzFRWS1PMDA7b3tsQD49IVBqMWN+MHNzSy0xXkBzYjAwCiswMVJYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFIOEJGS35HLWFDeUJ8JVdtNSs1V01SdjdDdXBeQWhnIzJJOzJIPT84Jnp2QVpUZTdGCitHYGFGTmhRd1RjZDNVKCR4aXd9UUp5VCQ/cj4lfmdqOzclQVo2USEtbDNGMHJfUTxuPmZvKkoxSXFFY2ZRRnZRbFFqa09oSEJmTylEK011Cis/WHh5Z2JrdnBkOEJKcWQ+RkdUNDFVdl5CVU9VWGp2SUJYbiE7RnEhUWV6dD95cCN2IWFtTSRLNVJgfWUmdEt4dEVYISlHeWRVPCh3MyoqCishel5sUVFaSUdjTHJTUGEqbWFLeEIoNzMxdFc3KFAzZn1JIzJsJk1qaWkkIUEmdCMhY0smQ3B4Xnoqakh3Z2QjNGRTVHlYcHtIdEA7aVFUCis9ezVHJiEtZCR4cSZnQ3EwZ2NYQFZjakRrdVROdWU2SkhefFVtZm9JZCRpMWhHSFZYZipUQCZSMUQrdWchQ09EMDR2QHYjN25XKzJOYURkCitVaThZbDdrZFRuNUVRQl88dG02aW5RVmdJSldPNmloc0lVcEt9Pm0jKT54Rik/clVNZXdjMENremFxLWREV3pKfX5+Y15iZXlQOCN7K0JvCit2WktHOzVyJjMwT1RRSnomVig5c3lPTlI5bUJLUykrUTlRZipfV1g8byspUWxwSCUzezBvSm5TbHtSLVg0KTJUcT9uMkEtTEE/OEk8QVY5CiskIWtoZiUkfCNoYSFDfHdrOVU4YG1VeEA5JWlpPFVASStRNmZmJU44YjgtPGBDfHsxR0YmWHYpSipJPTNCJj47SVU4JE56dGxJS2I0WigqCitCSzVkXzZAfUBAU191dGhacXlTMXJhQWhLPD94XzVyTFBwSlVXTH5CNGJeeX5ILXlHSDZfNHByPl49fWdPTUBlRVledCp4aSN7V0VjYnB5CitZT08hZ0J7TzlLUUgwMDAwODBQfmQ9TkEtV0NeO2lsMzBMbWkoMDNaTVcwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lNWX1YPk10QlV0CitjYjhkQ2drdWtKfm05fEV8QSthSWp9UD1UKnw4Mk9Kak5weXtPbjdIRVQ5bnhHJWpLJWdhaCV+JXAwbDNLNi1gXzJwPnFXb0l0dklrVE1jCiszMEFIVVl5NXxxbGB3UXRYQWJ9QSMwSlp4OXBPPXQrYHomLUNXQUg1XkRpSlRGWkVLQ3ltbHVoSTktVW1ee25naTclYmghbXpobnlIcVh2CitLS35jJStGQlVId3lJLSV5e0A8TEBRMXZUaSQoUzt0ZGl8NWxaSThRNiR9PHx3aWYhKkYxNnFsbnt4eE5XTlIkbXNmQjtMKX5aQn5eY3NZCitJRiNKfHJXIVp9dEZHdnd+JjUta0pQOzQ/YnN1OEgtY3VNY0ItZDwmU28tQDNWSU9pcClKZWtzQ2FiSnFIV2lNK35WMmYtLSlofTNVMzh3CitjdlhLVn0jKTxuZylUYSVBZE14K1BfK1M2UTAtdjBVTCpzezZzK3lhLXtoYG9payRgYUskM3hBUG0/ayg5UVAydCNwUnF1NXRxSEEoM1lRCitZVSFkelFQN0BPO2ZkRkN5NFR5UUtGfiVaSm9CJD9gMHZwMEZFPkZ7NCZ8JWRCJHJifFh1ezdGc3BURShKNVo1ektgVj15Z1FaMHxEUiN5CitrRHlCY0Y5YEJPNFlTaVhxMn50NFZeS2dEM29FeFY4MC0/UUZ6blVSPDBvcnRaYWt7WSkpSkgzazhUJnQlMS0qV3EjM0dYLUdFK1lyKUV6CitMeGUtdEYkTHltQTVLVjN3ME5PXmo7IUh6Tz4hfjA0eT9wJDVhR2IjVyRPZ18pQmAzViYzcyg1cksmNEsmWlVxYG5lfFopb2JaTSUrI009Cit8eVhVT3tNbjwpOT0/QylPMl4qWXlBR1gzVkJJeWAwWXtMIWdvZWpBKFNuQHtNLV5sRWcqZXs9Vm1lJFI7V018b0Zqa1Y3QzxlN0khSGk4CitQN1FLU3tjcU8rWUFNWnNqVlJ2T0NVK15EKjxxSHk8Rj1BV0NiaUdRTGo4fTN3bT94Y1hSQGN7JT1fYEIwfUUkODhHISp2VVVhcHxJS09SCitIM0V2Z2BAX0wrTzxaX1A0Kmh7V3MlbjF2YSZwYmFOLVBLX19Be2pxK0hkc3QkXk1DS3FKPWt7ZlFWbzx4RWY4K2xoMD8lOE8xTUx2eGJgCitTM2t0QDd9QlReeCZ3QitgUmA7eDU1QEpyMD4yRU4wSkFFZnQzRTs4K2Vzdk1GOVo+YCpPYGJqdyE7aCUqSz1uSH1BcDRzPFVgSU5RbSgpCitqaFMmRC0kPEUrRSM1KnZnKytBWnFIQzlmWSooUzZBPkQ3UU82djUlQEJqVChURzJuKmxtOWNNMk5KcWE5ZT5JKW1uKT5sQnZ1cGVHPmxSCitGe3F5TiFsRHBDcUowc3E+Ozs2WlZtQmMoZ14qdEBoTzZrYGlWaiE2d2NwYW5QQy1uMlFqKUxqfCpWMTVZUWwzR21oLVBnS1Iob0hyVjxDCitGVGdlWkhANDFELWlDaXJOWE0zJWlGP0AoNjdIY1FkRWVwRXM8cF52QiU4cD1uQkBUTjA+VUBCOzVFc3o3NmsmMktGPUs0OTdjb2xZU2k1CitpYDQmbWkwblNAZTVmd3Vra1BkQn1zaWdQVEE9QGQ0RWIoIU8yIUp8N1FoP2l2dTVfUTU2YFllKG19LTNqfTQjZ28hO2J9RT9UeCF9PjwqCit9MEkyfEYmJDFIRSl1ekplJj1ANEp1PmNHYHRlMXhkJUAwdkoxV1lvSCZZZGNoeWhTXyE9V3p0XlFVY1QoRHRhO1ZBfCZkcWZAJm4mVUtoCis0MEElMGh6OUhnKD5mZ0UldnpMa0F4bUdWa05ga3lVPHRKZWFFKXhHRXNCV3xePG9CNj5+aUwtZlQqcSElRm4xYEtfJDk9MTIlaTdySjRvCisxNkVLaFo0OFooKGJjdGt3JmVNYWtQfTNZMDF0JDF3X3lWflh2YGcyM3hRSCRYc0R7NU1fKyFmYyR3b3hBISpRdk1eO3BCPEhiZlpWO2JnCitpYVVSSTdqKDdAbHhZcV5MPF5zZDZvOSllMDlNSjRPOyFjJlJFPUpVXkB3MEpQP2tKJiNFJkokZU01KC08VEpqbDhlT3lZNVVoWT48QTB8Cis1bjQ1ZWtaaUJUZlpjYTYzZkd2PWEwS1lhQ1ZzYTdORVlHc0pKcGlKY0JMQnFzIVNqVj4/bE45PS00OUdpY3o9bDJWTF57ZD9aX0JmQXpICit2bGdBaGhoS3hsZ1Yme3ImKE9gMVFKdyE9PigmTm43NlFSXiVnS1gjTyhtIWBfNDlfMTM9Um1vQTd7OyEmNnt1SXJ0a0ZRSUs2O3gqb0VECitHPT4xKDA0fUxNXkhRfG8oMjtPSndHNlVZKVV2Y31mPD1PMjVnWiRpOXk4eW9wdnZRZU9MYEFteF5FMT1uVU54e2k2T1RLN15UKzBQQWZQCitDWV96bllmcmtVMHhSKytRa21SJXxCNEkob0xlLXVAeXtIQVBuayM/NGo+LT5JOXlwezBhUEgxblA8QD1zTGJKb1k+RENhYHVETX1hNDcxCitFSkVxMD5ldnkkel5ocnxGcHBTKHNGPUVDSW9nRjx6WF41PThleCV2P1BIV3BBcXskfmMxcFJwIVJyI3FGKDdqRzsrOSNGPkdBSTJmQl5xCisqMVhVbWdiSmNzKnF8aUA8Xj1IalJXWFQwc2hFTWpVNXdsJDkzU2xlan5tc2thb0FWV3pWYmlUdyNhKnlIX3pKKWh5fkxrOSRFZXB1YjBaCis/e3twQTJQQVI+VVhuOXhKUFBfJDtKSmUyQVB+bnFmYn5jMFchbzdTMXxhZ2pWRHxaaDw7NGZBRm9sQDFGKUZNclYqOW9SelBZeyEtIUg3CisyX2FjYE07cXltTH53RF90WlVJZ1EzOVlnbEhtcCRodzB8al8oIyl6PWZpOWVjbUJ2O3pkSDsjQHd5cGtvUXoqKXlWJmhmbUZfMk5DKTlvCit+Vjl4LV54cV8pbHhtNE56Z0VNOHBvNUNOSFBKN2dMeEBDeHwrQEBvaVA9aH53JlUhPUA9TVlJTigoJHh7NEt4ZUB4d1BNbWVLMkN0KXU8Cit+XilGV1d4UGd4TmVLZFFEeGZ0MT5WKGomX0wybH0rUXIlZE8hdS1CJHI8QUNoMkIyKT9jPjJLN30/RmhhZE5XVmBJQGwmYGhBNURqM0RCCitzSnxWdHYzXnVpV1V6M3Y8T1RHfiRwOHtpMUpQTUx+YCQzaXR+PFAqS2VHeTU/QztyU0JiQ01oWSRKVmt2NTxqKzMkbXF8XykjPzVBQWMhCityeER5dH5Rbk5UODd6VmooPCE+SC0xOGlON29ERU1+JiQ+byQjIyphODxiaWhvTFJWe0Q2fEx6JEshajZhNjFmM0soWiRTcTxIenpXKDByCitBPnczN1F3cS1KbDdeJEp0JUcqYmp2PjJSc0lOMygtWWhZdHBnYiZiM2hlTCpfejd4KkZ4R2Z4OTlqdTwzfWJheVYoKzMxckdZQ0I3QiYpCitrM0UmbVJqWFRXRjJ+MFA1TlR9I3pmd1h+OVgqJm1kXyh+WWM4QXZOfkFsMExkTFBVPDU7Syo2UUtqWTk0WjNRdiQhJjk2RmZaYzU9Q2I8Cis2Tl5IMW1wb3JLOH5XUTNaZENGQ2M1cikyMTQ4WHktZWpNVF5rcGFBanU/Jj96elJnMEdSUHVjWX5gXzIhTkV5S087Q0U/eDJROD9VO0peCis+JjQpUlAxJiNMSHdEREs0YU5DV155T0kpV2J4Qn1rT2w7NUdXbjcjdDJ6e1NIblBaazk4THlAeFFYNU00SkF0YTJgRVh9NypCeT5oM1omCitTMVE7UiYwUSghdWBIKyhLaWMyYCpiKVBLT3FyfDVTKTFwQnIjSU15Z1deMlQ5eVpuRFM3SU9CI1RtI0prPGJCU3FIX0FqXip0ay1fbV5mCitae2dnKnIyQnw+OD5JT1BfWVVaZl87KX4pNTQxPTxKUnRpajdyVGw1LUA/YmtqfFkkQldiKn03NWY2QklOUiRzMU4mUCR8ezM9SSNlQ01aCis3YHYoJEd7fXE2RyZCNCl0QD9eUFdxVUNjdWJtTE10e2krLVZgcllxQGNrKVlwK2FjfTxIU0xsUF8qZD9qazFMfUk7ZTl+ejZHZE1eY3M7CisjaDlgdzd1TFhhWEhxeXQzdXw0U2lTYGphPG57T3BlRlhTIT5qSEN5Yj88S0QqUyQjP31GO1JxJnFvPT1CRTZDNGk/YmBxKHs7dDUpdFEyCishSl43M0xldypUJWlpUVlyV3h3PkhAZD5IPFROZXFJO0RmNERwVF9qR1RgMGxiQSpvUXxmS2syY2hCUG5pTCtwQ3t+ZEFjO00/K0Z8U3NPCisoVUNwbWY9VXJAUFNlcGpBQUltO2RBOGlMWFF9cnNCM3FzakxDUlMmanVBZj4mSVJ2PktkX1k0elBufiErTXJ3Vkg9WUZIaiFuMjBaPlo9CisxUVktTzAwO297bEA+PXI1RShaZzB7e1M3M0lHNWswMDAxUlg+YyFKYzRjbTRaKm5oZVopMG1fWD40VUxZLXcoNVk7UiswV0AmNj9FXnY5CiszUj9CWU5GYzdAIUQ7NnEoTlR7bk9JUj56YzdIRUl+Y15uI2BNfWY5aEhXNW02TlVEeml6RHJWKXQoVHFmVnV8SnNYSj08Zzx3X1Fpcmc+CisjNWc9cUBCKmgqITlFd3ZQdCFQTEo4S3xPREhmejdrakw2Rjw8cT18fGk8bSZZbyg+TWVCYmpQXkJZejl4Iyp3Xn47YWNeSnppV2g+RG02CistKzU5WTJMYW1oRjkxOTBWKUR3MXgqPnpCKmlqWk1UWVZVMnF0TmJfVXBMZ3x5VTJWMzUtfnM1Q0Z2ej5GO1QzYnNtYVFKRm8rOTBafDdICisqcGZVX3tDeFkhVUR7QCtneGZ7cGFyXiZLZSVvTldARmk3SG9zJG4yc1pydU1qN1RyQH56P3VCYUlAVElaYTd+YEk5VzBaMHM7PGY3e1c4CitzRnlBenNZP0Q8Vk9wfCtsbiFeeEZpdXVOWUstREcwTis9KkhFe3BAVFBkbCFLI0ZtVk0tX15+LTJHYkJSeiUkKFQ8OCFrcHVicmg5TjJsCislQnQhR1dISSZrVCU+cjFOd2V3UFdvY2pJMXUqXzBCUzN8aH1qfXFZZFM+eSM9YnJXa0x6cVlndmpDVUpyaFpqfDBIfFB0Xj9IejhOSkEoCit+Vm5lJkhMZ3F4KFplb3otejg9V3ttNGE/KFp0WWNFXmo9ME8kN3dQJVdOUmQxPj5vTCFaJU15SDw1YGFneFVuMT1BQCpoR2J0RUlxaSF1Cis4NkowWSsoZ1glZCt6WVF4TmNWb2NNaVRRIUtLOFpfWl54RWI9Ujw9WT8/blhoQHRnamExVkRyIU1ITyU9UFpiPEc/SWteaFVBM01hN0VRCithVCYxV2lxLSNBKVFtQDs0aD47bzEqdGpNQVhoWS1aRkIlK1pTeytAezlwJXptZj9YKk5xZGZnUVR5QFFHZGpmRi1PfUVkX0dYNlpScSt5CitqbCVpP2M4blcpME5NbDVwRX1gNXNObzJgVzt5ay1JfjZffD9sUnNvdnpibkh4X1pzPDMzaElVRDc/X05GdzlTYV95NmJsb25gMlh0cCh5CitYSSYmYT56ck0xay1Cb2hrWXhCfGtgcHZCP3kxRm9Qe3EwKWhXSFohXyZ8V0REMT00Tms0MGQjaCpiWE05RT04X1dGSCNoYi0zUlMwLTYoCis0VlRVRXpZTFEldCR6d0pLPnpIQEUjKEJ1PV9gN2VRSEo1aGZrRUo8SnN5NCp2NzZGWXlUcD9ZaE1qXkl8YmdDYWZJeXQ8PSNqcEMlTmE3CitmZj82SHJtVjFsQmxYKlRfakJyLUlITD9DI199Oz0zZnp5KmVmJWVtUnxWP35gTyY8TnJgZzB8WFFSMDAwTzheT1k3eS1udWpyYTAzN1U4CitWbXBjQj4oXmJhQXxOYVV2XzB+V04mZ1dZO1IrMFdAJjY/Rkt1Z05YPngzRFZ7Mnc8WS1LS1JkOEpuMFl1aGpvZSRRV1ZJRTMwUGM8cE47Citmby0lZlNocXBARmNgeHF2QWslcHJCc3NGPUQqKmFXR2l1T3ItYlB4bDVfWG4/QHViVXN2eWdYK1Naejk4SGo0OXY8MD5AcztuKX57Q04oCishXyQhUTFheCFUb3RmK1hxU0VrKldlYntvWHJKNzYlR0xXe29AZldxO2VxQEh2ZnArJnlsc3VvcVM3cXRnWSM7Vj9ARGZqR00lOHZjZiRzCitXSFlSPlkjKkdlWG5iOypvQGhpeHZqMTRpNm5FNGcqclE1NFleRERYZDY/T319d1I+PEdMRmduZkdSX1QzO0xRWGo2MSpTenZWWTRoWXllCisjSWhWfEZ0S3lDSzZvVXAobT1xcDtxOyNhQVU7SkJfV2RVb013V2xIdFhQZV4qOVRvVj5ZOEUpaFFSO2h2UWsta3tZc2AxRVdQQSVGd082CitiQE11bVh0dTRQTDJTK211JEB1Z2hNVUdiSXJaOVdFSEFOdEIkYVFPflorPlFtPkZYU3F4SHtsc3JvUkM/VERQRE1nPFZVYSNpa0UxSD5mCitXQGFYVzhGLVk5R0x+I3kwTWMwdzxvXitOQjJUYjg9fWFCUCozVUpqdV8/dCE/PSt0PUlxZVNmRk8+ejcxMTl0RVVGcFY4ZSt+Iy08ezVvCishQWwoMSlwfjlrZzZMfF5PeDFHMkg8aCRWM1dDVzFGeTI+dzFQJm43PSZBfi0lKyhEcz15fmZ1ZUh9RD5BdTlKaE1ta2wpPGpiMnlUPml1CitvNlBTeyUmJkNwMy1DRWRWWSpMLUs7K3ZBPHFPN31zSyM/VUx8d0c8X0Jsbk5DbUtXfjJaPFMrKilubVgybCNscThIZFV5QlpeVyMkPW1ECithUStGKm9vJFBZMHpDeDFBQ0dEdlVNcD1APSEkQEl4a3VfT0tzRDx1JTdeSyN1dXd1NCRTYyFeVVlsVyEkU0hzOXZBLUpZdkd8PENgRmtuCit2SDgxcUhuOSh4ciMwdil5UHdBZnBnQHo8M2U+bTthSGh1UkklVVlyKXZ0Mk5iSG5LbDckVTNqI3RVQ0BqQjcrbmQjaHZHNGh9ej5yVC14Cis1QTRtKlQqWGJ2YDdXal5ebzdSYnAyODxwbSR8Jk17c1FKOVR2ckZXPHZgJmxqbV5sNjhnOWx6U05JbzE5Mk1ARGRaOXR9bSUtVnxBTXtiCit9eGFeSkM5SE4oMWwlKHJZblBWbW17YGsyR0pnPDMpJlU+Q2U4YyVGfDhYU2klT3k8aUlwVWtoMUV4ZEBAbnYhQ3U9VExvayp9enskN3J+CityPWIreldvPH5nPilLX2dIezkzeiZ8VUBjMV93fCFnM0dQKVkjOypoZ0xMUWI7Z2xSRnNKQVdwX0FobEpjUDB1YFREZk17JiFgWiR9JUJiCit6Sml4dmZKUkRFV0VFeVZhbChYcjU3fFNFOXkxKGd2QChyVWQ2NlJNN1orcUImZmNlXjUmVTFRWS1PMDA7b3tsQD4+JiVeKHMrMm1rPDA3Cit5dGt4MDAwMVJYPmMhSmM0Y200WipuaGVaKTBtX1g+NFVMYUF7PDBaKTBtX1g+NFVLYUN4T3o/ezRGYDUmdiVWQXFXU0gqZ1okZHJxfCt7CitIYkp2IyhndyZTaV5UMCsoSDFmLVE4QlRTPXAoNShGOFgyTHA8bWt2PXhnKipfRE1RM0I9eUlabFU9TTNBVHFAbiZpdiotX3Q/U0Q0X0ttCis3U3c1YnklNFBATzttVG1KJENmaDlScWBRfHhybW5RITUlREtzTzRKQSRBeEE4YCE3Ml9Je05PQCRBN2BVVSRifGpXTEw1KiNoVSRnRjNOCis5fllyOWI4QDhDNn4pa3ZsaHVnLXxjYlJpOWN6ZjIza2pMUGhhWWpNS1hzJHZDU2dEbEpTZ2NUckIyTEV9UDl4QmFKWHs/cz4kX2kkWWU1CitMZFVVeyNmPSg2OW9sTEtsWHFqREViUSk3Z1hQJjhgJHw8V3xEa2paOCNvI0RxTndaRSllM0RHaSkqNGpkUmFZKzIyN1glLUA3Xll0c3RCCitBfmxmM3wyS1M/VjU/X3I1NDVqRE0mMWZXaUNZO3U/SGNENTh9dmZ0fWlaY0ExPFQhNF82MXJFSk13Tjx1VyhYVUAjbUcqXkxMQiZCY08wCitObVYmVXE3YkQ4ekU2Xn5LYjcqQ3l9JGxGRiQ2alc1MEROOW5OfGdoPEUqbGs3SUJQKE4/WFJ+TSYkcnA/MHlkaGVxRVhIWDRkdHEoN0lJCitOaG4wbyFZQEAoIWdjODJ2aH5SbXkxeTkkd0FrcW5tZWcmJUZgPm5FSjhENzdxSnJrMCZfMkErWmohPX55NCtjTFFCc24oKkg2dT5JczZLCiswYTYwfmRwWVFxOSUrclMwak0yYWNranl+K2JtJDxEfHk1UEI2RDAkSj9uY0x1RHZuOThTbk0zeFI9PVYqezhUXypaaTxRWEJLK3dRU0U9Cit4aEtDIVh5amUxfWlPMDlofSFPMjlEfnVvd1pLYXEhY3laV2tRdmw+QWdsNGYwcW93QWJQNj85QXpLK1FEWXVzNndEWGB7T1UhTXhLSCVzCittUT10S3UjT1NCT34lYCFjZ3JBOUZKeGQ+RkV7RShhaEdGPT00XlYhNFVYUmVxYlIlNz8hR1hBNiUoZ0lAaj9gbXw2LT0hN19uUlhGT2w9Cit3TCFtNk0yaSFoZ2pTP1Q0eTBUXk0panVQM1FAMWpUfld0MVJWcD53NyUpKkwhbVd7Q0E/Z1VGazVULUZWaCgzKWtRZk1MPmo/MW9fXiRfCitWfDZjRT48KkpsRlJVLUN1XzA5JXApRj1rTGgpV0FaXnlvaGI+KyVkYjd7OzF5SjhqZzc4bmorYCo4PHxhdFhhb01pIVZza2xDfXstbm1ECitKUj8yfT9EakFiJXc0dUBiI0R5PD5GQC08dENKb1dBdm9AcnwlZWgkUVNvTTNYSlR1cjtnR2h9ZUghSnxpPTBKX2BYdVNkKWEoZ1peNmI1CiskVjtlVn1gX0xpRHZ7eCtmVjdvNlYtVzYwPSQwdk8kNHlUeVVFIzFiSip0VVJLMiVpaW9pYSEmc0liSmZndTFUOWNaTWVhMlkhNVE7fSgoCitRQyUrKVZvI2ZORyZ7aztfdn5uQlV9LWZiR0xDYiFRZ1dOaklDMj1oWHA1QylISWd7Y0pVR20xczF1aT0xYC1aczB5JHltNHpCc0MkK0JqCis0VXJRVGYrb0RkWC1KQ0Y2OXsxKTRrR35rQDB4PXMoLV94MDM7STU0IVdqK3QzZzxJK2JrZ3o0biZtZ09TZEdOMTF0TnApKEl2OGEtQ2R4Cit+VDAtNSQ7SXloUUcmYHEwQ3RfKlktTlBqejMme3t4d3BvSGd1cFV2Sk16NWZrPTxAUSU+eGIjflpoWkVkUCkqUnYqent5bnJ6NklgPVdECitRJSQlUi0jSikyNyNfNDBUSE12cG9gOEw7YVlXck5pZ0B8ekYyVGYwdmY0Z0N1PVVEODdRR3BtQSs0UFJ1bntTMUFRMStkP2tBJCMrTTxVCis3cFJlZ3FWeSZyel9gTlI1VlhzNXxDdmstMyFjPD9fOE1Bc0xQPUtZQXJaNCZOU097MmZKYXc+ajxCdWAhPE8zUChmZGIhYWtqTUIjQVhDCisxKmNwbW9WRnZINVg4X2B8N35HYF96fjJAVk9VLWRmSDVSQWUtSkc+bjZVZ2gmfkRTN0t1fnwyakBjTlRUTlh7JlVVV0M/VkdpcmktQU02Cis/eXJObEFZdHQoZVRhNkx3K3JZbHs7cHtje0J6JlVMeDFkMmA8Zk1FJDVFUHFqajRqZTJgfX59Yjh2KFlCdWskSy17RHVQSGxFaksrWSF7Cisyd3ZIaiFPbkBPX2s2eGpJWHEqbGdQLSsxT3l4NT87dTIjRig+byNRbWVAcSpqYXBvUjIqT0ZfSUQ0ak5+Z0J3cGFNakVGd1ArQEBqX0pLCitCNmgwcnFUR1F5U2BoTFI0JG5vR0A/VTJuOCoyYF8jOU1yOX1mZnxKOD1nSEEzUl5sJkY8UGR0fC0+bSYjQG5fKFdBJjAyQj9JQnt8fnI4CitNSjRxO35EfUt3PHlBNmxEanUzRVM2eGpQY2QtYGlgbilpeUI1cXgxcDBnX01yRGNOUE5YV098Smc8ej5jRnxmQ0RFfjY1KzJOc3U4Y2xDCiskMH41UmtvUzVVUj91QmtgQCo4bipmWGYkSm1fZ1dEMDE+T2hRe0klTVNWWiFeUVJXZmhaRyZoRHQ+dVZKd3xNSW0mYWphI0pZYHQ3MWpOCitXd1BMIUNzeWNhbW8pRlNkZXBxfHZtfjBXckgpeHBQbGxCcXJvazJOJFp+TXhjYGlDa0t5Q1U2OG89b1pMaWAmaEJOMHY5bElKNUlWVGN4CitCMUZMejU5LTFSKUI5fWFZU3F6ZFchVGtAUkE9Vn4lNEZTckUwMSVNTUpqfT59LW02T3YkSjExelZQSUNySE04QU0qUTVsfFk0OUJDayNUCis3PmpffWZHKj1oJjN4LXtwQnZhfTxsWGZ9SFBgWkxjZnZFZ0RKSCoweHBsO3B+WSgzdHhtZk51a3I3SjdUWjlhLVRBKypAbj1TfmRzK1dYCitKJlIrbEVnY3t8eXdNS0tgZV5iSiE/VEg1V2BMQnFKdEhBMHpIYWEmbyQyWDx1fm9nZiN8aW9hT3d7MEh6fXRVKyZfSWBeKW53YHpOQ3htCitwQCtJZyFkb3I/ezA3WUdIJlAhaHl4JXlRb3M4NCtkJkp+STd7NnUtamZjUjExQWxXYWh1d2FXQCgyd2dPcyt2K1ZfX0Y+ZkVxNV97eDs8Cis3M3FMb0RQOGpyJm0xcXNDWVk9ZnQ8YSEmcTNPQHspOUxYcUMkOz5DdkAxZDx0d1dlMSt9fmwqVH08bVpiSGVPT2ZtSEhJKEE4e14kVUIzCitKcnE8aiNYb2N0UzRIe3NheztrQm0wVkZWXmo7U0tAekUmSj0jZyM5d3tiaEooZnlNMVQwcHdlUnQkUFV+S3dzZGt0YEwoVndoVmExKW9DCitpJnZhKkklQXYta31Qcn1lJHAwVXY5KCQme1dndUxuTnM3cjY1dStsbDlXbylHKElITT1oSShaRTZjQSNgSVh4R1ZJUXt8M25eN2lpWGNLCitTbGIraXVPTlo1O2RgUCloPkA2YVdBSzJtdGV5N0R3ayZkRy0kbDAwNSpGMDAxVGMwMDN9bGE0JW5XV29+M3xheFpMZVZ7Mnc8WS1LTlZhCitjcFVIV28mT19ZaTRPfFdpRGBlP05+YH4rJV49eD5zSnNtM2A/ITUrUlpLSyp5eHMxOy1YRH1wZVBEfkJmYXF1cm87KEpjfDhCVmtCZkhBCis9Sj9QPDJeaTZrWn5nZWJNPX5vWk58SSUoVEd0WT9qSWVTZXEkWUghMWd8d0A/c3F+OF9RVnR1UlM8WHklfVF2I2ckZT5LY1cob05xcG55CitrM0pCbWlobTl1cHcxblRKNm1xYWk3RFE8bzFTe2h7Wk0/bzBgUXkpMkt8PTBASGIwPVNwQzVNU01gRzdNcDxodkJMX2N1fXdBZVlaQWptCittWWloVFV6Sj0wKzMtWjJoUVY9IzhrIShYOGs2KntJR2pPY2V1VHFfN2lET05xQ1ZQS14rQ3x4V3UhaDJESG48YCsxQWhDKytFUT1LSVJZCitFcFl1TT91ekNJfjFOcEphXztZWnUoWVhuTFI0WnkyYFV4M3s7fUE9KTFXZCE8QVBFQnZ+TyZ5d3klQHM0cyNjR2huTE1TM3VnSGlnY0o1CitsYy1CbmVtMiFfJGBjdjNuSyotYGNnd3k7cUglQmRQe044WU8mUVEhX0BCc1ErNlhkR19BQlJMTVMpSmBDdSh1bktZVkJZKCYhWFFKTD4zCis5dGFEUz0zRlI8UDswVk1TRGFPa2srVV5pRXIyKFVXPHI/SFdafFJnQ0dGQnNVcFJgdDg2dWRBcylBZjI9TH1oI0xeQiE5SV9NJjdLWFJpCit4dzNnPHpSNl9QfVhzTyQzclNKP24obXg3d3RQM1FJcmMyeT12KUwqZmg7fTI0X085U3hTM3BseD00JmRXSCRUTTVBJnFfb14+cF5DIzleCiswXz8+IUFfemkkOTNrR1dJY1llbWkyVkJfZENrd0MtYzM0RWR+bkk0cjwoPjY2Y0dkKTt3UT5sYXBoVj5fLXd5Y3UqRHY3Jn1MLVF7K2xpCistUUVyPz5jTlEoWFFGMn4hRGVOa2VFPXdEVXJgVD5TNFk8KkxaY29IdD9EZCs4eERrNkZHWSpGKCUmbGkjKnMxJHp1bXh4SjsjcTtzOSNeCittZTdFXnk2YWV1RipLS2koYUkkQGpiYkA/am14R0k3RjNKYmh8YitZYFhvWkErMFBsKSZOcih4MklBUnpueFU7ZypuaU9UVGNtRSs3VF5XCitrSDwyWmhgUl9uS0MoJnk3ODxMKChxMX5ZMUd5Qm4+YFZIeitSTFRCP2kxeFRvYVdeJkEkTV9AOTF8VEs5TGVPc2h+dFRneShGQiRfbT8jCit3bjIzKThGI0VFX1Z3S3AhKTw4dFhjTWp7ZDswNEl6YyV4JTxOeG1XV3JnQWRrK2NsdWU7VVJjO0RsfFF7V0NqWjx3aEdQcE5MUWUtSEY2CiskSjF1PUlIUmI9RjI8bWs8YDcjKDJ1VmdwITtBTXJ3QW1+Rl5JOTxXSFlOZGchQyM5UHg3Zj4lb216IWJETztQOE0xSlVHc1A/ZHphMzwwCitTYVpJSHsrYkY+Tkh4eEZDUGs4d0JTd1R3JUJjMCo4ZXg1SH5DPllAKUx8NjdaSD80TGp3bWdhMz1UOWZLbFhFY1JFaStYd0BZWkxhYn4rCit0R317PE9UVWFjU3xzUHB3Xj0xZyojMHNTdSllZnRCM0koOTYyKW0zNSUzJCZkRiZgSnJrNER3VHRVc2tXeWdRQ0xaJkduTk8yNEJ5e2lYCis2b3ZreShLQmBDRkI+UFpsJGkzYzZ9WkE8XkhQUTZAPGNVVDhzXkR5OUBQZXxYLSFxVCVAJE03NFpNVGxCQFpmezk+UVZwWT5kSzdXd3dhCitBTnE7UDNJe2lSTHdlVDRAUGwkTT1KSTgqYCRwZ2RvYyg1WXV3a3I7Pmk0NWt3T1Apay07PEw8PnJndlI5PXwxNXlZVHdGREhkVEFVNy1jCitlUkpmbWdpVSUtM3F5OWFuPHBaa35qNS1aNXFTPyZuLWg2dys7UlBuSnxuMDV5ak40OHl5JXg3dnQ9ezFleF9wX25vT0hRSGxgYHk3bGNsCitnMyR8MzZgckBUZFNAcDBuQHZ7WEVYZXp5SClmbnRnWVI+KmVuSD5ZJXFIZDg3RjY+d2t0WFIwQmctK14tRzVOeXB1NXJoVio0XlNCdHdtCitfSC1tbUJXQ0N8ME82NmghZmo+Jm1fIWc3eWw3ZlEmM3lybWV7JTxFcG8zMStZOCNwKlZvVjltaG1yOE85S1FIMDAwMDgwUH5kPU1ee3J0CitZJi0pMTA1dTgjMDREJGQwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lOQWlaRVJfN1lpd18wWWk0T3xXaURgZW9tTnxLKD1aZiUmI3lSCitTK0xua0NIWGJKeDFRSDBPalVqQ2s0fWM7a0p6MUB+YWM0VnBgUzx3UHhpbT87WUZMJShJT3A9Nj9fOFdoJHUqPkRRSkczJW5nVTtNcSV5CishVkVrJEs4XzBLYGpvRXlIemJ9d31oNnJgVENURzYlNFNEJT4xOFBNKHY7e3EybV8lMDFTSHJ0ejs5PXljOEg3NkBHM3QrZkQzV2FQQGQjCit5TUthPjJCUXlMdjVueHBKbmg8PDQ3dDxAQ2NhcSFWQ3lqI2s9OFV7RnsmczVDRGhLenJAelU3VDNTel5OPi11KSpfXm4+Mzl5aWVkJkVXCit8bEtCTzlGdDRgTXMpYUd7KW5jZjB0JEpqbiliMVlKKH5vMGdEckZHZkkqcT91MSprJCtIZVNVLTdQJmpvPTNDRkp0LVlScmlBUWxkOXk4Cis2e2FPeUJnfTExNjAoOyNqYzY8b3xHTkNzMmhRQHhpWXNoajkxUVdSKythfSZRQTFVaE5ZcFlfTG1eZW1Yd25OQ1JxdnxXV3RHYmJqdjBqCis4RVIyJn1OUjgxPnIxK0hNIz15N1ImcV8lKEdObDtUeEttaEJTaCM9NmJaKiUqMiZYIVAoK014VmdDPEJ6UkotRkVOQDsraTIzOVYqYXwoCit+bEd8IXl7RUVnJUFINzRCcW9kfGV3KWJlfHt4RWo9WlhZekZpRTllQmFPUjhZMSFsQlpNSiolREZDVWkjVyRmViNvUCpSOCNaanlue0FVCitvfXs3MU1VY0cpP1lBU2pKT29xPDlHMT1qISV1bCZjPSRIUXtqWnhHY2RaRCo/RCtiJXdDVF5TPWxTUyFEdj4yLW9OekNOP2FjNGd5Y3ZJCit3Y3w3JFdjNz8pJSl9MUtzQF9FZkM1UzJobXR2Mz98VV5CK1RtQURVWkshPCRrbllgcVN7aEQrNkByME51WVoqa0pMdn5QUFJ0Y3FTeX4kCitXTksxVWxMKSlrWChueklIWEdQN1pmSEV4eGJ5PWRlQWQpLWcrNnxvMihKSExzT31PPkxufVYwY3NMWDdAJk9MNmpWTF9UTF5BVi07QWB5CitWXz5MbFVpUEhqYzZFejhXZHdGcHYoLWFDXkIkdU9KKzhmfXdnTElXczV4WFkoaVJUTDhLfXVLZTR7fTs9Tzt2Wn1VWkZzSHtrU2dRWCg1CitZfiExKkBRc2JeezJXMWltYjkmZjI3I2c1aX1HQCUlbmYyTkImNUJ+RkBeJnB6PmhSbzdQY0NzNFFjKSojUldMNFBAdllvTmphbkpgaVYhCitATnVVN3VWWnY5bFk9fENuK2V8R1Ffdk4+aTJZNmBqdX5IKEhNKnZ1WX5gV2x2KEMkOGJkemhFSDRANFFGVFcpKT1KWkZyV1ZiUCloPkA2CithV0FLMm10ZXk3RHRGfG8hVW5OMDAxIXIwMDFIWTAwM31sYTQlbldXb34zfGF4WlhVVnsyaCZYPk1tUFV0ZUtqWipfRUVVb0xRWWVOQHxTCisoP0FlP19nOVF1UlJZTzRaN0RBeEJ0bHcqTVV8akJySyU5Skh1bChBdkVFKHc2NCFzdnRTXnVWM0JTYSViTFB4QnYqVm4+TzZsSjRYN0F3CitZO19AMTlsd19pVS0xKWs4KE9HbGBjZjNTdHU+dm5FR35vNktPVSs5OW5LQjd7THUwdjthRnQlYml2V25IUlEmUUNHNCNxcSVYKk4/Znd4CitFJCsoT0wtMHpRfGg5ZEhTeVlQSH1AbUl4aHBgPVFONWtgbCQhTTRAKCQ1dDxRUlEmYj0wZlFeRnAmZ3Iqe01ifnZIOC0lOUhHeiYzOz9CCitYdDQtTENXN1MwcnxUS1MrVnJnMjcqJjg/dzNVZm9hbEd2Sz1XRHRPSTMkSDNsaT9STTZUUD96bjZjdSZRPClHZXw1SXg2YmdMY1BFM0ltCis2NnxMMEY4PUNoP2hCSmM/PSh5ZDZwLXtAdEFFdFp5dlZyeFYqbiN1RDk4MzR4NCplWlBxdjBIcnVRemBVSzFNNk1WX21Id2hxKGlRMz9eCitIYkZtJDxZOXpaZz9aKE9DangzVTNiR25ZVWh8VEMkO1B0PXAtfjRrbEkoeSsoe2RYdyh2ck4yU09qbW1We1NQNCQ1YX5DTXp2NUJ3UmhmCitOUUgxYD1JQUEtZzFvPHErSTNlbz85JXZLTGhEJTJVdko5a0FSMXsxSXMoY1VNQmNMWlAzZGZ4d3ZOI0VXXj0tPmNLWm9BJWBTbWNhKyNFCis5Ul9SNTU0PUUwVjZGe2hgP3BUbHpBYEp2IVAmQHJfb0J7QSpIUHU5Png7XjtfMCRnR3E+QFF3PypmMyg5O3p4TEV2IWRRYmdsbmcyWkpTCis/SzZPPkYzPHs0Uyp4VSs3LTUjWmlPayRWbik8ZTNRTiZQRz57bUBaXzVlOVZUeGZSfUh4amNGM2glNGFJLSMyRT4wcCoxJlolaV96bEEtCitAJjwhO1QtPFRpR0JsNk85S1FIMDAwMDgwUH5kPU1fQVM4dylfREEwRXo8dTAzaVNYMEJ+dD1GSkU/TFplKHdBRkt9VUZZaGg8O1pmN3JGCitVdWtZPmJZRVhDYUN2MnRPPmRoKDVRZ3ZraVY/bWY2MilvTVE9PVlTK2ZgOGBFQ3JgZ1I4P3EhMGduV2BiVSNlfD8+biZBYnlQMHdKM0lUCisjSkZ+bGh3ZHpscm51Q1M9eU57bj5xb2ltbiRnSGJ0OCFVbmFKV2AzJFU8RlFBc0tGaShSPXBfc0h9NkY3NlNXfkY7WGJ+RG49djdyeDVDCis+OENZK1JtUE1rbjAzKGc9VCRVc2RrMD18e2xUT2JMZz5pVSsxRUQ7OD5ocEVnQWk1Yy1hQlVFN3BYQTkyblM9SEJoQWlVdiZ3ZipQaWF1Cit8a0tPaCNqK25gUF5oJTw/Zj1aX3tsMWZ6M3xvJiQyfmhLO3Ngcm4lZ1crQWJSI3ZpaD49c1ZnUks8RyNZdSZzP3FEOSQmemQkRnNpbkwoCis4IWRFak1ZPilgKSpLWVhXWnt+MCpee2Eydi0+LVNxTldPUyZ+Sn1jdURyKGNoN3J4U3ZAX2kodFdiY1ZEfCo7VUFqczMkdTRFfTRPWnpaCit7N0JNRzFqdTlKR1dnYygoTGJBe2FmRGNuXlU0dDQ4S3sqdldPXipBcmpxLVRqU34kKnFtSE8wdyp4KXVqPzgkR2hWNH5NWHtqU0M+PWdPCiswc1dfOyQ+TEFaK1hQdzQ4QUx9Yl5LQD4peystTDR9I0h9QWAjNzU5LWw5bXQxYSlidCs1YStvbGwoWVdgSHYjYStWUF85WT1YdTJJXjg4CitNeyM3PERfbS1FZWZWTy1ZPGVlJU1SWk84YkdiRERobz0tK0ZlMmUoMU1XbStifDd4Kj5oZ19tPC1HPlF3KyVMKEZfN21TeEB3XyRZViVxCitJUXojaW9+NntxVFhgIUN6MkkwfFhRUjAwME84Xk9ZN3lYR2d1OHVtUyk4PHBjbCNBT0hYV2FBfE5hVXZfMH5XTiZnV2FBOUw+VlB8UD5YCitEP3I0Wio2ZDRiU2BqdGJ5Vk1Qbj1sWjU9ZFU7PTReMWFWeF54ZHlyYW9rOHI9ZUJKUk1KKHxHJDk4TFYkSW1wSGxiK1J8R3UtS1FMLU8/Ciswc0I2R191YnRHVl8yJVgpNGJlU218ZVZpMylmMEFrd2FwZXFPaWRAN3tle2tQI1Zta2t2VkZ4SkFfNWVHSXxWPTVXYj18VHVHUWs3Y2c7Cit2KEdWSil6YkElSEhCaGsqcV9XVCRCbm9iei1+c2BrR3BzRmUzN00qRCFJe2h1VDVma2YlfEg/biNwNkpzd3c0aV41eCVCZmFmfTFqMypLCisyPCYhXk0yWjZvR3xNb08xYyhTeXdOSGVUTVdsQUc1ZyoyQ3xtS3gwN1RRXlBmdHgkU199cSRPaXBRWWNzcE4mX28zUXBfcit3Yms1bVMlCit6UiNWT3lxPVNhTlF4PUcoQGVIMG5oZSlxNHp9Unh0XnFNRk1kJGYpOSUlUEQweyVoJlB8c19aeFV2K30kbCFvQUBTeV4mS3FOdEx1MFp1CitVRUFEMiNlSnRlMiFQd0F0MUdoKCVeSGdvcWlJQFQ/O1hIe1lucnwxUWU8bFdOT1RLITg1OCRtSktUck8wYEVWc1RgPExTS1BRazhqX2IyCitpe0tUdiU9KGtSaWkoMGxzfHdQelhsJGJ+TzxqSmFFd0hVb2c2ZDVCZU1xSjZ4dVhyQyk/OFk7QVR2aUExajd4fW5JSChoSmtIP0N5K2B9CityUGJycyRgZ1pYaHVDOEU0O21pTXJGOVZXVzI9KVd0JkI8cF5qSk9NK0VBcyRveHpAYHZ3T3goSWt5c3JEQz1DOEh4QEJZJmUteDZjOTFICitLcnZfaWA9IUhrKT53LTg9PSs8OHdpOGpidk9zZ1lUN3E5KnxsQEJQZithNmRZXkZAfXglOTB2T3RjYT5ZYFkjSjtMJCM7TTVgJWFXSklHCishVk9laitQWVI0KEUzcm1ESnU+eVg0eFR1Q3g4P29sfHR7K0xUK25ZNyZWNS1xY29uaTZHe25wPWFTdVhkbndYPDIzKUNqT00pdnpfKjI9CishSUxaWWlUTzZQMTh2eE9iQyl5XnJMV0plKEwqMXR+aTNicklCblRKPntmRkFBckc4KylYS1pwKzRqZjttbzJsNlZxTWxQdEhQXm9RTHI5CisqTG08OFApaD5ANmFXQUsybXRleTdEdWo8SWtpOyswMDBwTzAwMU5hMDAzfWxhNCVuV1dvfjN8YXhaWFVWezJoJlg+TW1QVXZxU0Ziel5qCitPYSVGUWFhQ3pOUk8+ZGgoNVdWdiZNKXQqKTJ1YEQoNjdAaUJNQDVhV1dTbUFocCM9dW0zaCRFTCNsLSk8dilGRkBwJWtUdTk/QXVsbmZMCitiMStxWGxRJTZoQUtRNXZ8cHtgNDdVUW1gdDYkVFdGd29TYCM+MmNEd1BtX1p7bFJBNVIzemgpYERfN3hYP3B3ZTZseGJkIUdXRSUkaShxCitNYz8zfHJhMm5yJVR5MUMyKGE7MkxzWEE+ZUNAd0UtPzVtRnYzVk9yIWBjSClYZllwMlE9SD1SSmk/NDVNeUZ7V1khZjwzMzxKIUtFP3Y/CitQU3VudDthZntvPmF4OCtCTkNQTG9sNigoZm8/VWNJfVUlTGFqbUpPVCFoN25RVmQ4cSRPbnVEWGRydlFVTk96UXE0JUt3Tj4xM1FNak9HCitaZCNfMFNUZTRTO3o/c3BqNTtXemQ1O14mRGtmbXlNLVc1PGAwN1ZOPFB5aEl1PT0pbVQpfnNTVD45WkVtYEFXISFnTFlOZj5wMnhYPnx7CitOX3pkNUphT01KJU98JVdaKjI/TjlrPSRCe25lezZ8SlEwd35vZ2lJZiU1JEY1VCV1QExmbCRafERuYTh3amNVIWNKeEVSUkdHZUx0bmoyCis9aUtObXhKUE9qdHs7eTc8aXFjRCFgeyEkcldpSXhAMzhTbUNFamxTV1EpYGVQZVZGKH5uT1hAZ0lTfjFjZGhAMTs8d2otSlIjTUYjJDlTCis3KmlGZWlHMndUazFCI3d3PSo+PnFgK0RTM0UrNHZyeHUpOClHbVRPMyleVTQ0OEV0anIkZmcwJHtscVZITHlAZFNiJmhUdXlkZ3pPVTkqCit4TkFiSXcpJD8/IXxIRVJ+KDsrN1FHN1cjcnFJdChkKXhYSDc3Rl95Jn0jTDAqaU9nRDh6emR4NTJ+ZEk/bXc+elB6UG57NXdHQntlS2FwCit0QUN4T2IzZ2luYmRMQlJhJiZQeWBoIz08YEJSZUs1X0Z5c080M0RhIz9DS0xPOUtRSDAwMDA4MFB+ZD1NfnM0K3dHfGx2MEl6S1QwMyFlCitaMEJ+dD1GSkU/TFplKHdBRkt9VUZZaGg8O1pmN3JaYUFqakBXQCUrfGIxcmFzP0xCTEErZVZWI14oJGEldDR1MDFCS3p7P2JmejR8YXJSCitWfmxUKCZBdH1SKjc0IzUkTDJtfX1hNnZiSDFaQCslYjA2aGJNcTctTHluKz5heWh+U3s3cj45QGotUDczKFVTXkFSOSMzYXdATkVDLTdzCisxekFzKipgP1N9cmR5JWJuZXctUWUzZShyS1k1ITdgb2JKU2I7Nkk5akwoeyRxWF8ySCkkdmhfZl8hN1ZaYXE5TUNnQV4jPWIxNVoyaTtuCis1JVY9V0BXR31HPVBZVTs0KTVocGw+MypEMSRmK3FITWxNVndGWlpTakZYeHJaR1Q1MFAlTU5BeyY8cU1rXlM8Zk56Jl9UJVpgP1N5P1UpCitLTDMyUlQ3YC1iNFlQZHVkQlRIPSYlWnI+YFJlNUspZX1JTGhXezsxYldzR2t7JUlOS3UqfnJ+UHolNSVRZShne1FMNy0hMTJ4U3h7OG5hCismPm5lfVNJR3FsSUJEKllDRCVTdkk1KktBMmtDJnhHRDJvfWFSfUtKRHNXaip2b2QoQ0p6Mkt7KCk4b0Ayejw3ODNfUDx+TT9RUVZ4PSpeCitwPmxlZnBPUEpgRVBmfHN2UHpDTTA/e1EzbUdlRz9wPXs1fC1lPENDdzRmZCg/Y0gyUCtkQm1SSjdqM20/KHF9UXB8NGchfU1CVUNKTzZrCitvOz50U2ctXilsPik1Pnt7bjNFR0ptI2Q+JDlMa3AtWVAwVnFqNGs0c2gzbGc2VUxveSRDJTJOeEhZJVd8M1Bpd200VCVnYUVHaSE2YjRVCitod3hKRWQ0cjB1KXw9SCQ3dTtLcSE5dyQqe1ItJD80Ul5vbUwtTEs1U0tjNDlzcyN7PUl7Y1VNd05ENnE7RVJDREF4O0o0Mmc+Xz1ESmktCitxS2QtMmFjdm1ZeWtZb3U3PHtYekRxMkB4N2ItN2NtS31PRUk4THVzNT5ITjxiVU4+VXVhYyNIbUZIUExJTUBsYCk5ZHg8emVmTz4yVXxoCit8JHlOJU9KcD1MJGtAQG8/Q30hQ2JMQGR7ck5ZRV8hPyR2an03aG1qJDYofkZMU0V8dFV0blB5UEsocH1adEMjLV40fjhIWEtrQkYpMDZHCitOWk9aKllHcTBDaU8hWWl8RUxlRDRxNjd+eG9VdElKSG9tPzk5PHI0N29NI0Z9fW1KYEYySWJlemByYy03R21POXwqM05fJTlEe1hLSGdTCitZVG8xPEleLXRRe2NOK0tPJXNCUTZvNiZfUVU2I21yUE8raW89fnpfR3pLWmt+fmMmUENpODM7bVA5MGsjNkFAPWpGN3p8azZYS3QmWjR6Cit8fkJYTkNSJUREdj5fckQpVWdSZkhBNTdFQylVTSheNGgoI3ladSVGVjtBR0U2ZipwMkZqXmlTR2RGVXhkdjF+cEtyN0U5KlhleDZaPzlnCithQUIoJUVSMWtjTnNfSkQzWH4yYit2VCszRCRvZkZVNHE4eSNCfDZFKm4jaz1FYE5KJEh9RksxckQkSSpzLVMhNEwlRD59TnRTbHV7PFNYCitBZlRWekIlKSZoZEt+RCg/OGJBWFp1dGlNPFd8WlhicF9xZEUwTXBmWT00aD9BI2BVZWJMU20tWG8yWld2UUw9bW5JNFF0Njc8dT9GU2VZCit6TSlASUNWN0R1eFI3O2VOSmkqcShCIyVhQ2Y4alhLKG9UOU91ZksxZWktIVRKTCNiMk9BczRAZEFONU99V0ozXzRFRyVoUV9NaWZUOS1iCitUdklSVDwzeTNAUEE/VHU9MjR1KDhVY1Nzen4/UjBDbU9rdDFuKntXXllmNkAhPTJ1I34tSC15OXdVazNafnhlQjI4YDB8T2tNVjZhbmpGCis1IVNyMGluSiMyVGRESl5LN34zX3c0ZH1nQW5jaHFDWGdSND5vNE1aTEY5WXllMHNzbituWV82VUwmY2gmKSQ4UmN7STY3ZyZpTEMkPFV8CitZMTRZYTtLdCY7OXNJRVdERjBYITVvWilYNTFkekYqUDFCN25zOU4qM0M+YGh6Jjs4fDUla0dQbitDbi11en4jI1BYVTFzJnByK2dEPVp2CisxSm1VcWlefkRBSm04djxJOCtWZ25IK2IjdFc1QmJxS150NWJpeDs1djtifjJqeV8lSUE4MHtXfDBmSW1GSjZfeWk8YmxOQztpZzUyMmJlCit6bkkmfVFlZmgjVSR6SUdxcmhoRDQxKDJ8YSF4alNsKE99QEFfTDdHKmFXYVRsTzRmR3NMd3dfZEBiWWNYJDEkUEdyNUJxa2dKfUlSbms5Citjd1hSbmx+VzMtVHZUSGA0U2A3ZnErU3RjLSZ0P1ZgISlGaWUlRDluc15uNmRkQ35pZD8tP1RiaT9NYVh5ZUQ1b0oxJF5vM0VjKjF6Rno/CitvTjZYeHdhPip6SVhDNmUrKWU4Km1LKjZrN29BJGZ4anM4eW1IR3R4NnZVPmxPIzJEJi1UeHxWOTNSODFvNTtKIzBLeHgwbjshVnpzfUtZCit2cjlCYTNaKFNfRTNyaDZydnQmdFRjan5IbD4yJi15UzQ5I3lkcDZ+elheYFc8Sng7LXN+ayReXjZWTnljaUcyWHZ1YGI+MlhLT25wVHN8CitGYzNXWDtSWWtYOFd7K0ZSSDZYK2FJTlJnc25Zentqb0ktYVlGUWE4aUMoZUtUcXhVU19AMVh9TWU1QXdDdiEzdj1hOSpwaEpPTEFRWmxUCisqc2l7b34mVHdzV1U7eVJLJXpHb19jRj1kQWEpRmRPSkhFPGp0OzB+dWFCIWQ2WWBocUNWcWgod1FVYGFOT0JSJllnYlhEOTFrMXZ2bTljCis+UyozKiRtP0NeX1RpM31qenZSaCE/YXF8bE51TV5PbnJHJnQ7JmpFKjkjLVFvZ3BmTClxTXZKcnhmTHlDWVVKXkk9WV4hZDx7Kz1kUGc/CitZQlhuI2VwN0hZVjIxV1l1MiQmQ0xrOWhMaj9QckxRYkJ2cFBrbjx4PzE3RXAoaDZQNHFSNGcyJHBwaSotM254RlpELTw9QWUofVVfdm9TCitpa08jaHM9Q0lyUG08NmNrZ2hRLXNPeXMjP2xIYHpRakYmY2FDRz0wSC01O0FxJGk8UlV8I2M4ZVVrR2VBSS0oJnFQOEVjYV4+IVdVYGJjCitheHhqfE8tcm0ofSZ+eS1YZ0pVbz8lZTsmMGhxUHBucE9yUjI1SyFmJFlFWUIzZkRfdypJIUJ9TUpxRHJ7Ylg8djl3PEpMQzkwKERpK3lHCitFdSo9WStiK0Ile3QzM0JAaFR1e0pVdkA0JkQ3d3BIJVpDYFFfQWxXI213MitWWSk/P21LRWZ6WVJHITF7ZnZSNTFyWEtgamBiKlQ+WCpECis0WWZIUndzNXdtezt1b3YlNzZme2RJeSozJWRSPTFxRGJhb1pQRU9EVCM/X1lse0VWUlROaTYtT1hvKlJRcGV0cUJYNGhKVVNUdnhseCk8CitIMlRMWF83JEJTUTNYO15uZlp2NGs4KHxDVmpgRGteO25VbFZHYFVySWMqSkRoN3N9MHVSciRuaD15cVc7KyE9JlN3Y2pWSGJiYlUwUWtxCitmNSskK2xBMGgzOH1acnp3Kl82UUZiaFJQVkIyeVhxNzhgP1U3dkd2OEIrUzhgcztuTVNOK3w4QCFmTilgVmFlfihlMHpyP2VvIz9BXmlMCitIYTRfaDYkS1pWRUVhfmlyX3I+YGg1ZEVERmVxMHRONWFZMGJJbUlCVVJ4e3Z+VnhjMTdgNTV6UlBKfmM9YzNEQzc1fjUyX015Km9iS3VkCitLI2VVYVRDR1lha1MpSHF1ckQ9fTh9cDB9Xn1GRVNLWEFOK3loLUBraEUpJDd3JiE3WTl7e19EeD5IP0xrRW94YjhSZ1NKM2U0UWV6M2QpCitBfXl2SDtxOU0yfl48RSpke1FyPUt0eGMhM15IYkhFYERuQzJRKVpPNTRCNGgtalF8N0cqeiQ0YDJvYXktPHxRPE84Ums2ez0pJD50LUtMCis2VDMzdzA0NmRvTjx0Q0Z0eCltJEw1aGk0OGVkdnQwREdkRV9TTUZ6YUJRLXFrQiYwQHhhMy1lU1hoTG58JEBLY0BIMUQqYXQ1MjtqNFYkCitgWmk5dUwkakc9eld2ZTgtb0xhV0Bud31+NHArSGE2IT1TcEVJd0syJHJrN30xPEBKWkV7NHZUI2R+PCFPX1V1bSV3U2xWd0JOJit7Vzd9CitzPj19Rj8yP2YkPSRORGVZb2FWUTlENDFZVXYwTWtXUVlXWEYzPnNKK1R8e2J1LVUtQDBfS0NwblhhTlN0SnsqM2RCM2w8PWpIU3N0VFVDCitncURYWH1jYWIqWVdWVWpmNng/UmQ/dnh8ZTw0WXJUSFYkOGRsPzdlbEl6JjdITCRgeHlLRlR0JVVeanlKOHFoUEtUNjw/NWQ4SnFOWndSCit9QEo2MldPZ09AJGoqMH47QH5kP3Jlaz10THAkeiNDZHFuJFY/SWI1O0VwJnF1Z24yPDB7QXd3T1MrUWx6bUo0RkhsZz84bXEkZ3hXcDVsCisrTUVoIWVTMyojYVUwdiNLQndTcTlZTDhWYzJNa3ZiJEZJdFo9Jn1DLXpnMlRoaFdePjxIe0lmJGglT2NUS1dMd0sxWSR3OEJLT3RaeX5KCit3NChMMURJIyUrZW1mQXBwITloUXEjQjFwMU4ocyVNSmk7bD4yIT1uWTNTTnlra1d3KiUtZThVWGkqKjhgMExKQUpBVkQ1V3p2SlF7VWByCis8e0BKNiEzcHVHP1dGbD45S1JndVBjXn5xaGdGUERFYjtnOHx7LWVPMGt+YG1fZDdmT241Nl8jfTU9P2JGekt3NDQ9dkYwKjhHTztEeCY/CitzdiZ2bVI8JkdZNzY1TlJuKlk3SlZjKXhNc3JDXnMkJFVWTElHYzhlcnVaMklgI0V1ZWp5NTZtT1JyTVUoYHJpSVYyKVhyIXpFWT8jVnFiCit1T21ZZGxMNiQ1LXhRNkhieztJZ2JqUVBJKnw0PXVtWl4wKyR8diZERTlXJEpxakZpJlRzRFpJZTsrK15pMX1hI3ZiJi03YUIhMk5tQ2NjCitCWT5FWX10QE9SWmoqOFpuczBlQHBJZXlebkxoI2tDYjNWeWtlYn0+SU14XmNxZDt4T2xOVTlUdWtLKilfQHBLMnhQa3FrTyhDZT1TPD5oCitULXMxdjNwNSpsRSVYI0tRU0V4PTdnd25TOWZxVUB0S1V0dGVDRGghPSliZChqXkh5Z3t9e1Z+NE5eZ2l3RVRQTTlzbCFCKG5CcFU/LXVTCisyKHRVcGNJcylnOHYmRlRjQn1hb1R6Nnkldm07JHhIQTFtfWMrYTsmVlo8dTdFXzBsNnNPdSp9Rm5gRyQ8ezVtU089fFpGK1ZWdkt2U2VqCitfdFdxaXtEamxffkZfTi0xU1NfUyhOeVkqN00kKGJXYnExZ2VjaC0wRUc7fk9IdUpgJSE8QXFRdiRaWkl5NEVKM2wlJHNEWT0xfjx2bCRKCitXRHl6MD17SlBScE9sPEleZFJlYGRoKTdtNjt7KT42Z318N0MpaTIzdnh5QF5NX3xEcXAqUyZNJio3R3RGUjhPXmh2S0Z9dU9iK1M5MFY3CitBQkVfTjFGSXJDRSgxVUxvJHhqcytScTVNNlQjKWdsQkloYkolZ2dGQHw0OCYlJFQ7TyNsSXZiJT45TEJsITI4SWt3QUUwMTN4ZF5xQXhuCitjd0lXNTdkOTViUjtQLSg3czM7MTFBLWJuRS19RmZHYFpHQU5XTEdSaUNNa3RBVF5nJnomZGJKOCYxZn1OVXA3STshdEx0LVdsQ29wVzcrCitjZmJTKmZNc21oSG1DPStUaml7Qm4jRDFEJHU5RE9OUWRAeyNRS2R0VERKWVN4dFNQZ2wmdyhsPXhiaVdPWjxTVUA7aWpqYFcpTVdJN3h1Cit5KnZwOTlANk8qe2BEaS1sbVR7YTB6dXQlJHo2Q3JiNlNNJXtpMXZkdzFAWE8jUEVKfkdeMXMtbnRKelFuNFVIZ2lVSiM0JTAwJTNYc3VPCis4QlZEdUYyJDs5WVJVdnBMZThjeU07YDxtdElrWG84QUlsWm8mYzVFJk1WbDR+WShPM3BCNXZOP3EyKUFsblk/cTA3XnJQZ21MZjxTI1U9Cit5eWFsZVhfS0BLV2U8c1NsRUtKZCNJSWRnWDwmJkJ1ZHVuO2k/dkBeR1BSM01MRndQUmN+VkgwSzVfYzNDK0Ymb3hDdmNGOEc3NmpuJWNSCiswQ1Ekel5hKUZvbmchXmtyVzcyQExyeGRUUkxVMjxxUFg8bk8pfFBsMlkkZHhZckdgcTlwbFhUVH1vQiEwbmIhbHgzQyo5KTNiQW03ezFaCistPzMoWUdmc1QoOClETGozP09kVVo7TT9IcTc3TzteeHl5Z1JmPDFWeCVYYm8wNEp3cW08aWYkQXYxQlpXKHJNP1MqQD5yM1M5OCMlSS1PCishYnFeUzc3TT1gVT5mNkJYaHJBdTA1WWkqZWNhd01BOzReLTxPY3g2bVkwKkcmQzJZQGM/b3BYUVAtPVY9O2wzayhATGxJQU8hT0A8ZEhHCityclZMZFRVYypkN2l1UjsyTFlGPTNqRklyUjV1cChhaWUkUWUtVW11NzdTSXQoZWkkdjZ8IW5eWnhaJUVHQGsrNCNQaD1CbUxTYCNVcXFHCisjOHxwVTwwNCk0RChlYkpxQCRUJkBoRmVzeWo3cGQjSThrWW9COHFifmlhSihwVTZTXkt8U3wrXiRfYjRId0hYaC1DQSFmUz5mT058bz1TCit0ezsmNjwpU0xpNT14IWxWdD8rNyY4TnhAd3tYeHN1PXM/QDskTWZ6ZVhfP2IwX1BPaSs5Y3wqTzd+IXVue145VVMkOytPI1BJfDlNeDNvCitxdEE1JW5yaHYjeU1eXn43KDBZPy1mbGo1eztaKlk0KDlsKFNDcSRWaXJ4WkRfdHUmVFE1djlYcWBXSj87PFp8aXw8Um44eXE7SjV1MkZuCit6azVXSElrQnhxRG5kQzdTQWJHczdSd15pfDwzRnFLcSQ7bUw5ZEklR24jWER3KEY2dWcxUX5JJX0ze2Q0PVJPYlJ+IUVDJiV4OylqZSVPCitZY0QxSVR0Uz08dClKZTFwISNzanRJbjcoRC12QFRzWnE2WSMxVllYU1RtZmA3Znc9TSs7MlhuKSRMcDlUJWBsM3J8OUJ9P1Yhe0NlT2sqCitFViVJaEpqWUwyQjtWJXFxQEkjVU87SlY9Jj4jT25gUnw+QVFeMlopKTc7aCpfPnVPKmM+Z2cwTV9MQ1lWYVBjZjNOMHRjZ3hNMCktbVkyCit2VFY8U1lnQTVDVmRTc1RnTVV+SldFVDBhcUokM3JBMUVPPmZwNGpXMWRPKH4/eFRoVEN7ez5ed0wpXiMoMCsoaHdkPGowe00hYWExVjMtCittTURAP1ZwREtFbG5veno9YUZhPUsoaShuNlBETmc0YjZyOVlgMzUheD1ybz9aSWkoYHlXWE1TY3J9Qmt2R31KMytHe243ektaeHBYUlR1Citacy1VMWUjUVNZYXs5c09MemZWWCF+e1MkVkdfckNIeihWOHZ7PDZITE8xRnFRRl5Ifio1KEtqWlg7TUJWN3ZUNzNJVClKP29vXzdOe19NCit7V3dKPz85eSs+Mj0mdVUpcSkkY35HREpsRDViYzc9SS15aWo4VWI5TDAxIT5WcHtVYF9RPnEjS0xheHRVZmFBKngjZF4+Rnt5MzBlVWBECis1KXxsT3pWWVAmX2h2aFQ7R2U3XnJfMy0oJT1qdWRfJjRoM0BMcHZxP0V7eigrVEpQKEgmI249ME0zNzBnYXQ4MD5JUUZDTjw9e1dxZCRoCitgQyRmWStqRVgqanJBcVBzVENtWi18JnpLIV88ZmAoYXhJUk9+RjM9KVlMRzRROGNYP042OEVBTSVCIyojYndqT0hadHhOX1YzQ1hlJEdrCitBRStVTyh4dEQ0O2BMbHZtWWwjO1JnPVlLQkYwMVpiYUZEQzVvSGcoTCZeUEpDZSplWFImNSNidnYlbURKNUA5IzI9Yz8+bjd0NXNOM3Y+Cis3IzZAa3JuKnhseSRkWkZCRCtlcEpmKDYtWHglYlNBZ1pFWkFZO3QpSjh5ekNAO1NRUCFpcmNqbzcmcz50S1hFTTlPS2lpZWRmTFdxMSFOCitzRWZaKVAzJWdvJEZGXkF7cTx1KTBDRzh+anlzVkFsYDFYM3BLVyFoPm0xcjFWUSR3eHYkMit5RWFeb2w8YD1CblNnVDApZj4tIVNSQV5ACitLIUZTKm0/ITw8UDV7MV4tcUk/XktLMDdhUGI/Qkh5OWtKZyp9JFF7IURCI0xDaFB8aCZtbmh2YCtuO180YSRgITUobmJPQEFNVzx4RiQ3CitlP0FERjFUTD1sYUE1UCZLRjtAPiRefmo+XjUhMm5EUjclN3MtU3hON3RLX2hfVil5M01WX21EdFIhbmFuT2AxJXM+fTl2SXZ0JkoqdEZpCismS2daQGRLKH58SUlSKiNwRCRvaSYpTn5TMDsla2deaV5FR3dTN2MySmxrV3AjIUBVfEZ3VyU9PiVzcTV0cGEyNzhqP1hJdFJ+SnliWEhWCitsNWZZPXRjPmtaZFJxWUBLMlUhJXV7eSNhWUZjST4leUppZzs8X2k5Q2F6ZC11cWl0cWtYTDNXJU1ieDk4JUl2cW1FeUplU1BvRzd1Wl8kCithTFd5TGxwPSVQNjJIMFROdDJyV0Zhb2lqezVBOWZXfn5BYURLcDIxTnk3OzNnLXhaVikxJWBkMUFsWTxVVnNYPCpUKFJYVmkqTTM+N3ZgCismcDt0bH5SSUtVN05idT5ndW85e21SJEU/ZExhPFk3RCVrO1N0UiZFR0BVbDxON1JndEkpVEZlZEhVKS10fkNfNDZFfVNVNkMzSXJheWRsCitCdUNqMENMZjs0SGM1NVVCZ0E/OF9DYFpmIyF6NT5hbCZBdk5ZfWdXXmt9KFB6b1d1PTZGQlhZYj8zMi1jcFUwQFpGbn5IJlhLUih1WDllCitWOWxYZzAlXl9gNEJjPHQ5dyVqU2k9NjVqPmJ4U35qSFNjWTg2Y3AmVlYkdVpTbDVRZyhaJFJUN0NeWE5mY1ZJQVRMO0RqPCo2QEktMGJTCitqaHdPT3spZCYhcD94Y29+eSV3UTdMYyUmZ1phYT5le3tDaURzYz5PLWRCek5mayp3aEppZktVazZDK3NHK3dRTXpeYzNjO3s2Rk89aXA1CitacVotJHF9aCFze21IU2QzNURQVkM9fHNFQGpkM2hzUVR7aCllfjQpY0xOZGdxST1aRkEka2RIK2JCeStudC1KV1IqWV9MeUVVJm5DdU90Cis7MmFUbCU8Tm9SO2Eqe2R1antIMXB8SEpjOzJ5VHcxZyQ+Umx8K2lfcEFFRSRQc0FwQlhBTVBNO2kpWVVXbEAwZm1HTUdDbUdVSm55c3FOCitOMWA4IThgcGMlPkI4QkJNNz9fKis/UDUqPyReailEXiR+X2VHTW5SeGJjckA3JU85JWpURFYraDJ5K0QkMURRXzc2QkB3MldWRE8+VyNvCitQSzxGM0pKIzJUV3tAQE1SV1dvbEkxR1hQbGNsV2FAU0s4blVwe2FRMEV0fndBJlN4QnF5c09wTzxEOG0hTS0tWnRRdG9zeWR1JHBrblVNCitrPGliZDR+OUh1UGVYcWwrb0d+ZnlfcTJ6QDlAZUc5NWV5fCtjJWFLU3VPZU5TP2d9S2A3XnBVTjU1NEg0RWA+cCFmeT0kbyZXVUA+dHdgCis7cGp4ZEswNDJUN0opQGM8Yz9YaDx5bVVqZFJlKlE4QD5XVjFIem9sRl8mNmlIcG5yfnQ/OVdrbU5pS2VvK2ZhWmRJeXUzOGtxeCtIMiZvCit9MmpDUm9+YzBzbmlGWWFUWW5YcihGNSpHKzAkPitPaDJDakN2ciQ9Rj18IUBQflRGQUMzJFJISTlOPXdqdmUqQnYhVDtBQXFvOSN4UTFoCit4Tm9YV2U5M1YtQTdhcUkoR2hSRXRvbDF0YEMkMGgqZ1JtdCVAUSh5enU0fG05P1pMYzx5fiZ1SEZ7Wk85MkBQZk8tam5gKEJfYlEkPn5LCitIKmRPcSRWaVY5fSZsbHl8VWErZjhLIWZEZWcrVjFOd0p1eW1aeVNGfT5rcjt9SlZvfThWeilaT0R1Mk1uSiZVK0gpenpBdkZAIWRZO2x+CitJYio0Xig8eShqNnN6MXxhIXEzPXxBKXdhfTIjbzlkWE5hJFVRLW5HUXg3V0NYTzBZam1IcEo2KkAlRTs2TChKY1gkMVY8LWQyV3A8QlF6Cit2Nmd1aHdWWXJoblB1UVEwdTMkNzlYZFczPmlPamZSSGYrSWJFQ2NNaF5jcEJMfkhvO3RxVTs8JD0+O3w/TyppJTc8S1d4dHd7bDk1Qkk8Cit7JTsoUWsodV5qIy1rV0spRSptMk1Lcn5Sbm0+R04wWGdzaDNxPnIhQm5UUE5ZUSt0OERRWW9ERmw2WD9ycU5JUE1kWkVaM2VOdVF6Y3tYCis3MCNnTDNCVjNoSEl+SmZhfmhRcGxhWGpMIW1zbmk/NUVLYFErajlxO09fUV40S042eHRAKj9ePylEU09zIytmdDlWWiFjbWVJQykqXnxsCitaK3F0UG5uKkU+fGgqTyMydTk0KVpjQHNhXmVXe3lyOG4mZWhwQjhXYCQrZW9TblVDOzxoYTQ/MFhxZEopdCEqaldtY0ZURj1pTSFKMXQyCittWmhWUj00O2l0MSU9WTZAdlBVWEp1Mz5CcVBPcytJRGo7SDc7PFNHcWUlJStYSTY7LSMmcjc2MFFAQWBRSE5zamkwbUcmMFhXOzJFIyt3CithU1Z1K3lmMz9XODtaMlQpNGAxUVktTzAwO297bEA+P24xe0VHZzRnZGhIRSZ1PV4wMDAxUlg+YyFKYzRjbTRaKm5oaVZQazd5WEs4THtGCitMcV5lYjdebUdFXnY5fVQ1V1VOSFdMMT5VeENzJDZTMHZRSkkmcC16QnM5eXhJTkVoOUZPZyQoe1gkJUxfcmQyaWVOIz92UXppSi0/TW4zCisydlR5S0hzNE5AaTZ2dDNWQmZJVlUydSFOUXBLJjcoXjx1eT8oOUJldVR7Pm9GKn5ha2xTJFJ2PlRSKCVHOEs2IyMleiZ+Zz1XPUV1IURsCis5X35TK2Y/NDhpMVI1XlFePzY1dSZMfmJhR3t7QDZ3d1AxNjglV19xKk1KV0l3T0UhXzJWQiNoZk1hNSohUVorOSEkQDVnT3JMMU9WODMmCitSODslNWg7TWltRCYyWXJFR2xPYFNHbWY9fWQ2PzsjZkVTSmxLOCU3aFFyJXk2VlI2Y29nXnk9e1Y+fkleKjh1QjBXT3EzPGw7PHRzPTVPCitafFBjbVpCZ0pfM2dzVW94Y2BwSzVgek4pZk0xRWkwSyUyZHE/K1lSUjwjJTI8fF9tWkw9I0Q5VXBOZDdBYEs3MCszOGFLP18jQktGPEUrCiswb2VtNyhYNEl8TkhIYT1qXkEwKTY7fEZeUHxIdl9WJCMkZFZCbyg9PXx2SUZAQWx8NHZ2M2p8MmFCLUp6eFRBIVpQQmYoOE5FT2wlenMyCitDVmlhPTVpbEBPbVo3b2BzaHIzWmFePSRucDkoZnIqRnh0SWhaUkU0V2w0ckMhUUwxc25WaWR0U0xSN2FzSDhYMVlSLW5rJClafGxGJnh0CitSTj5ffUpOfGl5KnE1VkM4PSt9fjkyZHZPQ3VQYEFgM0FFUjlHZzZnaCFhT1NkQlV1U3VEVjVhXnBrPSNZR0szLSpEWG0laEM2RHJuJXc9Citgaz4tQzAxb0BIUVdwSSE3QUsyZ0NuOUM1JVI9Y1YtWmpoT1FFdyg7Tzd6dmhgN0g9ZXZaSlV4VGJoYklUOz1aQn1xUVNYdyN5e0dSdGN9Cit7WFo3dnBNQ1dUSjFeOU0oWVFfZUNUTW1DZ3VPaSVmOUsmc2JkM0FER1lsUURzR2NHbk1pengqWVVrdFR6QERYODctNFRmbGhGRSlZZkw/CisrSnw9cWZGKHMkZUUqSjxaN0BldE8maDlRQFFzUiZpMnhibSp3NnNqPkJLRHJHQUFSMjJNMnowdiZsV0hXcjEqI3tgYUw8WWRqLXZOVHduCis4STdgJiF4USVHKi1reGQqMm9PRGYwaEk/UnI9Tm5OZ3YwKDxEJUFyOEYjQFdHK2skRUFqUyV5KkUzP2FYN31JbVkjfFB7Uj1UQz4wfDtoCitHWWV8K0lRQX1aOTNARURVbDllO0gkVmxUOCs5fUc1ejdvJGJJe1hlVTtGcStEI2QzeT5FSXU2MGNzVXltYD0hVnhhWXJIPUcoKllvTzVECitjSGQwRkxWNFZXVChjUEhDPDZtMWM9YGk1d0xVQCN3eklWJi0xa0NwNT5RejVHT0VVNWJ9U249RUVmWmNEeVBDcEJgRkZMVEZNWVMobHNRCitHN01fS095P3AxSmAlVX5eSDspVlEkI2J9eWFDMitlc30oYUchNG85QH01WiFtU05zdntnV1ZsSHg9WFQzSmhjQnokKkl2JXtneD9LP04lCisre2d9OVpfVmp3UkdLSyVkVD09MldHXitGaXh6OXVzakhjSHU/PEhkNFVLMFYxOGc2QVpeQCkhS34mYUVzRCp2cVVXS3x6d2k3SnpsYWk/CismVTBTJVg9PE8/SDxNJD4lZVJHQUlHUzt8YDkrR3cyPGdlZzhTNWc5cGxlVV9TOCZXPndFXkgqPHpteDNTcV5kUnh3Q00/e09AXkktVjE7CitPXkZhdGJaKlY3ISomYmpIblRRdGYyUTNuTUJLXyZEcXlHRXhWfEs/YmAxWGZPYHRtLXhXN3shS1hPSlE8YDBubDVwKmYlMXolWEZPUT9vCiswRWI2eD1aY2I5fFVqTmZCWD5keU9YRFZGdWBaVGcxdmc9Z0MpS31oUW5OKVloPFRWeFNgeE1Xfnh2Vm5SKntIbkArPXxyYV9rRGdHRGRZCit7Wm1pOUU1WXJfc2t1K3dhVjMzNnhBbCloRSh7bkdwQmR2QmJjNUUpYmNjQm5zbjRzJmJeeDNsWXBEPldqVklPWDU0KSo/cyFldiVtbDJwCitJPzh8bnp7d0x2NV8lZiUhTmh7WXJ+dUA7aCM7eVRQYmh+NktMYFFSWXVuVGRLQ3UqSllzSlJiQFhNIzktQkZxdm5fQGM3YTFuPDg7Kj1OCitEYHghM05MMmh1aWt3UTBkNCp+TnFheSkra1hAN1lkUUNMKkI9U1pKMTVPeWlrb0Y1ND4zVz4xdjdvWlJxPjVEOVowfEF6T184dkpQNyh6Cisha2JoO2puMFNwemM4LUhYcjJfVVNScCV6I0xTNGYlTj1KNFFjMjFTbzU7fGRHR05KN0NTXiVWMlI1cjExIy1AUlRUaDFpZEw0czJuOHB5CisqX2ZZRklEMkc+fFlQRHhuYyRrbVpSUmFBKnhTZVA4JVY8Qk8zOFV1WT5zTTYrMVJ7VldQPz00fU5FPlh3TE8oOWtCRGBjQ2Q2ZXpCeWFNCis0bU5iU2xhdSpjeSUxc3BfRWVNPiN4TUp3a3lxUnorcDxRSmNlfVBgdSgoJTQ7KEAocD13S1pwO1J3VEg+PDEhYDV2QHBWNE0mRFJlJiRQCitnfj1YUCNnJVUjX2h4RDs8a0AjRi1KajBRSzQyOVRaS3ZwS01mezBSSFNVKT1SIWRHej1EfUBsMkFvcHpGbGwlenRJbDsodUpQeHlqdVJHCitQKHtENyoja34xJjFGVjxgeWpMYHR6ODdGWld1c0lJMVRqY19wMVI1UTBgfUskOT5sRHd3NXBaNVhDenhsKWVwNk8maSgqJkhRcWNkfkhOCis3SCpvQnM/MHFmWjE0M2dMV3d2Ujc8WT1hfXReWjlHTypTK1BWPHFvRncmb2ZUJV5XVFlIdjwlbUNiMVhFWkAkdTJ6RlRIP0k+QHhadyg3CitNQ08qKVcjKFEqQ0t7T1B9M0RGRU81RkhmRXVtUzBAI1k9M2s0SVF9QWp4ejJYQXJCPjB3QkFoJlQ/JkpWfmA5NSkyVSZpWVl5ISh9Nk84CitZeSZmX0p7U1haYTJtPShpblNWQWhONjtycnpCVyQ/YDU1Mz83MmVtQTtIP3tzPStnN0Y7JTwyd3g5eCNLakI5fUpkenl7KDJEVWt3I2ZpCistKmV1a3dETVokcHA9QWQlJDc3PmxZNHJ5PXpiRGM+NmtPbiFHfGteeWR6JHhZT35jUHRUdXJSWUlTNWxZKT8kZTNII1V6ZzluKyVtak1LCitnI1JDQVJVK1NQKSExKk1fbTdGIzxnNzAheEFWPyNWZTJRQDFORGE1dk1IYFZxazdGTXs9VWl1JEk/e1h0VnU1RXFvZT02RkhPU0gtdXNVCisraE1+Vz96TDZvV1ElKXFKXztLe1pAIVFrR1J8a31XVEluOE1EczhjTSlXTSthZyg4K2VEcVpCSUp8JiVPaClqaFBJOHAwKUN7RTBvWS08Cis3fFQyY3pHKF48RkRhKyNvKyh5QVN+IzFnSEJpfEBSN1g3PD00NmgpOGZuI2tpZiF1JUZIdENTWSoqdyltVlI+KXYxJnBzTV5nWldBQUQkCisjZjdgVD5oM1F0bT9xZVp6azspb019blVIMn1JTnd7P2JDYXEqVWdIVC1TQEI4LUhBeHMmWWdGc1VENVd4N1JWQyp0O3F8ST8wcTlKaFl5CitObnxmNzRvfmZlQ3VyTTBOTzspczBGcmBEc05NQElZNlpOYjFhdyRePkgzLWpEJDkhcWN0Tj5LZiloXnpASzh6I0Z+JENYRnwrSkk1NDUyCis9N0UwSEVDZzcjI29NJVM7TjNybiskMH4he0hTNEo2TDZFWGp8MyYrd2dAVmZyYn4kUjlTJkQlMWwkRVhBaDl7bUpwfDR0PzwwWk4rJmNgCitqLThULUUtWnlOdClLU3Jjbms9OHZVYiZ+JChANmRzPH5hPHFETVctZGlsdlUrUDhqYHk8VExfalUofTRQMFNNI1c+NHgreCM3dl4oUzAhCiteSjsqQVk4SHh6MnQrQklDQFdLQi1pa3FxWGhgaXI3Rl4+KiRQPz9JZFp1Zit1JTxeZ09fdmhfZWQzXjg9UUxEZSpSdjNuVkVAbWlvTFJzCit8YCNsZTJWfnB+VTgpeW51RXlEO1ZyPkB9YC0zYmQyQk8jYnpvRzxFOWhycVFfMCU5X1VNRSNhMT5PY2U9c2U4PTk1WnIjM2JIdUpzNHg8Cis3bUtrPEJPZmtLaHhwLWY3I2NjcjJuPDhUO0pTcV9sZiV9TG9eaXlZWTt5bkAhRVRYa2ZkZUktSHBiNE5WfEJYUk15PjdsdUxBQCZSXjsoCit1VVV2RCNiSmxHbTRldXgxOFJrZz5SVFNEJk9VRXU9c3lXK2w5dGxsd3JrVFY3QDV3WHghK0hicXdnXkQ0big3cGMyfV9gTE5+eG5eVFBJCitENUVAWGxzOG4pbCZ6V35EV1IoUEl5V3ghak5IPSk2Rj9mRzM8VFdRKCYqVFNVQFlhYl94O31+MiU9RSFuJUl6eCVeTG5sJjFmS29rYCg/CitjaWlZVjF3dSUqKUQoclk4YnRlbGRodkplXmRwR0BYJnU5K01teX40MFVnVGt0cjB2cDZqJChEZlEyPUc4I04jSV9QYUJ2dD4zciRMJTIoCiszakUlbzdGYl5DSW9EJGgwVjBVOGBFK2gpNEIrJGlqKSMpen48MXcwPDVXeVFwcyNuaW1ZMG59QnFCNTBiV1RDRnNyNSY2XjZIREMwZXgzCitMV1I9LXBSPWUtRT1CNz9QJHlBO2hUJU9hcFI/SnQ9cEZoeFQ3QWg1bFRFYU0wa0dLO3hAMmcjTjU3TmdueF5ZIVdQLUotYUV9KzRKJlcrCitpcj11bE5UdnpmTz9JfC08RjFRLWcxfmVvKVhlKmJyNj8kdVNHbyopMFhuKlBwQTVHenFqdU5gc3M/KyRoQSQkVl5ERm8tX3BmK2xAKE1+CitCck85cW1FayNEUjBaPWg5U2t+MmlLTFA+OFNsSERQcTAkVU1ySGxYVHZqLTx8O3tfTjBGJiVCVWNiailXaTdkeCppckRULVc3NSY4QT9yCitXa2Vib2xOeGtKTExxRkRgQ3dZZl5pd1F6bVdMYzRaZ09nKjV3YUtNX0hndWp1R0VRUHkzcUMoMyVnajt7bTM9cDBRPk5IYEs/aztTWCFOCitJaiE7ST1WN1BTfXxPJXAqfEtPSy1GV3ExIU4lTnk4Y3JBT2xCX2E8ejFMVX1lMDVUalo2QDlKbDUkcGtOM0cyU0pYc2tjYkEoPiM2TmJQCisrRjlnISFrI05UXkliMWN6UmBoZzIrO1p4UiVtfC1QbW5TKlNIMz0jQE9jQnFPOWVseUQlfnUjWUk8dFFpKkRQJCpYWGA/ST4+amFpND9eCit7aWxBKkQ8TV53K2trRnI+Unh1WiorYmZjQWkyfTYpYXc7fDY0V1p3Uzhmd0dkdUh8a2JNTiY8KmlZJElXRGZ4KzhfJVhuIXtsPSFwaiRHCis4MitBc1V7TWAoR2JON0FeZnN3N3AlMD9mMGpjfk16S1U2JXFHX1FfakwlUEJuKV8mJEBJPCZAdD92OFBTRm1GJHA1YXolVmM0UmBQeGRfCitDcndWdFcwbzhgNlB7NlNyZHJXY3VUU0FqRUZJZGdBaW52PmYzTWRsMWtjVEFRSzNKYlBkPXhWVX4hTnhrTUZqd3JgXiRVOElBeT1UNlc8Cit5YylFPSo/bj8kc2BDNU1kdWEhajZqbDNzJDloJVcmZjN7KzFLaVkpJmxoP2gmKCk/PjAtVFJ8WXE7KVg7T1Z3ekt9YVdvZ2xkYXZIMUIpCisyMWRpdVJDczNwekRANXFIa0s9U3Q0QVY5PTFocCN7N19hRW1NfkU2U1pOc3ViSjVQZiQkPX13UEkmRXlHYmVoXyRSTE1PRTJYNVRqd3dkCitYbjh1MG4zS2JrYGZXVCp3I15QR1E+IW0xOWU1ZVkpZ0ZCQ3s3bEApUjgySzZXLV9HPEA/aHJpK0JwdVhMd3o+R0QyKHAhJF4jQkZsfjA+Cit2T1BkMGpwZml5LXFSRnl2PThHRm5KR143MUhIVW0oQjUjUHlgUUNVfU9xJEhjbyR2a0h4T216PDxXMHhodGs3PWZnKlVNR0FLJChJMFo+CitaPTFRWS1PMDA7b3tsQD4+c1JIZXNnWn55P31wOClfUjAwMDFSWD5jIUpjNGNtNFoqbmhpWWlEMF9XcGkoSmEke3c0RkpFNzJaZlNJMVVvCitMUVk8LUtpdDheQDYtYGtsWEc0NlpLIzJeX3NTbj1CTDl0NE9yTmpWMTkmdllpfT8yTihpRmF6YkRSbyZpWH5pTytBcF8xNHxoSnZ8YGhJCitEN1liRV9QIVBuNGFxSD5nd3V4P19SSUJjYXFKbnYmJWZHXlFQTD12cGppemE9ZHBDYFJ3Z0ljYTRmQiQmeThOUzxKRlVhIzFZdVdMQX55Cit0U0l3JmEkQnNnaVZ+aSQ4MXlLcVlTKChOKl9fWGRJLWprcGRZaTFUQDthfEIoajw5Km03NXA1dV9YRCY2Kk8rI2s3YyZabzRzfEZUeEI7CitvTE1Vb0BiQTFLPnNpOXF5IUB0PkQyOWl2dGtFWVg2QH1SOE41MGN2fWN5Tj1+XyFiTlpoZUwxNUoyMXxvZnc4PS01QD89bW5tbm5SbHYtCis0KTkyeWk9KihBe09HQW9QS1cmeXpMdT1aJEokJDRJc21vU3AxZmRMZEh3OGdHcTlfaWoqPU0oeyheU21pODVxdDIpWkI8fE07TEVDQjNXCitBJCR2KEFfMXtic2I2PTlpY0pXUnpzKEpsVH1eMz9SNCVGcVB3VkdSdDV3N0xDQkFtMDErYWYtc2JBc2lWRjByKCh0TDVHPzled3JTU1lHCitDNFVxTnVFN14zaDJ0X2NANUpDOTQ1X1h3V3toaE8+UjI5JS01NTd3JDI4Xz4yejxJdWRrfGt5NE01WitQa08kIWVueD5TI1JvbUdEKFVoCit5X1RJZiluYz5HQztXWUhQa3g2PG5tO1QxUzVjWTIqMk9ZNmY3a1l9Xj4mcnAjeE1fQGhXYVg5JFBjJCFVQlV8NF9SVHU4Jm5gQTRQLVY1CitTNF9EV2hue34wVTlhWXpQPjR2Jkl1azBmeGtFKnRCMCZRSHQ7K2dOV1lPdyQrTSo0QTBpZXxraSZkdjlIbkgzOGx3enxuSjcrNyZ7SV92CishN2BuSndpajhfPytLYE8yU3t8TnkwKjdmI3FGTSpGZCNZY1BqJDYzQndDJiU+RFFDKEx4eDdrbGx3eTxodEArXkd7Vl9nRXQ3dzUmSVNaCitfNTVfJFNGNGhPfkZgKkpzSFg3YzdQUylXRjBoTVJgI3JVbllaUnFhaSRmM1F1dHBLfDVJOTM7ZFYrcU0+aTwxeCVmMVlydztBXm5IWVhBCit2TUZfXjZGRm4pJSg2Q0p2UXFhbVY4MlZmQDVDU3FySDY1PGVnOEd7M2NycmBrUyh0UnI5PCoxYU4+O199PnkrMz5NayllNFp1NlZOI15ACis8NnQ7VXhXZmVEQ1A5Tio4dHZgdiEpOUZKUj18d3w0UG1wTlo7QEZmNFEjdmY+TFpNVipTMmN4e0R8dTlhdDJTQSpUNzZpdXA1eTUwMUM9CitRUUM/SFNBS282bkticE16PyZSZG4reElaK193Xj48Sz4jSzIyT094YCtNe0d1U0xmT0pWaGNjRjwwcyFkS1o/VHI4aEFeLTdtZ1k+TTJXCis7d0g1Ml5QSlo1SFU9JjdOeEg/Un1kaEAwbShSUklqSi1hZTlIJk5xYWpSa2hCYGJwZWJKaHFTO3xBTzx6aDd1Z29zdGVfJkZUPilRaW1RCis5TXctekxwNShxezUoTkd1Sz8hOzFoN1U9d0ZnNXJ4VGtvYitaWis2fSRLZmNvSmRxfXBYUmc5OSN5PDExXzImbENIekJDZzAmSy11ZjYlCistY0l1d3RtK1ZBKD5jNHhoaHVhPFImbFlSaHt5WTBGK348eVNxXlgkN3lqPEsrYD9AQmFBODljbl9DbHAzZkU7a1plLXtkTSsxMDZibV44CitaaX5lTlBDUklGS19APlJoO1gpNkBLT1VQWjcjTmEoODQoZy1LQmVWe15KSVlldUR1I2s4dFpYYFB3Mzc1QmhAYjBFZjtPVXApU1NuZjJpCis5cm8+R2tVeCRuakpZVnFOQDk/Qyh5I2pKMFZTK0BINjhfciZAZXJBMGlRb24wNUljS2ZQUlF5T1RTTmV6ZihRPGVKTG8jS2VWOEZsLXNTCis3ZmlxNDFjOFEhWWBfVW9XSnt+S18yNyE8dCRzRFNoQ0RyPkdMbFI9WCZFQFpVJHNSMk07O3MocD5LP2dZNDQpe2BQVkdLM2cjYWZfKE9vCitnKm16PTdoNnJZUFkmRGApd0Rve2tkZVZVZXB3WTgzUXtOMHxKOXExazRSZXQrNH1YXyExZlp9aj1VWDd1QTxkLSE+RGAxejBqbEhyZWs/CitjdmluK3J6KjcqSUB0NFV3aW5NYXFNNklZZUBnZ1V3aWElKGw3cnQkcDdydU10PDNXe0N0ZnZqR2U9RXpIUmUwSEx6MT9hSGF2RTZ4MyNqCiskYk56QW0rSmB+M1UhfDFGQ2d5QD5pKiF2ezkqRXM8VE58QD0/d3Epa3AzZSU4MV8tck54d2dPYF5QdSRqKXJPa0FhS3RSI14xZmtfZzhoCiteS1RQX3d7OzJpKU9fQVM1cEI+PEBhRysoMmdZWiMzaUBxXz5afTlqM1JLTmU2MD96akFTSGMxdkBEbjRHa2hWSCNmPCo/VWYlSTZeKD0+CitXZ2w5RjFAQGs3blcxX3VOREktKHprdClAVjBjPGoqfHJYJTEje2p9YyglTEBidFp3WWNeMVE1UF9kaWRsRk43e2U8PG10MDdlKUkzWXtvCitRfGJLLSExKWJEQ1liUyVPNDdWPlAyTDhqeDNGRkttbF5Ge2UoX3BGam0jNDFVKzFQTWd+T3hCQ3pKNC12d2kqSmVNLSVaNm9la1lUZEw+CitNREQ1cDBCZTxwZVdDYUlWJHhpP3dzY14rQl9qYipvKG9ZQ3crZzd0SHM9Mz1HS2Ffa3okO2pvXmBIIW9LVnQ1YnFpWn43QCtgSmpUQ3FZCitHKH1ObjA4QGBOPG11UD52YnhFVSg5SSs+a2dQIz1USTNsakNEfj40TWQ8fmsxdkI/fTJsJTxZTFlvbEo2e1QoWj4rfUdxMTxDRCE/NV4oCitqRXZDe3t3SG1abi1rWnB9MkYpM1R4UyNTR0chUmxYYXVCekh0Sk1XNGI9OEY+SSlXTDZ3dEt7bjwrRWVSeU4xaXB2SzQ0VF5GZSFTZEpMCis0PjRqb3pUQ24pejRmc2pHITBfWVpHVHJ5U15ZViNQJk12OHc3Sm92cjhSdldnS0FzOzUmU1lAbldiPjNfaVlYc1ojLSZ0Sz5QSz1lUk5qCis7S0dsbE0zVEhVajNDKj0hNGgxbj4oT0JqNkQqNTAzKEhNRzRITERIPkdlU1Q0dWolbHlfIz1QWUp9dTI1ST0mNVg9dnUhODJpM2dQYE9lCitWaXU4V3dOWHFHO3VYKDI3P3w5Rmk7eWFNa3RQRFE8Z2MqcVJIeFFudFRuVDQxaFVhZ29xRnIwSSlHT0U7JWd8YjUxdTIrYnxhWkAzQDchCit0d0RFSShwZ0ZpaGh0MXcxNDNGd3M1Q3l7KXg3Vj5qR0JlOCZOcjcxVD8hcWIzWnZlRWhRbkUxb0hJel5YSnd3eCkxSDRvYFRDUnA0Q1hWCit0VWdTNlZWKkpFQ1FTXyVkUS1yOyhZZCtOalpzWFh1UmlJazNONEdmQVFmWDZwS0dlRSEzK31mPmkrNGZhJCNqeFAteVQ/aDFqekchZ3hwCis5MnRLSCpBSGgzRVlIX1FrYD1XbG0/VDs2MWhWbEteaDBROUYwVkU2VldYeG9IPSFTR05wYGs2O041cHx4UTQmVyhUekRDSnwyaUxiVWJrCitYcSMhKnNMNDw4U35ePXopVDA5P2dye0l6XjVQNT89IWlNfk9majR5OFg3OXtEe2BXe3RAVzRfTykkXiNfMDJLS0JnR1Q+fmdPNE9PUk5OCitPTzNnWFEkVV4yO3NDcFkwdzdSZXxVMj94UCVgV21KeHVscjVSRz1oRDg2R2lTSFo7d1FMVzhgZmFGUkhCeypTWXlmWktJTjwleHEwb3BDCitpTGVxMmZoeGA1MmF0elgra3dGKF4rSWd7KmBQP0FqfWtybD5PN3FSQyNoeFZAS3g0YDh8ZTwmVyliaHdVb2hSWnl3JWx0MWclSmYqazFgCiteRVp+O0ckUUxuXktGSTNKPUZuSnd1cnF1P2pGMzY3OD9tR3RsPXBoUXd7bCRLOER0KiFuYERgTkVTOCg0d088MV9IUVB2MzVqY0kmVT1HCis5IXwzdnteS15JQGtWdkItd2c7REBBKyt8U2BPay1LMnNhXzxudlJVJXhVR2YoKGdIOz5nYj8xaD12bEhoNUBjYWpgdkVqVTwhdnE7TkE4CitZNV5VXkdlYyRJWTYyUV57PSg9UXRqYVh3UkJtPHVmI3BgNClMUiZqOXspUz41NmczNj9jKndUOHlCPzFMSWtLIUVmQjljXiRqRTxsIXFMCitrUyZHKXJJdmIoSlI3X0stLXVWWXIrUUc+QHF5NztWNnJBSE50THxuYFheIUNVMGMzTzxtKU91VTxwRXpJaThXYXhDSHU5TnFJYE8pWH5kCitQRDQ4e0U0UXJRK0dQJGNkYXh9RTUkSjNhSHQ1Nlk/YTRfPWI3aHVeN0cofUFrPERnUkolYDN7akMoZGtnb1Y1U0RDQiVvRUhvOTteQ2RpCis3WDB5dWhAcHNmXnkzRSRJc3t5djxXKnsqeWFrKV9FTElTc2pYRkZFM0hxVyNBd2xLISMqM3FHYykyQSohOSg+LXd8TSEjNmxMMDdoPkVFCitnWCZOX1pYcl9mK3tkaWVCZ0k3KmkzV25GRG5nSihsMFpwdW1YZVlWKS0lRDhNa2AhclV3dXp9KnpHQDRpN3BrUk1iZlM0dXxSQX19WHojCitwPikxYTBmejFSUjZsTUtlYz0yVF41JSVrYzxecVRWSmU4MmxPXiV1cGNaam5ObTkxNnt1bGJVUSkkWDBec3x2fTViKXJrTGs3ZUNIb0RSCis4aGVEPSZQSmk0LUBMYXl2I28+dno3az94KENkd1dUe1pFSHMqbnUoUyslWE15R3p0diEoWUZOXnxIP1h1WGJaS00pP2gjYCNEMXZHSU4pCis9TG96a1NVb0NsaW49UHZTK085IXlzbFUrP1ZBSWc5TUdfcjMzMUF7aiRnQytlM0hSRnhGSnNtalVnYClpM3xldHZBS3N4OFZmUk8qZWk4CitMOCkkO0E4fmhtJG5SMnNvJTdLQUd0QzMlMXBpZkxAcG52NlZfJFBJLTFtUWRKSnVXUXI9UylfOEhBVT5eMmNFJEBwMUBuXz57VjYqdEZpCistcz1gQjdzQmhvUTJqJkwxTW07eComWCRPIWVtT3ZvbjFwJVBfZlVuN31lbz5WZHp5PUFEPyZ4KjN7PF8rZmIyRXRWTkBSS0U1dSVFRXdLCit4LXFydDJTIV5PO2ByZD5qZkBBVXo8e0g7anctNGlnPFoxS3x1UDQ5WnlhdGxndygtOF9NbTdCYWhGQH5+ZypMJGBBRkIqaTdSTjJ2WG9BCitkXiVOKUtsaDZBWlV7VTV9T0loRmZpJk1IXl45NVlBZTlAVnUyUitWMH0lU3hSMVdwNEdJbkJDeFp3VF4kPCooP0tjd31NdUs0WV8lNDNSCitnLSM2PXk+T3ReIVc7UUsyTXctPW4rVFA7d0lSUTZ6TH5ye2Upa0BNe3Fnd3FeUzZKc1UqRW0/PyhLXnNgfU1gMmokWnV2JjNFdFo0PTwwCit0S2w9OH5pRmBMYl9mQ1hXXiU4UGBVQkszYVFfMEB+NjEtOThtcEQlUD5Ddkw5dH5WPTs0M1ZLN3pzbERjMjNWWHA9R1ErcVRTRVclSFE+Cit4Tkh0VFQkXztBMCRMQHpKQnVnbGVYdDZ9OCRnV3xJYzxASUs8KDUoUTl7YCEqbHo1ZU5jN3BzIzEydX45akVIYSMyYyVifWIrMUtPPkZ0CitQfXFhYFh2Iz1eZk1oMndjZCRYMmNsNytmNktscUo8cFNBTUdFSCZZfCZiUj9oPzNzd3gtZTVRMzl1bkg5OHVwNUo3fUI3QCFWKHIxeC1YCitHUkFObjg/NX44N0grcUtXflVGQjxHfjtnTHBIfihIO2NFeFRXS2ctJW9NYCY9XlVDXiVXM0ZCaiQ2WFBRYjRxZUE3VEM2RXh4ak4reSRzCitfITdPNnFLR31UYGZ8WUMyRW9fXl92JipEOSlpPHR6QzlyMCQ2XjczbFFyMjBqSy1OTGtRd0Y4K0JGaEVAMH1JREslXz16SzVXJndkKEZaCisySFoxTjk0PVRZQFR3ZUtVQHM5fmMlcSY+RD9FUmY0a0hefjJEMjJIJDBDPlU9MFdMaT1sRG1OVVBvVngpVVE3NTN0XnE+WGc/fml4PkVwCitBbSo4JT5XWiREOFU2Vl5kP0YxVlIjaXJoSXs0PDA8QWZIbis5YWN+Zzc2TzxOIUFCKnFDT20lWHVlSz07aEBwRjhrOD9nWGU5dVFqP25LCis1S3FxRFIyMlo9Z3hnIWc7fntabjh4e2Elcj8lYVphZU48RE0rJiU+SXN1IT1OMzUjTj1UelB5an41NU88d3A4YShpS05xNThHZCQ/YzF7CitVdlVPODhRU2tuMVdWUGxWdUVjPjYoMGZZfWdha05KTU9ScVZ4TXN3ZH53MUpHTWZJZkF7UVIoZyVncT9GTklucFpoeVYqKStQN3FAU0t5CitlOHZRKlpyMVokQGV3VlRmX0JYNilDSW1EbyRIezdhaDgzenp4ejhOMWxDcmpObnw+VEMkI1dXSHpAR2ArI0NLZ3lMfjZHOzlsO3tGP1BWCisxU09lezB4WTdKNk1mWH1Dc1YhVGZGQFF2cWVtRTk5OWEjaFFwJCZoMVJ5TShAPl49bWdFNFBXWVdacTN8LWliND5AfX0mc2pyfjY5a3RDCithMzxRY344Xl41YEl2YmYxaDNQbmFEdzk/VzlnZ2xUKWlgPHg4UHlSWjJfNThveXkhQiV4UFk8Nys/SFBkKzl6RU1yNSt7NnJ4fkRgPWAyCitKK2lsUjRwKyQ5cjFuZ2RZeGB1PU9rXkYlOHQ7NnhYTjZ5NDhqP2VtOXdoWktmUmNlNFgzMyorTWZfa2YqIz4tY013I0xRZTtMTDYwKnAzCisqYSFiYW1DWj12WUt4ZUlSQFZGbzBJOTNNTGdWeWspZT5eJD1ZPzBKJnNKb2IoVEN9WGIlIyRSKnNhKGYmIzspKTBXXm9vemgmMCYmcFVsCittTDZIJVEjREM2SzhKJkptUTM/eHo+d2U2QWlUNnBuSn0pX3NBTm5XPz4/Ny1Bcjk1eVVgRlcya2ZAJFVUMl5aQjhmN0kmUTYlPlVzcm4pCit9a0E1fnB7KUs9JVRhfUVGTnU5cW1yfFB2Y0Ypb3FgPmQqTiRGaEVVMldRUj96YH0jIWl5ZlNSUCVocTw+el5FTDcwb3lgKm9NKTlNb24hCispUChRMXY2R1ZMYFYzRng2ZkdgNFlWZFNrb0NgMURNMEV2JU0qYn44MXkpN1YtcUZ7bChsM0BtMngxND1OUV5RZnkzSE40N1pDelc8ITdaCisob0hJTytGOHZteHdldj5RSHBNezR3PVo7U0lmdEdBQ3tSQ1dGP3VXdCVhTmFkTUcycjBlT19yTzNXNjFiYlBvb1lhaDsmQkw5U3dsIVMoCitlMCRlVyVDbVArWXltS1pDT2UhKk10KihIPz9te2tJfWNHKUJYd0IqNEh3TEtBTUYrcHhzYDN5JU9xJCgtN3BEYkJPWHs4Z0lWUWF5VU14CitwWjE0N1JaKEwpP0tRRHZfM1VhT0E7Rz4yPUl7THpqUHAyb2ZlfVRrKWVLS3FgZWcjRWp8bkJzbTNjeGpNaDQwI0cyazVVMzJvUFJjfkhkCisyTD5eIUheKntuPFhQeXclRmdFYDNtJWspMCp1Y05vR0JufSQ0VGUmS3BmI1FEYmg9PD40a317PnlCKk1YLUVmQG83MF41JUcyYSZEPHw3Cis+aSN3X2h+WE85RWZNMjRzN1o7Xmp9SWV3TnR3TkVLQjFlZ2JedDtNQ3pvM1F5QipzTG84K2spYHQ2b3M/TGdsKmpqZmRmSX0oXz8tQm5rCitxJFUhOXk+a042aTB2OD97Xm9qLUd2JmZZKFNVMXNjSnwtcilISFowQyEhKVAjYHJsSE1ya08/dUhObTdlaUolK3ReMzJjSWBSYlZMQVFuCit3PGMmSnslP2JoYlFudVlYZTRpIVlCQUM1UTlKez12Nl5rbyY4KHJyMjx0STM1QnRsdW1NcWdLQF9pITk1c05vek4pTHU8eTlpdFQ0S1d2CitFT2tDPmpYRmN4RX08WiooY2xoKTg7MmlLYHNaTWZKe1NWM2RCOGowPHxmfFQwZyEjI2xZd3otUFpNQyZ0dEZuPG5BdndBMmpTZFY0amRuCitPaylhSn1vP0JWUE5OZSt7XlQpeTNCcVhRN1YqfG9IeyVUSzVJeEx+Qj5ySVlwbi17Knt1UnZhY1hFdzQ3PkNCRmllNEdGfFRjbk9MeShWCitWam9BPTEwOG5QNyQoSjcwTVRWT0FGPEZnbHhkWHFXZkFqcG05MVM5Vl4oezRPQVBjPnU4dnR+O3tLJW8jdWk4KjRTd0JCMXt5WGZpM2pECitHfVI7P29fRE40cXt8O1FXZGsxUDxeSDcta00kMDIob01sRGhHMnY5bz5ePlhRT0orXkZWUUZobSl5M0M5PFMyTzd6OEVtNFU5OTJOV1lJCitRe29EY0BCRnljclV4NHsxWkNXJGd6a1VKXitLRVNTSXB9Y2NiSzlYM21EOUAlNTdWJFQqNFkmbGIrfiVSKUgoZXA+KlVKNUcoZihsciZRCis/VVB8IStAYk5oX2o7YzxzcWtOM1k1VkZaQHFUejNmZCN7eEU3fGU0dj16SiN6SndtMEpXaWtXa2hWV2BOPkNjZz8+ZUQ7KFRtR3FkSnAmCit1Zzt9ZnhzcDdJc0ZiV0FhPGZWdW1QTGhufnBrJG5Ed3s9cDxHVyVRUSFXZCt7YlI0Mkc9VFdzI3ZfJmglK1h0QUE8SG1wU1NeTEZqQCEwCis7PkBJez1tK3k7MDlrRG8oKDVXQjwpNFRsMHc8anVnNG1QWlQ4bS1LcmBCS0h8bGdrPlNHNFZrSFA4djJhUDFZdWxPM0ZkMDt3TDQtUGhWCit9WG5QfUdfcmo4VmVCa2F4cUtLO0tzQSYrI3BNUX5UMUNvb2dHNDU9b3tDIWNAUStIZVdXUFM3UCtqMT0/bXxhbnA7NWdvQU0jJGA2RjVyCisrd3BPPjdVOGxVZyh3STAkK2hZd1BEdnkzKVFfOyV+dVVeMWFLJjRIMTRhfkdhZjNHNS1iMkd7QS1qQGV7SExTam40N1YkQSVMUXp8ck9kCitOfW5VWDdkSlp+a2RjPjh0NE0wanM7S3Rka2VpeEUpKElfY3klMW9ZZEJ1WiskNTlLR0h1R3N5TkxJaitARSpwP3VEams1NiYlUW8mKXBqCitZJHNRVUkyK0ZRIUEhWW81KkNDOFVrJikxcjh6bnZeJWM0d35JKDJ3VmImKld6Nn1EM21jfjQwUXBgan4xI1Zte3JCdSlsdFlnQnFYaih9Cit7aWoyYHV2Pj9VblJHV1NMZEZZIT0kKmo4ZUAqdWJJOTRXWV5YTShZb1MwSmE4KzBYK0E+RWVecWpnbEl5U2ZqKHNIKHxDPXpgS2hDJXZHCiteRGpZam4kdnVYMEFPdlN6WkIjeylIWm5aVX5gPWFXRHJvX14hK1MqZ0NFP1Mlc0RFOSlkTkRCSUReYF99NiFrUEdFTXhCc0ljSVchfiFfCiteJVdXejVfSXdzeFZPbClWSzNSUiRrTHohMD9GazVMa04oZVZiPTxRdWZkfVk7ciR0dVpsR1gwXnAmRTw2Tnp2R25XanFBUmBJQiFfV2tuCis2YmFkJVBIYEFTcSh1IzVhUlpyTVckM3F1Vi0xQ2dZRlZ0OzctRncrVkNQUiFUYW8hNkg8Nl9RZUEqQ311YWFjMkQ2WC1aaEIzQT10bEBNCit6alExc2hXUmMjITY9ZDN1eEhnSDxocFdEI2ROamFWLUYyUSNDaG8lVGBzaWFtK3BLZG5UWWslUWopQT80QkE+aFc2TzNwRThxVnNpUFBjCitCXiF3MFNIcXVobnwpRkxDazkxNHZJS0V4VVZMRVYrNk1aPk1neX1ePVclfGBhNk5nTEpuQz8mPCFFN1NzWE1YYmVwZCtLRFZzbGNDZD9DCitnMFN4Rjtta2pYNishczJxM3JYIysqMEQjbyhWVT1ONF9HJFpgaWp1eH18S1dWZ0xrYChAQzVAKkNwT1AtYChkQm4odzRhQzhZNXIhTiYhCitoKzQpSmA0NkVKYT17QkYlOEVvZStrbkZxZmQ4cllxKkRCYU91O3loaXFhTyF8QlEtbUBUVm47KmRpU3FmPm9CekNwN1FuTXJYazRNLWtzCitpZTw2TFlDMTNjRE5aSUJTWSVVX0BofnAoTSQwU0deOSRHa3pAZnpWTVdHalROfCs7dmRYdnxhZmZ4aEZXKmtFdXZPLT5HKTZ+bzl2YEBBCitaJSMzbCNGODFMJEomOFAraU9XWUlZSVYrWkJ9T00tVntfdiRXQSY0YFNuaCZsbCFwRz45OTF3RSFFaXdUSDMxSF5tfFdNJXBfP3M7JU0yCithSGdXMDAtayE9NHlzajs+ZTl8K3U3Vj9HYFViYz5VaUV3dElYVyQyZDVRbTZwQXg+NkdwMylAVTRwKCMwUCZkMUxfKWdCe0YzSiM3LShFCitUVX5mUnFUTDJ+MCFLNWppbkVgTEB3JnlHPTA4eSUkTTwwNmNjaj5iNWE0NmF6aCV3cTR2MD0hdlRDZldUQiUzNmJUNjI/eCthe29jJUcqCitVR25ITFdnOHtWI1BMMjR1OGFWVklRfTRVIzJsZFIpWjgyRkRnbVlTYn5tfCVZSChIJjF0MzhXXkR9a2pmcV47ZF89dTx6RD54elYoUCEoCitgOU0pX2lQejlsPExRfFdDO0poOVpVPGx3RUNNYHI2JnVzeUhyMyg9NTApUFJTMVJJdHBpRmNXODtYUWl1ckFyT1hheDRERDdATyNISj1sCit5RXtsYyYkUEdVKlVOMys4OSFEQHd7Zj5tO1krMFF+c3p7QCghd285SkpZPDA9cFEmMUgkKFZyeFMhK1AlaHR0Q3wjK0NIZE1WbTs5dTFtCistQ2dRJiptaCF5N1BuN1c1dVBwMVlwSXVwP0MmKVVTY2Vma3V0Y0VFSm5QTHRyTmo+c1NlaGFjcXtIPUY+NWpSVTh0ZmkkYVhBY1IlTDlnCitFaz05eXtCUzM0N2ZWISs9U0d6NSlIeUwrcng+JGAtZDc5NF9wTj01R0RUPHJ0LWVoN31JWWw8bHlCLWZpcUdlZy1DPWAjaGd6WGQkMFkmCisycXFgV3xeO0dre0sxRl9KTnNJVHR+cWZXMjx0TytYO0IxRmAtaSlZJHFXWSthUy0kRis2blpjPC1kY0M+SUQkKyFRI0FAQnk8KGRqSU5eCisrcW0rRFoxb04/K3doSytqfn1JQ2smdVJEO1BtM3oxZ0RMYVMoS0dkWDdecylWUGYrVWI4dGpmcVMyeX1RfVYoIVdeey1nT0MxekFmVWw9CittJHB0TzxZX2w/QnFnV3N0RjY8QktZb3pQVUAwfFB+Tlh3ZHNxcTkkbTxDTio9M1VxYk4hSColQSp8N2dNbXs1YU1qaSFTTmNRMVdnPUQ4CiskcDh2QX5EczleMGNufVNLWjhiYD9+bT9PbVdlYUMzPj88clcrbyMtU3ZhSXNNd2pQLWc+XistbFEmJXBgS3luX3NTXkU4VUh2aWVrPDg0CitIJF5BUjlyUT9uNl9HNyo8MHswb1goK1NgXzctNSMlPH5rOCliVE9RRD5GdF56IXpoLTt2byVva2g4bmkpbzBeQiRebzlHR1dqSDYrezArCitZfGEjbWJpIzZ6Oy1GbSpoK2Vlb1NNZSRZVXo2Iz0kTm9UVnozcEZlOGlPeGtrPjlXVCsqTWM2Xyo0YTwobC0qOWJ2T2RNM1NtZXd9PkUyCitROShhWFZAR0Fkb0w2WWVsMT9haWxFO1JwMm5gRlVWPDE5Pkd4eWhNTntRMmhXYFQmI0VgQF93Tnpfb1Erb05GfmtCK0dKViFGIyROPH5UCitPbD0wSC1eQG9kMDxTVHp2MylAZUpzLXNAeiRFVm8qRU49N0NJVEtDSDJfLW0tSWlrZCUhdFhqPylHanwxZSh2TG9xSVJBQkQyQyRzcjErCis7VXpaOENTMWg8SkxYenVuOzhLaVg7YExlc3JDdnF3VVJoMCt4NE0mJC1qdkF3WHg4WUQjPEZ6QllIN0JCY0RXJmBqQn1yaFJoUTY9Ty17Cit2WjtmYUVHOGVjaD4oSGhFdDkkfnZGOEFYM1dhaHpyTGdkX2cxT2loLTJVQ2RfPnJOPik+TExZN2VZQVhsPyZITVB+YmU4bV9gUl47MUFYCitRdyFqdnVNflJ6Rjxkfk41VH5oM2FHTiVfe29tI3MxQT55Mz49Qz9QUzZwLVh2fHlfI0d0JWhrNVMka25ObnRCN01XViZ5YSs+NURjaUQwCisme1Y1Z3AoPWx+eXpEYjtEPz14bigjaXVQbHBVPG5DPT55TENUMVpad1gqRVctOCQtYzFNS0J2QT9obXlveHF+NCQ7K1UrQHUpMEU1QlleCitBSTdNSVVlJmZyXzB+WHdHR20zJTtnIWZecEchcld3KCY1bFcqaTRJa3NqWGxvNytkdiQpPUFQSU9tQ2I5O2o9WlAxfFpUbTxwTTQyUT9xCisyYWZLeUxecCZuXlNCaHM7KWRDUjBLPXNaOVdeZiV7SihJYGkyVnhudmhfJVJoe1hPI1pibk1jT2Q8V24pN1FUJCsxTnhxOFUrOS19S1RpCitkcVYoelozbm8qQCQzTGhPQmE+TFhlbSE0Xis8enZPbDF5PSlXYnhDbypWIzhTLSNjdGZePUNAKUpDI2pYbGk5dVcod24wYWVZaypWOT1yCitqcyo0TUpPSm9pbVNBbDluRFdQRlJPfiYxPiRLTiM/eCpmb0x4aztIITFVNVo4OS1OYVd1d3dYRk01a2tSV2F4WFFFYGduIWc5d0EoVCV7Cis5eFFDTTd9RncpSXRxbVQ1czJaPXlpd3R9I2lBITUrJUdeS0JnSjg9JERfUigtdFckfTBoMHY8MEYtWkhSWnx0U2ZaVTZQU35lb3dPaCsyCitjI3Y/YVU2O2pBaXFPNFA+b2slYlItWU1ZbkZEWn1BMHRtUWhkJlplYnFfJnF0bHVpQGxUX3FBeyRaWWlhNDcwRntHOTd0eVhmY1lTeXM1Cis0WWdDUmUjKShGWDRJTGtfJCN5T2QwKEl9e184U1RfKEotRlpGajBJfnBGTHBaQkBnYXpPU0R3e3FXUXVveD1RQmBgbCElIypTVFJFSGR6CitlfDhuPUVze2ZnNXNRdHRSUThsTn1gcm1xYTMoeTE3QXZFbThvSExgb1JCdnJyQE1ZdCpvOT9aNCFXKE0xVU5OR29uUiRvWCEzeW9EX2g/CitnJm9TMUlWS353LXpQU2VOWkp4RkJOaCVzYkhkQDE7VSFMSU8ySj9TQEEpSUNHTkU0KjVQSk03WEU/JFpGcVdrYzx8JmIwOTg+bUFiT0xACis3Wi01YHhXfUg5eEtGYXghSXdVVkprTHFkUl8pZjZEYlNKIWVqa2hxVWFnUyRzfCVsY0Q+RjJJbS16fDkjcnBSTylUWVRWSFZjdmZJOW4zCitvUWhFSUI5OEtwb3FkeUgxTSFEYyllVW44aG8xSUZNIUFSOGskPDtKOXAyREw/KEIrQ0NwblFJZ3lLUX1TS3BffGJyflEkbDtUPUZLd2ZWCitURVZQWnF9PG5VXzVCPHkyOF9HYTR8T3FIWCM9ZGVHcEBSbEE8eDReQWA2cV5hSVh4dnlMMTJZRGJ4YXp4fmtYO1NRbTF4N2Bma2dYcitECit7X1lmcml9emFiTSQyJEN3WmdnVFIwendNa2w+c1k0JlhIRjhoJURhbGtmLTYqJj51Sml7WGp5Kj87N1ZQMn5XQXQ4VT4wdEJPJEQwTTVPCitESzA7QEQofEhBbUlrWXFZa2dHeEMwekE9OEh7RDBrVjw4ODRBNjMwTWZNYWlPQTduVzkmbUtzSiEtRj9HQDNWM1cxPiUycHkqUStyJWEkCitpfnl2UHAqbUNlP3ppR0x6dWZUeFdKYHc1YnlqRWViK1J4PEQtcUQhRHQkZUNSazNGK1pebjBkbWp4NipgXmxTWClvfDVeOV4kSChHKnhuCit1d1ArJCFePG1uM1ReP2F7JjV1NFphNlFnaUZXaEJaT30kRFg5e0F5MiRodFI7dEtSRCFyPEoreiUwRmBQMThwYjQoTXRsbUYqRmdNcUZuCitwZDM5TUcwSVhAVGg4LXlUUjFHVnw9KFpQIU5lTk4oMSVZK2dEJE1wPlJZY0gtfGhNQEhzZDR6RDFxSVhYdUk4P3VIUGMyJFJiN193e3pECiszRzNwKD4pVzVlRXVvQlU0bmA1dzdwd25YREZAT1cyc0F7X3dYNj9CRWZGPX16dmEwaCM+ZGFvYDhEanZeNU1xPEBuOFRiQXlyPnNWPHlNCis7fGp4elQrQnxobGY2dkpReVA+bjFudiNBZS1JSnUoZUtfQn0pSkVxSGdDSDQrRGIyTHMpPTVUb21VYClSQiFKdzFEZzN6PjZiKSsjelVxCisyKj5QSlcpbn5hMjVJK1NrZSkkTkRPRVBfbn40djc8RVh+eHtXTG4hZzJXa1Zmc3JYR0IzTmVSeVV7K2RldnxhTFJ+SEBEKGB0fFQ2KXBOCithTkpDK1BgbkdleDdNdkw+NSFjTSpBMElnNyhpP1RraENrYipJSVd6S3o7LVVWcSUoPlMxSmQyQkQ+JXBTKG43JDVTb3pSRzw8M1hJcVVWCitAb1laVT11Wkx1bXhWdjs2Qlh1Vnd0eE1pTWs9P1prdypJTn08cl9PWkdRKkpjYzJLQ2leWmhiUnVxUkwzJURgWGYoMntIPyZra3wqLTR1CitgSCZpZGlfeytXSkc+eHZgSHBKRGdjUGQzQm14RUhZRmQ9NDhRZHV4dUBmSEBDVTBxfC17KlNtY0ZkQj57YFkjOWNqRURHRE5GI0N9KytJCitOUGtmOz04b3xSJCYpVl5IbEV2bjZSdmFFJkd1P0opbTBhaHNqey07Y1NZd1RISG55d20lKT5ZSDElcSZ7fDV+My17JTROWitZfVlJZXhnCiszXjF3NFRqI1dha3kxeE0haiszWUdTek43YnshdkJOQEtMQlQrPTAoVDZaQitrREN8fCsobFg9Z0lafXhiNW9pekMzWSkmZ1EhUnBiX05ICistSmlQa3o0c3B+czUxazc3KSk+T19VOSV6TGNnZmdmeCQtUzBNa0VVQENsUUNhRi1nVTMwSX4kdXR0N2c+VE4lZktfaTB5SWk/fEpWck9RCitGaV5FR0xTYjlLKjcwNlQ0QD92T1dxeklNKmpAX25Sb2k2SFh+aH42LSVGMD1GZmJzY1FgYUk4KnNIPylASyEqRmZpNUF8RClPPHJhNT5RCis/UypeR2duVFNefG9QWjB4S3l3Rl83KzYjKDBvKSZxfTlfbCE/VXpFTDIhZ0Z1TipUO1JpN2cyVDJLJXlfUWRiV1N5cHYpfm97dXIkcTxaCiszK2FwXjRubHwpXjZVNC0qaitqVnskYUVvMTY7JkJOTVp5OE1PZE90WT1XUzNpPFUteWpRJC01NFp2RXk7Z2pNMSM0LU89ODBuRk98JjVyCitxO1VGZm01aFRnbk9sRWNgJUdQfFd7QzA1X2RCbGBxTWAyOCgpWHpmN2gzciRRX0lBSnpGZzx8RCFIdDc+QyRMeHh7ZV5kdiYmOXV3VG00Cit8diZONXFOPUdrRiY+Kl4mYzA8VzVCTWJ6PmxZbVM/Y24ya2hlNDtyXnBRSVdhUUZ5YFpMJXV8Rj9UfWFmPjRjbjUxP1BrXkk/PGVWemVzCitIPChteCh9bncrMGdxXkBpNzJrUFEtZTZJK0ZPXlZodHptTTtQdnJOYj5JI15YclE9RWY5U3lEWEooMFckMVE1PGlyOSFXJm0pfSpCYiZXCis+e0sqMkhMcmVBOUpeRWVAdCtObG0kTitBIUBFRlREUUJ1eF9WSXY4UzhHMTw5TDEwUSZFVkcyPXh+SCg0MVhHcG5fa2V6dz88JWhwN1lRCithQ0NKRlVCP09kTXNyNy01RXE3Qk9qWXM2WHU1VEFaa1lwITlpZnlJc0BBZ2RmQkUqaylTTElJJHR2cnBePUckSlJJXl9CLTVEX2R5IUlGCistbUwqK2piZzh7UCFeRkM1WWFJM1BGdTtfSUFeVShKUW0wQVBHR084dXxuQSlNeygyKytBezQhWFEqPE1NdVNsaT5Ve15eKkB3UGJCd29qCitIJnxYZHhxOyteVVlXY19jZXcyfUNecEBZK2ZiM2BpbHpyK35uRG1EUylJWWhOb0tKS3pnQUV6THt6blAtSVpBWldqPVohTm4qfHczJjN4CitKfFlfXmJebyFgbyk0U0JRZUFRSlN+PXQtTnJFRzxLWmlDT1AqRVhoUWdLdlFOYihCbVI1cml5YSZzM299KmNWJUw2R2IrbjIxfD9HLVYlCismQXJpQCRoJDh9cnpkKCkyZ3lKMlM+RVBqZmdfI311Qm9CTDF6TGJnQmtEYnk0XihqPnFFOUYqXlNwV3l1SSFeR2NfdTcmU0lmIzd6PUBZCitnV3s/b15NYiNtNUFrdnc2a25zUFBFe0ZCSDM5RTdPJihQZW1IZUBjaWxJOFd+eGhlUDxpI0UwYDNafUdHIS1oQGs1Km1Fd2FxUjhLSHZ0Cit6eSQxSm4+WGEmUkk7WWplakRXSldlVFk0S1REdFdyXy1WSGY5QEVJVSMlUUpjeG0xZUVwcU5NOU1wYWsmSWZTQktmKU1LOFRebkZGeGJiCitCb1BKd3ZFViRkRXgjQjlTdEs8UH0kX0pzMGdmQC04QSRrRTspNTVUKVU3Sz1ld21jUkxMTUN0THE0dFErOVZtfGhONn02X1I3SnZDPGlRCitRTmxkPGVje35fd28xR05iaFlsU0JoS200emk+Z3N0c0M4Q1kxV149WjNDNiU0ai11dWNvZWZsWDBoKUkkVUohPEU+OVgoWDNCUz83JVQoCitXQE5FJCgrc1d1KFBZTmFaNTlldkt1eHlDVXQpYWlfN1c5ST5RO3VEMGYkNCllJWtpfHVDUHU+djs/PkpzNl5xWHBnPWg8cUxTZ3kyTz47Citib2hoRUJLYzA7Kl5FNik+NEpDUEN8NW5XVHx1IyRQR2VSdkJNLWQ0QTY/Pl5XbTE2Nm56UnZQKF4hRD8+LXYtaG4pbCVneGEjd3FhUDhMCitqI0pDRCZTRSNnQll5KVJqdGV2P1YqITcySVJqdE48TVBqPFJFKU5KSGBUYitOO2x8QU8/Rnxfd3IhQkB5RV8qUC07Y3kzI0klOTxoMVEtCis9RT8kWCVqbk4wfD5IdXZWJkR3WHVkMiNKaTROaUhyelFac3NFUUUjZVdPeSRlclN0ZiQpeEYzUighOE9DJXZoT29fREFiXjMyRUNIZ0l4Cis8Y14hYUwzUTRlK00zRWU3OGNhdzdZbFkqa2gpaURfNjJicz05NEFwfS1SfV9hXyZmRCFhX2U9eGc8VUc0VHlOKEpLMFNAR01pdytyY3g9Cis7cUROeSktVzRzQG0oZWYxbjhfPSVYaVhfPHMpMjFZJSpVfE9zVFZlYUAwTkRaSWNoK2pMK0ZtJV8+UW9rQlIzPXBKOXR3OCpfSk02JFVBCishN2A1R3spLXl2VU9GYlNkMUFFanlkeyRuOE1YO3gkMEFTSyU1SlFZYig1fipiTiZMSkpOcEQmPjAtQF88RS0+I1dIelQ4Y3VAfDkqaWZ3CitmPEQjZnhqNH1wYWteMVRCMVIpdlhPenQrKWV0eCtqJmRlNSNZS3lAX2dOPnphJDtSLTVAQXY1cWtzdj0oUFFvaGloVHJHKkZYPVY3bVlXCis7XzJWMEJ0USp5ZDhzMWRXQXNxKTxlRTNTI3BtPT9QRDBPWkZfbV5efE1NNyhwWDZ2TEl1N3oqMkRaX1lUXmwoWXVCcHEwR2gqM15+N0AqCitebV5NWDV+TU1zPEB6U2VoQVRYMEFUTSh8aFRxPktyVUJXMFZxR3A5UTsyfTRsdGw+KnRTalBHUzJNKUR0e0JeYlB6JihKUG8xRSpSRUwjCis5PFVmRzdyOWpQTy01dVdyZWFfZWM7QzwtfkQ+SVc4ZDJUVmU2TEh+JCtCPWszWjIqMCRIRnNBeEF1Vz1FYHlidn5wQGghRndoalVHPTczCitSMHZgKV55IWc4MmRuR2tkYz9RIUA4STM4TVgyNG9WOEpzRHdtdHc3b1ZPQCUjOFRgeV42b0RPfVQwekt8Jn5TaFNjfDRsT2chM3M7PFROCitpYFRXe01tZzhfQ0VeRnFhJmZHKT1hfFg/UkF2ZGVCNmglI3Y5dkR2YkAxdUE0JTBHO1BpajZ7ZVlxam93dyspalZGWSg9ZmpJZztBI0QoCitjdj8mWGFuKjt4PnUtVDVWazEmbEBDJlNuP250VShBKjhaZDIrMXtEPjtUJCkzPUZJQD5QIzk1Pzc5dW50QTRxRD4rKzE+ZDVpU2dzPEF+Cit9P2VxQnJnLSZ4RU9LVVY3SGt2UlVvaChifnVXN3JuRD9JQmszI050VzJoRzlfPzw3QUNzJmx7ZEUkaDdAI3QtX295R0NKdSV7YDxUfVYlCis3TTxCRkg/VVZPMEZvJVhQPFVRTkB0Ykl9WEY3NnA0bjJ1Tk1YeU1xSzJ8Pj91fUlIZiNESnQ2WX1sIypwZUxoSVE9VkFxQ3JwR2xlSTZkCisre1JocmZPe2JFPC09QXp9Ym9ZbkBrNjlIfDRybT1IWD5zYSVyS0JeaG5JRHZCWkImOVdoPTRHfUsmRiRrRktPbiNZaUhudV49WVdJITthCis+UmcmTzA3WlFGUXNUYHMxS0dNfEA9KT8yc0kpPT1nQEk2eD9aa2BXTHBYR0J4VlM3JW5HbiRLVDNpTkUpeH44fFd7VXxTIVVHZURuVVM8CiszaW4/LTskWi1lckgpITN7bXJKVUdiciRkWkp2Snp8YSFHTT9Men1APnpPZHdjPkFLcSglNTFOO2dsSSo4cWRDPF4pTncwYlo4XkNlTWxACis+ZmVOeHBFUGxVS25OeGgpcjlsYHg3Vm08UTswTE1FVnJhS0R5YnIkOU8jWiV9Zyo7aEo7cGV4P0BPRDdiSkg4XnpEKENtfWdMfldKSlVwCisme2xPSjYkMCMoPz55YkItNzJZI249fVBlNmR3Jml2PTZ6cV9GM3pYJTYxYGhPTSFTZGE2YyNYeCg4VlhmZF9XNDFXYmVgPmEtTSYmUF9FCitAa25DKWtoPHstTml1dnZtNHdEYE9+KHo7YDRNR01JYEhRM2NsUXNrOEtkOUcwZmhgZHFCI3xNanpvdypNcjdZK3ImP2BtOz05YGlBNUx3Cis7PTAkdlE8YjtqJlErVik5dm5mP1ZlOFdQQWRDX3ZsUnlnTGkpWj80R2UkRSZrX2omX3ghPTcjVSh5STk2aSFlQ3R5d0N0TUxeLXdpYzx9CitzPyNVSHlGdCpQZDJKUms4bkdQb2BweitGSGpLdykoX1NLV1R6UkZlJkl0T2Q/YTgoLSYjVzU4cERKN1Q2OTspaWFCKD48V3VqcmVjVyMhCispTkRsMER+ZypPPCZJZCF9P1IrRSN6elc+dmsqQXUqU14yUEhQZT4oRX45eWVLQzVEVVhmJHk1ZjNDMHJncyFPRTJZUFdKJStCeUtZYWpNCitPPzA2K05tb09wUFFLV0MhOVNrNFBldDdgRX1IRTQ7UmZ5TFAqYVIwVmtJUn5+bFlXWT9wMjBaM24kdXBTU0ZhbFU+fFFJe0MyJV9TRjVCCit4Zjl4aUM9P0sjZy1iK2hLYWU+YT4wVFBANHJ3Y0Y3bn54KU5OZjAkdnhvOEE0bjhWdHglP0hrfHhrPT92S0tHbiR8e3NIRHsmMVU2e35YCismSzREeWkzSVc7dSZufl5vKVRGZk1obSQxS05Ud2tgazR5U2FCKXZxZnYlU1YkWC1IOFQ5UHA/czJTPG9sKVBqUUMyVHFlOERXTTd2QkZFCit4bEhMWHtqcW1ZekUtKDl5bVV6dUZiKSo3RlV6RjVoPnhYZGVtI31TanY4ZkhSKUJaRWJSd3ElZSloUWJgMntgNEJrJHIrOTxfYkoySlY1CitnTE5KYGU+bXVyPzlGWV4rdV9ORipHXlcjZVBBSiVkekg+KDhpJCp0cTJPTSgxTElJYVApJlQyWk03PWtHKE8mOSFYPT5BVDYqZ3NlPVNOCismMSlmWDJPfVh6JTJGaSNNbER4SVhVMD91dm94SD5gQ1ZGPmJVQElDVyZPLVZLVXhJb1hzPWM3YlklaFhRWFI7ZnE/JElhUHg/cWYyLSN5CitPR3A3X2d1PjVWKD9mbzMrdl9YOFZuNjBVTWx4azB6bDw5SXpAS0kqOz9KZV50cEJtKHgxc2lDUVRDeWluIzZXMih7VjNNaERWKzFXUUsyCitJbl5waCRLaV5AaGNGYXRRPHs2WkBDYUNBRGtvfnVtNzJlKUctRjFFYEFDSXtSM1djT3dnRHY2I1pPcH1GeCNTU0hjZnVXPFByfGhlNFViCit2ZXcyam5YfTA1NU90JSZEXmUkSF55bV8rIT82PCQ2dX5IMjVKY25KblhnYTtzSysjK15aSmhNV2I+SDIhaC05d3JUQ0F9QUVTLTwxe2FlCitnJHN7M2J3YiE7Q0NLPll5RUQkSDxSPHUlcGFsfFdrQSViNHJ9MzxrIV40ajxxKnZZWWBaRXx7N3hTMnxhWWxZVUB5Qz1Tcl5kflB5PzVQCis/e1l0X3REczJJSTBGZk5pe19FTWs/bEtQfmF7S0hCST14PWY4SmBUKmZ+alc9cmR8Nm0lfkkoO2Ble144QzBLUDd+N3xMMVNzcDc9O3dICitrV2lJYHt6XyRSP21hIzEzc2VKTlR+RT9maFpGeGd2bDspSiRzTUJhVSNFeUhIR0xlc3d9My0zc0BWdlNVRj1fNW1Ka1F2ZWJ1RkVmXi1jCitiSG1NUlpuY1IoKmQ9V3hNJW8mdENgYjdgND9uVlNPXlNhRTBFSHVyOUhAV2JwT3ZIIWhyP1BAaERFP1o1QE8tVCUtZCUhQWJVeV8pSFZ8Cis4cntHRHNrKk5VfnhATD1wR3YoKzt6XmswRFQmYGBvWmhOckx0MXx6NmNxdGhFK0lLclpaZCV7MnVXWkModyYyckswTD80NHxLR0xgWS11CisqKkM8JUF5empeKWJVKiVGaiQpM09AQ3NsRHNuPD4jdVRBVFZWK3l3e2daI2tDaV5fJXpIMU08dyR3byVSKWxjIzUtRzshfWIlWlFITHcxCitfbiYzezQ+NzBIMEtOUHhIYHx6en5jJFB8ZXpVbTBoakc9Qm48JUFYenVYUkRyRSUzRk5nPUh6a1Z1RD4mU21qLTxNUGhYVGJFQU53ST1lCisxI1hxdWRoN1FCd2g+U2Q1R35OPn1OMUE0OUgtYEdORURla0t9Um5vOFNDcTJ6PSZvXjtgSU81YTdreDYqTD87JUJSOzxAS300fVN7cCFrCitfUCYjZnkoQnViVWB8QUM3dSNhaW9xT3d3IzlCQCpQJUNeKTtoI1hlI0tJa0k4aDR8MzsmM09yO2xWTkA/Jng/T2A0Sy1qbmxPMFBPQ088CistdldSZHVNS31INjJiQXpOejJGPmVOdlA+RzxYRj5ibHhLflk5cGN3JnFsekUzYyF8anohPU5AaXZlXmpGYkh9aXlZUFBYZz4pUHwlIVpZCitYaXUpWGkpd3BXRkpebzs2Yik4Oz1SJTZPV2FtNSFMOF8mRHd2R3NzR19Jbj9EYT04aHBrb3swbnwwU2g3SDBwPDMrKntARV48NkVzTW8mCitqbHFfeTx3SWJTaVNaSilqempUMmpLKkpZVkU7ZnMhdj1INWBlR0VSYDlQdHFYbSokPzZPZzRhVHpMRiYmLVIldig4WUlwfnJyN1crTGFhCit2cj57KjcrZSVON09gUmQ8Y2I4dH13flN3Zi1Odz4lfCY/clErNHJxSH08UHdDcElYan4lPF5kJTAjaHMtYV9zOVRublRncUlXWVY9aE5gCis+MiRrdGdqaytyPmNPLX12UUFELW13RVVTTGEyMUs5V3pkKXB5MjcmOUdRT3NsSCl+RT9jWG4lbWkoMnFPaiFtP0Y8Vy1gakQpSDFwfTVkCitkQ2g4I2EtcjhEKW0rREJFRGl2NihLJUtmbVctOUU0MWN7NEgkcTRpPFV7b20tMiFzeUI4Q0U/N0B8JWVZUUBPZig3TUsmYjEwRGE/TD17CitDOHNMWDkleEJ1KntLPnU4OXVxWSQjX1hLNjRNUSY9ZXZfbSNAK14lMGNmPUJaRWZFTl5Ob214UU5NSlpScWI/cX08Mm0tWUpqfEUxcVNiCitUQU1mbFZ1ckRgJCtFZkMzRDVPXihFNkA7MUF9cnxXdV56eD9HZD5Sd1UqYmd8eVptcTJNNGIpMCl6RF9oS0xqbnFCNj9tOVRfNkhYdTYhCit4Q3ooPkpVfis2KVM4TTUxXnBPTSVzZzslZ2QmeDR+bmd9aTFuVll4QyU4UV9HUHh0ZGRsOE9tM31GcW95MXJjPCl8TWxlRFolRU54YzAqCitqJFFiZGhrRkpQSWpwczY4QlNadWNUM3s7cFl2XlNUQGhWN1B2NHZ6X1NxT1UqO3FIRSlCPWdZVVBYT3ooRCVwTTdlMih7MCY1ZmFjK1NoCitVJG45REY4OHlwUnN8ajV1Mng0RHx1RCkkP1JXMTF7RUpaI1Axaj9CXytVUkZgJHU4V3tGY3xjb3BQYW1Xe3tERz9HP2EyKUJtTU5kY1NtCituZS1vRSt6X31lM0RWTWdWKmBxUF9OTT0jJFZlLUNadz9+fns2fEoye3ZucCo0ejcjcT1rQCpscj5eZEctX155KX5ye145dWIlajM1KGE4CitnNCswK0xYSkN5Sno2NjkjKlNkYmRpQV9rUTMwc0RoYz1NUmxjPWNjSUJGN0VmJjhkS056VWQ4QTFjcW85Snk2NDM7QyZMezZ+THNmb29zCistSGRAZSRPOTdLOy1AbGVZTk5Oe0dMQWBLSVV+V2krfEFmUEpvTHh4eVhCK3o3dmwlSWVzYSgofmBONSt8PlNFdkBiWGtwS05ST2Q5ZnpSCitRUFNKXm9INGF9eXBTWEVfN00hc097cTdXPVpfV2lzWXBvKShzVyhTOTtOUU9RV2xpT1J5UXxBPD5WQ1dBTXx9ekJeYSZxNiExT2hwWj1mCitjMm1kPWVgMDRTJWYyM3kqYHkraDgtRGhqKFhDbVV8VXBHdG9feEA4Z3Ewe2Babn1fYmhqNnJsPzZoSEFYKEB4PUhtLU8wclNKNDF3UXNUCitaMzIwUFR1dyV6PT0xaWgtNSVVZjs/X1AlP1lZYlE3IV5iX0RXWH09WUt3aX5IdEkyeH5YRDZeJmRtcnpjaC10NkMjWHpvaWdsUmgmc2JHCitlZypYO1hZVjEpa2JtbEtDZ24pJiM0VyhQVjgzMl9zYCZ4b0Q0JFpEZDBmRF8zYGZfe3E4PWNhKFltQWE3PmJpaU10fkxrY1dHSURoQjReCispVWclakx3VjlpPFNtcE51aTs7XzQhcCtVKzQ3Xj5nYVN9YFUlJjMhM2pvR1MpJUR6NGVeY3NWWTB9VT1reDUpOVFFJHA+NE93dlF9fFJ2CitPMFAxaGU2QlUwYFYlVmdCUkdQV1oyR017bU04N14rJCpNXmojbWY2KTVCK0g4aTJIbV4mMDhVdnxlVHlHQGszJEA+Nj9vMXJgZGxyaTkzCit9ezAwbyo9TjxQTzdSe3ZLdHE8ZUN3ZDBFb3VgcChibilOKzQjPV8wbWhKIztEaiF1IzxwOG1UaCNXSit0OD93PiR3NnU7WW8hZ3tSY2xTCis/Uks1dSMxQFohZ3U9YEEtP3B3VFBDQy1KO0BUUl9UM1RVOTY/ej5VeD4pMUJCNjVBcWg5O31scCVZfTZBTDFAcDElcz5wQjFkWFJhZWwmCitkMG5RYn0kJSloSVhAezRoKWphOGM3Y05GLWxYWVMpPiVJbzRmbj9nPndUTjFraGtFNHw5QHVlUTw0aT5Id351OWhrTFZ7KmdsUGBqYDtpCitOX2M0KThDWEooQzRKYkFIRGZuIWRTMz8zaC0jNHtrfGNkaExHMHgzbn16RDhzUkUkKm4oZVQ3RmRGZ3tkflVqPCkxYT5xIXZrSUtQZWZYCitBPG9Kd19KbXpRSTRqQmtsJUdjQ1MmTiE1ek4zNFMwIX1BdSY/fFV2bWVvOThfP2QkSCQqYj8peShnPFpzMnVoQlV7PSgjNGVII0FYc0FxCis8by1eSGJoPXotNng8Mzlodz1ZcldeWWp9MDtOQ3pGZjR6YzE1Nm1ifGkkRytpNmp3XjxMOTVaPSR0VkU/K1VCNG9KYXo1UUxPaFZkVXNWCitnZEphb1JueFA2PTMyUkluPCRhZFktYH5QPHxSclAoYTFXbEtuU2krMWpKTTFUQ3I7bEN0U1EtZ2tBP3hab0ZWaztOcDEqQT1LSzlNMF9ACistPDh3JCsmQ0wmfUxfZFZ9N1BUdUxqT0gqYjFUWkt3bXlQWmdTWjZaWENaMWFCemhGVkVIK0BpTjsmRVBRY1ZjeTJXK242V2lQK1E4ayZiCit2ZXpRQzxaKXZ0RFN0QWQ9Y3t7X2ctOU9sJnRQeE5AeF5IaigzbEokTWBMfDAlWDE1dXh2VzJ2MEJrSjIrTmlKd2N0czU+LStsb3REX2IlCis9dDwoelZEbzN1SkdyUE1qOG14QXtkTk80bHMrZDlfZ2hXNk9XRGJiWV94UFF3an5Maz53O01KcSpASyZobjV1NEhkRW47Unx9LSNucUVwCitDQ2NWVUwkek9aSDRFXkgobUZ6UTZUTmIhU3tMITxzO1YjTkdeRzIkTFh9Q0Y3dE09KktZP3RUTkIxTUxLTlpzTElxZ1dHamR+cX1MRSM0CitGdWxRZV9CcUR8YVo7RClNJWZQZWxBcjVISXJgOFowcGhzajVpZSFkTnckQ15mKGptT1o7dmZLUX07UEdlUDxGSjV1e30xcmdKemZNej16CityLXd6Nj5BIyEyYFlzZnEmXmV6Ulk3SDRRI2NtdGllcEEwcGstQ1FhQ2VrTEhhPz00PW5ucjs5T2RxJF5PODxMd2R5NCkjX3txYiVqIzhSCitXdzgkai09Vnp6ZVNfV2NQYmxiNz1JeWclMV9mVDl5KEZlcloxZXNwX3g8NjcpIXp1RkQmbUg5bHU+SE1TJSk7Q3EpZUxgelVDIz1ud3tHCitgZjNeYUJpST94ciplUkdBTn18bmF5VjBMc15wcDR3XlM3ZXI5Uy1eUFpnemlFZE1+PkxeIyo1KjFfREN4Szg+UkVVbSFEc2FYWDVKSEJhCit3P0ZoQXVwMTNANHc3ODREbTk4cilKM1YtVWFxK3ZAajFhKTBJRzxQK2IoaHc4S0xYZkxEMzFtSXwwd34pVzxlVT1zI3Y4SChEdnJ8RCpDCitMfTNMe0Vad1pBeiFYcCZkP0l3UXgjbGt7bWFLdlg+WTt5MShDcF5fPzQ/P0szSDdNWGIzalRNKCVgeGZCU15mM2JqK15RUkx4bjhteHB0CislUVdxUGlVVERWPGBKJE5OIVlJbWRXYzFlYTY2K0FHJFNsKEtFQ1JvVkdlK002cF5ARnBiaGlsNWQmRjAxSGArN1lnQjk5PER4JmkyPXQ3Cit8M0p4ZiEzaiVyJilkM2ZEOUN8Zk1XbUZiIUdSczk2V05mP1o4dF56REEhTG03OWIkITY8K09KbER2ZkomNiFQWDF0O1MxNXByI2h1QURyCit3V0t+SF83Ryl2PFN2XyQjYnVYIyViTDA7OypRNXA0e2NMbCF7fWJnUCRJSzBYe18mKiVwd1pMM254cCVRWks0WWJYPW8lOFV4fUd0O1hvCitrWXB0dnIhWSY1cWJHMlUmS2k2MXRNbTx1Um5Za1cwQClvK3U7S2xLe09IaHYlX09fXkpxcGpRO3R5fUVHZGs1fm5EPj9SPWhXbU1xQSkpCitNTUAhcXFAOShHT1EtVFN4NHVmR1lSPHZacHR1VHV+WSV4Nk1BMmFec01EV3VnTmMydXFDUThoQVBVV01gR0c8UypsKFA9aVBQck02Jnt1Cit7S2BjO3ZwdSVNMyg9eVh3X3FvNzJONVhFPkgjfDNrMG0kckplRFNpb3x3Z1UkUEo5YD1YI1lURTFmYEBNRzR7KVoyaW0oS0o8bjRXTFQyCiswVnJpaUxfPCMtZk9lTik9TlBYPEwhOThTdTlOS29ifWJiPWkpUyRSalomY2wrPjJ5eXJybHk+KUUxe3tQOXp8RUNVelBnclZrX215XileCitoYC01ZzMtJmpEWitEdmVORGhmRy1RQihtVCRWSGdCYUhTWjZNaTs5cE9zJmBmIV5lWFZGciEoclV3eWxYaVgoeHtyKnNldDtSRStXeX5CCit2KlBYNUUpbV4pZyVafUJeIVokbSpeLWBxbytpNmp5Zjgyc1Bib18/OWpWMURTen1oaG1tI0Yre2xTZm5ZejBzaWhfb0BhJlFqTlIlZ1pGCistTWVgWCZAZT49TGQ8aiFlN0BzM1IrZmkkJHo3ZGk+V2BObU5HRmlyLX5NeWZCZjA9cXtmO0RgKEI0bSlkQl4/RmZtLT8zMXdAelh+NFkrCitDOyMjfGk0ZDQ5P3NeWj9uRVFfKzJqYFlCU1VjZFA8c3xPSEgrZ1JKK3VoWURodVI1KkdLT1NAKilIUW12aGc/KEBePUhyOUVaYSg4NiYtCispb3hzbTB2dGp6dSV4YzZKUSlDdXpMKDlPN2lNbWIxZzhUVnBDND1AYEJhY2wqWGttST02V1JUQkpWTnJ+dyomYExFX3R8RGskR1BzOHBOCitwRCQ3NFZOOUl9RX55I3hVUlMwK1BDO1NHUiZfVEYjeClgNXh1bVc3bzBffElkaHYoKUx4fjNfe0k/VHxgPTtPUGRQfSk5eUgtUi07aShzCitkO1p0e3JwU2hrNU0yJUchbGdXajB7RlklRUZBbVprUS1XcnpaSGZgKjE3Q1djYVcpTlYkeUNMRjBGMSVgalc5WVdwTV9RaF8tVEx1NnpPCitPeGE7anlec1ghSlM8V2R+I0VBfF5NIXIlPUxlPm58Q2dCV1dvNkFMJEVHSnVWZSQwS2hebzdKTE40YD9ZezZaRHxAdnlfJTBxOCM4aHdtCitPbGVWMEdjbCQoLWhOWlkzU0A/czs5VWtEWHlON0xtd2wyUDtZNkJVMm9rd04zaVdyWm5OPnUtUWE+VTJqKUBUJXNNMVUqX240IWlkODFFCitkTFk2YllZNU1WaUhtSkROfGhka0RfZWYzc3ElITU0XlZ3TytWX2xgOThLKzwxI1d4M3MyZ1c7bld6fEBmNWdeZiFaUFNSJWE0N1BFRkgrCitwUDJmcUVyRjxXNmRaIyQmZkJwS2hKOX10JXR7JUIzKWV9ND1TSDVNPjA8NFVFLSVmRzFGd1p1TWE/ZlJ7Vmh2d2loOH10N0FqRzUqTDVaCis+Zzs5NXUjdkEpOEF7TGUxdFJ8fkV6YkhOcUd7SmNmZzBlbVBTbkhZIWc2OWU0ZSh+anNvNyhCbTYyOHkoUiQoJGQzPCt9fVY2TkJzVDQhCitgckFrdHZ7NXhpcDtheyshJihFNkJTaFBPT1g5ZFdKNk59Vz1DRk98e3s3TWQ8TXEyOTYydEhuSHcyUXB6eD4jTlZrQFZGKGEoQHYyeyZACis/YVNWa2cxVklIWHtVUmI+YDFka3hvXilhR2BNd2ZDQT40IWtZTzAlOEI/bntOKHxVd3sza3p2SzB+c0A1aUhEe1NQKSNYRUdnOGdxWT9jCis8TSZORUl8cllGcDBscFV4T3VjTWU7MndaJlYyKERLQDF7RlJrPXNwWCQ0aHRUNGZaZ3FoJk5rRFZ1czR9ZT5TQDkjYmpFQ2thbWM+U0xACitXM2JlOVVzVkFwcjlTVHVANTdAaEQzRzhGaVEkWHJVZzJUSmA3PUUtR0dDbEModGtLVEJfdEJHMCR6dzxoN0p2aHJSNiRSZSlabGM9KlhNCit0SkRVQzFLcz97ZEE9Qj5FYUFnYyV4LVZibUpZbVYtZzBXRmkwQ1YzT21QckhWPTRecFhYNlVYI2Nra0UpRD4lZC1zKjcyMFAyejFOeX5ZCitxLXl3TkVlcTxzVjV7WXEkWi1XSndyLXJEa1NTbEctJWo2Pk19RT5eRnl2YmV5aChuWE8kVWQyenYzaDlee0I8R3VBVlhtZ05jIX5POHMzCitraktjOWZtQEJld0R7M3ZQO0t2Qit3WmJxP0sma1orVVo/QXMqZEh6VlQtUVJmREUhWkc3JWpjTTtOI2JlflVlNGd0PjxMfmUpaWRiPDlNCiswa18wRzdjZjRrXiVXQEM+SH1zeDt7RXJFaE1fS1A4WXhCeXw+en53a2x5VD92fCNPRlI7K3hOMGJkPHhKY15FV15sOXFnbHNjN3c8UHdsCit0PEo9fkM0U24jcWR3KGI7Z20rdj1GfXJmWEg7bTl4bFhITGA7Oz5Fc0YyKz0yPmVGKGQreGdILWQzNVB0cF9ARzY0P1M/SzhIbCZRWEtNCitTZ19WOWh5NDdDLWBaZXVNRWlwXlhqaHxtKGUjU309cV5+VSZ4biEhNlFHdFVpYG5ua15fO3piN0Z+M1c1V2dMQkhAZHhgaUdCZ1NAN2NkCisjdTJqVWM2MzdXOFhHUHFXZl5pN1BqQmlKR0UzU2k4LXN7JjxQKFhnWGNkR0xXKGktU3Z+UnJYRSs5M3hkUHI9bkZVTDs3c1lBY0Z1c0dqCitJe3ptXi12M0I/cno1Yz8jYkheSlQ8K3dDfioxITshWEBhTX5NOEM/YntiMHBZeUV5Q1Q/eUJuYE5kS05vPm12RWhNWCtBMEdWP3J5WkY+CitBKEFJbDZmfWpHTFpgTzlvNTR6NThLTjNjcyEwY2lEeUttLTE2WjFQJWIhdDUlISota04wYz41YVB1VEZsWWspZDRUMSpGUGpkYyNPZylzCitkTmFkfUNvXn1MU3FwPWRlekpsP1c+cHMkdmstJSYpV2lWYTxkTmJUY0JxUU0zeGphPEUlYWdaKXUxJkAzZGJDIzNLOEQld19DaW1DNGtKCitEO35LLWoqcXVtdSp3JEh5R3wqYE1WKig4KW1mQGdsR3NlQSFfdCpjXzVidmVfVmdJMXduY1hDNndgZiVsYDN6OUs8N28+VmYxPjw8N2ZyCit5dV9GYnhfcl9CPU1BN0kpU2F8KjA1aj1LdXVSV009REBaVjswP2tPYnU9N0p0YF5JK2BFU0pnMDQzKn5CZk52SXYtQ0VgdDNVUU9kNlBHCis8Ymg+QjAhJXd5X0hRQ3lUYE1yaCQxfHlSJmJNO0lkO0JeSkNfU3FSOGhCNilAI0tNJjdGRTNaYHhpc1Ejb05wQmk/ZktSfkhxbnlTUGUpCitIejVzU1dra1VBVyRsPnB+S1F2T30/MnwyTiNYNkFAV2NTJDtlbkFueFdoUyoreCRsYG5uJnwlfWN8RlBZJXlTOEl8fHtNWE8rWTQ0Ml9RCitrKXVIdVRlflEtRkxyUzQpWmdsPEpeaDB7X2lLNkdMbXkrcjdJOzQrOGV5JEhqM0pqY2FTPD1MXnteK3RJfjIoeEVIdlc/T1doajNzQWt0CitlPjVtYTZgMnNAfigrXmM1QnR5MV5VfSgqSE5iTEM1NzItSzh0Izk3NTRBe0MpQy1qcjkqclBFQmYtb0NreElPUFl5WFNAITx3R0M/Q3hqCitBblc2JHghNUtafHs+KXA1T0QkaStqR080JjU/ayslZnhJMlQzI098My1GI054UDZOc2pYWk1GUD44STl3X0pmWWs+WU9JIWF5UFJKd259CitAZ2FZJiVNfV54d0lQTXlFYlJxX2w5e2p9TWM8V0FkKllKa2oqPjxVZkEqNzxUQ2UpPDdfIz9PZmFOQE1RbytzV1NMP3kxZDRKMXtRSilaCitUNXszTy11M0Q3QWtgc3IrQldXNi0kJSRWam9jSEB7ZUozdCk+bUgqe0p+I3h2Qjt2NWkxKEUjfjBQbT5+SzlwcVVtRTQzRzJnO3xJNUJiCittUkpBRkZTUWlvLUM/OD1qJGFBbTBxKHYxPW82dGlWVVcyeDFQJTg+SHV1Qlo8TSY2Q2NpKXx5eW18WFIjXiNSU0ZsKzFnRG9vMTVRQmdjCit4ZzVOamdxQTBJPncjMkRwWVZBQkdfdnUjPmhIZ3tlZ1A3KzRHdWd1TUVMb2QwQzxgOXY1ciVtaW1KbCRaZlhEaHFmRDBTZkZwKVh9MTNRCitrV0BEUXd7WlMyRlhIZnZOanNLeX5oQ3RzdCpifldnd3wwWXpAIV48LTNhWXpSaS1xMFU2dzQtWEIxQk0qKzA2RGZCelJEVTZ6VW57UDVECitWYThqKkB8Kkl7Ums7JXEpenFXb3E3Y1dBfjh9am1+OFh5WXBRIU9rcyhlYyE7akAoLSNlMDJqRD0odip+e01udyF0UUUzOV4mJnlaRF9ZCitNXns5N2pvYjlSWCk0TWR3UzJTbj49bk1Wclc8KmpnWUFnNXA5RzgxUSY7OD51U3lPMXZ4S2x7V2shaEVQd2gjU0IqKjBpZzhlJUQqUH1mCitQKU9ifTtJMCteI1olOzRLQW9fI2kjVSlxbExuTWdgUT9MKXkyIzVwMnhQNnFlb05INTNZRXdBeVpCQmw5ZmB0TVNpZUpybnpVKiFTdmAyCitLRTJTbjJTPXN4VTRQRHZtKUxTfSlTNmJxcUp+YSNeSVcmVHVXcnI1bU5CbGUwUUVwTElHNTQ8U2dvSy1CT0BzUHVPb0sqfm5FWG02cz9XCit4RFRLREw2cExaU21DQWB+VD10ZkZVS0RMaj5ja29tRG1VOU5GQ0FKPStpJElSU0NhUkIlRmJLJCpYakhTWXxETnhuWVJUZShIZjFCKVNjCis7RWNATkZnaFEkTjgjaShQfCROdCo5dVFKZ3BGYHJ7aHl2X2FxV2JBKEJuRj9nWTlrJEA/R0pTcDhqRj5lUD5OPGR7RyolTmBPblRgY2FSCitQPmllWVF2SHw4UT9DR2d5cjNhVURJMTM/fEUpKyNFV0UqYUlWWVdle1B9SzZNfChJd3ZvZlBYcDlyKFNgTXsmXlJhYkJWJUpkJUVNeX5OCitAbVV6M0lrWjI7KVF2YnhDV0FHLVM1VWZQX25gbX1QcjIhdHglWmxaY2YhVWArdTNlRC1LcD9GWiVEP302RDhGUiYpTmlIUn1Qdk1LXn0mCiteXks+M3txX155TEV2NEVzX0RTPkRfS3EhaCFiWkB6TSUzWSVaO2RFNHBSYDdeMyRwTEM/fUFPZkNsNXNHZn5zUihmKj84NiFNTUpQe3N8CitHbEVtTnU9PVpTYD05V2xUeWleczNpXlg+clRzNlhCc1Zeak1Wcy00UGk/dV9ZWlkmUXc1MUpCez8/Q0NiKV4kTzFPaDRAVWtacVdqN0VJCisjPSYyZj1XeDJ4SF9zcztIemlFKnBoM19XU0hUIWxeeDRTQzAlQjZCMThwO01OXnA9aX5fe0tSPzBvUWlGYD0tPl55WT5JZ2lSZ2woR21UCitKQks3ajgoYUhrP1pFMHk0U0hnKypxaChxbHNNSlBQWWBQZHhacDlvc05OaytHJWxSYk5sayR5Pm1UOGReWXAhJDFAMiFXNntJY2VGb0A2Cis0P0VJUHp5MjtOYz85ZCo1PEp3SE8qMXphRzZ0QkdORDIoTXBreSZFZVBKbTxsYnJpNlBuP2hxYXNtXiMjMlV1MXc2fTwqUzJDYnBVaDNNCit9OVhuJGBkNzBuamkpdXhWT0xSfUVoYnNPfD9HejV5IXQ4NzBPYjZKJk4jeihNSHNMVXBQfT9gcWhPdXF3JkN+IUhDR0JeeEBNc3VJTkFkCisjNVJEKUo8b3FkMCh2djIyfHYjVzB6cmFxfWxEY01NVWpCUmZ0SkpfLUxXMm13Q1U1UDwjYDgtNT5mS0F6UlFFVlJFZmExMj07KHpuP2o0CittcD42SF45ZVZBciFoc35FeEl1SVo7M0REU05LNHMyeEJMVWxXTmphcz5ZPi1acmBvXn1fO0plb2dzMig2dkRLMll4MTI/JiNxaGg0KXFYCitPKndLejk1RTs1Zl5SSFQ8PWRFYktZJHZmamB4PjM3eDU0YkRQPn1UNUZiUkEjZTxDa2Rle0d0dyN9SV9vRVFwdH1LY09ARFFGcWs1Jn0lCitXUyt3ayk7U3NZXkZiZURjUjxhVz1yWTFVZSZ3OT9vNEB9b2deSTArIU8hZThDTEcpbGQwbChyckRYankocm44OT1GK2NaT282OVZyPENNCitXajRrMj9vcThTSGR2V2ohaW5kSWlSTSp+UTJLU0IpUTZ2S29CRWJgM1crPDJETDxkTkIwQU13S3o2JTMlezFGQX5xND9sNzR1WjUqWl9PCit5fWI+MVVCWjw9SH0pIVRoS1JyaS0pUjIjWT1Qfi1+fVFHfGZ5ZXc2OFNiJHpMblZJMUteWmlLK0h8OWwlO3t4TCgoVlFQI3QoWnhPVzVRCishPkhxP0h1ZHJFYXxDcCU5PTZqJS1CIU0oPV9OPT1aTlUqPGVOMEopdCo2bVB7PihzVHJ1bjhsX1pFJXZhWUw/K3FSczhufGctenp0VHxECittcVFZUFV2MFojUCtGfWQ4TH1xUCkhYHFWJkc2RCYzQz5LQjdwdz14e3lje2ltTk1EJT0+PEM/cllxLUBPcHtIJEZfY1NuYFNxJSEqIzZ0Cis/YlNrQ0wtejNeM3QkQCZrQkowbjtBSS1Ud0MpfGNNVEBUNjslaGFtcS05dkdOWEZFSHRBVD1HalApQ0V5biRSclUpM3E4anx6ViYzWVJoCitJbntBdmhzLXtOVVhWKzF3N05wfj5Mfn1ETmx8fm9PbnFrV3Q1RVdJP1hfM2FXSWo1YW9JNFFQJDdjPUpQYDFVYj0+eTkpOTZaYTZ3R0xWCitAR29PVmV9NSsjYlZPfGVsbWEzRFBtTjJicStuUVV3S3UrbEpQPDgmeU9WZWZoeU50cElNd34ob3ZGPkd+aGw2eTJ6LUgqQXg+KXU9UzRxCitpcHNLbGIyZy1QPih9QlJfSnJpfjBIPiZBQldJd2xXJkgwcEFZV3F9O1d+VjRMKnE8anRSYmluN258bkY2eilZP05mfEotVHlpTVR+Xil6CisyPUYtOXAqcWlyNUp0aCVCMU5FTH5jdC1gJD5iUFhSWEFFaF94Q0xaanlGSEkofHIzRTchSFQ4QUU0e0BEZkQ9MDEpPzdVPD0tfVckRDlLCitTa1YoNzF4ck5aMGFjcHYtR2F3UmpgQlFpbEVpcXVKRDNGeHM/KjVvKTFkKmspQms5M3NPflZNKG1pLXdRJSQmKlZqcTZHXmR+aUpKQ3Q4Cit3cjB1ZFY/U3xSNDBnUEVFUFJ7clZ1e31+fUNKNWNMZTIoezJrNiN7cmZBc0J9bGdaMkRja2lSSCtUJFljRDAjeSRvUW89ck1AWG9QSSpACiskR2BfcT0oYzJpM25MSGRMdChBX0piUEt7cVNyMzNXemNGb0ojcXdiZ244VFJuY05qbkZfOHh5cjVFMEVkN15hZEhQKmZgWFU1fn1AOTZ7CitSZVk5c1VFSkpHTSUzSnl1fV5RdXNrM3QwKmA1UFU3M0t7aSZ4fnk2WDBhPj4hb2hlc2lrQ0V1enBKTTFkYkI0NkFzPktKMXphNH00STBVCitfNlR5XnRmWVIodllNNm10P01hM1ZAJXFoSyVFRGRmZSkhT01BQkl7MWVlOW49eHc2Y1E9PVdPS3UpJCtBV309KCVvdGhRQExBPk5hMj0mCitJUz9sR15TPypVanR0Nkl2S0l3aTRxRyhaTGB0X3FiUnRGTUppfl5gTmIpKzl5SSVjWmVFaXJMeD1nKT9zS0wteU4oI0hlNmdNOSZ1UHdVCitGSStMYkZ7N2h+Vmx6MGxPJUNmamhnPVFyfWt8MVQ1SDNpekRtUzBjX0h2dVZePH1DNz90VypZb2t1ZmRVYDtNX3dFaEBYUFgmSGkpdUFMCitDXlBBMlp8TD0mbEx2XmNwI0YjbUI9KysrKDFDfUt6e3NJWjwlTEQ3cEswRTVEcUwkeiVhaStvWnhjNz48RFZqSX5yWkllVys0UX48b0hYCisjO2UmOStMPWNOXmh8WiMqUENiQiE2Mzw2TS1wI2ZIK0tiLWNMfj1MaHpfLWt+KW8tcVMjI2w9Z05zZ2UrSVAwLWU/S2lSdGpfPkdAZ01eCisyVkt6ZyNnQit6Mz47bFJ3RCt+NmdtIXAjKDxuRTBKdSFKVHV1Nmw5PT1FNFcyKnhQRFlmK0kjZSQlcmE+RE5RVXxDSGBGRjhMPVBMZFNJCis+bDwpZFZxazkpaj5OaT89bmcwYmRlfEUhRSU/VCUqKWw0JSR1dS02SWp5fmVDR3IwQ0N7XmVEdXpBNDVVaXMlMGVndEBjS0pUIyFlPXkzCit0ZUpIXzJfKWpOQTttNT4+T3c1NmZVIW9Oa3hQQGRCMjRqbCYxTnthck92QnFSSFZjZHNqQSlPV3F0b0t3OEBTIXlGWGJRO2IxODRfekd+CitYJWxjamFnc3FGQ08zWTJiT2UkWDNjSiYzXlBNZHJ9dEVsaXd4PFBlVnFeNll1Kkc7JCNePThQUXFNSzNWOUE/QD1EKiMzT0w3NmRkakxaCis5O2xOYGFXUEthOWxLI0VePT5oVjdONks0aDhpb0dhbGAqeF9VbjFzVjs8SERONnRZdkYqTjdNPGhnOV5wQGZgZ2BudTktJVM/ek9TKjBeCitzUztKRns3SGZIKn4ybS00dEJyeDkoYD5YNHhFMDNWcjclb3otIyQmU3ImeWtTK2A7ZzN1SGdwcCp5fntFYmV9aEhrP3xIdG41STlLJCkpCit2SEFEZD9FOHJ2b09+bUZFKHEmNDtrNGBnViE8fn1OdT59SG4/P2FKbVBvZGtiR3E9MkVfV2EwZCZjSUV3PE5uISh6Wm84MzA+NShaTiYpCitxYWtHa2BYNWpIK29RPUxYQXJLV25jZll+QT5sZlB0KikjS3F0WlpabUgoRCMqKz1yPn5Jdjhtcnh9MURrNkUlUGkqSlVra0JoZj5rZSNzCitwKz9RUFNFSWVFakxWWiU+ZTU+RkpvfE1fVXcyNVhPUihFU1UwdVFAUENHWl41RDxYdyMjMzM4KXdvdDhgWlpYPGdLSkdJPUBUNnlQRG8zCitEMldZYkNrIXcxaD16Z1Eydz5rNm1afWcxSW44LXkqaTNQPD9IY0FZXm1geHs2eE18OUU0ZEo5KXhHYyF3VV5wXjx4d0pscUFLKHxyKHRfCis7a0kjT0YhSkQ7KWs2USY2YW8jPH1hc05Fc084TWd6O3RzLVB1dUNzdndfNlB6NGZiYG5BMiRrVDx8MTRFZHBgOTkhNmdPWktsZV57USQoCitAPEkoelNEQzt8Uyo9fFNReDV6LVdpeilhKWZKODhVKGxGdyprKlVxQmV5eFZ3SD12O3lLM1R4dD85WmJ4dSY4RUlibzBIVUl8a0B0d1laCiteNm5+RDFlfnZLJC12MW8qcSN9VGc5M1I5JiQwUmpxcGl9K1ZhLX5wOTBBbG1iczhqN1M2eWsta3Q/TVRBWXZEYjxSOCF+P3tzamE8QG52CitsQUJtPDd6NE5Oc2JlJXpxQlRLaz9HNlBgZjhONzktVWJYfG1rSmZqSSRebHVublZtdUFiRVJePClgNz9DZFRvPGU0ZTM2eWNKaUpGVCpyCitzKVdrdThNVytnXnFJe2d+QzUmNWxpa1FfYDYycHhmRD9edkZZUj9BOE1WZS1DfXt6IWd8Unp5WnFlX3I1KVRlS2F8R3tnT3lHSFQ2WDYtCitpUE1GVV9YNUB7T2FGJiE8NiR4X1N2Sz9tUzZIYz83ZXZOYHUqfGk/fldwYGZBfG9FcCZjMkMkPjgyWS1eMUhDdXxXKHotMlVWQUFVenZDCis5NGFVYHBmQEhJXzRXUEgranF4clVkTFlqIX16T3pkPHAqPmtLc1JganNOan4kM3E0MiFRYGB0MGFRZHYxfHNxTDdIP2hSekA4VXhVY0d1CitBZmorWUR6NF96WT1QJit6XmdmMXpRYF9wcmojZyozKXZHcnp6eCVlMCZEKTJBND1NYjJfYHNuTz97ZGQkS201a2JLRnVaPmUwQX4lK15KCit1bHstMS1oaGVLN3k9PlEpQTdUWnRnPjF2RDVEYTxoNSFvdDhqKS1UaENmZGxsYnoySHl6Mkw/NzA0eGhyeHtxZkRhcXZSaj48QGxTfFp7Cis4bGdjPmVCYXZ9YX4kMU56WVZjPil9Mj9jWTJOen1+T3s2RUVxQG80aDE5QTZfbSMkNjZLejIwYClCTk9vSShjfl44X3NtQDlYPXRMSVNqCiswWiF4Jnk0Pj5rM3g4fW5WNWloMXFUWDd3QSVGZFNhMyVhSylJJmZTaEZiMipjKE1xZW5uV2ttcSlGR0A4cjRxPH5PNCRwPUZHVVB0bXVhCisyYzlaNGQ3RzEjSyRtNkZyOV57NEA4anZgJV40UUh6Xm1kcGtkJkdhaGVMVk0yUFQxfTlJTjNGNHtWQGF1P1lMYlk4enV5VGY8SXgpUzlCCis3SERAT2xeN015ciFYNVVMaHdod25aUUNHdDB4PWl+UFA/ekN0ekt2c1NrT35OXjZhZTYpTnx4NURFXz0yUWwpWEpmZzcqPlJyQVY+RjtECitXbzZfe2ktb3ItOTREQlQhRkQwITF1UVo0WHk+MjxzZ217N1puQkI1KGZFKnQhcE0tVzhuWExYNXA+N0A4YXEqQk85Uj5Pa1FfNFFRVTFGCitNJC0pSCFiSjg1JD9qQnpifF9lcm09PVNAPjswc1RxKXoqfj1IKHdBYW92ZWtwK0E0RWxrRylAfW9iX3cwSXNWZWpMb3shQD0/cXtCIWt0CitVUzU5ejcjajZkRmY7JV5IVkBKeyg+PyNzTUdAYWgqcjNVOUNUYkBoOXxRVyMxO3tKZEAtI1ZVNzUray04TGVpNzxNd29hYEVeUm1XIyg1CitqdUF6VmNWNjhWenUjRHtre1BNWitiJWQyd1dASnUlcSZ7N2ZoTkc1Nj9ZS2MmaDg8VjdsayliVWZ2S0pBOTB9VDArZ0V3VGh9Ym4zVWBMCitII2x8MlBWamJadDFGMHUlSXYoMXgoVX0rNCluaGJoPmlFJjc7YktFV1BmZVdmbkEobEVSZWc7QEZpN3V+czFPdVFSP1NuSDtXMytTblhMCit4OylvZWFEUzU2RHxLI2hTN1QxTGJUOGZfbTBuWkVqSk1VVjkxU0hzfWhJTVNCYXttYXUydzwkOylWU19eeStAS1dfaURAKFpEZ3VWbF41Cit1dXE2dlFmT0BvKEhAKlZTJiFjQnp6SVFfdGVaSjYzcWJXfmhfXmtgfEUtQyg2bmNVYChBc15HRyQ1eVQ+bW9qN3dzI0hQISQqNDliNFUwCitwMyh0bFpObmVOUHB3KGxUKGBGNk9sKXJwNk4/VCY3Y1NYV3VHfmJMTSk8MEwkSjAkYj0zY0tkUHFCT0lgIWA0bm9oWiY8X3NSTitEWHBqCis2OylKUyNNd3h+bSYqeUl1b08xe1lfeVctZ0JybmRKRE5MJGxIfl5MIWprMiZQYm9IbjF7UGgrKEU1YkVZfjczT0tfeUBUY3ZASiF3e1dYCiswKTYyVHJ0ZillJFc7aTFJKDdrZCo4ZUJjNiEyKGdJZWczPHpvRUp1KHFSMDU5ZjJPb0BEWHdweGtlLSpjUXtKSUJoTDYpbHpEaSRzK1cxCit4MkJscGZFeTdNfCNae1M0UXtQelVRKFlEMV9eKVNsM3kjZkNpbD8/a0lRT2VUMjFtfFJtS1pjSHxhSXFvPWt7XnYmZEIrWigmfm94Kj19CishKGJZVk8rNXJNSCNvJjR7UVlmO35PSHdANlF8allROXt4Xm9mKkZFMUhoaGl6JXlwOGd5M25YbHxfTCohITxMbHdGaTNfZjNfcmljTHJ0CisrWFZhX1Y4YlZXYEg7OGRRN2ZvdV9fUCk5fiFfdWxfeklvbTl1MjZ5flcpdGh7cTdFQTRlKFAhSEEoWG51JUpnKjk2T18zYEdYK0VXODlyCisweThPT3AzWGhaNT9XIU0od2NUVG9SP2hFY2leSj1AZEtsYXRnanxhM1FtSn1URTEqMW5gb15IWDw/JUVJXng8byF9SG99dDxJOyRAP0RlCisoKmxpe1ZfMUJ1bUh8QnElN0JlQEFrYFZEfVJKVXV9N31URTk/YExgITJtQCZFe1Q1Un0wQWl5QT9RQmB5ME9gJHRHcjZkPE9TPTJtMWxKCiswWTc9KzhPRWdlcCh1aFNzVkAzTl5Fdk1taTkxQlJRUnlULUUpTGcoWHRUUT53YTcjTlJgPFZBRndXNUsoQWU+QypzNkhISW1ZVTFVc2hJCitXJTVZUz1ueEQ0OXtFUnJLeyRtYHpeNTdhSmhRYHw5P1FpNWZQJD5nM1BnT2VoNWh3QmtyK2NWSlU3MH4wfnBoVUR7Q0ZPUWFmQClsWXlgCis3QDJUNlo2QiNVbmo0Z3xKUiRoQlU/eDxeMG8/Y01yIz13OEMmVj9zKDsramN3SClJP0MxeDhwU31xN2VlWUQwO2x5S09ZJHM7YXJVVXNwCitrYmVXP2k8PjNkQCRId09rPDEjSyRlKEAjZ0xZX09OaDZyS0tAUCZPVTtJWTgqMXJ2M04yeyVPNXhAPyU/dVYpcVlkN0VjdTg8JlluaWRnCitOV3F0UjZUOGZjRHh1eW4zMVFAcjRBa0gzcVZQQUs+QFdwRGFkfm5taVRVb3JMT0h3QXR8RSthM3RiSDFXQilGc3FqSmB1b0k9Z1p4bi0+Cis9c0lsNH1RMm09ejRGJWVDU3hza0VSYyZLRzBOYWQ0b0xxSiZTamkoSzteZn5JbyVrVz5hfEtoJkBwPFVGX0EwakwqOFcySj5vaG0kQGgzCitwTXdVSnI7UDRWfGY9STdEPjFWPjRCTV5FK2t7IV5ZVkIhSWx+T1lHPHxIdEV7PTJFbXN7QHlnX0B7R3NtN3AyTiYkWCRpd1M9PjtEPShyCitAWEJgalA+RHwye04mTXRjanRJcG4rRkY5QjFFWSFvLUlJUXtmN2M8aHtDWlhGLUt0e2YtSlZAQG4hMlplX2xFa24mSDFIMH1tPGBEdWd0CithdEVZTzhgUElPMjleS1YyfSZkb0NDTzM/UXtRdCF5bXZCYiNnUU18eEMmMW9wbEM2VWRYaSpaUTBKNmR1U1Z8fGxaI0RoeWtrbmBvIUJ3CitmR3oqNGItJCEjc0x1RzdtOX5LfWpRfnZMfEJLYjc/WTBGY3spPiFnY0I/d3lzYT04XmltSjRxe3oqIylubG5jQzNpWHUpfXsjazQjbV53Cit8OEw2UFJeaC1AIUArTkEtT1pFNDZUMz9LJGdMPDRMZHYoYiEhNH5LeVVBdE5Kb3ZLSDl1cEhfTWVVUXFVbUpIcm1gT1RlTXx6YilBKG5qCitSPjlWczlOSV9qejJUX01WUTRXLXtuYXtGaSM2N3YyPUNSYyR6K3B+PTBEUVkkYDFzV1NrZmghVUw7eilMUSgqfHV4cy0rcGhTRU1Oc3FQCit3QlZ4KClXUXRSeHw8KTxLJElMTFN6JnBmWlZjJSs0cHpIPTxYKiFUeWYhMjdRZUxjeHoxLS1XaWNhQyZKcjFvZDlMa3hgPnYyWlRQUUZeCis9OEc+TEpKRXNuI1I0YEwpLX1EKDducGRXLW5VejNoRmdSVXBZUnR9KitQcT54aTZgfWNfbUF7RGFrOyYlR1A9dVlsNkBTMnJMQ2MtVH0wCis5O3J3dnQoNS1LKj4pWHA5ZzRzfXpCZXBIcENkIWo7QnVMJj47QCU8LShPKWMqT0g/aCU+TFVJcTFxYWN7bkpFZ1p6KFYtO3U1My1RcmRTCitUTFFWdWEpRT8te1R5QFlGIWh8dXYwTGVWV35WQ2Z1PnxNZnRkRUFaMyp5V1d+VkN4Z0VXXnErP21GQEIhb3BoVms1ci1aRHlmNEctMDMwCitkOCFRazVvdXR2MUJac0tRQSNwOTVmRXAjXjJ0JXdialFIQjE+cF51NT1RT0VMJS12a2wmO2dAdHtrRHB8d0Q5QUg0aVU7Kj1HQDtINSohCitYZX5LdmtmNEkxNW9CJSZ3cDg1KjBlYTRyQUtxXilncTZMejQzPHgycGskU2d0eyE1dTJAZGBpYjQyfU5MLUdUT35gYD40e2lYVCVtOz1lCis5MHJVK29QKFc9eU11ZXxYNU9KYmNNa0B4NFRHK0p0eWV4UkhDbFBSe3dVPkpucSspIWNgJFVfbURJWFpmI3JOckhnekJOTV5BPlFXWV5lCit7KVZVS0FncEZ0bHdRUVc7dEQtXmdPVmE8fDNfSDJYRGQ3a3hfN1B5fF5NKkpAK2NuJVdIeGJDczZBeVJCMmlMTE9sWDw9KDZYaHFad3xWCitQUjdKUjw2MXZTbTxYaTZtZUxVTVo2dUFnY3d5blcqKEckbUBgWkFAWE51YVQlfjZNOzJpZTxSWURaX3x2Qjh3WHMqJCVRck5JKlVKKjc4CitzOSNuYVI1d0dPQjI3JWRFY1VRVT5eNFFDI3ZRUEcrakpmPSUlZ2hCNHJPPyNPUCYmd2xja3p4Oyg1IyteK09iPnBDUmFCQyhlTT1aeT93Cit5XlRfcnctX0BVSTtnNGh0ZH1nJSVLXyVVTEtHQiUkR1ZYZ1lre0k5YTRPbCNqZV5wZG04ZDQ1MkokT2VBI2xlbj0qJHNjKj9pcmV+WW19Cispckl5Wkg2bnw8OzFuKTtnS0lmdUZqTFo2SGdOanNsVCs9UGFMMiotcHU5OHdWJihgYXoqR2pkRjtieWMoQE02N0NEeT08OVplaFpBKW9yCitJRiR7OF5Jengqc1g0P1M7KFBoTS1ETk4lbkBmeHw9bEBQOzRvfjwhJDxuITdGUV8paUZEcXYjUEdHQiQydyhsKDBYfCUkZk1YcDxDU3l5CitUNnU1ZWF0O3pvd1c+MkVOQi1JVyFMYyNJQHtNa3tuRWhVbm5IbDhiJiNsWXdsOHVgekBYMTl5X2loSFA3VlJteGJxVys2eiVhR0ZmMkdBCitMYzNBZXQ4Z2pDSDJJYy1FZzVtUkh4ODlSZm8/bEZpZHl5V0dIVyFRT0ZaNi1uVGB6RXF8bGIxNndBcURoTVctKlNuMXYqJUB7YGkrJEd0Cis+Pjt2Qk9RMj5aR044WDZ8enEkbDwpeGxmMz1scExWeCNHe3syezxKYDVzWT4kJVo0Pz0tVSs9Unt+cTZNVEFCd3tXUnQ+PTwhKWZjfHVeCitha3hvTV5TZ3IkT31BfHFtSTgtTldiaz0yUkxyNy0jTSlBdHlYUUYhVEk+aypZJXh6S1ZfdXJmMH4mJTZRVHY+WSs2b1BHR0Y9eHVAOT1YCishc308ez1aa1daSUFKMkxydGBSdnBDXmMkfDl7UUYrbnVheGk7VE5DbVUqQFF8dHZRbyVRPShSTVN5SnhTWUlEOVFYN21jbGghaHhedyN0CitoSm9DJXdJKHRaMDVPdXA+UzZGbiZleE9EKk5NUjB4fm5aO2NtQUc+a0w8S3VGMDBgRmhvPXk3Zz1UX3VqWGI5eyFiYzkqVH50RGFlKGYoCitJXlV7aWxQYShQQj9HJiZyYk5SRWFPc0RWclJ+KXE9fHdheCpNZkY8VVJULTd5TD0/P0o+RUJgUSM4SzNuQjg9NnZJRUhAUVotKmpkX0QwCitzVH57O3AoO25oZDVUcUJBKTYyYU1kRDtOfDQ8blVqMEJjYU8qKDlaMXtCUTElIVpiSWkqKnBibys0X0JkUyt7TFRhbz8hWHV5eThnPHV0CismR0w+SWpkbW9lajxOdTBqMSZRP3M3azJ4SXZCTlk+JnNWc15KN3A/b0pWTiVRTmQ2fF8pIVNibV9lTnEjUk5nbUQzTlEoPjlTUkIydS19CitwYlY4UEdIQik5MXBSVlVkMGladUxoPjUzSnd1RndEV1RPYTJXRSFTUj9gM1psWkxtJDtnS3lVVyQzVGgjdU5EP1hpbmZVQGxEKzVpZXNyCit1TkEqRG8qVEJ3SWk8K05WWURHcW8jKXZLaDk0P2RaMkJuezFoWTF4anskKS0rPkNRclNicDhpT1dzZFclJUFnVEh3ajlzQTd3Oyk5aCNLCitDNTVRVnFUR2xvbFIkZzghQTl6dGRLe2YoeVVkWkMpKUlSe01afS1gISVKI3x6SndVWmF1fWlSNSYhQjNvI3JjcVhhVUBMIVUmJkZvYilGCis4d35UYFBGJjNTPnxadTlGJm4jaExpen5XamU8K2lNRCoqejhIb0szZyN1NjZCJXY4Jjw+Nip6fGZhQSgwIVlFb3QxSjg+dCNWbkExV1h1CitzaiNSbkVAIStscjNgPCEzUyZNckppM21gOTF3VnwpNVhGTSE4SVEpMFpHSSpTUD9uNCttdTEwR1RPPlZVO0JXJio5N2lBY3dQM1VISi1MCisjWEp0eTVIN2crVlRnLWUlcj4yekx1NFEtZlJVV0BqKERCSHowTGsxJCUoO3srelZgXlRnNj82ZkQzUkExNEJ8eUxoJnxaLTUxJk5NNmtVCis+YjheZHVkO3xLNUhxYUlKbylmcUR5ezN9QTZTSmBLNmlsRmdeR0tKJH45am51ITQzUkdzNmZOZ2AzUVZOMUtgelV4PF4tRmYleD8tZDdBCitTOE8weTsxcUhBIStmKnR5dGN2IVl6TSpfdVJMNyh2djsrTnElSD5QZlM5bnQ2eDFoUCgoPWNWaUB1Yi0xb3A2SDRXWTgzRilkMU18TD0tCitCSCRuI0RALTNqUDhCRVJtN2VWdXw3b09TaCptVzBXfDEpclFPaXh0PTFGMjBoNWViSGxuYUVKcEVJcHdAWiZldmklOUVIPEwrQUEoZz5oCitranBoMGdlM3E8Jit+JE9BcWozPl5haiRwMG98X2F5JUUoa258dlpadVNuVio3ZXp5IyQqcnBaWG9gfXwqKWpXaCE/X31TMXYrfmtzaG0oCitHYHduJGYhIyt1ezZ7TFglU2NheUFGczA2SlZZRENLKlJRNntHV1J0TF8oPHR9U0R0VCoxemw9RytvWUV+cTt6OE8xamE8Y1hoYU5oVCpaCitnKikrdl55MHYocz8jakxoJXleeU0lSHx0YChBPWZ2UktITElCJWdSZXczdCR3dFJYd0xIT0QqaXRGMlg9dUZKOUdISGs0VilNdE5DKiVeCittVDVrNU4jVFFOZWROTng2aXVRb3tBRWJ7Y1JKcEtyOWAtKU1VezlRdj5JNGZFO1NUWi0tN1VqY0ljQWcyTUx3OTgyK0RLR0l6d2JPYWROCispUF5QSWljfmU2PEZCfiZMU05gZUdIUGo3ZlArYXtGNEZJQk9OdWB0aGI5aTdHbk1DPT43QVQmKSt9aVJYWH0jTkI9OVY0PV8wV0ZjX1V0CithZjEpQF5hMTdENE5nWk5oRylaR3c9K2B8Yj55Ql9KJkVWWCVvN3JObFEwbEd4K25iQDkwQzMqSS14MyktU1E2dnVJQEg3dXN4ISlhRzRiCitnKSp0Slg9N1A+fGBpXkV3fE5lI0QhfCVmM2YxNStOPHFQSD9XP1h0fCFkX24zJVNFZHViaThYdDI2ZihZXjclUkQ0TXB7YUpnbWVMM3JZCitYJHN5ZmY9V2JrRDhge1g/UHNnR3lDITJDS01LZngwaWV8TGo9aGEzZzdRSCMxTnNvKUV7S3UzNzRwZ2hKRzB3RXk3eXdFfmFUb2hFJilgCitffWhqK1lUK1JPcD45YjAoUlhtQ2RXWERMUyY5TyVXWSRjRStkdGQtNXM2OEYxUn5gJldWOEBURWgxaVJhXzlSQE10biFhamV9ZXkoN148CiteXjhRdzJiPjFGeH5zYFdJWD14XnV4Mj4kaE01V1l5TmEkRSgxaHlVJlh4KWBHPTdBNGF9P1RQdUhnRUM+Z35wcDMqU3RxdFAjP288aiFaCitoKmh6fGZSQSFzKXYzNj83c2FePDg7UzVUajIpNmNySHc8dVRAZXYjeDwzWmEtdT5qKmhLYlJrVDl4eGNZX1Y4NHFfT2R4RytlWTM9MENkCitRQXorbG1rZ347TSY9KnI/YkFWPzgtPDVFQjc2ZnY1SUpaLVhaYVZsb1Izanl5c0toamRoJTRTd082PExxRipxVFMqMm42QTJ8Jk10U1dfCiszKCF1IWZ9RC1RaTswPVYlKTMpLSQtITVwQFpJdWtMUygrK0hhd3VLc3d7UEV2OHVlTl9rfE5JPTBhUGgrcVU7eUVVaEgrJSUlPmdSPURGCis7UUZAVGYtYDJxRSgmWE5WWGRKcCV8VFBfcH57WlZIZ2c8KGRPPiZCc1pnRD1zNCpDPFZpI3I8bUFBbmZhYWI7dVJQczJUNXhSRGpzOTZtCis2Q3ptaEZiQ140VHBZVXhPPjdrZThlQlM4JGJARFFXQ2ZPU3lKcUxrKD12YkQ2eUUtUDhpaF9gaTgwQ21rVCZQN0VQPSE8dnZGJUB7T2w7Cit2KnRQLXU9KihYYT5lb3tjPnFmNDEzPTNoSEFNOSlSVUZqWHE5bitWYlp2RVA2YjZYMFJSc2soUkdYPUAwUyRZWVVRQUBQKnp1Km1eZ09lCitOV0A8WSQ2VEdzR3pXNVB9c3RBZHxOfWhQdFVmZUM5JUNBRFE0bSUhUFV4TXIlOSRBeWpuMFIkXnNBTEpSVn10fDZzPTleI0ZnOVV4d1Y1CiswUU5wcVkjIXxAY3NOWC1RUCtoKEdnOGdPTHAmWFIkLXA2cX5jIzJUVXJ3M2ZUP0A7YXxCezdVWm8kO3tsJTIrZGIzWUR1ckd0RDAtKD1ECitOV0JoWFk7VGpGLWUqej01dn5TfCNuJklmXiY/Jl4yM3c8TSY2ZU0jPWw1eDM3KzBLWXgjRGlrelVtNjhuRntoR0ExNSUyfXFRaXBReGtCCitzMS15Kn5QKD1lRDUkMzlyJnhNJGt4JUt3VnluNCNqcVNYWjgreVYrNilpZyRFX3pxLTAjLWE+WGA3YGlaVT1DRGZqVDwxMX5afnFyPEBpCitAP3M/YyshXzVgeF9XelVWKmBISiZsVj9xPXRNQ0A+US17P2FCVkRoTGlBQn1pZz5EPnNaI05BI1dqVnxRZVlQbXtfWClLY2czQXtqP29aCitDRlQ/ekx7UUdvdWNvdk1Ec0tPbDFJKjBFODZIfEVuK2V8LWYtKz18SFl1QVp9NGlyY29NODFBe3hvcUYwNm4zcWoqJEJ1eCR2QjRYey17CityaHJ7KDtoeDtSK3llTHVmR3goI3xGVl5yc2UjUjNyZXZNOENDVkVqZXRkP1JyemJ8SnsjRUg3TF8tNzJhQj03Ti1lR2c+YTZORiMwNlQ0CitAaHI3bXtwPHdITEYxOTl0MFBJdFgmN0hETjBNTEQhNkpvZlhhTiUhRXUkI1d3T2s0WHlhR0lKR0BHS0haYHAjXmZrNTxyKT5eOXl9UWhmCitwU0RwPD8wMDlgLStWME9IfWcyPnJ4NjxqdUtPUCk5KWdBOGtrMFZTX3hLbDchMmdvSz9RSCNXRDltaCRgXzkwaDg5aT5WJlBlPmBYR3FqCit6fiUtXlFNcDEoNWRMTShJe142c1BqOGFmWns4O19vYDNzb144UWM5P34/Q2N6a0t1SnlIYGlBLXlnazlVTEMjdikwPnlTQ3JQWHdDTmxnCis/RTByWGlZKVlIM0tNS2gpNypqTntLZ18mdU4zKEZjb2N+fkYtVzxKVT9HO2BZblhfVn5ANjRhP0BfLTA/cWFJNk5yIzx0PiQ1RkM5PEpICitBSy1Pez5WQm1FUUE7bEtWUHk5djFaQk4/eChWcXpDOWZRTn5sRkVHPEhtZ241Y1JRNkhlS1hjbFE4cUlMakg0I29jUFIyb3NAcnhrRUk0CithS0NuZUh5d1hmaFU+aH1LNExvNFN1ZFpBJjk5ZjhPQiNeKmNoTU91WiVfQypJKDlXY0B+eSVpQjQ/WU9mNXZ7SjhjND5RcjYkTEUmQUU9CitvY3NMXjZQU1NRe3lnOF93VDNscXVzYnpkQm0hJm84d2lZeERgSmVUYmhmKyU0XyNiT01xZWxlcmVyQj5OdE4rKkY+KUJUPCEtelUpWEs3CityRjBsZGZUSjhXSSt7cD5sPX5ONHg/RlhrcHBrOGlnQ2JLKm1nQVZKSERCTD0wUnw+JEljYiZ8VUJpVWRPUmZvTCglJSN+Tn08ZVZ2eUdJCitxNDQxO0V0a2ZXMUBUdys3cjkkdFkpVVdubVhMenhWamNzJTVjb0ViOCNMTVEyUyt4Rk08QmZyQWN5d1VLdzljV29mN2B8OyV5YFI3UEV8CitufmViUHhTKnlReEZBQWItamw0UWhDeD1qc3BVRGJIN2JmYzJ3U30odEBiWmZhdm9uTWo/TUM5VkFEfnkoUCVKZXQrOGErenp5V0FuK1UyCitzPi1fK00ySUp0ej1CcHx8KnMhWWQhP1NhKlktbnpCSTd7R2MjSF8zdjw0bGdhNm1MJml9MWs8N3JtbXhgfHhLKVpaKHVDTSokY3YmcFpPCit6bzEzaktZYUh4VUQqJHZaWil4VWJqKGdXUjs8eTBmUSp4WV49YDdBMXt1PEtGPTNeOVMoaGR2dTJ3bCE7UUxUJSlgXzVuWEYxcUlVXkdyCiteKXlnJVRmdlBpP2grYW9CdD87QG9LY2QwIzJZQmhZJFZfOzVgeU9QTGQ7I0gtWmkrPU93QTBRRlNGfCQ5eUlvO3B7ZXNORjYhaXRTLWI8CitAYjYkTnM7TU9TaitvPD5tMjhJRSh7cVBvKT5CK25BUEVPdnVScTxzS3xONGdNenUmYFFVSVVhfmFQNTE9UnBHMn0rVDM5dlF5Si0wNCkpCitKQDcmMz8/X05tZ3RXaDJCPClgPUkzS2h1KGlKZ3tTVlQ+YlZwemNKVmlsT3o+RiQtQVgqRShpQCZLI0olaWxiMSZueDxNIVJEdVo9b0s2CishKkB2Z3VVWE95dmVqRzhuR19hY1lleVk+YjxrUk08aTlSREwtVmVGMmVAR2YzJnBmTHVyZG8oMFh1dUtjNiVtIzh9cnRZeyZaMk9KUEhxCisoXkN6OUFFR1JgTkZBayVYdykwcVFyek1xYi1rKnB6KX13PykwYCNIQS08cWFgbX1QK0d8d2N6TEt6NC1ffmMpcGJ8YzB3JDJeWVJic0w2CitgR3M3Qll2WFR2cih1fjIpNXpXcismY0BLTkhhNG15N0dqRXYmKj49bDB+YmpuPGJlcW8qVylUb1E+d3duIW93UGdZJnV6UyF4bWt2U2BACis/K1ZHQG44d04/dXNsfFNSI1NmQ3JpVmJ+RFBQTDVvY0huP0grVlVGalBnPURkMm8pP04tbit+ITc1fTIyMUhTPmpUaCY9ejBNUmxOMElpCitVP3BTSlcxMDBLMyFwYT9rPHBBQkg+NjZWTm9uOGQ9WHJ9b1lEc0NkeTAtS2NzRkkkXjl3bmEzVnAqenBjSStLZX1pU0IoRyRwR1hZTiRrCit4Q0M2cjxXKUgmT30qNCM/eVJkamZURjRiVztCTGJaZ018QmRiSHZrYUFOc3NNejRfX3cxYktjRUskJE9pWm5GQ1NuMHg+QDdeJURqOWxqCitxPEVzcHNLclJffF9JYzRzYmw8JDNQZnNJSE90LSNaKFV6M3ZjQTxvXl5Xbz8rJHQjZWhKaXVMOVVtO3JwRiNDTWx3N2orNSRXaEFedyl0Cisqe24pISNxczF4YGl5QV5PUWNNKXJrTGwwaT58V3k3eDl3cUNnJT5pYEEtRmg7aTVVRHBrVGtqPD1ERWYlJmBEa0s5VzJDbyl8PWZOPk9ICispJGd0PTZxQnpmNHp+P2coP19AcWB2S3plTW0wKn4qVj1EVE51Zk83N1dZPUd3Xzl4UCZlQDUwWWByOSUrNkUyQm9ubWxWKT5MSDg5Jml0Cit7PFEqK2FpNXkxcVFOc3JsJDkyZz9xSEtqXzg1OFQ7RnxES1Iqb2F2cmhvMHtlcmNGUj8qditHPW5TS0c0Yyg8IzBFe055O3ZabkE9SVlFCitHSG95aGo7Plhue0J3KXNEeHdYXmNYLXhGRlkqSTM4cXkyPlotZ0YyYiNHT2IqNVpgSH5iYnApJURzKWludDtjKWJwQEc3Y0cqaUw8QVJqCitfYmxXOWM2VURWTkZDSFkqdGRIKWc2OUt2TUhVd2dwOzN9dnlKNz4wPF9PdDVNUFZ0K0NMMnlpZWFeVztCUD5QPT4hOEY9ZHV6KUo+Z35HCit0UWRlaXQpUHQ2LUA/aHdaM3wpOWRIUipiRytiPytsTX1SVUo/RSotTDdDdmhaajlybVlQMk8wemtWMHZDMSo4azkzSVEyb1ojMmhJdmtGCitEQWcyIzwtJjsmM0haXjduNVpTZ0MkUCV4ZTl3KThXbz1jYFZDMk0tNiFFRVNrUmpSOH5OJDdHKWY8VEc5SlFxU0QkRm1+ISFtfUw9XjdKCit3VjUpbkFLJEVlITgtVTM2ZSNlPlk+PGklNHhwNCl0fU5PeGcmdSpqQ0BiSDAoX2twNyQ2I0NwLVNIQS0+OGlyaU1DKmNhbW4qLUdlX3R+CismK0g0ZF56dFVZTTYqbT8+WElOX0JJSWYkc2drUCloPkA2YVdBSzJtdGV5N0R4SjhhZzM0IzAwN1NtMDAxQlcwMDN9bGE0JW5XV29+M3xhCit4WlhsWiliOTRiOHwwV1V1a1k+YllFWENhQ3htKFRYVWpGNm5eKHRvU0hte1M+bCpIWmYmTjlDQE5KNVMtPyFxNkdmbWt5I2JvLVpqSnU/CitKPjRMcGlQQGQxXiYhSCFlQ0luP2F8TDVvP0t4ZSlOSEVkPys+TEpVVWA4MlZHWFlObzcwRHxWQFctfSh7SnQme25oI1N9ZUN1OEh1SGNkCitJZihrKWQzNmpBXjVFRHx3R29mR15VRXowOVd7Xj1LSWVwJHAwYGRqSDFZNjBzZ2NEZFhqc3w8Z3NXIVl+ZzF7UzxGTXZ8QCV7Q0hOZ2FDCitUSDVLZi09dTt4aUFOb0dSRCpfTEpgTCVjLWQ5fEZsVStZJHN5K2lYZkVYLVlIITlrbmBBSipjWFJCcGhmN051RGNETzJrbTc3MHFvM3tiCit9XlczVCR2ZmNudGd9WEpTdl9peHVNZzdxR21FSG5OdHsreigqbGdrI3JvNzltKSEzK05TQ1VnWCN6TGo3PX1JUnk2MTNlZHd4Q3hrbWZkCit0LU13YWxEIUthfjYtVGdGJWt8Ozc8YF5WRiUrbTNha2dtYil1Zy1ffCVDIUl9Qz5pMGlGLWBsa0coaSZKfDNEKk1ra05WP0RTd08jSnxuCitFYmt8VGtNYEtIVG9Yd0xfQmIqVDtxWmhXVzhWd3lLYk1HeEhaWlhrKT1iZHx2fV5PS3ZZSn5fPXdzOVhhfEBTbHE7aS1Ce3NMUy1SSjM2CitrKzhEeCRFYWk7I0wmQmtuZW0ycXo2bD0+PGd2T0VNZCYoWElNfWVoU2M9cFY3WDB8dUJtOC1BcUJSQGRIVyFOfkZVPEZSN1YqMU9kRXxSCitaNzV5aTc+T2tIP1kzdUt9PipafiR7VlFKanlYKE5XYy1pb3NWOyZgPUA4JjJYRlhpK2dQYWR4KjwlfWlzRXZPRmlMTTFnMjYkbG5gTVlxCitMWldOZWdtTnNwcEwzR081KT9nMlVhWVFiT311RCl1ZHVrUXcyOzdONnR2ZGM4UXRFbVVOWC1hWWhoaGopRkhyZzxVK0lPVTMjUjEkK2R8CitBaG54enhNej9FMURCRFpFJSVENmlOST4lWiRDRHtDM3BTIWk9bWliPiR6Jmg5TFJNZ3pKUV8xJTYkPnpOeDFNUGF+anloek1rZDIlfVQ2CitrT2BOdTZzUz8wamxycTkpfF48TDhEdFUtYlZaRksrMnkzWHVkUTN3TT9gZnpVSjBJPFpJWWBVdTg5dEAyOEEjPmR+MHgtTlhlVnI0cWsoCis5X0d8MU15MCEmQ3FZZW1ORE04SXpzTi1ieDxOakY/UEg9UWVAS3tORFhSYEpDX3t5dnlARXkrP1VNSVA0PV9LMj13KFVle2tpQDFpNHk3Cis4dlNIS2M9LWpRWm9OMFE/YDliSmsqQH12P1p5QVh3eih4QDg8SD5kciZOVngldzx0NUJeOEJtfEhHODEpYzheMkMzSGtJMD1iQ2UzRntBCitpPTtkflR4bExBLW8hUTw5eCpub3syMXA3eShoWiFrTFRhSCtURVlfY18kOGUyb0RaYHcmJC02X3dldXhgeXp7cVU1VGZnU3JtdVhoQllkCitMTTZHPWpGRSF6N3t1Pz4obWxRYFk/ND1jSmZvcHZyfTZgPCFPcTBPN2FZTD98SkRgbyRZZnw7ejRfYjl5d2NjQjd8YGBNQGA2SUoxYHJaCitFYUwhVz5RSUFXPndmTmROKHJ3OTdPQS1meE9QUyNDNENjNS1SU2JAPlkyUT4ya0tKU0R+NE1NKkw0XzlAYypFYW1nflcxc0szNHBHUCNJCit7WnooQz80Z0tMUkRFRiRWOE00SERGOUlFIV5mNkxGT1hKcTsmZV8rdHY9Xzs+XnwlQ0A/Mk5XUUh5djtqTXVVR0A+a0ZnM1d8QUY3VE9vCitDfndAZilzTEN3QSE/RyNnd3c2Z3NWM25UZ2R7M29USUhnJHQoWFAzej9DNiRDfFVsRSZnIyFuck83ZjV+bj1TQlBuUCloPkA2YVdBSzJtCit0ZXk3RG9kbj88N1Y5MDA1SDswMDB7UjAwM31sYTQlbldXb34zfGF4WlhsWiliOTRiOHwwWlZSOX5UZDlfdkJacmVyPmViLWtFVmk9WUxOCitfRV9xQjR+b0hETX0oaGt0I3txMm0oVygjaWdfQE1ZMm9Nd3QjJHEoPHxCbjNIc1c4Sz5zT1UoJUReLXkzfXF7NmNKeiNjWHJPMUdzQihiCis1JWp0fVNmbjlLbWR+SXBxVFhsMShgcEBvb0BOYCltYTc4Vml3Pk5mSzBTakdPWmhVKjtlejV1QEhOWmZeQmVXfSNkMDA2eFc3byhGSXE8Citrbz5JUE1kQ3QtVmlXSko2WU0zUDNYdDJncTUheFVMQSFLPk0qPnpiXkN7ez84ciVgYm1hMCplJUY8XnJ7UztAMEJyKk8tUDZgKXR4dkA5CitUXjZjRGtab0wrQlckJUNZenAjflhHWiYqa308Tz5TP008S1hRWnp2S2lucmYxP1U8KWIqJGdKNWBZUTI/Wkd+bUR6Mjt4e0U4T3s1JEVQCityZig9TTRRejt1PklqRm07Xl5iNl5iTTNHczBLMWMqSjVMMWdCUzlUeF9zcig0OUZjdDkpKjVha2x2SHdfUHxFPV8rN3R9IUFtQXsrIUUtCitJbShjdD1ZaHxNLXBkRnJrMDZHd3M+JWNOSEg7N2VUKXVyWmQjYFFRWUlnb3pITkEzQTFUMGd6Xz43TUFIMT1rKzBrYHdmTXQ/JSVZZFFkCitBYGBKK2Y7VG1FbFVOI3hiYDlPdmtmREE7Z3puZyRAI1BISkZhYCE+TFBrUHtFMX1nPVI1ZDJQPVVgU0JZeDhFN0ZLUVVOJklCeVM2Uzg2CitFOEpMM2pNMVprPkRBPn53WFBgVitzM3hgJHIyRDMwaStEYHp5RntxNGpnZSlKM3xsdEApUkZQTjw2X3s8c3trNGgqWXJlQVhYZExXSWclCis3dlkoc0klIyoxRXs1fjt5KHU/WjYqZDU4TmlxVGd5b0pZQjxsOStnR08+M2p9c291I35oR0dSRDFiUk0mVUAqdkp6UmI7O29uRFRWVlhgCitXWl42Xi0kcjxATjMqTV9pbXQqZDBwe3hgPX4zaHgzNTljUT4/I3IxUHU9X2A3OHhqPV4qSV5oXz8teER6WlhJITtjY0JRSytmLUhHKmFuCis8WEs9Png3Pml4N1B0JDY+dUghZEIkbEsxaDJRPUUlWUBnRkl7S0ZXKiN2ZDBUSFg1XzN9dDlTMiUzKk1hZ3A8JkZBM3JsRDRFanEhRS1eCis3ITxVZig+U1crKjkwYDIkMjN7V1FkbTtSa2lNI3wzdiFYd2J2SFBycmgpQjFkaSRLTTJDezlCaklOaSphQGo7LUBwWGhPdTZzYllDIW1oCitwPX1tVn1TYComJVFeckBUZ1ZacmcpWFZGQ205bkokcyMyJmElPVRTckxacWhoPn0pRGh0KVY7b3Nyez5NNF5gOUQwYyhyb28jeUUydEFICis9QDh6N0QjeyM3cSpfZE1iMFVDXlpIZ3ZaQVpvfjRKNSh0e2BJe3J6d0lYWCpYaGA7JGg8NVNeJlFgPS1QWEtgIUwlTlVMTldAVikqMGtuCitmTWJAIyV+Jjt0JTl8X3Zab015RWpgdEdnKXhEI3pxQTNleV80c2trY0lGK2dQP0hSUSNtT2tJTVhAJT1nTkNyXzhzP3lpdy08cjFOaiVsCitRZTFZeXM1IWFvfUVkIyVrYk5GSUFiLWkzbS1DVkFBZD9+Z3BgRyRocEt6Zi1XU29XWXchR3ozMERsU2RRWXomb3BaZCtJS0pLa2dmdiZjCitxRHRAIUkwWUt4THZ7MjFeOV9NRmFRanItP0Btdj8hNzV2KV5EIUB1RG9LNVZKYnF5dSske2c7Mkp1IXd4RGd8PEtPdjchJElyX0FxUmcrCitgM0hTPzhPOUtRSDAwMDA4MFB+ZD1NPW5VVlkkWEUjMFFtJn4wM1FHVjBCfnQ9RkpFP0xaZSh3QUZLfXtpWEw0bjhiMSEzV2IjOFFKYXhRCitScnR5SW05K2NwcnM+blI0PWdZN19UQnNtMl5Rant5eEhVVXwzTVMyJU9RNWFmX3ZXZHV8S3ZLS2VXN3tNeCZfaHc2WlFkX1coeEdJcHZ1CitNI241Rkk9Y1hURn5xbFJTZy0kTEZ4b2d7cnFOcG1wVz5iSDVTPFhBdFM7Jlp6Q3EhRWlIelhIVDkhZ1BHRTF0MVZuZ095cUJyZ19rJHw+CiskbHJ8dUIhMXlANHBHbzVXSkxUdWRHJE4yQilGNUdETU4pRWAmV3dsXkZCN2ZJP1lrKU9HNzV4RSsjTlVBbyljTkdQP3pmOzs0Q1RHTUROCis7YTBnRjtIcjxoYng9d1BofWNPWnVrVD1NXjRpSEZndlJJX1JtY01RYSkmPD5AQHN0fmshVytAT3w2flUkaig1ZytNS0smUSV4Z3QxRkQ5Cisrc3l0RmpKTVAqTmF8JTQyaVl0OylVPnVmTmRkVmhxMCo/c0M/Pyp0QU5tb1F4VnhERiZWTFhablRXfXo4NDJhNHxBe2dhSmI7Wk9TR0NDCitzfUIyb2spLUhBR2g7Pzt5RHZrdTE9JWIyMGEyQG1OTURIYiR+PUQwdkVTakAhaFBKR0hsTE9DQkoxdGNsWk9QVURhYjVIWWB1TH13PkJOCitzNytYX19HdU5uUWhBKHVrMmJNQUkzS00ySE4+SCQrNWYhcyZNX1dXeVNta09pNH04KDlaRWVFUDJETURQPzxHd2hBOFYmUXczWDZYWHJsCit6WkUtO3VJeF9BUmRoS0wmSDJvOTdUSlhjVEV5K0M9eDc5ZF80K19qQ2RDYm95QlpNbFpian4rU1E5UiFAP0NtMDc0KWM8NmJqZWlHRTBGCitNflc7Nz9LISlfYCZwb3EmSThTRzJuKjhqUDlPZGU7fiolRi1vdHVid3lyZ0R5I30+IXZ+a2VaM1F2dChTSVM5flNOMmRpS0lVMG5zdjJgCis0RVJFaDhZMy1xNENvOX0+X0U+aml1eE8jKXN5WWFRT19mYFYyZH5CNVk9KTspY3V6TmE1ZGMxVzxqYzFiVWNxM3tFJG5kRHVRI28rY3QmCisxPEZzJSVfXitKfT1IYnc1Xyg4e1ZqITJSUHQkRzJXJGheTWcyaiNYWEF4MS1UUkN4eVBQQTl5KTdiUmhkVyhuakoxUXNYVzNuTEt5LT1GCitSXn1IQG48UWk+a3VgM189KXVgdW9RfHtNM2heYHx6JDBAQjhxZjU1TSVgKlRMdXV5UXVIZ0RfUXFWXmVkekw1ezFkVnMpeHRZYjlmciF3CitjLXhkaGkyZ01rIXYqaSZsI1BsemdJdDsjPE5zJSpwMkFsKUE7bzl4MzBhOWZBLTt6S0sjeygtPzhVXjA4bVE8MVFZLU8wMDtve2xAPj1GCituV0lNdDFPTmF8M2poRWcwMDAxUlg+YyFKYzRjbTRaKm5oaWEmS3BIV3BpXmNYa34xMFdwWjthYUN5Qn0oUWV7NjZuKVFFVCh1OENIJHQ2CitDYCFaVCkqOThPN2hOS2dSUi0rdldoMlZmXkxWfDNrdzEyPFhDT3xxdnlIdlp7SlYwWEtiSSFmaksyOSM3VXY4ZUlTZ3RnKigrPUVSZjRHCis1PkRDTSRMYUw7aWZgN1JYdl9QRCRLVzRUVTUtYzhIKEMrRV8rZ2dZK1JMTWMlZXBpOEl9Y09nWVM3dU14TVdjWiZIM3M/eEhyST1UbWdJCisqei1EbEAlSkIhe2UmODFSZmRuQFZtPCNiR1AtM1VKaT9tejlRJGIzbnczT0ZuO3dyQSFMVjdjT2pNYDZ3MkFmcWFSXjl9ZGE5ZUI/LSE5Cis7enV5RW1DZTF1JlNHNXN7NShVaDk/cTQwWkU9NHF+Tk0rJVprU29TVThMeU5KUFA3YTJKTDUtaGQ5XmYtcm8oMDFeeXI1U2hsfkZvSj17CitgYWJhezQyYlVvcTlQSys5JVZATjtLZ0h6PSFpcyEyb1ojSU45diZPUFh9SHd2TiYmWT1YKXF9IzZ2aGxpVjJQU1Y7bXMycDZ8dDl0b1lFCisyMUlrenpESWZAZS1xUm9rSGEwWWt5bHlHQDk9WWA/NDhzVlNOYm0qTjlxb0k+Y1FOVVJfRzE/cl9JSFRyaFhKRlhyXnRwZUZkITIkR0hGCitCPlQwZmVxI3cyRFRzeno4Rm9CRlktVkhreElASXorT2hBRT5jTDFKUlMqZ3M1fHhybjJmVVN6VCtma34oemR0cVNXUTg8bz4kcyhYNS15Cis2fU9QWXBEKkBvXllvO0ZRJD43ZjlxV3Fadi0pVTZWcGZpWXgpJGFvV2I0VVNLOVIyTzQxJENkQmQlVW9KJH5hV1l4MVZLJlB1VH1lS2hmCittbS0hc2QxLT9MZ1EkV1lUUC1tTU9CNEolTFNrMUxVV25xJTVqYEE/dzQ3QThabmdhTEY/PCZoeHVRPi1+NWBsOTV4T2dQUnkpWWgpVk5CCitEUl97YEdaOWFzWHFXU0VKa18wIzQmYiVJSndIbjtzbjgpazdAYG4mPzhKZytuM1g3bXAzVH5kPU5USDFFMHJ2SEZETUglPDwtQDlibGcoCithTUNNV3pJLS00KWE9YCNRLTI9fTdiQShfKGNlV0peRy0oZzY1OTE9KyVOXit0QCUwUD4+Tn1eMnZtdSR0Y35fYEo+KnNkb0NCOzZaUVRvCitkT2JKO358SCMrVkRGQlpMNCVMUE4tSkJXMGdwSkJ9OyYlKyZhJmhrcEYrTVZNZlkpdzFzNj0qajVqN3NOckd0NjZYKSRIPyZrUTc1eUh+CismX3RJXytKfHNqQkFpMyM5S1Q9ZGh+bDxmK04rTGU3aH0+WVV3eTQwaktYKnVDQCpfMW0tZz9iWTJDKHtSa3xDQX4wRFVpXj50c20wRFAoCiswXilfdilneDtGJUZHTGI5XmMwI2FTek9PMEQlKCs5VTFIKSlge2tVSHxIKT1jM142bGVGe3VqOEZOJVEydUxJemhoNkk+ZDBIRj8+T0ppCitiYik8RURYfWIpZUUpamRKLU5XVmtyJXt1I0l4RUBeQ3pKWF9GLWJfNzVhcEdFLW8lMnpRaipDRSledHVnJXhoWG9YZyNaU2M+MEtzX3F1Cit4Y2gqaTFmdj8pXiVKfTBBZT5KbEMqPEw/ams1SFJoZCNDUSE9TmteMUgraHxKVnt3MCYqJnA3PlFMVkFSR0ZkbkdXWmkxSkFDOEtxZ1lECit+JV5FWGdTMHxYUVIwMDBPOF5PWTd5aVprMEB7c0k2MUpwfSomOXs+T1ZhQXxOYVV2XzB+V04mZ1dhQl4+RmElRlJLRkxROGRaZjwzQUVeCit2OGBRX1lVc0hXMHErREYjXi1VS2QpbyY4WX5RcGo/QEAzQ05Obyh6XihmenxkTmhPO2k+SVFyZ1Z8ZVRKWS00dGJGejEpQWgjQCsyOGp3CitzJilqNGpnZjJ6TXJBUTZGQj8lNEEjMChfMnY8RFpGJTspJUxLcypNN3BeKFlPYChPYlVsUUp6eTlfUnJiP1RRd3MwWV9rcEhERHtCaG1DCit7PCshWnN2NTJKP24hV2g7RHQwaFd2JFhSdj5HfXFMbGtMbEwpZjhJaTd+R1dEM29vRHk2UmQ5P0gwK2JGNTg+ak5HUD96aEZqIW1JQDQkCis/O1lQSnZ6XnNlOVlvVX05NVY0ZztVZnNnUjxhSH5INUVgU2VSVXIlSCVVZkl8PFg4R3lCR0xMZE98NHRDbWZuQ0BaU0pmZE49K2trMUZECis5K3N2Sl5ESk12P1I4M21xQiMzamluRmI8MD55PGxUSGg2alk+e3NFOT0/Mz42XiUrZF9UajdLcUhhfUZlcTBafCFBMWZ2fE9FfTU3P015CitEaTBNMmFBIXlRNUJgY3NYWHQpWl5IRTVpPUNJISRVZWppYUVgcTg3OWElaTx4LWwjVjFUOGw9QmYlSyN+SHpwb3N1SmIyUnNTb2x9U3pJCitnY3EhKGhRa01AKGxRYk12VE5FbiRCbj5MUyM2K0F0Rmk+UE08RTM0U1Fmcj00OSRAV0ZFVFR4flhQRkBEeD11b1EqR0k7YnhkKj1eV3llCitKS00xMjZlV2x0NHZnb0FoSXhvTWl1TisrbmszRnBCdl9pYmVpUmxOYVZgPSVqb0ZrWTVwfmVpX2xxPmMjd0ZoYUxMZUZBUEJVR0t7KlkyCituaVl5ODNJc0wpQXZwXkBfMUlfUmQ9RVU8KHpXKSVUQVNqTEEhRD59QFpELV9hMSF+dTUoP1ZBKHlmdCFGc2FCZjJ2aXJ1LXEwWmAzKW1ZCitvN3gzYT9qJXBSKGoyMXw0R080VUlTdGdHQnc7RWskbFgtQEEtO2dNd2NDOyl0UiglTzZAO1Z9I2JLR0FHKkQ9cUYlMldOdjIxfXxRP14+Cis0VFFHOHA9bkVuYkoheC0lOXAmdG5qI2xZITN7dlZeV0ZAPlpUJlMoU1NRX2JCWGhzZ2JHK2AzaW81TzRoei0pWE5Rem9qIVR2e05BcldTCisxKlVoc1ROOGUySFZISSgkVl8hIVBqXkhJbWNoJGVlQT1CS0QtfmlKa3JkeXU3N34lLXlacDw1QzhQeD9MRDRZKWojMHBfNVU5RWBjb2YxCitfdTxRVHlIQ2phNE55eDExUVktTzAwO297bEA+PXZqcz9pMzB7e1I7MkxKI2QwMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJVdGVpCislWD4/eS1FXnY4dVJOSFJqSFZ9UjFSfTdRfk9SWT5faVh3JjMxbFJee0hgcHtBI098fH1tY30tX2xCa2tZOUprbmhgd2w1ZWJ7NEg2bkIpCit2Kz1BNjBrM1p+eXBwLWBvNF84RHxgSH5xOzs3YHA8MUphQH0xJmxCNEY1Qm1RY0B8anltSiVnQmJAZjZ+anxFQXo+bFF2SmhrTU5yQDdECitXLSRfKmFMPDhoRjNpSlY3UDVUSWR0fF9ySEZPSnI5P3EwbnhsTU4jVXJhd2IrMWM7T1MlIXMhM3N8RyN0OGB1NU9YJjchSlAoQk1iTyN3CitQQnFSZCgwUmtEN1V3X0FuUjZYM2o+QCV0bD8mcUBqY3BqYTxIfkYqPSUrXjkobjhJYUhhUT9XVkdQTTNmcX5TUWl4OHRvWC1je3F6QzVWCitMI3gkWmlAR0xZUD5FKlc1dVMtZHVYJip3VnElQHlNdDhePD1OeVIzKTVyRFo0N25Bak57TnlYbWE/JCVYRk0lI0NOSEF1YTR8YE5qPn5YCitkVVpBXz0oPCYxUDVnKWZ+cjYpNlUzVVd+akR7ZXhSKEw8fGNWYEklTnpGSUgqaHh2TEUjQ3tWfCo2UyE2PFJveFZORCVkNHFWIVUrNyFgCit9Q213IXAkSVErdWM9NzZCPTBkLSZUOFl6aC1yQkVaN3U2MT84NX5nNGY7blBTP3dESj4mVSVSUztRV2FmSWA0bT5GaFBtV2hfJkx6LU9FCis/fFBpMmZ+U0VHdHhkKHNGO1c4TkB8R01PXiN7K1lAfWlybElpZ2pNRHppU3lzc2M4LXAzVlllaGpZbXdjWGpBUEBJPHRIPEBxd192UlpYCiteQj9JJUo5REpTKU47SUU2ajUkJFloODxBQEtgcExvaj5BbDMoKz1sV3NkJW0wbVZ+b2lGRnQpS2hzYkk+TjV8bntSK1FpLTRAeHAzeW5nCiskZ05sMjRhYzc0SD1ieF8tX2N5dnRwJSQ5OD9taHJJJGhEK3tWKn1HZSFMJXdrYj5MK3dUX1c9Zzt7O2RkPzl5USl4WmhCWEtIWjZnUUBSCit2RXd7dHF3SXxnUVVRPkNTQHgqMkdDbClyUm8+T0AralQ0NWkxcm5mcFpAYmMzPXt7Qn5qQTUqZ0lDJDxYcjlIQE1uI3N4eG4oJjtZdkB4Cit4c1dUbyg9djhCRSRnRFJMJkZNYWJzcShGfkIzSWBOcj5Od05CNn1DOWcoJFN1eHBlMSp6YnVCa1VIKXZkRyROMXIjIW4pcksqVXM8OWMtCiswPyp6OSlhX0RFOHo3PUdDQjFWSXlsKTQkbUxZNF5BdElTd0NHSHJHNkw5PV4wQ3M3MXBHRncwdEkweEtxPnRnPiZIckVPQVkrTW9ZQUlxCitOXi1hWVFKflMpPEhDN01Qb15nQXpxWCRBJG5BIWFIcVBhak5tQUE8S0pFdXp5QFJBQU9LaDR2OExYPHt7R3hBTHhmPVNOTXJvSV94ciFLCitGRGZlajw7XiVhO28rUVEhXjdpPDBNXnBSMkNIMzRNSjwjckZaQWJMOGhsVz5BODFRbl5TbHU/JX5pcmhTcWBCdCF6S3kpM1EkVn0xUVktCitPMDA7b3tsQD49KT59XmJVNWRaK0hLPno/QzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlclZQcykmYlkqZ0xFXnY5fVRXeGRPI3U1CitJYFV2WlRfNWNFKXBsWUhyTE93WSkmKHJCdGt0fFheM2J2KTNLSUVzaXMwTDY9RkNYQGQ1PyhWKGQ0bWkrTW54QG0xR2pUKjxaKk9tSl90Cit9Pl85PCE0ZEN2Mkk9TiVrO2ZPfSNxI0JSKDA4aipnQi1yVEJYenM9NWshJSFedS0pI3hBSCZ1RGJGUEFheV48MGNpckMjIWpxUmpnaE1SCisrbGBoaW9DM3U5dUFMciYyQUp8KT5IeD48dCFHZkJvaVpeI2NUdGtrcHB0ZCNJakVFdE9gayVRTC1Va1JsYS1fXj1QeXpeOT43T1VYZk56Cit5fUo9R1VzZWhBdmYjQHt7dmZLYkRicUFyZD5zfmZvXkUmcyZxX1Z5OVgkRkBLQU4oayVzPWZTOTJ+KXJBdWdxd01ZSCghPyhXXl5XXlU+Cit2KSUxN0NNJnUxPnJQNj1pQEBCYnJEOWwteHlMT3JJTVVnTV9PI3dQcFoodk5wJVN1ZXlmYGZBRjVfVk0pQXsoUXE7TytUMHJ8JlFDcU87CitUSiZISm1qbSo+JkQpNE9rez5fT0MjJGZQKylNWFV2blZlNihOPUpeeipDYDEtVilwOUwxQjElP0tDUFhZXiQlckBnK0d1bCUhb2cwTGB+CitqYSZsdnA1UnYjY0E/c2d+XndCKTxTdlc+ciFyUHZVS3x0Y08lMUp9cEgtSGV2PSN2ciYzSUZVITA8ZEB5YiM0WipGNiUodWZDZTgpZjAtCithSz5JSjJibT87YFp5YVNrKEQ0UG9GdkwxfiZLQz5GVzBPdlh4a1dkQ3RWclUraUphSmJ6NERJfW8xJEskZGwrOSFHVF57bTM8S3BKUS1sCis1UUNVYkpHTDtqN2R0aWJgfFgtTz9MSklkeVJGKUEoVE1majVxTWombD1jbj1Kc041RWRVdCgmYFI0TmE/OVhoQHpUcWswZ1o8fEE7JjEyCitoOz4oeGo+Q080dyZCZ2dHSmJYRENqZ34yfEQpdDhhO1p5PT5rU342TzYte08mR0AjLWd6JTBJSmNMcit9RE0yUHVmeT1RZE8wdU1tcU0jCitEI057ei0oKWZCK2ducWJPXkF+WFhnRWZlc194WFltQTJ+MipLKkI2XjIxcThAeTV6OCQjITxLMVlpRCEmY3Q0OG5CdEZ7RG1tJWVDe3ZfCis2NG9meioyQ1l6MD1TRWw8aDtKTmNCdlV8SmstREhBMTZQbk1gUGgmN15JQHVpP0tDTjJTVFIlQldibjwlMCFCe25kS1B7YT92K35PUCtUCitNI1BDSDJgSyg7T2xLaEo1azZlVCpAX1dsUWJvTVAxVyE7LUxWQmsme0ErdjJKJUgjR29xWmAtJTYzI0VBX3xnZCZRJjQwRypNUDclbFRCCit6LXFQWDhINTc5VkhvcnhFMWI/NHN4RTZiM21CTk13NXFJI09HRCk5SVJKYXU8Rj9fU3NebGpqSWwtND8oYCtuYCk/fjx9OyFtaCpTYFE5CispXzw/NFNMeGNlaXluS2tJZGQmbX5XYnRuO2Q3VT9EJXk/YWtPO0x3dlNgWStsKUhOQFA2bz0qK1hjKXY8QGd4Tld6ckRJO0RMX2s4Ujh5CitUKVhtMGliRmV8WkNRJWVBV0ZgME5tJkY0JktObz4wb3JDPjN5SWF+OX1hTjlydFdsND5zc0RldEFGZmUzcWNJWTN4TmVQLTFpI1B7S3YlCitGPzk7N2VKM2EpczwtI2Rka2FGeU9LV3UoJjRXQzdFbFByITBTeFIpRylWTTZRSFAjcWlwJDZIdyg9c0Z9RTQjPztDcyZAUlJteVQyIyt5CitWb3t7RGs8TyghOzh7N05jKEMpKnVKJGFRcWI7PHtkRnhzQVMwRCtZa0s+TGw2PXVnfEFeIUozUFE/a0hkMiRtZSpJYnRzYFlRWnNRXkp1CitAflRgMHUmZ0VFSGkxcjBMbVBBfnFuditqNTNMflNZX2Q4U3VqeyYpZWV1UDMlSkBYMTY4JTRsenopa1FpZVFvdFZ+WWB4aiR2aTE8Tl5QCitSeH1Nb1NSMVAtd0w/PVotc3YzVkIhMSFzOz4qdzlUPDYmKTItS1YkUmJsd1NBTChFOVpjYHE3VGtzdyp3ZUEjQD9JOz58N1lnfUNENDNNCitFWWNzWWdyPG5mJU0/OEo8TDt5QGg2QSo0aFY7Szwoam1KdG47ZGp9KGF7PjZQRTNrT3xWKEVDbzF3TT1VJCRRb2B2IXZLIW1ONF5uaT5vCittM2M+WjZwN0huJXBaQkxZY2dsfWtaKXs7NHleUkohaUc8dXxiezZOLVZWaE9wTXBLdFJ0O25Yd3A+ezIpTkRwfj9hT1A8QVl6VUZEZ1dPCitiOGs5MGJxP2NaSWRoMS1zZ3g9eGd4K0c7NVNRPlY8PGViYVNoMHcjWmJ2WXtOKnVMTDJUQDc/d0JIKUdZXkZBQzVLd3BWeF51YTxGS2t1CitEdFMzZWBEUEp3d3JWb2M9MlczXlFsU0p6dlYyU2hVISpHWD96NkglXkU3WD8mWmd7JXJ3cypTVDYmbTNzSH1vWCpFeztrcipUfnk/SFAjCitRYTtGfnErPj4oQ04xOVVDVENMc20mT0skJHY+bjZqTEN9PUZjdE9rYHg0ZTkpRUh3YSVVJSYoalBobVc2bVFJa1lSemNXbUwkKkk0d0JACitsNVY7SHxObTRsb1BWbCROc3U8c2J1Vmh7K1VYQ2wqKTdOJE5Ha1JgYDVicF5ZRE9haXY0U3h+JUhYezkwN0lpVXE5P0E2fDJfV0lydVNjCitUPylKdE1UM3tUMnpLI1pGfW1ad1JHRzdhOFBqcjRWanIyRlZ0R2YoKiVaNis4OGluPiVDWVNXQmA7dkRAWSlXUXBaTmdaVm1qcGtrQ0xGCismaj1vO1o4SE4pc3xzY0U+NFI4ViVSTm1rY3V7c2Q+NU44ajxmZ3h7YWBGVjBMRmE/WmxsaUp3JXF7c2dAI3ZpcFUyRChed04mSSghWXFSCitCfCFRN3U1M2l0ISY/NyFhNFo2fj42YF9oKD1hME5kRkc5YjdzZSUjUF8ydmZrR3VEZkpifWQha04qS2JyRkJUaHFDYUtETDBhSTBkZ3l6CitEclAwczNnQTYyMXNsMCl2P1lZQkROJilRYip9ZEtaTmduRTIlOHZvNDd0UCEjQnd3a3tCVXJDUnVPMF5VWlBKTmRVOUtQSytlYmB2b1gmCiszMHZ1JGE1ez5PVUd4JH5gMC0xXmwoRWJOV1lFX1g8Yl5oZD0kVUJgUGBkczBSLXMzb2dxQmcjNjAweTBfY3RrNm1nVCp3Q0tgSUx4VS1+Cis2ODVmS31lIVVlZkRpbGBKdlNjIXV2O3JFYlJ1fDVHdGl4fUdOXyUzZDZVWTRULTRKKTNQKHVWcn0paXxASDB1I21pejclPEBkJjFIe0Y+CitiRVZJcCtlV3FqYiR5e00zVGhKcX1BTSQ5XlQwckl+IyY3RV93S2FUUzYmN25DNHJFN0x5UnQjaj50JmFrQSNFI3VNNVlDRiNnOUw5IWpOCitPej01TytURUFPPkApP2dXUD5NRkEoa0t6cn4kXz83e2dKb3ApJiRSUUw5YTRVaiFxfHRZYEdydGRlfXg8JF9+MSkheTtgbGFYaWdsbHskCitlLUp9a1YmV3pFbzU+T29uISViPztUV0R8MlBNeiZwRysyVSFOMFd8ZiFTK0kkNkQkWn1hZVFgdWdMVSM+LWUyNkR6YTR2c2Q0JStvWllXCit2elJLXjRSdWRjN29fdyNsKUkqfFl9Xkp5JXB1dUhfVnIzakc1S0JrJkBjRXQjXk4+WlR+QCF7bzFLT3V4T2h3ZSs0dUR7O0ZET3gxTjI2CitHKGcxM3Z8WnBkSXxERHFRJGBnUzEjTFh6YkJ2OTJXNUNOM1pXU2Q9VD1QS3lIRHhCdmpiPis9TkFnckJlbXxUUl5qaW5Mc1o9TXt8MnUzCitWMCk4KSNHSFpJdUFlPklgNUZwYEM2dE9NZ3sjRHM9YEhPYjBSQzE+UEl6MEcmaVNEY0lWfDc0YHxXX2hsQ209TDZiKEtNRjx2U2dkVkR6CituPHxwSk10eUdBQVMoNypPVGpBfXhReWkxNVNVZHJIdF9ZN2pwZlUrWUhyd3FlOChSSik3Y0xtUkdjTDNkOGxXYUhjfDROb2QldDA2KjB7CitGXkRoJTsrRk1hR2VmSH5fTVpjME9AdCtiMFU3MDMqSnwqOCReUis1Rz8/e3ZDd1dkfjI5Zll4ZjFQbV51JXcofnZNYiZ7MyF2YHAyJU5QCitGJlZ9V31Uak9vNl5jd2Y4RiYlanBPWCQrMWp3b0QmaWwzUUFoZXllISE5Y1o+SFFfcFJIdkZHX3lBYDREcXl7eVZOXjIhQnBfSDNCKVRxCiskK2B3VXhAcTQ3LTtxWVNJPURhcFQpQDNKKiM3bV91Uz9uMmd5fHZlfUlrWWk3NCohK2dqQ2N4X1U2RiEyNEpTKXhob0t6dm1fO3F1XjVaCit5ODNYVHRRQlcwWiU5RilTVWpEUlBfI201SD5eY1VBZT5GaTVlbT81KVl0SUp4V0dEKENIQyNeQjNzQz5KYGN8JSlBWEBRdi1jKkIoTUBjCiskbyVNOSRIZWhHUyYjUDFIRGMoJDRIQnJycDBkYUJxKDljYFk0KnojWTdsdEpKeWYlKT49ZG5LKU5RY2B8THliZVZ8STsoQlpXMzZRRyReCitjMiEzNkdRQjUmU1leJShiT2hTYnVNRDN5d1VmSHtpbnFsI351OEQtN0liI1F0YyQtd3s0SGVvRSZ2eDx7OGpNYkxmTHBGLU88OVZwUEl2CiswZV52NEVwZ1NifHZBIWNxIyR6SFgzaV8jQ0FQPG9CQ3p2TlReMndMNENXIXRvTmxXQHRDTm9CRl9CQ2kqOFZYVCg8MDZMKVlgd2Y1OFhZCishREMhQDc7JTd6UCY8PERvZE1ATyUrcldGY0AyIzhCfHliKHVGMFlrKTJ+eyNSeTk/M3kkc2Vfd05LWCZRRTVIfFZHI3lUOzY2bzhWUWZ3Cit0XiNzTGd9ZFUkKVFAcjE1N0Y9cjVJRVl4LUZ8O29CQy00R345aiVCdmI+UW8mVThlQTRiZzY0bFlXNnJHQiErQUpFLV4mM3o2S21GcnRCCit0P2RNVFBvZHltXyM2YUUrOE0/RjR8QXNLPWF+bUNvWkU0WjBER3tAQnFjPFE3OE48IU5vbUBwdCQqPTJIdEFaJnpoMW9YXjt8SypMRztqCitSclVaMztMIzZmamtldzNKSmJlfHVsclZ5fjg0TT98OzVCYVohbipnY1hzeytec2FWeHl1WHRedE9remNiMkNuWG1ZUCZWdT84YEJ+KHJFCit2MCt6VlU7SHI/IT5Db2o+QlZQeEVJMyE5NzwpZyNZOHZwQVJ4STItUGdGKmRocFlxan1AYXp4azNhbmU/N1NfUz9PajhQfUkycFgxQVh1CitPdSlmNFJsNW4jVzJ1PVgzX1Q7U2IzWVN3Vz5GK3VSKHtVaE1FdCRxSHI9Nl8rKDgyTlZ0RHtUJnFycGlZJnlTJEt2bVpPLVpqOUQmUzclCithKkwjMERGQ1BiJClpJiN1dGhifEhaYXdhOVAjaWRiY0Yld1FFIXZ6QXRDKCp4dDN1aTBSeTJ7bkBpY3pzPEQ7dSFaV1Z2eTUqKldvVk1iCitYNVBQK3RUUmllYEtkO2xpJXZNJDF6dDdkaGNUVWZvU1h2N3lpOShnNCgxcFM5NkREKjEwemtaMUApfHRtWnFOKER2M1B6SDckUyNOZChgCis+T0VPYl5teUsjUi1QbCkwY2kwOX4meGIzIVRiUTlAVD53JSY3XlojdHJyVnRQOWtLP3dQTiZRPSpVeGhHUnlDTzxkI2EqNmpGZ0hUUFQlCitIUkM9U3I4YTw9NzNaSGlifkBOMGx7SGt2TDRFKEIwZ3R4TWlmTyE0d0dYUjk+bHVzMyo1ZzlaMWRkZWs/U0BtaUNeT1RBJlEoNUFsTkBlCit7VHw7JjVHVyhxbngrQCU0USkwWW9hQ2dZa00taDt+SVpFelV9MC1HJUY4MilfblpQcmhAbVB6QFlHKnVgIXAhfT5gZnVqSXpRdnh4PSVjCitCSGAqbDdrOXBlS2QtUm9mU1NYUCF4cnteSiM2aGl5JShucUFSamFtJjN9JSs3aEk1K0hOMTIkLV4+ZGx5aGotQXsxcUJHfk88SGRnWUVnCittN1R2U1FjSWZVeTImMT9LRSpJJVdNQVlsOWlkUVA2WlUrM0NKcH1OUWUrU0hkVzwxVikwKT1aSypQO2dDSypucjtaflBCZjByR1VEUXlgCis8UXloQTkrT3BAKTRgVHV+ZUQxS0I8M0RheUVxQGZpelFea3I9RW4pMXJ2SUBGTkVeT1cyUXszQEdZSXRMNFheMVV3P0dEQVohQTBwQHEoCitqXj8xYHNJWSgpT348dTQoN040SH5IOzBRV2xNPzt1QHEoX3FgNiREX3dQSzl6JCFqZ0lxaGVlS09qPl94SjY9TXV1YlN2ZDNsdU9jXkhrCit0R3xOZm9xODN0KS0rWUwzcnJsN24wTm5gS0txMUpRP1IocmBVelglSWl1ZUhuRDd5YnhMY3sybzhAZk8pUlhTYnBgI1RpYFFDJE1uOExVCit6eXZFPDBzUiUweT1LdkN4KmI0VUBvYWJ1YV5kbDJUPXEhRkl3bC1VZlFBKlU+fFgkOz9fUD0rM1AtcFFlVz12VVhrQHY+K0U2M25MRFNLCitjKWtHWGxveUhkPDNGRFI8NT1eRyZNemRhc0BzXkBLXmw5RzREcTkmb0Q4Tz05YCRJYGQ+aCVjaztlVT92JFJRbnRRWTJOcmVWPzRZTXNGCiskN1V9eThUQno/K0p0anJPbXh6R29ZPSk5S2tNI0ojcSh6I25idStZTSVsPG99TCg3JGUwKkMzcTxZcEx7Z3BPcjw8VjxZWSY/NjVKaHw9CitHK18hT2pvN3MrSnU7ajd0NGQ0fD1WYH1EIWsmdEBfSHE1TDVtQTQ7RDVDVmFjM0ZPZ1EhYGBzNHwqJGVfKEY1NlIxRlMqMjNgYDRAVDRtCit8ZCNwaTFfR0VSN3R0Tzd0e30pNTljZlc7TkgrPyV7VmgmZiYrMGJ6YjdXTkBWaWpIPl9pOTZLQDR1TCRaJn0yU0FsWTNaQjk2YlFyUl9SCitQWVMpYEVFYUtmRVZQZWxwbzUjVGpqRip1KkhmJCk3UV9EbGYzVzQldWdOdHtMR0hhTHg2JDMjO04qQ19DbEB7QC0kNWBVKStpYG8kMzteCiteVUVGRzR7PmhyKzg+RmtmRDk1PHdXT0IkcypFamdlIWktSWp1bGMwSGxaWjA/QSNFUHk2Z1BwNkVoYytjK2ROfXY2e3tLbTk4ZzZiaEJOCiszREJiLSVzciloTShBNks4SFcyJjcrQmN7M0pLNGU2K1UwekhyVUFfenBmfkc+JHNWbXF6QVpeMEpve3taRExsMSlVcEBLITkhJVRjNyFOCis4ejZMe0JSbFomKit6NTZAcEooQE96Mmg4SmhGWEBXaT9oVTB9byFkc0g0d1AyYHtzflleMHxYUVIwMDBPOF5PWTd5JUFWJXZJfFRwJENsCit2cXk4dnA8UmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GSlcrTEVedkE2UzVhQDxNaHQkfXVPUWs3K2txb0BjXlpWcWZSbEpqd2pjPj0yCitZWG5EPk1ZVXImNX07TEpIXz5lP1lFQ1NvZ0IrYW5zdy1hd1d1RSkqKjw8QiQmV2BlRlg4YXU1RTdOalZpN0BRPVpEfCZIJG17PyNmdzFXCitaeHRHQUxRJUAjdWJvI0FPcWJGP3VGQCgpa2E/TTVqKWdUfm1rNGpYNl53MiEhWFN0ZVJjXkZnRU51a2NxejZaQHpCeil+MjdiaCVLKWE7CitsKCo3Tz5RNj57QzNgUV8yTVk2PUJKe1V4fXlmX19TT354PStuJj5uX2lkTStYZ3RkcGtUJm87SGMwcC1ON1JFP2JtPj52Sm9QK25qbi1oCis7cGAldmt1NCtqVVV3YV5SR2l2cGsqcGA0UDEpbTFfK2l5fGVFQkJkdllsMXZ5QSNYY1QqP0hgNlFrK1clMzNOM1B8KElmeFlkQ0YtaGFKCis+JV5nUFEke2k0QXduJCpCbCMtJn1zUXA/ZiEhUjg/OUVUNFgmcWxaa3VPOHo4WFIjdikwZ1YxXnUmMXo5KShmfXtmIUdISmVMLURobDNyCitOVzlRaTI1fjZwOSR3TyFeMkZqKDdWZ3JvWHYpS3JjIWNqe3lnOFdNaW5oU3s9I3xqdU9YS3hRcSloVVlZeWtyPT8kRk0kRj8rVU5oU0kkCitjJXN4dzt6TXZ3JUJsUDkyY2g/cV4zUnwtcnl1ZTxqeXJ8T3VAbHtBfEY5LTlhWkZ+S1BXO2d2PjJ+OyNgX09taT4xNk5FSVBUVD10SURoCistUnRzM3Y5UmFFYFF6QzZTQnIzYVhgN14zRzRteWIoOGxsaFY9fG1XcjQ5P18mMHZlb0YjP20hKTNGZ3grSlMlZmxtMkUrdXQySmJiX3o3Cis/PXF9XjdqTDRBak1uP2tNI2hzQ2NNJmJkSj48WCFEfjl8VHxISVluU3ljPyMmcGlLNEU8QkdqeVg+SmNKc0s1ZTAxUzQxPXI+NzZKTk92Cis5emt2elB2aThPSEI9Yit8cVp5RDlOTDNQO0NtP25vPGZTKkYoU0deU0ZzSTwwX0RsKiYqUEF4ekt9JFcmTDxTTGJrWkooJih9Wmx7QkBACisjVDByaFFedV8hZXxeUV48anNNPjg/S3kkWSNYUT5LPENYZjI/R0VXI3l0UThKJig8bThndUpWZ2F+T2BSbTNBbzBnTyRqaHRePGtkaUJ1CitxbHgzYnZ6a21VQXdqQ0t3YWhaXk93TEc+X2JgSWYoWXVxfHRGeX43SDgoMSVMPStUPWFTZT52P3FySlhUQklJXkI3YUV1OWEoSnxISlh3CistSmtsKktFVnNkaVM+YCRBTV85fUBrZzlkVHJNXmVOcDY8Zz5UO3VINUVeO05CNDNiUFR2SX5zdzY/RFRBXklpeFNiQ199PV55JSpMdVhPCitKXkU4S0s/V0c9UG0ocjdEOTRlITFZYyNtSDxQczMmY2NtdmlyZzYoezZqQDVKTilgJGcwUVEqc1lJMjw8ZnVgJF5CZ30jRjBkISVNJGNECiteNF4rMUk3RFdpJU1AcFA0S3xyNUEkKitEXnxTWSNvSDNrNnlqe1chUXw9biVqP0shZnl0MUlIQDFISE5hTXk/VE41R3Z5WFIxX2k9bENKCitBanZQdkheVHcoKClpSiQoVXJ5YU17K3EhWGZyeVAxb1UwJHJSe3t4IXp6QHZPPTJucz5BfTtPUE1TXjcjQUY9eUkzSDEzeU11dUk+RGNXCitGNUZFayRURnVvNXszc0o/K09fO2NXQEk9KEVPKGJXeTImWjRAVS15SmtjaUhPLUlPMTt4Kz47e1djTVBhaUo3PFU5fE8jS2ZZMjBLRE4wCitge0hqNz9IND9VV2xoMHdmY3pme0gyTnVEI1g5TjBKSDdoMGMoPlY2dyhNKz5xaDMxcHJvTDFyMT90fSZ7c1VjYEFifn0zd21GQDwyd0xLCitDMi1RZ1NKd0BvaSN7YiNwJllvWTd4bihoO3VYYH1EOyZHaDI+WVZ3SVN7Xyt5PCk3alp5Xj9rTl4yWWZFbz1pfH1ZKkYzdkN5RDlwM3FCCispYUtXd30od2NRMFBnZURDNH57QEZJaCtzLUc+e1RKfGAlbTEpXl9SRTFLWl8yQG0mVG4zSGV0Vj15cylzZjVmeEBgYC0wUnxWNVYza3AhCit3MTMlbj1DJkB5M3pGWHtIdThYeHAqdX5CajFQZ09FRSk+JnJRTVl6bmZxOTlOYlQxb3Q9bDE/UWMqXjB8WFFSMDAwTzheT1k3eURQe0xQCitlaDJebmlXJmRfOH5efFNhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkpYMGJYZkFNaCV+KS0zOCNmYUV1M3RlWUZtXllRSG5FVyFmcEpGCitSK1V+X0A7ez4ofjxkNm1uTj1yJHNTRyF4MVlzcHZpZSo0Vn4kJGdhXl9ydXw7NTZQTXc0KElpbThOT2lDbXMyKGBRa2dHTFNZO058Y2VwCitZZGptUDdXNjJEaE04eSlrP3RWYUs3fDM7JmBtREZycXEqVyYxZH5VZVJIOFUmMGtYWW5LJmJnNkEmUT81NkdvZHRGNnBHej1qPkxaPypKCitZcyRFNDJTbyFoYWRMdURANFl1UUU5c2pUV2p7dmwtWG9fJF9tTHYqV2lTMmw8OERqcHhPPjxpPkFURGw1NnRWIzJnaEhBUWhSaDR2KDNZCitaUlpHIzRSVkxOUGdwPHdsWHJTRFR6fihOKzRiZG8oZVQjSyU5ZX40PFo1blVfKkNJOCpWQ3twamBFN2BlUVVZfDlFfE9kM340TXtwLV9aCiteNWUmdzU2TGUjS1ZNIy1mNHNRN1Y1Y25MV3Rsbkt6MX5oWW82UXNxeDFORmBSP2pyKHZpUmBKJnYjZUpyP1o8b0ppVj9tQlNCOHtub2d6CitNQEwpNj1yRERNbkZyMXR4PXBHYXt0aDcpJFV4UjUldUp4dStYPj5BVEBCYFB9MnZhSFdDdWN3NEEkQTZibkFJPlEmbWtSaGY7R0k+UVUmCitiUXojdCkhOzs7NXA3elBMVzxVan1QZmJFaFppWEJ+JDBqSztoZkU4cGBoN21Efj9EZExkXmlxSjVeOShxVXMzNDlBaWBqMnRaV142JWt5CisjcUVmKFlTUk11Kldxbk9ILX1sRj5CLSRBYkl9Sno0OFkyMkFFfkNQX2pxdmMtZmMkQ19sfTV9MDJYPUYwT0Q+N2BQSTNJajZUM1N0WWdyCitQMl92QU94YEN2ck5RNlJFeiFvPyhQIz01JFF2KEw/aXV+Rj9feGZtYXlmT1I7SFBQQF4xO2s9UlZWendFe1Y8KEw/NmEpT3pmVjFOPFJMCis+P3kkMHs8Qk5xNCs0U3plNGcyMm5AOVEhblc8M24tPXM/TDYqJT9kd0lqLTtkdlZtVHZ7OWl0aFcoXzk/SVJoc1c5RUk8Q0dzOEM8PEdKCiswYkNqaEVydkZvd0ZYUiRMZHshYDcoIVh+IWJxR0w3bGpLRHtNOzx9WS1LMkZ1LVlQZStgPSt9JlUtMWw5fE07X2FXMShVN3kyeUt5PGtkCitRUGB7c34qaVdHLVVSTD80enJCRG1kYmdtalczIzxqV0hKeERUMG83WXg7QEtLXylOKl9ZWGVzendsWCNVe0IoJjViYE1vSUgxbzJYc0ZvCis0Q04yP3c0bkEqIyUzSnRWQlJUSTVCXiFNOChOeUI8VzEyNkVCajRhRmJyKSVYXkZOJkR7TCFeTC12WiR6ZV9CQ2Z5VnN3fX5qamVJWHkjCitARGx5TG93MzJnMFFoUmNkWkFrRCZaPXVORXlJNzJDVkByVyNVMChaUTB4UklxNFgqQipXJEQ/ZDkhbCY9blM0ekR+Yk9waEoyV1psbXN8Cit5RmhBYWZlWihTZzxJLTNjOTd3MzM7SiZCOGI+YD4lTzZkPVAqJUklQ3gqLTZVVnhDVClqI1o+S3Ije3pjelpjcHdqWmowYH5HWilpaDlOCitXZT01U3xodEppfjMpKTJJUHVNLSNQK0B3KSh2eVpoOTg8cUIjKG8zMHFIYSgoZTBLKTVsYWtQKDZfdVlxZX07ckxQNEB1ZF9iNXpiXnhTCit8SmVPTV9JWTliTmFkfXxzYVAmQUJCMFE5Z2EoYWcycShFM1Nxaj9DZWgxVDZtWG9FO3E+OTwkOSMmWT4kPzY7K20hRDl+RG5iIWlAKCttCitPPn5lUThYOEwoR3B+a0p8PlFfdSlTRSp3dm5ueW49eEY5PXAzUFduKyVCTHJpJEd2VHk4cXdUck5CWndXZylzP1hENWtEKypiJVVTUX5wCisybnxkaGYhPHFzSm5PNl58QXhrKHwhcipzeWlxbHVNcVdYcEFKQjVONkJmKF5aNWhNMndRYExIfUFIblMpYWJDSHlHNXU8aEtaLXk7LURECitIbGxvKjFTaEZAantrPD1Vez5oM1FaVEwrPitvSTZjeW5LdSFjTH5AUE5zZjJJWHdPdndHSTl9VkN9b0s4JF9APnV7dXRpN2BAIVpkYmxUCitSYiFxZU9yd2h4YjFwPHlFZ2lJOCpvYV58WndBZ31DZDJuQmxjZCEqfW45Wk96UEokbHA1eVAyOF9tOH4tQyhWNVc8Wn1ZSjBQKHNfKy0pCitTOzs3cyVse2sjbSg2WDl4TSVafXRVezdod1Q7JX4jPHU8ZkclYCpgVEUydW09fHBjMHhiOHl9am0kPEQ3KG9yfnxBc1N1fCFGdHxzR1E/CitURkkhRy0mI3RLMnRXcTVCSGh1WUQ1KlhjVTs+RWIkWDQ8Z0FWOEdWend8I0k5fEF5MCMtcDVlWC01eVN+TiN4d0I4JiVjNz5KeHpzQ2RNCit6KUlWPHpsVHt2I2B7P3tNZFVLX0Q7dGIxWmQ7PT40RWxmKnFFO3VwaSNTPnI3I0tIQFpqPGx4a3BXdFl5Jk0oQjkjaX0yMHMpeyp2cHNxCis4P0toUmx9N2FIcG9MLUdya2ctZUM8WVVXWFFTKSshenJtXnNxMEkyO3EoNEItYm8wJS14QlZRLXdXTHVpRn5YdjtKfVErMlBOeGBEVmxVCitiQn1XS3xfdlhSR2lDZDJ4MDk7dE1odjQtQjJDanxGWjYrLXc8U0xMJDhwfmk2Q3AxOCZWbk4lcEI3TVlSWkw8PGVedGI+WlpKPT82VTY1Cis4ZGV5KitQV3FzX0lremNIWnhEVU9ZTz1rMkIzNDtQUiN0JU0wWEJ6Xm5SaD1+cndRIWBLZzYpKW4/Xn5AMExqazlQLXBtbkx2bDBlZEhnCitRJkxhN0d+MGNWK3FxSjhJMmJkbV5BeSlBNUg3aDlIYHQkM3JsOHNOQUtQQ1gwK09eKGt5I3txeT9jJkVAJm8/UFdCKSFBK0tmQyZDYlQkCitHVnpAMGtFPi1QaSM9MTk9MjxsYj1XeVg2d1d5S3BiOTEtMShuRElDTjI2NzBBZVh+eENzYnkyekgydzl0Vjc7JGlQMFZzMXlYPyM9Rn1GCitMRk0+cG9XQ0xMYGEkNkM/U31eNiM3PkY/RllmaV9yNGw4MSlgIXIlQz85KD95Qn1GWUpSMUFPTnlCMWRaeW53ZjwzQkwrYDc+UChKJHVzCitMNkU5NVV4THQkJXAhTzF7eCslcCFJISF6TjU9QXk+OTF+OzRrJGYjaz1eY3F6UWJSNjMjdkc8enBqSEN7QDRpI0l3eVU0Ujs2KEtiXiRfCitvUkMpQmZFPVUlWEAxPXxSfiRPa3w8aD94aEdgcUhXSVdsNTApX1lBT1lVdnZIQmJLaFFQc01fJFZZang5flJhJFIzJUhvKDJTPU5kfnY3CitMKzN1cnQ2Y0lqZkFJQyl6JnJVZ2YwTjlDSHBadyk+YXtlVD5ZUEhqYDJke1RfcGhNTCFqPjROfkdrN0Y5alc1Z3YyR15sMnZWZz9tdyhBCitpIWY2akU4emB5Nz0hPHp2Zkc3dlAqeXNkPFFYc1c+YFpfKFBNSHdOY01kWFVsPypyaClTVW5lNjxlaXJZZG1MVFQ/UWx6a0o5Uz1eYy1rCit7ez5KPjB8WFFSMDAwTzheT1k3eShAPEp8T25Dd1QoekZCczl7Pk9WYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZKb2IyV3BaPmJhQWpACitteTsrbF5PMTM4WSZhVmpUZW1RT0dEbHJjLUl9Z2w0NT1iRUNtdXQqbyh1X2QtYHMrPiVKMkVxSlhZUSZ4cj5wSldaSVE3ZjlCPj5EXm5MCis0Rll4KG0zYEM9Yysrc3BwY1U2YnJaSmYrIS1hPU54SnB6WVNoUmhIYWU/eCZhZ0EkeiVKKllAXnUlQk5yUyheeGk1XnM/KlhyYzk5a2BMCitaZEs/MEMhbV9zaXEmRlprY2x6clNldE9aMVlRJmQtbGFjQUorenkxZzd2X217TjEtTEdaYi1MdiRpRllnQyVMVXt3ZDxZZmM4MnV8SGc1CisqPVNvQGpXV1J8QmwmOWJibVNBQDhgdlEtb0Q9WEAyNmBxMlZLcz0mRXxoY3pfckAjKUA5ZWxpKWozKFlSZk87R3RSRXx3WSVNNClhRGROCismNUx5Y2NpejRwSllDUEhZamlKOSRDc2Axe3JVUy0pNEBaeHxOV3ZKbGZRJCRfcGVqJlUoQCp9aW5DXyVAO2Bwd0AmQUJCJGdYN3NQOXQjCispe0g5Q1BpJjdxbz8wVVlJTT0tRD9TYGdfWEJeRVRoJGd1QFZFVTA5V3E2LTNGPGsyRSM3a0lwJnhKQVk7c0EhU0t1KWAmZmVjSzFlRUxkCisjOGEwPzF1cjBmRHE3OTcxYCZfJDlnMm9rb1MrIzw+MDJfKDU3dW11NSpXe2FGJEZ5dzIwSTdOVGtWP0BGOGFCNnxFM3BRUWcqYUFaclEzCitVJVg7e31RQDVAciFJaS1jYUo1Z2FOUUhwVlBhY0VPUjBqOVRSSmcyNUpmNHU3RU8xPGZve1lMVUAhbHFmaSNNKmFyPjZKJTkwVVBSZmxICitBTkc3VGJeMUdVREhJYjU9QjFJTVpRb1Fva3Z4MWVeS3taT2h+M0kyKXg3Vk9KQCpBZWtCeCFFQVdCTUg/Rk4pTVh3WnJndChAO21WMGpMCislMSZZOCslcitSWFcoMXM3JD05LSRUelBTLVJ4elpJQFZzMEdIPXgranJCfUAxSnhBY2Z5N0d9alhiVlBvXyg/UnNBXk5tbGBoSUVrMnh8Cit3PSNobjRpWTZPVyg3STF8eHh4fntFRyZGQDFnJnpAbG9qWkpGI0Z7cEZ9OE5tWnpYeHVDSH1kIWBROEk8YGc+Y1lWXmRvdFY3aHRoTUtoCis0ViRXXiZ0eHJqNSRmaTQ4bzltUnZiZCVOUSFJU1AtWVJpQEdEYD1ucEpVYkstMT5oKkRuclZSYStnQ3N8SE9odih0QGN+UUs8YEV6RG48CitoNzFARldMcTxQV2NOcHhmJEtiMERXVEIqc15WU1FQZCMmWWAtZD1ITEduYys9cnxRWjt4PDZpUmF+NnNHNyh3MX41Y245JDRYNS1Ee2VSCitlR3whdCF6XnIoSmduamBTTlRwZzxFTWhZKU9Xfm5hPG11YiFJWkxVSyZOdHRiTTE/YSViTSR5X0xPM3R8V0ZaKXJfWSl7TWpWalElXjM8CithPUU1YGVzY2B2JjJiamhIPl40dFJ9Qip7cjczSylEQjFPQDtgVWZAS3okTkhOJCpuUWIkanB5dCZySGdsQkNwS1Yzb355RkkhV1NjI3t7Cit0ZGJ6LTMzQXs+TjV3JDtfe2Q7NUtjdjEkRGREK1BhZn17b1plNWMwSyFJVGEqIUNaUT45fEdPZU4hYj14NmwySXRadDRkVlY7VC0yYns2CitqWGNwUEE2SzxDbmgjaHdFbSt7TllmJFR0cDYmK2RNaUA3ei1tJiRiTmpgOTlZNTdgO150LUtAXyZ4PGlfOV9qcG92YTZIVVhVdnV2UmVkCisrOWhFJDwyTFVnT0pnK19oSmNJTH1ge1BfaU5ZXztMQ2NWZUxjSS0hbGtHa0w+eSlAJk5rWW5uVkM/VTJfTDBAUkI0RHxIU05pRllfe2ExCit3P29TcG8tZ3pSNmZjWlghI0NafERfJGpCa1Q4X2UjWDxVKFVoOFNrNmM5ZkIxO3oodjB3b0RDNXdjRzAwdz5xMnQ8Pk1CISY9K3JDKntjCitQQ3k2KUtuQWBqWXszQ0kheHRwQkFYeH09RiR1OEBecFdDPWg9NS0/MXRGRz03aXt0cUd6SGd5PnJudVRwbGNpZ1ZIUGFfQFJKTSNOSEFKCitGVSRGVGlBe1F2T1U/WWdrMVE+OS0wRk9mXmtPdnxiTE58YlNsM3JqTGReNzsqQnNpS2JHVldKczNjdj1TPkc0X2N5KGFKbF8tRkhtUH1HCistMFU4LUQ8ZzNxJDR6fFpqQCRzMylvQyk1IVJ5NkR5TmZHOVJeem9KRTlPRz9AI2d3LVQxMzZORmtMdEViSztJbEdhRnpCblBaNyg9NmsjCitAUjtfRzxxUSRBamZXc3pSamQxaiRgT3hIa1l4VUhCQkxWM2Jkfl89YV9ab30wTSkxanBMUUdZJH5Da2htMFYwQlNnQlhwKk5PTX1CeHRhCitEWnUqOU9ePnk0JEcjaTl1NnJPOWwtRD1JZmhNQTNYKkJkRXV4RiY9TVZYY3cqbyhiY0xEZ2xmdD88JChPZz1teikjVXxQZ09DRnpRSzBACitwcWR7TGZac2oqSHtveyQ/cDVpLUR9RmxecHNGdD8/KEA3TXxII0NCbztUemxuWWhwTWhXc05GX2olcnMtPGBOM1dQOGFCUl9qeCE5VWg2CituTHNUXysyYEtgVTJUWmMhUFhKenhaU0FPeEhwanYlYj5xQHxjaGFNIXlGNlg0QjdRUVBgTU4/YVkjQU01ciR8P09ieTt2Ml4yfTsyJFE/CitEZGctKT8qayM7d0hhSzlVRSRkcGtyJFhsSjVKdnlUbmVNeTtMbUZxZVY5e1okVkZmb3g9bWdwbSFTIVR1d2U9XlRVLTxFZS1LWChxWHlVCisrY14yKl5hTGFrdUxgPEI0VippKklqaEVHKUc+Yl4/ITNmV0g7NVIpez9FbWQ+K3E7IT9Tbmc/Vm8oSXU4ISFLUm1NeHBTY0tSVVlNV3QkCitRX3ZgOEJ+TmhkNks9Q2B8NVRMRkRrY0V5RXQrKHFlI0BKOTlaZj55JmJlJihANDI5YjlhJXR4JVlzb21TP1FJPEM8TzU4RGJqVVhfUXVJCis9ZHM0blpBWGlMZ2s/TDYpP3BXX1YhQCE5IUxMezZYbEhtQl8ybER7ejA/PHlJNkxYRnc4YkdyRjZvODM5aTVufkgmMkdtcFgjbiVKPVZLCis8Uz9YT1BDOyQwWm5QaGooK09saV4+bG8hPGR4UChvPCVpQ0gkdUtDcjtQTTV7TDJEWUxwPkBsbCY+K1Nqez0rWjhKUEVOdG5GWENNaTBECitnKHE0NVFpTCVTTX42QW4lVWRfcFdaNHBJdH0hYjZ9LTBRVSpFJGdAUVo3PX5DNzhLZU8mYGtCMlJMKjReK0pAXjlwMFR8eUQzR0g8cDgyCismaT8wJU45OSRVKzxqaGZUIXJJfVQzM3BfTEQ0MkxyLW1HU2xmNDRqJE88NWlzJFMxcU81anshNH5nTDU0WXR6aHMhUGBvRTF+NCFYZDsxCis3K3xCUHp1a2AhX0tMUDc3cGtQZnEpMz9iM3h4MXtpXnMzMWh0P1hubSVkV2QqcitLanNKJFF3U2N+andoTTZYal8zbUVPTG1SeFFxay03CitFOEZQRzNBQWI4Y1dzM0s0NzxqKj94YDtsQDttVyE3NypRWGRpaisjR2BTIUE1RSR+e2t2Y0d7TCF2cl5UPUN9WDEmSio+UShOSng5MDQ5CitOKXJGZ2l5aCNuYDt+OWI2aD5yI3FGTSlEdWxPbitOVkotM1BoazhPTXs2QnxuUSRja0Y2YXpVO01oWTUyVW9SfVIhNlY8OFdTM18xYEdACiszQy1VJmw2LXslRH41QXVuNnJhI3dybHBROV5SVEZ5KzdWb2hVezxYa0FLN0FZUXJpSHJBN0tQKlp7aEtFJUppaXF4bGtiYjU3OWt7flJlCisocFFodT0ze2hNeUU2SUkkI0MqRH5VIXZCP2E1Kypzan44NGo5WnBaQT0yelgmSW0rMDQhIU56Yz9PQno9eWUhUT91a295fDk1cSNjfkpqCis4UWM9ayo+aF4hb2VEYClvIy1+UHlBNkN3JGYmIzY/ZW4zd2JrSlZXZ1FufnpJaFZXRUlRR0w7fSo5WEJZMH1IQCg2U2I+NlpIWlFlKn12Cit1TTckbSkxe1AlZEB1OFNxfSNlNl9ZKFhRVGQyKk8lUT9fMEpyN3l2KDwzN3ZwRW1IIWd+XypqdkdAOT5xRz0mU3JTO3xGVzlGUV89Y2BOCis9R1FUQj47Skc0PEJtR29aNllYK0dMa3tgNDtfWWZ+JElNZnlSfSNoQ0JrUz1IaEomMjUmWlM/PUB2M0puRl5APDNmO0FsJHImY0t9dEZ6Cit7VzV4TFRsR3ZEdDR0ayYwUktKO2tRdzVMJmROQFIxVl9GK2U5JiYxNjhMJk14MUY+OXFMc0FsbkZiMW85Y0VkS0wxKj1QSG9AfSg+RFhuCis+Z2l7XkxHTngrfnk+NCtfWCRgMGpvPFVDYUNQR3FlMDc3cihRe19vc2hEN2FVNWtEMlpXVChnd3t5KFpLPGU5KShiZ2xoRHAqMFdRYWo3Cis+QitTVkFaRD5XUldhY3F+dz5oMHE2bWBURFYxJkVgVWYkaTNMVyZBOD41SmtjJGtjaGdiNFE3bDJeRU9gdXpkaFNXbSpqNWJnZkc2VnlaCisybnhrVzhia0kxNnZDcD0hOSFyTWgwZnApMz1QIzImQDZ6bWZEcD5DTUdVQVoxemtnM2dIR05qS3Ayb1l4Q05kLVJ+RXpta35UQzYoOGo1CitLcnchUmk4RmMqTjFNQzNtNVZsfFdOSzc0UV4qNypKVEUyb3NVVTxrUGBMMnQlY2VKbFIrQz4ySm9gRUdUV0MjZV85fjF4QGQ9fiZSX2wkCitndGRjJEg4VkRWRzBXWmFOc09tYHNgJWlwdmlwc31+VlY+SCoqMlUmdDJLOFNXRlRSYDAqXl9uKkRpKHpCKSpMVjBfJD9reD45ZX1WfHJUCit6K0g/cV5IfHpiaEMoeEpTfTlYIVpyVEF6el9lQDhXfX1DUikoWk1PJmh8c04kQlFtVnRPK1dfViNlV1lRfE5XTX0wJW9nK2Rma15xe3cjCismI15ydm09TT1hZm1QQDd2a0x9QipuUXx0aGUoIUR1fiY1OzAwP3AtI3ZRQ3pAKUNaVH1mLWtCZ3Z8RVR9dDtAYkxMMGFUI1E2TDhEJVdnCisqTXFnSnkycU19eTh2fldBI0hOVSppO1ZCKCZhWHJEPzZlWG18OD8kKFFQWE5zX2N0R1JgbGg+X1VXPj4mYnBmUFZJKSoxUmp2SXxOV1hzCit2OzQ2VXFHdyVSPTEmfVlfMFRiPVRTMn5zQy1qYlpVQTlVZ0xZV2VkZnorelI5TSMjLVlrOENDRnNvTWRuK3NAIXN7MDlEd21uSkkld2daCituOV52aFMhdF59ZHpsQHNzbXg4WjVGZjkhOCgtP3pBO0xOcjB4PX5RVlJJa1I3eSk1JSp3MnhMWEIrR3RsXyhkKmo5Jl4qd2Q7TVVfZHM4CitANEc9bGVHdVZrKmVIMnZJKzVrQn0ya0FVPTVUN3tnNipFNHxaSVV7bitffEFXaVJiYS1VKWNgNE8pb24yWHVxcGA3QVF3cmxMWG5kXjVtCis5TVhDODM+RExBMEtDVS1FSzJ5PHkmbiN1alExZzRqdnNLJSV6JXB4NXs/b1JoemhaKXtEI1FaaHR2eVhlfGdAQ30jN3ElVzJKWHVJQDQ5CiszPzNoRXQrJnhtPjQ8bUFHQ2QmSjw4JXFqdGRSMXtGflA9NXZRcigrYjdnO2lXdG5HbHg8dTxgbVQ/cT0mVGF5Y2tpU2I2RWBhQktTc1kqCis4X0xFOXpxVEI2LWMjREFtNE4kaHhfNClGeGM9IW8tezBuK31DbGxEITRSclBMKkx3SXlwXnpMKTUqKkh2MWpTLTMmRVlId0kweitaaW9zCit9PiFXYX1NWTJxdEYhcTcjWUt5bT1HQU99KV9oN3RvMTIrJGZwNUNDd2VyaHF8YExobjd6ZGBVPXZicFhAQGNIa3piNzY1LWhMVigoYGM9CitBbmdQPXcmfEw+NGpoV3F+YDt1VXYpeWdwZWBAI3o4MD0jd3tgK0tAdkRORT9Pa25mK09HJGJQUl9fMGw1UzIwWnhlRlgoU0doZjxfOTMxCitQMWdKeEc8KDU8SSpUcFNZVExXMXtCZ1M7fEBEV05SY0RUT09kN28pV3I4U2RhdFQ9KjY7TjBgaCY8OWZ5blJ1QHMkQ1AmbEk0SHkhJWM4CitRVW1QVHd5YDVHP0tZeVlpZCpudXczRlU9Y2l1bEtET1F5Y051Sy0mcXkta1YhI1F8RD4kdGZHeykrbUo3TkFBXzY9QzZzRjNENHo7Z2ZuCitHVWxxazQ+ZndGM1V5VDt8RTVyUzJ3OChEX19mTnRKJFJGX3BZMl88eiN2WnlnWnx6YXBVfWUqSVI0JmIzRUp4Zk9fPG49aHlBWmRRSkVtCis5IyVjb0RRRjkjVkJxVSgoeEk1TVlieTktYkpyOEdGfkA+RVcocCR2cH05Q3d5SjlOaHR9anQ/OCVebDhlallkelgoPk1XNHY8cWdwPXUzCit5X3h7UzR5Y0VqJCVaWX0qe05nbkp6RVhrSj4xJkpEUGRwfVcmanNjb1ImM2gkdHRgIy1gNyRUIWJieXV9a1hjVT4rWXlOd3Z8X0YmcFg2CitmPC1GV0Y1M3xUbm9kb0U7O3NvXkohdShvc2NIKCgrY2x6N2lGbUBUdl8rWnVEOTwmK2I7dmJDRHB4T0UoYkpUJk1BJlJjc2gxZ1dgP3w2CiteYFJ4VEU4bG5+Mit3bX5XdilYZVRBUCtMKjQtZjF5UFNYV0p1ezR0Pmh5Rn5vb2QlUGIpTkhpb0lhMHdqYz9tN3cqaVFVSlhaZ0FWZThBCiteVVF+U2tBSWJsRSE4bmU2YEw0VWEhSEQpdF5tXzdgcjd6dHJkcFJBTz1sdVB8bSlENF5rPV5eI3dmQCY0Xn1sPjx8ME0yRDxNe15zWCRFCitJMHBnQ3w3Q29xbUNTKDNzcWlYPDc5TU9uWkJFUWBAN3tUMjhfRTEhVmNnRz9ZQzFEbD0hZFYqWmckcFJwN2Y8WUV3UTs0NWIwc3s8UmZqCis8bElvUG58Q2g9JWJKMEtHdHM1R2pPZWUyU0MrSz5fNFVub1N5RWllVHM5SzBxVm5LTExOMWZFTj9WMD5oeSEwWW1eYTYyLXd6ZiNkKnUjCis5fm0+ZkRfT2hgbXMyYEZ+bFVDQX49KkpTeF5+TkZRNV80Q2h9cm47RGx1JSY5VSg+KWQmeFImZ342PUtNfkgwZTBMRk9MUzhuPDhKKD5SCitKQF84ezYkdClDQjJUXjs8bDlKZShrdGVoMmZ3R2gmfGpTJHlnQTBATT85STtyUEk1MEktMi0hS29VWVBiTzU4Tng0SzIxVU8zQ3VJcmZ4Citpd2loSk8wU2U2NWJBWjJ3ZSF0TkxkO1lHOyRySTctUUBgY2tGbld8diFMdSVPeVFhM0hAWiQoZGN2MUxCTzV1P0QpK3JgZFhDIU9nVDNmCituZnhFQ0lBSjVhakN6Rk1QR2ZJMGxzaVF2NCZtJCN2QjUjWnUwcSMpIX5HJiNkb2BnMDA7cFMxN2k0RWR7Kl9XaGg4ZXw2SG5wRUttSVBUCitLYyNoV3c+VGArXjlPOXxQLT4/JSFxMGNaVn4mZSVQSU4pPzE0VVRTP3ExQyNTR2xZYE5xMWlsKjZ6SU5wKVNkNWh8LW1GJXxqX0JoLTdlCit4SjxiVjdfN2xjMi0qUmpwfml0WjdCMHtxXm9AQW5UaDQrT0kmNUpXPyE/O3dtPWIjRER1blpkXmFpOHR4KHRaa0JsOzdGU1czSlQkKFg7CitiYWxxPzR3eVdhTkw9YihOOFhaYjJRKD1pRShyazxCM31tOSV7TC1jNmwwOTM8Vmg5YlFTaEY7LUhAOWEtR3prRXdARn1uPVk1U2hEQ1dmCitiP2pnQXRVKmZpbiY2dno+MHJBblh5dElVYWFvMkNGYVhoV2ZtWGJYUzlYSVpIOTB1KFk0K2xQRE48XlVwb2tWJFUrY1FUUndaYEBOSXotCit7LWt5eTYwamZVWSYkKlh1fjRaP0x4ZHY0TlpyaTlPVXl3cGVqZ3NzbTNhJDRiTzZmVXtuNHVgeUV7WT0wPXI0JnRaaWNnS2wkS1AlZFdUCitDZ0Mtek8qaV5+Km9ma0FBckhvM3RhQTBGc0hvOE5kITRnRUJQRHAodXI7PFg1fV40MEs/KVF9X2EtQVlAYW9tT1RiamVTa349N3xaMzA3CisrYkltI0FvKkY7MDhEelBZRm5EM0BJZmkteUJsLTZ2WU42SlY1ZE1eJHIta1JZYnhfSCp8JmxFUFMzIzlSYX5ZcVJeNURTXnxze1VeXzdUCis2VG1BfFAoUGlCQWI7JkhmX3hGdmxhIWMtMCFifXtxejAlaCVefVQhNGdtd2dPc1FYbyZyPSlsTFc5NDFzV3QqWHtVPDJTSj9iZypPSX5vCitsN1hAYlI0NjRvaEAxajdLKTd6OXxxWnNFOTd8OEs0eEZAKiQkIy08SzE/KUFLczQhN15QKTl5fGNjSUptdy0tQXRfVy1+bW5LcXYoSnhUCishcHJocGIwXm9zOStDPWVwaF89SiZjeSgqP2cqcnFHVnc8dWglNnh7O0c9MTEmVlNqSCs+Qjdyd2RWbjk8VmVCJkRqLVFzKHhjIVJoO29sCis9Q1I7RD5lVlJyQWVmR09WVkg7a0MkZ3Y5ZngrSnFtUjVsd1Mofk9efHZYOSQpaChGeGpSUU5uSTJvUllGJUpJJFAoRCQ1NGBiNlYxLXJhCit4UHpQbzdSPWhKOyRtJGkpXzwmOUw5N1U/JUh9cjgpWk5QWXBVaEw9eTY3ZEMlUypxeDVRclolYWVfK2JzY3BwWEhGOTdVVXZYNkduZlF5CitXUUxlO24+fkEwSThyNUMheHAhR1pII1FhSlJfS1F0IX01OWNCYDY8YCt6T2dDU0tRc2E+biojdFIzfXNVYkR+Nj1nUXBLP15ZfGF4eU1QCitXKHpjfjh0cVN+dis+WHhuJj1wfk1ja2kqYGxGSGREPjctYjF3fnl5YUZtPyZId2BKMHlSaUA5M2prZ2hrQ3pYPWpmRGRkQE40Rks/O0l1CitnJlokIUZqZFcoYHYkSjR6bXFLOWlPeDF3SHpZZmUhd2I+KVRQKWh8WVN6N2VsTkVIdSktJFB8aCpTY0VIOzZFbkwkb2lqSkREUVdpfSlpCit4e2VPMT04ZlF0MzZRRXlHdGBzUUJJRiQrOU5qNT5RcSlGVHVFakV9KlhgN3A1bCZSKn5VQldTT31DSlQ+TnFLO19aaXBYVCRDK3lDZ1RiCitmQzlWMVJvTH1KTU5DVCU7QmhwJnphNG9ke25sd21leUZsOCpXRmp6ZHA9MWF+U1VHVXJ5RzM2RjFefEowaX50Skpfa0FpbV5XSFh7aWJUCitPfGFNTjw3eXVkQ1IzQkFTQDA7IWZNSUNDYlJTMW1lNHlsKm40M2dWb3JXcjhna1gpbEYmeWA0UztBNGIoJHE2dURkJHskYCY2cXJZY1M2Cit6NmAoUEdkNXJsKEojdzRGTigpIWxxUkdYVWRBMikqazdmNjZfVVJkRHI7Uz9Jbkx2LXtWSGtwclN3QzBWT35MU1d8MlFsVUVxTkp+VX0jCitkfFNPKDVAPH4+e0FpQmQjYlVxb3V2U2NFU1VJMkxlMFc/ZXtrXnRjRGY1JXAzUlhzVTlxb2JBbGJFMWwlcntnSGAyPkYtVWVpaT1wNmspCitgaEJYSDlyMGR1Y0AhUGZhYCFVZkI1TVQmYEJAZVJ3QU0td21VRE9GUTR0NE5RT2lrJip1UFYmT21NdD41cTk9Z2Mqb0BsKlB1Uyk2NGxuCitxbzFXYGlqMGQ1XjR9MkZfO1dlMVcqSGMzS09kYzZveDhES3VqcGlnOVU1PTZLdjcxZU9sQmFMIW47QEBDT0V7Z19fakpCeT47YERqMStjCisoc1l0Rj84SFY0Xm15VW1SQHFQSjNucUh1QEVVVVJlWmxLZG5BaSpXRCZ9RDcwRlcjJlYjMntSdk4oc3FkJSYweDJGREJwNnJ7QlQ9QXpMCisjYmE5Yzh2TExJMU9UYllzYHozdktQfVdANUtoVCMlMX0jO2ZVKCVOPyRwOVY1eDJXKS1gfHMoa1o+SD1BPTQmRWFJRiZaUSUkUnAtNkY7CisjTjBfZj99TEgoUDk7TWtPQnJBcS18Ql5qR14hYmg1d0poZFNvamdfRzVkJWo9M0d0WkVJRndBIVpRKjhGYTkkWDl+clhQWHJeKjR8M2NKCitNOCp8Sl5ZI1V3aUZpVVhhZ09PbntucEphaUo4Q2xVTkNAYXVURDtfMkNAV2x5Yytpb15PZyk3KlY1YT5vM3lseFg/NythTTF6JjQ9U21NCitII0w0amhNVVUzUFdzdEdGU3p4YFhGSmJ2ZGQ8fmVVXn5yJXtkKkl7VXUpU3FjRlJ5R3U9Qz1FUnZseipULW8qLXtffmVHQmJhRnR9bnVLCitoQXhsVXlld3VJZjkmSnRTfUMxPHg7PjB3LSh+a08mby11VDNVan0xRjM4PCh2UW5+ZGs3YzJZdDVTfkZtOWJ+YE1RI3Exb3J+bHF4Z0ROCismX3ZSN0E7VXU+NURMPmtjZUI3K213V1YjdzZjSVQ7OUN5ZGRzeXwmNVlOO05yPylLQ2xDdnEqSjglb15SZERrMDwyZD9AVDEoNEA2dShxCisxTm5pcTl7d2lAeXJBPihDcyNxI1ZUTSg1JkBqLWsoUyZ4Xjt+ZSEmWSo9U3VIcmB5JXhFZmpgbVd2KUc5KCQtVmA/eDU1IWZBKjhpbTRXCitwJldQSVVBaFQ9X3t2SmJnV3ZsJEZBQytMXlhRVHMlcFpIe2x9T3NxbnIhLTNoSl80PCo/ZiNuZUdBaC0/b2RibH59bTYmVzxxKG4xc0leCit3ezlXR1p2e01eN2dpa2xWaH17bnBFVlRATj07N3dkYlk8Q3JQaEs0JEhrUnN9az1PO0EyNy1zVUhxfil+aEVLQSh8RiNPQ2wkUFJeMyF6CitnZ017MXU/LWFhRmJ0PUxqNFdtPXRVS0E8VHVBa1h0a0FqRiQzPGNpPHRWTUxFTTR8Jit7JkAtK3xGRmNEJDlLPWJsWDxxKXM9RjspTFBCCis3WEMxdS0/UUtJSSRpbylGSWN6WTV0S2JARWJ2S2pqXzJxdGQjU09NP0gtQElwPXloPVBpRSFEVyp0NlZTbC1TSnVvYm9KYmxPNWV7Xnc9CitZKGAtfl8jaTckall1QGU0WFo3WHNVUypUa2Q2KE0kYU49a0xzdlktejFWYjt3Sk4/b1o4cl9Sem83ait7VFFpUlZSUVhDJjJtV29rVXJPCitkPCFlSipheElZWncmT31FVWFKNEB+Rz0yIWdLQEpTMHlqUHZOc0ZPOVJZeHxLTys1TD45d3h3e0Znd2pGM2UtVnZ1Tm08YHk5cXB3KyR1Cit0bGI/M2kqQyhPbGBRI216MjFiZzw1YE9TJl55cz1DQE19MEpYaVhUan40JD9+a1l7bGs5cmBkdmE+JCg2PFBGaGk8dyplMmVjYlolI2V6CitXcEBJWEpZUWdZYFg+Pmt8S2pfNl8jRDUjJT44d3k4eDUybzN6LWx8d0ozJHpWTCYkbEhVY1VScmlNezQyQGJ8dGErb1paZVo0WHpxb0NkCitidFZia31QPVZyME5hJU91U20+b282V0JlUUs7SXhlMn0yPEFmVyFvfSVLblReMHJMUzcyVitZVjZuZXl6UDd6SmZBR2p0WmhiZU95MTRqCit0dDl5IzMlb0RYZ1QhJFQyVmVnZnpwdTNAMkpTe3hCaT4zYi1vUldMWXx7QUdsUWZ8K2cmND9tfTBJfFNwfnUjKSlsSj1hUmIhYjdZIWxRCisjO3tsPEFsSEp0fF9pRX1HKXBHYTYtSTdvN0puX1NPWWQ2Z2U9OFZ0JWFKRmw+SEEtaig0LWBKLTFyIT8oYVVNaCRTYnFqSTslR3BPJXheCitkNWRlcnVmVFZlaG89YUlfKz51bXNZPG0qKyl2RyNPNjMlU2l6MkFQRjF7VDJUa0kkWn1OKm9RfSQlOT5CNSVkUSNqTnE3MSozSSsxX0dOCitLejteSyFgN2E5cks4KSk0PTdKPCRmdzNYb3ZmZUQ3NG9+Ml58UUdgZXN7OGRIZG5+K1BTKCVuM2krNjwtJiRCQjF6eGJDJWVlSHFPWWlfCitBM3l7cXZiKFZiQ2FvZFpyLX1GTng8VU5iaD9Dbn0kXiljJHZ3YiRAeiF0O1l4cyVBeWIyZjFvbGE+PlFxU3VOdWtWc31SP3JfaEB6VX0yCis9dj9NeH5BcWpsTSM8OXJ+NVN9bWV0T0c/LURzVGhpQSM7cnQxKHlTSStzYXR1MSRwKG0+MURTcVRNJVVqUD4yWH53THAxRlRiZXtaZFZhCis8cENQZE0kSUJaX1E8VVR1dC04IVRzREhzbXYjUTE3OCRyNzU/MGMmPmxpJkMwRT9LT05YMi1gfUhqS1ItVypkJCk/eUE/NH1nI3pRcHJiCit9SDxSIzRxY0JRRUk8VGolc3dFaEcmaXc+RHA7NUAyS3E4d34lemFefiRAMk95QEUzITx9PDxXSGB5TE1+P29VeFklQFkmUyZgRSlOUT1uCis9IX56NVl3RWIkVVVPe1laP3lqd3chcl9KKnkzMEJgM1lPI3pyeiswMlVGMzJkVigyazVkPiU7WWhIODUwTTRje152JUtPSmBJbnVVKns5CitSSmhLUW8zVn1ka2Erbz9tNVI7MGRwZDNtRjd7bXdBNFZWWkoxYHVCOXZ9N2BlQSppM1ExdDJpRSgxKEV2ais/eEc+NkcqVV95N3A5Nz16CitCaWg9eSlOS20mbEBoLXZXPDVQJlNSVTx0VFAyaXl0cDJhUTcyTVM7dWREYjt8MmFWaCRqQSpGdzd3JFQzRiphRz9gP0hWKF9WVChUK3xCCit0Zjh1UDV1QGhBcDwrPDhuPCE1NnVmI0U9RTVCQjteXjN4Z1QtWU55RUBkd3UwKj9HKiNkYFd3OEJKQDVpeWFKc2ZxIz58SWdaVFVXODYkCitLMWc3OClzfVdCamdhVFkwcUo1dD5oPEsrdHkmbGo0dkVxbGJJaXZISHI9NUVSYyVZSTwzOTIjPjJUamNsfCF6RjsqVGZiKENieEp5Z0s7Cislc0IxbVYqO2VBQSQycDNpQShDdF59az5YPXteUyZ8M0lBOEtIUGc2eGZRdDBaMCYyaU9DfWIxYTI7bHFHSWorbVluelNBaSg1TyFQdV9CCitOJFY/SUlYMDM1V20hVU07OWlqenRjIz5BRF8wRT43Q1UlYF8kMm8+T1lyUzVnXmhUZlNfdUI9SiMoaztrUlA1K19NVmh6VWE2Nl5Yc0ZpCit5V0AjZWQyN3QmMnFRMHgyMXZlWTN3JXtJKEVtN2xEfngjYmV3clQ7QiNMSHN3ZCNqbyEzJktCMDVlezxoYCVBVXI0TyZJdigoSU95X1hCCittdmAwRm9kaDdfPFJBa3c8WHBkQ0U7O3BCT0dkYEVucioyYzJYPEspQChkMClzJW5sK1VMSF5ZfG5LeEc4NUR6JWBIO0tvNFhJVG9nbVYxCis/b1JycyttOTwlVkJoRFN9QzdFQTAzeztDe3I5bXN2I21NQlk7USYrSmVUUTAzdFpaYzBmUlkhRHJaWEc9bTtJS3V3XkJqRHc4RzVLdnhsCisoZmAkaXE1bkcpTXh+ODlfQn47fEh2UyhhajkqWEl6WVNxanQpaEMlWlJPc35OUWp6VDB2Jmt2Z2BIKlIkMmNtQCNAamV9WmFEa1hybXplCitGWlAjMXpoXjFxR3l3bXJUN3tmdFh3TDN5ekA3WExaPlRgWldhSmZuenRTb0FKUEBsbXA+ZEcwOVY8bGxaQjBDPDA7U15MJGtHY3pTYV9LCit2YmJlUmh9dTMycz1DPEIoNW1qR0Y8aXRgejUhZ0VUSGNobzNAZH1vdCkhUUs2ZUZxRFlsbl5IIT96UEomP0prSFIxPFdsMiElPWY1eDVYCitXY1kre3A5bGxLOTF1SiZLWmYqSm1UJElOV1gtKVEzbiVPPyRKYUExbWFEZGZpVURvTnI1Y15waT8peCFMMClkMUZxdE9GQW8+YGcpaWp7Cis3WipqYF4+PEtPVVNtP19gQz9haiE/SmhvSlYkdEhjXndfd3U2OyQ1NXxtP3VtWEl6Y2F+M0dQc2RxUjM0WnQ2Z3o9RzhfU2NpZmglYn1qCit6RGBxbiZ2KVp+Skt5YSkhdWZYfD1mNUJVa044WSRJNy10ak5wbSNMYTNxNWg3PlpMUSZNKyo0Vmwyd2hHLXhCU0ZDJGVqdCRJcFBoIzJVCiskMC03VnE3TyRadkVRTns5Szt5ZzszPHA+SWRgVyhBOEJxI1R3cWVRITBhKzV6QTstWCE/SEdxRUllfW1UKz8zJnZ7fV83R0ZqR1FiQC13Cit4UiNXMlF8PFdPX1BReFlILUtfJihsPEM3YyVqV2BPRzlGUj4oeW9mMEhFMDlOa0JiaUF+MGxtZGhGYWJOQiVGdXZ6QWx3K3AtezVoNk1TCitpamhCUUwhcyVCQzNTTVl1WVJSTjE5fFNJZFdDb3BKdEdBOWBJfHVIbXV9PGh5a3QtKGs0PmpOQj5VXm51fmF3LV5EJGFIUjxXWVFFKD5ZCitzen5XNnNrIz09XzZAeCE/eG5kX21sUGdwPDNfeFZHQyNvVkVhZHxIMWVKLTRQIzxmJVJNI3FCakpuPUorbEN2SGshKEhAdjxIKVRhZXlFCitWIU85YVVoXmJBKTl1bk5BcHlZVXJqZHNvbDREKGJ2QitRZSRseXp0SEg+e05fMzxxYSNGbCRxbDMkYllVZWlFRUsjK3VQMlR5JTtEOHBgCit8X1gmamFoeHtgV197U3NzZ0Epa241Qlg7JWFRWjkhR1pQNXM0fCQheVopMVJlOFVvWmlgbHhLIU9ra3NCJWZeVTdZYEt9PFRwS35fP0t6CitLSWJLazdaRTJna3o2Q3w9eyRePXVrcyE5MWwoT2FeYjB+Q3JjRih5MGVjMj9xZFdaZiNeU3hzOG9rV0xSfTYoPUd1ZHhrPGtCa1RPb2JVCiskMzlPMzkzLXJfKUJZXlJLTURUOFJ8eXVraHA8Y1dRXiFnT2VuaXpPZVVmSyVDYmF0dihmWmtSI2U+cz98WXBQUE9OYCFFVVc8I31pP2M2Cit8PXdhSkEkSl5IPD5BV3ArIVYtPUdNJllWbSlVaz56d3k7eDAmX0Q+RlEpNVBGKyo9S0dUZno/Um8wYUEje1VkT0RqZ1ErK0k+dilqV35UCitTQlQkX0oja3klPDdHfW5qfTJgYFFLPTkxaXReN0ROPlFjM2N9Zl9QVGRMOVBSSmRuTFloYDxFYS0mRk53SD4/O0RjaDJBc2tnPGlLZGRKCitJQlVVQ2BkI3toV3l8XyF9OEA3R1VKMWFXa2M4MV9qV3BfQiZYYlM4bkJJVnI7PilyRmckcWpycD8oWCl7WEd4I3Vackg0UiNNaFF6YDImCis/I0lMKE03YXEkaiVoRGZVTHhGO2Z9SispNWdBRGZHQlohRzRQX0cjOGNaMnYmKDRZeUQ2VzBgUHZjUiVyN1M8Wnw1b2FfI0k+UyZSTyVtCitjRW9ve2Y0Rk5YfCU0V04tK0F7ZUBgbmpkQ0x7VHVKdiFiNk1LNj84TlRYIXxLJVM/cm0kQ2peI2MoaWwpd3BMZHNYSyUyJDRRTVRjJkVACitSZmFoWmNLaWhPR0JTemZpOWRGO31GTHVvVm07K3tNcH5INTU3KzlAK0orcFFOMUpmRmRsNWBgSD1jJiRgT1R1P0BZYCtOem9sZ3tmYWBmCishbXwoYW8yenNlP0FuPVUrT0UwSFZNfWRURmtgYSQ3aCt9SyhMVlhfTUVpZVlwOFEqbF5DI3hYVW1EfFFeTXRAaWlvaUdxWEUyT0lJVDlsCitubDBYPj5TU0JkSjVlJUAhRGVDTGglMFApSEVhWjhkZmtHTShkbG8/bmpaYVFxeE1EMXU3SE1WQkw3VjFabmtTJXhZJH1Nc0dTRyt0d2g2CitFcGZSUGYjbFUyZV5eKUlxMXRUQEgkRmNPKiRLcXp6UiYmKDVJIUFAPnZWRHE1KXZ8NCM4a0NFYlZeI0wkRks8XnwyZVlpayhsaTVfO0I4CitOOHY3Nzc/YGdoRmN0bzBmdXNkamteJnJLYV8wKz8wJl4lYzY5aiVvRkskVDQkVTE9d0EzX0Y2Vm14WGNYckVXOUV0WnxDPVpPb08keHNDCistNUlMUHU5ZmRZJEBsVlh8SFRCIXd9V3Z5eiV6TG1RU2ZabU8tPGgzMWIqRUEjb1FhWVVrfGthZCY2XkB1Y05yUDRpPXklVEI1SyhmJSVNCisyfkR9SmtYZnNDbSkjbUo/aTFKZEkxOChJLX1XMnkwemBZaDhxUmwodChTTEVic29YPENAYUNUVHl2eDJtV19HblAmR353aHUtTHtBU0xjCit7eUFqcmtzKmdzWnBkeGp3MzdjZ294MHNiZjhCa0hheF9IYHxYRytuM3FSbSQwaSsrPnNIWjVXZD18LTE+QzhZYFheUyQmb1UyJlRVPmJUCit7eF9JIVJeb19pejROdjMzbj9OKTgtYD0hfFElekQySkAxd0FyYHZLREJfTn08WmAoNWF5UjNodlNgWX1BQT0xRkw7ejc+c3Fna0srYUdiCitpT2glZUpiSGhLPU94JmMtO2FCcV9XUWJFSk9hS0dXO0pHKjdEZXNma2M3cnE8U1dnP1UlKTtEJFQ+Zis2REZUSTJMMUotTTdjTTFzRmZICitlMmkyJjk9OUxfaDJ7U1lUKVVjPjlHQVc4TV5VbTM7ekF5OXtScjBxKWtvZjdvP3pYaVcyfmM1fG0+IS0pZSFBPH4rND95YEN1OGJicnQqCitQcXxnc19APUZ8WG1WUlc8ZUJjVj91TTZjYFREZU9rLVVsJlZvOT1MRkpoRSotOz9WS0ppSmQwRXp3XnNiYkUtaWI5PllzdWp6Sz96VCZhCisweFo5REhqbk9xXjUrKkAjIShxKD4+aTU8dndkX2pUP3NuezlQZkohXktDITJlKkh5SG1oPGV2NWJWJTxjXlNwVXI0dWY5Q3J0UG1kSEFtCit2alc0fG9LVWRzczVed3dnUm1ke354U0RsP2MzO2A9I21pQ3FOaXpEOVVMfEVefTw0Sz1ecjshWCN3OHA9WiR8RTF8a2U+ZzMlPGt7Q0pLCitpZmt7ZSg9bi0mX05UOT1nIThLYnEjXlp2UnBxbGhnSjVfbX13amE/U0Y7engrbzd0ayhQT3I3NUhNQEJpeCRCajlzYTgrYn5WZXJLMmJUCitNcUR9PmREVXNfaVhfYm9TYFh7VjdAamZhJWZNbUN9ajkjc3Q9T1U2WjthLXREYUxaTS1+X2J1eitLLSRnOzJOKztUOGolZjt8Z0VQX1N8CitULXo3SkR1e1J0bXluPCt5Z0Z1S3EmQTtjclVNSERrVVBRcyNINjZ7c2txfmBORjEwZHopRkNBe1BhQiZILSZ6REdNYEYkUDB7UlZzJkpjCis1aDZSO1IpcGE+Jmx0ZGcxN2VAJitkR09iU3MxejZfemNlWHUwTXl7ezl8Y2cqPikhbWIwRSNIfC0hMHJtcmpeP2d6eUhYKU1jcG9hRWwxCituTXQmOGdSdD4zO2NNSF5Re04rZXpBUVJ3UzNHXiNeRi0rWSp1VX42Z3Z7bCg4akIjUXVXUHx+e1hyc1BrNm85PlpzamhaQH4xNWZNTHclCitxOFZ7PU5oK0xEczUlKSs4QWFkMGtrYWRJbFhBX1Vwdz5EOU4tZzc0TkNHZ1oxNEF7d1JMKHNydWxidUhBY0k8WU15fXFGMnJVT2F7dCRICis2STRwX31acFZaTlBreHpOaX1GPXo9emwybSQ4OT1EVlF9K21XWH10YnQ9bnEpKTFla0ZRcTRUakhuV0QwJmZqUkR9Unk/bCt9U1dfd3JACitFQ0FOUTtURk4jVWB4Rks2TDwocEB+clFqVWhDaVVtaXNASlg2XitBYEw8XzRwRHRHMmBxU0QoTmdmc0R5WW9La20+fHd1TWFKSiljYnxTCiswNHVIaSFIdC1FUV5pdz4qU1pnfSEzZitxQlhBZ3N0aGRJcC1mIT8wempiPXQkSmZ8b2ZYVSVpbnAqYmM5JHNFenApRU0/alNuTERjVTF+CistdDY1KjBNP1ReZkpPd3VpeytUMWNjY0Rre3pfTUxnblNIPm01OGk2WU9iQSptTGYlTnE/U2NoNjA4cTJ5PmR6I20tbjZiSnl2bl40e3lFCispZyVPK2MpcnRmLW82NXpDKEhzZyUya1ROOGU2PSZnd0dZMD8rUGEhVHFKSnlHNUJzeWRWNTV+NjdfM29rJjYkKlNLZiVrMDY9KD1zQyt5CitkVCp+VGdDfFo3TSEpRTNtVyErX1FMJF5lTDtUcmg1NmIwZzhjM2FeUnhFX2BQfj1oWFlVTDAhd2Q2TzVnZUV1UDRtczZHYEB9T3dRaCVlCitNeFBDOD59YD5vQ2c/M1lgdWUoQGg/aWtkdUhmMHAjTVVMfVkxbEhaT0VycTwlSF4lQlBUZD19aFV1Xlp0OE1uYlEmb28qKGhgdnxocjcrCiskSExwR3hOODlgQzNAY0lMXmxlcTA5cSRKUiFgO1FaeG1YQy04NzlpamUwTEEtZTF2PjF0TWdHKyROYXZrUFR6eVNuKFM2KTJoSVZ5ZmQ2Cis1JmZidzRkdm9gdmtmMUstN1Vtd01iJVc0Nk5Eczt0SUp1X2VWUGVibW40N0RtVGg4KVNrO3Robk8pLXlLUXhtZjY0Z3c1P1htSHszbiNWCit+WXZ4MEBNJDhkJFdQYWpIRjNDYHkmZ01ONkxEYWY5ISs4aDdOOTZ1fWR0RnYlZzElQyl6XypWUlV0KE8xKWRUKmVpN3BhbXh4VEZtRXQlCitCaVVQIyZJQFdmM2F5YG5hXlZGQTJYP2JXfjJORWoqeyZFYFlsdUN8QUQ5ZTdhM0lsQ2QyIzZvTy1XNkkoN2Yyd2lRWEVHPjRQdVNHSEFfCitMQyp7XkV4YVhnWCFDSDxSQXJpbFkxJW1oN3hLbT12e3ZCU3FPYUZJUUUpe1IlISk9aTc9cSVNWTRJKXZUYFU5I2AkJUcjbSUrVzNDezFDCitFMlR4Jl8xb2t1QUR1cjxeYTdQQjg7I3Z0RFVXYEorM1ljOUszKjkpdGJPTDVuaENgYlRTV2pUcz45b2lTU2NTazsjND1kQjgkKTNuRFBpCitJSVZfPG48bFJ0YEtlcmEyK3B9U2BJU29iN3YpbT03fHpQN0ZJKHpnaFlkPUslYSNMd09rLVo2LXVBLXN8NjZfMEwzMGJwcWh0TSY3cHJtCitpUyR4b1gwYUVZYHF8aW9GSStvJnRiO3JRRFNEdShKODtxb2soemh2eHkmPFpyRHhPQDYmTl52cHBZYFFoRVd1JiUjOT8ta1hOcFAyIWdTCitVaCNmQi1iQnlsPkYyeWIxKzUrVjZPN0lSQG1rVldOTCk5QDlZKEBxZn1KNCV3OF91RD5VNHs8cmhpZWI/TDFUK2hEPk9BYHIrNC0lKjA7CitWQzsxRi0/Mkg3dVorJiR2XmhzemRSek1pakx5c1ZDO3JPSXZYLT5va2N1O1drcCU2QnI4QEdQekdyIU9UckFkOyoxdE5+PTM9ZVlUWCg1Cis2SzU+PVN5ZFoxelZMa2YkKzc2Z3x2NWNDS05sOC18TSlQKCFeflQqXmI2RDBicXJlRWE4fSpFX0BfNT1WdjVye1k9RkxobEd2cFNpPWdQCis7KVFOM15ZeGh6Vj9eTGxwcG5xUDhndnNQMTRZeyF5K1U8Vj5nLUdyIW5nN0txdmU/M0B4d1EpTmkoSHI1aE9HLUt7IyVqTDckJGdeV3JCCitqRlZMXzlyJHdoRXRmXn5lbF4+V1NuZ3Q4ZFJ4ej01Jm1rUWFgYFRHdks9ZC1SVComMkRZKHMxMHFJeDRXZntoNFhaU0R8YyV4VUYhQ01LCis9XlVhJV92Y0VpLVhPZFhafkZ+dEYyMG8mS3l+dSFaYlVjKygqWHApeGp4VUE+bkg9dkw4SVBpZE8xO0NnPTdzYmo5QUozPDc3e2s8fG11CitUZVQpM2QwNF9QNSVNam17RGYrfkRnRV96Vjk1SklGYygtfHNITzZjZCU1YiZ2ZU5WUnU7T2Q0XlpCcFJ0KSQ2O0NVcjRWVk50QWFRQGl5CitDSSpVQEg7Z1MlJVd7aHh7dVhTUWoxOUlrdHJBP2N7P1hZNjZaRjFaXz9Ld0hMSVJSZVE7ZTxHQiMyMUhjRnVPKX55Z0BsT3AqcnMxU2RGCitJWE9mXz9fZ0w7Kj88VXQlKnNsdC1tXjQybyM7VmRgVkV3SmV6TUBBcD5XcE5lQGQ9bml1WmlmcGZPe1AoWGRJUk1qPnFPRTAzWURNczdJCisjPUNXeDI7Q1pXYCs8LUwwZWFhSCR5Uz00ezJfTWZlPW5fNnFCemptTHRRbmEwKTJuMGIlZng/R0NtYDlWPWRWb3xNYV99eVhNVW90X0FTCitHJT0pWEokd29tPldeTSYjTFV8eDhoUHxYOT02X3gkSX50eClLbHZNJTBMTGIoVGFiUGx9YWotMCY9cChMeigpYz13cGdTMHE+SEREOWZDCispP0t6MzlWPkxALSMwamZzSldOejM2QD5gVzNRZEotRnlCeDJGcEJzOVJBS0dfe1Z5OXJ8cTkhe1l9aDtwZVR+WW1AZzlecnpLRHYzRFlMCitIMVpGMSFSIWtYSyQldUxfMVVyPkNMWl4pTT4/YjgpTngxU0RNYDJid21CRFFLSmJ9cHthTTRvKXFhWjhgN1h+dmRqRT4rZT5eTzx3ZGE5CityOV5uLSFoUDNhflAyVyN5eUdeQSpfPW5KMGBNa3RzdDNEWkYkYztrRjM7fUhgSjN8bjl2T29rYFBpTUpgM2J3Yjg0LXg4KyE2WXh3cmZ+CismJVFTektkRWMkfEgoRysqJDFfbXg4eGl1ckdLKiRTfmZSUjsmT3kpcyhgN1g3e2g3O2toLUA4eCZ6TX1QaWloWn12YjBac1RDUHluQ0tNCitodl9HMXY9XzYpZGhYcUwrN25wJis4NjJRYCNZblFhRXJgR0hGUGBSTlYtWHBoJWUtcn05Unk1cn55PDlXe0lCYk5USSlFanB7aVI4YHlLCitvPTlsX3VAVnszK3huWmtPTDdVbz9jSD99ZXR4fDd7ZkNoRTRUej4xQWt0cm4zK1F0OVR3anFeIWhCaWBwWTdHOUYhNU5EUz9MeFZ3SXtKCit8eU1ERyZYdl98TmhKJUBSQEEkTG0jJiVyPjQ7bHBtYThIbGI3MTJWMUh9Xk5lSWQpcGc9fUU8QWJRaEZaUjIrfVZ0Z3lePVpqSmk2dG9CCis0eF48Qz4yPnl4QUZDO0gpQ1MzJE4kK0g7VXh5b311U3Fzel5rejVKWXVEKENqZVBUY2p2Vy1aKmhoKWo8Rlh3TC1wc0JUQFpvR2Z7eiQ9CitydFRGWiZNaFRXTk5gMWo+QTRydmdAc217SkY9eTJILWl1QmlFZV5KN2lUOSRTVSg5dTd9YSorSFc2YFFZRTljbSNHdF8oYWwjQmI9SFRwCitDTnppWUAmSlk0U1A0UmJ0QGB+Sy1LMyo2NDE7eD9HRHhYKzdNUXlHdVRPJG1WS3NTXyskUmVrZzdwMWhmOFZ6d1JjcGpgZmNlbDA3aEI9CitSKG8hfSlVIXA9IVljaWBKODc7SXNvOGtKNUo0dlRIdypOQVlZOSF+MTR3YjtQb30+WFQoUXZJRTQ9e3tFTSlid0dZOSEyM2xlJWdMYDcyCitZRXYwZitCeH1tYXojMDNRR3pXZ21hayRORyh4Zk04KF5PYFVYdVdVbyU7cz19SkpoenU2c0d1U2cwbz5Ba197PmMtZjNTUmEjeT8oJTBtCispWnRnSDFeZlVCbEZ6bTAyU3ckJWVkY0lKMSZEK1oqaCROakJXUTA3V3VldnhZR2s/WkZ9bT5oSjBJPmQhQ19oKy12UVkocSYjcnk4Q0heCit5NFZxSSQ+PDxAX1hHUUE5bztpNHpMVWthNVZrNVlPJk9uZEtzKm9tYTNQbSRpdj10ZEc1MDZmanMjOWNJTSVrZTxnVSY4U1ROYmhOe1cpCitWRURaNHcyRFRuc18wfWZYSGY3Jlp3Q1liPj8qPmAofUFIXiR8YVk8e1g9QWJRYXZXcjZ1LSlBSyVpdXoxYnJjcjsoZXhHJU0ybjg2NXpTCitTRUQ9TVgyS0dYPXR8eVBnMFZnU3pDYH1FVEtMPChhR0I4RSU0MnJCMGZxTkI+e0JgTng2ezdaeCRkOXA9cUkoeXp2JCRiRGZ7ZlNpM0JyCitvNmgzN3dheDZAZHJ6WVRNcm8/P2ZYd1lwUUZPdVp6YFdvMyhMT2c9OTRvRV9GRCVZQU1RO3QwYiF2YTd5a18/b3FCbnI3Sjw9fm9LNEROCitSSHZvJjVoRUl8JD1XZm5vWG4tUCFAVlpIKGRFMkQkJmZafkFLJSVfcWI7MUQmSCZtZjdaT2tvNnYwdUg1Y0AkY0s8VlFFfSYmZy1KIVUrCitQUztoTT0wYXp1NWNZMmxqJHEjUlBlKURHa31ueztFanpUampmdFYlR2UzI2pLSXs2Rj5IIVEoWkJJeURxZnUyeX5gbz8kUDBNKCE2Zi09Cis7ekhQa25iOVFVQHNWRFNXMH5LUU1sQGxnNjVPITkoZ1RYe3UqQHVxciRtOVJYRzIjITEtSkM0XmUxTHo7S2FBSEI7cTc2OXYhc283Kj5aCitVRTxnTHM9MypneU9XUDE7LXIzbD00N0pjbWRDPDMxZzkwX1Y8aHtsVnxnRSM8IU47YHBaQW07RUJvfW89aiRrSSZWYTs+Z3dESGxHVGFrCit7Vno9YGA5Z1J6RmR1dnVBVz9fMj89PUVVcis3OD1WKjdsJld2MzhESiZGWFA+c25rMDZ3MzY9UkM2YnwyPW9+cHdAJTNRcWhvd1lqeUhACitEWl5LZCpRelNpVU5JfkJDTFlDP2wjNj0pJV9Ken4tPDtDNkVtJCRgVDgqeyh3MEoyQFlodkgrNldqTDwjdC0weS1KVUNuUDtkUE8zJnxDCitWU3JeeSMjO297b0IjP2AmUCt5WTRoKzNfcnBUeDM0ejZkI3dPMk5oUjs5bXRsNiFAJDFuSE99NTc+Q1h5XmA2YHhnbUhKQWcjK1FpMjNOCitrLTQrciY9fk5YMXx8VkhJSVowRHFMQmpOYiheWGFhJCU9UUdsKXVvLUVXZ15HdWVrPUxsdE8taTZsMW9TVWVFbkt9NlFhRnlfOUN0QS0zCishZHxxJSZASnF8KUR0ISE1ezQkSTh4ZilQYnEpK1NLNn42QSs3YFJXZnpXdSh4XmUkZUFwWWtPX0A5SGAmc1RyRFEwbUt+ZUR0KW9EYSZDCitkN0NGVD02QjxARTA9N0xtUldoUWNDQE5ANDtzeD5ib182VzkjUkUyTlF3UWAwajkzeWRNNDRzSyEzVH40O1E9JVJLSjZablFgNiR3WCk4CitNTlhXbClTQn5IVVlDclFKYWRsM2ZybnQ8Z1NRVjdgcWJ5OyNrO3x6WD5iekN2JSVPaTFePHFpfUUrJDVCUHA7YSlmY3VNMn5tamopRnl7CitadTZtI0FBbj9fU25AcHN3KFBYS3pBWGA9M0dHWCM9ITMpSj94Yy1PdkhYSHtOdDElOz1FflZQbmcwSklCPyVRRTd1Tm5WJmF+YClFVm5ECitqSXpgeXgkb2VAQEs+UXYoZGU4JnhaVjw0P2JfdHJqcmpmPyleS0ZYRW9qQVVWLX1kWGh6YmlMYlpEblYhQ3hndGNRcGlpS3A7U054aDw4CitxcSZNPVc7ZjNSZ2M4cUlYMypOeSsqT2xIWEB9ZWptKTU2YnQpPT5ZRF9PVjc2Z3RHYU5USiEwa3J3KXRReEMzcGI5UCZxUSlld2ZaWXRrCitmYHMwOytoPHpHSitRcik1OTtmUURaUnhCM0pkcmBNP2gqTztte29Lank7cmdlRTF+eyowUHgjdGNDZVRvQD48UkE2P3dKWjQwSXZsNzVQCitsK2piYENrP0hMVnxfbSt2OT5VbypWJiU8fD5ANzcycnRAZCh5NTB4cysydiZCQ1REVnhtcHI1fDcwajM+ITFrOXQkbT4tcmM/Uz91cz1JCit6PG1kODIqb153MnhERD9pcX5JUUx2I1BzZ3ltc1ZSO2dRb3E+Y0wjZUdaZDU7fCRIcnI0QEIrYT9obmp4TSpFZjFKRV5WVFlNJng7RX5FCitSUFI7aHVAcT1DR1N9ZyYwSEAjcE57UXZQPWtZZ2VDOSpQND1idldpZ2Q1NzRQLTlsdi1MVCstbzE1dXU1ZDE9Ul5qTkxGMnorTnZjSGw4CislJXx6QVF7PXRJakw1JXhTM1ZCJDBgI3dae0Ekfn51Wm5tN0Q+ezN9LWpCblpRfngoTllQIyU/ZWNgX00taDY1RlYlZkM2MDV3JT1CY0BjCis9N3pRTU8qX2xqYjNJS1loRytjNSshVWR2Vj1mWH5mWnFOK29wcHclSFF4dDwyIUVOTkdOKDhUXlJnKUNEVTl4IUVMeEdzS0FwS2JgRVN0CitjdjNkJjd8NEkoJWFuREVMPjVLNnoqUGVgWT13UXlBdEpKbmo5MEdYUzFfV19ee1poJWNCMCZiN0xFKWJnYkNDY0ROS0VLWHxnK18xeFhCCispbXZFfVB+JWU2dVpFYzk3NEo3U3BycGNOZDF+WHY1T3g8QnptV1MqZ1NLWSkhPi1vVlZKXiRXJVB9K29oOTJzOU50WG9BPlByaE4oaWBZCitoQWR2TFVSQ3VaNV9hYCY1djcyQTNrc3lHPTgqSVVsMDQ2X3xRS3g/OVpie2VzfGJFdENmb1VTUyhmYW4hOTx9ZHJ9JEE0dWE1Kyp8MyFvCitgTUVRQytoNU1PYTRXLXxGQ1VLVDthITc+KG1oXlYwWm96Rik4SiN9IUZ2cilKakxnO0hte3drNioxdSpANE1OP2pSaHJQcz9gfkZId1RGCitrUEhabjJeYnh0TVRYZkUtJCtkYnVRWVEzPCp0PyMoPURlLVl0eG5YPjlVK1NLeGpEb0UrS1U9RD9DNE4paGE8VTRoZlVaIzh6anxjIVN6Cis7QUpzKkA1SiZYa0hiVGUjfCskXmB6YnwpLXNqflZlQ2h4cHB9X19NRiZge1FjWj95MSZxe0I0eVNrZXpRSEd+N1lnJSRAWTJvayNpcyluCisyU3Nic0Vxc1BTQD5hN3EmcHNgPlU+MF4jUmshe2Z3VGk0NHFLNz5PJkhkblZ6SmwzbzEzd2tzUDFDJTNYX0VrQ247flNNeS1iSCYwalptCitKSWk/MTg0emdxRGFeZU9CPE8/P1VncyZjY09FQDU9O0NwVGpFfXdeJTF3NFRMUG89eDN8S296YmRNI3NrYF4kYVljey12OXNzQHRtQml7CisqNU4yTCRnZmAyVSVqY3d1VV4kKHl7WDlTdEdmVCRuKVROcGlhNlh1O2cqamtrI14+aVpkeDdIPiUrMipYZGh2Nj81U01CKFphNE0lQEpvCitWalR0TkgmIXVDZjQ+WHs1Uz1CdmMlc0N2JEd+Vmp8M2Ymel9IQElGcj9yR1FjaD4qbUpVNjxTRkF1O297YylnJElZQCN0fCQ/Y24/P2M3CitWREIqOzFiT2FwLWxtaHpwdSt3dWNYMT1pMjJFRiQjKUBPYktQWDJtR3JkQV9gKipZKC1PdVA0cXclX1k+aT8kMXROP01RaVVYVSVwcWs4CitnPXYjbjFWNWpaPVFhVkVhe3JvWDdiTF5gZzdUNEEoWUBBM0s1PVJjVyklKnRvamptZkdZKzg+Tmp+NVZ1PVg8YTJMNyRSez4jPTspWjd5CitlKkctcklLazBYUytMKmo+JSh1U3pwfGRke2p4JlhYO2FzTU9+b3B3WnNpdTZDKjl1VE4peX1DSyllRD53a2N2PD44KVBrNVRnKndFQSlDCitaOzxzci18WXt5e2MreSFrIyEySUl7PkNiTm0jbS1WV0hMX3JYN09kUnw9QzRARkBvc2pYP1hDV0RSJmVmMnxnUUwjOyMtdXNAb0c7U2tVCit0VCg4MnhvYDZjcU5hKl40YCYzWCtUaFoqI0c5ZyQ8JEktTiVJS2plb0RXREBEb3BLYldITitTc1ZtNiZCOz1Lfl9SQm8yZXBpdlBnbFY2CitMM1ckeUFBV3xfWHFEP3NzZElefi1GYSg3blFtQCo7Z1V5PTNXRk8mN0U7X0h2KDE/TG0lJHU2MHk/bFckYzh9Y0tyeWFyJDFWbFNVQE1hCitoPE0+c0pjO2hhX3xWOGhiJUwxeiV1UDl8cT5mP2ZjJVMtP3NKZmNTKjdpPkl9JVlOd1N9WnNmaFlNPXZWSk1LbiZRSXFkfnhNOTlROCM3Cit1NUpSRiFPMCVFZE1aVnljJjRAUkVya0lXc3R1Vm5BemxuVEoyaTQ7Tl57ZEViUWlTTjAhV1JsVU4qXm0wTnRnKTNJIUN7aj1FVWRBUTlWCismVntYS3NIQXE9LThnZ2FqJmsqeVhYfCg7dkVUZEdjeXNuU3F8K35SVj1WNT1pbmghTT4pbCk0K3ZFSkNwREZadERAfUtNUlE7WUtrS3ZpCiskQCRAWi0mWTdha3ZJREpMOUFvczZ3eCVDS3lsczxrcENxd2kySztwP1F6JDhyZnEyPXJyKVZEcF80PTtnV1ZYN0Q9aVJ9bV42QC1CTUJhCis/UygyYjhvczlnXjwoWiFDRUMoVV5mckVKVlJ1bDZGKkczRSlzPT9TcXVaWCM0VkpuPjxGdkp4dkBBOTNQdCM0PlhrNE1kKU5VWFJyNWBECitXSXRST0ZvbFpCVTh4eFpTeCZIez1yWmpHKy1CbWlPajxIXmd9R3A1NX1uRnRhOWdJMHBxN258IyFpQl92VjY/UWhHKFVTbUFTc3koYFQ8CituJG5oNCUyVHJRbldYJmFHTFRVNWczNV5CbHo7USRGMnpMSCRBeCpZRmlZbDZhVWRNQD8rMUpMcWMxRnVDbXxsaCstKDtyUTF3ekNpMz1iCiszZyMjSUY5UH1odnAzTEhFYzVlMUNxJTNHOyR0Vj9wTH1IaHVzP3EhYj50Z1gtLXQxKElaYn5MRHpjYikhZy15VlZWVTU4TUhPa0NkNHN2CitzIzt+YXZETSo+X1dfclVDMntnbUg/U09maDx0JGVRX0NXSTlJcCg2ZG1oWkE8eVZBbUlZNGdlWVA8YnFTcj53elBkdnxWXyomV3ItdCk0Cis+WXo4NCtLeWpORyRCbFRyJjlzVDJLUDI0em5qVUdheW0oYDN1bmdPO3lSUTgmPD5XO0hNV2JNd1B1SDlrU0tTYWQxbEQzcFpUdEhBJU1rCitnIUQ1bikhd3VEdERWPyRrJFM7YVpzTlZARW5JSExxfHJTIWRmVVdnbU14eFAtRWdCeEVzbjU0VHx9bHhTa2txQUBBOSN9bkQ5R2dXVzMtCitEV3YxMlRMQVJWUUgrPW1mc0VZbDJiX0d5NktLVVdsI34pOV95WFBwRUBrMHM/fnZWPiQ0cGNoeEdyWT8kNFNQI29EZT5fPyV5SHBCdTYxCit5RXxlWigyRUtKQV8hO25pWGIzOHprVn54cm18VT9TeWtgeiNRU3tfbF5MckxybnBrKHhWa1kka2d4KFg1JHlTJW5nMFVTS05DZyZOQW03Cit9eHo8bmt7ZHR7I21VOUVlSnEqeEcqR3hHZ0w2WnBaTEw9WlJNWTE1ejJDamxFPXRMM2cteWcjYDcqd0RAanxYXjFaQjNfaW5Aazh8cHdDCisyYSUySTNVeUMoQi0zZEhAXmJRPTMpN1ZAaGA2U0I9fUw7KXpmdUowUmVfMUU+QGYmaXIyKGJvRzRWXkhRP1NCJSowalRzUCtGYS1FNEskCitMPzlAM2FPSVl2TFh5MFB1cWwkUFE4PGtOK2MjJWZOP1ohMlNmfCY7UU13YD5YIT8zZj1MeVZFTlU5PT9tdD87eD05ZyVBWThoU0E7YXRvCitPSnQ+N3M7MXtVeWY7dGBOI2JhYHNVcmh7PHFuZGY4UEpELStyVllfcTxQPE50P1QmWDNPOD18NmxIZlUhI3JSNGc1aHJQVyh8O0hSaS13CittRGlqTjZYITZXeCpkbUtYc21xTVImeWlyUkBFZSp4OVNVOUl1aD9kUk0pMUxCSjV3WS1tfktDUkU1UkJ5bEM+fk1XeUV4KGU4WHw+dU9KCiteKGU9NlRsNGhgTjhOSj9uJlg0dm97SktHa0ZwakI3UXV8VShyc3UlSEh9bnkreTBtfCFuMU9Vc09HZ0F8S1R9VjR0bWpKO0pDM2dqU2k5CitPaVpRPE9AZmExa2N0fHlVQCgkbnN8ZjhxU3srRmt3UU8rWmBxd3A8aTB6fD47Ym01VzFMRmd2a0tXZTVFJD4yUUAoQ28wKVBYeUs7Q25qCitGbyV7T3RTNEtpWjdkO3Qlc0tAUnhPYTl9LTs8KzBJZClgdWJoYmNIR1Z0Y1MmK2xuR1dHNyh2bCR4YkZhWndwaG4kQWBjdXZGeWkhcSVCCitwMD1IYl9NMTlWKStkSUdWbipOaUwkeXNlX01FNmJNNmFvPGYtPzNiN0BTblFGclc/cmNXX2w7ZkNEQE0xZGJDMUVFaSZmaCNtO3BQT3J7CitxT0FHMW5FaF95TXlfaGI4K31uYUt8ZTtBellRPWdXS19PVklqcndze0t1ZWpeSVo1R1JObFYqTmBHWXZlQDE1TGtOR3hkO1BVbE45UH0hCis4P3R2WTUyekVTYHkrWT9BPDZiQzg8P2xwc2RBXip7V200Z2RecDVPY1JWM2dVPEkybVBYa08xPXUrSD9HUnhgeXE2O0hUMD9MNEVoYmF5Citye0UofF5QJkh6cyRiMTdgfDI4JEhFXylCV0ZtPSReVkZmXlRCcUslaDQ3bHU9RGNeMmt8KCN7RWRPcW87Mjt4SmMxaWo8R2pkb2hSUSFXCitIZXwqdCp6eEI2JTVxdSY9anRsYDh4bElzV05qVldGb34lYnhiOWJKPXMzb15+MnJ3ZUp2ZFFUNi1DS2pDVSh5fVQmdW8peC1eRTJMODU4CiteTj9BajxYSTBPekRtJlUkanhOY0coTnQzO0dTUyVqIztEKEN1KypwRGhsWGJ1Rm5iOGNtNnxla3loXl8zOFBCO3VMbWxDVCsoM2NzUUtUCit4dXpYeXQkVDliemQmWlE0fmo/bk5hRnQpYVFecXB7ZTtpb0VjS1VzPEtLajc7SD4qZXw4UF5DaVpeTSpWNExTPjE1azRRRz1kUnE+V0phCitUM2h+NnxXbHdLbjV1WkZBKlkhZWpxaklMOGMrSTIkX1ZFeWBnZUQqeVNUQUExfDM8JkdrPShgPipSdjRAQ19LY1E+STdnJGtSVDJxMm9NCit0aDw9X30oKmJ4VHFKbFRNbE9nQUJgMEFNc0lgTEI2PjAqREZlcld5PHFac2Zue3BKZ0tVbkBtTFRDenlXeVpeRT1UcyRZJGA+VGhBJWlkCitgVFE9K3s4NzszS0dwS0VwRWQwYVBRT3BnUV8zUjZ9MkttNDV9KjN3TVhVcllGeURLY2tGIz9nWTRNZylqVWJ1QXlIST0jeEFaen08TG90CitLfDdZbEFZeDJoUCFCb1VPdGhARFhxMkJ0cmh2UGZoSW5MaVNzbTMjMmJ9ZHkwYl5qTGhoPH14O352WEdrTDBhVj11V2p0bHAxNz9+JjFJCislI0Z4eDdKcm18I3o3VGBwP1JXQ3l8ZWp4PWprK1BoI314ZDE4Sno1VEg0YzdZNmN2ZT0qIWQjT30wYnhOZVRFTjV9Y2g7N1JQakM5dVJpCitrYnBvI2hOQj96aW98YXRSNH5iRXUtRX4tQW01NWQrbV9KNFAoTE50Qk0hd3U4dzU4cnYlVDRIR21sNmhaaDFfKE9vQH17S3JSZ2Z8YFZfCitlISl7ZjdwYjRMX2RuJWQ/V2QtQ15fYmx4ZX09eSlpQCttVWEzaHBfM05KUUpaMTV+LXJMXytmblVKOUNnTzBpcThWVClGT1lHb34lUXBECitQfE4xLTkrb25AOVp4KlZoJVVFZGJaaFV5VnxlRVdHYVZLJGlvbTNZNSQzWnBMJn5PPWtBJDw9MWN4ZUx1LUJASzV0QVRwdzFyUjxocU1PCit2IUprUi1VOChLfCQjNiFacXstdVlVcDh4aDh6STVETEQ3PnpmMFZKNCt+Vm8jKmVlPkYqJCRGVysoVUNMV2tgRlJVe2FuRHprTytzZHhBCitxX0h0R0deUU1EMWYrRjVNKCE0fEcwUTMqMTs7dUMyYHJ3Qmp2bnVEQ3tCdmZTRHdrVCprWWBBYUllUVVGbUFPQlhIekBuNjhnTmVEbCUyCiskamlOY3I4bTc0REBwbWhrPChwdU9pNiFHVmI+RnFSP2lebW9meDFDKT1HcTIlK2pFSXVKTjZ4eDZ2ZHd0SiswZW5tekJFT15zMEloc2ZLCit3VVd2PmE0bmtgd0tvVH4xRXhAam9qa1U8RigmeFc8bEV7UyFNTSh4RmZyfGQtej08IWFzTjZ5SW49dXxrfFhib3MyeGcjIyk2I0ZeXkY/CistMERpMW5heyRxVX1YbElOSjBUSl9NSSl+bXUzayQ9YzxZeVZSMHtjTWkkYEk8QzMhNW8kdCZNMGI0KjVPZSo/Y29kZ3MtVVUpMlJ3dCVeCit0Pk0+amVudU9AUnQoUWh4IVpjWFU8XnRVUXNwdk9kTCQhJHR5fVd4KiYhaSlQS0hQPlNHP2B8SFpyY2Z3dVZESk5ZaFJLcS1RdjVDOzJACit2S1VpPDFgJXlUTk15WFZ6IVFNXll2enh+cEN6TnY2ZmhDLV5qQm52NWRUYUQ0QyYxcDZiR3NGbnJrRTIpe35EbSFYV1h2UnU5fip4M3J6CitheytzP3Y0dWFrc0xnfiN5bm47MWFUMTBgR2Q9UF5tZlpTVTZea3lkdGdzflZQSG8/U1RtVDVoUlFzNyNeeH08PX02ZEhnYzEtNmtNPUA+CisqM01EKWtkO1IhTil7T2MmR1dWeE5ge0RRTEJpWFh7QTxsT2JrJkwmPkp2aFRpJUFefjNDU0VCbTxkbTFEMzlhSGBHN2g4UyhhfFo8VHVUCis7ajtuZj4pTy08SHpQaTVVUVBfcD0tWEQ5VUBeUTFpeCpoZ2lTOXs/JHdsMnA5aUd6MkgrOTBNbCR+KSZXSTQqQVQ3UHgmVTh+TEF0I2k5CitKNyU3eit1YE9XJHNIbzBzVmA8XypvWVZhTHl0OU9ReUUpS2p+JEJCYlR2IXI3eH5gPUs7b3tAUUtrNmA3Uks5YUBINUctJUMoRUhmfD5mCityPzc5Um8kWmc0dihWPyEqKUohMl4+K1FlQip0SXVnYFdxemUoRW0tUFdSTT5VRiZ6cGwydmlpKCN9cEspMiZXUVNHamBwOSZoMmc7JlZ6CitPaj5kdlpsMyQqbE5UUiVAei1+aXA0V1FJa2QlPkY1RSojdEE4USQoeClrXjVfOzJ3YEQwVEhLeWl8a2FNaz8zNV5idXxoeyRHaEpgaSshCitQcEZ1PlYhSUp8OC12R3Z9fVdEWFgqTSZpIW5EQ0NIQHF5cX5iaSF4Qmo+K0t9RCRzUXhjIzZgNSpBPlVuJnNqTVAjYlF7b35vRzY0WD89CitzPkFxRHZpKmRBUUd5cDEzPlE2Y3VgaDZxOGZhckZpenUpeCkzQ0JLZWQ9Pk15byRUa1AhJlZzVlk0bm8zP2Y2VGN5R3JrOHc9S0ZqZ0ctCis7dVRQZkxLQyZgZX0+a0JUOzkyVVZrcVM8eTRjZkwrdWlvcVRoUzF0eUVgKz9lK1hzVyMoZlM4diYtWlUpdXsleUZRfXRlYFo8dG9qZH1SCithbUBCKmBUcU88U3NvJHhDZTJvSEVlRWw9SWxLOWYmVTAxO0o8cnl3S0tnZDFDNXFxSjZOX30+ajx+U2w0XyVNb3V6cG5QUWVGdmhlPW1iCis0bGcxfCM/aj5rJjVpc2NSejRRVWtqcERza29qaDZ9bTxsPU5vWEJNdF5DUnMkPXJhfD9Nbnojbk09ZCpjQkkpZk9tZElWUiMkbypWKXk7CitOeW5KYHZ4Y2M+TDhtcilhcFdGQXp2ZGZuSSNJLXwkcypiT2dLeT1XZm44VDBKJVBsczw9bllqfFJqKlI+eyhadCMkWGUqbm5XbUtPUkotCitSMEMlKWJ3bS12PHo8YTVqd2R5VzFxfDdwcUBuPVJuVm45U2tKcXlzPHZPNHNee1ZtWTY1MVdyKz5eclpMZmM+Nlp1OShEblE+QWw1WV87CitmWShydjF3b1Ara3xseiMkSV5TQ2RoYio2Ylp9aWk7Rikqcj1LSWUpa0A7TiQ5JmAmS2J2MEw/RkpaMWRQPUBEdjYmZ2Q+bjFoVlFeQ2xrCitKemRPMSlIfXM2eGEqbUVzWWFBejlMPUImKChVXm0lWDsmP3pZVXAlbUpsKzt3QDNfQDBiV3loVHFeRVBZcn1VRWNIYnVSX2t4PTl7fGhWCit7dyY3ekNFdiZlezhIczs7WXx8ZmJATmF7VWV7fEtpVUomMkVKYmI0fmlRKlZiNkQmcmQ2aSQhP2plQF4kZ2sqNyYhY1k8OzVSNF9MansqCitrM0kqR3d9RndtZXpMR30oQCtrazhNN0NBJjlvTEhqPkJuMHIhZTVAYVpaSnkmUzAreHg9anJQSFVXRkpUcSg0ZGJHPUhRNDs5Q0d0JSNTCit5QDNWU3pUKUY5TD1qMSpNMkp1JUl3NzA9LTU4KncpYD8oOUlsejErZmhvMFJlNnswYzg8dEJoRH5lVkZOUys2NDF+YEpgSDQoVFlDY215Cit2Y0N1T1orKXQ1SXdOKktmZVlIclUzU0xsakZHODJzfmJvbzczd0BQTG09Pkt8aCMlVSNfNFdAUUo5Z2s+Q01yfDRfYUI/d24xfUB3NEU4CitgJnJXd093cjkrdUM3fmBNcnlnZmxAUnAmYCh2NnxaQz5jbVM1QXExdS1BPEteV2dHfFhPfDY8enByQHdiUGhLfG8wNVIrRSZxaDMtd35gCis2I1lZYW1idjJYKD44UXh1WSQlNXB5S1lLNmk8YiZ+UE8kakVKNClaWkBPaF8xSUJoaUBBTWtgbjYqdSluJUVhVDYofSVncEFlaH01eGl9CitteWV2ajQlYF4rV1B1NSkhZG9rTGNNYVpVe30zQXZ6IykjXyhsJit4T3xSJlM8eypDZyV6b3xPVWBGV1JGJld1YmROPztYT2g3KHNrZDV8CitmKjZqO245amZsNypkTHwoazs1LT16Q292e2MkR05JUjtNVEhrSHVSRndQdkx6elpXeWVgVF5GbjhZZShhQyRFfCltMVgoYHpkb2pTNEo1CitpMVQzTExiVT5YQ3UkZGR6ODQjVSNZX3RnTig+S0pqb2BQRHZvcGZyKkZ9P1M+RzExQUtIfEt1ZzJ+O2xVLWAhQzlpcFM8JUhjaDN1aHU4CiszY0soJHozIW5FYUJrYHYza2FYaDg3ZlIwKk89PzRkRnlTPz9FfE5BaTJuKHslPjlUO1Z8eyRyUnpSUSE7fCg4I2FZMFQ+b1F2UFg3dGlQCit4cSNaOH1iIzs2RlZwSCZKd2krdTtGS18mSHR9UWRXYF4pY3BAeWdoXzdlVmAxPT95VU1OT3pnTVdefUs0QzQ9QUtIVGQlIUhGK0Y0JEpFCitiNWNrTj84TV44I3FKaDZ4USNJTShCY2FuNHhoV3dEc3EmYzEqTXs2TW5EQE92JEFzb1JiQDlqQj5gUFUkWT5hWn1rSEk2SCVueT5MYkt+Cis1fj9xJW42ZjdHd3ZkMm07R1dqIUtUYGpPb1IhJWBEYmo1JSR6RWNlck1OOEBab2luTDN0dFZ3b3NHY25IWHohaSMlJlhvOV9TaFRmTWVVCithMFBGMj0tVSU5Y2g8a2p3eFF7Nzx0ITxpUEE9anpPWG47ejgxQUdVIzZUMTR8c15BWEhqSE1ZZWpkNkBgQDhTQ2FNcGMmaWxzZ1A2I0hTCituSW4kRGxvdHIrMTkzQUFlNlojRjhzO21eYV5qZ01TMDcpdUBvX01HSHBVQFo7QUFmKnsoPTI/UWhsbUllYFheSjlCPmk7YWAxejZfLXxlCitDKW41RmtsZlEhXmYqfE0qYkpLSmluaHJ1QnNzcWV+SFpmcl5OeGg5JXJ6eGxePENfZ1AxSDk9ekNmcDxkM0QlQEJBVH44WGFgTz5OMHFyCitLKkh1QExeS05JWmNSTFgrQkdadWhtR1dzajFTeXkyO0EwdXA9KklxTkBDPGIpQDd6ZH5WeEh0cXI1NVVgfUxHNX00eGItNmg4KmhLamolCitnTV5DMWBUVFV+Vm5PSyNASFRmdih8dDJseVlJaTlgcGE1YyZLQ1lENngjK3olQ3hDSDFHJjM7SDRWK1dSajFyS3Q4UF9wKH1gdmh9JVFlCitmYWtFJkV5O1VKV2NnXmlkek5aVV9YIytlbUl1JSFuWHg+PXJnJi0pcCt3dWZuQiNTWFpUWEdgPCRiTzh2cCF+cWg3diE5cntZSmx5dkB8Cit6eng9cHAwfGlCI1BVKEQ2I21YLTg3MzYtWEI1VzdHcmxsWWVBamx6eVZ6dyRaQ3w5bHB5cSlxdTt1d3V2aSQ5RmRmOW8haGo5YT9GWGMoCitMUiN2fm9BdjwzVk17YnVLOztfciRiNjN+PGVXP3xLQjNgZXIwUTBPYD9RUH5nLTRUUEFZdio9eSF+dUYtRmZKKlFqX0p1WFV7eCo7cFZ1Cis5NEkocSEjdFZYQSFfRilaNztUIyM8RUVYeXtsKHZSNWwmSVlITjRwUU41UEl1dEJ8O3MlJjBDfShpMGpVWVkrfiUtZzNJK2BEI15BIypLCiswUHhvZjMhM09HX0IoLUMzWm16M0IkKmJLVF5eaz1nRzlycmxSO2MxfSl8VVRGMz93dnhrUjIjcH1TNCkqRC1hOVZaRXRjZVdUI1lpTmdBCiswekNwOUhTKHVUdTN2bGJRRmR2YSk7O2NPVnRfRyNfTy0oPH56b1klfFNfaHVYNjgySD4yfHVkNmBgaXYqQCtBWDgjMDFIdXVyRihDM3FYCitzcmFpV1N7P00pO3BTWTxNQFA4NiRZJnMqRkdlRU5rSyhBbEFmS2VvV20rK0xfdXx7ZUh0PyR5dFZrU1FjSH1XY29sODRrPyl2ekNgK0tpCitCSihkTndKTT8qaXNWTDYoaE1pdVomVTc4YFU2eSREV2M2MXwjS2AwSks2K1VgUXtgK2ZMUiVMeXI9QDRma3NmTDw2eDc+dUU/bmBYM2V0CisjO05RUjZ5SWJPM1JsKjJVfV5vTEA0JWgleGUkXiYxKCVJMGVIcnpmb0x2SHRSUWlQemJUeUpqZWg8Qmd3KWJCRHAjN2p6IzlEYiNOOzlgCitHXmsjZ31ld1NCTjZXeH52ZkBlb0dgaD17aXI8SHdqczhxPFQwSl93c2cyWnF0TmY2N19OKkdMPkF4bDI5flEhb3l4M1BseDtabTREdGtlCitWPD0xVEBvamBnWG9qNyMhUEUkOEV7b0psLWw/WSRWZVhtMUBfT2U8KWNlfWpWfU1le0A1YF53IUp2bXRoQ3BDOFFIfTIqS2AyVCZvfCN8Cit6YEJlOUFnbV9AQU4mM1VufGVPWWZjXz4qZkZkVyEwM2IqKTA4QWk1YFpPOUdmYG49UGQrUzwpdGNVJjtuSkMmbzF4enZfZlFBV0RFZ0ZDCitvdnlEKUphX0JhempGVmZZNjlKfl5uc2NwS2gtMlZ5V1hzNF9Ybyp1JHQ9JH1weiNYaVIkJVpSdntTakp4JkBwfWZhWHdsNGZHb04wMioyCitPWnpxVElONGdMRDw+dEZWQlh6UzBja24jeXlSYF4lfDhVRmVndjtiTGBaOyQyUS1edCZGbVM1aDxjaENhdjxYND1acEQ5MSRVYFF3ajhKCiszdXkoS1dQbyhfTnUoaiMwVFA8MzA3S21RXmJHbHFzUmpVUXhKc1FzfEIwJDtyak56ZGwmeEt+LVNnSn41RG95fjZmVnp2K2tVRjxEK0dTCit+dHdfPXc0U3VtPCkhRVNaWHF3UjdsO0JYSyY9P3pgcX07bl49Z2Rua2FyaExINjdVPVd5TXB1MHEhR3FKNVVgJUh0PyR7WmNLKl42MmVHCitBKHFlcjR3cjZqZGE0d09rbVRLYzxLdjhgbGZlbGglY3BCaWQqT2dTI2dfODNAZ1p+MCZ9MCppUH0wdDU5VlNgT2hLZTdhaDt2RVF2YkZiCitLQk1JYFB6Y15DJFkzTT9YVDJ2ajZ5RDhOPFd1JkJLOWA5Oz1sMyFLYktIK2Q1bjxvYklARkM3SWh3aFRZejk5Xj9Dd0h8UERBZ3JfdT5ICitrbz9qM3ZePzQ1Tns/X1c0Uy1vb0YxTnplYT1hU3pGUmlPPmdDJj5WZSMjMzsoWTJEUVhIcDJ9U2hLZTA/ZEkyWmJRQCZgSDZ7V3AtcSEzCitsYiN4KV9wLWlFaUpBPGI3eipYYHZJWU8keGswcTd7WDsqX0ZPPVJoTFd4dTNsZl57PX55ZlcqPEd8SXc7UnRUWGI2KkFYdnwwT1VKWTl3Cit1Pm9teGNka0JBdUxaZEtUZ1FZZEhHM0VUIzg4ezx5U1hZQCE3Pn1uZE5mTmMhXiFWez1SakhMd3VRe0w/bEotKHY7bn5NSkt9T2Jna2NFCitiMj18cDVuSjcpVDFZRSUlfjtlZmYlZm0mUHVzZUchcCtteTVod2A1OFF3XyYhWXgpQC1BPDIoJU44aW5oTGhfYmBVRT9zJSFBZ1IhaTBMCis8YSRPQDFZQClCRDg0eWk9WHpyPkVzbSRxMih5aGQ7MzhfViRvfEV0I1QqU0ZPb1BCU2N5Tmg1amQpPVpeLUwzYlJCSmRFV2tAdiljc18pCislPHNmLTA4OSV9dTVWV04zX1AkQm5rRno1UHU0OVVDd00rd2F6dUs1WGR6Q0hoc3UpfVVERTk2SDE0PX5XMSFuWH5aI3pFREtpfnpxUkFpCis/TWg3O1ItZmdxPylpPlRXb0kwUmpqNCNFTGQtdT0mbjBUZDZEdGZVJntgT0BJO0BOYGZ8Q3ZnUkRXPmIzemc/QipCRnJodDFJVmohO3A+CitNU0g2O0g8eiVMPnI4M2V5cigrTkdTPmBhczstRzFhMTdEYll0XmBUZE5RYTBrSmpPPSgqQDBYKSRzREc4KiljOTlIPz96KXFzXjxDbzNlCitgU3h8a0MySnRRM2BOLUlUO2Z3LVlsUm5XKVdOTEhVKmFzfTU2NEUheztUSCllR3pCKnpVTFBnQV5LJlM7ajxBKyZQODhGWVVGUVRoZzh8Cis9Z1BVSk9GWn5uWTF7NHo/emFwdXFwUEVQK1hkPG5AdEUxO1lQOVdxeyYhemJSeG5LMl5BMEEhVTEoJjNYaWBoTFBvUHh9LTdkQH4wdDFDCisyJjdpWVMrOylvRVA4QDQrYjQrZUAlQ0UqOCR4bEpATDdQbihZKjFtUW17Q1ZOa0IwKE5IZmdfaT9wOGNIYWliJX1sT3cxJm5kMjEkcERgCitlWS0lPjEwYEpkIytxRnQoWT4ofDVCaC16cn0pN0gxLXRrIWhhMmJTeTdxaihTRyRiT1VpNTspfj5eXkJ1MWZgM31pK1FjYEpfbHlTRiZnCitMJGtUYSFZcWp2K2pLNTh9X015STBnTWZSZG98SyV0MW5UPC0xUUdaTHhAek1KbV87TWYzc04yZXtlMz9rfVk9JC1PTHtkXjhZWWB5UHVDCis5VyRyKVVFSlgkU3E+TjIhc3lObj8oSVdQPk5zJE1Kdj42Q1BlKyFTP01QTlZoXy12aEpecCtwKF8zZDJsQiRAbEpaZ2UxWWtIdjVQVitrCitHUFllXiotOExHYzltMWVmM18xSXs3V35rfnJhaG5FK15XK1VhQEdpRDVHO2wpUGUmcHwqX3VYZ3pCeFNNMmUxKSZueiliISkqSXBYdjJjCitVQk1EZmxIaHhfWTRQak16ck0wJX4+Uz8zUDhhI0g3bCYjTz9ycGEmWTtFQUtyfklkJEhQWldudTt2c1l8cz8/V2tqPVk5UDZJTz1TY1FECityamsyaitfRnZ6eGtoYSpye3dyRSRfKGQ7el44UmExd1pUVktoXkk2QXhlN04lQUxAZWZ2aHAhcnB1Zih5eX17Wll8PE89bkhjcFluJipxCit9WV5QdmxvWXReQ2M7dHNxNDEmeGx6aFBibCtLXy10Q34qejMtLXBVR1UzZkRESTYtTnU4NGZgb2YkTT1KZztkcWtOVmM8SXVtdGJtJiowCitGNiN8X1lNTjB6Sj04LVhCUjImUjVrflpLe094ez0+Q2d1MXpkUUw0bT0xamg+WTJvOHg0ZkxfVGlQRWlab2NpTU0hZER3OVQpRFl3bmxmCitzRDhUYyUlfWN8US1NNm49NWZsVjN2Jj1KUSpJIWRUYVVfRF4kd0dOTmQqK2deY3tILXZ5eilUSmNNO3FNY0c+eE4xM300X25Xaz1QMX1lCitRbD5YX2U0bkhKc2JqeHw5ciNQYmdLUE4teStAMWNPJXJIR1U+YnVlaHlSJlpMNUVhfmNvbmpyLWJAeHxOQXtETF9Cd3VnXmhta0VjbEhrCithJlhubCgySnJ8UGhgUWF1I1lMVWRsdlZgdGo9eVQ0ci1JV0VLYitLNnI+MjNIdGFwbm1iWmxESGFqalE2S3QhaytaWT1SNmM+SW4lOERQCis/KSRxUEgjLUFXfVV9Nzl9a0ohXj0/ZmphVWB3QnlVYCl6NitaZj9kTklXPXI3X1lNJkNva2UkckVgXj87ZDVZJUpYMzsmKmp4M1FJdE8/CitgOGJSSE1UY0x3UylQPys5emRwd1RASDhJX0hLR2koZkRoVWtYcHl+QDM7OHV7RiFqazttVCElZHRkaEtgbj0pSzQoVXBJKU1aYThGO1BDCitjKDZoM1Z4O2RrQE5XOElWQGYwTCFuNVB9c0BLZEE9P205MjxsQ2lXb0koRlhldlpJYipDc2xybThlaVR8K0psODgzcl5ve2FoeWBePChHCitsLVJ2czQyelJLJH44Vl9gO2VYfVpPbzxLJHZ3R3VYfFV0RG40SktUQnI3WTBrcjRpYVZKNU9SLU9kZXFxVFY4OHw/VTJBNUMtalg1MnJiCitVWG9vIVc8fSU9XzJ5SnhvZ1FvUUtRVklLTU9hbEotTGhnQD8oPSs/dylfR2lgTFkqTmw3cDZzJXUhWEVzRzxQITBIOVlRM1Q+KnpRU0l3Cis3MHR5PloydFdfJVomVTIxfGNDTkJgcWh6WVVvRk15OEgkTj1xUkY9Ni1Qc1I3JStkcX15dlc1XmJoMj5rKCM0KjsoU2g1JmREdmdtMm0kCis9cUI8KHByQ3hhI3llfSswPWt0SDJ3XkM4MyNjTD4/RyZWN2pHRmt3UHlTOEZnbChmcV9+eV9AVnFnU21qb2N7RV5XNk9RUCV4fnQjIWw0CitjT1NBcH1VZnMwVHFmT1d5LTlGVSVQSUw8N09ufXhwdiZvcit8MyZfJikrJmN2JGFNS3IkaDd9QUE9N3V7aHU/LXd6cz1WM3BSKUQrTkIoCitodCVHTik7OHxkNUhgU3h6c2tteSQjeVlNTXZTMyQtTzcofk0yJFJ+Y2I9XjJhWD5BRjc5JDBWNlg8WFZ3JllTR2I2ekVEYU5ANE1SQHNZCisrUFMoT1ZQdU81N28kI0dzSjdzMyRIbExKRl5PSiF1LVoyaCVVfHR1Tz8kIVkjTHUlI29ZTyRiUihsO2RLI2BZe0R2cTF6TVkzI2F8VWptCitVbkJrZzM+djl6dzckZzIqJEc/TjJPR3NXQEt9VEtvLUxwayFwdDVIOXdsdXY4bkl5c2JTOSk1dkA2TSsoNVQ1dFgjeVVhUDU1T1VEbk1qCisjeW05NlZWdm9rPXx2QWgrOWA3PnBqMEYwQmQ2Uz9lYVVqLWNuTDQ5KCsxTkNZN0BmaXVhdH1INjl6QitaYjJEd0cpOV5fayV8SnRmdkZ1CitYRUtLTDtBI1VSM1c/fmlvelROTVE3RFkqKWswRXJfe2tOazlqbXN2RjZXe3ZGUTVEI19eOU1WQS1gYEdgejI2P3k3VmRDLVZ5PVBnbCtACitAJUEqaTJBUFNgOHpLeCE3NiNjbit9QCpQNXotYllvVmM3c0skaj5IWHhOLVFsfUNQOXY1UFdWN24/Tz5zRGN2YXA4aEdmQ2JyZzNQN3tlCitzMW9zWW87N3lkMnl0RkRSRXJoS0pSfFJjS2MqelNERF41Z0NfMXlLNHFQUTVxfT55O3hAUWc4NWJsLTh0XiVIX0k0RitgKzdtb2xSPUdYCitCTzUkZV9UK3J6azE8dS19WDNNPH5SODYqaGwobWlFcUFUPGcheVFTcng1N204SCppe1ZzNGZtfSNeMWkrNT83WCFlVkc5TmFVezUrT3pOCis/M0Q4Ukwhe1paTlh0d3xpMEpidm9KdTVfM0Z5P0p7PHx5aEk/WjE3Y3ZgZ1FQVUhGWXFxb0oxdi1mRDA5ZG1YY1k7JnFHIVRoPGczO24qCistWmVhfDF5WUN0aytyZEo1UXd8ZXRGTm4yZD01aEh7WEB8YTxSe0d0XkthV3MoLWNPVG1wRjZ3amotLVZBXmVgNEk7cmcoRXRBKFAqUiZlCit3cW9ZQyV+O3xealIldjlATSgla35aeDkzdF8qZT5FRDxlOEdNdzFWNG09T2tIRUlRdG9uUCs4aGIxSiVrbyhkdjwoIX1ANGFCYkdORSZuCispYGhneDJWJnBMaT80YF4rYjdUM0w9fVAwcDBtV1pzelV7Y0FLb0psRD1NanpiPl5hJHI/fCpCZkBEcD1waGFSYCFQRWo3O0BAJm03O15ACit1MCEkV2ZTZjQ/X0Mremc3ajdfYzBXfV9uXio2N1kzM1clX2pBUkgpLUJReEV+ZX0rNiU9SWZ6QjVkRkkkSSVhekF5RDUpe1o/Z2cjN1ZmCitxfHolbykod1pNX1pLMm1KfVMtKFRCU0o0PFpMJClie318PGpiNXFpJktRe0NsMX0qSXhrc2l9PngzWHFuMDAjZDc+TStpOWFDRnxRUXZRCitNPUl5TGxCYzM8UlJ2TjRlN2YyREVjX0VfcjNEZmVzajdobzMtWVBYYE4/KW9EVyRCfnA/cTsyK0drU2VZd1VFX308c3dBbENWMldWPlhJCitvVGJiSz1CYClHLWMtfEJHRVMhJmNDd2JZQiU8QU55YyhWPClQY3VCSXlGMXkhNntMfjl2IX15P2BYIVRfdDRpMG57OXtTYSNWX0F2cWE0CiskIVAlRjwofSFQMWc8bj05N3MkVGxmcE9+Pk5uJkRwMWNWSTZVVHJ3NCV4K01WYV9BdTJkVVo9Q1I/JTN6JiklJThlem94TCFoNzU3KmF5CitvP2hreT12MVhvQSpKckFNZkVzPlgpbTNXdjtMRCo/RXBQJGtlI1FAcTlUMiYlMkg3N1RzfWYoPV9DRF5fYUF9bGdiLVQ0ZW9PWl9FYjNVCitnPXpRQlIyTH5pXk11Qj53Uj5GdEtCS0gkZ08oYHgmLXFuNlVkaXZyIWh0YTU1OWZhblF2SmBZXz8xYG9QZ2VXMG9DXlVlSl94Z3N3cXNCCitncTZqY1h3TUk2e3JqWWBnK31vQDQ4dVdaVF5vNnNhWldXPVJBTyh6b1Y9JS1XMSklQmBnJl4jU2hePmVlZ1ZXLVRHS1BlcHBIMm44bmlBCitpfSYxb0Y7KzlUP31jKDdSdiNAa3Y1eFJeKmJQMG1mYEtpJmw1KXtxZWxxZXIwMHplWmk0dEhOI35ZfSpWMDgqVSRNbE9zPDREMTlsYEFQCitCNEdLTHVnPUFFaHIlN1hgKyZ4cCgxPnUkPTFmRlg+QmNqamdfZktpIytJTDA/WSVUWFZANT96OHdYNzx8NllYT1k5OHpZMUkkdUchTGJ3Cit0PzQqd2lVUiU8eGs/bmF0RSNOeFcxY3wqJTtYWjBwVHgmRTxOWHZGTkxudFJxbFF8P358bGoyS353WE1ZRGdlKSZoTzZxbnsxYihXPSpYCistakJPeVF5UHE0eUBYJllnZ0k/KVgmQG5DJUkmWk15UilZdEkyRjYlM0VrVD1yenRAaEZ1cig2LVN3ZHopTTw/WGhzbi1lPVQ8MThoMEdeCitZSzBCalpDcjVgKnhYWmdKUGdTbTBFPGRrKENoeXxkMGx3alQ8KDx8SVRvU30wJkw/KDEoPVVEcjJRUG9nYytedHwlZ3BnP1E0RClJWElXCituUUlVUVc+KWBpWkVDYTA3Yi1CfncrX3M2PjBxWGM9MUNkVlIrcDApMCtBWk43MiZDdj4jMmE2YDJRc3BJNW54OzkyOHdEM2FZYnQzNldUCitSWmlXRFZVJEJ7M2RTbkcqTj5JJiluJTN2QjYraVNAUV4kfXBJU1JhJlZ2ajFFKTFfZHsjVVg5Yjx7X3JCT2szN0tCZlE0eypaUUI8cT1YCitgcnZSJSp5OSUxWWd1el5qdXJOemB2a3plP0pZejlkVztjZVVkRm5xYDVKUjtZbHxYU3F6T09lJHJCZ2VzfVdFZGkjcDxWfXVYPXJNSiZCCitrNHtQekYlZ0s8VzJ8PGxUU1dKVj1kVytuOykzX14/fkJFYENeSTl6WkpVelVianxUOEx3P1U5NDJHc19yYSFSTkt2VT4oPUthU2JvWnFyCitATFc7ckpefEtsXyk/P3ZZOHQxOE5GKURtOzZab15IcDRXZWNRKG9gcWlHSHIlTlhMYU94bmZwSzxLJU5nPEQ4MC14azIjOSR4SileZD5BCitIMWVsVXFYcW5XTTdOXzUmKWsyaDRBZG9fZik+emg2TGk9KV9Ta013NlBWVjk/RzhuO3VQVC0+LU12YlE5TmFVRXYhaUA+dkUlLW14JjVVCitfYkNLJDtmcmJ1VTxVek1vb010NjM/JlRzM2B8VDN2bCNnT2EkIWQqUDBwT0Y5JXtvWHdlQFhPJWIyNUlUSURzSk1rJXF3TT45VmRJbCZRCitGNWtkcl5Sa21qdyV4clRfbTZXVSVeSn5lO2dac3oyZCpZI3k9TSpWaFY3bEBNdHI1KihRc1Q2Y2lDcTFoaSs2T3thZWE3Szh4WmAwIShtCis2byVYazs/aXdvRUNoODRkSypQVVEmMyU/S0N6YFlUaXEzXyg5UFFnLUtiZzJ1azIpMjd7I3xQMz5qPkwyZ0VpTE8jeHRCPz0xel56NXIqCitqJkJfZiYhRSk9KkR9WGE3ITFNSj9oNSo5fCRUa09eOytzPygxcT1jaDxpQkQzI3skS01qbH08LVZCYEZJWSFzaktjfHwtOyU+STd+OH1yCit7Y2lKPFNnTUIxN2hTJEooKzV0RlV2JCY2bXZ0IT8jPVg3Pj9takxzRjByKSppJUY7NU8hbDw0JFBmR352Tzg4JiZQYCF4QEImKUZAfV9NCisoKXhoc1lGRiEtbURZeX0pRno2SCh8V3dBSEVvZEJTayE/akx1YEFWJn1BKiFsYStpS1ZSWT9aTll8b0g7TmxldEVoTEpAdDE1RXp4X0JvCitsSEY4bz1Za28pfjh+VFlFTV5MSWQ7UUohbDEpK0h8UnJLam9rJTdAbGk5ZkByXlQ7Z2ZoWElEKD5nemNxdFRxWUF5ZWZvM1lkKFpRU003CitZa0o+R0poT0shIzg+TDtXYnF5IUlzX2orMlcqXykmallgYzx0TmRUPTJLY1RxTCpjLTJ5eEpASDRRbUM+TVpXZ1F2MGUhcmwxcSh3bEZjCitDb00oais/I0c4Rmg3Vz81eSpSMzA0bXkkWGVkczYhKkRWI0prIUM8QDJrWTxiKSMjQ29QbCkyZ0BReyhiZ1p7Ti10YGdtUEMoajxMdWxVCisjO09IJUE8OWZ6ai1YWSlLQjAqUk0kSndTJSNZI20pSFJTKW57IzAhZHNabTt4MzlpODR8UlE9fWUmMElnVT9uNjR5azRMXmQtZ09iaD5PCislVSUtZEJyUjN6YWRGRyhIJjFOazU9U0ZFeDxRYUk4elkwbVpQaShtWX5XeCltWk4xYiQybSN9akBJTnZxNnx0ajVsRGtzbyg5d3g7QmM2CitPe3U3cFklb1hwJFplfHtTaUNwO15FT3QrTVIhP1RJRWNnKSF3TE0jRWZ8TGlYdnhOZkEhSDBNQDYqZnFUPGxJT3FVVzJfZGVzJD9uSklKCitMdTNeUEFga2lHKnNJa2BsJnYre0V8KmFpdmBSP2RkK1V8KzFjXnNsXj05YGRNKHBwZUZISXVvP0BvVG01LU57d00pZGYoNGd4NzcqWldaCiskRFRpYnxOcSpLQnxNPXdYKyNpfW0mfkdPe0dLdXJDUl9QczlLRns/QHFtNUYqSV5UWXJ2XzRGcGhwMm8obGZocSR0YX4hRj9BYSkzIUtkCitSYm5kNCZZWiUxLU93OE8xPzVPOS1yWUp5d1dWOHwlPGMyVmJJTkcxMTNie0tUcFNFIzNxUig0M1cjeT8haCQ0fnxkUl97Y3dKTTl6THlYCitLWlJfTjByUklfMVFSPUhwbmx4MWA2Km0lS3ojMU9aM0tKdWxNQWkzbFBjPWJ6N2hjWFhRQVNsa19YTCM+XkIlTVEwfGV4SncpS1EoY0NvCitSPVZPWnlFRSNAb1opd0w3JU54bGJoJnQjVXR2OV9RdGZFdGBeNikjKE82bXh0by1weG44cWdoei1Nakg3fFNnY3tTO2BHeUItTipBaHQwCis3b3BDPlNWP3YtbV9JRnRtaUlOIShPIUNQO0ZQVGBMVFNVSyl2ZG8zVFI1Y2k4WD0kVDdfVmtHSk51bytMMU0wNVR6WW0kYClEPk5Ma1pQCiskN3dAUmtgaC1rUEZ4VyhAVkI9fXV0UGtvN0E7dFE1STk/TyVQOFZ9Xl5rKzxseEk4bVNQUVJtaVJwQFBgeCZuNXVRRHhBJGBvSVEkZUlLCitMRmw2KStHdFUtUTArPzM7cWQ1TXwxWGRhRWN1USV2aSF0REZ1dmgzflBgeklNVz1KITtRbUsyYVAtOHtTd15VaTtyYkg5SHA0dylUSlk5CitOUGJCcFckSil9ZHBCNWEqeEs4Jjd6K1lYJFE/dEJne1VxIWZ2QWxRVmlUTz97JD97cEtrSV4mWGEoWVBmbDQ9MSVIcz59cHdTVHdPcl4mCitANVBWcT5kcEtUKlFZXnJXZzIoUkZqZ0hhUT1gTVMqczA0aFVzUEtqcHpvbXd8a2sxTk49dEdGeFA8I00jJUQqQCk7YkBhUHRvWVluP3xNCit7M2o4cmF0KW9MPGNyamVxaDJeYk0lIUxoVXo8UUloQFhQdWlfWUFDeFZFakwkOUQ5R25DXmRRJHVCfE8yZ2BqTXg/djxzVmttPnFHPSh1CitGZ0hzNT5BUS17MD50ODV8a1IoT1k/MSMxPVlwakgjVExXc0Zea25oUHBaQypmPVFhXlRDcU9FbSsjR1FjPnw/VmZXUSo1QUZ4QU9LO0ElCitpZSpkbnR9dTdoaUUyUFFVQ0Z3Y28mZk9uUTRwYU1ldWlpSDM9UnNtPXd0KjRTQ3BocUE5a2lLSkxWNjdCfUFpZzZiUF8+Q2tVQEYyZ1ZECislVVFMPEdSN0sqMFBGaUVmVT5GKnQzRkA3REtESG9wPDxrMjU9QjE7VVQyYEFUP2Ayb0pSXzFtPWVtempMb0w+VHs5ekE+b2FHfDB0Q1dmCis8RkRUS3NTaV9CPEVTIXJZI01jQFJpaEZJJVRuVmZSNlVFM0o4ZTdaYjE8ayl8NyRJRXtOQH1uUihOZjVZeXw9eSFDSXdHUj5BeXptQz5PCislZklSYTZtSFI/VVZKWX51TDU2P0hMNnNudiM0UVQ9P3U5Rk9xdGZ1T2A2QERlfWxWK3shZWF5bGR9Q2t4cVdjPSg2X2gkX1hreWwhQ15eCit2VXM4N25EfXx7TCh2IUAjZHhIPlVufFZaQ0NuNnlOOCljbHxHM0tEJiNIS3lsIyhzfUFyJGRnc18wJjtZZjZzR0lMVn03fnJkIWIlVGd5Cis2Mj9oWkFOT2xTcXBrO1c8UFo1Kj5ibiEoYzMma1BtMjZNTmluN0dse0MtSlNfNXJ4O0BnQHx6V3tGMF99KTx5PzsjWnVSNWNnQmk0O3VFCitIfEU1IStaRk81Y2pfNT5fIyNVfD1Jcjd6Y0tSdil2VSgtVktEWT8waTwyckZpMyRPZlEhez9fez9QVVRveyM5LXxWJmR8NGVVJkYjZm5nCitgZFEoSTx8X0U2Z0VSfUhvcnFVWGpxdHxBeiFvZVdvJFg2SyNGVV9zSGJDe0J2PGRARDszVTlJISQqd2VlN2E1Rk49cUspSHIybm1Ib3NJCitYPmZ3I1RTOXBVT2Q/XlRgeDM5MWBUN3NgaSpWKH5hdDU/WCpuWmNzRmBjdWo4T0EpcWsqRm9oSFFlI1VtPVNzXmMwWllOVH58IXxKYlplCitDV2o/KTRrI0tzeDNFak98YVEoVSt1bDZgPF9qMnlFJDJCekVEfUkwKmh3RG0xJDhTPHF4UkNgZCFsZ3dKdEJuR0pTQ3YrKkQjcSpQQ3pVCis0R0g2NzNpTGxYd3NHdz5XJG0lfEJ0S0ZQRnl6LWchKT9fQ3JjSUNTRHVHWnZoaGd+XypaeGF7bX0kTEE5TGgqJlh5M1d2cEhAUCojaCVrCitwJU8/YUBFTCRpJSpHaWFQRFJfJGp3Qkw9VSplP3I3Rkt4Pkl1WkMmVVdQbHZrTmhEUV80PnJmMHQlUHZlelF1QVdxMEkxRXd2LVpLTVFlCitqY15SaCg+Nik2R09rekk0O0Q/bGlwWjJpZFA7OCtQcC1CI1o1PG5VamJaazYrPzFqZDd4QUhGNXBUM1ArIUhKcFEhb05Leyg0U0ZBZEokCiswZCs9SXkwcTd6SygwXk8mRzdjKEtqQXhvSXpuSDVuak84cTkhdF95fEdDdXYmd3JOeFJSMiUpVl9EO21Dd35GQSZuSkdXUkQzc1BPMENHCituZTVlVCpmdzJmTShNZklOMWBKPnhnZWFJZVNkKThwUSRoaH5nYUpWTTE7WVdAISgqVVlQOVJ8SjZXdjdFU0tQby1LJD42XmExYlpKTihjCitwcEs+P1ZjVExzfSkzaFhPfXVFM1RpSyNnVStzfUtXZkcwYXdHVTxwdC1gUSRCNiQ2IXRhLSF4LWI3NjgpPFByJWxlMSNtYEAwRE08YTFOCitPUUV6LTIoY3AjRjt5ZX1wWUBeOWEyQk1WPlIpaHhRfSNvSmptWXA1cnk+OCo8IUhuaHM3XzdMPFJwaElJPWNQWTwzXzZ7WmlAOVJEd21TCis8TSElbityU3xVVSg1UT9hJG9vZTNPI15Cc29sNWljajNePEA7bSpUWCptZV52XllGOFpXZU08Qk5XWDIrdyVKNXxrQERFX2ZOTGl8JmIlCitKd15TPE17T1c3djEjO0tEeVp+QnpmajI8KUR1e0hHR0I1JEpsfChlSUZOXzxeZ095MWxvPEVMI1FVY2dpa189Ml9mWVk3RkpzTXIzTWFxCitvWmJpZkE+NkcoVCVhe3l5b2NpMV5mflEwdnhFS1VFcHtVVUg2bkRpX0p1cXpJV0Z5TDdYdWIqSG9EcCZJQHhvR3h6V0F2bWMhblVzVj1ZCitKM1F0YiUoZGMocT1DfmlVQkwrNmx3SzQ7anNEMU41a3JnU096Y3dPTCEqYW9oMW13Uj9zbCs3amRRcXIrJHZ5bVVDK0JnUHxram9TWHRKCitlKFRqJiZ0YVFnQW53WHA7T3Fzfih2OC11R30qRUFFWHBedm1MT1ReK01YdyNmMVlxdTYzdFQxLVdvSHBGVT1oVzVARVZfRlMoNCp5RHI8CitkLX1Iczh7aGJ5XkY0VzMtXyZieHI4VF5HQDdGbkhXO0RhKGhJc3pnIXw2Uk9tRSo0THVQZkRWYVpGZlEqUGRLJnpTKmFwSWYjbTxLWXpCCitJJFUwLU5WfHIwclhLcn1yJForZiVJOW42RSRTKVFZMURYfS0pQ0Jea2c+M0dVSiQzOyZZPFpzV1hqdm1XRmM7flNFM0U0ISgze3h6S0E8Cis9N0EhJjV7VHFEdE58U29WcSRpazVyZUJYRGpUQHslKmFfTXxMZitVQyswd0cwKiZhRTxoIT8kKiNMPSM2cVc8PXJTanFiZHk9aTh4OH1wCishJFB1OGozPVB9PWwman1He2EpUW9xcyNAP0dDezRGbmF3dV9NUHQzS1VTKzEpdGphPEFHeT1OakYzdFJXcVdnMnhickYkZGh4OHU/RTlNCit2fmxoKkckd0IlR3NaPTxtbkZadXpee00qbjI1PVEhP0x2Q2hBPXdhQD9XbnVrPHoxJE9xK3FrTUVwezl7NDtwSSFQRDJSXis5dUtzJChgCit8bGAoMChvdjApUyFYb1VrQ15SQzxfZTNmeHwxWlpOXihGdXgyUnF4fWhRO1E+b0YtNShAe3AlZXchcjJ+RThEQUkyPTszc0EmMWtOMyRzCitjMXc0dFpFSD5keCV5WFZLbSFWMWZOYnBVNyRpfns0VHttZ3t1S3AxUyVUUnAteTI1ezA4azluSyMpJkxCTFNkPTZXaUR2d2hpSGReYWFACityWFcwIyN7KWgoQlJ6c2JkS05ZRnpBTSV5R25NKXpgZ2BtN1gkcmxTaDZoTTZ7ZGhvakVsNmp5dzNsUTx3RWJkZHBYUFJwKUFLUldnbF83CitxM1lGMEh1JTRaKDckamY0Z3BAWGs1bi1adzQ2a1B6TXRWSFNseG85UEU8TElxNyF2bDQkRlhDSmZjKm5vZTJXUjw8ITV7KG9rTVNEQDFFCitKYUswey1hczZGb2NDbUBHZllDdEhYKkRHVFIrZntqZCpwN0hGdkdVRElWJXkjQTghfHB8ZHVPQmcmJStLWDkzRjYwYmY1cWgxRldHcyQtCis5WTJCUHJzODR4Yj9BSmheXlFKTSlSYnA0JjRJclUye19IUGgmP2J6RyNwRjI4SiUqN3dDTjtFXjwzeWZ4Q1hSPCkzdGJQYkJ3QnQpNTZ+Cis+XkBEcGIta1IyWFEqYWw1UmFHbFBUX1pGa34+aWgpeH1xfWF5N0ZMQWlmampIRD1aPzd4ZH5lR1p2UDJNTD47YU0ja3JPbnI2RnlQald5CitiJllgKnB0eG1QTW8pS01oYThtOHo4YiQpKThhIWt+QFc+Q0FAeHQ9Q0puK2gwTmNac0AmS0wzOEsyVCFzRTNQbX5rRmghSU56WjM3UlRpCitwZTZxakFuNXM7VlpFfjhkfnc1ejZTcU92a1kyekt5WlQ1JXRFKm0/SXhkcCVNK3lsRUhMTClqKFFFNGQ2WnFTNHgwQktqOGVLOT5vKiYhCit7fE40RDduQDhyPUxvazw2S2s+RVQ1ZDJqK3I8MDt7ZiY1N2M2QSNXQ0tLUGQ/diFefU5mTnNEelMqSXYlMnchK3BIZS1PTi1FbjFTaV5XCitoNT88PStNPVBkNDNodDhieUkwZW8oSDBEcWNGTzMqfENxKzdiO0ApNU5oelMjR1JQPH1WRD56dDRgS0ZYPlY4Mj88a3ZaO255VTV0U0haCit5NlZsci1hO2E9OGN2dSNoWFI+QGRTMk12eU1Vak8wUmopbF9ibjZXdVBAT3w9MjFEMGRjekA9Y3ZManlqPkxQOEk/WElONClvKFgyeipzCitQMy03R35wIzEkZSgpc0hsSkMqQWxkPntxKkg0aFd5a2xfWClxPlNCaipaSzdIeWx+NEpJISZwXnghUFFJQDl9elpHYiElI2t9bUw7JWgoCitMOVA7LTQybjl8UG5JciRhfWBuX1hmKzJSS25YUVgkJng2d0U5YTUqYH0xZjBMVjdrMWJTMTlLcmBITlp8Y151NmUoMStxRzFuMG1lJDg0CitjbSlpN2glYjcmR2M2KUd3YSpgbk0+KyVUMFY2cCVePVl4MkFVcC1AMGQqPjYpJHhHYUd9fTU1b3wwPHhEbTBHZnRzdWY/Uk9lKG96P0JwCiskfV9qbX5pK3o7MmNHVHNYalpNPnZec3ZVVGV8d1JYc0hBMTFkMCljKi1QIzkqQEQ1I149VWVnUUpvYlA7OCM2YWhEOWN0fEhOSmVoO1ZvCit4TVk7ekRRSDA0Wm8+b2JqSCR0KXdscDVCdEZ+RVpISmxgeWo5clFeQD5jNzA7RHk7Z3p+O3t1enlBYFJ8TX1IRkFvUy0ye3V4TmVvMk9KCis1MH5nKmthYS1ZO3FKYX02NzxGZD1zY3VjaTUpPSVIMmpIfWlXeE99UF4pKlJLMj5fUSN5MipHbTtKLUVoQlF+M0xwajFNREchNGhXOzhzCitLZiQqbE5TMkUqYWo2T05MdHBQWWkjUyNVTldGUnIlLStTVTt1RVV1QTZ5MWdJWjRyMVZMUXgrNShTTnVrfCFTKiF9aCZTKSNITFk3d3BGCit6TmEzRyt2Z0hVST83JCk3LWFfa1J0ZnBQSGI0MHFPOEJnWXsyOTRTa2w7e01TR1lyOWIkPHw1S29id2hSOVNQeV9ZREZHYHIyZzZmNWJKCitHMXtVeiM5NUV5V31VMEkzQUlgXz5QRH5GIWdJcFlRc1QlOT9lfSRBYnBAdlFmZTBXKVg8PSkjT0gqSi18ZClBQHFEcHZ2dW0mfmxPPEpBCisqb21YZ3RZSlNqcjBUVms9V3F3QjRXYmE/Z1NaYFFyeHJFKjBffCZ5S0tXK2N5bCVJYSV1bnlyXnQ+VmhsVCZsNndfV3JPaG5QNStIKEhrCis/PE9DMShgazlgWkpIQ3hKRytDQnsxUjJBNzxHPzklYCs2MVBgQnU4WkwhQS0/QSspNWcpTXd+biY3JWBgeVNHcCt1TDdHcjtfYkNaYGQ7CitNSUcoSTdHKUNzSClvQURZMiFxX1E3ajBtdCFwWUFBcCgtZ2dgMHlAJGZnJkdEQFlPbmBaVGFnMll4S21SfUt1WUVVUVFxU1dwSFloPF5+CityNyFvPHVJXlgyd3NBTEdZSnJ6UVA7NjVBPz9jJlhLUVJKdUwhMWViKHVNek0hP0NLa1NFZzs8RF9lYXNFP3omU0wjfmFSKDNpeGpnd1RTCitWS1FLWTxaak5jRHhAZ081MTFTbmN+UHdPY2RTeThER0h7NER2OChgPThVN0ZWcHB9WGNqeXBSey1HYSY7Q3Y4Sl5hdldWd3ZkX2h1K3RhCitDKkU1bGJiY0BjY3dxKE1BI35ZaUlEYi11e3FvZlBERlQzZ3NZOWtsZTBiNX52fWtXPkI7VTFtWE9Rc3VTamFfNTlFaHJzWH1nMD4xUnxTCis/WjBwRkt5dStZMWNBY00tMFp3M25JdSltO0YlWXRBYnBOdWFgJH5LdDl1SFg9MnJ9Mm5rbW9MbFcwWDFNbE8oXihpcCM8fFlOSWAyKWlqCitna2Q0SSN8dHJ9bmJra1lCUGxOayFPWjtGYGdabiFrUnI5Xih1JWlhbyZQS0MxTDVXVTJOUCVZfnUtWHhZKndJJUgyVWJ9fkZzWVVKc0VsCitkNV8lRmN9MEVMR1Z2dEo9Z24+ZHlATnpWZ3VsM1BjSiQ2bHZlfTApfmdySUA9ZClQOG5rQEpmM29Oa3kjPFYxfmdwVSZRYCZfe0ErakNhCitRfFczaW5+e0BjZD52VE9BXz9LaWA8OEJRfkhOe0YpO2lSJGYrMWspNCktIUZyajxQIWcrZVh3RDlGMGJRdzItKiFLPD97eyolRiNwT1QxCitfTG1qQDhFJnQ1eFdYTnRaYXg7OXQ1dll8LXcreTlJPylzKXZxMHd5MlU/V2EjfXVeeypIXzQyRiVuNkRIfj5Senl9PDspQiliaUpmazg0CisxM3xVOXlmNVFPMDc1WnRTPntudGs+LWB8V0w8QHtpdUsqcXNWNHk1ckZXI0p+KlFIbkojPCNCRWBYOUVEPXUhJndGdXxLSzBJUHdhPHxhCis9NyhyXn1odl43YXpHeFI4MlF8diREd3o9VlV8MG1wcnxGN1k4cCRYYS0rPlNvNiZObHQlNGQwLVQwcSNAJVJ1X1F7aHg3QHojWlVHZVhICitsQjkxXmxeXng/S2QydypTRk9ARUhyPSlOZlVoS2tURUAwc0dYZk82V1otXn4lNUwwTExkdTxqJFcoSVV8aW5ieDxXOHFTQm17b2J4YDxuCitRN0FYJU88JGxhQTwqeCk8N095eUllPjBpP3l9TFBvRChibCs2SSl5WTJTN2ttUjVFY2lefUA9KjhXMzJOaVNWZ3EheEpzLTYpcW92V0Q0CistQytONCt0PUIzcTRhZ1FSSjxjIz1xdlgzUmUrckNHO1RrZ0wzWSZYajhOUlVueHliT00+akxAPkQ8dG14emQ3TlBPdmRORUxzUUlPMnlGCitYQVU/Wjs5blRpPjteSUNzVz4hRXV0U3tnaFcrVks5KUxDTXI8RjJqOD9wKnVwSGhqSmF5THpQNjZPYFdMUzxkRWk0Uz5TNDF8UGg0MVhxCitXMWFZeSFaaHgxJl9LNmRoYyRzM0tRXjFqR31QQk98aXlzJkNaJCgtZHY9b3VweGcrX05md1JLTUBZLTg9NCNraSp7Knlsc2ZBVyFANDVYCis5YlcyVHRPO0lQNGJjQD5iZipWfFlGSmtmV2pKd1RSbGp2I0heY1QxNDBuPGMlQS1BVnJFVWsqb29rTWlWezgyal9PU0o4Snl1LSpNMj96Cis0Qyo5aGI8QFFnUWVyRDI7dmklQWdTOHIjM2dlYXZmezU1dUEhZXglTDFRJE98LWBgJHZMSkhvOXdLNSpoaCZyXmxoZzdeK0EjVGd4JXxjCitNLUlFXlJze2pAe3VPcnJvZHV6NyNTaSo0cE43NmdeK2B6ZEJmSmN+WUY9eT16YzZ8P19DPXp8d3JUYms3S1pqflNvVXkqYD1kU0pxUmIhCis1UTg7MWhmU0FlMiUhdkI5PVNgKE8+SkApbUFNSW1vbW1eKFk4cn09cz09YHA2NDV9e15LUDttWD5AMHMjNVI+dSFWYjgrcks2WlMqa24zCisqTmI0cXt1KHBCNkUxdTNPUno0YXQtWSlIaXdva19od0lVbTc9ODE4UE4kbnBFZz9oVnNIWkg4RDVDZ3NHIW4pJGpFQyZTdE9VaDt7K1JPCis2bnU3ZkMmYDBjbHBjdzFjS2JvQGpCR3NwP2Rvc31qak8raVJ+I1ZlTj9GcCo+Sy1ibVp8d1QlKHd6VjJgQkpFMjArN14lQjhjSHxObXtpCitoMT5BWWR1ISVVajkzfmNXeiNBeGFzVTt3K19fc29HVGk4V0BxeCZrQHhZfD0yQ0x2QUFjTFcmQXhKaV98ZzghQT4tP0xwRnd5TnY7TkhgCitLVmJhLTtAZjxRMSU3eW9AN2s+X0xuMFZPdkZ0Qnd4WihzZkIzSU8zUThUMUxUTkE7ej1IX054a3M8KEpzUiRJfXY1Jm5wenljfWd3fVFFCit6UDQ7QHQqNGE8eWxuNE9tSH57cjxXSys2RVBfUTxgMCVeR0Rtc0U4RVh2NClAe3ZMK2w5QHEjNzFnI01WeGUxWjNJZVViRkE2QzRORGUjCitzK25yUEVpckJZQnowUVhGUF9TPEIpenl4QDlaSzl8MkE2WmZ8dkw9MX0+RzlQfDxOV3JgJDRBWXJwSk0/NXZUZSFOX35eQE1qZHtIfWdICit5XitWMmtrKWxuYXY8ZUxNNkd7bzFLUD5OVmwzRypJI0YhaGRzdHVSN2Fueld4TGdMeU5ZMiglSnJXRVpVQWk7TlpgKHooTX4oXzFsVkYqCis3YVBnal5eKjc5OCRsXmVvdFE9SSh9PT1hVXNVajdobXQkdjdtMk97KEI0ajVEUCVSbFR7cnMxdWRMMjwtaU5ZbCtvI1lmMldlaUthMD98CisxYFZZYSpzRyE5S3xDRmFkIUNJYnhXfCpYP24ySzRhPWFtam8lbT1DOzlWWWFONXxUfkk0TTQjY3ZOaU9EMjM0Y2wqIyNraU9+QzhtemI0Cis+ZiUtPEJzcXk7WioyT3U+VUA+KEteNm4ldmRuYyNTO3cmfX1CQkdBfHF8P05TcnNKTFZULVB+M3R7YH02KTFfJCoqWFI+KEd5R0NkKnk3CitRVDsme0pRaWZqfkR2TkhtSTFxNSUyRSt7THU8OWVFVHoydFAlWE9PJjtDcUUpJEtpfWhWQ2koTG81IzNZWlRyOH1WOSRfX1E2R29pJWFeCitCVCh7Um4kOWB1fmBGdm5eTVZXTHh4fHVnSiVIaHdrMkBaKSVNNUtxbmRyQm9LfEBqYjJDfmtVJkU0Xn5hclBSenplKFgwOTUkP20wRFRXCityUFNpTX4+U3h2dVY/d2BOUGpIezY1KD5VRiN5eGN0dXc+X0VnVkpUTmRDIW9EVmBQUjlRVTU9MExCOWVufTxVdC1nUWtqPFU2Z3RvdTZfCismX3dxbmlVQHh1aG4qRUA+bWgpKVBYJGszMX5ZQUBuVGZFWTN5Z3RKeWxeYTZ2JHZjfigyTjVZb1ojO1huQkdWXyZ1e1kpKjVMJWQ+K3I+CistfEIhd0w9LXFCITd9Tlk3ezROZyZAUlpIQHlONnloeWJFNGdfJmhIRnNLUzdNdTIyKj1wQDNkPkJKdzl1Y3N7U2ZiRVF8WVFiQmxJQSh7CitlU0JHcW1Ic0o4IVJSI3RQRDgpYkZSX1FEVz1IeGN8aUFfLXcpdkZ9YWI0PGBVeWhnNSs5RlNtJkNwYTVAWEhKe3VraXtLeSh1dW9eOz5tCis5aCoxb3NQLSlyYkltNHx7VT07SHUhM3RSbGNVQFB9JUN5fWBDZVNQRUV6eVBjLXxgNWo0QXtSb2hWe2dNWHxVcnNQemIreTdgRUlmdj1BCis8ZHNhdyh4Kj1sN1k4VUQqX0Y5fE4wOHFVKUFyQ2xEVyRie0YrfEFCPjx2b15mUzMjPm87Km1JTEpDYURAcnl7K3ZxWT5xPHRNMSVpUGVFCitgPHJUUjVkfWpMWlRZdFl6VjQ1fTFEWmdRVFRLIUVvc3xqcz13PHZuRC0tZ3pIMnY8JVIxX0I3UzBjPEB7I25JSV96UHZtdmJXcW1YVkFKCitgVXpCdXoyQSt1KW9WY3BWU0s2OEkpNXJGM2xkbCFZa3lTWjMyUWZHKllOSVU3Ul5nZkwwIV4oKFd8cGpJPCZTdT88QFB5P0ZlMnclRkRBCitvSjcjaU9MfDhsPXFue0wxSyVHNnJwWXg7NVNsSEpObkVFXyNQOG0rSn4wPDNRb3l7Yj1uP3FXOFFzSzxscTd9P1RWaFpsWV8jbHFWP25mCit0YT81QT9wcXBNXiYxLW1PbFFUM1E/dV5ebzwwb3RjdDxORThCIyY9SUxFZ0QkKExze2B2KDk2Q3A8Nnh5IUc8REZ0P0wzISU+V3hxbyZ5CitXMXAqQzNTQkB0O3h4MT4yODxWJXtYNXpBOT0ye2ZHKlctbSNnKHJRPioqNlJAT1VSQCspK0lpR35jMVBMKV8rRkY3ciQ+dHMyV0Y1eG85CitwYDxRMSVQaEJSV1BoPm5oNG1YKm5Ya31sRjRwQEIpJjNnc3tkbWt6QGE7PHBBSV5TQC1KcG8+dFBobD9QPlV5eVcpVUE4a2BRMVgyOFViCitGPFg7cEM1Zn1iXzNzciFTaHpOMlNre3AoI2xlMXRFOE49ZWU3PjdYQDlFRiZQTVBXYiVUbip6TyprWTFAPDsraGxSNEtAZ05hd1FwbCRsCit4RXZ6K2dYX0MyXnlTblc+RTRiRW5hbmFxRDg9azYhQCUrRnckblVZNjlsbjd2SE04U3dxTGU4UDN6aXB3cT5ZKXsmN0hgOzE2cytAaXRzCitGay1BO0tKbWJ3LX5FPkA0IUR2Qjx8MkA+aD1HUzBjbDM8bSRzZEZUSXN0VEI5MUwqUmFiO2VpfG5XeiQlUys0WkJQO1ckdEMkNDhJSzdlCitQN1J6LS0yNDdtRzk/JGtTfVl+WiVHWENtS1koNShRWWFwPHU/JjR0JUtWamsqYW4oNTg9Xjl3Rn0qfndzeDJ7cXx6SGwrT2x0cCkzRlI5CiteKzdGRXBgWmA/NlRwdEtwO0hZJk9CRmtNZzFUWCVNP3YtTEdKa2x0XypvS1MoZT15aHlrTGYjKG1rYj9GbXo/TEpmX1JZaUl4LXZmS05OCitzI3YoWFprN1JrVHh8Xnl0KndCWlU8K1pPfXQ/JDxnZWBDMGA3fSg1dFhlZlRwJkU+LUVZPzw5QkRHPnxFP1VzbTl2IWJ1QUZPa0tlekkoCitBeU4hZjAldTE/eTBIfl9AdG1GR3UoViM3JGhgdlp3X1NAY3dIKHltXzdzTThffi1rI1h8V3BVNjtnRjk+PTVvMGY9KUswKm5ZLX1AU3RVCit8WjluKjR5cFRnemg3UEZ8YFJrO24ydkoxXjEwMFlsRSsqMmFSWGhVIXZCQ2A0OCFkWDxGSE16Vkk/V3k4Zyo+JHR9a3c/JWRzZHp4TW50CitMX21gZC1xMSFPUXZwQENFX0xuP0c4X2tEcmp6dVpDdDF9d1FPJSFOZSFtYW1ZMj00RC0+KGZyMFhRX3lVR3RBMDtaP1clVjFIKktyMUk/CisqREs5KHleR1hYdmIoK001fnoqRzg3QU97R0hTUWJRQjQrOClBNSomJjY1JWRqTEh1MnhSc1Z2QVJSPH1UT2lBNmR6NkBfVGlKKGUjcTlSCitZJjBuejE9JlElO1BXOHVnO0FHVkNWb2N5anw1QlA8YWtZJmlUT1pONXkmTmM0TVZjfE9uUFhzTyV5WUZya0UzOSYhUGo9K3E/TmpMbH0wCitvMitReTQ8N3A/JURvMzB5ODtfZkZ1O2tKRmUkaTJJVWoyXj5HaWtnJkBOdWExVG5wUlpgeTVAdHlYRjhmUStmaDkmd3E1R0shJWslWXNHCit8UWRgeTstZiNAJjBHPXJmNXVJeDFeK0ZBdE0kSVdFJm5JS3MxNVghblg2T35OfT8yYDhae3pTO1NHVXdXbXRheHlQNCRrIUYtY05aQXM+CitrOUx9eiUpTkRaNyo2ejYxaVRUQGY7RFZkdm0rMigjX3lMIWJSWk4hQT5eOFdFO2Y1a1lZfl9SfE1Jczh7TkxUa3xMJkZje3A8RXtweTw8CitmNiZiN2YpdlpyVD1FJS1TRGQtMnYrPWtpTFZOY2xUdXJVPmppWENlS2YyMiFFKTF6KVEtUUhxaEAjJF8tZjJnY0R3d3hPekZKPU4rbTB8Cis9Rj5wPGJOVzI0bkU+fFErZERQLWpebT4hbC1ibzxaUSVWfGBYOENKITgzZkUyLVBESm9RZnRLYmNrNUg2YCZnN2I5OythcXJpKHk2eTdnCis2WEpBZ34qZkRPOX13T0YpWE84YUI3VWcqLV5xcVdlRCtgZEI5Mm9jYWw+elleVjZ4c151RmhqTE4hREJqTStyXlA1V0Jjd01uX15QOTtGCitPX3ZKNlFVM1hlPXA0P3VoQjtZdDU3KCQ0eXRwb0ozTWFLKylELStaa0okI3ltTz4jOEJVUDlpS25RaVY8Q1pAIS1IK0pYNT9kUDJXMSpICitiPHxxYn5mVTtUMWYxVW5EMGZXTVJlNCZ5bklOdnYpIW04NSMzUH4tMmA9VER4JXtza0BPQ3xxbS19fERFWD9VO29fa0E1Pm0lSkRONClzCitASGtfXyFxSjE4SV49WH1SZTQ1X2BsQ0t3SFF8fHReQEZJNj5AKn1+VCNKVmxVSlEjJXUtfjh8KGl+LTFAIypuKz8zPi1XQWU1I2c0cT0jCitHalFwWUZubnQjQWNyWjZsRXlkey14KXYpITUhXns+RlV5YiVacnE1RihiaUZ1YWpqUjR6QlEjU0hzSml+V3xPVVJSVUhqcXgyZE84T1JiCitZUEhTMzhScDcoXi1xOFBOaGJOeW1GTUZeWDFwQTVJS1BuZE5UJEFoM0JGUzJ7JlM3R1hsXjdiWWczM350Y1ZIeHBuel9LNVhgNE5fVj9uCitnJjUtJlFkWXZzeG9EQlFUREhvUFFgI0pyaGd2NmstfjM3SHAoKk5jfkt7N2d4WT9uN3g3JE1ocW1SRzk+SUlodDBpaUJVckhxcWhFMGImCitxdXVWVXRsUTZoR25UQVU+VX5GTUFybXJIdi1eQSY1JHZnJnpRdzxCUGB4eTs3NXY/ZCltKSs0TzlkcFopNkpWOVQpPVFIYWVjOGYqMz8qCitrWDx8WG9GTStUUGxJeENMe1pURVUkODYqeyFoVE49P2c1SXBfdXNAbU5gNmJPNz8jb21LbmJSJU9uSHdQfGYlQnNqa2hQPDdDVyZOd1ZDCitVcyZ5RmVucElQdl88KTd5Z1I/dXwzZldxdDsoayhZNC1Lfj92blpydkJPdjZsV3Q/TjBsRmdPYVFSaXNOYHMwPD10TTw0Y2RJbCM+JVpXCis9Z2NHRD0/ZnsqbFlCR2coTUR9MmVVe0xGUTRoKVBra3c9R1g9JDdAPUN3VWNQO1paNnBQdkRvaDlePk1zbiN7LTQhbUM/OU5LRyRAM2c+CitVMjJjLXIraHJubnpjZ3NsSndhTGgrfWlucGo+WmtHKFZtTCVJfkpMQ0I5Yy1oUEQmcFNtaHdvUlFeRGRxOU9BZn5zJnJnMW5paWlaZENACitRPjF9aXVDbTxKKVUjQ3pNVUM8ZUEtbmRySkhqUktMa19LRjRgIztpTXchUFdOektyKSVIXjJPaDU4bnheYSo/OUI4S1FxbG5wPkpwZ3RXCitWK3x9cl9nTE1PRVJzNFVyWVl7U0pZfGVBdkBLUGhia30kPSVUPSE1NzB0PHk4NH53LXhLaFpfITBYR0YtME5yN2MwN0F+YlBxPjx1e3I0Cit0QE1RMG1FKjJFJkdNMmFadElCVndvVl9eZ2RZenNVI0cmTV4ldUhEb0llQUlkaTx7bX08I3ZHOzVldS1mP3VAJXdXIWw4OzQzRXVMODt2CishbmR5MCM0ZHB9PihRdEE8KG1rKS0lWW5BM3ZCPXwwaitPQGxQWTRxa15TSUBPazhvTlBme0d2P2dOUnc5WChLaW1xWk9kTVg8YVJ1N3I0CitVS3p6QUhBVE0jVDN7cW1QRD9GREE1QHk3TjkjJWlGZGo1OGBnYS0+UypTOGFJMUh5VE16UTZGe0hYXlJ9IXc5d0V6KCleRl55ISRveE43CitLXktMSFpiT3tCdU8+aEM2PkFEeSQkfjBfK09icE97aWNJUGJtTUsrI19HWU11bmlNcGBvY2hffiFgNDhPRypoS0JmWW0yayVTYjRuPTR2CiskYjBBek4tPTFQcUJNJFJgNHB3OC1XMlpWaCFgNHU3dVpxJl4wfmxINWVGTHN1ajxiK3h6IUotWXk1TW4tSFAjTjh4WkdXR2smQW12SiVGCis/SCZLfDEqSCRKOT87YGZTSkNjZ3p1PXlBbkVvNUt3ZStzUmM3dWQteEBMen5ZOHs4YV9XYTJsaz5DXllyPjhJRW1SMn5GUyUkZ1g2RFk9CitXJDJIMyY4bE93cFNwfWNWSFFmO3M9aFRgKm93UjdYdlhNNmZuRH0jVFc9PWp0WT9jK1lrVGhoWVheQWxMPlI/b2pzdDhpJCUqdkp6LT9ECitQa1JodShFR1A9dldCRSM4QE5lLWtBPGxgSEBfODVTMldUTVI0UUYpUW4zcGxSanBAfVB5MDNXc3hhUWw0a0V4IXxOX207MDxuUW1pMntYCiszLXJWKDtkbmQyd2lOYWMoO3I5KT8taCFUe35we2M7Q3R3OHJSQXZlcEB3STkzSF9FQFlydChiQ1YqQWpnQWs/ZnQyYVNBa0tRYiMraGxpCit6NEpRdnp9bUJBVWE7Mmx0JW9PaHk3bU9HM3RLTXVYViMzYTxuRjdIMGpxTXBkfWAjOy1zO09TdFV7YWBJSj1efnkoREEwOEBsKXxVWD1TCitgdSskKDVvJUwtPmoqM0hWWitPakpuP3NiRU5LY1hDP1BCbncqX2A7cmlLMzRjOFdmXkNqI318KF9aTDYqI3BwKGQrMlB1PD1qUUFfUWdqCispJlRrMlkqZGAmK1FERz1sI1ZqT0tzXkU+SVdZZjhKKkRxV1N9Rl9TVFNpQU9CR1VoZTkkeFRYOCR4YUljb0lsYyZEZUE7ekpOSE5IblJuCitNYjtqJl9NfmI0dEJ1dTZeSm52MUtMbGpYdHljQmdXazled0BEPkEpPlN0Y3ROQW9jM24xVlpXfXQ/QShNS3o3ZlhLI1BNMk4wJTFnJncrCit1fWZCWXZDUn1tU3wpeClwZmU7bT1tcyQoWjJBbCFwOykwTndsPXdrdWlFZ3sxSFBmZUc+LUh2emMmTWAlclpDdUAlcll2JF5GbEJgQ34rCit3PiRyK2IkI3gxYSZ6djw7Tkg4fV5gXjdTWDluem9VS1ExOUk4OWh7c1c1VF8rJmptN2wxJHtwd2ApaXBSYWo9eDBQb350RXdiVCEjKX1uCitVdmxjVHNkIXg8fFlsUGY7TX15SHJXdWYxKERMd1FCLXBZT1I1NXRWeHxGeElKdD98TztgdE04RCFfQEQ0Rkp2ZVhhbGdFIWU8Mm5YZEYqCitxJDwkdmUhSDxiR3FKQVRPfGY4WCZFZ1VNWTBhcD8lK0xqV1VWM05vJjgzYkw9RClNaGpuUkhkXmZTb0ZRbENPeC1panY/c0hJbXFEUkc4CitqQjBsYlE2REsrK2VRTCV+ZEhGNWlPRTxPdks9e3VxVks9NjsoblE9Q0dzNyZyYF9IT3wzMyMzVCU3cU8lSFRNOGVje0xPPipwJkN5TU9jCisla1lpNGsweSkhQWRQfDdOWn58bXxPPFBufSYoKXpiKUdKPWVBXylVcmUlWiR9ZjBIdSladitZZ2R3Q0taeExNUVFmKHlDcGpvdXloQERVCis8SnY9d2VLUDNRVE9OYkAqIW1hfSQ5ZzM3c1NnJGlubEQ/am9WTn5gIzt8cGEhSH0jR3tHKG5aQlIrM0t7TH1aaF9EfUImYFJVZXZ5MGZvCitwNVhmSzFLfV85fVRCMTFxV1MkfUcoWEo2NnFWKSM3RlQtN0xGd0pkWCRCSVJgZTBnOHJySXdEe0kyNn1XVTk7VmAzfHJVb0wlcDlvUmNXCis4a3cmbTI4Tk9OVVVQRCo7JnBCT1RVYEIxME5Jd0d3aj99NlM4WTFld1NeYXlCaWVjVGY9bk1MRV9ULVFeMVY2TVFTUUVGbERBMzZQSy1rCishYVZNVllyP18rYkB1aHx3KzFjKSpBbm16bWV5RjNgYiZsKipJYkNaS3lBV3ZWZmg4ZF9vWlVOdChSRiZ1fGd6QDYhWnN2UTBCeC09MlhCCitlVmBodWJ2eS1SSWJVJEd0YzJII0ApajtmMDZRMyghPXY1OWwlMXAtdz9RKHR3TVhoaVVpSz5zP0FrWWI+dytkYDtweXhmaHE2VWJ3NGMzCis8O0ZRTTlybjIxQEVCV3F5TENrJGZOQEpoVG87ZWluO09KITs8K3o4dTY+Yzlicl9sQiVFdTM8ZE1xOXV3Y3JlOVExe1pHZnlpNVc3V3Q+Cis7IUkzUHMqVWpWWFU+TWE2S0RKYGFMUzglKzxYak8ybndyPDs8RyFlSWVFQSVfLVVyckUtSDhPPSphMlZmPSlEaj45Tk9KKj1ydiRaaSVnCisrMEhOdG1XUU88OU9kKmFCO25sbz5ZbGpwRkRzMV9UYGE7cDgpQipKPU45X0s7MWNPfG9xV2JKSSM8SXFqYlYjK1NqLW10dUphaUlgbFNuCitPVDdVSzVVVElJeCUycSNNVGZ7WC0+Zl5wMFd8K2djQnZacnVrM149ekg+YjtDd19kTno2YVg8bH1iP2pwSl5aQ0t8djtgdUchZGxBejw9CishQGtYQnZMeWIkS2EkQVEoJFRCRntFJDhkVnZMZ2c0M09vQ3VRUjxkaUJ1c2hgckElISZxZigtI0Z2d2lFaWtEWTRxJjA8Y1Y1JCV2bnlgCismMXY5KGpTQyhWOXBBP1RVIz5PO19vIztyfDJ4JmVge3Q2fXFDZG5jPk5AO0k8S2JufipJSnskKnpldH1lQXdwP3s1eH1rZjFBfmNoYEkzCis+MXM4bGdvNFhYfVAmYkhWO2QpR0Z2JSshJEtoanxQX2dPODFmcUBlbW0+KEpqSEpBaHo1PHdDJjF9a25rMEB8ZFFmcUQlWDNoaENUJiZACitjWmNjJH43d0pBQUJGYjJEIzFQc2UwNyZKLVB0a19KPUFyTnBHZmBXI0hmcC1OMUVqY14/RFZuKWQ2ZjlnfkZxaV8xQlh9JEBCUU1JJnVvCitSajNUWUk5LSU4MmliQnRpWF9uYW9wUDdId3RrJFU2aXN0Z294Szt6SUprS3xnKjdXSnZOO2FBS1VRbDNGZS17Q1B8V1dCa3h3PzF7aTs4CitSbSY2ak1FdT9FJjYkVyojXyojbXp0bVJgNjxuQnsyVkBNOUg5Y3ZTTTgwIzJlJCNaMWxIUmZmaCVedyFKTGZwd1ZsfDl2Sy1fdU1JVXRqCit1c2B8Zl9+Nlp8T1hiQmVBZU01O0pxYDxnPEcyanpGQiZBST5tfm51bmtSKUZaTyMqLXdkRHdnajdqPWN3d0JMQyVAPXlOQz1RQiYrbFM+Cit7Q2x9WUhRKD4kISMhaDs7XmEjfkJDdlZ+Uj4lPjh+PD59SE0/eT9FWXp8eTFlTWBaTU15MHg2clhtYX5fVm0qdHxUTVlOOVJPfXYkSjFhCis5Q0xPOFlPR3w9NW5iO34lZF8qaSVTSSFKZjxNQTZRJHpCQ0clPzBCSkVTU0xATndBLVYhKUkjKT0tZ1lOa0p8VTBvamsjRUI0fi0pI2FvCitTZHQqaj5MfWlCSXhgP1duUzhuSTw5Qylzdy1GaHIkIStnVkxqUkw0I1J3bDF8cy05YnFyUTc/K3RlVHlfJjdvU0koV1R+cFYtMj99MiVVCitaITYxP1Z7MjcoPUtTdldaRTJZKV9CdT1tPl9vP2A5YnUtZWstZ00zcnBLeSNqQ0c1JmZ6cnREY14kcCUhZGBDc21aQztNZXt0Z09ZIWg9CitZMDYrPWJuYC1STDY0c0g0e2o8ZVdWJnwjSj9iOTBibEJXWGUlSCZ4WksrOSpoI2MrMTZ5aDlycE9vazIlNTV9ej45M3lsaEhiISNvPDB+Cis7cVY+ZlJBdFlII1ZsaDNYMGN1WmM+c2g7Smp1ekhBWiU/UEdkYVRJaip2SHNyUkJ2UVA/eGVMJEN0fXVLYzhxPXpnb2xLeiVvfENlPWtxCit6YCk5Qkcydzs2WSUjdVgrTWNfODFjcW94WEM1fiRIbVp9Nyk4ajN2TUE+Zl4lQm1LVGFhKkVIZ3M+MStiLVQ0aGU1OVg+TmcyOGZBZiZfCitsOSslS2Z6NygjOEVeK21VZWEzQzJ1TTxnTE1hQEw8b2BEWX1GY2opWFRpeGJmSDg2OWQlWHcwS0RFckU8RCVNWTxXfHs9cXQ8cFgxSSh0CisqVW1vblZqKkBtO1hNQmBhamFfX0peNSl8NW5pQCZFNmRXeFc8Mz9fcGhlbS0jb3s9KzQhc0RLWlZ+Pl8mQEFocE0qd1hINDBldjBoJilUCitDX1JpT3UkbS1eVkhzeU8oK2JkOGZJczU/bTMlSzkwVHk+YFpXfTwlZ2leNTNDbz50OWk9bCU5dF5pSTZ7UklqLTV4fTEwPGc3O3JtaXdSCitkam5sY2o3NUVqOSRkRXZDMTt4UlNjbSRtdT0hYXg4WWglX3JQQlctXk05eU4kPFhtNkYmQ1E+djk5az0yOSNhKDd0aXB6eEgyaFFhX3VCCit0PT0jeU9FZUctfTFPVFlZSEA2UCpUTjRBSX57cHcyej8xPCtRX0F4a0VNTDNzJlAhOz9jJnh8JGladFIwV2VgOWsjRigqfTRNPGYtNl5JCitZIylkKkcrdTF3TTYjdzcyJmwoN1Z1KEpRX3t7PzE/cysoa3dMZUcjejxGM0AzbV8xfmFCKFdVU21UNmZudiNZO3NXZng2ciZkVS1qY2ZrCitxPWpXPkw+cEVtTXVeezZBazxvc3dzMjkmTmxSKy1yZSZVKkxEP2B6ZTR1TmNMZ1V1YVpHRC1qayklVUV+M0QjKW04dUtyVkFvSkFIRl9OCitiY1oqQXgoU2JkPztYVz5uVnA1NThaTVpXPCEmb1VTWkFpXkU7ZUdPUzt+VlRPdGNMMGdaTGE2NEI+aFljVHMkSSs2K05AJTJ0PWB3QjlICitBLWt9T2RqSUBRO2x1NkZUcXBiTUF6aERFKiZRQTtEej56SXBHTUtTTmopJHoyN1Y9OyhOUz5OWiZRXzkwI01HdncjbXY9QGprKGhET15wCitne0V2KHArZGI+S1NXKnpzbTYqN3UpU2h6XlBrfH5+OGpLbm49WXNPWWpeI2F7cm5kLSk8TmhrRWpoaEJ9dWVYc1hLUXk8YzErSSMpfSFaCitUUVRDOFdEVkc+QX4mTH5QJHxWKVpVUnlrSXF3VlJnUGc8dXhPMkA5QT84ZnFBPmQmcj5NQHpYWlE2d0I/bmg8UCNjPntaK1I0QmVKKk52Cis7RFRBRE8tYWRVV0ZOY0NIa0c9SEpVNkpnTUFXWXB8Q3g1Jit+PmY0OUs/bDlDcUQmV2klPiU4eHRYejFJSEB6cDxfRWQ1ezJzYC0pekghCitAaiNNISUze043O1A/OXEpS0FvY2VVb1EqSGxTQChDTStJZF50Z2FNNipuOE1UWU1LOGM9ZHtlVjZTPXkzbDk+N0t+cU9yTVRPSnJpIS12CitrSj9eWDZkSS1oUHZlJENvRHpkcDtfbGRhYlpGJWc/cD1eKWl1RihENihET0hxJUVQS0lWKHh5PnlfS2QrSEloWlNqU0VBJkdfKnA7UkU8Cis0NlEmVU9YcWIoMjVMZlRgP29zKTBrIVNJcXNadUUoRWo3TUFmczdOV1VPLShkJUN0QV9DbS1vQ1J3OHdnSUFLWkN8ZGs9UVZFNHM+N1Q7Cis5ZlA1PSl8RW9PMFc3XnI7fW1pKCtaMF5wTXR4S08jKVglUj8tOz1mb1hpUiV3JmQmUkFCY3pad1RTJUZATk1eQ2koLXUhTn01bl5JYENzCitxekNRdiZ4YWV3fFFxSHJKbSNZMkhWXzQtVlg9Z0J1QF9eSVc2NEUkPDskI1hTbHZTdUVeejVRVVkoLStwS1hKQi1PYmVlYzJ0KXxKVzxxCit7eDMlb1VzWVhTMCZBWj56WiN+YChZU3dqI0dBP2M/JDRoS0lCMWVYRzR8VlJHbHhPVDFIMk1vaCM9UHZnTUo1MXswcEQrJiVsYUEzR18kCitrU3Q2aFB6UmU5akN4K3UkVWt8dTFiT04pI3oqRTZ1bkJ0OElENF8+QHZXU0pASmJLcFMxMnpjd1hZNWFIWmgme2p2Q3pJaz9xQ0EjUi1RCit4RXJqJnJPS3d2R0Myem98UElnZi19cHNIJlFlS3Vnc2ZNRWxjNDtaJFRnK2hSXkR7fkdoZ31eYnlTWkw5K3pqY0A3SDYjSCh4NCNORnkwCitMUDs1NVktYU9yNERFQylxT3U8SVU2PW9AYDR7M207WkomT3Q2NDloNyQodkYrTmowcDxONk07bGckZWFMSjRzPChoVzElZE1jYUl9LVkpCitteXg1b0FgTn5Bc2IoXyZHeUV5LTlkaUtIVkBDUVM5JF8zRm4rT09vd0hpbXZOaXFebzJ8ZWR5cW03eXYwVHMxa3crZjc+SUtpYHBebjZqCitCPWNGaU53dGRgOFRAVGk9JlIrUip4UVJxbnp1dWVaNU0keE92aT48SlJhSztNXkRlcnlkejx8KEEjdWJTZTA7RDlKeCs/SUZedGAlZHJvCispbHlXUiRJbDhKVj5fbDNiQkdvUzZqJnorUTVxbDRtV192KisxYnRsV29CWV5KN3ltKTE1NHQkKVQtWiN8M1FsZ2kqLT9qNkxHUj5rZ1NPCityXyNaZ0RuQG08QyVna1NQR0tQNERLbVElYlJ5RHI7UUk/ZylRbE51OUJZWUs1TWAoN097aDNweFZPS0VvPHRARUtYbXg8YyFwVEtJJVlaCisyRW4jWThmdEBAKGFUamN0JmFudFJYPmRDOFVSckIrV3wxfFdPV2htcG1xT05PQD89RDImSCpmQ21DbjtXeGNCS0RMPmg+YT9FI2ghY2RFCitTR29ZUU1WcndxV2JMTiU3WTklKyZ+TDhLOFEmUklJfVBJZ0k5czR7dHx2dTJSayFYIXtBP3Fwamt5e1BaSVdEcnxlSE43V3Q9Ql9TY080CitCP31DRWF+WktQLTJoWWRIaFh3QkZHR1FpZkBlbyNFK0A3SWZYcnwoc2g9aXg2e0phbj08VEtKSTYhZDVCb2x+I2BYKXtKckl9OHdTaSpDCitPdWl8TFpAUnFWZiZEREQ2PjBlajtmUEJobkQkZz95ME02MEp5VjFPNkU/PSgxam12dTFxeEJzT1A9OXMkM3BvSj0yMzZuKD5EWCFCJC1OCitzPWdLa2JkYy1uakdGWnxMaVZ6SEE9KnI9cnA7aipWNDhzI2M7Rj5aNFd2dHozMTkpZWhJYGhENyRrPW9WREM4MD5QRShWV0V3PENJd3dnCisrVHpUeitYRXFIUTQ0bTdgY2hvNDNibjhLd2lVWDspRVJKfmpXUShCdnNHblJCPTlIb2ReRHc8Rkh0SlE/fXkwPk9GUCtxSTEwckU3WTU+CitzNyVfKjA+JDRQNFI7SCFWYm5ZY2kjQ3ZzZHZWeSlrYERfcSFCWUdhI2lNIXA9TFJSeVBCSV8hSksxJWlucGt8dU5sO3xNe35JWTlfeCkyCitBS2FhZGQ7MXtNPFczZW40bFRLfXk8bH59YjAjdHw4V2NJWENOR2x7UzZpbD1DQmRDO3E5Yj5AeG5ld180PCRCcy1wVFVOXk9gOVNySW5HCisrQko0PWhsekh5SlRxPVFKaztwUjN5TUE1PzR0QzNnSFA8T3peXllBPipEP1MydVJrUS07bDx8R3s7Xmo/WGwwTXRBTVBGO1h1RXB7YyNICitrZSt8SlA0OXtheGkqSyM9dyErK25xP0FGZyZ2ODFXTGMmaChuQ3c7VHlAUHdhRV9uakByMiFfTnRrfEpASUMyNXZwREdIKyppZVlHfD9UCiskZ1FjbDZ1MUNAe2tqSE90Qn11blBgN3JAK1Z2R1Frb0tudDAlKExJSyl6dTZtQHVIU2BuPE1IOUlrQ2QwNWYjbDxwRWVVT15WQlUyODNCCitxPG5KMSYkfEZzIWdCK29DMkh0bFRYWGVJX2BLcjNvTkRacjE7RGxnUH5kcV9OcFVqREREblUyT00oWGErQ0F2U2c2SlReX3tYZ3opUTFtCitoWm5WOE5JSUp2PXxSfT5fZXg2Iz0rbU9ueVFhSW5BJm5CX2NgZGVWYlppXnBUS0NibnV+SmIkJmZqIyFgUT1wPjRxdGgkVkpFfXRXdk54Cis9ZnI1JCt6QGsybjUkP2k8SCo7MHlDJiQ+RT1fOChGZCVFalpwNXV3WXFkZUZ8T3oxWlFFY29qQ0dKTzExV1MjPVlWe2BFKU5GU017NTlUCitzPF5iNHVZYkRmZyFIUTUkQ2NfbzFwNHY0bGdScUtWK01uVTQqT0k/OVc3XmxfaklscGclS1BNcHE0d0xpSWRMWFoyQGJBdy02eVM1UG9+Cit3IVhVZXoyTnNXT2tUWThBaSV4amB8ZHhpMEZ9K2VUajlaOHVXZiF0PjBQVGlKVz8ofWg4U1I4MWRBLUY/dGM+Pk5lOz59P19HVko3S307CiszcW00K0I9XnFCYzVrKEg0IWFyZEY1S0pgQTlCJjtpOVNaaEd+JDAwJjBpXzcwN0d0N0ZQJVBiWXQmIWFrLUZ1dkQ9aEFqbVZUMEtrXjdLCitHXiFGcGdJOTBrZ0RlKFgjWHxTP1YoZjB3al4xMShsQmdOUko4UnlocSFNUF9XbTxlKnJEWU4jNjF3eVVZRDZFYzYkWjw3RW5CeW5pPFpnCiticHwjcyorJGRNVVh1QXVsdGcyPkVyT19RRXshb2N4PnhCPlZRTFBiRC1ZYm9hWkx4RUQtQENVPiRZdTREX28+czdMNl5Jd05sa0hhO2t+CitYcThSYVMhUVBMTz0hKUMqQ0o5NkJPPVBPYmo5c3pxenctUlF2amZMfndhRiZMZ085K3BTY0RNMlZraDY3a3JKbXopQG0kfUlJV1lNZk1oCisqdF9wbCF4YDxzKSVeY28wT24yOyVHNU14XlgpI14kRCt5XjB8b0dfeUF6KH1CY3tveFNGJVdaUUNzQXtqLT4/I3RVTnJhXiFeZWdtX3NkCis0JihEXmpoTmZKaVlZJXtoT0EqNHIyN21HIWFXK2Z8VE1BYy13UW8mVEpiWHlOVHlzUFFjMnI2X3B7YTN1RGRTa0w5IVpEQUlzQF44IThLCis8a2A1dFVLbHVXVWdaJDRGTkEocSkrWVc0JVJySVdJIzYoWCFUUG1VUjVYVzE7KWpuSSVAVGU+M2tZfSs3Yykld3ZndypmNTx0PGtjRGRhCitVU2FAPStPPCM8KyNTUXFreF9STk8jYVRebVo5dDJxdV8oUVotVkF3PEN7eHhpKW99cTxqKSp1bFltWUJ7SjZWVGFrZWVzdlI3QlJVZWFkCit2dW8ka2khV141YU4zfCMmMFRvMWZIaXNLMTZhalp5ZmgzRUY2cGM9Nip1NyNRdFJJeW1DI0tQRHwwOUk2eUElQHVFJj07eWtPcTBqZ3YxCitNS0FlKDZjQnJ5Xl49PiE/Y3tVaVRHZV5uYEFuTSglYnhKbXJ1fj8tYWszJip9RW1yd2ErIUMpTHlIdHVPQHA5MzR7cUNSMk91ZiM4TntHCitVMThfYzVzKG14REBadnhKMTFoI2JJcWxwSHwqXipoI3g2JnN2JF8rRHMlKD4+MUA4elFZQWBYRGtWJSZNJTYkYmFjPEQkYUBKO2RsWUh3CityS1NCMlRLRiQkISZsfDQ+O0ZyUVpzYCErdml9KnhASVFDcmtFcjRPcTxfNGhebHp+UGdPVnRZPDF+WDM5RkFpY09IdUBlYW09PzskX1pxCiteMENiUjFQP1JaLUE9ZjVqQXlSPHApPiYlKnJCZzJPXm9qMzxeLSZVKjxpV09xMVoyVmhAQnZJYUktNj5NOHR8RUU2RE4+JDEzWSNWZzxkCitebXNCYH5IZjZBJVNiOFIwdj1WNWA8ND13PVFlYnx7TWdePnI2ZyVOVV5mUkYqKVdXPk8qSWl3SzlQIXgpcl5UVXcjJk92I0pKYl5oX0VgCit+NyE3SzhZUmAxPkcxM1VpM3FfJFRiM1p2YnxmZzZweiYqVU8pPEwtbF8+YzJIbTJuP21mY255fn1zeHYwMGQ+dU85MHQ0SD9BWTdFdSVuCitBR21mNEI5JjkhSkslP2EwPSsjaldhWG8hP3Z4WGpzOGcjLWlENit5SkxTRklgWiQxe2NZJlR6ZFFEfnAoQWtZenRNXjIkKn41eFdBO3RYCit2USR5NkUobWIoYk0oT2w+Pnx0OGlAX3x0ZVJ5fXVhUGBPdz9ORGpNdHZ7eTErRTw8REhSKVllUnVYIWZwKk5ZdVlNT0YmI0d2aTJWJHxrCismcE0+O0tDdzRgZlM1Q010PE1ZK0M2VSpCZUEqPGhUSGVSTHVIU0hHKjtrbS1eV3g0QmtWbzY0YmFZJjUxU2theGNJanNqLS03MVhLZGdTCitSTGAqRFV6IXN2KVFlQnNgKi1pI05NJCpXaCV0QSZnJCR5X1FeR2VzSlc5PFNGTWV5VkZ0PW5pemJTMF89JitEJm51PmhXeWEjUjluVVhTCis3bylgO25pTyR1SWx4SmhIcCVeWjJsPzhYfFM0ZTN3eklBZGpoN1FNWXAlLT03UCNJWXFzQkImIUtrPXJieWllKSk4Yz5EaUtVZUFgaDVyCitlNiR5JiNrKT1ZMjBKeyN5dStIXkg5WFdtKXg9WEM7akQqJkdlQT4wS3N9Uzk+eVNFPnFue2JQfVN1OFJuPWt9dkA9KFJZYHNjOVRBVSR1CishIzNpSE0pRE57S2NkSi0/Wi1hPihtbSZTR1RHMVFfOGhqITEjRVlaO0p2WWw7R2tDIVBhcHRMSmxfRHRgb3VSTWJSezYzXz8yKU4rK1dICitVZ1EyfGJocmtfJHpoRnEmJi0wR0JJNyVJNmtMNE98NGl8cSprSnlEZFFfUHg2M31tXkN2a34pNEB4QyVWI2RpWWJwM0Nqbjl+el5odkZtCistPFQwT0BMQ3BBOXRAb3V4KiRHdiZSUyowelN2TzhCTEJGZkJpR3p6ekMzamRITDB3dF9IJTV+OT4/QXU0T0sjdXszeGdvYEVQWCliX2l+CithTCl6aWdqWlF3bnJtU1FJaU0+Zio2WHkzalMzWW40fTYpdzA2dURkNSVneFN3QHR7cDg3ZlJafCE8P1NTcCNWenJHPXEtcW5YZFM1cCsqCisoMWF1X1AzNUd2Zz49fEtENnRUPUpkbWJRS1BMZDdSbTlkRlZCfSF5bXxnZ153Y0hLc0g9PzBaSG8lWmRvK2dvSitpKFVyTDxlPGBVVDZpCit1filJRG5fbTVFPTM0MDA0UVhNS1RGbHxYQEFEQD1VSWQhQzxqNEJUfDR5JSpWXnFpNHReMT9OfE09UG1qdS16QkJke2VlWip9eT9wOHJHCitDUik2cDsmWDVHb0dHRXw4QF9NNE94Y3FsPkU1M0h3YE9qVkVUfFY7SElleHNfLTsjZjA2bmdzRUViTiRhRmx+VHliS2Yyaz5Ofk83Kyp5CitIeGtPN2IwOH49WG8qcHREbWBELTRYZHJQWSlrZnowd2JDWTVlWDdDdyY3R2xPPUQ/MXY0bm8jamleM1VLREkwZj95NyFEQnpKK3BVVFdTCisoO3oxfEk7SmNuTkp9YjVyMzZoOGlGP2YoVTZBb0o8bSFiTypsXkY9VERNJFk5Y1FVKlk2JDZZY1Q/IyYmN3tANXNNanJLNW9IbFBgIU54CiteRmZ5dnM/b2glZW11ajlVYiZPKmI1RzlKK09DISFnN2t5b1VGKz42QDstajJKTXYpakw2VG5gR2dIPnZrODJ4MVNncHlLZlEwRHA3STF0CitwMil4WCpyQTBWa0ZsP1ZXelElT1NPaFoqRWNAT0ZpKD07QnU9SllCZkxMSWY4X1B8bV5pbnV5ZSVmWSNDbkVfRSFZfEo5VDdGVzNINDBLCitOY2VEY3dZSzxNVzY7eUlJYi1OUzwxZ2EmTmt9KzxqPG9WKkF5fllse1dOTCU9K2N3KH1DK2AzJlQjVVVvQWxmX29wcHFoRylkI2dWekRuCitpSEctVThCUFR+Rn5LUWhNPXEjdERAKFUmKl57fU07JnJfaUchRkk2T3x6PztmRj1hY3J0SHNsN0FMV1dzazNHUyk2LU4ock5hIyRfYmlsCisqPEgyYWAwfnsjM2NvKXIjKVp3eENaMVRnMDBVOCRaSkgtZE9KVylzUk4jKSV1RiZOeHN1UDJ+ODI5WnUjQktGcGUzT0Q4eGsheDs8JCZCCit6Q1o1TG1PPD5qSU1EWSg/eGg5SGhPVlF0aElfQiFnODVKX2xqNEZFNVphT0V6ejNXciZpZ0s7O2BlTms/V3MoVW5xQT5TWjhkK2x2Tmh2CitIaHVDWGVsaHJ+USN7fVNhY1M/aUNtOTVTd3BKM0lQeF9kekVCeHZqK0E9dnc/SiM7Q159Sn0tJF88LS1uVDZaKyQmUUd3PHhNOz5KYU9mCit2VChic1ctVH1FYVFjXzlibnY8QlYzOHU1ViptdXNVU3V5N1FwMG9wNWF5KyNxJitGWUsyTWFUSlBpWE1LVUR6Nk0xJnE3KWxLKihNX25OCiteNihCNllAVkV7dlVSZjNkVUkzdTVweEZ8TTNhUW10UmlNKVVKY3kpPE8+WEZwUjxITXZHO3JJVTw0KjFqXmZ9fFgqYkJQd2dYfVJeV1l+Cit2Z1BDQjNVKVFFWXhsX3NmZHRpXmByP2whWGtqO3ZEX3A1biQzVUZWUEVHMkQyPEg/QzB0SXU4NWZjJndvM08jcEc0UHBzKVprcTZKbT9eCislfkN2MVgoekpHclltKVUjU2woZDJsOEhoUjM+PkQhTT5YSCQ/KkApQylyektBO2R5U2U9OXF1QHF0WXhNbT5saXc0OTtzYDFTT0pmZzhiCit7MilhamdPPj9GcWwocHtXNTxgZHpHVGlqQlNOazFsWD5uYSYxMjxAZERHaGZ5fktLP28/fVdsXlEtWl5OVjQycDskOyUxTlE/Nk5FXyYqCis9ZHFfNDdJeiReeXpkcygqaDg8fjxXMHh0PkU0a0NgYiZkODwpMzZmajwtUVYmR2AxI3coLWI5d3JLZz4wP15JU2s5azlXX09sKyFOUDkxCis5K0NHVCpTZHRWTnd5VVhjckBlfmpBQzVAOTRua0YxRzlKSVEjPE9EZzA2UEtON2x1ejgxJDZQTUViK2Z7UVEhQWpNRnhAJCFoXlQtZHg0Cis/KEw5biRDVyFiQFdzbGcheUQmWiU9S1AkWktxdyRpKHJhaz1PN1NrYUY/VSshMTgjaHlUPWV2dC1gRSpQRFFsfD80ck02M0k+eUhqUEopCis7IUkoN19pZktxKndlJTMjSD1QaUBgJUd2MUElSTN2PkFBJl8kYDVJSTctX0p3T0VpMHBSaTx5VH5gTjwlZXRpRW9lejdYeFcoPEdWUmNyCitaJFJjViNVWF8lTChKVGJmfUtUP0FXOGZDWGJBRDVhMlo0M0whcSRhMV41VXMzXlMpYlNPJnJzY0UmXiozZXpKQTBwK3d8Wj5nVSZGSmFxCitAMVR4R3FXKTVkJEBiPjUmKSpnWT0oUV9wZnokRDJtYGpsbys7U3lrKkpjRTVQSUJicmdVQCpmMTswPT8pT2JWMDt6IyQlRTBtdz1KN1BMCitIUCgxUU9SWHlOe2tmKT1uNmw1ZTJwVkJebjYwTmNeWldgbGcoYEUhVGQqVX1+QGMkJCgtJk93YlNgTW04VWE5PG56JmcxJT5WSWtqKj52Cit4OFFkXmZKfGg2VUV0S1EofWFAZHspUFNYZ3R3TFZGRVpsKnhLeVVDe08yZjk1SyM2MSRiUVY7IzBXX1JzQzM/NllpRlNuRzRzN3ZBSEZCCisxWEI7b009XnV5RkRTZ2JnfCFhSUBhJjxPUEVGJTNhbz9NVmQ8d2VGKTdpZVVUS1lKWlN2PVMwVCRLa0EhVXt3VihEbT1UPF9SIVNfY2F6CitCYk1xfnJXe3tnY243Kzl2ZkZxaDheVyYoK3x7aC1xcl99dVZfQyM5ZXIpJlVQSDg8UDw2R2pJcDAwfHNDTkBoZCojUmZCM3MycDYjcHVYCitBb1RgSEp4Tz8yRVN6RlBQP3dgPn16bCMxa3dCbWNqYTE8aE4oekI8UntZSiszY1VFaTtiYjg0eFhJeHB3O2loa1ZASDs/VXowbnVsWDdSCitrflBZc28+MlAkREpAZ2BzV0JRbHshdElkfUNRRH5nU087fm47bVpXJklKODs5TTNZSEl4VX4xYnNTSFM4XmtqVVl9RDU1KElhYENDO3NUCitoRkcxOzdQLUJORCVTJVVeNkk5eWc/WVZPO3MpU1c/WHdrP0h5Q01tfGpyVX5AbE5gTzc+OVVnV0FqWEhjWXo2eT0+eDR2M1MpK1hJYlMqCitNJSMhYEwkakJwdFN1SF9YTkRvRkRqYXtXdHxMQjVtZnkxTyNDYlN1YFhXWEY/JkctPz9FOHZwVjE5OUxrM0l2P21aQ1ZtazBfa0JRd2lvCisjVmdfbkw1ZHw1TDI/KHRFZ0decz8xczwkTyZHdj1rS2RAcT49aHRpQGY1Nj9Qa3dscTA1PGt0YChxJj1WPXBfWUFJfHclX1FjRjRHb29NCitDJDdTRlZtRjBVbzt+QHReWGtTJjYlb0RSKVdSb1ZFOGBuVk13WCk5RjJsVFhEeTcoR0JWMCU8WDlXRSVnWXJ6bDcjanJKJV5YTSRqOD88CitndGR7NjYxP009Uig+T3NJQTQ8JkxOdDxXbnB2QVo/OSklSz44YnUxaSNEXilWfHs/VSRTIUFTTDsmTlM9OFJtWWF9Vn5MLXoqM1BVKTFmCitKI0VSfWdRZ0VfVk8kU0RtaH4qfWlwbXt0Z1dfNTU/SFV2az4lY08kQS1BK1dMVDJxcUc1JlN2N008b0F2LWBJVk89SFN6LTtCI2VJOFVgCis0fm5YbGMoUkRjayN2JUVZcDQjYEN9NjdGX299Oyh2aVZoZCMpUWJ1ZiU9N3ZnTkduQHBPc3NMOV9EUD9WP0g0PHpreWBMKXVwTmhjSGI7CitLSH5QI2p7VGszaTwkTUNDT1FBSFpsK1VLajhqd29AJkNNKG0rfUFhQTVMXytjVisqR0Y1fGgzKGdxLW94QmI8cVlObmA8JWMqWkpUfnc1CitSdG4+Y0FYSlkxO2dVKDtqJT5PQEVlMWtTYE4xSUlfLU5wfUJgaWczQj5SV35nT1Y1UjY+NzBZJT05MjZMTiliXkJqR3V0KlgjeFc/RiN7CituX3soVm82MngwfXUjUk0zTEF8TlhTcnklQSlYTSFmfDNvPSpZNWl0eWZLdnwrM01uKUxPXzU3KUZaV2ZrST05NGxSeWYqK3omPHlINnJnCitNY0hHZEQ7RWNaRFoyZ0xROEEwcWclKk5FIXVxUFF7U1ozUVA5NW5KTi1Oa31CbDkoRXA8VUhwPkoyMCNPd0ZVJjJHWVdxa0VpV0dGbVRMCit8PW16TS1UYlh1UzFpRVI3LXY4NSomMk91d09naSZlQEhsbkVMaUhmanZIPyYhN1F1WTdjYzN1PFZTMjdXbUljUjxGPll1SU48Wj9nX3JTCitNMDtUcVVhVUs4MFBAPVoxQXZCPTh+NzlrbU05Ym9BbTF+O1p2KT9jTTNXNHhoeEc9NGBWU31IIzYpYHl7Z2xkVHVHUGUmNmYzSks4M2g0CitaP31oaVhlTFVHcWFvP0ZUQnlCWEk1flg5SUNJKU4hV1ZqN3hkKipFaiohYjxrYEtRa1lgUlU+TyhgU1NIXmw8Kl52cTY0KEk2cHB7LSU9CitBLV9sQ3N1MX03IWkpJCZEcjh5e207eEBIXmlqeWd3S2liQEhZRHFAZkl6VkotIzRUYXNeTTJ6RHRnPFR6R0xuT0kqIyVoX19XJlBBbGN7CituWXUjYCpMeHhnayUmJWxeUjBaaXhgTm9zYilAWEJuejg3TThjWUUjcTFqeXNoRSVaUk1Sck1qKFpxYkJhNThkM3JxVU9qenRNJX0ha1FeCis+OXNVN1YhJmRkNXl7LS05N00pTTAjNWIkQXkqT05OckpBeDl3QXB1dGk7U3NtbmtlJTtgcSVPdUQxWFheRjtvS3lMek0rYTgoekk8QSVzCitVcGEoKnFNbkFAVEd5U0I9WHxKZWkrMFRUcyVQOXk2QmJWI19gdyZHU3VIWXFoZyR8TmNPX3pxX3Q8I29ubzJFPlZxPz19eDkrUDYtKHJiCitNY357ZS1sTCVlM1d5IVJNZFI9U3s7KTl5X1dyQXdyWlRDJl5nOyF2Iz09KUhTXiRGdTNwOXI+XkNJPFdgMEF2YmFuYD1pUmY1dyEobn0pCitYZ1RzZUVXdW4jUykxVldLZGxWdlgpWE9mYyk7NXl6RmRwdHhwcjY5enJlVDA9ekY8fSVnKExRMSZKO0g0JW1+O3IzKEBOKysoR2NuWURQCis5WXAkWCEjTzc0UnJmUDRUKkBVWDgpUTFTVlg3Q21GekpAYnx0LWghJUBnQEdmWXdUdG9fI0piUEJ+UFFyc3hnZi1WP0tFTzJ4OCYqN2hjCitVUUIzYzxBPnYwdVBLOFpjMT9QdmhucGN5Vnd0U0I1PjhDcmlOOWhvYlRgPXA7QkY8MH58XlBXczx0VXVmVXhkMXcyNj08TE5PMzt7bmcoCisyeVY2aEg2KnRQNG92fCpLaS1BfWg2eGNFOVVqYVVlbnd1I1hjViNVVH5mdUhoWE5tNVJ0biQqP0o9b1cpOVcpaUNiO34lQUgwS1MxQlVvCitPRyh8Mnh6VGE/Pl8oOyYjbDtiMD1wSjM1eGtLaylOWUJTfGJuQktmRldOdzxPJW54WG10PVFsO2ZaIz9FOzhoUTYoIWtleTBibFA4SmhXCishK1JqO2gqazMjX3YtUT9rY0BxN24hUTx4JElGRjFIZVA9PnZRNT5IQEF5NWs4dXgzVUdOdlgwdG43TGprRTl6MnsjRmFaNWFqe1UyMG1HCitWYCYzVCN0TkVVNFFtQWdsc083NTMlODU4dChnMkBiZWI5Tnh2TmlhZVlUem0pYUMqd2d1TD9HQX0/XlkrPzJfNiZYcFNMRFZRe2Qle0x7CitaJClfXlQ3YTd8N29hcT16U3VlNypQQj5Vc31gVW43Q0tyVzY+MjJqfHk3fjchLWc9WiFZbGoyeVF0ZzRxNlhfd01Dd0YlNGw/OUJwZlEtCisqPzFrRjYzUjt0PlMrfWVRZHo4fVVjMHMlTDNnYD02cWZXdEVOVE17UHJJPmlUcTljVDVjRzZtcktqOWs+QEt9aEpKb1kySDVaREFIPldBCislUEdnU2dvd2w8ITJmVyZJVFpaaClzLVBGOVp0UF9meVNXeChXeDYyeFE+bkRBemI2dXJ5TllwTFctN2dNK2F5XjckSnJ5NXlYPUokVk0lCis+aXIwd0dWTyErKEEyUnJabkpSPj1GamFNckdyM3VuO2pyNnZAaHN8IW9CQE4kejZAe1lkWXxSZ2dPVXBnNVA3V0UxKzgzOEtXe3VXeUZRCishP3pNcCZgMFEtNW5UazUxay0jPHJmfkxEXmNoV140XnNFWXpEYjlLeG89bVR+bVkyfmNsOSh3KFpUZX19QlhlOzZlSD1kU2hAQVBab1JPCis5bjNUPnNudFNHS055JFlJQWFzUjIwMkgkIU5+XlZLOVY4YjVMYzFuO1lFX2JGTDkhPEBrRk5IT29OTU9UTShycXZxcFMkWFNOMVZGe1FkCitPbGc/IyU7eEBnTD1Ib0FVPFVeS1NDcyRNX0hNcDk2R0w+MSRNNkBKYDx5QSQ7NG9fTGR6O0s5IUU4RVRmUTVOWEpjRSlKO002ZU1uOE4xCityVXxoKjhxZVJVflNudnh9dEhBJE9HSlFZNmJ+cFI/KEJHZDQpN0RJU3M9cjcpPntzcCtrKTBRUUNuTzRzdldAfD5GdTxPMFVsTStoJVZXCitTYk4wWDFocmZAVl4peW5BNXFGXkRTZkVgSSZPJE0pbU5QZyVTKkV6Qlc0QTh9IWZGU35fOGJ3OFQxPyYhWUdhUEwmVVVQaGlKWFhLWHpWCitjfFdOfjYpOVooZ009M2FkTzk5eCV1JEZoSHBxZilpR14kWH1oflNLYyhUYkA8VVp4aUEodTckXk9XSTFSUyhAN29NYjNCUUMwSFA0WjROCitLMUprTE9sKTV4X0lae0FPTEdeSkB0dk4tWlY/cV45Tz9yRUUmTH4wMW12Xi11UGwza3F8JD5TbkFWPEtEU1Q5e2BSKTw/Z3tRfWM7aCMlCitVOCtMZiZoOCFCNG1edkdDfENSJDx0cTdHOTE7MFVke1J2S2VWNWkrQ0BrP3c3Zno/R2BQMHlfV01DeytgP205eENCeGpxSXVwengkO3N5CiskRFo8bWVISng+TiVxWj0ka2k/NTspVTQzcmliWFhHZUJVZ3dfQEcrUkFtezZDVUUlZlpSQHk/Jklfc1VjeXA7IX1UclZgOUptPjlCbFhxCitSQWlpPz0pTWxleTFtVG4pTmItNDM0I2x8Ykk9SkFHSTZsVzd9bSFmOX1qMX1MbT5MV29jTW1hey1YVXFzODw2QzZ6WWhYX0o1Kjk8fHhFCitUTClUPHFeNEJrfjwpezJqPU1lMXtvLTJRbmh4VmFESHFqTDNKR0BwbTkyQCpRVVU5bXQ0JGhaJW5kRzl1cSQjQH5VQSRhazNXY09XRDM5CitjS0k7JGNUSzA4R2k+ZEJIdi1nLStfJENjYk1eYUFTM2J9WDhiY2BSME4pUDsjKUh1WnAmaE9tUjglekFAeEIpWHs2Zn5sT3Z9Rk4lKSRxCisxOUxBRy1aPUB7c3ZDfUEyZXYmcEo2dX49K3IrRiRSM0dsKys5Qy1lSFZeVCEqJkhJfExKMFRzdmwrSEZJXlpMNyR+U0FmPnQka3tVbiVVCitFQ057Yn1zbXwkaztYSX5faXNvfGsqNUV0MClgTkl4dyhDNyZtaV80bCZ8TmVjdCpiPjZZcHM0Q2d2cm5MMjV4P08xMXNXeDc+NH5QdWxFCismKnk8WTNYclQmYj0kWnJZaElhRDNiWEJyb1N7d3UrdWF1IVdNVk1sODJAMC1yI0VoM28oVEU2RnYwa0ZtNEZvMX5YNWQwKUxCeVBPYEdUCiszdTRnU2xOTWhta35yZmlSRHo9MkFCWEspMFdHVj0pWCpYNlk9ckxjK3U8eikjQDM2YX0tbUZlXjtMfEMxPSgyTkskNUFyPn5DVE5LWCVACis3UFEtQlR+cUwkQjVVJGJ1aEYlMlQxVTVhaE5sR1lDOS1JZUBlbD07O2B4ZTl2byYzTSk4aXJgVlZMSyRWQW5GNEtuRXVTVmExKFhlOUM7CitqJngreWtjeXxfeUB3LTVMd2VzZjZrKyNHSDFiV0s+VGcxX2UtKDhee3oqdm9PVmtuRW1HJX5PeW5UJUt0fTt+XiE4YjV2PHAoU317KTl6CitFO1dCKyslcUU7KmNzZStYTUlpSV5Wak47Y1MhPCpKMnQ/X0doZkRUNkptTiF1NF4wZiMtRUZoa0UpUnp5bFFpakFVNm0/U2R2fCRGdD0mCit9OUNLMzhYQlJ4RH4rNzZUQzlfc2shYDMwVHdsRHVadV9vRlEkeFRuP2ZleHN0TFdFOXRaYmpAazlJN0RmNSVsR0VSVTM1WDliMlppSFhQCitVX0Y8Mj94K1QjeVYrY1EmX2xKQF5RaTBjVDQkKHdzKEw8LUBpQmhwfEladG1ENTUpeEN4R2trN0hiP309M2MxYX4kNj4ySCM/N3hfeHxrCispcUh8YCZfQk0zKzlFMzAoOWZpdnl1TXY8aitPMDdlMzZgZEQ8NWl6JEZObjd7SmJRbGVSTUg3PUs9MV4jWClTM0JjKWc/UjlTJEI9VTYjCiteMTJXSjlib3oxdT9UcFh4Jm9mJEgzUzc8Zmt+Jn1Cb01SIVhhVn5LYlAoTFVoPihZbVNnbnIwZ3JaUFYzRW1hKl58b2Y5OyhOQ2NUcGRDCitzQE0yWnJofFJCVk91IVFYWHRmdmMoNj9LNzVkZm5BNm80U2pmNDBkPkdfaWV3TiNGIUUyWmpXUHYkX1g8U0Etdmleb0NvJjVaPVpGJnxsCis0c1M/eGhBYFQ9aVlSWT0mP0pkezBiZE4rZihZWEhNYHF0R0dZalEjKmJlQXlBK0teR30yRyM8WjIhTHhHM3Q4aGdGN05aVjs3fnZZZyZXCitRVyhWXzFMMkJRRyF0VkE1a3FvQ19xdnkpZ3BnZj4oVGppb2I/cERXM3R8Mk19fExkPD1aOFdCfnZAVzt2TWRTfXhea1ZDak5JdGBUXnBRCit+eU9UOT9ENipIaXZ7UTd+a35jO1I4UT8pcnA1MiFHWmNVXmkzMlRebXNrKyF3ZlZuN3UrZFdVfFI2M057RWFSSTNaP1FxaVZkPFVjVyVBCisya2RuWCp7dytfbG1MVFA4eWBESEszRm9LN3p3MkZlSTR1T1Bme1MoeXdEVURaYH1eZGdDd25hdWBkPCZQek9qSzUkK1RsXylgekghSkV2Cit3S2QoMEpWJlFIZHNEMT5DVmB8cntXdGsyOG9NU1dNb1QydzMtdVNuPU57OUIyN2Y4RUI/XzVyPmtETX5pcCllbFh0elYyQVk7WDY9e2RoCisrYEwqYUExK04hQiZGdW1BTztmN0FWY29EOTc9ZnNwR3ZUQ3VUO0FpfTNOPG5LU3FOeH0xJHVWVD9jZTJMXkpGNDR2JmUpR2xtfHUyIypUCitlPW09MjBlRF9sSV4jQVMjMDd3QzRAJSghSzhTT198Xy1fRFhMVT9ESkxsWjslJipwKTd+OEVLMU42TXhoK2Q7VCglJUlFZlBrTHNCUzRhCitANG93ZilOSmc/cUNaKjArdEEzYkhvV25WZjd1QyFuKFYzbWc1SEszKmZGNGB4YyRXdnNeMW4mck0/RHhxbVl+bS19SWAmPF9BMzApPiZTCitvUForVilaQlNHcWFnVkVGX0R+UEZwSGVkVENUOW9HelZgMzs2I0E7VVpoPTlhNmNTODV4eyMle0kzaiQoSiokRktmKTZAaWV2XzI9LWxpCitPI14hSyVQazkxVSVoQklQJHolZihlVipePSV5TTxSVn0jUWMzIWYkeT04clUzNnR8enMxJmg8NCVMVWFGcFMtTDA5T2grPjFQZn5xKyRaCiszI2QyeyNCKk1qJm5WdTshc2dhTkNSZXZBKSU7b3t5WUo/T3hrb3JAMng9Yl5JOCQ9SVhBYGMyPDt2OylNMlhCR3dad1VJPCYhMl5gNGooCitxYjdlbTtQZTY0SGErMEFDZkpAUmRBZ0pxLXJ7OHoqQHByb15LIT5eWE9zSCVqaGdQQkh+YzB7X1lJa2lRej1LTiVrS1NMNkY5ISRVcmY/Cis+RE9jMCRyZkZSbEtKV2czWEx9cFckMStaJkBiWFVkNz9BKjtyem0/RDIzUVB3OUB6QHwoVHg+OE12fXJUfUtRdGclTjMlLWApMGgmeUIqCis7KT1yNmk0LTNEXnZFfjwpfi02MFRpMHJ4bFpOcms4filZQDY5N00qZWU5KTgoKiRfMWMwMiZEZGZhQyRNMCRkbU5Ucz1odU9mRXFRME00Cit6UUpwKFc4JXMxQVE4ZUdgVDQwWWA3R0tHZXZNQmJ+K1U7Wl9xVWJaNFR7SUg4JUJyIWBFaiFPMVRIQjFvdjNzbkk9QElVbllfbE1tI2olCitfJjM3NCFyYGd5TE9tbTl+a3ZaITQ8eytXY34mVztkJHpjeCpBOUojdGs8KGhFSEJrQUpaZSVJYyQoPXFqRURhTmtrXzUkOUdqSW9hVzx5CitzemtKMX53KkwpQ05CRTBOdmZIYV89K3ZyTyZrejNNTG5fJUl4eCtMaXVaZGpHVVUwUGl6XzdiSVNtLXp4JTw3aV81ZldsNytCTVc3TXhuCitpSHg3cUBgYUJzLSphUmhuJjAtcXZJZXBxfk5WMjVWb1dxKS0+TlhWeTVXKzJTITt2KyVweDxOTVUrWXZxIVIqSHE7TWFQNjZubzs3JFBPCitlIU8qOGN3eVBlLV9xaWQ3dXttbitnZ1U4OzVvQkRQTHg7K2FnKC1ZZz5OVypXbjNeKUtSWWRkQUpCOFdyZiRoe2VJJiFfQEtrZiZNam1tCitoa3h2UGlRZyhAVUhHWng5Xk0yRWFJMHd3PChUbGVmPmdSNUxGYylwXjlEPT1oPnZEYCUxVklqcFdfPFJASDYoQG4jSXtvKkk+ZUlEJnpHCislVWB1bUk7QTdAcFVKTT96aDxfWXlNIWl6KVFuNyFJY2dKfDItTEVQUyliUTIrKCY2KUx+UFJXRzVUJUthQVlLN1RwP2ImaF5RbVJLd1UrCis/M0NzX2dFIWV4VkFGSUJOS3Y3RWRpc019KVE4azRRPF56I207aU8zIW1xYyk0SDJAPGNsMCNCTWJFVnNOYXJqWitGV3h1ITRaS0JgVWp2Cis8Rk1BV3N6M1FpR2dKeStYVyojSkV6bCRyI01ffXdyQ29DajRlcnp8MHltMHJGMzZ1eyphPEg5c2Z7biZBdDhxcGFxXm9Bbik3WE05aENNCis9M210UnslNmtrWDZPSFckbHYkbWZNUHN6YH4jPXs2fiVMYntBfShwMkEwPnNAXyEyY0tHKTx5NCVONCFmREVqJmhmUmZQbjhtX29kayQ8CitXbHBtc0RmajtjPSVmT0VlSWBodXd6SChYaXVrMHRTcGt5eFNnQUxeSHhyJT5RVmg4d3dDWlQ4JGZCfSNkTW5sPE5FY0BUd3l+JmNKWHF6Cis+LT1QR2o5WkwlJmc0ezZwNU1sbmtRI0dvQkIyb09rTzVXMUdPdTNQQlpfd043eGApWGQ/Sjw9bzY8QlFDJXNAbUUqRXo/dGgxQTBYdSZOCitIMG45TUpDflIqX3pPbUJTNj1sfE41YDt0UnE2Yi0tbjNkVWNAI3JnUn5BKkl4bm5zdUAwJXpoYnl3ZXJXUm1kN0pfPUlRaiNpZl59M35PCitoIWV0aXUyQVFtZStISHhzJVE+TmxhcjVoOWdlOyRHR31qJFY+Vm0wdDJ7ZWItYEZHQT8qQjE8TUI3fmIkRUczJjNpfTBBbkBXJWVCSm9BCitAcU9EQWU0JDQwaHYtaTA+P0VzJm1Sd185JUtKKj54TTdmKHBIP3s0Zmd2N0dlPjkkMjMjRF53Q3NwU0tkcH5MeTVLdzBTbGZqaUpBeHArCitIdHxsTD1yWEJtXjZZb1FgLUd0cyQrdyhXb185WT1rSGw0b3tvNUlfU3o3TGw+QD1oaCZqV2VFfnVPJH5QVW9OKUd7Y0IyNT1VeWQhb2BuCit1PjVDbF4ocU44clcwPCZmN1c5ZjIyQE16YEpCJWNAPytzWC1UWSpPdEp2ZWM1UiZDRUBzV1R9KVhhZD9zd0ckbjxrcU1NdEVUKER3fWUzCitad35vMFZjUnJsOEp9eCprdzNzUVNrKHM/bD1XVVVIcnh3blBCQ2NzbEMpLVkrNVhyWns/MT8oWWF+QTN8Milqd1J9QVpvT3dNc2o8alF1Cis7Ync4WH0yVkBOKSRYIVMlbEV4QHM5SCsmcylDUE1nV0U1NktCY1YleTI+Mi0xPX48Tm87NGRYSzV0b2RDI1FyZ2JmTFdoUm40SU1xUU44Citxflp6Km50UjRzT3M5NE8xIWEqOWxfO04oJVIlJlVKVFpLSE9TeFU4WXtYPUxeTEhkRHJ8ZDZ6eWFYezN7NT18KXgoR2M/JXxnVjxpWCpkCitfVXVkIUkoS2hVemk/UVUtQTExZVhhOVorNWpSZ24leElncjlLPGxOfCs0PWVsXlV1QzcmfG1xJntJbDsxXndrJDt4dkFLJUw7IXp8ems7CitnTWwmJjIqbkhDPm0hUXR+aEE9d3ZLU2FIU1MwVysxJjtuPCF4TENUNkEoR2hDazh3VlAkSmFkTmpkJi1jUHoocWJFK2ZJPHRea0pRbFpCCishZD5GMF94PUtJbiYmPD9vUlpfRWxCKS04fFFOMSpeTURSSDlCeTlVI1lPVSY8enJPWU40RnVyeEBJRGtwKl9lS30ob0FDZ1VEMmV+OTI+CitsO2VFaVpxT3JHcHQzNXZjRFpKeWxgbGJrbGY1M2d+I1RUV3J+dS1oSX01fWpZOFVtdFB0Y1otMH1AN3l3MXRNPiN3XzBoR0BKMUpHP3lgCisrdyVPeDhffExpQHhGRFJIKDlgM01TbjA+WHIoekBzNzFZbSR3eXJ8SSh0Z0liRFlyS3lwLT1mSHxTZFBnX3IhKFE0RTN+R1JSNTteRSNMCitEQmRUcypvJVpJbThEKVBQamM1OT04KDtPfEp1QX5YYE9RaD07QFp9MlVaIyZmNWM3fVV8MUEqeXVSUUgxWTVFX0pgODU8e3RMN2NQTzJACit+bUdCMyVqOHVJQiVwQUdAeTBwWXkwV3FeTCY9P0R8Um9KUWlgUTV1Tm9FX2ooezBCP1peSnE4ZVEwYlhFQWYmcFQ4aWg9eGhMQzEqcnhqCityd1R5YnhkajkkM0wqVjgoMzgqQ2BUZzJ9I2hEMl5rPTxMI0xxa3ZFPHQreldRJmk/eStHQUZuTEx7Vnw0dlE2bGo2fjNFPkQoeWQhYys7Cisock9uMDt0fU8+OTMlO3tvPV98RlJBYzFyUENQNSgxUXszdi1oa04kKktkaTckV3BKcDMlQ0Y9V29+c15oIVVsdCVKVGg9LXFXaDV0UDUwCis1PkpxTVFIVWljZWt+QTt6Tk4mIzMrMjxjJWh5WilTVUwyc0Y4JCplPTxoRTUkQzxKM3trNldJOE4tYW5Xa2RTQWhFdSM9O0dfenAzNnI5Cis4VlctNX5IWE55ZzdHQEFfPjxoR2FmfmY0Qj5oUCNLZmZRKyNZVz5adFIkJkx4dnx5VnVSSVpKSmF6fjh1YGUtSGdZQGA9N2kxKXlfYUktCit3eDtefG5RaGFTcnwkQHk4YCZaPWRkJFReWn1qNk5ke0goa2loV1I+XnJKJC1ha2w0aUh1bVJyVWwlSjJrM0tHTz9UcHI4dzYofnFibUApCiszPnE3eUxMMjxIJDhgbFhqMnVQUWJSWUU3QXJ9V2E5PEZWb0ZXODx8UWFkNyh5QztZTn0kc3ZpQyFFbjl6fXo4LTVUMWhVe0xCOFNVdlh6Cis5VE9jWXF5P2xOO3Z6OVlDYGtSUzU8Q1BfLWZyKjI9UT5vdzlPUEZgc3xReUpxQystQDxMSzYzJitQTXhwVT9QTkJWOW94Mm84KHlaaFZCCittQEZCSiU+VUBHd2VfallkaThLdGo4XjFedU5aaj55bGB0Mjs+Qn1Teztycy0/NmRgQDxAfGtyPSp0NjA+Q3hAbERIUSUzNnNpdDtgTm0zCis7T241PDNiLThLVyRDPjkmT00yVHo0ZkJaNTFQSStmMDZgKntAbFJ9e2hvYj9yZ2c9ZkVwdVpaPXt0VFg+cE4pO1B0ZHxfe0dKKWVOYmk+CitediVubU92eGtZUmNoWXBmPHR6VzVIS1ZwemhEZTIyZCgmZm81NnkobVE7MGlmaDxLNTlNJGBMMW1mJGdxYCZIVGJfc2dkZFd3N0tmVztxCisrdXRXajdgU0RNMENjRDQqTENFYUI4eUpQR2lZcEtneGpaYVkqPl53TWAmX0wxKWpxfV5DNCZnaUpWV2IwP18xYmdLKDY9cSRucTM0V3tVCiszakJVX19AZDJ3M14yfUtPWHkqSn4mak82UTF2UDFkfi1za3M1cytRQW02U1YjI3BVPGdCKmJlO3dyN1lRWFlgOH4jKVUmRnk5ME0yKH1ACispIWdrO0RgQ2c9Plp6IXNudD5ockU7Mzwxbnk+UVVUK1B1VGtYUkR+JFU3Y1g8ISZGWXJraVNnVEtEfT9pP1J8c2E/LTlUNyghXll0dzNaCitDb1RvRjFJUXxWd3VtJHZiekhSPFZBXlkxZGRZfUI7SHx4cHRIPSllU3s8eykqYGtQKG0qOUQwRlkjUV81XkNxOTZgPTduUmNaS3Q+VT5yCitxUDd4WmkkNDNCfFU/VUk1bjBKeHchdkFvNnNOS3o1dDB4V3dYVWxUe002aV9tPUh9UU43cXxpJShvbmg7SUhWSD0wNkI9bWo2QTRpSE1PCitQKlNQSiFHT3t1eXlKcmhzSkxnNElCMjQrVUVLRnR6SVpsUiMxakxzcVAyKjFWaHNlMXIlRTwjPmgkaztDJD8zeCkkMiZwPXZfQVljVDNpCisyXlZaUk1jVlNfY1ooIWpMUzJhdCVgUGshMSROdD8/MjZxdEJ4UmdPR2JWQ2ZOXnVod1d9cFdENGFYOFJWfSE4SH44dVVfc2FLREBSQ0oqCitHJkx1bnAhWFRgUFdjSXBiVDsqSGV1Pj8/ZDxKT0I9YnVtaGA1NVR1N3s1QnJWMWBxez1FWm8yXyNkYD9GKkNrP3VEfG9LcHN6bUgtfXpZCiszU0QpKV57UXVmJjl7UiMtby01NlZJX3twa09mSXc5OX10NU89RDUrbCRxQU96U218cjFGfWdDZUhhfU5UWFV1eloleUZWVE9pX2JBNDw8Cis2Vl8kaDdeVzVIK1I0JHFyJEpLVXpEVFZNT2ZhaER4JFhgPVhFZFlWfWl5SnlmSSpyYUN9eW8xanxYS0dUQj10NypDTk59LTlVRm8pUnlCCisjUlVJZmAtV3k8Q01FRShaQGdWSlpMV0hKak0ta1htbFotVXtPUTskcmpWbkdsYkFwfCszRXlxO3E9PjB5Y1lIJm8+MUNBJj5ocXdWRD5eCiska3wrPExpflFgb012LVRTO2BjTDlpe1hyaVgxcHUpRjxeeSZWRj9AQ3J9c2dyWHV9eTQhUlFeYDVYPHJFTWhpYUpQRSZhMjlkakVGdCtkCitpc094USt8cXJWaiN1bjw4P19PT25DTHZkdUYwQEhjcCl1RjtxNldvTzZfenlNa2N8QHRuZWhQQmVGNktoI2ZhKWEjSzdVcE5sbGxpP09nCit2VUstNkE+MTI/TVd8STNgb05tcW9HYmZGfWJxYXpLSnBTNklpYkdLTjV0KlAzeTEoNmFRfFJoZXRvcnhtPDJTbD0zbl5YM2VMcl9pWi0/Cis5UlE2OXZDSEo9eEN5RXwtWT01Uk5vUEh4U3IqKzlGaD10XjRpOUlMZS1QMzJGPStZdVElTGFFQl9hUDdOfEVYYlF7aT1rJDIhcUBZYC1FCitOTmtXXmNoZ0hja3pYTEZkOyErMV9xM1pRNlE8RGRsU2M/MyMtM0pBVFZXP1EtNWNGVDRLayM7NDF5X0M8QXpDczdsb3tZenx3SVcwRkZnCitwJWc0b3I5Xn5kTzgtPWV0KDBSMlQ5K2JRRyY3flVuQXVaN1JCKXZrSX1genA5ejBASTJiaDszMWB+JnF6S1JsQEF0SE5AOFhtMnJpOX5zCithO3AyQGlYZzxsRH4+PnRpMGpuelJ2bzNHbWU1OHZqMX5eWCF8QG5XdiQ2WTc1M358UGRRN147LWRldWdzZWVkUFVCS2kldFk2bXYzMHtyCitiLXpOQjk9Y3s9TVktSF52dGRzbHZrWlUxKEVsVCVDM0ZFKFR1JWRBT0BtPUkrZEZfSXRuaFU8Y2xKUXlXMlFpbj0len4xZl44blNBQDIlCishUCZDR3ZaSFQzRDdLbTNoYGN4Tj8rYVFhPmBzSTMyM0koWWMtIzRGaUpeWVR5eWlpdk1oT1d+V3ZMPVErUWZSVTxTeCQxbzNJaGcmdDhmCitENjNWXld7TiQwUDBkTnEoI0BCQSN0T0p4RHU2ZThPaVFwSHxTWlpkP3NOeVR9OWRXfXJ9Qjdme2dEa0Z+ZVJiTXg3Z0pfczcxZC1HUFo8CitVOForQ0NpQzlCbEhrSm9tc2NYYkdzNWFwcF8mbXk8SEhubDMjX2tpb31pNHVEJD96SHowMzdBTUF+OTxjJjg/c151aWRBJTZRUHBuZGN2CitPbmBrSE9pYnQ5OH5HZ2lsNkB9WktkX3lTX3ZMUV5fPypwJjJyZkZlaXlJZkwrPF9lYVNFYnNZQ2B+Uj15NDF7UGh9aXsoZEdMPmdPRUNRCitLM1BsbEw1Kkk0IyU5Q1VoO3lrNH1NTFNxeHYzMTEzamkkd1khYHs8cEdzYm5wUnkxQGUjc1lJZlMlVXtFRyE1Yz5MMzh6eSZISjtNb1dnCistbUcwSl9fX1heS1ZLaSlNeWYyZFBXM3A1TyRjMT9CaUFuQjU4ZXgwR2dCTyUkYFokXiRwPSNHTUtifFkrYjwlRlluVGZtTWBhcmJudVJyCitGbW4mOW10NUZ9dippZ1poSGYkLSQqZmQ0RldhO1AwIzxldTw9YkZYX2lxdUNpZFc8VTF7TzM5aGhuSGs8U3syfkBIVjxANWJAYl9KdzBJCitSdl5jJl8oWld7RUBpZTtkeGZtKmIqKylkQilLckQmRHIzWVQ8WiE9Q0pIeC1veUo8bXw7dTUlakwxJFdVfGY/SXdZUFAjZ3ZybT4pMGglCisrfj47V2xjeHZHNih3V0YwJHd+e3tkNGMtP0ZKUXh2OTtVMSFKb3g4dG1QKUQ/I0V6JmJoNGdgMUB7RE9SP25IWUtPKUVkalh+Pk5YaW1YCitgPWt4aXpKYyRnT3VeMSgjOzVjZ3I/ME9icDx1Vk1MISpxa0BAeTRIUyFnejsheDd2KGNwUnJ8MFBPd3UzQzh6Q1ZVM1JzODwxIStYOz0qCitwWkRTQlBpQHhaP0RoQntkVDVBODhpWlBDc3oyJllEXzdwWFpkSVczSWskJjN9fWIzS1I0KTZ0cilqVzlgYGRVI354TD1aUE9BQk9tLXZPCitlaVRMaiR3aWdgQ04lSj9AanNRUUxaM083XnoocSlXV0BQJSFDKTtqSylXeEZyT29wYl5NZktkMUxpV1FiS1krWFpDcUFKVWQrJVhgLXxoCitwa2tmajw/M3gtQ201NiQycDc5YWVIcmIxcG10dyQ2WSg3X2lLfTBLZ19vTk48SHpmQU4wLUREPWVxKmByRlI+ekRTNnBGcDl3eE92QlhqCitnRjxuSFU+RjhMYUZgJVMwO09QKnFeWWtmaTQraVh6O1JIcDE2NCgwV2dFa3dUREskLTM7e1VLSyYkfT1manNgVCheck9yNmxJQ15xaXBwCitDVGtEVnY0dGkrSW5XJEMlNT9gQiM8b1lYbW9nJX5HLT1tKyZSI0JfaUhfRUtjPT92cjwjTTtfaCl8UDtSPHxeR3V1RCFeMEtyS3ZIKlVRCit4eWQzbzFsWjdBWXo/d3FTJikkJFlBZlVKe3coSiE/JnI1SiFjYXtJPjBrKGN8Jj4qSTBDJnRleV9OfD40e15RRmxweVp0ZUtLZTtiKUdXCithKXpETCRYQjdSc1EmQV88VFJLaU8maF5GRzlUPDhCNXNZTmpLOzRCK347M00me3Raa3dSUGtCdkppZWl7Tmh5d18rOTY7OCZhMFcmSHs5CitiTngwWVdqRyNMcUZ9cW1DOF4wYUxTdWBhdF9Sc2ZvRmwqKjJEZn52eyRjOXg3cHI5OGZ7ND5jNEEoZkREXmNIYUQ8aXpsT3t0eWJIb18hCit4Q2JaOGJuNDxhYkUxNjxRcW5gSDNYR3l7aGZLZmlQUSpPTDZ8PnYhcmsjOHV1S1I5IyhpSCFVWk9JMEVVaVQqbGp4YlRJdSs2UEYrYihqCiswQD8reEI/VmFGeTBnSEtjYz8yY2c7QXI/RzxEVX5UWlF9I3RWOFFOJj9vNkVOM24ja205JHxafDtAYUxsZHVAajFWJW4jSD9EZmtObVNACitHbXNwdmdvP1ojV1V0KCpIY2Vrbjw+NHZ5LVFJI3JLWDE5dXFidlU/Zz8qRT5BaEtPa3dfVXVRJD5BMkdgSVk4RUY7Z2UwWik0SSFOKDZ8Cis7VE9gOz9JI05GJjFHVFh+XmthWjJuczlkI0F5JiRrZVRFfXBnTlpTSG47MkNpPXptZmE8SzhIRCgyPVdpdFUmfmIrQmBBPFlkcmdsX2BaCitrTDZrblN7dXhERSEhViN3UyFpQEl5bGlqfjQ1YXV8TTZDbFV9Q2BTQCQ1NyhCPztfTz9jMF50IWJaMD49MEEqN0xnaWVNOyk8WmhfKF9CCit4d342SHZ1SXkkWVRGO0taZ3x6eGFFem1YYktvd3UoYiE5R141JE1UdkJWel8jQn5XbWEyPH1mQHAmRXlUaF5jQCNPeWg7NmYrKGhQUFlGCitIMnRNN1dsMyh0fHVgSkYwayVyOEgjSF88UCgyRD53ISNTbjskJWBtYHV4YGd6aFF0TX5vc3ZKJjJpbFllbURAOFd5Qnx7MVByOE8rd1RWCitOdHotUCg1TEE+fmBeQ3tQPTJTKl9YZCloRlFRPCN3N1piYUZPJSV7aER5YCtYKihDbG1mN0VFVzZ1ST5GU2oyNil3SDllaSQ7KTZGN2Y9CitjX2w0aUB4UU5wKzBaZXJzcVJVK3QtIy1DdGckKFApUHxleyVPUClfQXVmYE5NYHBzQ0ctLWJtSnlnZ2JhclRKZkl+QlgyRWtvU313WjQ3CitBPCZLJFh4RFR3Y0tEP2tUdyhKcSFmcDNaUmFTPSU7X1pQbDtQWW89O1dQI0I3P2Erb2tYNnMkRmBZY0F+ajZwUCVNdVpAOEFzJis8MnYkCitNSjhOKWhNYnxjYHs8aFVTRjV9PTdjSkV8cWlPTW5HRTs2P0RBbVlWRXNXb2ZzNSltb007cTlzKnRvOT9lTSF9V3BVKVh8ZHlWIU1eWmMxCit+RjZaZzhDMVRkPVBkUyZSU0Fya3VpMTR+QCNQWl4xWGpnQDdifm8ob2t0fVg3I1Vhc31QPW42bV41cmNgeG5rfD9TWmtPPWp+ZmU/UCYzCitfYlN2ZiMwTX5qfFNERVg7VUp2aSFPdDZ8ezY+QjtybSEhZVJYTkllfDVaUERGRntLOENPNmptc2c9Qkx8UFFKPjFXWGJASmVQWGQpY2JhCis8ZHxFKW9VdSN3YlhDZDkpZH52Q2s9fUlJLUB3QWtuazRtMjlUbF5uUXpJcClzVWdrdD8/WW9ZfjE8UGo3R3t5Z0dxQXpKdz1oamh3K0QhCispWHN3OHczKD5kU1RmSV9RZSlNNVQpdTNLVWBGZllXIW4lbTFsUElMTmtSUnJ6eEAlSj1fdHhSIT0tSElNR0lxc2BHTlVLdiFXPzhWXi1fCisyNFl9WG9PZiVUUTlzX2QxSUorU2VOJWZIUn15QlRTSDVTSzBVdS15cmtgTFV5PkcrMCN5dVl6bEZzR3NSWW1wTFpxRV9SISR6VSVSMHszCit+SnU2SCVZaSF6ZC1MY3U1a0t1c25vdnJ4I0Zqdm15aVF7ZmBlTDtgTWFjWFJIP2BOdmdUOGU+aitMMXFWcnxNfFgqMlpeZCYoQ3xmWERCCitnU3ZiKUZUZXh7RGU2Mk94YlYlPWpRZz4qdkAhalQjPWNEUWI7Qz0xTFg/Jnx1TyprJV9LYCsxWDFKUGM8fDlPRmxKel5AbUArMXx5SURJCismOUEzflVXYExHWns5TkJie1Zpa0JkMGlHaCtaYDdLSFJoPnYwckE0eCMzdiU5eGhgZEkhNXM8bEEtbFNEfWpoZWBUfVYoQD9GSlJpWj1wCitMWURwSz5WdjkzKXJLcnJYb3dzMUxRYW5WMHI9dXpFJmE/dXA8cFkkQ0Z0SCl7XlkmYn1hKn1TTHN6RmZUMk5vX1JZPSZCTEpOJFMhdX5RCitgQSRFTSowWWk7aGwhNFZSXzhAbCU1bnNWKGw3KHxVZTErYlYxTz43Szxfd1FyT2NPKmtPK1RBdX5xJCgyRnUzUjtrRCU+RVE8Z3xVSlNJCitHbkZJdXFSMDBBJjRFcjQ+ZSVZPmRMQSY7fmA5KzxWPWRNMnAxWCEtfGdwPj1MZSs7SldQUjZLKzJvZiMkNkQ/dGxBfUZ4UWI5P353eFZgCis1WEhSQUpsO248SmFfV2VtaG1VTWd4dFVSa1kxMmI+P3lTKD1EN1cld05oe3YpenAyM2pIdlRaRy0hdTN1T01IRGhGIU9Jal9iVDVkRiE1Cis9PnRLfj5mWXtOK1VLNjMpJCRDcnhwfkcrOzAlTFd2QEphfSR9TXgxekFQTH1tKFhUJEV7dig1NSRjNnl5N0NtO2U3PmdUS3l+N09xUT5KCis0VypZLXEqeyV3cUplQzVkKnxgSVFRSk42S3V+Mz00NVJ7Nm9sSSE9JFAzYSVic3ZBaClqNkhKPyh1I3EoWjBQbDc8PU9PbXp9PUJXb3VDCitiUlVVRjJlK2QlVkB9TVI5OWR6YG9wWEgxP29xVTJxI1pQWVdsOEB+b0soNUNpfERvNHUrZzRCKV9CVnVJUDMpI1BqKnRQZjxkO2c/c31HCis8VFgrfVZQQ1F9flE+VGJAYntoNzFXfF9VSyN+TD0mSHohWFljZHBKYm5KQU0oSTc4ZiNDeVAqRVdUek5yPFZGP3VgRSpfYWBGeCUtZ35zCitxJW03WHMoKWhRQWBWMDxPKVhxRiVgVkZ7RClKLVVsXnMwPHQwT3I1ZDYqbC1zYHE4QHIxKnd+KmBAZSpNfjxnbUtpP0FwSEpqQCN0JCtVCitmX2dPUGxKQl91X3I1b2o4Smk8ViRPQmpiWkNlWSV8RWRSaCE8JXF+NFRqZVF1Nz5Hbm9BIXB7UzdfWj1gJEh7JXAmfTFEMyVPNTN4WEdsCitZZ150NldMPkJARVdAc3lUMEg0KDZAV042JVJsbCF2SHpjPHB7KHdtaERfPHU9dTxHK2UqcV9KPmE7QEFNKXhEJntzRjZBd1QhPjRTaTUpCismPjVtOFheMTQjYyZOdWVsQFZ2ZjxoNTwjRTk0I28xZC1FTiNjSlFCViVIc0JHQWZsQWQoPmZMZ0V9WHJPZnhaamp0K2ZfdyE0PUZtLTxECitHY2dVdk93OChVVzF7ZlojamdJZStrJE1HX3VLQUshPW85YGRIUWpqMCkzUVBfJVc5TW1NfU9MZjB3ckNJMTRDXmNiaW1GUyorNH1yJmRSCitoOz0wbFFBciFNYyNUSzVSO0pUT2VXcHAyNTk/e3w7OV9GVllEMVdHUHAhYkpuKjN9MipULW8zSUtJJX5VKWJEVylxb3FlV0ZgcDBXfm9wCitIWFFme1d9VVQqKGdRSXBMeHNhWCU4WW8kMGVFY3NMIyRaPzw3cTFKXi1FWit+NUdLN0JHZ2R3IUJaaWA+WWtWO292Rjx9aVBvciViU09qCitaSn05Rml5aCN2NXl9T1c4QX03Pn4zd1U2M31oZlU1I3pUKnVAcV9KQCMpamdzMVpIaH0tNF5RaCE1MGNsS2xCe2A5fHAqXnp4OFp1K3RCCitgPTMxNXhBeUx6JmhzNzZxYlA+YzZobHhMT3Y1ekImQF9kU0IjeSFgaWM9YFhGZj5Xdz12VSFETWd2SnJEaDVSZ25nKSRnRmlBd05MT20oCit5fDFPfFB0WmUzcHt5cUN6RHhBbmJHZDdGQ3VvTiZwI2xkKHc0WVZzay08Wk56P1ZsN05iY2d+emJIKUd+NzhVK1p7TEo0M01MPDtya2lKCittUnR8ajQ+KHclfUQzWHVKUUs/XnhWMEU7QE0pe2dRalh9JkJxaW9wIW01KW5pTUBNPkEhbTc+OFEpZTxaJEA0ZHQhM0EzRSVtbyptQClFCitEUylaUXJCTTR3QkR+U01NWmVFPEo1QzAmVUdOWWM1PiVXNms5ZjNVNEFoPz4kckhnZTVAa1Z6dSU1Z1JTeSM8bzZhU15tVUspK3d7ezlvCit+YjRWPH4yY0E8NlM7R2htTnFBOH1IV2FybkJUZSEwK3E9ZHtWajluKkR2LXtJU2owOWxza2xodUZxIUtkREA1OyM0PlpURUFqKzljS0RRCiteV3ZYSVk8PFkre2FDYkZQfjJISXB2eTw3PEpiMz1yPVBDREFKKkxWQCo3M3Jle09sMnVleX17cyFOJVJFVVkpdmplVlZtN2hQPCkoS1UhCitZRD5iSilpNCtFRVBfRE5nckQxcnFLVyVTZUJ0YHdmQEdPQDttXmIzQVIoeU41cFg0UVN2eEsoJFFqPVpEenVpND0rdjtqazdMWVZuQHNwCis+VCtVfjl8bGtLOSpFU1ctNCpwYkx5blNoTDQjKkFWajheVVc8YHBvUyMtbkN8eyRHNUNXbnAzPW1vVStiKEVpYD85ITZRbykqZSFLTW5jCis9ZDFFPzRyKnJtUklINTFDJT5lcnxrVDI/fGFMR1FGaVlLfXlETWhlP3E1OG0yQ31fQ18ob2V2fDYxYEZzQHstO3VDcWJDVDVyO2tzWi10CitfTWA5Xz1yckBVTnxTUD1BXyZfcWUmRkVQP2QhS1NZRDhacWkpX0RFcTRkKyRJTlowP0MyZ0VHT0BSTz8raWIqPShOPmVsdSNZN0pMODAxCit1aGJ3JWE+eHlrOTg2KklhJH44JEAyNGpYbXlHbi05QEh5YC1JMDVXZENoR285O2ROKjJ9IW9+eDI2LTR4SioyU2pvayhBJCZ7Y2BqbSgmCisoPXM3aTtwKDQjYUY2KXdLUU4hNzNlYUV5NVVtUDVxRVYpOW09SmNTcTl7JUthTWBQKzBuc0s1UUxLdD9SQDx2fDhSaSFuaiZZTntpaUFsCitrfklXTWRsb2xzJFJpOH45dGhqJEB1T196aDBBVHY4fDttRm9yN2FyMkZRKyk4THV1SkpRUH43Z2creSRINlZJeC10UUdfOEh6fmI/TjhSCis9KnEkb1VGOyk8KE1gMzRiWmBSO2U0K2dRQU5RcCt9N3tXZEZqTWB0P0Y8bFh6bWF5WGlqSlgySHtsTn1pPHw3JDtUR2VUUjU8V0stdGJaCitoUE1kTH1tSnJzXjNUSlYmOU9iIXRNOXA2YSU7ZGoxfDdWNUgxZ2JrRklVT2FsciZoMCpHWGl5enIwUVg9MXQwdVlXRSM1UHglX2hkeWxSCisrNChlTCYxUU1sYitLK3ZfdHRCV0doLVhAXzZISUBZdCVZSmo3dn5MYHVyPH5HKmFxJUZGUmUjMU0/R2FTV3I/ekx9UHEoYE95QFBUWFFtCitwYHxZNDlfNExaMVlHJXcjPFVHVF8tI2VEY1U7aDB5SzgpKW5II1ZJSytaMllVMl4tTGRtcHNlelU+V3VmcmNMZnFHZnIxaU4oSCRFO1l9Cit9KERjUkcoZCRRcXFGVSRFd0FkRE5EcDdfQF9XJk5XT05ueFhPaHxfVSNTUjhNLXF7P3xDRzspOUFwaHh5dDBeJDRmJTRxSXpwXmlIeWFPCitINW5EU0FIPVhpaCFya0t4NENJJFN6OVg1cTVpdnZ7a3psT2wlKCFvVnFuYjxGZTBBSUFKPyNfZkRgOWxLQF55U3NReE8wMjh3VEY5TEk+Citje0MoV31CXmZLYndPXjVjKzk1cyhuNCk5fk0rVXckWmM5aUc2PEFUUylKQzVBVkZLKEdFKSkxMk13LWUkPC1fOHsyWTIzJFZBeitwVz0hCittTSkoKFpPWlZuZ0JteyNBMkRDPVo2ZU5nKkhZSm9ufkJ+aytgU2khRTdiWEJReEVlXkFARW5VXl5tbEZIZmAzTmtyMHpfQlBHakZMPDtjCitiPH4mU0VpWXxPMCNGflU1TjZ+Z0M3RDRBakR6dDZlV2F2fWVHNVlxRV9rb0IldUtXSmxobG9tNWp8e3FOVFNfPXs7a25AXktmSWYlZDkwCit7TSFMe28wYVBPWUM+b15tdDtrfjNsLUhiUVYpaSVSKEdWZDRHVnxCbDI5I0Eyaml9NVBAVGhRMHNRbzkyN3lYezVHY1JCMklzXiFNdiR0CiskVjVSITAyJSt8Q0Q3dlhLaGFsR2xTZFooZVcheX4/fDhTfDBDYiV0QCpIPVY9X1VJVjE5Qjs8KXBIemlHcGE5Oz9IP15nP2J7aEhVUjExCit2TjF8R2F5QSsrTERtTC1JMW53ITlzbD9fVnNBVmVgbXhWTH45XllgO0E/Oy1QN2JaTWZldHg/Zj59Z3J2ZGs1KiVtTGB6TD11X1BvTH1+CitJUSVDa2BZdVlPNUNXJFZpb3RMTWckYklYTmZhUnxpb3FFS2hiYVV7MzdHen1XPCpufkxpI0cpaD16Y0FrMjkrU0UmP2NnNmF3aH0qY3ltCisyKnpYa2p3WXgzPk1neVhDS21ibGF7VjFWOC0xYXMjNUpuKUZUY1hTKlIwTl5oOG5pXyNCQHhHZENNdVolUDlvVGtTaz5GcHdJVzNXaDBBCis0YU9DKj92cGJ+XzkjRUYyeEFBJGxFd3BOajcySkRqfDs0TWk4KmF0N1dWRns9b1ZOMSojfDArbG5gYy19SlRnflZ3PzZhSih2Y01ZMjFLCit8bnVacCUqbHVsYSlZazNrfEomJHxacWpyTVA+UVBwV0JSSj1gdFRoJTBlR2w9Q2QyKl9sdDNkWV9XPmpESVRoSkJvcntLRldvN2VnPVUpCis8Qlp5STNUYlZIKlRlZndGbS01MnQ8bFlwIW1URGUxWmBya29KQm57ays4UXdfVWpVXlF4aExXIWF4czRnRCsyeyNaM0EpPEEhOHkxZj8pCitlQH0+ZSo0S0EzTyhwcnA3d3M7alZvMj81PHUqRWQjJTJqa0RzdGdhdmRhVjJ0c1MqRT0teUxQWV8wNilqTCZDNSFmdUMzbj43TmY5YmVkCitxKzg3KzVNb2BlP0BrJWpnWnJnI21aRHg1c0hGOT5IMXorQjFQYyp9V3YjSG5+dkwhcSZNQEJJLVRQR3F5WTxxZUxgMzlQLVFNZD8pR3NACitHIXcjKkw/RzhLQD1mKmw0fG5DSE9UKT1nWXU9TntTYU5fJkZ1K29fKz9qPnV0IUpldSh0aHVrMn0ranZfPyRHYyt0KTNYdUdoY1l4V0VVCiswMDdaPUpsNWBATk1Xam5tQy04aitvT2IpfWJ0KypfQVhadWt+clB2TVIhM3U0eWdrZFJ7a0RkVndsPWkleWhfOHReRSpCa1dLWkYlZSY9CitHKXFlaiQzbClreURaRjxtM1F+SDR2IVExVFVgbXN4REdvLVpaO0RpWklgclFsRmUlbWhpLXFOS3pYYVJvQzsyKnE/Jm8rUmVMIU1sblRyCit6MEcpbmstZVMzZGlmWG9MWjVkMnNrPn5PbFFnIWBkd09ycUBkRFZqelF5N3UzWEgpNTB7K0BpWXtuVCR1Qm0oOVhEPFVrWD9rVldDPk0qCis+R2F5V1okPkNiXilFRWheVFdmN1A/fEUoUlZxYVlJensjTCZzXzEkajslWWhOcWwzT1E8JTs9UnkyUUl3bHM5IXY7YVFIKygkJFg0Z3JwCitRejh5KmVpbXomST8/PSUlUmttKF49ZEVCQTRKN256OWkqN0h0cDVodEpYI0UtQyhRZWFORXMyWUx6Mz0mY2RvJCE3RGR+dGZvfmgoOVdgCitgI3ZxWXVOKFY9c0ZwXnYmKTJiUUVvPztSUiVsI2p6VXFITUpvMytfaHF8VlRveWFvJHNfR1NrXiNlYlFWMD42eHlfS3E8WUJYTFY4JG0rCismJHImKFg8eCN5b09qZ1pMZFAoP2w1aE5sfitrTUN0YlU0QD1ucjhlV0xTITF3aHxyVUg8ZG5gTENTbFByJio4TnhtMUVWZWticzhHQGwxCiswKT1ySHFpfXttWGJmZFlZPUtVa3olaVdzM04kR080MyZpcDd6dGtoazRpdzFnZHFYISNjU1VwTU9QazY0M0clQG4jfUBtQFFwQTNSXlY5Cit3anEjUHtQNjdHfW5TZHQ5K2tfcE9mbz17SDFKKClsR21STzFiJUc1Uz59Q01kV19mcERaNCFacmNWYm4wcmRNfHJkaWB5KkdXTTZIRjNWCittM0o0KFFBJHZSdzVXbmRvKzJjRVhlSWIjWXlGcDJ5VUgxOHtEZXcmTHNeMV8oQTltaVl1VTZGV3EpalB8d3tkSHhmYDBvTnVjOU9yTFB4CisyWGt6Rzx5fGxxakklTV55eihsUk5BP0lJZE5kKjgtTmBaOExWX19hYzZePnArSGUwdW10YVJoOCVHY0xSZ00mei1+aS0hdXYzd1p2VjRlCitjbDxVN1lKMDFmWChKTl5MS2N5OG0qLWxNTkEkTXMpQUM/MmF8e1VUVFVQTldoX0tyUGo4eXp2YEJoZVFqWV9Wck49cWNZTzJ1cGJeWUtWCistV0NrQHl1VWdaOXlASWw7a20wPW0leiU0dHRaOEZXPzRtNFVrXk9Xc2NyVWhgbG1KTS11ViRyND1sSiFFa2ktcWZeQFQjI0I5d18mXntjCit+ZD9MOFUtUCQjcmphLUpgQ35EQm0xa1NKeVpgPyktY2Z8NzhRU31qflNkZlQ5SUwyPzJDbEF7N1hwdy1ZNmMtcWA4cmhrPykhcXBpRk93CitVaXd5JXY/RFM8TWNlQ2tMUmBsaCY1b3NsX1VHI096WU5sb1ZWRTQ4bHVSMXl1Z20kPShMZTJra3tXU3FgaUNWTyp9OHUjcj9qZHpFS18wCit4Pz9JSFBZM1dXVTlzSm5eV0Rue1J0LVk7QyhOVzN6cDdDV2J3VlhtOzNjJnlrbmp6OTREdVohVlJ3QUpxQDE1N2R+Sko3RXVmbUdsZUtYCitCcD5qbDx4MCpUVW14VW5yPnU0akB+ITRifGBueFFDS28kMjZqKjE2OD4tYntgPH5mP2ZkaG9HLUhUTzV8RUc7WlBPIy1SYj1lUCFPOEJxCitnUVJ8P0VWKnk2Nig0dEswc01ZUWUwZSlNb1F6IWJWVFo9KSl3d3FPMCpzTT1pOGExPm9vMXl1P35UZUElRypUOFc0R19OPSlvbn1CIV4mCitmenJESC1sfUB9cGp2VX1pYjA4MDc3V0tPKjMhMkQtSiVZUHIlN1NHYldfTyFxRlhpc1Y5SUleTFVRPCpGSSRZfmhSZmZTNUArbWhWOClACitAUTFZREhmX3hiK2lrcT9VbDZyZ0t9cEgzVT9VWkUkTkNRb2RIPkJCe0k7cmFtdXdpcUJzeUhBRGJ2MlZHMXc7NHZzYXluR0dhKVZQbUBKCitAUF5CVTI1MlQpUXVVLU9jc3xQaEs0Y0N2K2JqRCtuMGxROVIxPDZlRW9ZUHUjTUB5PHRXQjkrJTNxJVY4Z2Z3U3k2TCRrfXRGPGdaZFZLCitqV0tSPUVZbEw3aGREXkhfYG5zenw4O1RJc1hLb0tSd0BQQipoMjwhKGtZdk5GMEhlTTNnfW8zZEpjNXJaNjAlWGtfXm57aVJyMl40M0YwCishNWtWOTE5TU9TZjdxKEh3em1GYjB3QyZ3azRza2lGJWJVZTc2czU+VFAwKEZicFotRW5oVFBKM0RBcEtQPkArPVYzTzY5MDExS1JTRy0hCitOcXJ9Zj5xNC1NU0IhMTc8eHBZOGFOQ0R7cWpMQV58R25hSUVJWkx7VnolM1h9dWxAPDMyTGdqY0dsOVZsQS1TczhQXiZtXzNmX0p9YUFYCisxR1VyT2w7dERFV1ZvMTV2OHkqKj5LWTR4S3pFUlhFI2U2TkIhYDY/YjN4V3w3TmtVbDJ1XyNzJVBldWckPmRFRnxhXm9sV2UxflQ3M3N6CitxfGtQY1pleURNZVFoZWF8QEd3UDJuPFk/fnJNKVMofmVla0YlPktJVlB9QGlRallMK30jTTF7WiZ7RVJPRk1JcU9idSF5I2BYWlFuLU0qCityIW9gY01aVm5aYHRVWkdBM2xYITVfVmdSVCQ9SGdqRGcza2F9JDJiWVlDaEFwQW9FWjVXIyhZYDhhV1FBUHlmYzg9bE5qP1BjKmFkMnpGCit5MCVNVl9tRyZidE43PHJQdjtCNjJjMUBQb155OUYpJHlRJSp+NUZ5KHExQjU9VlBMRXUzXylAKU40c01wT3NIc2ByRlg+XnU4KCUjVVpHCis3bn5tVz0me3R7V1EmalYrWGgyV0M7TXtEfnl8IXwqdEs2Q3FXNSMqS2pGJVFhTmordipnWlpIMiR+eGIhX1pgZWlRWS1kVT55VWAzSDQ5Citgd049NEtga2E5PHRaJkcod3Y3KipvPH0/c0I5R35YcnJaTTE8RTVhKDI1NjkoI0lLQyE1Vldnd29xKSpSIzVyY3tzPVcrWCEpJF98XmJDCitpZ0VQP2xeVihKSCM2OWVSUyhrNTs9MDwoK1JGZW5paG45WE1RVHBWOSg+IXhRXytBQFQ5IzF7QnYlUEtuI308R3MzV1VZNitWM29FVFpPCitSN08lWU8za3RXPG8xcnFjYnZfKm53S0szT2d7REdkfkxOeC1XP2A5UnFfNFM/SGhje0JeTj5TcXZOUl4zY2MzRz17RlBTdmx1ezs/OG9VCitvSEFUJSglYm1WPWNIbmZGMV4hZT8weXpLWipPTHxiU3J3dXdYWTUxR35pV1EyKWFWUHB3eXJ1OTVJUEZpRThEMTxqfnJhbzZAUzd3cmdHCit7OEpqZlBuITQwQV5GZ15AXkhSZSYwWV9aZkBXZUJQVHFMTmxuWjBvY2JIZlRRXkZBeGpSYDhsQkleMjtndm9YNH5lQ19tckVtaSRFP1ItCitoWW9gKl9uT3dzaVQrOChiSDNJKHJ7dXszSy1AV0d2YipuVzcjeTMxWj9NSmRIK0lqfTMmcFk3Yz44Mk9nPkNQcVlmX0s5dzdHVW1Ab3djCit9SDA2ZHlpc1p7WWIhMiUlQlFEbE9hb0EtZ0cyLUhQMnJVLWVEOFJrKmw4NDw7cTFIYFB3QXQmcUp+TVAqenc/ViEhUjhiczI+TlJIOXxHCitSbDYpb0UrfEQwfnskPTFPJC1RKXgoZGl7OW88KyZBPEQ3KHtGITE7UU1PcUAoK3h7Rz5qOT4wKnA5fTtze1JDNmJhKz5sM3IyLUwlP2g4CiteVXZqMjhaX3pZSCZ4Tkt2NW0hR0xMI0Y7SDVKQXs7V0pFdXE4TkBZRER4I0NRZzhEUkkyZVlZUD1LWE4yRmFqK1dWYS0pMyRpVlZBSz0tCisrQVJ6P21eKCQ9PGJsODhZRXVWb30/Nk1MJTFhbEhWYVV9I2pjIUM3fUpxUWxVI3Q4dntIYkg9fUpROUtZYUBrPjdDKHZVRiFMSkEhUkNBCitObldfLWN2PHk2P31ReXhkWjFqR3U9Tm5GM3BObSM3bkc0fVFscG83XmxvI1FWTCFySjJoV1FfXnAtVSZNViRaNHlVPU8yM1d0OzRefkxgCis7JEZ6NnxSej9MS2hzc2ptNz4mPypvaWFkWVMpTVNRS2tSYVc7LUhKTDlLR25eUS07QD9TaT5vKE41RVhqbShCREBSeHIlQ0pHPkdDfm1VCitgMH15ZG43KiswSUR+UTZiT2k8b01nMyZKWlQyOVFoeTdRJTt5b1JkKUQzdnpSay04KzFLaXtefHIle3M7bjc3RmckJkFTI0YhaTwybEIjCis9P0J7TTt3JElEQjZPVmR3bmM9YzEtWFVCR2FMNUtuOE9nKnEkKD1OSjxATTRfS3Z5YyEmU2ByUHx7TTFvaTJ0aTQhUllIPXRoU3szKlFGCis1ZFlwQnJpckp7fmhxSWZiQmhfb1BnPUNsWFI4eXU+VH4pPE5BSW1Ce2s9aSZ0Nk9QcmN6cTEhPCQ1SkMpQUJNPX02RytUTz1hUzU5RnNBCitQOVdHblZuKzZSKUNxTyk7TS05USF1PUU1V01neGBzY2wrN210RFkoN3RoPExFa3V7bkd8R1VlJWVEaUooeW17amZEU0lRe0hMemZzdGlPCittZD1ya2wtKXdqUGBMUTU5M3sxPz1yc0dJZnROVFgkMn1DbTUxPE5qRHVOOSo1SiVtZTFwSmVmcmskeSNVN3s9VVlNYUdiMnFpKnZDNz97Cit8aVBMTmM/Y2o9clFgUypWdEV6TWYrO0xIdSZXfXd1Vnl1JW1QeH04QUFMYXt8VXheek1BUD5PWSpAVkhgbmtzQVBid2UhIXdzdmB7YnAoCitqcGhDbiVZWU5vTXpPZjdqeHA5MlZvazt+UHpfLWFrKm9IamFBMDxkd1haNWEtQ2lYZiZVPlB6KiNwc0VuYzt8Ozg2NVBYOSF1RGpJOWtmCitoRGA7cldCJVZmfStvI3tydmIkNDtVUmtvJkIqOTk9YShjciNAMi1fVDkyfG1wczcpQjxeP0JVeWBlWnZeVWk7SkN1cGxXRzQteVJ2MTJOCitUN2JTc25nTl5fJGF6XmJWVypPfjgwQTc8KzloQzE9aEhDUkFEeTJmJlFeM2J4MWlxY0BBSVUzWmdBPSMze01AY15scytQfnV2PTZPJG5uCitvWkg0PWE0a2prbHYmbEhBZHBJTVZqRVRTUElZZHgyPmwyVVRpc1YqY2AoREJianA7I095NiY5cz40YD8pZStBM0xQRjkoSzw4c0xaJVJiCitoelo0O3NDTHQ/dmFHM1huR1Y+UT05VH53QCFhT1czLSliWGBHTH1YTDVqQTJFOzxiOSFRQmVfdTtZcHpXdWkhNlRgb0U9KHFndXlUZCslCis4LXQoPkxvRkV9TVBMfWlFSSUrfSRAZnJfV0pyUkJGPjE7OGglZiE/Zk88OXRmTmphVzdEUVBmamVyNEVBZ2dFPlB+bDdndTg8a3ZnMiUqCit7KnBgSUFKbyF5b2xVUGZiKigmK0w7R2pRQXRZdU9QMUdQK3lVZ2JIJVJwJkdROXI7PFM1bmVIREliY35FNUZNZXcrfjR2I1ZFfGhfTHFPCitxbE5ndFV7IXJOZkRGOUV3UFo8JUZsaUZWWn5BPWkjJTZvY3lSa3xASHxsRjxHVitpWllzN3d1Y0pYSzktJEheWWxjLUJkJHBjS1RTYjtnCitgdUNtO3dCd3l7M0olKk1NYEJCQ1U0eU1JeVdObDgmOT90TlF9RU9mPSg5PkJZSnEybT1Yfjwrel9waWkodUstdClDM0Mjem4tT3hiWGg9CitZRGxGU3pmUShmTnpOU0d+S3J1ITArXzBLVCpiPFdpPjxLVFQ1RFglM1dEU1YkazQyPkF8cSNOamlRUXVTfHFeTFhNeFBWcTlSbnt5TSViCitrRUcyPW98N1o1bjB7fE8lWDFiVV5XaH5nQCNmdHl4YDtCYkxLWXxOV2FYIUZCZVZ1flI8KiZ7RHlQUHxpfSlWOHpYKVlVe2I2ZXdnQEYzCitEKT5yY2RmN0p8QFBVM1l5Plg9dHN2TFVKRTM3WTI5JlM+eyMqMHZ8WmZVUn5mLWtgbCs2Wn1QSFBDQ2stbE1RekFfUUpmXmxweVcmQWRuCit4WVcrMilAKXB1bz8rMWZyOCV2UVp6YTk9TnxMQH04TmRYX2lzSGpfLU9WR3twcj5xQHJmcntDWGhGVUs+Sz56NDN4Q3E8Nj5ZPSMzUi1RCit1ZGluWHxxKHA4YU0hcFFIKCp4YnV3SShQSjsyaCRBRD1UZFJuVmhuLUl7VWZBR3BHVzJhZCM4SDZKcVJVPXhjZUo2TmhtdH5rd3V9I0VDCitfckkpSlR9a2opfGEpOVolI31AWSR2dzxBVCppMHU+alhrWU0zakAzSHErIWM/XkQjdjlfO3woNHVyJUNlZStnU0Yqby1hJkJHKCkkdmFyCitleElQe3ZNYzlFbno7QzhRRz5QJXU+RX1fSllTNEhPLSl8Z1QhSig4KilvLWw7RSlWZFJ6c2R9K3I2bDBhbCpBcCo1eDQ8S09DRGZhJSpvCit9V2M7R0QoMnY1dy13LTJ+SjNXZkEhVlFWVld+MnhJNHpaKGJ2RituTDZHemdvRjUtP09mfUttSlk8LWBFIXxuK3hVfHRhRihhPX4tNU5WCityeC01NndkX0dxZj9wNjNeMihVMUV9WjYqYEc5Qnx+VUdja1AtV013WXNYdE1PKWk1bzs8PzZjQzs+YXxEOGA/ZzhZKnVPK1ZzQ3A3LTVSCitmWURyMXFCYy1pNEYjMVVZaWwjUGVzQ0J+an1WczFJKmNFfis/MGM2USRCOHdaeypvKEdmdXtCKkpDX0tib1MrREVpfHdxNlF6T30jTGBuCithTU9SKlozaGBAK3tKI0slK1g4SD1XYipaeV51TWl9czJHPFVmSEF6O31NJV9YYEMyN2YkZ1JpVCpoSiQyMUU7YUV3N0hsJWh4IXFiWVJ4CishN055V2t1WEV5QnQ/XjdBYCFhZ0slaE5gZilSME1lYmdeRyQmemxSNXkpcWpYWnc7SDBSPjRnNzUqZz47Y045VFNAODtxZnl5KyNDUzZPCispbGRlNyFPUyVPdEEwbSkrRW9sKmZmbjxrUzVIST1wSDJNTm0lKnRTKSk9X3FKWjZHZHI2aUlge0VDK3tjQGUqRHFxc1NPMlcwTWkhUEBACitFUnIqIXFaU1BtcHQoYW5laUJ+JkI+YDZMZWlhIWByflM7aERWR2dAJVRHdjl8dms2ailwM2t2eXhpKylYZGlNfWQzPF9uTn47RFl9UFQ9Cis7QU9fSGUtUjdGNlBudTxMdlZpd34/Z289b1g5emhRLVdkMjhFMkUyLXJJTSVQOGNiYylwbyklOzxiQXdCLW94QkYta0xUQDBOe0JzY2ZPCishJDVwaVkxdlJNVTtlZlEwZzxYejYweX01I0U2bntqcCM3VzRqTGUrXi11UDRBRzZ8Z3ZwKih5VTJ4OUVHJWg0IWFHWmApdVo7SStZJjspCitoWSNNKTkmTXhQeX42LWl5X089RW1tLXxHPzV5bWJII1JwTl5GcU1Xc1hnNn5vRW0kcyVzd31WZil8cmAlazlxNjwrVWw+RGt6Qn5xRVMkCis7T0t1ckZvfH5TPmt+X2cyOTZzIUxySXhUbUQtWEpKPVdtU24kX3ZFcWJPZG8ze01FVCpsSnchRWByK20qTG03S2ZeN31wUUBSKF5tNmdRCistWmVAcShaJmxyTXQ/WD1AZHtNO1hPX0l3YDZ3dipmPiVDOHg3KXQpaW1SZEApNmd7V3V1Z2QmS0djYWhLSTxjIWZ0SDgoYFVAOHdzRGtJCit7WDFNVkZMU0lMeVhuWU9ITzBSYXNybDNNNDg7I2V1PyRPSnxQWD19bDxHLU43fT1OSzZpeyheNipBakRiM1ReeV9lMEYlKCgpWTFRITBCCit9UkdvUTZVdE1ZbFY9TFdiUGk/JE92MmBsbDR9JURybVclLT5ULWpIditIMVQ5Rn1EbFJFfDRuIyp9N2tpdjFTIT5OV0NlPWtqUj5FSFktCit6aj0zRnR2VF5jXyQtQG13UVQhTV55ciY4bFcmYWlqKExRaE4kQnU7Qy16WTI1IUtueGhmdWNxTmNjWTY8YjdyNTZvbnZjZUQ3dEx4QUctCitYc2pfS3ZEKnFPNkw0V0VUWUtQI2BoY2ltITY3a1pQNTQlSko4eTYqeztDQHdgQmd5N2RXSFFWbHJSdEc3Um5TcWZSNkcmZWB8QHF4KlR6CismSFdGJGNlWWFTUWEzK2MqIzQqNTNJOSkpcXdaVykoeEpsUldreH5RSyNjU3NMZ3NLRFZGUT1RdHZ5RUg1Z1lPUzZhYyVUJGheXmR0fV9lCitOZl91SkZvN1M5SzZYcjV7YlQmOU02K3lnSiRAS2k7NkxfemJ6NS16Z2Qqb3BZdzY2TGQ/YSMkMGFpYDRwVlpfJWFRc1lUfHIoJDVCKGM5Cis7YDw3ayZZQGFxYW0xYDE+R085JmRrR1BQWDEkKjt0UEpjKmJSRGx4ckxAVXV1MmJ0RWNWRyomQWJTY3JgJDRBaWhMNVB8MikkJFZQcSk4CitPdHxpLSZvLTYmcng5bSZkRWw8Y1k+JX5DVylnbjtHTWhXdWwjanBPSWR1TlZ8NnlzNGJ5XkAldGtiSCR4N1ZAKWNuSWM7c18tfHRkXkt0CitSbjtyaCstfEtNeCRBODVDXz5hZHd7JHFqTXwwVnVrZT93dUlgMGRqZnhVJGE2LX5SRGAwcHMpa2BSYEAoK245b0ZaP0FYJTxOcUdoWWhDCit7MS1ePSYyKShoKFgje1MjP3s2QnhwRiNrV1pzQmh2bXI7b0ZKSEZAPmg7b2dwQWxIVDkpVGpaQmgpa19NdldSWEFfbExvbWIhMU4zPjFWCitOcDEpeE00PksocnhOeVUrMEp2fj52cXolVnVUSjR9UEA1bD5iXyZOWj0mUVA0OSkydjd8TGJsVksleilKKj5VfD9LM2BJJlNManNxKHlwCitxSVYrZWorT29EUEhUZUd6XlNJbShVPUshRTJOVEF3eGBxSlIxUnRIUnpRdElXbzBzPWA4cy1MNChoTnQjajU5MFZ1VExGTXxiUDE1JmhNCit8STRaQnt2fmI9MGUpK31PJXYpR2B4clZee3Bxd28/KmZvZ3Z+JXl2bFhIeGtgbzE5VWhkaithdXNKMzR5Qj01I3BITng2cVIlM1k/UG95CitTUGJna35lMnpFLVJ6MDBBO3NJbjZZbl53UmNFPU47QTY9QyorK2NGd3RUNDREYjhVbVUke3tmRFgpYyZQNWxgRGpFWmNQZmo7bWQ/T0ZHCis0e3JgM2klX09qNH1eSkVFQWp6RV59e20mTT9yPWdeQWhpRz9RbVF7ZmtBe2x3VyozTytubzgkQ3ttK0ZecUdnYD58cSV+JFokeS0kN3VyCitEeCpgZmExMz8zVngyKThSZU41cnAjKEQrOWlYSnNkYTg1UEZZeUwjY0l5dFM9Tz89K1h1TyZWeD02K2dZQGVoXkg9SG1qN04pe1gzcUwhCitQYl4tOTlMVWBIUXRkMF9SS2p8JnombXE+MFk/Z2hqZm8pN1o9VERmcXBsbE5SRHVvUk5hLTl1bnQ2RCVlNFRXQDZjMXtSPUBWPW5kdV42CistKU03dT1zaUZGRUtrJUVKJHVBKjtwe0JAX1NiMUckRWNrbWlVYWdLPEhONmxxUiVuV1RxX2RON3lgO1lHYn5YbCRqPWxiKmh4fE4+Un1ECitiJkZ0aGMlR0dIQkhUN0FEeDVKWDAtT2x6ajVJY1h+KXBUS2FhT0ZLOEI0N2ZDWGF5QiU+MUtDPlR7MWtMdm8xKWkhZX5pU0k+OE5HTShtCitYaCtQTVJVTzRXbFRKI2B4eTUwQ0x2eTBsQSU8MWoqbmZAcl5eTTZ4LTBxJlR2TjJqZXtBbmNNUXo/Snwmc3MkREdTS3VgRGxCd1B0ekBOCit2Oz9kU2NkWkhyPH1NcDVVUzN1QVMpX0loN297QkxeYCZUIyYyMDlycWgtPTFFUlU/OGxDZl9UMzVmIVlFVH1oRXV6OFBIWCQxa308e1QyCismNHs5THMkaH1xRXI/Y1B1em88YFNJeEUxM3BRWUxeM1dLWUNrcztvfXVvO0tBdy1kaXFCSkBYd1Ijc2NfI3ZhQX47RT41OXw1b2xJTEgoCitQQDRJOXYodHFiKldhMiUkYT9tIStHP1dmQEIpZlIrbU18ZGBiRHJJITs0eG87Ti0pKmtKUHJ2O25SZWt0NVpVdzBpVW9JMXl2V20jcXRnCituSFhBcChWQHRGYmdoRHYwd2xvXn5FOD5+Y2RDOXowdVEmYVRMT0ZyVUo7ZlZzVWtTX0VBNEk4dUdWIyM3O15wPVc5QFBkcCk8X1l5Yl5nCiszXj07bjEydnkwM2hUZzwpJS1BPi0xbzdPZ3xpUThTNCh8ZzIkQWZ5QE1VfFcqd2l7Xj8+IWpMbUQ8NWR5JiEock4wVHxNNn1fYWVYNCZuCitLc35KKl88P3k0c2hXVyhaRVRWMmg/Q0VFTVlnbWVNakNlJnhae0c/fiFGcnN3VUhzQCFtfnckRn0zRklQZ24hUEllNjZuTTxQK1JVfl5zCit1Jk1qbyVTXnd2VVcjN1A0QjZQbEcmVzhgQDR6QnxOVmklZStCZ1oyN3BgKG1sSE5DcDhyP0gybWVpTGA8S0U1XnB7fSo3P0w0WXJWa0VeCisoQ0JLbyY4I0JUM2x0TThfRUk0amtQZ3dgVmZic2AkeUZPPUlsJlNtMDVPKllSMkltVWNvYjVBMCttTDwpez88TntoM0BMZUEhTHwxSW5MCis/dWkmZGlgQzJUZVFxY0I9UURGQj9RTEQyZzE2c3BOKUIodUlBdmhmd2dMKG5FNX1sfkU7a0BqVjVudX5LZmtyZk5AeUl+K29zNT5+PChECis7dTFFfCFfX0FrU1BAJCZ5aG07aHcqe3VDeTcjMnZXKThaSkN9QDliU2N2UjM/c3sqfTwrYjdUTzA4NSklQThpZCM9MEJFVUsxUnpScmRZCit7JWcwaXJQbSRqMFhEZ2g2amo8cjkkYU1uNShKckl4UVEqakx2SmBhMml3dExweypvZVRFV15AOUcrMV5lb0hLfGl9LWVedTI1VnZsQGhVCitNWm5FbmExPk4wXllkRHA0PWEjY0NLR2wjbVNobHpzbzE1OCppITMzbns4RCFBQ0UzYUc2b0pZbm5rU3FTV31LUGYpV0lQRiV2MmNhSnx6CitfST80UiRxdGpNZjh2OGJeWUtZYDVCSlJ1SWEmX2ZzRzlRSmAxTSYjM2RxOCklcH1Scj4zcUZuMjY1WXY4LSNVKSplWUlRSW18QV95dGVsCit6ODxQWVVKaGJqc1NoPX5OJXgydX5CQTlKZD1zMlNKQG9wIWpFNGYtc04zbE1PdTcre3FhfXpLO2ZkKSNTOUVlKiM9a3ZCaCZkfikrYXBYCispOF9GMzhEaG4pfHBhYCRNU0BnWWhYciV9Wl8hRVFGNVUmKk9IXzt0MWZYbyhkUikyK2tsOFRHZyhRX0oxK0RLK00hbDh7TTVJX1Q5K0VQCitxaFk/VGViKUJPVHMzaHZeI2pAUypCKmR+d3w4KiZtS2AmTChCPHhlUG5NMi09M0U4O08/b19PM2NOV2VHZUYtfD9pNmhRTGgkYCFpUWVQCis/JihlcSVfTkZVZihrbkd4Tj9iX21XUihGV3J4Kih2MUQ+d2VQTHlmKT9KS0RkVGo1THwlV34/JHlOSGBUKTY5Tjg/O3x0ZDZTWk5+UkslCit2P2VScHVhc05OMVdiO2oqVmRYKngqcVBeKzFBIUY1ckA8bzhAc1MySEAtdj5lSFh9eTJ+Vzk5OS0yRHZObFh1UXtHQG1OVzc0Q3oxJXZ5Cit+ZCNSZGpYbH1VY0omfDVlS0I0dWxLbkFmPkheb2syQj9fZmd0TUtWUT9JTlU2TSMwQVAqMlM7cUQzJVE0UVB4Xml3QD4/Z0wzZEt5JWdgCitXKz5TZjxDdWJgTThERW9TM3RZKz0kMTlQbWZsMFdZQy02UC1NYlcrU3opO3ZHT2FBIzA9ITVqbD5kSkozTGhHeSl7V1dnbm48Nk0kR2xDCitISjd4eVpAJHh4SERObENpRXNNViMpQGxAcGJ9c2pDOSZgTT5SMlVAXnUxX1Bfbk1McUdJVCk/Y3VAdWs9Jj8hWkZ8SnIySnxCP3tGRXo4Cis1REclTnJaKztoQ3h2Sk9FRnAkMmtAM0tFOUBibElLTCMoUy0xK3V1OGdRR2AjcXlVcm9TWWA0RUEqK25nKkZQTWd0eGJhQlk2O1dKbTctCiswSlR6JWFSUCheKnhEanNSXy14TWZrQiREcCZFP01DVilBZEc2MTAkKDFrO2d2dHVkWDYpKT5hU0JeQUhmWWt6JSRxPXhuKC01PSpmUno9CisheEB6SHxoWDd0OXoqSGslaDEoViZYTVUtWkNKbXF3T0AzPWN0RX1GJHZVb3VKWUJQTm17dXw9eVRXJCVoI3FgUWxld2N4SVF4LXUkOVVhCitlKXJ9IXpxJnBmUS1FJHtqIXoje15STj19WkApZmI5V195cmhWJHsqdmFmYFMtQXt4U3B1ZEFHQ3BlJXBuVWVyIU1wdyh2ZGdgQ1hQfFo5CitlPXolKVFyPXF1U2FuYytYUjtkITJLSEgjPyMpQEoxTm4xJFRHfTBZVk5DUHYxPGtHQXBaQSl+Wl9uP3ZDej0lMVJ9fCUhJHcoPDgkTHZNCitNKks3WitXMz5zI29rbXBOSHo4JS1TSHhjRy10MlgwTGJjbDdFc2VmIT8pQ1pYNTRlVWhaZSVzNkRSJWA7Zzh5Yj8mdzdidnghcVAyPEphCittNXpnZ3cqfSYkOEhqeSlgUFQ9IXI2RyNjP1VBRS1PfXUhYGd8NVgtYk9+OSRjSVpzKmFsNzc4UG9fQ053bjZzTiN+Pj8oUiUtK1hXYGF2CitVcWdQQEJyUmtNWjZvUmpMN0QwV31KbnBYfGlsfSNiI0poWmErPWZYVXZoR3lzazdgMzREPWErcXVUOT5jJmV8P2A5WEE8N3JVdCNFaG5hCitQKFpGdHt1NTQqMzE5N1dwREB0IStBeXJiS2IpKWhgfGFWTEA4bF90QTZCZTZSQklrfkNSc3xYYj5PREIoS3ghY1NJUipCcDZqNVdUUj5XCit8Jl87ZlI5dFlPVihRUDtjZH5laCR+UDtqYjV+JnVQaU88LXpwUWE+IV99aGh8fHFEQlkhbjdnSTtDLSVZX3orcWhvVzlnMVoqT3JZJDdECitSQnBmSiRiTURFQTxvUkFfbTJRPEx+KGNHSzlrM0o+NWJRJXRBVVlYQVBkbllqKEJzQW1gZDtiTDFGTHpJUjYoOVk9JTVNIWdvNSE/V259CitUQ0s0UWpKX2JfSzFVTEJHYW9lM2NEY3RLaDdIcnFjJUsqZnJibzV0X1ZWSDBTQ29BXm4hYSVuKnBYSmw8MGk8azw3cHQ3N2JNQU50MW87CisoPXVWYilJYFRBfD5DdVVgPEdHUEgqUndGUUhlUiZwcHNFJjlpK3ghNEJEKzxJdGFefkAjbl8qcUw/KVFKcGxLe1R6PXZkVnNGJXkkdTZACit7YFRqRi1XbEV+WGNgVFQwbVhfVkRgbiM3NSFySX5VSEVRQCVaQ2orV2YxfWppTFE2M3dWSzM5Y3M+I2FhV0JpeGN0QD5Sb3BWPUczNGVzCitgdkpgUVlOKWQ+MjE1Kj4wZllgXz1uR3lUdHlwR055MjBHZjtETjh2ajd6Uj1IO2pJVzk9eSozbE9Kdz15UU1eSD0qcVV9dlpMKStqPXQkCitHeWk9VC1CYE5ENHtLYCY4aFg4eT5uRnNkUFhkS0FtZHBsYHNpMnk+NnE0SkdCWU8hWEw7dCYmK1A1e0taRWM4VE84JTw/d1lJR0V4KHZICitJTntLQUxiMkdmWT5CKU1uN3wjWXR4TEBURSowPm0lKT9+WlRnUnsqcmRKX1UwX3J8YV4yaWUjdEV1S313amUpUklIZSN4YWxoWmxKa3k3CisxI0tmdzIhKk5SX1BDS1JVdSFeZDdhZzxnQ3FnU15Sdz4oRk5JLVRjSlhlMD4lUyV8UzZVIz1INGtOKjZlcjded1p0aEsqT1dRJGApUFAzCis2IThzfiFhUGIjYzw4cCNKcVNNb2wzXiQ7RHNeRXtNfVM0ekJ9NiEoPW04d1k8KGdhSjVGc2tJTG1iOyV2PWMoUzl5IThJK21MciU4eGxZCitIdnNMKFFqaF5XM30hTlokS2J6aHNHe1JzXll4cntpbDdiRDFOd2wtKzV9d21kdmtWdXBpLWQ8XkNOSDVPQUE9ZFo+bUZXU18lbXUmKTMpCitOYjVzOHp0cWBUWU8tSCNoNkdtZ0JjOWh2PXd+WCpSUT5oaSZDdmY7WUJqeDRLN0xjeWNKVkppbWRaKG5aaHdZMzlyfWs/ZDRIaSVMRCYlCit0N1AodXg7XmghVzBXQjcoWSE5NykwMFAlQVRTMjJlTFN2QFVHaFI8UTlZaD0zfVZwaFZzVlZSV2wpRGFVfDs5RVVoWmMwPGVKT1U/XlZxCitxQCVsciZsXmYrP0owKDBldShkeiQ/ejsoKD1TYnsoTllCWnBGZiRvI3VaMjRrbX5+PTN3TmUmQmVrdmxBeU99PCRGQU1LK3BZYX45KERmCitZJkFLQ0k8YmNXOEFvfF9TaDRVeX1mLVI+ZV5CakxWe3FQO3F9PXxWckJCNXBiPHtFfkAxZ0coVylVK2R2eTRZdlVxKmJVMkRHbHk9RGp8CitYSURHPFBwcnsxdjlsMCtyNnopcSZ+cmA1ZTtpMnVtZm1zUjxIfk9ZTUleKlc2UHg2dHttJSpuVzReLXpuUlZNfD51MjFPPnd3amxsJGxBCitRWnRjMW8+clJkO3g+e0V8QzdmZk9fayExVFRPdFRAREp3Mm9tKTExUXBtY3NBZmpLPTQ/IzVZUndYV2o0ZWtMMTwoITJRYyZhISlKaDcjCispKSkrZ2NNPU11Qjtxak9oRFopbClXN0N6JVEwakkhYTIjPk8+TG9WQWI3KW8lblEpZ1V+TnZpa1RId2A+SDBYaVIrR1ZpIWh2LTlhOytkCitRZmt5XmoxNCVePTJDPmtgZztPczRFJm59ZDgkaWtpOE5QRWkpdGQlaU1fZnZXP19WYXZKRChLJEEmP0FqIV98LUZSbm03KDJISjJycFNtCitIbGxNI0pwUTRtT3dOUl96QlBNP180TjNqP0NyYlJjYXUtVUF8VU8jVWVBP0skQzB7P2IyJjx+e1V0SV88MXc/VXNaPWNjYF5sI0djUldyCitufVhUNDtUWHAwKSpUWmdNTTJkJVkldVNxWXxSeVRnVG0jQm1jZzIxdUlXQD97VmcoVTk9bEBodDJuZnoqeyZWNGYhOyhWS3YtOUk+QX1WCisjflVeR1JQOy1FczV5eEJwO2piQnZSPU9pYWczck97THZ6YCt7OyV4Vnk0UU5YcVZPJVBwJU9EZTt4UkFzJU5QS1dge1peUmV3PiRRIWtQCitmKnFSbFBLNStAREh9OWBvPHVnSGNwPUIlZFFCbCFHeDRSbUtWNj4wQXlHMGNaZyRFWGNUYyFKUzUkPE5hN0VybXJtTHErZmtAV2RRUnJuCitsRzlMUkZUMGM4SHg+IUc8WFRScVEpUEVaQyNiOUZMKiVhdyhqYFRhNE5JUG51eXhkSjc5Z0Z3QDZgQ1JIe2ZrZSVxQE0pb3RsKXtqeml6CitOO194TEx+P0NxM09OUktidWxzSTE1TTB+bk9ALVd4Mk9yRygoWUhwIzdSczsqS3UybkBKVGRGcCQhYStFNFB2Smgzbl9kZmcqMUt3flFpCisqOFIhTDhIWWZ7c1d9Y3RsOUNkPX5qcGdOekdULUhBUUJ5RzBSQ0FlLTluVVpVNzxIK2RsSVF8biQ5RHlMbXZSNHZTe2FHTW00blAkSX4jCisrYXdvUDNrQys7JkZHIXk3VlI8eGB+fDcpbSgzaWBUVD90Vk58d3tCR1F3LUExPDk7JUJpZ0FGRDd6ZV91aDFxPFVVPjVFMX13eW9fN3ZBCitheVlGamVWYilQVzF6Yk89MWdqdG8wOExBKHN7aDl3YXE/ZTZuP2VAWDJgVzZTN2F1fEghJnE0OzxVd1FPd09EWkJfPUwzRSMpalllbXpWCitRY0hre2l2RTFFYStRYSkkKyskaE5zUVEzaWt0Ni1WK2FOJlB7dXx4fk51KiRvZ35MN1NLREZxRilUTUFYX0JEQklzPXg4SnVsOXhCY200Cis8N0NqMWpgZ1dra3t8TDQzN1Z3SnNJNj5KQmU7NjFNU0Jpe0YxaUxtenIha25Ve202UEB5MzV1ZzM0SndqbiQoM2EkeCY+VVEkflNwJWszCitBRz5OX0tXYzxtejRXZng5LTVNbnd3N05hd0pOJWk5Q2I/eEhOYlpkUSM0MztURmd2O0QqXncrV0FlVyp1KkwyQWNSPWo3LWRuOFZLaiZZCitUVyVHXjNpblZAQUI/O1hmanR9d21OblFtJUU0JVhMVT8qTm9jV0oqfGZASUpkbUxjcCpzdmBafTktNUxUKWVRWlN2NUUpbT07WiplbUQ1CitkNDY4PiV4S1ItKThlSk88KS1iXj82TkNBNGFpRjtfU1lDdj99aGt1cDV8Z3ZZJF45cCYxZ3Q1cChzKWVULT0rVVE9OTl0TCpQM3A0TypJCis8NE05MHdCTz95JFFBen4pTF8+K3dFS2VZX1h+dTluNzNaQGJQKEk+NkpTc29lVkkydV52Z2NTNTtmJWQwJVhuenQmPTVnVjx0I04xSmFeCitFO1Znd0BiKXhHV3VoN3lrVyo+MyUyRXt1djkwdWptaVRSPE8oVVZkRkVpLU1ieykraFVlYzA5fDhMUkU5PDwrY09tP0Jsd3Y/IXRDdzFfCis5bn0tMjN3eFBNUCVEP0BWPTtKait4Y054azhwNXYoUmRVZjJpY0labzFzQmdhMHsjNFRoUXtYdHw9I15BUn5VJlAkU3lncz84Tkc/MDROCityODdqWk9OeDs1dTt9OWpRIU9sO3tHUHRrYDxHO0J4PDQhYll6YiRlN0RndSR1e0V0clEpV2A1O282VjJoLXhOQ1ljUClEU0h+NHd8UztRCitDRHdHanAtT1lrUWNnWi1zczRmPHZmO3kzYmRCK3N6K317d1ZAXnFPcjB4V0pyRlE0fSMpbTkxLX1AOEY2VkVeOVpFfHNXT09eZW9KTiN3CitLKl5nYTgpQSpsPSs8JFNKY1ZfcGVyfSNsNzBIcWlqTU07N3s3OXohdjc+NDIpZzMmT0VWPGJaKCViVXladWdLclJra0ZNcHk9bFMwSDFNCit8cFFubHUrPG5UOH14TklyTnxEPDB4SG8oP1dOKDJGa3c4K31ZSGxeMnc/PGswazY+OStgMHN8KE5sWW8qaj5sR0ZqJG94dWdYTCZtKCk/CistTkUzcTtWaEk1UHpWbCpDc19Jc195RSgtfG5RVHQ+YlN6R2IoUDIwRDhNMUlEcFhRSmAzbTAmMGpiVV9nMVhEKVliI3ReOTJZUDY9WGI/CitNSDBRbVVrfkM4SWI7UV52TVcpNGRgJGFGSkleRE1xbE9Zez9Qcl5MNClERlg1KDhrX3NRVHRzTWlKaHl1O18oI05SYVRgO2dkeWo1Xzs0CitXNT12UCplaU0mdnJte19sTmVJPF9ncX5rOGxgVyFKZGlqZE4qcHJwI1Z0VCU9THVCcF56bUomO1EwQXtkbHx0YUkldmR1NkQ7VWdFZk4xCitUQj9TVUdEWntNX2l0V31mNntOZEc9REREY3kjSztWPTM9WD10Yl98V3lMT2BPKyVeb2xqZjJoSGlzS1ZvN3x5dDNBVH5eUSlHOyh1UVhECislU0pzeEF5dysxc2p2RnRRNl4pdS1zOXhZJkAtYW5BRUQ2ZGIrND4+MUU3PmdfSlFPIWNKOGYyMT5zdU5YXnhOXylrdyRGNH5wfTdgTT9UCitrdm1KPkg4WSFYMmUlUk97ZXlRZzJnWlVqPjkzcikoNXFoJDxMNEU0VWtidCZwc0o5JEdaNVVlaVB6bUA0NUdFT2tiYD9MeSZYXzhFdUtJCitDNmUkSFpoJClhXnlfYTFRdFNQRjd5WGNnKylVb0htVFV7SjFSVk4ya0N5QGdmT1dXP1olQ1U0bSo7T3tDS29tOFgyaHM3dS0+QmRXX2ZACitEJTRzYHdDUHtzVkBgKGd2QU0mOFpGM3pybmVRbm51c1locEZTTz1aezk3T1RVa0xVQ1Z4eWJPKC0zRkRZMEt9O1IhWklCYVlOJXlHWUl0CitgOyEwOUttYWpRfiUrOCpQVigwMjY4PCNwPT40UnV1dlo3cTkzI0BjS0NYNi0kayRrYUZIR1g/YHFPKCZJSk1XSSlxPSZFak1+cWdgOz40CitjKSQpbC14USgwWFJCVk98OGw0IW8rbTA1YWlBdlh9N1Foc29kQmgkTlgmWVNEPT1JPnItZDBUQ0gkdXZWX0tLV2hQIXFqZUJPY0NBfEYhCitXdnlaTWNoYkRoYnF2KyhEUCEwNiYjZV5zMX00JjYtISYpdXYwbjIwN3RvQHIyUmlTdGhHa051PWc3Sis+e0pNWGMqOyVffkZ0KnIlbCRACit8UT1mciNzaU93UT0rMEMlY1hNWXlXVTRrTXFAfFE9LVd8OX1DeH5fY2dOSG1lKkh6bCMkIVgqKFE7Pm49VUBZZEwmRFd5UTtEQ0JGISt2CitCXnt8dz9rPWhDaXxgcCVyQiZfS0JhKUU4YE9vN0BrN0ZgRWlWdSthRUBrdWYje1hKajJeNWF9MnRPWjU5S3ZaaGZoSWNKWkBIJUFVcTJsCis5enlGZGh4NCk3JXUkcWhmdWpqcV4+KFZ1XnA4KWchIShxR3c/JDw7MzQ2aF9acGJXQ1dEMSpXbl8jc0ZWMT00bUhNTjxAbEdDMGhAVSY4CitCeFArNzg4V3YoNkl2alBPNChnS0pGMEhGWntNNlFyRU5oR0hpbkVUcWRmfjw5cnQ1KmRwZkNuUjZePFpmbnBkM3p2dW99YXh5JXNhenQwCis2UHM7czlPZWUtI2ctYjEocTMxcDYmMHBDTX1wQVErVT5BVVZLUmowQTJNVz52fmRRRSowUGpoUWlQU0ReKCkkcktFSnhvVX44YVdXaTQ+CitnYVQ+IX0rWldrRWpCODladyhkWUtsfTR5bzcpJUNYTH5AbWRWXzI9YFllKnB6QllmMUFtalRRSmhQMyRsPSU+LXtKTFFAWD5vK05lTys/Cis2YUJtNXspLWNuTCk/UiZDfX1PP2hWWElWdSM9NCo8VlFmdSMlalVjVn4jbkV7dFhAMXoqQF9eUlFVc3dOemkjWEtiVmF3R3RZJkBlPztoCitASEFMNkY1QXpkemV2KWVhQnJ1RXBDQD5xMWtVNUs9YlAjfVhgdFItdV56JSpteEF6NDRgS0o4YWRqa0RAUX51PGhlOWxVTmVqe0lkenc4CitDN2t+K1VMaXR8ak0kTTlmaXFVYWxmSjNXKVZiY2FJdGN5V1U+d3FAX0xvTX43fGtHM0JCdXd0YiomdSUtIyt+S2J7TClseFFBLXEjXmNmCitvS3AqUk81dWx4YGpnZ2dMVWcpQjViRnYzNjBST2ZFLTVRbEJkUDUlYFhFJnBDb3RwNiZLWW1XYWlfSSVJIVk3LWNERWl2Z0NFbS1ZO2lKCiswOzNPLUBHNmFNY3Jtc1pDVWRmSmFkZT8oU0M1KFpeWT9FeD5WMHUkSjNGKVohYV5xTXQ/ZGg0e1UhI1A5KUA+eDRWU1JLelluPWRpYkZDCiswLVlWeVl8Nk5mb09SfEVZZ3VEbnJCUW9zZUdJPHdyRTdHdFNUPDx5ejhHQUMlJlVXOyUyVi0wRlc5JHVwT2ttUGIpJGskTGJpYX0yZjMtCitiVzdjaD02ND87bD4hOVJleypqZVpiMWR9QnRkaFN+Xz14aDRESiV7WiFpUE97cWJhPUA7T1R0cXVhQ2kkTmhEVyY7biN8XmdgPT04V2pUCisqdzk/N3V1QXQ1QkJwKmRYNmpCY14+X0pOK2xRMyo8MnNlQU15JlVhcilGUmBLO3tqUXN5PkpURUEjZllFdiMkSGE4R3dscFQ4Z2BTSmdPCitpPmVAdFE7JkI/VHd0UH5ab1pQfkYyVHZ5alpXP1UzMlRAdTg0amJ8Uks+Qm4kMTklXjNCPjktd0tUZz1GU00rMGR5T0hrWjxnNHozPT5CCismUHpzNnAhVERTMHolSVgzU281a3Y8LXVnSElAR0t8WGJhUW9BaCpaTGJxczZ5YVR6WHtNZVlNMUMxV2xRTkY3Pk5SRjErQGNwQktafFotCitqNG93byVXV1NUYW9KVz44TnRJJHcxc3BmXiYoPTV2MXJyY0hkKk9zMT1JVUxuVz5wRXd0SkxFckFedDN4NV9WaFo1RSNXI057VD1XUl5SCitleGpqY2diJndkenp0TUNMN0hDfDw0e3YlcyprQWkreTRkWiV3UmB7ZlVveD92YH1eVkZAJWBoM1peb30jSmpUb0l7MmtWUklec3xII3M4CituamBBJElvbj0kXzIxO0FqOEI1QG9jRFQxVjdmQFVaZkElUEFyekhGZEsxVihWOyVlMCo9MXYjazJEJFdQYDQ7OD48Mk8xNTwrQn1lMjxyCitweCkwTHEyMFdNNWI5dTJyIT5nb3A8RHZgaCp6WShhVyMzQ2R1UTA7bVFPQnBeUm40JkdnXmdYMTh2eEE+SjxBZGBVTzdxZyEjUjwrIWZCCishVHtsRnlKNVArQiV3OUg0WWJNUklJfGc8UW81PjhRe0BhYzNaZXR4JDVqRVl5Sis8bzReNihURjZUTmR6dTErTExCUCgtM3dzZW9iRDdlCityMmcyY0wyYl9SbyUmakpjY0NlLWBVXjxAc0E2M3B4cnYodjxKUzFmSjc5aUZvWTVoMWliR0omQGh3OTBaZmpmZCFORjJZeUJYZVB3QWdSCit6ZzByfSRhanZ5REN2SDZzZE9QcU4yfDl0T08qfntMP3dCOCglV3tJZzAwUXchRmZWOTNyMHFsKXpDWVVVMkwzI1MoNUlgZmEhdUtib21HCitpTHFJVCt8KldhIUZwTilSIy1SZ2hLSWBUaHA4VyNWVilCSD9uITJTRVhUO2FkQ2YjQ2lAfElIMmptT1MtOHprIzFWaDV5K04xb3NkNmQ7Cit8WnkqJjt0XiVPa3J4VG85O2hTPnlXNWJxbDdsUVhnckBjflFIS3UtVng8NXNhcmdSe2NRUjk7UkRYT3tWfXBrXkpAQXBMY1Y7SnJPfSNPCit3YT48JmY1I0s7Z0lyOSFUVTZCKWdhMjROPVVwMjh8ckZBUmRwWk85dG41NUZtTlU5PkVHKDxTKDRsRWMrUylyYWBVNFFFdEpEJGM2KENjCis5NTB1KDxTOzFOS0FBQzJnSGh+fXlHWklhSCMqMmtkMVE4S0x0cDlhKy00Q2ArQV9waDh+YSg8RU1kYXIhfEFyez9GUjJIc3ljMSUqbDlCCitfdEs5cnoyOX4pbzJ5KnN9U2FCeHloMXFBPmx8OXQpSHFlZGwtM2l8WW9ZPFl+JntSJnMpS3tRYEYkTGVzXkh5cFMtMEVgQXYxelckSGlwCitrRFJJP3xUYDYoRT84RypOdXNUU2VzTnE4amgyT3JIQVErMkVvYFhBTGgtb3IpRWQlUCZNQlh1YE1Ba1ItPj9OTis4dURrP2o3MHo2Mk5aCitBLVRrcHw/QFYkPmdFdn1wfX51PzEjVWZ3Oz1RMzY7VWltRj9HP2dDfTItZG1SekNrPjBTJCElPH5ecUdUNXpIN0JZKytDOEd2YXVXSXBUCitFI0M5KHdjI3spPSVxTEpmfHwjcjd4bU8hazt1bmwmdSNoQzY1Jl5pV1hSbmg3RHA8P0ZKd05GI20mYG04WGY5QHFwQGtsKUZheWo5b0c5Cit7MV5AOys4QHAqJWJHPX5DcGxjYUF9OFMtakluWCg4Wj4mZVlfbUJtUHMrPzY4QGlJT0psOEFPJj1JQWtDQUBzRGcjNWZvTCExXnVEdVJlCitBYWN1NUhZPmI1aEdZe19pPFVgZnklJFcxPkRyPGV9eClYUXktQWkjUTYtPkJjQUo2az9ZREQtZmt6Q205cGlwRzBTNForbWI/MmBxfDZyCit3dXdBPlY4PnxUU0A0VkFIbTxmTSE3NVJKTG1DTVNOXiFXVShQXn5wTVBAK3BjVHl0SktrOypxQURKRz01PEN7NTttZkx8VXhEWiQ3dl5hCituKDttN1ZuJWlSSUh1RFBzPVFFSXM4S0s4U0habzZ4YUtHRG8/Z08pI1NlUGdNPWxAZ0spKG5ASUReSzNecUVhKWtxPFQ9ZjAhRjZQT0YzCitlREBFWFAqPz1eSHpMUW9kUkJ6QTJ3V1d7cEdmamhAYUM+e2B8MHl7RjVJSmBLZShKISUhNXkmPF9NOVA+UH54OFk1QVBTalkmRGt8YSV7CitGIXA2diNYSktOUHohUD02bVVHQ0VBejxLRz4/VWdGZ2ZydnAhdjZzaCZsMmwzISZHZG8kTXs3dkRXLXh0R3JhY3gtJUZReWRXNkJhSHQmCitjazk/S21GVSRXUnpqQnI9MVJfSiRaYUhnJE9SfWJ2RUpPc3hmSG9zWWxfN3lKNzBAKzcwa3ozN0t5NmF1K3hTN3MzSnd5Q2t5WThhJXNfCit5bXEoQjZPJHAxck96bH12YWZ3U2J3ZjdjRyNeVldmXyFhaE94YXgyYGw9QGBSYjhCN0FGeyNIQjBNfXM7KVh3NyNHRGR2P2VzUGhlbGVpCitHaGolcUdIdVJ+KT9RQ2o2djgzP1E1VVFYJHI9SyYlcG14MipsRUs4VX5+Sys/KDt7PzNXTXRNWHF3M0hqUnYxfU4qZUEjMnx2OXpROVRjCit5WU0peCVtKmBgYnhiS2BsV3AxP3M9fD9GcXEyJkR5YkNqKEtqRk9QQz0rbTlCIWtyJkQjZW43SDI0YXdpYFVNaE55WElhNTxoc1JHeDg4CitiWmxxTCh9Qm1JK3EmcCtuZTVOQyspWEdtVCohVndMJWd4elVWZ1kxMVhvN1Jaa1VHPFc/OF53QC00Zm1Pbz59SkctX1BkNFM1OHVwVHxfCistI2pXRUVtNERkbD5ZPFkzdl8jY2VPKWsoRih2I2d6PyFLKmNkTzl5T3xFYjdRIWZKUVYjdGQlMjdfdTZCRn0lcE88SDliajN+OUclX2VGCitmMiZ8WjtpaCFQUyVRRl5TYGx9PFFxeFo9NCh2UChLIytOVnlsK1owQzUraEAwPDlwMjR3JSRnYUpJcTB6M2MxWigyRTYjPUpeSS1iZXIwCit7YmgzMm9CelN7OW04JDtDcyM7dX5aUGpLYWZ0ezJ+UmReMVIoWWF3al5FPWh+WH1LeDt+bmxfMFdfaWI8QHhlRXp0fGlVdzxZdG97dXN8Cis1NEgoYFo9az51NkwrM1QqUGZqPFN1cC13cTxWRTlGb3sxSih9ISNmfEJGbWFXfUw1V3dEaFpFJjI/TTx9MmxpYFAlfm96ZGItfU9ZNlokCis5S20qcEklfiZlNjNjQEcoMytLYiRlZXVjNGFWN0RjT3c+cmhYPnp8cTBxWm9eRjtjcSp+cSh1XjFUTkprdWkzSzJgMG5FcGVhVWQ3akNyCitDKkxPYld4S0I0TE94dz1makJxdnJaeWRNalhxUEIhaG48ZUpFUDFFJlcoIzQ1ZW1MWXQjX1R1aGZAbDJJNHlLbzArX2gpKmU1bGlQaXooCitTdFNJUmI+WGY/MkpnbWdNUmsqdlM8V1BoMj9FaEdAPEMkOV5gSHRoRFRiSjZPOz5ibHBVbllCWXt4YH0oNWY5VG4kUmNgVXd1ajRZMyVlCitYVXFEUUFaK2UoaGF8LUBqQmNBQHk9MmoqTzZSd3BzSy1QaVd5UlI2ZXpFMSQoSVEqM2BINUtHcXBJbWJ1MWw9fn5ASXVWX3EmIUdTUktwCisqKXs1ZnJQcSF4ZTlQUjJLWCpDbDYzVUtqUyg5Yzt5Umc+WVpDNUpTN1E3PS1qMHtTZl9iVkl8MyVUdmljYXFoWVdfNzZ7XjVaP1YmVjZMCitlJGFISkstKEo8YmQxOWdtX1BedU09PXl4T21jY0wjen1edjNGYkB2e3NwczI5OHxSY3c4MjNGO3t1UDFkNWUoMXg/YlFCS3VyUUZNblBUCis3Kk50JG4xVjl8TT0zcCsrMT1OVVBQPXBHd2lVZXFjenFNfm1mcyUyQzE1Pj9SdDc/IzZXbn1fc1dPeXkwIU5Hb3VOeHRDUTApdUdecVd1CitlYHFWUnYxVmlvMHJLXyZxeGFSb1pXWVkqWktCJCl5ckJ8LTNobmM0IWFLI3BVQDskKWZLPzxGMEY2JTQtejxgLU0pKUxYVEd4LT0laz9OCit4ZVRVO0QyRV5TbDJaNDhPT1RTeGA7LWhFP3dPaEJyVUA/TG99XzM+JnFJdVFxT2QyNyE1PyVZUX5kMypvVGxjSz4hbig5YzhxbE0oJEp1CitsWm9RUkNKVDRBaEZ8I2FMbWlIREN8KlZKVVpLWWlpREV9byRQJS02bilffGhLNU5xNTxZOXBhVzZiTU9HbzUmbztgejdPNz89NClyS19zCitgbCFVa1B9NjFoQD1oVm0rIUpVa0RVWlpSP2V5eDxua2hmK2B6aUVnPEI5SkhXWlIjKjFBS2xxZytVbW9ZYmpUIUpleWojKlkkWE5tV2QkCitBR15wLVdOeDJOVXFsVWN3O0l4ckxEJXVuZXhefW9SKjhfTEg/eHBkWHNTJTQqOUxJLTZqRUFPYF5wRH12STl7aGhOXyF5QSt3ZSpVZGUjCitFe3E5e3JQIUpqd0ZnKmkzfjZoVVN3QCk5TXF3czZeLXdlZ0chRE1LY3lqWW5tQjZtKnduenVXQ2syTSgqUnpKP3NTIU91NHw1JEhGS0tVCitTJk9IPTIkZ15+SyZpIUgwY1VXNC1XVUd7KjE8UnErTVhhKHpJSElvYlNqPCRffjVmZmREKGUqP2glem13bkpGKFBNWlR6TmhURDJ4O0FiCitHeyN5VFJZI3x2bXd+O2xFeDIlem1MIV5WWT4/LSR9ME15WCQlMUduU0ZjVy1XMGRxI0l8KEFSRigoblAwa24kKlMqVU50RnBQTyZWdURQCithUEc2ZUhWbkMxdTh3UyhJRTZuVjdeKztLekBtYkRDbGFYWE5XVXk9TlNjITskLUh5RmMtY3VMSCYlMlo9fXAzKTArPSU/PiEkN09LPEhICitASm9uPF5PZEt9ZCFHYVhIdyZLQzJaOVp7WmN9JUkzQk1WJEhgYDFJLSRGZWllckkmODlqdSgxTWM0KUZraitzTz0jMnoyY0ohNzx4TzJECittdjlRJj05WnwpRD9KUTNEKj1RQmNiYUxeYllfOGRPOT5gKStoPkllYDJ7KmJnU2YkQDwha2c8fXBYI3x+Mms9JUtfSTZxWFBsR1hIVDxPCitlc011MGJHbWw3SFFwYzZtaylWUHM8R1E4TXArN3RUX1dPLWhpY0JTVExhUk1OVzhhP3tOX0NNPTJkYzxoSEttYihyTVVrK2x5UUo+bjVwCitpe0AqbUQqbU53bkA0aE9VRmBqNisxZDFvclFsYyo+NCReVkVzY2orV1FYZFU7MyMlSiZPRWk5c21FeTJ8bVJBfE1CMS04Xl9Ab3ZBYHJvCis7eHZqZzNzZkByVm91VG9PZlViQDc+PClUTDQ4QHFLeDd+bXpKTyU4bUlQMyVEbkNJMjQ+N3JfSiFCY3NWXn1PZzh2WU9Vd1VgdTEwdVQ2Cit0c1NBZGNZZDshaF49ZEN4VVFVMyVHak8pKkQ2Yl9BMyY/Pn53O2JzOVFAXztyJnckaXFQNkRfdC0jWFRtSyZeXmwwSGhiSVdzNHhkcEFCCitycTZ5JmZgc3tefVNkLUVWUGtoTkhqcUI4KjVGYWdYP1dEVF9nbS1nPmZBezFafGpVUXpVd3MjU2l5UlM3a2R0V0ZPajxEeW4rNWFsa1VqCiszfV41MzhTNF5wfChmYDZ+e0FQQFk8T0EhelYmWSU8Smd2UmJzP15NXiFrRzg3K2A/czNiIVZuSXZ7dTZvQmUkQSVmeGdQcnxhbmtyNng4CithOGtvK0xKYzMlfTFuTUloJVhXWEdISnkkMD18eEx3SVkhM1ZsbX5kcypKSGFUZFIpel5POSM2WiRINEV2NSRkSGVIQEdUbkV6e1hoQip+CitfaDVxbEpCaHFsMzNCaTw5UUd+MVkxQGk4PTNXI3xaSGo0VSE/fXp5YD5xKSsyX0I1PkF4RVNFM3xGNHFKZUhORVM/KW4rQGN3KGNVLTlXCis0e0llSlItXmUrXkJDbnE/eSpAaHcyS2t3bzJDTiZ3V1Y7PVVXT3drTSU3JUtYYkF7RlZPdn14e3BMUEtzLXlWMUI1KUAtRE56K14pe01rCitwaT9SNWM2UktDaE4+ezROdjlESXB7NXE9c1NXMUU7bnokZX1+UEtyR0gxQUZ1bUMzQEJrdCFRTWVZMXBmcGxJVkpqWH4tdC1LfVohKFEmCitUcEd0aFRiNEI+VDw0WkEjZT1IcVUhZXAqbzdHVzc0SnBFKyV6bVA4WVBLTU9TU3c+fmBwKDRWcGpmcU5TfUFleGFldCkyViNmaGQ5PCo+CitWUUEybFhlOzhyeFhZJE9SVj9UZ1IyUzYpZ2tYSnZYa2VsZClQcE54OU9EaDx9TFJeQDZHR292WTVjPFo3S0U+JmxLckxvblNKO2khcHFtCitjM2RiOzlBK3YrYmN3fHFFUDVHWExFU0Q7Wn5ERHVKflM/NllrNyREQUF7UHE5JEtNM295V2k9OXJvKCt5X3luPSs0TGR3dnEkKSEza1cjCit2RWgmIXtMNzNlVCRPX3U7U25ebU9GWWdrVDBGS3dSe2c2NFFzQ29QKlZZeG5haj4hRCZ5OD9ZcSM5VmZNclQtOVMtfWs0WS05ezt5WFQkCis/TEooWXRSTDJobS1nbEh7WFo+d0YwQGJWfl9weVZZdEYxdFZ8cSZwKiEjdT45NXoweVVtJUJQZyhfbShXR1NCfldQSjNCeHMmdX1MfiR5CitfbXs9YDFhdFUzQGQ+aXEja05fYmphSXZXP3A4PjNOaldpPjV+SCkyd2pJcV59N0J5UihzUEEhb3tzJVV6WTVzdGVJQXpUSnk0aGF2U1RzCitBJEB2I3EyeUVWb1RjSHNlNjZiWXRDd2Y1WXsrR0ZYUyR2RDswLWtFcFgzVVpzRlEocnBsI0E0WHF4YTNWaU5qV3s8bU9rZF94Qm5GRzQ/Cis8S1AtNjgtbVNsI1FzSiZ2bVg8QXpOfD4oaFIzWnwhWSN0IWNHY3Q9MGhnWjU0Vl84KGIwNGBFajVmS1ZvPSlPcnM1IX1TRDVjUGVERHFCCitzWXE4cCkqIX53YF9IV19renVaZ24xZ0xyY0t+ZD41e3tEU1d7cn45eWh5T1cye3JgfkB6VF41SXA2bXlKTjY1d0tXc3Q9Wk1qNmwqY0tOCitxcEsxQzJETXcydng7eHg1dl98aVNSIy1KQXZVUUZOJjI5ZjltSElhUHZ1cCs9USUjZmc3YUlyPWdLPmJCKVNQQk9TeVducXowb1gzNlJyCitHMWlHc2phUD0/cnF5R212M1U7O1o7RzM9SFIwbUdUej1qfVFRPTdnRGc7I21qallHWnNpdXR1Tj9SMnBndD01SDxwQGQ0OCs8KD9TYGp3CitWZj9QMFVJQSlGUDVUVVdDWExTVWdUZ1gwUGxhRnMhamxIaTk3aUxAQnd8RlEoRFdVWFJKdWF2T1d2YTFeP1BUZUVQfkZ7LV4/NkBIejZACiswTH5ZYUdrSX1kaWNaTHk4ckIoPSN9a0hySGw3Z0JQMTRgbnpgcFgyKnMzWm1ZbXBNSD5yVkMpWlpHeUpfWn51cGFeP0twV1VrcmlocF9OCitzR09yZiVNXzhDVXtYQW1tLXd5ZmI1a3ZvVyRZOHwoIWxWfD9nRj9FN2pMRTJxLSp7PnZQKjFqTjkjcFhARkReV2ZHbjckPXM4aUVhVFZlCitTKVkxT2BBXjExNF5SVyt0PEJpWnNQKFhjIT85LUote0VCZTctSFIwZnR3eUNLViszb2pgI2dEUjlIRG9yRnElWXxCKnpkaDBRUzEzRVBxCitYQyglQTdpPGBpOXI/e3Y9NkZQdVpBUHFRbTlNP2kmeGlIQmMqP3l+fkNoZVcyJlp2cHN9aWhzUlU8SmZte3hhMGY1RHZELW9KOEE/MkU+CismJmBjSk1yZUQ0ZD40O2FAUld2OztOZj83WX5SWEFrVUtAUDwhdiopKGlJfWFAe0ZZKWp7QDskVDtuaSVJTERLSkArTW8za3s3XkVheGczCisjXlRVNUJBKWtHajwlOWdhZk5aYlBQZ0Zic2BNQG02WF9uWipTJCs2R3IhbTJoYC0hS0x3eVJ+Y2F1NTtDYmoqZUhPITBTdDZVZldPaClMCitYeGI3WiZyezUmak5PSSQ9cDZkfHp0RVRJY2BwdEI5YlZFRms0dX13bm1UWlNWVEZ5YGt7S3pQQyZvSn07NFUwZCU1Qns8fVVyOE0/fENuCituVHtQMTEpVUNTV3Fie0BKMVFyPTRQQF5+eTk8cnY7TFYmfl9DbUMrRGNJJnBqYGtZWnQpd2Q8cH1heXtzRSU/Mm5odn1fYERSRCV7UlZkCitNSCQpJVRNJGJFbVA1MTRucHtgQlNhOCY9Rnk/WTVgN00qcyVsMj5KRDhDTXpNK0dkQj1LRmJ9YTB2S2JTO2U/cntGJHJkUXUmd3pCTnNVCishXyojJHl0SDYtODNvYWViKGVsIUloYmB1PkdzSnp9Y1p5XnhMV1MlS0h3RWQkQiN0PDVRRWlkZE9+WEpMQCV3YVhNcWxWfVFuOHEwKV9zCistQkdUJVVHV1FBYH1jSHFCPjBzY3ZGRFV9dWx5ITtGVUREQFErMmJuIXBaRStMJihjOXdpc0o2cDxiU3ZXRzg4UEdZUE4hTTRONFg/XyhFCisxajJFI2A3OT08KzEjMFlYOH5TO1UjTWMta2U2YCVNKkI/VzJTVHhRM282R2xHcVNqbD1fJUNwRC1UeUJzeG1CMEhKfEFvT0tmSnt5LVQ1Cit6KntSeXVCVSUlS3BsPmUmPntaX0dZMG1UTFg1QEpuRk0qJWkzTXMxbl9kelVKS0pEOC1fUnUxU3xUU2s1Ziljfjd1NUx7KlF3SXlyQHUkCitmJUAmci0jXlpYKm5geGotTDNlMndSVm1KPElkZWcpT2IwbSRrWTBCIXp+bD9BS15FTClhUUUmbCkpQ194S3w8d2RAPnNsYCM/VUkhT21GCituO1llVGFhc2xkO3dHKW1rU2QjczU4ciFZeVVRcUVCKylZQEpxJFU7fV9aNyg1RT01dkRteSN4LTlMZzckMzdYQTVgaD4/e3t+eDtmJG1GCitoSDwqVW5USSU+PyRDbTFhJip3VF51X1V1Rj8mLSpmLX03NkVtajdVayRHZ0BGKylEdyRhV3JUX2FycGQ0bmh6SnU+S1AkelFLNjV6X21FCis5anIoUkZldUhycFk9YT95Pis4bik+cEF7emlxUC1vX2A0fVd6bmtPbHJVP0NjMCsjU2hEVkhnVi1KYSo9IWVTanhEPmdTTW9GP3lsb2dVCitvLTwwcWJ3OHJERWdpKlglbl9HUFZ+eThOPjZVJFBkX1M1cGhVYlRLZDJMdylJfGdncTtTUnJgPXwtcn5zVlZmMCl8UF9QeCVsdlZmLT01CitoQWd5YD59QTJ7dm56RCFpQDA4NDQ/VmtLPXdocDshKkQhIVp9S0pFVUJsVmxVVVlPVlFAaiFKcD55KUR5Y0I3dzlMU0E0V3VYXj5Ebj1JCishJD9Xc3MlQC1ERyFffnpBOGlgaD5LWjZHZ2F5bGVzfU8yUWpwdWtxfmhTVSk3YHQrPmIrYTwraUtvRHhrREhYa3NGfHxLNUtGT0RkO0N8CisyUD5eNUJfLXM+azkkNWBjWlZ8TGliJGZ6JFlpO2FuNn56fm9rZ1BKWks4MXxjMz9BQitUJmFONGw2QD0pOzN8V2IoP1cmcGJ5fSRMPlBFCitJajk9QlQzRm1qT0g7fiZOXiglWTdAQyMreiR2PTYkPHd2aH5aJTxzQE4tdk56Xl9DYDsmellqdChZSjgkZHNhTDJXODtiK0pPRkx1b05jCityPzlVRFR+VnE2ekxZPG1ORCN4N1lOYH1eQW9ZS1QraXREKHdXXi1sKn1XJHJ8fS0wNiFvMHM1MEslcytpIXBnO00te0x9WFpgdSFLQ1VBCiszZnM2KUp+VntUJHFWKkk4KHR4YFBvNi09MzE8bTZgS2xONDIpRkU5RUhtaldsUjJeZnJ1VUxpa3Z0Kz5pUyNFQFklSWElZFkxK0ZsODswCitQQzVKTnhfSkR6P3ZlNCg8NG1aeGBqPVNzPSZGXjxpN2szdz1zKSQyJG0xR1JwdDZyJlNieGcwQ3hgd1ZjXkM2R0NKSi0+PER8Q0ZxTGQ0CispYlIzWEEqUzJaU0xKbmpCcng3dj13cThEaUwlYHN2TW9qMz1kZ3AkSU04QWhTPmlmNSgldFRpVz09RWErTUpRWCtQNSZHUm1UYDlhdUxDCit6RCV1b3g1aU54QGx9NHdWZ1hTblEmPyNpez5yVDFWX0FNREZjdXNmdz4lelF+X1EyQC0kYUhvYFleVVJxYXBgYmRjTCFoVWVWcnBPUGY2CiszWCRFejcyUkVEUnJKa1NAMVJnTkAxZyEjQSQmNDFEUDsrdTBgPG9XK1RKbi0qTkA+N1c1QTVRUkBibD9hPChJfTE0Qm44dFgzRUVROHB6CitzfDwpfShpZSFEeUtJR1NlTU1JSWIjYDZiXl81d3N3eXEzWG8kNGRQMXooPmtCdFAzSj9XQWU8NjBYOSpxfShFRyh1eW8mKXAwU1VXRmJZCitpQjZ9VWQhSn01THVeLSlpdHF0OURiUSZoTzhPKDNzYSZKO0VGKFNQKktORlltMkhKUjFKYiF5PmlWfFRNT3NZd0s1TX1GOUQ0ejdBQkxACitVPnhZbWxhUkd6KWlTMXE0fXJzfS0hVCpaMWVpJitgRVZqQWE0fXE0bUNZcDFfZ0p9VFE3aGluPzJmQ2Rne3s9cTl0OGQ3d15hJUhaejJTCis1WUR4Y3QybSMzSWBEbkdNZXZjNEhIZiZVMVJJYDEtUkkxU2M/UyRXPTFuLUlIJVNLUGNLUFJJOXl6K2lFTWQpe1B7TXs2eC1fN3hOUS1wCitxPVZfdmcxUzdxTm1FfG1sNiE8QjhiWUd0MC0xLVRzVEtJQj07T1ZOU0szKWd8OWhrSnxxNCVzKVYmZk4pKVJXPTlRek1TX1EleUFhWnohCit6OSsjPHxLMWtLQUN6WmE0VHNCO0xgfTZ4R3JkKX1YOShiX3s+Q0FBMz8mV1BGP1FedVB5QSs2UTt0QWlDMnlxWUgqIz9pOGhhK19QUWwkCiszOX54I0JtT2lDRTA9QEUjMVl+KSVNR0IhN1ZpPkk8TlF4YDVvdn1eN1c2OD5TJGhBZm9zQFdXVTB8aWl8WSQzKiM3bXY+dkJzNHZjI1R1CitvMiRANXJDck81PDt1dnI8Mjw8T0VARUgjK18mWTdqQztlOUg8Ri1TKl8hbmsmN2o+Um5+Uj40OW09ZHIkNGIzaEswdlppdT5PfEhSZnxSCisxSSg0UXxDV3l6SihfMT4lZy1hTVB0IXc0Y3BSZGxVJXheJiEoJSNzKnZTNjtBe0NMK0BlX0RWNFZZbH1jY0hRT2tCOHVWITA7NHBBUWBECitFfnhOcnQrcUM1eFRQTFBVfTAxPnV+MklWeUFuJmA4YlZhYU5iNSFydCo+ZyN8aTN9VDxsR1BXJDM+MXF5dzNaMW94ZDBEK08xbyVqKSlsCistX1VEc0dFPzJnSDZzdE0qXiUhWjlIQjNiZ3Nqd0laNFA0X2JmKWtYK15Ea2B5ZVBLcSh7IzgtZWdoMjdJcn1AfTkyaGNFbnAhWlVMJTtLCitxfitnU2YtIT1kaEd7QHB9I2ZhU20xQWNlbCQjJUVKdTw9JkhocG91OFJDMGJUJU9OOURnKjRTQEBNSWo8S0F6VjlEXk9fdWUySm58V05vCitFaE1nKUtMcnxoOytXZno9UTVySEpDPFNOcXdycTRHNnRmSm40YXMybWNmcWlma253KHpFKE9jUFVfNGEtXzEtMipxT1g3aExZVEwzdD9rCiszRyhWPiZWb1k3NE9SKWdlK3hUNSo/Z2hIajh1UCt+PmhzRyQpfH1vRWN6aStjenFnSWU8IV5LUi00dm5VJkdDMHJnbmw+Mi0lU3goPWxDCit5enNyVGQ3Zm57QVg9N0h0Wk0xfTZtakd5KTtnVGVjPHhTKXZ9JSYyJDA4SChOPiR5Y0cjPWRgIXJlbks0Nyh6OSlRT0NHZ3Y8VVd0JD9rCitpP2RYbklydytSTjkoMnd2TWB3ITB0bU9fQlBxbE9wVWdnQWQmY2JxK0UoKjlkbnpjan1kclcrSG5EbzF4NX1yPzl9R0MhRWpYUCYjSUtDCitoNikqK3krTHImJmc+WldsMHt8RXdOe2BWX0RSaDhvZCs9RXUoJFctOyU/Mlc8Kz4lS3ZHRGUoK3NLYk9HNHs4VUhXc1BBPVh5U1k0Zk91Cis3aEpnNUJOOVpoY2E0UXlBLWklMT5zcktSVz90VXBpX14wYzZ4QGslKkMjSlNLVm40SnY0ZVoyd3l9ZUdJJFhgWip4KT4rJGtnIWM3dDByCitKKDErTXdjUCg1fXVOO3dXT1V8TUYhbkdnb0xMXnU9PUg5UF9OYmNYOXdRcjdFcismKndoWkw2OyE0cVkkN24kZDtUdjE1YCRvMmx3OSY+CitCWHJLM21eXz4rQ2hjUTB3YiNSPTt3RUtATFJ3cF8zMThsbygpVmY3Qz9uX3R4VkxHUXMqRSsxUVQtKCE7UlQoJiZaVEFmIU4zY0tIcWtzCit7Kkc/bipPezMmJUxrezswaCQ4PHE0aSExQVhDPT91RVJOQz9lMWBtR355eWNiTDNQTmViQmtJaSo3SF4jVUxEalE+QEMkQTI1SWk/YjM4Cit9YT9NTCpQUmtUTS1vTCkzY2BKJWJ1ZlJXcERNYFN0bnUrO3xXNFg4SURNPCQ3Wm9gd3dLRzBTQ0BUYShyU21LJmpsVEFJZTEwKTNnVH5sCit2ZWhwNHleYVlGeTIlVVBtLWF+SHg4c35fPTNkP1FkNElUSD9Ca0dJTz1ZV0lAZndFKSVQZ0dPazBxS2NIXz1UeiQ9T0p3c1d4XjZpbUhkCitCZWNUKjtPemlUM3k0fWVhb0xZRT1qYHtzJjVfRW5YK1hGUjxxaSE3QGh5JWU0amFHQDY3Q2JaRXdeSG5oUU1CN1ZDQWo2bnU9Pitqc3I3CislazskbE81dElCbT5fZWFzKnxLaEZ4XlNeWFlTUE9Tbz1PIT5qXylGVjl5TGJDUzN8Mj1jJm14fjhfNVlkRXtnNUYxUHkycGA8KiMtMVMwCiteZStLdGV6aiVtU0k5N0koRDskVGlDZSRBQWJIWGV+cWpDOyFAUERHT2pGV0g+MFkwY2xiVSpjYTU7N1FpOGp0d2sqaTRENV9EMmhDX2VpCitaSFJ0LXY2cXRabkJPRkJ0KSRSelJYKEhMYXFpNnd4VFZDMDtDNkxQdTd5KHdGbjAmQFZefWV1WjEmZnl0WjdYSyZgc150S012eDAhSHkkCituSiE/cXc0V1RSVSZsR0NwTXIpdlVsMUZ9OzZEYFhHYW44RjR+OVFsc3J5KDE1YDcqWjQoUHFgYHxeTmBkTSNjSnpJdkM7STZ+aCVEfVpmCistUk4rVEAyJWV1VDRrPFhqSEdqN2tlRUo1ZG0/MT0/eHB2SjNyNz5eZnR2X3I4a1EpNnxDZ1YyanE8TClwVU04YlJybkRManNgUlorTWx1CitPdGFpb1hFRm81WiZFPjZDfjxJYGZZVUVVbDJzPT1FSlhEdWZjTER0QShqaSNTK2pockJRXk1RaEBvLWdXWHpBQkBFKXsrTigrRVAtSFlMCis+OStecXchMFJ5Xz9AN1ReMkkmZmowXz5IP2I9SU5Nd2MjNSZhNTIwTEstIz1Sel5EPypOT1pTblNHWkcqcyRzPzltR0RUfHd7aGtYZ2BvCitBKE0rZDxaVFR3YTNuX3ckSjBVVWV9RyV6S3tVRjc4RzFyKDB1NTc+NV98JlNVN1YlYG49ZmdBeW0zUzZ8YTFQa0VkWlhtY3BoTHZqVXJoCityO0Ukbi1VI1lBaHZRNChoaihKUjJPTjQ1WUBNZHwmUnhUSFFLNmxjT3AtYjNTWXItOCRFanVVTEUhR3drbEJ2cT9He1JiJSlrMDFLSktuCisoTDR1NlFYPndLfCZOKEAtYTRwJUFta0dGUUMlaG4/YCF2Jl5LSk8kcV9KRFlKVEora0NBYXxHQzQoKGtGNEBRSlEhQ0FXKyh3NHQmKTY/CitHRCVyOGdZOH4lTGc7UFZlJTsocktsM2MtJT8oUDdVTkpZPy0mdz1ERHpkR3lNSWM7OXslLX40NUdsWjlwSTd0ek1jYW5zIzVCRyg8VkpzCiswMHwpK0l7JUk5WWFoX2xBcW5tblcqfDkkT2BaOS0paCFaV2I9bjN2N142ZGxENmsrfE9ycEJHdnYwY1JxTEw3dD5pVE4/YmYqe0p+Y0MmCitTKiNuSXF2KTNFbj9fT0FnQUwjYzFDeUIpYWVsSV54fiNEN1VEYypuSH1pMUhlQl81TThmVHs+RkROZ3U2RXxGK2RWS21rUzQodVFiXlFwCis+MlFiJTRsQ2xfNG93Yl4+KlRAcS1IZ2JseHRDMH08KVckVSFkN2AqPlhNWkFSVGlGfjU9QmhkLU41MXZXU0B4THYyMn1GY29MV1UqUjtmCitTZ1VfV0Q+Pmk7dEVsKkAoOHlpdGkrZUUwY2MwKE5zRzR2Mik3dztSMyhIUlIwYk9jWTtgWl5HIXJ5MUlxQi0mUD5FQmE+RitGZCljbSlFCitVM3NyeUkxKndUTSZ8NUB0N2RIKUpreDdaYzBfWSN2ZUdBRlpkXihwVn4wZ2JGbnxHSiYzPEt3VVEyQyY8PTxFNns5JWZFcTZtdFN1OHpkCis3KiEtQE1LezRGMlhDcEZ4bCZEVEptZWlsel8qIXdgYWo4NXBLdmYqPT9LcDszJiRYJDwpP09LM3E5ZlFaUTJiKEkzZW1ZXlYkMWNGJXZ6CitJS1gzZnIqSkN6fUB6WDRtMVA8I0pVbSRTY3NyPj1CLSVfdT9rUHBweHh8KFppYFg4KnNJSUc2YjN+JCVQQz0/SXt2Rz1uTj9qS1U2WG8xCitfQXRLNmZ7e1JvMD8xO2xpTlExaXFLT0x9MEBaU0F3UFZTKGJZXlZ8MlY5bykrOGheS0tAP2w8UnE4K2FmfHxjb0daJCNFcGctQ1YyY1BYCitCdVc5U3Q2a0hPQFFnTF5aU0dLPkJ2TitYJCpBZj9uSC04TWtCTSE7NjFxfTgwYVFAXk95TDtsPDk1U1ZPS31uY2phLVJMSnU7N1UmZ0o8Cis4TkgxXj1lM3EmNz9NSW1ZSGQ/NHVaZGRORG5mbndwaVQtOVJzbUcxYHgla1M4S0d7dldxbXYzUFMjZGJrRz0oaTVgQ1BAR0ZMX3AoYlEqCitobz9HM1NxTWd5fjVqQ0hVdXA5TUowS2RuV1YzNnFKdUVkWV5LSUMmT0lgeipzQ35BViFheyU3NT9oeC00NnglRCVPUFUwfUp7eU1nSURFCisrO1JSPXJma3p2elduYT05UXRyKj5Jfi1kKFRncm5EX2s7KERJXmooTz8xWntHT3VQRzNEUnIjcXV8fFJedEF+cUpANUZfWD0rb29CaHQxCis0fiY1UT05KX5McmZsWUROOXBvTCpsfDFHM09zRT17K0FkeUlhUjs3JCReNjRgODtuYloyTmxMJGxTWFFyKDFyTiMyYlI5TEtJOURkI3tuCitYKDxwMSUtKW51ZnlgJCZrKmx9JDduRU9ZR0xMLUJqIV9MKG9hZFVqS142QTFqQ2NeczZJbD1HO2R6fDdPR3QkbTxEfkQ5YjNIWTMwISZ5CistMEJrSEJjSG84a3RZWXp7ezZTZGJ9V3psV154QGdJQGlBdVleN2llQGElKUN0dWpDO1pueGhxUztAUWw1RClSLWFPek5YLSQkclhmKXZ+Cit1VDw7bGljVDI2bkFlaiNVeSRiLVUrZ1pgcWdXc09waTtJaHgrfTlJLTFtSU8tVz0mYGo9WUpvZDxnZnA4OVVeb3lMMSU8O2xkWGVnN0BjCit5fVY3WENCcWwxK29zYEVMdWJ5ejRgQkB0PGF6N2gySXlgP15ZLURVRmpUNXYpaml9LWwoYjhBQTVVKks5ezhhUUFNaXdKWntJUWxIVF5qCis9dngheT92MmFIIU94ZjdhR1R5e203Uk9PIXAqKig7ZX1FbSE7cnF0JSVIWjBha2dKYVJOWXs5dFNtUz9xfTwmdiZuUSRyMkUtRm8oKU85Cit1cHw9PFFnYHlNSj1EODZsUX5rSUs8bWpYRzN9P2l2PVc/M0c2YklpNzYldDhqVVl3M0pIMCZTZG8jITRsXns1UGA/K2ojPytGWmVQdVdfCiteTyk0MjlvYjVRaHs9ZzZCXiZ2b1U9Qn09QiV4WDFnR2JWIzcxOFEzaDlve2xAS0hMbi1Qcys2TkY0eHVCVD02JV9DeCQ0ZU5GVWR7Q1c3CitSU3x5ZkFHMUBqTVopKTFIbXY2Q345KmklK2t7eW9rfXxKaH1PdWJ1Szg/RV9iTzhaI2U0SHt3OXckYV5nMFRQbGVlTi1JTkV6azA9dSFACitWTTVYdHhsREUxXj5BdCpFblVqJWV+MHtEKm1AU3BRYFRpTiRjfENKXmhpZCNedUw4e0xjd058SFd6RVZmZEcpX2B4fCRwJExpKzM9UyQqCitYJjVETjNgQSVWaEN0e0FoO2FmIzd1XjU0dDI/e2A2YlhWPip7YjU0NkNtTS1VYTw/Ylo5X3JVNE4oQkJFNTB0bzBaNiZfZ2tRaiRMT3wmCitiUS1ISUFEdyt+bG1SSlZSOXE0SlUpaXVqbUxFd3d8NUJ3YHo2PGRSQSVraGlSM2x5TiV5MysmKEZ8e0lITVdiKktkUENQdmE0R1ZpV2JJCitfUDdfKkQ1bnlkbDExJjJZPDRGVDNKcGFkQyFXbiFJTHtAYnFaJTVeY0J4Yyk9TiFDe1JUUEVkQHNiOGdKI0Z9MXhqLWk3SlFYISFfYktPCit3THlgSUdwflVqfUBzeXI+fXluMmhtYTQxTn1KN0R2UWZPd3QjV1Z2Rl9uOyo0Q2pwTjM8UFYpZ0Q9ZUtkTXRsMFpaJGVGNER5aj82NFQ9CitDRy09bVlKYkFHXipHfHlyT05vdzUzMD9XIUAzaV5qUD5VaGdaZUYwcWtWWC0/dT92cW9KcmpgSEdLJDtmUVpSb1ZBd2IkbWdNUiVzYCF1CitAU3whcl5nYXxZNT5JZyFPSGxMO1BKS3NVe3F5TDYkLVE3PF4mVU53ZVdac1hPZENMWHFibUNrQUx8I1dDV2M/Qk9NYUV4MUFSKkZkQXdMCis1czFBY152NzlvU1BqUGdtVVJQWE87Rlp8TiVnNnB+aWF4b3laQiN6cEQ8PjBDKElAbkB3d3s+M0lPMHhJJjFEWUw9XipEQWRESiZ0ZEE+Cit5KmYrZE9LOCNNWG8/KW5CTlh0ZUtLe0s/TlI5Z2w7PDJHV2lEUTJJeDVlPmYxPUU4OUlXa1c7Y2VJdnZxMkNaJjB+PUhAY09aRlBNfiheCitLNF4jVWdJbGUjJn58YGJ0dDM4dE4oWjZ3QjROKChPP21uNjFEe2sqM1FlNXBVUjc7Z2VKPmwqN1l3KG1KITl0Iy1uY0Z5T3JVZ2dFJH5xCitGXlloQTFSYVU/P3xre2N4Ujgpc0hBeEEtckQkbk98fmJkS2ZZdVkpPUVuM2l1U1ZYdDFMS1MxbHMtQFp0ODE0S19vaHBqQmA2RDE0NU5TCit6KjVOWk5qJG4+O045QztZX1JYU0p2SWo3RXltMXNwRV9FQWo8WmZgTmF1MEtlaXU/UVNYb3hxb0V+bGxyNz45eCUzPUlSX1UmV1YrYXNjCisqT3Iyck4kRWUkJTU4VFA+X2U1U1MkRmtAMEFrRSglcjA0USs0RFVgNlAlQEpYPj5tMmtqOSRvOUhoeWMpdkFqK3xtPyhedmhlfHFlKSVaCis+TkxjWWxDK0I2cURaSVRWI05qIWctMG5fR3xid041I0FKc2tpR00yd2hWZmktdSRZb2Ztb0xZU25sQiFoamAxO0U3YmMqYWszMyEmeFM/Cis8V25JSj5GMW5ZQ2M+SF9CUWZuXnFoRmZnTVBqZCRFZW0jeHszbldmPVM+Uz9rUFpxdExUKl80ZkRNZWx6Jn13cUx9aUJpQkshRVYzfng5CitORmEtO3g+MC1XdHVIMndnVEgjY0RYQ2MxPzsjU2tiKEVfOzZlK3RnNHc7WHo3UEYhaGg+UF8kbzFmZ3s8d0BfSWJsPlM3bWBQfHU7MmEkCitRKExFeXR2bVFeUnhKbENiSW47V2c4UjNqal5JaVNfPz5fZ0NAUHFIJms3Zj97UWBrMkVAdjlTMjdQMSlSPnwwVzxTPkBVbWxMb0xGdHVWCittYVJ2Pz8hMWpkWTVTRkxHJFAkUV4zXnVJVCFCNz9UeTtgZnYqcyk2Qzw+eSplWHxlcGN6a0ktO3ViIXx9T31NKDkmZTM1IzswfjdjemRaCistQVkzKUJSWF99e3dwVnEmfHNOWllAdXpnd0Q/akdWWktmTiM1P3pEJSVTdzVkK1UwNj8odkc+ME5pWV4rPTB5eHt+JEdta25LRXdtYFVSCis+dE0mOVk9YVBEd317dituJTB7O01qN1p9Ji1EQENQNU89KmRCJSsmdHIhVlNvSkFoMzk8YzdVUmhuKW8qZT8wQHRybF82XkJDUHp4Rjw7Cit9YVR2MCohR3JLandWNVc+cXxUVmZgYmgwOER9MkxCJk81Y21XbVhUZF9VSiotLTUrU1V3NF4kdVJyeCRmZTVuWi1GUjd0UCo+eTVfeCRmCitpcG85c1ZIQTAoO1hnJXE1SFZYNTJKYk9ybXFUKlMxQDg1ZWsqUHZ+X3ZAPWxIUzIjITkpOXw/UkI/aTE5LWt6RWIpazJRbkAyeEU4P1h0CisjUylYc2xXYkA/PlR3dmRZLVZEamJjMDd2Z3RrPk5EPEdubmZDcm5ObmcmKzN8KzQjWGluTWg4e28lbmIoP357dnJFPH00ZGQkdCUwK2hACitQRkxgPWkkPGhUeDlZSWpnclcyOyhwa1NjSXA8IyNBUG1EY0ZwdEU9OyhvVz5jYz00TT0hQHx1V3RNe2Q7fkl9fC1xNG1HbU4jN1BUcmVqCit8eT97WntPbW8kT1g9QW5NVUluKDMkNU0ldX5id1ZhU0dVTDJMSE5FcXp2KG50NCNkSSlDfU0jdWApeTFCQ01OKVhgc2wmMnxrM2JxTUVsCitOSHwwelJWbD1zWXhqbERQTm5BQSY3KlQkWkh0MSElYnwkWDhSfX4qND0zbGdBc1BoZ0oocnRwNzZVO0k/Jk9OXzVRZlNeNVZGQTFAUnByCitjREpxIUd8U1pYez5CVz5vUllSJEQhWmsrVktoMyRfbDFoXyFSaTB6P29FfipSa04oWUladHV0YFpHbn0jRWMjITBpczcoT3oxPXBsOH1WCitwUyQ/YXVkVm4ma3ZAKXd2JkxaLT9palUqUm57JHVmQ0wqKGJ0R2FnR1AwcGQhMHJ1S151ZjEwNUk7VnU5d34lKCFHPH5NcnVgSm55NjFoCis4cExgYDlHSGQkTXAtQ1BmTUYzbDYrSUZ5fDU4anJhUzZEZmF4Zyh+bTwzQkRobypYM1FiQm4oMVB3b2B2RWhtVU4mJnNYYCUpJSlffUFJCisxUF5GdFFKJDQyN2RHZ09NbipqQGJWeUlmJkxsX2xOfHU/dHJuNjBAWEJOJl9hT3I2UjNaWXAhWTxxeGNtSU0td2NAYyVZYkEoaTItPzluCitnbjItVHdTMW5TVXZwMzdtI0BLb1d7V0AhbT18NEZ6U0FpOUFwXkNTQWVRcTQwZkhhbkZVVVJvTH5YfE9XdSZJU3FyRypRSmBpQXJWZXBICispNUJORWRtTFVWQnhsZnFMc3B+ZDwreyFVa2Zue2xXYTk2Wj1Sazc2ZW9HRV4/MiRfRlE5TXA9d2Ypb31TfTtFdk0yRUkhc1godTQxXnhvCit0RUtmJnMmd0tgczBgMHFHTERUczZMMzVOU0t3az5fKHdHNz5AYCZiV3F3Y0wta0JgZW57WDx7TVlTZm9sdV9wQStMRlFlbms5PnJQRzMlCisxZC1gOzhMeFYqO1NxUX4tbnwyNUt2ZXVHQUBNbmAzYitAbzFuKyVfKyQ7ZU1kNWZnIWUoQmBLIyZGMygodUxuZzEocnlVVlpeMDlhd1dXCitScFdyYFdHNitgZzkjZ096JUB1e2YkeD1hQ3crXyVzbCtieDdFSjBwWEooenEkI14mRSNuOCpic2d4bzhzbjd1IW0+TENEd0MhSGpHKHo/CiskM1A9P157cG8oNTQrO3dASjE5dk5BNWpxPFpjdjktKX4jNDw1MzteIWZGfnImSlhYdU99dX1SYmRYRWV+cmtGZTV2QEBQUiFQdnVtKj5wCisjUzBKSVR8RFBfUzs0M1lBczlUIzJrbWY+dWlMN2tVR1lAc0xZS0lBMlglUyVqT3tHUzgoTm03V2NzQDJ5fm49N1BwNFBYOUFgcFF4ZnEzCitaTCpDcVNaK3x6Xj5Ub25Qc25JdlZhakBqUDs7ZVJtUiZVajc/MiF3MD5gOS1FJik7TkIjfDVzYGYyPWVtS2RfREl3QzBfKyFlXzJiPyVrCis3XnJZQTU/OUhFZj9WcjNgNnFtUSR7djllcWtkbFVXc0h2WXpzYFVoXn5KZz9kOWVYYlR7ejFgV3pwVUthUUdWay1VeSg5fTg1IV9zQlhOCisrQ1l0Xk5aKT5pYXFQIXFsPzVRJjk3fEVxWVlXJG5COTh3KStPcnVPNHhhSGoheyomTWtnKylZfXNfPT5tIzl2VEBzXkF3SHw7eyhnQ3FHCittdUk8REFQUF8pYjwmalkre1FqRHVYI2ZxMTNNaFA+KUFzeGdHUEZxZ3RzO3BtUCF0MF5leDhXMFdNQ2ttMVIzbiNiWHUqNHxpQT9oU2peCis2O2R+a0JXRU04M3ltbV5WMiZyfG51c1FVOFhnWndAZUEla1VJSjF3dHtrSnYlLXZsTyNLVTRTY1ppaWVhdGkoQnRSSUFzb2U+T2libkZxCitJa2kxcUted145eElZTXtYWSkzdzNaLV9mfil6ajA8S0lEIzhxQ0JfOSF7Tk16a0VtakRpWU05eldvdkE0am0tWFZoUH07IUd4bDNeZyMxCithTiNjO3Rzd2VyamVHKVR7enBoPFkmPWVPNGY5MCFrJDZDVkNCd1BPaUxFZFByWXtxNnNsLT8tdCktflJWRHg8JFgofEh9Uj1VfjJTOW5XCithKHMzbT4pRkVveSNBdnVfO29yMk8wZSklX3hyZDNqJWNALU0mTSFIM1pJLStRRkAyKVo4U3VQK3xePngmaU1rTS1yPiRrej5pJn5+UjhtCis8SH1NNm8kfCEzNmwoZ1F2XiFtNz07MEs5MVEtSEheTnxtd34xd2RVamJNaDcrX2UhRFg2S1RGYzQofXtCPiV6a0JPSjR7QXN2Tjs/KjJACiteO2U1d3omOXNXQ1B+Ykk9IT5BQk10NUZpUkY/cG5GKU0pYDFgRHlEKn1Gdz11NUtBUDZFR3dndHhRZX5YeUskTmtaNGF9QEhmIVRpTkxPCit4LUJCeHpXV2ZxQl83fER9I01CR3tvdygmfUc3NFBPQCZVKHllO3g2PUd4R31zPCN8czBJeH5PZEZ2Nn59WEQoJVdLK0NOKlpBUl9XdSZXCitGJj0qS2liS1djNj1USVFHY2x8VlEjcyRXOWlEIzlmbklyJkpGdzk9cjtPUlc2QzhfbX0qQmMocjc1eGw/fTcmTlg5VW9HQl9MaG1DKih1Cislbnw1IXtsS1JMazQkSig1T3s+NEo8JDVwRl5NJkk3TVRRVVglcWcoXyhlKTVnRChwPENqMyNsbWB9NV5vSDVjNyR8K294bnVpQGBLNSpJCitPPTI5JWI2dWI2Vz02aV88WT5CQ3tzb0xsOVR2QTZpPlBYUyN7OFZUSGUrX2pRPjxvViQ1O0xpQSFFX04jKjZiZEhCO2FncUJuTSFyNlIjCituYWl+I3NNNCsmTnJaZz1xRTU2PzBQRE14JXtobCFlMD1YWDQxSCFme0pyRHc2QEJiXzxmeiVhcmYlcnQoRzVAUDtnK2plMykzfjEkPFFfCitIP3VTQnlFJFV6PGBuKV5weWdvZ01nRzReZjw9Vk8+N2R+OX4yYnVfaSp3aWolZDFBfmk3bnhsJW9DPEN9S3haTXQmZWBtb0YpYllBPng4CitRMXtAe0E+Xl9hfk1PPm9meEYzWjV1e2xYPVpSez1YemFCSEo4cn1RTn1VSk1nRDUkRXxyQ2lhbG1Ce3ZfI0kpUk9qcVlZSSVLT1ZFOFNNCis8VTVfdnZ9LXlCT1lBSmdSUXcpVDQrKWxxdVNGaGVQX2JJWHBSMyo1fiVzOTFvfGJjdW4kRzVwbUNYTXMlQzNJQ3ItQDMmZyNMI2RERl44CitoUV9HQHBWTH1RJTJJMDJAJnt7aD9MaFRrbEdhJWRLe2F4MEJAZElFLU95MW1zU3ElQjhSbmk1aHYwJmlScDd1KE41eVE1V01+PnUkdmZLCitxSHMmQWFlUmZscGd8Rn0rfTZTPD9ZajFMenthUWdYbDBLXyg8czgxezlaR3NkJTxgQyt3fik8cDR0c2dTNVZwNTNVUSFtPmhUbSh3PlQ/CitSXlVWRi1sMmxAJWdxWSFkJmgkPm10bSR8PEFsYXBnYWJxeUYhK2QxT1h0TlAzPXlWcDstN3VpalVZVkVRYmxzRXQwYHJVK2QtOVExWT1rCis8Zm1xKF5QeVRzazszKHErK1hnYSlEJTJ2Pnd1JH1KXnlBN3pGWnlgZEZndTtudHI4WHQ5VEEmWUp0KVFWbXckfit7UVRhWDVqN1o8Nm4mCis+fVg4PG5lQjkoayYqQjApRUNYYkc9M15VSV5vdT5vY1hhIyExWVB+QjRnZ35rR0d2XkRae15EMSRLQ1ZHa2QxJk5iK1k+emd4ZV9xYyE9Cis8O0gtNFopYnZTXkZ4Uk9IQDNFJnAmdE9gPH5xY2VkZiN1bzFJQ2ZYQ24oTmNqTlRxdShqQG9DMng/P2U5V1ZAekBNdEQmOSRKeC0jRSomCitvUyNIY3lhWE5wKHFWNU9UIWhiR20yPEhhT0RDZHdkK2hifjM1Q0ZYQiNfUHg2fE9xV1Q9Y2BuNj0lcnhPSXMySEBKXl5ld0l+ZDxKZTF1CiskTTM9fGdDdCEmM3JGbmZ4dF9vWGp7KFk/fWw8N1B7LThAbWVDWH5JJHZKTSF8ZTVBXipOSl8zKlVPMjtZMkF0QE0rVCRuTTJAOTZ2bElHCit5IVJ3KElKRTF1YVlLZjJpNVVabk9pOzE/MmwjbG5fWCMtWWM9TTc4djs0XyhfN2Q/Q2pmN0BoVG03OHtpQkJeekApeDJARWZBfEJtQDF4CisrP1EwYGJCbig0JWB3RXdpQnZgPjFZLSVIVjZiV1poZ2pfY3M9P0lsZDh7PU0mNHkob2E8eFcoNippY2ErQUlfelg4YDgqUVE4RXUrKk1ACishWloka1JDNE5XWGokY2RLUzRLaFJzMmlSaW9aY3ZscWp+YExjaEtnN2B7VnN4UWpXZHdLPmNUJWNeOEBHMTRTZGFnRnR3JkZGKiQyMiooCitvbk1IVyNtZHBoYzZgcG80aWpxQ1ItQSYjPiM8bEZPSHtuK2FGMyU8S0RTb1EyYFpoYCRocTMhRnN7Z3xZKTFEKztNS14mRmBhIUhzT19YCitqLW1qMCFiMkIhUEY3aUd0b2FgfnVWV2BeYTgjNSlhYXg9K2pzdmVJTVgzWmtNVHl2LUBCfG1xKDl3dVpYQ2UmREdBP05HVlFRaWsrQzJZCitsdWt1ZSk2O1BXWEZgfmtnSFlVOzt5M3kqfF88OGUmZmIrJDF9Wk5uNmczd3xqSyM7fSleYTB4VGwyX3cjMSVXdTFTQ3FPPExNckVKdCVxCit0Pn1ofTcpU0BMRG49P3BfWnxPamdNNHUyMGUoeGdnenZjVGgpV3tLfk4+WTxtJXN0ZWlKbiRUfD4oYihPYFZuUmt2Vjx8JHNRV1NnPTxKCitGMmNuISt0O2NrJWsyZi10bWdBUDMpZXJDcX5jeHNWNk9yeEl2bT02c05NOytQQUphV1FuVmV4RklqXi18UmVrLXR0UD1eNHt4Jnh3RkQrCit3O004dGwkJkJGN04+KzRXc214K2hQWUVsWFVxMz07NnZnMVhUK2kkeypBQjlGUUZ+RmVRXl4pTDJwPTk3eGVuISQ4c0FocGheN0d0dig+CisqfE42YlpxdjdBJF5BQjNlSTA5ZlczVUR3XlVeR2NtRz5SO3I3Y3xWRUlSMj9EV1Jkfmk2byFHZUYyUjckcG81ISU4S1oyU1hhWmhgRiErCitGR0tPNlg1a1M3Nnk9NT58PT5oJjM0ZCZDSyNOfFVRT0JPciNZR28tfC1iYitIXzJ8X0gjYEJ9azwxUEJfNEooN1Q3T3xSZUByVTFyV3BlCis/PTFBdFU1cEQwcjE8SzckYEVtXmZPNkMkZT95YjZJJCVmRHxOd2YlVTFrbU54Ym0yS2heanxMenBpNnx8Pl97V302UzRzRmt9Q2QoXktZCitPRDVXMTtYJVlDcCFKOyU0M1B7T0EqLVV5K2tie21oZXRYVVhiNGQkUig7YGRPeXxxKk4hWCVPNFlMVypeMnNiM2lNZU8pVX0yQ2pyNlFKCitpdTclTD1xRFRHdyk8NjAzZTBnJW5xJHN9Vjlzd2M2eiYlX0RIVmFmJFZzNmVrbmkkVWlIWE1iPytwVVM2U1hnLWE3emY2S219JHpFZmdzCitzVGxrVH1fU3VSaWBZSUFrJWU4WHRPZj5JfGJNfmJyKEM9PHdiMzZNdFh4UHZ2Yl9RJWdKUGNhWD40R2A7SjV7eFljfWA5QUBZcmEmZ2cmCithR20kdWdhY0RVQVBiJXlSKjwociNNT3VjNWlITjxveU5UZDNDczlsKjYqJWxfQHB9bWxuYEslQVA7MTFHbUtGMThmN0E9b3RgQFlgaSZfCitubU9rdkV5elo2NjU5V3NpeGM0Y3F1VGNlNGNoMShVdDwpTXhQZEQ0czN0Rj5Ab2deQmJtV3dRWFE8e0RReHJwaShwU1Q5PW1sN3tkfUQ9CitOOzIqJit7UlZ4KSZ9eW87QEMwV3ApIy1wZlE3cHh+UEZ8SkV3Yj9fWnRgQUc8JTU3KCVyeTA3Ml9XY05VJiFWczxTJiUoNjdneW9BZ0A4CittPlg+bz1zWmN6Kj4tTylIUj85OU5JaCliMz9DYllmZTIldFBSSWp8cFdBQm9aZTZPWCh4WWJeTHduWHl4VEZHNjl+RFJVOWhXVCtrcUxeCitFPEdVYTteeWhzS28kODhNVEUxNmV1UW84S2M1ZXE3LTtwOVJzQEl3NEREI1ZUZnZQbXg1O1RgVD1VIUVrPHhmfnQtakRzXiZZQj9iSyVCCitsajR+TiFqLW1ERTZSNFc8eWdmUGA9SmNaQ3hmYSptNkhAbypIVn40JnE4S0wqSzxlVEtQUmVpWXw5fTdUeG5sUjJSY1BlTll6THsoK3htCitueCtNTzFndnpDMyZvWGRHJjkzcG50M2M/dCgtTXFHMVJtVkoxeyFPeWAxV2I/MTE9Tzdia0pWN2hrUT8kVm5IUmkpdnRqbUAmYEx6NF5SCitvVXtiYF5jMmI9YF9kcj1jPDtLZW08V2NjJHs8bW9OdDN6JXF9O1pFTnd7RUpCKnQ8PFohXntHYFJIYyVUMzdvYmBQRm9INTVoO2tLTEFlCitvKm9lX3l8TSU9PDFfbTN7ZkRIKWdgcis8T0dhRVo1MVZqVz8+cnU0e0VtJkQ9N2ZEMD8pQihFIWB9V3hvdGJSQjdlUVJ5cFRqWm52Q2dKCitXYW5zbDZDZz8wMGlYTzBVYUxtP01yQVU0WlFefShmSnZVZ3NYUj49TUFeVVd3b0t2LVRgUlkpbDJTP29SIXVXMUQ5P093XjllR2ZaYF5uCitYNlBsT3spMHhPZ3UpMzcqaSZLWEolNHt5NEtBdzFsYV9eTzg7KG9wcXJYVXN9a2loVVJuMG0pYDZsKTR3YypIeXs1SSZCczEpeCFlY0BJCis7WU0+NzlFZVM8SC1oPGhsV1dAfUVoX0NxWDQkRnw7JUxJWHVfVGU7VEo/e303VkV7dmJ+SXJ9cUF2STBnR1BQQypFbUJ2NmIlNUZEVz4xCitTbmZsNnBFclNmeCQyZVFfUURVKEY2KG43b3VwQGgrWmQ/bSo5UlQwbGZeIUkqXzEzTjNLIz4lYk43KEB8TWV7ZkM7eCtNPVRnO2ZlKmttCis1bnRWJlM5MyVmVXAqYitSaGMzSno9NGNGKTlkXio0QExrKjtCfldnVnZJQHRsQzJ0Kz1xZ3ZxI0dvdyg2UlVhITRKdj08WHZJYn1uQ1okCis4YUNpZypTRnUxQm08SFhtd0pyJGc+JnI8alNNZ19vaWRgb3dQJDQyTk1KayRnV0JQdzdQfF5NQFB8PHp7UkE5fDx2SCEoRFcleyF+VyVACiteZSVFOEdXaClmd3Z5eTclWiVkRHt+RCR6V195MEBGUnZYeH1ARiZsUyspbn1APF5DOUpxJE5IRnpZUk5vbEdrI3IzJSVBcjZxTXNQeWI+CitPR05jQH48c3BfV1gkbzs4K08oc0JOemIoLSMxNTQ3MnMmO29GRE1NUHA+Pn4yQ1g5bThXazlNJEg4XjdJNDBhWG8zUFJDPy1zaUBQKipACitkJFBXK3tlK31LZk9CTFBZd3pweSh4ciFVYjlNKCk5M1FHJkclRVo5bT5yZHc5O0xeRklsYHo5RDV7c3haJVVZViZqRUo4fEp1YEVLXjA8Cis8X2JNKEtiNGR3S1N2Qig9SUp+VGg3ViZWVHNifHFQbDwjJjI5SENmQFR4di1YcVZabCRSWUdNeUJaQ3JEPnMlMVdXfF5UM2tyOGQ/REk3Cit9MiZhfTY9eSlMUCVXaSkodVNBI2xgTDteX09NIX5wS2QxOVJBNVNjITJUO0lmSE8kLUhjdk0rTGAwb1FNXk01bD9uZnx7M1JQPEo7bFZjCisqUTt4U1pUN29MOFcpb15RY3NKdUR6Yyk1NjVGcENEN01SJVJpaDVxVztNWWlBJFkrcSl8KEowNzRJbT9ONXZrZ0NwTzdyQTRJPnxjbChXCis0PmY5JGNIcD92Vl5Ld1NOKnJ7NEF8ampPb2RgMm1hPSElR0l6UEI+OGs/JihUNHVJa2RsdnEjP29FREQ1JU5DWlFhVGhlP2MoJjMrUyUhCittdn0rdCZ2PCNqRTAyY2F+Q2hhUmdZMTNTRHx+fDY2MzUkJHlLeDFFbGluPmRPPGZpMlFrRHd0TW9gT1lDUFFCI15nRDsjcFJTYDhJUG1yCisqdH5qN2cqV29OeWltSS1YcmN5WSg5YERid0F8QWY/PEg0M19OS28pcWJuYTQ2cVFIVVBBNmVVSFg/aCg2OzdpYnMmWjkye0FNJG5LTl94CitzSlUydz49WjE8KGpGSiQ0I15tfSN6PDBheW5jYXByVzJpcmxDQkVQNngzUzg5JT5qTV9TQU58Ml9qclliNWc1ZzM5RUVXZHAmMXc+UD0rCis4OGhNO2lAIXpxO2Y0NmZoPWkweyFsUG5RcnQybkpoQThUZWBkYnpZczhpSXFWRXNRO2ZeTWd0ZTtSbjttPSE4Rl5sZFlyQkRUPEkjZHhlCitDaTl0R05gRDA7ZmomM3s8eDs8fVlYTFhMWGVyWG0yTWxYZEtlM2VwWllDaDdNNEVLPipLKUE7N28qaTIpVzV5N25yVXtWb3RDUyh9a1cyCis2fk1FVXEjXm0xP09aYUk0eUZ1I207X3pBe18mUGFRSGZyWllZdHUhV0hVfT1EQVlwX3gkdUpUKi1iVnIxZEFAJTEmVSpaKmIrYTYoI1F4CisxITBxUEkld08wN35nOFZgNXhvYl9ZZTwjQUxCaXJ4QiViUzFlSnoyV3ZjSFclZDlTdCNZSkBDLVE0Tzh2T29ae2UxUjspS0xTfnheXzQ0Cisjd1o/eUNfUSMqQ2AwP3lDYCF3I3AlLUlSejMldGBtMV9JOEQrWGZBVC1UY0tGRUJfMyh7RHhobWd7ZWQrLVV0RUtxUXFxUU5hPkNtaisjCit0ezRHYyNMXjhNQT43UFEtaXhSU1NkT0kkcz56OUZZPjxnZU93KmRWPV9SJFVmczY9STthR204YCtlNyQxJFhxTkR+YmtSfihTcnYxakdhCitzZilaYmxIKDNwYio/Ty04WnxaMH1PSWozLT1mJikyT0hhVzclODd2cmlBPy1AcUBUbk0qJD95ZWd6JXBPbz5zWWdqVG1hWlpRXzk9MG1sCis5Q31yWnU8fEsleEE7cUl7IzMycWE3KnRHMEhiY09ORSNaN2gjdDxQeWRSfCY9XnVLMCgte1BvTTFIYEh4aER4cnNHUnhVRnxhSEBWMDVHCit3dXlSZTxhdT1LO09MSCt0M1lGbkpSUVJhQSlDLVNvNy1rSXZ6aWBESkkjWFBjNT9YWUM4JGBzcTRsfClaUyFwNE15dn4wS3t3dn1VVjVjCisxY1p4RUNVbjhJcWFycjNxdFhwMyM8Z21CMVhEXjgpKjNzcVFkeldsNSg/SSpGX2NIVj12OVF3em0qZF5PUFZLNGdaWHs8SmNWZXNGcSRVCitiKHFUPGNKRiUhQEJAUG42O0VYSzFmQTdLM01XKVFDSDwrUD5re203WkdxdyEkbjJATWQ0Tn1eITUjVCZYZ3g1MzVOajspblQtZXI0T1YqCitNK1lAfiFKNF5PbTJVVjtvWSpidSp4OWFvNGsoOT14MzZfMCZPaEI7TGBZdWV4TVREUGc+S1dkYUIwbWU7JE1wND59JCRkS0R8QWtNQGxeCitnNyhgciZ6QEQhcmpTej9gd0tCS3ZObmpObW0/MUAjSXp3WlFNNHFhdiVwMnEyZ0VrbkItd05eZ182c3ZIYnhTPUlpIWtZaTFkflI4dUJLCitfSGNCZE4wb3tgQ3l7Sj5SY1JyQ1h8Qjg2XnlPak5oTD1qVlU4OEhJZWEhbSVhcEkzLWwpU2RFeGhMQEI7U2dvYCVpbHQlYjRuaGk4QFV4Cis2UU17QHQyNEQ5VEhqK1lqJW9DMkhKb3BeYmZ5cCEzPT97bHhBJCMxMXF7eDE4dkw+dGhfVWl+NzNKOXdvZjVeJmYkb3Y9WlojenJBTlY+CitjUSNTaHs1empWaiVWZmcxZXtnTDFFc2FvYWc0dU1CJlJzU3U2VVpXfnRyJjIoNWBWMGVzSGVeKz9nejMqfjB0QkdQZj15d056OVh5b0Z8CitvJE9XbHV8QlR6MGRCIzNjcXxGbz9XIzB3JmB5Pk0heTZYQSoyQSpiNVNZcmJyM3tWTX5UdTZ8YDR4VytuIUVqOD0wPEc2SURIWU1yMnE4Cis0eURrWT4tZlpBcXpBcztkUjFxOWshPWRtdF9qQGhKSDg1Y0p1Tzk/ejZBNUZTfTAlKlNYaGMwU05qJjAkSCskcT41ZmV2WVVJZEgtIUhFCis4UVVDWiZFb2s+RSg4TFFAOX5IbWBtWThrekkrcDFjQEhlIyh7bzswXnBsPDE/LVlBVDcxVEE1OGNzZHhHZlMqOFl0OXp8JUoqZmYwT2hpCisqYHRAWiU5fFAmMXleS300PUFYRj9Ydkc3OWBud31ALSNKVShjdjNAZmIrfHxlKFM/ZUxyYldYZjtATH4+RTB2UDF0VCUyNCRFYVAmRSFTCitUNTRYZ0d9aTBwJFYraTZDYCVKK3doQipzOEZrQTE7SXJvS0opKVJwKUJ0MVhqYigleVNAS2VecTt1UGJZLTxtQmBzK3BYKWNjVyRGQUd2Cis4R3M+cWshbiYxWGNiI3Y2MiNnYXtkcVN4enxuRD81YytqO3BwNSM/a1dgO2EraUstUjdMc0F9eUlHdTQ+VHheO1NBfTRiNGRNKygjdjFMCislS2VZNnRXPFZeY0teekxRdEsyU341ZGRhIXFYJC1hUlY5JmhuRCVfanQ2I0YyZG5YYm0tX288fH1Pc3d8eFNjKlFiTzs9VlFjZmU4UH41CitjRkNLa29rU3lHSHUpbCUjWVJyfk18NXUoSEdOZVZXfUBiWm9nSkBnMjlFSzIxLWljP0dfRWgoY092Z2NMQ3F5PnkrKjgjQUl+TCRlVnl8CislPTxnQ2I/dVk0LVlWKV4ySGp4KXQ4M2ElXjdwMCRRJDkkVHAwPDZSfnZLOEsoclk1SERDVEB2biMwU1R0YjgmYSU7RlJXYTk2ZUx5c2NtCit5PTxMQk0kZm9Ley01aE5TbWg2e0F4RXhEPzVjZ2VYOUVEVnBUezdFYWI2bCRoRCZCYns+WGxiYzhMODshJG9mcTNEZHc7MW5fZncrWjNvCisoLX01djB6U3B4SnQpQ1Q8PWJkZVE5WlZmNV49SXpJUmRxVkZqOVg3cVRjKHpsUz49MkJPO3VuI2xVVzFPOGpZPXVKdWspPjRCaFdTIVlJCis2Unpfcnx3PVFRTk1MJWxAIW1Xc3FvYG9EaDBfd0ItMVNkaiRuOVBQTngoKHlmJTNHPl45SVZ6TWJAa0VsQF88KyRwQj1wU3BhKldtamhgCit1Rl84eFFjeT82JnRwcUFPOD5UR3Q2cDBXMFZ9bTVVVUB8OExWU3lvaE9oTy08dUo+dGJKe1M8a0BMZFo4fjtTQSVKOzJaPUdgeEU3N3BwCisjSz1feDFBRSFIaGQpMlF+OT19QGNoeHVARk5lbEBCIyVLYSRpeGlGezIhKzg2am8+KUwwT3YqOyRMVVdDLUFqaEoxVH1RXjBqNXtZVmpLCitnSjA/dCtqPU5oRmwzVmRFdHglQmgtQEd9RX4lKDRZQVNCeVh4OW1ROFUoS0ZCe1U4M1VoZS13a0Vqd01lOG9wdVY7eUA5LVFecGx7ciM0CiteeWlVbmV+OSkleXZzMCZvekxYYzkhSUJ8UVheJnA7IztqSWFQWFIwNm19RVB1elYjV0I0YUg3LVgqKSZjVjZvUiR6OShPX0BzQDlLJlFSCit9aj1MIyZgNEtOcEZxcXtFJU4jI2JNO2A9JVVWfXsoTF9DRDExe1JWYypuOT9rP0pOYW1oSmZFWTltU09acmkzUTsxUS1TJT5JOCNGKDhVCitkPlFLJipqY08wQnxkNEdSPXJ5KEYzWChMM3lnZzBQOGV5el89M0xhekckb05PWUdeRjVYSkwlYFQ2aUk/ZmZjOzQ3NjBmcDVAMHt6M3E7CitGQkQ1QGRtdFVNQUJ7YVF9RyohPldzJE5QLVlTWH5gK2stZXU9fXM9QiUkWnQ2NUd5fT1XSmczSGc1OUIoJU02VHRUbkMpIzNuKjgjZmAyCitlWEUwMVVYeEc3dShuX0JMPF5KSUUrdjh6RWYmNyYwJCR9dipkTz9mPmpFLXUmR0NzR1FKVFI7eSFeeFZYQVM2PnklPmFPRjM1czBKQVQ+Cit7IzRYM0RiTHtvUT4lNUJaaT4hcE9HfGVzdUF2QjRSaWNSenFub1ZVRztib2BrOz4rUjBOYmZtc3FKXnpoPHBaRiQrV1JZYWI0PUdEM1BHCit2JWYxV3l2SSMwRVc3SGlnfkNLS2QjaDNII2RtTTRWTXB1T2UhUkR6YlZpUHVGWTEtaCFaaiRHJEtXcXtHa29rZHlJOHZ6SF96fXtaZmJtCitFb0Q3VzFtIWZ8QSMmcUpIPHA9Xig9SWdDPzx8KDBXQ1NDUSFyTyQwXlBOJGxfJilsMmJYVz9+Z2ZgZDdDQUY+ZXVOQn5NeCU7OShUXiR2CitZXnt5blVjcEAkX3pxJjZ4enVwSXAtYXhDKGZOdSVyMmdgK1RiIXU3dTtgZiFScWp9UH1oP08reUttfE8/JW1mWHchb1hIXnZKcTxrdFRmCitwMHB7VUstOClVcGNsZyppQkRPVE1vJERFTTU3cU1obXpvSGdAdEgoO2lfRTh0UWRCcH58c3w/Z0V4aHVsPzM/RHR8PFdXNT4+fXVYNWckCitxVU0wK2swdXV1ZSk5bWZCWUFMdFZ+SFgpc1JNKmtjaF9SeXpUMlluTj0wQmdPazBAfiZ3fUt4Qkw8JEZCaXhrOVF0UTJicTdJc0I4bFYjCitPWll9amslVm1FK3d6UnhTUD10Sih+MzFhXzwrWnhKWU01NlQpKzJDbjM5fTxTJEopYFVqfDx4ND8+Nlk3ZSpWc2tgVjMtZmVDLSlNYTw9CitSKlpyS1Mye19gPytufEREY0pgRVRYO3RUeCRkMDhkZzYwPmZRb2EjOWMzbG9ualNZP2NIOGxWPUoxfWRMeiVuRCtOdGdJM0pERHBtRH5OCitmJTwwVipNR1Y7czRSdDNDLUU3V35RQ1dkMlQlTmd5JWRlLXFJZzZ5UnItX0N1aTQtbWBQQVhBT1R4TURJci1JeFJYU2UmQldfXzw3V188CitVOXxNODMzQl85TGNBSyZiMkBjVlI9QTFueEhqRyRsKXJEJlhCTkUpUm4zYTQ/NXtNPmI1b29jfD5ucTs9bFYxVnhEK0RIVz92Oy1fWDwzCitRVHYzfW1UNDdiUURga2VDcjV3IzRVXko0UzxLNEtUJEw1VmV3TSVAbWBSa2NOVkdhZ3U9SVlWeHgmM30jaShQUn02Ymt7QjQ+MDN2Q3R7Cit3NWZgVV9pcm8kdTVfNW1oMkl6b0oxZ1RUY1l6NFZuS0pBMCRDZnI+WjZAd0ZrNkIlQXBCdHJrWGVhLUthY0F7YEt8dmROX0pTQEd+aG9ACishMlJwTiV8OHV3I3c7JDZ7T1BNOCpVYGs5NV4jfiVTfDJ+PXdvZz09Xn5EKXx0cCRjYz1JXzhuIUl5bUpPK0V7SCpVJFBRJjU0M0VZemItCitqPk9kJjE2T2dZRCVmMjNjd0pyRShqdCZtSzRxZzhsOXFOcz95aTZfMjQyJEVJKV4hNCtfflVlYy1JU15pVVNlbW9hQDNuQkYpZTNnTWQ/CitnZlhEPiFFLWRMVlo8bT98ciV0XmZeeWlpRWdwTUFLV1pEPmN3PCN2d0Z0P2NJX092KEchaioqYkg9YShybiFtfnA3YXpuQmRldVc5T2t4CitgPnJCNndoKzxzcnNBcWVVbDNJbyRKNjM9aXp0K3ViQHNGN0YmJU1XVihJKU1JTzgkQV40eFheYXVzMUptdi1eTStZSyN4bkRkJWFhcFA8CitxXjZzRlgpUj8tTFUhYEJPWGpfKXZ9fFI8ZURDcC1vTDY7aHckWDNlQFN8PkdzN0BRUFdhKTgjU0c/enVYNkpCOEl0Ym9NUyRDamVkT29zCitFZ2ZEPHEldkdDeSR3em8qcjd2ZmMlcUkpYWIzMjU8V159SzxKbkwrT3c3YUFXb0EhTVY3dU1Me0ElamtYc1RUUDgzOWVgZ1dmZENEfSRhCis1KTFab3o+e1l2TENodzJKTW4tUkR4OV9waTVQPFc5b29tK3h5JWk8I0wkXzJiaVNkaWUmaSQ+K1h1aTEteSl7ZyQ2I1ArRTtoTlBpNWMqCitYLUplPF5RTTk2dFI9OGhXclQwPFNMQ0BDRVJGOEdXZjU1M2hrSWlESykxdl48cjZQfFkpd1RyQW9hcj0+Tjc+OyhYUjh8I1VhVHpRQWomCitsQ35rUjVtUE5zMmEjUnpkIUNOJWhXME15Jjx8SGUoVDtMb0ZGP2dOV0laKDFRN0o0TUtIZTs3O0E9N1ptNHJKR3dse0RPSjlaaUJIQFk2CitjYFFCO29KaFEoMUlUbV92b0l0RUx1a2JkbHZ+KlljQU1rbiZKWDI0N2clQ1NoPlI5MjQqKCViRiU9ZTBxdm9fTz5YWXAkSEZzOUlJQHd+CitMRj4zVjw2PFgrPktPVUJXUHxmYUtldzlrcVBhdEx2YmM+Q1ZCJGBfckh8dWROeWt+M095IWEqSG5AbVU1PUhhMWU/dkEmO0g3Knt3dFJlCitmIyNKUV5tb1gxPlgkUmpNYylIWHRLUnFRVDdyPlBkYDNKPDt0ZXFoeWQ0VjRedE0tSFZ6Sz5LeEJmTEs8ViRCemlFLSVKdEVmeXd5YHdRCitSeT47TCRzPVhLbnhBOHEtNUBXfWE1IXVwQHoqP1R6ci1GMUlSNFFZbFRWVllpb0I4M3FNJjUkNVpncUppQ0NZQSojTVohMm1lUUYhSFBUCit3IWxYYkVLfjNHemM9JEQ0eG9BZlEqRFM0dVUjM1ZKVE4tUkU1R0J+QzQyWWYwQTUyciNJaUd3P1NOZ1ZEaHk9MF5DKy1kXjIpZiV6V19jCitFNXo8QzFqckFwTSooM3llN2VCWCN4VWRnc3hObkRjR0xDMG9pSXYxPDVyPXFVI3t6NjZgPyVsPmgtQVRiMEFrMVBKWktzejg+bExJPXdfCitwIUlrTGBSKHQ3Tm9mRjBENUN0VC02PHN7NlNgP35xc29BbHNHN1UpPkYhZjJLYCM1NCp0eT5QdDwxO2dWYFFRUTYxUW9lcVQtaF9BMjJUCitFZ219VVNBVGFga0trNyhwc18mVUxUel9ocF9vaWhqQSpzQkM/NiFlM2hzfmgzRypYO15AYUckP0RTZWFRe0lFPXVARTt7czhZPSgtRnAmCitCX1QqK084TmJ3I2FUM3shZVRUN1lYd0Z1TyM1OVJuUzNpZUg7ZG1NfDw7fGBHaHRAYD5sRzUoJEVfNGw2Vy13em1tQUImO1MxYEtpQUp5CitKYXVteDdMakc8c0pzbX4+aCtnKHVwalE1fkt9djUyYmt3VUFmXnZacFpTVTQya1A7eVVUQiExJnl5cVVUWTRtfWc+fVVlIXYqNHFQemROCisxVG83PEYtSHBgRUsyfjM7ZXBQOWF9KFVyQSFURz98NGdYbF53TjV0JG89emI0Mj50bWZ2JFYmVj45TzR4WWB7TDc2bHw/ODQ9SjF3SHhWCitKJTRJZzAxMDk1WHZvbnpvZntIS1EreSEkbkhoT2BFKWN5RCVJRFIxO2NtZTExQ0FHNVRmc3lKaEtxKTNZeis8YWxacnFOKkEzeDB5dUQxCitucHo2ZHlaZCRQO09xMExZd0x4N3M3Tl5VYXVuQ1RPNihII0NWYSEjdlhZND9AKSR0T31jRj1pRnVBM21tWFQtVnRhRnE1cVl0LShNTHo/Cis/cEkkWTB9OTxEOHozIWoqWjRePXFtK2Y0fDJ1O0g4NlRYYTZOKDIhZUYpfGwrPU1tV3FaPTxzdCtfcEBTTyZ2QGFzaiZ5MHlWYD9VSCFgCitZbWRvSH5NKWp9azNpbFFpNGQrbExHSjNiR0wkPDdHYjZHVWg2TzktSUV5RiN9Vk8kSX0mVVBSeXtveXkoKWIjVmpWO3txY1MjanhhfU5HCisyZ0peIUc8fnFSOzk9X1NzUl9URjZ0Vy1vd0xpMDskOXBzYHJEJFNHZzZxYERDS1hCdk1hYllySGYpeWRSKkpAMmxTI3FYJmEhJXVzTlFKCitCK1NPWHBSSnBuendxS1VQMjE7X0RXWEgjJDwhVHBQTThzSGZfZ2xXbjJOP183amxUY0Q9Jn48S0syWE5BLVpoViVBMTFrUEVGJDlQUzEqCitDP3dNX2EoS01rRGYtPnhwTis+LVl2RCU1fllWMCFZUSU/fGk9dTR5WnM+JTZ9P05BUWE3JUpAT2hpdmNpTWo5b1RIfl9FYWBkV1Q1VHVICiteemwlUk0xbXw+cDhhT3hHN0hENE19anxYJHItYEBlQkRJd1EqSWRAciZPPVFrYjdMMm8/ZGRgdnQ/VnZ6PjZWZzwzJEF3KSQka0xJITYhCitTXl5PdF5vMj10UCF9NFolZmY/cylOYmtGKDR7azd0OWJ5biphYzRvMmlfczd1N2FPMkBGPD8lVG1PNi0ofX51ZDhvbCtAWklhPHxNemdZCit0WGZFSH09PCVKVD1nOTNAPWBINnZ9cU5Cdlo/SW0/PSt9YE1OaTlKZSpFOUlgeHF3Pk5eYERPc2dLJU9gY2NlP0RwS3pFT1FzP0JlVjxkCit5e2xNVyRHKmF8KkU0MmxIZn48ISktLXlXKXBeZWBePEtCWnpLM1R4enp5bHFESURyZ29FVig7e0VncDJgUT9tfTYtSTZ6PE5hIXZ1N1NpCitVKz0hM2N6JXhBT1libTBfJXtfezV4fFVZMGMrYFZPZTU7eFprTTQ0bFhIbHBreDBMP0NANFZRamtIYVBvakA5KklKQFNOJVBhQiFhd2I0CiszOWBAU25TU1U4NCFMZDk0V1JzUXFEWTtMbU5rYFZEfF9HSDhGMXlwdkZoa0JQWWIhLUlSNG9uaXxOSUp8X015Vnl+YUh6NGckUFBCJnNDCiskWEgoZWlEeyFYN1JNXns5cmE/bmB7Xz9wQUF3TW5hNW9nX3dgYVJBaVJXRHFhYT0meXkhTWhOIylvbCNJaykocS1pIVAtU2VfeCgjaEJsCitSVUBPV3VMeSNZbSQhfSZVKXFBRGJ3byRSJTxDKUZqT3hxXjEoYmNCN3FTbnBEZ2pwSSRrZDVFTGE8S2hVNSFVLWc8UCY1OXwhe1lJN3Y5Cis2dEEmTE85Tz42cyViY3F3bzt0LUBeY1I5WlFrOTdjQjkxQjVibjR3Vj5sd0BHWU5MOVJSZkY2RDg/cSQoX0JBKE5NeXVReE4pUVBpIWtqCitCdG44ZkQ1STl+YExtWnAoeC08UFBga0t2KzAyUjhxUVBsdm1FQk13TztWWWp2SUB2M0A3Pjw4fVdjSWlKJF5ISFJibENrYnVERUIjVS1wCiswZHppV1Z7MEwtZVJVekJvZ3YtPlowXiFJO2pxVXJEZHA4V21haHJqPihGYVBxM3trUStQe3B+OzZVb2dORVRSencybD5OZSRQMXoxdl5VCitEK1RvOW5KYGBsX3NkVlE8bFl7QGVaVXw5KSR1VS1wbU5xa1N3cF87JW4wNFo2KChQe1lJfnRNOWtJVGVleUR1KW1kO2A/YHhDXzhAa3t5Cit9YllKS1pke2skRmlJQ3RoZjdVKzJffUA5O084eFlUMiNNPUpGJXU/Zj9JbWA7fnpBKkg/bzVefkVIQWVjfFh8VXApVFQ3WUJjTDwhXiE/Cis5UW88PnpwYyttJWVTIVhYODlOK2V8P2VJYHsme1AxTmRzYj8xO2E7ZV58Yno5fGpVV01jWXtsKzhxbHZyQn16d2dhOVFZQ2l4NDZmb1gjCisqMTNMT3kzX1JOK0FqfGJCK0ZsU2x6RSpybFdMNTU+MDVUX1d6Kmtzc0BgQmFMNnNUI3pENXpiYktubntERStYayluNGNBO2ZjZ2dvJTJwCitUKnd1fWhTVjFYSVhGR3wtNjcpR3JYc2tMIUx0flQ3alRidXpMaEJPOTRuIz1ofEZoS043MjVNIVgyKTFeMHp5KElYaT8kYHVodU1DJCFzCitOdXlPfWNzMzl6TWNWOGA3K05sLX5MKWlvaH5UPTxtcVRXKjNOaDJPUXVnbWd8PV9iSkR3RCowRkpmcj9SXzZMRFEoPj9nR1ZmYjVCcmpQCis/Zk16Qzk4PjA7dSpgI0hTJmlBc191JGMkaVQwSUd7d0d7K242XmtrcVFBSzg9aHQpPTN0TUlDclNzKyV9NDlxPlFgWEFTbipjTW8zI011CisyKHpYYkJgKHAjcGBwems3TU1QIUdCZD5KPCs0RWMyfDZZSUlvMGV9KGpvPVdyQjUqSGw0PUg+Jjw0RjgkQExEVj53YyUrRj0lcHFGWEYlCitqJjdLSyo8MzhWdTFZMVM/Xig4Xkxnfjg+YngmM0lyYHdFTWFJfSRKY2I+TGpuOW9+MUUrcThpfiVjKGk8U3cqeUBDQVFwPHZGYHp3bzhxCistJmhFdmRxZ01TbzxWRUZeU1Q8TiVjaTNpfishP2B4VVhCO3omZXtFYXw+QU4yQnZQfUhDNEFqPjReOUxWdE5xc0BVNEQ1QHZ2TD9XM2JMCit1Vil4T04rNXMqfj54a0BLVElpVSs9Kl9JfUJISCNnZzZmRmQ4NiF7ci1LK20kP1ZpYCV6dmMpMnQjWCUociVvYU9YKV9hJSl2cWA/aldVCisqMkkhWTJMcFJYISVsSnchcTJuLXwhTGZoQlIyJm5eTF4mYTRyOXwmMjdDOyNRVCFJYUJ6JmlvPjV6YF9YK2c8amJpITR5IT0rK2skVE18Cit3Rj1GNm1WNChjPWV0flI5M3ZaKj95M0Z1PHdJfVp6QkZmUlA2dVJjP29ITyNGVDNLQGNod2Z0YkEoUGpoPVhLdF9WaV9eJU8jQ2VjIVFRCistKkwke2dUZHFAJGczQ1AmJTtoRmcjMTRIR1N6XkNWXm0zeXVmNTRhUEU7bT4qNzw2cDJHeCpJd2YzeiVHdyNaQG87I0ZmZnFVVmQjbE88CitPdGQlU0AxNyQ+dU5qJWY/QSZxem5vKEB0dzUtaDdJTUF4Mk4/UFdnSilZa2tGc0dBZmR1c2lzOW9gJm9SRjYlVT5Fa1U/MjNJbFMxZFZPCistPEc7bFFURF5rZmRWQkgwdno3WVAxYjFqKFU1VVJgSE5mXmU2U0I5MW1STFNNemc4M0ZAM0AweFJiWG1SelRuLT8wPDY4WEFgYSZJZFY8Cis0dCtvSFdyUEc3a0BMPDZHODhaT19vYFBNSDwmXnN0VGxQX2FvR1YrTGNKUm0qQTI8UkVhcWslMClEK2hFKXoxWkAoU0pwO3ctVGFaSVJQCitqdko7U0AlelNRTkIyVCY/WGxlUzJkSFM+UCl2XigtYWNtMFA3QH5RbCZKbSFrTDM4KEk+SEh8ailIUDd4eD0rJl44RFV6YEA7ZHgqZUQtCisjSGFBclBURmF1YUktMF9kMHdkMjtzWjZJV2RTVXkrXzNAT3A3cVJOMWBAWEV5QTl7QXMqV3I+Y2xQSkYkTUVSTG9EMkxGU3g7O1g9KFBGCishYz5iSlFFNlkkZkZvbnshOW0pTHlFVXIpX0JLbHZOMzZYRlNEOVd+dDVIKDVxbTdVXzFrWEt7aUI+SkUqUWFnTGx4SG49SUhuNyskJlM9CisyRmt6cX4kKDg2emFfZSE4UX11Vl9nYXs5QUh4Q2d4ejhYUlghaVl1eHl3MjJxY3xHTi1nMVBaZ0hrdl4rTWglaFUyeVIzbCVtJUhwYE5ECit+fXVOdyVJUmZQbStuUlYoWnpzWGI7N3lJQj4+dENtd2QwQW9mbUkzYTMtZS0paUdoK3ZSMnVPd3JDPHpkenRmNy0+fm1CKnsyKjBidk42CitZMXxvYnZ7NDAxQlJaKHBII184dFlVeCNUTSMzdWc9cmZFcFFRPUVmRGZ+Jj1pUDdhKlo0UX1nXlhKbWt4LS1oQDg/Q3QtRnpRXn4waCs/CitlTD82P3x0ZnU9dFNOfUxYPCg3QFdvYTErQDQ5RWgoLVdSaj56YzRoMGtRanppQUNUVWsrd3ZWV2VZVnZQU21zbUg5fnpZMzdBU0NyZms0Cis8MkBfYD51eD42N20oNnBrfjJ9RWtPdi1fRkkhPlg/VTN9amJZO3lENGMzc2VqeUJAcTxobn5ZdzBqd3UrXk9ma0A2VE5iOV5YZ2A1NkBICisoIXJBZ1ZNNDtBakMjM2wwSlh2QHFhfVAtX1F9VG44Wm0yaiZiS2E1JW5wPj0/an1NOS1peU52KHVRMU9fTHg5UWR1Kk1yNDElPS09KEh4CitkNiZrazhrI1BwQkQpYUE4TGUjR205eXRhbD9DamJJcn5wNS1ePiRnZkRsM20pbGMmPjZKRVhScXwzQ0hoeng+bERJPiVmTGxpY3AmIUt6Cisqdz9vezh3KkB6TjNDKjRWXnRhektRMF5YYDIhPXdzcDs+SSljPGZLKTY/I1RsTEpvNXRqI0s+U0AwOzJVcSU1MCZmP1JjOFEwOzw0ezh5Cis9PVcrLUFLPnQ/PG51Q0tBYktrWnZgYnQqclFMPUQhXmFsfH5pTV49b1gkTjdNcihVMSg3ZikkUHpge15wSWdVUDJDKE9CRTJVQHU4dm0kCit8U3stdChvTVF5c3h0VXRScCtXMkVzRFc7QSMoJl9iPmxxcTI4WFI5NiQwbntNJHRHOChrekVPfG93WV5gKERPM0dXRnZ5YW8kRj8kYkZXCitoTWdaKC00XmxxVE13aFRBMX5me00rS2JMdyVCYV5AY296OClIQm0rTCF8TExWIytod3l3WDA9UytKNjAyWDR5Py0pe0U8ZFc/PyN3PVhKCitEVVFoRjdUJW1xOHZvKlA9aG8heVNjRDVrQXN1aytVZCFAKz0jM2pvUXRqWGtXIUNJUHw2K2xxdGFFcDxBblckb1o4VmxhTCp2ZEFZYj5VCitiSFJ3fFpEMzBhX0ImNVJDPlowdDJYbipLa3JKe1dVRzY/SWBrfktjTlJLIWdgS0txSFZVTUlJWD96ZzZkI3g8RCVhSCR5RiNeM3NwSEZxCis2MEhmY05KS1FPNlVDKXZGVks/dDViRWl5ZEQlQ3x5Uk1HdSNnemBsN2tsP1pyXzslMT1jeWQta3lHZ0llY2B9TjlrVCNSRVBwPkBUVXJgCitSN2l3TGQpMXxNfWxiV2kjPXhWSVpmKmNUPmNBQyVqMnVjcHVFb2hrPz1KalUxI0x5fHFxTkg2YkkyRz1PNkxtNntsJHBoT1hjXjhKWTVoCitHbzYqZ3FnSHgkNlclcEZLU0cpWk4lYFB9KHQkMFY7K0VeYyomc0dTMi1LSHRUKGBWfjxXfi18Kkx8UipvRGNpJGZNRTE1e0ElN09rO1JICitRNW9uMiQ2OHRCNzB3TjNVaEV2ZTRAPmV4SDJPI2p6V01MKEpsP3w5T1p8Yi1nQG4kLURLM3o7ZT5aTnEyXyY+Yzt+SjdrUFFtOTc1YUpKCislN3VMSjMhYnBeUV5gJnBob09rRSoqYT5gfEFScFdgLWcrZj9gYD5ja2ltV3hXSXB2blUoISEoJjVqOE1jKHI4fCRheyZedysrVnNmK3RACitURmNaKzRTXn4lQy02O2ZjMlo0TUt2Sngre3dIZFRCNlBlVztlVGdjfEQ/VkxeKDkpSE94YTxyQ0NPQUpNPDVNOFhUezNyczA7eDRuKF9ZCisjNDM8RjNVJVp8PSg7emUoKHQhelgoMXtyLXUwMWMhaT4/fnBLaXk5fW9kYkhDWiFaNTRlMFEkUjFMY2IwJnBPZitieU14VTFMeSRvPFZGCitASVQybXxUckh8dWlvPEZmenVBZng+UUwxdTNvMjxDKSktXnFnNE0jKj18KXYzQnhQQ304IzEmPTJnaHI8V15uU353QT9xQjZPJSVPNnk7Cit6MnhFQlFOKlVNdmZgZXZoTFVPUTk2NVlGNlV5cz1UN30yZ2ZFVG1jeTNXMGlKZ3p4bVFnKVJhPStjcWtnaV57eWBJMXdJWDtubWA/fk5PCisjPVklIWclMTxAbkc/MDBGN0oqOE4rM3QtRGErNG1xYDRiZjRKNnplQGEwdHJaTH5WXnJnPU9EcjJGSzNyIWROaC1DWlFrLTM5czRHVWp7Cit4RndVeyt6RX59RUU9cTw5Sm8zQytReGQtNzE4UENWSlh1QkUtc298WSQ5I3dlI1diey0ocDIjanN9YDljUms3S3J0ZiFzIXtAYH1ic1k+CitJTDlydmZvKjw5ZGExR1RYQG1JUkE2KjM+SmNKNSo9T29BaFZ1bj5ZUnpsc1RnZ2U/R188b1lQSzZ7JkhjRHV2Nmg+azMxKmohUVZ+QXtMCis/eygzclJ6cFk/bCNISihiJCsmXiExcCpvb2YweW9FVjA5VSg1QXNMUUZuaUwtWD9zdUhWWW5vcnVKbDMrPjNuLU9WRDEkN2I2eU9UZXRKCitUSzU/PyhZPzlCNDVLe0dvI2MxaUw/RitDKnJjWCk9TVRGdnRyWmVKWXc+N1omVD4mQFhScjglKFRNVStfJj1VeGxLeCpSenxUK3dJPEVzCis/RSFeYXlFemtOJiZ+VUJ6SDtPS0tgMF9pYT9nOV41WEllPyk1Ym5BOyp9Y15CWHdNMUFjRGxQQXx9MlQrdFVHX2NxclRBKk95ZE0mVVZWCitTcnJ5WTlaO1lneU9CZF53TU51aTxZKVpiR1JufjBCVFd7OUhRTSt5TXpWNF4mNnNHK01yOW4pfnEwKno5TXxfPDNUWFVCdnlXMzVwMzB0Cit6ZXpOX2h0WTJJenplPz1gcC0mdk1IaCg4PTtMezkjYDtRUEJaWEpnJDBsJGloWC1eJXR8ZVlzaEoxU2w4M1pNT2M0e24hOGUtIyNpeXxHCisjaiFfaSo8Nmh4KCh7PG5NelpMNylVaEFgQW1lUzc4KChzTCFwKjZDZnFNPFRwJFRWanJAeTVNZFotKzV1YGoxc3FoUDQzdj4hMWVraCVJCistezFYbVQ/aU5ILWxzOzI3LTZYfDJQZm0mPT9Gal92RVY2Y1Yyfk4wUSljamRuTT9mKn1XMCNrSnNJJEVCfUFfQyVMS3NwM21TJlY5MHh8CitZPWV8QjI2TiRPZTRTUUR6dk5xVjFgQEw2a1Z+TE1uSj8kR1R3MWhqez0wTzNpMnp9ZHsjciY+b2pvJn4jYmwpSHVSXzdmWXNecFYzeXtMCitUJXlEYmwwcnElbmBjVW9yZ0MjV3gpWUxSNThURUpTMVchbjJvdmcqbEREbHNjNUMyZT9UbjtpdF9GNTVNY002NHBISDUrTHFLZXw8NzI9CitQTkchblBeRzlPVH1JNT8wZHM0cT11LXBaYFlHRHZnR1d1ZGslKUtyPChvUDU7MypxUkRGdiEyYXxkaGAhUFUrNmNoekspMTMoZmwxY0pTCis9eW9mYnd9UGNUJEhvY1RoUXB6TG1+alAxNHFERSV0cTxVI14hczQxUld+ZXBMWTteSVI+VnBHK1V7Wl9AYFZtX0FxbnhBNXB5dEFLXmVICis3d1coNi00fEBXKnU9eDNrV3x5ZnxNIz0lX0RjM0l1YVp6byZzIz0kQXo5Pk94ZVBsciE7JVhJWW83QUpKQWVFKSFYWn1NaEw3a25VdC1lCitkI1BOPiQjQSEyeVdRWmVDQ0dOZngmM1dzPUxoWWVhbylESWIxYjhIbGF5JHxsTDJ2e1dqQChvX1pNK2Y7c2JPKS1zTHZXZyZmPThPMmZKCispTClVfkJeVnNLYGJsQnQrIU0rflp7U3NgYF5EUjV3R25JezxHYHxuKiNqbCEmYkFaeER2R3pOKGtlQEhIdVE0c19xRiEqJnRwdzkkREdBCitLJjc3dys9P1J7ZTduYkI9OFBgbXhNPVJAYkolVG5+anAjPEp0JDJMUjx2dX52b2I/VjApVXA+WkVvNHU3dHV0VjA+NWE7QFVycFR+MDJBCiskbiorV2ZWVD44TiFDK0hFMDZrZiMmVDZ2LXBHaFAlI3c3ITg3VilBRHVxKFJJKiRedTxSPFJrIWNtIUByWjBsOURBc3g1PVJxanJsZWNHCitxa0J5YmclPTd1ZiRlSSF0UWFeNChCdyskXl9+OUkzYmxiSlRoMCNsWHk9JTIlM0pXVyRrSTJ1YytXQXtzSjQmcF5LUXtzYXhnZyhIe3xTCitlbGkzM0RvdkBtPzleLWgoRChWVkBkKGptPGkzfURMUD5FZWFSZDctWEktbmJuaHpQN1c9V1pUbDUzbHA9O2d0PlhDaWx9TUBHbT5iSmBKCitiITNgTW9Ze2kjQ2NQRGMlViRhY0YxaUJ2PT0jcEsxPS1lWX1WRyh0fSt9LXs8ZHMpNkNCNClwKjwjUUFVc3hCISlPYFp0Nm5zQE03SSMwCisrd2hWe09WSCsoYWNSRUkoaEJpRCFQYjtHfHAtcFpPVzBEUlhTN1dTdyVvfUF5OG5URWIyIVR0YnwyJTNfZT9kWFJAT3hqbVg4Qk0jSiZ8Cis4TXEkdlZnWEtFQEEkSXNWXlRgU1U5OV42dU97UEhsczNBYlFISGJPOzlxK3FVTThWKWdzdjJeTTtuNSpJfnZtIVAoNHJaKGk5LT5tY2prCitJezVkYnFyMnc8KStvPk1PR3A1cT5vcypLLUJtO1czTW5lLWw9PiNLQW8qVVVOKVIzX2oyQ09KS2V0WkRwd1EyS0JYX1pvbyE0MVVTRlMlCitVX2oxYyYpcUEqQFpEfFhUZ1d4TFRHRjdaWkdIKy09SW9tNnA/VkJzdypiM0A9U2FLYGpAPGRpX1QjS3gqan57QFhnb2k1eUpIazcodTV0CiteT1ErfHFzPlF8PVd1PD1xO1A0N192V0Z6c2x8MUloPXMqcE94IVZSJEtIcCFSbX5UJno4a0xtdkclak1wITFxJmpxQXpaWCZDYXVJNDZCCitzanNNJX1WR2s/R2x5ZCpGRTxYOzhFKjUmPH48cHxldmNPQ1NxNXhKclUqSyopfVEkJldpbXhERzk5OEM+MD59RX1PWVQ3UzEhekRVbU5uCiskUmlEPlQ+NTE4cl9Ye0BociYyPz1AbGtfJTRUY0hVPERBX0J1Yj8yKFA9XjxMPXQqMztAcStDb0syeFkqQlVlYn08cDY4VUBfXk9KSU5vCitTd050YCpiNTZieHBfaj5QWn00LVR9X0Ezby1FOVQwdStrYnd7cj9YV0BGaUxzY2BzcFg/MDUxIWNBYFE+YmlpMnkleXRHUSg4emcyLUIqCis2QksoeUBZPVl2TnFPNFpPOW5XfEhnIUtDc1NAMCYrQmBBayZjNH1LJW5CPlVDcFZ8UGY8c2hSYEwjJCN1ZmZtdnNuTXhYaDR8SFNPVGNaCitaaEw/VGdzZD59d3FpfWQpYTMyYjFlIXBwK0V5RzVJZkBMbFJuYTJqJTZUezdGWk1tezJ4WWBhJSRfUTZHUWpeTTQtQWpJVHt3VXUhUylpCitKJiR+eGRBZUVuPTBoVnd4eT15JXRBaGtfcX1ebj1DI2ZpNUA+ckJIbDwmR0BHVCt8fUphZms4OFUwWTZ5dU1mTlgtMFojeDwwRkRBPlktCitGeyh7flhKbUJMTW1VWSRITHZkO3h8KShJKkQyfDlJOHFJZz88MTE7emt9SGxxUU0hJmU8M0NqSj5FQU9nQXEwR1EhR1V2Ui0tV0RIPX4wCit2MG5JYURvdkFAQys4bjJMQHFNOzJjYit0MnlzRkxWOH1jZTZxRWt2Z2ByaU5DcCg8TmYtejwkTU5yJEkxR0BYbXRXbnZXUipRaFFwZlYyCitKOTc7bUVSQ0FvQGpIKih5KkwpRGNEQFRZaWNeVzkjd0c2cWBzT01mQ2gwcDEjJmZyM2p2bWhtJnt2MXUzYj1IY0ZNVT1RV2M2bFl1UUArCisxYCo/SjRhT2peb3k2TnlkXmpxYk5BQkZ2cmA0TGQrJmI9RDw8dDRvNTkjQFlMZEkrYDtQSSRPRV5gPiVmWUZMPV5DSEsoNkVrdS0jOGs2CitWRitqQzN3KklOVEM2P194KyVKI1hMb0A5MWJsLXJwI0EkUExQNXstOVB3WT1Tc1lzREp2PTI2RUZBSmVHPW0rYHFybCF2e0BocTF4RD8xCis0UUc0JGFQYkFZQHAlOEhnMEooaTEqQUp+fEFGKntSYjBgbWlVfjhgQkVlZ3MrMnFOQWJLTTMwQlF9VmI9RCNLd05uSyowfXhoeylySz9ICitYKHpoSFdtRGVUUjZVJlhNZn1zTX1YQ1F6SVN0dz5mNUJ5QnwrJDFxUElQRVooUShjI0RfIUdyaj5lc05YN1ZzY0QtdWk1NH55RlVLfUx+CiszJW47VDhWQj55VEBEKXQkNUB0KXtIZHpvJVdGUFhkIV5rZ0pKO1JAKm1heC1uRXVNI3tJcT1XdTZwdzsoVk9JKD1uYl5lSlBscjNGbj9wCittJEpiZW57aHs2fkpqMzAzeXttdHRkYTszdlgkS3Z1ZlppeFVOXzAkOTk8OW1JPkgoUXwyRjxgPj00TVApLVEjKj5PeHJlez13LV51Z1drCitjVVQ7TVAtUEZacS13OWNlJDg5I1JMKGA4PGlReyFSbj9iMGV+MWtYI2hxYEs0aXtfKyU1TE59endMd2tpSTtzaD1mbnRtU1FGQCRoRGV7CitHflglOW1lYUx4JThjIVBgRmwzalFERi1Yek9XWlFCO0MofjQ5NGU8KXN2SmhAfjEweSMpUjV7Vz1pQlMjPlZrYyhiSzZRVGk4aWR0MFBoCis8P1QxbjQyOT4lI1pzeUBCSjZ3aHI2NFpna1ZjMT9ZWlYhYklueVk4KkZYMHFMXzMrTH5OWmZpemhQKV59fXdad0dIWn1TXmNEVHcyb3tOCit0a31HYXhOfkdwa1V+Xl9ofT5QWENKPkt5Z1chfUI4VE1AMHR8cHFfJS1nKz1yY3g5ZlFvRDsrTHRPMWc8ZyZnPWcpfTxQOCpTSEU7I0JMCiskSTZtWnFrPTBSdjVzenpHcS1TUDdKTk1pVEk2NiVWO2lCJi1Idzt7Zm0jJXcrPio+Kn1zRXdzcXt1JGokenUpfTAtfE9Qcnd0amZ+O3JsCitrbiZrcCEjWCNCWUluXz89Q3ZuVGBEe2ltfVVhY25XVSQ2LTtGPGx4PjNPPTE/c1NHNHBPMHkwZjZfMHEqeD01dURoPzlebG9aREZ2YkdhCituIVRoZUlHcUxSZVUzN2lTbk9UQmJDVDMlTigoNzNpUDImIWpqTWQyc35uS1pMeUBFTnQtKVh7WjlyYTk5UkxtdV5Ubm1YVGFzV3woRHM2CisjKTt4O3t9X2QjbGU8YW5tOGlaeTgrO1c8NndwJHtJJGlLM2xxOH17KkRIKz9ISyYkbH53LXhOdnskRF9UMGw0SVdfRUZSN3tqUSplN0Y+CitYV257bXBCRjE9NFJlTF9rZDYqIWVsY0IoVkd7Kzh6OzlwQGBefE9qP1olSlckeygtentSTlRWeCNDfi0tWHFeTi0jaHkoVWRLZSooTW1UCitmPzlQZi1tXi1NPGxpcGZYVGhHI2N3SnZVcSUtSCVGdEZMMiQ9bXA8U3tfY1NIaGNHSSRxSWtgNTVCT0dwRkktfWNLazxwMz12PHFLeGVgCitYfSRrfmNzT3YqWEt5VVhscUEmbiRFbUJeQmVyO2tBfW9kfHNoMHFmWn1uSjFmOXFvfCR9TDlOT3NOdyQpfVNPbk5xR0plRWFCVDZuYzZQCit8K3U7O3lTRypsciFTTnJ1e0VBfkNtUElYJjxpK20lOz0tIyR+TiUxZXpaI2pKWmdEeFNORWooV1RsZGtgeFU9U0Q8Uz9TYGxJMzdhWFk4CitKdlQyIXd5WTY0fFA0OGBFRFlIci1oYTNRez9mezcqQDYpN1R0RT0pQWowOUtEN1lOX3NHRTVJV0M0UDlwbU9iIVBlQTZtKyE+LXNCY3EoCitvdHkyOHk2eFYzQDhlbVJ6TW94KWReTmw8VFh1Y2hrZkNmWDdweUI9c0AtPFQyKlRaWlZqR0wyJHFiTH4jSz5QVUo+Ki1lKk02YVRaIUI7Cis5OW1AK2NlUU5CNjs1ZntfPThlWDtAJlJHISRVUksqJi1GV1VpIXRxN0hPKlJ6b19LYjN5ND98TFF2IT0wY014REJocl5hcWhnQ3x8PGNxCitOQW8tUkZ0M2w1Z2tKdyE0IyZifWhPUDxPMCplQG9DY1FRZFVzI3VMQEtwPnBvSkEyZylUckNZeWExKCNJX0BJZl5XWVpjWV8lZVojY3tHCitRKztjJUZEJjxIUigtQ145fD0ke0crTjJYKmgjaV8hQW9nMWsyVGBsPFdJYGRJSklfdyZ4ZHh9OUdyK0hgVlIhUkNaRUFrRU9+Z0tJQ2lZCisxU1F6TUA/UyRQeFlXYW8lPEA9QXlJJE09IUBjQmZ7RHd7RTF4c1A0YnZZMHpgd2pNYzImQkheMX02U205MT43KSVMUzUmM3JEaUZaSCZ3CitQRFAyfThePmh5KThULVVSKj4wWnglSWlgTFNDLT9PK08jKlowQDRvSGIwenw+dUgwTjQ/eFlSeH1OMFVsPHlxPSQwbUcpeDNvP0ZRMTMoCis5LTBKayFLPzE9KTlAajVEZUJia28tK2FXIUIqVSs3fEtzMk9ffmhaPWJqXlMyMiphZEhfeE9ecDRjfDFzPFlIdmIhOSs2M3tFSCFCITR4CituNnV0Z2BJRTBOKllseUk+VyVhLXlmMjF9a2BZWHsrZXdwZmxzSDRYIS1vOXZzJTgzNzNjcGY/UXA2UUJXdmc8TmNDbTtfcCMwezgkWTEoCistLUp4Q0whU0RUclJ3QX0kN0s1LXVIb2ZiWE9rdGk7QUspRzFSTEVaYDtfWSN4TkpIeU1PQ0c9WHNXJWwzRX1USGluVntzaU41YEh1QTZtCitjS25vLWBTa213S0RvMWIlakg7RVMhVERuMEA1QWVJazd8NFNoMjk9MjtqY157cUQhaUV2OCNwZEtASEN8X0ZQMG5IRztoLXRzUSY1KGBuCitYU3FJMSF4fjVSLUVVXnZafmUxU003Mjh5d3hDNXNhRSl1S2dOfmt0PCZWbW5IaDNxR209SjNNNnd5S2g8PzlldGQqU2MyJHY8IStQaD9zCit7TzhUU3tfMnEoLVZQTkN0S0Y7ezk1Y0cjPHVOa3s7XkV8SyQtRUVTaF5xO0hnQHI7R1dSIV54KE5IPmVqdUIkRFFRRmV1KXZBJVlOKEN3Cit7ekJOcD5yOHk/d291fXp1blprZzl4YXh3NG9GYiV8ISpeOV5NRUpqcyl1OCl7WFFIYjh1JktOaVEoVCUhYCtNTXJGUlJ+SmwtVXBBaFB+Cit+X28mQzR9OVdtXndSP1AwJTw4JWw2NXFQOUw8T15iXzFMXik3I3NkJSpLPEp3dzByV01EXzwmaFlvaCVuUSh6OD5udyVWMn04V1MtOTMzCispcFlOJSpPX0MjWXRlVnlBJk5fZFVCY0VOfnVAOWlwOEVpVV5oPVpPPzt2V1J5V2A2Wj9GM3txRjhDYGkwNz88dm1NS3d3a09JbXZnKzFkCitAKX10YEh6aWVwQ3xmJUMqNyhzVHBCbE92ZWNTbk5veEhaS2tBIUFpV2dpZm88MTw3ezZSRm1lbV5oenM2Vm81UEgqUjdIaWF3c1UqMT9kCisrWn19XkQ0fUM0Ri0lOSt0elM4SVZ3dzxwdkwpNiNaYHIxRm5aYEo3aUxBPl98PkFFXmRQdytqYHJVeipfOUs7VVhAQnNmPjZ1aERTaDhoCispRjs3cXpjRWlFN3BRcSRoP00zdlV7UEkjNn5ffjU3YyM8WH4rWlpmVERjS001fG8helkhOWRCSCh2RyQmQzVEPzsmP207YWRqam9IVnM2CiszNip6RyloKzF6ZihDQD55UH5EWnpJY1VJZ2EkK3ojPFpLR3hBNC1Scm9VODE0IzV4N1lkJW4ybWw7TTBxPmFvMDNTWWFOdnxvNyNNSEw8CitZUEgyZ0Qran50RDlXTiMlcW5QKF4hcXktbWJyY1Vud0goPD5veGFEe2BqU3F1OCMqVXwzelkhSyZObj1lMmtePHFfNkRTa0Q7eSowUGQ7CitHfj9QIXokPCR1RG16QCtCX2QjVmc/U35MYEs0eDtZVFUkWF99SHteQmNJM18lXjRQfVhJbTthUmRgJT0hbnclITNCUXcrKmxySHwoY0M2CitHcWA5fkVqQClma0tDMyZkTHVzMjJHRGVSc3VLRHxGUjVpVzcqPSEhME9DMl9ecFlAe3lCdk42Zyg4dXhtRW5kM2J8NkJhdXxHLWd7e29+Cit0dntfUEx0LXV3fjFKJHoxK0tZOVJSX3VLWEw5bW8zcjxORUpWYD9zJEJaOV9oYkxYT0E0Rj07R0NsTFNVXkVRenVkaiZkQUJ1YEVTPks5CitlTShWMV5EaDxJcXIpaWxMQkdRN28qPkdBUFdzO1ZDM3oyPzsmYyg5ZjtmUHkjbU1xeyh0ZjFaN2hwM1daY093flF8MUFmdHF7aDtmTEwxCitQK3NxPGxFcmk8WSRzNjU/YkhEODYpXiZCYlIoSiErOSgzZj03WkZCOD8kelYtJUZpaDlMfGN6JkdIejBHITVYKiFMZU5ATyRWeWhyeHMpCis5WWFrbkFkU2hkQn5OUU9sY1cjLVl7KEMle3dtYjNed2JJNUI/YTQyZSQ7KzJfaXRnX2tidTxFY2paUmNuM1IkfnkmSFc/cntvJTg/YHw+CitJLWhZd1AhUXFLN3lQSmE7Vm9gMnchMU4/USRLKVJsaFRSPSVNQ2lIeShiQGloP3JSdUNlKm8kJmwwdzApXnheKjlTLTNtQSo9dzhtTiF2CitXJk05PFh6ZDFwVmV3RHZEdVA0V0NpYTdCVT5qIVFUSGhrSzRlNzt4TnpxdEFQJSFsMEAqNUF0UHFOQiZHdHkzU1k3elhpfioxcz9iMitiCitzJjRzNWJoPTVxMTAkOHFFQ05lXm9nR3VYR1RGOX1iM25CdiNHNmJvSWw4ZkRTd30yZH5kblNHaGpZRHA7T0lrJDJ8MWB9KTtaZ2pXZFhGCis1ank2cH5kd18zfn57SzxaUnN8VilJQmV1bWJRWllzVVE3KHluaUVxeDw9Q3R+YjhzPzlUYEFuam91dypjSWdLaFJJREwrezxVNmxUKkR0CitrKEVJRWZVbEk+d1YpMk57a251Mnp2WlYqRVVOQWVjUjsqdCpuRUFlaylqUSttclNCRCgkMz44Y1Red29UQnNjTm0zQSojQlB6byM4Qk52CitkRXVZOVNyQy03QG1NLWNtQCE3KTBBTmRXVCM9P2p0OGh1JGlWZShTeD4+T3UpKCVQXlM5SXtqQ2VKITV5VTAzK3s2ZSRGZ25Id3tHailiCitWJiNkdFpjSiFEZil0PFJmUj1qeUpxYmhXPDlXIWc8ZDY2PmdQMXt8aGQ/P2szPUVDOGRPVSo/SU1NKyVRN21NK31iYm1EaTJSQiF2Xz5hCitFWDJ4O2o+c2FHRyZ7V0E1PmRhITxOX3pvQm9wWXU2YWVrJEQoZlN5PkN1PX49ZCMkPnBhYzB9JlRlei1zVSp7ITN9c1Bqak9ue3lASElmCitqMkRiYipCcF9IeGd8PkhUYk1WU0JZRjM4cnl4SjRIM3NMKiRAeThiKDN7R3hfNXl8WnhgLUhsV209NTFLekRwPWx1RzN0ZGMmfFVtUz8rCit3NUxnKjwpK3hPcDVxKTZfUFhDWTB5M1h5ZiNxM3c2NzZ9dmlQWHBRSmAjOVEjOVQmfGNXPVh0UkM9fEc/ZT54JFd1NUZaSnB2JnY2R35jCitnbGAzPE9SMEZ9YWxhSD9vZDlWNTdLX0lXc3RzND5YOzNQXmc1cW1FPEtTN3Z8PnheSTs9ZChOb1ZHTCteWGxpb1dzMW18XjF5YFFiO3dxCitIRiMrX09BTks1PVpWSWA5fD8oIW5HRH1JME1VeEpfZDcweCFmYlYwU1lxJnp8PUZ3O00yaGBuaElrP2w0fGZAciVudWA5aUZxZHRlT3BYCitpYlk4Pkk0amlmMmhscG47NDtoRWNNPURsNSs3K3c9MW9pbnhsamtMcDZrYXgrbWckenJRfVVoRXB4bERwcHkzJVZqNHlZdkdYLXlPQ0E1CitKS25md3xvRCQ/PWhKOTxDe0J2SHc1XmZlWFYhNnxCTEg8NGVrc0UwR3o7NG4hI0N8QX44NSZqSFdSZiN+ezhfKDU5NntLYl96S05IdiMwCit3Sn42JSZeP3VlYEF7NShzNyQwdyt3N1p7NFl2U2dfSWNDSEdDZUdjN3NFTE0rT05pb1dxRjlmVWY/TUQ3cnthV1J6fHwpRkV8byo+NyswCitWak52fjRfbUc2YHheTlo7M055elQzdjtfNT5SXzxOM31gVzRXb2RYOV97JVFCRWpTN19mPX57dzBzRFY1Q314S0dFKjlueTtMdWtMI3ZkCis+a18rQCVteXVlTDZ8NDhxZWApc1Z3YCZ4RmBpcmJYZnh1JSkzVExMMVA9SyRReCFfaFApZWluczdgYzYlfTBLM0NHQUhjM3pjbUpIQWYmCitGRl53PH4zVW4qS1pjOT01OVNTaUhkdkRiNHxTNiR4UW9jWWchZTsyNGsoVXtpX3JzfGdeS3pqcHE0TCtRJW04TWVyaDd5SyRlPT19dTYoCitHYV9sRlpfTiFORlgrRkB8UTg2c0oqakB4YTk5TDRlbmB7VHwrUzU2QWNEakhTK2JjemZ5aGU8UUtidUhebEQhTzh+S25MTH07YHtYVDklCitlaXBjWnhhRElrMnZ9UzZ7dStJYSt0OEg9ZndufkVUWVR+fHo/TFpVejZTQW1FPlhEYURfY15RY35PYEFvUnt5Tjd3NU8keT05Nz4+ZT1kCisyZ2xqfWRxd0dGemoqXitGeXJQMmJhQVdXNlpEcDE+ZDN8MyRVJE1IdldNWHxJbys7VFZaMmlQPE1TaChOUFBeNnBvPDwod3FoQiU0SVd+CittYld2Z1NAXzdKdWktaTx2d3QpM1QoVUFPeDUoNSUmfmNFMj1OZXh0IWJlbTNqPEdZd0FOPC1FYTV3fiR5Vj5WZSpNRXhrcGdWe1ZaVl87Cit1eUp7Xmh5TEZnZ29PZWhoTWI7YGFuZUR2OVJOU3VNNSlqYFBMc2J3Mkc/dlNNOTVBZHMhYGdpan4hUWxEJighWnBeWEhHZyUpVlpIWTY0CitpbjVISUVpN3lGOz8tMytyX3RZP3JHQyQqMEhAIVYpcUYtMmdKNSVQLWxCR19aeklnUX1gdjhocn5hPXMyNmB0JWFXRSl5Wm1wc2ZCdCshCitCdEZAQXphPlh0dztWMlUrV3NNM2hEIUA+UyRgMCp8Nn55T3VVWDVsTEU+OGoyJUdfTkIyQDVGR3xnZi0kRlYzeUwyI2dQMjU+KXM4empTCitnTiYmJm5pYlpmPDFsVjhNQEx3RFduRyo/Sk1QWEJBd2lyOCo1ekxncmhNM1EtT0VWMWEpTmd+VCFPMzcrbXc/e2Yme2wyZmJPR219LWExCiskKSRPeipRcmRSMCpvYzw+JDBZeFpfV2goVkhIYW1mUTZmNmR1SiZSJFA0LVY0Q21Pam58aWJQO2RGQH4wRjtRdSFfSGdJfE5PPiNeQFYxCitodSN6PUlSO2JtQ3UqclFBWGFJREwkekc8e3dAY1c4S3s4eWxePVY3RlZSPUlVbkB1PSFxYmBmSEBQOHshOTJXWExEJTFkMztJQGJmaSgzCiszN04yOXgpRFh7eyYobiFobFVhfEhseVh1MkI5eGg/KENZMkF+T1FFWkZ2ekVrK2d4SUc5MylFXnZRQiU9YmQkUGF5YGI4dUBAMkowQ2FpCis1SG9RPHZlcmQyNFMjbExVQTcpY2VWdno0ZF9UaGB6JDxAPk88ek0zQD12aG9EYD1YTHptd0UlOH1fejQ0aVQ7bE52Z0hjP1V2TD85PUVHCitPZC1Xe3MtfEVzWExySXdxKCo4bW5fZnY0SXI+RXpZNH1Xaz1vYlFoNCZVbmBDWVpRO1dvdmJDKWUkNjYmRmtmT3V6ZyNVdlFrQXZiNzJHCistRT99e2h4Xm5FcWIrNGdNQldIPzs1aU9kJiFHKEg8IV5JQ34zcCpAQUBFPCstME1UZ3x9YSZ3MjktSm1JZC1iRlV5K3oka3wmTWEyJCM0CitzWHZSQGxmZj1TSm5aNiQ1K0ElYWZAX0s1cDlfIWQpN2w1dFlxKEd2SH18VUF2Q0V4JmpRWERDNzJgd2hhQjhfO0lycVNHc2dPWEk0bFU2CitrMHN9Um02QUJ0SEV0I0UtRSRkZWQ4PEBrNzt6Z0w3ZmxZSXdIYyY5QihYRnppaFJ+R3JSYj1nRVY3fmVEXkotNFhBS2AyeVZOdkkjdE53CistVFU8dTlSM3tgTSY1Q19AbXxsWEQjbEZldFhDenVPfmtJYCpEM0QoSUhHcDxyXiYmQ05BUWglWlRROzAjNkhDZCgpRFJsXiRFakJWel5nCitUR342c2olY2pDZCNoIWJEQDFOVC0tU1J7dShLRVo8RFl9UTsjWkt5TiZwWjwxISs1ISExI3NaLSU4dCswYyRtZUk5bmhJS1ctQnVOJVF9CisyQCpYQzZZP1FvVyFiI3pGdnM3RUBzK3kkKCp4ZTBlNDFafFJTOXcob3QlPXJ7NEVSaiRnPEdaOShNaWNtKS0xJXt4eWFFKXJQY35qXnA7Cit8Qzh2T1RHbVVRVWsoKH40e3AjR0NRMztyUXJUdWRHK3o5fHwkbjk9dmRLai01NHold3V7eUFBVTJ+NERHI2VoUmg3NFdgXn00NExtPEZ3CitoentkOWFVaDJiNmxzKis3fmRyXkBuOGl4ciFROEhYZCljSUp3bHIrQDlLaXg2K0ZnZlJBJXhAb0tIM2A7eGBAa1p5Z058RFRncSN7VkwlCislbHNGbG1IKUdAfDQtNyYtIU0tV2d8X0UzO0dQNypWa2t7OUVSS09GMCVhS3JWPnB0PUlHaUx0aXp4cz5xP1hRQ1h5Y2tkVl48PTlyQnVLCitnMHIkKDYjQlBkMEVmNTFJZ00yUDVOP15SZWxDWDZhdXRFP29wbF9BaGNuSmtrKms9b2E0aC01dGEyKFdzVnZEMHheZlJBVnhURllMdjtxCitvQ0VRWVpteGA+MEFGWVhXVSE2e1RpRiZ4d29XczNtPncjPlooY1gxSV4lM19OZkl+LWp9RlZuOXUkYWxmTEgycThGKn0jfmh7Rm9oU2ZfCispbWJgOCFWek90WDxkOTQ7fFpJUkQ1ej5yYXtJLSQqSUxqNTZ7aXJBKypqbHJxZEhCbWE/PEdSIUM9PXtzZTZPRFBrRUJhZCZAPCZUc3loCistUEdmYTZoSiR6WFQ9IUpmI2VnOXw1JVZBRSVUKiFsSGtnUWlrQ1lWISU8fjA8UXxNciluRHsyZklvSXlCN3FXendvJXUzeFlTJU1ec1d5CiskN14ld3dMTlVOPGhJaU95NVRIMC1YWm9LVl9kMUZxYnV3M3R6YlN7X1BRZzh0LVVMP2xXTjQ8aT56bXhKQzVfaTNiaUF9bGpMekxwNjljCitSbTtFbGhCSGQ9IU1kQi0/SVpWMlFJJX1nQk85Ti16YlpnSFNYLUB3fG4pUyFRaXteS083WD4lbHlOVHN5P1hgV1BRa2FiYjtNNlBHSi1ZCiteZlJ9b1FzZCt5LUQ1fDc4Y3BfLXpoK01YOWljUUspTntxUDdjZE8yIzg9Mip9MldtbHU8dWU8ZzxtKGl8TDlwcV47XihgNEVaTVYlSVF5CishPE9ydE5jbUpZMih9ekY5M2ReYiNvQDlaXntvSCk5anMoOCVsQi1WKkE9TWQoM2IyQjd0eFRSWmNgRy1qM2VgMFd1czElOT50WjlIK283CitQJDtoYGc3PitVJTYrNDlzVF9nZjBEK0piRytAJmA/TVNIUDR5Pk57TyVGSTNwTXxYRSR0bkp7XnFqMiE2OGAycSE+Nz43LWRPeyNXO1hNCitHe0kwZk9fQ15xRip3YkI/bCVyMEN0M1VqRi1RUShXYnQoJXAqI3F0RD17ZWghTl9HSzc0PFdMRTNxZ34wYj9hN3M1SnMkIVFpbEM2YFR6CitHQTV0KGkzMnA+e2ZAWktWJHdXfHMzaUYjaylnMktLdUs8MnZPQS1+MVNZRjB1QmBJODN4X0FLNU9OdW5mcHI4biM2ZkIxPiZKQlIhR0s9CitkRktyaXJATHQoMiR2fWtHcGZJK0xxVXZ0fFkzUzRSUjFCWG5aa3BvYyRXS0VXJld+ayglUU00YmxOTUU/XjtDI1l1WFdzcTVxQU9KV1QkCitpYSs5fkFELWZmK2tRbyZwYmNvXy1sJF59WkokZzBuP3t0K0Z3a2AqP1ZsM2VFREB2fjc3RF43ZzxsJT1yUSNCXmN0MVBgdk44RFYmOStFCitnR2FEc3dlOH0mUSRydWRCfDUrfDdLJEYtKlA8dnA3OCNKP3tjNTstN3toY3IrMzE4YUJLRyF6NzVsUXI9eWVoI2kjJit4QU41c2BhYVZVCisoUGlxSVhiRChTSX5fYCV7NktwOXRKPDtoPDhSXn0/Mnh9Z3laMUtiMT87ZXx1bTB6aD41dTZ1enV+JDVERjtTQUJmJTNjNlghLTJfV1NPCitGTzx1SWRpbSgpbzYwNX5TbTg1Ml4/YGk2cTJNMnZ0NVV6S3RBX0FsOzhAZUk3aDRUc0pKMHRJNmBtQlgjKXojKlRaN1dsfDlyREFmIW5UCit2QldtYGBAOGtiRnh4MU5TKklCakdLPio8T2pxaTVtaHU5e0xpOUV+KWtlNEo7KjdXSkdfb05zanpIfGZYfFgoaTk7TDd2SU1GeEFeaUx2Cit9amA9ZHdnM2R2OUlmK3MlMHRiXzlEKUQ5eDNQTn5YMSYodVotb09IUkl5IypNd0QmZ1EpQ0RPMnNMUWMzcDZTfT81Q2NlP1l7IVNAP2g9CitRRzNIbkV1KUJubl5vOT5YMGgoO09QVm1yfXoxd2ptJnNeVDFNckR5KUglTihMdElHPWtpOHxpfFheI3lYelJCLWMrYSg8LUtDN0pCfVhQCitiWTZKcHVqUVpmUGhRfCVJbFFaKmtSUmt4S1RQQTJSWU9IcFFFWE1ITS0pY2M1V3BNeE9lQEo8WC1DOSFndE1XWEpraCYkekwjOGdjPThCCitKekF5eEs2aD5kIWotPHBGY1VqVGJTOUUlK2pnQjhlX0lTK0k9NDE8Ymk9PFE0OHspfitAZDhhV3A1REQrJVgle0dacCVBd1VmI1luOTlxCitFUEYrTDNlJmhgTyp0PjNrMiRvcDg5V2NfJjlhKztse29qZGstJkE5bSo4cE45Vio7ZSp0PzNYPjFCK35ON2RaIzd+d1hxMUZvcUZlWjwpCitvYTVVJUx3SCFUWjhyLT5YJnFsMWUjRTQpfTRkaGJ3TThKZ1lzWVlfb1o7a1R4fFpKcjBHZDgtIUEkaVAlbzl5Pk9tPHdrSTZ7M28wNHhzCispQiNsdXhCcUhkKkxNSU1yNiM+RitPN2M+TSRlWk9XU091K2hjOUh3S2JUTG9DeTF2LWdETWFhWkZmYmUmPFpiYih0cWgrXjhFfD1uVjZZCitLa1cxNEVII2FRdU1sQzxNbDJaOyVBWkhmKl5jPXRJRnQ5KWRVJmVPVk1kY0tGLWZ7aCRGdVl9aFVNeHdzc1NMLSU+eGZqa0pCe154bXhCCitTaSphfHF6dTZAciU9eCpHdmorRzVxKS1hI1ZvcXRWOGl0UHpZaVRgVm99UXpfQU95TV5YSXJ3fjkwLUlsYU05MFhsQiFuY1Q2fjExYDhQCis4RUFIbCk5VSg+T1Z1OXhfQzclVFk/MHZQNSQ5OSNWX3hYdkV9dCQobl91Y0khU3ooQGo0SlJAMCpBfUV4bVheT3h3ai1AQ1IxNXBARnFBCisyeUxTdEFqYFE3R3grcHEwSWB8OFNYI21Ndk5UM2BSZkxMWikmMlUqelclMSNuTlkze245aDVTdX5nRGd1SzY4PUp0K0F9KWIzUj1nO31ACitkU0U0I0B4UyU0MnJ5bnBVd1pJeHkzNEU4T1IzMXJVKWh3OyQ+SmlNIUA8OWhfMFpQakRgZ1VhQlhyP3YoYncrM0JrY00xe30+ekV7YnZyCitXKitjbWg3REsqb1EoWnp3Ulp2USZnMWhWPmVgWGdOKy12SW9eeUlJPkcjU3sreDhSb3xONEctPUhIRkRWOERnXmxaWHFqPCZRYFdgQ0FkCishPWBAPC1teHliZ3o3RT8yRE94UFJfISZAViUmKGAxfE41JUJARTVAWjA7N29+ZXdqYTdycj1tQD5ANVFPR0cyU21ONWhmSHhBRUYxJH04CitWcUs9fUcwfEIpQik+ITxMS1VPQFF6QV4odlZAWEslRXBUQl9jXitWb1l6QCszJkEmPFlqKHt1cSZefmc8PSpZb3tfPWsxJCZkJDZiT1FQCittXmFvJWNvQlk7PG0mWWMtO3Q/d3JFIWNkTUdlPkhBdWBjc0pUTCFjYkt4Y1V3RURGb2IpJT5eb1ZTdUUjKEchUVUtNlJDUjh5c1BHXyQ2Cit2PWo1U1FSZ0xKPyF5MiREbiVNSVRqWXdse3lWXyRgYyN2R09wX35rTXVEUSpgR1JqZVg5NDBPa2R4UUs1VDgoY3lwOX1ONjc5am9fbihwCis3KW1fNG1jTjFLLTk+PChoOSF5KzxxPF5OK01pUVIldX41S0pMKX1iT1BeeytjRXlMQ3JLe3FeczVVdW5FV2JvVCV8Y2A4S0ozMVBCTUEpCitRJnIxbVpIcGgoIT0xQXBrKFRsbzstZ251Tm8jNyE+TSlaJUdzWENrNWx3P0FKcHNTQEs2QCUlS1o/aHZnWj5UNUhRMmp5QF40ZUdLV1FxCitrTUxUKXA1ZjQ4ajQ9RyZ5Z3ErQEkqZz9LY1plWmNPYD1yRFVWU01mdj8kJVV3eV53V2ZqZlgmRis2OEw/KWQ1OT8xQ0l9elFmVnVUY2JNCis+fTlZeTBWUyVoY0RTTkQwaiVoOWdnekN+WklRLUdqVFIrWWFxenslPTQhZlU/fl5VUGQrQ1VWcj96SCF4RH4qV3x6ZHE1UXg5TTtHNHl7CityX3FJe3J+RVFmQiEja0ZiREJ8XyVgYm5WMDZBWXB0Xip+enlJR0FJTClWcF9XJUFKTyNmRzNgeUcxISZVTD57dntOTEIhfHxkUmplUlFSCitpWWJebzJiaDstRmw3I2JZX1U2bCU1NUJLcn5wZz9VP082ZT9fay1fYj1vdmtYOTFMPzdPY2RVUT07VU8xbjEhM0ctJGY4UlBHWkw8ezd9CislSTBqQjs7Q15PSjNFJm53QiF7czFIZTgwSFdobGdIM1dldU5RSyV8VUBDOHkrPXpAJUtQK2tCdipjZERieiF+MngpUnhtVVRvWkBHSFpUCitDUEJuXn1OKyVOcilXZCRaT2g3VCMxWU08bm07KDdCa0YoK1U+eDM5VDRVX0trJmIhNiljNl9TTjwpWGtlKWBEZnU4Nlh3P2lkJSk9ZC1JCitrfXAkSl5ZLTE5VnIpMW9CfX1ISUJXakQqZWJqPTg/d0dxJipiVD9iP0slUWpOXk0oWiVBXnFCWmhmd2Nhaz9tMlZ8KmVqSG47YzJQJj0lCitDfSh4Tn10O057b00hQyFucm1PdEs0Y20zclQqc1lWYCNmXlhZOTQhZjhCNmB0O1VJM356KCgld0tLOyRjUXw/ODspUXJyfEc/azZ3WEV2Cis8cWEwNyR7M3ZZczl+SyhkM144RW5JUU5YTlE4c3VDd0RkQXo7T0JrX1RIa2l5SU11bTlfV31vYmNxJjhjYU5lJXs4fExZVkdkdkw+QWRDCisyazxTJGw3Mz9+ai13aT1gVSVtUXBfNXBhQmBTeXpvQyEpKkE1VUopdm1te1MqfDlJNzMpIT5uREAoLWV3I3RnTktFSndPJFBJO3ctOXhWCitrJEU5WEFvdGAjWGYhTnorWlUteDZGOChQVXBqZX1lakhxNForOClvNUhoIzd2SHhYb2FNZiV1U0soJU1+e3EpR1VneD1XdyN4WWkjMj85Cisma3dANnx9UiMmZ29sMnB7bX1TfC1RbW5KRzUtQHkyKjJkKjc4QzEzI3ttaHFQe1lDNU89PHA0ZUVEJFY5RmVoTjtgfWx8fjN1IT9oSVJeCis0Syo9RCVUODVwfjBBenlBI3V6IztXeTIzXjhuTyk9eGhaUmxCP3BmIWtPbHZzTC1OYyVBUmhDITA7UnI2VCQrOE1BcCM/UzFjXm4zemdkCitXPU9XTlM3X25jZCN4RE5AfDJaWURfbF9Eb3wlcTU9byl8SU0+Wm1UJmViTHk1aklgM0l0ZDljSW9qQFYjY3J2bV5ZbWxDOypZakBpK0J8CitfbVRmUClJfD40dW5ZWHtMIUhXX1BWbCNtNWRAanFzcWxjVDFrNlgxQ0BxUkJ9TX1lNzdZdXJGaSspQmJJfEwyQUhaTVNCTShSJjZYZG9zCittKjZsN2ZwKH0xZDM7aTZhdDUpQ1MpWm4xNVgoU2opK1BQPXU3V2c+Z0dhbE9pWWVhQ3MpcV5VSU5KN3RxK2tJVVdaTGNjcWxnNGlqajhXCispazMkWD9AfVVUaitCYitUNSomTiNAR3VANmg4SWRhP05gYmN7cCYwM3xjMCEqPkAmeG13T0x6aE1AQWhXR0NpJTB8KD4kJGs7JkhZXytxCit+a3pmPnY+UjxvRk8oPVAzRGlgVEFaU0x1X09BYCEqYWBlViFPcCFQNWJQeVZQey1IYGR0fGZqWW47PlRldF4lbyprR3tBdj9ETEhLdipICitjQUc+KUFHTCMzTCladnUlaEJPIXgzNzJNJW0+OzItczh4KlJMU2tvclFBKStFSE8te2dUSnBMdnJodCNLWTVSeHU/PEs2c1hBO2hfO1lLCitPaU5nZ0peU2o7MzBHYUpCNDcpIyl2O2tCWHtDXkVeTnFZTlVWKlRrcy0kREY7PXRTPiR7cCp1X3FwP0hiQU04YD5YbFBiUiEyJj9XTFpLCitVK1MoR2Y2TWQ7I0VOeTQ2RHo8QH57O3cxWmQhNWN0ZXhjRUNXNU9TZS1Fb1B2OzhCWGhGcHBRa29tP3tDKjNJUV5MKDQ4emk4MmowJUMwCitNU0E3YyZoS3RfUj5TNXk5I084OXspQkV6Y3dqODMxQks3ZmdDLXpEQWNKT0RYSnFqKStDZnctfDgleTM4elEocUxyfjRHUmBAX0RoZTw3CitjNikpQTBqJUwtKDAtJWhlPzMydXBvcnIrZWFnZ0ImVVdqekkjQnJDJkRXSHZ6WjV+YC0xNmpfIVVzMDkoP1QkeUIpWFl5WlBrQzBsLSo1CittMmVmRF4mRyR7X199RiprRSNOWHs5ZE5AYG1AOHljPG1SfCUlP3FlS08rKXNaLU9eRVAoRSE7YTZxe0Nvd1UhWCN6YHlyX2BfMSMtSmB5Cit6cHRAPVNmV0g4YT12amJWUEROQigqUWtebUwjKkNge188QigyQDM2eVpeaGl1cjBRcVFOY3ZrZFFWeUd1ej45NlQwZm1GTz9POVUwK3MtCis0SzRZe0xeeDhVe2NsOUQtNXZjNVl2bjNmK19HSDxLUjUkfFF5b1lkZjFtezw5VVVUOXdFT3hBdU57byN+ZFBUZyhyNnJFV1VIbVFtXzY7CistfTNtUXdRU3lILWt7ZHljOStgPVBva1l1OUh2az9sYDdNTV4/OTk4WDk8XiZWfDc9UDc/VXNNPjk9IT1WJk1tI35sVmx7JDs5QSg7NmwtCitMRGgzeCFUOSNrZEI1WDlHe31eQ3B7fC1HVihBb2xSS05NMlZrK3thVHsldDlwM099ZVl+RCV8OGx2ZWo2T0Umb0VTVG0jPiRmODQmMjYmCisocU1CQGJaQTZ7UCohdiFIaUFveD4tKWpMZ1opYzZwMG0+PiFXJV57Zj9VRFF1ZlBsSSQxSzdJV201QmZ4IUIjcSZBQ1cjO1RrfVREdFIpCitRKm88ZG5rPl8kX2FxPChSRFlEdnBsLWtaJGlhalR5KkRZJVUmWj0zPjxQYkBfZWR3WnRfVFg5WDV3JClDVGs7YXQoZGNLN2IpUl93ZHU7CitHaXVXTkBuJGo4KUJoSlhgUz1hcTEwNjZWc3pScUxIRV9Pb0xmVXA+QU0lQjNsaVpSaVhXKSNGbn5SUyprPVZzMj4lcnw4e3JXaWp7SGFWCitpYXViVEFoMCZgSH4lV09+QCQ8dEpCcXsoI1U9dXlJYF49Yn4+NFI/c2g5R24taUd2PCt0Szh7MT9iSTZsUmZZSkkkPmIldUUkOUUoKTJQCitRejN0JWhLZzdsSjJTUGVEJjVeYXQ9Qnk4ZHhuX2kkc2t6NDhjNlQrT2koV0pyXyh8aX12Z09Scn53ckRQUD87eG5DWUNXKl5kc0txdmhhCit2IUA0bV9FcVdsZDNJKHM3a3sxdzJFVV55KDtzOCUtNEc9WTt4UH0qWj5UQD1ydl5jSTNtPEc9d3I2MnUkZ3dJWXIkcCFaQGlfQ0drbXJxCislIV5aQWQ8U2w9Q0MrbzxMTlFtU2BqVVd5azdSSWkrazNnalFOYVYle3BGaypuMSkoU1JmPm97RVNzMCpHTFRZMk1pe2tKXzJseUFGaG1DCitTSz95Oy0rd0BhNik/ZiNPWnJQO0NteT0+bTsyPVpOWDg5MGV9SCYyaC1fT1RXNnRJKDU0PUNeYWp1JXFzWnUzI31Rb1pEITxVWCVtWD9PCityd18xfGh8QFZ4IX17bik7KlZUczFyT2BGVFpRYHB7MVQyI35VQE5fZyR5KHhVTnZVST8jSzNgZTlAcFVyY0NlYmdsdHl7Vzd2b0MhYDZ5CispfSNjRipUT0FSKCRpJHBVIzZobWY2fk5tfHpTfjV0Q1JhYnpSdnVzKiZeSyV5SkIoMlglSDBTbjUjdWFkZj14UXxle1RfVEAzclNHVDk5CislVTt6bjhFc0Y4dDAobi0ycSFHNTkzTmpAV0F4bDx2cWtiLTNDS0AlJk0kczx3KXJkI25IOHEtcDdRVntUc2whfVk/Q0NgPXVPdCVvemN1CitsSmxEMjZXXkFgdkJ8aUtldlo0dSp5bSlmazUhRzt9ZkBtfDA/N3FDYzFgdjQ4I3ApNjwjJWl3NHpRZXVuYER4K21ObC0xa0o4aUFBYyQ7Cis+fXUkaVgjXi14WSR0O3s7WlMjKk00RSR9N2B4cjQkZWs0KzJ4ZnMkeEM7V3NLRTZAX3hQP1JBeWcpQDhweFI1Y1JHZEhTcGB3dmVofmo2CitFWlFQYTt2cEkxb01UXzJrQVhxV0IhRWI5UCtDZTAkWlphbWJiYVQhcDNOJSh2QE1BJHpRQT8yY18rXjEqdiRORTJybE04U3l8Z1due2ZrCitpfnNfKnAzQDk0KStnfXMhcGF3VHlPXyRvdit2K2g/T0VESnxoNHxjSXJ+ezg0dSg2OE12cEpuPTVtJl5RVjVrTjAtKkRSdTFkRkhne0opCit4fn42LXgrdkoyIUArKjBUT3ZTUzxLdFM7S3xSS3thM15CZzZVWkhOS2tSTjZXMXBVbXA/UnlaUmBIViZveXBqMjt5Iy09cW4ydSNVVHlpCittUWByRz1seXFxP0lmJXlJekp+dk1gQE5DKyZ5TS05SHY0a19GUS1IaThNRiVIWHFjfjBAaD8qYHZMJCVRUW04Z1dtbE8lVUM9YiltWkQjCitPck5sR2prZXBueiNwfSsjcXBlaGhWWEJvY2F8N2xwMHBjZF4yeUApV0ZAU345Tkxsbm0wQEQlVzk0alFlMiRTWW4zZkpFNTgybStRYlZpCitMdzsoOT5veUVAdXtCYigoP2FCfXIoczM2PjNxWktsdV40YXlObzc+SSMyZnJyUHhqS1g5SWJ9PGo+dWNrejh6bCo+ZWR6S3ZwYGNmXmkmCitTWSVPK1hpeT04SDZhZkA1cyprZVBVczNFZnJSMzxKYEJZY359MEtSWUNhNCZ8d0prPCR5MnczNGIoWjljbUAhZ0pabVRvaktwI1I9JXdXCitgRj1AJWNTWHFlT1p0OUFlYFNVU3owaTw5JkNvPWZEPldoV09SZmZ5MStFUlJfPFd2PklHUGhMcUVCfEE3TXEwSkAxfU9Xbi10SF9ZZ0tNCishV0l3RzZ5UnRjd2tZKDs8cDI+Mn0rRGI4O0h4dztLNHtRSUAlYityZlIrXzUmUCZeZnIxb1R9aS0wZHc5OT05YDZtKCVHb1NKSDdARHt+Cit0KUlpWlZCZnQlUERLXytHeWBQRj0xd0cyaCFfcEdhMUVOX31pSWZacytmPXtzUU9VT0J2eC1lcEN6fXw5TlhNK0I4eCkpPkZjRTtUdT96CiteTnIqfUdrY3RDQ3Q9QkgjN2M9WG1ueE1uIXxWLURgITEqejV7I29SeDl1VndwPCFxO3ZHdD1pblZ6Q0R6OEYoWUAtZDNBTF5fPSpxfTFmCitFPXMkIVcyJXFCbkRCPVpYYndKb2NXRXVOdyFsNjRuRT11Rk9DRnlseDA9JDAoYEgwVjFMR3Jje2N2dTBGTkAtWXtDdXA1PUQ8MSNTQS1iCitfTVI7Vik1YHgqJD8hSjc8RT5kSGt4Zz9qTHxsO1plR3c0P2h8bT1AQX50O1JfTVlmdHlqUFhfTHkhTz5ocXk9bnl0NXNBVHBva0JEYGJNCitnaiVTRE8/cVoqQmVnRjFSOShXNWxzLS1tV3FHbHZ+YWl0STVMVUJGOVh8ZFYrMzRIPUtTaWtiXmxmTV8yO0dTc0tjKH0wZUJLX0FGTVpnCitVTUphYDl8ZWEwPT0xOWFRZmAmVDZLO2RATDNlZ0VLRlU5eCpZZCNEYlQtK0F4e0NjUUBGcihTTGZpVVFKUEgxcHVFRFgjTSpLUiVraEFYCiskMjI2KFlZKlZ8SyN7SDFnV2tjeT0+S2dFblpleVA+MFlyT2R+XlRRbC1RKFlLQjZrQXQkVil8PDszXld0ZDhgSC1scT5jSlMpRHQ0d1BCCitGaEBqYiUoSU1PPEAoeGU0YEF5PDF6JjQ5QGkkM3ZBMyRiTWYrXmRJVztGV19EVjFwVSE/QUBnRjI0KTw4aDZNMD5DOzwqcnFkRzl4dmo5Cis1SUhhQm82ZEJfQHMmOU1kV19vUWA5bm1KPkw2fnQ2WnJLYDNjdDFMelNfTX4wZyo0VWJEcVFeWD0ha2g+XmFXWWZ+UCRIJj9vSWhKbjN1CitnZFlBbCFeTT96MVVKbldtTVBze2haRFBZbyVhdUtIUjFZaEN3SzhWK1ZmSmNxVEE5emxtfUgmfDd9Ml89QklqMFdESm4pVy11Nl9PfDJ8CitsNWBvOCUkZGtiKW94OEh8K2JaclZDdWZEV1orRSN1MDlkIVFRQmlAMVolaDZ4c0Q5M1JhaXhEWE04Sj5wVzsod09GN1YoVC0rUGcjOGtRCitYdHE0diNObE5QMDA0QzgmUTxwUyMxNUQ2SDAjNWorUlJLeEJnIUUofVp9YUxYaj1JRCUqbGw+cD4yKEpfR35obHU/YiVsKnRCRz19d3RsCishTzArdiV+WlYwZEBQWnA8dDFEYT99Rlk3XzUlNE9HPGBhYHYyR157e2hFM2xKTkwhTDModC1TJlZ8SDNMVVkzUzsmX3VOV0B3Q0JkYypCCitzb25hQXRqMjw9JHJvI0BrSXgqIW8wWHZDUzRjdjVAUjlCVkBBUkRebWE3PUhLSS1yQ19VUzV8ejhhbEBCLTtLOCVmWFFjXzY2TFhMJkJYCis2aSt8aGhWN1lpcXcjbklqP2NEd0RPSi12LXE8alhyaVc7UmNCRjZoak1rJEJzal4jI2g4YCF+US13XnotVlE+VFooPFdCQ2hwRndHVUZ9Cit9SzJWfSleMEN0TX1KTG0/Y1liLTtlN2FqY0JuZ2g+O2BncEtXYnl4NVlpKVl6SHpUfGl6NU5yMCQjb2BNRmtwMV9xUnVFb1NyaFE0eTB2CitEQnJqeWw7YmVwJjVzUkhJRjlvV2dUNCp1TTMyI05jIzNxTnU9PCohfVZwMWt6dyVkWWM+cyMyJGkrTFVmczktaDAkbz9lckNPPFNVdz9NCitgay0lTU0+Kj9UJjhrZEl6K3o0eHtSKSFEX3tXWWBwZzwpVWQ7JEVKZTxjJUQtUUREPHh9NF54RmZFdGk3d1NaY1JXOCtgUX56TCtEeVBiCityLS1Wcy1RREVYaCs1b21fRXklUUF2PmByUjdHMm4rSkhhaCVNZU4zYWtwQk49cVhNJipLOW1sPXpKYTRnWGEqVGxnUkdnJGV6YjMme0lsCit8Yko7aXwkMCUyaG9qUEEqIWhodiEoWnNXO3FtSD9MKlpXfmA/XzIjcWpaWEpTVXNDOGlyakNyN2VNdm1wbWFpQHQrM3BhMG5xQlZfTHtjCituMEROaXpRWVo0PTdfS1ZmWkxGQl5gZ2h1TjlYR1VyO0ViYHQjMllrT0AzTXNINlhQIzg/MF9CM0hGYzw2c0piQzdpZEJUNHNCaCpGa1ZiCitVYit1SkpyTFhKODZmVWdZX0IxWWIzc1BoakptPmhxeH5HYHVTRnpBMiNheyU5MD5fJStGOzNnT2p9NHxBZDVIM0wyWGReUCNSNmVAVEN4CitWWGNNQ19LUm9lP0krcVZpYlc3VCZAaTYwNV4ySlRFUHs3RTF1cklZVmEkYyF4Y3BFMHhIVnk7RUNteWh0e21mYSRwWFkxfEFzWEBYUmUtCis+YXZtJHRfMGk8NHM3ODRRNFc/NHo5d0h6MVhzNDRBUkw3bWpfTG1EI1N4VWt7UmpnPDZoWjg2Wj1YUGJ7QTJ1TCRMKDhxbHAlcz5qKFctCitHY1kpM3wtNERNREtJWlU2VD8zbllFXyh0RkxJc2lpQ1VKbyVKbTc+P1QyZ3ZGczRjclN4M1BjMyo4X2RWU0JDS1J5VnBrKD48dUNSKnxFCitzUyFKbXxGc0x6SDRlJGlnMHRuNlF2IXZ6cm1Re0wyUmNzZStlVjYpQnNlNmJ3dWIoYndiejIkNHI3JHM0N1pmckZ6MTByIztWWDxRdWtOCitDRXFsNkFremt0KGs3M2dfNWRhb1RBdE0jKlFHeWRSJndSeV83KVdLRj5mSyVtUk5IcjYjK1pfY3tzR3hPYyR5Sy1OdTRNIW9gRnZWSjhCCistUGFLQm40TjdwYzspTC0mRjRJayFAOWFqb1d0SiYjUWUoOCN8Z3xidjxmckBSM1Itb3B7X2U4QFl2Q0M+UFBUYl9YYFgoWmR3LVkwPWdlCitzPVdPQyU5V0QtMiVwQD1lWUVyTCh1TTBsP2htaX5eVkpAeiFnJGI2PE8kWmEyaVQlSntyenkmVSZrekhfTjE/UmgzNkFULVU8ZDEpcHhQCitQJCtEUl93VlZkUSVWJEU1QDc8O2soRXhGeExBQ1pSeygzIypeNiQ3VlghbCFRZnEjRC0/YGApe3tEM255enEja1R6fmxFSF4mV2l1PFBxCitPalNVIXpJU1FyXlY5VS1ATExjSDAhQzlwMCo7X3c+fkt1e3Jjdzd+JSp7PUIqWl4lNWE4Njk/PntVMUUjYGhwPG0zJj5KVU9MSXgwdWZSCitGKzM+PEN9Tjk5WExQYDJAMFQ9e2FOKU5XKCFDMVBESTVuNGlaZUVjbkRVUkEhKn5xRURuQHIzTyY9bCE0YHg0OCRaRDQ1YXwmcngpaU1zCitCTDZubmojYCQ2Snp7NDZVWmIzTFNwZUBBMW1eIXtMeyV9KjdycXp4dCktMitYc3N3cypAKGRzaGgzezE1YGlnNX0mXkowNFY0V192Z3IwCitSaDBMa29GSytIIU5OVWVJTDVTSjh2NkEyK3Q5dEV6aEZiKGApWkp7bS1BMG5nTTdXNVomdmYwVUgxc3dncWtCdWNLeDtIdDZPPCpvVDU1CitqYEk1TCVXUD8lYmU5Skt4K3QleklqXjlCYmxRSE14Y3NtaCtpdCYleExgdF9RKzwwI21QNHhoenRpKGZVM1FnazxFfS1aYSV6TW47PkZXCis5eSZ0bVZ5I082bTJ6dzheYnl6aTkwaXt1K31vVWV8VUtBVyZGKDYtJU4mcE4lJWo2R1F4YyZaRkR3eVc1RG5fc2VJZU4/cDg0b3xoOCs2CitxKDNlMGJDIVdxfH1mOEorRVllUEF3RTxFclYhXkkxRnRZTW5lQkBsbjRCR24zcEc/fl96IzhzdU93aio2TTNWTWBsVWJfJTg5a2xXMmd5CitEa15jPDxtQENMRVBWVlpDRFg4ITxzeFg4TlEzTGIhd0VKYylKcUFJdnFNOXF5WCFZNiR+fSRkUi10LT5TVWQ5bClZb3FLRjVZdkpKczc8CitaK0ZHSm1GJndPSGAwJDR8MVNsOTNIYn4qcm9WczxzZnlnPW1ibnolSE8+ODJMfjI+cU9abW0oLU96OFFVWm43YyFVKkJjQS0kWXNIc2p6Cit2eX1vXylRQSgqN29WamY7d0FXNzZPZno9Ji0wMXx1SlRDVnU8TSYtMS0+X300U3o5ajxaLT1SUVM7dTwpM1ozO1BSR2ZOPmxlanNoTVc8Cit+Xzk9OTl4P3IjX0B6NiF8d1ZoRCo7eFItSDc/ZHRUUl5DcDJtI3ZNQXYxKnh5anNiZFg9b1F2UXk4JlJidC16YTZ8YlJqTHxxcXQyckVnCit+MEE8QDxPbVpeWDF2TTI2aTJnQjdme0VjPEFrXzEhdVlDKWE5XmR5VSpqeU9WNCl1NWRGZ2dWViRRYmFfNHdOTUAraGlxNT53ail5RFZeCitgdDt0UC18PjgpVlp2OHZ+Pj89MkRAQ0htPCtRTVM0aCY4QE8qTUpYfSpCSWhVa0x1XiQ+Vn0yUjdfOT93ZlFHbiF+K1o8VDMyc1Q+T3ZFCittMnooeV9WNFRYfE5KeGBSczBgTUB5a3B4b0xhZmElfkJsZCZjTD9JcUE8SWY7Z0M8SkIqWVNFN3FiaiYjeWAmIzExPWVwfEtjKko2YkJxCitMQmNMKWJlNENZI0xjUkUjNzlkKD9RX3ZLdz03VVdoIX5QVyFLbDQ0IXBvQWJ6bS0pO29STHVodiFhfHNoaEc0QGo/ZHl3eTRnfGMjeDskCitCVylLTTApWUh8UypHSntBN05JUWM9UlVLQDUjR3hmQl9HPzZtVkR4X1ZldzhXcUtRU2I0a29VcWlwbjtiK0x2ciU3bWd1aWtVTFdRK0YqCitHd3J6RURDM0BXKFBhWj8wZHwpPVFVfWlOZD00N3BvWnVjSFpVVlVPTTQ+RFNANExGTClkQl5eSnktfDZueHpsfWNiTXpjejFYPChFSkV7CitnQlRyVyZSWHxlPmp+PkdDO0p6K2hjTDxlcmIkQHJaXlRIPHN8PCR7Sl8wemVOTFliPmpmQ2F1eVohO2o5anEkJHFKb1lCfTVqMVd3dmdLCittOWkkWFg3NldAbEBuI2h0UjxMUyFYSzh1Y0NsQmNrTCZaTyshRGRfJFdkcEpnNnNSJnMyO3spVXIlPmU7ck58O1h4dk50VCtfR1JzLWlsCitaSCNYJWdNV0l2RHctWVchdWxEJWJ6QW1wcWFTa3FHQiFIfX1jZkozcFJleFRzaU5KV35iYjxHbGsjI0l9Rno/PGBAOGV6X3d5cWZJTl9WCittajJgJVNDY3paZWRnRntZUjB1eE0zYW5OOHwreGhDV1plPzV+JlZodygpcGNfYEYjSkBQWlYjeHFpakpiaUsxQEEweXswfHleWGRJfEwwCitCVn15Y2omWXsmRiojVl9uT2xJPnFRc3o3SXlxKHVDfHg3YSNFUjxFNylIaHN9IX5qPCt+Uk1Ec35NOVJWTnw+fWhyUio3VzZAdGcqSylfCis3MWJYN00pMz5nSHFOe2FWMktLeCNQJHNqZWA4cDBRV2IlI05RR1dUZF9DQExBYHE+cDd2NT5WWW53dVI5eit+dVdefD1HVFokK08oPDBsCitSVl5WfFAyNDxSNTVwVXpkRnpZQlIzcUNjajU2RGA/YkQlZ002IXUpa0ZsQmoxMzdObTZ9cWR7NEYrZm0ycDZPd3A7ajhZJWlET2JPc3l3CiszT3NOK3BhOzhyNHUpLVU/YWp6fXUoWUpnPkhtT1VpPGlrN15JNDRDRDwwfH5GS1d6cyQ8byFJdnU2NFJ2UUpkRiMoIUI7VHFzPU1lI19PCitEN0J6WSV8KCE2ZDZaX2p2aj9lUTEmS0RlOEpLQkwlK0UkcjhBQzlKel5nUld6WHZDckEra1d0OXZfO183TyVhT3ZmWCV2TihUJnEqV3VOCit5e0xAdWxXVUllU3AqQldLKCQ9JF9KMnNYfVMmbnkwKDFhRU1Cdy1Yb0ArWXxJMGJRa1Q3YU5NNDJCZyozbWBlOz1aRlFJPlNeVjchcnkhCit+Z2o1KThYXyNqJDhkWjlReEk8QUxCNS1LSkZXdlA4OD16al5HJExldmlSMGp7RnBPeitUTTAkKnBrY0JMZGd9TUo+SzFEZnxaUD8yeW5iCitIQjIxO1MmMUA1QXolU15maUZ4WXFvTVlVVz9AUGREJE5MSm5nVEVoVzhvd3tZRWZhYzNzfHJ9PnF2KGQtaXYkPG9SPHNYRFg/czVqOVFkCit2OTBfPzl3fXtMYDQoMz9fRDF5c0Z5T2E8PDNxV3FUWHo4Qz9uKGRoc0NWUjxjPkBxWnUzeDZwVD5tY3dAQTN8PjNfWCh7aVRPclIrcEhyCitIejIzc0tmSVBUNVVVYXtuPjxlPXlxN20jRUZIZEIxalhHPHIhK1pnOFppVHhzQTQmSU5Ta25pJVomUjNTIygqY2ZPRCRTUjFVRmdobW49Cit5YWZ3eVhxc1UmPXBTM0clKl9BNkJDNDshbSs4VSQ4YGNxY1MtRjZLZDsla1hLQ192d2JPcnt1KiVKNiNAVHZJcU9SR0IzV35wNXBOPE5BCitVailKKWIyY21obi1lPXlCbVhgVDtBT25edEVUJFJgS3Z2bXpmMXg5NHk+U0pLajhkRVExbUFsQG9LYnB+QyhrQCFQIUZUfkNmcllGbGZYCis4MDBKaj1kfGMwcEV2MWFlVUBmWk9OcG9CTnhTRVA9cWl+aDU+SjJoTX1MaiZtQW9mWEF+amFGaG9LJUckUVNCfXM3K2JaeG90TmtZVzEhCituOXtxR1FkflpuSVhUMHV7IX0rbH1uKEoze2M7WisyNjRaVUY4eUhte0Z5KFQrcDc8QCZwPmBxQFctfnN8amIzPVp5dWEpdyk2TylYJVBHCiteM1lJYTRYQTx1em1lUWxPcHZub2FAb3lHbEomLX0zUkJqbjYqd19ZfmAlc0xNIytuZjdSeHhBdUxlNDteQ3VnTmdubkNMTU80XjArVG50Cis1SEBfbmJVMylOU3E5OSV0YiFWcmI2cGFBNGVNSkRrPT5sa1l8JERqZU5RJUhzcHk5KWc+QjstM1hyMiZyJXBmal41SEAwN0ZTT3h3LSQ5CitMeTd2clNZcDVSeEZrJmhyd2dkZTBlKWQ0Xzc/MkZATmw8K01sJGkkU0s/UGJWPUdTVlJteTlUIS1QVkorezQhb3BsN2FHbnxtfnMxK1RkCitOY1k0b2N2a0U8VEFFNGRvIzZESHpkNEgkbnxtNU49JEU0KDh5eXVIKkIkJDtwMERGZUwkK0tUb3tzc0E3Q0RLV3BCJTB2KD5rVz4oey1TCitUNlZYdndGa0RpY3NpK0NwJiohbksjc35MVyNrfGR8UEk4emMwWTlHRkZeUSZsR2U8e1JKSWtqXmstUj0lRF5KSjIoeVFqXkA0UlQtLSFwCis4QjhTbSs0O2FRNXBXOUU7QHJ9a3skPU9NU0BPeGtUQE42fFReKSN2cWk1LTRKU2IrKGlGRFdOUkJsYU4xfVczaGQ4bzMyYWRkLXl6WXJnCituPlEqSnU9ZUxAYSh1a0xIMnxnM1h6eWd4ckVqWnIrZ09hV3tVfFYzeH5ZY2RadjdUJnpIM0owT3Rfd1ZjOzchbShSaWI2Nn09O0NwbGtSCitJZEVWNUpvcz97SUtJWWB7ZTAwbDl9VHpDKVd6c0pAWmlPakA2WlVKflpQY3lMLTg8b1pUJVFrTGhWVSVpQm5rMCVGJDxfeDBnNktMQGdLCispT2pZNWU3R3huPVVEOCs7eWZOUXR+e35wWVRnYEUpdDhibkAjKX5LWEMtNSVyZjlINVhCa3dfVUpuKFc7KmBCfXdrZXwxbWErbnpTWjJoCitYeTM+LW1KMCVadnZ2d25mQHQ5Ny1qJDx7T2M3TSVKRjd9KWMjX19sblMmdD8heVpyRylGOS0hPGkkcVk/JlhGVEU9TndZR2o/ejxaYHshCis1e3QpUWZmT0x4RD04UVo0M1hrSWE9NWJ4IVR0RyN4ekt2Wn1eRXt9ayp0TWh8VlpwdSppNjRoKD5XX0tGM2ZtOCVpcURiND1wTDc8KTVOCit2eTE8eEtZXmooS3p7M2loc1ZGVUFjSjYyNiZOX3twUFJ1ZTk0fitwVzQ0c2N2c3lybWs/PE88WWJsdmIpNnMoPTtJWDN3aUo4Ulo0ZU1hCitHJVNASGJDeXd6TFhYSGQ3RGhuSk03e3xXKjVyNkp5ZD0jeWRHViE+V1pjXmxkSjE7d25ucWBpVVB6VmJmY1MhOShLRWtNJntAMW5ue34mCitmSiFqe2oqPmBYUzt3UHN0JDYlbi1HS21HI3t6c2E5JGFkZVIhYEhFTzxpailGUlVBU0ZPMnR5cyNQRkJIVTBEVHhaTnZTWFBIZjF3eUMlCitXcTVEQlNKUGRJPiVpISZGISNxdkNSXzImPHg2c2xJcj1WOCQ8SmxuJUQmQ1dEQCshP0hAMC1eKF59dlZPWVZePU5LbDxTPXdadlNKO0NECitQZmg8akswYHsraVU0fFJHUCtjdnZ0JHJjR3Y+UVBoJj1XeShDOTk+Q09WJnolWXVDe1pveGp+VVdlIUN+fHYtYkREKlB7T0k5SkJ2fnZ3CitodCUtflJvVWBSYGl6UD08b1JBSXtQXiR4OytYNWh6WEs5N20hd2hZPWA7bGJeUXNyNVZnIVhOd3B0VHs2UlF2VUkwb0ZuZ1MpJj9ecmtWCitGZXVvZykjWkxPRklUcjFOMVVBbFlgUUhTWmFyKGxVVyM1cUhuPzJHRCRnUjs5MD9zKGJBYmZ8Nzt8NE5XeVMzVEFZZiY+RWRNYDhvSnopCitDOXNrWHFGQ3RjTT1XKnJXI0FmIUd7S2VQNy1rP3MwKCMxV019WiUrQ0RfZUUqaH5QO21JeWRWPTJ1Pk1OMHs2V1BheFdVU3dgR3U5Tj5ECis9PDRLfmp5X09zRCkyUShMZVFObyk4b2l3dTFhMHB3dkRESUNqcmBPMD5iSjxUZj9qenQldD9HQFozamNnZF5Ffkd0P2tiOSZ6K1F6enE4CishV1IqVUBCYSY8TlBUPX1OJTUkTmBHRn1GZilOfUlEJXIpPCUwZENOeFNKdTkzMHA+JTJQWGBSR2whSCt4Q0lSPzA7OWhyUk5ZcCpsMGVICitKbnpnaVhzJjlHT3dIKCs3OXtkRChOPV5RR0t0eipHdFNIWGtpeHkxNWZ0LVViS1ZqWS0wOEQ8ZUdVPmRLZWFtbG59Nlpybk95XzQxPXo4Cit7RzMzY0ROUjQlbmRnQFR3ZzUzOzNpeTIoY31INVJFflA7YkZXWXlVKChMLVgoMiEydFNhej1ASCN5IU1HPmwoQ35NPjd3Y0EtRWtHZ2YrCitRKSg4VT1fO2J5PHtuYzMjUENoZ2dWKCNMVndZYFlteWFxdERJOztaLW1HRzA7dHdtP1JASjVQPllJMHRPM3FvSXl1Y1VtYHhjJDReRTJLCitjeE9OJmJaZ2NlfD8xb2lebnxSZl8lM05KVWxaUmZ7OzxhSG1GWF5KJXd8ZzU7UzNOdllPe1JLbFgrNGVle2JLJCQqRUtHMmI4cGw1a00hCitUezhFaj91anx2LShxOCEqUktNdlMrJEBmWHZ6eTA5JWpxfFNgXylRajtMQF97JWFmWUVXaiQmQW5XSWxCYyV+K19rJjZhSDxpbEhWNVV1CitIZilVcnJZR0RLcERoQ3dsU1doKDdsWTBXM09NUkk8PHtiUXdBZk0/OzElI1M3REAxaGYtbnBnJFh8MnklLUY5SiZ+anZndUVETG40T1NUCisoSVNWR2VYQz01REp2PWNvN24xT0pPZ0J5NTJCQGR3MHIwaXAoJUBnPHp3XlFSb1U2RkZ4YzFZfVEmQHA5eHJJMWJhNWo4dm5Ze1MlaXxLCis7aUhqaSF5QjhHSWEmdjZXYG16SkpCI20wVEk1VFhfT0Z8cnwxN3s2KGd9T2AjQVgyVGFILTFeaVVjQSNaUlk9dng7STtQNnpRNW8/fEYqCis0JEdYS2xkfWUqWUVEI191MzVoI3EjM2FORlBrJXI9PWdPP2lgdWFiMT8zN3QlP0wtaVMqaSFpTjY+R1VPPD4hOWZXQVYpaWxHOGhBKHw4CitDemV5YWBzUiYyOXtXTEllZGVrZHQyZD41fCpoJU1FZFBWOT9ZdTs5PD1ZanpqVz9FOT9RK08pK25AOVp3SGprSVZoXlgxXlRAOSQ2RTlgCitIfV4/QCEoeUBLNWpXUHU/QzcrNWZeej5SZTtfTENAUmhCX1hGSUhPQkQqNmNKRz08SEt1UWVRTGQ3U2FPfDdUKk03dCFyNDVOblNkalhRCitKKHpxPTg2JXdKb3laPGB8Tj97K3QySHY0fW1iS2VleXkrbGpvc09YSm1PRC02TnZMOEUlaTQlNHNBPioxUk8tRzlnPjhmenZ7VzdNSGZJCis0VmhncyhHQTwhc214ZkYkUjc8aSMtMUNleH1MbncmSkptOVVgSGFYMm58ZllOcHprbmI3R3BnaFU8UjVJQDk/VVBtejRVWVpCMTBYRUJTCitsPUNFdkB6Z35eaGEpUl4+QEViWUlqemtvWShRNUViMWg+KEc8WmB1eGhtdEpJU2kjM1JZV3NpIz0zKl5iPExIc3NncWtjSktVYFdfazxWCis5KHl1S1hjWGhkfC0yKEtlOUp2UylJMkUwPWVDYCN8RTBhZlc/OGVqbHlvaUJfdDx5cjhUbmNiaHNwelI7IXVXcCNPJTJQcE42Y19DaDR6CitSX1lHcFQtNnI/IUs5e3p1RV51amN8a0lYVT5DeW4tT3xqRnA7ZjZJOS00WUBmWEYoLSV2dkdXYl9iTUVtUiUkaVFRQHppQXloZnktZns0CistQG4oSnh5NURnVExNPyUpdDRuUU9TYFNzMF5zbylxekR3cTZlSEtkQTU2PVVkPUt9PDZ8Uns5SUMlQSEqZWk+U2tqaGU3UlRNZEB5U2ctCitvVkErN3FBciNTQWN9PypELUVYJHA1ZShpP3NScXtvfClsYnN7ayhvZjlPRipqTEwqUGl1RDRqaGt+QE9rREZ7eU5zVDJQTiNhMWkyPEV5Cit5PjEpbF5mK0VNI1lPJSlgNT14eVdUK1JAOGtNMSEkPmRFPDtFVEBBZ1d9cmoyYHRmK2hFWlFmPzVJYDshQjVsTnBUT25qfClKNXdmO3ZOCitTVXZaOXllUjRXeXwyQ2lWPWc3cTtiWGxfM1YkZDkoIVBQUndvR3V7SjdPXjN9RjJENSZFKzt9Sj4lVjFqV0A8WThmJkl7JUYjOFMkJT1HCis7SFYtfXJ3PyF4LTBwb3UwKkNMS3pvKmA+WT91PWFTc1F8TGdjenRHTkhtXjMmMl45XnU5fV9BSyspR3VjTyhLS148U1FhLWt5bkUhNDQyCistRSo+LVF6UXczOyV4bj9ARWJibjhIWWtDSjd2O0RIP18jb1E2cGhmfW84S3AjK00obmIxJUJjQX1qez8xVWxNd0AhVjMtejZwQU1rSVNpCis4RzBLLUM7SmE/QUNhSGVfcTt1dmNlTjNFTkF1bU5JZXo7XmstTXJGaDMoOGBKNG5WbWxNM0xTI2NiNShUX3BVZ0klOHR6R3RnVXVvV09VCisxNiE9fCExY2gmRmxXP35oZnh8dD95Xy1gSmQpOW9uZnFxazx5QHUlQmNEP2BiN0I3Izh7ZUpYMldnZyp3cGwtdFZKTG9yRz5XbUZqc3F+CitBK0BDdTI5UVJDdTdLWG09aWNXN2JZMlh1NnRaIUpiTEVpdjc+Xmlndk81V01qaG1oO2BZX1AxfGdibzB0ITt9SUwrNnsldDJ3d2VvKyN5Cis+dzc/NT5eI2YxTERTKWQxPHo5fHJuYnNPJSNgWURweSN4S35JUF5+XikmRU95SSQ/fXFySTBMfX1PJkl7WUhHSVZ+XkI7bV8zO00yaD1gCitjWkxLbDs7IUFSRyhTaDV4UkRzK2UyWVI1NUMpX01wYnRFPjtWKEtCQSR6UDh3Tk1CQVBtbGUlQD57X0szNVdIaHxfPFpnUVhUaXgzY2o0CitLKXt6dVgxQzh8QSMzNmFFK2RZJD97M3VIWnteLUd5ODhjcz4laVpEVURHVUNBKk5mKG1icnNWMUlDN2dIQXk5WFRmP3JMaEIjOGFKSWA3CitxNHFvKWcwV3tCIVZlPj5kXlBNQmdFR09hZFBKeiUlZE5zM2t4YFlBO0NwV01VRXFya35LYHV9MVFHMWxsZ1NxbG9WayZKd0o+LTBUQWxBCitiTGlKcFU9Qm12b1RBZSQwTS1EeDB0JnkmdXc/aSNiKWhnOzZ+Pm5UNjIhV2lScnZYTUYkSnB5PXR1azxOamtPWGRUciVQI3heTC1SZkFPCitwWUhBKTg+SDtjZVF8IU8mKThDQ0B7fTZwdzBoQ2dobmJNez9vLThxKHdXS3VrSyFkR1EzPT4pYFJLcmh8TVVoWCYlTTNuSSlXN1V3b1coCitBUjMjTXM/a3VOPmtBMTAoeDJ0NDIwbTN5OX5MISpoYX5UPnFgMjt1fmZrUkEhc0VHM2kkbShibXdkRnkrYENYX3puRFM4fjZKQC1vcyQzCitYOXJHUnJvRThmKXE0dVN3ZVJ7X0FJZXxrWm55RS0hO0xJJDd0IWQqUiVAXmBBKnQmbjYhTXkqczl1MHFhcDMmKGN0fXNCTiR+SV4hVX4kCitKOWhgRlVOV2BNaVhTUDY5VERAQ3pAVmx+Qjg8UlVOLUdyfitwfHlNNTB1SXdVKGFOY3pzQFo8d3FoJTZJNT8kaDs4aWk1eFh1eyl9SkcpCitMVjkhWDlJMjJ9MUlUc0hQdmo7dFBWOCg5WXFBVlJXanw2KkhfdSN1YVRqITwwNzFJKSpgSmRoOWlsfENTbCg1VkdLPSo3X3N2Jk9AJlEmCitXTjApVU9sZDJBb196N0pUMTB2UERSeWt9S3kxcSY3I3FyO0hsOWpuI008NypsK0BjcyE7c15UZnVwV24lUUx5PWhYMSZpeEJXNnRhdz42CitIO1BIdSp6WDt0U15CKGYkYz5mKFRqQVN2ekNoLXdDK0xmNSp2Zm9yPXhKZWxoXklmSndEMjM7RnM/QHAhMFlDYUs4UTVTOUsyKXtuNGMzCit6WnV8KiVmYD5vXyFifkIzZEtuWE1LPDx9KDxEd34yKGtNIXpqZVpZcnVZQFRtQSRkSV8mOXtXUlZ3ajRBLUZOKGVjJHloeU1ATChFRndRCit3e0VGVF5IWGxPY2R5eHtmPEpDcT94M012TmhxNGdmQXIydy1UajlaZkRFIVReSCpvdXZHeEcrfWQjVVdsLVk+WilFME1RMzd2Yi1xeVVsCitQVHl4VHpBYVFuOUt5Tz8hQDtmLXU+RiM0Znl2VUBvRHt+X1BCb0o4SW9LbEZaWm4tZCFSNzg3cktuQEk3Y21zTXElX2tYTj4mMX4tVXdeCitldm98Q3d4bHFpWmJva3J3MTs/UGVuTGMoMjZuK1g1cTUoQWl4WihhRSlXQDFYayhFP2cwSDBpdEFxc1BDQUZlZTxJQi1IWTM2cEwkITFOCittflU+diVnV0wlcy05K1VrPkslaDZLIVh7TmlnQjlSckRlK30tKGBmfSRfbEFDfnMxPy1sc2MtMV9aWCRpRnRlWlYzSXVZdX0/MkBRPGBwCitvNjR3UmFrZnEkOyZAfEgoaWZKO0JSJntjTDxyc2ZhYTFZNU9jajE2UHA4XjI2R2lJPTNsITZ8MnJ9b0BYe2klVWZlc2Y/SmlfV3B5UURkCishb2UxSXZsWG9ZfVNiU0pKOCVVM18jK15rNHMreHk3KD1waDFQWlRUYSh0YWR0QUEoRVJSanZXQVh2QG9sYnc4KWBPKE5remc7RnpKaW1DCishbTdxMi1WMChJZFlDaGo0cGAheih7cXY0PU9KM1NCaHFBby1UKGl9TSs5R1c/QSVSY3p2UDZUY0BgT14pdEgzQUYrT1YxcSNITj4mJDNlCitacTxCXyp6akl2QUdhT0w9K2J5Zmd8PE5wdHtCQGVCXktQKmJoTFRyRk1URyp8RnxUbD1fPzFkUjVHPDtOfFpPeSpeKjVTOFRKSE44ck9gCishWChtRmpSYmppcFg0NVZ3ISNMVTx+fH1VajdMPiQlbn44ITYlPj1QU0Y7eTBhaj1LTDZaO0U5SD9KZTc7b3NMOHY0ak1yeHNrOGIpPDM2CiswWmdZTiVhbDxKZjd3Mm16STA7M2IqYVdHUVkoVnRrZkM4KG5AKX4xa0cmMmQ1fWleaTVASXdAVExrWmRObyM7UypLampEcEstT2sxKmV1CiswbnhKIzJkeWpLd0grV19hKCVWTl9pcm1aZGpJRkRhTztxX2piZmlDKD1odiFtQ3hBJVUkYjJxV153ISlAPn5sT3VxfFdkV259ZV9yTTNICis/YEI5S0J0O2g1Y1NrSCZgfThyS3hVKUZmMTJxdFVubFJWWEtNTzZJRVo9KCVqXzQocmxoNGVWMGZ3dVAwX1omcEJOPkkwX2teMmklayFJCitwOUtPc2A1P0dTYWgoIXclNDlpYTBNZkQ9WVooZDBDYGJEPkhTcjIoc181MFN5WGQ+TF8qcUomfmgmaDdpVEBPdExNU25BZjZlP1pmNT54CitJQ1R3Y3tTM3xLaWZ5LU19SX19KkJ6eUItJSUxRFpSSSFaR2xfUyVOV2M3eGxmfU9uMEAqa2RMe0w5Z0QqYSFLXlFEVUV6YThUe2ZvS1JMCis1ZlZkYTY0Xn5BUUh1SmgyTTNBMWVUSzFKQk93bT1vaD17VHgzWVg8LXllJEtDQWNCPUUrQiQ3TUVtKnYpPzFIaXFnaU9PcFN1eWc7Qjc9Cis0PE5JZFF6TjE5JHM2elhEQClkJksoRFpJR09ANV5ZNFBwQysqdj1CRWVKbldIZTt9fE92IzRZclghe3xlXzl+fjEjRyFBaXJgPlViK1I9CisxRjtjWHUxZHA4UyhfTWk2LVFmJHxPLWZjOVl8SFF1KVdzdDt1LTkwUXtEeE1zMEJGUy1CRWIqc2hnX0g5UTI/Qk4mV0x+d3wkWFZ1ZCo3CitFR15oN1I9TnlKcUk/JTIoZ0pHMzZnZDdHNHVwYTBZfSZXJVIxKytiM34lekEmSXQrODdkfDxAWihSOFJYMT1OeWZ0T09lZTJ4Zk9kVkdUCis8bHcwOCNmY2E5TW5ZTj99YlpfSlE+VTxLYHlAQmVVTnNtaVE/fD1ZRkFHQm94fGxGY349SFl7IVF1Y0grR3x2VWlvJm4rKDJ4QFd5TzUzCit0ZShxPXdpPVYzciZGNUI1OHhNeTRjeEJTdSR7MEFIdGFQT3I/TUsoI0YmJG1GVD5jOCl7dWVjb2ojKDBLSTNKa0J2eFotMXNpIVNPRXlPCisqck5JUVZZMjBmKF83PTxHYShCVWRJJXZ8ZnI1K3A7bSgtaDkzbTlTOzhXOCMmP2NBXm5PVmNAZlU3SGElJEh9VT1Od3N8XjtNdDJoXmc3CitncCVQNlhQaVdNKk56LVB5VmV1K0hQI2ZiIXt3QXtPUW5CV1MrXnsrRGIlS2JaZVNxVnxyRzxgbE9NSUllc096ODJBLWVFaWo5alhNblJECitsVHtPbEYxZzJjUj9iI083RWtpUzN6Mjx2Pyo0SjdPKlNpSm9Xdl4qUmNpPyVmdGZsJEBtWkghdX50Q09ZVyV3cmdaYykoI25QQmRCekl1Cit9RmRqQ0NSPnx5UkNzWkl6U2hLeCNYYEM/cEdrNUUjN0ZqaWA8a3Y/Tl4jZ2R6dmZGKXVrSmQwSH48U3BiYkdvPVlyLX00M252MSUlfDA0CitNbDg1Uy1XaWYxcylmTFVJdVBUaipUbmkoJGpgOTlYQE0wazNiejI+IU1LWiFNalY5WDQmNUhFV2BlfE5udjxKWF4+P2lGNl49eV57WG9BCitVcUxOPik9ci1Lek0tNHd1ey11N2p4ZW98SWNUPkc4NSpBYVVzb01pbHo7aTt5bXE+I0JacGFxZVVrOFFkZFViPU4hLUR1YEVncnswT0BgCis/aCg4cSVmb01kV3R1Y04mZnI+WW0jUV92KSZLez5LZ2ZoU3JXPjNWcypffjxIOXZxbGBGb1FZK2NfMH1tYUMyTlNNUTNNRlJVPnwocG16CitZLT1rd2EkRkpiPnZ6OGxCVmAqSFZXU29iOHtXZHZ3b2tMMDh1O3lxYkxsTCltO185P21yYiZlcjg5S35ecnRQNiNVVUc8PEhJIUglT1FBCiszS2Vlemx7dUpaUjJgZFdVeUN8fERzO2BsUXFVaXFTYEZpY3haSktWPWdzJGpXajBna05UMCVubkdQVXcpciRieTRAdCFXR1VHRytgbSpqCiskPGpzUnNQOCpkQU51IzVzZz42TmA+T0s4cVZsMUh5fD01YloxfGxoU0khIzgwJUlLSnFqVDNZKmImJVViVW8meTJsKEEteVNNUEI/OHIjCitpLWNVTyo2MihPNiQ4bnV1JmArO3RkKnwrYlYje3xnQFZoeCE1fH57SVl6dUUwamJVYm40fVZkb3kpQz9LTF9hU1Rnb2R+NipHUnlzcVBpCitMTDhsJmMob3d9NjFUMSRWK2BMV2FANnI2Yz0jXkpzd15aTyM1bXJ8PmY4d09kKCMwc3hlRW9pezZhSF51dXtYeDY5UHRZcSl4N0ViI0cpCiteRG1LfCRPUm9iVDZ9IXtfWW0haVU0RkZpRSkzKzdWSWkpPGMwKjc/NCQtNksyTlR6Q1BFWEkyb3MyNWlzdnc1dndRKkJsSlNMTFJ3S0hlCittVWJjVFhIPE1FJGl+WTE+KWpnWT5hfHwlaV54Klh3RlghK3NmaVdhNUNqd0Y0TD0za1EtWCQlTSVITHNYeV9oP15PK3Nse3tGZThaTVN4CisrNDlLTXVtSUZRQE9Gd05Oe1EqSGRlJXdaV2thMmB3bDlaQkFAaUFiV0BVQGslPnlsfmluQ2p+Tld4czQjKzAheSY9RF5IRTRDTXVQYGwxCitxbk56bTBjfnZaKm9rZFl6NCF2c1RjcWM2ayQkSmVmbjE/MklXLX5HKC1gek98ZGJDK0hoeVdVbTUlRSV4XnIrTGNId20tZz5OcmAxNTFmCiszIz0qPGs8VjtuaGxaUGUpRml1NSQ5Uk1oM0pKJjdsMD1peVpZeWlsQ2RBakotWEhoMUhsKk0pZCNGV3JPZngpP1IxPDU4cm1BPTNQM3wxCis+K19xR1lOciMlRlJFSlBRRnVDPFV6RU9tR3JAIz5qMEVQMH44UWlrXnRGUnlpIzxTMV56NXdZWEUzU1o+ZWR0VmBVfXhFJEJaJD52WW9TCit2eCQhNikrJCE3MXk7VEA/aT5KZW0qI2pkZG9iU1IhYEktRlZeZktOcWR4JGsrJkZLOGt6XkxHNlMzUjxrN1FmJVYyP0EpZ0ZZPFFgZ1hzCit6P2JGPmgke3ZhZWkzVHliV3hEJkFCVVhzOHJNenl6ciR6cypaS2Qqb31nY1p6cFZld3tKNXwxNTJ0KyY3ezh3S2VhNEB9Ml4xbzVqRH1FCisoTWxjd3NhVTNOR2lsQXYyZ1NOUXZyJHo4dj1vZGhIY0F2dWM1Rz9aZFpUaGBYOW91Nj1sLX1iaEItIUlFZzhVRXBeTj9fUm91dX15Yk9oCitnOXhuT0dGV3lreklRQD9pISF8eSFCVFFgZGlfaVA3QD97IVF1e2woXyhAM3c2Qzk/Z1p9dTZhVmdMJTsxQjJ6ZSokLSRoVmNoemg/SXk1CitRZ35pfmkyVUFuelpieEFHWUY/JX0yMUp5X15sWS05XipCa1pHfHs8bFQmKVNnTUV0MXRPfU0mKGQ8YGBwfmZMJCh9VDZgdCFWYEtjYCVnCitaLUhBN29BbWJLSDxpJG9+bH5jTXpsKi1sdHBjJHghPEtSR19FS0t6O3A0KnYpKjs4VSk/b3dWY29hZiYlQkkleE5DZW13bzhZc0dWSkNJCitfRzZqQnpyT1M1OHcyfkRfdDVTU0JSZDVgK1k+KCVVNHNRcnZBVnYxRXxkZSlSXn5GUUt8dmd+N0wzYy1rUz5xI2EteiFYT3J0UnY7cjFICis3akx5Xl9hblc/bmBFeyVuZyprRGhlK0szI3Q7K00hdig3Pyk+N1M+dE5BaytOYEtmPDgoI0wqSz5SNTQ0czdwLUNWJShaRnNMJnY7R25PCit6T3ZRUUk4SyZ8ZlA5aG5fKVU4MW4jRDBNdD1KcV92NnBiX3ZQaEoyTkgoRDlpS0kjQ0s+TTheYkZ4ezl0TTw9VmAoO3RkJTVeUXFEPC1GCitkYWUoaC19YXpIdHxoN3c8dTFuZ28qOyR+aH45YWtjQWhaTXNATVdIXi0oYUlrR2M+KTA3UXV5OXZ1eTc5c0pVP31SPHNJQWo5VnhpU3R4Cis/Qy1hKipARTBQVTsjOSMqQVZMdTxtSm0jJFI3WXhtfGpSeFBYQXRJIy1IRnNFbi19QCs4VXE3N3U2Z1dxbXs8I0oqfmNxWFEwbyNHPUNtCitDeX5zUl8hK3E+YCglJlIwdHk2VjBJbGoyd0VaeGprKjZZfkxfJDQmPj1USmY2VkxORUFhS0ErN3NMTHY1YW5vfG94bGhXU0B1ZCFrbn5ECitNVmJLOUwqWnRAN1J1O1VRLXBrM2dNP1FhIVBoTShgRSk0WCR4Jlo9NWNSbWt9djIwUk9Hfk19NXRIJng/blpjbntBYmFFPilZZFBJZXc3CitteEhOd0NMOCVUSCQ1R0YlQzxscTUwTj9oOHBvVCl7aURMPUFTSV4oVXdRIU5vaUc3QXt1T09GRmtVN18qdiReeTJHdD1eV09wb2t4eCZRCis7NUZhMmZWd0BXflQ3QVR7e2xAI3c8cW5odyY1aVFnMHVJQkZTc2ZDcnhePEFIVThsSlpsUjZ5aWVzOHJkT1JXVmRlZCklMUR1S2xMfGU8CitHVT02bG1wO1pHXyN4VjF+cHMwJkNoJmBFb19kPmJNZEdOJmdVLXxfYHtjTFBac2kpYkttJllGOGl9Oz0qSCtLXntRKzxLKmBuOFlkJEVWCisoM148M00kKXkzQUZRKlI9OyMoSlo1JTZnKV5zKmptSVhlKHFKPyVZTTh1UFhVODhzLVdBSStyNHNDLWljTlpeJWclJFMhPztFcjhUcGB0CitMVzE5Z3BaM0U3TCM8OHlkTEhqYippTHd3aU9hSiEjckxYTGRifXFvKmVQeUIwR2woYmt4UlNrY3l4XilkPDFLdVJxKUdmKT9oRSlSdDdvCit3JG9te0otd0Zsb2ElUzRvN2pVPERVQzZZfChfaWUjaiY5Wkd6PENTaGl4fihAZkMkKTFkeTglJThNbEN4TFhWdFRPOTxPNGVZRmJ7M1NnCitTWlQrNjhuSHE8JGVSWklORCVxJDlJeWRib0dWPnJvNzE4dSZOP18qMzxvQU5BbDFXdiQ2ZjUkQSQ/elY7d3hQNk8mck59SV5AYlhVJHBGCit5ZG9OeSl5ZzI3JD1RemxpOVBAPT9OKE0wRXN0dTtPYEdZdHVNQFllSD9LfFQ/bSpRanlkekYhVlpOKEJNVVp+RmppMjdYS1BfUnhZIzdRCitFYGBlcFEyQ3FOdTZMLXtBUUkkSFBaSEZ6TT42UTl3ZmVRMWZkKUhnXykwdkEkRTtFdk4+dTgtSVVGdWFPY2FVdzsld2wkakIjZE1hTmtiCitVeTNTcn5WMmolQXBeKFF7b3k4SSF1V0xNSklHJC1sNTtDfHE8PDN4VyZsIW5MRilwTTZQX3VLT0drNnQ0UnFIODxWUmt4Ui14VDljXyF+Cis+YFgtaCl5PWVzQDt7QjI/Kj17MjQmIU5SRG88YnJUV3J2IWtMeUY8bWxgWFA2MW5GdGUwaGhWZExFUHw5NWplWD59P2ZXUioxIUs5Z0BaCitzRn1WdXpWOU5SRSEyX1Y8SzMwN2s4ZXJFdDBDYEZ2KlZyYE1SWVdZPnZ0aShPV0pOWE5yPUFrIWFxOCtsSXlkTXBVb3VnVzwjNldBKkhDCitqJGJ0dVRsMDwtSWk3Pmd8IUomRER1aVMjS1kzLXJsdHJrPGJBdSEkRTE4NWIya1Z6cSFDYyswKCkrSV83PHReMEFzbmN4fnIkeGQlPlVVCisra0dmbj98TH41PSMjJnprJH1OaHRtcDhJekVvPik7UVp9RkBveXduR3J0UHJ3KV5YdXtLWS0xRHNJRjBWLU08b2VZb3xXe30wM2MjcmZMCit7JCk0USVTcVMqd2pgMm1KXio3Z2xSfCpRaGpwWSVIIVlGOHE3KWtpJmg0RmpZMkRBclApTFQ5dWl1YyRLM2lpQD09dnxKIWNUUTVmO3RJCitNdXU+VWtsKyhKYStvcVk3KXM7eiRURE5uYj5neG0yZyt9b25nRXVoPE87IX1IViRTeEQ+QDFuMTBfXlpTcnZFT2JCRz9UWkZ7MSlzKiQkCit1aHI0O1N8ZWBGQTM3M3VgZkNrMk51M3BLVjAjYkB7dVRLKWghWXYzVERXK29JTCY7QzlQaGZnc3V3cVQ0QDE9eXlAIyhPeC1Ad2QxZClwCityXn5XTiliaXBsbTVeNHIjRlpoe3VaTk1aSVJjNkZGTEEoP1RXPm9vfEN6M147ez50cXRfKkB1MHpESm5KMVp4Y2lYfX1OclY5VF8qUnc1Cis/PUQ9MSlraWsqbFI0Kj82SG01YT9IMT9uIUEoc3U+XilqRVJ4TTlhS3JfMlpgckx5KkUzQzF3e0lgUkJqdUtCY1EtOXVPbExoXmBvJTdnCit6ZEk0Rll0TD94VHlmNHpyJnMkfmNDKWVBciY2e3MweEpBbmdfXll9Nk0kZilFeFp5NEtXOXNzJUlvZjE9JTx3M3pqZWQ4ezRLYT1Ndjx2CitUOVl6eztsYGZXaWd2XnxpKkoxWFVGJWRATmFlPFZabkVPNClqU0N2Y1AzWkhUeVUoUmJaUT1TMGZCUVl1cFFee19qSExDTzRhXkF2aVg9CitTfDZgO0l+KF40cl98Y0NnZjBhOH1LUVdgb3g3XktNXmlBbFlgKEhoUWg0MGRuOHxQNTFqbmNmfFJtaW9eOHMrb3c0RjU/dXFvNTNqa0EoCitmVWJXMkY1TChMfndqS2lMVzF8PzExUXpPOUtlaT5FPS1lbUcpI2ZaSWhwdT4+ZCNBOGhCUGsoUXZfd0gtc0xOTVNoJV4rYU55WF9URkgzCit2N18yVW5iXnQ7eFNwNnJ5NEsoazgqZGt2bFFQUjN2RiE7JkUwJmhJbGxpMTNCUjZMN0Ywb0xRN25nNTI8TUN8czQxKit5TD0xbypQVHRjCitUQikpKDdULSZNbEQ8ZTZoNmVub1ZFemBqYHJzJD16OFR6UTFxOThzeHhXN0RNQGI7UHc7VFh9TDNFLSlJKmtHQDstMyVWJGltRDZEM2xuCitGdEBWVVJVZyRoemo2aCtISD41eGwtcmcoaFFXNXBtKHd7d3BRWGAldzJBUmZjISsmYkUmPCEpWX4+b1ZTPmNhdCs8IzA7JmImRVohfFVUCitNeilvaF97RVpwVVJ6aDclJmB3TlhMMTRfRmJ7YzxIRUp3QX0kRjR2K0VXb1I/PmlqcXNGNSMhfjlMMHxwQSZWJTAxYWNnST9rMUk5N1UlCitkc25BJH1Sej9HJFh9R1BVM15aK1Nwe3RgWTlpcGEhZCl8V0xtYjwlaiprQVFNZXB9UXlUZDwlQ21TUE15QWZ+RVotekwwRUNmZF9WVDZ8CitgK01BQ15zX0xDSjZ0PjVhKkhKaHE7VyV2KkdPKClrR2VAbEdtZ19AS3ZTNkBAJWZ+T0dZK0B+PG12YmNvaShYJTQ8QGNDdVoxeSZ4ckc7CisoIWs3aHdDJVU+dz0+PS16QGRZfCtVdFgmJDh0d3w1MldwbEJpJSttT0hpYT5UQmdjSGM9KnRPRGhWZkZAVmI8Z2ptTHxRNzxOfCNIJms3Cit4SkBPVUZyTT5ES1BweWdHemdfK3g2TGpZMmtIZk08TiNwUElMZ01FWD1PKCFBIUhyITBOYUM9WHAkfUltJDZheDYlNSgtKlkkQ0Q9KkprCit8X1lhazUwJm9eNzBCYVcxQWIpO3smMFN9ZH0xRUZ2PnMmSWtUfUw2eE99Uml1SU5NKyokXzt8bFh7N1p+OGo3M1NZQUZ1OyMxJSllYj1mCitSN2RDIUVwd2NCWlVHc3N4JTxeJnBqRzEjXj82aGA9cztDdkx+Qj9jZWFeKFBBQkkze0BTRFRyTjgjV3F5YTZxX2JtMXM3RjYmM3FFOUp7CitVbm09STdeeUg7eVU2aEwocn02K1Y8TmFVQG98Pk5vVGcxcmlIWWJuT1VkS3s3WF5lfCNFPDxVO2ZFX0M2VS1Je0Y0X2ZzSUstYCtGSEk9CitIc3lgSl9uSTYlWGRoemRPcyk0RCZvOTlOUklUNjZgSU4zQjk5Y0tFWDlvJHpFZGlpbjZwK2hQajZwZDxDKE5OR3FaVWF4MSZKTmBnYDMlCitOSTtGeFlCejBOJWhxQGBjSzIkdTMkWktXRyVxOW0kNVRTazZyYylIKlVtfSlNR2UhNUJZQXM9JndlcHZNfkshPlhYJF9QQEd7dCp6TEdOCitCUUBGUSstMHcoVXpESGRAfFZ1PDJ7IW5YV14leEg0ejM0SEdhVzNIc1A2ZUZgQGBGUD5sWHQhe00kWGVeY2xQNWl7VkdUU15kX14ha2o/CitfIXtCTT9DTXoqQTA+JT5zOWllVDtYM3RAVEJFPnBsUHc5TGgrcF5HIzs0OFV+WUE0cTRiS0MxfWh2QnBBaiMtc2o4Sm9Nfn1QPEFFZ3tTCitwfEV8KWA0JngxZW0mfTw5emRZXjUtPnZvYGRzRV9AaWZUMjhnPnRubGxxM0N4TFA1WnIqPUU1Iz9afCZ3MSVnWmx+MGVsK0NFSkIhRk5WCitUPVVCUjE/SDc8MmVMPnFLLTdSYDg4anZ0dG4wXykhXlAoITltfmY+YCQ5IzBRT1NQLUZGS3h1bHVUaVI3LWYtN1BTOzJlXkItIUtNSX1TCis8TDYrflBAS2MwTFpxJlhGNyRLei18VDI3KjxSTyo/X1R6RXN9cDczcHJ6diZ0UmdFWnFqJW9JM0ZwYGdYZmd+QyhgWk9iZFFjNWB1VSFgCis/YCo/ZEBLMkROTCUqPGlWZnIoI1lNN3o+WHRRaHEzJilGbXU5dEttX0d+LXVVJVZjbE91azBRXmgrKmBMUyR8Sj99UipTLURmPmhEez9hCisxNiNfbT9Ua25gPHRSTGBscHB8XmdIZlAtdVliIS1wajMjYyZ9N0xpTU9hJHtFbjVPeXxObkdSa3did0lfPlowI19gKW82NXAlTFA8IyppCitEU0dkRTRkM2N0S0Q7TjBAbkJFa0NkNksjP1FibU9TOCtkIz9wMTJyREE+RXBjMjhCNGQkcnMpUmhaWlhUe2FHWVY3cmJCaVJgcm1UYSp2CitJampHOUR6WnZwJm9UaWR9VDYtLTd3T19UKEZOaztrNSZsKnA8IUlTXislSjk4MCNAcX5TWUgkQ2F7ZmkhLX5JbkU/KkZDeyVSWVdDdWo1CishQUBURHpBc2taNVRUZVFiUEFCfFhfJU42JGNlPWpHYHdPUXhjY2Ulb0w0QXNgWG9jejxsWnkoSVJjYG1AdTk/WlhhRjJLKG8lKWZhcXp8CitTN2NLUj1pNkV5STkrXzYqfmJZa3cpdU9ePXY/Vkl6a0YraD4pa0wmQ2toRG8wfERCajl2QG9PTzRTdjxINT9rR2pJRDg7YkomOUVKPCtyCitzV0RwbTF0Zi1eU2EhVVRrZkFqVD98NzxpOyQ9dFpATmtYNSh5RH5JUF8weTdNY2tlV1lha2V3PGFqKytyNDNCPnxzYD85XiktNlNIXjN6CituRDg/LUk4dWleTVM8PkAzaihaamNEYnVeNHJ3OHxSLSMobjQ7LSh2T3hOVGc/YFAqSFMpQUk2T0l6bl4tTn5qSi04PTtZJXp3IWVjYFFUCis+aEB1TzdOWkQmQU0tSVdvaEhrPXxNaipGPzUpUEdZOWFPRSNNX1JnWFUmOCk9JFdONz0tOV4wYVAyK3FeQDxqclUmeGJhU0NvX31qUXJBCis8KUp8ZiQlRzRmQmg9U2t2Pj5BQSptezNfVlEzUzdgMiZUZXZ+clMlTS0/Q3k0a0JtfEhuKVMzQTBfa35sNTByU2QwJlJ5S1pjZHxwWTw2CisjSUxwSE0+O3MlIU1mX3syO1hRdCpVZmh+TllNSXo3PVZ1cWE0MHh1XmxEdzI3WkQqdERpZCt3Ym0keytKMVJSTiU3YXIlOE9Day1PYWMtCitES1pfQyY4MmxeYU12NDhVc09HYmx6ak9HTXlFUjRoISt2UyZ6fGxiWUxyZ0ohUGBXIXg3YnkpSH5NfDhYJl8jdmMjamspUWJfcypAYlFhCitMaEFnQjx+fSt8Ql9DNCgtbG9pJjVta1ZoPnBXNnNmbk9lMzNafGdZNDl7YjRBaHQhJV5iPm0wJnZQVHROKE19eEx8V1VybHx6emRMMktaCitmPmNMVTBQP21LczFZem8jc1BpRjBRN2g3VWNaKX52KVJWciU0dHk9XmhWUHkhdXlWYXhFWEMhRVolOFY+YzQ8OD98RTFRYl9IQTdSel9KCiskM2d8RzB+azlOUX1aOUJqWWJzY09yY1pPVGV2RGluTG56UW9KKTh3T0B7JX02PC0zMmQrP09xbiFac2VmbHp3Y0t1dWcqS0F7PmZDPUp7CitOR2RNZTdhVmFtK0pCdUI5eUxhOUFzNFAjZnZTMS02eXZ4YHFwelpIdnZAYztxTVg/em89XmU0SlIhIXJSUCFBS2tHek41SGZeZ3RTJTBeCitpPkVuX0tQZnxXaksye3w4KzNuWm4zc24yIW0jWWxWV0BwSF5le0hCMlZBTXtfZ19rOX0pQD00JlYlNFMpKXE+LT1LV2A3eERoKmEzQTxACis8Tlk2KHc2RjJMJSpoR0wkSGdQfVNrSUlXSUQyfn4haWRnSy05SSFHcFVzTUxFTlZwWFUlXnMoejsxKmkzfmg4dCtgeGcmNXAlaTZpPll3CisoKzxTPzNocEF8fjZOeTtrSzFpNGBxbzc/UUBSV1N4PikxNEombFJ9QXBzUHZgYiNtZk1yRjhVa1VSNjRCeCNEVFNQPUZ6NChPYX1AZV5tCitZRnQmd3otbjRXQlZKOUxxXmdATldfMjlvKFM1M3lNIU5hRCYlM2tgZjNScCZIb0sjOUlNdkw3a1UpRk41dWhfSkZBNGtUWnFsYDE1KylOCitWWFJ5ez4/ZFhlcGhHQkY3aEpgcEFPRGtAWVYkK1p3TUR4PilKUlI0XlBpaio+ZkJLNm0mMGlsNkxUZXEtfmJJTUtAejByelowK1M/ajZ4CitlKWo1QHQ4Y0YzVmZOYmVta1ArJEZXJUIjZTJ7K248UkEpNGZtNDJGXksoYUNKJEwwVVcpK2hSciphPUBGYSpySUZTdkgqMVRvc3B9NWZlCitAT3IoREVePkptcHdobHszayZQNGx8VHJgI2Z7QXB1T3NaeFhNbmtvcDVJV0VXPjhOaTczdTJ5c0pvTD0pT0Mkbjd5MEBNKko9XiRjQjVrCisrUnJtOEhVKzN6U2ghUUl3QFYwdmI4bCpPKyhOSUJobDQ5IzFyZGRnSV9tYipMNk0zQS1jdUZvQj04fU9IYEY3aD5EWTxOODt0JDFMcE0hCit2PEYpJmhgUnF7ckZFaXc5LUB6RUYkSERTa3IhJFNSWUVJNnwzPz1JaVdxbTx7YlA4eUZ+bm1xZHtfaVRfUVVXQih4czc+cHY+R3BoNkdJCitnbWY0I2hOMU0tam5PVjs0cDhHZWpmXlc1eVN8c1I7NlYtSWsrTjdnVkQ7dXp3IXpLbVgkV0N8Vyk+blMycVppTkRJeWUwSU47cDZAZ0ZxCitLJShRQEJVdjdeQFJaWjtWfEQpZnVFfHBaOz4/V0AxaFJ+dldOUkl1XjBTT1opdzVadyZoKmp1QF9+JD9SQkFfT0Z2LWI5I1Erai1jKjhvCiskVENwLSZjUE9NQDZ7cjJ5UzY+Xnt3filEa3pFNUtpU31EanpZQGFQT0dtSk0raE0hKUhoTFdGRyROJGx7PHpyUVFXTCNSWlAyJipPaFVkCitaaExRSV5LKWgyRit9fitLe01IKVkkaVBNdHtCVW5raDNVUF9CPkhYSyYoQ3tSJFA0K1okQF4zUFQjaWtEcTl5fGZ7S3R+S1UxX3RCeGNJCitrYjNAWUs5OGpSNTlOPDl4eTZBQlNDM25YV2phXzBVeU5keVFeR0A5PTtSUG05Xnt2dCMzbU99ZGdqM3FrOzNvR285NmtBYH5ZMkx+K3okCitmWE1RV29+fDxaUnkhaFRgdnlja3lAMiV5KGlyOG1qSG1AIUtFWnZzekFpKlNeb0Jsfj87NC15MnomQjZiXmAyb09CZU9sPVpBVyFMfj1ZCitWMis1OD47QlYtSk1JI2RgezlBY09DSDxLO3xCKjt+ISFCN2ZzQE11WTNJTFZEfmY7RCpmfnZ6RyUmVlEoWDt0N1E1RnRLTGI+MHFWMWU3CitoUHteang3NV9uZHY4PkZ6TmgmTm1JWHg1cWF2THlYZXlMPCFhREpRS20/KkpYelVyWVhaKDNwPkxxIzZQYjA4ajlFNzBVZU9fZ0BHYVFoCitHJGJyNXo3Wm9saGQwUjIwdEpoKnI8X0h8TlNTYDlVeE57cHomfn1rWEFlI0l4K3FpbF55b0Bzc3pFMHBIeVNAP3tReiFFN2lPbFVwYm11CiszbDdeR1FHMyYxQkQ8Mnw7cCtidyhqSWhtNTAqaitaS0opYVpJYjNIPmVFVWAzcHgodDFrWGMrflBPelJNcWIrMVpPRnxIWFA2JjlPd09KCittXm85Mz5fcV5gN1RiPSFDRGhqRT0xeipFd0BLaHZmV19kRDRQV08mYj5SVVRDR3hENlRSfENlWlchYmpzPFdpeXpeRzUkVCQ/YVJrPTt5CitNaTNsYjk4QF5Tej9hc2QxZ0VRIXFseTBpPXByTUQ8KnZPLVQrQChMO3RZOztLJVg8SzsmUDNXYHVeZkpQYDhXKTJ0Jjd2TC1vNWRXZTdCCitkJjdBTTRDOFE4LTJtNE9gRmtSUT1qbEYyN0x2Jl9lKH4teEw9JTJFPlVwRW1lQmNoYEM2ZWQwPVE5cFR1TyFHUUBOaHhPRXtYPyQ/dnElCitjZFJzVVdDJHBEc1U+Z3BuUyF4VEZzbmJqU3RsX3JOYWo/YTh5Nlo2S1JAPG5qMnNCPlVIfV5LI0VzKUNSd28ydWBIK2N3QV8jPUROOFMqCitCViZyXzk8M2VvIVAkLTdlaU1hWjhAcXIkPyR4TDxXajNVTDBFbFhtX0Q1WG9ORUJqeXwhXjtKe29ma28wQXZZZD1GMk5RV0RJK1I9SXhBCitrKDBiQ34zWSVQRH49OUZNb1ImfE1MVXpubFR9IWlARl9NWX1qVCtlOXVAUH4pKU9eXmlvNCUhNmB4c0lsQWpvP15OOyteKjBSVU88cnM4CitLQ05KbVBgR1QwYz1vJnYwUENpVGo3NldKS3JYYz9XNlZ3U29pZkBJfVdxQFN3N1JwdWYqJkI9WjV7cGxLIyh6ezRKYkRaeVF0IS1rbkh4Cit0XjBUMGpHJVdfcVUzRXNOKVdzQzIhIXR7X3c+KHxoQnNpXzYlTDVLVXZxQ2Y0Yy1vX0FJa1JsNHpvektxaDBjclRINVh3Vll8ZiVseCZkCit1dDBLI3s/fGN9JVdmUl5XRVcwR3JUazRMY19nMHo+ejdjcEF6dVY+PHFQeEN2NnVre2xnRlV5bCY0IUBmTj1vcDFxeH4mK3crbEgxQDFDCitGRT5kTnV4NHlUPl9UUjZAQ3J7R2t2bmZ3YyE5emA5eD9AWSRNYntAdyVvfnU4RGl0WWo9WVBfNCkkd0UyWTdpYHs+SD1tT3xyfFp7aUhwCis9KXR6VyFUeTElQVpXdWtjRiE1eGZGRjtfS2h3KXA5MHpgVjZuTDlaQk44U3ljdi1relM+MTQpX3YyWnYzKnwtcF5OWWVTNzFSJTsje1R7CitPK1AzO1RISEUtdUAxNWZlKll6YF5tVWFeeiVVTjkrV09sJVpMWiMqejFIY2kwRGNpP2RrakViZ2BZYDthdCRDVEx0THo9XnNvajEhfm4pCitxRSY5TEJaOENpOHAmZ2Bwaj8hZEFjP3E3eTk9QGtlXl9nbmlRX2Y4XnpEc3VtQndWUGh2UXZvSEdfZlUqKm9CKEhDVHUyOGtRal5DRncxCiteKjZzMDs5LXxHYUVmdyRqaSZiPE56MGxGaG4kRUx5c31FVWwpd1RRVXBhYUxMJnhpRkRmcmxBcWxxYCFocyE5dHNyJH1ZLXZxRz1KKjVUCitgJHJYTDNONXNLYjZmeTBmfDZWSytjaEt6SXxEeFl5d1YkZ0pjeFl3cFNicURzKVhiNnErQHwtQmczbm8kfkM9RDtgeHwpP3xvNmtZZC1LCitqK1N0TXxhMTlzLVZEOzMmTnp2dG4majQwZ3RRbEE2Rk5ESzVoSU4oe2UlVGl8emlEO182SiVmSzQzKn41SDxwSEpsVWUxPTVKIWQ/QmhCCis4SVBjJWIwSFJFYlUxak9RaiZJNENGR3FjQjBnRVppRGJGNWNxTDNZVkxXOzlpVGZwNy1nSFVJPH1JPl5Ja2RleUBTR2dBMmQjQ0g4TS04CitrQ1RVWEdnZ0h8dH5rOCUhMT55RiZVOHdeeWdIeCZtUFpHPGVLT0FwQyFNaXhoamtQbnZeNER3Rj0jMH5OP31Ud147MmhWc09YLWY5KUNLCitNaChDKiY8eH0+T3F5U1lQb0xBWiZqMHszYSZuYFcmdTtnUWlMOH1hJldmM214MypwUCl5aWl5JiQxNzFFJHhHNTZYTGRvaHNPTkEzOHVlCitoNSlBY2wtcFo2MVVHUkNXa2FoNW5rdmA4UEwhdEc5RmM4UW8xIT5RRGFqdzxKeEJEZU5Ubm5aTk10MXdWJCV7e043N3VtMzBofWdKWm8zCitZe19WSn4ldFdHJHtRdDBmKElJQT9BUntURmNpKnxnPlZFIV9RfDh+XlZCe0hKNjg3S3ZlVS0jNk5lKDJ7Kk9oPUFZOXxHXnRKPkRgYiNlCisoU3RxWitTdT1gNiZgX0Q3I1RmRHRRflBoUCZxKGd6WWtlODtJa3tGMERaTGA8Ql9SJXN7O3ZDJCU/NT8zUVdDRk9WMX5fT1o1clYyYzMhCitjTUMyPj8hNDgxT0NAYzF5a1JnNj9JQSojPzAqT0Z1M29mdlNVfiZEVX5+XkdIWTcmcTlxPjBxTkJvXmdAM25Ydml+bF9tbGU/NWRBTzlBCitLRUJebVdCPnZGPHstaFVGZXZpYzhTbFJyMFIwalR1Xj9wSFJGYTBHZDFPTFEme3spcVJaKDtmOHNON0JHJnNwSkJgNXUqIz5qRmdFYGBqCitNWnpoPWFMcmJlTVYrUE8xY3BoR19CMFB7KjFKVV8ocWR8VkllaWNfaDhLbi15MihvMTVtc0VeKlVKNiQwNig8OFcqNk8qZCk9LXYpVWJ8CiteeyUzdUBvJnQqWVUoRnV2U1gxM218YksoP1heMGpSbGcrc0EtSnRsaDRNdUVPUlFhckV3a3BaRTd0RXwxcmREeFpveklvUVJ8ailwVEthCittLTM3Zm5xcjBYN0NCSEpETS0tdkEqX3FDZShWMXRiNGw2K2pgYFd4UzBncFU4OEsqa2xSJC0/TyNEMFpQK3B9KVFoU31SV2w/cGtlUWoxCitOWiRGbUh2S0VPNExVfjx5bTdgZm5tIVZ3KnloJkZ0MDtubm9VNWNZLWp2WjgjfV80XjF6czFEZUV8QGEkaEtQVFR5XmxNUW9BWiFwdykyCitjX3t4REFBSjFfWG9pSzlQUkt5KGFZRkJEOUlYfGRUe0ZqVmFST1c9eSE1Nj9wO2RFTGJeMFVvKXQ2M01wbGxYczlxdElXejVGdkdSb355CispTEcjTG1jSlg7YihLKmhzZGU7IyMmP09Efk1RIzFeSGV9a21wOER0T2NhQG57bnprKUs8TzsmVlY+ZyN5Tzt6aHIpeiEoISZ1cXFKTU5TCitzT3tvS2U1fVF5WnA8Z0hVbmxTV3xYO2pZOyQ+RXhlMUEhe3c7aiVXT3pfN09+NmExK1R6czhpTDR9ZG96Zzc8IVJaQ1pjPDM1dUk1RE1nCituV3RlMTNEVXBoXn0xUitASD0kPClLV1gkNGZLP0B4bTRuQERUVio7QHFSZE9kaGUySmpuRFlmbHY1cXpYfWVBTGV0RGk9biVsPCRAMG1VCitEP2FxKWZ2OHJDMihuaSFIPzlWdDdsTkt7RUtjT0JlXyEwPjs2NzA4SlduOSVvX1lqTUp5TVByd1FpNzhIWnNxPzx7aFpJcURObzh0Z0thCitYST8hMVU7P0xENmxEKFM0WmlsWV9UKEc/WCprMGBNXkBTZ1dDO3NlYEZCJWcrSl5lZSliT05HSzlIJlc9Q05PeHtrTjlhRklRMyFDPUleCitCJUBtcGIrQF5AdE8tJTdncCtaJkMtSzl6NjtLZCVHZFBUOUNAQGI9YHlARXRQZ0BhLThNP21sWH13bERPYkRCTWY3aUZuNz9rbGROKT9sCituc08rQWAtO0xIUyFySVEqQ2Zeb0RiNnpqeTw2PSk+dEpld1RUX3VeKWV7UWxQfCsmO0E/eD4zNUVNKkVXWFVOPVY1Kjg9dzN3ZUFAZGBuCitPazIzQnFCN0Z3JUVWdlpxclh5a1dCc3UwZzFRVl8kT249VF41JnYjT2hyS2NyfTtrcmJDK2ZOcWM2T2E5fTt3YD4wNTghdXEtYmApVkhgCitAVitnVmA+eG8xcHFlbSE9JDtGWncoc0A1RXB2OWstV31BdzlEQzBNXz96KGd6bmxzMWNgQVJLJC1pO2BxX2g2d089MF5xWiFyNSUpI0ReCitCN147aEdWSmZRSER+ZjVtWWo7THAlWTIhT2poVHVHQS10bDFBNUl0R0kxYGZPJEZKVChAWXtyKHJXWXZjd187SSlGMStXLShwfiUwQzJhCitOWmRUNU42YTBvNHJLfShUNkVodH5xeSMpZHY1filqajx0V2d7NlZfPHRqeC00O2NoUUNiZEY/UXFMOVliMGJjKmlKTStpQ35TJkMkPUd2CithKTdxNkBQPCM4X15YPkpge3hKaFU3RzQja3lWbFFVZioja0g7QnZuKlcle2RPblZObWNYJWROZWB1TiF7KklJTnozJXV3WTwwSGFPeShICitxSnxqaFlxVzNMYSRRVzlaamB5akBkTTZsXmZ5dFYmNiprOVBkNGg1fillIWgobWNpREJQPEJ1OU5tU0Z8WlFkSz1oPEhAUTlIKSVIWCo2Cis1QjYpZGNhYT5ka0N6djkwT31kTDs5aGtkSVU2WnU+UilBTl9tNFU3IXtffCV6czg3PGolSk1XOFohRH1ZSDMofnkwQGpHVzh+cXZMVCZYCitkZ3hXVyUtcXZkZ3hIJVVvZHRoS2wlMm5ja19BM2E0UX1iJE5GTGIoeSY+JiheI0omR3B3YGNLMS1XemRzNT9ESHVYM0JQK28mI2dCVilyCit9ZVp9azBhKWNvVWhnQ3lrISl6MVZVTm1ZdiNlWnozckBmcDVAZHclcF83QDdgdSFHMHVMcCFGRGd6QHgxNTsrJlY4KUxrRk9pTW8mVG5RCitFUSYpaFopMnkmbGZfZn1GdjBGZn0jc0A8KmU9bz1tdz1wa2Fgbl5LPVU2SUJHOHk0RFNBKkhMNCh3Y31UKCR3c2Mxbm5kVXdvKXNyN1dNCitiPGd4KFI1O25NNHBma21VYDlBVVFnZFNwZX4hVTdyMEtGam1hcnNUcT5aTEl0PlhDdjB6cXBAKHJVLXI5SXF8R3hhYSoqUy1NJko/Xkp4CitUV2t5SEE0QU1QVD1GeEJgRmk/eTVKVGY2TitBP05CNzIpVU4jWn0lREVjczYzO2k3dXduZHdNTzleNGBqWEVtYU1QaGRtelViWX15JUQrCitPPU1DeGZ6T0V6aFIzO1ZkMSVHPlg3NVB0cz88OCVQeDcpWkd5a3BkTWQ/UXZMZHl1PGpec2c4aTxuUVUqOWlzZGwwWE96Vno5c2p6JWVMCiskSDc5QDFYNG17ZXNuNn19eitpVzFXJVBIWUlRdy1sYFkkJmBGeWxwfkl5IVJxKW1uM2lkSVFhS3NkcHwtPEIyZEVGVCVGMi1lJngjY0tNCitPSHU/YEVQS2ZvT2RmdW0yNyk+R0VNUntWbH0ya053WD4lPWFfLUh4U2R5d3gtU0Q7TnhjSkJjaztANUJaOCNqKHY4V1JIQGFnWVlOXy11CitEeHh3I140RkhsS1dVO21ULUthM3ZnR1UkP2deKml7KTtlaVRJSEZ0JWlvTXNpJHo2SiF5VCYyKUBzK0NMekIzYHsqNmlqJWUlQmhaRVprCitnVFYoMVBIKEY9bUxvYVRqd09pSzUwclNwVDhwWVphJXVFITllcnJXbXoqRFVeVk0xPnFCNFhiYUJ1NFBGc3JMJnMoPkxfdnFVR15edD5ACis+I3ZDcCZmXkZnUkVXPypATUJIMEkqU0srJV5kdnk4dXR0RFM1dnlnSXE/P3xwXz5eZT9WeDErNWh0cU1UNFhCP2c8MHsxPnpkaDJFSzMkCisxNCRVdndFPnY3MUxIaDtPa0I4NUUqTXpFaykjfHVfUih1UHFlTE10YSRBSklVK2gpWGhSbiVFK2NfendgbiZJYiN9U0FWTEEyVmtoeTZxCitrKFE5QnBBeXE1bXQwYEN7P08kbU9sZUptUklQR344RH53YzE+KjhqQzAoYil6NDtAZkN4aGEwdj1LSVJpWn01MDI+Z3hgUUpJRHhAVD9xCitqcStrKU12c15DZnVYaTA0dWJ5MXFgQyl0Yz9LRzdrT3FvKFlyUX1xRkQjUHhJOzRuaDdlSH04RWw5SWo5OGUqKlpMQThCazZSIWImQXU8CitrUWh7UWJOeip2dTlJRVRWd0FsXnlkQzRLMmRMQHU1YV91eyRCeG9WXkczem1SQ0pKSTxSWWw2Y3N9Wik3SVdnRTNWTUxrOFclJHpxPV83CitoPEB+JXBkdSN4bjx2X1B7anUjQFloaG1LPiRWUn1aSUF6eXtoTzlYWCpuO3JkRH1DXzlGPk5KflEhYXJoQj1hKipqOzRvRXo+TFBEY1k0CitfOSFEfmBYTnZVR3ZFTjlxZkxgeXVmY2NlKD81UGJSbE5PJTdvIzlaM0FkSk5TYzxJQXRre341U15JYD0halBsYHMjOWFBNkAjWlZtQ1EyCituUGV1R3FkbEx2UXp6NTdsc2wrS1daQF42Kz1EJWJvI3o3bFpGWTx2JUFjNSV1T2U9dVMqeFhxVVUmU1Y5MnJaS2ZPUCopNW9vVTFEfERVCis/cH1PTCo2dUp5QVNkIUA8UDcqUHRqeT1nKzxCIzVXJnRxQWFkX28tUjhOMjMlKGMyWjE7ZSVVSDVLN3oxXkVTZWl5dlFaO3ZOPmhuQH1GCis1UFYwYUopOE9OY3QhVz5vWm17Rm4wcTI8YDY2dkQybHZTX1RkQ3JQemQxVztKRip4KnNeOSY3Sl4kKn4lKE1GNmtpYGhBWXd6RSN7b2hjCis8WDRWaGxWdGhyRms3SGtFMHNKfHR7Q3BPYENzZ0A1aSRDPUYrLSpLKlIheEF7XiNCP1g4cXBxaiFWWjNpKil2d1A+eno4JSNGTil2czBeCitocGYlTzN4K2xjSz1ld0FQSFFwJlN5VSRaQzEwMkdPaVBPezNEYUJ7Yn0hdE10TkVGM2grak08aXlYUk1yKk9NYylVbks3eX5TMDEzM2NfCiskeTl6V0E/YWpKRjtEPTZQKDI7VDJDRitNPF4tbU9gI0ZMLThWP01KMCVkUzl4VnVNdGZLYlYmKXM5SiQkO0YhVE45bDMjISN5MytTano8Cit8flQ9OS1xdiRDIXdvJT9MZXxBUTFfJncpNG5HNWtDcFROaVgyfHxyPl55a01gJjh3ajM2WjBVV0B9ciY2clIwSDVvPEM2N2p7bUVAYyVWCitMWiV0dnBnMl98VURTYkVgWi1yITslcjFwYlhaNVZJVGBGNz5ReXUlMFRNYk5eYklBRU9Tdn03eDxGendvQ0tgOFZXOG5OI1ctQkBrUjZKCitsJTVrJXlnfiFhaT5hJm5fLUp3MXR7dlpLWUBKenRaRDtBTHJQWlpnSz9qTjl4Sz1EV21ORlpoKjYlJlBZSEdKQipTa1Z3PHhlOEdvdDstCitndSVIUj5TZlk7SEpZQyRQNEZDKDZla2F2ckZLUGJ1Qyk5IU0kal5vaEo4bHhubnM1ckdvOS1hbWlObF5PbSNFSyFTbnpSNlhmR31kMSprCitlQSsqUF9eZDBUYXE3Z3ZAdkJpbigrfSs/MW9uVitMKz97TmdubkJkdWIyI0lzcCRsTFY3fWZQLXRud0gzNEA9aFZPNkBrM3hwQHZeIWVBCis5JG1hX1pkcnJqZGktNStLaSorNkFGdUdCTm5oOzhXQT50Pj5GXk5NNXJ2KGxzVV9UNTRJdiVwU3BvT2ZXKyhkMW9haV4+Z3Y+Mi18T0ZnCitVc2pgXytpJikrJCRlNExqQHZkezsyfl5Ma209OSlwVitmfUJrJXJ3Iyp0P31KOE4/NTZAclg9ZmY0dj1lR1RqfllMQVFETDhiM19HWGs3CitzNz1NK0tCK0B0NzhHWTB8cj9SUDFfZV9gN1I2fDghZ3FXKnclYClnMV9MZGMySDJjMD5gbClgPFNvemQ4ez8rM1lqfS1SZmJjT1hNbTc2CitYfFQ4KyRJLUE2QXlLflBgXjhUI1hxQ1JnbVQ5SWoyV2RlN2RCU3E4aGMzQztyNCo8SGYxNXo8YGUyb0FvfXUmPj43a1Q2Ozw8aSMwT0UyCitwfU5gb3tTY0VPfjlRayVqMDNpPTNhR0g2Mnt1MEpQSWFBc09AVzNoaUV4YUgwZ0VeSTBTOzcxeVc2dWZsK2NYa211SUluQ3RtaXFgfXokCitWeXlTaXJaVCFQWU1BakZJUEBYOz56JEw3bCNhWElDOU1DZmdPYj4kN1MxTT1wMFdWSG9AYEA7bSgmK2I1I1VTX3Mmaz5LOFpPezRQZH0zCitzUUAzclZvKmViek9aTSlWJj5SVmBmP35BUGtUaVZuMUp9PV5UfDtLbVI0N2BjZHlHSjZ5P3hVYmZieUQwS3pMX3A9TTspSCstPUpNOEZkCitSMTduQ2FARGFYRm1RdWNEQmd4YCpYWWwpVUw+UCg4eThRNElRK2FOViEyUmkjRF9jT1IxZzxVSD1Ka09rdHJMMT5xTyRIXjx4K3NwLWZQCitgdUkyLWd1Um1XfDBlLVRyQmMmK2FDJEBlS2hJe0VOUkIlbDxUVGlAYUJucUtEI0RjZDB5ZG9IbyhTSUh0PS1PekNzWElJYlREcUIhY21vCithbjBuVWNYajE3PEhwcVRVYHcmPUFZI0RrIVFHdGd+X0szTGJtbklHZVNUMDctK3BhNCR4YEFPfnt0Yk0lXnZuR0ojWWZyeD1xJXBuNilKCit8JU95OH47V0Y8WSQ0Nno7WFhOODJaXll7fTIlRT1ZTDFIRiRoS3dqRHw+eGZWY2w0Izd+MnctOFN1UTdLIThnPUhlRCs/MmFoKFBGKih3Cis0eEBXb2ImR2hteiR4Qm5jPVlxcUJ4Kk0kLXkpWWNnV2p7U2RrcG48VmM4aGBFKiUle3ZpQ2w9MlJPVT9UQ25lcj9pRUc5c2BUQUVeV01ICitOZG5WYzY+MnszbSg8OSF6b3A9aXZNe204ay1UTTtTTG9TbHUjcVNnOUVqYnRPdzBjKUtfVj91U2h2XkpPP2NvIT04PnMmLUN9SXpMUDtfCitee1defFJYZTAxUjxFeyV5eEBBNGlMdHZSJTxwVzA7cDtFNGtLSFdjfSlIb3RgOyhSVHNTOSpGPi1MbElmSF4yWWtecjwqbU5uWUZ4X159CitYRkFIfWAlelhiK1YzZSE5PWNHe0pkcVEzQnVaUTVxa09faXV5cXtgPFJxbEg+bm1uMF8te0AxcSZ6ZFF7KkxIQiNyT2whMDVxZnlJZ2pxCispcE1neUN2S0xxeF5nXldSXnt4SFp9ZXE9SDY/fFFFYzVCeXlxJEVvPDNXNnYmWi1eQEYxS0pSPVVGKkF0WWYwOypJKF9gbyleMSRmKE45CitpcmlJb1BYRkNLTXZsa2Ald21EaWBzVX42YlUzWkZZTDBVKFF6akRtakVFNFQlY1BhMClNM0E7VVhgRCZwfE4odElwdFRwNEd4YjY5Y0d0CiskSShgSiN3aHw5ZDxJLUd2ejdsaE5idTdrYXA8ekc8QD4wfndiWiNhUW5HQyM8Sm9iciopYlp4WSE3Qz5IJSZSSilqVCtOaFVxfDlUdykqCitTWjAzUE9fKVdPYGlmMz8paU9RX3xaazB2TElAc3M0eG08fHNqY2xjN3tual5qcUBTU2NvLSo3ciNtZiFBdXZ2YWY2YVV5QD04Wkh0RlRkCitpZTI/d1JjWV57ZzgwZiZxJGVOeDI5YUxXLTQjJmNSTXV5PUpONV47S1JOaV5MPDZ0YHclZ0R4I0ElUUBsU3skaWVxQm1fcHt1RDt5e2RECislekNvV0xBaUd6R0BgVlQ7MzA0N3tiJX1hNmdmIUF0eHshOSM1KjMlKHxJN3xBZUx9QDVnUCRjJntJTV84RzRPSXZNdT1eMUZKPyRKLUI7Cis4U2g1cHgyKjVTaUdNPkJfPCFxRmV5Mk02KWZLKjkyci0oYWk3JmdHeDBObmBtdF8oTmh8ezZXeDArMFgwYDQ4TnRzXjhAYWdZTFpCaHoyCismZFRnSEI8X0ImKi11NHJGdno+M0paciZXcWZ+OWJDMHlwMDsjejBqRjkpcGVYTUA9VTZafXdNWm5TZyhqMGRydEpHSE43bl5OOUROTWljCitLa1FWaTU7Q2h2ZUhpVTN5QHRjaDwkT0Nrb1ZCIWgjP1dOIXZmQVclWXNMZTAobC1FTmJ+fDEjNyNmbnR6e3traXN1eXlTNlRiflVSJUBvCitCV1kzN01gb1lyanxZdz9UNGtzZElGRVpobUhhIW0yNjNtZ2dDM0w3QiRTLUVNfW9rUmstPzdQMWcyemI3VCV7cypNdy1gNmxLbn5QUns3CitLMTRNeVZlNyZRczRZSkNBZXIzKj1CMD9Pc0BtYj8pWE5lUyNBcmRfNXdBSSlAdEo0MVZQP1MlQWVieXU7Sm1LbnZ4dylseGtEcEtEK25NCitLfWc+N1lrKHhMS2I1UEwmXlA5ZSZKQDBwMTF7VVE2V29wcG1oYGBuMFJ+TTkrR3FMWSh1JHdZPDZ9aVd3Jig4eHBnPF8pc3trblVSUmswCitTSyNBU1ItZiozb3BXPEhEM04pVCZuK1FwY3J8O3QpTVJ6UFpqMDQpTWtSUVBQVURVNnFRO3NEaXRSTX15SWk1YHYyWUlFNFo1Q2dUPFdrCitEI1VZci1Wc1RpZDZUPSYpN0c/fTQhJH1rfT5Jd1RCNTl1X25TIWJjdn5NWlozPCNAQzRSZEN4SFdKXmRQelA4VV4/ZjhuckRRPCtnXnMoCisqZ0VrMzMlakFMOTlFPGdDeyphMnVKWjl5RHU7bSVnZD9DYk1BR25JVkRQWn0tJTt5KCZASSZSRmNpQSVjZ25xb29sXmRLMD8lZCl5UEV7CitZOSp2KmlKTklnMi1GKzA7M15zbGNqJjd7ZyN4RmlFXiNzMn1nISFyIy1CKUM2WWN2I00hT19hcF9eZURgfUticT9seSE3KipGVSZJcnxmCitITStsIyRVRXY4ZnAmSXxhWXdwODIwI3hWWSZKaHpsXj58VTlXNUpoZ1dvWTFjOER4R25WaEdzT0JRbFEqPjM/Kj0mSzBtbWpPXmN6Vil0CitRYX5eaVI/YnNUVD5hMGV8N2N7N3FNNmgkKCZtRjVGNGZTKztYJHBMNEpQSitZN1AmeXw4Xm9xX1FPcm11ODB3KUhWa2RaQVEoTj5Bd0o7CishITEqVUtiNE9xVTU0dHs/ME9qUVFyblNYQDA5cUhxVS1vciRISyg4KDtTNmJnWFdmeF9mX0dGM2Zial9+fXZ9Y2NNbGlhTGh3Y3pYR1VSCisyfEhGO2gzeVJZJFpBJSZORj9PRjFZcXUyaSZpJCEkLUAmM1ZNRHs8LUh2PTVkMDhvMypDNHQwPCRrSUxZbiN0UHdCbCZRRVd1Pzl3NTI7CitjVjc3VVdkPFpkMzErQ1RueSktKkh8ZFM5MnBwazF8aiZWPm95bVVlPFhXYT9BIS1DNzF3Zzt4Vz5OXno3VVlSPyQqaG5yZm1NeHhPIStZCis1YWV+ZDVLTiVyLWZSQTZNeiF2NCpMd0t2emtkNXJeJSghSnxNUnpGb1lxfnduWXsxelojRTc9NWJRU3MkNjF6UGspUEdDeylhPC1aeXRYCisrJW54KVJVeTZra0FVSH1oQW5rX1dLJnlGIT9rTmptcjY4fXgwKkJ5M0FyZ0BQI2F9MWxhc2FycXg3ckJ5Uj1xMFRDdjZyRFhXb2d1Y1pjCitCUzVNVUhZPjF8X1lJSXYlejt2O3t1anpEVTwwMkEyWUpoMDZhWCFPSjBKJkVNSWh5JGU4LW1IWWNYK1ZNZnFrKnZuSFdDNWNnbiUmdzk2Ciskbl5MRjY0bjE8dUZAMHlla2hGS2EjSTRrWTNUX201Sl51VD53THBEYyp0Wn0xaVJsIWdNYlFRcipRVylhYlF4PU5BQnw4NmJwY083RVFBCis/OWs1d3BXcy1YZkZHUHlMX0B2bkNnZWN5S2k9OV5BdD1fKGY2dEFmeUAtPml2dWJuV2N2cEwte3Z7MmZTYkIwS3tleUhRVHUpNHd7NyQzCityI18yZ3RObzxFV3dwP0VTNiQ/bDNxRSFacDRmbyQkO31UQyZESGlVZ3phJnc+N001T3J9N0FvekhKJF9QM3lWMjZlfVJjMEc5NzwmYHRaCitVJCRPd2FHTSY5Mmk4NmxYJCQpKyElR2hJYU08Z0NXP2JQOHFQOWBrbUJjZFV9ODdJcXhZJXN5WCNDenRpPWhqcjc2MWZufjM2ZkZIPzU9Cis3Jk9Kc21nU3Y7d0NKMG50eU9xdzNQbGJpamFyUygtSTN3YzBnXkhsNGNNX3k5OS17YU9wdFZzKUVVY15ucyNVZ043bkArUE9uY0o1ITtlCittTkM5NDRyNkJvcjkwcklZSzshO1k5Tj4kfGdhQDdQRGBXP0NoTkluKkQ+YHtQVmZRUkJDOD97PTtpO08hJkRMUmh1JW1vO05EWVRsaCVXCithODdzPUl0OVR6XyhqaXNQYElFZkc3dkZ2dE5uV2Q1RGYmZ3EtQmo9SX1iKGp6cHJEJERUWnMqa2gkYVRgYUZQaSY+MitWJSg4QC1hV34rCitSVjxpMGIlTi1+b2slZ1I5WHR2Y01AV2R0aSZqWSFVQSZebTIleyZSbjYmLURCTmVxc2F+VjY2PjI0Z2lUUmBzQFozK1lrVl89Pm00PTJfCisoOVlRclFQODl+bWxxcXBAYmtfQkZLUEk2XkA/R0xyci10OXxxVmIhe0s3YGxZVX5BU1hENSFOa3EzdzteP1I1fCQ9ZktTRHApSmY3KXp8CitgSWxRayE7b21DcH11fnhCOHE4KU9vVShfPmBgfUpWQXh7WFJ1KlAtcVdnRn5aZ1ZmQTFvJU0jbFkjPExsQVJzJjdycT52eFhMQWx4ZHZyCitxMSZoZlZ+KzdENkZUSko+dl9KY1FKNFY0eE5pJEhwdVlYU3IhPkt9WTVxbThwYCVrP1M2NWlvRzlPWmUyMGVvaEdsI3tYQik/aj9YYTZYCislUUE4T0l8Qm1xR1Q2RXo9IV9TITYqRnFJXmA3SjtIVDgkJnZHZF5NSGRzNk8yQiE7YGJ+fG9yPl4rcSQkLUxAS21Td04+K2NZUjF2U1JHCishWShkPjlGT2N3bFdjVHA9NUBGfjI5YitDV1VvMDEpTXVPQXRPKWdrJnIzUG5SeFIhPVNNcWZ9Yl5CNVk0dChPeXUkbld9VlNHT048ck4jCis4V1V5dzRWKlhgZVd0NEFEN3Q/I1AxOVdAaEpFQlo5YEBDRGlOMChgQjg5Y1AhOH1pZGpJQjg7SHI4fmhhaCQqPm9OeiNRb1MkanFDYWQjCitJTGYxPU1PV1VJezA2cil9RHZiPUdGTDkpc0wlMWdrQmghaWM9MXIxOzYjMz1SJDQ2QjdeYks2aHdOcVNKdW9rUHc5eyh2WnlsPj4yemRoCitLfnh1S3N9QDF2M2d5PGw1KlIjdFlHYDU9Z2cpZVAkT2NEI0lpeGg1N2pAeVFRWU4tWHBQdEZ2fS1lZz5DWUQrNmc3MGsmT1FvNXh2eHhCCitlIzMwQzc9Mm9hZE02bC1HXjAkXjRrakMpWSlNI3pfbVZnanxSSG9DVF5YMFJfZTwmTHBXa1MrO2hgMVVnTmBGKDEjd2hncCY5WmRpTT8rCitEM0szSUFQLV5eOUUlfW9vX2htKkxmeFdAMys0JnB0RSNLO29HYWIqOGV3PnsoI3pTVFlHVGgwWW1sJXZBX315bG9YfjQjWCVtdn4/WjxMCit3UG9lXm0oJE8oY1BrTE1xdmd5Z0U9USl3TE0+a3glYVBmKTtaK0NEZ0tsUkFWODtuXzAoKFcrYlJ0Vl9AdEtSViNLQT9MaFduRithbDtCCis7aCVCdzMxTnh+d0t1RGZUSDtkOE9RUFc4PkA7QGpaSWBvWEM8bjMlOXM7aSRlbG0qWThzdmNXTHlaQl5rOExMKk1mbXxSMzBxWFl6ejt6CitgYzd4QkcmaWFIYmhkUmJhaTYxYmJ0REsjczVUdGs3dCZ0PVo3I0dMY0BDP29yeDFAUzl1N0JxYk0mbXFATm94PXRpVEdmUVY+M2hEQkMqCitnZVk7bFVvOX07TitDO15aTSFzPGxufD1wT1Q8VC1zT0dWKT8rO1c3UX03ZHJGR29KZk1NWW1KTipCMyZeMENDZWdiUiVQbUs0OCojN2ZhCitLaj9rMTFjNmZvYERLfGRoK2Q/aSNFOHM2TTMqRTAkbDdvWmBvV0p0Zmh3amYwZ3ghJkBZQn5fRjdieF9hTGBsJipjQ0VCd01MPFV5cDVxCitpSDVUPyg3ekleUEIjMmchRylQM1Y9e3JiRntRfG15QH4hKyQoZmskPDJQJnZJPSNwWElfPjlnJGAlMyYpOHNESDgmezsqXlFyO3YwZDEoCis0M1k1TkhGUVhvMExMQ2Z2Kj9IMz88aWkwbEt6a3FIXjRkfE1xLXZiK3hqWU10eXIlc25RZTdwVjNOKFQ5PlJENF4wMGVsT09TVEpwUHJiCis/NiswZmVCelJVWGJFM0Y9O19sUDRXTyNOLT5DUSNPWmQ0O3w0bnt9Wj4qQThNeWspK1gyQmJxYmV6MkJeJkJeRVBsV1pGczBrdHs8QHI9CitxPCoqYXV+PlhuVF8pO2M9NnUwbjRiVCF0QC1vUktXN2c4Y2M9YjJiTGhWX18wMiMxVH0xQD9pUllPQTs1bjg2Jm9NQUBpdkFjUSR4RU53Cit0PUJvKyR6QnNPLXBZd0YoTEp9bjxTLU9vdVU4d19GZDEySUk5PH5Rbz5ZIT5NJFY0el8rXmRrc00/JSFRTFRmTVZ8I35aWSNmVi15Xms4CitEPzR3JDVBaCU1QntmPntPcVBjc2A5djIjeEtPWVlMSVZaN1E+cHFHalF1ZmI3bCRufHk/Ui1zX0hFb3JIM0BMWFRvS3NxOHFMZygkZHNiCitqYHVncGA5JTJqe2lUfngwS3l2TlJwQk8rMlYlNkMxWihYTkNBazNefFh2fndRVzlvPTVHVWw3TSsoKjhNO1dJNy14blJEe3huWiNfU0syCitWbTQmSEwyKGt8XjBeZX5yZGBBMi00U19CYU44cjM2amVyb1VWdXdXWVkqR1pjJCo0UFVuPFhuTU1RVU17TGduSE1MenBWWDgwMnpmKT4qCiszNk02NHwmVSMlT0F7S0NqQWNiWjc8RjFKMFk7YD17cnxiYUF2TGlnOUZPczZoKiVOJkg/cDI7bnIrKWQ9SkdnKj0xTDBkeF58bmF7NiowCitnVkghM1JLMStMTEhZcXVUNyFaOzBuK0FlTyRTJXVsd0lJfWV6V2MxJUc/ZjZaJEhZRFpRSFkzekhKWFRBajQlMmp7eDtDQ0B1THJyI0x7Cis0P0RELV9uS04oeXN+VlNhVkU+N1c5bGlsN1dUJCFpZHdhMXJuXkpQSiN6N31YOTY5eUlZMX1xfDspRE4oNTRrZDQxJUReeSQzV1chdyhTCis9JVY4eThwKmRLITlwYWZoSTIlPj9KdysrYyM1UktxT2h0b019LWNIPUVCc29BKXRwUiN5K2QhfUhYOUImYXFKUlV5bHNHT2UjZm5xUlomCitOcUgzRzA4bEhSI0tHUXtOQmllWnQyeE48U19EWml4ZmBwVFBiSlRtVEk0c3AmUj9kcHZfMytkVUBwY1FhR0ktSFE0aXU+Qj95X2RYN0tBCitNb0FCQD1yZSU9Kk92PmVAd085NHA5Qnl1YXRnTW58dUhMb2hsdTQxfHgxR2U+YFAjOChDYnpFb35uWTRoQX5DQTk0dzxqRFRDJTdYSyRGCitGa0Npb2BfK18jakZPKUBXIU8mU0NoKU1iWnkpM057cXp+fGFPWjdpVkFjTUM4JStzNno4QkU7I2RzNkxyT0ozV3R7SFo2JHVAbmxPfWRACisqVistfHdCOGNkIVlJIzBTRUZ1WF9kYnEkWkRDYSFKKytlXjVUc09EeDZFY15sMmx1TkohMTFeNmImMDwlXzBVJnF7WGJkaXB8OTVaZjNuCittPUE4V2xMQFp1PHdWZnBKZ3JFc2pnWE5iTmVQMClLUSYwPF9tKCFQVVE1cExzc3NMZ0BMTnlAZEJZVVhyITE8cGZWYlpSKjV2RXFtPjdjCit1VHBBdj9yPUlBT0BMNEIwQU44ZHlffTVsV2MjUiRAfGt5bD0wWktlRW1KP2g1Vj5PUDJMPWlffTlTKyshS0gjVXB8b3RtaHprZXRSUztaCisrfSkpOHMpdGJWKXFub1heZyhfdV8hdG1OJjlrfW1HbWB3bHlJdGhYSzchM29uazFROHgydXc/T3x+Qjw1X3k1ekQwLV85TFoyTnJRVyM8Cis7Qnp0WDljaW9lOXcoMSYjKDFJZHlzRDxCUUJIWHxzVDhzO3Nnc0h5ZC1uV1B1UU4qPlJyWE9fdz45dz1wR3tuanNqN18qWFZyUzdMWCh1CitLY09TWURSX2RsM3RULSpOcyYxKUwke2Jma1d9V1BLU358TTg2e2goUT5KJEYhb2lGPlomWTl4JnpZclcwOEdMTm9WQ1YzIS0tPl96PUdKCitNSV9mPWt4IXwpbyR7Rj90KFV3X05uezQpMGNgYn5fLXluRSpUQzluRzVseHZ+X0RFc3JNS05tUnN6amV7eUQ8cG99XiNnWHNHNCN1WEFpCispQUM4UnNDSFNQPF9AMm9mfjVXZWtBSjd5LWE8IVRfOExNMl4zdkpJO1Z+MnBGY29LKXckJjk/K2xAOD9ZMz04dzY8YjgtPn0xViolWjlACit4RCZ7SX1aUEloM0dyM25ZPz14TmNQX2Vge3FmKkxGLStEZmRGVExmJj9HK3JjUCFWa2tFfFphbzYtKytwKnp2cHJiO0FoLXBsTnYoV2UoCis/Rj92JWAwTCgtNihqYHYtQEMmX0V9WntGdmg8RFMqIWxeNEA9emVrbmtrKD1Sa0MpRGArSzIteTVXYU9RJTtqNlRsVylJd2R1OEw8TEoxCitpY25lWl48SnNsIVB+ITZLdyN4TEdzIWZgN3RoT0Nmd3lpPWo3VG5VQlNDZXFCbmE5ZzRmMyNFXkJHMj4yd0BNMm1CIyUlUSU3WCEtayQpCitUe3soUjh5JDklKn5RSUlJS1JfKm0yUG1BPSEjPHliMDNIZUQtSz13XylvUjZRPzc5I3Q7Mm40UEk3U0hyV2w7QGYjZVhNT19XeEU5PnhNCishLWg9Ryo+cmhfOyYyaistVWVSX0dCKXg4c2k2QkQ8fkQ3KVhsdD1kZ05oZ04mejN4aFVSOGMhJWMoUTw5fGRUZS0lVnZAJmBNPU1sdDx8CisyVzFwcDxmKkkxM0xkdDsyaCF7VkxXVWBnV0s3VCZHNVdIeFpJbDBqfmp7aDZHaldwJkJPaHBTS2FoLV5rZUpEajZ9blRNYD1mVHttU19iCispY09MKzw4YHwpUFdzYWk3MFNBQEd3MGZzZjI/UjY/cHtVREA2KHJURENVazJgUEZyel4wZVcyTnFWTzZROWVVIUMtMHA3cSg1cX01RD1yCityKDNvKll5JXFOcD95UGlIdmdURmRqMDA2NEItZmB+MWltNypLQThQZ2NUcHUmQXVRfThSdHBQS0gweW1Gd0oqYDhXK3ZsdGQ4ZnB+JSF5Cithel4pTz05RCl+QWloZ0BBZjwwMzladHZXSj1jUE1uaDxAUjtRKXAjayNMJEtIKzh4ZTw5VyplZHlnaiMhUWEwZ0V+ejkkYWVLO2YlMm5DCis1dXUhKzVpRU9GVDZMZ3luZFVQQUBvXlJodGpPMHcza0Y9Q0BicTgjPWNkNCo2OSRQO3glQmZvLTA8TiEhPS0oU30pJkFMUm9gKDB4Jj1ACitAS0Q+dnA+M0VnNiF4Y0w5MGNFP04jdyhjWTV0RXJBWipTXjtqUkMkJSgkXm56PztQbEtKV0x5VjFeXm9vOT4oUEckLVAoKFBIPEtHdXNeCitRZi12TD0xfCNUbnl2bT81fChmK1V5MEgzPUpERE9QRFhwQCMpfU5gJG1wNEhHYXsqWj58bHVUYl9rOEkzYTJKTF9rMz1TI0dZJTFUKGtTCitTa2ZMcmFtR0pnRj96fik2TzVkT0hROW96PE5JYWcwXzZFRGU1dDVaPTNIR0pkMyRaSiopVnx3bl5uaFBfPFlBR2h7VzV3al5JfmFsYGhrCitxNyl6QkghMGFhZnU7Xm8rcmcldWFOcDQ4ajM9fldwT3Y1YHJiRD1wfFQ4KjNiPzlRWkQhRCN5c0tSdl9sJFBCSG0jeE1FS3VwITI8ZDhZCitwVWUjfnsmfjdHTDBXPD9eODc+Y1BfZFEoSTFNeSNBOUNvRENPbktlTChxUTBCNShOUlFKKCZpWEc8RnludVFuU1FkWHxBUyNaRSMrU2hACit0MnVHen0zJXlIbit8RzZmRWVpMV9XUmoydDkyRTJoQmxhSEs2fXwzanhzVm11NTM5LXR1QkpwaXxqUUNAMnczLShlbUtCPVRZJDFnXkg5CitiUFU/S0xBTippRjBLSiNxK2l0IzdRaytBdiZ2Q1dDV0Y0NDJSRmxyemNtZmUxaz8mOWBNKmdERnYxYD9DPE94WXZNNEJiKy0mU05SbHQwCitmZ0k7djwmR0pHZlYxQSZHYVR8KkdPUzcyK3Z3NX11RHBPZWVXSFM5PW0wYWtQeW5pIzlgI19UUzBWM09tWn1II3BmRWdsfXtmXkJ8X3BSCis2UlZjWjFTaFhQfis/QkRkYnstVCFWdm96K2RFbytNRDMqXyppNTBQMiFUV3lTdytNWjhfJkRZY1lZUFFmbm5lSkQhZz89Xk5lYDIpZXFTCitKe3hYWnolJSRPVyVIeHxQZ1RSS3xwJTxMOSkwbHE/KjZ2SnAzLU5uTj1TVm54fmttSmcxVCVNISQ7SS07ODk7IzZtfl4yfEV4SDllVms/CitMT2NTKWhVTGJXSTBKbm5tO1FedUZCOV48anlKNyhpdD45OWJyfDRiVVpTT0p2QHo+bDQpeiErfVRDQSl0SmxrcWNjWW5hajJnQXBtWXJiCispc3NHTUxuPjh3K3lBRig2fGwwJUJqe01uPVVeVEIxbTY2RmVKayVPZTFaM1FRfVlPfSVDN15WcDR3fEc1O3hofjlycndAdkQjfUg/NEl2Cis7M3szQTxzRTt1QlJQR1ohR3RuRHEjfTBOWnFyey1oQ3F3ZihZZEswIUY3VjswP2E9LU9gLWdmaEV4UFFQVD93RE0/Yzt+PWFCPEpZKWhICis5OUNYVU9BcWFSMHd4VHYyLT5zQGc5d0dIfF5XaVpFd0VmM2N3cW0xeW1LamZffEQjeFl+I1BCK09HaCkhc1J0eS1pZ0I5UzF0U3s+MXBeCis5QVAkMklSPGRUTXEmak5EJmNRSyl3fSN9cCE2JE9YdWhgdSUwY0sxa31zNit8bXMkSjNEdjR6fElwRlJZQkQtTCFXV0B1M3Z5OFckQ313CitARDR2VGw9K31oTXYjYjBnQ2QocDtfeTN6N3Y3MjFyKCllVCtkVVQ1Vm9OK1N+dmUjIUA+VHNKNHk9V0NQWD0xK20hQXJkYC16Z3I3I2d7Cit0Qk10Uy0/dlpScVQ4NDhNdn1ESi1DeUMmVWh7REc5MXA3X0pjNSZsQm42RDJXTFc1dSo2TmVVdGFLcWhKMThGUj5NNkEtKnNgfm0yUFFQCitsdEV8PXU3ZXZmJDs9YmI2UDcoYUlwc2p2fiU5ZTBUeVZ0Mmc+VC1RV09Lfnx2ciNjX2J0YFE7WXMqb3FAPHVsOEU/ZE4mZDRZbzsmR0BXCitWdzw7YlowLSE2NXh8Q2NLWHcpcyhnYEo0TjgqQG9XKWAoT1d1O2ZlMSRQQiV9ZHcrI1pFQlVBVGpTYihoJklQN34lX1chX0d6bXRhaiN7Cis+VjhBZEVgaTE+X21YTH5LVFp7QlhIMlB8fSVFej1EOEFKUGRTc1haZ1IwdVUkYTAwS0lvaTNUKXRKV0kmQjN7d2A1eEt2e2JGcmFEMzJ5Cit3ZlFUa31ST1RqfENuWVA1aTFSNm4qbjxyfCs4Zl9sVmckUUllQ080NCElR3RaIWFqUilCO35gc1Y0UjVNY2czWSV4eEtzfkUqbGthaShyCithQ2hgdSQ4KW9RMUApSjxFQ2FUemg1diNlakwme0Q0IVNRJkVvMkpqWEZ3fDVrZi1QJnBYSDJCPjM/KGUoaWJtIUZKa2NJcXg1c19COztjCitPNU1xMENTR15fQXFHMDtZSUp+V2pnR2tAOFoyQit6P1p0NWBEMFlFRlB5MmJ9OVF7PGJAMyEwenZ9Q0dtJHF2Rj1uKjhhKCRyY0dKRnE2CituRTlmWCstWTRNTjNfY0EkeXI/eXJMMVpxR2o9UW18Y0dgWTQ3XmpZaXFyc28wJUBOV2BpZXowJEcwYn5kSTtgY1ZTMVhwMl5RTVlnSTtgCit6aUklVDVvVSlffUVhZF84TmdUbDVxZ3A7fmRBT2ooenJ1XyZMYihOfXRDTzxGaishIVlhLW41QT57VCR+blpHclg0LWpZPX5qPnZOfSpACislVFdFRDBhQEFHaU9RWSsmYmE4YXxyMWttezduKXhIVFErNStEMz9tWllNREFNdVZiQUx+PCs2TV9tSj1RelI3Y21MNStRYCs/THtocytGCitId3hEUW1DSzYqUlRscXZIOCtKNUduR2B5JFhqODkhZzhZNGQtPlR+IU00T25NUkp8MTwzLTVASXlvSkNzd3g4ZzYwNG0maEJrQy14fXI2Cit6UyQmbmVkYmU9VilmTnckYEIzZ3t6cH5eeFprfGxDQiQydjliOyV5PnZOfTx7a2VkRVo4QnkxcnA/SjJPKittJDZMP3VmfDw3eyk+ZSRACis7b2F9VzZ1V2k1Wk03KU1oSGt4VTIzSzFleih1RF4xK2UkaDx1MlVMTjZxVGUjQGhiOHEhRC1VVno2Kz53VjdvI31heDBHKCVLYDxXczI8Cit2dEM5X0lPdFFKM3M0TCtOZTVoKXdVVjNmenNsKUooaDZyREtMQGNZOXNlIUVpQz1XJGpkejthKGt8JGpHe3hmOSZpe2AoJnhHezFCems/CitOU3pzMmlxNjt4eGlJMXR2PW9HezYwWFo9ejxwbSV0dmRqMkRFYWdVeStCRTZxe2NyO2JMUHdueCZefSNYI2NAWXdEWEBfS0ZWY15Ic0dECit7RFZ1VEw9UjNJWVQpcW9XZXRvXko7dl4rTll+ZXFab0dpckthTTJnIVdVNn5MOHlOYip3U2NPZSVCWSlINE5mek17N05LXl4yVnErPU5ICit6OEZmM1VzZTMmPlY7OUx3akotYUNOU2lyVEpFbDl4Wk1xfXhVeU02XyFwa193OHZWOUxIfGJYQjhNfXVFdUQ+RHAtKiZ7Knlsd04lTyNICitAZT8/Wm13ZXU9eTZ3X2ByIWFpM1BkWTI3Zl47ezxIVEBYZCgpaDlNfXJuWEc/dUNVQzkoXn4rOSl8Rjdvb1gqMih1KlopZ255NGZ+QnQrCitLZ0czOXhnVTE0WG1JJm5qWnpZNjBmVzArNCpBMj8mOXZVcHQwSDQmdDVeMzdwOTdZfighKiVLKnRaM0kjVDh2eUU1fGU2bFBDcjNlVE1PCitkTiomLW1MYSMkMW52M2xxbWo8bEU0bCEkKHR5ZjEmJl8pUipSMGBtODAzKURzTHYwRG5QYTlIVktTPU9JVzxNRUg/aVclSyRiWWlPbV4mCitjY1I2QmQ3RFE2JTl1KGZzQm0xYXxHfTkwWj8/XyRDa3U1JXdGTnFneXpwdEZZQH0pdldvZHpoKEltTSFnLTZoPilvNi01MGUwJGh2e0BzCistI1JXKHRJfTYjWTUoPlNJV0BtbzVTOzl9PDJSPTYrJTFAVGJPZ28xUU5FaDh0dVdkeUghbG9nNWhxZ2JlPE87fjNnWV9LQnVNPGBScEB6CisrandAQ0lqYkw5SHIlTjw0TXRwcUpDLSYqX01PJXs7Vk5VSjRZUTFnUzc/N2grU2UmMDVpWGFBP1RZVVl+MEdkdGhucyp0cGZVcnowQiV9CitqYjF1e3pUYWdySl94bklpRzJ2eD5WKUZvNFdmOUIkOFAwfitUSXBAODJ7QSRpJHVaNXNkIXNgUDV6MDUkMWAye3ZUMUo7YWNtS0d7YiVHCit5K3VMbWlJXmZnXyghR3dEV3JGYWtlPyNwUm87SiNnbFJOVk9XP1Nma2EhPT1+JVVMYiFiLTFBZj58IVd2OHA8PWJtVj54P1cydHNySVJoCitgeGZFZTl4Z2QlOHRUOW95S1deYkRPTDdiVzxpUCZlaiU4OVFJVUoldSFvQWcjZHtjdWF9dFQqI0xqRylKS1dubGN7dkdCaT13V2BzP3d1CistK0lRWCgpMkolekVGNERwQEtRQDdQTmk7dWw1KjlxTz5WSX0yfEcheyl6SWBEUUpZbkMqeWIpdkdmYGFue2kzT3V7YV9WRUtNbkZgVWxNCit2XlVpe0glQTBrQVBIV2VTRTwjZmwydDlLUHtOcm83PXJAdUhPWlJ8dSU3O2tMdUptU21wWUlTd0xVVko7Z3YkOXA0VD1FZ1EyU31EZzZ9CitQQ3QzNkkwYlVsWjxYamVFc0M5MVgzZDF+U1hJcjdfIT1SbCVQdW4+SnMyMCQ9Xm9IUlhuSFg4bWBRe3NXaUl7Vm9mO3FnQT1Kb2VSMmloCitzZG4tYztQVFB1MEowP3hOTEhNSk41QTM3P1RTSD9uUVFLIV52ZjdQVXB5PGBSJER7dUU4YnFJSGZGfDJ9PHlOdztqbTtleFVQdHAhQ09xCitqeCY4Nl92ZjRvXm8/bnxweihKNWoqWmlTKjNHS1Axb3VMdSk8Ums1ZWx6JUtkeXE8fG5tSWVGPlJebUF2KTFFa3hSbj9uMXd4ZVZ3V2J6CitrNnxjPjRfbjdJO3dfR2NEXjN2Nzg7T0VOJnVTWStaeFc/Wn15OXVTK3tvMW8rYWp2UFZXRllVc2R0SVZZb2p0WVBVSkF6eENKQHsjeUx2CittWT19TnB2YlV6K0E7YTtGSzJWPVN4aG0lQntfdyNENCZrZ0I3bktuZDZfaVZ+e01jaUY4Y0o8TmJ5ejV0UChaaFUkVzx5d3ZPI3tPbiFVCiskfCk/djAmZ1J4STspa3BhVnt1S317VSRMYGl5NmllKipAJSpTe0xxQ2AjVzY+YG9KJElBel4hPG8kNWEhamx4VFdvTVlHOEp6TT5uLT9iCitGTGR7UCltb3xfMTs+OHhEc3dEQnhlZ05aMngpT3ZwTW5pXlEhMz54QXBLZ3V6NUZyP3w2Um5KYm9WRntfRmxQP3E1NCghe2BpJkF1TDd6CitvR2txeGpyNG00XmdvWEJ6M3J3ajhmNkhBclpFRUJlais1b2VDWm1xcGlLaEZmYXlmdUY8Q1NMOSZHVXVNMTlqPkMrfC0wZzhGeS13VGVhCitZYzZjezs3IVh7KT5rdSpLLUpCaTJvbmAjcCFJOzBoQ2xsYnNnMHk4MDYwWSZEIzklaU1veUNCKyVlKl9qU3Fkfi1RZzdRMF8oTU49PGhECitWUDFoamxtQDRaQz1yayVYbU1kU0QjVHopciFZQC0yUnkjUzNPZkwhfThVMVJ5KEU9bTAhPUdCN3ZjNUQkdEJBQm5xS2paWiR7djA9T0hiCitsPnYtPyp8KC1iZTRyWDJESUBvVjlPcXEjfVJrUGRNUHRaZFZ7Zm5oR1J1KVhXVC10QkttMVhLUldWJXYlNU9vNEkrO0hfTF45VDgrJnB6CisybTFxJE5Yb3Y4RzEpIUtkck5QZDZfX05zbzR6akN1OFczK2tUay15VzlQTEdKUDw2PXpsVk9GbmoycUYhdFA7TTdxMXppKCY2dCNTQ1goCit4MU55aU9AK3wqYH10QjUhbDAhJHpTPj1xUEBRfmtoYWJfS0lAY24pYDYwQ341KUIkM2xKaUJsK18/fTk3JWtEZDJxTk1hcW5ZfGJYeDZkCis1MC0+Yk02QEtsd3FlP2E2PFF+X2NuZWY5P1JXRV54eUUhUnZOXiE1SGpQPDNfS3ZvdmdiLWIofU5JbEJ1d3otfUNoT3xVSUJna1Z7SD5PCit9eVlyKFM7VDV3VU9pIW9BfWkjYD5sZHs2OGktYGApXzRsMEZvNFFDM2slTyZJMlJDezVvbl90clVDYFImWCZRbWlZND80LSViQlB3R0smCitwZXx2cEcoTz04JHBkPkUwKCR6aiNfbXNiK25BWmw3d3gtMWI5SiMrajxsVVZtRyFFYE52NTIpKjtEMytyQHoyZS1GMEtQVkEpVGd2VUpvCitnOWVWNVhWRWpWfHhrYXdLUXRQKiZyX0RRUHFxbWpCPk9XOChwQGo1Mj42aUZIcE58ISh1S3w9ODRoQSV3ZlcwRDlNPnREKWRPWD4/Ozt8CitNM2dveTU/NF4/bGsoYTt7e3k/T0pMVHxIbkJaWkF4aEN9TDxSVEtgZHVTYE88JnMwWDQ5fUZ2JH0wbXV1aEA+UkVESTBzIUwjNEhRYTRlCit8RUlraEh7WGlUQXdLbn5yQCtIRS1ZIWZZe2A4LTtMM19VNFI+NmpXX2JFaU87UjF1PmBramNJa15aa1lxI2A/VFJNYDluQUd3RzxvalFDCitgYSRTXz9PPE9tellrYVNTN0t9Pz9zSVpOaGw7ZW01flJmPGZienZoYX51IWNUZlUoOyhoTm58NWFsPCpSS3lxbT03dXhvLUZoRC1Ue2hNCitJJUUlbUozJnh6V193PnF8TD1Yb3ZoQnEtYWI8YFl9aSQ4PmQ/QXdHT1lZXnI+NStlNjhsenlhLSZBSUtONkl0TWZOQ1JsYzAlOHxWOUR0Cis9VTZlPFZyRl5ieiN4QUQpPXUpNlJlVEB4KCglUEtKZzk2YXQ0Jit4O2lWdSklOU9tWHJIcUJrb3NxLXpHOEJ6aXg8WVRHNnEjTVp7ITxRCitEP1Jkb1coY2hgIyZpKnBCVH59eylDXlcqKVlmJVNheVgkQVBGbWFZQHo5WHsqK1R1MT5iZS1RRTI0R05hQ15yNUJgYkd6dGNNfVlpZzFoCistO3RHWWd2YFNDQl5AMkkjeTIzTyhha0gxZzNXRThMYSVfKDZ0Uz5zZzdoP1RZSzdCSUFzKEtmYkhJRSN5X31MTng8ZUpEKVBDOEJ4VUk/CitXJV9AUmxYNWk/bHpZVUhVfUk7dkQ5U3BUfSUjPVdCaEFDQjZoS3NrJV5IMDZSXiphb2BLdHNvcGRoU05LdFJJUChDQEVtck9ZMWg2fSsjCitxXz90S3wxPmgwSDB4VlE5PjIzeHE2XjtYJitUZnExPGxDXyo7JGVEPGhhe2MxNHY2aSpXTnZMIWZ5RF54cUZtbi1vK3UjWmZMRE9FVlFRCis2R3tDcUtvNCZHNmM0eFZFWTBVPX5IYlpeQGNxeFc9UmJxK2lRfFMjS1Q/S2R5V3dneVVUKkR5VTh+UDQoOyZNRX0yM25jP2o0MkxualBfCitLMC1QWHYzSVB8cmMmeU1hNiMwaFRIQ3lzTWtafDtqeUV9RDUwQishc0R9Z1I/fT5LR0lTcF5sKldIQDhOSFk0K1N5PWFiSXhzRkIrM3J8CisjQiRDI0NzXz9+ZTZ+fkc0dEd6K1pabjZ0UklZMFVRXn5nR0U3Y1gmMShVSDJfP3xzTzQ0YWZiPCQ4JXtwIz1XPyVhK1Mja2BRaEA+WlozCiswZEkzYjZvVTdUWll2ZD52TGRHITdxTkdXV28rcUh0JmdOKkwqSU0pQGk5dWZhWjI/eWd2NXlwKnYkeSNxeE54O0NeRC0tcG9ZUmtXJEBeCit+akdIYyh+TSpCVmV4KiM3VUU8YihVJDdmSmVtYUwoQDtgOUpVZDk8SmRPTGdFeUc7NTNQfEVQQGpfTFR1MkRXZit6d05lWlY/Z25TcEx7CitSelMwWihqNUtvcyp7JEFRNkhSQWt8S2hBak5eY0hPVmpwQFlHV0R1Z0hHejFrfF9UJSk1dlVmOCMlWl9KQSVKTHhHU0E9Oyotem94TVhSCisxcW5od0s9PSZWKEJVci0reT1Ybkg/PCtselMpTElGYjl5Z2VePXVuWiRMPUNEUztebFdkQT44TypaSFZSOGRrOylgbm5VSX1yNHctdGFQCitpdEZ5ZSVxTy1xRFpreiN2eVpvTnFhRmhpZSQ2NiUhbVdqbz9MUzteYEdXPEd1RkdEfE5KWEVLVlA5fWYpT240bD1AaXFWeVc1eXdSMmg8CitlYmFTPEFqdnspWW5hUjNgaFhVRzNUen5tYis8QTRxY0FvX1drcDdWeyRVSGMmYSorQU97MFotX2dYIXF4RTV1ej1NeGNRZGZxRDNQNVFTCitTISZnKn5NbTxMS0MpTUphXyR7YFEkYEB4R2dgOz4mLT9pOCNMcVdQbXNaXnJ0fEU4OHxzZiZ7aWZFaT8mK0x7Vzt6azQhYWdkZnFKQkhzCitoTmxTQlJmfmopajllVzN+fX5EJD0jZHleYnFgZFlPZjw0PmNLN2NJO0FwViZOVk5qREk2Tm53Ym9tR0kkaEdyQyl0SiNwWk9ZTE1Pfj4tCis/V3c4UXdIS0FfKz5xfCEwdXkkOXtfR0I3ZDVgTnxkdlY1SzJRU2FpXjJiKzNuJihiQWgqbTBMV3BQIWpyaCVVQk1SKik7REdeTCRObWFhCitTJXlEfGN5Vks7NCF9S2YpYkMqMk9VTjtOYilTamorP1EjSypFSylTKyRYIStyTFhKTGpMRjVhUCRGUjFmSEsoPD9pY017PVBAUE14O3woCit7aUohVi0zNXhLRyQjPlJ5KnNZWDktP3I/UStTe3x9e3VPZkJeI2g0ZlVjMlRvT1ppKSswMktLVzAlSDR9UD8wQTswJFJgeD13bUpNanA5CitfNypwSWR3dWxZYEh7PFhzQnhxJjdjfGs+bVBSUmdNY3E/PVJ3UXNMdHlqMFMqWDZJSHU9KSorKjkrSyVgYlhvczJZfVVUMk9udkByZDNTCisrYDFfYn5eLXhIYU02bjV9WGdoIzVBfHItQFJUWGNGQj8laEl1MXFXVTQhQTttKEE7dlFVI1dUclVoJFRmcXhFO0M+ZykqQVFBYDVxQDRjCitHdmZDRnl0am97LVFBPEBnQVJ5K3UlNE4kVDt8KClDaSUlbUxyLSVyaiMoM2Y/KVAhVE4lMyRYQWU3ZiR1dFNTT0hvcSMjODRfa3hNRUhKCituOVFNRWpiJGMlbk9UXlV0ZWtRWGI0NjZmUWJQcVlPWC1aVi1eZWpPST5ZK0RTSTU2ckdYZ0I2US1qcyQyUVFQMXI/aEw8MVpPQHBlc35UCispM097ODYlJDZEbUItfjMmI0x7bjhWR1NyOzswKjklQkhGbEYpT2VhIT45aTJFNTU9UmJoYUNwa1cqZDh6VXRmemIwP3pDKHpQSG9MbyhKCitDbVo/bm9BTiZkMlNnd3hZSGx3ZT0rWntmYVc2bU5nMnVVLUJrPik3XlI+VnZOfXpTQHJ4a3VgY1R8WmhzS2dhX2gzJlJfUU9+elclcGQ8CithXkRwfDgjLXg0SXgyKE4lUSs9ejZHNiUxanlHSD17d20/ZiNkOyhnRi1jdWUjPSlQPztRTnNWVHU/Qk1iKD5tIXsxeUoxUDAybCgqcEVECitXKz49bC0wVGFeZzYlOD1YcUJqc29JS0ROYEd0fG9RSVAmOy14NEdVM3hYJWJodzlpbjBsfEpTK3NCfG82TnJWPEFaczdMSjBGNDJINDdwCitZR3pzUnZTeXZoWjBnQ2s5OzBkeDcrZzwhKyhtfTAyXkpEbCYySCpJVEwzP05MKmBNcyQtVj4jOHZrPWF3TDlfaExrNTlYIW18I2Zoc21GCitgYU5XQ2RzSn1wVDdFbV99YygoISlZejg8Rz1FfTxWUSgwb3Q8LTZodntJPEx+KjZ3PVNZZC0/c34tPTcyaHhAXyQ8K24kNyotVVpwKnFtCitRUEBeQG5YKCp6b01uY0tVcl58S3pyeXVrUCFnKyFwbEplU0tadHJoUXI3MjEzMlVNfTM8SD5mMUpSRUFxODk/NFFiXzZsel94KFMofCRfCispNCF2SUQ0bVVtfTk8OUV6VnBfe1peaFkoQXw5NSowVXRZYFk8T35ZJmxyeT5xaHdMRWk+NnNHPClPKUtYPW4oYzduRFcyUytLS04xa2E+CituRU5seiF1dFpVb3hseD80WURJPUBvd29HQVVETGN1K1VURVpZSldzUSpYUDhfQj07UV5LY0NgYzRgaEd6OUQjRjlkKCE3M0RDYVlRUkRICitIcmNIcHFuazZITHpTYGYwKnlfJEhteUwpbExAPUYlV3pGcmYrYE50SW9KU0BuamNNMFckTU5KcmBsQlpBazRiY29jKnsoP2pOfXdzO1UwCiskKllLQiMpLV5KPWV0d3dPWTVCb21qaWktfSoqcjdqOyp4QFZAa3lTKExgam5tei1WNXFyQFNQNVNKZjhYIVB1UyVBVClTLUE5bTFGcTxACituSyltRFlOOTFFO2MrWihXRWlaV0hRYW5oXkpkJmxGcUBVY0BKeCtuTTY9SnpJNSNIfWx6flNseSFSTjFEVXVpRzV7UGstdXZ3TWhlOGIlCitRY1VyMj93MWE3XyVQX1dzVT5tbkNfIX55WngmbktWc1RZaTZ8LXFEXnYocWI8fDAhSUJSTTRKTFJ4cipoNm42Y2xCbW50fXZ1cnMoYTFvCitwP0FFdyF9U3UpJmNpe1VjVCY2NXlRdiVSdXF2dT5jZiZFT3cyPHo2MFF9Uz1ZIykma2Y2aTl7aHQ2eEM/SC1TbXYwUzZUd1IjPW1xTk5qCit9Q215QXdIKW5XaGwoNyN8empeSik+aGVmdU5mJjIobTlGOXx1VkVnLUN+TWxpUElKMnA0Z0F6Yjt7I3lfaXNfZG0hPz5yPXFWKko0bUdlCitsU05uO1hBQ2lzSmcpMDNJO21nfi0lMikoKG93JTF2RGJHZ2pfU09eXllKcGR2UjJFOUJrankkejhjMiFPRGhRIWpyYWJvJnFAKm5YSlpGCitWK0Q5Jl9JeDM7cFJ9UDI8Q2xTVnpma3p4eDMyYHBFV1dsbE9jJWZSPEU9SjFNQk8mNVlhakw3WjM0TSlfa2BwIVA/JT5fPTFKJEQqPlAqCitnVHl1Yn5KR1FuSjhfT3lXfFg9bUQ2bC1LTXRUUGU9entvUE1aaHVPMlhnKiNVWVVQQldFeUJuS0Z0WDM8fmZ8XypvTjdPJT04a0RBWWMqCis2X0libk5Oc3d4P3FLRTh4OXQkdjBxVXVBbXAzIVRuYXVZU21nNGUhe0BxdjZxLThye2UrTTBleHd+RUc4ZFBWMk44KVh7MThMQ2FWK3JGCitQbylVQ208WnJHO14pMWkqJj1tSG5zbUkmZDw9Pzc+OEpMTzdmMDYteEM9YE8rPjVtR0h5cHYkdG1HTWg/aXEySVdGNGdJfXY+SXFUe08lCitiK2ZBeTVYdnluRjNkZVk3c2NTO0NuIT5iPSpFS1c3V1FofGd9UCtVJD9VYGdBJjlIKkQtX1dObG4reEBvTkwtZjMjRyE7Syo0RT5RcXs9CislVFhCaFY3cCs7JHpsS2EjfmtrcWVVREMpaVZ1aXBrdVNvKCM+UWFWJmdZZjY2eEFhQE4lcDtmMChab2lGZ2dLNFApRmF4N3xnWXt4I3FtCit7I312RDtGUDhjKHczQHk3UWtkPGkkd2puM2VLdSMrX2ZSOyNtMyVaZXBAX0Eod0h0VSF0Q2ltO1R8XmM8czhraHshb3UrfH1AQzlFIWBgCis3KUEpT1FfSnA0Y3p2RDtfQ2N6OV5VK3ZkVmxQYXJVYWZ3QjtwPU95XlExT1M9fmtTS0ZzekBpWTtaJmIkSWduQ0xpZ2tUZEZnZXBIRkhnCisjRFIxbl54K2VNRTFFR3FZWksxTm5KantfeiM5VHlrKHpHNndkWj1LZjwpIUYkO1BuPlQtcWFhTUdMT01IZjRUKm0mbjdifTkjcnkraSpqCit0SDlrKSUxYyFga3xHcTNQaXM+ZzAlO2MmKkRFdmV7JTM+fWJHM3xKJUVUbUVwe1ZhTFlKUThGS1Z7KGQqfW1xT2JRV0NuUiglIz9kV1d6CitVZ305ZnlkazE5O003cXx6Yk9WZVloZj00SnViSmYtQWl5Zz5HUmR3M1JvSFBsPz92UGdeeEUmSiUzSmgwfn5JUHJ0fV55aW11SSVIeThBCistIV56bmVmTUVVb1RhQUtoKGl4b1lEZVUlfn4lUUE+O2wyPlJqMFJoOVVQbTU2Y2hzKl9MVE4+SjRmfSE2WlRaUEwtO0ZUKCttKkQlZzVECitXb0Fzc1ViNk8meVY/NlMrZ1pGMlYxJGUhd24kemJeaXNzaGU0fGN2PjdOUFgzXkFGJmgzQlZYV18yUEczLTB5N3QkeXdZd3N2ZUlUOz9TCitAOVAhRj8oKE9HJEBJaGNGbj9TakNpYiljISNPP3xldWRybjw4JHtGezkmNyVBeXdxUU0xOzRCUXtfWXQzUUBgVE41Jm97ekBSS3F5JCRuCitYXiNER31VaFJXRi1XQyQ3VDh5ajgxZkM/dCtvdCpAa0xreXNKaXVnSj5oNjJCIyRiZHR6QSQxQ1dZZnQ1JUR0R2ZxSGZNdFU7TChtajVSCisxaEJPe2RAPURCa14qSlAxJWZqNnJ+b2RWNE1Hbzd4cVdLVyFlJjJRTXVQcUl2WTI+MkM4SUhwaz4rKkxHejNyaTxOdDEjbjNxR1g9YmdeCitkMHZyLW5DMllVckdiWkNsRE0lcnItU3JkO1FYSEBjdWh+IShhLXhQbUo3cjFec3szMCNZN1Y/RjBTOyhPeiNtVD9EY3ItMH1oY3pZKTROCitBaTIyaC0wPVVHKUI4S0tnWnxVPns/cUl9UTlTZlRtJiM4bFVjaFNhb2JZczdUMEpJQUBQO0VlSklFaTVlTTYlP3ZfSDR7bEpUSykke28qCitAJVJCRj9IaU5UNkxtfXRjZGVGSWFhMmVyUE1aOFElZFhDcVoySVZCeyNgRU40NEk9YWA/N1A5TDNjPkErP3NvSHF6R202PlRyKzkjOFhLCisqfTVAVVVha3UxOClncX1CZExLYF5lPW40dEttSFhga05aazIoQGhiNHZrbmxyTnNGJExzeHFNfD90KmNncl9OPyl3RTc1Z0FTNjRVfUVhCitVVk9oQzk+TShwbHFsQWF7XzFUJEd3diM3UnpHU2oyMkFXJTBOcGItK2FkTzRVPkFra0xhdnh0WDlMKlE1PVQyZk1tPHJZJmtIKjFmcmUoCis5IWkhUmQjIyZtU2s8QyVkb1RAc0N8SHFXdDNVOSlqYmJQS255cFVkP2JTbiZzV0ppWUUyUHlgZl9XeVkwQEU4eWttTWRoSHx5TV54bDNECisrZ2lAOzhSLWh8cEs1aEhnO1glcVh2eGc8LUx+NW1DKGZ0LUZmcjxMR2lwKH5TV3F8UDZ8TyZNQXx6czMrZzBPYnZHUW8yJCpYVXVTLX5JCitLTjRVMnxDdyl8TGdxPXBvbnhBQFFQeH5qS3Q5KWxkaCk1V25TPy1Oem8zITBzP2QrQ2Y9RF5BSiFQKygzVCp6RkFydWJreFd4amJfbzZYCitkYC03S1VtTys5PmJ3PmhBRzZITjtJZ2U0TC0kPWEwX2ptcEJxQT5afFIqLVpDbz9kcnVxMjlCZE9uVkxOc0xFMmBsKk5YdCh2QVNnO0hECisoZEoqU2d1MUA8U0lrXjVnbzw+d1ZUT1gxcjIpTnhgLXZqMGN2eSN7djJ9WGNtaTBnP197T2VIbHg9VDAtN2JGWk0xOWxidGw5XlBkQFN6CitvSnE5ekRnU1VzOzBfaUxjfiN+UThueVZSZjZmKiNRU1JZT3xrekk7aklEdlBFbl4/KGMhZlF0KyQ2UWJfeUBrYUU/MENCTjI2d2xDdyhGCitRQkZ0NGJTVl91JXwjfTtVJWQ0VT5rdXt8bHJXWjVTWUNGfj5OJj1JYUwqTUlLaEgxNlZvSXxxSCVDdGo2biU9fWUwKUBvXzt7REBgZG9PCis0ZjdGVHlAKGJ5SFYkYk0kT2ZHeGtsRUozLWF1MFpOJjRmZFE5KzZkRkhhamlYbV4xNFpRNTxoZXJadUEkc1lNZCl2YXlBejlkPCh4UVJxCis+fUIrREJheGU3MEFac0dsRHFeRE1ReU4xM2tRQz1OdlVRZTtIVDhTaWVjRHRRYzVLWkpCYiVAUVpRTiVRZjR7YHkhWmEoUU5BbCg8fkUyCitwUHZoeyNOM2xDcCEjKlJpS2k2Rj1oKlBSYG12PDxXJGlfTmxtcyliaDYxdzdMPzlaY1B3TzJzcDAxdi0qSilUVkgtcm1mRHhldmBwO3ZMCitlUEB2ckpZdUpHXkgmZVN7KkstcCtXUWc1d0ZKfXYtS2B+SzEqKnJHajNlJG96cjhiPCtWV1F6Q3pDIT1mSCZKemBsIVM9WV5BTDFLdmUjCittYkJGZ2lkSz1+Ym4wbWBsST5reilTWmZ9VmxAKW03TThTMWIpOGcpXy1jWmJ3eDYyfHFMdlg2PzxoMHdQTldgX0V1PH1hQVA4RjhHR3hMCit9Z2h9KzxjTks5eGJ9V2diPDV6VTxqKm1zaElPLUBFSDcqST5PKn5eKT17bXtoaT8lSWtSVGdCS3AmckdXLX4wLUA5VGZYWU44PCpsZ1RVCiswaT17a0I+OyNOR2I9SCpwWihwfkZrUEg1IVphQ1RmWHdMTFc0bjI4Xm88MFVOPT4zS0FGOXY5N3c4ciQtLWRGMWB8bWZUNGlLYiokYWlpCit7JDBoJUQzb0hsRV9BKkY3R0YtLUgoWSNKO1FpYHJPMDB8SFUjbU81ciY2Yk1ARmlLS1Q8eHtvPSRReGIoa2QmN2pfTl5WcSpYTzBfb3h3CitaU0FaMkV8cVlWPDdMIVozWkJhP0hCQ3BEc1NTPURAPkRzO3khISMwZElkMl50LWw8MFNLeX5LJmNrPjxfZ30+NnEwfjBFTWdtKntSTURoCitWXkUyPDlmNlNgKDdWQWJHNjYrbFdjRntDMDEpVXl1c1ZISCtrd0p6MjMjK3AwT3VVJl9ldyRqNTtYaDFUZnQla0cpb29sbiheJWgzRmE/Cis+UXdSYkdpMUo2M19uI2AxLW9WTkozN09kNURyRm1SOGFeOXBlV3dlXlJGUEx1MmojeUkoaVk5ZFlSdUphKHEmdE5eR31pbzhRRyhHIzgpCitZOWZgSUd0ez43fCsmTCZDI0Z1a21YQmgwbSZQNHJWPT9UMmtNPFRYRUw2VEood3MyLVBtaWtpc01BNkloJWJGe3MzSE5EZW50e00mbVBOCis0NDtQSn1GSz1UbF5YO19LbzR6b2A5flNeUj9VX2o5ZDN7Sns1WDY+OVY+YyVEN3RGayk4aCE5KE5SbzZKJjhacDVofDwlPX48OENzJTc0CiteaD1wJCRtfCVQTjZxQ0hSSm1AcVh3KEkrK3Ntaj9LQ0twb3JgKDFEQk4mMmlRMDh1ODJUeWU2Sz5BdTt0KVV2VlBuTn49LTR5V3BBTWJKCitvR359a2BpcmBjaG1hOE9XOG98bldnVH5CMkghJjFfVkwxUjg5NlhYNE9ScGVnLXsoKys7aj9oKUtMPHZSM3JqVGNDZDYrZnt4bzg0P2N+CitxJlFhIVhgfjkoKTRELW1pRXF7dEZ7YEUzM0cqdVZLWSZwbTRjMVUkVTQzJVp1UGlmamtvTlYoZXAzMig4N2FyYXQtM15BSG1tYT9+bD16CitmLUJ5ZlZsVFB2MSEmWDlBPj5abUtxVE5ANEkqeHFIPHIrVU8yLTY3MExfMHw9M2ZUQzF5P0RMfEM9Uk9lOyU8fj5+eGtrZ3B2PTwoVmBfCishN1ltI254QWd0OWhRcTBQXlNvVHc9TWZRbyNRKSRvaW9feFlpNlRwJHpadHpgRmV4MEtwP2x5N0xkRXRMTCVPVUsoVDlnRCokenxFWEdKCisweCVISmlLWjBROWNhdUBsX1h0ZG0jQzc/aEN6IWl6aEIka0p0Rmo/KX0pUEFeQkshe049dHcheCFvJD0xTTRQQTBfbnQkfXVsPUw1K2h6CisjJDJFdWd+Qk1QOC1DKDFlRGtRKCVXZzM3dH4kRVZWZHZIQlZQOVI/JkdFO2NrXmk3fXV8OUdSI1lhfFA1c1o4d1BRSXB8JV9LXzUoWD1fCitWPUB0RUgtS0lMN1p4K1A1SyV3dCRRSnA1Yio7OT1jdl8zSGZpPVdsT2dsUk5NaiszYzBgTzcrODJRfG9aK0VLTkFVMWcwPGM7UndAZShhCitWME1PRGBLV25KYyMlVjU1fit6ai0xVXNxXilYNkRSTiNFbkE4emVvNy1OQVNyPG5GP1opJDg1SjZZMyVobTtsd0A3NUc2ZSl1bDcjZ0A5CitKQHZSfHp4akxKVkh+PFVtYz1TPjAhbkF1bntsOTAmPjxBUHomTylUTiRfWkkzcV5Ge0w8MWNGNXpFRkJ7VU12ZEJwY3U3NWcxbjRNS2dZCitnUjNnP3h1TSFzfFR3KjdKUCo0Y0E4c0BsbjZ4OVppNzBnUztCZ0I1Kn1JMzdudUl+Pkh8OCVOblMtTWFpTD89S0Y5TmNqQ20oeSVacUs/CitBaDtPbkc7NyZtTVVeTSpOPEdQP0JDI1FsJEw+ajJCLU5MRHl7XihlZHMwSzdUYHE+aT84YVgyeXhaJGBJVHRqZnIpTjQ2RiFGYFAqaHAyCiswKUdHNG13RDc1YD1Hfil4b1F6V0Bie0JKKF9LJl5CemgqTXNGPHNzfUZISytJMzQ9dDw2JTM4PG96cVI1P1d2N2ZfJCY+Ump0MTJCTlkhCisjKm1ZOGNzbCs4PSU/aUdxZ3Y4U0dGJm8pbzBlSWZuO3NmP0BuNnA0JURIT198NkhoOFI9IyVNNGZIMX5Me0kxKzZ5OFNBTFRyTk9sdUhRCispRV9XNCUkWTtWTDR4bSpHR2ZKbyNhRnp2QitQYkw0ITgoYm1DWWAlSHYxKyZENzFmMCtTKCpSeTxrKVp2c0Z1RUB1VmViU1JXSmBrMnBMCisqJlJaTnYjTlRTZHcxaW88aWtadWhQU2JoUnZVdi02Y047JFRmWXp5KHtNWEUwPEV9YEZNWEU5Ozl5Vz9tTT1FQFBpekM7ciFCJiFfQDF8CitMfDw7TTs0TjkyPlRxODRMV1B4P3V0VT4wb2ZUdyVYTV9GYUAkeFJRNjA/U1dJanFuTE1kUSVjcDJVSio5JERmRHFtVnpAb0VIanB6cjBTCis/PTUyKCpnWnVsenJ5cFNwe3l6YXJmOCpxQCE0bSRyIVAxNjBAQn5OPXV7cjRIe3k8N08wfis4TT0zUytwempiSjcoOGlzb1VzSF81cG82CitaVSFCMnwlUmBgeGtBb2hiMnBmeD50N3RVYDMwNGd2TkIjJmVFZVdfblhuZXEkX3c/UWojQzxhPT91Xjd+TjVnR1ZOQyFsK3NjJmlPPCpsCitXOUZqc2FwYlBfOyNYTkVSUmpYMkc4el56PGY1VmV6Km4oaT0oPGVfNFh7e30tX0lyXyF0TXohREhpa2JlUzhBS1UpN2dDK0M3MzZ9SUk3CitWZHVOK2poWFRSRipaOFZzPyomSXI3LVYzR288Yyp5PGtEVmI3ZVB2KztgQVhDTEhRP1ZLKWlaTGtEISRkZEE1VXNBJncyYFJ0WXVgQzdZCitQXj4wVlR5OFJBTF5kRHN1aU1PfnhDQnt2ZGg/RjtrP2VQWXwzbnVmOyRWX1ZxPFQ4Y0lgPjRmZHRLRTs3N1dlSitaaWRtVXZwY1Y/Mz8lCitNcENAQnJwPmg0Y25SfUNFTjNtXk51K0xYU0d0KkA2aTklR3pFRjA4RnFPTVZvOGJtMX0lNU89X2B3TXlkKj9aXnhTQXc+MDR8Zm11NkF8Cit+bXlxNHpYPyVKP2Axc2tuN1c7STVgdktjU2QmZkFlPTReQCltWCZzTF9GSjd3TnM7e3FAWnklRX4mdDdBRCRLdjl7QlIqYmY8VGQ4NzxeCitkcGtjfGFBXnZ6b0FtX29mSXxaY3VmcTtnIT5BUW01T2teLWImb0VxdHomY0FzPzB5cHF8U2VkVGwobFVGblhqdEZIQD5NKWEqZnw9eWFJCitaJj0qIXUzUmthO3NGNkpAZm8oeHhHWUt4KExxXjNYeE5yeiQ0VGc8emNjMzU0aCYreTJ7VE1KM2BPTGYoNlkyR2h0QGdifHpTbzFxKCtKCitDeSljbGh7NWZOPDdHQ0YzRTVyfj1OUDFRVk9sPTBvK21JPSZ2JUl8T2AjQV89ZjtsPSVBPG41eSEzTT5NZH0zdUd1I2lqMD8lPzg8QGtGCitDR3AjdTFRc15xOTM4O3sqODxYd2E7TEFiU2R8S205VC1adXF5ZUZhZlAyMW9ud3VRK2BxTl41aDNyfWIwM2p6dG0jbEElM0xMKTRJb012Cis5O0xqaT0lPVdXeXx1aUk4fiFXdClKZWltem9ybnF1aFNFTUx6aGZMLU1lei0wNk1YYV5kOVhpOSFHfmkwSUdufXY2SShmZ0U/Jlk7OF54CitjMCE4NERHVUowPWl4O004cVRnekB2ci02VVJDOWZee3E9WEI/S3JrNFdiP31IXlNJaiFsajNKPl9IQUVwdG9HOTB+eGpIKEdFYCoqPC0jCitaWSVad2B7SklGTyotaTxMVTBtKDBiQGtjVCpwKHsxfWd8JVJoez52YURTeE9OKnZ1Kk09LTtHPD0we1ZmVU55YiU0bSE3cVpWSjt5RkpLCis3cSMhUmw9MEFHeFhRKSNAa0FmdGZ4bUZfRygjcl9BQmVsKFdAemFnOXQ5YSlKSzY5fDs0RDEqQlhnIyZAPEFCUlJQdS0+cXFFazllPTFeCis9dTRjeEYrKE9ifiMwbU0qJH5UNllVcWw1ViZBR0tYUWlsUVlCMkIzN0JnaSRaJWdaKTxYbnFQe0FuNCNGKWlPQEJBdFN6ZDJ2UmdeVVJPCitwU0UpfmwmRFU8NjVzMVctQVAqRD5SVThaXjYqNT5MfnA0JHlwUXAlR3NYYGJLYlJRR3JpSGBUYThDfnJ8Z21LNmRQZDchejBEfjQ5b2M/CiszV04yfjdVQGR8ZW5xM2QpR1ZyVShpeT9YSnVMam12eXI0IUMqZTZ0bmRzPn5NeSFXKGRLcko0WkI1ejlRSEYjSTxyd08xZGdmPX1CeEVJCitVaWdCWTY8bm8lZX04PXU1VWFGdHlKKlVzeG43LUxQVDVFbHZ9WG9efUokbyRwS3x9SFdacFdVQHd7IzQxejZETjxLbXk9XlBDQDk3TCY9CitAYU4pY04qSng+ZmVqd1BXbWAhYypvIXpfZDFXVUVLdllpbCFYZE03bVh6azxsUVIkWnZoPmNEREJlYzd6UyZoUU5EIS15bWVZfGU9JlZeCisjTmZkRClUTEcpMmtwJXt2dFA8cmFCcUAxTz1MZ0diWT83JCFuSjZKeWN3eCpuejA+YU5gTjlYa0BySGFlTj8+Rk1kSFZwWko5dklRZllVCitMPDJYYTsqKmpucm11T0UrQmZMWT18S2ooRnZtNGZNeDsmNi1wMkpQSGB2eXYoP2xqdHwwWVF2IVZmR3VBempKb2FxPGxmPCQqQmMlNSQmCitQMm5CMS16Tnc1enw1YHJ6d2ZsNn4teCV5aj5zVWc+TTh7SiolJHBZcW00ITg/YCU/dmJpZnZnZ1czX3wxPFI/e096MColY2g0KTRUMHwhCispV1F4eHFpQGgoSyk9c3BlV3E0Z0J1byQ7PUx7Jk0pcWhIeztvNDU8MWVqPDVjSDtRaDVpdmt6ZiFvMF9acyYyb3FMNGQyPVNFZVM7WS1yCitaT0FjNl9lJVRpMD1xME93JihyOGNsbHNVP207cyYqfntlZFdHfl8wRjErRW02bldSdFo9ZWpgVFBuanBGTmRHcmBqNWxFO0h+VDVeYVItCit0cHZVMHM4TXYtZ19sYkpXbUh6c00tLWl6eXFseX1PMnxRJmxzbnxhNnI0LUtrJCFhUkRSMUFGNW4pMlR0e0sqOzE/cD1VNEBCOXJfazFVCitKNHsmSUhTUjdhX0hkSUIqTiRpakUkUGNaaWhxclRDQSsqfFhoTVlVfUJCVntPbTUhaWpGNDBvY3RwV29rS3hqbz10LVFRb2lKPlh5Ni1ACittJU9QaHp+RTxzNSZ8VDQyY2RyY0hpdjg4MjVuT1BaaWhMKiNaKit8JXAwRGdlUHI4SE47UnJeM1J6KHFsX3N1SDtNOEJGISpnYWJlTV9CCitJRkhFbzVlVT9pYGsqYitqJS1yc0ghNTEkNCpEVWtRUGdHZ3tSZW4kfmFRbDE8RilJQnNpZj5EaFR5JHJESnQtVGtfKHg0KzJEOzQ+SHk8Cis9RE9JViRNVCRjMGBpOWs3ZlgtQTR8I1F6Mjg7NDFhP2I2anhiVip1NHl5QCVQKDVTcW5MNTdFeip+eUFxQnRMQlZkflprS2NLKVpwP1hLCitvR1o2TVk/STZreXRFe0RkIz0zXlk8OWw2KlhhSzhNM3xjTTxEQmR2aXI4LSQta31qQ0FQcF44KDBNfTQqJG0hVyo3SlpVI1Y2ZEFfPCZhCit7cHt5ZU1UKTg7U3JZbzRFdz1OdkhfJms1RXp5NGozPFdwZjRvNkBkQTNidGUtN3NBQ01QdSlxWlFeJiMtdWxVZjlPSm1UdXxEKiZeenlXCitXdjteWmlNPFE1VjNLdSVXIWR7c20xQlI0N2IjIys8QX41Nl8rK3JhZTEmYkB7amlXQ1owJTA1OzhxSyU/JC00biFtflp0UmkyMGd6endDCitSJmRkVH44Sn09cWVJcGB1c0lEPW42aihaYnJQR0A2NlIycUUwMEg9Unl3MllwfUU5TkMoS3xBfFFaZV5Ad1hLZ2lkYks8PUVBUk03S1BOCithKHZPP0ElNF5zLTJvRylKTG9MTm4yVEA3MC1rSDJDPmokNUw4KWZ9QiV+aVFZbDlOKkJqXnU9dHxqMyFCKnBXJk9yPSNPWCEkMUgxWFY3CitedFcxUEU4dVd3bFdPKU5pWkFCZjxicDw0M1FmUms4U2hhSmxGd21weTs2UWokKTJWX35UQjZmcHAkez5eayhEblFNJVV0K1NlIXlrKUxHCitYbzY4aDh1UjtSSFl1aU5oNTVyT0JwQThKdXsla0BtWT9jcTBmPEZ0PT5efnErWD5ZXmBgejh2fT0/QzV7KU9yTGkwUHROazRzZjF0ekpgCitwZzE7VFF+cEZiTlNqTThlbiFmZTM7KWs9cX1YejwjUGJiVkEtKj4lYDhUZ1UzNH4tUlcoTyhzd2FGb2F7eUAzSE5zVloyPE9qZ0JwPiRJCitTJGAjWU1YSC0hMk9oYTRoVlN7JTswO2oyfWJ3UjFhQSNfe0heXk1aNUhyWCE0MmRze35pVyEoVj0oczR1UVZhZ3okSTU+Q00rcGUja1lHCitkblBEKSk3ZnItVkFvKHEtP2phMzE1QmQoV3chSGQ1TWdnfTMtPUhCcEUzayspTlc5UnVMZjBqJk1leEIrRG5eZ2QxKUt9Z293NUlHc2IzCis/aEpMSkQ9TUMhe0NFeyRsPjVpUClwWTxyN3ZFRSF+Kj1zaT1fKkhGeEFzfH0wUiVaT3F3KSlpQXl3UlQmdSlIbCNSTkxRIzhhXjc/ekJNCitLbiVKNDZ7KHVGUTZQcE5oKW5LfUZIZGozKl9CWSp3aCVgOzhEUXxzUU8yRk87bCRnN1BpUnUjek5rSzheRXxFKj47T0lOaEwoQUg8RVdoCitgemNlZnkhP0JfbzUpbTxFV20lNFJsUXpENygpLVl8YndvMmdXck1QNjx1WjMxNnxJen4zfSp8KHZTbElGOCYzZ0MqMDtDe0hkX0R8Vm1mCituTnZ+b3pGN2NwSllkUk8hMjhvNiVIU0ppUGNFKFVKSDJkTns9JkhKWF9hWmZNZ2d7OXozYCgpIX03dXhyY0hoVE1VWWhTaml1U0R5bj5fCitJQlpyOGp9Iyt+ODRJbn5yXzdEe0Q4ZmcoOCZ4MXxVS01kSz1JTUd+YVFNMGVEeEtRfDJVcUVfdWNRYCFjMm1AP1hBU2loYUlRKTQ9PURCCishb2pxTGxHanNiNTBXTHExWWpDZ0liZV9nRFc9Nz1UYjt5KUk/Kzh1V2clfm1rKig/czJJcXBPdjk7XmpNOElVJihCfmE/QUE3ZW0lc1lICis9cXRYaSV3aG5iMms0X0RIaGJYaysxXjM+MD1gM01nPSFRQnJYUW1gSShKYWxVN3paNENZTHFrP0wwQWRfP2Nfcz1wcXR7eilEVzI+YCorCitGRU9hfW5TaWJ8PFY7QnE+IWQyRTZvRHUqbHplX00+LSFJUGlCVyNKQCVkWGxaZnBfYH1KVUJlM2QwUG8hTTZZPD9PPG4+VSR6KEBuJmljCit7fEFMXmkyaHwlelVGbSM4T3w+VXgwVT1fOVRCaGtvJEhaXktDdSVSUXtvNTQqMCFpWmlHPnBRWFk5RnpDZyVwa0p4TCNgTndBTTY4Sz07CitYQ0tSTEtDcjUxY0d8eEcjcUJ2O3lkWEhoTlY0TCFeSEJgfStrVTMwdi17K3BJQm14QkorRUg1Pm1eI09SSHdMdVh1Rmx8MllQK1QpdyRDCitlJVI5eW9UPnY7Iyp3JWxMR0ZafDlQaUkxU0lwTjZQPGEyPXZgbCY1LTIzZmdoaERZP0h0ZSQxP0pqSnc3dz8zPWl3MFQ3YlVAJDkld2QpCitKI01+aSM3TndqPH5KQHAxZ3MxZnNCVz5xUFUhI0t+T1J5UkdfXz0hSHtIN2YzeDkhZkdZSkcoJFpgT0BvZ2xnYFpETSgoaW12P0FVe3RWCis3ckBnZyhjIUgjWW9BS1JRM2JrdkxufFhmJjIqTEB3MGI3WSpWIzApb1JfZTBsOUk3aDlZOUp8PTFzRjZDNT9CZipfLTtOUzN1fEh1RG5UCitySTtrdD4zdH0mUGR4NzwpPCslZ1d0cXJ0JmBWcFg3SkJ7dEFnZDl7fnJERy19YF81YHxpRXxlanJeYFNAR0xIfEwtYiE3NjA/IWl1JClQCisqfCZYczdYSFdvR2JUK3t7UFcrNkZESSl1RUJoUHUtflo/VF8xfU57LT1oRWhIfGlOd3xOUXN6eDZSUTBuNDAraS1RPlJkLTFnX2B6aVp8CitEXnhkXipJfkg7QntKPDlidjQ4NF9aO3Q4YXQtfDJXQlNjXyg+MV9iK0lnKklANUwoJTVKeihOSlg3ZykqdTI7QWpYI0NDOTdoPTJqOCVNCitpTS0jfGx2PzVFandaNyUpaFBIKTRBSHlgfHRRcGxhLTJsPHVNRz5QdlZ6V1g1VE8tfVNkSnM8Nz5CbldtaTBEfUE4NEx4a2dXXj9mSUh8CitoUTZuKHJrZSpqdHpJSiRTPUY+Nj8jZV92VyFMR1MhPSNfaC0wNCtrXmQhYHpIa1EzX1kmZ1FEKHRVM2xCVDg4VWMzc3ZoQipUOUFAKU8tCit8e0ohYWRZTEtBQzlUZi1MfXVaTnVMOStkKSsqSiF3QDNaejttOE49SWomWjNgRTtNS1hTZD5fdXRoND4xaCZsN2smRVBDNn1HazxiN0lqCistbXhjaUhVU2VkT3ZoMnxHcS1uLSNOQW1vcik/JSs1Vj5qS2Y/MiRRNFpXYFYmen11S0NGMHJ7TFpSN2FRZjdjRFl+SDhxZlo7QmNWJCF0CitLeU5PZyN0LXE5K3pLZEdQPHtUX0whNjFjdj42QXpJUEk8LVJQVFBfKjEwTz15KzxUKlp8SmItd3w3SWFFWWIhOzVgcXhUanU/PkhiOVJBCit8aWtlKFV0VG1eYCtZYDZqS2ZeWDFCMENVO3J0aE5XNCZsaHJZejhrSzBITG14enpkeTkjMH1nK2wqPn1iQzdqbVNNOXxEK1BlMlkoSGUpCitAdnFXQHJERWVlKVkqMChXaSNsalZTM241JFQ1X3koP0NYWXAyakpqXmRZYjE2Rysrcm9QOHd3WktpRjdKe1crUSFkU1JCekE3I0NmMThQCitUNXRFeDFITm4tRjJJNHpjVWp+JUtGeWBoPUM3ZyFVNTU7aHJDPUpwSEc0LXpDQCg/d0F4Rm9ES2NAKzVWeyEobVE/KGFqWDVPSXtHZmNpCitWcnY7Si1VcUgkS1dnd0ozSzBkcUJxIzhFVyhWdzxQQlptWHVCWDZXNSsmPHghfGJjSmR0QyVDQk1ZUjxfMz4pZzF1QHdJYUtNZjJjKXFYCitlVV5EWGFXZns4VmUme0peITt9IUBkJlY0MXE9WCRjOz9oM1g4I00oRF96MlJMNlomJjhDSVRTN21mKUooMHtQRztRZXtQNkZeclRyZkdgCitZPzJJX2s/NjNfNThvKlBxXyR4YzchN0gzLWNiRmtYJFh8T08ySUluVENVYXlaaGpyPyRHdG1oLVB1ZEljaTUoQFc0STIpViNsSmBYX3JSCitDS200ODB2dkdCSDlpJCRFYiFQI000eCNISGJiUFh2Y35AfTZGMXh1LXstZkc3RTE1RCtzQlV0YXNfSWcySVdobGwmfGw7PnNRdEgqQWt8CisxSlNCQEZRe0g3djRhOUd0ZWg+bXxBZkF2U3ZAdGx6MU1+TyZoaUAkNmxLY1Q7bj5uY2c8WFlEcEBTZFRPP1A+clNiaSViQSNPTGIqPzNhCisha2tWOT5CVzY5NX5EMj9hZEQkWlQrP2dpWGEjQ2A8ZkRRUVhDVUM5RF8hX1ZMN21sQ0FHJVQzcn4jNCZ7I19gWXs0alZZMiFTZ0VGMD43CitnLSFMZGtzYnheckdrOTZvO0s4NmtKc1VVMHhAcWZDUmxOJUlvYCZuZDNjTnN1R2YqNzFuZ20lX2R1bGJiZEFMQCo7XjN+MipHTmhFcThtCit5ZDBHPzVsYDE4Y01YeVpmPD5EKmtTZlAhbUNeUj0pRDdYKEVYIyZCRGIkQiV2RSs0QSREalA2U3dZYz5RNCZBdEpUblU5eGljKXdRcEwoCitkdl55cSlYWXtqN0w7PyE/K2J0YCtMcXdaO1JxRClLTGI1Y2E9KTd9TV9wPFU3T2VaYWN9JXAwbDRxWD59PDZmRCEpZ3Y3YVhWVW15MjlICit6MHo2S1A4amQ+RjN8b2xeRlJDQkhvSzlnU1B9UUxHRlNvbzBxKjhENy1+ZmthJTtoZTt6JDJfUyVPYSs7eiYzSCt1fjdaajJ9MU17Z2NCCis2ejtLV25CMFRtWH1WdHJPP1NKU3s7SlJaXmJRO1pyKn4pa1g3MGZ+Yzh8Z0RpcWZ+bU1vKGBkZUR1dWBpMCMhOSQtNGBtTyFoO1B3PVF2Cit2P0dfIyhfOFVhcmpLd0l2NmFQbmxmIXVkclNMZChKS0ZqI3BgWks7UG5mcDtaJS17anB1cVNUJVZuP1omYDs7akFqM0VDYEg4MEVKJlN+Cis8K1YxNEBSSz0+fHdwd19vc0JZUz9ZXnJ9VEFgfj5iVEB0YmRNUGJ3PXppakBjM3cmbGxkenxXQGpjVi0zclkrNjVgKSEkKnBSbioxb056Cis2RXFQYHpsRlN7ei1RYjEjYlo2YXNRUXohVGoqUkVwKHs/TnptQEJETChVdHlwKXBOeH1COUQwM2RpI1A7c31eXlVBMm0rTTtnT3BWSHdFCistPUQhOUheQWVnQHc7KT1HaUEwYyR3bldUUHVwQCR1UkFnYCY8bTJQVUFQRndPbXRFUDRSOUJYVTN2Q1VRb15hSW9kNFFjfThfS0IyQT14CisoZn00eVlvaUFTaj1YPEtYR3N6elZaN2RgPio5RGFPUkF0U0slKE13U050fXdHJFpQZENuJDVjTyliVChwTV9vcUQqb1lBTn5oUE9jPGp0CitxRWVGO2B5fFNyajk4UWRodWlZVlU/OG80VTJVXmZ4TUw3eyZGazFxSmFZZkxlTWg2YDhDV2J8WSRmQWRmd0RfeEUmLX41VEwzOVg3WEojCitNfDM2MnVKdF5VemhXP1k2YytDOEA2P2pkWDdQbX1IJTY3YUhfJUV+RjxZJCY2cSVoTyshJVNqV3MtOEtQI0cpQGMrZXNwPUtealZiVHZ2CitgKXowQGFGR21ZIzF8Qz5WTGZ3eGF8YVR+c0BGQVFzM2FHMHtAO3pSMnt8WGNhUmdZdSV5ITRTWWsoaSo9cXBVTlU9O3phJkVUWlNyQy0rCitwRGI1PztuYnRVLUc7JlNAelpuZVNMbFJlRmg4X0NOcn58WlNXZlc2JmM/KlAqRE5mR35me2E1K1UwI1IpcHgyaj9yfD45dDYkKHpFUyhlCitLO1RDWDJPVHl6Sl5JTHsyUDlhMyNVRiU5WHx6dzFDLTNqPzB6fENkYzRCWTZyMD8mN2lRYzM3azk0OG1MPDxmY3lzfkVtR28jZXh1fW94CitEcDF5UGlaOHw9dShAI24yV2JQMiFAfS03Rk9wenNMbDlRJFlmKyRAaHJPJFhqKVkrNmRKU2lUXlclU1UxQGJMdnhjJXh9b0Z9V214UXJ3CiskY1RJbTk3RHVzOWVDRyo2UzlTRjNAKE1FOF9yeWxiZHo8cXgpamlxKEg7bz58aV5lIzJUPittJHc9VU5LbzlpRlRrM2VFbWVAYXppNTxzCispO3QweE0lYjZ4fS1jN3RWPC1oKDBjSURueG1Zb2h9eEE0TkhyO0QwaEZzKjZPdzVmPz9ZTlZsPSNtMmF5YTxyLWNCdHZzKHZLVGVBc2MpCitkRGw1eTxiK1JGODVHRHk+O2hIekpeTUhfQWhPYDg0JUNmdTMzPVRRSWZDWCVnU3JTMlFGPHNMNUdMMlN7UzxZajI+MWAhRTF+UGc0UlFPCitJUkV1JSFMTi1iPWxyS15eKUM8cWI5NFJXJl83dTBwVVJ0VkhaOCpUQ14jSkxMM0tFT0MjcH1vez48allxOTJfMig5V2lJK1RHfSVUNUo7CitBRGRhWUB5ci1TZkp0QDhVKG1NJngrZCs9c3FCQT4zNFl+VzxufEhsYXtxSG44e34mKGxYN0JCPj1zJE1wKWk8eUk9NWxaTG1jVnVzeSZiCit2RDRKM0M1SjkqYV9mXldeWD9KXnIrTlJqPSN5Vn1pWmtLKnFIYmY/fGc/O1dfdjRqNHxtN1Y0aWBZPDspYiVYYnpWe0hldn1zbFJXcnVYCituMmJ3MmYhYEZJYTVEQHFifnA/TVkjOEtVaSZoMGBgcVJvNyFLVThTdHlBe2QjOEtUVztXQVlTJnp2SWNKUyZDPVE1eFd6XkF8eERgaT5ACit6Umk0bXpxaHxIOSZSR0VAViF0bTNkaWZlPXtzNSgkTUwyaTxUPkw/PW9zK0MtUW1hYHZaQUhGWlM+djxoZ3t+Pn5JWTtqZnJJdEtyOVhOCitVdCshKk9eNF5YWDdSO3YlNWooRmQmaGxjKmRYaXZqbUdhWGV1V0F6UiQxd0l0QXlVRlY4VSNWKmFxeCVPWGlhfjMpdHwqaHl5fX4yTWMlCitvSVhrVUZXU09Gc3I7cTFwRnomfGU+Y09je3BjNnZtJFBGfD5NUz8yPj15MF58KzdgUCQ1bTkpR0lqPURYSEhYbV44cz1jY3p+MSg9Y0kqCis9c1ZhRjI5JC1BaCFNRExCYyRHb20pTkMwQXtBSCp4YHYmNzVIOzB1QWJGUlF2U29yNmdhVS0kZmpqY31KXkgjYCQkYjl6TjJ6YG44RXJhCit0WHtkaUl5ZjxyTEt9JURMY3tfOXBlcTdffVgjeXBqTUFtQVUhM1RnbExmez8mM2pvOD5rKSVQcUVOZiFxR2xjfC1PJGZ1OGBpQWpYP2VFCitqTCNJTCojLT1eezRzTWhwPWApMn48Pz1fWk97Xz87cXYxeUNMMzdhRGZQc3QzN008LVQtcEA9akNtczlzbTdWVytfelMyLTA5YUhIM0d3Cit8OStpJmVZNU88VlVoUTU2RzdZT0R6M0A8aHghdVEyaXlCRWIzdFpZWChsaH1IV3JPKHBMTSsxQE9gJHhjaGlOSEMxbDkyMEtgTXluaWlACis1dGA9NU84UU08bDVRXyZwdSghVlAjUV5NZnt9PVNReVNva0ktWWR8cXJkX0IrejxJVlA7bzNwZCtRY0ApWE1YZk0wMiRhQmxLcWxOOGhWCitCN0BXcnlYSEdkeEhOfnJsamY4cUU9OFcqYSkqYygqMi13O0wzTzlaO2tUb2tXSzUyOFRSVXRmMlQlWmFMY0sxcVZHRHRHSyNxdkZwczhXCithNlA0c29yODVpSkFAVFB8LVNpVUBMaDRMSEd5TD9UbW9mSDRPbF9TViNjRTAwb00xQU0oTD1rbGRQcVUkQGExMHJaN3QzJTk/bG08P1NsCis+dmI9Kl53I0A5QCZlOUh2dXFyaTIkQUA3VWVGbDxDODZKKykyRipGe0xtOCNHRChDNXRPXmkjRV5LYDledkMySCl5NUI5ODRFSkVnYHB1CisyVjkrTDk5eTBxe1BsPTZQKTJ2UzA8RE44SiFFSVItc3tXWWoxIyQ+czZ+NzxiMnYtOTNIXjFOe144WD1pI1VqWGk8OTMyKndMRkJLUGM5CisxWXhOdH56azt+XiV9SlZNWkw2U1pja1lRfEZHTEd8UXtIMlA+V196VyluQEFWRDE4KlhZNDMoRSopM2VzIzdQcXMhRzZGO2tpMk83ZXxoCit1fHooRiReP2IkfSM9Pk56eF9IY1pYI08/RkRrP31TSyV+MURlXiRwSld7WXV7IzFwRXc0Qi1rIzl6THt6Vy1WXiNrdkshI3xUe2NJY0pGCisxQTF3P3gyT2pQNGhXM149JVI/ciU7I2UlZ0Ape01JZjlnU1NUPkAwfC1jeClicWxyemdgcm9XRG0yO3ZKfmBRWWE2SmNFWjJ5VStBPmNACit1bHpYaGBudFNmMHh9d0pOayo8WSM3XllMR1l+LWZXTEpFa2hkYEdUTllxdi1IVWRDcTN6bG1STjZ4c0BFKjwmfDFAVFEkP3B0OSFgUm9ECitKQFpxI2pMa2s4ciYrc0cjMjBLfURmWEw2aCtHMksqIWgqcCt4SSFgYCNZITJVLUgwZnZ6eUBiWEt0c0E8OyFyUC1KNlM2TmxvXkVAMW8tCittRj8tanJJUWA0QSZlNXxoPlU7UnZScXwtJVpaaUdCUU9ENC1aVjEpN3VZWC1FNVpOfHArRFYqM21WOyZYRF4xNEJoQ2ZReWUzTXFVbGtBCitJWDkpMkBoO0pmS155T2c7Q1ptIVE7dTF+aCpOJmxGYyNJMm5iZHZxMW1aJGhoS3lRUlUwc35rOEIjeTc9dClmZz9tY29zak4rX2IwajxYCis/ZEFhe0t1JC0mVy05cD48UypJSUk3emQkNU5hT2NxamV0QTIwdEk0fG1VdElHRUlpYEBIcGBiWl81U0gmdSFjaCheMD1GNlFienh7UEdJCitfTDdSR0tQKEBVQzA9OWs+MFpnYH1Ec1VrXkwkPHY0ZkBrekN+YGp2NE9CbEg0IXQlZXgkRnI3c2FBTVhtZmt7P0t5QldASD1TaXQrUFdmCitBIyRzM3R9I1olQUQlQFNCNjRRKTdmbEJwKUF7bi0wey1mKz5zSnItJkFhbEc3cy07aFNOe3RtJUdLci0pKXBgMGA9UFNtX29lKVIzNGQoCitqYnJKSGErQV91cTU2OCgoOWQyXyhObEZ1JUNmeUd6cjZtRUpjOTwhMzwhOVlgZyNVT1EmeTBoJDNmRVJJJSF5RX4hI3JucldAKmMkbCtECitZQmQpUUZ5R2prQi0pKm1rMGBhbTtZbnc8JGZrMERZKjFgMlRePmMoaU51JilvNWVheiF6JkMme1UpPShWQnJlazJhPzc+NEgyKnApO0ElCitwLUZpTT5HJGk1Zl4qcy0xKExvPS0wY2lQb31nYktfQlQleXBmfm9NWWdkP0tVa3FSKWZ6VnAyelNeN2VJWVEwKyZkbGtKcWxyNlI5NnhKCitmVWZpNXB3YVA0VD81dG9sa3ZvTm9URUFJaDdDfGB0QD09JGEyYEY4Rzw2PUljN21YJWtuTiU/bCNKWHJ3azdrcjlETFcrOUdAZEFLU1h8CitST3EjVSpUWH1EPUROaEQ+JHcoU0BXST5gLW42YCtmQmBVc1Z4fmZvPlV3QG49Y191KEVxbEcyTHYkNEZtJWZsPW9ySTEkPTckRno7QjA9CistZFFvb3NuM0Z5NHAmZWB5MDNTbnN4b3hrX1V9bH5iYEtyck5HNlY/XyNkMHNYQzVZZzkqRzNzVCFzUjVEWSlwMkM9K2Y3JmYrMzk+VCNvCis9Jkg9JCEqOWVhNyR1bFZyZD8qJCNaO2VCNEZ1dGItfntpPERJY09yTmdqdTNJU1A3S3hQWWx3MEtNfGN1YzEwIzBuJlREYjFVRk9EQ0glCitzbTIxQWtzN3g8MVolNlg/JClKUlVuJXhURUI7SytwRl5qaHdoV0l0OGoqUVFoRmNiJGg9SF47bWEyVWJsMW5hSmZ7OVl7RihCezdodzgtCitTJVZtZ29tcFRyNHJBRiY/JGFFYUpuMyReJlQ5T1dDWCY4ai0wWm5gQzV7YSQ9K1RrJjg/TEFaTXViRkRQZDJ5UEBDSCR2KFgwLSZvKlEoCitHWkAxbjNLVj89bUAyN2BONTRTZlRkO1NDSWF5dzljbTFHRG1ablk5X0Z1KlY/b2ZBZ19vITdWITBpT3pEPDskSVQlSTBYYj0wJD1ncUZtCisydTRtNjtBajg/ZVdEZk8oXnc0QXxKS0ZnUlNzPGckKlJZKTlkMDxUe3hSWV4zbzg8eGFDbVM5Pk94UFRWcG5UVW9vekp2Kj1pYXEyVSV1Cit3aHRgRTElUkNPRTFGVzsqKF9mNEdheXtQUTZyaEojfHRDS3JyaFBVZ3M3fmA0V1E8RHhCPyRBRTBpU0lxcz5jKVF+NCEqNjZGfXI3eXg3CitCRXNqZEoyWUpsOFdmKTcqflFmdF9NK3Z2dTFiZGIzYmBGSSNXKyNKNzlQRXMoVmp5MTd0KD1Gb2glOCk0MSYtXzkySmNEajNsY1UhS1BKCistX1MyK15ueE97a2g8KCklS2coR3RQVVZ4cj1WTWdsXzkybWpTbW8hUnhseFo3MTNtJT1LNSM7PlZNSlJDMGYjV0JvUTdIR2h4eGhnUTwtCis9M0tuSm1ZYXotQSQlVTw/T29zZT1SZWQ0MU1lYlg/JkRxSEhpSXA1Q2NgJEhlZll1UHc2cmJJRStjcmBWJXQpYSV2N3xjRlord015O1UtCitNJjRrSjR7cXJyTXZnX3RHUFAkIUlmQEhUWmRFRUBpWU9sJkZ6bSUxUktWRU53M3M/SEpgJVM9NDlqRTNldWVNM3tLNWAhNFIqOTx3KF5oCitETUJWS0BBQCl4JiZFUio5X2x7SHdxb0hAZmU0e3lKVFFMfVNFckZqbSQ5bUBSeitlNipaTmAteDExby1ZTTdLTUNNZVlISSFlZHB8KkY0CitPTi1TVFpGRDB7a150SjhtQURHV35TUSoyZztfbmlRdyomN0dfLShEbldoPC1IeUMlPzdyWWVGMHg2SGFCcEF7Kn51WU11UGxaV0VjM04xCitvYzU9I0pxMFVhPWleRl5JPyZnS0VESlpHUyRTS1JLcXxSZTdhbVJUeEQkKE1nO0h4SDVuM3swRis4cWpPXylCaWFvdytvYXVUNGhlZEdpCislQyUxMmt6IzhsIXc+YW5JUn1aS1c8Py0tX142Y0J0JDArLU9hcUFGM1FPSTBSdnVEanhfVE03QXJNSTU8WlVHeFBRRXc4e2E2JnRZdHshCitYVm8jNEBlJDk4aEU/VylwSC1+eHorPm9mUT0pTG4lZEd1K1ZkeUZ8a2BtYkkoS25MbVJYZ1ktcUJPZkN1UztHKX1hNHVfYEw1VnYmOzBiCitDN0FxUGFLaVNufkpTYkFFUlFqblBGV3teVEwjfXhEK08/REVmKmx8R1ZPNn42aF9UK3FKb3tKSlFHZFk+KEBGTGJnQylPNz9IeWZVKGM8CitaV0QmUHclRD07WU9GSSo2P35zPHh6fEcxZDJgTmd5RTA7dlJXN3BHYT1hbW9vM1g3M2tJVXs1dFR+YyN+PmtUSEdOU1RlT3AyLUhFJkspCitKUm1gUUBmS3NYc3kxOUBWS0Zmbz94YHBTbX54YnBGJDNKRnV+PSk2MVZ5ITtDNWhLXkc3ZG5gZUE8N2lXUXBvMlZ5QyVOLXhYUFhEdFoxCitsNkFlQHs2al8hQVA+YEY5MElqYlRxaXM7SndEVyZZJGg+UCgockh3anBJMGdiRjd8QShtZ2AjRGgpb2B3VVFlfSYqVmtBU1V9eGhiK25RCit8K2V3P31SPlRNV1FGZUQhRTBecnl5T1ZneSprZV9aWlQ+N3lZdWBEaT5vOUJIIUd+NV5iPz1DdSRQKHU+TS1sS3hJeHBpNWlEKklNIzRqCitxTlkqUXZxYW9MU1Y1TmdOcUQ0MHltS15sbzFeM2Z6dGJUe3wjd2ZAVl9IakBga0BZe0tCK0c+KjVaJVhvLStHbnxLTlpWKXFkbSghQSt5CittTClSRmkkayV4Pj1QVXB+UFBLSiRPK2crSlpyfEorNXRiR2MhTkt5VlZyQHQ/V2d5Q3tBOSk8eXlVTEU/TTJLTmpwQyhsPCtGNVBzcFkjCitGQmpzZyNNZ3g+RnJTT2IhX2oxYD53Vko/V19ZWndtWkp0dGA4eDt5PjFUTkd3MTFCKW4mVVpsPkVaPWhOOEY1OT0wZGI8OFd7TS0oMmE8Cis4SGVGXzlzbTBwbzltNmhaPyhYNWtORUVse2xTfThBS0NaZjtxTGtHa15TX3w5Rl5gI2BPUm5GK3R+MHc/T1AtRklSNUpeISMhdFMyPGxmCitRYkh4dzZVNFJhcjx+X0xtKzF6IXRtM0JoX2A3WkdLQ1MyWjM+am97VlNkN1EwP3NyKylkSUxxVFBoSXomO3I9flAtWX1QO2YybURwKGFxCitXMGB+cXs9LSEoUjhjVFp1YD5kaUJkP2NuRXJAPkArVnEwOEB7XlZnI0ZZSUYyPnJ9KTA4e3BOazQwYnQqV2Z4VGJ0d0F0JVBTJEE8aENqCitocE0+eUkxZHZ2Qj52azdLUG54NUxaTjR1VmRISCFxeyEwRkw9P3QtSXtgJWdveURILV5iMlNobEl4eDl5Jng/Pll0YzdCeXB+YE9uO2pSCit3Xnk8Y09LYTFeVi19X19qYD15WlRKNiRoKylVMHpmfF9xLV56YVVUaUgrTnMyVnw2MERwcGJhX3ZlVDZkX3dWKmhHT1hjbCk2bG0xVWp7Cis+OHg1OGg4fTdieHspVEhJMVJQRj84I3FsK2o4MVgpYlIrZ2Fte2h6XiNuJCo1VFM4MlZFT1dOOD9qaEB3UyZueEI7amohSkwlbWxqUXdDCitOYUhVQjMxJileYzFYWWtUMUZObV95JmJ1dklhYD8rWVQhaGRxc2BubCRJKnVnR2xnO2ApcVBidT0mKUU7SntaIWkmZGpPZj04TlpeYnBwCit1Z2NKTUE3ODBKLSkmVCUpcC1XVipSMDY3I2shVTlWQiRRWjZWKjRLcFg8QWtmQ0x3Nmx2PGh0ZkgtUD04fHhkeDNgeTNKaVRZSkNpfT4pCit+KWQzJC1TPGxPMiltR3c9Qk94cUJgaElqViZ9SmlSRWdDI1JvK3s0bEBKKCpSXlQkS2NWeV49ZDdBc1EmNW9OJWFXSih9dnVDNVNLQkNzCitPLV8xVV88fW1YZkBYUWZPNUdPT1JGLWpfMUFiSWYyNChjRTc3RmxNTipAYmc1aGdycH5GTDlPfCRKRVkqemlUdHAwMUJvTyFZe0M/bWp+Citna1BPPm1oc25RaGQkQUVtO0FDISVrfjdkKkJRUCtZMjthRkglMzhFPDZwWHB4WXRRYG40e3Eydkw/cl4wSENtcWkhSzRmTD4zPVhuNDxmCit+VTJ9YythZS12TUw4IV9PQVVtLU5reFU8UzNFbDZ2SyprVHp5MW4hbWMzTnA1aUU8QHdrYzR+K05SfXwhQT5kQyY5dEJRIXBSN0NsNmpoCit7Rzw0SDhOXzxxY1NWUnslKlExd2U4ZCFsQERkKkRgSCNIcV40SXVSPnZhM0paN3ZRUHlRMzV+VXRmOWBCV0gyQ0xwb0koX1hMKDUtalI1CitrYDQ9YEc8b24kSShedyZjKHsoMit1SDVXVF98ISFlVGFhY2FBO0tQRj1IakJ4cU5ydG8xJldBfntBMnlQejJ2KVBFTTZnVj93RXhAIU9CCisrb3FiSXhOTllAXnxRPHI9c3RwdypLMHFfVTNOPiteRXxCJDR7a1R6U05LWk5EVGQtSmw5dT49cyVxMkowJSRxQk1BX0Z0S1g2IUxZXyNOCitBUEArSkFyTUFqQEMzcGJPI1U+ZGopdUdKRWteRCE8WHwmJSRqJmFmbl9YZnJ7VSkkSVNEbjBCcXBAQXFfVUI9NmU2T0N7RWI+a2h7VD5kCitjZGp4dmhoQEV5KmBPJkA+NjhpdVctRUFmaj8xQ31MdVM5WHZIfGdTREg2UUlROz9UUm9FcUhIPy0jUE5fViV1M1pHYXNYU2I2dDRhcj89CitEaXljclJSX2FXZkJAR2cyKzx3TShqTEhtSDY2ekVUTD5POCNYaD41UiFLRHlZUVQ4ejZkWG1Wc3p1MSh4TFooY3Y9XyRoeUVkQWtRSlhNCitEK1E/b3JMTmpsXkFxREVBTnN6aUVeMUUlQSNvMy1FSmttSmlRO0dvIVB4UW4kfipKNjk9NDszP31hOVBwdTl1VyFjdUwlI2pQJlJQXkstCit9U3ZqP2omMUFASFZzV1pUNG5uS2VvdyZ7I3xxZnBsWVIralZ9VVNkeFQ9anRyKUo+WHBhP2QqT1ZGZ1EmfWM1Z3NPU1IrUF9nNDBOeGhnCitkez5ecytidllsJTdycHJlbndAP1o9UypMOWVYQ1ZkfWBxV2U/PChwdk0qfFdmZWlFfFVvaTAhb1olKStMYExPRD9nYHV7a1g8YFhtTk0jCitgVkV1YTZ0V0g7YiYkPHJEeih1eSlMPF9QeFdKc1AlOXVsTW53IzFKZGM3ZXJ9emEwKXcwRFA5OTJscDVPPitzck5yKiY0XnJOMnVVP2lICitHTyU4XjZjTG5AMCNteiNXcUpITTc5NTJhcnc+WVlUMmhFZjA/e0tNdkxBJVVOdnQ8N2ZfbXpPSDVZVztrZm5hUkNPWXsyamdjWU1CdnsyCiswIW9DQHtqU1FmKUlWcEdOTyEwTDJXKUhYSjRHej4zYTFkemY8VDRsLUJUOWVqM1RndmwyYUpkPjF0RyZ8OUs0dDB+bEhtVjVNJk4mRXM4CiszTTNpJEQ/VzlpQTtzJEIpO09QJSNLdW8+YmptbVhNfW5faX56Z343PnxYJXY5NGxsRk1mekRQKyg+az5iU2ltei11VUhBPEo2U1dtJUNoCiteP09iaUtCcEA8XipBXzJLMSl7Kj80T2g0azNAOUJQY2ZYTVVjYihWKWohOCZxRFRPPyUlJm5TKlEwUyF0MCgpNiM2ek57YWppZHY9YVpMCiskeFRMKmdkNjFaSlYqNn5NYT0oYUtJYn52OzNGO35aZmtBNjZQYmUoNFBSZmQ7IWE3VUB4cU19P2pFXjhTQUZDVFY9SE5qclN+TytFPD40CitPWlYwO0toMTM5R2lxJEQ3U21aYGNIT0A1UnR2dGxDO3hsVmp6Q2t3OW9lKXBLVndTTHNRcE1RcXlAWnZrQ0wlMTk/ZiVXU0pjYWtheE49Cit6b25rb085WnhjOFRfcylUayNQSFMyQFQ8MmRvPjYjZGs7fXBuNFRXKXlhQz5EalNBaD45YG5zd3xFKUIlVU9Aezg2fihgblN1aVRFc2dwCishMSFpO2IkIz97P2BgM29UbUs9O01xTT04KXZ6dilBbyl2eldGVEU9V2swVSZOQWlpQyl5eG9edEVnUF9ARWdBPm9hcWBuNTU9KClGVGZgCit5eD59cUMjLTRzcXRlWHhWfWI3bXw1YG5GVlY+N2dBWVNDeVVjNGYjOV9ldWRrbWt0JShsRVBlT15yT1JgSiV1PEM9NzdWdC1VKEooJHB4CisyQipBI2dxKTxCUCtwTD9UQFlVUlZ7VVdhVjFKb3lJOWYyY0UtJTxrUitmekBQXmkpeXp4ayohZCFBeFI4Si1BQmxjYiRPISQxVFNjYEpgCitTJFdGOClUMmk0RX13bF9abTJBOHkhKjIkKmNVOG5xdkpVQnw4aDxndDVreTVRIVhJPnZeTUpuRWI4V1lyJEh1TnpiVXZZbHg4IWZpWFpVCisqe2ljT2ohYmY+SC12Rjc8a3Bje3heOWE1UEpWKlkjRj5wfWYoc3tTKXNfWX0tRThqN0FaZVA2YXBXMTheTEhLKiVLaHAhU257elRqOUctCismYFNrbygjdmxAVE1zSFJjU3U7JHZvZUVyeWRQTTs2PEcpbUdlPlNrQXhRJGxtJCNKXkVqTEh0bT9SYWhnS1JTMUArdXExZEUyPFhHelh8CishdHZNSj9NNnlONT9oR0lUOU0rdmB1Wi1ZLUkqakNmV0ZWZjxfTGlMen1HTCU9YTQ+ZFlsQFVpdWBUN3NINXpQMTA9MFkkaiNJNF9sIUhxCis9IUVBYkhAT28/KylDRkZjUXJRV0pLVzZpMkBmP2ZzaGJ3Jj5ob1ooSjk0RmdEZS1EXzAhWW5jNkB0MTlWOWhrOVBxVERlOT0oZzx1aTFiCitrRmwqYGwzZFpwKG8rNitpKkAlZUZqYyV1PF84SGt+a2V9aytIdjYkejBpS2FZIW0zTkhPOFlMXkY4M3NzWilpJnBkMW8xb3BaPUFgZyZDCitjOWJvaztJaG59PFd9XlVfN0RjJSFvfVNDaDlJPUVnc0EqK2JQLU56Xms2T2xFSTNrMDIyVXVWIUU2NEN7WWA3VTZwb3duc3QhN2xPbjgoCitDTDFUNTVKdTFKSm5xbkNVRkVOUTNTXiFtXyYlfSF3Q2I0NExZOWlaN2FHI000MD8zRWRuMHl1bnN4eDVzZiYwR2gyc3l3SWxLdHdNQyU0CitNKj00SDs3WEFFcyNJY2NZSm0xcWdwWGNgOWsjKUhsajg9YHomQ0l0O2VHb0M/Ukd1Zl8kfGJuPjxrUThfelIyfWxZMX00Yl4hOExOS0JJCitiYmxZVzRKQyh1PzJYUy17LShjflp7czd5ZDxTcnRUPyRfSEg4bHJjQDxOTGxzWHBodXZeQUYpMk9AaUFVe1c8NjNZMHAqPiNWMUJJQ3s0Cittez5JTCprUlhHfSlIJU9FNFFlfVVyaXIkPlAzQW5BXzJYSzVpbzRHSVU8fVA7MkBWfj5sRlFvdz1icURqejEjYTh7ZGsqUWw/MlR1OU43CiteR0JyJUMrQ0ZSfFMwe0VwdHRrSSk0MEMyK0JxTXQrZVo7VT93Mj4rK1cxWDJWViZ5aDg3N2tqIVF1K3dPR3BpRWVAYUQ3XmhkeDReSTl0CiskMyVSUGs3NWFlfXVQdEE/Sj44MHJ+IU9IcCFuUj9QVXVRUDEzYHZ4Ri09aF9IbFghPzV4VFJDUjx5aVE8P0dVV0EhNTBoOTVXcVlGfk93CitIdVJYYlcqU1ltTHpENyFSNUAmPTxpSl5+UUpLc0szcVZWaCVLR1dmS2NpfXk3alc+WSNtZ1VZY0AkZXNwIXlDJXowRH4leXl3KEEqPkhsCitAZ09valdWdnhffWdWc2MjV2pJKHNJYDMqMGpyMWh2JVoqKSl2KG5qRHQyYE82TGImT2RfTmNMPWRJWk8wNExLQ2k4YXVuI2J4SjhxWCNuCitDbG5wfXxaZkBxKjljaT8mVFdoI2czWXtZayZ3VXkmRCpVVnQpan55V3U0KmBOKlApKjBEOFRVJmRzNTV5NCZ7UyR+TWRuXiZUQl9FZkwxCitwM3NTfFE4ZWMlWHVZZS1IN3ckKlFMfCVHKF9kO3lsYnJxWHB0RTBNfjF6azNiUkU9dDdpaWxmTD9qN2QoejAxWkhrUz9kVVVVR3VwR21tCispOHBkZiFNLWt7QHNjdDxKTHN0KTM9bnNoKCFyZFZAZTFyQkA9QHFlMUt+cmN1bisqQmp9eTFOdGZVLT99UF58SUNNMSVLQ1ZJXkZ3STBmCittYX5MPChKTSo9MjJneHFJRVZ2ezQkczM9KH1ObEBCSjUwKldDaDFZdWxIYm5kWTtffWR4MnhlZHwzQnx5P1ZFZlVmQEJxWncjNk9DeWFsCitQSEVXfSpyITJrRS1zNTspNnVGY1VicT0tYWFXZTByTkJBVHJwJD5ZRkxmb2AmPnxBUmVFYy02YygxN2hhQmhpdEVBaFF+VUczS0dVTmlLCitjNWpmUnNNTEF6bWdpZiM8SG5BYzI8dmFYdD4wS2I/YHo7fkZtbmRsdEE2SzhmI0R4YEAqZElBcn1He0ApJDZ1alNnQj5YQSE8KTgyXzMyCispd3xjZlpQNipMUDglaU9ZUF5LUlkxaFkrJi0rJi1ZKHV7TWpGcV4hKDx3KGN2OUZUUnQ+e1drYHBtb2UrZGNIR2hudHl+aEgtODJuNEIlCis4S24peCs2XzxyNldrZ1gyNEBTNmdyX0o+Qm5WcjBQWHVUPEwqVCstTFZlOC0paihkP3I/JX01YzNlP1Z2TyUtR0xXaC0qKGFvWmcoUDdDCituKUUhUlJwMnY2I2NsfFF2KzVJWnZRRXg4YEVgPzZRej9iXilTVl9OS2FNbDw8Wkw7OEJ4SSpBTkx3IXgwfE1AMmZYZXdtNn40fEBLQ0dsCit1Wkg9VmFLMitsIyMjTTwqUz82Wk8oTitiSGcmZj9Rdk8ra3pXTm47bXZkNmEqJjx4WDBFaCQ5WFdeOCFXQHFMailxKjhAMmF3JCo1VHspCisxbGhuSm9jPnh5NW1yPSE+bHNzcGA+VDEzZjMwKXokd1ZZI3UySm5tRG87PlB5ekFpV2JOKSFBSSkpZFRMSDhHSTsqWnV8QyMpYj9VI2NlCitLJj97TCZUSDN3aE41ZSZHfHU7Zl5wT1lmcyhxbkhjMSNaOF8waTNYRVhCRjE4ZWokIzhqN3hPR00pQGw+TVJYPSpOM2V+SSh5V0NHMlQmCis9JWQraz4rdmx0IyMyYl9pO2gkbStYUCpGYGFIZjxpJiRVNV5FSEkpMTZBdjhaI2s7JTtWfnpWV15gM0JoMyRJWkB3dkxxdG5rN3JFNzVFCitBS29ucD9tNUNQbHZ2WFNxUXYmdXpee0gyWWxsfiVeLUdWalVjTX1EUDZLV2tVI0V4bTZrZ0h3dX0rSDxXbW9SRHJtKyVFbzZ7MzdRbXd0CitMa2JmU3RWdnlVSUFPbCM/NTJeMXU1M0k0eUt6Y3MxNzZlc1VlIVFgTTZVM2ZgPDQwYismRlo9KytedH11eTYhNDhvJCpwKU5nTi09I1BTCitFWEF+WilzclZ1ekU7SWZ9VkghMm5CdG4jPENtKWZUcDlOWTE0UCpyWEtqNGs+aWAjQHZ7dzcxOCtlLThlOHxEJH18cE47KlJxNUVPbmNSCis5QmNoe0VzKiNrUTNlMlFnXi18RUNlWkBaRjA3TDM9KW80QmttTWFfNk44LT8lQSlfSnxwVj9gXlBBXmJhYHJEVmloUlRvbX19QTFTZEBNCitab1Z1KUNBcWJkZzx2TzdfXyZ8Pjx1c0I5c0ArTjlVeUt7WmJOKCNfTiN+PXhwUUJAJGJOaTs+XlAyJGNKZDU3KmxEY3h6TTZQdjhjKk15Cit4Z2ZSK1ZoNytHekw3Z2A8eFVQQj88cWsxLUhObH14Vl5ROCpoX3AqOzZJfHxQdGpia05CcDMjNXgpeTElV09UTWRNVFhSQTNmZl58Nkp6CitKVXFmY1ZNQDVoIyQlZWVFYiQrUGA+YkJSNjJSSFE2Py1IUWo/N01GSl9OdCludyRRb00kT0dfQSQ8VChAX0R+cjhJcEJqT2FsNmA9ViRWCitmcHFna35tUkF6bGhzb3NwPDMtSDZuJF5JY2hYb0xPQ3QoNVZGJGlaVUQlZCk0a0I2IVpAbnd4PiZjVyZVYis7PiNYUz5UM2ZJbjlEYWQwCisqcD1KN25hKD9FZUREd3V8bGs4JFh3UXspdH1QVj95by1hdytafClGdHM7RVFvSEQwMUlubWpyeH5OQHdQP0pEO2clUyl1RmdXcnpKK25HCit8aTY2JHBZQ3RDOWUlUWN2bFk5OGElb28tV292Rl8xRlVIODR2NCZMa3peQ1YySER4T2lNdUAoTXZGS0E4TlpOdWw4cEBkLX0tc1dVTlRPCityIyFnPE0wdyN9Png7YzI2cC1xTkRrLUkjK3B4RDBPRmhiMTtUanYlN3gpbThFMHM4UlZaY3g0WXNRSSlLLTl4eUo9WUwzS1hESXdxVXQzCis5JlJOR1ZDdzticF4jR0grSUUrPFJ0QFY3MSgmVF9QQn54NXkkd24lWnhwan1qXis2bSpxQWJiPDMrMDFsNURtfnF1c1JxaWV6RVhOSTRUCitJN2ZoSmlZOzt7TlU8WEEzb1U8KDdoKkdPJiF6SD1RZlBZYTZkO3tfdG0wcz9EUztKQXBidEFgbip4RSNNTlg4UUkjPTc3MT4hZlQhRHlMCit5VztHTXpsNlBqSn01X15nVU44UzcraD9DUFBPdTZOKVdtRl9GVFczUWBEWTJLcGdRPTtnPXFPeW0zSCY5SCpzcyRjfUcoP0x8MFcmTFZGCitfYjZxTVFaNCFmbkdLWEFrPHh3XjY9XyQpUVNseUQtQjYpc0k2ZmI2TGQ0ZCNCak9vSjlRcXE4QFBJfGNoYnt4U1d4e2FWek1sbzFfJDYjCitvSUQpe25AYl5sWUxzYDIqcHVneVZOMTIzcnM1dmY3SE9eM3FnN1p+ZzxzMH1ePn5zaGEtVSMhZ3dtMSQ3NndpO2pCRWx1WGteRThSYDUwCitNLTkkNH5eeG9gO1huZWg2c35DIV95IWwxIShtNUttOTV+WGR2bG1RREc0TDNyK1BifGlYa0BvLV8/WDsyJFhAemkqTlgjd2xeRVJmZmAkCitHNylyJWFVazghOWAmT2Y5IXExYDxsSnBIbCFuRXpVNCNhPDx7Z1JWPD52UWRCT1JrXzhPU1AkMVdTZG5EM2hvVSVlNTBzWkUxQU5rbzBuCitBUzMtJTZOKVV0VXhhUkM1WVpxSmdkblNBe1RpVFJLdjdxcipLaUBBRzJlZTByZCMheEooamd2SFJAc3sjcnpROygxfUg/KEd3bWdhPjZQCittT3Fid007eUttbGE7PWZuSGRWNHpXc3gkWDNwTHVySzBwYmpjdCNVWWd+I2ZjVXMqejdtUG9iWGkpPWpLa2JEb3hHQm5DKT1nVWBEV1B7CiswaGJWeHRsfCo0PCVmPCM8UzB7Rm1xKjVPP1B3c1cpa24lY1N+NkhsRm9weyReZEg5eUxFbmU3LWJkQ0ktUUdnU3Z+U3VHWF9XP0JQbC1UCiszWFU7N2sjYEVjIzBWdFYlVEFxM1c0TyFITjJRMXMkQDEqTnFyPEAxVG83dnhlKTZwMVZvYTBWaDZhd3tZTnBjfWRmPSlhfC08QS0tIXZ8CitjPENvVismT2lrYzJISml8c0YkUGd8PTVCelQ+XncjRE5jWC1ZY2BzZ01HSXYhQD5DbStDYiN0JXxHcitFfi0pUj4hYS0kPUEmUUlCU2A8CitoNjBUR3J+SkxtcFNCbjFhVk9oK1lvN2BYcHRZdWl+P0dTTi1uNkJRbEw4en5pO2grPjUhUVg4KjN6JmcxXk5ocXVTWW0tNiEzTnJHfVQ0CittemtKKFAwbFo5ejIjem10PH44O2d4N2hgcnZeOGRCamF5IShDQ18lMlE1fUUzVmpxY0V0dH5INUxJbi1sYndENmVHa2pEJU9+Q1RBenpgCitzOFZEdXVmJkdgMDNEbT1QU1A2ZUlRZFd9YmowJHxsbmo1cUIhUEg9Pm18U3NJWUJsY289RFRfMEZ9KWg5SU5XMFd4T2k9TjErbkBIPXhvCitWI3tMMi1lSFJPWktvb30mNnheXmpMTHZ4NHooNE8xZzBWZG9sIW91Nzs1VHo4Z3p1UT9nemh2UDI9UWhKTWZOZEJfend7SURPM3Y0OVM8CitlcDk7cGk2OyY5MW5QZ0N3OEc7JSt8RXsyUWwxUmJaaDxqTE81alBKWiRfXiR9STZMe3w7SXRBTW1fdmpZPkNMY0A0SCNTMXxTaz8qTjVnCitBVklucyh0XlVOPXR2NXIldjBEfH08STRMTT0mZXhjeDxpNiFIYGdFQFZabTJHJE54MXJNSWRNY0QqRHRpOUBeVHktPFZ5THdJMFYtTWNgCitxMzhpRW1acDBfK0pmYCZWTElrNiltQXRPZFJsQDNCN25OV0Z8eVMwNDJLMmopJjApPj9QUExPUSYzUUxMVj5HVyFLPHtPaUBEPzlAUylyCiswT1VCIzdSV0peZG41SjduX0BuX0tvSjRXSEFCb1RnMU1oVTRTeVded2c7JkteQnRvaD8hd3tXayk2RGpBYlNvcEFIMThFKH1qe25PJSM4CitoUT12IUJ6emk/LUduVkhMVXQyV2NZdj84NjZtSFBCc01NZD9pVDg8czNoSHQ/Iz9ueCNnbU5KXyYpbjAlbGojS145VlVRb1dneW0kMWVqCit6VEZLe3AyIX09TUMpZGt9MTFCOTZaLUUoZXo3bmFEdlViQzlqUWU8NTUpWk8zPShkNE5DRVFAIUAlVHA7O3pNT0R5TEspWmtpYmVGek1GCit+SEx4bS1DdUNTaWEmXldrS0tWc1pNc2l1JGteOWMkP0tyd1pyLTx+LUEqUCtnJitJKzwkZjkrSU1eNndgJilRIXwpaXVkUCQ2SipDVlVWCitQbikzI09EXnQydjltezc3fkkxaykmPyVrbzl6XlpIVXFHdEpqPzhEOTU5bWV3R09fODElZT91R3BldiRhQTxDN159S3JHWXJiQDE+YVVPCit4Qno8VWI3azloUn5MRyFgUCMlRCRWNTg2UEhJOWZhfXpmJXZyUDNaZHAkVzBAMCZWKioxQGYwVDY3ailuWjA0SDsmXk1ePFdBR01LeUVnCitHcURyI1QjWEs/fl9GTnpRSDFvI054YU1KZ2RscEZiYm1uNzs4Tnk5TSpeOGEzTWhgVFN0WkdKNV5tcEJhOGY8eFJINGJgaHQ0bW5IPWZACitPZnFtPVZCeXJqQkgkSWVRc1dkaH5jWVpfOUBwamk7YGRebjdRT2ZjdXF4WXo0ITxJa0pofEd4Ky15Pjg5dmk4RDV0JFFoSjlVVGNaRTlmCitKPH4wUjkwZ2VOJk97M3RxIUVIJW1LYkhHWFU4Mm9zUjU/bFRjaSpqTUtqJEh4KUcoV3xXYipQNTRzN28oZlNoRiFPJTRyd0lzaWF3WCphCit6YlN4RCFTMm9RcWJ6RnEzPGw9PDFWeHswdntVWHA1cFY2PXZtYkdqfSNFdiZneHpUNHFKfVg4elRTRSl6IUhWWG52Nmt1ZmJfRHpuSTBMCis/UWkmY1B8Nmg9PGZHQXB3VypTRiQ5ODIxUkFaYkU/OHNnNStiTlh2ZHc2Nj81V2dnYGFreTFNKFVZJWRLM2hDfkFiRnVEdWZ6PkUzUCktCiskQiY8IyliYDV8LVFraGN3JURCZiFrU15gd0dhVkkjOV9YKXlienhteWFGPjl9QmJ+RElhNXQzSzBVNGpOIWJWbmI8ZUBPQTBFPlVrT09uCittd2tlJXFWJGJ+X0FmVW9VSztiZyhfTTUkVGgpaTB0SExrYl57PndUXzhrJFdNOCVFd2R7Z2tTK1E9Sj14MW5feXQ7WXRtUi1KeEQjPy1OCitLU3FSSSYwZzN9P3NjSWtATHB6PSU+NlYhP0Q0Q1dudzJnb2Y3ezBrU28+Uk15OGdZfXA7JFVJbiREISNFT3dWNEZfUCtnSlNtdD9hcyU5CitZdlB5SkhNajFmcC0mZTl0d3t6MHduQWstVXRhS2ZpUGN4TEEhZlQmKWxBSyZWQVYrUjkzcnltMDZpPEhBRUdAQns7LUlWfkpRMXFzbmBDCitfWVgtWTkjQlNqTE5aeGVzV2MoND9yQlZfOCZjYlFeOTUmZFhYbyg0KXlAbkM+aEByfSt2bnRSUGU2MFcqYDV5Kz1ZWWNzZXRKUXhhY1VgCitfKFZCaX1yPFJ3N18qQTtIWmdebzxGQCF2ZFZwUDNkeUJaQ1olPyRRJTZhcT5DPkZLczJeKWZPdXEhWV9hZUIkcDc5NVJ9cDdxN34rcVdVCis3Yl5TeEs8dDRBTkE7aVdKYDFta1BNNFhFPzUrSCtPKHlfeD5eUHptdDc9S3dYQFR9MW8mQ3EtSVFfdFU9dHJHSD1ZQ3J0Vi1eJW57ajI0CitoSE0hJGt5NUZjZUVNMj1ZNjRscCNCayohQUQ/SjtadiQ3NmBrQ2s3NE0oKkdGZGApZW1nbkBuZigqa2wpanV2aU0kPXslcmY5PGNIcy0qCithTnE+azY1dzBreXZ6aDwmYStscy1KQjs2NXJpRD1zKGU9Wn1eUExjUEFFI3tnSTt8WTJPZFROJTk/QXEza1hTdz9WQjlfdzRSMldSTFltCitLYiRXYyZmNVNHYFdmfjxYN29lcWxKOHo2ZyFsPl5gdmQpdEBKSztjcDY4TnBKe0MyMm8kJnJAIXU8KlNGN1JgKjh9WW43OTYkSTIwQEhNCit+VH5xTWRCWHs8P2BJajZzVD56UFZNcTE4Qk95OTdQaVRgRnRhZWlFVFAwKzdnPiticDswKX5HMFJ4U29edGwzdXhuNlNhNFJzNm5ZaTBVCitqaHo9blFDTUR3bUIqcWc7fXlLUVh6bDdyMXBsajRmUSpDLXAmR3tDb2RvdyMzdnl1YSY/YylQTzRlfm93Jj1uOz1fPXN0cXlhdE5abk0qCis+IWUrQmE/eXFqUkhZcmZebl5jUW1XRzRNWl8pN1E3Vjl6M0U4cmFvMGI7YnM/ay13U19xYEJaPyYhU1h9Y1d4ajVpJDlIbElPbmM4X1FMCitAdz5sUTtgajNZMlhaayFOLUk3ej1UZGVKRTdrfUdGRXExLVhNOz11d0FPX2ZUaiRxR0MqYXIrU3cycXdTMEVlQ0JNdCFHVj9hbGN5fnM7CitXWT9oTD5VSkBFMEpWenNUdVU7cno9PUVjaH1MPFQ1WFc8bjFVRVpCYFJFfEwhPyhEWW5rTF5uRHlQN2VYcCE/e3ErPiEqcFZicG0wVylkCitSKigobWh4Uig5eG89SElXaVRYKCpAbnBMWmEpU1pXISRlTFN5IXteUmhsMzIpaURAMjghVT8xZkx4YHEmdFk7aWtYTjRXLUIkOVFNQTVPCitmZ2ZGfm44PDFVP0lme3stbWNuR3BUWnJIPFFyfDA3JjlQXzY/bGVxJDJzWTAmMVpmIUF1aXZrcmBIPT51YXhEckBkKWo2JDVzSzw0Xz5RCis2aD9vN1N+MUFvUGFqYEokUHt6LUV9QkF3bTtkNHltNkAqZHAqJFRjcit6Xzc8JTRJUDA7Rld3bHw8RkdRRnIxSUFBSm4zQVJocWJEIUM7CitWWHEmI3RGTE56Qy1IJFMrQ2p5UVVzPTctST1qV3VtaEBmWFl3bElNTURuaVYwUT52KjlFVH10JXFSMFdhVGlwZ0xkdj9DPUwyK0padnYlCisqKVg+VStLfjtCOztMUjMzOWVSflpxOXl4bEVXO2lHVys/K3tScGM/Y0JVcX5NYXc/VWQjaTs7X1o4VVNGYn5mPWllS1RCJmArPF55amRUCitycXVDZjBzUnJtJWB3NjAtaC1Ye1ElYnYjWk5+Z2pPUnBeXmItNEAwNCFvM2FnN24xZkJ7RCNDdVlDPTM1cXJpQWF4QXB9XnpJMDllY0dNCitBUjM5K2lyWnRTWjZPN3ltOylpM05QJDF3RUdDVHFrITdaS1NieThnYGVUTEQqOT02NnBDWDA5b309YjQoQWUpSEQ5WnY5PSg2QDYqJkhOCis5V2EwRTR7byFJNzg1WGdDNlh8NUhIeC17WiRqTyZMeUJWSmBVdkBgfWkoSTtBeVZpPWl8SmMyOWFwem5KdCZaYWFfblUzQD4+R2t0NVdiCitvSzxzUGh4fkdlMFo4PD11ZmhHbUVYVVJJRW5gajBKaERjSyhScUdhU00+SUFsaGFMV0UtZX15OF93V2tIVVYwKHZtfHkxeGxfNXZIP1BTCitMej4lWFg1dlBgMUteZmgjUztTWjV8biFiay1aPE10PXg3TE1GODI7KXsrISVFck0+cDVLVVlRV0NEY0sta3x0dmtNNGQ5X2w5SyNCIUdKCitaSVJ5fUhaI2BeMTwpMFJmdCVxJk0rdDZkMXlYXzt7RHBkUShWcH59RWhQUV5LZUZWYHkoeWlQIWd8OUUtJihLQW5nUmgzcEhZYjBrVTtfCitqUUF1c0AjZmdsM1kxe2VAc3B4Tkx2I2VFN2trY18/TV9EMnVoLWZ7LUcyPyFtfkMtNFNKM2JLakEwWjt0K2pTUF5MVExZZ1Rhb3d8dnpMCitRbkF8M0crKzYka2x7OSZTckZUbUQ+N0l5U2N2KX48PkMjbXh8NG84aTZ7OXRgUEF1dDFyZCh7P1hSPUxlXkRWa3xySVUrRC14T1N2WjdaCitFNEApSnM7VjMxfU9INHc7ZGR0U1o9V2RIQD03KWUjRFNPQF4pVypGPWMjNFZSLUJ7M1YhNn17KTRSJWRAV15CKz0obm9kO1Ywazw/bFEyCitwVlNZdypaTUo/S0BaPHkqU3cjJXc7c3ZnNnh5QS1YeTdkfj4mLUM5dj0rZm9qMSlAbE9xfU5YLURkaSVoWGZpQzlya3Y+WHQmNHVjbDNQCitSQX5aNz88N2xEVnlnQ0BmcmVqPytzck1Mem8kSHpeQGRJQ2t7MjU3VHJnV2o+IXVPR1FmJVBGbUFHZ15JeDVhcE5PKmRxcF57ViRiKHErCitaR2VNZk84SzVmJjM1NE5+amsqaTkod05uVSg4dzNuaylCPEJPMHdgSSZQI0ltX0dAMTEkSXdhVVR7eyV1LXZlOVRUTFZ8bSh3QVJFVU1kCitpcmBZe1NNKS1WNHklSX48a3gmYj5BbVBGeFlkNTZ8TmZlY3dmck9HKFJKeVZlYDw2RjZTWmh4eXBQP3dKamF2d1h4Z3lESU1PP0Y5e1lZCitQaDVKcT9RKF4rQCZsMHo3bCpOaFBiVnxQdXxrR1lSWT5CR2xoKH0raiVgO201O3g4RTdQZHZnNE1uUChSdC1MQkJwTXo7N31jVjslVEtQCis/fE1DPGpuU2Y9VzgxZj42ZjVMYENLU1dtZDlHS3VAP0hBcWpVK0B6Q280IyQqMWtXVjRLZF9ofERuflJkcH1Sdj5odVI+N1NCc0EkSF89Cit8S3tjSjhtSm5YOTV9bnREN1ViVTltRmQ/Q3BiREo8X0Y2bSg0TjVjM2lBdHhDQVZzTmlrYH1ydlpvIU89TG0wQCUwbHJQcXZzY1FhYSRnCis/MXorYlcrVyhtc2hMd0Y+K0J7KUJ1Pk9ATzdJZWZQQCp6VGY2SUl7VjREQ25xMmFyO2cleCtHUTNlTDNqVVNgUFNGVFdFKFZQO1lzQEo7CisjeDVvditeME1uK2wwbS1IQngrKnIxaCF1VFFIaSQmckgkbCNlYF9eNjRIe19rWmFkPjtKSkJtNzBDPT5rK0FuRSRoJXlaYCFlYFJ8ZXN8CitEVEhBYXQhfnMocUgyaXNveDR3N3dxbztyMUwlZkdOPDxWSnZgbE02dS0yZV9mMkFZY2QhPTR6NjtJJTB+dXR4eUcwM1JIel44Z2NoN0VyCitHa211O19KfjV9bGtFOVB8RD0jVGdgXi1xKzZjdVQ2IXtPdjJnJlhgKF9nKDhec2M9YGVnIXl3WHJDQipIKXs2MFA7IXJlcXstY1FCMHJnCis+MWkyZWIlIW00TS07WW1ydVFCclI0cFgwNk5kNTwhezcydkhNX19ybXtXTHkhS19gQTJmYXZ+Pj5FRHltOFFTc3h3YDA/REhVbEslRTtZCitKS0RnNm9tWEc4ZiNWa3RHYT9xXmNSX050ZSUtNT5peTtCV2R4aXxMMFUoKEhMQj1eaiVeN18wZktBdV5qNm14TWtOT09wNkVzdHNwKlVhCis2RCNsUHpPdi1PVlRvWT9sfnBNRXIkQD15aWNPXnZsbj5mMXdCPHtgU1M5UE8hJWVJQHRVVWNXTXBreVdDJWw2WC11IUNsaTt3UmY8QH1yCiswWGkwQWtEaVhZNl5Pc1hkbVA2JDNsV29XSWozV1VBSUxJNiZ2UnpyJD9rMHFAdUY1Zlpwa35Ua0N2Um0oeEkzQih9VzBfXnE5eSpKYWN1CitRTW5IMTYrKGJzeEtgdm52R0JBVUkzP3Rucl9vJGR4OVBlUHU0dzVNaE5HPGUmZitgazgke3cyOCR2al5TaCFiYzF6JGwxSCRBI3plVWxQCis9Z3E8dEtvSFdOS1V9X21jYC1ycCMmRWd5cmRlZT0wSnwwcHB6JW5LJHhZZTc4LSozLS0xek9iI1JpNDkoZG1vWmBCPzROT0E4RH00TzA0Cis3T3tPUyN0KSRlPS02Xm0zI1d9Rm9oZFJyZF91Ty1gS3pmTXchcHRTRGxjZzU2OFFaMjNST3xSek9haWItZVE4QXNUT2t7QEpqNSZfQWJNCitPbT9rJSU2UCl1JWsjcjFOI2FwaGJKdFNZVEx2O2whWjMhV1dYTCVhTil4JCNfX3ZhZ1FESilpbWxXMF5rOzZCNmZNMF4wMmIoWXIkU2cjCitNZSs4PiErMXtAWl4qdGErTEhWRkYmK154fTl8RHFgNiVjLUxKKXFJaWI4PzxtZ340JmY5b2tWXzJKKnBxRUsjS149aG08PjxrMClPV2J4CitYPDFHSDV8JWhfOzdMR05KNlQxKFclTjNVU1U8ZDgjKFNtSS10cG5ZeWo0Q2tlTTQtVnVvZmVDSzJoZU9aflhhd1pII1F2aSEqKUgpcHZQCis9Yl5hPFApQTR5OTU2cFhjRmgwWkM0SSlpeG1AayhrNmBAQ1haajhyYXE7SWRGcm5NUXF0PF9hcylXPFBYKkg+ak91cHpKTEhwaTxyRDswCitfQjFYWXJ+ZGc5KWJxej52MEF9KjNzVD1aMTxuZzY7TmxZMDVSPGRwQ1EkcDBjdzE7TWB+ZkJPLT03cCFNNDh4T3ZjMT9gWXNgSC07dkRXCis9TClsSjZgc0Rgcn5pNVcxOVg5VnBTR0YqJk5UbFo0LX1tcHQ9d0tvem1+RCgmRz1CZzBjSGoreCNoTGJ0OCt2Rz1keSYzPkh3JExrTDFSCitkMUhiS3x+ZGhLaSVSMHlOfUVgMitOb3s2Mz5lb2M1Q3wtU0l1e0dJa2Y2SE9mIUxebHFTI3ptelhKRWYpd2cpbldxV1hFVyUqQ1QpdzxvCitrRFhUKyg+I3tEX2lyPn5ZQENvenNfKU9rQzxifXROISpKcFImJG5YLXxRZXEjVilNdU9yM3liOFZIMF96IVR5OVJsQGx0cTNwVUVqfDl1Cis3blJRcko7KStLYy1zJmFjNzNhSHNWbHQ5R0s9LT1NU3c/YX40JGlUMVQ9Yy1sWktTQENhNzUwWGxhKjNpdyRARENSRUR7dCUzdlJYZkA0CitsfEc9QGBaYHhTKGVjM2Nia3Rsc1ZWYFM1UVRja0N9Ui0rKztMKHglZn4lT1FXKUVFWkVJP0QkK1B6P0tAYm5kWihEQTtaITRBIT5DUmFhCismN21BckpIY1BEYG0kRFIoNU9vQnlKVTFxP31gST5xZlpNUX05Y2VPO0B4JGhlfipLSlomalR6dSZNKHgyc0E3eEQ5ejlBJlZrI2BAYWVfCis4T1FpUz4lViFSSGx6QVZfZk9WS2ZmLVJiNkh+Zj9NTGc4dm1VKWhIcWFFS1l5fUtQUkJCbnFANkJ2azN3THpPWE1OJmwtSnBRMSFESkkmCisyYHtKU25YPEZZRD1nQmhHKUFQPysrVSRzUiYxd15kKH1Ka2RqMTtjIStAYGtrUSFgYnoySiNNcU8lSjtUK2drYFFQNSNhPzEoQD1uX1lYCisjcFlZP2hZPShHWmJIPX13Kjd7I2lPOUtRSDAwMDA4MFB+ZD1OM0FoMGolRVA+MEEmSUkwMzg0VDBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCCitzT2IxITNNYSYmVnBhQ3ZRektYMlNINDg/YlQzaWZXZXlXcX5aNzZDRjhNVFAqS2c2eDlNcUhNTXs8eCl9LUZadHx8e3s8KmVabGRfZS0rCitUTFMqQnRlRlc0ViZOO3hNSyoyPC04NGNmbVMxbWdYTEZAfFcqWjJWbDNgS34wKXNISGA0RjdRam8oNSZQaEJOMnJ2dE8ycEk+NG9hUj4kCispT2B9YkM+WXY1MWpQdXh3ZVYkbWM/fmMwWCVzZUxxQEFiV2F+ZStEVk9uP3skYDNQb3tfNGlJLT9KWTdKc3FpY1hTKytAK35KMGZeKXlPCitWakZUJGU2Ui1UTnohPjxUM2Ytb3diSVpHUlp2KVgoUnFBcE4kR2dQNmp0KUdEYmlySTtCX01gRnZVT3QtKGFUQHhGM1FoMz8mR2dUN2FiCitFSnp5IVhxMkRheEl5SyhfZGFyM25fJSF6KFJmOF55IW4wODxqajc2dz1MUDVBOVJDeUVndE4pXl8pNmwhR2BhakRPSnFsMVFHUUxYVz4qCis4JUA0I34wOSokTFBQZSlAc2NWeGB6akVDQXpyPmxZYiF3RztyOFoqcnBnQVdnUUZzOFJHI3ZCJDBnUi1SS1lVJWBeUCloPkA2YVdBSzJtCit0ZXk3RHJVeCNvUkNnMDA2eE8wMDE1VTAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85YloqNmQ0YlNganRvbTliJitBdDhrYHp1Q3BTCitoZm1MMSh5bTVfMGFhUGhpV1VLb35rTWBqdVhycCtpUTxvXjdveE0zNHZYeHkzTkhpPDJOc3BjQEwmQWU+VnFWT0ooWDZNNkJpPys2clRuCiskJU1IRWNoKDRkYTIhKkNSbykmVGNVKE8yU19WKURYRlk9MGFiSFNndGp8TGU3QE5ZcGRubyNyaHs5UW8hY0FrNEEwZm49YDx4Wk9xPSQ5Citlbm98XiVISDkqakNFJSlXaGVkdzskVyRtP3Ztb1RHP2ZDS2pDIz1gN3hJZjEmUHFeZ14rPiZ0VW4tdjNraEdGVHthdiFMWDJXVT93azN1Cis/eCorVzhuQCF0QlpBMiVpVTlsYFh4eDNzaG1Wfkg9aSNDc1pNayUyPE1vd3ZVT0BOPUc/V2goYGJMNHZJeS1zTzNJMmo3aCVOaER+NihzCitMZDFeTVRXZDwwe2pGSCU8eXdER0BIfU9qWGVCc35iM303cm9ZTUpDSHBgaSF5Xn5gWEMqSig9bldpTCp9KEs/Tmt9bTV9bWg0QzhedjdPCit8ZmtwNTg+aF5qKGhzMXt4dzZNWHJkWTh5O1VYISFPX1Iyc0Zhb0defi1ANTE2QXJSYzhJUmZEJllCTWd0YnBmNV9vTD5sdTg1T3RFRkImCistZnF5Nz87anFBYHluM0BDJEh6LTd8WEY+JEA1OzhNWDNaMTFkbTxxR25INSgqKyEqTm5JZDN2SCtHdEQ4emlAa2QzUEgtKWpJP2FHTmZ0CitmVm9jSlZpM2pQR0Q2bnlmV3VePm1QRnF1RlAtKUFOVHV4aSl3T191e0tMMmxOMV9RandIUGBqYnk/bD1KUlgxZSk3bjhOJU9YPklBdz9FCis9NUs0YElkUn1aKGBwekxpUTImPVVlTlBrUD1qYXB3PEtBbz9Ybz43IV9tLW0wc3g+eHhSUCloPkA2YVdBSzJtdGV5N0R2b1U1ek9CYjAwCisxWEwwMDE4VjAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85YloqT2E5V3BnZllkRUh5PGtLNCRSfDJ9XzNWfmhiTXBONTt7elRefVA/CitzaGtpYitYPUZJT0FJXjk3RSFldChvPnZCLTJlPSkmPT9CUTsmWDxseENkVTBFWkpga0hxZS0/eTljR3VkMTZiI1AhUS1RTVEkOD8kPWBJCitjaHxxaENsP28mbXpOaGB4QklUPil0I3pVZjVjOHdec1RzKXFQVk4rPnRMa1ZtVG1pfVdVY1A8dWokKCMzJXdOdylqdFI9fDJqejFvQlpPCishZTtzO044PT59SHQ5djdNeTR7TmhzcFUhLXFGZmVRP3VNR2orZz4+Pj03TjkwR1A8TXQtbUFSfiYrQSYyeT1vaENMMWdvaW1NP3N9VUZKCisjKnk2eV5YQnorcWlgfjd0YmY5aXtpVUxWJk4welBoJTJRM1NmND9UUCM/ekxXdD96cFJxTWBfbTN0Ymg7b05nOHBmV2hIbTJRTWR9eD8hCis/ZjVnZXNBRjY0QG1ZMl8pc0dRZyojfk1OfER3PnNCWG9TSHBnUC0xelJJRnd4a0hpP1N8XmZyWGNrWiY8I0lfVTsxK1ZhWV41WShNSXZHCitvbGIlelg3KUE3V1okal9OdjVJa09ONU9TSDJOOzM8PXltTlp4a1VvWS1naXNlfTBwT0Y9Y2cpVnJkans7alUwIyExUm5ZdkB4U2lSOFgkCitpaEY1eUx2KEdlTityIW9zOWZlTlFBd2IlU0IoXmgyaWIjU3p+WEd6dlM/NjJqTzx0OVVWVzRlJXFmWHYpJFIrYDchKWA+YSN8O2ZybFF8CitHS0h7aj0+UnZUUD9SJkQmMWFOPyZ5PjZUT21eMUlTbDh0Uko5Y1kkOSNveDhzWW4jO3lvVHJmb1B+YCUrSHNZZktxMjl9VzB9blUkO2JPCitVXkhJYkEkRXBhZG8rPjReP2JsWWlGXmIlK09zVTMoWUppRyUtSkJtWEFpeSg1JGk+MF9sZDRhbHRoVFh9IUo+K2lGbk4/XkxuKzxCP1gwCityZ3otbU0oTlJ6Mns4Ji0wQklIP0QyZTYwSU5se08jeyliQVJrNEphK2M5dSsoeVJ1Kl4qZnl2ZVdAVHQ1ej1VZU9YajVgJTY2IUYwcSEzCit0Qnh0VnQoMzJfSHxwUE0wbSRIen5WVzJNOD9tI09pNiVLc3k4c2ZjPGMtREoqYk4jIVRMdzRBflBmMnpXRyl0KT1GPiRUMDloMGxsNz4+CiteejU1OWxKXlUlSnBLVTtZfSglS1A7UGV0N3I0bDlXRVFQciVtb1cwcVd5fGlhVEp4UlhuTko3SHVQR19rNl44QUVNVFJ1P3BfWmlGT097CistdzJLWVFRJHo4PHU4JFY+anUtWGJjY1o8alBOXyQ8d2x8fUJRRUs0bTRzSGRvekx+QUpldFlwUTVkdSRZYiNGeVdVQWMhNDM/OEIleTRWCit+NDZMZW82Uzk3Rnh5MTN0aTd3flFHQmg2NHxHYytIaVJ5JjA7QHF9WEM+TEpxVmhyKEVzdlIycz9kcFJBMVB0bEsjIzA9aFIpRClUTSRhCitLYiZraVJIfnkxKTZaWkR5dk5RI0JxcG5KSD9zRz8kVEJpbUZPeWYwVzBTXyptNEBvWnpRP0xfd0s9dldyXllMK3NweEEwJWpqaitPJDs5CislNGFUe1JaaXh2ZmRUdEJidnZ0OVUkXzg8Xm5mNGBhUkUycDx3dVRaNFlzXm1iaVBlcVRzcj88azttTXdSdmNWeCp8K2RSaUxlZUo4PTAhCisxSG9Lckc2MldSQF5aeEVUJkd5diEwe2pfLVptMkJKTTh4IVk9bkJJK1pUdDlHWSlJSXxObioyTUMkKE4kdnMweWlQbCkxbSF9QVJyYjhXCitmS1N9cDx5bU53bip5V3l2S00jSDFBJDBsWF9WJE9AKGlwJVhhfGtHaFR+KkRsZzxsUT48I35SMURFant0VWxtNGBNT31qP2dJe1Z2IU8mCitTKkZOYnUhUVc1O2JNKTNJe08mPHxGUjUlcEoydjA+UXMpWnAkY21IJVN4M2lAdF4lXzdhdW9EWX4lcVg0Plc8aWB8YE5Qa2V5ckhBRzFfCitDcWtMZUIlPnQjMHF6ITV+b0FNfmgoR3o8NDFlb2V2bWQ7O0s7SVhCQitUeHk2UHRAdTExREpuQnZUS3kjM1l7TTc1QmJkYnR5YGdaZjcmCis8cHRJYW5qMX5UK3BjQkB2c1A0TSpIbyRCZ1NoJWlYSkZpU3o5Xjc5QlZOSHJeTnlUZWpgZzF4SztvdzNTa2tzQHR1fTJDQS1rSTBGNCN4CitwJUcpNFo/U0RVaDhNWE90bj5kKW85d2tFOHNONmtCOVI0bj43d3VUIWNrYT5ZfiNUNiM+MVdeZns3Nl87aWkxcmQkUSo/JHdGeVBkeE4pCiteO0h7Tm1EKzEmMCExaUtZOWtJYT85ZlNnazdwRi1NMjsxMkAwQ3lsbGleP0xFcipJSHlJTl92akt1Q2ZDNytkeTBjNVNDSWVqNGtLJlR5CitYWiV7fFcjPlg0N0w1ZUplUUkmR2JSfDNwIVBkajZvPllKZGFgbEJGb0M1Sn1WJWZWSWVTVFRaQVR4Z2I3V2p0RkBMbkVIMmRQfVMkO2h3CitIfl5uNkEkJXM8bVhEUHFIQ0t2Yj9nKUB1fXMke1V7eCZ5Vzw4O2NFTFoxVn5hVG1rcklxUzItaVF2aHoxdEA3NmphemtVWldVP0xoY3FACitycjJDSEdAQypgNktOdSZAJEZxSWR9dmNFXjclNlYhMTs3YCttX1peVGJHfjZ7OTk5ITg/WSpvR0g9QEt3Q1QpTEZkNztZPGZ6Vj8mZ007CituY3tsciF6O3Zqa3hrcWtgdmVCcUAlJGhpWC02WVpAbVRzRE0maSV1eFJqK0ZFdj1+KmkpNk17T2t4I3Q7PXRnfUZPfDF4PCp7cF45cD80Cit8dlo5YGozfUsoUTw/RldEKXZEeW0kPlBuPlVgMj8yMVlOa3JgalJOJVV3PiU1JitafG4xRnAyMFNnOTJ4PCZkLSsyKmlNWFdhWjQ7WlhZCitnKzIpK2cxZnxeVShre2tPKUhEeF9pKHJ0Xj1CJClOeUIqbDxCYlFySntKNU5hIz02SVU7YG8mQztTakNtRHtQb2JJNU1SVW9mSnEwWU4yCitOTz97fk9lU1ZsTTgwUyU2RHBQPWo0NldkbmRPPT1rYWhSKGFVX2hOeUt3YEFLdiRrIyp0RHlJQDR9ME1aN1JPcD4+QzglbDtyNT1UTCVZCisoUzc4b09iVk9GTSQwNEU3PzVJeUgyLT5GMz8hb3t5RX5QcTJtZX5ARkVhcDdBIURrIzdQPn5BUG9oIyFRd2dVOX5aTFZUWjU8JSNNZVZnCit8NndyMTlOVDslV3BiazYkWjNHOTlieCRfN2hsJE9rT28hTVl+cGNmXiZecU89d2wwNWNrUVE/NzYxV288c1ZmPVlIOWljZ2hiYDg/S1lJCisrei0hQz1vfFNhRntyMU5ucTkpcGE/ZV9Qb21lRXJ5aT8+YSEyc0NQV0toJl9Ga3pQPnQjbVdnXkkjb1ZgVlM+SlNZeiRDVkgme0RmbGpLCiswZWcrNH58Vzs7WFVZZylaMFI9IXtTYSFJPWl3bEg8MEhyU29hVEElUiFtZWcteUUhVl5yKHB1VjgpVyspdGhfOXA3KX45VU5saz5JPD5lCit0cEVCYHlsWEN6XyNSbF9tZjw3PGBJOEh1d3cqR00+Xk5tezU/QXhgLTFZQEk7YmNkQGo8Z05KVVhfTnQpe2ApJFd0UFgzVUg/T31uV0VLCit1MEIqciYrfG9sVnVtYEZ0IXI/Q3dZdkAmP0NaakJMV2dQcW4pQk9ifHFmRWRfMTVTUGk+MCV6cX4yMmdrTnwrNX03a0VkfC0mLVRuQE5DCit1bzg5T1Y2XzJsdiozNzM1PWpDK0ojcTFQRWFvfSVsYjhaNEtafTxVNmhGJEEpKT9YQGUyXmBkR2gyQlB1THVOWXl+QElGQWZKVmQzWENOCitIbj57c1B2YyF3ejBnKUVmTW92ZEBjeUw0SlJWQl5kakt7bCtHQmpCPWpIPGdCd2picWpRWHhzeSYzQ2RvJDdDPmtQKmMlRXRiIWZHYiYqCitAT2QrTGUjezA+b29fX0poKyF+b0pIMEQkbkptd1V2dXU+eiRDNVBPWVJpa35CO0g0JU9hM19pKStFTW8kVXByN04oXld1cWxwMnF4NGMoCitLdykocDxfN2EkVGw3Vm81ITxDd3w2cnlUWUJHemIjZkNLbDclSD5UfU92QEMwKnlYQ3sxfCpfeEU2PVdVRmVmMyE2YHs7OGRAdnBpYG8qCitYKyFDMnItfCNGPlpaN2hxPGd5WX0yIXRvbmJVRnBNPU5mWkliNT1mblIkdEhoTnNVQlhsZXlkSUgtbUJCI1opJnxgNU1CXnlBcFFGVUYyCis/JHwjN0ZrbzBxPyFuZk05bDVTaCtCfmZ1bWhuaEN1emgyTDtFY0BQX0tiNDU3TFF6emtUOEtKKy0jRipuPkx8VDt4KUt0cEJnYFp3P21GCis+Sz49YlJfK3Y+PFEmJChyWk8pbnVwMlFOe2NfYW9aMUFNKl5YeEokY2FPM3w8MDBmMEJgJFRUYUpRcHhoKT5FS284SztoY1ozbHpTWHV1CituNTkoYkgoazJQJiNKO3FTNjJze05oe1B6SSlxLWImVUteZ2ZrUXhuQ0I5aWNGXnFmelNfMSZXWER7JU9UeEhvMjZrM0dkOygwKW5EcDJfCitUXksoMSU8QjFIUnx2SWskS1IxckpOSC1seSplMC14fnhHPiljb1VnemV6SXpIRUohS3dhYHh8aGlSa3phfCFSWj5CVHhjfT4qR0BaR25VCitNTlpybFp5bjstcmRFdDNZS29eJjVkUTNvJHc7QWQoR0NqJlYyJVBTMXV6Zm4oO1FDdVhqO0khWlc9akNYS1dzakVjezlLbSpWKGB5LXl3Cit4a2VKWDtAKFJ1I1lyX0hETUgqblhveTlsZ3BhYiEjRm51PDEkKjFYU3JaWSUpI1R6OyEjaUlWTXVyMShTM2FUOUApS3M5czwrOXZiKFdaCis4cXttTDVtR3E3IWNzOXZoIyFAdmlRa3xhN2opZHo2e1k7fDgrRk9tc1pwVG9Tcmd7JkUoJHojZ1dVP3wyaDAlZzh0SWYqVCUqaStybWBrCitZUSM0OGF7Q0ZgZnVQUyYhUVE5KyQ9VT0+eTt4S2g1SXkmfF5GZj9UJVNgM3g3SiZJcXhiJng0bXExO1FuWSt8RUJCdkJhISR3aUtjMDRoCitFZk0jVXtFRTg2PzVGSEBMbGdpanxtZjkkRlhLPHk7MnszWlokRjF4Tml4dHw4WUZ7NG5JKyo8YiMwblpZV3VOaH5ufjd7P1NMXjFYfkBrCit9UkwjSl91fitEbGlpKEVRLVAtaChxbzZNanV2N1NsaTxxckQka2VSMDc1X3pjWmVBQmglc25qZERBYlh2cylnWC11R0RRXnp+MDZTVW5pCiskTiNKbG1nbE14UGV7fVhpTnpDezNjOCFRZGQlNCU/VGdLV2FkUCRNPkk9TDhCQHlVYnR+cjRLemhkTE5DcjVRS0ApeExtcl4wO2ghQiZ4Cit+bnN+SmYpa0Uqe09NOG1LMXZKe3w3NHIoc2NkRk5YNytwVEpiVT1VeWdQOEduTjs2KkFVQypKYml4NWtLTjlAczZyWkZlQHgjPmR3aVMrCitPfWhpYk9wdm13UiYwb2x5cSs2LXV6QUIhSlgmemRCISlKVF9AVHM/TT9Bcm0pTytVcCNDQzVeayVuWWE+aiNvZSokancwcGZEKUx0P28pCitUe2ZkMkJkaF9fR0NnMW04PX1neiFmNiY9QTV8XlJZPUk8Qy1ob2lia1Y2YUJPVitmbE5eT3ImVEA0dFdLKnUkN1YwY3BkS3ptKnRKN00zCitANGo4VHMpRVJxK3F6e09OTDFhSE1ldnlwfFBETiklPXpAZmJmdFkqOGd1eGtBaWZwTW1nRlZiRVc0OTg4ZVFxRm93QCktTzI0KWZYfThoCitjVndMMW99U0t3LWojPzxZKmJFPEtoWHsqQGc1akVBY2g5cDA1ZlIlZnBvIU44Q0luM2I8NmtyOCtTKFN5PHQrVGNYUTAxJiR6fmFsQENGCit+aGdqWkEzbCZHbSE1dCo+UVF4ITk1dEV4QE5aRFUzcmNgKmQ7Zk5rejdpTXRDbSNValVPMSR+REVnJDNTT1AqJWx3Y1I0fkhAI307SC1vCitYVD1PfUg2ZDBsYWpwUEEpXlJSXyZ6b19Oem9Zai03fVdiX0UlUCpYZSMxblhaTiR3Xmw2Nj9jO0lzZ2UpNSliN2FuaWtpOG5rbm5fO2U5Cis4fG4tU2olY2E/fmwwITAyUXt4UW8zUHc3fl9xZ3V2ZEB2cjdmfUFXV1Njczk3QFBPST01WWB7Xm9DaEJSWkt7ekNqSEd3PWtKRU5YLXhkCis+T2QwWFlRMSpPP1ZubE40SG1rJUZkR25zTW1uZ0RrQjgjSz1Pcj80KVN5KDA7djdxdUt3OVpjTzhrSXI3PEc4ViZ1OSVqZyV2flEoY00jCit8RDI7Y2Y5dTVGS0Q4XzExSzAqe2QtKz42Yk9qTSNAXk9kWFUtPkh8RF9jVFViaEB5YHNWdW1sYExec3BgNHUzMEhRYmxkdlckckZKcmd7CitDWlAzJXxxa3FMYChjN3lsYygoKkUyXnFwRnUlYmQtUVptNGN6OHFhZyg5KzstbUsjY003RzlgODh4TlVwZWkxNGw8WFRCU3AlPD9FaE5UCit0Mk5+YFRuaEVkaD9DZDtCOz0jO1pCcTk7YXtnTyljYFJ0ISgmciV1NWQje2B1cjN0aW57MXY1TT8rZFk9JE10JHY1ZTc5eFAwKEFTRXpoCismUl9lVFZQM1dOV2dlemVnUSo8KiRERWl+cTF8dmZrdmJzMGd7O1AtVmh1aGA2Ui1FWH0yfU0leSokcz9AMFNTKm1rT2FnWDxOOHZpPVZxCitkWHAzVUhPOGlTJkopXmpiaCZJdkV6JGkzblk1UXJ5cTdnN3Q/cS0mSSFmbShBQEdhIV9DQHc/YWk+TmNofFB7QjV1IyNyKDx8RyZ5Qkp0CitfVmVURF59KFh2UkJjWnEkQWdrR000cFktM3U8JEF5Pzd6dXk9T25sSzAtUmFjPV4pcDZUNSlQbmcyZSU5WUJ9T0BUR3lDP3d3PGNmMXhoCitFMSZ3Zn4yTSprd2FmRlZLVXdrQms1QWBhbSZvS3M4WlV5aE1lZXZuS3hSPUBjXzFGTH54YDk+YV8jYkdAemZGZlFgOHVMemhzTS0hX3khCitXMnU0WDhiVEA/V1NzX1V6fT4jTHV7KWk+Kl8qWHlmNGkkQT0rJX0lWGd8NDNee3FBQGo/VVUkP3FuU1loZXlGXyNHLTI5SnxnV0ltZUkzCit+dkpofSsqbGVBZCFRRDwqeEhReGBKd0hgWjBUa3huVjY0JDF4PGA5fmc/PExmfUZ0OClaZExDPD4yc2F0WWBAZ2dgTHZTamExSTtwV2NQCisyfEFPNTszcH54NjItUmF1KT5MYVFocHE0dVhANzQ5PHI5KXolRzBNTHk9U1hhPktwTEk8MEk7fmt7fjx+SFFTZ1JPLXVIKCY9WSVBc0hVCitmKWtFI3h7JHRqNVk0ejJ6WVJ5b1UpYWtDVjZLMmUoM0h0XjFIUExRcD80Uy1GMTF+WEZULTtyZ0t1aVp1U29RNUxjPz5IKDBIfXVRP25JCiteZFBLUmxIYWZaYztjRHJqWUhyZ3RjfGd4JShrUU4/NFZWSk8mQF8pKFF4WTQjQXNRdkZpSGFORVY1U3pJMiVXa05vfVAzMT4oUzlwanFgCitqakprJkZTV0cqMns3Y2deSjwhNFJjOzAobHo9STN8Um1VQlRQentJYE9fdEwrOzs5REpgMnFTKTNSZ3FSaSFjVUpUaUN9Zj00VnAqP3FhCityaiVvdXs/V0s0dWVlUzYxfmJDSEc/Qk00dzNGcHxtfldfKjhrRChhQz9LejFmYG5yKkAjMSt2I3xpKmRBRzU3RjJMRHFnaiEkRlh5IysmCitnJiNQO2ZWekk2TEF1SjVTaXNOZ3dWTmxvYWNMVFMyZGBqI2F+V1NxRUpGTlFvbj9SUDJDTj5vVmt9OFl6bEFfOEopTUNuUkVTbD9UPzNfCitRdTJRUVApaD5ANmFXQUsybXRleTdEdiheOTYpM1AwMDdrcTAwMUhZMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlkY3c9UjdiWkt2CitIYjFyYXNsfnpyMitBdDhrYCZhQ3doZF9xLShvMlYjOUA7ZFdXK3JKZmchVCU7VDROUGthYGgySDVCY3B+JChGJURxMis9UnlZSWRJbDs2CitQaClpcT5fMyVNTUZ2LSROcWYwODVAN1otYGZVazs1bURaWFNfVGNNOyRVSnBNPkdBKUZHTl53XnJWTSl0YEcrK3deZ0JEWntsTlJVX3duCislQmlrIXd7IVRDOzQkbVN8Rl4lVGdAZj9sNkw9WU5haUZuTkE7WHdOQElLZnNmMiFjYVM3V1J4KUVFJjI5N0ArPGdsTSEqSyVpQS1aWFM4CitldlRjT2FpTUdWKEZBS1RVOHtRaz5WX0tTfGYqYkF0PDdQTm5UUVpWNTZLNE5OcitMQTMhK1puOFIhKXFfREh1eitqbj07RUwmYHB8N2plCisrQ1F9I1N7PmM8OWt+Y3Jpcjt2azlAZkdaRm1KaSRxP3IzKHJsekZlOU1zfGBXPmxNX3UrYT9PTHFuZ3xzdmNhJTxJNTN6UlQ3N3R5X2NOCitzSUt7XyhnQ09NcUdAS3FfaVd+K1ZCPXZfPkhkdXJ9e0VyP2M5ZEA0YVEhdkE8KWc4KFJJPG56VEs5QV9AI1Nfb0IhTUdhclVfYWxaOzVBCitJVUlfXzduPiQ5JSY0bHVUel9DVz9TenxnWD5xbmVJc1ZRIVJeUjY9cSkzJHxsPjNoX35ebXJWbjwyZm05e2QjaDcwUGZ6I2ZLJV9UMWcpCit0UXNEclpqd01ZOStPMmBwSzJBcDVrTHJ5RkxvIWpHS3dvMjgqeWk/VzJ3e3thaFNpKG9nViRzTnlNazFWUlIpIXlvdWNNVyNKV3JCPSVfCitKT249dU9uNTlAJElFKDZhem1LWFMtVWctaD9RWFV6O0FzS2ljMz5EZUwjQWVuI0NVQzJyQVhObF9LSyVMcntKTVUwbDRWTDVzZmpSYnh1CitlPCNNbFFLPTBqYTFuPTtyal5NSmFBcHxAOFB1X3xSTXJ3VnRDVypyI3J3IzU0ZSkoKD8qJDhMakZYLUhPeHVycFlyaTlPPilge2Eqb3Y2Cis/eUVabkxRVipuUWZ9RChMMzcrYVE8Jmo5Z2o+Ykt0MlZvM1Y7MytHeFZuPGZPNF59IW55aE1VdDZQI2R4PWB3fUYrOFU/P3tAVjxGRUw4CisqRHFxfnpLLTJiOWBMaUcwd2IwdWw3SDtAeGNsZTkqRkltU1R4e3QrSHhJTWgoamc4TiZLdTFCTFBFWXo5YDlebGdjMm96NFBrbClKWXoyCitWJlUrVStWTjFZaDUqZmRGaFZWQnRjcWBITFd1SGIobV4ofns5QUpqRmNmemFESWJkfWNJcnB8YGpQITBrMWVITXFTY1hmPzhtMiN1cWV7CitUdEpDUXkqKU83QkFFKSV4QXxHLWFTZiE8e05KbiEyOXpfVnx5OzZIX2xqa1pTb143Jl9KbntCNzswYz1kdTAoUCloPkA2YVdBSzJtdGV5Cis3RHBGJHtrKTMtMDAxLXQwMDEyVDAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85Z1oqT2FKRV52OG1reF5eSEZjOFB6XkM9RX1YY2dgCitBNVBUVDtGYz9oT2Q9c2ckeXwlJWNiVj0ldnYzPlNrbDIrfXVLJTRlMXxLSSlaR0tUcWQ0dz1lQEVFbXcpVipjUEZqRXpQa3J0IVQrVkAqCis7aWJ1e2RJdW8mQV4hb1clOFpIPkBxYnJ2fXF1b1hoYTgtNVZBdXp+YEcobXdkdyFOOX03VCNVdDIhcjBAUGk8JSNaO1MmcVNfSXIoe1FQCitTWGt6aEZSWEw7NX1qQn0meFhWaCk4P0MqVkNmMzhvbylUQ2JucVU8dW8oKkYteEM9VTR6ZXlzZDVPT1UwOHc0fkNaVGBRPzl8VkxZUj5BCitTOEhKSUNlZHtfMVRAUHU9NSM+dyQoQnU4NV9mOXk7PzdCaEREZilsSiRqTipqb3slO1duJGhtLXZYNlNwYkFCJkFIXz5tYDt4JFQkaVNFCitPOHU9bThCTGJebExYNEZQP0JwJHIoaHxfOXk5X29zITRTU2w9IzhpX1pvS1UpVCFmMU5Rd2Y7aGlrakxpYjMxR0RrOyVBem4hUVBSQGB1CitGYj0+dDNyRD98TkkhJlg9NFJlcCRgajZkPjtsfVIhYENIenReZzVOIU5Cck5JMWA9fDByPW5ZcyVFQWxYej53VSM+ZnR2SGArZDcxYFU2CitsKTB8WFFSMDAwTzheT1k3eV4oeVc3PHskdDdfO0NPTDlzbUZVYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLdXNSV28mYVVhQ3l4PXtkCiszemttY1JTMnp9ZUZ5bUNCNmNiaHxtViU1SXZFdCN7aWJsUWBGeiVWaXs1Z2x5SW5zVT03YC1jSWp0enhNJXYwNyVOdCZkdUZ2Q2I1TiYyCitqSm8xZUZIdWMjfUFJaHM+PF42YXdnaGxlZiRKVjRoe3x2NC1hYmpfZzFQI0M3VVhmZyp4fnp8OHNDfmV3OFokbTJEdmJNJWtvIXNZRyluCisja1M1alg/LWlJaShsb2MhTHFhdyt2LU52OysrOVhMbWNGclpCO2tXeUN8UyNVWHt1ZVdvYVh1ZD9PREkpXilXSmNfbm5rNTRWan1YSyR3CitCTCNmJj03UmxfKlJATnpZPWY9clpSYjRDN0EoUUwwRXQmLXQ+SVNOKitmfiFuKHpiZUBEdFQ1YVMqcENyY2spSFBZVl49YStCUjNGKl5sCitTdlorfVF0eklxMFF4XyQrS145flkhe1dZeEBTaVEmcShvfGZeWDJCSlVFMTcxcG8obE5CeSl9aTxUdG5OWXRMeVlxcy0mJXBCRU5XP3RhCitEanA3UD5+QEQ9WnhFUU9JcWo4cS1JWHUqR3QqMFc5Uih2fkN2YnNAPyNDKD1oO1RsTlk4bGJXbX51SERpdEM9YXQ7ai1rQzEoZnE+NW9pCitLRCkoPmsxYjg0aTxlNStnWWBaRV9xdjVPJDhnVHp5NElNWGIwY29hOHgkWTFDR0pSdDxhcismWG9jWmUhc2VzbnsrRDklM1dJSSpAdCZPCitPfnYhOHchRF92JWFXO19KNWN9VUsoZXhJWHF2VkxPR19xMlVHVG9DV3g5YzQpb3VXZUoyT082RnNWen05SlJtPURBU0dQZU1rQ1hTXiQoCit5MSlpJl9MNnFoXjVrKF5gR1Ehc2FYbVNnS0w0QkVIIUJqTlc7IyVHPVVgPmw2UzNwZD5CfV8rOVI5LTZ2bHNFOFE3NVBmNHNoLUtOc3d4CisrN3UlYGtKMyR+VWUwVzRGYkAmeWJIT1BeUm0tZll2eFVsN3dMWjFoeVg/QXd5WXJyKmBKJFEkfk4+MSZEJG5UaVdNcE0qQW00Q2o8KnJXCitWYFYpMlVjcHJGQUJ1N3RSYVh3bUZid3ghe2cpMHshYEBDVCZgXks7WHtsZi1lVUxNPkJCX29KUHE7UkJJdnkhTDdMZ3Z6KXd5IXZ9bXNxCitAe3BPczVZP1pSYXo5YypuTH05ZkczcSswUWFoOG1lO1dCJC0lcHFGVjViKmUxNSlvZkJ4K0pPdzI3NzA0T2xSb3k/fWZgeTdlS0N5JCZxCis+IzhrPitNR0lWRHF4Y0pLJTIpLW4/flkjZnJ+RTg8ZmhjLWs0X3VkJmBud2I0Rl8kVzk4MztneW5PWlMhJXljNnlQJSlXZW0qO2cxd0I0CitGYz5kPH5gT0RZbWl8MFJuYz5UQTxgP0xSZTNGVkpZIX5eKjZecVlnVF5PeGBaeDw1UVJKdmJteiVHJTlWSz8jMEk9KnoqdSFLejQ9R012Citlcnc0ZHxPY15SX15uOU9MX2UrSGJ4b1NSJHYyN0RQUDhJQUB9UF5ASUopfilhWiFyPSM/amZ9KyFHIWslX2ZvP15zV0l+ZHx3MW16dW9zCitYWm9rfVo1VTxWa1JtUSUjKEQxVUREazFiP3htYEM2MSFMelVlJG9hV0tQJFF2fEN3XzkwZUY7K1hrMFI8clY1SVgobGZ+TnU+d2dWXm5RCisjMlc/cW5eJG53Rko+c2lZUThjdHBMWn1eOFNveEFZV317YjUmJikkcVVXQDtwbkN0NihpJktRQjdOaGMhcWlqSk9tQ0s5Mmx8OTx4MWw1CishWDhPQ3s0YVM/MDZTVVhAbWFUVW9WMCooMG8rezQ2MjI9WEdtJEMpaEdJfXVIVDtHPTQ0XyhZcl5palpFcjZXRzh7aUUhQENzWllDPTx7CislPWZTYmVjQztPVWVLYURpRlkqU0BpSG1BeUI1NXM9XiNMKXNHZkNYI0FHbHB9NUZ+KWJhd1EyLVF4U0p1WjhHdDxQd3hYc1FkMCkzYXhKCitiPmx7UVZTQXc8QzV2KkA0ZnlJMnJjVS1iSmM1YSYkI1phSWl7YVhsM34rUVVGe2dqK3duPzQ5eT5GPlZeMzNeT21SOS1Xbz4/MnQhJSteCitKOCFUQWJldz1lQVNCVTEyZ2krOzFIN2J5ZHBZUnZpaz1Bc0tDa3BaR2RxOGpUfjthLSZKRz14ZFQqNlc5VkowZV5kZWlRT0gqYn1xMnBXCitIUGt6UiYyKCtqSCQ+ZkNJM0RAdVVrMkJDXz4zYHkxQj1oTUA+WTxeIzRAIVBrelRfRlJKWDhIWVhLVVBrZX1hO3hRZFNaNEJJcDMoI1F5Cit7fjNWQzBpM1FlNSsxRH5KYUs2Yit4aFFsKFh4SVRBSEpmTVpkI2J0MXpKN1RGMyk2Xjk4VVpiLUQ0QHY+QUd1KDdyMXlEMGpDOXtxPUl8CittRDdKNFlaeC01MkBFQyRFOCk1e3c4TmRCTGFUPz1sYGZhJmZIfHw8UDBmN2Z6bE5OWk9jYCQhTCFNUjlfe2ozRytfd3A3VDNLPmdVXnRtCisyJG05IVktWn0ocytOOCZ8UU14YkcpTloycVBtfHd8XnBRZnYzSUtiUTYkRG41bVk7IyM1byExcD8jdXo4VjVxLXdNZkBHWWo/Tz1VNF98CitDeiNge31tJlBSMThneU0qbkVGPHp6amtmKzVRaTtLb3Q7MXt6JGs3JHQ5P2p9cXlLditIfGopYj05c2oyKTdyKkBVfGFZVEV7LSpjM0h4CitTZjlLKWxnfH5mLSFOQkRZMkFMdG1fVWlCPHpCaSYmQkVSY0NFcEpTKTtiTz5zOGFhPypLZ0IyVmx4ODgzR2JBfDk7MFFGV0IhcSs7THEoCitMKkc4ZD43bDtSWl9DVHRnRl9yWGJgM3VLaz1BdjNKQX0/UEZgUE5UejBYOCM7ey1MUUk1LUxROHRQbShOUV9JRlUkY0NoUXx+KGp4Rng3CitMVnYtR01IRDZ4Xmw2c3dOKHJkP1c2MGd7MHV4TV8jKDYjWktfZktaTWNCWU8zYn1DIzV1IzhkOU94IXsxRUI8e0BwJUx+WWBubT16RmpOCitne2M/bT1oOTJPbTdXRlNxMit5TnhPMWVFdishZHRTfkspOVA7QWJfd3s2Nih6YWYlI28yJG0kfTArYTI7UGEtNFY/Z3hibmc0bDQoeWJkCishVldyMilmY2lObWtkVkk7bTFGX3BRRCNpdmFpZEZuYjlsanAjJShiNWt7dnp6QmYwe099ODkzZiZARks2SlJRbVBNOWVyXmFQdjl2Mmg0CitfMWQkOSt8SVJCa21pfT0kR3U9MytaZ3h3d0FsUllMJkIqZk48SksrdmduLW1sQ0xmO19PZj5xP3lYayphN3pBUmYtJikjb0NBaylyMk4pCitBME0/dUtUM2ROaHFgaDY0KXheeGI0WEBUOD5XZWNYQ1VzSzEmdHQ+QEgyRUkpVzw4fUZHelZhPk5zMks5XiFsYiVoUlJ5VlFZMnExOFRFCitQaDNNUihVWVhqU1pAREQxNVEyaUlPQ2FafmUwN0MtaChkfTZGYiNSST5ZYzFMezJBJTNmXzM+QnlTNGE+QHFNXz56PVc2P3pYKldMeWhfCitjfld+QSlgT180dS1aSGZvR3Vzallye0FPNj9qT3JPM3ppVlg/cGpnJT1LJWlFczQtcS1wdFRRajVJVUohQmtmMFpEdE97fHEpX1M9Zjc/Cis1UHQ+OFQocUx+NkdaRmE9UCg4c04pZlRjaiU9Qmp9WnkoZkBTVj9pXlVlaih2Zj0lUUJ5ZDJiVm8zQSEtb3lqLWkycjVjZT5ISyluWUF7CitsR0pVZmRnUEJXbWRxK00xMlM7YVowQXJNMzdlRWI8KThGZjl6VTNye2NlK0hCUTY/QWNBRio5aWAxU21va1ZpMld2czRfYWE/Z2IxbVQ8CitJMkVqYDFkWTJAPjd9JHMwRGhtJSUhejtjXnJgWDhuc3x7QDE0U1VAWSNfLVQlOyt5SyZtLVdXUzUzMj5KJCM1aUY3aCZ8PmRTfGh2YXg8CitKNEkkQnxFakghaColQldDLWx3TXI9NVRqTEBGRmtzWDBjI2FYJkRFZnM1dlQkVF9HSCVwdjAmSmVrbD10UCkyJShVJklzPjZlMGx4TVNBCitQUHA+WSN9R05mdU1uIz8rTzNwTlchd31qa21uX0pwY01WbStGSHFScFFDUTI1ZllnWiNvKjN+XntscmFhbkZATih+USZFVTU9PHdVYCp1CitpfUZ5NkQwSE9TWF54PlVINVZBMlp6YDlPdl9mcGVVYmgtLSNkUzxWNkJ3JE1XXmU1O0EoSk5kaDglMH1ZMm55ZjJHTXc0bi0kLXshOUVNCit2WE5PcDl7eEpWPUxLJWpSN2ApKGlXajEpfk1RU2tHfjY0ckZZcmVPe3lUcSRpOTJPIXRPKFdaS3xhMz1iVlZ3dVB8KDlabTlVY0llQm5JCitZa2wkQF5jbTBmX3g5KzFyOU0zK296NmomcXg2YHctO1dQcU0yQDFrPldqb00zeCt4XilkcXV4ZkRtQkNkUns8RVAyIyRQJjxZQTVJQXBXCis2b1hIfigmMGRgS198Xno9OG5mfCFqb349JXtgKVBNYCpafjAqQWdHSEI7ZU4oYD48NXQqSik8dWtiKy1OZTlPeztVdVBKWU9BKjFVaD8jCitXPHY4JGJnYmd7S01UIXs2ZDtMQH5qP1F8TCpNaERwfnhvSH47QF9oa351JElGVSl0TD5iZFoxOTNwSHBEMFdiPDs2a0BTJVpJais/R01WCis2U0kwR2NDM0hEISpgS1pqO1ZsfT9vTm8zdn4oVik9aDBlWXlYYU5ucX0oK0BhcX5JJT1eQ1RQMkVZV0RFMTE0dCRHYHJ6YTxfSTNKZWg0CittVVdgc3hzakchZjNZUFIrelJ2S2xVNiYyOF5ScGQmKil7MXo/elNoY0pBX2lYaUg8OUNZdEV5YnBwUitlQHFBRW04NU9ee319QGJLK1ZKCit4VEM/UUJEKVQoSXxwMzRNazckfjtsZ0lDQ3twQGxBZE1Dc1J9VTl2QEwqS3hKSkMhSD8/VFhoRyoySUdCaHF8T1c9dVY4dWhhNTs/UVQlCiszR29NYm9eUnpsZ29BYjR9TEc4X2FUckpMJmsoLTY0JTt7NldOYjxUUEpNd35IYERNUE5uMk5ERGQ+OyZSWkB0Tzk9LTd6VSE4UkNuci1UCiskPClrcklpciYjfFNYezhZbT56XmE3a1JFZ2hMYFMzJDlWM2txeSlucmZLPl9aTG8/bG1WMnIjRzJYPX4jIXoqVUo2Z1ZsO2BBTHxnS29MCisoZHA8X0l8JjZNQ0clVWBteUVMeldxSXlzN0dJYnA1QVZmYXA9T2ZnbCozUlg5akxlfFVjYEYwMF9BO204VHVkd1RxOyNgS2k3JFY4ZkQrCitMMVBiYilzcWRmQVIlZFJnVyMtcDxRN0hTX3RlZW95WVB7MmMlUVlKa2hYNnI9c0lfRjdyIWgzS1QpYGMlbD1uVlpHakNCM3FZRGc/VihiCiskSCZ+TVlrcCpUbFJHPWpSNX1oYnBxbSk5MSpncEFHa2NDVEE3OTYoPEVmZl4/RjU0elR8WE1pQF97KHRsNkplNV4jR0ghJHYxUyRFSEFqCislRCR1ey1FJio4a3ZsWTRQeXV7Q3xiU0hKdFFYdV9HKVJhPjhiR20oaGtyOG1jbVFPN2whOzJ5PlZaU0lHcipxKlIwdklAeXJBYCVmSTtWCis7cTl3WjYjYSNnZSQzKDc4alhWU3NZKnQ+fEZZI1puZnIrc0AxaCRfWTc8ZysmYFJGNCM+TnRlS2QrWTN5UWR3NEMmNjBsbD5DaWpuck0jCitwKSQxenojK156YHUpY2g/KmJGUUlvUmBlKkd3SCZYV2ArTHJ7TnlEKEJIfEF6O3xCcylHWDcoKD5abz1rVyUxMiRGT3ZoI3tJbWlna0VWCit6SzJocl93USMxWEs3TEc/N2kzN2ZyUkNJLXIpdyNne0BoRTZYc2A4WitPN2xkVmJXP2g8Q1Bwcms/TDBkPkh6OCUmOUp1Ynp2P3xNdWl0CisqYXVXfjlSeDxSMnlKcClGeHFLSV9LMndobFpvUkFXKGR9ZUxKMWpASzBEfSo/O0ZfbztiWk9NPWUta3ApVkt2fiFSa3YyS1BafDM9NmdBCitHK3hLQDk+UjNCS1JlPHN9MHFUQGBQQnt3PDxYQGQkWnFRPHdjTH16IUMrRD4xeVBwP312PnFtZlArWC07ZHlPQitCJnshJUEwWihKQ3J4CitqdHgwZ2QzQThLR2tDJT5LaU9hMSF7X3ppYllaOVlYSjRuMFVpcFRvRFp6RGw9QisqVTJ7d0dgSEBFc3goJGUqZT45ZzVLUzwqYEt+K3VeCitsOT9AfWJoX1d6dF9RcVc9eXxjPzxvanJkNDckeVQoSGhwVyNWKjE3cz8wUWExUWZYbT1+bFVjNyMwbHdzYGVne3ltMUxMPCFTaFloQ1pTCisoISRZRmtCemYhdmBrSnA7JDxgdjxSMVVnKCl2M29GUUlpa3pVOW1pTS1XMzJqPFMyUDdQeWd1TD47JCpjX2VoTEtDNncxUWslR3krVVpHCitNdjtlbXNgalUreUw+JHQoVndGYihBU0kkN1h9YGhRMyR7bHo5dEBydC1RdGpmTj5jPHdVcW1WRVlFSlJOPHM+YFUlc2JodUtUaUUlKm5eCit4aGtqNi1ZZiZvR0ZKVEpCOT1OPmhGfVFYb18/SXQkJWx2MjxzPnpYc0E3MjFiXlJ7Ny1DTnF8UGVnUk8hRGFZVkNvWWVmPGdXZXNZYTwjCitDfFBTejlzPGstKl8hcE9HbSk3JC1sbHdObksoTzJxVXpmej1zWXQoZUd7M1E9M0xLcncqdVEyYn54bDBndD5HfDxUTHlMeFhjKDIoITRKCis2UX5Obm42PTs8QmVLOGVAPFpNcT83Kk9JYkFmZXdhNjQ7KkA9ey01Q3I2Y1hRJm5Da3Yze1BBRDYjbEByIXk9bjRpRVB9cDVoIUZjdWVDCit8TEtIejxANElfQVRTNFhYVn55XmdFfmBHbGc9bEohQW8rekxLa0o2T0JQbjNFblJ1PU9TS0khRiZZIyV+NC01dF9vYWtEKGJkYFE5d2h4Cit5bitHe3hQYGdAOzJFPUVTdlBxWnAqanJHeCZ0KWkkTyRyOHl0K2JgbXlKIXRhPGBqODVUb2A+MDVkfC1zdHh5dCpmYTg0PnNmWDg1QEwyCitJYm1PVDctPnBHR1JUU3xAVWp+bVFUS2lzYEFjYXBTZz9Dd3VvSV5HaEktdn1tVE1sVmBhO0RTTTB4WCpCLTVrISk0clA5UDQqMWE1aylGCitZbl5OWTRJLS1tOSZPLTY/ND9TQDZyWXpWUGtqPE01YUFaWlVqdGI3M2RvTldMTiRYRTFUc1d7PmJSNUMtYnh6P2dOZFdFOFQoPkNQYiM8CitkbyRmPllwV0N3ZiU5Z3VPWU8/d1MxPD5EeWgkS1QqJTw2UmdMJVo0QClXYCFIYzI+XlZrYCowTWV9a3FDa3V0QHhIJXcxPWV9aUp2aTU7CisrUyRKYVEhLUFMTThWXmFva1YpbnVKb1VwWURCKzZgRUt1WmozcGY8N3UrNDZKX1hUJHpaMkR2WT02ZXl2TG1oX3BeYHYrYFoleEM/M1E0CitlMCswcmI0PHg2SGQjTjVlOXtiQHBiVSZAaT8lREU8UmtHYyVnbXQxRyQ+LUcwYjQ/JHFHfVJlJD8yJUckd1RWIXJpQHpfTT1ycH4mJXhgCis3WG05NGQofUlrS0RCNGRoXmczdypBT343YzFPXy1AVk12Jm14czFuYkhqe0x1cWBaek13Mz91JWt3cD1iMGFoajBCfGUjbyhAQjNyPyNsCishUzVSTVFCY1Fte2FQSiU+MFRLXn5+RG0tQDFHIVgzSUshKkM0QHZkTSh1NTtKeXpLIXp6YDEwOGN1I0s1Z0prUlQ7WX5wYUppOD1kJlMmCitlKDw3bzl8WFZqdmVqbFluKlAmIWd5bVNgYjs1THN9NSZHQE0yU2xOfnJScGt7dz1ZN0VuMj5OcS1+YlQkQG4pPjx7NTRWWT4ke2YkSndsCit9PiU9VUUrMUY2fW53P2JLNFcpbSQkTGBLNTt6UjtULWxFbVcoXm5GTClvM3ZLWmlTYXszWUh2OEJjRjNWMTlzK0ktYV53Ynh1ditxPkV4CitLY0U0Nj81aWxNOH01TClmMCVgckh3diV5bVV0IUhfZVdePTAwJFVDTkZUTyUhPURIWExEaDFOJCo7NmkxYnpAQzNtdipyemdRJEtmcng4CitjKGlgTlIjNEY5OUVENGB2QDZFJDQheUN9e1AwV2k0Kz1MdE1NY2Rwc3lqTXd+QjsoIVkjOW1nN3czM2UrbFVWQSZATiNLX3psT3BzOTNJCitGN05MdXZqYj1TQlBAdURVN3gtRSRtRUtCOD1jcnBDU2dwQDVYYTtXUk9ONDMxUHhlUDN+KGdObDVFdkU+cERmI3l9UV5Id0ZYRUxORWQzCitYXlAkRFpOcU80P2phVX1ralIpTHFPTVhLZl9uUyRQWEFfKEVZdCRAaDc+U09LaGp4ZVRAdGE3b0xnTkNvZn5VPiQmWEE9aGlWUXIodUlQCitWcFdkR1YoakdyYGBpZndXUkNldXJecVpNOSs1NSleKk9iJCZfKDYjcz5Ve2M8LVgwWS1RPzR0ayslLT8/czkoUXRLRlcmaHIkUz52PzU8CitVfk1ZK1RzIU9ZQT8lTSpJbD1AeFh7RSNJS2ozfCFwczRtZVAteWg3IV5UO0JVV2BpVDM/ZUR3b2pyUiZrc14pU2V7MGdhd01iMShublVoCit9amRmczZvS3JlRFR+YzVSOU8pa0BxMU5zZW0yYzJMKyR3czhmWVVWNVZzdD5jblQoWG1lJXlzN088PENMIWE7R2JfdShCVzkkQnlUZXU7CitgMmVMNWszO3Z+KjwyOUFHY0w/PV5xPX1KMEgkMHFEXzJ+I0A3LTk4NHhgRz1ldjY1JGNpVUQwYzxTKXJHcVkhQSQwZmw4b1NFSERBcHR8Cis+Qz9JcUZSRyRheTVmRSFPbnE3SihmMFRJODU2YkwkcUZCeStiNjcjdztZb0R6S2l5cEJiPjF3ISlzKFpZMW1yQE9QNU5OYkRAUXVYbWxaCiswaihtKVpoWHojTWQ3Tll3OyZOVHc8R2JiVDw9YyhCQEtOSGhEJmptcDJHaERCaGQqZ2ohSWlsRkxNVmJNZyg2LXw1TG9rZE5iUksrbmVqCitXMSNRc0lQYVdpOylSI35XNjl+cUZoPmdkek1ATmo+NHJRaiVjYlFSI15BQzBefnRiczlqdGRIMio2PCVWNmBVc1kxTFAyIWI0fEVubW9wCis2cnEmKSRwcVZvbS1eVWE8KW1lT2clKTNKfjM+TVJjPnVpVDJBPihBSGlIQ3A+aWwpNj4qNjl0K142emI0bzZOKUlsQVNrblhCPXVUXm17CiswIWNlbGRmR3cwPz8wS2chWmQ0QE13a3g2cTVpdnBpYCEkK3JJNl9uPUhKPXhecDFaRmd9LUxHPVkrZF5nQTFkWkhYOSM1Y2lWVkk0PChLCisjSChObDxqQkpmJDF3bHVRNyYrdmc/I1k0Mz4pejxwK0trbCV4dWFzMWx0UFRDUE80WHZkWitfMjdKOSR+VGp0SjR1PW5ZbSF2RWhYcUJsCis7JWVoIVllXzExPHFQNFJnclBaQSR7OW14RFlfJnA3cipYRE9BdFBlK21VKCRwSTloR1EoYF91MHd3SzhpP1QpMkojUV91cGhxcCtoTXJ2CiszfStDIy1sZGYxPTJEOHk0JilTQiU9SFVrPyQ9YmpZdj1taXBMN0ZycUBCYiEhaH5rT1p+fmVlRE5EKnNHenEmSlVvTTFIQ3c4V0ZvI1R5CitpeV93eXlxLU8jVWF3ZHg9Xl5ZVlNCSitAcXhpQ2JwM1plRl5UQkN1YCNQRlV7OEJReXREWThsX0hLZHlmRTRsMHtFcHY1K3RISWNnUyhQCisjMyNoSklWb1dgejYxO3RidihxSXVXd31KJmhoWlZoNkJTbHlSQTdxLT8tdFpiPUd1UUk9cm04X0xzeE1vTHdnbUBKQDVTNmM7ZyhvVCN3CitZISl7OSo7NEdFUFgoQEhNZy1LTjMrN3ZsQGRebXZDN2NnUHd+Yk9iK0F+MztwYURZRllKZGdTK3NaISs7UG0yN2pzWCVhY3s/PU5Ien1ZCitsPFFIMyMxMVZiV2dLaFR6WGlENTIkeSNOJC12QDlVWlRFajhtaSskO2lRYHtXNFRXOXZ8UEFMNlFrN3R0LSowV1ZWQD9uVyVnJFBVJCU9CisqTnJwfmtmU0NoOTJjKDVvdSQqeTMtKWpHKWlxZz5ucXl+YGVvcTNfMz1+aVkhe0RNR1Z4eV8+QTZeTU0wSVchKD41REc4bjJkSG01N1dfCitASmE4OVBSckpBdVFmI2l+SHVgR3I0Q2dqbUkmaFhxe0whMWdNVl9eelhGYEtrKlh+ZWRSc0tXUCkmSjZIOTliSX1pdV81TzhwSWJ8b2RZCithJT04NmV4anR4Yj9eQGhmZVBNP14hdXpIVjs9e3dXVDQyRXdqUSFFUV87eEJsfmFXNWNlcEJ+KEU4I3lTWFRnQFhBJWF3aD1aMig4emVlCitBcTUoVXtsVyRmQlNLZyVSZGYxdEE1SWJCKnlkU2FgJkRibSRpaVUtd2whNXJkZVJwPE8jJD5LaHh0SGRSJlpxQEFCeUk/YH1wTjgtcStlCitOaDtNQVpnYUs3QCgyPT1IQlNgVkZwZ2AhTWw2bzMoYjJpJU5Qbn5admpfVmwmVk4tNWt2ZVJUMiQ7ajhROUljcGE5PFIra0tQS200a01VCituTX0+WEQ3UW5hTXR3JU42UTxxTmBvdktLQVF7OURGb05FQmZvfj1hRUxPS2o7R2U7LTVpKm1Ib3JVWmV3Qjc7Sy1jWEUoRT4hKnhJZSM/CitPST1wJCVhISUqTnBaIV4qOWh+R2lAZX53dGtfenopPmkmK3MhfXNXb3djeyo7I1FjPFpLaXlTJXJieG99PHUmXnIhUGNvamFvZUVzM0A2CitDfkRuUHlJVyZ3JjhESiEldGYkUCQkbU1HaUpnKFFXUz99WChieVJZIXZJYTVrQWNiRyhiZGJOTTdsPUtXYG9mb2BBSUBBcFNDRW55bD1ACitASmdKRkdKT1pZakM0LTIzcGhfMVFZV0pQd0p0dnE1QmdhZnNWeCtGNDlfKTJffig/JFZzenFwKn1rKGM3JUVIQTlgdEJgbDs3PDJWbEdlCisyKVg7PVNhTmdfPVRZTzEofkojdkRzZVJLPit4e1VjNm9BJGJ0fTBuMWJTdEp9cUA+bDwpJj07fVBScWUzT0wlX3U2UmI7SnNgK2tnYVB6CitvSEhAPkt5NTdoVlJRfUxjfiRwciY7dXtyP2cxVVgoUiZ+Rz9wd0piWGJzbFNTUSpeeTJEbTcyOW07JWdlSkIweDJFYHchNWNnPCFWIVkkCis/Wm99eVhwPkRmSigtWkowUW5UQGB6V2BZTU9+O1EqNm4lWVMkUVJlQzFBNj9DbU1DN185ODxSeTJHKi0kQENtdHJNfmZYVDxfTWtBWkdyCitKTyF5NDVGdVVYSXZsIyFGaHc2TEhoVVBONXpNc3hTTTtjI0x1IWFKUnMtI05EWkpEJVZLQXh4enwqZkBnQlpIRXJCaGdQMmYySDlxMnRvCis7dSNHeGdZYk1fKm9jZ0lafT08WWdCYj58fGxedlRqY0BhPk17azwkUXgrMjY2YFA1Ul9CV2I4dkpOYU99Zy0hWlg7MDBVPiYpQGElU0p6CitZeSZTJmtrdXhmK3RQUnY+KE80JntUdFJpZFhZTmdyQDYybkFrNXs/YmBgR1A8Pyp5PV9TckMzXjBHUTBzZEZfcjQzQ19YN3MoOFhvZC15CisjJE9NeTF8bStxKFJ+bV5LPEUmfGp0UmVJWUA2UkZzY1FmTDZYaWcxOVd8eEkwe3JkY0B1TkBsamhFcS1Rezd4YyNWLVM/PDkyX2pTRil8CitQQHFII2R3eSpkaG5uSSRjPVEreHU+Xk5xQFNtfllySk5Kd0c+MUphSnhVMWF1VVpHKDNuZVJmSjshSF4pPjstfVM7RWpwK2d9SCgjaShNCit1aEJ0aV5vSik9eD1wQTNLM21kR1NuTTJ3MlE9LWc0QUliNUdSQHdeKX0pcGFVPmIqVChJVX08TFBnXmNGbldPI3lNbX1AWXtaIz0mKj5gCit2UGVQeCNJM0s3OzUjaWF3I2RNQlU5XyVzb3xgITQoX34qN2xTRyk5T2ZNYlpAVmV7MEtsVDN5RTU+Q0p3RURlTWM2NXEjY1dWdWExbTl0Cit2R3dLQTZmUGRLNG8jMHcpbkNlIVF4flQpNjh8U20/QDUoNHZmTmw7bkMweCk7Q3Nja2pOU3RJeCVaMXtNV3owVjQtJmBqbHA3cEVTSzdQCitUYHMtNjhwbSE0ZWZgY3NNMm9sSCg2aHNBLUtlVU5WM2shSXM8IWFWJVBlcFooMHpxYUBkRCVOd354THgwaD5aTDBFXng9TCpKRykoSjBvCit9cT9naXR8Sll1O3llX0w3KnRTYilsZERwVTlwSWdFU30pNG0jI3pqaWZDdUkjJUpiIzJ3biR0cShKdWdkUl9DQk5RMVQ1JDJWNkl7NlZWCit1dng8XjJpeDh4ZkBfIU9wY3ZyYz1PTDJ6MX5zR0p3Mj4pJWd3K3pvQHlIQjVrdntRR09LJW5LNWpSP3MlcEZ9cDVNSW49YD5KcTg/LW1fCitKckgtSlMhK2V9UmttbjZhQDVIPUtVYkFISyk4SkE1aGFaQkRFYi1FRmYoX00reGRFeT4zMy13S1I+cztjWER0TTNIWj5qSU5kdFVNRD1MCisme28wQSZ7QnA5PWxfZnZiPzBmVz97MkJUcnkqTC1DeCljXz8qJkswPCp6R1ItPVdIZ0JwbSVOY3EwX0lfZ2MhUFQ2R1ViUTI0PVlBPllzCis2Pj5IfUdoWkohdWFmOEM4X2okMS1vdGlKPVhWKCp2T3I5bSpYc1UqMmlHQHJfamNIKTRwXyM8JDJ5PDlpQCZXTSpZe01YanlnPENLaT5ECitCNUJeaWJwTlRoZyZwSXReQitsanEmfGx9RSVMUT15NSZkZjlTaTdncjtAUEJfZGFnaDVHPD9NdnVNMmdYMThnQT9lfGBWdkhTeGw0ekNICithVDZtY2Z3Vi1FQnYrITx6OG42KFIpMGt7dzZ1YTJLZyNXQW9ecG84UGJyd049YkpqdDI+YiVxdyRoMko0I0M4MCgybHc/b2AoNSEhS28jCitxOEhZY3l+VG5eQEE/UDtmMnIwWS1BOFkwcyE7eSNjaDg5QWVDZEMmP0pJQGMtdEhrSEFwdGNGQjYmbG8pa3lYLWUjTis4ZlE+QX51NmU5CitKKEJIfExCez1qKVE0PDxSa0c1eklsJEBNWldCbkYjUHNBKmM7QVJ5XnlQdkdEJVArIVBVeztqKTIyZ3s4aEM5bk1mflZKdnFMfWBTMUwhCis5OUpvRDF0aEZwVUtRa3RBQWFIYSRqMF97JTBaVEFzNjFVVFhxMyhwcE9lNzlQbXQ8QyF+QGBWNEBTVkQ2SnEjdmNUNjEmYDlpb0dOTUo3CitKTS0oWGY2SGZhQWFyOCVVWURHXndRRW55bTd8XlZrWWp7Vzg9NXpMd3t9R0JXTi0tVVd0fHtybkNSMDw7bFp5aXZILXBPJElYaEpQZjFwCithZ0EyYj1YPiNudDM3dj9ZRz1VVSNmRFM2RnYySzZeMHl9VD5KeXVMbkY3YXlWUEMqOE5sIUpXJmt5PlE+YU1xbT9WcDRUIU4zcE5WNEIrCitPSFVYfC16V1NfWX1WX307O1Nxez9FV2tXV1BaLVNUZnZQUT5AfnpHP0ttX2Bed0g4fSZoYnJOcnxoTS1qcWpSX0doWUErKUtSenZFdHMjCit3I1IkN0BmaGxfbk5fYks1aFRwNDNMO1NwaEYlX2l8cDhNSkdKQ0xjbD5pP3Y9QH5jZE59ZU84JkUyK3BzWn01KF5nZVFCSG9+KClIckBCCitsZXk4VXlQVTwyVHxpTzdodGlSd257KyokdWoyanJqK0tlTFVaIzJKJG9Ce01zP3wpcVhaYzhoQS1ibXYlK3kkWlVEa1llPV9Qc0tFXld8CishVj1wK1o4Nyg8e2gzfiVzUCloPkA2YVdBSzJtdGV5N0RzKFN7d1J0WDAwNnBQMDAxQlcwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPCis5cldwaV9CWipGcmdhQ3otSz9RK3tWbEs9Ry0qaCFAJTx6KDhLbmNCXiU7I18kZyYlfUhBSUB7VTF5PStSTk5YWCl0QX5naFFNPkNhc21WCisxX2F2ZzsyMzFWQm8wYzRxNlVaZFg1U2kzQSF6ZXxNdlMyamJ3LWZrP19VRTNUKWFzaDA7JkBYMjhDKW1MOClEKjAwKlJqbmM9bUNETHVACitMJDFhRnR9UH1PMDNKWSQpKHMtPCF6UXFDMVA+TzlZbmVLUTZ7eWhPUjxpTl8qI20lTlgxNTBEcFIja3ZhVnJSWHJFTjJRZyUyb08zTHlrCitsV0hSM3Jkfn1EQEpJTUxqKEEkeGRRKD1sREFpekRtMX4lTXAySHc4b0QleGd0OVl7ayRveEt5WWd1UCZYPG5NJjFBWk9oODBPdDw1dndlCitqO2lIK1ZFOFFYfipQRk9EWkZxOGR3d1E9RlJWcGkpS0ZeWVJCQVAxeXZDSW5rdldZN3RaRXNxUD17XzA9YDAmRlk8NyRTRFcrXzNDQUx9CitZaz5ZNDVfdElIWCpuMX5DRm17V1RHTXxgeEYpd01KWSQ5ZzI3Z1VzemZ5NE9VIXR0OEF4cnVNPH12K3F5ZHl9WClUb0lPOWtJNkorWHkqCit6KClleC1xfDBIJWVKJTRPVy1eXjZgKU00Qmw7TTYjbWF4X3doOz9VKnAqOEBaamAjYCFHSWEzfjh2IygqalMwV0ZIUyZUYnsqKlV+N0c5Cit9fklwWHZsY0ZEJDdAS3ZBdkxLUnNvUiN6PEJ9Q3YtQzFxJCNweXRyPm15OGs/QzIlSmJZR0ZDN3xjREVOV1RRJiF6TCFVfStPNEheN1EyCisweStUfHpsbWwmOUNSVFE9JH4pakRWWlgkSTRoKUsyYmclMSlKQGdXXmZYclR5aWxARzg3PlheIUUjcGBaKSNZJVk1TDtvPmdAP1g4fXduCisybXlNIU8pXmdUViorZzgrZE0xbjh0U1hDezc2cEQtJGh1LT9vZH5ybW4+P0tAd3dxV2YrbCt1PVF7cmYxSENYanZKZ2BmTj5xWT9yKHNuCitXUVY9I0NpbVNxS09tVCFAV3U+NGY0Zll+UTdIfkRjPkQqWVE8aTNPbmFGME45K2w5RGE1SmdjfDtUeG9kal42S1IzZEAhKVRQZnQhP29YCitzeEp8TU5eN2leb1N0TX14cnQyRypSZWI7VV5RMj1nMSgmNj1pdGZUQT1AYT1ebHxCYzlfYXAjcyRoeyhtazN8NyV6akQ0emA9WWcxKlE2CitedXJySE8xbEBOTGglPU5LR0J6O0pkNTxaNUFnPColWkw8REBwSkdCWUJvJlI7TE5qZWYwYC1oVjZ9dDRfZXk+UylxVEBeZG9WOzZmdUZhCis0TiNCYlYmSFhMWjcwfSNFQUZ5OTdZb1QpMGY7M0s3c3d6UWc/O0FqO14lZ35eZCh6e244RT5HbXhXfStGdys1MytYYjY7d3R3KF5YYThVCit2PypCbDFOMVRhKGluOHtXQ1BwJjRqPk42M3ZnTE1jaFFuNFAzITVJbzhpOFNwTTI8UkMqQlhDfWM7M35pISNrIUVicnwwZDVzWXw/Z2t5CispX011R01WWEVgNENLIX08UjhsK0MmVX51VEdAcHZLRTwqZ0xaU1RUISVZRGNDKUJhOEhpczJ5X2Y9dz4yciRILXtgdXFkbkxUOCozKTFICitOeSYxalBAP1paUEJiSHlgJChWeCZqKUNsSVZ6azhnKVhUSTB9cWtzQU1nQ3I9JWFKK2U1YCoyJHBUOG1vSUtnMH4/MXF+aSMjNXtuWD8wCitxY21NJn15aUhwaGk0RkBfS09JVT9yNDc3R0I2Q1pqPTt2dDUjKzNNOHhzMl8rPCNqVmd1JHk0eVdTJWhmZm8kSUF+YjBzQUxRK0ZXc1I4CisqZE1UWWA4TSg8PjxGXjkpSiEhMmAxVzJ6cGN6Syh4TVE1aGB3dSZyb2NlVFJ5KSVVTzsre2l6KTlPO1ZxdVcxNlBULU9PZUs4MCMtb2ROCit2Vl4pbVY9aFNwWW1WcFZESVhFMVphVXd1NF5DY1FHd1pYcVghQnttPVYxNHwzb0dZKyE9cEJ8I2VUPDhxYyslajFTWXNWdVJTazRYV1RrCityO2VedmlfXmhvO3ZHcWpQeyRgTHl0RG1vZnFYSGVOK1hoY1R2NGJnK290fGo7I2FTZk8rbSRyZTV0WD9PMmYjQENDVW5fTDJrcSkzTVpsCit2NEBeZUp6IUpIOUVhWlFKb35tNFZ4aVhveGFwKGN7YmlNbXZ1KU8mdElZLUB2S2VZKTlqUHVXRll0bTFwODsrQ2tYXkBzNn5kbkYweHhLCitSSFhCc004eGVNV0N1PmsmYlkoPDQlaTAtcCV5N05xT1M7Wll4QC1uWmRFYDxTKE1HdyV6JHQmeEN6U1RuJWBIcykyfD9tQnxmZ1VSNFMoCit7WWhNKVdkQE96OzEycCRofX5OO3kxJXl5VU96WSh6PS1VLT93Q14qLSRsVD09X3RqJTchVkw3WDU/UC05MUNSclhkUW9TPClIXzdvUGpiCis2byR0fWA0QXZvMmE2QkY9aGhqdFZ1bUBAfEpYJFdvNEVhNFUoU2x1V2F2c15NIVdXeWUlellNTTxtY2RWaDcxUjtFVV9iIW1FKCl8IUBOCit2bDFVdmxUSEM9PDdSSG1BRmBBMGF0N3I+TXg0bV5MSCtGYj8+OHozK1M4JlpKWWtXK0Ute2klNVQ8bWRAI0E4eiZTSUsocWQzfDtIMFJ0CitSQTxKVWtyc1A+X058NUctRFhpNWlLO0YqZk5rRmdGfU5STVVxRmFYeFkmTF85fXxLMEJEZExRaip8ejtPYUhZRl4lZjxDcCtOcVI3V01nCitMVVdCbkdSMmQ4PUBKMi15d0EjaTB8VkIwfDY5I2tQMz9XTGB4dUhXNU82VFU1P1glZDJJPjVmQjU+RiQ1OC17eX5OPW0xUUBIc3g7I1grCistYypTazNpUioqN09JaXFzOylRRiFeNTsoTCZ6NEBkRD9BMTRnakEqKDJ7MntoJkVDUyROJVBecFp0Q3o/ail1dkZiKUo7ak4oTk1pbnRFCit4anNBPHExO2t7cSFZOzhia3VnVkxYKl9Xd0o7SmctSVM4RU9FPzhtRCFDdClgYWk9aSs/b3QtOzVkKjgzd0V7eUd4a1Nna1pZM1VsJjgjCitNbzReZCZQMzFEcz03bDFwZjVKPjV4X35BQGBjaWNPfT9wa1JPMTdlb28pWlN8I0E0RVRwa1BTNlUpU3l7WmwqeEotbURUbShzJFM9WilpCitPYT1kIVNnOTR9S3FnOCt7dXRpSypwOyVJTjElbHBLTFZuM1dXT2c+aUBaWHZHOFQ5bGtnX2RFVGM3dFpvfHFhQ1M4ZVhhQnFlSX5gTX4zCis0VVVFciFiazJtWTc7bW4rJF9paDtDOHt6RXZwM0FiP3Aja3RfT0kteUQ2ZFNrMXlIcy1KR1hZZ3xJNG4tY05Ed1M0SlBLdyp8ZUk+RiYkCitAJUdLLTY/JkhKS0JnNFJ2SC0+fipUO0krejt6c088RStFd2tzSDNxZXZUXiRmZmpOVi0pMTE7Mm8mUy1tfnN7bmU0SCFRTmImZCZOOGYoCitJc3hpcCZSdDt+NElPaXsxYiUjTjE8OTtpSSUmTEd9dUteUnkwI2xFTkh4Z2BSeXtjcVp8OW9nLWxmdypHcjRBbi1KP1N1UFhIfUA1MDErCitjejhVJGFQdlZ5M15pc25Rd3grfUNqPjxSLTZ3YTBTc1FXbj9zM04+KGRwPDJDbjBwSkoyJTNWRilodX1YOUl4c3FZN2lFZjA5bEczcFlZCitudGRTTGohdF95MklWJmczeFo4dSVDNSFUVlJhQzRhNVkqZWV5JWBpJTN2ei0zIXV2Y3c5X1AwN2gyNklsdUU4YC0zQjA3dkpOekBhdHFTCit0UHpRMGpWNTwpbT1BZWd+MzlDYyEyQWshQj5OZzBHM1R5SFFHfXYhQ1MhS2s4JXhRNTwkdmpGfDVVd1FWdEYxPDFgOVQoVS0qQGIrQTlQCitTJCt6Xmo2WFp4RkZ2TjEkKHhYVXV6QiNrVUcpUDRWZlQhQkpsOTImMFVsX3BmVk1DbyFyS0RnRi0xej1PeUVGcTA0Uj0pYEooUDdFODd7CitrLVFuPHtjenRvYG97aygzMT1EPjRmb1lYI2YyRkxsPiNUQCMlTmxgbXtabyUqNDF6WGxXMHM7WTI8d1NPZShKYF9JO1E0LS1QYjBfKjhqCitUPWJhYylDeTAwblQjeXtPeENqUiFhO08+WEsle0VmZWFldD4tN2BifjUwPDc9Z2RZMyZYOVh6e1M/PDtaZlBzaWYxX2hfNVJKZi0jbkMkCityJSYyUFpaOWhkP2RqPU47XyNmNShpfkxTaEViQU95NG4yPkxxU2lhWWQqTEhuU3l4RlBuKHRRMCUmZzN8allrJWI/VkIwemg2VFZ8PCVjCisjbUBDMnwmaDxmYVp2O3d6aCZgK2h2fC0qUjxDSHtuNl5TWGw5MklCTDV0UERIIzJaYnt7c1NRclJNeD9VP09ZNWFCNHQoUXowMzF4NyhmCitJKHorMEc+SW9MSiY/N1piI01iWnh6XytieilVfTI3aCl6Qy17aig7MCQtSSN2cFhCOEczR0d7MXVObDBgaygmfVBAKUkpQ0VVcFd0USp4CitDJldNfnZqUlZvd2pgeG1gdTtWSFJxZVp4IUI4SXMwY2dHPHhgPnd+d0BDPmV4UztyWjhBUl5pVjZZSzFIUmcrfkI+a196dl5mWUZtOC09Cit6TXQpOVZjaXlYfVZQe1pTM0dtVnpVaUI9SGF4QHJ7ZHpmbXk4NHUtUjAzJmx4ZUA2VnVGSjQ5b2R7dGhsVklvZyRTVj9LNVh4LWxhQ2FfCispKjxCQGc2bm9IdC1WNj16K0BvYEhBMSUmd2I/eG9KVFU2eGIwQTZnQCVMeU9DQDNSY18tZGkkTVphcSZYWStCU094OGNrdlF7LUNgMFI7Cis5NUFaLV58YCN5IW5xbUdzNj83QDBkKl8tZTh6QG10bFZQanlGOGstfiF7dUsjT1NYTWpJbllgeCtPRjFDS3ghNlA8VmhtNDw0QSNAY1ljCitBeDJiVTxlKGYxWHp3PX5eeF9ablNQNnxGI3otXiote1JOQDk7YSNzVzx9KzJvISZDfFRQaH5nTUNXYDBzbnd8PlBZX3k8TVNzJjdVU3g2CitlJmYjI0RnPG4yLURsaVppKVpXOz5jVzBVPTs+JF59I2pWOU1jLW91a0soWmYpe2JfVDhTSzhINilUZ1U8OTg3P3hRfHNifGt4OHV1QmZSCitKNUFJODJSPXdYSDM9RDxeUWVMV3BAKjlsRilNWHlrU1BBSXkjRTJ+cl4mRC1yQ0lqZEA/WV9ZeUNhT29YQGNReVAjM3YtXmpFJklwMXhlCitzcHRMSUhHOGVsek5oLSUqbjsmQkFANVFRIVZoeTgoRCYzdjI4KUpWU3FMM1lwayhHWCtic05OfUlXWDA4dH5TNHx0cXhNV3tsRmAofm9JCitwVXApdWpPPVZYOCFFaUdnQXk8Zl9ka1Mod1JNfnlFNXcteUE2MlBPKChWUi15JG4wcVhvfXhadTlHLUJlUDUlY1ElWGJ4PkI8bD9oUlFTCis0bUMtSjZFVzBZRHQ8KSo7RDMhKns3U29VXmVuRjhIR05+eGVBeFFVTHYrV3ZwSXBqMUFzRDZyMkVUSkdmWndjfGFKemZrMmx+Wl8pKCp+CitRUyZgTVY4NXpMdyliUnRSOylGRShMRG0tR3hDSThkYEsxKnJuNF5XWFFNUWJlbD8hR3t7NDw/diN0PXtTbXVHWUNxRnZyaF4+czRhd0A+Cit3I1hZKkZhbFd1STRkciVoVHJwXksyYkFCc01lRHwoeUhhVHM9d3BEZE5RJjw2ZnlXYiokYERwTFE3aUFwMyNvVUBwQnY0YDJXbTR1UTZACitoall1LWFOeyVGZXEkZWp5ZWVQUWBGcG1lQ0B2cnIkak5gcE5McVNkKllaZkFXaCs1WGA9ezZSc1RzMnhxc0xKNmhwKDRvK1FmLTIwVF5vCitxNH4kRXVAMFNLUU09QyVRPHRiQWRFZmlmNXs/ZkdzZlhmXnV1NWs3O1dMRU9vcitSKyFxJWJuMFJwMmtyUUM+SE94MW9QQU59SGtWSWxaCitRQEJiTiloPmNBTmV0V2NsRylrUiphKURvJjtrXlNsNl5wekZVNmx3M202dmRocm8mZ0FtQzFVMkxMSiFoOUd6SiN9PDhqYFlRZ0l0KCZ6CitkbilPMGYtWSZBKVAkSCs0YjdAUW9OanNSVEJnQT5PJmFoMCZrfWxsKm9De2x7Tk5IPV9BeChwY2RJfTY/eXJhPDQhdktlUTtMPyZ4cWA1Citsb159cU43d0JBKEBHRWFtcDVHOWh2cGV9KTcwMjNsPHMpfVE1aCRMeWxmV21Ue2JKUXRFQTBAVW4/WXBmWjRDVWpNdTJrI2lefG5lP0poCitnXypCPCh0RnAzTnM+KGJPKEhFZVYodTwqaytaKz9MISV3JlEkbWl3I2pKbDEyPktNbGJLVXVpQUY+JU9fWGR0PEg1ZXJqNndhd1dnYClKCithKzRVTjheQU11cylFQEdeWD54PH5mejBxdygoNnleV29UekExbztTaT5OeE80OHF5ISQ8fXRuYWNxKUBKSV5XQjNqRWU3SmhnYGBnPn15CituQkoxdFFCUXM1KmZxKH1NT0xqJUhiZENicE0yQEh7JTgmT0xfNytyVlZHI3tNbjg1ayhYIT94VGYwTlF7OCQmdUdOPzlKSWRVOVNLWn5jCitxMTJGQmJ4fjszWVAhdzRyMlQlZnZZakx1Z1JyZTBLYkZxcSpFb3J5bGJlKlAybUY7c2RPcjRARzYkTGJDM3V9UHxqPmc9SFBOJF5uNE8lCispdj18RT5MIUt3M1puPHc+NTI3KjNwU0pOTT13Jkc8JVB4QXleNndsJl9ANSZPaVA4RHhqNGJ7VGJge3ohZnJwPWYzJGJBcXI/dzlkeUtMCiszR3VNSFAzbmJXX0A9bip+SWh3WG5UdmRxNGZ7enZ9Mz4oUmt1MXFwP3tPUms1fFJ4fEZyNl81dH02M1daNWVqVm5gYmpHOTA/WUVMX0toCis5M0N5OXMjPUQpdTNxSUlFRnIrYHg5a2UtbXVOWEsqSztmOVBQTDxgTDdVPG17fmRZY1MpbVd2cTEmdXJ7LWFfVmBwVWw8dWMycXZhaml2CistdkZJQWB5UE16dVlYaSFWUEU0OXxGdzQ1azkjV0BCVXtucHk4Qil3WVJeZjVWMEctWT9IR1Z4UEYoamM9I0YjPUlfbT1oaE9qe2cmNXAtCitEKCs4X1lfeFFNe15mdDEhbiNRU2lwdG0mRioxKzRqYUo0eThuYClRWj9pdncoNWhoWDNlYEhBRktRK3RwcEU3cyYmakA0d3F5N1RXYU15CitfSEtFM1E/Y1I8RlJ8NGVVO2A0OURPU0ZpfE1RKShYKGVeUmFWPVNeU04kaz88bykkPyQ5YkNIczl2KFFaT1gkd1YlMn5XKjhGam1JbDNKCitubGJhJXZLI29RTEpEPjVmU1hvaStedSVZWjFwe0EpVGgoQGUjdkJ1X29nJDZnIylpTiUoMy1mYjJAWj1PPnE8PWE2SF9SSzg4OEZZcTUqCisxWFRhaDtjSjJSVkBUb288TSRYRmt9TzdGbnNXdkt7dSgmVThgQT1lPTEoSUlUYWRLYHg5UntuM21NZVYySEZmbVN9U3h6aFdwN3wyP2FrCismeGhDcVE7eCRhd0xad1I4K3BLa3ROR2tGSDg0U24jc1JvNDVrIVYqSGhDR1JvdzNRTHg8Z31qcl9KZGtwan4zVWtxSHhrWntBcHhOaiFYCis+VUJrSyNQci10TktTP3d8RDRuc2l7Xz0pPFFRbkVYI0VxTyUre0dhTWhPdzJiSz1+TlZjNUVkRyRgWFQoPitGX1MkTXU/RzM5RSNGbk5DCitXTDx+blJMQmNwPkpgPl55SUBmNEd+aGpEc351M2oycDhRdWZeUENjOD8jKjdrWU4lZUxrK1pFQlVJNFUqa0FsWDtaOXMofTtqMHxkUi0xCitoMEQ4aERAJWdoZzVBOVdCR1VlaXRZMFBuITh5RiR1SHw0Y1NVfkwpQCtTdW9xVGV1R2NXZHhSIVc0dWU+WGU8LUQ0cXp7WFI4Q28pa2tpCitSXnElMzd2VVlPeFBCQUx1VikpaGBSWmw0ekprRWpYallAb3dCZVA9dFB7SiUpV2N+YHVXUTxmcllxS0J+Uk9EM3d2Tz1EPVA+JTlSOEJqCitAcjBvdXYjTU1xZDQ/KlM9N0d7R00kdHlEJE5tKH5tKk5VfVdnPHA0TDQ2fikhIWR4JERuR1Z5TEk3USoqRDA5Z0gocDNfM1k0bjMrVTZvCitHdmYlPDc7fEJNKnl0V2M+cj9ib1pjZkVjbnlmUio5KjkoVDFKTiNlRmVCd1V9KVZsc0p5elk5d0hrcWl1XnpfdzEwe05TSnFxSUt2NXw9Cit7R1dSTCVkUEsmOFAzaUFRKi07RilPZWF0V3p3VEk1bEs/cmhjb3pUbTslfFY9cCEqYSM4SiVYeiVvM3l5XzJfUj9rVVVYTmFaV2h3YkM+Cis1ISRGMlgjbUh7PygmSnVwU1JNTi0yK1MzJGVyTiEkS1ktLXZBdTlrMUFSKm5eVFVUc3xJVWEoWntTO3s0KHkrSjdiWXAzd0hfUVF6XldPCitMOU17eTBAKWUrfnRBcGJ+fUhTJi1qLXxmNjtUQmlaQCMyMj45NmBKTHA0fV5TUGVnZTJ4YyFyUGByNEctOTMyO3xgVDNXUCY9dWt4dDRuCitRJlM7dmhgMUtEdFFnaCgoZmo3QCklbHkobTtYU3FnSk8tN0ohblNOZFZkXmFOJk1kcmc3cGNyeSU/ckwwPXY8PkRWMylvK1N0QzBhekJUCiszSXp7aypoNGVpVS0tUDJtQHtlc0M1ZTZ+Y0Z6dlN3ezV9dXl3YDg0T0hsUn16RXshU2MjeHkyQnFuQTBGVUEqeGJoSXNlKSNTZWRiPmI+CitoRFVMVkVxV3wrVEBXK3p2dEZhQU5iLTtgPklRYlZgVDVINkx1KUYmektXJDIhdHkqI0AqYCtzNVRkVTQwPStoZSVNQmxoK29fbzIrKkJvCitwazNNREF1OT8qT0dYSlUxdSlJNWZoYjhFKjs3ZSVBUlIpbHxCaUhPfXdpdClranoyTjw2Z3NfNThkVE9OWGF2NmlHdm4/Jmw9MTZSSXcxCitDdCZueipjV0xXZys4ejlaWjNrVExyU1dnQVVKYShafUEjWkU+MWc0Jj1wTT1lVXY5OXVZdktIZ3RaSDMmIUlsJD8mV0ljc0U7Pzw9OH4oCis5cC14PWVyV0s5cXhkPztlTSR6Vkhac0F8NnxzITc5NyNmX3Njb09gJlpjRlRmRVIqWU8rSjRBQ29KLXpzPzU+dyZ0KmVnUCE/dlkwUiRCCitkb3V3eCRuY1Q8fSVSZjJOYiQ4Jip3R1p2TjtMTTdFVE40b012XnBUOEk4RlZ7S2VyYFRXT0NZfjJQam85PyhDYHk+aCt4NUEtbCE4YlpMCityQEh0KHBqMXtDaEhIay1DJjlvbz1zMjF+bHhCKUJEbndueG0zWExQNjJsRXUqaTQ3XzMoUT91ISYrPFpQTHYyfDZ0NlAweXA4RWFkYSs9CisjY349QzBgbiQocTh3JDRaeHxwdTlJdUQkcVJFZ3JRMWRVMUpqTHNydU9xeXZjeDQ1TW81NWU5WUZBY15uJmlYTzR9dk9OKiZ1JVVyYj1ICitGWip5Y2NaO1lreWFeVjR2RlcqJCVuM3piPlVvPEFpelRBQGRoZ2pYYDI0RCFkYlRpTVckRUpSSyk9PSF5VT9RZ3t8V3YrY2RlWl5ZQHNkCitxS2xCNmQtOXdjYXdhOyhDOGB+M2Q4QEJSM0BafXdQX01iViMzXzhgUFApUVBuK25jRm5ybHc1ZEh7PmRfI2hWKm02JjgpVTZ2am9FZCgzCis3RnNkQykxZlAyeWJtTD1mZGsocVg2TiYqNF5oUWVQTzlmYkxROVNLY0lqc1ZRTjM5a0xGOUU5aHRhbV9kP0JZfmQ7bFh1WFNKKD11eS0/Cis7b1ZiNFYpalFfIVFhdWZ4Zm9fT3pfV1YmMjYlT3gycHo3biZkUX0tRT53dnU0Ul5mO2IlPV9Me3sxbl5xTFQ0OU1kMEpPKWwjI1NiQGY1Cis5eTdifm9jPjFZfnBzU1BDelFGZShUOUhDd3xEQjlaIT00ayFvKTclSWZ6V1NNZ2xQdj5HSFo4LUg3TllHRGpXXn1XVXQlSjVGc3ExKlRkCitsUnxBX0J2WGt1cl5jUTR1SXVFblo3JGptMX0jJnA5Jm5qQTdhfFBOdlBiezdLREsoTjJFcCRjM152Q19VbT4rWUlqU0Elbj1yXkF2QyRpCisoSGZtRGNSVHR3eGpBNkUqVHxWcSZsd3M1NU5mV01Bbjk2UV5nIz80ejVhMURNRHt7RE1WfHBJIWhacm1NZHkrU1U0RVA/LXVyeyQrOSUhCitQZGliI2clY0R8N2RQOzFjRlY2biQtUHpeVTw7LXF0NEgwSkAyPDwwP2EwKmomZC1vS2xWWnw9O2hJUn5rSGFHa05wTyVxNU43IV87ail2CitkTWFEQV5nWiF6SGFGJXJgMihDYWQ3elh6U3JjMEt3flk9MUZmIXFtIzJiP3Y5RWoyaDJxRHN+K3g9amRUZClBOzBWTHMmMXozVihQOTh3CithcVY4LTwoTkt7MnE2U1VJRmFjNXxoaVdDYyZaV0ZJR3slaDxadHd4SE13UFJPY3d4ZShwVUcjYX1YTkhONlRPVFkrK3ZBSXlUPClxZ29TCityU21vO0QtUnVPYi1yUSV1eyZiVThGbnU+VUcmeWBePzhCYDNlfFotMC0wcWVrQzN7d0BlfDl4bzleaTBZPGZuJiM0eF8xJkRIdG05a0I7CithJkpIbHYzVDNYOGxSTDFfMDRVIVdTRmF8P0otJTg3eTtxMEBtdj9xcyVQPGhiZD49KElnQXMjNTxFeStSeUUlO2xTLTlIKjVmNlhnPTNBCit1NEZ1PnAtQ15TMip5cFk1SiYqOUFeP0tXPVM4bUJRcThtVEshQys7MSg/SmNnNHZhSXA4SD1hJU1LZ0AhVk5nZWpjVUV7JWVPJnRVZl81CitLX2AoJWxMbUs8SnFIUSpwKGMteEhabVZ3aF9kb3c3V0slPCtCQHIkTXBLY2oqK3pCQ2pjKmFnfkNZaHhlZWA9SzlJKCY8NE9xJGxMOz9vCit1RUtjTEI7QHo9VF9QPD9LUFJKVD40ckZQTzxoO0s+M1A/WXU8ZFVSb0crP1h7aCUyUX0xaDlQck1zRGMqT2QpP05VRkg2PXhgJlJ2dTJ5CitPRTIzZXhRbThlTzBTNnJ4KSNzJWwyTiZ1I314PEwhUkJvYGhmMz5DcFhCN2pWNGB0Qkp6SSRQKWg+QDZhV0FLMm10ZXk3RHA8WSQ9PkF6CiswMDRqdDAwMU5hMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlyYllYT0xiNjthYFdNeStNYUN2b0MmMkEkJTQ4SHAqMW5qfGZrel5ECis5V1JuMVVZSWBXcVFgPSh6TDd0JilBdjRtZnEpRmx5ZVRwNz4+Q15RfE58NzIjUFNSWDVxQ1N4bmU/SE5sI05+SUZxT3ErdWhYKmwre3BECitTaCV3fklNZHZXRTE4PUVqWEBJdj40YndUYFc/YkE1P3BxbnQ4TmohJTtVJlNBQG5aVW5LO3dRN1d1MihAQHFxLXsrLWR0Wmxoe2UzSUNUCitLSWx7OTx7TDxUcHw3VXZ5fVdYazhBQDJIVilxU0NDYk47Nj8tOUJjfEZ9bGhQd0pQbE1HYWwke2x3OEooOEZUR2Bvbk8zV1I2OF5IJjhDCitRbkNKPzRmOyVLPk1VbEB4U1VpJHJBbzUodTF7YXtDPDQycFgyfDN8TXt6RXFCfUpYUkRkQDd3Qm1jSHJoKHlIUFBaYEROSHZDfGJ2al9eCitvPFY5MVZec2F8UDZ9YF94P3dGYyN1JXp0dGdnM2wyZVN2RVl6aHtYPEZeIUs8JF9qUzROSVp8ezFTb3YqYWE7O2BaTX43cVY+P2hUTUAxCitHSkFeTGs/a0ZmNzJDRj91MmVHe0I7SD0wbS1PSkdAYVZvTjNwdyRrVjd5fllgSDc3OUpYXnZLNyNiaX0kUEReaX1wX0t6Knswdl5QcWx9CitVO3JTbyMwNF5ZRFBifko2Smd8ZylWcXp5LUtSNHckODBWeHFkX1NqSCs0ZlNENDF6c2lBYFJsM0x4R2luKVpqVH0hQWh3PXpGLVV5I1h1CiszJUE2fCQmIUxAfn0rdGB5S2R8SFhQM2AmZTZ6P0o8NDxRandyQWBocD88P1Q5NUtSdzd1ajFMMSY3M1Q/I3Q+VXY3Y19uayUpO3ojR0s8CitHZ0cqRkZWIUIpUEdTaUUrX3Zzb1M0ejFCTEJVTCpke2Y8SWAhPU53LUhAJHhpQ3BxdzUmTj5abH5LOE9yO194QiZBWiFGSDRwO29SYzJWCitifUooYSt1T2RkamU0MiF4MDU8PFd3cTt8R1dJMnIpJDU2eDdDcURyYj9Va0U4RjBRVEBNNzxkK24xPjs9cE85SXhsZi1OYyVMWUMtfDQzCitHfEteNmBmM1QpPF5NKnArZmpOWEA8eWhXTWxuYmI+KSNVd04+MkM3OWhfbXNWYj9zJW1NbVJDWUR0RCsyWikjajc7eGB+fTZYVkIkYDlTCit0cXZQeT4yS3Zucn1oa0NkYHZZeStANy1GMz0yY1I1I2pJck5xJllnRypBPD43fXRlTWdidUxISmBJKlUoNiskR3tkcEZqO1p3ZD9leXJLCisrfjNMK1JOdj45TENAUSFNJH5tQXNzeCRhbDdScz9EemAmZ18oSVZFfV9ZKFU2KkltQy01UyowcTN6ZmMpUWUlJmx4VSRxU3dXSX1RaEBTCit+eDUwQnJDfGZjYT9QQjJPcmVaaVY4V18xcnBZMlZod3MhQ1NrXnxzZ1JIT2RWckhpd3E1SiVpVzJqOHZnemJ6ZE43Z1cyNVVUfHgzKXN1CitiTkt8TVM3aGNSUzR0PyV5NGY8ZGFxIzZYIWMxI2x5dT89JV5Panl4Tjg9MVZyRWkyOyYlfVZ3bUB2dlpAfGYpNGZNOSRYSi1RYmFvQ35KCitJX3VUaEh5dDMpNmhsKiotZ1pWNENYSyp6JFo8KDJLWn59KnVuKUhOXzVFMFNiK3gySnJfe2cpKS07P256YjlaYkw5YmIqZSRXPDlgblo2CitfVUE4OzZZUUt4RHZKKjRnI3BKYGQkb2xDQVBeOHJkJihvPXtxWiZNOClMbGA3Xz9QSH07X2ZBWF4pei1VM0ZCUzglYSQxPjRfdWZoYTJhCis4aXJzSyRwYUdyTENXKzMkNWohUyg/aytLUlpnT3U7KjQrODVtLXZ2I2BJJGNDPkNLKzdLRnk9PFE4SWwybjNBdlB3NUA2WHc2OG0hQi15CispZGVXdVg3JTxjPGBQdGFaSTtQRWFLYHlBWGp3WW0rQDhadj0wamdVMV4qT3s5P0kkQWUjfFN6ekV8TDR8eD44c1pmUkJOU3t2JUZYRTJfCitTWjBqZzN2YChHQGFGLUpoO2VpfEVedk9ERk4+PUdRK0lfcTBrPkZBWVgxWEpPOUtRSDAwMDA4MFB+ZD1Ne0pWYHFpcUJMMEhGJjIwM3JZCitZMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIXByYSY9PkxiI2k1TUVedjkzUkAtamxIVn1RK1J9Y3Zua15AXnMtLUA2cTVNO09MMD10CitXJU5ZUklFVkEwYXA9N3RzKGw4UzNBK0hkZDdQIzRPTXgyKyVJU1VodChiN3JWWnZBOX1AKHAwTTZUI01HUDdlQ09HQilQYl9OR3Y/SjtKCituTTd3ezdXTDNvaU5sXnBobFNySSVzXjNCUSRJRy1lTjB7TVAjakUpJXREalApMiVZYmQ9a3dNJnd1KVkzVXxDbXA9NjluPztGXiNYNUk+Cis5WXV6ZXs4KjZZNHw5YzJENj1BQ2p2akBsKWk2OGlSS0c2K0taeTcmX3opIXcwWih6UiR0SCZyYXxjVXlHRndmWVZVOzlUSXw0WU9AO3MwCitsYHN1aCRwTTh+R3FAPHVYSGdWRkk8V19JZzVNTWBiIV5aYWlYcz1jKzhPcklTbzVNUHBmZ1JwRVJ+MHlMckJReTdWViRsZkVpZDJATW5YCis7cGMzQVE2JWVsJiRtUWFHM25SKEdWKmF9b1NZakw0MkAheGYoe0YpPGRoKiEmMDYqdklpVUlATTN+QlBSRUA0Jl9eUjdrO3BWOUF0Kn5MCitIWGNzTSM0SzxyP3p1IVBkb1VhQzVAVnImRmk9aShRdmB2dlM9cGRqbzRPSlpOMGlETUBvbHxsIX5nPF8mXlVTOXtNeEtMR3puXil5QmkhCitsJUJaQ09JJig/Pis3KmV8VjA/KEJEOG9UPHwoUk5tZGFgfUxsbnVWSUNfNiEqNDshQTJ7RzsjQWQpQEtLOzEkSDFTQiNiISM8OFdGaCNTCit6KjUoUW1Qclh3fTNoZlVpeWVLVmdmQi1afGs5PkZIKlBNUWk8bTJVMSM+TEgkeTkmd2d5IVJBfj5KcGdOP002MXtXQWIrcFhFTkJtelJ6CithdEM2TVZsYEg2UkVfZEtwc0l8OHMtS09aQVdTbGQlfihvNFo8fFZiQVBHPWEmI2x6VDl9dS1gcSpjZ0syc2FLN0RTM2xec2VgYjJDMlM/CitDZm87aG40KzA2dSY0LUZ0ZkVhfWxQeSVnVCFDS1dyVipSTSZRP1hwQ1RLVk5OYkQtQ0FmdkwleFBvX3FtdWRiZjwociNTMEFMdjd2ZTkxCisrazV+YF9DKVM5ZytBVVBQVkkyNGBTaF84UTVlRlpLdUkqa0cqUUZiX1JHI144UCRpWTBjR3NeMnl7RW5VRGFWMDg5QClaeTU4VlMoR0poCitjcnt2dWJeNDVGO2Z7enRvV24hYkAjJUwqUmE0MiMzakV0TnNET0o/JTZVUyhIfHN7cEt8TERENig5PWxuaT17fX10S0shM3Yqb31QNlNkCishZEVYeGo0LXZXOUU5fGBYNigjISNSZDM0M1V+N29ieUI2VVghdmwpTXNQaFNyJDJuPzRvXnNZPlNIaEt6QzJIRTwtPX0lNVZBUjg1JHAhCitXSDBmIXhRUVMkSHNJPjs0XzFMfSZuNV8+LX49Xj05QzZXUUhiNXF2ITFLXktnV3xHTGJ2UVo3XioyZXpyKmtwNkRrbkV9fDYkO257VClJCitLYU0xMihBVWplJTg5IVglUCh7O2wkTk9rPGJMaGh7ck12LXtmdypAdy1zUlBoIz9mSVFnKDVUdVN7QyRqcS0rPFF4U343JWpDZnV2XjxVCitMIXAqYiZrVCtQezdNeFchWGYwZz5jJVkpKyhZSjY5c043eCVfNThaPDQtOzRPPVl6I2l4dTVATWFjMEp5eWUzI3R0YEZQT2M5Z3ZMKSVvCisjZSUyY1E0RiRuP2k5JElzfi1fY3tHMzY+bWZ+MXBYZno+cihzeUc7VmtrdUpMUSh4N01fcUVuYk5oWnd6T2AzVXVVNHclWEg2NlAyNXN1CisrQllPNX5hJiFqeG9hbVdvcEszPXl8bURKRXpBNGUlb2JkRyl3KmdQKWg+QDZhV0FLMm10ZXk3RHdaPnhEe08rMDAzNH4wMDEyVDAwM31sCithNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzl0YlpLbUpFXnY5KEpwRmd1SGo9O1Z1ZldRaUM2ITlGRXZMQ3VpUENpKXIqJGB0dngoakFvJEY7CitONXxVX0JxP1JDVXQ5fFg/ZSk5cDRwaFArRHdzLUhYVXNGalNGYz1LeDNvYEBtaHs1QjUyKHVfb1hDcU0tKTQ/LXI+MiRpP1pZUClqRHkxCitydlJ+QilpST0/cGxJLVJxNXRpJlJWJTAhQX5wNTRUZVIwNnhrI1kjLWVHJVZzUVJpYzsmZyRReWZOK2x6NDh5RTk5NzRKM1pQVzNjTVJFCitBeHFXZ0Awb0Y2M1B5XkU1flJ4bTE7bEI/OXZwdVRII0pXX2NtUFN6TFkxQXtuYXNTQ1VBYy1aYUlUYEljMn0lT29nWnMpaE5UT1k9PndzCishbDJrdVZxcEZEKUtVe2UlJUluM1dRVWcmTlI7ISFWfGpQX2l0cGJWMHp6UWRsSmVWN1JfeTh3cGhhQTRLaEtscSgzaTtySnV3S1hyaEdBCitaVFFvbCVPSHxAPnF6JXNXbWQ/KEREIzh7XnU9VVZOWXpKVmB7RmMqYVdaLXBoWHImPWI+Q1J8JWhqO281cDkyeUdFUnkoXj1iU303Tz1UCitARiNeT2REfVM8RDIxP088V3kmKmRmZkZkJDt+WGZ8c31ScXcwZ31Qb2FLUkJaZTtkR2Irflg/OWVIYElPZlZMalhxJVpTJl96fVFBTnRICit9aFQqTm8+Um96JEtnPnVSNHJ+OTZ5SCRmNmQ9a01RaUl7diY9YjZFZDAzOWJSIVNoJDtyXmc1bGwkN2s9NHtNUlJNanozQEAkNGgwQWhmCitaSE9LN1dIZ3VafnxJcDEoUXNqfUhCPiZmbVV6YkxfdTZKb15UXig/KXhAYkQrSG97V183SDNTNWp8V1dLYEwob25pbFokeSo+cmhZR0JYCitARzghaWE2RHJafkQ8ZFNXSit3TTdmTkRMVjY/eUk1ZUokZDd5JSMkbFZBcWl3bjY+anN9Wj01I1NQZSlRb3N3USUrTmZOTW9oU3JPZj9BCityZiNPa1N1aXRQRWs1KnA4PiRBdWdFa1BzTEdZKyRLO31Wdll5VzhzUGNuTiprKmBKI3pUeiZocDNMS351cHNre0h5b3RnSXxwc0MjNFZUCis2REooMk4hWnFPX190cGF3QzdYezhzPisrSEF9Q3kqc3xXbiZ0TjE2YGlhaUprdXZhTjx7QzktKFd9ZiY4VyUxK2BJUXMqTSFwVyY7ek88Cis2bEdxQnZBO1R2ZFNqYE1ARW43YmYlbnx4RXVXaEc5Y0QzX3A8dWB7WENLK0hmcVFXUkswQDxHNkE5JUBqIT9xRWNSZSlQcCN7Q0oxcmV3CitebzctbDt8fllNX3dqdXMzaEJSTXdBaF85LXk1dXc8ITg/VHVaPXphJEhCbzBXJF5MNzEwODhpOHJaVUZYLWBwWjkpb0prOzhfSE45U0F0CittY0JoJHJZaXYzMyNVa3MwY3lrcmFfenRrayhaRWBKMj00anpLP3l0XzBmMERjQ0lOKmE4VV48ODJ2N0cqKUB5Z09tYypfaEAlX1FxRXdTCitSV1MjWG1GMlZEU2dCR0RfeDdKWTVyMWljZ3JnSjtufUthQ0MjYzxidVZvNWtvIyEkeGUlZHY1bkJsMTF7YnhefVpoJkRQPk5NSmNPWThOCis1NjtVb3d3em8tXiN0dVQ0alNpRHMyRzw+bndHU3VBODhYT3w3MHl6aW8mJXojNCVwWEpkUjAkJlcmc0RQQjdkfldUTWF5cTBTUk52aH1yCitGbFFGZk1zYExiTTB6fDItMFlhPjMtej1WemdtZDZofndGSX1zYncqQ19WKCtyRVVDRlNaIUJGfmlZdmcrIyU5QmlzSTFHdmBTMXdNYFRQCitIVVVaKH0/YlJQdWotIzUwaElVRDhDaVMtIzAjKVdKdFd4Tys4Tno/fTR6KnpheEdlJk9uIzhvKmBXMz57dT5DYCkldXFXanxIbClrS1MkCitje0tNSkE0YVhOa0ZhJkNAPitodm1nWm5uc3ghKSRyY3k2NmM3cn5zVSpkT0R6dmBfXkh3QFpCQ2JsPEN2Xj41JTUrQj5aen01ITQ+Pz5lCitrNWdDfCRYTzZ4IT4zWnJYPVh0dXFfRmcyNG5hQWBsZF9RT1loc1lCU3dXblhQWn5hME5IPzJZKXRkRHpNXkJ+NXhLcChiPj9rcktoKnFtCitHM1k8KytyI09eNGo4USRYZDYtOypmeHQlYTlGWTVhIyg9b2c2Tzs+M0VLYjRKcGk2KmxlY04tUTQlbXZqfEVJQlZVTns+SGk1P0kzYFQ1CitIPnlRe1NUIWxqa3N8QlFKZE45JFV5ZEB3dVlZYFNFQkVKfWN6Z3BMVT5sbj9AJlJ2PktAQ19QdzhUI3khPjtJPVFwTGp5NUV5JFFAaEZsCit6dEI2WCQ3eTxrVGI1dFl7Z2YlNWRIe3hDYmYwWCF4O2NTXkxadXFmc3IqRkpIY0ZTPFF2KHo7RT4xcHZtYzNmPyZiQ3ImbHt2aHhmOytgCisrYmo4VzVXYTczQGNlPUFUbl5rTnlXWShrfE0+PldlJUBEMHNMcGVXeUhBckA+PnUjVG5MLU9RKlAqN1AxZjJfPE5ublFOVGQzfkNGZnJzCitCcW12d153QlR2KntsYEJwbzsyNnlBRXQ5P2tCamNhMm5JeFZ4OWwrKj5GSTxpRV42MHNKJCpgS0Z5b3BFJnNvOT04NHQyPH5+OEVGJSk9CiswezlmSyQkOTZrVXR2fFVKJXI8V0xPK2ZERipXYSpwLWhVI1d3YSNzWTNCMiF1PHIzOXhKdWZlNyUlODAlRDJwUzNVM2JLNWJWTD8kcH5gCit1RG8kY1Bye1E0KFomVipZPEp9ZilnXk43SldqYC1ePVBXRzltUXBtUUVSM1ZyKGZIenIqX3BndHthUFIzZUBJN2Y2Vigya35Dbio5M1NFCitXcXdQKShELWF1PHRXcGR8YlhQelY/JTlafGBlJHdWJGRKUU9mSDl9RElAdVVHYCY8ZlVPITA8fGZBNURsMV8hMFEhPCVfZitvT3hRWXdTCit5fWAhaVYpM0FlYlghKmFEUVI8MlpNZzJWSmtjP3p8O2d7NWwyeFhWZFVUVzVwSGlUN3VnTlVhOUx6PDJtcDYxMFZnej0hbEJ1Q0NXWjxICis4ZEJXPntIJHZRPmo4eF4hcjt7Q0JhPmM5TC1+KkZqU3dIdmJ+NmdGYztGM2liO1k3Z2lXcEI7TVo3PntLLSt8MVA9JCM9VkI4RERmWWVNCis1Q343cCQ9RilJWEJgU2VIUipacj81fkRCeWhoKzItTiZRaFA2Y3BmMSZUeHRoJklOdFopZjZPWFRga2NVezFtbDt7bipqWT9wWT42YUxFCitjI214OTV1LTtBNXd6KDUydSp0OS18OztMPVgxZEdiV3ZaOXA8QGFhWDRrZ0ZDdj1aS2FeeUd1OzNidHNReV4pWF9DakdBKmRHeihBPj1uCitWcFIhSE55ZmxESTklQURmWX1oUyhVMWh1Iys+YUVyIWN7eXh8cihHUkVWRytrVlJKMnY0bDRidGFoSUV+eU5mcVRgbmJRfEw0QXohMnNfCisyfTcoZmdrQClvan1vfFB3TkQqT3JZb2NuemZjZW9JZ1pRUjR5YjQ+NWFeaD54cl5wSUtpMnhsUGxScWl5dHdQdzI3SEImOVpUcUlDPmhaCitjXjdAeGVCMT5MWmVAfWY8fEtvKFQ0S1p0eHUycVgjRmNwfHN9NzJTSGZ8TkkodFBiWTAxPz8qISpxSUpIRT4jTnQwcVNDJDNrRDlNblQoCitYdlR6Z3g9ITYjakhpbS0tSTBQVGpHO0s7O1Z8OGRrYWcoeUxATzZaVHk4cW5yV0pJPl5teHMkNiZoJnBIWndVRSpkODRgODw/WktSeyFNCit2diN0cz1ANz1RIVVrTkY3eDB2fXdPSUZiRHZ0d28lY2J0OWpJajF8VWw8YDYlSW93dHNfI3N4OD0mT2Yld3hgRWcjPl4henIrQWsySE9YCitDcHlmI1NYJDVzSzVCTCtBSykwQjMocUBmPiNUSms8dVg7eEtrcTFqZSY1MFRDcHE5VyptLSZoZkc1WTVSbUNuTXA7UHJ9K0BpP308aFk4Cis0Q3s1OzN8TStvYUVXOSFtdFleWk5qMk4+cT5BKzNKTV9HPXN+VGxpbSt7VGBBa0lFWlNnRzgmaG96T0hUSExOZHZeZU90WFQ0a21SMG09Cis4UG9XVjB+NjNzV28rK188U2BWfm16ZGo8VDNLaygwS1VlXjkmYU5APjdqP2JUUEFTTyVOd1dpOW42KFhmKGJZdEQjTCZRPkxpUEh0amJgCitrUEw2ZjlEX0VkczVpMUo+Yyg1NDxRSUg0cHl4cFZHa0QmYTExZn1RfGNTUlJyODVVe3hVNzROakFSMHlObXszNi0pUyVONyY8czQyb2MyCis3TiFeVlhMQkFqSHxIOTFjZmx0NyVuSnJXcEs9O09HUS02dCYqMiNCJUpOPlkxd3U7Zz40PDNiaUpJR2lPeERDP0JSTD8rcC0kV20oLWpKCitVSS1JLVROYWtJclAyZk5MLVM3KUJqPmluNE03Ryp6SlM9RWs8KysqTy1pYWNZZVJhbDcrbFM7dkhXQnBNamxMPU9fd1JHITErMzdpKXg7Cis9QStZXkptUilDbn5eTllCNDtmd2JQS31HZTUkZykwJVElQHp0Ym94bm15KEk2Yj95aTtjI3orQyVMJDZVN3YmV1NTZFp3V09OUkFueCllCitTczVsV1EtUD5iVk5FRnh1U1dHRmJNNk1wJURWITJNVkpnOUxhRjZoeUJoZTI+Pz5RRCVGT1QrbHJJMlpRTzQ/aiFRVlpqZzdyX21ZS3NvCittNylefkppaFBySnYrMj5kYD9lOU1VWnRpOzhAMjh1NHAwUzdvSERQOGY7e0xvMkdsNXcxViVyIUpJQ2BWM2swI1J3SUB4PVVKV2F2RypZCitMb3krKztEO31qeTBWQXg9eEBYQVV6KGIqYkxjIXJUYytvY0dPSn56byNePUQjblV7dj9relI0UD9ffVBlJHtfTVAxWX1BQztHej0hfD8lCitAfkx0QHk8YEt+dDwjVTxja198REtncFBNfChiZGczK2twO049NipqPTEqcTZ6akk0JCtgaT0mO0IzRl5XfUtre0wlVyNXQy1sO3FkOEdQCitxPTdORW0jSSlxMl9laCZDO1lnUSlaeS15ZEw8cFJyZ21JcndWRChBOSRST0ktb2tuKGB0XklKKHBBazA5d1kpb2ZseEswYEt2Y3kydHBVCitgPWZMRCohNGQ5dldIKF5VVl9HJENjI1hOVmJ9QHBgWjVuQGl7TChCT2VxY1FjP0pBX3V5PjIzMT9FM3J7UC1uMjBqT3A+VDV4T3pTS05CCitKLVpYfXphKnxaK0NxOFNhJnVTXjM+ZDQ0I155Oy1SSzY0OEBEJDNRTDU5SXJBJmQlUDZaYGo4e3A+QUAlaEJkTnZaVlR0UFlmd1ZpJEQ8CitVR1NWT3skdkZxcSgxQUp5aHowZSVsIXxzWEMrMSk1KzZmQ2VmQkFtc1pFPjI8My18a21XPG1tbCFQPnU4OGprJm5fcVV3NXlNSUdfZD9LCisoZXB5QjRTZGgoVTFmI29SZ2hhNXtNUT9ESD1NYDtNdClEOFMoWiloOTdCMndTYXw4S19VY09rLUBvZ0w7bjF5U35XbHReN2JeMWRsPCpaCisrYk9+RU9Ne2ZuMmt1TWVOci1tbitBUnJPT1NpKXYkaENeJnZXT2IhP0JKRGNRajdue0R8P21Ba21OQThpJEBzeGk+WC12fHBnVDBXemxaCitHUURtYENCTU9INVFnVVFyJVQtJWhwR0lnNGYqYDB2a2s8PUt9OFUhS3tDYnplVTsjezBhWllGcVl5Vj1DMj1UfiVpNnkkPXFKe2klISt4Cit2SnR3cFpAVDFeRiEoQXhtVk5TZU4rSElMM3YrbDhsbjgjUj8xfSFoQnM2d2FHKjBKSHszK09rKHpNbk5Qc0g1cmhZfXxOZ0RHYmU5dFM9CisxNXhwe2txaEJpLWQ2Znx+ZDVgP3JfOGNiN0Y8UmtIM0wkcThpbkFMUXp6XzdCPUZfbDxHSTt5ZW44TFBxaSR5TzU3VmQjbHpmUislXkt6CitHPFU7QERWQ1FrP0BqenJ6cj42NiF6RTRpYHdeK09PYVVCfFheejs7JWtJQGspKTFAM0ErelhEbSpvZksxMUczWiU0TjFoeGhNZGc2WEhhCiszbFlKJkt1SEZEem1taTZYJmNVPkQ5aEF0VFhDdEFhcC02ZWJLSktHLV91K3R1PyQldGlgfmhhMGBhayVoYmYlI3JnWGFgX1NzKklzVntfCitYSFI+Yl5TQUdoS09EZFJ7YGkmdTtySStfNTlJenkwc3xKencleDw4aiRSJFZ7YCNBZlp+eWtAeVNKekJ7e0heTSs0PVdCe051bT5DenltCitGPiQ3PSRiKTc4SVoyN05UNzNJekMtUmRXbmczbTtFWi0wMzM8bnlRaF8zVnAqPWx8TEB7KTdxYSlFSyZEOUBtPVRKUkx8QzIxYDc4dVBgCituWUJCJHNrYX11VX1OSSotZ0RgX2kkbTFEP0RfQmZhVzVee3M0ajYpYUh1YGZXLTxTYTxJbyordkhoYVpra1BUMmp7c2tFcitYSlpDUVE3Cit1a3ZCNSNpQEl9OztmZDYzU2V5V2J9QE85U2xHLUpDPGxnfVI2QEZaU1I3WT9+UHpHNEVqdmhvYUc5PyFfdWQoc0pTVSoxNTV6TDx+IUchCitnPW4oeHlZVU8jczFVd1FaT3NXeGRET2BpKjtlQit0dUg8Wk4qNDlrQ2Y5RGtIcC1uTnolJitrc003bitubXg2MUNhO0RzYzE3Q1R7Zn1iCitzN2hRTDRMZjB0P2AkNzt7fXwmKklvPyRrbis/PzVpeUVBYEg7PGNhYChBUGkmbmtmZD95UW5zejwoeElPe0YkY0g5Tnd1SlMlNHllSzhXCitVJWthV2doez80fj5xJTh8YDI9UjsxVk49bFVyTlNQI1J8MG1HO3BANyQre3wtTntZXz1kTWpjMS05UFI4YE8jay14QSp3N3tfZzFjX3srCithdVQ+aVMmOWZTR0o1JHl2U0VWKDBlQiRmP0koYlAkbkB2SH0mVll0ajFWYFM0LVVRdEhRSk5LJUAqYldiLXdRIUArZUJ8YGp3SXZPOXg5CitGaWh0JFZ5ZHRBLX03I2x2M2s1MGRrPzcjN3BlbzE1SW4kWjcmRXpDdjE9Zkd9KCVnPHpaVUlAbzFRdlFER3s3MiNTOzkrLUZ3QyF+QFphCitETnQ5XlB6Ynx1RTJnWWdSWmNNaVlZan1EXzI2KEc3Sz1mJX5nfm5FMHB+OXdvb21QKkN9TU5OM1JZcTx5Yj0mciZ3cipBd29BXl9PWTYrCis3TUs+bjBNKHFgRHpWQitUdjlsZj1tayNFZ0VASWV1fV5kP0N9NjNmIWlwI0dsfFVWSHV5fn5MUmdefWZneSN+dGNLP2ZeeEJ2OCt4OXt6Cis8dTlyb2xiI0hoMHFeVmpBNyltZmE2d2NtVzRYRnkqRk9lTTNpKS1+Z3U2MSZxQGYpWUZGSCgzaCExM1cma14tSDJSRSZ1dXAlSTR5Y2ZACiszSztKMnxreVBCPGBYJVZSRmhlRDZDMHl4MGVxc1VHbT58VT1pRFV0U3A1SCpmOFVpYCkyKH0tRFUwI3B5bHl0IXRjeTRnZihuPmY7PUNmCis2S3NkUjdUcUkoZH00Y1h4dV9WUHVmSXlGMVZOKlc/ZV9OKlZ7OEgrKWh2cFZ7eD49YndBIy0oRil7eSRnR0hRfmY5WURjcFZXOylPVUVpCitoPHl6NGFCfl5jJDsybmtwLT9NRHdGaShpTmwqKU1PJEpKbiZyKENVclVmYXEoTkorI2hjdk5qSm1oMnQjbWlwPk4qbTgrWmE+IXhrODVZCitvRkIkZlpoLTUzdEdERVAzQSMraGwmTjh2KXJGdXElNHx4RVJnRkdmbEBUe1Y5dFY+fFN+O3lJWjE4NXdsJGpoXlcmYS1VVU5iKjNAKjBkCis8UCVpZDIlWTMpRktuPCRjanV9biNMaFBlYXEzPHRZKkI+JT0xTGJZSSlgSXhuQ2dTYXoqfTk9a3p2bHRfJV9sJjhtQzRyXm9TSFcpPStoCitrRCFCOXtKP15jP19CTSVqTkRBRWNuT3ckWCZeQndjU1NSfXo+NShWT1ZndGZSYnlAflRJck5BOHM1KkFVZkhGX2wreHBLTSFme0BeLTZ+CituUFpHbzMtRVZsJkwmQD84Wn0jVGN1Oz9yaFNWMDxTKFh0WG0wSTZSfjVQT3Z4PjZZJTdxTT5nVXh8UDIrayZ1NDd0ajw7PDVoOGlvNzFfCit9JlVlQH1NPFchZFVqXj5UYzAzRDhqaVE4KlRUfnJKYmZqKTArVXRGKjBKdyhfPnY+RzFzTExYO2RYN3U/TjxSKllAOTlzYCorYy1VTyFJCitvU3RGWXpHSXlNJFk4ZUtHX2Q0cVVFeClsJml2dTJpbSV1S0pXR3ZpbyZANGBqYig8bFQ8Kn5Rdz5UPUY3YFFHeXJmdV99ZnltUlhpJSVpCiswJHBxVl5hM31hNDE8Nmtme25vbSpCZ3RfOTtCVCZDVjZNVG1KNjwpTiokOXphM1ZhaH5sK1g+KlZoY2NZeV9RU3UlfnZ2PmFAcmhiQD48Cis2PV5iNzt5YXdOUF5pVURIZ0YyJDBFOSZVdVVOdSZge2hGeGhHc2c7YXpgKiQ/biUkTyRQcSFCZHRHSFd4QjM0UlBCTT1fUW1Pdj40OGctCitiYTdBcFVfZzttYlN2cU4+dStLeWNvMV8xRG1RTzRLNHhtMnR5RE5+OD40Yz1FKDQ5JFo0QUhMWStkISswOHA4ank3WjZWJU5PI3BfYjY2CitUcVkyJGJ5SCFeZSVDYyNCSCFyUkUzPyg4eU9AVDktTlFqQjM+WXx1KEJlTjN0Zm9aRmdsdDk7fDRgc1d+XyN6OzhxYyklRiZ3enYwUz87CitRaH5EITlkSXg9WmBobDkrbmVVR1BBIXB3Wj9gdEBPfVRsYnYldERIVyZqS1dkYlMoITI/SilLcTNnTD9aRGY3Qng0eHcrciRMeiVLSGlQCis8Z0JobE1zcjt6UldxfF98KzNtSTx1TUBkZHNsQi1YcSt0cldaJH5oendmTip0UUtFeW1jM2ZTeyk7SCtaST1GUjZiWXRqUEk3aUlCUilOCitKQEZMTzEhV2dgN1ZVbmBaI21NUHc/LW1NLTQtKzgxd2BwKiVNZ2JPTUZDUihubHlXdHFzXzc9ZXZAWmVWNnlYfGlhdXNIb0FmcldZMk5ECitRXzIlT3dUbTZPaCh+M1MxfT92e3ZEQTUwUH4yPjAoUWx7c1g0SHtLU3JaYHY+cEBEeHNxY2hrKitFOG4xLWlLaiNTdT87cFg3VGojWjxgCis1eTl+cmBLdEFuPnNDNWVWNHZBT1Y7JDxWJUBBPmBrSztxRld1eGVMcShAK3J3ant6alliPlhINipvZT5XWiNyNEdeU1ZFayNAdllRMTJnCit3fXMhV0Y+QlE2WnpJPE9LJCNgPVl5OXpBUGc4VDZFUkx6dzxtSSV5dC0kQGNuJFM1MSlpXmpyKSMhfWNiZytlLWF+TEFRMmdmPkBmPihwCitVSClVZUUmZ2BkbmlONjV8PzNaK1VuP3JITDxLNCVPXzI0Sz1RPzNyamh1MmFyMmpFYGJOWnNjYnZxLXhYeno1NUh0PTZtNEgldTd+IVRUCitvWndXKFJDT3F5MmE5KGVkfjtRMl9yOzUqY3c9an4yR2diTUYhRFE3UkEwfk0xb0g5VihFQF5LZk9mdGxSSnJgXjZETTU4YnRXZT52TiZvCitfcURuTjBkWjMkWmVKK1V4ZnpteHJOWGZoN3VjI1RxUGAoalFYMHRLR2hNe0d6TU5tRzY2cjBhJDNPd2dTMnYwTUVPUHFVS0s9LVojTUQqCitgeio/NVVKfUxKSldSMGc+bF9XS0JrJTRpeCk0MlJlb1U+JE8tN0dsJXZNLUE7fXIqTGMqODxuRE9LOFolKSYhLTk0fD8wK1orXkcmWllPCittMXdzPFo0I3RQWlFfc2glVSRyOGw4a1JsJXlNRiQ+XmFeakZzSU81Pkg+ZG9hNDxpUTl5UiNGIyEyUkAjYTlae09JYmBpZXVffUF7UFMqCithJio0SDJJOCs4SWpBTXRDZTNjbDYhSk0xSmViQzxjMFJ6QT9LWmYqSjQ3dXNSWUMzM0tZY19NY1FCVllXK2poamFBNVB6YlElX3p0UnI+CiswPlZtSzEmWTNuMmU5Uk1PUUprXjBCRmI0KERkQEMkSHJ1ZGF7XkFIV2I3aUkxYCM1dWxDZlVQMkRaYzJVVCs5QU9DMDxVeFB2N01MaWlOCittQ3Q2X20oVnJ7REZfYE9xRkVKTj01UXJOO3U3Yn1AUSNTLUhpIWoyaTM1eFJlSVFgeyFxYDR+RzdtPEchZEhxMmE2Sk89c0RgY09WQE05CitsPHo0TXwxVHBZUisqbkktbW1kPH19YVIwWGBlM2M7PjdGPzJHUnt6I2dtc1ZIZTk3dk44dyM2IXEzODhlWDw2WCNlVGpmXl81N01lUlNgCit4K3ZUPys4R1JtKTEqMnNOc0x3RFZ8NSNneSk3JHNUNjxnWkx1K0JVdmF4MzA7ZlFlQ1NBMzI0QWRtUG1DcD5ENHtwbHFRQ2VtcXZ5dVNmCitATSt7U1hsWlNZTVZXMDs8UEF0ZWY7I0N8YDNRNjxqUDtqT2dYYnliXmlTZEF2O3ArKiVieEl0eFFzU1YtX0YlTFh0QXBYel4qKGdgeXtpCitoV1JVSGk1UzdxeCt0e3I1ejBNc2xmUWVUQzBhSUV9ej5aNntkT2s7eFN1dmA1XkdwRk0/VXNKOXlwb2o7PktRSVlNQT9GcTBMe34hTE5KCisrIWBXJiRoQyRXS0B5eWZXOFVzYEAzUEZteU1xPG1SWlR0Smp0Qk1RfWhPcE94cWhkVm0ofDdkQCM3QW8zKiNIaWRsdz1pZUwqKyFWYEJJCithNiMkSnNZYnZWSWI0TlQpOVomQEVUS3xmaHpqTWxAelhgWW8jRjFeZD5iRXhVRjhTNUA9WEQpQGxAQEk4K0wtSDxAeHIwYSNTWFNUSHZUCitnQSNPYXNxYGQzMVRhejd5SGEram9uT3V9dCs4WXJCSX5VbVdjVm1QUnxqKG8tQmRIMk8pb1AyTkgja050UW5fJWIocmheQ1IjVVliQDYyCisoVHNIO3FuJkF8flQ9PmMoNCpiP0haJFZweHJPQ2h1WEBNOHxiPiojbjEoTSZPcSVUNkY3ZiRDNl5TJjAoRHY/M1l3KUs1QTRiTzwpI1dXCitUczc0UHl1JnBfQH51VnluKCV2OE4qKnNBJGJsWVUoJikhVXJRO2VkNjZAYnJGXz5lVUtxZkZ9ezNxYyY5P1c+dW5YeXB2ezEjRUAzVWRiCitsblQtPEwyOEBgJkU7ZnpmeFdBdlRHfHBwRlBKYDYpZ2h1cF4tMW07P2wmV0V2U3Y8cnlLYlFxM3R7YnRLK3xHWWQ+ZkghJTx4VyFWRH4yCismTFZibDN6R2RXTFdXczQxRjdgd1gwXkI0SCQySVEtUHQyXjskZk8rQn14fnc0QlUyUW9tZlNDRDgwcSN1O29XKVoyKSVIXiVBbStxSlNoCiteVTlhZis8KmE9Z2J4cykmOXtkJkhXWCFyJVB7JDZIJTdnZ2R0cXhMZ3ZDTSlJS018fVIqRGpISk5rUDU3S2AlbmNQWEdNUUtodzZ1RzA7CitGcjh9aDspa1YyflM1YmskXiphOXhQKWg+QDZhV0FLMm10ZXk3RHRhTT5nNio0MDAyRyEwMDFjZjAwM31sYTQlbldXb34zfGF4WmRhYWRsCis7TGJhTzlvVlBrN3lYSnZDUVV0ZWklWD4/eS1FXnY4RUU2VUdSaD51U3pFaCNOWmpnTUV6JXFfPy1EcDUjR0QkZFUtRWxHYHNAVlU2c0s8CitlfmgoeHBXP0loamV1VG1Wb0AwfFhRUjAwME84Xk9ZN3lhY29OYmpSRjd3NCtRYEtGI3JHbmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GCitLfVVGWWhoPCliMSEzUFZSQj87YlQ0MERYPk10QlV0Y2I4ZDZpU2Faa3M/NXo0SH5MX3opdmVZQTVRWVpZcDYxQyNhNVg4TX4yQikmZko+CitjRC14dUVfVjYqNGo3VkROdStqOEZmO0cqPUZRT1N5JlcoUEAxaS0ocURlVDlMbTFCJWxXKmAmWl9udyR5NUklYFBjK2pOJnx8STwhS21ECit4bjhwIVFzKVVxRCgzbyohSEJVOzV6JTRNRGVOPnc4ZHpKQ0xzI0IlUlA9aFRIRWI2QGhse1lWVV45e188N14+WiZNOWw7JiVTNzskeiUhCituckd6aVNWcTBYNUNHZjFpaUg/NClsdHFfPGhxR3kmWElSZk5WdWZLZ25aNzJnKns7Pk82JWprajkmfVgqUnVSJEdacGk4MUY1UkJBeU5aCispek9nNkJ5eTtJZzREKVBjcS1oPiErN2FVbWM8Qz1LU05AUTh0VztXMWpARkUob2s9Mzk2U1I7eXNYLWoxbCg3SypCUCM0ezckOXxSfDJuCitvMldpRC11b3c1OC1OWlBsI1h+JjckP1RSekhvX15EdkhLeD4hS34lVjQjUkNZeEVYZzVfcWxUKlJSZDVGPlVMKkppJERAe2AzbVFTS0V2CituVzFHfG5EZ2pjVENYOTJCNz1lKms9QzNkS2F4QktzWEEydXdMX3VnazdpemlKUjNSIW9gWTFAZ09sY1RKNjY1a0YwbmxDKk1tcj16NllPCislKVdxYTNLYFYjfUtJSik0UGxaejJnUndIVVpoWiZ7SkdkR1MyT295bGdDVzJzcnAkVyo7ciNYPXxCUm1GPn5gJnk+fj9TaTdnenFaS2UlCit2bXRAZENsUSFpMyErZztMKiVVbjUqbFZNJnZqSCZJamFoYmNIOWlTaSFgdSYla0BDRXdVOXRgVDZxJDR3MjhwfnZnNGFsUWtpS2krPCpRCitHO2YyKWcqMjxtPTUjN0JjeFlRJkwkcHVHe0xVTG8tZz5gcCFnJnExSDxHRlQ+dmwoJVVTKFgkT2AzcT1lVG52UUE4IXk+eSsxc2AwX15UCislZXY+ODU4SChUaCU0YF9Od0E8eTNCMng+QVVBe1UheV8kXnArIUxYQXwyKkR3TSZ0dGtJVFFvLXc3YyZMMj1xMHxYUVIwMDBPOF5PWTd5CithaCQmfmNhWj05cUN4PXhGI3JHbmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNDlRWEVrUFdXcE9UCitXZDZkMGZ1VnVIOVZFS04zI1F9YEx4UFl7TF85aHQteUtBWmUqPTFKPzxGWEF8TXgqQVhrZTFUck05WjEjUkhfWDN1YilfcEpFc097SCEkCitPZV53cXRHK312YV5LMmAqSWUpT1ppe2xDWjBlKF9JVntRQnskRk1qQHVVO3BrR2tEdllPSCRWU0JBT0ROYnteO2RMa0ZXbXA9SkFea1p+Cit5Sj55VnVgN2UqWFRPSDs9ZDlLbVBnc3w5SmNEeDNCeFp8TlE0NC1vNT8kXn5kKWc5JCRhXl9SWUpHa0ZXYlBwU15yKWBvKzdxQUshTSVlCit8Kz1yWkB6djEtSjFgT19rVm5SezJQN3Q9WVJkPzxNJl5ge19mNUh0Sn1CbC0ra1p6YFFmfHdBTi1IKmAwP0JLQU5LRlJ7X3k3WSQyWj9SCit7X3QwT3tHVDg3YFU4RF5fdCQ+WnBGVGMqe1BWd2k5TUBJZCNvenErWE9HWG57cjIlQ3BaKSZ2PCh1IXtlRTliXy18UlF9YFRLVnRLZkx8CitKNUItYHl7e0hYJlF+JjFpX34rTGp7QGRmWFpAPk13NHshaGNfe3BQM2AwP0Bhe299V1B7cklRJUA5eXtTc3J2VHFBM25WUEBLPEstazAwCitLPWQzXnU9azAxWmkxTi1+T1UqR0BtYDE8dmAkQT5ySHkjMFE2LXhLbGlAJXI2MktZam45K3lEOWZIKmYjPVNBTy13eUtuays4MT1fREFPCis4SVByI2J3bVU7cUJgdDJme0dORlY/Nz1HfmhRe1dpYi07U2Itd3tranxmPmgwSFctaEtiKEAlc0Q2Y2xfQEFLbUVye3tnUSRGP2pGZUZtCisrIWxLWFpQPFBae0dJYmRHXjEqYFM1LUo9NWM7QGUwdGo1PEV1eG5eXmFlRldjPENGLV9oe3pkZUREO2VBfXo+O1p3YGN7XmtfPyRENGxoCitjPkIoN3xJfkJlS1hpeHZxSkw/emRpPiRkPEE/OXh7UEJseFV2JkB0Kn5mcVY7O2FBaW84TiErYDI1JVpeN3laeGZCRUktenk5aTl7PVByCitrR3U/bWZfMWl0WXtxdUolZzVOeSl0djxZZF93bGJpQGIyS0JmQVF0ZHw0WDt7e0FYWU0+V2k9YmgwKmA9aT80cURpe0poM0B5cCtRYFN8Cis/dCt0MHVKPldpUU17I1QhV2BTfFZjeng/ZlFlKW8mZDkqXkk+ZEdsJENuYXNhNiReWHczfEZPSUxeWlRDM1p7Qj0te3IyMU1fcEFSKUZZCitvc356O0N+S3tPUj8tenYqVEVgcHcmeHNLQEt4QkgjVj58Sk5GUmB+S2EoYE0leGNLUEwzPUE4LUhvYz0hSX10SCluSHlsdlRPPkhEOG53Cit8bmBJXj9sVnN8TWgzRDlfIzIyeT8qIUt6VT9MV1R7cipiK2RwPkt6eD8rN2B3eT1rS1lSY0VNP1UoYHBMZzVtY151RTU5T0hSQjk+NCF4Cit8S0AtN3pzRTBye2czfTJtQ0JEXnk1cGF7e2tPJTJgMHFjd2RHfmNvPD9CQ3UlVUR9THprMj1sRlIkUElAMnpCZEJmUzM1TDtVVEJfa1Z1CitSXzxKQXpAYjJyay19VlJwazNXNjxffXpjez19LVVpbSVuYFc9OT9jcmB9bWp0Ukw0Kk0rKVkwR15nbGNRJDYxZlpQayE+QkFKNU9gZEIpCitNZEkjKyE5KXlpN0BZOH5nTlUqKzd0SS1jamVlXnVBME55RiE/YCZVPTQ4YjA4UVp7RENqSzFucD1gO3V2WHtLS2N0ZSl7OSVDLTt3a194CitPa05Hai0zR0o7d0tje3V9TXliO0JPY1BrKzRUXll9XnNebXFVOHtPb3dIeV47UjxVRipaWWBNQjRBVT5CVjBlP3o0OXB4KGRoWlRrSTNICitxKVBmYDEoKGVLZWJYKmZ3YTIkQCpscl5kSExCRnxGcih+dEFGfEo3ZUR7fVNPNUJ0VTtPVD9GVGVRTkA0eCF1SF4yVlpGRilgOStwbjtDCitwPz8wUypCPW45N09NYUxuLTZMc211aCRMYE9raiFpK315eTd5czhVODJaVFFqKGM1Y15WUiRSWHo+cV5BSFRIMUpZRjYzPzA/b1hVaUVPCistdDdER2lSamNIQilxbFBFcEV+JnxVYWpZfGV8S2N8PWJxPVE1IUtDbEBtYCZFKCZCaSZkWjI9amNvfXVmWlp5V0xhYzJNMjMqRztqe2U7CitKeXVVZE5mPihNUSorNWE0c3VhMU1pIz0yZ09FQld2bHVmfC0qdDI1VHZ7Zl9oSFV8OVd1ZSk/Rj9TQ2VyKFc8VTVta00tJj9ffEo5cUk3CitVRDR4UHIkI2l0K04ocyNvM1BsTlkpQXVqQWJQJmd5eEgoWkJYQE0/WlpXSikmQHcrNU1ocGZBcnxGXiNqTU5iTW5fJmV6LUBuZGVYLThJCit7NGdWR1ZYcTN6VnNZOWQ0dHp8R1Y7K2FfeG9NMSZoKjh7PlA4VmdxUysmX3s+WT1aSFojfFlhaCF3VW9JTEJFaGtDeUJZeEstSzdxOXpkCitKQHw9ZF57MEIhJDJffD9YNT1gVHtpaWRYdGpKYCVKKypzQW40c1YlYG59PyVvQStRQUBeSk0hX2RsI1NMVUhrYUYmRj56VSptfjk5SWpECis2ZEpIO0c3R3dXYHxFdyghe1IlSFZ6NU81T0M/MzJKd2hOKT83ckk2LSNxJkJAPU4/RCkqcEF1cig3JjU+LVhFRDBEVTY9NHRMTGxOX3ReCitjT3k+M1ZMdWIpP29qPGIzJntBVystUVBjTih2Z31WPEAqQDVBSipze31iI0lVQ3xMaE9ANG91cG9AeV99M3hVUilaQ1U0KUpfYiUhX198CitORSRgdSZQVT41LTNxbkAySztnU2xCZmB7emhyP28heThvMGMyPGpwc3tHRSVNTTNkUyp9RkY/dlFHNXNGNi18NioqPHQ5eDYjY3JSUUYrCit2TDN2cXR5YT8oNSM+REBWQWB4Iyg2bjxtbXszQnlYPW03e2dFR2JiYztyaDIhVmFfQV9xYj1gVSNJdyRqRCtAVDNVSnZgZzQ9THkzVHZOCisqWkk7aT0rdlNXVDdGdWIqKFRrMmNmPUMyP31MNztyVGFMcW9+N35aTDYwcUckJWgmSz5GQWRJcDNoI2xXTmd6QkZAKSUwXj0kRlp5XlAxCit2XlY9KHZHfnklRTRhVXE+X2Zmc1J5PWhTI3oxJUl+dkhMeWVPVFJlJW87fEMxX0IpXmJgMig1bVdvT1h6N1ZmQ3QkTmtyWDBrLVYqazNECitEPllWZXdNeGFxZj9vJTh3OUA2d3tuUFZMVlI9QipkJT1yIXNBRChadDM9WFg3fEp5ZjxaO3w7YzclUSglRHk/KWtGWGpifU5AelRtLSZ+CitGYmJGR00lYCFFQ2tPYkc/Pn1lWXx8fWxnRz9+cnMkdUZwJm8xPD1kZkROQyRlWTErNTJzPkFydEwldjhHMkxtJVRqd0VRSSp0e2FSMjRsCitpZDNVSXElPX5DbHZjKUAlbHdwX3VGZkpfZ25TU0FIWWh1a0krQ0B4Jjc0MS1CR1ZRZl55SWpDQmJlU1ledytzNnBhIXt5dTBRK19kSlllCit1VXFzMGB3ZHVGLWZ0ZXhHQHB1LUN0Uzx9bFJTOXdyK3B5MFBjJWg4NiUmbXBASFRuKGRwPXZBb290dCR5YzdFfVNnbjRjOStyeVBFXjh0Citxe2dAVloqUnB6LV58R2A4YGQtQ3lxdWhfWi1eUGZTOStza3VTd0s2QGUhcEg9NFRTcmlva3dxJnd0anZ3KC0+NnM8ZkVUfFU2X3drYkdQCitAflNaOXhTQE17Y2tANnVLU3JfLVlIUUZsNnhzS2JTRnBMQ2dpcTw+bnxlVzhWRTtkJFFzeFpqdWdiO1d4RER0cFJTS2NQalQyWXN+OFh3Cit8eklJc0dFMDJsalJLakk9XytYIVEjQWUtOGZmUyREdGZnRTduZklFR2NIJF9JdFZnSis9JjA/VWpNUHQtKmcmdGs4JUNeSTckVz9YZ0UxCitJeWF8JmdabEJ5ODQ8QyY3UmVzNSZleG98TTV7d2U2ZGl4UVZTNWBlPiF1SDY1JkF1Xl8yRnpvP0VYXntGM05sXiRZM1hwbGd4ak9oNH5HCit5PjM/enwwcWBRYlpMPmVlcCZ2QzdTJk47RSVWeUBWenl0PlRgfl8/QF47R0VzZmI2aVdYWH5SUXBrYzFSU3RIKDRNeDk2emhSSTNLdEpnCispVk5LOHxeb3c2SWRSN05Fcis0TG5TPHQjYShWWW1KNCRITDVlKk9yeEJpMDh+ak9kPjNwVCFFUURkQE5UbDlwd1I3aSRgWTdDfFM1WUplCis1VF9UbT5JVUZkYj5haVNra0lWVXNNNEA4MFg9bFo5NjlAO055MGNDODYmU0pGflIhX2wmIyR4dn1nbCZwVCl1Nz0pRTEoblNLeCllXzdrCit9OU1jKHp+QyN1bX1SbVN3VFFQfTsta1gyfS1MMGxMMlozYENwX3YoTyQlPVNRRypkbDBSVkgxPUUwN0prV3oyZSF+JTJQPlhvPWx5RVljCitCcGtObnk/cUlkJjY0eUxKY00zPlVDPjM1VFRmdUhqVmUje0BINTNXSDV3QCMlUVpJKmEqMUZKP1AxZj8jRXprXiZmQit2IWBrQC10RztqCitzfEVJODR0byZwe0NtNjtKP1U8a2p1S0FeaGpUSz8yKm41LWkobXl1S2xNUGMrb3xrOSZ1fH1PdVhGJk91S3dMYGB5fmVzWEshSkFYaU5uCitmez1vNj5CfVBSUjx+LWF3U1A1KmVXfWlYI2wzfHt3e3RHWXMrOyglfW0qNkApRjRZRFd0UkloU2hDNn1qZWxDbmdGYD5BOEppMT41fDJ2CislI1V6NEctVk90aD16d01XdF9RbmdmNWI7N28peGd7TFEyUG1pOHVHPXZDQU9eSjVPZGQ0KW93Tk5AYnFgPW4lbDFxe0V+aHhUemZ7alR3CitQb09LQ2swbjFTS2FULWI9JWFxYVJMWjQpdkNyYWgkWiVgUCVaXktFVFVseEEjSTM1MipuUlVObXg7bWRTV2UpYUdhKj5IKj55S05VN345Cis3WWFqcz1aO31hUDRgQl9EZm47bUBRbX5UcUBUXkJVSi0jRX1QP0VSaikocWNkPzA+K1RrRkc3eTRQZjU3OHJRQDhlJEJ3bk5MWWBCOXx7Cit7ZmwzNkZoQy1uZ1N8QnJRKH4mdDVycmt0WWR9VT4rSnBDKzxEUTUxT0hRQGU8PnlOVSY2YTFQRSp2YkIlRUtrWWkjX3F1UHFoQmphX3g2CitHb0g+bTBaOHV2eHd0aGVnNT5HI0lXYUQpRXNSP211aFlsfiFCSWNZOCgqd2wlQCUjKDUkIzVRY0VzeWgjV0FsbDl5STI2YCpRalp3NkxsCitlTUo7M1FzUmcwbFkyfllhdmpFWWdFQy1jRDBHZF87RntmQko3PGJqU2t2M09eP1hCOVN7amA7V1hUZl96ISR9cj8rOHJjXz5EaiF9QnN9Cis9fWxKbnckLU9WfFZiY19uYG1qcXo1LVBYYFZ4NCY+bUtoPyNwcShKfFU0K0BJQ1dkYnRQaGZUa0stOSNYI35fJSlHTjh3QF9MOWIlV14yCit0NWNXaWw7XzxSNlZJSTJJaXhsczg9aWozTGhVR2k/c0ohPilLd29VY2BaMEprWCZGfDk5d1V0KjUkK3hiUzRMODdsVlRCPHh4aylDWm5yCitZdTF3YCF5YlF7aHhTWDN5PldVN0pyOE9wSHNyPHpKaSRtZ1NnbExKb35VbV5yZ0FyNjsrZ28/SFQ8O1l0bmY+Z015Nz4kOFhuQmNKOzNgCitOc3VDMlA7cGRZbFhncDZIR0o9ZjY3Ykh5MGlIa0F6SzVtMjNAb2BKUnB8XzxVbThtJGZQXzh7blA+WStGOyRpSEEyR3E9OExrUTFXQUB4CitZJl9XTnFFWmE0eW5adlZ0dkJfU19MKmwzI3x4dCVOe0JjZk1BdjVVOUtyQU9EI2h4eFE0Z0xfY2hmMmo2THgpSilKbUhVWVdaTE5wTi0wCiskbypRNyh6OzJEPXd3emF9QnBRXjZ2e1FZKjI3P0hLS1QrYl9ZJHA+VDJOUFpiYGowcnhXWS10cnhpd1RCRWJFZj49PUNQSztIOUBGaXxUCitnVHFWKXFjc2kkOXU2Xy1CRyFaZEFlRTtFWXFMc1MkKm1uUERqcSN0RUB9PHF4STd2ejJ+OSpsNmV+N3ZEKnU7WSkhZnhJQ2M3QCt4OFojCityUVlHNDZRNEwoPGNWTzFQZCVCWDlVdTRSZHVjKE1fKzUmRUhiPH5AQSoldWhFSGhMR3lMfitFTGtvKDVCRDZTaTd7PWgmcExASSl5YVpvCit0aCQ8ZDktYzB1PzBLeDw4Y1Z3c292X3Vydm8kd0E9T0pTRzZLbFhKUUA1YV4tN3JaMzRLRVltflY8eVlFNGR1ZTBEYHZsdExqMHslOVd5Cit7Uzt0PTFVSThJYlp0RVROZ1Q9KnBqPzctfXZPa092fkM3NT19XjY7aTc2TXJwS2dVLT5WZzwrSUt4cSt+aFIoO0ReaHA/PCRmOyooMHM4CittQ0ZBT01ETThjRkVeUE5Le2Zafmx0UUgoZDtNMDErM202bkVUbSFBb1pGKFNlTmA+QHFiYm4qIyFSOzJkPDkka2ZGfm45UFdES3UxfmBCCitgbT8zd1RHY1RWK1hjQisyYkFmWmlqanV8Rj4xbk1QIVhwN1VTVFVNbWxfQzY+QnwqZFJAdz1QJTxPZWJOQWJSTmVfbFNkIWQqdnd2WnQjCitqaEBRTHFuRGtDOzhZQ191P1hVVXdze2Nndl81c3M0UTx4JHhCWmZDZ2U0dSFEal54NiNpM3Q8al9IMzZgVzF6dFoyJHY5YmNjdT9QZVg7Cit8QyFEJEM5YDdRND5ycit2aVJwJVo7SkQwRmpefld2NCRDXndsaWU/YGl3O008NEtXOFgmay03ZCV9Wkx1UFIwdSZ5P25ZNEY4O3l3I3FlCit5YDdnKWZmOX1JOF5vQ2AmY1RsWVprXmtrcjw9QyU4NnpvZG4oN1p4JnAwQXQhRUFwVTE+anAwbGEya15RPGNyeTcyekN5Un5BTzZ6X1JjCitOeEA3ZXdxWUp5aE93cyZeelpOVjFjUjAtTzNybSR1Q0wwLTkpclN4ZDBObmNKTyMjbT5FTXR4I1NMJTtPMGE/N2ZJVkwpV3N+Mk0/U1lvCitgdmQjazFrOzEwcTdpckI/dFFWIzdgWTUxS2Y3TEtoKlpeS2BnOFNEQGt3Jj1MamJHPTxfTShAKElpaHReP3U4ZiVuI0tvY0lSOUdUOG9XCis/fjR4WCtzPmMoaUowIWh2JjxiKHUjZEdxIzlvKkRmblhBKStHflZnZzJFLTM5QHFBckYkfXJvPn1iRGFGNlpJIUJee1I5KVRufGphUyNRCit5PW5sZmEyTztVbmU9ZFReOSooakg0bXFfb19kSyo7KHZBMntaP0p7Xlp0Y3pQQSUqZ01pVVYpfTJ2ajxGVmd9TDltQHlJc0MqPCpBbmckCis8WC0yTSpYTEVCQmxXU3FWO2o9KzlYOzJpRCp2QlpOXiVZYyRFalM8a2defk11TGdSbTJnLXFUWE1VO0w2b1pscGJBanVNQkh4YT90R0I4CisoYH09NHBzMFpYY1E7cDFfNyNFSGErXiFAIXctMmwpVl4qOWhUXzs3fk5raHpLbkxobWN3N2pAWjVJXjU7e2JXTENGWmdeMSVLKlVrc3Y/CitaRj09azVmQ2JaajtyKlEjKDw7JlZJdGkzSGN2cj1rdzUrbl5JP1ZyJXcxR21jUXE+e2dVbmpudFB+Z2NeODdNIUh5Y1BjJmFSNlVwUHJ7CislcExAQGlZdGokOGItUEJnITNIdHtJKnxtT24rXzIhaDtobWYrOFFwYDBGc2RDYklXOyVaMCtrQDQjdyoxUD5jX2FHWkMpP1UkVWErWFVnCitRVntiYWZwO15NRUUtfjQ1MT0hJGRBVXgodD5eeyZCaHRhRTl5dlYoN3F5M1VZITthSipfXmB7TThXcSpMT1BxJHFNLTdTSz5xJXlkem1pCitkIUFqRVlqYCtHUUJ8TXR7JDlFJDtqdVRMMWBmYH42cl58fHdxMmhrRilkVih2RnRecyNGUENkV19qU1p8TkdqSlh8RlZmdyFabUw9M1NMCitYNjA0IzFnI216OylgcXx5JHYxJjRiWm9KUEZjMGI5X2V6SzZnJGNmV3lzbzRmJXwrUGJ0UTM7Xz4/bTA4U2M1MCYmQ0RwREolancyWDNLCiteaUJhezFWe2FKZTNwPHtpM1EqLTd2eUdxIXZBU1RuPjc8NSVBT210JTR0dl8yRCpBKGN3cSFfXys0STgyQlpTKnEjVHhHSkdjQiVgckJVCitDM0hLNXdHNGxgXktpWEd1cU1lbmNxKz9jSSZTa0ZzQmh+QEpSc2ZlJEU1fjlCbmhoViNtO245JV8kUTwwYHc8elZDKEAtfEVmTmRMfmxECitaPHN+cDgqa3lPKnItKlk5YGdxYnVJdkdZTElMNjdHcXdQISQ7Yil3Qjd5N2Z7Nlo+dHk8aXQ7MDlqUEZhTGBfM34mZHpiTFB+QHo1enBoCisoWXZweyVIQE5AKzhpXjE3TztNTlpsVVVLayQhKEB0cXFuZy1ecSQhM3xObiV3c19FXmk8eUFrU3ZoITM2aU9CfU5JTUwrbXVGIXV8Tz01CitWez5wQUFncmZuJlBkPD53QTI+MmooZjV5aWwrQi0odFpsWD01KyZqWSs8eHJOTzBoRWlZKlhlaCk2VGZRIWRXcylmKkhyZ1JgP1ZWTlFiCitBa3B1VFJhKjE/Y1hwRFlMVVFueUhGRXswUiM9PEk2QG51ZGg8bilaaUJyTGM7TDk5WHY+Vn4rO1g8YTt+Y0tJZkM1QGloVDtIKG9ufXhVCitoZENJT2dtUjlqV1FManU9RVF+IUhfPWx3ZGkkdnpuenB8flhve3ZFUGJVPW41Xzt+JExuKT5zdzdedktVKHNoTmAmU2ZmPiV1Y1p4ODc8CiswcjJUNVdJNl5tNllWVF5eOS0xNTRibzM7az5Id2IlaTJxPDs0ITdgQStYKGc1Q31UK014QlplfmhQSyFqUGpqaitSNjZHYilrZERGe05nCitFQGxWZlRQa0VXNz0qJXR8ZHNPYDdkWndxVGw+fDw+TnNue085Vkl7K05odXw+K0VfPGp0VHw5NilYIWV4KXNWcFNme2w9NFpEPD09Z3R2CisofTI0WENSUUgmREt7NyglPjVYaV4tKiRibCNVcEhhMTBacTk0Wlo7OzJDTjxrU3wwWlU4WWg3flhVVyF9IztKaTVyN1hZbTlhaS1YTUohCitGYnpkWHpBe0wrYkB9dmZYdF88T35DLV9FIXA+PmdyYzN2JERXNlA5RSR8bkFMP1hXJCRrLVhIM1c+JDxMKHo7QXtpJkN3RkZeQXpgZ0FGCis7ck01IWp1QykkTklPd3dDO2x3O0V5cn5sZnswV0VrJGI8akIoP3Via2VYWTUoVVpVIShvbzk7K0pLRmlFblVSZTR8OFlCT35lejE+UD1JCitIYEtZXko+cX00d3E8NG45X3RHbXZtR1N3OT1vT0hDbiYxJSExYVV1JVlIU1dhRylBfkh2SGdjPXp2TGpiKzNefUNZYlZRYUw8LUFNdlBICitySWY9T0otSGpIPmB1IUcoTmQ7fF9wRmZ2UkUtfVdOUzt+LWVoMTdYS3hNM2E2V1ghOFN2SEA1TGdYMn0pd0czP3BYRUR2LTdXailUQDl3CismWVl4dysjc2hgVVVRQVRYd1VfNWM/eGxZZHkrJVJka1p5MzIpUGc7MURGampoa3BKZFQ4bnJ9TDYwOHVLS0BGeFVmPWNiQGwlQFh1MEFoCitSPCh0aGt7fiMzSG1Iey1sXmFJYE89JWo+SUNkSjA8ZmV0Y3lZc1k9TTxfc3A9YiZuM3clO2FZIS0lY29xQjRReVdzOU87Z2czUyhCSHRECitnX3hkMz5gISpjTU8/Xj5nUVhgR0lzLW1CdHpBZX5nbCphe2hlZipYZSVtaXV5entiZDw8Z3dYV0tsR0RCWkhYdktxbyhfR0NHakdOdGlmCitQbj5aSGgrJig1T1kxZkpNI19sKl5GZilmYlV0LUQmMzlNJDFYanhTZnJvVGdxcHhZPy1KYjdgdlVSPCphUDVqKC1BcE5Pe3krQnJCYUJJCitJUUBhUiVeNXE2PmFPMDt2UzlyNEEmcSZ2UFZVaEtweE94SmhVZndhT1JrRno2SDNOKFpaciYqKzgmYGsxbD9SXypjb2xJNiY5WH00NUxLCit5fG12Yz13U2c8bkYhISU2K2FHJWQpQXVUekJwZyg0dnw4UXtaTm8jSD9FdVM2YXg9LS1qaSokYUJsRlpDc2FAfjdzOFhEKUlrQz1OISU3CitNNDRiMkN+UzZ7Sz8kVkpwQmtINyZqWnpLa3hpU0UzRWI+Ji1CLVdSbHBjZz9QUjlCI0stdCY4MXtqdFNQMCsqR2R+N0o1TFRUOURAZ2pnCit8Sm1jYyRtMHhhPV4leDlJYlFwPDVCa01qMCl3Nm1gb1JXMlZ3YyFwZi11U3hSeztJSEtJdzw2e2dNOz0od2pwWWI7MDkoMF5aKH5ATTJfCitlMH0tKTc7JlpAajdUZT9gJndDbzluTTtWPHpGcUpWOztpeDFeVm1nZTJUdz02cHVpTjVYfm0lZ3BCJnkoZ28pRS0lQCNVI3YxSWRrYHd0CitocTFhbSZyb045X2dYQjgkM3g/MGZlIShgYjdIRGVpMUBvTWU/O3Y9TWpqY2ZSNjk7aCF0YmI4TWkycXckSkxMb18wV3tEM3BPbHA7dShhCit4TyoyKjZYO2YkVDRMPENmb3hgalVpaVROaVpiPWApemVVTTxJcXY4QmlhP2VRUSQ3XmJ5e1grQTllWCZvdW5qTX1DTE1aQGl2JSU9OyQ8CitJb0MySnIjMSYlVkR3aGdzVjZyaGRIQHZvdFZ6QGZ6aVRMS3E5NmpuMTAoWW5KOXx8QjMtOW1QSEE/TDhjTCVgS3BiUittU30mT19jQitrCitLMjVaWkltfShWYVFBRTc+dUdmP04rUl5ZN15OMUpOVlVwTSU3JnAhOVFtT3h4LTRfc3FSWWZuWjhtcFlOYnoqWDd2ZzNSenR6MHJQNWl6Cis9RSNFX0VAc1F4NCs7aEsoc2RuY0U+eDE4a2g+eiF8ZDRRSnlJbDItNEp3Y1JgV0QpX1ZXMEVhNm0oQzJ2PihLVGlnPUNiYnJFLWEqcGFVCis+QTJkQXs4YHhTOzVGdE9GaC1IJk5uQE0kRnZZQ2dAfXhxbUZ7Xm5vYkxyYHIhXzhENFZFZG1pdmhUPDVTcGlaSUQ2QXYlMUxGcXYlZDl0CitUNGAmfClhTVVCOEp0T2dLNW5FKTBfZz1STHBGeWBJUFJtdDd3OGpgYXVodE5aQGs7dHhNTl49UX1eUSRjWldxZUBaVyE8QD5sWW9rXz9kCitlMzU1eExuTGI1Z302WmNjM2glbUNLQkcyJmtiTT1TfjwwbWNUTVFNfWt3aUhtNXpRZG1TWlZrZ2JgP0FVfnRPPzlNWX5OaG8kNE4qNitHCis9fCNjcShNNX5Fe1hERWRzSm1iNFVVNiQ0JCpXbCV6KXFjMTxJS34leURNbFI1QH45b3hvPTsoMmh0YnAzV1d9QjdPJmxKYHowZ1FIYyQ3Citib3VrN3dFanokTzZPLXR8TnQmKU5Kb2tMK1d8SX1kMTYrcDJoPmB0TFVxYT0xZjFWe0hTOD9pb1Q9SUJ4Rmw7fHxCVFJUSzw5VTw+NCRkCis7PnVzckE3V2BEMDZiKzdYQEx1KC0kUDZYOEtXWUM4QG02K3E4NV5ORVFefmpZTHohcyVBNXt7dlF2RlFHbUd3Tk9ee0BLQntCQWkxSXA7CitseD1RbHwmRW9aUmJ5UVg3RGJXckJyaFdsfGAoUFYzMz1uazNCaE9XaUFGOTVkdnZMczNUdzs7eDB8emB9Y2NRWHV5UHBSQ2dlKyhhcEdhCitOQHBPeyh0al9sZSQ7M2FBKzFiNlcqKygyYmIkYHdNNVd0RTBXRnA2XjRSYXFkfjxFdDwjbCRZN0A0Y1FUSUFkcWhnfGtJTXJCODNxZ0BOCis0Vjs8QkUpa1lPdkhpcnMqdGh2cVpITUV2ViZQc2xjKnp1X1VvdT9FOUNUJn58MEthV3A7aSVLUCFBT0l6XiQxVypAYzYzbil0LVIlLUg3Cit4JnshYDYkN0t1P1VmVVowX15KbE5XajdCPU1We0pqU2NycyopXiV8d0BtSzNXPURQYm12MlIwLSNrLShObWlqdHZqXnBPR2hFNTw0UWBZCitmUkpFeHl4ZXNeMk1iOH1pTT9SdmpxVXJaUU5CWWhCbk9vfWNpbTZTezgwNEhne3dSYHlOZiNvfSE0YmhuKk5wRX5Id21xaXF3TEsqbHooCisjaC1gPVJqOHtYMWZtcjRhaVZVUikpTktgWUk7Kzc4KV5eWHw5KGxCRl5wV2I7c0VsZUVKRjYqWnw0SV4xQVc1YGRhRGotOWZaIS0jKyFHCis1S3AlKn0zeVdyKipIeVBiWFMkUVZZNyFWZ3Z1fDZlTEB+bTFjWkIpQndnZVFFUE5aTENYTkM0MSlpNFpYUUxkbmVqcWg1IWxDfVdMUE16Citva2E7TXh8QShBNylsPmJZNip1WTY7Nis2RVI/a2h2fnVeYGUjdD95PSYleXRGeFRjYDVXP2tJUiM+PTMtfmZ+YHltNENGeHAjQykrTzA+CisyU25ULVhyMCV1RE5+PlYtd2lOWUNzLW9ZPThlTmBKVktXaUJpTXtIdSlgR0dIMDBOJWtXNFlodkpyQ2BkT3p7RUQ1QlY5Z2EkMU9xQTlHCis/eEFBc1M1YEM2d2o5cEwtdm1hdXgmTEdUZT1OYyhOU1dLeF4pbT1AVWM7PmswTXRrOSo3UUJOe2RrfWp2d1hqIUxiIz18LV82NDNiVD1rCit0fmE+UnVuaSteYjBoWSFwUXZnSm1DUiQxIyotN1hATn4zT1RgSz1PR2g1dF5NKEBJMGQmfkdSQDspaGt6YFRtZDhHPXZUS0YjaUxxck1fCisoQEEjODRNM3c9a2d6WUZqYl9gYW5DUHh1amxYeDNXQ1VEX285R2tqcFhvRSpiUXMhdk9gYXJtez13dCpRKTdwPzBQUWkzR1JOV2QtZCE5CitkfiVKZ0I4YGUhZzxAK0N8NnVCWl5HPkItQXxiPmQ3O2EoNkJrUE5zV1dWd2Zyb2FqKW9zT3I7WCg5cV5ATjNWVDNzc0J+VColbFFHJE9OCit4bk08UG1ZeDZTQDZMTG1mcnNhJUNsSW4jYHg2STV3TVUkNmhQeXtjI2I3RXw+OHotKElJamdgMlQwOCVDUXVsZz5iJEhmaDtIZiM2bCZlCiswZDV1OD5qbnxRUVo5QVRlaWtgSnFsY0JSUUZaXlY3UzwkPTFfZ01qJE5NTGRCKjR9RHtaZjRoaT8hYyhMe0EoQ2dkaEx4WG8/dCVnYi1ECis+SVJfQj5HY2RLbHdVT25PcVBHMTRJdlVjQ3MwZz9jSUBYP1ljJjhfdChvMGBKWHxaOHo1M2ArfmFIKUEmdTRgUH02K0VJYSFSWik7SjlKCitVdFB6YlU2WCloa2Y3O25lM0gpNXp+IzRfanZKM2hISEJHcnA2Nn18M3QmOFRwMUN5TE1QVTU5Rl9uczlZVyRhTHJ2bDk8QDRgOzdrclhzCit3QFNAcWllanEkaE1TTUhNbzxHR2IwPlJhSnEqI3hMQS1Ge1ZYcTxBeFl2IWsqUj16YyVUWGQ/THtnLVYjfUptUEtvTmk1Zm1BRWBHfCRQCit3SEtxWj1VfEBRMFRtTXFgZFgkQl5oc3B8NzAoJnhxZTQwYlY2Zj9GcEpTUVBuIU5HIWhFR2wqZk1VO2JCYnZ8JFpmeDZlcE1tUG5pYzs1CisleFdEc09mb2ttTm4tP1Zla3ZvKT8lM1JxUzZBU3BxTFkmP0N9JkNrZllfZGNlOCVTdT5eZXVmSkF4dTE/LU88WlA0Sld9d1d5NX5Ic0BGCis0WmF4ekd0Xz8hV2A4dzdLVkwtNzdUdEwybClkbVQtRVVrfXhyO3lwKjZ7PUpsMkAhWDlNOUFhVFJ2T3Q9VDlOOXk5MVUrUHx1VmZPRnhBCitTUGJxPkdfdCR5ZkxlJVpefjBXazJ4S198TSlFTTJ7Syk3fDZUOU5MYlYtfGFjPSNHMUY1P29SIUd8MTBzMT5eRlNYSWkpS21TaXYpbzRJCitndiZRNHB6ZGBkPHFKcGF3NEJoRXhLSn1aa0BFQnkwdXFYYEE3Kik9c0Rve2FFZ3hHdmh1VUVLZWJsfDRQeENYJXVSNDdBNkcxMD9nK1pTCit+OVcoMz1mSXhuVHhPPFRuVUZQWV4zZURSO0VCejlEZks5aCNPM1B9MGpKO19SZkQmMXJRPSYoSnVxPlFIOz9BV0dWNmBtemV8e1AtY151CitVRGYteWVLLXh8UEE1OXB4X2hITm9Wak55VjMpaHp1SVRJXiY4WWZqaVZaaDReWV4kfWFTWUl5TE8yKE1YeWlRaEhWdShlQXZsQGEhdjl5CitYaGYzMDw8NUd9em54PzQ8NT5qVjsjNWdQN3JEa3wkNEtTOSo0ciF5cnBGT1pEb0I0UzhyXkp2RG1DPlduV28yTTQjYm95VDhDKEpXTmlWCit2Vk5tRmZ+P2xjO3QpcGk+bE91R2lxR2RQSVFVMW0oemBpQDRXdj4tUmw1NzlDQUYqVkdxfU41JHxFT0ZVdSEld2FuNHQ3PD5HUG56V09XCisqVDswS0pwOGNGUUJpYz5fTCUpP0UmaXBMZGh8bTFBPSlOJThgYz87KX1FZD0zKSRZT3oqXnVCTGlFdH4/Tj9qKE58cFVGRXgwdjdYbyYjCisrNGtyKjZ4TXo5QD8mKiN+ZCQ2PT8kayExZ2kmd19CSEczYVpfcXY4I2xWQXNOOGhGQnc8LXk3PVZ6YG4tYSVxZ0BXQGVZflF1Sn4mRD9JCitHYmJAeGtzaUR5eCpCKih9Y3FRT0hETT1oLTkyMGVucDtmZSMmYkhaZCNAfERNN0p0UHNJUlVofkhtWG9eSUxvUD5WWDs5c0dvVD57ZWs0CitYTlFTMGY9Ymp5LTU0ZzkhPyFUWlJ0cVZLfj9HOWBFSjQ7UikoJHIxZmVOOEU2cVBEYF5LbkNNOT9sNntyKWZnO2xMcyRicGV7Mn5zKE9DCiskPklJSFVmeSZPczcxXkxZMGx8NWwqKGA1K0IxQjdYaWhBUzJvSCthUW5qdSNtKk5GPnN+RnY7RiN1c2xecXpGZ0RVTGZSKmJCaFhaNjhJCitSYDVNU0JZO3kkNm9oIzhzKDNFLXglPFUwIURtQHU7VSlIZTs0XzdnZWI7X2xLWipNaGpAOzBrJGtVWn1Qb1h2flRmNGRFdTxvQGlKeTBZCitLYlYrcn40bT0pN3BucnpEO2dDfVppdUBlVShtZmFeOUZoMjQmbyF1ZkomQSVRYHIjcU81LUFWPjlVU2krc1d2QW9XTXZ9b15GZ2lUZiZQCis2TUUwKT1xKG0+Vmo3ciVza3ZHQ1p8S0JhK0VDKmRffGgteEBKM31gTk0rZnc1NXVgfD5SZT47YCp2TjxBRHlYQjBTUldyaD1mYSFTIzRFCis5bWhQIzlpJlFxQENuP0RFdXNvRX1oTlpPVlZaeUlZP1A+UiRVejVvPFF4IX17QDRAeUJQezR8S0lgJDxfZmdkLXglb0ZCOEI5KnclUEdACitBMU0qMnl7PFM+Ylo7JlR4QEMjczMjYzlwaFZyTlVqJFloOXR5JXgqQThLY08kLXEzYikpWH0rP2ZZYFA0bVo4bFFHRl89bThRRD8yekFjCit0VjZoUUZ+N0pOPFM/SFc8ZCpaYipVaD9EVWcqUjs0SmgmMFJYKnwoV20qUlNGYVV7TjxkbDFVayNsWTdjOURVMj1BSEleM1dLYFdNU1Q0Cis1NDJLbzdKMkpyJG40Jlh2MjFlMkhjUURTV0B9VU5RSzBTX1Nqa3g2KWBAVmBuLVJvZXM5I3FKamhhcXxpYlVZRD1BdnZZYD9DbEZIWX5oCitsSjM8KFI/X0t3LV9tbyNQVDJrS3I9WTM/QGNoOENDTTNIVUQrUTxoei1GWX0/SlZeYCFjJHI0NCplfFdDTHY9YVN0UFNeQHRQYk5hViZjCituKlVhJUBnQShaXntjVmtEMXlQd1RULSkkJjlhZyY5elJ2R2NLbXk0TTUxd3lYKVdKV21qMzZuKlkoJX1pQFVAYlRiUUNvYVpSNm1aQjYmCitzeEpWKldDSG9MRVk8I2F5dS0mSDhjJVI2QHJoRUA8bG8yVmc7dSkjNikrSytMdj16b2pyfjdecCk3RmI8WiM3YWlBWkFEeX1zPkJJWGYoCitOe3RNTmBUUFRqSGdUaitIb15lakZKXj43NStZdi02NTh2YC03bntIJXQ0Mno7akp6NShDSVlWI2thQm1RVjZpXkNhRV89U2pecWlzeHZECitpJD4xS19ac0tecW9RRypIKjNEZnV5K0ZvbTF2RWlCUXRzV20mKCRGdzlBakJqXmJnVj1HcXoraHpufVZUenZMQTUmJUBGWmJ+SmdFc2ZzCistTyR1MlFROT1UMVFQZTRBRVQ2WT13U1h7WDA9R0RXeFM1RSp1X2t9d1MjKyl1dTY5TUQpM1h6e19zbFZzR3NBPT4tcWNGKFlVMk5ESz1pCitNKm9hanQhQTdBPUFjUShLWXBnd3hKX1EldWxkLXFpQTEqZSVkeEE1STBjT2h0VTNDeGIpN3FjQmcwJVZReFY1ZGBAcChtRChKLVlzMU1KCit5Qz4+RDImWCtrPEtCbUE8WH17JnEqKip5KVRTJERRPFkwKyVwdzA2PyRpfE1WSHVUO05jRkllRz5idVg9WSUwRjNLQioyJGM0RGt3TSstCitGbzs+RUtlU2RsIU5Wbz97WEJ7MEpXelNSOTNaSShUdXVue255UGVre29Mb2ZoanAqUig9d0w3RTg5P1k0KUw2WDdLaUdhKCU8MD9OfFhvCis+dWU+UiNRZCF+VmJwYGxKX2RIbmxZU0NxeDNQbnV6aWNrTCZ7fmo5eHZwazReJiE/dGhBMVRvK3ZJSUo/NjZTck0wezAyTGo4bko5aT1kCit7V1BTfHNLY0BvQ0pMSkZaT2BgRFVtJi0pWH5BMntLfHYlYDJwWW1SJDwmRXBXUVNqYzlIdUtKZ25sZUxxYShxdlRBK1R9Nk1zKHpuUjtJCishQlFXPFQhdkUldXVpQl5obSNUanVQKklOVj8pYjEwUDw8eHh9akcxfTN9UGdLYV8xbiEhflo+cDt1Y1ZpPTQ/XnZBZnNpQChaOGo1d3BRCitfeyo1Umh+djRscWd0blprUTxIX05FdzRwUFhyQXxHZkw5ejZBSGBhcEBRbVorY2o0bmp0MVUrRXBUVyFXPHgqN1UmNjghfSE4dFZjYlBVCitoSj5wOTQlZn1Xel8qYHZXSzR4T2ZPVmZiYEVDVCRlOGlTWkVfV0oqdT97JUY5diF7KntWOz5OKkdicXNKbDt5MyFxUj1GaXVVMmVVbUohCit7WlUreWU2IUNIQ0wjdjt4WlNwNz83QWJGa294MGFHT3wqTH48MW1AeGt4YmxZbGopY0REZDZaP3V7QXlUamFmcEVTayZiV1JtLVNtJEgkCitaJWJ7eS1gTFVzPjtWeCY5T2RMUWVsUVYpZXhwPDJ9SUxfJis/SjN0K3RSPUJ+Iz90YTdqT0V7blBSSnQlU3hsc18zZUVLWC0/eDdAPjdTCit8MCU/JD9Bb3JLeUExZFVgVClaR01MQmVMMVdfVSowaHctWlpqNFRzUC18b2sjSCUmfCtAPmZuVzBRcWA8Q3tfNkBOeGAjayF2P2lCKCNACitFPDU2Z3UwP1l0U2EkQnV3N1lUUlZ3QzJXZXRTM0dLUHBgNT5RUX1naXJSdXk0UjJpUF51T1JFR0xudG8mPUg5K3wlZ3FvUEI+e3JvQXxaCitYdnU0enJtX19HSmRucjFMMDszaypWOUFHbz5TbD8rRyVNak9OTUUpQiswOGk5I2tvTk9yTk95QWlKPmtXVzwmOz5SeSs0b0ZsQEVlLTRUCiteaj5Ebz4odnJkKHVFMDNiRUNre0djQyk9OyNTO1lwMVlPeTYkOFhmVktEPjYkVFlAZyg5RUYlPCFWVSZGTFc+YTJwd2ZhcSF7TyQqKWA8CitzdEVkUzlRLTJHRGJ4O1U4ZEZ0akwoMClZPyY4TkVpanh2biFKbWJVYiM7NCM/ayEjTEl3YjFuWVhsaG5OfiVZdzB5aGJOeTEzNVMmc1ItCitwe25nWG9UQTxUT3A7d1A3Q1lvRThTZGdwQyNSKjF5IWZvPlFlX04lNjJIWDRsR3MpN15fbE1UVT1Ee0tSTS1VU1ZLeXJxZ0UlQU42KHxICit6KE0ydWIlJSFiOGd+S2RgdWowcmFtVDQ9K2xlRjN9JU9VZH4wRWckRlNUJE18a3lvP3orckQtUnBePVRIWkJBRzxkPko1QVZfMVIwcUMtCitIIWBXOUsyK2JiPjFoUEQtX155P1RlIzxlYFZ6fHFybDsoOzlkZilaZCNTWWJqX0xQc21mVkI+QztMcXczXypTRjFqdj5MPlJ1bUthZ2BrCityU3g8dm01cU42OTI/bzZLWDIpNCoxXnJ9Zm5WMFEzSC1+eX0qQmNHJVVpV1BTb0BueXM2TCR9NHM0UjktZWttd3EkPTM5NllBSzU3M35pCismNU5ue2tgOSZoXzQ2RG9OY29RYVJVV1FZfCVEOClYZmo+eG9AJitHO3k3JiRqZlNvYEs4ZH00WF5yKylFRUt5ND4hdEQqWCZIdHpIPTl2Cis7bSs0M3pkZTtBTFUya2IqUHpNSigpaCZtTmlteSF8TlpVV2FFMUE8fjI1eSlgV1p6Km4kSjcmclNJbUojQTF4UzdvXjU5fEJ6QU1oRU0jCitrY0VAdiM1SzBsIWQwSjZEOTVAJmBxbTQwOG9hWEtvaGJ6UTtkJWtqS2QyeCVwOF9vUVlKTEVVcnBXWE5sSks+SlpOOXloY35qa3RfOUkwCituTH5gZnV0VT9reFhmRFk1LX5GMClESkQ5KzxEeU5yU0EyeWptKGwpWWRMZmxTdUxWQVlNMil4LWxTRyY0b2srREA4dn5KUjNleyNyMSlwCis9MytpNmFebjhtS0pePCR8WmtZUyZLOUUyZ0MmRDd0V287KUdpSkxSI2tUOD9aU2U3SC1la3lnWikwNWV4NyR7cmQxS3Y3QGIwWGBONDxiCitMOFNBbT1pMyFqTilKU19GTWYoRERmdFZYM0A+UiQxbyYobzlQUXlFMDFwSDh4aDF8dyUzbFZCRTRYO15qZnY8aytOMXBoY3lfcXZoQzhFCitWZSRrck43YEYzNWFPRGxjYkJgTWcxdHV3Wig+KFE/cDtRRUg1a09ua1FjK3piYjNkJVU8Y3l2cz4jKEk2RmlUPkV8JnVnKXtpc3ttbGBfCitLTz9PbE1iWlg7SU9qNkdYdEFAUWxzN1JraDNjSSgyU0FhV2FxOHIhQzkzUkk/PndgbUdjbFRoYWQ1a1ApTFdsdS15R3BVJjRiMiRDblQ1Cit5ZSkhUWA8NjcwVjRIbU0xe2ohNnNtMCZ+K19KU2U2KzFsQk03aCt3PitxJl51VFMmWE0hT09ZKVF8XlNAR3xDTXU7bz1ZOURPNTNJeXJhCit0NVlxdn0qVjF0YE9abUwjbXBzbiQjNWU0ZWcxKGNheiMteH5VN2t9TiZiMHpodWZnVGZKSUNadUEleH0zNXg0QXBGfEIpNSErTDl6TV4rCitmakRaMjdMdjE9YSNAUE1pSG99NWxyaEBybGthU3FnK0khdCNSMitrI1RRXzBoPlcocVZuNTtETiRQUTRLaztDVVJMQjQram5RIyt9Z1RsCit5WnVVfmt2TU96S2BvST17Pz13R2tFYGRvOz4yb2xAX1IqMUBWUkh1SkVjQzlIUGMpOH08O18kOWFlVEs3c3NILX40anc3c1hOKEA1YFE9CitlPX09NjE5Vj50VH1ZJSUhYm9abkRScDYwbjstI0tiekZPb3xKUjFyR2xReTYjTFQmXitzMkE0YjFYNV9HQTM4bEJ4MXhSbFQ7eUpwUSY5CitsZSpXJTxxRkd0S0ZGcG0zI2QjKTxLO31yeXV9SmEzbXk0bXxLbWQ4Z0JqeCFpMDAwbFBWYWtObz1LeFhmfW12WFc1KCZUK0FIJVNwTjl6Cit7XnJgdjM8d2M4bFI3PENUJmJRSDZfeHhJNDshemwqMSRLfTMmWjU1MHdFaD1BaW8lKm5NJitGUXE5ejw2ZHtTIyt0PiZPbUB8LShBJnlBCitRSlhMKDckPkRhdTFtVz1EPUBVYSglP314Jk53dnUwNi1vVCowWlkyZ0Y9TG9ZUCRLQ0pBSi11NG9yR28+b14yKWtZM0pgMm1ePCNKRzZhCitZd0UybEx7ZDdeWUl6d0RhMmFzb1dYeGFeUlBjRGRNQX5xPSF9Wm50ZUpfRnstO0xiQEZiXmVSfGE7cHF9Xkttdj47T2NpaGVTJD0yKDhaCisxQSg4bHcpfDxaKUJTdSl9bWZvV0A/S3BILVI4NkZ2bzwoRXlCLWIkcm5paGA9ITNiK0FZaFF0WkFfPEJUYkdSey1ASzM3TSlAfUxJN2UzCit0ODE9KDJ7REgzUF56fF5RVEtZentWQWVCY1psTWo+VHFWemNfOFR3NExxa2QobzNOVEIzWD5aWTFHOSopUzAqNXZGO1ZrXjF4YXhQSSpwCitnNGE5YTVPZGdrMHN8SkU3OyEhUDZMTkQoTkA9OVpHVjhEaTVgPHh9JW9qNk4hcDxxcT1IRFEzamYmO0xucnt6X0chXjwkalRhfkVXVU9RCitmM0I7RiNpXkRWI3w/aUUoK1ZyKHRQSnVVYm18MytaOW0zRGRBOW9vWmx6cnRtTFVRZysqRSRsZSokMnx8XmFYZmU2dD5BfkUhK30pS3JkCitTWFFARUZAQHM0UHRsSWFFKUpkLUlqWVBnOSt8P0ZEdE9DKXcrMThVRU9GUHRiVzs+fWNsMkNCdm1BaHwrIWIwS0NONSY+fXBWa294LURaCitjX0tVcShHRGxvZGxUWVh8UkxGQD1obUgqaSRESTRYfCZJa3FhX0YpQ0glNGN7Ry01KkpWIVlVT15mJkV4SSgrRyY3cHN5elJ4MXsqfWpZCitZezZUJCRkd1NJXj1vUX1fRW8tSThGSzNmPlJ1UHFlKEZ8R1dwbyhlP2ZYRXlRVWRRLTlgRjZRO053WllhKFNza2RpeTNgdzsqIXVkJXFACitpdWppKGMpX0ZxKnJWMzExI2ZpWD5PY1I9RWNuXmRLR2U0Pmp3WmVXM3h0KDNOR08ycSNETU5iMXpMbXVmVjI3a0hAS15DRk19YmNHLVAtCiszNFBOJGAlbVMmR0lIQUlwI2M3QWhHX2otXlZvKSpeZGA5KlIxTnV+OSZiVWVLbTVTdjM8YTlRN3RMcV5Sa3p2REMld2d6WUYlO1IxKyZJCit1cDdhPy08VFpJNStDVWNiJEAtanw5dzc9WHY3b2RfMSMwSVJrPCZHJDVhdmQ+Pms+UnQhK2I7QW9keFRvZDtTelEpNlRXPzdnY0hYfnB5CitscSFQKk07a3JFanNkckw5USFxZDckb2ZrWHhEWCQ8cklNdkRKJlQhJF9+OUwlTj1wbU8kNmlMOyoxPCMmQWc8ejMydl94bmtkRSEhQE8/CisqWnRBfnZIKm1PPWpxTClRYzJZMl9ORjxOYTQjTiM+cmZPSzFXcU44QDxFaDQkTDtTPl9sbmNRKnZQeDVYWHMzKGJIazNNem4xV3VWYmlfCit5KS0mUik1Rmx7TWJuTkhydVd2YjlwMnhXcTF5N2xKODloP3Q4QmgtOGZKaiY5XyQkKlNkJjRXYCpAJD1BbSNNVzVgcU1uWE9PVmlJemgzCispNihxKWptOU53aVFuRm9mUzdOd2tLeGl4THg4SDB+MmJOQS1WeU47aFQjNG40T1lLYWc1aFlRTCNPJHMyWiVmZlFzLWN1cU4lRzJYO0BaCis2YW08fSRJdGFFX2ZYPGxOck5eIW87S3J2UTszRlMwQno3ejd8LUFvT3M8dlNoYzgkYFVwMm93KT5ecj89T3hvJHV6WEx5d251JG1tZmFACis/TlU3ZXshKlRLZl5nSkNeQ0lNLTZwdChxN3UqNzVYKD8rd2ZsdmFuQnY3VG9JdXIrcX5SZGZjWTA7THJeKlRIUG9idmpqU3lnWlBtbGh1Cis3cnlQSSZ2V1pfPlJ1bmgydThIPClSclhgb1VXT2tza2g4K1grZ2IpS3RNdk81fSNzbDJnfnNHcTA1NVVlViZZTGBeJj9eOHIycWVLcGktCit8JVVXJjs4Slh8WERqYmd9QTleaWk7aGs0IztVVnFzK0NaN3l7LWt4VW1tQSQ8YWdZPGlDfjlgOztDUClMK0dCZComKmYjSGB5aV59blJiCitQO1VCYlRte3hpXykla1d9R1BjI3ZwJT05aWZ7RX0mby0rTVQ1UEZ4O0ojKXNlR1FKeGdJOTIwcEZaOzlMZGZpUWA2YjE+Y3lnRD5XPiEwCitAWFg5M1U9PEFqS08kajlKK2kkOV54RChPTkx2bk9tUHhfaisoclg/ZjtAa1kjI2hoaGVhZHsyR1hUJSRQU3RWOzt2PXtYVVNEUnMkfGlBCitLdjVUekV8JmxLOClZMjQ1IyltV1Jgd1MhMDh8OFhkanV4eD85dSRjX2g4SUN9fHM+blZxLTRMKjQ1TSRyezVOQ3IrNyRpcEleY3BNY2gxCitucnY2eG59Zl9BYEk+bFljODwzNVJ2UCooPyEhfFo1ZnRxIT53JEE1aVJMdTZXJUMxQjlASjVkJUx+NC1MemwoM3oqamMtQD4+WENCSkBrCiskPittUn5IPU1EKHJ9dStUJjVoc0dhQ21WbjItRVpCOUJVRilkKU5FNlohUW9DZ31jc1hRdW4lV3g1d085IX04JE5VKyQre0t5VnBlaSFqCitxfGY9KFJYX2V5QDEqakFeQEBgQyZSb2tgdjZ2RiRBR2lxfV9xM0dlV1JLSnQqYkkpZ0huZDNkOXNNZmJ2PmFPOHlINjdGSD0rZ19CczFuCisyVG5AMkpRdnMrQW9PYXYkRHZ4LVZiRTh4Y1U2QXZhdz17cWhwWCljIWgtWlFyYldqczVvUTBUVipiUiQ1OCFsfjVqeGJJRitWXnNucW9MCitaSnxsNk9rYXY8TlVPNCteYT88IVYwfk5YJSEkS0wtWHRkJWRhSEJIUz5FdCRsM2V0SWlXKCpjVTZIaUB0T0JMQGNsVHtGcyNfMHJ8TjU4Cis5KlV8eVJWOGZqO1ZCaEYoUjFUfFVxXmFTUXUhckRiMnJ9aGcxWG1wN2ZrQUY2M0xPSUFEOHghZF9iQk1AUm1jYkw+V0YxNE1jTDxNN1pZCitAeWthJT5lUnp8KSpDRSNQdTwoP3BVYkBlfHZ0TVlVak5zcm5VeDBkUjdyY15pWk1OeHNGV3k2Y19Ye3QxPmItYkx0O2hYYjl1b2koVFFmCitSWiZ8UTtAfDYtOH4mWG1EYDtEPT1NSWN+ajktUm9mOTktMXVnNXBiaTZPKWRXa0p0X31fT3lffiVVd0wjM2B+ND1RSjstTFJ4Yip7ZHVZCis9Xms7V3JPaDk1ZypyTXtiZj5Wd2piKDBAbEppRkk4WXhTRT8pdHFjRjE1OzRxKX1jKTM/aVBvRj94Y3tBUFZlSmxHcmI1UWYpSzRQbTJtCit5dVAkQzh9eGRpP0dWSnstYl9hKjFoSkk/VGNSezBBeHJ3QVVDflZacn0wXklaPXI0TDYlcDtsKCFzME1aSzIodSE3fU56d2k8WVhpeDhZCisqazI5PChHd3xxR2s8Nmd5fmZrbXI5NXpaWmBkST4zPjBqbCpIPj02JmJMey1vSnlDKDJTO31LRWslQSskS3s8b3ZUQChXM2tITk0hdm5jCismJEAyTzU2cWgkSit+YjlwcX1UYWhldF8tamZweno+QyVlS0NgN0N3X2BGNHAjTl9JVlQlNDhoZFpyPFoxa0FvXlpmTWU0JEMhWVZjZ3ZlCitxSD5LQmp1RH12UGpTWEMyUCk3filETFREQSZ4WDBVbSRyMylVSiNUPGY0PTlILWh+JkgyKT0rb19sSnxISzVfKW1WKUNYY1dkVkF2Ny0+CitiblR4R3g4RztOa1VqN1ZCQ3BWNm03LU5JaFVHeCVTJkp5Yl9TdWE+M009RDluNVFGMjZxTXk4R29gSElEIXElI3ZKTnh3RkMwNTVzb1BHCitJQWdRNm17WWM5QntUfUtgS3QjdlM0VT1zbzFBfXl9IWcrSEQ+aSpHdFgqelYySiNpPk91Z09gXihSR156Y3B8e05LeTNVbShjdz92Wl91CitfdUJXcHg9RlB8N0hFSkptaSFmZjtDWVNtcTkjY3RZNT9ASCglRHl4RztKUVYqblNqTyo3Yk41UE81eTtkLWw9KD4wKjJDMFFGKiE/MllCCisjYHRJPz4lYWAtaWttcmRfb290QFVPPVJ1JlZHTipGNlMrSk18QWV+K1JeRT9qblZIbE1uSHJvUVUza3BYK3B7RlF5QXBaeEtDV3J2OUgzCit3TDw5PFZrI1N2Y1BBPXx0QjJYUWgwNT0qO2BtTEUtQGlVITFGVXQ2RFhDci16ayVjbkRDKD1TfE9pSFVhOCNkZEZWNCpTP289c31tb3ExCitIc0c3MG1Ue3hfOypheENuKUZZTnxzJXdOczFVX1RAPWdFNms4cEE1QT1fd0tnLSQkKUlLTU1BU0NJbkBSR1gyaFFVLXpxUCtRMyZeOF8qCis4aEZfTyZeWSY3Ym5nbHV2KTM9d0dJVEV1biVLSCpLKiZ4JGp0KDZIPGBScmNOcExpM2V+Ukd3bTB1IyErNGd4QHprJm4rKl84bXlyYDd3CitwMWJ+bTFNNHJkezAtZyEpT1MrZUhUe3dWan0lazhING9pa24zaTZTNHZyVlRtKnBkeEMxUzxnb1Ima3d5Xm96biNaK1VJUE0lKiVyNClFCishM2FoJW1GQXFicWxzRztOaWpweHtwUEhNKWFFUzVjYXJxcnM5KU9XNmN1JUN0LUFrYzhlZHZxKDRLZFIlKV5ie2FWI0NTcz02YXY3JDImCitZSE9hX3RqPihrM1BtQnp+eGNgQ0s/MzRZT31vJT1SU0pwTXlAZGtuRi15NStoMzJhWmQlZWQ5TWUqTDEkTkRqfjQpOFZ3dypyNE5NNWNZCisxaW9GQj1SNlRNZyl6NnE0QHFuO2ZFZkladjtedn5yRUcobFJWN2swM0kwP3Bib2hPJCV6V29uT2M2UDxiVkZAQD9ObiNeZHAkWihvMV4oCitYUyU8KEolaH0mNDw1IXtMfFphfE12TDlue1ZJJGcpaW9QJm97fEYtb0U/ej1FSXgqOUE5YnMmNnwmSnpWPkBZengoMENja2pQeyE8WFM4CiskWElhYFl2fmJnVntRdmEkaDVPZEMtIUZmV3VGb1I/PH1SbFhxSXNTcDJlTmE8UU1eOFJfT0ZuI0RMb01AUXJlZmorIylfV3RwJXlCX1liCitvVm5YQ0B4bT5LJl43VSZ3e1M8SiZFRlFPWmJEVEhnQGtKb0hpMjRAcCk+Mn07M1oxTFNtUzQkJUp6cmQ7d1lWWmBhb1Q+PkU7Z2U9eGNrCitNZFAqPUlFVH52dml2bV95fmpFY0FwYUIrPnpxVCp0NGdXMk0wbzVqcnglajtXRVJqWTJ9T1khWERyMGVxREUpSDJPPzxEYW80clIyOUlACis/OGc8RlpoZWZ8eH1feWJNfVpaR00qIUc1NHo1bjBhWmVoNGRibCo4LXZ1N0MzQXt1QCsyV3ZGOF5SdGpuKmc7MUpafTIqVG5fKCgqKExBCis/PlEydGVgbG9gJFl2SF5eMWNtJVhebk4+YWpSfHUpTTNzOHpRTFFVS1Y3N3lxMEF7NnhBJHQoU3B7bEpOWmcmUXVvVVMhTXJYcz9vITxkCitKJjVXVEAlU1M4VVBLQkRGTFlzQm1SQjM3M2ZVY3RvYXdyNXJfQFZoJCR+QT9VZHY+Y01+d1pkND9LfTJJZk5jOUZNOVN+WkdnJExWalVFCisqNEVLcloqTGBTcGQxKStSXmRqNns5d3hNYCEkOHU9aWNuKF83YzlNQ1UwbDR8cjkrOD54WF53SiZ1dn0lNUdkKkg/aVgxPl9icnUtX1pXCitNdHFGYWNuKzY0KCk2bylKPm8+YFJNRllnfXFZRiFKJHR5SD04bSRIJEI/UzdGSlpaY2I1emgodWtzVzY9QWc7aVchPWRlN30jd3A2aGRCCis0VHNnKyY/ZHFKKD17dlVjcXYhRGFDKmBLNSlreUw4PyN4bDV1V0hQSjhrZFRGZ2FIZlg3WkRlUFVpakVmNDlDMzNzIVVOQDNLZFdJUyN6CitIRE1+NTVWI302dWl5YnVMJHJ+ZD1DNkNQR2NgaGQ7YCFGVDxafU8manhpTkAhV0BjJFlIeiRtbntTKkBxPGd1ZntWcTFPTDJtRnd9OCRDCis1RnQxKTdvPkU4bncwPVYyWiVURGopSEpJbypUamU+JH41Um1NMU13VEFzOCNYP2ZEfXF+JUc9bGFfO0w0TyRGWjN8YjZZM3xqMFdEPiFmCitXSjdfcypJY1BhKUljWWcqSWNZZypJY1loMCl9K094I2lZZmUjaUdVU0pXQE94b1FWKFd6SnNFeTtMTGIlNUlaPVM2ZFhKViR9OXNTOEkoCis4I2E1MzxOZzV2WF9HKDR6TWpwdjM+NVUlYndYcW1LM1N8JS0lbVB5TmBXenNUZm5MSTBMUU00I3A2ZktHdGIrMjJvWmJpJFlXem4pfFMrCit1LXBkQ35Iczx3ZVZqWEktP29YbVFjdnE2SVE/Sm53YUQ9TyhDazMlRiRmZ28ydX5wZEt0Sm5GQCteZiliWFhyWG9QaEw4S0QrKkA2RVkpCitFNU5CMENEVk8xPGBOIWk+IzFpNEtrJHh1bm1COWtrdHkzUntfSGRBViVRMjJWUTdeeCZzcyhBZWpLNyNDXz5KQGxeTVZ0YmxGPGYqQkNPCiswTih9RkV4PkY2SFZkIz56XjROSTU9ODRra1JKczNMQ19qRXEkZnp8ZXZ1Vnx5Q0MhbXFNYVo8M0IzSGticX5ETno9STVZelFELX5KZ21UCitEMl5AZ0hURX1yYXlBO21gWFgxbWJaJjJKQm9jI0BzV0NYPXRMNWV1WWdha29va08mTnQpal5TTVBedWJ+c3M7b3E/a2Bjc0FNSmpUNi1yCisyZ2JicjhjZj1ENm96NStCQVY1b287MT5oISM7RFpvNjJ1RmprRj5wNUd4YkFoa1NUfCZhM3ZoI0xuMVh3MmdJclFAe3hVZGM5T056bkchCis+TXsyWDE4R3o2QXg1TDc3dWY+PTVedHk1aDZFMVFCNnlmbklQKkg4P3ZOVG9Ne3dtbDQjejJQST5IdU84ZjY2UEFoc1otWitiMCNxNTRgCitOejRGTyF6Rl9GOUppXkw2R2hibElCNE1ETTshRCpHfmpASXN9e3tJSUl+USgrO3E2YTE9UEc5MVJaRyNKTWohISlOSiE1ZzROQ3BhZTk/Cis7MEtBfUFpKV5tJlkpJkhEMkAqNUZNflM1QWQ0Rm1uKzRUaEwwTUx1YCUpWnltaEttVUFxNX1nYCt8ZntrUWZPdjc2R15xVX41MXZmPjx3CiszcnZPM1dxSzRwcmNXQGEmb09oNXlAb1o0Z0FDJEhSTVdhRDZYaXk5cVJOZSl0Pzt2cCtQXypGcXt3JnU0WGB5TzQwM2JuZWYxSkRjNVRCCisqe01RU0s+Z3N0LXZlSVBuaUpPcD9Aej9jQ0sydDRgVktBenlIVlpldDEpRHk2cDgyaXUoS0ZkcFJaJFdWSUR5Uz9FRHNGP2kqYFB2Z2BXCisyc2V0VT1+SCRZPSlIb1BiQ01tP2sqUjlLPkMtX0dKKEZFWnJ9WE01O1ZFUTVjLVkzcl56JnJgditWRlRwdk1wZDNEY15nIyg8NU5aVHlLCis3aTghSDt1Nm1QMnNiMnpYJWNPKWdaJCUlT0BhN3F6RDNKOGohZEU2YS1PZjVTO35+TFF3RCZscXY9RiktbVFpLXU2cF55bW5CYjdGMWRWCitidjsze0JCO0whPXdwQnNnTG8+YVRuJm96ZzNeP3JiUigjazQ5V14pIzY3PzVtanZ+Qkt8eC1TeWI1WntmJiFAXmZnNisqMT81ME57WkNOCis5Nkk5aiZXaERYQTQoZHBQTntTZiFHRExpcT9pV2QtKUZMUV4yK0FJVWw3WE4rQVZ9Pjg+RD9le0FFZjFqb09fVGU1MGM8UCFhR1FGJEptCishcDtqP3RWJFBYI3ZBUHBPMlYxcztXa2p4QkhqWHwwKU5jSUtFekpSPzNgSnluZCF3SXE9YX0jc3g5ZWtGVEFUMU41VFl9X0R6KX1QSjlZCitFKVI5fHQlJFY2Knt5NFFPZFZMPDcoXmlEM2hMOFN9aXlpKGRqcDN8THpMJUw0UWpwcyM/TTFWQWM0UDYwZyVQKFRwSzIwPzQ9RSomcUBHCitQbUJyWFgkPkM4amckd18yamBCdkVWI2RhTkh7PnhDe3lfZzNgcEd6JU1NdUR1PDhBYTExQ28xe0MqfntObDU4emxhWGB6Sk8mMCl2N0BTCitVe0huPHFfbCRzUUlKdnpAKzNobkFiYGswOTIqPnMzQ01mUW93VUpjPjMkSSUmYkBAa1N9d21IJkdEeEgmPDhAfmc7KEEqdnRKeEI7dCl3Cit0Ml9MfGJJcEA3QF8kOGJSMkBaRyEzRj81YjF5I3tPVTJzcz44SSpxbmxAfiRjRygzRyF0e0A1dCN1ZDxsU2xpI2hYTCQqWjJMdWBVcHJBCitofSY8X2dxZ0Y1YDZ1MENMJUxGSWY8Pm1KbXoyTm1sPFpGZitxOW5faHsrV3JuY09aU1VSTEd9WlI2KT5pTnFYWW1VLX4+VSFFfnhHZTNMCitTJmB3Vihoa3M0ZmVOdjRZSGJ0bktnTXZ2anxSNkRqeTBPQzJQfGYqZShsPE8jQWdMN0Y4PG1JTWVyQWVSQSQ0NDZeQ1JEJEdMdG5LZ012Cit2anxSNlNPfklaOSQ9R2ZUNGx7KFYjI3lPakg0JSFZe316LXZLcDUqPUE2dThQc1hVe1VzMGhFWnJ8TU1VYGV5Un5lTDQxfF5rMjY9a2VWCitrNyRseVFUIU53bH1iNGBORWFuZEt8TXNReXlxOWNnZEJFfEpfJiQka1RESyYwUmFGR3ptdVN4VEV8PWQxbSpWMT1sITJfZkduOzNXZW9UCislLTdoamw8eX14RjduSGdNZz42Qk5PT1VQJVhuIztHNzhIZEFyQz5uO1NpbkpwQkNudVFDU3V6Kys/QUswX0EwMlYzZCpSMEdPRDFBRHlYCiswZUUydG5YMGFeO0dxPUZLdDMzdiZycE1zPVprV2g7Xz8oeVE2UCUwR0UxX2hOc0xBZ2tQbiF7NWd4U2tSQVllel5JXipsaXBQZiVWSDxtCistZCNuVFQhUWE5MnBTQCVpQnBYb1E/V3ZWd1krcGx+SDlUblZhREJDR3xwYyFCQXJSd1NxcDJgV1V3Z0ZmXyZVbFI2PExmQj1LMiErUy0lCitWOG1WVU1wVj81Q05ue0F0KiUlXjZFaCpKVislK3RhfjJ0T1VQYVpJbCE8S3A/byFERlBzNyZnWH0/MjEwb3ViJWd+P248X21yRFExPFRxCitYN01aX0E7X0V1bmUhbEQ5Ji1QMyU4KXtHPEtmcWs9K2VWJjEyUCs9eHJlP3A+NyQ0cHp1fUdhYyMlUHArZCo8V05KMGwwK2FNUGo8ZHVVCitJYWdnV0BhPEBUM0hifW1QPVRHNW01cTc/bHVYck9iTDFzMGB0T29oaUFifWRCT01fZiFrT21EaHBneyZTJGFlK18mTEU+MXEkel84V3NyCitXMUpCZiFRKCl9V1hXRXEzQlZ2cXcyR0ppb2pGR3hvTyQralJ6N1VhbCtke35lVjNsZCpKeCtfUisjYSZFfEJodmpNZWs4QkxPR3ZQTkw4CisyPGlRM2M3RUFnZEgpbTRjKkVrVGVTTk1VajNPSVd2YmQ9UkxwcEMxaFUkKUUjNzRmKCVRTHE2bV5KTDJATlh0Xl8laEFSUTg8THhUS0FrCitra2xMODleIXxhdno0cDUkUyQwbCV6Qyo5N2QzeDJ5emxaUDluJWoxV0FZPj8rXyN2Zn19IV9SMHZXREtgSjNnQXc9JVd0PylzKlV4YkteCitMNjlOeyk0PkxacXpHYSZlJjNsNXJVQz1wMmpEKG5fNXJSQkFic1JAa0MoJjcjK0czQzBKI1VxSndXYU9CbzgyWTBMY1Q4OWlabWBTX2Y9Cis4ZlkxU2k0JHlQZEp+Vn48QGU8SklmSWJLR0lpU3hgeTZQKyoycyVLfDBlWVZMRlVBKUg0TzM0Qm1wKmpxWit7KW5xeChnc15qPFhHOFgxCitqJitGVFc+UEU7JFlHdD9DQmNRJFVnRlducnFpe1NBJCZ9ViFlblN3fE1MXj5lUzBnKD1mYlU+czdBe2BMdkM8aV49Pk5HPV4lM2tJQFVpCis9Y1ViYnpHO0VGRUMhRDhLQS18M25gTTdIbTNUKCpjX2YqbVNfODExMjNYPjhRO0tAR1pKdTFQZUFEdTwzd0oyVyZjRSgqY19mKm1TX0ExCisyIUc3PjN+aGd6S09+T01YRzlGPTgxMzd7VVRpZT5oTzlUe1lmWndLJmI7dDlaPjNrUVV7YmVwd3QxUzRrJmQlc1JLRzRjWEF1d3FXZVhyCitwd3QxUzRrJmQlc1JLJEtRMGpuRTJiNE5ZQGQtUlkpZDh2d1A8NFErPDlnb1gjVi1MPjJkRndnKWQ4dndQPDRRKzE1X1FMPkh0Ki1zNShICiteMGpkc0FiJTNlXlIyfG5ZYT5iQTZldnU/bF47OTA8KWQ4OyNjeSsrNTE3MDJRPlZRYFZ5Z0lJKHtIM2tVQz1hViRsel92fntVVEVrPzB7CitUUFUzS3R2ZlVnNjU5cExNQHRlQmpCbjJ6QDZfKWkyMVROPkJxbFE8MEJGWDlCdDRwP0A7dklCLTRGemtSfjJNang0KmE1PjE3PFJ6MDFCCitNK2k/MHtqJXdmUTcmTGlkWUlUYG1QTzE8TVc/Y0VHUiRoOC1+TWZNRXY9SjdDeFchd3dqQnpfMF5gOXJ4dUZfeXlmQmtfNXtSU2EhZyYxCitCTStpPzB7aGgzX0Q9aDBtQn5RXkFSSUpiXng7REdCTGYyP2xBd3xaXzg5ZHdHKm5IUTA7OzVueE8zalo2YD1PTER+dEBQTE90anY9Z01BCitBbmdRYz1sIUtpODJ5KDdaNnwwdUxFOCExUFNBRk93aUMzU0FuZ1FjQ3JDUiUrNm1INWthbUshNlFySGJeQiE7ZUI/O1B8PSRNM1dDd3gyCitNK1g+JUpfOyRqIzZSdz99cShjYGFhNjZ3aV5GSnJlP3pvV1IqI3ZTWWtVTjNnM0ZKOzdjUnJuck1heENZTWEjdGw3Y0NZbzdBK1BuN0E8CitaK2lzSVA+YXdte0dmIXFuP1A5UyN6eGY5NXBLPCklYEN2WkVUb0AqLXBubHd3QUNDJT0qa21Be2RiU0k9Y0E+OWUtUERwb3BKZlZFUXFJCit2bGYmNU5oblpfJXUxUnk0YyliJjYqYitAMFg9MWF+TDZKSGchdj9vTSFiZzFaeWtvIzVeU2NQRSVUIVEyVnZQQjNAZ1V5NndsZUBTcTZnCisxWnlrbyM1XlNjUEY/eiFRQmImUEg9YUV5QSN9PFZEMUVTUGVTdkFiPzA1MmpPcCV2NWg5cCghbl9tYW9pT2kmY18rKn1WY3JTelBNQ01YCit5YzZifnU8bkYpQyMqWn4hez1ELT9pY3hpY18rKn1WY3JTelBNQ0xrdjx1VWdmYlJyK0MqVjUpLXdGNm1mT2o0YWRMT0Y5UihIUzE1OHlpCitpLXdGNm16O148XjZZIW1ZPyp4MSY7NXp9fDNIVk47a0hvYElvYTtQeChJe3JSYCRjfG1QNyp0aWZiUnIrQypWNSktd0Y2bXo7XjxeNlkhCittWT8qeDEmeiZpb25kRilGSUcweHBEUVVteC16O148Xl5SUTQkQypMTyZlSVBkPUBDMVA7MnN9YUgyPzk/TGNwZio4cUlmb087fWVeakFuCisqaSVDa1EtMjswWGR4NU97Klg2OWs/aEBDMVA7MnN9YUgyP0VjJTd6JEpUa3w2S3xmaFB6JkxFczRqUFlgJjV6IUw8WEFuKmklQy1nZ14tCit3RkxyPXl5V0JeU3QjQSNqXj9oUFV2Pyt6WjNlTShDPnRQQy1nZ14td0ZMcj15eVdENlopT2Q/fVVDUSlIfX56dzJ1TXFldnVtSmNTNjR0Citga20xNGdubFJWSkU3a1J7WjhuMkxjYklHb3pVLXVla2FzQiYpY3UyY3M4Tm0zSD9zIWNTNjR0YGttMTRnbmxSVkpFN2tSe1o4T2ZMY2JJCitHb3pVLXVkZ3BvailmQ1NyXmdFJjczSD9zIWNTNjR0YGttMTRnbmxSQkl8MUpiXylmcmcwPV5VQW9kRUFWX219Qm1YUy1peTE/SFc4a3c3CitfN0M+cD9iMD1eVVFvcStFSWQ/KDtMMHBBSnVQSm5qO3ltUmRRSmErYWEwcEFKdVBRWjc5eUEjfTw7TyshPj1nQH48eyp+clAzeiQyPit6CitJQVJGbjhYVTdHaF8rVSEoQHlvIzVeU2NQRj96IVFCYiZQSD1hRXlBI308O08rIS1DencwSSt6SHsleTlnZWArV2pJbWtuVihaQyF7K2UtCiszalNWSmYoem1DIXsrZS0zajUmO3FafWBlVGZDajI8RW9tX0RqLWhnM0NVVEFERE4teWM2Yn5Gejx3VUMoSnV4LVU7KGduMExhdTZWeyF1Cis/aV9LQ3hCWmZZY18rKn1WY3QxPkYhQlRRUE1DTVh5YzZifkZ6PHdVQyhKdXgtM2pZWFNhKihIV1E5NUhldnUhVGNZMUZAYFFpdT47NXp9Cit8M0hWT0hjTEtmPkBTVDl+MWJpcEpJfDFHfkg9bzNrejlpcn4wcEFKdVBRWjcxSl9ifmcoQz50UEMtZ2deLXdGTHJ6O148XjZYMlp5QDRPCitGKFVfYHJMdjw9YHAwcEFKdVBRWjVwejd6MUJmYlJyK0MqVjZfLVU7KGdTYS1zQDZWe3pgJE1ZRGA/aWN4aWNfKyp9VmNyU3pQTUNNWHljCis2Yn5GeipFWUNTaCQ3X2Fefi01LVRQVlYkT1ktOH5mUylCMHU9Y3NiTis4VmN6TVhfV0xLd0EpbyUwSzlDIzBjTEtmPjtHRj5QeWYzJUhlCitzO2dlNTh5aWktd0Y2bXo7XjxeNlkhbVk/KngxJjs1KC1pa0s2I2hDdmpteXk+bzZwaU9LQUtqbHJBO0Juan1IZmJScitDJThNby0zamhhCithQ2J0dTZUK1BrP3Uya0JnZ2ZWVGp+QmxMKHcmZypnbWZwUUowYVooPFczLVcwPVd+Jm94dHFgWlYmZSRnZ1lWSjNFfEhCJWNuNHpGQTM+CitSTk93Wkk2VmpjSz91MndGcSZwJHEzRiVIcWNTNSltIWtyTkFnbTVRPm4/byUyT1l2LWl5QSN9PDtPKyE+QyU4TW8tM2poYWFDZF5jNldwCitFUD9nVm91bV47RFQzRmdrVkZaSVZ6Y0UzbXh4STRrITNHUG1DY1k/YlUrQDBYPTFiNjUxP1U1aWEzLWtfcnFXQT1PPWkyQGJoTyt4YmteCit0V2NfKWZyZzA9XlVHbyM1XlNjUEY/eiFRQmImUEIzP1p4ZjlIdFZENE9Uan5CbEwrQDBjWGVTVUN2ZzFaeWtvc2pOP2JTST1jQT45ZSNQCis2JjVHeEQmI2k1YmoqTlhjUi0pe1VTc18/Z1ZsdGtVSyUhM0VFRTNjN243TXFANXRgMVpnS29KMy1uQihvVD9lLWR+YzZxM25KVUJHN2glCit3aUMzU3B6UT4wQ3Vsb0MrNm1INWthbUshNlFyRlc/RjRCakcmXkctWm8qSyRCdmQ+N0hhZl5qTGJjUDJMKDM7MU5nKFk2WCh2Y0tMRH50CitAUExPcyZ2bEUofnZGajFCaz0tdnMxbDNOY2MwI28kU1NDVCszRUVDKmJeQHsha2V6XysxWXs+NUl8MTFWJGo7YnQ3VXJAME1VdWVTM0MyCiskRmIlTClHZTRYSnRfISM1e1VZK3BqZ2pYbExJXm9wYHVnO3JTVjs7TC08T2cxekBhaENyQyNYNj4pZHtMalA8NFc7Nkk3amA+TiRNXmEtCis7cVNPeV87K0YtRWNiTVNjTCgzN2J5WGJpJD8rRVMrSEsxV1BBR0l3OF50aUIzcCNMWlRCQW9zajVebyVoRW1jRTg5RUxePmhUMzZWflNiCitWOClsPDNRP2doOyV9djZCMzx9PXU4akVGZkhLZHlmMmw7OT07QDRJPkZLam1RSnZBZn42Qklvbll3JU9YdlBWLX1FT3NMWDJTMjM2b0JrCitibXIhV244Tk5DQSVhYU9ZJnYxbjM3YnlYYmkkPytIbDQ4UGdpUi1HSUA2bSU5NGN4RUZyQiZjQkFDTU43YUBYOEN1fS1sKCtRaFMqbVQwCitDNkU+WiY+NFoldVkmeVp3MzY0JjFiYl9OWl9hIUtwIWsxeEsyYilmPiY7JXdYZkk4RWA9bmRgdnEkNllzTn1XKlpebENncUNReDxlJmM5CismKmQlT3IxczUoS18zOTMjfGIlTHJCUkdweWUxWFg3YHpzT1lEOD9wcWRQRWQ4YHpOOEtWKiE/MD9weX51d0N6THYmKUNyKFkwQ2ZWVzZGCit7OCs+STZfSGZJMCF4MzZvQmtibW4hPkZNYkpaSSRfZlpuQC1xdCFsbn44b29NYjxRXjJNWkhsNDhQMzM1I1VicG9hbkZyRHxNUEZURWAxCitXK2V7SSRfZlpuQC1xdGZ+NkJJb2U9NFNOR0MpKEE8K3FtUERwZUBxN3hGR3dLKmFkP2AxLUc2RCp4ej0+JHRCU1VTUGQzNkBUPGJiX1Q1CitFUytISzFTdSF2RmA8VkU7Pnl9fXVOYj0/Rk9ubntGPkUpISY+aHlaRVlzPmY4Z2JIPXNaVWpUM1hqc1ZyKUF5YSNWLUx5Q29ucEooRnUmCitzQD1IfkgwYGRjcVBLYjB1cSFTWElrbSFVJkNuUCF7KE9HJHE3cno3fG9lPTRTTkdDKShBPF93dlBLYX5AcVoxZ05LPEVUUUNsRVR9JmsyCis3e187YzMydFF4RDx7VVNlYj0hOFFqOTZIT305cWIkLTAhQWs9SSlUdlg3bkpkdWJIQz4wS1hrRDNXTFVNQTFXVFYteW82MEJZJnYxbjM3CitieF5iYl9UNUVTPXN1ckJleDtQTUNEVXEhVDhjX2EhSjt3ZUkpTzNINUokOT5EQG9DeEFLdSlDcilAT0hZWDxmS24ldkktJTRGckIzS3tVCitjMF5vVGh7JWFldzV9MjdKeGJkKUNyKFkwQ2ZWVzZGe0E/PjRaJXVJNkFANjM2NCVrYlk4Yzhxd1h+IShnfjRIaDsjeUA2QndQcT1tYlY1CitGZ2soSjM0fjZ5cXB9QnRQOVN0JXpRfUZnc0MhTGRiT05JajdAZmZBMVYkJD9JKVR2JWo4MCY1MC0rTktvan5YV0xNSVM5ZnpXdz5uS1R4Cit4YCRlMzkoRnUlQlV+fmViNkJzPWVYTll0e3EhU3tZcURlP31MWlRCQW9zajZmWnU+XnZZZUorR0JBcFFGZ2goZWFJeG9lXnc/VUZGTVchCitYR2ZZMWVtRStCTmxwOX10NiYmPzZCVFEzRU5FO3d8LXAkaVVPYU9pP1Y3YVkzYSY7QEBrXztiT1p4cDw3OVhtLSUtcHhOZSNuNV4jaXIxCis/cDZ1Sm1LJDdEVCFyKGdsJCZoOyVgdTNuRT5SPW1KNik1VzBaUzElJDVxJVIjWUwtUzY7cUhRNGtxPXdyfndwYnQpPHFaJGU8VTB+P35PCitCWG8wenxqU2NFXnVAYD8+SzxFKjgpb3lTaH5RezEocShiYmIrTXtFTH4zQHhNO2F9O0cjdikhan10TF9+QE17ISFtV2hMQ2NfSiZAeU5sCit2YGt0aUV0OGY+JWo4KX0zK0ZkIWsrZXUhKUlHbCE+c0dXWlN7NXlmbVBOfj1Xem4pfFMrdS0oKTx1aHA3OGZscFQzb2MpXnxUbko/KVJlCitRTU4zY2dnXypHYTlheUArKGdsXy11eWxjPzNvS3BXPW1KTDxJSiZebWI/blE1RmlJfjRtTSpZI2Z1IyM5VTB+P35PQll6V3p8c1lnRXtPCitEbXJ4ck42enxqU2NFXnVAbXd8JTRUd1pQSF5tTSpZI2Z1IyM5VTB+P35PQllkWTtsQzdFeTE+IX1qeEtPP2Z1am8/VUJeRDtnJGUzQDVnCitvOH1MOFF5YCk/UUQ4cjc3NVMhS01vflU5am5iTyY0c3NWQTJKWEV8XyMzd3wlNFR3UDRjKW49YVVOIUtNb35VOWpuYk8mNHNzVkFGTVk/Cis/P0kobmp0fWU9PmttR2FvYWNRVUpIQyY7TnlaLTcyWn4xZzM2dGBTSWBOeXg4aXspcjBHWnlCUGV4MnJ8WT02NXB9TnhyN2tGU0w4JUtpCitVOWpuYk8mNHNzVkFCUGdGNCVPenJWQlAqRnpKRng3dTJLOWVRNXlwPCl2V0wxKURDfGJpdCt6SGVJbWtmPXc0fXg/c308bj1hVU4hS01vCispVGA9aV9OZiU3b2UlbWk4Km1TfEIzcFFQXz40SHJjWWBTMzYxKURDfGJpdCt6SGVJbWtmPUwlbHg/c3xFZjJrbSpyVGF5R1ZBQlBnRjQlCitPenJWQlAqdTwzJEw3aV92PCgqPklAKm1TfDkzbnBESz17azNROUBFbk9Bfm1xLWY9dzR9eD9zfTxvMzdLRlF8eUM8MCNGeCN4JllKI3BzCitzVzRMakRsPGMtdD4yRDBNLXAzcmJ5Mz5WaUBpbCk5a1ExKk5XQzslSngxNFhDPDYpZGl7XiVoN0ZLalh+KnQ1aDhlWCFLKHtpVUdWQ0hSCit+Tmp4O01FMU1FX2lqcHN8I0t8ci1RIXloaTNhYzgzdntNTVRtZ2IxKypAcGItfTkoVVMwNiZmPiMmM3k1UTlYdVAlNlghSyh7aVVHVkJ6CithZ1ZxQ2teKXtBKDdKJXUxKypAMkgtb0FhPGhtZiYxLVVOQmJwZnBsWGs5Py0wJExaKXkyZzJyeEJaZD1VS2h+MWZZIy1nSm1QdjU8aG1mCismMS1VTkJid1JFUmEkUyg/Zj9PQm14KipweiN5I0hsT0EzTnI1YlQwbjd2I0RpKjlFeVEkYU8pazN2eWpodnd+YX48aG1mJkhHRDUqWTN3Citme3o7MU5FJFEwMUo7TUUxTUVfaWpwc3wjTFRAYWxxQm10WE9RND9YQXA5Y19eJSRhUmZSXlZAeiY0Y3s0PUA7WGE9P2dDI0lfYDFOPzEtCis+cnViJUMhN2R8bHd7MCQmJlN5MT5ecEhhRWdiYmlhcmI3YHdwTzEtPnJ1YiVDITdhJFMoP2Y/T0JteCoqcER4aH18Y0w5UHBPVTFNYDIzCitgRjtmQnRmdFhhJFMoP2Y/T0JteCoqcER2QFcxXjBqJiNZVHxuemUze2pCbGY/VWBBPHZrZFBteDVweTFpSypEMS1VTkJid1JFUmEkUyg/CiteNlBHWngmXioyQE82USYzdyZNUj56ZTAxVWk9YTtjN2RAQWo5dVhDMCQtbmFqME05azc8UiQxM3gtYFY/MUV0ejQ3Kl8xMTtlaHBaWDFpCit4e1VTK2Y3RmMke3ZJflk/RnprWTE3WXdAfio5RnhuMDcoJktsJUFLQ0wlbFAlVXlVKjdldnVAbFgxXnIxNDAydE4+dztWdDxobWYmMS1VCitOQmJ4byVoayUzJG48aHRoZXQxJC1NRlFObXF1SVZNQVdoMHZWNlk+TUpFfShTKnRxVypmKF4qMXBmWXRASHVLVGlUajZ3SHtgfmE7QlhrCis5Py0wJExaKXhgNVVOdkBXMV4waiYjWVR8biFDUn5Oang7TUh+V1lLKn40IUsoe2lVR1ZDSFJ+Tmp4O01FMU1FX2lqcHN8I0xUQGFscUI3CityZVVRKWRqRHZiP1k3S1VKRiFScHl+b3U3cFNeRylkaXw5UDw0VC0zc2hhOD5IPHw0c0pjTWExKiRHa2IqKV8mZ2JDPD01ZzFUKWZ2TzhzCitVNytkJFJUcnFiSy1DNFJFPkx4V3MhSWMqRGd7Z3pWN2tgTWxjRCYjVWp6bX5UPiRDPVAjMXVAME1yR2JFJnoxX3NCM3UtTGkoUkhMdDNFCitKMSlaKzdeSk03IT9pWjs2UH1sUEZUK35RcFVyXzNUUVd1b0Vwd3REV0UrfTxEc1M4UzdRMGp0QypWPVZLWCFgQ0tzZXdgI2wpOWtRMSpJCistMWJ3UX5NTj9sT3VmPklaaHh9ZWtycjdtTGpmPSpaTEpRKyY8ckomUldyN2tGU0w4JUskSiE9MUZASzVxakBlaj1yOEJsZUJzJXhMPVBZCis+WVY8SGF1bFVLaH4xZll0QENFX2lpO3N0WihJcHoxKl5UPTQzR1J+Tmp4O01FMU1FX2lqX3ljKDY+e1VTOzU+Vmo3bnl0K1d1MSokR2tiCislQ2wyUjkmRno2WXNkLSlkakNFY3krPDY+Km0jSF5YP2FNZj4jJjN5NVE5WHVQJTZYIUsoe2lVR1ZDSFJ+Tmp4O01LTTdFZW40fnZ3ZEMhCitaUWxLSWcjfCFvMCgxJnxVRXUyaVVzdT0mSDU4NkF7ME15QFNtNWdkVWwtKU1WeE5+cmskMW55NmE+MjwqQTtlLU9oSyotYSRTKD8zY1lFCitjZk05e0kzdyZNUj5qR2J3LV5vUzRfJDZUTTAlSTIjeVRJMjR6QW9AfWZ2KmRFVUV1MmlVbC0pTUFsQylDRjM1RjN1SXMqcDNpYlVgITBRCis1OTd0cCRaKSY7YUtwIUtRODIpUW9FYndSRVJhJFB7ezAkTFopeGA1Vm9VeV9nZD90VCNgcG1oUFEzdXMrSD5qR0xBKDdKJXUxKypAcGJwCitmcGxYazk/LWY+KVFmMDNHeyQ3TWk+Sk1WeEB2MSsqQHBicGZwbFhrOT8tMCRMWil4YDVVTnZAVzFeMGomI1lUfG4hfj9OXzZAeUkmKjtVCitTMDYmMCN6NU54PEooaHI3a0ZTTDglSyRUfk8qdUNrVDtBZUlRbyl6Nj1KPC1UZmp6UTBqdEc3bkhpNylDSHczRDBNLXAzcmJ5Mz5WaUBpCitsKUJSMWtRP1o5LUl1PGh4d35JPDV8cH4yKUNIdzNEME0tcDNyYiE0Pkp5dUxeQCk4VEpuLXVCKGombFM8Km94a2I5Y1c7NjQxSlUpJjthCitLcG1oUFEzdXMrQy1OXkdIKlFHKjIjfXdxY2ZZdEBIdUcpMVZYenJIK1VLaH4xZll0QEhFfShTKnRxVyo5QWE0Yl5GMzVGM3RfeU5xa240CitoNjd2I0Y/eXZLYFEwPkxmX2JeKXltWGs5Py0wJExaKXhgNVVOdkBXMV4waiYjWVR8bnlzU3tLbHw/eiY5JGJAeilUMGomI1lUfG55c1N7CitLbHxmWXRASG8mZXRoU3tLbHxmWXRASEV9KFMqdCpkVlBNJWAteHVNMyk2PD9BOSZQYCgxbW1EbWVmUllFQ2ZOfnRITTJtfnIrKDE1UjlICis/S3hGY2ZVeElyY2tTZjt4RSkmc29zPUpNTHtXVys0bC1NZD9XfjdKJmR3eiRNZE09P2lYPGFTe0tsfGZZdEBIRX0oVjZzfCNMVEBhbHFCCis3cmVUbClDSHczRDBNLW4+JUlnS3dmc141Pkg8Jn5mVnUkRzEpd2VmYnBmYWdIZUlta2Y9dzR9eD9zfTxsUCsqe2Z1cmwlQGpRQ0NgJGNOCitOKGdsXy11eWpHQjNuRT0hVWFuXmVtTSpZI2Z1IyFeVUV0XmZNO0FEez9rQCNHXn1iQiEyc1R9Pz40SHJjWWBTMzYxKURDfGJpdCt6SGVJCitta2Y9IT9EMmYlYXpydDh9MGhmdXZlVWVwblF4JllKI3BlX0opMGpMVz1UPiRDPVA/dHY4WjMzViEwQ2ZTVDNvdT5SJlhie2F5STxyN0t3CitYeTxze0QhTzJvYVJKcHd0RFdFK308RHNTOFM3UTBqdEc3aihMPUpEI1dSd1Y+MW1yN2tGU0w4JUtzVTYmSyZWXkJrZTh2eUQ4UCMxdUAwCitNckdUdTRebHdFb2FvZDdMPlo2KUNIdzNEMEttLTNxVn19PkkqPTkwak10a14jITI1ME1yK05gVHxUfWZhJlhiPm1CTXxGOTd1Z3B1UGFxCis3bDhUI1ArdEoqM3FYQVZzNHYqYDEpSUtMKC0mO3xmPU4kYyo5RGxxcDEwbmk/KThGQVUkRSY1SGhzYVNGV0JAMm80I1B2N2l7ezFPPCVDCistM3BSYmhyWjFURTEmT3tPKGJ4MFZKSmh7aTVhfG1UZUYzOHtWRHRyeXpKU3BlRiF9O1VVJT09SzJ6PiNlRkNnPjxndVp+IzdaQ2ItWmpPCitqYj9TMjw2N2NDYnA3Y0dPOUxDY199N09lUE8mXiZseF9ANldqbmkxcEk/VXp2WmRWIUBjdT1FOSV6UUVFS1NvIzc+VXRzQUFFUGE4Y0ZSCis9NmxtY0dFeipWQ3lqU2A7bUFkNyRwfmRPRDd4V3puKyFAMCN1JSped3BNJjlMOTJ4RG5UcSN8MzBQcHhNWmY5NFZ5R3syZ3VsdEt7JlU/CisldkdlMTNPdjckN0pASj17M2A5cnFAaWJuTy13SlIoZyV9OHRGOX1uVT5JKlp7RiRXVWVodTxFdSsmaUl4VkJxR0NEMXooPXN8T3F0aH12CitFdXFzQUl4VjVvNTtgclIoLUohSyV7JT92WWckSTlXcHI5YnIjKkRxTCNJNy0rQyEmM2JsTnxze2Qzd3NyflB4PEtkMWUzK0NTJn12ZyVICit4ZjgjYmE/Vi1+aUlfO3M7OXk7eHooO2hsfWdLajU7dzFpR2U9KEwxUk9YIyRFUE9JbTktdmBvKF5sI2lvcnhrUXNMN3pfVVglQyhEJn1rCisyeV9Sd2tub2M3TmRqP21uK2VAXkA3dzEzV1FrSnZmJVpgPyt3SiM8PEByeGtRc0w4bGRUVDB5N1BiNlAjOClwSkBzWEUrbW9gSF4wJmsoCit1WWF5e0ZHeHF0a2NzPkZIcWp0IXhGSVI/dWskb21TNmpeXz0wfUZqXnppPk4lflIpOU58am1yWnUmezJSQj9YJDc1RCZ9anZvUj91ayRvCittU0I0aSgqPG1wVDYqPXtkM3dzcn5QeDxLZDFlM3ZfOVdTXkl6SVNyIypEcUwjSTctYFp8I0kmfWsyeV9Sd2tub2M3T1l8RDUqRShSTSFsCitrJW1ZNVp0dmZETm1AcHlXcHI5YnIpNnxuTXlGK1RUMUthM2JYckVJQzNJUnNyekxiK0xaPkJrVDAlJGJeUE1tTSNfZzJUR0NEMXooPXN7CismRn5VRmU+SjNwRj45bW5mbzlNS09QTWhlb2lCNm03WHk9X3lrJD5ZaEtrTzlNYkFffiNQODtkOGt4dClWOUtORXA9TVFOJm96fks2OWk3CisoRTVzeVAtcStSRkpEZWBhSiM7TFYqVDElKDNibE9PdCE7ZHlvdCk8Z2lJJkd4V0NPVTFSKDxWQT9xU0djaStSeGl9aXVAYjVhU35xOytpCis8cClQSFhBM21RSEt3aCFwVSFhRj8xWGFyMnZ7SHFtSmw5cCReZFBvS0FEcypRQm9OVC1jLStETkMzYmxPTyNqZGE+YnJ6TGIrTFo+QmtUCiswKkJLYmxOfTFgfXdtQGpRYFJlSV87czs5eTt4eig7aG5RcTA9NVpZenA1fnYkVFh4T1gjJE9QRHwqdGVAXkA3Y3QzQzdpU2NqVCM7SEFZCisrQyEmM2JsTzl3SiNeWWJyIypEcUtkMWUzK0NRaUxiSns8cntkM3dzJE5QRXZQSzx4IUhjOVFGUGFEMG9qODRud3cyViY2PShMUFolam1SCisoUER8KnRnaWNIN3cxaUdlPXk8O211TV58bnhTZnQjTXlGK1RUMHk1M2JYcX5ENj9EdTJvMTBlOFkzclB9JlM0WVVwMD50KHRNQzBpNHU5Cit0KlglQyhEJn1rMnlfUndKcXUlNitqV3ByOWJyKTZ8bkxaPkJrVDAqQktiWHIyRUMzTzZMPE16Q3lXcHI5YnIpNnxuTXlGK1Qlb0R8cDtSCit2ME9UMCpCS2JYcjJFQzNJUnNyekxkRz98WGNFVWIzNDdKcDU/Q3hjSzdkLShLX14jTXhNPWs4Y2E9dzN8LTU+OW1fcEpMJEJPUENNekdlCitTUGFwXyYwOFkpb3djTnJnUWtYTXtpcFQ+YT8zcXlYbXg+UFBeJX1uQCtwd3V2dWJIUj99aVMtey00NDNJMmBTYmhWJlB5WG14PlBQXiZUCitoQnF5ISh9RnJKc01DVHZFdlZDaUl4VlF2Vm1kOVJiTjBOdF5XV2ROb3ZkMD1ydi1KYDFEZGNNOXVYZGJNeXhHJCtFUy0yYj1wIz1FcC1tCitKeDBCVE9gUlkhNmY4I2J7P1VkNTtDVmVqdnJmVExMR1RyPVNwOTFhIVl3JnBuSkVPRiFQT0l2Q3BSZXYqX2N3MDhubSM8bWphYU1kdzVtCis/ND5hP20odExuNj5QT0l2KXMhcHJ3dW9XYERNRDQ1ZF8wXnJgez5FKkArRT1IMmI9cF5fZVJiTWJyK3N3fVBoKVJqYHw3bD5QVyRTI3VUCitKfnd3NkQoQlM5Z1p7bS1mfFpVIUNeVlg8d2M4KW9FWHlfU0k9JG8lWXBmVSFDXlZYPHdjOClvRVhTIW0pT2Y+ZHRVfjwyRnQkdDwleXZFCit2P2hpYGg7ODVPdHJhQW85bmM+UE1obnJ4bFd0d3c3RXszPnMtNUB0ZHJae3hKXjxVPzZrUX5vOW5jPlBNaG5yeGxXdHd3N0V7Mz4kSkh9CitvOW5jPlBNaG5yeHo0eGdUXz9Be2FUfXNHKmxCWn1Ickh1JG9pXjhMYkRjS1ZYPiotNipKKlF8SHJIdXNvdEQ7VlhgU25QZWUzNjUpQUJrCitrdDwleXZFdj9oaUlfO358ekI9dXopNG4/R3RKQShaP1dAemlJXzt+fHpCKnJELUM2OVBVIUtYQWkoYjk/WD0kQzcpQGY7LW1leSUkb3RECis7VlhgUG5WWD0kQzcpQGY7LVlkP1MxM0c4MjVVWjxzWFQzVm1KdihMUjNyeCNaKj9wfX57e19nRj8tJTtDS3JfRldSVDw2PCNzbmdjcXhMCit0MV91MEM5SmozJWsyYnlgfWRyRkJ8YnIrc3pXU0VxZS0rRT1IMmI9cF93PiNJOVl7ZipvRnc2OU00PmhTc01hMDQ1bm1leSUkb3REO1ZYCitgUG5WWDx3Yzgpb0VYeV9TTzBOPmRzRjhQVjAtYnZgJE93dzZzbzM+JEoyXk9ZNXw+UER8Xnd2YCRPd3c2c28zPiRKMl5gfDVtc2J0azYzCisrdUoweXJBfU13dzUzajQ+YT9YIVRrNW8+UEZ3MTxyQX1Nd3c1M2o0PmhNKHtvSDYmcmhILW1kKHBRQUVzIXBydysmY35SPkpKd2txblY8Cit3NCRvR0RidSY9c3FXMEJrVSFBWTc/c1c3d1pacC1zSV87fVpjIzBkV21leSUkP0xCSkspI2ZeRnRgIzElTXkmTzlUM19jYDd3SnMmRlJpCitpRDhhdTdBKUF+QkN1VE1Mb3c4S3QyPzZrdjlKTTZUKyZjbllwVTlHUnZgYTBrRGZwak1OOEBJdH5qaCl1bVg/Pm02KkoqdjcqNEpyJG96Cit+WkJlVnh8Vlg/Pm02KkoqdjcqNE8jSTUyVytZLT8qS2FUNFNmcGI9cThhKk4qO1F1aWp2X3pFMTF3dzd4IyExfnkmb3UrdDdaP1hkSEY9CitUWklLWXVhVX1VM1NgS3IoSmcxVlRWYHpjR3ppJG9wI3UxaG47clZYQD8jNWtxUXElUX11bUdlJj9VUmFodDlkK0coTWtjRytvJW9wI3UxCitobjtyVlhAe001KmxDQkljR3ppJG9wI3UxaG4/cXBlZTM2NSg9SSNodmVQYSo/WHVHakpNRk1mJWU9SjZQSylmYyRXRHZ3dzgmMTI/Nmt2Cis5Pis1e3EyaHU2JFpge1UtWnw0dXNWQl4mS0k8MnFNYFp9JHopQX5CQ3VoYVRFWkxaVmlJJkg0UXRvVkgmTmF2VjtYQGl8TSpsQlp9SHJICit1JG9pXjhMYkRjS1ZYPio7SClAZjstbWV5JSRvdEQ7VlhgT2RId3NYd2l4RDhRRD4kSjJeT1k1fD5QRHxed3ZgJE93dzZzbzM+JEoyXk9ZCis1fD5QRHxed3c5ZlpFNFZfdjMjJStGRFRCb0lUVDNWOzJieWB9ZHJGQnxicj1AaztTRXFlLStFPUgyYj1wXl9lUmFPUngtLWspeFEkTng+CithPyM7YHw3bD5QVyRTI3VUSn53dzY5TTQ+YT8jO2B8N2w+UFckUTs5LUhzSHh9U1NaJWo+a1hQRHxed3ZgJE93dzZzbzM+JEoyXk9ZNXw+CitQRHxed3ZgJE93dzIpMH0mM3J2I0N5PjghbzA+TE1xMCpwSTtCN25hV0JWVFQ5MWhyKkhye21kJldOLUJwMz1LMTJ4cXE2PWNfd3l7MHBhCitNb1VVKnAhc3tDXlc0dCE7JUU4cG4re3J4MmwqZz5aPz5vUU47bmklTnRrY0hkeFhsbUk/UEdNPlQmRipme2xBN05UU045KG9yWVJ1ciR1CisoIVZXJUItK0Y+Vyg+c3ZxZm5zKFZ+bXp7Um1YX3VZVypKKnY3KjRKciRven5aQmVWeHxWWD8+bTYqSip2Nyo0TjI/NF5paWR6ajIhK3pVCisqVWZUalNMRkk8MnFNYFp9JHopQX5CQ3VoYVRFWSllSzwoKylmQnUjQGxndClGYGhaeDdtS3IoSmcxV3YzbD4rRl4kZHlOXlRLVlclQi0hCitvRFhES2hvPHFQJVgwYWVTZFlRaFFEJDdmZDtGRWMzTm5zaDR3bDdjZkk5SlNLSThnJX0oM3d3OVFVPCUoPkFgUmxlN15lKHA3R3diTkVSCitaTUQtQEo4aVlvQjBEWHooO189OXZlUDB2RXdhLWhkd3ktUWRwVFQrJVk5QW1YSjdsTCF7MSQ4dmoySmFkSEEqMj9qPldlMFhXO3V7bn4yCit4KHArLWc7a3ZfaGh3QmQ0LThEcz5EUzh8K00pTVZSekhaTmIqeThOPmB6eyR4ajMhMUNxbHdZaikyP05BRlMjWWBsPV5MfSgwUVhyRj1NCithXi1Pc3o1SjdidEolb3Y5OzRyM2d+STJgfFEtTlNWYypGOVhmYHdATyQqeG5oV2hkQiYlRzA/Pzg3WHdga2JUSlNjT1NUS3xCP0RkRGg+CitQcHFUPShYPj82MT5HeXFEaWB4X2pXU3k/OEdmPDdTTVRGPmMwcTd+XjQjaGNWZGx4U2U8fXgkZVZ0KiZ3JlFjclVyYDAmbk0pOV9NOUBtCitvWisoY29+Q0AoQXRtcGt8Z2g2RndvMEQ+YFVMS3lxNjNSMV8lUlc9Z1dTc3d0ciV2RndwKWwwfTwzQXM2JFlQcHRkXmlDMGlYNSY+XjV+CitkO2MyKEl0MjlsSUNyTys/bTUlI3ExZyFiSD44ISNYP2A+Tkh3Ozh0aHFNbDlaSip2Zi0/JE90TWk1aT5oVyFvTXs2NXs/MzgjbDRxZURpCitBalBBYVJMcT47OyZoRi1HI3ZxJCk3V211VV9sOWZeKiZNUmpsSEVOWTs0cHRETnZCUW8zQk1GV1dhc1AjITM7QGM9al57U0J6MEZPb3duCisyY0dsUEBZQStQTE5gSjM7SldqflBIS2s/WklldzZUanlQXmBfQS1yPyN6Y0xXdldlPmdWZ0Z1M1oxa1l8d05wam9FfEhwcWEzSDJ4PmN1Cis0UyY7MzJfN2c0eDlNSHpmRmJAfUF3QWxfUVlnQTtDan1UaFJCQz4rPG5UQ0wjNzVWaGo+SXlPa2Rhe3ZNSU5ufWx9PT8tMVVXX1NReCZkCismdk17MEZ0fWtZUW9JWiF3fXZmeWx3RSRkM0lPcTtaal8oMSRuPSs+cGM1JjduZTdlNTBgci17KmAmUU8rSDZDb2RWYzg+Y182MkthcFVPCitWM0E7dlYzQTt2VjNBO3ZWM0E7dlYzQS1FQj1NeH1jWWliR15mKTl+QiQoYTRlPEh5bSE2TCEhX3p5Y1R7elF5TGpPRzBzMXxZXl9pV1BhCispYEpTOFpjbFo7elcjX3R8JGdSayZtfSo1QCo/MElTKGtqdl9XPishMGloem9NaWh6b01pa0VtTW5JNENydmNMT0olKDViKkJCUSV+cz5yCitDQVR9M3VVSGJwaT9IYnBpP0huO088OyQmdnwqUyFuLWZiNVNtQiN7LTc2X000M1Z4TjU/RDxVZjxUZk10U0o9WjB3QkMyfSN4I3tQRWB6CitPWEF2TGRufnZTUGohWCUlU3xYJSVUTDREXiFnbDJTOXBudCs7c25zV2dybDdJY3Y7cU5YayombWRRbnY5eF5udjl4cjBoM0xXT19OUU5PCitfTlFOT19OUD9GMkt5dTxCKEM0UUlrPVZRSWs9VlFJazs8SFp9bkxuYTl+PShgM19SKGAzX1IpOENXeEd5XjgxLWk9UGxzTDgwd3NMODB3CitYY2dnUCQwVlI4cGVDUnVwZUNSdXAhPT1rT2NefjRLe1lgJkt7WWAmS2Bra0dVb2dGMjA/Y1NjKjRPP3VIOzBBREBCU31DLVRRbWZqfk1xCispM2B1VTtrbkNyMllqU0lIWWpTSUhZalNJSFl2eG9GJj5GK1pLNW5HYyZuOFdyNFZ0dT93M0BWPHczQFY8dzNAVjx3MGlGaTZSWT01P3ArCit8SUNaJEQoNkt+TU8kKUpnPmlFSSgjI1FWUnlDb1E5cVRhKCpFWlYkT1Y8bn1QSjlgYnN+Pm1qZV9fdVUpTDFgb01DPG8xeDtMdkdvUl9WCitCYkchcG9sQXplOU0+P0I3M0pHNXswbkErK3AyYDgpY2E4X290UjUrfVJ5RiRxNH18N1JjKSV4PE4+THhLd3ZDIzNRYXh4PkBKN0lEQUIxCis5NWdSQDJqVWM3ZCN+UmtsO2d0KiVJdGBOYnVwVHBofEpGS1MrV1AzSTZVWHJ2fnItR0B+JWpvQDsrKyUkZVhKIylsWG1WJDI/bnpyJWNjCittflJpXkolc2xWLW9yZTUkbjlhQ0o+Pk99KkYjPjxjUD9OfjFyTkRCPG8xeDtMdjliYko+PlJ+K2UyPm0jQjxMWTQtQE9ZK1YwRWhBKiRiCitmYF8yVy14IUB0UGhzWWl4ZHgtMkl2V0xoWEI3MkRKQSttPndeXm5wLU4pSHEzQSl0cVZwNnUoNUlUPF96XiYrU2pMQT9tLU1ObHQtZGVJCismNzFZVkB8VnNeY0xgIUB7MG9eZD8tN2c0P0R5RWtfO2FGTiFGdnxnbEBVQzlxfig9fmdeWGhpbFJ2S050TV5SP2ZfSmJSSlNpPERsWl4hCittO1AlPDE0b1N9KVJpRzJkUFVeJitTakxBP20tWnVpYUJeU19KU1UzPm9zPXRWIzswKHVjcHd1MWFtZXh2YExeWF58VWFxckpGOGZtQHVKCitgdlE1cGtCPGc3WGtlcUFfOTY1KDJJYXgxaGdvXlE4KnBFMjxrO3BGTUBneilRZ35BMW9hfVE3ZVQkNFNqIX5sK3AwSDA3ZzQ+ND5QMXdxCitYVjIzUFhNPEd9QDkpKGBaWkMzc2s9dSpoVWdZK0FfR2NKfisrTzdOK0RCcyNNcVYlU2RjRkk1YjJ1SG0kbjhhTEZMSGE0K2wkO0A8bnwpCitCN3JETDI/TH1AY2EoZ2tjVWdZJkF1UXokVWYxOSshPkVLT25aKnQzSy1NXmQyLWJENSR2aUVQZG5QJntyZFVIWj5saFRgJS1sWChxUFEzCit7ejh5byo4enEzNktMQT9wO087QiV3ZEsxKX1weHktYUNhQmV3diVrKGFEWk97RWRzMkZuKClFP0l2KWJXb0BGdWMxay1kclJPPU5FKGRsCitUODQyO01+WUNiQm4/eSpWTWNuTkR2NGRLMXVfZlpre0NPK1NGJEtRUlZEeSRSfH5QfSEjYmNONWZgcHQ0PmRkbDtydUhXTDRwVWkzWFRNCitELUBCX2pmTEVhWE5TdCpfKzYrU0x1JXBOQjh+cyZCU18+KXw8NGxZNVZWSFYhZkdJWnZ1Sn4oM15uWDFvWnlTMXVvNzhaLVJPZ1JKSkozCitKfDNqP2Upczx3WHJCKCFkTmFHO3IxVTFHX3VlZDBkWHYmUy1AVn52a25PbUNIKSp7fD5yR251cnVMbihaejZtMXVzbFNUe2pZeHlRfHY9CitqdDF+Qk98Q2Ype2VEe1NAIUg0aVpnIWR1NTU4LV9YRk1DcXxOO2NnIW9kMEU8KzVmK3xXQj9OVUZ2VUozX3RFQzs7I0JZPCFFQ1BsZHIwCitzQGc0eWBeX21KUis2TX4wIzRybCtHZmteTn1mKjxERGh0TktSX1RoVTVfe0htQzI9N0M5QUh3PygtaVBvJHIwVV94ZGlEWD9KR0RuNnliCitzfWhuNjRmfGB3LWdhK0J4bSFaMTVxeDU4LV9YPz9aVW17cjJ+ZStsU21mJSZyZlNlZHE9REZpZiF6ZDQwKDFMdGRablQ7UyR4dStucWQ/Cit3OyVveTchVkgzR1lMQUFIdkhYdiVpUCVLN15NfFdxJUt8PnFCVENMaT5EZylveEEoQTlETVUrbFNuO1k0YDZUVnRaUXRrbFRtY0tJSFp4Cit4OXJkUWR6Zjd4XjdAY2hIbEZASGBSKXk4Z0FjUFRkbH47OEJLczBxSFo9WGNNRGBgSkZTRn4qP0RgVD13JUdsI0FAMSlicGYzU14zRiFOCitzMyo0TCF6R1U8enFjMGhLJD4+VylVbyFmVihVO2x2QzdVblZXYUlFMzg7fTI5dmlYd0RtdSY4NHJUanx1SUs9Wk1vLWdyeXo1OVZQMkp3Cis4RVEodDJGNjNkclp6UXBuK21NXmg8aVJEV3lja0B6eWhrNnwxYEk0S0xjKXEwSkM3dih3ZTM/XlVWKSt1d21zcX5VQCtGb3B2MyFaO09ECit1T1lRK3tvRjlBP3lhX2NTTSZGVWZwSz1GNXghJU91SzEjPW47d3pVMSZGaGM3dk4kPkI+NVV2anZjb0FQVlo8Qi1SaSglRG5hbXIlYUU8CitpQ1hSQzUkZyZkPGtRSD4xNk5tVVdyNyRCPVJNWlpAem9POFIxSlpVeX1LZk8hZ0szeShJSHhDVmZmZE9DbnpxODQ/KjE4ND8qMTg0PyoxCituY3NKQkkzKjBwNDlOYDE0OU5gMTQ2cGtra3MqO0drcyo7R2tzKjwjcm40dkNBKHFrM0k0PjM5KCFpPWZpMDQrSFRRaEY7Nmtoa1licVRUCitEY2tiYkp8SnVKYDBKNkRuJTx7ZExkTzBRQndANztgek5lbGNxeCp1cXVYRm9hdmFiZ19RU1kxPHZiaSU9cFEqRU5CRUFFRV5YSlBzVkYrCitwblk2eGx3WTZ4bHdZT2NMQHc/Slg4JC1TNHs1PmdzYzhkNGZrbnM1R21JVlRLaDRRVU4mNFFVTiY0UVVOJjRRVU4mV2s+VTBOTkpjZ0xxCitKMTdMcVBNcm13R3VUM18lUys0WU92KlghaHljaGs9WXs/K011cSokbWtYKiRta1gqJG1tdF9nP0Rkb0RqR2c7QSgpWTBqfUQrYShUR0N4CithX199X3h8OSs8O3hgbDQxWWZpRmJwdko/eFVZfUAxR2NHN15wIVZeb2wqfWQmd0FMM145Zm5MKS17KVUyJEQ7VTIkRDtVMlErcVBydUojCitSKWJtZi1FVDl4fEkwdlRBVHk4fCRQOG8jR0JASGR6fk5lbDgqI1lxSC1HbFNAY2syRzlMQ3RVYGc+JnRJe2cyfEs+Wkx0KFZYOVIkIUhoCisxPFlKVklRNyYlRCpRQHJVQGg5SnBHVEpgd0gjaDVNcHFxY2E4UiV4OW59S2N5eTE2QWMqTH1GfCEhNjsqcEd7Z25EQm5MWig2aiUtS28wCit7dzREPk0yISQyPHN6MSliRzh9Vn04bStRVjxfdk59VCpMfVp4XkFMZjNoezcwUWo0KHpSQmE5S28yeEVqWCF0cUhkWUJpfFVwakx4Z14lCiszOVdedF5EO3Qzal5AeSZDanQoNXdFM09VNTltZllrdDJRP1Q7OEtUYitmdDNqPTF3cFZUTGRsPUcrVUpaSVI9KyZUQ0dvJSVAOHF7aH50Ciszajs+d0hubEZQXiY/JFg2Uk08bV80IVlWTXJeNEg0eFQ3U09hMHJrWEVjfXUmVGtUMkNFdlpZT3QhUVJyUWtWNjQyUSRzKV9HJF8mcGdpCitJc159IzhnT2RCc1I1QDNvRW1VeXpeUGZCKzgtZ0M7TTlPcUd4djlRZFNXPHA/QHV1aDgzbV5Yb0VtVXl6Xk1WSjJBbXBqWVFVKWhydnt1CitGYUI3RDRPSXQlVStkVHshOVdzaGc0TUhedCloelN2LTV7dGkpbGRpekZBTWB5JUA5ejhZN25aS2VEfiVoMHxhI2xEbmN+filse2c9VGU/CitCMDJCOHsrWVEmcmhQRUIjQD82REI0TDh4WHxvRGw0UGphWUF5aCU3PWkyLVA0fGdIUjFaSDMtIXBSRCkwckxOeTUwQVhJfTs0TUh7Mi1rCitXfWN6a2d5Myh1ejxHTE55NTBBWEl9OzRNSF95SXQ4WiZvRW1VeXpeTVZKMkFtcjRqYXRPRyQwNFpUKVBQZTFQN09GVTtNOU9xMTVPUCVICitRSmVVfEFHTlhETUI+fSlyZ0pMTnBUTkRURSl8PnkmaD5yczBOYExnbFo2fkw4dTB5OGlaO1BzekltKnAmRXAwd0RWXkorfld7Yk5OT09kCitmdXNoSzhmXiopRGtMP0spSWRATE5ldmA1a2ttakBCVnd0WUtiemVpaGo+QyNxbTJ5bGdybytOOGMxcCZzZXo7aGt7VT5BQWdPXyoyOWc/CisrTmJtZ0YqIzdJRUY4PVEzXjVPRjNrfShKKUJzR3hLS3ZHa1pHWDJIaVFpRHFrRTtWZC15Qn1YQ3N5enp2MWc4ZF44Z09kQnNSNUAzb0VtCitVeXpeTVZKMkFtcGpZUVUpaHJ2e3Z3LVRzIVNfQmd+N21sfEFaYUgrd2kyQTNMS1lEX0Y0c2V6O2hre1U+QVNsWTVAS2UqSTxGNGQmPUZrCit9PiQ4ZUQye3NsbGJqI004YD5Ydzt4bGdHUDthUkFPbWoyfHhgMUhVOCQkdHxzVzg3PXc1TVEzRkhgNUgmIzUwOHMtKDRHPVhabUtmQlM/CitNfDdvX2xOfTQmdiRRTEIweH5sczZuRiFqVCRzKyg1T005Mjh8anRZUzVAYnFYdnh7Nkhvd1owSTJhZGV+UG4wM35Gam5YVEJlMEFrcXAlCis0Rz1YeilCc1RmTD02eCVLLTMmazNQMjQySERAKyE9QV5JP2J2VjdCR2tlS0UlJTRFaTA4cy0oNEc9WHopQnNUZk05bT9maGsjO0ZiSDRmCiswb0ReYkVnRnlgakg1ayshZihremt7NTBePnopdTR8JV57JCQpNCl5eEl9UGtLPWJKeWZHTkZIQjQxJFYwNGV+VXwpOEc/QklYPEElOUleCis+RTRjSWhiKHx9Q19IVnhQYD1YKCh+Q3gpUVlmS0NIQzRkXnN5QTR4SV9JdH1QRmhpcm1QMTIjPnU+MTJQOWZMNUgmP2hgO0JkbGI/TktNCituamUyUjdZLWk3VzsrN31RYDtnRnlgakhPUiZRMlNac3M2cSQzaiVXbnZLNz1wXiUkSnZ2MDN+RGZfSWs0JjgzKF5XaTRHPVh6KUJzVSkyCitxKndHME11Tit5KkchbUxMaDJAcn4jdHBCQiZWRFV7SGZXNEYpd0EoPCVIazd1a2ZKMjZoX1FYKWR5UCV8MTdXKD9hQkZrZiVZTzI2LUNmCitYXl5LdW8oNmR1PFlfTGxpOCMmMDt3XyNeKmxBIz0qLWQ7MlVKcFoxO2lyTTAyN1ZnJlkyY0BVcDlYIyFfLVd2JHhkYFkqSyo2UX5uKzl4Cit9LVBEKWheKjk2LWJRO2lVSyZKdG4yNlAoR1grV3BCbV8pJiowaDxQRjhuOWB1eTt0UCF5NyQkZml5fV9YPGokVlIhQX1EfSV8JkVFcnZhCitTP2JlZkNsXmRnYCopOElebEdZIXIoSU1aQ3VjVypjPyNHM3xoOG9YKW5yb28jQVp5TE81RSskYyZYPmd7Jm5GZVE/SUA0K1dhUUktPFQtCispVjBTVW4wc3o0cVJHfElUT3g2P3F6VFcwMHBvcDVgVz9ofF5TQHlsPT4wci03YTNVZXxBfntgRjVVZjUkLW1fQiRHbyFKcjAlOFZxVk1zCitLS0JIZ0JsRUtabGExazRmWnRIKTc8Kio0SlU7ZClMPkE5S0BBMnFIPDUqKDI3VmcmWTJjXjFuTkFVPkw3V0QwOHBMVDNyQDZoKSZCYStFCitALSljUEFXd3JsNGV+VXwoOyFjU0pQcTxSSGA2S05HPkZxNlBKPWlOO3h6WlFOeEx7Sk00c2oqdClTQ0BQSUhyMXlsTD5KeGspUnxHJnN9CitYT21tYVhkbW5BRzJ7Rno2Pn0lVl9Tc35Pa1B9NHc3USkpV2RELWN3P1g+TmtMWiVYeiY/SXhmUSg/Q29FRiU4NXRfcShyY0h6JFFxKD9DCityRkg0VzQ+X29qelFeeVZkO0J8emBTZz4yJFhnRVAlZEhYKXtnbX1WQ05rKGh0fCk5YG9WKHAoLWNGRGBFYEExK0BtOEd9Z19TZWwxS1ZvCitITjQ0Vz1+RD81bn1lU3N9Skd3SSVOcTEyRH0pSmJ8U0ZtSWhjRlV9PUQqMGhSXz5udWwwb083cmtabFkzOTJaY1lqVHJVOTQrVT5ibUY5Cit4QDZuNFhgeDgoZn5gdFZqKF5oRzNlNXVPTUA7QXgtYDNEaGA5N0gxUWxmKGx4YXw9TDdDPHVzQkczaVEjc0d4VmRoa2JYJnxQN208RDFSCitoLXIySzVrY3U7TkdyLVREQVMtIWdFR3hTU3w4R2lER2pESCZtTlBNVm9ITjQ0Vz19aCgoSG1GR1NjR15SQlVPbXJGalN7clprdytVYG01CisyNFc9fWgocUt4MURHakRINTNBSm5AWldqSSElNStAazEmJWN6JSY1VUpPczZ7Ymg1WFh3NHpJY0UpQlhnPStkQXxnRHdyYUdgcmwwYVF5CiszXjl7JXAta307Uz5jQFV0Y2Q1Sjg8RyFXQjNPYW4wdSM1NTRvS3VpTk0mOHpSO2E4M3Z7NGIoSkgoP0NyRkg0VzQ+RktMQ0MyNFdoQlgmCit8UDduNU0rIVA3RFVhWDc/czAzT3p+fWFNTm9LQC0pY1BBV3dybDRlflV8KDshZHQ1P1JEKTVUYCskMjV9bjFZMkw0a2ROP0lTbyg2ZHU8CitZfHpuTDdvUEE4c3VxXnIkTF9QV2xsdyQyNX1uMVglTUdEb2FWajE9WjE0YTxZfHpuTDdvUEE4c3VxXnIrTjJAK1dTbWVVIzMmVVg8a3dhCitIVnhQYFZBSChZPEBiNS1hWSQ+Pz5GbjklT0pxVCgwaTZiUDhxakg4PTJXbjB6QH5aa1RCSDxnOG45e0p7ZnpYbXhAMTc3MGk2YlA4cWpHCisjcnZhUz9iUTtpVSFnTEJZNGNJaGIofH1DX0hWeFBgeUtAOWpAeFQ2d0Z7V3FmSlItPWBBV3dybE8kYUxKRyt7YWduKzl3ZXV4WUBpMGg8CitQRm5xQkNgR3UqPXZSTTJUYXJ7U1pOZ0V0TXtHPGVoU2BNJHhLMjRAPGFYPmd7Jm5GZVBYb04wRjk2VkdzdUxvKUhFIUo3dGU4b1VYKDhOCis2d2g2MUwzV1pocUBAb04yY0kjRj1LaCNvY0Z1PWVDQy1wOEtBQVByTFZ4KFoxMnlfYTAjcS00bT5SMSY1ZXNDKz9sYWMyZTU7Vn1CS1EtCit3QkBFOSVwWWNAcjBUTlk4dDMlcHIjM3ZEOHdgbig/Q29FRi0/aS1ZXyo5cTRiQytBYFd1Iyk0QmorKy1gOTY2RzczNWs9cnF8T3ZqNTZKCismOEVPNmZsVUlOMVUzbjUoKFgjWmxscmZKeTd7fEAlYT0+Vzd7KGFKN3soYUo3ez0pUURWI3wtbFctPkNPdjBKO2B7cXk5bWs0aFgtWHkkCis5YyQ0clo7WjRHdSNNJnN+T3YwSk8rOSpMeGZ8dnZgMzFaVUVgI2FoTkNqQXAqbUB5N3g5TDZ8fGFUd3o7IyRrLVo3PkRCQHU2d3hkI2RSCis7UGR2Vj1zZUA5dGxCN2pLJWxLPl9HT2shRC1GZVBEMWBjVlp2e1BvUjFII2cjRGZTVW5zMkRsbDNGRWlqdD58dCZPZEtsPjgjeXBKaUZ2CitpMGU0YFYheEBpNHw3P2N1c0YqTH1JfSVYTUZfJWE8R1FCPSRIalc0dyY8R1JEZ29GSnB1OyFXZHpVRmgpM2p4TmYqXnhOZipFVlZwaHg2Cit3Nkc2RWVUcl53akA/VzJ+IWZMQnVxKHxrfXhHPE8yVStjREc1XiZyWCZfWVk0LWU2RUhufFVCdj9yLWg3ejE0STd4N2xoRUY7X2A7UURuCitBfjdYbE5+JFJ4Xyg4eXUjXjFmXmlKPEB7MFphbXojSWgpMU8yVStjREc1XiZyWCk7Qm4zNkNoVk1AWjNnZWhzeGNXLSlUQ35RZ0NsQ1VNCitRYGJuNlFGZVBEMXN3b3wyQV59U1JtSU4jYlNRNDxMIXFQZVVHU0tydlJoZkZwWGtAZyY8YVp4LWZ7SEUpVEB0I2E7bWhrdTBLfXgoMjh5CisyfXM+OFA/QFdrflhMPjZ5U3l+KiFCcFgzJkYoKEZeUmNZQHNGT3YwSWpHWU14QkUxPzgyWHx+SDNpJWJNSDMyR0FqQmw9SDRPYEBVRD81CisqQ0x5M2FBV2dfdEJKUUZLWUBsRiVoLXlMXz84TEAxTTMwd3NWKzBGemgoQzE2UndsN0otdk9NSV9vRlMjejBENmt9OE54K2h7cFQhZjRPCitlQl8/QD9mQSRMWWFnemlGSHN5bXhMfH1UQHR6XmJWPXh2Jj9UV3VMWUpnSHxMayt8QDk/ckVzN1graHBlOHwwZnx8clNDX3prdW07XkQyCis/PnlyYlBkSmxzQ2dEdWxvajc8QmRLNy0xMWhYUGFjJDRyWjtaNEd1I0VLfjRPdjBJakdZTXpuSkM9TE5iOyt4P2l8VFhHISFTZV9Ldk9MCitXY0BwdkA8Vm5icmtTOEhlVnJgVFZDbX5La29QOzxEYWd3JSs1e3BjUEpQQ1B7XzZnY1lhVVk3a3VYfEhTWXZ0K1dgKEpKWlFIN2xaSXwrCis4dT9sUjU4LW9wQENfKHxtX294UDJGJiZWd1hCQDlYIWxyU2heUCt+Y2h1cVI8cCFrKUM3UFYtcCo+el4yZCsrdDl8cG9CcSpXbEA1azFWCiswSVc2M2UxZ2FXZHl6Zn1JM0EzM2slJUxDcGkpITtvOX1OJGB7NEMmNXBHcDlEViVldjxqNTNCVHRVbHVVVEJDdCoqKm9AOVVicmwqOSRwCitvQnBRZ0F4V00zYCFXM0ZlcVZBVnApe25DeipLYGJgdEMpKmgjUkhjOGg4cilnRmhtIWNUJnExVjU/I1dYP1pASz8jRXIxfHt6IV81Q1hZCis1SyF6JSpwcWgwWTk3eFg8fWF3dXt3UWUkcTY5PDxoIVBNYkFXOX4hQFJMe3NDRD0pQGxWQiZvUFYjcHl6JHoyTFBsQksxZWFzMGV7M1E1CitFQFJRJnQhQjJ2cFdDOTkxaUtTME1vUDs+KGVDR25KRzc8NzU8Vm5icmtTOEhlTFl7Oz9zcSVDPFJUbGd0KTwyMiRQZVBvOEkwPHBtP3IrCitVdyp1eE4xPFZuYnJrUzhIZUxZezs/MzMoRm9Cdnc1TWFUNE1yIzdUJmc1R1U+VHZHTVRySUx4aWNsYU1ETlBlUHVBSmdNP3orSUdRRGZ9CitnfnlDJjVtRm9kaTF4Y0dDSUkxckJGfkBSUSZ0IUIydnAxVjBJVzY4eG1JJDAze1dsVVZCeypoI1JIVT87JiZJe1VlTnZDdV5EbGdkd3J3Cis8cDQmZ2gyXnw1KFhzfUpQQ2RoMyFkMVdiLW9ELWFTe3VqMVVCakhYVzdMezZNOz93b3BrdHwzSGRedmdnZ20oNjduU0VOcWh1Vmg/Q0M3CitmXkNuOCtTdmlOaXhMWT5NQjY5MjBVPU0/UTxnblgqX1ZnXmY5Pjg5PFZoQGo2NT1HcE5yO21XQ21+THtlJjQ7fWdiO1pXQCs5TyokZGl5CitLQXh9YntnZ2dtKDVeSjQ9STA8blE7dn5kTGg/QX53eyQhenZrUzhIZUxZezs/MzMoRTBvZGh9d2JQe1d3MVUzbjU2NClmTE5ubiR9Q1NCCitlY2hvdlMwb2RofXdiUTAoISZgRj9eS3FyQXRWdWgyeUNWQEA1Xyo0bkExPnoqP1V8cncqJHgwSTtQZVB1QUpQQ09jQCs5TyokZGl5S0F4Cit+bk5sVy0+Q092MElqR1lNelh3T3poZ1lhK1ohYyQ0clo7WjRHdWdmfElxUW9ZSWh7dHwydypkKHc/VjNVZVgmS34haEtVciFiPFZuYnJrCitTOEhlTFl7Oz8+RG90eFNtSTI9blM/VjVYQTtpRCl9KnRtWG1vJGBDdT5jRkh3a1lOLVh2QnkzMkdBNUJ2dj5IVmlMcThSeVlZPTYxcFVHCitOJDhUJENFZWU5RFZDY0VXZklDSGx1ME8pUCRzZCROJDhUJEM4MHx+bXhMfH1UQHR6XmJWPXh2P3pLPnstYjUmcVAkcj5GTFlhZ3ppRkhqCit2bXhMfH1UQHR6XmJWPXh2Jj9ReHUmaSohK24wZ3IybitSJFcpRmh9JFA/TWwwS319K0RsT1FIUk9vRXNNRiRyUTQjM1lERzVSPmtFZUA5Cit0d0JCKTdGbGJ8TCtPQGYqUEhIcDxzZnx2dmAzMVNrZm5TP0cwVEB0el5iVj5KcW1QOU4jNXl+VyNOaHAoMENaU0FYQShQTjBwLVYhU2dmCiswblA2MXBVR05pMUx6dSV2ckdPQ3B3PjJ3KVB4cXlwMiljWkNrYkxNRVkwTFlJVXQzMClHcEJ5PnNXbEYlaWdPTTNSUkJ4MSNoUCRyPkZMCitZYWd6MzF0IzFteEx+Zmx9aUdhMVN8PHk2MGpzLU54K2hUQl44ITk0KEVtZGxLPl9HT2smWkpGZVBEMSFqeXo1Mn4hZkxCdXEofGt9eEgpCitTVj9lX3A4YnZwdkVvRnFsMypwVlhpMEZBOzNVQ0dmfENSJUB4YDtmPG9KWFVOZk1HSUJ1UGs7cDhZSmRTYUJqbU5pMTN0a3xaUWFOUnA1Cit3QXhUMSNnZF88YDV8U2gmTmwyMkFCcTIkOW99SnhUYVV3KVh0V3B3XnEpTzZoSk5kbj4kQ1FMQTJ+IWZMQnVxKHxrfXhIe0tIJShZP1glCit3ekEob3A2VT1xTTI3QT1XSU9Udl9kREc1XiZyWCk7QkVMSVluQnNmV01sSGVyNE5xWUE/QkUqNmQhQWdSYSNHKW1eTnJJQ0VDa2R5fndqCitmKHBBVzFAIWdkXzxgNXxTaCZOJC1BXlN1OGphcTloaEEyfXUlP0JxVHtsa302NTM0VFJ+WmcoKFNCNX5kX2ZOdGx1X0NCNkdhMVkqNjNTCitpVTVkRk54KCMwKzlxRjJ9Qlp6Qm9JajtsMFlQWk5DSkByQV8rdGloQHwmPnxJVUlGdjN5QSZsMFlQWk5DSkByQV8rdGloJElrNkFkKX5OCis2X0wqTkVKJWAmQikjQUpjTlV6bSZzOHJPWGRlPk5pWDtoMTV8U2gmTmwyMkFCcTIjY2w3dTcpTmZNSHpjaH1PMTYoPlRKI1BUSH1Obi1oCit1S3FQQGtEazdhZEE0SE9iQm5lM3BrfFpRYU5ScDV3ejJFJUZmKWdRMVYpPkdnQnEyI2NsN3U3KU5mTUdJQnVQaztrUiV+VkxYdzBlMn14Cis0K0o5ZmxeNk5ReloreUtAdjJ+SEFnbjFtej1OZk1HSUJ1UGs7a1IlflZMWHcwZTJ9eDRFYEk3fUZMWF5idkJfVDtkbDd1NylOZk1HSUJ1CitQaztrUiV+VkxYdzBlMn11JT9xPHIleTNyPlY2aUlxIXkkIVJZY2dMb29JVnZVKFZCIU5mKmtwdjxNTD11UTM1TlJqMz8qcnsoIUhFemhACiskcUxOTmtXb0BCeHpmWGVKOChmITF1JiZlXlplcEF4VDEjZ2R7MEBvVWl7M0N4P2lWVV9CdjhMVSopNHV4PDRBeDcrcUBDQVlvVzdIOFhRCitaRypJeCRpNmVxeVQ3OT5JPz13Mys3c2A2cH5qRSYxJXBgPUtUYGVaPzM8aC0oJUUtOU5ScDh4QlN9Vip7UUt0NUU7JXs4OXJFd0h5dHVyCislZTdKbk1XVDBXN1ZXNDU0WDQ3eno7VXZSSmhMaWw7YkBnSiFpRDR6Zk5Abj96O1V2UkpoTGEyQDhCUXtzV0hgeT9CPWJodW4zNkZpVkBsCityZCt2Qkc4RmxIYiNrUXZBZldDayowOUw2fHxhVHchcEJNI1IrVD0jSUAhKnZoVy1UQmlqSVdlfG1Ze31TP1MrcnpLJChXS2NDMVhtKWwjCitENEVRIT93NjM/fl4qR013YiFld051UklXZXFjU2pudGNHTXI+TSQjOWI0QipSSURsTUUqclBCTlRpSUxVQzU7VXhkcVMmbSFUPEdoVVZHCitSRGdvRkpydW5AaU5CQzcleVhsRn5hZX5iO0VWVGI7RVZUYj1UamBxNyViUGhMeX14Q0JzUkVsTUUqclBCTlRpSUxVQzU7VXZSSmhMYTJACis4QlglZG14Rz1mOGRmcl9XTDdCfFBJNVdQe0lhe0lib2ViWXV3LUQjej4tO35XSzdBSmt9KU9FZWxKT0hWfUV6ezl+ZSNDRWFIaE44QjtRCisqPFh5QkJQTCZ2amZUQnhBbXk5bUN4XihoQVZ5cmtaKU1UajFQP01vMUxyc1I3JTw/NWVPb29eWUYmU2JxI0FKeGM1UitOOTxsU3FYbzYrCitOdFIrUHlvbGREVnpsczBSYWo0bH5uR1AtMXpGQnc9ZXV3LUQjdnlVKVEtTDJRVDBYKzxuZ19YP21DQnNTUHl3bH5Sdi0xfDVXSGB4aWxICitueDdOcnNhUUNtQnhpPyE/WmFkbCsmSEUxOHVgaExhMkA4QlF7c1dIYHhpbDRzTEVaczg9KS1oRk5ub2FFaF5vdW1GNkhqU0o4bU9pcyskCisjOWEoTiFSYlkhbyVndUI/QSMmT3YjdiVGKHFTNCMrMG1tfDhDWnM3K1cmN1dOZ1ZTU344MjQzP35eKkdNcj5NJCM5YShOdkY1eys3fCZ9CiskLXQ3ZTdIWmE7NyteQk1XUHImNGxVY3JHT3YjdiVGKHFTNHR8XiZVUDZKQkBtSkJTcHU7aEZSVjZ9LV4kWWctWTBGd2JHdnlqUHtrfSlNCis/TzIoOW9ESCY1VHJlc1hYbjM2Rmk+OzhfQGIzJFdGIytIbU5uS2V2aTRVPl4xQlQyMyNgUnN4QmVsV1lqTnJzYVFDbUJ3JV9PbTJyd1RhCis3MCpTQGV+T0orNWJGKHFTNCMqfmFIOEI7USpXSzdBSmwzQzRVSUxVQzVtRzlvWEIhSX1tTkBne2E7VXZSSlc7SyhNQnFLPmlsOGh1N05wCitkQzB5emVvYldIYHpHZWZPclBnb2MkMkUxNHh0aExhMkA4QlF7c1diYTVzN0VVc3BXSGB4aWwzQm9IQisxXi1sOT1UdE13SEEjQ0w+OGtsCis4aHU3TnBkQ1dUemdZVUUxWUNGJCpnOEZsNEs7d05ScXdsPmRrVCFCVDhtOWxhVkFOTnY8U2F6a0wpKUUxWUNGJCM5YjRCKlJIO28tKnQqCisoelF8eWFERGZ0WE1+MjgzQGUke09vbyNUQ21Cdk1vTWN1cjhBJnBkV0YqTipsOTQxTU5rKT5xYF5SJlFmN2hPKyFBZlJIbFVkU2FCKntwCitVa3Q4RVlNdnt5cThBJnBkV0YqTipsOTQzdWNKbG1lPyt6SmRBKE4zTEJTfVYqajNnT0pHTG1FQCR3LW9zQnFLPmlsOGh1N04lQyRsJihICitRYVdSeHtiTXZ7eXE4QSZwZFdGKk4qbDk0MntoUkduM0tfcjduMjlYUlJgTEluQ0tsYHRMVmhyTDVBe2ooN2gtNDdTQWQqMk9nR2RJRTM/CitkbXNHS2dkbCRzbSU/SC1FQz0jNEtOTzUkUmxlQlooKUg8Vnc9Zi1iLWR1SUxSenpHTG1FQCR3LW9zQnFLPmE9ZXN3WTUrWHxiWkdybm1ZCit4Xng8LXdFPGdWQFEmYkJxSz5pbDhodTdOcGRDVytFYWN3JC02Zl98Sj1pblFDUHtXVy1ePilSeD1xJUdMbUVAJHctb3NCditFb3dhKmFRCitncCYqPmA4P21mO2UtJVlHT1QzUUZkMHJWb01oSDg4QSZwZFdGKk4qbDk0MU1Oayk+NEIkPjVLez88fk9eKEpOd2xSK2VkTkN1RyVBe2ooCis3aC00N1MpWHR7WkdOcGxlZWBWZlVkRVloZGBRTDYwI05Za3Y8LV5+LVRydmgzMSg2SVE4QUxMT1dEdjw5bDBoVmNOQ3VHJUF7aipUWmYoCishc14qQ2V7TF42bkU1WG01dEtfcjduMjlYUlI4QUxMT1dEdjw5bDBoVmNOWnpnUGBNVnk2V1AoVHJrcWpha0xeNm5FNVhtNXRLX3I3bjI5CitYUlJuSDVXSHpjc3NAekBIelBIN0NaOGoye180R0phKEkkb1BAKkJqWlFMa0JsRH5LUWV3fntLKXVgQGdza0pXWShNKktRZXd+e0spdWBACitndzYkIypmVlI7dSQoSmJZJHFyKDItZkVXWSNHZUUlTnVoY3hLSXNRNnI7OU12YVViODh0RiRXWW95MGt4P1V+TW47V3s4V31ZKnRDTmZ0CitgVEpmeHYqXlVBa3g/VX5NbjtXezhXfVkqWUdsO05zRjZgNHFlZSFKajJmOVdOayl0T2VKYEZfYno7PVdzRjZgNHFlZSFKajJhbT1HSFBWCitoJGYlSn5CY256fWptKC1QcWVaQFZFd1dqNFYke2Z9a3g/VX5NbjtXezhXfVptKSMlIT8weTs4dVdhITgmT2ZuMFRqMjhMKy1vTFojI0hmCisrME0lT2tTKDI9MWRMcX4+PTM+X0lkR0lWNjwkazM2WUJTU31LYiZ+Sjx5RW1MMUxQdiY8Mz5fSWRHSVY2PCRrMzZZQmxjWSFjQiZoOzJwCitZY2VhcnBBTSo+NmtPMT5+JGg7NWVLZUxQdiY8Mz5fSWRHSVY2PCRrMzZZQlNTfXFqdG1fY0l4PSkqPSpYLXxeMWFfQlg0YWg7SXg9Z01qCisyYW09R0hQVmgkZiVKfkJjbnp9amZAJUBIOE5ecykrOEElXjBWSjFXKV98cEg4Tl5zKVgxb2pRNnI7OU12YVViODh0RiRXWW95MGt4P1ZGCis5TFo+cnBaKXkyUyRTZ0EkZiVKfkJjbnp9amZAJUBIOE5ecylYMW9qUTZyOzlNdmNyT0IlPylzelNuRylvKXxTVVlHbDtOc0Y2YDRxZWUhCitKajJhbT1HSFBWaCRmJUp+QmVWWDxYcHo3NU1gclBmUTZyOzlNdmFVYjg4dEYkV1lveTBreD9Vfk1uO1dIdjEtKUZSaXAybiYtMTxLVmV5CitIZkJTU31LNXQwRVQxNGFnbjM+WDxPR0dKdUQkU2d1S2k7Iz5GODZ6QEE8WnUwdlMkdHh3JFhKb0ZCNGI2eWlpe04qRD43RE90akppQXVfCitDa2QkUVRqWnpZVGxiJSh0YU18SnhXfk1ZfHd4Kll4WnNYN19gdy0rTHlrJFhKb0ZCNGI2eWlwOzdiVj9AUz9qMWw/VyZ3UUJHQyZyNDU2CitgNTU+TXU/ME04NmglNFdRNTJGa3kmK1FXWFE7bmtzJXtQTXV6PEVYRmttODZDKkBNaD5RPiFBdT5XX2d2YmJ5NWg1YypXfEAoWkF0T1VaCitoS3ZqdThTP3ZlTWwzJXVMUyUlPDIkMnlZQlNkRElrLTtIQEx1USRnS19QPWUyODlkPzg1QS1vPGFmV3opK3wzVUlBbjBoO0U9JX5nRl47Cit+Mz1TQ19HUnVxJTNLPGtLQ31kRWBwcFpjIT98JEM+RkY3RU94Ujd4bjwzaCVUajAraFRHQW9SWDJOQDRDOSVNWW9jIyFjUjwzWX1MP3E+Cithb2FVdFZFIylYVXY4NWM0eFdMKElzRmZ1RVEzPFZocUc4QU1lJFdWfT5BWk58ZUVJPV9OV0p0KTZrUmMmTUxXWUZRO3Z6I3FoSnArUTg0Cis1QktXR0tpYGtmOSlGS1hZdFdwY29QfEJ4RmQpa2RQckVMcWNZOGspYT8lTDU2fTExc011NTZsNXNLUD57ZHh1UU14OTM8KCgkRzkrWTMkCitkSGcoU0h4IUUhO1kpNy1eOWlqZENWXjMtX04lMD1RO09kbkVVWWB5cTRvfGxER3gmYzNOblYoVilMZXtURmBmQHhPb25gNSp0fGZCbT1yCitgUVA5RmBYQiVNfE5QKG9fVjUxelApaD5ANmFXQUsybXRleTdEeFZvODNZPngwMDVLKjAwMSlwMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7CitMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1ZyZ2VKYUJePkFXcFhaWGQ2aVU2WmAoSyF6NTc9VD5XYyVvK1BJNFgrWU5lPDYrMVE3dkpKCiteYmsmezc3QmJ6OGk4WUdvS3txPXFIU0YoKSo/Q045PT1STUFRR29FaHVgYldkaiEoPkwmTml2JHtCTnxUVSR2Xlo/Wm54OD08Jko0Pzx5CitMQjtDXjAzSWJkO0soUVluRlJUe2xgNSFXJkQ0bEJfKXkkY1p7PD10TjV8ZnhQREBSJVh3Wk9oeF8qQy1QX1BUX05gVGlkR3UhYUl8fTQ0CisranZfIXF7V0h1cS1eNnZ9cTVGWj1WdTJhUDM8PndlIT9WWmZObDMlVV9fbG5qVFRDNmxFZFRRTzF0IzZQSElOaVA3SDVPI18pZGNrPyRRCitNNShZcFhkJV9zJTk9aEJEKWkoSEVuMkBiYGxLSUxEWT4hMncheVdeR0x0aXZlQDA8PClTOEEwcH4tUzctSHskZmNvTXEmISZ1O0pRXzg5CitocCs9WEc2UlAlWFlqXmhXVllaP3ZKNSkqIXRsMmAlcVMrYH0wNmRpaVlzVnhVP0wqQSVVWXJfLUxoQDR+RyZaMD14Tyt6fGFVYjQoVihTCitwMFB0b0F+K0tJN0c9eWd4e1AoUWw0NTVPQX4tSTc4Iz49X3dkd2N0ZipObTN0WmNrbXVSS25TN0Y3JVNRXkhJQSFCXn0mRSNgYVc1SG8zCitFQT4mbVFTfW9NcktCYEZNdzFJRWBFTUA1bShVSnd+dTNzSW8lKTdLTVcjOWM5VGtBbVpVPEkkMXUzPmNeQWlZP1M5VG9AVyUoQkY+aFJXCitIcFU1VENCM2dKUmUwd0lyR2AjVkNGVEdGQlZzenRQUHdqKiRiKU1RVGlqPT5ya0w3WCh5Zi1aN3hgMXFEYkhgdlR5JWE1MCVsfGdJKypoCis0ODA+K2t2Nl9oJnNKaH5Gbnc+ajN6bkR1X0EmSEQpVGhxX0Jua2FQcCM/ZU1WX0FXRXRjPGFKOFhEKEFZOG5IM2ApTSRee1ckcFpjMGpiCitzNXFhO1UoZF87fEV8cVNsUSgwM31SQnd1JXUjV3hTbmhvQCRmOGtHKkhwPElrPnA4KH4mVkYmWUp6PW4ycX4xREBRTDlDPGxiWC00PFp6CitSUm9BaHtkaEpmWldjVlZWYWZUNyVlekpDPnV2NWlgWE8/MFd3eCV6Yy1vfkdEVXM/K0hkTjtyM2o5Z0ZLLXVOaipIaXZuWCYoUndZaFpgCitTTGNWXnk4djtreW91eyspaXc0eVJ+Y3BRTlZyXkB7ND10NVYrfS17fTFiLUBtP1ZNZWpFUGk+PkdweXZXK0pVIVIofCl9clIkPHlyUVApCiskfTFlQFMqYnlQKWg+QDZhV0FLMm10ZXk3RHN1cVM2TVJ6MDA3N2QwMDEpcDAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5CitYSnZDUVZgeVA9V015PE9WYHlQPVdNeTxeVnt8VFhkNmliJWpAdmQ2ZWIta145UiMjblRZQ1pXQjB2dkN3YGw/ZEw2Qn05ZzNVcnBPQ3lfCitEaTQ7aTZqPE1LKD8raHZWKCFIU2RnRHI3fWhjam5wNCpsa3J2KTxYV3JQNjFwSF8rfDsrVVI2NW5Jd09nUiZeZT5ZZ01rbiVYQFRTRz1qCiswdjhqRGI/MkJETEY/TGdgWkVPeTN2Yl4qVWVXdVpja3JOPTVrVTdBWWlsfW5POGY2QklORncycXo9PF5vSndZMVJAb018eSZAYEU3XiVXCit1Sk5HLWE/PXgtd2gweFZVX0dOaVRqNHJPfnlqPW5SRE9eeGZXbDUwSFUkckJZOXZGVmdjUWBCO05DVi1sMjhYVSZHfSlmfClgUWRYM2MoCitwflNOd3gkSz1EVX56ezFTTWdtREMqdyM3SztLQCVOJjRRSUA5elhpfSplI1NmeEY9PkMhOHM9Z0AwS2x3aT4pazUpRUIlKCZDOEkleXFfCis/ezRTZkE8QiY0cmI5aVBKZGloOWllaUotKEUmd3FWbyZLZncjWChqTyQ4aXdkPmFpe2dDUitoM1RyQnozJDxxflElQFZFKGFrfjI3SVA1CitANVZJXlclYEVXbVMwbn5CTlRQPlFUQDMoQmV4eTF1dHhMSjIodkdiRnJZN2Y1WjkwP0A4cyQ4JU1nVyhfMkZadkcqK0t7KWdLTDVja0toCitmZ0N+P0w8Zj11SGN6dzI8XkB7dE1WbEw+bWNeWFFJWUlpVTxiKD5JJWtYc0FiOzIxQjhFSFEqZksjeXUzfU4mWT9MUHN5Q2xmfl9WQE14CitpYm1xNio3bFRVc01sZiMyeGNyKTZVdDRtJk5uelZRVXpyfH5oWXMoTFdvaCV0OUBkJSgxQDZ5bzloRkB1TVQkMHY+ZGFRUEB3M2FYV1UlCitHdTFIZnQmQil7P30mJkktRGtNVj1DQTxkPzd7fXpfey11c0BjJHJ0eUZxU1cza0NVbGxUbTZDeGkmVUE0cXJfWUtQTGFFbylHcW5Wa0M7Cit3VTRxeVo5P3NgPUFOUmVObFN1cytGT2pCIUtiMTlfTTdKPDglKHc5dXZFM2VZN247WnRPY0t5S0JiOGlnIyg/Iy01bXtZJUlHJjIrM25wCitPQzxuYkc5SHBIe1NzZ2NQak54Ym1QT15MaGVeSVlMcEpRK2NsM31TJk0pXnA4QU05VShXeDVhWlh0NDlpXj8jTjBRJDI/dCZvez9qPHxsCit7bGkzT3pARVhxYlltcD0qYzNUc0tGY09TNm4takJ8UXtvRns2RHQpbUltQTFLe1J4ITs2I3EyMmFSOTAwblFaZn1tdDtOZU55ciMycUB0CiskK3R1NCZwMTYwKVRnKD5GfT1KK2pEZiZiSC1Cems8Z2xKWT5lVypSKFBmYn00NDhucygpS0AjYHg5UlV7JDU7ZkBMVmRpelJ4aV5VLUdmCitfZ09RUjQoPV9GUDxAWTxsXm09KU9hOz5LKlA3NnhUQzlNN0xWcXJzaVRHbiFWa3liIVlzfmB5fFVGVFlpdmpaP1N+bnMqe01fSXNHeiYpCitFSVd4U1QhKylpY2hpU1UqWTtYN2AkenU7JFdGUlYkISlPTnJTT0hTP3FDQUhKKEokI2tMJDBXN0ZYYzZpb3tMRU9DZH5weWt3UyopYzB7Cit9c0d2QCp2fX1VVTN2ZnR7UGFBaXB4QUVSamQ4WCtWd28/MWhKYVoyRElOVFNZNzdPPE5wKHBiJlNAfT8ydzA1PzRrNmlyZyFtVmpUOGRRCisqRmtlRG5BZXhyWEZjQENsfFNRTHZ3THtAYEImWFJ1c1ApaD5ANmFXQUsybXRleTdEeER5IVQ9NWwwMDBVazAwMjF2MDAzfWxhNCVuV1dvCit+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1ZgeVA9V05DQUJhJXAwOWJaS3ZIRV52QTZTWiF8X05mUTNmdWMoVzRJCis9SUNjOU9wSzYpe3l7WGhzNEdmRk4lRHQybntuMGJUVWtubytnQy1fNGB5MEZFaDs4bX1JNShOcng9TV5pKT8+UzNVTEMyTTVfN3N4X3tmCitFeEs7ajg/OD0qWVMqeyo1QSo9LUxHRk9NVj9ub0NqJTQ4WVI5QnVMOFBialZMO0FqaD1nRExpTllebitsan08bjc7LV5WJUJ7OUcxOEYzCis3VVdqa1BTNXUpJDRhc0VpMWJzYEcmfj5JRiMjWDh6I0d7QG5aNkNteD92IyQhVGBlM1ZKUV4lNCRGd0wlR3EzM2FxUS17dV4jV0IrUGhXCisjWUNWN2RmekU1cVk0WEdfY3B9ej8pSSFScHhNJDVxciRJT1I/R3ByRVpJUWszU05xP2x9Z2JvUUI4WndJUjdHfHUxPEBzU01VazxkUjdpCitfaG03SkA9R0c7PThTaDhBaUB0YG0/Sm8odj1RRm9Zb3xAUSMkbXspekpCYUtUSG56ezdEXllhe2R8VC1vcmQpdVU/PkxRfWREZnpVWTMtCitFODFYN25gcjhEfXFwdjZWakJ8IXR1c1ptI2ohPHNSJiZ2dSgjSElMcWcmYCVsOztHaCFyfDZSYVZsTDlFJHtCPU4tZlAhPCRweVNiKStDCiteNUc0PStGOG1wIVJEa00kLXVINSF9ajxBaEIpWFB1JWR5V1N0eTF4elglU1hySHs/LXlXM3V1czt6dGFTWiVrZnQ/dkNCKDhBSnEzOyN1CismPFlXcDZkVzJKSENvbF5yNGhBPWtjS3NjOFJCTyVhWDdgQDh6aWY2fWpaVEx5WmApTCp5SzF9SnRvTj5+Wk15NVY/YH1KZDU+WkVwbTVKCitHeVN3PiEpY25GcGcxeHRGdUlNTlRKcXU7fjVBciRtSThhdit2LTBUVm9NM0k5S25KKUo3cHw2NkdKdWtMdzRFbCFUa09GMGpHfWpXPzBzCisyemoxKCVJfml2WWJfRCQ9VjhoQDlZeTQ7T1Q+e1piQ1dgcUVjUTdwYk5+IT15Sj0+QDZReEQmQG48JVd7Uk4qVEtwfEE4TkVOb3xzZSlhCis9RD5hNkRvPEJZdnVAd3VrMU12cE0wWk4/fCFWMDlvPHpwI24pUjYqY1p2Sl9UaittTSEoYmlaPTt4XzJSPSo2YEAzZW5kZm1UaGNEbjZtCit0PURiZHcpKldWejZ1LTNVLVkpKjVBN187QUtGaXElIz1HTmp8UnN0RTVgfVpTMmJRciQmUXd2QnojU35RfldAVlVMfU9ydSNnZzZZaEp5CisyaXJ8UURyX2okYk92cnJTPzQoM3U/RmtZcylsUFk/bm9LI0pNQj9WIW5mOF9UYT1Bdzl3cy1aZWVeS3BMYGB2ZiNNKDVxX14jej8lckY/Cit2bj4tNUA8eyhZbF49V14tdkc8dDVgK1EpSndjaGhWJlorYldCJWBiRGdvYTtMdyRgc0NZdkM0MFZ3a29SSUI5ITVvSiZZJVkpYkMzYW9xCitqKGIzViZFUVRPU2ZoJTkmMGpWJSNfYi12O3RYN19KdnpYQ2lRc0U3KFk2UHY9NilAO00oN3NZIzV7bGB6KCNgOWZqNiVGO154JChHSGJkCitySmprbzJ0dGlibVNqbWBKUzJETjh+R0twcGVMe2p4bXVvJEsjTGxTYFpwIVVpIyt2R2VQc1FialNGdXIzZlNDZUoyPnJvUkt9QD5VU341CiszVGZaZzE9c1EyOE9qTnAxV2JxMGdCZTdXbVNmfiZXMlI/RU5BdmwtRz5KTnJsRzNCMnNhQnRiWXItUUw4Ml9qak5HP2ZeJip1Kz94ZXh7Cit+eGs4UTIjRSlefkcoTWJaRWBaQlNVUD44ZkYtMkc2JEd6TzwlJGpMU2pUWFk+MyVSeFhxbEdRc3pqKlAmdUFfbzdUc1JoN1UlPHkpUURJCitGWktvUWZqSWdEeisoMDR7YGI+MGVWY0omT0UqO30yPik+YCUrbmhDYWA+KDZYQ0EzSUA7KkZkMGhQOD1APGYoemJ5UE0zfSFyVTliTih2Cit9PD43NjgwcmYkNnlEMDc4UFpQOz5COGNuTz5jM1RCZiopQzAhST1WUWZIYlBNZlY9VEh+OUgzKDMjajxAdy1BZ3xUZjc8bmohWEtoPzByCisjOXBOT21yPVJxfEtSKDV4ZGVOczsqeEdINGgqKjdAMlkwPzVNTFZIZ3RZWSQ3aE5CYlU8XjJOOG00alRYWEA0NV9CY1VobDdPeT9sJSZFCitZd25vNTc8aVVXbXRsZ1JUODVgUkN9TztDN3hIfFpPOzhLQzx9N3BEVkl7NzJ3RTdre04+Wm8yYDNvfVAqMTZXNkt0TXxgQHA4QGp3XlpnCitoT0ojMm0hLU1xcGZtSE9uPEA3MU5GVm8jdCYkWWtWS0FSTWc4Q188a2dJRjQmZnh+R0EpKShMNTMoaGZVa0RPJGZMMVFAOGxWMCNJdnVmCitSSk5UJlNCTmVfJnBgR245YEJ+I2lgZD59PzN1c3AmIUlfI0tiKHdfS0AwfUkoR2IjJVBRRTx7UHdFb0NsQ1NuaEZRfDJSKnsrMlJJRjx4Cit7RjBROWhxJGM5YE4tTklVaTR5VjdaKXVuamVhKntWWFBWWHsyMCZjKkI9Q19NcGFRTWg4QiYkQ1l6eUw4VEYzVjlRPU14fFctQ3h0VURICitkNW1UZ3YxIXlsPEE4PSV8XyFzVjx1aDVufSkqJE8qdVU3QjdPMVAxMkptXlZaN211eXlqX1Y5P1ErODc/KD5Qcj14UFUkPn1IekxaZDdwCitZZkwhM2F1JjZgQnhoWEtYPFByYWY4SjdONk87XzZEQld5d1h5U2skKkBFX2YkamNzQGx+XktRMk5zVlpZQmtfPEhTanBmKnZyOHY5dm5RCit9ITIrbnlDYVAqJXZ9YDc0U3V+MS0hWXNIb0BMMzQhNyZuPmlMaHckX0x6PktkQmQ1QDkjbS1MNVBOTXc/JERGSVYmYURlaWpHT0lvTzU2Cis1Q1c/ZU9WY0dBZXxfVk4kNGZyWl9EOzZxelckcWw8M3lSMTN0dXx7dXUhckcobiopPytRMFdFSThGcXN7OEtkdjJEPFNmak5sRDNAKU9gCitAWTk4Y0gxK0F9K08yPk9HX0tjbFUlMjVBaSh8M0VFSHFZVGcjRFFefXdXUjg7VnlscGRmfTBPQTtaQzUrNEgkan4jblYrclY+b3I+Qmx6CitRMCZBdXVBbzlxa2defktXekVfejVKO1YmJkR4SXVGJjc+Q3oqLS1eYU1GR0Ewc31ydjwzUVFpKyR4JiFNPnwqM1ZGSXUkT1E5O19IemJ2CitZQmIqZz1FVHN4QURBRFY7KHF8bEFLRV8kPTBXKj83MGs4cik0Xk9UfDdCb34/bjBnfG5sbz5FOSlvbDA5JXY2ZEA0T2U8NlZNVUFydmlFCitwSnBUPUZFLXI7V2kweHQ7azgheD8ofDlrfmFYVE85WXV7OFdnPyZSSSZmXkR5ZlVvdFFaM3R4Q0lYKUh1VGVwI1d6PDxhNjxldVE/eVZJCitZYDw8MV9CJDttUUtlaWMtRl9PWS1YM2V+TVgjdHhwVHBtPWJRdEd4TyhCUVVCYipAMXpAfEdaNEZOPUx7S0dDd0tyNj9MOFcmQ2F1cHk3CithQzRWP21kXmtLWkhhOT4xZEJHdnZiMHY2PTlQTGhraTRaY2N8YmpLbShAKUZ1THB3QzFGcVgjfVJLKGQpe3g4cFU0bHowJnY3JWRLTHh4Cis7TCE2ZXdgNSo7MWkzMUVKPTs+MUNrcDFOb3RmNGZpRWtNVTIkJGdaa3VLRntiJlNsQ24wdzI8PDJZQXJBWWZHSn18dyVgK3ViV2defHZxCisoKSt1Z0VVJG1fc1B2UX1ET1VkOzg7QGU7P2N1QDVkMEoyU0NzMGNSMVFZLU8wMDtve2xAPj1paUtVLSgxT05jZjRnZGY8MDAwMVJYPmMhCitKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZKb3c3YSZ1KkxYTDRfS2FCeTtPVnI2bkphQ3l5RS0qNEpUNVBzCisqYzd6c3JJbUg0MmlsUCpwMzAyRVNHQVA5KTZzQ1BuKEpyMWp5VTJBdXAkb0pSWnRaZ3UweU1jUTtLakdQI1pAPkJHaHBFQGdBTHREcE1wCitHRCVgaCkzVzBLTV5Ke35Ke0opQHlaR1pWKDw3ZjhsfSEoM2MocCpEI1UpQEV+Q0h6VEhOR3lVYSloWm9wOShhTExEXnokfHRveFp4RH4xCit6JDBjQXU1blFtPWFMKHBRNnomMy1KSiNPUUdwaWc7RklpN0lgTEJZSWhZZmdDNEJvMWhJRyhReCs/WD44ZyFeTSF5TjIrdUpgMHFTVzFpCitaVjxyU2BmOFk/TSlpdGJtUCVnPXF4ZD9hTD5zI0tpN1dzVXJoZFlWMlFQfG07UmNBSjBWODErbn5mQjtSNkcoWjtBX1FIWTwyUyRCNTNLCitHSCkzYE52NWRmRjB1KnsmcnxfaE4wVmNmUHFAd3QoXnRjfmVRelNnZiRJPj5hd3Q2U3ghfUpOcHNFSH4ocGc9fEclJVhMYFQ/IXNeN2xsCitTKDhiV0srbl9RfSlDOT1xZnopJXU9QkpVal9yKm5KdkQ9Sk1FX34+K1l3YEdWZXBsVWFtdkhZbz1wJCUqaj1APGVraHVUSCVvOFZaM0pYCitIXzROTl9pI0tLJnA+JUpodm8zKVRwY01uNEsjZ2gwT1ZlWUVgZ19fVCFYXmNsVyk9a3hBI2BGdXlkQnNIQjwxeWR4eDRYRnp+cHRLWWRDCitNTTx0RmQ1QUlVbiEjNzg7d1dIWEc/IUxUMjJSeDFxPmhPKDFscmR6OHYrUiNAI3YwcDYwWDEjbFFockFucjdfWUw9PEkqVnJlPnR0MlR1CitHPml2MiVsKC1PdGNoWFohR15zZTcxfjhrTyRDZ2BCI2JZclZqI3Mha30hcWppcnhZREt9Z2VySF5yJVlzUShKfUM2djZ2RSRWeU1Yfjc+CitJYSRAM1ZLczh1VV8+bFZxSnEpQiZFJEImWXRtfnZwdkYocVlQV3pfd2QlRllodj47Mj4xQjI8OEdaI3l9UmBacUlmQDNSWT1mPFVaSGRICitaUCVNM2MhblR4dyZOfX55dFQkNGNBYWk1Rn1HXyVCNXRKVTBxWH16O1BDPmUkNlFSQiN3MkFBZlJpc1p2OyNjQlJtdEFAdEYmK1BVJkBeCitfQkNfRD1UQVMjNyhucD13VH1FITshPF5leyF4Ym9BcnopM1k5R15BSihSUXohRDdOYGJYS0lZckNJe0Y+UTslWHplSGl8I1pPQ25XUHI+CitfWil1SXYkKHQ2Q1BnUHRVNnsxMGxJeXVBfWx4K1NibiZOJlpQPnlwamw7JnVAWT5IcigmZzNRR3NAeFNLXmM0TiNTITNnXk1TdFQ+eGV1CitnKGd4V0Mwd3Rfekw/KX1NU2lzTnJwZlRpQmJ8YTAmMEhsUChNeXpSMHFhR0ZgZHJpdkh1PFdLQWtocExDdUtnMCQ9Y3p9UDtFJHlFSEkmCis7NUhCcjxJaUhQMXowYTQ3Z1VMYzFsXnw1c0MqQFJDPzBwbF8xP0lHV0Zlc3hpbTFhXyslSU9SWlMpazd0cU1PNFpJP1Zqa0BpUSVqOztqCitkbTMhNEVIc2d9bVBtd3dneEBnVjFlY1FWRkZIJmxZM1VEJTk4K3F1Mm4rc2BoX0tEZUM9eXIlWWB6bDZUc3V1ZnQxUzFobGMqWipQbSRTCitjbyE8PjVNZHNjNEU9SktFNW5QdnM+NEZkQVh5Kzk/WSFKUmpnWDtnPUhvT0kjUEBPNEQtdmRAc0RXdGwhVjlrayQyLWg4Jld2eTMpaUF1CitISHxvVDk2aXpaV2hTeFRqdyghN252UCZtaDFvTD9SM0V4RHt0QDlxMXtvKktWbkYkPStwNXg/U2spRnoydz9vZWJmI3N7NFk+VDB8WFFSCiswMDBPOF5PWTd5XyE7UGZUTFM8OVpVK0RXSFVJenNhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxITNQVlJCPztiVDRDCitRVlJDYjJiWn5OU1ZyNm5KYUN4MG4/ezZBODVkRj95RjtZR1JiZyYwR1JWT3YtMk95QjVCWTs+P20wbkxQQDlyI0VIOCElbk53PElmSkBYCis/fTJ9cnFIMj8+djktbkBDXm5YOVl3QU4yPEpxWH5eaXtsTyQyUDtXZiN8M3cja3VXRERjU1Rqd25UdUNoeV4tYXpzOVgqKHpRWWtAOEV1CitZdnIrKz1IRTllY3t6YkxOZXU0NmFlX2glbk85T1NzK2Y2RHpaMk9Rcy15MXsoZW9fQVYxIWhIMH1Zd2FrUTxNbXJxcyo0Vyh2eiUoOzxaCitfZ3xYJnBEO2w0KUpYJlZGVDgtTGFNYz1kY1EkOD9SRXpjWFdiKn1Ebjt8KT51QW83P0d4d3dPOFEyN0U3S0Q3KW1gSHdFSlAyJmV5NXBLCitEPVJuREF+NXZpNGIzWFFIaFNqfnVQZ2s3R1U0OTUpVm92WUFQXil+R1BTfjFMRVhZS2xRVl5YMko+NjBPaTd2MFdJMn5ecEMzd2o1PDM2CitnU2oyQmtFe2lJZE59WiRMUD9sJUFhWXZFd0NyY1ckTG4oQzZua359TCUyZGU9IURFQFJjMSooMkhyVSt5QjtfeT1pNFIwKlhhSypIfENVCisoZEtJOUpWaGxPc1UmTjE1b3Y1OHUjRV9+cFJjNWcjcTFFZWNiWHFQPWtNclMyQlJocEMzSko+YXZnRmdVN3EwZX1KbHJvaSRpJjhhIzBBCitLbnRUNn5AXjd1MjBSKHdGWGgta21IU1p7ZHFwOzEmKHVCZ3hISE5kVGlORTN+Z2I4fl9pNGRIKnZheTFtaE93MEkyY2hvaS0wNVhVcn0mCitaJGVZP3RDJW9GVVE/RSY2ZX1vRyMqNH5GN3J8MUFtJXhkVW5ETDd4aUxAQExuNVNkYF9kb0xVSSY2SXI/cSV1dl5pcjtSWmFwZ1dMeTJHCis5eDlfKHlMdTZGNjctZzJMRTg4eEp6SSZsZ1hqNkN5RmZZaHd+NDk5cTklUmx6KTkldTNONDVjSzltS1poc3FlK3FASG07eElUMGQrckheCiteK081dFg/R0RqMGhVTDtuZ1VRYEhtKE53TFIjKiY4NmREJUJEI05zVUd8YmZ3MkdGazZHOT9fQTFOS2tNZXI4UnxfRzFsVzJiQnYtNXtkCithdmxEY0Q2SDFfdUpaNHB5QEB2QGs1fEpvJVNxaHUzJXlqSj5qTio/anVacFRUekl3N3BzQ3g7YzdYdENrZlYzdkpwSEJGND5RJjdSMj87CitNKlhkZ1d6JDBvKC18N2ZecD9gaWhkI2gwSXhKbXFPYzdgeGliXlZLOT81UiRyMXJIS1NFXm8/a2RaNlUmaCsofFVTY3xOR21JY0R3Y00kCitEaE4wOG95bVBEWlFyYUwpN2IoIVQyV1VWTVlfeXRGVkYrI1U1dCYtdDY3aFNKQz9VfDVMdiZGVkB1YlpoOTg8VXI8V30xUVktTzAwO297CitsQD4/OSokXzB+MHt7UkgyPjx7KTAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RkpvX0hYPk1uCis4YllYTzVaRENfKlg+TWdNYUN3emcrbTBHSjVQano+TzUkTilMKWFuRk59Q3p3MFNIVmB4UVVBKjZwZkpTdF9DWV44YCktOV9VcmUheVNaCitlQk53UipUPnZEWVJSRnheMHVPRGk0OShxSVNfdThHfHZfcX1fc1FyYXJpN2w3UEd9fHpadFh4WWk2dHp2dkJwcyNaVSNYTys4QHJ8bXd0CitERnArU0FmWU0xSkJZUiVYa1ZPaFd6JjJJN2I4VF9tOylRPTBDeWpEKGopSkFCJSR2RHBXSlg+NHE2azFQdyVGfDdfNjs+KVhxNE9yVSl1CitHKUMydzUhemtAWm9QalRuKD5OUXpARStTVnQzZllAYXlKRGBefDt0ejdOQXVAelVuZ04wfXk+fnxWVndZRDspdyotY3N5cko+SVo7VVNMCitoY3JzQXRnd2ZtUWV2Nk9uWilsdz80QXkwTjBIRUVJaEhQbWhZKzVHantoX2tgS2dJemF0TmxLaiF7bHY/YilYOHNOdXRLUEpNUEBOKU4yCitycU1HcTtyRFROVXpLbUVxQ2dFcnNZO0pRX3N2QyQqM25KN3RmWH4jdUN6a01zeVB3IVBTbTw1N2FsRVpTdGRYJSk1a0J4b0hANnxOM2VwCitFcz0hUUxKKX5geCV0fjRnOEd1UkVaI301RmEmXl5ZOFIhbHBgJHhoWFBmTFF3NG58JlY1WFZlQG49eGNLX1glMShMZCZFTCVjK3ROY052CisyeVIwZ1M0dyhFYjQ4MDJwKjg/YSM8KXd0RF5FWSFUUlpkJFZDQEk7SE10TFFOVnNDJG5DQS1mdkU1SmZEbjUoQHZkZSU2eWJLaDxRIXFsCitmKCVpUXYpU3FfQ2hMYG0lYyFJOVNFd0pIc1hvVj03PVJHaVVkfDxkLXp7SFI3UzZ9ZFhhSiNecXlvdytWfnBudDtGbkxgZClNd0RDaHB4CitGIVdLcU10P09CQj1tUU03RUY9ZWw/a0FgJHsxVXRtVF45VzR3fWZsZWI7RSp6SFBqfVo0a3w7dSlLRHRHeUw/TWs0VSp4Tn59cSM5JHw/CisrOHMkUmchdXMmazMrcXFiYlFee3Vja1FqJUV7JTsjckJiQVgzeShyOV4lQEREMk9gPT8mMzdlaUMzPXcxYXcpT2clVm91fU5eMGNOWVZICitkc25DaT1QZkxCTStOQkV3NStCPDdtYF97cXAqZkBtVHo3bztpMjswWiN5QDtAUUpBOT5ESWBQUjMhU3w5IzBoU2Q0czZ2OE1zXikrRShnCitrTnhPbXFRSiZQSTw+Sn5rV2FkIXt2cUo7S2A8TTdqdlhxK3E/bUJQNlohUyRIa1AzKn02ZmxtUkgjWXJuWmo4IXo1fXhnKmlxQl9VVmpRCitDTUxYRFJlYXlXb0NfQyN1I0F+aTt4cFNfLUwhMzstJjgyWlpkaV51fkt+VmAwZCErTj5xSjNXckZaa2debSlQUnJ0TiR7ajdoX3hhSWFFCit5UHx+ME9WemBHMkshQVJiYT1CVj5yJDNneVgte2hWRDM5MUw/RG5pNl87MThtSEVkdHl9QmE4QUpFTz80PmdfN28xQHkqVShERSMmfVo1Cit4X1JRP0A3a2x5TUJRO0pUbWleQV5ZdUJBODhHMDxFK19NWjRXN2VMcCM4c0gwUDB4VWA/YSFHbSh8ckdiaiNnQndNVCRDMHt7Y2AtMHxYCitRUjAwME84Xk9ZN3lBcDZ9cFEzM3p9ZyMtV3FGOH19bGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUCis0Q1haRSNfOUVedjkzUSUhSCRLb0d0QVMzSFJlTkRoVFd5X0VKfnM3YjY2Syg8bERETyVnKGRSNFApP0poK0FfWns7UURrWjdmejFUWjVACis5bXFmVWhuO2JYP1B6a3Y1MDJqRzZed1Z0WSR5KEwyUz9LVld5UWNHVFM/Q2BnWlZ6RWtHbWArZjU7Q3U1cDcjOHdhUGNaZTY5NypQK3IlCitUR1RRIyFuRU11KGgkTXcoIUJebjZTUjdkb0prQjcod151RShtfC09bFF4WHM9fFl4bVhXRlpSM3x2S1VXT2YkMUpZTWRYOCFYNkxfVDdeCityQldrU29TdUp4MEZKdzsyNWA7ejUqPSQ3eHZpNjlaY1M0ZjA1WD8yeDNuI1VqZkYlMzd3LTAxMlRXfnVaVXRUKmlgcF5iXztYM15XeTZKCishZTdUdXkydG5Qdnd6RlVIOHJVaiVyKHBJfFJ2Pz9hI0x8PGZHQk9+bEJtSFhPZjI5Q3YzbHM+RkJEVDN0fFBlQnw5JVhCOzhTZ3RnQz18CitDcVl4b2N8NCNHSTg4JUMjKDwyX0QwRV9QfmY+OFpEeDkrb18qTj1gdV9iJXZVaTJ0YjtnPld9OEoyVzQoI2p0MFd1KDNES3AqVGB9SilACitAdDdwcnJjPytXSTt+SStNWkoxYShnV2N0UDUxKUstfWg+PGJtWjA8aHA3OXRCMTgjS2FjcWA8WFhAUFdDXjk2an42MyhjNmo+VWJlQ0RLCit7cSsmNGVDWHJ6bjFoNytSZFdqeGhSPGNtKWJtPHY8NzI5PT5wfnZgIypTe3M8SSZDZFpacmxxMzBwb28yJCRkZ2FpNG1nJERRaWQja1NWCit0T1dGTWwmdld4RVJqS2g2e1d+OGNVTnpue1dXdiVqNC1VU2UmbVcpbkxGVCVrZmsoQmF3PXI0ayRvaztoZmNYbjV4aj4/TT00SWBSR3YoCitoTj9LWTV5UlZ3UiolQmU1PlNOMWN5SkJIbGVENGEtLSl+bEY1e0tFU1VQKWg+QDZhV0FLMm10ZXk3RHhQNXp8WGI8MDAxYHkwMDElbzAwCiszfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9We2RNQWJZWDZFYjFyYXNsfmxvUTt4R2BzXkEjZztYCisoaEA2c34mZEk5I1JfR1hkJDJec056KGFXQnt3aU16KDJ7e3JZX2wmPmwqcS1BSXcqQHRaZEBAN1phJEZGJGtfS09gd2xsMk0lSUcyS21PCitxdT14ZXcldXd8djFPV0J4c2g1WjhrdmVvSSt+aDRRWWs/VEVubkY+PzM3eiE5ZWIrU2JMb3d4NjN9a3olI2RqNUMxQ2diJUY2ODdsM0EwCisjS247QSMtaiFtezI8PihVRWxjNjAoR0UreUg/fj1UbkM4WUY8RTNUY3h1Ujl3Rm4lczJZfmI0MEQ3RSE7SE0qdWp1aCQyfk1SPURZcjY+Cit6bk07U1l8dVVzN2A4NSEtWlRwY2pxbUFuM2wyKz5zNzduKTE4djJzVEBnYnFEPEwtWDJpamN5UzZ3I0YtejNIIz1LLWJTSTVLIyl8KWxACisrIVE+YUh5X0lrV2F9PXpLYEVJWiFEeVMrMWx6KWB3RF9ncyMzQml+T0NiPGhsLV9nUlVAZDd8WE5XeHdGVSo+NEdOZ0ZiWH1lV3tkTGshCislRTIjJHJEKyFjMSooMktFJk1pTCZ8WXpCdEpEbVYqfm18e3ZvbCVleUFQbk19ITk1ezwrJFR2NGRJWk84QyR9P0Iwak9ZY3lTeGY/ZjhVCis4TFlnWiFOO2YtTiF7Pm47U041KWgpTGdZeyVGTj9hSilYSzRqNiE/cj0pbkNFZWVYI0J8U3gxN054fjwyclJ0N0UqdzVHJD16Tl81TXdNCitXdzZEPVEyJlFwMWRQR0thbXJSbWs4UUxFd01IPVRoamJ8QX1HPkBfKDg3KEdKTSlPNUJwWEc1RT9sUFk+NHIqUmZgQ2EyUkQwYz1AOys2Cis9aCstZGVENDBoO0hSa1JoYTQ1TGZOeXtic3lqT14/R2EjMHoqWCRENWhob1ZFMFl0cUpkPSo+ITs5dnNrNXsofE1oO1NUT2ErM25ENkEwCitWTSQ2ZzxlMEs5Kn14a0NpZERMd0NtYzBHJnEyP0c1XzwtY0EyfHVUUWtkNSY3eiZJS0JWSi0lcT5NZGFpaE4qdzhRUHdPVn1OezlMM3l1CitETk05QG1UYSpvRWtyNmQ9N3hpeXxEZz5pTEhnYDRJPVVHakwwOG5TdXQ3XiYmNlhGVj09aTg9PGJpKCk/WkxkMHxYUVIwMDBPOF5PWTd5CitzfEZePE9hbE1fXzY3Z3xHeW5ocWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNENZSVcjJE5hJktaCit+YXhRUnJsfm1ocStjKiQ/X2c0KCs3WUFfRXhWc0IlOHVVUns/OV87RmtaY3JyR0g3WEo2UXhMbHEhT3JLemVrb1lZMnBBfEsxcCpxSmFjCis5Xj9lXnRFe2xVWCVPNTsmOW0/aWAyazd2OyVlR3VEandQfj9zbnB3RyNTfTJONCN2fm1UPTlnNFQxamNTQ2cpTHx1THF9U0FpTzczP1dACitVRDQkPmlpT1U/Nl9WLWxieTRGY24zcVdoJVRoK1RxdmtqTlNoTG5DOFlkX1NDWlFvWUFgNEJmaF4lKmN4a0I7aXwydFBJTmBSK3VNSHVhCitXT29nUCRgUCpTVnU4Q3ckR2UzbHwpOCtFN3pxcncmU2s4IWFfNj1fOXhBeStFYGk4SEchY2daKWpmbXQ8aWAyQSZydTJEe05KKGx2YCRVCitDaWdFT2MxTSpkREhXUDVYVk53QjVXPHR0Kj1KKnNVemtraFJjJEpEaEhgNHdvXjljZDhhXzt5Ry1kfjtedVVAZXMrcEgtQn52N2lXeTt6Cit5Mn1pcnk9QylfMGhCY0FvSyFrPHtAT3lSZGgkWn4+LU9wP3RFYzdNbDlkQTF6Y0Y5PWsydyhGQEgrT2E3Ni1aYTQmPCVVYzNAJUQ9dH40CitYNV9wbj1Oan1ISyUmPS1zbXQoaSo0ZDh4V1VLckg8akV4eWx8M2tzKUNeZHBTcGFKcVE5TG9BZXI3eVdDSFdVKjVjel5LWCE/SkUhbXorCitAMGQtO29qYU44ezFyc2IpVk1FdkFEY3EyVm0xa21nfiQ3KThyKjd9STxpJnU3VVhBV0UyejY0enAwNjhSKT80Iz5obCQmOV5fJH5DMXdwCit9aF9TUllxSSEleEg3VTUpKHhOUGg/bTlRNGZ7VG58LX1WSVNZRDZHQUNfKG10TCZJPnxweGRiciZlLXsmcTMrWTAjeUFkSSVFd3IkUCU3CitxemAyZD0lRiZrY0J5Wml1Unx2eGEmTngkZE48ZC16aXhVJiVMSkI+NGheUkZ8OHQ0N1RkbXhoZmBWZTVaaVJMMWNoOzs/S2wpY2NxRGlUCit8PntwJjZjb1gqWHo0d3JWP0lRS1lkNWxeaSh5aTJkT3BFck9yMW5mMiZvS29zckA1PFZgajlZS012dzlSREBUWlJSNWA0bzZGdWpPNmE0CispNEA3cldEIU0wTVpSeDRHKXh5SVA9PnMrUmRXcjFDUiQ7Zkg3bDJ8I2JSbVpXKTVCQjw4UDdIbnpLU2tHbiFLeWVeSkUzbkUzaCVyb2RyCitybE1vaD00bThga3d9NnkhPVFLNklkLU0oQTw8NzxhTHVfRzkjJFdRUmRzXkRENkNWRXohQT1XSlF+OzRSSH1eOFB9ZnprTXV5PVNgcyZZCit1TGtoNV49K1JiKG9yITc2cmMqKTNQdEVyY2U3Q0tlaGU/UCloPkA2YVdBSzJtdGV5N0R1S24obThQaTAwNDZnMDAxJW8wMDN9bGE0JW5XCitXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FWYHlQPVdNeTxPV3BpVjJhJktafmF4UVJybH4hR0U+TnBVNj1VMHI+N20jUWNkYlFHCitSeU0zUyhUREF9bnB9T2o+Uj4mazF1eD9eVXdyTVo+PnZ4PGwyIXc4JUNvKD5CSmFndEZUd0smWWE2Zm4peGlCOH0yZCsxT2B8LTVAM30+CisoeGpTRTw4NVQ9VCt4bkwzV1dxYG1uI1BWTXJNYSs/RTRMO2VOTWdiaU9aYTUoeUBDX3JHcGFMMCFzb0B+SmkkP25fS3tDYmhSJmJ2Z0VgCitfRjdsfU1HbzVIWlo4JUl2O0VXLXglJkVAZUV1aVlkI0w/QzdlRWZvOHUyLVJ0WWBMe1NUT3BjaDNqd14kOHgpVHJKdCRUSTBtVkg5NiZqCitae3REeCotZHxnc0dufTxJITYyNyVxViNHKy1wbWM0aXwqbzxCKHdAcyhtflhIXk9uQjRgPCFjTTl3bGM1KHxvNlFENVFJLUA1YzNAe1A9CitDS2RVfEdUYENQbnprYUtiWnBjSFJqZG1RQUtlIWlxb3pwVjVkfHZCWDB9fkwrJFpOVF9mY3BCclhqSTV6MWJAQHcxSWVlQVRYM2ZwUT9LCitjJG0haFB7ZjBgRDErSldLYWErI1YyQzFPUWpFJGVGbk9NZ2IxLSpsYXMtWCVgciZmWX1yVTd0fihyIXE1YGF5KTA9c1VGJHRQcip1ISk/Cis/aTJFeExSKGMpP1B2VmZsWjNPez1EZEN5KEUtViZDU3JjPGg0Iz5DPyE7elVlWURKSU8wMHc7cFdWQlVXc2tLWC1nSlgqWms9IWNfKUpNCitjVWhQVXB+clMjUTE9XjxUIWxJbX0rPnYjQj81MDZmRyhWaz41eSRmZCp+UU8xJiM0QTN3aD1gOGhFRHpCeWhxWDBKUzRYTW1OYV9UNXhHCiskUDZGT0VydzdTZn19dCVVO2wxOzJ7V1UrVkhNOF4kdkM0TnAqPjNVKjklMHozO1QpX2IhMiRfISZfTkphUWxNa2Y/YHxsJlRIKVFYMzFNCitedkpoISkkTWpKeVdjdXBmRVNNfT1OPWZpNTEoOGo3bVlAIVdESmZpbjRLRCpoU15aVGJaJHJPPiRvXjxLSzxvUUNiVDBXaXIkLUViKmBACitaP3k9PzFTeiYyRiY2QV5ePVEqbUNVKnZDPyhyNk1UUzBzT2FWVntnMW5wdFdyZkhhOT5PK2d4cm5aTXh6T0xUaFQqXl4walFvNio2P2RjCis1bXUyYH5eRHJodHNlI0VxZmYlWXBHSDdqcWxWcjwrMmhPa182VDIjd3JRKTNrN2NLY05EUDhDJng/Mz1UVV5CXmExMlkqKXRJKm9vV2NkCitQdz4oQnBEXitNX0pqciMlaXpTQWhTaVd+cGRsbmBXeX4zWVFyXlJQNnYjQko0MnhnPGRvdE0tdHZ0MD95e0kjTlY4QkFHTm1PVnZDS2NGCitAcm5JSD8kRmBEaHFXRVFseGNNKE8mQUFSeTBEPEpQUHN6eyh1STMrUFZGIzttT09EKVR5T2JZYyRKejc/eSY/Y3IyU2p2c0t+QCtZeVp2CitBckRhYUNuT3xSSndhOHJ7SH42M2VPPWx5KHMlfmQ+Rm48aDVyZyNCSG45OGM7b1dJZlo4QCNJJTB6IUNVY1d1eHEkbDxoI3BvK1olaFl+CitEYzVWN3hUUipaMkB9XmEzJWJnKUFCd3k7OVQjUyE5QyttV20/eTIkNDh8ak5BeyhqbzFBeGJXUnpzeGRTYjxKWEhIVF9uckVgfCFqLUZ9CitaZEk4YUtlYk1ZS158Qno5NllxN2BPZXQ4R29USHdDN082KHRaKDVhOCRmTygmTjhNLVVZcSZeel45OFE5NV9lYGkkYnVqdStwT01qJUd4CithKGpTXjZPI25VQjBxMmZkVSM4JjNPQDEtO0NfV1grYkgwWVUlNWxKQitEPVRmZlM0dV5wTTA4bVE8MVFZLU8wMDtve2xAPj9WTmQzJm8xCitwb2tfOXNtRj8wMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZKKklNYjhSa2dkRl9+T1p7a0p9CiskS1VmUU13Yl90TlNJPXEkQlgpY2FGQ0VBMU9kQDBfb2lDeGIrRkZaYlp2NT9SbGo+QGB+YTg/MWxudFJzc2YxfGNJRyFieVglPk0lLUk/CitMZn4oR1RadmcjWHlFN1BmO0hyUCR7c2VuYCZrQVFTbk10QDs/dnZ7YTU4OG4oITN8Kl57TntSfEM8Vz5YRUYzRXBHU3tCKE1sTzFPbCtWCislJjdFKGRySypZcEF8QUNBYE9EclN+JkY0JHN3TTY2d2V1eTh7QjJlKU0zPUczU0NGN1FvQjliO3RTOD5GYlF3Yz99N0F1QDs3UXVQQDBgCit6OUhmZ3hEOzYwfCVJTSZ1ajlOUVAyOU9GTE9mSk1iZ3JQTTEtaiZjbGxqSTBBNGQpSz9nfi1qajBZcGFFdFdLQGBBbjcwbSlhVHxhSig9CitUNFBTRTd+UFROZU4tI01CZ3k2T0lRVTx1IUlqditIUlBIJEJsP1VgMVZoTUxWaDBEdUN0PHtyRWxZTURDPGI3ZDZAMHRfMjI+ZUdRPj5iCitUS1pEcVlLRl9IPVVORSZUfSUzKjFRRWk1Iz1fWlZyQEVCTEk4NmspMGZ2dXZfWSRPd2NBRVFIc3RgeE9EQ3lhM1h+Wkd+M2VIN0RgUXZGCitXMil3fGdTSyM0a3NFalBKVGQtTkY0WHopRG8jRWMmOX5jbDlgVkRVKm1gWWZOKHBoPiVqRFd1SXhpYDdGZjAjZ1BAQ2N0PHFmdSl4ZEF2CitrbCstYkRwYDZaRnVgTkRIQ0ZzQDFvS1UhaHA3fnJsbVlUcUV5eTZXfE5sU2ooRituV3FKPDF1dmFONj47e1ljJVAjQU5zOGszP0R8cmAqCitFaVBGcVNnZ1Yla2hAbGg8NDlWOTByWko4OD5FeEwla257U2w4aCF+e0pYWDV2fW1GPGE4Ykl8PkFyJFlPUVU4RzM+TDZ0NVNOJjR5bHI+Cit3cTZiTWZqIyV5bSM+S2R2VXJMV3Bsbm95eT5rezV2bj5tM0lENXlNPShhYj5wQj5ePmppLS0hY2BEUDxhKmFhd3J1RW5TPH10MzQpOEY+CitrJG9AZDNfYyMmTTl2QllNK0l7elN5O3BvOSNsdnROOTd+T2t4LWJBPj9sUjQkWCpvUSR3Sn1nJVAqRH0hcTBHQygyTTJWOHZ2Nm1XQnJ4Cit1ZykoUHJrai1JakkmcGYmPjNKSipJP294ejhUQDwoYVIkJHMjRjsjMjVAKyZVZ300Z09SZnd6YlQkUSpnJnNCLTVAPzRGJDhxZHs7dE1PCitjJnhPJkRfQFY4bnRHOD1KcTJoVDc2Q1I+QkpNeEQxMipXa0coYVpSM1U2NCZIOEw3ZDxATDdkPlpEUkVQdG4tVndXSWcyPXA9UGNxWnAwCitrT3dkQ24lejx+ZDI2PFQqKjQ8VC1+cGh2eXZQOUgoIypTN1I4KCNoQko+Ujw4NmlpYGlpUWxETVE3RHA/SCtIYjEmXmlFRSN+UCs0bk8pCitIfXZKcFBONjx0K0pWKW5wKFhPazUrVH0qSyhoI3h5dkArKDZCaz1ON0dPRk9Xd0JUamswRmMqTDwya3lLJnJ3K0tndFRodFp4MSl0Q042CitPZyV9Ymc3dWRCaUppdUdjbGQ5WGh4WHMhVGI+QlIqIX0kbk5McCgjTmhOekZFP3JeYXwyeWJZK2NqZz9qXnRLXkZuU1NTRTItRkxKSWheCitYVShDdHItT1UmNmBic2xRLUZXdiRxMGslTzgpZF8yNTd4Y2tfQFIyZ2A0OUV9JUt4REVAN1U3Ylp4citJP2NVR1koJSNTNnZmal95KCUjCitTNnZmal95KCUjUzZ2ZmpfeSglI1M2dmZqX3koJSNTNnZmal95KCUjUzZ2ZmpfeSglI1M2dmZqX3lIb2JwU2x6OW9yZE96MkRfcTRFNzB5Cit1cCo7PEE+MnFlV3ZeTEp8cSFlWWhFVTJ7QD0tMmxMO09mYTtGKzlKVCZMMHs7NV5XPzNefGt6aDdqYzdBMzxHeFBWdllmN3smTm8jMVlHCitVZlhKaiU0c1UpIWdIaWxkSjdKY3dmfUtjKExvLWdKeDJPajdFXnc5JkJtWj9lSnRSJVdDakBYPDQxb0dMd248Y2VTalJEcGBab3ZMLSRtCit5bEw1K21pLTc/aERHX0V3ZF88JCtvTlNDSlBzWXd2ZXlNfU42Uyk0SXpqfEB2fWB8NytucVN+PjlDZil6OGk8Tj4/a2Rhd2RgYU9UJVVpCitYdFlLZjx6TmUxWCFraXI1NHF1YlFMXyZefEwlbj4wOT4hSTBrezsmUWMmcn1ZNCE4OTEpOTYyY3dsbFlFbmBnVnFpPHNaJSp7KyhpeSo9CitCIz5FVnkzaGdnKVM+KjJydV8xLX19TzcteC17RCh5RHNBcyN3VShkeVF4VkApR2RgcXxYZU42K0J3dDE4Vz8wJDgzTkNNKTZLUz1gZSVRCit7djlLODs4TUBZZUloU0swVWdlKDxYKHswVUc/MHxYUVIwMDBPOF5PWTd5dGJEdmgzazNpR1VKZHtOR3luaHFhQXxOYVV2XzB+V04mZ1dhCislRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNElmVmBefTRhJktafmF4UVJyckItY2srREgpbyZhVzZYQThLXmUyZHlleTZYaGdBCitOSjkkKkB1RGl+TVFFfGR1dmRFKj9YSHUhenk0PFohaSNPJV50enY1VVk/bkdXX0gkUlhZfmlKYFgye2w3IUc+PEB2SU01IUBKJlJJQU1GCislSURgMkg7WkVeMjdjN0xIXmJ4cCpOUGcjRyRYdXpgO0V+TDI2czd+ZzRKWFRNZThmPDBRR3BEPSlMQFlQNz4pTVc3RCpJRXZFVXZ2VG5iCitIcCltRXpYNCp8bk9zIVotRldDbmQkQmBJUHg2aksmIW5eMzVZMGpKbDUmVzhfdzVrIyVJMyo5aDtza1BOR01VQ25he2o4Rm42aGBxP1lACit+OEBeUEQ2QUJje0g9Z29rVXpCWHxScHAjZFhkbDktSllkSHFDOSRYQU1+I0loNzlNOT94WVBuNmdOQnIqbiUyfmc7Qm94dXxrMkFKXndsCisjMlcjPkdMNDVxRkRHO2o/TFBqaWdkeEAkTUZKJnMzfXdVaHlvUT1HbF5Gcl9zRHQzSnJvKiZZMW1xcy10M3ZXdjVDeWBNQnFqZWU5Rzx4CitBU2I8entmSjdGMW0zIXhCM2gydjA7I31aI156N20rKi0jYkM3blA+LUI1KzZUVDgqZFFYalpUVks+QSp7VUFVcF5vaG1AUnRUfWlBUCFyCitFSyhfRUBGdSVROSUlTUJKaGNEZ2Z2XiQ+UFV5djteTzxMKy1oUXk8NyRPKUxMUWNSZUg1K3tJQmY3LWh4a003bEFJR0VxdD5+OUExYWVwCis/MG80WUE9VmJZej4yZmY5eEpCNygmST1QJG1VNFIqNEw5ciNYal5ySzEwWU9IUm5EbyZ3OV9wPDBkdXAkeTFWYk0tPj1DS1c5Jih4fVYwCisxO2MkdUlSVmx3eklNT0Q9bXRGTXRPaXEtbnZFO3hzIW5lVTxKSyVEJXJYOGhYIWQhVFN5d0c0VTs9N1I8PX5oNmU8RjZIMkxDYTMhXnxyCitsVChUdyU+TC0/S2hvdz9HQ19WTXZfd3BgczM+dEV8SWZGZ0Ywb2VpJXhWU1AlOzcrYSowUngrRURLYmQ5P0MyT2xkUypDMDlnSVpaP1dUCishPjx5OUo8YHQ1T2oyI2BMa296REhOaEIrbjc4MnEzJTZkWG5PViYhKC1iWlF2bH5yMl9QSWxVKGZjJkhLMlVVTlY8bm13PkhXTClnbjIlCispd3lPZjRQMDVoeiZea0lZb1ErMWJgTkJxeztlfH09T3Fkbm8pWW5JZ2h4UUlsU3Bkcj1yfWVkNUl2VD91bSlsZUM9cExLenRuRUt7OFJmCitLJDtJZjd4PVA9b2RZbFdOZClUR1BQeWc0PCZfazB+Vm11TXtlRE8lNWxnZ1pocSFPUGU8dT5EQ2spaWBUMyVYfW80Zjw7JmtzbkVucXokCisrQF4mOE53JHk8PnBycl5ZUXtTTWl8PjhgQSF8Z2I7PDNZSVh7e1NHWmwxYlhWOHR2fEZqXmZ1fXc2OV5Td0VlNGN7WjRhO2NCKD1NPHBGCitsb19pbFBiUlFoZzMme0UkRl99JmRCWUtwdUJ6YURXQjRDeFBvfERybmt6O0EpODB1dzJPYGFGODd6JiNsQktmOVZmbz9EVTZtcnVIdHBvCitDflolb1UyVyhRUkJwUUtRWVBJPkduJSF8bUdjTEBoSjJ4SD0rUXgmOU1BKWxHV1ZMKUdgSjNiSW9MbnFiPTVmTXVifWdRaklsSCR0a3wjCitVWXYkWEw2dkgyS0l4dT5LUmt9e2NPJkB9UmBUZld3UT5HZih3aiFKNV42YUZJaWpfaTxITyRVPmxgKUZSWktVPno4T1Q2fk9kRVRqempoCit1ZFFhWHo1aGFXa1ZAQVUyXzkpUHVxPG07Uk1nS2hWI2EyVj5FcnV7NzQ/OGViJlg2S3lLI0MwQmlIe21NYSVjaX0yYzNHNCs+OD8lZlU3CitPTkhNLWQ8UCM/PG9OUDBuXnB2b3ZlaFh3V2s+TSg1Pmk8RDRMREV6Sl56ak10a2JlZkJXTmV3X057PkpBbyY2YW57OWNzQk9tMmNjKVRjCitoaC1xRjw7SmFyK3hZfXlseXVDJnZoJW00ZHNHTWtJTyF0KCRoajNeSzUjLTtyJUxBVU1ncWpudCQ2SWBxcXhkTnF7YHtoJj8rKzhtJkVRCit2KypCTE85S1FIMDAwMDgwUH5kPU09SW5saypgdyMwR2hKXjA1U2pvMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpCitNWGtsXz5XcHBvUGJ6XklDV14hZTVFXnY5Mi1FRlVJTnAmRlRAQXBAdiMxfnNDKGBRR2xtJm1idEIjZCEpc1dHNGUpYmVOfnQwKnEhcypBCitlSnQtQH5SKlV4QGRmPDJQbShoUVEqYnh2bCktYUJIJitZQG99ZSghdCNAJjZ1d15QflVyYEE7NHt7YGBrT2BwTTZLXiFTP318TVo5ZD9lCitWfCg/RHlWJUA5flNAekpMN20ofSNjaEBYZVFCS1lzWX0qWTYpNnpKMmB0JE4mNG8qSSQybXxOT2goe28kSnJVdyElQSQ0YCYxelcodDNvCis5YFo5LUpralh5RlZ4V3tGQEtvZVlqS3A/ZlpYenxNa2I7enlJfDNfP3lSZnwzUk1qPVlSNzR5S2xleF43cnJtVSlnXjZffDNRWGtEcUAzCitAemVacFhaLWx0JDR7QHtmQSM3OG0qMmhyXzJYQjZvRS1vQ3JNfjxtdWl5WGl6U004T2Q7Ry1AfE1HRD9wWGJpdkttN1JqQTN5bHw+JkYqCis5YHxhYjRfdXN6JV52fn5xe2QkcmdlKkVVVVBhbDV1aHg7LUE7QGlMYy18cFckOSlKSmtyfm1ReipAdihIPkM9YmJKXnQhKC17RShVPz47CitfJF9RJnNqYHwrRFVKXngpKVV3YD0zciFQUEtRS3xqcilCRT8yWiRKTCN5TU1XRj81YGh4e1A+NSpTNl9iZmAxSm5RQUhJRU1lOzM0ZWsxCit4T1pePyY7Sz19IU48a0g3eCNuP0wmMUFITW5ae1ckTFd5WjRgZF93QXB7QFcxQHpteWFMNnxNdEdxJEE1WU0mSEdSSClCTmxZenh3KmFTCis5anRjZkI1U0NIe1pVMGVFSUY7X2tRPjdafnZ7Tns/M2ozezcqT1hfYDhwSF9FV2xse2RvVzNlJjRuS2BUZUpGQDgzTXVfcGQpKz9OMiM9CitfUEZjJUZUVldGe29sM3Vka08jWXpVZTxjelBAWVkpMU9uU3NzRXIxe19Sbkp7cks/QjxvbnlaQGJDWSliRylEUVUrJWJpe09iTVY1OHVCCiszJV4keDA/OVNvLT9CbDxHeylfK20oX2pBTEBxP2ZJIXtmakk7RU9NUUBSTUtzIShaUUB5XkgjT19wWlFLUDlKe3ZgI1QxSXtrUnxOKTBmCit8VF9zOUZyPytwSV9NXz5II3p1cVorQEhlMFRgMTQ9PGdXTGJSJnd1ZmdBTn5DMmtIN29yN21wdTJlKWZZZWUpMEphZkJFQWRlRFYwJUZUCitlUU5QaztXUz8+YDx0ZkIqaV5Xdm4jK3FmLTlZR1hCay08P2xZO01mdk9aLStsU3Y+dT4rYD9FaTNBQFZFQ0plKk5wbVpAPktLX2pnNXFfCis1UTtoUTsjcTJNKUxiVnt7TzFRdVJuaENQeEhXY2w3QjFGemtZbzkmRXVQby0rbEpAbXJvej09KCokWC1fYEcoJWZIcHxYTHMwdF81SUh0CitkRUZvU0B8KndoXjw0KSl6bXh5bmh1Xz47fEp+T2dLWXNlYEBpIW04e213YEt7cyh2M3d7PX1fZXw3RCo+KyQmSSYrcCYtdW0xUD0oTkYmCitOfDZ7bEV5PzF4VUttU3J+LUIwektQYWw4eGAwYGgzYT1yY2k5cFY0O3lUfFdAKCVtfTB5QFRZZHVtNW9PNU1TVFZjbFFCKnhKJnROQWE/Cis9Jj8pUUhYWnJ7RUM+Ykt1fntRQmNSe1pYZFpJKi1SK3tuaHtlYz44YG9AMUl4SnBNUVI/YHslc1l6eTVxbWcwfmZhez5BZWRBPGJLeWZCCitWKCpJY0BwI1UlJnRJQHdhfnRVTT1HYjFeVzJVdWJncn17P3A/eHVEfC16NH1XPzh6VzRXKz83cH5mX2tPXkNwWjEma0wrPEJKeE9UcSUpCismMVhwSXIqKUF7PC0hMUAlTUt4YDFPQnU7bTVtb0tsPGVsfEp4VjtfPXx0fCsyPXB9IUhAcyhaJEpPfUZUVkt2WitgaVUmd3UpcGZCZlBICitfeTQ7eXRNOS00PipzIyhIJFZRLUttUHBsfEttc1pAOXpzUDxATGtnZSkmbiUrITZEQ3txKW14R0dHNGM+LVVlKDk8Tm0xfEhhM0RkLXAjCiste15JZH16SSF+YntuYEQwWn0tYzNgfFI0IWBzQCtzYHQwaUtkQjVEaGQrYz5TZChfK1d2Jlh1WS0oODxRYG1PS0p6MXtEdz1YYEVgX0lSCitCQj9BQEoxYCZxN1VhZmohdyYjdnBiZjRBUFlIeyQtVXgpYXcpfDgtfWJaXnMreXJNeWZBJElZQ3thNHo4R3pSbW1QeldmI1VPU3pGUCR5Cis/cVQ/dmw7RVopRWIxYjclY25sVlpFbFdEdVhkZHB6VTVsellFXyZpZ1pRZkJPMDZ6SXVNPTlgXm1hPyl4RURPcz5iJS1YKlhWUzA5RCt4Cit9KWN2O2RSfFZLa3VpMW9jcnhOWWQzZjk0P2Z5NkR1JkI3SkxEZTxIeHkqfWhfdUhvKVJmOXlrbmlyJmI8cWVmbFRROXN1SXhjNCFAMGI0CitjaCVmRXRmfDJ9ISlvX0djTzU+R1orOTdYeCtTJkh4bT85KFFobFYwcT5KUjhmNHpQO3BPWnQlcTE8KTM+JD1tUGAqWkllZHYzMEx5NV8mCisrOzBfPD5zaV5NRCNkUjBqZDJ7UDs9XjE1TXZZdnslPipLRDhRYShBND57MlM9eTFkPCZ2VWt4fFJQOVBWYnVfPWJHdDg7Y21qNlVaJWVwCis3Kyg8MnxESk4wLSF7MmR8XzRrRnBobiYmPTNzaSpxeVkqaGRLVkUyOFVyeFkjTUJlMVZtaElpQGkqRHBnUGM7cXtYPytsK1Y1XkRiYmJXCitXaU9rPWsrPF9VbGM3dEd2RzYrPEglal9sLVAtO0pNfipxPGc7a3Y9MXVIKUN9NilebUJQKmVwRDd1RFZ9Y09EZUk+VVZfTWpBS0ooUHt3CismI0FqdWVySlYpN00+bF9rU3JnSCtTd1F4ISYlUXh7a0tJbURHOGdtcGN5YypYPSpVaWAjcz9RKG9IM1FDbTt7Xl8yQkktZCF9JmIyJVRtCityaVR5K1BjN3dXXnlqKj4oYzMmKzx4WTN9UEgxXz9YK2wjVkB1cyVpfEc2ZmFvQEJYJllxSGlrb1ZtUEtlJiF3aCgwPXt5dUMwOVBmaSQ2CitXX2Q1XlMrfE5DSShSXmd5UHxROGVSeFE2Ul9uLT99Kld+S3Z3NiZ4MklvbjBIazhKc0NHdD43P2ZuM3RRKXFMKjBUdXI0TTc1cjRYYDY/CitoNil5S3B7Zi1XSTBKISghXz13O2B3cEt9Wk04JjRzd0NMV3J7VUNZOzhVSj5ZKTkkV01ZaHROMGVETlZvSW4kVUJlQHhJNi1Rcys+dkI8CitAbC1zKylkeS0tOTRuZjw9UWtUSU5IezlsaCtuRTlEVWUyKGZ2MEhwYFZmbyhBYChlU3s3cEpYcVh5YlUoNyo/ZGFWP0wpfVhBWk90N2pmCitqZXArdVg/O017TG5pO0NVU0tjX3dWTTAjYUsqVl9jazRAWEIwTEBwdTUzJmM+VCQwLVRnJEcmaEYmZ3JjUHpiOzx5aThVcnRDVTtrVjxGCitrMlo5MlVQTzFnUDVyTSh6SzBHeXY1d3xVciYja2o3dHg3NHtWbypsKXtlWSFLa3xnQnM9dkl2WDsoKnxkQ0VPWjRtSDBeQXU/fXhNKlpRCitAQTFkfGg9Pk57MF59RDtMKCh5YmVJSG1LVGA4RSVyZkNUS2k9OFhfdXZndnVsRWlHTUlQby0lNllyQDg4eCNtKnkmY3Uxb2tGR3F1cjNRCitWKHp9LV57NXhHdG9wMUdYLT1mUkYxYCZ2Xyg5XzErVVgreHN1RDg3ZGx1PU8hSXBHVT5LQUBHITNyUkZIayNwZUJuJmYpUlVDQXsqUTV6CithamJwazspNnpEO2xHNHlUWHcjeCRYPVV6aT9TfDhkVmNXTyYhX1RgNXx7NDJsb0lhQEYpWjZZTCZFOUcyKk4+ZXA2Skh1R31kfDgtNWpKCitVPD42bk9mR1ptUnpTbktMdnw5I3JAb3h0VTgpJWpWMEArZjsyJG5UPVVpM2gyYHRIP14/ZColMV9uJClCQGcmJVFGPSpXTGAkNFl3RmcrCitVdnMmfnAwKyQ/c0N9UWd4JS1peW1zKTttQiV4MiFfMTwtNk5FWWwqeX5iMUR4X1d2UnhvWEF9KCsydnhraiNlc2MlN0xwWG5IZW1kYUMtCitUeWU9SyFUZ0A8TWo5MEMxWiEtYXoza3k4bW9XaXxCKSYwTSY8VG1kcmJCRnBTJkU7dGJzTi0kMXNxZW8zT017KnBVaEAqfSVqYUN2KVppCit7eEV5SX1tK147YzNZbj83bW80R1U+LVFHUGhHQWM8b3Yma14tS2N9ZUgjRitsJG5vaChXOEwraiNgO3FsaCg9U3xpeU0zSjNqbSZNVDElCit0cztFJEhPJHw1RDVIZGhWR1cmQVVvUG59Mz5jVWRIJiNjellScT8jXl9BRzR4eS0jQjwpQTkzPDh0by11dSRgeG1PdVAlM0FkJEM8WFFTCitzUmQrcClYWCpRJmx7NTx1a3ZYc25zKTd3UkQlQkZ8WVpzViU4cD55M0ZVeTUxJDc5cn5kSiZRKyh6R3RnND5zRitZclhzSlRlYSV3Ylh9CitkUXRRPT83WnBXLWJ5WDZIRSpqZlB4a2dVMUIqNUB5e3UqeWRXaCN0N29RVlBWcEZie0tKdXZgYiVKK1ZRO3tgWSgxZUglX05nc0RZa3QoCitlYnVgLXFaTEpDQ25Zay0jUHg0Z08oPSptbylaQyVAXnF1UTtHPHFxWWlSVjxTQG9DU2UtUGM0fk9zNmkyeWNfeURQamJJbDhKTiE5RWt8CitjMGhvdT4kdXpaRDlQYzZHSTQ/ME8hT3JAQkEmaCZqfG91MmxaKnFqY3dndXxPTF4zcUZQbEJ7WChsZj5MMFlrQ2NydDYzSiE0YlJQflRmCitAbi1yJDJYeG1yMkIkNzJjaiV4XiE8ZFFCQFZzYExyVVAkRDRNZm0jdjg+LVEkY1kmbmQmMVY/V0l0cEVgPiooZF99Xl48USMkTylsPiVVCis3cXtRPFhhMlFZWmB6bTZJOW88dCRFfSM/UXRHcGBpX1l7I1YkXisqQiRFVnBKc35Ccl9NQnsmP003PlhRPyN2a0xQb20tZzh6OFF6O1cpCitoOSpeVV9zc2Vee2tlTFpoZ3glYFM4VGVsYXAwamQqbX1tTHI5NnlxNF8pWn0kb2hRcWsrcjZtXn05M3VzQlVQWSE8RStiQCVQQkZVTEI8CismO0xQTkVTJmdQe1cxR29ZVXxlcWs9c0dqPk8tMFMhT3lIVClQZ1VSOXRaN2wmX3J1YDFHP00kfTlgKXxtQFNpaG9uaz4hNGV4fkwzcnwmCittUkRQSTRqQGhaY2Y0cnhzYGlwSTwqTTRRIzs5Znh9Q3kzNkslVGJSeFZGWlhhdyUqamhKSlozQm5wUyNESWAkZ1l2Qnd4IU5VREc5LStnCit3SioqTmB2Kz5ZZn58PEpJRn0jTDhLZmQ4bGpOb21eZGJ4JHhiKUVIbXxHK0ltMG9UO1QzMCpWX3p6bGlge2Q+RT8hcUk1ZndaRzM1LS1JCitiKHg2eXU7QEhoK09hTHhISEB5Vjl5WlhNcnZ9Zm40Z0gqR1o4a2dwRlorQW90NylAJDtPNEolM199TG03I1A/dUhnWl52LUVoRWhQc35mCitKRlJEOE0tYlBIaj8+NnsyOH5IT291SUg4cDFHYDheXn1qUEU+VX5PbFZZRDBzPWd2TChRQ3xQKSl3T2chbWA+ayZEN3I9SzR2QkxIblNICitJZGQqYjlGblQ+X3dMODd8XmZyQERTeD0hJl5+ZCE3Xkl6VzhRdG5zOW5KUChse0JaZl9Yd3g7bkdiYE5sVXdUdzgqSzBqNjF1fCk4UUV1Cis2Q2dpVEJ2NSpSVC1taClsP1IqTFdTRzdCYVZLUnZzcCUraF5iYkVUUlc+eTFuMjVGdT04VUl2MXVCbEJlWHJkaUp9QSE1Uk9jT28tPWE1CisqdU1YRCgrN0phS293ZHE0ODRHRl8jO3tjMT93P3h8YmwpI18wUUswST1jUW9UeGojKjJ4ayQ+MjROUExrbXRCaGFqQmRmcnlwdHB1aFg9CitXWXoxPTEkQTFZKzMwbjN6MjJYQEhucVpJV2p5RlBsS01tPEpJTU9XODk7clhPIVhHJFlkeDZFe28+Wip0VnUpREgtWnVYQmlVezFwMVRkCitxT2FIVFF6dCloS0poIzJuV0p1PlpzRitgbz5PS2YoUDIhOWAjI3EtPnQjTGhyUX4hYW15IUtgTHlfaEBzQWA+Y2tjaG5XNzF2bkhCJTRgCit6dUhpbHtNWVJJU2BeQygzdUlJakhmKnxfdEh9cFd5YExGZ2VteUAtPT96JnN6eH40NV84dXlGNUV9eT04dTY1MHZhcWB6eWpmJCs5cGxOCisjYTxpNXgoaDkoJUwoMi1kTi14PSEzdFclY04keiN5OVhIODtFblh4WFdLYihkMVR0dio3RGxDS054fjZFUjdgOCNgcD8pbTMqUj1mb0NoCitIa3pqJiMjY3REYW1sRTFZLXJiclk2N3FtWlUydCk8dnFoQmZ5di1OdC0rb0BjSCVFeVduVD1XX0duWm5rJTQrVnB5NHtvJDtTUDErYTBVCis4WERkaXd3Mj1odDYqSUVSSDsqTEhBTlUlZEowNVhybV9DXnpsJD5TVjlAenBCWnNoQjc+cjBkUz83Rmk8T3l6KXg/dmZlJEl2NlcoPEBXCit7UCM9K1RARWBoR3Y7ZCZ2KEchUmxBQ3B4bVUwY0Y+Zz14Uis8STBYbzx6VXFLXzQtfUY7bk4tbGNBWk4+RW5LemNOQ1JBPzMja3FlTz5jCistdU4kNzwkeCMxdiZERzA9cl5+cT9AeV5oWXFsO1V7ZnB0eDlWO1ducC0rOUtsckl0Zz5we0VTenpaQjlLKiRsVTRVLXZIISQ/bVd4bVMqCit5KnAteWpMUU1qJnxrPzs5WSlAUGl7ZU4xR1RnNilhVEdrNXIhdDsqfCtRVzt7dik9VVFXUkRlMDFlKUJGQHhmKyp8JjMmN21SdTZQTiRICit7ZUhHWnZMeigyRCMxKEhRSkR3Ym47V1d6R34jRlFvK1RreC1YNWkhfCQ/cDgxRnc+ejsqPTtyP3owUXo+ZUJycjxxU28mfHY2UTNybGFGCisrMy1UUmxvI1omQ1Q2VXg2SGBRXldOUkJUOGYkaHpZbFpOV2R+cmIqTmpYYkdvIVlkeVl7aXpATTJoTm1WLTVtQz9tQUZ4Q351RDdxckdyCisyWEJsc0FzYms8cHg3Y18za2ZZeXYjazhEYyljcll5XjtteG91UTckYGZPUUZFJVZ8dkdjPT85bmh7NFFlPHZvK2R3IUh5TmEpZyplcW17CitvT1FYOXArIUR8MVhiTk1KbjJObExXJWY+bCtaSyNWemM4engqfm5xQTR8S21efE5TekxZeXklQEFrTkhJVTAjPTlDfF8kajA9Kk8qeW9YCitVQVJgV1dhMkwtI0U8TWN8Q1oxJHZQKWFZck02VnF6cG4lUllVX1lffFUpdyQqQHFRK1phWk96KGYqNWVpaCtRPmFmXzF1VV5kenBpSVlmCitTWis8OztXWEtla2I2PXswb2ElV1B0O3huVjhWQ2RCPXM9YERsOSE8NStnX2p0dmBPaDlIcVgkWTkhYV48WF9YNUJiST15Q0xpO3xjYiY/Cit2S25jSSElM0FgTk1veXgzcmIoPjxfJDZNTk19K2IpPClUJShQREBWIVV8aHJ5czlTcztMejdyWElrWmhvM09qPkZ5eUxnV3hpWUl1amk7CitmcmAwRSVnfT5QcWZxfCtURzAhUFlxbWRQZFZ9RiFOcVFfdDVgej9eeWNjTyYmeDtifiFRP2dWK3BOPGhAIWk5V1U+VUYwM2tQK2tZWmcmCisqNyg8RHY+VmZNQytFK0hOc2RJNHVZZFZMRlkwSVdqOzk7JH5uPUB+I3NBK25gJDx4Qmpyens/cTwtd1hOZCNxVnQydyNnUF5NaVdeSkJgCitOTlIqbHxXP0ZpbSU0WEVJXlN4IzlwJmc0fnh1fkNAcl9nZHJwQ011P1FrNT5tZl5RTn5+Z1AxRSVMOD8qUipKRV5HPTlTWktDaj9jJDBxCis4TmljU0cyNztXTl5IclhQS0pTfE9yXnQ/MyMwPFB5JkpHRWViTSswUDJeaz1+ZD1QJXF4fDwxODczJjVVKWZhPSl+ZjwzOyE3eCRqJGE1Cis4bHdqWklpNCRZc3JVfXNGKXdLTT5+dE9yVGR5NCp6JXd7I2s+N2tee2UyQUY9ZSpxUXNMU0t5YzVmLSRNWHlvIz9ufn1ZYjQ3Uy1ue18jCitjPkIhZC1LRyRLcHJuQ344UXpPTmpFPkxOYyNMejEzKEtPbFUlTH0zO2xCRVBoZE5rWSQ8ajNMN2EhRVk4WDUxO0M9azh1bzxZaFM8Jm0/CitHdExDfVorcis+JF40YW0zPygockchfSt3Ym5QRUM2ZX4rU3FDIVJfbHV3VUVZST1wbHhsa1k5IWpxVlUqSn5NWWI0T05lWDFFIUlhIzVGCitzb2R3dntaOUw8YHxMcjd3X3tnYGdMakMlSms9Tj1TPnsoVkFsPihLWXk7YmY+RXdJI0E+JUY8fnFaR08hKHpfelFTNkN6JUpJNklMej90CithbWJXPT1GUHIpUWF3WTk/e313V31wKVhVYzV9WFJka1FtdX1tQHdiTlF9Vy1vaFlWPjYjTkY3R0tEXlJVQDlvMCV3P3pRZkJLSE90ODltCis4Szd5SWZfb0NFcXdNb049LUFLd2xFTjZGcW1BRys+RFdYV0BOTHA5RCRySmZyLWJnTEJgMm5tMTAxZSgrQmFveW16alYjUUFZditeYXBECitjK1AqI140M0tSQ3BQQG5vfFdkelYyIXNBKm0oITFDKHw/VFhgVXVIeUp2N1M2YDYyOzRzK2hPZ3FOPGpYX0xDZys0MGA5eHVCKTJTNCl9CitGUjJaYFp7dENmcTVOQzM1T0IzZ0Y+Jm95c1dnJktRZFhoNzNuUnsmZztoeWQ3ZDZjT2NKJjtJUGQmPVVxNGpOfms2eilzXjxQXnRwK1RoCitNckVsJnF4N2s9NE1UKCtMcEVWO1BFIS0wcnBeTHFfXytXKShZV0A8aD48MFNLPTAhaGFibVFDUmArZX5ZZz4oPms/cmtPUlBzeUQ4QTxuCitrZztXX0VmX14kKk88S0Ewc2FPdUc9I0g3OHotM3p5RjVCMVlIWHlkRylVNCEmfXBXTnUwMiY1bzt5PXtAd3d8MmJ6eCN0JiEzSng1e1l4CituREV1bklLcXFTck8rZTh5OX0lKW4xTzU7YntmKFQ2M0NYK2JDU04yaU1Dd1hNYWV7UDR7VHRlYStsfEhvMy1FT1Emd3JZMXNmO21SLXZoCisjYmVGIyk8KHMkTjNteDc4Xzl6SU9DUG9mPU5oQDEqfVVISjtUK0lvNzd3ISpIPH4+Q3ZZPnI7dzxkKl9HeVBSUEdzRGN1K0spT1BedFIwCis4N1JfMnkzJTB3fmFMaD18YTQ1OTZtJHdSU2BZPW1+eU9pYmBlT2tFMVlYXkR3UWplPEopXjMrOy1tTyNxTGRsNW0oN21oV1MjUXE3WGV3CitZaj56VW9WYSElSGghfkUjVXJhLTJ3NFVEN0VxcHwlcTVId0Y9KDZZOCVHcTxyZ1VEbFM1IUg3VFlWOWNfQEdIaitgSENHPSRHQ1E2MlZFCitmfVN2aytebllpUTQ4Vl9EaTxJcHRqUXFiYyE+biolTn1pNj5+P2hyemp+Uihvb0J3Jkxacj1nXnFEbmc0Ukk9bzwyJFUzZGZJbTI9aT9WCiskNTlHKU9eakhJJHF+X2ROTmMkeH1jZmMlelU5SHJ1OGZhOz5VQWhkZzllb1pIREJTOE5qU2Rydl9naWM0bztUblBuaW0oQnc3WldpKHJfCitubTU/dyt8bUB5T3dlP3pRPjFVeGZAaysmaXBKKWBWfEs3K1ReRjtPbzRqNzk4KW94WjRvMHN6N0JtTTxOLXNOOE5QWENZNG17PSpRcVFKCis7JmRtO3puTTNDRVR2SUByS343P2tZJDVsVWphNHhJYylsPVYlMz9rfG0wKVEkV1NYLX4oZzhrKWcpSWV+TFImTlFEUCFySkVTTmI7amAzCitjelgpYEIrPF5hYDF5Z1BoNj1aPEhpYH1wKUVuSDxWWGR6bSs4TDhmUCUmRkApeip9YT4hd2tgRlF2JWZzI0ZgZUQ/UXF3X2NlLTgpNW1XCitGZERrQFluJVpiYkp1JGRJI00+ZERvR1hMJjJNKjJLaEE9OUd3Z2MtVWNESXE0P0ROdXNOPSE/KklhcVczc15nNUJxNEZUZ1JYZGplfDBgCitJXj9zZFFWJUVqZGt4UngwODtgblRmQGQ/aWFjMGkqbXwoVjFFdWxeXytgKm83TCFTUj9obEgoPSlwcGN6RGNZWChUKm1uUUVsWCQhcGY3CitXM0h8bENZKkReWHtNQXBPRntGSWRZeUloQEcpUjlwTFNtY0s/QiN0V1VrbDQma0EqUlNaQlJGVXwoLVRqYE95fURLRGB6bzhOfGokREImCiszKnx7Tm92bFchKVNsM3Z2KX5fU0pkbUcmPChxNHtDRWhuTXdtKGpWfHc0MUQ1TiN7ME9uVUMyTW9eN2t5byprKjJOMVdCRGpuOT0rVURfCitrc1RUYSFqZUNoVDRQS0h7ckJQVk40WEUtaStPO3J+aWFQSTR8VW0xJGZKPStJIWlmZXtpUTwwcHpIYiZacVN0TjBkJmU7TEQ8YHxVKXt1Cis8V2lONlV6Q1hFLXlWbkh0VmskSUs1Nl5tX3R0PyhqX0E+T1YkKVYkUGpSSGxrdG5NJkQqe0lfRyRkO2JvMzdLNHhqLU12UmZUYFQ/bVFYCitSdSg3aUw5QVNQUD83WXNjSiphYlN3dHJ5SGFLfkgmZTF2JD1QbWs8O2shezJQUm1hdnB+e3E/PlhwLVFGSDIrYE9NTHBsJVh4LVclMEZVCitRc05aWG5qPzVJMlV2NUt0JDxaRHRVMFNTV2lnNjNDeCQxUFVZen5rVyUhKTg9TldhVGJJUWk3JF9jPFZ7aGBeKVdqayVuTXlJb1IlYk1nCithcW5SPHkyRypRYW1aOCZZan5QYkd7TG1zeyp+bldxR3VBfUJtREVFSnViSXwzX3EtZzF4dHAhJFIjN0llJWh1ZVRwLXV9KHR+bXcpI01VCismdUtiO1NwR2ZSU005OXhgZEVeQ2hCPTR7dSt7T0MkXiVKZ2xucnc/PHlkRFpscHYhSHAta20tWXA+TiQ2fkNkTVlrezVXZjJjY2ZlJGJpCitNQ1QzJHxtcVlIbm9CYT5VZkNyamZoaERZViVZbT4lMXI7TE1vYFpFRnEobCs4JnlsPXRqdzQoVUU4IStGflM9PU4kciRGTllkK3hnbCQ4Cis9YUZsQ3VgNTdRPkBwMmlOTnB1WCV7YH4tUz5YPCYrazl8QHc/eXBWfWY3M3xONyY8XyhQTUF7eElWNDtoWFE/ZXxyRHpjaz9HMnprZEpTCitgPipCKntxTyhxPkd2UE1lU2JmdlBRPVZgSWpedjQlMmtLdFZiQFQtbyZIciozM0BiI290S2tudEVNcFpPIzAhYVpANHBARndyNDdITXR4Cis+VDg7dVBMYzN+O016YGJLX05zWW9KJnhqODRpQiFIbmxPQkc8VTJ6PmlSMFBKKGFHZzMlOT5yK2sjQnBQJWxkTFRJPSpKfDsqOSo3e1JZCitSUio2aEw4MW1EdzQtM2hiaElNbExAelpeX2tXTXN8eSkkITljSGdERSglPmQrPi0hamMjX0xtbGpUTlZfe25EbE8kWWM2clZvYk8rYnApCitVdXNtczg4ajBuOWE2SV9wVkNlVjV+YGkrd0NLeFU4bUB0PzZZRz4me1JOSjBRQ3BIQ15gRipQUWU+anhFI3RIQz0hTVQ1QzJQJG9mTFYlCithQzskO0ZjcXpZdEhWazVsKU5ickVePE9FLVg5NyVTdnw1dFklUFRoTG9QZnFRUzl7VyFHZXhnfEFyJSZkSz1ZYVFKZmVifiFZKGBXMjs7Cis8aCkySENYQ1h7Rn1YRm4mR3YtV1l5ZT1pSDRfS0pAfH5lTV58YjBhPl4/Xj1FVDdnKVhkS35QQ1ZPa3pzZE1laXAyUWtkSDlXMSthSDYmCis1QXA3ZDZHdHB0KndWVj1KbX1eO2pGOSolOThRMnshVShXV2ZJWX5aU215WVolWEVjfGlONlViQVhEQ2piIWQ7SGF1OSs1NztibmhqYWxxCit4SV9pe1JXSWU1SGdXNzgoKWF7N0JZPzdUP2ZhJE5TXmFAMjQra0Y/QnJ1aDlVPHhSK3p4JWM8Ky1CO31mMytZejdUdSklVXtkcFMzXzlRCit8OSkqe3dNZnYrTjJpNlh4WTg+dkQydiY5TV8zZXJ0cXpJKG5WI2F0dj1kdzYmYjdTIyRXcT8lKjxpVEYjZj04NDMpP2Z8bGJxWXhXblpeCitPYFpyTiNvQF9AcDJBcCoocVE0cGNkaj9tfCFeJHhFU0peemtqJiReK0QrYmhHVHpnantvSyk3OURmKUh6eWsqcUM7S05wKmtZRVk/LWZfCitMcCU5PC09VjttLTVpc3VyUWNqbXMkQUUmeiZ5N1FhZzEjX2tnJk07bmcjSCpZNnRSYEJWX0Ike0tIQXo8KXJSJXE7QCRheHR0emNiNiZfCit5VkwzRnI5R1lGdSVQei1kbXhHKGpgTWhRNnk9SkM5WFpNI1F1Z2loZUhSb34kZ3E+QWcmWjtoRlJoUDQ+JVVSWHN0bTw7dWF5Y1RpOUQtCitSNmYyPilBVFd7WVBpVjNUajx0KSYwd3FuNz9NS2hMWipmSnx2aE9GZzg9Vz84MiojJSFDZG93dlQ4QDxUcW91Ui1PWHF0KHkhRThCdXh0Cit6VVImUiNDKEVTR2JaJWFPaWlVdVc0RlNhVz1HQ2J8JThJWVc3OENee1VuVDYzKClOckUqM1drSX4yXkomcHhiWUMrZkl+JXppaShDI3JFCitAeUw9cVpgWm1gXzUzMFZlNDw5PXhnP2EyO0ZpVGFYQ0BBOTFtUGA7SyhfYVd1SmM4MzAkK1FHKmN8Nl40NDx7KHV1c35AWT1Fc3hAO3lhCitab1EhMTB3PkYmWl9WUHoleHlWU3gxNmI0JmVTYnU+WHJpPSVRPUhQTHk+Xm03VFFASFZwKSRiWFc1b3hZfSt4bT9mbHR4PlRFanx3NEYtCitXY0tXeWRuVC0hT3pJZUF5WHR2e0craXxoJnUrZTJMdV5uZEZQSWhkJiFQfGJeZXclcXcmaElRQHhCTT58RUUoWFc/Y0NSUD9yU150d0heCitEfmoodSQ+elAxeHorWm07OG13TWF6LUVXaTRtU1JoPnJQeHkzQSNyRThDRTFkTUJxMiNpNXxWQEBBeFRJUUUpcjZONmdoMyl5RDZDeUMpCitASnIlMytXNj4zTj5sWFhObnVvZzdqUTwoZWdOeG57WCRObHtZVmFkQnJqQmdySkdkNkJOQVl3MjNMbWFlNjE+MUxyYmBNMWxwV2JNYTBMCitoY05ZYlZzXmJeLVg7b2lJMnBgWjY0ezRiVnNfVSVSTUR+TzdAaUVERnZfSjR2Y0pEYGBneV93IWdTLUVwQl5EK3c2VSMkVzVSJll9IV5mCisrZSV8IVczRCtMayZGdiQ+ITl0dCY3UEJKN0tSJmhaRCgkX0dkRnd3c187KnJKNjxGZkNyO0lEaGliTSVIUVMrJUo0MTJlJGpvK1JYNGBrCishaj84UkZYMH4lTytyb0p9OWthPkJ3bH0jUWFNXmEyd3szLU9TOUlJOXpjVW1rSGY2VnNnVXlnUDxLNmdlVE1LVz87QjVgSHQoVWV7KHRiCitVdDAoVnFvQmNOQHw7TGNFQip0T25IZ3pSZWBTenlAZS02KEl7PD10UisrWHZZV2dLUlZJP0hJX21UZVIpcVpidSpQNDg/QGdBS04tOyYqCitfZ25rMCZOPFQ1dFErK3kzSVZMOSlzQnd6U19DWVRHKGBiRnd8I2poa0BvN2FQb2RpM3VrKnUwNz0/RmY4Rz1WO1VSaFprbit6el8hQl44CistUSViMGB7RGkqcHtIJUw1YTspSGNRKn56UEl4YitqKXA+SWxGRTNaOThKeVMlKGMoSCtTRFFzSkc0TT9VPSl6cC04fUUrY0FkP3B0b0lfCis/VT0pTSV3Z0wrK0t4R0YjfmlsOTRjcGVAd25ANGpackM8JV84ZX41WWdSLXhLVDlWWkVhU0okPSNCV2Q/WVY4fFkxX2Nxc0NId3o0VXNtCiskKjtyKjtEYz4waTJhRGZySWsqaTBkKWxBVjBOWENadyRIWmh7JWBvYz9OeDRAXzFvXj9VVU1efCEzTikqcD5WTF96VXtTZCt3OXZtYD9pCituMVpKfT58dn43fWErdjZLS1lgYWw9dyEoQXI1KUhQKD8ra141WlNaWGFkfj1+fk18I0A7LX1HezBmXkVscCt3dENaeWY7emFfTy1WUz5UCitQUiF1anczWU1zS14lK3dTd1d2JUt2clojJkR8dyNCeEF5bG9xQTheK3MpQHdWLUA/WWVHelpgJlQhcmY9YEl0KHRBNFchcGQ1YzFeYjNpCitFV2MkMU1TVklILUZ5MWQ5JnV0TF5uaihfOzNAbU89SXAxMSVZfCVIcStYczZNRmBxWClZN3BjMjJpRihgez5YK3c5IS1iKyptVVpPM0tYCis/QSRneD8rbiR5am1+WU9iS0JfTEhhZlNCJlRYU30rdjQwZEZ9Rj8zamIlNCYteW1qIypLSiNKK21YQzhSUjRUeF5RdnVzYVduU29iemUwCit2KHVvMEVneGxgbUNmTTc/O0k9V2laMyU4MGZwPjwyen4wWmNzan1fJFpGX3kmMkgoYSMrWG1tWnQrI0ZLWjk5Nn5qXjRKVGNmSEMmNDlzCitUVXd3YnFpX3FMaDA/Yzs2eGMtdWJTd3ZWXiU8OEFXMj9jUXk+Y2labVdDZ2pfZS1MX0A3WlB+cnMkWSRIQStqd2wtaXJjcDBIVVp4RCM8CitzbiZaRXgoRk8wb0kxWkZGc1dULXpTa29fJTRwYiFSOVhmWUUrWWJXUEtpTH0xdzIrQlVUfGFvbzBmd3ltc2ZEe0lAdCtWaDd0KEB5UFYtCis1SDd3eTh6Y2pnOGkmKktXb1JfalMjVVZiPlljdlV1eHNmWkNgNUptKWlFRkhiJmNzPzlOYn0qcHUyZXFQRmQpWlRvNTRZVDk8MGNEeTc+CitsR2xyQDFxJk03WjBpRHttd3glcWFNbVB0P3tNaDBaP3g/aj9iKSVRcXVhakdqd3l6QE8jdXs+cVVYYnMmRjZZRDZoP0ZVRHFzSTR1fjQjCitlditkYnpkcDZzaSY5LU49P2JLfWhHdSFebXdtLUEmJUl3KmR4dSpIcG1EJT1VdyFONWJGSnt8dCp0MSN4SGRROGA/N003UkVFflJXK2FpCiswbUo0bylmK2FiZ0kpQWxeSntmJXZGVzgybCgkYkgrYSpmdU0rJjVDV2FWJXgwUHdqKn1WLWglMnVRcm05Q3lHXjBEb3JzO1ktKCojJG0yCitjWS0rYXw9R29oPyRsWEotbytaK2o1aTk+bGY+dkYkLUArWWZoIVl1PVZ2ZD9FTV5yOGlDOSV5YDQhNFF3fT8tUWFjZSFwI0NWXjRwa2gmCitxMVl+Ykh7VF8wKllVMzFoTUpFclVUbzhiejdXbk9WVndudnU3R1V2K2JGfG56MyMoKTttTTdHfUZoS2MrRkAoZ1cheDY4cVNgRUdsNERLCit3aXckSlYtcipwSX07Jmw9RlUpQHliNVRfTXgzRFpqbmVtdigmdS1BV2xtd2YtVzQkPGVGTzZpJXktVUlnblZ6VHlAfmNfKUVobC1edGBGCitfPUVAcitaO3JlPEBAQkBINm1Ma3BkR0tiUz89fW0qPTVCIVMyRXJRJVp3JE9LQFcjTktgKT0mSnZHMnlkb0FfPzl5VFJfcHhwIyZ9QWQ8CitVRD9rMmUjLUVMflRmJGF2aW83SFlzeUhWfD5FSDx5KnkhTSZgc3ApTTk/V1ZDQ3lsKEtpIVJyUkVvNEliWnkzeSlKdERBeyNDYzJzRVd9Cis9Jms/d1k5eDZ4fnBDTCh2VUlIeCU3YWJWSmN5dngrKE1oSUhacmpCWVR4IVJROH44O3NyPTNKZnkzJD49N2RuflpLVXkyPEQhcW5uSXdHCitQPXA9MkJSQntaWk52Uj0mcVRIKUQqQFAhUTZ2ekFmdWElWlpmKmI9cTk2XmpCWVp6IVJROH44O291K3hAKUUpV09TMyFPLTQ1di04fVN+CiskdHg3eVA7XjdsLVNlZCZTX0smMFYwNDRnSj5TblUrZFM3eSgtYFN5cT8/ZyRNIUZnNFd+N151P2x+VmVrcWs7VkRCWWxSZ1ZOMU9IeiQzCishTEZvcGk4PGNLRngqNiRhcT8/ZyRNIUZnNFd+M1hCWmFsaV89JSVCYWpfI2dPNTA3cDx5N0IxN3FaXk5JSmk2eCNNKXZFIXEhUyZDYlRpCitWO05ILSRnaDskPjtKNDRaZE5CMylNfElCfCRDcHNBRVd+N151WmJySHA+MUwjeGs/dDNmc3lzd2BYRENHUT0qRldQazhWNz1AI3d+Kjg7CitAPjB5N0IwcUBBO1ZONihpazxiUipKQE5iZH5BTmwjKFYmQ1I5NjJfRF5lYmQlOWRNdDR1bWl4VilxPVN3eUFZXkZ+TjgmUjgpVWVvMSgoCitoVypDREJZbFJnVkdJM0h6P2hwYmtFbWglKFJifFpkJHImPXt+YyhvJHRWeT9oQmMyVERvY0pybHAmZlpkJHImPjg3UWRtaFNtMD4qP14yCis+N0dBTCo3WF9uZHtFZkgoK3k4SUpsKmhnIV96KEFVQD82cExFWkI7N1NtZnwpUXdSJE0lQF9vekMjaGpROCEyMzlDYyZWalpyczctRGkkCitYI2s/ej4wNk8hP2IySWFYMEFpX2toOVVeMlprVzFaPlZ+TnNxaSYzUE99RVdiSCVyfFpienteYFAmWXh7MWErVEw1cm4hQz5ZZ3U4bkM+CisyPFpqOER5PlluZE9tPzQwclppMmNBPkwjZTBwbCpWPyYhYEFPLTNXQ2YpSjskfkxFWkRFMVQlPFcpUXdVMW5hWjIwNUpoTG9ieEx5e0xUCitfYDtrYU9ucGxYenctSGUrVDQhbThJUzE8Pmo+PmpBI0g9TC1SNVdkSzw+V1psbzE1PndWcVN2T19mbHl5X3FPPDZaKC1JUjR4KT1nUEFXCitaalQ7TClIeWhIKVAkPCE4RlJjRGVIZERwVDIwcHNDQT4oamFvTnEtS2NlPSkodSYmUz49PH5ZbGN6V3k2MTEqSCplaiViQFNIRVRRX2dyCit5bWotfCYwRl8pPmtQbFZiQFNHWlRRX2RxXllgaG1hVCZWcT1ha1lFJj1pWChnMDM2N1pzQHc5PndlRHQzbjF2YXEzZFJAbzRNfWl0ZTFKCit+UmEyJTBEZEBWUD54UWx5eF5DI1lxM2VkTzhAZ2BqeH1vY3l6azs0TTgrZzRsNmhZKjVsaDtqTkgra0xVYig3YWtVTj9FJjxhTHdSTzx3CitvPnNvWDY2QGF2fHBjWlNkVFN2cytVVXBJYztfJS1scjtNYyZmZm5OaV4yN1Yzdjh1Jkh2WXRZd3Nmbk5pXjI3VjNsOHNzJnxZbW5DPHVLCitgX3l3KzMkd15YfFp7RzJhZWphVD82XiZUITN0TzFHcTIoazx6PmJYJlNELUZCdHpOP1ZGOCNnPH1Bdjg4fSVTSXhiTGJSa194N3QrUE5BCit6ZXJwKHVIKkNOLTBIM2t5NH0tey03ZElZb09MWnQkfHUmek03fHxmSihaT3VCNVhQdFNQaXx4dGZwNmtKOHFaVlleO1MqVjQ2Zz9ScVQ8CitUZjwoI1RaNlk9SDVKZTxlNTVfbjklOz1TZzB9ezU0YzsyX08kKC0oMGJLKlMyNlBTUjhxaFZNWXJNQHhve35LIWQlQiRTejUhaFd4KDBMCismPW8tKjlwbGQrYWZVV151VzYrZj4xI31KUThaMCVLWWNTViQhQ1FtMzI1JH1DOG1LaTtZb09MWnQkfHR0d1p7RFk5UVhefDhuYHYpJi0+CitAZ0w7fGA3YlBlYmwmXjRmSUstWWstMGJLKlMjeDtqIWF7ZnkpITlyZEd5YXNyXkdaWkl0ZGJqNEAxcSolK3syS1QqQE4zfUx6XntRezFICitUNC00ZzRDe1QqU2dCQE1+T0NFRzNDSiFMTlp8MUhUNC00ZzREVEhTbFpUKlRBb1ZVang0ZWVaNGFqQktTNCVZbW5DPHVSJmdleWFzczxACisqM25kJFpMPy1BZ0A3UTFIMS0heSl6VU83V1pNdzhoWVpHejxVK0RuQmM5IVRaNlgtWnc9bFd4SFdLVjtNU09MVUpLcUR5ZnRgaEBZZGsxCishQ1FtMzI1JH1DOG9WYGxZdypePHR1ZnpJUXU4XlJ7c0NQQngoMEwmPW8tKjlwbGkoRW1lSCpzdVVBZGhMSVNAQWVodkhAXyUtUDNvdVFaCitAdVImZ2V5YXNzPEAqM25kJFpNPF9RfDJ+ZlVMK0ZAXyUtbHIoQVBVZDtlY05RelhwQnt0UEAtJSU9bHg/OWcybyZCPXxNKFl2OSt3dVlxCis1S3pUTyFNMm1CaU5IU2xZISpFdCF9ent5NW5mWTw9QjBiJkVoMjhhejE4d0B0YVYxdk8xZ0FFMjczXm97U0Z4WChRRi1Ocyg+Typ2WipaCit7RXNWZ3RrbWh6JF5YWERCKkFZPUdEUnU+b1FPIzBIMkI1RX4jaUt4fX42MEk+bUwxSD1aMWpybjdNQWg3e3IxSD1aMTRHPGUzSGI4OEUqCitae0VzVmd0a21oeiRATUFUfmczZlk+YGpCTUZFTjVFfiNpS3h9fjYwST5tTHViVFhZMWM0MGo3a249bVQ7UVpZS3pEez4wQFFAe087fDMzCitpRzclc2hZNTMteW9NPVFuMDx2Z1J+WHNEa1FfN01PJUpyRWJDYE8+djlWXyluUChJZU5IJm1jQWxhQmQtS2NxWmFlLXQ1JHAoQFFCcFhRCitmJlFMZm8qPGlBUFdDT190a197dnFOSCZtY0FsWDImZm4pPjgyOWdhVjglWHhmUCRifmtwc18oP2dUQEFwNEhfRlhIZlVfbipyMmdOVn1yCismOWpTVShiSDE9S0sqdWIkdFZ9ciY5alNVKGJHJlgyIyhBYzF7TDFQMk4jezkocjFxbTcoSDFeSkxlaWpaT0hiODlQKlRBb1ZVI31Ufjc7CitHQHVWNmVlcFc0YGdJQ2F0Jl9nQUUyNzNed3A8O01jJmZmbk5pXjI2K3dnOHN6bnd6azhndiV3VTdUMjdgPzsqa0d7MVYxdk8xZ0FFMjczCiteb3tTRnhiR2EqRip6QDRGKCR3SGUhQ0shQCNYfmhONlNGMjVPQyU9JE1CVzlsU01vWW9PTFp0JHx2RHY8N0puJFFxQ309MS00O3ZJYj1oCiske0xoNEN+SHZHcHNZYnpnUiV4PzRaYSRESFRkZGZpV0hERj0yVWwzKSZRJmxTT2MmSVU9Nj87ZkhsfV5QfVFLU0t+O21RMjJ+Qko4ZE5vCis/PmJ0PElmbUgqbTIzOEhDOGJtZEtZNT4mJHMpMTJze3k+MHsxeHBRIzhVKiExV19PMTNqeVUweyFCR1JGMjFYNXg4Vz1TJllHQm1Cc0RWCispZnFzRS1tKUAqfk4tV2R1Sm0+TXVPVX4waEJWNXU/M3RqK2lYczBMNkNwYys2bWZOQjhNMElDNjA/K2lyO1E0T0xSTF5YKE41WSsmeDBhCitQUkI5ei04ZDRXSnI4SEdwYVcpdElqYjRXYiVFSEhjfnUpdk07PTFxTjBQc3YwQEJZNXJNTER1TSVeMkZ3aGM3IWRLIVA7XmtNbjZ0Pz4jCitWMTVpT3dmKSU5RHlZUUc2WSUoVmkyNGxFWUQtVXU4ZGpVODQzfjA7O18mU0U4RFFMNFU1OUN4Qz84enUtSjszO21fb0lDZllNT3A2UlpzCitWYSNkVG1gVExVMnhiJkZ4THNzNHJxN0BMY0RtSytSSGhAQ2J+SXJsUEdaVnVpbEpzcWFpOChaTDNDaSV6Xlh4MTFFPmEyNFdKcjhIR3BhCitXKWN+cGlSMEY2KyY0aVB2MjJsOzc4Ym1kU1k3b0Bgc0BJR05SNWhxLVB9UUtTS347bVEyMzN1a0ZAPmxHUTRPTFJNRD8yQ3ErVCE1aTRMCitrN1I1aHEtUH1RS1NLfjttUTIzNVQ/NmN8YEZ1eGVue3peWnsmMUZIc0E0WFBTY14/RFZKeEluOWNScypkQCVAO2JxM1FiQEQpJlEoZ145Cis/V2FQQDtwZiMoWGQwSEk9OVRBZ3dgS2dSfS18anJqdyFwc1liemdSJXg/NFpzP0pIMmBZPil9WDNFUmIjJlRiN3IrQEhQQzlIKWorRnZoCitOMShqMjM4SE04ZHg+M1lHQm8lc3pGdFFzcz5kSnN2MS1ec0FeRXZwc0lJPHE2NGMyUnQ+Q3JQMXd3elhWJlhvaU55KEQ0WmEkREhUWWBxCispdEUxRTdHcm1ZZig1ViFVPTY/O15ZelIjbzIwQmtTJWIwJFdzTnpBSSNVWUw4bCpLS1llM2RKTGxIdytnUih8WEh1R3UwTFJve2QyNEljCisoPiVFQ3skUXFDfUFadExAPXZrKncpfVg5R1MlYjMxREM7eTAke0xoNEN+SHZHZlVFJm8xRntCVzRhZ2RoXzBHXmhHZmZKJDI1SnF8OG1LCitpO1lvT0t1dGtGfXE7c21WKlNgRC1zWGZAN0VNYzhWdilmaWl5aFJSbGh0O1QhPkB3OGpPOGhrYS1ZTXw5WHRBU1BudHAtfVhHbl5xdT9FCislJlJ0Tn5icXRwLX5TcGMrNm1mTkI4TTBJQzYwMUU+WnxqV2JoYEdoZE9ZPFh+I1IpUFNqUj0zZUxLPTVtNkNyM09uNG1LclFJRmx1MWJ6CiteSGVJOylKNkhNLTdlfDcmUzB6VkFRfjxmbCZqYTIxWDVuOFUhXjZZN28+UXNDUn48MUVCXiY0VDJnM0gzKHxKKH0xU3xQWG5GP0h3fHRZCisrJShRU291MV4oSXQ4MnRId3x0WV5GXmBLWFRzQiV1WH49fWxie0FYNFJ7KnhHfmo4Iyh9MVRqLWBOYFVIMFd0Pyk4TUFUT0BvI09DPUVzCiskajVQM1E7TCpVTkt9VW0qMXw1eSgqY1RwK2BKT2dDY3JlbW5yMTZ8JTB9MkZgMX1GX3M4bFdebFhASnJJck5LJCNJYTNpKDhqTGc7WCl3Cit9WXFgXnBvaztXTTUzPkF6dEBNeiVDcHJiKVlnTl9DcnkpelVPY3JAXjZKbSlxaXY2dnZFS31MZyYxe248fDhjWn5wWGZWLVdxUU9NKDQ4Cis7VCM0SmFCPUdAeGllKFNWYD5NRldiKWI0b3grO0x5T0tma09qXzFgZlM1NmNhbyZjeGRwQG5BczV6NElVYU9HKVFSN21xTn1FaTktWDIxCitgZHQrSzFqcG5vdU05TXsqWSkhUCU7ezFHe3xVPihJQkclTUZXWms2QWRPQk9mO0JpRnd0UDU/LUdoODZpcTBhUCZBPXYmYkxuKXA+d2BDCisjNHckQkgxVE5TKFdJa0VNe15GUnZiI0lPT0FlUEQ/JndISG52NjZWWClAQWVxeyZFPWt0UVFlSmVxVmc+MWZpP3FAKFhIaV42MjIkdy1yCit0Q0w+S29udjY2VlgpQEFlcXsmRWd7X3hiaUIwKl4pKHd4NztOaypFQ0d+Wj9xdWNWODRrJDRfLSh4cjRNVUFrT0ttWGNZKClhJWBuVk0+Cis/TXJGNys7bENHcEg9fU5rSmxEUystUUJzcj9FayNTd2JCOFRTT1ZYMEdCPUVmRVpkJHNRP25ybjE/enF5Qz5fflBiSkNkMS1CcEZSSW5xCispTXxYcCskK3FlKGBTajN5YVBHTVojRyFEeGNmMWZ2Tj82TzZ0fkdNWiNHJCFMPCVCJT12TWJCXkFkemE8JD4+KFZzQU5pZHBWR3tJPHMoCitZJnIjRXpmXlNFSVJPTDs/Y3lUaUFSJStDSypqS25vS24zVXZuQD9PZlpeWUd7Tlk3aGtKZjBvIy1IPU5rJFdqQ0tPRjVub3U7TVhmbn1jCitxS1FLamhiOWg5OUN+Tj9ueGpnYl5MUmQoR3dZUHNKbmhgYj5rVD1pOTBVZylPKikhJUgwa0pfcTNGUClpQU5LVUNMWWFlJTNgaUdTJkklCitsbnNfd3ZYd3VRN3FlKH1UakB9djA9SS1tJCh1b2Q2bnY2NlZYKUBBZXF7JkU9a3RRUWVNdypCOzVvc2RRSjQ0YUlOUnlFIWxTe003b0c8CitqTWN9NWB1Til3ZGtlMmJTXmRlWUxRckFiUUBtZnA0OF5CSXVvUU1oU3gpOHdXKC1fdTJQNX14TEswfDRKaWZ8PisxMzJHQTVCJmhFYXAoCitaXnxjJClBdTtjM0Z0Z3JeQmw2UF9rRk89T3pMRz84ZnsoP3E1QFdTWW57ayFkMitNNWMqTTZQWUc1Tz1PekxHLSt3bCh4anpIT0UwVUZNCis1Wn1wbiNlU2Y+MUQtbzBubWh9Mn5RS0FDT3BtZ2p1Pz1ZWWpPfVYxVTBFa1FrUl9YbGdke1BBX2shKkt9fnwxMVRfaDI2NFlFJSk+Rig9CitxKklXU3psaDxjeHUoWWtyXiF1fG48aDhTYEozak4lWm5Jem4oI0U/WD4heCNycFpse248aDYrWmhCYFpWel9CPyk4d1lmT19RNEBIQCZSCitjNX1xYkpPP2FCe0d+c0UmKH1icjlQdjBkeU8/c059R35zRSYofWJyOVBaT1JkSldZNi1ASEY5UiZldFplITZjfFRmOEwpNkg0JG5lKUZoCit9JFA/TWwwS31+fDExVHxtWndlMD5lWTcqMldzN1grQlBEbXl+T0B4e1ZIM0AzJlFUM1cxcjR1SUBIOEU7cClXb1FYUTReeWtNb28tKlhECitCY0BZSTQtJXNFSlYlb2FMVjRvMisjcm1PRSlpbU5RdCtoJkNQU2JYV1NQSjN9IXM/UWZkaUdfekAzNkxZVHU1KTwkPTtjM0Z0Z3JeQmw2CitQX2tLTz9ZfXxDPi1jJSFxYkdPMn5RS0FDT2wxZW4oI0U/WH5OVGxyd0xFNWlEODE4MW9kNGEpSV9MPlA/TWwwS31+fDExVF9oMjY0V0g5CitObDxoQ1NyM2M7I0hmaTs2UWtaNGotJUg2UWV1SURRNF55a01vbztHNyZTMyFWJD53NE5sPXJaQ1A3VnRkU0BzbT14TV4hZ3JeQmw2UF9rCitLJkgyaHtAUT8mRzMyR0E1QiZmK3ZsYmE/dHkpelVKKyUmbXFhP3w5ZCR4Vn0rQ08xdVBuJXAjelgoSDFecmlufXduZFhwYiMrMVc2XjR4Cis9UHBydUptbGE/a2VPPEowP0ctK3dsKHhqekhPT3V2biUkTzRNNFNqUVlGQGExSW5JPHcjV1NZbntWXiVENElkUT5GbGJhP3RPPU94d3JpCitufXduSTx3I1dTWW57ayFkMitNNWMqTTZQWUc1Tz1PekxHPzhmeyg7UEJRV1NZbntrIWQyK001YypNNlBZRzVPPU96TEc/OGkyKHhqekhPCitPdW1rUFVpcWg2TzwrPk87RFBrRyhsO0MoZ2RYbU4pd2JPQ3swa0JqNUhCeEJHTj5wY1pQejFrdFFRZU13KW11QG8zYEYjR3tFdnVXNXZnCitHI1AwIShuTz8qTkU0Q1g4SHhsKG52NjZWWClAQWVxeyZFPWt0UVFlTXcqTj84RUc9b001S3ZHR3Z8eGFXP2x3TGxhVkdQTy03b0dHI1AyCis7Kz9VUClrMHVeWEplcVZnPjFmaT8lO19BK1hwKyQrcWUoYFNqM3lhUEdJfnUlZ0dVcE9DTFQ+Tm5xVn0rWG9BdEs9XlYmdGxGPWxpTmspCiteNUNLKmpLbnEpTXxYcCskK3FYfFk2akFxVE13ZFktVE5KZio0Q0sqaktucSlNfFhwKyQrcWUoYFNqM3lhUEZxJlhBPjBkSXdCd1RsZiFoCit1PzQmQjY5Rj8/QCptczdxcCYxU2VeIXBCRElPYWg7YURZM1l9aWQxLUJUWERCOVMtU3kocGA5ZkJlSzEre1QzZHxnUHJvU15Db2Ylb1pKCit8ZUJTbV9naWRgfGhIa0lSbnlrbSh3IyZTMmdZU1B3ekBNP0RoSUQoYCYmKE9PdXUrRWxwVEAtPVBxcHJBYlNabVMoKj1qUU8xX1BjZXVTCitXU1g9elg9JjJacUBfdHFsYXQ7VmlXNStwcGZuazJHU1h6RWlBTktVQ0xZYjJOb1ktcWAtUER2QjI3ZV5KP2opa25tdFJ8cDB+P09kcFRhCitEbzVoTUpxb29OLTZPPzk4I0dMc3R5e0hzZ256U0AmWTB9YzlyQWJTWm1MQElEYEQ2VmxEckIxVFp9VGElWXN3NnNDT298fTZoWlZmO2MzCitGdGdyXkJsXld+O0p8Sy05MGg/XiFpTz5VYXBHYFZTVik0UF5jMXZnREBuJXAkR1g+IXY8cmFBd3grbD1TakdgVlNWKD9xNjtPY1I7cmtaCitCXipNNWMqTTZQWUc1Tz1PekxHPzhmeyh8bk8+JndvaWFyOU9vX1dnJT1YQShCMWlGaS1hUz5aPHZqYmd5P003Q1lRRGR1bX5CU25QMXFZCitycDwkRG4kZyoofWJ0Vk9fUTRASCUpR3UrJSZtcWE/fDlkKj5nPj9iN29IM15JeklCSjxhKD8rJD5oRlMqJjh6I0hmaTtsYnxMK09AZjs2CitHfnNFJih9YnI5UHhETX5iMCFDfDE1Y0JpQ08xdVBuJXAkR1g+IXgjcnBabHtuPGg2K1prcFVRJi02Q25HYFZSYSg/cTY7T2NSK1ZHRUhRCitmJFRYMkBCR1d7c2lBKW9qQ05qKy0oP3E2O09jUitWR0VIUWYkVFgyQG9eZyplP0BBe2B4TV8wSjxmaDNAXlVPTDBvYVglN1VETiNHWH5OCitULUZUSjFNZlNAS3BPQGYqUEgzQDFHKUZofSRQP01uRThIeF5zbik1R2pPOz5XcCV0WFNPaSVoUHNIfER8O3pnfUVlbXwpYkxlPlc+UllJCis0LSVzTDQ/aXFiNWQ4akc3b1ZGPX1HZSNIZmk7NlFkP1pPXmxqeiR9fkFAJmM4Yn45VUR3ZG4zXm0jUyEhYWAjSGZpO2xifEwrT0BmKlBICiszQDFHKUhfNGJmbHcybkNQN1Z0bmdsZm9ZNyoyV3M3WCtocGU4JmBjJClBdT1idXJVSipoO2ZpQko9dkNQN1Z0bmdsZm9ZNyoyV3M3WCtoCitwZTh8MGZ8PisxMzJHQTVKNDBXPHRNazY1QDFCMUpYLXQ1cUNRd2JGbm17I3lZNjheK3N5U2IrSEAhVm9PeyNpbHM4aGtKaUIlSjtDUlI8CitYbnBpY2RZRXNwdHMhM0lvc3dQIVVzK3Y/YT1pa34ldGVRbWl2VG4pdygjfjFDdSs/TyVgRnk9R3ptciZxSm0rIWQ9MHBmayV7Z1Y3TF5YCisrTzY0Zk5DSW8lZ2dFdWRPSndTWn4/KWRII29SRXduK01sRm41YklQPGhZSGAlIXM2fGtWcGNYK2JmPzVRJTJ4PH0zQkIoYEJpPVkta0VyCitNREVfMERpZkdYRUIxJHplJTFRdWRUJk9UNmQ1QjtGRWxpTUoxTFh9OE81JEBiaH5ORGA4U0JxMiNpNXxWQEBBeFRJUT9sN2ZERE4+NCpCCitCalc9ITt+Wj9ObDgrWWxCNlVsTmxLRUVXRkRmVkNARCZjbEFAKD5CQjtQPWFuc19hI1o4Tnc3Qj8rcVRGQTdKWCg3YD5yaUR5dns/UzJtCitqcEMtb1A0NWhrYlZzQCktQlk/THpXTHgmeH5ENVdDMyg4aVE7TWUpMClkK3JIIVdgWnVFMSQ9KThlTVpPXmNmckghV15qK19hRXNBPTUmCitwV29sa1ZwKXZ7O0dPWiFncU5QUGtpPFRCR0VtflQldn1rRzMoeFJuQk9OKjhrRDZSU0Q9KitCJm1LSDMlR1pYfjB3NjIrVUptKko9TUZLCitKe1dMb291P0l2VHpPXmNmckghV15qK19icHFvdVAyeHJpRHo0bUtHPjJQK0NAJVd1e281dl9OVHIoZ0xMZ04oKz0wQ29OOFRYREEjJVhACitTeExyM0ZlMGxvbHYwUCtGazBLeHUpfTA7TDU/M3pRWm9Fa3RAfUM+JDdSRzE2a0IjWXBSI157aT9JcjNGZTBsb2x2MFArRmswS3h0aTVrCitkNiExSE5gVU5nYWJBentiNGNFVngrfUwzeSY1YUVqKEl5dzdfVUYoUEU7LU1CZnpARWdvN3R2YH1jRiZfYmJ3TEpOaH4+b0JRbjs/VG1PCitnK21MNjc3bmQ3b2RYWG85JEd4S2N4ZHNeOy1TU3VpLSM1dUVnVmBudn5YelEoODhnR0xrb3hBODQzYShUMEZGUFh6fGVFcEBsKlZnJSR9CitkNT9jSlQ9M2o5I2hjNV9QNVZSb1pvdU5ub3Bhbm4rZkVFQlAwOXlSPmRYPVZWbT52Iy03NmRIX1NgZjQjWHc0VmxLZmRRKlFOOG1PNik/CisxNVh1OzVlcCM/KD1oODdEZzdGc057U1pKfSgha35wZzN4Z0kweSl6VUw5SkR4U2FuUnpSI1gkPiQ3NnZVMFQ1SVpObz54M3omPzJDPCRJCitSYDw2JGRSMmRpQ3E9XmlwMmgla2QoeWopSHwyM29SQn1FVk5pP3ZDeGAtYyhZKD0hTygpQzF3KUkyNzYmYTFTe1NyMlhrcE84cG9LdlRnCitCQXVZM3xmMm8ybjFSUHY9Qz9eJl9iWCFVKTl8NkpWRkQ1NzZ2VTBUSno2ZCFAfE8jZytYZ2lBSGhNM2dCQXhaNHE2PHZJQX4kZSFrfnBnCiszeGdJMEVldSoxdkBtRjQoQXZ7U2FNMHFRI1gqYU03NiZhM1N7U3IyWGtwTzhwb0t2VGdCQXVZMCNrSU5fVmZgfUBANGcxN0szSG9SMkNtCispSzJmRjteP0VZVmZJJG1gNzZ2VTBTe1NyMlh3NyVEN1k4ajRTeyQ/eFhkJSFkcGhaQjdmRUVFUTAkSyNMMnh0K3xCQWBWO2ktNWk+MVh9CitkLT5QYWpUNU5IdzVmfWFJSDN3ez4tRWNqWFQkTlc4NFRKc3s9XmJyV081TklMTExaRjJ9aSt+bVpFZHA4dXY8UFNzJj8yQlUwQGAheUl0CitsYE1YREEjSFhkJSEtcG9LdC1mRUVFUTAkSyNMMnh0K3xCQWBWO2krfm1adChaT25mZmZRUzFYPjhSNU5IdzVCQWBWO2krfm1aRWRwOHV2Cis8UFNzJj8yQmtLPF5BaTBzPGByU19yZmRYYzVxWXA5TWIpZWlyO0pfKnc5PztBZTVxOy0xQWw/K2lyKF8kPV5RK19TaTZhbkl0TyNYWENBCis3V1hYZlM9X1VAWEt+TSh1TkJ0NHkoe2B6XnQwJF4oYShhUDF3UlhaN1deI3VTQDUmcVhUaV5jcDlNYillJTVeQlpfJkA5cEc3fjVlaXI7CitKXyp3OT87QWc/bGZ9YUlIM3d7Pi1FY2pYUXYqNzJRcCYrMjJNTCZ5djdXXiN1U0A1JnFYVGleY3A5TWIpZWlyO0o/cGZUaz00fExTYT98CitzKUFfMExHMHhiZXMxaGZjZjV6ciFfTUw+Jnk3NkJ+K1NfSEhSPXpXSkcwZjgwKkVkKkshd0JUcEsmd2AlP0tNUV5xezREcmNAVSE0JiFPCit4bnJwKyFIN2Vpcj5LYGRSUl47QWc/bGZ9YUlIM3d7Pi1FYmR2e3YkJHQqJipHa1VoOVV1YzdXZ2RnUz1fVUBYS35Oc3AyYTxqZGx2VUI/CitwZlRreE15K0M7LTJwY2Q9flI4PFhPbkdrWV4jIUxZez5AM3dhanVFYVh8cHZ5ZipZJnFBSnNKbnN3ejByTT42UzsoYEhYVksyMG9tS05FCitORkUrfTdWPDNRUzsoYEhYQ2NxMzV2IWkzNUR3dDh4TXkrQzsre28yaSpePzZFWlNNTHZ1SjEwJlozPH5KQnhQU2NQSSF6WE14VXxlfX14CitNbHRjcFVFWlNMJnYrIW5OIzZwQmMwdD8mfnVCLVY1KHJlfno3X1I3QUB2V2oqI2YlRHg2eXp3WFFEQ0ImTURkNDAwY0dgRkgzZjMhNHUhCisrNCMlQTN5R3gzPmsmJE4yeG9pbXI0YEh7SW4mNGdnYSpYaVNAK24hIV96VVJLQ2t4VzYoZ09iZjZuKn11c1k4S1Fpczk4TC1jeEtfdSFrCitMOUwzdW81K3lLdSFiaSlSK2t0bnRobCs8MGQzJSVZZUBGJC1jQSM0THplNVZJZz1MQ2tgZj89Rk1sXnx+KVQxajtPd1N0enFtV30oZE1iCis9UlZVWEJOcFVsNmxSNWlaY3NtLWdoV0VjeExnO0xZYWohM3VQOXtFUjxPJl5PfUt9WEJOJlpvTE0tdGFBeCgpOUMmOCYlO0s1RkdtQj55CiskfUUmd0Q2PiN6cTBFQXExdStYXjdRWlpoU0BSOH4pJHtLVU8/OFA1aWRodTFDfXZVMjArX2B3aShnaHgyQDgmJXI9N2JOOTZoVEdmTFE+Cit1MEE+TnEwKzxDYmkoTUFGRU9jNEd2VmRnKSVMMH1LRU5oTkBfUkppeFducygwbVczP35UTmJ0fllGWDU+c0FXO2hxTHhLMWkmX0A3RU5XCitTMlcpOWYwdXdgTSghal4/QzN0SllvRU5XVFF2WiFUSSVXSX1jPSg1bWRxMDU/WUFUNCVUPzZUTnB2Q0NxWSNWKDZvN1A+NVNTP0lGUld1CitlUExteFY0MVVEa1g5WDxeSTRtVzM/flROYnR+WSsyTkBzQVUxbTArdDBWaSZZa0BFTEtecHZkK3ZMVX1lRnxmfFVnO2kmWWtARUxLXlZ2CitJdTFuJHw5NlNDPHsmJm9HZHQ1XlJKV19vaCYkNmFJKVpKb2hjd2ExZWAyNVMjWXg4V1dtWFRsTGFTaHt0a1pISmZWRDdoX1ZvNjV5flF6CisxdCR3bSo4SjElKD5WfnpkUVE2NmtDRilsTFJvfmVvPGszYXZKaG52JHw5NlNEMnFAUXApNWpLZ3Q3PV81eX5Rek1KUzY8N05NOzk+LVIjCitHMXQkd203TXZfTlMjWXg4V1dtWFRsTGFSV1A4T1VqSTlZSkE7QUc3fCV3Qll8O0FBMW1xTEQ9LWkkKWZXRUUtdWZ2Uz8oeyRPNGZDQjh4CisqN2hwZ3chekNkSnckTzRmQ0FgMyhvaCU2OVVeRGxvLTJUTFExTWl6fU04ZCleNVV9UWFLPF5VcCNLXkI4NzIzWldVNy1ZPnEtYVRzdTVMCitxQ3lLeEJjKTArSUVjY1NRcS15ZllMSUFoSk1ZZ1VDeHktISFzbVdZZnJ8a3hlNjtNbUNMWDhyZHxtVlB3T3xjVEZSa01tQ00/eDU/fDA8CitkV28pPGRTNGJ2UnFfSXY3fWcxRUdkPjB7X2RzY3BRLU4yVk0oezgrdE98NndzYyMlRSMzQ0g/TW1CfndpRj5uTlp9fUZnVUFNdjRJJiN2CitIaSZFeComd24oV1Bge0NrcXNnbkxeZzxRNCVyO0NJcG0jVE4+WS1QQnFkMm5RaihNO0J9cXdBRT5jcG82ZkgkZChOZFQ+Rz5Ce3YqJnduCisoV1Bge0NrcXNnbkxeZzxRNVpNZn04RHR+S012I3BsOCRzUn5KfCVmZEB8NUgkJHkxVzJCdWAxNmw4NkJZKiRsRTdXRnlFJWtjfVc0TEI0CitBUyokbEU3V0haUVNraileUUt7a1ZJMkg2YTw4RHVsYU12I3BsOCRtWEx5ZmFrKTQ2KyR5R3N0RjslXjtnV0hpSyppKzQhO1hXN0VmYGs0CisreU5KVGBjfEdnUzVEdkJfZ1kkQSpwIzlVRDN9YlpxRkAlKDBuY0dzazkqJV5hSUtIZ21pKVJRMXJZcDxfZUdoSz55IzgjKj8wWjBPamB2Cis2Kjh0JDdZVnI5R2Z9ens2bGpNOVVEM31iWnFGQCg2T09vTCZ0YFc0SVBefkhnanl8KnZ6cStWPjhGYmpkekJzbztObWNZfkkrc3YzWDxqCisjXiNOVTh5aHpeWmZ4QXh4VW02UW8zXigzJEdoZkAlXlJDSEhnRHxMTENvajtjKVVvYmBrNy1oJERUOG9DVyNGbTgkMzM2eWZifExRYVY4CitaOVVEM31iWnFGQCg2T09vR3NrOSolXmFJS0hnanl8KnYjP0hQIUtASmhLPnkjOCMqPzBaME9qfnY3dXUjJDdZVnI5R2Z7ZGI4UDA9Xk0jCis9ZTlVRDN9YlpxRkAoNk09QV5UeV9salQ7KmBIZzBVKCp0b0hBVzg9bzJGQVF6ZSp3KjVXOFhHaz5ZSFpabHNJZGBhQmdSSUlqVGpwLUhlCit6aFYqb2QoYTxESD0oVjJzVGVuPXYrSFl7dUEodUBQZTwjenVeZDcjbEcqVnI8ME5ZaWpVMGxfQ2ZqVj44QlBqTGpJRUYqYVJueTRZWmAhCitENTVPMjgjX0E4IVI/aD9EPHpIZCV4PTYrdio9TEhlUEpKKiElVHtiZ0d7JkhlR0RHKm1TWSFWJDtRKkZBUXpHKm0kdz1WJmxjZWk7V2tYCitFO2Uwa3k0WkJGPjA7QngyOCNfQTghWXlHVlE3PVpoS2RhcDghOSRhWV5LO3V2Nio1cyNiJTFsNnFfa0ZRKjVUI090SSQrTG1NaEtSQldpCismUF9kYX1Hc1J8IyVAbXN7SGRBYi0qaTVtUlZsJX5OaXA+PTc0QW5uV1leY34hdjYqNXMjYiUxbDZxX2tGUSo1VCNPdEd6QCtwPz1JcFZ8CitgVyZRU2ZFRn1EZHFQWVkmPiVAbXN7SGRBYi0qaTVtUlZsJX5OaXA+PDhESz1BbCpIRSNjVm5mQS1pcD48OERLPGBRb1kqK0FhYm59ZCMpCisqdis4eihrU1k/NjNxc09uSy1sZikqOE8lal9WSGM0IWYqZCh6QFZ3MSFzaUFAcmxCc05LR2g8SW5IPkxGcjcjRDw2czVnUV5sTH5NeEk1CitWMFgqTCZTIU40R3xrNkhiaVdRY3hSflVBITArc2hLTE9qOHpNR0RZPjN6cHVfMG5aI0Q8NnM1Z1FebE1DfCF+JiEmaEM1Z1FebEx+TXhJCis1VjBYKkwmUyFONEd8azZIYmlXUSpidVFIVm5mNmBMc2J0RTh6TUdEWT4zenB1XzBuWiNEPDZzNWdRXmxMfk14STVWMFgqTCZTSEA1MVN1CiswS1d1KjN7SUwwOV5UWHpjJUAzTyZIYX4yQiohLX5oVmVgV3RLV3UqM3tJTDA5XlRYemMlQDNPJkhhfjJCKiEtfmhWZWBaMGhzX1YwQU5LCitmUl5UWHpjJUAzTyZIYX4yQiohLX5oVmVgWjBoc19WMEEydlUxZSVTbzUjfUF0dEhaXlEmKnduRDhWTj03VmhEe0JkOGE2ZC1ZU2A0VXNiCitOI1loSzQ8VlRpKD5Mc2JOI1lyaU0pb247SkdYWS0tcmx1Jkg1RiE9e0UhNFZ4TV5IMD0yciNITk4jNFZ4TV5IRWUzdylVY154UV5UZilPCislMG5HSFpeUSYqd25EMFZNRGByTyUwbkdIWl5RJip3bkQ4Vk49N1ZoRHtCZDhhNmQtWVNgNFVzYk5GSW9gYUgyNFZ4TV5IRWUzdylVY154CitRXlRmKU8lMG5HSFpeUSYqd25EOFZNRHs3Z09XYFJuO0pHWFktLXJsdSZINEshdj07ODM+ejNXRmw9RGh6XzN3YXFyeWdvY1pSQi02KmVuCit1UkBraHRTeil1bldgKWZQbi13LUlZKnlIKXV1KTs3IWsofD1ZKXNnZ3VyWG17IXA0TSsyXiRrT0NUdlhEbjZOUW4xSHVNYDRHMD8kX0l3Cis+QDZUJjhoTyRlSjFIWCY/NipvM2VOVkgzaDhnYmZIQTVIPXVlSy1ocT09aiU5fDVIPXhmTGZDfGAzMUpoJENXSzgwbi1EZjNZKFV0NnVtCitORiV4SkdSfjVZKTd3QXdYTmVfTipJY3I4YmtsbkU/Pk9DV0s4MDh4U0BpWShVdDZ1LVJidTREQGlZO2I2blRoSnlfVTh4QSVjWSZoNih1CishJiQzITZ0JUQxZSp2cDUkdjlVbyg0N3pZI1BgZ3V0OHZSen4rRj4waDxGaDJXJEA1OUkhY0hiSEdNYC04MFpMei1FQlcwR2swZTAmRTE+CisyKFNAZ0JmdigwalF8P35IVWV3fSphKXpEMjZfaEE0NnFxc0dyJmZHUDUrd3lIVGBTKSpZdk9IVSg+JillQCp8SXsmbWtsa04rQ35IVTRZCisqKll2T0hVKD4mKWVAKnxJe3gkdDtgcSVXWT4waV5vSn5QbmN6czckSnt1PXg+Xy1wWGo7SUZ9N2dURHJVNGdNUFpIVFl9cipXajx1NER7CityJCR6T3hOMjdlOXk4dkhmKll3KnxMdWZibn56WHBFfHsranRVXlhvR01KQGprbCpVWWIoVW8qZEVlJEQpdmA4RCV2PUdWLXhuT2AlJVdgCis1MjVgcGlITntoSWtUXkswaFUlJihiV0dyd2tqJkhTNEFIUz1yYypVWWIoVW8qY3hHdGZpN1dgNTI1bil4O0pZdiRMP3ViRSNuemgte1R7CitGP2JTXkswaFUlJipUM153NilGVW8qZEVlJEQpdmA4RCV2PUdWLXhuT2AlJVdgNTI1bil4O0o+KjJufWVVMUFYX2NpV28rfUY2VGFiSl9aCitDVmZyJW4pRWc0WXRxLUd1U3M3JlhQX3MyUDVQU2pIUileOCpRQnBXVXo1SGplTkZuQl5mbD5nKCR9UH5ObmJ4X3BlS0R6YGtNNEw+MSkjCiswcV8wVXxsZkVXPlA1UFNqSFIpXjgqUUJwV1UoWWViQ1ZmciVuKUVnNFl0cS1HdVNzOCV6OXhONWBrTTRMPjEpIzBxXzBVfEtXQ3NQZU5GCituQl5mbD5nKCR9UH5ObmI8MGhJfGVBOHVCJmRZc2xBLXVOaHhJWFB9M0M0ZnpgS0hSTmxeKkw8KH1VaH09P2QoSFFuPz18MFJ6U25yS0BtCit8a2daWGRwUChCNDZOMmtqbFNjaEtISmRrNV91dzBGP25MMzs9NzlrT0BHLVhWTDM/QTtrJmwzYkVwbDNiRTNOdFByX2t8b0tLV1Z5KGFWCitvOTsyU1c7eyQ0RF5UVTlqYlN6LWwyTWo+SyY/Z3NOU0peaHcyQHdjY3xXaGRJI3pxc0NTXj1mcUhqX0F4VEoqbEI2VWxObEtFRXEkRFh4Cit4PTJjcVFqYD1XTU0rX3hLVUQ4ZnkraWQ1KWpMJTBQYHlMLTQlSXRVP0AreCVeJHlmS1ExM3YhMU45RW55RThuSjk3JkVPTjBLQVNrPnA1CituQnNyMkM3a050WWw7U0RIUTtNZSkmIzlFQkJ1YDE2bEg2NSlzTlNKXmh3MkB3Y2N8Vz5kV1kmQXNDU149ZnFEbig5ak4jMlBgeUwtNCVJCit0VT9AK3glXiR5aUxSUFJ1fEwtaHtUSjVjWEh5I3dfUSlIX2hgJlFSNDt5K2lkNSlqTCUwUGB5TC00JUl0VT9AK3glXiR5ZktRMTN2ITFOCis5RW55RTlidlJQUnV8TC1oe1RKNT12YnkraWQ1KWpMJTBQYHZ+NzQlOW5QPz9BbCtfM2pLK0o9SHJAP0AreCVeJHlpTFJQUnV8TC1oe1RKCis1PXZMeSN3X1EpSF9oYEspcExkUlpzTn0pakwlMFBgeUwtNCVJdFU/QCt4JV4keWlMUTEzdiExTjlFbkpNKnRpOUlBSnktbDJNaj5LJj9nCitzTlNKXmh3MkB3Y2N8Vz5kSSN6cXNDU149ZnFEbih5Km9oZjBLRWhCNCR3UDU/KlA1U0AoIzs4RWJwTWFnWXBpX0oxRm08eW8yJSUlRFhkCitFXihebk95dTxQaSVSNE9adSlNP2E0JENfekAxVlNjQCgjKjdERFItV2dZeGJTUlh4aSlFYnArcSF9MVF4SjFwPDh5dTxQaSR+ITNVcHVCCitfZjQkMzx5QDFWUnBMc2lmNjQkQ18lQDM2ZVhAKCM7OEVicCtxZ1lwaV9KMUZtPHlvMiUlJH4hM1UmUVI1fXl1PFBpJVI0T1p1KU0/YTQkCitDXyVAMVZTY0AoIyo3RERSLVdnWXdRQzdkJE5RdSlNP2E0JENfJUAzNmVYQCgjOzhFYnBNYWdZcGlfSjFGbTx5bzIlJSU2b1RNLWVHeCU8CitzRnVIU2woZklodmdsWGNVYXkqZDU3WDFpZ3pnOXA/SFZsOWcyNW5zT21BXiFGVUpiOWdLR3stb2JiVzt+azIzREJodVhodkZUSWNQUVNXCitjISVRTThMRTFXY1FEPztjbjlNaGpDVX5KIUZZJF85ZzI0LS1sMkdoO3ZJXjJEQmh1WGNaUkFTO35rODVGeTZzPDJqZC0jY1FEP2VjISVPCiswaWd6ZzlwP0hWbDlnMjQtLWtxVlUkOU08aDlnS0d7LW9iYlc7fms4NURCaHVYaHZGVEljUFFTV2MhJU8waWcjekk+TWBFSWNuOU1oakNVCit+SiFGVUpiOWcyNC0tbDJHaDt2SV4yREJodVhYVXs7N0BlYW0yODFHPWJnWWdjPUl+ZWFeeWhISTAjWEEpNVBgcEYmNCNoaFpANjZ2dEFCCis9WX0tb2JiVzt+azg1Rnk2czwyamQtemNQUVNXYyElTzBpZ3pnOXA/R0toTEZ8TF40I3FuZT9fail4QGVhbTI4MUc9YkwtN3Y5SX40Q3d5CitoSEkwI1hBKTUjMD5OcD9fail4QGVhbTI4MUc9YmdZZ2M9SX40Q3d5aEhJMCNYQSk1UGBwRiZQUnV9JEBlYW0yODFHPWJnWWdjPUl+ZWFeCit5aEhJMCNYQSk1UGBwRiY0I2hoWkA1QnVCODFHPWJnWWdjPUl+ZWFeeW8yISQjeWJANlBgcEYmNCNoaFo/QCt1JEBsTVBAa01SITFJfmVhCiteeW8yISQjeWM0QVY3eD18NCNoaFo/QCt1JEBlYWoxNnp9OD1eY2U0OHlvMiEkI3ljNEFWNyFDejQjcW5hP0ArdSRAZWFqMTZ6QD5ITC05CitffEsjJWJiI3ljNEFWNyFDejQjcW5lP19qKGBAZWFqMTZ6QD5ITC03djlJfjRFYTREPVo5VjchQ3o0I3FuZT9fail4QGVhbTI2ekA+SEwtCis3djlJfjRDd3loSEkkJk9uZHg0I3FuZT9fail4QGVhbTI4MUc9YkwtN3Y5SX40Q3d5aEhJMCNYQSk1PFA3dX0/X2opeEBlYW0yODFHPWJnCitZZ2M9SX40Q3d5aEhJMCNYQSk1UGBwRiYmaXJjPTJqZC0jY1FEPztjbjlNaGpDVX5KIUZZJF85ZzI0LS1sMkdoO3ZJXjJEQmhfVj1yUHtHCitjbjlNaGpDVX5KIUZVSmI5Z0tHPC1sMkdoO3ZJXjJEQmh1WGh2Sj8yIXE5ezk0I3FuZT9fail4QGVhbTI4MUc9YkwtN3Y5SX40Q3d5aEhJCiswI1hBKTUpQ318KD9fail4QGVhbTI4MUc9YmdZZ2M9SX40Q3d5aEhJMCNYQSk1UGBwRiZQUiY0JUBlYW0yODFHPWJnWWdjPUl+ZWFeeWhICitJMCNYQSk1UGBwRiY0I2hoWkA2LShSODFHPWJnWWdjPUl+ZWFeeW8yISQjeWJANlBgcEYmNCNoaFo/QCt1JEB5YDV9LU5BU1Y8TlpHIStwCishNzVLbVl7NntIcVdzYV9DNWR4PX47ITc4MzQxdkc8Y31WUFc5SmN3IyY7byl9TXpDJnJXRk4lNXEzUWFtWjE2aTxxMC1rOE9CVm12WFA3CisqQzhSI3VNWC1AdVlaQ0pTbTxPUGxfa1NsajdOQz13bSFGbyl9TXpDJm0td2lTZmpFUWFtWjE2aTxwTCNncFBtQG9ZMm5GYGdKdGozPnF1Cis8TmZGUDctTD1EPWthO2ptK1NyPjt8RVluMHxYUVIwMDBPOF5PWTd5MSsmS0Y4M088U2l2fER5R3luaHFhQXxOYVV2XzB+V04mZ1dhJUZMCitLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNElmVnszQTdhJktafmF4UVJybH5oZXsrZDJAdWAmVFVMaXZ1YG4rPW1DV0ZYJXk1PzlfCis8QUFsV0UjR0g3WEs2UXhMbHEhSzg8ekMoWWRaNS1mTEN1ekFtb1M5djF5TTZoZ3tAe0t6clNUe2tPdFMmPyRGdDt0LXBPc1orTypnKiY4CisqeD1FZmdpRFYzTGsxXkNGY0prK0I9ZjVzTy08KVJDNTZCSistKVNlWUdMRzl+Izc3fDVUcGNlJlV4TFJEMzNuRn13Q2NLRWJBV0FgNWJyCituI3wpY3kzdkVFQDw4QzUjTEBWWXsxJHp4TjdVRWxVen5uJWFfbDl4UkBTTXRRNGdvKkhPeGo/R3FPVkM1aDRBJTYwOUg/WU9KfDVGd2ZmCitgLUEzRVpMRjs1biF3UExII0Jlaio2NT50U2ZrfEgzZmx5aU8zT15ubD5RbVNabUJVZjx3QkY/TGI/TXlqUE45TUB6R2UrU0VpNjw2R0Y4Cit2QVNiWilZJTYjMkBQNHxhRipgNyZkKTkyQlc/cndBJXV6ZytJY3Z1eDlQTDhQWkN7LWwxfHIjITJuYE0zX3dMPmpPUHEoaHBWJkc/PXVeCit9Py1GOEltbENqaGdLSlo2M2NjSmhLcSNJSmBoQ05rQTdjRj5JVDlETHgqZSQlcjNqaVZYOERtNmlyckwyP3QxYnxiT1cjTH1aP29sczteCitgeE9rSkJgc0UqQGBAMyNXMDR7dkQ4SHdObnpuUC1UVm80VHU5XkdEd3Flc0VHVGNAbzRjRipiaGdHPV4pRSFJNz15fWQ3TGdyJCNOWDBHCisrKENrU3ZINz5HVWspVCFPVGwwcERpdXtTczZINHVvcUlmZ1ktd1YqTVhvYVhlKnU9Wk8mT0BxRGJIdSopQE9GTHVLQDR1Tk5oK2hUZjdhCitOZ0xtI1hEY3h+bjclak4xPEdyR3lCUFhCPmU5YkdCbmthUHAjPlNyaHE0NnBQI0kmcClIbHdEKUpjcm1uQF8jbyYye2dlbjt5fEpMKiVgCitPMkdoSSR4a1RFblIldU58UU1KeXUhYURYbFl1MzxAeylMfXRRWSRhfWpwcWNYOFQ8TUVeakwlS0JLNXwzajlNa350PC0hZk9aRiNPSUdHCiskeVA5PWFqJnN+YDVXNUhtVkpmd0hPOUs9e2hqbChLQih7cngrRWp5YmB1JnE/OSl5a0R7P2hyaWk+cytSZFdyMUNSJHRZPkhsMnwjYlJtCitaVV5rTVp6YUV7dUxwS1dCJXBYakw4NlBVITBlO2hrVH16QTFlcGAzMnM4ZWN6N0c5fCN0IShJYT5rd3FkX0ljNTxhZiNlV0w0Pn0jdigxCis4JXJ9TkkkZkcwI0hpPjFRWS1PMDA7b3tsQD49T1Bvb3N5S21ZKFpoeVZhRzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+CitWUHxEP0ZKb3c3YSU1JDZGSipPT2JhIVRRV3BPVFdkNmtgU3VPLUVpPUhLNT5RSWZTPFRXYUlWS1VFb0p1U2RjZCYhRHcyMDw0a3VqbiUtCisjdzVJODFaWn01a3J7RFBmcUkkZzJjJSlyazlRdk1mRGwwMjlHVUFDUnAzTCk7cFp3JGh3JT5nQyZtVm9me3I7bTVLSyVIejU0WWReeypOCitGMCYrV2hYP29TP212VkghfDxNemo9N2tfPjY+aU5zPGdWJGRAWlpGPCFlfFlgQlUlWSh6SnBjYW8rd1doIWAxMU1OKkg3RCpGSkM7cWRiCitAcEAtK0F4aC1LOEpCZGh6eH1VaXNVe3pkZ1F1e29VaSFfV0pBWD9MVE5VenlJOyQrYyNmNnxMKmJzWVdCdEpTOHd2cXJ8KGByYEEwVXFlCitlKExMLXY5RkhAJWhgd3VlTDlLdzhqNT90TElPJl8xJXdvdDhkPEpLbUZpbVRmNDV2Q2pRfnEtYG4xUWBFdlZ8QDRuZVNlU0d1eV50Wj5hCis+UGJGJHtwIykwaSFaKjwkTmNHPXBaemw1Knx0QUNmQkx1V2xOVEBsYHQ7KTQ/ZE16ZUBhXntZXzRkaCtaQCtvez5WRXpscytUWG1jelhXCit5QmN0fjkpOHBnej1KblRhZjU/dmdZV3dsXl91SDR4VXV7cDFVJWh4ISZGNFY4LUpaWXQ+S0N0e143P09JZkEhKylBOT9IaFM2fTdoKENmCitGNFB2NT9JSC1gV0dAdD9OZUtmY01IWnZYdUY+aFVSYD05Qk5nYz1fVlh5IWlKb3pJPVQzPTVjJWVYOFZyIS1oQWAta0BfN1NgUndrPF9QCitme0Z5cmNXOD9lUnJeJmJ8TmtgMUJePCs0XzYhLVFEZ01wS1VxVUtZamp8e154OWQkQXYlM1BYRDtRJS1NSyljamJIa2EwdmVYcStlfD5VCitmSnc3SXJqT0ZZJW19NmhjdjcwaV51S3pIOy1SYHxNRlMza2wpP0BeYHA9SzwmU14qZTAlQG5LWDNvfnstPlk1fE1CTzR7I0FaQU0+Oz52CitgS3kqKmVFVklSOzgkQmQpemtBPVotMn49WDlJdXVAWTRfZUM5aW5ASHl7MX1xdEV8TD98PTh2PU8ySWcqPU83RHtgbCRre2BTZkhwTUwoCispMlk+cWdgPTQlfntPUXdBe2BsRjQ/YF8qPmtCeyQkbjhFeDxnWnYqdXtCPF9AP2R1JUx1TzhuJWZBUjg3Sl5HKD5kZiNMUlV3KlpIXlphCitqKkluN0BfekRTR09wNjMkej8jS1ZISWVodjApbjkkeXl5V2kjYG02MjUqVzBWdFo9WT5ISmlTUVVOJGRNaHZ6eDhfZVNWKiUoU1B+Z3YrCitaZDRyUlQ1eT9QWDVFWEw8U1dVVk5RUnxMKjFNKkg2IzMtQEpiRm1hcVFke2soU1h0P2ZUPVZ7aEJgcl9iYDh8TFZXKCE7Z1JhfEw5YkhACit7a1JHX0BAcyh8NXNNVHprbVB1PmRRM0M9VT0+aHRkKjdxZ240fVpeIW5URml4Kz1Bd2pXK1V7VHI2PjxNI1JVN2U3M0lfMjFKMDxzeTBoCitsLT5VJXp4QTREJVBZVHNfMnI5fmBOalk3JkQqISV7cWlTMntQNHFqazYoVE4tckZDMzhTTkx9PGBxeEJfJFRoJmRUaVV6ZkJzTH57QCgyCitVWjI0OXsmVWJHZUQtUFp8VDdVUH1uKU8hT2BARytaWXNCUWplYThMUHdUPjgwe1lQSXRLSHEtKCZlWkFMcjtQdmg+dndKYTstfkhCX2RrCitFT3trcCVXUX5FU31uMi1GUXVYfmpqV15hRCsoX2AtSz1sUVJue2QjfHw/TUpQIUFIUGRTYFNLcyM/KWV1aWtBRDAmWT5ocz4rK00lUl81CiswPjZ0TClxRnp4LXpWQ2NUfVdDSD5IK3p5MCojIUZsPTE9WVJnPnFZdkt5e2E9M2ooUHk4M2BxNkx4XiFaMUJ7UC1gUXpNdWNBWEUrJGY1Cis1OVQrZ3czVkJ7cmV4RWJXbHY8X1V2NkZAQmlsYUFPN1hEa04oJChjflJ1cC1LfSVvPWRiXk0pdnZkb0tCUFp3JnN5eUp2diV5fnYrVlRvCit0aipEJHJOQHFFYFJTRH0oZlFaO1k+bD8oMlcjY2BfV28+fkV4KCpJX15pakNVdjdNd0dxWXhZNzs3QVAoSFBIMHBWP1pAY0sqNVk0JT9qCisxKHpyK2R0TDJxZi1tQUJtJnN5V3ReU0dYa0lKdEV7cE4rWmFtKE13Pi02SXx2LU80Wkl3Pz8peF9jUU1+XlRze2ZlNzI0MylePVJeVVV1CiskVHlIME1pMV51MSp1T3B0I2UpJUFMJTQ1PipubUc+bilxSzEya3s2QShwMCVAYShhSHp1Sj08O0J4NGRFWWNqb3Vuakdac2ZYWEQ3PjgjCit8cnVlS0h0VndSYE9rKiR0an5eS3RXQXYydnY2VmxldmtqOWNlfT1UUC1ISXo3ck9XOTY0fjx1aHttVWg4KHBqdmNsZWB9dlRNdjdZdCkkCitjQiFjYE4rJCtHeUdRR3V5TiVAX2duVFRwV2N5WDhpKU9EJistQjMpMHY7MWoxQkdmezsrdVBLQ2tUN21HaEE9aXdEbm56OEtZVzk9em4+CitveDgmciV1JjhLIyR1QFE0em9WY1pwdDJGIzZ1Mm17P1NLcDxCNzNkNyk1cjBYS3dxfG5kamBzTl5AIys/en1mP0pmQ0p4VEZXYGx4eDFMCisobnp1TXwtckNCeV9iYT5Mc0oweFZ6VU09eE4lPyNgKTFLeVdFbGY4KiRYP3xnR19qUmA9OWRweyEoK2JkQDdmPT5FMVMlUl55I3c7TT9QCitPcS1AX25CSzN+VmdAKiM3Y140NXpeR2BmR31uRD88NV5HanBQK2wtXl5BPnc/PHA9RGo8U29XMlR3fi1eVm90aTIzZChwVDMlR000Pkl3Cit2a0NWPSRxdCE2UnB8dDtZRUZNKSRrelViKHtDJGwxIWwkfWVjIUdxMjIld3Y4TVM+P2EpOzRRYnRaaGl3RWwhcTglOElSdWdTSWBlXiNVCitqNG1WSmZzWntoOEN8ZDdmWEl8Y1VEN1YjXzdqTnlYan1yN2hzaEE7KWRCcSs4T3FVe2tDckpZOF91QT1XUkskX1VPUXtTaj9Tblo4P3B0CityRDVnRmNvOWFOZ09Ma05vNjFLRGU5TWR6S2F3K0B5ez5rVHtVSU5tYzAwNCViOX5jQ14xKWQrX18kbnhfIXc4ektLUWlKS14jKGt4c04wCis3SEYoVSRuRDxfR2NBZSkjSzE7ZVhKWTBVQyl4ZVR5aGFRTVFqPV94UTxtRWNhdTQtJS1PT29aNkhxSz4/UWpUMVU5M3xWMHs/SGs+WT90CitYfCs8ZT9DNExzS3olWT0xJiZgYFApZUNOUFo8aD1yJFlBaFljRncpTkYqdm8hXytXRjE9ez5vYGptJjNYXnZDQ3tJPz90ejtMT2Y7eTRFCispSCZKbWg9JTwmTjEwbGMlUlJuRGUwQntPV3VkZForRj4lRkE9WTg8I0p4JXNiQGRWPD9SKVBhRyh3ZkVBdTY2TipQVXYzT1RhP3t+Vys9CitrM2Y2PGBaT0J3WldOSj04KW1wKHgmcWMhOG13cDkoPWJBSlBNSSgmb0QhdiN1UnYod1d7NURyYSRYMFNKdmxaMkQxektLPjZwJWdWPHpECitZJFJgIW1jVlN+MCZncEFCbntCI2E9TikhPiglYnJBRl5BVEUoP0pySDFxaiNWZ3F8UGNAVTtkLXgofHp5IXA7Qlp1LWdYVkJ9YUY4R2BaCistWFNLVGBgI1hGYWhjSXZoSVh4M3dQM0pTfHpSeVFQWEBHZmF7PFIhQW9YPlAhMz9mViMmdEJfenEkNmN+byQtYjElUS1yQEZ9QCY4KzdOCitydGI1fUkkRSZEYyVFN3h3JlRLdVV8VC0/aHojQT9YNmlCSG1aVT1JeVB2b1lNKzRfOHpec2d0c3B2SzhENUAwZ357aCMxQnY/a1lSQnFVCis8NF5NZiFGQVhoZXliRD1KNE16a2pBdk9hSkZyMzZ4OX1rQ2RhV2BRc1N6PTctQlBtKyZCRDx8T1VhRjFZMEVqeVIzOFRuUUM5UFotOzlxCitWal9hQk15ODxjV1NZP15wPD18czFoaC1mWFczc3RLR3lVKig4PXZCKnpXcDw2JDBvbzN0c0hIRndCJChlY3l5dWcreFRnUmRJVWdAMG1MCitATjVKSStYYXs0b3dDIWUlMF5mKXgmd0wmam5KKVdrRnZGSz5LJD9FZ3lKamotfXtsSGU9SSRHKitXWlFsQ35VdGY2ekR2Z0hKcWhPaWVICismTE1pTFF1WTs2YFRteSZPb0JvVmQoe2wqJlV1RDFmbG4tZn50X0dyMkZ1djFlZ15SKiUwVCNFKnNTUkMyUDlFczNvZG44Qit9Xl9ge2goCitGNWlBJEtoRyMmZzJ2ejBAWmtIKWc8RVRRY0g5Q1lJTUlXVGRNPC12TWVgU2goMzdNYiR+OFhOT28jfm9hZihMT0ROV2QoRmRnYz54U2I5Cit2Jn41QEtMWjQ3fFl9PDV8T1hhUkNEejJOKFNYa3tRKSo7KiRLOUdYcHFEQ3lAJncyTGx2MiNuM0EhRGxjY3NoQH5zPThJNTMrandYUXt3CituVjRUQ0c0cDZtVE1eMnY4eTMqLSEhSUFmKX5EaShFVU5VPkVQYzEzfmEqN0UzSVlGKWUkKkIpN2F6X2o8ZjhjQ29YOUsmUm9LKlVQNDc1CitPdip1d0IlbnAkKHYycUolZk0lVml3SzUkNVQzakUxIXJBeEN9JF5lM0Q5QT9ibllPSiotMUNCUlhsdGA1JiVQUkM2SkY+PVl3UnMhV3JnCisjeGBZUWBObjVPVDZQSSlzXitpN2hpPCNBKXUzXlckOU5ZbSslNHsqbj1fQFpfSHNMT1puKkBjTkN3TmM1UlAjMiNDSCh+STFpZF9QMnpZCitwMlRHdDZUNkI/RkRJP0hAO2pKLVFAYGpIY18wNyZjRiZFME98bEY1cTdpUDlscDhBMW1gMEg5K3xAZGxfWWpWTDxeRnkxd2BpKDhZUDlZCitne1FgPChZVUJyWnZpIUVeIzAqM2BNQ2Z2QFIyPWo0ZiRHRFhZUXV6VmErWEFSNkRqeXYjNWhnV0VPY2VfQ3phTSgrezZDZlk3bSh+VTdwCitAWVo3Ml9HJn1KUytweEZnQVM1MDBidzMrUUd5YHEpfm8tVCtHfFd2UHVgM15RUU1fN3k7dX4tWX07Sjh6RU9ASFJTUjtjJTtTQ1Y5QSZgCitmSXQ1dkQ2ZVdhciNTcnMyeUI3JDdZLU1rST44JkhxYWJHaUZDR2d3RmVke35oUykkXm19aD48X3FjVmhKVH4xYkBlU2w1cSYrNDlQK1czCit+ISVZT1c3TXZeTjhea3hAVUJtMDx6X1Y4SXV+PU5AUDMzb1R2TEFCY0Z3ZmIrZHxBdlghKENYbnZIWGFvcTUjSW0pRUhRYGk1MEhoaGcrCittPk92WkokM29jb2VxSEZvIXNLTnpBdSRvNVA9RVgjVEpJQFh2SkJkaUFhWn01PGNtfnx5OVhGQEE8UnBhekdZdy03U2ZPRkhlMn1BTDtACitXNXVlflNHcyFiZ3pnN3p1RnJpN3EtMz43S1dYZEJYfkBfdERJIVBrSUBxd007UkMwc2RAYVZwNWhxJURTOVQlI00tbmB1ZUBiQSs3TnRuCitfdzIwdmVgNSY3diNkP1QhWU5hR0F9Zn5WdH1VSFgrZVhQbCVMe3E0IT9KfDNvYmMkM198ZX5oUndAMGZPfjFXNTxIZVpaZjhaWTJEfFkhCisrdnNHeiVqOXJQQWpZVjtuSUojJjw4O355QVJVWVkmI2p4cXh9MTk7JCkyTj4pKF9WKVhibkdrbTdVeztyVmZiLXk+WmBoRm1MJFo8NnckCitLOXM8YSZhfGdyWWlUQklRJG5XNylQaDlDQ3FRZ2J3Q3MjLT4tMkZ7bChuemAyNU1jMXghbHE5MXlgPXtUPn5iJnw4U3sxfml0eU9VNUdOCiteTktCaUVCMW95aHpPPGE8OyUzMV5+OU5uKnk0LXhFNz9pRUhxO3llK2QxTFZfMjc8a3RZWlgxLTxxKGhGZz9EdEd1R1JvSndRdVd1NDI7CitwUHJVSykwZ1FQUn5rWTx0Y1ZpYmswOGhQVUdAK3E/Y0lEb2VqXldXb2ptUkNlU2BNaGFJQ2k+WUhDOWZ9S2tvVllgbmgrRzVOYjU9Kz9BCitNanlkUCpIWjQ4UFk/cFIyKUJtMil2VmghNSFqYm9aWTJpIVJqPEVnVD1XSTVzR2RJPz50T24hMVltYT0hN3JuT2klMDVCNG45VXooNUdYCitPYi1UR0Q2cEh+RVhSUz1XO3lUPG5reVBHY05ZRlY7WSZ7YSRwRDl3WXpka0xXTyYlVCRteVhDPzBvNXQ9Xih+NDJ2eFpOJXh4S144fjJeCit5NSomWnAzWiZHO0tVXlQ2O2xHJHIlJnMlPW1uY2cobmxKcV9XRGYxLSFnVGYxSDRmPH5tXlhrRVMpMlVJV2pxRng/Z3ZYNFAkPmMmQC1ACithQiUpe0thJFRrdzE8SFVDdFo8RyFyPVdVan52bm9rWFBQblMtQ0U7ZFdIcHd0dnBqZVo9YGpkRWtGLWpOSE5EX0Q2ZWtXbU07Pm9GRjFvCitBUUwyTj9sMmw5e3ooJT17RWBMdiVidWRwO2JRb1ptQ2tmYmx3YCN5NndvTC0pb3JNPU1fJUZMb2FlMUp0bD5lbFFwK3JwJS1XIytDPlFCCitZOzEoVUN7aXlhWSRVVTNfSjxXdiRhZGh6JFo0PTErMCRBbWMtJDlpQm5IfXJ3Z0k7ZmxSYnQwbk9pZU9GRSY8LSpBMG9PLT1TQXhja25pCitmPElmNiVRKzNMbjE2LVZpLXJnU3hMKUZNSXpOIWFKOXxpNnZIJmpXb05+eiU4NWNJVlcmdksoPCYodmFwSXB0bilPZSk+bUdCQGVWaXwtCis/XyR9S19PcWxvPTJMayRUa1RGfTYjdnlvO09pcD1FcmhQbGpBTmZqalp8IUJLYkhvY3RsY1ZNPjV8P3o/Kj1fKDF2RSN0TktefW5vWkMxCiskYUVGRVpPTDRpP3Q3blBCYT1WYiNGLUp9Z0BIKnJaYlc1MEAjQ1BNXmV1LWZ6S2FaeFBOQmJSSDM3KyEjJDJGSUMkbm9tZVg/MH04QDZUCiswYiteOHFmfCRjMn5EXnteZndJVlgzXiVaQEx+Zyojej1IQHh7cWg7TntgJXJ8KXYqQUhVQ2pWQ2pzJVEjPT84KzFBWiE2cD49YnU1YGQmCitaaHhvKElnYkBrVUolZm5QbDwjVHhKOXBlIUE9LTV8PlBxXn4pdDtoPW1TYlA8VHg3NT5yNDI9UTA4Rj1UaHN5KEtTVStQMV9yfFdBZUErCitmNzVtQzQ+Wm1mRmlGTjkocWNqZldQaD1kLTJyMEY1O1ZaeW5VRysxVmNhSUY/ZWQ3QW1LIzRAO3U2ZSt6JmZEPTUtYSRtdzJOUUk5Y0dGCit9XjRsPmkpYH1+SChuVU0leHpyP2Eycjl2TCE2aS1KJGFufHxPTTJidStoJCRqMz5QPjxWMlh6K1pWKWZ3Y3dOIX1PYWFpMEBNWElQXj8tCit0Jmt+ZDVsX0goa0w1MTNVNWp+b1poP3hiKTJpP0tXekcmdT52a35OS31kTyYpemBPcGI9Y3s+P2klP1VITDJFc2dGJWhmPEsrb2VIPyVzCitiZjxGck81OTR6cyVeRW5vaWtOP2Vqe2ZjdSloUnlHM3o3aktZfmgyXmFjcDluJUFPVU88KihzcTlsRz1MYjtwdVBNPEleN2ZoVX44bC10CitjeWhtZkBzV1BhWi1aMGdkISUjQ1RVbjshSG5RQUdKdXsqcmNONVpYNFNMT2g0K1d2WUNpbWVWQFlTcTliPSlDMk0meT1sfSp2TnZUNEdNCitQPUxoNHdEdjUxR1EmV3d3PCRoQCsrRiVyYyk0Wkt1dH0jJGQ9dGRHPXBSM1Z1fkJsR3FwcTs0NDlpJjZac0wtM1J5Pi0oPjBwNWt6NnpMCitYMkg+VmsqUiF6SGYpVkwofEcqenwraHReP2RlcXl5YWFoYi11QzNgNTwzMm1sYjx9OVZyRlJATns3JG80JnxLU358NT00RFFzWURIcCtWCitqSzRkVURNbz9zeil2RzdsWitsTUBpZDhQJXBmeHsmc3QzeEtxeH4jZGhmWTxhN2xTKnlBVzBWa3YhNjlSe0p1SnVCWlozcXZIY35hUFlvCit6elJ4bEF6MTYmNkZlcVQrRmV2Y3g1JFpwVUsyTUVeIXlZNk1jTG1Pb0NPVU9NMSM5Pm1adDtsXkZAZ0AtdzFqYy1Fal5wZ2p9Q3t1fDBoCitSdFhVYWB3YVRnRiVTTEJ3JXc/Kmo8Mmp5V18xe2QxKXk1e0NCKDVha2B9fUBaNi1mKFJMdmg+bDVUWTF5ZH5iM0AtZkh1YF8pUE9ne30zCitsKk1PVXgxQlh7M0VgaUApUEBiaCl6TFZ0JllgVjN6SVh+TUExd00mT0JobSYyO1BBeWkpcVo0U3tJRXY0cDZTJjNfOHh6e05MKEFjUj1sCit5RShkT0xfKClMVHEtVFlSMGcwNDwkVE8+NWFtZ3ReWDtKQ3FnfCNKSWdRO1pQR0FJSHhTdHxpSTROe3c8WDMhJGg7KEtfZCVlYX0mZjA3CitUR2RsPFktfEghaWx3aW0/WmdkfkoyKnw2RzgtIS1rUkZXbStDMHt0Qj4oXmQxPDZQSnczeHwkI3EwX2RSMCF4Yz9OT0Rfaj9pOXljVjw8Cit9MXdILVlKRHg9Ml9MX143IT93TSFqbVRJRCE+bipoUDhFUHx2LUlPODc8TV4jI2NERlkjMEF6c0hkODlfdEpePT56RE5xU3UtVGh6KFdpCitjQDk4QDdCbTU+UW1CQnB0bCUpTms/UCpebjVjUnBCM05JK2NSJUctKEBXWlJGN0RvbFg3Pjg3QEhtdz00NzBlUChhe3psREtaIW5SenB9CitaUlU/PHphNzI9ZHZBYl9OcFdQJlRBRGF2T01xMGRFfCY9LSh1dE5BZXZiKVY1TEhiITVXcUJWeSN8YyohPXdaYEVJJUtEUlduTEJTP1Z+CittOElnKTBWSH48UXE9ZUxvdVl1V3hXcXRvVnNAPXBUe2dqdDtxRyUySC1tdTBUT0R2emRsT15jQFp5ZzN8bFN0T3Y3MXJAeHJzQWAqLX4zCiswOEZLRCZ8MVI8PChGent6a299e1pBWXJBM284KUBaYzVydnsqZ0syN3tyMHVCanNfYEF2YXBXNCpWTy0+UGZZcDlGVGlQbl94UVNIJipPCityZDJQI3U5RSFSckYjMmp6aXctVHJLVk9OaWd1S34pRVlGKEJWa0tYWndwb3R9I31eeWQwNStBdyZZdlYyNGlhJnxOJXdvNHNubUhsR3hxCiskZD8hTyoqSD1KKDUlbFFrS29FOHhWckpzc3w/WSlEdkk4O29Gfk9gdGA2OyolP3FVVTFweF9kfUQ9ZG1xUUV0dlJtaDZRZlEtRj5OekUkCishTENxNy1LMk5GPE1IaEpOdUgwQFpyKl5fVWBpJHFHWGs9ZTw2eWwzdGA4RlpYPFJ1YTNrRzlPbnJMPThZYUF4SFdTITBqWGo9Y3I3KHVXCisjTjs4OWl5NVR8PVJqZnxrdzFXYU41MXx0U3d7ayZ7WVpVJE5GU3crZXprejVAVmoxPGYqfkEtbS19SEpvZj0oVTtXMHc9YTZoaUJVVFZ4CisjMCtuP29IJXlwckwweTF3MEJ6MXhSJHQqMTkyKH03cm8oQC1yalFuUHI7X1pDa1NFI2BkdWxqazkxQU5KS0ZhJmJtRT1Ufn11K2xsQFF6Cit3XnU4fiF9U0hvaUFfVldiSCZTNXVRd3hhMHRyczA0cyk4b2ZBalhNeDB1RDEwMHkjMTFeSj58ek5NSzMxQ1UjRlkqSTF2JDlQVX0hZ1MkCistLWt+ciFtZWBWPjYyO3FueEN4SlA0NGVWUzV2WFZKSXp1cWdzYiQ9ZEs3MVBoOSsyVmtGbV9OKmNJeVg5MkhebGBvWT9wdmFzPjJtfjFlCit2Uy10LTMrQFJySzdraHZ1PjltOFhfcT5WbThpcGRHcTx9Z25MbnNraUAyXk0leWR+cnRITDkrY3okSkJDTHdxPzNnT2Q9MU1PUEphVUhYCitTY0VSbD5DTUNwb21sfW15RHZkKnFpYX1lZHhRMD5AdkpZNmg/cmBeZTlIYEAxeWZqe3JuR0RqekMzZUohN1FUTCgkc01ZIzZ5cCgoMHF5Cit4Xm9yRVVOOzwpYTEoVShMd2piSnImbzdDUnZJVWNAdSROYjt9Kmg+eERLbXI9RmdhaSs/c15VO318SE8yT0NrLWVQXjtkSH51dUpsMzJECishYEY7P0lVMDszNCt9ZldfajZmO1ImQ1kmQ0xhemJBRFo/WSZqbUtJMVZueExEeypGYj1UNXBFODBMT2hgQChKOzU2bDwzJmB4eXJSfXxUCitJZlVYckN3czV3SG05dGJkVkJuVFVJcn1OMD0kaDcleDFiayVSU3YmUyZZMSZVPGBNXyEzclMtV1hZMlNGfm1hY3tDcCE8SjhTfThHTSE+CitEd3Y1cU9mdl9famZEZHJTTHBeNU52NUNOPHV3U0Q5UlN5cVQ3dCt5dFA1fTZFUzZuVktKZDtORGdjUUp5JG9fZz5xaEsmYC1jO0szSFdGCitgdEZWZ2A5TDd6MFMhRkAlU3lwbGhrMnB9QkpGZDRRMjxTcVdyZ0U9V2U7NHxhV3FRaktHPmREK3BKNnA1ajRJK3pmRj1wV2hSfFJQcFdaCitUYHI2Rn5zTHo0ZSlIKnZgVFMje2lEPnRiJFRnMzZUaHZUdW1pUFZXR1NuQVo5YjM1Yn1SdV8/RzBQT1dxeFF7QyY7dXI4dTdZb182YkdXCitQbD5QNkMjWDNqRV5vaFY2fTNreHRQREYyQD1zUDt3UTJIY1IpflJtVmJaT2puZUJ5STRvfjlZJlNmISQzUFFDQDE4b0dMNkQ8cGUlJipwCitqdGZVJXxEPWYmNU52PUZwUkpuKHdteTgzISZTNjhKc0N0I1ZEcEs5UFRlPnlQUiYhYEttYUM/c2NKRCVaczNQdGxDT0BRRTVFbmt8K1FaCitMQSVNMDF3Ulc1PFVge3NiKSYqeTg/U2pvX3FyJXBqNHBPO1lBXj42cjBtQUoyJXZxYV4+ekpGUCZGKmtPVVVJa1RAMGBqM0ZoNXk7KndUCiteMmxZX15KdX1ycT9xSW0/b293fSFFLShmSXNSbUBsWHlxcUsmLWlrP15HJFRHOWQrMTFFSC0lWGc9Z3RffExnKihyZnpfQnl5V1YzakteCityUVQtIWpSLUFvNUA9QUNEdWR1PHJfOUwxZklNVzN1Wk9wTWZqNUBhWUc8bTFBWEFxVmJOOSFUZGlQMmlecF5lfWtlPEIrJXt6ZlReWiNMCispeSgjUkFZd1NyUG5lQjF4SzU5bWU4TmRJNnVoc0V7eEMtd3g9UjVjSVotP2xxS1RQS2hPcTIkUXRmcGllJDU/MXRXaGt9YyhkIW4lfGNqCit9bD92cT42XkVjRzB+S1NoRTMmPnZHO2xpQzRURnBKKnNuKTV1RHRsRl5oZj9TY1lxOX5aST9NSG59Sks9PDA9Y1AyJVEjcWd7e1NCOFRRCisoRXJxdSR3ODUkNFVEcHAkI3VlRmUmRV4kKlBIWW5jZjBUPHQoRkA2bk4+SEhOO0Q0WiY/ck9ZR2gtLVpKYUVWek5ecTE9OTJRfmRKNVJJCit5dk5McUFsVlZEdjItbT1VMU1PXj1qOSNUTDVodWImQXhDSiZVWHRsYmZWekpZSl49RFNTPSZZVGlVeUw1Zk56Mjk7RDZ5dThpLX5iaXJjCitzPSFxTTQ7a30hfEFAQjxrRmU4TTQlZTNYQWNfcXVIV3J3eks5QjFWM0poKVg+KjQjaDY4XzJBbWpyZytsT147UjxDWko8KW8jS3BNVnl7CitNYUJQT09+PEcmNyhsO1NMRkJwRE5VcTIlOHBNdTRCMExMJS12X21fYmR2YUxJeDA2JjhYbGtLQl5IeEFGakxhK0dIfithZGFDbmI8QHs2CisoWEh6ZFEzJkttZ2JqPl5LS1d1MW93QHlpJERjbWF0SX44MnhzTTwyejNoQi1WakA8cShyfCVBIWZtXzN8M3lCcjMqVUh5JChjLVY+dEZJCiswUUE/eW1ya0p6OShxOUQzPk5zTF98P0ZqM25rb3dJJE1XTzlvcGpQY2V8KFNPOz82NVEyQiN7UnlvMExpWH5JWCs4eitOZ1pmKk9WcEhUCitOdUJTTk9mTGh9IXtyWjlLd1ZeOzdtKUw/eihJcmwwSz58TzkwKDxEeTk0Yz9hKH1lU2VUQU9ebj4rTFk4eU1CRDJkdEtAXmhKRj4xb2ZTCis0RG5Od1U2I2Zgdlo/YUN5elRGWlE8c2FBWCkyYXJWTi1He29AQ1hIP15HMXYjJDsyfD9hQGR2X2VObTg9Pm1hTlhIXmJObnFyViteUEt+CitBfS1rbDFifnpGb1JRNzY7IV8kSnhtIVckelNgJU94MkMwWD07Z3NfLSVXUWpPMVFiYnpXWmEtZSV7aCt8cWUqenp4b0dqU0FoaF5jUFJJCitVPGE/PWZvdXBZaj5EM1MtPFk7KFNzWUYpaD19JDVIVSp7QDh+Xj0ycUVyYyt8O3pJbF8hNmJBcShqcXJjOVV1UU1JfUpUZ0JyOC1SbCU+CitiKDZTVjRuZylxUmYoOUMhUWZ0ZVdnVEtSY2Y9cjBhO1A+dCFCXkl9PVoqYjE2YSNWYm42NDN0NilqN3dUblJzRVNyRjI9JWwkKlE0NkxoCisoZE17OCpTMmJWeSRwaFVoKWhDZHZJeyp4eGtVYVFuM0w5ZyUyTVF8VFB+dDxsSjFvV09Qbz9fc2BzZVBnJVJoQU1JRVV7KkUqeT5uWG0oCitvQzFLVHZ8UlhAYzVTalF+YWcrZ2hhNjR9SiM1Uk1uRktHM34oXlReZm8wNGA+Rkw7PktHNDJMUlZVcj9qKlo3SGdDeX0+OWRrYy1sRCQmCitaI2pzQ3paKyFVLShkZGJVVjMqcVgpP3AyWCt7SkJ3UDQzSStManZrbEZ8dkVqPjhPO1AhcyghRyl6T0dSQihZS0Zgc0JWYnJJcylSJUMwCitQMTwxUWpedlRtayFDTlZHKzQyPzZ9N19hbWlFLU03Z0ZCWEJWb0QxXj5EZnZ8SilVY3RsdjVoOTRQfTF0KGpnYSY1QWhKMXolcUBoRT1zCitLPTt+RHgwfFRWMEk0LVl5b2BaUSs5bF9SZW9+VkolMWdwZENLd1p8XjYqc09RdEtHcVloSDY9ez9LSG5jQEJfZDJAIWRad1BNX35qSChqCitobEchQ1BRQCRqPHEpK3kpPj0pZkBWPUd5UTNHSGxmOGY7MUcofFEwKTI7b1ZfVEh5WF5MWkxhR0ckeyFKZFEpYVJiclFBUyg3a3BOJDdZCit6YFd3UGt0Q0hoQmU7a0Y7a3Z1MiphQD9JUHE1UUR1WU8jKTB8QEZATXtmJG52WEUzTER7ejJhcG91RXxfTG5UdHpje0R0MWx2Y29WbCFXCit+PDdiXiNhQD9zYjlnd1pVb1NxITFNMDw0YThqR2dVaUI2ZXc0d0w2a0JUVjt3SUkwRTs2Y0VqNnxgWi0xYkJVOGhYYHc5fVh2LWpQeTNLCis4UiFQP2czWEckT3AhQiE7aVFOaHVtdnBONkd7TmomfER2eTRNenh1diNQRHY2KWBHMyNOPElUKGdXY0d9MmBiSU5kZnVDckNlcyZ+VnBBCiske3hfWSZRe2VNcSRQYSt3OVhwfWk5MShQZFY/ODRKdnl2VkduU2pHIWhCQERxVmUjK194UGZGWkNLWj17YUszdE8/R0dxZUFid1hic0Q4CitFTmZUVjgzWGUrUVUyMDEwUz9aPHRKay02Q2dLZWt2ODhOPl9NalF5fXpyKlNgMGA7SThHTTFmeUZvVVFjTlcwbm8kVFQ4cXhhfTkrWWE4Cit5SVU8ajElVjQqMWQ4OD1weHpTZ0lhWFJHJl5TfFFQNCtHUjE2P3YhNVJLPShSOGBoKVVFN3gocSo3V2tneDl1OHAmcFY1MFppWWBPdC1VCitWMT9HaXpAYSFpXjQ8emE4amEybUozK0I8MSRDeClNKGVrR0o3K1REUXwwOCZNZWl1dWUwJWkmM1IrdENyQGZgcHwqeXdZenhgI21obz12CitlMURuUz0zNzYqY0hxQVRvaz5SV2peR0lMKiolJShOZ3tGQ1g4fDAheXpzSyUtcitnMWAqWTcxYmQxTkN+K0cpdD0+JnNMNF8wPiNedFVTCitsMCRjbU8xSk9EKDtuenZDd280WStmXisqOSV8TDYyQHE+R3ZeYlY5QGxCek81ZmxMb09mTn0+Sk4ocF4tczhaMm9VQCMoZmR9Njsre0l3CitgYVU2Z2RAe3pgbHBGeGx0N2xrPWZiNWl+I3VmMT9AU005NGkoN2k1MntnP0JtOz05e0ArWFp3Pz1fJHE+S0VWPj8+RnpqUyRFOCVkT0U/CitvYEVBS3dneT5ARStxWl5PR2JFTH0/Yyg7bHR0PDgmfEpAdVk/YjdZI1EzUzFXX0V7RlFYd3lLX1dwbkR6V3hWdjc9NTt+LSZOel96QnRsCitwaHxPYmZPNmYzKiZ2cTBTb0krO1NXS3RONjE2LVJsJDx0SEhUNlF9QGtpWjBhemVyQiNRS2AlS3dPPChIVDQ0SXV+MXE9aD9oc302YW5kCit2elZUanhRXmM+SUFDT2N0UmtRM1g7byZTZEFkU1UlVWcpTWZkbTwzfDlMSzR8SzJWd0M9PkRTUHJgZDlye2BfQmpOPUwtPVdrPVh8LWc8CitWTCZAdkNLeHQyVzdhPFIxS3NPI1B3PTYyPjkzYiRCNnpZWD5PIVVpUkcrMyhPTHZVSiNiN1AzP2ZQa2Z7Mmt9ZnkqN3xAQyYzI2dxXiE1CispLW9UfmJRUlF6aiRCS2cjKEREUDRTLTBrNXpxS2l7Pk5wM3cqRXVjeDhBZVczQ0NzPXJFXjx+PTlOakZiYFBQZnFBZzVDcGJ9MkRPeF5wCis7UXdKeX1YMDtDdUg3KXpudldvTEt+cyF2a0JxVXRndEZxY0w1SyQ9anJ5b2BRc2hOKnEtaHFfbndfTEx0K1o0THNheno7VWRPST9QfXo1CisyREBoLXdofURzIVR8cXEhRz15TGl0Ny1Sb2MlPz5kRmc/IUlRV0Z0S2ViP0tnQ2Y2NntJRiNiOGtFPSkjfCFsKztiOVQ/RCVCQGtSR2FPCitgKFVibSQoVHdVZy03KSl2LW08eHU1RHdSUT49VS1STUJFVitlJVVsR0YpUj4oKG5EJWwkYSkzMlVsNHM1Zl9xKjZtTFV5NmFEI2YhTUh7CitHOTQ8O3NpJVFqKDBHakAzd04oS2IrN0lwSWB1b0RSMVVwUyRXTmttdiNAfX13Vi0obHl9QEc1SldITy17aUQrY1lRM1Iqb3NzfnsobTRFCislYDtRNT5qY3hzZCV3IyVjRHkydmNKSG0qcnJaSnFCdXcjQ3U+O2NeP0I2akVpYnhnVnZmRDwtbFMpMHd7Ykx2MjBGNUhqSzJIdCtVZWxBCit4JmI7I1lfdShnaVN5JCVYRG92N1VAcm5IKnVveWMpYDUldkpmTmJ6VVpUO2R9NnYoXjMmRE5ockdiK14wNy0lYyFGcGFyJFEzcCV0dFF6Cis0TjFZMS1hWTJYan0rSGE8WUlKKmI4Wj0rKmZqPEFDbVVEbisjVGUqKStnZTdWWXU8ZUQ3P0gxe0RjcHw5RzwoKyZjV1MkPTQtIyYhRWliCitnIz9jYWpMO19BcHFCKW5VVmtINEtYSyFCNFd+cFZ6Iz8/ZiVefVh3SnA/JHRHQlFIa08jV2dwLVBRTitTTmpwLShsZ25XN3lyRHN5MHpCCitQdm1IdXVEN1gkMXB3ZTBoOHM/PG59MHl9K0NnQlE/VEhoVytMQXU4emVSTUN5d0trPG1GUDAmWlUhVjAldHtya05TZ0ZrZWczJUlDKFBWCitLaDc5fmVafU5fO0tfcVErbnA9YEVzJVRQcXpsOzZfRVBAbGF5Jkp8P2BFXykhNFktez5AJiZINz8hZXNGdks5ISpQTyQlMzA3Pkg3VD5oCisrZ19nYUcjKlNoXld5NE1afCpMSkIybkxrTV5jbWo0UUZMcmU9X2I/LW5UZyZDQSNFfjBQQmswcTt3TjdMND5uRk9gIUpySSshMiZycTN2CitOfTUhY2EpU0hifUgtPHszZ2I1RkhZeyMmQjxuZk5AQ2sqNzJYe1VneHliVig/cmRKTUd0TzdpYDc5PGlYKjBucEk9Qjh4bktJP3ZXdVhCCitjMElsPipzREFOQjJUJWpLcHpLfDchNSZ5PmRtaDMjXk9mZmlOYH5qSE8kNDxpNHk/RVdmZzwtTllwd0Q3V01jUGZIPj1UKV8hRSV6fE45CitxfG4yeXVKUmZ+SXQ/R0V0UTMqZCY8UzdWZUB9STxDWnV+RXhJPmQ5SHMoSF9gaGZDJmJPbDMpKl9DKzlkcl5QfHpaaDxqMWtGfURnPnpTCis1UXJsKU4qcz4+clZWVFloTmZGOXJeZXVSMnFOQDdYQ1khPFhUaVBDVGomTllzeysxS25ZZXhqb0omOHVxOGV3I3gmUnF5fDdmT2kxakA9Cis+MFMhVS1FQlVhZnBkb25KMCNDeEJfaVNEKExaNFlXa0lYeSV4bDJwaSRzaTBiIUJzSlBtZl9hJVZQSGZRT3A2PjdpI01+UD1ZOD1xTGo7CiteK3licGlWQ0MxZVl5bkJqSWBAcFI5c28wSUd5cGJ+elBiNyQ1djgrQXw3ZXohezwje3xCJW8zTn08KGt4Q1I9XlFFMWhXcU42WUB7dWx3CitScmNDSyRUMWRsa059T2hJTnNzYzI5SjhwMyZqQDFSRj04YlFaMV5Sfilsdm5rO3AhRS1PZ1ZTPy13bTlXRyUyY2tLJjMoWSs0SmpUP0BzCitkNVZuY0g8WF9aaEdQSVZuaDZfZmdBVWMkbUdnK0xxI3QjM3QlbHw5RkxqKm0+TEhuMlcoNHtqKDk0cE1hWWY8SjQhNihnTjM1KDNtcF9ZCit7VC1BLSNRVFg+bl91NElFbnk2c3FCTlIzZz9rK2J5ZEVBQVA/V1E/N0tzTF5sUDVOYTFybkBSMEAkQkxmdSRWaW1sc08hZzVoeUVTMzg1CitBfD4lYmp5cSpJdiNqK3NHTFNpYEY2T09IfXwjMXF8WEZBT1UlNmRQKn49NEd5bnNvVE8wdXNzTGMrYi1kblheRH53X3JSTDttT2t9Rl9jCit9Wlo8Z3l4bGBEbXljPHlSO0pFc0ZAbGY1OSkmSDtPTEpaT2lUPFFGdiZ+eUtldTA/c1kwaTFAfD0tQjx8cmotNj5fRGNHdlVlNWExWGtsCitzdTBGRXktbSRuLWF0RHE+bm1oPFY1JG5taTdHME8mQXRhSmRsZkklUkd4VUFkK3pOP2Uze1loPitjelVDOHBYJmZxTjdfQGE5cSo1OztCCis1R3hRSiFpYVJKc0JYIX1KPyM9XjkhYGFpPX4wb3hWaldhOT1UQWlPMW4yUGw1PlopIU1IZDJxN2dXPzAoZkE7V1pIJX5aaFZYWjd4ZiUlCitHeVNiRXxFPE5Jaj96UEZaREQ4N2drZiN6Km99R3dyaGgqKWtgMERiUkp4WWd0MVMtb2UzIWhGTjV2SjtJQyVWXihlMFI3dlpraDZXYG8oCitnaGE1K1FUcEojd2s0QXN4NXhMe1UwOz4/TmE3WVFPeVNvMWMtQ0RAUGpFZHxaQmdicjN2JHBOKk5paDA9VHNkYlpSbXdjYGM3bX5GMGdTCisqe31eYEA3V2R9SVF5K05WR2Z1Mk8lZSUhaDxRQCg/ej9uQUVTUTdlR3hle20kKGwoN2k3ODU9YHR1M0RGTXMxKF4lOHorbVFedmdHQWlDCis2WkRlTCEmWkxscUUyQyk4SE43KDdrUytOdXZfc2E9KzZ3I2xtQXYjfEE2VmhyMyZuc3Y5TiRXcCgqPCZ3XnlRaykhZyQ2VyF+QU1WJkl6Cis+VyRvUUBBJT9STXlTMFojRkclT0NIeWN6MnwzTU1tZ3hAcGVBUHxRUy02RFpROWJYbVJgUTxNV2Z2eGQyWmlgQVcoeCtYUE5eWEpQelBQCitCSHEmREpTSyV7c3VnI1U+bUlAUG9sd2VjI3h2UzhES2AlQ0xfWElGfFgtLUE4aXpsby15S2RAekhAPT08VipjLUBJb1Z3UFl9RjV2VWw5Cit1N1M9Wm9SYSk4QiMzY1gjKjEma04mTlVVPV5QSVJ2VyVEaFhleTdMfCYoJXNRdGlYeG49dmJiMzxNb2AlU2dpQik0PCthOXxubTJUPlJICit5TTZAP3d4VHF6dEk/KksrUEQ4YlVzZlZpXystaTR2V311JWtwIzRjNHloI25ZYlhVYm13VDA+cnZwQXYqVloyMTdpUXI7Mm04YVUweiZtCitVOzlVMGN+MmtSX2F1R3hmOSolTXRwMFlgNms7fiREZHJATDQ9QGpWaEArblJHKm9vT3AwUTtpSFZGdipUMyVaXjt8WFZTMSQmUm5PIUolCisyX28yI2I/R0doZkx6IVRoY1puIXo5X0dDbnsoSEtEanVWSTw/dVNEJDgqMHg4N2lYSGUjNU1XYnltOVhJU3I9NC1BISMpITBQbGo3cmw3Ciswe0Rabno7fn4yUkhgMHpfNl5vcCVGWU4pX1ErREc0Nn1aVDRtQiVFaSQlMEw5SUMtaEBNZmJZR1pKbngzdD1We3o5Xis8MkFWbld4bkhjCitFM09aKCVDSUxLJFhyTFBXKTM+JlpiaFZIZWdWVVVXcW1APG1mKHdzQ1JvRTNRcztDY3g7QTxeMHs0WH1Iam5CQyNpK3M7bilDQWJfVGplCistKUA3bUQ7MSFwcCt8cldQbmA2M2I+Szl2JVNWUUU+KHI3RHY+MU9lZWI2NzFDO19sMjxiVlVfI2pnYD15O0lGcTwyaChRYSlCdDtXI1hiCisjRyYpIT9mSVpVRU0zN203UHpfdTAlMyhAOThiMTV6QjNgPmNOTEJISzRacCVyMFIoe09Rd3BTPWt4NypIeDE7SnFKVFFmIT5yb1VaZ21aCitVQ1JSejR5OGxiYmhyeTBkYDUpdjkwVFROI1UxQy15LXFBP19CekRMNkI3dW1wcl5+Q0dsVDVqLU9DRVJgVWBuWFhnQXB4WkdgR29rSyRvCitZYmd6eFByNkNVTGhyNGpWMTxScj1XSyl4JUczK3syYU1Sc3E9R0d6fjFwNklJZEVEbyVvYWtQPUBCXi00KSNmMCZ1ZiFaUj8rVnFjSXg5CisjTWl8T29VOXdnfmdZKD9GY3RwPGR9QCg8YDx5SWFySEk3SjxUPTBTQGY+XmRxOUFtMUcteDIxU0FCM2BVSVpNIzRMYntgKTUtN2ZrUDMjCiskfnA4dig3ayVPND0hVmNJKW4qSHBJUCokcyFyOXYwbyVzelEyWDkwVmZ3ZEU7TW51YllCSjxyWSR9WlpDaT1aSzZ9T1A+Wl9oSmdWbjdCCisqai0lWGFjMm9XbU9EWG9oTnBwZCktKT8zeU9jaUp9PUxYMFgxfjwtckFXWEkoNCZ6TjxTRVJ3fCRie19vMDYwUlA5anE1WX0tM0Y1VGxmCitjZnF5cDB1Y2ZwcGVaIzladyZgR2RecjdTQEM+WThDR0lMVz9tUU9WPnRKU0BPQ0h7Xz9RVEBATTl4Y1JOdDFkKWlpWE49JTB8ajc+OD5hCit2eFVzWCZjezxnLVFydyF8WjVie3w3M1pFbWNHJUVDeDIhMlVNLTBae2FWR01fekRNdzB1QWpUekNDfG1FUDlGJVBYUzYpYFlrSHo5NlhqCitra3NQZCZLNXVOWXxpMyFNOGImRSM3ZEdpbkdVT0NnNiYkdE0oKV92b2JYTjJzSUlsam9GQEw+NjdJWkY8ZF5CZ1ViN3dXLTdzbU18MVY0CitSLSFkaVglOWVrdFVzITVqdTdVRWQrYFc1b0J8NHhZPWlSb3ZreCFgKzEjZW8qNlpzVn50YURQXkcoOF9IOUxgLStGaENWMHB2WHBpcSUhCit9RE5CSVlZQTc7bjZVcUBhVDhEQEZqPUJpeUEwOzxWSEZmMjJXbiQhR1h2X1QyWD5BSlpUeGchclhMfUlaZShxPlVfQnEtUnBLNFk8PCQ9CitgN01fMXc4bUpQYD1BWVJwUmp2Ti1ITC09ZFVUNjk/Z05NVklGN3FyX1R5TigtOEp5cXBLNVd+aHxlPmVlcWNrR2c2QzFnXnBtNDM0fCg+CitxKEN7M3UocSozTFVaK2QjYTNpcnReO28oPGxqfUp8QE9eYGVyYU49a1JXb1lRayh5aCQ0LUloblkyZ1FTdWdsdG9Xalh4THc2ZTctZkAxCisyYmx2U1drJnQxZVFqbEhuNWwjVTUhdGJER2hKWnF0UT9RWDBMSF4ySmV6OWA8cV4xR2pnZVNgWkZNN1olITdGQ042VSt9KmJIPCE5czhRCit3JDNQdlF2WFVYWExNY0p5bGkxUzUpXj5ANE9femJzMipYXjRxRzlJc0xCZGFmRUZ2b3pZJnI3TWdITm9ySjAhI3lDNTtBdWZxOXVjcXtCCis3Q1JUNj5fI31fdjlReSZxOzlpSEJpRy11ez1Pd1hrNyt6X2VjKT1ZWEY4S2ZLQm50NEBja1glSSRYK3k0UXw5RyloVSRudTZ6TWE2VlV1CitoP34yVE92Y3ZAT1AtcXRfcTA0QFBCfWZ5KngwU1M3cih5SHo0cGBOV3o0UW56SSZYQWdzLVBiVU19SWB1YDI4b0FZTzZFJEVZKSs2PVMyCitMK1NPSlN1M3FSfm0kaDJBSkJQNz5aJFlFYUkjOHB8MlNDVkhOQmw4cDF1PEE1PyVieDdSQCthRHdfb2FCTHFzRHpNMmdPZ1pfMUNQOSlMCitAV2F9VEIpcj5HV21sfUE8X0lLejBrK2czT2V3WkNQZGR0R2trdytQMkJ1Nyo4S1B2WSRZJjBVWnJJRlhVVGt9MHlII3ZFI1RFKiV7UGM8Citweik7MWIwLWFJITx6ZnopYHBAdyNlbCF8YFB5TFdAKVdabGBJQyFQOHluVlV4UGV5SXVBUF9kMz9rUSg2M2lobENTMVlaXzZyP0g7KT5gCis0cGVuSDRwREV4NStjR2BSbXMyRU9mNjhxMkJDdW9MPUtJXyNOQjg3a0xzbzY2Z1YmejJGLStOKjVoYUlkKnIjdT4tK0Y1XmYjSExpYWo3CishPyM0c1EqOTVrYiRSP1lWYSlTfG1iWmNPcjBDdkVsbn0rUnlLO0dgPEV8MGNjYEZPdT4rdEFtMEBkKFQwNFVGT3hyMm8qSFk3V2ZuKSRrCislYHt1dGA8ckl2cVdMen5ZN3lyODMxKCYjUTxgQX53KHV2aX1RMFJfK0t4SWM7SXZMLS0+UiRMS3ZQTT0tXlBuNGQzfTI7VlRJZ1A8WFdWCisqcGlCJXpGZUJCTCZQK3wrdFhSQDdWMCklPlpEPSMqcFcoZnZxOUBRTlglQj1OPD9zZXwmOH13KmV2anZhNWx9JTYpP1F3fTdFXigtKUBCCitrZWIyTX5AeV9OWVUlZ2p1fWo+aDh5Pl5ZYzhiKVdoZ2A9MUxoQGh7SXQ3QEZIdktqKntFfEB1QyMmeVZSTSMtbXE2M1RJeWJ4dEgpamJoCitleGo/UmA2YGhgaFlZTWAkYkItTEhzbUFAZFcwI1Q0Z21YZSkoPmZlWnA1PSZTVmQ3JXchfFhyRG43KVBlaihsKyMwcWRObDdTJXYhJUNqCit0QlVLVikqSElsRFFvODgpYXRhbFg8NypLPHFvVihkUT1oQXMwUWwrb25fcX5hamxhOFIrWC1UR2tta1o7OTVeUGFnKDktMUd4WHJLRVFkCit1QEYzKmtZfikqfCtGVn1ZMlFEbFM7SmJFRD1nbzs/RmJAMGMzMWBlMzZCPGZEUk0qc0BaSTt6X0lpTzhLd3g9PzdTOSMmb3JTOD9FIzYxCitAVSMmbkAwVEpBPUlrKHE4U1JOR0leRl59Pml0e1BeOU5WaHkrYmF6KW0rMyZFOXF3TFcwcnBSdGNNVmlPeGxjRz0wYj1XPUxLcTNSSTtfCispRU1CUSswP3NuWGE8YUJEdmZYUVNvMUFTYCg5MGNsVEhKMVp2KSYkWnlXeCltVnM/PDk5MDtaZUdeOHg+e3Z1RH1ZK1J7UWxoTmgkTEhICitAcW5edWV2bT9vI0Z4OzUqVH18MEgobTdWbTQqWVZQeWNrYjlyY2V5VzBocUgyRFkwYGB6UGtQVGQ+JVViJFghM0FsOG5QVzk2YWhYYzwlCitvSGkrKEBJMHV5VUN1OGQ+MXYzYSpDa0djaWEtM0JmSTdqNXU8UCt7PyR4Q0o9RTBFN3V0PmhFI09KQzg/c25sejtDQntQQCNlYE9Gb3BkCit4M1FPUDteOTs2WG99c2d2WEpzU0ZBNF9MeF8rcykjKXVsUGVBPiRAeztONDA5ZmpNZlk2enIwNjhhSDJ8YX5XPilmRllhNFo3dGJESkx8Cit5Sy1OdmgzYmd2eTAqPXdNZHZ3K0tTYEFJUFBKMTN4KSFAVWI/VSk7MjNTeVVNPWc/UF8heUdtRVZDaFBQTT8hKSVTRXZPdFNtdHhvM0x7CitoT2xWIyNnaTl4fkBDI1U2ZnVxYDlGdUA5ZUgkNmlDO3RlXyg1RGBVbFVsNUVIdU9nI15zRmZeYCM3N0A2KS17MlU4M3tnbmZ3ckwzS1RTCitkWHQ1clBwQkZWYUVBNzVyYCRNX3tvenRKKXV0eT8kcGtSTHY+eXA8JjM1Jl9AMlc7N313MyRla1hSQUomZkktQyY2dkcxTThCX157X35QCityR3coSWlZO1QjO1haN1p0MCVnK281T3tMRHpAJEk5dFUpPFJGcyNzU011cFRUfl98byUlUGI9X1llWlooQ1FxKTZDZElNVCQhNnJBPyF2CitrZUtxP185JEVvYE9aKEJlOCtQJXYjelRSJEtXXmJzaiYpYT9xfXRfdmJQPClQd0RMbWFAKCUmMjhTdDNfN2RhXk8zPWFtdz8razsrZUZtCisoKj1ZenpZREIrM3Q8YkBzWklvdyphPUd8WlBDQ2w8fTlUTSl6cT1QJUthMVpiMHZaQVlpRz47ZHpRc2hRRHEhJUhsQ2ZCezZjZXt5OGYpCitzWUJlSVplcVpiLUd0ZTM7fEE4PGVFNCZKMGckMzlfcCg+TCpEMjlfaWZXJmsyLSZLPTt+QiZPQ0MhUS1ab0chMkRMIWRCTGltRW49S1hqCitjYClMUWI7dEFJaXBKUD5HSSlmeWBnKlU/aCYrQjM8akM8JUdoKndrMnQkMVYpcXlnMSstOFBRPXYqQFN7a2olNHhmeGpAclk9KmF2ViZoCiszMX1YRTtCVDV0UGlqJU4+bjUhPHE1I2FxP3p4dWJBOGMxMjJNe3ZUc3J8Z0RjNCpmd2NxTjBVbjE1T1FnVjNxJmQhLXx5MjkhfnZVOylfCitgKHg0TylXQUFyPTJsRk9sMnsoZStKUEhQYUI5UiRTTTJYP2lsZFpsMj0qaWclQVcxV080TjF5NkNHPjlCST9uRjdkPzJ2SEhYTHM2S3ojCitFSXRmQCM5ZXFDQXlFPiEoSSlLWWl+NnJPblk7Xm5CcVdgOHsrZ0hTTyU0JHtWbEZPMnpWS0Z3YEImUXgqKnpjWmFFVllVWj5keiNSbFo9CishcGg+ZFpZPiNTJHdsUTE9SntIJU9ueCY0YT03Z2M1dXdnfUs8PnVfbzIwbFg5Y3Y/SStRXzRvXjN8VG9RclJORFlSakxzX3R7XmUyTU1jCitjc2RtWCpgTnJBKElANT44Y009Wih0bWxkb3k7QXN6aG01T3JlaFA8WCtTNDFEalMoRV8xR0ReKXlYYGkjMzhlaFpCO1NgbGZxUyliK1lXCishU2h5ZDY0TkdTZVo4eFglTTFxZ0lRPEg/UkEqKG0tU0tYQkdIK0E2TTNKMWFCekN2dUhSfXd9ZFhoMlcyWDBpOUcrYFMzKXIta1VkdHtTCitEJURaK3d6ZUp5T197YGBuSjxPR1IhQjxiRCFtO2J3JFIlKkBBcHU2fFo3Uyp0SDlHRClERTtLfXlqUGd4QFFofX55fHY+SiMrMmczUjRYCis1ek1KYGkkQCRfMSlpe28mUmVRXmAjLTdlPjxMRil5e1o8eV9kcmZaVUZTYUt9T2hAa2BZeD5ZSFhvd1hMYDUwQ2dgSV5gZUd6MFIlQEsrCit0fTxuVGNze3gqVlVCNWpAQE8kbnZ9VlZLeFNYLVN9PkNfZ3MwIVNNVTU4eTROTyRRUm5QQzckeXEheUN0P3UrPTIkKDlhPyRmZEluTTxSCit8c0dnd1JuJShlQHgxZnhZfGpuWm40NFdXWlhgIXZ8RWMkaTZMWjBeUWFkJD9VX2szWGlJWXpNYz9nJE85WUZPWllIeCtySWZ7WSYtSGJCCitHXnskODNmRk1pSTVWZ2g+OzdeUkhOP2B7ZkNUeFNFMHEwO1pOJH0hJHUxN1hiQTliRXYrRGM/Jil8Q1orO0k7cj5pJmtFQUtjXjFLNEVhCit6Z3Q/ZXlwQDJIO0VwV0h0PkVXSzh6VnptcmJNT292U2tuQTVLRXdEe2M/K1I5e249dEBmZThmbWN9UGJQRlZycG8hUlBMdzlFfUd6YHErCitrZ2FMUnw1KTJMekJkTHg0NUkpKnJlK1kzfWFMMX0maFJ2VmxsTjMybz5VPnEocEJjQlVMUXc/UjQ2alY3fGduellhbSoyLUIrdldza1IyCit9ZE5aWENfPDc/dVpRdTMtX3ZHYy1OWCNiZVhhdlche2hnUFdId3pIO31NZVpwdD84MWxXdCEoPV9FNlMjeU1COTlDWXQ/WUhCRkUtQSFnCitnP2tMY0BNbChgfncjSHUhWl49Z0ZXRzwpITd2T3E/PHAxTHwyPDklTlBSZnIzWnJoZmlIcz5BcE58QDBiR0o/WXdMd0s+QEBKRmQ1a14mCis/REI+YkNzZCsmXjB4U2U4UjFPN3M2aGsyd0JvYDJXekxeYF9feFFXQUshbFM7Py1aYkZDSmdNeygmRnNlYSl9U1paQlRGZVNDVSteVlhsCithe3AjYFU8Q3AlIz15JV5nZWZScCFWYGklQTs0Qmtfe3IyWm5vRF9ma2h9KDVOMDBUO1hPNjdhKjU9QSk2SUBYKHxleERkZCYtakh4Y3dwCistWGdBd2VFaG9fX2c/e0h3QFFJJndvVXtocVVESkchTmdUdHdVLUspWDJwSj5JKjJafnU8YyEkZGVlSCZha3hEd1Fma1N3Uz4xJm5geVMlCitMfj91LTc3eD5qIUckZlR4STdKNT5ZNEVIQypFWm1UKG8yVW1oPEFmU1FAUzVVPUA8flNWTz4qTllUYVhrWkF5Sjs7fGAzTXhWeXptWkpZCitMWWxYZUtXMnZAREQqeTR2NWkheWJwQiRmcHs7RnkjISE5c0d2cng2WlpxZkVIQXZubUJFIVJJZVo3al9kcjcmaD03QVVHQU5ObjRMbUVBCis1RjFVS1Z3SmJyQXM7QWFkRXVTQjUrem9edHAlRSlLd1Q1aUh+fnJ6IzMxM2Eha21LJDhpY34yU3tzekRxRjFCfDZ0bGVXNHAoQVIkTl8/CitpZU5iYF8lSFY8VDNXfXtrYnV9bXUyM2NFQi0zViN+MGJ2JXNQVk5hNXYlS1V4KmF7cGB6X3xvdU5XY2pNa1NqbiVLYGFTa04jT1ZjNG07CitwfmdBXn03PkN0UUZNeGRER2c/RzNUVFk+KSFuOVlGMjQ3a2dIWjRCN01mYlI/RncxN3pxYyhIKCMzTWl4S1JSSWJWdiVLJlFTN0l5VnwzCitSYElXYTI/NDk7RFluKzhpVzFMOSFLT0ZoU2xCcXlQYVRrNnhLbnBxUy1fY2VvTjs1c3JkSDEyYEJVITROS2ljTE1ZaHBxQnR4MWVoV340CitGTGQlZSU8cVNGPmx6NHtzI3FMcHN4IWdRaGBiJUNAVGpnJUsjdDtTVF9LeDBsNSVSM1BEO01xKnlVM0xra3FNVlhCMiE1ND1ycTAkMT82CitIXklyc0w4Jj58YlEqPm1nYUpXT0FRMHZUKCFNfkc1WGNlWS1VJUVpV19qVHF1RWJXQGhaaXs0ZlEkJFZ1KSVSXyFOIzZJV0Y0RzU2JTxFCis7Z0ttTm81UTVGUkY+Y1J8VndNLSk7WXdAO2t3c0E1NGVHSyUhOG9XVDJJUElmPTd5T091XzBoJmYoO2o4YzZJK2tSLWw7V2c/RzNUVGNICitqWSlUc2ckWjZKOUswOFhGKzRBZzdeSVR6QGQwPVpKYVFVQGluN15SMns2dGxlVzRwKDk7UkY7Q09NWm5BbFdOXlVzMXwocz8/RkZQO3pfCitKQnxRb3pGbT5gUlFlPWp+JE51b2QkOUZpJDV0NF52KlUoamFSS1F6c0llQVJgRC01a1drUm4qXz4waCM5ayNZa157eDd2NVJDMVRTMlBqCitnU29uPmY+UGhMX3A2NlhVcWkwenl1MU47NT84KEZCY3FsNXdqRmZmbnReeS1yLTdZI2VAUmtYcHB1QzspMCshOWFJZzFhJEhjKzI+QFpoCitwIyYqYnVxYHw4bGpafShFSEF2bm1EbWNxZXVNcUQhVCNHfEE4V0FURWx8az9KMlpubWhyekRHS3VaJFRpfmBqfnNGa0UkbT07cDlwdWlpCitiaFhSI05QfHBjIVhhUnY0V019fnU2IUpUODctMHJYSlB1VUhmeEk8bERVdClsRUhDKkV3dHxpX3BjRGMqVzF1fEA2bSlfN0N5P1pYWCQoCitjQDBBVTl1O2hAZU0pRXdoSm5LQDkqXjE/ZUBpTElDKGtsMkt6Mz1rJU8wd0s5VS1XI01XVmUkYWIzeEg0e0xXfD1AajN7UCM7aG4rRDxtCitLU3k8WW47XnlsXkVwMD5jbk9ZNX1qSDRxeX1GbSFsWjtLcnpiOz97Rm95TFBhfCRJdE53YmZNXlZndHdEYDZzRH1teCFrYDJnNiNOM1JLCitQYT1zYXBNdmN2JUsmUVM3SXdMe3NDRFR1O2xAbjdqUl8oNWYpQHowcV9xPDtERzIxeFg2SHBqTmBeN0N9dyVkY2QhKSpxWDBnS1RuPW5hCit6XlZrU08yQlhnWSh+SHNnY0pjO2UyfXBSKj5mQj5FPHJLTjMtNTN4d25DfkdxPFRSJTdHel4jKTxwNldxJTEpeTUrKXZgOCRyNGU8T1hyCit2eENGJiloJDZ2K2ZtU0NGLTJ8ZUFwcFhgRHE5TFV+dXtXczkyR3l5Y28pbmFaZl50U3NEMlVfNkJgOVdqO2hucV4pO3syJmdYQW9yVUlRCitqSEFvdjJCRVRxSUJjPi0hRE5FbX5wRkhBRGQ4PChKJTwlTV4rNT9oZlBnd19qbzl0Qz5PcGZuendhdU9VXjY2fSEtR14+RilHc3hKM15lCitec1RPYlptVnl5UUZCM0kmNWUheURBWmczNUQxUHl8M2FQP0g1Umk9aDQlQFE2WGBBTUFHdVdjX2o4eENGJjRGVEJIKipiMWVZVjkjR3J1CitANGd2UEYpRGpRd1ZrXzEmMUY1bDhTJX41QjNAZEo3d2QlYVM0aTlVVS1LcXVAIV8yZmlAemowU0VQQHB2RHVWWmI1UHVCdkM8P0Z4YUZUCitoXmhrR0FrR18/cHFTLV9jZW9OO0t+by1SNygmXyFla0l0eTZZUT1EX1M2S01YOTkqZHEpcGl8NW9+M01kan4rRW5CfDNjeERzMlQwdXhZCit2ZmxNYipXQ1JMPnBkPWxYRkBxWGN6fTUjOFVMWCsqTzE4MFhUIUxiam13WDNYS3wydTAxX0d1ekFSS31rYldwN2YzWTleOUZ7cz1IbUFqCitDK2ZMey0mXjtrRDlLezNrPD97Rm95MHdvclpTT0ViUHE/SkxjN2lMUSsyNyglUkstbVBmd3g5K1JAYXlAfmVyQ0lnT0NFbCplZnskSnpkCitnbjtHdWl3MT1NVm59UCloPkA2YVdBSzJtdGV5N0RwfGpJOCskfTAwNHt6MDAxLXEwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WCitQazd5WEp2Q1FWYHlQPVdNeTxPV3AhaDhjV2BvVlZyNm5KYUN3emZVMm9iLTVQaiFZakxIajxoI09qNnNjcUI7PDNOZm9VJjVkJFBpVjJuCit1PENsKCtGY1U0enJKVXxraFVSRz5uRDQ1PUlsOVYjP3grSmV5QmdWQTVDZElOKFIkKEs+aEo3YEpkaiVaTVdMQSslZTZwKyk2REpCXz9OCisqaiFOQEdEa1VPZ3gwRTNrd045eGNFeGtuTTlZMykkNjxhYXxgM280eHBSI3dFczJIS0wrLXNRJEZPN0VpdzNWQGs0Kj04TCprZTRpRUlqCitBNXNTayordU0jJDNSVyt7S2RGbXVyKWNnR1Q2Q2ZfOE0tKGVYaTsoTVIhSCg/ez1TTC1wKGNhMzwtVyVJLVM2Pmh6bmg1KXk9MkM1fkVhCit7clMoMzNZYnVsPiZHTW45fWthJHwrOWdHK15GQ1Q5eCYzfVV4Ym4+fVNobGpVNXhCUnFgb0J5fDRYU2sjdiRtcWleeWQhMGowVkN+dEs/CismUlY5YlZYeCFVYHFGXyorUntIemZtJG5AbU9aODlnfWNXZ196c0RJNWlBSih1TjJQNGQ0JiUtViNma2hyNkhISXo7RzApSH5oUUFhPT1FCis+SWZoQnFubE1JeWFNVCg2dU16Z203IUE/SmIwMHNsaGc7PzluOGxJNVRXIUxiM199YXoyam85eDxFaUtKJmN5JFd+KEt8KD9AIVU3bUlrCitoZTdyPzJ0aX54Q2N0bnpBcjZobk0lTD9zbEZiQlk3dXQ+aDRCSlBqSXF2ZDB1S084Tm1nRVhiI1koWCoyPEhkNTZ0ajYoej1CdmVnbUpUCitBS2w9PFh3YVB5TU9YTzlhJm1JaFlsPzFmYVcoZilgQUoxfHJeP1pnd0soSFRxMzZiYnchUnNCejBSN1AoUGY+SDl+PXE8XkR3RERiZndpCis0NVdgRnF1MHB1QlhyaT9QcTVGOCRYLWxGOzgzZFhTPWdDPHtPamxgKnpVZWRCeWNveTRmVWBPeGQjVD16Y1Neb1VqfEI1eXIzbkJNKjY4CitmbXYkZyo3RWI8dEV6Kz4pMlA7WUBpPHY0OFBIMnVlfEtubyllcz0/QnxFbXJVdl4oPmFGdF93bytzfXNyZ2l2OThTYDNHQzdge04mc15uCit5ZkQ+RyFDO2p2QU1Tb1JoX1I0cmhoPW84PVVuKylifj40MFUjVjZyUV5MN3A+YDFTM25LaVpybUlXckdwIUhmfT1kOU5xJEVzLUo7a2pICitHe2hvZiM0cXdyX1l7WDlKPmptQU5VJTk/MmVXbXladHBFRDk4PVhIOEVPdyh1QEdOWjBlJSY7M3R3cVV5M2JnRl5SP3xEJmFKX3RaKlpLCispaU85S1FIMDAwMDgwUH5kPU0+Jm8zNGVMU3gwSVE0dTA1YnBwMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrCitsXz5XcHBvUlZscCFeR0c9bVJhVn5JcW03UUlXOW1rUVRANldGJkt2PSpBK0h6JVBMe2AtcHZ3JFNhOSU1dWtwa3hmWkh3SHp2dGoxN21PCitfUT5yYFNseW1saGteRkBjX0hKcHZYU3cpWDkoZGM7ayZYdnBATFlBT0UqfntPUndYZVpHRDY/Mn1KRnxMVzgyPElsZU08WF5Zez1EaT0+CitLRz9xZz90YzU/PkVTT0FaKGg5S0s2IWp+emRnTCZ7X3l5cDUzZ1Vwc0RGUnx7Zn09UlVjUHd1X19WIXp7YyEqMC1TKUVIXldwOTFrM01fCit6QGF+fkxgUD0peS1vSmtRO3I/bFJ7QzBjeTUxdmA/fE5RPmwrbXxuWHhjfFElYHwkWVlaVDw3PGhzUClYUTRpan1lMCo5emZCQUkoO0AkCituTD9WRiFgOyh6X0I3ZihGdmhvOT1KekkoVSo7KighKT9ZaG8tIzZOdWRodWNUNVV2Sk5PQDd3TTl7b0RKZXp1diFFR3hfQjQmQVg/RVorCitAKDR7XklRfnxFWWVtWkdVKzJeellsMzUzbTM3XnppLW10RjE9KFpoUUIqZWZpVjc/O2hYMHBNTmRZPnhYWmlVT2ZIOHModCUoZjR7d2J7CitQeH03WUdBK0ZldFBfSWQtPndjX0hfVTE7cTd7U0V5VE8rI2hYe1pldGZGV2ZCKlJFO29HMTEoVHtJbClwUXYzeVpmaV8tflBPWXp5Sko/CisraF9OMFlveSFuQDg4QCUpb2l9fUB0ZkJWRllDamZKLW9ic15ZKHN3QHBrKXhwU31JPT88QDU/MkorU1dmbyM4ZnRqRHskenVFMnw+VUY7CitSdWxHLUg+bkJfUHU+SmdQQDFKPEwpbjVQTiNYSDdkeVpIa2p7QUNVTHJ8b3NeIz8jTkF7T30oeCFRV140WUl9SSZXNTI3bHVmTm0tWW9kCitRRXYpYUQ3LStwfDF8THU+akA5R0tsLXRGST5lZj0rQXtQRkFVcXRFfWV7bzY7K3BNVWlFKk1Jcz15fC00blVha0ZHUGtRK05oY2R4ZVRnCit+ZH0jaFo2Tyl4aGZrZkI1d0lDO3c4UF9+XyRqcEZSOGZQbUtPfCYlWFpyKTMzaFRlKXEtbT9XNjY+a0RoPTE/Mnx1IV9SO2gwJVJmSDxACit7NnhOe2N6ajl5MSlOPGlDTjVsdzg7TndpTkNFIWUqYWkyYFJlfU5pLSpeNSpWTy0xK3h4WiNgMTtsTS1IWDU4KkVZWXJlPCtMRVVYK1hjCitAWURhLTk9PzhqXkIzbl5BTmwpJnskX2psYzY7O3E/ciFfcig/aSkjUz5KIXotRm5MM194Ry1oe15mXnZUZWY9QmkjUHhOeTAra31gdU9pCisyek82Xzk/KUJzMik3fCMqPEopKDxeJCNEX1haUE9QeztNfGp3cnpqPnMoJGp7e2tNSmtgRVVPcGdVU2NEZGhxVyo/eFhjdXd6dSFfaX5zCituc0xkV1okKiFOZjQla04lMXk/QlcmeT9nUF4+LSooX14pbl98bGx6WV5vP2lYQCtJQ2w7ZSpBdj4/bXk9LTJNXkFBPmhgTiZ7bSpVeEBWCitOTSFmMmtNUi1zQWxYU0FZTFA4fSZscDxOVyFCXlpnNl50UVlFJD54SzU9eldAOX1jUjBecC00aS1+d3FgdSNJWk0zI3Z0UVJue2B3Y35TCitNVUcmJWxoZTlnTHEhZlVCbXNhQUFEMnFWZCVmIWVsZD5CM01sb2pVOzRPfiRNVTcwZXlFVzY1NU0pckgja0RpfEFBR2x1fDIqaVBrczlpCitmQk9FJW0pfnZRUmFgVE1sJXFaVz9lcDdoP1pCVkV7P25Kd0tLYmFnS21ZZEdTNkBHV19WRkxUZSloJVplfTRXXnttKERJe3tGXn5LS3xeCit9S1kjVj9lfF5leWo9QkgqM1MwQl88S0gqdHBTTkchK0MxOWJjRW9rcEJGMEBHR3cjT0s+eUw5az5Zcm9ocFk1KDRkO0toQ3k9N2tZJnVzCitwWVd1ciZHOD9Bb1VgPHsyVmRPfCgwKkFzZj9kQUckO2szUTwlK2ZeU1BaVDkrRT8wMiF4e2pPZDBrJCVsdGY1ZFMmXjQjbkJ7T3ppemo1CitCJll1KHRoZkpMaCM1eUBzQDEyayR3fnlQVno2KWkrJV5ZeTk8MVE2X0BoKUw4UmthT1ppfllTPyVFPkB9MHZ1ZTttVWdFI1daUUxuVn5zCis3ZFloclJfTF5rSlFaMEh0eDA+JlJ3aGJAVD9sXlVRY2FWPEJGNS0+YH45M0hKRG4lRj43WTZXX0YlNitrVmEoWDRWdDMjPz9vIWA4ZUJOCitqfk9qJEVoZil6WFYjRjhgcjxLYlZyU04/NEQoaiZSbSYzbldIRVhAVlhxTSRxdDx6XjVCSGlsRlB0XjVURGZzQ2lCV1VmTSRLdkxTQUE/Cit9azRBbEcmN240Qll1V0dHSm5PNCspRWtkY0dzfj5NWk9NU14oZiNXNm93Y3lfSWhLWStzPTMhPVgwMj1PKE92XmlIb2Q7e1IrRyhvVj84Cit4RzI4NnsjeUBAZC15RkJrQWM+WlkyeU95ZG15PXwtWTh1aXpqUFFQayFnVCp+R247UTEkezFOcngjYG8xfFlLZVFSPC07YioxX0Z6eihkCis9aF5VRkB8TU17UXAxM3tOYyFOIzxEI0lxcSZfdWZka2xIQD0/MUc0Pk9pentGY3pITjdsNUVYU3hQdkAqT2coLXB2Z3UrcF4mJkNQNEloCitGT288MjN1WD5yYW82NlgkTEU/KjkyPDZZa0QyfnQqXlJeK0RKQi1lWENfQzZYPCspdXQ/PXJ3ZjMwSiR6d0YjZFVWQHNYTSFRc19EbD9+Cit6THs8OT87VyQ9KyUmdzdWWTQpfk83Kz9MclpWaT5sLWRQJFpgOVd9KUB4b1kjKEBYbXQrU1M4VD1sbXhkcylNJTdze2gqNSt9PVcpJCl+CitYKjRNUjtRP3o8dVhNYnZ5RnlmMTtPYjFzSmheeTlPIS0jYCNhKVNeNFJ7UEtVbEU+N3U1YFdtc2ZWU3hmRzA2JUVISEwlNUp9Pl5NZjgpCisyNE8qelVzJHw1bChKaVc3bmQjfEQ2dFE3JWoxJEc+dHBPeDhRdEdJMEN6eHRONW9VcXx4MH1yVjJQb2Zrcj8wZ1FOV1R7JVJheSNGQ29jCitNZndkKEApVXJrd1MxODM5NFhVOG5geE1yfWFVV0FBZHUjOTYqVWFIek9oPEM+RXBWQ012Kyt6QipVZXBEOFI5a3pAOEN8ZkZ7ViZ6Vn1zCitScC1nI0tAaGNucT9EaEZZaGQwIVk2QXE2O3JTXzBfPXVHVWlpI2opPmdpWmdWJT1PXmFtclhLTFcyI09sdUhLK3VfZEZHN0xqeiEtey05CitmJFN2T3UpO2tKVShyfXljSiEqcm14WSVIa0pGZjZlX1VsPldlJmBkMHBzYjdOTUE5R0MhQjZkI2dDbkIpUiF5MjRLeyRPM0BvaTRTUlJICiskRnd2dEh2SkEkQEctNzElYiRDQ3xLUU0kTmVLZi0/dzw8ZCVFRn18N3s0dlk0K0V1JHltZXhwOF58TlMzNGRXSGRUdVc3cFI4TVZlYGVZCiskNWF+NWAzPyFnIT9FUkRmMj9Aa2dOZURsemE4K3EoeHRyPjlCalUleTArITJwMENtZHtKSiNZfjclV01ufDdrPGxCYnxUay1DLVRqKSo5Cit6cCZvYT9EPFBoZmNFaUcoPzNheHdYSDVGQmJ1V2l9Y0M2Vk9OSlgjZ3p5K1MheUN4WTxxc1hLNXpjWXBec1lgKkc5YCMqVVpHNkpLdVomCispalE4TXJ+JEFzWF5ZdkNhflllMyYkV1Bta1NNb2BxMVdqPCg+KmZqYTR0KDJ8bH1MN2B8I010fVlSJlkyODxTe1lIK2pfdzBCOChUMjJoCispa242NT9WTzEqdko2YjhRZD1odTFPY3xiRlV+VHBLYGBwMXtDPz1TMVdNbnkqT3J3eiltbCUmK35BdylodUZ5XkBBRXp+VyY/X2hnQWg4CitDNFBlajZGNkc3S2VJZ1BvVHo8dXIqLVlIT0xLPX5UYj1gcUY3dlAwKFJaIzw5MjZrLTMkTCVRM1kzQEcmcypfR2UkMDFKbG8zUHNXNjh4CitfLXI/fD5XOGAtNnEwO1deJDxgMH1DNyNDcisweXckKmE9cSR9JmE0eCROcklJbmw5KjN+QlhlQTMqaUZ5X2pId1lPPSZPLXhFODheb3lMCitOI21GZUo5SENROW5TN2BKVzVeQEo/cypHMiVaJntSZjVrU2RlQWx7SzBUNDNaPVZKYWBhMkMpO3pLcUJlR2NOZkVgJV5HOyVaZUdAeGh7Cit6MXFndTkxdnltSEc/YDxZMnRAQkNrIW84V1RTYWlZTXJaZ35UQ2g8cF85JCVyYUFhMV9VcSgjUCNafUF+OUo1TCs5bUFvRE5gOSE4RllCCitCSV4rJCU0dXElV2VyV3Nzdk5fcilYJkhiNigpPyEtSzxDSUFSMiZXSjBAUXkwYU9TIzZUQEVuKmYyfHNAZjZ6LWJuQT1UZz1LWThRTjw+CitGblA1a3h0b0xBQS1GUV9+eGxGJGBrVlh0RXJ4ViZAVVBnJUttSTM/OTxqVGFAdztLTyNXM34rc3RDJThFRl85Ni03KWByZUwrciUzVzwxCis9KlotNm1CN0RrT3BWeXArMjhTVFUtYntTa1kycjM3ZWNhcEY+ayEyaEJXWEhOJG04az5aNCo8dX1mdXBDIWgrIThoV2FCRW4yUFIlQSV+CistTE0jbVM1V3M5dyppZkolZiYtYHNoXkFocUpRamtQfChKTjBWV0EtMHJkM0FHJnUxcVR5Z3FOS2l8KC1ac3BGZ2p6VVJleGFUZTVgJn0zCisoNFBWUFBMMWU0T19VZVJGeDRKcCY3IWU7fUVoazswdkhWblM3YUJlVV56JVo0NmpSYHBgdXxvd3VRdjZGV0JNLUl7MlglPj4jdTdOb3tjCisybyopKXZleXBtISNGNWBTYGIrM0ohT2ExRE0/XlU7JmRrdHQ/amBiY2YzZ2lGbCgxTDlAeHppUSMxXnUyLW1lWEotVHFBN1d+JXV2K19RCis2ZjExKWpGSUcqQWJ6KXg/MVBCQ1Y0YjB7K0teVHhRVXQpSStpPktudG9lPGg3MnNZa1dTYyRhVmJXY0w5bFZUVU4/biRDSW90JUA8TDwrCittOClPT01iVz5SPz4hdm4mVUJPTXJhWlNYbFRYSHZQNXt0fXhWN0xTYVRCJGRnJExBdkplLUN9NHIrRUFTaTdGTSp+Km5xM1RTTEh0djx4CitZZ0N0dGhaWmREeThhKG96N2d0NH55MzIyck09Z05TWG9vTURZZkpfanN8K0FjT35jTFZxWGJGUTdDMDxLVFFXUjRBUmYzbD5jezZVUFlACitZVCQ5KVNFPCsyOTZuKWVpd3hhekQ1QzRQRlZqbXNPU35LajIkflg0aj04O0gzfWI9b3A5ZiYweS1icjR4I1JqSVJpJm1JPkFiSllqanEpCis1JmB1U0NjIVliRFZWR2cyMXVAPU1oQ31HcEIpNW42MXx3S3t0OU48S156UWpjZEd+SzVZUWtsbz88YHBheVJRO2wmdW0yOHUzQzJ4RVYzCitJcGR2VmlsdVR1LW9tPXlDWTdrUGBBUmlUQ1cjPDcpZ0dEUDMjc21wZkYtQD55Z1R9Z3dPYmtPKnRzTjZkY1YwQlhgamglRCkmZ2BfQHNOCitzcGtoI1ZSZHI0dH17aHBZWFU8MjFhQGlrQy0yUVpoSkx0VV5jKmlLY1M5cG03RSlSeDt0YUcxNVhXZiM7JVI5Q1BBSEJsXj81UGd1TGZrCitUYjs9flIlN2dxblBEWDlzSkZqWkxZdzhPRzZKREdOZ0RJUFY3UjAyZnlfI0hlX19JUCQ9VlB1QEhaQjBCLV48am4haXZVUXl2Snw7eStpCit4bU1XbytjYUM1VVUrN15DZERGJl91Knw5MiRzSl5RNHZ4WUNTZTdOYmUmZzl6ckBwNHUkQVU8Zjt2NFRsciFOelU/eVFKMjRnKSVjN1ZJCit2VVh3WThxITckVEUoP15sbWNIWVhwdXVvK2QtSEkkT3E2PCMpdjAmVHRSayZkVkVzZVExNGY4ZkklU2spclJzT21MKUJrPnZJRCUqKVpgCis8PmdCQSMxLVltWkw3VUpzdW93IUBhekZDJldQaEB8a2tvTDc3eEdnQjtzZzF7WmFOe3wxfEB2V2h0Zz5XdHhXMjErJWQ1M2xraGJnKl9mCiswLXZUbSRFKioheDdFWEM7dCEkU34hdl8yQWM9Vk1KPSlJZ21GRzM+emdEbV93bTE1KTUpRGlVfDxCQm81WEtTZm9JRnJtY3t0JH56MFM9CitgRylnekA3QWZVNFZlbmJOdnpOSCVXNVgzUHsrcklxZXgxU21qd3p+TTRlcEc2fWxMVVYxV2xfc3VOIUFPUlhWZSUyP1RAUkp0QmFqWDJhCitZez85VlRkfTNZZX5NaUUtUG9NVnJ0eXVCI25ZcjJRMVBpNChvKU0hXnF7elFSQEx1PDBPPHsxMj19MlYkbXZKNVBiOXU7ZSZ9RExAO3BVCisoTTlnTj9obTwxSTM4TGdgNkZkO2gqeGQ1bmtHWEJPcmx8RSFIbntoeEZwV0JLSlp+TStldDFHJFh9M01KMnJnfnIpUzBLR04xfDJoRjYoCisjT2R1ME5TfGxtcFlQelEmMm9JM2hCSEREVG5wR3E0UG9LY2o7TitWWWF9SDVDYWUpdjNmZH1CK0RlMTZ3dD0yX2JgJU9IQTZ0KDJWVUFtCitPLTNPT3dPIU1nVXZAblMmYWx6c0BlbjkyWXs5RUwpZXhJckVPUDFlcCFWaTBaa3JaWXZTd1hQVExFK29SPUhZJCVZWXw2WXJkNUNMbCpuCitNQmI5UEhuSU49Q1Q/MlNKTnVmTEcrZXgwdC1mKmFZN01oWW1ALWt3MztFaExveFRWaH01O15iVE80OEhXV0s3NjRXcnFyTUpjSD83bmxZCis+JDh5SWRGQXxyd3Z9QksxYT1kMzQkbnIhfTEoQkNrcXgjYmE4OWVkSUxraVVQSVRUcVF7bms2MSE3QFpMc2tUc017JlBiOTQpOW18Z3ckCis1KWhva0wlcz54MTJqTTZ5RDM0LW1rSEtRRDF6UFoxbmJpUVFfVXMwPXp2JXpOZD1zQjEzeT1JS1ohZHNTN3ZEUTBLdEswYnpLcWF5TWY9CitAViRWZHdQXlIhKTF1aVU4YFI3VW87MU4mYFdKRWJXLXJxekhhdThGVFo+M0l8Z3MofXBRY2hMMUQ0ckBxMEo1fmN6PWduenswJjlBJUcoCiszcE15OU1tLVdXVU50bD9ZQjxfPXRuUCRnK2hjKVg8R1E9Kkl7aSpIZkspazJEKnJlO0l0Q0h8JiQzWn4yUlROaG4pc1crWlZmTXJ0I1BfCis0RWFPRSFpdmdyaTxmMGNWR1Utdn1pZzZ4dDxJN3RJMXhwZ21FRShyU14wIXt4VlFNVDd2LVZRbVV1TGZvTnZ4WWJefUFMWCp9YDVqQkhVCiswfHVHNmY3Qm1feWNJd0xfVmFaNWs/SSU4VWNKR2tweloodDYoSjkkSDw3LWJKMGQxVytSSzgwYGAkelplK3EzP2woakxhY3lJeitFfD1NCitNZUkoKjh9UW9vRWtIMVdvZlBuODNiQCRzTCV4VGxzLS1FNUFXI3o3Rkd6TV5lbXc9PjRYRkUjYnEzNktJS2ErfFM5VUxOVF8oNSNyR1o9CitmdS1lcj9mbV5jQnc1PzlMRT5tNCMqdFUzTmslJjdyZERBcUpwNSF4bUJjfEc2S25rR1FWI0R5dig1SCtDZT9YaX0+bEFSemZYYDFuQzRoCit6bGo7MmlzRCZsQX1RTF44aWduRSR0anwpR04jSVd3UV9mfkBlYUxSTDBPc3A3I2V+X2YwZGlwNiM0RHViYTdNJnVIQ0VZfEowMW8pMVc8CitQN09iMjNmVFZsX1FuNTYmR1hhbD5yM1heNXNnTlJyS0E4TjN7aG45ezdoaThjfiFQKm9mSlZkVmlfJHs8WCFHUEU9ejNtSjU0dk59X09uCisxN05XRXxAV2gqYk9ZWipAQHQxUm8pV3dGSHRVT2x2WWd6SjJRfFowTzY2S2AjJGFyTipPc0lhP2ZyLTJCeVFJWCgqTzIrWiZ+ekZgSiErCis5MEMqQCl1KURHdGRPMXxVdEJzZyp5YU11KHpHZXExZlVyclNoLWIzaD8lejJedmhUO3tRRCRNMlZqZ3VJbHkhUVU+QClzTC01KSQ+YHxsCis2V15rWXk/UFEyOURLb2tfb1dQMGFDbDVSelBBS05idTIwSDk4UmwlJiZgIWV2SXVZWDVGYGY9OFgldF9UKkp6ZVpOb3I8YERKOSVGKXBiCitRbj5OcEBJd1E5dlNOZkgzPHVxMzVITCN9OHZBUyFpMHl8TXF0KUpHd0x7MkFfST99dHAlK0c9MnVabzlPRWpnVlM2KG44aEM2NXxJQjJSCit2bzVUYkd9bCowVF8/aXxxeHg7dC1UQXNWUitCOzFkQHhgO1prJCRpWXEqT2A/V1FhMz92SkYtcEBqZDRkbklYeV96Rm5ALVBRK1gjdyk7Cit8aiF0T3JsTk9FaGNjWVg9YkYyI1ZaWTd2bUJhS2ojbjczJXM3enY1bjNya0A/cGMwNVZPez4rMzk1S2dKcyNNdihzTCRiWUk4bT9PTHp5CisrQ2x1VmlEcGBtS0xsZW5ubWNWeColMzxSOD1ZWikwY1RVVGNnMVBeZ1ZaLWM5OEh3NFRhZWswbUN1OThDb2QyMjtWTSEyaCVfRHFZc0VSCiszQE9vPEMzc3Z3QEwwKXp+MzxVVkhxOyF7WXdEK1NnISs/OztkS1kySldPVW8kKmZpNmxKfWE5QnFYS18lKGFIK1E3dkxnU0JqbUt4ITJACis+O1J0JFZDTihoYFU0YHMyXkhEX3w5XyowND5xLSMkWWw0c3luMTE2P3llXm1qPUt1RkcpSWJKaWg2dF9vNkNNMDNndHEyaFpKaiQ/JS1BCit5KCQ0JD1uR3BpV2BzRGx5aHE7UnxLdjFhTChkXnM/dzRIS08yUEg3aGckRSstOFdfOUk5VGZTdn5MSkhWZn1FKlJMSVBaUTxSaGFxVXVKCitucjJQRHQlbmU4K2k0PVhkQUI0RDRobGpeTTtQMTlGc0shbnNockt5RnZ8S0NJLX4qMntWeUI7M1BvTGZXcno8IVhOOzQwQnIkR2Fzd2xCCiskXmppelhAWiV0UkthM1UkOUxQP1c1YCQwQnRKfHNOJkBoTGdaTSNFSlNuel9FfUtNOV5KUko8TyNuaHxTKXJXPjFVc09QTFpsVUI5SF99CisyaXhhb313RGAzfkFUSTA2VzRIWmJpOSFmSDdAQD07M0QzQEVTcFNuOXBgQnh+dWBwMlJJfnFXdU0hP19wbD4jdkFMLTQxeDBJeGdjODFZCisrYEZ9KFkqbGRWUTM+PDhmbXJhcjEmKk5uOz48VXIjUDFpS3BQKH4/THFMbyNxNTMwMClsNGR+WC1RKiMhYHZ3WUdsdnwlV1EzTXxSY0BBCitqRz8+e2wkdVpgcFpEdFR0PjFHYyFfMCRlekchaFV7Zyk2fEVsYU9uR2U4NFd2djFyJXArd0x0VHtnS2BaekdNSlZRWDMwenN8c2NZamlKCitrWnZBQzBJN2FIbkxSIWh+SGhOP2klYzlgTHtmOUUkJChNQmIhT0w1VkM3dmhZYlFVM15CQk5zWih+XjBNSklSb2EhOTc1Wk9sUyokRmFQCis9RklqSmg/Xn12YVliSitBMEMzdlZgSCRiREwjVFozMC0jZVF8IVh5Jj88cnN4aGI1bVRQPEtWUj58MWl1fWspTVdlRnI3a28hYGBGdGhXCitOcy1rd0s9RGAhMmdheW80bHs9PEdxQ1lMTFVFLTI5JC1iZ1pDfSUpQnBuZ0gtTnxBd1djWmdVanNTVVFZTHRKO1QoYEc/UWA/MmFjM1NGCitDWUMtTHhyeTBVZkoyI1ZYTzcwSFU9RFAxdUl0UjkjWT9aNV9RKD1RbnU1VChQVWQ8eFJqRXJ0ISpqZUtxaDEqMH0pQkc0MjteXlZ5JHlKCitpcWdVNjR6NDZ+S29BNkZXdGU4Sz11MTBgI2JIcjw2UCFONDZ9OHJ7ViF0MlY9SytmJkYkfTUwWT1sWlFHRFI1ej9ta0Z4NHZIKEEzTjJuCitTNCQ8O31pX0FNfFB+NSM7OVYweHxBeTg7QWIkZTY7UmJhZldEOSRHP3FBYyVwZSNJYyVobn0kUVMoOXQmT2JjTmlqb31uYCUzMjVSKCN4Cit4LXU8UFIqZjJXOTFGPDw1X2hSRnFYclo/eWMwcnpoV2FpTVJDVH57LXxjNmFsckR2MVk0fW50Zz5QM2JPfW5lS05IKkc9cXVEQTJ3V1dtCisje0ReXilPMGVMR3ZuI1dLLVd6MjUhaVNwM3ZSWEZOQnQ/YVhiJDVWI3FaUWsxX3pAZ0JFNmB9MmI/QyVJPy11czI+MG5mbnkyS3UrSE5ZCitiPj9kTEFYUGpIWjh3aDRAM3NQQ1gyN35QSkgjaGsmS29DNDx1T1Umbj5fRDxAanczJm9aWlRjbTYtRCMqRG1VKHUwWlN9S241XikzcjVQCittekM3fCk4Pk4oI3o5ckNRWXtoe0w7LWhrPjhIQ0ZnZGZOUVEwOHl1LUBJdl9sJiVxKlhDcDYlVWtqZWFoI20tdmYqLXJqSEU+KERxNWRQCishdko4VnE9JXY8I04kbj1xZXdGZyMmWT4+aEUtNFFjcU5EKWErVkEqI05Re3V7RE40c0ByK1FrOUhlYVRAZSZYT0dvNysjdUdBMEtiSHRtCis7NmlNSTNiVV9nJm5SUyRpOGQ0fjgjR1F3cTxJVVFpNnI4QktDR0J9NT1hd31aYGM5X2ZOVDstUD9IOytVJmYteDxUY2ZZUyhtUHxmYFBhCitUN00qcXVFWWlfTERVTGpDJjBXXm5tP2VOdmNUdVckKiNrS1FKK3diKUYqR1hIMDdIKEA5TCFYZ0F8SThzX1A2WHc1bmU3O2phbjhGZCtpCiskYG5iS183Pks4VntNcj4xY2spandaS3wpV2dKZTd1bEpyTXBoeUxVRDs8ZWVAeFE3NWk8K1dXSmtmMmIxPmFablZ7WjQwWStuMUkwV1FXCis9V3ZRJkF5fG5xKGthd3FfYl9mWSZsfitxSUhQdXFoPHNWWDFsQTx5V3RYRX5NVFpfOWZOLThsUjlqRypeV2pmOzxORnFKWWpeWUtsPmxHCitjYHNzNmBAPVdvVFR2dlolUHhROWpvS1JUSSt4RUhXKkpKeykjVGByS293KCYhI095biZebSFKSnI9ams3OSNWWGx9fGJ5fkhGR2FiMCRBCitDMkRrb0JfPl82QVJxPVBNPEVFUUg0WmchRGtMe1dQP1IjZUVWcGMmPjxOYXc1VCtkc3Zkd0NYRTtoKjIhM3p8ZjVDZmFsSkgzO3hpMzEzCittSypGWD8hb2hZKzgrPlN4eHghezhlO2U+R29VO0tgTHE8QEs1MURYRDd8MyRUNG9JWU5OanFPXk1RQ1ZVSG9BQXw0YmU4KW4wY1JTNTx8Cis4Mmd+TmdVc0VGZFN3fG1zalJNMiFRYkRSRjZMZCFSQlMqcW5BU0V0Y0hQaHFSPUVnNVp1ODgmREQyXzVwUjRHYTchd3dYNTdNNDxwR05eCis/cSREbGphJCV5NFc5eEg2PGVVMTVZUTdFUmAxWVRBUERxfHI7T2t7dUB3PHc5KkBINXhDNkVoOzdNSzxPcHRHSWBwVFg1fldKdCpQNmx6CitaeiVPYUE9WH1QUkpqZmMpTG1VZ3ZCcS0xP3VzUnskKSZDblhGM01nUzE8M2dYVVR4bHZibDJNISNWNT5vSGdvXz1lN0NTbGckNExqcW4wCitZcHtjM0RDV2doOzJDZTUzTXZaK2QqUjUmOF9rJSQraVVSQXZXQ29MJHFPZ35zYlYmVyhvSjheWClfd285IXNpJW5GYGFJRzhGcH1xelIwCis7OTE4O19BeU1Vck1HWi1DbGQmQEAwVzB5RHMjQ095P2kmRiF0fn4pbSg2Ykk3MEZrS3JIclp0UXk8MW1pIy09dyhCfWc5ZVZVdGxFaWgoCit3fCktckAkKiNtaDtzSDBsblVJelhfN09HYEhHfU5VZjJxTSQ4SWFLTzhOMXpHanl6ZiQ2XjVpJiMrOTIwTCh9bjhwSFhSe1RZfURoNG9kCisoU1l7PTlYfEQrTFN0RGdYP3lTblZtZGdVZEVzYjg/bkEwMUl3KWMrfTZiaVNYR35pZyhUaERCek9xQGM0byliKXsmXktqPm1ReyN7emFNCit1TGNwdk8tOzF3fk5LKnB7blgyejx6bkswazFZflY+PXkhYi1OVnlOJWZANFIoYzRBRlYjZyRMQ1JhRzcpaDtfcSlaKTNGdi19TEA9eiV1CitUWGloOUc3R0FWalhxM2claTVgO2tjbGVGd2I8SH54Pj5PVHI4bj9acmBzS3tQaEZNVVlGMzYhMnw2UmdpIzZlNFdscTw2dys2QWRPOThICitsc0Z7I1pmUCN1Y3ZGR1oqazx0I2k3Q1d2TTwlVEJGOXIrM0doZiYhOyZBMDliK3MoVnxWbmhHbnZZamIreFh1N3ZZfWN3P2gtLVozI1czCitsdiNuSj5mUnNCc1JoS0MmcF9yJXQyUEZiMikoO058N299NWV3KWZPbihuXz47aHdFLSRAcnpzTmR0NUdWYSM0SXN3Z1E7I2RaNE51eipyCitBWEBLMzU3YmtXKF8tayV9KmsmfUBRN2F2SkpAMCZHK1R5OV51VmZRY1VwJFdPXn5NeCEoJFpTfHslKGE+MEhpM2JfUzZTRTFLamtMRTJkCitEPC07UlAoQUFRfSFucjJufllYVzshSD5qKVpWcT9HPExuKmB8Nys5cVJQX2c9N0l9ZC1kTF9oITIrQ21JWmtMZXk1KiQwVT0/N0hzQEdOCitzNzBhcHkkJDkwRDdBO0czIS1pI3ZvfSlITW14M0h2NGs5b1h9ZUNIOUk7akVtaD5efnRGQkVrcUMmK0NPbnlUSHVyYjB4dnZSRVNKUF5jCit8VlFRVCkpcG0leE5mMEVuWml7TVI+QFhDcig9dTQ3VDlMIUhEfWklMklzPWhCV1RWQ0tvcWclSXRQe3pPO002QWlMWnF+Kk9eRjJgU1ZOCitEcjVhS1lBY0NMbVFIYj1mTnwwJExlZTAkenYqP3s7XmgzfTxucGxaZUIrdDRkJD9CRzJeV3d0YTNBTVQqUypwPHRCPXQ0YUsjV2dOZTw/CitUYCRjcz5iNFZ+ZGpEVjhLTFZzIX5JNnl2R3pxYSNrZCE2ND4pWEE+JlckQCg/Vk1VSTVoXz9UPzxUe2Bjc0dhd3c5VTtQMjM5Yk9fYXV3CitqPkdze0U7NTxZN34jTFdGczs8a15wP15JdzJ3ZWtAJUMmMmI1U1MoNTQyWGJoLXxPTXtvKiFTQTAwY05rSE5hN2AwdlUlKWBUUmwwSiR+CitKPFk8RzkxX1V7NXRTWjhlVS0kSXUkNmUmN3J3SWMjRkFJQG0/NSEtWVR5dmNZO2V9eWdNKF40UX1EOHk5c28+NSV1OWJMRm9HRGVEVVg+CitwTTdvOEczR3lET1FXazVpTTBiWndKQ3gpcz9tITRrYC03cSFRV3FRbVp5Rnw4TFd1XyViakwwYUpSfXNiRyFocEMpclJoSjwxcG1kKXNWCiteNnN1LXRiKWg8PDxAPSEhZChuTUczPEthNiMqT2owJW92bGxJJFlVPWxFMjxQdzZrSWJwU1BWKSotNnxuZXlJYlV0US1+RXh7T0hYTHNQCiszK1J5TWA3OD0kS01tT3FFZSl2em9NVXUhSVR2eFB1KG95N0I3Tj47LT9NUU4+SjN7NzZqQFl8UjEmb28lUDlhY2ZRY0hNM0tXWT5ITEVKCis3REZHUGBmTUxeVkNhVVFVY2J7MF9uMW1OfUZMOVItIyFOaT5yVng+dSFvSVQjR2EpYT0lMTA+RT9OQVV8UTx8PkZyYHNhMSlnX1h2ZG5lCitBfGZLVDZkSEU4VmIwQ2crPipGc01HOXBjQSF4WHJOPUEzaipqYjJyenkoPFgqNExxa0hpKzN4VD89cm8/K1I8Um95Jj1PMCEleD5pa2oqCishVjlhc18oVFhSej5gPiNRKChPfHdwR35ufWp3JmhBVi1GSWBhKkNlWitkWVR+WFFgVDZsXnp8Uk1obUlRRT9XI3dRS3Q9dTZ8QnVFR0V5Citwekt4QnR7WTR+KE5HPXgrP0pWdUNpdH1SOFcwLU0jM1hFODgtTmRUdHx0eytJc2Z9KHRyVVRPPFQ4XkRjIWE0VjgmdjNvPzM2TlN0fE1VCitjcVhfTkhhenghUFVVZGYzeV8yYGQ5NW9EZDk3JmxaTk5gPXpRPCMyfFpacUlYZ2ZEYXpWTnpqQ200I3FDNn51QVZ9fGQ8VSNaMUJjeEB3CitmTHFNKDk8ODZ5Z1lhfUpxWlAlXiV5a1N2NGVjSlR1T0cyNl9XU1dhOGhCaiFaa3Vlb1Yycj1LNUteNj8hcHBlK0M4fGtsJCplZUx3VTl5CitNTz9GQzM4OGNCeUdhVW9kYTlQOWpffVpfQzBDYn11P0dxR3YtT19SI3teSU5JdHBxIW4lZUZwRXt7VFo5N0E9ME1nYTlqMWNJZCtFS3R3CitZTGtEPS1sSnN6a3R2fFNyWmRjTHNkOGF9JGs0WVpOUWl1P09HYSlOUE57VGF2ZXglRz15YVBSbzxEVWpITHExUnRvTEFeO2ZlMXdfeWZSCitkNzAkSSVAKD9lWGdXc0laYllTPEdRRV41NjkrYyVlKTVIJC1RLWxQdU1xKXZCdTQ0LThtKkpFPFpsJk01dWopejRLRXk/enRna2l3O1E+Cis1Kz5TP1RWWGNeUGlQd3M9OVV7VVA/P2w8NlU0ayUwQyVucSljWGktejJ9a2Q+TXhnJj5EZ1Y5SF8pX0VMfTV0V1hLZWNGcmw5a3NIVVpRCitxMHA9c3R2R1ExdFZ4eElrTEApOUUhTzs8MFdySEs4THMyKk81QzVVRDZAQEhhK203RTsya1gwdD5kPFgtejAxJDRDZUB2M1QtKHdaVG5JCis1KHdCaWhpNyhgQnkwZGdQKE1BaXc/TWxtMVZ+YnhtZkRDNXl7V0ZYYnVGNz4kKjduSFB7TENPQ2VlPnxiWG1oREc8byg8ZyNndVB2KFhMCis0PnVtSn5saSE7dmdfSWZmV0RNVl8hITtRLWdeNyZOPEhuJG53RX12SVJ9UCQ+dXdLXzNrY1JBPlBsKzAhWjdMX0M5RiFXNzNCTm9RPFBqCis2SHVpZilgRDRie3puUSN5VUNfNGJhPGx2dGpCQzhwOT0taDNtJExifjYwQXQocSNFQzJkUjtwcWcoTXNkTWBsaHN6WDZVZSVebXNPPXlMCitsP301PHFRdTBTVjhHN31Pb3VFPFk2ZSQkYkhPaGgqd2ghNzxoUzhHbVdQcGsjbT5aZ1pYZ1d4cVhZelorJHQ9b1lXI1NxSCtHIVhpI1pHCis+RCtLbnl1YiZ1PXBNX3A9V1B4PylqSnxWY31mP2xGS05pKF5FJkRMZ0d0NzdrelFWZlV5Tlk0ejtVSHVYJkorUDxSPnVrIy1GMEFiS0YrCitOWGFlND1qRj9XPSohYnl3JkpBYCliIUQjdz16NkRUcWZfUlAqZnB7JWItcGlSNHpwPiErQlpEdXdFZWZPfDxSbFc4MFJWNG43XiteWjx2CiskZ3d3WkhtMEtlTDtlUT5PUE5le3dMXyg5TEchVXdMJT8wXy1fOG08JEpFRjB+Yy1CdjwrJVEhLVkza3xWbCoqVUlTRFNTXy0qVmFOMFAoCitNVzJSUCNwKDMtR1M/dHk0bl47MEBAdy07KnJoVD9JbytTdkgrPV9UNXs5Iz04NHRtYFZ8cmEpMDFqSXFldiYwe0pPPTx2e0xualFeSCYoCit1PFV3YmhoUnJEOzF5Nl52YjIyIXVvRnVQNDdqd1l3ZSo+UXU2PXJnQUVlUU89M2Y3PHp4QkcxK1dNK2tGWW9kSmR0S2ZFRW03alAhKX5JCitfemJgMG15QUhBUWE2NVFxKUN5T3haI1hzbTw2R2xfKHxYTWopelchWVpYeFlvMCtoOX15XkZmSH5HZ3lkc3smJTM8blRKPDRPVjFUPHslCitYYUhZUzgoaSk1TTJLdGNicj5GQkBZYXE/PU9SQkhEb1UrcWFjRkJqJVI+KlVWVVpNJWdUJUYmZUpNTzYqVT9ZTCYjfFY+bjdvPX07ZlpuCitMbTZNdzRgPmxnWHh9b35xMH5WZmZtMFc0YE1GP0w+TnYtKEFOfTUqTSk7djVzbTEoZzg9ciVtSEpad1VWOEhMdztGX0FhYyE3PVRYKGh8Cis1PmFFXyEtP18/dG1aQTc9dDJJbDJ5MUckemlLc1daMGpYZz13P0tlYDAwKGA5JkBNO2RjQFIoKnJqRFY7NlpwI0p4SFRWX2xyU05LI2NNCitNQnZgfmhxVSQxc3tJSiNVO0tKOHhaKSFPSEI0aCooM355bXROJV4tcSRnUDE0R2ZMbW43c2FNRUxeZzZRMk5pZEtzIyRjM0pnNkRwTH4yCit+fCQmNTthdUgxMmExKnhtYD45S3MoI0pXI0kxTUdeaGU+WHJZO35DIzdue0owMXZXUkYmZz4zP3FPJDNGNl5XSlBkJmx2czx9PXZTTUJHCitWMl9Pbk5QOUthWUhrbkdNemxgalNaN3IhNnhCY0I8aHd1ezdoUkloJWcqRDlDdzdwJUxxcjltTyRqZnJWTG9QRkBGOUc2PWVUc1k4UU5WCisjJnYkZCROPTx1SEl3VDNjeTBePzBWTlE1eiVUdC1CSCtoYG01bD9fd0RxLVREe2p3Y3N3Xz16QVI2dXlgMVh+WHN1JkhMKkQ3Rl8qUEJVCitpUm1FJWNEVipJWTRMK1ctWiVzZCpqNHgtOHgodkd9anNhUihAajsyNmJmfTBjOERoMDlnelYyLUQ1KVhGU1RVeF5ONHxMNT1tOXo+VzNBCitHXzV6bUUzUD1UUXI5bUg9VGMlfkhLQHFLPXk2eD05O201fF5oPGpfcmYoXl4zUmZYdTtuO2AxRyYkUGR+bDs/JX5afXdyfW9WS21MdDc8Cit7cjVlWkZfazA/KjhlWCtyPUtBeFJ+dyFyVDFuMUBaLX1EazhrZzlOaHFKN14wNUZFbndaT2BuTUk4ISZ4VnJNZ0RYfX02ZD8lSCVITzg3CitEWFRvflZXViM0ZnJqTElIfH47OVN7WH07aEhpVjI3UDIhTz1QQ0QycjBgUCk0Ti0xQHNTXn5GP0JefDZpJURwano/a3MjNGUyQVA/R2gkCis1Q35CdEVEaDR4MV9LQituZHtJS1RDUzFZbjkhPWteeT57alUycFFgPSR5a0ZiP0J3fVE+Zm1SLTs5S2FeU0pJeTdPT3hVLU5QbzlyPVl2CitFdGBgUmMhJSlYV1BPcDUkS254NEQmQnJ0RDtmLUBCQVBPZWdAITJ+SEtYd3V4MCoyNSVjMSZKe0BKZHlPP2w0UEckdll9cDw4WWp7NEM1Cis2WGV0VT1RK1hiS0VBQzF+PkFRdHFEPW9FKzFiYDF+WFpyckpWaWtBU0k0QE5Ce29XLU9nM14xeT5CbXhaTEstb2M9XnBuVz19UHtfanh1CithekZEZy1aKU1KWWkxKSQ7NXloMip7PkBLbj05UkduOFNgK0okYnIxI21oei14amJCMzltSVZoYXAzTl5XLWBRI31mYj9wYCNPTl5Sej5aCis2JWxFdHgwM2BkcSlCJmhmK0d8Qm5XI31HTTtlMFE3Tyh+eD5lVl4yMCZvYVcoX3tATjVqbU9zKDFDKmpWM0s8I1U0YVJ9Mz9UTC1ZUSVJCit0d0pISD1reEJxS3QybjhkQ3opY3ZKcTc/ZCkwNTx8Mm0hTkBtdTc+fmlrQEFQMFZkM1BRMSh1Ky09dVVJSG91UyFDdllUSDEqeitVbERTCitQblo2ZEVyMVl4MGk0MitUI15hQm5uVXxJdzJKWnpZZGNvVzQ7Sy1NSnNybH1JaTB4dndQMH48SCNkIXxSYnlfMVhmUSohbj55OGV4MCs1Cit2Pz5uKDFtQEVaP2NYUXttOSUyIXEqb0VRVyhoKyY9PGM5S15NNz0rS2pxaj0/cWIzNDgpM0ZWajtZVTFKMFhRKWlfVzd5TU1mQTVCPW9OCituYXtHMjIwZVFLKDBMMzZNfFBVRlV8dVkod28kUEw0Jjk0YTRLfjVKKjw3UiU7eCs2dykwK2E8ZDxNcy1tZnRIeTV5ZllBJDk+c2swcnVwCishfnRzP3R8MWxucGEyXlhgKUxvRDVfalNfJHFvKkNyaWchJTB6MlJla31nYnducjtjXiYwVGNJbCtsZF9sWnc+TW0+eT9fbDFAazl0eDBoCitleHkmOTxObkhVPk4jUTFPWGhKVX5oJjl1JXd+Z0NmX0Z5YWdJJFdFJG1odklaRGVMYCY5NUA5SjB8WH4jbEcxZ1crYkRoflg8P2NYU2xwCishV09tdik2aldKfHFUPFopUGdKSEtvMGl6NTNqbWNEYjtlfXkzSiR5XlRhN3xTJm8rRGZGb1NueHBnVzdybVRQSmhNdXBiVXcyI1N1dC16CitSU3pERFEmfmB5X3YtZS1OYi0jMnA7dlBTY0pUMF4waGFKM0JkdG0/I3UwSUItNFE7Z0xBej9ISzVfQ0l3aW94WF8kISN8fXdtcDdPa21ZCitjMj9qPGRTbXQkSkE8dHojTmxIJUVxTTRsYjFseno3K3EyIzA/TiQocktKZikpU21QTDhGT09CdntoaEIja0U0SikwQGhzeypHUGZoPG1nCis/XzZ0dEA/akRsSG4lJTVeYS13JUxDVTZiMHpIIyVZUWoldG1eYWhqNX01PnZGbTUpP1NebXJgOT9ZQTNObHdvYUhhN3VKbmReYUk0fGJICitwODl8QWQzUlk+UiZ5e0JgNkJqOVMjWDl6X1l2TilfLVJmfTQxaz5TfmRpb3olKkt6MUFhWnE9bikqWTkzZDZ9QlojLXtZLT4xNzVhUk92CitpQUkjcVFlUD43V2B1fUVDJXZOejNzcWtXITZSRXEwNzF5ekVWYTtyJl9vdUs1VD55dDwoM2ZyOGhgZ3ltQjU/VXFNYERvdG12MVpHVnc0CitMVWMqdkYlOGxoNDZCPX5vWHN0WkJ2O1JZQTRRVCMqdFYjbHhuN3xINGppYXVKemVpRHI3bG4kelN9ISFOdDYpaSNBNmdqKHZMMl9LZkVpCitOS04qdFVveylpTz8hcGlAQ2hCeCM8e2tIejw7JTVjcDFuVzVKRmw5cUJ3QSYyRW5xaWBSUD8xOUclVTtYRylOQj92UXpETXNIIyRVZSohCitSMTFUeVZ0QlpaWUBBJGdsUEkycDVfJTR1T0s9SjEzTGBlcHFUZkN0KEcjaytNKDdzfHA4I3gxcnZrfUohcDQzUkk2NXhwJGxCeE5MMVFTCis8QEoob2Y+RSlhQjJyNCpXNlZ6VWJGbEhrND9xV14hakZWekZmZiVWZnMkNCVeQnJkfipLfSEmOHlsKSN+SHRJOSFYTktfbDUtTm1LIU4yCispdGhfVkQ+T3N+SzJZS1dDPTJuaWV4UEg1fjJtdldtejs+KmlMXyZ5aHNqJFlFKzN0RiQhRSp1cVVHKjR9PzBZbTRkRzd5QGRZdT19ODJ1Cit3Ull2Q24pP3BEXzQ/JXQkIzcmenFffTVUXiNZRX09cHVPX2JTdTYkYitpKWZ5KDcpTEFjRCNOSnpSdCM+bnZaZiF2YjRJRk47ZF9nR2VlCitrWm0reWYyM1YyY0J9OF4rS3opM3hHe2BlPlBkVU14eXVLMmFoNCNKNWpKLWRMMzZYVFE5cTlyVHtsUWVJcF5yVFROcyUqLV53M2dHVUVFCitSPkZ6cDtlbFFVN3lSPWcmdyNfSUpJblBoPEFqaXMleCstVGxEUD07NU9DNitLPVUwKz0zIXBLcmlQV1BnZEhjPUNZclIwSFk2bklsMCtiCitzb1A8ZDN4UzFrMyZ9eShpM0hfTzlUb1lPKWs+KHt0JHdiUFpiZnQ2TWw5T2hlUEdCQV5SYnFrdzk1MEBfNDJuRXx4N1pAKytONHFJWEtOCitIVEUoa3U7eUZYJEBOK3R5PzU4Tnp3IX1pa1o9ejZ9SjxpYDVZeS1OXlpPcnk8Wlhrej14JVcyS2k0YVh+M3lXaEd4OX0lOFZKcS0we2FFCit+RX4jP0ZtKCZ7YXZ9SHpjcClGaW5We1ZEMkh4Zn0/WGBRTHVYUW5FaGRfNWEkX2g2Pnx+PVh7I3FxbGJBbHhiX2JDcWZzYFNBaTJnSXZZCitMcVpVekQ9WWs2RndtVHJiJk40cnBWIVBGSWkyX0tjdX14PFNAQ0w9KXFpXmU7QTBwNV42UHd3K1RvTFh0Ym0+T1FRZGpnVzBfYFFMKlVvCit7Kj1TJDIxWWZ2NHI0aSkkYGlAbk9ebHNENzZocHhIRjMxe1ZRbylDRGJaPktke00yVD14Y2FBbm9XMiYtOHRmNkpQVEJ0MWROPTVOJkZWCitURjshckI/IShpWFh0PTV4Ql5xJHtjQEZDdj9NdTtLdSFVWVROWUZhVyE5OyYzbml3N3B2TzdPKXtqZ0ROTilrZSsjJjVJUkU2cTVya2tZCitoLXk8bCh3OVN8cz0hYjhPcEJCbiFoSzhiYE9KdUk1Z3Y7cGFzaEBXVEV6NzkzbmpGbEN6SztFVGBObkJRfmNLSHlQQkBFcU1nQHxCQGdmCitXQypea2MqSCZLd2lTb3JpenhVVTNXdFg2K0hGUFktbn5JKW97bllTR0Ukd18oNFJQV2QyN0MyVVpGJkN7azY3bzwpfm5iZlAlVkB7N01sCitQcSZzeip0eGojbkRwS0U9eVAoYzxaREJsbEEwaCk0KXVLQ1VQWXBjWEVaQF5vfSVtPnMrQExZQ0NJSkRJUzQqPjlPUzE/aGh5R2o8TzNZCitRKDtRZSFJNkwodU8xJHNxKVl8aEI4UWw7K1A2ZjM4SGYwYXQ+PCkxUW9UPGtpZlFkbGB6K3xHT3F2TTs+U1o/VDBaO1heXmkmSDBAbGE7CitOS3Z0M3AzbVJ7WDt2ZmNqaFc8dCg7enw8fF8xfDNONkcwdWVJK1RjWi0/RllRQH5yajZoZlU/dzVxJGs1PHM9MUpuJHA8aSt9I2gkKU80CitiVmVKKFF4Jjt2VzE8aDlIdD1xOD9jbWpaNVp0ciFNPXZ6e2ZhdH0yR3kme3BgTzVNayk5clUlUnRZMzhKNUcrQ3Z2THFnI208aDVqJVc3Cis7SU9uNHFCfllMK2wwci1Xa0JiantGQVBrY0wxNTF2QmF5d3tKSTNgakBeX3xwSWQ+ODh8VE5XWlAqc1pvaUB5ZyFQSHAyejAzeXZiN29LCitycnVrdTxydUZNa1gwXyR1Z3dfcjA3VTxBQDBfOD9DT2RmLWNKUXtTa0o8TT82SVcoMVU2QTlPdWF7ZGpeb0VOTWh1anFvWVNEbW5Ucll6CisoaG9vWT1+cm87NUtIO0QhK1BJa19jNEFRIUlVa2QxM0lTSF5LZHc3Tm12ZH5OfjBeZlIxKlAzPjw4aUJpM0RxVThxd3AyN0xWZll6T0xgCisyUFlBayQ+bUxlNChyfEFhPk1NREF5MyklZjx6cGJwaD5ZZVVmTVktZzIye2xhUzBwR2Z5LUNgZWQ4Wmp2KUhDR1JFcngqfEdgMHNWPXQyCitBbGFLP211JiRKWnhzc21zRWBsRT48an0oZXsoV2FhLVhLNXlFWTxOIXMxOzdhN2lFMzEhciZvPU5meDh+ZFRmRXJAMnBrWnFXcnhOZ0RICit+ZyFtaTY0RSUzK291cSRSY0ZeYXdTb3pvYmh0Y1IzVCRfTXpVfCtqSm4pRjNVRz5wJS1ScVgtaih8T2FtdFM3RUVMfTQ2U0hHPzUzaUZHCispfCZrJjx1Z1pAT1RuWSpOYT88NU1KXnU7X3JnTCg4KztLZlkpT2tALT5CZDF7N3pLUmklPWVve3tnQ05sTTgqIyZvRXcySzJabyNLVExACitsQTJBaW4jNEg4WipySStPcCRhJklsamYyRyV4P1IoODMmS3VZb216d3E/VGRPYlpqfXBQKX5lXnV+Z043dD44fFlxX1pDVlI+UjJqO0VLCitsODJDeFFXRlI9MnhtKHRJTDZ3bHpYWCZoI21NbnR8RHJmZDhOI1E5ZS1sWVFEQn5tPD4tJFp+fEVxLU1NTSlmfFNQfHtFK1o3d3NXQVJWCit9Vjt9P1NQck5qPSNCe35BcDN7PCRgckghWC0oQllrTyN1elpseH4yX2lLcE1yfTZCPyU7RDZ9R3xPZ1MwP2VfRGk0ej54UTZzem1fQWFrCithdXNkMCN4eVQkaUVfa0shcXFMd149ajBZUmY4NH5idFExVnd1QylJaFY2aH5wLU8hZ1JKQ2F+NitHdWk0b31xU0d9Ymt4N2pLaylXJUNrCitlMWQjI0wtd0whbHRWfjs8QlNiQVBXUW4keClafGw5dG5oLXZxJDRufkh7WkxoSXpeb2hQPk8hYGNFdjtLTWVrI2Y8VytRIyEtaTkpPGAjCitYKz48JCN9ZlVBYEh3RHZtcCp3YHV9UGR3elhgQkpOUHJGdmBhSUpzTHs0RmJXajRDPWtlbz1iJG1yVE1lRy1mWD00eUgoWlo1PjNGPUIhCitVeD8kcWRFMU00S0Y9TlY8VytCe0BGZVltczNPPj1aMjk/Zzc5PEUqWjZSNit+KlNpRzxqV3IyKztMaWV5PTRDK3Fia0Y/dDNNU007bCkkCis/IWNoWW5KOXZRUipAX01XO1h3IVROTkYrZ3V4ZEthUmJmeSVMXj00OVZZa0F0OXV2KFBtd3RoTkhYODFDVTdibXgtIUleU3U7d319anNxCis1SH1OaGZ+TkRObVNeTnkoVnBpeEopMU5kMyh0TGBGSjtsaGw7Wl4zIXZ7R0pCbDB0WC1CYUwpNVlPJHwpQE9SM1UqekgpYWo3Xk5GNW5hCisqakc8eSNOQ1IydTAhP0RjI3AobVlVKHJKRnxUXk9GWm80OzFISj4qeHpgPV4xMVU8KllJan1hfGpYQ0hrfFJALUlMZ1lxbHdgWWd6RHNxCisheTlZN3c1bHRgXno1QHk1YnlFMEF2Tl4tVWxLc2x2SjFGLTVlaDQ/RkdeRiYpUDswJENGY1NBIX12ak5TZ1MmUiZUays3cTZQbGxMX09YCit9Yj1jcV9HTT5oSzk1dXZkelIlcXZ5ZmxBSDNKeSkzTmQ2OWhaPl4hVSlKZT1ZbHUoMTdDSzFZIURLaUhCOFp0UGlaNCNBTCgwJCU+Pn18CisjOz19QCFqc2BRcXR2eFZ9THJ9eno2ZkdeN2cmXlZnQWt5a3NFYzl2QUtWdiFSQ2VORWRmJFdXM0JGVEFPTVMwK2gpM09KMXJzSUpxaWsjCit7bz1iTDlBM3MrWGooSG03SGQmLUh0UFI0OTlTMF9jU2grUCZiQTt0dGhBPyQmaUFCbnZsZVV9fEZ8aF9uWHJEemArNzVYOUVXKmBAKXk0Cit8dXZjPDtndzU9UGomb1l3STM5NyZSS3ROZlJuQHkjekVRXn11YiZEKUBVYD0kdDM0TFY2N3s7PTZJSWA7cUp4NSh2REZscFBIRGIlMilgCityQWU4QXpMRnpAIShVXjgmckZWT1B4QGtjZDc3KWE2JmZEYyMjKWJWaWBSfUA9KDdFRDhzUndnbXRvIXZlPCtpdm9pTDxKXmc+Vn14bE9yCis5aU1oaitOJTBfb1A4a2U3UHBEI0NQeDZsUEd4Yk5hSVFUUGNxLSNaWjlYbXRjR2swNXRuMXNDczBrZ3BlJEUtOWVWUWtuMnBHPTg8O21WCis8JT5sKnhWKzZlfTBRVig9WEFsVlpKPWdEWnw0cGpnZis8bC1mMTw9RTRoZEt3cl93RnxselB1QX1GflVCOVRGPzRlWX1TYzMtUTs3e0ZJCitCUkZzcmdVdHorYWJTc0IpTWRYKHdsNEhtNFNlaVBIKDVeZUp3R3dIWVdLMTNvbHtNck81VFlWQlNIPEdwTnpKJjdpMzdjcl41R1c7OWpICis1bjB4amo+M2Y4THp5UykxQ2BhIzVNLUM+KTRJRl8jYSpVNyFubFNkaT15UUY1WFBteVZseV4/fF9YPG5BIVhpUip0WXU0YEJgfHkzPUE/CitjY2lQdUdKRXkpWU8kZGFPY09ze3BeKHt+I3R1UVg0TFBzR0FqKjJaNEhWO35JKklUV0p5VlEqMVVNYGh3VGQ+d1otR2VaVm1kNXh4QFdrCisqQVAmY1lCVEV8SGFvVmdoJnw0Kmd2RiVBKjNNYmY8WDxtVDU4YGhockBEWFpaSDwwbmJEYlV1QmgoST11V1Vqe1k5dExDayF5QUs3U0lKCisqaVZwal9lKTBMQXg/JmNKbDFRWkgkJUcrP2AoUj1adWl6TjQ5T0k8LWtYbH53ZSRSNlB6RnY0azklVEB8YWp7Izdia1h2KTg8KUV5Vzx7CitYUFozT2hkUlVNUUdqZFo5dTIraWo+OCF4ZCg1cj8wWC1fSjhyMiEpM1N9RTg3VFk0fVRYS1hGe2prNnVlTnZXUT1CIWp2Ym9iU0sqQCNQCismeHMxQ1JGajFTeTthayRjcH4oYGN8eGN1P20hby1tRk9GSmdMZjNiYSZZbzM0Y0Ezdi1PfHtqfWM3cj9VI2ZrbXZEdmhUKlU0UGtfK1VfCisyQFYqJHtTLXdLbkFnSVFZYDw3fStCbXFwI0xyS181KVlHYCRgIzVBeW4wWnklQHQzP2cxYWYlQClKKyp6UktvLUJUdEU1UnN7JUxvM2dHCisjISVvWik2anJwUHZ5MUw1JUJkKilJJmEmYzB0PEpHKDwrSW1YQVZpfTNuO1FeTFA4YShYLT5+VGZlMntpI1QyVmFhaj1IdXdJc2NkcmdCCis7SFRFOGREeUZAOCghKH5ZZUE+M3pwUGw9X25oSz1aayFlXiFPR35gZSsrR0FtSFgrfT51OX0tRlZhezNGWW9SbzsxbnErT1QxR1dYRCt9CityN1MoWEEmeWM8TCRSO2IoeVhBIXcpZUhYNypWYTk/UlgwUSlyVUNOVGE4ayo+ZEBOJDY9MFdhJlVpRUtDUStxZWVMT1J6X3AxS1RJT1g/CithVzA0c0JXIT95YH0pbE1yWjBOUEZjJlBPK3FDIz9WKlJmSlBaZzxJQzBPZylVK0pvX1VyX2tyKXgxPzl8PER9OVpvc1NGZnd1fFcjVjtWCityUzc7bSR7JCtITFglPUF4N3ZvQmpweUJIIysrN3AhJT43dzBuJWBuQyhtKyQ3PXcyVHRrRWIlVzVEMXlOVHUyUjVAfEBQNDFaNldPPCZeCiteLU5AVkFaU2tyMztuOWU3QHsrVyZFdmgtbytGdTUxYC1ZQkgxTSp7OTdJPXBQNzE+dFgwcVYtZTR0IzYzVG1aLX5paT9tSV9KbWQ2Y0BZCitnXlJFMjx5Vz8hJkxKM01wPFFsWkp5K2k5QTA1cXl9T2dERDAkWFByZUpuN2Q3MiZzUFhTTDlDSihiRkt8PXNtTH5xSSNobEd0RHdBNkRsCis4bGwhTktTK1gwJkNvej55XmhsMXRtP3ItP0BSRD5xRE5yKz0xYzszZl55ZkZoWHdfUitMaz15QCUjbCpoYlFQcy1tdFg4Jnw1e3Z4eDdTCitCTmtNcjB+aHpHODBCe2JneGwhLSFMVis7K1dGI05FWl53ZlImPCFneDVoVkE3JX4zd3RBZ1c5OUhDMUd9ZTU5UGBrYnUwaWRFR0AoZD90CitycE9eUUh3eGRwZ3QwXl5EMzMmLWtZMSRnOWlDZGV7VTk/ZiRHaiR1JmRLSDBsUGhrNmYqOVYkYVNeJGdzNig8eTwxcEx8Y19CTWQhZWw1CitkdDNMYjBiRklIPzJHZTZqUGtOdGZHZiZnfEJ8MmkkZDRhQHxjdUc8USV2flBCZ2FANHtBbjF6WSlUfkkxUGokbVdlOUhXM2BPSDQ1OSRqCitMWj8mWSsyRnk7bFA1dnVLVU9lQT1yIz9ISGdiTkd2QnRnKjw0VUEtZ3pIfnNacTYyJCk2VFY4T31fMCFPYGBLLWktbms2aS0oa09gNVIpCitefmgqT15edDJ5fi1EbmgtUztlTzJQaXNpPVZKV0R1aEJHT0hkSU5UZ0JKa20tQz5nV0N2R2UyTGc+MHgzaEBBREE0Y3U0bXo5eVZpY309Cit+JEo7JH1ETVFQTjJJQiM3dz9+TSNjMHVmcnh5eEgxVmhUMzg3a29uOEYmSnpFTSkoR2VYQFRCKEcqJDVUcSQ3T3RsZXhJOGcmSnBoT2pxCis8MDlscCN4SHJ5WD5lZFUwVUtmNGVlc1VvbUtMcmR4ZWl+cjZ4KCs5Z0dWYkxHVFc8UipYTk43PUR2RDA3I1phMDV7X2N4e045WlQlOSZvCis/cSU0UkwmYWklIUI0QzRldWdzRzVUeCp6S0l6eDtocD9jSE1APlpqUEhgKihaXj4/VTlPWDJRYTM2cU90TkczVVokfFZmRmhjcjZZVlBoCis0WVBFTEMrY0M1NCRRWGc/QTVlWkszYWU/PXB7dVozZStYRiRjR2R2UEVCYHdfcmVUWl8kPTlxMG9jeC1Sd0J3RWh5PHVQKG96IShMfnUhCitOSiM1LUs/MFlteWlvWkh3VjtEQndPOFpBeTZ7VEE1R35ReWIkPEw/fV5ZUmktQWY2cE9pWnV6cnsmUilPMzdRajk/NmN6MDQjekpAJnp2CitoZl5pQmdPPFErcHcwRG9lUFY1VGJWM0RZRWFmTE9TQ2NfbXQ7SH05SUFlbXRXbXVJQnNoP2VNQzBrNTNue1d6dCR+fjxpTWs8S3UoVWdECis+dUV5NUUwbTZlQzt8Vm9aa05LOEc1MSRBTz5AUVcmMUdzUSFgV2k2QiU1PEI5fEk9SlViWD4tP0ZmSGk4K082PXBaO2I7eUFgMkJnZnpECitvSjdPbzJfJmlrfGBlRTV9eGRIQjU/YmN6X05mQmpBbzRiUDtfN2FvWVdANlpmRWw+fjc4Kj0xZXVfeHB0Nk9xVDxyRzxCd1JDSUBwdkZhCitXJG58Myp0d3A3cWEzXlFsWmU0QkBqM1NlZGA9b2J8bHRPK2x0NXMxTWNqVUskRT5TY3hjNysoMFk3VXt2OC03al5PUjExNWQ0MHhuREo/Cis3KlEwNyl5K2lxdClyRDJSZnlvOTVEezNVJmYyVHVOaHRvMFAwNDdsYX54JD5sOD5OTn10Rnp5cmY+eThnYlI2dTU1PGdwX0lkb0dNKiRVCitTPSFaWFk8fVJVJGM9ejlraEVzMT5pRHxDRX4rNDYofF9weWIlWkc0VmglcE13fH1yUk9IYE8+RVNMU0lYa0JjYyQlS1YqI1R1UT5aTEQ+CiswYDxSfE5FYkJOK3I+JHdfTCMoRlR3WlQre2g+P2BZdTlPZWptYEEqTT5yYnghdklENz89ZVVaTl9ZeCQqY0M3akM/eX5gQTJMaHAldW85CitKMj5oMFZSfT5jYzAtP2szTVpJQ3ViWUgoezBYS0ZwP1pEWHM8X0tIQDhxeSk1aSVsfjJSMjlMWTtATTVJeyg4JHgkS2hte2AkajwtQ0l+CitycVgqLW58OXpqMz9HKXtsUm0wM2VfTGhZUVQ0YTN8JEBzUCNeZT17eV5wWUNWPGNIUUloZnFzaSFlczxhOVZEJEZfVVNjMXNJVFJXWVRlCitIaWhAPDh1OGxYKkxnOGd7XyNaK2hZRDZzdzhRNmhZYjYtKDZCaEx4ZHBXZ351TUlgTkhFPl9LM3RxRyNCRGhMJDVpMjlFcU91RiNTJFYlCitLPWpZblBVOGZDNzE5PXF2OT4qM21IITIofE0+YVErSTNKQSMyYlpvbHhKP2hRTSR+b3VmeWMrPDc5WGJxZVZgM0NaKE5pRS0jPUU4NTZJCisoSF51VSNwQElrKzl8UmpGZzxDKmZ+WXQzekA7I1RwODQhdlU2Y3c7NH1iWiR3KmA1MGktR1hRYjtKMk9jdUwtY098anxre25UbCEwMGtRCisxeFBHblQ7cVpxbm1BPFNGY0hJYHNyVT1Gdm9JPCFNbVgoaDRNeTw8Vj8/aik8Vj1ibXA4fVBgQTJaMXgyWVc+cXlCQXJhOSVtUmY2a25ICisyKV9AV2g0RnZXdWNNdT94dkRieEcpTkRre3xhdUh6c3VvfnQwJjwlNGpQXnF6ZCg4dWMhNiM0K1VqZ2dZTnIrOSReVHopO30+YilCV044CitNRmokaFZxdE5GcX5JSUlSaVVKYS1VPl9MaUleUGZ2c2FpNHJRI1JxZigla2BkXjZNMT9eNURVc0ZKKitRVm1ua31VYUtBR3lpME4kUDU4CisqcCtkTWJ2SGVwWi1vdzNxfHYqUGJJdl9nZSRVfHVCSmFAeHMoYG48JXhXRiR4MUM4Rjh7I3IpT34+fnNFRFJsTk1LNHFiMSVJcjR6NEJECitwdVJVN3QlQHtmVkNMeE9SNCM5OyN1XlN2Yns+bjdCSE5vcntqSExFRVRIN0Ree15Ce0c7LUgzT0lMV3tROGZLcUJ5X2wlZ2Z2cFZJdnNlCitNREdwTjs8ITh5RDtqYn42eVFQN3JzeXNNaGF5VDRfbWg5aj48d1U/UlE7OHcpVkVlP0UhZG0mNDZmQ1gjXns3OHMqeGxkc0o5Sn19bF5QCit6Q0t6eFlAJnJtSUBhJT8+czxZd2pKOEp8bnxYblRHfEgjbFgpV3VZRiV0OCEwZT4zK2xgV1B+QTd6LX1xU280dF9fRUwlYHk4Ryl+YGQtCis2aHVtPHopOyNyVWZSU3c2MihUTklyKUJ6aXBCODxpRXxFOHl7ZGtrYn1CZT5DTT9JRWcyUjRrYWhuRS1HbmQ1fm9LOTJ9bXJkb0BrcXxICitzUDFJK1h2Z1h1VjRLOHtyT01abzUlbG5hckBzO085S1FIMDAwMDgwUH5kPU08MkRAXzhKMkswRmVkJjA1dCNyMEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2lNWGtsXz5XcHBvUlZscCFeR0hgTmxWcjZuSmFDd3pmTz5mJmM1V1Z8WDRDOyNteFl7X3kwXjFGCitHa1FGO00pP2JpcDZnZTVSR19yfE9xKE0+JSlMKn1rdyhNKmdjZEBJSkdATjtTQDZCa3MtUmxueE1+ezteTygpNHtve2VaWVRfa19lRkxKCit3YEYwSi1WM29DYjAzcV5AM241M2kxe0Uka0Mkay1qX2goKD1xPk9ATn5rQD4qU3RqdktlblVlZSE0Q0skKnlJZFI/cHtsQzIlIVFYbUpBCitCJU12QndWcCk2Jj5lSmh2PTc3cW80VGkwYGl3SGVla1pUKCRTcU9LeGNKYFNUeHV4U0FlT3RRNGdvKkhPeGo/SzJsQUM1aDRBJTVDazk/CitZV3lqNWgwb2hgPDwzaj9YMFptQll+a09aKW47MHowc3xIU2ZrfEQzZmx5aU8zT15ubD5QPDg/eGBefjx3QkY/TGI/Kz9qUE45TUB0ZCl6Cit1U19BIUNXTEJUS3UlIW8qO2VsQztwMlF3USs4bFZrRjQyMyY5ZEdxbldLMHJiSm1WWUk2OCF3K3JLKEI0bihxKzIjcFFra003PFJPUHEoCitocFY+TUA9cT8oWlopKnx6V0d3WkI1QiQ7MUxueW9mPjRwQCNWYjdKSlEmJjhBbTBGUDBOOENOayN8c2RsXmFYUTdUYytBXlMqdHp9a1cxCitldHRGTWRvaXNKYmJlVCZtSHAwQSRua3FmSkZpVXl2TFdPWXl5ej5zQnlfNj9XPVVeWXNWdWMoTkpsaiZzajZ6R3A5dE5BRilYdUw9JXJlCismUDJDZHFtbHI/Z3pCJVNBU2RoJSlCMCRIQzJPRT8rekAwYStQWFMrRXlVeG1Ob1Y4dGxNTzZ8QCk2ajdIfXlGO2dWKWxOXzQ9KWtTNlc/CitrRUB+dWE0ZjZFSisqUnJ4ejxSSigkMER7UlBUdmh4LWAmSm5HWiQxMClJa1U3LWdWJUV6KDxeakh+VmAhcURwaHR5ZSYrU3xMcTtQJkktCispOXJ3MG9nd244aGVxPjx8Rn1sRm9sYT5ATU56ZlFfcmZ+JTJXeiZfanxQVXtYalVzUGhtR2UxcnkyWEBAd0JiTWV2eHxUSmNnfGpgQ2UqCisxbW5GeE9FUyRfdkMrOEJ0VG1+O3BiekFUX3khJGtgZC0lc21qRSZTZFlALVc1PWM+MnEqPSZaNXI4PUVsM0ZxNDJpREI8TGFWIWslM2sqCitqfG5+bFdVKj0lfV9Sb1RZRmJHPE5ubnx7ZC1VKHUjJl8wSChhNzNzWTxZflIoczZhNTRCZkI2P2pkT3R4fUVKJTt3TWNSKTJydFJpTmk7Cis5MWlYeFowUih9JlgpQTNBPm5QKWg+QDZhV0FLMm10ZXk3RHdaZnR0TSp7MDAxdkUwMDE9cjAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiCithTzlvVlBrN3lYSnZDUVZgeVA9V015PE9Ya310QFdwezlMWig/T35FXnY5aFRXeGRPI3U1SW1VdlpUYGhANnRGPGtXNUkpWGgrYFdPRXxRCis4Y0Q5bDw5YWtsOzdGcHYzeGZraHYla0wyPyVufGhsNSpeSHJrWTcyMGU1QCp6UiZJPCZ6fGw3UUsjb2BDUmdmbWEmfkBvZCMrOXwtPHwhCitVbz49P3I7Ri1FeDh1aE1CN0Q9dkNieW1iaUMwMCN+fDBIUnUpJSFlb0deTkZ4WHNKdFVEaXhjYEx7KDkkMnVudT9wMjgkZ3NzemhrbkA1Cit1dERec2RzdUJ0dHh2QSs0YVUyZ0Q/UEt5anJ1Wnl4dWlybEtHR2BjZGVuciljQ0VAZlJCUCtNKDRkMERDNlN6a1JySzdJaWJkelgqWUk4CitEX0p0K25kTFNXYFpsU1F0TW1AflRXYEhOQCVKeyEzPFVzPj1zO291ckYwJDwkRC16P0deQmItayZVTWVmOWZnM0BHRz5UKk42bndRMlhUCitnPEM5ODJkP1dpZHNjRlNFWSMpRTk0PH1yRjAodXNWSzJPRTg9OW5wK3xLZExtYzl8R0clN0glSENZUFNDX191UX14RT1yaTMpdF4oOyp5CitZYCNuKWxVdCotUlYjWENtI3dCUWg+PV56aGBLMDFVWHgwSFFZT0tCSS04NyVDK2hqPSNHbUZVNGlzJEsoLXJYIzxFPzA4QTUzcGwzVHU+CitwPVYtNEFUMWpKLTxWPCE2LVF5UCFnckk5VWxiUlYtVFFqZkkwVnJVdGBZXmVCYHxrYW44ZWVAPkFJM0t+PEV5KW1LVmRDMmprbUMkUClmCisyQG50KDgqRHNeNk16JkhwQCZ1YEEmViNvTSZheWh5Q05aZW1jP3lrO25aYEgtUzgjUHdmPEQwdzUrNTV9IWprPG4rYk4lbDJkPDJnKCM7CitjZj14bGhUQmlzdkFpNzBASkhVTUh5KShMY2h4NzdWN2JUSXhwd0dlLXQ3NS1Xe31TWiUoYGhHfiY2U1lCKnQ3NWJBKDx8OzMkZm0pWGRkCis8V2pRVl9pXmI/S148ZU4yN3N5YWVfclVlQEoxMVRXcjViPHsqOE03RFlLd3ItaUwoPjIhPn0kSW5rcmopeH5kOUdAdWx7dVdRM2BjZGFzCit1Zkgqc0pVY2o7bXFuJlZFPm88XlZnfjc5SnFuPlNKaUltNEg5enpWNSR6USRZVypUfVJhOEBXcUl1MHBDZG43ZyU0fGlSQitKJk5VZm1hCitFZUJlRk45VGdZRz0wfUxNc0glMEVacGIjcEIyV0dVUmx8JChNWGVXeDk3WCRWMjl2NXVNSU5seCh4akFKOTQjX0ZYJm9OeFA1UmMlTzAlCitaJEhLfCk+NEBoOzVnX0dFNXlTM2NzT34odF9PTDV7QTZULXpiJTtpPkRXeGdQa0QyOE1ePClwKk8/WXJUUktmZF9lQFcoQEJxPDx6Qih6CisqQmFkWSRCUHY5YG1MPVB6RStnM0RyJk00YzVhZiNHRVRpWjg9Vk41ZHVtTylHeD5kMjExI0Z3M1V9VCM1KUR3bWclTCRvbW5ldXA5SWFKCis+KFR7Q2RyYD5zdWY3MzMyWTZvTWs8MXljM0RTOyt+JE41Uyt5PlpWQ0hrfCR9M1ZsbmFTNHBIPW9ZZzAxNXthITcoRWgobmJpK2xpYXx9CithbSolZzFyNDQ4RG40WiliYH0mXyQ2dE90OXYqLUIrWFpEPVRWeklNaUgocU5iODstVVYxX0RUPkdqJG12LXhHQnMtYXooRDRCRHAkQkIqCisqIzdTZ1h5NVJWdWp8dSo7JU9peVNMUlUyZWg0eXlYMFclUlg2YVImTEhCP1JgbFRFVEQpbiFNdlJ1UDxPSW1oVCRpJlRhNVlKfnVrcSY3Cit3c0JNUVcmTFJLcCZQQExmX15UaVIhaSU9Y300RldoYVdwM2dEYSNATylzajA+XmVuR30tVTRjb0loTHBuPHdQVVFRKEspITBnNWhHMW5RCitTNWZDIztyd1d+JWxxbDdUZzRISSlDVCg7Q19VV3FTWW91WVJBP0R5YTM2SldBYEImWTNlTGFqKkk8akVSZDNae1RLTFJncHA2c0A2dG81CismNCp4NClXdGtnMHojQWwmbmJjTndweX05WkhOSVpvTl8mcV9pVFY2I1h4cGR5dlgtUjd+bm1Cek5Gb2RRPUt0TE0+MzVZZFMobnRKQkhyCitpQ2FPVT15WHhRQitHMlg1O1IrX0Z9NkpoLWJlME8+YjBlVSV4Tl8+Ykc4S0lEQV9HNlJvMHwpaXFwS3xFaGlWe3F6Wi0rekM+LU5xWCkxCitSISt2QTk4N1lpNz4/QTApa2xjdWtzNiE3XzxRQG51YWJvK0ZZOXpaZyZZKnFzcXtMcStVVTxKa1NQYClDQ3d4fCkqMl5MX140Y0BpeWFxCis3fXVZS0V1Pk5sTU1EeGFWfFQxUDlleHg9NEQyRkZgQEg1IWVTc2lHcndOTjMwRlI2N1lgcHo9RFNHUXIlUD1MXkRYcUdQRTJRU3tgemZiCis4N3BTZntwN2htWCNTWCE5T312Q3wmOUgydEtuP1lofXZhfUcjSDVndjJvNiVJaTJHViYyOz0jaV9DOytKLVhxTWdoVktCTCgzKWB9OEBVCis4UT5DWHp8Z154P3B1SUFRe01DKm96ekFyMnxrI1ZwQFV5aCZ0eXRBb00rSWIqWW5uY1JgS2NJSFB0X0MmaUxadiUoNmR1I2hOYXBvUDJ1CitUaiNFbXMzXklDK2whSnJscjtxfDFoMjV4SldeJUBwQSNmOTApdz0zS3gjd1dXITU4Sz4qZCVvNTIhKDZYRkpEZmZ1ZmVGZGQyejZzYURVCis1TSp5TSNQWjAxUmR1MFpoQ3tKdnI5JihnOVQ4VHVEU3tZPHUzYkpsQTQhNi1uPE5jeilxNTRxSjl+QDF7KyQxNj1hJXRQeikkMylfaUFFCitCfmA0I2o8P2NwQld2I0x1ZCtxZlEoZ3o2SGdiM3U1TmZQMGYxSDdQPjZtdldGV049IWAjdHttIzY0bmFzc2kwJmFuc2VLI0M0MGo8QFVYCisrPG0yU0VoLVV9LSZSM3E+KHp3RHJzKG9EU0xgP1JoWW84fWFJeVE9dGIzbDFzVGQmSiU3KHgzTGVNS3pYMkQjREY2Pmh+bWgqZVluQF83CitjUGpEUlokVjtXMSlqeDVMMSp9Um8jVSFiekJIZCQyR3dsWSVPd3QxTTJidV5uYDlgJjR0TFNVcn5XdSh4Vm9nISleZGtOQ0QxfDImPEo4Cis1Rmt9cy1pO347VkF6NHpaMkN+SmskUFA+NEgwPXFBWmFKU0QtTEBLYjBgb15tNjJ4WiQlN0tJUnBVJENrUml0QmI4MHVwbmdFK35AKTMmCitvV2c7RnkkZShKYV5mYzwzTkE+aXFBcSNDJXJpZmI8MFdeRGkrRyZSekhneF9lJiF8VXNjPnRqbkVtOzx2NGA3Qmc8Mz1RaTROeWlDc0Y4CitXe1UrYVdYMVVhN31CPD0/VEFjWWZlLTtfblk2NiZ0bD9fPFN6K2ghTjBCb3U2PGJuJTlWTGB0UF9KIXFsfkNYPHthaFh+UyY7ZTktS2tUCitrXzJmbSlJQ3ZgTENoclUzfXVDP2l3X0p3dFBXdGspcDdwJiZQOTtZRk5JVG9ZfkY2UTRmIU49UE45RWFFeiV1MF9+R3NhISlWanJxM0pDCis4Zn1uekVtYXlIMUo+cT9UVihHYTxRXlZEfGdkTkR1UX19YV4qYEA4I0dNYDh2cXVxaHZWQ2AkKXBwVDtabk9vTEcmMFdDckNAVXBYKUxWCitVVVA9ZEhefG9yS1hPcFFEcz5iZCRFYTlRb1RXeXtqaHYob3cjXzk7OEk1aDtjY2x1RkQlNjU+NWpnZFYrNyp8MUt4bTFgNzh5TCp5XjhPCiszVElXNnoyZSk/fnomOU5fRlFlTV5BO35HdFAzZG4+U3JGVjdaTmQoTVB+LV43PUxEb2dISDkwMFpFdkZfSnp6eERPYld2TUl6VG1zRWhHCitUQjFQUz55Y2R4VExOZ1pyPCZ+VGVQcHs2MmImMVUqUkx8eTVtOTJScnUhNX5BaDd8TTAoP2tYWEsqcWxxVFlERzNwVX1wMEx6ZCVPeGU+CitLaE0qaDQoMz48bFg7IXhIJlVuTSU4TEY+YDhtaXRkQ1VSZDtrREsyPmtGXz4+dGQhazgzRmklQlI3NlVyRTJ6JjViUyl7Nnp6M2RmaHZGCisqMnkhPF96SGBWdTlSU1VrRFFXWil6VG0hXlctZ29xcjhIVnkpOV5ZYmZLVVB8dFYqWEMkPnMxRFlCT1JkKzwhPX57MG57czlldXNFPGQtCiskSytOcF8qYFRHOWpHUFpBI1Y7JFFublNfd3hjRz5WJHhWNGFDMkokU3FxMlUwdDxNU1Qpbk9NbTlgRVVANXNwaD9JJX08Un1AOUU/fnVhCitmIV9yTXEtLU99bzI5fnJEVTxAXyEoS0hONGw2K1g5V2FVKjtpKWVzdGZmb0UrRVReLWFRb1YhJG5vJCNaPDwzTjZEaGE8M3EtaUFWaCUoCitwX2oqZkUzbCtLYEh4TC13S2Jha3JAWD9uLSgxNHBBTk54dC1peS0tVlI9JStIU3ZkfkNeNVM2UjZHIUspUmVxYT9ARHljekFpJlBOdXBtCitzdHxmV29VVlAtbHpaMUJES0pXTmJsS1NSKH1WcVhWdm1MNSUtTndYWnY0QXNvaGpoYWZ6LW18VHI3P3wmSXpzOHtPdmlfciZIP3syMnlsCitiS3NHSilnPmgqZV98RzdgTm89e2dwaEpgejhMI3tNYXFJSzl8M0xAR0phLUtmNDhZd19gTWl7T0U7VzZGbUQxTmpVYF4kan5wantecWdpCityYUg0N0YtMClWO2ZiJjRKUShyN0l4fllwJXQ/TkxFSm56XnEqMTBWUXU+YzszM29+SmpFfDwrTTB6Xjh4KSV3fi1pfmtYVXIlb0QjI2QoCit+Kz41V1hFYmpCYUAoUjRoa1RETnBYK00rR2NkeVNjTDtqR31QN1YoS0lrfGxnPUhIJjUta2c4OXpaeV5KUnA/Jl9tKyMoOCZVVGt7b2J1Citxe0FXRCg1SSNKaV9STDFfeDFBXk1JblhDSklYcjtRcD9APy1XJipgVkxlJC12bkVhRyV9cEUpKFVlREYkTEEqKmslNXY2fSsyX25IJXo1CitZU05uTE9CSCVUYz1eTTw1cDYoWUlfbT08JiZnYXtsaFI3QkJJekRlU0FMVTJ3VCNSaWJoaHdSTCFINU55d2BAczR2KmM1MEFRalFtWnJTCitHZnVXc15STHZ4UV9AKnFmQWQ2YXROcXQ+ODBVMU50VGU4eUN6Xn1mTnZScXlOcEYkJEZ7SjFAKyk8dWo8KCtmb09SIWBffH4pcWppI0xJCit5dUgqNnEzNVZJNG9xezs5KTluM3ZZYGVaSXJ2b243KzhKUmlyYXFFKzU4KDA2akU7NE82KSE3MioqdG5vR0l6UXh4REh7ZVhfLTtDaWYwCitobFZrbV8kZWpNeT4re3k7UHk3VkFeSyp4enl2VSNBTzU5S0l2YndXNlBDVkFyWUVjdzExPExSdU9uYjMoO0FAQH0oS0kpcGIoRVREU3laCitNdlFhdXsrcWxON0k1cmlOfHIyI3NzdlJGfVJvTEJ6KG4rX0k7OH5TM3FSNHlDYj5fTTZ0QDY4dUw7aW1pYHg1bHAxeF55JURtUjYpJjVaCitzRXk9UTYkMyU0bHxXdTteeU1FKTttbSlEb2cmN09vcGBuaTcwc2pTdHBOR2RTOCh3VEJiZWhHWF5ASj9Iclooemx6dDs5VUdFVXFHMHBNCislZVJJb2VyOEF4KUtlOGIrM3M9Wml2VURfTV9gIWJ1Pl4lPSVzWUZJXnNpKnJ1N1ZJPHs9RDIwKFImcVh2NzlHMyt8cHM1JEBgIUo+IzBNCitQe0I4RmE8TH03RH5QSGtIOFopSEN6Wjwtd3ZgIVpiKD5jSmstQXpORz8zUCVsPytgKUt1bjt1Jj1IQGI2IUJ8S0h7K3paKFFnRzxpKTk5Cis/MXVmMCo5QWdhKjI/QSRzT3paK2lwVnNxRSV5YUBtPE0pa0MxUkp7KUdJVldOZ0c3VlBtIyNOem8xdGRaKHRKJGQrVlpENXFKVWJ7OH5NCismPyVpcmNqbiN6MlJUdlc2ZEVsdT1iOyF2V0t6OFpfYSg/PHkkbVdZSENDKnkhekFATHQ4PW5mOUBvb05fdF98YTZtViY3NWg0M2tvdyNBCitOITtaQTRAMUV+eVVjRHZkUHU5SSkxeEMkS2tDZT5AM0lBa1pnTiRNZiUhYVd8P2FkNnpHakhUP2lneWZZKyVBUWBCcyQ+M21oSzUmdTROCitwe2VzPFVTfiY3O2o+KG8ybEFuZiRrdDJMKzQqMiF5b0V3PjdNJSs+Tng3dWNlZ24kcW4/RT42ZXVuZDMqdDw+KktiUyt0OTI9VGxMPjwlCitnKUBRYyoxSXc/NV5XIy1ARWdfdVVNO0k5ZVUzVHI5PyYjdXR1b3VSekpwO1R5WmA/cjQ7Km5UTFM2VUBgbHN+VmFiVVR0aWxTUGU4bWl5CisycXpjNWhKKUtETF9xQEQ9d1Nfb3dwfDExLUJeZGFVQ3d3dmhoWkRScG1CWk9JSkFma3U8Z048WSV0S2Q1KjEwbkdyN2xiMklPV2ImeXFeCitaJUcqYVA2P28+Xj5pe0tqUiZfeVJiYTVqYGd3PStpR3VBJXxlNTcxMHE2YDhLd2VhZjclMEdvejdwfSE3aU5lNUUqTitZKzZJNFlDdGpoCiszMj5TXklRanpAc3Y5JV44MVdSY19wOGtIam1VS1VudH1PMWNAVFB0KTxXRDt3LUxhey1KQzA5M2VlMStBKUF1aVUzaVpOYC0mYEQ+YzMqCitAMzF4KE5UamV2SnFLPUtBMGctRUVyOENjXiZ1QHtrWW1Fcj9rdmE7UjA0PWhEMH5fR15AUmJUSkRRSC1Tb0ohd2Q9X2FRTyZNRlpAVFA0CitHSjV4bDBldHNXVi05TEVgMnk3Z3c0c01sfEU/YDNIeHV2ZF5lWEdMMzRlSXY3JiQ3M1BZa1BLKnpgO15sWGI5RjR1JSFPdUVlfEQ2WkN4CitBVlA1eUhAbDE5UXpONm1YJiEmKU91a1dHMGVpfVoxTmp4eHJwRmEmeFVXT3N7YDRnMTtRcjxtRD9XXjdBQTc4MUh5KnRzJXdhajskZm9+CitWIWA5MS0qWXZrdW9VIWtMWmhrIysleWQkNFV0PVo+P1NIdlNaQkIlUHM3eCgjSHVlWVpgV3pYeUxDb0BtKyo/WmEtYyUkbDNzRTd+dXBVCit8JD8+PF47WnVlbjk1Xn1VcTdPS2JaJkBfXyQrWXV6ZXZhdURScDMrJCg5Y2tEbWJMPzF4a2A4cXNDOE41Y1dOfDhpJnZZaDByZlM2PTEpCitkTDJJUTskPkhMNjZVRz9UNFdhUE56aWMyQiFCa00lfHYrSlgyRlk5cmtHYXJNcTw4c1dtP2J5V0hlJD89KD9uWDtTVW4yVio5dXN5dldNCis5OEh5am4jREExSiE+XytLWjF1fXZ0KEZkOGlOMExySmZpJXpUOChJX0tmZkxsS3VOREhUKWpCeU14MmZRNnwyZT9JXjI0VyMhd3FjRWxRCit0RWVVMXRNTTxra2VrKz5uP0hsNTcqPT9fOGRpfWxlR1RiLVErMWM2O1JucnsmNTRBZiR7WE0jRjI+eEFFe1M2ZXF1SHs8fXpQI1g+ejx7CitCdGA9VGtCLThqITNzNyFCV2JZcGRkSihqKj4/XyRZVlokfHEpZ0dSLV9nUyVlcXZnKXx+MWk4PXUqTVpFaT17cUwqIylgZnBFQlh9T3g9CishaU9QV1NBLW5mZUJHY1hFVil2N097X1dCNE9leD5KNFJ8RSs+USVKPXVpXkw9LTI0OUlERE1AM0tqO3w+Z3o2N2pFNGlAbTJqYShEQXk/CitLfFlSe2p8LU97ez5KPjB8WFFSMDAwTzheT1k3eW0jPi0qekUlSkwpM15XdEZhUTdtYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGCitZaGg8KWIxITNQVlJCPztiVDRYWWI3cGQ3YVZ+SXFtQXpmQkNBWEVQZDRHT0kwS3h6XkR5YG85VDhyI0xIejJGellTczcpbDhsRD9yalZBCis3JTg1IzRzeG5pcSo4S1k2XkRzMFhweGkqV0U8JDxzLWVmU3lteTJ0Pz5tfW8oa04pPDUqRHBXJiRJcEx6e3JkQXlLbHw7TXBJeUtGXzN1Cis5WXpwd3dyWiRFbmE9PSRvPCYpNHRYejUxNnxaKGhFPks3SVNtXlkhWmVeXyNjPCYjVHczVSsleFpgfGdKfnVmQmZ5O3FBTlk+KHtUSS0rCitae2Ytb04/eT44R05mempeaUgpaF91RCZ3cUote3IzQ2tjaH1vKnVNZEJ0JmkodH1LN1Ytc15+Pip7fDl7b0tkaSY9NntgMX1VWntQWEh1CitLND0+K2pyO2x1aXJodHtQNnRFXmB7QExAanU/YDx2WiY3ez5PYypLWXpHPl9VWF5CdmV3Kkh7TFA8I2UwfW96XzROaDZlU2R4TntRbWpmCitVIUsxP1B4OSY4SHlfQDtgcUt+bEZATl57PWxeK3NhJFVjOWBSLXFALUBraE9GWWpKYGNtM2twRSZPbk9jemdaKyN9OXZnYHtzV0ItQnF0Cisme3BzRHljUiRpPS1AYmMoelRVdDZfUVN2TGhXLThaPEoldnV1VjIyby1hVVd3Pml3eUhjZl5QNTwocUgqKTd5OHV7Qzk3XmRHK20mZUR1CitTY1p9I0tSPkpRS0Z6SSo+dUFPN1FTfDhWe0tgVGNJYF5eZWJRcDVOYEtgVFktbmRqMENfVUhJM3B6SjdsNXtgcT9Pe2AjS0otdjlacEpACitxUlpeNXh4LT5zTjFnXzRlLUhVKGNgaF91VHQwJitwI3ZQcDxsTGBSUShWalc0Yn0pPDFqc2YlZm13e0dOaDgtO010OWRjODtFLUFeU3l7CisrbkkhKkMra3ZkaUJPP3xHZkt0fDZeQ1VBTjFjaHRnYiZqVXE4SG17YFFDMEZMbis0eDdVQ0Z7SHk9PXlGWXcmZWUmQnNVak99KkZUVktYCit3X3BBN0BBcSRhUHcjS3tfPz88d2VmUnhfOzVYTlBzJl9CbmVFNHhVZHteK0ImJVhIZHp3SHZBe1BPYyhmQnd9VVk1bEswfExWNyZlZmowCit9dEtXVGJlUkJRJmxQfHZke0w/QERgamFvTi1+WnVALX5hQiomcHk3Y0ZRMT0oPlM4K2NaKn10aipUdnVORCErVFhkLTl2LTQ9LVE2ZXQjCitiUWs5JkNFPypfajk9S0F4P3pkWXxAe2AmZFZNJTQ5a1BtJTlgezY4QVEqS2duYWlfZzFAe0l4Xj57KEFOOF8yJXR8N3VVYlBkJHFCJShmCisxIWxjaH5hUUBxTXZEfE1rWiZ1MkpAblVjVUwpKkx3KVEre0ooTz5mMnJRdVVAfT5gfGljeyVlVWA4QFlDT1h2ZGNiZERVVjsyXzkpbCZoCitjRVhofEV2RzUmd2wkNHxDPmhUcW8tWiptb0ZLdHtaIXcrZDs4dD5APXB3OGVmKHpRYCt0Nzh6NV9ebVpvYzBiYFRGJF8rZGpQQiYkbGhXCis1NCk1MV53PUh2LVM8Qkx3aHp4PXxNfF9eKktoeWpOQmpKclVWaWBiJWAtI3Q/KWwkLWN6Kk5zI3swYFp6MjJDOGBUZkRoP3hSMXctNEZaCithRmFHS0NGUmttZEtZYVImZkJPOX5TM2hicC10VmI9QGNIKUxvXzhQOS1jc2p2e28pdEBeP0gxcWBCOzVfUjdkPnUoSHZQR2A9ZTNuUGFtCit4c1pCWCEwYCVmUmA/bm53Z2B1eXBtKW15UllwTVVkPUc1VHFLRiEjUC0oNjBhVFEpU25HeF8oeEVhc1RvMntkdVYkNTNKYzJgIVJNV3s+CitRUiFfSyNATkU/OEhMemwte0p2O0V6U1UrZlFtWnBDR3R5TU9pTF91Smg1dF4yPiYmLXM0PSozYlhwaT5JZ0VZNSlBeUFBa1Mocj1SQCNwCithMD9XRlRlV1leSSFocXRJdlA7K2tnSnpsbHtNNFcmOEwrY1lYVGptKyRFN2ptM1phLTgrcEo8OFp3PUhHSn5SVXdgKGBVdy1+U0tIRFhGCitpKXFEX2BSZVVvT1o9RFhYSFZERkExfTdDRW5NUW9SYzc2biFEYTMqPktaUjxzayMzKCRCVjFZQH1sdXNaOyQ/Pkp6fkQtQHJXMCMjQ1h3CiswKihJPnRDNyQqbDw7QVk3ek5vb04/cUI3TFFkV0NXWW1GRDxrcTx0YmAhLW8jKVYxUDhzZVJ2Ty08SG83S2lPQFhWfUI3KlBROSVAbF5UCitgcmJfMWlWe25PcEh3dWhMeipXSUBFKm1xcylNYWMpdlp+SiQoJlJ6TkhUcVkwRngkS3JhYGR4M0lQeTNKaHFDRURVX0dLNV5wSykxU0krCit5K1F5KWBib3FRfnlFVnNUbzI8eEhNb0tWY3BBJXtjVyZmMiFxU0FNRjshekh5ME4/ezBxTSh6eSZTX0RGSj5GWk84cHVlRlFxNGpxcEA0CitzRyQ2WWQ/dGYmZDFhSypyNW9Yb2ArbkktTDw9P09RJUROYj9tWE1WOzhUcD9sMFA3S1hha3cqPi1kS2V4dz59KlY2S0M/fjE0NUN2YHV8CitldklJZnZ8flNNLT1OcSgtUXhqOT5ZaSNlYiVLSiQ/fDgxc2I0e0xXQD8wfmx4MEZoSVpJUW9YYlFoMWRAM2spcz0lVkRKPGY3IUZNOzBYCisoQ0g4PUJhNlB5YkY3P3p+PWhPYjlAayFAMHhDRUV2R1B6S2FaWStoODh6YkYlT1FCZXlTZk47PFNqa2d3QDRNYllAan4lUkBrO1J4PVk2Cis0TXJEVVpmYTBaM0BMV3hSPU11fHA9TWhTMzN5fEtyd0cpZ3V+SGNCPjFIY0I+MWMxbV9pYzFte2MpaFc+XyhKOWQ+MGdNWHBxfjQ1T0AxCitXJE08UX1MIVdFM0ExOX4yKUg5fjIpSDl+MitsRmVueGpWYDd6e01EJGJkK1QrSHwtV04mK0M0LVZkJClzZGJHQVJrQjN6I2tgM2lsV2Q9CiszNmtNPWtDTVpqfFhTPEZgc3I5ZngrRiVHSXdKTklOUX0pNSUqIz9sO21GNjAmTE5+YUljTk1MZjtoZHhXezc4RGVpQip3TGZqKDRgI01kCisjfCYmPj9lNSl4VUF1d1QrQ3hfUmdERChMU0V1bXFmO3xqTztZUTBCcFk0SSlMd0BrRTMrI0c+ZE5ENzNMdX4oUT9LIWFUJl8hcWdgMzIrCitga2lVUDtnPWc0Xi18Slo2Y1djfHBVRkNrNSk0JSgzPzlPNXlJZldLaHRZUHIxam8kfnhiQHlQeWNJeyE/I2lefWZpJD5YI3NEYVR2Yl57CitBXj5fZzRedzEyTXcqfGpCZzFvazAhdi1XNFNsOV5aUj9xeC1OX1pNZE4rSGhgayN4QDVQbFk8NFUkRkEyb3BCbmFJbzVPN3RuMl5ec3hECisray1wNiVEfSFDZUttKD93JkMhflVeTCVIWHJrenAkcyZPTWctQ1VRMz5eIXV3K0BGYThUN3l6elVyV3hXbGZPPUIpRGpULXtmcGx3JkIqCitxJVJvZz5XR3xJQldJc2dxNUk1Snw2eXk3RzJjbD5lRmNJPHF+TD5gKExCNzR1VEEoUV5DQWxVfmZPc1Uyb2ZWYUBmPjg+PSQhPDw5KUNnCis/VUpwclpyTnt6WFNSNlFScmFOdyFNJTJtNndMaDklRTUwTl8zNlQ1P1NJO1hHX19Ka3Y2SzEyKnw0bSl1cFRvVD0rKWc2aVpNO0Zva2JnCitXPEFMPm18RktJfVktcSlYKUA/KWdyRSUkODF7WnFUUElkYFE+ZklBOyZrfWxzUiRgPHM/cUkhaGs2VUcjKSlITHxDK3F4JD5BTnkkV3clCitPdG56MFB9WWsjdmxofDAwJWB2R2FXSnUobEBgaCMmfVJjajB9cmd2TDY+ZXpqYDtwMEhEa14/cGo8SG91Ukg5Zkw+eDs/PCZtMl9IZyEqCis8c0J7VFRRPWo2Rmt2QyRZeiRBNWVTJUYoJCQ7TTVGaC0qaVc/b3I1UHYoa014N1JNNTlMPkpuUkt7X2stPmRtWiVrPE4pWSs8ZGA5eXh5CitOWCVFUW5CbCR6bkIqK1BgZiNQaSNfWGlLV3g4Yi0tIzl0MGQ4JFJ7cV9jTXApUmFWI2xtamU3MjdfWSopVCF2ezxBVVpBSCN1OUUoWl5OCitgejhBaUs0eFhDdGM7Y1FxT3ZIYHRiRzl3TVJWYzVEOSh5bFNySUVNVnI1MEZ0Y2JPcV57d05WUjk0MnklQlo3UFNzQyViX0p4dWx3NlplCitkbihZZldXSlAyd19hKDRee3o8V1J3fER5YGB3eG48Sll1eD5oMmt1YWJ1Vyg8aGg/TD0mfGJXanthbnF9cTs3YUxUKj5ffUQjdXZzWG5zCitWZSl+RWdaI0JKMXBxelFYcj9jbE9BakdlQSs2Qm13MitLYU9XdEI+MiE4TGVGPDRQKjdLPEtTJUltKDs7ZVMlNTFHRnBsOD42I0slWHU+CitlO2BoNlJ8aEE5fVZHKF9lIVVFV0RNNHg1bkxHezFTfW96RUZ8e3hjWD07ej9COEt2SClZSl9KeHV4cW1eWn1WbVFGKXpFRU9QVnhEbXVfCiskOWMtMHwjPG5EOVBlZ2FvNGNBMU5VLVlDfjI+PFh5OCYwZmBOZT5JdjlkYz9jYTYkbDdVfitGZ1hwQSk5NV4kJl9WRHBAUkEyVT0zd21+CitJKj1AWmdUV2owey1EcUlnJVdfR2x7NFE0ZW80YilZdjhoaCVMWG5SeE1UXn43ZlJ4KEhTcE5MVipgJjNKVH55eXorKGZDP1kwaik5QCtKCitSJUxYblJ4TlA5RTtpKXdzKzM/Z0ZQOzVaNDBtVExzOCZHVWBZN0l9VjtpPEo3WFItWn57UmJzR0NCYUk9USleKFBmc3FEQThXP0Z7cT1BCit0Sk1qOUJ3c088fFN6KHxXVFpuNkU2ZnI7RH5OYGpTIWxoKGpVMTB4TkxHJShWQE5DUDdjak50UFJ5IXBYbXpifS0/R2oxXiRIP1RzeWNYCitfKyRNc2o8VyZIZEI7RkU4NSVWakxRaXhpVDF5QE10ZUVuNmxsYlpCQjZfK09jUFdVJFU1THROQWdGbkw0WDliKSZJfEJNMX41UDs1WjQwCittVExzOCZKZms/Ril+eiZicW15a2xrSiYqPz9wTmw2VmRLTFA7Um1uNH0jamNBKGdTVmg0KSZnOE1TSzFlZkc7PmByZEtXZEFgKUFsWlE9Cis5X3prUDU9ZUd6MkZ2NVZQIWNHMW9+SDk0OVZtOTcqbndpTiRLVDJBbStVXyUyXyFwXj5fRDt1JHFwb21YYXxBYSg5eHE7X2t8S2J1Pi17CitwNmd5RHRfai19ckZXRy1rNT1lRisqP31hWC1vOCtoO0dxTT40aXIwMz5fOEUzZFM1NjM2Z3lEdDxFLTwhe2dWOSRDNHBvSWt7dzhQQWxaCitSciQ4Mj89Km53Z1BpWEE5K3B4QSs4Mlp7dXpxdT41fDsrSiRGKj99WjMpVkAjPk5PbUNFRjxUdWRjRmIxQ1k7fUM/NG57Zns+MHFSVGt2Cit7S25ufldQKz4wa3dpZXFTZ0ZNbWlZalY1RWJRNG57ZnshS0VKcWowYFhgenttaDI8TSE5Kl9EbDkzZ0hNNz5hK3pFeDJ9V1EmMjI4fWprCitzcSNRdH02cUszQHxkbCROKGViX04oWGlPWkZkPjFTPG9xNDl3TzVCZTxqY0xQOzwoenttaDIxQj90WGc2cHlgbG1IezZvcEdEbkZXRy1rCis2MDhpY0dCOF5NajBgWGB6e21oMjFCP3RYZmBoZCRsbUhfR2owYFhgI3U+TXt7Z1Y5JENCZSE3RCs5QU56e21oMjFCP3RYTGJTM2srelg1CitoRm9OVD5GTyZjeUJoSSlAe0VgN3kyM1EkalduaWBqNyNVej5mUk89NDF7ZkomV1BsTjlqKHdwNzcjVXo+LTB7VzRGQnhFRWZFOXdNZVc0CiteNjhESW8mZXFTZ0ZNZ3x4ZVV9UylpMFktRWtUPHFnPGp+amtUZlJ6OSUwYWdOZzU/fTtnWX5UKExjJi01akckZUZqUS08KzU7bl5AQSk2CisycWpxMjJ7d2Y/cU9sS1plIygheCYmQnoofDBSMDMkP3hgQCs0ek5Qdis1QkxQTU5qNl4lKncodl49dE9Rc0l1b0JwbDAzIWlMMCpuTTAyCit7M315LXhvQE5rcExxQk1nb2skV216d05OcjA2QUQqO3ZsZGxGekl6ekE7Y3pFQmQzMVEtYzA1P307Xlooaz9ATSZqbGw3SmY7OWw+alJOCitSc3dxeFU/amp1ZlJPK3IwWShDaDFRLWMwNUAwMDJOUHY7SjxCTnF+NUAwMzMzUEgoJG9aQTtsZilQMTUqc1ZjbUs4VChOaz8rdXszQHtSCis0Qil+fUFAekJDQTM5dTRpQ0JPPGE8aH5SeGx9cUUmeGVQQUJDQW15NGxtSF9NTSlKZ2tKN1U9NTJIJjxYbG1zaEBKeE1UPFU/am12ZntfCitGeDJ9VGwoQnA2OUJsMypta05GRSokOyhYVCZSdVpmdlNWYDxqZntfRngyfVRsKEJwNjlCMCgtYjhCUEdCe2Z7X0Z4KzU0IyV6YStzKmZ8CitVZC1pOUxaWSopeTF1VT9qbXZme19GeDJ9VGwoQnA2OUJsMyptYGFxN2h7TndBViZDQmFIIVBZNSohR3s/U0I1e3g3bU5pZFJOQio5MzZrCitwdj9OTWwkMm55WndePTJQTUh1ZnxiT2NCcDY5QmwzKm1rMnlGSSVORXZ1VDE0bjQhMnlIN3cyezRsRDl5azBGMiZqRmJCdj91OE5ySTZDCitCTUMrKDdAMSZYZntfVkU7RTQ4UmEweEVTPCYwYXdGUFVJdmZ8VXRZQ2lZfjRrcUpnNzdAMSZYZntfVkVDSyFROytaUmZKa3FKaVRAa0A0CitxenNDKSNjd1o8OVJ3bmlZSGUqezxOYGpGSU1rV31VVX1TPWsyfVVMdW5QNm1zayRMPSpRdChTQVNlYW1EZnxaRnFuUDd3JWR0V0ZDTWtXCit9VVV9Uz1rMn1VTHVuUDZtc2skTD0qUXQoU0FTYjsqXjdmTkRKQ0sjRHVXUCpfaU0mUiVFZz9vWEsyfVVMdW5QNm1zayRMPSpRdChTQVNiCis/UCZGcEIjXk5pYyV7eUR5WGtCTkwyRkZmemYmMVMxb1NPZldMUiRlajFNO2c/TFhHUXI5T0QtKE0lIU4+JDc2TzJxU0dRcjNNQmN3Qy1CCitLNj0+eEt1OFUlTmUoZFUkVmY7MHhKdXdFYlBld0JNWGN5RnRXaE4wd1c4SUVISlhiJE8wbl5qS0YqRFckPXQhI1Y9VzRXcjM5aVJ1PVhJCis3SWp9SjJ9YTBFNDRBQCFyJDZ4VTJPaj49IShVKG9XXzdJTm16MFdNdmNTcCREK3tiRj84eVFuZ2JlI2FOaWVkJiRPMG5eajRVdit6e21uCis0M3lpR2VtejBXTXZjU3AkRCt7YkY/OHlRbjN5ZHI8MF56JGFsbXNJU2o0VXYrenttbjQzeWlHZW16MFdNdmNTcCREK3tiRj48Tl9lekVCCitkM0VISlhiJE8wbl5qNFV2K3p7bW40M3lpRkpqfmpsOzB4SnV3RVU+YiRDa3U9JEZ0V2hOMHdXOElFSEpYYjJ6alNMJTR4dio0aFhSQW1mCitZakV7Z1ZBaDtnaWF4YXBfekptKkEzSUNLcE8+ajA5Mkp6RUdsMnFFTW54O2BrK0hodlUyNkxkaW5PTGRpPFdPMzZ5ZU8zNnllTzNCSy1ECitrVWw8RGtUfnY4WVBaalFnJTRMPnVyPjVseCZvMmx4Jm8ybHgmcGpsPGJ1MyteYldmUT0oSSVRPShKaV8kNmhCPEdiRVkkd0EzTSR3QTNNCiskd0EzTSR3QTNNJC0ldF9DNHYkYGlKKE1LO2BrLW9vSVE1RUxDSyhHUCU8YlBsdVN3e0M2a2cjJD5kJjFpS0lrUUF9TnVTSURTZGw7ck9uCisxUWdUdnFRZ1R2cVFnVHZxUWdUdnFRZ1UmeE1UdGQ7TVR0ZDtNVHZFZitoV2BuQl5NPlozTiZRRWF8TjdNS3hZTVhSKiojdElMO3U4N0clCispXlBDNmhkZ0RoSDwrYmBMMUA+N3NWM2xlRlNwe1ZwKiQ0fFhaSmB7P1U1VSYoLTUzdHt1bWo+WXdxfjN6bStYZU1kJUR1a3JJUWdrVmAmCis2OThpVnhEVEIwPV9+dkc4NUV0cXUwQEF+cT1DdGxeYjRnNT03U1khRldzS0J8fEtjUGN3aGUhNXNqRCNvVzB2dEd+IW1BSWkyeitjMmojCitKZXc7b2NxPXJIPGpAN0dIK156I0FxOUx0cWBoTUBBZ1lCe00xUz9TI1d2XlR2O0tLWXRCa2lZSn52ZFZ4PW9HUERFeWZVYitaakZDeGpwCitHZ01kdj4pbjF5IVFAbX0pUWczdUspcWZOWT13RHJWVTtkPz9UU1lRKTNqVDs+dW9TQCllUU1YWTk4KmJHRUo7XmB5flpHczwzMT5AfHkrCitBLUVlNmVrP01zWFVUfiVeN1R9OHx6VHhYJEZwbjJzUkQ2VUE2O3wkaWNOeWV5U2lCMCEkUDRHSTVZcSQrdGMjZXI0Qko3MTVKT1c1Z0QtCityc04tU0tscTdgRFR2TV9XPUtrTUNvTnlDNnQ9MEpnQUUtVmxnclpVS1hIS3RtSkFGTlFzMXVuRTtQbiMoezs/aiQ+PFY3VFJWUkVndnNaCisjKDd5TipmKFVmXjtYY0lxTnZ5bDYqWktgVTZ5ZzdxallaR30pRiUwVilASkVgKStnWVZuYi00ODZ6ITwtLVchWUVjfnt8ZHdreHp8R1VUCitycStUS2tnI3RzRj1hKCF0U2FUPTI4Izt5WVYpazhVIz5LV3JZVlglPCtPZFRFUyVAby1lRz83WWszcEEqYF9QN3BgbjJjcXpDcDdhPjRkCitIX289dE1QQVAqcHdYVDBoVnl1a3Rwc2U3OVBKPUNoPjhIN3FPZCQpNEN1OD9keXJwK157NjxHKUVuZSsyKVYxLVJYRHJDVnBMY3QzISFPCit7UUxwZXU8emU9U1RqUTJAQkhDJmF1SzY/cFpmPzc/RzQpaSo1TGN7ZWZpQXA9TE1qUjQwPXJlbk1pK2F2bnM5clZnS19xbnIoPj0lbEwkCitJJUtZNm08Qkp3IW9LRk8xbnVHUnEtXkleN1d4MSRib00mfnd4Q1cyMUpKYGxgYWM+bVhzKFg2SkVrQTJ1cjFAOCZgMy1+NFYxISs9RTJACiteMERtZUImZVMld0slMjlGQDg1WDJSRVNNbnpwXmtYZ2V5eDRLX3doeCMmbjl3JHlXbGslTk8yeGNYWEgpQCZwbXZhNTdBP25JVkxrWFVKCitvdj98dkVKPk1UcntEZzNBcGdGO0YxNmxDV20zOUZXYlk2SXUoKE1YaWpHMF5OUVc4bkNNY3FaMCpkcUt3a3BHZGY4TkJfWTJwb0xJK2ZPCiteKWw0fkt+bCtKSGhsI0k3Wi1WJVlHTUpgdFBuVFZjRTxyYlBSNmI/V1RiMGdNK15SWEE+VUheNXhAV315Y1YqaDBSUmZ8Q1Zodz96e3hECiteQ0pncih3Pj9Sb3MrbkF+e1V7TnhJTi0hUyZ+bE9wd1l2SzRyVDhNeCg4eTx6VzgwbHA9JXQ1P0FxMDZwX315e3hRLSNtTzZKfm1vMTc9CisjMClWa25LM3I8OFc2N05peTZ6cSRIUkM4R1pWdGY4bjIhVkBhaHhLbTFxeW9mKEgoTG1VRkskeTJBcnpMbyR+YWQtclVyPnNAZnNTd1NjCitSKFlhY0YhREV3KzMxeUMxZStRbFk7KDxXWEBnQSpvZHU+O2t6X0EtTmxtVFp1IU9NdlpaK2N4NEBUcTdiZVpSK3RYXldXQyFqRFdSPnlZCisoWjVOKnlvRlE8UlVfPTxSSkBiLSU1YVIhOVclPXpKLXslc08lenlFJV5GWnlaekxPejY3Vkxzel9fRGJQdHhTe3EhQlRyYjBWNHZLeGc9CitPQFc+LUQwQk1wY1E5YShxPWpAYGFwcUFrYFZ5MmtiPVZqK1ZifSpeO2ZmaCgtU3kmMzR1RDFPbW9VOEhhYV5lIUxxKjhSMC10ZjQ9dTN0CitJZmB6JT9eUX1UYm0qWl89ekZEWCo1O3VqXlk5O1ltO2xWcGVteTQ4MFZkWkcjMUtRKjA2IXotUXhZNFVERWY9fU9PRmF4ck1JQkJpdFFkCitzSDFAJi0yWDx0KT1NQ0ojPXh1UWNVV2NAQmtEZUp7QUEoU288TzlmcH0zQjk3RCpPPkcjd3RoSHFhcXFnenhxPUk9LVMjdEZ1TVBfSHRRCitSe0AtZ2NlTmhKQCUlZCFsNUlMQD4pVV91ZEYpPzlvdEUjfEBea0spRHRkNTspZF53X0NeMl93RGlNPW14UDVNNClnPW0zKFowRHloZDtjCit7cCh5JjxDIS05YEBFOyE0Y2NJQz0pelk9PDVxNiYzZDxBUVYxfEIqfW9SWSpSKXBgdiV4OGB6cmVSQ2FYZEJWUHdIJiFkcmM+JkJCfHpfCit5NlooPnFKe3hKcyhfPm1PMEhsbUZMRGFTWF5vfTBiUnlKaExOR1FSN08zWSFwakhAK0NednEkTkFYbSE+Jj9EZyQ0alMwaCteUXBGUzBeCit+KUpjSlZFPTk7TiVnSXlgXytTZ01vcF8yKy1gMmJSbEVRbDI7SzIqUnV1ZHdya2BLTERNbFo1bTRXTSpiPVQ9VVllNTs9dDdESX1OcHlrCisjdj9UK2NwVzN1aGNXM29hR1RYMnlzM1BnNFZoVTA+eHVQez8oWUN3NHE5Tz8yPHpvWSF+cDw9QFItNk9mekh+T2QmZkx3NSo3NTEqMksqCitpNng8QXcqdSRfTm94TlZSbWIlYXdUZFlUOVc9V0ZEUXVfRF9mZFA8YXs7cDtHSkU9SzY0TCgpc2Y4el9SaFUwPGkxUENlRWpeTDVlLXhqCitgY1k4cUkpSCYpOUAmb1FBSmFQaDcqQ1gyVDJrd1ZvfXN0MTw5bThEKUckKVdwdUluKWlDVGtgRUZGd1B0YGY9K013RD0oVlBwZ1VNRjAwCitBdk5Edkg7YytIeitPbSF3dDlSVDhyP09qP2JNNnpsfn1aNHZANjZ3O2h1JEBRNj0pTUZnPk5LLVImJEkyPk05WlNNcXdIcTYhRTBmfDlFCisoPyo4Mz1OeGdyTXAlRyN7R2ErT2xYMT9KMDMkIzw/NGkkJjIhRyZKQnZkQWViNnZmNFFScU55Sy18ZCZRWGBuKHgyXm40dGM1cEIlZFgxCit0eFlEQCp5U1ZAPV5lN3dSOHkpXkY3ZS0jMypmPDVYKl91OE9mM1NATHE0b2VRWXokTyVaMSo4dVp6UEp+QzF1UzdkNzZreGtvdU0+WG82CisweW1FbiZwPWNmYzkzZWp7O1NtPWVffTZaK3lKMHhzaylEJDJFcitAISNiVC1IbWhTfT4mLThpUSt8XmBmR0NaT3E9d2h8Vj5WZHNjTFlyCis3NSpeX0pZLStgUjxyOTI5RV5nd1k7IXlyfFBNQipCalckUk8tbipvfnw/eHh7O3xfQFloZH1mclNOS2FVdnNKRENYPmk8TiFyVnA9X3lWCit5e1BEM0ZTeT1mbTtfJV5APGNac0NrZ1l5MXNPbVFRKUp5TDNYY29RNityPyU3OzdWfGlLO05fLUZgYEolQnklPjt8dFV1d0hvbypqUmFACit5RmFabkh2aWJsZ1JgLUljdSN5VkNiUUpSTiUybk1mRFd9Un1SOGo1SkEhJmtORmImLXZkVWs7a0JwNHQoTDUwKTlge05XS1RQVFh2YmZ1Cit8eGB6NDVOZkQ7e1I9am1Ke0NyM3plbUdkPEMjMURmM1dNZG1HdHZKRTNuMjVoZko8e2d+enZ5MXVAanMwdHVfOXJ9ZzZAZmJVOU5CYVNZCis2Zi1qZ0s3PDNTZ29PWnAhNmFpdEA7TXdfbm1Ca3FScW1LYEIqMUAmJWh2U0B0VyZ5flpKOXVyYiZ0PDR5OE4qS3A0Tzl6SlFAJUhtP1orCitiXmtGRUsmeXJpOSZWViFqRkxrIV5+PjcrfE5NWSRSJGsmOEtvYkQ4NzhgdFVhUiVebE1EZDw4QUh9eEZLOVVpUGk1ZGJ1N2U8azNXSVElCiskSUJ7czsqY2dvNTBwPzB0RG0+c0xIQWwmTTJtN2AydG1YYSV2b2o+US1ZTHFBLWJ3S1NlKiR8KFJULTkqXzYzV2NgSGw8KitsRWJGVlA5CithWkVHWmQzZiktNEZqJXFmIWxjc35JOEpSQz1xc2RDQEZwR2QoMEExYkl5Z2kzZEk2YHBxYCMhKG55aV5TOHtCX2s3Xzd5QDVoMDh+djJhCisxbGNQI3Y2RmR7dDF5PjFAZUReRWB7dmNjZH40TU5yRnpfTEF6YSsjIz8+c0sxRzs2en5oPiUjeUhkS1owYXNie3xrPmpwWXFFRF9OYUs2CitFOVEqLSp3QEM+RX5KTEMxXjRTcXhifG1sUlpRZyR9S19JQGRoRHsrWSs8VU11c1dZRG44cjt6QlZvVGB7UjhvJWJ8RzdBeV8jKFJTa1J3Cis4UHZHVUFjdztYWC1gd1QzcismMFNlaXM9RT97TVJ9Mn1AMXI7KG4xIWMrPWtgPkR9Z3lEdUJMb2lleDtfPilWJGFrTUEzY2tZblImYlgoCit2fjZkQyl2bDxQRHBgOVFPS1UqOVJId0NeRVEjbjIwNHBsODMpa096d19ubD57fEtkOWJyRU5Oa2Beb15abEgqSDhyZEl6QX15bXBubUJLCislLWdnQzt5dD49RntnUSRmPkIxeyg1MSh9RFJDWD17WngyTzNmX1pscWtvOVkxSDhDI3FLNW1NIVV6WipgXjl8aT1NVFRfbyh9TD87TnVrCiskdC1XekE3eSQ9YlhePGJzTHVkZVZ3bTUjNUZ3U3xvRFdmUTRhelFtfHZ4ZnI9KjtZelh8QmEkal5RJkpkQXBuVnppTFR7RmJeTX4zKkdDCitIUDxSSi0qcSk7Qy1Ze3JqUz5TUitWPTFveUk1Vl9QbXdzeiRtKzJTK2tVKGh2Rm5KU15DMD8+S3gzRjUqTDF1MlRvJGx2NUtEMyp4O1R2CitRKlhzY2wyPGFMYm5QSm9HRGkzJEI2P2Z5NE88R3VoWElFWS0tVTxjODN4SDcoOHVOM1hidFhJPkx+XzwjK2ojTVF6P2ptKzFJQT13MiZZCiteJFZTRFFEIzZeOXdpNlFOMCZgbUd1PCEpVnlRa2xzS0N4dlZ8K1Z9Uy1iOWZnRSt0YChRJDR1Yy1AVSpNWEZmT29rYXRlNTdBbXR0PS1TCitRR3dhb1gjUnFkV2A+RE8jRkRaQndqcWQ1Rk8kJkB5QV5tYnFaSDdUQVJ2I3krNDJ2SiRoJCtidkxOcl9gN09zQnNyV01fNW5YWWV8SzZUCishMUlJQ0RhZ3olWDg9RlRwKlMoTjJ3d1o9e21PJjtFeyFTc15wSWVGZlM/KTdSMD4tYz5yNWxGN0hjPUEpMDE7VTsoUmY4XyQ8QUxKX1AmCitDXj4lO2chbVklTW4pKDdoSmFmKDc9dWJtTFE3aThFdEZLO3JSWTtrbE0lT2ZfKVRJIWotKGMpTCRjMUEySHdtY2wxUUYpJCl7PFRPaXF3CitZd0dPZ3h0aWp4RE1FellDWnN+UkdFM0RJcTd4TTk/cTUxenZ4fkk5bzU/amBydjx3XihCQ2loJkF8PDs+NU1SSTk8Z1YkfUdFeGYoa2I0CitWd0d4ISl6cktGa18ofHFvaFJ3eVA2ITxycTdAI2twQThxLWYrZlVZaGFaeDJmUEhEcm9mM2xoOzApYnNUfCV0TVFuO1pIQTl8VykhTSZ0CitlQ2B2MXJsSURATCk1e0BDeWI8P087LXVZdkhNLVpVTzI/akY8eW14PmlYSX5eIWFodjV3aCZubGQwR3M8OHpATUdST0lYemFkKVk9b2thCitJcUFwc2lYY19XcDc4NU8lTFk4a1VPSkNxMXd4SVlVcWY3OTx8b25QK1dhI1dlTXdfbEMhd1lscHx0MSNTQCF6ZmhnN0kjS0VweWFzOTtuCisjNlZjR29zJE8tWCVSVml+TW1LQG5vVCtiXmxaZlhQNCpxZGtxV0J7aVktaVU3Yyk+THl8V2RRJihYNmdefShLbnIpY2BNI1JeQ0dhcWs1CitINkdpJHJubnxpelQqVDtWKCRkK1J4QXVvT1pudG1JS3h5WTFsa0Y/Q3g+ZmVvMyVCQFdTPUhQV31MZzZKRFZxTVFsaEJpfEhsQUluQ0FRCitWJG9QOEAoMn5eKWs1QEJgXmd0cGJneEIqMGdLJHlHXlZfcT1LQkYxQSElWXtmJm4kZihlP1ktYGJQNHJPYnliMjxoZ2tiYmd4eXExNFVkCituej1SfCQlRmZZWTZtJTtVNHk4UHRqbmNlUVktYSVtRDd2P2hRdGlnV2JmMio2I1Z9UkpxcnZERUMpZmNTUGFfTE9WfkRmaC1CPjhgcDNkCitxNiMwQk5xKkhPe0VVZnJGYF5ofFQ2dlA7akQpMER2cHJ5cSs5TCVgSDJNbitaQk85P2tkSkYmPUlUNXF1Yj9abCReQzN5ZGBoWXR0SlhnCitmNUsoeCV1clJfbDk4eExWMj4kWiEpcS18LXV8KkF8OTIkTjNAemZKPlFmIyNWM05DNEJMZUZpMjtoajU3N0xYKTVCbjB7MiFQSCpiWFF3CitXPDVaa2R8dGN4dWplNGZ2YEw3cGAqYDlrIyZ+Xjd8YE51bWBWO0goaHVpeiRGYjtNTmsoRik5MnRJa1hlWUw3ZmpDYDBHNGUzeGFGWkMzCitQTVQ3NUB4fnA7NXhlVHlrNnpLZTdQQ21eR1RGYVZGc3t7KjF5Pm8paWlIT3ttTVhRZFdUVVRYQ2BKJXhfVTFTbjxKZXp4dVNHOGR4MXY7CitZUVYqTWVDcWRXQjg/bVl1d282cWEwdjsxOGlzdkczO25yMkRAfnZ+TT13M184U2BgeilxJmpydjM8UGw/Tz5IODlGMz0ocy1GOD13VFd5CitaeyUzOyl+P3xqQSQtUm9zbU1pYkBPdnFseTMtRGpGTz5AMEZmY2BxWWlPaH55Q3tySmhTbW9Ra0BJUWdOOT8pNUBmUiRQenlTNENrS2w4CitHbXVySjBBNlYpSjBaNlJ1JUVlRGNAV1VzZmRkTC1ySExIZ3ZCdyt8RkpNaDRmP2kwYVZhNTVyWF4oMkVVP2FXNSptNSEycHZtaEQ/Zz1QCitvOGF3azVleXYzMz0xdjJJYn5uUlBjajN0UC11MUlROE57Q0p4cSN3cHAhIzdgdGJpREZjIVhSaldrM0BGbTJJI1VWYWhkRl9YeDkwNX5wCitIcEZCZzY5TEQrO2Y2Snd2QCllYj9DRGBGYis/eTE0bm48YW9FKEc/TUFzQH5kNjx4cmlDfnEwe1J0RUQofGo3dnIqUmUhPzZZUk0+JX1pCisyaDBAP3twbHcrdzg1el8yP0N1SEdIRm1lIzdARzxmdnpsTzk7dkh3aHR3VXFwXn0/NGR2I3w3S0pyV3o+akFNdzd8OGZxKGl9aUJTamM2CitpRiRZV1dUJHVETyNycGVnJEJMWF8oME08NyVAVkd7MSlhNTdmS2B2QStSWHI3ZzdMPEUlYilNYXo0dW1QcCVyakd1SypXMDRDdFVSfjNECitfYE88IW1+fEcmQjxoKnNrVyZ4S0x8S1gpMWlsPHUtRWpQQXB7Mk9+fStzOXRXZGNraSEtaEctNCN5RXgzbF5RVn00RERJQShOUVhHMC0lCis5SSNZZ2l7Nm5wKnRuMTdyckZWaTQtakghKSFsdmleR0U8KlZiIXRUJWIteXkre3NuM0IzI2E3ZGg7c008Z3JyKUZuRHk2d1NZeEwzTj8oCitXe3Ukb3RCZyQzTUoxeW4rNGZOQiFaVn45WVFvUVR3LT4mSWd6WklJdShKS0t0NjlRX1o8O3M2N3pLT01Kbm4pT3p1X3dzRHtxb3dNJGMyCisoIXMlYWh1U0ZsNGxNUkFQZytyKUNNalhgS1NzfkokKXhnUzBXVzUrYSk8SlopdCh0bDFjZklDdUxNeyspTEkkJFFiZ1NCZF9uZi0+RU8kCitIdSswdHN4TXQqNVpueEI0UHR2UFdheVd9PD13M0VpXiN9Qyl3Pklze3htVG9iYjwzQDI3SzlCSlRYOSNQKkJSSipzUFhENU50Pkx0U2RYCitTVj92emQrenZBQmdLMDtfbkdTQkFOTXhQMEpqXmRsZ3ZJMXpWeUBrYGh2YzxCb3Y/V15ROzMoczhHWGkkcDJmP0tNKW88MUlTZGhVV0ZoCis+SUV1UjI9RGM+ZkxAeG43P0hlWS1zNSZNeTNqOWpXJXArVl4zT1Q4TGR1aGU2ZG9jVjdoKElCMT0hIzw1elBVM1VSbUdncStmJWtSel9HCispZjJAQ0E3KWM9OC1sezRrI1heKzxJaVVWSnxfKyF4WmlSMkd7Pih+PkZmZE8pI2FRRyM0PThqX3J0YGFBfmRgd21tcUxQWEIweSo2KnR0CisyekojM3t3VkI9QEx8MH5WQGwhZFlxdkg1PypJc2xUeS01T044ZXNiQzVgZ05Sb2JOfFordDlyPnZYeGNkUTlxSDh0WU1DV2RZZWNaZEktCitkcDx9Y3Q4aXk9U0JoSEklVyFHeDMoMlErbEE3WWxvfTxadnN4aUQtYlJZMlhldTZoTC02Z09Dc2xQckI7ckNrSTNkaVBMTXdJVHdYUFdvCitXTlZ2dW1GbWpoLTUmbnRwKWlAOCFAI3UoK1l4JVQ8XlhGMVBCKmhTdVFqMmx4XmE7K04/JiFvUkNxc0Y7NHkxLUIjI2ZVMnxWViN4VTdfCitofTIpJHlzQGIkPzszank8V18+Zj9sfHc4Unsldl4+TF9wR2ImNzZHZTg2eCY3anZAbHhgSyNFMislX1UpfTJRcVorIWBMZGsqJCl7SjttCit2M2pWMUl5bX0pZVYrU0NuTzRNKW13WHRgYnNOWHtrbikhajlQYHdSPyR0REw+SThRUUFwVjdZRiFDRUZ4WnlSTHlnaW07eH1Ed3duMjQwCis2MnFnWFRfRGomY3dzfH1YMEIrPkRCJmN6RTckWldiRzdQN3gjM0Ekcj4rOGV1SDZNVSFLLXlqTnAyejUzRll8Qmd5RGR3biRBfSVRZzdACitZVExgV0dmUkE7NVRDRXZVWj55PDVHUzMpVks5ZDVnaD96TmdjTTNfKCYlYktOUV91WnZSKm5aPElncmM7Tm9kVjVWKVdoZiV0MDIpfXAwCit9U2t0RXFjRUVOV3NUUjhAelEpWUNvV2AqaWRhREtWfE5JQT1XeVdHVkQmKCR9ezReYUh4ci1lZkZPOFRBNlhTWTNIZl4yYWRxNn5laWFnCiskUCpjJmNrKXd7RDZGfCohQVgkSUx+PVp6fnJlR1BvcWpsOUxJJXZMbmxkMDlzQn1MT2dnRjZ3dj5FOVk8Y3oqVHdWMVBzPF91VGJnJChzCis+YDgxMWc5OURXKENuOHkmS0k3ckN0YXshREFiMUwydGBDQC1RKjtZcm5iazQzbWR4RUxheUxhcypHOz5RY0BmYDlUVj1yIzlWakxhRnRMCitLVmE5aiYoditTRz1QQ2lwP1dkeDlFcFRPNVlTJUdmTikodStFdTlUbSpzbEMlM1N0NnNsPW9gVldPMXQhVTE0fFFMRVdwd3gzMFozcWBWCitEa3cmc3g/dmNCd21zPjZlTSF2NWxzantNMnNVdUtvMD5ePE1teSV4NUcpTTxjZV9Rb3Q+WG1HTGhNX3trPTUrN2M5ZiM+ODVsWTJfOG07CitsdzNfKzJrfm9hSURNYHZ+WXIwNXl+VWoycUJfSlplfmxXXmY5cClzezNqK2M3LUlqVTlueS0xOFhTWWdzRHpHJXFeNTF+eDh0NytoQkM0Cit4UUY7RkUyUlIhYTcqYklMUThKeUgkVGI/KjgzPU50PyZAYitua1hFXlYkYWxlM0FjcXk/NVJSbileSzFOUVg5c2ppKiZOR2R0dWdFTXVuCitSU0hpWmp9dWtFZHNSTStiZiY5YFEwXnp8O3FEQj0rVE50dG9hKnVmM0l5LTw3flNoTm9YMHAkSV9RVzY+TnR2TTdqXzhgTyVycGFTc1EjCitgbUJQZ0luO1coSj8pWEM4PnlwTzdZezRFQGdEQXZBV0Q5X1RkM09uRkIkO2YmNVl5ektKMilAT2MxYEg2bFllWEtVYnwtaTRzOEwqa1dpCittUzcwZD5GQWpPPkpyMTBJNEsjKiswVERnRj9GP343RGBpQWJjentJd3Q5el90VD47bWZlKWVTMU0pNl5AfnpFbX4lIzZCVXwyb1U2T3NCCisjPj1RQTc4N09+cXdNOGEmVTdBaTJXUFNOTlJANHw2UmVCVzFBcWY8clVKcEhrV35RfHl+NU0tUzdgeSV5NWQ/SERFbGM8NCVuRG1kc305CitaMSlkK0psbGpDc3BWUEtUWj1EUHg3RUF1aC1ETVVlaHNeJTAjKjBpRGwkYytoSSVyX1NGNSolfmkoNykqJmQmMHZfOU50e304K017bV5CCit5fj5US0FrbTkra0JvPWxBZmRsSj8jTVdqVTFhVHtLK3BhPHZ3PytWKiEhK21yQGQyc2lRKUFfcmNtbV40S1M9Nl5hdnxoSFFMc25DM0xICisoYU4wWn45O1RuPjc/MUFXcmBEJFhha09IcjE5e0ZfdmliTnNEbmRlSU53JEV7b2J6ZXdFeipKK3QyKipaRkY/eVotX1g1WSVEISgmNVZZCit5PipQWGNmbX5JViMkZTVuMDFlZkhyWlo7Wm9nKUhQRHp0aXUyTmNFR2xGOTJZPXpTdytSMllaXlFmIS18MjxSMXEmeEJ9QmVsVk9hcTE7CitecGM8MClTPG1EMXx5KGJRI0hUZCl5KFZJU35WdEU/UlhkX0NITXJCIWZCNX4lNWtBNi1SNV9nV3ZTWCEqeygoQEJNeikxMy1wRitSZ1ZhCitnQkQ1ZnUxa2BGeUZGX1RSWntzJTtUa0JxSEN7KU8lMSVLeSU3NWw0QWg2PzdKOGU4SG5OdkVaWSY+PTglK2hTPVV0N0hjVmRlS0pQZVZ6CitwK0FZZ3U0R1UtTypQaj8pYUU3I15YU2NeOyFLbDMjLUsmO3BlQlZHbDVOemhVdmljd0NePiRtWSZIKUd0aGZ5Sk5BbiNIOElBPmo5aX1JCitreShvRH4kfk41ZzRCYWN5RVJVdnNNPC1hQmd+RDg7Wk1SNnNkI1hhakFSUVclQVFfYkApMzFmODtCfmhielhaT296fDEkLUEpYG1SSndxCiswXkJJKlMrKlAkWVJyPW5GNGx0Y14pRU1gfG9EMUMoVmtiUDdiTEc/eXpGdkZuVTZjd3piPXt1QUs3bz0zZElWdFhTKF4rMDdWeWR9Um5hCitYelIjVj9fYllRfEctMWRjI0VFR201eXNeclhrdTwkNXt6KjAwSylFQFJabyZAcGNIUCY3NF9EaWFwJGVZJCZySDU7fVFoVjF0UUp8Kn1iCitIV0N2U3x5aS1vcipqb0diKkBzSGVLQi1TWiRzeWN2Izx1RCtmbn01dDVPUUVrfG1rSCpaNDlZMF56MnhMciM8SWBCQ0RQRGw0ej8wWTFuCis0ZWVpZCVhXzZuNjhGX0RaRHZyRipIJHlMKShjNW1PIWc4VnFlZzEmQEJ8JipZZUFBemheYXojbkF2TWM8SUJBX1JxamhKe35ffTZUQmZlCitBRz4yTCZBKlAkWFBRNDNXU3ZIfVhsfkpGbmlxPFdRYGNjXldyUnZORnY0TT1MeiYzN0RFemJQOF5KR1otdyo2SUBBYSYqajVsUHNpWUchCisjZms+P3VYbWNCNUolOUBeJXotaj8tVTB7Kk4oWiRvMz5+Qz9XNnBPTmNEcit5U1MoV1pxbzRrJXxyc3dXYWdXfTlRSStGPFk1S15KdGBeCitrRFNrOF9lZ1NiKnhuPyh2bV42T3lvZEx6VkAjPWRqc2ItayMqYFAhKFhrMXorJlEtVG1sWjhFMj4zSmFaUHFBRXJrITYwVj9mP3IhLXFICitWRDtJIzIyQjs2UUZ3Vj1zRXdhN3hnOHxyZDtRVjJIVVpKP29QbEt1ek5+ZmBuNFBfalQtKjlRTGEpMzhkaFd+YGB1cG41Pk5PJmZgZkVuCitsX0pHRVJUfm56amRDKihmdlFKZ1hLX1F6UCQrWDQxNllAJWY5VTk1bmB0WX4+blgwbnJYfTR1Mk4mODZNY3w+VU8lKUdud0IyNXpVKypsCitfTVhxdHp5Wnc/WFg7RD0jODRKci08RnUyRlpiTVUrK0FiTWhMWlBCYzQmJVB1aTBYO2NqUVBwR2IjJC1RVjRWYkxTS3BfPGdXfDltViE4CitpOHJTcyEoejMhez8jQjFGaiRESURzJVVYQjZfJEJQfnNmMyNLWT5ZQEg0RlVsQ0ZoKGl1I3AtdWJDb0dnQ0JVXkV3azt6RStRNXtgO19xCis8bXV7WTMhWm1HYFRpTWJUOCkoXkZZfVk4c0wlJVkoY3AoY2VfeT5pcypEJUF4YSktU05DdkJxUG5PUThMb2dGaChsPSNPV2orUDB3bihMCitQWmx0Z1VldFU2djtVPz1qeTIhLURePk1YcFJ6LVE7c3txKTlaNG5ScmdkK3JLeHkhTUZrXjdUJE80aFN9NmRrLVJJZWA9VlpxJUVQJHF+Cis+eHJNI0xQLWJVKih2YT40a0hOYHZwbSZLQmx0aTFkNU0xcXtAfjI+VWVST34ka002O21jWF4/NGR8a3BvQE1ffiFIYk98VF5RYUZYWEU1CisxNGRNKlE/fHdqRSFrWElQYXlaX1JXeD9nZj1tekRIPiF1c0p4aXRjXnFIbzJQKVRabndsK1ZlZ3g0WWgkKlkobHNtK3dEIyNOfGh5e3BJCis9SGswMVdiJUstbEx7UUIqYF5QWSZleXg4RCtfMiRGI3lYWEJvLW12aF5eTX5pSkoodkZiQUtyY2NfV2tveVJtY3ZuKjN5bEdXRX1fYGltCitGU2BVTVNpWmp2IzwyMndiKG1pLT0rPHdUTX5OMUZ3Nks2c2QzbzBpSG5NdklSSHwxUkg/YDMtYVppSDdFIzNme2I1fmF0TH1PQVRmZTlLCitBMSZPWnpGP3ZIYnwla1FDQmVkZmomRlAmO144MG1ATE5XND5BVHBBUkZ4SjRNZH1YM15BazsqajU8I3JvV0RPSGR2PkYpTSZ1NTJhWm53CitfK1pFYkYtTmRjSDRxKk0/MURnYHV7JUZsTTFsLXFLIzdNKEIyKHtuWlVUYjQ8Q3o4X1N9MW9TY049Nj07KyNlNXkqUnw4cy15XytpYVZfCit0OW09fVpeNSRKe0N5Qj9OfDc4eSU3QUhPa29iSz5eZFJWYH1WK2RkcVJUWWcoc0JDSDIyIUJWMEBFbCYjNXpxRitWfjRmRHhIZytsO0VoCit7JGJ+U0pzMkN+JEsmYTU+ek8jeE8ya1UkZ2ApZTZwRzhYZlUkYXw2VVc2c3luZC1GYXFDKntJVChGNiFXezh0RzN2IT1IRi1vRGZsVWt+CitTVWpZI1VPYzxXUjcjS31NIUNPUUxHOztrYyVWTG9IeGhiR1U3WkJtbzslSXtOVWFuKFFPTz9CfiRmPkY/PTVwTUZ7Zz9NUzxZYTZ0LWBRCit2ISVCcUl6NkUkQlJefXY7dkVyTyk/JHZZPWFOJj8kMCpLaj9vVmZJZUB9eEx5UyE4QEhYZm5XVj9oSTNoNSV3RmthPTUkUXwpKXB2ZWdxCitsaCVZMl5Bajtya2lxWHcwNHxMVEpxWCQwQCE8JW44dVVjcU5lQkMlcUNNXzxnQ0xOOEwtRz43NH0hJl47bXQmSTNYYDtmVEx9X3RLXkNtCitsQmFgK3NPZ0NBbztrTWorVUxjK2dpMVVzaEM3QFVYOXgkNFVzNjhjdUM/b0tzSk13XipDdkh6WjgoZVQ4cnI2XilNO3pBPyZxaX4xTC0lCis3VUh+MFdrUC0/QnFAWD1NZWZOYkxtU3hWMjRJcFQ5aCNHUEJ+MWcqVHBWJUxsOWZHIUV3N1d9fj1FYmdBRGZvflJnYTIqfDFDbSRFaFVjCisjNi1CRnpQc2BMXnowNGVATD1DanVrMDFlUHMjQmpCXylJPlFIVnspPCl1MXZ0ZGNaME9RX2hBPytoMFU3X1U3bStLYFojMWghVTYybD1FCitoaitfOVR4N31oM3gzKlRSd2J7Wm9TLWZTb3opRiFNSTgxcnIlWSohfUU0cUhQRHNSQkU4VmIoek4zRUxJcGdtaHopUXNjRnw0KmJvVmRMCis0SEApYTZvYjBwRDw+UDs3PSYjbk9DdlhfR004c2kyPD9McHA1YDJqMDI1ZDVkVTA7QjFAKG1aciZucFRGU2Z1OD5DOGlRU0lqX3owX2B3Cis/ZnJIOzVzWERycz0xQ1Vxa1IkWmw/Z3ZmfSFmJE4mI2V3Ryhjb1UpZCN5V1FzQlYrKSY5c15jNEdfUSlJdjdMZTA/MEY5OT0hJDEpUiQlCitvUzdCKTBzJkJzbXViZkwhaE9qflhzJWZDIVJJTlkkfGtpeENxXzYrZkNTQnAxbzAhRERVckFkQyVRKmEoMD5fZTF7IT1ZMCFSankqZGJwCitMVnUwe3IkbzxhOT9vK3dzfDM3ZyZOS29nNiNeI3tJNWI1N31eQWhAKDEhPk5mZG11RW4+YHcwOEZjQXs3OzE5S2dfOzFlVH5fakM+O2s+CitxfD4jMUxRYkBmPTttNTY/N1MtM15fcTtSI3xzQEBrXlF5I1FTUFU5RVBEdUlgMSpzUD1DPWhZTDJSSCk5U0xjNjk0dG9HK18xYiEtK2ZNCisqKjFNJiF0aTVDWVg2cGgoJngpbilqekc9WitHUHdxITdkb28qbWlHcD5HfVdZKitXPD1Abj9eMHdIQ24yUSZSZ1pZYTgxVlNHZGQ8b05xCitSdFEmKyZmd3ZzcHAhSHNkNVlLazlsMG1vYFh5Wkd2ZTwlWllTMS1ZRWMrYGVkNGJePVo0OCEjV0pZNWpHTUwmSWg8XnwlfUsmfXk4ZjE0CitSWDI7OWlwMS1xVUM/TG5hRGlFZmdCP3VLfm0+OT1sPyRJeXxGaXs5PmomQFlpOG9fPEg4bmFwVEkxSl5tYWZiQUJkYSZPMiZpRlVKdndHCitxfVZBRzY9fUIycXlDLTRITl9gVj9rdzJMKzlkdGJzSjh0RDd9MyhONFhyRnZIMyo3ZTEwZHpSM35Bdi1Ra004WiQmS1AwOyFCTUlmZEdGCit9TkNYVDxfP0xMdXxoSzJAcGkyLTV6KG5oLVloJmEjIT8+N0RZJUZlS0Q5PmxeQDhrSjNMWmI9VSk1XjVUYHdAeVM2O0k8TT5nQ1hGRG5UCistVnttIVFebW9FaCNNP2NMKHZpNCZnMUFiMn5GdGwpLV87X3dUN2piKnJ0YEE+U2FeVTUoTzk8dz4wVGxWekkqNksqd1hCeE0wSlp3UnMwCitkbUNET0d6NkRVO0JvWDQtVT44a3YxejdyY0VPSUQ2YFQtanJIcCU8JkFPUyt+QVEldEEjP2E5O2MhNEpHKzMpX3tlbzElRW8mI2xVIW44CiteeFEtbWpNUE9obEVkJElXIzNIUCVqdVpmZDkhdlJSNGNuOENYWFFLO1VtM25wKkYlP1JSZlA5WkdKUkVXRnpjanM4PFklLTUhdlNSd3tUCisja081WUw5WXRlMG1tYmZLXng1O2B1fSt9VE83MXZfOEBfT3JYdTlEWFFScWVJPlIweTtSRUVLRjVWRk1iS0N6KDZfP05YRyk9Rig2YHNOCitIQEBBMX5VNiMqSGV0TTRxQEVzRyVgJkFaeVYlXmRtaSM+QWZEfitOfTxPKUhuSUREOWk/TVVTdT0pMV9LX2BhSis8cmw4RjBDdD9Ce2xNCitHaVc5NWRodHVmRE08cjQ8dE9EUChle3hsQDh0ND4kaEBIazNuWkZkVXl2a3RrYXo3UXg1SGc3PEF+c1Mxc1I5cEBWRlFudmBwY1NTayopCitqRkBZUT5OY3NpMnhgMD4/TmExaj1zajMrRVlsVkB+SUNoNnVXYk83Y2w2c05ETEZ1OzBMZXlhd1V9TU9wY2xUOXdvaXRuPlJ8KFNSRj9gCitAN1BVYU9eZG1pZns7OUNyRD9CaWs7QXBjdn5VWihLeUVoQE5jdGB7REhHU3R8Wns9fGdiPmt4MHArVT49YEB6NH1EUnJZQFQyZ3ZrY2hfCisoMzRpZjlwJlY+cWA1czY5OHReUlhaOWFZSD1ZKEdIUn0tb05zdE1+O1cxPC1lSEd1NmMqYiFpJEFsND9NYX43UHEzNGhjOUpEJEVqRHAjCitQJCt3S0B8cF5UKEZtYEdSckZEUGRvajR6VTVGVTBneWZqVkBVPyRwYDdFOF50PjJyX2sqNGFZc3Y1cDJUT0Q4PytJUihQRGZBJiYhRDJ2CitVMHYrcVFVayhqLU4rakRlaCVCPXJCYylqLU1FfmBSSyklQFc2K19tbEdhQjU1KUhadSQ8LWFUU2ZISGh1SmNNdykpNHttRHhoNjJ5RWFHCisrcXV0PkxGc3w7fU5kTDREeStwVz9qKz07SWBxfmFNaDshIU97ZVhEM2JAdikrdl42O2REKDVVYnstdSZhP31BaVpKQkpZQj99U0taQFhpCitUP3UmPyojeXJGbSZCaXspNChmO0RhO2NkQi00SHBWN3NwRjt1bzNxPFZHKnRnJkBkUkQmSWdsfWskNmM/N3Z0ZVcwTTloQWclOHJMWDYlCit0QmIrOyFpeitAfmJsamA2PUNuO1g8YTY/Pl9USkJKK2I0d3Q5cUcqbzxqMHVAalRjXk9iUGZvYGdpI0VZO3E3PFNnSGUodnc8RyEjZkpOCitBUyFHI0lzJE9PSEJiWllCUHU8aDFpZHo5JXElQFRTYzReRnoqM3Q5WjwweVBweS0qND1CKn5fXkRuRmpTY04yX3RiV1QqM25IaGlweyNVCis7bVNfNHIqeDNVbEVjRzEwXzxVYTNHJTJNZjBCMiYmPHtLeHsqTEZET31taygyYDg9TkN4JmhxdDZ4e3MrbSlHbTctSUZ1Uio0VUcqM0lGCitldjd2TG8+PWtVJVp5cVdsZjlzKGBhRW5jRGsqKjRsUURDIUJnZWYpKkUhJSkxNCp4SXwmK0BCNHRJJSlgbmdTKCRQWVJWVW9RUU9nRUh9CisqVF56fWZick9yN0I1NUh3ZWlNIXRJbSRaSXZFWkY9MzE0fTErU30mPXNBZ20yVmJpKkl4NiVyfFRNOE9kYmlAa2FMOXAyJFdsR0w5SDckCis/R0BOfWRWfT5qQSlWVHZVJWE7UmAmazVYOEQpa1hMQUk7eSEkVGN4V3RYXmRMSk1XV2dkRngzRG8+bHZvZjlnbVVlfSg5eX1NMGQqfTs/CitvWHI3PURndmR1XzY0QFMhcSo2bWxiaENBS2JeYVM7V3t7VH1aIT4kJjs3RTA9OWIzVzVseWZzI3JFSV5wQjx9QEgycDdjdXo9fT1PPXopCit5LVp3T29qNGNRbiZhO3ZvKD1RTDJtWT5hTEsyNHpMTUo0MlV9LWB8PGA2SHFlNlROfXMwYUdHOHBoPH4/Z3p4UFAjUGllOz5Ib3I5K05WCitjYjFAVm00aFd9T3kzeG1ANzB5cmk3RG8pYHF+X3NFYyk3fGBLejlVME1qUUBmaWVMWXZVWUg5NHRBTmREZEk2OVNhTUUxLS1RPmFAJkwoCitrUXVDbldlQ2NgVFdCS3opRWVHYUQjYkZtNzMhcXU3fW5GdVdpaCRENW5OWFROSjtgR0J3K1ZGQX0+Wk1CRER8NFojJmA9MnApVjQ3bGt4Cis4NmIhZjNAWW53SD07PU89V19OckRXO3ZqJjJZU1JwT0s+ZUBafStBeEEocG5DezVFQHp8OzhJQk5aWiNTbypPUU1eZE0rREV5UmQjekZ3Cis9PSF7N28tJWtfdzxlYlZqa24yMkh0N3RlNDUlZmE9YEVGOT0pQzhabSlqSF43O0khTWc/IXl7PjRlYzh3d251WmRqYG1nVnp3T19gJmtyCitGaXFpX2RuY0wzSVclX3FLPnBzUShsLTFrIXl8bnJId3dANUV4JlcxbjVMPGxiUSZnaj9zMSMwWiNYViskVlMjMGVvdWVWIWVYJkhzcExvCis8OTJAfUxPRT9pZXFsNjxrOW1fSz41WUdsUHdRYDZ+RmtPU2ArNmozKCtVbzlVPCE2RjF0JlFoRlZmT0BjdW9yK1cwN35USGNYK3dWdUdjCitRJFM9QHFwZFlVUWhHa0VzLVh9Km9kbCtufkM8JXpKUDhQbk5fYHo0O2RUeEkqISlJcFdxcXRwM21AUHFEVG98PERPcVF8TEFveHVwVD5oCitUNEBeOTBqYXJUWmxoeWo8bGVAU0g7KlI9KG1tTTVeZnRrMDMzWW5HRWdfWlctPnI7bnM1Iyh6M01WLTFeYEZAb1k/MChjdXBXQ2N6SUlWCittZlVMNm1AfGJxZCM7cDA2UGk0O01rTi1RflNlaiZ1OTB6IUl3LW82TlZwQ0NHTnlTPWIteTE/Z1UteU13RkBSMEFOWCkkMnB2SCswKj53CitqPFhRWTJITD9PaHVufTd3dWhwLTtqYSk1NjhAPUxnT0x1QGR3dUdwNWdeY2cle1E9aUFMUV8heWorRVA/TTVFRl8pfkFBaD1HO2FrIWsqCittMjc8R3g3dk8yOSVuKjNtdTkyRVkxa2NNPWNEPE1sU2NndGVjUXNGWHIpRTBjJTshbkB1R15BPmE3MndUczxEUzQ0aygxKD9mKVg0P1RrCitedEokMn0kS0hXeVolITZAaTFZaU9DNkh7PiR2bUNsNys7U3IkdVViSmB6Vz54LUA7TFpNeWBQZG5EPXAtYHUqNTlYOTE8Nn0+WSlZJWMhCitXLXs0KCM7UzF8RGFWN2NXPUFrRD9CbzI8JjcoQVBQVUBgMj1BNEd+Q2VIYTZZMy07czZqQS12OGNvJkM2QUd8Nip1QlVhdWtfWXMxayFGCitAMXFIO2NfKzM4aCVTUitURGFQUTt5Nk0qcXo1NkEwd1hhYFZWWXFaSDZiKSszdXtJNHh7emJLPG9+UT10ZlE+UCRmMXE4M2VlaytQfUJ8CitpK0h3JVVGJHBaYTI7VF5vNWoteHZZX0UlY05vM1VjVis0WCFDYDB5UTQwclJsM3dxKTViPG5HJT9sT19pQjR5TjEkITFfaTgkY0FHKi07CitGPCQpM0QzPzJNd3w0I25aeCFtb0FGTDVXYW5eRDhwNkVtJDRpQnVyamh+Mn1UXz1mR2lOJnA+cUFlVntkVTltZkUxNnQqLWNsI3lYX2R6CitVQTRqN0lnZGhYI3M1JnNYcjwqdmh1PXgoenl4V2ZQPzVINUNTe3s1MVk7aTBpQ05gYVVvbHZBWHk0UGYxSj1nMEVFT201P3JDWEVSPmtkCis4Jl5EcVo4R3JzJDx9bT5lJXgrNEhSI2gwdDVKeWxTKT9xczQ9RmVAeyokeWd3Yzk0WT5fOFgheFEta2xGaD1sI0d8RkpYT3kqKTBieC1SCitgX3kqPCF6ZEJDO0ctNVM5MklLLXheQz9icXJXbjxGSiQqLTI1NWgrM3ApI1ZOdHU1NE83Kz9LYGM4K2FXZDlKU3R3R35GNThNY0VqWTB4CitJUV4/QD0rQDBnQSlmNz8zUCptdE9VeG98aXNmLTY0IVpgbGBeQHdid29DbipzOWwwYmJMQWIqPH4mfW1MY0lkT3dAVDZrQ2V5TjhtPXtaCitBVUBrbCpKVmxwZGp+UX1yUiNnQHkjUDllR0BvY35WSGFCdzA3QV5hWUI/eGpPbVVhc0kqcjs0QzMzWUVuU0txUDhFeG5DND4tZzI3Y295Cis/UUNXREkkcHB+bWxiLUJVTip1VWFlUCN7YzUyTl5AQjFaRFpHQ20hUEVEIWFZdTRgPzd9bVh2JGZrZHRLJlFvPSFZRUoqdT9JWnslVU98CitRQGxxblM4Mztub2tvIV4+NmhgelZoMDU1d0h4UWV2SVlzMWhkJD9tdUFiMH1lM1k/X3hQX18ldWN1a1NsIzJ5VXhwMWM2KFhHcjZvOV9KCismQjYqVlZ0d2FEMlk2aXB0Qj5rTnk1SzAjRk1iJjZwPHV5WHN+djlafUpLY2pmRH5Fek0ldT1FJUQ5TTRXQUFWYWM+TGZGPFhpN0hrK2ltCitieyRQbW1tdEVmX3h0NUN5aiozRW9CNy1HRzclIXg8cnJ9WDZWWkR0XlB6N1FqLVlmOG91KHlMdjlMUWlAZWxKKz90YSpRTnFYPzA+MEIyCitAX3txZV9PRlNfNHJTTENyISRrQzteN0FKKnRiRDY7bD1SNSlxajxUPndoc1dIK2RZKlZTOS04Z3VWZ3s8R3RpeE9HTShsdD05fllyNyhJCis4Nm1zK1BAXmQmNTRvdF52bkZhfHRxRTxZdmdhe0gpNkR7RWZUZ1BsITFkMHQ5XjNXcF8jXlBWWiZQcmRMWk5NWDghcGprcSk3UU9sZ2hsCitsc0ZIam1zX1YmaVQ2M0JaIX5XR3JQc1hXYUZ8bXcwRnY8WEJBKWY1cnRyYW4yQ1ZPaG5+KHIlRD1WQDFJN34ofWFEKW9jMkI2NVlJTU1KCitDSEh5O2I7JXRLb1FwJjZuKHIjd3stZmwpN19uQz12M1kqMjlZd24hP0N9cC0hPmpaKHg4c1BtPTF+JGljNlUlUlN4UXE4d3Bwc01MKmF8Cit6bzV6P1RGJHMzbz13ajUmNCtNZWM7ZnNFbz1IZjsqeV5EPyZWaTE4T004UFZnWjJqWDJLU0c8LXRDdjxMJTwzQCFJbWBEYnUoPEJ7WXkjCitQV2BFZ0JubjR3YSEtV0EmPTR+R2smbkQtMkJxdXBeSD84Nj5DMGorKVU2bEJFYEVXKnd2cXxPV0NzZ2tGYDFiemZjU2smblVUeFJRZ2srCiszYmFmX3pZNn0hcmlhVmAtcHFDPWJTa20yRW89Y348R2Z8IXdweXVXcFdEOFpoM2NOPVRheih0RHxFbjJpXyhWfDZUd3pXJUtvbipPNW1XCitwYVpsTXAmVld9PVNvXn41Y3Fjb3lrRkl0U1JHbCpRMT1xJSlKMHZvKHswUENLaCMzKms+VjJqWkd6JlBpWCUkcnBMUWJQMXU9dyhDQzJxCitgMHZNPEhwJXMkQHleVSR6KkJsbFlXKzV6IVduWS0jTEEwanYwP3oyWjkhQWAjVElWVExecGdaMzBHbGhBflZTUzNselA/eUNufT91YzFDCitRcGhaRkxxPy1oYXAqWXBheVZQe3Vycm9qWjhQUkxrKERNb2coUGQ4Q2lrI1UzMjl3bjQzY2RrOVk/eWVzd0kwVmBhRmt+QVRaa1glQWtXCis5SFl5fTRAPmNCdjlYK1ErX2ZQSkh4OTk5Rnd6djYoZV5TQldINHhvQUJ7NVohc1pSMnlOenhfQkFNfFA9ZCZDeDV4bURAfCpeKkFuRiRCCitkeD9lTnR8T1NiPU9zT1B3ZWpBM3M8KElVV0VYRCN6dnlrMkg2KHZ0by13ZlFJYSFicF59JHBEU1dabShEZ0xHT2N1c3BafU0wKHA3VXR+CispdkdVJSVrRmd4I1YhMVRUKnhmPUJxVj52YkVJVzRpbilZd3hsakBQcipwQ0pjJClFVU0kTkhZOE1BX1h7VjclbF4zUS1GYGB1aGZIJmMjCitSR0cyPDsrWENHQyRsYzJDeWBzP3l1RX43TklMZlF6RHhJSiNpdHozK2tvd2JpPGchP2h+U3VuO1dTLTQxaEpBNkpHZTFYQkxWYy01JDttCitBa09sMiRBIW9kY0Q+e35AUlUtQ2RiamZnMEpJYWNGXmw3N2NsJGQjYmxHJEtQUl99KlVUKnVfJkV2PnZWUDE7NEtedUs4X0IwZGh7T1JpCitGKFY1bn1UZS1BRlNTOUYldG1uezgpQnppM3p7SmM0QkQ1c0RQbDk/PnY2TClhRHhXZDh1eUtVVE4lJmg0UVRCQzhjJD9GfD13NmVed3RGCis0fTkmUXJDQ041dm9VMUtxN1dKfis5dyZMKXgkWUZIfUMtY05JelY3RTlIKzhTVHVQVDJlVDRAQlM9eyRDel8kJiFRKCRpZWdJd1gjQ0NuCitSa2lqfDFKRz8mc18kJnIzZjJzU344dUBNU2QycWgpKE5wTXhweVZHRzJwaTNecVpGTnhRSm1XQilMKzcjXkdeXjY8MypUaXcqXyhGYmZWCis7QlhOOD8xan5XKWxPTjd7KlEqKyktazVxISswUFZHYnNmc0spS0Rxa0IhXnd8c0Q4SDV+OFpLeWB+Izw9SWRgYWshXig9OHZ1YkUkUk0qCityQDhHZnk0U3dXQDRaK2hke0ZwUDMoPFZNbWIwck5aNylBJmBaPiNWVFR6Zl96Ml5uRypIK0tHMDhZaTAlV0dpOEspeF5mVzhySCt0UGBKCitTNmA4fUBDe2V1d3M1Jm9DQlBzZFI2an45RWNlRSRucjRXQFRUWFUkNU1ob29sSFo7bzw7eXYhMXNyRTI5I0tYUkk8fE9gaHw2KT1SQ00xCitkTEJvVW5DWn5JV0dpaDEje18zN2hrdyh6VXIxcDFKIyFUM25JKX1zcHw1QkpvTyFuNyZ8Z3w2eUNyezx+QkxhaEM/Y1pqYSlYR28ycFMrCit0X01EZkp2cUxCNEV7VGNzVkNTdEs/SSlEdVh5dTtxQTlSYzE7a2ZVXlN0d3xtalEhXnZGaj40UlQldWw/WD5ZUXlvfDE8ZHNLLWpIQCsjCitaWnpyNWBLdy1KVy1IJCteWCZ9YX1FKXtAcXE1TkZGfXVuZl49PmxMUT5YPmclVTQ0dEMlaVU+OV9QZ2xObWAraFk4NmhkMzg0TGw3SEltCisxdCFTUDZadl5Jd3wzRTZPX3ZLeUwhWUZ3YjJ5WWxhaEBwNzZQPGFzR3JzKEo0ITtYXnVqcSZwYiRPeUxQbFY7Jl5KVU8/cSFNISFNYX0kCiskKCoqMC1rYT9zQlZBNi0jSk9TJEhVUDx7cFdwZyQoem9RVTlMfUglSjJsMXslWk5CQ1pTfCp6aSF2ZGt6T3RqPlFtYl5ic3srUHRndGB8CitlMmt7dDNUNXN7fW1FTVJjNSsyPENBN0ZZYjBaWXcwOWYjMGRia0EqfjYtaUlsWlRpTnZ6YFQ2M3liNT1XUm5JO218Wkt8PEY2X3VWcDx2Cit0WE1xSE55UCtIajdiakl0Znhoe1ZhUm10aS0xWm5VZWdlNFdwJWppPHJ4R19+QlViblVGeE03ZUlDVnJfekImN2FsX2Jnd0NVaF9PbSZ5CisqeCpEMFZtQFRlSC1Ge21Ve1g9NE03byRWSVRJUGg2REJXSUVTRStWdEE/I3lXTWF+VCM5bHRIUERJKGMyZCl7WShCO1ctRkJrZVBTeDdKCitgRHdWbS11QDF7KkpkSkc0aCZzVGBpMjNmVDg5bm1uQXpAcldQTG5ULUY+LVVveVVabDFXP0UhdllrIUxrbk91NChzeHhAMllzTFp6PCZgCitXcE5oISs2NT0pOHtiPlZuYUJSTFdXXnxDeHo1X1VOPlpPbUkxOUlmcFN8cmROQX0qVyNmYmxeem9Ue1hrKjJkWkVsdSNBQntOMXJUPlJ6CisjYnNibUBvRlZVd2EzZTs+YDdJcGtPOW9gVjxYZ0lBZ0E8QzNnbmhZb1N6MFJZMT9hK0Z1V1lFMyNRYWZzP21rKV8wX1BgYURWMkcoWVkoCitecmYlT2p0SUpSK1dOPmx7dTJ1bHYtSFNFY2UmR0xuaHJ0LXtNQzNiI2JjbUVCYmVuanQ7Km1uP3c3WEcyWGlmOVhwUT9uNCZnUmpDKU1mCitgISNoO14rYT42QkwmJVZ4YGVQQk4zZ1heY3Z+VE15eXlwYllCMEFsdm16KTlPeklFMUlLLWEyZjtRY05zTlRfT0tGKk41PXJ7Rm96RUNECitTQmBFPXtFVmZUI2lpR35BTWlgO2MyQHFScW10KiNRJUNoUHIpJTtyeWdnckYxdTJHJUYlZTVOUHBtI0N5eGhESXk0T1ZFa2N6enhZfHRiCittQjd+LV4oflV0ampOTll5UFl9KGUtPWdrMEo8VkpfSlQwOHp3KElVXjAwN2xReUFSYS03d343e15QUT1fRGF6Q19FPWpsaC0yNm9uSW14CitwM28yUHw/MUhVfFR2KV5udjdjNm1pMWhJciZPWCEmPlZ4LUdHUU93VHBLe3tQXmMlJF50U1pLZ2hGcGdsZEUhazFsPDdHKXFxe24hcjVACitDRmJlaVRCcShrTGtYaTlhNXZVaWd4M0hxWUhFXyNwaX1xe1hlPVo/VGh2TjVpdl9eakxrRDh4OUw5JGQyY2dfdShIOU1Zfj08VlVsKjA8Citqakdwcih9em1qb3EkZGBZR2RmYXxpVHdjN2J3VT8jT1oqY21IbWBCO2o5RTdTKGg1IWRRYUU3QX59Jj93MGJ6TUJ9dEtlVStuPEJSfCNrCitjYnUhfDVUOGB7VDVTeEV5VXJ3flMkRzNiYSNoaiRGdm0wO0V4KUIrZDFhcUxBNTJnOSV3dCVSLUNwbHhqRyNUNFBCNFU0QE1vYj1vRSl1CitoLSVhPFZMSGE0bDlQV0hObUJValV5QUM3cVJIcWhlU3x5UjY/PmMxM0A7JTM+PkFGWChzUkViWmhhPjg0Z0FiRkRFSmoxQD1pT2ZUNjJ1CitUKXVoKUVsO1Nwdmx5TkNTX2tHd05sdk4ma3JeY2Z8Z01WWTFwWiFtck1zUHhkLUJ+fTNeRzxKN0NmamE7WVQtMGZJVzl6I0QpM2gmWDFQCitnPlFGcklyRj5mWjRpQUB9WkltVmRTRj4tLWQ2MGMpZC1nZnZDczwrTn5rMz1wc2Q5KkpTRj1UWiFOKzFFS2xtfCVKMWYlVlk5M1BhT25ICityMnFCPz99VFZxUVAkRkx3NnRFdnJmfWg3KGNAITc0bXJ3S19PRHpifDxXdCZJPkNTM1FqTnpzWUYxOCVUSlBeQXFAdHFPbysjMz5wTnF5CitONGV7VEZUdTQ+ZUVBJmJ5WDFuNnQzSWdAM0NfQ3BadHh0SjhmdTRKUDJ5YXFVaTdHVXozP1NOQ3ZAM20rKEJFNS0qdyhuQ082SytDMUlSCis7bWlVTE1GTmh5QyU+M1gmPCprYistZys3andHTUxuanVESEktcGU+UEpTWWowbkleP2ZXMVN6Rz14SkBmPihPR3pQTkk5d3AobHl+VmNrCitzRU87KWdFMXhyXmopfF40fERMb1hPJXh0blk8Z2pscit0fUU9ND1XKWsrNFp1ZkdyZn5wbk18LWBfNiYxWk9vU0EkejsyTXJOKV9AKmhmCistKz9YfnNOYmUqQVI7aWUwWlN7ZzQ+TnI5RWo5MTNgQDFQfmolX1BMS0Y2P3NaPENNa14wXlNpSkF+aFZDXjxTPl9QTCMtZG5WYXpReTkjCis8VUJsJGpiSyhocER1MmUmPXdMUktzMW41QURXcC19VVpoNEg5bTdmJnApJWQyPip2enZyMjhgT04wMnlvVn1Ed2RkfW85Q3B5ekg7JmBJCitAISh2PFIwSUQrY0Frak04JHpwbzh0bnwoWGMtVVpnO0FydTxkbm5eX3pMMVc/fCNeUiR1SntfdXNxUn00e34hMkp+SSlQNTMrTnFyaEpgCiskYDJfK1A3Q0N4fS1Oc3khRk9HZGNfbkxecTY5SVQ0MDhiVSlPISt9X3VpSzVHbUpzYFleeFltLTs+bDhPMl87QTtaUCYtcWs+VWh5enQxCitYfUAmPWZgcz5hdEpwKjAmTTRLcippUSQ1YX5taGdyPUNhUHtYMEBSWmkhNDJFKCNYbUVuZzNmIUdiNDJXJk5XMnFPY2NTR14jb0tPRGtZCitxeDwtSDdvc29YcDspLVN4dGtLcEgzZlNzS3JxdUU5ZXste1B2YmhkP2dUVlckJThWVU8lTkpDdWs0bz8rfTQ/ZH1KM3VrdWxkdGxNOzteCit5PHdkX3pYO0lXel9uUFpjQE9tWFBtPUZjc005e1BpUHh3cEN1bGBaWkZDem9vbjRebHhyQyRlcSM8KUtMY15vSSt6R1A1KFdYeU51bzZBCit6RXJUQD5wWiZHQilLJi17UF8yJnw2bjItT2I9Z1lKaVFeN2c1MmEjRm4/QnBXI3UlViNXUmkkZ3lufEFmaDxsZHVeaz9BPW5HYEE4TkE8Cit6Jik5cmhlT0htfjw8PVN3Jio4R0dhUU5mSVNzNERPVy1iV1V3TCNvPFB5UykpOSpAJXhuM3dkMUhyMkxxVlpJO253aj4lMyRnU0pQSHQrCitTI3tNKTNDPUhTc0k+NGg4T0lPJUFIR3M8YkF3TmJjXzhefnlOJnNjYUllSlpBeCEqPStvUV5KKVRHVGg3WndBXllQUjU/TCs2VGQ5Mk4tCitFXjdtWWcpVnAyejtHZCFAQFY5TzgqaFkhO2B6S0FKbEBIMztWP0hpOGxrOFU3Mj1jQjF+eWA9emNKIVI/PUVRa0A5UDM7UiRebzhqMyN0CitPJkQoQ19FOGA1MG1jVUVMWHA/Nz5zNXUkNDtWcTlwckJsKXAoKkJQcWdBfWpOPH5xTkgzanQ2QEA+K1NpME1RNHN1ZnRZLT19Zm56dWEqCit7U3E8ezI7WVkxT2lEU3o5VkZgVj9zKlhwVGZfPlFXK3w4VnJ7IXA1Z3RJITx2RmBTd2QjeHQ9TyRkMz0wWj4zKSp0Ti1zZ042dz1xJm8+Cit1RzAxPzhoZFVyMWVuQVApbiZvY3FfRGhCZEZVMEFJRTxJN0JDdTtQNSVza1QtVTMjS04mKCExJXw3QS13TzttdkslWC0lZlV4RS1sSjwoCit7TGxHO0N1PEtyPlRYLVBhOVEhVF4+aUkwfm84aX4kKUpoVFJmans+IzNVaEUmcl5GKEshPkVTT1A/ODlfTFhQJDZ5RGY1PEV1flUpWEdBCit0T0FhTG9KTlVpXn51Z2tUMzc3ZUBDaz9IantIM3t2e3dfJUZ5ezZOTj4oenROWC0kUD1LZSVVZnM4REN+TjFXPjYyTUpNM2k4NXE9RVBICis2NG1KNW9qY2VqQihAJGMjLVpiQmFmYmxGZiNSOD96a3tMem9oIUgjci17WnpeSVVvJko9TkMxYWwkWG8tIzdhZXxjK1cyIyk7WXlyaHJyCisrM2lnU2lwR1EkUUxpViFJOUc1Sit9eSFwcDlDfmJ1ZmJfOGJLPCVDKHNYKDlFajsrUGxSQDdIMEMwITExMkZ2Kylhem81JlFFQmRGS2NuCityM1gzTihiRWVabyt9IXA3LUR+Umc+SyohNDg+VX5ee1libCgtRFl2M0hzbmVWclVkYUxVTy1NRVBFJVBNYkRzU28rfmxjO0A1JDBDNWEyCithfjdvSnAwajQ1a08jQUslQylMe3V7amM8bH5ARU0hPHQwbTRuTSkjVmlyNHlsYXFKdkkhKDIxJSFROGxOVThuYSNJTVRsc1ZQJC1FJGxCCitGdGZmMDdqYD1YcHNyfEtJaDNodzFIejgmSTFqcVImS15uVyEtbkhEKTVqT3ZJTG4+QGtyekNKTSR4IUktRU9iRG4rVXtEMFRXV0l8NHUkCitvPiooVSF2dHAjQ3dUa0ZIenx3RCFvTEptKnkqXz94NVkwS3RHTDM/fHRMXmY3aT9VanM3YzllST1yPEx8SylKcyElRT1gbExqM2x4U3A5CitjPz9wUlJNbW5RQn5mJGF0dkJOVHlJdyNxM25hT3EmKDlpP05HY0tgTUl4Rj0pRGZ2VkxNNFBVRUwwNHMrQ1h7MXkhfm8pdVNxXlhydm5RCitSUDEyTTlPN2xxKT5aWUhpKEl2PWI3N1EoPDhnLUwyNV9nYEx8MzlWRmx9VEspd29vZXhTJiM8UnJjOC1QUXBhRUNUN09jdiZRdX1tY0N0CitxMnQ8JlpJeUkhemomUUlJcktfcTZ2RyN2TjhDPU83X1Nmd0ghdlB+KFlYQGJlUFd1NSMqcUkqcUtLSVU3PHNIN1BjR2JIOWskYjYmOzNvCit7ZlpBbUlLSllDcS1qO3E0UjNLR3opPXFJPjFTQ3pKIypAYkwrdXA3UCp1LVlKbXtiRGZnYiY/aE0hNEhLUjYmdk1Qe19JSj58clZLMDJVCitxVSUxajdhS2BLXiYlfXBFTWx8VUJicXQjMk9AOE59QEBNJCNicFMtJEQxdmctPDk2VT82VyZuR29EZURxdyg/TiREMFQ2KiZ8RmlqP3wqCitASkpiaGJASlU0LTdBK0RsYzBWUXdvayhBTm9ZS1lnKHJkUUI7SzR2blVuWiY2N2Z3VXhrLSNSaU9lU1AqbkZJSWV4aUhqIVk3bjBscXs2CisybCZxQWpsJnFBamwmc3ZWUWxlNiNRbGU2I1FSNDZxNld1RXBLQX5peldUUnhHV1RSeEdXVFJ4S1dhbk87NX1ndkE1fWd2QTV7Rmx3PXc3CisrLTJfKis1MlBGcTMyUEZxMzJQRnEzMmxwRDM3P2NQfjFTTnRKaGJOZm1VYipsSUM0LVZkJClJRlZHQVdzcU9pQ3ZBTj1oVXBrYGhVWXEoCit0ODFIV3t9YCR3fHBjJHd8cGMkd3xwYyR3fHBjJDtySklCXkQoWEJeRChYQ0R1SnxpKlp8JlQkRWd0KypwfXQ8MGpnO2k4Z01jaD99VDtDCitjMmYwVj48Q1dDa2RXT0NTI0htbkMwd2VuQ009KUBDaFpzM2hWNC1qaHR4TUNLfFNoYSYwMH1uK1ZQKER6YkArWUAjQllzS19QKXZSVGVLCitQWlFsTTdlMWpSU1YweyYoUyVKalZHfXZuTD1IQlFnSDdhTTZGSnlLMX4hcF9PPU1zYjhROHFmRFZ5a0N4JHBAayEzclg8aVQtUCV8QztFCisoQ1BKQD8yNUJOY24mP21fWH0oRnVXNVZvQyp3JVRVbFFZcjFhQG43TjYqI2E3cjdgaFVDVzVTcTN+TTV9bm48b0RZTzlJUlk5aDNuWHNhCitnTHMpPXhGLWlPJndiZ3h8YWdweXpkclBNP3VIUEojJXZgYFoqKUl7JHprdmRJT1A3e15XTUJwP0xJODZqal5GQjllcUk+MVNDekojJE5TCitHIVByaXBOQUIzR0l5bF9wQjFpQmY0SVBNWVlGQ2MzMUY1TlY9OG4pVD94QyVSV0lkX3FhRWc0QWZER01jMGdDU3N6QU9sVHEjbiNoREVECit3djRgV3VwRj1XYVRIeCtnVDZxSW5sang7UyktTjcxKTdFYlR4XmpDUTY9KGw0cWppbko5VENOfWg+eVhDbUYxTk92WWBvbW1nQkcxMHdwCisqYEkoRjZkNG1TI3piNSgoTFlRaTRITDEjTH1NX342SEpvbmxUN3ZgM3BgMm9QSTleUCo0YSNTdVV6PHFsMzwwTCVfSilgTnhEb0BEM2dACitQQitvSFBTV05OfWxZR0YwP3dgO242SXkmPCVGbkhMYHoyMndVRWpXYmBMRUNPS1ZOVSZ7QGNyXnt9KWg4MHxYUVIwMDBPOF5PWTd5OC0/CitWXk9BYFA5bHVHfnJGOH19bGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNFhmVntVWUtFXnY5KFR5CisxbVBJRmtPWlV4QXheSUQzIXI1YDRMeG0oNWw9ai03YmN2MGIpUGJFI0N5TU41I3lqWU1pbURqd2dqS1krbDRaamZ7fisxYWhTaURGcC1ACishSXxMKH5UektYVjBlcGlJPk4oUHRWMks+Q3k0fF58NSQpYzUoRHFAa0hIY3Z1RU9Gck5sKjMtamBMZTdEeDMkaUx3PU0+O0VtKz5xMzl1CitZPDUqU0ZTQCFCXkw0NEpQUnc8a2dCaEJoUiVLVn1tYW8pandYVjBTNSVwNFo2TWdGWD1jO1N4I2E2THklZXJkeSpKZktje1RKUF94VTNzCituSzV0YWZzZkQ8RT8wWHkhUld6b3I/Vn0hUSlycX5NZUliQU47ZHxaMVdjMzRheEwlN1pRQDBnWXMjVlFyd1hpRVdzO2pPaz97PDJiZCtxCisqQHg8clYjTWV8OHFtaDFiYis9JUJ3JiMpNitFaU5Dc1JiOUZEWWYtSnN5UVhMIWpudE5uUWxoUHctR2lSa1B2V3VPaUZyfHBNbEgoTGNDCitRN3xpSzFIa3YySnd4T30hfFdrRVVvPkUlYjhDdFVKfGdURkNKQWA4I29AVDBLK29UMi1waXRHVjNXdDtATT9keylqPyloYmM2VnIkQ1U2CistbnlFT3l0XjRNNFomUmAoQzt+MzAzT3JYNig8Wlg/Mk42NGtTaSVKd2AoN2Rhdmxye0l4Yz5yczJNeF5yS2o3WjhUX2tGZXc2Qj18WXJNCistfGI0dlVWcVJYPlYtYU5TY3k5JmNDQXxPKXsqVygqQT41PC1uX1laY093cVotLX0ta3VkV1d5WntHaTs+dU8yc3Q2RzF5cipnQl41TF5oCitvcy1+I0FNP0c9ZiFRMTFqcWNeKDY7bWd5cikwXzhaXzl2JHw9Zn5JQTteZzg9OUUhYHN0RERvS2NWfnhKO199X3E8O0NeIWZlX2I5TEJ2CitMd1EkcUc0VWd8RDR3VSo+VWJ3Izt1P2I2P0NefHBGfj54RWJxcE9zZWdUJExKOHFSPUw/ZWYlYUp1SXVXKVUkMVVMMHt1eXBPSHRLYkJwCisjWWxWQElRSnErUSgkPXtNNCNwQzNkYm0lMzY+ZU9oWjNUPGhqMTx4K1FqdmFhaFU1LTtudkdnYVJuPmI3d3JXJkIqR3VAdklud0p2JDtwCitFeTIkXl84VVpZJktncV4rcGBiPiZAMXZlYmR7e0xzTSpUPnQtPlZveGdpfmR2UzdtYmEtPzhgcl8pbmNwPzZLX1Vodk49SnYxVzdyKkZsCismKmtqK3tObWx+SEA4PkVYU1grUnU4eXpZVCU1aHFTN2FRfC1YOHdYUkpwIXpkVmN5PWNtMyt7PH1rUkwmNDUoPmVeb1pjZU5oITZjfEtuCitpamNDPjFjZEQ5ZT1AeGZ1NFNwbHhZUFklNWBxSSk8I2U1fl5OYHRtaCtlVUxuck1hVypkUnk8P0ohJXYwKVAzRE4maT1NZGomelRQT1ZxCitFTzkoUWxIN2Ywcm1NRGY0bUM0WGJQPkdwQ3puKFpZfnJhempXKWM/LTxtJHtQbS0lfGJBZXpMI1F7K2V7eFd0OGB5QFJScEZyRzA3QWYwCitGJXM+ZmRFd2xDaEdeM0NweXlGRlB5U0dCWHFYRXBxcythe1NzP1ZrY19tcDFVOHJqPVl6c2x9K0FENER5MjFBVW84e3kpNXU4Ykg4T1RmCisyKmgxJD1KTnhVWCM4KU4hMGUzX2RtQU95bkJpTXpra19ANTtwTlVjVHlXbWolMXAtU0kjN3pKNllzQ2VzaExHPjlMc2tsSDg0dU44Q244CitYQk1OOVdBd01he0BvYWozOE4mPCpoP3RzayhCZ25sM3YxZ3owJTE3RD52YFoxSWdWWVA0PylzP31fXnlfeDBAdjcrLXBjTEtnfHg7YWB1CitAZjBKd3BxaHh1fmJFdEhgIUtaME4kZCF5IVo0MjRJR1JMeTlZaH5ALT5Qen0lS28zZFpONjYhWmRSdC1eLSh5dHppcXdEYDRIUWJvZ2xrCit2OzJ0Vjx9TExfN1JPV2RNajUxWWc8JUVINGNJJVdvbSs0UFhJNjZHOF52Xj1iclRSVFpLYkp1ZXhlQHJtLSpXa244JnImeT9iVGs1SW9YCitsYT1kTHt7c3JWUC1hPH02VGU3V319YU80cTN6a1hQPHFzX2k5bD99P0t4b042OG8wWSNMVGRDKCtlT2k0c21DbW5gdGtPQikkeWk3MUdZCismM0M5bXdHdXRyNUdrT0dhbWU4dTVTd3M4VXZ6V1EzQkNaTktxTUVCfXRVak52YjhLcncmYEcheHZuc2JvQ1MwZjk2WlJyMjNxeC1WPVZwCitDVFVsbEkwaHB0cjYxfG5ObTVSdWx3Q2BtNXh+d3Z4dXl+NkUlanJeZWtBVWhRYTdLfWhJdUgwcUIqSGNyJjx7cDdeYWJYRVNuK29oX2VDCiteN2toWFI/RV5UcEx7OWghWDhARnBPTyN8M2R3djgpQWs4RXFZTFR2cyNOIU9wMSMzdihwSlcqMkUmPCVqckFpUFo1OVRve0JNU0FiMVR0CiteJF9NT3tqPUZtbjYheFNZOEBNTSQqd2hOX2FaVVNVPHArcitBUTxVbSZQaG05bS1Oc0lCS280dl9qWiMpR2lRdCh0UGVobT9TdnR2KnMwCit4Z2NfPEc8TEIyMTRfRT1gZ3MkRTBLeWs1QntCMEQlTD1WQVlVRURQKlE/JDxYU3Q2fHApWUt6TkNnP0NedWdpSk11JUtGN1ckUHl9Z1p7Cit1fG5KaXc7OCNfPEc1JSQleTxDVHF5SlAoaiRVJThMKmpvUyY8YWMzYkd1QSpXQnZLUUdePms7dDEjPDQ/Y218dkxUTz5VR2trS3goOGskCitNTiZFOVE5R2I/clA1NmhJXmdtSj9TU0BhTjVQezIjR0AmOXExQExlLWdeMWFLb3kwfU5yYkhpe212WjF0ek9gaGg9ISFjY2olY1lkUDF9CitpYF9oeng1fUsmPTE5T2k8RVJhVXpaXio3UWhqRUpXJCEmbkFyTl9VZWVKblBsQytSXldVQT98JCRmR25fM2QrSnNMMEtTVXFJaW9yTkdjCisxWTEqTTA/QTRlMj1sUUdlVGslIXleOSp4O1ZMK2Q4WWtAWjM/eEs2JTFiM0I+JiFLWEpFaUhBZElBMkpHPVNIaFVFcUM3JVMkOGppb20wCitEUW10UF9mZmZZb3Fnb0goNDVYUUl0cj5PWkh4SHVwQDR4QjhlJUc+bmFpJURIKC1aQCpaMyFjPlgpRDIhTzQwbHdpJmczcHxgczMrblAwCis1MSh3SS1FeXkmIWZicjNGODhJRGRHcUNFVmBhTVo9ZD5pRVFOPig3RVc0NGlWUmpHaUFSVGxHbCh+RmxhdX44JUVBcHE7PSpUeUZCcFhRCis2Y0pYOzxWUEY1QXc2TjRLekJPQ0N9MGM7MFg/K2FneSk5PUF4dDZ1PGh2PmdfanBRMk1zT1R4b2liWCgkUGs/IWVHcmRRNmg4RlJpN3lRCis/TTtJaUAjVTVLU2RKM0lYRUFnVj9FcjtgdyNHXnhvaT05VWItOWZtc2tgNH0tdmZYd000VVJKQD9HMj1wP2V1R09nJVNgdjJ7MjRSQGEhCis3akBeUiZvQTtHVjM0PXowd0BqTW5uOSZTdjBPTzY/M0woZkYoQSZGN3xFMkE7ZFV7QSV2R3koe0BPKWUqYjZ0T0FTMGw4STFnVUZQfjBZCit6QihBY0dsQ05TQU0maUY2PGhQRi0tc0J1QCV5QCg3VlpuNURebXpnQT52bjk+PFdGZyg4RHNkN3YhNGtpan0kKFJrKE0zS3kpMVAxe3BvCitHNUp8JD00NEVwWGMhTkt6akxMcU00VTZDbjhFNzxQUGI/dU48TVlicU5fVzMzYFJgX0QmIXF7NSo9aVZ0NzteSkpPRk1RWFk/fSFvWm5RCitoSXkxbGd4QGcyQ3dHfWZ3QkwqKWF3bk9gdWpBMmhiMm9PT15waHx0TGwpUjM2WlBrQWZsMCkzXysmYW5gezt7TDZ4emhuOVNhZGdgQSNzCityeSt6WVhuQ2hqTTlpKyFHM2QleDBmV2pPUUpkZzB2QlItUkJAU2N0NlgmaHhrMnxUUHRxI3NBZlA9VWhYeUQlVlBEY1h5SHdtMUx+ZnJqCitaTT5SfUspKE1ESyRXS2NNUEBRd21GYS0xMWs0b3tYNzU7SCM+ZkBIfWlmUUA7YHFpRH48IUJGK054NGhoWTRjaUZPKUcjZCRHIWZlOUsyCit6I0pLJW9mX15KRnh8cWRCWEFGZlNrU0N7WUIqQ3EqP0pnV3k+bkZUcykwQkthYzdsfWYpWHY8P1gkZHRWcStHOEs8WFhCcz5pJHk0TlgtCit5PSpLYSNWNT9xUC1KO3J+RkQxajE7cGFiN0V0Nj8hcFppSmFqVEI4d1B8eEVMa2V3bkVaM2swSGp7QzQ1Y3Q4dk9KSy1Gd3l9eyhjTEB7CitKPHFHfmg+MGtQP2BuQ3AzQl9gKiNrS2B6bX5ka1hIJj8/JUY3WTFUZDBMWTgtdmtQdFAycEN+Zjl5b0xrQ1NYPHZVfUoyUUAwbz9HOTh4Cis+enRiPUBpS2ojMkZSNDZjNSp9UlJKaiM9ZHEzU3NWQ34rJFQ4Tng3I0BMX142PnA2c2haNXQqeEROLVkyM0o5TkBQTTlDMWo1N2lAJHxpCitCRW15el9xO0RPeXh6TS0jNWZAU2NEYT11X3pBSTkoRlRAPTJ7UUpMKihvY3tpezdhdXp2XilmSWYlSEA7VUJuJWomWDJLYDNPeUxiNGVnCitoSUZOcjlxZFo4K3JNPiNZfD0pfHlGRnZXaXh6SGQyekYoZVE5Vjx7UShrMSZZTHhzdnV2Vk01TzRrPzZRYjY0Tm9VIVVMMUMkRyptclQ8CisjMT5IdzU5JnpUSHAyPlhBazBHbWBBQ1ZqTDhKanE/bjJuaUhMfS0qOUlncEQ8eW05M3EofGZKOT1jJFdRdEB0MTdqa3JWcFd1SUFTOShoCitaSW9qJk5QfVkkR3t2I0o7cEwhMXVWfkxFWHdOM2ZERlRvbUI2bj0zTHowSG5yKWNUeDtlbyFgKVdiYSEjZjlOTDNWdElEZHohPjZuJX5DCitaNDsxaVNLbGtaek04KzU5QFVmR30/UjBEIUMkZjEmUGwoO2FgPF5gMXBrMHEtT0Jyc1ckJnBDKio7KVgkaDZKZEB4OHpJQWg3JT40PVdJCit4dWozaCFyN0Qob3YzRyRIYUdue0R7aWpaOCVFSjBQRkYxKUs5LShuMWg3PjBZNEhJMUZCUS0zWHFYal9zO2wlSmtUanBNUCpAcl9KTWJrCitHaGY8eGxCXmRuTylpa2s4PnlKPSRUWW9TeDt1O35UZ1E0ITAwS0J8O21Mc2pVZGFmcW5ocHhoTCslY3JxKldISn10SVpoVik2KGhqdXFCCityWnNxcjA5N2xGYis/PDZSezJVT3hUWFY5S3hKRU5mdjhRezZaaSorUl8wa2FLT2ExQnY7eCo2NztaUE0zZ1dKb1FGQm1yejUzbEpgSWBrCitEZXdMKnVLP0wkMClsUnM1Sm82IWx1WUhZVmd6S15aLXo/KTlWSllQYUVzKS0oa1ByLT5VRn1MTzZaeUwoR2FMazJudHRBNTVXK147dDJXCitxRllROGtJNVUpWkdPRUVNZTBWMHsxY1hDQG8wWUgoPGQwazJjPzRlJVI4diVJYD1pXzdxelJaOUY9cCk5QjghTWA8dUgqO01pbk0leENACisxZzxLJk9XR0JISFhlJj9QdXJWfjRTTzFRSVUrZ2VUOEBfZHtyMHBTeXVAKVJVXjZ4a0RnUzBzdChoOWkjdmg9dmRfTGZaNjxHd3VfVFh1Cit1U1haXnNnfjlWN2I9SV5zXz9hdyhJPGtoO3hURElXWGhkdzwtVWcxaDk4eDJGLSQmQmpzZT5wOCtGI05qODhjPlZ+U05rSXFMbWdoekEkCitReHloYkQhNUVVciVAUlc0OWRzPE8qT0hXfUleI2whU01mR3J3QSV5QzVVdWk2N2VkNXJ0ZGgkcyZGUDFPNlJ4SmwpVTx5Jn0pUUNRaCF1CisjeyZhPXlEWFZYckVgd3FKPj1aMm9kT2lUI1VfKVopSHhnfVpCWEl9UGVEUjwyLUB1a2x6QD1gYDBANzgmKE5KO2lZQFZNMWIzdmcxXmphCisyaztsTnFxbllvUWpYZ2NsPjgjMXJ3S04hckhvQX09NENwQl9xeXRnSnRRWT1EIz9jY3UzM2BybWUyYkJ1Jmo7bmwwVytpI1g5KmIqe3w9Cit2SjleTU5MZERKZUhAbzJiYjtgOXtXWj16fEMzJjduQ1AhcVRpWSlzNCVDZVZnfkdqMXtSbkFaWiNzRDZKb28zRCR1NithaS1xRWZBTD1pCitDbWZWKlN7Yj9UPDV8fDFIIX4rfUBUfCsxPWptd1E5Wkd4OD4lYWBGZGNeJn48eWRHdHs7UFEmbiNfSCs1STZ1aGQkKzVVfik/TH0kTCFpCis5TVhTXnYkMDYhKzJzfEBBVU1WSG5LPGZPN3JEakhNWUVeS0ZYPjsmZ1QjRDRROE1SemItYzB3YkUxZzVQdVlaNVFEPnVaMHZGPXcxN0hzCitfdF5GUSZVWn4/NG91KGVtUD5QKnVyKzVuYH0yaVZ0ek1lcnFOfTFRPTZacT0+K0x+X05+d2k4XiFjZihBSCspa1l8SlRLKTI9bmU/V2J+CitVIztNRntMcCNXRGBzY2Nib0JDUTtHJCN8IWNOLShnVldsJVk4Kn0taEZeNz1OQGs9d2xJb3dfTUMzPXFBTXR2XnBVRTVFVVA0YVlVNTNECitaTiNsMmFlUjs4S1FPfHcmeElXNFFePTImV2ZGdTFPaUlyKiM9UHxlcjd7X09GcFhqeHgoTj56Rz0zcEplSUU3U0NhSTRSYnhCSFMkWCh0Cis2bExxSWtKOD9gTnVGNVlwT1U/V3hAU1lnRCZ1c3U+Jkh0ayZzQzM7dGZ+TnpkNzhzND1KQilndE89Jnk9Ty1gWTJqJDNxfVkxQCEpUXl6Cit2I2pFcVdWN0QxOTdWSFBfJkJGWngmVElxSTstNFVAUjsrU34jKzYxSCg/c15gUz87KT1ofHM5eGZJenNCNGQxYHgmI3wldnlUPD09dGJiCitTeGxgfHFZaX1sTWZKemw9Y35HSWAkTlpXdn5FQFZzKTZQbiU9eT99SXoxUUlNVXRIQS1wK2M3KGp2XlVAM3U1bzNjZzYrczZReGY+fTZBCitZUWV2fnlIb1BjfVdRXjVEPUFlNlBqKU9uO3RKcyMrSj9vezE8ZSkyOCtaPF9NKloxWVRwUlg9IT5kIzdTUmtOJWNFeT1rJEFPTEMxSiFNCis5fCghOzlNKykjPT9fd1dsKik+fXsxUGVmbHNafStPWj9YVDxeKm5US35FWDk5YDxsfXpPUkZ9TyMhfD1qVlU7RTMlVjlae29qSl8xbGAkCitrVy04Rk41VFEpJHkxa0ViV0lYRFEtOE9wRTxxcmhBaDsrNnY8PypjM2UzPiFyKWRpZSVFaD9xOV57SVFhQStZI18lY2hOUGFYZGVeQXApCiswYnhKOW05dzQqIVBGMjwkd0lwaXxPT1g+OXN3ZmdUNChCbytoUFJSbkAhdSkkTzlfaWxOSzJvSGlrI3NpWDkpUn1EdV4kOyl6SzN+U2dhCis5aD84IyZULWEqVzw1aE8jZF5Mb2UtSmBZWXQzPzxjJk05Q3QpK3ppPzxSMUluJCtMcXNyQE93X1IjWEpwTzNXPmY3fTs7OTFpMDw4e15uCitAP2Y/OGhDPmQrMDxZbVY0ZWw4PWVRNVBDcnw5cEJxMiNmWmYyJCVOMUdGfnp5cHVPc0NSY3M3c3pxQHtPZFVBOEMkTjZyY0xzc3VnKEJTCitwSGRhZEApUTFxcGYoejhNISZANCskMW07aDdBT3RkX3stPC1PWWdPSE1EXz90QUhtI2skVUxPOE5neXFKVnY3K0ljejQrSmZyVEZzOy1iCitSMG1mQm9UUHp5RzVwQHZxMTYpYiozMntRPnQ3REpNZ0ktUXpQZHQtdD5oZE90YVFxVzM0YmMmTk9pJU9CRkB5RHktVHJYX2lGOz4ydE1SCittLT09NFJyamtTI1VYTjByJkZUKlZaTSZ7IykoSXRIcmRtPDxKTD5NM0thYTw5SCktdnZ9VTBtQmtkdmQ7QyU1PWVeZHZiRFR8P21BX188Cis+LWdRIyZ6SWtCVUIzQCNrMSUlKCVwRmM1e15hOzgwSWstIz5ydX1xUGM9K2B4NF9nPSR+LWN5entiYy16YUUpfkArKjx+JTxPelZzcWNUCisoQW9fYlRgIyhAaTB8WFFSMDAwTzheT1k3eU5LeSVtMz0wNE5ARyRAWUl7Kkx4YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoCis8KWIxITNQVlJCPztiVDRkU1pmOWIzWS1lRnxYPD0/e1opOWFgRV52QTZUM2Jgd05FVXdBdWpyYzgpK0FMNXFpKSY4Q2M2KVdmZWZfLUM/CitHWUpyIThTT3BvKStAbEFNSXUrVylAYWs9KkxqeCk+QUsrTHlzNFlgNHprSkt3bzxMK1JENHt2WXhGQFdiKGBJNXxFekppUjs9P0AhSlN7Cit3VzR6VXdOO0ApdHdlK2QzK25FUTZkaHFnJSl1a0s0eVEkTmZQMXZ7cnhKOT1UVnZFVnhHaTBFeVd4JUpEeVFKUFVBOSQ9Q0FzelBPXyFXCitNUnBefjktRUxxKW56ZXttWVNLM3YkVmsxZTN8OWQ3Wj9galN6ZlF0YX4raj5BKzhAUGkoT1l5UFBVZDBhQ0tMVCo5VUtlb1h3XiUoSlFfCitxX0xEP2hrWmQ2P2JmTlJGZFFuR21rZm1pRlUjfTQ2PipDRUdSKXFLJTx6S3trb1pSTnx5Pzg1dHVvUHRgJkw3SVZFTTNQQnMqP0NSa01hCitqJT9JemIrNnhtSnI0Wnotc2hpb1AwUTdVcjFoPk99aGgkdXlyRWBHXiE9LSszSF9+d0NAUl9PeGE1YjlGcl9sNG9gIXw1aytxNjs3dUE5CitTajdNMDM4blBVMU9+UHZXXnczb1c4VEVOUUt7dnJIV2tranBnP2FnQFApI3FLK3lXODVkLVV2KnchTVdgS1Z5c2EoejA9YSUybTRxTUpUCiskMTcmZlBONE92WEw5am9uOHVUcXplKEptRHhMUmp9SWAySyk8MV4jSStXeUxmQDxzOX5LfWhlbX1uWT9kO1EpKmd5UiZlJjReaSpndzdjCit7MF8yVThoNFN1K0VSU0tMPHVlZ3FST01SZDtvQTVfO2A0NkBFYkp0LXlmZUdVd3RPQE41QHlFaG5KVik9PEd1NWl9VUA5dEspLURDO0ohCitUe0x7dHgrMiFHbTVTTG1UaWl5bFZre2dPfFZEZGYjbE03dSZhWj1Rd2VAMSE+MDhBRipGOFpwRz1EQ2hoUTZmVCVFRlllZiF6ND5AdDlZCitTZTM0Skh4ODxBJEVGVFVrNVk2c1FWJHU2d2V7UTQ7UmBIbkJmNTwqZT5CfCE9PHA/KHpLITFQZylXd3xmalhHS1koQU5RZGZDQEYpdEc3CitPeztwRHdYN15kaztXZjhCRFp5eipkSmptTFgrVFY7dXUtJGkqZU5BVlBPQSpfbTNscTMmZ2s/RGQwNiM2XnJoNjt3dHRrbURqJUVBYTFrCittQCtQKXhUV21hK1JtbWE9MGdvaHg9PlRlWjU/el5LdW97QzBkem9Pa1Y0WFJCLWshJU5MY1IrN2tnZmN9RG1TMz8lZ1ZhdjRNTkQhTlllCitVTnQ8QmZ8OTtiTU9SSHFSZCpkQlF8T3ApYVZwaFZ6RiNHYDV3TjlYPV8pKFIoWk1qflYqdFFMbUxqfSNiJDw7OWYxaXhWUF9hUzxlVHxaCitNO2R2KjNvUjByQlVfPDt2eSFKcSN6dWgoSntWVzhzOCQ3e0d8M3pqYm5GOztwVHgzUig4UmMoeDRWd3ZURy03d3g3cWJBQCUkRVYpY05PCiswMF5EWnVsQEF5MUwwOEAkWTNnMEo/OXBTc0clIX5wTHI0TndfWmNsTkdSN1NwKEdsKVFKaElJK21EYV5fN0FlIStTJT48cSVQfjhRUjJ8CitQX2BaMzxPRmgwaW0qIUBDVH5HQCpoRk9wOUd2blZBcThjJnUqV252bns1NHpXaC1fJmtGLTFnakEyNVNtPz5BdWxrfnN8SD5heEtLYyhmCitKNmxkRVNUV2gjV2xxPnRJU0xoNnU3fWB6eSkhalAhaShBMTVoZG5hUzNzN3I0LX44PFBfdS08UF92b1R7cEE5QmxlWW9paF8hUWloQGNBCisrUjFaPmRtKz85c0QpNHFYJGAhTD1wRkxtdkAjUkgzYDdNKTF3X09NdkVzSEVmbDh7LTVxJD5qVn1PUyNGQGd6RnR4UzwjUD9APFZHWjBhCis5aSZTeElnd0c/YTVxKURhTEYrSSNBIUp5ZTAwbyh6KDdqMXpXKTNwfnMqPUV3SW95KHpNM19NUUxRP0VOaWw3QyFMLVhLKlN3WlN9bXZ5CitFVldDb3JEblNsekdvdVVoJDZ7Kjd7STFgRmdzN3xtPmpYP3A4JFpVOzkhXzApMT0+bS12QyFsI21IQUxeQWVuZGdnWEhZKzsrTDJZWW4/Cis1NW1ILVkhWV5FT1ltem95YihRfFg3TlFoVW1AJEJVI2Z2U0d4U3NZR3FEM3RsRWY4TDcjdCZaWFJ+TUBubDd3TVMxZ204UjdjO3VBPHgqCitHKHg/Nks1SlZsYzxfWHZ3OXdecl93SXNuPDg3MTVSOXRrPGVnWWBBLWMyZiRaalYjUXxiQWBaVGBnSk0penNCcHtuX0NUZkVHMCg/Mi1lCisycV96R147RShNQUFkbjY/MGxBJEk3QW92a0NqZzZ5NFZBWDtCUSNKaUV8dHgkNVFjb3YmcWdab0dFKUJUe21JXjtaODctUUBXak4rfnVuCitENllRdjJ0KTEjeTlOS1dzPU11cUE1R1hpck0mP1BCLXF2dHdTX1hkaiRWK1dwQGc3cSp1YkAjQD4pKjJhNEZodChQZ31MU2lvKjYwTGlaCispQk9aTUY5Tl5USz8+Y3ZNMCRifWQ1YyM+LWpmIX13eGdGdmxgOEc2WTwxVk4zVXBNJUdJbzBuJi00YGNZPkJOJTMwdCF1Oy1rZ0RpYU9gCistPThzNGRyZT5jRHVlVzB4SSUpRWE+cjt5XndaZiRYNGh6dDxBQWNsOSg1YGc3OUwzdk8+cHBFSUt4XlU4bFJmLU8xVntqVjRmR2UjdUshCituJTw5VnBBKz8rNCRQSjQjSVcqK2cpMEpHWUk0KzQjRk92VFg0ez4wc0dHSll9RV5XQG9yclEyOH4+RUZNVHIrNmJyM2BLc3VnJnVvQ1QtCitRQWNWfWdsaU9QOWxkbWg/bzBOOWpXbGRMT0xrV15zQkE5YD5gYyQ8IyYkTG9zfG1Ma1VhayY7SFJ0YTFHeGJNYENNJkF4bDFIK3okIUdpCitKKj0rWn1mOzlyKDhSe18oYGE1cGBmbnZVUntFeyZmR35IM3gzSj5wUD5SezZlS3tveTkmVmBMcmN7fjJzQSspQ3VwVENtJXd9JnFHe2g1Cit7Nkt+VjN5WDc0cFNRSGBNTXtSS0UrLURzbSQ/NjtXJGJgc2NXXmteP1VwJC1nISg2e3hjOGVjcHNKdFNfUUBxc014XkFHUUg8SVBOanApCitqNl9weTl4dGhhYCliX3ZGdzx7fVIxbXZmWn4yRCtoXyRuZk0weXs0QktWQVpZZXY8PWJQWUpCNF9sRk1CPlB5TiozMjEte3Z0WjZ6OTlICitCK0FRJXxZSCRXZUBkTSQkaHRFSWBoRXhve2ReRTwySU5kbTxKbkFZNC0xZmE5I098YEQ8cl48NUZnOHYlfHo1Qmx1eWErc0B7ajdxWkgtCitSajdQUlpzNTBQbDQ3bnI+ejkrfDNmVz1DfEw5dGlYIXxobTFMbzBeWFhpN2dTZ3FaN2loMUtyWTtiVCEreyNkZjFBN1dKQ298UlkjYUU8CituYkhsUXJuOXNnRXZgMT1fMSgkPTY2eytEc0YtJmVAdHZUVFNjPE9sM19XZUpoc1JLS2MmRlJQOHJBJXNGbE1SQXlDQSM5fj88ZEk9SX48CitzNChBT0A/NXg0TGk0JSh3ckgzSHBDJFFCfiFseDcoU20+OTJ2Jl9UeFBLeTUoNGVZP2hjNVYlQ1NeSSlKMy0xO3tOMF5oQl9fREY1amYkCiswVHorSHQ2MTJaN2xeU1JMQEdZYDEhejEmKk0xQkg0TGxPb3ElYGQjdSMmOXpSQVlDZyNvdnA0OFNAdyttKUpSdmwmalU5bU5XS3NsO0dPCitVVDkwZ01jVEg0XiFeZHslXn1RQClEO3MhI3dYWD5xOW5TeG17XiQqNW1RSFJvfU5leU9wcDt6XmxHWlhhOHtSc1JOZlRIK31xRFBacWpXCit6VEx+MUBpPCpQPWRTM01TP0UpK2w9ZE5MUDMxWjxjRCVRVj52cDU4Q3o1UnUrbSUqJEk0fW82Sjd0bzIqfDstdCRic3tfJkEwcE4/OU8pCitBbW8xO3xOXkU2OGJgVyZ5ZWZXP2s/U0hibUZFe0UoNVFIdD4rWj8hTzdTMDZnTW1Kak55VEpAMWEzQGZFX1BLTXxFJWBNRS01VEs4PXVYCis1UTQoZ2o+PnZrWEh6UDBFNyl5QmBuRjU/X19lPGNRVzlvVno0T0k1ZS1IYEQ9ZFUlc3QhUlE7QFlmaj9YYS1QSHtvc0ZwKGk9UnBNQloxCispWWUwUiRHVlRSZClWK301QFJUYjA8eSF4bldROWJmR3pBTFhEPVZmJCtRO2htezVASH08YWpsPSYyP0dMOE9nMWk2TlRrVFJCR1V4SCgqCisqe3UmazFFR09sPzdnYlpKJktmLUFMazdRc3xyeWM9Plc2elUyO2VpOHN2dG1UNyNSSTsoQD43dkUmTTh7aE4pb0E8XiVZMSV4V1Y0aDkqCit3PHBCVWJMYVc0cFpDUCgkNU1VTFM8Kys5M3dyK0hWXnJxeGNXOEFWZXlBa3h1TzYyMUpXOV45QkJsbz9GNmMyYGh6QzJmMnxiY2czNFBJCitlZDY/ZVA8TGY4N0VPaWNucWJNbn5adlltJEpkTiUoKV8qI19KYk9FeGolUlBqS1k5UTB5eCZgb3Q4ST8kaztpdWItPzBKU0JLdWFuQzUlCis7Y151UzZJZWJMaUJrIUY4SC1oVG01TzlLUUgwMDAwODBQfmQ9TjFVRndXQm0mTjA2aiRqMDZHOHcwQn50PUZKRT9MWmUod0FGTEdzWmIhCitCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwcG9XVlF5eipkMihyTlktd1h7Wik5YWBFXnZBNlRXd0Y9SXVgeihVdHdMZVlBZEN6P1R+cUN3CitJMylLZFFvfVBLdm5oQUQkRTNrSXdXKEcmfFlANnw5emo2I0ljPXQyQnlxYXN8cTRSO3Y2NUptKitmb2hSTjJKYC1pPlRlfTh6d2p0PStzCitQdE56KnlROTsrNHtWOS1tYmIrJlplbih0QylZX0QmRG1aeWkmO3t6PExwMWxkPi1OWV9WekFLcmNzJllZJnVXa3Z9OUFyWTxwX3hWVmFaCispTSpiZHVqcHh9UyZSS1RGTnszRiFwVHVQYGpUVyg/SHAkV2dtLSE7Z3N8elMqWElXbk5QeENrYDt+QmZXdVFjfGppZ01EbXhXYG1DQzQwCitIfGlpej1mMVFreTRaTUhqfnZrQSEtWSFWbDd7eHpQfXA2cTM1bkoxVGJhUHd2SD5KNTRySkM1PSU+QDFtST1nQlI1JjB0fjQlOFpAZW1wCis1NzNfPldNe2xnbThIPzxzMG1jXnRETXlER29JdSgjfCF5Sk9RUldxQ1lIaWRzRGFRTC1xVntXSHJre3grSz5TTkdJKW0oSmkwU3pYNVlaCitKfWNMe15UUCZpVklsRS1wNlUyITwpMGElWHU9ejtHPCszciR4LTdmLVJgOHhZM2IxQVZiYUBMKWJ3RV47TEE9dk4qd2duKV8+PDd3QlBmCitUZDNJQGpYcCFKVXEmVV9rOENiejs0MnQ/JipzUVJ1MTBQPEwhZHBLdV9VZTMtWFFpa2ZrSFU/NFh8UkRGfW98YHRHbEBtNFVsREA0bG4qCitWe2RtRTRQZD45eHlPWVc4JDtJY2xrVlR8JTd4fTktQ0FTTWVhS18rTzk7TXx5NDJPY197bUlAUjdfc35BQGFYWDNHZypJZGN5WTNTZSRFCithfkN2MkNVP01eTlpfZFh1JlBUMU1VJD1UYG97eClPaGFqWmcyIUVePD00ZT1GSi1lIXA4RUgweURVZXZDQ010VGJ2SUc/ZWI9eGRCTFB2Citab0xWaThKWWFsY2okPVVJQVBgSExZc3BsP31uI25QPHcqfCQ2YWM3VlFLY0EtVioqOVlqUStkY35nZ3JmQXo5NFI9KkBQcChFc3RAS19tCitpejJvUitKPXF5bzw0MTNjKzhDZkQ2VnhvfSp7azU4RlRhe2dJQHk8dzVhPik1RnAwMl9UYlItJG1Da1ZMaEh4clFKayVHJGtBek1+ZylRCit3PWJnMGRIbHdzMGg1Mno/VGhSKk0+Kmc9YHhrclokdVJVRSpMSXhlaktOTDVoOGxNeEhHPFJ4eyE8I01rKSVmWWs4OGAtMWhxOXtOMjFaCisrOWtkV19mSHApTXBeYmVKYXh7U15lS3YjKTRJZUBkRihOZlArIUc7UFZweGJfQSU9dypIbyZqfWg3Rio4MFFDYjU5ZlY3KjMyU1RFNUpRCitIVFgjak9ZVHd7cDl0WlljdjJxVVNmJldHcnUyS0I9Y2BwMT07MHIlSmRSdCN9VC1CMk0kdXcqMX40eSM1R0E1a0NGakZ3dzdnaX5XIUdLCitUbVY7JHcpOVZhWFVYa0QtMUhDJnkhN2EqaWdANU5lTCQ5SnR8NyVMa1IzNXVEO2ZUI25FbkUrOCUtRSs4JS1FKzglLUUoVTBqNk9hPi1sCithUH47bGRAN1hoOGhXUjMye2o9ZlNBTShpNk41Q0Yoa2x7MDdDKyg0aj55cUhofTU/YT4xfXQ2RzJTP0BjYG1HNVp7M35rfXJ7YmlSNFFwCitVbjJQdSQoS21KTURpdClGT2h0T0J+bypWNUtHZENPQmwmdTBUWGwhI3pIbUxRMXBAaSRRckM+YUZ7V1lBIW4hJU01U2c1SFNuRFk1fmJ2CitrTn1MTkNoSzUpJSNEcE94S3Mqe2AxTnV3cXB7angzM35CJjNNbjF2YDJLWF5KI14zLVdnVyhYUF40bFJ5VkwwTiFjMVJ4ZzVpYl9oWUdTCitBZk5Re1FpT2J8em03PWEkaFcmdUdGO3NkKEktO2t6NTFGYHtLVjJmOTN1REpLZ15TJmppSy04WXU9JFZhdjdCK2VeNF9PU2ZGOGRKZWNuCit8U1RNUWJhIyQ3XmRtWHpJR0heRmR2ZHQ3O3Q5Yz5UJV9ZSH1kYnBlaGNWaWwlQyZOfmVtYURrcDszQXF5MWVScGQwKnlobnNaQig7azMxCitYPDgheH1ZSVRCMmkqQlZtVj9zZi1eQjZGPGB9ZCEtXkAxVTlnUSMoKHN2RnAyXzh6VHZ+RUA9N3lTSllaQ3BRJjBTY0wlV1g4PnlVKzJJCitvbEt0QD05eXRPI1Z8ajxKYndYPmBgIW1QOylJR0lla2VzTGhCPHQ5SlBNejtGVkUhaXd7MmV0QDlVSmVOQTxsPGN+PmlMKnVXZndReF9JCitkOTJGUFE5TXdiRWRAZSMlTUAyPy1OQSpJNlF9SSM3SGF5eyhNNEA9MUR5I35SSX42fjZkODRZLTBrOFBPVFNnI05ET1YoLWlOd1Z0VVJDCitlSnlqMWhWekV0PGJ6XnF8bV4xbmtpKWg4d3RsTzVXRChNS281NTUmfk81eWFOUzZVNWxXNj02ZChNRU9LT3Y9bVM8MmNsdnVrMGA0bTRXCitlJmlCVSVAVFB7TXtwWGh0RnpxV1M2KnAjSnVTJFluNWlDWU5WJmBFXzxLUGhQY3VmdndMXkBvY29ral9KUXA+T1czZnRqeC0yJldpWll5CitFdlczI1QjVVp7eyNKM05uVnJ5aGN4ZXZodWViejd5Nz43YT5vPnErZChpSSlCUVpnWlN6KzMhP3krRUxIRT02SXgzVHx1YFI7NElwLUtaCit4aHNrIU57XiFTeTAofC1rTmQjYDJRWHJzKk1EV3hmV243e24rTENrc2V8Sz9OYFo2XmtqKmZjbTktNjZXVnZyMSgmdVgpdHB6UnttUmxnCiszaC19Nko5bm9jPlRiMyEqdWlGQiNlaGlrKXUkQmVsRE9vVkopKV43TGk5RDRqLXJsZTBVbyM3PyptIS1QJV45V1BaNEY7eGZPJX5zeTYhCislKm40fWQwWlBUTUk1UmJEIUF6YiFpcHRHUlBNMElTZzhvU1omPVM0LWB5eEpybV5sTHltZFRKYktSNSlVPXgoP1VDZm8hOyNIXztZTmtFCisjWEhTaEo9RDU1Xz1ZT3dGUkJWYiszWnVHVHswbnB0cEZxc3FIRjMqMVFqdH1KTmVjYUomPkI8NGNxcmRGbXQzKU5MR2R+UmYrYzJBU08jCis+Rk9aej8oVnlleVpIX0hjbEVCJUMxZFZBWF5KJGdNTmliLXAqckpxaUMpKyNZbXpQMUc2SDdIVWBwKTVPMVU3dHZqUWBmPDZ4UGBkMF41CitiQW95T193WWVDNjVRNztxNEZYY0UxVlhySnw0TDs+RlFTKjRfWTQ1ZHtFPVR1OzRNP0oxd3lON002Q2tLVD1jWkl5NGspQVBjZngxKGc1Cis3VV9GZ1EoYmsyelBIYndZWURQZUBlcWNtanVMfk5Ebj9qPF5pS14wVClUIVQhMlNxI2tRVllJd1d3SF5kcU08VHdWXyMrQXlKRTBwcj5ZCit+fSNldTNsLXAwaztyI2hjbHAyUD5EXjtUb0VSO3FWfVk3JXwqYldUKjUzKSZSdypzRDVOc2JCKlo9PT5AcSpmcWdALW9gKjA9az1McSMkCis4ekVifkVENmtXbVlMTEE2ciRSZHA7LVJIWnNLYiZLOF5IK35EaDx3VDd3KipTIURhNkA2OEZIZHd0eDxrNEh4b19IS0otdXNONmRFLW1fCiswSDYrJSNIPHAmK1VOTzVpbncpST9ZfE93QzNiM0hrNTVAeEhLKWBoOSN5JnZMfDY/IVY/RG0+Un1vWVlId2BnSz0+dmVKZSNvMF8/alZlCis7am9RP3tYfTVTWHNoVFd2Q1Y/Q1dfMDFyUiQ/dSNMRUJ7XyFUentPV2tFJHJ3dSpYTGE2eHpaUmgwJChUKyojfFVIeVMwM1JWbzwjblIyCitZaipoOXU+I3hsdyZibERDIUBTdWk3TCFoLUYrJn1MWnRgQDw4eXVLYi1iTG16Pzs5aXYxQnR2dmdQakZhTEUhNlg3K0o4ZlcpNmBaMXpvCisxXzZ4LU5yc0g+a19ifTlVNjdkPHh6WVR4YmNMPzBjVlVIdlh0YW8taTwpYEQpbXlDN3Btcn5CNnZFaH1xcHdYWF5wZUtLallVQHVnNTdQCit7OEIpRUpDcENzOVIzP0ByQ1JeXl50QGI7KzJTdjJvRGwyNXombWloKUE8QHtlY0AzJVdrTHVpUj5RWkdwUG9VIUJkY0RqOHcpOGFTe1MmCit6KkNaNlYyTGF1YUQtX2Z6RjNuU188VVYrUEooSHh+bnl9dUcoN1l1MUJXOXZacHxFay1HMmNTLVA4aGxhc207Rj5zKlFNNE41WTQ5Z1NQCit4TTJFYkNhZkZuejhheCRwalNrdCU3KFUkZX1ASHElKClUU0FLYikxS1okbFooUjlHdkooLUVfP0d3JVVaVHs9X19IZHhrdUItb3tFVk9ICis1KlVQbzRRT35xfDdGWUJ3MXk0RHc3O3hXUzgmQDBPR0xubXgtUjNeWjArYTlUS0dQbihifnYmaXRVMF5aRXd3PCtYbWdHJDJSNk81N0lhCitDWUU1NEdJckVqbCk1N1RNfjJkZ2J1byh0aH5eVEQmYno7JWh0TUw1MHhfUEoyODhjSlVPaURhRl9jeUBOOXojUzJAJDZKNE0rcTF5akp9CitEYnFiPHEhS1d4QENSWiY8KjRSJmItUTh2e0dSVVZycy1oaX09QCErfF5RWnUyVnp1UlFOVm1XKj1zamZEU3RqSj1welUoPFQ9aFBodGlyCis3d1RIU2tUK2lHeTFCLWFhODhYVXkkdjcmN3FSSnl8YFpfKGBiSHs2JHlQcVZuWGpWTHpyKW1oeEZ9Pk82V0AqRlpSPUdkZ3VLcEYzVUtGCit6KEYpR1ZxWTBtI058bko4PjljWGBiRmc1eSNJT0xyfjApJV81SndPdURJVTt7SzN3XnM5RS17Y3VrZzdFKih8eDU8U2klPVgqeSMqckNKCitvKTdQVT5JRFE+Zz9pfW00N2dxYlN7NTZMaz8yekZCSmJMU1NobktnYiFDPHZGJlRsPmI9KigwJFJhcWV5IXRofWlkZnk4RjMwdyRrVX5SCitGaGRHc1k3eTx1dGdYWE8xS1ApaD5ANmFXQUsybXRleTdEb3t3TG1nIWEwMDJ9bTAwMWB0MDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhCitPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1krLUleWEw0bV9ZaSkwMldvI35SZEZAKGxaYChLJHs7cHAhKmtHe0Bwa190TmpfbmxwQTxaVjtWCitBQ1hVUVdYN2tQOzVGOHN6X2MqWnQ2U1NmNF8mNERVeTB8b2tvaiRLX2Y3ZCQ+QjNJJmtUcE9wfW9FS0tZRHhtPyk7SzImUURHK1olKm0kCisjbnM2bClGSGQpPzl1SW1wc09eejU5MSlCbFZtT14lOzxnY2sxJmI/ZTEzZGYjbztXLWxheXZyREJfJUVrVTRQRilibHZaTChLZTVkPVhLCit5NmUlU08lM0NsWWU8fHs4N0ElRFU4enltdmtMZlo9aXdeKiU+bSk3dlhRPkVzRntpdEFmIUlfUHEhTWVuaE5fMzBVWSthe25AcS1sWGNhCislODwwenUzbCs5PT1HTGUxfV5Vey0oQitrP0RaVXJ9QVcmMjB5QSRsTEFwWG9ZYD8kaHYqVUsxP0xETnBFbm9qKVk7Iyh6KjFnP0RMP3R8CitlPVdSMHp0Rk1nOWNDLXExUSgoSlk4NTc0dEFGO1h5PUJLfEtGOE5pcUwxblRMekQ+e2BXaHhGZkMzTWYjWDI0JlBtVnBiTD9+UWhGejFrCis7MHFuKW07P01GIT5eIWk4dkQhV1ZEb2gqQEleNE9kNHt0RkAoKyV6ISZWa0FyV0YrPmkjMHEzX1pqVG45e2FFYlAySjM3MzkpPkx+fCk4Cis/ISlMY01Ua2JLVyopUnNwZ287YTcjRlkpOzJzWUVncmlTTEU0bVozJUVWJDd4aj12e2VMVFBZe3AhT2w5YmJOO2tIXiNMQCNYRU9IO0BJCis+NylBVV9yMHtXeDZyMjtoTmBwOUchKkJxK0tiQFpaanYyPnEmbzluektTfUcpJlRsVklaKkopOVlEJmorZUxUSEFLbHlOUkpmLVVvKTliCis2NygqdlIjQXIhQHUlcj1yTWlXaCk8T3Uqel48VXRyXnJSJCMlLVY2cHRiOXhCQTIhd2VpTFN6JkxTUiV7eXZ0ayR9QHFPVmhyZjVSblBgCitJRXQkejZJJUwqeCMhdU11Nks9PWkhd2BxX2E/TGs2S0J7djA2JEg8KjRGRSZ6UU5CfXdZaSthJH1TPT0pPkxeKkNlUll2eX41PSkoPHF5Cis4aF8mXjB5c30lQU55WUp7JXNFJVBOVXpfN0o0TzQ5U3l+aUxsQzZLQF9jTm9gXzYzTmE4RTxNa2I2KnZzYEA1M3hvaj41Yjd8djdyI3pMCit6RG5idytkcmFne2RmbzVTSWJwQSVVM359cTZLc1hjXyNgfCFQISVpJldubHNoJi0oMWlMfiFUblNeenxUIXhVbTRlbGF3PFhpd1A5e3BYCis4LXpIWm4pK0dlIVp9aUg2T1lVeE0oRTNhU3pQKUZfdl5OUkVCI2lJQXEpOFlxVllzX24+eFNgNVlpUF99PTZQclhtbk8xfUB5dU10NHNwCitqQSF9RUJBYHZfd2tAKSYxd1VnXn1wYjcoWHttejsqS0ZAX0dNX3lCRSFEZD9NRSsoWDBFRV5DR3hZZXZ2OEAmRj9uMH5HRilMb30lb2FFCitET0NXZ25+PXBeWShpaTJlPTVodGU4cEFVKzwtaFQtOERxUzZgSkJuKyhjcT1vSkxOU0lNUzBVITRSR3VoO2c1OTIxQD96dTc9U1dYMms9Cit7RmRtZnVCUUE/U3JjVSs2ZDMxJjlxPyYhOH1RTzMzS047czZHJjl2U2VXangoOU4pJXBMZ3xWQE4jJEchNCl2VlNLMDwkUzkldGxMQlVqCitOY3IkQEFhZz4oTDBtZEdLO0tZQ08odVl4Sn1Mc3ZJR3wrO0JGfjVlb3xXOXBWR1Z+RVZWREQxPTd0bXtzYTE7TSZaUV9DbE1zTkcpKVZmCismeWJsVCgwYyVKYTI2UUk3cG8hI2tHJWh0dCVqN2YwNCQoI3VQTzFZOEE1fDFESlpJbD1wMkM9Kz1TTWFBUUh9bzNzfWFnWi1fPU5ve0hSCis3ZlJVQDNXQG0oJWJDbmJFJU5eJUAkR3g2dDIjNTBpeyEyPDdSXmVANWAkR0lXbj1HYkk+entmK1QkRlR8cmg1JFBsZDBzSmAzWEdhbDwpCiszJXBgTk40RWo+U0ZCWGdHMTM1KlRLS0B6MmdYOUY5TDwxbzNAb3M7cmNyYD85TWEwMztxUnpqbT9CLUskMnVQMjxKP3ZkOGZeTlpkZj5KCitMI0AwJl5vPjlLZChLTllQMWMwck5udVR3bD49d3VoN3hQZm9EQU5UOTNBP3ZmdT9BYTB8MH1OZU5jZHReT04lJl9maXduJS11Z0lpXkBDCitJQUErbHpfd1hYcU4pTDxpRkhfMTBrbFFvSWFlYlM+ITB+MU0/NVB8eXQxTj8pI3pLdVc9QChNRyY2PFVkQy1kbWU4WWxAZn5uSlVSckViCis4VEshbnkpJTBqQmRkemNtSj5jfnkpYnMxUkQtdzQtJWt5VG47O3krOGB7VGV3d3lUaDtSO0ZnZjBAdGd0ZW0jPXxKTjlPdGBfPnFAZGliCitYR1FJVEZ1O2A2bihMfTZQXiljbHhQJHk1fmw3U3RESXFQYlZ3VzZVK3tHMmJrSnpSbX5ybiU5O0dURUZfLWN8S180PHZYSSNvezhGbUVvCis8U0s3TD5LT2VuSyM3bEY1TmBtS1VAN1MmZXAwRzsyPj1aa2tvdWNsKWwmQ1Z7NVVee0R1K1p2d3A3Zl9nPT10Pk1QbCl7MTJBNGQxO1ElCit9QVM+WEo7UyglUSZkLSNtWDkxWTNJaU4le1B3cm4rSW0pX2JkSD5lSURxT19xTnJASF4pKEthTHs+MWBwJihQUzRebk4/XnxITFlhV1ZPCithckojbFczSVVfP0RMOV9MZ191ejA2a2RIUnU5eUFeRENYYTspRU5fXnZRdThKWDQ/RUhDMUNLej42KT1tdjh2Mj53OyNheWpXRkBIa3FoCitEc3VhPFFURUJhU09sNSlrRV5jJGNFWTlfMC0/aT1PRC1SVVl5eWxRP2ZnUGRwJHgpPUo0KmV+VHhuNSZ4e1R0QFMxdHFOYkh6VGh6bHZmCit9TWhMO3g5cXRJbUU8aUVVSVFQQkliOWRgfCZvTWFWUDJMfm5fQ0pidj4oMjxHWDhPOWRfYUR4RiZxVkwpalE4YHI0NXl4Y1RFTEt7bTNECitkQl5KcGI4eVUpd15tITVsNXpwMHNVUjh6a3lleF58PkYpZWZqcG0yR082V3d6I30lTUJ9eCY3V0I2Nkl5P1Nzam1mWlZ9fWB5WldiS0hKCitnP09uR21OSjF0QH1iLUo/TGg/QkBlaWppQXJhNEE4TUE5elNlP3lHSGhvNXcmfD9TMGp1YUB1OStLVjJwYiZlLXZqSUBzQylhV1I4TmhICisjQX0rR0Y0KVBgTFpiYlo+c3RwZHJ8eGZFdWdYY0BuJmBEZUB+Y0gtdVIobmAmb0JNYG1kMnxMWW5Kc1U4PzRzWFFXST9gb2VBOWQrIUJSCis0TWZHIWxYQHwqQiVrSW9KYVFkV1RnRSNWRW9BKnQjd3tYenJWUnQ9SEJhU0F8XnR+SVRVTnN1NHZBSnk2RSp5MDRLSjl5aSNlcz5yanElCitSNCZ8TDN6WkI0NmM3UExwZnUwdmd5ITloTDM+Vk5sXlRlRzBQV3o8Vi1KQylZJjJmUDhZSnFzIzttdDM4QF5TOClyMFBIclFuUVg+ZGAxCitVZj0lMkBUfSlIU3BQYjd1fj1OMSl3TnIjLSZyPmZvSnxjTy1HVThfJiFHeSp7anBeZXJ2aE1yLXc7VVZYbE9eX1ItcUdfJV4xPjIkK191Cisya3lVSXNQbFleOEMqTz5ecXk2TntlP0IpTyFqNGJjbFlMUz9faUlhenczZnBTbl9YRGM+KWklaHcmPTJZREtQZ3xQanVMbX5CZXlJekt+CitBaTdTblBgKUVFbUc4enYpSHw0cjw9WXA5Jn1TaSpyfTRkZlhaJTlzeGt3PiE3RFNuRmx9KHcqRk1+JmN7LTRmb3UzbkdGIV4hSz5QdEx5CitfPVZTUnMrNzdPP3pxfEd5XiN2eClsYygmcHc1I3hEan19cXpTJldZO1BXfXY+ZSo7aVUwfFhRUjAwME84Xk9ZN3lBRUo4LW8oVFd8SFlACistREh+O191YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSQj87YlQ0ZFNaZjlzXlZzZDQ3WkVze3tZJVh3bCltCittRm08NE97S19wY30mYlRsQSZJUFB7NTU9Tl5QISt7eUorIVIyZ2QwTHNJMGModCVWPmBvU1NOcUBoRD8zaU5aQEgwdVNYdiQxLVBLaUpVCitBdjlFeDdZa2ZwVT1LclQrYCpuPkRsJCY4R1hMSUlzRkg8KEMlNCNicE45MENpYjhHJjxwNF44WX1WPnh7Q2hnMloyV3FxNW82RzMxJnR3CitVWXd8dSN3dH4jRz5Ufmkobkc3QGExcntjNTMpYmlQWmROSDY7dCM/WCM7RH1GYUdaUSpDPlJuRiFpM05uN0VETilRYGYxTXpRaXpIS3haCit8Iy1xO01peG43N1c/PXIzKCpFZklOeXE3ZU1JLXFrb2RmfDVuS3ElSk4+dXopamRTZCQ1RlkhRlEpc2xHOTJ7cnB1RHRqTS1USnxFPzd6Cit9U25nQTgwNSM3JHhtbmg2QT9wfGktVUomdG93OXFpSyQoJGZjVWM0fiRVZyRpRUE1fkpQcXk0YGglKl9YYjJtV0wxI1dTfTNRPit2dihOCitwPmNFa0RzTG4kcE0lRE9PYFkkKzV6WURTNkBlazB7M2EqSiRpTiYzSUBVaiRzPSVMOHtge3E7U0VQPmolMTIzRGwtOURwV0JiKylmX0BlCit9dSlDe3ohJDFBfV5ye2swbWVLP0JAKlJaVm0pYGZXNjI1YDkjWGNKaj4/Ynp6RTRoUUFuRn13NHBFVWRud35iRmlkI2kwWUp8dmZOU0dvCis8emJAPHc1RFY3ITtJfDw5RWxxK2dyYVc8UElePXtQMU1zZ3UpelZlXnpHdlE+Jj9TR29tX3ZYWnpzZHkkQFRzQlBvUmF7RnBGVHdJcio9CitYenoxViE2PzxWaTE4Xnw3SXZidlQjZnA+OTduY3xKLXg+WSsjcl5mIS01czZaNEMjYiFQbG9wd3J3XkFXTCVNdyEtcm40dTltM0JfNigoCitrNUhXXyhnO3dQfHRqYktUbmttbTxVdUtJVmxIdnp6NE9mVEx+MXZpZnJhJkFsPnFHVTRMJGNJNGBLNDwhM2k4a21iQH1EUy1RayZqbEFGCisrY191NlkrK3cwfmA2KENFO250XmtvMntzYGNMSjFqcjxwVFBQJmhAI2wwJnJ5O3g+RDM5PUkjTE1kcWlgS1RebCpvZndtJisleyZVVUp2Cit9YntfPn5AZHk5RjZpNDxjJHpLTmdmRShXYTxVTWpLJmYyM2tzNkBnfUM4PjtWP19wdVFjUCgwU0NDK19ueUBzTHpQYkJGZEtHe0RWZT1LCitnNzV4aDhqak1ibXhwTV5kY3BFaFdrIVh+LWxCTSVFdEpSUEFleyR7QDAlWnZxcXBSdjA4aipXXyZrTGEmUFd3LWFWWT8hcSlhQTBffXFKCitzZmpZTHt7RSUxdGxMX3ZsbjsyO2UzaT0hRVROdCsyPnomNFhCRGxsWmZLNzh9SGlGcj5fSW88Qms8M1FnPi1CYXZaak9kfTFEZ2lJclh5CitWWTQoPXRjSmEmWVI9VSgzeUxaSV9GYFZyTylwaW48b3NeZUk2MVFIMXJ7VGAtcT9IJD58az8zSTI/X2VwcTxLbyhGTWJuKzU9fGJYQjJQCit7fUpTYW56O3YqbC11Z0dNLXpKWVpVa19penR5UUQ9fmA9PmJpejJUMmE2OC1fdkZWUnBGb1N4SHVeazgybGZgbUpiPTk3eztWMEY7bWJFCisqLXZ5cXo8I2lHTipAcmd3RlFeVFM2USU3OUkyZ15pYkg2ZntueTVwK1gwOEpGRXVvVUd4RE0zZFlJQVklT0wyVyYmM1VYMFdEM0V9SVVMCitCdXQ0KDtxVXwmTkZLKWA1RE9xZjxZU0NHMW9ULSFXXiFhKDB4JChIJks1eXlqengoeypURiktYi1EOUE3YHRwSyg2fSZVN3BnJXg1VXs9CismPSYqQm41PTFUfXhSOFghMVpMIWRETFZDXzdLQktiZyN0Q2BFYX56aF5iUWsyRzdLb2VPdjBAYXo3Yz5hO1VDSEt1I2ZFVUdubH1nNX17Cit4YnYwdVJlNURCJipWaDZEI0kyQmVWczdKJnxmUGY4N0pkUzRxRSE0SiUheG59alNlbj5DZnwpQERqI242dzIlViNhSTV0ST1IRyp3NT13Cis7RGg5ZEtFPztzUjZAOHl0JEY2I0dTQHsrZzxBcT5eSldhREs9NWxPTG1BYzctKE8yS35kMTw4PF5xUWxuRV5lQXBmSTE8JUl7KTg8dDY9CitOdmx5QmMyWWBHaW9hS3Y9UmxUOW50O1dgbD1wZF4+Jkd4bldOPzY9aCR2VGxaflZLSUo4R2NlNHhZcnVGV2orMmEhJGxIN0FpLTZaMGspCitTNyQhUWx2Y0IoKWxKVHVDRllQY1hKXnNHMDtvQXNlJWN5PVRTbmshK0w7SyU4Vkg+MjVhZXYtVChESkdTQypfPnc/UTM9KnYxQzM8Tj8/Cis4TExwaCQlUVc3PzN2JSUqN3IkRGh0bEJgPnZQRVZjJkRMP0NnRkhqdjd6MXNSYns+Z3IzJiV1WWRPO2RlPlg5aGRNYks2Y0A7UERuO35qCitDKDhpe2ZaNnY4ZnlVJGNRMzNHTGFhKFhRelFTJjJxbjs0RWlSXkYtenhFbTV3QmkzSXwmdl5rfDtyfVVjQGwmV3AzSEV+dGpEaV9RKSZqCitucVBIZmJ5NEtwNTQpXmhVQW1ofntpdTc2KWJQdFV3XjxVYXYrJHA+OWh5UnVSLT91MCt0QjZMTnRrTjlXckFKMT4reVpkemEwVl9nLU8qCisyRmIpVlZWQkl1dDktST8rR09AaCFxSGBOentseVJeKmsobmxlRntVUmJwZ3U3Uk1NMTVGaHZwVlEkdHd9RDJtJD9oIU01U1VvcGgxQ21PCis9MCtnUEhGMjR8QChEX30jeURfRmFvYCMjXmlpTnprP0pSZHclQSh7Mmh8KVhfQ2VSY3BieCE8N2VzPj4qMUB4S1VudVZvYncjWGQtQ0tUCitFdH5hWXswYT56bkBobGVGJVE+MS05R0RmVURJUWpNS2AjPig3Unk9WEJDWHt6UnlWOEkoKEMpTWBQX2MhLXdsR1k3MXxFOUVldGs4KEQ9CitxdXVlOTNaPTQpVTFeeztyfSV3OVpvU2VRfilUTyo0RDlkWE49aU83NWI2P0dlSStOQDt+PiNoNyFXX1YkRjJDUDhmdyNzV3FtKj1BfTw2Cit2dDklQHdJbyVnbHltNWdVMS1pR300RDZ7cVpoPkpGZnohTmc9V0BCQUN0cCEhZGF2VyZMTVQoVXVaUGNsdHI4bnRjX3Q0WV9VYyt+JFlECitTTn4reG91P3dWWWZ4VEROfD5sSzlKPVdkNEQ4MmxgfXthaWdHbjdEJD1lSD1wJHlgbUNLaGRfUXJSZyl8YmdeSX5BMFNfYFlVVT53YX5vCit1Rjd1QWd8Y1pKeVA3IUZQMWlBPTc2KG85KWwxc3U7bT9lTGRQP29XMkNJcGRNTVVrQ1d9Y1hJOVZvKXV7RDAkb1l1aH0wKjY+MUUrT29zCit1dGBKbWhBbmtINjMwdm4lNE1EWElKSTF8OVQ9enQ3KnJqaTZZcEd6cVl9Tk9gZFUwUnJoNUZKSjI8cDRmN0NUZDJkVWE+MnJuIUV5YmNKCis2aGAhfSRgK0ZzYXhRKUB2YDRKb3MlPW5PUyUme1hAey13cmxGQVdLVSUwJG1TRTJ6RzNQYXlGV3E/MjxVeF9QRTs7aVJHUUx6U1VASj9jCitONDsxald7KFpCdlphOyRVWjlEOTFycmRWPzE8I0hPXj5ZQDNtYFdhSWlPP1M1eCEtV1BQO3VJMGtjNSZWQkprWXhzOUY8M3FZSjlhZzckCit8TGlHPURTcz4qVGxgVFc2Zk5zRGBsSnlIaiZxPUxMR3ItWWFXSWhEdzI2cEhNNnA5WihlSjZld1BYeEdpVnlEb3x1fT9pVE5GV0puPTM2CitHJU5vKXE0K1o0LXhrcV9RUiFvPzU2OUh9NiZIVTVAP3BaQ0BzMFZMaGJ1M1F7YT5LMmVEOUV2ejI0Nnp7PlRlJXFyflNnQzVIU0I4ZmN4Cit2TDd6WHUkY1RPQEg4fjVQYFA8QShtOEwyTiFNUFZDJH1VaFBEIXVrejZ+PSNpR2RAV0ImSDR8MjREdTlzS1VEdmkhc3N2MGBZJXZSMHxYCitRUjAwME84Xk9ZN3lQYDg/WCN8aSlkXyVId2ZJeypMeGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUCis0ZFNaZjl0OVpmOVh+WDw9P3taKTlhYEVedkE2VEpMWSRJMT5HP3poYmIjVnEzdD9sOVhmMURlZ20+UDIxcW9CdUcqJGBzdHc5T2Q/Y355CitwcjcxY2V3eGs5eFlLTUNFOVZlSn1lSG44bWplVUlER1R3JjUjYlh4OTkmeT9AbTZQcDN+WHNAeVlyMTNCNWJKSVF+MVd2RTIqeT07bEd2CitNVW1WbVMpOV53SzlpSmBeZU8qbWxCT31QQTBIUTRHTDVVZXBsTz1PdGZERHdfNShmaUcpdC1rQlklX01XU1ktcUxIUWszOS1wdjNtc0w1Cis5PWhBWVU8WE1UIVZ4QVlQM3BsM0J5cn1PXzNtSTIoTXpfbkEkTnA0dHA/dUFrbkNoWFRTSTRpM1BiTHZ1YytMMGVDezVgfipfTCFBT0lkCit1QXZwU09GSmdiVzJjN1pUb205R3pSaHYtdldlNUsxSXkpVGtTZFA2ezFRSSpyPnZVPHB+Q1ZvKHJDYnZhZ0VFUXthZ19LbjBjaHdWc3lgCiteUW9wbE9eQEEha1doeTlXXiEjbzZyRnl1a1IhZTNzbFQpdlpNfkxwVGFgQzV5KldiTkohPkdvOHMyTmE9JmpXUHhaZDdxQDlMI28pN0tECit6ajJqVCsmP0tEPDJGfj8taHtpMV8tXis7ZU4mTFRhcFEkdEdVMClxUW81JWAmYGV+Y3BNT057Vkp7JGVxP2o1MkVHUjlDOGZ3bHAtMWp9CitES0xARkQ5S2lDQUhZM007MUdkNkt+ezd0WDtJMyVNTEt7Nyp3WEsoSHk8eFAtX1goZDd5QTlePmd3cUg9RjN+eWZAd1RPeyVUTGo7fld5Cis0NXV6Jk10WGN2JTlERip0SXt0X2VOQUZKMFBIKDtfXnpUbl4mUUdxZD5IV25POW5zfnspeT9WZz1kK19MeThMYH5kMnhOUlBqb0clcmRXCit+YkJlfHZjNGxXO2FGZ2NTfG9UT3pQYFdLfFAxaSpBZzVBaXBORyo0diRNTnkwcm5KLV9JISEqekNTTWckcUFAblVKY2EtSlRmUyFzMytKCitYOWQqQFlMQS12TEJGLTU8fmFoZiRuO09fNzNZNDFiXjghUyh3eiZ4LS1RJWdhaWNlbWNUZkNPQnRyYypyPT49V0U8cV9tNTdfZjdgT0Q+Cis7LVR2NGh8ME12ZFVBTUtFeT5sZz9QJFoyI2F6TnJ8RlZyeGh6JEhCKT55OU4tIz1obUhifDxKUGhGaHNaUWQxYFJrUmU3RGN3WTlVZkEtCitlN3VGPFNNeDxTdHJsQEQoVXQ0ZzwqaShpM2VLTUxWendHNjR2Qz9YQ2tvJU9oSi1xdyZsNmJRI0o4ekQ0OT8mITZhVjxRJG5JbElvaGllCitje0d2ZEMhams/KnVMOHQyKnpPcDUmeHRAaGR4MERPcTE8cmdDTEh8OHExKmBOTWh2eikqMUhMN0ckZih7NEg8TWUjNWFKMzBfVjZNUEg+CitLQUEtPEplSUtuLVNaYGcmZjg7JUQ3NFJMZGZuP3Eld2p4bWdKM144eTcheDZxIV5sUHh4Mm5hS0I3eiNNITcpKT58QFhje3cwMHt3c3omCitXWEIlMGBXV2JCY2dLOzl7aFZtNyhIVWcjLXMyZ0dSVT5EZCVic19hb3AzbEt+JHc5MnwkaDUja3UpSUtWTiZGfiQrJGZaWjUmMiR6cHhICistX0RLMm5TO3JqJHReNDtUVlF2NylDSVJVPkx6TGY/KSlRNSRxel5NWC14dDdyfTFBOzl2czcyQEVHTm9XTzdiIXdDIzAydW5HaXo8NHFsCisyKnorQTM8ZmU4OzRgUns5ZXsoZWROeyV7I3U0R2JIVFYhSld7QGFBbkJYd3gmPzJ9SEFYJEtMMGdlTys0dW00PzAwJHJvI1djYllBWFckCityNSpWYTFHZ1Jqb0RBWTRXRV5JP2c1Xl58elhhdz52bHNGRHhwYWNUKTI7PlJ+TT9lPXNpM3ZwME5EV3JEY24wQUtoJF41K3Izcig8czJDCit+KUZwU2hncSFWbGwldWF3JGstNyNpa3kwVVNLczxyaUt0UT96WTd+JHF4KDZQPlAmclp8SyNjLSY3RTBFazNLZkhkeTU/PF8xaDBlT0RhCitrbCZ7QCtkaChyek9EckBQNlk+PnwyfTFsPXk4Tj5PelpSVyY+NENaakY3aUUwQTc9X1g7X087akVLKlNkKm42I1peOFlgViFvKEBoaV8oCitSN3AwPkwjakRWMEk4JGNONWlGIz1kU2NkfnI5eVcqMHhFUW9VOGRAMGA1Q2V6S0gqRU16djc8c240SWUjWlR+cWAtZGFmRDhOQ1dWaztMCitOMEU4WG5IWDlJMm00fHFMaU08aWN4biQtfEpaJk1PQGBgbUNoeElIIWp7KnpWRWNAKiQ8SU9DPmR4WnF6Snt5MTkyPGxpS20ze0pmJHlnCis5KyEyakN6Qjtjej5PMyRIZVNeN21aQ3QydHdtTzNaKng9ODkxZGJIfno2SnF6NVFHKjJ1XlItdU0mUmUoJSp+enFub2AhRl4mJHdMaVFFCisxLTIhISs5JnJPeyMoUXJeLWRsN1ZKPkJoYTUxRF9zdkdvIUZucCphWkdhai0zZDl0VTBGX0t9JTApKnVWQ1UpJUdoRU5xMSFZKmJkeSR1CiswaSVJZDM+dnFyfm5rJm1lRmt3JDt5X0k/PFZVUTd2cjN2WmZaZy1HTyhXPjEpPjElWnNhVnFaMGpeQFlUbU4pd29IQ1ZpTio7SG9GQExDCitqKCg0eVU8cVJfNlZMKXE3T3F+QzNRODVBTVhiaTB1eUM3LSp3ITRWMHd8UmckKVFjPkNlKj5gR0VKTD9BTDsrTWBxT21gPn1PbDNqe2pmCityVSV0d0BIV3QwQW1+QDNYdFBwUm90PVRPUz1NKSUxei1IYVNwJHFOP09KZlVeNSQ3S3AkcDkxQ1RfYmNZYkEwRW1xeEpMVEJ1ZFd0QCtLCitsdSUzKE5uPkE7PFNRcEdaVz4jamNPdUdNdSoxV1o9d09NJWElRzlwfihLNXFaNzRvSk5hU092UGNXRmlraFV2TiVPI2EyZFJpZTd1UlRmCis7dWhsOCNyP0VSVkQ2TCtENWBpOUFaelM3LT93Uk9tdktIelNNY0dEQW1JfjFkTmI3ZT1ybGlobG8xLSVrPVhWPjRSOHxhKjlNeiV1MEohCitjaklWUClIXzVUK1dySEUrRXk7Y1p1NSVmU25rWHlQJXw3UGRLT1JfdENLbjR6THwhYGcrekcjYyYzVX16UnM/T0UzV1luODghWkVVPWM7CitEPmMhWVFjMG5eU2VtVDdka1ZHb2d5JXUtXyVeI3UwT2d6WW1JMEdYNmV9IzArVUZzMUgqeDZFbkd+TjQkUipKVCQjRTlgQD5nS3clTkI4CismKVQ4UDhmNHNQd31FZ1Z5MGRaWFM9ZjFeOVJAfiF0V3xgYiluS2MrdSg0UE9gWkZAP2Y5P2RjMXArKEF5bVJITXYwMihnWFpDZ01uKyRhCitqPS10MW15fDloZSY1dkNOcmVBdEZhRmYrJSNPNVJyWkpiOHVfSDNxbzJuJkhYMyRfbTJac2d+cUxCT3E1UTIhUCVJeHE7X2E5QkhDVjF1CisrN3chP0JvKVhSZUxDbWlxSFlJSip8ZXJrMVAhJFdfcmVxcmhKZklIbiE/fF9YZTRGe24hKVg3ND5Ud05VKWVwdSZ1UXd2PUxIdChDVjtICitkP2RnTUtANkYqSTR3IXFHY0hkcS18fFY9aT9EJWEzPHU7WThpI3orfVA5WmZjXipMY2JAUElRPDtoKGg3YFVRdzg9KSUkJVZuc2NpXjBgCis9JHpuR29SYTFkS2BvZjJPNG1Ia2g/cUMoM080NWhyIWQrZnhZfGEpPFdwYmcxZnYwejhZQkhxM3l1aFN9OyglamcwbD8+fnBpbD5nO35wCisxaGFsbT4/K2FEUHEpYytzKiQmO3Zlam1eO0FYKyVLbiZifHpeIVg7VmQkPW43S3ooYEpabUhHQXJLQSVTRUpvc0xRX25BbWZmPVB0QkBICis3YGtgOWBFez9VO1hjajN1UEdKcG5gKnRfMmZ2Xm1fRChpQ0s+Y0MyNFNNJSNTKCNDM0pvPl8mMUs9KHBuVTNxbENJeyRhdW5yQ2cpKGQpCittRl9eWnc+QXRVVS1XeDJsfWJQPjN5b0dpRnBjaGtqdFB1dTswdU5KbzNBOVJZei1HfHV4X3JjcHx5WkZgQ0MoWHNzJnhETzhAYStNK2loCitISU97OERrWD4yQ1dSMWltJCl5UCowSnY+fGo7PE5uPilvdipLenoheGlYJmliLW1pQD1gMl9oKFZ4eWBUJTxNcXM7TWk9WkQ+VXlCPXM8CitnUFMrNG1LaUtfZnZ2N1hMZEgrYEA4eEpoT2QxdkA3MmFFYmFofWo+QmAlM0BIJU1UPn09bXAoQztTdkQ8SngxPmIjZnIlT1AhazRSb04hCislKyh2ZUd4aCQlcj9ASlQ/LTxwOGBDKD1HYyhhQCooPlQ0JSVTNjM2YWkhaV5nKm5AdzRBbTxjRTJGUGMmUUcjP14oT2IzdFNWVys7SEZyCit9ZnlQKEw+TzZqd3hjJEBWXn5JWWdJKyhsPktMITV8ZzVOdURuUWFial5FK3ZPYiFiMzAlYiZfTzNnUmxiSi1TUWR1UUVFTUVkTGA4e3NUCit9OzB8WFFSMDAwTzheT1k3eU9GZSZHPHE3fSozb0hOdEhVSXpzYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSCitCPztiVDRkU1pmQTY4VlFGbnxXTXluRmFDeWFBWkV2R1U2OF9Hd0REQ0w5aU50IzgjPEFtIT9uNVM8JXRuX3RCXzZIakJlQn5GOFVrTHhHCit2aHRvZjRgQEpybUhiZG9YbHgmNUM7MEM+Wnp4eXRCVlpwLXUzXlo1MnFpYHVqdTBaPG4tJDlscztUc3BadHJxakQ2PzVxdkBsZj5wWHNsCisoPHFebllfMkZTPXJhMiZQTGNARVBmeDJmbzwoSnIoPTNUcVRHOSstMkEtTEVwMmxVMm5aSyM4RCM/fkFyKSl1R2s0JWllUWVgb1ZtV3FqCit1diRWaXR6UmRGSzBmT2whJWpAPTh1QSktUz4zJl5GKypCM2lUR256NlJnV2RAbyRRbUNPYiNLVWNsZHlnbFowO2QqbikwVnE0S1k0VVIhCitkS3JEWSE5dVZDaDB2NDRhWHFSU30lTE57XnBrakdFLTNqdHdDV2t4c2FALWEmcmAkMUlfLXsoPWopfnFkWnJLcmRqPHU/RihQd1ErJnZuCitadXAmRXVqTDQ8YnM2KClxN2hqYD5nN0pZS0FJKDwrX0E5RjRrRWBCUHl5e0NNPz1FPnI9ZV5paWNNaGMhMj1geWAlV0A8bHZUWGB2YDhYCitzTyRaTjZYWmkyNkVRYHB8Y0YpRHxYK0xpcVdyaWVecSZiN0xvJkR2XjVmYWcwSl9ZUXNhaj1td010cEsoOHIqSCp6eWAmYFdgfWJXVSt2CitpRzJrM3hQZD96YFZDPTRfbGoxOVRDNVR1NS1edGpJR19IMHtiQD9hU0QpI1I8SjtUZ3RMZitXN3o/SiszOyklVTstQDctYTg5cilrSjU0Cit0OzFGPG1kVkJJYVcqbVB3emNgPE0qNjdkOXImcChVY1hXMXJPVUhDYGRePGZxYEUrcjdPRTtmeFo/NWw3MlNqJkQ4SHpRVGVJJk9PRkNnCisrTTFDdylBTXNaVHFyaGtUZTNqaj4hXmNhMHJhUHYmWGgkeEQlTTMoRFVgN3BgU2hzc198djRwOy1jdEw0YWB0JlcyNWolKiE0ZXZzVl57Cis8YmhwQUNGRTVFdkF0VWxPP0I0JTUlIzF3QH1FUyhmfHNBdUNFZl56cztVMTFVdUNpd0Zaal55djtRK3kycSUpbyhpe20zSk5sJVklY1hkCitSYikmJV5zc1huanZfS0l1S1VIRG9UPHklYDtWSzE0KF5IK358UE9WT0ZafFdoRyQ8MzI9MkJKKlohQVJrX08zc3lSSE9WKlBYdnhxSGkxCitJeEFPRTlpby0hUl4re15OQ2p1I3ZWMn1tbHQmYWBCflFGMmNQKzljJC1jIUhtOClXdmwkRTApQn1SbEhgPUQzTmJSYU1DPjxMfj87LV4/CitZNzdebDUoVm4+NkE4MWkwI3lYXm88eC0yQU0pISQyQH19b15CTl4hS1g/QzRzZ2A9UFROcVpqMUBwbjZpejR0YCRUPHs3cHtpaFpxdzN5CitLVWt5REcyVDgjOH1KR1lBb1ljJTNlYFhVKE45T0RlfHRsTmUtNUFaQn1uJl5BPEFMey0/b0QmfiRqOGp4JWhKaHl6KFJfJkpOI0dOJUd7CitJQj51Pnp0ZDB3P1kjYGhLXy0lfFZUWk1uaioqNSt7WldlR2x6SWlfLXx2ZWtnbmlSNj5sUTF9Rmx8ODZUb3VSJEBraE4wU2tUOzFRWj4zCiteZHg5SyVlbCFMe0d6VEFkPG0kWnBKX1pKMDxNSXFRIX5mRm9zfkwxUyR6YzV7TSpGTlRKJj5SJSVYZ0ZFTCg5LTspeVpCdXRvUzRBNmIzCitwRHxIbHFRcGUwMlYtSWdCX1NxLVAhZUtIMm5GRSoxY1cxaSFOaDYrZkpAeTBATTlmTHhJeiVZJCVGfD1MKG1SSUx5Uzg+LUAofVRYb3Y9CitGayZlRzF1N0Y2QEFXWUVZNGwkNj51RX5eSTUmQX0yQWVoNHZmQj54dGpZMTxxI3xSelRjMENaQiZgX1Z+NkI+PUNUYVNhXzV3ND5VMHpkCitAOTkqeVlLPTE4cCM9TVpoK2ZJX1dKYXwyRyRDV3Fod0xNNzEzcCs9eWkzYEVnVFUhaGVLcSl7Q31mYVpqPk1xRWNZJDZCQ3Z0eyRUV1k3CitSITQzezh9XzRISE5EaXBnVWd0TklHVDJ5Rj4yQj4wakxFSjNET0o+SUBmSkN+QGQ1fGU2QkA/PDVwbU99bHhRdDM8O009Jnc/MmlnfkxqCis/e1Z9Qj00S1ohNi1aJio/ej9Ga1BSM1FMTk9sZVplKyVpXypESCozPDUtbT9vUVBNdk0rVyZKfFkrZCF3fHghTlRuQjFgY05hKWk0V29FCitoc19iLXNJVF55QTNAdEBgQEVwLXN6dWUkdlN9NX5VSHY0UkdwSSlCS0NBI2Y8c300Ukdxbn5idDItfWZyYDh5WlIjRC1SbH0xc3UyaERICis1TWhsST1MZiQ7MmJDezhtXj82flZGPSFpJi1KO1BSd3p7Xz5rUEx4dig3M3chUldeNT9vZ35eSnE5UkUmcT5BPWxibzIrN2dWNjZIa3YlCiskUFcxP3VxUnN0bGBDfGJAcl5NZEtAOXY7YHtTe1N6T3dFRFNVWTdDd1E2fUJqaF9pY283LTZuMlk2UmZeJkJ1WWxFWHZEfXl5bEx9e158CitGIUxefEAlTFpYVXZMdSErRkx5S3BRSGMxNklNPWxwTj1me2lSQUliXj4hQjcqa2JCSiZMQTBZaE1MNyRvNXE3QilDPXowSEBGQGtjaXZMCitLQkgwKGBqNjA1JWxZP2FlSFJUQGNkKDFffWJ0PjYqM2BTQUc8YjNnez56MC0wXn5CeTdePWB5PjRiQGJNTHV3TypCfWJme0VTQ05QKjE8CistSzsxWWEkVWNoKW9HJSVVNSRMelpTdVk/RD5zcDdxYEJMTihQOXg4Vns4SkZ3SExVeWV5e2hoTVlhfTlHNntYTnAjLWhIVk1EM0dXdThVCitUPktVI0xaSVhGS15tXlhLPCVMWD47aChRWG97aFA4JXkjNi1jRGhUfXdrKl8qU3RsUngld1VyJjdqQ2NaekYtMnhATCpTPS03VnhaN0BTCitEN0RXMnlqOHdvKU5PQklQQjFMYkRyJX47JUkjbn5JQlp9KDx2bVR8MXg3SUc3V1o8OUlTbTdsWUdnOUZSRkNEU3E7d3Y8fCQmRWM4QmNJCismb189NEpnMmlMJXdgUnRFMGdYZ3Alb2ItWjh+TiFKVEkjZXZPNGhFTmxRSEtufXRhNz9oZHJqUGZSZEdMN0U4VGh1YHdLMiVpYiQ0Z2tVCisjVzVxbz9ueH5BUEFXVWMmKkdVQ2JNdFljK18qOGVTejBUIVo5cV5mfklqfSp4S3l3IT1oO3l0PSU/OUkzIXZsNDQmUUFLX2tGVFhtJX1GCitrdjdENXdJKW0pNztTREghdXtifEFHU31PeV4me01xYzhDSnk1dz1gdGoyQ2RAVXM2STJnWlRDSzZRdEwma0YzVlArb0kqVF9AVSMpVThsCisjaUVVRiZ2cGFKSC1DRCZ4YHIxNEB1fElmKFomISpAN0lwPH0tK18xRno8dWNvVE1mSnRGJWVOQzszYTVWWHF2OHxyUnI0KGAwSXsrQyohCitkeFRKaU5MODtoUDw4bilUPiVrfihsPVhsbSRve3tZUGs9LXZneDRkZCFhSjhBYFdCMDRSSDx5aCNhSEV+cSVBNlBKXmN5Mn5Ubm5PfHVxCis2KDdvb0dfNGVHUnE0eU5mPXNiPmpCN3E4SD05WHQ5fmU/dCpUQEhgO2xVXlpLPWxjSCZNNSV0fG82d09aXjhwaVROYk13Jk8qS0pBdjE9CitYdm1+VD5FWnBiQE1YWjhwUldAX3E+TGt5fSkwOVpMdyNJVWJoSjZ1Y3dfaTdPVkI7c0EjcX10Sk4qR2puNV5VWHJ0MU9VYGgzRDJNWikjCiszR0dnMlBiOXQpZiFTSlJrQTA+aDtpWm9CYFN2ZFFeVERQY3chSlUzZjVES3h0MnlZZlp7eDgwYUA8NnNZPDJSdF5sbkQlPC1xZFpnKUdACitxe21WVm5MMH14b1dwYHR2S1VVZnwqSUgre0R6ajFWYSR3cC17cFFOMHpjd2E0KEd6PXt4d21WJWVQKWE0Wk1Ca1R8QmgjK0BAJjlHS1UzCitsYSZIJk1naE9RYUIjan59S1h0bldMIVA7JF40X05PRGQqa3koV2ApNGlBUW9XUDdrJlA1MVUlUWhnQksqQHByNXFvdz5RVE55WHszQzBZCis2ZT9aWGtHKjBPTVBgQmt+eUJSYGZ8T3o7eTZSXjtJVHByY31OWF99QCE1JWI8fGclNnwpcW49Iz1DY3c7MjshYlktUihlWDspXkg2SzZ2Cit+NEBpWlUjN2krMX07WV53XklfO0BgZCZ5MG0pUlM5PjN8SnNJaFRJZEsxYldEfjU1WHYtX2x7fExidzEteTJHRWpJcE4yKWdAdFBlS3UkCishUzNDdzViUj1KdiRAKittbE8zUzRxaSpAM3RyZ2F3ZU5OTWRJYW95JXx9YEsoKipOYiFvTk1EcEomY2pUMGI5QS1eV3xOOT1YJlhgcHh5CitYNHdxNHgkS1VsPnstSHhQPXhNck0jPE04NyQlPEhpQTkxVXtRTnplIUZwPkpwaSl6cHBySXg0WmdaXzUmTFkxWTtHMmtwcDNnc0lfZyh8CitQMkN4IU4oZmFlemdgcE5yYHtgZ34mTHxAZTU1dkFGbWtAc0l2TzlLUUgwMDAwODBQfmQ9TjlDSFRuUl5CUjBCe3JsMDV0I3IwQn50PUZKCitFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwcG9XVlJVSjNGPnJFa1ZyNm5KYUN3empUWFdodjVQdFdzKmczcUFtCitRb0IhTlNvNkthQiN+VTB2cnRPV0hLR2J1fD8zdFNYMzZ0YURNJlNtOUphX3AyNHdLYHxZPGtEVXdVMntUSC01LUBBUzJiKilhez18SDxUCit1Pk9HcXgrUzlvPDJpJFk8aip7RzFGKGU4ZkpibUl7XkxSNSFYKUljT2ghMjMmMFFIVzF3Sz5FUSRtNz1zI1BQayY8KGxic0NMSSpTczwyCis3ZnwhQllWO2M0UU9odWwlV0dHckpSdzRJWCNZR3Q1dDZVMUhVKGhmTmdeY0IlV1VnWDlKZ3YzR1RgRV9TdD5xZjI8X2dOejE9TVJiNkhWCisrQHVSPCNiVV9gblJqOUEzdkVBISg+RUQ8V25wSD4pT0lsQjBZNWBjU0d6UUIrTiZ5cHxUNlFHOSpsemB6eyV8KW0rb2NTN21aWGpxfVdiCit4X0BCPy1jbTJLLTY3YSF1S3ROeVo9Jkd4ZGdeLUA7bX56O2k+OCU7ITxla0N7XjdoVz0rRTV4KT5WcFJHeD4zVm4+MSFjdDV3cUJQMGhgCit4RUd+MnQkR0lFTXlZdGhwVlQ2ZGtGNHZrQSlFZkgtYVV9cUlzVDVuO2RaeE41Qj9uVVo/KlM3e190cXJ0K2YlPlF5c2tPRHQ5fVJ3JW9RCit7S3MtSDMzITF7dU9ZeTQkck1ATG59UiUyQTkkJEUmYXBXN2ZDZSRwSCo3ejZWejckWFkheV97MF93dUE/KWItR0dLTjxGMGUtYmNxZ0g/CitYYUVyUUYzTE0xKCRDbWhGOEVgYT1RQXN5Y1lqaGs5Kzs+TFM0QDkpdS1DbFM2SztHTmthbGhqQFU9SyNuZj87Yms/cGwqeFlYcmx8WGdGCit7PlJWKiVKWF5KVkNgO3dmY2Mhbmt5MHlCd3wjTnxPMGh5SC0mam5LaXNocT9SOHUqQEZBUz49T145a05gWFJsYDdwJnBLWCY8TyNoNks3CismeEczY057PHlAVHohUShkJUAqU0NWUiFtQyFgJTB3a01kPG4xdzQjSTZkTChfSTNnc2ViWU0yYn1KVFpwYUlPfCRtTll9OERFaUd6fHU3CitqKmh9Q29Wb0UhPGIyJkd9VUJuU3hXSlEoUFE7IWojKCZsbT5PemZzKSk7aCFpcSt6NjYqX2YmJDd8UWxEYTF6ZFh3JlFEeF9+MV9OZXBrCispTXx+VnttRElpZ0c8QWgrfVplMDExUllrSFJCPWtqbHVXXzNRWkNVLVRXPWJMUDREYlpzYyl9bFhTQHkpK0p5ez4yVXxnOH5KIyZhRCNsCisqYGJsSlopV2g8cjRFYCRLU2IqYUw5S1lII3AwWDRFeC1jR19QdFhwYm4+KFgxKjZOe2VOd196cHFYWmZEMHZHISRHSz9OfUwxPDFYI2JhCitUUzZjeChgdTRSQihzR00+bXRGOzt+Yyh2eUZ4RXNSUlhYOHhiR3RjS1VpTylRcnVURmdSXlpEdztTM2pTeEw0MXcjYDVNSTZERFl3RHpJCitQK3NDR2xPeGQ/IUcxOVB3UytYWENEaj9ga2pLKGZGPjI/YGs3SD1lLS1AdThIcUQ8JEQqQjxCMEZ0SnsjOTB6VUUlT3F3ekl+dVVVdT4qCitRWkp2PkVKTiNoV0t1X2B2bik0OyorK09LV1FCQy1OYngzKSUkKCtoNHtZZ0BNU0xRcjxqa1BHXnhmQi08Unt9THlQIVk9ZyleMEB3THc5CitZWkc3bGU3LWpFd1VkNmFlcFpnJWlnfmUhJnVYNThPSyUhU2R7KVhnJGpseXFXUGFXZS1gJUA+Z0thPFdpMD58KTUyU1BXSGJgIVM+a3diCiszY0BpJFlYJm11JlFvY2NFXzVkVnsmbjc8bVVCMUQjcEVtSz93c0IkNVA2eGdNWmEmJHc4e25JWFpAN19OPDMxdGFGRHpLMnRkNm8hJGMwCit2RHF6Y0ohe0k2QzJQcmIrZWV+fHJTRXohJiVVdW5Va01TOz55SVZRS3I3cCt5UjlSRiE2blAlaDJ1UzhyWVlOQUpiSE89SCMpTn5HTikoCitkfTI2eTIlcCk/aD1eKytzSGk+XzNsYzdYMkpoSVNzdyNmdyhCflI8Z1hZdkJYMGo4TkB2eE9zNT09aXFtTzFWITxxdCkzdT5yLVBGcEk9CismZFU4RnNhSCZvMF5PVFRsVGMtYmtURG9NVyltM1M2WiF0M1UxKjRTaCM3WSk2X1MzdG8/PSRQfjZOT2FJd0lleVlrR2BHfSZpUUx3Q1dwCit5Xj42PVdDKHd+QHo1NzwoST5OaFJzU284Jmx2TUhxeWxieFJScSMyZFolNVVAY0AwRChnOWA0IWU9XmNQVUcheFJNeE56TU1vdSVQSlNmCitMam5VOzVsQ3J4fGVONlpEVyQpdG0xYGJjdmU9PGx1MFV5aEk2YUUzUlA0ZE50bk0ycGQrXzZud0piVDV8YyV0fmFWPTV0YzZyUEZFeVgzCismS3RAUnxDYChvX0Q2PFhrdFNib0R0SmZyTj4tMHI4JFRWdVAlOGJKTEpreUdYRUNLMklgYHotVyFTX0F7I2hFbVhSTlNsIS1PdG9zdyU8CisxRHAyKTQ+PFFRaSZqcVIxMWd7O2RzY2J3fW5ObyMzanFZPikqSkpFQl9OTDsyWUZqU0slQ3hrKXB2akBGTzAjXj4wfTRaalBOK1c4WkdGCitGfUIoeTc8RlJLfXBRJFF3bng3TD9acSZxS3xqK0h3SFpSdHQxd3FVP2wlRz1aMnUlN1kwa29oMiZ+b0hUTD5ZYz0+PTFINT1RbGt9RFloCisxNWlyPzFRWS1PMDA7b3tsQD4+KG9OO3JWMU9OY1UzOytOKTAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93Cis3YSU1JDZGS3VGRFhrbGA1V3ByP0laKD9PfkVedjlKUiRGaTRNaWhTTVJ+I3UxM3RFPUtSKChtN05gI09FNiRzKkBSZ158KHUjYUlCR2xPCitRdk54aT9tLTxVZiNZMSYkZjZyYn4qK2psUGI7LWRKV29BIU9EUHUpKGQtNTw1LXJ1KjNYZ1UoPHROKjZSPEZnK1NNbXJCSWMoamsreSlZCitDc0A5MUVII2BOcWFWNkQpK1c+P21aJWZ6eVRwS3g/SX5obU1qPzAoUSU5OVAxU3UoaDwxPSpURERMKis4cnFxVUFEQ0c3d0hgVyR8aU8rCitHSDxxT2FwRCFeMSFmZzlNVVkhSm15MFE8OSk0Q2dqelQldzxgMyNVVD9yZkEtcVAtSUhzWTtTe2t4dF5UeSUybDlwRF4kWFNCPSVDPlJ8CisyfmtnJlJ+cEU4WnNkfV81aSllLUchMFU+Jj8tWlc3QWdLanRpNHxFPmRoRiswMFgwU3c5LTwhRCQpdEl0YnlsUCZXdGRyciN2I3VXT2R9Cis7UU8qXm1JLXgpKUc4e15+UDczcm41LVIqZjhgdiooRDVLUGk1KjMwM1UjbnhZdnxIeHlgeEVOMk1TWFA3aVZib2FCKHFvc0Z6KDhMbTFQCitvXlIkZ1dvZHclYkhCQk08cmJmQDd5PiZYP2RneDwmWUdYVipHdVFqJk9IWGZAV2ZYYyU4ezRvUDdaJipSbkRhR2lhKjsqRDt1Jio+RXNXCitQXzxiUFdIJUFxc3VST3d4PWd1XmM2RjYmYEA0QUQhe1Q8Nzc8RHt1QkxaNHV7U0RffntCKl5hb21XZWVGcHVTRndhK1JBcSM2REg0WitVCitWR1NqZkpPN0IpOXM5KGVELSZwYWxidHAoY1I7YW5seHcqJERQKXMrWkB0aEc4e2FQK0JJflhjfXVZO3Z4d3YhI1N2VUNISkhUYTJwUVhUCis9fSV+e01TXmlpMy1RS2liSEdAJmtPYW5ObUh3KzkjIytzQGRTUzlCXm9uRmVOQEx7U2psfUY9V14+KHptd2tXTnZzdEN6OFVQOVA4bHdkCit4bkJVMD11SjI7NE9fZ3I2YnNwTWwhblhkcyhXcmxHezkxMWlPLTdLTWQjSyZOe3AzWnVEMyNERHpocE1Hck8wNVpZUDY5QXhDUmNyK3NaCitkTFg9VV5iMVpfWXEydUpKJm5YcHRVMStsTz1YaTRua1AzcmhhVHxSb2whZWQje3ItLUlnaUwpYENtTXpFOE0oJj5AZUMtJnUxTnBid2JhCit9Zy1XXm1pWU1NIUBsJCFxRnMjaXZsKk15Y2tiLVdoZFFTbXpAe3thbWs3e2lVPV4pWmwpKGtGenwwPjx9MUBsaEF3WGcxazA5aXRMTjNFCitjOF9iJT0hSzJnNkhnfW80IXcjU25fR0BEfENDMGorbnk/UTYrSmM5TzZWNWNqMjAxUl4/MnlRfX0oQXtgX0RFPTNHWDI1M0w7NjZzKERICit4TV5eNSU5aTU0K3wrdHk9S0VRYFJGMTV7LWpSZHJ7YmJqO1pIenUpYUEmZ3hPKyVnfl5FQGJ7RnRzKTdAUVl3LSsyVXZBKkspS34zWE9CCittU05jTW17YVdBeHZybXEyamJ+VVRzSjtAS1Q5JSk4X05WJWkyWEZZPihzQDhlVSVNWFhASDJjNnlkRnQ4eypjcC12cHZxIWJ2fHgoNis3Cis8I01+Mkx9ZH1RQj5eI0dwRVBTJld6NypefHNgMm8he2hNM1l2cy1LeUc8MjhEMnlkWTlHaWRkeCYzPGBJMnc/aFhXdEpAMGxzY34henNRCit5JXRefEloMnMmT2VYRVJDMXk9alE3NCsyd1pidTdITHVBPXc+MyNGdFg7eGNPR0J4NDNmQikhWGJONyFBOFQtUnRzNE1iNVJHdmVMPFhGCit+dmA9REVra2l1Jn41fnJQVjV1QSo7WT1AJXVwJXFsZEBneEhURDEjfUM2Y1ViP3JIJTZ9UjBvcnooVzc/bXNpPG4tPi1JWFMkQz1JODFeCitzaSpXZVApaD5ANmFXQUsybXRleTdEdnZFazJfZmQwMDZIQzAwMX11MDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDCitRVmB5UD1XTXk8T1pETTB7WEw0X0thQnk7T1ZyNm5KYUN3emdWUTw8PDVkRkB0Nz5PQExxOCFreClMd0tTajA9Pk9mTXB2KyhkbVIxZGt4Cit6eFVUYiVxJG9LMi10JGAyJm1GX0c+aWY3KXVvcTJEKHdBOzVJOGpZdjMxPGh5dmNvQl9oRysrOFo9b2k+X3Q0O0JhKF44QUEkZUFReHJKCitSSkoybGJEVGxGPSNgRkkqZEJreyMyQVRTfmQqaUIqfnNLenBxZCF6PnE4MFFReD9hSCRIZU5vOGJqUHlAZjwpK0RVcDI8YFZ9RSlyJmkkCitfLXcxcD4rS01WaFdUIyMxcVkjPHRjNWRuKF9LNXJYNSNOO2kjUlpqKDxuUGV0IVVwb0E0ZmFRY34hIWhDKigqZSZPazE1P3wkM2klcDY3CitJX0I7Vk0ySEBrZXheWGt0cm1Pd0s8TG50UlROWnFyfTcjUj9KRTIrc2EjJlkmMDh4fTB8S3A3UnckOSVGNHs+PnN6R05kSGsjP21OdUZ1CitXJCo5Yn1Wd2ApYlI3blpUTiVLXmdMc084PzYzZiV5bHQlcXRyNlF8YnNMV0d7O0FYWDRANkFkMT4wKDg1WlpJRUJkQ29PQDNkKVRYMzV3Cis/Oztrbl8mMz43WUJjNHZKanU5NHsyMnUmMnxZZnRXcDMqX0N8WllMMC1WUSs5Yz9hMGBMME11ZEReXllBV1Q7VXk+dTFMWnxlWDZgSSFGCitrZUBMfClWRzsyOGJeQXFJV0xQU1M9YFg/UngzRSpPQk4kNjVTc3hyKWhLSmtnXlVoVGJCNngoNjJpQVBkKElPayFWMTBiKSQwUyNCI2Q0Cit1WGVxPXpsfG5IPTUwN0Bzc08qR0smfUVENUErU0IjIzB3akEjQzg/dThWciFlQU1WZHZLaWRsZitLVVRPeitub1BseiRwZGBLPUNac3V4Cit7c2VtczhrOHlSKmI5ZnYzQ0V8RjYyc2FRKSZLSFBzKGYzfGk7fWFUX2FyalA2O3wkNTMreFZkX1Izd2JvYyVyUVd8dXc8MEFsJkdnYXJ9CitHQ241diZMQEs0YkcqWlNvPSExdmF7JXxucGU7OW8xNH5TTH5CRU5jUXkhaVNiWj1gbXNtMSVyUXoyayttKXY3RUN0dX5NVjdQX3lgTTwoCitLUz5NfXV7SWhLPypgYG09Qzs+cVUqI1FZU2QzNW1ZWHE2VVBRJDxLPXUkMURHUCY7Vl5XITtnYnU2RXoqVipkXkRxelQpfjNIYjY9NzxACitZWmFCTClhSEtwVjBCKVduUHN4amY5aVVMNiljOXptXkVCQUxQNktKdWU/K0k2bncjTGI2VzNrI2RrZE0kOCZ1R2J5SVdwPDNhPWVuclpnCit1V3ImVFdgSFRmREhYZmY0IXlMYjlTaDYqS0s2WiMkMENKKj5SYkFAND0wLWxrJTZUY1kwckAmTkFRTkpCaXlsJi0tX0NhKlpEdGl9YiV4CitPOUtRSDAwMDA4MFB+ZD1OQWN4bm5vSkE7MEVTRWUwNTFSbDBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfCis+V3Bwb1hWcTxmMlo3eShtP09mNHYrREkwQz1QU0MzaGFePnFsPm1YNVIzMjsoJk4jdTIzdml8S0ckbGwxWWUkeTZsQ1o7Vz9aNUFCd0ZJCit9TitkPyooJkYmPD9xPldDVz01fFh1aHVoc3V5Rz1qWD5FISp6NmBOazFPfElxPmJ+Xm9aX0t8N293cChxc3hafl9vP0JEdks4P2R1eiNoCitJVjVgezx2MzVWK2thekdXVTk+JFp4ajdvbmZ9UTFlJiokYjt5QyQxR2EybHhQRiRVLTJ+WSt5QFNhPyhhOURANDJaVGckY1prQUVHI1cwCit9WnE1RDMtXiluN2Ipb3ZFPz52dkhEU05FWlRiNSFiamJ1P0RnM2pXe3QtVkcobEdIdlhkWlNHZl84VEdvSkFIayp7UD0mWjAxbHtwQlcmCis7QDhRV1UqSEkxbXV+ekF5WV8/SSp1UTU2Zzl1WldNKGxjPC1iRz5GZTtBcztVJmR+ezZ7RUN7SWNHXzxQTTt2S3dgPzEybkNGSHA8fHt2Cit1JkJIKlglbmV0NmkoPXM0TT1PODU2XkF6QTNjNGVyUEktS3Y2bDNgUT5WezJ1MCtGKSFKbWZMLT02YlVYZD1KUHwte1dEem5WWVomYVYpCit2cGtKUHljV1MkNFkmTGUwKDh7TX56YCskcWplJmxmaU1fOHxHNmB6KjMqa011M1VjMEc/QUl8MjNBaWphMXc9OTZPNWZ7dVpJUnlLanU5Cit6UVkmRUNQLSF5bktmYm8yPT5CZXZ2aGxrb0s+PXMqaWxtd21vaXtQeVcpIUFgRWV1K0p5Nip+ISk3JVVoQG1CTW01PUtpUUloe31BfWxGCishVTtSISptT1FMaiN3UysxWVF2STYxd1RVTSMrZD0rNz99U0NqZGlvcXc5SzZMeCh2VFU/eW9PaXlPKWBldF9oWCtHJlBIc2B6O1Zsa04xCitBbiU1RjROY3hoRnA/e3R4XyokenU3ODJrbj9RaVVpcnUtNzk4Ujt4ZVltMlMzJUFJX19GM21KaHtEXmZ6ZCtkIT12KEhtU3MwfXFfN3dZCitZP1pETW5JbEl1eHtgX3t9cVc4S1RXP045bjRnVXo+NndIQnM/eXNUZ15Ce2BpNG0qdktSOCtrQDBqfUF6RVlxPDFycDRJSjlGRks3WTt5CitIJExsSjRXVEkpRXZYSSYzJjt1S0MpQkY+eitlZlRfZVZ+QkBPOyNoPmpGVmZfYXc7K3p3aX0hWWBDSTA+MDNsakVAeT43dVIkZ0dhfldECitHKCE7Y2hmWDAmY3JPNUlyJlREOyRJU0FtRnoheHtxJEs7VDUoQyZ5NEt8X0ZDSnpDMGUmZTJzYyQrQEdVKlJDLX1YUTl2QSRjcDVHVnp6CitNa0l+e0ohTShJX2d2NDFIbTdSXnRqKjtebjY/Slo5VSU+ZHxTXlMzalI+Zjl9NTBaJm1SZj9ofm1yc2p8NmB0YEdiITc2dTJZISZQYjA3Cit6TjY9bDElSXNQanxHMlJAY1lWQjtJODFpbEhhRnIhRlNoTWRAMS0jSiUxX3FPRmlFY2R7NTghMW1EeTFTQXhJTl5IK2t1KCh9M0NiM0xDCis2S0cqWnRnMUBIdFcoRXVUZGZqQEhpJCMqfHY/M1JrVHdAQlVrP2o7MVJrVGdoRmhAIWdkNkI3OGVOaTt3N2BkajlRNS1KWExXTV9KeEJPCitmQz85UHArSlkyWlRmUSRadGJYbk84P2ghTXVHcnpvcUZJRUEtfDlhJkdaanhsUlU7Vi1nNSQkQzBwb2dxPj90MVZvMmtQMD8zWlR8MFNLCiszS1pxOFN2T3M4PFRPTihrTTFRU3BfaWBSZDw3PyQ1NXJnSz97czZgQTFjNmB2R3d2cXI+OClpIUhYVFFCMyFBVn1SVjJxb1IxZ2hVR1VVCitXamI7V1VeMntLYEx8YzJ7dUpRMlg7fnsyXkYwQjFnWDd9VjBNUGVsTVR4VWM0OHxENmBVZVNidTk9Wjw7bkpjSUB4bkNyOzskejZZPkspCit7ajN0ayFlNHFJQlcxJnBmfmhlaSVBdXF9SzckfTd1QFMqVThrbVdreWhDIThZcn4hTEU7fjgkIzxGRDVsU04rXjE2a096N3xMUUszcjd9CitYQGdXWn1mQXBoRyFtXnY1eSg4MzFIcnZxKT5wJktFUUFLYGFOQXgrWE1UelBRMyg7b3dtdSQwdkcjQFRSb0FNaGQ1dk1CQldNcV9fM25ACis2PFQ7b0NyI1dCODhaTyg0b1QlKm5vY1VMS0dURWVsQWQmIyVHZn09SURvaWtNMnEtPGxCTm1ObWN0aGs0JHJjXjdkXm47KWpXfHF+SlpaCiteMyZHZF42bVQyT3d0UmBNNTBgMUFhd2YpfSFsR1pjIUNHbjlnPDszenwoXyY3ciRhZz9EQElMPVQ9OUF6a2E8SjBxVGhDPDt1TG1fZExwCistPyFeUClIblFDPWB3fTZjUkBuM1Q0WVVMJjJEcGUqP3hEM2RQNDYzVz1pKCNVfF9zWERGMGk7Uzdic2FmVStUQ198eGVvU340b1EpOUBiCis0MjhyfGhHS1RxWEV7UzVhZz9EQElMPVUxKUdsUXhRViZweUF8SExsSm9gSGp0KzUpRXF0eUZwam9ZQ2xyUjw7VEMpZFJ4KC1iTz44ZGwhCitWVF5vKiglTSgrUCMrS1Jjbk1RQjQ4eylGX15hYHUjWFNRUCZefFdyWTZZaGc8R2R5SEEjV19FMEhrSHQ4JXRrdVEtZmNlNHZNem1gOVl+CislXmNKbylDNVRrSHhIemJiaWhRaEpra1R8aiUzZGVSczs+ZDAmOU5QX3ZCZkZ2RzNmbTJkQmZGdCtZJlJzMT84YTx0SH1yKHFwS211cntgCitVPi1NeFh1WmBQZ25LOU5VZUdpWSYwfkg9cWRHRFkwNnkpbFB7V3A4Y1pxbiZvYSZNNVJ2LWlXK3N8RU9xWG5JMWRfI2IyZFBZIzkwbWNmCitIOzRnP1p0V1ZJcVRCbXZ5dXU+PU40PFRhJUtyX3J1Yk4hMyNOaTJaS244R25ASnBMR2xnU3FDaDtHM3Y3JmRCSFZeKzRaU0dmNjZ8QndiCitiZjh0eVgzQmY4SGpfQmdXXnReYXtyN19gUiNkYloxY0FfSU59YEVrYUNvXyphYkFGekQ7bHFIczkqMz1CRzY+PWh8VlJ7Sml4OWAxRXsxCitSJmpXQjImenZTPj9WZS13X0dnSWpESEZ8SWlKWVJTVDR6e05gd3Rxe3NEV1crUzR8X3NRbHFhaXRnaTsmY3QtanBFJGpWaHVXJDhRRW08Cit+UWUqZUc3QyNaV0Nkc2FWRkJ6LT5kVnxmLWVlV2hGVGskaUdaMnppISUyfXNZIW88LXI8dnEmNnk3S0xOYUI1fndkNnBsVE0jRjF4RklRCitBP09OMWpGRCp0MTkrY0B+OVomcjtFZlhYVDE7WHBObS04aiR6Yl9ja3BoVU9hbXg5c2BZQ0cmM3o/aiFTMUA+U2g2Q1N9JDg4TFo7UGJpCislOUlKYjNKYnBnSz4xUzlieTN3Wl9fKW0xMTw5I0hxNz1STE4mU2xrTStiUnhxO1lnZEFpQkE8QHQlJlhVMFBBQGd4eWpgTy0qaTw/fnx5CistVmVweztGNzBMSmx9P3dLMUQzP0xyPzVJbGlXP2hTSl5KUGI8Rj48O2kwIT5acy1RdjFoNk8hd2pIdE9rdjtLaiF7KHpLXyR4b1cxdllvCitSeUtGeHhpezA9eCttSUokSX50I081T21vKiVHKiFlYistRjA7YVJrKT1yWWlJT3d7a0AqUXN7WCNPfkdHVURJMGMta1ZfNktielFoKn0hCisrVjVaIz5XO25qWVN0aXJ9K2IhcD1CSkFhLTJ7XjRUWVlSJSFfem0kdHBffEkpfUl2MjBiM2h1eEUyKXRpJGFxMyRWYzV3PkZFPjdhZSNvCitPanJGbTFTdntYcCl9Xmgxe1g5b35hYkxfIUhWKihUczV5NjVie3oyeW04TUxkeUlGQTdzdilaYyhvRVZuN3x2ZDxpSjNpS3ZaMGw2PWkzCis7aCVWYm44Rnp1JlcpbEE4Rn5VZEFfQCE0fHJMPW82UkA4IVFVTm41JkJhJT1lPWF6dE1UK0AqPjg4ZF5GK1VEY2p3NiZPO0p0akZALT1NCisrTXJpbVlmYC0+QUxEfT9edldeb0h8WHRMTTRIT1kqfVB8KlBGZ01UJExUfmQ2PjdRKG5+SXFrZnwqVDdRbD4panY4bCtUZUhCTmhMaC1TCit3bT51OzNFdD85KCRFSEghJFckbUNuK2t+fFE9eEVkRGtQM2Znfkc5XmtUXjBHM2RnMkc7e1FgaU87c0dySkJjSENyKkpJcUIjentyIW0rCislUUlGZmU/JE1SMCUtKVUjVks8c1EjUV5RO2xLO2NXOTgqSGlTcW9UbSsoUWUxWGV7KnZ+YzQkWiFgcHBlPnRiJENuVSlrSkgqTT9AU1A9CitjdDhzWTZGa3d4NEgrMmppJCshdDB3eGYzIWNfK0hEcjV7OXsqOT53SjQzQXJoT3pKMXQ4N3g0UTwoIyM5ZmlfSkFUNEs2dFlASD5+MDUxCitsaXk7eDU0Ujg4fmthNUtXKkAqNGVvNGtJO24yKVEpUENmeSEoREdYcU82bGRhfj8tOFchPFI/fUYrR0k3Kj51VSswM0E9JjVQZ3lye1RmCitxclRMKzs4Z0V8SjtlcDVeKTVMNXJZPDtyaDZfJWc+NE1ZMzE+djBvZU9zSjYmM35kPmBobCtkIX5IfjshaGZWNGlOKS1jR1BqOFFrPWo4CisyRXF8ZypaSUNiVGRhMjtaQTFOSUJCWi0mJUBxNFp5N1FkeCkmfk5Jbktra3c3OSFMSVkhTDROeHVkK3tDeV5ocntVVzFOaGlAUjk+cyRCCit+NCg5YTZpeEV7K3RNMjNYRFFhcnt2WllqcDFudlJYI3dAPnxLX3FoZSQxTX1pMF9SRVBjezFGPm9QSkQzX0pEYVI/UT8pMntNN3Jjclc2CiteaHZlJDUkYTYyLXRZMjFpQ1FhRXlVPUVKayF1WVFpPVJgXllHNCRGTDd5b3daUjZPPUVhdTZocEB0WVI2KHM3b3tkZnJaR0EpaWppWkM4CitzRGpPNnBtPilNQEhjfGhOQndgRE5OTygpV3B+eyN6I2dtYzh1fH0jLWJYOVlafnM2UU1pdWJIWGFNUWlLU15Ra0JubUo3KXg/Mjh2bSVaCis/VXt5bVIxfmMzSWZsMTBIK3BIdkxAKVdQQj5CcXomajJqQEZ9YHJBVmN2KjdhbWNAV0E2aHVGNHlfI0pLNzRUSHNONXl9JTJBZGJLJSgjCis7UCloPkA2YVdBSzJtdGV5N0R4SVQ2fVdsXjAwNmxYMDAxfXUwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5CitQPVdNeTxPYjdFcz9WUkNiMmJafk5TVnI2bkphQ3lCfntjcWJpNjgmOSYjUTtISmQrV00oY0MkZFluKnozQEIqeXZjQj5OVipvKl4oWTlUCitTeUJtODZzVXtgITVDPFMpdDJ3WlFFZjJvUkFvazI3eShvflZuOSg/OUNDY2ZCRj9kdEc8dnlWVThBeThvYXZ3aW5JP09fclFTTjw0e31NCitid3BaUEQwWl97I1FnMXFpSE9qeHpnQVBtclFBSFh3RDR9alpfckV3QmMrS2RhKkQ5VztndHFNPjY0eDxidW96WHhJPEEoSUhEWG1SNzVFCitFSjl8NGo1UXVyQjMxZVRVPlp4NnQlciY7IXtfdzROZkZDT0Y9ZXJtNFVTcUdzJjtGMSo9KTd8YW5pZyY/STxHOCtHX0grPUlXV3h2ck1gCismSGNDOU1relpCVWUhfmpVZlQ9R3U3U1dSdUR8JHpXKDIkV2QtazdDflF3eDgmITVAcEgtSXUkM1EtKlNhS3hyZiU2O202Xz9tfUArU314CisyQkJMN0dteHUlZkNyMSlJdT8waGd+aHtmfndRbyg7RT1WR3ozT1kzLSFkfkk1V3RDaWw4ZF5lbUBwS0dLLWNSYzBfJEIpO0trcUZgMzdhCitALXxDI0VUfVlrSWstXjQxMzg9WWkwejFiajtXTjgkcWVfSDB7enRrN2tud0xMOUl0UnEqZEdHcFVNeGZBUEhMKG0oRlAlZ0ZnWUBEUUVwCitYcj1Mb1dkP3E5USpAN0I+SUIocWVvNl8lQF55YTRnfWNKQUhCKV9YZ1o8eEBQWW5sZHRRNHVkSDR1aGxtZmRiYUUyc1NOaEFQX3RRM3BRCisyN3Y9JDtDa0pBYyhnbWNlc0EoJXFyZEc8aE9ZMF4/Wn40eGpvYVImKlBaczs5Knc4b2M7dmVjNnFvWlkjZ0AhZEI9MEMqMENGWTRCISt+CitFTk4xQChwdThGWk1zciVTWE8xJDU5OCl6WGg3TChLS1VCaj0jIXFSIWFNPV8zaztIO3hZM2xUJTFiUFNVUyprOGpfVnVrfUQjQXZjdTM5CitpK0BzfGlDQFpvK2Q3SiRCdXEqUWg0Tk51ZD9wYmcqVld2a1ZFKlpSNUhCQVdWR0lyayVYYz1NZyZiS3k5c2wkfEhOKGF1NillajFkb2djCit5OC0rSEtjIWBBTCp+MVZPbmA3bUdlTzw4Kk9yQ3w4TVhxMEhoJXVfVGFjP2xedlhGeiZtNy19fD5xKll4V3pqXjdFfjtiP2t5QTkhdipuCitCMDQ9ZT9SS3FWNilZe3tLWX19ZHowUzM7QmkwbENmKGBlJGZWaSRhT0RpJHlZXzEpJWAzLSQ3PDVNY3B4ZDRWQmsjdWJ1enE+ZmJjV01HCiskTXU1SVpRIzVBdzdYYjhJNUp4KDhAKGZsK1YwZk1zXzhnUjcle0VNN3g3Y1hJfiY3fmMmUSNlTERabUZYd1VAKGZxKm15S34/aTtRTVYkCispcWRMME4mTWx1YC0/R1RnYys2SGpiRzt0UW5DSmZYY1pBekdMYVhoSj57QkNINEo8Z0tPJUteXkxLZUtLWW4lNmxRX0x8RT0tZk8ySkkjCis9YWdiQjQzaH00PFRvTHw7U0BjPUltOClzfVlJNT1qTWlXNFNedC1weSNTUGpaTSQmUmN8NXNaWXclMmczfnhYVH5WZG9xc0E2eTc0SFQ2CisxPlhXKHo0NT1Ma0Q2SWYmSHVJaDFMaHkrQmJ7bFA8Qik2d2VHK2VlOH0+UWA9UW4jY2lLfD9QQjhMc0EySEFJaXNKLUp5bXA/Tlcmc3s+CithP3teWlEzbDNIWlMlTz5QKXtFNEMwTlYrNHE4R1IqYSFxKDN2TSpNMSh8ci0ydnt7ZCpVWEAyUl5XcjdsfWx9bCZaN2V3TGl0cFRFJTZuCitNaFNYUEsxYVg1aExaTzE9U3VFdkYpT291JW5QKHtLMXI7ekU8XzckRX0ocWpKYUk5dmNwZGstMGQ8d3hAITF2eHRmWEVHNXkyd0otKlctCithe0RMVFQpWWJJN29pcHA+RXFGfjRqfCZAbDlDclZGbndCMzN1UT8+ZiZQWnRNWTRNSS1XIWA+ZWlZNzhgJT5oZCl2KEgtQHU3PFZRa3cwCitSfUFiekshUjMwQzZ2SjJscnRJeHZpXzVMaTx1S1ArcklhcTFYe3MoUmAlNTshVWYqJXk1cGtTdl9RK3A2eUVycztjVk1zTjRuPXg8fVdSCispeE5hbTVtUURWZyYpPE83QyMqKkRabyV1WnNZUSh9akh0SjdBUWNZPFhmXjB3VG5jMHNSQ0NNOGQyUXExKSlPUkI3eHBIcytMeHAqaEVICit6VH5IUDZ3a3oqVnA/U09AclUwLSV0PzYtLV9LXllNeEpZPUFLZStsVz9hT3NtUkhBQT0yYXpDaSZuYlNidzVkRTsqOyQmXnFxJjI8SDU4Cit7ZEIleGFqUj0rMTghNiF5X1olaVojMz1XTGJQdm0tTTskTVljWj53MXVGZTJGQ3hZamA5RT1tLWg5N1ReJVd0bmdPRk84czVGaGRJY3pFCitFc0UrQXt4QFNzV0pqd3xFb25FO2p7JXIoNTs8TlYhKlErTzd7aCNAZHUjQiUzV2tQJmVuSSYjMyVjYUM4JXAzaUdYMSlJWFBfTlBYIV5JCittKUd2TkVGSkAqbmt6TGV+VHMmRk15Kl5SJGRRaTA9UFpXaTlXUntXfjFNaWJoMUxXMiVKMnhje1VVcVVSV3tKeC1wdEh+eDJBJmJVUjN0CitOOEFlKmFad3dOZTtyQUh3ZG5fYGRZWUUkV3FgUFl9cFB2KXJRQEFzOz56MzBCVVpQKWg+QDZhV0FLMm10ZXk3RHVHcTwtYTVaMDA3JHowCiswMX11MDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9iN0V0MlhMNF9LYUJ5O09WcjZuSmFDeE94CitaRXhaQDVkT311N156PUNWc25IUXoxM0NzMGEmMURmZyVFYHM/YGRhIzM1RlZqY2xqZyteQGZKNT12NlM2PyZHQyRqbSY/eWdSd01zWG92CitmaksodlZqUWZMYEgtTyZjcTVsS1UqeHVBYFU+USsoUDtBUXQ7bjBAPjEqVHl0fDYhYUhTUEF3Kmx9MyNwNXY4ZXRmRXd4PnNsWjI1cio+CitjJTN1WUxhZVd4IyElUk47ZkxvZ044WGd7TXlgKCNnMXdBO21rYE5TfE9HKE1gbVJPdGZ9ISg2SU4/a2g/UjRQY1hgakhqLU12UndORlR9CisxfSF7UlhzS0VmKjsmJV5tMSs0aHc2bVZMPiVqRkVxJDk9fVRjMCtyKmUoVHtyJGgzQlopN1hQN2ctUmNyQGUwMyRTREIrTF5OTnMoSDNRCitHITNoclBhJX5lQTVjJDE7VWJZd295YlN3entGQjZ0b1BAREBKfD9pSHlNfjB1JjlIJmlyR2czPWszZ0FyPDB4R0dKazFNWD9BbFV6P1ZwCitZTnJvSDk/ZSFUcCZDPHg1ZnhPU2ArMjxLJXQhRXFgQloyTU04bj83YmFYN2AmPDVoPWZ4dThBZU9tcklwYllpYXd7MVU0cHpYS15aI2lRCitWYkE+dUZIaHlnUC1VMXNLYk9JZFByNEM0XnZJTklXMTdJU2hqaiVjUjJNSUNKUn4kZHNQPjN9Ulc4T3B0dzF2bTxeOFI3OWd6b0dLOT1uCitUMGNlWkBHTHRBVkdZTyVvPzZXaUBNTHRATkk1biZQeDkwe2dfTWdKWlYtUUlYSVVPdzZBaHZWZ0o7Q1YyN1NVP3glLU5rYTtVcm85VG42CitEUHwyWEVrRGIxNk5QKmNQKkAkWnNWTWsjWi1vbERIJjxhaDt8OWd6ZVFCQVAqb1NGQklHQ1F7MVdtMnV7ZDh4dkdhO2lmeClOTFhISyEwCit+VWdpclV8YyM7cTJnZW9eJSZrantSLW9SYF5hNkl4WlIhQHl4TFc5PlJ3I01DdWB6UVo9Q2B3WHZxdEVARTQ0KktLYHF6cVZYfW00fWpaCisyTGBrNjdoWE8kd09YaWZYYEs5Uyoodz9EX2V5VEMxbFU1bVhub1hwKVFxZlZvQCNRNC1zR1VOeX5vNnMoX1VnfGp4MiNWNW5DVGAzNjUzCis4b3VkMnp0M05XfndtV1Y9UzVCPzYyfHB6SnJuM0p2X34xO2l1JWgjaFVgcVY1PFVeWUFYN315KEhpejRYUEE3ZTY2akluP1UhUDB5cl9UCitRelMkUGk0NjhkQCs3NFZ5d1o7NF89b057en0yVklIQkVzRzBXUTdxMUp3ZUp0UTU/OEElRV55KVF2bDdqNj9BXjlvT0JBMkRyNWk8R09VCis0O3s9UlZhRz9LOWkqb01jd3thTVdyKEN0OEVvPndBU3N0RGc9Wno3bE1jMHZmYDQmRzV5dFVlYDZ7VkpeNGw2eSVnbS16QEV1dikqTSE4Cit2Y2YjclJne2AlOVckcVhrRys4Jmh2JFVpbE0jYGBGYD4qZ2NaakIzZENWWXUxS258RUVtRX5IdE1QeG1LVyRNbStxJnFSViNSdit0I1BCCis/XmQ+ZWB0fGxORGw4dzRlUV83LSRNeFdIaShpS1B6SEkjOEYmRFQwPEdaJXszPDxhMkhwTCoxTEFAez98RFR2KHNiYyFjJGZfZU1OKiNQCiszdUczMyNvbjNkalVReHduTUhjNjdDNVFldFIwUT4oUUhofDZeYG9SdG8mSVhuJTVEe1lqMmokKmUqc1dTMHxYUVIwMDBPOF5PWTd5bXRwCitXJHtSOTkydjw/Nk9HWE1ZcGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNHlpWD4pTExaKD9PfkVeCit2OUpSJjgoRU5EJShjdU5XeUdZRTxmalJ3ckU+PHM/RSMhV3xIVmlLP2c8cH5XNzxVaEd9OHlINFclYGtTPjRJSlFhQy1oUDY0ZDFtSUIqCis7JHtRRyNAeDBVWDcrTzl1MDw1WndUayhvNUEwMyNQKzBoMCplajhqcEEhQVNPZnpaQWFEKF97TFo2QHhsKm1jQ3o7I1luVGBaRW9HZFQhCis1aEotcDF1X0tGZkk7P0NHfT5vZEJ2QmtFZzhSJkhESyEwNlRkQUA/MVBuOCZhPUVYTjg0T15SV3tDQXJPailkTE59KUNlb0l4OVVwRmpVCitXNVJLKzheckh5byk+Z3dESEw2RHBAPTY5JDd7eW5Lazs+OFNGQytuJkYhY2E0OTwzRlI7UjheSDI4QEpSWUJvfDdeJUZHX1VuITxpJVRsCitOaUxDZXJRUURVYyUkXj84U0t3LWRqNG9eZkZVP1RXVUQpTnRJentBdnY1KW57Mkhmd19fKTtrV2JybmZMZ09fezxLM1JHMGhFTGxhfEMrCis5S3VRRF85RlZRWGMyYjcxUHlDZ0slfHpAO1Nrak5NWn1QST8+cjV0U3doZH58IWVYYSE7aXF5bVEtbj9INFBZYVFFXmJQNXI1TCt3MT5NCitoWHM8MkVhdUl5Q0xyQjJMViF7UGMlbGJMUCNgKk56QD8odlcyZ3MjcjRoWTB7WVdDX31aVihgX3NrVURjS1UhcV4xN2xOSWMjfm9QZW4rCisjZV8qSWFSUWhPPVl3blY9JTBfcXFzNSlneyZLWEs0bX1TcFp8MmE0UyUxRDU0UXxLJUltflk3dm0wO2QwKGdpIWlZPUs8Qj0wRT4ye00rCislV1BwYjhOYXY7QlFGfUVkN3pNQ2xrNFNDeWs8JnkwcWJzc2FmMnhPKDZ6aTtCYXlieHMzT29jTU8kVk03cmBlKER0OTYlOTQqbClXKEVECit4JmUoI1lINkF1eCF6JDVvZDl1bzlyQiZGKVd4enhzKlBXdDVBe24rYnVLbERDemRqUGl7TnNiKkRQQX1mTEx7M15RPlhmfU1JQFBVRSRyCisjKnQ8IV9rTVh0cWtPaD5GNXNsMD00fHJ2P1k0XzBZXlJaUSg8VWhLc2N9Rzw3bGFIKGNQKFpJRWRedEN7NFFvZVJQMk42P09VO28kdT5ACistOW05Sn1zdEheSWRsVFpoY3slJWZAeWc7SXBhTlE1OU9wV2prKiZxNGdGT2BrbHQ3P1BYe31iKnQ2I0JjXnBgbi19TGEqR3gtP2JgREtnCisyK0pqPil3TnRZOGwkan4rdGNqbXpCSiFrK2tmc2RFfnVLb1NwI2NNc2Yzem1qaiErMngzaTtFSXRgJUA5M0ZmdCV2UmtMP1BXdjRKc1l7Cis7WkImJE9lfj9UKSZLa3xLbjktJFJGOyt0PUc+SDwmO0EtOV88UGI1KSZeb30qbFFKZTcoYEd3XjIhKWVyXzZvYWt4THUlaGlgVkZNSkRGCisrOCg7b2xPUFhlaiorWkJ9RkdQXnQoX0JWZHRlJkoyNDxwc2RtVlFPNipEa2FzK1huVVdYKEs1aFF2YVRDdHFeSGB8aFRiJmdXfihiSnpsCitvJEs9aH1HPkAxV1FsOCt0Pn5DSXxHTXRZYHA4XiZWJiU5c1lLKGY1Zn1HYWx6az8mSnIwQFgobXsrVSh2X08hd1ZAIXVXfnZ2ZFYrUGpqCis+cGFSYHBFcU0kUnR5eTlAKH1jQUhlR0RXUXxJY0xYa0pqNHJyWSppcGchSD92V1lETEJ+dVJkclFDZD9rUTM+aXJ4Rnk5STk3cWV8XmVlCitBTCl5JSRwNmNJPVdVJkBtKTwtd3VrNjNaV0lEJjtGd3pZenw1MzV8ZVdnazVtOCFKPUttQnh9KzFaMkt6bW4+a0RsYW5vMEtGYHEtWS15Cit9b3FaUDdITjlfZWNSd3hKbEI5X0QyVjxKTntYKXJDVClRJno3aWlFb0d8Z1lDT1Yyc0IhS0dRRWtqWitwcT5tfSkqaVlWfFQzdTw2TmZHCitoQGc+UGczU3FrbDQtXj4/LStyQEhtSnM7QWFAa1A3K0U0Uk0hO1ZCaGRkQVNiaFJOZ0pwbX1mSHglaCRaJj9KQVlDY1ArbDglRCM9R2FUCitLNlBKIWEzJkV7KUNzd2NZdjtQKWg+QDZhV0FLMm10ZXk3RHVnfEhhYkBhMDA2aWUwMDI0dzAwM31sYTQlbldXb34zfGF4WmRhYWRsO0xiCithTzlvVlBrN3lYSnZDUVZgeVA9V015PE9iIzdeUFdwWjwyWS1EQTBXbiotMmF4UVJyd09EO2A7eTRya3BIREhqKXJ6MThhdFpXU3RGRjJkCitQfH44SzZhbSNldEZ9VFJGfiE7dE40QiRGPyhNVlJJM1lrMUwlWiNyKWs8S2B7NTxiNz1IeGBicHdxa1Q0YEk7bl9KKSVsYk90eHdVKlExCitsTiN6OGxPOUQ1WEtHTSgpcHYheSRSS1BYK29kJHNtdzt9eVR4V0Ulez4yZzZOXyhUIzxHN2NWK253MVFwQTV1dz8/MUZxRjBnREkrd2c5CitQdE0qMU88IWdDe25UZFAkWlFxUHI/ZyN5M3dpMUZrTDA+ZzskYmw+QnxtQmZlbkl6Y1I3PCNMNDt0P3thKjFmeUducmUpYShwKFF0PTlSCit4NXx2O3hMTjVkTXckc1V9PyhOPjFsNz5TdWBCOFNWZ0Z5WmtHUlh6PEFDM0wxYkNOe3xkallxP30kTE5Rc2NAIXQpWUklaXZiNkFOdCZnCitlREU+b1YkRmp0aD9aWmZNNSZ4Z3B6LVBISCpQPkwqVEB4QkUyNmlDQlk1LXBCWUV+NzR6dzB0K3dMT019M3VBbEpKJHRqQz90fmcjaSgkCiszUzUkcWFKK3NMJmphY3FeTUhDSjZhLXVXaz1oZj5vaGNuOSRZZGkzSTFKJHZeTTMrREBtJEBsKz5ibFpIMHx1UjRQcVUyMTtkcH1lc3ApCitGNzs3bD44VWwwfCZwMXUzMzNpKExLKkkhZmlPI19mMiNBVjRWZmV3RUtyRn4yNChmPTJ3RDRQaGRVYk88aDQlMFp7TUhfaStyI09YUGVfCitaZHoqQlReaWJQallLb0o8VjslK0Z7Q14hT0tfcn4yVDxZOyZMZ1p9aTNsSFRjMGhyUClKb1NRTVVWYm1UXmBgejA/ZGtteDdAI3RwS0d0CitzJChXRn1VfClFUmtlO3Nydms3K01tTyNIRTJxUnNWd1M2KTBmZiFfeGdtKDlJc2Z0biRJZDIjTUF8PGltaTRrQlBwPnZOUHg+cGJIM0B0CitpdXpoNyZ7b0FDR1I1MiZjQWljM2VUKj1GRSRkbjtueDZORmhPPlFFKWQhWTd+XiY1RmQtR2Bic0tyRHJmcGpkeUpndGB3LWVrc3c0Z1Y8Citjd3pCNXNaPHNtbGczbUlRKSVVNHdvNyFGc0JBWEdkaXpsJmxQNUx8NyteSENCaEtiJXRxczgtKiZDJk1hRHI5fWVmQV84Y0pyNiFoSFcrCitYIzNOXk1sO156ZWJTSVo7ZCZqKHIxNCRlNkg1eVlES0cjekxqcFoqQks8SlNzV2g2bnYkQUJEeEJFcmpxXm59KyUhVT5UKGw+WCRWKFheCitZKkl1UGxabk44NUVtRnhibmV8PnZCbl9pODNsZEdHLTEpUElySG13UjcjaGtRLU4yJUpXNVFOUlgqJWZreTx1OCV4OUdhQyUjUzJeXmNHCitkbzNRez5Nb1NsJSQyN2NpU3F0ZlJBO0F4TjtPclRjMkJ1alh1dFhkTm11SFUjQ3dedz10KjBXcyMpeVppNFN0O1lSIyQ5YnNNM2FxSTlBCit2V1hRWVBKNlNgO1NfUVg7cmUoSVNnNHlpZXh6JmZrYng/Y0BtRTBVbUNUX1I/bD1wcnpEPFdQJDAlMVJUNSR9cUY8fEwkKnB5JFYmcEVVCitrTlg3b0VZdGNjJis4KTxheW83eE4tfEVRJU42WEQkRUNBTkNORXMrOSVBaT5RN24tXmFwVFY0TVk0ZV9xX1BBTyY4eVl6RGJ8YncqNCR9CisrI049RHNXcHR8Z1dzd319SiYqXkVAO0YtYEVDfSV2N3UzUCsjUVRvT0x7fDM5VntzeTU5Iyp6ez9mYHFpSVJxcCQ1eyFLYXRkejw1YWZBCisoRi1WPUVpJSooV1BgXnJmfElafnc2eHBRLWsjaEFkP2tVZ24oaFBDPjM+ZzFSYVVyQmElKV9RPlJeRyRzLWsjVUJVQU0rUWJtLVFVemJmCitEdmEhZkpmbi1jJXd6NjBoJFAqMmJpTmBLfW5ZX0l9dV5NU2B1MnJ5M2JzJkRvJSpsaGJqKT40OWFiemVMbSkpfiRkX2lGSl5LS0UrWXpICitCel5sZ1drVShiVm48NkRsVz9ISTZJLXxeem0mSGNVfmokeW8jbD1yXkBDMWNnc0AkUmpydjVTdS08dEN5bW9PJldFdnhhZEtlVFdoNzJHCitZRmIzZSFEeVlAJkR3SmNsK00tNFk0IWh4Pk97OG47cSpmenh3NF52LV9gWTtNWkhUQEZFQilFZlljYUhQaXUmYz55b0hAKSh9bm13RHE0CitETElNQiNoRy1VSl8qbHYlYWNoNmJrYDNNdnk3cUAzT3R6QXNgWlV7MUZlTkFeKnhSSCRsd2dORFh8QiZeNEpFemZaZztfaGRWUFZCSktWCitlRjBZMGxYVSg8QlRPfFE+Z3FuNCg+WHhqTEdBM3JQaDMrPUZGM2dVOGFYJXQjekxJMz15a1dHSk9YQngmY0xhNyY/dVp7QjNKZU5zVTk3CitGej53KUt8Xm4rPmlkcFlGe3lOZW5qWnZ4Z1ZoSF5WRUxjZHkrYXBOUkhrJjx2dSpFdSpJUVZ8aylWMkF7Kz5YKWJNRUxuY1hIWmhkKGAzCitWbmhjeTV5MF8rMitUYlM/STJhUVBVVCN5X0xfZXFyaDgycXhQM3hUM3ZvNXB7TXMmN09LYSpiIV5Eb15IdXBaUDxaKkZEVCtfSDdnJVN2CitfTWYwZT9JRmtiIV8pQ2ImRkhuRXV+bDNqOT9gMyNMOUtqNUxAeTExdHhTaUNXVllzPHhMPGNLMHh3e0s2a2xifUpfaHkocFBTXjdXTXxXCit2UHYtSFhDWENqPzZjUSYxWllJQzg3fWIhYXFrczAzJlFKR1l3UlRMRGxKYyleMlM7MzZicnBIXyszdWFud3ZZNHphckY2Xk1uSEZhVUdZCis3eCoyP2BwRHdBMS1YPXFFT2dMcktjRGZkU1EzYnxUbkMoSys7RU5iKlI1YlRGQGNhUXRDJklvI3Ved3VnTzkldFAkNmt+bHlreFYoZHlGCitOcWRtISg0dVRPV202KDZASi0wQFRxR15Hcn01JnZJPnNOMUp9SiNDUUNQaElBRkxAWD9SaCVPd2xeUXBVZF5NKD9aI2JNPkZaWWd2SyEwCis9KWVRZE17OTdjPmpFbkh7UjRDNHJFRUtSYH59fE85S1FIMDAwMDgwUH5kPU1fPkNPWWFScHUwOSo8SDA1YnBwMEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2lNWGtsXz5XcHBvZmJZP2hrYSZLWn5heFFScnJCPlQrPDJEZHwqSDtXU0ZMdnZ3YnsxUENuYFF5CitxdUBqQGRMNldoXmxPUmhZbitRYzNCJGQ/dGBWSi1lQ09lQzZ0MCF4OCZkaXhKTG5jPk9tbWxhMm88PnNga05TaERLWS1xTio4ZFlleitPCiszNTVVZGVxaW1qTjRJUF8oTHolKnA/Wl5uNyNPMHxOUlZ5PzQ7anMhRHxrZE9GPVR5OVctT3U8fnBMSEg+ZTlZLTZhUD9xSV8jZ1NvQlhuCitJdX1zZnJnJDQwRVo8YyZzb29uODAjZFdJUWh3RFZ1QXZyQlo3SGplWms0Y1h6ang7dihGSUY2WkRgdE9nRz9zeTlyXlBXbjw5I2dANXxzCistY0AtREZRSHcpR04jeFVuIVFzSElQQ0JNIzZrKyk+MmdjbFFvPHpSaXc3b3JCb3E7bVpeQ3NWZlYwPUltRDN3ZyRkSlRkTlJVNUIkRDV4CitCN1A8bG1UcWsqN1lWZ3ZSVTFeOS1nKT5tVUJEUE1EVE9CI3NIbUhIelRfKz5AfGVYYUcoeDBkVmBGLUthQjY2VV8+fllDTj1qZTJka0BJCit5eVJIMyhOPmM9Ryt8STZBbTlZZzxLX2ZDJktUVUlFaUFAcnsxeTBqWUpFbldsZjx2YlhGajFza2xsU3o0NT5saEB2X2BOKiRUZy1wWiYzCishcSF1TF98SlgtfE5veFpeTHVJRns5IU9KfmkkIVlwWl5EOHM0WXtNQlBybWo+WiUkOV54ZzJ9K15LTkYrZDg7d1c3aSZafXkxPUU0PSEqCitKJDc3dl4wcjgxKXo5dF9TbWxIPXA/ZjdyO2x7UyF+VWBXYilxUGx1fkFyb0pgT31qTygpWDdhRmY3ZmpvaEFeb0JJJTcjVkY4TTA3K3ArCituPF50bXRzfSlPTyU3NV9yT3ZSKHpNYFJHMT92NHpPKDY0bWN4OG93RGhzdGYtZkJjTWRGcHkyejtVc1N4VHZnVHVSa35wNDclZEN0YyNVCitaI3RkIWI/MC10MUYtTlpeM2VsPj5FcGs9TTZNaHNSV2J3RDQkUGpLbT0zZHtmJDF0OXVPcD89WT9ORypEOzIwdUtfQVYkMj0wSiVLKldsCis7MkQyeiRHbDY/X0B4YH1hQ2dxb2trfVlHY3ZtSTteM34mOShnbC1gMklKNDs+cSlxWHt4aXs7PDFHTD5Ral5vNVUoeipiYXI1aChnPXF7CitrRWZDaXNKNyY1dzEhbXkhe3ImWmlPQ3dUVzF3RmxXWkhfUiY4NlJMalJMRX1obWpqOENpR0w1RlE3Z0dqKXNOQExwayZKIWIrVl5SbSZDCisqSEY9Q2VLPiVDNjlhKSR+RlVXbXMzQihCdytNcmApOTF4MVNFWTZmcjVWRXJAI2dGfmdwJSpqXlBqZWhBd3FKfiVgdz5lMj1OV3hgQEw4CitnY1c0TX5DS3dgZnlsNDdZOW03YnowfUJAbTtZYSFjPnxHcDVkNERyfEk9MWl1e0xsTUBDUVpYWCtOR2RTdzI4V3JgX3RVWVImYE9OOzV8CitOfSh2SCV1ekkmQGErTF4mZ248dWtHSkw1MmsxQ1h5QHBMKGo7ZEpgX2xPMiNMKj44TE40T152SSVOcnAqc3tNSmteU2VIN3hXaUY3KDlDCitlZEtvfGQ3a30lIVROaGtneykzcD4+Z1ImOVMxaGlUeVNwPDdQRj94fmVtfDlKUFhWKjFmTnQjLUhybE5WdG1iKWxgPG01e1UqUDE5SkhjCisxJmI9KUBuR2dJUkMtO3dMdVpkVHxEX1lZN0AwfFhRUjAwME84Xk9ZN3ljKCljV2YmJX5tMk03UUZGI3JHbmFBfE5hVXZfMH5XTiZnV2ElCitGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSOVhYPk10QlV0Y2I4ZDQqSk1rSn5tM3tfYkJ2PFp3dWc8JUQkYEZ5TWQjKV4qK1BmCitWSyNGRGZVck5ZJnNFNm1SdzByPml6bXJrYD4hU3laUz5BaXNaeEJocFd9OT0mZSVuQEg1PU97JHg/cWNUT30ybUMraDJGTzchSTckeC0pCitncyNFalVHR1I+I2ZuQEQmUERHfSMmUWwxdXpzeTtpdiNTP1RYVGt1aCQ4RXZfP3RWNGY2UnF4XnlRbFRsJm54WU9wZm9MX1RsWX0pPXxMCitwX0tMbXdrXlFuUmlsVldtMXZWdVZAJlZhKSMoTE5rSztQcWp6azc0bD8/fUpCekNWOVdGQGY9YiZaITRRbkltT3Z7OEN7VFl9fX01cXs3CitaUGU+S3BSc2didzZeMEVgd15UeWI9N0c4fEBBPDxUN2FZVVA0TEpJSEcoLXdCdGQ+TzclN287aGoxWXl5MmxtS1NgUHw/VG5aOFloPFJBCitsJEwkMEBUYHlkWGMoRnNZKytHWGw7Z05BJnplI212PVN3cktoKiUwN3c5SU5sQ2Z8MWsoT3Bje0JiND5kTXxJc3dXWWs2flItRz1Ee3ZkCitqc05aV0RUbmk9SzkhfVVlX3pRMiY+N352MHtXQW9lS2lLMmVeVVZLPGxPOUMtJjxQYWQwdH05QVdoTiZAMShyYUVtbEVjIzR8MCkqNUBDCisyQ2pzMmJJWipMIWJaN0ZjSHlIITA5KXhkNHBwPEltOUxEZ1hackFVMVhtT3BnTD9Vbnt0X3paVEN9dilCQD1hPkwoUmpNdn1QZHlzayFxCitzQUludjhSZGAxQWtSa3RnYH0/UUEjLU0+fWFoKnxodjNDfGVfcCo5WEx4NzNZZ2xBOU9aNkJ3ZWB4OFAhWDdJXmopMnJaRXF5aTZwaWMmCis8Rz1HYV45cUR2bC1YbmdvaEBZMXRJQX4kcEBxPU9ifEk1bFgqK0olcUBUMm9DWnF+Y3NePXthWko1SCFARmhAUlUrMWhtdndLY1ozUDhlCit7fGM2Y0dUdSlXJXtCN2ZGRGNqKmxTI09PM0J5aCVZSWhSM0JaN3t+MUl5JXZEWDZpKypodVI/TU9RbGI5XkxwWTYlP3ZjQkMyUnxUJD00CitzTyVqTGEtPmM9cDV4JnheLUYzYS02VGo3LXBmU2tuYUxjTFIrWmZ2Xk1NNGJ4cXc2a2UyM2FFS0J6SGFPPjdeMyhFJUJJTzEjX0Q5YWR3CitId3VNQHpHSmtLWVFkdS02RVpWMmxEejd6XnV5b2pZMylGJGl4P2FuNFZiMlohO28oUEUzVStMZ3JrcnlYWTU+WlNaYDt5bUhoe0gzIT58CisyX3ohI0FWQFlBMz0rdXp+P3YoSzF6KXM8N3F0X25KZi1jZWx7UkxAPiN5alk/OzAjPDRVSnlINC18cj9pPlgoXilCbDMxfTM4cnQ2Y08tCitjJm9qNTR1SXEwU205KkBRajUzP3hZcT5zcW89WCprb2x2bkQ/bSs2ZW8tTT4rKUpaZDVxUmhwQTJpKz0lN085S1FIMDAwMDgwUH5kPU07CitTc2Foc19LQzBNO2t+MDV0I3IwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2llYSVebUFWbHl2YVZ7ZEcxV24qK3taCisqRnJnYUN4MHRaRXhIKjY4YFJBS3t5RGNQMWkhNWVoNlMtZ1VoQU9IRTVkKSgpMl4mOGYmaF53T01OPVJuJlRTZCR8OTgma1JZNGRoeSE2Cit7U3NMazQoRStDJmtWRCElWio2T0pYZEw+JWZia35zbWkoJHpzUmM2I20hdiZ2VGZ1bFNNS2tWcmFvTXAyPmpOeHUoXz8zJTwkZVhgfEAqCit7LWtxcEBzO1drTzxhYTtSYnk7NXNAamBzZ1d3UzJwJjYlbEdzQEZRYjVUOG9OIXc3alZieHZDYGAhdHV2U2F4PGxgZWtZQG1QPUpNcyRNCitRKnF3QDh2YCQpZUVpJXkyKmQpK3dkeHF4S0w9MT9qN2JUOUtROS1DVUdZOS1VVk5wN3ElaSteWnQlUjs8UC1oOShwVjhWMyZ0fXw3dT8wCitjT3lRPG10fkNLZExTSF85WlhVOSF4dVd7UzsjK35+Y2goeSt5eUkrIV4+dXxqek17UUd3aGU3VGYpekZkbGh4UXhFMjZuNHVHelpzUmlGCitOO1IlTGU8ZStMX2RFMGB1UnNWSy1JS1ViVmNodlpTeCRmJUdJQXhFdVBfKGJIQH51eEV+P1RoTnF7ZXtPeyt3eXd7bjZkITNgdGo5ZT4wCitpa3t7QVBRaWVWa0ojUG5eajIpfTJmWisyVFp5SipDZkM7K3hpfFc2YiR1O0pTdDg5OUYpVmkhZH56b2JfKUNkZ056PEl3UFJ6M3s8Z15QCitgPlFFTmhrWGQ0NTwpVl9jK3o5dSZpLUJMe1VUP009UUVXRlckWEJqfjx0JFhMSHUlPi1LRDs3bmA8eWF1cz93PENkUndGJnlDM2RWNEtlCitqYjMwYVc0SGJOVnI/cUxkdT5DUkpOa2FAZkVgYTB3b3Z6S1NFMSh2Njl2QzB4NS1zNkV7KnFMI3M7bGRsJElEKnpFe0x1UkRlUXgwQUZ3CisjIUNnUUpWITs1ZyRmJmNCYGEpTFZRaTNsKkZqcUU0Mk04b2I/OHw5aSopR351NW8xNVJDZEViTjw1YzckZStJIUNxdTljSyorK2ZFbClmCisoK2lPZ1A7aDZldTJuN0wmenh7Q35eVWpMUztsUVd3d1VnT3NgZHVRNHNKV2NAMmtOPFBhcms4U1FqKStsa1c4Q2hZTFZQXzNqWXRDKnplCisoR0d8JUwyIWsmI0cqJXM7TT4rVm1PXmRLU2xoWDxRUGF1ZjA/I0h2Rnl+WU1CdSRWQ09KbnBaS1VnTiNCNzFFYnZYfHV0SjRNKHc+TWF+CitASWtXfTU2dGs9PiVhY3NQdFdFfnZlTyF3ajwoUkM5OFlkITdUd2xVRGshPHdNWjZqe3d5JkBtQyRfJl9YUnVNansyK2tfKCZHeVckKVF2Cis2KjtfYyQyKTJTWj1ZY01PfmZpNSVnd3RzSD09QkQ0MCZHTU4yNUtBT2lqQVkjYEtGSGp0UyFXdlRKd0FMQUE+SFNTb0tscEhefXhtMDFICitEQWxUaUg4cm5hWW94d2AwTHxMXnBkKmp3PHcrI0E4WH1rMT5gd0NaSWNXUS0xN2EmcTxJe09LbFdUUFhrMD9pLV5oPzdSMXA8RVJkWDJOCispIXIyNW9MRVN5TGl8WlI0ZnNFMi1CN0ZtPGczTWlHcDJJTH44dlVVMCRGUlIwbU8mbmxLZ0RHbjVQQVZGViglITFfdllPbTc/bjlDP2RzCitOUkcxPWNNeFBgbnhsc352NFRJI3cqWm5aUiY/UlM3JDJMKjFBeCVNfEtva0habzlzKEVJPEBOOUd7N34kZlpwWnEtSUJPR2JGZWY1VihgCituNXd1Nms1eDh3bE44I1ZKQi1qK1glNUMwd3FWNyEjPylwRzVDYjl2UmJMaSVsaTJgZkM7fGYkMDImRFlDKSsqMT10WnlvKlltPWFmS213CisoLTt6U2MwPzV1R0RFVV9yJE13IW4zNm4xSTMhRkleQnNXaTRZN2UrVnc5KjNZMHcoZlNhejZxdHRHRUspdz0zX31IeiQtcGQxdzloM2YtCiskeUxDWXVmcHpIeyNadW0lV35WJEwqV09eS2UmQzlKKVNUbGteVk1MPXtXZyN3Z2drN3pAKChDMXZzQjJeckclPGFwRV91fGQjQDRpaCRtCitsLU9McnMrSmNwLV5LUHcoS2FMNXhURyskKk4+KGNAMX1FWWRFUVlHbztTLWJyNzQtKyNJMHZvPlM0VCMjPntKTmp1Qk50MFVCM1RiV1BwCitWRDtqQGhBaXotZVFWa1hDYVFFSUswd1RYdippX1hNYEtmJTI2aCVIYSRXPU1FREUmKXBNSmJUV1VAMUFHZD85VSVkVzRQN3EqbGxGVSFoCitsM3V3QGZKKlFFLS07XmZ3ay1gVDR2cnkyOTNCbEBaM05KJVorU1Vpcys8XmlCM3ltK0Z6ajUzVUxwQjtyeGx0Q091UG0jKUc+c0dSP2MyCitCaGd5RkNiNCZgaH1MWWxfV3VjfHFGVXpUQFRRQWY4ZiVmKDk4KEY0VHJAPiR2dnVqSnAwenFiNFJuRUVvSnooPDhUTCNleElaWDwkUShWCitKKllfdjtUfEo7eThsPlA0N35taT42dWQmbTd9JEs5QFV7TSVNI3E3YHUqeGJ2OGNTRmRhVzI9Y2N9Z1RiUCVgaz02UT5wRy1FWXo5YnVqCitjKmluYlJjNiNKfEZtRV9DVTJrX05AKn1MV1h7Mnp3e31mdklteGBKcShoS21xRElra3tobVpIaDQtQzVUWCVWJXpDQSZxZWtgSHB9bjhZCitNY2w0Xk1wRmZIPk1GdTJIfDlNWCUwZS1qezBUZmxtSFA3aDtfNFomdlpzekNvIVQ7QipwPHIxSWVPWWhTZ09CVFcrbD08OWs3RVZEZEt8CitRVnY0eit3I18mQDVYcjRIdlQxN25vbXdkcSVfZ0E7PE5VfEJwc0FOVjNqO1IlOWlIazQ/Mj9nZCRPdihLY1J1SUh5U3pLVW5zSnI2SkV0Cit0bUU1JX5yJHpENzRGWWpKXnk0UEcxRWJxV3pnP2k5blpmRFpTOXhpTCRrVmxJXmAodm9ZekdvNXxnTihsOEM0YU96ZDtIekxYT2ZlXnUlCitDYmI/am8yNGM2TjdJYUxtWW0+NSlEcGJAJENgdz9zPmIpcGMoZz1TQGN+UUU7eyRwai1HZ2ZnUGhMYHJkWD5tLTd0bklEMEdaPWRrVnVeCis8QjdXdFIwbmMxVWo/Wk16KmRNQE48IzFvcGFkSWVxO3BnUXxZPXlvcjU2c3g4Kl5kQD48LVdqMjZ6ako4RlBfUVV+c09uMj1oY0VEMj18CisxflYzJmtSKkxlMn0xTFhpODc3T29jaSokKVZVR2FSezQyTlJxSzI1dHU7cTc7dEYpNDN0MW0qIUdMK2h1R3w4X3NYZ0B6YmBuSD01a1d+Cis/Pjk/PiYkbWlEKmVQOSFqd3p7fmQoSTcxWGVwUHUjKXtlfm1GS2xzbmo/djl6PzZ9eVFYSD1GdmlpZz9VZDliPlQza3E5eERxVlFrLSk9Citkb042NEhMcTZJOTFuRzF5PmBtMHBkKjw9RDg9fDBXO3NOVVVCcExRYipeSSQ7KFl5a1lIVlJLOXsrei03Tj9qa05yV29SUFFmP0Q+TFlhCistVik9I3g0MSlyVVlYXm0haU0pOSl4Y0JoKFhoJFpKNHYoYnRFdmJnKmxoPlhOV2kpTEFDLUZlKGFfWUBjQytCXk16YDZCTU5PSkRAVTZYCitOPipLXzZXbEZDIzVRUCR+UE12QzQjO30tVGA1a2NFRDkzLVlLZGo7NktnNEBOWj5EZV9kPWpfUU91SWJDTU5zLXBiTWdIbSFnemgweWJHCitNJHl2anEkUlNXVDdeXzJ4ZktGRHIlI2dQMT4pV3MwWmV4VShoOypjX3dXLWFqPm1eQzVEPTx9NiYhIUVoN21XdHk/NHFeNGtkRk1AdTV1Cis7QnJBZXY2czFvPGZpSjh2JWBLOyk2fHJ1JTcya0FGez92JnxwY3pzZilVeXNVQl4qO3ZGIzRveXZqV2deQDVrRFhTSVAybk5uVVNqdUt0CitXNzRZS0tZQEhtWVB5LXpQbTtMQzVYSUlfJjt4cVMjaG4qKnFKPHRzdnxsYjlWcntWIzxjVGNgZUp0NDs3RXM0TlopUC13bmpQbH4tZ3ZQCitINFd3ZUs9bihRT0tKSGF0cE9QdUtOY2JMdUFsP0JqX2M1WUJEZWdPK1FiYylMTVBwaDZoZ0ckM1JwI2FuU2NLeUV3KnswZT5TP0M7YldYCisoayRaTjVnfGdZfHMma2IyQEUpbX5sR3RQNTMqLVIkRl4xNzYwZUl3JktvQzZTezdkUDI5PjcwQig9Xz1zaTMqNVA1O2tETSY/LU9oV0MoCiswUHw+aiNRNHU4cGNWeCgrRmA1NTR8UCtOR3V1MkwpVH5KZmBadGgrdD1uQjYrc1VDO2wmOFVsMTVBRU9wemlkTSVAVXB1S0MwZEhwMkhMCitvOHF2LUBwUUtQWUB8PFI0UGgmRmFpaWRnOD0/MDRDUVJyMGQkOWVkfGZXZiNGTnZEVSMlV2MmKUVEUVpmKWpHMlNuTUFhIXheJCNBUmRjCitYUnc3cD49RUJrYFpXallEWi14VElEJnVLQEdBYCp2I0YwWU9fWXBVWEswLWd2NCYoRyExS0lvYio2Jih+YSlGb1N3eWIlQUNETEU0bWg9CisqdjZVVEwoITJlJEtWKF5SPSRgSWV9SUcwdXRwMTYraWhrPjI3Y1AxOSlHUTJBRnVEXzUmKD5lOW8/ZGl2N0RGVXs7IXljQldRWSRCRENeCitPd3VIP0hvRFlDXjJrUWVXUT5RZCk7KzZUJHllZGswMTdfayVUK1ZxYnR+dnxCZThMP0BObHBWcHd2PytoIzs9aDJUPiZmJn52JFRiS1M/CitHbXNVQU1veDFBMS0mK1kqOGk5Y3RUJEAjblgyMlIlZyUkWGFNMHtYVEdee0FJQDJ+JV8mU3thRkdgVy1Ua2FTJDcodTVAaVo4dTA4dSpHCitmYytQcTRUZ19ic3hyLW5eNGBWTUtjc0wpem1BPEFmK0A3b3x3NF4wdDlUNVYyeTZSXnNgJjM8OUhDVCZkKTNRbXxoMVhaQE5wcEdNdF5FCitnSTJXX0IybllHTClYcUdPNCNBKGpUOHpYTyEmOERVeW9jYU5tZUUjNXphQG9AUFJPRmQ+NyNBQXNne1lZTmJAR1B1Sk9oOCVuRz9gMkU0Citic2A9YTJUSFZeNUhnZThJemd3ezVebnQ9QnIkZTFEJmF1WE1IQSFwbUJuKzVkbzYlYmt0aT9xMSleN2pVd28rS2NsJnttLSQrLW99SSpKCitNcmtJJH1qOVBYOzN2cEZGYV4oaVZ3R0dHUC1BQEFFN2sqRkRKLUxiej15bSMmTmBQQEpBQzNNfDw9T0QqZDh1R1NBTWhNdWZwUFB6TDIqCitkO3trN0E0UC0qLW4ld1V0KmR4JnIlT0s/az9MWF9qTGp5K3VvQHImbm1EP0U/QnsoPlpOcUd2ciRDZyU/O09DSEhoR3pEYXtmUDFPOUtRCitIMDAwMDgwUH5kPU1eZTs4Xz5+SSkwNWM7MTA1YnBwMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpZWElXm1BVmx5Cit2ZVoqRmQ3Vnt+YjZaWjI/biNhZXJGK2NweWFVIU1ZKE9oOzZ6KDJrdXB0KWB3RSpIKEkteTAqXyZuKDU+XkcoPHVZWWw+aDIoNlgtNj98CishPkBrTl8jaSR2eCZZblZKTkYtTm8qMkE2UFZCUzZuRVBRTj5pZ1dgbz9rJWRLbzRkM3dqeFU/S1MwSmA/KXw3d31wVUQjP3hoRmYjKmc8CislV3RmRlBHQStqVnFlbyhJdH5eeHkmQzExMH1XLUxZfFlXdHk9TXQ5MWFObF4hJH1sUmgkKyVEO3RKP282VzlIY3YtU2s8dURvZUNnSVJuCitQbmtaWHRpc207KEAqM35GUHtwKiNVeH08PG53PTxfK1hHMFI3IUdNdWgtamxURXlxUyFQQ2ZhZGlHQVRqM2BicnJlS3Mldlk+ZVpMK3lmCistIWxAKkZycUAoSmI8bkVqZ3MmXlRXUnQ1RXh3JCQydERjM3orO3s+WGJwX0cwb1VVYnxVJSNpNDBSXm9KU09MU2FkdihmK0paKzgxdX5ICisoUipOVy0paytEQGwpcTshbE9JZmlyVSp6ZThUeVBYRCk7eGVIa2lPdDA4fFpoVkM3Kk1JRk80RnRyZ3JTeWZ4PTk5NG00NExDNGI0UUcxCis7KThWMSNCRksjWnRXRT5YKkIjWWpvbE9hajsjej9JflJxX2lZK1c7TVl3QlY/OzRyO0U7clFeeTVSR3N5OElJKyVEbj5ud351dk43V2IlCit1USVxQUBYSWlVU3RmUUtpcTdrVnJ2fEtaKFBhX3YkUGh1K0JTb3VqO0Y8N2lleWJ5eD1MMUREcFpXKTc+K3YwWUx5cHlRN0QqVGt7OTxaCitOdHNaSVY4Nj84RnBMWkNuVUxyczRndHdWJj8rKFUhVkgyMmFRT2x4V3VnKiFzWmR+X3Z0eWRKNUZYJF9HVCRhTFRgYGRVaTJSfDY0YmdkCityNll8YWV4UDZ4fUBjUS1QYzx8PzdhNkxWbFVkKW95PEpsQXp4JHFYX0x2Km5KPmgra3NmYDZtTmk5PVY5ZGFmVGpefE5QPEgpUkN5VV8oCitqVmk2UClPcSFSby0mbWlnbjNmWTRhNnReZHBzOGE8WExuP0V5N0tGLTd6RCZXPnNta1loMGFoZ2ktNyoybFJVNWBpIWl4O3ZYcWwwY1pRCisjaXVRTzNye2o9PkYoQmB3R3UraXRrWDBDRUI+dEgzVVZmfV8rbjRndlE/ek8yIThvTkcoTTd1c2BMI1R6RiVQNyRhcXBwfTx0UUQ8eTJ1CistSll7WmZ7e2JkOCUlMkNqZCNORFA9c1oqQVRnPikmdTtUWGY7bzZZZipycjQmIzxwI2QqPEQrIVlNbmB0KjQlUWtIPFAxTFVPUHFjazckCitoMWYzeXFMU0gyRWQ9SGJlP3lIZyN4YUJ0I1U+TG4hPkVEKG1MKFVrTzxlOWdKcE1XK1g5fmFhdmUqKEBmcjBJbWdaUGEkIzl7bXBYaEROCitMO2x7T3tsckJhUkpDNGRnNSRoN3tTIV4rUW5UNWJeZnI3YWVFRjBzKnZYTUp1M3RBVi1uNnV6Q0x2aGV+WmZgXk4jZGM9V201NkxzZEFmCisyWWxxQWF+b2ZqWk4he2RUMzNwTkI2I2dhcDRTKj1NVjhMKnQ0VHFQSG1yXz1NfVVsMnNFTWooSEk4Vl9ORT5ZQjR2NCQ3ZzN7RC1abF9xCitVKXJfQ1ZLRiFOdyRDa1ModHZyTzZjJVdGLWl+a1BaMmZ2NUZpUWA4fnZ7UXBhfnEqIz51fmdtRlVfJCpsOWBPNmVkd25ZMFhEbVY4big8CitWKjQpU2NTakhuJnN5NUpoezAlYEVmY01sViZMU2FYUCZeSzBvXztpY3dAN0VkSTVYOzhHYXo9b1g0MHokNFpIVElWZC00NEg0V0BDWEpCCis2WUMxeUtiSGBIUy1nekxWQnJ0SC1ya1BsQ2kpQ0tLcU5ZNzkrNUNxZWxRYEAzaUV0SVBBJWlVaUdqTiU2fSFwNihDej4xPmd4SihjQTA9Cit9OFU9VzghMk5ANGZqfU1ZOStBJT8pPTJ6KiNYdzhLQnpGJkZrWmFJQzRFUWpHIUVQYCRwX0BUYEg9RD8xViZgUWJ6Knx+SylAWTMrTm5ZCitrRU5kVmwlVm9ZOTh2NlMlViNvZmxzKiNKPX1RUkF5JDQqTTBWYGB2QmdpZFdJbE04TSUjbXAhOHYwSSpFM21sRVNaNVdeN0tEUCN8KlYjCit0YUQpVHhXYG1ROWkwRiYlXiZRWWRRTnA+bCkqRVNVbFVmKTdKYTFsLTB9I3hfQzIjdXVEP04xfXI8Y3syKVhuKXZIcll0T3MmRkdqOSpGCisxVCh7SzwrQjtBZHdnb3h5JUZGOUFvYjVraSp6IWErajR3I15nUUk8KFg3UzN7bik8WWEwbDlCb3ojRDJsXypZaWlaT2JyQ3pRT04yb0B5CisxRm44UzdtJWwzRz5WbipwQTBgeCpgYyZVcTQ5M3hoUHYkPTg4Wm9VaGEtbzJvQUAoeUZDRmxxe0lNfjxuRkVwQnJ7YjFpYWpVaUExcXJ2CitOMlopWlZ3TDwkSkt4alJFd30lRlJ5e1JpRU9pPV8qIS08YW55VEYld2FDcX0mRF5+fExAa2dBXl5HSEJPZzB8Sk9KVEhXM04yWEY/b2BPCitfQ290OFpxVUBBcnJEfHlEQ1gyTkdnaj9UMlhAKUZRUUZqYjJaUEFoRUZyeFdgdW5gZDNKQzNoUkZKcFQtUXM7YGtyZkY4SDxMbC1+NDs9CisheEdkYSM0S1o9fWJtMlpye2pge09OakpYezUmUHpBOGEofVo/RG1iND8kal9pbSRGISkrelZmR28+WFdKTStCUmVAZ2h9blp4JkB1PW01Cis7TzwhPz5HK2k8dUk2Zj0weiNVdjBxNXRufUV7MWhPI1FNYCo4aD1xYzd5PjhUc1ByRSFwYGFQai1WS3R0JF9ebTAoYUl2bGhRJko7T3RCCitWLWMlcCYpPzk7NklGd1ZnKzduOWJ2ZWB3NSheLVZVblF5OSF0e190X2NgQHdWNSo8Jj9YOHh2bkg2KWYrKUteI28/IVFUYC1gdk0lbiRlCitKdEZJMGdCTWd9NG4/IVFhez55X0FST311LTRBblklZl5oNUQyUFB5TmwrVyZSPW5MKXc8RD9VM1hQMmohNllANUhBWkReWG1TPiNGYXRNCitEfSNZJW1PWUx4ezM/KCVxYExDWT4wYnkpbUYjYSp2VjBPakY2MWdteDcpMkJ2aiNsYiVxcUpPX05yek8hMU1BbDc9OThJKHVnKGVRNnBnCit8QkVGfTtSTzZveUk1PUBWKT8+NTk0P201ZjB6dH54P25qND55fWstSzJfSDhuP1lfdWxnWFZoUn5NK2N9SWEpUkdfMEZUWCFOUGZuK0FrCitLZGlvbEcpaSQpNX58V3JmX1BnZUxNbFFHTDlXUF5Kai1Sb3Uzb1Azb3Q9dyhLY3tmIyQ7JDghd0hRTiY+N3ZjcDh+Smg/eyRzYExQKkd2Cis0NTFqdVc4ViopTCotMTR0Nz0qPF5PQktRQHdmNTVKeVVWNFI1dXY1UVZOK3tkZXBTdDBmeFdWT2UpPV9UNUA5aHJ1WXBhNmRzJDtxXnVjCit2ZSkhZWJlTjF1MVE7dUNWM3hOTH1TYzNeUlV9MlpnWXY8Xmg8NTFWKmolSGlifDc/ciFVRmc1KiFUK1AzNn5FaHd0cmU2PitCU2VyPUdZCispTG93MXY5Pz9saWZjU3BWSFc0UykxOTtDWHo2XndiRUVxfVAqJF9nNXVYY3M2I0cmemc7JnZuQl9MYnQjUV90PDxaaz9aSCNSZWQ+K1k9CityKT1jdWFxYSlvSnRHbmJLPDVKJSRySHlNVEZ9ayk2eytHeFBfYWJlOEFYS0ohbklfSm5EbV5RMkZDI2V3ZEpXe0l6aFVoZ3l0KWl2cmI0CiteZytIJVc2bj8xRCs2YEB8dD8pS1RQMDNiclJHaFViRjE1dmp9Nl88VERHQ3V5eWxqJjE0dnkoNHcjaGxMV21Eck5nOFdqcjU3SSoqd1gyCis5e2hxJCV+YD1XfEJyZzNDM3kqXjZtYS0hbml9VDEyajlSWl9PYDwmNWorPVhSOGlnajMmcmw1LWB9UXAhaks4MygxYjQqLVJeai1jdCpGCis7aDxyITk5PWVZcFoqaG5lY2kkSnxMKTVSO2h2cHRiWEwwTmxaczQkbjU9MyhiYElWN0JfV3ZCa3JZV25OM3l9QmJwdmYmNl9ETDB0PlVLCis2cGRmIV9LISpoWmhqJCp1X3FBS3o+RzNwMS0tcHh1ZEJSQ2hvaGl1fiNPfDRzWDBwR0AyZiYmT2xvWGRrY1Uofj1XT1lyLXk7TVhTRzxUCitJMSkoeyZVNitMWTNkUT1kcXxDN35kaWY3KTZJJUFsP2BMQWklZFQtfURjcWdgUWcpSVU3O15GUnBKe2BhVWMxR2R5RSMpTUFiXlNxPTI2CitjMkRabnUoaDJLdjhlNkpOZFVrZ2NUcz1qJUBLNFEpYF99dVY9fXs8OzlmenFzUGlMSjlneUMrKGFNVT08SjtEbkxiTUYtZHp+a2EmclRMCitVdTt7ayo3c2g9Z35FR0tORCRHZWxPRksqbDtoKVhjO2U7UG01IUM8SFk5JkxDSlBBYT12c0l1cmY7aU8zPzh1aHJzT3V8Pm9xVStPZyZVCitXJS0jX2pHJmRiWjdLfCNxPkMoM25OTEh7bHpjKCRwSFQ/fXAlbXY+X2VNSlUoZ19FZFlENCg4aXtxfT8kZURtcz9NX0s1cVVEeEF+O2c7CitiM14qamE8X3ZES0hsVytGeVAxanpJYi1tbnN7cH1rcWJPIWwxRkp3RiNKXzRsOXQhezVsWHRENGZIJHV5ZWNMTX0/eVhXcVNEZVJSO3lYCitxSlpuYipfNXpkTzYwb19eRX5mWkptPW5ua0tAcTdLa3VXI08qKWYxLURjOzJtalk0cWVLbUpDbyR6bUdgPyg2Q2liR005PVRmZGdMQFJWCisyIyYye2w4V0czczZlfjFRWS1PMDA7b3tsQD49d3loYj9sQU9IWXdiXnJpMzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+CitWUHxEP0ZMaVFrWS13VU1GSm9fUlplP1MxWD5WP0RaKk9jYWFDemxEYEgkUHluWk02cExDbkNBPGpOYyQtSn0/LVFuPEYwN2AwPjlNfXRLCitZTkY0RD0hITw9fWBLVEdJaWB+Q3t6dzYhOVNkKzl4ZmdKPm5NODVOVC0rZXEpbntDX21uZC1XeEoqb0loLUxCVkZ2bz5HI1VZbjBNTWMyCitSXmVSOHR1K0QpZTA8dE5vPWxednQpdk87ST8+RzJFdkk/ZWlPcXVPMlhvYDJ2NmM2NTRwYT8qR0VpITN8Sy10UE9XdyNsQkhXYmo5YHtNCitTekhsJHFwSndRQiFANTJvM1ImOT5pOXZ1fTVHZVdFQHUpd2EpR1FYYHVBIVZVMTNCTD18Nih0P31BZGdydkJ5NjlKSnd8U3RxWUZWd1M8Cit3Zj5tKXMqY0cwRCs7OV5XO19BWGZ3b14jKFAkYFQ5dDN4d3F7dCshPyNgQXg2OXhXdHNgcG9lWElMdFM0RmN7clQ2cXp5RFZeYHpaVWdRCitkQ3ktTHBXaThmVV52ZmJ8TkE+dGxtZEcxPkhHSnV5bD82SW15SzQtVThta0RJMGZEUiRtYyZqbmFJfCsjcXZ8SlJ5eDxab15PaE5je1JVCisrbHtkeDQwe29ma2RXMmlpXk5PUk1ya1NvaiViUjd9Ry1gPzQ0OGUmWD1hPjdyVVM2cTw7YEtlPlo4ck83d3U4WCMhLXUhdEd5NEFDZkFDCitrOyFIUUhGenAlWXVtPW0zNWU9NC1IUHw5M20taXZgbCRNNyk9N0kzeypmWGsofVpTKXAhIX56QjxkTUQyZUQoKDhKOXNvZTQ9a0RSVz9BCitxO0NtNDI1RlB2NlpCVTtNWCoySWFrPksoRUVGdElnWkI+Z2Z5dHkrM3p8Zll9VFdDKlFRIWFMKVliPE9GeUdKUXElcEwhVmRoUUZZX185CitNNjZ9cFBaYmBwUX19fHQ5eGtJVWo4U25lR0NzeiZWWng8KSNaXnNTPU5RdDkkZkx8bXxzcXFoRUdwVj5IbH5WODg9QGNxcDlvNmdWWXhLCis+MW4yUyVQWEs9PlRwNGdGQlctLTVJRG1rRTFFS0ZASUdwaCtzV3d6VjskX31ocWg3bGchc2c+VEVqRVRSSmQpYVJAcj1CSEJ+PktrRn1+CistKCtuWHhCQH58RjBKMWdXSTsqVHtkdXJldzskSyUodTtHO0MkRVFFRSlJMVpHcXt7cXNhJEBfUVdta1FfdCpndGRZP1c/Q3p8Z0J0Zk9XCit2V3VUKyFXentoNDs/QEU8amJfRnREcGgzWDI/ZSRrI1FJPiRFVDRfNU51MEUmOVc7QUU2YD54dUtNP2R7Q251THVBZDFrYWw5fTNXM2ZaCisqKkomfj9gfSszMjFnPERqIzlveHRXXkh5TEkzdlQ/dVBEKDtqVWpHNnwoeCVKTzNkZ18pb0BmVzM8VUw5VCpKYEd4Yl82YCE1e1R4QHZwCitSUzhxOSRrOWwoNDxTYHteTjt2RWJuO3VaO0trdndRcGclMllrand2eG57WHUmUyE0R2Jje3NnOzd0cEdNVH42WWJYVyhOY2EkdUFaNGkxCitxWkxpYVVzayVmdFlJTm5pa2pxdSEpJD4ta1pROUpSfjZ1aSZpZGpMQVE3PCtNNi0rWV5RKDJmQzgzP1MtVEhqVnBVK29TdDxKd0xpcCUyCitiJEIpJEleNU9aYj5oaGVXSit3Y29BT0c5cWxsZiYwNH1nUXJOZFpBcCh5QVotTUJubGtQcnJObUBgcV9BLStwfWFAendKYHk/WFFQJiVZCitvZVZOUV5lX0JpfUhqaEohN1I2Ym1GQVEmSSRWeD9ra0xSPCFEbUdQZHplejdnT1ZpT1Q3JUlhKGZxTW15NjJxO3taJEpEYTElR1leejNjCitEPzg/MGg8ejVAP31NKSUyfCQlNVdzMTtEfmNBIWNgenp5SCZoSmB1b0J2a29EanAwekBpNlR8aFgqISNfTjx0OHJXalImfUA0QVkpajE+Cit2PmtkVmw7NT1AX2s/UUpOPkZeMjx0QnViRzh5V0EwblRvKlRBSVV7anh4UTF4O1d+ZT50Rnk2JmI5IURycjtha01mNVo/REEzbSRuWEFKCitWMlhjdmo7dlQrMWJwflNRfTQ1encpO2VFUXE8R09JVEhrSlQ+JiNlczg7S3k/UHp3WiNmQmdmSXFaZ0tqbzlrUTc0amF5IWpkSk5Ebk9RCitqdTMyNEk8Kng5aG95LW88dk9AdlBpZm1RNE1VUXwxMDROYTBRKCpaTzQ1RT9BQmRwQyNqM1NDTE0zZmlEVXtTaClMfSZvQyV+RUNVJUVBCishejFPVlheUnZKVylTalombjNLV0VGLXxuJnZmV1ojN2ZgZlVtaDloczczSDJSSHw3IXI1UUpRMj9JP3RaMjVSfHd1WGIxP2tUbFRQKXQzCityRioxbiRHZ0Y9WnImfEJDdmkqZHZBPFNSYm5zO2FPfm8mJHt9WGElYl93WmdVQmYhKUFSPjI/KG87WXZoc3VTYiNVN3VSPTEqdik4YXFlCis5PmYmYTI0PXl3V35ifSR+S189UjZUSlIqdEBSITlmQCstPSp2fk1TUD03REVVPlJ1TTJSYjhAWTRgfXslVVMyO09EU3tCQEVmYWtlNl9qCiswSWZhMEtzNXFoOyhBTTlUdWI4WmBfWil1cCt9MWtVX2xGVWtidVI+ZE9tYiRDcDlndGhffHt9MjteWWxMcld0TFJQPkg9PjNIKyhON094CitGcSpiUj5EMnJnXjs8fjc2bHR4b05kPXkoZUFnO2Bnd0YzY0ohLXlXRTJIZkNYYipmZWM5Z0M0dmdgNVpnOSZ7YkdUMHN7P2R7NEg0V3dQCitBV01SKUx8UC1UTWtBPV5Ze2lhPmwqRnghT0QhOz5RVDJ5fXVpWlVMYEloa3s8KVBGKkE0MXlYSEcpU1d9WWYoeiloQ3RMVWRfQjJ9QzRKCis/IWR5VS03NHl9UENjd0ptRF9jJTIhODBFO3h+YyFjXjQzfipXWF4qKT54dCVwaV52eXVnWVRVYkA9VH1QbFdKSEZoYj9tPkR6RXlPR1dACit0eD9BYnFSbT9gNCgrYVBmYCoyWDduYHNgMGY+R1g7PHk4RSk0PGAzWUFweztIJHd0TT9NNXdMUzBUSk94K04/MTJAZjIqNi1gMDBTbUtSCitvRFFzSm88UkMzT2kyUzItSlo5YDN6VVlwRlZkcld4N2dwWCRlLWB1JEh3emRIe0pydnZaRDNYUFZEZTAoXn13c21AT2NRPjhvMk5rMHMjCityMiZsIzsoIXo9ZGVhS0s2cH0teG5DJmN6K2Ruc0pOdX0wSFdiY2BBNCEyfFl5MiRHcEZ7YH5vaVo9WmdBXjxuPHU8PzkhM0s3Tj1ROysjCitGMkdHe3FCa3tyNUJFQSt3TigjREtZKGwkaHxMdFg2Z2RmSSFheDg/XzdHNGFVTSpLQ3M+eWFkbE9CKWYhUmg/K0tpYUJzeUJ0K1lBV3ZBCit9YWBKTy0xe0tzQ3o1JSlIT2hFU1FyTFYpeztrQGRjMmBvZT9tUnkoPSRnJXpuKTJNYXlAUyVCUyRQOCQ+PXUtQVM+WkBuPlZlanxEOXZnCitPKUdeK09pQ2FoOVRCNGxoWW59WEFyPSl1QDY5QGBTMVZudEBVcUYoNHA5NE45UyZ2PjZaMTR2SVBOdzR3PjtKTHVYTCQyfVJeaUFYalFQCitJcUd6Q1dXKCZFdkFZVlBZQHZ7RWNSZCpkZiRRTUlsfHIrekwoISZ6diQzV0tOUU5zUnZyJTJ7JG14QDljaWszak9yM3xAWis0cnhGWl5jCitOIT9ifnc4cCZJczN3Ui0pMHQ5alo0dEk1eXk9Y2dxe2g/VWJZSkA3YHk2dTM4WilnTTkxOGB4QU90UUZjIUhVP0Q9TDErfXZFRzA8Q0p+CitvTUw7Z3RpMi0zdS1yb0EhZDNOVHd6Tnpxdz9CMHorcF9gK01aK14yWWtIQDFKTHdzcGIhU1Rzam5wPjNIUWtuQkFOSnhuR1RrOWRaOyVyCitLZn1LbUZvNkg1enE4YUYzbER6Qk1sJWgkMGRaaUE2Tmpja3BuM0hfSU5gN0luTU10N2dAWFByPjVyMnhETVRZLTR5VCt4VDhOeHliSjYpCis5aFojN3teMT9PcjF3KDskYlZjRnRpKjw3PE1Yb1VMWD03KSlqUCZDJmBFc3BYVjVISTUmTHBoO2MrPmQ3TzYmJS09c18kOTJUWmdVYEtsCitNU3JZNFJ+dGA+eUA+dXZlRnUxMDFsSG5ANnsoQUlfPSFVWlFDbUMlUnVsS2s7K0g1RzQoc2dmTj0wXmJ2MCRjMkNlMzAmIWdhQUFvZ1VfCitPakVhIVlwSSohMnRZTHpHaG0yPFlkb059KChET31FcCtkSDVTPX5qZjB+VSZGTE5eMSh2SFhzKWhVMSlWY15IT1M3PHdtKGZqJCNfanBLCismbjRlVDRPcm97bSY1fWRWOFdXdSNCOyR9VyM2UlNvTXp6VTAjT2IhKU5RN2hyRnIjKWFDKm9mPm1ydHEyKmYrQitsVCtVSjROKVllI3RACitJK2RXOVZ8MGAzUXBIUnQoUk1PdzRlPzViYHxWYW8lMkRSRU00dHotVytvKW4+UUokTiluT0ZxWjQtayl0SXpVZjFtbkA2flVJVU0yK1FuCis9OWIpYnY9Y0RNO01KQF59OFVoPWI8O0V6Ynw4N3VBSnVyWjlAJCowOEsqSVd0emMkSypqXn4wSit5N0xDUStZWXVgITd6NiNwdlYyRWdwCitrMEolWWFwYHY7PlUoMC0oJWY1dEZsZGtRQ0sjR3t4TWZMenRPWHoqJXt8UlYjamJCYlhzSEd5KX11KV8xQnN2RiFJQHtadiM+NWgyIWJ8CitiUDVzVFRYWWE+O1U+eEorb0EqMkRVVzRYQCY9RU9vb2lgdzdEcysmYk5gK1M0eihCQUVCemJhSz8mLXZkOD0mcW5OdCpqKUo7Y3ZaPm15CitKKUc0MEU0UHtuKjZBRHg9ZEtpPSpfLWt4MCtoJHJaK2ImbVgpZzx8cyU9QUtpU29uekpgeFpISWVBfHZATDVPZnNSRElBQjYhRn5hVD1vCitONTR5UiF2dSk7PX1qWVlfPypwUipQPGBkdldQKyN4TkFfc14zSiV5M041VnAoKmhNKzI4P2lIPkdld3ZZPntsS0I5IzBDS2ElQnlDNFBGCiskNzl6NlBXS0xzZi1JcDRFez9CbjA0JTNJPUJnNXF7ekJ4NTd1b3J1I3NVZ2slKXYpWkQtUSpPeE9AMzFAVFpUekU8NUhtPGBaNHRnKGNkCitfZnMkezhrSylSUnp6eFFBfnkxYkE7dHFAVDE3a3o1eE1jQnNCMlFCZiQ9bjxtX1F6WkdCamFabDcyRXkkblZze1hSfUppQ1Y/e29BWXBGCitGRmRubj4qdEl0e3VObkM8b1djTzxQNUZwe3Q+aUoyUDk/bk1wTjxidWdhZGZuazw4IzMkUzEoM3UzQkdONnt4VW9iJTRQSk93TVVtU2cqCitRQyp3TXk9ZHxTfVp1NClWQjN5PT1tdkJScjYxRWdSeTE4OV5qYWcje3pfdzItSWR9SS0jIS1QdDF4YjV0RlJjfm57QVBtSWkmek8hPDxNCitzJUp6ZE98SE91JDhGQ1FCamxNVkxzaSlCYkN+YCpHO2RJTm4oekJnVFc3Kjl3UkByazBPclgtWShFciNVM2twT2JzVmRBU2tOaD1AUU5wCitic3pHJUAlQ2clY2AjV3tXS2NTaEElTGNxcyhlUmZOcDR3VS1haENzZ2RkeW90eF5xWCRCYD9QWV5NQjd1aEs8UyZ+WSsqc3xYTjdWamxhCiswQTJubCkoU18pe2skY1ZEK210allEXkQtNzcqbF8jbTdMeSM+cjUhZHxMU196TkUjSjhBMmYmY2pmXnEreFBTWV5gZFpwS0QmNllJSHExCispMCtqSlUoNyVBK1U7YFl7NGchU1BPQllsYEEkQz1HQHRRTT1LU3w7bGZvWHwzUjthZTE1YjNZRl85bHF5NW0wXkRmWUw8RDd5KUtQa0BPCitMKE1EUkpNQDNAPmU1ZFk1eCtCNGVMdyQte3FpXy02YGQ3Qk1vNVdhdUtUalVUTHMmdXxmMXlOa0h6dCUjZzFAMmZpTVYrSE5yJX4pRUZJCisoMllqcT1kMGR7IW9UNFZTeU1fQT90UXQjfDZ0IV5kQWdfNW5QeW47dWQ4bVNIX1hUcGc3YWhZT0dAWVh6bk9MMWh2Jl5waFNSPVVASFA7Cis3JkJXREx5SVZpfU0pIUd+MTklSWklJjhWVT5xJHYtfGYmYDhHcF97X1F9R1JVSVooZGVXKnomamZ8NUdHXmh2MHdwQENtd1ZGZ3lnMSZHCitOXmhWeV5DJTVQd18mZyhtRiE0QSNIfDUqIzZRYGVpYFl9N0p7YVVzKVNsRXZpb35NbSMqfDdrNDteRj4lZnZyViFwbS1pT1c0Tzlne0c0Cis1eztlTDhLIykhY1dCb3lsS2h8P3h5bmx+eXchIXx9b3M4QiZPZGR3MzdZaWw+TEtwezBwZ3ZlUkhQOWl+PSM/fjl2THx+PDhCNXt7KUZ0Cit4eDEpZyRYRU8xenF5cm4rKG8jZHgqdT1Le35IRXlmSllKSF5rayFscmQpOGp5Pmc9d2kxV1F+ZFRAT0o7MDhIaT9ITT0zTzZIdFhCezZWCitzJDM4JjMhNUptOG0ocSZfZ1BuSWJNUk9RcnRJaHdDSXxZKDZsbHNiTkdETiZ3Sy1sKXJEQE9ieTJ1e3NjSmVqYlJZaFFydF5hNkxsLTJBCisrTil2Ry1RIz5ZWU0xMSVFJmB4RmU/ZXo7Mj9ZUkgkbmNDITg5QTNhVTR6UXhlMURMSzgkfDtEfVNiXitpbXV1U3l6JmxmSF9tQkheMmVvCisqeXk/bGx6Xy0xZ0tiOUJFYjxgcCRXOXgxbEckV0U9MHZQfGh6ZGpnUmFPQCVzZjwhZmZ4eDVURnBZcWw3TnMrbD1vcSN3dmIpYVp2aDMtCis9S3tLdkVWRz4zWTRKWGxjZ1MxN0lVMXB1UnM4dy1HT3l8TE0kOX57NSk8STFOU3xxVCYtRzxeXnUtZ004dmw5V2c2QXZlUiZBOUY7TUxHCitNTT5STzhwVnhhKmRsQStgWWh1RFB7cVFzIWI/MHt9Q0Q0T3JBRiE9Syl7PUh5dnoqcjdNK3RWY3pYKDNZTzxhWlJxZnN0JSYxNn02REIlCitHS0dCc01mclhtXnxzNyYhP0omSnUxWXB4TEZXdTljaklCPFBjRkskTlB3WXRLZVgqbXFSNEA7THVgJTFKVzIpazx9RSU3QX44VzU7OWJXCitXQTI1JG18XlhNMk1KMlY+e2pxe1VRLXlTVWBOKFojXzReUXohfHUrcSNUUXk8PXktbE9VUzxyOVZTYj5GelMqRmVXQjQxZW9HNVByT0RLCitKSkxBdEt1Mm8wYD8rfkZpK1NYblUrVkBGKm53RyZEREN1KlVlWUB7cSRuNlpLSz1SaHAzZG1NcEhLUCFOSk9GWkBUYT4mRHRtSEJJcEAzCituclhnejh0b3k0OzVfeWFwIztOQUZNMyg8Zj5FPnRJYjdAeUJtemRKI0lvRTY+en4odTcrbWUoSGVqS3t0NlJIS3QwdXZ4NTRmN34wU2RsCis1YiRsSExRNzVAZ15kO1Z5bG4tQmpFTjZTb0w9e2IyPUUlWWxyTkE7aHxhLTgqZD1wOzwhMjtzJkMpZEgxeVBCYmsqYnV4TGIpfnNNKEtrCitKRXNCSUZyRiF7LUlsenxnRSZZZlBGT2tJcU5Lby1ndn5gdWcqbT1XaX1Cc1pEWXczYjF1e1RaJVRJPn53TWdTOWlJbWt9P3ZsbHIoOV5rCit6ejB9SiZJfFdWVERsZz1sck9aT0BnJFU4K0otXm9eX1Eqe2hoTl9JVksoXlFROW1OaWk8UkM7ZkphQ2JkO19mI3VjcCpJYEshfV4oVUVFCis7amxjd1o2Z2QkSTJlSyZyKG1LOzlBe2dZbXRRRUcwYnBWblBZXkkqWmtLSW9eNTU9fklvQnlwcHF6MUBGP3U+LXVOS3dpQHQ1NVhoQFZECitDKm9pM31tQEYhSmJwTzhMWWxyPDNhcTVJcTEmR1ZneGZzXyk2SiphamtGNCpKIXRnUUJSO3tqOCYxdWJ1WHJjakg9TGNtQWYlMSQmV01lCitrNipLZHozKXAwVVpRaT5abWpsUVVBSnleTm0xQlZqUyhGNTV3bHR8bFNWJD5FaDdQPC19KXNvVW44d0x+eXk/YmQqRGA8NkhtN3pIZ0QhCitNSjEzdiYrX3coYHpJeyR5Kno8clYmKjM7KERWWS0tP29MMHg5fnQmd0NZQEN+I1ZeeFEoJTdXNCEzR0p3cyVFUENPRzFXbTNzOGheKWhNCitGPDxkSz1XN1Z2KFBRNSVmJWw0UHIqRmN2NnBzO1p+LWxhUFZ8NXlLNk9xcGtWNjlZdkJ7am0qZypCVzdhemMwZkFiI3kjWXxTIUZZYCQ8CitFWWV7KD08fWo0MiVTX0BhKkRSS0k7ZUZ2bUx6IyVmTXwtdm1KJnx0cko3QDJiNlJ1LXlhTWNEdFJqdF9RWDlyV2koaXV6NylkSE5FIS10Cit6cVlieXllUVI1cTRMUEw0UHwxVSpZY3cyI1FDX1lkQW5gd1ZqVyFAZDRJUmhLNVF3RHhZPFZ2MGZjRk9aIUArdldqV2l2TVF4YERScjF4Cis8aFV0OE4rYW5tXjZiQ1BuOGY2cFowcDAlWEw3Tm5TQFI/Sj8rajEqJUBOYGgxNVBCYkw/elhMZj1MODE3PEduaH1wR2U8cFN1fFAwXitDCitaZz5YdnVUXjEkekJERmBFaSYqeVA7bDNybGd1JH5tb0w7aW4lQVJTRV5la3IlUDcmPSNXN0g4NlIhMmNKQ00xSU50SnNjT0ohSHsmc1I0CitrPlY4YWY2NDV2THNUbXZEQnQlck5xTHtZPVJMcTg1e2VwTTJVSHFDbE5YKFg+c09rQnt1PGVVKE9JPHpvUExeVjJUYDcmNHQkWjF7ZjJ2CitAX0xfVlBpeClVWTYkfDFMNjdpJDBDWW5jJCpVNiN4MzhRell8PEJvYWBYQHE3TVlKWT88cDZ0SXd5MkxMPnMoPGl4X3NJQ2hVTH0wSDVOCiszKmNISTRjQnxJRkdQeGpkKl9Icy1DbDRQQDtoKUZoS0EkeyVmPXxFM2ZCckRadmxtIXRYRShsVjBueD1fJTQtKl4xYzdQTiVLaE84SypxCitvXiEoZyY7bntGO3ZhKnxEJntKfCo/aTtAZjJUcWgtSGN0V0pFd19mXip0SEJBXmcrKzlkVFpabHY5KmBZSkAlPDd+cGUyV2NCPD5kJTt2CitZJj5KMHAzX1NZbU4xSlVqVlZ0e2B1ISkoeCQ1ZmJ8VXFRbjJSQ1JJXldzKDdVUXNJdU9YQVJ+MEJDTm5pOWx6bmZ6MypGPXQ4WGxDK1QwCit3QyNqZUMwRlVsWDVXX2xiOW00YiE9Nk5pcHhudW42YmZmQTVTVnxLYT8xUUo2fG1QOEcke1VoPzdacWpxQHFGdXA+cWNGVGN1VkB9aDFkCitOJj0zTHheQzREPG1DRClUZTRAdEEpNSMjYzdzPmQkMF9rTk0zZ0VPP201WT87aV5VX2JVMVVFTD1vc3AkZjZtPVckYUwwNnYwKlNYPClICitFWWJIbl4rUiYzNyo9UURNMj9uRGlzdzB1PiNPZVF7UHl5NllySDQ3bEs7JXhiYV4rN3MocT1Vd1U7aHRTSGlKen1nSmxzUiQ3MGR0eypqCitDKWZFSH5OWlVgRCNTeCVXS2NMQlZvSEJ9c2tXenl0OFdKRXdQbFFYbylVPiF2OzglPkZxUFprNjhebUFhUmgxaGt0MVd3WHFgVmh+PjdJCitCZHcoTitBYlMyKWNAVHdqWXJVSmolNjRPVDk+U3wydXtgUmk/IVJVJD5FVDxWbE1Pb0JvdlN8QSpVPnR6alJDdjFkQyZpcEU8eGNKSXAkCitle2A+dWY7NG9fN3NDZTQpUStIe1cwRnV2Q3ktQTZJeU5ILVU9T0N3NW1hWTwhMz5wK2ExaXVKPERGSlptbkQldVR7XnYkbHFqelI0bXlqCitWfXdqbHFgN3Z4azgofVNzYmtyd0VCREZwRGhXKX5wfHhfJjc4IzVnSTxrfkokSjcmXzdvNVEhUjwjKHBDfG1kRmRxU2EyVHclS3BAKERlCishNFNJMzcoREQjVW5teXR1UUw/c3F3Y0JGIWQ3TV9TMXhOY0RZX1JOO1FyanFXYl93YmRAdWRQNWhHZnx6VSs1fjVEMHF6bHN2ZzAkVU9YCitOZFBAd0U8TnNqdjEmYDVhVTRHUyhXTjQ0dmMoQGZtRFhRbSRWZkNxPWw+cH5taCZnbGRtWm5AVVBhKmd9Ujd0V0tEcX5sJWw0Q3VyKTx5CitQfl8xaHBaQSMxKXNOUShWbEApaCFYPGFPaFAhZGd7dk50JWhsIW9UVSZRei12QGllSFZpV0EjKSo3bEZ9MCUkM1FAZXJ3O096KGhRfEwjCis2cUh6cEx2SnlZbGIxbUM7c0NjcERGMXVZKFJrQ0N7emQ1dD5ub0x0M1hLcWleVTNhKjZSSSp1QGpAZ2Q+RVQobXIpTz5TZG1GODkyd1hnCitUQ1g9NEh3JVh8bThGeX1meVN9N0k+fE5VNSpMWjZtRio2UWArK294MV9SU01HUjNWUjUjO3NzenF1YDdhYjw1RiU9aygmIUhiZGg2aEc4CitYJl5MI2ZmajFweWsjfllxZ0h1YjxgSm03ciQ5VlRFRmFnUGFjODlfeHxJZU0hRVAmTG43JUtFfSRLVmBGR1JENlQhe3JMWUlxcz1PJSE0Cis/c0ZWI2dVXk5uKVYkSk5IJUtAa157Mz1DNzAqIWAlYColez5fUCpNWj5zUngrLTthYWx7WiZhaGI5Vn5KakR0OC00Y0xQUWo5Uyl+dWFpCitCQ05Pa2ZVMFdSKiN3NShUMyQ8cWs8VkNiYiojUUZzJXhMeUMpTjh1aHVpT29CNmJwZGtvY15qSD10NkRTJlhaWTlHZD1fJGlmOyRUZ2ZjCiteVEl8eDxmSFE5SUYoez0zUjIhPSZaSkh0P0dkIz5uUVI0dnlwcE9ENFFjQHErUEw4aH4pcTlPe1ZBKlQoPXFESX5pUH0+WVZLZEczKCVwCitEV3J9eUZ0TURHPFRVTVBIPDlaXj16bX0mYXNyYUN5VWZhNlhWUkRtKTBgXkFgRnJgVmhoM19veENIKz0jez93RHAtVFk+KS1hfkszVXhlCitzIylXXztLYjg7IS1zWWVrI2QkUyNHVj9lJWw7RlQ3bFk/YCs+dDExYzJZISZ5OWFpQSolbSlsVzxKcVBIRyVPP3RsUytzQFhMUmV4LVF+Cit8NUhuI2prMVRmUWtqYlZhMDZeMmZKZGkrYUxQKTV0cEhLX21OTTZVZHFpfl90Jih6c0UkeFdsRENxRH4+elRPblNzWDczJWpRRzgrP0lQCis3eGJITX52SzloT35rPEQ5YXdvdXN+U1VALU4wVGo1UF48aW9QcFpZYzQ5Yy1oJSYpak52ZGk8dCg3T0E2a0ZifVklSHY/NDBFc1NBeT9aCitFK34xdXQydUImeCY8WGcoQkxvbzt4TTQwP3QzYWhaSUVCVmN5fm43ZllYQmJ9ZVMkZ00xeWA+cWUkViohZCspe20qMnU5K0NFQnZJdnM9CitmdkxNYCQmQnwhUkNleDwqdShKVXpMNW5tNFlMVVJGVVBGSSVRbz04IzkwVHZKXmcoY3glbElXODt6Z0xZcXxUQzc9WipRKndIUTs2NT56CitOK0dET25IX19fPiRfZ15lKDQrOT07Z2dpYyM1RnozTSZHXm9GYmE3PFZ2T0BYaiR+dEkxeT1wXzhRTmdCVi1WMHZYTGVUJjwoekVUSHVLCitAQWwzaTx9NVhsWUBhbD9FI15YQ2BSXlV6M0JfakxCKTgkJWVmeVhYWSZLcGpjbm17eHsyQlV2fU1fek1VN0I/Jm1rUVBwcHlxK2RsbkhxCitHdEU3SFlHWUB2Z05MeWJqNGhGajNEeklzdzw3USFmaX1yaHojSTRgJmYhOVE0eHV7amZXaHYlfjIyRWlJaDRZamBrYXgqZHlFMTNkVHRECitJTyZSP3AtUyFUP2pyLXZ0RlhSZ3hfT3xCNCQ5e2FfeygqNSgjS3szNEt1OVJvdFQkcjxHSy0oSXlhP0ZFKHY/dkN6NitXYmtQeG10P1loCit3XkpScyh0YVRVc25UZElfbUBSO0EyWHNjd2B9UHdKOzRBa2QqSU9KPT1SIypGSFRNT3w0TkQ3VmooeUhgclRTfVRoTT57aDFAKTctPGg4CitkU24mMWlpdj5QRl9ramRRK3BncGM0enZFYXhjdWQ2YTRfZzlMQ0hxP1J3N3ZPUVVzVDRpKysmQjsqOzlYdXxmcjFaO1FvfTdhZT5CcWd1Cis8P1Z2YktWdVVLfTJ6bDkpfi11UnNFNCtYUHlDd0NydT1OU1pGRGRfYD8+SEdfZnFYLXRvcUglbjVkQ2ZVVG1WJGJfP1lhWD5qPHM4XylRCitGcm9NTUV7VGUkbXJgaXlRVWZuO1g0REtLa20kbHdnQ3E5UGVePFY+Kjw3bSpZU0Q+UENZZSgjaGg3e35aekpQPUE5bT0xTlA0RVFma1QyCityVjVgZE9HSF5OJjl2bmh3dERLbnV8Qj5HMT1vZCZmMWp3c3VLTlBBUmFeaHhJeHtuWTt6S0o9Nm5FSSZCdzVUSnUkM3pGYG95VDszMWtPCitfJkk3SyRBflREVzd4bnVTZDMlMVooKzBPYUdgMVJXVSNxKz5hS19QYU56Y2k8RXw4VyVkTHJ6MERFKVhkX21VeUczPn5XTVlqeHE/c1FwCitLbm5mQWskJUlWTWhPWVFGWUpWeGR5NXsqYFNkYnFPSGohP3xIREc5NTE2OzxJVmd2bFI0YSohK2haeXQ0SzFCRS0zZjxickBQWXVQWnRECiteQWYqfjlfcVFCMkk0JmM/bWc8bGEkTV80fDFAenZkfms/fUZ7Z35KQGk4YjR2UD1yRXooVWYqRUNTfChDdDJjZ1RvQFJ4MW12USRkRyFjCis+OV87WVFYMklNVWg2dy0/Q200cGs8KEJFUjMrcnZuQXV6MSUhenNfRVI1KmExOW5KPlM1dU8meiEhQkFzYU4mRShTJWB1NjBBJGlKOFVgCit6I3dqb0BRVDd2KUBtYE9wTmVxPn5QbSM8LWIyck9YJWh1NTB7WUdlSkFtIUZMYSNfRUd4P0xGcm85ezk7TSVLN3BuZyY1dXcmUUd7fHFkCis2IXJiIXQqOXlTLW4tTVNzRDNkfnNKKXB4PSkkTUtnUUgqMzhjTSZoNXRgRnleYjtNUDFEJl8+QCFjeStrSTNwIyZBaiM2I1p4d0JPIX5yCiticT5abCFuIyZJbSs1TmB2clN7MzxPQFJKYG5HKF4+QW43ejU3Nj5MZ0ckRk5nems3cyNld0ljNlpvWm48bkBeTnZaYF47aT51Rj1ROSVoCis1WT8mKkp9ZCg4OT5uRXJVY21TQHRMNEJ4IXJ2MyZCaFNYP0ttPEJCa0xSRkdqdGgobyRESj5HVClMcy00TUF1IU55Zj8+OHJ3eERZRU1SCisxeCFvWD93I1VSUWQ0RSF0OTR8MD0pWU5EK1o/ZFMkQHFWYERsQmFlR0hXZDI0aGFje1dQQlZ1bUsod2RjaTxWfWwjO3RabWtLPHlVIUtRCitCPng9UVdyeW1rc1ckKmUodiUmaXhSK0d3bzZTbkdPNllxRkVQe29Jc0hsQFIkNSo0bnxkQCFRR2ZWezREb2xRc0p6KnArbmY/WlY4WEg3CitgQyZeMTRQdCNxQ0FFZGtKUn44fklDbl9vQENrbEtydmlKeWAheStkPWMmRXwhZTJebXlCeGhfM0RKKztXRzAmQEVhV3RHcUJOUj4tbW5OCit1WHZveGE5a3NzakgjPVl5QDBUWW9iejZnO0xRRWRuMWpUKV5TTyF4OSZGXy05PD5tWmlST3FwaCgleHxKcEFvRzc/fTJFIyYwe2RSUzI5CituUS10UGcpTSFpWiNKSmd8Rj0yIyhTJUd7KjFsNlFmR0t0R1ZAYmhfQmFiJXJhfWtNVH1rZEBpdjMlZGNocD05X059LXlnIUtrejZhYlpyCitlM1R4bjtYS19paHV3JllqV1pPcnskSlQ3WCVZaDZWK1hEMCZ1VjVHOUZmRkgyTlZjZ1dNfSR0QmpwaHp6Sl9zS1IrOzk1PS1PMFo+Wj0xCitRWS1PMDA7b3tsQD49SEhZfXUrMXBvalI1ZFopKTAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNCitGSipYUldwSCQ5WipGcmdhQ3lCflUyaF5jNm4qRGNTVllraGlLUCR3aEJvXzlPMWhFS0d5PUFMQnhkRlVSJVl5fUthIXhUe3E0UWlfTHZ6CitNNjdvYHtXeTlGTSQzRk1tPDIke0ozLSZXTnpeMVBtUjh9WnlkY0NhUiM8MV47I2x1dTxyM1kjM1lUUlNePkg4SD5LVntCOSZRPzJTeDVCCitWZTwqdEJILV9OV3RQJjN9MlR1VUswZ1pPX2QtYjtBKVpuUWV5Z0hsRDxVKXQlM3tqSFR8Szt3cEcrPXFWPTcrb15YRGh2eyU9ZGZuV3JJCis1bGRtamVVRWRndz1vdE9SNUQyNFptZihDQ047KnxuZE8yR1VNTzJhKT1oWDNRPjRwSXgjK0pMKi1oZnZ6RVU4Tl5pJHp6Y1NSWFEpSz5SCisxaWcjKTBId3tNcm5jdT4kRDZUVFB7NjglakoqXz92O2NncXdsTGsremtHNVV+SiRudkdAamVYXnozOWFMY3kqODVsLVZuY3g9THs0dSpUCis/fiY7QVgobitEaU54PnBJM1hWTCp5aXFrcHN3RUZBJksrKC0zanJ7eGJQQyZmfX5rMjE4djF4V0puY1RiNVImWiU5Q0N6YkN4TTdBdFMyCitXQjk5dV4+VURQcGpAPzJkNjA/ZT1PPXw7VVNMazBMUSNxVXduPih2WVpiZ1BmO31SbHEjYzMzUUNRNGU2X1ZaI18hRCVRd2c7bStmWUhmCitsVVJSV2JKK0pKPUQzZVNUaFRWN1FsKEZ7Y1hTcUpne3FgXzJaUnRNSF9GLUNQdVVnOUY7cG9QbTsmTjV5SXpqYWRlaWYyI2dJWFJrd0RsCiswdFROKSpFR00haVdRR0F6N3EyT15qWWJfYWFqVlZifTMqQk13SGJKbmMxYG4zSXsjRmhNMmwmKW1ibGBHSXB0eDF3djAxQ3pVTmB4SHBRCitQQkZoOyttSmY0OTBCSCZVJGo5djg4bGBJYiotQ0AjRFghO1g8c3dqUD90Pl9mYTxYMmQyN3ZZeXVoRjJxaTtEeEpXLTBlSnN+RkYqJH1BCitDMDF9WUglZis7UFVmSkM5WXVwY1cyQj5aaEgtPkkqUy1WfiVwKGs4bEVOUm9HI1g2O05CV3FSI0Ehe2F6WFFVLUUpNSRAY3p5MyY+TUwqCis0REcrQGN5U1VtekgxcGYtUjR2O30xQFQ9T0pLMXUlZiY4PmtTflZ6Zi1AO2gkVjA3PG56IzZSYW09M1JKUFR3RmxsNUh7az11QlFjRGM0CiteYnRUdVJDO0duTjBSbmFDfDA0QEhBdSU+XjFsJGU4emhEPUA4K2VeR0hMPCEyLXhrV0VNVko3YFBZWjZEa0slXm1vTE94XnA9T300JVZzCitEVykjUGNkVmE7KnE8OXU3ejYlQVVaY2tZM3xWV3RyMF4qNnhKYyV2K285WXtHO1dRNTR2ZS1+ZH1HPGEzUGo5NiEjMD1TX0l5Kk1Ce0h7CitPdTlYbUIlJSloK0U2cCpOJiYoOSFJSjRqdCtlWUY9K2w2dlVoY1FOSkFoMTJTcXtWayU0JDcyNkFwdU88SSstMGB4UUp3dkQ0PkFWcUMxCitiQV82YXMlfTUxPnROaGtvXjI3R2MjdjR2aDd2Mn03UFBQZDAzODxOKFQlbjUmZjtNXiRaNEpUPDBxYG1tNkVLdyZsYUdrV28zOCE0KSYtCitFWWVWe3kqQUF+aGtHTzhRejZuUUgqZVBwZGg1aStWZGNnfiQxOWVoaD55d2BpVGV9UDFAU3NoLTU1QzQ8e15JZ0t4N0BINTtRWSk3P31FCitLa3NCcWx0QUd+bX1adWZyPCo/WE4wbyhhWFU/K2prRnFIblN2Jk5rdjFYT1J8IXRla3hkeygpLX47ZzVJSmdeZWI9XmozJUpHb2xtKSpSCitnfWM8Vz5+VCk2Zkp6PCsoKSE/RHA5azM+dThxTjM5KlRVaUFMIU1ZfHpSUEZlPipqMSs1TT43anUtO2Nxe1AxeGBzdnR5d040PUdAO2hHCitMfmIhY2E1djZmXkdAX0lATX1fVmxJQjItY00oQGxqVT9hYCtiSHhgRDdLVW1DSWNVNmdGWiRgUlZoQT5FIW1OYk49NkMtT2VuamFzQjZiCitiIXlFNEQtdGBvYGVuMjY7I3JATGV4QHF8XmplaTlFRTUrcHwxUk9MalprQTlxUG1yU0hiaDZQdUAxMWlASmp2Xlp6THp0OVByZnVONWFjCitNRVZ3UWEmdikyJG1FPXd6ZkhIb093PD0jayZjdSF5bTl+T1ZOTj0zJnEyTHlDVVZaP1BVVXBDeztsKVNFd2IoY3ZCcSlNO15KbW1MVSFoCitraj9gI3BHPiZVZjI/LWUjblBDaHxDWGZAKFApPXxFMyZIZ2dMYjdvO1JObVN7YSV1QTdjQHFzMFlge0NBJCVZUlR5MHxYUVIwMDBPOF5PCitZN3leRzBSKTFxVDJDJHJiPHJGOH19bGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUlVvV28lP35FCitedjlSU1ojMEhIVzI+cVVxTl5YQnlXem9DakMmajVVYCsydypZSGJeeVJ+bDFVNDtFNGpWflNNSmtPcVlgPVlYQnFmb09vT0gkWEJAeEFZCis/KE5+LShZJlpjdHEzYjkmIWF+MVQrWDt6RHROKXZ6RzhBViVXNkBPc0dgWCYtNyFoKjJGZFNkdnN1YkF2VEstPj5xTH1fbTE+UGJWYTlWCistKHQ8NHNZQGtpOTsoJTZGJkooSipENCZRI0Y/QjNlJjFleFVSeDwrNmRfTEVJZT9jXiZaV3gpckc/MiQxMENHLTVNa3FueFhyPyE9RHE3CitRbXc1a2pXSnw5NH5UX3M4d2B3ayNCbDl4Tk9Ebno+NGJTYGZxU0FxNFEkR154KERUWWBIRXk8UHtUYGNZVk0qU1E2emxDaWI8PUtTb0hCCisoSnBfUilfX2FKYEB8RWBQaXhxSGF+cDlKek1NQnFrR2VMRGwrKChVakZ8P00tTzFhITIhcTRGZGx3JVBVcnN0U0oqcjU/WEVtMnJYMGN4CitlPHklMHgoYFZCTDxVYk9yfV9FYk1sdGZpWUhBQD53RktmV20lSVckWXtHSFV2N0FFMUFndnE2aFoxeFVUVEM9bCplYzlVdFV9bzh8OU1aCit7TU9gP3B6U2goe0JqQVhjYG0rNF42dTQzYSZtSXxiVjtieDBKN051T0JHQVdjNWw5KEs3VVQkR3Ztfj09JFRLU0Y/QlI7ZkVxfWMmZnExCit3dTQqSTt5UlFIWUBGNzV1YWJ2Nn5eUyNGIVpNX2V5bW5NKl9USE5zejBJMzhtUDAxNkhHT0tNd25ObmFyXzh8bjFtbGhIdVl+RitVKXp3Cit2ZlJrbng5UCh2YVNWLWcoNmN6emAzMFhaVGI1NHg/WS11SDY3WXtXYDVER2FEZ0kxbD4kPl5APFlBfEgqKD1YJSQ5VTVuYUJzaT41X09mCitLMF9pUlB9KzxAeU9GQ1ZLbkY+NTdvPSRsSlpUZiY4OEhxUT57d3tPd0ZeUkNmSF9uJU00ZSVBNEp7dUNvTUw2WTRFWEdBUmJ9YGFWOUEpCis4VnA0PmxIWHxOZShgZWNrREF6Uj13Z1pQZVpaJjFVd2xXdk5NdVdNTygoPmFmOTV8TXZRRGx4XzhkVipBb0BhTHlNODJab2h0a0xTR1A5CitvKXxBdHJNRylybEZtdlpEbSoraUA1YCFYQG5ObXojTEg9emxxYyN+cEtCOCZndEcjOHMoOHMyckAxTDFJem1kOV5pRD9gTylQVGpIRXYoCis4TCZAQE5Obz5+djUweztfQGYlVVhxU2NfXm9iIVFsKE9QPklZd15MQyZnWnhUXm1waXQjIypRVXA+LSlIZkJvSGs7bl9HZzZBfkRyKDdyCitBVjVxe0RuMTgmQGl2fndTdV5JQTFrJlNhUzZhJXNYZXVKVWYhMz12bHZabmdRUnNxPnN+UGFgY1VCYlVTKmxGPndvZGF2fm1rKkNuTF9mCitVJHAjeFltJWRFWm54QVY/JVI2dE07aEZTZ2pQKCp7flBwYmoxQmFtKTZXdlpnUmZhYHh0RHleMlpFPTB4Q0JfZD8pSV55elIxNT4xV1E3CitxOEM9Y0daUC08O3hBTG5kVnZkMl9hZ19Namd+RXBkLTdkMXFpS0hHY1NjZkNQYzZ6IUlzdithYDEpVEdQRDZjaHF6NzhHM3M2Z1A8IW07CitCKypVI0RPZTJUVk4lTEZkQkF0JU1hOWFuLT5gX18tIXhuZDV6d1I1ZiVzRUhZPGJ5MSp0SEc7T3lkUU5kYH5gQVkmV3Q5OGEyZXowKHc2Cis1VWtuKWA3SmMrXiE4Q0ZgUjx3RE1xLWR9THZiTyg0bGRPZnEhKGpyRWlrMW0kaT8+ZVQhYXEmMDVyRUIoMSZMI0Y+Vkw7KSRPKDZYWlRwCitIUkc7VXBFbWBPbz0ySXZuQSV9IyRFRFJoYnZtYSo5YjhiO3FlXlBLVE9BMyFyNiFlPU5WcDtKUSFtMl87UUNtJDhTXkt9N3pvV3J7Y1U2CitXJD5XI0psTityTlZ8PiZ0dTFOO3x6T3VmI3U4Kzx3MWZiPEk8eylzeVBNdkckUSs3TjUhSGlfaVpzRExWTHJYfFl4Qz9HeGlMQX53ajYtCiszWEBSRV5YakBGKG5Ufnt1P2U0UFA5TXZId0pHRC1yZiliRHMmPj9gVXk4SWpFZG5JKV9UUFh4RVAjQXlRcl5ITDM9Xl9uTSlBaVhpcT9GCisrWmtvcF8wM1BqOE1KMWdDS01kaDhRd3l5N1Q2ITQ8S2l1aGNDOEl0X1F1YFFgdEhGJiR+TCE4PE40andgM3JKOzB7QClBS1QjQklyWmNCCis0Zl4mSSEtQiY+JWYjIURYblNHIzJ4PzdmZHR7QiRKWH1DeTdIRlFvWT1FWSRQVU5+Q1dRVDNmKmJtdlYoRGArQHJYeXo7VGZWKjVBbXgkCittNjM4R0plbSFZOXgmc0t8SipgazNENWNIa2lYP19sOSR6PitZPV49VjNwVHBFeyk2b3htRnomMmo2dyZMR3Z8SUxVI0dlYj9fdXF2MVE2Cisjd2I7QG8wbGtVUldRbC07MiorQSprKmNJJVM3cVI+MVI7fHlwQSs2PSVJWEdRRTRyeCRmbUZXY3FvI2VmTnhEPCk8M3JRP05YbT9oSDRkCitJdiRAX1lTLTIzbW85cWdXZXNxKV4qRjVIVyVwOzNIN3B9cTJCTSVhTTFscylvan5kK1ZqQylOV0FXLW1uTUI4ZVFWRHhTJSFCUW0hWXIwCisyc3khTDJycEQ1Tjs+PDdiYShFRUFaelghTTNgMHppMVBfeiZ6SG1CIUp5M2RSdC01bWNXLSZfe3FjZDs+anI3dUFebEBEeXE1TzIrWD11CitubUpmaC1YTEF+T0dXXzEqbkpmbV5JQXg3VmZ6MmVxaEg7RURTTVoremV+NnZwYzxCJTdmaiFXRU07fGRRMzxFcUktRUtZUUUlQ051TjUxCitZJEh2PXZfa3BBc0BAcmR5e1MjQjZHeHNTOzdiPCZZKmIyJDRLUCloPkA2YVdBSzJtdGV5N0RzRm01ZzxBUDAwOEwtMDAxIW4wMDN9bGE0CislbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FiI2lRTVg8ez1rV0AmNj9hQnAqVEVedjkzUlooeCNGYzV5dnVRJn0mTztCcnVoCis3YzsrJWZ5aVNGZVUrU2ZFcCpjdTRheE1ZLWR8dmAwYm4+Q3ZEbnBZPn1wPXpWR2g3eVpkfCpiKSRgZ1FkZH5vQnZ+MDxMKShmOUx9JjJ0CitANDkyNWBAQFRrTCVYPCthTXRraG1meFc1JX5tfEBTcntHbCkqeytnMCViTSRlOG9SNFRLQ3g+Q2RzYEs0aEBfflVRQjl6K2N4UT5iKnRICitqTiVySUhTQ1MrWnVBcDNOWkU7IVhSI25fPShybGdwSnRycTg7czE0TzBQQkpxWm1tIV5heD00KFBhK3M+QnJtWj48elNAXilTXmJHd1h8CiskNkF7KWdzPXZ0JD9ybGM4TDwzckAoPWBLUz5PSWBmTiglSDFEWjsjTXxhTkhzMkoxVmIzdXEwVCV3VCo5dDF1M2lweUBLPzEzVT9XfW1pCitTdVdzKTk7VCstWjNBQVdOdj1JeGkqRkhfIWpKTW9Ma2YjbiFVanA1YCU0UGVjJUJZS2U3UmxeRDVCTHgjdldmTV4wVklwKFhRempgUHRBCitXJkt5Vj9BencxZEghJkh+XnRRPzRTP1JQZSZUcVZkMC1taCFKcVpgOGZYO3dIdDxjdHU0REFybXVzNGJ9K0k+WDJscCgqY2RFblZBWHNNCitaYHUzZ0tTVFYhTSZNTj9vWTJiOEBMN3xBbiV+bGQtQzleIXdXez5hQSh9MyVtZ3RiZGY7eHFxVEdVI0V4ZCtZakwmQGIreEw9RU05YzV+Cit0RkFqKGlVWl9SKGEhSkotbCpXaSZBTzZrRDxFWVoyai1HSEVeY0pSeSVDQyVOLUFYNEtacnFaZmI7VFZZMj16RG57RUpxJkh9Y0VpNExxCis9PkYlWm1gcFhaJShwMz93bWtJPHxUaDdAbW5pa1omPVNCdEFsUHA7LUp3c0tBZ1VQcUdLSGhkYnprRUBXMStCT19GKTkxfUQ4KXhkdit2CitaeFZLeHh7XzRWSG9la2N4PURxOVAzcVFnMSFyVVB1V0EhVlJoKkBUI2tKMm8jMCk9JnNEaWRNST9ZcGB7USU3SFFVdFdYTU4pX2NQY3M5CitXM1hFaX5aTz5gT25ock53RHhhTnNEd2NvMU5POT1CSnYjRFdyWXV0UVZQb3gtVT1hLUxtS3hWbHNvT3FJN0d6aEc9WT5Xckl0WXtDUCk8CitgNSh6Nll0R3hJTUJNRXl3LX5AVzZDZkdERTRaTDk9UkcmMWljOzROY2NLdGR4WHNne3tTOSpYO0ZmT0Y7OWltPWdAdDVLdGthI3xiPG0/Cistb3JIISk8NiptSnYmUzE9WVVTdCk5TyVYZE9wYVd1a0p+JFlZSkg/MyZ9Y2I/KyZBZCV4TklAYXJsYXU1S1R0fnAxUVktTzAwO297bEA+Cis9XnMmcEdSM2poR1ZCbWUrMzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkt9O2ZZOzlwflZQCit8RD5FXnY5UjhmJE9jSVAkeEgxKEJrVlRxeD16I3FHaj8zLW9nN3d6eEplbEkkSDAqK1FtZStVNz08YlJ3MCtTTH1iXjg5cWMobEdBT2t7Cit0IXpmWEVeVmQhKl9Nbk5LI2FyNEtGdjdpRVE+V0xMUU0lZCUzTWpheHgrQ1N2Uz49dmB0YSlXbT9sbEZ2MnckdG8+ZmBhPkRMJlIhajB1Cit0KTRZYSl5eDlHUUp7KDFPfCFmejNZSlM9bUJKcG1VXnkjZ3ZIdy1EKW9FMnElMWhSbV5MYlU0YGdtUGNnQHQlfmJAbDFBK3hZfUxpQ1ZpCisxN2F6b2RmM29GMTZad3x5bV5yRmheTkQrMzxyRWtHTVQ/ZHhXKXQjKC1kYHx+b3E5RXA0Zn03KWdtZ1RxKkFFTj95QXRNMUR8d05FS3NwCitqb1AjRy12YHdlMXRYeTljc25QZUYpaVl5fkBhdmRST0E4MUs4dGNlbTVlUUspdno0dTxAZHhpKVJiTXpVWWs/a3htczFRc3ptSTJ1cHJNCitHQStXZ1g0TnIwVnZDSWRJdU9AeUJFV181e2RgUml6c3ktQF93bzt3JnJhaiVDPyZHUCU1YnBaKVhmS21ZIUNAc0NTNTglSCtgaH54IUJsCis1KztDMndwJiVMY1Ahby17RHpOOyhzQ2BpdExzKDB3e14jaEtYWDNjKyFiT0J9fSFJOXZ2TzJAN0cwOS0zaFg7OGJYXlRta2tCNjghWlpRCit3Kl8odEVTM1ZhcXxCNHRGamZQRHhTSFJQWU9UPEtFU0x9bz4mJVJ4eiV9WjkpdXQxNWEwWW5qaitFXiNRYEB0U3F3e3ZSV0RPdTNxTDNCCitJRFFKcjw4REx7JSNZSWs9bTcpU3gzcjI8UEBIRURjTkRHZG41UUpCNjhDYCtBK3tKSjgwXlkqUXlsN1g5KztPPWpVfjhRdTY0STZoYTdaCitlK3UoM0VtV1E9VjFFaHtAQD83bDh8JmYpJj4qNTk1eWFjbjhwdnp0M2QhfFQ8Rzt8P3V8ST90cDx1ZWQrfkc+bDNIKFM/YV4yUjJqTW8tCitLNW9JX2RkJThYRDtXKmJ8YkxwZWFNISoqKUZXMSlJJCM5bVpGJFVYaChQOTU3SmRqNT9MZ1VyZEFKYytofVl8QnNfeiZhVGpNKFB3NSlwCitLaHZaUSFwVEpfY1ohe2ZPbkpeLTtROFV3XmNRRWRCTXVxIVliQz5fS1FqOUNoOUBPNlMoVFVEdyRxY3V7RnN1VVVIZGJ2MCVrSWFhS0tsCit7dyVSWkdEbmJ2ak9sO3MzP092VXcxP1FCYV4mSDFJeiRLcjRpYGZwP05SZ2JibU5wZmo1SDU/eiNyPWhWKShpKF5MYXNjJU1+VHtqTVFtCitmejtabURgVnhhJVN6fGMhMU9OZlFaQXdMQmFRZmE4MUxVUGw/cld4PlpmUmtibUw0ODA4MytrWT84Tm01UXdYQWVMa21kQzs3JCFZWllZCitPbVRKOWw4TlQ3Oz9eU1I4fENybStsbCRHcEdOeT9DPmxMPV81NTs5UikpdVlKPFRsfTFBS2MpfmU/PmhoT0pMOzA2KkYqZXM9eiEzYnhnCit+WShkYlE8KD8zQj9FYyhURVE9Q1h6R3dZTzBOcXZSbH1aVUgwUyh6QDhXKz47cSVuPUwjdXZQcEVJTkJ9cGdYXkJ7TiMjWUhZaUZiMypECis8YlRXMFViKzVEbzlRWlUjKGNGR0N8JTdTPyYxJFI1Zyl+TzMzN0NHfTdedWVYWU1mY012eXN3QXRZSzE4JmhCPFpFS0h7QGY8fnp8ZztqCiszNnw9O1hJU19fdyFybXhOJk5JYTgjc3swNEd2aHhIK1BBT0ItMlVYJXE7VjwoPiVydzRlUi1sdyh5PTBgQkZVRilwOEhZWjNxWSlAKEFRCitydCMoeDZpYkl4XlhjandfPH1rbVl0TSlESGo+QmVJZiRePV4yKkF0WmItXzFWPX4peHgjJH5IOz9jTW4kXkI2bDtXPVlySl9zVjw8YzNBCitsP01zLWY/YzwkTEdpcFUxWVBGZzExWUJrVGJqdF98RjdZMi1kLTNRVG1kfkorNjs9NDZqRU8zN1RYO3pleClPQTVaeFlTWXNTQVktPlliCispSSRBbEFofjt7bGpmVUBLeT1FZT5WJHV2fWooTEx2SGdqI0B5ZkxwIyhsWiY9TzhOOVVDflBESVVlelVGTHw5KG1UOyl5bjFwT2tSdUReCitJQ3tlYk52T29BKSMwZSQyTFUle0E/UWZJdXlaSjQzQzZSTX1WcnhKbVY7O3szY31XNSRYVj84c2FndWtYNk4kVDZSP0NUWnI+cU5VUl5MCisrQUgyUG4hdlBpLXZzTj5LKyp0OHdOIUpUSzsrblI3c2Q7JkojaVF5eWJ2KHkoZSMxZFY5cnEwVXlsJjxZLURASTFiOClzZUBLdUFZNGcoCis3aF9ybnUkSTcqMzxGa3AjcWUxSmlufVI3REZOTFFBdTZXNkp5cjJ5UnE4VX5aMlRSKH55dE1SRW5BTE5RWjRmNFJJJEIhOE1JZn5BRXU+CisqdiRmbkk5dlUpTSNhMWsjLWVXbWt6ZHQyKCYqTllCS2ZQNzM/RSRZRUclYHBtZnRjbl9sTmA9Y2ReK0lLdj5XRjU3V3QteztGWFJHcF5aCis9dGpvJC18KDZTenVla0A7MkFHTSVGaURIbFhSc0lhQlEwVH5iYj8kcTRBMiV+XjVBKXZJV2dnOTApJWFWZjRIX3Vnb3UxY3RXMVFhQWZOCishKVk+JDhFIWRoPXB+R0BnRWcpRmB7fVkmfiRmcCYjOUh7ZkMhQX5iU2JLJG02JmxfaCUwaFN1fkgrbmhLOFlUSTIyI3NaRFc4MkYzNXBICitRIyowXyZHdndJajhycTxXZUBuZHh4MD9BOGlVfDJhSHhVNjV5a353OXtiMHZRYng4UjAhRjUjaUJ6SjMrUjUqUkVlZDwpdnRffDcxY149Cit1RCVHQXIjZSYkZDAjSFVeOE5oMXEyLURTM0ZCPnhHVFN+ITkraHB4NjQod2JSdyhJWUtrOGVhYCtmdlhEeDlCe0YpbCRqfGxhbTJXWFVACitvak1VTSQzOD1VcV5RSXFvck5CWSNOMEFhQkBMTFFPSndwTis0VkZkdSpHVjwlaWRwKjlmSUJ+QV5BbXdKdjgzekhQSjIzVGN5TGZYLWV0CitMMjhKUno1K0VCUmFjR0pXWkApM0dpam05MFE2bzsqN1ZgN3lsQFJQKSZMMmJybmkzQGRwaytBJFlMVytmVShqMC15I2lPcmNyUGFMTk0oCitIV0YjSCZzcHFVNXx0NkxaV0B9SUwwQ0swZChkbTx0NE9oSkxwOD9VWkItdG5BP1loczEhYSZiTXFgeSYhZEI+WTxReSpzbEgwcGZmKztzCitPWCl+OGY9QitFP1B6emA7e0VJeEl2ZnR7aSRlakM4fjkmV0B6STRkSHU2fUk8NSUkYWgmKDJUakF9Z2pefVRRYSpMazl5bjBmPWAqdnJlCitrZEZrS1RtZm5LYWUjaUo8QEVlIVJ7YW1oRkJBdEh4RihUeExyZk41T2ZUeFNMSDd7e1lpTUo9WjNzNClVQUo1T3ZQT3EkZXFaZ3tWdnZTCitJQ3c1VWhqel84T0hXLWQ1clE9NSpDeCp4fTBZeiUlZDdKVXN9cUg7XyMpZGRlaDtfVD5DV2pmcDAwSEBORlIycDRNLWokSFNKT2N0IWtPCitBRSVWb2tKVWgpek1PdzlZOHhQYX4rck9yQ2llUkIxe0FQcHhQV3krZnhFc2pPZHRDI08mKHg1ZGdidG1MTiU+dX1LKUt1Z0pVR2w+V1dxCitRUjhWanthPWs0bEtwYTd9Mlo+KW8tMFZmQVJCUiVLMDJxdj1ZcD5QZUA7VTRIbXpheWlCV1JHZEFKV3UpWD1fXllEKDcyayNJTVUoJnElCitEenBSQEwpbW1fMnM9dlJOcEEhQEdIfnJvfEgwWW9hRmlMQ3tLRXJVS1U7WDIhbj03YHhiX2w5Y05XdnNWLXlHY2RDVmdXWVRhSUg4IzE/Cit8RHptPmxoam5tYUdpU30kUmZ5Zm1LYE9MKlhuT2c7WXdta1p5QG5XVD9TczQzRE0mVlRLflo+RVoxeCZfVH4haHZBRyZ8Nj4kWEpLWntsCitkMGtsJXRVcUh+fkk9K2Vhb1FhaCExRUt0VGlOXmhkISVFb3l3R2BLQm1CS0FvNDQmbWc+OX1kfmphO35GSExBY3NBeXlHeExIbUdgb1dzCitpZmwjI0g0K3FlUHZieD9jfGhOeDlqK2ImbXJefDY/YV4hT1ljWWFrTTVxJStEd3AxSU9AWmJjNHBfMmkpT3dWUnxOUyFRQVE9MkF5OyFwCituZVpEPjRxWDx5Z0psSEdwSFl8e2dzVTI/MCZnZGJfdW9DJW50NXlvY2t2IzZUaSs/TVRsTCorc2daZSlGNFU4TjhLZCpjeSRvQzxwdypWCitmZHFQQjVNaU0zMmwrM056QWMpTz0qaVAzaz4/eUdsYUwoO0ohLTFnZ0FrLXZMZ1RQXlR0e3podVcwfiUkVSpodWdRamkwZjxgPFp7RUI5CitiIWsrc1BWLUd2KXpAIWpnUFI5b3ROakZnRmp9ZylieUx6QUZ1bDJUJSRReDdoYThSWUw5bz9fbDJtcjs1Uno1MSh7ZVctZE9vK19QIUVOCittbylfUU1EYnFaeDBpPVpNQFJWfG1TKiFRclkqJi19bE9TQz0tUlgtaCZUTHhGRkFNKD5OOWVSRDc0VWI3TTUoeDlvPTxyfn4xQVg4N21TCis4YkRDPlY1cXVFanVgM2paU3xjQyFWb0gqO3JEVHl9fGk/b0FeODFXLSFAMVFZLU8wMDtve2xAPj9sLU5KdT4yTEokZjc2MVMrMDAwMVJYCis+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkxpUWtZLXdVTUZMR3NaYiFCc09FXnY5aFNZTDEzSFZ9WEpyI05IfXZRdCVrCisqcVpAazItMGlgJkBANWdWaD5HVihHbmZBa3dsSDY7PCFjaio+XmAkbHd7ZCRpV1U9c05UJGc5ZjR7cXZSQD48YUBMRE9FTCM/dCpFVGZYCitDaWk1fllzV2gkZUI5U1F7QHUhNUI4Wk9OR25ObV4+anQmb3YlLWQpc0dHNTlgSHlpQlJNUDZyR0FVbk5TTnRMSGV2KGFkQFNnPFR4RU1OCit3b2YpRChrbnBnVWc+JE9hKTswfDlXOExLTWp6WmxFcVhQKVNaNzNrPmIkbE9uNUB5SDgteWcyMElOZmR4d3o/fG41WX1TJmIkI344UzRHCitnOV4od2ZGN3gtNUFTTHZCY2lQfVJ4V2tZZzIwJkVhWU11VH1UPUQzTHtoakQ7KnBEWU5LJktFRlFvT1ZfdioxMW5OPGR+bFhkPGc4JSNUCit0JjM/KG11ITAkbjN2WEA9PkhIPSNzRDVxZD5fP2BrWHo4O3ZOIzI9ZHU5M0VwZFpmMFdrKDtaUT4tYUptLWByaFJ8aiRsQz9RUU4xRUwkCishTCFzbGdlWXFYYjtYP3dIemdpamkzQTw4NGVnUk1Rezt7Pm9GYEdLNyhgYGN0YXhFYXhoPS1qNypLezBOfk8zVldEbGwqWnFhS0ZBM3daCis8RzE7Mnp7TVhxJGchOGtMdzt7WWVkdmBXSm4/JkVfekxlP3E9aHo8O2lEUi0we2MzRGVTNDdCMURJb1JEWDdpZVlefGc8MlloKjd3aUV3Cis+Jmc5PT1LcTw8JiMpQUl4M2R5JD0yUytOQ3ROSVVLY0wxQF5CRVEzdFMyZEdQdSZ4VGBKRHBATVFHO2g1fWt9Kng1Q29oNjVjJXU/cSUwCit+YCpCWWsrRnI7KUVFKT19RHRkUWt7MVNTRyUzMSprajJRKFJTM3IteGFBSER7Pz0xYjNhPTF0S2txQiYkPTd2VEhPOCVIT3luZ3UySyRyCittI2Umcy1aIUNmcVF9Wj5XVDVFRzgyaT0qKjVaTlo1fSE/d2BpMV5xMSpOTlEoKGctMnFDfjJxOG1qSy1MSjBhN2d6NlpnMWdEY0NCK0lCCiszeFFmTDdVUE8ldEZSR2VfOCFlUFhfY2F2UTZ1S2UzeWcwMmByT2lUeFp5fU87RE1fbFAtcSNWZUhOa1Q7NUZWcyNvMWlkYyZKNm1yTDJwCitUc3FLT0QkSHh6dyRyUnU+STlYTyZ1fCllVmlWMkt8X2ZsVXBraks7VShXJTJpey1qO2ZebD1xZ1RnLU1TY3tFX3p5Tj1NS0xWP15BNVBLCitrUGtUZzIjU2wkSzBLNU4tTC1EZlk8Jms8ZGFvP2V5KUA5RGI0aCg8OClDLTUkYG8wdjM3dWBoP0AlMlNKREQtOX5LV0VHLT92fWg1PlIlCitCZXFHKXJCfCZeMkZVTzUtMHhpMClKJHZtMXxNWmp4dzFxMHh5QCN1LVk8YWBkYUZPdlFSb3YjZD5sNigrUWY7NmcqZjNha1clOWJyflojCitrM04tVz5qZX5zU3c7VjR3V1hUcG41QDI/dlIybVM8KmdBJW9IXy1semM9MEFUak1LaHc+ZzdIZnZyMDdCUzNIM15yUT01IXlVNFhVe3opCitBVXlFUzBDWEYkbV4mUGVWQCk3ODxmI2w3dlJ6TF9kd3VNekljb3h8RT0jVilsaHo0aCkkQm5fbmVeUVE4UGlAWUUzUndoSFZeZTA/fjcxCistOClvNCp0fHB3X3tmRXg+ZzE/UUJ0bH1AJGd1TCpwUlFWfWdjOWh3TGd8NmtsaFktSVU2Rk5FSF82Vkw5P1o3alVQanBQa1JoXmtDelQxCitDZzB7SVNGbkdtPjZfNkloYHQ+eFlLRERzMD5HWUl8Jjs4b2pOa0x9aHI2dU9SWXMhYDh3RkVoRmNre2BuNVoraVlgWXVkcjZgRzAmKClfCitBJEljbCRvKVlmdGZTMEBnVSpZWkhgVmpQNzgjSTA9YiZ2NVU5TztMcj9IKFpNTXljRVlCRkBvcDA5WUVgbXJDUndfXzVNdHJkUlAxUmBoCit+U0Y0djwpXjdgPXlDfEpoblU9c3tUWlA8Z3R9QXJSdlNvPnBkLVcoQzZBKD85JXQlekNOM3RxJCExX1JGTkBFX2x0KFhRYl5zZSZfUlZoCitWd0VofEdUWE16OTl3Wlc8NHxYZl59KThHVEk1dWNySHRTbDMoX04zcnR7OSg3TTRpbnE0OVQxTlpjMzUoLSVqcF8wPnRPKkIkWTF1cl5ACitAciYtTEVWM3V7RyZVZTtTezIlIUMlX0daZEQmcT1pUzgoJEZ0dFVscU5rTHM+SHh8Sk9fI2R8NDd9TV9wc2Y5b3g1Vz9sZjwoVjwoMW5mCis0bm1GbVpWLSRFb0JgNkJwfT5obHckd3JASGVeLXxKSlE4Vn5EJGticFpXaVcrYyR5Nn1SPDZ3b0VOaDBFd0Y+UiZpTkl6KzYmWWtua0RDCis9R1lsUlklaDZQYyVoZF4kNz8rX2Y3ZlNvPkh5cDZzSlMzYTFAMVVrc1YwQ19FWHI9QmEkSXhDSjd8KGYhVG1sSGMhQHlPODc8JEZpcXdgCiteSzdmJDh5ZyoqbnhoO3lmdzM7QHFZLVZgQXBFUjVJR289YjV9eFBxVnl1SG8wS0xkQ1NBd0Z2Wm5Ud3pBZk4xVjhMVClGaXp3bWQxeWFHCitBZj1efW4raHZIQylSUGU7SV9yWkl1XiZTTHx+QjlYamp6KTBYI0x4MkVuTnshUnRBP0I1PjhqakpjaX5DTzhoUFlOTGU0byVsMGhFQHhBCitZS0VmRHV5P0RBc205Y3FNbkQjUDxya3VET143UVAtan05IU5uazlWflhpJEQ8Xzl4S2l5Rn1hVUheaUgheXEjMk8zaGtEY1ZWVWJEe2xQCitBdm5LNG1acyozJH5wZENmS2xXRlMqOU9lfG0zUTAqQ3hWSVF+VSFSfFE5ckNfVDFENkFgTUxAdlYqNHBWSHFVfF9JLVpMS3BEZS1KTXlxCis2amJoUz83ck9HSDw9NEpAelF6KERoQFZSNEplTSZeP1JTPE9yIVRsIXVSMShWVVBPdUtiJUM9WEUjbjtObihoJkRVP2s8cW5JcTQoPS09CislLTFLJEZSKmwkYVQ9NWcpZ2FwZVZyUUBlek0tVUwkZFU2VXtCLVlKTEI8UVlFNjY2SnI5R1ZhfmtJO0chN3JUZ34/IVZ2dGlJaG51eiMqCitfdTBeeWpRI15xTzlLUUgwMDAwODBQfmQ9TT8oU2BgVlNIUzA4Mm1zMDVKZG4wQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjEhZ1ZWezJoCismV3BnaWVhJV5tQVZseXZ0V3BpK0VaZ1hXV2FDeXg7e2Q0MkNtQjBKMXotZ3g9RFVsaGtlVjZ2c15ROVpGeEE5RHEtTFpYX2NHOFJsaylWCitXe0I2VDJXTWc4bVZ5JDY1PE5Kd15peGxaX2xFc0B+RWBAO0t7UilfZitnRys5QW1DfGdaXik1KlpETjQ8Rk88eFBTSXVrI29WeUQ/MUV4CitKe3pRaUhjfW5mPn5BQDNYQVZhI2R8dlU4UFMjeUJEPEZpbUlWNDlfWWNOeHA4SXxDeVRUeTNYeTdBbTk9fjRvNSNtYi13Mil3XjxKamhFCis7Tll3JU8tQF9Dc3BZUmZEbz1UX0Zra19DaFY3YzBBbHhSQDY8YTBBLT0yaCY4OGB6TTBQZns4fC0tYyNNaCF1WVdiN2ZxU2l7NT54RGstCitNMiNlQGNyRERtOEMlSmNzez1pb3V9Xj13dlM4QXhFRGIkQUlreWhgOFQlU3dKVXNrfjVWRyR5U3s4fTJzSllpPHl+dVpxdzVWITheNlZACit2Y3dHWnxkQkw/WFJIe2p9YFd4JnVvdTNnYUdMZl56TFk3aTU3TCFeT2BQOWVgRlpgTTthO2EqKShDV2FoKmBzUGk/e1VVOGhiSkNvbFdBCitgVz48QkFSP253cW5ZPEdabTRMNHotaHI/UUV1Qz1tZyV2aX57IWIzKDAtS2RoO1JnKUk3VUQhZUR3eT1OQExsMlA1U3leZWkrdWloYnp6CisxamopamR7M1V1O3FHc0dRS3xYRUMwQWVyPmpMa055RiRabHloZCM5YDUkenZGV0p6PjhXJCkqT304SW88cEEtSmNpVmV8YDcoRmImPXZWCitCV3tSQ2xiU2U1Sm5GQVF4cCs2ZnRHeiZtNz4rX0ttSnxyeyF5aHFPNmMxISsyXmNKPzV8WnpVI31APVhNe2ZCd2E2Xlh3KCE/KDIlRihJCitjNzRzcFl2QWc1SyM8UkNPTkQqWHZvNnpDSlpRcTQ+NzIrYXglLUcjJTxlY0VqcCNvdlk3SHl7SkUqeFZnLVhtOFV4UnR3YkN1UVNORGtMCis+UlMyZGw9VFhNdENUcztoTHZJOVl0PlNYSXM8T2ohMzNpZC02JXt5JGpQV3ZLaDZAPzElSldRWUB5Pm9ETl91XntNNHJLMEo1fXczKGclCisyKkBpWVopaVkjSTVhYnYrNUlgTHNxU0lrM2tGWkc1JWVMQ24zODEtN2kyMCNZYHEhcE0rS3p0NGlwRCQmI0J1TWIzRFpuS2w5d3sjd3BwCitwVlRLJiVxTCt6a0IpMmZCRjE1eCZ1T0NKbnlHSFN2PlhSU3NYZENWO3NEYj16MCEkI1V9Y0MjXlchYWxFYUNzIyN0c2ZXUDYtdlQ3OG04CittYkZBYzdTVTZvQX0oZE17NzxuYTR8QS1MM0B8RikwZXhQb1d2ezsxa2o2dTBLT0NqUWYxITt5MFFpeEJhIzN2dkxQM2sxUkVKU28hQUc/CituYl9gaGplMjFndnc5fnxuYWg7Zng2WGxeUlI7VHZqVzxUQTFCKT9PczlTKU9MT3V6cnt2P05TVztBO3xaU2soMzxaZnBiTmJ4LSMhdURaCis8S0RSeC1LbzR2WChvIWs4TWwtaWlFbD1KMD9+VUB3bzx7RSNoWWMwIypqbTgzQVlDQjsmKk1eUjBVOHlWRnt5IVE7S1E+aERRcDhTJHVjCitiKFU9dkVucCt4JFNpQis+XnlHSEZHZXk5XzYyayYrT1ZZJTglSyZtTmApVEJNZl54QHs/Y2FPSzxKdWNxZy1oNnoyZDtiOHxeI3tZdVM7Cit4c0FZM2NwI2BAOCR3bzUjaCY8R2FXSWRicCp2Un5LKCo/Q1JuWXw2SmpwLXtQTyZ7ZG1ObiZxJCVKI3trXzVAKX5gXjQzQztfPmckVWNkCit4bzIhUFdUWkhQN1ItRSNsWFEoej9OIVUqVkYyMnFoWDs2bnd2dT8xTDBiUGMyIWxfazZvQllIPU1WITdGZ0QoRyNuMjgjRjh9WU1ZWXEyCitUZW5Ncmc/KXQ8Z3xBP2Q3ZWU0fShfWmpxX3pBMWNodyEwZ0YrOD1PIXBEWn5AWUg8aDE0Z2JCVkVobjEzfFM2fiFXKUJsJH5ZZXZBY1BPCitlQDxnQkh5WkhUcUN9RyopLVQ+Qk9iPG08LXBwbDA0N2xDWEUyZWNaVmtuIUcoT14mMW8pMG5Vd0UlPmpgMUpwQmtnI1VVXnl6SnVJKTQ+Cis0MjRYLUkrRi1WUChoO2JBSDsjcyk9OH0/M3RzWF9+Z3d3enAmJCY9MSZlTCF+d2ohRSZkJk90PVo2bl87V1g8cnpHcnJwQ3VBIyZaOTdYCispR2U1UzdTTj9GNkVuJD1MMUs4R29RX0pXWXlmUGhtPWp7cmpwTXF1V2N0NWhDKEMwZGZZZjRgYD84ZXZ2Mit1RGpNR0xYRDw2bFhWSVg5CitVc1h+Y2ltUWFVTUJFYGx6Y2F0bDY2SHkoUEk8Sk5lIWwzUGUheFJibjQ0dFdFbkJTcjdnSUtBVWNMb1BVZXlHSitMMzU3S28jWTFJdmlFCitKdld4JCtCZkdIeU81e0xCV293U0IkQCliWklLWkBZZjFPSVRuVG1MZ2JGKFlreGhFJEhUPiNEJW93e1dreDIjV3lDfHhacVowUntkbHkmCitZXnt9YSRCMTZTPXVRNDB2RFUyZSY+WDxlK3Yxfm1AWDZudE1kJV44dnZ3R3dPeipfXkF5aiM+V2pkKVFVZzFiSFFMU2ArUDFjRk9jVTxeCitzfkpeOyhXMEZNNzZvZWNBNDhBRV9KT2BAIVRTQTEoT1pMVG96I0sjbFI7QX1hcCMkSU0/N258ZVQzSnB7UVkoSSV9QWdkcz9DaTdKKD9ACituaV9WcHpxQEFOKn19eDBNZn5VeT14SHFSQUBwO1U4U2Mte29sIztgSUBLISMtZzJqTEF2V0JffTU4N2hEdyo+fENQP2h8UjlwTWU/c0NTCis5P0RoaCRNMVFmXjtzbHdlNEhePylXPSZ0V3V0QyFsMT1GT0lqNGdzaVg2OGg0ekM/TCltT3NLbzF5MEBeMjZ4NzZuR287UEw3Qzkjb0opCitgamN+JnV4fmstOUdSbmAkMClWNCkzQV9sdEVRd1ojVGc4UEdYUHMxQVJpS1hHaFooS1YzcjZtM1F2MnQ7NWNrYSM/Z2ZHRWdCUCV0WV4lCituejlPNShQZVpgcHo7UyFnQ0l5PT1TM1lIQmdnJFJ9Z2hMeUxwZXZQLWpTQTluZnRlIyRhYWBWal9Hdkw2cSQrNFE4ZXB1a1ZVUyo9YUUjCis2JmNvMWJSd1MzME41X1k9KGFLbkNrZDNFOHpkJDQrYW0wWSVXRSVaZVRKPzFlNyo7M3FMd2txaFQxKXFUQCRSd30qamh3MEo9TGEjQCgxCittZTlwYHM3ZHVnOTEqVUowY2l1RnFJckgxKTstSjBlNj15Jnhle1BQZ056SzhRUnl4KFhwbHRXT3plV30kJT83d2UhVENpNU8qMVVhQzRTCitvXlk3dVZCQFNSbHYjSk1fYWg9PlZaPSVBb1F8PFVzNU9WUVhHPip1YS1VOyZAO00rdmpEb0FicFp6JSZIZ1RQXzhVbGt1JChnKiFwT05xCisxSnRHYVFZUnohbipsdkRDWj5WbTM+M2pEMD0tcnV0MHE0c2pHekpAdmN9Ylc1eUl5XjIheiNTPXQjUlZ3REZeMCh2Nm4kdCt4NE9GTEpVCis7Vz89V3A5VXJxP2F3YGsya2R4Tj4jd3JUTjJwZWdieTRKcDhKail+KzhRJGRAVTJTUU82fD97fnU7SXd0PHVYOFN4bEZ0ZSUjPXVneFJCCit9SlJDfjU8KHY3S1ppUG09aih1aTFzZyY8cSs1dCpUJCV1ZWwhSEs3UGEke1AlR0hBS2R1I0BLa3ZwVE51dClKMT92MnFHPGIrfXE5SUBaCitqRCN4VzFtI3dMQldvYWphfkdTNmpORyU4eypLZEhSZjdRSXk9KXNeQ3JsVlIkVFVfQ0dgPDtQQCMjWVdeJjJFP35WZlg+RTxYJEZkP2x0Cisza3ZfYnlIfHBRd2BNP1Vqd0V7RXU2cUc8WlFuKkJfTFRHUChyekUzejxuKlFncyl8NTk5PDQkQWYjUThrQHBVYnZFZ2pYSGpsSXBlKF4qCitWJEJvNDJmJW1eWVJSekgzSCFxUGJlTl85ZnJSU2dHNUg4I2pnbmFnY0BiPjlUIUtEITx6c2klTE1QTWNrdXBhKzJwc34pKil1clNiQjFDCitXKUlLNT1rIVV+fDJpRmdtTG8wYWcya2R3YTk5T2l0MUdAcmU7djJmXzRORCY9WH1iSF45eVk0NklzK0RjRHt5KUYmZE1zZnZgPE9Vb09JCitXKTNnKWloV0pHJm5DdmdIUTslSGdre0wzfUZYajVXcDt+K351NjxwXykrTWNAX15fK2QodGsoeHVLJiRiam42NXoqZz5FPXxnQkBPSDRfCit6V2QqP2RfVWJVYCVrTD5gQjhWaDIydDIxb3tuKjQ3WDlYYX1zNV9gKTlzU2VRNjxhUk1NT2tabzl6TlhWKVNwbS1MTHkpKEBjbj0pZTEzCishSThlI0RJaVlMcmArXl9UT2dnXjVYMyFuOz1zMkZUUGtjPnBDJjtsMWk8PWthZ1hOd19qZlZgfHFaSnp6TEExNXJURkZWIWJyUldzQ3tJCitUdyp3MHF2NjcwTGVEPCpMNHhUflRZUngpQ0lTYTIpY1V8cGo/MjFMSSRDJCtCO1haMjRaJiZ+OXxqezghPW5Nbz9jSlpoeWA4aFdPaTt3CitUN3ZzenYrK09iaFFlNC05PkpMcHx2PUQpO0V3fFZ+WHlpKUBrX05yeVdXcGlkMVpSa0BuSG42XzQ2JmBQQSR2QCkrMjN+MylkRlZCZ2hPCitMb0xsWSg3TmdKS2BCQDIlIXsod2EhUnRfMGNUUzdSZnM3QlhmREtNRVlyM3hDbWNYfWAyTF5gbmJTMX5oNnJCO1J0WFg7RVhyZW80WU50CitMR3dnbTZhVGI0PnI5azZLKGh3ZE8zTXghcXYqc0hEKkNaJXN8bVA7WEpCZmNfUnYxPVRpN0NiRCg+cHVNM05Xfj5te044LTx3Z2I7WlRkCitRdDgxUmlLU2dmPkZtY244YkFVfDFQfj9USVEodWo3YypKVChpM3BCWF4pbisqNn0yaiQ8JD5HI1RHP2MzYEVkQ3M5SkNxUTtQWGglbnAwCitFN2xpKTlIMDxvZTwlZDZOVUFxXk8rRmghMGZqbWRATzQ8KEI1WE03TFI4MFFWNHx9YlpRd0VObVVNYTQ7OGBNVEdvM1Y8OT5GY0I3PCNGCitHamppeWxtamhqWF9TeEducWU7K19lQ002KHB+NFkmamE0a25vMWhvTjQyRWU/MXhkdl9HUzlaUFRZJGxZJFdfWk9fOy1QIURUIT9gYlk5CitfRUNtfnomNj9oSFVoOUNyP3l6ZjxOO3xRYH1BfChRKzxkY2QtU2gtQE1EcytEWSRrYVRybCV1VTNHV3AoP0FLYVMtcV97fk42O09oZEhqCitxNlFocD03XmVnYl80aDlhZ04pSyVrWG8yMnZvaCYhZX0yVWxFMk9hb3tvRjJ2JU8zdVMmcWlCP1IqKz9sWGxrYE5uSUhTcVlORXMzRzk3CitJckN5bExLQXV3TCpwbTx7KDlwNXp3dihHPkNXaThfYU9YblJ3SEk2Szk/eFYwfk5VViVfVWtBVUhKaUdMSzkhaDFocWQ8X3xQYVZ+JHtaCis/Q34leVl7KXJySEhuKnxvLXhwJSZwdlpAVyUwQj5hX2F2Rz9oP3kqWSk7X2dNVUV3TlpDTjxsWVBwO193ZGRZcFJjMTQpbHtzTHglLTtACitUX01xQ2x2U1pBPiptNmhAMGZJTStnWExebmFSbFc9dHFnYGgrVGo/aT5HN2lTdlJmKzFFU0pPQzFCSnp2NygyVDV6ZT18QytFLW5wQjBxCitCbzBwOSFjbSNhQ1pIWVIrKDhwISZraUd1e0omYklFPyV0KDx0dSRRan1uKj1KO1BCbk5IQF9AVFdNQVE+PTZ4Z21RblJVK0dxKFdRTkAzCitNVjIhcjtkSkt0NXgwYjM5YGc5WCUpKFNtdm9PSFFLTExXUjdHJjtJJExQc2tMX09NY0VHRCQrZDFVTSFFVG9sZEo5UWpJekBsRkpNOEZICiswSXlRbEBYMFN4anNEVXthUHRMR1hqMVNuSGlMWTFSckRVaVd6KTZJeXEoZyUkRFEqd29qeFZkTnpFYDh3XkUqbmUoTz9nZUF2MXRIRGNDCitOMEtje0w4TCpVTUxTRWA/cm4wejZZVylGXlcqYXpaRHdoVkBTcD9nYEhLK3hZd0F2NlFBUU5yc0VLPFcmV3pjaktYQjQoKF4oPjMxbSteCitsdkJ7YURfTTtFRmklTCY4UWxGeUVLWT8+Q3REbnl1JH1WaURXLTx5YTYzflJuRiU+M1ZVVHBVdjFzRnxWOz0jelE5PSpVJml+QzhNTHAmCitkQyFTdE4hMGRAPl5JSk9BaU9ATig2OGFVbEc7O0wjT1NNVWkyRWwtdSlmdisyUiFNfHllb010akFkKXRTTT1tbyllTnltYjJqQkM4JCU8CitYVW5mTVFgfFJaT0FtZTtUUTlKUUVCSTQpKXJpVUtXXzRxO0NSM1pObEFUc1ZnXypfKUJoeChRZ3BkVko1bD8kQip6OXVBQWEwXyhoYWU3CitibW8zXn4xYntARlZQbkE3VWB0TVA0VmoqK0M+STdILXo3VDxkfHItPj90KDgtXkx5RkNkYEw8K18yJDM0YllNKT8tNCUmSFBlM3NwWStGCistb2hWMSppNU9kSEpQNnU0UURnRiE4MT82cVY7dzZsX0dxdlImMnx+Yy11UUBiYH0xIWxWR2R5PzsmUCpKTkBDfSQ0K0FYKCkofjQ0d1BrCityUH5nPXMyYzYqbSN1MCtzO3FPNy11KUVVQ0NBbzJ+b2hAXjs5VzRrblNDIzQmLWExempaVCZqMDhkZz5hSnp2bHA1S1VuUC1LRnliPU99CitEJClGMWdmKXB+Rip3QV4zUkpRc18kZEZ0X1E4V0V6bUNIO0BQT0FxR2RsK0k7VW9CclU8e2h2TkMrYkkqRWU9YXtxU1RSbD45Y3ZgQmojCitVMGZlYFFGb25HdVE4SkxwZGdfdzMmfSQzMEs7Zz8xZGBjfDhGM2U/fDE0I09ZVE5pSFFoeUZvNGtpPjtwVXY+MVFrQUthPSkwYz1uTUZlCitOa0pVYypXPyF0RVVXM1A4VUY7ZXJtV05IZTJ2M0ZBQU9QM0FhcyFkJEN2OEhQQGIjTTt9SngyQCllZl5KXm8rQi1lTl9iJTYkPmZUQ0s8CiteeUpXUEVWM0ted3NrVnshI0lURDI3K1Y1STQxMzghKWZjZWR1QHpoWV54eXxPKFVKX3BJMU8kKmN4cXZfMWcmckQmdWMlLUBQQ0FlVmlICitWVWVXSlhZKyR3U3EpVlghekRJR0NzQyV4aW1DRnFfczMwdEBqQVpJK0Q+bGBoIzZVayRya3ttVEp4OXJCWjJNUiokU2peO01VTUI3c0hqCit1ekhTU0Z2NHxPK3wkSGxeQDVNQ3N4ODN1V0h0JDxtZj8rZVhZO0pecGcrZj87fUpfZkNQcD9HKlFgXlBKMmQtKElMTXFIJTVaN0NlPXFDCitGfnFSZXZxI1pkQE5uI2Fgcys+bW9TSVE5S3tgQi1VP3cwOXwzViMwfikjKHMzITtZZUgqYGMjVmYkcnk9aCNEa3FHdCp+K3xpT2t5NTR6CitCZTVXaFZec0VlP2RRZz97JXsmSnNkP3dreCU/VTRYQFd+Wj4qMj16ZmVtOTFRWS1PMDA7b3tsQD48OzAwMDAyMDAwMDAwMDAwdjAwMDFSCitYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GSm9fUmJhSDg4RkpFNzJaZlNJMVVvTFFZMHt+RDwwfFhRCitSMDAwTzheT1k3eTImMD9ObWp3VS1uLUtzMklSRjN2YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSCitMclpnZ15LVmxRclZZO0FDRlopYDRiZENnWipaYChFeWUpcTU3UVVzRFpSazdGZyNlZ3NiblVAQWopMXE8RjJQWTZAPjE/eCtNVUFBUVgyCitic2I/bnVkIUVUO2p8VlZHVmxrO2pqQi1gI3pya0IqSztTTSRxdkVIM3AxYT9PKWleTCkoO0F1XnZPQkctfkhPQVJTb0p9ezh7RWBiIUooCitsWDlScVlJQDxVQHM8UHBEQlBUK2h8PShQZmlrJUxhLUtNb2s1VUA/TVpQYCR9SG97KkMoNzdzRk1fUSUoR3YzOGN4UWVCbEtYVDwtPkh1CitATDVUKkg4Pz8lYXJCNHJaNlR5KVp8Q3o1KkptUW5BPDxtcUJsd3k/cTFsQypvaz1PPS1nP35jdjktbn42WURodlRIQ0JhVSpaVHpKRGNsCitsK2YzMj4kUFUrV0pPY2F5SVU5e2VofEl6aygyYiV6LWEtXzRJRzFGeFFqN0BpRkxNdC1je1U+QWhraH5DNDdOeSNWc1h2fUlUSmElJEhkCitVRFNkbTVKWXFBNDFOIT8rWjduTilmNld3KSlHdihPUDZqbSZYYytQYmN4ZUJ0QyZxQFctWEdQX2tPJWRCP0ZKcmtAYDFBNnZxUE49SnVGCitMZSk9OFU3OzQ2N3paOGI1dSFXYXRoJGs5OHhfWkc0UzJuR3tsSmJrPiN8I1Rlez4kT0FIPVJpOFFIUkkyZXhpZTxkYTl2SFduenJLSFdkCitVMTdnTCRnRlpUTTQ8MWJxaUhnNE4hc1VzRHc8KCMwPTF5Ozl3eENFSEloRilLVHFjRD0qail3JERxOGZPYkt7Tjd5amFwTyRmRDB1N0JQCit6Mkt1Rm1ZOTR5NkRYezM/SyhGJWo/WDUwZG16VSNhdUlmeEV5bE0mU3heTGZ3dz5LLSVnSnJ1MEAoX1l2UUJCX1AoQFQkclp6ZnhmNUFTCiswQihnMkpyYmFpSWE8eiU/en4pIyVRY0FHJVpEal4qUFBISkNKSjIxcFpLKlV7MD11SkQ3WHs/MytWQmpSZ2c7UDVzMVlRbCZ+NkU3KDA0CittOHdeNiU7Vm4ycCN2YWBTKjROX1FeWXVDQmY3JlIkQGFvNi09d2BYekB1O2JLZm4/aTlyUj4jVT0kMis5PGFTdl40dDBVTTVyVHR6M2M7CiswQS12NE5PRzY+MHdLQEJQN3IpMFVmYU9QJV5WSz1KQXs8TS1nfmpGRk1aRStDNmorKEpuSHI7JnhPa3QjWT9SYUwjfUM8cipNTGxnai0/CisxXz5+UUd9ZyVOQ2ZSU3k+JFk1IUxBYHNTcV5LVnhmUTFeQz41X141TUp2ITE/VHA3YnhjWU8tJHNSbEw7XlkqKFF0RyVKQVhnRklHeFg7CitjZUNzMylBTzB6WjZNRChsPFNZU2FHSzRoSEZveyFfMkxpZURzIUZsKzElK1QmdTNSNjJZPE1iTjt8YTZAYzx5Z3U/RTJIOEVqSWJLam4jCitiQHImJGc4MjIlIUVlY2FRKX0/V31fUz53dHFkcDt7JWRyeXE2RUooaFRhVWlJQiNtYCFfRlYpKWE5Z2pVLUJOY2w5KCVwYWV9dHtMMmgtCitwWlJ2O2x5QEptPj1IeXdeI2lkeWtDT0plRlYpODxKZ2x1YFo7bnVWI3w1WCYhRWlPajhsUldhVFQ1Y0xrNXAjeURIcVFgY3lEdiloVFNICitDPlh2NzxKayUraCo7bHZQfUJAUlVrNmFoNV44aEMkSSVgcy0/cT8mR1g5KnxyMk9JXkF7S3NJJCk7QEExV3JVeVQ4c0w1ZEVzO1dwRD1VCisrQClFaXxIRnxuNlR+PFhGM3ExTCkpcHZuYHhgPTJzMVJvZ09ReC08SD92S3tXRWp0QXxZQC08P3l3ejJRXmxPPzNZJHVTcUNKdGVjVFJSCit7dmlzenBgN2VwY2xNS0diOSZZITR8fXdoQU5WYmMqT2FON289WmtpQFdAbE9wcSN4dXl9WD1Wb3d0SEFVfXJDeFRTWWckZmlqKGJuIWxaCiswJWBlV247PFdHR0hgKTItdnBjckc3c0ZsP3o4M31XZ3dJRmxyXnRLYWJtKlEzTyM9UihHWExNbl91K0hvKj5kaEpybHt6KlVSTllxSGB4Cit5JWApTkVMczhQb1BDRiRxIVdHRmBpMzheSm0hV1hMfWJzbmF5a14qbUkmWFl5dT9DJHJkbzZTWU9xcWhmbHtjT05odiRyTHImQj5GUmJ2CitSIy05NUBHWihCN3NQMjg7aCV4WXxKMVlZRG9QeHY4ITgjKk1XfDJWNERMWT5TeHxzbjFNPkU9QnFmX1I2JldMTGtYT2d8Q1AwREl3KCZ5CiskSSpCTGAkUiZxPmRFKk9FcChLOHR6PXtGflE5Wl8yQjk3WihMdFomYDxydllHQGJgQE41T0R6MSo/JllAbWtIWDlNZ2YhNWpTcFApaD5ACis2YVdBSzJtdGV5N0RxeCtGQDwjdTAwMz96MDAyNHcwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRYiNpUU1YPHs9CitrVntkTUJhJW9+T2FDdldWV29+bkdZJVh3bHdPTVUqK3FlPF8mUj5DIT1TR3hJWDV5c25PeDVheCZ5Z3FVKnBnfkYkejBQNk9fN2o8R2V6CisoSyg2KU1Xe3E1WmFLb1dlQmxpcGw0X0RDY2J5TmxndC1AdzZPdXYlU3tDI0g1fUhKXm9OdmREOFQ2eG5iPW1JdC10OEY+P3NFMXN0T2lLCityY3dsKDAtSFFOKVZ6T2NKJnMyVlJnVFVaamJhdklqfk9DeSFMSCY0RDIybTxxKTxFUkdaZjs+X1ZXPVpjUHlCfXdRZURwRXlLd2ljMEtLCiskdmp2R34/PE5leitWK3lyYzAwJWVIXmpMTmlKZTZiRDM2a315OyNOPGtJenBwfVNIbWNTeWZwI3JRRWxCUyEkXlhfJmBZOTNOK3ZDKEAzCis8fEwyZWhpSSR5bGAyWThudjZafmw7bnArUEJZdzs1MWJVcClARk1ob1dDOHk8MUU+cD9VYyU4b0hDbEpIcXFQUSV9X0ltV09tLSs1ZDMtCitRY3xYRlE7d1VTe3FFPnJEKGJPO0lgK2J6NVFVcEZaJWN+WG5mckUtdHJYNmpKVC1ZPyYzUzlUN3Q9VkpRNW9uTzYtZ3J9RkAlYThmZy1GCiszR1otYmE7TzBhY00yPyR2QjZPQzJLR1F+cW5ieCReZUAzbzBiS2dUP3cta0ppTXNDTDwhWlVGQFEydHw/aWNYdng3PSs2YiVMSXk8cDFOCitYbE1OYm40U01qfj41RlBXbG9BcjtAVmY3QVBXWl9rcT0xP1RgbUJTb1VAS3NlWSg1WEpWQylVeDFkb35PN3d6PWFWa05nK30ye2U3d057CittNm5BV1JJO3Vse2sjYDVCI3ZiNHVfKzVzMGpaak9aaHsranl9Z1VTN2ZHVE9vaWEwN013Pj9kZnB0Tz9xRmUySzx0ZlNeVyNjOzU9aiNYCitUPHBQWDJOUS1QdXRgRmcwX1hyRiU3QkxHX01VYiQoXnh7SUdYZU5Cd3Y7M2l2Xz9DYCMpWktNOFZnTmg9fTQ0SFBJaSRBbjRFKVcqZHJ5Cis5QzZ2KDMyNmpwS2g5cGN6PmxCd2x0aH5DclVVPmw2VHU+Pnw1bCMqdXpORDFnVSo2N2Nycj01aVZScyk2TEhmKWxsP1o/Zmtxam8/dXglCitrfERfY2t7JlRiR2s2U0V2fkFQV0dEOUY9elNCdnBFMDxARnZQeV87VExlN0w+fkxGNGRwd3RQUm00WDxhYnlaZGBjQlo5JHBENSFOfmpQCitUTGtrPXxNQjw5VEJzQ3I2bCMwcFlZcVpFS35iYFhEWHtOR0xObENPVkdDdVVecUNjdyFHTXJ3Tk0hRjFEfW0+ZVklMCRoWUE8K1M3MkJCCiteS357YnUyST5qQWcmWk10ZE95a0htI3c+SlpaQkptcE01U3tlKW5vPnY4aDRzcG1YZnM8VlZGa3pUZSZfWllhR1VqYVR0VW1ua193V01qCitGfjB4X3N9SVpOO2BaKFpVZDgmU0ZpS1VKIUh5fihhMS1FbGt0KkNMO3tKejcoJms7eWhTVGJoc3B3Z1U2QjFJUnd9PT9Uan12TT5nfXF0CishSG45aXI/YGZxPngocU9WI1gkbUl2NG44UkBlPXNMUzc8TEFZdCRqSClHamppSTcwa0YjZiVeVTcoJlY4MmYoREkyeyRhSVR5SkVnYX5MCittRnNUVUBnQCtWRCEhWlJHZXglTXtqJlp3QCU/SShwfHNwb31ZJH18a2dnblM8S0IlO0JINENwZmAybHNKKGJeblghb25YISZKY0dQKURrCiskY2NRKGF0aihTTT5rQyZCJGgyYlhMKjJtdFB1LU4xVyl1P21zaDxPbSE8K0QoKWpMfDdkI15we281I1QpeyNnMUNkIUNfc2p5O3RYbmhmCishc3FJJEF+fHZgO3JPeU1ZfG4/ZHdJTEtUVTspI0YoNG5geWRBc2w0JFFzcVdfdEkyQG92O3oxQ2paNy1kdihAUlYjalZmfV44SFB+X055CitfYGhgWT11eEI4O0A0cGI8cUwmKnMhLUdeNHlHYDtsQ2FsdV9qQF9MMT93KjYpMjRgeik3I25Ba05VeD1OeE45eSVAKl5FPnQ2Y2hiYjh5CitPem4lVyQhfFpuWT9rSWcjI2FmXjVgeGFiWCUmeD1QNikyfEhoQTJYdF4rK0N0eSZ8QEMoeTA9K2RBeztJanw7WDlrc3ohd3J8SXBiQSprCithZkxfU1g8JTBuQk02RE8jRyk8ZlZBXkBzRzlibU59RTRiTDl2O1M5aFU/PHkka0YwS09lKiV9aEUkXjIhKjlTbHRLYWE9VSQpbUJGTDluCitSSyhxfS0mQHZvRXdPTUwlVEZJUFY+OHYxRzNnI1ApdUQ0YzwzdGA0IyoyWTJFUHw9em5yQHFHeUQkWCQ7e25BfkkjJG9xfms0RjFCWUlfCis2Izwoayl9JjNXfWRSOXhaUTh5I1ZKSGh0QlV5RDU+bEZHRnR9TEZnTDYhIURjdTdIUV95ZklZOT1+YSleU31WYXFTNktkRi1aT3clfTBoCitfZX1STko4MHpnKnNIRUM9Rk9vZllWX2d6PWx+N1lCT09fMDFYdDJXWTtUPSRnPS1vcEJ6dE5fS3d0Sm0yaVdnWD8xYGJGVFFofno2Y31wCis8TXl1RnFeMSNHMV53WD1II3V5K19zRGMlPzsjb2A9bzFsOTFKXjVEXiV5a19MSzRSaXMwbnVmMyZwI2lMXlZlX3dJUStlUmhkfHleNipkCit8SlUkK30qSXFOZzFSeH1iWiZQc3c4K1p8I2JHOSlIcHtYRUh9PV9zSFFlJGpXSmlvdU44VXl0Zk9UdUBicnRYZ2lJeXJtZnhRTDY3P3QhCitWK3Zib1lvQmhXKU9IdmFPP1ZmU2FrYmdHZWRCYyo5e1c1fXBDaUJsSkVTeGBnR1A7SFJkT0l7PjR4UCkpfStIUiZIRldZRU8kVkJBUjgqCitjYEwwdXNiIVR0Oz9gNmhwZXFqcHVSPThPQXw0R0FMeGhALTJBP3dDeStVNjt2ej51KD89emkkbXkmQ15YKiM+cWhwMW9gQHZvZTVqPCk1CitZRk9fSS1ENnRKJSQ0NlhoUSRiemROX2pFQE52bkFecm5xb0U0bnZQQnRUam1ZRSt+Jig9M08qSmZNQHlhQylDO1AwQDBmPC1II2NPRmUlCis5QX5lZmtYRjJGemFsb1lwbmk+R2ZlQVZPbTdqPyVeODNYfUwpLSszZWg8dnt4cVM2bFZZKSMjWEFEZkZtMzFwSjJiV1FNMHxMZGdSPD9PCis4Tl8qZT9fMnprPTwhYWJPPm0+ZnVRU3loYGUlez8lKE8kck00KEY0VU1JfX4mU2I3N2JXb2BXSDlOYF9sN1JedFZ2WSlxfk95MUojXkxKCitwMCMpRTJ4SCtpIVJSeGhnOzhob0lFZE5XdlR5TGFrJmYjMkc1eGpHUClkdkt7fE83WWlKT0xsSkdhZkglckZhJmpqTTdlVkBUcyRTZV5OCisxOC0rVXItbTtgZUJiS0I8O0R+VC1ZPWhFT31qVDVwUVEpWipiVTJrJmFHKkJePWdFT1JtO0JkeCpDWWwhNlVibiN0TEQrVzsqc3pNcWl1Cit3bWZIVz5TR0VYTlYlbE95dE4qSiMqZGMjRyFrM0QhfENiNjZhSTJrWGRENlFtNitydlpRbGYlUyh9Wk1fSCt+OVghOCY5NSs8cWthTyNCCitZYXB4Z2tBQG8yNW5Ne2EoMks1JHRJR0VFeDhHITl7YVcme2tCR3k9SUsmcEcycmpxcyQ8QjxINHt7TihjLSlmRnUrayNeeVE8bjtyQFRVCit3eTRVfjZULWNCIzR2eWFudjtwK1d8eUxYRkVeWilsQUsxRz9qZ31KcUw7SEs5bUJrfjBRVjl0cjF4QzhVJGNqU0NfQGN2fjRPQDtZKXFYCiswSDsyWVNlZGVSVn03TkF4Y2Iwe3A/OUtDWGkpOHdOZ00rRTlFMypNJUFrenJgTC1iYmJZfG8lTG4lMkszaHZCPG8kN0lJPnFTWDlRPGVOCiskO2RpM0ZSYiZKX3NmTkpvPmVhUUxlLUZYJEp2TUZySiVRY0F+WWRmOytCWS1PX3hVcnQ2MnZDJjMhQ3hCQ2VKRHRNUiYxKkhRUDRUY1VyCit6UCkpTjxRczg+QUIhY2VPbipVZExhTks1KzQzMTVYOT90fm07OFg4T1k0RXJUbFhzX2lNUVJfSE1+dSVgMUtpPWo9JDdPPT18TC1IZjRUCitrNl5PcileSXF0N3s5b212N2h2QmY7MCFCSnI1Ym55YCpVcDF0JlA/IWleTChzeklTcEowWlR7Yz1SZHZ2T0hjS3t5alhTbGJeIUY5NCVJCitwcVNOSEE+QTJnXlA5ZU5qKEBRJWVIUzNGM0hlY3E3VzBZKz1WKSREcURfdjNPSkxhJT9gZyl7Mm9zQmVZLSh4NUE2a0hNSTkjcmdnSy0pCistP3NIPlZAYkZlcGJxakhfWEFJVWtPT1AwXzgoJlU4YVFjTGZkSiV+djJtcEM1TVAwWHNuYjI+Yk56PXhPJXBGOEVTaXtwdXQmKF82T2lkCiskaFokKlhqUUJIXlNhdk9iNTx5TCUxSGQ/V3Rtaj8qajN4JTgjPlc7fHsyZUxXQ0pOLXc3bm0tTjxANiMyTHp9WTwrS052RXNrQm9MaCVNCitLN05oSjEzalB+bFF8QGJrdjxQO1U0bilgT0xOXm52UDJybG1JU3ReLS0rekZST3FvNjdDTUt1biMkQFF0N3A8fFEoKGtVRm9wVl5CaV8lCis+I2d9MXV2UVh9IUhvTSY7dXF9VDklMVNhRXZUeVc+O2hPSEVNfjFJMlZiWmBjI0p0PnRwK25DK18tQHl7Q3FMQlpHVV89MXFgOUgyZHQ8Cista1VUSXx8azJfMHFwPGZCWmJGPFBDSG55WEVmYTdFSGpKZCVKcz1VUkgtI1ZmR1QoTiorKnYzfmEkTktTd1J2ZzhvSlc1SSlETDFkMXErCitjIWA1JCh5QmRjYjRkdEVyVEBMNyswUGkzViRFekFDLVFjVmEta0JlZl9pcnh7fFVEZVN3LVFkSm1kY2UyZHpDKistZVEzQFJteldqNHVrCit0JEMxWXw5aiQyZjhtdWlPLX5qcTsmR08lcy0xSW98PDFTWmtEJngpb1FrdzxHQSt4PH40amdSfVk+VzN3N3UjVH5fcT84YGJpU3F8NERmCiszMn0qazxlYzh9aFNicHdDMGhjMFV9dlZ8Vk0oakdFM29GWCgoITlqWlkhWGgpVjhGQ1FrZXBaJi0hfUJFfGg+bCFvd1gqUiZvY3EoMD5zCisjVXpyPWktYk43aj0xdkUyYE1abi1oWDJ0fnBtVCl0SkgkWGByYV5eentIJFIqZDEjI1ZHPj4rND1gYiQtRkhsUFoxUVktTzAwO297bEA+Cis/OClEMGolMDAwMD0wMDAwdzAwMDFSWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkt9VUZZaGg8KWIxCit6P0NYPk10QlV0Y2I4Y31wd0cmc0IoelBiKTFjRWxRMSNTSUVwUSRTKjJVTks3aXUmblljUWpmZTJMeFk5dUNea0NBKCNYMGYwaTZ6TXlACitmckVXQzMlVXRzYSN3RFApaD5ANmFXQUsybXRleTdEcTxHcmYyWDkwMDhHQTAwMkchMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvCitWUGs3eVhKdkNRYiNpUU1YPHs9a2FBOUw+VlB8RD9GSz0+V1dwWlU/VXUwPXhiU2BqdHdPVmEmK2MqO2JvP2smVUN+UGtqQytYZGAqeDxhCitsLUVFMnNjREVfb1VVM0hfRmxkUmtkNnE7aURjU1djX1BeaUVrZCZ5bXZ7flR0QSg2PThhTmhYTDQzJV5DQmFpb20oamArSGNDUW5tTWU8Cit0NDwjZmo0bHBEaiE5V1ItI2E+Rz40LWtyKUZ7Q1AzfFlYclooI2F9UCsqREo+SmdjWWFhRyhTNk0/X2l4VWp1PDg8eih0c25uTSMmfEN9CitrY2k0WkNzfVhGTj98N3J8MGFSOF43UzEyWHphNig9cFh5T089UXk4NGQyPWNpMTs+VkpyYGw9KVdaaC1yfXVaYlpWVzk3SEVKenV0WGh6CitzT2tSTWooJH1TciN7IW0kNkYzb1g0ZCt6I2hQVjk7QHQ5aSZ6JUlUej5vTjw7KEI+YShQemopNkUlIXBOJj0tRnc9c0F0UW5iU0U2U0JqCitMfCFzKCpzNlh6NlE1JklsPGJiRVpuYWlBVjNBWj1jM09RTXF0NU90eksjYEcjO3k4VW9YalVGanVIRkIoQE1ES3lIYUhJSTRWV356Qm9ICitPdiVVPWRvNH5KYHJKM00+UjV7bHQ9V2RhU1klUjBfTTtXMVVqd3hJX0FeTE9uTGs9QExwfjBVQ0xyeUg/ZzwqUlRsOWhAYk5XezQje3M+CitPI1AjMFBxS3hAeis0RktjV1k4QW10RHN1WX10R3dpfUlsZmBRMDlEOGkxY1hfTDBoUzJ9dklLJWkzb0dJVUtmPCNveyF3bCg/bEY5Y3hSCitlPn14bHgqOEU/a08lVnxYVWVDcGZSZ3dvMTdzWH57QVlePVQ8bzNaMyhtOElmLTBzfTw8cTVURHhTTk0qaTlRIT5zSFJqdHojamVzcHVYCis8Qk48UXBhfU45dk9xRSl1a2IwaCNhSW8lNW56YDRUTyUmTWF0a0hXYmhvYT4mfiVVOU4+X0VFZSVVeDRCYXM7Y2hXRWVRSV5VTENgcCMhCis9fmpXYWNHPTljeVhFblkjOT5IWER1Xk85Nn1QZWhiYiNsIUFQfFBTeE02Smg/KX5ramhgcWkyKlQ7emNlRWFWUVhTX3NnemBOa09hPCFWCitHPV8yK0cqSU5VQnpTJG9XPDA2dXhheCVGQ0k+fVN7VXFsVi1VS2NedSV5WSYqJFpnS2MzUzF+bipOWmkpQSNYLShVNnRzZkJrK1k3Kmo4Cit2Rjh4NlVfR1hNd3lMeTFVZ0s1RyY0JTIyZE8tOH55OTBNfjAtWUx4Nk8pVDRmdVdUK2A+SlkoT3A+cWM3PWxTXlIhQGwqJnB6fClFTlQhCis8TEcxWk9mK1ZDZF5jKDE+azglSUM/MUojVG88WUpONENfI1lSaVRCKSlnY2NBZUBTIXhOXjVDTHVzRU1wN2l7d3lFWig5ZH1qYVhHK2tUCitRXnZfeW1gUklfIXUkIWA+bzJ3IV9iQyFvKSt4KUtoOFNpSGFrcSlLQC1ON0BwJDZHM3BeWklLI0l1IW8/d0E1Xk1GMUtKKFl3clF5SDwtCitqUXdxfl9AMWRgRElYVDYjLS09JWdIMTxwNzs8ckJ4UC0rM18+fGdjaHxiTSVDKmNUZjZeQG5ec1NzT3Vhd3pyREtAV0sxdjlpY2xfUiFOCitvNDF9OUNNcTtyNTMyYEAyXz4lTW0/M2EyVCN2VipqWXklWGJhYys3WjArU0VMM0kwRj1AZSMxUmRneDZwdU9GSihoN0d1SjNBPld0azw5Cit4WSQ3JnYtVFk2cT1JVHVpPz9fNjUkWDFySHghayQrZjdUJT5XZl5JIU1naWR7cF8oKSNPO2gyQ29AUkB2RFZRbXZjREZGT05JITZWYm1MCit9aV5iMiVuMGJwVVV6UHU2amlrPSFDbTVCTzM1IWlpV0lnR21hd25rc2cwYyU7bXtaOFdEJFZ+cXY/a24wTSM5VX1YZmlfZ35YRSQ3UyZSCitaTkgxUyYhQ2grWE9nYjliTUQ2MDNNUX5iNWhSJVpxNkFXLT0tPj1ITVZ+dzQmekV8QTckNH57RDhxelZKRzJHNU9AUGNKR3hJJnF6VGIxCitVJG1wd0Z7TFNCOGZjKzBUfCNqPXJiI2dHd0RCVzxOfjVkKWhlbFV7TWxzYU5kUG8mSkY9SDNzNkNndWNlTlZBVVdmQklNdXs5fT5IZF4mCitFJSpGKyZoWmglTj13VndCUEd7YH1SeFg8P0FVOFkoanM4U0JAbWZBNWAlKDI9aTtCPF4qc3c3eTlIUVZEQkYtJjdZSmpkKkYkMmMpYlkkCit1Mjl1UkpaRWV3PHxJVVJRR3RqP3daeyZpc2Q5bFk1cCNWIT1zT3xmNkAtclZ+I1dNaT0hPm1kKlZNJWtPej8xcmI8OGpUZXc3O09YRGZvCitjPXpMUkBMbVBEQ09yJUZ8QF9INCpRYFlqWT51OTchJTdVbVZ0cSZObXNUQTFOS0FzdmBnbEYpcW1VeigkQ0JVWGJnNCNFeE5SWXJVMUdDCis4JmpFO3VAU35KUjYtblRGPT1HenB6MXhBVT09K1R4Mnp8PFF0ZmEzKDdTYz1yN2VWPzRsQXk/b1VLUCNZeWd9NTh2dVFKakdPTlV0QmM3CitrNnEzWHNMKGg/eTYrTEZBQSg/MiQpcWJJbDV8ZyUxQzBVSjkhXjUkYzVIPEc1fURYUzFXXmpqP0xhRGtNKl9OYD9kKEtyeDg0Q0EtUHV5CitzYF9DUjFLI3k2b28rQn0hRDhUXl5qVGxvMGNrJUl2Y2AzX3clcDJoSCRiUWJHV0JVelRvWVdoeEZtMS1OcnMkfnNuQzxRNHMyRDkqU2trCitBOGdpITNuM0pmJlpZSUdzcDUjMXVlbj1wZ15sT3trOGNNfUJYXnBiPk1MdVM3dnhQS0ZYQFpBT212NGdaMUIreSV5SmRkJHdmc1d4T2toCitvVW5fNkRvZ0p6fmklK094JUpONm9vRWdaNmxMY3tROUktM1leYiR7SlFXPUskMH14Zjlje0M1R1VOaiZ1IyktYSMhNXRxTTNVPF8yYDV5Cis5YTM7NUsoRC0ofT9DY3o0N05TPG9HcSteQH1mYipVb2hfUmBSez0lQmFWRjBxTlhHTl5VOGV2ey1iMUNlNXxNXm0pUnpAKndnVkhzc1M8Citqd3RCS3A7KSkrNj0kOS05QTAjV0h2bnZVPCMla2h6JGdYLTtSYSElSlpIWkc4QHpWZ1lVbjBsUmVFQWEwYnxmKjcqaiN8MjdPX2h3Vz48Cis/T3JlalMpdk1faHhDWFVUJWhaY1MqVmNYbyRyMHA5U1NGMis/SX1eJnslekpUQl5eYypRTk0wJTBEV09lK1ViIUA0VHBlM2FwKDckVjNiCitlM3UjLU91UHY1WHhOO3U5QW4hWnZNbzJKS0VBT19YdnA7emQoeHpNen5GQGFJe2ZWVD8qRlhQdkFER2I0ZFBedSpxP3Y0Vmw2RUZfZThYCiteU0MxQWstWlMhUGBDJC1pcC1BQSNRclRCVUhTSHkwYVRyUkJufTg3aGdWYCg+MG81T3k5U1VqdiYkI0NSY0BrYXVpeE9zTmJaS1VOeVR4CitLTWU1KHZpMEY1ZFgtYndyfD5+RG81blFfb2lVcCpwbX1rbW1JXj1tSSgxUUNnVVk/a2lJKnxTUXlhT1JsZTsydT85KjxXfUk/JWVZbGt+CitBWUhycVFWPFJLWG12aFIxdipCSnI7STR3KnBTMDhpKi1fUXUlUGk2akJmPURMPHpKcSZ7IXpzWWtfKH1oVGkpZHIhWFR3WmJPb3taPktRCitBeSo2SmA1fVdpdypZYCNDJjN6Nzd7UWsjNE9KQ0Apb2k5Mzw2RVNxZURfZ0QwI01VY09ARFpudGtUbyZyKzFoemY7bUxkK2Jre0JWclJSCitqSVV5cGEtcXVwRCQmMnhZYiUyNighMm5BTHZjKj1QdVI7eT8+Qz48PCZ0ey0xJEJoO1omISh9NU9sY3BVfUBoRlZ3KiFFc2gjYlYkQj1ECittdiZ7RlZweTEqRlY0LU5ocWo3QmIjTEdxbnVAal9TZSVUUH5ZWUAxYjI3MjNaT2MpUVpZNWdpYEo1KHNgX2tRe2Rvd0ZfRS1Cb3B6d1A9Cis0YTgpVVFASXByS1Q4K2pFPSEwSG5vS3Bna0hVe2Npelg9MWxLe1ImKExpVT19R2xBR2RxckA4UFFfSkhfJShPSHd3RnF6dGZtNEtJPmh2Cis4bTFmQHIlKmNqWVNOeys5XyZtZV9waiZta2BHSXV2JCpxQzkweHVLKl8mYGBnc0FITlA7PGZ6O3U7cTVUTHFPSmV4X3RvZHNwalZnRmU9CitnMVM4TyY7SF9GfXg8TyExeEwyaFU9ZmohWjw1ZHt6OzxwOzdDQHVBSnI2WHhSTUp5S2gzRzY0ODY8a1kkP1lhVSpaU2kmZzhncXZJQngqCisjQzc0NHpmLSg0YGFTSnZPakdGfXZQLXxaUlRyIUwyMEpTK0FxeVdtakYxfHU3NU5ENyQ2MHcxbH5fVEQ+eTUtYyFuYXBuZWtYMChfN0pwCisrYzsmQmRzNzlUeUxzXj4keXBFfUBVa0loNHxzdkRhfCp8M3whUFU2Q0I1STFWLVQmK3NuOCYtb0s0JThPSiZ2MkpUQ19vPmB8VXFWe0VtCis0UT1lemItJVA+ZnJ4UHBtJiE3VzVkbjltbSQxVSFIPXo5KnhpISVfSFhfPFZNdjAoRjVlM2YrX0Y1dTNiZCp4TSpWKmdQS3k1bFApaD5ACis2YVdBSzJtdGV5N0R2LXE5PGZ7dzAwMyspMDAxPXIwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRYiNpUU1YPHs9CitrYUE5TD5WUHxEP0ZMUDtsRV52OVI4ZiRPa3hiZUd4MSpAUV9lNVo5YyQ+OW5kSGJ0R3AqfD9ZM3NxTVlwP1I2cDBHSHI3c2k+XnE9QGZICisyPW9mJVMzJVRCdGo1a3deQ0pzZ2dQcSYoMDJVfVArZjZxP09kJUM7JUFsTGQ+Xk9mYStMaE5ZV0NHbktIMW9tcy07alBZY34mT09nLXdOCis5P29kWTgoQChsOUAydiRNQ1Nae05WYlErNnFtdVk0dGVORW5mN2w+cUw4TkxOeTgyfFQxYE9PY0F7anhBRTI3JT5hakpRYWVlSWc2RyZVCis1SjFnMSMpKDVQMUg8SDRWTVkoI1grPDY0bHI5TVcoajw+bnd1PzgxIT17I1IqfmV1a2orJUlTJjc3T2c5N0k9MksjKW82d0RodDNhP0Y0CitXYGY1fENkZnsoNDkyeitqTk8zb0xZcWBaJFJxJSlEQmpGYWl3cXBnbTJASklvTHIlU1l3S2pBITNiMH1VQEo5fmI5QFQyWWB2TXJRWkVCCitHbGdOOXpGKSpsY0ZjSnc7ZmhCKjBuYjBEUmtwcz8qSE1oYEBrV2wrSUlATEhncD03cFFzdWlvKTAkIVNMKGdiNypxTTBmMVRGXlFIbk97CitYQGEwdjB8RHZzNkcmVjRlSVhxNWc1PTR9RW5LMj1ZRyUoMWhiQzxFR0JDMiR0aiNvUmlPVVVFPT5EeEF8bUdESEltd041Z1ZRWiFse24xCisyWn51dlJIYSMyNkBSLSQ0eS1kdSUrc25TQVZ5ZGFPVFk1Mk44UHtwO1F9XlNXY2BkamIye3BXRl5WT2MtRXt4YFdBUUhvUmZvIURzZSFlCit7ZGJKLWx2Q0FaIy10aFFSfTNDfDhVcHUhQy0lSWJAJD1BS1h9aEJmcDlSS3UpRj8hZSojPTVMeHZJXnVZUFpnLTBwaiR0NlMpSEZaKn0+CiskPilJR15kfCNnK0ImJXpqIyFzSGJWcmxeKXJZKDhoJl9CNUpxKlZeUH5hTik0KkcrZTVzMnlDX1hkKj1oPW5vTWB2cDJ8ZUF+VWRCVSMtCitLcCNSOGZjcnw/WkpuRnh7b3ZfPkMtRXxLfUZNRlV7X3d1Z0NORVg8MmI9VTNSMmtnM2ctK2huempvMSpfajBueD9fd2x4ZUx0eWEkTkxjCityMyhqTn1jbEI/bGhHSjxYWmhLP3BWP1peSk83cUlUQUtTclAyakUyQTtUPyFPeyhqVEI9Z0YoLS1MNFVLI3Y7WXFGS2E2e1lIckt1RzlXCitXY0MoUGQ8cVFATyRrWDlAeWA4PGwyI3owK0NLP0FBaUpUNEJnSHUtNEtyV0VhZmElUFp7TilEOFYqUDVHJiMoIzQtV0FiU0VoMWVCI2E/CitWTlNxZFdAYTBrJDkzNnIkM3hWZkJJb0E9NFRMX0VlSjk7TmpESSFiR0MpSmhFKVM7an1sSWlgT1o3N2h0S0UwNHolb0s+fTRgbnpyT3YjCitFLXUoUG1eRWpCQD43ZSE0O09jYDIrMG00R0hGMkw1KSQ0KnEmV2NrNzcpZGR6dyUqeCtIb1ZFNEdtaV5HJllxOVBqfWhxYlo1fDQyKU9UCitsOHUkTytiNlQkV3Z6RVYhbVdaYHopTjBETHV0VXd0YEtUUj5Sa0NPfD07KUpAY0IocDgyJTEyJXl7R2ppa0AhQW8mPlpjdGc2RXwwSV8zCitzbUwjcXhYaFNYQHh2JWRHMEtYST5aXn5jYHtgPlVOMTkmaDxoR3N2fT9vdTJffnFkUGZQO1ImJDhfZk9mb2NrS01NJkVCdzZ0Nnx8MyVkCit+SSkwR1VpZDhrQCFmdipNQ04obko1THhsYi0menFgbyM1NCV1ZkdjQGYmQnpjRUBAKWFmNGxFKE8oaTglfHlTVV5ibmtsV2BxRiNifHVBCitXPGA/WTdSRSh1OElweHs3LShub2V6clZOVVJNVExSOEtuaVRCYn1yQiN2PmFMXmxZUC1YQiU3d3g7cl43YD9JU01tRHN5dkVEPUEhZVVvCisjZ1JZd1khPD8rK01qUWREOFFHdF45cXl+LUM2eERqeF87OE96ZF5BMHpwKDk9IUQzSCk7Y15oPH5FYXJAYyFNeiFjWHswNnh7blolVUQ/Cis4SmRmKWdVcHt0fUBpYDxKOGkwODx6fWUoTiE7RT1vYEw7XmFNKz1XUT13QWB8MUB5Nno1I0k2TmNHcDVqWCVRbD1BfnZBSEYpbGEpUiNGCisjI0lNfjU0RmNCWVJ4YGltbmZHO2VfYiVfIzZtYCFZT3RzI3BMeCs7RFdlIUlqUHtBKTwxcHBYK2QhZ2d0ZU96PlJ+ZTtrKEArYm0rSllNCitfMiQoQlYlPyZVQnROc1ZkK0xEQjZuRTBUV01oJSheNnxVREFgaFhRayNZeU5BTUtjNWkyfWFOaTRsMTJARF9Remx9MkY7R2R4alQ/QzVfCiskOClSbTNBbFJRZE8jKSZgVj4kOFUyOUZfZzY2ai02V05WJHorSE5nbyo4dTx5QXJpR2ZJWUxRJi1DIyZUK01IJiR6VSF1SXc2RGJOLWohCitNN0hFbityU1o9TyFCV0MmJTRkOyZJTno3JDVIWjh1WlBhTiQzMmYmUDI1cmMhfFZZbXYtdlBtclV6ailEQUdMTjRWME92ZUtSdUY0KUBoCit6KU1XTGAySVV4c3lqc2B5I2I5LSpfMk97Mld8JUlsN2NNKWtPM1JoUlZxai1ebF9JUWYjN2dfTjdfcDArcyp5YjlXNHVFdCEpWFR4K2wmCis8d0ZgSX1yP1Bwc2RqZ2N1N3Q2MWR4WVVgQCU7XzsjfVJaYWFOPl5gYTtzcWxZMyhoZUh3Vk1odXQ3czd8OVE3WUVoblFtWlFDZSlTJWolCit5dkBDNm8yV0FYKnFZYFleMEJPWmhnO0BvZUomdy1zTD5TSVomYjt7YzBQcHF0JilIWWYmRFBkWDlXVko1UnApST8xYzBCTHJCdk9GOExuCitLP2w1b2JxSlJCJiUkQWZuKnk4Yz5OfHtAU2o3IzJlMnIzeFZLeWR4dldsRVVXTi0+XnxAVEVkOCUhb1R2N2tRX0x+Vns0PSl4SndhXlQpCistR3NMXlcqdFVLSnhjTUZyeHFQTXY3Qk5EIUpQdjkwdGFuWCEpQT9HQTBTPURBKFZZfEVNK05IRzQqJGxUaz9Aa2omaEptO2hFZFh7b087Cit9Qmw3aU9IKEJMbDJAKjFtRTAkWUc2WGhsQnNCUn5kaHB8WVh0Z1FWSjstUEp+aU8xRlpld0FRdjszVz1ZU1ltTmFZU1krRGU0KzsjSj0hCislfllPWmFvaVF1MGJ1XzJ0bFFLSmJaNzM8VkY2UHR9VlQxQWgtPXQ2aHVqfUkkcTkmemhSeEQoZXJmKT5zc2p9QChnPiU4Uyk5UzF1YGpeCit+TDVpeVA/ZXZuazttVitIaz5pVUFZJSVWZXFSUGgzQV5TSFV+VmtmeW9OJlFBTmplaWdpOTQyXnN5eDd0VFdqLSR0QEFUIWI3cDAtbWA+CisxSTVOIUp+N1AlcSRQciRtYzFVeWBWdj8ockJyYVRsNDFlM1AtTjhrLWNpQ3Eqc2FaeFFOdlg0QChRKlVlUVNBP1BEVEpsdDtiKVNQZUd3CitfJjxmKVRxUTI3WnR8OTZwYmxpVGpDM1dtPF9qQFpFKU1RKHw1OD1ycUood2F0YV9aOSQ3LVk9X1Q3dC15R2RoNkZren51JGBvJmFUR3R8CitWJUEteFp3bFo8PSVnezllPnFgc29OXkk+NkpGan14PSNKVzQ8eXh2djFFTypKWWdAJFBhZm1JUWsmRGdfPyVlcjc3JFI7TXZoU0pLQXE0CitMVzdTRS1FKlIjV0ljanwjQkRtZGNmenZeaVVQaGg3bVIoT3UwPCtFaiVwSis1e2l6clQ4ViZgT30wKCh8V147bCZANUchViRzI1N4YSU0Cit0QDFDUXktRFl6Vz1DUiRnN3o0en42ViM/WUJvU19tbVZnNTlNJWZ5b2RZIT1KXmo7ZnlUaFFqM319LSVHJC1uYGxYVjFOUXNXVzR+dSliCis8anFDbD1ySyFNOWViOGBWPGVITHV4X2NSKVhRfiNsbzxLRmJnRDF4XnA4U3dzSnkoZiFwfmVIcm0zb1VjbXMlJX0yMiNJNmwyJV89KDNHCiszTXxqSU4rNnNrZj42VU5vZkI3MGt0PUY4U3BwenpIWDQkNTRwfndlWGZoPmhIPTB4UTR3I2ZXdnMkZUBRdXlxTkN5XmpqeW1fRiNec3tOCitYeiE8PjFtTGtKMHM0OWdvJkhtd3dHI3pCKXdfRXJDcmdmQFhxIyRFRnclYTZBd01rfVNjQjwqU2ZxZS1NVjEzanR3NzJgJFYmZmgwSU9iCitFeFRtYWJUIWpxa2tAZFpjX0pEOXY0YVI7Myo3ckZ6Y0EleCp4biltPkdtOHZqb21tPWh3UDNYOTJ2TzMheGR9ZEpYVHJgdEl6SEstKGNaCiteQlQ+e0pQSHZtPHNWIW5wKnpse0gpVyQjYXRsckZSY3h0QHB5JTNzTUpWYz1NfHVGdFc+blUxbkwxMCN1a0FrVCkoQ1JqfGV4YkMrSXBpCitVQkJLeD9lMX1jQTNnOHZjbllDTn5GakhXUSh0bkNTUTs+biRucylPcVVeTFotSCFXYG09S1djVldpejFxTng7OS1gQmxDY24rPmpYRjx2CitgQ0IxaE08NmFjQHxndWlHSEJ5PE09c1dgYHF2Nn04UkpfLVRoZ2o8Ti1EM0Y/U3R9eCl1N0dSVCZDWnEyZyRUKj9CJFdFdWxMdVFoUnJjCitmd0N9K1NSd2kjd3k+P0VwWChYVGxjTVZzJC04fXVtLWQoV01wREhVN0R6UClYY0p5V1FsQjZxMS08THRWYExacClOfEBxbUkodWV3dUkrCis2THg4Rzd3amFTX0wqZT8rMTdXVkE+OztgNmhRSTE9P2JhMGBBQTNkVyZRVXdhUVEjXj1+MytEKVQlYDZyNXZTVDg9ekVZajZOMSNoMiZtCitnVy1PTX1mYmFOT1ZTUFNuPn1pclJLNGJpfiZwUT9SZnRUQmM+NEU5I1hyRkVxXnQzcnE1Ukh3YGRrNXRZUmh0fSFMNjlLSW5xP21qRTxZCitTPWtOdlhkJVR0QkQ5TjtJaCFvZldRd3kjM1M9YUR5WV8/c359biUwVztKMzxwQnNKODAyKTVAPD5kMV5heVYjMiUxRGVNeEhobVo8WVlCCitqU0N2ek9pUVFBMSk5QG00SVZORjZlbjF8YV5rfF5TXiR2a0tGKHBsN098UlljUHxwRk5ZfjgqY2xIMXMzUVlUdjZAQ3soQzlodEMhZyk0Cit1OXcyVmIybFZzUVVJKmZXI1hDVWlgP2NGdk9NaFhKSk0kM3hKa31LKTVRQjt5ejZLeUAhMmBOPTdVJiFUN25PRT1sJnhiKT5Yb1c8NSY3CitUJWVDRXl9NnpmVkNpRnZkaz95SkpkJlV5dmhEbHRQSUhWcGpsYyk5Pi0tK2xNRSNhNENSQEtkTm5Zfk5fSmdLQn4oX1YxJTxZU3Yoejw8CitNRUhINjhja3NUZlhgSFp3P2hsP3lMR1oqLURQNl92YjsteyVRYCN0cENLVUEpRERXZyllc0duTDM5MSpJPU04YV9CYzYjRXMxV20lMXtiCisqQ2dQMldAJFI2X2EjeiN0bm8qRzMjMj9FciRePm9hVWx6Rzl0UV95bCokYU9MaFFpa2ZxQjg4KjJMQ1hGTEBnM2RFWGdoJFVGdl5iSDF1CiszZj4mS3tVMigmK0d2OXh2IVNaXjxyO1YyKFJpaUxCJDhScGF6ViNjZHpLXk9EPWkxcXxGYEFEQHxCak9ybXdJWmdqbG5pNV57OzFPa25aCitKOFA8VlltQ2hLRCg4bkcwKiY7MF96Zz1hRXh8Zlp0PHYmeT5UfkdxdWxmTGd2eiZZbTMqRWxyJE87Zj1pJVplVVc2NEZJMWxoUXt9elcwCit5QnQxZEsze0FDUjA5c0ImSVYyUHw2SVJTQDsja0w9QWNEV0smTHh9RjwrYVB4ZTZ4anxZTEkmQWZoeS1SOE4tXkBkLXBeOTlBJkBEfWZICitHQ1Qqa1J5T048SzZNWUMhN0ZPQlI+QDE2enlSeFB2T3Zac31jVyZOZU1uOGJGRTJZMldFJSVqVT83JTEydjNhUnJrTT9gVGQ/d0BwUUE3Cit8SDREd0wxY1FaeT5nSz1MM3UxTjd8cXJ1eiZyIy1URHR1TzlLUUgwMDAwODBQfmQ9TS1aQFI8PXBAUDBMJWRaMDhJYkAwQn50PUZKRT9MCitaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZyVlBrN3lYSnZDUWI4fkU4WkREantYa1RiPWI5OFFEWkRsV0NVdWtZCis+YllFWENhQ3djNiFBaXQxNVFndTRpWFprKyNuT1lgMVRWQFN5cl4jd3ZkUHAybFQxaF95WX10dnJZY2tySHBqYCNfa0VKKmB2JUx+O2NiCis/WUJrdWEhbj5yYVgyVFlUUDN5SEpmaUwkdUM4NztLV25SQURyI2YpbT9OdW16YSg1SW0hYyZfVnBXa3QpNldBIXwwXkhHNjNLdHtxKXE3CitrPjR0NTc0JiRzdz5Vb18/P0QqV3ZxYz5YJDBEbTB1aXJydWBTWF9QdiZqQlNwKVpFRFdjNFRoWGdVPHRiMVVVOSZHV0gjQHdyQVFELSE5CitTJWljKl8xUUwjZG4tV0VqU1RVPUEqT0pIJWUqbW1CSXRBK1EwQyZMJVlTZCpVY0FETzlLUUgwMDAwODBQfmQ9TjNHUEg4dzNVYjBLeUljCiswOHtffjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZyVlBrN3lYSnZDUWI4fkU4WkREantYa1RiCis9Yjk4UURaRGxXQ1g+RCs5V28+MHtiWVhPOVoqREdkZDk3RmRaeGNybHtvUX1YJFdpMXc8Nkg9N0RZY1lKUUdnYlNDSl9kVDNlO05QP1pzCitRcHlRa2ZDalFpTDMmRi1Dampzc0x9Z0c4TURuMiRHYS1qNGhJe19EQTxoNEFAJkl5Y1UxdjUta2g8eD1OZjhCTGAlMyVYd1dJWDw2ZV8lCit8WnlvWVk+NGlkSil9WTNZPXtwfj5XQio2O1V3eSN1OzVVWEpQWVRzYk9MQj8tVG14eyNKVUpZNyRvUT5BakxvaDBHSFFmPjxWWnl7YXUjCislcCEoMnhIQ3ttNn5ObEgyMXo5QTBIUGNjVWohZGpKLUtOSiNOZnBiSEF2MUorLUtmXjwtdFFIPVcpfT55WDhDTkBwfVUmQSFWWFd7KEVGCitVUzB8Mz10NWVyTnxnJlFwSUt7Y0A+VyNLXyVSKiM7RWAkXj4tQm50RU5OUDMkSms1KlI3cyZuKVdTNmFlNG5RKVJUYTZnZyohV0daVWNeCitBYDdweUheNCE+aEtZMnMxbz9wPThsU2tpPSRqT05FVn15M3YzJThteXkpbClgbD1ObERsNTt6QFd6Tj9RbnA7UWxSXnpHKCpnS145eyR1Cit6e204NlpRTGRTVWMkNGJBbm54MmN3JD57SFp1N1FePEJLOHMzKDw4VW1VVkkpbUNue09gMStwRXsoOGA1U3BfKnFmb1ZtSkVLQ3kjcmtUCit3Qz41V3ppTHRyNl5vUXx9K2ZEN3pOcCM+eDAmakJTR3t3JVk0aVprRjA3Z0pFTTlOcDZxKnZ8RWE4LVVzeDt4dXY5b2xPS00zQF5EUHopCit+SkZDc1g9MiRyYkgjfEVxRnc7SDNCTGxyeHlrKytGSX4pcH4rfnVAa2NkK0YwSHMocGRVY2RiODxfMkU3eHBLSXhsOUdhJnVYOU93PE5zCitVNldYdCpmSXBSUis2c151QmFuN0ghSVhhZEZJSXNFei1HY3JFb15XRCFPSEU1TngoQnQ1RTJ0SndrOHgxNGxxOXpAeWg0eXAqUFZkeEBUCisyUEtYJmpyYW5EQHp1SlE2WTEkSVMpZV5CU1lpP0YjSylIYV4pdj8oYz85JVJARG0zZl5JVnotU3ApK1Nebj5LM0tUNW4oSTY4eVFHREs4Citndmt+SnE7IVNZSDBNVmtDX18yJVZNeTFhVCMhc0FkS2ZEQW9MZkAmKlN4KXxWc0M5RzVeQVRVX1hSWCo+dlJxaGx4cDk/RTtrNWZwd3dnCitCMHxPZUpRckI3PjdRbDdqQ3JLYVQ+eCEqPHB9djg2cEVYZ0tJbkA7OD1HdGclOWg0VXczRiR+IyQ9QmohUGZKLUYzcWRDcTd9aDRCP3N4CitNT089IXAjfj5LXz0+Mj5MTUF1fDBEYk9wbEtMY2IpdzJaUT8lU2xgRlMkPHRkRVdjREgqJTEkXkxkWGZwMz1SSDB6eEhQaTUtWiFLLThDCittK0F5NDx6Z21fMD1HR0FSMkt6MEtXYnskd2V6TjNFY3U5bkwjc21AaWMwOzM+eEUlcTNKcX5UdFg1e3k8KVc1SjN1b0Z3PnxfX0dFMmhjCit7Pj19aH1aJVYyK3JObGREQXZ0KGx2enZAb3RKVXpJZGQkJEttQj1OT19RUC1oMlY4NTI8RUQ+OVEzU0F9JmEkcXhXTnskYWpmVGs0ancqCit6RXJIUnRVP1hna2xAaSY2djMkMF9FZk5Fb3BJfHBMYCQ5RnpwU3M4ckQySEJyUj40ZEdNYXBgeDJqPjlqMHpQeCglP0JhYSNFYlZtXjB8CismR0NAVjNsTW58SnhuPGljdlVlVk1scEBtcHpDeCNuKjVHfmAxPU58MEcwZEg1KGVUTnZWakJzIz4+WSNyYEdxJGVpLUJ6PC14SkBuNz08CitzP2x2TVB6Nyl0LX5RKzBkOSYlUGZuZnkpTUM+aUZffnE+UlJgWHNzYVdsYjV6VXNLVVItbUxFWURTT284PVB8Z1JGZ3d0P01BN2RzcGgyCitfdSZ5Smg9KD96c3dMMipEfihvIUEle3xQcHpUPUshUGM9aW8+OCkkTnVtKlAmYkZpOTtoRVd2Tmw4RUk1JlViQGVNJFBVZGQ8dyM4QSUqCitFP0pTJlJKZCoqMDshakEmZEYzeTA1RkFMRjdVSFp3JEBQZUMqJkRNRVNHU1FNSm5STmQjaVB8eCluQGF+eEU3NDtAdUs/XiFQckBEcWk9CithMGpIRiQzKzdzaEREJVdKaU1LUVdzTCFLbGtSSyQ3TjJsLU5ySX5BN2AmWVJHVGNISj87PkZ5eDIqPClPPSl4TysyQ2BSfnBiR3J3fTwhCituRncxQTYhRi1Uc3V5SmRWcj5QWiRQKG9HVk5oYVJBdGZZLT8oPCM5MGg0T1ZCYWYrd1lWdiZKbSZWYHl1Xz9OYDlySD9hJFhNVFM9WD9DCitzS0AqQ3dDaVFaX2V0cztuMU9fe19mT084MHF3JmRCO2hyRmc0KUdJZHI9UjQ9TEd4cDxvQDQ2MWZteyFoX2dvNkxneFVJfWRwYFNiK0x9CitNdGYrIzVAWUtYYk5zIX0tan0/Q19KR3xRajhpO3daYUtnKmF3bllLQ2N4SzhTeiY1aiRzblFsUVZFXjs4JkZGRjFRWS1PMDA7b3tsQD4/Cis1c3F9O2MwUlJCejBSUjl0MDAwMVJYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GTGlXalklZ0Q1WD5NCit0QlV0Y2I4Y355fT9QUSkrX01mWTxHT0tjY3ZHPFFIcTJxZVVVIWE3UCpjTig+Z2dZOTtoK21xMD0oQ3FCQHtyIz1uITRvbW0qN2FBKmplCit3JnVUSl5PYnl4dlhfblAlVDBfJVJaemZPYn00NV5PKlRZSj82TSZ4ZSsyZ3RNYSUoNWFfVDxseDJwSEJHfTVCUXswTl8lKSZFRGpqVylyCitiRjh4JWNoVj5MR1loajg7dSlDSFdRSi10b1olXz1+ZFAxQkwmNThKXmp8dDUwJENqVVk1ZCZBZ2dKOHhGQVJOcEBgQlo4ZkcqdSgtY2hoCis/WXcxOXh6WjV9JGMtIThYb09zayQ+ZG5fczJgQ2ctQThnMEdYXnlvRjdxRllFWUVHWEQmTit6X2dvWShAdndLaHBxaEBQQiMpS19PJWohCiswRkAwT1FrNX5TZyQ/QDw1UCloPkA2YVdBSzJtdGV5N0R4SlpJI2RoPTAwNysjMDAxfXUwMDN9bGE0JW5XV29+M3xheFpkYWFkbDtMYmFPCis5b1ZQazd5WEp2Q1FiI2lRTVg8ez1rYiMhVExGSm9fUlplP1MxWD5WPldhQ3diWlFFJUhlNVB0V3NJM3kyfDN8OSFjaFhEZmU7QzBSeEVLCitQI08xcUs5I01ONT47ZyhkfShPNnp+JEpDYyR0JDFZfGRrdTRzLXlaaTMkQmdMLUsjKH54NER8WnVUX1cxPHhReWFZbCVPeCl6aCt4dWFECitRRUVYY3o9S1FGeVRLKy1aOzRQT0FCTVAkcEoyKkFmb34qJjhAbX16PCZ0cUtyNDhCe3VofDRLKVdxQiZgOVFMWkZiaFhxQWhSKHdAZ35ACitVLVV0bzJfKmRUN1Uja1VDTU49IUhfYndBZ3lMRTZBJWJAaU9lUGh0TEQqSFBtQkl5fil2N1lPWD9UXjt0SkhnVmlZYWBzNEtHRDROKUxCCismYXA5anx4TkQ4RnVyd19QUTNHWlQwfn5Ad01EKFFDdCFgeG5ZcVhLdEArekJua2kyMXI/Zmt4aGo9WXIyK1B2NjAqR1JGPnskNEpoS0p+Cit+Mj09RmQySDZsRHskOCkmVjJhSk9odVk2IShoTXszSi12eVJ7JD90NCQhVDh2ckNfRWlTMFp3fWAkKF8lbWdNdXhfRT1QRzhVaFlkTilDCitObilsKlJiRGEmaXg3NHowfmI2ajgkPT1OcztyYkgrMH1nRFpNX0g0QndVeSZiYVdPKSpPVV9COHdYa1d4PW9PbDBWKjFFPmVCMEBBPTg9Cis1SUt3X09TPyUqdFhtUHYje1BuV0lONHshS3VLTDRxV0xsQnR5MDAlZ3x4fUtrfDNjX2JhMihJNH16eWt7OFBGK1lEYWYtKnRBS3pGZEZuCitjZkBmQyE9NzxKRlE/IyF2QFQmdTRmNGl+amgoeVomZnlIPmtEO21EbUxZMX1gMCo0aig5fmRnaUg7LWB2ZElrSjsxcUlga3BFNmUhWGtBCitAUVkkP0p7KzVEMz85NllhMVYoaEM0Y3klTDQ2PDVDdTVeLSlRQERoTUBHNFU9JDkld1RVMntWZlU5JjJrMGxHUm5rSikpUENYdEd8UnNGCis2fkh2KWwhTWc+eHZKJXZ2V3A3dzV3VypAV1AhOCk4M1ctNyRNSFpzaVkhRXNCSjNDQTstUn40Yy1qbnJBTlZ4dClQPD5XdnM5R0BhVXVYCitJQ3haSU85fUR6Ukd+S1R4VEpSaDhrXjshS01qKlI4dldBKzckcGZCYSo5enhzMT1KTzZzV1RyS1pERkNNPXhYUU56KWtKWVV5YDZ7Ql8oCis1VEV7OUQ7dXRkQj1me0xxcikmPEY9Xyt3biFrYzVkZztlZyF8c081P3F6TXIhQG1PMzcwVlZfYCRVZURvIy0oVFcjR2VvKnVAZk1VbnA2CitBSFdtSnJkSzloM3QyR2YwajgweURSe2wqKVpBVlZaNHx0P1A5MSokRUVFO0IzYDR1LSp1V2Y2JEBtVmokJkt6QjQxTTJgMz4tTVohcVR1Cit2Pj5VIXxmVSVLISVfTHhIU3UwKWQ2e0dOZ0F2SjZobCV0JTskX3YhYVhkUjc8cGhPbk03RipmLW9zTyMrZHtnKWlifWU9dzl5JHlIdC02CitONVl2OG4+JVkmcGJ0Rj1JJFE1OU0yNk50emkyUnJ1SyhMQShmN159R2chWTQ7cFMyVHVSRjBPR0RxX2xwPTwxQEx5PT40eWwrO0RGQUZHCitHbF5GVlQ2cDNtQWlNczVBU31hZ0MtaSZIPGVAWGZJVCk0LSFSez9Ba2tmZSpFOyQ+VXNIUEc1PnNeRHkkOSRacnxWfUcpNm5yc2dmeTc1CitCbWt6ODJVdzUhO0s9R1pHOSp3bHsqP20mKjcxcmFGdEd1PFBFRWUzdlomTD94OS03O3o8NitXJGYqfjk5PDM2Q09kLWhWa1FGYlVTXk9SCis7ZjFYPTU+QElxRGtidVYxI3lTRUheeTBFMElSViRNMHA+LUpqI09aTTZ0bVUrTWtpWClUO2NRUnswYWE0fktfSTt4aiNWR3clTzBJTW1lCisxKmZNPXJ0U29Zd1NlQmtUQ2RnKlVeMkFYflczdzdaNVBFaj9LSW17d0EhN1ZoPCNnRW9yam4jNTdyWHhKRSteI2FCJSl5Zz1NOSZgNVlaCitMdVh6ZWhFPGw8bjhWJio2WTNQfHwmYylENDRrO1hncGBRR1Q3QkpaTj55MCpLVDlvQDRne1kwWjdPPzAlK008WWs9S3U9c3VydVorTmB+CisqLS0wfFhRUjAwME84Xk9ZN3l0KlJydiN7dktWREZeQG5IMj9xcmFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZCis7MCpfR2NSPj9YPjJjWVdwUTw3Yjk2M25kOEppZFB1bm1RZWIyQUI+UHZ7MDFnMFQwTUZNR2JYaE5GVUJ6VzdWKUpibE1NYENCVDB+RXg2CiskOTd1aGdCR1QoRkJJUTwmT1BfRE9UbFolaHtVNXFwbW9FQWc2IXhKUzxWYWV5cnI/bWFZT1BPYSpaO1VeeGs9Uy1sekhlP0U2KUVifXwzCis8YFRYSnc5RHslVEslMjBAV2tuU0ZwNkJWV1A/SC0+T0MkdmZ4cCN4dXFAPCNeY3puU2JoQ3VRaDg8cENLbHdHZjFUWnRtb0EoYHFQSmVZCitwOFd9MnNAUnBsRGUyITZqeFVweUM3bEJ+aXNDd2JZJDM9KyNXbzZZUnMlVGxNNHdAU2oyMyh6NF41VCV1WHomfFpZMSM5V0NYV2YmQTJ2CitTM3pOOCtAZEZKWkJgNS1semtJPEtPVDtPQ3ElJW9YSjx2NT8zQHs1OXY4YSNEJCZjVE5+JjJtfl9ERDxtdzBpYkByTm1NZkxldUNhNjcjCiswTW5ebGNvejI2cmMyXmNtSncrO0VxPDYmUmZCNlA4ay1FdHN2KWhPP3RPVzg+TXM5TFVlTnFBa3RMKW1LSW95KTk3MjVPYkctdzA7UlQ/CitlXmhDaUx9WXpvI2FwLXxPczZIPXl3dm0jSlpufn08U2M0TVJuaEZqe3l9Xis4JTZBVUtCeVY1RyhAOERQK0cydSM3Sz1BQklPK3kja3pGCisxPkF0fm9LXzV1aEROQ3M1S0szMS1Aen5uNj5EY3xOMWpgZnNobWdecnpkbkA0QmhzVSgxZ3tjY0poQ3M3c1hWKFVieUghSWMjaUFqPFllCitiSW4tSFZEb3QrWEA2U25fOEs5fmlMOyZIR05lZ2dockRNSWwzY2Amd356PD03VVZSfUd9a1lUKmU5JlBNfmMoZV5xcWllOGMpd2tAaUd0CitsTWsjbmQoYERVKnRAOUgmQTspN35IJVRgdHBrX2toKEtjKGRnYmZ7QmtneHVHQU0jaHQ9fkteJSMxdX1uXzZeSW4oWiRCUWNkKHgzXkF4CisyZX4qMypkK2JFakFwenVZKyRwdHF3a3o5cz9pRmswYVEmakN+QCo0ZUt+Zz9Vd29RNHR8Y3g8YkRZRXZifi0mMjt1X210S1hfK153QUdvCis7Tjc+dGgyT0h+ZT1sT258QjkzeSpQeVRDQENJfVcrI1RwaDFnY2lCNFo/Y3tQKWg+QDZhV0FLMm10ZXk3RHMzUTtXUUJlMDAxQHUwMDFACitzMDAzfWxhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUWIjaVFNWDx7PWtiIyFUTEZMR3NiYUJwc05XaURgZW02NT99ISFRCitzO0BCV0kjeX5LeTsxOUJeKyZ7SFlGP0tRMEJtOTBqUmd0U2hZenByRWt5TzJfLUUqOGkkXkpjZHYxdih5LUtTPCp1XiY4aUhIb0ZTYXNxCisxP0ZLOCstZzVpVFJ+TkM2TkFlSV5TXjhgPkl1QnVFbUhvTlM8WWgtJWpESk8oYEYqVyNCP0pKUCs3OW10I15tZX4yaTtrcFZSM0k/MXRMCitjIyMybCRJTEo+YkFZUFVHT1J2U3M8USolfFc4RCVgZnlOJHVtNE0yaTs5ZiZtcCs1V19nVjk0K08wVyFPfEsqST9KZVNudlFhNUxlfFpiCit4LVU4K3xGOWN+VjxJJCEyQElTflRxOTFBYi1IZHkzPDYlLV9IOXFtSX4lRl93VXpSajtNSDBCVSRjTlo1YDNWVSUwSFg+LUN9MWJGUVhACis+YTd1TlNvdEtvYGNJJjQ0MjJlYF8xUVktTzAwO297bEA+P1ApWX5MYjM7K1BjQ0lBMzQwMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4CitlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkxpV2pZJWcrVWJhSHR2YUN4O19kdkR2dzUmeiR4VnYhJmE+QkB7OF9zfnsySEZYbEBWbDteWk1+Cis1cUx4S2ItfUNHa1JXUlghckNoV3B0Jkd5QzghTiNgenlKMFZhZ2EoOHktSH05ZGQtQ21ZOHRGeFVyJDwlYyZIPUNeM29TZHZueG5vZnpaCitXRlB1R2cod2p1THc+VWR8dHw7NUp8bSZ0K0pgLVdodSlzSiRUMSZaJHc9bG9tKEdEUzw2SmAmYUU1NClCZkhZUVNJUipwPkt0VGk5SnN+CitAcnwlN1JOM3Z4JHFCSF5XYF5OdEJrSCRzRGFzJkAzJShPXjlLeEM7PVQqZ3NwK0smRjI5Q29pOXJmdFpCWHlmNHZSRyVFcnNPRFBiVjUoCisoSmxWMzY5YG17dXlNNF9MUylRfGA2dWNJVXZxQnY3YzEwQikqSVUtP1ErUy1SJnBkQkxIRDtBMFlWfXNZRn16P2EhNzlFTWA0TVAwbH1QCituek5HSnA4XnBhR3B2alY4XzNKIXVGeXZie31tTD5lIU9QTm9uWThRUz15PnE1VE9xNW47LTtDaUFQaU4yWXwxPk08VVRDKiU+dnw3K0peCis7ME15eDw2JHJabSg0aHQzZzdDJEp2M01XeSU7JFd7bFZAOCpscW4ycXF9Xnl5UF4lWGotK00yWHh6OWZnWCs+eXF0N2Q4VCk7O0lQZEFSCit7Mj8hV3RJWmhmUXUmfHt6ZUh5VSZPQ0plezZ1NkRPaz1ZVktAd1JSYEZGMVNnKCQzNTAoT2sjRm9wfkpnPnhaYFRLRH0xVF9hXyttJGpXCis7TlZkNXtUPip8M058SFVvaTZ7Xmx6RT01RSojJkJKZy1gXnJwUUhBb3d6MnolVH1CKmwyZDNXOUdGSTY2VykrYG1aKVcrPFhMTnIoPipXCit3NCkjTT5rVHVWejdKPiEtV0pSLUVpSVR+K0otQypQPWVheVlZezVVbD8+JChYTkpXdGRRWjx1c2RJP19FNm09RH5oPCs0ITAtKmd+NzYzCitNMG10cUd5ZlpNRD51ZEhnfDRFVyRoJUdNbHRnKXFRP2FpVkFtWTBCKVg5LStmKnF5I2ltIUk1SHhoYWZxO21PRjRpUUI+SX5LYn4hfiV+Cit0cy1KaFFaVExlJDZfbj9sXn4hRXIhMkJIYWk9dkxhXnFYUEtlS3opZHJWMX1hWUVRdGspa248KE1kSmo7PUopV3RlMCE1P1ZmJjw8XlhfCisoTi15ailtWHtrej1fZWVae2hmdCF3S0llSEgzPiY/QG5iSmdeLXZqXit2MjByK1E1UUE7U3hCdD1rVUQ7KHcpVExGZklNeThpM3N7Izd+Cit0ZHhacktMQHgwV3xCcVMtcEx3fkZUb25kbVlfMXYxSkpDaDF+anZVYTkycCFSYzA4KWZpIU1ieU83a3JsbkwwcGQoempWamRyVy07a1h4CitseEctaThWMUBiNyEtVz1WQWJKPlNkPU0mKTVudEQkXmRMSExBMHJKOCplTCNWcUs7YT08NDM+O1QlIVdSSmA/TFRYem4tSStBbTc0JXhNCis0dF5OM0pAbTx+R01NZUo/MSVVYntIZDQ8fHlpRkY8MShrPy1aO3ExKn5AdTd7Z2x1dFJVWUY7LU80Tn0xX0NnKUBMZFdLJllgMUtiaStjCiswbzNgUm5oNCRSRld+cG51eEM2WktaNkcxemBCQH5tPjgjdUlePTI5aU9Fa3RTN21zMHxFXlZ9KypBWXhKMEVFMU50V14zb1NhbFRnUkZQCishPzJiWHJvb01EKCFoX3BCUUFwcVI4MUt4VSF7XzYpNi13O0k/MkUhNEFrfWtreVBpUiFUVyF3QF8jP2wyTCQmNiUmQXNkMSM1ekIyPVVaCitCYWw8RERiIVR1YlYmJjxkTnFIMmBUZzVQe0JGS0BiTndwKjtteUB6e2BUdFE7dm9vP01ae28lTmU5QTkzaWtqYUE/SHw1ND57VGwqN1hZCitybDRaYUBUUDJXYUNTJj5odCNiKVNWMXw8R2ItZDxERWxaYSp7ZS1DfTxTJT0pcF9RbClMS0xSVmdnbUNSemU+K2xGMm8tQmImQz1GLTEhCis5VyooblIydjQ2QVJ1RmNTdHopaGFNWEpfbyhsdEg4eDBxUmROYWpyPzFLSk9eXkJzeGJCZlY9NnNEVSNfakI2Z016WW5CPmolcFlMYFJLCisxaHY4R1pqNXpOMEFtJDt6bFghQm5rQzZhc0BnbHB3aCpIY208aGJycnNxeXUxOFl7Tm5RRUtkKWNFVU91MkwxQmsxenBpKylKMzRMdj9wCit2cSlEPWJmQDJ3Z1BKbHNHayVqWm5hfH5Vez19ViNxQWNWc3V+TH0lbm5Fb3RqaDB6bjk/QEwtam9IfG9FUEV4NigrXkhPb2doOCtnbChECisqaEhwalFEUXZnRypGJkclaypDO2F6cXtjWGxhayQlcjlTSW5YMFNSNTh1OyZ1algmKGkjYzloZV5ee3l6eUZBcmk8YEByXlUrVipQIyNaCitGb05VK1pFV1ZmeDYrMm9YRig/TlBLN1RlKmRxNSpCanhoX3dGKEBFa2tDaTNQJkw/QTJjZylhLWJkekUoYnApbEtvfl9mVDgjLXFYVktECitCNmg9KWt9N0MhXi1gdGZ7R0hvI21nU0NwZERTWWBMd0IlSGRRbCY+U0BZJT9YUXw0N1JXNUF+SipuMkwhUlZiUmplKT9Sdn53NHpLMmsxCis9PHFvPXxxZmo3fElwVTluJlY/TFg7cVZqdVU/SCFiS1EzayFSPGZKd0J6KEJJaXJBTUVWakA7N3dDKFg2QWI0JndzP19VYCN4eCs7WW95Cis8M21qO2AtSX5sdEhofkIxaV5zP2gjeFFKZjVlfFRWcFQ4TEVISzE+OENeM0R1c2QjUWNrbV40bV8xOGs3ekImSCY1ZHd1SzgkaHVfb2lWCitqSGYpR1FxT0ckd2MrcFNgT2wjNHtYSEZEOGNeWiolTypKK1I7MGhIPVpBeDtaMTtwNlJZWW4rNk0mWjc4NDU7YnROPS1pVlFfaz9SX2hxCit9NTktU21XTEQ9bW5Tdk5zMlQ1TXBNJkQ3MWlXQHBQUTI9dTYwKjZtODBHdENhKTlOZ2R5RklWN1JoRFA8KEdFaFN1SkV3TSMmVm4yNXIlCisoNUI1TkNQMm5JO004dzw+MiRWXnlaaHJMdi03VmNzSzB9QlhZM05iR1BXZmZYR2hoOUZnQjJzUChkIzUzV2RXfTBhdkY/WnxIISMwTHMtCitwM0h5QSslI1prWXkjZjxDQnJ5VkYhYHFFeEohUDRNV1lFVEVkZU0lSXZfX0l9RXFsPGUmOUBjb0VBVkolVlR5cyYycyZjb0t0SD0+Uz5OCituO1hKKjVZZ1JIRTYySUljWDh+K1NFOTZxNGBUd21STD99M04xI3s1PjBRYURvQkBAdEJCIXteKHwhR0t9QWVqQGBodEk+ekVBJlNFP09QCitQZ3lYMGo0QipFTjk/amZFcUFKYnY0MnxGVm5AWnw1TVVwdno7IURgSjk0ZDxucGk8Q0N+bCFQMGB4TVRuPEV+cSorc1kzIyE4bSNqcH0qCitiUUJuUD1MfV91fT9aQ2h3S0lGJH1QIVdjKE16TG9RcHtwe3A3P2Q7X1FjXyMoVm5MKzwodDh9Pjs7ZjM+UyZoPCZQQnc3ZTBuXk1EdjFDCis3cDVwO09hX208RlFSMU04JmM8bH5WUWZTdlA0QikmanFxJHBlQDwwO189PCMqbXIwM1VtNmYlc0dIVmBMdjBIQD1qSHdHTyFGe31NTDJ9Cit1OzBmS0xxIVM4JFRGTFRpSDRPRGZKbTI7Mk8ldnB6TDw+WX1tfDghJExNWjk/PFE+YVArcj0pS3pULSt6UlQoM3d1QkRGdklPbVJlYjtFCitufjRDPSU4Pl94d2liJjlnK3xzWTxgfXo7MDRWUVowRyt9Xn07c2tKNDYxVlh3JDNNKDFwfl5oe2hCX05haDJyJUhhQ0p6fF5UYV8xKXB4Cis2Mz1ybXVtXlApZFUpRUZZJChgVmYqMFVlcV5YPyZfVmNiKiVWVnImJUhaZExRPXVgeDhnbUxVdWxAPWpxSl9LJD5uc08qNE5UOXxFKHBFCitncTVRSWFgVzBZZVZEPD5KWjwqN1hXa3BobzltRz00K0hAMXZsKH11a1I2REFGbDJfe003fmojRFlmd2g9c1Y7ZFVoS2lnVSlBYkkmRlNFCitQfEd0REJGZypSMnpFeFRjOE5gcGgpRD1UOHVWPUkxaS18azFhQT8oXmx5IUd4V0NTdkVILVV9SksxdCgxQVcjektWPkQ8MHlBPUgzamVaCitAcWY8cFgpc3JabEMyNFlwMk9nQ0RCVHZfJFJMMEhUfFkqeCgqYmY/O2FpPGhsRE1WWEF+Z3MxVyQyOGxvKGg4bjVBYVg4aGpvRnYkeSo5CiszRjN2Kig+S3w2WkFMdVVYPTJ9blZOJGopM2gpMDtpcmRIYl8tekFid0d0VHRxaXJEZDFtRUl0VzFtRHZndEIhYDhLN2smIy0hWTF7RzZGCithRyhicXRicHU+d3YlXmJmI1pTSCQ9az48UjBuJnBxOXgyNWRidjFpaWNmXys2ZUYoO1NKcCVFa2t9aWwyXjR9fENGIUtBeXo5QzU1YT0zCitsaFF8ck5RQztxS2h8a19CIT5WelNCP1krO2RPR0AociRSYm0wM1dCODcpQSF1XmFIU3Y4dmpeSyVuPVUqTE13Z344YTdsUUFVMCVTdjEtCitnTiZTZ1M+P2hwKlhxQW0zeVh4Zj83bXc0QiFkaSt+RXVjaHB+U3trYHhiYTgqb3UxdjFMc0pSa341TSomfmcxc189Sm98KCoqbCM4aTJ1CittRmpnQjFwK05WUzEqWVUoN0VQMHdIWnYjRSFiRmVJazsyUUFUZV5ZYDxjdEMjV289SH5qUWtMLX12NnczcWRHSStxcDVBJkItdWd3WE84CitYRSs/Jkc+TiZ0NkFxWEMqcW51Xy1GemJqPUJjc1NZSEBuYE9+WTs7T2JYU2RBY2AzRkZJTiNCZGBBSmp3cn0kejFlJn5sPyt1cStISjlyCitARXtFY1ghb149R2pYX2IkYEA3S1ZBfiZINWpBPkpqbCF1Skk/d0BAT195M3stZiVvfE45ZCo0bXdKVG0yJjE8SXFkVDExbV9LJjk1MG9iCitFK1Q/aU9QVFRMP2JPclpFSikwUGpkaFRyTXhfN2o2PWpFKlhhMT8mZ3cxQk55SjU1djdGJTliUTUzKE5QaD1oNyQ4aCRaPF8hVTRVbHpyCit5OGVsQDtfWVUxO0deZiE+K2RzJTR6LXN2SmRgOUR4ZzB8WFFSMDAwTzheT1k3eS1SQnYkZigteHdINzVXN0c1YFBvYUF8TmFVdl8wfldOCismZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxIXZyWTswKl9HY1I+P1g+MmNaYjhLSE9hQ3l5SVpFeGVvNSZvYFV2OVc8aiVFfFFFWUxacnNRCis4PTxMWFctNnVFZ3VkK1FBakl0V289RTdEd25pUU98UVNiJitINGlxJHVBN3taYilfJD5yP3E/Q2lgbEZNRz1AVTkqS3V4Qyo2WWE9bDVqCitvVU8jQ1NUMSkxUndWWVp2bjA5fFNGMmJxOU45WWhlISRkPHBYdlhmZkIhP3JrT2hKRzZwQnFRKD9tSmk+R2EocyVoR0pYdGBqQX5BYF5FCitwJnpFVm97PlphTENYYnk/MlE9ZH0kO0dGZlU5ZylwNXVMWX0pN2tYcThuMTc3dFZBY3cxa2M0UjU9Jm1oYDdFcWNja0VncyVhWVcrWXo9CiskVz5FempOI01tKT01R3JSX25QZyYxRm9aQ3chfD0wSGwjMkRNLVY5I2NfJWBGNG5NJVZha3FfOC1he247OXh4SllUKnhtaUAhfG5MPy0zCiskeiQmeGZzWi1BPUluVGRvKSR8SSNzOVYlTTVOWWlGZUFabiVRRFRIYVAod3w3fEJFSD8wN2hWRXMyYH5MMkpHTSElRS1XKil4NUQpMGBeCit7MkRmYFp2Sml4cTA7RmMtJUZ5cnMjQnoqKEVhdiVrMSQ0N0BNWD03N0NAK3kteDg+Q1VvWVVZPWh5eWhqJnZKJUZSay1ZU2NOI2djRypQCiteTmt2dm9eSXVuNEEkd3RXRX1HIyVecHZ1IzlpaClKWT4lem5Ad2RUVz8pZEN3Y1EzI1JtPk1FMi1FZkhDUUpWeiFkI3MkYU94K1VqRUF7Cit8SyZMV14jSFYxRHVqQVZFKWgtY0YhQ0lYMTQwSklGUzNIWFpTPHVOMmRwWCZQI2ZqNEVzfXJucVZ1ZTR8IWF1QThkbFpTdElMLT5EbmRECis1O3pPY1l1Q1lCPHpkdTZKU0lrYnxtYytTISNlYnxVPjJ7fW5vdS1KJUhuVGNANmRSSzJKcjt7PU0teWRqMzheY0hzdUBySkpkTGFFU000CitucXRxfmF0THdIWjl3dkNHTnk8ZF5ZI0d0VWktZTt5eTA1MGMwbkQlNVY2Ni11ei0pbnYrRyM3aUU+M20haFA/TWo5I1l9RmFTcUpSXns+CitERWslcX5lUU11JHZGPi1aNVV9RTlnYXIrNWBzZHtuaHZFe3BERWNyTEx3XkVzMHhfIVFCLT1CPE5nQy1kdWlvX2I/a0AtQFRwT1Bob2dICitaSVdIbSF6PTZweUJid2JaV05kX3MtRTJGKzQmI3NzMk9eRHttYWA/KllJPCVgVTdvcjxvQDFJRkNCYVBzUStxZWRlQjdRYU40Q35fS25iCitRLShadjdQWDdndV9LKiglQGppYDJtZUFsfmpCcnIzMTUoZz83eX5wc0tEfjU3Y0hoXkM9Yi1qUFpBMilTRzkwbkhVQX1fPG93SU0qRmdWCitqSj0lPFBlQGxgVj0wSSRaak4hZE4xI0UqVVUoKj47PGtvRHZBWDVgSDVDKU9KZGBZZz4jQ1duNVlXOU98KmBraXR6ej1PPiZERCZCQHIkCitvRlF6PHw+ezRieW1Mcn1SZylySENrU0chVjgpVUwhdGNBNUA3QD8zdT59cCVXYmtDdUBzNjc0OXoqdTA7NFdUY3MqYl8qI0B2WF4jI0lCCitXQkxsSTdibFNvUCNvMnZAcXFmUChiQV9pdFExa0hqKUJ0VFZgWUdRcFYhbz4/ZzUlQHEyYTFDV2lYdzVUYHVTIXAqYEpteCg8Tng4IzZYCistZmlkTSQ+a25qbEZkR35FTl51Z3J2QD5VNn5ldUB1M2MlPWs8fVN7I19qZmAtKTAoQDghWTlMQzI0THJ4NEZrPyYrYW9XVlBnLXdqbkVGCis7WWp1cTd1THZqMW5rYSZSXlQ7VExMRnhzflN8bl9hQFdaPDhZJlopR21CVzdoJj1TRHEwaUEqc281emc5M2lIKFFLZnZaWl87Q092ZlNVCit0PDBUPHdlalUoaS1NMkhCSDNoMkhwbDh9X2lWXzxXeiYjMz5CYkA+e3VwTjV4SyswJEAybUk8X18hKEVWdEhjclEtY0w2PUBZcjE+TUB+CitqWCh6IzNxclhobUEpJnNAZTdvJnJRfmozSFApQlI7N1hKI352TE0pb14yYURtKSZESVhFMGE1UilpQChwbGpsUyF5OS1zeHp6PH50VTAzCitZYWF0JFV4eXpkTWEyWUF+YTVwZ0lZcU9mVzJ3U21gRWU3Kys2eCVCQEJSTTUjbnI9aER4VlNBfn5mcVJyI3E0dHZkQi07ZENyKmRjTHRTCishend1RjQpJXgtVyU3cUA7dEFYeSRyXnMhVSllJUhjVH5mTXtaK2RUUGFJezVNPWhpbDJ9KUE/ZXRfI042YU9xfUpySGpwMmRLT0Y7d0hHCitiUT5Yc2kxZTMhK0BgWD94e1A9MWdZNlBtNnIwem8yY2BWbHAtd3l9dXlZSXt5KVh6bUFqRDJ6V0FBWm0zKWpGTEhJWFNXdVF0JVM/QXVfCittMGxKYGpDMUxsb2IqRkhLcih0cFBrWjU2NVBRTmt5RU84OGNlVWAhZGImX0VlV2ZEfHojblBLVUhmdGI7VFhNQytjUklvOXckUzh8bD4/CitqcENzMVckR3khRVFkWiMqRnxTPitsNDBOKkgtQmwjI3tUWDZhVyQrV0hqR1V6Yz1rWmwxaE5Nb0pMeDteUiNXUDV5TF83UktaRjwlaWNqCistMl9DcyNLcj5YUFo8aE5lTUtTLXo1bEJuaUNiRl5TNUlJKFBvfW1nVUU/YHcmdDZmJWJvbyYoelNhemFRPUVePmlCWUdjc3taPHkmM3kjCityMWcqQiFoWmBpVjElT0E5ZCFxKyt3QktQfDMlZ19XQGU8Q25HR1ZzTD1rMzNAKV5GPiEoaCsxMFpJfGdWbU5yQjFQPDJiWXVFO0lgckU2Cit7JEhaUk9aUm1DVl5NWmIkVCR2IzJsYVc8LShDeGN9XyRXLVE2RztmNEBBWXd7Zk0yUmRIb017WnBWPkNlVjItNXUtTUkkJSYyU2hyKWlOCit7WWJXeWNWe01ga1B3X1ZpajByZFdNeyNNKVktKSk5WnskdVQ7QkcrRWo1NnBQNChpfHpOSHNmTW4lQ0ZLSSo7SigyWGBjKCY8UClHRmhuCit8anBkO1IlbnojajRHPShuQGFNPWNxRntSSmsxXjskR3lCPGIlWFl+JHlxZFZBe2s5a15zZHJTWT92bF5FV0czcW92T0NVWHVgP2hVMUpJCitOKCNVclhwUnRTJVQrR2g3XnJlJkojZUJEUW00YVEmV1ojcDtZc3M9XnBIclVVfDl9SytETGEycFhKRjxpWDRmQnA3PCltOG0+KnBkVWQlCitLQVA5K2dTakVRY0EmPXsjN0okdzVDVVM3NyRnJWRwZXFyV0g5YjRnJHZ5Q0h6em5QRkhSZV9oYXd4elE8Qko3eTlpM08wSEc5KWtDdyNQCitGMU9HY1Z6bn1jfCF9YX4tWTdVKyVNX05IXiY5JTdZciY0NUBjYWM+SW5OdVA8cikrSHclZ0wldVk9enh7K2ZHY0clRmItVz0tPTQ3K2VtCitjO2s8NElyTlVpKntAWHNLcTlXLTJedjtrVSlnekBhJTFnQCRvYjkxRFVkU3hKNElla0ZWX3g7Sl8tO1d+YWQ3a3k0KiNZeHRiJmd1bk5eCitQOWAwdnpEZSllPzJ0dEJQYTRES3NASkpLbFJxKj5EQ2dMcGtVVXYzd0h5LXQrcXYrM2JNK3pvQGc2PndpPEpaOUNpUytPP2Z+b2AhWDRWCitvR0RKTGk3Ri1zTSlJQ098OzNIU0s7NlFGNXxjYURGdylYSFpISG88PTI4IXZRMF9Jb1pOZm54eCMjSV5QaXUwdUdLTjltdkUtYzxmeEJ4CisyT2dSJCNXPnhUKVlDUU5wdU9vbnBCbzxGV2khTktAUH02Y3lHRjk0QyFlcUApQS1ZRURRWXZAQ04raTVGa1BlNFFlfUpRZ2lRcnU1Ki1ECitnTGRPQFIjdzQzNTAtYzZCNHI+VWh3aHs+dVAoVVFRIUQjdEE0MiNteXNIIXdJQkQ/eWkkWXR6eGApNElwYikhSlQhR1ZNQ0h8ZmhCJjlACitpcUtZRkl1UWEzWEVUMXIpRXlBc3tnMmtXVX5wPm1sUXk2bTZOeUB2YUladEBMYT5VXiU1Jip2OEdRTTRuPiQxKHhMRjRBWXd1Y3lHQ3R5CitYU0J7cHZfNEFadHsxJkJ+U3BnaFRDVyVpXnRzRFl+d2lqZSshUUlLSVZlT2BRbTIyMj43Zj1+blZfTVJgY01qUDg5ZSh0SzYmKHJQaD5PCisoc0leYnsld2g5TllWWENBLX4tZ2kyO3hLaF5UfSgpcD9sZXEwRzFpP0ExYkQ2bWx6QyVwPGxtd0Mxd1o4c1pMRn1tYjV1ZmxYMF92Vz9iCit0cUR8JVBpK1pSM1QtSzk3MiExQEEpTWp2LU8wQDdnVH5VSExFJlI8dXgyMjJsezh5YUE1QT4xLSRFZSFpSUp9UjJZQGx1amE1WnRmWUQ8CisjclU7IUMrRU1xTERfZiloSGl3fFgleD5KVyU2QShTbn5nckozcGJTbWRjQURWY3F4MEtvaV99eE95Wn11VGI4ZFgxeWRlQkFmUUQwS317CitKQXEpRj1LV2B0cX00eXNnfUVYbldReD98VDd1X1VtZU5MU0YrYTg8eSNUaE0wMllIUjhxOD14ZCYhSWgrM0NyaDZ3MzR9WGZrZ181ZjNHCismdHomKF9OIyk/WHF7Kj5xWntKPzgodUBiQ0U9PmtPJWV6JHJpTD5uaXZxYUE+WEVTXyRtb0Q7Vzx4I3VvQnhjbWBYdFR7U2tvemtXWXEyCisrKjc9ZHhBME44KXcxbVMwMTA5TTRCa3JAJG1KWmBpRUVkRkZKa2UyfFArP2QrdFBCZj8hRkpCKChLblB7Y2xEaDR8dzJpUHNjeVl4flYqCisqWiN5dDgjaD99eTE/fXRnTCk+YERzPXJTcUg3WisqVldYdl9Pal4xeiY4bGd6NmVaJnhhbF5qVmQ0Tjc5TDdhTlBQTyNRTE5YS3s9T1JsCiskX2JmYlNQQVZXQk4oeSlWQ3lnV1M+RmIzezZfPGAjb0d7NSlCaUdSI3J9OFNvJWZsTTRVck5oZFl0VCs8WWR5RDVZez4kPldOeDZwK1p7CitDMEpOPnR3PEpzI3phfHYzTHp9JkBGeXoxJG9YNjI9WDd+aiF9WmRaVmhMZWMxbWF6OWdUYGwoX2dPe2d6Z2k9K3d0c3w5X19ZYUIqSTFICitIYSo0U2BaclNCX1I7d3dhMzlPO3IzWjJfc0l7YlhQSWJjYlRKazYjKFkwSng3VU9MVTV9KV8zMU92NUpKIVpyNXEoUWwhenZDaXxUdUNQCit2XmM2R0IzUipwWSFMZnUoPkRnR00yVzc7RjEhUE1IcDhzKl8yQjJHR0BTc0p1RSpLP2NEJiRNcn5WOVFiUjlfUWZSVXRfYWFVOz4meFlnCis9UTNhSCV5PSRqP2NWO2Fuby1XVERxK2YtQFA+M2pgPDxVLVB7amd3Rk1neyNSOzB6UlhrWlZSeVhMQV9qYGktQlMwOTRrWmE2ZHFpb0Y0CislK0AkJU52YDhZZXRWd3J+dVdPUzkkP2E1c0BFRGp9azdxKDNESjd4TEpTS3hGNXxsPlRsciNid1NFN0hwTURhMGBpeXt9ei1DRktudilmCitAWClRR1ZWeUVLVnYrckAjMXpecnN9VlVgUmdIQEIwVWhlS0RIWkteNTFtV09PSGNoQk8yPH44I0UxK3dFfHxDUTlDeX00dlRyPGJPM2lVCiteZE5efUpobktUSUBYejQ2e30yfElnU2BrbnMqUCloPkA2YVdBSzJtdGV5N0R3eX5hOX16TTAwMmxPMDAxPXIwMDN9bGE0JW5XV29+M3xhCit4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FiI2lRTVg8ez1rYiMhVExGTFleYldwOHpLRV52OShUNVhmdHdoe2lXVXhCJEImcSpeMT87NilsCislalA8OVpPNkB3Nk1PMSZgY1o7Tk5KMzIhM0lMdzBlJn0hUz8mNWBqTlMpN1ZKSmE0NU9DcXBYPl59U0szd19EJXd1MDRTJkFZfWpxcEZYCis+R0FubU5iI340PUJXa3VmdmFQbElNeXtBdU90IVZHeEUwSzl4bi0+aWlganZqJHQ1IztRT1VKKitib0MlNXFoJUxZOFFtZC1DaytTN08mCitzRHtxeXJUaTxoc3lmQnhhay1Rdzx0QTc4IXdhNXdSZlFSPjkpRCs9K2M1Xz5DRVlyXmgzY2okV3luIU02bD0/Uj91b0VnenQqQH1rVV5RCitJR0BRK0hmaCphRVVULU4xI1BQOEtoe1g+T1RYe2FzWGNJLTUrdVQmKEp9aFNMQChaI3BYezRFYD1JRjZpSUMzYWgySzdiTWQhcT1PNXZ3Citscityd0gwMjYhUkgtWHJEbXYtWSsyVnpTU2J3TFZwQyk/d1htSVRvZkxRR1dIUEI1WmNIJTcpRzY1TzUrMU5od1FJVFFHey19VzJ8ZjRFCis0NkFze1JzO2RDVCtQNU5KbU8pa0c8QDREKXMmXiVoSlYzP3hBOX4rcG9PRHZ6YjxhKHBlZTYhemJTNUphUmI1IVI9KSF8S2t9QXVncjBnCitDeEJsT0x0cmxodmp1eDtVdy1zOWEodCRtdVNGY34pVUNyNFF7I2FnTGklKSNGWiR3ZTQtU3lTWD5Hb0UkejBoQ3o5Yys1byU0KkJoejBnCit8TCFqTCE4bzhmbzcrYnE0QHVRYDduT21aNnhAfCZDND8yTWhJO2o2fCQmSXBUK1gxcjtmR0Y8Yld1dEZQej9zRUIpWVE9SnlZUypnOGRGCiskaEhaK2BzdlpgcmlKUWh5e080I2t6RUMjWXo3UV5yRkcqfDJwNUZta3JgZE5KUENxKlZ8SlFRWDQpSypjfU95N1hCVGNhVUhkdSRNdFRRCituVWAydXR1eWN4fDkoJldYRCk1YzYoY31BNm9vOU5gZ1NkQFdjM0REWjIkZ2hhSklgczMzUnVWTykhejd2X3V0MDJMZ2R8QTlAWW1EdkpNCitmdHJ6VHtDKVR5bXtpbjc/XkRrKDxhNnwhZV5sRHpVVSh5OyEzMmNPb1VJJGhFdmJifEdrXkc3cjUrSiUkM013a3dffCojSTxTSVRKMWZGCitiMlFFV15gPD0qMC1pV3c+Z1k3an55MSUoJXJtSEZlK094TWk+OUN2Tyo0O0ExU244WiQyQ0k1O1hyLWZwXlRMaWYraVNJZ0BIbnoxS0hXCis2JUVzXkpDMDhoR0hRdFhkVytQNUNXK1lTNmB4ND81c1o+fXIlYEZicklhczlpU3I+byFBJjtJY0FuYGdoamVqYGBjUU9hZlc/Q0c7VkVmCisrLTtodF9xc0s+JE1OTn15MDZYQSFrUCgrdiUwR1ZjWUtKaiNFRnZNK01wTzR4JUNFdUxhVCltZUVqbDh9ZChRYjMyPzw7fUdSdkx9S1ZKCitrR192S1FyJDw7TVgpfUx3cWBDTWhYOWlQUipRMHsmPzdQTUZFVSNNYXN+UztFcnN+RTMzNVFlNzteJjBCbDdkaWA8KiY4RERMbkF6aHgyCis7eX1QKD8oV2AyJm4zTF5KIzYlcEoha0w4QnYqI0x7T0xVfFJ0PDd3dCQ+T19MI1NRRUY+KXhISkYtPDJyJntNa1hGbTI4elVYKW5WJGJ3Cis4YmQhKjI9Xm5ESm55JjU8eFJza05kLTNpQTFHQG55KHBQaWZkcTxDZWk0QjNpWWc8Wno7MTVgTmZDb30oWF4la2tfb0E4aT5TP0EocklwCit6N2RzdCU8UXZsPWh4fFJzX2NASXh5WHMyalFKZ05tND9nVGZUN0pXfGZmcGopX0dTa0dNX3ZCWHJvd3FJPl5hMGlEam47cUFfZkIxSiRsCishaz5XJVI1fkwpdEB0SmlrLTAtdFJOPiUoc3ctSEo0UG5pOzY9e248Jj0xaGRYMiNtbUVQQ3NYXmxFWHdqOCFNPVh6JStFdSEzeWdCZnIkCis9SVVlMWBAaGwkSGMqbTF4eFBHZSE+WGBtdWlSKHh3Z24jS3c3RztMM3V2TnskUVo1Wl44bD52U2RndEh4IUpSKThTQ24wak4+fihuYHhlCitfRXN9XkNSbHphK3MrQ352Y2ErYGZZJDcmST9YbDttUClzKExxRVo3QWZBSkd6RDY/U2p5fEYqNF9Mb2Q0V0pfezY2UXFBUDxkKkdoKChiCis1OD9sUTZ3LXRjLTArZUA1bnctWkIjNmpZOUk9WEtMPSkrfjFifn49e2hveVZLMj5yT3Bpcm9NVj5XWE9wTiFKQzE7a2tabjs7RWMxN0QkCit6ZyNuZ3lxSiRIRWFDMSlyPUwkbDxJKEN+RnVDZjtiKSNVZDAxeEJmZm1DMk1IWExaS05kU30wQlpyPm9oQzIoc0dRe3JENiU8M0ZjNlReCit5ZD5Oc25QR3tYMDAtU2d2aU5leENgUGcjaHMwSypebmJMfDs4SXV+TDdjeUB+TEh2KlomIXlKQW4rRztTanBLXn03QWlwOFJaVCliRyFhCit+c1lSZCg0dj9gdElYOT5KVEFeWiZsc3ZJa2F+SlFBcF5SR2R3Mkk5e2IxX1RUeSo8SWVfPXx1WjN0X2J4MFM2aztFalBkYFV3aE9SOGx1CiszP2tseDV+cTljZTc2Tlo1bWhHSmAlQERVayh4NSYoZU1JbVItJjtadllObkEwcjA7dSgxZT00RmVzZ20rXzZFYk9DWjIlX3pfNk5WNDNJCitEKis/V0h4PVNoclM9WD9pQG5AUCFsdD9WM0p7QTsjSUA/Zkd4YkM3YUVQeSt1JkYmenY4KmpVdig2YUtUWWUwTVNNYSV2bnY/QHxaI21eCit3ZkVyJEllM2Q+QmUyUEhWWjc+KVEtRE81VXZpdCZlJG91ZWw+JmdxRiFBTTw1JmB6ZnZKcXM8TGAqel52fU11d2F4TXhDOVVnR05zdFBjCitRQj1zNjg8Pj52O2tRVXR3fnpZfWE5OzZYPU1HT3d7MS1MTCRSIXIofCh+QHJqYEh1QFlNUihSKVNYZWFtamohNmAkZnBTJTlTTGwqSzI9CiskK0twTDQ1PyVYT3QkeiEmYSEtNU9hTWElfktkWE4pa2Z0WDYqN3xpVDc0P1J0ZnBaN29fYXp8RGRtaSRRLTNmPzIjNEBwMlV3fjNVYjFZCit6YFZkbDVUKVZ9Mlg1M31LfEwhcnlnS0k4bXlxTzs3RWs3Xyg4UXFJKyUmfT84OzBkN0E5NDYoRnJDZil1JSlgNiZPKkghaWJUKG42KUI5CitvUXFyeDxyUHE0ZFM2e0I0QWl8STU8MFNRNyk/SGRvYF5JbSVedUh7Wk5zV1BqZHBOKkIrTk9pZ1ZXI2lgOTBRTnJFJChvR2srOSprTDVvCisjVXNEOWpTYHB6eE5pS0hLbE4oKzxjY3U7eFhPZXkxZk94K35+TlNKTipeLShgWjNtQWl7dUAkRVVMazZvIzBTSGMjcGpXZzlsSyZsPURyCitqMSlNRE9CNjNSKldYS0YmbU8ldDt8N2Moc2s/WSU0XktLditaQnhFKTlmQ3tScWEpR3lJcSVtZGd2TmJJSCNQe2Q8TmJQWSVDPENyO3taCitiZDZVYyRIc2VeR28oTz5eajtqaS1BTXBpJn1fMW96dTVJK193ZTFHMExPZ2h3STdWbSgtNylEVEw/RGpnI1llMG5hcFVUcGw1cE90JnQ8Cit6Y3dgZl5qXldedXtlakJmUmRCP2otWnFqZEZOUXJtNjN4QTVLKSR1dHomMz1qfCghdFAmP3lhME0ocyMtQWttSUZ6cmcrPn1uckIkdyokCis9Nm9ZcClCXz5CYHgxeUIlOGN0bmJYPT4qe01CSXZjTXRweylTJWJ6bm8tS2RJPlVDZCNBcWs5PzVDYzg/P0Jwfi1DSCVSV0dSNEtgYGhACismdChKMjUlX1ZtOG5pMV8yOF9PRWNwVD0rV2hHen1JKyF9c1ZxQmlxV3FoTjcxWWlqfG48JTRLJWlheDdrN2NAZm42NCs1MFBfUF5xTnhHCispUEJePCZFJTJwSTJ+YE0oZVlVKlB7MkxAdHx0PSN5KmFebTtAUSNhdGFfYD5EJGlJaVZ1WXB1KWE3a0I7dj0tNT5qRzsmQnEleF5iOGc5CitBWD1XOUNfSCVHeyhQLU5+aFpTVG9uSlBoS01nUypqXmNsZ0olWl9ZR09oQD92S2dSP3pGeztPc3U5VEZRPnhffDRMd1phenk1ZntHR3hPCitvUztIMTJUSlQxVjxJX2lTKGJ5VVU8XlpVVy10eiZHPXd3dldGUzAmQUQlalJLdERYRHJSc0dXKVUtUzQkbC1LOGtqKEBKeElzI0xKWlNvCislVyZhQWA2ZDtoaXA9cElYRFBPYl9AJmhhUmBRaXt+U2lMNGk/UVpXemNCayhmXyNVc0lCP019NyUlXnl7eld+JG87ZFhkWGlAailUOURWCit4UFprKjwyQlJtPTx3Jjh5Vm9WPzJfTFVWc3xqfkx7dWJmeWdUN0dFe2VaMUR2bClaUmRtPD9eNDhBPFNoNng4QihfLTVtPiFwVlAxJmNoCityOX1TaVgkKyFDYSUrQyZQRiEtY2ZqIyRIYXlJTDg1Z25nc2Epa2F7ZT8ySyo7d1F1PCZvVlklS2k3eDRHZnRYUWdNJCMteUpOR0F7OG8xCitgZzNqVXpgcj9rXnJqNjxhfGx5QlEmS0htYzhtdXA2PlhrPkNMPzc3aVQpM29rbll2KzFXflVWNURARyY8c2Q3d2VsblZIY0ZmUjNYZkdrCispeVhgPmBlZD95MFo+Wj0xUVktTzAwO297bEA+P2E7XnxyYzJMSiVmNzYxUy0wMDAxUlg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMCis+VlB8RD9GTGlRa1ktd1VNRkxpV2pZJWdfa1klWHdsckM0b2ArY3B5Wj9xNU55NWxCV0hkRDgkeiZnZj0wT19OQE1weERiTD0hZUNeT0d9CitoWmdjNFBmK0t1bm0tXmBHYkQ4SXhsRHF6PFZIU2U1eFd+a0VXaXNmMTxrdnBrdCVWZ0RQPDU8bHJRTWs1SVZscFhfQ2Q8VVBUcj94MWsyCis+ZUxhTGJKcT9+VCFCR01UaFN0KztjPnZNWTklKm5CSDBrPDN9YlRlcnBFdCtvei1RM0N5UHp5NDx7JW5vbCMhIzk8dlUyK2Y3YT5jRD5VCit5TW96aV8hJDFmd0k+JG49S357dThXSGNgdSZBRlprPWchKkJaZX1aSX1eXzVmKzVYZGMlMGx7ezh2JEUmS0I2VzUmSyVRN34+OTJPMSErCisqJnxtaUZfRVpjKzFCfjtwK09IPHB6dDlaWHxoVD9iVHBrIT0oIUxqVGRpdkd2fDZSUHZVQkdCenhyTCpWJEx1RztURUcxWlpRenVFJDt8CitPVDZ8Rz4wJENSIWRKTWtmQn08WTM0aT5EfGp2Z31XeE4tSkx4XjA+KWw4NzJGQkVNcXJmPDMyKXsld2VjWjV2QHlpMShhPEtlT3pKYktXCitvU2xKfnx0YV9HWn1pKERKTDNaY0FkajBXOXEqOVI2QVU+MmxTczR7V3tIc2JeQUB0V3NmcFNVVVBpKEZTPWZMdSFALUh4SF9tQEJsMDhUCismJmRrUUJBZDF5a34/VX5iREAqNm5CUElWajBjPHRjTkYwSz1fPXRkS2A2ZGJfcS13TkNnRCVRe3pXZnl3OCMhYUt8JEx0JGEwOGJyWnZrCitZLXs3dVY4Qj9AZG5kTkZGO3pfV2xWemN1QS1SZHUmZFgmc3tfTWktJGtIMTx5PFlDKClrZztlaSFhWm8zQmlUK0sqaHJVe1VVMjQjYU1DCitYNTskVShxS3NQJXIyaTUzNDZ4VUtKND4+WFpFLUUyRGJaJT9mdn5iVHxXWG4kcEh0UGhWbG9OQXdad0U1TF8mTWE/eCZlc3xyP1dORjNNCitfQj48OSladExPJlkrPlVRRUM1OW9BcTdZZ2R6SiYleiQ7ZXE5Y3xyT0YhN0QmUFZGYyFFRj9FIzUjQSUydGVlKDM7Qm1UX2JFcyN8KX4jCitkR2IhTVdfS1UpYm4yRjFrSVVpN0NBP15yNmJPLThWM2R2Um50WEtUZ2x1ZTVLbHE3PldtTjVQaDBiZnE2ZkcwVFI/eSNLfjR6fkNpWUUrCis/YXtlRG1mRmB2VGU5ODxyK3A9YkdoV3ZDKD4/TDxVdjRzSkspQkxXaGhRaENnMEMkJFpHJHNsdypiVDQ0fCltSlJkYE5ZdFdoSVZiX3tVCit0Zi00RGEkZV92Q308aGNHOW98Typmc0k8P0JuNWN1bkdfeXt4MERjbV9sRiE3OyE/Z2N1NihKSG0pNUFSR2haKmhQZDc3d2shfUNsMzU+CiszI0FHdnJlVGtwTSR8cTdNQWYoc2t0fENnJHVIVHNeMDA9PCliR0tMTGY4cHAmc2hSZE5ANC0lPDVfa2gwX0t8JERgQ3F5UnppZWBpU3FkCit6UT9ld0tiUzZEOypoQlhqeyEhTmlybkFfcjI1azFROTVNSVhlM3BOVHsybG9iV0xOUCgwXlVLLS1VR3hLT05rejdaMzhgWFJaMyVCM0xVCistPk4+K0FueSF1cj5MZi1JQEVgPDBuUWJ7S2FVbkBZISh6RD9MNGhibGMwZzU2Rmt6ZzNFMDZUK3VmaVBwQXlnQVRhMCF4RSkzclI9TGlhCitXQHdCSTU4NHsjSF87TmFQJFRWP2AoZUxyRSpHM1coWnVVTjR7bnY8U2ArUnBMTS1yUGhsekhgaTxhS1NZUD8jWmBvMV5jdDVWaVd1WTBOCitxaE9qdDlAemxZeHR1diZ6dHcoOUFNcVQ8V2RXNlIyWGpSd3B0NioyaXw3RDBlJTtQRTFHXjRIeWQkQ0hRTGxsKSs8P2oxMjkydHtTdU1KCitpenUmdkkwaGxuQEpZLXpEYGoxeiNpKSsoKWxja2xvWEVNeFh9bEdxPjg3JitfNiMqKnhBbn43I2FQNShHeUZleikwdGopNGFjUS1PQyQ1CitUJHszPldNUmU8VCVmTk9JPjN0WE9wVEF0ZlczUERQPnVLblFAT1BxKVRBWiRmWjA8UDx3eHA4fUc8cy1uNTdCV2ZWP1Y+dGA5aFNYMlJECispZyF3KT1HRyUwdWlJRkBQNVllJUM1cXtJZylSTit3dCMtJkhkaj43a1BtPjFCK1AhNGRHISpTJHJuMTsmc2dIRU4zPHdHfTVLWVlLNns/Cis7Jm5qWGEhfXhfKFpfcS01WXA0diRNb2tUYl8jSzBCcC01Q1ByIXhYJFFjYzA/bCM0JDwtS3lTZiVvIUJEO0N0ZVdISktqS2U5PWY2VCFpCitHOVE1cCZSSilUZERCOzBfbUxWTE8/XmU0OH1GMWMkaTc4RTBrTyh3bTwjTWFaQ2pBcz9FMVNoPXNHZmxCSS1menx6Kk9mIVNYYTkoWlplCis8I254aGdxTlA8WkJhLVppQDgjfXhtUy1lMVU0ZT56WWkxfEZ2PiE1P1ZAPURAPVB+UVIkSyleJj1jTz4/JVk8X1N6bkA8bz96YHppJk9SCis8WE9zUWYjREU0ITREJntXUThZcUMmb24kbCZvbWRyJndOWkQ0T3spMVp8aGVQOGNZRjxRRkNXSGpYUXtwQm0yQWcmSlN3dktjaWxkNjdgCisoRG9PUXhKJGs2RSEqZF4zQmRrYiE4Z0dib1UhVF8qdjdkfWMlU3NKUnpYJGBlNGcpMXt7SGpBeVIpV1ZlY3RBRC16YWNjYzFvZm9nTkFBCitJVCUmWS1XVyhBV3tMcXNCejw/fig8eklRJXpGP3F+aFo1SiRXKHA5QkR1c01lSCZWbXQ/aGg8WXZsJWZoTzI2eTU0JGM1QGk5RGZgSTVkCit3ZiswJE9sTHowaW5AaGUjRDtNKUIzNC1oXi0wMXklfmt9eDcpYGJKQj4oLXNTVXEobS1wLW5NeWIxR1EwQG90Z1UhMTRAP3Q4USF0UnEhCiskRV4tI1E2P09Fd0hpa0l5KiE5YWpmdyF0JEs1VnVAb0c1dDJKKnZXXiVUZFY0WW43cjVpOCEoYVQ1LV5WZ3F3b0hsaHpZa3U7T0drUSo+Cis7P0BKTTBoRCsheWhoUDF1d35lVFNvMWtyUHN1cyRNZU9ySS01MSMtd2FLejNic1IzQkQmUkJYUm5YXnwlYnEkM0hOakpvPit3QWNjYHo7Cit1dTQoOH49MnIlSUdVcH1EPzE+RnRqVH48c2ZFNT5AZmh6TX19SCM/c2koQF9AeHIjfiM5dTxNaDtJOzRzdlR9UDdzayF2ezlZPW9tRUpUCitsViFnNU95b0p3IW9ZUiohdEcwSVJKTnlja2NQJkZJNUhwSDlLbENKUHZrLV4wUlcmfTd9YEspZ3F6Qzt0YWZPOUtRSDAwMDA4MFB+ZD1OCis4cFlGSEgtb1AwTWBjcTAybHhPMEJ+dD1GSm9fUVpERFI/YjF6P0NYPk10QlV0Y2I4ZDN9e2xpYHlefGhWVDlyQkU3X3JuKGNLVnI9PzJeCitKcncjeTNCaFFzYVV4Y2hmK1VscXJUQEw3RldaV3AmMCpKP0pvOUdlb3IkdHF0JXxSLWQ4RyMramdwcGYkPm83aUE7XmlKRnd9S2FHRT1PCitPWXFqYn5VQU1qTUhQa2lYLUFRUm49ITtSSndAYDwzNWpmMVFRbnFfSTM5d3dybD1MKTJvJnZPeClvT3Iwa1RSYkE9e3xofmFaMm5iZTc7CitXI1pmcWpJO1BaWGIwTSpTZ3ZFVGdaNGY/M2cxQj1pMU5pTDBiN0R4RFZJTnMtYmQ2ViVZMUA3bVpqe3BQeiVOLUoxNmJZJnNaIUZvOHpYCitpZTlZJGxiWTlYIXRDODtAckxpRCh1SiprbCRGbm5WSlU4NV5OMjdPfk9PMWRXa148VzVFXjQraWtvej0rPDQxM1ghaCRXMDt2bkhuNktYCis9cWRZbzclMjQxQzc0IzdLJmMzWl44MGVaOE1oXis/YGlEbzZARyhXMzNFWWFzWFNLOSlwXkxTQFZOYl9gTkBKI3oxYnI+bUR9NUh2LUlgCislMTV0K0hecHhiZipFM1BeTUh8Y1lAMFkrSHQ5K3NMSEpxeyt2OWViJUgxJHRmVlc5RDIpYjkoRj5hd1Y9dm5QIz50eUErblhkQW45eFgxCit0MDA7dyVRZHdeMHF3NnZoKEpHelNUUWBDbEwlMTlTTW9Gd1ZHbCNoVHZiLXcxRntiIVJAVkAxO2hobTZjb3BFSG5AV0VCR1lkUlg8YVk2CitPeWgwN2JLQEhEWlYoQjcpfGpuVyNoUSlqaHIocD8maXgyQG5XPjg1YlBqWmc7YWpAc3IzQ1JGRHx3KkZydylFUlUjRHpLPnBMfW1oY0pKCitJWXt4VDRxUEYhNVl3XmhwRSQqdk9sPWNNdG84IUFBNiVWbD12UnlESj9GVE4wS2RxJmcwKFkyX09LbVpPfjIqTCstMi17O35EJmZ3eFFiCit8M2NUZldmN0tsTztjPz07NVEqTzZMbWlOSDYxUmxkeXlNbGhGJm1EP282fWNJZzhqRV5RbHBpaD1PR081TFFyLU1COGN6TFQ9fTReVEAzCisxUVktTzAwO297bEA+PTY1Qmk8PjBzc0tWMkxKI1gwMDAxUlg+YyFOWio2VTFaZSgqV1Z7ZEo2WS1NejVaKkRHZGQ5NzcjWjx7YT57X2JDCitLJTJFTWNLPG4yP2U4e3Apc2BpcDckdXcxTVdsPUIqRF9+QHNSWXtmcXpPemsyTlpMdUEjc3skUG9fbC1sWSpON3NwZnMmakVmfVNjNiVgCitpPnE2ZitJU318KChnZnchd2t0RWU3UmFPTkxrel9HMWlsfEtYYzROQ0c8bHxeRHEydVlkKzFKVlBkaW90Zz09Rk4hb3drRHVTRlR4fWRsCitKeVAlOStZfDJ+dEh1cChZa3RyOUFsO0J0IXEmOEVNX3EjZHYtX1RQYHJuR1haPVkleCYhcU87QyFTWGx3NiEjQTNBaGRAfW9iNlN+bE0mCis2ZlYwJk9hQH1Vak1uPi1Db31CZFRAN1ZZKSY0NzhmI2VDWmBaR1lYVilgMmBtdm51WF88c3EoN3lyP0poQ0hBZWhocEwyfWAzb1NLeG4hCitsaVcyYXk3bUQkK2UzWTZVQipVdjNmNSlqSmRTZEI7dnp1fl4jXjV3TUc1JCQqb3FIPXhJOThzYFFgOyRpfiRtSSZjYHRtdTReNm5TZSRvCis7ZTMxdDBgMEQ8TWphY1IyZXxlMzg5VSZ5bkJQc1JCSE0oWl8rfiheSU88KTklMEg+JjgwYH05WUk2Tj9AQn0qWFh0KykqblhreFc+ODVJCitudCU0dD1PaztAdVEjNzMqJD8lbGRyWEd5fEpec3AyKUJTd1VzJEhTUEZuV0VIe0VLZGg7OEh0c3wmKmtHJlE7LWRoMG99OUcyY1Y2LTtOCithdWZuakVhLUJCOHVlNUBUejh1LX41fWYrI1R5ZVFyOCFiYlF8JkZgUHZJITVNVVBrcn5JKGsmNUc7Njd5MjM2TkhoNF9LPGNwM0RYTDU+CitRNk05PGp8UUVuTDU0PFZ4Qk89dmhuNDtzZW87aHxNcCs9LX5QWSF3PGkweHpxJjB8QnFTMy1SXm5TVk1iTVN0Yj4pNS05NGhxTShHaGpvCitPcE9JJj1YTComPF81PWxDYkFNK3VoIzQ9NXVPX0hEKktJZFheUGslMUN4XiQ9JFNkY2NZe1peayo/UTtIV19QK1RWJmdUX2Z+R3x3V3whCituO0JTS15fTVZzQ3tsUF8rP3UhVW90TnslPnl4SmVlJVVQfE1heXc0MitlYjVecEd2ZGdwOGw7YTtNdVdgQHM3MCVHX2BGVmNKdGJgeyNZCisqQU5wYyVSc2V9bTtKYyYlUD9nKk1Pb1hxRmJgNERiKzRNaTsjUlFnVzRrYXdrblN2WWBISWwoV1VtMlFYQVpWP3smMTVpcj8xUVktTzAwCis7b3tsQD49bV98ZS1vMHt7UlQyPjx7VjAwMDFSWD5jIU5aKjZVMVplKCpXV14hZF5kU3h6ZmQ4SmxPaWB5Xnx6NTc+KUsoVWlMLWt1a0hUCiszOUhRRSk8cD93dXtpKFZARWBtVHVEd2d7cS1HNWM1RWxrVk90Kn1YfStaUVc7OUJyUllOR1BJQEBXV2w8PWxpKzdrOT1sO3x3YnUjVGMkCitaY2dTclorUlA0JkspUCY4IzdSLXJlVSVpVm15VDlYcm8ldCV5SzE3UiV3N2dGaiQ3d1huNVFLaChZPCZFZ28zMGdEOHAkIUhna34tb0I1CitZXnlCKElCS1dPVkQ/ZEpVdyhUdDgocFYtMGwlIT9GcDRESmJMXlM7RnhQfUkjSEtiQ3lWSyQ0cit1NGR+QWM3bDxwNkl8eGZkSUR7NFchCit8Z0FBbEc8OTRlSkFMMShrQUMyTjQ+Qm80NCpGWTYzT01kNHNXJGZzN1RuIUtwaUd4OW5wT293Um4kQHphNkxmQV5Fbml7S3RIM3ArM0R8CitvbH1jWHliJSV2ZTBEVVp2eih3aHIpMXNJVkhpPGQpTEpmVCZXa1ZZKVVyWjElXlY7JjRuJVctPzFlTn1SKHdKTnIqUHF0TyRNdlo1JnxBCit+elc7e1JBbVUmS0I7QXc+blBvY1JScnVyISRpaGpMcVpRZFJEbHdkMkZvR2FPR1JFUFQyZ3JrfSVnYVZBK0FgSmcmSTdeeEE9Rl5WUEVmCitWc3tXUz9eNTl3SEl+Rj5RWk5BVl9XPjhIU3M/JGQrPG96dVNucmI1QXBQfV9IQm1uQzg3QWVVcSpafm1pcHoyPHhaSW1YJllZU3FzUnpuCitmK2t6fV9hUTU8Z2dSJG95LTxBay1hI3h8bVpSXzktV3Q8eyNVaEskYDNxanRIdEZwdSp4NV5WNVVsU0poeXU9XnBNRmRgaUR3dFRMV0p4CituQ0FabTRZdEJNfChGdENMRFlaYVF1Zm90MF8wckcmQG0/Yi1BTkc7U0c2U3pxTTJCfDAmazs/WHxVcWx9cSNBJG9vNWRNWGRaRCY5KWE8CitRUUplPTQ0JkkxVDZ+ZVFaRjJHYFZmSipqJk0oblpzJEJNckcjT3VlTG9OVDVIdnskKE1BRmMrJHZwQztKfU9IYCRjOWp4XzBGcD5OVmNOCit2b0I+WnN9ZWh0V3RRLTk9Ky16WGZUWFQpQH47cE15bVpnTUdOO2ZxM2AlbUNIO1B4U0o5SHxea1M8cU10Q0lYe14qV3xRQSVGZWQ4I0gmCitCXzlHJFdPSzV8dDlgWnxNUlFZTUA+RjQ3JlpiXjh3e2xzVDgjJjNgI19WfVpIUHJCYUh0SSFWSX1HfXtBSUNvIzM/ST82KkMzI2NEbGUqCitOIWdXNUdQYiRUPTc9I0l+bUlBQkVXOzNJQWw2aW1aQGNkeT5XPUQ7Nm13NH5iQj5wOV8weztSfk85S1FIMDAwMDgwUH5kPU07O2M/b3ZICit4PDBNLUtsMDJCWkswQn50PUZKb19RWkREUj9iMSFJUlk7WjFjZDJMY2xpYHlefHpVeDtFRTxwfllYM3dTUkJgaj51cHtLQTIjVTkpMFNgCitRP2R0cEVNV3ZnSmYhYnVzZE1GVT9HQXdGSmk2KFReNHgxMGp2Sjl7QVBpVmY0dEJKMGIwaUdzMDk/P3klTlVhQDhkOFh9S1FZe09AI25KCispaUdqe0gpUDxwX09+V3pGTW0tQSozRi1iTVNfUFNxdFUqLVR4dkdQRWkhK1VmLVkoMnh6czEpIUt6WjFTbD5NanpESnNqZWtiUnlaS2lfCiswUEt2XzlzRkxZZV5TQVg7Y2xteXtrPXk7TmR6fDdmKm49cWFBKiZwbWpAa3krcz5ecT1kKFJKKGJKUkRvaShFTjJrNmk8QyFgcC1Xdk42CitxNj5xMXo8YX5ZcjRXY218Z2A0bV9DPl5hcUlPcWQ7enlfe1ViWUBIXztUZnc4dys9KGxhLVY2e3ZTRGsoV2ApYmtgPmdNS09jfipacGZDCit1Z1VUcE1ibEpIa0dfISk8bnI/ZVJNTXtOdFIpa0okWVJvYTc0Y3tfNUlacDUkKyQ4VEZ5Q1k/UldJTVF7MmFpT0Y3UTJNc1hMJFB4T2gyCiszV1ZwMFByJVhxTmwwZEtFVlkhenhuQXJ6XnN3TjA3KnMtIXZvakRUbjM0VlljMlNnYFlzSHw1flVyc099I0tEZGFLbCMkXmxwRnRgPTUlCisreXhLM2d5ezZwWWxRUXNzQ1M0TzlLUUgwMDAwODBQfmQ9TSp9VyhxQmpsejA3RSRkMDJjck4wQn50PUZKb19RWkREUj9iMSFMYmI5NztCCitZJVh3bCVeT3tCPDJMZD16aytiRnUpVmRsX2ptfkUwPXdEbVU0VE9vR2BxSkN4aj4qTCtFeWNyRG9He3IlbC1ENztmRipAbHQwb3dvS1NRCit2YWJgNH0/LT9vXiFTXkloSDtybHBPSCkkcFljM1JfWXN0JC12RERtT1VEQFgpLSlAVSk+dSEwPzFYV3pMX3RPMVJZK3JBUmxEVGBpWWdBCitGWHlCOGBkQVMxN29JOXkqNXhaSnt5dkdSKCZXfl40XlJ6TGU5MVEhTkt1YVh0e2x+P1RRWUo7clRNViQhdGhyfERre21+U0g/T0NQbm5kCisoNStSSS1ma19xNTYqcGZfZnYxMjFfLVJseklpZlMoSlk4ZHxkSUlqd2xRRSV9PDMzejhSNztrSU5kdm1IP0Myb3pQJFVMRW9zJjdTQyV7CitlbGxnMlYte1d6aCRPKGQwUjxFJVRoQy1IQF9nM0wzPyo2Km1KPWZgS2MrJntCdDQ5PEV3Y34rUkBBUUlYNz9VLW0zWF4wSVpVel9QaHsxCitmTWt1ZDloaUYmJVJ0d01LNHtLclNrZGZ1dmZjQSVtZnUhKU1nOH5oTSVqSGR2PGBXWVU/P3JTSkM7NEFIQzRObXpmYGBjak4mY1djZjdmCit3MEtHODNIRzJTbGIlb34xMVh6ZiooYDN1a3p4MTxObnBTaVY3Q3J+Q3RmVyNwSWF9R3poVzBRd1J5VWJVZTclc2BzOGJTVEBBXnV3RXk+Cis7Qz92fjhaelBRPX01ODQ4bG9SZFpaQlNkdTZpTDY7eFl6aWkxVnYreFNiNUNsKWUrTDFSTXdJUkllfU5zQT9NaU1uUF9QflY3ZUlmezYoCitmPjJCNGRQI1kqIyFabjEofT5wcnp6UUhaX1Y2XmwkY3BvTXxDWEpwTiF+c0c3K0Z7SEA0I2AxPER9WFBPZU4yJjNgPDR0eVlyK25wUTsxCit5RWl4dXFTWDdVZz0lSkB8dzk5dXs7VDZpTWp3YVAzYGozQFl6VV5EP0R+a2d1SHs3Wl4/dFQ7eiNtUlJFfEhCMmRrOCY3Vz1ZPVBtKk1XCisob3pKKCUlPE4kPXdabyN1amZxcTh2T1lyTEsmelFqczYoVVBnYkt5YCRHJGlhPyVMMDBmUTk+bHhXe2Q2RCEtQ1o2TUFVUmlWOyFDUnc+Cit6a29RejxDSChYTD5CWEE1cCM/I0c3Q09nKkFqVWp0M0hZZDJFaEB5RDZqK3dQMmZgPXJlaDg3IVQ+cFVHJkFLUitXYmkqRlhhVnx8JkZBCitOMHZBakBwVTl0O01lOWQyZ3JsVFQ7T1Q7O2YpR3AjUlU4P0I8ez1aWnBIVV9fZyl0cEpTbndsa34tQ04hPk1XM2x5T0B+WE1RYChlamg1CiswYUMqfEQtLTRRdjZ0NXhudnpBb08hV3JVOFFDXlY3bDZCeCtZa0A9XmVII1RBNT94fSo/VCplaiR3OVdealNlQXNYZHlodH1uJmM1bEpXCitNc0spPmFDelQhPy1ZQDx9cW00aTt7YU8pUShpX2cqP01Nd0xVdGklaFp0QGI+eHN7Tj18IXNPRCpYQjZPO1IqcyZpbX1zcSR1JSZ6NVhWCitlTEFpKFNtUFQlbVA2KipGVVZ2bEl9R3EhRHNvVm9NNFhvJFJafEhgSz4oNDE3b3tpaiNrbiV8e0d5ZFdoSDNjJWhtczxAKVJuIyYtQkAjCitxRGtRIX1HYkZjfk4+QyhBbTF6MF4jJWFEO0o0TUhGOE9HQkFYYUo7KVcoY24kcHhtT3cqYl9CYVlvYGhNaXB+VGZKd3glc1BxM3kybUxRCisoQCl4dmJ+NUY8dW1iMldwa1JBbVJHO2RDZFZAey04b280c01WO1pRVXoxI3tVckNRfVdRaj1gS01UUFc4bVZ6ZE0xeCojbiU1YC0hQzN9CitEM3UxcjQ9QGh6cjs0enAwbXNGTFNDYEdRRGl5eDVrbytaM1JwKFRPV3ZTLXZGZyFLeGdqJVIjVlhpKUtjb1VKIXsyKnpIQnt3ZXNXaXlKCiszKCYoTWp9dFRsIXMjOVhqZCp0aE5jVmg1aWNeak16VWNAKVpReXVpaUBjJSlaMlZgO3U0PkEqMUxuK0wzNHNjbyFyfUVgYXI8NCRwUHgtCitTbHBhSXFFWX5gMk9tRHYxKGE7JWYmQk1fWlY8fjQzI2AxfmVaMEgte1BGOUBjbUpga2YmWEhaekMlVUhVdH5nTl9sKV4kPHZlUyE1SFRHCitUYSlUUkJ6VEpRTUUmY1RJeyE1ZV5mXjhieTJWQHYqcns8Rmo8PEdYO3NROVQmaGY1ZEF5KXxoSCZiLUErNXNRZkYyODBQZFJ+QW85X2F4Cit2OWRvOXR9NHMjQzB0QklVdTJOPzhfM3w7ZF5gQzBFaHdsTUdZaTteZyorNHFtWHtkKVdCS2QjOXFYakgpck9tJDwpTFo+UE9HJm1BQG5vCis3JStkcUlwSXd3RmI9QWo3N0s/NGREMkNmOTY3QS12PU1VbT1NbzIrdFI1Tk5ec242PiZsTCQkd2UzKFB8RHR1Sz0/JkVpMjktb3wqOT9vCitwQlRzNiREeT40OCliQHllaGU5dnk8Z0E8TkYjVUlFbVdicV9ldzhMP0R3bXZmSn1sSyNUNDkjJGJ7OVYzaHxPdHE8QWM+PFh5QWhsLSFJCitqU2NrVG0rWnJFYDxaTFElS2p8VlVJZlFUdDRBdnJNMTRweFokdyljNzQpYlY7UDkkRWN2dSh0UEF4N0A5bk1eU0xHe0ZhQnI2LUo0MXFRCitqT0NfVGFOTzBoamdWVTZ9KS0jRT1INmRMdTZ8S2w4N3l4bUhwdkVlZk1DdWx7ISQwTGVwPT5rWXJWNTBsPU5HT1Vfa2oyR2lDRyV5UmA4Cit8e01IZl5DTkl9RGQoJEt3cU8kRFVXc01VR3ZTWTl4cCFXYUgrO2MrKj0xa0RMej8jKG56UGlgfCN5M3M+Y0pLKFQ4YWooUDQ4Y3M0S080Cit5cnRibUp5TVpsSWB5MDdxUjRCWmVUTUhJKG5RQ34ob21Mc3ZASiFFKHxQKE1ien1AczgoMnxEeD9ZJXFBUEM7Pmo5bl9oemtVazw0VnNQCitUezY5R3x7dj9CdkRvY1E7biM/PjJqens8VU5ISGA2TzNQc29rU2NyJiF9cW0xZXdCZnxuaDVASGo7Mmd1MyROOH5SKlhAfFRwbz5iJWlXCis0SWpyKW5oTkJrSkZneTZ3LTdfYUxVIWJCeyEpa3ZwI1VvRkpsJTFySXphX2IkS0N+enp5XlgyNXVTek13KG0+M19OfUxyRkBWMDtYfWV3Cis3ZStRbjImTEVucVp+OGM+XkszbnNma3xGSStmYmdgeE5nSShnXyswaiUkVk53NGFXVVVGVkxaTlZRQXg2TiZHUiViK0VOSTtgRXY8aCtMCitTdnF0eDBfVCUxKDkzXlh7MTc+Y0VZdHxrNkU4XkN6e2RWYDQqKmNNeyRNY2ttMUxlek1WZzxacUxWe0I3Rj5sMURhcGtqd212dn4tSG0hCitKaD9yb2wxTll5Z1BZPGMzemR1Jjl8cFotPno1bmxyWn1KOzVfdyQrRTVOVj8hcE9oVFM/K2RvRTt3YEsraSt0bjdHQ2hNNG5TVG5WST1LCis8RVh4bV5yU18xcU1JZDZ0NjQ0ZCZXYl92PlVYI2xmO04zSS10dWUpclRGdiVeaXYrYD09YSMmKm85JDBuVjhEYndLbUpveTs3THAwQ09uCitpbXFHeWoxJXgtKEY9KV8/ZztqJSZIM2spQmopeTFsaEZxclg4dFM1OHJ3UEIralZ7VXFNSlVDKmN4Vn5xSDVUbXUmNXAxdig9UlIqakpXCitrR350LVReWGxHMCYjQnZ0MnBBN3RBaDFzIztnIysyI2o2ckQ/R1IlMjI+en1DTGN5RWtQTjJIc0djI0s8Z0NsK05jdW4zKDlCP2hCJD92Cis/Vlg1OTxzZWQra0RKfDIoVmRjWWZVO1NUYz97NHZ6fSNHOWpRWV9meHtjK0g+IWF3b14mS1dMOXktKXBBTkdOMGpENWdWalRhQl5aa1M0CitoYTY5d05MRCs5KGNuaWs7NnVuMj8kdjd8NXBCMHdtT0dEaSpSUG54VWxFWntaYT8hNDlFMzZWVjN+eF9xX2koQnxraUFMMU9xS0Qpak9zCitNenZ5NmA9UXUqYHNBX0srUj99Q2BsQmFxdDRLSVd9WGV7SFVUWWxtO3lzV3JZMTF6VDZyaCNFaXRgPmg7NkNTc30lPVBYQEtjcyhCUnlFCitfPnhHI3Y5QG9HWiFGalZgYHdeIzNKIXNyTV9ZaEMxS1lLMyhGUCE3QVJofWpQX2QpK1dzVDZ0ZFktODU0RVJMUCheOFkyZVVGZ0kzeUhtCis2b3x2NiRudml8PmgxUkdzVGBkU2E1PlB1ajhVVlgjMyVUN3VHLVgrMWo/PSZgajc+SDxVKks/NCYhdHxsNEgrU1lrVykjUHwwSjd8WmV0CisjUypISFQ+QjV4Rl97ZXM3YigpQC1XbmhYb0lJOUw4PFk9N2xEZzcmX1ZhdUZ8WWlVKkZYZlY9UTNxUFQ2ZjFYbX14dnZ1T0NTMnhDaXtUCitne1MyKT82ZV9RMCNmdT1qQ2JHdk12b0JZaGhPP1V5O0x2SElzSWRmVjMmVVlpdElpeGNTYEpvJkF1fDluSStlbkgpZCRBMjB9PmBILUV1CitRVjlaQD5xQX5VLWlMRz9eO2dte2ZQTFdLZn5uTSQ7PmBUX2sydmJVZl5ETnpoaXpuY3dgMUp5bChJJVkwb1g8VWVFKEY/V1dnI25oZSV2CitFQXQmbWY/eGxmV2Q5dEZBKzRDTjY5TygwMio1dTNhX0lBaGNidU9MaU1IUClNJjM0eWA2VDhQV1cjKT1XXlJyS3MmbiQyeU1EbSlxLTczCit+cF8pUno7KDdwRnZSOSZxXndKIXI9biNiOCpveyokeG9LZXJtWU5wcVF4QiF8bXdxO056MkVfQHtufTAqcEAhUy1lY0JiZmBpZzthNC07Cis+eUMpWUQkOUsoY3g3Y2okKTJfQGlxJXtGK2Y+ZXwmJnczb0ZqWDZ6P31haWJwTHsmQDFTbVZPaypXRDJZTyl4K2EpPSYtKnkzTGNqc1VPCit5MTslb3omZHJjfkZeV28+QUlVOH5Xd3QtRnVWPT14bSF3SUlAeGAwP3Vwe09rP0NDQmI4KFZ7JGhzZTE+KHB2c0hhODZZKilodFk0cD05CitRandAKmV1aD5iPSskV0ZWVjx4U1VlKFkxOXk5MV9aQWh4elZzSiRUdE1pKiRZSy1PV0g/I0dnV3wpZldiTGplYzM4Ulp4KVo3dDx+Oz9qCitHUjNHcG9zYVZneHBaJF4kVDUoT3shO1oxP0Nmdz88R09WOGZFKW5vZ21EeWhHLWR8YEgmfmtFbVMjWTcoU0NnajNEcTlFT3BnVE85d2xVCitKZlBXciN5U1gxJVdWKiFaTHpMSzJUSnt0OUZZWClpKHtIWSs5Rk9SWnJGSiVnSCVDPE0mQXEwPzRIeXZyMitwUU1KSS13fCowfWRmKm42CisqQFpNMyY8JHNzUE5ncXdJYzx6Sl81RipOZFZmOXgwLUNISHQjb0U/R2w8JDJPZkxWPGZpKGhAJnxYU3t9TlRZSFdFPXxZX1EhUHBgKVZzCispM0VKYFBxT0NGNDlPUFd9Z1NxcDNGYUlUXj8/YWVuc0U7N3g1eW8lbzUhKnAje1p2eUFBdEg9Rj8kWXVpKXp7fkJkQjElPkdXWE1lYylGCitzKj87VWBgKTwoPG5WMSFOMTY7YTAqLWtNUCRPaEJON31mUU4tIVp0Rjw9YHhuR2NZV0k/SGZRfGxoLWs7dlRCbFdseSopcFg5LSRYISFBCit0TH16R0A0Qyt9NFZNWUl3fEBjPWA5I3F0NkAzNCFUVVlsTEcrSW5ESilWPCR2VW8hZztiIUd5TGhOUyNjPVVMdEBiVVZLMSotZCNMWUAqCitRQ0NIezMwSnB+aztTfF8/V1BYQkBJY1gpZWBKQlV5bz10dmx3UX5rUElnX3hie1FwVWg9KHkqcihmb2EwQktBciFIbyR2QmRnWFkpaktVCitsZTh4OWBLJVFiWDc3eCtRTk1rNTxaaipmM2UxcygzRnhCMzIya09RK0hUPVhMUykmQnJjTzlLUUgwMDAwODBQfmQ9TXskcG41SEpTLTA4Cis8PFEwMkJaSzBCfnQ9RkpvX1FaRERSP2IxIVVaYjk2M25kQ2doZll2ZVclZjhXMUNxeSpibnVqekFPYF9QbT87SkI4eSgxIy1rI254X28oCitPTiE5UE98QGZYWV5yUHtAN2YmOU1saDRUYmRjb2pER1ZXV3Z9RnNQYGQ5LXIjUGpnS0RKVUIhdFMqY28jRTdkWiNJNWgkaXR5LTR4N3kkCitgUCNaST1vND0kc1JDcEJjJVhgRip7UEUyNSFwU3t5cCtjeVlwT3RjP0xHJEB7ITtTUilVd2ZtPG84K3xSb3swd18oX0BAKl5UTXpyczZNCit3XmhUOzlHdU5eKU57WEU5a0F7ezsoN2hlaklyKT43a0w8djJrViltX1pfWlR0RnZ3RTtZbWp1P1h2Mml+aSt9QkUjZ0R1KDB+dSV7ZGhICitJfShBcDk2aWRHfENWTGtrJHdXaHFQNFo5YjdrbiNNJHhkPH07I2dBKU5LOHkmO1Y8bHJoOU44bk1aajJ0Mz9Bbn1JPEs0JCp2JSE3Z2l0CitORyQ2YDxRa0pDOyh+dXA/fTMyNHRtUlQ5YzJVbnM8S2NmM3ZGJWYjPjRsIXV9ISE9fWpaOF5QUj8zT1ZMJVowMTA7S1ZxO21uZT5HdT42Cis5TjNkUzJ1KV81X1d6SXZVc0N3USRLTnshNktOSDNPMXNNbVBKTHVoNkxGWUpKTTs4Mn02TmBranF4ZDFOclA3YlFkT2MyWD8zdmE8Mz5+CitCdT4kYT8qWl8yUXlXVEMmQlo8XkFEQjlUYVVWV0JLNl4odmt1QTd5PGdBPF5jfjxuP1c0PXcjMml1MnhyOWxeQEZUKGVucUZgMCF3PjlsCisyQGt6RWEkPkh4LWNCVyRCdHQ1fTtTJjJObUw+bWNGWWdFVDQxWWppVmd4VEZOcD9OJkB6KHU9clA3MmF7QUNWTWRhSnM9K2xEJFJxJlN+CitEWU14eVdecWpgfTJ1OXxiRmQwX3VCbmd7NndhUXVhcnB3UWN0NmkhSllPRDVpMSEhKV93eVAkb2xtRmJ3XiVAWipYJSNhN0Ikd0EwX0NTCitWb0Y/M215clh7NTJDUExmRUxTSmx5cih7P0VxdnRqd2N7M3UrYF8rWjs8dTRjQXJ2cjg1eHpKSzVUWHY3SSlyUn5nc3g0fGZJNyVzYm9eCit1fT5CLT9FJEFSPXFwVSh1LVQwcjRlRiR0R004aGZlOUFnaWEmODdUUCRoaGk3U202dj4/Qm9nMjxkKUVOdFdqKUZkTCYyWVY8d25yTWdMCitVY2cxUG07SXxOUChCZ1AzUnBVLVVvTml9RW1QcGVrJVpBYGZkeGRGU2l+PitYcCF0S1krK316UUF4UChZRWU8WXpqU1o9MVlhTH51P2ZwCit7TkAmenNxeTN8VEYlJjY2dGAqMWghfiRUNTZHJkpLYW8/Jk1DeWoqUXM8akl0LXk5Vy0oaURnR3RjaVA9NyltSWZpbkA4IUpGamdxNDg8CitUQmpNJENyaTdfYUllNVUteGFNZHU7T05AdD9TaEB5YVFTV1BCT18rdj5Ce3VsR3clVH1WalRMYjJWTG4oN1Y9Kn5JNTtpNkRMMjVJUU1XCitablRZIXFmWFRKYVdJVDs3ellpRyRZJlZsZl5rSk80WTI2JEdFXm5rbSQ8d0hSVG0taU42b1JQQyRER0p0eEpMJkozSD40KDdKVms5TTAmCis9bzBSYFZ9ZG1ueXBDYkVBZiZUeX5jJnswQ2p4ZThUKUNsRkxLeihSbllSPT9tR2BERGt0WERWdyQhcSpzdXNgb0MqKkhqZTFDQz4wRiVtCit6TmE5K1RHPWtZUkR0aG1tTnMyTzQqNiM8KTdkMEckdENuRypQVCszaklSaU1lNipVXypVeSp3RX1MWmlAVk0xbz9fZks3Y2hvMylUZ09KCit2TVUwJHotVnRsdzlhMDlRXzBXYkZ7cGNPfWM+dT9ZUUglfUBPSkh1S0JaeGdYX0ZpJihYciNpdiZKdUVzRjJXYCNQbF8rSFpxaXxhRUwlCit4KnNPc0hOU2YmQiVybDxIcCNHRTxlck0zbTVTUXpfXlYyNzZYP2M5VXlMbzVoSzxgfWRhNFhxZUdhPkYxOVNlaV50RGE/eVd2Tjt9U2JlCitMMSZ7SWB4VkcoRF8/SlBeYnl0RjU5OHBYYl48eFdNeGoqNXw9SyhnP0pjZWtAa29TSWt8K0oqbSVVRUF4VWgrbG8hQ05UJmxNXnt3WjcwCitRQkE4P2txQUV2Y2IxUFdmPS17SShIRH5MeHg+eTJQWW58UzBTYD9TMHJGVWJZJWhvWl8qNSUyUnx7Unl8QURxVVF6KHBhQU9nP1UpVSt8CitmeXlVfiVvT01ZWXdwdUlYN05zRHd7UlUoOzd5NXo8UWUhckA+NVBlJHAtUmN0dERvK3AoUDBlXmU4TDc5SWhqcWNjYj9PcSkkaCUqNmN7CitxSElJI2Fac3NRPXFmVD5FQGo+VlRydzZMZCZUMjNeaDQtQk4xSUt8MEk+WWw1ZnkwfVgwV0dDN3tLIzF8S0I8SG4xX1Zkd2NVSHU3P2JnCitVRyo0UmFZSSRtWWo3Skx1YGI8QHFJeE89fEUlZWBmMz55bDxvTTk7eisrMCs8eXshJUhybUBHOGdiMzIxPkUkfTZTaDx0e09HVCVecXs1Cisyd09Qa2diTSMoPlchM29sRjRfVk4qZ3htKEMoNnlwPD1UUTRjYGFfZStuLURRME1WYmJ0V2B2KGwjWX1sdlZ6Qk8xfjFqJSE2VF4yZiRiCiswQzY5cSZCK05RUkt0UFFZfkZHb0NDcCNVc3dIfDtgbGskVHZXYldqSjtze3I/flNCZWQmNUBeZ1ZVcitpSnZYXjxpPWhjREVNJjc2dUZFCitub2dTUnA+aDh8OCo2dHpYekI8dExCNlh1UihQQ1M3QzJ3PWtofWJqb2lRaGpPQHZhbTZZT3xqRl5rbHpgNTdTT3R8aU9nUWd3WmdJc1UmCit6aVVTSmBDNi0/ZEVJaF9zTGVxN3J2eEhvZEdaaV5IdzUqZWJfKjx0eXE/a3BMSUszPz1oRkVjQF5lY3l8WT1ZaDRhRHVgbnEwXnQ3KkNNCitDQ3lJd3FYeXppLVg7akJ0X0pGPEZnNFowUHEjZ15EQHt4PTB0O0xKQXYwWj5aPTFRWS1PMDA7b3tsQD4/WT4qdGhMMV5AdjM1ZFopZDAwCiswMVJYPmMhTloqNlUxWmUoKldiN2YoMlZgd2dMZDk3R21aYChFJGUpcTIrU19HMD5NPH1yRUM3MV92WEAoV1oocU1NNTBpR2MrNV5ifVFOCitSXn53ZHF3fkkmWT8pXj01QnFNMUsxTEkmY30yOE5NQF5LTVkzJCRtYDFUSUJmUDRtR0s0O0FTdkgxYz9mWSF6IyFJPXxhazJCU2BsUzclCitWTWxYTnc0VGtqMndDJHdlV2FTQHZafDtrSm5uVi1JdyNBQT4rNzU0dkopPWtMNm5qUCQkTVZeUyhVMkpTQmVVNGpSPitfNnptdVRQeHRTCis7c21BYjlgPjdvPm5QSUJwZnxpLSlmM3VOWD5mR2AyaCR+RDZxbiNpLT1CemVjM08ofVNNayVRfUljPXpFYmU3QTQxPEFWKSo+NylHKlQzCitFQHZ0Sz91K2BhM2h2dTdwPnNrfnRRdzk2Rkp2UWF0SDZSQX01Vl9NMVE0KXx5emxqUzdgZHVPdjVgb1I9Z2AyM3tjYEs9dmB2ck56bUdNCitqKXtVUSheZWwyTWlLb2ZvbkRPfEU3SEp9K0xwWHM1eyp0aSNaZm4md1kqMld1YnBRWnNeUjFtPClEZGc/QFNER2NRaG9nWTZuT3IzczgwCittNEZBITNCeDUjZiQ3JXFYN3Y5eSRtNTJ3VVJyc21UaWJQOT5vanpSUkc3P1dvPCZeeWpeS0R2IVZzdExMcWEoT19zJSltREBSYU1iJUVqCismI1J8e15STENNQXVmWGAlbjIkYVkwJlIkYzhWYUE9MmVrX3dLfURSZUVfckxBYzNGZ14zdjk0RyM/QkBTKHJ0MVpsKz59SzJ4PWI5KTc9CitfQ35hdnxuZ3UkWSl+QXxoalZneUNkc2Z6cT14MW0oMHtUUjVBd3AmXjEtV25JTCpDbkZpNShRVmExVGs4JSFaIVRSQjVLNXghfko0KlJxCit8R08mITBQNTFtaUNrZ0c8eFh1Qk5GM0M2QSRaQHdpJDhhc001RmtNaiZSYD1UfWooKzE+VkBFM1hzb3t6aHNNYl9hPHNAemtpUCE+Myh4Cit9VWU5ZjE8VDZ+ZHM2KX05Kjs2Vn49dEore0taKmJjO3I4ZXwoTnVnZERpMGlfcUx6JGdiXm1fNnYrTnh9TncweEpSPzZ0WGNYKlZMRihvCitEM2JHQVdWb1ZQUyRUVy1JQkg5eilRZG9rVEBOcUpAWE9CVikmWiQ/Rm1rZCFxMCY3TVBUQzVAUHhaVSMkNiFXcT5zWWMlUX1gRm1NZ2dECitXP1NBNDUoZl54K3RnJV80S0lzS0dzciEobExzU0k2RWAtQnBXaE15ZCU5MT1WZD1TN1BYXzgzNTZ+UXRYdTQkVG5XPWp2a0VjRkJTWldDCisyc3MpakpWU1NFfUB1RGpxbEVgdEZBTmN9OVFib3pSOTNVTDxHZSZuKmZWVERtSHswTFVve15Ha0wpdmA7byM3Z2dYanpeSlpLcj8reiNECitDJlBYMXV6SyVzLWVvUTNJbDlySXYzWGl0LTlCZTRhIUQ3aiFNRURZLWEtQGBuMzQ7bUl7WT5GX0ZLdHFyTkJSTGc3YDc5bG5BSiQhdiZ0CitMMmF2TmB3KHMkXktEWlZRM0lic09BR2tIcjFQVX10QC1JfDFpfTdqVW5BZ2RDam4pMHlvTnNSezwydyhDaEBKNmwwOzlzN0ooaCN1cTNZCitgfUpDSGN9b3E2bjNkNmNHNj1XQFJNdVEqa0N7ZylBO2Q0ZytLR0BZKiVDTT41UG18Q2tVPEdeWDQyQmBocjBDSkRtUiMtZEwmR3p4bEI0CitSQDxic3VIcE89eU9BRCk7XiFxcyUzd3V0VFQ3NkstNSZOeHBTVT94YlkwUyVnO2U3KShpJTZ3O29DME4zbEVhSHE0P3w4alokJldsfjdjCis7Z3x5SEF0eilCVEhMUigjKT5sU2g9VGRNUVJ0NER1dHg/aGw0eiVFRjxwNU1BdjFKYXRFUGFwSnVvT0h1WkJ0USlXZ0FXZEJ8JlJHb19aCittMXdxI2FkO1k3Tl9OaHJsPFN+ZClkdX1kLSg9YzEoNVY/b0xCaVg0TCpvckdjLUk8e0Q7I3VaMFBXUkFmNE9GSlN2d2BiWC1YYnZ9dk8xCitOemNkdXA8bTtoQFdwSjNJX3xwPE9pMGszcHhzSXUlKXZpWFAqKldGcWQtT0VUdTdCcTZXS193N21vamAoSENpbWI8QT5wRiE0Pl8/VXhkCisoM1ZScm5jfDxDO0lkdClmNGF2Pn5Mb0R6ZiZIYiMtcGZESyU/Xm9nYWN6WnJMVUkrWil+PSkrTikxazFJbGc3TyNtOF9VYS1VOGBCTUNmCitDJXk0aU4qZFhCY191JVg8Y0ZiTkApYUI2PXIwakxrfE93Zk1kQiZhWXd9JV5xI3FAUmI4NCZBTEUqbEpjWiYtUjN0czRtVChrJmpgTFdTCit2M1lOXnQxakRHKUZza2lrMz1UVjY4UkcpVW42R1MoQUBrRlVuc1FSbl9WVGN0QFZKTippYSQyPzApbUxpTUF2VFktSk4jNGB2aU5iVlJuCislKmRHPEY+V1ghWUw7MThPVF9ESHd8SmlwakRLKypmVjw/OE0yP2FqTEBOQzFnai02V2IxUHxxKHQtSGc2JW0yVSF7Sy18N3YtN0hzRUlCCitwQEZyUU96T3w0fjM1MWpxalkrejkpUG16d2NAc3JeeEo5QiZfTG1uVFE5MC03eDUmQHg/dkljRTNyYklhZXU2MHcpTHRoYmtUXnhjfUFCCisocn0yUCloPkA2YVdBSzJtdGV5N0RyTnYmXypFITAwMz9pMDAweUswMDN9bGE0JXpUWkVhejBXT0ZaYlhtNThlYUN5QzAtRVo0QTVQJGJ5CitMQVdSKzZ9SGY0VzhOMHpxYnRAbkw2WXNvRmp6KlNaUGxgPGwycD1RKiNFdmVpbGp1I081MnpEQStvOWE5cTszSiQ3NDI5OTA7WUdNbUxnCitFTntUfSpxJGNiXmlMJWswdyFiSG40YSlIWUU2VEtIUWdQYGR1UTw8ZCUqdz5CbHchTHJzOyZEZWx0dEc/b2p4JGRHalRZdUR0OExiK249CiszYChvOHBzVytMYXgzRWxtNWV0dm0oSHpTdn54N1c5d0VQZG92RjEjYEllb0d9K3FMQ1NnWjZ8MDduN1ZXfXJDWTgpbjY7U0ZpWEZoPzFqCitNcUVETWp2Zjs+ajhsK2g/K3Y1Y29gfFErIUVeWTlyKTw9fFdUeEE8PSt5NihfTCRLfVpnNyFTYkA/SWpMRTtYSXJqUDAyJjNqNjw4NHwmCis9USVJTXU3azxJU0UydSpIVWNCTzRPKWN0O3NKfCVkYUYmeSZ+MHNVR2Y9cWphWVFUaWZDZjZJcDA5MGk+bEMrIylfQWw4RnxDeFI+OS1WCit7PmklOVpjOztsZGZ9SzY2aS1yKj8mQ1RiJGZWZ0pye0lFMFMjR3w3Vlg+Rk1QYyt7fEd4JDUtNmVVO0RFTy1lUypVUllDODx3R31XdSFFCitPbnJoa2IwZCZLZlFaS0pxc2QpSG0kSUUpeiMhSyV3KikoTkklMGZaKkhvYjZ9VD92R2ZhRio+e153S0RxZ2RWb15QWFdsS3dsMzFHNmlwCitxIW9yT1YyeTE+aCh2TjUqX28pTF47RlkzakhSNj84OE1QUG5RO2BFOGgzTWQ+JHJVVndgcnNQbWUxWCVNfTxlVl5QYVo1SUUxRF5gKj88Cis8b1czY2EjcjxRQmcrKzs5cl8/ITFMVWZgQlNtU0RlWGdNOylPa3ZNeDVEPGs8WEw3TH0kSjhyIUZMSXlGSH43VC02P0Y1MD8+OHBSO0tWCisyM1lNXkwpbzMoR21pJHA8eksldjBaZVQmTFFgKmN4WU9hJFBKbnRFU2tgQDlEM3daIU85Rz5rZU09cnlrWU1PWF9KIW9NPzh9SllnMiZ4CitnYyZ1XnRIX3BEVHJ2JEprJXpaY2ttXyRiMC1jN1FmcHNLR2BGMS07Tjg3JVVnVkdGWTs1aUsoPyhBOEROVCQxKlRnN3o+OVFndCQpQTc8CiskSlZBOVFHZzJwcD9LTiYzR3x1ISUkVVJWdkR6NFhVaEUwJFM5e0k1OUQ+Nno5PVJsODxUTj87MnFjNkM7XjdnR0ByKipzVWUoTW9kR2pQCitiUmRpaXo3NzAyJS1gNnVpczIjeXdKdiV1QWAzcSZAUlBTUnlJNm1uXkhRYTxnV21gZzgrdCNUZWx4Yj5XeXhFZFchSThONGBudCVOX3F5CitSUGpYaH1aN2YjUDJyZldBND8/MDZsKlI0NWFuRCZzTTNGKnsxJjErMlhYJlJxMWtiWDBZKCRuRTklXzNlY3NhNDBvcFA5QzZfRmxtfSVpCithSEpIeWJVUzxnOVhPMzlhR2R2IzhJbS1JQCQ8N1dsPFU4NyFhSm45ekBOWDRtdj5BUHwxZEpXdmM0MyZ+WUAybEdXUm1MTTRYU1hqcVF9CitnLVk+emBiODh+OU9nN0UwUiM7N150MG8yTmpPcDk4UH5JckJ8fipUNVZudChfaCVQcF9oK1g5KlEzQjdjNzNEPWF5YjJ0Nk1jPSVAVHF7CitxcVFMe0JzM1Yxa2ltfG44RkYlc3VRKz99JSloX208PXt+OUZYSHAxT285X1JBcjExTTs7Z3lDU1IpY2tWRyR3dFNtcUlodGJze2RONXZ+CitIK1hib0VYM3FMfT1uP0sqcC0rI0tneygwKGskWm5yazxhYUd7dkF7X2hKSWImcGAyJSp4OT1TYWxUalhhe2p7d1otWFdWPXpeNTQyMTNBCitZU3RGQ05SQG9nKz84aUtPXkZjRSl4aFBDdnlYNjc9KlRTdCU2bnN7PEQ3YDdgbiRqLTBCd0o0MFpDd1dJamE4MHRSSlA4fDVXaEJUb3BZCitycX1aZVZkemA2I2chWWpLZF4ob0IpPyV1bUpOSzc+PTJVO1lBUjZ0Wlc9aXBxV2NPJmtDNn1nKGd+JVl7Iz5gQGdfSiFKY3J0MDgjbjM3CisjMyV3aTVKYlAmTWRyRVNyTjNSKyR0KWNFZilRcUJXXkRAUFBXI2lKbl9TeEkza1JSeFVGUE1INFpMWnBKUkVAUiozPWtjI3ZwU003KSZDCis4cUF1bmBfJnI9UHtBKVhjbnxYNk9wVTxicz1+b3tlUHlUTHN2TExWM2wpVXhAYmI/OUFoXmtMOE4lWX5YY0ZiOWloQGFTUzx0THNvJnxPCitSNnBfUHU/VzUpZ0EkVVRJMXlkTUxmbkd6VHhaSVFlVFliJDNBWjBsLUYjZlBAb2hHPGBmVj9jWDJneUhxRzsjaG9kP2NuRU5TbiVCO3coCis2JEhick17cCFoJChAOCpEZVlHVmlDIXNhRF5XY0E/REc0Q3taYD1GSj1oTX5eRUc0O3pYT3drT3N2I0hVelNiKTFCQDQ5QWd5bDU8dn1iCit0YWctZjEtNGchOEN8WGM8NEUrVXg/OHElRmtRKjw0X0hxNTBCTEVtX0Z7bXl9bGxgbUMxaWxPOUtRSDAwMDA4MFB+ZD1OMmBlJEtoT2dKCiswN01HXzAydSVQMEJ+dD1GSm9fUVpERFI/YjEhdm5YPk4wTFZRZyRKYUN3emhaSHdiSjVkUTk4RiQ1T0podThHO2E9dEl5N0R9TyVVUH4jCisqcCh5cV43QXMzV04jMCFrZU1qPHBvYX1PZk1BbTN0QUJ8Pkk4UWxQNVJwJlpgakRjdWNaNTs1VSl2fE5RYGdJZnleajVTezx3Zld0SkoqCitQRWw9Izsjb19TSEAld1hgX3hjIV41aiFYRiRlKFF3NjI5LS07dkd8TyVabj8zQCV1S2Jqc3cxfnA9JShTUzk5Mkh8JWI1cWk3dVkoWG1BCiskZ2NKQEZTfncyN2pxa2xiNE1NflF4Syg2UyVxPFM3Q2d5V0s5IzZCe3tLeXptcCtFRDlUQjR9Pk0wQiFiaD5PPy17RTR1JURtdmwjclleCitqWDJlTXtlK2BTTX5eaDY4Y2FJPnBDWi1vdW4zdSZjZkFqSUo2ZzZZWHVmdipKa1p5V0g9bUJJTTxANmdGWE8+ezF4R2R3SUlCZGg2V3VrCit4I1FsfjUqP2FHQz9wQilwYzBZe29za0B2dFl3MitwOT4+ZTJXUHxFN1J9T348Sz4xa0NCQ0I2P2N0RUVLdmNYeiRSVkNVaVVZWmA2ZTdfCitfSGhfb0w9bzVVPUp3UlhLPEFCMl8kZz1EWCYhZDVsJWFqVDYxYzZibj9kVzk5I2R+biRJT0Z+Wk8wNEpfMnFoZTJkeUJHNDtSODEoT1ZmCit2IV5OPHoySGJQPjVvanhnZW5JeE4zRVFNIVQ7Pm43cFdhUGNnY297d0BqUXp5bk5CbjV3bD5RJFZWYTRmK3I5fHVVY3AzSDsxMjRTWkpvCitlfE4lOGhpekpMJlEtVSlPWT5CKEwxJHY0YCtWcmJnTjMzO2dgZylpYElXcX54VyU1R3MmUTt1UklGJkx2Knk+bSY3c0dKd0JweD1LQTFQCis7ZjxnT1VYZ1g4dUMpS3spVU9oQUp5I0FrN0lpMkZ9Pmg1UjZVa2tgVXMoUW5rdTYrLUF6YiNLV2kwSnl8Z2ItWCM8NTtsYHVeeElIMFJWCitUX3ttdk5aRCtjTH5ITHUtN15fK3FIJS0hPnx9Sjs/dGU8eDBWWj57bm9iUmdJXjJhNmU5a1JXSEkkNFgmV0Bkc0M5YE8paGhgOCskWlomCitDUHBpLTw2cERkU0d8cCZBSF4tTShEa2I8bWAhI0dtX2REYygrYjc7Zm52I2BAJj5VRmQ4dkBEQy1DO0RJZylMU0psVXx1eT5zak93YFJfCis+QXheMyg/WTFQTHtpdHw2VCFnUkI1UDRVS1ZObVd7RXsrMHFreV4mTTA9VktAJWZpPTNrV3czYGhBTGNFPzA7XyFTeT1GfFZQcEdlfWJtCis5RTVLVyZzPTBULV51ZzB7dVlrOFBYSWUweWIqK1FuQE5LZkVMOTU1d3xLXmYmcEY0UnM1UEZEZkg2cWJ0aXd3MXZ0YGd8fntqQGRtamNfCitHc3ZTWG9MOT9rXjdBQXJwUCQlZlIkezZeNWVaNnB6ayQpcU4zTT0rc01gMnZiUH5MVHYqKGB3e0MrTXxFRGBEPyh8VWRlRkVxYUxobHQ/CisoUVI5cl9LJWZeeSs9NSlLJjF3Nl4kQFJhPVUtI0s5OGNgS0IhJmxpUCElb15APXlpQyk7a0d3OXI7d2lfcT1uTzRmVENXYWNVYiReZ21FCitiMHxYUVIwMDBPOF5PWTd5Y3p7cEZHWTl8eDUqK3tsNiN4SkxhQXxOYVZ7ZEozVlF5cXxGTCE4VldvI35SZDhKdzFrSn5tOWZBP1FPeEZ+CitHckVOdmZ5TVlPPVIqfktqbzlELWdCYz9iZjVtTUVLRFN5Vn5OVWlZdVI4SXFEbmVLX2wkOSZETU04UDNPI0dlaTAoNjF8SF5DVVJjdz9ACis2UEo9c2tgczNNcX54T15aZjFsQkZyKCQ2ODJEPXVVflUoSlp5VTdZakZEaXYxb1d2X0ZNdi1fQkg0RnJnTSFWJEpKI00tfEomQGtwekA3Cis1aDg7dipENSpTKjNyb0dkKCU0YWB4STFleH0oQS1Mb2VnbHN5ZjUlfi05dXM4bWJuIzVfdFY8ZCVHdj84SFQqZXI8U31mOF4yKF93MTdXCitJaWJtYW5DP2okJkM1PT57WXImUUNGUDIzTmhSY3dtaSNaNCk+SXpgVD01UTlaRnlUMlNmKyklM2B1aVYhd2Z9SmRYMHxhI1BhOXJHcTJ4Cismd2VJWk0mSWlXSW1oPnpCXz5FPTxQfDNXVCNYTHV+Z3hONnspP2JVbyRIJTlDe2BiP0ReeXxNS0Ezdm9acE1OSV8jNGtvZTt5KG5oKX1lCis4MG45Q1pPYkdnfSltMEE3KG9ASn1lVnpFRk5GYk0pMjleeVVJcFVsYGdPKUdpP0JxM1E9UWwqQD5IY3NtPzB5ZyZ4MD8lQH1HfmRQKSVSCit7S2w0KmJMdkRURXshKE1UZURjMH58YTs3QTQtc1dRJH55ZjZ8aEZOYi04NXokZD8hR3V6ZFJCc0tSQzwtUE8oRmFDb2V4ajh8MCNRSk93CitHa29feC1+RHNJSj5lRWckOXJfa35iMHUqQD8qdTtnITt+RU14S244WGc1c0dmZzRGVGNRfDRAa1d9QlVNQDBxUFl6bndfamgrQDJvT25nCitBaXxrZyRvKEN3P248aGUoI3tzb1VCSWZDWmZZJD1zVURKRjtgaTFQRTY5P3NGIXA5KE1JY3R6ekZwM2hQT1M+UDFqMWY1c311c3pwYXYtCitvalM8d2tPYmc7clVGSDE1Xk07bXxzJnpKbyZBZWRMMFQzMWBEPkt3NjZwP2hIQ0ZKSz9pYXEofUYhYE4pQFp3MlMlYCNxYUNMYyV+JDFACit5fTQ0NDJLeWt5ckh6Q3tleUljMTgjIzI+STVOaDhaMkduNjYmUShHMz81WjhEPElIYVFOeU48Wj9qY05ldGZFSTklZ3x+SH5iXkhqfEB5CitjQEx0Ym9rU0UzVlVZdHlvIVgkdlowZDBJaGZMVWUwZFlTbilNJUpiIy1aYHBSTXhja0RqbnFHTj5na2IoXmc2aHIjQntYTTNMWD5NTT8rCis7dWw7NUVxP1NrUlBKUm09cjt9U1p4RD45S2Y3ZFJIV25DQmtZekZtQzAmfnY3ays8bFRxRlokcXVabmxsM3oyRTNXe3pBMyleODdLZnpTCitoXjtgKDQ5aEAtZVVfXmEqKlNsPl5ITj5CLTFMaVd0fiNhOXZAdmtuLUx+R21uV3F4ei0oPWhJM1pRaVprRXFKYThAVUZOaiFZX3U/QnJ5CithNFQwbFViRF5HfHJXdVlWRF9VYmhVcmh2Z2BTX3xPZ2AlKTs/QUZLUiMxUT47JHl0cytTMD15M15+RnptN3s8M2NDeFpgSTFPVExOYTRFCit+VnJuezJlen5YUUM4YHlHanUxWjFrR3tmcUQxRVo0SlpNY0hNZFcmSzxeMDRLUT1PJDM/T1I9Tm5IQj8hTzhDWUcjJT9+aT0hXiRvfjlOCitgNEVGb2tzUjNLUGZAWURFZTNnPmIyNjwtP0QtQ0t6Rk9sVl9rc29IMTVHUHN2ZyhuO303KUdAb2Iqe3B3VnJlNkYmeCRyK1MzN0Qta3pYCit3cUZIYnotSGNPKGxsYk13eklSVW9XbDU/UjMoX2g2NkpTKVpyPnVNNDVmaTNrVmJGNGUtbEF2bnMlbklVbHM7JHxGOX43dl5ON2RudVlhCiteckpePEJeYTh9SEt6RjBSNE9KWCklRTU8Mno9XnIhQyR0WGNBSHorVDFSYTlrYE1iamRyNGg+JFd6eWVEYm9SWE1TcE5NOEd5JCZnKzI7CitIaS1UaVJoLUpUcmJYd1J4KHpTTU5aeTF2PTA7MnYzYX54VT0qO016I1pEQ0Yjd25NZk9tITVhcXhCNnVkKSsqP05HS1FoT1pkZ0c1ZTtWCithQSF3KDY4aFQ1RG4mfVJ7XjNTbzlYczFnc1hueX1rOUc+ViNmRktOeV5gQlFkdGJKIXBVcztKZy05VCl+MylramR7OE1NR30kIzsjKGokCitadW5GJUFtTVVYUytaLSFweEAqTyNwfi1mYUdxajB1bGV1WE9NU2Z2KHdnK2pmZjtVLXw4Plg7byktTmw+dSpWeWlAWGFfdj4+ZE0oIWlJCitoc2o2eU5JKGF3SSRCaGlKb25jcFdwejFBcFJFUzkyb3Noez9TPyNHcHNtaSYpe1JpJVlsWDxqSlEyYCN+N3BhPlVqQEdjMDd3M0xJd3hLCitwQXxPYSttJGBnX1h+SitlNX5zQyNuayM/cng5dz1VaVFUSkc2QV9MWVBsb0JqVWIyZSRTVHNfZHE3RHdYSUYwT0NnOVRDZVNsKDlzS01sCis4RlF7Vmo4SzcyKUdvZyhaYUcyKjxjYHg+P2l2cHA0RUJMLWFoO3UjRj1QISp5QHAzenduWXdAM1BOOCgqc0lLen5lS2VaKHUzUDklKig7CitWSWprbSY/Pnd8XjUxMEktJkhNSyg/cH0zOUIqIT8we3gtaHE5dXdIUEJIaldlMHI2c1JrUk1La0Y0fi1wVXVUTjVOdjZpQ2pTJVRwKVRNCit4RlJlO3QhUzlLfGBzTzlAJWdVVjFuQCRKU0tQYXAydVNLNDkhOD0yJnJPJiNkWkNVMUpBR3lIMldpQiNleiZwa1klMHtxIUp8P24jNXVGCis7Z3VDUjBOZkZIKGklTyU7cEhqcTh3WmpfZFNibGQ+a2doRXslNk1ZcGhsNFZTYDRYWHBCSnxDTDVie1o1fkx4dElKTjluTEBAYzxxdDQ1CitrY1MmMXlqPmt7cV9PUzgkNkEqN1d8fVFFdnpfdHImVE96N0hDUGtnQjlDe049U1ZKLUE3fT9oRygrWWMrMilENl5vJCg7N1MjbVdAWm5lCitAU25BKUJjSmUzWXRfcEU9NWNiIz9JQyN2RUxaUVglLVk/PD8oeGI+e2MmPyhkZUxOSDstdXBHO3oodVYtLTleLWhhZSNsVDg4K351WnFTCis1dTVkUF9DNH5UNUA7YEs1JUgqWl5gP0x9UlRtIzA2cGB6OyF+cmdFU340RTVKblV5WlNDYiV6PlRqZkhBP25QJkxPVEBLcjh3YHUpJT9XCitUQUNRQjFxZEUrNHZYbWVCY2RjMFJhO08yWFhHcDY/LVhlZnZIeUJEYHx3V1E0PWxnbHdqX2hZaW5wWFNHPnhydX1OWEByS15zZjBqPl9tCistZVFAMV9nMmdZNSRiNDBoJjYlJnVNR19YYEI4LVpDZEczWkFie19pRHsmdmFafipXYzV+Qz5vJEgzSFR5ZnhGNDtiPk1QVm8tfEpTWTRRCitQKWg+QDZhV0FLMm10ZXk3RHMjanR6KG8wMDAycjIwMDAmTTAwM31sYTQlelRaRSNfOUZKRTcyWmZTSTFVb0xRWWx+ISRVK2Nwc1h1M3ZGCitiUHt7NWFJWk9KczM+blpaP1R7Z2BpPTsoMTZhaG52bHViaz8xKExFV1VfWDlHUW5JOHQ/JENVMk1EcCU8X3djIXdJRjReXm1GSGtyKUIrCitRRSZiMHZ7bkA9dCtlNSZuQU4hWnxsUHxeVUU0OWJHcVQ8TFloZ3QxeUlEKGpCWUlGNiVTdDJHZGtTR0xsZTVEQEU5WCR5Mj1SOGQoQCFnCitfKWlZPWtveU1VOHxxP1UkKWQ2enI2dU92IzJ6cmdVbj14N0x7RC16PjNwJClte1hgYUE7c15ZVnBTRWA/bUNuVWM5IXcmRn09X0smYmJPCispRXBYLUgzbjdjeG1DdmkrfDhzPjdHc0pMI0VheHdXKEEyTERRWHNqZk47R1cxMVV0QFliRWl6PVp+ZWVLU3Qja2cyX1VvdEh5WkZWZ08kCitxOW5+SFQ9Y2ZES0Uzfippc1d7eV55M3FpUz1mIURoITkjNyRifTJ8Pko3eUVLKmJZP2NnayoyOEUhfmZYRWEtSnc/XkVOTDdaNGNrYUY9CitQNz9SWUE0RyVqSUZTI1o3UEFnSWc9R01sdExNJXg2eGIhQ1B1NGIzPnlJYSh+TjJmJlloP1h8SUNQTDs0ZSFHQ3QqI3VzVjFBS2lTKER+CisyMDt2RnZudTRxMytfN15TOFVZMGxrVnBPRnc5YFZCUEFwX1JzYkprYlhQOzIhRmswKzRxKi02STFNbjJIJW9fU0JmeX5ZfTt5WFRONiUrCis5R3B4LSV2RGNUczlFVm15YzgrbDxWKEdkJj0pYF9taT9nOU1XQG8rLXZoJk5ATGdyWWNLRiR8ZGUxSE80IW9oVEM3SGFQcFU0Pmp9bDV2Cit6dF5sQytgcm9vdEdVfk1yTU5ZU2l+fVpAc1QxRkolPSUxdFZfflpEbF9mYDdxI1g2aHo/ekx7NFQrRllzQENqUFY/PS1oUXQtaCVxQ3I2Cit0JnlsbGteZSFuUX45eD1qXkwqOE1QVTlmclA3P2lAaTl+WlJJbSFaZUV4WCs0dylibTNwb3xWVkwqMShfWWYlbDRSQGVDN2pXY1V4NjBDCitqNyhgR3FHcVM4UGh4ZklxVT5Sb1pLckckfCE/Sld9WTVXWXNIPyUtYnF2JT4+U35aZ0o2V3xxVHg1NVJad1NrdiNgVS0hfS1raDlfQCZDCiteIUBiVj9SZDN2JDRJbyV6R25FRGxIPFVTZ0lVMXhPdlotU35qTmVyTSs4bExofWFSWDh6XnJ8Uy03SVNXMDI+RUViMnYqalg9NnBJYDNjCitJUW50fEx2JHh9O089NGIhcUppcz4oQnVhQkBEWE87MXBzJFpYLXlnZk5OMy0mKmAkN2s1KEAlezVrWDBCaG1IWGotcnUqITN3WlRjQkhnCitYaXpCeyZ3Qm84fkRwbDBoMkglbjNidnUxe188R3QrMkckdXY5Pnx2fkhwfipIbURVZzg2TW9SSmRGNTVWWWVUWktESGhYTXUxRmotWE5tCitxbU5hTzJudVBKJSpreTJhZWpTMHplez43JFFlR1lHTn4lTF5vVVF+WUVFdTA9ZDxnNztOUCVuSDlJb3EwI2doaEFaWGBFWiMmQV9JNXBQCitvPyFAcGNFMDhlbXRtQm8tczBOKHxuTz5eaHl9eX1WJkhnK0dFN2x3b0NpSUdEa0ZjbzwkdShVRlRWcWtGVCtxaENtT0JXNURjRFhHdn5LCitwMyYjP2wlYUd8QmJJTmJXZz5hSkE8PEdMSHVAWlI3VitJQTRIPSFVflg4fHVTQWQ1REZGIWU4K2VqQTJmTll5REhWRk9Ccm9ffDYoKmdlCis/K3YydEUjaFlRdSokcXB2KzA5QzwzZEZheVQ/M1V7ST9KUzBzTEk8TVdPWk5rTHghVl8mXkQhZzJ5KEZUaGRkeFdDZEJWQlNvQD4qPWVWCitQWGdAVSgtNkU9OElvfUJkPCVFSE1mKmVPVCF5Qm5jeTUrYUoxKVl4ND9KNlR1VH0/JlhOPkQ9SFUla2Q5QkVOJlNZS3tzbjU5T2RNelg+CitFdlVnP3F8Kl8mKEs7PHU3T293WV8zN0w1MmtlJCUwOFFJVWdaMXVmNjVMTWlBMHtyUWB0OzVEUCV3T3c0Yl42cFR3bmN1YFFpMytHOUhICisqYSEmUGJxUXxQSE1INEJsKGJ9M21eNTh1Pmh+Kikze2JtQTJBdlQmRmhpKUQ5Q01gR1JDOGVqSFlsdkkzNnFASkJ7bFFWPGJPTFcxSHV1CitiPSpreTN5OWVxdXhVTHZJb1B3dlA1JjkodnU7alF0b2A5ZH45RDRrV3Yhbkhtdmc7cHt3cWh7X3kkTmFSPmhVJG99dCNMZFojYmA3aFY/CitwWmtXKmBrMDdkVnZfQkp0TGQqT0ZwKHlHQEJyZUh7RzxQKWg+QDZhV0FLMm10ZXk3RHN9anJJJD89MDAxfnowMDA7TzAwM31sYTQlelRaCitFI185Rkp4KEJiWXBMQldAJT9HYUN6LUtZamZNa2s+Qit6Q1FAN2taNXB3Q0FOSGIoRjIkODduPDwmbmsraSpBR1EkRmFBJkNfVFp+OyZmCis/PClXT3hfY2ZOMDBXWTt5P2VWIVAlZXVFV19vKTEtOH5KU3U8PGc/ODJzfj9wUkJobW5YYFAhKzA4YXpDTlliVyNVaExzdUFqdjdhTiExCitfcE5vJWRsPzBvSmNhQmIyJUdXNztAcC1APSFoRmZySlk5dVo3QUNSRmBaPER6PWw1WCUmekMmcVlAVmNTPUp8SUlVSyhVRC0lbk8rRkFyCit5NzZ5e3JjRGlePSFETUc+ZEE+N1JxX1F3NnJKdnhDbz1ZVlAmRXx4aWFeWGs9flUlcSt1YFcyZ1AqfmMqVXdydTQ2NnN9Iz9qVXFQMEYmCitQezNqSG1aSjVSLTItZihVYnlAZVhhaGdMP3wrQFlqbjI3S0ItemhPPHIxZmdaNGpFU2N3a0Z7ZylOaikoX3x6Z2g3KDJqbEAxQkpSYW93CislKC1jQm9wSjE5PzIkV2JJeT90eFA4RUtrJFEyPzFFaWclT3VxRFRCRF48Qz9tNktqXzdeOTQ9KT4qeG50TGU9VzlHck87Qm0rXlNeXzVtCitwamlUeENtezh5R3ohXko/N0lwVEFZX35NSSFTWmpjNm5uUnkkczxPZG49QVlWdnJncDEzV2g0Tlh2azU0MWpsZW0/MURBJVglfTVMTGEjCitjRENBeGs8OSM1I3JaRnI3SyYwcXROLU9HUll3bX5oKENASF5HfFkxek9NeCYxNFE3QXI1NHUwSFFUSzJDOCtPcWpvbkxrUD8/PGVBYjtVCitrKWhye2sqLTB6THByfmRkSTh9e0NJaFprJm8mQnBLZ0JSMENlOUsoPWFoeEdeTlMwNjY9Z1NQKzxDLSZkcFQ9amJ3Q1Y9WnBfUCNlZmUrCitPVD8tfWtUajt+IWFmYUtTRzc8M1ZwVTApWmN9IThQbEI+PHp8al5iVVlqRiNFcDh1S0x+WXVYXm5BZEkoZUR7IVE8Xi1AVUBzRlojcFlgCitJeTBqXlh0Sz1fdW40PzNPciZMLVNeJE14Y0NxZWdFe0tQciszfSk9byhmViFscChhdUV1fm55QnVEPlhJSXhGTGlXUTVfSTElNmNNPEIlCitARVE7dWJ6b2pee0h9LTQwTipiQkowSkoyMlJJJVU5dU1KYmhZZm1mdWxqRiRnWXpDdnl+Z29DdkxPdW9GcD84R3RVSyhGYUx3eHZWKm0jCis4VkpMdEVEMSlBV05mZHw0aHphNCk4XlhAdGNNMHhnbkZIPzhKV1c8P0ktUEl3UDBGV0o3T3FleEtgRjglMCMlJWY/PypAU3pBe2ZzNVlZCismJWd9Uj98XihvdXhvQjRMbHZtPiNAOFZ0bnJwMnE9KmtzMjkzOT5FXndrJDE9Y15Bc2ZkWFljNSFlfU9FeD84RHlBMElHfCZEdlk/KGB1CituWi1AXyhpaXtRdVI8S1Rqdm18SmRyX2ZQVll2PXFUV0djSkQ9REZhX08/YjA9JGA5eD1GOTBIbEVFdURza3whYjVyJSZQajxAVmtCT3Y3CitsSWwyPXRVZGVPVmNFRVNfMnMxM0NQTXUoZ0w2eUpVd080KGlWSGhCKXBVWjMxYz0rSH5mZ0s5QCtXJUNpY2wlIURxbFNqREB+Ukk8aDI9Cit3KWoyZUs3Y0lARmxlUyY0PE9+flJeVWo0UjVLK0pyflo9cmNVU3pMTUBSaDg9ail2SD0/VSNYJXRQdUo8RDNacFp4e09wTn0lUClheGVDCit8Yy1qR15hJF5XPkBFKWoxUHhXbWMhQ1d2WTUrcG01MUlpTyY0QmFKcTduXnNkYmF3I3VFaHxzM0d2aDtpN2JnI35UdE8wRkVOc0VFelEhCiskbW9FWFN3eXN8QERhfH5pRG0lUCR3ZG9mYWtGTDtYZilubHoxIXNnV3lCNz8+QFVOb1I4PHQ0cDhCM2E/IVZxLUdtQCMyUmNlcWVzJldmCit7NjB3OTZeX2pURkJtbjs3QU9gaGhjN0c2QGpeOGhJRmpFPjN0NHpHZFdzKGRfI0lHSWA1djZYeEQ1O3dhU3tmRGltWUFEfV9GaHprVj92Cis2TXpOSiViPHUkYiV0Qyk/cEYyNjZweyg+aihoQklzaG40Q0FJOzs7NkhDZFNPejI7Q09uYHNfQSpKNzQ4RGl7bDk1Vk1ENVJHSXpZY2U0Cis8OG95SjIwK3NVe0UoT1BYZTs4MW8oRlIhYWFhYmZEfXNvfWdGTz5HMiUwdmptbXxBITY8SThrQz9IPm1qXkVFV1VMPnwhajE+VjIxczRUCitRRjQhMWloezI9X3BvND9Oa1pOKiNlQjR6Q2xUUXl4QHg2NGJQO19DKVFLNkMzMTwlOHJ1Y2xLYzxJJWpzPyljVkZJcFBtVUdReDR+Z0FHCit+QUhjPHxQQHRKR3gkQ1ZnNDFnQDk/aiVjbkpGR3dzR0xefkRFPWZKQnRAMzBLMWlMezlNQk4rNT4jWjlaQlhQfH0lOUxmclg9LWRMUDZFCitmIWJ5bE5RR00+eWg5OCllWmM2UyFqI3swYnpsdnMzTnhEI25qZEY1NEUlTGFWdUo1NFJ8MyktKHVraFl8MzlPPk08KUcmZ31nMSFGcFIlCitZKX08Z0N5b25KaGV+eEgmY0gqT2tGNElyIXYoKDwhaExGMnV1RDZYa04zZ2heMiNHcm9xMUFxbXBHK1RzemRUQjdsRHoqNTlmO0N+ZylDCis2JFghSUZKQ3Q/dk5ZfnJQfll+YzY5SUt7MTlWbFA9LUYzazZoWmoqRClsPyVOTStFVzdWdnVydmQ7fndJTFlpTVpicTUoY1B1UFM1d311CitvRStCfT1UNGJBOE1fVzt5WHVnUypKSVkpUWkkMHVSND9neVc8TE9PekpuanQjPDsqKjZ7b1ZRTiYwcDNqejxjfkolKWNpdStOWGN8NlcrCitgPWJHKyQzWn53OD83Typ+RDQ9KS00ZWFAYWNwQzRZZDtjclh1X3V7JkYrMFNsJGUxQ0EhYD1OUXB0dWY+QyM4e15QdyFkU2M7RHlHWUJ5CitGbVVIe0BKcj8wK0BLVDQxYk8/M0RoaEZ8OSg3VEs7QE5rS3UzU0BqbkZnNlpWTy02JWA4fkpQO1h+WkZxJWlVPVVuJTc8VSkwTyExPnxDCitoOFVSNEhCSSomYDByUUl5S1hZRmI7RkFhelp1P2t1fGdwQVhMJkFJb2RZM3FAaGEwXntPRGROcCNRVXFNNU90NT4maX5WdzZ0KFZBbiNaCitHdVM8djktWXZ0QClNKyRJJXpBZytDcS17PXZ0U2NEaykmK1g2cT0tb3RFMXdjMCl6ZEdhNW99OyNLaVQqSCtYdXJ2eklYQ3E7NHhBKyMmCit3UVpgUyQxc1dPelQoPUZoPldlYzVzSVY2X3dsPGA7ZEtDKldxKH15YnpJTztueUVafFZlWSVRWE0mK2teP2MzRnAqT3ctWW8pPzljaEJ9CittZi1lTEkrWH1yeGA3ej1fc1BuYERjPihmYlQ3P3lGJmBwPngrT1kyWDxeYjhBZDg1VU5ZMz4ybmFNKGlIa2tuaDBgcl8mQzckeTNrZ2NuCitVSXwwJGY3RFF2MTB0TUI3a3REYy1eQGx8PWtQNypya1hyNmQ+X3s9c3hHbDZjO2JDdz55U3JtI3c/NWpUX3VOdVFeZUglIVF2RUR6SW5FCitUNXNYQjYjfWROKHNHYnotN2YwQ3pSYXIzU0JYI0xBTHN0IUwjRUpHMVohazhxfkEmNys2O0VAUm19WHohQ3I0dTNSMW1QUC14PUt7PHFnCitRSHdPJHRUVHxMU0NqSGtKb1g4fXY8NGpsU2I3R3w1KWoxT2IoUFVIRn0jJE9CcW5MPm51cGoxeUt1Q1ZwQHZEeHxMdyRPSCRMPDxjbSVLCit8b1NNZ3FZUHEwPj19YVhLNzw0elVSOFJvTUg4MFk8ZXwwcmxPIUpDaUMxNXc8Z3ZeSVklIUFOenZ6bm9YZ2VpIVl2cjZGcUQ3QHAqKT1zCistUj9yfTViZ3VPNih4X3JESihIJGdkPUc9YkdBWT5YelgpQ04obTJgSj9UVkpoYlNYLTZsWkRHTkxoUEJPbm09S29MKiU9dGQpakZAbXo9CisyYC1fOEMzPlNxM3F4a2A0SEt1fnthampLRk95U1ZQY21wc3xpVEpXIXUpV2ZqezxqSnlhZVl3WUZXSjxuVj1sMGdqQnJ9MG4pNTBldWtiCittRWtaVTspMFVNT1NPdjd+aCFuWjlPR08/RDM3JUtqV042bERpenF3WiY8OVpJbkBgUittY0pEeHFNLUdWNzduSThjcUNiRCh8clZiYXh2CitwSGImJiMqWnBPelpgeGQkd0xHYCpUdWcrRn1MSnxiKH1Ab3twQ3A0KlVpRjVSfEx7aUkkJip8cUxSVEteOE1AV2Y4M1NVKFZuQXs8Vm19CisyIU9VKVlnMkdqeEZnYk9qREtiUGRYKVc9JlJrdXE7cSQxSSg9MzcpMjd0PWN3VnB6U2I5XlZrPlFlRy1oNXVZdW5STUFudnUxPXVENlQ1CitkJW9ZdW59dX08eExQZWZVIWJ0OHR1bU4hfFJ0ZVZtXygweD98ej1qZjtGTnVDMTR8OXczQ0g5WCpBPXIrJj1ZI2xjT0VJMT1hS2kpK1E9CitYUjdabmRrJVdhKHdKVlpYeSM3JWZOOWJsTVVjc3ZlUHEhUSpvKkVUQ3RUJiNCaHB4N2k9ZyMze2U0MmIzQSZEPmtieipEdFVASkRwWH5iCitYISVYcFJqV0B2THhLJVJKQXlQJi01dGxaQ1lmcTI9NiN8aWxWbzdsUXZEZyEkZUp7emhTdnE7STNeY1BXaklCPUteU25ZPW08KVZAeFJuCis/NUhBREVKbkZsMCl3Y2tFfUB3ZUdfaEY2b0x4VTJ1OVFRKVkpWGN3KiokKjlXblkpLUpQX3B8ZVRYYWtBZkRFZTgrMHBQPTFJMFd3Xl9ICitjO0xFQk9gaiUydnQ2SnUmKVZCKVpSfUJ4TVFzNWNxc3hMOG9RPHtPQE8rNTE8MTsrans7bkByOE5AdXRWZXE5LWZudzhXbFFCYH5jZ3F+CitlTUZKfmJwQzBvK3p3XlpNUTdfdSpBR1J9PklnbEJPfV48ITxaNi05dE5FKHhVK2ItbXNNKSQ7WkopSiEmQDtSJUo5aTN2NGtYRWxKdmE8CitRTHNZRV9GV3MldHl9Q0JGMF4wND04Vi1ydE9Xb0w9PEwkNT5ETWhyWH1kRyg3KzNPXz1obCNKX1dQbHhJKnRpKkBSJXJUVVR6K3xacjApCitOTWVsekAlPjJQZkZYOWxONnN0dElrfkNNeTw2IyRWMXN3a3JiUUxTVUl2YDxCantCKXZhTWdMPXY1PEJEYmUrQ2ZIUXR5eT52LTh1Qlk7Citle2ZOPygya3NNRShUWHlhclYhfCVobjtLMl9sTHs8ZT83Q0FKbyslbHJXNnw7bHQwKDhRQ3tWNWYjcDdicWRAZjA9cUxrMUh4MldmaFchCit2OVpfYyRJNl8/TVM8TXFSVTg9b218RT4rWlUyc0M4OD80P0x3dEdwTD04an5ebWdFNF8+cGc3MllmdEphNFpoO2Q2Tkx6YG1RZlRHVWJSCit7bSMweXpvdy1OSTA5dXJ8fG8xOV9hX2Y5Yl45ZXdlczAzPFAlUD15JEVzR3JjemtTfTF3VkdJeCRKY2EmOyhMR0kpeWgzIW0paE9zNyohCitjWUc+NUVWdHtPfHZUb1Y0d3k1TDNgITV3d0Q/LTJldCpoNl8qbUJMcigwQ3pYQTNfM15ZMmMwbXhVaitEJXo+cXAjNkVvb2w+V35AM0lHCit4Z2lrTmdlRDdnU2JpKkxGak56NnlzajErNk0rWmtveGdkNm0hNT87JENwZUhicW9HJHw2LWZjIURZeWxmRlJPaXBmSDB0N3FHTXN6KjNhCit3YG5eVGBqckx3REtlfjRXZTFzdDZFQChGcHE+RnBNO0gtVDQtZzd+MTw/amk+I1VWOUR2fX1ZSzFEM1ZqNHpRMUZ8JCExPSZANTheO19tCis5O2J+eyhFPygtdVMyOXp4KGE+SGpDckNQMkt5fFlNaTB7UChnYWpGe3BMSk05WnlaM3pjRWA2aUtxeHk9bHNzU3QkI1o7PkJ9UUI1dm1fCiswJHNlNHtkXn1jYXRWRzMxN0loVWhtSGlZIyVySzw+RUR7Pl90SU9TbHBJaU9SfnBnY2FlPH1fNmJYcWxFYmVxRktzZzZRekQ9KUAzUDYoCitDbG5SP0MxWHZsYylQVCQoTV87fVBOZVkyczheYGUoVUJ5JFJgcldzcm4mRGN8YHI8ekE0bmxfeVVWKShPNmJrZzloM20xX1pAN3MwcGFjCityTkxPP2Z2dkYrYVdtNjBZISF6Uz5RVHB2Uk4jfStpM2l1dFNCKFhHOVF2P2U1KCMkSTF1RzBkRDxiRTdgVXR9bCRGUFVaVFd8I20keCFWCitZdno9dG5qNH1RKT9pYmh1bzhka2R8ZE1aVXcpTURIPl57QkExMGZ1ZzhYY2dIJT4+Q1d0d2M9ZDdibiF6KlclQGV5eG8kQX5ZPGxRQ1JBCisoeXg0PVN4TUR8aWtZaG0kZCVtZGFIUmUxWjM3QnpkUDJpN3NWLVBxN1g0MXlkYHk+b3hvUVRXJiVQPFBHcSRrKyN1JT5xZ3FwZjgmcypOCis3KXZRTUg2RSFRVFRMVkVGKGRzJTMpMnhOWmVwP0VRK3ltWHo0aWI1YGV3KjtLbkwpOEt+elQ8cE5ATXdNN0wwUGJPYStaKXRkNWpaRnlRCis3eXpVQUstRyY2cE8rPDgzfDMkTS1USE5JVy1kRWl7blpXSHh4ZU4qYiFfSiUkJFRDPU92fmpHe2hwaSQ2Tk10MTtyN010NGBTN3dwKFFaCitYUHw0Y3VlbiojZzNaVTNfSVNlJXliNFBzanRuR2EwZWx2QGZ2diVDQ01IMGwlYig2Zk8rMGp4bEA8dTJYUjk3bWw2Z3w9WXBrNkJYfUU1CitaY2t+dVJLQy1qLUNaSW4zN0NzKnhOJV5EKytDTl5UV193TkRiQDw+eW8weWpyZy1yP0VuQz08UipeckdLVDhiVGcoZi1XRW9ANWBvKkE9CitZanhASEpLeWNUJShZanx4PztPUygrN0dePUNMI19GVlN2cXNwPkxqVDRPNVBRSjhZWTVTZTdTaXV9K1pDWCRqen55cGFYY3lYMWwyXlJ5CiskUTY8SC17SGpOIWJLUFRVOGZ3b1NROE8tMDMofGpPajxZbn5NV0V8K3UzT2MmMTxBVX1LN1RJczZCJExscmdXdFNga01gbmdJOURyX15zCitISXghfmo8blk4NCNeKlcqIWR5bDw5fkU/RTNUV2lYeD5kSkY3V0lUUDs+K3MwQm1LKCZ5dzdrZkQmUD5ealk3NnIzMGdvYXkrZXZ3TlEkCitwe2Q/ITd8P093dHkkZVR0LU0yJnIrfSpVWiYyI1hpVHxmcGVRMzkpSFA2SysyWWw0XlgjO0c/MjhRb089cHl7emQtWis3NihzSWJXbS12CitmMVQ3OHNnRShXRWlKVU4rNVJTbz91QDg1clE9b1l1X0o/SVZLRDZJU2t8Q2ckMH59KTd1OXB5WWFFME9paD9hRWxzfl8qX0VQd1N3RGUoCit2M3Y5YlVuJEF+d1FPfmcxKmRmUWpnSEZaSnZRcmJmSE1TUSYzWnZxOUtNNSQzKkZXOzFBbkA5K3diWT9HXiFmbDgrPjQoOCl1Z1UyaWpSCitQT1lmYEJkT1I2PGJCSWNoZHNyWHYxKjZaMHdRZD4jYVlHOHU7PWx+MlVacD0xWkJkMyheUW1ZaDk9QDdXUkpzN256LWh0WEVpZkNWQGllCitGNyFTP0RxOGd8fm9NdD0yd0xpT3JVeSMtPXV2QWR0ayNCejQzJDNed0hiR05IUEd1QmNGe1BMRWdnUWJgXnpVdjY1VlMxfXJed059ZmNmCitWK1VfV3grI04+eEhab1BqMlRFc3t1TzEkP1M0MnA1Q3JtUkdrfEVYaiN4eVVHRmVTKDxreWZNWG00LUhVanxuWVo/VD9zVUlGZlduK09kCitkNWE/JnBzQE5mYDZVUkF4cDt4YzBaIWJeM0d+RXIjWlgwckNlaUZpX08pe2VMMTI5alE2dWp6LVFVXkxDK0dpNFpHOCV6cnEoeyVkbDVECis0dXQjXik5YWU+OD8yXzhZVDl0YjMyXihRY2xveEBFbHQwIz9XTHtLd0QxbmtLO2laIztEIzV9bStzdFNVaGZ3TCVlJldifDU3fjBNZUo4CisjKSlCIyQjbXgze0U8US1tKHB7YE8zMzFkPUs3ayRQc3h2ZFZoSDJ5eT0zZmB3WFZ4Z3kyLUF5SGBxRmtATyVTUHdEajJPS2ktfFMoLSRfCit0fXFsST49TSFibEkrNnhaRkFeJnd3fkA7MTlsN0pIQmVYOEA5KTlmWSRRK2w7YXYoV0gpcXRBNiZhSSVqTHJ0Plh1fHZaYk4ra1o3SkZkCis1R00odz5sdF91U2ZCc1khMih2NUEyRWZyeGR7aHRRQVErdHg9aH5IK3VoZWteQW5iVTZBZTtEWH04dml5T2o1TzdiK3NaX1ZeP19VSDFRCitiKzc8TmZVR3sxMDA/SSYtXntuWDV+dTt+Pz4wa3BZJDJTR2IwZVp1am5nV1VKUn0tYkRrKCFLayluNSk8ckcjJXFxPjRhO2kjLVQ5VGJjCislbl9EcmhLMHVhZzBMeW5xbX1mS3AlVT49VVJUa2NgK3s7PXh4Pl9aJUVTJC1QI1JAc2EmNXFlZWRuUV9lP1hQZyVARCM8V2RaYjdgSmp+Cis+WmgkN1dzRmhxJXlfQHo7dSVJdlI4UllKNUtVNnVQcVNoRDkoNWYmekBwK159bGlhcl9EcnlLZyQ2d1JTcGt9NEkmK3RXIy0yI0xiSmxBCis+aTxTb1VgPylicih7LWBQP3EpcTFJUXRFTkB1OXFzQUx1YGJgKGY+V34hWUhAODlFUDBlWHRQbnlnTzh5Nm10ZUlhYFdOPVRPckF5Vy1JCispSDZvNl5BQ1pVdE8+JCokKHc4emZZczgkUj5nSGVWZ25UbGxJQkszMHtBOyhVezcjV31eQmUrOCQyViU0dkgrKWs3I014PFJlPEpQUCE/CitEKDVtZ3NsTDQ7ZXshQEtzNDZlfEM2K19wVW56Y0xyQFd2N1JAOFQzT2FCS0BPOUtRSDAwMDA4MFB+ZD1OMihmVXlnPml9MDduMS0wMlRsCitNMEJ+dD1GS3VzUldvJmFWVXRlaSVYPj95LUVedjhFRTZVR1JEOTl8KCVncytvJV8tSykldTdrRlB7XzxKJFMqMlVAQzAjbTZhcCMoSmhgCit+STteUHhAYV5tOV5ZISN4Rnolb2lZM1E4YjNyQzJUaVApaD5ANmFXQUsybXRleTdEczRLR0h1fWkwMDhGITAwMHZKMDAzfWxhNCY2ZFdNCit5bn5GS0tSTVdxMi1kZDN7aHBqPjBldXkhUkVrSEF0KUVqPkg0RkBxPyhlPkRFO21OM2xXaGQqViQmUkVZSHtAeXZNYTg4YT5fS3tEPkA8CitBQileK3t9VmtQdigrQ2ZVfC1uVlA9KU9Pa1E9UVlUTnombzJLYlFOMkhFJUBIZFU7KzRzRUxIPiVYJk45N3p1VkNPWFhGI2Q+aTEqTjFYCitDaDghLXdqRGhPPj9gdGU2RWRYJHRZeSYzKzNLaWw4QCNKaXA5WVN4NEIkeig2PmZLMVFNeERpRGlRRVEwTGpnU0BuNFpHRUd3KntlZypRCisqcytxfDFFdEtyfWxIPHFPR2VYbylwSCk9Q0tpeUJxdk9yRDBvdFA4dHRyaG9qNmkqbHA9M2lTRGNtUG1LMHxYUVIwMDBPOF5PWTd5MDAwCiswMDBzc0kyMDAwMDA4VU8kUWFBfE5hWipYT0RWUlVKNFpnVmVSVXVrWT5iWUVYQ2FDcmomUCloPkA2YVdBSzJtdGV5N0R2KUNaJmhSajAwCis1OD0wMDA7TzAwM31sYTQmQ2dXcFpKM1g+Vj9HRkpeTE9XcU1eVWFDeDs/VGFUa1E2bl5KZFNUa0F5WVQlKWRrQEM5SU5+PX0xWkNeVHlFCitDJnZXNiRkbDZuSXUjN3p4VVlPT2FlPz0/ZWM9THpqTUYlUCQrcEtsb3F3QTY7TWp9c2dsWU53JG9ENzI1OXBnMW5zXyVgI21yQi1LVD43CitxfmNYalNaMjZMR2tMMCo+Nm1HZzMlO1koYWp5cjZnNGdjK09Re1ZMO3liKzdUKV8hU0dyKCVZaDM8ZlJGcUFpNyRaNXtDUUdBQzhTJGQ0Cis9ODxlP0o5U3VzUTNiZD9NMjA5MT1ZWEs7LT19YndIPX51VEdRQ2hNU0l3MX4lWEh2MjMkbzhPI2twd1E4c0I8N3JNeGctU2Z5bWxhd049CishOShINWJSdVYqZCFnfWo2c09rRWklZyRgRkZMPUVrJCpCIXp3RHdSWGdAe0khMEs1QjVzPTk/XkcpdD9sKyUmRmt6UTh4IUBPMiExMHJNCitSe213RmMjWD5tI3F3M3d5WHN1YCtEMEg9bWklLVRgWEZZR0xTR3JmKjAlVyhHNW0tJV58cDBEQCpMSkFrOHoqVEdtPl5ve3B7NXFqQT1nCitqNFJzT207d29yM35DUUZGZHVeeV9nWU5mbEQ8bUFSNGY3TCFVIzFpMiFBRz9adTxPTWtmPypCUzNnTCZYNHBnKWUpMHxWJGNTV3NFSXxWCisyZDMhPjQ5bDVlUUZ6TmdINVVgYzFKI3JjRE8/UDBMP2UmYFRLK2JASk5fMEFkUVFyU0tKSU9AMnk0XmU9OCtOTUd3az05Jj80O04yZGM4CitsWmJiSXVGJHFAPUF9Myl8a1dWQCFwQiVQe1dLKil0NilKfHw/fDwmMXV1JDJObSkqbTFiPzNzUiQwbzwtcmQwbk1ob1BlU2xeMUs8JXI+Cit0M2R7Kil1TzBTaXJ3ck16diMhPElCdEhsVjZQbHJuRlJ8ODszaD5APmZQX05ZWHc1X1heKlNAZzQtWkJfKj1IQF5vPkpXTHlGPTUpbVhACitOeUgmWF9oSXp7WVBIKE1wUi1YJmZAT1ZYZE1WaSt8U25KYFVlWjhFcUFkIXNsPzJGN2dAIUR8ND87cSNCc1k0bU9oXmVuZlVKXlMofn5DCitycCVXPHdAZVhEX3FYMUYhYCQ/VmRCaUxJO3FRZGRtbnMyUSMzUi0/dXBCYzQ9SCM8ZmRwXyNZOSY0LU5VJCp9PGBLa2tkPj4ydUcqI3xBCityUD9xfTt4YnRwVWU7fGhfYURyTlRTdGNweGFkd0NCIz84JWJePm1EPnFxUlMoZWBta3lLJTNWVSlTNG8kcWN8ZD9sRGRSM3VtbHUmcDgjCislQkhWPTJRWS1gN0c/RHZac09jYWItfSMpaE95PVk0VStDVT9vfWo8eXlUdkB6enh1dVBHe0w8Rz02KEV0VW83UFJgc0MtQ0lGPEJXN289CitUUnAwVXt0cWJWOzdJZDlqfkA3VWZkb0slXz0rKEV8aFVMeEZ0K1I0Y1RfQj5TRDQmakQ4JkdSfFM4cTJ4OEhQKDFAS2g2OFZaX1NVIV9ICittMV9nfGo+LVpidGQ3OE5SPXZsa0VJJDRuWTM9ez8jdG9vODxYfEomNUkrb1M3PW9JcUBgYkRnKWF0KCNPVm01aWhwVWVZek8xUl8yMCpVCitoV2NtUy1LdntQeSlKck1SNDNmPHVQRkdwOWZ+PWxBVm95P1pvdGhnRW43flA0YEUzKFJrMXBgRURDOFVreTEzdlAzPnFqfXRmY1ghIWgwCit7PWpARnEhOTlLRTVOJmNHNGh+KlU+LXFFYzJeUlBOcFYxSGYzdyFaJHVRamRJQCNFM3tDfFdTQGd1I3tIenNQRigmSDY1MCMydnd3OTZUCit9dGpXYjBsQT9uNlRqfTRWKUJmfVBeKUZDTTB8WFFSMDAwTzheT1k3eVR4cnI3ZkIqbWg2YWZHTDY5NTFKYUF8TmFhJUZLWlV0ZWklWD4/Cit5LUVedjhlanpKMjxBUGh6S28rN3hHLWUzK2UrczwrKiFHUT5aKTs1WHZBQnpaPFg3YGkjXk1CeHkwV25tcU9vJE5rUUNQd01xQD0yWlReCitrY0ZaZWNueD94SEBXTEI2fE8+OHoweykyPFVNcT1URCk1Mj41QU9wWHV9NGE/eksyemRxI1ZoZHxNVSteezEjQF8jMGNpWUlOcEFEXystCitlKjkmWX5+TThPOUtRSDAwMDA4MFB+ZD1OOEg+cXV0cDAyMExDUSUwMjJUSjBCfnQ9RkxHc1pGTEdzWlV1SjErV2lEYGV0czREcitzNV5HCit7U15taTE7dGgyKHdfIXM1QyR9SEhWO1ZiQ0xTYHRhaFZmJnZUbWtHX0t2aXlIdlFsQy1oQ2ZHVHo5Q0AjXlQrKmNrbGEpSXkqYUNkfCpICitJVChBU0hKNHRyRFZ4Ki0pXjc/TFoyRF4pJFhidlJMY1lXNmptZ2peWStEM0dRWmU+JlQ5bjFDZVZxdy1CWH08fCh6c1leWTleSFlxTDtUCitFT1poNCNLNTNEWDVreEJsVDlod0l3dnRDcGMtYGN5PmN8cy04JWVqVzEyZSl2Kk92bDhJUihQQW0jYWo8cUhwallaWGxWaU5TZUsmJkB9CitqOWJrY1U0aCppWk8+JlRIQXhzPEhxVmBZe2xwMlZzdXxZZGhaNWotRipHPmJHI3U2KjYpekw/Y29VKkxTPmZBYXhAU3dCa1JyeXJ1YHd2Cispd0taV3V4eXtFYjwmRTBSP1R5T2A7QH1pe1FIQ2NDcTtRYGsmfFQmaHJvRmE3TTdLWGJ2cTl1QHVSViVZRTBpVS0yTEw2JE95NGxOQkRoCitORWZkIS1AUUEzZT8wLVV7UEY4Jm5TVDJzYH0zY1k2dE1zTT5nd3t0XzQlOXBeNkw4SF44SDdvV0leRUxzUlU/e240bGFlU2BHSkQkdmU4CitPKmt+aTxXMypXfXBwPXE1anlCWTQ0a2swJip9K3lgQCVueShoRFY/LXA5Y2pJSF4mQEtGO1VhR1pQZGY7NXVvPjNOY3ZqUi1CPWI1ZH1oCitBfnkmdzBDTzxwe3xOdms3ME5rSUJEWj5KISl5ciR3YitHKjxRPG8zWUFVSiRjR3hgdTJxbDFSeClkPGI8b0hXamUwQUV3TzN4TGE8WE5CCis3QFYmNmNgdE8rbU0zQnFeRWY1KDFfTWFnMDNCcyVKQnw9NU5rRlVnT294R1IrVyo+PjVFRCFmUF5sOTxFckZZKThmKHduV0U0RkleRWRGCitlV3pkbjtJVSNWVktPKGJJcFJHUnpFM0BDTyhvJDM4eCRtPm8lTFc3fHZFaXNXQzVUdjFqVGB4PmxHVldNQW9NOEEpOG5ieX1DPyM5MzhOCisjNFZ5a1ReQTYxN1lmckZJSFUoK25PZnU4NzQ3eH0hfj5vfG4lKCRARVFVbE90VGo2cTIwTWFia1coSShVRDR2Ni1tJG1wV0NaTW0xXyYrCislelhOQE1iXyY2akBQQFpYdXR2VzY9NkAmKXYxYCNlQmpXV1dmaV5Xe1NHQGhHNC1OPmw4VWdyPTlxQnw1U31+YXVyMEA1Jj47O0k5MnsyCitBdEpDIzJ6emQqejU1cVdBZWAtSzAjI3VIWmc+TSEzfS1VeWNqdHorJSlxI1Vme2BxYipZdnlBTlRZe0lIamFeTy1pXl8/WlNCPV91ZVkoCit6PEB4YTt4UW53LVVtNTxAYFoqSGRqKnh3Mi09dUhiZFVnekwlaSZKXzVNfEdJSnhWKlcwSUQ8SEgoNXdObE1XVXtTenJ4dXJLYmIjTU1lCisjT2ZWbnBkP1JBTmc7Pz5zLVQ1Pzg8eElnMUdNM3F1ekRTWjc5SzVmKlgwPUFHUz1hKUMweUExYDc7cWY/MnJsKHNnSlRJZnZ1YDdxcEBRCittejBWRWIjeFUtQ2M+PVVaOG5+YFBiZm5oUjtANmp1PHsmS0UtTHgyc2FHS3w1M0NAJm1aTm9xUV56OU12b1pCfEdDTERzJDg8KiNjTXd7CitLZnBofFY3PTQzU3QwQE01TS1NP2E0X3o4Ynt1e2E4Z0EqMU1nJl9NMTExJXs4cWE2VkpNTShmbFpLSE55PUJPfittZzw7RlgqJn1uKXpQCis9Y3R8U0pPUDhtQVlWaCU3TTZlZWgmbGt4MUhLNDJ5d1lgMEBZcj82MjA9JmBiIyV5PXU2SHZyajU5aDYxVz5YaERAdW9LKnhreExjaz8yCitYZXskJF8zIWJwUjNwcGNVRW45cGN1KE9aajl1JjFsJmBNZmB2OXRGVVJGcFdxa2hmMEEtbHJ2VVd8K1hNJVdkZUEhVDd9QWtsT1kjOXNmCitWV15Od3FgKzBPSW1nTnJvViZhKzYhUV5RMXc0QHFTKFFaQSZLbDt0b2QxKVlLPnFVZzJ6P05FXiRkS1F9Wn03blRmbXdZM3E3NlpHez1oCitDS2ghU2hOVyVLdDVXeDIhbypaP1U8JGxwUk1oSmsyNndaWD5rQDJtKVIqVzBndVo5OW1uantiQyV6ekczQDx6RWhkUHhtTHtvaHNNLUVaCit8TUpRSlJEVWBqY18tcUdqNXg1JjtjKGBeRnVrbmdJblMoR35uOFhMPDlofjwqU0cjNkkjVlhBanRiaXJ2VUk7cCk7XzBQb2dMTmBtMX1ICisoRG1PUFUrVVRDYCNWN000VlFJJWp1JFg/TnVTWDZnPW14WGQ0e292QiU4JWZ8bE1HJDtSNlk+cjVJVz43JUJxLWpYSGVuRlhVfGwzTHExCitJOFBWPlEoWUVidSQ0R0Fre3dHJWxNOz4xNS1vRlQwYzxrUG0+ZW9+cD1EdkRKZ1MtOGdCNCZFJWRIX3FIWF53TjJgZFZDZ2EmRGtLZEkzCis1LSQpaVpEamQ3TSpSX3JDMTxMVWlTRWd7UEpzKjs4ZT5uKkRSPiFBfEBaJHZMSHhXbWdnbGVJJXdPYHJLNlBfSmEtI0k1NklDK3cxOV96Cis0c05kRSYoTE9jdThyPlNjMGFKTSlwV3YtNlEpKTEjKHdlclBDJDVeYzd5TjNZUzlAVUJyRyE/NytEe3l3NXw5Rmc4YWoqKDhhR3Axe2xLCitDQS1zIVl6YiQpOVpZPStwbGJjdCFRSDMrcU4kZVl3YFUjb1gxbTlOXiU4SmxFVFNzTzxYUVJ9cHVOa04qK0hadGozXkxEcDVDbWR+KmR4CislV0ZkJGtkMnYzNlNxTytSM0pQM2NBZngxekhQdlp+QmQ9N2ZkdVItKV9SM3s3bHNPa3dKc1clVWhQalQpUnZoM3pgblBnTkhkcEI3flc3Cis9THxKdyNQRWolXkImN3tFWX17NlF4UE51V3UpcEpPSytyc0JYQVEzTnYjZG9yQ1JBMHc5MHhQQkpxK0NaR1o0SGolOGp2ViQkaighZ31DCitDOC1QJFBDWTlAUHk9aGlPbmswMDRUMCFwe0s9Z2VmajJjTytNe1Vpbmt0Mnw0WlBaa1dDPjttPm00ZXVXOW15S3VONlQqR0U9V2V8THluCitIOHMoN1BtPUFMeXItTUV4c1dpaiYqd3k4YHo+aFpHfktoVW9SKlBmb3VNfFdiZF5PNiVSQjRrdHtqWVVuLWIwS047UiZGMEIlUlArXjdACisxT2daQF5RaCNoMTNZM1EycS11QTc7O15nb2FFUThgdFIyJTREUng0UWx3ZHF+MjZ0bkEjKl5ocUd+Ozc3YUUqNkhjTU9LI0A7MztAXlE8CituSGxkeGtrIzhkQWxzQ1NmcS1KbHU4ekpRO2JfXnJ0REE8WH58SX12NTM1M2FiMUAhaWhSKVlsTSZgSHIpNDc+enpLZTR6d0E2OzVPUm4hCitURFErVC19NiRvM2N+Mj19aXJoOXRrZV98TG9aSFFebkUlTn4zWm54bVEqNDZFQ0YjIyNidUQoLVFOaCpod0oyQ2ByUzN9IUY1IXVGbUpuCitzTjF8U3x3RmVmUmJEezt0e3k4LThFQmw9cXgmfUl6d3h1ez8xYD9vZSVaKW5Ra1RpXn0lfT5gISFLeypJPWxYWVZKNXAxbT4yTnJZYzUmCitxQm0jUkJiTn1RQ3NDJjNpcnVtfWQ0OV5JeWNqWlFQMCteLUokZzx5Kk1ZalIpYzFHKmRTYXpWR2pjPi0pVCszKnQlajt1XigmSCRrV1hmCitLYS0+a1d6K3dIOzc3O0dae0hKI0JacXUtWlRCJDZFM3kzX140VEt0YXh0UndRX2V8Jm5hTlA0XnVTJGlZNXUkSWdkZjEteVpTazw3WXduCitycXhSMyRVSFlYJVdVMzJhT3JTSHgoKDlRYlJqYkdJWXh8WklHdld7QkhwZzAkdUphVnZ8PFlrZikzbHdqX1BPTXBfZyhvVVVCQExyS2cpCitjVEkrZUBAZnlMXj9KTDBaPn5uZ0VtOThXOTdPQW53YEVtYkRvfkx6czBXeWJsQGB3TTdPPiFjS1Z0aHR2YkE9XjJremNCViZTU05hfVdtCitpZUFsdCs2fmE1TTJhbiRhbDJwcGkpIT1eNn44Tit2ISU+PV9eOFZHQkdoaT4mMntoVHdgV3xtUnswazNXSFNaR2UoSDZiQH4yZSthdCM/CitrdGZWJjlHakVjTnNaeV81LUBNQDZZQztKTDBmfUhqUy1PNjl5bUJjdnVhPWRYTGpPY05YWmZMUW5HNWRBX3NZdzQmVGhvfDNxTWsjeyg1Cis5NjVYSWw7YSFBZ3F9UHFEMWd8bDA0b15XJDFCPnw9b1JEX0YxMiY2MTE0R0hAZ3JFbH4yWDYmPzs3elk1K3ApTFdIekdJUV5YJDcwZHR1Cit+eTcmODxXeFhRVEw9ZyZoSWdMNFkrSUhhbSY+c0B+UTdKaFV8bmkkXitVZnp1RyMxJDhRI0BfNVBCRkdiTktjWHpkNVpofEBvWjBDWFZoCitAb09rYFV5ciFXSjFJP2AtTX0+SCh+PXFTRENDRDBjVj9ZZXVedGtwPjw0XnstK2lWVFpPbVZYIWw+dFRlUG9mS013QD9RRHF1all1WkA/CitKYE85Pj9qP2MzJmF0WEdgSyQxUGJnN3FLSWgtRyNmPDc7MXJeaUBlWCMwRjdRUjEjSXZ1aFAxYW4wOUdPU0VxRCU/cWclaWtIeWUkMWtXCitHJCZAfktzK1FxN00pWkJYIWokZlckXlBGNTBhWG1TPDYmTHNYfllFe3tjYC0wfFhRUjAwME84Xk9ZN3k4WkFAOy16Zms5U2Z+STE3NjFTCitNYUF8TmFhJUZLWmElRkt9WD5OMExWUWckSmFDemxEe2c+T3VhbGgtWUs8fDExbT9OUSZDVGB6M2pOQDhUc3V4PylsZFFQdS01Q2JTPHE8CitzKWZDMkRNPVFSSSZYSileQE5Ya3soejhBYmk8Xmo5MnlSKTtpXlI9Xzx6VEdCOHZFR2Zsbyl0dz5aTShKfmxYNVklXj1AUFp8TkdHK0B4CitFP3ZabVEtK3tARClsU0lefEhWWTNeblRLKUIpaWl+WEF0KmNyVXlmNkMoVjUjcHZSczhkI0hURyMkNEk9Xj9he08ySllxPT8jOCY+cGZKCiszN1NALVFjb3EqM31MRiZiRFAkPVV2JGt0ZH5WekdQWmd7WiR3Kk4pI2IkPFlnVmwpKTd7PF9Kc2E5eHpodUtTOExBSW4oSHpeWnQzfCNvCitgJi10bDkjcVo5YG1TZXkjVVQ7ajNpWitsMUYtWExkJmQrMi12M1ZZUDw5QXYrOzE0R2pYcDJpWkM4JTZUMnFlSTlWPj5ocEM7ZUVkajAmCis1LUBWZ0NTTTdhTXg4K0s4YXd2OXZKeCQ9QlZyJlpsdnphRk5GYUFZZXBoVmQoSHdjb1pNUylAO21hSDRBd294Njw5d3FSK1lLRjBfPms+CitiYD09JkRCQGc2MlBATihGN1NkWG9+IXZSZW5PKkhWalU2dWpaaT5mS1FoaVRJOThsOyhHKlF7N3krKlNSIUR7SSE9T19NalQtVzFQWWVFCitzNnY3c1dTVXpXdXxDeDVkaj5VJXo8JDx1QDs7UkNAPT12fDYmTGhQTUl9K1NUUVF6KCY2dmQmWl9QaT97VHFVPnsoQGZmeUYkQF47cjF0CitFd2p+JHNzT2tNKC1yM3VAS0Q7KWQqblo4fmg5NEVwTiprcSUzeEdRYEEqK0Q7bkxGd35WKmV2empLOSEmXmNOI2pzbStlRzNFJF4/RnZXCitpampSN1g/Q1dgT1Fgc2dlaVp+YHY4KEQ4PztgXypfZVM0dCplRTtBUnpRVyYhTTU+R2xkbC1pRTF3T0NybmR8VWJAaSV3USs1Q0g5YmRuCiswSE5oaEVZRk0jbUVhMHMhKnN+dzt8MWdXOTg/dnlYbXA2Y2NjampXYlRkS0smcFpZeTUzSGIjKFNJYD9tM1NmeHsld0tYR3tteyE/ajl4Cis8Y2xSKEMhTT5xXiU4RlJfPGE9X1p4XmUhdWtyclpMdm9JdFNeVFBMe1dzdCg5dz84X207JCh2amRxUEl9SlhUVHJFPHRGUlhAM1pgVGwzCitpVjFldCZnK2VTVVI0YE54IzZ4ZTFsI15gWGted3FmKzlTfD9pJDJfS0AwclklJnRaR098WXlEb2I9UUR3WXUmampweFYwJDNwaSUwWXNJCitNbDlob0R4JDM3c2s3KyVWQ2c5e1ZuQChTTV9XUTZQJmUrfDc2UCUyRn1TSihFPnpQallXfFN0WD9DKnt4fThKd3EtK3NeOHF9U21AQVV5Cis5N2hhfHRmfj1MKGZubHotSlBvTHN0NERKQ3xlRSV0UT03Pyo+JFVPV2I8JFBvZEtxM0loVyEhZH0hU1JAPXVAPlFCU2FIKExlPG9BaSFNCis3Q0pxNE9SSlNhYjh6dWslN1lEajFmJD8oPzZPRGdGTlVvNWQ+RkkrQnVMZkVJJjV+dD1HMjkpSHpKVGVDNDs+b31GbnFwIyNROElLdEs2Cis2dHpWamlaaUItKyswakBfbSEmVjZuOXNhZG4+c2ZAYWBWWTV8OTZ1RzNmN3BkSTRMfjlOaGw0M0dwLUBFcmR9Tn1gb3A4Vip0c3hzelVhCis1S1ZtJWx5PXdgNyFZVSlkRTNXOFJeI0B0MGk9REhuTU97S3gqbD1APnJvQU5FSG5Tajs3REkqc0dyUThqRDZlVmRFfXBWUT5xNElwQ0UpCit+Z3tJcD9meHdKZzw8ZDdDVTBeZUROWUtOMzdGcDB5NG5DaHFBX1A9T0hRWUsmbkVsSTVhKUxaWldKWSppe3d9ZDswVDl4YFI/dVRgazhVCit4dnlhS1d6enl3a2wqQ1NNak5nS2RFd0N9dVVrLUV6byFoaGdSKn19WGQ2d1dSTn4rdEMwZjFGYGU1RDwoMmNROGhPekEjNGY+e1Q3aUE0Cit5Z1BqIyNKfE0tMlBjRjEhKTkmaCgwY30mPnYxR3dtbFBxQnRmSG1kR1NITllMWkk4ZjJQMSkwQSVmP04rJUFGb3BEXn1KOD8/dCVKJE99CisyPG5XQkJzN2llNT8rTGVQKHt1WTRvOXxrenMjMVI3b3dPb1M/b0Q5MXFOLSpuUG90Vk8qNE4hYjNzNCFhcjhoendDdk8/MFg2RDNlTSkxCitQRSg1YmU4bTclQ2kyLV98dD5hVDh9ME1zMjQjeyhXRjEmeWZmUkM1V3h0TWFIczY9Xy1JKGBtRVdDVnBWSlA2WmRGak5tZFFETmc8Yil6CittTFQpJFp4Pl5JWCQjezc4N3JZM2UoV316Pz5Ob2B5cVVtS1k1QVlreDBQRlAzYEAtOVRidiR2U21GTytwOzRGaTB1KzttQWlUQEspUT9WCit2R25aU207RyV4MCVnelV0YnwzQlR0NyZgQE40QVVzdG40MXEmckU7cn50e2M/X3FXTTtzPVJXdW5COClndHNMXmktODQ4RHVBWHkzTWwoCis9SyElbTJEQmZQQWp4MW5wcmlObWQhRVp4RXZfd0kjOXVja2ozPUE0fj98Ujdpa1IkUyZ7dXg1SmxJdXYkM0tTckA0bHp0VTRWNXRGT2FJCisqMG1KPEhsN29rZHVyc1IpTUFxZzxQYXpuTERmOzRfbFl5cmxtQT4zKFVIdyh4eEZkYlRJYjg0QkJNbHc3VUtEMHNzQGVWb0NRZyFHMHFlCitiRzZsNz4lQ1BRSWNJNGRqYV5wanotMVMmQ2xXWj5yQGMqO1k1MzUlOzZnN2AzVn5IOHhtaWMhWHdBQlRXWkRPYjA5IylHa349OTNYNUFACis4NW8lbzg5PitVTytOQ25vTVlrSTdeYnRaTjxQa242VUtvQjtCKE5vd0JMZmc3S3x0Mm9yVylKYF5vNDtAfG51KXp6NWtzPys0QEIrI05FCitVeWBRTFdwKmlPOTtzMGp4JHVad0wkTmx6Klp7cVAqakxxTXIrdXp+U2pCfmArWVVNWSVBMjt8NXxmaUolRWRyYChgO3grTElTdERYbGROCitYJjhVRHcrPUBRJDhFYGslTyQzWXRFfCUzMHNzWlJYPm41LXNSdng8WFE2Jnc2S3RkS2MpY1p1OVA5ezwoY1VyP2Fee3JSWHN6MVh0NkotCitUViZhPzRsIU5UflFKWGRTKnRkfWchWGYwM0JUeEJmRTxSbElZPiNvfmZ2JnY3QkdhNj5GPzhKTChQTTJaY2dram9jUzxQcU5HPGdQYkF1Cit5Kz5EcTUxN0N5UC1vT3g8eTByNiNgdmJrJUtwSjMhfWVmeHtXUjNaeipRJStval5FUyMpYiNfPiVpJVFQa2hDNyVrRHJqfElTentnMnJzCit1T09TQnFKbkhDekxrVjd5YDdoY0FFU2ZQJl45ZyF1Q2wza1ViQ1hURVdXczBRKEVfanlXSDhpdDdhcFpVZSg8JT0re3l6c2VzMngyTXU1CitUbGxrTjRsOVRXYkYyck00bUN1SmQqVHEtRGM9LW5NOFV4VEBsZ3JDaUBmNVQ4IzgkbWt8WlhpM0IkSDJtKi10c1NLT0ByUVdTfCVGaFJ8CitnREwmaH4/cD5TeG9ASVlGJGktZUpzKilIMz1wbSRwYlRHWjNrIV43YE08TVlKdTRCVyUkRVEtaFZMJko1XlJvZVlNYUlFTTtRQGFPbzNHCiswTlQ8KHB9REpWYUQkc3U0K3ZgOCgheGRGK2J5ZGVWe158UnEqa0FwQGQxaGo8MTNfIWNEPktlb3I2cz1JJE5wfXIpWT9USnBHSjh4az9gCitaTG5PYEVIKEd5eDwtJENsTilWJW09OGtCJFErJSZQWXZySmljbHpfYVg8SmRnaXFxcEpBdGFuaVJkWWshMWJKcUBjMEEkZmFgWG5ufEBuCitpZDYrQFJGZjEzdUxQelAwcGlhZURMOXxQQ05eJkU1PnUxSXQpbWQpUXRyVFcwTGstTjN9ejw+ZXklVXQwIXxQPiFlVG5Mdmp2YG1DTHxxCitMa2VxMjcweWpvOSNBTjtSa04oczV+bjBmNVI7IVJgKGFjSTUqLTclaGorXyMraHJhYzx4LXFAJjFzc3dhUGVaODtobXhmUDRmNnk3SUZ1CitgNW9+OCleXyg7fThtbCoodT5sIWElZngoNjVPYVl9Mzk3U2J1NGkzPD10UmwlSF5BfF4jcjZXPVlIazBsfDFHdipaeCE0T1MmJjlyNnVFCitTek8lO18rcm5WYDVxQzMqSC0zfVE5YEFkYVlYXm9tJGp+PHwjekZhd0s8cUw5cjB4dkdmbXxYSkI5PUEpLTk3JnVeJkBQQylkTVpreE9lCitgYyN5JUp4eXFreTdgY3cwVXxwRSl9eDhjay17IyhVbG1naEZ+UWk2bz1wNGx3eiZWTnE5PiRGTCU1dClITkshKm54bnF+IVJZIWV+I1JPCitybEJ7MmZEdVBTVSl9fUclTWAtYklvVjNSe0hQbnhFUkw5UVMzRVZlWkNQR1ApP0p0TDlYMyhGY1pZQWc7KzRmO1lzNmM/djJePHZCYnctCitnblRSay1laXtiO09EJHd7OGglY0ZlK3JMZFJGJWMpPDRWeEArPnw9MTZaLWU/an1wJDRgXyVtMmhYYl5Den40WnFMWlZ4X0kpI2l7eVolCitNKmRgeXZCKldXQjd7TE8jWlAxUXhFcX0tQ2JwfFomezVaQzFgKWtDNFFTUDY+PzY/bDFKeXQ/dnZEJWY2cFlsXjtqVjhDY3Q0ZGg3V1BTCitsYnhZUmJiM3pDWXQ0UHRGRUl9UygkeUN9NmxJdURadmtnYk97eG81KG8xd2dVODhuT2ZFazNjVU4wO0MrRFQlSVAhN2B6N2dvfjR7MmxhCitKVzA0MUhjI0FDU1oyS3E3OWwwSVRxdmRAX3pMLWA9azljYjNsUkdjNGU9dEdaYmxhSjM3Xm4rZTlCbGFITXt4a2RWPkt1T2tRNTMxWEhVCis+RSFCUkJqYzZWWlZJIUA4NygqTkx+JEd2NEkmezVWdWNBe3phc1VzWTRQX1VIdX0tSGFFMk9FcT58XlhiblMkQ35VVkR2b1AlYEpqTjt1Cit0cGp7KVpjMWlqV1RAS1FPTUZ6PHdra1Y7UUNYbXZLKT53R2Yze1ZWOEllP2M3dG9TWG4yMjJWM0xFKTFFcyR1Q3AzcHJVcUw5YW1saU5ECitsT0lWY3lzKmxGZjlGbU9YSCtndDxQTnZjMjhDe3NXMjRnUG9YO21lMXY3eUp1bX1ZT3Ume2BBLTxPYFgqKERtZFhMMTxzTko3UG9OcURUCitTd1UpJDZWNiM1MmEwfiFJUmRNb0hidFpJWmUrRD59fk90cnNYdkAqUDQyUk4mRzF1YHRfTX5qaWxkY2lXVzEjT2phdSVlWjcpNE08NDVBCitjfXFnb2ZSRkBCKHp+Yjt3JH0mYXlST3hgOWZeK0s8eU82PHRjPG1fejNaLXstKTJTVURqNVc0SXNrYjdWcC1QOzllZnpHMmkrNTNMPj0tCitUey1aU1RJc3B5MnhUPXBGcVBBOFdncSo7OGJ1M0BnOSUkUHduPjJTKTVHd15pNHhEcTcqMiFudTNLYkt2UWNuQ3heKHVFYk5yXnc8JGt9CishRXpWeGZmYkJTaWlvd3lvaiE/RkQmRlo+WGVGUUsmP3FYWWd+N3hGQC09IVJpdGZTZmpKWlMmWitDTD94KXFMYTxURTVRYWwwZHlSSkJKCitDbDVBbTgxZ20zZlc4Mm1QP1Qrbl8rTVVVeHRkbXola2R9JW9wU3t6U1Q/WVIxUl5FeHhvJFlRUXxFaTlOMGN3fWd5MjJxViNfaFhwUFIhCitVRmB9NCNNRD93RFJkMkVZejEzbUh4ej5CRUJlSXktcjMmcSpWNyEpaylEdH4tLTRnVm8rQCRSJTlXeX1rPGNXTCtRYGRDbUI2JFhBbnk2CitiVj41NXFmNi1hTCQod3QwcjxKPlhNTyRoYTx+OWdPWDJzJTUqZnQjWTc/ejRgTXEhbm1jZ0BzNG4xamlTJnxSZGVHfWJhJjs/b0hmYClICithclglUCkkK1Y1NXRJMzQ3XjdkbmR3YlohWjVGXzF1cyh2SUJ1blNNQ0pSPzw5aCU7PjA1c0VBZCFUY2tRZU9ZWT92cXNpSSVfS0M8MTtyCistWWJuZypee1pXTmE4ZmBpRit4bnlUXjV2Mz9pfWhPcmV4SSt+MEw1NGE+Z2pNa1RyNjZzbjAwbSFsdVJ4PUdiUW9CTypMLUBib1N5IW1yCitjcSE+QCQzRmE9ckkzQms+ZlpxSiFfWFFwZWFSNTBYMU5iYUopRl9yKTQxMnBvcUdjYzBhemBzM3c3dUM5ald6YFJJJXBlYDl1NDFJcHh+CitZWjtGSDtgWD1mTihJOXNsN1BIYjNlOHxBJnc2X2QrVWVvTzV0cl4kQj0mN0EzJmJpIWtkVilLbThLQ1pjPjZrZV5pOWpFQSFEeHIwSigqCisqUSkhUksrfE4oV1o1MXI4NnxSNzFwNkhwVl55NE5WaC1oaTV9PEsoTn5hOzxsYk1jYUp0SkYranVTSlFrPElLfmQxa3FZJWQ+bUhpeChHCis8UylrKWJ9Z3VHYz1oQUgmRD47WSZzKnpfJT9OMHZJbnhmVSYjZCRVfGtfPlMkcEREYUleVllKRWlXOGcqU0xMSiNPUShHMjxMeEApPyYhCis8PnhMSWVlTUp1blBYPnN3elg7UkxHRHwleURAZi1XWjc9RmZVY3J1Y2RWWXZeRjdhQntPa01RI3x5OTZ1JC1xST9WeV53c3MoNX03OyFACitsSkxHS0pYSz1vMz1PZDNENil0Tnx3XilGN3pSQmZASUl3aGI5U29hSDxia0d1NFlrRUV2eT1KITxjT3N0JVF9VVBHYWBwUHJvTjFMIVlTCislOSpsbGx8dVlvbjZNNUwqPDMlYCNlJVApV0paWFVFck1lSTlidlh5bUFuayZrck1rfnQoX0V0UH5IdiRVazJqWS0jTilVNDFAZVBTYkZtCitCMzAwNGJAbDg3eiZ2M00xWDJWKmlrSUV1TmVxcnhQKmZmayNmMV9xWD9EemlNQytRRlV0eyNZczlqZDhFWDxkMUNJRnsxfXs7QHBEMWlRCitXPXI3ezN2dDspPDV3KHchcj9ZcEJOcDE2TUhMOElRR2J0JEBvY0BUa1Z7Yz9RbiQ0amlaOzAmKHQwQUg1LT4zZnFyPkIySnkrbS1mV18pCitNJUVYRXluPks3V05MclI/fGJ8QHE/UipFU2tPM3whMT09K2spSlJ8T0xFV2ZHJHliSFU1QTZnKmpxZlFUQ09xK2drPjR3TWVVYDstdzlKCitjZkRpJHctb35VWFpsYTghUDVNU29KdXplO0xeVlM3MTVJe3djUzBWYSs+KGpvMUFILXBfKzVebUFJb2Ahb2U2WnxDZEtGcik9Vi08TVV4Cit6akZ4Zj1RUGdoc3spZkU7QEBqcnNgJG0wQzM2eCZONUxDMjlHbUU1a2smVD1mMzJVbW5MYElgVDY7USVKVHdIKkpqI0VMRDlre1N5JUJjCitHNVIhRmNaaiN2PmorO0ExcnFTd1J4S1doVilNM3RQd3w7fFl4Z3lHYk5ybylgYF5CPGY9RXo/Nyo0eW0haFJ0NTQ4d2I2RGNUdF5hQF42Cit5QiZyI2gpK2gkKU9EI04pNU9zUzN4O00rYHNXYm40bGJpbHxHfDtqbF4kZ1YzLVFJeWR2a3JlT2NlfkhwNC1BU2VGZGQ0VzVQdW1mMkg3Cis7bGlTfnFDN1NoRk5ZNzckaG1iajN5UWUtb0Y9YjttNyhKWSZtVyplemxIcyRUXy0+TWZjMWEpMFpqd3d1R0BtUEdgZ3lRaEpyQn0xTVBgCis1K0h3JmpzOz5tSjhZeHlvPXE3ITt2JSYqeElOM1Z9OH1CJUYhXlB2ckg9djJgN1AhQVg/akV9R0cwZ1lsWmRjY2pmQSFoM0pVa3UpcXUzCishRmMqeWFyOCtfaVBkY2BBNnV+eWxEWG95ez5FISZGVSlvQlgkej1OKzwtIXtQaks+MSpkXyg2TTshellmaUtVd1FWNWhiallNTVpwYGlACitnRTAkYkJZQit5Q3UqY3ZLQzElJU8xVTMqQ2Ikd31ZV0I5fWxFOXBDaVYtaGdSQDhZRTl2RG50V0xnWkwlX3tZdW9fcy1AdHp2cGV0SUZCCitHXmdRb2hLPDRPJXAtV14yTHlUZj0oKX5oVmhFNVMhSWBEO3lIe240bzxILVoyc0Q+WDBnI1ZSYWokantUe3sqZTdJVDNHWV5gelVxNW5yCitIWFM2OEgzT28rJERERlZVa2h1PlcyeUk2T245bTZGZ3MlOSM8dUF9dik+NSRMM01LKVEwen5SWTVPRzl3cXVoKVFJK3UhaVlAb2QwP1dtCis0SHAqSW9BcihuaUVwTkdwd2UzaH0jX3VgeihtSyRQVSRiKGtLPCF5QEZZZ2p9V1BZQndYSXgxXzJfTlBXTHVaOURCbzFsMCY9NDJ+I1YjCis+fGRAVEN+SVVnYCQ1MiVAKGE9WDUzS3t2fFhYQDxjbjBjViZiemZHUioqYEdsOz0qUkZCLT9FMX09eVohIW5TOGlOS0VSZjshKDEyb152Cit4c15gS3dPYClGVTMhS3xSWkAmT2FmYE9yOUt+aUxndH1qI0lFRWRib1VZeSs1dVkwTWVycTNjSWB3OGB7dyhwaT9PczBWWUQ7dzFyIWVtCitENHdXYDJGbkY+ejk4X0pARlI1MlFBJnZ2b3BCLUJzX2psZ29rdWkwWiVNLSVMQH4+V219X2psYkFpZTFDNWxlRzghUkZUYmc8KD8oJF5+CitCcT9uS1g4aCM8aXV3fEgzY1RjKlZXZExWciZwSSp7PnZ7V1NKIUZPSFIrfTdpRyU8SylCNnwoWmF1U3soRmtwX3Bhc3V7ODF3XkxqWkNDCis3X3NsTS1fKzsyUlZhe2NGZWt2P3RFanZnOFhsTWRuMFBOdng7SyFySCRkTm45Q1pnXypofHxNRS1ZNF9VeXlLUjEmWmE+PEhNJUhJd258CiswUUk7bnB3TEY7KTVtOy19QDM4VFdHNXVWWE9BNzFBZ1Y3b3dtTyRXTWRCfldTTmVsK1pVKz87JD5IZHRBdGxJUiZRX0tIVWhqVEg3X3lpCitwTXN1JD1fRiYlNVRmWTQ0a3BtYF5MPj1kfkhgbz1faV5nZUxUSGtJT041WDNne0pxcT8tREsoMFpFZnZ9KXUtaTslPW40VzdKemRWMDJPCistPmYmM0o+NjJCeG42ZV5lQmZwZnhOfU5AbFNWNGF7RSN5MW95fj9JREhKZ3Y1cDtNKzZAclpwZm9EMyRnMEdmT2FRWXMySnl9QTFYTF9FCis3K0t3RisqOCMjejR8aE0wVzBUYXlvR2R4KXhtX3FLQT8zcDQja0hjPUl6TmVweG1ZSjh2d3tpMEZ0fXtnezhpJjZVMGBNNWlnbGcwSiZFCitpcShBTXBtOXNUNTdxYHJLQjk/V3o4ezJ9PzVCQSY4SWVxbjhDMGAqSyZxfXFqLTFSLU1FUlg7PkR8X0hkdjdMSXZpMW04fCFZYiV4QVRPCis+X3t2YGNfT2FNSXlxXnBZOD1mO3M7USVrIXlLMG98bV9WPFMka1IyZExHSndCallpPklTbTVTQURXRSFsMSszdjt4YjFzblMwekpINCYoCitfcmtmSHFUNSM/NVpmeFo8bl9icSFTZXJGTCZCQEZXSWY/NHA3b25rM3NtcHUjaSh2QVU2SWNlSzRBRiQ4UiFMPmA3Q2tfY2ZJbndkLV9YCitwR3FqWmQzfno3fC0meXNNYUVucTNmVFEyUioldmplQl50cTVeeGJud24/NSszR3xRQXtvNXg2PWpIeHMyMG92bVMyb2A8dzUjcCkrUmsqCis7KzEkclNBKyE0ejElPDwhWnVuJEM4cTVQblJeaXBgZXF1JjFJMmF0SVdZMFJKbyYzdUlDREpJU358TGY/V0tUak4qU0EpdkJTfn5KfFNnCitPNSZTcU97M3d4PzZiaT9YVmluTWtVe0FyYkFWNHZzaSpiIXhXbGRGbmRxR0xvYldqO3t4WUI3ck8lPWpyTUo4M34yWEp+Y19GNXJGbm8oCitmbXUtdG1vYGNeSGZtKmAzPE5vaUd6QkNOdF52UUw4PnU2em17MS00R24oSjNiOHBvbnI+LWFDc1VYKHFJU01RXmZDYjdeRVFrYGJ2RTdRCis8JFJVfHQ0TlYjME4hMW12MkhQUHc3PkJZfmlqP3JQM0dOdHg/JUlaRklgTTJgciEzRHNVbGRBVkF9WGk2WkV6RkthVVIxd3NTXy1qNlg3Cit+TVFZXyNoUShJaChYTUc2NFpSJWV4WV9CODN+YFFVfDhCQCVXb0wlMjU4MFhpSnZUWX5mPy0zP1hkdTNjbjJAK3NfSzNUK0RRR3E5bnRJCitJPHZANGVoWkw+Wj1GaSo1KkMwK2o1bktNQnU+cHtWZ2J6MVpyMy1ePnhiRjRZK3htPTk/eGJ5VGYpK215UCpxaWpjZCZqZ3U+SDUwKT4lCit7Q15xcm9ZR2twMWd7P0U9I19IcHZOLU1UIyhNJU1ZMlBgYmtjfSt5VEgpXlp9dXlgY2phNFo4cDlTXiNUZWg8PlZpJWc1UzxEZykmaD4+CisrdHg3SzYxSzU5djVMZX5OMik+IXsxNm4mXzRhLU82WjJLPSpYRW1KRmdSP3dRZ2kjYVpOayVYTFYzO3tfOz9PIU5gbWY/Kylae1NHPXFRCitIYy1kUD5xNTNYMnZRbTJvTTwxaiQlQkp7QkB1bD9sKHBFX2JWMyNnPkc/P1UrblNMNSFaSCVVIUkpdllYVXUwMi1hTz5CQGVya1RwMl9zCitpPlR2TkNgKXFsWUF7WmxxR3Rmc3ZYO1I/MEV+I3RSaGZucExROUNhUnlPTTh3aSVIOTNHXnAlcWg8VUQwJHdpYWs7X0ZDNXJXdl5JcGJHCiszTWJgSVZANUstK2c8NCRUZFo9SDgqdytZQzs0Wn5yJXp8eSE/WE18MWVufG4mZ2I2eGUldlBRQU85ZCE4QUJBQVd8ajR0Nm0rfXA8PHNrCitVXzBIIUtAKDx5R2NBeTs+ezRTcHE4PUh5N2ElZTApTkc4fiYlPFVzY3F4b1l6aFU8PnFxYWE1amElbzA8UHV3WT5aNTR4TEplZHJkP29tCis3KGxKekU+WUtWcz52RUdxRFAhYE05OHckMGRxPGo7WjNON2R3JTR8XmMjS0MqV2xKRWs9U0NhZUEyQXY7QDZTck96JUNaSnFLOXV1SzNUCitafj5JUFRVbWR0bkIlQ3dtQztoXjZsIWJxXyV3THk8MUR8MHwrJmFBSzM8TT0ydXNMMS1kMmtAM0tPaW8ofilAcElkN0s/Kkx7NiQ4PiRkCis9TE5tTShAe1hmV1NSJSk4MVF9OGw/LUZDMTBVazt2I0N8OV48R3hyQSF5Yjk+LSh4Mk8wOU9qVkVFTFE8VU5nOVdOazE3Q1otXkY1K1dhCitvRyp9fm8ybl5laEdLUCV7K0tzSiNISXV2eXVkPTc4VyVNX0xYQD5ESkV0eDEyfkUxflM+ekRwUyUtLSlvNTZVKmxfUE5wXlBgI3xmb0BUCitic1h5SkEpdjJ2bmFvaWw2MGlod0NmP3V9NlFgRDxsU01xbnxudGVxdEpueUVpTUJJQWFgNk1zejs+YkxpelRuYihwalozMkImRDk5N0lBCitGQ2lJfUFoQjRUUGJYVVRWRXkoMWw0S212LX00b0FULWFDPERoOyZUTWU7dUVKXkE0cV85QGowSGowdGJBSTUkPmhuU1ZNYnZsUmRwNDBeCitie2Y2aiQ7NzdYOFMjV21CeSZaMFA/JWhpMmwpNzlJelVfYTxmbG1OODdHY1ZLVS1jYztFXyZRSyhaRktrQ2lBbncldzd8MXRkZTlhfXl5CisleztnbWRmSnhfakZYZmxOTlVoS1F4Ozw1a2lAMVZ2YWdgQGlhZytlIygoQGkydzYoYXlYeDZscD8/RG9eKDQwb1ZoJlJpT2RyViNEZzl1CitVMEl9JDc0aEJhKilUZ0JAfUhfTXdTNkd8Kl8xblZrakRjUzRFRTdVTno2OSlDMSlfZmN+UnAtMk85eVNkcX1MP3ReKUdodztQZHs2X2RTCitEcCorY3wkcW5jK0Z0RkA/UWxVI1lUVEpNaHRSeE1qX19RSnl0YlJlb3c4OXc4ZDtEa04/dSpzaD1xdXAyM1dQTHpHaTJZPmZEZyZzN05HCitrOEFTZTFIZVUyVlBxJmBZQTZDWj1tQ3REUilYJSMlc3Ikd01vRTh4KWIlKUd2YlkhQkdMSyFQa2F7YTFpU09SRSNQRXJKMyReJnZpY2hzCismITAxUGMyLUgjMShDRWxvOGRFUndoOS1iTnArTE9gMGhXaWJEYnMoVj92bW9lYURIJCF4Jj5kK2w/RlRlaXMrWldJTS1VQnlrPypaJip6CituV1YtITVeN0BBWFZ4QVpaY3N2aFFLK2d6JDBlYEhwQl5sc1RtZmxqfXJLYWxteCEpcVl4cXJjaDZZQGBCanFocDx9YjZsZih7PjFAMnAtCis/TG1nYzVjNVAkdjgtOXk2ZmtYdHV1QXBQRSlqYEtoTjY1QDREeHMtVjsrZlJxZ1g7I0NIPT1mUGBVSzc2ekRHbnopd0NyZWVwY2AmMk4mCitZcFA/cjZyMlhlI3wya0htQTZMV1ZCXj1uKTNOJG92dElpVWMwbnQkclVZfFVnQDN9OEFGOHw2YkpIWjBSdjhNMyEjbHhUUioqQVlXMHM2CitpUDxYQUhiaHYjbk1HNmZafFh9JVhNbFhtQ3lVM29fbGg2bEw1NTtFTldiNzZ5YmlpZWxAQGBqdGJwTz1GXm81OUFlVmVmPVNjaC18Wms0CitfOUEwQiljWjBDPjFwVztMIzA9d0hTcTQzYClARWxOV0JQY049UnJQT2dpcWttSS1SajZEJVRTS0hLaSg/X3VMQzBpRmIpKUttNm89bUpzCisrbjFScFdyQ341VGpPb3Z4QXxlXi1kPEM3SThQfld8XzxERElHQU84JV9kKTIlaWl5QlRSS3Y8JDw+TGg5Pkd7NlFLbjFJeGJnUjFiTTwhCitEPjY3MUBUTSNBQEY5TlhZXytLQllKQTlLTlU1MTQpZ1BeVUV2SjdYa0k7eiExY0tmfVNBbHVedDNaaWlEdGJZdVFePEttQyhQUWxqR0xrCisoJiUoRFF2bk89ODNSamUkekJQYmdaRlNaa2F+U1pZZ3xBYEdNSjZ6ajliUEJucVljRD5APC04I092eUB+S0NlY2l1S3lWfj9PO1d7c0N1Citta2xAU05HKFU+STkrMGo1dDk0T0JfYVJaRjBGXkFJWGslKih0Yyo9dWtKc3koWFY1VDBuc1NrNk0me1QtTyhWfl41YntTeGVteGspJSZ+CitxNHFRJUhhYSZ+KyRAaXFwazhLZXAjQTglJmJvQzA5e2tDXjRGbTB4eXUqbFpRbkZHSkVuNU1RcWN2S3U9WSRpaCQ9dEJseXxEMVkqa21YCis3Q2Z3VHUwMDFXIUdVV0VHREx6OTR6SWwrZz9fKHNYRkVWeGpmJUpLa0dqYWMjb35+PHNXO3JKT0QzIytGWU1CN3BLZjg2Qlc9TE9laHFgCisxZD9UaFoyU3tmbXZSIVpEPkY/UTRrZCgtb0tmJWk2YHVoKS0wMmJ+ajUhI3lsbGwhSTFDNEspdjZpcV8lMn1gdmxBOV55eUBOKnBndy1ZCityeUo/SnFjSFU1WlNnamdfSF4jXlg7R3QtKj9nOTVXT2FoM2U3OyVPYj0ybCUxUG97YlBVaFJlZi0kbnB3YXlAVD1lbGY0YTVsJSg+PzNECiteTUNnIWxMY1BxKmJnb2dFRmZKTWU+WnAxZUZFcVReVTV+ZFJTUVRvQyhuKUNjWGlaNlQpWDhRM18+UGNGYEkrKmUyczYyZn5XQns1MzdwCitZP31hfjV7IT9qUzIwQG1uNTNDcnhBTyR8fDJuZ3MhY3pMXj5NQShaWXtociFvRj0kYDQ9QzF2U1pSUkBWM0IhIVgtNVhiPSg3IWFhcSVrCitRaWhuZEpJNjRxNmJnZ3k9eTM0RnY9RXFmRTB5X0t2LXNNdzY7d0lQWnxRI1hMeDQ7QFMtZVdyV0F2ZmUyIzhpS25Jc35BNkt+O1ZzJi1mCit7S2orbFRpaDJWWVZxVlN5bnA8cHYqUjRjTX44PkYoQHVkUVZKOTdtYS1fc1pPKFA8UXZLQk9DZ2FjTk1gbX1XTjw2dENuVC1TSDlyJiZ7CitAYjR5MzdGSk5jQ3tSampmZU5vejFEcXwlJWdMUGd6amlPNFdxWjEybiZ2ant2PHdjOHg0K2BRRiVad3BIYzRnezQ1bjc4JHlYbSYpe2syCiszJlBLeGhjJj9RbWk5UWs0b1N6NGJjQXVsP2F7a1lZPzF6e1FqRnFSQm5BU29aaUNCZFVCX09NbkR7YHVVcmdvSTU8YV9DVkJTM1o7b3AxCitkNkxybiZ2QE57amtjdWN5YGBJVlNpVSQmJX45TDhwIWhaV0BWamtJYms4bkdEeV9YJSZ7VDZ5I34ldSktWDlVJDR3ZUFGIz8kP0RSN0RlCitEcjNpZUlSPnghK3R5VmpNKW01Vk9rUzs3JTJgeSRwT00oZ1YkRiNxdk90VnRecTJ8K20wKVd5TDl1O1EtR3s+QSUlR3JKaz92ZkRmTlQqCit3XmR9NHFxQ0BaKXJIWnsxenlYJkg5Q3dyPFkxWCRfSDg9V3FROGh9ZWBmVUMmVVd5NyowNyNKYzg3a2NZRG1peDQ8KndIeSh3Xk1NTlR7CisyOF9xXjlxQ1VeVj5HQzZZQD5yP0Q+NVk+fiZ6TGdUWjBMNElrcFFRbkxRUll5Z3V0eH1KUF9IeW87ZFItJXJeRnMjSHBDcDJSYn1NQ1BhCitQNmh4ezFpeyVlfjkqYSNmVjNheTFiYEtqV2pkSDF9S0R9YWlsbFk/PjBUbmg2czFEe3hMKEs3eCMyNSlZMnYmO3Z1NUd2PlRwXmVWQ0NHCis4JFhFO24jWngkZTMzTHBJJmEjUEVLZE5rI3tVYmYqNzM4YGM0aCVvUXV7QG93MH0oX2EleCZOODtHRW9TYHZybFhCeUNBQVlraGxodHJwCitAVSFjbiU1SDN6THI/bHdEN2dhQ3FGbFRWKzduTUZ0cCl3OW10MGhyc3t4IU8pTSNIVTt+MCp2MklBQzVTX0k9bmZsalVBRDw9SXh8ZCp8Cis7O2xIMGR6eytlZXFOJTJWJiVyUjQkQVdqMXkjQmFVP2J7KXYlUzNpb3IqTVk3UlkmTnJlNiEzbk5DMTM/JVNAZmZFVSNWPyEhNUI/Uz5zCit5PEpxd051RE1CcShmRFF9QnlmfFF4Q0Z6bF91USFTeCpjRGxqcGN8UTI0UlZleitWWTAqPGZnNShieTxYclhUM09QaD9efFIlRl5mKTNsCis3Ujh5TG1RN0hBRFRFX1U0TllEQXExKFprI3hXSSRvWlc3MlY+WXhJVkNkfUpATmh3M0R6KTc0TFEreCZNWndIcyolPGpGV2g1djU4blBpCisjZmJ6JHN1Z01wY3JIdyZiNGxDOXJeby0qPEs8KHlaO2Z5NG9KMzlocW9qSmFTNCNLRjRHcWBJdmUyK30/cFNRXkprQj99QUE+TjVxK3MlCisoXjEwOEpfLS0rZ0lHZHQtWmRFXlczWkNHWmlEYWdLbk55MElpfXA/e2p9UypAWlVrbWhuUGsrNEJZTWZLaUBsYD9ZZTMleHc+ZVR9c18tCitaT01TPCV9eHFnbEE4cHo3OyZYcW9ER3RLSHpwIyV4MH42XzxuQmY7aGZvVCU2dlBCPiFtJVBiQz42Z1F3STsyUGVyXkRIKjFfWUxuMmg1CithY2AhcVEpSjdDTDZHLTg+UnEzPU1gPUdQdUFwcEF2bGdsVTlGMWZ+V1c+WiNsU2tBbH5EfHhRRVhfdH1YcFVXUkcmNkZnKUFqfXFCSkI7CitoPDFMaDdGNkt6aD1KMWolRHZ4eztgbVZoOTFIJSpAOCZqNEJEUVpOTnNOczBLIytYUj44dkZ1Nzw7OEh6NT5xbUwjY3cqNzRQcnMrRWJKCistVWMqdTtPJHUyJVVrQzt2emUzJFk3VkI0UzVWPGYtVWx5SXpacSYxQkRWMU4oUj4wTSpRSWBnWWY0QV90VlopY2krQDZ0MlU7MyVXNDEqCishNlhXOEpzVG8rUTArSldYY3BMPSNscHQqYC1iP3lBO2czZDt3SFRDKlh5TyNRVUslUntWa2hGSzVyTDVtSl9wPHFmNVRVRyF5eCszKVotCit5d2s1eml2YGtFMk9QcGJhYXlBdFFvTVM0JjJ6MjdldERabHN5KH5qaXc5U2E1bWUlbDMwYk91eiY3bSljdD1DMm4wYW5aSXZqLWREcSklCitXYW1SWVJzPTdDbUZxOGQ+Vk09X05kc0NpMnI/P1NpSzEkeGR7V2BaQUA3V0ZlJl5oU35QY0U7JUlRXytTX1FqanU7Q2xHJjxAZGpzVSFQCitDcl88e318JHV9bnhPXlBIX2I4d1deOXdWPWE/a3ZKSGIhST5zQzQ1KyNoWUZBXmdjcXg3ezV0cSMjdTJDcUB8NGNJPiRUIXsoREJIZShjCitmZ2JLPU9pUU5NcyUtYzxES0JSbytxdnZ4c08hOVZ1WWVXYUF9OzJWbXdpPzEjJiE7NkVsfGFCQnVwMkVQR0I4OFFAdyhCPW1QJTNWRGNjCitndy10TkAyRj47TXpiQTFVWkAzLVEmJEBxKFlkJSUkcns9TnAqJW1mRG51cWwkTGNjVSZ1QkQtT3tIb214d055WEVXR0lIIyohaz1he25sCis7Xz40fVUyZ0ZJenc2b0VEZSZJOyVORXFkeyZHP05ib35vY2xiO0plZVpnTlVTb3RPVFJ8QExhd0lXI2ghSVJVT1h5WGYpaEZ9P3ZQTG8lCis3T0ZWZ1NXJV95QGRfe3M0dVNNNkAzbSVBVGpLQWR6V3l7d0Y1aENaWD1hY059Xjc4d3U+K0FFWVlodGV8TUlCUFBNaEx0dm56bTNxK3VGCitSLT5iM20jWSREaUBESF4oZkZ2cCo0JnZ3Q0JDSCsqNmp0UzIpekYxWUsjdG5ZMVA9RVhkZ3dPUm96VW1mTWQzWUk8emI2PjdaP3ZTSD8wCitIQld3fFc+K3lpUCRGN1BrbjRWbyhuSm5rJi1IRl9uajArPzNMVFJETVFUYS15Z3Z1TSV2KFZqblkqdDdnREBFdzUpYlZ9Ql8jPFY5KnYyCitRTUJ9YmJVLUJQNVZ8NGQmYSFhQUFOQHBLNTA+cVMhcU4wb1FyfUlGWmMqMnIwMjFnfE1KKTRRPis+Y2FfV3BveSFee3dJalY3SWtuQlB4CitQMkBLd1NjcFkmQX5YcVMhdiZ0JmF2KFVnJjZ4fDdKd0ZAaGpGKGZ+U25LbFB1NW4yV242NlhnPkIwMXpYMiVUUDklfEoxajkkQlEjSnJpCit6R2wwNklAOEVecU88MFVzZ34yMV9pWipWU015PDcwRFBgfnF4YTNiP3lgem89YXotckpPfnRMfSM2eXdxUGVJVGE7b3I+LWB+JnFES2xTCitJS2xWVHAqbVhCQ1lCQj4/a2FkeXM4bG5Va0Q9TXZrOT1+JmBYalZ0b0Y3aDUoQW1AKT5ZN2NicU8mMTdIWlhYMGpSb04lKilVZmR2eGs+CitaKnduSUJaMU0+dk5LbH04YFFUJkNoTzVBby00P1N+PHokUDxuSG4hNjRTJUZLdndofFJEeUI3cUxlV1QkLSlGK3RRRXNNdkczTU5KN3MkCitVV2lSI2xoYSNnUiY3ekp3O3ImNjIqbUJWN0J9Tj9ZWU1wPGtscmRnbFcxbEM2SFdZb19+Umg9T0kxQkFGPWA4T0lDZ1M+YXNeSF9CcncqCitWLWxmK3ImIyhOX2FuTjdteStgYm1LNnl+WkA5K2lsNDV8SitXZGZ6VDZzJGxMKVRLfTs7RUE2QSUpZUhRQkAqRiR9cjQldU40M084JkZGCitGMVFZLU8wMDtve2xAPj1gN3wkMyU4dnA8X1lYQVRlMDAwMVJYPmMhY1dwT1daV3BRNn5XcHBsWmRDZmcqbGpBbVctfWhHX0djfVFQclF5CitiQGU0MW9ALWRvI3NUZSkqdz1TfGpDZHM5M31nZTJaakIjJDZSKT9NOXlQaj4/I0B1VzAlUVZHajBrNFRgPVhmKmxfYy1KKlltZ2w+bkEzCitCbGV0VVJfJipFN0Q2TypRbClTSEl1OSo8cmhGUSZuUXltclg1QSEkUiElUTF3Tio/Y2VCRXlQQDlwTztidHBxVT1USXlyYFB9ek80Nz1YCitDcFFJd3JzUWZNYnQmcDhUanE8S0pTRVZoSGZpbHZRO1BrRzY+biphRWooc1J9QypybGpZRD1kRWV3TT8rPEc+KUdnbVc9a1JWZGJyQztwCitNZUVGTmBKdDlRdVBUbWp6djtUQlRlSUs1Sz5zQj0zMil3Mm8jNGU7SHhrQUE0ViF0c0VAamA5bipte2MqWXd7dUx0VSlkX25ta3RuP2UzCismRDY4VkB2WkdOZnErbnxKWihnY0YzfSQtRktmdUp4UDg+enVQaERWeVlNS0ohUkZ0eDxfKnVeJGUpUndfQTAqREI3aSVWSmlSKWpLRnV9CitVJWo9VT1XRHlhMyFnUFpCYUd3e3AwZldkUWtKMmlhU2o+RSZCWntFRFlLQjhsZlg2M1dKPXptQT1tVSYrREJYSGdkbnIkbUNDOX4hdm0oCitBd1N6O1VhR0gpPE1VMmgzWDVXdU5DdURYSlpPRnl6SWJTXmd9fTYyfCViPGhANCpoNCs4XmB2ZUdeYGFuN1hgPUdYOVAwZTM7MXc1QU1ACitPY3tMR2p3fW1KNzctdTFJU3xtZCRNUC1aUighR3NfTDFuYWhuYE4kb1NUVVZnciQpI3w5JHxfYFgoe1Q5OFZiRTM5a3AwKHgtUmIkWHhpCit3dVNBcmd1aG8yR083dGFzJHB6b184fkdVKHZFUUt7KygjTWE5dEpNYVpNTEBAYDJzUzEtb05RWWBjNzN0cmA3K1R8UGZRdHlZVGU8MX1mCitCUzVIMDszeH4hMmJ8P1M3TFpGS15UViNLMyU2aDVCb0xDYUs/ejtfYVVyeTMqO3p8VTFiOH08OU4hQVFLPmtvcFI0bmtEeU1GUTM5ZC1iCitDUVI1QCgyVTBLMD1VPy1IQE9pbGtJYm0lT1VYY29MYV9YcFomU19XK0AhSnQzbV9gUnh7bFVjeGZiYHREMyRld05CRD5teUpBU3A9UVZfCis2R0EkQVpwcXpackB3VkliKGQ8QEtUbUAhb1lYdD9KQVV5ZT14JDZZKEZ+ZWE4IUlDZERlNzhGVmpkKGVXTiR1bklgVm5qUHpnYG8xclowCit1VnhgNjd7d09MOVR+Q21IaCFKcmwqTHJnPXNUaDZlWkdgMUpPV0NeRjdjQFZ8cj9hc3hhTFR7RHA9VTAwelglMkdeRngrTUhSQEFUKGV7Cis1SlM5IWpSKj0yRmV9VmhCTXdPRjNUUmI+a2JlO3tjQFczZzUrI3tyaT1zaSZLJHAlemJFc2h2TTtJdVdvZHUrSWRmX0ZsKzUoNkdedG9yCitYTWlqXyRJK1dXM0hadmQhQTxHVjFQWHRDVDgwVXxxMDtjWVYpKXtGJUUoNVAqVzdmZ3xfNCVPZVRyXnwhQThCdVpPaU8/V0F4fXUpQU9PCitUPVF6Sko8bXZ9WTlDUl54Qk9rJTQ8clp5RTVLZWRnZHdMNlVTO0Z8X2tgWTN1e0BTYk84K2E7NiYzV2RMKnVHaURAbTR5MmhCI1psRWZ7CitKPWxMKUBYQj5udW54ezIhRHc7YzhqUCFsND1JblBpQ0pEMHo0KDFwfkdKO24tRzBlTm05QUMtQG5UdzMtRytRSVB8K15BUTdnPFpubl8xCitCSDA2dz1abkhVSzVuNVdoJGs7KTt8TjhIO0JvUktafjRlQHV0djs1Kk5VSzNvUlBoWHxUWjkzd0FPeTlmXntMRU5Zcnlfa2FkZXlhcjxaCis4P2BmX2tBUWM/Q0BfeFZkTFNeX2Y2Nj84JHd9QyVhI3hCWGhtR0VKMWRuVHgzcnplPmpXfiZ9ZDF4QSEyYztKdCpnS0djSEU8XnxyemkzCishcDJQb3dNcz14Pm5RO1ByX2QpKmZiJWJpdk9qSUV0IzI/NXwjTktENiV4Ulg5UTlqfU8jMz1INXcyYTB4MDZqOTtoUz1RaCg0KExkU1VNCisocmhFMGkmJSlYYikmPHllQkp9dWE0XzQlS2t1R31aTD9BczROe3tFWVhMKktYWjtxQlchdHAyZGN3JDFUdmR2NXQja25lOXhETThWe3tvCis7ISt7KDA9eiF1JX5kQ180UjJJdVBHS01rZlV1Ui13SExGbE8/QVk3UHwtTlg+b0tZQGg/Rk1OdjNyOXJuKS1UO0BoSkUqR049S0loMFhHCitWNmNwN2MxQSlRKXAlWUZaWXxmaSgjZmYkZUo7KkFzRTdtayh+WjNwQ0omfm1DRn5TOEVCZVo/RHoweypEUDFGTz0wb0M+JiFMbDlDXlB6CisybmxXQEljYGdmKFQoJT0zdDJ0TngwYWxgYUBHIz5TIVVgRnFRQiR8dC0kflNBNXV3NCo9Xk15I3QmQSV2P2NmV0VtI1g4Ozt4b15AY3g5CitFZkdCaUIoREYha145emgyI2w3OSpjVEdKNSQySkh8WFA3eEdOR0ozZE5tUmYmQj9tUH01N2wmKlYwNkxTczl7LXFoUnhpOUlzTiN0OD1gCisxdnF0QTNGO2hFYmNObGlldCs7WlI9WVUxa09fcmAjNlM0Z1c5ZD4rOG09Zn11XjQtNW49PXh6emxiYWp1bTcxKlROPX08QXs3cFNjZGBgCisqRm4pUmxjTnpgQVdSX0Y9fm1CZWFqc1dOMXp3JHZVJH5WfXU1cGZTQ2pEMlhzWW4zVFBxUD9jc05lXzlBSE84YnI+czVHfnFiTzFKV0VkCitqSzFtezFYUXBoKkglZ145aGlnSUA0MWhWVTgyR0MrbXo3T2RMSTAyfGhydkNYST0mM1EtQk5Ae2RQUSR1TDhkbj4oMWwxNClIe0ZjMS02CitGazFIcV4yXjRsRj96WXlSPUhGcllVM2dwMVo2VXRZaSFBXzg1dVp+PUgkdn1XdUpYS3c/YktFMGVqd2ZsM35TO3JOWmI3V0FxajFleEk1CitTJCs5MT87UkN3fjBXQ0JsaXlLZEh5VFd5cEVUR0tCenVoS1U7LUkhdWVfM2tuI34qKXVhUU9fXkU4SDltJT4xdDZFa0hjLXgtWWolPz9LCit4bUtVP3NDTm5xITFLbzFwMiUjJkUpSFlrK2AxMXdDQTtwQk9iSk8tanlxNj1LczdPPkc+Mkw9U1BnRm49UU85WW5YVnFFKTA9RlppQGBPCislcX4rdDdIPGs0RXlrcE03eCk/Zmg0NjJUeW9IZCskeDQ2RE1jeShUJUx4WDI8ViZPV1BiQVEobCFFPn5Sb3FSYz1RTDApUlFTcXt6KFF7CitfZjRYIy0ycyk0ZXRsI0IxJlErS3JDRks4RXgydEF0YHFRQFcja0pMXzI9fnI9Pzl+emFiemhRRV9pOCFFNWxhIXhsO2IhVXkkLUgoeSYtCis7YWMwai1LTFozZ20lXnNTT29BUThIR15xQDZgdl5QJkM/YGxOS0QwTXVmUFpOMGtULSM9a3dYbkBHc3hzMl4+fjZqNTJPRGhoWSlxWmN6Cis/aEhYNCFFZWElaj18dndjO1hGMntVb0k8NE1Na35nJGM2MHdPRDh5eUhAbj5XPjwya3JoT3wtfiVnWGlCXkJsfkBGbDM0Qmdna15KcXFACitOVm1VWHgjR2FYWlFqYl48THNONjk0NHtIYnI8QlhvMTBsK0tqZFdfTE5Se1hkcklLRihLOT1RM2tzeVRebnhlNkBzZ142KX4yR29+MnlSCitmcCtNQnE9VyVZb1RmJis/Yno0fF4xRmg5UmR3P1dJWTBsVjJ8Vz9NfmBBI0p7cTshajZ6RTxxRChBVW9Me2h4TU0wVmxJTFdXPVhxdzU3CitIZHxDOHBvRnVpQjxAJUVaVSlxPCYyPnN7UylpMChMeklNaW1uMyFqYVp4U2lvIylMRSpXPHN4fWZvbCVNbjxoOShaTmM7OW5eMHttP0s0CitseGlWUm9NSHNZQXFCYWcrMC05UTdaN3IydjI4Z2pQU31xJUpIayNXVE0kMjUyUlFMWSpUQGtkZHtxMilqNDVJbGlmQ0BoN0hsdmtiVjZHCitRXzlKTGU2fkxNTlA2cjxPcGxTdiF1dHR4SFQkWTgzViV3U3oxI00+MGd+RjVXT2pUWndMWThYTS0hOzdzd34rLX05QGAzcTFIR1k4VFp3CitDZUdUI2ttM0B0V3ZzSWJQWTAwK3lqLWlaJEZHeXJJc3A8XmcmaWgoPDc2diFwRnl2QjhhdjArI3BRfnZ3fUxjPHh7VSkpbFhPeVAqcTdHCitxVHVDaWByMDdKeyhEdTRkb2FBZzFuUW1tUG9efEUkOGh1PTxLeFFKYUBvPUYjVGslclAmdCNJd0pYKCs7a0NfWTdZOSh1LWxKbHd4K2BUCitAOUFZXjV6NFk0UVJ0KWwxVFNxY082c2xkamlHSSZDb0BSVkMlVU5eLUl8YEhPfV5DOWJofH47QmA/YTFYZG07UmolLTkrTjVAJChac0x9CitqJVkqUSt6NCV1WGdBMDdAUWpnWTJpdWwjalNHTChOVX1Je3k9Nm1KRj47ayklaTI3MmRmUU4jN3BBKUZfP31ZTmNGJnsqWTB7RHdpZ0VoCitkOTZkSTBxb0Raby1UNUl7UHdeOUljd2kkRTQwX3J+QlVefGdZVk9GWWEpQUIySUZyTTY1aUFOM3J3ITA/PX1CdGk4cXpqJWByYHxyZFh5CitMS2hHMDY+N3xzRz14QyY4SFBHKFR4NUlVUnFFV1UwQTlZcjQoYXR8KDVqVmhCWmpsY3hPZG5lYiM0diUtO0RwYU5UZkk0KilwcENOWHlJCitUM2dLXztgP2gxMG8zaUR9fih2PE04NyZwNmhURTBpS3xieGloekB8SkhmVH1GQ293MFZoa140RS1nbGtLeEwlUiM8cD9FY3FMbzZmUnEqCitncmYqX0R1Pnw8ODZKbUtfS3BxNUglMHpSP3gjfW9KSUVuS0gre3lrbE55K0lJNmU2cmVyaTItR214XjBoLS0jMSpxeX5zQyZfQXQwRCo9CitPXn5wQT9aam9gKHxRVmJTUVhKQW1yPyY8cTZjK3phPytxfD5ib1g9TGkqR1lDSUw7U0ZxSXQmbiFCYGlTQTBxZE8yWnJ9V1NKUH05WjclCitfVDFxeklpTXAzYVhPOT8/QHNfPmtieUgqSDE7djlsJmgkIyZsWVh+bmk2MXc3YGBuM0wxUWQ4PytoPyMwZkwla1pZPlcyTXBAWUJxZUdACitoU1chWjhHaz9ueTk5aj8meGAja2t8eD5vZmxEb15HPXJlO0YoendIXyVwdSVMRDRib0V5e0BROGNifSlQWUFyTyhlWVomO2s7SEpiJUxfCitNZShWUE1fJnE3LU0rK3BocSVSJkBQMkhSVipuUkhjKVQqTGpYd0Urc2hJUUZOM2FQTUh1WHEpUiE1OWVqSyNSX2xmUUI4NXw0RDVIQFg4CithfG8kc1JlQ35jRylzJDdBVSE/NkEodjZJJFhDKF97NjJWd3dicUdOdWt4ezt5dC1wQ15hI3lITzRVKzM/P1g8elgqNUF0TCVtd1p2QFFDCitRJW8qMDdGKm9PTWNne1NhfCMkRWxuRmUyaSRgJlJlUj1TSXZKc1FabSN8RSgxJD1RNmh3eHwzaXpoMmtMeUsrZitUeyZzZFFBaTZpfXhsCitOYU0jX3lEbWV0NXM2VyhOYUI4fnEwYntMQXkoX3o7TzNpdUh6YkZzX3FGPlZYU1ohST5MKlV3RzZLKVB4Xzc3andRJXZxeV9XOUo7NHdzCisjSF5fO3R6VV9FYkRSXzlkX3l+akFkey1PJjFGZ1hVPTJGKHgobG0jJnotVEh6M1JATGNvaFBmWnRKa1F0PER4dWE+RWwkIWh3cWklOWBnCitQMmlALUNXdEkyRUIlWjVreUFmJnd2bSFyVHxkRHo9IT5pQU14KERVP0t0Vjh0amdTVyp9TSh2JF5qbjt1fTRVXz4yPHA3LU1aYk82V21vCistamN9Zm8rRHBXJFM9XnByTXEmX3AlTjglfiokP1o0YmFEdUVlVExHQ3J5fVIlQCQ0bHB8TWVZezB7MzwrSGI0ZlRxS2hGNEc8ezM4RTMjCis+bTlBYEYlUnM0dX1qR1E5eSp8NmRiRFQ4OSR4TClTZilCdHtXa3ZuejNQQ1FBMDwxbWs7O3heP2QyJWwhSndMSTV6dkV1M3ZeSXZTZTV1CityQGQlWll4aGM5cEgoeUZ3T3g1a25NMC1FcThRc0pWJTwrXjE9PEUqcFJMNipJQHtOU0UjUkQwfHhxTDMkREoyeXhUYTEoYUo9eFNqLUkkCitkPU42OztYO2xeJHMoZG9rVXNKNig8RzRoTEJacDMxM3ZhO21mZl5WVD1gbChDZTtFe1FJdE90MmtoMDNebHg4JkBSNmpPcyM7KVROdEc9CitqOHJ1fD9XRE93T35kY0RxZDNxQ0dRMG9UP0VodD9MeTNWYjA3LSFtSHJ5STZHJlBrISU2LT0tQ3UrJDJvdllCbD5MeVVleSMpUnhVbm1aCitpTjhHZj5rKmU3QXwmJHUyNXkkcTNjeFcrXlc/a04wKDI2KjVFQXRwc1lvUkRhNEUtMCpfRChUX3RIcmRYa2Z7NTVgaCR0Wm83JGlrNGM5Cis+JkVONVg2VWl6bSYkSj9oTzV1NCNEZn47P21VKV84clFLTV5qZkpvO0olb0lTJnZiRE9jS0s0cCZ+IytWaDVxak1aeW1qekg0TCk4KGpnCiteKmw5fD93ZEFsVno5eGNPZFRsRGU+X0lleytGflRjPjJTdFRQaDErdHJtKiNRUFNvNUw4RVQ2ZEpfZFhZQWB7bWRKfG98I3ZDMUBEdUYyCitHOUVxQSVMJHljYFE+Qyk5K29gLTsmVUMtJX1FeWpqeWlGdVJ6dkEldm4pZUReJkw4cmZsQF9pJWRNOS1Bcmp6PHF9KnwjdVpEbHkkfj4xCitBaC1CfV8lVlZUbE5Zejd4VjtkUmxqRClzY35Pbkh7QGJHdWNGN2xyV2w3WTlNZDtuWlFMTjFTKzdqajg7QWJZTHFIdUJRNnA/KE5NMj5iCitUdVJ1cnJKSiZGT0JVTDI7Q3hsYlFwTiVnamdDMms0Snt+ekhqYWUqbXY8RERuN3hZMlgzSDtTbkxFXjhZN0Q5Kl9GRG1BTCs9TlkpR3A3CitXI0lBPFdzKFZrSyhfJjs1YmpfdE1haVdvdmBDP3g7YnsmK0MrPWJPYmFTZCFCTXV3JG8jfiNSNHJpVkgwYzxIcHJNd3c1SE4pdHZjfmsrCitXfDVtZjJPWXV9cFE0S21lMmszazNEbTtHJVApR30hNTNtQ2dBZl8lVlg9aXRmYzUoS0tuO0BEPzduc0xDNXhBVUBaTDdwNCFeYW4mZEt4CitrKFp9RX0rYVRiZjJLfnRmaFJRcCh4I2R5UWhQOCZhbUBlPHZiZkswfWxaUVZKeEB5d1lNUCleMX5qeVk9NSp1T0R0WGlpWlhyel89VihjCit6ejlQazcjejBHMTwwSSV4eGQzTVQyQ1JQNHh6VH1qXztAVD8rUm5xdjsmNDtrQklaNDdeZXYjYzYwPDxONDA3VXNDSDYpd05VbFkyK0JiCitqSWBgOVdHKlNSNW56dVIla3F3e0NaVzI9bkM1RCk8aSFlSSVtY1kmdilSWDE4UClgelc1S0treERAPzApQ2lid09pTXdnO2dNSFNEXkp0CitnPDl+Xjd8Mm9nVmVOeCFQfmUoVlM3YTJVJn50XlFEditQdUxwbFEpI0ckYjRIZGVrRSRefT1lREd3Pj8wOX49YU19TyN6a0k+YkltXkUpCiszR2M5Q1FRRiRUKDhidz80ODJtdioxfnRqej5Vd2QzJSp1fnBjVT59TklzOyg2M2U2RmxHdmdScEI0b19lPT54V0ZuPno4RGhxK0toR1BVCitTVyFrbCV3Ui1Nb3BDPHpPSnI2Z2JecTJUbi13d1E8TjRqITN4Pk9WR21NbUdTJmBhNF91YCRAdFBkN05sOG9zdGlNI0hrUX5lbUBHeXhZCishc1drT3JNait4cyFsVFh1V2xWWWh3PDx6PT5MV3dJJDhxcFBKXnF7SGgqeEtAZnJSJDUxRkZxdCRSeyN4Mn49OD9wTjNxczgrSCR5SGJzCitXbH5nTExrbWpOOHEyIT1PNT1tV2JTRjdYci1yKlJoKDxRPkZISXZsdmF1ekZ9eHJqSnFrPCpxK1ktMFpgb0kwO1M5O2JJWk0zQ1VfNEUxCis0c2NNWlI0NComci1QdG50PlZ7ZmIqNkpYKHVeNzd0I1VDVS1KOSlwPSVuJjZzSzlYQm1FWiZNOV47YkFZU0lpSl9qQm8oITwzISsxc3BwCitibTxVJiYzSnx5byVWQX1TM056cWM1RFZDdV4tMVU4QGZaJTxxb3ROSDw2T3R3PktlQD9mU194YWs7RWl5dzdhej80RncoKTw+UHBuYWBFCitUTzdSSEpnRzhqK0YrMGhYVUwrd3Mxc0tfeHtGTDY2c2VyZ2Z1VV9TZWsmIzVDTnt9a0llVWN4a35Nb2M+QDhCUHdkVyh6dlZvd2VzaCVFCit3VjJXYzFGS156YikkanpxPW4kVytGbE45azZATmxKZFFWeFo7Yj1eRGl3akwrWDJ2aWVOUW1VbldNc2R6OF5HWG48MGlDfC16MFRDKXEkCit5c3xIanMhKiMjU0U7QjRvU2d5OD0tUG12UEN2REM4QVZ4RCY9c2JLeElGTjcxcHEqNklgbTRnPyhSdjRQczdwVlBeYDUhYkpIVlowIyUhCitEektQKiYxeFNpanpZUHBWQWBlfmE5aCNvKlFJZC09Yzdjbz8yYCVNOSFnejA0QWttJUVpR3RXMmRlRmIjeH4qPSM9RlhfRXlwNWxFT3ZACitPKzdHLWRNNm5gNyV4PWN3LW56a1JYSEZNMFAhTmY+X15mTXdZYTcldHZfQiNVS3BMeUZ7amwzcTMxbjNvLSshNDVYbnNJe2d3XjY/PGYwCitPTEkjZDtsY3AtS3cybzsqUHdecSRMSCRfdj45PzhTJlVmOSptPTd+RX14T19wPVdFfDJmOXxARnRCMjRyTk9TNFk9RVhAdVhne2VnQ0UhCitFTFMrTWEtWkpYblVBWnErKjxkKFZVdDwyTSRKSHhwY2xARX5feG05bGZeTmojP183MU49LUtWYi1DT2V4WVU2JF9hRzFTfTNMZys0WGl7CisqWT1JVGFLQzJOdzEoIWRYeypjfDA7NSpuUzQ/dFE1YDRAMUp0MG5md3BRVWc2emU3QGJBe1VTdGEkbmwyaDxXSjMtenxvWUc0fG9oRjFMCiszeW44My1VVSRKOFJZOUhrdUo4SlppLTdRX3tmNktzR0lhNTB7NShiMWstZF5iMT5kTUJOKntYbD9kPGpiJFF1dUtZc2s0ajJBcHAxUnJQCitwKXY7X1dpRyk+OFc8dVB5V1dTVCtTKXBgTlc2fHQlKSZTayVEQG1TaTJhfTNfajRTPEQ2fVNDUVA4bkJYb0h2REl8TUwmT1E8dDQzYHZuCisjYlBCeGtxeU9JTGBmMU9gRSpHWGtlKjxWNVk+eXZCS21aRCZgaiR4X0dyNlBKLTQ+JUszMHVTVjZEPkpPe1JjfDdkSDBKcXY/em96WipICitfbkprbnBCVSE/ZkJxPHVRc0dWbExHNDl3WVdHT3FoOUBZVVNTUTUkPmx1KyMqbnh3X3A1QUAmeExZYW96fDsoeTg8R1YkNFMtYlJYd255Cit7WSFTNG47TkxVITAjKVV8eVowdiZpfiReS3wkR3h3P3h6QGNFZXV5LTMkckNpTn4xZShlVWtsLXg3Vnl2MT1iRU4tND9jLSQtOE5LMTVyCis1VXVOWW17KTd6I001b1BKVitgJDh3dlppeXAhJjJlT0N2Mnk9R2NieEtme2x5fikrc3Q/aW1kSjFzfCRycWp8KEljKUhSTUlAYXhaMHZMCitVUSpfYz10QHlnKUlkS2o0bnVKRVkmM0spVmJCe3YydCRsJHxhQzxANkM2dGFNdX1yYjFJdWAwM0QzNEZwQn54RyU9cmVaU2ZgNmpaJlZKCitxOE11N2VpUkl5Xy0ze2A+WExOWDV5MjV+eUVRe0BfXjRqNW5wOCo5cmY1VXole15eSmRRQ1dkfTIqdTJvQ3k5PStiMmBmK05lbmRMSGdhCitNSXx2dHE+Yz9KR0soQTdtZVdIRUdaQnN4JW1eWl52YXEyeTJOfGh8UkV7MntDP3t7M2luRVB+Wld9XlY1UTR2MGcrJnFaK1NrP1BxLWpRCitMZW9VQH5pTlVoZzVifmllUDIraTBxeXxrfSVQKXVHbGJXQ3opJUl6Pio4bG5XZThlTjFpNnE5aUNZY080WVlyXkoxPFJQfmBxMmVFO0tPCitNelo1JSkmezhyTU1HPWFUcHt9XnFTfHowfDJSWUVEfllQKUNlb0IzWXRFOSgyekNpM181YH54ZENhdnR7anRUJXFueGo/YCszWjl5a3hFCit2cFhteWZTTyMqOE91eHprKWkrdCktYENCKDVzLWpWQXlwKDc8US1WIWM8dVMoMmtZdmcyJDw+R3E2THdkWT04ZzBRVl9EQGg0THhRdXNACispVyg+Rn5SUko+KkMhYV95P2R2T2RzcFNmJDNGNDl0bXBodEJ5UllVMzN1dWNraXJSdyt7dWtEfSlzRCtNcmpXNlhhcTtueXlCamdzO2sxCitrbm12bjtjWXBqfTlUTUB8bWVUb1grP1g5fXImeWVMe3tAMD00by1hKCR8VTRUfG1xUk8yIzlhZmR2TWZrQT5zeEd+ND1zSXYtZiNoPms3CitseUomcEpvSzViQEVoOHUxbmBKSnFUSkhfODVPPSt3JkloNlUwTzdwbmtoZSswI0FQYlRgVCpycXRiUCZ6T3FVSFNjNG5KOSNBSXFnRDFeCituajNeXlBIVE95SFF4RW0hNCpJN2RNXnxUZFNuYUNTUE09OEs2SVkybCg7MU9ua0ZNdlMtYTRicVdjRWNie2ZKMDxgfWI3YEdvZi1GflBnCis0UkYoK1hVOFNKdj04NCpSalNMdHlqJnBRflVRTElKUD9sUEkxR3hodTE7dFFOJHo9Um9uczs1WDtaWWxPPmdaayErfXRzQE5IMlJCdn5VCitRfFZCWX0hcnZFdkJhfHt9cUtTZUJZR2l6d08zZGdnZ2loSzBRdyUlV0ghZnpiVD5Lfmw+cT4tbT5ZajRAPERpP2hNV3YjRShITlBMMXQyCitPJS1AQW1OSlNIRjViO2FgZEtQVEpIJCsxIW0rXnleZH03QDEySXlnQmR9YkNeUWtQZSsrR0thUCM7WkF2MG0oY3pxJSVHTFQ8QEBWQjBFCitsd1pPYiZBMUtFLWMkb211diNJMkMwT0BZRil3QT5DMTYhYDh5JTw8a15xY1MyU3NHKTgje1RhKDtVSFIlPFV4YWsmc0haVFA5QTtoMXVfCitXJXZiZUs4Pz83ViR2N0xsb35LYHVvY3JhO1cpe31xeiUhKU85IXtTSihnX2Y/ITl6N3dJUzE9Xit2c3RtYFpiYDA/ZyRvRn5IMUt3anI1CitKYztLam1aR3FRWk9sMS15YnlIRXdXcVI/aWl1NlNZcEtFLVFYMTNxWXB6Unp+aiZ7UGRNQFgrXkREQ3E2e0AzUmdJZjZZKWlnX34rcFpQCiswOHReWXM3ZSo7aVUwfFhRUjAwME84Xk9ZN3l4a3hrIVVrQ3NJLXh+a2A3eXRrT2FBfE5hYSVGS1phJUZLfWIjN15IYjk3O0JZJVh3bHR5Cit4PWQrXyk4ZnBJPD5aRmVJVTR4IXR9TEUoUyVoLTJ3e34qK3NKM0pVRF5Pa3RoJD44ZDQ9R2tFY2NkZChZdVRxOWpoNzFsMj00NjNLSkAmCitXJmw2SmQmenYyUXcmRVJmSGRWc1NLZmVFeFc8NiVEcnpreyhDMU1BR3ZyOHVUcUMhYGFKJEw/QVcpd1cxQ0hqI0N6VkN3TEpGSjFtYzVjCit5NlZxMHRxKktWS0slSWhaJEV1X3phe3ApIVpWZVlnUjBxZHAxc3RwSChVeEdYIzZVOygxdnkkI21fJHxDRHBXakZ1V1VnPUlVcV4xNGRMCitvWjMpKl5DdWBibU55RHxOcmRQIVRKdTwhQmtufCZAST98NStuXm1DNnA7JDAweTxxfVZFKmQ1YigwPCUoSG5fJFYqIyt5QmtJZWtUZSNACismMHhtSHlIK3Y8KkxKdF83eHV6QWwrRjg5QiYrN3gkSXUmYi05ellAKkJALTBDZDZCSUBoQmd2a0QzUDxfTzhlbVMkZnN0V21CME5EWTRhCitOUjdhTSVrMW1PIyZiWWdoez87RFZjfiR+RWcrWENLY01BTipLNFphYjc5RlhsXj9WbDZsfXoxVylyRWQxeGNeUkxKT0tJNVBIZn5MPWBZCitCLXdndHJUcCokU1BSe1FTTHUmQ0psT35qQCVnNWNwYT4oQ0xNeWRfYEc5KWN0TChxMTAlZSgyN0Jic094UUMzNjlTQ01pNG0mNiRibD52CitkTC1iaWVTNEcqWl9pdXVjaU1zVzY2bU5DKlIwJG14aGxzc3olRi1LbmlRejFzN0FrOEJfaT1iT2QtdTJ4Y08rd1hkXnhqYlJgJDkldllHCitjZEpBKyRLOFZ8RU8mfno4Xl9JeE5YeD1jdyM0fWU/QVdZITwpakJYbiZTa0c4ViRAPUp5PkF7bGxmV2VeZlkyLXd3OWd1LXZYO05oKk5XCitNangyODR5KCF9VzQkKntEITAxNH51LUJMI1UyVTd3aEt8ckVEQUhoYVhkU0A5R09NZ2doO3t1V3RENWRpU2dHcj9Mb0l+O2kqVGtWSTs3CitYTDxBdGZ2XzVHMWtQMlZyenotMTckRit2aStKXk8hcHtXTCFiP0w3dkZhNldTV2NRSklHWFlpe2g4KCE3YHFxb0chZWZ9cT1vVUlVUT5pCitOfEY7OWN2ZFhxV2d7O19GfGtZX2tafEFifn09bHtXJjk0R195TDhQeklHKSlkV1lYbjBkRDlKKj5kSD0xYCZGVFkjQG89aClHSENFO3dwCitRaGU0eVZiZmV0KmZ8bkxFSXtmRjNHWGYpRnRCblRqKHxPKWR+WGd2Zlh0bGZnaGM3JSk8ak94dVJfTDFlemMtMyg2eHpUTTk9ZilfaWg4CitCRUBIMypmJHdXNjRFNSNhMi1PNDNPMmx5NzFDcFRKU1RaOUshRF47OFJwPEMxPTxRM0dydmlqYUA/JVNHPWBEVzBNV0JvJSFiYzxGN2l4CitnO3Y+QUZZRj0+d153eG5aRkxtLUVEWFokdSprT04+OXFfZ21oNlNHflkoKUYjQyUyeCZPRX1uUDYxLWJIeG9wJjcqWWZ2Qi1zNXN+TSQjCit4PWwoUDFkVyY1MHY7ay1KNnFPeUFqcSVsRSkrK0ZVOVBjPEoqbysqbkB9SHBiI0ZOb3VJbE5YUDBtPkhuIW5LekNZQldGd3opcWZKcHMxCisyeSNfb3FZWWRBbms5R2krbH47JjwkK29kOEpXTXVFKSQkYl9yV2RRbitJNnJKI2U2NihGJFg+Z2FSJjREMFhnPF9WViU0XnU5RmNwJkk4Cis7KlkhNURqeCpvJF9lVFo0PjFjazB0cG9CUTg5eUBobHZaJWRFdE14ZXZBakxQK3dFfHpvI09MWUNwLVlieWgtfjx4OWVlS3tUfjs1WkxRCitYK3NiZE98RVlSQ2UhM2BWX1VwVmd4dytQTio+O1ZMSFNfNUVHZ0JJekdvRmZTcTRuVUBxQSQlb1cmcyFMbVNtaERvemFWa3AhWjdiXj5xCit3RUpKR2BnZ0IyKHtYUzN5WCgjOXZ3SXwpQ2glczd3QjFaTm42XjZZME5ZWDtxSGUhZG1PVXI0cWtJWV9pNm5hR01fc1o/QSgpJmopTEd3CitkcERxQG1rRGMtSUBfT0NHdlBFRE5AO0VBRnpqcHREVDdHUEBUZGspQj5SMTgqWk1TTzs5RiYoWjc9MkhFb1gpWnApMjQ9cVQoJVdsVEYkCitTJSV7bW1qRDlFYCNDbTxgby0hI19OS2VEJk0/MTxHNEpWMjAmej1oVjYmUEpiTUAxV0xwPHQyYFdQck5ocl5kNVBZVWkocGUyKkNHQzRBCittTmctTXtBfSZwPkxCP0EpZyRsMkBBOD47MTAyMkpibGwte2A8bVFtNkNwbT9gPVEzQnEjWml3NkdvPihXWjBaQCFNUl9iZGNxU0lCLXdSCispVDBicGtKUzt6YyR1PXxmZnI+fVMlSyh+WkUoWjtBOXgyNHB7djJ4QnM7SkNpNDViSFc9d3lqdGN4YGdBTXhjbnEzVWFPZ09pb25Xc3VOCitsMXw1eV9pR3Uka3pwZ2o8JlIrT281S187PENPfCFodnkpQ2dqSDtYeTtVbHZvI1NuNH1reUhiQDVvcSsjOWY0UyQmYWN9VitwZm01XlZOCitna2QkQE1hcnpORXREOC1hbnJlbTZvOCR8MENqTllGfilKPUdwc0FFYENwTCp7IThUOE19Pnl4ZmdqS0hIc2BXaURPd2oyallISiohKT9YCis9PDhYbHFEey01K21HVmc2QTY3RlVAKzJhd3J+JmlecF5YaUJKcmdva2MtSFYoJHpFc0VSaVFjJn1vVUAzcD1uKlEwYjdMZER2eyYjJFlrCitifT13WC1fRF99bitvRXs/eSUtZ1QjaFY8WDhUVTJjPipXcm5yZ05qSV5VMz0xbzszUmx8MVJ+WUJ4NV5rUD9seThPX25lPH13UVNII1dMCis4YDFaaGJOeXNrOzAyZnw2TlFHc3xNbzNXNTlIO0BnYioocitIUVpFM3EjUnpOanplPzlabEk1TnFMNTByV0lxQD9jJW40KyFjTDxzJG0yCit2KzZBPXBYI0NZLTcpJUY0LSMhZlZvSU9FKl57P2k7ayFJPF9oUjRxJnpFWUNpRSNMbndCRTBYU3ZOQnE8QDZGS1diZnljeCQxRTZpRENxCitQWW5aQ2ZtUjk1S1RwTlQmN35Pcj55a2FpajREX0ZJU0JkbU5IfFIzQW09WCFQZWxKfj1ie3JEQF4yQEAxWSRKdEFBSTxGdjdfY19MUlYwCitCcnhwWm95JUQ/YDQyQWl0ODNNX0p7d1ZpPXsmPktrVWN0IU96XkcjOU8wezBoWkA2YiRkJU0+V1ZzRj8zfGJHdmdHYnVDMFJ0LSV4MG5PCithb2B9bzNuQ1VFTE08RFhVayM/Y2BQMD4rcD9DazJMakgtPiNVYCh7VV9GZ1MqKSUzajdjYz17SlNoa149U0ZBcSpMJDlFJGNUT1g0U2g9CisldmhMV3BnemdFbDRQST52Y2MleyVGN3tBeTVQVn5VNX1ZVDtPTFcoYCQrMkd9UCU4fWtudDF5JStwWXxAeHthfEg7UXM/cU85S1FIMDAwCiswODBQfmQ9TT9APUFQX1EyVzBLUkFkMDJLZkwwQn50PUZMaVdqWTshTVBVdWtZPmJZRVhDYUN6LUxZamZMMWxIY18hQ2kzfEorN3UpPyQhCisxRiUqPlArb3IjaT1TU0BMLXx3Z1E4fGtWRkltMm10RWcrOD0tWW0/cj5BTjtZP09BNU11YTV9NGBmPkZNVzhfanVrXkQtcC1AYis+TTA5CitFKkhhUzR9NjlTejh0QlBSOUl3WWZDKih0Rm57VlU2SWY5NldLSW5yTjB6YW5pU0gwVFAqVCZwfSNpZk1iK3cwYj1CdEFiPCE+TWdMYipACiteMV4pVWxGb2N5Jis0WDFXb3RVT0h8QXJQSDFwaCF7NWh9Yj4oKDVuU0xieWt1VHhvZmN+IVEwaXBNMkRGTnk+bzl5THdYKnY0dEswLVNgCitNR1l+X0BUQHwtb0dYPG5GbjE1VmZFTHooSVhZUFJ5dyo+c09JbmMwOSh1LXN2K29AUSR2V2ZCOFI1YV9kMW1lVyZHSnxLQWRERT9kYm1pCitxIyp3MWxVI2Z6ZXZDQj5BV1R7UT9VbFpBdnx0RTlQcm87YzZ4KjJIMkdVJj1EODhqU35fODhAPTYpKHd6dSY/KkEqTjJ9Xm04b2N3ZVVVCisjR0liYzs5dGNydHc3JGdhNzhgM1NTdkBFekRAaj9FN1VkK0wpe3kyYlo1b290VSFNQUN9V3U3UiR7Q3RJPjs8IUVFbVZrP2VlKFNUNzgjCitmUDktYiZadDRSMExWeCk8dHA/QlAtJGU4SVhLayQ2NE00T2dpLXdCPCUmaEtROENedEVgJDtRc2tkeVRxWXw1MVltT0hATHNuJEh0YjtPCitLMnhpX2pkUjY1R3ZKS2pGd21nQUVDSFBid1p9ekBOcHtNdj9LUHpsPDNjN0d2SUJ0PCE3XiQ2TV8hanphdl5EfHUoSFUmbShyZ01RXkQpCitmTlN0QWQ/SDAwJkpLMyFBR0FZY0FARjlyVHFTdEwqZishSj5WV1Z7a2FeYCRQI3hgRzVUbyleKEp3Unp2cWxVPnFndEJWZ1ZUVlF7PEhjCitRKnEhUVBRa2R0TUxpZkIwSj1XayM5JE1KdDEjWWNaWEo5PlMzZURlQWZvMWVhV15YQkMzKzBqZXl4emBiQXJXT2xeem0hYzJWajclcFpFCitjfWBrX35XQFFkQUslZU1RZzBtPjQzQ0MoIUtzcFB4OTtwP01mWUshPDRkYDNhJkJiK2dhR1diNWJTSC1sQ3tKOEUmWUVURn5OXlM3Z0w3CitNfmY2eyslPz9jc08wPyY+UTJpPSVNeWxfK3hCPTQ2LTtXRiM/b0BjcCVFXnd9Yyojaz8pVTshYGY5Ryg8cjEmZDAzYCFsKiFxODVlN0s9CitzPjtAZDZuUDZzZlNJe1dhdU9rIUAkYlE+SH5pTENDZypDN2FuOzA0bEQ5SE0lP0RxMkx7IzBkIzhZdms0Wit6PjRRbHZOKGt3dFJLWURhCis9Z2BYeWp4MWsmVWZHUyV6Ql5YSUhLcypZV0MkTmJTMVA4SjUjfUU2JXRFcEhpMnZMPzVSQD5YI1JVNkBoMnNIcV9aTipqSUVrVH5kKGIzCis8SlB0UEp+R01vVCgoKE1fWGl8V1pLcF4waSgrQWc1Q1dralozZH53SiZLSD96YFQ7Ync1RFd0VXUzQ0Q7QzA1JEhqcSRPbihnOGh6USl8CitWZ2wmTD8xWktwdFlTWUl6eVFRR0o4NXUjKk9wLWd2d2crWWVpQExrNEpESlZaWUw/N0t8WTlrUC07eCR0PWhpISVkOWg5KUBgTk9ia183CishMjw8ZVJqc0U2TDJxX2ZkVXZKZmNaVFRaXyVJJDNIc3drRVIkamBTX3VrMDZKUXl7eCl4bX16RXFGZXQ/JFZDZz42XldGcmpPLSp2Wll8Cittd1M3QVEqbzdtd3g4JE1HQ1Rad1oqTX1CVj49ZVkwIT5BfTA2aXthaUhObV9LT3xyZzZAS2cqTVZsTFktI2pJIzhLSTxpaFlXJW5FfFc0CitWV1RRRTY8VylGZG0rNGdDK0QoekxwaVNxTVd5ekNMeXdBWjB4QkA9em1RdFdTWG1MM3N1eihfSUIreFIrY0ItPHQwcEY8LVM0Jnl5OEJjCismb2Ela09FaXMpeiY1WHgjUWwyUkNfNGZSRjBZXnRqPTY1X29TO0FeRXpjbWh0XlFhMCNLblZ0JWU4Y2AmZzBUNXMmbVFeazE+akdZJkhPCit8WW1HIWdgPzMqNTc2alNNfE5ycDRLYTQhQjA3PmpzUXkyVkRgbUs8SGJSdihaeSE7ZXdCLThLbjRrYSRscDxgMXRNN15PdSYjOV5seChNCis7JFReIXJDUmomSzF7bTJAcGMyeENaazY/ZVc+cyNETjBOQm9WeDdAJigjKmYkSyFuQkRsMiM+ZF5hSUhzcVV7elN6KncxZVZgZmM4bjkmCittdkduMT5NNW9sYk16cmBJTXFtOENJd0l6I1VsfDVjdn50QzAjIXRRQktuQnp5ZGJ7bVJpPiM0RityUWRRa2FGbmVxYVQoe3k7d2Axc3hMCitWMk4wfVNqM3lja1k2V0hPaUROO19oe0hxaSMxKGRlT0U1QUotSGNUZD1yUThxbzNAaUhTO0JMYEg9S35pMHk5Z3N2RmR9TXJVbkdpRF9JCit4YUUmWHctKmJmJUM9fmBxJW9EcDtkVDdZQ2NIV099VEpzRHNmTDsqQ3hGQ1FST2FDPVM7JlJyRW8oR3s8c15APkAyZlMtRjlmSWh3bT5fCitZeUtGVG5IJmxuN2krUk1ldUgheH07bG5SWFNaS1Vnaz1MfjBNM0BaIVIyRXlpSno7Z2toSnAzPmg+VjV9fms9bWprU3w5eiNXZmtMPU1ACitCfV97bChSJmMpMDNDaWRFMiMhRkhGfW9jaiFAeSN+UnVRTUNiKGVJVj5rR05xV0UoYnMjaWdyJjxqTz9zNXpNYHhGRi1CMER1RWFXdTtyCitDXjxrQTA9MnhVTn5DYG55ZGhUdz9Ccj91e0tYa35DdXFrNFB6dmJmaFpEfnJJIzc2b1FDcjhZVD1XNmFBIyEjU24tQi07S1d7SCskeTVzCislOFVnX3Y7OExQP01qbXZRUjB8QEUrdHZVX3d0NH0xaVQzO0VlTCN1VkMtTCM/SH1CMntYNTRwJCFoeCp7VVJOQjZnMXJSQzxobG1kbGJICit6ciY0bWl+d3d3Ry17SS1AWUxPQm8qK2R3PVZ6KjNYLXAxWD5WPUxZT1QxOFZBeHckTDlWXiFlJj0wJTg5Wjd8NGxCMmgkdUsrKVptK2dVCitpXkJPIzJAWXImfGMmISk4SlJLdX09M1E0biE/M19aLWs5RWV+RGpMMEVFLTNTO0Y8Qk1PYjlNcHk0akw4UDdfJT92NEspazFjMGxURklJCis3PWRpUCYldzt6WEMjKiZ5R2QxNjBAQWJFM25jZmAlVD52dzg5dDJMKH5yMEhJQyhQOzgzQCttOzx9USshfGoqQEM2IXdkTnFwQlMra2FSCitxZkxJNEo4VVU4NHkoRSMmOU9uR2FPN3EjakgwXj4jJGVkdSZTM3sjN0klKDlCeWZBJklZXz87N15YKGA4OClXUDU/RjhlMXRMSn1Kd2c4CitpbUo9MytSJGorKik8Kio4QipUfkAwaGd+S3pubytOeEVxWm1zSCViPjBvZDU/VFFuP1Z3RXFTUUNUeE5hemElQEsmaldQdXFHUFMmezlUCisoNnw1OH0lUHxYRHl3ZCt8Sj47TWRHczNsZ3pheUU5dDhTWTNhTldncGFSWGkyQDtKMXJNXmxNMClodGRCMHJ8KEo1eGN4M1FqUH0kQTY+CitBazl5dkArXml5XkYwNVN3cnI9XnEmZ28/bUIlcV8pX0xLSW1ZMnUqMjFKX30qR2hMU2xXd3gxVyM/VHUlWD1ZelhNazhBd29EdVdOfHgkCitmcXtXVHxRXitycCRmYl9KJGdXMjBrRUFGQFVtT0EqblU/RmF0ZjNiK2p5YTk2WiRoSCVQYCU5NXFlIXJlMykwUilyLTd7YnFgUTZSYiNyCituaXxgUnF5fUhTWH59UDVtcCNZV2xWNzU1UlNGRTFLblNaZ040an1uNihTKldHSnJ7IUFRczx0Y357NyVBQWI0dntMeCFeblVsWnNGPylPCitmVHV6dV91KyE2bncpWXpwMFQ5cEdqUj5DfGU0Qmp1PD5+cE9YSE9eM1BTLVFOS2dNdkIrITxrVXc9cU5mPUV4cDc0LWpqVjxeXzdadnRXCitYMVV8dFU+SitDN1NlIXokLS0jYmAkXlBSczJkYSVMMXNMS19+Mn1haz4jeGJybFVhKkFAY0VSYDNwRmUpSTM7ezF0QXlGMyQzYDJWREp0Cis4PUJTU29AZHpJN2lVczBsPH5CU0FMKjVII2ZoakJfKSlfVCZ9PHtIZlM/PGxNI08pe2ZCNT17WHxiTitKUzkpWlZAXzV3R25Gd1BqJXRmCis1cGJvM181ZCZFbXtsOzZkMHgjRTtzeEJjX2dFJFdBOU5WcHltaGYxcilKVzRlJV8lP1NYVSZ6TlUhYEs9WkY0VWFLMjkmI3olRVVxZTZSCitiPDs/U0R2bSRKamdlS2A0dFpqblooT2VlKk0pb0M7dzxRZ3Y+LWxTRmVPQ0hAN3piN0tsb3RPJVAkVzcpXn1qeDhFc218O1FAZUJlZWdCCit6cy05eHszMGl+eCluYU1sP2tWb1lHfTckYSZgWEFje0dYIylSfHdjWm9rIVIqNyhhZGJiUFN6ZmNpbEYtP0p7WlBaZDxKK0B4cEdoTCVQCis1QWp3aGxoOGtIYWlMUTt8PXZxUnpZWnJofjBGRXR9TSFGVWl3eVpyeT9pMm9aWEZRTU5xcDdQeFQkdlp+LUo/T2VmZFczVGE/ISRKc1M3CitOak5ockBsXmZyaXlCSyk3eWlmUE5UbCZEXnE4IXdod3dQS3ZxaE5JO1JNWXFpUX1FJD9vY0NAdHdlYSl2YSRgUm5pSyYqODZ3MGc4KFVSCitORHshczx4aW83VnlhNSgmNUtaVURlXjk4KytPPT9tT0pXSDI4bDJvKGomdnNsPCZTeDVxXjc1VUd9ciNScVMjJiRUZ2hwJl97N2VDUXxBCitjOVRPMVMySDx9KiQ9WS1oZCNTbWY2fn1oYVZne1dXPndfbk1TRi1VdUJXX1NzSitzSmM/Jm90MlEqWEEyeFhvbztHeTdGO0VuO0dPLT01CitDUGAqc0dIREdzIythUSpQI1heeUYqcUZuMzU0WFZ2b0NXfCtPa3NJPyMxaSt+ZG09REtNWUYlakVnV3gxVVV4ayZ7OGZIb3g1eyp6c2hICit2SjljdWsqSntOZVIyejBBNzBaXmBLPysqbj49VSt0cjA0NF40d21Ne3JXU1F8Y3I4PWF2USlGUCtfYH1YdTJqeyVHWDVRait7clhfJUR7CitwdHdBZndNOF8/JFlkM1J1WmZVSmErSlRURlBHZGBRdTlNKyE5M3JmT1JWWSVsWHZ5MVYodXRHZDdxLUh0WkgjakkpP217YFdDMX1ALTtJCit4TkExbTt4Ml4hZFgwNDIjQS1hNUg9JW1yPFZBXjRRSkY9QX50ZiE8c1FoPEU5T3Zqej1KMGxjSyV5O0FwPFNQaytJYD5DdmdlXkp+NDRuCit1eHNnXzMtLTNIQE9hRHdMekx+KVZATXx3R087MjFaRzJWPD9pKzU5WW84Nj9VZGFIQGgmVWFGKyhJVjxNIz04NlpsKmtIeDU8PmVSUTZFCit1djxjSTdAezl0VVpOZjB4XzcjOX4wNT5KemdtKHZwQmckO3pac1lnZitYPFVVRGcoQk40R0hudj9JaCQ0Kl9WMENyJi05cWNJVS1wSCpvCisleUkrcjMoVCs+YF8lczZENURBR1BKdTlCUDk0NzhFVkp1UnZ6O1l9Z2RObC1pP2YzOVZXSXU+KUV7QDhUQWM+LTwtam5iPGs0LWs/KlJ2CitOZHI0NUtMYVJ5RlJRJG47PkMxZ15wQ3lpQmhAV3MxQiUyTXRnd3Y9TUwtdT1ZSHNHP2xvOT1uQ1M4QkE7bn0pbXhiITspYlAxczZnKi1XCituZyExMTBEdD9MS31SJk5ndWI9IXBzaExmbUtVQSYxWTZRcFBqcnNJU30mJS1ETnNfJHxVQ35wO0ZOT04ocVZgVXNpTVJMc05hMDx5LW1OCis4a31zQD5nKlMoeWZtSGdHVHkzQHpYNXY7LWJMNnVNeDwjZlF9Tjs0Vi1WO1RYO2hxPzJiKX52JmJKTG9GayhDPkNja0Z2SztIanBGWUB9CisoJHU3TFJNXyM3SUkrSkR6K0l4OzwrQjEzLVlUbig4bkJSNjc9a0cpbUttfVlPJWdaQnJ0RkBaXyg8ZSkqUHFjK2RHN19wMlJJdX1PbENMCiskNmxlV3B4RGZMRmo1YVphUHE5WT9TdUZPN3RMWHlMbk53WmlaMmhqY3tqRGU/TyRmcXoxYSg7SHVBSHhnKlFufTxOPSkrRDx5Ny0kPSp3CitRWWFuO35qdlheNzV+V1RLMCNEdWEmcHt4RiRWSDtLbWpeKGtac3YkP05Ydlc/dzVkTG9eV2lyOUBeNStIQCQmeTVDIylVS1Iwbio2TmUtCis1QWYlalgxfEJNN0JlaV4kIWFCPU19VjtKKk19ZT5Cbn5pOUxNSGZ7bjA9VV8yMHpjPSYjeE0wUX5PT1ZhQTVJOXFXNGxeQHdSMCM1U2N6CistdHQtN3k8djNJPD9iPW5nQWJmSk1XKTxLUUk0KnYxYHxaJFIoMmt3eXZIYm1FJCVHM2tUPT9PTEJTcmg9cjhUWTIwaiVCJkRgbUZGVjEhCitULWVNN0IpTXk9I2FiPkNaUio0cSlDNCF6aSpwbX5Ga2xSN0JEVHEqcWN+PzFWNGN2WkkocytoQGN0TU5sWERMSzVPPHBPMSpxQEJ+YVQ/CishXzZGRzFAbzlLbX0pVnRIOHhBRSFtKiU0KU9tNDVhKmIkbHttY3hBUTJpUnQlKT47dzV5MGxBVXdBQXtuY1hLfmdZTClOSDhSYjYwNUhHCit1WWJsISpRU15uUzJVcTApbWQyXj5XWj5tdEo9bmt2Z15UY0xHIU5RdVZpIXtgTTkqaVZmOEE/O312MVQteWY9djVpRy13PlBweF42cW9fCitxXkJJdzB4ZEZ1T1J5SC04WTtSWlIoaWFuZm5BUCZ9XikxQW5admEwZ3YhSnM/MiZgb3NJdG5YWHk5b3JJMFpHdUA3TVkjcm59QjhmN3pfCisraEUqPERmQD5OMk13Qn45TlBnNE9ZN1BAUXNpbjQ2eVpxT2U+ISE+dCtse05ZdkFKRUo4TSpNJE12Rm0+M1k8QFp8PHYmQTA9bUhBeVBZCitmWUs4JGhKdFgpMj9nJT1TO0xobDxrUSU1cXJmT3hYcWtkKW8kPXZ+SG5ZQCVtUnFxJkFqekN5M1dhO29nYWpHVnVOYX56VWAtTDNfMUA0CitOaSRXPkJPMklOSXFUeyNDNEpxNmhJZD05TnlGfXJLMVdSM1kldUxoQzRlJkwhVDR9SGg0X2k3fTw7VVFUZnheKWRXaFN5VlpHZUxnfWpGCitgbCUoZ25AckQkZjl+PmpgaGp6PU5nQzd0MFF3RnEjbVJGQjhuWjBASkU5ZC1SeWw4Qj1QXz9pS0MwUkIyYmxLZlhWSGVmbzFhY01hYGVlCitAOF8+XlIoPVd1QF5LPClzRFJhJlJNNnY8eEx3dFlLNyshN2shTG1FLWlaJUMtZyVJTTEoa0NKa3tleVhVOFdtY3BfNX4+XzdTUHRIOVNKCit7b1NaaCopZUI+WVM5dFJMbE4jeCNvb0JFY14lWlZsPko8cXFEU0M4SmxeI20/R0dQNEYpVDt2RlU+NyRHUzY3RyY9RVEyXyEyUVAre2M3CisoQy1Le3RDJENAcVY9fDxDZjhEKG4yJmt4OT5BZV51biNwViohSWcjeWB3NHVuaiRhPlBrPEY4QDhBYjJxaTw0TEhleGUkanp3WV9sRDQ1Cit1bUhYcnVTcF9scitjZHF2Z1JDcEd6U0Qye2lxekB+X3JvJVVTa0xONVlwNz50a1BDVDdJbFdiTCh8QUNIQ0N5ezV0PHRjOEFxKTxtOUc+CitAU1VPdzQhdSVmbEJSREN9JnRsYXM/Pm1EZTFpcSl3SiZyeGZxN3IjVk8hQXRnaFFYWkp9JWBaVW9vWUtIbFdDMlB4MTh2TGdTX3VeUHVJCitmV2lLR2NodzloTk53QiVzQ2dGbTI5STspR2JVYi10VmlDc29JdTtJUkhUNSlOd2JNJVMpTH1qSU84amA5PzAqTWJhP1pFNGk5VVJhNjN5CitadjxDV0ZjY1J1KzF7eUdHfVhHRXFFTFgtVVZ4KWE4M05tc3kpR1ZLWik0XzVreipwKjlHRCRFRTM1YFpTWloxa2gtND1qNXd5JSN4e2ttCitaODxrezxSJkwkbTtfS3ZpWEwzN0wtNkQ0RVAxQypATUFkMlFgJkNYIWpyOWZiMT1mbnokVDFfU0RfYTllIyRgVSNeYCs2emRIbi0mMyZFCitnYD07e2lke3BCbT41Z1FWI1QjM1UkMHRXUHFhNnNITjJgNmtUNnJZKmlORSp5d04wV2k9QGlWdmdNTz5aVjtfRkNII0UrMVlFQEE5Ql5ACitiYzdVckF4d15xP1B4VVgxaDV0KW17cG9DXlhDTj8tYHheUjY3PkR0JH5hTXwqaEUrOzRANG0hKSRzZ140O3FFJDxvVD5KMElJQWZEVGVqCitsby1vVGx6eHx7b2BILV8lailqJCs4JHNIbl5HdiEhYHF4VkxMfXVBYDs+UGo9KUJicTFmRCk0YUJlP3shcGNnO3UlYmNaX3dldnE4YWhACitzbzRMXlhkZnohcF5rais/UHc1dTswbXYrSDBCJTlyS3BtbiooR0pOT04hKiNYZ2hhTVRALVdyX1VPa0RwUihrcnh8X1hmZX04fFI5NlRWCitOekw2U2N0VndOWWwmUFNyaHRNc2NMYXBzNHRjcC1jRD9MVV4keCVvZnBfcXl2PGMpQnpgc1NOJiM3Xkg8aWh1SUZsKGlpIUlfViZAKjRtCispeWc1NDI9SFpXbXlQVyYmS0ZhaVd0PmAkXl8xVEluTVFVNkNSKiM4OStyc353KHtBVHlDZShfbXAjYXI1N158N05SbTBBZHoxOSt9Tl5qCitrO3FEfStaT1ZaSFF5S249MUIzPCV4YlJsdXNtXyRwfnxsZih+OWYpYDBpSkdKVTgzQiVEOUApNzBCUWRRcXYoRkpRcXJVb2UrJHhLRWpACitgJiszYVhIakNQZWVXVWZwcFQpZVpibzVQOUNUPXtgVC1tXmZmSEJZO25oYGxeXzs2QVdtamZsYkJyN25MZTtJQT1mZEJ0blQ0aGVERW0yCithelVPM09feyRfeFFgWCt2UXZUKzQkUTBEXjl6X2hwcmtnSlYjZHR3ZVZwNlF3fnheYWpMPDdeaDhZQG9qTyNgUTklXmA5KWNMUF5GSlNaCitnekRxQlE9TUx9MTV7P3R2TTt3clRqZCN6PGEzUW9ldDEkPjB7Uk8wVjRBdllzN2g7QUlALUhzcTlsOFFhcF8rOztEaEl6IyRINn1rcl9+CitCJnNjRl9WLU15bXB6MkBNJHNqX3R7WHxISm1nc2BuO24kTDV9UnstTXhDUzRfM2pyJUZMaU1qZ3w5UDx2QU1oZkl3UmxFXjFLNVk0dntXCisyLT9qMChtIUFBMzUmWT8rZzYmdj43NCM3OXxqKz1zbHl8NkBmSHNXbH5vJlBaKXMlSjR0c2pqRDlfaXtLfiF6cWJGUVlsfWFRWT4oIzM0CisjQTtBV24lPUR3ZzNCfjFlSEZQUmBtQHx1YlRaRFZvPUpFZWBuT2RvaTtgZXg0ZTN3bXhEYTFUVmpFR2M+UHVmLXRFfWBObHlLUEtqeXt2CitZV0R4QTUwNWg1X3UkUFhKRU1EMnN2ME5tPXIkQVFwa1hBVCtoblNtJHtwPUpoQXRTZ3cmZUhuQWlIPnRPfjJNPHYtez4+KS1vdVAoT1Z+CitaOD5eMk45bW1Fd1RYQ2J+YGVKSjY7a1EtJGI/NT5iZD51RUZ1alNGTG8ke084JCNLMjI3XjhARzFZdSg4cW4rNk9zbkAkQ3NESmcyUG9tCitwYHlHXnNmYUxhdypyaE5zTjBLQUtaVSV+THUrcFRgdlB6ZEg/X1c8d2QoOCg9aTJ2VXNYKnN0fUJocSs3YTUoMXZxbCVTY2J6c3dXVSEjCispWkYhMDlvanJYJVl8PiF6NktCWkB2SFQjTmZhe0JacERwTjxZeF9WQmFlaSZlNzdRXzwhTjJ5I0p7eDMtRDBSdylGNFh5THtxNCN2UylzCitTcCVOU3liUylzJndPcnRyNldGVG0+eyZsZlUoZnhQI1AmRktNVDFyQnVtayYkISpHOCU4MTt1RUhQT2dMaFg5PD5QQFRTNnBhcmo/bkIjCitJO1hwTChOX3BPUF9PbWpXe3B6WHBkJWhPTEhPKzg8Tkw/QnNWY1ZOYk0kRGtPPT9YRntzdTQyaG1YSSZVejJCcCVKKEtYeSNkKntoSzRrCit1ZjQqbldWc2ZCPkQ1KztHeGExZyVnY1R4S0U7bSYjamZPUDAqd0Z3Z1ZWfDA4RzJmX35XdVQta1VuY1dFO1psRCpaPUtJMm9vJVFLMjZVCishYVdrNWlyXm9IJXNtc2AjLTNjRl9lPDBKZX1AT0AxQDIqIVNmT2ZLNSR4VyZKZEVsZ00wNiNSdGhOP3BVbz40SkZxJHtgKyhqciVedENVCitJNTlqMVFqWi1qWmdCZz40e0k1S2RqbjsheGtMX1ZWY2FjUng8ZU9SJj1FRWhDYmY4Pnttc1lHPHBtVEBiQFVKZVomQGk/SVA1Un1XSVE4CisjZGAzbWQtXldSSmtReVBUN2R5VzlmaDJfUCVaaCt4cUwhN29rUkFGfTVHSitiOStJSnlJOUhnYUJ4WSNodSRkenN7aG9hfkpUN1pRey1PCis1VjdVPih7IV8hLXFeTFpzUFQ4Vm4kcCpYPURwPlY9KntzUCZadHI5NHR8Qisob1YocFRhfmt+b2BWfExfTG8/eC10djsyNVBnNyU5JV5YCitNPmZPYjUobE5AKlhrQk1YQ3F1OHIkZmdTNyt7MiF7PXN0PCo+UTMxLWhmZDRXdnpJNkQmZ2YwZnRUdDhqSU9KYkdob1lwd3BEQ2h1aCp8CitWSiFASHZBVFchV1IzcEFKc3R9QTFvYndGNSpPKzR5dVJPJDIkQ0VxQUduQHB0RVRIViorM2w5JkVxVjJPYXNvJXJpSipYajRGayowWW51CitNKnckelU0PGhydzR2TnRyPmZpP008NVNKYkYwUj1mc3dRZCZAYCVWVXlRem9+Y2lBaHo7Tz5NZndZUnlTOHZQUTNAZkhkTkNLYkgrN1RXCitBUnolI3k+djJkJDM0fTFpVDBZMTg7JHxCMCFJPGNKKHIkTXpycmhlVH5oZ00rWkZNOElQPWs3Wm55cGJ5Q3x5YSFAU207aGg1R1leUSZRCitMRXpua0RoKn5hcE5QbGZFa0JrIV94dUBOZiNZTCNGTW1ncWdsM09RVCtFWGtsaTJBPEtgUHN1a3l7NXcwOT5Del9sRnwlMi1hVTtHUHNWCitVNDBuVT4rN2E7KVRxZkJsViNBZlg4IWYtajxVVlN7eEc4LXZaKUIwSk9QRkxhTWpMK29HUHF1WmF6YSNgZnU4MGctU1V4NncmWE5YekN5Cit5RFVZUzAkWUlMeSMtJWZ+aVNVQFk4PjJvTjNLXnM4fVd3ZU5aNCl5KyV1YjxGaTY+ZiY5PmtUMCQwTFFuSz9TJTgja2NHPHFEZClfZ0JpCit3K047MWlwZGw3V2haRT4jaEhNSk9Zfi04ZUl9I0NzQUhVdChANEVAQzlxSHJHYEpJKmBEblIzd1NkdnxoMGcwZ0FlMWdeXnQoJT8kNHF2CitBSmN2NDd6KlkpMWs1aiVzbX1qJTlgYGt4YlQ+LT8zaypIemoyZV81WksmJiRIZ0tyMit2JXBMM0dLVzJ+eTkxeWRgQHxBJW5tNGVJZHxvCitQX182RF5mSjY3YHBjMDUjPSh2cTh6SHVzWkErSWo7PVFiTigybk9GZTMxP349ZFhDI3pgPz5LVmNKfjZPbShUIWNYY2l5Xml3UHpRX2NRCit0b2ZqRUowX0t4cWE8PlQ3elQrakBhTD4yZlBUIy12MUhobWhsPlF4REAwK0F7cyZVVyt3KDhhbVJYUndWVWA7cDU1bkBDRFVRbnNvbzF8CislSkUzZDleeWo7WE0mZGMwaE9odiQqO0dnZiFUMVgxJjNSPiN8JEw0blM8fCM5SEA4K3EmQHtld00+UkpxfVN+ZXMwJlFYe3hVSVVrcGFECit4TkhecDZQS2ZVIT15c3lePTJNVmgxOGc/UHRgTG1wX21Aa1Q4KG18NFpzNG9JPVdDOTdvPD5mNnF0Q3cyWGY4Z1dYdzhIMCt8VEl2XzMxCisocFhpYDllSyNoSjtzPF45RFV9YD5sQHtHfWR4e09HSH5ybllHRiFMfFM8SFkjYF5IVU1IO200eSs4IXNrPD9WOF52JTdhVTJ9WTJ0Y2d3Cis/N3Uke3NnR2RLSzsxUGUrKk95MXYkWThzS3M7KCQ2OCYhKDJuQighRVN1ZWstY3t3aDZkTFRaNTZIbT5ZSWBVNVBeaj11QnxoSUVaSFUmCis3OTBWU3pvQ0lAfnkqNk1WYVY3Zyl1a3pWJHlSTEU5WWdZPngtan03NHZSfG1wMFc5M3w2OVd7clIxXm5GNyEhRH4/MDcwJTVeUysoaj0hCitEeUpRJXNgPC1uaGUjOXVlTDFlSkxFdSFGN2MmM0wkQG5TQmd6TnUwI2Q3eU8xVnhAR15oOz01bVU2cyQpaUAoJSFeKGQpO3tMZl85QUVNCistd3RIbjFTcFdIV0t9K1p5NkhCP0I7Wnk2dSlPZDhJeFNqe0lyc3RFSUVZLWhzTUgteGBBeUpRUjRaTVEmZ2RvKHVob25IVnFkRTlvLWk2CisjJTZDb1JraH54R1dJQXNPMHQxRnU1ajEtcUdjWkQkQHFOQTZWa1h4cDZySEh3WX00UEtQKG9Ab0VqKHdkUyZCQX4kMGRuYmtVX0BfX0BmCis/N0YlPSp4ZztnRmwhWTApJFhrN3g8Yn1CPmNqND1zQWp1KyhmKXEpd1IhfFplZWkxa28zOU5LSGB5KGAyemcrKDs7YyZQQURHWV8mRyVtCitpPlYqPyRRaFIpaFpXOD9SRkpXfTxaSmhsJk1jd0tiPzctOVVvMX0yLTlJTm10K2Vqb1NaZEItdlZ7KFhUdChwRSlhPihoR0czO2EzM0VQCitfSWReUGhTSHBsN2FEV0xrbk9lV0kqX2B4fURzXzNXNE9hMUdqOFBJNGN3QkRibWtgYFk5PnMpVkpBRk94JEReJnRSPVReeU9tR2NFLVpoCiswV0h4VUN6MTBnOXU7K3BRV34kSVpOYkM0LXtpR0I4ZXsjYWtncklwRjFnVH4hc1djSE9XVislSDBPdEhOdF5mfUR3SGB9a2coOFd6SVU8CitmbWhXNE5EP2xjck05ZShrPDZqJCNvUTFMTU57akFYVns1Uz93fnhpX1A8dXk0SnVjaDgqRGRwNUw5eSZmNHJEWk1fPE56VXBNJXhJOzN9Cis9MlkoSzQ5NkdVMGN7Tkk3ZllGNWFRM35yRG5jeDlFMloydDhjLWRXUShmYF91UUVNZk9FX0lLJjtfbCV1RSR8OHM/OU02TGQrZiVGWXtqCitKZSo7aVUwfFhRUjAwME84Xk9ZN3leTyZWcTJucWxJKWd1NF42YVdBS2FBfE5hYiMhVExiMXp8VmFBYXc2YjFyYXM/T0khTitEYTBCPVUyCis9c1RMcmtWYUdhQUg2Pz09cWNJLU83dCNSVVAxKHp+TjFJKTN8PXg5YShjNUJhWC18aVYqTDBwezhSLUsyWGB+WWE/PiZ0WTEtOTZae3RsCitJc0FPWDNRVGtyfGFsKEkqeT1RNiMyaHFFc2s1P2U+X2ZOaiRWJkY+UUJVI2xOJEBxS2RVPzc8eFJDZ2EjZyYzWGhMQ15KKz5FOEZSJm1oCiskOWxsUTc5eW5jRmg3ZzhxO3dgdjVGKCtJRH02XzVoKzU0UXV3aUFqYD5geENFcDh+ekxOYENHckwwYHE4Y0dwPkYkUyU+eXcqQGV5dnZYCisqb2VmRU1VRzN8MzNFV1QyNTE9MkRRazlXMVlRdjtmcDZ7QFhhRnxHekUxI1pMT15MWFZTNHd6NDREaDJ4SjFKY2ZGVUNoIUU8bUQ7UThGCis4aWleT21YKClWSWk1UUUoNjIhcHxNMnNxeS0hRFM9IXE8ez0wbkFrKjt0Y1IzKjIhUzZzN3I0ODxWeSRNfEl4blchLXooVWJgTGtuX0o/CitqNVVXMXQ5WjI2fnYmcFhOY0tpYWtpJnpGKExteT9lS1R0czdFSE0zMCpKbitPIUNpe0F3ITYjNW00bkNsTVh2T2dXMDhYZilnRyZLPTQ+CitHKWcqMjVUZTZRbnJXZEoqXndoPUs4I053bDJzSyExSkpLZTtCSmFIYTdRb1M9YDhMXjdwI0ZxVUwyRytNSSFUZCNqe2FfTDsmXnR6VyRfCit4QVJyZCpBKCpJY3M0UDlrdXg5dXxSMzNucDR5dWZlN3teTDhreldyJDlVfktfNnVVdUBnNnROWEcmNSRaJGN2PkNuTS03JitnWEhVVSRtCisyMjx3SHpeWDctPjhUOzA2akxednUheGJwSVBoNHNyIV5sI2YmXkxeS0MoJDRSJXNrSXJfPDE5R0N5TTV3Zyo/QHBXT0g5OzAjT35pVFU2CisqNStlPykxfE8xbE1TbUFKY0hKbyheeTgzNHBzOUkyY3hmTGJYTDVVU2VRfFQkRj5WXmdmdmU4fmU4Qj13NT0kPykoIWo1Rl9JSypYJStfCisjZT1JfkxQYUpkbUwkVmE5JCUjY2NeNkRvVkF2K0Q+Xyp+V0t2QVJeNCZOeThhNDw7LX5DakQhITRZZ2lRdVNqfWR3QWYpU2ducDV5TmIlCitHKTdeaHpuVEt6cTFhQztkMFVnOWc1OWt0QWJWc1V1OEFGZHlzI3ZhdiYtRG9GWSVJWFdWaU08ZFlHYFhQaGFKT25pe3Y+TWlPNHFLYmVkCishe0w9MShIMmlROCk/fmR+YUFsNUtnYiNKM24+S1o+fjxRKSoyJVd2dXJ6QFhLUWE1KzdQbz12X1ItLVJ5TUxAT0xGX0BqRG89bHkrNG9MCitHZS1DKzxXMzUmaXhJZ04wVnclZkVSRlhlcSFnUEwhVzV1Vj8jY0lCaUJUNDU0MkFGKzRPJHNmODlSWXsweTFQc25kQ2wtd1VAeXZFaEF5Cit6a3xxVFBPd0c7TjY5eys7Rzc+SUVGUTlgWUw2KWRRM3ooWFQ9bjE5QXEyNz88aFk0bDFqM2FlJSgqa0Z9WUBsIW5NbEolaz94N2Y4akNsCitiMyRqUz5vVkF9eSpoaHB2b1daRn5pTW5afl8oaFVkO19HOClobFQzMm13e1BEM142cWAocD5NeERYeGRiVV5XemQ0PldQKzFIPGw3OTVSCitRJlo4RG1xalQ5UWp7K0V8ZmB1Uk9FNmN+QjZiWDYjVjVsPEcyJHQhclhpUEMjeTxjb1dQcUZvWHhTaWZ5SVdVb25sNUs2TXRpa2cqfCVJCis3Q3twPSN3d0VxITk+fTkkXiNKZiUxUE0rO3xIMClISFNkcSU7QCUwVzNYUm00RyF4UHZ7MD4pZVdnME1JRmVsZGd5KitTN2tEUTlrcUgoCitEIXNGRmNlRGFsVmQ4cVFKRn5hfHJ9NTRwMDVFYnxXWDIkQGVQN0lVPTNgQHJ3NURBcFAwJWZjZnBKb3ZeRFhSblFmeyU8Z2BLcyVfUFpoCitnanl1WWsyMkBDRGQwTkZXWlkjX0MjX0YpT1c2K1lEJjZXRE1RdzZWKlNjOz5IKHBUU3s8QElLKGdwaWkxPzh+WUd5XjlgNmQ5SWZadzcjCit9RjdmdXB0Xmo0aVZtMGpUSGlZZS1PV2ZuMDA5OTh4d2piRTJ5e1FUam9qYjFQZXVJQmBrb3E0WVhzYTQ1aCl4PlMmSmNBXiZDdWB8KUJWCitQfkQ9NHsoJUUpfnReI29ZJStqcSglY01HWjk7Skl7LWFZb1M8JlQtMndxTVpzaFMoYyt+UUg2Nl9gPFlwKWZNPn1YPWpGdTNEeH5vWj0yCit7PXVPJGFadExTcW0tU0paZm5lSiNKfGNzZHc7TEdaY18mNj8xSXFlZ1kkS0o2fjUzUEd5Uz8jQUB7WnVYJU1kbTc8TExEdk5JOyR1OypwCitFI3MhbXY8OCk5I0srYjExYXtScSYrVHxtcjFBYjdFU0V7ekZpVTZ+aT0lYGRGMz5oP2Q2SWRlcSh2SCFLUmkhVnFXeW9LU1R8MmRlWjMqCitlIXx5S0JnOSppb2BoPUJadVZQY1JxI3RaSWRwRmwtN2F1bkBvT0Z+bm9YZVctJn0kfDx1O29TfD9YLVZAd3lLRzZCTz9gP3Z4NTJTK2NSCitTfi1reisySj9DIVpNWnpfIzc+V0BhKTV5YU5sM2NMQChNZXI5a3pPUzFsI0gzQVNpMEt9N2E/dGpKWnpoSVpvaG97PmVhRjQmMUphTm1OCisyMThEMn50e1VgfldrWjNEJVZNQSs5MnNhTjFpYDlIZj0mcVFvYnk0fmpYYzRnfGRuUjJuQ0R+QTViI2E7Z15lPUthKFJ4Jjc1TnFKdjAhCis3cWI2dipxZ29FdCpFR1h2bF9jWj5odHA/Q3UoOGw+Mnt5Knt5P2ooJkxDdWFoRTwwTisjVSU3O3VVeU18KmlHc0ZWb0dYa0AkZSVMOTN2CitOSUtWR3ohOStgdmp9MzE0dD93a2xTUCR+V3YhTk5jfTVTaz9NfUxQYjlIcmRVQSZZbzBfa3UrQjQwUDhAOGZ6WnN2OWIqY2VaMkpIXnBqCit3UmEqSFRTVjUhVTMtTl45MDZ0d0NaZ1gjM3FLJFBWaG5xbFg5aDBDOW85ZWsmenwxOS1AJk9odFRzY3tnQ1J1MUt7I3JxeV5TbzdqWV85CitDYVQkYGhQT0E2USRKZl9sNDZhPHZGSzR6Y0ZaZD15JnYzVFE2e1RXP0k/TnBTZyp9eDxMT2Z5aFhYVXo5a1BTck51ZF8oKUt6RG4lNE13Cis5I2dlJTI8WEJ7clFhQnM/X1Q+ezdyd196UzU2SDJeQE9NWj1aY15QUCZwSl5rVH5rYGVYJkEkNmFLWmpKY3d6KXcpSGhjRnIwZFFRVEFQCit7dDklR21SejJQVENvIVFnUlg+JDI2aWFTMjFpUkcrKDxTTFUjYUQkciZAZkZ+fW4odE0pVnVZQTJUfXp4aTFnP0UpZGpMdmpNbk9zJipxCis7RTRQeUZCSWticlZnPV41ITdsZXVVWDF2U2xTY1FEZGZARzlweCpsNGh9X0ZZMEImV3tXVylYNStxTS0wWkp4VCpmKChNenBfUHN4MDYwCitOfE1tMUFQVmR2Ki1SYnFjXlFuSiZtbiNyaWVkdGtWUGBkX0tYfiNOOWZAMDglIU1CMD40M3JOY0YqdSF2ektCPmY9JWM1Z2J3ZmB7PDRfCithcDg5JXAocVpUMTZERUlmNk1UXmZeb2xmVHMoN1V6aj9gQVBqYkU+Wm4heD9sR2oqQ0wlWTdtKykocmQjRmhqe3BBYHt9KVV6NGcyZi0+CitwNU9WTFNwQWpIMCQxRiR6NlM5Qn0rYzJuVXt4Zk5vd005UjZaI1BuT30wZmJaTWRMOVkoJntgcDZ5akpJemdlSUZXVFNTdUxXTzZJbyV0CitadCh1PDZuPnlGJDx0fWQzeC1VNk80RldtVU03S3dvVH1GMX5xbSg4RkVFaj0kJkxmKlN5RmtucWZTYUhyNC07QUBNJmxiUWNGYEd0aHIqCit5SlAtMD9qNX4qZWVuTU11fVFLQ2xANmpoMm5valAkKi0xRHI7OWBlVElMSzBudXk0MnhKYDBRNHF2fTZRe3lyaSZYdUpGTC02VFNUODJ4CitqYjA4M1J4Y2V6MlNtbmNiVmxleVNYfjA/WihVb2A8KmI2KX4wS25GTG0taFopaSlnNV84NzIoeWFmeXp6dCttPjY2OUskZWFGTzlGcWYoCit5VjwoJEI1VGMwSiM0VjI0NU1KX2JsWCV2WnFsZVZMa3NLNTNmUCloPkA2YVdBSzJtdGV5N0R2cXRPKWRaZTAwMUJiMDAwc0kwMDN9bGE0CismVXFYPjQ7WlZzJlkzV0ctLWRyQnVPZytifDVoYHp5SGdGYjhuYDBtSEp4dSopdHo3M2ZpclpLYDFfT00pYikkJV84X0RBYFd6cHpVRVowCit6P3dZJEh5bTklRyh9PFAodkklM0lXdFI+bSRlfVNVcDQoPEd2YFNhfm88Vzw5XjtvPzQyVHdNV0dVb0JVY1pSYmVMZyRBM2RfUVh0ZkxoCitlaCNGJlUqeGZrKX1Lbi1Kbj9HI3R0ZiFNNGl5dDJMczV0X3BqSChhKzJpaWM4bSFvPUZeKEchZmEkd3wtd0l4a2U7JmN1MiM8Nj8xSlZFCis8b3UteHxiYVQzamtHcHJCN2pUIWJvRFp5dldLOUtlJno+KiVScU1vNDR3YEdYcVo2Nk9gaXd2LWxMaVdxc09GUnQpTzIocUtOZypCSkdsCisxKTc5WVdeVntZSTkhSzJqYUNTYWVjWHxSPDtLblJ3RCFZU34qMWxZPzFDZ1M4VG9Pe1E1VCVtPGl1Z05AUG1yOVo+M2AxVUlzeyF1ISVwCis7PWRMaEAqPlE3S29HRjdxMHlfMmdveG1gR0IoV2kmJnIpYnVBYWZ5fXIkTEc7WWMyYks8O1cjbVh3enQxWTwwXyZBQU9TN0FNdjdWKFU9CitXZVh+PVBzPkY9VFhzZHg4YzZMJjIoPSErd0UxSnw4QWZ3eWpBR0dIUE9Ab3BZX2NyeV59XyNvK0xfdFlye0VjVHI1WT1xd358fkVrP3tFCit6WUdSOC0oVFAwXl4xU3x2OGsyeXleUHRoNzl4K2Y1V0dzK2dzM2hJd283PXZXJjlaYjlKMn5KRSo9OXN3aU8odDl7NHFnJT5wNVp3aT19Cit3VCk5WCZBNitHNldmd31VV2dYd0VhIzZydlApaD5ANmFXQUsybXRleTdEdjlUaEdeZGMwMDN3UjAwMDtPMDAzfWxhNCZVcVg+NDtaV015CishMlduKkQ8WD5WPldhQ3lCfE8+NWdnNVdWWUgzQFFOYFRweE9CTHRPfD40dU95YUhfJF5WVnI3a19FdnNGenYkRUBkLWBTUHFTaDdyZEM9Cit+ezRjVl56YWBCV1VvKEdBb2xaeHc+OGdhY1ZPc3omVnlvSDB1M2xLJW08JFhFZGQ5YmhsND00JTN4bmJ0diRqbTUyUyhyOCptRzI8MjEpCitSM2t7PnNwSXg+SmcxfnRXSEw/NCU2LSZNZzZAcFd5eUhNYWUkQWFYc1pNZkpqPj94KXlNWnZvYj47VD5qP08xU24rN0UhUEBMRnp0P1F9CithblBTZFM7OH53b0x8bUdadmxWJEheOEBkJnpybGlIIXReM2tLYlNvS2p5ZUVYQzQxIT52ITtkRDh9ZGFVKk10M0I7MEY8cjQzRzVESUdHCitKUWYybzJmcWd3MWpWI1d3Zkt5M1FCYXRYXjJ9flBIVi1ISXhxflo+IWBIbVhgd2Ryb3c5LStHbXVZRnspMnZVIykrUEw3UjZaRkQpS0N7Cit+WG5OPzNsRCpwTHYqND00MjAkNzktRGpHQURMflJ5SXBTK15aKV9YREwleW1JJTJ8KWxneFJwWXcxOSZRVj15dFRRdWpJQ1p5O0tTK3A+CitzfGI+d3FiRTI1fHkpR0dJZkwxY2tCQyRZd1J0P1hsT3hOVWNoQTU4KkN9ejRHYSgjKjFqOz1jVkVyQFVMbFlWK2ZnWE9KViNnZ2UmaWA3CitTMXR6Z19ldH0kKVUoU1Z9O0s3YDVtS3F0RGVUTlVpdmAyTH5ANis3WnRkeWo7PUZpPWhMPkk9M3A7MFp6a3RnayFUdGU3NmtiVWsqU2U4CisySGNfSCsmVH0jdDRsSiRLMnlMZT5NVGo9QVk0T3lHSnd9YE1LT29rT0swLXEyUTRmfiE1K0BMZlZ6VGEyKH13b2p4JlYyTHdsSEBZNWVXCit7Sl44WTc3SllxdSpNdnlmaE9AeElHRXtCWW0mdGIwdzhaaEE9Zik/QEpHdDl6bztKc3ZFOEw7LVpQc1Z9O3kkN1lvRFlwJCpPKXRRT0oyCit+dF84b2l9KiFtOXhsbT1RKHdEUT04VkFGPkBMMVYlfVY9RlpMWThmV088QXh2Qzw8aCpwSWMlPzt6ZH56YE8tP0dqNy1eME5kfTJGbm1SCithal8lbTFeTXk3bGFiam5+OEFHVkteQWVJODA+R05JLVBNWi1xRXhPQiUwX3RMbEdTaDc+PiFEdnAlSFh8Tj8wOG1RPDFRWS1PMDA7b3tsCitAPj94TCshdyUwUlJBbDB7e1JRMDAwMVJYPmMhZmJaS21KRkpAX01XcGpDUmJZKlFXYUN2UH4hRVcweTQ4OGorLXI3U2BBVHhGejtNMV5TCishK2BiQjBYcWgmT3ZsPTYoVihRZGBUTm5iKGxsXiZGbDYkKk5BaWhvb0xDfF9SUEtETUNsbVhzPlYhdjNabUtQaDhiUWUpRElPTlVBLVQ0Cit5cytLeX5wNnRJaCRnP05lRSFYP2M3NCtRVk1+OWl2dmNIU3klYD9HWkhZWUAwZDVBck14e2hwZ25wOVBBciRIQW0zMG4kYnpkKEZabzlTCisqQ0BIZDRCNkc5cUVsaUhrQyg5JjZ9YilzNDxyI2UkeTJoVTY4VX1CVVZ0SzV5d0t3OVhnXnRjP01uOGYzXkImdT83NV8pIT0wdmh+Y1BkCitQVUNaWGhodjtZMEleeFFKLTJWcVpQYml3aU5sd2M+bmtAZyl6Zz1xI21eJmY9blpRdGhWYFkhVj9La3BmQTVNT0BgZV5TZ1VBNEwpNTx1CitrdyEqUyFWe0YqfCZyOU18M09APTJhOFVnUWVBckswJGBpO2BCcl5vWmI8JENYaERSbFRmQ0k8JV5KNyNfVkZ4RGRPWEliYn5xODgrTWVfCit3IWRze1NzKnB7P0xNdDtaNVpAb1heTUR3ezNeb296RzhYNVopT096MGhIdldzdjM2JUI0dXJMM3IjJlljM0gmUy1oVFEyYjluZjk+MnUzCitJdWZ+M1Q7UmRoRnlkMWlzLWklYm57U1F6fTB8WFFSMDAwTzheT1k3eVZOJHdjdmpoTUR7dE4mQjZhV0FLYUF8TmFiIyFUTGIxIVVmWEo9Citfe1hEKURnamFGTjQrY3AkXypSTFIpaGYxd1M2eTRofTVBemF0R3ZHUmE5VXZIckslZ2JjPTA9ZU1OaE5XQXtTR2daQ3xnO3A3dDc/aWVDCitLQFVxRHNqYzwkMlliUj8kMzF0WnQrLWgjYSkhdClhUjlwQ3NZRGtpeVZjIWBZIWI7cXJLNzsmfH5GcE5KP3FSa31OdUkhVE49fEJAaGghCitrSVpLTj1tQ3RVa2xuOHcwN3EhcktCMU9tVGdfMV5JallnOXFBXk80V1ZIVEVAYSZoKDx3YyF3fERvQ2B7QkFaak8qQH0zVCo9fW5UbH1yCitxV0xvd3JCdFlvbm9DNyRsSDh6O0cjYmVZbThgMCRxNT4+Z3hFZDhpZkx1K3o1cCFhQ2oraUtUPmsja0grUilsWGg5RU93RDJmJCNAdnF6Cit1bGZ1TDQrQGJ+QU48b3QoJHN4VkRIcEVhaz5yO1RhRUNeNHQ9byZMbzB5dHVnZiNecmp7ZTlwTGh1NH0yYS09RkxYQCRJa3dVQ09vVVZPCis/dGhTX1o5ZXdROGZDQDcocTZEdjtXZz5lcUN4MChWVFlVeExeSEJBZmJOXzMjWEVHPCN4QjBvRTBSO3MzMmdCXmAlJkZub0JudzIxTEBXCit9NVFBJD9kTks8T2xVX1V2PEpsJFZ9TUNKNSl6KWY8KzZAfEZecGdkO1YxYmVWPUVDPEAmbj5ANmB5ckd1cThkS1pibW8xPjJ6U1NtUXQ4CittLSswKERQWlU4dVh9MnlYTlJtemBrPX1lT0stPClzJENyQEt7SnlXJmA+ekFOSU0wel9kI0BmRGsyN1dsI28tYjk4eypKNjFlMDFqNHBwCitKOWZJZl90cCspVWAoTitSaiE9bCs7STkjSWlBR09JVl8+TnVFTjRvdX1yR1lYODBlO01FYlNBd05FLWpHeFl3TmpTUEsyb0l4a1YhblV5CitOQXNgPTJXOEg5Tz82RlFDUjcoZiVQczN9VndPMHk3a2h7TGlVbGVLNV93SFE+Qko4YV9aZktiQChNMHFGUShaV21YX0UkMyEyQWAyPVkyCitjbHkqWUQ9Y2RQeUNBenlBYjBafWohP0R1N0tZcWkpblRKODxCZDtPUTZ0OT5iclBQPWx0TDNkRCUyMTxlUDYxNUU/JFJlXzM7NldoPGZsCit5UkJzU3xtbyEtI1daeDlhfjdBPlE2Xj9zdDNPWXxQYVNkVnBEbjFmYHwhZG1hSmRGZTJQMkpoOWA2PlY3bCRxT3lgKXpROCNpR3ZDRnYrCitVQFJsXkFRKCl7LURsbWB0R3U5S0NTJD8rLT12fUttU2t0QDZ+Mj17fUB8JWEmTUd0SXUtTk4oNU57U0J7TyoqJTNDYEk3SXMyTTF1QEFGCitvPmF8fVVKRFcqKXxUQjg2Q35Laj5TQ2A3JG9qQ0JGaEMjVkJOSVA9TitYZU0wSXBCNjwpelB3Nk4mSjRCfnlmUXZsfm50aGVBT0BQRXw/CisoWjctKzZoTn1LZEFnQFcoRWA7Wk8yPGU7UTE9Q0UhYzdSYj0mXldVQldiRTA8bjU4cWVoYGFYYzFmdH1fUE9pZEtfMEJjKWpXSzdOMEd+CitTVjVPITE/YC15MGA2ezQ4dFh2WFp9ZDZxZElxYnV3JChyaHdLYzJyI2UwX1FJNkBPaVBeWmBUT01ZeUJOV1FlIUhmblVWcy0ydSlgWHRLCitBbnN2VmR7Qi0wcykyQTlXNHUrRXN6aTteNERxSk5BMWBeIUp4cXQmaD9BN2BNdmczVz1saXRpfm1Na3lFIUE/NjhANFhvWGt1VHxFe0tNCishaDVLKVB6TDhFeGQobSojVy15NGUhfmMmO2YkX0hAUXBgaTEhb3o0e0NTalBURE84VWtpLVclT1QlPU95ZGNtXyFBPFI0SGNLMkokJmg9CitQI0V4bWU4VFc5TkZBRSNLczJAWD5gOFhEOURmNz9qe05wZmVJYyhLbj52c2llZnFlK0JoY2ZTPTwqJUdjTnFRNzJ4TFVuPCEhJUZUX0opCitDTmBIK2tDalM5WU85S1FIMDAwMDgwUH5kPU40NUpsQHNTMXEwSjlZVTAyS2ZMMEJ+dD1GTGlXalk7IU1mYiMhRTViWSl+TmFDeX5PWkV4CitFKTVkUTk4IUtwQUo1NFFHI1ZGUUJaTHkpOXYmQD9UWXRWTmR2MHdiTWNDSzlRVWxwVWshZjhRUFRWb2BFWjE4cU17OX08Yj05Z3B8JisoCitYWmAlMl4hR09JdkQpVjx6JUtZMExQSFFDVnBydUQoYTNkT1lQOHRqTUFIekI1V1RAMHEmMjc0bytFUjM8OThUe05GJlpBUE94P04qMilpCitrQmMkckNCU1ErfE5ZQGc5V0d9eCN5JnxTLUojbWdwIU9LKjNRTkNVfXU5dzwreXR6V1I+TXZZIz5vR0hCPEtDXiEpaEVobHxaPkF5YXMwCis3UWJEO0o+NSo5WTIyYzIoQGcoJGFxPSFjSXlgIUw1Kzkkd249KU5XTmo4K0lMJnI7QFpPSm9gJVotWkNpbVZqfVh+QCY1JntLOGBIV3QjCitMWjVnRVBBJCstcntEUksya1QpdWwxdGorfElYNn0tMzNAYWRVN1ZifksjUHVFI205JTJDLUlCZG0rWEtBPEJ6aihKe3paKDxDcHY2KlpiCitwKHpYTSFMYVJRQz1iLSpHdDxJSWhQYVYmWGBYKXdXTU55ZCN+QDd3Y1NLc0c8M29pOGpWTDh4eC1BaERERTV5S35pSVZPPmkhcDNvRWFBCis3QDg0fUNfNFdhdVEkWX1+dWZqXzZKYThSR0d4TGdXMHlsbSZTNThPZ1gpTXdET3luJHVgfCM/Qk5ebk95KmIyVnBFX2hFdnxJdXpKMU9vCitTdjF5OWFSQWArK3hhdjV+Jl5YMSUyeiRYZmcmOWZ+UjNDRj0tez5BJVZpT0BidH16KShXSGhvQFhWdl9sZDk5KUF7TjFzQ0EqP09LP1VgCitTK09vZWxNeiN2bHY7emRGX202TiopdyklRilzPkFhSkpGezZ7LT58dWhlYXNJND8zK1RSWnMhMUYjQzdhKkZkb1RJTk1LQFlTY20ydDVKCitqayZUQGwhTT1BQSsqOzQrQl47KmpXViY1aCpEdDhmYkpJWkxeS2hzPSlzYHUmdEBzfCs9SE9ENyt2Y0kqbnA+c0tLXlJOfV53ZlNaQG02CitpaD1GZCNzQGEjTDVPZG99VXw1Mz9ZWlItN2NtLTNtaVNGcnhoaDIrOVNXdDgpS1U8QT9WRmwtPHpFVUFAciZPXnc/QEZ+NCsjbClPUkhOCitAa3ZpNDtsQG9eRXd3PzxnOXUwbjJYQyZlZl9oVlEmZF8tJDtFK21AczQ+NCZTVkMyRVIlSj1yMHQ+R0lweXY+aTdhTTNBanhBQyZjRkM1CitUajhseiVZKUppM1Qoe2pXIVcjSkopVXA5RE5JJVlNNFFFaEElSmhXJFJ3UEZFSzJRZmlCX0E0bC1Zel4pNFRHPUBaVkNuYn1yMnktZkRUCit5RzI4NTJHWlhRWExyWmdvfUZMVVNtQGFfN3FAOElmJEp+QWJIYHVYZlNSekdwbjx7P3dfcTghOC0jVTJWRGRjMT0pejlVUlEzOGVKKndqCitFJEdNaS0rOFl9NGtvYDJpdTQwTTRIMXQqUDlSeHVJUmRaeXxUKFl0dE83NmFoR0ZBYU82Uz1Tc0Rkcm1mRWtQITByc2g/UjhMQn1nNkpRCiswQnoha3VLI0dEQylCP2deX1U7LUZPb0R8WSZCUnhFXjB6cWl3M3I2STwhYk82ZEo9NWRHMz9xZV8pT195TlJFZ2A8c2Rfe2QlcF9WTUQ3CitaPihQRkRxP1BsXz8peDAyPE09d2pXNEY+KnNXSmsrXzhnQ0pDWD5OcCFXNytmYjFMYlFRIXB0UmJxVE5Xcnl5SHJ9ZVpyYXJKPDd2MDRwCis+RUJoTk9SWVUrTHpLTVFtdypDMlV3NTZnM2c1bUl6QmNsM0RoR0w5dXFAdjdTN2R2diZWSF5zR3VtaTEkODUoNCZmc31aLXJtQTglPGorCitNJnYwUkBAeG1ZTzU7YDZwNmcqezReZ1lmeTFITEBKbnl5X2RTMEQlNDQkeSg+PHspTWB9SF5jXlpVPjQmayZNJlZmTWBTKztyWFRja2VwCit4WiZUMz01WjJGS1k0QmJRe21gd3JtZmRLMTc3WCZhJTR0KU9aNTJ8YGVReE0peTQ2T01AUHg1KHNrNVA8aTZQKU4yY0xxJmd2YzBUZjUzCit8KDZWKG0pQ3IyIU1vTyZgYUIrXl9NaCFLJW9tWHt7PCpZcTVFSDg1bDgmfWB8XzRseTZuO2JHez51KE9BNUwkV0tKVG0+MzM7T0s8bGBqCitPaU1WJCM3UVJYIUEkM2BUMFlfWlV0ckN5XzhRQjMqNVZDeDNsNGB7bWtpbShMdGM/USVSc1dJVEZ+WH1+TTY5QDJvd1FRSWQtP1dsdXZ4Cit3NWJXejsoNUd0anotI1ZyJV9XUjJlMnJIJj8/aHEoMU1QZlk+c3V1Wj0pLWdJO1NGfDhVUn5fb2pSRjRIOyYtI0l6Jm12SX5AK3h0fngxCis+fiFwZGtmfmFeelE+bkpxLWVNKSFTdilTQGBCb2xwVkFlSCs5XkNoKUpLPjQkRD1Kc2ZoUzR3bHp3PmVqbzUrdWIhR2IhKSRjVkMhMjtTCitmRVFhOHREamoxbE8+Szd6SWIkPHIzJCs2TD91PTM3Zn10OXw8UmFyWSRoSDVHcXx6KUBuV1lSLSlDZGVTUWpKXjlRYCV4RnhJP3hyTzc9CisqNylpQnY/UipBU356bFZ6UTk1V3lhKngxWEhyPk5XKW9+Tig+eVFgX1pLZSlgKHp4ck4hO3tNP19vN21OSE4jVW1LTUoyZElgVUQ4JWhBCiswfSkmOSRtJGF2bkpAISU4LXItIWhmc2VTdj1oKyEqPUpUPW5TZ1diX3xVTzlLUUgwMDAwODBQfmQ9TjEtblQrWnpjMDBDcE14MDFwNUYwCitCfnQ9RkxpV2pZOyFNbFgpYlZpI2FUXnsrYyotdmAmU1NTOGZ8NT8kfFEzTyg3K357Pn4zUmN2eER0azxQWmJ+RW0xYnBHQVdRJHlGSV50CitVLTNnPHd0SkE3IX1eZjZyREN6X1JsVFlyUXlhWiE+dmkzXiZXUUR6JCRoSmhWfC0oRSg+YnZZelpkbSt1fVZIbEU0NWxJO3NmYn5hYXVQCit2SitNYWA3RilTaHloI2hndWJrYzh7ezhtVGVhPFJUXlI5N2dzb1orVVJuLVd5Mjx1d2U3Tnk+fCtALWFqWiRKSX5ANlVJYD4oMHI+cm5qCit7PWQreWQme3c4SjtNV2VTe3NrVFhTRGA+dztEOTBXNyZgWWwkZ3tyZ31ZPClVO1NGfWNOamoqPVpATHVwZUgjeGdpcjRmNWwrVGl5eTN3CitOU3ZoM1cxN1k9Qiooe3cxSH1zVlQhTStlKVFHenZXJXt4bVktSmU3ail5VD1Kc1NqVyZHRzdjYlpeK0Y3UCtNNmElZWZ2SFJ3cWhVKFA3CiszQjZKQ34tUyFiMCReVWJRUXNOY2VHQ0lLYXdhemhAan0hdE0qVGRnP0s3Tz4pMSNDMlkzY14oemZofGViUCFTNzdLKSR0KnZOOD5ESX11CitiPWghaFNGSTUrJGNRUnVIRSleP0ZDVmc/TXlPSklCV0BeYysmTUR7N3F4NmUmWCE0TG5mdEE+ZzxsQ1BZanpOPCgoMmw9MmMtfH11dFBICitTOHAleVlEajVEc21FKGE+U2FJRG4+fDFCUzEjNyMjaHtfelRtQkBUOEVHZXtJPio0S2BnZyF5UXUrOW9uIXJ0OXx4Vj5kYWtpc3ZQSEIpCistbkk1PFdoQmZ1KXZ5UFdMKXBjP3stO1cwJnZHYDhBV3hxKyRXanZIUCYkeytaNDtFMThxZSZkNjV5QzlxSmlSeVlnTXImYF9tKT9wS1RuCitXO0I+eUIlSCgqUldQcG01Xkp0PStLfHQxUWMoVUhhXnp1WDk2d3hNN1g3WmdveW15Vz5fXj09JDxDPnd8aTRqXnVHQUpuSDF7MWQ/a2JmCitDaHlaXn14Ui1vYHhzJUQrTThIaXx9cUdJS3g2WiR2Un1sTDdOOVYmV1ZyP0FyWEsqYVY3PmxEeXo5RkJgOFdlUWFaJUFodCg4aE1vfWl+CitlVjdgS3E2ZFZBMFFGcF4ma1ZyZ28wZSlkXz9pe282fHFWbFdxfmgmalE8VDtgTyVBYm8/Z3k2enBTejFMfUV5ISNiVyYpdXxRb3o9M0w8CitMd0VwRSg2Y016QWV+SUQ8bkB4eE1mRiQ7JVpseVFocGU1M0x4bV4wY3xNMGJ1QVFILT07ez4jXlZHWGg/WD9MclBsOCExQ0k4cmdLKm4+CitFM0cmZ2BkP05Oa1d4dSs7WE9kbCoqZHIqeiRsX2t8MUZ+fnYoNWw0NTlIRyk2LUchYXpZSVAlT1FDcXI7b2plSFBuQ282T2ZSKDhnc1lHCit6UWhMbXdHJDdyZXo2RUJDVkRyVm48KzNkejE5KXo9bzBMZi1yR0R6fF9xKVBHVkdgYXtrKDloRCRUKE1RQV5nX1hUNy1zQXoxQWozY3F1CitmRXBnQ01tOzRLek1LODJCVGdWP0FDZChFT3ExcG4+eXJAZkFffH10RTRTflVlR2h4PGw4Zmc5aHJKVitYJUYmVl81bz1VckstcGN1UCY/Citwbjc0Y0Q3UTshQlUxNGlOSGdNIThpTzk5KjtrVW9QTD99RjB2eT52RFRLdlNpfVprR0JeckxqVXhBKWdWaztSYTMrZSR+QmV6PjNLMzdSCitvcndrVSohcWRjSG1VXjYlXyRRangyaih4cDBhaFBWWH1+QXRqN09PX00pMnlgQlNEPUMxeDdxXmBkIyElPzcjUjxoWT5AJV4/RjZnbzNvCitlUFl8JkktekktXil3YD9GPU5gM209az8tVzRoR1VZKHJkYzNwUHgzQW5qUU0mckMxRjtsV1huQjt2WjZPP1pxOHkqTDBuN1FyOyFZLTR9Cis7cSgmMjMmUnl2NGBgVks+c0BUVz8mRCNjRT1HWl9aUFBkWCYxZXk7fXokT3I9c1BQfGcjWjI5YzR6VXl0QUArQFBgPVlBPVorYTg5RjBOCitMS3s8UVRGcHExTGxJIVAzM2omYy1zbjxrQ1lMeWtWVWJYPWNJNT97WFZJcUVJfHRaNEpAalZaQFhqfDt0dkNTK0ZNdFFeeGVaSHt9N2NOCitDQ0x2IyRwWH14VV5eSGVYV2R5JF5Oez1fZVNZe2JUJSE1MGY1cyVmOWcxNUxnYlV8YEI/SHomaWFpKEN2amNjYTsjaE5pQHxANHV8M3U4Cis1T1dNRy1wYk14TEwhJFZnTVdqTlU1UUh0PFpLemhGQCpRQEZnZlA8QDhtU3NKM2ZycXdiT2RPY1YtOGI3bjs0YXhLZ084VWJ3K0xabG1+CitOSXZqTT5nTVBlLT03Mk9eTTFvTkBEZmE/YnU3cDhyMEJXZ2sjXiQteUdEamwyNDE+RU8ycipLNVB3RXxDa0R+I25EWTFvTUtOWHIzWk9kCitsQVFFYFR8PF94WHlsbnU1PnwzT35vOWApZjJ8SFk8RjhjP3woUnRNPlArOz4za0wqNzI8WFhJNHdMV0d+cmpjOTJBamVxZTdoYGdnbl84Cisyd2ooM1FPRnZjT21yYFFPeWFLQ2JaIzE+bT5APj5uWnleZVFWb19RPUtvXnlHSmM2X00wJWVLZmNIRlVzMFNeNzU8MWIqQTRyel87RmZDCitxSFJtOFN3M2cqWXhiJkZNMklZMysydGs2KEdNSnM4I25eWXR4bmU5KXA7fVVmP2U0cXlYeGlFdUExOTU/I3B5aDV0Qnhgb1Q7MUZxd1QxCitASmBwM05ue0ljTTArZXw9dCpEcSYrKThCXkQzRyVIR2FgcEVeaUw7cT1ydklyMjM1Mjd5cih3aWR0RXd8NXtXVWFpZFckSkE8bkRwLUtWCis9LU0mfClMKCZ1TTFle0BVLV9KWkIlY3hEO1Q7R31MSEhLQ2FOanBNfEM4WnVIOSY2OypiOEFmJWNNM312fElAS3w8Rl8xSSFCNERGRio9CituU1ZJKSRKUyE0R2hTTWBEOVIkeHlCNishZ1JYKDQ5JmNYX3VyZUxhLWRFMyYrUCRLemtzNDxmJl49WVFQKmh4PFIxTHtsVT1jaVE3V3laCitvQmhTMW5MMXNPMjZZV2ZUfWIkIVYkezBUS1ArZEJ9SFU4QlY0QExeM3pRaXRPZittYm4kVTBaYkJwJHZ3QW05eGJHUExVYSR7NGZnQGAwCituPEdsNVE7T19IdHc/RFhYUnV3R1Jye05zeXs8Wihwdk4oYl97QyRpO1ZzamgzNzBNJkFMJVh2azxefDZ6Xn1nPEdXSCMmdzBqTnZldE5VCismMSt2TXl6Pz9vK2VEdVErQk9NN2omM1g3Kmp5ZitVZHVjZ3AoYHY0YlgyYE1nNkJ7eFhJTm8wdE1YWSRwRG8/Sk5LMy1LNUZlYmk2Qmo5Citxd19uVjVwOWxhdEBUVEN8Pj9FSGdYKkcpSSs7cnxiKHkkI1Ikb1VGVndKaU87fkNZJX1jQ2M5NVI3cDhgRTdtYFlOT2gtQ2pUVVk3TWBLCitRQ1V1KUpEPGxPQEs0dGglfWlNYVh0X0V1WF42Vkd6aEg4LTlqOT9qSD5lR05VZWYhUUZUI3tISSlnI19qUCViKUdKdXBVMj1reWQxUz8+CitaeG1nYEZDYTwydUN7V0ZBR0R2VG4xVVElKzhkR196b3VZfDNndWYkRmhrTlJrJmd0QDtuWDx6Tj9TZGswJCFBdCNBT0pUUSk+e0dBbzkkCitxP2h1X2xGWjE+KGZwN1FeQ0khck9pTHBiRFk/RTVjWTxGZ1VkTnJNRntYSkgqZD9wendodSRtUkt7QyFjM0hJST81Z2w/Yz1tT0VtMmUxCitJdm0mRmojczJfTU85S1FIMDAwMDgwUH5kPU0/YSY0UjhiODgwUHJtVTAyMlRKMEJ+dD1GTHE7ZEZKRTcyWmZTSTFVb0xRWXI1Z1FqK2N4CislaHt9bmB2ITFDJVRZa1I7UWlseF9VK1UqOHgtTFNOfkFHJClKQ0VEZzlpeWtUMkByd1RNX3VlQlpRRDJWSjg5XipsPG0zRFBCRzFtd3s+Cit6SWo3bCFkWFhUTSF0dnVHIUBrKloqK0RvVTtMODhnKih0OHtzR2J+YWdSd1A4dUp0amJEQEJ3PSFjWnh+K35sfjwpbT9DOzZNalNIO3s8CiskdlVBd1VXaWt8NVYwNW5SUWpsZH00dWI8dSo9c3FSNW52amw3RkRZOX54dz17JVBVenVsSD1CTiNXIzRrej9HU1RGOFV1YFBpSDw1I0BtCisqX0dPQ2ZZZkZkWmR5LT5HSEpGc0tMRCg5SiFjRF4tZDVXcmxYfWlsOzducXcjYTYzUzcmRCkrO2c4O3dUOEtIfGJ4VGtaYVZKZV9XfFBTCit6TmYxV0RGND4zYUU7WjlSbzMyRWU3QGEwc3s4PnBZSGxpcX1BN0x0VE5vYmhxKmNIUlhBODlOfmw3ZXI1PmoqSzt4aVJkdylMZEtQTH44CitNZU5YeXhDIVZhTFdVfmhjQElHO1kja1YpNkRpNkluPlNyWkRmI0lOLVZ8MWJYMV8rXiZtbWNEbGRxSnR8bHU+X0lKTFk3R3E4SWRwRENpCityPjhleDtvTjxCaWd5LWVvViNIQT1AeVlOPDVhYVY9RzRTVnl9OE5hZ0A9SGxgajRnJlM4IW40fVA4dTJLK2gzSG17KCNCUmVgME95eE94CityUG0xVChZT31LalZNUSp8WWM9JWFrejF2fTl8KDZPNGNASEQ0anU+eT5pSmZZLWIlYnJmejUleEtMQT96fmxuMiQoUjh0ZTx9elU5Y15YCitZJEx9eEJNISRrISlHbGEwSGdhdCY7cVFucG9NV1FgTTkzI0FpTTxxZ311cns0Ryl6WkZmJHxZYSkxK2NmYk11KzJAfW1tVlM+ZT1sOChYCityO1AjQiZKVz5yZSMteVhjPE1uWkQ2RWFCNCQ/aVVabnQhWVprOFJReHFnKER9PUNTUkcmOW1IJkh6THhgOFZEX0w5a35mYDB8aEctcy1QCitoeWdPe0xOJGMxU35uWENfcF9nb2o/MGl4KkBGTDBwO1BIeUBmeSRGRGE4P08rOHVuMn0qPDZMNG5mfDZaej45Qz5vP3RAP1k1IWVkUEwlCiszI1FRMzBtajg7RmRNYm9faFhWMmZZXm05QzBEJDFjJmw8X3U/RWJ9UzchaCRQJkRla1NyUjM1MCQ8TiN2RnhlTCVIXy13VXkzTiZ3WX1sCitMWG1OJUAhaSU7NFZOWSUoYD8/UlUmYUVBcVkrYlIkOyghezNNQXhoSmkhbTgwckZxRjtNJkdVIys1K1lobDV2QnxVZSVhQU9AeUZxUjQpCitjeGZAMUdeRSZsPTFqel5tX1piYWRsKmVHRnojS0g+SD1QMGZOaTk9c3ckX21MQ2gjOXEpQjwkNCM7eXYzfmduKiFWUTQweGN1QUBLPV9LCit6JWBBQE4+MWRufFg+a2E2Y2huNDZKcTtIalhgdWhnI1B9NWRwPTEkXzAlfFY+dUtIeSpDeTRPNUx0Q0d8KjgoKFRCTVNpezE5PD4jNytCCitELXRVLSt2STgwPDhHNWsxSjdFYkVBSWtkdC1NUllueWZFI0teKEp0dkwmZWF9bGQtaE5aOXQ+JkRoekJoS3YlMThTSlo+Nlo7VnYhY28oCis5KVRMV0pGLWFTVElfeFhIYXhWUjwrSyErXzAkeWUmeFB0VzkyN2xXWnErai19SjdDRWYra2RmKlpKNWpjZCM/UShWU3pkalA4UyhJeTghCispSTRQPUdCRERQTkxDZGR2blpmb0tPQ1c+bEZtOHVmRHE3PDVMKVNrcTxCdEFpQDdgZGVmcTttKlJBeDI4YypRTGRgKTN3I3Z2LT40UVRHCisyUyQ3emR+b3R6VTZ6cFQ4Zkhva25MZWVhLVcta0N3IztaUmkpVCs2Jn0hX3pVYGVMSUFGP1F5d31QZTVmQiRge0A9V01xLSRyeGl0bUhCCitlVG19PnZ2WlBsTFZjJTV8OUVAcDRnRjhrNmt+NTQ4dn49UEdlbDVVPWpIdntCXnlIZz1KdEh5aSo5Ui09amVyejVWfCRKZjR0U25ic21QCit3WW1GdSRIbiYlZjZrcDhjJE1Welk1I3JDa303Zj0majVKWW88NU5qY25uaW5TTFB+Q351M0pNX3xMPzhGN1JTfHAjbjIwO1IrMis4NCpNCitJUDByNy03VjN4RVVhV18lMCtqNXE4ST13ME9FO3Q4YmNjVn1AZyFMc21VVWBAX2JqNClXN0J3PF8+Y1Z0SD1NWi01Vm12KE95M1MlOVBwCishU3hFOXk0SnxTckRXZVdhQU5INXJjTioyUGk3YE1YcT5lJCZwWSsmcS1HeD13V35hLVhvMikrNj5+T3hyRXNOUitUPj54M0YzZSomRDV1CitaYVg9XjM9Q2tgJjJ7XjYtVmkzSyhpJlZ4TmFGaW5lYEhZbiFxODVWNklkTG1pcEo9UE9XTHUleT5NX3BmbWtOc0l0KlctQlped2lAJDRFCis8SURuKWVPbzVnJSZOZShwVWJ3c3YyI1ZRUmQmeFZlNStEcyZAaCROMCNwNz13XilGU2JAKXd9NS1APlhGXlhAWHJNeGFgS2pBeytESFY0CitIMTAhQSk9SXthdDVlRlJFLU5sKHFmI2AzYExMU0AwR2tFZUErZj9laHZeM0xsd1ZSN24lMm9naTQ5UlpqKmRvdWcqcXsjYGJnTXw9RHJSCiskdjhfUUljKUs9eHBYWGRQeHlKTD1wNWdOTSpWPnxpM3JrWGo5d1oyRlNXTXdzcDNXT3VRUCRjMVEhOzdkWlZMcSZLMHM8NS04cXNVTEV2Cit6YFlkLW9kdFFeK2h2eU5WVzwmb0NpZThJcz5hKExydVhKM2o4cH5IYmJkRmJCQXJwaTRebH16WjtNYjMlMk16Vy0lNmg8WCVhNUszfCkmCistJi03PHo1PXNgbXRhUj0yOSQ0czh1V1pZSHd5cn5uO2NAXmpDKWRvMWZ5bkFmbDhtdHpYWXdXTCslS1ItdWxeS1JBfC1jX3JabU9AVDlTCitKVEBgOztzLShRUWJWazJYSk4oVXlMayRQS3kzQkQ5VClTRHYhfHRoO1lNPnRrVTY2Vylkfk44bCpicF9RQT9GR0dlPnlfZG0waVFpeSZ+CitefXF9a0woWDViWk4yP3s0eXokdSZWciE+bFFra0Uxb25vKj1zdm1ZYkQzY0psfEx+Nnpeb2ZZQHFKKUgkS3NSaEp4cEkyZ1o3XjgjZElyCit1bkcqODxSbCpwP0hJZnNTZ01Aek0lYGlBKyt8MUF8SSQhTkZqcmE0WDFwSDt6TTlJPD1YTDUxNzg3OGxtKzVTYn08PXReK0ZPd1okZ05ICitjVXQ4eH43JE47S1khNWJBdTNXWlpLd1VwJV5PaDtwUFNlY1hSV183IXNGNjMmWj03ZHJ5bXl1e19zO1hOUnc7JTBneG52TSM3b2l+fGU8CitmUFZ2MTU9SWd2M1A7JiRmNENtPTJwUFdzdlM8VW1ifkFgTWNwIW1eQyRHaFNrPihIdzt6X3MwZjJTY0NsdlkpMDJvT3ElQzFndkheIzteCislSFojVSsyeU1gRl84cmZHZSg8KEo/fH5EO08hQTgkZzVjS21JSz1HRDdEb3c2N19UfS1hTDB+MUZ4I3QjQSsoQmQlbFZkOUExSlpDWTl2Cis3Zl9udzsmPmFCb25YOyNheGc8IWh3SXtkVU1gcTY/TkArODs5dSFQT1laKTRLemIyKVZOKng1S3peJUloKUBLbm1pOzUyZykmQm9gNENtCit4cGNAd3JJbDtMQVJ7MDsoelNqfSFnZ3lGe1MtKyNLeV9KT3RNXkFJOWVlN1dvamBZfGR4PlJOcTdPXnt2K3decSk/MUBUaFdoXnV0ITlzCisxcnhJVyZfKCVDWTtLd2hYfGwkOHhQPVk/S3Etb1dNJmpgPH04dmtqUWlrfXFXdyY2QHEwMCYoPlpvdTJNcGxRUUpjaG5kcGhJX2I1PXJpCitQJiVoYlg4UEpFaGJSXm9jdnxLUXR7ME9+WnE8OU5BeFNEVXU0djtAeGxlTF45KjZ1ciMjTU1mIVpMNyQ3UmI+eWNXPmg8KV4/eWk2cGtSCitLeHkqPG4pd3YxRiV8VWZPIWliKVJieCVSZTdPV0JyKVh1NEZIMm9qO1F+e1l4e2hQVjstcVFCcm5+KFA/Uik/aWZAWGFRekMyfD87ZWFTCishJU40MEYrTmx0Q25SZU1PcF9LMlQ2I2d0RHE8NTl+IT5OTlcqWEFlRFgrQnVTTmNJPmdzSVhTPyZNPDZ0YEVvNG4hJWJAX2cyaitmVTh1CitkfWxZbW9+Vm9XS25GZD5kJF8pQXwyTTU7Mng2NEl7VzFLb0heTGcjPmBtKylmelQ/SVp7R2lyZG9AdXo5YXJnT3R3ZXR4dTlUVUZNKWA4CismMllXXzMyRDtNVm8mZTl2NVE4YlhxVXJEaWAyemZWaX1SNnNsO3QwcHklcHR2Z0h3OHopcGxwbWY+eUBnUUdAOGJ8ZTgwTzZrZjQwUWxXCitxUntGfXxHMHErIyNOZ0d5QEcqVEJmanBDJG17ME5YRE4jO0RmIUE9UVgrbCljI3lrfTNVVUR5NWk0JWo3entSSWclQkFPeDF8YU0pbysxCislZSYrfH5VfTVVZ0FaOFNIciRmdWRtVV9zWlBtTEB2aDR9cFBsVyg3VnJmJUxSQFZhPDVMVm9WXipQcTtCV0AxfGZPRFhpezhybCFiaDclCitabFB8dSo7aEVNfnQjNVhgWXlraV5nSmdwXyNadWgwTnB8MislZFAwa09TUSRhNXVSVDNgazF2M2V6TjNhc2c8Y1cqY1FDR2RSMVpibDgoCis3XzNfNj5lZ2hmYD96UW5ZbmRCJm9nRTw/anp7R0VsTCMrOSMmV3o7fDMpZnY1WS05JF5nIUhRWHJ5NFlIMFdSaGg4czI0fWtzbFUoZFhlCisoQTRpeT8qb1J7ckJfd0NDRFRfdlpKXndIQlVzYmxVZnpzVE1qS1lTN0BFc0dkST0zMGsyPWEhP1BhdkdaSHYtZk8maCh3X0JrWipLfjtBCit4dyZTS2skSU5jViomdSQpYmJXR3Z4bmdMTTVeVk14WV5Ybi0qSzVeP2BwVXV1KnZZfE9gV2lQV1JHI0llbXsyMytkKHd5Tnw2TTNRY15ZCitgJTZWSTJDeEhwWUlCIWQ8QHp3VTRBXlo4N3Y9WitsYzR+PTdfNXgpNT1JemdLLW9DPmxhUnAqYipKSyVWcVVVUmYmYXhqMCtrOWJycjg2CitpZXlhMj9WTkdzYnFseXNlfkZBbkBiNyFvbVVqb0N6cUxxRHlzUkBVNSl0U19tTWJNJCZ+dUJaTUtxPEBRR3hRTWNWZmZ5fm13JEpzb09oCitrfl56MXp+QndsSX1+Qk41cVRHOHYwPnFjUDRJan1IWD9SP0I3WW5vOWVjS3MpXjZOcS14X15Mckp5dm1senFxajtaTVF1SUdIIUN3eGQ7CitaIz85OF83U2dyYzE0d1djNEsjZjJSbiVmOEY0QVUyTk9DbkQmODA9Y2UmSnNDNEFGKz9tITt2dW02ZTlaP0p2ajYqbCVDfnUwblkwMWtACis5T0oralAjKEVuITFaciQxMT9OYGY7KHM1JWFYYT8+clg8MTlZfihyMGR5MHVfK09sQmNZcSNwck9nZUNfRUViMjReVEAzMVFZLU8wMDtvCit7bEA+P3FuVGhxdzFwb2pgNWRaKVkwMDAxUlg+YyFnVns8UUpWUn5VPGF4UVJybH4tR0QrY3AkX19wY3pEMShGaDNaUTIwPzAoY25LYndoCit6LTlnMXgpWmFePitXcFI7Mm04ND4pemtjVVhxQ3tQc3Qkcn50aHYpajhpKmg5XkxUVFFiUiZoIytzMlpzWlZmUns9dD5MdVdaI01tVERHCit2dXhBS1hASXc9JXFIYSMzPShTQTRVJUFiKT1SPD5NeytqbCtFKkchZUN0TTJrflckdyNofVIrWGk9UGEzOCkteCYzRHlDTHcpUUtSbjRYCis9NW59KUJRMitVaHFATzgkO2UobnMtVmApaUxORjBxeSNgamdgPWRDVFdjKndXQyorUUpsdmw2U150YzZBK3RYQno7VD1MUmlNK1o/M2VFCiteOz1tUkNDaWE2bGdHTjBFRWBvZjF2UWRfMkFqPFctTnpOI0lYQC1gWmEmenZra1hufTVQPUJEKHZvUlNlcjhgOFF7aHhuKVkqdSV6JFVvCis9c3Nla0UzRlhkYDtaWDVMKHQlWDVJeFZeam9mZj59OGplR3wkRGlkRCtyUjY9bjhzZ2d4NiEmN21pYjZ5bWxJQ2NyOEB6R3RiI2xUb1FZCitaKE48Kz1kSmpTVChld1FgKXtFRGRxSVE4bzQ7ZlNsPU5VTGV2Zk85JW0jMDF8KCQtbzh9RVorYEtGVVRLSHJqUnhIYVl0UyFLUDJEQjxXCisySTFXUm1NVEZyOzlRb1YxIzJuayNtd2NueHE/cT9SPTsxWG9PQGctQldIYXI/diVMS19IUSpedjl6MDMpQ19ncjZHT3BeV3VAQzVaQzJ2CitHTU8qa3FtNF5QOVd5WTchfkBVMVYydHgwbXFfZUpWKVRxZjAwYis2TWl6aCZjYn5GZSFxKih6bmFAT2U+bFZuJX5HYjFSNEckdDBFQ2BDCitGSjhQRCo2JlZUNEpkZElUOGxnX2o4c3BBYnIreG9gVVJJNipHQU5xO2xPIzdGQlRPRiRPZkZjYGpTKSs4THE9JStpOGRwZ3Y4cWhxdFUyCit5KCQpPTJBNDEwPkAqXk8xZl9Wd0hMcUspN1Z4NWFQN0FtVz1xZF4tZ19QYDspWU9wcUNiPyt9QzNgd09ASlQ+TGhnai1pJE1wPmhndUpCCitGTlM4WXZHU3lqeCZXLSEkfnpsJXdGJXkhUFljKjA9dSh9Z0B6WjhGKUstTElfRmUzWUk7QWopIzRMOWdyUnk4I3ZZQ2A/LVBzSzdZZEVSCitHQEdrNW8zTyooNzxGbVVJalBgPlp6dCo/MXpfQ1MhKEFNRXF+PU88UkAtaTB6bClqJEhmaVJ6PUJzISRqP2deMCsmKjBERCN0V0d4blAzCitQPDR0T21IeXMtWTY5dz99SUl0UlhEc2BRMXpfX3QxfTQhU2EycT0pe3sjZTE+X1I8IXk2N15kc2Zifj47cXE4WVkkWWFebnJTKjdfTnNpCitfRjJzYHEtJHIxc0I7LUU1RSM1ZzNERCNTenohX0IpUjtTJEkjX31nV2lBZHF2Q0IpcE5uNkZFRE5YY1c4UCN7Z1Jqan5uWnsyezV7aEhgCit3el95fiU5VCVqS0NLbzRMRWRLaVIhTDxVR1c1LVpmTllFQTc0IVF9YUAyMG1lVSYxWlJVfD13LSpqd3A7WFEycChpOGYzYiUoNWEzSXt2Cit9M2l9YSh6YnBXUX5XSFMwMyM9dkB6enAocyNKQWd+PVFmMkNDTGBNTHJ6OT5Sbk4taGd4NHNFeTtISFVIMHZQfmU9IXIrTXg9S3decW8mCis1dkRtMXgzZztFfmt7YEdrU1JKMGVsJHF6bkVuUyVHNXIzIXF1ektyaiVfPG81cFY8cWklJXQmbndZWlJEVVA4VXZMM280Wnc3bSFESzxpCitvVUB4eUl2YU5Aezl+R2VCUjkyeSpRKGtCfVJnSXtCaVZ7I0A8ej9eOGdyWCo5cihHXjdqRmQqNTN3K0xEeD5rMVFHaSFjeWdrd1ZGeSVMCitwSH4oclI/I3xCNnZANnhQYllhPWs5fE5SJVZ6K00qUioyTEI3dWJodn5WMk1MS1RHajxud1dSY084QSFTN0NBJGVUVHlVYUcxc3h6JXoxCitLO3Nvdytsb318S2dPWTYlLVlmeXE2YHV2PT5te1cjSWJsdE1nQ3JwQyhkQS17d3s4PEgha0xOR2d6bypVJXhhYXdAdDBPVz40WiNsSno4CitMa2EoPDYtZGRWPXtkSUNoN1k8fDtUbll6R0pJSl9oQXlzTTVXdXRKPWFAKDJZdm4kJWUrck1MNEUoV14wKCotNCk5ISt8elJ7c1V2OGAjCit3WHs1PEpIfV4wIyMmKmd+OWRxVyFCOE89K3ZKSHFxSF5HR3lxcHMycz9MOTJ2PWRiQTJIbFlBeUFBS3o/cm17T3AxMlkxeEdfajU9RzszCis3MntjalVPaE9hQmdgI0BaTmhleSlUJk0rX1QwI2dZSzwqNWk/SzV6QSswNyFzRE1WXiN6ZGNgc1d5XiQod2o4NWtKciRRPU8+KGJGZ3BECisoZEopSk85S1FIMDAwMDgwUH5kPU43SVAzazNSX2owSnQzaDAxZn5FMEJ+dD1GTHE7ZEZLMjBWRV52OTM4Q3tSI3coO0crZzFFJihAfnRmCisyNj5UM31FUmdoP15hPXpga3hTYkwjfUhfVnZZM0BiZ3sxNlY2IzRJK0F0e09hdXk9MUN5YzlLQDhQNH5OYXcjZzNCemRiXyQmIVRkc3U1CitCWGRRX3JwSEIwUkNZVVREemFYUnQoKUlEbGVIOTBSP19iZ1EwUCtoRTZJaWhXTjZETWFAWEZ8cWBLZ1gzZ0dablk4RWN2a2ApS0lBeXBeCitEaDsjNX0rS3hNYVZ6T2xjMisrd29Ydkg3YHxuQW1nZWo9fVVyYU1ucU94R0xQSWo/RXpzS2teZUJNeFRyc2dUMSEhYFJ4Mk9ePWVaYDJCCitabEt7OXw3OT44aTshWGN1PFpeMCpEaTZkfThfc3Zsa3t3TylGNXY4bzwoJERuPFV6YnZXaV55O345WkxxTmIwb1ZYNm1NI2cyZzd4JFp6CitINnJQQCheQXlUP3lJejU2O3JTcW5ySGtvczNQPDRxMHFZVipRJEZec18yIztJTkN1RjhCRDtzO2ZDZDRURDt+dU5rWVpTSlZKPil7dTROCitlJGFeWUpBbVI3I3BEd3Q5OH0mQHdrXmMoJHF6SUx3dHVzUHZMS34xRnQySyYoOU5VdXozV3ltJl9JQkdYbTcxcHxpJSU3O1N1RXNmWWdlCitoTEsofChjbzc5UkI8K0pfeCQzT3ErIS1zV2BqXzFoWHU3NGlINnBAPGdRbHReRm1JRnA2VW19dUFkYTk1eXFpbXp5NUVrbloyRWJ+TyM5CisrK28hZ1ViX01xMkFKQj9BbDY7PFFXQFh1ZEdZTDM7YiRyZXQtOSVlWWlwQCtKKG4hRnFqfG92K3lpcCstdSpoNXVtQFlWMXBCeF8+fmRYCitoZXBJXzJRYCpFVWx5fDN4aSpOTDh8fWBlUXN4Rzx+dTtoTzQ0fnM3KjNfez9sKTd3ZFg5fGRuI3JVb1RhPTx4Sytmd2QzPzcwdGNfMUlKCitraGhAdy1FalRAJj5tQlptdkB9KmhmfS01OGB6RShxfCRHeHd0O3tFSFhqam1wTE5gTzZMMiRrcH4zNmVHc1pDSWJIRClBVkVMWjR5P2dpCitXeUpzODAzdWNAT2dNe0sqJFFNSEdFKCR7bnYmX0g8Y3h7bU0qWkBWMzQlMHZhdT9LfExXclZuVCU1V1Y5OF9OdEQxY2NhKVg5dmgkK3x+CitfRXBUWjhzQEsoIzAtUERiMHA/ZH5BWFdBfSNRVV87KHRYbj55UUk1U0VkNX4/TEsjWUpgazxGRjY0P3daJGxXNnFAakU2bnJNSzt2QD1ICitfP1BOUzFUbEA4fSVuVDIrTyhCdVp6MT1KOSk0RGxxQnZsMEQ5XjRIaW52YSZtUT5yI3ZDYG5sYCtGcW47RGRBWmd7NDRtKisybl58QCokCiswcU96Jmwmey0yKj08XjkyX35hVHU0VGBvMS1DTTVNe05abiF5cFk1cWVUUkhqb0BTTj9OQkZRITRyYjJHMjRnQiF9ZC0jcTNPcGx+VVh2CitgSDRadjBpPS1ybShTbVJCcUJGIWl3NGRqMXlwKkRTcz9acUA3RXBRIz19dlFrVlppbXhlRD4+bytudk9QKT9XeDliZms8QW9xeUZrTitNCitkdUxsQlNlY1p1fE82WlErdjk4UiQkaTY/aUE1YjJLZlh6eEVfOEp2eE9zWGBKMEQoQnNVPkpVZDxkbHxUVzdNfChoI192JlA8X21le0BvCit8aG1ZTU40NDRKXmxuMSRkVHN7dHJaKzZ2QzJaQiQmeEAydVU4dSZ0TGteLU9Yd1dwdzdXYVExNlcqTXp4Y2A8KiMxX15HSUtlbk93TCtLCitIeztGP3xJRipURmlTd1QpWWRvWUA9cXt3PWBwPz1qJmNuWiZYdDFOVFQmZCNwcyhtVFk4KGN0cn5eeTVqUWY/I1RDQ0xTMzZQNURCOzt0Cit4dz1zcmNTajFJajMhQG9mWTE/aWIycmJXOWo7TDxtWkIrTWlldHtleGJEbipYPCloU2tkRFBWTmkjNj9wI3A/RFE7OVdkNiQ/M3VIaS1KCitxVnRGfnZwKDxUez07RUdRckFwdUs+KzRySGNsNSpYME5OWDd0R0c3aXd5ZXdOX0M1KXJvOHNsP1A8NihaOWo2czl0dEwkJUohQl9qalBZCit6eUVYQGQ5U0szSl9pODxqYkBRTXdLXiU8cTlvIUBtXyNBc2BfOX07UCpgKl5OKXB7e1hAajRmQ0JNQ2wxRH0leDNVZm5CVj9paElKOW1aCisoWEBtVTRrM1EkWVl6X2QpKFpYNXdiYk1VPFhueVRoZnoyWDhfKClBNDQ5cj57P1VxfmgoQktPSTg/MHw2TEpjbk0jTXZLcWllZnpoMGxWCitLfDxGSm9Gfng4ak1GaERPU2tSJTFfR3NJbkdpd2dgb1B1WkdzRUNwLVVLaDhQUDlKUXZHWlEtQCU7MlJednUhIyhTLWBteXVQPi1EczI5CitCI190YzdCP2FqOTFGVnAwcm0xblM9QGBWJXVwPSp6USQobUdgdWoqamd1RUVWXitBZlpDWE8yM2BZPTMkeDFDYV9mPTIjJnhjNGJ9elBnCisxUHdQPkhleH05REp4ZWI/NWp7KUsmcks/VTc8YzloM1I9P3prJnBvbl5yR2ZkPmBQb0hoXmBpb2FNaV8zanlXKXp1JCs3QTI9O30mOUQtCisqPn51bmpPfX5sblI1PFpIZG4xZSVJV3stfFZ1OGJlZk16flV0MWJrQi0oSzMyeDd+T01NPkYlRm1pck1RS3J3SHYwanRIdiVma29ESnF8Cis4cmhzTWRvKXhyeU8zUCFXOXF8elVHRC1FPWd1T3JjJkk0c0RAcDVWJHZTZGB9aS10KWMjSk9GTjJKV29+QW1DRU9fWWJjcVR4ZU56c2YpCis5MVkxO15DVSo7LV9aX1FhVX4mTy08PmFhP1ZMYkwoYHUwZkZPRVQkbF87Mj8wbGF5USMxb1ctfHMxT2hqK1FQLW1QQE5oOEl0RVkrUGZrCis9cSNlJXxMMTBTPzxQSUY2NWFkV35MTzRhN09tSjVYZVJtYTQ4KCteVWlTJmM0cS0wKmVEWmYpR1ZhQGc8UDB6ZDlnYUBITz9CRGNPTEZoCitMQX1uS2t+c18qeGluXlIxdGtwWmNLIUBfOHQlSUMrX1Y3eDZgPjw2bn1ReWg8fCQ0SWBXRlVpYShxYn5UZUFRSUg7NmkoRiZ6cENSZXAlCit+aW4oU0wjRnpESytUeUBiMThgKFFWczYkR2ZXN145dS0+IXNiP1ImQ0hPelA5QTM5TGUxfmd0eERGY31xMHxTfHtyey07MENZfTgpaiFMCisxdy1QckwhSUpJOXBpO0ZlenAtUVk5NUowdE5ARStwTldFNDMoJWA1SUhCUzwhNVhRVnFOeVA1X0RmY0ByUC0ydlJBO31xUV9AYFczWDNDCit0QFIoYH1nMTt3WmNKPndsUzw0VmJJYT9VRFRacnltcmdua1BuclJ4JFphQShUZUVKQUIlamg9SmImMm5HcmdDe15zWCtoRVl0JmptJEl5Cis1TjxPQlRIJEVBQWQ/K2kxdCpWJkEkLWJgU1J0bmVOZHRUUSU4VHYxWEZkT2R0P19PcERaRDhBdyRXe1o5IXIyRGFNJiooSF8/XmA3MzFpCismTipvWjEwSzwxIWZGUDt6PnY/WlA4cV50bztyZ1lZZUcrMEpEUVIxMSk0YD89M0d3eFQtJik4aWVgQl8xKHFKNTJzI2g0I3BkKzswI3pWCitBUDBTYTgtMylmMlN7LVVsdG9yKHl5OXZJLTdhQWx5SGJsU1VvRFA8a3lIOXRAal5xYlE0bTsyYVpXO0k2PWBCPlY9SHpzNjsrTj1HdDMjCitKRiteNUt4Snd2aWxWZlhsfTs2bztlPn1OOEVHTUkpeSVneSFTIWxYM3JuTTI3fmhWOSR8WFpDZ184Rjs3U1hWeTwtI3ptYzFGQWlAJktJCitjP3tfKWk9Z2FUTWN2Xj95KUgwfFhRUjAwME84Xk9ZN3k3QE0wb2p8QmgjWlc5MGk2YVdBS2FBfE5hYzRLb2RaRG4jfWIjaUg4WSVYd2x3CitPRFA3KyVeI1l6UTAxZl5zdD9IUDFCREQzeCR4PExZbyMyYGVrbzFpWT9ucHlwa2l5eUJBOVNkdUw/Sm1TNlZ2KHh3WHNtTmM0cVg2RGgxCitiY0s+ZmxCUHYjVEUpX29ATTl5REFAc2VMYiElQUtqVz9UcXpMc1VsTWRebDh5RCE2ek9+R3NDIylAcT0xP3B+aWxlQzd7K05zWERaZmcyCitEWkskYllxSy14fUhqMTlJS0BkSjtAKXVLQE9ZdWV1cWh2a0c8Pzx8UU5wbU5SK0VPRmFSKFYze2lIVGdRTUR4ZXdDe0p1cW9rPnlmdll8Cis+ZHdiXlhZRTJoWkt4dEVtOHtBVENFRyFecytmciZzWXRFdHhIY2MhdmRhYXhCe1l8LTZAenpAWWlRJjUkRzlwX3hSc2w/NEcqMnZWJlgwCis7VG9vN1kqemoofkRVTGZqdnRtUkZUQWpyWGJoWj49bCRXdkpvVioyKTEpWW1ebSlKKSowaldfMXlSVjtLbFooU3lYXyZDU2kqJDFabWpCCitmcGR1bUY3bU8meENmOTVLTG1Fe21odipUdiMyMEdTRHorIX5DYjxEYDBuMk5SQShLezBAVXtoWHdJTVRERX1GWjl7WlBEO2s9ODQ0c05gCispdV8pUy1hJVpvQkYqSVNOSlNuX1JgSXRGc0xDcFNWIWBQMkF0dCgjPVR3X3F3cjJNO3R1PjJEY0Z1UThsTGFfZypFNiNuTmotbz1rb0IzCitIdG09YnxGXlZ5MEt4PWtOV3JOMUc3am0yVGooWlIlc1N7KnZAPERQRGM2K1VWSiE1UWdScHRlMip5KzxaeHUqcXRWPC1OITZYNnJfPm96Cis4ZShMRDZQTH5CQnRuSl8/cm1UfS1MWkVIKitfJjFlQDVMODRxTyF6OGMlUT1WJCl4RWtEOEY5QnJTOHdhQXhNODZ1SWEqK2s4RVhzKXxHCiswbXZsdk1INWBGSFozV2YqMz1YempzPHNoI2UwQ3VnYnpvYjRyTGY7WTBRYjBWYmEoPldlLXw0aEleeFljKj83eFh5PkwtOW5KMk8xYzVnCit9TThuWkV8WG1yQHs3OWEzSFVJKHNjQWhRZ34kUkhjWkkyJmEpTGBPPFVLX2wmfTAtOyo7K1UxdUJwREpWQD9UMERHK3xzSVhZOFE8KEF5CislTHxtNTlscF5qWX5JODB1dnFWVjNZSnE2TFpWPWZWYCt3TE1GRnxSQGV7ZTNTJEktPztBNkYoSytWb1JyZTF2dipYdXkrdEJPYEIlMChnCis5X3o0e1htYGtiPntKR1R+Nk43am1oIXopPHAzJnVeLS18OG09bnx2eHg1QU9HY19CciVMUVYrTjJMUDJHdUIhUUpzYGQxXyt9KkhzP1hMCis4VGVTbUdEdDAlVE1WWDtlR3I4YFZSYWlOMEByVzApeFo+QyhmPTJOYXlsdFFrJVZpSUJ6b2w+OSE+fEpCUk51Z0I/RUAlUiEyMUFvejcrCitUXzQodzhGdzVfJkJwYHY2eWglVDAzNzwqVHlCcmwrTmxpcXU+JSFpNj1LMEpwZm84NkQxPyNwVSEhdkRXVXVIUnZfaXdMPXd6YC1rJkd7CisqWWBCdWM4UDI1ezVaXi02YiEtJDlAaX5yY3tDJGtFKWo0MT1qRkJHRHN3KTArTlFXcXFTNEFDaSZ4MTU9YEQwLXJTSnl0bytpYkFFMU9iCismPT5PJUleKVVaRXloKGhoIXo+bmQxZ1lsZjBwRjtpaSloZGxJS297dD4kYDBlPCU3PyRAZjU5JmNEPEExUDdlUkh7IXVtLTcrb1JJKyZSCitYVVpjZFNeYVdiPG1CVWhfK3FjZFJGTXtnPz0+KUVEI00zZ1BpUipyc0lSZHZFI2wkSDI0NmVZMTN3RyRQKjVnZ01oS2p4VzgjSHxSJiF3CitfPVltUkUmdEYpckpkWHtUZV41NDVBV1h9RSUtej09RFooMyFyQH5QenQtaGFZOStNcWp8KFo/OXlDT0g9UmBJQk9IcndXJjY3VEFmYFROCitGLWVkQiNUcTBIdzt7Z30xYFQ9M05sWUZHV0B7Sn0/OEBrUStIKHB+XkNDbD43aSFafSpIdnRPP0hKN2A1Wk1obkY3Jl4+d3VXO2pqaX1aCitxTnFtOWI3MlpsSWM0KzVQYSRCclN2WnVea2lFYl82JlhYU3xKPkVfKGdnKDZUVllqdEYqJD9YdUtmNW5tYGtaJWFlcnlGN2x9aEckIWEpCitae2Fvd20pdmxrbVV6JjtfaVBeZ1hVWTxlMlkoZTJ7eGJtakFDVSFzPng3PytaJjNedmZHPD8tcjRQQDRjJip7ZCokRHk3JkNreSlpMmloCit8VXgzKUlfVylUTkZFfCFZalgqVSVXZn5zWUM3Y08zWVF0K1grV1o0aE85S1FIMDAwMDgwUH5kPU0/PEBONWpfazUwT1RrRDAyS2ZMMEJ+Cit0PUZMcTtkRkxRTmJjNGN5Tlg+Vj5XYUN5flFaSTljeTUmckk5IVJ9JXE+REphfXVQRTlXKzEjfmh0X1lBYGk/cUVLQFZiSSooWURVQTxSCitkQlhFe2d2NSZKMFAzNmxFdihwIz5AZzg9RCpzaHg3N3FYNUBgJTRsSyh5dCFmMyZHRkJkcmpaaUZLJCk7KSomLUN9biNFZShYYzNhazRgCis/Wm53bGktdWQyNi1MSlcxNXxLVHtJJDw8I1QjeVBGJHZ+c0gkPmh4Z1Q+T0ltOyF9IXg/PmQpfFlqYHBEcHBudmZsU290dHU7TnJeRz1DCismWm4jPjwqfnxOZlJFWUBOSyslUlU0cERAbUJEQ0Zjdl5RSDtwM0czej1iVEVgZHcyaShOdlIzQ1FvKHRlNWYpSUh4cnlhei1pTlViMnllCisyazBUZy14UVpBNXlqdEVTUzVjeT0xd1Z6OUBabkdAI2Z1cUMhPHhzIVN1d18yTTFUQUFhbjlvT0hnT28yREJLOWBDb3w8UURDPG9fIWpGCitrMHFEVDNhV2pVMG5UUkFTOzh5SjJZcihZIys/KGg/PW5vTG1IVG1ZcmZkYjtLNkJhT3ZiUl82IXNGZUY9N3hzPmNMP2RxZzg5czMkajxgCitWYEYoZ1VqcVdRa34/RDF7d015RnROXk89Z0dKSkhGbUd0PHFCeHo4PClRaUl8djdpUHg9XkpOdDJgKVkxSmNJfnBKZE5vaU5VVlE+c21NCis9V2BAblpvSlR4ZE01T3AhaSV9VTQ3eVpMJHpjdnNBSX5rUitBfXYrSHB8ZHMhPTxaIXcwRFpzN0F0eVpaKVdiZ1pJXnE+VWdJRD41ZyU5Cis3YlBpI2xZQT1HamBtTkQ5KVI7PiN7cit7Y1hAJEk7JW44Mm1wUXdVNXhlT2FjQkcpNlcyLTxiIzd3a3hoS2B4bk1lSzF+TTBuejtLa2FoCityJkM2WiRsdTE8cHlOQj1jTl4qYWlLUCE9RXlncm96VDxjJWEkS1FWY2hpSn5DY2hTRmwhbGU2aiRrbG9XR0M4cjNOfWh9TEY0cHEpcX4oCitTYk1Kd2pzcDQkRD1yKEQjYVZnRVIhcG0ld1ZPQUReSklGdlBLNU1Raj5GeFpxPy0kQXVhZ1FZSVMjR1U8cHhAMWg0ZzBJP2I5UXtjdlVGCit+d2spPj9gYypGYWR6KjwrMkh2ZilZYjUjJnx1YD0kbjwhQHUxdVhiQldYWURsLURYXi0pSmw0Xz9wcWdNdyF7dWohJSt4PnJObjQ7RUd1CitzaCtheGttPjZqUTdTeFR6RjM7QVEmZXRBWWpRN0JiNFFPNmItMndgZER6TyU5QHlUKyszaXImfDskKGZre1dwJHVULVllUklVTTIhMlQ4CitqQ0FuUyg7R3orIWJNdEt5Zk8jVS1iaj5eKUpRRDQoe185aXFNUkV4UEo5bW4tKWR4dl9EJVY3RFYyO3o2bFJ9bT1ZQypDISh8LS1JRkBeCitrTFhhbitGJlNoUmc1QDxNaE0xWHpkXiR2QXYpUUgqWXRBPDFHaDdSNVNIZmsjMHd6ejhpWnBjdjF9Tz8menpPSytfdng8IVphVStMIT12CitNSzhCZyg5TUF+MVhDQTs7a2JqdWM9UE0yWVAxYkZMc0F6bHZhbyQqNVNwPXN3U2JfKyt2ZnQtcy1HZEw/MnZScGQqd1p8ZT8rfXJQcXg2CisqNkp3aUBvenRXO2pzJk1wcSl8NHR4KWhyOyp5MDNKQDYhNnI7R1NQY0h4QT1gfmlAUSNKPS01TCgyeHlUYE13PEY9bm9paXUpPDhkMktUCit+XjVgSld+dmhVXkRLM0Z8RmFaNTlOUnFfWUI+Pi19Vz1XTz1ofFQrOU12KFdvP2pyJjNeaH5DcSM0RmMoRzFXcVNefDY8T285Um0jbCl+CishU3pSb2V9WT5HQGdiRzNQUUtrezg8QjRoZk1zQWJFSkR5PEFRZnthaFVrV09qeW9Ucys4USQ0dlRwZnNXaSpSV3JwdEAzKj5AbFFAeUdYCitien1jIUlfK24zdSprZ1dLdm1DQ3ZeKi1ObndnV1ZxQXZlNUdGajQjXztJIXhEaUwpc0V2NElHNHdAdHlBckhXeExTPEdrbSVMRlFAQyY9CitHQER+MytxdiVSRHRxSWUpWHJTTGdxKGNpZ05rWlcqQGAoKktJSWxQell1SipqYWhVTFpVeGNqWDBiPCl4eWU9Wk8wcF50MHlsTl4tMWZtCisjUjNSUFlueyZiQjJLd3FaaTtHUTk/fDZyVkdkP30zeWBPYlBvT1JudEgqWUo4clkycVY9NkQhdVVvZG99VUFiKEtyMWEwTnVhbUlmPmYqCitYVURUP2EkcXg3RlRTK2dubyUwNEBeUmg8TEZ8KGdxO2A1djtMfSZSeVYtNmhTRDgzTT5Ke2N3SnpCenhIZV9HTFNCPDBeSGd3YjB7RkZ5Cis/QGhwPzxUQmdmYEU4MG9vfmNqb3RefHhRPFdWdmZlfWZGOFhGWnhAbjFGKTJ3WEYqRmdlTWJxNyV5R2U0aURFfCtMZHpgVyQyNTI5ZG57CituQiRKYEVJRXVrd2pUcCpANnEhISpePElGNVAhRSNpR0N5KGhVRDNkKVZRdnRnTWpkN3lJOHklJmlpQkohVH5PTEJNenImQDlEfHhWM053CitBbWJKNlFDaHRtQlN4aTYyYl51ZlVLYyE8OChlKGtsSDRDQ0ZCXyVVeUZqR0F7MmFte3YoZjteQUohNzVLVDE2YU8rPlYlTztuaVRpZU01CisqbyElPHR9QzdWPHo+VU5fbGpqe3ReIVlPMCt4SWdAe1k1ZUU4Pl5kOFliLWBkRjNkV2dXdHR+dVEqMW9NcEg+Q2MxUkhUd1dYN1pfTlk3Cis2aDU1WCl5JloyfWcxaHZecWJZa3skRF5za2dFJHhXazdhRUlxenBnelUpaThyWlBlTG4zR3w4b05KV2Yre057KygwRCZKQWdLOzVtdFJXCitMWF9MPzklbTBCeWd1eSFfUXFue0xraGJMOCNyYypDPmlFUnhsfFhvQkJGbFlaZVhEMk94aDFkPyQ8b3tuflkpMy0rNj1ANmdqI087M253CitNUkRUcjhDV0h2PFUhPnYoRHl0d3A4ZXhTaENOfn1gd0xpP3xxOCo+QmNMYVdAVUB9PX1ZYGxLQDt0NnViN19xZFZpfTdsbDZAVU9IT20tCitDQFoqbW84alFEdEY0QHJfPkIpSWpSIUV4Ql8lIVNFQTdkOFJlKzQkKWkjUWJeOU8pX2Z3IzI7I2k+OGhkPz99Y2JZRkFeMk80ZGo7UntQCitXeXhtUzlKRzw5aUkwTjt4PHBXWHltYEtDcnwlPVJ3UEZxNkV8JDtgb3M2XiV2Nkp6WH5HQSRXdVo1I2ZTVkRPQ0B4azF9UVgkM2BPKE1pCitROGxTYDIxQDlTT1hLXm5neT9qNVg9SnEoMnYwK09xN043ZUteU29JQCU/X15sdXxEQXJeT3d2UX19aWMpZCl0LSVgU1oocWVkbUZeWXR9CitXdj59elVrc19SJFomSD94LWJJYHkhcXomUHp8eCNZcE0xOWFvYlR0Q1puMGpOS2NMQSZyOFN5ZSNvbnFsUEFVNCM7cXYmVjE8SHNMeW1LCitIQmUycDh4c1NDMGFvbExOQDg3XkpjdmYrVFptQ3deMG9DV2MkdyYhbDtPZi1KMyQtXmEyYjM1fD95dkU+dXwxdSk1OX5odWJ3QzNPe2NMCitPNkszJDdDbiQ2SHE3eUJwcGU1UGxPUFk2NighREZ2UHRqUz57PjNmNjJeO1haTDU/eG1RO04/d2sxPjc7PD1me054dHFgZH52KUklRXJQCitPYHEjZDZ8ODRiQkJFalhyVWMkcHVIeWwmPUVGOT94ZX56UXdhajFJbmxhOVAkJVhaTk09dlN3dDFSIWtMe1NafUQ8RSk7e1ljbDVNND1wCitYajA/NVkoc31OWHMwYzgrSkFeX216WjtIOD0xIz5AbE1qKEFZIUB2RSRFIW9HYEVGcHkqRWZjUnZGKkJ4I3gtdjNDKjJ1dU9OYk12YFRzCis/NnIlb0wrVCk7RiMzaDFRKVlHVW9OMmAmaGF0akRPWVpmPlg7dz9AamlicylCRXlrVkwmSDJNUC05RTxtWHJoNTg7eV42QVBWSEl4Rjs0CitnZ1BGSD51aT40QVBnbSlFa2p9Yig0UH5oU3gmVzU0VHZhMTJsV1dgKHZ1MUBeYkdaZXRYYnhRTT0tbzBUKiFnPEA2MFFtcVk0I2ZAKUg7CitRfkx1PVl1S1VreiMxRnhUMk5WYyVvO2BQQSNiaSoyNjhuPlQyJSNZMldlPiMlbFF2M3M8KGZseUZgPXJjeyo8aXBgSFd6Um14bz4wYlVVCitjT3NuamF4dTlRM05OTWBDOHxgKDBgcTtXJWFFTiNDanBKNDlZJXhhJGp6cDNYJHcqR3UlKkk2X3EraFFSO0JuOyF9KTYtbHJeY3t2bjw4Cit4WmFuOT83UHlzPzNVckNFYm1qPkchYmxASWNjKC1kejk8QzBkRVJoVSU1MSh4MS0/cmw7OUZ7c04oOSFVIzR7dDBVSy1KPzt2M3pyPG9FCitRVUpnRVhlaUJKYWdAenhjYl5yYno+RHBpOU55LX1UQWUkR0wya2V2SXAzTWlyV1RnXm5BQUhWPEJsI2dfaDA4VC1BIWNncEowe0UxOEs8CitzVVZVSDxtY2x2Q1dQfHV6WX58WldZdTxnUTNXRCRoSFRHQVdBdU9FbzNYM3I7RSYqNlp5WnpvLSMtfkgrQGlFdXxDY0hEJkdrUCt3TzI9CiszSXRtcWk8Mn4mJH1fV0s2azNod0xYM0JWKioyK3BQN2ZjKSVSWXdTe0NlK1hZT25pPzI/aHlsNUdnfT5CaipaOUxJSS1SXztmcHx4e1B2CiskSWlyRCM7bXNJNXljTUxyaTlwPm9DPVdZaipvaz5CM1BZZ3E3TCozI2JrcnVWa05BTDJOVF5ZRT5oUmAmM2ZuRXkmYDV6UnpJPFFqWl5CCitNb1J4UWk7RDBhKTA9UktNdkRLLWh+LSN5Mn5ZMEtPejxZZGFkTUNFa3xCKzNrcnhvem89YlAmJVNvdilMTDNaRik1IUtRUSVkU19RTjh6Cis2QylEV1QpYGNJRDtEP3RiJUhOd3pOSHM1ZGZzPSN5ajJKVGRkbDhPLSR2ZXJXVnlfVjMkN1NSIV5iMj9RcDxCcl9uZT5Qa0dfWEYlVzNjCitmaGo4YGlPNlJ2SCk7Z0FNK301fGA3Xy1pNyh+Zj49OENkb2c4Q2FzSTdlX1BiSkhtRGVJUCs8WnVOdDsraUZoNV9XYnorU085S1FIMDAwCiswODBRaSpfTkJ2fk5gRT55UjA2aFokMDMhZVowQn50PUVqS1BQRTsyNDtYPilXZlg+TWszRkdOTENMc0NnbFI3cD14RV4+MnBtNkV8dSEhCitRaG4/fEYoeSs+bn53RCtXU0NweHI3byZNYStCOGomVlo7dWhgZ2FvVWJERz1hITF2SCNFWjl8c2ZJWDB1Xnotdkt7ViRMZ0woWG5meTtZCitvVFF+OWIhbk9sO01iLWNTVFVteVZBeiNWbmA0UkoodzBtMWwzeyh0IzZYPlFBPT5yRHVqZng4RGEjN3FRbDxhOSRwIUdafjI+IytfOzN3CitTXzFLRUJKLUlITmljVEo1NCQ8OCZgQFk/IVVQZUhLPyZuPzVsWDJvJGQmYX5oWEBiODhFNlJuMStpcHFKTE5RM3VtMzlLOzNJdTZAbm88CitZWUY8Jj50NWk+cWYtSURva1dvd2VFfk5xWktHTDloPyV4I0I8bE05ZlUmdzBTRD5LPDtPflA1NXJPXil8M0dLYk1GY0dHZyh7R0k/Oy1ECis8SkBuaX4me3s7bkF3Nk4lPk10MEJKbDMoUWpDdTFLWWZiK0JqNndkVERucX11MWowd1JfUGo7MGhVbCVLelpKWnBaIUU0b081VyM4Mm1zCis2c084dF9+cDxfVntEJWxFOWtoKStOfTJtKyVUTyk0NjVRbUZabG94WkUxYSF0M1BaZk9Tc2AmcDN+bSZHKkJDczBjUjFRWS1PMDA7cDFsCitAPj1DKUFsN1EwMDAwKTAwMDBhMDAwMVJYPmN0IUUtQH1MRUBXd1FiUy1JYVdeWFRMWmdnXmFVdk9ffVpnZ2BsYmEtQCZQUmBGTyZkKjdXCitGSFNEWEVHUXxDPHRvVDVQX1JgMWwyKkJpblJ5X3RGKjt3KjFYK1gmMDhtUTwxUVktTzAwO3AxbEA+Pig0ajl+SDBzc0toMXBvamMwMDAxCitSWD5jdCFFLUB9TEVAV3dRYlMtSWFXXlhUVFdwclU9VlJUX0dZSUFSSHR5RW9hNkVQNntFMCYqJU00ZEolUkVoK21QJFZLMThqLXhBPmczCit3bml8TChoe0U7K0BeNTQ2QXpLOWdAYTF1UF9HQ1NURz98T0h+O1ZGVFEjQFdjSFl7JmdKdCgrQWFrfkI+WjFAe3dGcyZlUm9GUmxncjtICisjODtvUV83YGM7VUJSM2dicTZ8Qyh7LVk/M013YF5TITNTP0ozWkZyK2RLWWlPS0A1SUooOE1JajBvPDxxcVpEYSFgemBhPk9EX0VGVCUpCitlUSpjVEgqKVNibEdHXmRmQHZ6I0kjZW4xKUQwOERqcWRONl51YEtGPUFoVFVWUXBLbj1mYSMtJGFPc0A1eUY9UzRgWVd0SU40ZmtpSjZ5Cit2Qj09PGpofVMoakd2LWFPQ0FVbDdrQCF0Syp0Kko8WHVRYnFSKEN4Z1lsbkxOTT89ST81fXokJmMmRlJocX1gVntNIzZYanFaQEl2bjMmCitfa3VqUEZMIUgxKkAkMXFVc3c3KF5uUX47KURTTnxDKipyTCU2JX0pWWZxTl9zOS1tbyFJVHwjKCVHIVdjSzx3KW0mQWxtXzZ1NGM/KnA8CitoKHc4aihvQTNkLT5PdzZWOE1pSVZuNHswTDx1d3lyZmY2UylRWjBUSW5Xa3lHSmtabyZoJjJGVHZ2I2RMcmN+QGB4OFZ7dDJ3P20xUyEtCiskaUNHJT9XT0w9NFYmRl5vOENlRkljak5pOGswYElnZnQ7V2BNaUpjazReVlU3LXQ4RH1KSDRgWW48RDs5dHpyI3lqI2VQSXRTRmtAcXFPCisrKHRmb3xvem85WWpJaVlPb013IW9rSCVfdTlsJVpCX3NjSjI/fk0zdnU+fU5SUDFIeFMpIyprYTFofVN0Jj9vYXgmIT1MYGQxRSE8JkcqCitya34jJXFfZmBRRCRfRV8+UyN2Qjs7aD54KjtXQzVXZlAjXlJvKFQ4YWt4Q09qdTxyMDc8bm5mUFRzI2U3dzUlJW5ROV54YysjUCpROys8Cit2VFVIZU1MLWxfdT80SlFwTzlLUUgwMDAwODBRaSpfTjJOWH5vLVk2WjA0QExrMDJ9fVMwQn50PUVqS1BQRTsyNDtYPilXZlg+TWszRkt9CitYVkVeMmRjWm1VK3hFUkhXcSV9R3J4UEYxb31DQENzVSlscEROJm4kXkFPRCF0UyUrQ1Z+RHckaVBCcWs+KEU3YngzUCloPkA2YVdBSzJtCit0dCU3RHZZKW0lO2BCMDAwQzQwMDFFWDAwM31sYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWRJamE5P2E/YzRjZlhiYS0/dCRTbUxqMDhtUTwxCitRWS1PMDA7cDFsQD4+YkdrPFNpMDAwMVAwMDAwUDAwMDFSWD5jdCFFLUB9TEVAV3dRYlMtSWFXXlhUN05KVHxWMyhyVlImQ3Z9QEVoXjU7CismJENpNilIQzM2UHQ4aiROLVc3UXZRa0omJHQqNjNGOSllbiZAais1R1NNXjg8Tzw1cUZWWGNaKSh0MnZPM2xla3ZRajgxRG95MUlObGRwCis9RDV4fmomQ0FiQSlsSk4rZ296ajxNN1JKQE85S1FIMDAwMDgwUWkqX017Y2tVPkZFTGgwS0VxUTAyfX1TMEJ+dD1FaktQUEU7MjQ7WD4pCitXZlg+TWszRkhKPk1LfTExUkw2dWU4WnFxO3plYyFKYmlIOERgKlMhRmhPajhJQW0jQSRUSDdQdXs4KyZUNnUpV0ooUXU2b0ErSFRUPjIlCiswPU9Hdn5+R1ctcmwrT2dJc0pNYE5YYDZGQjdpWSRQZzdLdWdWKjskd2NtNTgxPzVsYHhBMHJVay15RzQ2eEdSODx3JDhEYCo9RCZieGtrCitoT0s5RU09ViYkUTd5dkV6K01OTjZYbmFSYml5KkpBdU1FWklkYEFNX2V6bzs4TWtgP309YnE1MlN6JD1VNklEYWRmSChEPE1rP3VkeTc+CityRXktQVNrRkpeTXROO3t1MmZ6a3I/fVhLT3RINCk+VCk8YD1lVCVLQ2JKMmt1IzRMK05YVnBoLXBTSH1NZHgpJCFVRTx3dFNxeH1ESTZ0CitNQzIldTNBNkArenY5blRHRUFKJnpzRG1+e3MpQj13NlY2Km01X2sme2pFJX5DPlpwUC1EUHw/RUBySmMpMylsQ1YjNSU9NTg/NXF1aXRSCitFOWheeHNFYGRTK2BDdS04PF9OWlE/T3FHXnQwOEdAcWRrX1pLMHd3dDtGVXlRemw8KnBucVJ4JHxzP2ZnK1FSa2t6NzRUZ3o+RmFQO0piCiskK3s8OUo4TChYTSNEWVpnYSpjT1AkZFdERn1eVnJZO0VRYDczazNyNTdiJStOLWtlPik9KmFBK01GVmJ9UH1PR0VNak8+d2dtcTw5WSlQCit8KWthVUkqT1VNNlFNI1VZXzwyX2AmfEc9Z0Azd3E7XjV1KHZGX1JzI04tT0R+XlI1KTlkdlozK3NOamN+UktPQDxnPUQta3VTbk0mNj17CithISluazIxVnV5JXY1VCpHSUAtM096VFE2Oz94Xk1yUjBVSCVHMH1CX04pV05VYz1xNil3ZXgzKj48UE1pRVRESVVmRWp1QXF4WVFgYylnCitabiZeO2MxcX1rTlcmU0AkSDlwdjxGMXxgdl8hKjREM0B4ZDdCTWlxYzRpPHVgNG5ETmpCVE5rPzh1ST1aQmJFVmNKS196TThwNiNEdzJ+CitVeWFzemVxO0lAK1p1aGFaazZyQXNCTlE7UEdmUl42YEdRMilaOzYrZFg3NTBsa3RROEZic2V8PkVIcWgxKWpCeVVLM1F5MEl3YFVRR0UkCitldlJCdDg+YWokRzRiTEhBM1hGZ2R6KTI1JlFMI3g0OTArXnl5PChoTVN9IUprVlRyU2cjPis4KT5XaG5XI3xUSipZU2olfDcqOHs1ZzAmCitMMj1xMHxYUVIwMDBPOF8+fnElamchKlJgelpoYlI5NjUxOFVPJFFhQXxOWUghZCtRR0E/OWtiOTYwZlpmMCpVUWJqe2dRYmVfVSQmI2JXCis2Nkw8bGBjSzRiPTMmdGIjMnx6fjM9JHg7IUk8WTYjUEljdj5mV2xXUkEkeiMqVmVzQVEhM04hOTN0R3F7a1RVMlAxXmh+JDRSU25hR2RgCislJWRTc2M3e21XfU52TGZxY3h9aEEzQj1RVHlWS08kMCMlMX5BTkxiPHA4NF8/TUpVZWMjfmxRczVjKXM9TkFtLXpia3Boc2w4SylaO0s7CitFWS13Y3JOQ09VYDlaZjVXZmd0bnNZWCNKeD88Oz1SQFImSXhwZjglJj1BTnFBIXg+ZkszUm1heTZIR3BnZz11cFhxJCgwK3ItfiE5eF83Cit9cSNxeXVIS0J3TCM5QE8mczdCS2BxdSteIUcxN3AheVA2R2xiRj9mP18+dSFxcjBiJj8jVXghO3ZLIVF1RlApYEpUXnU9P0c4NGlMeHchCit0JT9ZWmljazNgV0xLSVUtNmNiQ3BGOX54O1didGIhQVA7P3hCfDBeVUR9RXhfR0hVTFg+NTQyY1pOQXtlPjBPUSZyVU4+aj0rfEV1T3B1Cis+TDJfMiFVK1FzQVY+UjxYY2t4dHhKaDtndUZ8bHMzKShXQEFyT1YmZTw2amxBQVdpJkdLbSVtJiNKKnsyc2d+UW9hTjtaTyM+Yn05KGctCis4MWE/MX55MXJLKTswfVZaemI3bExmXmRGOGlTWUZSQmVod2dKe0JfeEpUbnAwOFM0WHZiOCl0QVk/SnspSyswWjFxZFN4IShaNkFlK0lRCithezJ2O3V3bSQoIVg9ZGc5azRsNio8YChRcC1KYEomXkNnRTMhNGFORnVqTUAmeihaNX14Ml4kb34xfi0wJSU3V3VtJUcybF9AIyVeKzZSCit9cEpEaTErSVNeMyR9UWJuS2VZTmJmeENodCVie2A7WiYhNXpsbEAjYFJiMT5eQ05KPlo5byg5YjdMR310TzIzR0xKI0E+OFBKMG9hMyskCit+JmtnSDxySkh1KW44I08yVipzb2hPdkM4ejJ5Y19IeCFFaXp8Y21IbU4+KT5pSSlgXzE1Sj0oR25qb3hRNlohNUYtREVhVU5rNilaSkgwCitrWTVaKW4jVjRkPDI0cGpgcThebGFnayp1RSZ8YXlzZW9FMFIyRSRuaz4wQD1OUFl4TjgjZjVMdXp3dld2QE1KVF9SVmVAdld7fSNGMX0zCituc31ATVE+PDVrQVBTYyUoQ2U3RkM8QnAoa2pRUi1LZ31gNkd5K0VwZGE3ViFhdFB7QnAjRjluX2tQZDBmUSpTOVdAY28wSFh6YXZjezJ7CitiPTFjQUgqNCY5UGdAZTV2I0x7U2w4aiRERV98MHZxWXAxNVdSPmFgNGBDSSp8Xi1WQmB8N1I7O01qLW0rb0JWZUR0eTYkP0tFI3tQaypyCitEa197Q0twXnVfbG9LY0BVez9xUWA7Kip+OzNWKS12SUNGdHZIeW5ATEt5JWZxZm55fDFoVEMtSTw8SG1oYExkRkxzQkoyUUV3bDVyKHNsCit5SypVQV92eWAkfmBLYC1lSkZpe19EM19FNz5GOGZJIWBrNXIzQFBZQ1J3bGMhd2pGbk5oUS01WXU0OG4rVVZDMTA4bj1NWjZpd2NsfjR3Citvej45USNhR1lHOy15dGVuIXk8ZHJVeDV+JjU2VHNGODR5YF5iMD8jUUpPV0RNNTZLZT44SjIten0+KVloN1Uwe09qcFlpQyM1PUkqSzBqCitYeiVBdkxOIyFDcWhkfUBjMGdTOyVlNEBGYi09UHFOe3w1WldtbHg9SEM7JF5eSV9oKjhERCVPeUk8dSNpUEVmZj1gfHhyQWxjNUtGdG5NCitDYFo+fGdlNCFKSEhjWClOVnRUakZEYUdUaFlvY2xkTFJNSD9+cHNDZGdaTEcyTWN3aztPY1dYUyNUZy0paTM7cEE+Xz9UIUcyQitLdVQrCiszfHsmY3JHPkx6LWtAQ3phTkVzcDFUSU92R1c4d0A3MWJpM1dudi13O0c7NWwpQGtHIz9uVW9CPEM/LUZlb3JTdHc+ejVwfGpgIWk8UzliCitLQkdOKipnZTBEVT5RQz9fZFpnZT95UmpXMCY/cj5jMlc5dG0yX29WfHw0X2FCZjcqbH1CPiY1KjI0LWJnITR4TXE0TD9UTz9DOGV9e3E/CitAKkRndTJkOGU0dUNKIVd4UDJ1IWd3VURtVUxlN1JaVCR6KiEjM3t3a0o7QE4pYER7dj5HdihuP1FuP3ZveGd2Y25eVWB0NHN4e3w0ODVeCitxa2hteHlARyRnUElFNUNgZCFec19yTjU/OWQ4Mm5JXn1ESjBAdW1OMk5zVSV6NDIlMl9ZKTNMQVM4YEQyczYpSW50TUxoMmctQmZWWVR1CislNHdaJHcxfEswUWQmRzlzfF5TJVEzbyppU3ZuKyNlKj5POU0kISNXcU55Tn0+I0dBfFhCP29hWW4hWXw5ZypkWkE1eU9zTWxPJjExZnxCCisyX2VPem9Vc0NePWBnZH47UTdYVWFNYmdzYm9yRVlxSHtyJFg2I0RxJkNsaihVJmllcUdkXlRlQEZPbGs2Vk9mcT1OfnB9bCFaUns8c2wqCis0Zj5rKSFDOFU5STxraUxKPW9FQW9VSzB2MlRGZ3Mhdn0pd1lJeXwrXnNkMHJ0TWRkTnhWeHRZZTx2cFhSai1SVz13aGdkTHVsNCVSZXZ6Cit6QXZzPClTO2Z6M1Z+bjFfbVN1amZiSFVTUC1ZTE1YcFJWY0dPamohZjtIPEhAP3tjWl4/NTFIVWZ4a0t7eXliRCFKamtuXiFvbUZuaStrCitIdnJ9KzZCPFVsR19RenxwcnloJmVvM1cyeTd2fUtiVFhRTWZgOXk4JTQ1TnJ8dS1fbEtEYWp5RjJiVzx4KHQ9SUcxM2duVGdtREVzUXpqCit7ViNnJksjUXIoMm45UnxWZyhkLTN3Mys/NXJjc3QzP2dKfHM8YTFKdFk9Tkx+bCQtN09hKHhkYGQkK3gxdzkxY25ZTEdjYkYtcmE5PXdCCitlZ1hucmhKX1QkMmVtWHlNVGFtNi18R0NRZyZ3Mz4xQ3QtS014Nk4kZTEpdjl7RiooQVQpMWcxV0NZZmw/cW9nPVdmM29WNDQ2VUQrJlAtCitGOUFrRmJ9R085YiQjdEh9b0BSO1crcDtacn4yP3Z3VjBoTFNfXmFWU2w8PXVuMm5oTjk+LVdaTyUpQ2ptREpHKEhjdHEwJjY/VS12c2dJCis3Mzl+Kj8+ZjZSNUs/NkhCZW9TcmNSKHdiQWd6NnQhXmkrVkolc2c/VTdSWno/MGRDe2NROG0xX304I01iYSh3aFBseUJ6JGB7NDlrT0lOCituMiNLJmAoO0lmV0xSPyVMXkwzRSMtfiNQUzxlY3Y/NUo4RXJrKyloYmpsJXdRbDBfY2xIY2liYVlTbWx0VTw1Wk4kY31zay0xNyh9Kj4oCitjMnsoUT5ERCYyZS0hUVI4YEtnalBBREFoYURud3JJJnZpdX1vWnNlS01EQTx2OGQxYGRVa0lzaF4hdmFoS1k0USQtJCMweWszPHZqVnohCit6WlEoYSo4NUgtYihLayozbCRXP3tfWClaTVZkYVJNS2klQl8jOFdINF81Y0w8Mzw9LTBAYnVDQis8fDQ+RUw4YiY2ZmpFOFowYyFaI2U4CisqNmE2OXYmdlBBSVEkTjlKWCpfaVJsIXB8NTJQYFVxa25QbW9+I0lAUGEpa2pUMHY0NG4+anlhTSNTQlJ0S29HZHZWJjJEQWo+d1hjUVVMCitIdDFHZUxMfkF2QFVYPithMU1XPmM4YlgyQSMzTChjQD9vajlGX3FpeGROIXtiSzBRQnFxMnt6MnlmLWV4ITtpI05QYzZ4MFlfZ15UWHdJCitGKVRqIUs4U0hyKHJfVjhQWXBCWXt0a3BeUj5RZVUxXiR+RGRfKUghSV5eTjdtQSRfZl9wYUZIUjNNbCF2SE1SXipjJWFJPyhAUGRzMGtOCitCSjtCXzJxa2R6ejxuem8+WkxFayo8VntAe3RCeip6aXMqP00+KHFOOVMlYkBOUjJHZW19T0FTa31rMj5zak0lUFM2bkNYVktyNmghUzdrCitAdjJyO2slQmI9Qj9HbyZlaX1oVj1wI15ITSVFSEk8ODh5SWJAZzM8Vmo+RGhWdjxkYER1fmRzNnleYGYrTHgtbDt8RmVZcHp2VGlgZFlHCismVXpHdFYpZH45UU19UkgmU0kpdDlBQHpPR1lVQ1VKdzM0ZVhDcE5oa0c4ZCE0e3pRMm1vMTRsbX4qLVZuSFNrOT5VQ2wjVWZzbF9ZMWYhCitIR340dVpAa08jVHQ5RT5adWx6MWQrbyZ1dThNJDw3TF58MjAzNnEtUUxgRjwrfGp2Rj8/az50Y00qUF4tRHc5Qy0lUTZwM314RTt1TSpECisre29eX0NfX0ghITZjdmdOSldoZylTaCk7LUw4SEFNYkF4TU5Db3FqU3BabXN5fERnQkRvQT1SMU4paXk2PmF8Rm5WNyR+KnBqKVA0QVArCitPSzxkNSMqOFEjNUx2JmkxY05EUmxtTmhMMX5PVFFfeEQyQE4pTkFYWFZlIThGTG1lT3IzcSZoXnNGPHI0YWpvZCQhQWhxdU1zfn5hUEc/CitKMWk4OVZxX1l3SiUpe3V2MmoxLTElSy1iQUxXMEVJTW5JTWFZfEdad0srKSsycDVJWn5BeEohK2hmOHdaN2I8M2ooQzN+dSstczt7UWJtCitnYHdMLSN4KFFaa0BuTyteayRpSHkkb1p0LTh1dGckPCpncjxgdU5BQ2w+OTlMWjE/KmYmQzxjTztefTh8MzlhRUg+b1pvMHVHVihERz4qCit5MEt9VUp5UHoxJWxrfVgkUXwoPnhxa3N+bGRgMyg+TytMeFc2fkxCV2Zpfit1QSF6eklpc099THJ5YVlSZ1VrOyo/MChXZEktfiorbVNmCis9RV8jMXF8TT14b3I/SUFackFxP29VQEw9Pl5rWWMoPDgyRFlDMihXPEB8YjIzRVI1ITBjWHFza0FtVVIze3NvXlY/aHd4OXQ4ZEN6Mj0+CitoemVSM147bVc8cDgmayV0TGppRDBBZD9GfE0qcj07VWBmK3NKTEhIOzZeYmQ1Xmo2KitrcTVHPSZgV342R3AtPz08dGomWVBfeHA5UWdRCitoWkMtM2B9ODFwRGhQM09yTz0oNSo3WWFxSnVQLWhDP0lefjA8amJVXmJWPD5ZJEZOZyhicDNgV3lkPVk8YWclQXt1OW5ARX0+RS1Ye3ZyCitYN2UrMF9fKn1RMEhPd2hLKEIkKnxTRmVJOUU2aGRIKCpndystZVItUFRKX2FTTC16UlhAWDJJPHQ+RTA7Z2M9OHwtSHdjPVokWVZtX2NXCityZlR9YDA7fmJ5Pj1wR3JGT0k3TmFZOTx7bjUhaXxpbD4+NmNMPERzWFVBPkhZfnVSTVFXN090UEhRcSEqazRAMHhnSlhreihnaC13TlRHCitYPj99ODtidzQxPFcjbzxCY1FmKH17IU9eOXp8by1ZdzRGNyoqfCgpUjVjeX5eSUZqaVFsKDJHI0dpTFZ+LUl9eig5c0omKHtEa2ZuUDJ6CitndGtvcz1uNG52b0U8TTJUYk1VNV9iRH1INHtZYEpteXA8THViQnRic1J0XlRTNXledGV4UmY3ZzRYYDY9b1puXiVYT1JGc08yaj9tMjk2Cit4ejN1fiM4RjdzVWZRNUBSKGR7JkslWWg7OzJBMnNrRDFtU2VCUFI5XjJodV55OVZ3NFZ2KS1eTnlLKXo1MXFKcnJ5M2EkfGlQMShsPmYyCitPdHYtMiVafV49OGc+ajArd2d+Vm5uRF5hbDZsbl9ZP1lHYHYtM0UqM3c0blJoc3ModGg7a2FyMHBDPWxHZDxFZ1FWU3d1IVdrRTs+KTNiCisrLS1UPF5ka29Ub0I2KzVibkBlMV52KGt3VHVZNClOakNTQmVsYiFabiE4cnNWJCllJmYkJE88d3hSNzE0RWA1fURNPmV6SD9JSGNXczt7CitESl9Ee0F3R3RxNUleUjNHUSN2cD1fWD9yTndgP20xZUFZcj4kPUs4P2ducX5JdDVOaTJZa2NOIXliN2UxZHAjRms8Jkt6LXY0PjdANm1uCis1WmZXWmFKNlh6enF3RVNqfl9pb0A8OU04WX5eWXR9TTBqPz5PZy0ocEo0bmswLWZaPTF5TFhYQE84bVU4K1BQKjlnb2hWWHNRfXl0cz1ECitySjRUXlJufEYjWjN3QElQPyQ/clV8NClEaWw0eFEyYkNRPWUkNklQQG1iZ3dkbz9GMnBeaTsjaFBZT0FGJklsNWNfaHlFTzQrQFchK1Z6Cis4U0BCTVFge1hWYCllU3UqMEllRDRLITJJN0l+PjgwVzxVJi07LUFpMmo1YUl8SyFQSChDR0N5b0lxXzFvQyYmSD5hYV4hM1ZBbiNVUjZgCitsVl57PGNWO1MmP3lMVFE3Um91QEViPntpZUB6bjl1WCEoZmwqNk9xXnI0dz1qcXVwVlgkJGVxTipndiF1WFNCMCpWJHB+K2pRV0xJfSZ+CitHPXpZeClLRUoqOCRfRyF1N3ArKUs2entBZXFzcSUtd3dodmZhVl5BS1ppVGswMX0mXzZvXk90WXpqdGJXTCpmKTRITnVNUXRFaHpLZSY5CitJSURMamBCcEI7KDxhNk1lVVhmQ0VmX2o/emYyLVYtfU0tY2ZQKThyUVVIP31XZjBDaDFINGRpcDdjYHo9WWs0Yz4yUkQrajJsbWEzUDNvCis2P1k9ezRHbHZATjBrM0NvLTVzcD5ZfGhJc1M+PiU8cVFJV2JxdT9Lbl9LQUlLRm84TiNzIVlBbm9rNUFGIT9UTTc2fEB6TDstaGE9fjRDCis1MGg9PG0zM2JsbTtkI2k7OzdpSTE7ZWxSYUg5MTx9PXpvSCokWSNsYjswZGJgS04+Mn1vIU5fI3dNcWI8fTZ9YSlSWjFYTWE5RitUY25ZCis9OG9CbSNGM1lHREU0amFkWm1jTnMhITVTPmgwKzVgTDJqbDBIYzcteFhAYUgwZGVQI2Q5Xj5JS0VgMiREdWBAOEJVSGJHVmRBXkFefiZgCiswdG9IJUFCfGJRIWtUYHIoTExqcFYoVW8tJWhufTZUPklxVFpwMUE3IWFPSGIrdnBlLShAcWJDdmo3OU8kRnFETy08WUVvUj5Na2JFTypmCisjPFAxaGQ9IUVHRHVKX1VRbWhjQyEyKVgtO31fans1d3tMKihyQUtVYVNIWFRwOE9wKns0QU5eeCpZZzZVTjZ4NEMwSXZvVGtJM1BtM2dRCis0R316eGt8bnUqdTd6OFRmS1c3MF45TkI4SU5yUUImJD1kP1hqSmlmSUlZKEVpYyl3fVIrOSRAbHwwYUd4SjkqanZWRUZId0hpJEUoS3k/CiszaEBARUMoaCMybHctUjZEZWg3TSp7NjI+bnVNaml8O01HZmo3JHdATl9GUnNrYGVERGxnVn5pTk8qe05Ue1RhUlUreGNLP0ZnI0pSYWB9CitLLVFaJEMqSTxDUVR6RmBFY3xNdzJmWiYrPH1lPSpkWmFsQFBqZlgqZlFDRWhVVHtwITFYUyp3RWpqYkMwKFRWai1jdFhDeWVZSyY9YTwqCisrd2A2RktwfkNtbElhO3t8R1h2KSRrYSMmYGlHdGkzbE8zVSU0bGJlb1kmNzV+XiRtS04yV2peT0pkMmUqe1YzcjRIYXJkcTc5PksxUEAkCitVdSMze1kmSiswRTY5JDk8WkYzQkFOelBDR24hOGQ4fTEkZmo9M1JhSkU1WEpeayN7Mn4rbCF0TFRkTSRhbU48SW9EZzJrbz5ZTjdLQEZUCitjbTBVKkxVUFledjw1aHJiUE48fjMtYHVVaVVHQHM2YjFsbzFHUEtOWk0lamlnRDJgaV9BVlB1Xmh8M1Z3JmJsOzJGZzB1YGA1LWdgKmJNCisoWkh4R2E0KSFFYW8xMXpOe3lEUE1adHpJQWNzUUpTUUp8RTIxfFVuWShkWCNoY2YtVU9qJHY4KyMycDN4RW8lVCRudyhicEFRTmR0IXxhCitEUW4lREkmSVl+U3tQZWlrSzg3WC13WDZ0PzlVdGRDUnFVPypJZVRMY3E+ZFlEZGFMU2g8amMlZWI8ZT5DRXcydDk1YmxVPzxmJWU3V3ZaCitfIzhnTGhPczAxMnRZYWBaNVNaZChkT0hiaGp+eDxieWZHbFBlTyQhIWZqLWFRZUUtWl9XRlAldT5eX3VONms8UShqXmtoPDx7T2RAWlZUCis4PGpCWng8YTIjfCZhZSF0Tmk3Vik8VGUoMWopT1lCODZaJmJDZShiKitDVXBmTkNxRVQ2T3ska3JKfGU9Xi1ke3VxSnhNKFhGNENoYntQCitkMTIjI1NuVj9gSUpITEkyIXg0WSkmUi1OaWZKaFk+VyheQ2U9TEZzfFhgZkBtYn1FbnMzQ2N7MnktIT1eP2M+VjF0aWRGPWVeekpEbn09CitPc0NyJkx2UEF6TSFTQHE9YWFVV19jR15vNmVlSD1xaExgM1JITFAjfkNzN1U1R1NZOVkyckZlMSZhUW57VDAjIVFTZ2ZmVVokKCtJM2NgCitgJmpYRGUtSiRGTXMkdFNrY0NiXiZyWkJzXmUzfEN6RSY4WEspYEk2P0JpSERKbnNEaUJAeFBrOC1PQXFoZ0wyTzg0fncybktkTmQ9OSZQCitCWiRTTmV0VWpLYEZ6JFlwPERgKTk2LUxpaTdfJiZaNmxAQFQhMjNmNV50UlJPS3pmT15VPXp5TmRsVGRyYTFze0hOQUdhZXgrWVFmbEdyCit5c2d6MHVGREp1aXcwZypDbEZXTUJ+TyReR3dLNzJmRy1hKDw/MFFYSD1SVWUqTSgjPzVwV0MtQnltPyh6OFZzfmpPU25BY2pTRlVaJHkqCitEcXNySjBKaGAzOGMlZ31eUnMkRkx2MXY+YjkzMTw5eE15TXQocVd+VkNIUUFNQXVsNih4TDV7Zkh1R04qSXYtcGhEZkUke1d1RlhXJXEpCitvViUzZ0BGcTYjalR5JCRfYFJnb0pXUjM3V2pOaypHdXd7b0oqdTRufm4mZGxAJHFyLSQ2STgrdUFxc1VMXz5sPEZKRzlkekheeUgjJXotCisoVzRUOHdJcHptezZhZE5nZFJFV0YhWCZkPV54Tj5OTTYkOzNsRzZveGQ7VmRUYmcjZj1HYX1tb1UmZldvUEl5K2NefSZIM3s/Yig/cmBHCitXYUtCTGZ0PlcqdE5FZXBCSlImRHJyelB1RTJzQTIrVjhRQDY9KXMmakRlWlkoeVR9VyppaDBtemd9Zn5jNT1GaistaGZ8Y1NIRUViPFhfCitTfjFgQSU2SVBDKW9XczZLJmYjYVBIKXpYSzkobz9qaXFwfHl4UXZOfUc1Nnd3U0Zlam0yQF5lb3Y+cShgPlJMS1FSUk9AcD8oSWgzMChLCitTZDRyYl9LaT1mNCt0RlN2RHtldSZDTzJeQlpHRiRASStSTlIyQiR7NV42JGhYYmdvPDk+cjFtT3hsciQ+NiYzSjN6Q3pIX3VNNHxKfmdMCitgY0oxdFYyV0NkWEtTb0Q1YVpOUypXXilLOCVHJDVvV1pHck00diQ3PD1DJF89VE5wUHlIZDJKa0lIdT5WaDYlK0pmKEk0JWsyZmFfKV9sCit0cyZWRlR3YUgxVVA3VTN5ZCZaN3tJeyV3QEkkbElkQ1lze2olYUxkSSlkJXJgSWhoMDdKO3RpUkNqVntiMjNQdzhmOFd4eFB2TF5lTTk+CitmYUtGV2h3fjVIRFhseSp8Pj0/LWlARiRoP2kzS19AazN+Q2tTa141Z2pUdnFMK1k3amJPY1p8S2tAKk11PitfKGpOaDhSQjhiZmtTP30+CitgMF9KdjcyRDt0d2V2PnFsNnFIUGdVKXMoXjc0dVJocmFXQ2ohcjBvPTBXWT1aQTAoSWlFY25iVXpsQ3ghYWs/ST1rRnpVdH50PWYwbTtrCis7fj4yMVJebCF9cmVnbDM7RjB1fmM8JVlUOTBHMTBJfEZie3JCfFEmTEQwbFReNk9TYTMxRE8/eUdleDlqaCglPjh2e2IjSitNVy17NWFsCis1V3hXd2E9bG5PRkluI0Z4T2V5PmZ+ey1pUTlUQShTRytYKyY+ZE1vNDcmdjwjeXExeXEqfGEoRnQrdFloaUJoUzk9cmpsRFd2TiN+elUkCis+T3NxQz5qU3NuJHtMdlpGOEY8LV4zb1dLd3R2NXhueWp6RTNMSW9ZakxCPjdTfFZIRypoNip7Tm5udDleemhhWWt4cSR3WlMjSFgrbVFHCityKk91d0w1QmNxT3FpX1pRYU8tNFMyd3FDU047S2t5OSgpTD0/JlNTZz9pV1R5OH0zWmUmc18xeFdQZzgjeyVlZWpQPyh+T2B2RClWMDc7CitSfklmRntqQGZxQ0hsKmtgM1JIYUsrcVdSTUxhZVZse0JZU29tbypuOz4rUmlzPFVFQDJiekRsPUhXTFR8Wl8xc1ZpZn18ZjhjfSpAJWJzCiskWk5GKT96aGI+Wig7e0ZqdHtJSyo4JkhsSFJIRUtXSUxhdXxlMXV7Pj4oYVg1eiYtJTg0U2lqRXYqTU0yJml1UTtXZ2oyJUxKOCojclF7Citsc0BpJHI/VlROKExrUnghcFhJWmBWWT9OfmpHPXEmdCRWZT1UOVY5cjl3NjY0Wk11O3h+TUN1cW96ZU5ENTJXUHR4aWByQjdtPW9kfjhwCitROFVZbFd9SXFDMTFnbnQ9PHBRb05RY2xBT0ZtciVrbGV3QGB2SGpHay1sWHt0U3NAUjZRKWdeaWApVEk9M0V0dk9OJGtHQ1ljUilOUlUqCitHYEYtQngmejF1QVUzfmgyPTx+S0tVe3AzfjVTJlZeUkNIWWVrWGwqPCtqSUdhPVYqZ1lBNUAoTDVOa3BHQ1k9IUVrSnF7MVktUGhJeVljCitjUGtkezNXZ18oTk9gPldAPmdtaSpiTF5tRmZ6QXJRNXl0ckpubEl4YzlpVDUpXy0/TjNpfEIwKWB1RCo1KCVgTSRvYjd2OGsyZjFYO0o8CitxdD42JV9KOSFKSyVma34mIVctRGEmbnAyZHg7ZXtHOHFYXzBaS0dnO2lPMmBUYjcpd29QVz5kOTQmPnYtT2BYIXd3M0ZKR2dzLVZzfH1ACit5OSUpcE03M3cqcytOJlR0PDZEZitZU3k0KTdwMU5LbTBia2IlJG1vUjJXczF2WTtne1QraDh4MGA7O21Vbk1+YEhKPUsyYGk3fmF5ZWoyCit0ZkBvYTs1OXMrIy1ialgkdTQyOFAhPktIVGpTWCN7ViZOcjRiN15GcHRAc1JII3laRjZAVV9SM3BySjBXZllDX0FRVGdHYVN0c3d2LWY5CitZZXM2Z0ZtVGoyY2hJVmp7O05HSEFYYWJkVTcjaD5qWmNWfjVLKn00QkxlTTZfYlFWbXZFcnthfExDTjwhNCp4Pi1YPXIwfWZtUXI0VWE+CitKIz05QGhNeCt3V3FmPTFRclNpezhXVjRNdXB4SG1gYklrWjB4JUNXWnY4dSlFJkc5Mj9rP1g7Uys/fkJYOGBBTWYqN31LZlRvcFhIIzkyCitadWEmXmlabGR2ZykrZVJKbUQqZ2clO3c1cUp1VEB0Wno2Ui1WTWNJVTxESFg0Km5uVG1te0hLKjJ5SkwtYn1xeCQrJngrTF92QGJnQGZPCis7OChBWns4d0RMaWQjemd3OCZrRjFQP00kSThUVGtfPDwlO3VBQCplPytXNVVUfDYzenM9O2Btcnh4R2IzeVBfYyN9ZzFII2c7ZHBQdChMCit7Wjc7U0hKTVVpKU5gZmpjUE4yO1RMT05qWVchKz0tNVhxQHA9PzBTPCNBbjl1IzREfU0/eHwlbm4kfXlnXnx6OzhFcVNfM0BPezdzTGRuCispbCZOczUqYyolMz9OWWI7UTZJZEhaJjc9aXBtNnpPQ1V5ezZpT2o/JiVnQEojS0dEXnd3UntkPzNNOTwlZEp9b1hwTnBYPHRHeyQ8UUtiCitHbVhfV2ZgcmFiRHtYbjtkXlctYT16Izx8XkpiY1RpTnZMMHllKFBsKntvdyNSVGB+NDk1P0A4az40RCl3Sk9eX0ReVmcjb2lhS2QxUWFfCitrdUgpU2hQOG5yaXBkT3xaP19fV2xHKih+b1Z3fDd2cG9eM3Ihb2wpZTwkVj9CdiM2e0VzN2IqNjl7YmVqUUBZb2okYFJTNEhEaWApZ00rCitYZX4hN2g+VEQ8eWRgZiYmekVaald0MGokS1F3WUUkSV9vMilkLW1TTVcrWSZEfURjQ1RSRGtHb1N6SGNLJmdrZDluX1BvNHlrUUlUMihECis1KiR1ZE9kcU5OKl4wdGlKUUo/WmBqJWVgdnw0QTBZWG42NUpaSiNfZENWQHtBKzRaS1lhZDJQUUJZPXFib0RWMVpUUCVaWjRheWBRY3ckCisjITxaTEcwfSU+KUBnRElHZ1duSXBlQHxDPi16aVAxUTwjaTNgfD1fO2N1Mkh4enFEPSsheD5SQG9eZW1hTD1IblpfRGwoVTl5amA5SjhxCisycSpJTjFfPTw4WFA4dWt7K3FDfUhUIVUoMVRUNTs+ZUVPVlkmT3xGWj4lXntZfWh9OFE1cns2UHY1SDgybEI7SjtKTTk+TzkqSTdCNkdsCitQUyYjMUc9QjFkP01reUY2RVUkaGhDfkUlaip8Xm4wZk0rdTZMZVY0PCtCU2g0WE83eURFQHFXa3ZCcj5hLXMybXJkKz9NITFwVnZmWTdDCis8eUFpVWVaXkwtXj9iTk5RKiR+Xlp7X3xXTTMxdGJNak5talApOVlAMF8hOCErMVZHcU85OW5xS0UmeUdVPk4kQHJsZl5sYEBzdGJyfGVwCitlcW4yNjUwVkR3I18yPEJqTjZKMXFtXjNnSEJ+eHREfSZ4SUJ6e2plUl9Ve2U/LXFYKm0+KHtHQ0lBUHxgMGN7MSNXYERpK2Q2PUpoJXltCiskSVJ4JTtITz9hfUZpcTBQbmArdzEqKmBZb0k3SDs5MFRNJVN6OF5aI0NiR00rWEhnUDQ5T09KeiFSdCkmNGQ1UmhtUWQ0dVNfdHREI0BgCitQd2VJXl5iRWtrKDdtd289QVZXYigkIyhnYyotQ3ArMD5sVSoxRU9+akhmTVk8M0p3flk0WUUjNGc0aEctUHtRUVE+ZV9qc3MtfWAhNyQjCispYVZHZSVjUEpPT1RUIU82QnE3UjdsP3AtNmBPKWhIK1ZfOSN3YF9QbU9Ze2oyU01AQCsqfF4ldmMlOSZEJUhMQDxjSHc8Wlhaa3crLUsmCit3STsjenltJD9HZm5GWjhhI25lSV87PUdQLXZnWW4hMGBzKWNLKWs9RTtXKC1KTDteaH5SLVl0P1UqPyVyUTd4aXpLdUg+KjgqQ0NaNCt7CisyPXVSXz1fbGpZTztRKXx4b098ZGA7KmVQcj5sRTNYKm0jKDQ2MGJZTyN5aWI+TVVwcyliZSpJQF95TC1kJEs0RWl7TzxBI0JjRkZ5RlIkCitadjwtXn1HNiFGaUQhUiF7MDM3Rmd1d0ZeNVg9cHlPd3xxYiV7fkF5SkF1N1ZBeyYzSWMkfkJzISRfaU4ycz5iUDNoak43SiREU018PVNnCitBYWYlTH45PjkoMzIrYDtnX3RLNlNkUGVZWSV3ZipnTnA9bEZqVG43RTdDYiV3T2Qqdz5aPS1ETz8/ZWhmKFJjM1ErK1VBdEE2KDsxNExmCis+fnB6aTBkVktRQnpAdGRoKnVLaSRvR0N7PVM0JXEyPEN0PDNLKTAlJHNBMFQwU3lLM3pgd2FmY0R1QUNJZEdgKTJjcyo5T1hmc3MlMlo4CitrTn5NdVMtWUoqQ0gmP05Cej53N25RUCRBKGxyMzZNMSEkbj5oT0slS2dSZHBSS1V9JDdsTmZvdiN7LUBAPTg8RnR5S2Bxa0loRGs9anE/CiswKHhha2hPQipoWCFyQ2NfNG5gdWB8UX50dzU/YC0tJTAjOyU0VnJJYFBsY2JvT09NYzwqMT4yRjZ8REJyMjl0Pmg9NFc/RyZOdXdJTnVrCisqMzhOKU5UI094c3tDbXNxbXV2b301elU+TEUzSVZyTERlMEIhTjhFWGs7dyhpUCVyMjZHZkNYOyRgI21SY3JeQ0FLVlJVI3shbmlAczAjCit4cE5JJiNiUDBkeDZiQ2o1Sj9+IXtQeHk4Zz9TcHU7PWEhJDV9YSQ9cWxIVDNhMW9efllsQDc9MFR5ZFBnKVU7diMwU29AQkBrbUBYaVpoCisweTJJektVNHRNVStlUFNVI3Z3KDE+IXpUcENiey1BTDklLTB1QT0/O0c0QndNKHQtMTVyPEpIQkdjI3xvO3VTZ2RJVFl3K2Y+RGh8TjxjCismZ2tlSFlzb3g/al8xfDtDaEY/cFZJJW9lMlRQZWltKGk7IUZ8aEooRnJEVmdoKFU7VTx2OSRyN3wxfEAlY24pa1VEYGYoVkR1MWM2cjJTCisrOXE9VHkoI3FiWGBiNkRVayFma19SeVpjbyl5RUlXNnBmc3gwPj1xaitfRDBXXjt3RWR9LUJpdFF7aGotbDZZRD1LcUU2JWpCJEhYRnBlCis/ZSZ+M1VSX1Z5REFVSnBMSFckQGUxdSFnQSEpQUJmdDN5KmlDRjM2X2xePXxzMU1xNllHZEFwUj5tIXp8bWA4NFU/bDQ+cSsoP2J3WX16CisqNXJMYCZ1SVhZV24wcEc5UXwwfl82RDZHa3l2Znp9Wj01Pmd8b0JgVGNIdEZZZjl8MDRAXlc7SWE9byFqMXd0VCljPEctOEZBMUBQbUp5CisrckQ5LT1YaiNMOXYrbGt1S3E0fTV6XmY+ViFzdyU8aDdUfTFkc2slI0EtTUJYblR7MHJJQlloUDsldn1eI0wyMU01JWgmJDRBPmx7YFpQCitLbmkydFQxcE87IU0wcjVGLWNBdi09P08kRCNLSipecmlESi0qcnZtUnIkZW9yZVBzKGoxcXQrJlE3eitHU01qdXtGRWpueHJefXZzTD5pCitjfUhSQmU+Yi02JWQxPmV7bHpKXkNvaT1tc0d9K0B0dEdRRnA7dHhzNHdgOUNwSSFMakc5Ql9tPUtPODV6dSg+VFcld3FsM1Q/dFpqYEwtCitJYlFXRnxeSztWYnlfZWszQnBOVWg5Xm5JX1ReMEFaSW87MVJeJFlSMldsQEIwPnhLfD5EVUFAODJlbV8hJCp6JEo1MXp+YDVqbD5mJiNgCitjOT0/X19OX3l5ZVIkKUJheEZVK1Y1IXc+SklhMy1NfDFeZFJKQ2I7ZTttWElQZ2lJMHdGTiUkJTduUnMwXyVEWVckWnRQJEwwcElZUlhKCislZHRLfiU3RUV+cE53THZ3cWZzPm9QVztjRSFxdH5kUn0qU0dkb0g9YzY4cDZlYTtiTFpnflNvKypLRFBDPSY5dEVFNDFwUjlCVlIodGAoCis4XjlVZ0BuX3doRSotVkxJbnFgVD0zd3llOyF9PkRRMTJsN1VfcDVramA7RTF9KSpMNXAqJiYxPlU8MCZHYTY/TVo4MXFYUyFsfTV7VSg7CitNMFcmP3ktIXtyeH1FPWUldyQhJWVjZEZoPEA4UTAkVU5QcXAweHM1QSZvJHhDTG5ufWRPQVF4dFlTUDwyS3RWZClZSSMoIT1BXyZeMEdmCittM3MmOy1hKk48X05KNHpvSGNlYn5hNiVxZj4rRlZIUFZQe09jdF9qbipIN358dGZhcXsjRzZEZ2ZAKG5ZTS15bjFmSUZBN3l4LShSeWclCitNODdZZTR4X2pmUSF6QypyV3B8dXp7a3skSVIlcWM9XlVLKCtHayRAKyZyeEJSVHEhRCFKdE5ILWJnWlJgVj1zKSZ0KyVOYVAmdD45UXFFCitacTdkYnUmO3o4Y25lKX0le3s0cT0wfkRvX2sxTmxScFFDNy10X0tIQCE5JWNxTjxmIT45TSUzN1R0dlhfOz1WdnY2Mk9kQ0ZvR0dWWmJqCit+KE8wODdoPjI8aj4+TktpfHlyKk9gdjU5dWRAZyFxSTd6b2tKekp0e0JzempKQzRmZy1hZmBlQDNuWD83TTQ2eiQmLTxkRkEkUndEJVZ1CitHKUNrcGpgS2lEbWRYSVFhK3FSTEZKeG1iR2dgcFlhYXRiTUtwdGQ5ZjlCWX5xcm9PYnlUOUhxX1d3d0R6V3t5OzI0UDg+NlU0eURvcFIwCitTYSMpVGd4OFktXykyaT42Ml59V2hkVSlJITxONiYhe2RBV3QlNnwyMTR9UUFhcSt8TSFXazQlV1olSHpTPGkrVldDcVhMMEtaNnooLWF3Cis5VEgmZ3VGamRAfmlLaEUyVVRmQCVwIWFBSUNIbHhwOFIrMHpvU2s+fTlQQXYhMTVyMDtqRiU5X0ApM3FJaTZXflglJis5QDA8SiEwNHg+Cis9N1Iodn4tdXI1dWg/S3xAbi10andSSGlhJDF4dms1RzR0RFMkaiR4cHpLY2s9R251I0RHITVJUzstJUxLbUxJblpnOU9pPlIjMXBQQyNvCismZlh8b1JHOHN5cHhCYkFIbHZfdztrUzQwP3ItOUIpb1ZqbH56WlNPY15XZXJxYm0xUWJRWVBDbk1uR2wzU3BIZW9GOGtYSngpSiNuZlhsCispc3c1KyFpVkxTOVBhSE1NSEhGcEA0KjQzVEl4Tz9KZ1lDfUNiTUBpUFg0QDRAKXdAbEcocX58QnB9LWRUcVo8MGU+alc4eG55PGNWcmloCitkRHp8JkV3Q3BPRlhQaUp2c2luM2s1QilyJnsxQDdmOCQ3UWIrP1NIeE1IaTtMbF5JdT1tQ1BzYnU7LWV5ZjA2Vk03cmAqUWlAOz13K3p2Cit2MS1iblpoRCtycXxeeHZoa0khc3lecEVMR1NoRjdQPXVfb3t6KXJyZjhZdlc8R195YHhnS3ZjWmN3eVg8Yjl9dTV6KkR3N0x6UDUxaG9WCitnIXU4SHc1c2M4WFp4RSh2TkFrOz9iJGZrZz4pSEFfY0VXRG1STVRSbFgqO3VVb3FlfCt0bWhmRzVyR01QYHF3bGRPWXJganheVHFTfUtKCitYe0xUR0Uta3pNPVBMKy1YWHVyJGlMN3dYJXg2YV8mUjw0dHZrRVRtQnI3dUsmQ2JrMDZ9U0JGS2tKS3gzJWBYIXxGTVB1NkE+Pz19WmohCis7Myh0a0ltfnpAZ2ReKFJLYHQhbklpVWVZZn4pdnctck9fYzA5UjtweXxiY3xHU0pJQW9jTmkxOXshajlSeXB3UHElQiNuTntiPjZhQU9UCitjLWA9aUUpeGd+bUNEU3c3Skg4PnhgU0UjTzw3WUFUTUR5SSR7Y3ZoSF5pND4rb0claj5GOHF1TiZhQ2N6XyM4OGJFLXt3VXRmaFcrT3t9CitZb2BzRD9QUHBDTmt1dTY7Z3EwOHkhRTAydHE4RUR2VkV+WntCV3RnRVQodk1FKTd9eDdxakQpPH5vezBQaHJ3bHVQZUJQTFJKdEVjfHFeCis2KE0lY3x3R0tLck5SZDJ0d1VOPUFfQ0B9PXxTVzdNY29TZEh+ZHU3MEJScXhaJEBJVVpJeGtwIVAjR2ZsZ2pSb2ZiZHo2R2AwNz5SMGgtCis8USZTRTAwMTtVVmdsVV56UilJZmNPdmVBTlc3ZEdmRl5PTWZMdzt4ZUtFbykkMzY/fEVLR1JwWGVFSnMyJE02dlNkXjVgdXombV9+R3klCitZe0g4SF9SOFRhITZpN1ZVO1NuKT0+SSsqe1J3KzNRb0ZAej5oeVdFV3RlfH5McUxkSGR4c0NuKGhAcDNnPjA+TWRNdk5KMVQwMnApWFJYCitoSlh7dGRkLXZVUSVpTlZfPV9+ejlYUGc/OEw3U1YtJThgZWFZVnpSeTZeYGReey1fd3V0ZFFyO0sldiQkTUtfV0FjTl8yJT5hVnhyV1BNCislemdmME9jVnIqa0F2a1Y/aWZpbVA9JSVuST9wbWo8Y1pyPUBOKzR4e2dRcFRuenNjKWJndWxzO3tyUzVZaGE7KFZSRkR4bCgkSm50MkcyCitneU9WNDByYHZnWkpRemRteD0tfkR8bGB4QjxsRl5iT2FjMz1OQHMyaXNVQURiTHxuZnJBZCN9TGh7ZEp6RipRcUB+Yk0mV3VQT3MyYnVUCisxVHRJOGxLMUwhRTVtantUa08ySThPU0JNP1pBWDNhPF84JlF+MTh5YU1DMyoqTXs2d1o5ZlVKUGVKMDVNdn5SWnFGQXVZXihQRjA4bVEtCiswdSUhajAwMDA4MFB+ZD1NfSo3KDBoU0VfMEluemkwMXA1RjAwMDAwMDAwMDAwSGxFYzAwMDFSWD5jIUpVdWtZPmJZRVhDYUN1Tm0wUmp7CitRNmFXQUsybXRleTdEcjEtcS04UyEwMDJrPTAwMGpGMDAwMDAwMDAwMDAwNStjIXdtb2NhQXxOYVV0ZXV1WD5NTyVFXnY4Sk85MjhEMH43CishTjAwO297bEA+Pnl6MU9PeTNqaEZsREY2VHgwMDAwMDAwMDAwMDAwMV9mZz13OTBCfnQ9RkpmVkhXbip0YFpERFI/RV52OEpPOTI4RDB+Cis3IU4wMDtve2xAPj9aRnZMQmszOytQKEM7JEt2MDAwMDAwMDAwMDAwMDFfZiV6SCQwQn50PUZKZlZIV3BINn5iN2dXYWFDdU5tMFJqe1E2CithV0FLMm10ZXk3RHJWeXQoXmw5MDAzPHswMDBwSDAwMDAwMDAwMDAwMDUrYyZMO28+YUF8TmFWe0skX2FDQipKWmdWYmhjfkRDTTB1JSFqCiswMDAwODBQfmQ9TSpfM1gjTTJARzBLanx6MDFwNUYwMDAwMDAwMDAwMEhsRWNIfjtgfVg+YyFPWitDOE5aKChGRWFDdU5tMFJqe1E2YVdBCitLMm10ZXk3RHc0P1A1c3NaMDA4TCgwMDBwSDAwMDAwMDAwMDAwMDUrYzA5eWI2YUF8TmFXcTR5e2FDQipKWmdWYmhjfkRDTTB1JSFqMDAwCiswODBQfmQ9TX1sQmxwaFluTjBPel5AMDFOO0MwMDAwMDAwMDAwMEhsRWhUPnQ9Wlg+YyFUWmUoUzZFXnY4Sk85MjhEMH43IU4wMDtve2xACis+PSFgTUdtRTNJRzd+ODJ8dGYwMDAwMDAwMDAwMDAwMV9mcG1AbDBCfnQ9RktsbVBWUlVKNFpnVmJoY35EQ00wdSUhajAwMDA4MFB+ZD1OCitBRlJPdG5+IXwwODBANzAxKkhIMDAwMDAwMDAwMDBIbEg1bTtlQjlYPmMhYVdwRmV5SEZSTlRiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5CisrcEtyP2VFPExlb0Ijai02OTUxSjAwMDAwMDAwMDBxPTVwVDAwM31sYTQmT29WUlV0S1V0QDElV3BnZlljfkRDTTB1JSFqMDAwMDgwUH5kCis9TjIyaHsqT1ZqeDBQMXhCMDFOO0MwMDAwMDAwMDAwMEhsR2lwOHg9R1g+YyFoWGt9JD1FXnY4Sk85MjhEMH43IU4wMDtve2xAPj50dnw3CitQcTFPTmNjMj48e1cwMDAwMDAwMDAwMDAwMV9mb3tZQTBCfnQ9RkpFP0xaZSh3QUZKRTcyWmZTSTFVb0xRWVApaCo8NmF5M2gwMDBPOF5PCitZN3locUplKkdkbG5QRD5uZkU3eXRrTzAwMDAwMDAwMDBxPTUjPjAwM31sYTQlbldXb34zfGF4WkNjVlBzQC1XcGleYmFDdU5tMFJqe1E2CithV0FLMm10ZXk3RHIkbjJhUlJ7MDAwRjgwMDA7TzAwMDAwMDAwMDAwMDUrY1p2KzdWYUF8TmFVdl8wfldOJmdXYSVDLWNXb34zfGF4UVJyCitQKWgqPDZheTNoMDAwTzheT1k3eUEkejxFJmp8bmteZDxsUjdYU2JOMDAwMDAwMDAwMHE9NT90MFJWN21hNCVuV1dvfjN8YXhaZGFiYUh1CitWWmY3b1ZjfkRDTTB1JSFqMDAwMDgwUH5kPU1gQ0cpUFQ/RT8wTmBAfjAxXk5JMDAwMDAwMDAwMDBIbEVyNUNIJmlYPmMhSmM0Y200WipuCitobFg/UU1oY35EQ00wdSUhajAwMDA4MFB+ZD1NfFRFLSNzVUVWMDVrI3MwM3JZWTAwMDAwMDAwMDAwSGxFK0VkYzs8WD5jIUpjNGNtNFoqCituaFJaRERlMldwWnEzVmxRN2BYPk10QlV0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1NPWxmR3F7YW1SMEUtVSowM2lTWDAwMDAwMDAwMDAwCitIbEZwRSYlez1YPmMhSmM0Y200WipuaFJaRERlMldwWnEzVmxRb0JhJSpMQmIxcmFzUCloKjw2YXkzaDAwME84Xk9ZN3lvY2dIbXReZmM0CitFJiVgbEJtZSphMDAwMDAwMDAwMHE9OUVOMFJWN21hNCVuV1dvfjN8YXhZX0hWYHliI1oqRnZRWilgN0xVdWtZPmJZRVhDYUN1Tm0wUmp7CitRNmFXQUsybXRleTdEd0ByYlhAcmEwMDNrVjAwMUtaMDAwMDAwMDAwMDAwNStjUzJZMHVhQXxOYVV2XzB+V04mZ1dWX3s9eFduKnR7YmFICitRT0ZKV1kxYUNCdklFXnY4Sk85MjhEMH43IU4wMDtve2xAPj01cz5ianYwUlI5TjB7e1JhMDAwMDAwMDAwMDAwMDFfZnNyfV4wQn50PUZKCitFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ1BCVmB5YkFhQ3VObTBSantRNmFXQUsybXRleTdEdkxwSzY7Vj4wMDFgdTAwMUhZMDAwMDAwCiswMDAwMDA1K2N7NXRedmFBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZKb19RYUE5O1ZhQ3VObTBSantRNmFXQUsybXRleTdEdmxLCis3YX5GbzAwNHw5MDAxVGMwMDAwMDAwMDAwMDA1K2MmTzhBQ2FBfE5hVXZfMH5XTiZnV1Zfez14V24qdHtiYUhRT0ZKb19SYmFIUU9ZLU1zCitUYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHF0PkJsViNKMDA0TGgwMDFXZDAwMDAwMDAwMDAwMDUrY1I3bjg8YUF8TmFVdl8wfldOJmdXVl97Cis9eFduKnR7YmFIUU9GSkBfTVdwe0Y2YUJ5WEVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj52OWFXc0wxcG9sbTQqJm9yMDAwMDAwMDAwMDAwCiswMV9malVoQTBCfnQ9RkpFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ2VLYiNpSFFiWktMQUVedjhKTzkyOEQwfjchTjAwO297bEA+PH5DCitXNGo2MkxKI3E3eXRrejAwMDAwMDAwMDAwMDAxX2ZpNj00MEJ+dD1GSkU/TFplKHdBRkpvYjJYa313PlpnZ15RWSVnPFZhJW97flg/a1RZCithQ3VObTBSantRNmFXQUsybXRleTdEdFBGI1hgSVEwMDhtPDAwMUtaMDAwMDAwMDAwMDAwNStjSTltWSNhQXxOYVV2XzB+V04mZ1dWX3s9Cit4V24qdHtiYUhRT0ZMIWNiYUJ5WEVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj55OWFqOXkwMDAxUzBSUjlpMDAwMDAwMDAwMDAwMDFfZmkrCit3SzBCfnQ9RkpFP0xaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ1BCVmB5Yl9GSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eSFLCitWaVFUTGwwQiVuYmtsRWRUJWowMDAwMDAwMDAwcT04OVkwUlY3bWE0JW5XV29+M3xheFlfSFZgeWIjWipGdlFaKWA3UFZQan16YjEhQ1RZCistTHwjVlBqfXpFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9TaHtqWj0wUlJCYTB7e1JuMDAwMDAwMDAwMDAwMDFfZiR3NGcwQn50PUZKRT9MCitaZSh3QUZKb2IyWGt9dz5aZ2deUVklZ1BCVmB5Yl9GTEdzTVg+KHM9VlBqfXpFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1ZTjJqOHYwMDAyCit0MDAwMFcwMDAwMDAwMDAwMDAwMV9mI0dCVTBCfnQ9RkpFP0xaZSh3QUZKb19QWipwTzZWSn19X1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwCiswODBQfmQ9TjArMDU/S0FAYjAwMFI5MDJ9fVMwMDAwMDAwMDAwMEhsRyZXZFEoaVg+YyFKYzRjbTRaKm5oVlopfFVKVlFwYkFWUXpEMkVeCit2OEpPOTI4RDB+NyFOMDA7b3tsQD4/LWFrd253Mj48e3RCbWUqLTAwMDAwMDAwMDAwMDAxX2ZpITZXMEJ+dD1GSkU/TFplKHdBRkpvX1BaCisqcE82Vkp+NUJiN14jTWNXR2BqR0E/aj1QKWgqPDZheTNoMDAwTzheT1k3eT9xYld2M0lZSENKcTc+KEFeLXBZMDAwMDAwMDAwMHE9OHMtCiswUlY3bWE0JW5XV29+M3xheFlfVlk7U1U1WkRCOElaZlNJQlZRZ3UwV2lEYGVQKWgqPDZheTNoMDAwTzheT1k3eXYjRmtNRjlpU3EwVGNpCitMOVJMNlQwMDAwMDAwMDAwcT1CTSEwUlY3bWE0JW5XV29+M3xheFlfVlk7U1U1WkRCOFdYPkt6ekVedjhKTzkyOEQwfjchTjAwO297bEA+Cis+b3ZMXyljMXBva0s3NjFTcjAwMDAwMDAwMDAwMDAxX2ZlZD5BMEJ+dD1GSkU/TFplKHdBRkpvX1BaKnBPNlZKfi1TWmdnZEdaN3kobVApCitoKjw2YXkzaDAwME84Xk9ZN3lnQmc0R1Q+JF85TUZJYy05ez5PVjAwMDAwMDAwMDBxPTlzUjBSVjdtYTQlbldXb34zfGF4WXxRYjk4S0pWCitsUTdgWD5NdEJVdGNiOGN+RENNMHUlIWowMDAwODBQfmQ9TjRkZzZZRUxRdjBNd29VMDM4NFQwMDAwMDAwMDAwMEhsRXFmJmw8PFg+YyFKCitjNGNtNFoqbmhXWD4pWEpYPHsjOVoqNmQ0YlNganRQKWgqPDZheTNoMDAwTzheT1k3eSZYPDQjZWw3cTJiaWU9cjl7Pk9WMDAwMDAwMDAwCiswcT1BXk0wUlY3bWE0JW5XV29+M3xheFl8UWI5OEtKVmxRTjJiWVdzKWI3ZH1ZY35EQ00wdSUhajAwMDA4MFB+ZD1OOCQjflRuUUJiMFBzCistJjAyfX1TMDAwMDAwMDAwMDBIbEZhK1dgUEBYPmMhSmM0Y200WipuaFdYPilYSlg8eyNGWmUoUzZFXnY4Sk85MjhEMH43IU4wMDtve2xACis+PnpVdkxSOEc1YFJwIX5nJnYwMDAwMDAwMDAwMDAwMV9mdEsoQTBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGS2xtUFZSVWJEYjFyYXNQCispaCo8NmF5M2gwMDBPOF5PWTd5cCRqQjxLbzAtXzl5SV59OXs+T1YwMDAwMDAwMDAwcT01bj4wc3dHbmE0JW5XV29+M3xheFl8UWI5OEtKCitWbFFvQlpmUnleYjk2M25jfkRDTTB1JSFqMDAwMDgwUH5kPU0/RGQpMCp3YSUwRSFwQDAzSEFVMDAwMDAwMDAwMDBIbEZgRzZEY19YPmMhCitKYzRjbTRaKm5oV1g+KVhKWDx7I0pWUkNDX2EmczxsY35EQ00wdSUhajAwMDA4MFB+ZD1OQkV1WmkpJGtRMElIUCQwM1FHVjAwMDAwMDAwCiswMDBIbEZQSXN5UTJYPmMhSmM0Y200WipuaFdYPilYSlg8eyNKV3ByVT1WUlRfR2FDdU5tMFJqe1E2YVdBSzJtdGV5N0RzUXhvX1RyOzAwCis0ST4wMDFCVzAwMDAwMDAwMDAwMDUrY0BMZDdgYUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSWElRlJHYiNofjZiMXJhc1ApaCo8NmF5M2gwCiswME84Xk9ZN3ltUmZCa0pQYGxAWEV5KTw5c21GVTAwMDAwMDAwMDBxPUJldTBzd0duYTQlbldXb34zfGF4WXxRYjk4S0pWbFEpSmElcGdNCitiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5O3tHKD9yPlh6fDA5Kms4OHZwPFIwMDAwMDAwMDAwcT02dU4wc3dHbmE0JW5XV29+M3xheFl8CitRYjk4S0pWbFErdkdBP0MhV2wmMjIwdSUhajAwMDA4MFB+ZD1Ne0hgbjN7fClRMDA0ZGcwMj1AUjAwMDAwMDAwMDAwSGxFY0NJYkwpWD5jCishSmM0Y200WipuaFdYPilYSlg8eyNRSFooM31jeDZ5YTBSantRNmFXQUsybXRleTdEcz1qNl9oTUYwMDJKODAwMHtSMDAwMDAwMDAwMDAwCis1K2NqQHw8UmFBfE5hVXZfMH5XTiZnV1dOQ0FCWS13VUliIyFUTEVedjhKTzkyOEQwfjchTjAwO297bEA+PUM3SCVTfTgyfHZFVG1TJGIwCiswMDAwMDAwMDAwMDAxX2YlNnZ4MEJ+dD1GSkU/TFplKHdBRkp4KFJiWmx2MkZMcV5lYjdebUdFXnY4Sk85MjhEMH43IU4wMDtve2xAPj5TCitNU3VsRnJUX297UDV9VEwwMDAwMDAwMDAwMDAwMV9mIWk/ejBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGTHlJQ0VAZ09TUCloKjw2YXkzCitoMDAwTzheT1k3eSlXLV9YNn0xMlcwQmB7Uzh2cDxSMDAwMDAwMDAwMHE9OHUyMU9SWXBhNCVuV1dvfjN8YXhZfFFiOThLSlZsUV8jRyVqCitVJFdsJjIyMHUlIWowMDAwODBQfmQ9TV5JbHxFZDMrXjBFM3RTMDJ9fVMwMDAwMDAwMDAwMEhsR1lqUmdSM1g+YyFKYzRjbTRaKm5oV1g+CispWEpYPHsjVFhrfSQ9RV52OEpPOTI4RDB+NyFOMDA7b3tsQD49TT9gUW5PMDAwMEkwUlI5ZzAwMDAwMDAwMDAwMDAxX2YhKHFOMEJ+dD1GCitKRT9MWmUod0FGSngoUmJabHYyRkpFRnxWezM0NGEmI3xXVXVrWT5iWUVYQ2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R1bSZGSjthRjAwN0dhCiswMDFRYjAwMDAwMDAwMDAwMDUrYz1kJVI+YUF8TmFVdl8wfldOJmdXV05DQUJZLXdVSVV0KGNuWWpBSUpiVDRnYmI3TC1XY35EQ00wdSUhCitqMDAwMDgwUH5kPU0+TUk/JTE5Z2wwNVc2JTA0RCRkMDAwMDAwMDAwMDBIbEhWd0ZMbGhYPmMhSmM0Y200WipuaFdYPilYSlg8eyM1VnFzCislemFCcCZTRkxQKmhiWktsWmFDdU5tMFJqe1E2YVdBSzJtdGV5N0RzT3UwSWxgYDAwMjEoMDAxaWgwMDAwMDAwMDAwMDA1K2NoMCtCOGFBCit8TmFVdl8wfldOJmdXV05DQUJZLXdVSVV0KGNuWWpBSUpiVDR5eGI3T0NBV0AlP0dWYGdWaU85MjhEMH43IU4wMDtve2xAPj00S1MmX3g5CitzbUdOWCNmQiEwMDAwMDAwMDAwMDAwMV9meUM0VzBCfnQ9RkpFP0xaZSh3QUZKeChSYlpsdjJGSkVGfFZ7MzQ0YSYjfHFkMj9mTFpmMHBgCitFXnY4Sk85MjhEMH43IU4wMDtve2xAPj4jTHBXUHdTcFdkalgjb0h6MDAwMDAwMDAwMDAwMDFfZiVOa1EwQn50PUZKRT9MWmUod0FGSngoCitSYlpsdjJGSkVGfFZ7MzQ0YSYjfHJWUkJ8XlktS0tSY35EQ00wdSUhajAwMDA4MFB+ZD1OMlokbEVRJGREMExsVVkwM1pNVzAwMDAwMDAwCiswMDBIbEdQTyRHcFBYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297bEA+PmptVTU4SE5kCitOI0BRdm09VzAwMDAwMDAwMDAwMDAxX2ZuYHF5MEJ+dD1GSkU/TFplKHdBRktCZGFZJkMzWVZsUUtGWmdYXkRaZ2dgbGFDdU5tMFJqe1E2CithV0FLMm10ZXk3RG9rYzlJWEZEMDAzamswUlNUYTAwMDAwMDAwMDAwMDUrY2FHM0BHYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZLQmRhCitZJkNGVWEmdSpKRV52OEpPOTI4RDB+NyFOMDA7b3tsQD49aiZuWE5BNmFXQ2xLbVkoQjAwMDAwMDAwMDAwMDAxX2Z3MH5OMEJ+dD1GSkU/CitMWmUod0FGS0JkYVkmQzNZVmxRY0VWUlU3OVpFUC1aY35EQ00wdSUhajAwMDA4MFB+ZD1OMWJZajNEWF9gMElfPWowMyFlWjAwMDAwMDAwCiswMDBIbEhRQCYqOEtYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJWD5NP0piYVFsYVducGJEYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHZlezM7CitSWUMwMDhfJTAwMUVYMDAwMDAwMDAwMDAwNStjMk5ETVdhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PRkxQbVRYPkA2TldwWFpYY35EQ00wCit1JSFqMDAwMDgwUH5kPU1eWXpxPjxiK0wwRCZ3NDAzaVNYMDAwMDAwMDAwMDBIbEc4Q0k8ajtYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJCitiWj17QVpmU2FEYXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eTl2PEJ3Vis4O0ohd2RpYjlSTDZUMDAwMDAwMDAwMHE9RDgkMkxOenNhNCVuCitXV29+M3xheFo5ZlpFUTdjWDx7I1JiWkttSkVedjhKTzkyOEQwfjchTjAwO297bEA+PDswMDAwMjAwMDAwMDAwMGUwMDAwMDAwMDAwMDAwCisxX2Zwa2QrMEJ+dD1GSkU/TFplKHdBRktCZGFZJkMzWVZsUVRDWTs8TEViMXo/Q1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwMDgwUH5kPU08CitSZ3gjRllSNTAzSERWMDNgcWIwMDAwMDAwMDAwMEhsR3VOZTJMTVg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUlXQCY3NldwWjtiVXQoYyVXCitpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3llLTRtTkFPUWRYWn5fMVRIVUl6czAwMDAwMDAwMDBxPUElNTJMTnpzYTQlbldXb34zfGF4WjlmCitaRVE3Y1g8eyNDWD40PzVhJnM/WFk7YjV7VnI2dGBWX3xHemJhWmxRVnMmKDdiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5Nj9iXyR4Qj50CitHeChXYVFHWE1ZcDAwMDAwMDAwMDBxPTUpYjJMTnpzYTQlbldXb34zfGF4WjlmWkVRN2NYPHsjQ1g+ND81YSZzP2ZaZmEjP2JZRT57YllXCitqKFhrbGA1V3BwbFpjfkRDTTB1JSFqMDAwMDgwUH5kPU0tWjlIekBQJkYwQntmaDAzLWthMDAwMDAwMDAwMDBIbEV0UFhfPlNYPmMhSmM0CitjbTRaKm5oYWJadS1rWS13VUlXQCY3NldwWjtiWS13KEVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9RbFd6I2cxXkBzQURGNlUwMDAwMDAwCiswMDAwMDAwMV9mJTglYTBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFFUQ1k7PExFYjEhZGpiWkt2SFZRaDNeWExCeGFjfkRDTTB1JSFqCiswMDAwODBQfmQ9TT53ektwfEpufTBBSytDMDRWP2YwMDAwMDAwMDAwMEhsRWlTX2M0ZFg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUlXQCY3Cis2V3BaO2JiNzV8MmJaTDVKYXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eVczXmZwJjtiQWRiXzQoYkRnWGNnMDAwMDAwMDAwMHE9RWlnMkxOCit6c2E0JW5XV29+M3xheFo5ZlpFUTdjWDx7I0NYPjQ/NWEmcz90WGxabjFiOHVsfVdpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3kweGBxbjVDCitIJUg+SHo9JUQqeWxoMDAwMDAwMDAwMHE9NlApMkxOenNhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNQV3BaZ0BZLXhJQmF4WShCWD5NdEJVCit0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1OQjhsS09MaCRhMDU+dUswNUpkbjAwMDAwMDAwMDAwSGxGJFVJemVoWD5jIUpjNGNtNFoqbmhhCitiWnUta1ktd1VJYjdnWEFWUWd1N1dwWGNRYlp1O05XcFpnQFkteElCYXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eTAwMDAwMHNzSTIwMDAwCiswRWRUJWowMDAwMDAwMDAwcT03VlMyTE56c2E0JW5XV29+M3xheFo5ZlpFUTdjWDx7I1FhJUUqPFdNT2MwV3BaO2JVdGVpJVg+P3ktRV52Cis4Sk85MjhEMH43IU4wMDtve2xAPj9qVHdmM3gwc3NKZzFeQHNrMDAwMDAwMDAwMDAwMDFfZnFgclgwQn50PUZKRT9MWmUod0FGS0JkYVkmCitDM1lWbFEtWldvMlB4VlFfUzFhJnM/cFZSJFpaY35EQ00wdSUhajAwMDA4MFB+ZD1OMSNsSDw+Q1lZMDhJQDUwNClGajAwMDAwMDAwMDAwCitIbEg4WlUrRXhYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFHezdWcyZZM1dNeSk1RkpFNzJaZlNJMVVvTFFZUCloKjw2YXkzaDAwME84CiteT1k3eXk5fXdhTGs8N3trMkxAUURnWGNnMDAwMDAwMDAwMHE9NjF9MkxOenNhNCVuV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFKj1iIWx2Cis1V3BaO2JVdChjJVdpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3lWSmF+a21qP2c8NihJbHNDOyRLZTAwMDAwMDAwMDBxPUFgJjJMTnpzYTQlCituV1dvfjN8YXhaOWZaRVE3Y1g8eyNRYSVFKj1iIWx2NVdwWjtiV04mUlFhQ3VObTBSantRNmFXQUsybXRleTdEciZ1ZG5XYDYwMDIhZjAwCisxZmcwMDAwMDAwMDAwMDA1K2NjOFVpOGFBfE5hVXZfMH5XTiZnV1htbzlDSEVkfk9GTFpLY1dueSh7WS1EOX1iMSE5ZGElRSpNYUN1Tm0wCitSantRNmFXQUsybXRleTdEdG54Q0hvfX0wMDdUNjAwMXVsMDAwMDAwMDAwMDAwNStjIWp1TzlhQXxOYVV2XzB+V04mZ1dYbW85Q0hFZH5PCitGTFpLY1dueSh7WS1EOX1iMSE5ZGElRSotWTxPKktFXnY4Sk85MjhEMH43IU4wMDtve2xAPj56SGhuZFExXkB0dDc2MVMmMDAwMDAwMDAwCiswMDAwMV9maSQ4QTBCfnQ9RkpFP0xaZSh3QUZLQmRhWSZDM1lWbFEtWldvMzZeWS0/cTViMXo/Q1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwCiswODBQfmQ9TjZvYER1TDFARDBBP0VpMDRWP2YwMDAwMDAwMDAwMEhsRWdzUnNhWFg+YyFKYzRjbTRaKm5oYWJadS1rWS13VUliYUd7N2NWCitUUjZXcFo7YlV0KGMlV2lEYGVQKWgqPDZheTNoMDAwTzheT1k3eW92I1Z3YDJoZGBqUmdQekNqYkJkMDAwMDAwMDAwMHE9OE1aMkxOenNhCis0JW5XV29+M3xheFo5ZlpFUTdjWDx7I1FhJUUrQVZRZ3o8YSZzP2FaKjRBY2N+RENNMHUlIWowMDAwODBQfmQ9TSs1Tm1EQ1B0SjBQWWIwCiswNFY/ZjAwMDAwMDAwMDAwSGxHN3U/R05mWD5jIUpjNGNtNFoqbmhhYlp1LWtZLXdVSWJhR3s3Y1ZUUjZXcFo7Yldwcnw3V2lEYGVQKWgqCis8NmF5M2gwMDBPOF5PWTd5RWZ9IVohMiRwUDxfR2ApRmFRN20wMDAwMDAwMDAwcT1DNCQyTE56c2E0JW5XV29+M3xheFo5ZlpFUTdjWDx7CisjUWElRStBVlFnejxhJnM/ZFdvfm41WD4pWFBXbnBiRGFDdU5tMFJqe1E2YVdBSzJtdGV5N0RxRTQqY35ZYjAwM3dnMDAxb2owMDAwMDAwCiswMDAwMDUrYyRHSGFwYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZMWktjV3BgbjBZaGBrQ0ZLbD5pWS1NekVXbzBnS2N+RENNMHUlIWowCiswMDA4MFB+ZD1NfEMrelBgbTtGMFI5TDcwNG8zaDAwMDAwMDAwMDAwSGxGQ3p5fDx1WD5jIUpjNGNtNFoqbmhhYlp1LWtZLXdVSWJhR3s3CitjVlRSNldwWjtiYUNLfktXTiZSUWFDdU5tMFJqe1E2YVdBSzJtdGV5N0R1VTctS2Q1RDAwN2hnMDAxUWIwMDAwMDAwMDAwMDA1K2NLKkkrCitCYUF8TmFVdl8wfldOJmdXWG1vOUNIRWR+T0ZMWktnV2lNWX1YPk10QlV0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1OQXpOYWxZSWRJMEd8CitUQDAzcllZMDAwMDAwMDAwMDBIbEVsIzBMT3lYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFIOEJGSkVGfGI3ZH1ZY35EQ00wdSUhajAwCiswMDgwUH5kPU08aTk5c2lwd3swR2IyPDAzIWVaMDAwMDAwMDAwMDBIbEcmI1JtWHpYPmMhSmM0Y200WipuaGFiWnUta1ktd1VJYmFIOEJGCitKeGhLYSVwOFFhQ3VObTBSantRNmFXQUsybXRleTdEcjFAWnE2TTcwMDhkPjAwMThWMDAwMDAwMDAwMDAwNStjdDtZdWRhQXxOYVV2XzB+CitXTiZnV1htbzlDSEVkfk9GTFpLZ1dpTjFmRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/IWYyOCRUM0lHN2dCTER5KDAwMDAwMDAwMDAwMDAxCitfZmR8UzUwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lNWX1YPk10QlV0Y2I4Y35EQ00wdSUhajAwMDA4MFB+ZD1NP3clOEh5O0I0MDlnCit0RTAzLWthMDAwMDAwMDAwMDBIbEdQKUNUfT9YPmMhSmM0Y200WipuaGVaKTBtX1g+NFVMWS13KDVZO1IrMFdAJjY/RV52OEpPOTI4RDB+Cis3IU4wMDtve2xAPj9keC09NFMwe3tSVDM7K05uMDAwMDAwMDAwMDAwMDFfZiZTTUEwQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lNQE9XCitOQzcyWikwbV9YPjRVS2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R1R2JBUURDaDAwMiFHMDAxS1owMDAwMDAwMDAwMDA1K2N2RCpnI2FBfE5hCitVdl8wfldOJmdXWTtSKzBXQCY2P0ZLfXNPWTtSKzBXQCY2P0VedjhKTzkyOEQwfjchTjAwO297bEA+P21RaER8ZDFwb2t+NiN4SngwMDAwCiswMDAwMDAwMDAxX2ZqSHlgMEJ+dD1GSkU/TFplKHdBRktsbVBZaTRPfFdpTkFhWS14MDVZO1IrMFdAJjY/RV52OEpPOTI4RDB+NyFOMDA7Citve2xAPj09USQ9aCUwe3tSdTNJRzVuMDAwMDAwMDAwMDAwMDFfZnM1JH0wQn50PUZKRT9MWmUod0FGS2xtUFlpNE98V2lOQWlaRVJfN1lpCit3XzBZaTRPfFdpRGBlUCloKjw2YXkzaDAwME84Xk9ZN3loLXt0T00qO3U8RiQ0ZXJBXi1wWTAwMDAwMDAwMDBxPTV8VzJMTnpzYTQlbldXCitvfjN8YXhaWFVWezJoJlg+TW1QVXRlS2paKl9FRVVvTFFZUCloKjw2YXkzaDAwME84Xk9ZN3lTaz5wWWB+ZCZ9aVVSLXVBcGlnWDAwMDAwCiswMDAwMHE9QSN+MkxOenNhNCVuV1dvfjN8YXhaWFVWezJoJlg+TW1QVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297bEA+PjVOND1ZCit7MHNzS3oxT05hYTAwMDAwMDAwMDAwMDAxX2Z6SSY8MEJ+dD1GSkU/TFplKHdBRkt9VUZZaGg8O1pmN3JGVntkSjZWUlNCVmN+RENNMHUlCishajAwMDA4MFB+ZD1OM04xTndOKE5EMDEqY08wMy1rYTAwMDAwMDAwMDAwSGxHdV5hbFdOWD5jIUpjNGNtNFoqbmhpVlBrN3lYSzhMe0ZKCitFKFhhJj0+TGIjaTVNRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4+Z2Z8fDd6ODJ8dlVaMiRseDAwMDAwMDAwMDAwMDAxX2ZtOFBmMEJ+dD1GCitKRT9MWmUod0FGS31VRlloaDw7WmY3clphQWpqQFdAJSt8YjFyYXNQKWgqPDZheTNoMDAwTzheT1k3eT1tciVZTWgqWX50dTZvbkFPSFhXCiswMDAwMDAwMDAwcT1CZ3IybW8rdGE0JW5XV29+M3xheFpYVVZ7MmgmWD5NbVBjNGN5Tlg+Vj5XYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHQjCis9ck4/TSswMDgyajBSU1pjMDAwMDAwMDAwMDAwNStjRWd1S35hQXxOYVV2XzB+V04mZ1dhQkY4QGElRlJHYiNofjZiMXo/Q1g+TXRCVXRjCitiOGN+RENNMHUlIWowMDAwODBQfmQ9TkJVWkVqRkpRWjBNODJtMDNaTVcwMDAwMDAwMDAwMEhsR35qfGMjOFg+YyFKYzRjbTRaKm5oaWEmCitLcEhXcGleY1V0ZWklWD4/eS1FXnY4Sk85MjhEMH43IU4wMDtve2xAPjw+Q2hzSWgxT05iJjNJRzViMDAwMDAwMDAwMDAwMDFfZnZBKVMwCitCfnQ9RkpFP0xaZSh3QUZLfXtpWEw0bjhiMSEwSGF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3lFPWFhKUI/QUJlYDJfI345ez5PVjAwMDAwCiswMDAwMHE9NkB5Mm1vK3RhNCVuV1dvfjN8YXhaWGxaKWI5NGI4fDBhWipee1RXcFhaWGN+RENNMHUlIWowMDAwODBQfmQ9TTt3YD5NK2dKCit9MDhSQDQwM1FHVjAwMDAwMDAwMDAwSGxHNW9DcEFMWD5jIUpjNGNtNFoqbmhpYSZLcEhXcGleY1hrfjEwV3BaO2FhQ3VObTBSantRNmFXCitBSzJtdGV5N0R0TFIrZ3w8eDAwMkQmMDAxOFYwMDAwMDAwMDAwMDA1K2MmWSViWWFBfE5hVXZfMH5XTiZnV2FCXj5GYSVGUktGTFE4ZFpmCis8M0FFXnY4Sk85MjhEMH43IU4wMDtve2xAPj12anM/aTMwe3tSOzJMSiNkMDAwMDAwMDAwMDAwMDFfZmVFQXQwQn50PUZKRT9MWmUod0FGCitMR3NaYiFCc09iMXo/Q1g+TXRCVXRjYjhjfkRDTTB1JSFqMDAwMDgwUH5kPU1eV3I7T21gNmcwSUVSJTAzWk1XMDAwMDAwMDAwMDBIbEhLCitydzlPV1g+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJWUHMpJmJZKmdMRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/SnA2Mkt+MXBvamk2I3hKCittMDAwMDAwMDAwMDAwMDFfZnVnd3gwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjF6fFZYKWJWaVApaCo8NmF5M2gwMDBPOF5PWTd5RFB7CitMUGVoMl5uaVcmZF84fl58UzAwMDAwMDAwMDBxPTZRezJtbyt0YTQlbldXb34zfGF4WmRhYWRsO0xiYU85WmIjIVBoYUN1Tm0wUmp7UTZhCitXQUsybXRleTdEdi1pVDdGRDwwc3p2cTFPT2laMDAwMDAwMDAwMDAwNStjJmNfRzxhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkpvYjJXCitwWj5iYUFqPiFPOTI4RDB+NyFOMDA7b3tsQD4+PkYpeG0wMFJSQUgwc3NJVjAwMDAwMDAwMDAwMDAxX2ZtY0JiMEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhM01hJiZWcGFDdU5tMFJqe1E2YVdBSzJtdGV5N0RyVXgjb1JDZzAwNnhPMDAxNVUwMDAwMDAwMDAwMDA1K2NfKEJUCisrYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZKb19RYUE5O1ZhQ3VObTBSantRNmFXQUsybXRleTdEdm9VNXpPQmIwMDFYTDAwMThWMDAwCiswMDAwMDAwMDA1K2NXSkw9QWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GSm9fU1lpVlYzRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/Ujl2CituYnEwe3tUazI+PHtoMDAwMDAwMDAwMDAwMDFfZnErO0cwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPYjEhOWhWYFhyM1g+Vj9HRV52OEpPCis5MjhEMH43IU4wMDtve2xAPj1BY0t5N0kwUlI5cjB7e1JXMDAwMDAwMDAwMDAwMDFfZmgxZkQwQn50PUZKRT9MWmUod0FGTEdzWmIhQnNPCitiMSFJYlopPFpkYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHgzZT9mQiooMDA4KUwwMDE1VTAwMDAwMDAwMDAwMDUrYz5SayV9YUF8TmFVdl8wCit+V04mZ1dhJUZMS1dwaXxNRkt1c1JXbyZhVWFDdU5tMFJqe1E2YVdBSzJtdGV5N0RzKFN7d1J0WDAwNnBQMDAxQlcwMDAwMDAwMDAwMDA1CisrYzQxV3MlYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZMUHljYjdebUdiMXJhc1ApaCo8NmF5M2gwMDBPOF5PWTd5RHdAZ088cGNsI2ZECis4WnRCbWUqYTAwMDAwMDAwMDBxPUQzIzNqbEN3YTQlbldXb34zfGF4WmRhYWRsO0xiYU85cmJZWE9MYjY7YWBXTXkrTWFDdU5tMFJqe1E2CithV0FLMm10ZXk3RHNIODM4UVRVMDA1eTIwMDFIWTAwMDAwMDAwMDAwMDUrY2A8QEVgYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZMUUtxCitiel5qT2ElRlFhYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHdaPnhEe08rMDAzNH4wMDEyVDAwMDAwMDAwMDAwMDUrY3NHfCEyYUF8TmFVdl8wCit+V04mZ1dhJUZMS1dwaXxNRkxpV2pZOyFKZmN+RENNMHUlIWowMDAwODBQfmQ9TX5eQSQ8dWQ+UDA2cVchMDRWP2YwMDAwMDAwMDAwMEhsCitGSHpZNzN4WD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eWFjCitvTmJqUkY3dzQrUWBLRiNyR24wMDAwMDAwMDAwcT1DQT4zamxDd2E0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XCitNeTxPVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297bEA+PkZvV0MpNWtwS1hxTElENlYwMDAwMDAwMDAwMDAwMV9mdEpEeDBCfnQ9CitGSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrbF8+V3Bwb01YPWdRTmElRktZYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHhWCitvODNZPngwMDVLKjAwMSlwMDAwMDAwMDAwMDAwNStjVHZRQUlhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxITNQVlJCCis/O2JUNDlRWEVrdGdaKD9PfkVedjhKTzkyOEQwfjchTjAwO297bEA+Pk52UjdGJTFPTmNZMj48e3kwMDAwMDAwMDAwMDAwMV9meWhAMzBCCit+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrbF8+V3Bwb05Ya2xfPldwcmdAYlNganRQKWgqPDZheTNoMDAwTzheCitPWTd5Xz5qVD80aGFBTjNNMnBrSVJGM3YwMDAwMDAwMDAwcT04SWEzOz1MeGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRCitWYHlQPVdNeTxPVmB5UD1XTkNBQmElcDA5YlpLdkhFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1paUtVLSgxT05jZjRnZGY8MDAwMDAwMDAwCiswMDAwMV9mdzUlXzBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwcG9OWGtsYDVXcHJuOVoqXzJSYSZLCitafmF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3lfITtQZlRMUzw5WlUrRFdIVUl6czAwMDAwMDAwMDBxPTl+RjM7PUx4YTQlbldXb34zfGF4CitaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9WYHlQPWI3Z2RKYSZLWn5heFFSclApaCo8NmF5M2gwMDBPOF5PWTd5en1YTnEtCit+I3t2NGhhQU5JeypMeDAwMDAwMDAwMDBxPTdBTjM7PUx4YTQlbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FWYHlQPVdNeTxPCitWe2M/PlpmQTNKVlJVNn1WUGp9JVplPWNUY35EQ00wdSUhajAwMDA4MFB+ZD1NPER5JUlaKi10MEVHa3EwNTFSbDAwMDAwMDAwMDAwSGxGCit0YXRyYClYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZKb3c3YSU1JDZGSm9fUWFBOTtWYUN1Tm0wUmp7UTZhV0FLMm10CitleTdEeFA1enxYYjwwMDFgeTAwMSVvMDAwMDAwMDAwMDAwNStjMWElQW1hQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxCishM1BWUkI/O2JUNENYWmdYXkRaZ2dgbGFDdU5tMFJqe1E2YVdBSzJtdGV5N0R1WkZDZE56eTAwOHl8MDAxLXEwMDAwMDAwMDAwMDA1K2MzCitVfnx2YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSQj87YlQ0Q1lJVyMkTmEmS1p+YXhRUnJQKWgqPDZheTNoCiswMDBPOF5PWTd5clkrSnJhUmRNV2F8ezNnRzVgUG8wMDAwMDAwMDAwcT1CZT0zOz1MeGE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3Cit5WEp2Q1FWYHlQPVdNeTxPV3BpVjJhJktafmF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3kpPTIlIyRwcnVhcEI/fUpFJnU9azAwMDAwMDAwCiswMHE9OUxHMzs9THhhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9XcGlWNVo3eShtUCloKjw2YXkzaDAwCiswTzheT1k3eXRiRHZoM2szaUdVSmR7Tkd5bmhxMDAwMDAwMDAwMHE9OX5oMzs9THhhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYCitKdkNRVmB5UD1XTXk8T1dwIWd9YUJ5O09WcjZuSmFDdU5tMFJqe1E2YVdBSzJtdGV5N0RwPU5FfElUTzAwNWVeMDAxJW8wMDAwMDAwMDAwCiswMDUrYytsdmVVYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSEzUFZSQj87YlQ0SWZWezM5fGElRktZYUN1Tm0wUmp7CitRNmFXQUsybXRleTdEb2xNI15mMFQwMDReeTAwMS1xMDAwMDAwMDAwMDAwNStjK1RSUVNhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9CitVRlloaDwpYjEhM1BWUkI/O2JUNElmVnszQTdhJktafmF4UVJyUCloKjw2YXkzaDAwME84Xk9ZN3lCflBPaS0jYEVXSUVWbE1HNWBQbzAwCiswMDAwMDAwMHE9N31fMzs9THhhNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9XcCFoOGNWPT5CYVZ+SXFQCispaCo8NmF5M2gwMDBPOF5PWTd5RXV1Sjc4M088U2owT016R3luaHEwMDAwMDAwMDAwcT05cks0RkdVeWE0JW5XV29+M3xheFpkYWFkbDtMCitiYU85b1ZQazd5WEp2Q1FWYHlQPVdNeTxPV3AhaDhjV2BvVlZyNm5KYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHFYYV5iUEFtMDA2NnUwMDEpCitwMDAwMDAwMDAwMDAwNStjLXpOPEthQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNRkt9VUZZaGg8KWIxITNQVlJCPztiVDRPT0dCWXRVV14hCitlNUVedjhKTzkyOEQwfjchTjAwO297bEA+PUl3Y0dYQDB7e1MjMV5Ac3gwMDAwMDAwMDAwMDAwMV9mZzVXTDBCfnQ9RkpFP0xaZSh3QUZMCitHc1piIUJzT2IxIWdWVnsyaCZXcGdpTVhrbF8+V3Bwb1JWbHAhXkdIYE5sVnI2bkphQ3VObTBSantRNmFXQUsybXRleTdEd1pmdHRNKnswCiswMXZFMDAxPXIwMDAwMDAwMDAwMDA1K2NoOzl1NGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNFJTCitWc2Q0N2FCXj5BV3BYWlhjfkRDTTB1JSFqMDAwMDgwUH5kPU4wK2FmNCElfFowTW9idDA1QVhtMDAwMDAwMDAwMDBIbEZOZmVpcH5YPmMhCitKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZLVElYV14hZTVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1FaDIrCitSZjY5NTJ8TzhAe2IwMDAwMDAwMDAwMDAwMV9mbH1CRjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaU1Ya2xfPldwCitwb1VhQVIoQ2NySXt4UCloKjw2YXkzaDAwME84Xk9ZN3lOS3klbTM9MDROQEckQFlJeypMeDAwMDAwMDAwMDBxPUQrfDRGR1V5YTQlbldXCitvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYSnZDUVZgeVA9V015PE9ZKy1JXlZzJmgxVlJDNjxaZiRSNVdvI35SY35EQ00wdSUhajAwMDA4CiswUH5kPU4xVUZ3V0JtJk4wNmokajA2Rzh3MDAwMDAwMDAwMDBIbEZXX1lEQVdYPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxECis/RkpvdzdhJTUkNkZLbDZNWEpkSkNYPjRxMVZ7TENfV28jflJjfkRDTTB1JSFqMDAwMDgwUH5kPU0tZEBJOWMyanMwOH12bTA1PD50MDAwCiswMDAwMDAwMEhsR1cwfWNSaVg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkpvdzdhJTUkNkZLbDZNWEo+THtXb3ZEM1dNCit5bkZhQ3VObTBSantRNmFXQUsybXRleTdEcGVWZGtVVGowMDFeRDAwMX11MDAwMDAwMDAwMDAwNStjVUpWV2FhQXxOYVV2XzB+V04mZ1dhCislRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNGRTWmY5c15Wc2Q0N1pFc3t7WSVYd2xQKWgqPDZheTNoMDAwTzheT1k3eVBgOD9YCisjfGkpZF8lSHdmSXsqTHgwMDAwMDAwMDAwcT04Wnc0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8CitPWSstSV5YbXhJOVZSQzY8WmYkUjVXbyN+UmN+RENNMHUlIWowMDAwODBQfmQ9TUB2MF9VRjhZQDAxR1N0MDUkKnMwMDAwMDAwMDAwMEhsCitGKEFgU3A+WD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RktsNk1YTE0qYFg+RCgwV28jflJjfkRDTTB1CislIWowMDAwODBQfmQ9TjlDSFRuUl5CUjBCe3JsMDV0I3IwMDAwMDAwMDAwMEhsR2RFZS0mMVg+YyFKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhCitBOUw+VlB8RD9GSm93N2ElNSQ2RktsNlNYPkt1YWEmS1p+YXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eXJKUWtkb2RmXj8jMCZyY0h+O191CiswMDAwMDAwMDAwcT05KWY0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XTXk8T1pETTArVlJDYjJiWn5OCitTVnI2bkphQ3VObTBSantRNmFXQUsybXRleTdEdnZFazJfZmQwMDZIQzAwMX11MDAwMDAwMDAwMDAwNStjWSZpfTlhQXxOYVV2XzB+V04mCitnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNGdVVns+UDZaKl8yUmEmS1p+YXhRUnJQKWgqPDZheTNoMDAwTzheT1k3eUAjCitTWmxPYmhAM2hELW5lRjh9fWwwMDAwMDAwMDAwcT02ZWY0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3eVhKdkNRVmB5UD1XCitNeTxPWkRNMHtiOFJrZ2N+RENNMHUlIWowMDAwODBQfmQ9TkJTQlN4T3hUdjBKI3pYMDV8e3UwMDAwMDAwMDAwMEhsR21OZSUjVFg+YyFKCitjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RkxQcEpYa2xgNVdwcj9JWig/T35FXnY4Sk85MjhEMH43IU4wMDtvCit7bEA+PiYrfnZPezFPTmNyMzsrTikwMDAwMDAwMDAwMDAwMV9mckw7RjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnCitpTVhrbF8+V3Bwb2RWcTxlPmEmTDhUYUJePkFXcFhaWGN+RENNMHUlIWowMDAwODBQfmQ9TjAodm5Se2FEMzBKSUpPMDVicHAwMDAwMDAwCiswMDAwSGxIYlIxTkBlWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GSm93N2ElNSQ2RkxQPlhiOHZFUlZyNm5KYUN1Tm0wCitSantRNmFXQUsybXRleTdEdWd8SGFiQGEwMDZpZTAwMjR3MDAwMDAwMDAwMDAwNStjT2otXkFhQXxOYVV2XzB+V04mZ1dhJUZMS1dwaXxNCitGS31VRlloaDwpYjEhM1BWUkI/O2JUNCZvWD9BNkRiNzU+YFdwcmdAYlo+R2xhQ3VObTBSantRNmFXQUsybXRleTdEciRFQVpzMjMwMDNNCitIMDAxKXAwMDAwMDAwMDAwMDA1K2NgKFh8TWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhM1BWUkI/O2JUNCZ1VztrCiskaVooP09+RV52OEpPOTI4RDB+NyFOMDA7b3tsQD4+TXctenNnMHt7UkEybWs7djAwMDAwMDAwMDAwMDAxX2ZvZihCMEJ+dD1GSkU/TFplCisod0FGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2llYSVebUFWbHl2YVV1a1k+YllFWENhQ3VObTBSantRNmFXQUsybXRleTdEcExFRVFpZXUwCiswN25+MDAxPXIwMDAwMDAwMDAwMDA1K2NKOEJMOWFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUjliCitaKXxMM1Z7fmI2WmdWYmhjfkRDTTB1JSFqMDAwMDgwUH5kPU1eZTs4Xz5+SSkwNWM7MTA1YnBwMDAwMDAwMDAwMDBIbEZpY01icT5YPmMhCitKYzRjbTRaKm5oa1dwUTw3Yjk4ZXJhQTlMPlZQfEQ/RkxpUWtZLXdVTUZKb19SWmU/UzFYPlY+V2FDdU5tMFJqe1E2YVdBSzJtdGV5N0RxCis/Q01tWH56MDAzYHgwMDFgdDAwMDAwMDAwMDAwMDUrY0w0eXRlYUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7CiswKl9HY1JMclpmPDJgYlpLdkhhQnB2SEVedjhKTzkyOEQwfjchTjAwO297bEA+PUhIWX11KzFwb2pSNWRaKSkwMDAwMDAwMDAwMDAwMV9mCityK0ZKMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpZWElXm1BVmx5dmdjdz1SN2JaS3ZIYjFyYXNQKWgqPDZheTNoCiswMDBPOF5PWTd5XkcwUikxcVQyQyRyYjxyRjh9fWwwMDAwMDAwMDAwcT05YSM0Z2hkemE0JW5XV29+M3xheFpkYWFkbDtMYmFPOW9WUGs3Cit5WEp2Q1FiI2lRTVg8ez1rV0AlKz9XT0ZXWGN+RENNMHUlIWowMDAwODBQfmQ9TXtFJWhBVVhwODBPPCQtMDVKZG4wMDAwMDAwMDAwMEhsCitHeXU/XyVtWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkpAX01XcEhuRWJTYGp0UCloKjw2YXkzaDAwCiswTzheT1k3eVRkSCYkSFZYZyV6OWF3dUd5bmhxMDAwMDAwMDAwMHE9OEFiNGdoZHphNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrN3lYCitKdkNRYiNpUU1YPHs9a2FCcHZIWkREUjxYSnY5T2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R3alkhaGU3VjAwNEl1MDAxeG0wMDAwMDAwMDAwCiswMDUrYyhaQ0o+YUF8TmFVdl8wfldOJmdXYSVGTEtXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSJndhZGw7TGJTYGp0UCloKjw2YXkzCitoMDAwTzheT1k3eUxqb0U0NC14PFhPRiNlc0YjckduMDAwMDAwMDAwMHE9QkV2NGdoZHphNCVuV1dvfjN8YXhaZGFhZGw7TGJhTzlvVlBrCis3eVhKdkNRYiNpUU1YPHs9a2ElRlJIWipGc0NFXnY4Sk85MjhEMH43IU4wMDtve2xAPjw7MDAwMDIwMDAwMDAwMDB2MDAwMDAwMDAwMDAwCiswMV9mJkpQSjBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZlWipGdlFYPHsjNVV1a1k+YllFWENhCitDdU5tMFJqe1E2YVdBSzJtdGV5N0RvdTlvNm5hODAwNWcyMDAyMXYwMDAwMDAwMDAwMDA1K2NSQCk4JGFBfE5hVXZfMH5XTiZnV2ElRkxLCitXcGl8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSTHJaZ2deS1ZsUXJWWTtBQ0ZaKWA0YmN+RENNMHUlIWowMDAwODBQfmQ9TT96NkNnPj8pCis3MEIkNHowNkc4dzAwMDAwMDAwMDAwSGxGTDtTSzxCWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkpvCitfUmJhSDg4Rkt+SHBhQWpfRGI4SWVmY35EQ00wdSUhajAwMDA4MFB+ZD1ONTlrIUFVXjtBMDc/Sj0wNkc4dzAwMDAwMDAwMDAwSGxFdD9oCitYS09YPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GS31VRlloaDwpYjF6P0NYPk10QlV0Y2I4Y35EQ00wCit1JSFqMDAwMDgwUH5kPU1AR1M+WFlkTEQwT3VrQTA2cVchMDAwMDAwMDAwMDBIbEdhP2hYS09YPmMhSmM0Y200WipuaGtXcFE8N2I5OGVyCithQTlMPlZQfEQ/RkxpUWtZLXdVTUZLfVVGWWhoPCliMSFkbFdNeSg/V001PXlWe3xUWGN+RENNMHUlIWowMDAwODBQfmQ9TjdHbXl2ME0lCitTMEJrSikwNXQjcjAwMDAwMDAwMDAwSGxIUmAzP1laWD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GTGlRa1ktd1VNRkt9CitVRlloaDwpYjEhcGdjckl7eFApaCo8NmF5M2gwMDBPOF5PWTd5NVVePEYtMmVhcCVtRHhaTyNsREAwMDAwMDAwMDAwcT1CT2Q0KittIWE0CislbldXb34zfGF4WmRhYWRsO0xiYU85b1ZQazd5WEp2Q1FiI2lRTVg8ez1rYUE5TD5WUHxEP0ZMUUhqVXV8SkBWYHlKIVoqejJSVlFwbkVVCit0ZWklWD4/eS1FXnY4Sk85MjhEMH43IU4wMDtve2xAPj4+KVNNZHgxXkB1VTRnZGdEMDAwMDAwMDAwMDAwMDFfZiRJcW0wQn50PUZKRT9MCitaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZyVlBrN3lYSnZDUWI4fkU4WkREantYa1RiPWI5OFFEWkRsV0NYPkQrCis5V28+MHtiWVhPOVoqREdkY35EQ00wdSUhajAwMDA4MFB+ZD1ONCUtQGdhWktwME9rUHowNSQqczAwMDAwMDAwMDAwSGxGbzVEeCV3WD5jCishSmM0Y200WipuaGtXcFE8N2I5OGVyYUE5TD5WUHxEP0ZMaVFrWS13VU1GTGlXalklZ0Q1WD5NdEJVdGNiOGN+RENNMHUlIWowMDAwODBQCit+ZD1OQlZVLVIxNV9HME5vNCMwNXx7dTAwMDAwMDAwMDAwSGxHcTVmMT14WD5jIUpjNGNtNFoqbmhrV3BRPDdiOThlcmFBOUw+VlB8RD9GCitMaVFrWS13VU1GTGlXalklZ1BQWmY8MmBiWkt2SEVedjhKTzkyOEQwfjchTjAwO297bEA+Pj5zdzJJfTBzc0loMm1rO3owMDAwMDAwMDAwCiswMDAxX2ZmXlNOMEJ+dD1GSkU/TFplKHdBRkxHc1piIUJzT2IxIWdWVnsyaCZXcGdpZWElXm1BVmx5dndiWktsYWElRkxLV3Bpe2NhQ3VOCittMFJqe1E2YVdBSzJtdGV5N0RzM1E7V1FCZTAwMUB1MDAxQHMwMDAwMDAwMDAwMDA1K2NHI1U+OGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpCit8TUZLfVVGWWhoPCliMSF2clk7MCpfR2NSPj9YPjJjWVdwaStFWmdYV1dhQ3VObTBSantRNmFXQUsybXRleTdEdiQzK2F5cDcwMDZgJDAwCisxKXAwMDAwMDAwMDAwMDA1K2NuSHZ1UGFBfE5hVXZfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUj4/WD4yY1lXCitwcnxSRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/Yz1OWXp3NEZDVyZDamJDNDAwMDAwMDAwMDAwMDAxX2ZqVEc7MEJ+dD1GSkU/TFplKHdBCitGTEdzWmIhQnNPYjEhZ1ZWezJoJldwZ2llYSVebUFWbHl2d2JaS2xhYjh+RThFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9yM1VGWEwzamhFCit9Qj4oXzUwMDAwMDAwMDAwMDAwMV9mZWJiZTBCfnQ9RkpFP0xaZSh3QUZMR3NaYiFCc09iMSFnVlZ7MmgmV3BnaWVhJV5tQVZseXZ3YlpLCitsYWJaS3A2WipfRG9hQ3VObTBSantRNmFXQUsybXRleTdEd0NTPX5AMj0wMDdKdTAwMSFuMDAwMDAwMDAwMDAwNStjbkwhVCNhQXxOYVV2CitfMH5XTiZnV2ElRkxLV3BpfE1GS31VRlloaDwpYjEhdnJZOzAqX0djUj4/WD4yY2JhJT9WZWN+RENNMHUlIWowMDAwODBQfmQ9TjhwWUZICitILW9QME1gY3EwMmx4TzAwMDAwMDAwMDAwSGxIRU5lPSpVWD5jIU5aKjZVMVplKCpXVXRlaSVYPj95LUVedjhKTzkyOEQwfjchTjAwO297CitsQD49NjVCaTw+MHNzS1YyTEojWDAwMDAwMDAwMDAwMDAxX2Z2SFJuMEJ+dD1GSm9fUVpERFI/YjEhM1daRSRSNWJaS3ZIRV52OEpPOTI4CitEMH43IU4wMDtve2xAPj1tX3xlLW8we3tSVDI+PHtWMDAwMDAwMDAwMDAwMDFfZiFSK0YwQn50PUZKb19RWkREUj9iMSFDY1dvM0cwRV52Cis4Sk85MjhEMH43IU4wMDtve2xAPj1IN1NOcmwwUlJCajB7e1JOMDAwMDAwMDAwMDAwMDFfZmtSVWQwQn50PUZKb19RWkREUj9iMSFJUlk7CitaMWNjfkRDTTB1JSFqMDAwMDgwUH5kPU0qfVcocUJqbHowN0UkZDAyY3JOMDAwMDAwMDAwMDBIbEUqUlN5N2dYPmMhTloqNlUxWmUoKldYCis+TjBMVlFnJEphQ3VObTBSantRNmFXQUsybXRleTdEc1c5bE1wWm0wMDJgUTAwMHlLMDAwMDAwMDAwMDAwNStjaSg/TX1hQXxOYVZ7ZEozCitWUXlxfEZLbFVaYlNganRQKWgqPDZheTNoMDAwTzheT1k3eSszVismUnxXdDh7MUVeRTc2MVNNMDAwMDAwMDAwMHE9RF5mNCorbSFhNCV6CitUWkVhejBXT0ZaYlducHEtWGZBTWhQKWgqPDZheTNoMDAwTzheT1k3eVFpOyQ7QXFEXmRaVzkwaTZhV0FLMDAwMDAwMDAwMHE9OSZHNCorCittIWE0JXpUWkVhejBXT0ZaYlhtNThlYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHVhejg5JmVpMDAyWV8wMDA+UDAwMDAwMDAwMDAwMDUrYyVYCitiZHxhQXxOYVZ7ZEozVlF5cXxGTGlFZFpnWF5EWS19IVljfkRDTTB1JSFqMDAwMDgwUH5kPU18Z2x3I3huPjIwMV9QbDAyS2ZMMDAwMDAwCiswMDAwMEhsR15kays5YFg+YyFOWio2VTFaZSgqV2NXN20wWSVYd2xQKWgqPDZheTNoMDAwTzheT1k3eWQ7WUNzbG0hMylOKH0lMjc2MVNNCiswMDAwMDAwMDAwcT03aHU0KittIWE0JXpUWkUjXzlGSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eWZ9KjlETyUodERJOWRQCit6N3l0a08wMDAwMDAwMDAwcT01ajY0KittIWE0JXpUWkUjXzlGSngoQmJZcExCV0AlP0dhQ3VObTBSantRNmFXQUsybXRleTdEdVdZWFNfCitpRzAwMmgtMDAwJk0wMDAwMDAwMDAwMDA1K2NnUCN1b2FBfE5hWkVze3tZOyFNUFV1a1k+YllFWENhQ3VObTBSantRNmFXQUsybXRleTdECitzNEtHSHV9aTAwOEYhMDAwdkowMDAwMDAwMDAwMDA1K2NfQDU1fGFBfE5hWkVze3tZOyFNWlplKFM2RV52OEpPOTI4RDB+NyFOMDA7b3tsCitAPjw7MDAwMDIwMDAwMDAwMDBRMDAwMDAwMDAwMDAwMDFfZmVON3kwQn50PUZLPSpWYSQkNjdaKkZyaFV0ZWklWD4/eS1FXnY4Sk85MjhECiswfjchTjAwO297bEA+P1JGPmg2NTFPTmIjNComb2QwMDAwMDAwMDAwMDAwMV9ma2RHWDBCfnQ9Rks9KlZhJCQ2N1oqRnJoV14hZF5kU3h6CitmY35EQ00wdSUhajAwMDA4MFB+ZD1NX2cmcjhHcngpMDJCY0wwMjJUSjAwMDAwMDAwMDAwSGxINXI0SW1iWD5jIWNXcE9XR1V1a1k+YllFCitYQ2FDdU5tMFJqe1E2YVdBSzJtdGV5N0R3Rk5HcTZTcjAwNzElMDAwdkowMDAwMDAwMDAwMDA1K2NrRVJhKmFBfE5hYSVGS1phJUZLfVdACismNj9FXnY4Sk85MjhEMH43IU4wMDtve2xAPj1ERW1RKkVERjZVaXJ+bSpLMDAwMDAwMDAwMDAwMDFfZmQ7WTwwQn50PUZMR3NaRkxHc1pVCit1a1owYllYMDRFXnY4Sk85MjhEMH43IU4wMDtve2xAPj1gN3wkMyU4dnA8X1lYQVRlMDAwMDAwMDAwMDAwMDFfZmY/S24wQn50PUZMR3NaCitGTEdzWlV2cCkyRV52OEpPOTI4RDB+NyFOMDA7b3tsQD4/Mk5IaHB2Mm1rPXo4dnA8cDAwMDAwMDAwMDAwMDAxX2ZyfEdKMEJ+dD1GTEdzCitaRkxHc1pVditNMlpnWF5EWS19IVljfkRDTTB1JSFqMDAwMDgwUH5kPU0/QD1BUF9RMlcwS1JBZDAyS2ZMMDAwMDAwMDAwMDBIbEUqMDF5CitDaFg+YyFmYlpLbUpGSkU3MlpmU0kxVW9MUVlQKWgqPDZheTNoMDAwTzheT1k3eV5PJlZxMm5xbEkpZ3U0XjZhV0FLMDAwMDAwMDAwMHE9Cis1bjs1Q0N2I2E0JlVxWD40O1pWUV9Ge1g+eE5lYUN1Tm0wUmp7UTZhV0FLMm10ZXk3RHZxdE8pZFplMDAxQmIwMDBzSTAwMDAwMDAwMDAwCiswNStjSlNxP1hhQXxOYWIjIVRMYjEhMGJYPjRSSmFDdU5tMFJqe1E2YVdBSzJtdGV5N0R2OVRoR15kYzAwM3dSMDAwO08wMDAwMDAwMDAwCiswMDUrY1klQ0F9YUF8TmFiIyFUTGIxITZOYUJeajFWUlVKNFpaMj9uUCloKjw2YXkzaDAwME84Xk9ZN3lAPFoqd3F5WWNgZzk4OG43WFNiCitOMDAwMDAwMDAwMHE9QTdpNUNDdiNhNCZVcVg+NDtaV0AmNj9iOXItZ1dvPDVTY35EQ00wdSUhajAwMDA4MFB+ZD1NYDJSQlZ6VUdRMFI5CitYQjAyQlpLMDAwMDAwMDAwMDBIbEZoRiVTVDdYPmMhZmJaS21KRktsbVRYSzhMe0VedjhKTzkyOEQwfjchTjAwO297bEA+Pn1gIT9+QjFeCitAdUY2I3hKZzAwMDAwMDAwMDAwMDAxX2ZqPjQ3MEJ+dD1GTGlXalk7IU1mYiMhRTViWSl+TmFDdU5tMFJqe1E2YVdBSzJtdGV5N0R1NWsxCis9fH01MDA0RngwMDBqRjAwMDAwMDAwMDAwMDUrYzEzZUdgYUF8TmFiIyFUTGIxIXZpRV52OEpPOTI4RDB+NyFOMDA7b3tsQD49b3FsOHBaCis0RkNZfUVkVCUkMDAwMDAwMDAwMDAwMDFfZmxFZFowQn50PUZMcTtkRkpFNzJaZlNJMVVvTFFZUCloKjw2YXkzaDAwME84Xk9ZN3k+elJyCis1JUxNPWNPQSFENzVkWilIMDAwMDAwMDAwMHE9QyYtNUNDdiNhNCZYYWIxITBIZFNQTDVFXnY4Sk85MjhEMH43IU4wMDtve2xAPj9TaF9zCitKQzI+PH1OOVJMNmgwMDAwMDAwMDAwMDAwMV9meVlAODBCfnQ9RkxxO2RGSzIwVkVedjhKTzkyOEQwfjchTjAwO297bEA+PUJvMH5YfjFwCitva1U2OTUxZDAwMDAwMDAwMDAwMDAxX2ZpaHpkMEJ+dD1GTHE7ZEZLdU9WVnw4K0FWUWVtTmN+RENNMHUlIWowMDAwODBQfmQ9TT88QE41CitqX2s1ME9Ua0QwMktmTDAwMDAwMDAwMDAwSGxIUVhiPUUhWD5jIWdWezxRYWJ6Kmo5YSZ1e0taWjI/blApaCo8NmF5M2gwMDBPOF8+fnElCit7YmEpVmJwWmVYSnAldiRCTER5WjAwMDAwMDAwMDBxPTkyfjVDQ3YjYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWJoZVEkdGNvUCpoMXpQQStuCitEYldscUgwdSUhajAwMDA4MFFpKl9NO1gpaEJgTj5fMDdMKSkwMy1rYTAwMDAwMDAwMDAwSGxFI2NNdCRAWD5jdCFFLUB9TEVAV3dRYlMtCitJYVdeWFRMWmdnXmFVdk9ffVpnZ2BsYmEtQDdPOTI4RDB+NyFOMDA7cDFsQD4+KDRqOX5IMHNzS2gxcG9qYzAwMDAwMDAwMDAwMDAxX2ZyCitXUHYwQn50PUVqS1BQRTsyNDtYPilXZlg+TWszRkt1T1hWUHMpK1ZKPlFPWipFWGEwUmp7UTZhV0FLMm10dCU3RHVIJURWe0Y/MDAxcmswCiswMH5TMDAwMDAwMDAwMDAwNStjQ3dkUzdhQXxOWUghZCtRR0E/OWtiOTYwZlpmMCpVYUFJO1VZSUFSSFApaCo8NmF5M2gwMDBPOF8+fnElCisjfit1JTFeQHM2MU9OYTRBcGlnWDAwMDAwMDAwMDBxPUFybjVDQ3YjYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWRJamE5P2E/YzRjZlhiYS1ACis3TzkyOEQwfjchTjAwO3AxbEA+PmJHazxTaTAwMDFQMDAwMFAwMDAwMDAwMDAwMDAwMV9mel41dDBCfnQ9RWpLUFBFOzI0O1g+KVdmWD5NCitrM0ZJUHhLTU5DamowUmp7UTZhV0FLMm10dCU3RHNOZDRlOTl1MDA2eFEwMDB+UzAwMDAwMDAwMDAwMDUrY1lrTHA/YUF8TllIIWQrUUdBCis/OWtiOTYwZlpmMCpVTyt7MmVMX3QoUlApaCo8NmF5M2gwMDBPOF8+fnElamchKlJgelpoYlI5NjUxOFVPJFEwMDAwMDAwMDAwcT1BbHA1CitDQ3YjYTRrMTNGKWxKTFdOQ0FCRW9wOU1aIWMwc0xyK3BmUCloe3swMDAwMD47VVdsWEd7UDkhS2VAYjAwMAorIiIiCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9maWxlcy9kZWZhdWx0L25vcm1hdGl2ZXMudGFyLmd6IGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9maWxlcy9kZWZhdWx0L25vcm1hdGl2ZXMudGFyLmd6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjNkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL2ZpbGVzL2RlZmF1bHQvbm9ybWF0aXZlcy50YXIuZ3oKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9yZWNpcGVzL2NoZWNrX0JhY2tlbmQucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL3JlY2lwZXMvY2hlY2tfQmFja2VuZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGJiNTBlCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9yZWNpcGVzL2NoZWNrX0JhY2tlbmQucmIKQEAgLTAsMCArMSwxOSBAQAorcnVieV9ibG9jayAiY2hlY2tfQmFja2VuZF9IZWFsdGgiIGRvCisgICAgYmxvY2sgZG8KKyAgICAgIHByaW50ZigiXDAzM1szMm0lc1xuXDAzM1swbSIsICIgIGV4ZWN1dGluZyBCYWNrRW5kIGhlYWx0aC1jaGVjaywgcGxlYXNlIHdhaXQuLi4iKQorICAgICAgQ2hlZjo6UmVzb3VyY2U6OlJ1YnlCbG9jay5zZW5kKDppbmNsdWRlLCBDaGVmOjpNaXhpbjo6U2hlbGxPdXQpCisgICAgICBjdXJsX2NvbW1hbmQgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NkYzIvcmVzdC92MS91c2VyL2poMDAwMyIKKyAgICAgIHJlc3AgPSBOZXQ6OkhUVFAuZ2V0X3Jlc3BvbnNlIFVSSS5wYXJzZShjdXJsX2NvbW1hbmQpCisgICAgICBzdGF0ID0gcmVzcC5jb2RlCisKKyAgICAgIGNhc2Ugc3RhdAorICAgICAgICAgd2hlbiAnMjAwJworICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMybSVzXG5cMDMzWzBtIiwgIiAgQmFja0VuZCBpcyB1cC4iKQorICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMxbXN0YXQ9WyVzXVxuXDAzM1swbSIsIHN0YXQpCisgICAgICAgICAgICBwcmludGYoIlwwMzNbMzFtJXNcblwwMzNbMG0iLCAiICBCYWNrRW5kIGlzIERPV04hISEiKQorICAgICAgZW5kCisgICBlbmQKKyAgIHJldHJpZXMgMTIKKyAgIHJldHJ5X2RlbGF5IDUKK2VuZApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9yZWNpcGVzL2ltcG9ydF9Ob3JtYXRpdmVzLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9yZWNpcGVzL2ltcG9ydF9Ob3JtYXRpdmVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOGU0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL3JlY2lwZXMvaW1wb3J0X05vcm1hdGl2ZXMucmIKQEAgLTAsMCArMSwxNiBAQAorY29va2Jvb2tfZmlsZSAiL3RtcC9ub3JtYXRpdmVzLnRhci5neiIgZG8KKyAgIHNvdXJjZSAibm9ybWF0aXZlcy50YXIuZ3oiCitlbmQKKword29ya2luZ19kaXJlY3RvcnkgPSAgIi90bXAiCisKK2Jhc2ggImltcG9ydC1ub3JtYXRpdmVzIiBkbworICBjd2QgIiN7d29ya2luZ19kaXJlY3Rvcnl9IgorICBjb2RlIDw8LUVPSAorICAgIHRhciB4dmZ6IC90bXAvbm9ybWF0aXZlcy50YXIuZ3oKKyAgICBjZCBub3JtYXRpdmVzL3NjcmlwdHMvaW1wb3J0L3Rvc2NhLworICAgIC9iaW4vY2htb2QgK3ggaW1wb3J0Tm9ybWF0aXZlQWxsLnB5CisgICAgcHl0aG9uIGltcG9ydE5vcm1hdGl2ZUFsbC5weSAtaSAiI3tub2RlWydIT1NUX0lQJ119IiAtLWRlYnVnPXRydWUgPiAvdmFyL2xpYi9qZXR0eS9sb2dzL2ltcG9ydE5vcm1hdGl2ZUFsbC5sb2cKKyAgRU9ICitlbmQKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtbm9ybWF0aXZlcy9yZWNpcGVzL3VwZ3JhZGVfTm9ybWF0aXZlcy5yYiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLW5vcm1hdGl2ZXMvcmVjaXBlcy91cGdyYWRlX05vcm1hdGl2ZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3MWY4YwotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLW5vcm1hdGl2ZXMvcmVjaXBlcy91cGdyYWRlX05vcm1hdGl2ZXMucmIKQEAgLTAsMCArMSwxNyBAQAorY29va2Jvb2tfZmlsZSAiL3RtcC9ub3JtYXRpdmVzLnRhci5neiIgZG8gCisgICBzb3VyY2UgIm5vcm1hdGl2ZXMudGFyLmd6IgorZW5kCisKK3dvcmtpbmdfZGlyZWN0b3J5ID0gICIvdG1wIgorCitiYXNoICJ1cGdyYWRlLW5vcm1hdGl2ZXMiIGRvCisgIGN3ZCAiI3t3b3JraW5nX2RpcmVjdG9yeX0iCisgIGNvZGUgPDwtRU9ICisgICAgdGFyIHh2ZnogL3RtcC9ub3JtYXRpdmVzLnRhci5negorICAgIGNkIG5vcm1hdGl2ZXMvc2NyaXB0cy9pbXBvcnQvdG9zY2EvCisgICAgL2Jpbi9jaG1vZCAreCB1cGdyYWRlTm9ybWF0aXZlLnB5IGltcG9ydEdyb3VwVHlwZXMucHkKKyAgICBweXRob24gdXBncmFkZU5vcm1hdGl2ZS5weSAtaSAiI3tub2RlWydIT1NUX0lQJ119IiAtLWRlYnVnPXRydWUgPiAvdmFyL2xpYi9qZXR0eS9sb2dzL3VwZ3JhZGVOb3JtYXRpdmUubG9nCisgICAgcHl0aG9uIGltcG9ydEdyb3VwVHlwZXMucHkgLWkgIiN7bm9kZVsnSE9TVF9JUCddfSIgPiAvdmFyL2xpYi9qZXR0eS9sb2dzL2ltcG9ydEdyb3VwVHlwZXMubG9nCisgIEVPSAorZW5kCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9MSUNFTlNFIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNjllZAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9MSUNFTlNFCkBAIC0wLDAgKzEsMjAxIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworMS4gRGVmaW5pdGlvbnMuCisKKyAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKzQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKzUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCitDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjBmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzcgQEAKK0RlcHJlY2F0ZWQKKz09PT09PT09PT0KKworVXNlIG9mIHRoaXMgcmVwb3NpdG9yeSBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBjaGVmIGdlbmVyYXRlIHJlcG9gIGNvbW1hbmQgdGhhdCBjb21lcyB3aXRoIFtDaGVmREtdKGh0dHA6Ly9kb3dubG9hZHMuY2hlZi5pby9jaGVmLWRrLykuCisKK092ZXJ2aWV3Cis9PT09PT09PQorCitFdmVyeSBDaGVmIGluc3RhbGxhdGlvbiBuZWVkcyBhIENoZWYgUmVwb3NpdG9yeS4gVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgY29va2Jvb2tzLCByb2xlcywgY29uZmlnIGZpbGVzIGFuZCBvdGhlciBhcnRpZmFjdHMgZm9yIG1hbmFnaW5nIHN5c3RlbXMgd2l0aCBDaGVmIHdpbGwgbGl2ZS4gV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHN0b3JpbmcgdGhpcyByZXBvc2l0b3J5IGluIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBzdWNoIGFzIEdpdCBhbmQgdHJlYXQgaXQgbGlrZSBzb3VyY2UgY29kZS4KKworV2hpbGUgd2UgcHJlZmVyIEdpdCwgYW5kIG1ha2UgdGhpcyByZXBvc2l0b3J5IGF2YWlsYWJsZSB2aWEgR2l0SHViLCB5b3UgYXJlIHdlbGNvbWUgdG8gZG93bmxvYWQgYSB0YXIgb3IgemlwIGFyY2hpdmUgYW5kIHVzZSB5b3VyIGZhdm9yaXRlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdG8gbWFuYWdlIHRoZSBjb2RlLgorCitSZXBvc2l0b3J5IERpcmVjdG9yaWVzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgcmVwb3NpdG9yeSBjb250YWlucyBzZXZlcmFsIGRpcmVjdG9yaWVzLCBhbmQgZWFjaCBkaXJlY3RvcnkgY29udGFpbnMgYSBSRUFETUUgZmlsZSB0aGF0IGRlc2NyaWJlcyB3aGF0IGl0IGlzIGZvciBpbiBncmVhdGVyIGRldGFpbCwgYW5kIGhvdyB0byB1c2UgaXQgZm9yIG1hbmFnaW5nIHlvdXIgc3lzdGVtcyB3aXRoIENoZWYuCisKKyogYGNvb2tib29rcy9gIC0gQ29va2Jvb2tzIHlvdSBkb3dubG9hZCBvciBjcmVhdGUuCisqIGBkYXRhX2JhZ3MvYCAtIFN0b3JlIGRhdGEgYmFncyBhbmQgaXRlbXMgaW4gLmpzb24gaW4gdGhlIHJlcG9zaXRvcnkuCisqIGByb2xlcy9gIC0gU3RvcmUgcm9sZXMgaW4gLnJiIG9yIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorKiBgZW52aXJvbm1lbnRzL2AgLSBTdG9yZSBlbnZpcm9ubWVudHMgaW4gLnJiIG9yIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorCitDb25maWd1cmF0aW9uCis9PT09PT09PT09PT09CisKK1RoZSByZXBvc2l0b3J5IGNvbnRhaW5zIGEga25pZmUgY29uZmlndXJhdGlvbiBmaWxlLgorCisqIC5jaGVmL2tuaWZlLnJiCisKK1RoZSBrbmlmZSBjb25maWd1cmF0aW9uIGZpbGUgYC5jaGVmL2tuaWZlLnJiYCBpcyBhIHJlcG9zaXRvcnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIGZvciBrbmlmZS4gSWYgeW91J3JlIHVzaW5nIEhvc3RlZCBDaGVmLCB5b3UgY2FuIGRvd25sb2FkIG9uZSBmb3IgeW91ciBvcmdhbml6YXRpb24gZnJvbSB0aGUgbWFuYWdlbWVudCBjb25zb2xlLiBJZiB5b3UncmUgdXNpbmcgdGhlIE9wZW4gU291cmNlIENoZWYgU2VydmVyLCB5b3UgY2FuIGdlbmVyYXRlIGEgbmV3IG9uZSB3aXRoIGBrbmlmZSBjb25maWd1cmVgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1cmluZyBLbmlmZSwgc2VlIHRoZSBLbmlmZSBkb2N1bWVudGF0aW9uLgorCitodHRwczovL2RvY3MuY2hlZi5pby9rbmlmZS5odG1sCisKK05leHQgU3RlcHMKKz09PT09PT09PT0KKworUmVhZCB0aGUgUkVBRE1FIGZpbGUgaW4gZWFjaCBvZiB0aGUgc3ViZGlyZWN0b3JpZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBnb2VzIGluIHRob3NlIGRpcmVjdG9yaWVzLgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL2NoZWZpZ25vcmUgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vY2hlZmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTMwYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL2NoZWZpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorIyBQdXQgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGlzIGZpbGUuCisjIExpbmVzIHRoYXQgc3RhcnQgd2l0aCAnIyAnIGFyZSBjb21tZW50cy4KKworIyBlbWFjcworKn4KKworIyB2aW0KKyouc3dbYS16XQorCisjIHN1YnZlcnNpb24KKyovLnN2bi8qCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vY29va2Jvb2tzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9jb29rYm9va3MvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWE0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vY29va2Jvb2tzL1JFQURNRS5tZApAQCAtMCwwICsxLDU0IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgY29va2Jvb2tzIHVzZWQgdG8gY29uZmlndXJlIHN5c3RlbXMgaW4geW91ciBpbmZyYXN0cnVjdHVyZSB3aXRoIENoZWYuCisKK0tuaWZlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8ga25vdyB3aGVyZSB0aGUgY29va2Jvb2tzIGFyZSBsb2NhdGVkIHdpdGggdGhlIGBjb29rYm9va19wYXRoYCBzZXR0aW5nLiBJZiB0aGlzIGlzIG5vdCBzZXQsIHRoZW4gc2V2ZXJhbCBjb29rYm9vayBvcGVyYXRpb25zIHdpbGwgZmFpbCB0byB3b3JrIHByb3Blcmx5LgorCisgICAgY29va2Jvb2tfcGF0aCBbIi4vY29va2Jvb2tzIl0KKworVGhpcyBzZXR0aW5nIHRlbGxzIGtuaWZlIHRvIGxvb2sgZm9yIHRoZSBjb29rYm9va3MgZGlyZWN0b3J5IGluIHRoZSBwcmVzZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIG1lYW5zIHRoZSBrbmlmZSBjb29rYm9vayBzdWJjb21tYW5kcyBuZWVkIHRvIGJlIHJ1biBpbiB0aGUgYGNoZWYtcmVwb2AgZGlyZWN0b3J5IGl0c2VsZi4gVG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvb2tib29rcyBjYW4gYmUgZm91bmQgZWxzZXdoZXJlIGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgdXNlIGFuIGFic29sdXRlIHBhdGguIFRoaXMgaXMgYSBSdWJ5IGZpbGUsIHNvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQ6CisKKyAgICBjdXJyZW50X2RpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykKKyAgICBjb29rYm9va19wYXRoIFsiI3tjdXJyZW50X2Rpcn0vLi4vY29va2Jvb2tzIl0KKworV2hpY2ggd2lsbCBzZXQgYGN1cnJlbnRfZGlyYCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGtuaWZlLnJiIGZpbGUgaXRzZWxmIChlLmcuIGB+L2NoZWYtcmVwby8uY2hlZi9rbmlmZS5yYmApLgorCitDb25maWd1cmUga25pZmUgdG8gdXNlIHlvdXIgcHJlZmVycmVkIGNvcHlyaWdodCBob2xkZXIsIGVtYWlsIGNvbnRhY3QgYW5kIGxpY2Vuc2UuIEFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIGAuY2hlZi9rbmlmZS5yYmAuCisKKyAgICBjb29rYm9va19jb3B5cmlnaHQgIkV4YW1wbGUsIENvbS4iCisgICAgY29va2Jvb2tfZW1haWwgICAgICJjb29rYm9va3NAZXhhbXBsZS5jb20iCisgICAgY29va2Jvb2tfbGljZW5zZSAgICJhcGFjaGV2MiIKKworU3VwcG9ydGVkIHZhbHVlcyBmb3IgYGNvb2tib29rX2xpY2Vuc2VgIGFyZSAiYXBhY2hldjIiLCAibWl0IiwiZ3BsdjIiLCJncGx2MyIsICBvciAibm9uZSIuIFRoZXNlIHNldHRpbmdzIGFyZSB1c2VkIHRvIHByZWZpbGwgY29tbWVudHMgaW4gdGhlIGRlZmF1bHQgcmVjaXBlLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoZSBtZXRhZGF0YS5yYi4gWW91IGFyZSBmcmVlIHRvIGNoYW5nZSB0aGUgdGhlIGNvbW1lbnRzIGluIHRob3NlIGZpbGVzLgorCitDcmVhdGUgbmV3IGNvb2tib29rcyBpbiB0aGlzIGRpcmVjdG9yeSB3aXRoIEtuaWZlLgorCisgICAga25pZmUgY29va2Jvb2sgY3JlYXRlIENPT0tCT09LCisKK1RoaXMgd2lsbCBjcmVhdGUgYWxsIHRoZSBjb29rYm9vayBkaXJlY3RvcnkgY29tcG9uZW50cy4gWW91IGRvbid0IG5lZWQgdG8gdXNlIHRoZW0gYWxsLCBhbmQgY2FuIGRlbGV0ZSB0aGUgb25lcyB5b3UgZG9uJ3QgbmVlZC4gSXQgYWxzbyBjcmVhdGVzIGEgUkVBRE1FIGZpbGUsIG1ldGFkYXRhLnJiIGFuZCBkZWZhdWx0IHJlY2lwZS4KKworWW91IGNhbiBhbHNvIGRvd25sb2FkIGNvb2tib29rcyBkaXJlY3RseSBmcm9tIHRoZSBPcHNjb2RlIENvb2tib29rIFNpdGUuIFRoZXJlIGFyZSB0d28gc3ViY29tbWFuZHMgdG8gaGVscCB3aXRoIHRoaXMgZGVwZW5kaW5nIG9uIHdoYXQgeW91ciBwcmVmZXJlbmNlIGlzLgorCitUaGUgZmlyc3QgYW5kIHJlY29tbWVuZGVkIG1ldGhvZCBpcyB0byB1c2UgYSB2ZW5kb3IgYnJhbmNoIGlmIHlvdSdyZSB1c2luZyBHaXQuIFRoaXMgaXMgYXV0b21hdGljYWxseSBoYW5kbGVkIHdpdGggS25pZmUuCisKKyAgICBrbmlmZSBjb29rYm9vayBzaXRlIGluc3RhbGwgQ09PS0JPT0sKKworVGhpcyB3aWxsOgorCisqIERvd25sb2FkIHRoZSBjb29rYm9vayB0YXJiYWxsIGZyb20gY29va2Jvb2tzLm9wc2NvZGUuY29tLgorKiBFbnN1cmUgaXRzIG9uIHRoZSBnaXQgbWFzdGVyIGJyYW5jaC4KKyogQ2hlY2tzIGZvciBhbiBleGlzdGluZyB2ZW5kb3IgYnJhbmNoLCBhbmQgY3JlYXRlcyBpZiBpdCBkb2Vzbid0LgorKiBDaGVja3Mgb3V0IHRoZSB2ZW5kb3IgYnJhbmNoIChjaGVmLXZlbmRvci1DT09LQk9PSykuCisqIFJlbW92ZXMgdGhlIGV4aXN0aW5nIChvbGQpIHZlcnNpb24uCisqIFVudGFycyB0aGUgY29va2Jvb2sgdGFyYmFsbCBpdCBkb3dubG9hZGVkIGluIHRoZSBmaXJzdCBzdGVwLgorKiBBZGRzIHRoZSBjb29rYm9vayBmaWxlcyB0byB0aGUgZ2l0IGluZGV4IGFuZCBjb21taXRzLgorKiBDcmVhdGVzIGEgdGFnIGZvciB0aGUgdmVyc2lvbiBkb3dubG9hZGVkLgorKiBDaGVja3Mgb3V0IHRoZSBtYXN0ZXIgYnJhbmNoIGFnYWluLgorKiBNZXJnZXMgdGhlIGNvb2tib29rIGludG8gbWFzdGVyLgorKiBSZXBlYXRzIHRoZSBhYm92ZSBmb3IgYWxsIHRoZSBjb29rYm9va3MgZGVwZW5kZW5jaWVzLCBkb3dubG9hZGluZyB0aGVtIGZyb20gdGhlIGNvbW11bml0eSBzaXRlCisKK1RoZSBsYXN0IHN0ZXAgd2lsbCBlbnN1cmUgdGhhdCBhbnkgbG9jYWwgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHlvdSBoYXZlIG1hZGUgdG8gdGhlIGNvb2tib29rIGFyZSBwcmVzZXJ2ZWQsIHNvIHlvdSBjYW4ga2VlcCB5b3VyIGNoYW5nZXMgdGhyb3VnaCB1cHN0cmVhbSB1cGRhdGVzLgorCitJZiB5b3UncmUgbm90IHVzaW5nIEdpdCwgdXNlIHRoZSBzaXRlIGRvd25sb2FkIHN1YmNvbW1hbmQgdG8gZG93bmxvYWQgdGhlIHRhcmJhbGwuCisKKyAgICBrbmlmZSBjb29rYm9vayBzaXRlIGRvd25sb2FkIENPT0tCT09LCisKK1RoaXMgY3JlYXRlcyB0aGUgQ09PS0JPT0sudGFyLmd6IGZyb20gaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChlLmcuLCBgfi9jaGVmLXJlcG9gKS4gV2UgcmVjb21tZW5kIGZvbGxvd2luZyBhIHdvcmtmbG93IHNpbWlsYXIgdG8gdGhlIGFib3ZlIGZvciB5b3VyIHZlcnNpb24gY29udHJvbCB0b29sLgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL2RhdGFfYmFncy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vZGF0YV9iYWdzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzE1YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL2RhdGFfYmFncy9SRUFETUUubWQKQEAgLTAsMCArMSw2MyBAQAorRGF0YSBCYWdzCistLS0tLS0tLS0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGlyZWN0b3JpZXMgb2YgdGhlIHZhcmlvdXMgZGF0YSBiYWdzIHlvdSBjcmVhdGUgZm9yIHlvdXIgaW5mcmFzdHJ1Y3R1cmUuIEVhY2ggc3ViZGlyZWN0b3J5IGNvcnJlc3BvbmRzIHRvIGEgZGF0YSBiYWcgb24gdGhlIENoZWYgU2VydmVyLCBhbmQgY29udGFpbnMgSlNPTiBmaWxlcyBvZiB0aGUgaXRlbXMgdGhhdCBnbyBpbiB0aGUgYmFnLgorCitGaXJzdCwgY3JlYXRlIGEgZGlyZWN0b3J5IGZvciB0aGUgZGF0YSBiYWcuCisKKyAgICBta2RpciBkYXRhX2JhZ3MvQkFHCisKK1RoZW4gY3JlYXRlIHRoZSBKU09OIGZpbGVzIGZvciBpdGVtcyB0aGF0IHdpbGwgZ28gaW50byB0aGF0IGJhZy4KKworICAgICRFRElUT1IgZGF0YV9iYWdzL0JBRy9JVEVNLmpzb24KKworVGhlIEpTT04gZm9yIHRoZSBJVEVNIG11c3QgY29udGFpbiBhIGtleSBuYW1lZCAiaWQiIHdpdGggYSB2YWx1ZSBlcXVhbCB0byAiSVRFTSIuIEZvciBleGFtcGxlLAorCisgICAgeworICAgICAgImlkIjogImZvbyIKKyAgICB9CisKK05leHQsIGNyZWF0ZSB0aGUgZGF0YSBiYWcgb24gdGhlIENoZWYgU2VydmVyLgorCisgICAga25pZmUgZGF0YSBiYWcgY3JlYXRlIEJBRworCitUaGVuIHVwbG9hZCB0aGUgaXRlbXMgaW4gdGhlIGRhdGEgYmFnJ3MgZGlyZWN0b3J5IHRvIHRoZSBDaGVmIFNlcnZlci4KKworICAgIGtuaWZlIGRhdGEgYmFnIGZyb20gZmlsZSBCQUcgSVRFTS5qc29uCisKKworRW5jcnlwdGVkIERhdGEgQmFncworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZGRlZCBpbiBDaGVmIDAuMTAsIGVuY3J5cHRlZCBkYXRhIGJhZ3MgYWxsb3cgeW91IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZGF0YSBiYWdzLiBUaGUgY29udGVudCBvZiBhdHRyaWJ1dGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNlYXJjaGFibGUuIFRvIHVzZSBlbmNyeXB0ZWQgZGF0YSBiYWdzLCBmaXJzdCB5b3UgbXVzdCBoYXZlIG9yIGNyZWF0ZSBhIHNlY3JldCBrZXkuCisKKyAgICBvcGVuc3NsIHJhbmQgLWJhc2U2NCA1MTIgPiBzZWNyZXRfa2V5CisKK1lvdSBtYXkgdXNlIHRoaXMgc2VjcmV0X2tleSB0byBhZGQgaXRlbXMgdG8gYSBkYXRhIGJhZyBkdXJpbmcgYSBjcmVhdGUuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBjcmVhdGUgLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5IHBhc3N3b3JkcyBteXNxbAorCitZb3UgbWF5IGFsc28gdXNlIGl0IHdoZW4gYWRkaW5nIElURU1zIGZyb20gZmlsZXMsCisKKyAgICBrbmlmZSBkYXRhIGJhZyBjcmVhdGUgcGFzc3dvcmRzCisgICAga25pZmUgZGF0YSBiYWcgZnJvbSBmaWxlIHBhc3N3b3JkcyBkYXRhX2JhZ3MvcGFzc3dvcmRzL215c3FsLmpzb24gLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5CisKK1RoZSBKU09OIGZvciB0aGUgSVRFTSBtdXN0IGNvbnRhaW4gYSBrZXkgbmFtZWQgImlkIiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gIklURU0iIGFuZCB0aGUgY29udGVudHMgd2lsbCBiZSBlbmNyeXB0ZWQgd2hlbiB1cGxvYWRlZC4gRm9yIGV4YW1wbGUsCisKKyAgICB7CisgICAgICAiaWQiOiAibXlzcWwiLAorICAgICAgInBhc3N3b3JkIjogImFiYzEyMyIKKyAgICB9CisKK1dpdGhvdXQgdGhlIHNlY3JldF9rZXksIHRoZSBjb250ZW50cyBhcmUgZW5jcnlwdGVkLgorCisgICAga25pZmUgZGF0YSBiYWcgc2hvdyBwYXNzd29yZHMgbXlzcWwKKyAgICBpZDogICAgICAgIG15c3FsCisgICAgcGFzc3dvcmQ6ICAySTBYVVV2ZTFUWEVvakV5ZUdzamh3PT0KKworVXNlIHRoZSBzZWNyZXRfa2V5IHRvIHZpZXcgdGhlIGNvbnRlbnRzLgorCisgICAga25pZmUgZGF0YSBiYWcgc2hvdyBwYXNzd29yZHMgbXlzcWwgLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5CisgICAgaWQ6ICAgICAgICBteXNxbAorICAgIHBhc3N3b3JkOiAgYWJjMTIzCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9lbnZpcm9ubWVudHMvUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL2Vudmlyb25tZW50cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhYzQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9lbnZpcm9ubWVudHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNSBAQAorUmVxdWlyZXMgQ2hlZiAwLjEwLjArLgorCitUaGlzIGRpcmVjdG9yeSBpcyBmb3IgUnVieSBEU0wgYW5kIEpTT04gZmlsZXMgZm9yIGVudmlyb25tZW50cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBDaGVmIHdpa2kgcGFnZToKKworaHR0cDovL2RvY3MuY2hlZi5pby9lbnZpcm9ubWVudHMuaHRtbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL25vcm1hdGl2ZXMuanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9ub3JtYXRpdmVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjOTI3NgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9ub3JtYXRpdmVzLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICAgInJ1bl9saXN0IjogWyAicmVjaXBlW3NkYy1ub3JtYXRpdmVzOjppbXBvcnRfTm9ybWF0aXZlc10iIF0KK30KKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL25vcm1hdGl2ZXMucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vbm9ybWF0aXZlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkwNDUwCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL25vcm1hdGl2ZXMucmIKQEAgLTAsMCArMSwxNiBAQAorcm9vdCA9IEZpbGUuYWJzb2x1dGVfcGF0aChGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorZmlsZV9jYWNoZV9wYXRoIHJvb3QKK2Nvb2tib29rX3BhdGggcm9vdCArICcvY29va2Jvb2tzJworanNvbl9hdHRyaWJzIHJvb3QgKyAnL25vcm1hdGl2ZXMuanNvbicKK2NoZWNrc3VtX3BhdGggcm9vdCArICcvY2hlY2tzdW1zJworZGF0YV9iYWdfcGF0aCByb290ICsgJy9kYXRhX2JhZ3MnCitlbnZpcm9ubWVudF9wYXRoIHJvb3QgKyAnL2Vudmlyb25tZW50cycKK2ZpbGVfYmFja3VwX3BhdGggcm9vdCArICcvYmFja3VwJworZmlsZV9jYWNoZV9wYXRoIHJvb3QgKyAnL2NhY2hlJworbG9nX2xldmVsIDppbmZvCitsb2dfbG9jYXRpb24gU1RET1VUCityZXN0X3RpbWVvdXQgMzAwCityb2xlX3BhdGggcm9vdCArICcvcm9sZXMnCitzeW50YXhfY2hlY2tfY2FjaGVfcGF0aAordW1hc2sgMDAyMgordmVyYm9zZV9sb2dnaW5nIG5pbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL3JvbGVzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlZTBiNAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQKQEAgLTAsMCArMSwxNiBAQAorQ3JlYXRlIHJvbGVzIGhlcmUsIGluIGVpdGhlciB0aGUgUm9sZSBSdWJ5IERTTCAoLnJiKSBvciBKU09OICguanNvbikgZmlsZXMuIFRvIGluc3RhbGwgcm9sZXMgb24gdGhlIHNlcnZlciwgdXNlIGtuaWZlLgorCitGb3IgZXhhbXBsZSwgY3JlYXRlIGByb2xlcy9iYXNlX2V4YW1wbGUucmJgOgorCisgICAgbmFtZSAiYmFzZV9leGFtcGxlIgorICAgIGRlc2NyaXB0aW9uICJFeGFtcGxlIGJhc2Ugcm9sZSBhcHBsaWVkIHRvIGFsbCBub2Rlcy4iCisgICAgIyBMaXN0IG9mIHJlY2lwZXMgYW5kIHJvbGVzIHRvIGFwcGx5LiBSZXF1aXJlcyBDaGVmIDAuOCwgZWFybGllciB2ZXJzaW9ucyB1c2UgJ3JlY2lwZXMoKScuCisgICAgI3J1bl9saXN0KCkKKyAgICAjIEF0dHJpYnV0ZXMgYXBwbGllZCBpZiB0aGUgbm9kZSBkb2Vzbid0IGhhdmUgaXQgc2V0IGFscmVhZHkuCisgICAgI2RlZmF1bHRfYXR0cmlidXRlcygpCisgICAgIyBBdHRyaWJ1dGVzIGFwcGxpZWQgbm8gbWF0dGVyIHdoYXQgdGhlIG5vZGUgaGFzIHNldCBhbHJlYWR5LgorICAgICNvdmVycmlkZV9hdHRyaWJ1dGVzKCkKKworVGhlbiB1cGxvYWQgaXQgdG8gdGhlIENoZWYgU2VydmVyOgorICAgIAorICAgIGtuaWZlIHJvbGUgZnJvbSBmaWxlIHJvbGVzL2Jhc2VfZXhhbXBsZS5yYgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL3JvbGVzL2NhdGFsb2ctYmUuanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9yb2xlcy9jYXRhbG9nLWJlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5MjhiYgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9yb2xlcy9jYXRhbG9nLWJlLmpzb24KQEAgLTAsMCArMSwyNCBAQAoreworICAibmFtZSI6ICJjYXRhbG9nLWJlIiwKKyAgImRlc2NyaXB0aW9uIjogIkluc3RhbGxhdGlvbiBhcHBsaWNhdGlvbiAtIGNhdGFsb2dCRSIsCisgICJqc29uX2NsYXNzIjogIkNoZWY6OlJvbGUiLAorICAiZGVmYXVsdF9hdHRyaWJ1dGVzIjogeworCisgIH0sCisgICJvdmVycmlkZV9hdHRyaWJ1dGVzIjogeworCisgIH0sCisgICJjaGVmX3R5cGUiOiAicm9sZSIsCisgICJydW5fbGlzdCI6IFsKKyAgICAicmVjaXBlW3NkYy1jYXRhbG9nLWJlOjpCRV8xX2NsZWFudXBfamV0dHlkaXJdIiwKKyAgICAicmVjaXBlW3NkYy1jYXRhbG9nLWJlOjpCRV8yX2xvY2F0ZV93YXJzXSIsCisgICAgInJlY2lwZVtzZGMtY2F0YWxvZy1iZTo6QkVfNF9zZXR1cF9jb25maWd1cmF0aW9uXSIsCisgICAgInJlY2lwZVtzZGMtY2F0YWxvZy1iZTo6QkVfNV9zZXR1cF9lbGFzdGljc2VhcmNoXSIsCisgICAgInJlY2lwZVtzZGMtY2F0YWxvZy1iZTo6QkVfNl9zZXR1cF9wb3J0YWxfcHJvcGVydGllc10iLAorICAgICJyZWNpcGVbc2RjLWNhdGFsb2ctYmU6OkJFXzdfbG9nYmFja10iLAorICAgICJyZWNpcGVbc2RjLWNhdGFsb2ctYmU6OkJFXzhfZXJyb3JzX2NvbmZpZ10iCisgIF0sCisgICJlbnZfcnVuX2xpc3RzIjogeworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL2NoZWYtc29sby9zb2xvLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vc29sby5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDk2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vc29sby5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAgICJydW5fbGlzdCI6IFsgInJvbGVbY2F0YWxvZy1iZV0iIF0KK30KKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL3NvbG8ucmIgYi9zZGMtb3MtY2hlZi9zZGMtYmFja2VuZC9jaGVmLXNvbG8vc29sby5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmMxYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvY2hlZi1zb2xvL3NvbG8ucmIKQEAgLTAsMCArMSwxNiBAQAorcm9vdCA9IEZpbGUuYWJzb2x1dGVfcGF0aChGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorZmlsZV9jYWNoZV9wYXRoIHJvb3QKK2Nvb2tib29rX3BhdGggcm9vdCArICcvY29va2Jvb2tzJworanNvbl9hdHRyaWJzIHJvb3QgKyAnL3NvbG8uanNvbicKK2NoZWNrc3VtX3BhdGggcm9vdCArICcvY2hlY2tzdW1zJworZGF0YV9iYWdfcGF0aCByb290ICsgJy9kYXRhX2JhZ3MnCitlbnZpcm9ubWVudF9wYXRoIHJvb3QgKyAnL2Vudmlyb25tZW50cycKK2ZpbGVfYmFja3VwX3BhdGggcm9vdCArICcvYmFja3VwJworZmlsZV9jYWNoZV9wYXRoIHJvb3QgKyAnL2NhY2hlJworbG9nX2xldmVsIDppbmZvCitsb2dfbG9jYXRpb24gU1RET1VUCityZXN0X3RpbWVvdXQgMzAwCityb2xlX3BhdGggcm9vdCArICcvcm9sZXMnCitzeW50YXhfY2hlY2tfY2FjaGVfcGF0aAordW1hc2sgMDAyMgordmVyYm9zZV9sb2dnaW5nIG5pbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWJhY2tlbmQvc3RhcnR1cC5zaCBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL3N0YXJ0dXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5NWRkZAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1iYWNrZW5kL3N0YXJ0dXAuc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisKK2V4cG9ydCBDSEVGTkFNRT0ke0VOVk5BTUV9CisjIGV4ZWN1dGluZyBjaGVmLXNvbG8gZm9yIGNvbmZpZ3VyYXRpb24KK2NkIC9yb290L2NoZWYtc29sbworZWNobyAibm9ybWFsWydIT1NUX0lQJ10gPSBcIiR7SE9TVF9JUH1cIiIgPiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYgorY2hlZi1zb2xvIC1jIHNvbG8ucmIgLUUgJHtDSEVGTkFNRX0KKworc2VkIC1pICcvXnNldCAtZS9hSkFWQV9PUFRJT05TPVwiIC1YWDpNYXhQZXJtU2l6ZT0yNTZtIC1YbXgxNTAwbSAtRGNvbmZpZy5ob21lPSR7SkVUVFlfQkFTRX1cL2NvbmZpZyAtRGxvZy5ob21lPSR7SkVUVFlfQkFTRX1cL2xvZ3MgLURsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPSR7SkVUVFlfQkFTRX1cL2NvbmZpZ1wvY2F0YWxvZy1iZVwvbG9nYmFjay54bWwgLURjb25maWd1cmF0aW9uLnlhbWw9JHtKRVRUWV9CQVNFfVwvY29uZmlnXC9jYXRhbG9nLWJlXC9jb25maWd1cmF0aW9uLnlhbWxcIicgL2RvY2tlci1lbnRyeXBvaW50LnNoCitzZWQgLWkgJy9ec2V0IC1lL2FUTVBESVI9JHtKRVRUWV9CQVNFfVwvdGVtcCcgL2RvY2tlci1lbnRyeXBvaW50LnNoCisKKyMgZXhlY3V0aW9uZyB0aGUgamV0dHkKK2NkIC92YXIvbGliL2pldHR5CisvZG9ja2VyLWVudHJ5cG9pbnQuc2ggJgorCisjIGFkZCB0aGUgY29uc3VtZXJzCitjZCAvcm9vdC9jaGVmLXNvbG8KK3B5dGhvbiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvY29uc3VtZXJzLnB5ICYKKworIyBhZGQgdGhlIHVzZXIKK3B5dGhvbiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWJlL2ZpbGVzL2RlZmF1bHQvdXNlci5weSAmCisKKyMgY2hlY2sgaWYgQmFja0VuZCBpcyB1cAorcHl0aG9uIC9yb290L2NoZWYtc29sby9jb29rYm9va3Mvc2RjLW5vcm1hdGl2ZXMvZmlsZXMvZGVmYXVsdC9jaGVja19CYWNrZW5kX0hlYWx0aC5weQorCisjIGV4ZWN1dGluZyB0aGUgbm9ybWF0aXZlcworY2QgL3Jvb3QvY2hlZi1zb2xvCitjaGVja19ub3JtYXRpdmU9Ii90bXAvY2hlY2tfbm9ybWF0aXZlLm91dCIKK2N1cmwgLXMgLVggR0VUIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCIgLUggIlVTRVJfSUQ6IGpoMDAwMyIgLUggIlgtRUNPTVAtUmVxdWVzdElEOiBjYmU3NDRhMC0wMzdiLTQ1OGYtYWFiNS1kZjZlNTQzYzQwOTAiIC1IICJDYWNoZS1Db250cm9sOiBuby1jYWNoZSIgLUggIlBvc3RtYW4tVG9rZW46IGFmMDhjYTFjLTMwMmYtMTQzMS00MDRmLWVkODQyNDZlMDdjOSIgImh0dHA6Ly8ke0hPU1RfSVB9OjgwODAvc2RjMi9yZXN0L3YxL3NjcmVlbiIgPiAke2NoZWNrX25vcm1hdGl2ZX0KKworZWNobyAibm9ybWFsWydIT1NUX0lQJ10gPSBcIiR7SE9TVF9JUH1cIiIgPiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL3NkYy1ub3JtYXRpdmVzL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYgorcmVzb3VyY2VzX2xlbj1gY2F0ICR7Y2hlY2tfbm9ybWF0aXZlfXwganEgJy5bInJlc291cmNlcyJdfGxlbmd0aCdgCitpZiBbICRyZXNvdXJjZXNfbGVuIC1lcSAwIF0gOyB0aGVuCisgICBjaGVmLXNvbG8gLWMgbm9ybWF0aXZlcy5yYgorZWxzZQorICAgc2VkIC1pICJzL2ltcG9ydC91cGdyYWRlL2ciIG5vcm1hdGl2ZXMuanNvbgorICAgY2hlZi1zb2xvIC1jIG5vcm1hdGl2ZXMucmIKK2ZpCisKK3doaWxlIHRydWU7IGRvIHNsZWVwIDI7IGRvbmUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvRG9ja2VyZmlsZSBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJjNTVkCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjIgQEAKK0ZST00gY2Fzc2FuZHJhOjIuMS4xNgorCitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCitSVU4gYXB0LWdldCAteSB1cGRhdGUgJiYgYXB0LWdldCAteSBpbnN0YWxsIC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGFwdC11dGlscworUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCBjdXJsCitSVU4gYXB0LWdldCAteSBpbnN0YWxsIHZpbQorUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCBkZWZhdWx0LWpyZSAmJiBhcHQtZ2V0IC15IGluc3RhbGwgb3Blbmpkay04LWpkaworUlVOIHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1zZXQgamF2YSAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQvanJlL2Jpbi9qYXZhCitFTlYgREVCSUFOX0ZST05URU5EIHRlbGV0eXBlCisKK0NPUFkgY2hlZi1zb2xvIC9yb290L2NoZWYtc29sby8KK0NPUFkgY2hlZi1yZXBvL2Nvb2tib29rcyAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzLworCisjIGluc3RhbGwgY2hlZi1zb2xvCitSVU4gY3VybCAtTCBodHRwczovL3d3dy5vcHNjb2RlLmNvbS9jaGVmL2luc3RhbGwuc2ggfCBiYXNoCisKK0NPUFkgc3RhcnR1cC5zaCAvcm9vdC8KKworUlVOIGNobW9kIDc3MCAvcm9vdC9zdGFydHVwLnNoCisKK0VOVFJZUE9JTlQgWyAiL3Jvb3Qvc3RhcnR1cC5zaCIgXQorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvcmVjaXBlcy8wMS1jb25maWd1cmVDYXNzYW5kcmEucmIgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvcmVjaXBlcy8wMS1jb25maWd1cmVDYXNzYW5kcmEucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxM2FhOAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1yZXBvL2Nvb2tib29rcy9jYXNzYW5kcmEtYWN0aW9ucy9yZWNpcGVzLzAxLWNvbmZpZ3VyZUNhc3NhbmRyYS5yYgpAQCAtMCwwICsxLDQ5IEBACitjbHVzdGVyX25hbWUgPSAnJworY2x1c3Rlcl9uYW1lID0gbm9kZVsnY2Fzc2FuZHJhJ11bOmNsdXN0ZXJfbmFtZV0rbm9kZS5jaGVmX2Vudmlyb25tZW50CisKK2Nhc19pcHM9JycKK2Nhc19pcHM9bm9kZVsnTm9kZXMnXVs6Q1NdCisKK2ludGVyZmFjZSA9IG5vZGVbJ2ludGVyZmFjZXMnXVsnYXBwbGljYXRpb24nXQorYXBwbGljYXRpb25faG9zdCA9ICcnCitub2RlWyduZXR3b3JrJ11bJ2ludGVyZmFjZXMnXVtpbnRlcmZhY2VdWzphZGRyZXNzZXNdLmVhY2ggZG8gfCBhZGRyICwgZGV0YWlscyB8CisJaWYgZGV0YWlsc1snZmFtaWx5J10gPT0gKCdpbmV0JykKKwkJYXBwbGljYXRpb25faG9zdCA9IGFkZHIKKwllbmQKK2VuZAorCisKK3RlbXBsYXRlICJjYXNzYW5kcmEteWFtbC1jb25maWciIGRvCisgICAgcGF0aCAiL2V0Yy9jYXNzYW5kcmEvY2Fzc2FuZHJhLnlhbWwiCisgICAgc291cmNlICJjYXNzYW5kcmEueWFtbC5lcmIiCisgICAgb3duZXIgImNhc3NhbmRyYSIKKyAgICBncm91cCAiY2Fzc2FuZHJhIgorICAgIG1vZGUgIjA3NTUiCisgICAgdmFyaWFibGVzICh7CisgICAgICAgIDpjYXNzYW5kcmFfY2x1c3RlciA9PiBjbHVzdGVyX25hbWUsCisgICAgICAgIDpjYXNzYW5kcmFfZGF0YV9kaXIgPT4gbm9kZVsnY2Fzc2FuZHJhJ11bOmRhdGFfZGlyXSwKKyAgICAgICAgOmNhc3NhbmRyYV9jb21taXRsb2dfZGlyID0+IG5vZGVbJ2Nhc3NhbmRyYSddWzpjb21taXRsb2dfZGlyXSwKKyAgICAgICAgOmNhc3NhbmRyYV9jYWNoZV9kaXIgPT4gbm9kZVsnY2Fzc2FuZHJhJ11bOmNhY2hlX2Rpcl0sCisgICAgICAgIDpzZWVkc19hZGRyZXNzID0+IGNhc19pcHMsCisgICAgICAgIDpsaXN0ZW5fYWRkcmVzcyA9PiBhcHBsaWNhdGlvbl9ob3N0LAorICAgICAgICA6YnJvYWRjYXN0X2FkZHJlc3MgPT4gYXBwbGljYXRpb25faG9zdCwKKwkJOmJyb2FkY2FzdF9ycGNfYWRkcmVzcyA9PiBhcHBsaWNhdGlvbl9ob3N0LAorICAgICAgICA6cnBjX2FkZHJlc3MgPT4gIjAuMC4wLjAiLAorICAgICAgICA6bnVtX3Rva2VucyAgPT4gbm9kZVsnY2Fzc2FuZHJhJ11bOm51bV90b2tlbnNdLAorICAgICAgICA6aW50ZXJub2RlX2VuY3J5cHRpb24gPT4gIm5vbmUiLAorICAgICAgICA6Y2Fzc2FuZHJhX3RydXN0c3RvcmVfZGlyID0+ICIvZXRjL2Nhc3NhbmRyYS9jc190cnVzdCIKKyAgICAgfSkKK2VuZAorCityYWNrTnVtPTEKK3RlbXBsYXRlICJjYXNzYW5kcmEtcmFja2RjLnByb3BlcnRpZXMiIGRvCisgICAgcGF0aCAiL2V0Yy9jYXNzYW5kcmEvY2Fzc2FuZHJhLXJhY2tkYy5wcm9wZXJ0aWVzIgorICAgIHNvdXJjZSAiY2Fzc2FuZHJhLXJhY2tkYy5wcm9wZXJ0aWVzLmVyYiIKKyAgICBvd25lciAiY2Fzc2FuZHJhIgorICAgIGdyb3VwICJjYXNzYW5kcmEiCisgICAgbW9kZSAiMDc1NSIKKyAgICB2YXJpYWJsZXMgKHsKKyAgICAgICAgOmRjID0+ICJEQy0iK25vZGUuY2hlZl9lbnZpcm9ubWVudCwKKyAgICAgICAgOnJhY2sgPT4gIlJhY2siKyIje3JhY2tOdW19LSIrbm9kZS5jaGVmX2Vudmlyb25tZW50CisgICAgfSkKK2VuZApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3JlY2lwZXMvMDItY3JlYXRlQ3NVc2VyLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3JlY2lwZXMvMDItY3JlYXRlQ3NVc2VyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2JkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvcmVjaXBlcy8wMi1jcmVhdGVDc1VzZXIucmIKQEAgLTAsMCArMSw4IEBACit0ZW1wbGF0ZSAiL3RtcC9jcmVhdGVfY2Fzc2FuZHJhX3VzZXIuc2giIGRvCisgIHNvdXJjZSAiY3JlYXRlX2Nhc3NhbmRyYV91c2VyLnNoLmVyYiIKKyAgbW9kZSAwNzU1CisgIHZhcmlhYmxlcyh7CisgICAgIDpjYXNzYW5kcmFfaXAgPT4gIkhPU1RJUCIgICAgCisgIH0pCitlbmQKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3JlY2lwZXMvMDMtY3JlYXRlRG94S2V5c3BhY2UucmIgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvcmVjaXBlcy8wMy1jcmVhdGVEb3hLZXlzcGFjZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE4MWViCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3JlY2lwZXMvMDMtY3JlYXRlRG94S2V5c3BhY2UucmIKQEAgLTAsMCArMSw4IEBACit0ZW1wbGF0ZSAiL3RtcC9jcmVhdGVfZG94X2tleXNwYWNlLnNoIiBkbworICBzb3VyY2UgImNyZWF0ZV9kb3hfa2V5c3BhY2Uuc2guZXJiIgorICBtb2RlIDA3NTUKKyAgdmFyaWFibGVzKHsKKyAgICAgOmNhc3NhbmRyYV9pcCA9PiAiSE9TVElQIiAgICAKKyAgfSkKK2VuZAorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvcmVjaXBlcy8wNC1zY2hlbWFDcmVhdGlvbi5yYiBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1yZXBvL2Nvb2tib29rcy9jYXNzYW5kcmEtYWN0aW9ucy9yZWNpcGVzLzA0LXNjaGVtYUNyZWF0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDBjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvcmVjaXBlcy8wNC1zY2hlbWFDcmVhdGlvbi5yYgpAQCAtMCwwICsxLDM1IEBACitjb29rYm9va19maWxlICIvdG1wL3NkY3Rvb2wudGFyIiBkbworICBzb3VyY2UgInNkY3Rvb2wudGFyIgorICBtb2RlIDA3NTUKK2VuZAorCisjIyBleHRyYWN0IHNkY3Rvb2wudGFyCitiYXNoICJpbnN0YWxsIHRhciIgZG8KKyAgY3dkICIvdG1wIgorICBjb2RlIDw8LUVPSAorICAgICAvYmluL3RhciB4dmYgL3RtcC9zZGN0b29sLnRhciAtQyAvdG1wCisgIEVPSAorZW5kCisKKwordGVtcGxhdGUgIi90bXAvc2RjdG9vbC9jb25maWcvY29uZmlndXJhdGlvbi55YW1sIiBkbworICBzb3VyY2UgImNvbmZpZ3VyYXRpb24ueWFtbC5lcmIiCisgIG1vZGUgMDc1NQorICB2YXJpYWJsZXMoeworICAgICAgOmhvc3RfaXAgICAgICA9PiBub2RlWydIT1NUX0lQJ10sCisgICAgICA6Y2F0YWxvZ19wb3J0ID0+IG5vZGVbJ0JFJ11bOmh0dHBfcG9ydF0sCisgICAgICA6c3NsX3BvcnQgICAgID0+IG5vZGVbJ0JFJ11bOmh0dHBzX3BvcnRdLAorICAgICAgOmNhc3NhbmRyYV9pcCA9PiBub2RlWydOb2RlcyddWydDUyddLAorICAgICAgOnJlcF9mYWN0b3IgICA9PiAxLAorICAgICAgOmRjMSAgICAgICAgICA9PiAiREMtIitub2RlLmNoZWZfZW52aXJvbm1lbnQKKyAgfSkKK2VuZAorCit0ZW1wbGF0ZSAiL3RtcC9zZGN0b29sL2NvbmZpZy9lbGFzdGljc2VhcmNoLnltbCIgZG8KKyAgc291cmNlICJlbGFzdGljc2VhcmNoLnltbC5lcmIiCisgIG1vZGUgMDc1NQorICB2YXJpYWJsZXMoeworICAgICA6ZWxhc3RpY19pcCA9PiAiSE9TVElQIiAgICAKKyAgfSkKK2VuZAorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY2Fzc2FuZHJhLXJhY2tkYy5wcm9wZXJ0aWVzLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1yZXBvL2Nvb2tib29rcy9jYXNzYW5kcmEtYWN0aW9ucy90ZW1wbGF0ZXMvZGVmYXVsdC9jYXNzYW5kcmEtcmFja2RjLnByb3BlcnRpZXMuZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGRjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY2Fzc2FuZHJhLXJhY2tkYy5wcm9wZXJ0aWVzLmVyYgpAQCAtMCwwICsxLDI3IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoZXNlIHByb3BlcnRpZXMgYXJlIHVzZWQgd2l0aCBHb3NzaXBpbmdQcm9wZXJ0eUZpbGVTbml0Y2ggYW5kIHdpbGwKKyMgaW5kaWNhdGUgdGhlIHJhY2sgYW5kIGRjIGZvciB0aGlzIG5vZGUKK2RjPTwlPSBAZGMgJT4KK3JhY2s9PCU9IEByYWNrICU+CisKKyMgQWRkIGEgc3VmZml4IHRvIGEgZGF0YWNlbnRlciBuYW1lLiBVc2VkIGJ5IHRoZSBFYzJTbml0Y2ggYW5kIEVjMk11bHRpUmVnaW9uU25pdGNoCisjIHRvIGFwcGVuZCBhIHN0cmluZyB0byB0aGUgRUMyIHJlZ2lvbiBuYW1lLgorI2RjX3N1ZmZpeD0KKworIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIG1ha2UgdGhpcyBzbml0Y2ggcHJlZmVyIHRoZSBpbnRlcm5hbCBpcCB3aGVuIHBvc3NpYmxlLCBhcyB0aGUgRWMyTXVsdGlSZWdpb25Tbml0Y2ggZG9lcy4KKyMgcHJlZmVyX2xvY2FsPXRydWUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1yZXBvL2Nvb2tib29rcy9jYXNzYW5kcmEtYWN0aW9ucy90ZW1wbGF0ZXMvZGVmYXVsdC9jYXNzYW5kcmEueWFtbC5lcmIgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY2Fzc2FuZHJhLnlhbWwuZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjYwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY2Fzc2FuZHJhLnlhbWwuZXJiCkBAIC0wLDAgKzEsODI0IEBACisjIENhc3NhbmRyYSBzdG9yYWdlIGNvbmZpZyBZQU1MCisKKyMgTk9URToKKyMgICBTZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9jYXNzYW5kcmEvU3RvcmFnZUNvbmZpZ3VyYXRpb24gZm9yCisjICAgZnVsbCBleHBsYW5hdGlvbnMgb2YgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzCisjIC9OT1RFCisKKyMgVGhlIG5hbWUgb2YgdGhlIGNsdXN0ZXIuIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gcHJldmVudCBtYWNoaW5lcyBpbgorIyBvbmUgbG9naWNhbCBjbHVzdGVyIGZyb20gam9pbmluZyBhbm90aGVyLgorY2x1c3Rlcl9uYW1lOiAnPCU9IEBjYXNzYW5kcmFfY2x1c3RlciAlPicKKworIyBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiB0b2tlbnMgcmFuZG9tbHkgYXNzaWduZWQgdG8gdGhpcyBub2RlIG9uIHRoZSByaW5nCisjIFRoZSBtb3JlIHRva2VucywgcmVsYXRpdmUgdG8gb3RoZXIgbm9kZXMsIHRoZSBsYXJnZXIgdGhlIHByb3BvcnRpb24gb2YgZGF0YQorIyB0aGF0IHRoaXMgbm9kZSB3aWxsIHN0b3JlLiBZb3UgcHJvYmFibHkgd2FudCBhbGwgbm9kZXMgdG8gaGF2ZSB0aGUgc2FtZSBudW1iZXIKKyMgb2YgdG9rZW5zIGFzc3VtaW5nIHRoZXkgaGF2ZSBlcXVhbCBoYXJkd2FyZSBjYXBhYmlsaXR5LgorIworIyBJZiB5b3UgbGVhdmUgdGhpcyB1bnNwZWNpZmllZCwgQ2Fzc2FuZHJhIHdpbGwgdXNlIHRoZSBkZWZhdWx0IG9mIDEgdG9rZW4gZm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5LAorIyBhbmQgd2lsbCB1c2UgdGhlIGluaXRpYWxfdG9rZW4gYXMgZGVzY3JpYmVkIGJlbG93LgorIworIyBTcGVjaWZ5aW5nIGluaXRpYWxfdG9rZW4gd2lsbCBvdmVycmlkZSB0aGlzIHNldHRpbmcgb24gdGhlIG5vZGUncyBpbml0aWFsIHN0YXJ0LAorIyBvbiBzdWJzZXF1ZW50IHN0YXJ0cywgdGhpcyBzZXR0aW5nIHdpbGwgYXBwbHkgZXZlbiBpZiBpbml0aWFsIHRva2VuIGlzIHNldC4KKyMKKyMgSWYgeW91IGFscmVhZHkgaGF2ZSBhIGNsdXN0ZXIgd2l0aCAxIHRva2VuIHBlciBub2RlLCBhbmQgd2lzaCB0byBtaWdyYXRlIHRvCisjIG11bHRpcGxlIHRva2VucyBwZXIgbm9kZSwgc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL09wZXJhdGlvbnMKK251bV90b2tlbnM6IDwlPSBAbnVtX3Rva2VucyAlPgorCisjIGluaXRpYWxfdG9rZW4gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRva2VucyBtYW51YWxseS4gIFdoaWxlIHlvdSBjYW4gdXNlICMgaXQgd2l0aAorIyB2bm9kZXMgKG51bV90b2tlbnMgPiAxLCBhYm92ZSkgLS0gaW4gd2hpY2ggY2FzZSB5b3Ugc2hvdWxkIHByb3ZpZGUgYQorIyBjb21tYS1zZXBhcmF0ZWQgbGlzdCAtLSBpdCdzIHByaW1hcmlseSB1c2VkIHdoZW4gYWRkaW5nIG5vZGVzICMgdG8gbGVnYWN5IGNsdXN0ZXJzCisjIHRoYXQgZG8gbm90IGhhdmUgdm5vZGVzIGVuYWJsZWQuCisjIGluaXRpYWxfdG9rZW46CisKKyMgTWF5IGVpdGhlciBiZSAidHJ1ZSIgb3IgImZhbHNlIiB0byBlbmFibGUgZ2xvYmFsbHksIG9yIGNvbnRhaW4gYSBsaXN0CisjIG9mIGRhdGEgY2VudGVycyB0byBlbmFibGUgcGVyLWRhdGFjZW50ZXIuCisjIGhpbnRlZF9oYW5kb2ZmX2VuYWJsZWQ6IERDMSxEQzIKKyMgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0hpbnRlZEhhbmRvZmYKK2hpbnRlZF9oYW5kb2ZmX2VuYWJsZWQ6IDwlPSBub2RlWydjYXNzYW5kcmEnXVsnaGludGVkX2hhbmRvZmZfZW5hYmxlZCddICU+CisKKyMgdGhpcyBkZWZpbmVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGEgZGVhZCBob3N0IHdpbGwgaGF2ZSBoaW50cworIyBnZW5lcmF0ZWQuICBBZnRlciBpdCBoYXMgYmVlbiBkZWFkIHRoaXMgbG9uZywgbmV3IGhpbnRzIGZvciBpdCB3aWxsIG5vdCBiZQorIyBjcmVhdGVkIHVudGlsIGl0IGhhcyBiZWVuIHNlZW4gYWxpdmUgYW5kIGdvbmUgZG93biBhZ2Fpbi4KK21heF9oaW50X3dpbmRvd19pbl9tczogMTA4MDAwMDAgIyAzIGhvdXJzCisKKyMgTWF4aW11bSB0aHJvdHRsZSBpbiBLQnMgcGVyIHNlY29uZCwgcGVyIGRlbGl2ZXJ5IHRocmVhZC4gIFRoaXMgd2lsbCBiZQorIyByZWR1Y2VkIHByb3BvcnRpb25hbGx5IHRvIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGNsdXN0ZXIuICAoSWYgdGhlcmUKKyMgYXJlIHR3byBub2RlcyBpbiB0aGUgY2x1c3RlciwgZWFjaCBkZWxpdmVyeSB0aHJlYWQgd2lsbCB1c2UgdGhlIG1heGltdW0KKyMgcmF0ZTsgaWYgdGhlcmUgYXJlIHRocmVlLCBlYWNoIHdpbGwgdGhyb3R0bGUgdG8gaGFsZiBvZiB0aGUgbWF4aW11bSwKKyMgc2luY2Ugd2UgZXhwZWN0IHR3byBub2RlcyB0byBiZSBkZWxpdmVyaW5nIGhpbnRzIHNpbXVsdGFuZW91c2x5LikKK2hpbnRlZF9oYW5kb2ZmX3Rocm90dGxlX2luX2tiOiAxMDI0CisKKyMgTnVtYmVyIG9mIHRocmVhZHMgd2l0aCB3aGljaCB0byBkZWxpdmVyIGhpbnRzOworIyBDb25zaWRlciBpbmNyZWFzaW5nIHRoaXMgbnVtYmVyIHdoZW4geW91IGhhdmUgbXVsdGktZGMgZGVwbG95bWVudHMsIHNpbmNlCisjIGNyb3NzLWRjIGhhbmRvZmYgdGVuZHMgdG8gYmUgc2xvd2VyCittYXhfaGludHNfZGVsaXZlcnlfdGhyZWFkczogMgorCisjIE1heGltdW0gdGhyb3R0bGUgaW4gS0JzIHBlciBzZWNvbmQsIHRvdGFsLiBUaGlzIHdpbGwgYmUKKyMgcmVkdWNlZCBwcm9wb3J0aW9uYWxseSB0byB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorYmF0Y2hsb2dfcmVwbGF5X3Rocm90dGxlX2luX2tiOiAxMDI0CisKKyMgQXV0aGVudGljYXRpb24gYmFja2VuZCwgaW1wbGVtZW50aW5nIElBdXRoZW50aWNhdG9yOyB1c2VkIHRvIGlkZW50aWZ5IHVzZXJzCisjIE91dCBvZiB0aGUgYm94LCBDYXNzYW5kcmEgcHJvdmlkZXMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC57QWxsb3dBbGxBdXRoZW50aWNhdG9yLAorIyBQYXNzd29yZEF1dGhlbnRpY2F0b3J9LgorIworIyAtIEFsbG93QWxsQXV0aGVudGljYXRvciBwZXJmb3JtcyBubyBjaGVja3MgLSBzZXQgaXQgdG8gZGlzYWJsZSBhdXRoZW50aWNhdGlvbi4KKyMgLSBQYXNzd29yZEF1dGhlbnRpY2F0b3IgcmVsaWVzIG9uIHVzZXJuYW1lL3Bhc3N3b3JkIHBhaXJzIHRvIGF1dGhlbnRpY2F0ZQorIyAgIHVzZXJzLiBJdCBrZWVwcyB1c2VybmFtZXMgYW5kIGhhc2hlZCBwYXNzd29yZHMgaW4gc3lzdGVtX2F1dGguY3JlZGVudGlhbHMgdGFibGUuCisjICAgUGxlYXNlIGluY3JlYXNlIHN5c3RlbV9hdXRoIGtleXNwYWNlIHJlcGxpY2F0aW9uIGZhY3RvciBpZiB5b3UgdXNlIHRoaXMgYXV0aGVudGljYXRvci4KK2F1dGhlbnRpY2F0b3I6IFBhc3N3b3JkQXV0aGVudGljYXRvcgorCisjIEF1dGhvcml6YXRpb24gYmFja2VuZCwgaW1wbGVtZW50aW5nIElBdXRob3JpemVyOyB1c2VkIHRvIGxpbWl0IGFjY2Vzcy9wcm92aWRlIHBlcm1pc3Npb25zCisjIE91dCBvZiB0aGUgYm94LCBDYXNzYW5kcmEgcHJvdmlkZXMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC57QWxsb3dBbGxBdXRob3JpemVyLAorIyBDYXNzYW5kcmFBdXRob3JpemVyfS4KKyMKKyMgLSBBbGxvd0FsbEF1dGhvcml6ZXIgYWxsb3dzIGFueSBhY3Rpb24gdG8gYW55IHVzZXIgLSBzZXQgaXQgdG8gZGlzYWJsZSBhdXRob3JpemF0aW9uLgorIyAtIENhc3NhbmRyYUF1dGhvcml6ZXIgc3RvcmVzIHBlcm1pc3Npb25zIGluIHN5c3RlbV9hdXRoLnBlcm1pc3Npb25zIHRhYmxlLiBQbGVhc2UKKyMgICBpbmNyZWFzZSBzeXN0ZW1fYXV0aCBrZXlzcGFjZSByZXBsaWNhdGlvbiBmYWN0b3IgaWYgeW91IHVzZSB0aGlzIGF1dGhvcml6ZXIuCithdXRob3JpemVyOiBBbGxvd0FsbEF1dGhvcml6ZXIKKworIyBWYWxpZGl0eSBwZXJpb2QgZm9yIHBlcm1pc3Npb25zIGNhY2hlIChmZXRjaGluZyBwZXJtaXNzaW9ucyBjYW4gYmUgYW4KKyMgZXhwZW5zaXZlIG9wZXJhdGlvbiBkZXBlbmRpbmcgb24gdGhlIGF1dGhvcml6ZXIsIENhc3NhbmRyYUF1dGhvcml6ZXIgaXMKKyMgb25lIGV4YW1wbGUpLiBEZWZhdWx0cyB0byAyMDAwLCBzZXQgdG8gMCB0byBkaXNhYmxlLgorIyBXaWxsIGJlIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgZm9yIEFsbG93QWxsQXV0aG9yaXplci4KK3Blcm1pc3Npb25zX3ZhbGlkaXR5X2luX21zOiAyMDAwCisKKyMgUmVmcmVzaCBpbnRlcnZhbCBmb3IgcGVybWlzc2lvbnMgY2FjaGUgKGlmIGVuYWJsZWQpLgorIyBBZnRlciB0aGlzIGludGVydmFsLCBjYWNoZSBlbnRyaWVzIGJlY29tZSBlbGlnaWJsZSBmb3IgcmVmcmVzaC4gVXBvbiBuZXh0CisjIGFjY2VzcywgYW4gYXN5bmMgcmVsb2FkIGlzIHNjaGVkdWxlZCBhbmQgdGhlIG9sZCB2YWx1ZSByZXR1cm5lZCB1bnRpbCBpdAorIyBjb21wbGV0ZXMuIElmIHBlcm1pc3Npb25zX3ZhbGlkaXR5X2luX21zIGlzIG5vbi16ZXJvLCB0aGVuIHRoaXMgbXVzdCBiZQorIyBhbHNvLgorIyBEZWZhdWx0cyB0byB0aGUgc2FtZSB2YWx1ZSBhcyBwZXJtaXNzaW9uc192YWxpZGl0eV9pbl9tcy4KKyMgcGVybWlzc2lvbnNfdXBkYXRlX2ludGVydmFsX2luX21zOiAxMDAwCisKKyMgVGhlIHBhcnRpdGlvbmVyIGlzIHJlc3BvbnNpYmxlIGZvciBkaXN0cmlidXRpbmcgZ3JvdXBzIG9mIHJvd3MgKGJ5CisjIHBhcnRpdGlvbiBrZXkpIGFjcm9zcyBub2RlcyBpbiB0aGUgY2x1c3Rlci4gIFlvdSBzaG91bGQgbGVhdmUgdGhpcworIyBhbG9uZSBmb3IgbmV3IGNsdXN0ZXJzLiAgVGhlIHBhcnRpdGlvbmVyIGNhbiBOT1QgYmUgY2hhbmdlZCB3aXRob3V0CisjIHJlbG9hZGluZyBhbGwgZGF0YSwgc28gd2hlbiB1cGdyYWRpbmcgeW91IHNob3VsZCBzZXQgdGhpcyB0byB0aGUKKyMgc2FtZSBwYXJ0aXRpb25lciB5b3Ugd2VyZSBhbHJlYWR5IHVzaW5nLgorIworIyBCZXNpZGVzIE11cm11cjNQYXJ0aXRpb25lciwgcGFydGl0aW9uZXJzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMKKyMgY29tcGF0aWJpbGl0eSBpbmNsdWRlIFJhbmRvbVBhcnRpdGlvbmVyLCBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLCBhbmQKKyMgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuCisjCitwYXJ0aXRpb25lcjogb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcgorCisjIERpcmVjdG9yaWVzIHdoZXJlIENhc3NhbmRyYSBzaG91bGQgc3RvcmUgZGF0YSBvbiBkaXNrLiAgQ2Fzc2FuZHJhCisjIHdpbGwgc3ByZWFkIGRhdGEgZXZlbmx5IGFjcm9zcyB0aGVtLCBzdWJqZWN0IHRvIHRoZSBncmFudWxhcml0eSBvZgorIyB0aGUgY29uZmlndXJlZCBjb21wYWN0aW9uIHN0cmF0ZWd5LgorZGF0YV9maWxlX2RpcmVjdG9yaWVzOgorICAgIC0gPCU9IEBjYXNzYW5kcmFfZGF0YV9kaXIgJT4KKworCisjIGNvbW1pdCBsb2cuICB3aGVuIHJ1bm5pbmcgb24gbWFnbmV0aWMgSERELCB0aGlzIHNob3VsZCBiZSBhCisjIHNlcGFyYXRlIHNwaW5kbGUgdGhhbiB0aGUgZGF0YSBkaXJlY3Rvcmllcy4KKyMgSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzICRDQVNTQU5EUkFfSE9NRS9kYXRhL2NvbW1pdGxvZy4KK2NvbW1pdGxvZ19kaXJlY3Rvcnk6IDwlPSBAY2Fzc2FuZHJhX2NvbW1pdGxvZ19kaXIgJT4KKworIyBwb2xpY3kgZm9yIGRhdGEgZGlzayBmYWlsdXJlczoKKyMgc3RvcF9wYXJhbm9pZDogc2h1dCBkb3duIGdvc3NpcCBhbmQgVGhyaWZ0IGV2ZW4gZm9yIHNpbmdsZS1zc3RhYmxlIGVycm9ycy4KKyMgc3RvcDogc2h1dCBkb3duIGdvc3NpcCBhbmQgVGhyaWZ0LCBsZWF2aW5nIHRoZSBub2RlIGVmZmVjdGl2ZWx5IGRlYWQsIGJ1dAorIyAgICAgICBjYW4gc3RpbGwgYmUgaW5zcGVjdGVkIHZpYSBKTVguCisjIGJlc3RfZWZmb3J0OiBzdG9wIHVzaW5nIHRoZSBmYWlsZWQgZGlzayBhbmQgcmVzcG9uZCB0byByZXF1ZXN0cyBiYXNlZCBvbgorIyAgICAgICAgICAgICAgcmVtYWluaW5nIGF2YWlsYWJsZSBzc3RhYmxlcy4gIFRoaXMgbWVhbnMgeW91IFdJTEwgc2VlIG9ic29sZXRlCisjICAgICAgICAgICAgICBkYXRhIGF0IENMLk9ORSEKKyMgaWdub3JlOiBpZ25vcmUgZmF0YWwgZXJyb3JzIGFuZCBsZXQgcmVxdWVzdHMgZmFpbCwgYXMgaW4gcHJlLTEuMiBDYXNzYW5kcmEKK2Rpc2tfZmFpbHVyZV9wb2xpY3k6IHN0b3AKKworIyBwb2xpY3kgZm9yIGNvbW1pdCBkaXNrIGZhaWx1cmVzOgorIyBzdG9wOiBzaHV0IGRvd24gZ29zc2lwIGFuZCBUaHJpZnQsIGxlYXZpbmcgdGhlIG5vZGUgZWZmZWN0aXZlbHkgZGVhZCwgYnV0CisjICAgICAgIGNhbiBzdGlsbCBiZSBpbnNwZWN0ZWQgdmlhIEpNWC4KKyMgc3RvcF9jb21taXQ6IHNodXRkb3duIHRoZSBjb21taXQgbG9nLCBsZXR0aW5nIHdyaXRlcyBjb2xsZWN0IGJ1dAorIyAgICAgICAgICAgICAgY29udGludWluZyB0byBzZXJ2aWNlIHJlYWRzLCBhcyBpbiBwcmUtMi4wLjUgQ2Fzc2FuZHJhCisjIGlnbm9yZTogaWdub3JlIGZhdGFsIGVycm9ycyBhbmQgbGV0IHRoZSBiYXRjaGVzIGZhaWwKK2NvbW1pdF9mYWlsdXJlX3BvbGljeTogc3RvcAorCisjIE1heGltdW0gc2l6ZSBvZiB0aGUga2V5IGNhY2hlIGluIG1lbW9yeS4KKyMKKyMgRWFjaCBrZXkgY2FjaGUgaGl0IHNhdmVzIDEgc2VlayBhbmQgZWFjaCByb3cgY2FjaGUgaGl0IHNhdmVzIDIgc2Vla3MgYXQgdGhlCisjIG1pbmltdW0sIHNvbWV0aW1lcyBtb3JlLiBUaGUga2V5IGNhY2hlIGlzIGZhaXJseSB0aW55IGZvciB0aGUgYW1vdW50IG9mCisjIHRpbWUgaXQgc2F2ZXMsIHNvIGl0J3Mgd29ydGh3aGlsZSB0byB1c2UgaXQgYXQgbGFyZ2UgbnVtYmVycy4KKyMgVGhlIHJvdyBjYWNoZSBzYXZlcyBldmVuIG1vcmUgdGltZSwgYnV0IG11c3QgY29udGFpbiB0aGUgZW50aXJlIHJvdywKKyMgc28gaXQgaXMgZXh0cmVtZWx5IHNwYWNlLWludGVuc2l2ZS4gSXQncyBiZXN0IHRvIG9ubHkgdXNlIHRoZQorIyByb3cgY2FjaGUgaWYgeW91IGhhdmUgaG90IHJvd3Mgb3Igc3RhdGljIHJvd3MuCisjCisjIE5PVEU6IGlmIHlvdSByZWR1Y2UgdGhlIHNpemUsIHlvdSBtYXkgbm90IGdldCB5b3UgaG90dGVzdCBrZXlzIGxvYWRlZCBvbiBzdGFydHVwLgorIworIyBEZWZhdWx0IHZhbHVlIGlzIGVtcHR5IHRvIG1ha2UgaXQgImF1dG8iIChtaW4oNSUgb2YgSGVhcCAoaW4gTUIpLCAxMDBNQikpLiBTZXQgdG8gMCB0byBkaXNhYmxlIGtleSBjYWNoZS4KK2tleV9jYWNoZV9zaXplX2luX21iOgorCisjIER1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggQ2Fzc2FuZHJhIHNob3VsZAorIyBzYXZlIHRoZSBrZXkgY2FjaGUuIENhY2hlcyBhcmUgc2F2ZWQgdG8gc2F2ZWRfY2FjaGVzX2RpcmVjdG9yeSBhcworIyBzcGVjaWZpZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuCisjCisjIFNhdmVkIGNhY2hlcyBncmVhdGx5IGltcHJvdmUgY29sZC1zdGFydCBzcGVlZHMsIGFuZCBpcyByZWxhdGl2ZWx5IGNoZWFwIGluCisjIHRlcm1zIG9mIEkvTyBmb3IgdGhlIGtleSBjYWNoZS4gUm93IGNhY2hlIHNhdmluZyBpcyBtdWNoIG1vcmUgZXhwZW5zaXZlIGFuZAorIyBoYXMgbGltaXRlZCB1c2UuCisjCisjIERlZmF1bHQgaXMgMTQ0MDAgb3IgNCBob3Vycy4KK2tleV9jYWNoZV9zYXZlX3BlcmlvZDogMTQ0MDAKKworIyBOdW1iZXIgb2Yga2V5cyBmcm9tIHRoZSBrZXkgY2FjaGUgdG8gc2F2ZQorIyBEaXNhYmxlZCBieSBkZWZhdWx0LCBtZWFuaW5nIGFsbCBrZXlzIGFyZSBnb2luZyB0byBiZSBzYXZlZAorIyBrZXlfY2FjaGVfa2V5c190b19zYXZlOiAxMDAKKworIyBNYXhpbXVtIHNpemUgb2YgdGhlIHJvdyBjYWNoZSBpbiBtZW1vcnkuCisjIE5PVEU6IGlmIHlvdSByZWR1Y2UgdGhlIHNpemUsIHlvdSBtYXkgbm90IGdldCB5b3UgaG90dGVzdCBrZXlzIGxvYWRlZCBvbiBzdGFydHVwLgorIworIyBEZWZhdWx0IHZhbHVlIGlzIDAsIHRvIGRpc2FibGUgcm93IGNhY2hpbmcuCityb3dfY2FjaGVfc2l6ZV9pbl9tYjogMAorCisjIER1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggQ2Fzc2FuZHJhIHNob3VsZAorIyBzYXZlIHRoZSByb3cgY2FjaGUuIENhY2hlcyBhcmUgc2F2ZWQgdG8gc2F2ZWRfY2FjaGVzX2RpcmVjdG9yeSBhcyBzcGVjaWZpZWQKKyMgaW4gdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuCisjCisjIFNhdmVkIGNhY2hlcyBncmVhdGx5IGltcHJvdmUgY29sZC1zdGFydCBzcGVlZHMsIGFuZCBpcyByZWxhdGl2ZWx5IGNoZWFwIGluCisjIHRlcm1zIG9mIEkvTyBmb3IgdGhlIGtleSBjYWNoZS4gUm93IGNhY2hlIHNhdmluZyBpcyBtdWNoIG1vcmUgZXhwZW5zaXZlIGFuZAorIyBoYXMgbGltaXRlZCB1c2UuCisjCisjIERlZmF1bHQgaXMgMCB0byBkaXNhYmxlIHNhdmluZyB0aGUgcm93IGNhY2hlLgorcm93X2NhY2hlX3NhdmVfcGVyaW9kOiAwCisKKyMgTnVtYmVyIG9mIGtleXMgZnJvbSB0aGUgcm93IGNhY2hlIHRvIHNhdmUKKyMgRGlzYWJsZWQgYnkgZGVmYXVsdCwgbWVhbmluZyBhbGwga2V5cyBhcmUgZ29pbmcgdG8gYmUgc2F2ZWQKKyMgcm93X2NhY2hlX2tleXNfdG9fc2F2ZTogMTAwCisKKyMgTWF4aW11bSBzaXplIG9mIHRoZSBjb3VudGVyIGNhY2hlIGluIG1lbW9yeS4KKyMKKyMgQ291bnRlciBjYWNoZSBoZWxwcyB0byByZWR1Y2UgY291bnRlciBsb2NrcycgY29udGVudGlvbiBmb3IgaG90IGNvdW50ZXIgY2VsbHMuCisjIEluIGNhc2Ugb2YgUkYgPSAxIGEgY291bnRlciBjYWNoZSBoaXQgd2lsbCBjYXVzZSBDYXNzYW5kcmEgdG8gc2tpcCB0aGUgcmVhZCBiZWZvcmUKKyMgd3JpdGUgZW50aXJlbHkuIFdpdGggUkYgPiAxIGEgY291bnRlciBjYWNoZSBoaXQgd2lsbCBzdGlsbCBoZWxwIHRvIHJlZHVjZSB0aGUgZHVyYXRpb24KKyMgb2YgdGhlIGxvY2sgaG9sZCwgaGVscGluZyB3aXRoIGhvdCBjb3VudGVyIGNlbGwgdXBkYXRlcywgYnV0IHdpbGwgbm90IGFsbG93IHNraXBwaW5nCisjIHRoZSByZWFkIGVudGlyZWx5LiBPbmx5IHRoZSBsb2NhbCAoY2xvY2ssIGNvdW50KSB0dXBsZSBvZiBhIGNvdW50ZXIgY2VsbCBpcyBrZXB0CisjIGluIG1lbW9yeSwgbm90IHRoZSB3aG9sZSBjb3VudGVyLCBzbyBpdCdzIHJlbGF0aXZlbHkgY2hlYXAuCisjCisjIE5PVEU6IGlmIHlvdSByZWR1Y2UgdGhlIHNpemUsIHlvdSBtYXkgbm90IGdldCB5b3UgaG90dGVzdCBrZXlzIGxvYWRlZCBvbiBzdGFydHVwLgorIworIyBEZWZhdWx0IHZhbHVlIGlzIGVtcHR5IHRvIG1ha2UgaXQgImF1dG8iIChtaW4oMi41JSBvZiBIZWFwIChpbiBNQiksIDUwTUIpKS4gU2V0IHRvIDAgdG8gZGlzYWJsZSBjb3VudGVyIGNhY2hlLgorIyBOT1RFOiBpZiB5b3UgcGVyZm9ybSBjb3VudGVyIGRlbGV0ZXMgYW5kIHJlbHkgb24gbG93IGdjZ3MsIHlvdSBzaG91bGQgZGlzYWJsZSB0aGUgY291bnRlciBjYWNoZS4KK2NvdW50ZXJfY2FjaGVfc2l6ZV9pbl9tYjoKKworIyBEdXJhdGlvbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIENhc3NhbmRyYSBzaG91bGQKKyMgc2F2ZSB0aGUgY291bnRlciBjYWNoZSAoa2V5cyBvbmx5KS4gQ2FjaGVzIGFyZSBzYXZlZCB0byBzYXZlZF9jYWNoZXNfZGlyZWN0b3J5IGFzCisjIHNwZWNpZmllZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyMKKyMgRGVmYXVsdCBpcyA3MjAwIG9yIDIgaG91cnMuCitjb3VudGVyX2NhY2hlX3NhdmVfcGVyaW9kOiA3MjAwCisKKyMgTnVtYmVyIG9mIGtleXMgZnJvbSB0aGUgY291bnRlciBjYWNoZSB0byBzYXZlCisjIERpc2FibGVkIGJ5IGRlZmF1bHQsIG1lYW5pbmcgYWxsIGtleXMgYXJlIGdvaW5nIHRvIGJlIHNhdmVkCisjIGNvdW50ZXJfY2FjaGVfa2V5c190b19zYXZlOiAxMDAKKworIyBUaGUgb2ZmLWhlYXAgbWVtb3J5IGFsbG9jYXRvci4gIEFmZmVjdHMgc3RvcmFnZSBlbmdpbmUgbWV0YWRhdGEgYXMKKyMgd2VsbCBhcyBjYWNoZXMuICBFeHBlcmltZW50cyBzaG93IHRoYXQgSkVNQWxsb2Mgc2F2ZXMgc29tZSBtZW1vcnkKKyMgdGhhbiB0aGUgbmF0aXZlIEdDQyBhbGxvY2F0b3IgKGkuZS4sIEpFTWFsbG9jIGlzIG1vcmUKKyMgZnJhZ21lbnRhdGlvbi1yZXNpc3RhbnQpLgorIworIyBTdXBwb3J0ZWQgdmFsdWVzIGFyZTogTmF0aXZlQWxsb2NhdG9yLCBKRU1hbGxvY0FsbG9jYXRvcgorIworIyBJZiB5b3UgaW50ZW5kIHRvIHVzZSBKRU1hbGxvY0FsbG9jYXRvciB5b3UgaGF2ZSB0byBpbnN0YWxsIEpFTWFsbG9jIGFzIGxpYnJhcnkgYW5kCisjIG1vZGlmeSBjYXNzYW5kcmEtZW52LnNoIGFzIGRpcmVjdGVkIGluIHRoZSBmaWxlLgorIworIyBEZWZhdWx0cyB0byBOYXRpdmVBbGxvY2F0b3IKKyMgbWVtb3J5X2FsbG9jYXRvcjogTmF0aXZlQWxsb2NhdG9yCisKKyMgc2F2ZWQgY2FjaGVzCisjIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpcyAkQ0FTU0FORFJBX0hPTUUvZGF0YS9zYXZlZF9jYWNoZXMuCitzYXZlZF9jYWNoZXNfZGlyZWN0b3J5OiAvdmFyL2xpYi9jYXNzYW5kcmEvc2F2ZWRfY2FjaGVzCisKKyMgY29tbWl0bG9nX3N5bmMgbWF5IGJlIGVpdGhlciAicGVyaW9kaWMiIG9yICJiYXRjaC4iCisjIFdoZW4gaW4gYmF0Y2ggbW9kZSwgQ2Fzc2FuZHJhIHdvbid0IGFjayB3cml0ZXMgdW50aWwgdGhlIGNvbW1pdCBsb2cKKyMgaGFzIGJlZW4gZnN5bmNlZCB0byBkaXNrLiAgSXQgd2lsbCB3YWl0CisjIGNvbW1pdGxvZ19zeW5jX2JhdGNoX3dpbmRvd19pbl9tcyBtaWxsaXNlY29uZHMgYmV0d2VlbiBmc3luY3MuCisjIFRoaXMgd2luZG93IHNob3VsZCBiZSBrZXB0IHNob3J0IGJlY2F1c2UgdGhlIHdyaXRlciB0aHJlYWRzIHdpbGwKKyMgYmUgdW5hYmxlIHRvIGRvIGV4dHJhIHdvcmsgd2hpbGUgd2FpdGluZy4gIChZb3UgbWF5IG5lZWQgdG8gaW5jcmVhc2UKKyMgY29uY3VycmVudF93cml0ZXMgZm9yIHRoZSBzYW1lIHJlYXNvbi4pCisjCisjIGNvbW1pdGxvZ19zeW5jOiBiYXRjaAorIyBjb21taXRsb2dfc3luY19iYXRjaF93aW5kb3dfaW5fbXM6IDIKKyMKKyMgdGhlIG90aGVyIG9wdGlvbiBpcyAicGVyaW9kaWMiIHdoZXJlIHdyaXRlcyBtYXkgYmUgYWNrZWQgaW1tZWRpYXRlbHkKKyMgYW5kIHRoZSBDb21taXRMb2cgaXMgc2ltcGx5IHN5bmNlZCBldmVyeSBjb21taXRsb2dfc3luY19wZXJpb2RfaW5fbXMKKyMgbWlsbGlzZWNvbmRzLiAgQnkgZGVmYXVsdCB0aGlzIGFsbG93cyAxMDI0KihDUFUgY29yZXMpIHBlbmRpbmcKKyMgZW50cmllcyBvbiB0aGUgY29tbWl0bG9nIHF1ZXVlLiAgSWYgeW91IGFyZSB3cml0aW5nIHZlcnkgbGFyZ2UgYmxvYnMsCisjIHlvdSBzaG91bGQgcmVkdWNlIHRoYXQ7IDE2KmNvcmVzIHdvcmtzIHJlYXNvbmFibHkgd2VsbCBmb3IgMU1CIGJsb2JzLgorIyBJdCBzaG91bGQgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGNvbmN1cnJlbnRfd3JpdGVzIHNldHRpbmcuCitjb21taXRsb2dfc3luYzogcGVyaW9kaWMKK2NvbW1pdGxvZ19zeW5jX3BlcmlvZF9pbl9tczogMTAwMDAKKworIyBUaGUgc2l6ZSBvZiB0aGUgaW5kaXZpZHVhbCBjb21taXRsb2cgZmlsZSBzZWdtZW50cy4gIEEgY29tbWl0bG9nCisjIHNlZ21lbnQgbWF5IGJlIGFyY2hpdmVkLCBkZWxldGVkLCBvciByZWN5Y2xlZCBvbmNlIGFsbCB0aGUgZGF0YQorIyBpbiBpdCAocG90ZW50aWFsbHkgZnJvbSBlYWNoIGNvbHVtbmZhbWlseSBpbiB0aGUgc3lzdGVtKSBoYXMgYmVlbgorIyBmbHVzaGVkIHRvIHNzdGFibGVzLgorIworIyBUaGUgZGVmYXVsdCBzaXplIGlzIDMyLCB3aGljaCBpcyBhbG1vc3QgYWx3YXlzIGZpbmUsIGJ1dCBpZiB5b3UgYXJlCisjIGFyY2hpdmluZyBjb21taXRsb2cgc2VnbWVudHMgKHNlZSBjb21taXRsb2dfYXJjaGl2aW5nLnByb3BlcnRpZXMpLAorIyB0aGVuIHlvdSBwcm9iYWJseSB3YW50IGEgZmluZXIgZ3JhbnVsYXJpdHkgb2YgYXJjaGl2aW5nOyA4IG9yIDE2IE1CCisjIGlzIHJlYXNvbmFibGUuCitjb21taXRsb2dfc2VnbWVudF9zaXplX2luX21iOiAzMgorCisjIFJldXNlIGNvbW1pdCBsb2cgZmlsZXMgd2hlbiBwb3NzaWJsZS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UsIGFuZCB0aGlzCisjIGZlYXR1cmUgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBDYXNzYW5kcmEuCisjY29tbWl0bG9nX3NlZ21lbnRfcmVjeWNsaW5nOiBmYWxzZQorCisjIGFueSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIFNlZWRQcm92aWRlciBpbnRlcmZhY2UgYW5kIGhhcyBhCisjIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSBNYXA8U3RyaW5nLCBTdHJpbmc+IG9mIHBhcmFtZXRlcnMgd2lsbCBkby4KK3NlZWRfcHJvdmlkZXI6CisgICAgIyBBZGRyZXNzZXMgb2YgaG9zdHMgdGhhdCBhcmUgZGVlbWVkIGNvbnRhY3QgcG9pbnRzLgorICAgICMgQ2Fzc2FuZHJhIG5vZGVzIHVzZSB0aGlzIGxpc3Qgb2YgaG9zdHMgdG8gZmluZCBlYWNoIG90aGVyIGFuZCBsZWFybgorICAgICMgdGhlIHRvcG9sb2d5IG9mIHRoZSByaW5nLiAgWW91IG11c3QgY2hhbmdlIHRoaXMgaWYgeW91IGFyZSBydW5uaW5nCisgICAgIyBtdWx0aXBsZSBub2RlcyEKKyAgICAtIGNsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyCisgICAgICBwYXJhbWV0ZXJzOgorICAgICAgICAgICMgc2VlZHMgaXMgYWN0dWFsbHkgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBhZGRyZXNzZXMuCisgICAgICAgICAgIyBFeDogIjxpcDE+LDxpcDI+LDxpcDM+IgorICAgICAgICAgIC0gc2VlZHM6ICI8JT0gQHNlZWRzX2FkZHJlc3MgJT4iCisKKyMgRm9yIHdvcmtsb2FkcyB3aXRoIG1vcmUgZGF0YSB0aGFuIGNhbiBmaXQgaW4gbWVtb3J5LCBDYXNzYW5kcmEncworIyBib3R0bGVuZWNrIHdpbGwgYmUgcmVhZHMgdGhhdCBuZWVkIHRvIGZldGNoIGRhdGEgZnJvbQorIyBkaXNrLiAiY29uY3VycmVudF9yZWFkcyIgc2hvdWxkIGJlIHNldCB0byAoMTYgKiBudW1iZXJfb2ZfZHJpdmVzKSBpbgorIyBvcmRlciB0byBhbGxvdyB0aGUgb3BlcmF0aW9ucyB0byBlbnF1ZXVlIGxvdyBlbm91Z2ggaW4gdGhlIHN0YWNrCisjIHRoYXQgdGhlIE9TIGFuZCBkcml2ZXMgY2FuIHJlb3JkZXIgdGhlbS4gU2FtZSBhcHBsaWVzIHRvCisjICJjb25jdXJyZW50X2NvdW50ZXJfd3JpdGVzIiwgc2luY2UgY291bnRlciB3cml0ZXMgcmVhZCB0aGUgY3VycmVudAorIyB2YWx1ZXMgYmVmb3JlIGluY3JlbWVudGluZyBhbmQgd3JpdGluZyB0aGVtIGJhY2suCisjCisjIE9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSB3cml0ZXMgYXJlIGFsbW9zdCBuZXZlciBJTyBib3VuZCwgdGhlIGlkZWFsCisjIG51bWJlciBvZiAiY29uY3VycmVudF93cml0ZXMiIGlzIGRlcGVuZGVudCBvbiB0aGUgbnVtYmVyIG9mIGNvcmVzIGluCisjIHlvdXIgc3lzdGVtOyAoOCAqIG51bWJlcl9vZl9jb3JlcykgaXMgYSBnb29kIHJ1bGUgb2YgdGh1bWIuCitjb25jdXJyZW50X3JlYWRzOiA8JT0gbm9kZVsnY2Fzc2FuZHJhJ11bJ2NvbmN1cnJlbnRfcmVhZHMnXSAlPgorY29uY3VycmVudF93cml0ZXM6IDwlPSBub2RlWydjYXNzYW5kcmEnXVsnY29uY3VycmVudF93cml0ZXMnXSAlPgorY29uY3VycmVudF9jb3VudGVyX3dyaXRlczogMzIgIAorCisKKyMgVG90YWwgbWVtb3J5IHRvIHVzZSBmb3Igc3N0YWJsZS1yZWFkaW5nIGJ1ZmZlcnMuICBEZWZhdWx0cyB0bworIyB0aGUgc21hbGxlciBvZiAxLzQgb2YgaGVhcCBvciA1MTJNQi4KKyMgZmlsZV9jYWNoZV9zaXplX2luX21iOiA1MTIKKworIyBUb3RhbCBwZXJtaXR0ZWQgbWVtb3J5IHRvIHVzZSBmb3IgbWVtdGFibGVzLiBDYXNzYW5kcmEgd2lsbCBzdG9wCisjIGFjY2VwdGluZyB3cml0ZXMgd2hlbiB0aGUgbGltaXQgaXMgZXhjZWVkZWQgdW50aWwgYSBmbHVzaCBjb21wbGV0ZXMsCisjIGFuZCB3aWxsIHRyaWdnZXIgYSBmbHVzaCBiYXNlZCBvbiBtZW10YWJsZV9jbGVhbnVwX3RocmVzaG9sZAorIyBJZiBvbWl0dGVkLCBDYXNzYW5kcmEgd2lsbCBzZXQgYm90aCB0byAxLzQgdGhlIHNpemUgb2YgdGhlIGhlYXAuCisjIG1lbXRhYmxlX2hlYXBfc3BhY2VfaW5fbWI6IDIwNDgKKyMgbWVtdGFibGVfb2ZmaGVhcF9zcGFjZV9pbl9tYjogMjA0OAorCisjIFJhdGlvIG9mIG9jY3VwaWVkIG5vbi1mbHVzaGluZyBtZW10YWJsZSBzaXplIHRvIHRvdGFsIHBlcm1pdHRlZCBzaXplCisjIHRoYXQgd2lsbCB0cmlnZ2VyIGEgZmx1c2ggb2YgdGhlIGxhcmdlc3QgbWVtdGFibGUuICBMYWdlciBtY3Qgd2lsbAorIyBtZWFuIGxhcmdlciBmbHVzaGVzIGFuZCBoZW5jZSBsZXNzIGNvbXBhY3Rpb24sIGJ1dCBhbHNvIGxlc3MgY29uY3VycmVudAorIyBmbHVzaCBhY3Rpdml0eSB3aGljaCBjYW4gbWFrZSBpdCBkaWZmaWN1bHQgdG8ga2VlcCB5b3VyIGRpc2tzIGZlZAorIyB1bmRlciBoZWF2eSB3cml0ZSBsb2FkLgorIworIyBtZW10YWJsZV9jbGVhbnVwX3RocmVzaG9sZCBkZWZhdWx0cyB0byAxIC8gKG1lbXRhYmxlX2ZsdXNoX3dyaXRlcnMgKyAxKQorIyBtZW10YWJsZV9jbGVhbnVwX3RocmVzaG9sZDogMC4xMQorCisjIFNwZWNpZnkgdGhlIHdheSBDYXNzYW5kcmEgYWxsb2NhdGVzIGFuZCBtYW5hZ2VzIG1lbXRhYmxlIG1lbW9yeS4KKyMgT3B0aW9ucyBhcmU6CisjICAgaGVhcF9idWZmZXJzOiAgICBvbiBoZWFwIG5pbyBidWZmZXJzCisjICAgb2ZmaGVhcF9idWZmZXJzOiBvZmYgaGVhcCAoZGlyZWN0KSBuaW8gYnVmZmVycworIyAgIG9mZmhlYXBfb2JqZWN0czogbmF0aXZlIG1lbW9yeSwgZWxpbWluYXRpbmcgbmlvIGJ1ZmZlciBoZWFwIG92ZXJoZWFkCittZW10YWJsZV9hbGxvY2F0aW9uX3R5cGU6IGhlYXBfYnVmZmVycworCisjIFRvdGFsIHNwYWNlIHRvIHVzZSBmb3IgY29tbWl0bG9ncy4gIFNpbmNlIGNvbW1pdGxvZyBzZWdtZW50cyBhcmUKKyMgbW1hcHBlZCwgYW5kIGhlbmNlIHVzZSB1cCBhZGRyZXNzIHNwYWNlLCB0aGUgZGVmYXVsdCBzaXplIGlzIDMyCisjIG9uIDMyLWJpdCBKVk1zLCBhbmQgODE5MiBvbiA2NC1iaXQgSlZNcy4KKyMKKyMgSWYgc3BhY2UgZ2V0cyBhYm92ZSB0aGlzIHZhbHVlIChpdCB3aWxsIHJvdW5kIHVwIHRvIHRoZSBuZXh0IG5lYXJlc3QKKyMgc2VnbWVudCBtdWx0aXBsZSksIENhc3NhbmRyYSB3aWxsIGZsdXNoIGV2ZXJ5IGRpcnR5IENGIGluIHRoZSBvbGRlc3QKKyMgc2VnbWVudCBhbmQgcmVtb3ZlIGl0LiAgU28gYSBzbWFsbCB0b3RhbCBjb21taXRsb2cgc3BhY2Ugd2lsbCB0ZW5kCisjIHRvIGNhdXNlIG1vcmUgZmx1c2ggYWN0aXZpdHkgb24gbGVzcy1hY3RpdmUgY29sdW1uZmFtaWxpZXMuCisjIGNvbW1pdGxvZ190b3RhbF9zcGFjZV9pbl9tYjogODE5MgorCisjIFRoaXMgc2V0cyB0aGUgYW1vdW50IG9mIG1lbXRhYmxlIGZsdXNoIHdyaXRlciB0aHJlYWRzLiAgVGhlc2Ugd2lsbAorIyBiZSBibG9ja2VkIGJ5IGRpc2sgaW8sIGFuZCBlYWNoIG9uZSB3aWxsIGhvbGQgYSBtZW10YWJsZSBpbiBtZW1vcnkKKyMgd2hpbGUgYmxvY2tlZC4KKyMKKyMgbWVtdGFibGVfZmx1c2hfd3JpdGVycyBkZWZhdWx0cyB0byB0aGUgc21hbGxlciBvZiAobnVtYmVyIG9mIGRpc2tzLAorIyBudW1iZXIgb2YgY29yZXMpLCB3aXRoIGEgbWluaW11bSBvZiAyIGFuZCBhIG1heGltdW0gb2YgOC4KKyMKKyMgSWYgeW91ciBkYXRhIGRpcmVjdG9yaWVzIGFyZSBiYWNrZWQgYnkgU1NELCB5b3Ugc2hvdWxkIGluY3JlYXNlIHRoaXMKKyMgdG8gdGhlIG51bWJlciBvZiBjb3Jlcy4KKyNtZW10YWJsZV9mbHVzaF93cml0ZXJzOiA4CisKKyMgQSBmaXhlZCBtZW1vcnkgcG9vbCBzaXplIGluIE1CIGZvciBmb3IgU1NUYWJsZSBpbmRleCBzdW1tYXJpZXMuIElmIGxlZnQKKyMgZW1wdHksIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDUlIG9mIHRoZSBoZWFwIHNpemUuIElmIHRoZSBtZW1vcnkgdXNhZ2Ugb2YKKyMgYWxsIGluZGV4IHN1bW1hcmllcyBleGNlZWRzIHRoaXMgbGltaXQsIFNTVGFibGVzIHdpdGggbG93IHJlYWQgcmF0ZXMgd2lsbAorIyBzaHJpbmsgdGhlaXIgaW5kZXggc3VtbWFyaWVzIGluIG9yZGVyIHRvIG1lZXQgdGhpcyBsaW1pdC4gIEhvd2V2ZXIsIHRoaXMKKyMgaXMgYSBiZXN0LWVmZm9ydCBwcm9jZXNzLiBJbiBleHRyZW1lIGNvbmRpdGlvbnMgQ2Fzc2FuZHJhIG1heSBuZWVkIHRvIHVzZQorIyBtb3JlIHRoYW4gdGhpcyBhbW91bnQgb2YgbWVtb3J5LgoraW5kZXhfc3VtbWFyeV9jYXBhY2l0eV9pbl9tYjoKKworIyBIb3cgZnJlcXVlbnRseSBpbmRleCBzdW1tYXJpZXMgc2hvdWxkIGJlIHJlc2FtcGxlZC4gIFRoaXMgaXMgZG9uZQorIyBwZXJpb2RpY2FsbHkgdG8gcmVkaXN0cmlidXRlIG1lbW9yeSBmcm9tIHRoZSBmaXhlZC1zaXplIHBvb2wgdG8gc3N0YWJsZXMKKyMgcHJvcG9ydGlvbmFsIHRoZWlyIHJlY2VudCByZWFkIHJhdGVzLiAgU2V0dGluZyB0byAtMSB3aWxsIGRpc2FibGUgdGhpcworIyBwcm9jZXNzLCBsZWF2aW5nIGV4aXN0aW5nIGluZGV4IHN1bW1hcmllcyBhdCB0aGVpciBjdXJyZW50IHNhbXBsaW5nIGxldmVsLgoraW5kZXhfc3VtbWFyeV9yZXNpemVfaW50ZXJ2YWxfaW5fbWludXRlczogNjAKKworIyBXaGV0aGVyIHRvLCB3aGVuIGRvaW5nIHNlcXVlbnRpYWwgd3JpdGluZywgZnN5bmMoKSBhdCBpbnRlcnZhbHMgaW4KKyMgb3JkZXIgdG8gZm9yY2UgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gZmx1c2ggdGhlIGRpcnR5CisjIGJ1ZmZlcnMuIEVuYWJsZSB0aGlzIHRvIGF2b2lkIHN1ZGRlbiBkaXJ0eSBidWZmZXIgZmx1c2hpbmcgZnJvbQorIyBpbXBhY3RpbmcgcmVhZCBsYXRlbmNpZXMuIEFsbW9zdCBhbHdheXMgYSBnb29kIGlkZWEgb24gU1NEczsgbm90CisjIG5lY2Vzc2FyaWx5IG9uIHBsYXR0ZXJzLgordHJpY2tsZV9mc3luYzogZmFsc2UKK3RyaWNrbGVfZnN5bmNfaW50ZXJ2YWxfaW5fa2I6IDEwMjQwCisKKyMgVENQIHBvcnQsIGZvciBjb21tYW5kcyBhbmQgZGF0YQorIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgeW91IHNob3VsZCBub3QgZXhwb3NlIHRoaXMgcG9ydCB0byB0aGUgaW50ZXJuZXQuICBGaXJld2FsbCBpdCBpZiBuZWVkZWQuCitzdG9yYWdlX3BvcnQ6IDcwMDAKKworIyBTU0wgcG9ydCwgZm9yIGVuY3J5cHRlZCBjb21tdW5pY2F0aW9uLiAgVW51c2VkIHVubGVzcyBlbmFibGVkIGluCisjIGVuY3J5cHRpb25fb3B0aW9ucworIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgeW91IHNob3VsZCBub3QgZXhwb3NlIHRoaXMgcG9ydCB0byB0aGUgaW50ZXJuZXQuICBGaXJld2FsbCBpdCBpZiBuZWVkZWQuCitzc2xfc3RvcmFnZV9wb3J0OiA3MDAxCisKKyMgQWRkcmVzcyBvciBpbnRlcmZhY2UgdG8gYmluZCB0byBhbmQgdGVsbCBvdGhlciBDYXNzYW5kcmEgbm9kZXMgdG8gY29ubmVjdCB0by4KKyMgWW91IF9tdXN0XyBjaGFuZ2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSBub2RlcyB0byBiZSBhYmxlIHRvIGNvbW11bmljYXRlIQorIworIyBTZXQgbGlzdGVuX2FkZHJlc3MgT1IgbGlzdGVuX2ludGVyZmFjZSwgbm90IGJvdGguIEludGVyZmFjZXMgbXVzdCBjb3JyZXNwb25kCisjIHRvIGEgc2luZ2xlIGFkZHJlc3MsIElQIGFsaWFzaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisjCisjIExlYXZpbmcgaXQgYmxhbmsgbGVhdmVzIGl0IHVwIHRvIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLiBUaGlzCisjIHdpbGwgYWx3YXlzIGRvIHRoZSBSaWdodCBUaGluZyBfaWZfIHRoZSBub2RlIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQKKyMgKGhvc3RuYW1lLCBuYW1lIHJlc29sdXRpb24sIGV0YyksIGFuZCB0aGUgUmlnaHQgVGhpbmcgaXMgdG8gdXNlIHRoZQorIyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9zdG5hbWUgKGl0IG1pZ2h0IG5vdCBiZSkuCisjCisjIFNldHRpbmcgbGlzdGVuX2FkZHJlc3MgdG8gMC4wLjAuMCBpcyBhbHdheXMgd3JvbmcuCisjCisjIElmIHlvdSBjaG9vc2UgdG8gc3BlY2lmeSB0aGUgaW50ZXJmYWNlIGJ5IG5hbWUgYW5kIHRoZSBpbnRlcmZhY2UgaGFzIGFuIGlwdjQgYW5kIGFuIGlwdjYgYWRkcmVzcworIyB5b3UgY2FuIHNwZWNpZnkgd2hpY2ggc2hvdWxkIGJlIGNob3NlbiB1c2luZyBsaXN0ZW5faW50ZXJmYWNlX3ByZWZlcl9pcHY2LiBJZiBmYWxzZSB0aGUgZmlyc3QgaXB2NAorIyBhZGRyZXNzIHdpbGwgYmUgdXNlZC4gSWYgdHJ1ZSB0aGUgZmlyc3QgaXB2NiBhZGRyZXNzIHdpbGwgYmUgdXNlZC4gRGVmYXVsdHMgdG8gZmFsc2UgcHJlZmVycmluZworIyBpcHY0LiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhZGRyZXNzIGl0IHdpbGwgYmUgc2VsZWN0ZWQgcmVnYXJkbGVzcyBvZiBpcHY0L2lwdjYuCitsaXN0ZW5fYWRkcmVzczogPCU9IEBsaXN0ZW5fYWRkcmVzcyAlPgorIyBsaXN0ZW5faW50ZXJmYWNlOiBldGgwCisjIGxpc3Rlbl9pbnRlcmZhY2VfcHJlZmVyX2lwdjY6IGZhbHNlCisKKyMgQWRkcmVzcyB0byBicm9hZGNhc3QgdG8gb3RoZXIgQ2Fzc2FuZHJhIG5vZGVzCisjIExlYXZpbmcgdGhpcyBibGFuayB3aWxsIHNldCBpdCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBsaXN0ZW5fYWRkcmVzcworYnJvYWRjYXN0X2FkZHJlc3M6IDwlPSBAYnJvYWRjYXN0X2FkZHJlc3MgJT4KKworIyBJbnRlcm5vZGUgYXV0aGVudGljYXRpb24gYmFja2VuZCwgaW1wbGVtZW50aW5nIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yOworIyB1c2VkIHRvIGFsbG93L2Rpc2FsbG93IGNvbm5lY3Rpb25zIGZyb20gcGVlciBub2Rlcy4KKyMgaW50ZXJub2RlX2F1dGhlbnRpY2F0b3I6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yCisKKyMgV2hldGhlciB0byBzdGFydCB0aGUgbmF0aXZlIHRyYW5zcG9ydCBzZXJ2ZXIuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFkZHJlc3Mgb24gd2hpY2ggdGhlIG5hdGl2ZSB0cmFuc3BvcnQgaXMgYm91bmQgaXMgdGhlCisjIHNhbWUgYXMgdGhlIHJwY19hZGRyZXNzLiBUaGUgcG9ydCBob3dldmVyIGlzIGRpZmZlcmVudCBhbmQgc3BlY2lmaWVkIGJlbG93Lgorc3RhcnRfbmF0aXZlX3RyYW5zcG9ydDogdHJ1ZQorIyBwb3J0IGZvciB0aGUgQ1FMIG5hdGl2ZSB0cmFuc3BvcnQgdG8gbGlzdGVuIGZvciBjbGllbnRzIG9uCisjIEZvciBzZWN1cml0eSByZWFzb25zLCB5b3Ugc2hvdWxkIG5vdCBleHBvc2UgdGhpcyBwb3J0IHRvIHRoZSBpbnRlcm5ldC4gIEZpcmV3YWxsIGl0IGlmIG5lZWRlZC4KK25hdGl2ZV90cmFuc3BvcnRfcG9ydDogOTA0MgorIyBUaGUgbWF4aW11bSB0aHJlYWRzIGZvciBoYW5kbGluZyByZXF1ZXN0cyB3aGVuIHRoZSBuYXRpdmUgdHJhbnNwb3J0IGlzIHVzZWQuCisjIFRoaXMgaXMgc2ltaWxhciB0byBycGNfbWF4X3RocmVhZHMgdGhvdWdoIHRoZSBkZWZhdWx0IGRpZmZlcnMgc2xpZ2h0bHkgKGFuZAorIyB0aGVyZSBpcyBubyBuYXRpdmVfdHJhbnNwb3J0X21pbl90aHJlYWRzLCBpZGxlIHRocmVhZHMgd2lsbCBhbHdheXMgYmUgc3RvcHBlZAorIyBhZnRlciAzMCBzZWNvbmRzKS4KKyMgbmF0aXZlX3RyYW5zcG9ydF9tYXhfdGhyZWFkczogMTI4CisjCisjIFRoZSBtYXhpbXVtIHNpemUgb2YgYWxsb3dlZCBmcmFtZS4gRnJhbWUgKHJlcXVlc3RzKSBsYXJnZXIgdGhhbiB0aGlzIHdpbGwKKyMgYmUgcmVqZWN0ZWQgYXMgaW52YWxpZC4gVGhlIGRlZmF1bHQgaXMgMjU2TUIuCisjIG5hdGl2ZV90cmFuc3BvcnRfbWF4X2ZyYW1lX3NpemVfaW5fbWI6IDI1NgorCisjIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudCBjb25uZWN0aW9ucy4KKyMgVGhlIGRlZmF1bHQgaXMgLTEsIHdoaWNoIG1lYW5zIHVubGltaXRlZC4KKyMgbmF0aXZlX3RyYW5zcG9ydF9tYXhfY29uY3VycmVudF9jb25uZWN0aW9uczogLTEKKworIyBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnQgY29ubmVjdGlvbnMgcGVyIHNvdXJjZSBpcC4KKyMgVGhlIGRlZmF1bHQgaXMgLTEsIHdoaWNoIG1lYW5zIHVubGltaXRlZC4KKyMgbmF0aXZlX3RyYW5zcG9ydF9tYXhfY29uY3VycmVudF9jb25uZWN0aW9uc19wZXJfaXA6IC0xCisKKyMgV2hldGhlciB0byBzdGFydCB0aGUgdGhyaWZ0IHJwYyBzZXJ2ZXIuCitzdGFydF9ycGM6IHRydWUKKworIyBUaGUgYWRkcmVzcyBvciBpbnRlcmZhY2UgdG8gYmluZCB0aGUgVGhyaWZ0IFJQQyBzZXJ2aWNlIGFuZCBuYXRpdmUgdHJhbnNwb3J0CisjIHNlcnZlciB0by4KKyMKKyMgU2V0IHJwY19hZGRyZXNzIE9SIHJwY19pbnRlcmZhY2UsIG5vdCBib3RoLiBJbnRlcmZhY2VzIG11c3QgY29ycmVzcG9uZAorIyB0byBhIHNpbmdsZSBhZGRyZXNzLCBJUCBhbGlhc2luZyBpcyBub3Qgc3VwcG9ydGVkLgorIworIyBMZWF2aW5nIHJwY19hZGRyZXNzIGJsYW5rIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgb24gbGlzdGVuX2FkZHJlc3MKKyMgKGkuZS4gaXQgd2lsbCBiZSBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBob3N0bmFtZSBvZiB0aGUgbm9kZSkuCisjCisjIE5vdGUgdGhhdCB1bmxpa2UgbGlzdGVuX2FkZHJlc3MsIHlvdSBjYW4gc3BlY2lmeSAwLjAuMC4wLCBidXQgeW91IG11c3QgYWxzbworIyBzZXQgYnJvYWRjYXN0X3JwY19hZGRyZXNzIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiAwLjAuMC4wLgorIworIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgeW91IHNob3VsZCBub3QgZXhwb3NlIHRoaXMgcG9ydCB0byB0aGUgaW50ZXJuZXQuICBGaXJld2FsbCBpdCBpZiBuZWVkZWQuCisjCisjIElmIHlvdSBjaG9vc2UgdG8gc3BlY2lmeSB0aGUgaW50ZXJmYWNlIGJ5IG5hbWUgYW5kIHRoZSBpbnRlcmZhY2UgaGFzIGFuIGlwdjQgYW5kIGFuIGlwdjYgYWRkcmVzcworIyB5b3UgY2FuIHNwZWNpZnkgd2hpY2ggc2hvdWxkIGJlIGNob3NlbiB1c2luZyBycGNfaW50ZXJmYWNlX3ByZWZlcl9pcHY2LiBJZiBmYWxzZSB0aGUgZmlyc3QgaXB2NAorIyBhZGRyZXNzIHdpbGwgYmUgdXNlZC4gSWYgdHJ1ZSB0aGUgZmlyc3QgaXB2NiBhZGRyZXNzIHdpbGwgYmUgdXNlZC4gRGVmYXVsdHMgdG8gZmFsc2UgcHJlZmVycmluZworIyBpcHY0LiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhZGRyZXNzIGl0IHdpbGwgYmUgc2VsZWN0ZWQgcmVnYXJkbGVzcyBvZiBpcHY0L2lwdjYuCitycGNfYWRkcmVzczogPCU9IEBycGNfYWRkcmVzcyAlPgorIyBycGNfaW50ZXJmYWNlOiBldGgxCisjIHJwY19pbnRlcmZhY2VfcHJlZmVyX2lwdjY6IGZhbHNlCisKKyMgcG9ydCBmb3IgVGhyaWZ0IHRvIGxpc3RlbiBmb3IgY2xpZW50cyBvbgorcnBjX3BvcnQ6IDkxNjAKKworIyBSUEMgYWRkcmVzcyB0byBicm9hZGNhc3QgdG8gZHJpdmVycyBhbmQgb3RoZXIgQ2Fzc2FuZHJhIG5vZGVzLiBUaGlzIGNhbm5vdAorIyBiZSBzZXQgdG8gMC4wLjAuMC4gSWYgbGVmdCBibGFuaywgdGhpcyB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YKKyMgcnBjX2FkZHJlc3MuIElmIHJwY19hZGRyZXNzIGlzIHNldCB0byAwLjAuMC4wLCBicm9hZGNhc3RfcnBjX2FkZHJlc3MgbXVzdAorIyBiZSBzZXQuCiticm9hZGNhc3RfcnBjX2FkZHJlc3M6IDwlPSBAYnJvYWRjYXN0X3JwY19hZGRyZXNzICU+CisKKyMgZW5hYmxlIG9yIGRpc2FibGUga2VlcGFsaXZlIG9uIHJwYy9uYXRpdmUgY29ubmVjdGlvbnMKK3JwY19rZWVwYWxpdmU6IHRydWUKKworIyBDYXNzYW5kcmEgcHJvdmlkZXMgdHdvIG91dC1vZi10aGUtYm94IG9wdGlvbnMgZm9yIHRoZSBSUEMgU2VydmVyOgorIworIyBzeW5jICAtPiBPbmUgdGhyZWFkIHBlciB0aHJpZnQgY29ubmVjdGlvbi4gRm9yIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgY2xpZW50cywgbWVtb3J5CisjICAgICAgICAgIHdpbGwgYmUgeW91ciBsaW1pdGluZyBmYWN0b3IuIE9uIGEgNjQgYml0IEpWTSwgMTgwS0IgaXMgdGhlIG1pbmltdW0gc3RhY2sgc2l6ZQorIyAgICAgICAgICBwZXIgdGhyZWFkLCBhbmQgdGhhdCB3aWxsIGNvcnJlc3BvbmQgdG8geW91ciB1c2Ugb2YgdmlydHVhbCBtZW1vcnkgKGJ1dCBwaHlzaWNhbCBtZW1vcnkKKyMgICAgICAgICAgbWF5IGJlIGxpbWl0ZWQgZGVwZW5kaW5nIG9uIHVzZSBvZiBzdGFjayBzcGFjZSkuCisjCisjIGhzaGEgIC0+IFN0YW5kcyBmb3IgImhhbGYgc3luY2hyb25vdXMsIGhhbGYgYXN5bmNocm9ub3VzLiIgQWxsIHRocmlmdCBjbGllbnRzIGFyZSBoYW5kbGVkCisjICAgICAgICAgIGFzeW5jaHJvbm91c2x5IHVzaW5nIGEgc21hbGwgbnVtYmVyIG9mIHRocmVhZHMgdGhhdCBkb2VzIG5vdCB2YXJ5IHdpdGggdGhlIGFtb3VudAorIyAgICAgICAgICBvZiB0aHJpZnQgY2xpZW50cyAoYW5kIHRodXMgc2NhbGVzIHdlbGwgdG8gbWFueSBjbGllbnRzKS4gVGhlIHJwYyByZXF1ZXN0cyBhcmUgc3RpbGwKKyMgICAgICAgICAgc3luY2hyb25vdXMgKG9uZSB0aHJlYWQgcGVyIGFjdGl2ZSByZXF1ZXN0KS4gSWYgaHNoYSBpcyBzZWxlY3RlZCB0aGVuIGl0IGlzIGVzc2VudGlhbAorIyAgICAgICAgICB0aGF0IHJwY19tYXhfdGhyZWFkcyBpcyBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdW5saW1pdGVkLgorIworIyBUaGUgZGVmYXVsdCBpcyBzeW5jIGJlY2F1c2Ugb24gV2luZG93cyBoc2hhIGlzIGFib3V0IDMwJSBzbG93ZXIuICBPbiBMaW51eCwKKyMgc3luYy9oc2hhIHBlcmZvcm1hbmNlIGlzIGFib3V0IHRoZSBzYW1lLCB3aXRoIGhzaGEgb2YgY291cnNlIHVzaW5nIGxlc3MgbWVtb3J5LgorIworIyBBbHRlcm5hdGl2ZWx5LCAgY2FuIHByb3ZpZGUgeW91ciBvd24gUlBDIHNlcnZlciBieSBwcm92aWRpbmcgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lCisjIG9mIGFuIG8uYS5jLnQuVFNlcnZlckZhY3RvcnkgdGhhdCBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGl0LgorcnBjX3NlcnZlcl90eXBlOiBzeW5jCisKKyMgVW5jb21tZW50IHJwY19taW58bWF4X3RocmVhZCB0byBzZXQgcmVxdWVzdCBwb29sIHNpemUgbGltaXRzLgorIworIyBSZWdhcmRsZXNzIG9mIHlvdXIgY2hvaWNlIG9mIFJQQyBzZXJ2ZXIgKHNlZSBhYm92ZSksIHRoZSBudW1iZXIgb2YgbWF4aW11bSByZXF1ZXN0cyBpbiB0aGUKKyMgUlBDIHRocmVhZCBwb29sIGRpY3RhdGVzIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVxdWVzdHMgYXJlIHBvc3NpYmxlIChidXQgaWYgeW91IGFyZSB1c2luZyB0aGUgc3luYworIyBSUEMgc2VydmVyLCBpdCBhbHNvIGRpY3RhdGVzIHRoZSBudW1iZXIgb2YgY2xpZW50cyB0aGF0IGNhbiBiZSBjb25uZWN0ZWQgYXQgYWxsKS4KKyMKKyMgVGhlIGRlZmF1bHQgaXMgdW5saW1pdGVkIGFuZCB0aHVzIHByb3ZpZGVzIG5vIHByb3RlY3Rpb24gYWdhaW5zdCBjbGllbnRzIG92ZXJ3aGVsbWluZyB0aGUgc2VydmVyLiBZb3UgYXJlCisjIGVuY291cmFnZWQgdG8gc2V0IGEgbWF4aW11bSB0aGF0IG1ha2VzIHNlbnNlIGZvciB5b3UgaW4gcHJvZHVjdGlvbiwgYnV0IGRvIGtlZXAgaW4gbWluZCB0aGF0CisjIHJwY19tYXhfdGhyZWFkcyByZXByZXNlbnRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjbGllbnQgcmVxdWVzdHMgdGhpcyBzZXJ2ZXIgbWF5IGV4ZWN1dGUgY29uY3VycmVudGx5LgorIworIyBycGNfbWluX3RocmVhZHM6IDE2CisjIHJwY19tYXhfdGhyZWFkczogMjA0OAorCisjIHVuY29tbWVudCB0byBzZXQgc29ja2V0IGJ1ZmZlciBzaXplcyBvbiBycGMgY29ubmVjdGlvbnMKKyMgcnBjX3NlbmRfYnVmZl9zaXplX2luX2J5dGVzOgorIyBycGNfcmVjdl9idWZmX3NpemVfaW5fYnl0ZXM6CisKKyMgVW5jb21tZW50IHRvIHNldCBzb2NrZXQgYnVmZmVyIHNpemUgZm9yIGludGVybm9kZSBjb21tdW5pY2F0aW9uCisjIE5vdGUgdGhhdCB3aGVuIHNldHRpbmcgdGhpcywgdGhlIGJ1ZmZlciBzaXplIGlzIGxpbWl0ZWQgYnkgbmV0LmNvcmUud21lbV9tYXgKKyMgYW5kIHdoZW4gbm90IHNldHRpbmcgaXQgaXQgaXMgZGVmaW5lZCBieSBuZXQuaXB2NC50Y3Bfd21lbQorIyBTZWU6CisjIC9wcm9jL3N5cy9uZXQvY29yZS93bWVtX21heAorIyAvcHJvYy9zeXMvbmV0L2NvcmUvcm1lbV9tYXgKKyMgL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF93bWVtCisjIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfd21lbQorIyBhbmQ6IG1hbiB0Y3AKKyMgaW50ZXJub2RlX3NlbmRfYnVmZl9zaXplX2luX2J5dGVzOgorIyBpbnRlcm5vZGVfcmVjdl9idWZmX3NpemVfaW5fYnl0ZXM6CisKKyMgRnJhbWUgc2l6ZSBmb3IgdGhyaWZ0IChtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoKS4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NpemVfaW5fbWI6IDE1CisKKyMgU2V0IHRvIHRydWUgdG8gaGF2ZSBDYXNzYW5kcmEgY3JlYXRlIGEgaGFyZCBsaW5rIHRvIGVhY2ggc3N0YWJsZQorIyBmbHVzaGVkIG9yIHN0cmVhbWVkIGxvY2FsbHkgaW4gYSBiYWNrdXBzLyBzdWJkaXJlY3Rvcnkgb2YgdGhlCisjIGtleXNwYWNlIGRhdGEuICBSZW1vdmluZyB0aGVzZSBsaW5rcyBpcyB0aGUgb3BlcmF0b3IncworIyByZXNwb25zaWJpbGl0eS4KK2luY3JlbWVudGFsX2JhY2t1cHM6IGZhbHNlCisKKyMgV2hldGhlciBvciBub3QgdG8gdGFrZSBhIHNuYXBzaG90IGJlZm9yZSBlYWNoIGNvbXBhY3Rpb24uICBCZQorIyBjYXJlZnVsIHVzaW5nIHRoaXMgb3B0aW9uLCBzaW5jZSBDYXNzYW5kcmEgd29uJ3QgY2xlYW4gdXAgdGhlCisjIHNuYXBzaG90cyBmb3IgeW91LiAgTW9zdGx5IHVzZWZ1bCBpZiB5b3UncmUgcGFyYW5vaWQgd2hlbiB0aGVyZQorIyBpcyBhIGRhdGEgZm9ybWF0IGNoYW5nZS4KK3NuYXBzaG90X2JlZm9yZV9jb21wYWN0aW9uOiBmYWxzZQorCisjIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgdGFrZW4gb2YgdGhlIGRhdGEgYmVmb3JlIGtleXNwYWNlIHRydW5jYXRpb24KKyMgb3IgZHJvcHBpbmcgb2YgY29sdW1uIGZhbWlsaWVzLiBUaGUgU1RST05HTFkgYWR2aXNlZCBkZWZhdWx0IG9mIHRydWUKKyMgc2hvdWxkIGJlIHVzZWQgdG8gcHJvdmlkZSBkYXRhIHNhZmV0eS4gSWYgeW91IHNldCB0aGlzIGZsYWcgdG8gZmFsc2UsIHlvdSB3aWxsCisjIGxvc2UgZGF0YSBvbiB0cnVuY2F0aW9uIG9yIGRyb3AuCithdXRvX3NuYXBzaG90OiB0cnVlCisKKyMgV2hlbiBleGVjdXRpbmcgYSBzY2FuLCB3aXRoaW4gb3IgYWNyb3NzIGEgcGFydGl0aW9uLCB3ZSBuZWVkIHRvIGtlZXAgdGhlCisjIHRvbWJzdG9uZXMgc2VlbiBpbiBtZW1vcnkgc28gd2UgY2FuIHJldHVybiB0aGVtIHRvIHRoZSBjb29yZGluYXRvciwgd2hpY2gKKyMgd2lsbCB1c2UgdGhlbSB0byBtYWtlIHN1cmUgb3RoZXIgcmVwbGljYXMgYWxzbyBrbm93IGFib3V0IHRoZSBkZWxldGVkIHJvd3MuCisjIFdpdGggd29ya2xvYWRzIHRoYXQgZ2VuZXJhdGUgYSBsb3Qgb2YgdG9tYnN0b25lcywgdGhpcyBjYW4gY2F1c2UgcGVyZm9ybWFuY2UKKyMgcHJvYmxlbXMgYW5kIGV2ZW4gZXhhdXN0IHRoZSBzZXJ2ZXIgaGVhcC4KKyMgKGh0dHA6Ly93d3cuZGF0YXN0YXguY29tL2Rldi9ibG9nL2Nhc3NhbmRyYS1hbnRpLXBhdHRlcm5zLXF1ZXVlcy1hbmQtcXVldWUtbGlrZS1kYXRhc2V0cykKKyMgQWRqdXN0IHRoZSB0aHJlc2hvbGRzIGhlcmUgaWYgeW91IHVuZGVyc3RhbmQgdGhlIGRhbmdlcnMgYW5kIHdhbnQgdG8KKyMgc2NhbiBtb3JlIHRvbWJzdG9uZXMgYW55d2F5LiAgVGhlc2UgdGhyZXNob2xkcyBtYXkgYWxzbyBiZSBhZGp1c3RlZCBhdCBydW50aW1lCisjIHVzaW5nIHRoZSBTdG9yYWdlU2VydmljZSBtYmVhbi4KK3RvbWJzdG9uZV93YXJuX3RocmVzaG9sZDogMTAwMAordG9tYnN0b25lX2ZhaWx1cmVfdGhyZXNob2xkOiAxMDAwMDAKKworIyBHcmFudWxhcml0eSBvZiB0aGUgY29sbGF0aW9uIGluZGV4IG9mIHJvd3Mgd2l0aGluIGEgcGFydGl0aW9uLgorIyBJbmNyZWFzZSBpZiB5b3VyIHJvd3MgYXJlIGxhcmdlLCBvciBpZiB5b3UgaGF2ZSBhIHZlcnkgbGFyZ2UKKyMgbnVtYmVyIG9mIHJvd3MgcGVyIHBhcnRpdGlvbi4gIFRoZSBjb21wZXRpbmcgZ29hbHMgYXJlIHRoZXNlOgorIyAgIDEpIGEgc21hbGxlciBncmFudWxhcml0eSBtZWFucyBtb3JlIGluZGV4IGVudHJpZXMgYXJlIGdlbmVyYXRlZAorIyAgICAgIGFuZCBsb29raW5nIHVwIHJvd3Mgd2l0aGluZyB0aGUgcGFydGl0aW9uIGJ5IGNvbGxhdGlvbiBjb2x1bW4KKyMgICAgICBpcyBmYXN0ZXIKKyMgICAyKSBidXQsIENhc3NhbmRyYSB3aWxsIGtlZXAgdGhlIGNvbGxhdGlvbiBpbmRleCBpbiBtZW1vcnkgZm9yIGhvdAorIyAgICAgIHJvd3MgKGFzIHBhcnQgb2YgdGhlIGtleSBjYWNoZSksIHNvIGEgbGFyZ2VyIGdyYW51bGFyaXR5IG1lYW5zCisjICAgICAgeW91IGNhbiBjYWNoZSBtb3JlIGhvdCByb3dzCitjb2x1bW5faW5kZXhfc2l6ZV9pbl9rYjogNjQKKworCisjIExvZyBXQVJOIG9uIGFueSBiYXRjaCBzaXplIGV4Y2VlZGluZyB0aGlzIHZhbHVlLiA1a2IgcGVyIGJhdGNoIGJ5IGRlZmF1bHQuCisjIENhdXRpb24gc2hvdWxkIGJlIHRha2VuIG9uIGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhpcyB0aHJlc2hvbGQgYXMgaXQgY2FuIGxlYWQgdG8gbm9kZSBpbnN0YWJpbGl0eS4KK2JhdGNoX3NpemVfd2Fybl90aHJlc2hvbGRfaW5fa2I6IDUKKworCisjIExvZyBXQVJOIG9uIGFueSBiYXRjaGVzIG5vdCBvZiB0eXBlIExPR0dFRCB0aGFuIHNwYW4gYWNyb3NzIG1vcmUgcGFydGl0aW9ucyB0aGFuIHRoaXMgbGltaXQKK3VubG9nZ2VkX2JhdGNoX2Fjcm9zc19wYXJ0aXRpb25zX3dhcm5fdGhyZXNob2xkOiAxMAorCisjIE51bWJlciBvZiBzaW11bHRhbmVvdXMgY29tcGFjdGlvbnMgdG8gYWxsb3csIE5PVCBpbmNsdWRpbmcKKyMgdmFsaWRhdGlvbiAiY29tcGFjdGlvbnMiIGZvciBhbnRpLWVudHJvcHkgcmVwYWlyLiAgU2ltdWx0YW5lb3VzCisjIGNvbXBhY3Rpb25zIGNhbiBoZWxwIHByZXNlcnZlIHJlYWQgcGVyZm9ybWFuY2UgaW4gYSBtaXhlZCByZWFkL3dyaXRlCisjIHdvcmtsb2FkLCBieSBtaXRpZ2F0aW5nIHRoZSB0ZW5kZW5jeSBvZiBzbWFsbCBzc3RhYmxlcyB0byBhY2N1bXVsYXRlCisjIGR1cmluZyBhIHNpbmdsZSBsb25nIHJ1bm5pbmcgY29tcGFjdGlvbnMuIFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkKKyMgZmluZSBhbmQgaWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCBjb21wYWN0aW9uIHJ1bm5pbmcgdG9vCisjIHNsb3dseSBvciB0b28gZmFzdCwgeW91IHNob3VsZCBsb29rIGF0CisjIGNvbXBhY3Rpb25fdGhyb3VnaHB1dF9tYl9wZXJfc2VjIGZpcnN0LgorIworIyBjb25jdXJyZW50X2NvbXBhY3RvcnMgZGVmYXVsdHMgdG8gdGhlIHNtYWxsZXIgb2YgKG51bWJlciBvZiBkaXNrcywKKyMgbnVtYmVyIG9mIGNvcmVzKSwgd2l0aCBhIG1pbmltdW0gb2YgMiBhbmQgYSBtYXhpbXVtIG9mIDguCisjCisjIElmIHlvdXIgZGF0YSBkaXJlY3RvcmllcyBhcmUgYmFja2VkIGJ5IFNTRCwgeW91IHNob3VsZCBpbmNyZWFzZSB0aGlzCisjIHRvIHRoZSBudW1iZXIgb2YgY29yZXMuCisjY29uY3VycmVudF9jb21wYWN0b3JzOiAxCisKKyMgVGhyb3R0bGVzIGNvbXBhY3Rpb24gdG8gdGhlIGdpdmVuIHRvdGFsIHRocm91Z2hwdXQgYWNyb3NzIHRoZSBlbnRpcmUKKyMgc3lzdGVtLiBUaGUgZmFzdGVyIHlvdSBpbnNlcnQgZGF0YSwgdGhlIGZhc3RlciB5b3UgbmVlZCB0byBjb21wYWN0IGluCisjIG9yZGVyIHRvIGtlZXAgdGhlIHNzdGFibGUgY291bnQgZG93biwgYnV0IGluIGdlbmVyYWwsIHNldHRpbmcgdGhpcyB0bworIyAxNiB0byAzMiB0aW1lcyB0aGUgcmF0ZSB5b3UgYXJlIGluc2VydGluZyBkYXRhIGlzIG1vcmUgdGhhbiBzdWZmaWNpZW50LgorIyBTZXR0aW5nIHRoaXMgdG8gMCBkaXNhYmxlcyB0aHJvdHRsaW5nLiBOb3RlIHRoYXQgdGhpcyBhY2NvdW50IGZvciBhbGwgdHlwZXMKKyMgb2YgY29tcGFjdGlvbiwgaW5jbHVkaW5nIHZhbGlkYXRpb24gY29tcGFjdGlvbi4KK2NvbXBhY3Rpb25fdGhyb3VnaHB1dF9tYl9wZXJfc2VjOiAxNgorCisjIExvZyBhIHdhcm5pbmcgd2hlbiBjb21wYWN0aW5nIHBhcnRpdGlvbnMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZQorY29tcGFjdGlvbl9sYXJnZV9wYXJ0aXRpb25fd2FybmluZ190aHJlc2hvbGRfbWI6IDEwMAorCisjIFdoZW4gY29tcGFjdGluZywgdGhlIHJlcGxhY2VtZW50IHNzdGFibGUocykgY2FuIGJlIG9wZW5lZCBiZWZvcmUgdGhleQorIyBhcmUgY29tcGxldGVseSB3cml0dGVuLCBhbmQgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcHJpb3Igc3N0YWJsZXMgZm9yCisjIGFueSByYW5nZSB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4uIFRoaXMgaGVscHMgdG8gc21vb3RobHkgdHJhbnNmZXIgcmVhZHMKKyMgYmV0d2VlbiB0aGUgc3N0YWJsZXMsIHJlZHVjaW5nIHBhZ2UgY2FjaGUgY2h1cm4gYW5kIGtlZXBpbmcgaG90IHJvd3MgaG90Citzc3RhYmxlX3ByZWVtcHRpdmVfb3Blbl9pbnRlcnZhbF9pbl9tYjogNTAKKworIyBUaHJvdHRsZXMgYWxsIG91dGJvdW5kIHN0cmVhbWluZyBmaWxlIHRyYW5zZmVycyBvbiB0aGlzIG5vZGUgdG8gdGhlCisjIGdpdmVuIHRvdGFsIHRocm91Z2hwdXQgaW4gTWJwcy4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBDYXNzYW5kcmEgZG9lcworIyBtb3N0bHkgc2VxdWVudGlhbCBJTyB3aGVuIHN0cmVhbWluZyBkYXRhIGR1cmluZyBib290c3RyYXAgb3IgcmVwYWlyLCB3aGljaAorIyBjYW4gbGVhZCB0byBzYXR1cmF0aW5nIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kIGRlZ3JhZGluZyBycGMgcGVyZm9ybWFuY2UuCisjIFdoZW4gdW5zZXQsIHRoZSBkZWZhdWx0IGlzIDIwMCBNYnBzIG9yIDI1IE1CL3MuCisjIHN0cmVhbV90aHJvdWdocHV0X291dGJvdW5kX21lZ2FiaXRzX3Blcl9zZWM6IDIwMAorCisjIFRocm90dGxlcyBhbGwgc3RyZWFtaW5nIGZpbGUgdHJhbnNmZXIgYmV0d2VlbiB0aGUgZGF0YWNlbnRlcnMsCisjIHRoaXMgc2V0dGluZyBhbGxvd3MgdXNlcnMgdG8gdGhyb3R0bGUgaW50ZXIgZGMgc3RyZWFtIHRocm91Z2hwdXQgaW4gYWRkaXRpb24KKyMgdG8gdGhyb3R0bGluZyBhbGwgbmV0d29yayBzdHJlYW0gdHJhZmZpYyBhcyBjb25maWd1cmVkIHdpdGgKKyMgc3RyZWFtX3Rocm91Z2hwdXRfb3V0Ym91bmRfbWVnYWJpdHNfcGVyX3NlYworIyBXaGVuIHVuc2V0LCB0aGUgZGVmYXVsdCBpcyAyMDAgTWJwcyBvciAyNSBNQi9zCisjIGludGVyX2RjX3N0cmVhbV90aHJvdWdocHV0X291dGJvdW5kX21lZ2FiaXRzX3Blcl9zZWM6IDIwMAorCisjIEhvdyBsb25nIHRoZSBjb29yZGluYXRvciBzaG91bGQgd2FpdCBmb3IgcmVhZCBvcGVyYXRpb25zIHRvIGNvbXBsZXRlCityZWFkX3JlcXVlc3RfdGltZW91dF9pbl9tczogNTAwMAorIyBIb3cgbG9uZyB0aGUgY29vcmRpbmF0b3Igc2hvdWxkIHdhaXQgZm9yIHNlcSBvciBpbmRleCBzY2FucyB0byBjb21wbGV0ZQorcmFuZ2VfcmVxdWVzdF90aW1lb3V0X2luX21zOiAxMDAwMAorIyBIb3cgbG9uZyB0aGUgY29vcmRpbmF0b3Igc2hvdWxkIHdhaXQgZm9yIHdyaXRlcyB0byBjb21wbGV0ZQord3JpdGVfcmVxdWVzdF90aW1lb3V0X2luX21zOiAyMDAwCisjIEhvdyBsb25nIHRoZSBjb29yZGluYXRvciBzaG91bGQgd2FpdCBmb3IgY291bnRlciB3cml0ZXMgdG8gY29tcGxldGUKK2NvdW50ZXJfd3JpdGVfcmVxdWVzdF90aW1lb3V0X2luX21zOiA1MDAwCisjIEhvdyBsb25nIGEgY29vcmRpbmF0b3Igc2hvdWxkIGNvbnRpbnVlIHRvIHJldHJ5IGEgQ0FTIG9wZXJhdGlvbgorIyB0aGF0IGNvbnRlbmRzIHdpdGggb3RoZXIgcHJvcG9zYWxzIGZvciB0aGUgc2FtZSByb3cKK2Nhc19jb250ZW50aW9uX3RpbWVvdXRfaW5fbXM6IDEwMDAKKyMgSG93IGxvbmcgdGhlIGNvb3JkaW5hdG9yIHNob3VsZCB3YWl0IGZvciB0cnVuY2F0ZXMgdG8gY29tcGxldGUKKyMgKFRoaXMgY2FuIGJlIG11Y2ggbG9uZ2VyLCBiZWNhdXNlIHVubGVzcyBhdXRvX3NuYXBzaG90IGlzIGRpc2FibGVkCisjIHdlIG5lZWQgdG8gZmx1c2ggZmlyc3Qgc28gd2UgY2FuIHNuYXBzaG90IGJlZm9yZSByZW1vdmluZyB0aGUgZGF0YS4pCit0cnVuY2F0ZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXM6IDYwMDAwCisjIFRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIG90aGVyLCBtaXNjZWxsYW5lb3VzIG9wZXJhdGlvbnMKK3JlcXVlc3RfdGltZW91dF9pbl9tczogMTAwMDAKKworIyBFbmFibGUgb3BlcmF0aW9uIHRpbWVvdXQgaW5mb3JtYXRpb24gZXhjaGFuZ2UgYmV0d2VlbiBub2RlcyB0byBhY2N1cmF0ZWx5CisjIG1lYXN1cmUgcmVxdWVzdCB0aW1lb3V0cy4gIElmIGRpc2FibGVkLCByZXBsaWNhcyB3aWxsIGFzc3VtZSB0aGF0IHJlcXVlc3RzCisjIHdlcmUgZm9yd2FyZGVkIHRvIHRoZW0gaW5zdGFudGx5IGJ5IHRoZSBjb29yZGluYXRvciwgd2hpY2ggbWVhbnMgdGhhdAorIyB1bmRlciBvdmVybG9hZCBjb25kaXRpb25zIHdlIHdpbGwgd2FzdGUgdGhhdCBtdWNoIGV4dHJhIHRpbWUgcHJvY2Vzc2luZworIyBhbHJlYWR5LXRpbWVkLW91dCByZXF1ZXN0cy4KKyMKKyMgV2FybmluZzogYmVmb3JlIGVuYWJsaW5nIHRoaXMgcHJvcGVydHkgbWFrZSBzdXJlIHRvIG50cCBpcyBpbnN0YWxsZWQKKyMgYW5kIHRoZSB0aW1lcyBhcmUgc3luY2hyb25pemVkIGJldHdlZW4gdGhlIG5vZGVzLgorY3Jvc3Nfbm9kZV90aW1lb3V0OiBmYWxzZQorCisjIFNldCBzb2NrZXQgdGltZW91dCBmb3Igc3RyZWFtaW5nIG9wZXJhdGlvbi4KKyMgVGhlIHN0cmVhbSBzZXNzaW9uIGlzIGZhaWxlZCBpZiBubyBkYXRhL2FjayBpcyByZWNlaXZlZCBieSBhbnkgb2YgdGhlIHBhcnRpY2lwYW50cworIyB3aXRoaW4gdGhhdCBwZXJpb2QsIHdoaWNoIG1lYW5zIHRoaXMgc2hvdWxkIGFsc28gYmUgc3VmZmljaWVudCB0byBzdHJlYW0gYSBsYXJnZQorIyBzc3RhYmxlIG9yIHJlYnVpbGQgdGFibGUgaW5kZXhlcy4KKyMgRGVmYXVsdCB2YWx1ZSBpcyA4NjQwMDAwMG1zLCB3aGljaCBtZWFucyBzdGFsZSBzdHJlYW1zIHRpbWVvdXQgYWZ0ZXIgMjQgaG91cnMuCisjIEEgdmFsdWUgb2YgemVybyBtZWFucyBzdHJlYW0gc29ja2V0cyBzaG91bGQgbmV2ZXIgdGltZSBvdXQuCisjIHN0cmVhbWluZ19zb2NrZXRfdGltZW91dF9pbl9tczogODY0MDAwMDAKKworIyBwaGkgdmFsdWUgdGhhdCBtdXN0IGJlIHJlYWNoZWQgZm9yIGEgaG9zdCB0byBiZSBtYXJrZWQgZG93bi4KKyMgbW9zdCB1c2VycyBzaG91bGQgbmV2ZXIgbmVlZCB0byBhZGp1c3QgdGhpcy4KKyMgcGhpX2NvbnZpY3RfdGhyZXNob2xkOiA4CitwaGlfY29udmljdF90aHJlc2hvbGQ6IDwlPSBub2RlWydjYXNzYW5kcmEnXVsncGhpX2NvbnZpY3RfdGhyZXNob2xkJ10gJT4KKworIyBlbmRwb2ludF9zbml0Y2ggLS0gU2V0IHRoaXMgdG8gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMKKyMgSUVuZHBvaW50U25pdGNoLiAgVGhlIHNuaXRjaCBoYXMgdHdvIGZ1bmN0aW9uczoKKyMgLSBpdCB0ZWFjaGVzIENhc3NhbmRyYSBlbm91Z2ggYWJvdXQgeW91ciBuZXR3b3JrIHRvcG9sb2d5IHRvIHJvdXRlCisjICAgcmVxdWVzdHMgZWZmaWNpZW50bHkKKyMgLSBpdCBhbGxvd3MgQ2Fzc2FuZHJhIHRvIHNwcmVhZCByZXBsaWNhcyBhcm91bmQgeW91ciBjbHVzdGVyIHRvIGF2b2lkCisjICAgY29ycmVsYXRlZCBmYWlsdXJlcy4gSXQgZG9lcyB0aGlzIGJ5IGdyb3VwaW5nIG1hY2hpbmVzIGludG8KKyMgICAiZGF0YWNlbnRlcnMiIGFuZCAicmFja3MuIiAgQ2Fzc2FuZHJhIHdpbGwgZG8gaXRzIGJlc3Qgbm90IHRvIGhhdmUKKyMgICBtb3JlIHRoYW4gb25lIHJlcGxpY2Egb24gdGhlIHNhbWUgInJhY2siICh3aGljaCBtYXkgbm90IGFjdHVhbGx5CisjICAgYmUgYSBwaHlzaWNhbCBsb2NhdGlvbikKKyMKKyMgQ0FTU0FORFJBIFdJTEwgTk9UIEFMTE9XIFlPVSBUTyBTV0lUQ0ggVE8gQU4gSU5DT01QQVRJQkxFIFNOSVRDSAorIyBPTkNFIERBVEEgSVMgSU5TRVJURUQgSU5UTyBUSEUgQ0xVU1RFUi4gIFRoaXMgd291bGQgY2F1c2UgZGF0YSBsb3NzLgorIyBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IHN0YXJ0IHdpdGggdGhlIGRlZmF1bHQgU2ltcGxlU25pdGNoLCB3aGljaAorIyBsb2NhdGVzIGV2ZXJ5IG5vZGUgb24gInJhY2sxIiBpbiAiZGF0YWNlbnRlcjEiLCB5b3VyIG9ubHkgb3B0aW9ucworIyBpZiB5b3UgbmVlZCB0byBhZGQgYW5vdGhlciBkYXRhY2VudGVyIGFyZSBHb3NzaXBpbmdQcm9wZXJ0eUZpbGVTbml0Y2gKKyMgKGFuZCB0aGUgb2xkZXIgUEZTKS4gIEZyb20gdGhlcmUsIGlmIHlvdSB3YW50IHRvIG1pZ3JhdGUgdG8gYW4KKyMgaW5jb21wYXRpYmxlIHNuaXRjaCBsaWtlIEVjMlNuaXRjaCB5b3UgY2FuIGRvIGl0IGJ5IGFkZGluZyBuZXcgbm9kZXMKKyMgdW5kZXIgRWMyU25pdGNoICh3aGljaCB3aWxsIGxvY2F0ZSB0aGVtIGluIGEgbmV3ICJkYXRhY2VudGVyIikgYW5kCisjIGRlY29tbWlzc2lvbmluZyB0aGUgb2xkIG9uZXMuCisjCisjIE91dCBvZiB0aGUgYm94LCBDYXNzYW5kcmEgcHJvdmlkZXMKKyMgIC0gU2ltcGxlU25pdGNoOgorIyAgICBUcmVhdHMgU3RyYXRlZ3kgb3JkZXIgYXMgcHJveGltaXR5LiBUaGlzIGNhbiBpbXByb3ZlIGNhY2hlCisjICAgIGxvY2FsaXR5IHdoZW4gZGlzYWJsaW5nIHJlYWQgcmVwYWlyLiAgT25seSBhcHByb3ByaWF0ZSBmb3IKKyMgICAgc2luZ2xlLWRhdGFjZW50ZXIgZGVwbG95bWVudHMuCisjICAtIEdvc3NpcGluZ1Byb3BlcnR5RmlsZVNuaXRjaAorIyAgICBUaGlzIHNob3VsZCBiZSB5b3VyIGdvLXRvIHNuaXRjaCBmb3IgcHJvZHVjdGlvbiB1c2UuICBUaGUgcmFjaworIyAgICBhbmQgZGF0YWNlbnRlciBmb3IgdGhlIGxvY2FsIG5vZGUgYXJlIGRlZmluZWQgaW4KKyMgICAgY2Fzc2FuZHJhLXJhY2tkYy5wcm9wZXJ0aWVzIGFuZCBwcm9wYWdhdGVkIHRvIG90aGVyIG5vZGVzIHZpYQorIyAgICBnb3NzaXAuICBJZiBjYXNzYW5kcmEtdG9wb2xvZ3kucHJvcGVydGllcyBleGlzdHMsIGl0IGlzIHVzZWQgYXMgYQorIyAgICBmYWxsYmFjaywgYWxsb3dpbmcgbWlncmF0aW9uIGZyb20gdGhlIFByb3BlcnR5RmlsZVNuaXRjaC4KKyMgIC0gUHJvcGVydHlGaWxlU25pdGNoOgorIyAgICBQcm94aW1pdHkgaXMgZGV0ZXJtaW5lZCBieSByYWNrIGFuZCBkYXRhIGNlbnRlciwgd2hpY2ggYXJlCisjICAgIGV4cGxpY2l0bHkgY29uZmlndXJlZCBpbiBjYXNzYW5kcmEtdG9wb2xvZ3kucHJvcGVydGllcy4KKyMgIC0gRWMyU25pdGNoOgorIyAgICBBcHByb3ByaWF0ZSBmb3IgRUMyIGRlcGxveW1lbnRzIGluIGEgc2luZ2xlIFJlZ2lvbi4gTG9hZHMgUmVnaW9uCisjICAgIGFuZCBBdmFpbGFiaWxpdHkgWm9uZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBFQzIgQVBJLiBUaGUgUmVnaW9uIGlzCisjICAgIHRyZWF0ZWQgYXMgdGhlIGRhdGFjZW50ZXIsIGFuZCB0aGUgQXZhaWxhYmlsaXR5IFpvbmUgYXMgdGhlIHJhY2suCisjICAgIE9ubHkgcHJpdmF0ZSBJUHMgYXJlIHVzZWQsIHNvIHRoaXMgd2lsbCBub3Qgd29yayBhY3Jvc3MgbXVsdGlwbGUKKyMgICAgUmVnaW9ucy4KKyMgIC0gRWMyTXVsdGlSZWdpb25Tbml0Y2g6CisjICAgIFVzZXMgcHVibGljIElQcyBhcyBicm9hZGNhc3RfYWRkcmVzcyB0byBhbGxvdyBjcm9zcy1yZWdpb24KKyMgICAgY29ubmVjdGl2aXR5LiAgKFRodXMsIHlvdSBzaG91bGQgc2V0IHNlZWQgYWRkcmVzc2VzIHRvIHRoZSBwdWJsaWMKKyMgICAgSVAgYXMgd2VsbC4pIFlvdSB3aWxsIG5lZWQgdG8gb3BlbiB0aGUgc3RvcmFnZV9wb3J0IG9yCisjICAgIHNzbF9zdG9yYWdlX3BvcnQgb24gdGhlIHB1YmxpYyBJUCBmaXJld2FsbC4gIChGb3IgaW50cmEtUmVnaW9uCisjICAgIHRyYWZmaWMsIENhc3NhbmRyYSB3aWxsIHN3aXRjaCB0byB0aGUgcHJpdmF0ZSBJUCBhZnRlcgorIyAgICBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uLikKKyMgIC0gUmFja0luZmVycmluZ1NuaXRjaDoKKyMgICAgUHJveGltaXR5IGlzIGRldGVybWluZWQgYnkgcmFjayBhbmQgZGF0YSBjZW50ZXIsIHdoaWNoIGFyZQorIyAgICBhc3N1bWVkIHRvIGNvcnJlc3BvbmQgdG8gdGhlIDNyZCBhbmQgMm5kIG9jdGV0IG9mIGVhY2ggbm9kZSdzIElQCisjICAgIGFkZHJlc3MsIHJlc3BlY3RpdmVseS4gIFVubGVzcyB0aGlzIGhhcHBlbnMgdG8gbWF0Y2ggeW91cgorIyAgICBkZXBsb3ltZW50IGNvbnZlbnRpb25zLCB0aGlzIGlzIGJlc3QgdXNlZCBhcyBhbiBleGFtcGxlIG9mCisjICAgIHdyaXRpbmcgYSBjdXN0b20gU25pdGNoIGNsYXNzIGFuZCBpcyBwcm92aWRlZCBpbiB0aGF0IHNwaXJpdC4KKyMKKyMgWW91IGNhbiB1c2UgYSBjdXN0b20gU25pdGNoIGJ5IHNldHRpbmcgdGhpcyB0byB0aGUgZnVsbCBjbGFzcyBuYW1lCisjIG9mIHRoZSBzbml0Y2gsIHdoaWNoIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBvbiB5b3VyIGNsYXNzcGF0aC4KK2VuZHBvaW50X3NuaXRjaDogR29zc2lwaW5nUHJvcGVydHlGaWxlU25pdGNoCisKKyMgY29udHJvbHMgaG93IG9mdGVuIHRvIHBlcmZvcm0gdGhlIG1vcmUgZXhwZW5zaXZlIHBhcnQgb2YgaG9zdCBzY29yZQorIyBjYWxjdWxhdGlvbgorZHluYW1pY19zbml0Y2hfdXBkYXRlX2ludGVydmFsX2luX21zOiAxMDAKKyMgY29udHJvbHMgaG93IG9mdGVuIHRvIHJlc2V0IGFsbCBob3N0IHNjb3JlcywgYWxsb3dpbmcgYSBiYWQgaG9zdCB0bworIyBwb3NzaWJseSByZWNvdmVyCitkeW5hbWljX3NuaXRjaF9yZXNldF9pbnRlcnZhbF9pbl9tczogNjAwMDAwCisjIGlmIHNldCBncmVhdGVyIHRoYW4gemVybyBhbmQgcmVhZF9yZXBhaXJfY2hhbmNlIGlzIDwgMS4wLCB0aGlzIHdpbGwgYWxsb3cKKyMgJ3Bpbm5pbmcnIG9mIHJlcGxpY2FzIHRvIGhvc3RzIGluIG9yZGVyIHRvIGluY3JlYXNlIGNhY2hlIGNhcGFjaXR5LgorIyBUaGUgYmFkbmVzcyB0aHJlc2hvbGQgd2lsbCBjb250cm9sIGhvdyBtdWNoIHdvcnNlIHRoZSBwaW5uZWQgaG9zdCBoYXMgdG8gYmUKKyMgYmVmb3JlIHRoZSBkeW5hbWljIHNuaXRjaCB3aWxsIHByZWZlciBvdGhlciByZXBsaWNhcyBvdmVyIGl0LiAgVGhpcyBpcworIyBleHByZXNzZWQgYXMgYSBkb3VibGUgd2hpY2ggcmVwcmVzZW50cyBhIHBlcmNlbnRhZ2UuICBUaHVzLCBhIHZhbHVlIG9mCisjIDAuMiBtZWFucyBDYXNzYW5kcmEgd291bGQgY29udGludWUgdG8gcHJlZmVyIHRoZSBzdGF0aWMgc25pdGNoIHZhbHVlcworIyB1bnRpbCB0aGUgcGlubmVkIGhvc3Qgd2FzIDIwJSB3b3JzZSB0aGFuIHRoZSBmYXN0ZXN0LgorZHluYW1pY19zbml0Y2hfYmFkbmVzc190aHJlc2hvbGQ6IDAuMQorCisjIHJlcXVlc3Rfc2NoZWR1bGVyIC0tIFNldCB0aGlzIHRvIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCisjIFJlcXVlc3RTY2hlZHVsZXIsIHdoaWNoIHdpbGwgc2NoZWR1bGUgaW5jb21pbmcgY2xpZW50IHJlcXVlc3RzCisjIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWMgcG9saWN5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktdGVuYW5jeQorIyB3aXRoIGEgc2luZ2xlIENhc3NhbmRyYSBjbHVzdGVyLgorIyBOT1RFOiBUaGlzIGlzIHNwZWNpZmljYWxseSBmb3IgcmVxdWVzdHMgZnJvbSB0aGUgY2xpZW50IGFuZCBkb2VzCisjIG5vdCBhZmZlY3QgaW50ZXIgbm9kZSBjb21tdW5pY2F0aW9uLgorIyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlZHVsZXIuTm9TY2hlZHVsZXIgLSBObyBzY2hlZHVsaW5nIHRha2VzIHBsYWNlCisjIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVkdWxlci5Sb3VuZFJvYmluU2NoZWR1bGVyIC0gUm91bmQgcm9iaW4gb2YKKyMgY2xpZW50IHJlcXVlc3RzIHRvIGEgbm9kZSB3aXRoIGEgc2VwYXJhdGUgcXVldWUgZm9yIGVhY2gKKyMgcmVxdWVzdF9zY2hlZHVsZXJfaWQuIFRoZSBzY2hlZHVsZXIgaXMgZnVydGhlciBjdXN0b21pemVkIGJ5CisjIHJlcXVlc3Rfc2NoZWR1bGVyX29wdGlvbnMgYXMgZGVzY3JpYmVkIGJlbG93LgorcmVxdWVzdF9zY2hlZHVsZXI6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVkdWxlci5Ob1NjaGVkdWxlcgorCisjIFNjaGVkdWxlciBPcHRpb25zIHZhcnkgYmFzZWQgb24gdGhlIHR5cGUgb2Ygc2NoZWR1bGVyCisjIE5vU2NoZWR1bGVyIC0gSGFzIG5vIG9wdGlvbnMKKyMgUm91bmRSb2JpbgorIyAgLSB0aHJvdHRsZV9saW1pdCAtLSBUaGUgdGhyb3R0bGVfbGltaXQgaXMgdGhlIG51bWJlciBvZiBpbi1mbGlnaHQKKyMgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgcGVyIGNsaWVudC4gIFJlcXVlc3RzIGJleW9uZAorIyAgICAgICAgICAgICAgICAgICAgICB0aGF0IGxpbWl0IGFyZSBxdWV1ZWQgdXAgdW50aWwKKyMgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyByZXF1ZXN0cyBjYW4gY29tcGxldGUuCisjICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiA4MCBoZXJlIGlzIHR3aWNlIHRoZSBudW1iZXIgb2YKKyMgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVudF9yZWFkcyArIGNvbmN1cnJlbnRfd3JpdGVzLgorIyAgLSBkZWZhdWx0X3dlaWdodCAtLSBkZWZhdWx0X3dlaWdodCBpcyBvcHRpb25hbCBhbmQgYWxsb3dzIGZvcgorIyAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHdoaWNoIGlzIDEuCisjICAtIHdlaWdodHMgLS0gV2VpZ2h0cyBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byAxIG9yIHRoZQorIyAgICAgICAgICAgICAgIG92ZXJyaWRkZW4gZGVmYXVsdF93ZWlnaHQuIFRoZSB3ZWlnaHQgdHJhbnNsYXRlcyBpbnRvIGhvdworIyAgICAgICAgICAgICAgIG1hbnkgcmVxdWVzdHMgYXJlIGhhbmRsZWQgZHVyaW5nIGVhY2ggdHVybiBvZiB0aGUKKyMgICAgICAgICAgICAgICBSb3VuZFJvYmluLCBiYXNlZCBvbiB0aGUgc2NoZWR1bGVyIGlkLgorIworIyByZXF1ZXN0X3NjaGVkdWxlcl9vcHRpb25zOgorIyAgICB0aHJvdHRsZV9saW1pdDogODAKKyMgICAgZGVmYXVsdF93ZWlnaHQ6IDUKKyMgICAgd2VpZ2h0czoKKyMgICAgICBLZXlzcGFjZTE6IDEKKyMgICAgICBLZXlzcGFjZTI6IDUKKworIyByZXF1ZXN0X3NjaGVkdWxlcl9pZCAtLSBBbiBpZGVudGlmaWVyIGJhc2VkIG9uIHdoaWNoIHRvIHBlcmZvcm0KKyMgdGhlIHJlcXVlc3Qgc2NoZWR1bGluZy4gQ3VycmVudGx5IHRoZSBvbmx5IHZhbGlkIG9wdGlvbiBpcyBrZXlzcGFjZS4KKyMgcmVxdWVzdF9zY2hlZHVsZXJfaWQ6IGtleXNwYWNlCisKKyMgRW5hYmxlIG9yIGRpc2FibGUgaW50ZXItbm9kZSBlbmNyeXB0aW9uCisjIERlZmF1bHQgc2V0dGluZ3MgYXJlIFRMUyB2MSwgUlNBIDEwMjQtYml0IGtleXMgKGl0IGlzIGltcGVyYXRpdmUgdGhhdAorIyB1c2VycyBnZW5lcmF0ZSB0aGVpciBvd24ga2V5cykgVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSBhcyB0aGUgY2lwaGVyCisjIHN1aXRlIGZvciBhdXRoZW50aWNhdGlvbiwga2V5IGV4Y2hhbmdlIGFuZCBlbmNyeXB0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlcnMuCisjIFVzZSB0aGUgREhFL0VDREhFIGNpcGhlcnMgaWYgcnVubmluZyBpbiBGSVBTIDE0MCBjb21wbGlhbnQgbW9kZS4KKyMgTk9URTogTm8gY3VzdG9tIGVuY3J5cHRpb24gb3B0aW9ucyBhcmUgZW5hYmxlZCBhdCB0aGUgbW9tZW50CisjIFRoZSBhdmFpbGFibGUgaW50ZXJub2RlIG9wdGlvbnMgYXJlIDogYWxsLCBub25lLCBkYywgcmFjaworIworIyBJZiBzZXQgdG8gZGMgY2Fzc2FuZHJhIHdpbGwgZW5jcnlwdCB0aGUgdHJhZmZpYyBiZXR3ZWVuIHRoZSBEQ3MKKyMgSWYgc2V0IHRvIHJhY2sgY2Fzc2FuZHJhIHdpbGwgZW5jcnlwdCB0aGUgdHJhZmZpYyBiZXR3ZWVuIHRoZSByYWNrcworIworIyBUaGUgcGFzc3dvcmRzIHVzZWQgaW4gdGhlc2Ugb3B0aW9ucyBtdXN0IG1hdGNoIHRoZSBwYXNzd29yZHMgdXNlZCB3aGVuIGdlbmVyYXRpbmcKKyMgdGhlIGtleXN0b3JlIGFuZCB0cnVzdHN0b3JlLiAgRm9yIGluc3RydWN0aW9ucyBvbiBnZW5lcmF0aW5nIHRoZXNlIGZpbGVzLCBzZWU6CisjIGh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zZWN1cml0eS9qc3NlL0pTU0VSZWZHdWlkZS5odG1sI0NyZWF0ZUtleXN0b3JlCisjCitzZXJ2ZXJfZW5jcnlwdGlvbl9vcHRpb25zOgorICAgIGludGVybm9kZV9lbmNyeXB0aW9uOiBub25lCisgICAga2V5c3RvcmU6IDwlPSBAY2Fzc2FuZHJhX3RydXN0c3RvcmVfZGlyICU+Ly5rZXlzdG9yZQorICAgIGtleXN0b3JlX3Bhc3N3b3JkOiBBYTEyMzQ1NgorICAgIHRydXN0c3RvcmU6IDwlPSBAY2Fzc2FuZHJhX3RydXN0c3RvcmVfZGlyICU+Ly50cnVzdHN0b3JlCisgICAgdHJ1c3RzdG9yZV9wYXNzd29yZDogQWExMjM0NTYKKyAgICAjIE1vcmUgYWR2YW5jZWQgZGVmYXVsdHMgYmVsb3c6CisgICAgIyBwcm90b2NvbDogVExTCisgICAgIyBhbGdvcml0aG06IFN1blg1MDkKKyAgICAjIHN0b3JlX3R5cGU6IEpLUworICAgICMgY2lwaGVyX3N1aXRlczogW1RMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSxUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSxUTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSxUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEFdCisgICAgIyByZXF1aXJlX2NsaWVudF9hdXRoOiBmYWxzZQorCisjIGVuYWJsZSBvciBkaXNhYmxlIGNsaWVudC9zZXJ2ZXIgZW5jcnlwdGlvbi4KK2NsaWVudF9lbmNyeXB0aW9uX29wdGlvbnM6CisgICAgZW5hYmxlZDogZmFsc2UKKyAgICBrZXlzdG9yZTogPCU9IEBjYXNzYW5kcmFfdHJ1c3RzdG9yZV9kaXIgJT4vLmtleXN0b3JlCisgICAga2V5c3RvcmVfcGFzc3dvcmQ6IEFhMTIzNDU2CisgICAgIyByZXF1aXJlX2NsaWVudF9hdXRoOiBmYWxzZQorICAgICMgU2V0IHRydXN0b3JlIGFuZCB0cnVzdHN0b3JlX3Bhc3N3b3JkIGlmIHJlcXVpcmVfY2xpZW50X2F1dGggaXMgdHJ1ZQorICAgICMgdHJ1c3RzdG9yZTogY29uZi8udHJ1c3RzdG9yZQorICAgICMgdHJ1c3RzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCisgICAgIyBNb3JlIGFkdmFuY2VkIGRlZmF1bHRzIGJlbG93OgorICAgICMgcHJvdG9jb2w6IFRMUworICAgICMgYWxnb3JpdGhtOiBTdW5YNTA5CisgICAgIyBzdG9yZV90eXBlOiBKS1MKKyAgICAjIGNpcGhlcl9zdWl0ZXM6IFtUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLFRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSxUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBXQorCisjIGludGVybm9kZV9jb21wcmVzc2lvbiBjb250cm9scyB3aGV0aGVyIHRyYWZmaWMgYmV0d2VlbiBub2RlcyBpcworIyBjb21wcmVzc2VkLgorIyBjYW4gYmU6ICBhbGwgIC0gYWxsIHRyYWZmaWMgaXMgY29tcHJlc3NlZAorIyAgICAgICAgICBkYyAgIC0gdHJhZmZpYyBiZXR3ZWVuIGRpZmZlcmVudCBkYXRhY2VudGVycyBpcyBjb21wcmVzc2VkCisjICAgICAgICAgIG5vbmUgLSBub3RoaW5nIGlzIGNvbXByZXNzZWQuCitpbnRlcm5vZGVfY29tcHJlc3Npb246IGFsbAorCisjIEVuYWJsZSBvciBkaXNhYmxlIHRjcF9ub2RlbGF5IGZvciBpbnRlci1kYyBjb21tdW5pY2F0aW9uLgorIyBEaXNhYmxpbmcgaXQgd2lsbCByZXN1bHQgaW4gbGFyZ2VyIChidXQgZmV3ZXIpIG5ldHdvcmsgcGFja2V0cyBiZWluZyBzZW50LAorIyByZWR1Y2luZyBvdmVyaGVhZCBmcm9tIHRoZSBUQ1AgcHJvdG9jb2wgaXRzZWxmLCBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nCisjIGxhdGVuY3kgaWYgeW91IGJsb2NrIGZvciBjcm9zcy1kYXRhY2VudGVyIHJlc3BvbnNlcy4KK2ludGVyX2RjX3RjcF9ub2RlbGF5OiBmYWxzZQorCisjIEdDIFBhdXNlcyBncmVhdGVyIHRoYW4gZ2Nfd2Fybl90aHJlc2hvbGRfaW5fbXMgd2lsbCBiZSBsb2dnZWQgYXQgV0FSTiBsZXZlbAorIyBBZGp1c3QgdGhlIHRocmVzaG9sZCBiYXNlZCBvbiB5b3VyIGFwcGxpY2F0aW9uIHRocm91Z2hwdXQgcmVxdWlyZW1lbnQKKyMgQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIGxvZ3MgR0MgUGF1c2VzIGdyZWF0ZXIgdGhhbiAyMDAgbXMgYXQgSU5GTyBsZXZlbAorIyBnY193YXJuX3RocmVzaG9sZF9pbl9tczogMTAwMApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3RlbXBsYXRlcy9kZWZhdWx0L2NvbmZpZ3VyYXRpb24ueWFtbC5lcmIgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY29uZmlndXJhdGlvbi55YW1sLmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzNlY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3RlbXBsYXRlcy9kZWZhdWx0L2NvbmZpZ3VyYXRpb24ueWFtbC5lcmIKQEAgLTAsMCArMSw0NTkgQEAKK2lkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOgorICAgLSBIVFRQX0lWX1VTRVIKKyAgIC0gSFRUUF9DU1BfRklSU1ROQU1FCisgICAtIEhUVFBfQ1NQX0xBU1ROQU1FCisgICAtIEhUVFBfSVZfUkVNT1RFX0FERFJFU1MKKyAgIC0gSFRUUF9DU1BfV1NUWVBFCisKKworIyBjYXRhbG9nIGJhY2tlbmQgaG9zdG5hbWUKK2JlRnFkbjogPCU9IEBob3N0X2lwICU+CisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgcG9ydAorYmVIdHRwUG9ydDogPCU9IEBjYXRhbG9nX3BvcnQgJT4KKworIyBjYXRhbG9nIGJhY2tlbmQgaHR0cCBjb250ZXh0CitiZUNvbnRleHQ6IC9zZGMvcmVzdC9jb25maWcvZ2V0CisKKyMgY2F0YWxvZyBiYWNrZW5kIHByb3RvY29sCitiZVByb3RvY29sOiBodHRwCisKKyMgY2F0YWxvZyBiYWNrZW5kIHNzbCBwb3J0CitiZVNzbFBvcnQ6IDwlPSBAc3NsX3BvcnQgJT4KK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKwordGl0YW5DZmdGaWxlOiAvdmFyL2xpYi9qZXR0eS9jb25maWcvY2F0YWxvZy1iZS90aXRhbi5wcm9wZXJ0aWVzCit0aXRhbkluTWVtb3J5R3JhcGg6IGZhbHNlCit0aXRhbkxvY2tUaW1lb3V0OiAxODAwCisjIFRoZSBpbnRlcnZhbCB0byB0cnkgYW5kIHJlY29ubmVjdCB0byB0aXRhbiBEQiB3aGVuIGl0IGlzIGRvd24gZHVyaW5nIEFTREMgc3RhcnR1cDoKK3RpdGFuUmVjb25uZWN0SW50ZXJ2YWxJblNlY29uZHM6IDMKKworIyBUaGUgcmVhZCB0aW1lb3V0IHRvd2FyZHMgVGl0YW4gREIgd2hlbiBoZWFsdGggY2hlY2sgaXMgaW52b2tlZDoKK3RpdGFuSGVhbHRoQ2hlY2tSZWFkVGltZW91dDogMQorCisjIFRoZSBpbnRlcnZhbCB0byB0cnkgYW5kIHJlY29ubmVjdCB0byBFbGFzdGljc2VhcmNoIHdoZW4gaXQgaXMgZG93biBkdXJpbmcgQVNEQyBzdGFydHVwOgorCitlc1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOiAzCit1ZWJIZWFsdGhDaGVja1JlY29ubmVjdEludGVydmFsSW5TZWNvbmRzOiAxNQordWViSGVhbHRoQ2hlY2tSZWFkVGltZW91dDogNAorCisjIFByb3RvY29scworcHJvdG9jb2xzOgorICAgLSBodHRwCisgICAtIGh0dHBzCisKKyMgVXNlcnMKK3VzZXJzOgorICAgIHRvbTogcGFzc3dkCisgICAgYm9iOiBwYXNzd2QKKworCitjYXNzYW5kcmFDb25maWc6CisgICAgY2Fzc2FuZHJhSG9zdHM6IFs8JT0gQGNhc3NhbmRyYV9pcCAlPl0KKyAgICBsb2NhbERhdGFDZW50ZXI6CisgICAgcmVjb25uZWN0VGltZW91dCA6IDMwMDAwCisgICAgYXV0aGVudGljYXRlOiB0cnVlCisgICAgdXNlcm5hbWU6IGFzZGNfdXNlcgorICAgIHBhc3N3b3JkOiBBYTEyMzQlXiEKKyAgICBzc2w6IGZhbHNlCisgICAgdHJ1c3RzdG9yZVBhdGggOiAvY29uZmlnLy50cnVzdHN0b3JlCisgICAgdHJ1c3RzdG9yZVBhc3N3b3JkIDogQWExMjM0NTYKKyAgICBrZXlTcGFjZXM6CisgICAgICAgIC0geyBuYW1lOiBkb3gsIHJlcGxpY2F0aW9uU3RyYXRlZ3k6IE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5LCByZXBsaWNhdGlvbkluZm86IFsnPCU9IEBkYzEgJT4nLCc8JT0gQHJlcF9mYWN0b3IgJT4nXX0KKyAgICAgICAgLSB7IG5hbWU6IHNkY2F1ZGl0LCByZXBsaWNhdGlvblN0cmF0ZWd5OiBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSwgcmVwbGljYXRpb25JbmZvOiBbJzwlPSBAZGMxICU+JywnPCU9IEByZXBfZmFjdG9yICU+J119CisgICAgICAgIC0geyBuYW1lOiBzZGNhcnRpZmFjdCwgcmVwbGljYXRpb25TdHJhdGVneTogTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3ksIHJlcGxpY2F0aW9uSW5mbzogWyc8JT0gQGRjMSAlPicsJzwlPSBAcmVwX2ZhY3RvciAlPiddfQorICAgICAgICAtIHsgbmFtZTogc2RjY29tcG9uZW50LCByZXBsaWNhdGlvblN0cmF0ZWd5OiBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSwgcmVwbGljYXRpb25JbmZvOiBbJzwlPSBAZGMxICU+JywnPCU9IEByZXBfZmFjdG9yICU+J119CisKKyNBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZXR0aW5ncyBvZiBFUworZWxhc3RpY1NlYXJjaDoKKyAgICAjIE1hcHBpbmcgb2YgaW5kZXggcHJlZml4IHRvIHRpbWUtYmFzZWQgZnJhbWUuIEZvciBleGFtcGxlLCBpZiBiZWxvdyBpcyBjb25maWd1cmVkOgorICAgICMKKyAgICAjIC0gaW5kZXhQcmVmaXg6IGF1ZGl0aW5nZXZlbnRzCisgICAgIyAgICBjcmVhdGlvblBlcmlvZDogbWludXRlCisgICAgIworICAgICMgdGhlbiBFUyBvYmplY3Qgb2YgdHlwZSB3aGljaCBpcyBtYXBwZWQgdG8gImF1ZGl0aW5nZXZlbnRzLSoiIHRlbXBsYXRlLCBhbmQgY3JlYXRlZCBvbiAyMDE1LTEyLTIzIDEzOjI0OjU0LCB3aWxsIGVudGVyICJhdWRpdGluZ2V2ZW50cy0yMDE1LTEyLTIzLTEzLTI0IiBpbmRleC4KKyAgICAjIEFub3RoZXIgb2JqZWN0IGNyZWF0ZWQgb24gMjAxNS0xMi0yMyAxMzoyNTo1NCwgd2lsbCBlbnRlciAiYXVkaXRpbmdldmVudHMtMjAxNS0xMi0yMy0xMy0yNSIgaW5kZXguCisgICAgIyBJZiBjcmVhdGlvblBlcmlvZDogbW9udGgsIGJvdGggb2YgdGhlIGFib3ZlIHdpbGwgZW50ZXIgImF1ZGl0aW5nZXZlbnRzLTIwMTUtMTIiIGluZGV4LgorICAgICMKKyAgICAjIFBMRUFTRSBOT1RFOiB0aGUgdGltZXN0YW1wcyBhcmUgY3JlYXRlZCBpbiBVVEMvR01UIHRpbWV6b25lISBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IHRpbWVzdGFtcHMgd2lsbCBiZSBjb3JyZWN0bHkgcHJlc2VudGVkIGluIEtpYmFuYS4KKyAgICAjCisgICAgIyBMZWdhbCB2YWx1ZXMgZm9yIGNyZWF0aW9uUGVyaW9kIC0geWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBub25lIChtZWFuaW5nIG5vIHRpbWUtYmFzZWQgYmVoYXZpb3VyKS4KKyAgICAjCisgICAgIyBJZiBubyBjcmVhdGlvblBlcmlvZCBpcyBjb25maWd1cmVkIGZvciBpbmRleFByZWZpeCwgZGVmYXVsdCBiZWhhdm91ciBpcyBjcmVhdGlvblBlcmlvZDogbW9udGguCisKKyAgICBpbmRpY2VzVGltZUZyZXF1ZW5jeToKKyAgICAgIC0gaW5kZXhQcmVmaXg6IGF1ZGl0aW5nZXZlbnRzCisgICAgICAgIGNyZWF0aW9uUGVyaW9kOiBtb250aAorICAgICAgLSBpbmRleFByZWZpeDogbW9uaXRvcmluZ19ldmVudHMKKyAgICAgICAgY3JlYXRpb25QZXJpb2Q6IG1vbnRoCithcnRpZmFjdFR5cGVzOgorICAgLSBDSEVGCisgICAtIFBVUFBFVAorICAgLSBTSEVMTAorICAgLSBZQU5HCisgICAtIFlBTkdfWE1MCisgICAtIEhFQVQKKyAgIC0gQlBFTAorICAgLSBER19YTUwKKyAgIC0gTVVSQU5PX1BLRworICAgLSBXT1JLRkxPVworICAgLSBORVRXT1JLX0NBTExfRkxPVworICAgLSBUT1NDQV9URU1QTEFURQorICAgLSBUT1NDQV9DU0FSCisgICAtIEFBSV9TRVJWSUNFX01PREVMCisgICAtIEFBSV9WRl9NT0RFTAorICAgLSBBQUlfVkZfTU9EVUxFX01PREVMCisgICAtIEFBSV9WRl9JTlNUQU5DRV9NT0RFTAorICAgLSBPVEhFUgorCisKK2xpY2Vuc2VUeXBlczoKKyAgIC0gVXNlcgorICAgLSBJbnN0YWxsYXRpb24KKyAgIC0gQ1BVCisKKyNEZXBsb3ltZW50IGFydGlmYWN0cyBwbGFjZUhvbGRlcgorcmVzb3VyY2VUeXBlczogJmFsbFJlc291cmNlVHlwZXMKKyAgLSBWRkMKKyAgLSBDUAorICAtIFZMCisgIC0gVkYKKworIyB2YWxpZEZvclJlc291cmNlVHlwZXMgdXNhZ2UKKyMgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyMgICAgICAgIC0gVkYKKyMgICAgICAgIC0gVkwKK2RlcGxveW1lbnRSZXNvdXJjZUFydGlmYWN0czoKKworCitkZXBsb3ltZW50UmVzb3VyY2VJbnN0YW5jZUFydGlmYWN0czoKKyAgaGVhdEVudjoKKyAgICAgIGRpc3BsYXlOYW1lOiAiSEVBVCBFTlYiCisgICAgICB0eXBlOiBIRUFUX0VOVgorICAgICAgZGVzY3JpcHRpb246ICJBdXRvLWdlbmVyYXRlZCBIRUFUIEVudmlyb25tZW50IGRlcGxveW1lbnQgYXJ0aWZhY3QiCisgICAgICBmaWxlRXh0ZW5zaW9uOiAiZW52IgorCisjdG9zY2EgYXJ0aWZhY3RzIHBsYWNlaG9sZGVycwordG9zY2FBcnRpZmFjdHM6CisgIGFzc2V0VG9zY2FUZW1wbGF0ZToKKyAgICAgIGFydGlmYWN0TmFtZTogLXRlbXBsYXRlLnltbAorICAgICAgZGlzcGxheU5hbWU6IFRvc2NhIFRlbXBsYXRlCisgICAgICB0eXBlOiBUT1NDQV9URU1QTEFURQorICAgICAgZGVzY3JpcHRpb246IFRPU0NBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhc3NldAorICBhc3NldFRvc2NhQ3NhcjoKKyAgICAgIGFydGlmYWN0TmFtZTogLWNzYXIuY3NhcgorICAgICAgZGlzcGxheU5hbWU6IFRvc2NhIE1vZGVsCisgICAgICB0eXBlOiBUT1NDQV9DU0FSCisgICAgICBkZXNjcmlwdGlvbjogVE9TQ0EgZGVmaW5pdGlvbiBwYWNrYWdlIG9mIHRoZSBhc3NldAorCisjSW5mb3JtYXRpb25hbCBhcnRpZmFjdHMgcGxhY2VIb2xkZXIKK2V4Y2x1ZGVSZXNvdXJjZUNhdGVnb3J5OgorICAtIEdlbmVyaWMKK2luZm9ybWF0aW9uYWxSZXNvdXJjZUFydGlmYWN0czoKKyAgZmVhdHVyZXM6CisgICAgICBkaXNwbGF5TmFtZTogRmVhdHVyZXMKKyAgICAgIHR5cGU6IE9USEVSCisgIGNhcGFjaXR5OgorICAgICAgZGlzcGxheU5hbWU6IENhcGFjaXR5CisgICAgICB0eXBlOiBPVEhFUgorICB2ZW5kb3JUZXN0UmVzdWx0OgorICAgICAgZGlzcGxheU5hbWU6IFZlbmRvciBUZXN0IFJlc3VsdAorICAgICAgdHlwZTogT1RIRVIKKyAgdGVzdFNjcmlwdHM6CisgICAgICBkaXNwbGF5TmFtZTogVGVzdCBTY3JpcHRzCisgICAgICB0eXBlOiBPVEhFUgorICBjbG91ZFF1ZXN0aW9ubmFpcmU6CisgICAgICBkaXNwbGF5TmFtZTogQ2xvdWQgUXVlc3Rpb25uYWlyZSAoY29tcGxldGVkKQorICAgICAgdHlwZTogT1RIRVIKKyAgSEVBVFRlbXBsYXRlRnJvbVZlbmRvcjoKKyAgICAgIGRpc3BsYXlOYW1lOiBIRUFUIFRlbXBsYXRlIGZyb20gVmVuZG9yCisgICAgICB0eXBlOiBIRUFUCisgIHJlc291cmNlU2VjdXJpdHlUZW1wbGF0ZToKKyAgICAgIGRpc3BsYXlOYW1lOiBSZXNvdXJjZSBTZWN1cml0eSBUZW1wbGF0ZQorICAgICAgdHlwZTogT1RIRVIKKworZXhjbHVkZVNlcnZpY2VDYXRlZ29yeToKKworaW5mb3JtYXRpb25hbFNlcnZpY2VBcnRpZmFjdHM6CisgIHNlcnZpY2VBcnRpZmFjdFBsYW46CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZSBBcnRpZmFjdCBQbGFuCisgICAgICB0eXBlOiBPVEhFUgorICBzdW1tYXJ5T2ZJbXBhY3RzVG9FQ09NUEVsZW1lbnRzOgorICAgICAgZGlzcGxheU5hbWU6IFN1bW1hcnkgb2YgaW1wYWN0cyB0byBFQ09NUCBlbGVtZW50cyxPU1NzLCBCU1NzCisgICAgICB0eXBlOiBPVEhFUgorICBjb250cm9sTG9vcEZ1bmN0aW9uczoKKyAgICAgIGRpc3BsYXlOYW1lOiBDb250cm9sIExvb3AgRnVuY3Rpb25zCisgICAgICB0eXBlOiBPVEhFUgorICBkaW1lbnNpb25pbmdJbmZvOgorICAgICAgZGlzcGxheU5hbWU6IERpbWVuc2lvbmluZyBJbmZvCisgICAgICB0eXBlOiBPVEhFUgorICBhZmZpbml0eVJ1bGVzOgorICAgICAgZGlzcGxheU5hbWU6IEFmZmluaXR5IFJ1bGVzCisgICAgICB0eXBlOiBPVEhFUgorICBvcGVyYXRpb25hbFBvbGljaWVzOgorICAgICAgZGlzcGxheU5hbWU6IE9wZXJhdGlvbmFsIFBvbGljaWVzCisgICAgICB0eXBlOiBPVEhFUgorICBzZXJ2aWNlU3BlY2lmaWNQb2xpY2llczoKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlLXNwZWNpZmljIFBvbGljaWVzCisgICAgICB0eXBlOiBPVEhFUgorICBlbmdpbmVlcmluZ1J1bGVzOgorICAgICAgZGlzcGxheU5hbWU6IEVuZ2luZWVyaW5nIFJ1bGVzIChFUkQpCisgICAgICB0eXBlOiBPVEhFUgorICBkaXN0cmlidXRpb25JbnN0cnVjdGlvbnM6CisgICAgICBkaXNwbGF5TmFtZTogRGlzdHJpYnV0aW9uIEluc3RydWN0aW9ucworICAgICAgdHlwZTogT1RIRVIKKyAgY2VydGlmaWNhdGlvblRlc3RSZXN1bHRzOgorICAgICAgZGlzcGxheU5hbWU6IFREIENlcnRpZmljYXRpb24gVGVzdCBSZXN1bHRzCisgICAgICB0eXBlOiBPVEhFUgorICBkZXBsb3ltZW50Vm90aW5nUmVjb3JkOgorICAgICAgZGlzcGxheU5hbWU6IERlcGxveW1lbnQgVm90aW5nIFJlY29yZAorICAgICAgdHlwZTogT1RIRVIKKyAgc2VydmljZVF1ZXN0aW9ubmFpcmU6CisgICAgICBkaXNwbGF5TmFtZTogU2VydmljZSBRdWVzdGlvbm5haXJlCisgICAgICB0eXBlOiBPVEhFUgorICBzZXJ2aWNlU2VjdXJpdHlUZW1wbGF0ZToKKyAgICAgIGRpc3BsYXlOYW1lOiBTZXJ2aWNlIFNlY3VyaXR5IFRlbXBsYXRlCisgICAgICB0eXBlOiBPVEhFUgorCitzZXJ2aWNlQXBpQXJ0aWZhY3RzOgorICBjb25maWd1cmF0aW9uOgorICAgICAgZGlzcGxheU5hbWU6IENvbmZpZ3VyYXRpb24KKyAgICAgIHR5cGU6IE9USEVSCisgIGluc3RhbnRpYXRpb246CisgICAgICBkaXNwbGF5TmFtZTogSW5zdGFudGlhdGlvbgorICAgICAgdHlwZTogT1RIRVIKKyAgbW9uaXRvcmluZzoKKyAgICAgIGRpc3BsYXlOYW1lOiBNb25pdG9yaW5nCisgICAgICB0eXBlOiBPVEhFUgorICByZXBvcnRpbmc6CisgICAgICBkaXNwbGF5TmFtZTogUmVwb3J0aW5nCisgICAgICB0eXBlOiBPVEhFUgorICBsb2dnaW5nOgorICAgICAgZGlzcGxheU5hbWU6IExvZ2dpbmcKKyAgICAgIHR5cGU6IE9USEVSCisgIHRlc3Rpbmc6CisgICAgICBkaXNwbGF5TmFtZTogVGVzdGluZworICAgICAgdHlwZTogT1RIRVIKKworCithZGRpdGlvbmFsSW5mb3JtYXRpb25NYXhOdW1iZXJPZktleXM6IDUwCisKK3N5c3RlbU1vbml0b3Jpbmc6CisgICAgZW5hYmxlZDogdHJ1ZQorICAgIGlzUHJveHk6IGZhbHNlCisgICAgcHJvYmVJbnRlcnZhbEluU2Vjb25kczogMTUKK2RlZmF1bHRIZWF0QXJ0aWZhY3RUaW1lb3V0TWludXRlczogNjAKKworc2VydmljZURlcGxveW1lbnRBcnRpZmFjdHM6CisgICAgWUFOR19YTUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIFZORl9DQVRBTE9HOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICBNT0RFTF9JTlZFTlRPUllfUFJPRklMRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgTU9ERUxfUVVFUllfU1BFQzoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgQUFJX1NFUlZJQ0VfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIEFBSV9WRl9NT0RVTEVfTU9ERUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgIEFBSV9WRl9JTlNUQU5DRV9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgT1RIRVI6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisKKworcmVzb3VyY2VEZXBsb3ltZW50QXJ0aWZhY3RzOgorICAgIEhFQVQ6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHlhbWwKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBIRUFUX1ZPTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geWFtbAorICAgICAgICAgICAgLSB5bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEhFQVRfTkVUOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB5YW1sCisgICAgICAgICAgICAtIHltbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgSEVBVF9ORVNURUQ6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHlhbWwKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBIRUFUX0FSVElGQUNUOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgWUFOR19YTUw6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgVk5GX0NBVEFMT0c6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIHhtbAorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisgICAgVkZfTElDRU5TRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBWRU5ET1JfTElDRU5TRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBNT0RFTF9JTlZFTlRPUllfUFJPRklMRToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczogKmFsbFJlc291cmNlVHlwZXMKKyAgICBNT0RFTF9RVUVSWV9TUEVDOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOiAqYWxsUmVzb3VyY2VUeXBlcworICAgIEFQUENfQ09ORklHOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisgICAgI0RDQUUgQXJ0aWZhY3RzCisgICAgRENBRV9UT1NDQToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgICAgICAtIHlhbWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIERDQUVfSlNPTjoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0ganNvbgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisgICAgRENBRV9QT0xJQ1k6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgICAgICAtIGVtZgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisgICAgRENBRV9ET0M6CisgICAgICAgIGFjY2VwdGVkVHlwZXM6CisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyAgICBEQ0FFX0VWRU5UOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6CisgICAgICAgICAgICAtIFZGCisjQUFJIEFydGlmYWN0cworICAgIEFBSV9WRl9NT0RFTDoKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geG1sCisgICAgICAgIHZhbGlkRm9yUmVzb3VyY2VUeXBlczoKKyAgICAgICAgICAgIC0gVkYKKyAgICBBQUlfVkZfTU9EVUxFX01PREVMOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSB4bWwKKyAgICAgICAgdmFsaWRGb3JSZXNvdXJjZVR5cGVzOgorICAgICAgICAgICAgLSBWRgorICAgIE9USEVSOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICB2YWxpZEZvclJlc291cmNlVHlwZXM6ICphbGxSZXNvdXJjZVR5cGVzCisKK3Jlc291cmNlSW5zdGFuY2VEZXBsb3ltZW50QXJ0aWZhY3RzOgorICAgIEhFQVRfRU5WOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBlbnYKKyAgICBWRl9NT0RVTEVTX01FVEFEQVRBOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBqc29uCisjRENBRV9WRiBJbnN0YW5jZSBBcnRpZmFjdHMKKyAgICBEQ0FFX0lOVkVOVE9SWV9UT1NDQToKKyAgICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0geW1sCisgICAgICAgICAgICAtIHlhbWwKKyAgICBEQ0FFX0lOVkVOVE9SWV9KU09OOgorICAgICAgICBhY2NlcHRlZFR5cGVzOgorICAgICAgICAgICAgLSBqc29uCisgICAgRENBRV9JTlZFTlRPUllfUE9MSUNZOgorICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICAgICAgICAgIC0gZW1mCisgICAgRENBRV9JTlZFTlRPUllfRE9DOgorICAgICAgYWNjZXB0ZWRUeXBlczoKKyAgICBEQ0FFX0lOVkVOVE9SWV9CTFVFUFJJTlQ6CisgICAgICBhY2NlcHRlZFR5cGVzOgorICAgIERDQUVfSU5WRU5UT1JZX0VWRU5UOgorICAgICAgYWNjZXB0ZWRUeXBlczoKK3Jlc291cmNlSW5mb3JtYXRpb25hbERlcGxveWVkQXJ0aWZhY3RzOgorCisKK3JlcXVpcmVtZW50c1RvRnVsZmlsbEJlZm9yZUNlcnQ6CisKK2NhcGFiaWxpdGllc1RvQ29uc3VtZUJlZm9yZUNlcnQ6CisKK3VuTG9nZ2VkVXJsczoKKyAgIC0gL3NkYzIvcmVzdC9oZWFsdGhDaGVjaworCitjbGVhbkNvbXBvbmVudHNDb25maWd1cmF0aW9uOgorICAgIGNsZWFuSW50ZXJ2YWxJbk1pbnV0ZXM6IDE0NDAKKyAgICBjb21wb25lbnRzVG9DbGVhbjoKKyAgICAgICAtIFJlc291cmNlCisgICAgICAgLSBTZXJ2aWNlCisKK2FydGlmYWN0c0luZGV4OiByZXNvdXJjZXMKKworaGVhdEVudkFydGlmYWN0SGVhZGVyOgorICAgICIiCitoZWF0RW52QXJ0aWZhY3RGb290ZXI6CisgICAgIiIKKworb25ib2FyZGluZzoKKyAgICBwcm90b2NvbDogaHR0cAorICAgIGhvc3Q6IDwlPSBAaG9zdF9pcCAlPgorICAgIHBvcnQ6IDwlPSBAY2F0YWxvZ19wb3J0ICU+CisgICAgZG93bmxvYWRDc2FyVXJpOiAiL29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLXNvZnR3YXJlLXByb2R1Y3RzL3BhY2thZ2VzIgorCisKKyMgI0dTUyBJRE5TCitzd2l0Y2hvdmVyRGV0ZWN0b3I6CisgICAgZ0JlRnFkbjogCisgICAgZ0ZlRnFkbjogCisgICAgYmVWaXA6IDEuMi4zLjQKKyAgICBmZVZpcDogMS4yLjMuNAorICAgIGJlUmVzb2x2ZUF0dGVtcHRzOiAzCisgICAgZmVSZXNvbHZlQXR0ZW1wdHM6IDMKKyAgICBlbmFibGVkOiBmYWxzZQorICAgIGludGVydmFsOiA2MAorICAgIGNoYW5nZVByaW9yaXR5VXNlcjogZWNvbXBhc2RjCisgICAgY2hhbmdlUHJpb3JpdHlQYXNzd29yZDogZWNvbXBhc2RjMTIzCisgICAgcHVibGlzaE5ldHdvcmtVcmw6IAorICAgIHB1Ymxpc2hOZXR3b3JrQm9keTogJ3sibm90ZSI6ImNvbW1lbnQifScKKyAgICBncm91cHM6CisgICAgICBiZVNldDogeyBjaGFuZ2VQcmlvcml0eVVybDogIiIsIGNoYW5nZVByaW9yaXR5Qm9keTogJ3sibmFtZSI6IiIsInVyaSI6IiIsIm5vX2FkX3JlZGlyZWN0aW9uIjpmYWxzZSwidjRncm91cHMiOnsiZmFpbG92ZXJfZ3JvdXBzIjpbIiIsIiIsImZhaWxvdmVyX3BvbGljeSI6WyJGQUlMQUxMIl19LCJjb21tZW50IjoiIiwiaW50ZW5kZWRfYXBwX3Byb3RvIjoiRE5TIn0nfQorICAgICAgZmVTZXQ6IHsgY2hhbmdlUHJpb3JpdHlVcmw6ICIiLCBjaGFuZ2VQcmlvcml0eUJvZHk6ICd7Im5hbWUiOiIiLCJ1cmkiOiIiLCJub19hZF9yZWRpcmVjdGlvbiI6ZmFsc2UsInY0Z3JvdXBzIjp7ImZhaWxvdmVyX2dyb3VwcyI6WyIiLCIiXSwiZmFpbG92ZXJfcG9saWN5IjpbIkZBSUxBTEwiXX0sImNvbW1lbnQiOiIiLCJpbnRlbmRlZF9hcHBfcHJvdG8iOiJETlMifSd9CisKK2FwcGxpY2F0aW9uTDFDYWNoZToKKyAgICBkYXRhdHlwZXM6CisgICAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICAgICAgZmlyc3RSdW5EZWxheTogMTAKKyAgICAgICAgcG9sbEludGVydmFsSW5TZWM6IDYwCisKK2FwcGxpY2F0aW9uTDJDYWNoZToKKyAgICBlbmFibGVkOiB0cnVlCisgICAgY2F0YWxvZ0wxQ2FjaGU6CisgICAgICAgIGVuYWJsZWQ6IHRydWUKKyAgICAgICAgcmVzb3VyY2VzU2l6ZUluQ2FjaGU6IDMwMAorICAgICAgICBzZXJ2aWNlc1NpemVJbkNhY2hlOiAyMDAKKyAgICAgICAgcHJvZHVjdHNTaXplSW5DYWNoZTogMTAwCisgICAgcXVldWU6CisgICAgICAgIHN5bmNJbnRlcnZhbEluU2Vjb25kZXM6IDQzMjAwCisgICAgICAgIHdhaXRPblNodXREb3duSW5NaW51dGVzOiAxMAorICAgICAgICBudW1iZXJPZkNhY2hlV29ya2VyczogNAorCit0b3NjYVZhbGlkYXRvcnM6CisgICAgc3RyaW5nTWF4TGVuZ3RoOiA2NTUzNgorCitkaXNhYmxlQXVkaXQ6IGZhbHNlCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY3JlYXRlX2Nhc3NhbmRyYV91c2VyLnNoLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1yZXBvL2Nvb2tib29rcy9jYXNzYW5kcmEtYWN0aW9ucy90ZW1wbGF0ZXMvZGVmYXVsdC9jcmVhdGVfY2Fzc2FuZHJhX3VzZXIuc2guZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTcyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY3JlYXRlX2Nhc3NhbmRyYV91c2VyLnNoLmVyYgpAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vYmFzaAorCitDQVNTQU5EUkFfVVNFUj1hc2RjX3VzZXIKK0NBU1NBTkRSQV9QQVNTPUFhMTIzNCVeIQorQ0FTU0FORFJBX0lQPTwlPSBAY2Fzc2FuZHJhX2lwICU+CisKK3Bhc3NfY2hhbmdlZD05OQorcmV0cnlfbnVtPTEKK2lzX3VwPTAKK3doaWxlIFsgJGlzX3VwIC1lcSAwIC1hICRyZXRyeV9udW0gLWxlIDEwMCBdOyBkbworICAgZWNobyAiZXhpdCIgfCBjcWxzaCAtdSBjYXNzYW5kcmEgLXAgY2Fzc2FuZHJhICRDQVNTQU5EUkFfSVAgID4gL2Rldi9udWxsIDI+JjEKKyAgIHJlczE9JD8KKyAgIGVjaG8gImV4aXQiIHwgY3Fsc2ggLXUgY2Fzc2FuZHJhIC1wICRDQVNTQU5EUkFfUEFTUyAkQ0FTU0FORFJBX0lQICA+IC9kZXYvbnVsbCAyPiYxCisgICByZXMyPSQ/CisKKyAgIGlmIFsgJHJlczEgLWVxIDAgLW8gJHJlczIgLWVxIDAgXTsgdGhlbgorICAgICAgZWNobyAiYGRhdGVgIC0tLSBjcWxzaCBpcyBlbmFibGVkIHRvIGNvbm5lY3QuIgorICAgICAgaXNfdXA9MQorICAgICAgWyAkcmVzMSAtZXEgMCBdICYmIHBhc3NfY2hhbmdlZD0wCisgICAgICBbICRyZXMyIC1lcSAwIF0gJiYgcGFzc19jaGFuZ2VkPTEKKyAgIGVsc2UKKyAgICAgIGVjaG8gImBkYXRlYCAtLS0gY3Fsc2ggaXMgTk9UIGVuYWJsZWQgdG8gY29ubmVjdCB5ZXQuIHNsZWVwIDUiCisgICAgICBzbGVlcCA1CisgICBmaQorICAgbGV0ICJyZXRyeV9udW0rKyIKK2RvbmUKKworCitlY2hvICJwYXNzX2NoYW5nZWQ9WyRwYXNzX2NoYW5nZWRdIgorY2FzZSAkcGFzc19jaGFuZ2VkIGluCisgICAwKQorICAgICAgICBjYXNzYW5kcmFfdXNlcl9leGlzdD1gZWNobyAibGlzdCB1c2VyczsiIHwgY3Fsc2ggLXUgY2Fzc2FuZHJhIC1wIGNhc3NhbmRyYSAkQ0FTU0FORFJBX0lQICB8Z3JlcCAtYyAkQ0FTU0FORFJBX1VTRVJgCisgICAgICAgIGlmIFsgJGNhc3NhbmRyYV91c2VyX2V4aXN0IC1lcSAxIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiY2Fzc2FuZHJhIHVzZXIgJENBU1NBTkRSQV9VU0VSIGFscmVhZHkgZXhpc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gImFsdGVyIHVzZXIgJENBU1NBTkRSQV9VU0VSIHdpdGggcGFzc3dvcmQgJyRDQVNTQU5EUkFfUEFTUycgbm9zdXBlcnVzZXI7IiB8IGNxbHNoIC11IGNhc3NhbmRyYSAtcCBjYXNzYW5kcmEgJENBU1NBTkRSQV9JUCAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVjaG8gIkdvaW5nIHRvIGNyZWF0ZSAkQ0FTU0FORFJBX1VTRVIiCisgICAgICAgICAgICAgICAgZWNobyAiY3JlYXRlIHVzZXIgJENBU1NBTkRSQV9VU0VSIHdpdGggcGFzc3dvcmQgJyRDQVNTQU5EUkFfUEFTUycgbm9zdXBlcnVzZXI7IiB8IGNxbHNoIC11IGNhc3NhbmRyYSAtcCBjYXNzYW5kcmEgJENBU1NBTkRSQV9JUCAKKyAgICAgICAgZmkKKyAgICAgICAgZWNobyAiTW9kaWZ5IGNhc3NhbmRyYSBwYXNzd29yZCIKKyAgICAgICAgZWNobyAiQUxURVIgVVNFUiBjYXNzYW5kcmEgV0lUSCBQQVNTV09SRCAnJENBU1NBTkRSQV9QQVNTJzsiIHwgY3Fsc2ggLXUgY2Fzc2FuZHJhIC1wIGNhc3NhbmRyYSAkQ0FTU0FORFJBX0lQIAorICAgOzsKKyAgIDEpCisgICAgICAgIGNhc3NhbmRyYV91c2VyX2V4aXN0PWBlY2hvICJsaXN0IHVzZXJzOyIgfCBjcWxzaCAtdSBjYXNzYW5kcmEgLXAgJENBU1NBTkRSQV9QQVNTICRDQVNTQU5EUkFfSVAgIHxncmVwIC1jICRDQVNTQU5EUkFfVVNFUmAKKyAgICAgICAgaWYgWyAkY2Fzc2FuZHJhX3VzZXJfZXhpc3QgLWVxIDEgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJjYXNzYW5kcmEgdXNlciAkQ0FTU0FORFJBX1VTRVIgYWxyZWFkeSBleGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiYWx0ZXIgdXNlciAkQ0FTU0FORFJBX1VTRVIgd2l0aCBwYXNzd29yZCAnJENBU1NBTkRSQV9QQVNTJyBub3N1cGVydXNlcjsiIHwgY3Fsc2ggLXUgY2Fzc2FuZHJhIC1wICRDQVNTQU5EUkFfUEFTUyAkQ0FTU0FORFJBX0lQIAorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZWNobyAiR29pbmcgdG8gY3JlYXRlICRDQVNTQU5EUkFfVVNFUiIKKyAgICAgICAgICAgICAgICBlY2hvICJjcmVhdGUgdXNlciAkQ0FTU0FORFJBX1VTRVIgd2l0aCBwYXNzd29yZCAnJENBU1NBTkRSQV9QQVNTJyBub3N1cGVydXNlcjsiIHwgY3Fsc2ggLXUgY2Fzc2FuZHJhIC1wICRDQVNTQU5EUkFfUEFTUyAkQ0FTU0FORFJBX0lQIAorICAgICAgICBmaQorICAgIDs7CisgICAgKikKKyAgICAgICBlY2hvICJwYXNzX2NoYW5nZWQgZG9lbid0IGhhdmUgdmFsdWUiCisgICAgOzsKK2VzYWMKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3RlbXBsYXRlcy9kZWZhdWx0L2NyZWF0ZV9kb3hfa2V5c3BhY2Uuc2guZXJiIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3RlbXBsYXRlcy9kZWZhdWx0L2NyZWF0ZV9kb3hfa2V5c3BhY2Uuc2guZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWQzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvY3JlYXRlX2RveF9rZXlzcGFjZS5zaC5lcmIKQEAgLTAsMCArMSw3NyBAQAorIyEvYmluL2Jhc2gKKworQ0FTU0FORFJBX1VTRVI9Y2Fzc2FuZHJhCitDQVNTQU5EUkFfUEFTUz1BYTEyMzQlXiEKK0NBU1NBTkRSQV9JUD08JT0gQGNhc3NhbmRyYV9pcCAlPgorCitSRVBMSUNBVElPTl9GQUNUT1I9MQorS0VZU1BBQ0U9IkNSRUFURSBLRVlTUEFDRSBJRiBOT1QgRVhJU1RTIGRveCBXSVRIIFJFUExJQ0FUSU9OID0geyAnY2xhc3MnIDogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAkUkVQTElDQVRJT05fRkFDVE9SIH07IgorCitrZXlzcGFjZXM9YGVjaG8gImRlc2NyaWJlIGtleXNwYWNlcyIgfCBjcWxzaCAtdSAkQ0FTU0FORFJBX1VTRVIgLXAgJENBU1NBTkRSQV9QQVNTICRDQVNTQU5EUkFfSVAgMj4vZGV2L251bGxgCitpZiBbICIka2V5c3BhY2VzIiA9PSAiIiBdIDsgdGhlbgorICAgZWNobyAia2V5c3BhY2UgaXMgZW1wdHksIHByb2JhYmx5IGNvbm5lY3Rpb24gZXJyb3IuIEV4aXQuLi4iCisgICBleGl0IDEKK2ZpCisKK2VjaG8gInJ1biBjcmVhdGVfZG94X2RiLmNxbCIKK2VjaG8gJEtFWVNQQUNFID4gL3RtcC9jcmVhdGVfZG94X2RiLmNxbAorY2F0IDw8J0VPRicgID4+IC90bXAvY3JlYXRlX2RveF9kYi5jcWwKK1VTRSBkb3g7CitDUkVBVEUgVFlQRSBJRiBOT1QgRVhJU1RTIHZlcnNpb24gKG1ham9yIGludCwgbWlub3IgaW50KTsKK0NSRUFURSBUWVBFIElGIE5PVCBFWElTVFMgdXNlcl9jYW5kaWRhdGVfdmVyc2lvbiAodmVyc2lvbiBmcm96ZW48dmVyc2lvbj4sIHVzZXIgdGV4dCk7CitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB2ZXJzaW9uX2luZm8gKGVudGl0eV90eXBlIHRleHQsIGVudGl0eV9pZCB0ZXh0LCBhY3RpdmVfdmVyc2lvbiBmcm96ZW48dmVyc2lvbj4sIHN0YXR1cyB0ZXh0LCBjYW5kaWRhdGUgZnJvemVuPHVzZXJfY2FuZGlkYXRlX3ZlcnNpb24+LCB2aWV3YWJsZV92ZXJzaW9ucyBzZXQ8ZnJvemVuPHZlcnNpb24+PiwgbGF0ZXN0X2ZpbmFsX3ZlcnNpb24gZnJvemVuPHZlcnNpb24+LCBQUklNQVJZIEtFWSAoZW50aXR5X3R5cGUsIGVudGl0eV9pZCkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdmVyc2lvbl9pbmZvX2RlbGV0ZWQgKGVudGl0eV90eXBlIHRleHQsIGVudGl0eV9pZCB0ZXh0LCBhY3RpdmVfdmVyc2lvbiBmcm96ZW48dmVyc2lvbj4sIHN0YXR1cyB0ZXh0LCBjYW5kaWRhdGUgZnJvemVuPHVzZXJfY2FuZGlkYXRlX3ZlcnNpb24+LCB2aWV3YWJsZV92ZXJzaW9ucyBzZXQ8ZnJvemVuPHZlcnNpb24+PiwgbGF0ZXN0X2ZpbmFsX3ZlcnNpb24gZnJvemVuPHZlcnNpb24+LCBQUklNQVJZIEtFWSAoZW50aXR5X3R5cGUsIGVudGl0eV9pZCkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdW5pcXVlX3ZhbHVlICh0eXBlIHRleHQsIHZhbHVlIHRleHQsIFBSSU1BUlkgS0VZICgodHlwZSwgdmFsdWUpKSk7CitDUkVBVEUgVFlQRSBJRiBOT1QgRVhJU1RTIGNob2ljZV9vcl9vdGhlciAocmVzdWx0IHRleHQpOworQ1JFQVRFIFRZUEUgSUYgTk9UIEVYSVNUUyBtdWx0aV9jaG9pY2Vfb3Jfb3RoZXIgKHJlc3VsdHMgc2V0PHRleHQ+KTsKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHZlbmRvcl9saWNlbnNlX21vZGVsICh2bG1faWQgdGV4dCwgdmVyc2lvbiBmcm96ZW48dmVyc2lvbj4sIHZlbmRvcl9uYW1lIHRleHQsIGRlc2NyaXB0aW9uIHRleHQsIGljb24gdGV4dCwgUFJJTUFSWSBLRVkgKCh2bG1faWQsIHZlcnNpb24pKSk7CitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBsaWNlbnNlX2FncmVlbWVudCAodmxtX2lkIHRleHQsIHZlcnNpb24gZnJvemVuPHZlcnNpb24+LCBsYV9pZCB0ZXh0LCBuYW1lIHRleHQsIGRlc2NyaXB0aW9uIHRleHQsIGxpY190ZXJtIGZyb3plbjxjaG9pY2Vfb3Jfb3RoZXI+LCByZXFfY29uc3QgdGV4dCwgZmdfaWRzIHNldDx0ZXh0PiwgUFJJTUFSWSBLRVkgKCh2bG1faWQsIHZlcnNpb24pLCBsYV9pZCkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZmVhdHVyZV9ncm91cCAodmxtX2lkIHRleHQsIHZlcnNpb24gZnJvemVuPHZlcnNpb24+LCBmZ19pZCB0ZXh0LCBuYW1lIHRleHQsIGRlc2NyaXB0aW9uIHRleHQsIHBhcnRfbnVtIHRleHQsIGVwX2lkcyBzZXQ8dGV4dD4sIGxrZ19pZHMgc2V0PHRleHQ+LCByZWZfbGFfaWRzIHNldDx0ZXh0PiwgUFJJTUFSWSBLRVkgKCh2bG1faWQsIHZlcnNpb24pLCBmZ19pZCkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgbGljZW5zZV9rZXlfZ3JvdXAgKHZsbV9pZCB0ZXh0LCB2ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPiwgbGtnX2lkIHRleHQsbmFtZSB0ZXh0LGRlc2NyaXB0aW9uIHRleHQsIHR5cGUgdGV4dCwgb3BlcmF0aW9uYWxfc2NvcGUgZnJvemVuPG11bHRpX2Nob2ljZV9vcl9vdGhlcj4sIHJlZl9mZ19pZHMgc2V0PHRleHQ+LHZlcnNpb25fdXVpZCB0ZXh0LFBSSU1BUlkgS0VZICgodmxtX2lkLCB2ZXJzaW9uKSwgbGtnX2lkKSk7CitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBlbnRpdGxlbWVudF9wb29sICh2bG1faWQgdGV4dCwgdmVyc2lvbiBmcm96ZW48dmVyc2lvbj4sIGVwX2lkIHRleHQsbmFtZSB0ZXh0LGRlc2NyaXB0aW9uIHRleHQsdGhyZXNob2xkIGZsb2F0LHRocmVzaG9sZF91bml0IHRleHQsZW50aXRsZW1lbnRfbWV0cmljIGZyb3plbjxjaG9pY2Vfb3Jfb3RoZXI+LGluY3JlbWVudHMgdGV4dCxhZ2dyZWdhdGlvbl9mdW5jIGZyb3plbjxjaG9pY2Vfb3Jfb3RoZXI+LCBvcGVyYXRpb25hbF9zY29wZSBmcm96ZW48bXVsdGlfY2hvaWNlX29yX290aGVyPiwgdGltZSBmcm96ZW48Y2hvaWNlX29yX290aGVyPixtYW51ZmFjdHVyZXJfcmVmX251bSB0ZXh0LHJlZl9mZ19pZHMgc2V0PHRleHQ+LHZlcnNpb25fdXVpZCB0ZXh0LFBSSU1BUlkgS0VZICgodmxtX2lkLCB2ZXJzaW9uKSwgZXBfaWQpKTsKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHZzcF9pbmZvcm1hdGlvbiAoVlNQX0lEIHRleHQsIHZlcnNpb24gZnJvemVuPHZlcnNpb24+LE5BTUUgdGV4dCxERVNDUklQVElPTiB0ZXh0LENBVEVHT1JZIHRleHQsU1VCX0NBVEVHT1JZIHRleHQsSUNPTiB0ZXh0LFBBQ0tBR0VfTkFNRSB0ZXh0LFBBQ0tBR0VfVkVSU0lPTiB0ZXh0LHZlbmRvcl9uYW1lIHRleHQsIHZlbmRvcl9pZCB0ZXh0LExJQ0VOU0VfQUdSRUVNRU5UIHRleHQsRkVBVFVSRV9HUk9VUFMgbGlzdDx0ZXh0PixWQUxJREFUSU9OX0RBVEEgdGV4dCxDT05URU5UX0RBVEEgYmxvYiwgcXVlc3Rpb25uYWlyZV9kYXRhIHRleHQsIHZsbV92ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPiwgUFJJTUFSWSBLRVkgKChWU1BfSUQsIHZlcnNpb24pKSk7CitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBwYWNrYWdlX2RldGFpbHMgKFZTUF9JRCB0ZXh0LCB2ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPixESVNQTEFZX05BTUUgdGV4dCx2c3BfbmFtZSB0ZXh0LHZzcF9kZXNjcmlwdGlvbiB0ZXh0LFZFTkRPUl9OQU1FIHRleHQsQ0FURUdPUlkgdGV4dCxTVUJfQ0FURUdPUlkgdGV4dCxWRU5ET1JfUkVMRUFTRSB0ZXh0LFBBQ0tBR0VfQ0hFQ0tTVU0gdGV4dCxQQUNLQUdFX1RZUEUgdGV4dCxUUkFOU0xBVEVfQ09OVEVOVCBibG9iLFBSSU1BUlkgS0VZICgoVlNQX0lELCB2ZXJzaW9uKSkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdnNwX25ldHdvcmsgKHZzcF9pZCB0ZXh0LCB2ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPiwgbmV0d29ya19pZCB0ZXh0LCBjb21wb3NpdGlvbl9kYXRhIHRleHQsIHF1ZXN0aW9ubmFpcmVfZGF0YSB0ZXh0LCBQUklNQVJZIEtFWSAoKHZzcF9pZCwgdmVyc2lvbiksIG5ldHdvcmtfaWQpKTsKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHZzcF9jb21wb25lbnQgKHZzcF9pZCB0ZXh0LCB2ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPiwgY29tcG9uZW50X2lkIHRleHQsIGNvbXBvc2l0aW9uX2RhdGEgdGV4dCwgcXVlc3Rpb25uYWlyZV9kYXRhIHRleHQsIFBSSU1BUlkgS0VZICgodnNwX2lkLCB2ZXJzaW9uKSwgY29tcG9uZW50X2lkKSk7CitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB2c3BfY29tcG9uZW50X25pYyAodnNwX2lkIHRleHQsIHZlcnNpb24gZnJvemVuPHZlcnNpb24+LCBjb21wb25lbnRfaWQgdGV4dCwgbmljX2lkIHRleHQsIGNvbXBvc2l0aW9uX2RhdGEgdGV4dCwgcXVlc3Rpb25uYWlyZV9kYXRhIHRleHQsIFBSSU1BUlkgS0VZICgodnNwX2lkLCB2ZXJzaW9uKSwgY29tcG9uZW50X2lkLCBuaWNfaWQpKTsKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHZzcF9wcm9jZXNzICh2c3BfaWQgdGV4dCwgdmVyc2lvbiBmcm96ZW48dmVyc2lvbj4sIGNvbXBvbmVudF9pZCB0ZXh0LCBwcm9jZXNzX2lkIHRleHQsIG5hbWUgdGV4dCwgZGVzY3JpcHRpb24gdGV4dCwgYXJ0aWZhY3RfbmFtZSB0ZXh0LCBhcnRpZmFjdCBibG9iLCBQUklNQVJZIEtFWSAoKHZzcF9pZCwgdmVyc2lvbiksIGNvbXBvbmVudF9pZCwgcHJvY2Vzc19pZCkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdnNwX3NlcnZpY2VfYXJ0aWZhY3QgKHZzcF9pZCB0ZXh0LCB2ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPiwgbmFtZSB0ZXh0LCBjb250ZW50X2RhdGEgYmxvYiwgUFJJTUFSWSBLRVkgKCh2c3BfaWQsIHZlcnNpb24pLCBuYW1lKSk7CitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB2c3Bfc2VydmljZV90ZW1wbGF0ZSAodnNwX2lkIHRleHQsIHZlcnNpb24gZnJvemVuPHZlcnNpb24+LCBiYXNlX25hbWUgdGV4dCBzdGF0aWMsIG5hbWUgdGV4dCwgY29udGVudF9kYXRhIGJsb2IsIFBSSU1BUlkgS0VZICgodnNwX2lkLCB2ZXJzaW9uKSwgbmFtZSkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdnNwX2VucmljaGVkX3NlcnZpY2VfdGVtcGxhdGUgKHZzcF9pZCB0ZXh0LCB2ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPiwgYmFzZV9uYW1lIHRleHQgc3RhdGljLCBuYW1lIHRleHQsIGNvbnRlbnRfZGF0YSBibG9iLCBQUklNQVJZIEtFWSAoKHZzcF9pZCwgdmVyc2lvbiksIG5hbWUpKTsKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHZzcF9lbnJpY2hlZF9zZXJ2aWNlX2FydGlmYWN0ICh2c3BfaWQgdGV4dCwgdmVyc2lvbiBmcm96ZW48dmVyc2lvbj4sIG5hbWUgdGV4dCwgY29udGVudF9kYXRhIGJsb2IsIFBSSU1BUlkgS0VZICgodnNwX2lkLCB2ZXJzaW9uKSwgbmFtZSkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYXBwbGljYXRpb25fY29uZmlnIChuYW1lc3BhY2UgdGV4dCwga2V5IHRleHQsIHZhbHVlIHRleHQsIFBSSU1BUlkgS0VZIChuYW1lc3BhY2UsIGtleSkpOworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZG94LkFjdGlvbiAoYWN0aW9uVVVJRCB0ZXh0LCBhY3Rpb25JbnZhcmlhbnRVVUlEIHRleHQsIHZlcnNpb24gZnJvemVuPHZlcnNpb24+LCBzdGF0dXMgdGV4dCwgbmFtZSB0ZXh0LCB2ZW5kb3JfbGlzdCBzZXQ8dGV4dD4sIGNhdGVnb3J5X2xpc3Qgc2V0PHRleHQ+LCB0aW1lc3RhbXAgdGltZXN0YW1wLCB1c2VyIHRleHQsIHN1cHBvcnRlZE1vZGVscyBzZXQ8dGV4dD4sIHN1cHBvcnRlZENvbXBvbmVudHMgc2V0PHRleHQ+LCBkYXRhIHRleHQsIFBSSU1BUlkgS0VZICgoYWN0aW9uSW52YXJpYW50VVVJRCwgdmVyc2lvbikpKTsKK0NSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGFjdGlvbl9zdXBwb3J0ZWRDb21wb25lbnRzIE9OIGRveC5BY3Rpb24gKHN1cHBvcnRlZENvbXBvbmVudHMpOworQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWN0aW9uX2NhdGVnb3J5X2xpc3QgT04gZG94LkFjdGlvbiAoY2F0ZWdvcnlfbGlzdCk7CitDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhY3Rpb25fc3VwcG9ydGVkTW9kZWxzIE9OIGRveC5BY3Rpb24gKHN1cHBvcnRlZE1vZGVscyk7CitDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhY3Rpb25fdmVuZG9yX2xpc3QgT04gZG94LkFjdGlvbiAodmVuZG9yX2xpc3QpOworQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWN0aW9uX2FjdGlvblVVSUQgT04gZG94LkFjdGlvbiAoYWN0aW9uVVVJRCk7CitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkb3guZWNvbXBjb21wb25lbnQoaWQgdGV4dCBQUklNQVJZIEtFWSwgbmFtZSB0ZXh0KTsKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHZzcF9jb21wb25lbnRfYXJ0aWZhY3QgKHZzcF9pZCB0ZXh0LCB2ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPiwgY29tcG9uZW50X2lkIHRleHQsIGFydGlmYWN0X3R5cGUgdGV4dCwgYXJ0aWZhY3RfaWQgdGV4dCwgbmFtZSB0ZXh0LCBkZXNjcmlwdGlvbiB0ZXh0LCBhcnRpZmFjdCBibG9iLCAgUFJJTUFSWSBLRVkgKCh2c3BfaWQsIHZlcnNpb24pLCBjb21wb25lbnRfaWQsIGFydGlmYWN0X3R5cGUsIGFydGlmYWN0X2lkKSk7CitDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhY3Rpb25fbmFtZSBPTiBkb3guQWN0aW9uIChuYW1lKTsKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGFjdGlvbl9hcnRpZmFjdChhcnRpZmFjdHV1aWQgdGV4dCwgZWZmZWN0aXZlX3ZlcnNpb24gaW50LCBhcnRpZmFjdCBibG9iLCBQUklNQVJZIEtFWShhcnRpZmFjdHV1aWQsIGVmZmVjdGl2ZV92ZXJzaW9uKSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChlZmZlY3RpdmVfdmVyc2lvbiBERVNDKTsKK0lOU0VSVCBJTlRPIGFwcGxpY2F0aW9uX2NvbmZpZyAobmFtZXNwYWNlLGtleSx2YWx1ZSkgVkFMVUVTICgndnNwLnNjaGVtYVRlbXBsYXRlcycsICdjb21wb3NpdGlvbi5jb21wb25lbnQnLCAneyAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLCAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyI8I2lmICFtYW51YWw+LCAiZW51bSI6IFsgIiR7Y29tcG9uZW50Lm5hbWV9IiBdLCAiZGVmYXVsdCI6ICIke2NvbXBvbmVudC5uYW1lfSI8LyNpZj4gfSwgImRpc3BsYXlOYW1lIjogeyAidHlwZSI6ICJzdHJpbmciPCNpZiAhbWFudWFsICYmIGNvbXBvbmVudC5kaXNwbGF5TmFtZT8/PiwgImVudW0iOiBbICIke2NvbXBvbmVudC5kaXNwbGF5TmFtZX0iIF0sICJkZWZhdWx0IjogIiR7Y29tcG9uZW50LmRpc3BsYXlOYW1lfSI8LyNpZj4gfSwgImRlc2NyaXB0aW9uIjogeyAidHlwZSI6ICJzdHJpbmciIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UsICJyZXF1aXJlZCI6IFsgIm5hbWUiPCNpZiAhbWFudWFsICYmIGNvbXBvbmVudC5kaXNwbGF5TmFtZT8/PiwgImRpc3BsYXlOYW1lIjwvI2lmPiBdIH0nKTsKK0lOU0VSVCBJTlRPIGFwcGxpY2F0aW9uX2NvbmZpZyAobmFtZXNwYWNlLGtleSx2YWx1ZSkgVkFMVUVTICgndnNwLnNjaGVtYVRlbXBsYXRlcycsICdjb21wb3NpdGlvbi5uZXR3b3JrJywgJ3sgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciPCNpZiAhbWFudWFsPiwgImVudW0iOiBbICIke25ldHdvcmsubmFtZX0iIF0sICJkZWZhdWx0IjogIiR7bmV0d29yay5uYW1lfSI8LyNpZj4gfSwgImRoY3AiOiB7ICJ0eXBlIjogImJvb2xlYW4iPCNpZiAhbWFudWFsPiwgImVudW0iOiBbICR7bmV0d29yay5kaGNwP2N9IF0sICJkZWZhdWx0IjogJHtuZXR3b3JrLmRoY3A/Y308LyNpZj4gfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSwgInJlcXVpcmVkIjogWyAibmFtZSIsICJkaGNwIiBdIH0nKTsKK0lOU0VSVCBJTlRPIGFwcGxpY2F0aW9uX2NvbmZpZyAobmFtZXNwYWNlLGtleSx2YWx1ZSkgVkFMVUVTICgndnNwLnNjaGVtYVRlbXBsYXRlcycsICdjb21wb3NpdGlvbi5uaWMnLCAneyAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLCAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyI8I2lmICFtYW51YWw+LCAiZW51bSI6IFsgIiR7bmljLm5hbWV9IiBdLCAiZGVmYXVsdCI6ICIke25pYy5uYW1lfSIgPC8jaWY+IH0sICJkZXNjcmlwdGlvbiI6IHsgInR5cGUiOiAic3RyaW5nIiB9PCNpZiAhbWFudWFsPjwjaWYgbmljLm5ldHdvcmtJZD8/PiwgIm5ldHdvcmtJZCI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICIke25pYy5uZXR3b3JrSWR9IiBdLCAiZGVmYXVsdCI6ICIke25pYy5uZXR3b3JrSWR9IiB9IDwvI2lmPjwjZWxzZT4sICJuZXR3b3JrSWQiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWzwjbGlzdCBuZXR3b3JrSWRzIGFzIG5ldHdvcmtJZD4gIiR7bmV0d29ya0lkfSI8I3NlcD4sPC8jbGlzdD4gXSB9IDwvI2lmPiB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSwgInJlcXVpcmVkIjogWyAibmFtZSIgXSB9Jyk7CitJTlNFUlQgSU5UTyBhcHBsaWNhdGlvbl9jb25maWcgKG5hbWVzcGFjZSxrZXksdmFsdWUpIFZBTFVFUyAoJ3ZzcC5zY2hlbWFUZW1wbGF0ZXMnLCAncXVlc3Rpb25uYWlyZS5jb21wb25lbnQnLCAneyAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLCAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgImdlbmVyYWwiOiB7ICJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyAiaHlwZXJ2aXNvciI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJoeXBlcnZpc29yIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsgIktWTSIsICJWTVdhcmUgRVNYaSIgXSwgImRlZmF1bHQiOiAiS1ZNIiB9LCAiZHJpdmVycyI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heExlbmd0aCI6IDMwMCwgInBhdHRlcm4iOiAiXltBLVphLXowLTlfLC1dKiQiIH0sICJjb250YWluZXJGZWF0dXJlc0Rlc2NyaXB0aW9uIjogeyAidHlwZSI6ICJzdHJpbmciLCAibWF4TGVuZ3RoIjogMTAwMCwgInBhdHRlcm4iOiAiXltBLVphLXowLTlfLCAtXSokIiB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0sICJpbWFnZSI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJmb3JtYXQiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyAiYWtpIiwgImFtaSIsICJhcmkiLCAiaXNvIiwgInFjb3cyIiwgInJhdyIsICJ2ZGkiLCAidmhkIiwgInZtZGsiIF0sICJkZWZhdWx0IjogInFjb3cyIiB9LCAicHJvdmlkZWRCeSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICJPUEVORUNPTVAiLCAiVmVuZG9yIiBdLCAiZGVmYXVsdCI6ICJPUEVORUNPTVAiIH0sICJib290RGlza1NpemVQZXJWTSI6IHsgInR5cGUiOiAibnVtYmVyIiwgIm1heGltdW0iOiAxMDAgfSwgImVwaGVtZXJhbERpc2tTaXplUGVyVk0iOiB7ICJ0eXBlIjogIm51bWJlciIsICJtYXhpbXVtIjogNDAwIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UgfSwgInJlY292ZXJ5IjogeyAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgInBvaW50T2JqZWN0aXZlIjogeyAidHlwZSI6ICJudW1iZXIiLCAibWluaW11bSI6IDAsICJleGNsdXNpdmVNaW5pbXVtIjogdHJ1ZSwgIm1heGltdW0iOiAxNSwgImV4Y2x1c2l2ZU1heGltdW0gIjogdHJ1ZSB9LCAidGltZU9iamVjdGl2ZSI6IHsgInR5cGUiOiAibnVtYmVyIiwgIm1pbmltdW0iOiAwLCAiZXhjbHVzaXZlTWluaW11bSI6IHRydWUsICJtYXhpbXVtIjogMzAwLCAiZXhjbHVzaXZlTWF4aW11bSAiOiB0cnVlIH0sICJ2bVByb2Nlc3NGYWlsdXJlc0hhbmRsaW5nIjogeyAidHlwZSI6ICJzdHJpbmciIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UgfSwgImRuc0NvbmZpZ3VyYXRpb24iOiB7ICJ0eXBlIjogInN0cmluZyIgfSwgInZtQ2xvbmVVc2FnZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heGltdW0iOiAzMDAgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAiY29tcHV0ZSI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJ2bVNpemluZyI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJudW1PZkNQVXMiOiB7ICJ0eXBlIjogIm51bWJlciIsICJtaW5pbXVtIjogMCwgImV4Y2x1c2l2ZU1pbmltdW0iOiB0cnVlLCAibWF4aW11bSI6IDE2LCAiZGVmYXVsdCI6IDIgfSwgImZpbGVTeXN0ZW1TaXplR0IiOiB7ICJ0eXBlIjogIm51bWJlciIsICJtaW5pbXVtIjogMCwgImV4Y2x1c2l2ZU1pbmltdW0iOiB0cnVlLCAiZGVmYXVsdCI6IDUgfSwgInBlcnNpc3RlbnRTdG9yYWdlVm9sdW1lU2l6ZSI6IHsgInR5cGUiOiAibnVtYmVyIiwgIm1pbmltdW0iOiAwLCAiZXhjbHVzaXZlTWluaW11bSI6IHRydWUgfSwgIklPT3BlcmF0aW9uc1BlclNlYyI6IHsgInR5cGUiOiAibnVtYmVyIiwgIm1pbmltdW0iOiAwLCAiZXhjbHVzaXZlTWluaW11bSI6IHRydWUgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAibnVtT2ZWTXMiOiB7ICJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyAibWluaW11bSI6IHsgInR5cGUiOiAibnVtYmVyIiwgIm1pbmltdW0iOiAwLCAiZXhjbHVzaXZlTWluaW11bSI6IHRydWUsICJtYXhpbXVtIjogMTAwIH0sICJtYXhpbXVtIjogeyAidHlwZSI6ICJudW1iZXIiLCAibWluaW11bSI6IDwjaWYgKGNvbXBvbmVudFF1ZXN0aW9ubmFpcmVEYXRhLmNvbXB1dGUubnVtT2ZWTXMubWluaW11bSk/PyAmJiAoY29tcG9uZW50UXVlc3Rpb25uYWlyZURhdGEuY29tcHV0ZS5udW1PZlZNcy5taW5pbXVtKT9pc19udW1iZXIgJiYgKChjb21wb25lbnRRdWVzdGlvbm5haXJlRGF0YS5jb21wdXRlLm51bU9mVk1zLm1pbmltdW0pID4gMCAmJiAoY29tcG9uZW50UXVlc3Rpb25uYWlyZURhdGEuY29tcHV0ZS5udW1PZlZNcy5taW5pbXVtKSA8PSAxMDApPiAke2NvbXBvbmVudFF1ZXN0aW9ubmFpcmVEYXRhLmNvbXB1dGUubnVtT2ZWTXMubWluaW11bX08I2Vsc2U+IDA8LyNpZj4sICJleGNsdXNpdmVNaW5pbXVtIjogdHJ1ZSwgIm1heGltdW0iOiAxMDAgfSwgIkNwdU92ZXJTdWJzY3JpcHRpb25SYXRpbyI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICIxOjEiLCAiNDoxIiwgIjE2OjEiIF0sICJkZWZhdWx0IjogIjQ6MSIgfSwgIk1lbW9yeVJBTSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICIyIEdCIiwgIjQgR0IiLCAiOCBHQiIgXSwgImRlZmF1bHQiOiAiMiBHQiIgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAiZ3Vlc3RPUyI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciLCAibWF4TGVuZ3RoIjogNTAgfSwgImJpdFNpemUiOiB7ICJ0eXBlIjogIm51bWJlciIsICJlbnVtIjogWyA2NCwgMzIgXSwgImRlZmF1bHQiOiA2NCB9LCAidG9vbHMiOiB7ICJ0eXBlIjogInN0cmluZyIgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0sICJoaWdoQXZhaWxhYmlsaXR5QW5kTG9hZEJhbGFuY2luZyI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJmYWlsdXJlTG9hZERpc3RyaWJ1dGlvbiI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heExlbmd0aCI6IDEwMDAgfSwgIm5rTW9kZWxJbXBsZW1lbnRhdGlvbiI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heExlbmd0aCI6IDEwMDAgfSwgImFyY2hpdGVjdHVyZUNob2ljZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heExlbmd0aCI6IDEwMDAgfSwgInNsYVJlcXVpcmVtZW50cyI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heExlbmd0aCI6IDEwMDAgfSwgImhvcml6b250YWxTY2FsaW5nIjogeyAidHlwZSI6ICJzdHJpbmciLCAibWF4TGVuZ3RoIjogMTAwMCB9LCAibG9hZERpc3RyaWJ1dGlvbk1lY2hhbmlzbSI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heExlbmd0aCI6IDEwMDAgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAibmV0d29yayI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJuZXR3b3JrQ2FwYWNpdHkiOiB7ICJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyAicHJvdG9jb2xXaXRoSGlnaGVzdFRyYWZmaWNQcm9maWxlQWNyb3NzQWxsTklDcyI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICJUQ1AiLCAiVURQIiwgIlNDVFAiLCAiSVBzZWMiIF0gfSwgIm5ldHdvcmtUcmFuc2FjdGlvbnNQZXJTZWNvbmQiOiB7ICJ0eXBlIjogIm51bWJlciIgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0sICJzdG9yYWdlIjogeyAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgImJhY2t1cCI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJiYWNrdXBUeXBlIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsgIk9uIFNpdGUiLCAiT2ZmIFNpdGUiIF0sICJkZWZhdWx0IjogIk9uIFNpdGUiIH0sICJiYWNrdXBTdG9yYWdlU2l6ZSI6IHsgInR5cGUiOiAibnVtYmVyIiB9LCAiYmFja3VwU29sdXRpb24iOiB7ICJ0eXBlIjogInN0cmluZyIgfSwgImJhY2t1cE5JQyI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbPCNpZiBuaWNOYW1lcz8/PjwjbGlzdCBuaWNOYW1lcyBhcyBuaWNOYW1lPiAiJHtuaWNOYW1lfSI8I3NlcD4sPC8jbGlzdD48LyNpZj4gXSB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0sICJzbmFwc2hvdEJhY2t1cCI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJzbmFwc2hvdEZyZXF1ZW5jeSI6IHsgInR5cGUiOiAibnVtYmVyIiwgImRlZmF1bHQiOiAyNCwgIm1pbmltdW0iOiAxLCAiZXhjbHVzaXZlTWluaW11bSI6IHRydWUgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAibG9nQmFja3VwIjogeyAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgInNpemVPZkxvZ0ZpbGVzIjogeyAidHlwZSI6ICJudW1iZXIiLCAibWF4aW11bSI6IDUsICJleGNsdXNpdmVNYXhpbXVtIjogdHJ1ZSB9LCAibG9nQmFja3VwRnJlcXVlbmN5IjogeyAidHlwZSI6ICJudW1iZXIiLCAibWF4aW11bSI6IDQsICJleGNsdXNpdmVNYXhpbXVtIjogdHJ1ZSB9LCAibG9nUmV0ZW50aW9uUGVyaW9kIjogeyAidHlwZSI6ICJudW1iZXIiLCAibWF4aW11bSI6IDE1LCAiZXhjbHVzaXZlTWF4aW11bSI6IHRydWUgfSwgImxvZ0ZpbGVMb2NhdGlvbiI6IHsgInR5cGUiOiAic3RyaW5nIiwgIm1heExlbmd0aCI6IDMwMCB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9Jyk7CitJTlNFUlQgSU5UTyBhcHBsaWNhdGlvbl9jb25maWcgKG5hbWVzcGFjZSxrZXksdmFsdWUpIFZBTFVFUyAoJ3ZzcC5zY2hlbWFUZW1wbGF0ZXMnLCAncXVlc3Rpb25uYWlyZS5uaWMnLCAneyAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLCAiZGVmaW5pdGlvbnMiOiB7ICJwcm90b2NvbCI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICJUQ1AiLCAiVURQIiwgIlNDVFAiLCAiSVBzZWMiIF0gfSB9LCAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgInByb3RvY29scyI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJwcm90b2NvbHMiOiB7ICJ0eXBlIjogImFycmF5IiwgIml0ZW1zIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb3RvY29sIiB9LCAibWluSXRlbXMiOiAxIH0sICJwcm90b2NvbFdpdGhIaWdoZXN0VHJhZmZpY1Byb2ZpbGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvdG9jb2wiIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UgfSwgImlwQ29uZmlndXJhdGlvbiI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJpcHY0UmVxdWlyZWQiOiB7ICJ0eXBlIjogImJvb2xlYW4iLCAiZGVmYXVsdCI6IHRydWUgfSwgImlwdjZSZXF1aXJlZCI6IHsgInR5cGUiOiAiYm9vbGVhbiIsICJkZWZhdWx0IjogZmFsc2UgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAibmV0d29yayI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJuZXR3b3JrRGVzY3JpcHRpb24iOiB7ICJ0eXBlIjogInN0cmluZyIsICJwYXR0ZXJuIjogIltBLVphLXpdKyIsICJtYXhMZW5ndGgiOiAzMDAgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAic2l6aW5nIjogeyAidHlwZSI6ICJvYmplY3QiLCAiZGVmaW5pdGlvbnMiOiB7ICJwZWFrQW5kQXZnIjogeyAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgInBlYWsiOiB7ICJ0eXBlIjogIm51bWJlciIgfSwgImF2ZyI6IHsgInR5cGUiOiAibnVtYmVyIiB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0sICJwYWNrZXRzQW5kQnl0ZXMiOiB7ICJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyAicGFja2V0cyI6IHsgIiRyZWYiOiAiIy9wcm9wZXJ0aWVzL3NpemluZy9kZWZpbml0aW9ucy9wZWFrQW5kQXZnIiB9LCAiYnl0ZXMiOiB7ICIkcmVmIjogIiMvcHJvcGVydGllcy9zaXppbmcvZGVmaW5pdGlvbnMvcGVha0FuZEF2ZyIgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9IH0sICJwcm9wZXJ0aWVzIjogeyAiZGVzY3JpYmVRdWFsaXR5T2ZTZXJ2aWNlIjogeyAidHlwZSI6ICJzdHJpbmciIH0sICJpbmZsb3dUcmFmZmljUGVyU2Vjb25kIjogeyAiJHJlZiI6ICIjL3Byb3BlcnRpZXMvc2l6aW5nL2RlZmluaXRpb25zL3BhY2tldHNBbmRCeXRlcyIgfSwgIm91dGZsb3dUcmFmZmljUGVyU2Vjb25kIjogeyAiJHJlZiI6ICIjL3Byb3BlcnRpZXMvc2l6aW5nL2RlZmluaXRpb25zL3BhY2tldHNBbmRCeXRlcyIgfSwgImZsb3dMZW5ndGgiOiB7ICIkcmVmIjogIiMvcHJvcGVydGllcy9zaXppbmcvZGVmaW5pdGlvbnMvcGFja2V0c0FuZEJ5dGVzIiB9LCAiYWNjZXB0YWJsZUppdHRlciI6IHsgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ICJtZWFuIjogeyAidHlwZSI6ICJudW1iZXIiIH0sICJtYXgiOiB7ICJ0eXBlIjogIm51bWJlciIgfSwgInZhcmlhYmxlIjogeyAidHlwZSI6ICJudW1iZXIiIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UgfSwgImFjY2VwdGFibGVQYWNrZXRMb3NzIjogeyAidHlwZSI6ICJudW1iZXIiLCAibWluaW11bSI6IDAsICJtYXhpbXVtIjogMTAwIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9Jyk7CitJTlNFUlQgSU5UTyBhcHBsaWNhdGlvbl9jb25maWcgKG5hbWVzcGFjZSxrZXksdmFsdWUpIFZBTFVFUyAoJ3ZzcC5zY2hlbWFUZW1wbGF0ZXMnLCAncXVlc3Rpb25uYWlyZS52c3AnLCAneyAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLCAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgImdlbmVyYWwiOiB7ICJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyAiYWZmaW5pdHlEYXRhIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsgIkFmZmluaXR5IiwgIkFudGkgQWZmaW5pdHkiLCAiTm9uZSIgXSB9LCAiYXZhaWxhYmlsaXR5IjogeyAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgInVzZUF2YWlsYWJpbGl0eVpvbmVzRm9ySGlnaEF2YWlsYWJpbGl0eSI6IHsgInR5cGUiOiAiYm9vbGVhbiIsICJkZWZhdWx0IjogZmFsc2UgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9LCAicmVnaW9uc0RhdGEiOiB7ICJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyAibXVsdGlSZWdpb24iOiB7ICJ0eXBlIjogImJvb2xlYW4iLCAiZGVmYXVsdCI6IGZhbHNlIH0sICJyZWdpb25zIjogeyAidHlwZSI6ICJhcnJheSIsICJpdGVtcyI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICJBbHBoYXJldGEiLCAiQmlybWluZ2hhbSIsICJEYWxsYXMiLCAiRmFpcmZpZWxkIENBIiwgIkhheXdhcmQgQ0EiLCAiTGlzbGUiLCAiTWlzc2lvbiIsICJTYW4gRGllZ28iLCAiU2VjYXVjdXMiIF0gfSB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0sICJzdG9yYWdlRGF0YVJlcGxpY2F0aW9uIjogeyAidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsgInN0b3JhZ2VSZXBsaWNhdGlvbkFjcm9zc1JlZ2lvbiI6IHsgInR5cGUiOiAiYm9vbGVhbiIsICJkZWZhdWx0IjogZmFsc2UgfSwgInN0b3JhZ2VSZXBsaWNhdGlvblNpemUiOiB7ICJ0eXBlIjogIm51bWJlciIsICJtYXhpbXVtIjogMTAwLCAiZXhjbHVzaXZlTWF4aW11bSI6IHRydWUgfSwgInN0b3JhZ2VSZXBsaWNhdGlvbkZyZXF1ZW5jeSI6IHsgInR5cGUiOiAibnVtYmVyIiwgIm1pbmltdW0iOiA1IH0sICJzdG9yYWdlUmVwbGljYXRpb25Tb3VyY2UiOiB7ICJ0eXBlIjogInN0cmluZyIsICJtYXhMZW5ndGgiOiAzMDAgfSwgInN0b3JhZ2VSZXBsaWNhdGlvbkRlc3RpbmF0aW9uIjogeyAidHlwZSI6ICJzdHJpbmciLCAibWF4TGVuZ3RoIjogMzAwIH0gfSwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UgfSB9LCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSB9IH0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlIH0nKTsKK0lOU0VSVCBJTlRPIGFwcGxpY2F0aW9uX2NvbmZpZyAobmFtZXNwYWNlLGtleSx2YWx1ZSkgVkFMVUVTICgndnNwLm1vbml0b3JpbmcnLCAnY29tcG9uZW50LmNlaWxvbWV0ZXInLCAneyAiY2VpbG9tZXRlckluZm9MaXN0IjogWyB7ICJuYW1lIjogImluc3RhbmNlIiwgInR5cGUiOiAiR2F1Z2UiLCAidW5pdCI6ICJpbnN0YW5jZSIsICJjYXRlZ29yeSI6ICJjb21wdXRlIiwgImRlc2NyaXB0aW9uIjogIkV4aXN0ZW5jZSBvZiBpbnN0YW5jZSIgfSwgeyAibmFtZSI6ICJpbnN0YW5jZTp0eXBlIiwgInR5cGUiOiAiR2F1Z2UiLCAidW5pdCI6ICJpbnN0YW5jZSIsICJjYXRlZ29yeSI6ICJjb21wdXRlIiwgImRlc2NyaXB0aW9uIjogIkV4aXN0ZW5jZSBvZiBpbnN0YW5jZSA8dHlwZT4gKE9wZW5TdGFjayB0eXBlcykiIH0sIHsgIm5hbWUiOiAibWVtb3J5IiwgInR5cGUiOiAiR2F1Z2UiLCAidW5pdCI6ICJNQiIsICJjYXRlZ29yeSI6ICJjb21wdXRlIiwgImRlc2NyaXB0aW9uIjogIlZvbHVtZSBvZiBSQU0gYWxsb2NhdGVkIHRvIHRoZSBpbnN0YW5jZSIgfSwgeyAibmFtZSI6ICJtZW1vcnkudXNhZ2UiLCAidHlwZSI6ICJHYXVnZSIsICJ1bml0IjogIk1CIiwgImNhdGVnb3J5IjogImNvbXB1dGUiLCAiZGVzY3JpcHRpb24iOiAiVm9sdW1lIG9mIFJBTSB1c2VkIGJ5IHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBhbW91bnQgb2YgaXRzIGFsbG9jYXRlZCBtZW1vcnkiIH0sIHsgIm5hbWUiOiAibWVtb3J5LnJlc2lkZW50IiwgInR5cGUiOiAiR2F1Z2UiLCAidW5pdCI6ICJNQiIsICJjYXRlZ29yeSI6ICJjb21wdXRlIiwgImRlc2NyaXB0aW9uIjogIlZvbHVtZSBvZiBSQU0gdXNlZCBieSB0aGUgaW5zdGFuY2Ugb24gdGhlIHBoeXNpY2FsIG1hY2hpbmUiIH0sIHsgIm5hbWUiOiAiY3B1IiwgInR5cGUiOiAiQ3VtdWxhdGl2ZSIsICJ1bml0IjogIm5zIiwgImNhdGVnb3J5IjogImNvbXB1dGUiLCAiZGVzY3JpcHRpb24iOiAiQ1BVIHRpbWUgdXNlZCIgfSwgeyAibmFtZSI6ICJjcHVfdXRpbCIsICJ0eXBlIjogIkdhdWdlIiwgInVuaXQiOiAiJSIsICJjYXRlZ29yeSI6ICJjb21wdXRlIiwgImRlc2NyaXB0aW9uIjogIkF2ZXJhZ2UgQ1BVIHV0aWxpemF0aW9uIiB9LCB7ICJuYW1lIjogImNwdS5kZWx0YSIsICJ0eXBlIjogIkRlbHRhIiwgInVuaXQiOiAibnMiLCAiY2F0ZWdvcnkiOiAiY29tcHV0ZSIsICJkZXNjcmlwdGlvbiI6ICJDUFUgdGltZSB1c2VkIHNpbmNlIHByZXZpb3VzIGRhdGFwb2ludCIgfSwgeyAibmFtZSI6ICJ2Y3B1cyIsICJ0eXBlIjogIkdhdWdlIiwgInVuaXQiOiAibXMiLCAiY2F0ZWdvcnkiOiAiY29tcHV0ZSIsICJkZXNjcmlwdGlvbiI6ICJBdmVyYWdlIGRpc2sgbGF0ZW5jeSIgfSBdIH0nKTsKK0FMVEVSIFRBQkxFIHZzcF9pbmZvcm1hdGlvbiBBREQgcXVlc3Rpb25uYWlyZV9kYXRhIHRleHQ7CitBTFRFUiBUQUJMRSB2c3BfaW5mb3JtYXRpb24gQUREIHZsbV92ZXJzaW9uIGZyb3plbjx2ZXJzaW9uPjsKK0FMVEVSIFRBQkxFIGVudGl0bGVtZW50X3Bvb2wgQUREIHZlcnNpb25fdXVpZCB0ZXh0OworQUxURVIgVEFCTEUgbGljZW5zZV9rZXlfZ3JvdXAgQUREIHZlcnNpb25fdXVpZCB0ZXh0OworCitFT0YKKworY2htb2QgNzc3IC90bXAvY3JlYXRlX2RveF9kYi5jcWwKK2NxbHNoIC11ICRDQVNTQU5EUkFfVVNFUiAtcCAkQ0FTU0FORFJBX1BBU1MgJENBU1NBTkRSQV9JUCAtZiAvdG1wL2NyZWF0ZV9kb3hfZGIuY3FsID4gL2Rldi9udWxsIDI+JjEKKworcmVzPWBlY2hvICJzZWxlY3Qga2V5c3BhY2VfbmFtZSBmcm9tIHN5c3RlbS5zY2hlbWFfa2V5c3BhY2VzIDsiIHwgY3Fsc2ggLXUgJENBU1NBTkRSQV9VU0VSIC1wICRDQVNTQU5EUkFfUEFTUyAkQ0FTU0FORFJBX0lQIHxncmVwIC1jIGRveCAyPi9kZXYvbnVsbGAKKworaWYgWyAkcmVzIC1lcSAxIF07IHRoZW4KKyAgIGVjaG8gImBkYXRlYCAtLS0gZG94IGtleXNwYWNlIHdhcyBjcmVhdGVkICIKK2Vsc2UKKyAgIGVjaG8gImBkYXRlYCAtLS0gRmFpbGVkIHRvIGNyZWF0ZSBkb3gga2V5c3BhY2UiCitmaQorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtcmVwby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvdGVtcGxhdGVzL2RlZmF1bHQvZWxhc3RpY3NlYXJjaC55bWwuZXJiIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3RlbXBsYXRlcy9kZWZhdWx0L2VsYXN0aWNzZWFyY2gueW1sLmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQxMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXJlcG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3RlbXBsYXRlcy9kZWZhdWx0L2VsYXN0aWNzZWFyY2gueW1sLmVyYgpAQCAtMCwwICsxLDExIEBACitkaXNjb3ZlcnkuemVuLnBpbmcubXVsdGljYXN0LmVuYWJsZWQ6IGZhbHNlCitkaXNjb3ZlcnkuemVuLnBpbmcudW5pY2FzdC5lbmFibGVkOiB0cnVlCitub2RlLm5hbWU6IGFzZGMtMDEKK2NsdXN0ZXIubmFtZTogZWxhc3RpY3NlYXJjaAorbm9kZS5tYXN0ZXI6IGZhbHNlCitub2RlLmRhdGE6IGZhbHNlCitodHRwLmNvcnMuZW5hYmxlZDogdHJ1ZQorcGF0aC5ob21lOiAiL3Zhci9saWIvamV0dHkvY29uZmlnIgorZWxhc3RpY1NlYXJjaC50cmFuc3BvcnRjbGllbnQ6IHRydWUKK3RyYW5zcG9ydC5jbGllbnQuaW5pdGlhbF9ub2RlczoKKyAgIC0gPCU9IEBlbGFzdGljX2lwICU+OjkzMDAKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL0xJQ0VOU0UgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtc29sby9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDY5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtc29sby9MSUNFTlNFCkBAIC0wLDAgKzEsMjAxIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworMS4gRGVmaW5pdGlvbnMuCisKKyAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKzQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKzUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCitDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGIwZmRhCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzcgQEAKK0RlcHJlY2F0ZWQKKz09PT09PT09PT0KKworVXNlIG9mIHRoaXMgcmVwb3NpdG9yeSBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBjaGVmIGdlbmVyYXRlIHJlcG9gIGNvbW1hbmQgdGhhdCBjb21lcyB3aXRoIFtDaGVmREtdKGh0dHA6Ly9kb3dubG9hZHMuY2hlZi5pby9jaGVmLWRrLykuCisKK092ZXJ2aWV3Cis9PT09PT09PQorCitFdmVyeSBDaGVmIGluc3RhbGxhdGlvbiBuZWVkcyBhIENoZWYgUmVwb3NpdG9yeS4gVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgY29va2Jvb2tzLCByb2xlcywgY29uZmlnIGZpbGVzIGFuZCBvdGhlciBhcnRpZmFjdHMgZm9yIG1hbmFnaW5nIHN5c3RlbXMgd2l0aCBDaGVmIHdpbGwgbGl2ZS4gV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHN0b3JpbmcgdGhpcyByZXBvc2l0b3J5IGluIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBzdWNoIGFzIEdpdCBhbmQgdHJlYXQgaXQgbGlrZSBzb3VyY2UgY29kZS4KKworV2hpbGUgd2UgcHJlZmVyIEdpdCwgYW5kIG1ha2UgdGhpcyByZXBvc2l0b3J5IGF2YWlsYWJsZSB2aWEgR2l0SHViLCB5b3UgYXJlIHdlbGNvbWUgdG8gZG93bmxvYWQgYSB0YXIgb3IgemlwIGFyY2hpdmUgYW5kIHVzZSB5b3VyIGZhdm9yaXRlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdG8gbWFuYWdlIHRoZSBjb2RlLgorCitSZXBvc2l0b3J5IERpcmVjdG9yaWVzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgcmVwb3NpdG9yeSBjb250YWlucyBzZXZlcmFsIGRpcmVjdG9yaWVzLCBhbmQgZWFjaCBkaXJlY3RvcnkgY29udGFpbnMgYSBSRUFETUUgZmlsZSB0aGF0IGRlc2NyaWJlcyB3aGF0IGl0IGlzIGZvciBpbiBncmVhdGVyIGRldGFpbCwgYW5kIGhvdyB0byB1c2UgaXQgZm9yIG1hbmFnaW5nIHlvdXIgc3lzdGVtcyB3aXRoIENoZWYuCisKKyogYGNvb2tib29rcy9gIC0gQ29va2Jvb2tzIHlvdSBkb3dubG9hZCBvciBjcmVhdGUuCisqIGBkYXRhX2JhZ3MvYCAtIFN0b3JlIGRhdGEgYmFncyBhbmQgaXRlbXMgaW4gLmpzb24gaW4gdGhlIHJlcG9zaXRvcnkuCisqIGByb2xlcy9gIC0gU3RvcmUgcm9sZXMgaW4gLnJiIG9yIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorKiBgZW52aXJvbm1lbnRzL2AgLSBTdG9yZSBlbnZpcm9ubWVudHMgaW4gLnJiIG9yIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorCitDb25maWd1cmF0aW9uCis9PT09PT09PT09PT09CisKK1RoZSByZXBvc2l0b3J5IGNvbnRhaW5zIGEga25pZmUgY29uZmlndXJhdGlvbiBmaWxlLgorCisqIC5jaGVmL2tuaWZlLnJiCisKK1RoZSBrbmlmZSBjb25maWd1cmF0aW9uIGZpbGUgYC5jaGVmL2tuaWZlLnJiYCBpcyBhIHJlcG9zaXRvcnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIGZvciBrbmlmZS4gSWYgeW91J3JlIHVzaW5nIEhvc3RlZCBDaGVmLCB5b3UgY2FuIGRvd25sb2FkIG9uZSBmb3IgeW91ciBvcmdhbml6YXRpb24gZnJvbSB0aGUgbWFuYWdlbWVudCBjb25zb2xlLiBJZiB5b3UncmUgdXNpbmcgdGhlIE9wZW4gU291cmNlIENoZWYgU2VydmVyLCB5b3UgY2FuIGdlbmVyYXRlIGEgbmV3IG9uZSB3aXRoIGBrbmlmZSBjb25maWd1cmVgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1cmluZyBLbmlmZSwgc2VlIHRoZSBLbmlmZSBkb2N1bWVudGF0aW9uLgorCitodHRwczovL2RvY3MuY2hlZi5pby9rbmlmZS5odG1sCisKK05leHQgU3RlcHMKKz09PT09PT09PT0KKworUmVhZCB0aGUgUkVBRE1FIGZpbGUgaW4gZWFjaCBvZiB0aGUgc3ViZGlyZWN0b3JpZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBnb2VzIGluIHRob3NlIGRpcmVjdG9yaWVzLgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vY2hlZmlnbm9yZSBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL2NoZWZpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzMGFmNgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL2NoZWZpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorIyBQdXQgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGlzIGZpbGUuCisjIExpbmVzIHRoYXQgc3RhcnQgd2l0aCAnIyAnIGFyZSBjb21tZW50cy4KKworIyBlbWFjcworKn4KKworIyB2aW0KKyouc3dbYS16XQorCisjIHN1YnZlcnNpb24KKyovLnN2bi8qCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtc29sby9jb29rYm9va3MvUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vY29va2Jvb2tzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmVhNDZiCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vY29va2Jvb2tzL1JFQURNRS5tZApAQCAtMCwwICsxLDU0IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgY29va2Jvb2tzIHVzZWQgdG8gY29uZmlndXJlIHN5c3RlbXMgaW4geW91ciBpbmZyYXN0cnVjdHVyZSB3aXRoIENoZWYuCisKK0tuaWZlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8ga25vdyB3aGVyZSB0aGUgY29va2Jvb2tzIGFyZSBsb2NhdGVkIHdpdGggdGhlIGBjb29rYm9va19wYXRoYCBzZXR0aW5nLiBJZiB0aGlzIGlzIG5vdCBzZXQsIHRoZW4gc2V2ZXJhbCBjb29rYm9vayBvcGVyYXRpb25zIHdpbGwgZmFpbCB0byB3b3JrIHByb3Blcmx5LgorCisgICAgY29va2Jvb2tfcGF0aCBbIi4vY29va2Jvb2tzIl0KKworVGhpcyBzZXR0aW5nIHRlbGxzIGtuaWZlIHRvIGxvb2sgZm9yIHRoZSBjb29rYm9va3MgZGlyZWN0b3J5IGluIHRoZSBwcmVzZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIG1lYW5zIHRoZSBrbmlmZSBjb29rYm9vayBzdWJjb21tYW5kcyBuZWVkIHRvIGJlIHJ1biBpbiB0aGUgYGNoZWYtcmVwb2AgZGlyZWN0b3J5IGl0c2VsZi4gVG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvb2tib29rcyBjYW4gYmUgZm91bmQgZWxzZXdoZXJlIGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgdXNlIGFuIGFic29sdXRlIHBhdGguIFRoaXMgaXMgYSBSdWJ5IGZpbGUsIHNvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQ6CisKKyAgICBjdXJyZW50X2RpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykKKyAgICBjb29rYm9va19wYXRoIFsiI3tjdXJyZW50X2Rpcn0vLi4vY29va2Jvb2tzIl0KKworV2hpY2ggd2lsbCBzZXQgYGN1cnJlbnRfZGlyYCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGtuaWZlLnJiIGZpbGUgaXRzZWxmIChlLmcuIGB+L2NoZWYtcmVwby8uY2hlZi9rbmlmZS5yYmApLgorCitDb25maWd1cmUga25pZmUgdG8gdXNlIHlvdXIgcHJlZmVycmVkIGNvcHlyaWdodCBob2xkZXIsIGVtYWlsIGNvbnRhY3QgYW5kIGxpY2Vuc2UuIEFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIGAuY2hlZi9rbmlmZS5yYmAuCisKKyAgICBjb29rYm9va19jb3B5cmlnaHQgIkV4YW1wbGUsIENvbS4iCisgICAgY29va2Jvb2tfZW1haWwgICAgICJjb29rYm9va3NAZXhhbXBsZS5jb20iCisgICAgY29va2Jvb2tfbGljZW5zZSAgICJhcGFjaGV2MiIKKworU3VwcG9ydGVkIHZhbHVlcyBmb3IgYGNvb2tib29rX2xpY2Vuc2VgIGFyZSAiYXBhY2hldjIiLCAibWl0IiwiZ3BsdjIiLCJncGx2MyIsICBvciAibm9uZSIuIFRoZXNlIHNldHRpbmdzIGFyZSB1c2VkIHRvIHByZWZpbGwgY29tbWVudHMgaW4gdGhlIGRlZmF1bHQgcmVjaXBlLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoZSBtZXRhZGF0YS5yYi4gWW91IGFyZSBmcmVlIHRvIGNoYW5nZSB0aGUgdGhlIGNvbW1lbnRzIGluIHRob3NlIGZpbGVzLgorCitDcmVhdGUgbmV3IGNvb2tib29rcyBpbiB0aGlzIGRpcmVjdG9yeSB3aXRoIEtuaWZlLgorCisgICAga25pZmUgY29va2Jvb2sgY3JlYXRlIENPT0tCT09LCisKK1RoaXMgd2lsbCBjcmVhdGUgYWxsIHRoZSBjb29rYm9vayBkaXJlY3RvcnkgY29tcG9uZW50cy4gWW91IGRvbid0IG5lZWQgdG8gdXNlIHRoZW0gYWxsLCBhbmQgY2FuIGRlbGV0ZSB0aGUgb25lcyB5b3UgZG9uJ3QgbmVlZC4gSXQgYWxzbyBjcmVhdGVzIGEgUkVBRE1FIGZpbGUsIG1ldGFkYXRhLnJiIGFuZCBkZWZhdWx0IHJlY2lwZS4KKworWW91IGNhbiBhbHNvIGRvd25sb2FkIGNvb2tib29rcyBkaXJlY3RseSBmcm9tIHRoZSBPcHNjb2RlIENvb2tib29rIFNpdGUuIFRoZXJlIGFyZSB0d28gc3ViY29tbWFuZHMgdG8gaGVscCB3aXRoIHRoaXMgZGVwZW5kaW5nIG9uIHdoYXQgeW91ciBwcmVmZXJlbmNlIGlzLgorCitUaGUgZmlyc3QgYW5kIHJlY29tbWVuZGVkIG1ldGhvZCBpcyB0byB1c2UgYSB2ZW5kb3IgYnJhbmNoIGlmIHlvdSdyZSB1c2luZyBHaXQuIFRoaXMgaXMgYXV0b21hdGljYWxseSBoYW5kbGVkIHdpdGggS25pZmUuCisKKyAgICBrbmlmZSBjb29rYm9vayBzaXRlIGluc3RhbGwgQ09PS0JPT0sKKworVGhpcyB3aWxsOgorCisqIERvd25sb2FkIHRoZSBjb29rYm9vayB0YXJiYWxsIGZyb20gY29va2Jvb2tzLm9wc2NvZGUuY29tLgorKiBFbnN1cmUgaXRzIG9uIHRoZSBnaXQgbWFzdGVyIGJyYW5jaC4KKyogQ2hlY2tzIGZvciBhbiBleGlzdGluZyB2ZW5kb3IgYnJhbmNoLCBhbmQgY3JlYXRlcyBpZiBpdCBkb2Vzbid0LgorKiBDaGVja3Mgb3V0IHRoZSB2ZW5kb3IgYnJhbmNoIChjaGVmLXZlbmRvci1DT09LQk9PSykuCisqIFJlbW92ZXMgdGhlIGV4aXN0aW5nIChvbGQpIHZlcnNpb24uCisqIFVudGFycyB0aGUgY29va2Jvb2sgdGFyYmFsbCBpdCBkb3dubG9hZGVkIGluIHRoZSBmaXJzdCBzdGVwLgorKiBBZGRzIHRoZSBjb29rYm9vayBmaWxlcyB0byB0aGUgZ2l0IGluZGV4IGFuZCBjb21taXRzLgorKiBDcmVhdGVzIGEgdGFnIGZvciB0aGUgdmVyc2lvbiBkb3dubG9hZGVkLgorKiBDaGVja3Mgb3V0IHRoZSBtYXN0ZXIgYnJhbmNoIGFnYWluLgorKiBNZXJnZXMgdGhlIGNvb2tib29rIGludG8gbWFzdGVyLgorKiBSZXBlYXRzIHRoZSBhYm92ZSBmb3IgYWxsIHRoZSBjb29rYm9va3MgZGVwZW5kZW5jaWVzLCBkb3dubG9hZGluZyB0aGVtIGZyb20gdGhlIGNvbW11bml0eSBzaXRlCisKK1RoZSBsYXN0IHN0ZXAgd2lsbCBlbnN1cmUgdGhhdCBhbnkgbG9jYWwgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHlvdSBoYXZlIG1hZGUgdG8gdGhlIGNvb2tib29rIGFyZSBwcmVzZXJ2ZWQsIHNvIHlvdSBjYW4ga2VlcCB5b3VyIGNoYW5nZXMgdGhyb3VnaCB1cHN0cmVhbSB1cGRhdGVzLgorCitJZiB5b3UncmUgbm90IHVzaW5nIEdpdCwgdXNlIHRoZSBzaXRlIGRvd25sb2FkIHN1YmNvbW1hbmQgdG8gZG93bmxvYWQgdGhlIHRhcmJhbGwuCisKKyAgICBrbmlmZSBjb29rYm9vayBzaXRlIGRvd25sb2FkIENPT0tCT09LCisKK1RoaXMgY3JlYXRlcyB0aGUgQ09PS0JPT0sudGFyLmd6IGZyb20gaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChlLmcuLCBgfi9jaGVmLXJlcG9gKS4gV2UgcmVjb21tZW5kIGZvbGxvd2luZyBhIHdvcmtmbG93IHNpbWlsYXIgdG8gdGhlIGFib3ZlIGZvciB5b3VyIHZlcnNpb24gY29udHJvbCB0b29sLgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vZGF0YV9iYWdzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL2RhdGFfYmFncy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNWEzOQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL2RhdGFfYmFncy9SRUFETUUubWQKQEAgLTAsMCArMSw2MyBAQAorRGF0YSBCYWdzCistLS0tLS0tLS0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGlyZWN0b3JpZXMgb2YgdGhlIHZhcmlvdXMgZGF0YSBiYWdzIHlvdSBjcmVhdGUgZm9yIHlvdXIgaW5mcmFzdHJ1Y3R1cmUuIEVhY2ggc3ViZGlyZWN0b3J5IGNvcnJlc3BvbmRzIHRvIGEgZGF0YSBiYWcgb24gdGhlIENoZWYgU2VydmVyLCBhbmQgY29udGFpbnMgSlNPTiBmaWxlcyBvZiB0aGUgaXRlbXMgdGhhdCBnbyBpbiB0aGUgYmFnLgorCitGaXJzdCwgY3JlYXRlIGEgZGlyZWN0b3J5IGZvciB0aGUgZGF0YSBiYWcuCisKKyAgICBta2RpciBkYXRhX2JhZ3MvQkFHCisKK1RoZW4gY3JlYXRlIHRoZSBKU09OIGZpbGVzIGZvciBpdGVtcyB0aGF0IHdpbGwgZ28gaW50byB0aGF0IGJhZy4KKworICAgICRFRElUT1IgZGF0YV9iYWdzL0JBRy9JVEVNLmpzb24KKworVGhlIEpTT04gZm9yIHRoZSBJVEVNIG11c3QgY29udGFpbiBhIGtleSBuYW1lZCAiaWQiIHdpdGggYSB2YWx1ZSBlcXVhbCB0byAiSVRFTSIuIEZvciBleGFtcGxlLAorCisgICAgeworICAgICAgImlkIjogImZvbyIKKyAgICB9CisKK05leHQsIGNyZWF0ZSB0aGUgZGF0YSBiYWcgb24gdGhlIENoZWYgU2VydmVyLgorCisgICAga25pZmUgZGF0YSBiYWcgY3JlYXRlIEJBRworCitUaGVuIHVwbG9hZCB0aGUgaXRlbXMgaW4gdGhlIGRhdGEgYmFnJ3MgZGlyZWN0b3J5IHRvIHRoZSBDaGVmIFNlcnZlci4KKworICAgIGtuaWZlIGRhdGEgYmFnIGZyb20gZmlsZSBCQUcgSVRFTS5qc29uCisKKworRW5jcnlwdGVkIERhdGEgQmFncworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZGRlZCBpbiBDaGVmIDAuMTAsIGVuY3J5cHRlZCBkYXRhIGJhZ3MgYWxsb3cgeW91IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZGF0YSBiYWdzLiBUaGUgY29udGVudCBvZiBhdHRyaWJ1dGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNlYXJjaGFibGUuIFRvIHVzZSBlbmNyeXB0ZWQgZGF0YSBiYWdzLCBmaXJzdCB5b3UgbXVzdCBoYXZlIG9yIGNyZWF0ZSBhIHNlY3JldCBrZXkuCisKKyAgICBvcGVuc3NsIHJhbmQgLWJhc2U2NCA1MTIgPiBzZWNyZXRfa2V5CisKK1lvdSBtYXkgdXNlIHRoaXMgc2VjcmV0X2tleSB0byBhZGQgaXRlbXMgdG8gYSBkYXRhIGJhZyBkdXJpbmcgYSBjcmVhdGUuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBjcmVhdGUgLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5IHBhc3N3b3JkcyBteXNxbAorCitZb3UgbWF5IGFsc28gdXNlIGl0IHdoZW4gYWRkaW5nIElURU1zIGZyb20gZmlsZXMsCisKKyAgICBrbmlmZSBkYXRhIGJhZyBjcmVhdGUgcGFzc3dvcmRzCisgICAga25pZmUgZGF0YSBiYWcgZnJvbSBmaWxlIHBhc3N3b3JkcyBkYXRhX2JhZ3MvcGFzc3dvcmRzL215c3FsLmpzb24gLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5CisKK1RoZSBKU09OIGZvciB0aGUgSVRFTSBtdXN0IGNvbnRhaW4gYSBrZXkgbmFtZWQgImlkIiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gIklURU0iIGFuZCB0aGUgY29udGVudHMgd2lsbCBiZSBlbmNyeXB0ZWQgd2hlbiB1cGxvYWRlZC4gRm9yIGV4YW1wbGUsCisKKyAgICB7CisgICAgICAiaWQiOiAibXlzcWwiLAorICAgICAgInBhc3N3b3JkIjogImFiYzEyMyIKKyAgICB9CisKK1dpdGhvdXQgdGhlIHNlY3JldF9rZXksIHRoZSBjb250ZW50cyBhcmUgZW5jcnlwdGVkLgorCisgICAga25pZmUgZGF0YSBiYWcgc2hvdyBwYXNzd29yZHMgbXlzcWwKKyAgICBpZDogICAgICAgIG15c3FsCisgICAgcGFzc3dvcmQ6ICAySTBYVVV2ZTFUWEVvakV5ZUdzamh3PT0KKworVXNlIHRoZSBzZWNyZXRfa2V5IHRvIHZpZXcgdGhlIGNvbnRlbnRzLgorCisgICAga25pZmUgZGF0YSBiYWcgc2hvdyBwYXNzd29yZHMgbXlzcWwgLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5CisgICAgaWQ6ICAgICAgICBteXNxbAorICAgIHBhc3N3b3JkOiAgYWJjMTIzCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL2Vudmlyb25tZW50cy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtc29sby9lbnZpcm9ubWVudHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWM0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtc29sby9lbnZpcm9ubWVudHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNSBAQAorUmVxdWlyZXMgQ2hlZiAwLjEwLjArLgorCitUaGlzIGRpcmVjdG9yeSBpcyBmb3IgUnVieSBEU0wgYW5kIEpTT04gZmlsZXMgZm9yIGVudmlyb25tZW50cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBDaGVmIHdpa2kgcGFnZToKKworaHR0cDovL2RvY3MuY2hlZi5pby9lbnZpcm9ubWVudHMuaHRtbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vcm9sZXMvUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vcm9sZXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWUwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQKQEAgLTAsMCArMSwxNiBAQAorQ3JlYXRlIHJvbGVzIGhlcmUsIGluIGVpdGhlciB0aGUgUm9sZSBSdWJ5IERTTCAoLnJiKSBvciBKU09OICguanNvbikgZmlsZXMuIFRvIGluc3RhbGwgcm9sZXMgb24gdGhlIHNlcnZlciwgdXNlIGtuaWZlLgorCitGb3IgZXhhbXBsZSwgY3JlYXRlIGByb2xlcy9iYXNlX2V4YW1wbGUucmJgOgorCisgICAgbmFtZSAiYmFzZV9leGFtcGxlIgorICAgIGRlc2NyaXB0aW9uICJFeGFtcGxlIGJhc2Ugcm9sZSBhcHBsaWVkIHRvIGFsbCBub2Rlcy4iCisgICAgIyBMaXN0IG9mIHJlY2lwZXMgYW5kIHJvbGVzIHRvIGFwcGx5LiBSZXF1aXJlcyBDaGVmIDAuOCwgZWFybGllciB2ZXJzaW9ucyB1c2UgJ3JlY2lwZXMoKScuCisgICAgI3J1bl9saXN0KCkKKyAgICAjIEF0dHJpYnV0ZXMgYXBwbGllZCBpZiB0aGUgbm9kZSBkb2Vzbid0IGhhdmUgaXQgc2V0IGFscmVhZHkuCisgICAgI2RlZmF1bHRfYXR0cmlidXRlcygpCisgICAgIyBBdHRyaWJ1dGVzIGFwcGxpZWQgbm8gbWF0dGVyIHdoYXQgdGhlIG5vZGUgaGFzIHNldCBhbHJlYWR5LgorICAgICNvdmVycmlkZV9hdHRyaWJ1dGVzKCkKKworVGhlbiB1cGxvYWQgaXQgdG8gdGhlIENoZWYgU2VydmVyOgorICAgIAorICAgIGtuaWZlIHJvbGUgZnJvbSBmaWxlIHJvbGVzL2Jhc2VfZXhhbXBsZS5yYgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vcm9sZXMvY2Fzc2FuZHJhLWFjdGlvbnMuanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL3JvbGVzL2Nhc3NhbmRyYS1hY3Rpb25zLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4OTMxYwotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL3JvbGVzL2Nhc3NhbmRyYS1hY3Rpb25zLmpzb24KQEAgLTAsMCArMSwyMyBAQAoreworICAibmFtZSI6ICJjYXNzYW5kcmEtYWN0aW9ucyIsCisgICJkZXNjcmlwdGlvbiI6ICJjYXNzYW5kcmEtYWN0aW9ucyIsCisgICJqc29uX2NsYXNzIjogIkNoZWY6OlJvbGUiLAorICAiZGVmYXVsdF9hdHRyaWJ1dGVzIjogeworCisgIH0sCisgICJvdmVycmlkZV9hdHRyaWJ1dGVzIjogeworCisgIH0sCisgICJjaGVmX3R5cGUiOiAicm9sZSIsCisgICJydW5fbGlzdCI6IFsKKyAgICAicmVjaXBlW2Nhc3NhbmRyYS1hY3Rpb25zOjowMi1jcmVhdGVDc1VzZXJdIiwKKyAgICAicmVjaXBlW2Nhc3NhbmRyYS1hY3Rpb25zOjowMy1jcmVhdGVEb3hLZXlzcGFjZV0iLAorICAgICJyZWNpcGVbY2Fzc2FuZHJhLWFjdGlvbnM6OjA0LXNjaGVtYUNyZWF0aW9uXSIKKyAgXSwKKworICAiZW52X3J1bl9saXN0cyI6IHsKKworICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vc29sby5qc29uIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vc29sby5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjFlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL2NoZWYtc29sby9zb2xvLmpzb24KQEAgLTAsMCArMSw2IEBACit7CisgICAgInJ1bl9saXN0IjogWworICAgICAgICAicm9sZVtjYXNzYW5kcmEtYWN0aW9uc10iIAorICAgIF0KK30KKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9jaGVmLXNvbG8vc29sby5yYiBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL3NvbG8ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjMWFmNAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1jYXNzYW5kcmEvY2hlZi1zb2xvL3NvbG8ucmIKQEAgLTAsMCArMSwxNiBAQAorcm9vdCA9IEZpbGUuYWJzb2x1dGVfcGF0aChGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorZmlsZV9jYWNoZV9wYXRoIHJvb3QKK2Nvb2tib29rX3BhdGggcm9vdCArICcvY29va2Jvb2tzJworanNvbl9hdHRyaWJzIHJvb3QgKyAnL3NvbG8uanNvbicKK2NoZWNrc3VtX3BhdGggcm9vdCArICcvY2hlY2tzdW1zJworZGF0YV9iYWdfcGF0aCByb290ICsgJy9kYXRhX2JhZ3MnCitlbnZpcm9ubWVudF9wYXRoIHJvb3QgKyAnL2Vudmlyb25tZW50cycKK2ZpbGVfYmFja3VwX3BhdGggcm9vdCArICcvYmFja3VwJworZmlsZV9jYWNoZV9wYXRoIHJvb3QgKyAnL2NhY2hlJworbG9nX2xldmVsIDppbmZvCitsb2dfbG9jYXRpb24gU1RET1VUCityZXN0X3RpbWVvdXQgMzAwCityb2xlX3BhdGggcm9vdCArICcvcm9sZXMnCitzeW50YXhfY2hlY2tfY2FjaGVfcGF0aAordW1hc2sgMDAyMgordmVyYm9zZV9sb2dnaW5nIG5pbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9zdGFydHVwLnNoIGIvc2RjLW9zLWNoZWYvc2RjLWNhc3NhbmRyYS9zdGFydHVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTUxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtY2Fzc2FuZHJhL3N0YXJ0dXAuc2gKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisKK2NkIC9yb290L2NoZWYtc29sbworZXhwb3J0IENIRUZOQU1FPSR7RU5WTkFNRX0KKworc2VkIC1pICJzL0hPU1RJUC8ke0hPU1RfSVB9L2ciIC9yb290L2NoZWYtc29sby9jb29rYm9va3MvY2Fzc2FuZHJhLWFjdGlvbnMvcmVjaXBlcy8wMi1jcmVhdGVDc1VzZXIucmIKK3NlZCAtaSAicy9IT1NUSVAvJHtIT1NUX0lQfS9nIiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3JlY2lwZXMvMDMtY3JlYXRlRG94S2V5c3BhY2UucmIKK3NlZCAtaSAicy9IT1NUSVAvJHtIT1NUX0lQfS9nIiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL2Nhc3NhbmRyYS1hY3Rpb25zL3JlY2lwZXMvMDQtc2NoZW1hQ3JlYXRpb24ucmIKKworY2hlZi1zb2xvIC1jIHNvbG8ucmIgLW8gcmVjaXBlW2Nhc3NhbmRyYS1hY3Rpb25zOjowMS1jb25maWd1cmVDYXNzYW5kcmFdIC1FICR7Q0hFRk5BTUV9CityYz0kPworCitpZiBbWyAkcmMgIT0gMCBdXTsgdGhlbiBleGl0ICRyYzsgZmkKK2VjaG8gIiMjIyMjIyMjIyMjIHN0YXJ0aW5nIGNhc3NhbmRyYSAjIyMjIyMjIyMjIyIKKyMgc3RhcnQgY2Fzc2FuZHJhCisvZG9ja2VyLWVudHJ5cG9pbnQuc2ggY2Fzc2FuZHJhIC1mICYKKworY2hlZi1zb2xvIC1jIHNvbG8ucmIgIC1FICR7Q0hFRk5BTUV9CisKK2NkIC90bXAvCisvdG1wL2NyZWF0ZV9jYXNzYW5kcmFfdXNlci5zaAorL3RtcC9jcmVhdGVfZG94X2tleXNwYWNlLnNoCisvYmluL2NobW9kICt4IHNkY3Rvb2wvc2NyaXB0cy8qLnNoCisuL3NkY3Rvb2wvc2NyaXB0cy9zY2hlbWFDcmVhdGlvbi5zaCAvdG1wL3NkY3Rvb2wvY29uZmlnCisKK3doaWxlIHRydWU7IGRvIHNsZWVwIDI7IGRvbmUKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvRG9ja2VyZmlsZSBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkYmE5NgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyMSBAQAorRlJPTSBlbGFzdGljc2VhcmNoOjIuMS4yCisKK1JVTiBhcHQtZ2V0IC15IHVwZGF0ZQorUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCBhcHQtdXRpbHMKK1JVTiBhcHQtZ2V0IC15IGluc3RhbGwgY3VybAorUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCB2aW0KK1JVTiBta2RpciAtcCAvdmFyL2NoZWYvbm9kZXMKKworQ09QWSBjaGVmLXNvbG8gL3Jvb3QvY2hlZi1zb2xvLworQ09QWSBjaGVmLXJlcG8vY29va2Jvb2tzIC9yb290L2NoZWYtc29sby9jb29rYm9va3MvCisKK0VOViBCQVNFX05FWFVTIHpsOTk5eTpDaGFuZ2VNZUAxMC4yMDguMTk3Ljc1Ojg0NDMvcmVwb3NpdG9yeS9tYXZlbi1wdWJsaWMvb3JnL29wZW5lY29tcC9zZGMKKworIyBpbnN0YWxsIGNoZWYtc29sbworUlVOIGN1cmwgLUwgaHR0cHM6Ly93d3cub3BzY29kZS5jb20vY2hlZi9pbnN0YWxsLnNoIHwgYmFzaAorCitDT1BZIHN0YXJ0dXAuc2ggL3Jvb3QvCisKK1JVTiBjaG1vZCA3NzAgL3Jvb3Qvc3RhcnR1cC5zaAorCitFTlRSWVBPSU5UIFsgIi9yb290L3N0YXJ0dXAuc2giIF0KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvYXR0cmlidXRlcy9kZWZhdWx0LnJiIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9hdHRyaWJ1dGVzL2RlZmF1bHQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4N2NhOAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvYXR0cmlidXRlcy9kZWZhdWx0LnJiCkBAIC0wLDAgKzEgQEAKKyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvZGFzaGJvYXJkX0JJLURhc2hib2FyZC5qc29uIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L2Rhc2hib2FyZF9CSS1EYXNoYm9hcmQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQwYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L2Rhc2hib2FyZF9CSS1EYXNoYm9hcmQuanNvbgpAQCAtMCwwICsxLDEzIEBACit7CisgICAgInRpdGxlIjogIkJJIERhc2hib2FyZCIsCisgICAgImhpdHMiOiAwLAorICAgICJkZXNjcmlwdGlvbiI6ICIiLAorICAgICJwYW5lbHNKU09OIjogIlt7XCJjb2xcIjoxLFwiaWRcIjpcIlNob3ctYWxsLWNlcnRpZmllZC1zZXJ2aWNlcy1hbXBlcnNhbmQtcmVzb3VyY2VzLShwZXItZGF5KVwiLFwicGFuZWxJbmRleFwiOjEsXCJyb3dcIjoxLFwic2l6ZV94XCI6NixcInNpemVfeVwiOjUsXCJ0eXBlXCI6XCJ2aXN1YWxpemF0aW9uXCJ9LHtcImNvbFwiOjcsXCJpZFwiOlwiU2hvdy1hbGwtZGlzdHJpYnV0ZWQtc2VydmljZXNcIixcInBhbmVsSW5kZXhcIjoyLFwicm93XCI6MSxcInNpemVfeFwiOjYsXCJzaXplX3lcIjo1LFwidHlwZVwiOlwidmlzdWFsaXphdGlvblwifSx7XCJpZFwiOlwiU2hvdy1hbGwtY3JlYXRlZC1SZXNvdXJjZXMtc2xhc2gtU2VydmljZXMtc2xhc2gtUHJvZHVjdHNcIixcInR5cGVcIjpcInZpc3VhbGl6YXRpb25cIixcInBhbmVsSW5kZXhcIjozLFwic2l6ZV94XCI6NixcInNpemVfeVwiOjQsXCJjb2xcIjoxLFwicm93XCI6Nn0se1wiaWRcIjpcIm51bWJlci1vZi11c2VyLWFjY2Vzc2VzXCIsXCJ0eXBlXCI6XCJ2aXN1YWxpemF0aW9uXCIsXCJwYW5lbEluZGV4XCI6NCxcInNpemVfeFwiOjYsXCJzaXplX3lcIjo0LFwiY29sXCI6NyxcInJvd1wiOjZ9XSIsCisgICAgIm9wdGlvbnNKU09OIjogIntcImRhcmtUaGVtZVwiOmZhbHNlfSIsCisgICAgInVpU3RhdGVKU09OIjogInt9IiwKKyAgICAidmVyc2lvbiI6IDEsCisgICAgInRpbWVSZXN0b3JlIjogZmFsc2UsCisgICAgImtpYmFuYVNhdmVkT2JqZWN0TWV0YSI6IHsKKyAgICAgICJzZWFyY2hTb3VyY2VKU09OIjogIntcImZpbHRlclwiOlt7XCJxdWVyeVwiOntcInF1ZXJ5X3N0cmluZ1wiOntcImFuYWx5emVfd2lsZGNhcmRcIjp0cnVlLFwicXVlcnlcIjpcIipcIn19fV19IgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC9kYXNoYm9hcmRfTW9uaXRvcmluZy1EYXNoYm9hcmVkLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvZGFzaGJvYXJkX01vbml0b3JpbmctRGFzaGJvYXJlZC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjljMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvZGFzaGJvYXJkX01vbml0b3JpbmctRGFzaGJvYXJlZC5qc29uCkBAIC0wLDAgKzEsMTUgQEAKK3sKKyAgICAidGl0bGUiOiAiTW9uaXRvcmluZyBEYXNoYm9hcmVkIiwKKyAgICAiaGl0cyI6IDAsCisgICAgImRlc2NyaXB0aW9uIjogIiIsCisgICAgInBhbmVsc0pTT04iOiAiW3tcImlkXCI6XCJKVk0tdXNlZC1DUFVcIixcInR5cGVcIjpcInZpc3VhbGl6YXRpb25cIixcInBhbmVsSW5kZXhcIjoxLFwic2l6ZV94XCI6NixcInNpemVfeVwiOjUsXCJjb2xcIjoxLFwicm93XCI6NX0se1wiaWRcIjpcIkpWTS11c2VkLU1lbW9yeVwiLFwidHlwZVwiOlwidmlzdWFsaXphdGlvblwiLFwicGFuZWxJbmRleFwiOjIsXCJzaXplX3hcIjo2LFwic2l6ZV95XCI6NCxcImNvbFwiOjEsXCJyb3dcIjoxfSx7XCJpZFwiOlwiSlZNLXVzZWQtVGhyZWFkcy1OdW1cIixcInR5cGVcIjpcInZpc3VhbGl6YXRpb25cIixcInBhbmVsSW5kZXhcIjozLFwic2l6ZV94XCI6NixcInNpemVfeVwiOjQsXCJjb2xcIjo3LFwicm93XCI6MX0se1wiaWRcIjpcImhvc3QtdXNlZC1DUFVcIixcInR5cGVcIjpcInZpc3VhbGl6YXRpb25cIixcInBhbmVsSW5kZXhcIjo0LFwic2l6ZV94XCI6MyxcInNpemVfeVwiOjIsXCJjb2xcIjo3LFwicm93XCI6NX0se1wiaWRcIjpcImhvc3QtdXNlZC1NZW1vcnlcIixcInR5cGVcIjpcInZpc3VhbGl6YXRpb25cIixcInBhbmVsSW5kZXhcIjo1LFwic2l6ZV94XCI6MyxcInNpemVfeVwiOjIsXCJjb2xcIjoxMCxcInJvd1wiOjV9LHtcImlkXCI6XCJob3N0LXVzZWQtVGhyZWFkcy1OdW1cIixcInR5cGVcIjpcInZpc3VhbGl6YXRpb25cIixcInBhbmVsSW5kZXhcIjo2LFwic2l6ZV94XCI6MyxcInNpemVfeVwiOjIsXCJjb2xcIjo3LFwicm93XCI6N31dIiwKKyAgICAib3B0aW9uc0pTT04iOiAie1wiZGFya1RoZW1lXCI6ZmFsc2V9IiwKKyAgICAidWlTdGF0ZUpTT04iOiAie30iLAorICAgICJ2ZXJzaW9uIjogMSwKKyAgICAidGltZVJlc3RvcmUiOiB0cnVlLAorICAgICJ0aW1lVG8iOiAibm93IiwKKyAgICAidGltZUZyb20iOiAibm93LTI0aCIsCisgICAgImtpYmFuYVNhdmVkT2JqZWN0TWV0YSI6IHsKKyAgICAgICAgInNlYXJjaFNvdXJjZUpTT04iOiAie1wiZmlsdGVyXCI6W3tcInF1ZXJ5XCI6e1wicXVlcnlfc3RyaW5nXCI6e1wicXVlcnlcIjpcIipcIixcImFuYWx5emVfd2lsZGNhcmRcIjp0cnVlfX19XX0iCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC9sb2dnaW5nLnltbCBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC9sb2dnaW5nLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhmYjNjCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L2xvZ2dpbmcueW1sCkBAIC0wLDAgKzEsMjMgQEAKKyMgeW91IGNhbiBvdmVycmlkZSB0aGlzIHVzaW5nIGJ5IHNldHRpbmcgYSBzeXN0ZW0gcHJvcGVydHksIGZvciBleGFtcGxlIC1EZXMubG9nZ2VyLmxldmVsPURFQlVHCitlcy5sb2dnZXIubGV2ZWw6IElORk8KK3Jvb3RMb2dnZXI6ICR7ZXMubG9nZ2VyLmxldmVsfSwgY29uc29sZQorbG9nZ2VyOgorICAjIGxvZyBhY3Rpb24gZXhlY3V0aW9uIGVycm9ycyBmb3IgZWFzaWVyIGRlYnVnZ2luZworICBhY3Rpb246IERFQlVHCisgICMgcmVkdWNlIHRoZSBsb2dnaW5nIGZvciBhd3MsIHRvbyBtdWNoIGlzIGxvZ2dlZCB1bmRlciB0aGUgZGVmYXVsdCBJTkZPCisgIGNvbS5hbWF6b25hd3M6IFdBUk4KKworYXBwZW5kZXI6CisgIGNvbnNvbGU6CisgICAgdHlwZTogY29uc29sZQorICAgIGxheW91dDoKKyAgICAgIHR5cGU6IGNvbnNvbGVQYXR0ZXJuCisgICAgICBjb252ZXJzaW9uUGF0dGVybjogIlslZHtJU084NjAxfV1bJS01cF1bJS0yNWNdICVtJW4iCisKKyAgZmlsZToKKyAgICB0eXBlOiBkYWlseVJvbGxpbmdGaWxlCisgICAgZmlsZTogJHtwYXRoLmxvZ3N9LyR7Y2x1c3Rlci5uYW1lfS5sb2cKKyAgICBkYXRlUGF0dGVybjogIicuJ3l5eXktTU0tZGQiCisgICAgbGF5b3V0OgorICAgICAgdHlwZTogcGF0dGVybgorICAgICAgY29udmVyc2lvblBhdHRlcm46ICJbJWR7SVNPODYwMX1dWyUtNXBdWyUtMjVjXSAlLjEwMDAwbSVuIgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fSlZNLXVzZWQtQ1BVLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvdmlzdWFsaXphdGlvbl9KVk0tdXNlZC1DUFUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTU2NWNmCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fSlZNLXVzZWQtQ1BVLmpzb24KQEAgLTAsMCArMSwxMCBAQAoreworICAgICJ0aXRsZSI6ICJKVk0gdXNlZCBDUFUiLAorICAgICJ2aXNTdGF0ZSI6ICJ7XCJ0eXBlXCI6XCJsaW5lXCIsXCJwYXJhbXNcIjp7XCJzaGFyZVlBeGlzXCI6dHJ1ZSxcImFkZFRvb2x0aXBcIjp0cnVlLFwiYWRkTGVnZW5kXCI6dHJ1ZSxcInNob3dDaXJjbGVzXCI6dHJ1ZSxcInNtb290aExpbmVzXCI6ZmFsc2UsXCJpbnRlcnBvbGF0ZVwiOlwibGluZWFyXCIsXCJzY2FsZVwiOlwibGluZWFyXCIsXCJkcmF3TGluZXNCZXR3ZWVuUG9pbnRzXCI6dHJ1ZSxcInJhZGl1c1JhdGlvXCI6OSxcInRpbWVzXCI6W10sXCJhZGRUaW1lTWFya2VyXCI6ZmFsc2UsXCJkZWZhdWx0WUV4dGVudHNcIjpmYWxzZSxcInNldFlFeHRlbnRzXCI6ZmFsc2UsXCJ5QXhpc1wiOnt9fSxcImFnZ3NcIjpbe1wiaWRcIjpcIjFcIixcInR5cGVcIjpcImF2Z1wiLFwic2NoZW1hXCI6XCJtZXRyaWNcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJqdm1jcHVcIn19LHtcImlkXCI6XCIyXCIsXCJ0eXBlXCI6XCJkYXRlX2hpc3RvZ3JhbVwiLFwic2NoZW1hXCI6XCJzZWdtZW50XCIsXCJwYXJhbXNcIjp7XCJmaWVsZFwiOlwidGltZXN0YW1wXCIsXCJpbnRlcnZhbFwiOlwiaFwiLFwiY3VzdG9tSW50ZXJ2YWxcIjpcIjJoXCIsXCJtaW5fZG9jX2NvdW50XCI6MSxcImV4dGVuZGVkX2JvdW5kc1wiOnt9fX0se1wiaWRcIjpcIjNcIixcInR5cGVcIjpcInRlcm1zXCIsXCJzY2hlbWFcIjpcImdyb3VwXCIsXCJwYXJhbXNcIjp7XCJmaWVsZFwiOlwianZtaWRcIixcInNpemVcIjo1LFwib3JkZXJcIjpcImRlc2NcIixcIm9yZGVyQnlcIjpcIjFcIn19LHtcImlkXCI6XCI0XCIsXCJ0eXBlXCI6XCJ0ZXJtc1wiLFwic2NoZW1hXCI6XCJzcGxpdFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcImhvc3RpZFwiLFwic2l6ZVwiOjUsXCJvcmRlclwiOlwiZGVzY1wiLFwib3JkZXJCeVwiOlwiMVwiLFwicm93XCI6dHJ1ZX19XSxcImxpc3RlbmVyc1wiOnt9fSIsCisgICAgInVpU3RhdGVKU09OIjogInt9IiwKKyAgICAiZGVzY3JpcHRpb24iOiAiIiwKKyAgICAidmVyc2lvbiI6IDEsCisgICAgImtpYmFuYVNhdmVkT2JqZWN0TWV0YSI6IHsKKyAgICAgICAgInNlYXJjaFNvdXJjZUpTT04iOiAie1wiaW5kZXhcIjpcIm1vbml0b3JpbmdfZXZlbnRzLSpcIixcInF1ZXJ5XCI6e1wicXVlcnlfc3RyaW5nXCI6e1wicXVlcnlcIjpcIipcIixcImFuYWx5emVfd2lsZGNhcmRcIjp0cnVlfX0sXCJmaWx0ZXJcIjpbXX0iCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX0pWTS11c2VkLU1lbW9yeS5qc29uIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fSlZNLXVzZWQtTWVtb3J5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzMGRmNAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX0pWTS11c2VkLU1lbW9yeS5qc29uCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgICAidGl0bGUiOiAiSlZNIHVzZWQgTWVtb3J5IiwKKyAgICAidmlzU3RhdGUiOiAie1widHlwZVwiOlwibGluZVwiLFwicGFyYW1zXCI6e1wic2hhcmVZQXhpc1wiOnRydWUsXCJhZGRUb29sdGlwXCI6dHJ1ZSxcImFkZExlZ2VuZFwiOnRydWUsXCJzaG93Q2lyY2xlc1wiOnRydWUsXCJzbW9vdGhMaW5lc1wiOmZhbHNlLFwiaW50ZXJwb2xhdGVcIjpcImxpbmVhclwiLFwic2NhbGVcIjpcImxpbmVhclwiLFwiZHJhd0xpbmVzQmV0d2VlblBvaW50c1wiOnRydWUsXCJyYWRpdXNSYXRpb1wiOjksXCJ0aW1lc1wiOltdLFwiYWRkVGltZU1hcmtlclwiOmZhbHNlLFwiZGVmYXVsdFlFeHRlbnRzXCI6ZmFsc2UsXCJzZXRZRXh0ZW50c1wiOmZhbHNlLFwieUF4aXNcIjp7fX0sXCJhZ2dzXCI6W3tcImlkXCI6XCIxXCIsXCJ0eXBlXCI6XCJhdmdcIixcInNjaGVtYVwiOlwibWV0cmljXCIsXCJwYXJhbXNcIjp7XCJmaWVsZFwiOlwianZtbWVtXCJ9fSx7XCJpZFwiOlwiMlwiLFwidHlwZVwiOlwiZGF0ZV9oaXN0b2dyYW1cIixcInNjaGVtYVwiOlwic2VnbWVudFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcInRpbWVzdGFtcFwiLFwiaW50ZXJ2YWxcIjpcImhcIixcImN1c3RvbUludGVydmFsXCI6XCIyaFwiLFwibWluX2RvY19jb3VudFwiOjEsXCJleHRlbmRlZF9ib3VuZHNcIjp7fX19LHtcImlkXCI6XCIzXCIsXCJ0eXBlXCI6XCJ0ZXJtc1wiLFwic2NoZW1hXCI6XCJncm91cFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcImp2bWlkXCIsXCJzaXplXCI6NSxcIm9yZGVyXCI6XCJkZXNjXCIsXCJvcmRlckJ5XCI6XCIxXCJ9fSx7XCJpZFwiOlwiNFwiLFwidHlwZVwiOlwidGVybXNcIixcInNjaGVtYVwiOlwic3BsaXRcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJob3N0aWRcIixcInNpemVcIjo1LFwib3JkZXJcIjpcImRlc2NcIixcIm9yZGVyQnlcIjpcIjFcIixcInJvd1wiOnRydWV9fV0sXCJsaXN0ZW5lcnNcIjp7fX0iLAorICAgICJ1aVN0YXRlSlNPTiI6ICJ7fSIsCisgICAgImRlc2NyaXB0aW9uIjogIiIsCisgICAgInZlcnNpb24iOiAxLAorICAgICJraWJhbmFTYXZlZE9iamVjdE1ldGEiOiB7CisgICAgICAgICJzZWFyY2hTb3VyY2VKU09OIjogIntcImluZGV4XCI6XCJtb25pdG9yaW5nX2V2ZW50cy0qXCIsXCJxdWVyeVwiOntcInF1ZXJ5X3N0cmluZ1wiOntcInF1ZXJ5XCI6XCIqXCIsXCJhbmFseXplX3dpbGRjYXJkXCI6dHJ1ZX19LFwiZmlsdGVyXCI6W119IgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX0pWTS11c2VkLVRocmVhZHMtTnVtLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvdmlzdWFsaXphdGlvbl9KVk0tdXNlZC1UaHJlYWRzLU51bS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDA0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvdmlzdWFsaXphdGlvbl9KVk0tdXNlZC1UaHJlYWRzLU51bS5qc29uCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgICAidGl0bGUiOiAiSlZNIHVzZWQgVGhyZWFkcyBOdW0iLAorICAgICJ2aXNTdGF0ZSI6ICJ7XCJ0eXBlXCI6XCJsaW5lXCIsXCJwYXJhbXNcIjp7XCJzaGFyZVlBeGlzXCI6dHJ1ZSxcImFkZFRvb2x0aXBcIjp0cnVlLFwiYWRkTGVnZW5kXCI6dHJ1ZSxcInNob3dDaXJjbGVzXCI6dHJ1ZSxcInNtb290aExpbmVzXCI6ZmFsc2UsXCJpbnRlcnBvbGF0ZVwiOlwibGluZWFyXCIsXCJzY2FsZVwiOlwibGluZWFyXCIsXCJkcmF3TGluZXNCZXR3ZWVuUG9pbnRzXCI6dHJ1ZSxcInJhZGl1c1JhdGlvXCI6OSxcInRpbWVzXCI6W10sXCJhZGRUaW1lTWFya2VyXCI6ZmFsc2UsXCJkZWZhdWx0WUV4dGVudHNcIjpmYWxzZSxcInNldFlFeHRlbnRzXCI6ZmFsc2UsXCJ5QXhpc1wiOnt9fSxcImFnZ3NcIjpbe1wiaWRcIjpcIjFcIixcInR5cGVcIjpcImF2Z1wiLFwic2NoZW1hXCI6XCJtZXRyaWNcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJqdm10bnVtXCJ9fSx7XCJpZFwiOlwiMlwiLFwidHlwZVwiOlwiZGF0ZV9oaXN0b2dyYW1cIixcInNjaGVtYVwiOlwic2VnbWVudFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcInRpbWVzdGFtcFwiLFwiaW50ZXJ2YWxcIjpcImhcIixcImN1c3RvbUludGVydmFsXCI6XCIyaFwiLFwibWluX2RvY19jb3VudFwiOjEsXCJleHRlbmRlZF9ib3VuZHNcIjp7fX19LHtcImlkXCI6XCIzXCIsXCJ0eXBlXCI6XCJ0ZXJtc1wiLFwic2NoZW1hXCI6XCJncm91cFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcImp2bWlkXCIsXCJzaXplXCI6NSxcIm9yZGVyXCI6XCJkZXNjXCIsXCJvcmRlckJ5XCI6XCIxXCJ9fSx7XCJpZFwiOlwiNFwiLFwidHlwZVwiOlwidGVybXNcIixcInNjaGVtYVwiOlwic3BsaXRcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJob3N0aWRcIixcInNpemVcIjo1LFwib3JkZXJcIjpcImRlc2NcIixcIm9yZGVyQnlcIjpcIjFcIixcInJvd1wiOnRydWV9fV0sXCJsaXN0ZW5lcnNcIjp7fX0iLAorICAgICJ1aVN0YXRlSlNPTiI6ICJ7fSIsCisgICAgImRlc2NyaXB0aW9uIjogIiIsCisgICAgInZlcnNpb24iOiAxLAorICAgICJraWJhbmFTYXZlZE9iamVjdE1ldGEiOiB7CisgICAgICAgICJzZWFyY2hTb3VyY2VKU09OIjogIntcImluZGV4XCI6XCJtb25pdG9yaW5nX2V2ZW50cy0qXCIsXCJxdWVyeVwiOntcInF1ZXJ5X3N0cmluZ1wiOntcInF1ZXJ5XCI6XCIqXCIsXCJhbmFseXplX3dpbGRjYXJkXCI6dHJ1ZX19LFwiZmlsdGVyXCI6W119IgorICAgIH0KK30KZGlmZiAtLWdpdCAiYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvdmlzdWFsaXphdGlvbl9TaG93LWFsbC1jZXJ0aWZpZWQtc2VydmljZXMtYW1wZXJzYW5kLXJlc291cmNlcy1cMDUwcGVyLWRheVwwNTEuanNvbiIgImIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fU2hvdy1hbGwtY2VydGlmaWVkLXNlcnZpY2VzLWFtcGVyc2FuZC1yZXNvdXJjZXMtXDA1MHBlci1kYXlcMDUxLmpzb24iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkN2NlNmUKLS0tIC9kZXYvbnVsbAorKysgImIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fU2hvdy1hbGwtY2VydGlmaWVkLXNlcnZpY2VzLWFtcGVyc2FuZC1yZXNvdXJjZXMtXDA1MHBlci1kYXlcMDUxLmpzb24iCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgICAidGl0bGUiOiAiU2hvdyBhbGwgY2VydGlmaWVkIHNlcnZpY2VzICYgcmVzb3VyY2VzIChwZXIgZGF5KSIsCisgICAgInZpc1N0YXRlIjogIntcInR5cGVcIjpcImxpbmVcIixcInBhcmFtc1wiOntcInNoYXJlWUF4aXNcIjp0cnVlLFwiYWRkVG9vbHRpcFwiOnRydWUsXCJhZGRMZWdlbmRcIjp0cnVlLFwic2hvd0NpcmNsZXNcIjp0cnVlLFwic21vb3RoTGluZXNcIjpmYWxzZSxcImludGVycG9sYXRlXCI6XCJsaW5lYXJcIixcInNjYWxlXCI6XCJsaW5lYXJcIixcImRyYXdMaW5lc0JldHdlZW5Qb2ludHNcIjp0cnVlLFwicmFkaXVzUmF0aW9cIjo5LFwidGltZXNcIjpbXSxcImFkZFRpbWVNYXJrZXJcIjpmYWxzZSxcImRlZmF1bHRZRXh0ZW50c1wiOmZhbHNlLFwic2V0WUV4dGVudHNcIjpmYWxzZSxcInlBeGlzXCI6e319LFwiYWdnc1wiOlt7XCJpZFwiOlwiMVwiLFwidHlwZVwiOlwiY291bnRcIixcInNjaGVtYVwiOlwibWV0cmljXCIsXCJwYXJhbXNcIjp7fX0se1wiaWRcIjpcIjJcIixcInR5cGVcIjpcImRhdGVfaGlzdG9ncmFtXCIsXCJzY2hlbWFcIjpcInNlZ21lbnRcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJUSU1FU1RBTVBcIixcImludGVydmFsXCI6XCJkXCIsXCJjdXN0b21JbnRlcnZhbFwiOlwiMmhcIixcIm1pbl9kb2NfY291bnRcIjoxLFwiZXh0ZW5kZWRfYm91bmRzXCI6e319fV0sXCJsaXN0ZW5lcnNcIjp7fX0iLAorICAgICJ1aVN0YXRlSlNPTiI6ICJ7fSIsCisgICAgImRlc2NyaXB0aW9uIjogIiIsCisgICAgInZlcnNpb24iOiAxLAorICAgICJraWJhbmFTYXZlZE9iamVjdE1ldGEiOiB7CisgICAgICAgICJzZWFyY2hTb3VyY2VKU09OIjogIntcImluZGV4XCI6XCJhdWRpdGluZ2V2ZW50cy0qXCIsXCJxdWVyeVwiOntcInF1ZXJ5X3N0cmluZ1wiOntcInF1ZXJ5XCI6XCJBQ1RJT046XFxcIkNlcnRpZmljYXRpb25TdWNjZXNzXFxcIiBBTkQgKFJFU09VUkNFX1RZUEU6XFxcIlJlc291cmNlXFxcIiBPUiBSRVNPVVJDRV9UWVBFOlxcXCJTZXJ2aWNlXFxcIilcIixcImFuYWx5emVfd2lsZGNhcmRcIjp0cnVlfX0sXCJmaWx0ZXJcIjpbXX0iCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fU2hvdy1hbGwtY3JlYXRlZC1SZXNvdXJjZXMtc2xhc2gtU2VydmljZXMtc2xhc2gtUHJvZHVjdHMuanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX1Nob3ctYWxsLWNyZWF0ZWQtUmVzb3VyY2VzLXNsYXNoLVNlcnZpY2VzLXNsYXNoLVByb2R1Y3RzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlMDZjYQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX1Nob3ctYWxsLWNyZWF0ZWQtUmVzb3VyY2VzLXNsYXNoLVNlcnZpY2VzLXNsYXNoLVByb2R1Y3RzLmpzb24KQEAgLTAsMCArMSwxMCBAQAoreworICAgICJ0aXRsZSI6ICJTaG93IGFsbCBjcmVhdGVkIFJlc291cmNlcy9TZXJ2aWNlcy9Qcm9kdWN0cyIsCisgICAgInZpc1N0YXRlIjogIntcInR5cGVcIjpcImxpbmVcIixcInBhcmFtc1wiOntcInNoYXJlWUF4aXNcIjp0cnVlLFwiYWRkVG9vbHRpcFwiOnRydWUsXCJhZGRMZWdlbmRcIjp0cnVlLFwic2hvd0NpcmNsZXNcIjp0cnVlLFwic21vb3RoTGluZXNcIjpmYWxzZSxcImludGVycG9sYXRlXCI6XCJsaW5lYXJcIixcInNjYWxlXCI6XCJsaW5lYXJcIixcImRyYXdMaW5lc0JldHdlZW5Qb2ludHNcIjp0cnVlLFwicmFkaXVzUmF0aW9cIjo5LFwidGltZXNcIjpbXSxcImFkZFRpbWVNYXJrZXJcIjpmYWxzZSxcImRlZmF1bHRZRXh0ZW50c1wiOmZhbHNlLFwic2V0WUV4dGVudHNcIjpmYWxzZSxcInlBeGlzXCI6e319LFwiYWdnc1wiOlt7XCJpZFwiOlwiMVwiLFwidHlwZVwiOlwiY291bnRcIixcInNjaGVtYVwiOlwibWV0cmljXCIsXCJwYXJhbXNcIjp7fX0se1wiaWRcIjpcIjJcIixcInR5cGVcIjpcImRhdGVfaGlzdG9ncmFtXCIsXCJzY2hlbWFcIjpcInNlZ21lbnRcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJUSU1FU1RBTVBcIixcImludGVydmFsXCI6XCJkXCIsXCJjdXN0b21JbnRlcnZhbFwiOlwiMmhcIixcIm1pbl9kb2NfY291bnRcIjoxLFwiZXh0ZW5kZWRfYm91bmRzXCI6e319fSx7XCJpZFwiOlwiM1wiLFwidHlwZVwiOlwidGVybXNcIixcInNjaGVtYVwiOlwiZ3JvdXBcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJSRVNPVVJDRV9UWVBFXCIsXCJzaXplXCI6NSxcIm9yZGVyXCI6XCJkZXNjXCIsXCJvcmRlckJ5XCI6XCIxXCJ9fV0sXCJsaXN0ZW5lcnNcIjp7fX0iLAorICAgICJ1aVN0YXRlSlNPTiI6ICJ7fSIsCisgICAgImRlc2NyaXB0aW9uIjogIiIsCisgICAgInZlcnNpb24iOiAxLAorICAgICJraWJhbmFTYXZlZE9iamVjdE1ldGEiOiB7CisgICAgICAgICJzZWFyY2hTb3VyY2VKU09OIjogIntcImluZGV4XCI6XCJhdWRpdGluZ2V2ZW50cy0qXCIsXCJxdWVyeVwiOntcInF1ZXJ5X3N0cmluZ1wiOntcInF1ZXJ5XCI6XCJBQ1RJT046XFxcIkNyZWF0ZVxcXCJcIixcImFuYWx5emVfd2lsZGNhcmRcIjp0cnVlfX0sXCJmaWx0ZXJcIjpbXX0iCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fU2hvdy1hbGwtZGlzdHJpYnV0ZWQtc2VydmljZXMuanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX1Nob3ctYWxsLWRpc3RyaWJ1dGVkLXNlcnZpY2VzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzNzU3MwotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX1Nob3ctYWxsLWRpc3RyaWJ1dGVkLXNlcnZpY2VzLmpzb24KQEAgLTAsMCArMSwxMCBAQAoreworICAgICJ0aXRsZSI6ICJTaG93IGFsbCBkaXN0cmlidXRlZCBzZXJ2aWNlcyIsCisgICAgInZpc1N0YXRlIjogIntcInR5cGVcIjpcImxpbmVcIixcInBhcmFtc1wiOntcInNoYXJlWUF4aXNcIjp0cnVlLFwiYWRkVG9vbHRpcFwiOnRydWUsXCJhZGRMZWdlbmRcIjp0cnVlLFwic2hvd0NpcmNsZXNcIjp0cnVlLFwic21vb3RoTGluZXNcIjpmYWxzZSxcImludGVycG9sYXRlXCI6XCJsaW5lYXJcIixcInNjYWxlXCI6XCJsaW5lYXJcIixcImRyYXdMaW5lc0JldHdlZW5Qb2ludHNcIjp0cnVlLFwicmFkaXVzUmF0aW9cIjo5LFwidGltZXNcIjpbXSxcImFkZFRpbWVNYXJrZXJcIjpmYWxzZSxcImRlZmF1bHRZRXh0ZW50c1wiOmZhbHNlLFwic2V0WUV4dGVudHNcIjpmYWxzZSxcInlBeGlzXCI6e319LFwiYWdnc1wiOlt7XCJpZFwiOlwiMVwiLFwidHlwZVwiOlwiY291bnRcIixcInNjaGVtYVwiOlwibWV0cmljXCIsXCJwYXJhbXNcIjp7fX0se1wiaWRcIjpcIjJcIixcInR5cGVcIjpcImRhdGVfaGlzdG9ncmFtXCIsXCJzY2hlbWFcIjpcInNlZ21lbnRcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJUSU1FU1RBTVBcIixcImludGVydmFsXCI6XCJkXCIsXCJjdXN0b21JbnRlcnZhbFwiOlwiMmhcIixcIm1pbl9kb2NfY291bnRcIjoxLFwiZXh0ZW5kZWRfYm91bmRzXCI6e319fV0sXCJsaXN0ZW5lcnNcIjp7fX0iLAorICAgICJ1aVN0YXRlSlNPTiI6ICJ7fSIsCisgICAgImRlc2NyaXB0aW9uIjogIiIsCisgICAgInZlcnNpb24iOiAxLAorICAgICJraWJhbmFTYXZlZE9iamVjdE1ldGEiOiB7CisgICAgICAgICJzZWFyY2hTb3VyY2VKU09OIjogIntcImluZGV4XCI6XCJhdWRpdGluZ2V2ZW50cy0qXCIsXCJxdWVyeVwiOntcInF1ZXJ5X3N0cmluZ1wiOntcInF1ZXJ5XCI6XCJBQ1RJT046XFxcIkRSZXN1bHRcXFwiXCIsXCJhbmFseXplX3dpbGRjYXJkXCI6dHJ1ZX19LFwiZmlsdGVyXCI6W119IgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX2hvc3QtdXNlZC1DUFUuanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uX2hvc3QtdXNlZC1DUFUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzlmN2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25faG9zdC11c2VkLUNQVS5qc29uCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgICAidGl0bGUiOiAiaG9zdCB1c2VkIENQVSIsCisgICAgInZpc1N0YXRlIjogIntcInR5cGVcIjpcImxpbmVcIixcInBhcmFtc1wiOntcInNoYXJlWUF4aXNcIjp0cnVlLFwiYWRkVG9vbHRpcFwiOnRydWUsXCJhZGRMZWdlbmRcIjp0cnVlLFwic2hvd0NpcmNsZXNcIjp0cnVlLFwic21vb3RoTGluZXNcIjpmYWxzZSxcImludGVycG9sYXRlXCI6XCJsaW5lYXJcIixcInNjYWxlXCI6XCJsaW5lYXJcIixcImRyYXdMaW5lc0JldHdlZW5Qb2ludHNcIjp0cnVlLFwicmFkaXVzUmF0aW9cIjo5LFwidGltZXNcIjpbXSxcImFkZFRpbWVNYXJrZXJcIjpmYWxzZSxcImRlZmF1bHRZRXh0ZW50c1wiOmZhbHNlLFwic2V0WUV4dGVudHNcIjpmYWxzZSxcInlBeGlzXCI6e319LFwiYWdnc1wiOlt7XCJpZFwiOlwiMVwiLFwidHlwZVwiOlwiYXZnXCIsXCJzY2hlbWFcIjpcIm1ldHJpY1wiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcImhvc3RjcHVcIn19LHtcImlkXCI6XCIyXCIsXCJ0eXBlXCI6XCJkYXRlX2hpc3RvZ3JhbVwiLFwic2NoZW1hXCI6XCJzZWdtZW50XCIsXCJwYXJhbXNcIjp7XCJmaWVsZFwiOlwidGltZXN0YW1wXCIsXCJpbnRlcnZhbFwiOlwiaFwiLFwiY3VzdG9tSW50ZXJ2YWxcIjpcIjI0aFwiLFwibWluX2RvY19jb3VudFwiOjEsXCJleHRlbmRlZF9ib3VuZHNcIjp7fX19LHtcImlkXCI6XCIzXCIsXCJ0eXBlXCI6XCJ0ZXJtc1wiLFwic2NoZW1hXCI6XCJncm91cFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcImhvc3RpZFwiLFwic2l6ZVwiOjEwLFwib3JkZXJcIjpcImRlc2NcIixcIm9yZGVyQnlcIjpcIjFcIn19XSxcImxpc3RlbmVyc1wiOnt9fSIsCisgICAgInVpU3RhdGVKU09OIjogInt9IiwKKyAgICAiZGVzY3JpcHRpb24iOiAiIiwKKyAgICAidmVyc2lvbiI6IDEsCisgICAgImtpYmFuYVNhdmVkT2JqZWN0TWV0YSI6IHsKKyAgICAgICAgInNlYXJjaFNvdXJjZUpTT04iOiAie1wiaW5kZXhcIjpcIm1vbml0b3JpbmdfZXZlbnRzLSpcIixcInF1ZXJ5XCI6e1wicXVlcnlfc3RyaW5nXCI6e1wicXVlcnlcIjpcIipcIixcImFuYWx5emVfd2lsZGNhcmRcIjp0cnVlfX0sXCJmaWx0ZXJcIjpbXX0iCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25faG9zdC11c2VkLVRocmVhZHMtTnVtLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvdmlzdWFsaXphdGlvbl9ob3N0LXVzZWQtVGhyZWFkcy1OdW0uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmE3YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25faG9zdC11c2VkLVRocmVhZHMtTnVtLmpzb24KQEAgLTAsMCArMSwxMCBAQAoreworICAgICJ0aXRsZSI6ICJob3N0IHVzZWQgVGhyZWFkcyBOdW0iLAorICAgICJ2aXNTdGF0ZSI6ICJ7XCJ0eXBlXCI6XCJsaW5lXCIsXCJwYXJhbXNcIjp7XCJzaGFyZVlBeGlzXCI6dHJ1ZSxcImFkZFRvb2x0aXBcIjp0cnVlLFwiYWRkTGVnZW5kXCI6dHJ1ZSxcInNob3dDaXJjbGVzXCI6dHJ1ZSxcInNtb290aExpbmVzXCI6ZmFsc2UsXCJpbnRlcnBvbGF0ZVwiOlwibGluZWFyXCIsXCJzY2FsZVwiOlwibGluZWFyXCIsXCJkcmF3TGluZXNCZXR3ZWVuUG9pbnRzXCI6dHJ1ZSxcInJhZGl1c1JhdGlvXCI6OSxcInRpbWVzXCI6W10sXCJhZGRUaW1lTWFya2VyXCI6ZmFsc2UsXCJkZWZhdWx0WUV4dGVudHNcIjpmYWxzZSxcInNldFlFeHRlbnRzXCI6ZmFsc2UsXCJ5QXhpc1wiOnt9fSxcImFnZ3NcIjpbe1wiaWRcIjpcIjFcIixcInR5cGVcIjpcImF2Z1wiLFwic2NoZW1hXCI6XCJtZXRyaWNcIixcInBhcmFtc1wiOntcImZpZWxkXCI6XCJqdm10bnVtXCJ9fSx7XCJpZFwiOlwiMlwiLFwidHlwZVwiOlwiZGF0ZV9oaXN0b2dyYW1cIixcInNjaGVtYVwiOlwic2VnbWVudFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcInRpbWVzdGFtcFwiLFwiaW50ZXJ2YWxcIjpcImhcIixcImN1c3RvbUludGVydmFsXCI6XCIyaFwiLFwibWluX2RvY19jb3VudFwiOjEsXCJleHRlbmRlZF9ib3VuZHNcIjp7fX19LHtcImlkXCI6XCIzXCIsXCJ0eXBlXCI6XCJ0ZXJtc1wiLFwic2NoZW1hXCI6XCJncm91cFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcImhvc3RpZFwiLFwic2l6ZVwiOjUsXCJvcmRlclwiOlwiZGVzY1wiLFwib3JkZXJCeVwiOlwiMVwifX1dLFwibGlzdGVuZXJzXCI6e319IiwKKyAgICAidWlTdGF0ZUpTT04iOiAie30iLAorICAgICJkZXNjcmlwdGlvbiI6ICIiLAorICAgICJ2ZXJzaW9uIjogMSwKKyAgICAia2liYW5hU2F2ZWRPYmplY3RNZXRhIjogeworICAgICAgICAic2VhcmNoU291cmNlSlNPTiI6ICJ7XCJpbmRleFwiOlwibW9uaXRvcmluZ19ldmVudHMtKlwiLFwicXVlcnlcIjp7XCJxdWVyeV9zdHJpbmdcIjp7XCJxdWVyeVwiOlwiKlwiLFwiYW5hbHl6ZV93aWxkY2FyZFwiOnRydWV9fSxcImZpbHRlclwiOltdfSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvdmlzdWFsaXphdGlvbl9udW1iZXItb2YtdXNlci1hY2Nlc3Nlcy5qc29uIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fbnVtYmVyLW9mLXVzZXItYWNjZXNzZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNkODhjCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9maWxlcy9kZWZhdWx0L3Zpc3VhbGl6YXRpb25fbnVtYmVyLW9mLXVzZXItYWNjZXNzZXMuanNvbgpAQCAtMCwwICsxLDEwIEBACit7CisgICAgInRpdGxlIjogIm51bWJlciBvZiB1c2VyIGFjY2Vzc2VzIiwKKyAgICAidmlzU3RhdGUiOiAie1widHlwZVwiOlwibGluZVwiLFwicGFyYW1zXCI6e1wiYWRkTGVnZW5kXCI6dHJ1ZSxcImFkZFRpbWVNYXJrZXJcIjpmYWxzZSxcImFkZFRvb2x0aXBcIjp0cnVlLFwiZGVmYXVsdFlFeHRlbnRzXCI6ZmFsc2UsXCJkcmF3TGluZXNCZXR3ZWVuUG9pbnRzXCI6dHJ1ZSxcImludGVycG9sYXRlXCI6XCJsaW5lYXJcIixcInJhZGl1c1JhdGlvXCI6OSxcInNjYWxlXCI6XCJsaW5lYXJcIixcInNldFlFeHRlbnRzXCI6ZmFsc2UsXCJzaGFyZVlBeGlzXCI6dHJ1ZSxcInNob3dDaXJjbGVzXCI6dHJ1ZSxcInNtb290aExpbmVzXCI6ZmFsc2UsXCJ0aW1lc1wiOltdLFwieUF4aXNcIjp7fX0sXCJhZ2dzXCI6W3tcImlkXCI6XCIxXCIsXCJ0eXBlXCI6XCJjb3VudFwiLFwic2NoZW1hXCI6XCJtZXRyaWNcIixcInBhcmFtc1wiOnt9fSx7XCJpZFwiOlwiMlwiLFwidHlwZVwiOlwiZGF0ZV9oaXN0b2dyYW1cIixcInNjaGVtYVwiOlwic2VnbWVudFwiLFwicGFyYW1zXCI6e1wiZmllbGRcIjpcIlRJTUVTVEFNUFwiLFwiaW50ZXJ2YWxcIjpcImRcIixcImN1c3RvbUludGVydmFsXCI6XCIyaFwiLFwibWluX2RvY19jb3VudFwiOjEsXCJleHRlbmRlZF9ib3VuZHNcIjp7fX19XSxcImxpc3RlbmVyc1wiOnt9fSIsCisgICAgInVpU3RhdGVKU09OIjogInt9IiwKKyAgICAiZGVzY3JpcHRpb24iOiAiIiwKKyAgICAidmVyc2lvbiI6IDEsCisgICAgImtpYmFuYVNhdmVkT2JqZWN0TWV0YSI6IHsKKyAgICAgICAgInNlYXJjaFNvdXJjZUpTT04iOiAie1wiaW5kZXhcIjpcImF1ZGl0aW5nZXZlbnRzLSpcIixcInF1ZXJ5XCI6e1wicXVlcnlfc3RyaW5nXCI6e1wiYW5hbHl6ZV93aWxkY2FyZFwiOnRydWUsXCJxdWVyeVwiOlwiQUNUSU9OOlxcXCJBY2Nlc3NcXFwiXCJ9fSxcImZpbHRlclwiOltdfSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL3JlY2lwZXMvRVNfMV9zZXR1cF9lbGFzdGljc2VhcmNoLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzFfc2V0dXBfZWxhc3RpY3NlYXJjaC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQ4OThjCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzFfc2V0dXBfZWxhc3RpY3NlYXJjaC5yYgpAQCAtMCwwICsxLDE2IEBACitjbHVzdGVyTmFtZSA9IG5vZGVbJ2VsYXN0aWNzZWFyY2gnXVs6Y2x1c3Rlcl9uYW1lXStub2RlLmNoZWZfZW52aXJvbm1lbnQKK25vZGVfbmFtZSA9IG5vZGVbOmhvc3RuYW1lXQorCit0ZW1wbGF0ZSAiL3Vzci9zaGFyZS9lbGFzdGljc2VhcmNoL2NvbmZpZy9lbGFzdGljc2VhcmNoLnltbCIgZG8KKyAgIHNvdXJjZSAiRVMtZWxhc3RpY3NlYXJjaC55bWwuZXJiIgorICAgb3duZXIgImVsYXN0aWNzZWFyY2giCisgICBncm91cCAiZWxhc3RpY3NlYXJjaCIKKyAgIG1vZGUgIjA3NTUiCisgICB2YXJpYWJsZXMoeworICAgICAgICA6Y2x1c3Rlcl9uYW1lID0+ICIje2NsdXN0ZXJOYW1lfSIsCisgICAgICAgIDpub2RlX25hbWUgPT4gbm9kZV9uYW1lLAorICAgICAgICA6RVNfSVAgPT4gbm9kZVsnTm9kZXMnXVsnRVMnXSwKKyAgICAgICAgOm51bV9vZl9zaGFyZHMgPT4gbm9kZVsnZWxhc3RpY3NlYXJjaCddWzpudW1fb2Zfc2hhcmRzXSwKKyAgICAgICAgOm51bV9vZl9yZXBsaWNhcyA9PiBub2RlWydlbGFzdGljc2VhcmNoJ11bOm51bV9vZl9yZXBsaWNhc10KKyAgIH0pCitlbmQKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvcmVjaXBlcy9FU18yX3NldHVwX2xvZ2dpbmcucmIgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL3JlY2lwZXMvRVNfMl9zZXR1cF9sb2dnaW5nLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDYyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL3JlY2lwZXMvRVNfMl9zZXR1cF9sb2dnaW5nLnJiCkBAIC0wLDAgKzEsNiBAQAorY29va2Jvb2tfZmlsZSAiL3Vzci9zaGFyZS9lbGFzdGljc2VhcmNoL2NvbmZpZy9sb2dnaW5nLnltbCIgZG8KKyAgIHNvdXJjZSAibG9nZ2luZy55bWwiCisgICBvd25lciAiZWxhc3RpY3NlYXJjaCIKKyAgIGdyb3VwICJlbGFzdGljc2VhcmNoIgorICAgbW9kZSAiMDc1NSIKK2VuZApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzNfY3JlYXRlX2F1ZGl0X3RlbXBsYXRlLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzNfY3JlYXRlX2F1ZGl0X3RlbXBsYXRlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkODgyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL3JlY2lwZXMvRVNfM19jcmVhdGVfYXVkaXRfdGVtcGxhdGUucmIKQEAgLTAsMCArMSwyMzggQEAKK3J1YnlfYmxvY2sgImNoZWNrX0VsYXN0aWNTZWFyY2hfQ2x1c3Rlcl9IZWFsdGgiIGRvCisgICAgYmxvY2sgZG8KKwkJI3RyaWNreSB3YXkgdG8gbG9hZCB0aGlzIENoZWY6Ok1peGluOjpTaGVsbE91dCB1dGlsaXRpZXMKKwkJQ2hlZjo6UmVzb3VyY2U6OlJ1YnlCbG9jay5zZW5kKDppbmNsdWRlLCBDaGVmOjpNaXhpbjo6U2hlbGxPdXQpCisJCSNjdXJsX2NvbW1hbmQgPSAiaHR0cDovLyN7bm9kZVsnaXBhZGRyZXNzJ119OjkyMDAvX2NsdXN0ZXIvaGVhbHRoP3ByZXR0eT10cnVlIgorCQljdXJsX2NvbW1hbmQgPSAiaHR0cDovL2xvY2FsaG9zdDo5MjAwL19jbHVzdGVyL2hlYWx0aD9wcmV0dHk9dHJ1ZSIKKwkJcmVzcCA9IE5ldDo6SFRUUC5nZXRfcmVzcG9uc2UgVVJJLnBhcnNlKGN1cmxfY29tbWFuZCkKKwkJc3RhdCA9IEpTT04ucGFyc2UocmVzcC5yZWFkX2JvZHkpWydzdGF0dXMnXQorCisJCWNhc2Ugc3RhdAorCQkJd2hlbiAiZ3JlZW4iCisJCQkJcHJpbnRmKCJcMDMzWzMybSVzXG5cMDMzWzBtIiwgIiAgRWxhc3RpY1NlYXJjaCBDbHVzdGVyIHN0YXR1cyBpcyBncmVlbi4iKQorCQkJd2hlbiAieWVsbG93IgorCQkJCXByaW50ZigiXDAzM1szM20lc1xuXDAzM1swbSIsICIgIEVsYXN0aWNTZWFyY2ggQ2x1c3RlciBzdGF0dXMgaXMgeWVsbG93Li4uIikKKwkJCXdoZW4gInJlZCIKKwkJCQlwcmludGYoIlwwMzNbMzFtJXNcblwwMzNbMG0iLCAiICBFbGFzdGljU2VhcmNoIENsdXN0ZXIgc3RhdHVzIGlzIHJlZCEiKQorCQllbmQKKyAgIGVuZAorICAgcmV0cmllcyAxMAorICAgcmV0cnlfZGVsYXkgMgorZW5kCisKKworYmFzaCAiY3JlYXRlIGF1ZGl0IG1hcHBpbmciIGRvCisJY29kZSA8PC1FT0gKKwkJY3VybCAtaSAtWCBQVVQgLWQgJ3sgIm9yZGVyIjogMSwgInRlbXBsYXRlIjogImF1ZGl0aW5nZXZlbnRzLSoiLCAic2V0dGluZ3MiOiB7fSwgIm1hcHBpbmdzIjoKKwl7CisJCSJkaXN0cmlidXRpb25kb3dubG9hZGV2ZW50IjogeyAKKwkJCSJwcm9wZXJ0aWVzIjogeworCQkJCSJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sCisJCQkJIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlJFU09VUkNFX1VSTCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0KKwkJCX0sCisJCQkiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gCisJCX0sCisJCSJhdWRpdGluZ2dldHVlYmNsdXN0ZXJldmVudCI6IHsgCisJCQkicHJvcGVydGllcyI6IHsKKwkJCQkiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LAorCQkJCSJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJDT05TVU1FUl9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfQorCQkJfSwKKwkJCSJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfSAKKwkJfSwKKwkJImRpc3RyaWJ1dGlvbnN0YXR1c2V2ZW50IjogeworCQkJInByb3BlcnRpZXMiOiB7CisJCQkJIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfSwKKwkJCQkiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiUkVTT1VSQ0VfVVJMIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJESUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlRPUElDX05BTUUiOnsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0KKwkJCX0sCisJCQkiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gCisJCX0sCisJCSJkaXN0cmlidXRpb25lbmdpbmVldmVudCI6IHsKKwkJCSJwcm9wZXJ0aWVzIjogeworCQkJCSJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sCisJCQkJIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlRPUElDX05BTUUiOnsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiUk9MRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJBUElfS0VZIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJEX0VOViI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQ09OU1VNRVJfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0KKwkJCX0sCisJCQkiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gCisJCX0sCisJCSJ1c2VyYWNjZXNzZXZlbnQiOiB7IAorCQkJInByb3BlcnRpZXMiOiB7CisJCQkJIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfSwKKwkJCQkiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiU0VSVklDRV9JTlNUQU5DRV9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiVVNFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9CisJCQl9LAorCQkJIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9CisJCX0sCisJCSJyZXNvdXJjZWFkbWluZXZlbnQiOiB7CisJCQkicHJvcGVydGllcyI6IHsKKwkJCQkiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LAorCQkJCSJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJJTlZBUklBTlRfVVVJRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQ1VSUl9WRVJTSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJDVVJSX1NUQVRFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJESUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIk1PRElGSUVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlBSRVZfVkVSU0lPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiUFJFVl9TVEFURSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiUkVTT1VSQ0VfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJSRVNPVVJDRV9UWVBFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJEUFJFVl9TVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkRDVVJSX1NUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiVE9TQ0FfTk9ERV9UWVBFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJDT01NRU5UIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkFSVElGQUNUX0RBVEEiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlBSRVZfQVJUSUZBQ1RfVVVJRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQ1VSUl9BUlRJRkFDVF9VVUlEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9IAorCQkJfSwKKwkJCSJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfQorCQl9LAorCQkidXNlcmFkbWluZXZlbnQiOiB7CisJCQkicHJvcGVydGllcyI6IHsKKwkJCQkiVElNRVNUQU1QIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaWdub3JlX21hbGZvcm1lZCI6IGZhbHNlLCAiZm9ybWF0IjogInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIHoiLCAicHJlY2lzaW9uX3N0ZXAiOiA0LCAidHlwZSI6ICJkYXRlIiB9LAorCQkJCSJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJVU0VSX0FGVEVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlVTRVJfQkVGT1JFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIk1PRElGSUVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0KKwkJCX0sCisJCQkiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gCisJCX0sCisJCSJkaXN0cmlidXRpb25ub3RpZmljYXRpb25ldmVudCI6IHsKKwkJCSJwcm9wZXJ0aWVzIjogeworCQkJCSJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sCisgICAgICAgICAgICAgICAgIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgIlNFUlZJQ0VfSU5TVEFOQ0VfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgIkNVUlJfU1RBVEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgIkNVUlJfVkVSU0lPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAiRElEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICJNT0RJRklFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICJSRVNPVVJDRV9OQU1FIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgIlJFU09VUkNFX1RZUEUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgIlRPUElDX05BTUUiOnsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfQorCQkJfSwKKyAgICAgICAgICAgICJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfSAKKwkJfSwKKwkJImNhdGVnb3J5ZXZlbnQiOiB7CisJCQkicHJvcGVydGllcyI6IHsKKwkJCQkiQUNUSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIk1PRElGSUVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkNBVEVHT1JZX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiU1VCX0NBVEVHT1JZX05BTUUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiR1JPVVBJTkdfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJSRVNPVVJDRV9UWVBFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfQorCQkJfSwKKyAgICAgICAgICAgICJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfSAKKwkJfSwKKwkJImF1dGhldmVudCI6IHsKKwkJCSJwcm9wZXJ0aWVzIjogeworCQkJCSJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0sCisJCQkJIkRFU0MiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJVUkwiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiVVNFUiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJBVVRIX1NUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsInR5cGUiOiAic3RyaW5nIiB9ICwKKwkJCQkiUkVBTE0iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCJ0eXBlIjogInN0cmluZyIgfQorCQkJfSwKKwkJCSJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfQorCQl9LAorCQkiY29uc3VtZXJldmVudCI6IHsKKwkJCSJwcm9wZXJ0aWVzIjogeworCQkJCSJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIk1PRElGSUVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJFQ09NUF9VU0VSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0KKwkJCX0sCisJCQkiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gCisJCX0sCisJCSJnZXR1c2Vyc2xpc3RldmVudCI6IHsKKwkJCSJwcm9wZXJ0aWVzIjogeworCQkJCSJBQ1RJT04iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIk1PRElGSUVSIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlNUQVRVUyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiREVTQyI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJSRVFVRVNUX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJERVRBSUxTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJUSU1FU1RBTVAiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0KKwkJCX0sCisgICAgICAgICAgICAiX2FsbCI6IHsgImVuYWJsZWQiOiB0cnVlIH0gCisJCX0sCisJCSJnZXRjYXRlZ29yeWhpZXJhcmNoeWV2ZW50IjogeworCQkJInByb3BlcnRpZXMiOiB7CisJCQkJIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiTU9ESUZJRVIiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiU1RBVFVTIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlJFUVVFU1RfSUQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkRFVEFJTFMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfQorCQkJfSwKKwkJCSJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfSAKKwkJfSwKKwkJImRpc3RyaWJ1dGlvbmRlcGxveWV2ZW50IjogeworCQkJInByb3BlcnRpZXMiOiB7CisJCQkJIkFDVElPTiI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiQ1VSUl9WRVJTSU9OIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJERVNDIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIkRJRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiTU9ESUZJRVIiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiUkVRVUVTVF9JRCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkiUkVTT1VSQ0VfTkFNRSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJSRVNPVVJDRV9UWVBFIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTRVJWSUNFX0lOU1RBTkNFX0lEIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCSJTVEFUVVMiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJIlRJTUVTVEFNUCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImlnbm9yZV9tYWxmb3JtZWQiOiBmYWxzZSwgImZvcm1hdCI6ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyB6IiwgInByZWNpc2lvbl9zdGVwIjogNCwgInR5cGUiOiAiZGF0ZSIgfQorCQkJfSwKKyAgICAgICAgICAgICJfYWxsIjogeyAiZW5hYmxlZCI6IHRydWUgfSB9CisJCX0sCisgICAgICAgICJhbGlhc2VzIjogeyAibGFzdF8zX21vbnRocyI6IHt9fX0nIGh0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fdGVtcGxhdGUvYXVkaXRfdGVtcGxhdGUKKwlFT0gKK2VuZApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzRfY3JlYXRlX3Jlc291cmNlc190ZW1wbGF0ZS5yYiBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvcmVjaXBlcy9FU180X2NyZWF0ZV9yZXNvdXJjZXNfdGVtcGxhdGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjMjY0MQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvcmVjaXBlcy9FU180X2NyZWF0ZV9yZXNvdXJjZXNfdGVtcGxhdGUucmIKQEAgLTAsMCArMSwzNyBAQAorcnVieV9ibG9jayAiY2hlY2tfRWxhc3RpY1NlYXJjaF9DbHVzdGVyX0hlYWx0aCIgZG8KKyAgICBibG9jayBkbworICAgICAgI3RyaWNreSB3YXkgdG8gbG9hZCB0aGlzIENoZWY6Ok1peGluOjpTaGVsbE91dCB1dGlsaXRpZXMKKyAgICAgIENoZWY6OlJlc291cmNlOjpSdWJ5QmxvY2suc2VuZCg6aW5jbHVkZSwgQ2hlZjo6TWl4aW46OlNoZWxsT3V0KQorICAgICAgI2N1cmxfY29tbWFuZCA9ICJodHRwOi8vI3tub2RlWydpcGFkZHJlc3MnXX06OTIwMC9fY2x1c3Rlci9oZWFsdGg/cHJldHR5PXRydWUiCisgICAgICBjdXJsX2NvbW1hbmQgPSAiaHR0cDovL2xvY2FsaG9zdDo5MjAwL19jbHVzdGVyL2hlYWx0aD9wcmV0dHk9dHJ1ZSIKKyAgICAgIHJlc3AgPSBOZXQ6OkhUVFAuZ2V0X3Jlc3BvbnNlIFVSSS5wYXJzZShjdXJsX2NvbW1hbmQpCisgICAgICBzdGF0ID0gSlNPTi5wYXJzZShyZXNwLnJlYWRfYm9keSlbJ3N0YXR1cyddCisKKyAgICAgIGNhc2Ugc3RhdAorICAgICAgICAgd2hlbiAiZ3JlZW4iCisgICAgICAgICAgICBwcmludGYoIlwwMzNbMzJtJXNcblwwMzNbMG0iLCAiICBFbGFzdGljU2VhcmNoIENsdXN0ZXIgc3RhdHVzIGlzIGdyZWVuLiIpCisgICAgICAgICB3aGVuICJ5ZWxsb3ciCisgICAgICAgICAgICBwcmludGYoIlwwMzNbMzNtJXNcblwwMzNbMG0iLCAiICBFbGFzdGljU2VhcmNoIENsdXN0ZXIgc3RhdHVzIGlzIHllbGxvdy4uLiIpCisgICAgICAgICB3aGVuICJyZWQiCisgICAgICAgICAgICBwcmludGYoIlwwMzNbMzFtJXNcblwwMzNbMG0iLCAiICBFbGFzdGljU2VhcmNoIENsdXN0ZXIgc3RhdHVzIGlzIHJlZCEiKQorICAgICAgZW5kCisgICBlbmQKKyAgIHJldHJpZXMgMTAKKyAgIHJldHJ5X2RlbGF5IDIKK2VuZAorCitiYXNoICJjcmVhdGUgcmVzb3VyY2VzIG1hcHBpbmciIGRvCisJY29kZSA8PC1FT0gJCisJCWN1cmwgLWkgLVggUFVUIC1kICd7ICJvcmRlciI6IDEsICJ0ZW1wbGF0ZSI6ICJyZXNvdXJjZXMiLCAic2V0dGluZ3MiOiB7fSwgIm1hcHBpbmdzIjoKKwkJCXsKKwkJCQkiZXNhcnRpZmFjdGRhdGEiOiB7CisJCQkJCSJwcm9wZXJ0aWVzIjogeworCQkJCQkJImlkIjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCQkJImRhdGEiOiB7ICJpbmNsdWRlX2luX2FsbCI6IGZhbHNlLCAidHlwZSI6ICJzdHJpbmciIH0KKwkJCQkJfSwKKwkJCQkJIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IAorCQkJCX0KKwkJCX0KKwkJfScgaHR0cDovL2xvY2FsaG9zdDo5MjAwL190ZW1wbGF0ZS9yZXNvdXJjZXNfdGVtcGxhdGUKKwlFT0gKK2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvcmVjaXBlcy9FU181X2NyZWF0ZV9tb25pdG9yaW5nX3RlbXBsYXRlLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzVfY3JlYXRlX21vbml0b3JpbmdfdGVtcGxhdGUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNjhjMQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvcmVjaXBlcy9FU181X2NyZWF0ZV9tb25pdG9yaW5nX3RlbXBsYXRlLnJiCkBAIC0wLDAgKzEsNDcgQEAKK3J1YnlfYmxvY2sgImNoZWNrX0VsYXN0aWNTZWFyY2hfQ2x1c3Rlcl9IZWFsdGgiIGRvCisgICAgYmxvY2sgZG8KKyAgICAgICN0cmlja3kgd2F5IHRvIGxvYWQgdGhpcyBDaGVmOjpNaXhpbjo6U2hlbGxPdXQgdXRpbGl0aWVzCisgICAgICBDaGVmOjpSZXNvdXJjZTo6UnVieUJsb2NrLnNlbmQoOmluY2x1ZGUsIENoZWY6Ok1peGluOjpTaGVsbE91dCkKKyAgICAgICNjdXJsX2NvbW1hbmQgPSAiaHR0cDovLyN7bm9kZVsnaXBhZGRyZXNzJ119OjkyMDAvX2NsdXN0ZXIvaGVhbHRoP3ByZXR0eT10cnVlIgorICAgICAgY3VybF9jb21tYW5kID0gImh0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fY2x1c3Rlci9oZWFsdGg/cHJldHR5PXRydWUiCisgICAgICByZXNwID0gTmV0OjpIVFRQLmdldF9yZXNwb25zZSBVUkkucGFyc2UoY3VybF9jb21tYW5kKQorICAgICAgc3RhdCA9IEpTT04ucGFyc2UocmVzcC5yZWFkX2JvZHkpWydzdGF0dXMnXQorCisgICAgICBjYXNlIHN0YXQKKyAgICAgICAgIHdoZW4gImdyZWVuIgorICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMybSVzXG5cMDMzWzBtIiwgIiAgRWxhc3RpY1NlYXJjaCBDbHVzdGVyIHN0YXR1cyBpcyBncmVlbi4iKQorICAgICAgICAgd2hlbiAieWVsbG93IgorICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMzbSVzXG5cMDMzWzBtIiwgIiAgRWxhc3RpY1NlYXJjaCBDbHVzdGVyIHN0YXR1cyBpcyB5ZWxsb3cuLi4iKQorICAgICAgICAgd2hlbiAicmVkIgorICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMxbSVzXG5cMDMzWzBtIiwgIiAgRWxhc3RpY1NlYXJjaCBDbHVzdGVyIHN0YXR1cyBpcyByZWQhIikKKyAgICAgIGVuZAorICAgZW5kCisgICByZXRyaWVzIDEwCisgICByZXRyeV9kZWxheSAyCitlbmQKKworYmFzaCAiY3JlYXRlIG1vbml0b3JpbmcgbWFwcGluZyIgZG8KKwljb2RlIDw8LUVPSAkKKwkJY3VybCAtaSAtWCBQVVQgLWQgJ3sgIm9yZGVyIjogMSwgInRlbXBsYXRlIjogIm1vbml0b3JpbmdfZXZlbnRzLSoiLCAic2V0dGluZ3MiOiB7fSwgIm1hcHBpbmdzIjoKKwkJCXsKKwkJCQkibW9uaXRvcmluZ2V2ZW50IjogeworCQkJCQkicHJvcGVydGllcyI6IHsKKwkJCQkJCSJob3N0aWQiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJpbmRleCI6ICJub3RfYW5hbHl6ZWQiLCAidHlwZSI6ICJzdHJpbmciIH0sCisJCQkJCQkiaG9zdGNwdSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgICJ0eXBlIjogImxvbmciIH0sCisJCQkJCQkiaG9zdG1lbSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgICJ0eXBlIjogImRvdWJsZSIgfSwKKwkJCQkJCSJob3N0ZGlzayI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkJCSJqdm1pZCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkJCSJqdm1jcHUiOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsInR5cGUiOiAibG9uZyIgfSwKKwkJCQkJCSJqdm1tZW0iOiB7ICJpbmNsdWRlX2luX2FsbCI6IHRydWUsICJ0eXBlIjogImxvbmciIH0sCisJCQkJCQkianZtdG51bSI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgInR5cGUiOiAiaW50ZWdlciIgfSwKKwkJCQkJCSJhcHBpZCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJ0eXBlIjogInN0cmluZyIgfSwKKwkJCQkJCSJhcHBzdGF0IjogeyAiaW5jbHVkZV9pbl9hbGwiOiB0cnVlLCAiaW5kZXgiOiAibm90X2FuYWx5emVkIiwgInR5cGUiOiAic3RyaW5nIiB9LAorCQkJCQkJInRpbWVzdGFtcCI6IHsgImluY2x1ZGVfaW5fYWxsIjogdHJ1ZSwgImluZGV4IjogIm5vdF9hbmFseXplZCIsICJpZ25vcmVfbWFsZm9ybWVkIjogZmFsc2UsICJmb3JtYXQiOiAieXl5eS1NTS1kZCBISDptbTpzcy5TU1MgeiIsICJwcmVjaXNpb25fc3RlcCI6IDQsICJ0eXBlIjogImRhdGUiIH0KKwkJCQkJfSwKKwkJCQkJIl9hbGwiOiB7ICJlbmFibGVkIjogdHJ1ZSB9IAorCQkJCX0KKwkJCX0sCisJCQkiYWxpYXNlcyI6IHsgImxhc3RfM19tb250aHMiOiB7fSB9CisJCX0nIGh0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fdGVtcGxhdGUvbW9uaXRvcmluZ190ZW1wbGF0ZQorCUVPSAorZW5kCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL3JlY2lwZXMvRVNfNl9raWJhbmFfZGFzaGJvYXJkX3ZpcnR1YWxpemF0aW9uLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzZfa2liYW5hX2Rhc2hib2FyZF92aXJ0dWFsaXphdGlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2IxNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9yZWNpcGVzL0VTXzZfa2liYW5hX2Rhc2hib2FyZF92aXJ0dWFsaXphdGlvbi5yYgpAQCAtMCwwICsxLDU3IEBACitjb29rYm9va19maWxlICIvdXNyL3NoYXJlL2VsYXN0aWNzZWFyY2gvY29uZmlnL2tpYmFuYV9kYXNoYm9hcmRfdmlydHVhbGl6YXRpb24uanNvbiIgZG8KKyAgIHNvdXJjZSAia2liYW5hX2Rhc2hib2FyZF92aXJ0dWFsaXphdGlvbi5qc29uIgorICAgb3duZXIgImVsYXN0aWNzZWFyY2giCisgICBncm91cCAiZWxhc3RpY3NlYXJjaCIKKyAgIG1vZGUgIjA3NTUiCitlbmQKKworCisKK3J1YnlfYmxvY2sgImNoZWNrX0VsYXN0aWNTZWFyY2hfQ2x1c3Rlcl9IZWFsdGgiIGRvCisgICAgYmxvY2sgZG8KKyAgICAgICN0cmlja3kgd2F5IHRvIGxvYWQgdGhpcyBDaGVmOjpNaXhpbjo6U2hlbGxPdXQgdXRpbGl0aWVzCisgICAgICBDaGVmOjpSZXNvdXJjZTo6UnVieUJsb2NrLnNlbmQoOmluY2x1ZGUsIENoZWY6Ok1peGluOjpTaGVsbE91dCkKKyAgICAgICNjdXJsX2NvbW1hbmQgPSAiaHR0cDovLyN7bm9kZVsnaXBhZGRyZXNzJ119OjkyMDAvX2NsdXN0ZXIvaGVhbHRoP3ByZXR0eT10cnVlIgorICAgICAgY3VybF9jb21tYW5kID0gImh0dHA6Ly9sb2NhbGhvc3Q6OTIwMC9fY2x1c3Rlci9oZWFsdGg/cHJldHR5PXRydWUiCisgICAgICByZXNwID0gTmV0OjpIVFRQLmdldF9yZXNwb25zZSBVUkkucGFyc2UoY3VybF9jb21tYW5kKQorICAgICAgc3RhdCA9IEpTT04ucGFyc2UocmVzcC5yZWFkX2JvZHkpWydzdGF0dXMnXQorCisgICAgICBjYXNlIHN0YXQKKyAgICAgICAgIHdoZW4gImdyZWVuIgorICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMybSVzXG5cMDMzWzBtIiwgIiAgRWxhc3RpY1NlYXJjaCBDbHVzdGVyIHN0YXR1cyBpcyBncmVlbi4iKQorICAgICAgICAgd2hlbiAieWVsbG93IgorICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMzbSVzXG5cMDMzWzBtIiwgIiAgRWxhc3RpY1NlYXJjaCBDbHVzdGVyIHN0YXR1cyBpcyB5ZWxsb3cuLi4iKQorICAgICAgICAgd2hlbiAicmVkIgorICAgICAgICAgICAgcHJpbnRmKCJcMDMzWzMxbSVzXG5cMDMzWzBtIiwgIiAgRWxhc3RpY1NlYXJjaCBDbHVzdGVyIHN0YXR1cyBpcyByZWQhIikKKyAgICAgIGVuZAorICAgZW5kCisgICByZXRyaWVzIDEwCisgICByZXRyeV9kZWxheSAyCitlbmQKKworCitiYXNoICJjcmVhdGUgS2liYW5hIGRhc2hib2FyZCIgZG8KKyAgICBjb2RlIDw8LUVPSAorICAgICAgICBmb3IgZmlsZSBpbiAvcm9vdC9jaGVmLXNvbG8vY29va2Jvb2tzL3NkYy1lbGFzdGljc2VhcmNoL2ZpbGVzL2RlZmF1bHQvZGFzaGJvYXJkXyouanNvbjsgZG8gCisgICAgICAgICAgICBuYW1lPWBiYXNlbmFtZSAkZmlsZSAuanNvbiB8IGF3ayAtRiJfIiAne3ByaW50ICQyfSdgIAorICAgICAgICAgICAgZWNobyAiTG9hZGluZyBkYXNoYm9hcmQgJG5hbWU6IiAKKyAgICAgICAgICAgIGN1cmwgLVhQVVQgaHR0cDovL2xvY2FsaG9zdDo5MjAwLy5raWJhbmEvZGFzaGJvYXJkLyRuYW1lIC1kIEAkZmlsZSB8fCBleGl0IDEgCisgICAgICAgICAgICBlY2hvIAorICAgICAgICBkb25lIAorICAgIEVPSAorZW5kCisKKworYmFzaCAiY3JlYXRlIEtpYmFuYSB2aXN1YWxpemF0aW9uIiBkbworICAgIGNvZGUgPDwtRU9ICisgICAgICAgIGZvciBmaWxlIGluIC9yb290L2NoZWYtc29sby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvZmlsZXMvZGVmYXVsdC92aXN1YWxpemF0aW9uXyouanNvbjsgZG8gCisgICAgICAgICAgICBuYW1lPWBiYXNlbmFtZSAkZmlsZSAuanNvbiB8IGF3ayAtRiJfIiAne3ByaW50ICQyfSdgIAorICAgICAgICAgICAgZWNobyAiTG9hZGluZyB2aXN1YWxpemF0aW9uICRuYW1lOiIgCisgICAgICAgICAgICBjdXJsIC1YUFVUIGh0dHA6Ly9sb2NhbGhvc3Q6OTIwMC8ua2liYW5hL3Zpc3VhbGl6YXRpb24vJG5hbWUgLWQgQCRmaWxlIHx8IGV4aXQgMSAKKyAgICAgICAgICAgIGVjaG8gCisgICAgICAgIGRvbmUgCisgICAgRU9ICitlbmQKKworCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvdGVtcGxhdGVzL2RlZmF1bHQvRVMtZWxhc3RpY3NlYXJjaC55bWwuZXJiIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC90ZW1wbGF0ZXMvZGVmYXVsdC9FUy1lbGFzdGljc2VhcmNoLnltbC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzZTZiMAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWVsYXN0aWNzZWFyY2gvdGVtcGxhdGVzL2RlZmF1bHQvRVMtZWxhc3RpY3NlYXJjaC55bWwuZXJiCkBAIC0wLDAgKzEsMTYgQEAKK25ldHdvcmsuaG9zdDogMC4wLjAuMAorZGlzY292ZXJ5Lnplbi5waW5nLm11bHRpY2FzdC5lbmFibGVkOiBmYWxzZQorZGlzY292ZXJ5Lnplbi5waW5nLnVuaWNhc3QuZW5hYmxlZDogdHJ1ZQorI2Rpc2NvdmVyeS56ZW4ucGluZy51bmljYXN0Lmhvc3RzOiA8JT0gQEVTX0lQICU+CisKK2NsdXN0ZXIubmFtZTogPCU9IEBjbHVzdGVyX25hbWUgJT4KK25vZGUubmFtZTogPCU9IEBub2RlX25hbWUgJT4KK2VsYXN0aWNTZWFyY2gudHJhbnNwb3J0Y2xpZW50OiB0cnVlCisKK3RyYW5zcG9ydC5jbGllbnQuaW5pdGlhbF9ub2RlczoKKyAgIC0gPCU9IEBFU19JUCAlPjo5MzAwCisKK2luZGV4Lm51bWJlcl9vZl9zaGFyZHM6IDwlPSBAbnVtX29mX3NoYXJkcyAlPgoraW5kZXgubnVtYmVyX29mX3JlcGxpY2FzOiA8JT0gQG51bV9vZl9yZXBsaWNhcyAlPgorCitwYXRoLmxvZ3M6IC91c3Ivc2hhcmUvZWxhc3RpY3NlYXJjaC9sb2dzCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vTElDRU5TRSBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDY5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vTElDRU5TRQpAQCAtMCwwICsxLDIwMSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKzEuIERlZmluaXRpb25zLgorCisgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKzMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCis0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCis1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKzYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKzcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCis4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKzkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0FQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGIwZmRhCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL1JFQURNRS5tZApAQCAtMCwwICsxLDM3IEBACitEZXByZWNhdGVkCis9PT09PT09PT09CisKK1VzZSBvZiB0aGlzIHJlcG9zaXRvcnkgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY2hlZiBnZW5lcmF0ZSByZXBvYCBjb21tYW5kIHRoYXQgY29tZXMgd2l0aCBbQ2hlZkRLXShodHRwOi8vZG93bmxvYWRzLmNoZWYuaW8vY2hlZi1kay8pLgorCitPdmVydmlldworPT09PT09PT0KKworRXZlcnkgQ2hlZiBpbnN0YWxsYXRpb24gbmVlZHMgYSBDaGVmIFJlcG9zaXRvcnkuIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIGNvb2tib29rcywgcm9sZXMsIGNvbmZpZyBmaWxlcyBhbmQgb3RoZXIgYXJ0aWZhY3RzIGZvciBtYW5hZ2luZyBzeXN0ZW1zIHdpdGggQ2hlZiB3aWxsIGxpdmUuIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCBzdG9yaW5nIHRoaXMgcmVwb3NpdG9yeSBpbiBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gc3VjaCBhcyBHaXQgYW5kIHRyZWF0IGl0IGxpa2Ugc291cmNlIGNvZGUuCisKK1doaWxlIHdlIHByZWZlciBHaXQsIGFuZCBtYWtlIHRoaXMgcmVwb3NpdG9yeSBhdmFpbGFibGUgdmlhIEdpdEh1YiwgeW91IGFyZSB3ZWxjb21lIHRvIGRvd25sb2FkIGEgdGFyIG9yIHppcCBhcmNoaXZlIGFuZCB1c2UgeW91ciBmYXZvcml0ZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIHRvIG1hbmFnZSB0aGUgY29kZS4KKworUmVwb3NpdG9yeSBEaXJlY3RvcmllcworPT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHJlcG9zaXRvcnkgY29udGFpbnMgc2V2ZXJhbCBkaXJlY3RvcmllcywgYW5kIGVhY2ggZGlyZWN0b3J5IGNvbnRhaW5zIGEgUkVBRE1FIGZpbGUgdGhhdCBkZXNjcmliZXMgd2hhdCBpdCBpcyBmb3IgaW4gZ3JlYXRlciBkZXRhaWwsIGFuZCBob3cgdG8gdXNlIGl0IGZvciBtYW5hZ2luZyB5b3VyIHN5c3RlbXMgd2l0aCBDaGVmLgorCisqIGBjb29rYm9va3MvYCAtIENvb2tib29rcyB5b3UgZG93bmxvYWQgb3IgY3JlYXRlLgorKiBgZGF0YV9iYWdzL2AgLSBTdG9yZSBkYXRhIGJhZ3MgYW5kIGl0ZW1zIGluIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorKiBgcm9sZXMvYCAtIFN0b3JlIHJvbGVzIGluIC5yYiBvciAuanNvbiBpbiB0aGUgcmVwb3NpdG9yeS4KKyogYGVudmlyb25tZW50cy9gIC0gU3RvcmUgZW52aXJvbm1lbnRzIGluIC5yYiBvciAuanNvbiBpbiB0aGUgcmVwb3NpdG9yeS4KKworQ29uZmlndXJhdGlvbgorPT09PT09PT09PT09PQorCitUaGUgcmVwb3NpdG9yeSBjb250YWlucyBhIGtuaWZlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworKiAuY2hlZi9rbmlmZS5yYgorCitUaGUga25pZmUgY29uZmlndXJhdGlvbiBmaWxlIGAuY2hlZi9rbmlmZS5yYmAgaXMgYSByZXBvc2l0b3J5IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3Iga25pZmUuIElmIHlvdSdyZSB1c2luZyBIb3N0ZWQgQ2hlZiwgeW91IGNhbiBkb3dubG9hZCBvbmUgZm9yIHlvdXIgb3JnYW5pemF0aW9uIGZyb20gdGhlIG1hbmFnZW1lbnQgY29uc29sZS4gSWYgeW91J3JlIHVzaW5nIHRoZSBPcGVuIFNvdXJjZSBDaGVmIFNlcnZlciwgeW91IGNhbiBnZW5lcmF0ZSBhIG5ldyBvbmUgd2l0aCBga25pZmUgY29uZmlndXJlYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJpbmcgS25pZmUsIHNlZSB0aGUgS25pZmUgZG9jdW1lbnRhdGlvbi4KKworaHR0cHM6Ly9kb2NzLmNoZWYuaW8va25pZmUuaHRtbAorCitOZXh0IFN0ZXBzCis9PT09PT09PT09CisKK1JlYWQgdGhlIFJFQURNRSBmaWxlIGluIGVhY2ggb2YgdGhlIHN1YmRpcmVjdG9yaWVzIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgZ29lcyBpbiB0aG9zZSBkaXJlY3Rvcmllcy4KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9jaGVmaWdub3JlIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL2NoZWZpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzMGFmNgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9jaGVmaWdub3JlCkBAIC0wLDAgKzEsMTEgQEAKKyMgUHV0IGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhpcyBmaWxlLgorIyBMaW5lcyB0aGF0IHN0YXJ0IHdpdGggJyMgJyBhcmUgY29tbWVudHMuCisKKyMgZW1hY3MKKyp+CisKKyMgdmltCisqLnN3W2Etel0KKworIyBzdWJ2ZXJzaW9uCisqLy5zdm4vKgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL2Nvb2tib29rcy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vY29va2Jvb2tzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmVhNDZiCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL2Nvb2tib29rcy9SRUFETUUubWQKQEAgLTAsMCArMSw1NCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGNvb2tib29rcyB1c2VkIHRvIGNvbmZpZ3VyZSBzeXN0ZW1zIGluIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBDaGVmLgorCitLbmlmZSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGtub3cgd2hlcmUgdGhlIGNvb2tib29rcyBhcmUgbG9jYXRlZCB3aXRoIHRoZSBgY29va2Jvb2tfcGF0aGAgc2V0dGluZy4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHNldmVyYWwgY29va2Jvb2sgb3BlcmF0aW9ucyB3aWxsIGZhaWwgdG8gd29yayBwcm9wZXJseS4KKworICAgIGNvb2tib29rX3BhdGggWyIuL2Nvb2tib29rcyJdCisKK1RoaXMgc2V0dGluZyB0ZWxscyBrbmlmZSB0byBsb29rIGZvciB0aGUgY29va2Jvb2tzIGRpcmVjdG9yeSBpbiB0aGUgcHJlc2VudCB3b3JraW5nIGRpcmVjdG9yeS4gVGhpcyBtZWFucyB0aGUga25pZmUgY29va2Jvb2sgc3ViY29tbWFuZHMgbmVlZCB0byBiZSBydW4gaW4gdGhlIGBjaGVmLXJlcG9gIGRpcmVjdG9yeSBpdHNlbGYuIFRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb29rYm9va3MgY2FuIGJlIGZvdW5kIGVsc2V3aGVyZSBpbnNpZGUgdGhlIHJlcG9zaXRvcnksIHVzZSBhbiBhYnNvbHV0ZSBwYXRoLiBUaGlzIGlzIGEgUnVieSBmaWxlLCBzbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGNhbiBiZSB1c2VkOgorCisgICAgY3VycmVudF9kaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pCisgICAgY29va2Jvb2tfcGF0aCBbIiN7Y3VycmVudF9kaXJ9Ly4uL2Nvb2tib29rcyJdCisKK1doaWNoIHdpbGwgc2V0IGBjdXJyZW50X2RpcmAgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBrbmlmZS5yYiBmaWxlIGl0c2VsZiAoZS5nLiBgfi9jaGVmLXJlcG8vLmNoZWYva25pZmUucmJgKS4KKworQ29uZmlndXJlIGtuaWZlIHRvIHVzZSB5b3VyIHByZWZlcnJlZCBjb3B5cmlnaHQgaG9sZGVyLCBlbWFpbCBjb250YWN0IGFuZCBsaWNlbnNlLiBBZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBgLmNoZWYva25pZmUucmJgLgorCisgICAgY29va2Jvb2tfY29weXJpZ2h0ICJFeGFtcGxlLCBDb20uIgorICAgIGNvb2tib29rX2VtYWlsICAgICAiY29va2Jvb2tzQGV4YW1wbGUuY29tIgorICAgIGNvb2tib29rX2xpY2Vuc2UgICAiYXBhY2hldjIiCisKK1N1cHBvcnRlZCB2YWx1ZXMgZm9yIGBjb29rYm9va19saWNlbnNlYCBhcmUgImFwYWNoZXYyIiwgIm1pdCIsImdwbHYyIiwiZ3BsdjMiLCAgb3IgIm5vbmUiLiBUaGVzZSBzZXR0aW5ncyBhcmUgdXNlZCB0byBwcmVmaWxsIGNvbW1lbnRzIGluIHRoZSBkZWZhdWx0IHJlY2lwZSwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgbWV0YWRhdGEucmIuIFlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgdGhlIHRoZSBjb21tZW50cyBpbiB0aG9zZSBmaWxlcy4KKworQ3JlYXRlIG5ldyBjb29rYm9va3MgaW4gdGhpcyBkaXJlY3Rvcnkgd2l0aCBLbmlmZS4KKworICAgIGtuaWZlIGNvb2tib29rIGNyZWF0ZSBDT09LQk9PSworCitUaGlzIHdpbGwgY3JlYXRlIGFsbCB0aGUgY29va2Jvb2sgZGlyZWN0b3J5IGNvbXBvbmVudHMuIFlvdSBkb24ndCBuZWVkIHRvIHVzZSB0aGVtIGFsbCwgYW5kIGNhbiBkZWxldGUgdGhlIG9uZXMgeW91IGRvbid0IG5lZWQuIEl0IGFsc28gY3JlYXRlcyBhIFJFQURNRSBmaWxlLCBtZXRhZGF0YS5yYiBhbmQgZGVmYXVsdCByZWNpcGUuCisKK1lvdSBjYW4gYWxzbyBkb3dubG9hZCBjb29rYm9va3MgZGlyZWN0bHkgZnJvbSB0aGUgT3BzY29kZSBDb29rYm9vayBTaXRlLiBUaGVyZSBhcmUgdHdvIHN1YmNvbW1hbmRzIHRvIGhlbHAgd2l0aCB0aGlzIGRlcGVuZGluZyBvbiB3aGF0IHlvdXIgcHJlZmVyZW5jZSBpcy4KKworVGhlIGZpcnN0IGFuZCByZWNvbW1lbmRlZCBtZXRob2QgaXMgdG8gdXNlIGEgdmVuZG9yIGJyYW5jaCBpZiB5b3UncmUgdXNpbmcgR2l0LiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aXRoIEtuaWZlLgorCisgICAga25pZmUgY29va2Jvb2sgc2l0ZSBpbnN0YWxsIENPT0tCT09LCisKK1RoaXMgd2lsbDoKKworKiBEb3dubG9hZCB0aGUgY29va2Jvb2sgdGFyYmFsbCBmcm9tIGNvb2tib29rcy5vcHNjb2RlLmNvbS4KKyogRW5zdXJlIGl0cyBvbiB0aGUgZ2l0IG1hc3RlciBicmFuY2guCisqIENoZWNrcyBmb3IgYW4gZXhpc3RpbmcgdmVuZG9yIGJyYW5jaCwgYW5kIGNyZWF0ZXMgaWYgaXQgZG9lc24ndC4KKyogQ2hlY2tzIG91dCB0aGUgdmVuZG9yIGJyYW5jaCAoY2hlZi12ZW5kb3ItQ09PS0JPT0spLgorKiBSZW1vdmVzIHRoZSBleGlzdGluZyAob2xkKSB2ZXJzaW9uLgorKiBVbnRhcnMgdGhlIGNvb2tib29rIHRhcmJhbGwgaXQgZG93bmxvYWRlZCBpbiB0aGUgZmlyc3Qgc3RlcC4KKyogQWRkcyB0aGUgY29va2Jvb2sgZmlsZXMgdG8gdGhlIGdpdCBpbmRleCBhbmQgY29tbWl0cy4KKyogQ3JlYXRlcyBhIHRhZyBmb3IgdGhlIHZlcnNpb24gZG93bmxvYWRlZC4KKyogQ2hlY2tzIG91dCB0aGUgbWFzdGVyIGJyYW5jaCBhZ2Fpbi4KKyogTWVyZ2VzIHRoZSBjb29rYm9vayBpbnRvIG1hc3Rlci4KKyogUmVwZWF0cyB0aGUgYWJvdmUgZm9yIGFsbCB0aGUgY29va2Jvb2tzIGRlcGVuZGVuY2llcywgZG93bmxvYWRpbmcgdGhlbSBmcm9tIHRoZSBjb21tdW5pdHkgc2l0ZQorCitUaGUgbGFzdCBzdGVwIHdpbGwgZW5zdXJlIHRoYXQgYW55IGxvY2FsIGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB5b3UgaGF2ZSBtYWRlIHRvIHRoZSBjb29rYm9vayBhcmUgcHJlc2VydmVkLCBzbyB5b3UgY2FuIGtlZXAgeW91ciBjaGFuZ2VzIHRocm91Z2ggdXBzdHJlYW0gdXBkYXRlcy4KKworSWYgeW91J3JlIG5vdCB1c2luZyBHaXQsIHVzZSB0aGUgc2l0ZSBkb3dubG9hZCBzdWJjb21tYW5kIHRvIGRvd25sb2FkIHRoZSB0YXJiYWxsLgorCisgICAga25pZmUgY29va2Jvb2sgc2l0ZSBkb3dubG9hZCBDT09LQk9PSworCitUaGlzIGNyZWF0ZXMgdGhlIENPT0tCT09LLnRhci5neiBmcm9tIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoZS5nLiwgYH4vY2hlZi1yZXBvYCkuIFdlIHJlY29tbWVuZCBmb2xsb3dpbmcgYSB3b3JrZmxvdyBzaW1pbGFyIHRvIHRoZSBhYm92ZSBmb3IgeW91ciB2ZXJzaW9uIGNvbnRyb2wgdG9vbC4KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9kYXRhX2JhZ3MvUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL2RhdGFfYmFncy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNWEzOQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9kYXRhX2JhZ3MvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjMgQEAKK0RhdGEgQmFncworLS0tLS0tLS0tCisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGRpcmVjdG9yaWVzIG9mIHRoZSB2YXJpb3VzIGRhdGEgYmFncyB5b3UgY3JlYXRlIGZvciB5b3VyIGluZnJhc3RydWN0dXJlLiBFYWNoIHN1YmRpcmVjdG9yeSBjb3JyZXNwb25kcyB0byBhIGRhdGEgYmFnIG9uIHRoZSBDaGVmIFNlcnZlciwgYW5kIGNvbnRhaW5zIEpTT04gZmlsZXMgb2YgdGhlIGl0ZW1zIHRoYXQgZ28gaW4gdGhlIGJhZy4KKworRmlyc3QsIGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgdGhlIGRhdGEgYmFnLgorCisgICAgbWtkaXIgZGF0YV9iYWdzL0JBRworCitUaGVuIGNyZWF0ZSB0aGUgSlNPTiBmaWxlcyBmb3IgaXRlbXMgdGhhdCB3aWxsIGdvIGludG8gdGhhdCBiYWcuCisKKyAgICAkRURJVE9SIGRhdGFfYmFncy9CQUcvSVRFTS5qc29uCisKK1RoZSBKU09OIGZvciB0aGUgSVRFTSBtdXN0IGNvbnRhaW4gYSBrZXkgbmFtZWQgImlkIiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gIklURU0iLiBGb3IgZXhhbXBsZSwKKworICAgIHsKKyAgICAgICJpZCI6ICJmb28iCisgICAgfQorCitOZXh0LCBjcmVhdGUgdGhlIGRhdGEgYmFnIG9uIHRoZSBDaGVmIFNlcnZlci4KKworICAgIGtuaWZlIGRhdGEgYmFnIGNyZWF0ZSBCQUcKKworVGhlbiB1cGxvYWQgdGhlIGl0ZW1zIGluIHRoZSBkYXRhIGJhZydzIGRpcmVjdG9yeSB0byB0aGUgQ2hlZiBTZXJ2ZXIuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBmcm9tIGZpbGUgQkFHIElURU0uanNvbgorCisKK0VuY3J5cHRlZCBEYXRhIEJhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWRkZWQgaW4gQ2hlZiAwLjEwLCBlbmNyeXB0ZWQgZGF0YSBiYWdzIGFsbG93IHlvdSB0byBlbmNyeXB0IHRoZSBjb250ZW50cyBvZiB5b3VyIGRhdGEgYmFncy4gVGhlIGNvbnRlbnQgb2YgYXR0cmlidXRlcyB3aWxsIG5vIGxvbmdlciBiZSBzZWFyY2hhYmxlLiBUbyB1c2UgZW5jcnlwdGVkIGRhdGEgYmFncywgZmlyc3QgeW91IG11c3QgaGF2ZSBvciBjcmVhdGUgYSBzZWNyZXQga2V5LgorCisgICAgb3BlbnNzbCByYW5kIC1iYXNlNjQgNTEyID4gc2VjcmV0X2tleQorCitZb3UgbWF5IHVzZSB0aGlzIHNlY3JldF9rZXkgdG8gYWRkIGl0ZW1zIHRvIGEgZGF0YSBiYWcgZHVyaW5nIGEgY3JlYXRlLgorCisgICAga25pZmUgZGF0YSBiYWcgY3JlYXRlIC0tc2VjcmV0LWZpbGUgc2VjcmV0X2tleSBwYXNzd29yZHMgbXlzcWwKKworWW91IG1heSBhbHNvIHVzZSBpdCB3aGVuIGFkZGluZyBJVEVNcyBmcm9tIGZpbGVzLAorCisgICAga25pZmUgZGF0YSBiYWcgY3JlYXRlIHBhc3N3b3JkcworICAgIGtuaWZlIGRhdGEgYmFnIGZyb20gZmlsZSBwYXNzd29yZHMgZGF0YV9iYWdzL3Bhc3N3b3Jkcy9teXNxbC5qc29uIC0tc2VjcmV0LWZpbGUgc2VjcmV0X2tleQorCitUaGUgSlNPTiBmb3IgdGhlIElURU0gbXVzdCBjb250YWluIGEga2V5IG5hbWVkICJpZCIgd2l0aCBhIHZhbHVlIGVxdWFsIHRvICJJVEVNIiBhbmQgdGhlIGNvbnRlbnRzIHdpbGwgYmUgZW5jcnlwdGVkIHdoZW4gdXBsb2FkZWQuIEZvciBleGFtcGxlLAorCisgICAgeworICAgICAgImlkIjogIm15c3FsIiwKKyAgICAgICJwYXNzd29yZCI6ICJhYmMxMjMiCisgICAgfQorCitXaXRob3V0IHRoZSBzZWNyZXRfa2V5LCB0aGUgY29udGVudHMgYXJlIGVuY3J5cHRlZC4KKworICAgIGtuaWZlIGRhdGEgYmFnIHNob3cgcGFzc3dvcmRzIG15c3FsCisgICAgaWQ6ICAgICAgICBteXNxbAorICAgIHBhc3N3b3JkOiAgMkkwWFVVdmUxVFhFb2pFeWVHc2podz09CisKK1VzZSB0aGUgc2VjcmV0X2tleSB0byB2aWV3IHRoZSBjb250ZW50cy4KKworICAgIGtuaWZlIGRhdGEgYmFnIHNob3cgcGFzc3dvcmRzIG15c3FsIC0tc2VjcmV0LWZpbGUgc2VjcmV0X2tleQorICAgIGlkOiAgICAgICAgbXlzcWwKKyAgICBwYXNzd29yZDogIGFiYzEyMworCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9lbnZpcm9ubWVudHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWM0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzL1JFQURNRS5tZApAQCAtMCwwICsxLDUgQEAKK1JlcXVpcmVzIENoZWYgMC4xMC4wKy4KKworVGhpcyBkaXJlY3RvcnkgaXMgZm9yIFJ1YnkgRFNMIGFuZCBKU09OIGZpbGVzIGZvciBlbnZpcm9ubWVudHMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgQ2hlZiB3aWtpIHBhZ2U6CisKK2h0dHA6Ly9kb2NzLmNoZWYuaW8vZW52aXJvbm1lbnRzLmh0bWwKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vcm9sZXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWUwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vcm9sZXMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTYgQEAKK0NyZWF0ZSByb2xlcyBoZXJlLCBpbiBlaXRoZXIgdGhlIFJvbGUgUnVieSBEU0wgKC5yYikgb3IgSlNPTiAoLmpzb24pIGZpbGVzLiBUbyBpbnN0YWxsIHJvbGVzIG9uIHRoZSBzZXJ2ZXIsIHVzZSBrbmlmZS4KKworRm9yIGV4YW1wbGUsIGNyZWF0ZSBgcm9sZXMvYmFzZV9leGFtcGxlLnJiYDoKKworICAgIG5hbWUgImJhc2VfZXhhbXBsZSIKKyAgICBkZXNjcmlwdGlvbiAiRXhhbXBsZSBiYXNlIHJvbGUgYXBwbGllZCB0byBhbGwgbm9kZXMuIgorICAgICMgTGlzdCBvZiByZWNpcGVzIGFuZCByb2xlcyB0byBhcHBseS4gUmVxdWlyZXMgQ2hlZiAwLjgsIGVhcmxpZXIgdmVyc2lvbnMgdXNlICdyZWNpcGVzKCknLgorICAgICNydW5fbGlzdCgpCisgICAgIyBBdHRyaWJ1dGVzIGFwcGxpZWQgaWYgdGhlIG5vZGUgZG9lc24ndCBoYXZlIGl0IHNldCBhbHJlYWR5LgorICAgICNkZWZhdWx0X2F0dHJpYnV0ZXMoKQorICAgICMgQXR0cmlidXRlcyBhcHBsaWVkIG5vIG1hdHRlciB3aGF0IHRoZSBub2RlIGhhcyBzZXQgYWxyZWFkeS4KKyAgICAjb3ZlcnJpZGVfYXR0cmlidXRlcygpCisKK1RoZW4gdXBsb2FkIGl0IHRvIHRoZSBDaGVmIFNlcnZlcjoKKyAgICAKKyAgICBrbmlmZSByb2xlIGZyb20gZmlsZSByb2xlcy9iYXNlX2V4YW1wbGUucmIKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9yb2xlcy9lbGFzdGljc2VhcmNoLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vcm9sZXMvZWxhc3RpY3NlYXJjaC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWMxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vcm9sZXMvZWxhc3RpY3NlYXJjaC5qc29uCkBAIC0wLDAgKzEsMTkgQEAKK3sKKyAgIm5hbWUiOiAiZWxhc3RpY3NlYXJjaCIsCisgICJkZXNjcmlwdGlvbiI6ICJJbnN0YWxsYXRpb24gYXBwbGljYXRpb24gLSBlbGFzdGljc2VhcmNoIiwKKyAgImpzb25fY2xhc3MiOiAiQ2hlZjo6Um9sZSIsCisgICJkZWZhdWx0X2F0dHJpYnV0ZXMiOiB7CisKKyAgfSwKKyAgIm92ZXJyaWRlX2F0dHJpYnV0ZXMiOiB7CisKKyAgfSwKKyAgImNoZWZfdHlwZSI6ICJyb2xlIiwKKyAgInJ1bl9saXN0IjogWworICAgICJyZWNpcGVbc2RjLWVsYXN0aWNzZWFyY2g6OkVTXzFfc2V0dXBfZWxhc3RpY3NlYXJjaF0iLAorICAgICJyZWNpcGVbc2RjLWVsYXN0aWNzZWFyY2g6OkVTXzJfc2V0dXBfbG9nZ2luZ10iCisgIF0sCisgICJlbnZfcnVuX2xpc3RzIjogeworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL2NoZWYtc29sby9zb2xvLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vc29sby5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNmI0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vc29sby5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAgICJydW5fbGlzdCI6IFsgInJvbGVbZWxhc3RpY3NlYXJjaF0iIF0KK30KKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL3NvbG8ucmIgYi9zZGMtb3MtY2hlZi9zZGMtZWxhc3RpY3NlYXJjaC9jaGVmLXNvbG8vc29sby5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmMxYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvY2hlZi1zb2xvL3NvbG8ucmIKQEAgLTAsMCArMSwxNiBAQAorcm9vdCA9IEZpbGUuYWJzb2x1dGVfcGF0aChGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorZmlsZV9jYWNoZV9wYXRoIHJvb3QKK2Nvb2tib29rX3BhdGggcm9vdCArICcvY29va2Jvb2tzJworanNvbl9hdHRyaWJzIHJvb3QgKyAnL3NvbG8uanNvbicKK2NoZWNrc3VtX3BhdGggcm9vdCArICcvY2hlY2tzdW1zJworZGF0YV9iYWdfcGF0aCByb290ICsgJy9kYXRhX2JhZ3MnCitlbnZpcm9ubWVudF9wYXRoIHJvb3QgKyAnL2Vudmlyb25tZW50cycKK2ZpbGVfYmFja3VwX3BhdGggcm9vdCArICcvYmFja3VwJworZmlsZV9jYWNoZV9wYXRoIHJvb3QgKyAnL2NhY2hlJworbG9nX2xldmVsIDppbmZvCitsb2dfbG9jYXRpb24gU1RET1VUCityZXN0X3RpbWVvdXQgMzAwCityb2xlX3BhdGggcm9vdCArICcvcm9sZXMnCitzeW50YXhfY2hlY2tfY2FjaGVfcGF0aAordW1hc2sgMDAyMgordmVyYm9zZV9sb2dnaW5nIG5pbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWVsYXN0aWNzZWFyY2gvc3RhcnR1cC5zaCBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL3N0YXJ0dXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllNWZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1lbGFzdGljc2VhcmNoL3N0YXJ0dXAuc2gKQEAgLTAsMCArMSwxOSBAQAorIyEvYmluL3NoCisKK2V4cG9ydCBDSEVGTkFNRT0ke0VOVk5BTUV9CitjZCAvcm9vdC9jaGVmLXNvbG8KK2VjaG8gIm5vcm1hbFsnSE9TVF9JUCddID0gXCIke0hPU1RfSVB9XCIiID4gL3Jvb3QvY2hlZi1zb2xvL2Nvb2tib29rcy9zZGMtZWxhc3RpY3NlYXJjaC9hdHRyaWJ1dGVzL2RlZmF1bHQucmIKKworc2VkIC1pICcvXmV4ZWMvaUVTX0pBVkFfT1BUUz1cIi1YbXMxMDI0TSAtWG14MTAyNE1cIicgL2RvY2tlci1lbnRyeXBvaW50LnNoCisKK2NoZWYtc29sbyAtYyBzb2xvLnJiIC1FICR7Q0hFRk5BTUV9CisKKy9kb2NrZXItZW50cnlwb2ludC5zaCBlbGFzdGljc2VhcmNoICYKKworY2QgL3Jvb3QvY2hlZi1zb2xvCitjaGVmLXNvbG8gLWMgc29sby5yYiAtbyByZWNpcGVbc2RjLWVsYXN0aWNzZWFyY2g6OkVTXzNfY3JlYXRlX2F1ZGl0X3RlbXBsYXRlXQorY2hlZi1zb2xvIC1jIHNvbG8ucmIgLW8gcmVjaXBlW3NkYy1lbGFzdGljc2VhcmNoOjpFU180X2NyZWF0ZV9yZXNvdXJjZXNfdGVtcGxhdGVdCitjaGVmLXNvbG8gLWMgc29sby5yYiAtbyByZWNpcGVbc2RjLWVsYXN0aWNzZWFyY2g6OkVTXzVfY3JlYXRlX21vbml0b3JpbmdfdGVtcGxhdGVdCitjaGVmLXNvbG8gLWMgc29sby5yYiAtbyByZWNpcGVbc2RjLWVsYXN0aWNzZWFyY2g6OkVTXzZfY3JlYXRlX2tpYmFuYV9kYXNoYm9hcmRfdmlydHVhbGl6YXRpb25dCisKK3doaWxlIHRydWU7IGRvIHNsZWVwIDI7IGRvbmUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9Eb2NrZXJmaWxlLnRlbXBsYXRlIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL0RvY2tlcmZpbGUudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjZTE0NgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9Eb2NrZXJmaWxlLnRlbXBsYXRlCkBAIC0wLDAgKzEsMjYgQEAKK0ZST00gamV0dHkKKworUlVOIGFwdC1nZXQgLXkgdXBkYXRlCitSVU4gYXB0LWdldCAteSBpbnN0YWxsIGFwdC11dGlscworUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCBjdXJsCitSVU4gYXB0LWdldCAteSBpbnN0YWxsIHZpbQorCitDT1BZIGNoZWYtc29sbyAvcm9vdC9jaGVmLXNvbG8vCitDT1BZIGNoZWYtcmVwby9jb29rYm9va3MgL3Jvb3QvY2hlZi1zb2xvL2Nvb2tib29rcy8KKworRU5WIEJBU0VfTkVYVVMgemw5OTl5OkNoYW5nZU1lQDEwLjIwOC4xOTcuNzU6ODQ0My9yZXBvc2l0b3J5L21hdmVuLXB1YmxpYy9vcmcvb3BlbmVjb21wL3NkYworCisjIGluc3RhbGwgY2hlZi1zb2xvCitSVU4gY3VybCAtTCBodHRwczovL3d3dy5vcHNjb2RlLmNvbS9jaGVmL2luc3RhbGwuc2ggfCBiYXNoCisKK1JVTiBjcCAvdXNyL2xvY2FsL2pldHR5L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIC92YXIvbGliL2pldHR5L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisKK0FERCBvbmJvYXJkaW5nLWZlLV9fU0RDLVJFTEVBU0VfXy53YXIgIC92YXIvbGliL2pldHR5L3dlYmFwcHMvCitBREQgY2F0YWxvZy1mZS1fX1NEQy1SRUxFQVNFX18ud2FyICAgICAvdmFyL2xpYi9qZXR0eS93ZWJhcHBzLworUlVOIGNob3duIC1SIGpldHR5OmpldHR5ICAgICAgICAgICAgICAgL3Zhci9saWIvamV0dHkvd2ViYXBwcworCitDT1BZIHN0YXJ0dXAuc2ggL3Jvb3QvCisKK1JVTiBjaG1vZCA3NzAgL3Jvb3Qvc3RhcnR1cC5zaAorCitFTlRSWVBPSU5UIFsgIi9yb290L3N0YXJ0dXAuc2giIF0KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYiBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTliYmUzCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvYXR0cmlidXRlcy9kZWZhdWx0LnJiCkBAIC0wLDAgKzEsMiBAQAorIworIwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvZmlsZXMvZGVmYXVsdC9GRS1lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9maWxlcy9kZWZhdWx0L0ZFLWVjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgyYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvZmlsZXMvZGVmYXVsdC9GRS1lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSw0OCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3RlIHRoZSBjb252ZW50aW9ucyBvZiB0aGUgZmllbGQgdmFsdWVzOgorIyB0eXBlIGNhbiBiZSBvbmUgb2Y6IENPTkZJR19FUlJPUiwgU1lTVEVNX0VSUk9SLCBEQVRBX0VSUk9SLCBDT05ORUNUSU9OX1BST0JMRU0KKyMgc2V2ZXJpdHkgY2FuIGJlIG9uZSBvZjogV0FSTiwgRVJST1IsIEZBVEFMCisjIGFsYXJtU2V2ZXJpdHkgY2FuIGJlIG9uZSBvZjogQ1JJVElDQUwsTUFKT1IsTUlOT1IsSU5GT1JNQVRJT05BTCxOT05FCisjIGNvZGUgaXMgYSB1bmlxdWUgaW50ZWdlciBpbiByYW5nZSBvZiAzMDAzLTk5OTkgKDMwMDAtMzAwMiBhcmUgb2NjdXBpZWQgZm9yIGludGVybmFsIHVzYWdlKQorIyBUaGUgYWJvdmUgZW51bWVyYXRpb24gdmFsdWVzIGFyZSBvdXQtb2YtdGhlLWJveCBhbmQgY2FuIGJlIGNoYW5nZWQgaW4gY29kZS4gCisjIEluIGNhc2Ugb2YgY29uZmlnIGFuZCBjb2RlIG1pc21hdGNoLCB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igd2lsbCBiZSBwcmludGVkIHRvIGxvZworIworIyBSYW5nZSBvZiBGRSBjb2RlcyAtIDgwMDAtOTk5OQorCisKK2Vycm9yczoKKyAgICBGZUhlYWx0aENoZWNrQ29ubmVjdGlvbkVycm9yOiB7CisgICAgICAgIHR5cGU6IENPTk5FQ1RJT05fUFJPQkxFTSwKKyAgICAgICAgY29kZTogQVNEQ184MDAwLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiQ29ubmVjdGlvbiBlcnJvciBkdXJpbmcgRkUgSGVhbHRoIENoZWNrIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogQ1JJVElDQUwKKyAgICB9CisgICAgRmVIdHRwTG9nZ2luZ0Vycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ184MDAxLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igd2hlbiBsb2dnaW5nIEZFIEhUVFAgcmVxdWVzdC9yZXNwb25zZSIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IE1JTk9SCisgICAgfQorICAgIEZlUG9ydGFsU2VydmxldEVycm9yOiB7CisgICAgICAgIHR5cGU6IFNZU1RFTV9FUlJPUiwKKyAgICAgICAgY29kZTogQVNEQ184MDAyLAorICAgICAgICBzZXZlcml0eTogRVJST1IsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiRXJyb3Igd2hlbiB0cnlpbmcgdG8gYWNjZXNzIEZFIFBvcnRhbCBwYWdlIiwKKyAgICAgICAgYWxhcm1TZXZlcml0eTogTUFKT1IKKyAgICB9CisgICAgRmVIZWFsdGhDaGVja0dlbmVyYWxFcnJvcjogeworICAgICAgICB0eXBlOiBTWVNURU1fRVJST1IsCisgICAgICAgIGNvZGU6IEFTRENfODAwNCwKKyAgICAgICAgc2V2ZXJpdHk6IEVSUk9SLAorICAgICAgICBkZXNjcmlwdGlvbjogIkdlbmVyYWwgZXJyb3IgZHVyaW5nIEZFIEhlYWx0aCBDaGVjayIsCisgICAgICAgIGFsYXJtU2V2ZXJpdHk6IENSSVRJQ0FMCisgICAgfQorICAgIEZlSGVhbHRoQ2hlY2tSZWNvdmVyeTogeworICAgICAgICB0eXBlOiBSRUNPVkVSWSwKKyAgICAgICAgY29kZTogQVNEQ184MDA1LAorICAgICAgICBzZXZlcml0eTogSU5GTywKKyAgICAgICAgZGVzY3JpcHRpb246ICJCRSBIZWFsdGggQ2hlY2sgUmVjb3ZlcnkiLAorICAgICAgICBhbGFybVNldmVyaXR5OiBJTkZPUk1BVElPTkFMCisgICAgfSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9maWxlcy9kZWZhdWx0L0ZFLWxvZ2JhY2sueG1sIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvZmlsZXMvZGVmYXVsdC9GRS1sb2diYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc5M2YzCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvZmlsZXMvZGVmYXVsdC9GRS1sb2diYWNrLnhtbApAQCAtMCwwICsxLDIyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjb25maWd1cmF0aW9uIHNjYW49InRydWUiIHNjYW5QZXJpb2Q9IjUgc2Vjb25kcyI+CisKKyAgICAgICAgPHByb3BlcnR5IHNjb3BlPSJzeXN0ZW0iIG5hbWU9IkVDT01QLWNvbXBvbmVudC1uYW1lIiB2YWx1ZT0iQVNEQyIgLz4KKyAgICAgICAgPHByb3BlcnR5IHNjb3BlPSJzeXN0ZW0iIG5hbWU9IkVDT01QLXN1YmNvbXBvbmVudC1uYW1lIiB2YWx1ZT0iQVNEQy1GRSIgLz4KKyAgICAgICAgPHByb3BlcnR5IGZpbGU9IiR7Y29uZmlnLmhvbWV9L2NhdGFsb2ctZmUvY29uZmlndXJhdGlvbi55YW1sIiAvPgorICAgICAgICA8cHJvcGVydHkgc2NvcGU9ImNvbnRleHQiIG5hbWU9ImVuYWJsZS1hbGwtbG9nIiB2YWx1ZT0iZmFsc2UiIC8+CisKKyAgICAgICAgPCEtLSB2YWx1ZSB1c2VkIGJ5IHBhdHRlcm4gZmllbGQgbGlzdCAofCAtIGlzIGludGVyLWZpZWxkIHNlcGFyYXRvciwgfHwgLSB1bmF2YWlsYWJsZSBvciBub3QgYXBwbGljYWJsZSBmaWVsZCB2YWx1ZSkgKG0gLSBtYW5kYXRvcnksIG8tIG9wdGlvbmFsKS0tPgorICAgICAgICA8IS0tdGltZXN0YW1wKG0pfCByZXF1ZXN0SUQobSl8IHNlcnZpY2VJbnN0YW5jZUlEKG8pfCB0aHJlYWRJRChtKXwgcGh5c2ljYWxTZXJ2ZXJOYW1lKG8pfCBzZXJ2aWNlTmFtZShtKXwgdXNlcklEKG0pfCBsb2dMZXZlbChtKXwgc2V2ZXJpdHkobyl8IHNlcnZlcklwQWRkcmVzcyhtKXwgc2VydmVyTmFtZShtKXwgY2xpZW50SXBBZGRyZXNzKG8pfCBjbGFzc05hbWUobSl8IHRpbWVyKG8pfCBkZXRhaWxlZE1lc3NhZ2UobyktLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHQtbG9nLXBhdHRlcm4iCisgICAgICAgICAgICAgICAgdmFsdWU9IiVke3l5eXktTU0tZGQnVCdISDptbTpzcy5TU1NYWFh9fCVYe3V1aWR9fCVYe3NlcnZpY2VJbnN0YW5jZUlEfXwldGhyZWFkfHwke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfXwlWHt1c2VySWR9fCVsZXZlbHwlWHthbGFybVNldmVyaXR5fXwlWHtsb2NhbEFkZHJ9fCR7ZmVGcWRufXwlWHtyZW1vdGVBZGRyfXwlbG9nZ2VyezM1fXwlWHt0aW1lcn18QWN0aXZpdHlUeXBlPSZsdDslTSZndDssIERlc2M9Jmx0OyVtc2cmZ3Q7JW4iIC8+CisKKyAgICAgICAgPCEtLSBBbGwgbG9nIC0tPgorICAgICAgICA8aWYgY29uZGl0aW9uPSdwcm9wZXJ0eSgiZW5hYmxlLWFsbC1sb2ciKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIiknPgorICAgICAgICAgICAgICAgIDx0aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZGVyIG5hbWU9IkFMTF9ST0xMSU5HIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9hbGwubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm9sbGluZ1BvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuRml4ZWRXaW5kb3dSb2xsaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZU5hbWVQYXR0ZXJuPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2FsbC5sb2cuJWkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVOYW1lUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWluSW5kZXg+MTwvbWluSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb2xsaW5nUG9saWN5PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmlnZ2VyaW5nUG9saWN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF4RmlsZVNpemU+MjBNQjwvbWF4RmlsZVNpemU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHJpZ2dlcmluZ1BvbGljeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+JHtkZWZhdWx0LWxvZy1wYXR0ZXJufTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbmNvZGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHBlbmRlcj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZGVyIG5hbWU9IkFTWU5DX0FMTCIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJBTExfUk9MTElORyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwZW5kZXI+CisgICAgICAgICAgICAgICAgPC90aGVuPgorICAgICAgICA8L2lmPgorCisgICAgICAgIDwhLS0gRXJyb3IgbG9nIC0tPgorICAgICAgICA8YXBwZW5kZXIgbmFtZT0iRVJST1JfUk9MTElORyIKKyAgICAgICAgICAgICAgICBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgorICAgICAgICAgICAgICAgIDxmaWxlPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2Vycm9yLmxvZworICAgICAgICAgICAgICAgIDwvZmlsZT4KKworICAgICAgICAgICAgICAgIDwhLS0gQXVkaXQgbWVzc2FnZXMgZmlsdGVyIC0gZGVueSBhdWRpdCBtZXNzYWdlcyAtLT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyPkFVRElUX01BUktFUjwvbWFya2VyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ldmFsdWF0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NaXNtYXRjaD5ORVVUUkFMPC9vbk1pc21hdGNoPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9uTWF0Y2g+REVOWTwvb25NYXRjaD4KKyAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKworICAgICAgICAgICAgICAgIDwhLS0gVHJhbnNhY3Rpb24gbWVzc2FnZXMgZmlsdGVyIC0gZGVueSBUcmFuc2FjdGlvbiBtZXNzYWdlcyAtLT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLmZpbHRlci5FdmFsdWF0b3JGaWx0ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV2YWx1YXRvciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5ib29sZXguT25NYXJrZXJFdmFsdWF0b3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyPlRSQU5TQUNUSU9OX01BUktFUjwvbWFya2VyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ldmFsdWF0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NaXNtYXRjaD5ORVVUUkFMPC9vbk1pc21hdGNoPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9uTWF0Y2g+REVOWTwvb25NYXRjaD4KKyAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKworICAgICAgICAgICAgICAgIDwhLS0gZGVueSBhbGwgZXZlbnRzIHdpdGggYSBsZXZlbCBiZWxvdyBJTkZPLCB0aGF0IGlzIFRSQUNFIGFuZCBERUJVRyAtLT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxldmVsPklORk88L2xldmVsPgorICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorCisgICAgICAgICAgICAgICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9lcnJvci5sb2cuJWkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZU5hbWVQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1pbkluZGV4PjE8L21pbkluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKyAgICAgICAgICAgICAgICA8L3JvbGxpbmdQb2xpY3k+CisKKyAgICAgICAgICAgICAgICA8dHJpZ2dlcmluZ1BvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKyAgICAgICAgICAgICAgICA8L3RyaWdnZXJpbmdQb2xpY3k+CisgICAgICAgICAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj4ke2RlZmF1bHQtbG9nLXBhdHRlcm59PC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPC9hcHBlbmRlcj4KKworICAgICAgICA8IS0tIERlYnVnIGxvZyAtLT4KKyAgICAgICAgPGFwcGVuZGVyIG5hbWU9IkRFQlVHX1JPTExJTkciCisgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKyAgICAgICAgICAgICAgICA8ZmlsZT4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9kZWJ1Zy5sb2cKKyAgICAgICAgICAgICAgICA8L2ZpbGU+CisKKyAgICAgICAgICAgICAgICA8IS0tIE5vIG5lZWQgdG8gZGVueSBhdWRpdCBtZXNzYWdlcyAtIHRoZXkgYXJlIElORk8gb25seSwgd2lsbCBiZSBkZW5pZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFueXdheSAtLT4KKyAgICAgICAgICAgICAgICA8IS0tIFRyYW5zYWN0aW9uIG1lc3NhZ2VzIGZpbHRlciAtIGRlbnkgVHJhbnNhY3Rpb24gbWVzc2FnZXMsIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBERUJVRyBsZXZlbCBtZXNzYWdlcyBhbW9uZyB0aGVtIC0tPgorICAgICAgICAgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXZhbHVhdG9yIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmJvb2xleC5Pbk1hcmtlckV2YWx1YXRvciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXJrZXI+VFJBTlNBQ1RJT05fTUFSS0VSPC9tYXJrZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V2YWx1YXRvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvbk1pc21hdGNoPk5FVVRSQUw8L29uTWlzbWF0Y2g+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NYXRjaD5ERU5ZPC9vbk1hdGNoPgorICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorCisgICAgICAgICAgICAgICAgPCEtLSBhY2NlcHQgREVCVUcgYW5kIFRSQUNFIGxldmVsIC0tPgorICAgICAgICAgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXZhbHVhdG9yIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmJvb2xleC5HRXZlbnRFdmFsdWF0b3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxldmVsLnRvSW50KCkgJmx0Oz0gREVCVUcudG9JbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V2YWx1YXRvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxPbk1pc21hdGNoPkRFTlk8L09uTWlzbWF0Y2g+CisgICAgICAgICAgICAgICAgICAgICAgICA8T25NYXRjaD5ORVVUUkFMPC9Pbk1hdGNoPgorICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorCisgICAgICAgICAgICAgICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5GaXhlZFdpbmRvd1JvbGxpbmdQb2xpY3kiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2xvZy5ob21lfS8ke0VDT01QLWNvbXBvbmVudC1uYW1lfS8ke0VDT01QLXN1YmNvbXBvbmVudC1uYW1lfS9kZWJ1Zy5sb2cuJWkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZU5hbWVQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1pbkluZGV4PjE8L21pbkluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEluZGV4PjEwPC9tYXhJbmRleD4KKyAgICAgICAgICAgICAgICA8L3JvbGxpbmdQb2xpY3k+CisKKyAgICAgICAgICAgICAgICA8dHJpZ2dlcmluZ1BvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhGaWxlU2l6ZT4yME1CPC9tYXhGaWxlU2l6ZT4KKyAgICAgICAgICAgICAgICA8L3RyaWdnZXJpbmdQb2xpY3k+CisgICAgICAgICAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj4ke2RlZmF1bHQtbG9nLXBhdHRlcm59PC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPC9hcHBlbmRlcj4KKworICAgICAgICA8IS0tIEF1ZGl0IGxvZyAtLT4KKyAgICAgICAgPGFwcGVuZGVyIG5hbWU9IkFVRElUX1JPTExJTkciCisgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKworICAgICAgICAgICAgICAgIDxmaWxlPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2F1ZGl0LmxvZworICAgICAgICAgICAgICAgIDwvZmlsZT4KKworICAgICAgICAgICAgICAgIDwhLS0gQXVkaXQgbWVzc2FnZXMgZmlsdGVyIC0gYWNjZXB0IGF1ZGl0IG1lc3NhZ2VzIC0tPgorICAgICAgICAgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXZhbHVhdG9yIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmJvb2xleC5Pbk1hcmtlckV2YWx1YXRvciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXJrZXI+QVVESVRfTUFSS0VSPC9tYXJrZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V2YWx1YXRvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvbk1pc21hdGNoPkRFTlk8L29uTWlzbWF0Y2g+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NYXRjaD5BQ0NFUFQ8L29uTWF0Y2g+CisgICAgICAgICAgICAgICAgPC9maWx0ZXI+CisKKyAgICAgICAgICAgICAgICA8cm9sbGluZ1BvbGljeSBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLkZpeGVkV2luZG93Um9sbGluZ1BvbGljeSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZU5hbWVQYXR0ZXJuPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L2F1ZGl0LmxvZy4laQorICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlTmFtZVBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWluSW5kZXg+MTwvbWluSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SW5kZXg+MTA8L21heEluZGV4PgorICAgICAgICAgICAgICAgIDwvcm9sbGluZ1BvbGljeT4KKworICAgICAgICAgICAgICAgIDx0cmlnZ2VyaW5nUG9saWN5CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVCYXNlZFRyaWdnZXJpbmdQb2xpY3kiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEZpbGVTaXplPjIwTUI8L21heEZpbGVTaXplPgorICAgICAgICAgICAgICAgIDwvdHJpZ2dlcmluZ1BvbGljeT4KKyAgICAgICAgICAgICAgICA8ZW5jb2Rlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPiR7ZGVmYXVsdC1sb2ctcGF0dGVybn08L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgPC9lbmNvZGVyPgorICAgICAgICA8L2FwcGVuZGVyPgorCisgICAgICAgIDwhLS0gU2RuY1RyYW5zYWN0aW9uIGxvZyAtLT4KKyAgICAgICAgPGFwcGVuZGVyIG5hbWU9IlRSQU5TQUNUSU9OX1JPTExJTkciCisgICAgICAgICAgICAgICAgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKworICAgICAgICAgICAgICAgIDxmaWxlPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L3RyYW5zYWN0aW9uLmxvZworICAgICAgICAgICAgICAgIDwvZmlsZT4KKworICAgICAgICAgICAgICAgIDwhLS0gVHJhbnNhY3Rpb24gbWVzc2FnZXMgZmlsdGVyIC0gYWNjZXB0IGF1ZGl0IG1lc3NhZ2VzIC0tPgorICAgICAgICAgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuZmlsdGVyLkV2YWx1YXRvckZpbHRlciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXZhbHVhdG9yIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmJvb2xleC5Pbk1hcmtlckV2YWx1YXRvciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXJrZXI+VFJBTlNBQ1RJT05fTUFSS0VSPC9tYXJrZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V2YWx1YXRvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvbk1pc21hdGNoPkRFTlk8L29uTWlzbWF0Y2g+CisgICAgICAgICAgICAgICAgICAgICAgICA8b25NYXRjaD5BQ0NFUFQ8L29uTWF0Y2g+CisgICAgICAgICAgICAgICAgPC9maWx0ZXI+CisKKyAgICAgICAgICAgICAgICA8cm9sbGluZ1BvbGljeSBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLkZpeGVkV2luZG93Um9sbGluZ1BvbGljeSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZU5hbWVQYXR0ZXJuPiR7bG9nLmhvbWV9LyR7RUNPTVAtY29tcG9uZW50LW5hbWV9LyR7RUNPTVAtc3ViY29tcG9uZW50LW5hbWV9L3RyYW5zYWN0aW9uLmxvZy4laQorICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlTmFtZVBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWluSW5kZXg+MTwvbWluSW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SW5kZXg+MTA8L21heEluZGV4PgorICAgICAgICAgICAgICAgIDwvcm9sbGluZ1BvbGljeT4KKworICAgICAgICAgICAgICAgIDx0cmlnZ2VyaW5nUG9saWN5CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVCYXNlZFRyaWdnZXJpbmdQb2xpY3kiPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1heEZpbGVTaXplPjIwTUI8L21heEZpbGVTaXplPgorICAgICAgICAgICAgICAgIDwvdHJpZ2dlcmluZ1BvbGljeT4KKyAgICAgICAgICAgICAgICA8ZW5jb2Rlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPiR7ZGVmYXVsdC1sb2ctcGF0dGVybn08L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgPC9lbmNvZGVyPgorICAgICAgICA8L2FwcGVuZGVyPgorCisgICAgICAgIDwhLS0gQXN5bmNocm9uaWNpdHkgQ29uZmlndXJhdGlvbnMgLS0+CisgICAgICAgIDxhcHBlbmRlciBuYW1lPSJBU1lOQ19ERUJVRyIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJERUJVR19ST0xMSU5HIiAvPgorICAgICAgICA8L2FwcGVuZGVyPgorCisgICAgICAgIDxhcHBlbmRlciBuYW1lPSJBU1lOQ19UUkFOU0FDVElPTiIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJUUkFOU0FDVElPTl9ST0xMSU5HIiAvPgorICAgICAgICA8L2FwcGVuZGVyPgorCisgICAgICAgIDxhcHBlbmRlciBuYW1lPSJBU1lOQ19FUlJPUiIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuQXN5bmNBcHBlbmRlciI+CisgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJFUlJPUl9ST0xMSU5HIiAvPgorICAgICAgICA8L2FwcGVuZGVyPgorCisKKyAgICAgICAgPHJvb3QgbGV2ZWw9IklORk8iPgorICAgICAgICAgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJBU1lOQ19FUlJPUiIgLz4KKyAgICAgICAgICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iQVNZTkNfREVCVUciIC8+CisgICAgICAgICAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkFVRElUX1JPTExJTkciIC8+CisgICAgICAgICAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkFTWU5DX1RSQU5TQUNUSU9OIiAvPgorICAgICAgICAgICAgICAgIDxpZiBjb25kaXRpb249J3Byb3BlcnR5KCJlbmFibGUtYWxsLWxvZyIpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSc+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGhlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkFMTF9ST0xMSU5HIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVuPgorICAgICAgICAgICAgICAgIDwvaWY+CisgICAgICAgIDwvcm9vdD4KKworICAgICAgICA8bG9nZ2VyIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjIiBsZXZlbD0iSU5GTyIgLz4KKzwvY29uZmlndXJhdGlvbj4KKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvZmlsZXMvZGVmYXVsdC9GRS1yZXN0LWNvbmZpZ3VyYXRpb24ueWFtbCBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL2ZpbGVzL2RlZmF1bHQvRkUtcmVzdC1jb25maWd1cmF0aW9uLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlZGFmZQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL2ZpbGVzL2RlZmF1bHQvRkUtcmVzdC1jb25maWd1cmF0aW9uLnlhbWwKQEAgLTAsMCArMSwxMSBAQAorIyByZXN0IHJlYWQgdGltZW91dCAtIG1lYW5zIG5vIHRpbWVvdXQKK3JlYWRUaW1lb3V0SW5TZWM6IDAKKworIyB3aGV0aGVyIHRvIGlnbm9yZSBjZXJ0aWZpY2F0ZQoraWdub3JlQ2VydGlmaWNhdGU6IGZhbHNlCisKKyMgdGhlIGNvbm5lY3Rpb24gcG9vbCBzaXplCitjb25uZWN0aW9uUG9vbFNpemU6IDEwCisKKyMgY3JlYXRlIGNvbm5lY3Rpb24gdGltZW91dAorY29ubmVjdFRpbWVvdXRJblNlYzogMTAKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3JlY2lwZXMvRkVfMV9jbGVhbnVwX2pldHR5ZGlyLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvcmVjaXBlcy9GRV8xX2NsZWFudXBfamV0dHlkaXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMDFhOQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3JlY2lwZXMvRkVfMV9jbGVhbnVwX2pldHR5ZGlyLnJiCkBAIC0wLDAgKzEsNDkgQEAKKyNkaXJlY3RvcnkgIkZFX3RlbXBkaXJfY2xlYW51cCIgZG8KKyMgIHBhdGggIi92YXIvbGliL2pldHR5L3RlbXBkaXIiCisjICByZWN1cnNpdmUgdHJ1ZQorIyAgYWN0aW9uIDpkZWxldGUKKyNlbmQKKworCitkaXJlY3RvcnkgIkZFX3RlbXBkaXJfY3JlYXRpb24iIGRvCisgIHBhdGggIi92YXIvbGliL2pldHR5L3RlbXAiCisgIG93bmVyICdqZXR0eScKKyAgZ3JvdXAgJ2pldHR5JworICBtb2RlICcwNzU1JworICBhY3Rpb24gOmNyZWF0ZQorZW5kCisKKworI2RpcmVjdG9yeSAiRkVfd2ViYXBwc19jbGVhbnVwIiBkbworIyAgcGF0aCAiL3Zhci9saWIvamV0dHkvd2ViYXBwcyIKKyMgIHJlY3Vyc2l2ZSB0cnVlCisjICBhY3Rpb24gOmRlbGV0ZQorI2VuZAorCisKKyNkaXJlY3RvcnkgIkZFX3dlYmFwcHNfY3JlYXRpb24iIGRvCisjICBwYXRoICIvdmFyL2xpYi9qZXR0eS93ZWJhcHBzIgorIyAgb3duZXIgJ2pldHR5JworIyAgZ3JvdXAgJ2pldHR5JworIyAgbW9kZSAnMDc1NScKKyMgIGFjdGlvbiA6Y3JlYXRlCisjZW5kCisKKworZGlyZWN0b3J5ICJGRV9jcmVhdGVfY29uZmlnX2RpciIgZG8KKyAgcGF0aCAiL3Zhci9saWIvamV0dHkvY29uZmlnIgorICBvd25lciAnamV0dHknCisgIGdyb3VwICdqZXR0eScKKyAgbW9kZSAnMDc1NScKKyAgYWN0aW9uIDpjcmVhdGUKK2VuZAorCisKK2RpcmVjdG9yeSAiRkVfY3JlYXRlX2NhdGFsb2ctZmUiIGRvCisgIHBhdGggIi92YXIvbGliL2pldHR5L2NvbmZpZy9jYXRhbG9nLWZlIgorICBvd25lciAnamV0dHknCisgIGdyb3VwICdqZXR0eScKKyAgbW9kZSAnMDc1NScKKyAgYWN0aW9uIDpjcmVhdGUKK2VuZAorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9yZWNpcGVzL0ZFXzJfc2V0dXBfY29uZmlndXJhdGlvbi5yYiBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3JlY2lwZXMvRkVfMl9zZXR1cF9jb25maWd1cmF0aW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZDcxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9yZWNpcGVzL0ZFXzJfc2V0dXBfY29uZmlndXJhdGlvbi5yYgpAQCAtMCwwICsxLDEzIEBACit0ZW1wbGF0ZSAiY2F0YWxvZy1mZS1jb25maWciIGRvCisgICBwYXRoICIvdmFyL2xpYi9qZXR0eS9jb25maWcvY2F0YWxvZy1mZS9jb25maWd1cmF0aW9uLnlhbWwiCisgICBzb3VyY2UgIkZFLWNvbmZpZ3VyYXRpb24ueWFtbC5lcmIiCisgICBvd25lciAiamV0dHkiCisgICBncm91cCAiamV0dHkiCisgICBtb2RlICIwNzU1IgorICAgdmFyaWFibGVzKHsKKyAgICAgIDpmZV9ob3N0X2lwICAgPT4gbm9kZVsnSE9TVF9JUCddLAorICAgICAgOmJlX2hvc3RfaXAgICA9PiBub2RlWydIT1NUX0lQJ10sCisgICAgICA6Y2F0YWxvZ19wb3J0ID0+IG5vZGVbJ0JFJ11bOmh0dHBfcG9ydF0sCisgICAgICA6c3NsX3BvcnQgICAgID0+IG5vZGVbJ0JFJ11bOmh0dHBzX3BvcnRdCisgICB9KQorZW5kCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9yZWNpcGVzL0ZFXzNfZXJyb3JzX2NvbmZpZy5yYiBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3JlY2lwZXMvRkVfM19lcnJvcnNfY29uZmlnLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGMzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9yZWNpcGVzL0ZFXzNfZXJyb3JzX2NvbmZpZy5yYgpAQCAtMCwwICsxLDcgQEAKK2Nvb2tib29rX2ZpbGUgIi92YXIvbGliL2pldHR5L2NvbmZpZy9jYXRhbG9nLWZlL2Vjb21wLWVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbCIgZG8KKyAgc291cmNlICJGRS1lY29tcC1lcnJvci1jb25maWd1cmF0aW9uLnlhbWwiCisgIG1vZGUgMDc1NQorICBvd25lciAiamV0dHkiCisgIGdyb3VwICJqZXR0eSIKK2VuZAorIApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvcmVjaXBlcy9GRV80X2xvZ2JhY2sucmIgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9yZWNpcGVzL0ZFXzRfbG9nYmFjay5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzRmZWJiCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvcmVjaXBlcy9GRV80X2xvZ2JhY2sucmIKQEAgLTAsMCArMSw3IEBACitjb29rYm9va19maWxlICIvdmFyL2xpYi9qZXR0eS9jb25maWcvY2F0YWxvZy1mZS9sb2diYWNrLnhtbCIgZG8KKyAgc291cmNlICJGRS1sb2diYWNrLnhtbCIKKyAgbW9kZSAwNzU1CisgIG93bmVyICJqZXR0eSIKKyAgZ3JvdXAgImpldHR5IgorZW5kCisgCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9yZWNpcGVzL0ZFXzVfcmVzdF9jb25maWd1cmF0aW9uLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvcmVjaXBlcy9GRV81X3Jlc3RfY29uZmlndXJhdGlvbi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTAyODZhCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvcmVjaXBlcy9GRV81X3Jlc3RfY29uZmlndXJhdGlvbi5yYgpAQCAtMCwwICsxLDcgQEAKK2Nvb2tib29rX2ZpbGUgIi92YXIvbGliL2pldHR5L2NvbmZpZy9jYXRhbG9nLWZlL3Jlc3QtY29uZmlndXJhdGlvbi1pbmZvLnlhbWwiIGRvCisgIHNvdXJjZSAiRkUtcmVzdC1jb25maWd1cmF0aW9uLnlhbWwiCisgIG1vZGUgMDc1NQorICBvd25lciAiamV0dHkiCisgIGdyb3VwICJqZXR0eSIKK2VuZAorIApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvcmVjaXBlcy9GRV82X2NyZWF0ZV9qZXR0eV9tb2R1bGVzLnJiIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvcmVjaXBlcy9GRV82X2NyZWF0ZV9qZXR0eV9tb2R1bGVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDBmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS9yZWNpcGVzL0ZFXzZfY3JlYXRlX2pldHR5X21vZHVsZXMucmIKQEAgLTAsMCArMSw0NSBAQAoramV0dHlfYmFzZT0iL3Zhci9saWIvamV0dHkiCitqZXR0eV9ob21lPSIvdXNyL2xvY2FsL2pldHR5IgorCisjIyMjIyMgY3JlYXRlIEpldHR5IG1vZHVsZXMKK2Jhc2ggImNyZWF0ZS1qZXR0eS1tb2R1bGVzIiBkbworY3dkICIje2pldHR5X2Jhc2V9IgorY29kZSA8PC1FT0gKKyAgIGNkICIje2pldHR5X2Jhc2V9IgorICAgamF2YSAtamFyICIvI3tqZXR0eV9ob21lfSIvc3RhcnQuamFyIC0tYWRkLXRvLXN0YXJ0PWRlcGxveQorICAgamF2YSAtamFyICIvI3tqZXR0eV9ob21lfSIvc3RhcnQuamFyIC0tYWRkLXRvLXN0YXJ0ZD1odHRwLGh0dHBzLGxvZ2dpbmcsc2V0dWlkCitFT0gKK25vdF9pZiAibHMgLyN7amV0dHlfYmFzZX0vc3RhcnQuZC9odHRwcy5pbmkiCitlbmQKKworCisjIyMjIyMgY29uZmlndXJlIEpldHR5IG1vZHVsZXMKK3RlbXBsYXRlICJGRS1odHRwLWluaSIgZG8KKyAgIHBhdGggIi8je2pldHR5X2Jhc2V9L3N0YXJ0LmQvaHR0cC5pbmkiCisgICBzb3VyY2UgIkZFLWh0dHAtaW5pLmVyYiIKKyAgIG93bmVyICJqZXR0eSIKKyAgIGdyb3VwICJqZXR0eSIKKyAgIG1vZGUgIjA3NTUiCisgICB2YXJpYWJsZXMgOkZFX2h0dHBfcG9ydCA9PiAiI3tub2RlWydGRSddWzpodHRwX3BvcnRdfSIKK2VuZAorCisKK3RlbXBsYXRlICJGRS1odHRwcy1pbmkiIGRvCisgICBwYXRoICIvI3tqZXR0eV9iYXNlfS9zdGFydC5kL2h0dHBzLmluaSIKKyAgIHNvdXJjZSAiRkUtaHR0cHMtaW5pLmVyYiIKKyAgIG93bmVyICJqZXR0eSIKKyAgIGdyb3VwICJqZXR0eSIKKyAgIG1vZGUgIjA3NTUiCisgICB2YXJpYWJsZXMgOkZFX2h0dHBzX3BvcnQgPT4gIiN7bm9kZVsnRkUnXVs6aHR0cHNfcG9ydF19IgorZW5kCisKKwordGVtcGxhdGUgIkZFLXNzbC1pbmkiIGRvCisgICBwYXRoICIvI3tqZXR0eV9iYXNlfS9zdGFydC5kL3NzbC5pbmkiCisgICBzb3VyY2UgIkZFLXNzbC1pbmkuZXJiIgorICAgb3duZXIgImpldHR5IgorICAgZ3JvdXAgImpldHR5IgorICAgbW9kZSAiMDc1NSIKKyAgIHZhcmlhYmxlcyA6RkVfaHR0cHNfcG9ydCA9PiAiI3tub2RlWydGRSddWzpodHRwc19wb3J0XX0iCitlbmQKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvdGVtcGxhdGVzL2RlZmF1bHQvRkUtY29uZmlndXJhdGlvbi55YW1sLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3RlbXBsYXRlcy9kZWZhdWx0L0ZFLWNvbmZpZ3VyYXRpb24ueWFtbC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2NGJiOQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3RlbXBsYXRlcy9kZWZhdWx0L0ZFLWNvbmZpZ3VyYXRpb24ueWFtbC5lcmIKQEAgLTAsMCArMSw3OSBAQAorIyBOZWVkZWQgZm9yIGxvZ2dpbmcgcHVycG9zZXMuIFRvIGJlIHBvcHVsYXRlZCBieSBEZXZPcHMgLSBjdXJyZW50bHkgZHVtbXkKK2ZlRnFkbjogPCU9IEBmZV9ob3N0X2lwICU+CisKKyMgY2F0YWxvZyBiYWNrZW5kIGhvc3RuYW1lCitiZUhvc3Q6IDwlPSBAYmVfaG9zdF9pcCAlPgorCisjIGNhdGFsb2cgYmFja2VuZCBodHRwIHBvcnQKK2JlSHR0cFBvcnQ6IDwlPSBAY2F0YWxvZ19wb3J0ICU+CisKKyMgY2F0YWxvZyBiYWNrZW5kIGh0dHAgY29udGV4dAorYmVDb250ZXh0OiAvc2RjMi9yZXN0L3YxL2NhdGFsb2cvdXBsb2FkL3Jlc291cmNlcworCisjIGNhdGFsb2cgYmFja2VuZCBwcm90b2NvbAorYmVQcm90b2NvbDogaHR0cAorCisjIGNhdGFsb2cgYmFja2VuZCBzc2wgcG9ydAorYmVTc2xQb3J0OiA8JT0gQHNzbF9wb3J0ICU+CisKKyMgdGhyZWFkcG9vbCBzaXplIGZvciBoYW5kbGluZyByZXF1ZXN0cwordGhyZWFkcG9vbFNpemU6IDUwCisKKyMgcmVxdWVzdCBwcm9jZXNzaW5nIHRpbWVvdXQgKHNlY29uZHMpCityZXF1ZXN0VGltZW91dDogMTAKKworaGVhbHRoQ2hlY2tTb2NrZXRUaW1lb3V0SW5NczogNTAwMAorCitoZWFsdGhDaGVja0ludGVydmFsSW5TZWNvbmRzOiA1CisKK2lkZW50aWZpY2F0aW9uSGVhZGVyRmllbGRzOiAKKyAgIC0KKyAgICAgICAgLSAmSFRUUF9JVl9VU0VSIEhUVFBfSVZfVVNFUgorICAgICAgICAtICZpdi11c2VyIGl2LXVzZXIKKyAgIC0KKyAgICAgICAgLSAmVVNFUl9JRCBVU0VSX0lECisgICAgICAgIC0gJnVzZXItaWQgdXNlci1pZAorICAgLQorICAgICAgICAtICZIVFRQX0NTUF9BVFRVSUQgSFRUUF9DU1BfQVRUVUlECisgICAgICAgIC0gJmNzcC1hdHR1aWQgY3NwLWF0dHVpZAorICAgLQorICAgICAgICAtICZIVFRQX0NTUF9XU1RZUEUgSFRUUF9DU1BfV1NUWVBFCisgICAgICAgIC0gJmNzcC13c3R5cGUgY3NwLXdzdHlwZQorCitvcHRpb25hbEhlYWRlckZpZWxkczoKKyAgIC0KKyAgICAgICAgLSAmSFRUUF9DU1BfRklSU1ROQU1FIEhUVFBfQ1NQX0ZJUlNUTkFNRQorICAgICAgICAtICZjc3AtZmlyc3RuYW1lIGNzcC1maXJzdG5hbWUKKyAgIC0KKyAgICAgICAgLSAmSFRUUF9DU1BfTEFTVE5BTUUgSFRUUF9DU1BfTEFTVE5BTUUKKyAgICAgICAgLSAmY3NwLWxhc3RuYW1lIGNzcC1sYXN0bmFtZQorICAgLQorICAgICAgICAtICZIVFRQX0lWX1JFTU9URV9BRERSRVNTIEhUVFBfSVZfUkVNT1RFX0FERFJFU1MKKyAgICAgICAgLSAmaXYtcmVtb3RlLWFkZHJlc3MgaXYtcmVtb3RlLWFkZHJlc3MKKyAgIC0KKyAgICAgICAgLSAmSFRUUF9DU1BfRU1BSUwgSFRUUF9DU1BfRU1BSUwKKyAgICAgICAgLSAmY3NwLWVtYWlsIGNzcC1lbWFpbAorCisKK3ZlcnNpb246IDEuMAorcmVsZWFzZWQ6IDIwMTItMTEtMzAKKworIyBDb25uZWN0aW9uIHBhcmFtZXRlcnMKK2Nvbm5lY3Rpb246CisgICAgdXJsOiBqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYvZGIKKyAgICBwb29sU2l6ZTogMTcKKworIyBQcm90b2NvbHMKK3Byb3RvY29sczoKKyAgIC0gaHR0cAorICAgLSBodHRwcworCisKK3N5c3RlbU1vbml0b3Jpbmc6CisgICAgZW5hYmxlZDogdHJ1ZQorICAgIGlzUHJveHk6IHRydWUKKyAgICBwcm9iZUludGVydmFsSW5TZWNvbmRzOiAxNQorCitraWJhbmFIb3N0OiBsb2NhbGhvc3QKK2tpYmFuYVBvcnQ6IDU2MDEKK2tpYmFuYVByb3RvY29sOiBodHRwCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS90ZW1wbGF0ZXMvZGVmYXVsdC9GRS1odHRwLWluaS5lcmIgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtY2F0YWxvZy1mZS90ZW1wbGF0ZXMvZGVmYXVsdC9GRS1odHRwLWluaS5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhNzNmZAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3RlbXBsYXRlcy9kZWZhdWx0L0ZFLWh0dHAtaW5pLmVyYgpAQCAtMCwwICsxLDMyIEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNb2R1bGU6IGh0dHAKKy0tbW9kdWxlPWh0dHAKKworIyMjIEhUVFAgQ29ubmVjdG9yIENvbmZpZ3VyYXRpb24KKworIyMgQ29ubmVjdG9yIGhvc3QvYWRkcmVzcyB0byBiaW5kIHRvCisjIGpldHR5Lmh0dHAuaG9zdD0wLjAuMC4wCisKKyMjIENvbm5lY3RvciBwb3J0IHRvIGxpc3RlbiBvbgoramV0dHkuaHR0cC5wb3J0PTwlPSBARkVfaHR0cF9wb3J0ICU+CisKKyMjIENvbm5lY3RvciBpZGxlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCitqZXR0eS5odHRwLmlkbGVUaW1lb3V0PTMwMDAwCisKKyMjIENvbm5lY3RvciBzb2NrZXQgbGluZ2VyIHRpbWUgaW4gc2Vjb25kcyAoLTEgdG8gZGlzYWJsZSkKKyMgamV0dHkuaHR0cC5zb0xpbmdlclRpbWU9LTEKKworIyMgTnVtYmVyIG9mIGFjY2VwdG9ycyAoLTEgcGlja3MgZGVmYXVsdCBiYXNlZCBvbiBudW1iZXIgb2YgY29yZXMpCisjIGpldHR5Lmh0dHAuYWNjZXB0b3JzPS0xCisKKyMjIE51bWJlciBvZiBzZWxlY3RvcnMgKC0xIHBpY2tzIGRlZmF1bHQgYmFzZWQgb24gbnVtYmVyIG9mIGNvcmVzKQorIyBqZXR0eS5odHRwLnNlbGVjdG9ycz0tMQorCisjIyBTZXJ2ZXJTb2NrZXRDaGFubmVsIGJhY2tsb2cgKDAgcGlja3MgcGxhdGZvcm0gZGVmYXVsdCkKKyMgamV0dHkuaHR0cC5hY2NlcHRvclF1ZXVlU2l6ZT0wCisKKyMjIFRocmVhZCBwcmlvcml0eSBkZWx0YSB0byBnaXZlIHRvIGFjY2VwdG9yIHRocmVhZHMKKyMgamV0dHkuaHR0cC5hY2NlcHRvclByaW9yaXR5RGVsdGE9MAorCisjIyBIVFRQIENvbXBsaWFuY2U6IFJGQzcyMzAsIFJGQzI2MTYsIExFR0FDWQorIyBqZXR0eS5odHRwLmNvbXBsaWFuY2U9UkZDNzIzMApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvdGVtcGxhdGVzL2RlZmF1bHQvRkUtaHR0cHMtaW5pLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3RlbXBsYXRlcy9kZWZhdWx0L0ZFLWh0dHBzLWluaS5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjYTUyNQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3RlbXBsYXRlcy9kZWZhdWx0L0ZFLWh0dHBzLWluaS5lcmIKQEAgLTAsMCArMSwxNSBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTW9kdWxlOiBodHRwcworLS1tb2R1bGU9aHR0cHMKKworIyMgSFRUUFMgQ29uZmlndXJhdGlvbgorIyBIVFRQIHBvcnQgdG8gbGlzdGVuIG9uCitodHRwcy5wb3J0PTwlPSBARkVfaHR0cHNfcG9ydCAlPgorCisjIEhUVFBTIGlkbGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKK2pldHR5Lmh0dHBzLmlkbGVUaW1lb3V0PTMwMDAwMAorCisjIEhUVFBTIFNvY2tldC5zb0xpbmdlclRpbWUgaW4gc2Vjb25kcy4gKC0xIHRvIGRpc2FibGUpCisjIGh0dHBzLnNvTGluZ2VyVGltZT0tMQorCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3RlbXBsYXRlcy9kZWZhdWx0L0ZFLXNzbC1pbmkuZXJiIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvdGVtcGxhdGVzL2RlZmF1bHQvRkUtc3NsLWluaS5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ZTBlNAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1jYXRhbG9nLWZlL3RlbXBsYXRlcy9kZWZhdWx0L0ZFLXNzbC1pbmkuZXJiCkBAIC0wLDAgKzEsODMgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1vZHVsZTogc3NsCistLW1vZHVsZT1zc2wKKworIyMjIFRMUyhTU0wpIENvbm5lY3RvciBDb25maWd1cmF0aW9uCisKKyMjIENvbm5lY3RvciBob3N0L2FkZHJlc3MgdG8gYmluZCB0bworIyBqZXR0eS5zc2wuaG9zdD0wLjAuMC4wCisKKyMjIENvbm5lY3RvciBwb3J0IHRvIGxpc3RlbiBvbgoramV0dHkuc3NsLnBvcnQ9PCU9IEBGRV9odHRwc19wb3J0ICU+CisKKyMjIENvbm5lY3RvciBpZGxlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCisjIGpldHR5LnNzbC5pZGxlVGltZW91dD0zMDAwMAorCisjIyBDb25uZWN0b3Igc29ja2V0IGxpbmdlciB0aW1lIGluIHNlY29uZHMgKC0xIHRvIGRpc2FibGUpCisjIGpldHR5LnNzbC5zb0xpbmdlclRpbWU9LTEKKworIyMgTnVtYmVyIG9mIGFjY2VwdG9ycyAoLTEgcGlja3MgZGVmYXVsdCBiYXNlZCBvbiBudW1iZXIgb2YgY29yZXMpCisjIGpldHR5LnNzbC5hY2NlcHRvcnM9LTEKKworIyMgTnVtYmVyIG9mIHNlbGVjdG9ycyAoLTEgcGlja3MgZGVmYXVsdCBiYXNlZCBvbiBudW1iZXIgb2YgY29yZXMpCisjIGpldHR5LnNzbC5zZWxlY3RvcnM9LTEKKworIyMgU2VydmVyU29ja2V0Q2hhbm5lbCBiYWNrbG9nICgwIHBpY2tzIHBsYXRmb3JtIGRlZmF1bHQpCisjIGpldHR5LnNzbC5hY2NlcHRvclF1ZXVlU2l6ZT0wCisKKyMjIFRocmVhZCBwcmlvcml0eSBkZWx0YSB0byBnaXZlIHRvIGFjY2VwdG9yIHRocmVhZHMKKyMgamV0dHkuc3NsLmFjY2VwdG9yUHJpb3JpdHlEZWx0YT0wCisKKyMjIFdoZXRoZXIgcmVxdWVzdCBob3N0IG5hbWVzIGFyZSBjaGVja2VkIHRvIG1hdGNoIGFueSBTTkkgbmFtZXMKKyMgamV0dHkuc3NsLnNuaUhvc3RDaGVjaz10cnVlCisKKyMjIG1heCBhZ2UgaW4gc2Vjb25kcyBmb3IgYSBTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IHJlc3BvbnNlIGhlYWRlciAoZGVmYXVsdCAtMSkKKyMgamV0dHkuc3NsLnN0c01heEFnZVNlY29uZHM9MzE1MzYwMDAKKworIyMgaW5jbHVkZSBzdWJkb21haW4gcHJvcGVydHkgaW4gYW55IFN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkgaGVhZGVyIChkZWZhdWx0IGZhbHNlKQorIyBqZXR0eS5zc2wuc3RzSW5jbHVkZVN1YmRvbWFpbnM9dHJ1ZQorCisjIyMgU3NsQ29udGV4dEZhY3RvcnkgQ29uZmlndXJhdGlvbgorIyMgTm90ZSB0aGF0IE9CRiBwYXNzd29yZHMgYXJlIG5vdCBzZWN1cmUsIGp1c3QgcHJvdGVjdGVkIGZyb20gY2FzdWFsIG9ic2VydmF0aW9uCisjIyBTZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZXR0eS9kb2N1bWVudGF0aW9uL2N1cnJlbnQvY29uZmlndXJpbmctc2VjdXJpdHktc2VjdXJlLXBhc3N3b3Jkcy5odG1sCisKKyMjIEtleXN0b3JlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gJGpldHR5LmJhc2UpCisjIGpldHR5LnNzbENvbnRleHQua2V5U3RvcmVQYXRoPWV0Yy9rZXlzdG9yZQorCisjIyBUcnVzdHN0b3JlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gJGpldHR5LmJhc2UpCisjIGpldHR5LnNzbENvbnRleHQudHJ1c3RTdG9yZVBhdGg9ZXRjL2tleXN0b3JlCisKKyMjIEtleXN0b3JlIHBhc3N3b3JkCisjIGpldHR5LnNzbENvbnRleHQua2V5U3RvcmVQYXNzd29yZD1PQkY6MXZueTF6bG8xeDhlMXZudzF2bjYxeDhnMXpsdTF2bjQKKworIyMgS2V5c3RvcmUgdHlwZSBhbmQgcHJvdmlkZXIKKyMgamV0dHkuc3NsQ29udGV4dC5rZXlTdG9yZVR5cGU9SktTCisjIGpldHR5LnNzbENvbnRleHQua2V5U3RvcmVQcm92aWRlcj0KKworIyMgS2V5TWFuYWdlciBwYXNzd29yZAorIyBqZXR0eS5zc2xDb250ZXh0LmtleU1hbmFnZXJQYXNzd29yZD1PQkY6MXUydTF3bWwxejdzMXo3YTF3bmwxdTJnCisKKyMjIFRydXN0c3RvcmUgcGFzc3dvcmQKKyMgamV0dHkuc3NsQ29udGV4dC50cnVzdFN0b3JlUGFzc3dvcmQ9T0JGOjF2bnkxemxvMXg4ZTF2bncxdm42MXg4ZzF6bHUxdm40CisKKyMjIFRydXN0c3RvcmUgdHlwZSBhbmQgcHJvdmlkZXIKKyMgamV0dHkuc3NsQ29udGV4dC50cnVzdFN0b3JlVHlwZT1KS1MKKyMgamV0dHkuc3NsQ29udGV4dC50cnVzdFN0b3JlUHJvdmlkZXI9CisKKyMjIHdoZXRoZXIgY2xpZW50IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkCisjIGpldHR5LnNzbENvbnRleHQubmVlZENsaWVudEF1dGg9ZmFsc2UKKworIyMgV2hldGhlciBjbGllbnQgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gaXMgZGVzaXJlZAorIyBqZXR0eS5zc2xDb250ZXh0LndhbnRDbGllbnRBdXRoPWZhbHNlCisKKyMjIFdoZXRoZXIgY2lwaGVyIG9yZGVyIGlzIHNpZ25pZmljYW50IChzaW5jZSBqYXZhIDggb25seSkKKyMgamV0dHkuc3NsQ29udGV4dC51c2VDaXBoZXJTdWl0ZXNPcmRlcj10cnVlCisKKyMjIFRvIGNvbmZpZ3VyZSBJbmNsdWRlcyAvIEV4Y2x1ZGVzIGZvciBDaXBoZXIgU3VpdGVzIG9yIFByb3RvY29scyBzZWUgdHdlYWstc3NsLnhtbCBleGFtcGxlIGF0CisjIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9qZXR0eS9kb2N1bWVudGF0aW9uL2N1cnJlbnQvY29uZmlndXJpbmctc3NsLmh0bWwjY29uZmlndXJpbmctc3NsY29udGV4dGZhY3RvcnktY2lwaGVyU3VpdGVzCisKKyMjIFNldCB0aGUgc2l6ZSBvZiB0aGUgU3NsU2Vzc2lvbiBjYWNoZQorIyBqZXR0eS5zc2xDb250ZXh0LnNzbFNlc3Npb25DYWNoZVNpemU9LTEKKworIyMgU2V0IHRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBvZiB0aGUgU3NsU2Vzc2lvbiBjYWNoZSB0aW1lb3V0CisjIGpldHR5LnNzbENvbnRleHQuc3NsU2Vzc2lvblRpbWVvdXQ9LTEKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vTElDRU5TRSBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA2OWVkCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9MSUNFTlNFCkBAIC0wLDAgKzEsMjAxIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworMS4gRGVmaW5pdGlvbnMuCisKKyAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKzQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKzUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCitDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiMGZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzcgQEAKK0RlcHJlY2F0ZWQKKz09PT09PT09PT0KKworVXNlIG9mIHRoaXMgcmVwb3NpdG9yeSBpcyBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBjaGVmIGdlbmVyYXRlIHJlcG9gIGNvbW1hbmQgdGhhdCBjb21lcyB3aXRoIFtDaGVmREtdKGh0dHA6Ly9kb3dubG9hZHMuY2hlZi5pby9jaGVmLWRrLykuCisKK092ZXJ2aWV3Cis9PT09PT09PQorCitFdmVyeSBDaGVmIGluc3RhbGxhdGlvbiBuZWVkcyBhIENoZWYgUmVwb3NpdG9yeS4gVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgY29va2Jvb2tzLCByb2xlcywgY29uZmlnIGZpbGVzIGFuZCBvdGhlciBhcnRpZmFjdHMgZm9yIG1hbmFnaW5nIHN5c3RlbXMgd2l0aCBDaGVmIHdpbGwgbGl2ZS4gV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHN0b3JpbmcgdGhpcyByZXBvc2l0b3J5IGluIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBzdWNoIGFzIEdpdCBhbmQgdHJlYXQgaXQgbGlrZSBzb3VyY2UgY29kZS4KKworV2hpbGUgd2UgcHJlZmVyIEdpdCwgYW5kIG1ha2UgdGhpcyByZXBvc2l0b3J5IGF2YWlsYWJsZSB2aWEgR2l0SHViLCB5b3UgYXJlIHdlbGNvbWUgdG8gZG93bmxvYWQgYSB0YXIgb3IgemlwIGFyY2hpdmUgYW5kIHVzZSB5b3VyIGZhdm9yaXRlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdG8gbWFuYWdlIHRoZSBjb2RlLgorCitSZXBvc2l0b3J5IERpcmVjdG9yaWVzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgcmVwb3NpdG9yeSBjb250YWlucyBzZXZlcmFsIGRpcmVjdG9yaWVzLCBhbmQgZWFjaCBkaXJlY3RvcnkgY29udGFpbnMgYSBSRUFETUUgZmlsZSB0aGF0IGRlc2NyaWJlcyB3aGF0IGl0IGlzIGZvciBpbiBncmVhdGVyIGRldGFpbCwgYW5kIGhvdyB0byB1c2UgaXQgZm9yIG1hbmFnaW5nIHlvdXIgc3lzdGVtcyB3aXRoIENoZWYuCisKKyogYGNvb2tib29rcy9gIC0gQ29va2Jvb2tzIHlvdSBkb3dubG9hZCBvciBjcmVhdGUuCisqIGBkYXRhX2JhZ3MvYCAtIFN0b3JlIGRhdGEgYmFncyBhbmQgaXRlbXMgaW4gLmpzb24gaW4gdGhlIHJlcG9zaXRvcnkuCisqIGByb2xlcy9gIC0gU3RvcmUgcm9sZXMgaW4gLnJiIG9yIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorKiBgZW52aXJvbm1lbnRzL2AgLSBTdG9yZSBlbnZpcm9ubWVudHMgaW4gLnJiIG9yIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorCitDb25maWd1cmF0aW9uCis9PT09PT09PT09PT09CisKK1RoZSByZXBvc2l0b3J5IGNvbnRhaW5zIGEga25pZmUgY29uZmlndXJhdGlvbiBmaWxlLgorCisqIC5jaGVmL2tuaWZlLnJiCisKK1RoZSBrbmlmZSBjb25maWd1cmF0aW9uIGZpbGUgYC5jaGVmL2tuaWZlLnJiYCBpcyBhIHJlcG9zaXRvcnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIGZvciBrbmlmZS4gSWYgeW91J3JlIHVzaW5nIEhvc3RlZCBDaGVmLCB5b3UgY2FuIGRvd25sb2FkIG9uZSBmb3IgeW91ciBvcmdhbml6YXRpb24gZnJvbSB0aGUgbWFuYWdlbWVudCBjb25zb2xlLiBJZiB5b3UncmUgdXNpbmcgdGhlIE9wZW4gU291cmNlIENoZWYgU2VydmVyLCB5b3UgY2FuIGdlbmVyYXRlIGEgbmV3IG9uZSB3aXRoIGBrbmlmZSBjb25maWd1cmVgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1cmluZyBLbmlmZSwgc2VlIHRoZSBLbmlmZSBkb2N1bWVudGF0aW9uLgorCitodHRwczovL2RvY3MuY2hlZi5pby9rbmlmZS5odG1sCisKK05leHQgU3RlcHMKKz09PT09PT09PT0KKworUmVhZCB0aGUgUkVBRE1FIGZpbGUgaW4gZWFjaCBvZiB0aGUgc3ViZGlyZWN0b3JpZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBnb2VzIGluIHRob3NlIGRpcmVjdG9yaWVzLgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9jaGVmaWdub3JlIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9jaGVmaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzBhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL2NoZWZpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorIyBQdXQgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGlzIGZpbGUuCisjIExpbmVzIHRoYXQgc3RhcnQgd2l0aCAnIyAnIGFyZSBjb21tZW50cy4KKworIyBlbWFjcworKn4KKworIyB2aW0KKyouc3dbYS16XQorCisjIHN1YnZlcnNpb24KKyovLnN2bi8qCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL2Nvb2tib29rcy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL2Nvb2tib29rcy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlYTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vY29va2Jvb2tzL1JFQURNRS5tZApAQCAtMCwwICsxLDU0IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgY29va2Jvb2tzIHVzZWQgdG8gY29uZmlndXJlIHN5c3RlbXMgaW4geW91ciBpbmZyYXN0cnVjdHVyZSB3aXRoIENoZWYuCisKK0tuaWZlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8ga25vdyB3aGVyZSB0aGUgY29va2Jvb2tzIGFyZSBsb2NhdGVkIHdpdGggdGhlIGBjb29rYm9va19wYXRoYCBzZXR0aW5nLiBJZiB0aGlzIGlzIG5vdCBzZXQsIHRoZW4gc2V2ZXJhbCBjb29rYm9vayBvcGVyYXRpb25zIHdpbGwgZmFpbCB0byB3b3JrIHByb3Blcmx5LgorCisgICAgY29va2Jvb2tfcGF0aCBbIi4vY29va2Jvb2tzIl0KKworVGhpcyBzZXR0aW5nIHRlbGxzIGtuaWZlIHRvIGxvb2sgZm9yIHRoZSBjb29rYm9va3MgZGlyZWN0b3J5IGluIHRoZSBwcmVzZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIG1lYW5zIHRoZSBrbmlmZSBjb29rYm9vayBzdWJjb21tYW5kcyBuZWVkIHRvIGJlIHJ1biBpbiB0aGUgYGNoZWYtcmVwb2AgZGlyZWN0b3J5IGl0c2VsZi4gVG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvb2tib29rcyBjYW4gYmUgZm91bmQgZWxzZXdoZXJlIGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgdXNlIGFuIGFic29sdXRlIHBhdGguIFRoaXMgaXMgYSBSdWJ5IGZpbGUsIHNvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQ6CisKKyAgICBjdXJyZW50X2RpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykKKyAgICBjb29rYm9va19wYXRoIFsiI3tjdXJyZW50X2Rpcn0vLi4vY29va2Jvb2tzIl0KKworV2hpY2ggd2lsbCBzZXQgYGN1cnJlbnRfZGlyYCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGtuaWZlLnJiIGZpbGUgaXRzZWxmIChlLmcuIGB+L2NoZWYtcmVwby8uY2hlZi9rbmlmZS5yYmApLgorCitDb25maWd1cmUga25pZmUgdG8gdXNlIHlvdXIgcHJlZmVycmVkIGNvcHlyaWdodCBob2xkZXIsIGVtYWlsIGNvbnRhY3QgYW5kIGxpY2Vuc2UuIEFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIGAuY2hlZi9rbmlmZS5yYmAuCisKKyAgICBjb29rYm9va19jb3B5cmlnaHQgIkV4YW1wbGUsIENvbS4iCisgICAgY29va2Jvb2tfZW1haWwgICAgICJjb29rYm9va3NAZXhhbXBsZS5jb20iCisgICAgY29va2Jvb2tfbGljZW5zZSAgICJhcGFjaGV2MiIKKworU3VwcG9ydGVkIHZhbHVlcyBmb3IgYGNvb2tib29rX2xpY2Vuc2VgIGFyZSAiYXBhY2hldjIiLCAibWl0IiwiZ3BsdjIiLCJncGx2MyIsICBvciAibm9uZSIuIFRoZXNlIHNldHRpbmdzIGFyZSB1c2VkIHRvIHByZWZpbGwgY29tbWVudHMgaW4gdGhlIGRlZmF1bHQgcmVjaXBlLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoZSBtZXRhZGF0YS5yYi4gWW91IGFyZSBmcmVlIHRvIGNoYW5nZSB0aGUgdGhlIGNvbW1lbnRzIGluIHRob3NlIGZpbGVzLgorCitDcmVhdGUgbmV3IGNvb2tib29rcyBpbiB0aGlzIGRpcmVjdG9yeSB3aXRoIEtuaWZlLgorCisgICAga25pZmUgY29va2Jvb2sgY3JlYXRlIENPT0tCT09LCisKK1RoaXMgd2lsbCBjcmVhdGUgYWxsIHRoZSBjb29rYm9vayBkaXJlY3RvcnkgY29tcG9uZW50cy4gWW91IGRvbid0IG5lZWQgdG8gdXNlIHRoZW0gYWxsLCBhbmQgY2FuIGRlbGV0ZSB0aGUgb25lcyB5b3UgZG9uJ3QgbmVlZC4gSXQgYWxzbyBjcmVhdGVzIGEgUkVBRE1FIGZpbGUsIG1ldGFkYXRhLnJiIGFuZCBkZWZhdWx0IHJlY2lwZS4KKworWW91IGNhbiBhbHNvIGRvd25sb2FkIGNvb2tib29rcyBkaXJlY3RseSBmcm9tIHRoZSBPcHNjb2RlIENvb2tib29rIFNpdGUuIFRoZXJlIGFyZSB0d28gc3ViY29tbWFuZHMgdG8gaGVscCB3aXRoIHRoaXMgZGVwZW5kaW5nIG9uIHdoYXQgeW91ciBwcmVmZXJlbmNlIGlzLgorCitUaGUgZmlyc3QgYW5kIHJlY29tbWVuZGVkIG1ldGhvZCBpcyB0byB1c2UgYSB2ZW5kb3IgYnJhbmNoIGlmIHlvdSdyZSB1c2luZyBHaXQuIFRoaXMgaXMgYXV0b21hdGljYWxseSBoYW5kbGVkIHdpdGggS25pZmUuCisKKyAgICBrbmlmZSBjb29rYm9vayBzaXRlIGluc3RhbGwgQ09PS0JPT0sKKworVGhpcyB3aWxsOgorCisqIERvd25sb2FkIHRoZSBjb29rYm9vayB0YXJiYWxsIGZyb20gY29va2Jvb2tzLm9wc2NvZGUuY29tLgorKiBFbnN1cmUgaXRzIG9uIHRoZSBnaXQgbWFzdGVyIGJyYW5jaC4KKyogQ2hlY2tzIGZvciBhbiBleGlzdGluZyB2ZW5kb3IgYnJhbmNoLCBhbmQgY3JlYXRlcyBpZiBpdCBkb2Vzbid0LgorKiBDaGVja3Mgb3V0IHRoZSB2ZW5kb3IgYnJhbmNoIChjaGVmLXZlbmRvci1DT09LQk9PSykuCisqIFJlbW92ZXMgdGhlIGV4aXN0aW5nIChvbGQpIHZlcnNpb24uCisqIFVudGFycyB0aGUgY29va2Jvb2sgdGFyYmFsbCBpdCBkb3dubG9hZGVkIGluIHRoZSBmaXJzdCBzdGVwLgorKiBBZGRzIHRoZSBjb29rYm9vayBmaWxlcyB0byB0aGUgZ2l0IGluZGV4IGFuZCBjb21taXRzLgorKiBDcmVhdGVzIGEgdGFnIGZvciB0aGUgdmVyc2lvbiBkb3dubG9hZGVkLgorKiBDaGVja3Mgb3V0IHRoZSBtYXN0ZXIgYnJhbmNoIGFnYWluLgorKiBNZXJnZXMgdGhlIGNvb2tib29rIGludG8gbWFzdGVyLgorKiBSZXBlYXRzIHRoZSBhYm92ZSBmb3IgYWxsIHRoZSBjb29rYm9va3MgZGVwZW5kZW5jaWVzLCBkb3dubG9hZGluZyB0aGVtIGZyb20gdGhlIGNvbW11bml0eSBzaXRlCisKK1RoZSBsYXN0IHN0ZXAgd2lsbCBlbnN1cmUgdGhhdCBhbnkgbG9jYWwgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHlvdSBoYXZlIG1hZGUgdG8gdGhlIGNvb2tib29rIGFyZSBwcmVzZXJ2ZWQsIHNvIHlvdSBjYW4ga2VlcCB5b3VyIGNoYW5nZXMgdGhyb3VnaCB1cHN0cmVhbSB1cGRhdGVzLgorCitJZiB5b3UncmUgbm90IHVzaW5nIEdpdCwgdXNlIHRoZSBzaXRlIGRvd25sb2FkIHN1YmNvbW1hbmQgdG8gZG93bmxvYWQgdGhlIHRhcmJhbGwuCisKKyAgICBrbmlmZSBjb29rYm9vayBzaXRlIGRvd25sb2FkIENPT0tCT09LCisKK1RoaXMgY3JlYXRlcyB0aGUgQ09PS0JPT0sudGFyLmd6IGZyb20gaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChlLmcuLCBgfi9jaGVmLXJlcG9gKS4gV2UgcmVjb21tZW5kIGZvbGxvd2luZyBhIHdvcmtmbG93IHNpbWlsYXIgdG8gdGhlIGFib3ZlIGZvciB5b3VyIHZlcnNpb24gY29udHJvbCB0b29sLgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9kYXRhX2JhZ3MvUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9kYXRhX2JhZ3MvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTVhMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL2RhdGFfYmFncy9SRUFETUUubWQKQEAgLTAsMCArMSw2MyBAQAorRGF0YSBCYWdzCistLS0tLS0tLS0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGlyZWN0b3JpZXMgb2YgdGhlIHZhcmlvdXMgZGF0YSBiYWdzIHlvdSBjcmVhdGUgZm9yIHlvdXIgaW5mcmFzdHJ1Y3R1cmUuIEVhY2ggc3ViZGlyZWN0b3J5IGNvcnJlc3BvbmRzIHRvIGEgZGF0YSBiYWcgb24gdGhlIENoZWYgU2VydmVyLCBhbmQgY29udGFpbnMgSlNPTiBmaWxlcyBvZiB0aGUgaXRlbXMgdGhhdCBnbyBpbiB0aGUgYmFnLgorCitGaXJzdCwgY3JlYXRlIGEgZGlyZWN0b3J5IGZvciB0aGUgZGF0YSBiYWcuCisKKyAgICBta2RpciBkYXRhX2JhZ3MvQkFHCisKK1RoZW4gY3JlYXRlIHRoZSBKU09OIGZpbGVzIGZvciBpdGVtcyB0aGF0IHdpbGwgZ28gaW50byB0aGF0IGJhZy4KKworICAgICRFRElUT1IgZGF0YV9iYWdzL0JBRy9JVEVNLmpzb24KKworVGhlIEpTT04gZm9yIHRoZSBJVEVNIG11c3QgY29udGFpbiBhIGtleSBuYW1lZCAiaWQiIHdpdGggYSB2YWx1ZSBlcXVhbCB0byAiSVRFTSIuIEZvciBleGFtcGxlLAorCisgICAgeworICAgICAgImlkIjogImZvbyIKKyAgICB9CisKK05leHQsIGNyZWF0ZSB0aGUgZGF0YSBiYWcgb24gdGhlIENoZWYgU2VydmVyLgorCisgICAga25pZmUgZGF0YSBiYWcgY3JlYXRlIEJBRworCitUaGVuIHVwbG9hZCB0aGUgaXRlbXMgaW4gdGhlIGRhdGEgYmFnJ3MgZGlyZWN0b3J5IHRvIHRoZSBDaGVmIFNlcnZlci4KKworICAgIGtuaWZlIGRhdGEgYmFnIGZyb20gZmlsZSBCQUcgSVRFTS5qc29uCisKKworRW5jcnlwdGVkIERhdGEgQmFncworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZGRlZCBpbiBDaGVmIDAuMTAsIGVuY3J5cHRlZCBkYXRhIGJhZ3MgYWxsb3cgeW91IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzIG9mIHlvdXIgZGF0YSBiYWdzLiBUaGUgY29udGVudCBvZiBhdHRyaWJ1dGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNlYXJjaGFibGUuIFRvIHVzZSBlbmNyeXB0ZWQgZGF0YSBiYWdzLCBmaXJzdCB5b3UgbXVzdCBoYXZlIG9yIGNyZWF0ZSBhIHNlY3JldCBrZXkuCisKKyAgICBvcGVuc3NsIHJhbmQgLWJhc2U2NCA1MTIgPiBzZWNyZXRfa2V5CisKK1lvdSBtYXkgdXNlIHRoaXMgc2VjcmV0X2tleSB0byBhZGQgaXRlbXMgdG8gYSBkYXRhIGJhZyBkdXJpbmcgYSBjcmVhdGUuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBjcmVhdGUgLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5IHBhc3N3b3JkcyBteXNxbAorCitZb3UgbWF5IGFsc28gdXNlIGl0IHdoZW4gYWRkaW5nIElURU1zIGZyb20gZmlsZXMsCisKKyAgICBrbmlmZSBkYXRhIGJhZyBjcmVhdGUgcGFzc3dvcmRzCisgICAga25pZmUgZGF0YSBiYWcgZnJvbSBmaWxlIHBhc3N3b3JkcyBkYXRhX2JhZ3MvcGFzc3dvcmRzL215c3FsLmpzb24gLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5CisKK1RoZSBKU09OIGZvciB0aGUgSVRFTSBtdXN0IGNvbnRhaW4gYSBrZXkgbmFtZWQgImlkIiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gIklURU0iIGFuZCB0aGUgY29udGVudHMgd2lsbCBiZSBlbmNyeXB0ZWQgd2hlbiB1cGxvYWRlZC4gRm9yIGV4YW1wbGUsCisKKyAgICB7CisgICAgICAiaWQiOiAibXlzcWwiLAorICAgICAgInBhc3N3b3JkIjogImFiYzEyMyIKKyAgICB9CisKK1dpdGhvdXQgdGhlIHNlY3JldF9rZXksIHRoZSBjb250ZW50cyBhcmUgZW5jcnlwdGVkLgorCisgICAga25pZmUgZGF0YSBiYWcgc2hvdyBwYXNzd29yZHMgbXlzcWwKKyAgICBpZDogICAgICAgIG15c3FsCisgICAgcGFzc3dvcmQ6ICAySTBYVVV2ZTFUWEVvakV5ZUdzamh3PT0KKworVXNlIHRoZSBzZWNyZXRfa2V5IHRvIHZpZXcgdGhlIGNvbnRlbnRzLgorCisgICAga25pZmUgZGF0YSBiYWcgc2hvdyBwYXNzd29yZHMgbXlzcWwgLS1zZWNyZXQtZmlsZSBzZWNyZXRfa2V5CisgICAgaWQ6ICAgICAgICBteXNxbAorICAgIHBhc3N3b3JkOiAgYWJjMTIzCisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vZW52aXJvbm1lbnRzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFjNDhkCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9lbnZpcm9ubWVudHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNSBAQAorUmVxdWlyZXMgQ2hlZiAwLjEwLjArLgorCitUaGlzIGRpcmVjdG9yeSBpcyBmb3IgUnVieSBEU0wgYW5kIEpTT04gZmlsZXMgZm9yIGVudmlyb25tZW50cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBDaGVmIHdpa2kgcGFnZToKKworaHR0cDovL2RvY3MuY2hlZi5pby9lbnZpcm9ubWVudHMuaHRtbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL3JvbGVzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGVlMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQKQEAgLTAsMCArMSwxNiBAQAorQ3JlYXRlIHJvbGVzIGhlcmUsIGluIGVpdGhlciB0aGUgUm9sZSBSdWJ5IERTTCAoLnJiKSBvciBKU09OICguanNvbikgZmlsZXMuIFRvIGluc3RhbGwgcm9sZXMgb24gdGhlIHNlcnZlciwgdXNlIGtuaWZlLgorCitGb3IgZXhhbXBsZSwgY3JlYXRlIGByb2xlcy9iYXNlX2V4YW1wbGUucmJgOgorCisgICAgbmFtZSAiYmFzZV9leGFtcGxlIgorICAgIGRlc2NyaXB0aW9uICJFeGFtcGxlIGJhc2Ugcm9sZSBhcHBsaWVkIHRvIGFsbCBub2Rlcy4iCisgICAgIyBMaXN0IG9mIHJlY2lwZXMgYW5kIHJvbGVzIHRvIGFwcGx5LiBSZXF1aXJlcyBDaGVmIDAuOCwgZWFybGllciB2ZXJzaW9ucyB1c2UgJ3JlY2lwZXMoKScuCisgICAgI3J1bl9saXN0KCkKKyAgICAjIEF0dHJpYnV0ZXMgYXBwbGllZCBpZiB0aGUgbm9kZSBkb2Vzbid0IGhhdmUgaXQgc2V0IGFscmVhZHkuCisgICAgI2RlZmF1bHRfYXR0cmlidXRlcygpCisgICAgIyBBdHRyaWJ1dGVzIGFwcGxpZWQgbm8gbWF0dGVyIHdoYXQgdGhlIG5vZGUgaGFzIHNldCBhbHJlYWR5LgorICAgICNvdmVycmlkZV9hdHRyaWJ1dGVzKCkKKworVGhlbiB1cGxvYWQgaXQgdG8gdGhlIENoZWYgU2VydmVyOgorICAgIAorICAgIGtuaWZlIHJvbGUgZnJvbSBmaWxlIHJvbGVzL2Jhc2VfZXhhbXBsZS5yYgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9yb2xlcy9jYXRhbG9nLWZlLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL3JvbGVzL2NhdGFsb2ctZmUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAyMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9yb2xlcy9jYXRhbG9nLWZlLmpzb24KQEAgLTAsMCArMSwyMyBAQAoreworICAibmFtZSI6ICJjYXRhbG9nLWJlIiwKKyAgImRlc2NyaXB0aW9uIjogIkluc3RhbGxhdGlvbiBhcHBsaWNhdGlvbiAtIGNhdGFsb2dGRSIsCisgICJqc29uX2NsYXNzIjogIkNoZWY6OlJvbGUiLAorICAiZGVmYXVsdF9hdHRyaWJ1dGVzIjogeworCisgIH0sCisgICJvdmVycmlkZV9hdHRyaWJ1dGVzIjogeworCisgIH0sCisgICJjaGVmX3R5cGUiOiAicm9sZSIsCisgICJydW5fbGlzdCI6IFsKKyAgICAicmVjaXBlW3NkYy1jYXRhbG9nLWZlOjpGRV8xX2NsZWFudXBfamV0dHlkaXJdIiwKKyAgICAicmVjaXBlW3NkYy1jYXRhbG9nLWZlOjpGRV8yX3NldHVwX2NvbmZpZ3VyYXRpb25dIiwKKyAgICAicmVjaXBlW3NkYy1jYXRhbG9nLWZlOjpGRV8zX2Vycm9yc19jb25maWddIiwKKyAgICAicmVjaXBlW3NkYy1jYXRhbG9nLWZlOjpGRV80X2xvZ2JhY2tdIiwKKyAgICAicmVjaXBlW3NkYy1jYXRhbG9nLWZlOjpGRV81X3Jlc3RfY29uZmlndXJhdGlvbl0iLAorCSJyZWNpcGVbc2RjLWNhdGFsb2ctZmU6OkZFXzZfY3JlYXRlX2pldHR5X21vZHVsZXNdIgorICBdLAorICAiZW52X3J1bl9saXN0cyI6IHsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL3NvbG8uanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vc29sby5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtZnJvbnRlbmQvY2hlZi1zb2xvL3NvbG8uanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgICAicnVuX2xpc3QiOiBbICJyb2xlW2NhdGFsb2ctZmVdIiBdCit9CisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vc29sby5yYiBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9jaGVmLXNvbG8vc29sby5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmMxYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL2NoZWYtc29sby9zb2xvLnJiCkBAIC0wLDAgKzEsMTYgQEAKK3Jvb3QgPSBGaWxlLmFic29sdXRlX3BhdGgoRmlsZS5kaXJuYW1lKF9fRklMRV9fKSkKK2ZpbGVfY2FjaGVfcGF0aCByb290Citjb29rYm9va19wYXRoIHJvb3QgKyAnL2Nvb2tib29rcycKK2pzb25fYXR0cmlicyByb290ICsgJy9zb2xvLmpzb24nCitjaGVja3N1bV9wYXRoIHJvb3QgKyAnL2NoZWNrc3VtcycKK2RhdGFfYmFnX3BhdGggcm9vdCArICcvZGF0YV9iYWdzJworZW52aXJvbm1lbnRfcGF0aCByb290ICsgJy9lbnZpcm9ubWVudHMnCitmaWxlX2JhY2t1cF9wYXRoIHJvb3QgKyAnL2JhY2t1cCcKK2ZpbGVfY2FjaGVfcGF0aCByb290ICsgJy9jYWNoZScKK2xvZ19sZXZlbCA6aW5mbworbG9nX2xvY2F0aW9uIFNURE9VVAorcmVzdF90aW1lb3V0IDMwMAorcm9sZV9wYXRoIHJvb3QgKyAnL3JvbGVzJworc3ludGF4X2NoZWNrX2NhY2hlX3BhdGgKK3VtYXNrIDAwMjIKK3ZlcmJvc2VfbG9nZ2luZyBuaWwKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9zdGFydHVwLnNoIGIvc2RjLW9zLWNoZWYvc2RjLWZyb250ZW5kL3N0YXJ0dXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzZDRkNAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1mcm9udGVuZC9zdGFydHVwLnNoCkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9zaAorCitleHBvcnQgQ0hFRk5BTUU9JHtFTlZOQU1FfQorY2QgL3Jvb3QvY2hlZi1zb2xvCitlY2hvICJub3JtYWxbJ0hPU1RfSVAnXSA9IFwiJHtIT1NUX0lQfVwiIiA+IC9yb290L2NoZWYtc29sby9jb29rYm9va3Mvc2RjLWNhdGFsb2ctZmUvYXR0cmlidXRlcy9kZWZhdWx0LnJiCitjaGVmLXNvbG8gLWMgc29sby5yYiAtRSAke0NIRUZOQU1FfQorCitzZWQgLWkgJy9ec2V0IC1lL2FKQVZBX09QVElPTlM9XCItWFg6TWF4UGVybVNpemU9MjU2bSAtWG14MTUwMG0gLURjb25maWcuaG9tZT0ke0pFVFRZX0JBU0V9XC9jb25maWcgLURsb2cuaG9tZT0ke0pFVFRZX0JBU0V9XC9sb2dzIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT0ke0pFVFRZX0JBU0V9XC9jb25maWdcL2NhdGFsb2ctZmVcL2xvZ2JhY2sueG1sIC1EY29uZmlndXJhdGlvbi55YW1sPSR7SkVUVFlfQkFTRX1cL2NvbmZpZ1wvY2F0YWxvZy1mZVwvY29uZmlndXJhdGlvbi55YW1sXCInIC9kb2NrZXItZW50cnlwb2ludC5zaAorc2VkIC1pICcvXnNldCAtZS9hVE1QRElSPSR7SkVUVFlfQkFTRX1cL3RlbXAnIC9kb2NrZXItZW50cnlwb2ludC5zaAorCitjZCAvdmFyL2xpYi9qZXR0eQorL2RvY2tlci1lbnRyeXBvaW50LnNoIApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9Eb2NrZXJmaWxlIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTY1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwxOCBAQAorRlJPTSBraWJhbmE6NC4zLjMKKworUlVOIGFwdC1nZXQgLXkgdXBkYXRlCitSVU4gYXB0LWdldCAteSBpbnN0YWxsIGN1cmwKK1JVTiBhcHQtZ2V0IC15IGluc3RhbGwgdmltCisKK0NPUFkgY2hlZi1zb2xvIC9yb290L2NoZWYtc29sby8KK0NPUFkgY2hlZi1yZXBvL2Nvb2tib29rcy8uIC9yb290L2NoZWYtc29sby9jb29rYm9va3MvCisKKworIyBpbnN0YWxsIGNoZWYtc29sbworUlVOIGN1cmwgLUwgaHR0cHM6Ly93d3cub3BzY29kZS5jb20vY2hlZi9pbnN0YWxsLnNoIHwgYmFzaAorCitDT1BZIHN0YXJ0dXAuc2ggL3Jvb3QvCisKK1JVTiBjaG1vZCA3NzAgL3Jvb3Qvc3RhcnR1cC5zaAorCitFTlRSWVBPSU5UIFsgIi9yb290L3N0YXJ0dXAuc2giIF0KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMta2liYW5hL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYiBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMta2liYW5hL2F0dHJpYnV0ZXMvZGVmYXVsdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg3Y2E4Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1raWJhbmEvYXR0cmlidXRlcy9kZWZhdWx0LnJiCkBAIC0wLDAgKzEgQEAKKyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWtpYmFuYS9yZWNpcGVzL3NldHVwX2tpYmFuYS5yYiBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMta2liYW5hL3JlY2lwZXMvc2V0dXBfa2liYW5hLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWQ1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWtpYmFuYS9yZWNpcGVzL3NldHVwX2tpYmFuYS5yYgpAQCAtMCwwICsxLDE5IEBACitkaXJlY3RvcnkgIi9vcHQva2liYW5hL2NvbmZpZyIgZG8KKyAgb3duZXIgImtpYmFuYSIKKyAgZ3JvdXAgImtpYmFuYSIKKyAgbW9kZSAnMDc3NScKKyAgYWN0aW9uIDpjcmVhdGUKK2VuZAorCit0ZW1wbGF0ZSAia2liYW5hLXltbCIgZG8KKyAgcGF0aCAiL29wdC9raWJhbmEvY29uZmlnL2tpYmFuYS55bWwiCisgIHNvdXJjZSAia2liYW5hLnltbC5lcmIiCisgIG93bmVyICJraWJhbmEiCisgIGdyb3VwICJraWJhbmEiCisgIG1vZGUgIjA3NTUiCisgIHZhcmlhYmxlcyAoeworICAgICA6Y2F0YWxvZ19ob3N0ID0+IG5vZGVbJ0JFX1ZJUCddICwKKyAgICAgOmNhdGFsb2dfcG9ydCA9PiBub2RlWydCRSddWzpodHRwX3BvcnRdCisgIH0pCitlbmQKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1raWJhbmEvdGVtcGxhdGVzL2RlZmF1bHQva2liYW5hLnltbC5lcmIgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLWtpYmFuYS90ZW1wbGF0ZXMvZGVmYXVsdC9raWJhbmEueW1sLmVyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc5YTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1raWJhbmEvdGVtcGxhdGVzL2RlZmF1bHQva2liYW5hLnltbC5lcmIKQEAgLTAsMCArMSw3NCBAQAorIyBLaWJhbmEgaXMgc2VydmVkIGJ5IGEgYmFjayBlbmQgc2VydmVyLiBUaGlzIGNvbnRyb2xzIHdoaWNoIHBvcnQgdG8gdXNlLgorIyBzZXJ2ZXIucG9ydDogNTYwMQorCisjIFRoZSBob3N0IHRvIGJpbmQgdGhlIHNlcnZlciB0by4KKyMgc2VydmVyLmhvc3Q6ICIwLjAuMC4wIgorCisjIElmIHlvdSBhcmUgcnVubmluZyBraWJhbmEgYmVoaW5kIGEgcHJveHksIGFuZCB3YW50IHRvIG1vdW50IGl0IGF0IGEgcGF0aCwKKyMgc3BlY2lmeSB0aGF0IHBhdGggaGVyZS4gVGhlIGJhc2VQYXRoIGNhbid0IGVuZCBpbiBhIHNsYXNoLgorc2VydmVyLmJhc2VQYXRoOiAiL3NkYzEva2liYW5hUHJveHkiCisKKyMgVGhlIEVsYXN0aWNzZWFyY2ggaW5zdGFuY2UgdG8gdXNlIGZvciBhbGwgeW91ciBxdWVyaWVzLgorIyBlbGFzdGljc2VhcmNoLnVybDogImh0dHA6Ly9sb2NhbGhvc3Q6OTIwMCIKK2VsYXN0aWNzZWFyY2gudXJsOiAiaHR0cDovLzwlPSBAY2F0YWxvZ19ob3N0ICU+OjwlPSBAY2F0YWxvZ19wb3J0ICU+L3NkYzIvZXNHYXRld2F5IgorCisjIHByZXNlcnZlX2VsYXN0aWNzZWFyY2hfaG9zdCB0cnVlIHdpbGwgc2VuZCB0aGUgaG9zdG5hbWUgc3BlY2lmaWVkIGluIGBlbGFzdGljc2VhcmNoYC4gSWYgeW91IHNldCBpdCB0byBmYWxzZSwKKyMgdGhlbiB0aGUgaG9zdCB5b3UgdXNlIHRvIGNvbm5lY3QgdG8gKnRoaXMqIEtpYmFuYSBpbnN0YW5jZSB3aWxsIGJlIHNlbnQuCisjIGVsYXN0aWNzZWFyY2gucHJlc2VydmVIb3N0OiB0cnVlCisKKyMgS2liYW5hIHVzZXMgYW4gaW5kZXggaW4gRWxhc3RpY3NlYXJjaCB0byBzdG9yZSBzYXZlZCBzZWFyY2hlcywgdmlzdWFsaXphdGlvbnMKKyMgYW5kIGRhc2hib2FyZHMuIEl0IHdpbGwgY3JlYXRlIGEgbmV3IGluZGV4IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KKyMga2liYW5hLmluZGV4OiAiLmtpYmFuYSIKKworIyBUaGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBsb2FkLgorIyBraWJhbmEuZGVmYXVsdEFwcElkOiAiZGlzY292ZXIiCisKKyMgSWYgeW91ciBFbGFzdGljc2VhcmNoIGlzIHByb3RlY3RlZCB3aXRoIGJhc2ljIGF1dGgsIHRoZXNlIGFyZSB0aGUgdXNlciBjcmVkZW50aWFscworIyB1c2VkIGJ5IHRoZSBLaWJhbmEgc2VydmVyIHRvIHBlcmZvcm0gbWFpbnRlbmFuY2Ugb24gdGhlIGtpYmFuYV9pbmRleCBhdCBzdGFydHVwLiBZb3VyIEtpYmFuYQorIyB1c2VycyB3aWxsIHN0aWxsIG5lZWQgdG8gYXV0aGVudGljYXRlIHdpdGggRWxhc3RpY3NlYXJjaCAod2hpY2ggaXMgcHJveGllZCB0aHJvdWdoIHRoZSBLaWJhbmEgc2VydmVyKQorIyBlbGFzdGljc2VhcmNoLnVzZXJuYW1lOiAia2liYW5hNC1zZXJ2ZXIiCisjIGVsYXN0aWNzZWFyY2gucGFzc3dvcmQ6ICJBYTEyMzQlXiEiCisKKyMgU1NMIGZvciBvdXRnb2luZyByZXF1ZXN0cyBmcm9tIHRoZSBLaWJhbmEgU2VydmVyIHRvIHRoZSBicm93c2VyIChQRU0gZm9ybWF0dGVkKQorIyBzZXJ2ZXIuc3NsLmNlcnQ6IC9wYXRoL3RvL3lvdXIvc2VydmVyLmNydAorIyBzZXJ2ZXIuc3NsLmtleTogL3BhdGgvdG8veW91ci9zZXJ2ZXIua2V5CisKKyMgT3B0aW9uYWwgc2V0dGluZyB0byB2YWxpZGF0ZSB0aGF0IHlvdXIgRWxhc3RpY3NlYXJjaCBiYWNrZW5kIHVzZXMgdGhlIHNhbWUga2V5IGZpbGVzIChQRU0gZm9ybWF0dGVkKQorIyBlbGFzdGljc2VhcmNoLnNzbC5jZXJ0OiAvcGF0aC90by95b3VyL2NsaWVudC5jcnQKKyMgZWxhc3RpY3NlYXJjaC5zc2wua2V5OiAvcGF0aC90by95b3VyL2NsaWVudC5rZXkKKworIyBJZiB5b3UgbmVlZCB0byBwcm92aWRlIGEgQ0EgY2VydGlmaWNhdGUgZm9yIHlvdXIgRWxhc3RpY3NlYXJjaCBpbnN0YW5jZSwgcHV0IHRoZSBwYXRoIG9mIHRoZSBwZW0gZmlsZSBoZXJlLgorIyBlbGFzdGljc2VhcmNoLnNzbC5jYTogL3Zhci9saWIvamV0dHkvYmFzZS9mZS9jb25maWcvY2FjZXJ0LnBlbQorCisjIFNldCB0byBmYWxzZSB0byBoYXZlIGEgY29tcGxldGUgZGlzcmVnYXJkIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIFNTTCBjZXJ0aWZpY2F0ZS4KKyMgZWxhc3RpY3NlYXJjaC5zc2wudmVyaWZ5OiB0cnVlCisKKyMgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgZWxhc3RpY3NlYXJjaCB0byByZXNwb25kIHRvIHBpbmdzLCBkZWZhdWx0cyB0byByZXF1ZXN0X3RpbWVvdXQgc2V0dGluZworIyBlbGFzdGljc2VhcmNoLnBpbmdUaW1lb3V0OiAxNTAwCisKKyMgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgcmVzcG9uc2VzIGZyb20gdGhlIGJhY2sgZW5kIG9yIGVsYXN0aWNzZWFyY2guCisjIFRoaXMgbXVzdCBiZSA+IDAKKyMgZWxhc3RpY3NlYXJjaC5yZXF1ZXN0VGltZW91dDogMzAwMDAwCisKKyMgVGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIEVsYXN0aWNzZWFyY2ggdG8gd2FpdCBmb3IgcmVzcG9uc2VzIGZyb20gc2hhcmRzLgorIyBTZXQgdG8gMCB0byBkaXNhYmxlLgorIyBlbGFzdGljc2VhcmNoLnNoYXJkVGltZW91dDogMAorCisjIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIEVsYXN0aWNzZWFyY2ggYXQgS2liYW5hIHN0YXJ0dXAgYmVmb3JlIHJldHJ5aW5nCisjIGVsYXN0aWNzZWFyY2guc3RhcnR1cFRpbWVvdXQ6IDUwMDAKKworIyBTZXQgdGhlIHBhdGggdG8gd2hlcmUgeW91IHdvdWxkIGxpa2UgdGhlIHByb2Nlc3MgaWQgZmlsZSB0byBiZSBjcmVhdGVkLgorIyBwaWQuZmlsZTogL3Zhci9ydW4va2liYW5hLnBpZAorCisjIElmIHlvdSB3b3VsZCBsaWtlIHRvIHNlbmQgdGhlIGxvZyBvdXRwdXQgdG8gYSBmaWxlIHlvdSBjYW4gc2V0IHRoZSBwYXRoIGJlbG93LgorIyBsb2dnaW5nLmRlc3Q6IHN0ZG91dAorCisjIFNldCB0aGlzIHRvIHRydWUgdG8gc3VwcHJlc3MgYWxsIGxvZ2dpbmcgb3V0cHV0LgorIyBsb2dnaW5nLnNpbGVudDogZmFsc2UKKworIyBTZXQgdGhpcyB0byB0cnVlIHRvIHN1cHByZXNzIGFsbCBsb2dnaW5nIG91dHB1dCBleGNlcHQgZm9yIGVycm9yIG1lc3NhZ2VzLgorIyBsb2dnaW5nLnF1aWV0OiBmYWxzZQorCisjIFNldCB0aGlzIHRvIHRydWUgdG8gbG9nIGFsbCBldmVudHMsIGluY2x1ZGluZyBzeXN0ZW0gdXNhZ2UgaW5mb3JtYXRpb24gYW5kIGFsbCByZXF1ZXN0cy4KKyMgbG9nZ2luZy52ZXJib3NlOiBmYWxzZQorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9MSUNFTlNFIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXNvbG8vTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA2OWVkCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXNvbG8vTElDRU5TRQpAQCAtMCwwICsxLDIwMSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKzEuIERlZmluaXRpb25zLgorCisgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKzMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCis0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCis1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKzYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKzcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCis4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKzkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0FQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiMGZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL1JFQURNRS5tZApAQCAtMCwwICsxLDM3IEBACitEZXByZWNhdGVkCis9PT09PT09PT09CisKK1VzZSBvZiB0aGlzIHJlcG9zaXRvcnkgaXMgZGVwcmVjYXRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY2hlZiBnZW5lcmF0ZSByZXBvYCBjb21tYW5kIHRoYXQgY29tZXMgd2l0aCBbQ2hlZkRLXShodHRwOi8vZG93bmxvYWRzLmNoZWYuaW8vY2hlZi1kay8pLgorCitPdmVydmlldworPT09PT09PT0KKworRXZlcnkgQ2hlZiBpbnN0YWxsYXRpb24gbmVlZHMgYSBDaGVmIFJlcG9zaXRvcnkuIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIGNvb2tib29rcywgcm9sZXMsIGNvbmZpZyBmaWxlcyBhbmQgb3RoZXIgYXJ0aWZhY3RzIGZvciBtYW5hZ2luZyBzeXN0ZW1zIHdpdGggQ2hlZiB3aWxsIGxpdmUuIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCBzdG9yaW5nIHRoaXMgcmVwb3NpdG9yeSBpbiBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gc3VjaCBhcyBHaXQgYW5kIHRyZWF0IGl0IGxpa2Ugc291cmNlIGNvZGUuCisKK1doaWxlIHdlIHByZWZlciBHaXQsIGFuZCBtYWtlIHRoaXMgcmVwb3NpdG9yeSBhdmFpbGFibGUgdmlhIEdpdEh1YiwgeW91IGFyZSB3ZWxjb21lIHRvIGRvd25sb2FkIGEgdGFyIG9yIHppcCBhcmNoaXZlIGFuZCB1c2UgeW91ciBmYXZvcml0ZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIHRvIG1hbmFnZSB0aGUgY29kZS4KKworUmVwb3NpdG9yeSBEaXJlY3RvcmllcworPT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHJlcG9zaXRvcnkgY29udGFpbnMgc2V2ZXJhbCBkaXJlY3RvcmllcywgYW5kIGVhY2ggZGlyZWN0b3J5IGNvbnRhaW5zIGEgUkVBRE1FIGZpbGUgdGhhdCBkZXNjcmliZXMgd2hhdCBpdCBpcyBmb3IgaW4gZ3JlYXRlciBkZXRhaWwsIGFuZCBob3cgdG8gdXNlIGl0IGZvciBtYW5hZ2luZyB5b3VyIHN5c3RlbXMgd2l0aCBDaGVmLgorCisqIGBjb29rYm9va3MvYCAtIENvb2tib29rcyB5b3UgZG93bmxvYWQgb3IgY3JlYXRlLgorKiBgZGF0YV9iYWdzL2AgLSBTdG9yZSBkYXRhIGJhZ3MgYW5kIGl0ZW1zIGluIC5qc29uIGluIHRoZSByZXBvc2l0b3J5LgorKiBgcm9sZXMvYCAtIFN0b3JlIHJvbGVzIGluIC5yYiBvciAuanNvbiBpbiB0aGUgcmVwb3NpdG9yeS4KKyogYGVudmlyb25tZW50cy9gIC0gU3RvcmUgZW52aXJvbm1lbnRzIGluIC5yYiBvciAuanNvbiBpbiB0aGUgcmVwb3NpdG9yeS4KKworQ29uZmlndXJhdGlvbgorPT09PT09PT09PT09PQorCitUaGUgcmVwb3NpdG9yeSBjb250YWlucyBhIGtuaWZlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworKiAuY2hlZi9rbmlmZS5yYgorCitUaGUga25pZmUgY29uZmlndXJhdGlvbiBmaWxlIGAuY2hlZi9rbmlmZS5yYmAgaXMgYSByZXBvc2l0b3J5IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3Iga25pZmUuIElmIHlvdSdyZSB1c2luZyBIb3N0ZWQgQ2hlZiwgeW91IGNhbiBkb3dubG9hZCBvbmUgZm9yIHlvdXIgb3JnYW5pemF0aW9uIGZyb20gdGhlIG1hbmFnZW1lbnQgY29uc29sZS4gSWYgeW91J3JlIHVzaW5nIHRoZSBPcGVuIFNvdXJjZSBDaGVmIFNlcnZlciwgeW91IGNhbiBnZW5lcmF0ZSBhIG5ldyBvbmUgd2l0aCBga25pZmUgY29uZmlndXJlYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJpbmcgS25pZmUsIHNlZSB0aGUgS25pZmUgZG9jdW1lbnRhdGlvbi4KKworaHR0cHM6Ly9kb2NzLmNoZWYuaW8va25pZmUuaHRtbAorCitOZXh0IFN0ZXBzCis9PT09PT09PT09CisKK1JlYWQgdGhlIFJFQURNRSBmaWxlIGluIGVhY2ggb2YgdGhlIHN1YmRpcmVjdG9yaWVzIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgZ29lcyBpbiB0aG9zZSBkaXJlY3Rvcmllcy4KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL2NoZWZpZ25vcmUgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9jaGVmaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzBhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9jaGVmaWdub3JlCkBAIC0wLDAgKzEsMTEgQEAKKyMgUHV0IGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhpcyBmaWxlLgorIyBMaW5lcyB0aGF0IHN0YXJ0IHdpdGggJyMgJyBhcmUgY29tbWVudHMuCisKKyMgZW1hY3MKKyp+CisKKyMgdmltCisqLnN3W2Etel0KKworIyBzdWJ2ZXJzaW9uCisqLy5zdm4vKgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXNvbG8vY29va2Jvb2tzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL2Nvb2tib29rcy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlYTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL2Nvb2tib29rcy9SRUFETUUubWQKQEAgLTAsMCArMSw1NCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGNvb2tib29rcyB1c2VkIHRvIGNvbmZpZ3VyZSBzeXN0ZW1zIGluIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBDaGVmLgorCitLbmlmZSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGtub3cgd2hlcmUgdGhlIGNvb2tib29rcyBhcmUgbG9jYXRlZCB3aXRoIHRoZSBgY29va2Jvb2tfcGF0aGAgc2V0dGluZy4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHNldmVyYWwgY29va2Jvb2sgb3BlcmF0aW9ucyB3aWxsIGZhaWwgdG8gd29yayBwcm9wZXJseS4KKworICAgIGNvb2tib29rX3BhdGggWyIuL2Nvb2tib29rcyJdCisKK1RoaXMgc2V0dGluZyB0ZWxscyBrbmlmZSB0byBsb29rIGZvciB0aGUgY29va2Jvb2tzIGRpcmVjdG9yeSBpbiB0aGUgcHJlc2VudCB3b3JraW5nIGRpcmVjdG9yeS4gVGhpcyBtZWFucyB0aGUga25pZmUgY29va2Jvb2sgc3ViY29tbWFuZHMgbmVlZCB0byBiZSBydW4gaW4gdGhlIGBjaGVmLXJlcG9gIGRpcmVjdG9yeSBpdHNlbGYuIFRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb29rYm9va3MgY2FuIGJlIGZvdW5kIGVsc2V3aGVyZSBpbnNpZGUgdGhlIHJlcG9zaXRvcnksIHVzZSBhbiBhYnNvbHV0ZSBwYXRoLiBUaGlzIGlzIGEgUnVieSBmaWxlLCBzbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGNhbiBiZSB1c2VkOgorCisgICAgY3VycmVudF9kaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pCisgICAgY29va2Jvb2tfcGF0aCBbIiN7Y3VycmVudF9kaXJ9Ly4uL2Nvb2tib29rcyJdCisKK1doaWNoIHdpbGwgc2V0IGBjdXJyZW50X2RpcmAgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBrbmlmZS5yYiBmaWxlIGl0c2VsZiAoZS5nLiBgfi9jaGVmLXJlcG8vLmNoZWYva25pZmUucmJgKS4KKworQ29uZmlndXJlIGtuaWZlIHRvIHVzZSB5b3VyIHByZWZlcnJlZCBjb3B5cmlnaHQgaG9sZGVyLCBlbWFpbCBjb250YWN0IGFuZCBsaWNlbnNlLiBBZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBgLmNoZWYva25pZmUucmJgLgorCisgICAgY29va2Jvb2tfY29weXJpZ2h0ICJFeGFtcGxlLCBDb20uIgorICAgIGNvb2tib29rX2VtYWlsICAgICAiY29va2Jvb2tzQGV4YW1wbGUuY29tIgorICAgIGNvb2tib29rX2xpY2Vuc2UgICAiYXBhY2hldjIiCisKK1N1cHBvcnRlZCB2YWx1ZXMgZm9yIGBjb29rYm9va19saWNlbnNlYCBhcmUgImFwYWNoZXYyIiwgIm1pdCIsImdwbHYyIiwiZ3BsdjMiLCAgb3IgIm5vbmUiLiBUaGVzZSBzZXR0aW5ncyBhcmUgdXNlZCB0byBwcmVmaWxsIGNvbW1lbnRzIGluIHRoZSBkZWZhdWx0IHJlY2lwZSwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgbWV0YWRhdGEucmIuIFlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgdGhlIHRoZSBjb21tZW50cyBpbiB0aG9zZSBmaWxlcy4KKworQ3JlYXRlIG5ldyBjb29rYm9va3MgaW4gdGhpcyBkaXJlY3Rvcnkgd2l0aCBLbmlmZS4KKworICAgIGtuaWZlIGNvb2tib29rIGNyZWF0ZSBDT09LQk9PSworCitUaGlzIHdpbGwgY3JlYXRlIGFsbCB0aGUgY29va2Jvb2sgZGlyZWN0b3J5IGNvbXBvbmVudHMuIFlvdSBkb24ndCBuZWVkIHRvIHVzZSB0aGVtIGFsbCwgYW5kIGNhbiBkZWxldGUgdGhlIG9uZXMgeW91IGRvbid0IG5lZWQuIEl0IGFsc28gY3JlYXRlcyBhIFJFQURNRSBmaWxlLCBtZXRhZGF0YS5yYiBhbmQgZGVmYXVsdCByZWNpcGUuCisKK1lvdSBjYW4gYWxzbyBkb3dubG9hZCBjb29rYm9va3MgZGlyZWN0bHkgZnJvbSB0aGUgT3BzY29kZSBDb29rYm9vayBTaXRlLiBUaGVyZSBhcmUgdHdvIHN1YmNvbW1hbmRzIHRvIGhlbHAgd2l0aCB0aGlzIGRlcGVuZGluZyBvbiB3aGF0IHlvdXIgcHJlZmVyZW5jZSBpcy4KKworVGhlIGZpcnN0IGFuZCByZWNvbW1lbmRlZCBtZXRob2QgaXMgdG8gdXNlIGEgdmVuZG9yIGJyYW5jaCBpZiB5b3UncmUgdXNpbmcgR2l0LiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aXRoIEtuaWZlLgorCisgICAga25pZmUgY29va2Jvb2sgc2l0ZSBpbnN0YWxsIENPT0tCT09LCisKK1RoaXMgd2lsbDoKKworKiBEb3dubG9hZCB0aGUgY29va2Jvb2sgdGFyYmFsbCBmcm9tIGNvb2tib29rcy5vcHNjb2RlLmNvbS4KKyogRW5zdXJlIGl0cyBvbiB0aGUgZ2l0IG1hc3RlciBicmFuY2guCisqIENoZWNrcyBmb3IgYW4gZXhpc3RpbmcgdmVuZG9yIGJyYW5jaCwgYW5kIGNyZWF0ZXMgaWYgaXQgZG9lc24ndC4KKyogQ2hlY2tzIG91dCB0aGUgdmVuZG9yIGJyYW5jaCAoY2hlZi12ZW5kb3ItQ09PS0JPT0spLgorKiBSZW1vdmVzIHRoZSBleGlzdGluZyAob2xkKSB2ZXJzaW9uLgorKiBVbnRhcnMgdGhlIGNvb2tib29rIHRhcmJhbGwgaXQgZG93bmxvYWRlZCBpbiB0aGUgZmlyc3Qgc3RlcC4KKyogQWRkcyB0aGUgY29va2Jvb2sgZmlsZXMgdG8gdGhlIGdpdCBpbmRleCBhbmQgY29tbWl0cy4KKyogQ3JlYXRlcyBhIHRhZyBmb3IgdGhlIHZlcnNpb24gZG93bmxvYWRlZC4KKyogQ2hlY2tzIG91dCB0aGUgbWFzdGVyIGJyYW5jaCBhZ2Fpbi4KKyogTWVyZ2VzIHRoZSBjb29rYm9vayBpbnRvIG1hc3Rlci4KKyogUmVwZWF0cyB0aGUgYWJvdmUgZm9yIGFsbCB0aGUgY29va2Jvb2tzIGRlcGVuZGVuY2llcywgZG93bmxvYWRpbmcgdGhlbSBmcm9tIHRoZSBjb21tdW5pdHkgc2l0ZQorCitUaGUgbGFzdCBzdGVwIHdpbGwgZW5zdXJlIHRoYXQgYW55IGxvY2FsIGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB5b3UgaGF2ZSBtYWRlIHRvIHRoZSBjb29rYm9vayBhcmUgcHJlc2VydmVkLCBzbyB5b3UgY2FuIGtlZXAgeW91ciBjaGFuZ2VzIHRocm91Z2ggdXBzdHJlYW0gdXBkYXRlcy4KKworSWYgeW91J3JlIG5vdCB1c2luZyBHaXQsIHVzZSB0aGUgc2l0ZSBkb3dubG9hZCBzdWJjb21tYW5kIHRvIGRvd25sb2FkIHRoZSB0YXJiYWxsLgorCisgICAga25pZmUgY29va2Jvb2sgc2l0ZSBkb3dubG9hZCBDT09LQk9PSworCitUaGlzIGNyZWF0ZXMgdGhlIENPT0tCT09LLnRhci5neiBmcm9tIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoZS5nLiwgYH4vY2hlZi1yZXBvYCkuIFdlIHJlY29tbWVuZCBmb2xsb3dpbmcgYSB3b3JrZmxvdyBzaW1pbGFyIHRvIHRoZSBhYm92ZSBmb3IgeW91ciB2ZXJzaW9uIGNvbnRyb2wgdG9vbC4KZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL2RhdGFfYmFncy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9kYXRhX2JhZ3MvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTVhMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9kYXRhX2JhZ3MvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjMgQEAKK0RhdGEgQmFncworLS0tLS0tLS0tCisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGRpcmVjdG9yaWVzIG9mIHRoZSB2YXJpb3VzIGRhdGEgYmFncyB5b3UgY3JlYXRlIGZvciB5b3VyIGluZnJhc3RydWN0dXJlLiBFYWNoIHN1YmRpcmVjdG9yeSBjb3JyZXNwb25kcyB0byBhIGRhdGEgYmFnIG9uIHRoZSBDaGVmIFNlcnZlciwgYW5kIGNvbnRhaW5zIEpTT04gZmlsZXMgb2YgdGhlIGl0ZW1zIHRoYXQgZ28gaW4gdGhlIGJhZy4KKworRmlyc3QsIGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgdGhlIGRhdGEgYmFnLgorCisgICAgbWtkaXIgZGF0YV9iYWdzL0JBRworCitUaGVuIGNyZWF0ZSB0aGUgSlNPTiBmaWxlcyBmb3IgaXRlbXMgdGhhdCB3aWxsIGdvIGludG8gdGhhdCBiYWcuCisKKyAgICAkRURJVE9SIGRhdGFfYmFncy9CQUcvSVRFTS5qc29uCisKK1RoZSBKU09OIGZvciB0aGUgSVRFTSBtdXN0IGNvbnRhaW4gYSBrZXkgbmFtZWQgImlkIiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gIklURU0iLiBGb3IgZXhhbXBsZSwKKworICAgIHsKKyAgICAgICJpZCI6ICJmb28iCisgICAgfQorCitOZXh0LCBjcmVhdGUgdGhlIGRhdGEgYmFnIG9uIHRoZSBDaGVmIFNlcnZlci4KKworICAgIGtuaWZlIGRhdGEgYmFnIGNyZWF0ZSBCQUcKKworVGhlbiB1cGxvYWQgdGhlIGl0ZW1zIGluIHRoZSBkYXRhIGJhZydzIGRpcmVjdG9yeSB0byB0aGUgQ2hlZiBTZXJ2ZXIuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBmcm9tIGZpbGUgQkFHIElURU0uanNvbgorCisKK0VuY3J5cHRlZCBEYXRhIEJhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWRkZWQgaW4gQ2hlZiAwLjEwLCBlbmNyeXB0ZWQgZGF0YSBiYWdzIGFsbG93IHlvdSB0byBlbmNyeXB0IHRoZSBjb250ZW50cyBvZiB5b3VyIGRhdGEgYmFncy4gVGhlIGNvbnRlbnQgb2YgYXR0cmlidXRlcyB3aWxsIG5vIGxvbmdlciBiZSBzZWFyY2hhYmxlLiBUbyB1c2UgZW5jcnlwdGVkIGRhdGEgYmFncywgZmlyc3QgeW91IG11c3QgaGF2ZSBvciBjcmVhdGUgYSBzZWNyZXQga2V5LgorCisgICAgb3BlbnNzbCByYW5kIC1iYXNlNjQgNTEyID4gc2VjcmV0X2tleQorCitZb3UgbWF5IHVzZSB0aGlzIHNlY3JldF9rZXkgdG8gYWRkIGl0ZW1zIHRvIGEgZGF0YSBiYWcgZHVyaW5nIGEgY3JlYXRlLgorCisgICAga25pZmUgZGF0YSBiYWcgY3JlYXRlIC0tc2VjcmV0LWZpbGUgc2VjcmV0X2tleSBwYXNzd29yZHMgbXlzcWwKKworWW91IG1heSBhbHNvIHVzZSBpdCB3aGVuIGFkZGluZyBJVEVNcyBmcm9tIGZpbGVzLAorCisgICAga25pZmUgZGF0YSBiYWcgY3JlYXRlIHBhc3N3b3JkcworICAgIGtuaWZlIGRhdGEgYmFnIGZyb20gZmlsZSBwYXNzd29yZHMgZGF0YV9iYWdzL3Bhc3N3b3Jkcy9teXNxbC5qc29uIC0tc2VjcmV0LWZpbGUgc2VjcmV0X2tleQorCitUaGUgSlNPTiBmb3IgdGhlIElURU0gbXVzdCBjb250YWluIGEga2V5IG5hbWVkICJpZCIgd2l0aCBhIHZhbHVlIGVxdWFsIHRvICJJVEVNIiBhbmQgdGhlIGNvbnRlbnRzIHdpbGwgYmUgZW5jcnlwdGVkIHdoZW4gdXBsb2FkZWQuIEZvciBleGFtcGxlLAorCisgICAgeworICAgICAgImlkIjogIm15c3FsIiwKKyAgICAgICJwYXNzd29yZCI6ICJhYmMxMjMiCisgICAgfQorCitXaXRob3V0IHRoZSBzZWNyZXRfa2V5LCB0aGUgY29udGVudHMgYXJlIGVuY3J5cHRlZC4KKworICAgIGtuaWZlIGRhdGEgYmFnIHNob3cgcGFzc3dvcmRzIG15c3FsCisgICAgaWQ6ICAgICAgICBteXNxbAorICAgIHBhc3N3b3JkOiAgMkkwWFVVdmUxVFhFb2pFeWVHc2podz09CisKK1VzZSB0aGUgc2VjcmV0X2tleSB0byB2aWV3IHRoZSBjb250ZW50cy4KKworICAgIGtuaWZlIGRhdGEgYmFnIHNob3cgcGFzc3dvcmRzIG15c3FsIC0tc2VjcmV0LWZpbGUgc2VjcmV0X2tleQorICAgIGlkOiAgICAgICAgbXlzcWwKKyAgICBwYXNzd29yZDogIGFiYzEyMworCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9lbnZpcm9ubWVudHMvUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXNvbG8vZW52aXJvbm1lbnRzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFjNDhkCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXNvbG8vZW52aXJvbm1lbnRzL1JFQURNRS5tZApAQCAtMCwwICsxLDUgQEAKK1JlcXVpcmVzIENoZWYgMC4xMC4wKy4KKworVGhpcyBkaXJlY3RvcnkgaXMgZm9yIFJ1YnkgRFNMIGFuZCBKU09OIGZpbGVzIGZvciBlbnZpcm9ubWVudHMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgQ2hlZiB3aWtpIHBhZ2U6CisKK2h0dHA6Ly9kb2NzLmNoZWYuaW8vZW52aXJvbm1lbnRzLmh0bWwKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL3JvbGVzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL3JvbGVzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGVlMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXNvbG8vcm9sZXMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTYgQEAKK0NyZWF0ZSByb2xlcyBoZXJlLCBpbiBlaXRoZXIgdGhlIFJvbGUgUnVieSBEU0wgKC5yYikgb3IgSlNPTiAoLmpzb24pIGZpbGVzLiBUbyBpbnN0YWxsIHJvbGVzIG9uIHRoZSBzZXJ2ZXIsIHVzZSBrbmlmZS4KKworRm9yIGV4YW1wbGUsIGNyZWF0ZSBgcm9sZXMvYmFzZV9leGFtcGxlLnJiYDoKKworICAgIG5hbWUgImJhc2VfZXhhbXBsZSIKKyAgICBkZXNjcmlwdGlvbiAiRXhhbXBsZSBiYXNlIHJvbGUgYXBwbGllZCB0byBhbGwgbm9kZXMuIgorICAgICMgTGlzdCBvZiByZWNpcGVzIGFuZCByb2xlcyB0byBhcHBseS4gUmVxdWlyZXMgQ2hlZiAwLjgsIGVhcmxpZXIgdmVyc2lvbnMgdXNlICdyZWNpcGVzKCknLgorICAgICNydW5fbGlzdCgpCisgICAgIyBBdHRyaWJ1dGVzIGFwcGxpZWQgaWYgdGhlIG5vZGUgZG9lc24ndCBoYXZlIGl0IHNldCBhbHJlYWR5LgorICAgICNkZWZhdWx0X2F0dHJpYnV0ZXMoKQorICAgICMgQXR0cmlidXRlcyBhcHBsaWVkIG5vIG1hdHRlciB3aGF0IHRoZSBub2RlIGhhcyBzZXQgYWxyZWFkeS4KKyAgICAjb3ZlcnJpZGVfYXR0cmlidXRlcygpCisKK1RoZW4gdXBsb2FkIGl0IHRvIHRoZSBDaGVmIFNlcnZlcjoKKyAgICAKKyAgICBrbmlmZSByb2xlIGZyb20gZmlsZSByb2xlcy9iYXNlX2V4YW1wbGUucmIKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL3NvbG8uanNvbiBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL3NvbG8uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM3ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9jaGVmLXNvbG8vc29sby5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAgICJydW5fbGlzdCI6IFsgInJlY2lwZVtzZGMta2liYW5hOjpzZXR1cF9raWJhbmFdIiBdCit9CisKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvY2hlZi1zb2xvL3NvbG8ucmIgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9zb2xvLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzFhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMta2liYW5hL2NoZWYtc29sby9zb2xvLnJiCkBAIC0wLDAgKzEsMTYgQEAKK3Jvb3QgPSBGaWxlLmFic29sdXRlX3BhdGgoRmlsZS5kaXJuYW1lKF9fRklMRV9fKSkKK2ZpbGVfY2FjaGVfcGF0aCByb290Citjb29rYm9va19wYXRoIHJvb3QgKyAnL2Nvb2tib29rcycKK2pzb25fYXR0cmlicyByb290ICsgJy9zb2xvLmpzb24nCitjaGVja3N1bV9wYXRoIHJvb3QgKyAnL2NoZWNrc3VtcycKK2RhdGFfYmFnX3BhdGggcm9vdCArICcvZGF0YV9iYWdzJworZW52aXJvbm1lbnRfcGF0aCByb290ICsgJy9lbnZpcm9ubWVudHMnCitmaWxlX2JhY2t1cF9wYXRoIHJvb3QgKyAnL2JhY2t1cCcKK2ZpbGVfY2FjaGVfcGF0aCByb290ICsgJy9jYWNoZScKK2xvZ19sZXZlbCA6aW5mbworbG9nX2xvY2F0aW9uIFNURE9VVAorcmVzdF90aW1lb3V0IDMwMAorcm9sZV9wYXRoIHJvb3QgKyAnL3JvbGVzJworc3ludGF4X2NoZWNrX2NhY2hlX3BhdGgKK3VtYXNrIDAwMjIKK3ZlcmJvc2VfbG9nZ2luZyBuaWwKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvc3RhcnR1cC5zaCBiL3NkYy1vcy1jaGVmL3NkYy1raWJhbmEvc3RhcnR1cC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZhYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLWtpYmFuYS9zdGFydHVwLnNoCkBAIC0wLDAgKzEsNyBAQAorIyEvYmluL3NoCisKK2V4cG9ydCBDSEVGTkFNRT0ke0VOVk5BTUV9CitjZCAvcm9vdC9jaGVmLXNvbG8KK2NoZWYtc29sbyAtYyBzb2xvLnJiIC1FICR7Q0hFRk5BTUV9CisKKy9kb2NrZXItZW50cnlwb2ludC5zaCBraWJhbmEKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvRG9ja2VyZmlsZSBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFlNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjAgQEAKK0ZST00gdWJ1bnR1CitSVU4gYXB0LWdldCAteSB1cGRhdGUgJiYgYXB0LWdldCAteSBpbnN0YWxsIC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGFwdC11dGlscworUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCBjdXJsCitSVU4gYXB0LWdldCAteSBpbnN0YWxsIHZpbQorUlVOIGFwdC1nZXQgLXkgaW5zdGFsbCBkZWZhdWx0LWpyZSAmJiBhcHQtZ2V0IC15IGluc3RhbGwgb3Blbmpkay04LWpkaworUlVOIHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1zZXQgamF2YSAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQvanJlL2Jpbi9qYXZhCisKKworQ09QWSBjaGVmLXNvbG8gL3Jvb3QvY2hlZi1zb2xvLworQ09QWSBjaGVmLXJlcG8vY29va2Jvb2tzLy4gL3Jvb3QvY2hlZi1zb2xvL2Nvb2tib29rcy8KKworCisjIGluc3RhbGwgY2hlZi1zb2xvCitSVU4gY3VybCAtTCBodHRwczovL3d3dy5vcHNjb2RlLmNvbS9jaGVmL2luc3RhbGwuc2ggfCBiYXNoCisKK0NPUFkgc3RhcnR1cC5zaCAvcm9vdC8KKworUlVOIGNobW9kIDc3MCAvcm9vdC9zdGFydHVwLnNoCisKK0VOVFJZUE9JTlQgWyAiL3Jvb3Qvc3RhcnR1cC5zaCIgXQpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1zYW5pdHkvYXR0cmlidXRlcy9kZWZhdWx0LnJiIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1zYW5pdHkvYXR0cmlidXRlcy9kZWZhdWx0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODdjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLXNhbml0eS9hdHRyaWJ1dGVzL2RlZmF1bHQucmIKQEAgLTAsMCArMSBAQAorIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtc2FuaXR5L3JlY2lwZXMvc2V0dXBfc2FuaXR5LnJiIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1zYW5pdHkvcmVjaXBlcy9zZXR1cF9zYW5pdHkucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwODQzZAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtc2FuaXR5L3JlY2lwZXMvc2V0dXBfc2FuaXR5LnJiCkBAIC0wLDAgKzEsNjggQEAKK3Rlc3RzX3BhdGggPSAiL3RtcC9zZGMtdGVzdHMvIgorY2lfdGVzdF9zdWl0ZSA9ICJzYW5pdHkueG1sIgorCisKK2Jhc2ggImV4dHJhY3QgYXNkYy10ZXN0cyIgZG8KKyAgIGNvZGUgPDwtRU9ICisgICAgICAgIFsgISAtZCAvdG1wL3NkYy10ZXN0cy8gXSAmJiBta2RpciAtcCAvdG1wL3NkYy10ZXN0cworICAgICAgICBjZCAvdG1wL3NkYy10ZXN0cworICAgICAgICBybSAtcmYgKgorICAgICAgICAvYmluL3RhciAteGYgL3Jvb3QvY2hlZi1zb2xvL2Nvb2tib29rcy9zZGMtc2FuaXR5L2ZpbGVzL2RlZmF1bHQvYXNkYy10ZXN0cy50YXIgLS1zdHJpcC1jb21wb25lbnRzPTEgLUMgL3RtcC9zZGMtdGVzdHMKKyAgICAgICAgY2htb2QgLVIgNzU1IC90bXAvc2RjLXRlc3RzCisgICBFT0gKK2VuZAorCisKK3RlbXBsYXRlICJzZGMteWFtbC1jb25maWciIGRvCisgICAgcGF0aCAiL3RtcC9zZGMtdGVzdHMvY29uZi9zZGMueWFtbCIKKyAgICBzb3VyY2UgInNkYy1zYW5pdHkueWFtbC5lcmIiCisgICAgb3duZXIgInJvb3QiCisgICAgZ3JvdXAgInJvb3QiCisgICAgbW9kZSAiMDc1NSIKKyAgICB2YXJpYWJsZXMgKHsKKyAgICAgICAgOnRhcmdldF9wYXRoICAgICAgICAgICAgICAgICAgPT4gIiN7dGVzdHNfcGF0aH0vdGFyZ2V0IiwKKyAgICAgICAgOmNhdGFsb2dCRV9pcCAgICAgICAgICAgICAgICAgPT4gbm9kZVsnTm9kZXMnXVsnQkUnXSwKKyAgICAgICAgOmNhdGFsb2dCRV9wb3J0ICAgICAgICAgICAgICAgPT4gbm9kZVsnQkUnXVs6aHR0cF9wb3J0XSwKKyAgICAgICAgOndlYnBvcnRhbF9pcCAgICAgICAgICAgICAgICAgPT4gbm9kZVsnTm9kZXMnXVsnRkUnXSwKKyAgICAgICAgOndlYnBvcnRhbF9wb3J0ICAgICAgICAgICAgICAgPT4gbm9kZVsnRkUnXVs6aHR0cF9wb3J0XSwKKyAgICAgICAgOnRpdGFuX2ZpbGUgICAgICAgICAgICAgICAgICAgPT4gIi90bXAvc2RjLXRlc3RzL2NvbmYvdGl0YW4ucHJvcGVydGllcyIsCisgICAgICAgIDp0ZXN0c19wYXRoX2NpICAgICAgICAgICAgICAgID0+ICIje3Rlc3RzX3BhdGh9L0NJL3Rlc3RzIiwKKyAgICAgICAgOmNvbXBvbmVudHNfcGF0aCAgICAgICAgICAgICAgPT4gIiN7dGVzdHNfcGF0aH0vQ0kvY29tcG9uZW50cyIsCisgICAgICAgIDppbXBvcnRSZXNvdXJjZUNvbmZpZ0RpciAgICAgID0+ICIje3Rlc3RzX3BhdGh9L0NJL2ltcG9ydFJlc291cmNlIiwKKyAgICAgICAgOmltcG9ydFR5cGVzRGlyICAgICAgICAgICAgICAgPT4gIiN7dGVzdHNfcGF0aH0vQ0kvaW1wb3J0VHlwZXNUZXN0IiwKKyAgICAgICAgOmltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXIgPT4gIiN7dGVzdHNfcGF0aH0vQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cyIsCisgICAgICAgIDpDb25maWd1cmF0aW9uRmlsZSAgICAgICAgICAgID0+ICIje3Rlc3RzX3BhdGh9L2NvbmYvY29uZmlndXJhdGlvbi55YW1sIiwKKyAgICAgICAgOmVycm9yQ29uZmlndXJhdGlvbkZpbGUgICAgICAgPT4gIiN7dGVzdHNfcGF0aH0vY29uZi9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwiLAorICAgICAgICA6Q0FTU0FORFJBX0lQICAgICAgICAgICAgICAgICA9PiBub2RlWydOb2RlcyddWydDUyddLAorICAgICAgICA6Q0FTU0FORFJBX1BXRCAgICAgICAgICAgICAgICA9PiBub2RlWydjYXNzYW5kcmEnXVs6Y2Fzc2FuZHJhX3Bhc3N3b3JkXSwKKyAgICAgICAgOkNBU1NBTkRSQV9VU1IgICAgICAgICAgICAgICAgPT4gbm9kZVsnY2Fzc2FuZHJhJ11bOmNhc3NhbmRyYV91c2VyXQorICAgIH0pCitlbmQKKworCityZXBsaWNhdGlvbl9mYWN0b3I9MQordGVtcGxhdGUgInRpdGFuLnByb3BlcnRpZXMiIGRvCisgICAgcGF0aCAiL3RtcC9zZGMtdGVzdHMvY29uZi90aXRhbi5wcm9wZXJ0aWVzIgorICAgIHNvdXJjZSAiQkUtdGl0YW4ucHJvcGVydGllcy5lcmIiCisgICAgb3duZXIgInJvb3QiCisgICAgZ3JvdXAgInJvb3QiCisgICAgbW9kZSAiMDc1NSIKKyAgICB2YXJpYWJsZXMoeworICAgICAgICA6Q0FTU0FORFJBX0lQID0+IG5vZGVbJ05vZGVzJ11bJ0NTJ10sCisgICAgICAgIDpDQVNTQU5EUkFfUFdEID0+IG5vZGVbJ2Nhc3NhbmRyYSddWzpjYXNzYW5kcmFfcGFzc3dvcmRdLAorICAgICAgICA6Q0FTU0FORFJBX1VTUiA9PiBub2RlWydjYXNzYW5kcmEnXVs6Y2Fzc2FuZHJhX3VzZXJdLAorICAgICAgICA6RENfTkFNRSA9PiAiREMtIitub2RlLmNoZWZfZW52aXJvbm1lbnQsCisJICAgIDpyZXBfZmFjdG9yID0+IHJlcGxpY2F0aW9uX2ZhY3RvcgkgCisgICAgfSkKK2VuZAorCisKK2Jhc2ggInJ1biBhc2RjIGNpIHNhbml0eSB0ZXN0cyIgZG8KKyAgICBjd2QgIiN7dGVzdHNfcGF0aH0iCisgICAgY29kZSA8PC1FT0gKKyAgICAgICAgamFyX2ZpbGU9YGxzIGFzZGMtdGVzdHMtKi1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyYAorICAgICAgICAuL3N0YXJ0VGVzdC5zaCAkamFyX2ZpbGUgI3tjaV90ZXN0X3N1aXRlfQorICAgICAgICBlY2hvICJyZXR1cm4gY29kZSBmcm9tIHN0YXJ0VGVzdC5zaCA9IFskP10iCisgICAgRU9ICisgICAgdGltZW91dCA3MjAwMAorZW5kCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLXNhbml0eS90ZW1wbGF0ZXMvZGVmYXVsdC9CRS10aXRhbi5wcm9wZXJ0aWVzLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtc2FuaXR5L3RlbXBsYXRlcy9kZWZhdWx0L0JFLXRpdGFuLnByb3BlcnRpZXMuZXJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Mzg2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtcmVwby9jb29rYm9va3Mvc2RjLXNhbml0eS90ZW1wbGF0ZXMvZGVmYXVsdC9CRS10aXRhbi5wcm9wZXJ0aWVzLmVyYgpAQCAtMCwwICsxLDI0IEBACitzdG9yYWdlLmJhY2tlbmQ9Y2Fzc2FuZHJhCitzdG9yYWdlLmhvc3RuYW1lPTwlPSBAQ0FTU0FORFJBX0lQICU+CitzdG9yYWdlLnBvcnQ9OTE2MAorc3RvcmFnZS51c2VybmFtZT08JT0gQENBU1NBTkRSQV9VU1IgJT4KK3N0b3JhZ2UucGFzc3dvcmQ9PCU9IEBDQVNTQU5EUkFfUFdEICU+CitzdG9yYWdlLmNvbm5lY3Rpb24tdGltZW91dD0xMDAwMAorCitzdG9yYWdlLmNhc3NhbmRyYS5zc2wuZW5hYmxlZD1mYWxzZQorc3RvcmFnZS5jYXNzYW5kcmEuc3NsLnRydXN0c3RvcmUubG9jYXRpb249L3Zhci9saWIvamV0dHkvY29uZmlnLy50cnVzdHN0b3JlCitzdG9yYWdlLmNhc3NhbmRyYS5zc2wudHJ1c3RzdG9yZS5wYXNzd29yZD1BYTEyMzQ1NgorCitjYWNoZS5kYi1jYWNoZSA9IGZhbHNlCitjYWNoZS5kYi1jYWNoZS1jbGVhbi13YWl0ID0gMjAKK2NhY2hlLmRiLWNhY2hlLXRpbWUgPSAxODAwMDAKK2NhY2hlLmRiLWNhY2hlLXNpemUgPSAwLjUKKworc3RvcmFnZS5jYXNzYW5kcmEucmVhZC1jb25zaXN0ZW5jeS1sZXZlbD1MT0NBTF9RVU9SVU0KK3N0b3JhZ2UuY2Fzc2FuZHJhLndyaXRlLWNvbnNpc3RlbmN5LWxldmVsPUxPQ0FMX1FVT1JVTQorc3RvcmFnZS5jYXNzYW5kcmEucmVwbGljYXRpb24tc3RyYXRlZ3ktY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5OZXR3b3JrVG9wb2xvZ3lTdHJhdGVneQorc3RvcmFnZS5jYXNzYW5kcmEucmVwbGljYXRpb24tc3RyYXRlZ3ktb3B0aW9ucz08JT0gQERDX05BTUUgJT4sPCU9IEByZXBfZmFjdG9yICU+CitzdG9yYWdlLmNhc3NhbmRyYS5hc3R5YW5heC5sb2NhbC1kYXRhY2VudGVyPTwlPSBARENfTkFNRSAlPgorCitzdG9yYWdlLmxvY2sucmV0cmllcz01CitzdG9yYWdlLmxvY2sud2FpdC10aW1lPTUwMApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXJlcG8vY29va2Jvb2tzL3NkYy1zYW5pdHkvdGVtcGxhdGVzL2RlZmF1bHQvc2RjLXNhbml0eS55YW1sLmVyYiBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtc2FuaXR5L3RlbXBsYXRlcy9kZWZhdWx0L3NkYy1zYW5pdHkueWFtbC5lcmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjMDlkYgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1yZXBvL2Nvb2tib29rcy9zZGMtc2FuaXR5L3RlbXBsYXRlcy9kZWZhdWx0L3NkYy1zYW5pdHkueWFtbC5lcmIKQEAgLTAsMCArMSw4MiBAQAorb3V0cHV0Rm9sZGVyOiA8JT0gQHRhcmdldF9wYXRoICU+CityZXBvcnROYW1lOiBpbmRleC5odG1sCitlc0hvc3Q6ICAgICAgICAgZXNob3N0CitkaXNyaWJ1dGlvbkNsaWVudEhvc3Q6IGRpc0NsaWVudAorY2F0YWxvZ0ZlSG9zdDogIDwlPSBAd2VicG9ydGFsX2lwICU+CitjYXRhbG9nRmVQb3J0OiAgPCU9IEB3ZWJwb3J0YWxfcG9ydCAlPgorY2F0YWxvZ0JlSG9zdDogIDwlPSBAY2F0YWxvZ0JFX2lwICU+CitjYXRhbG9nQmVQb3J0OiAgPCU9IEBjYXRhbG9nQkVfcG9ydCAlPgorZGlzcmlidXRpb25DbGllbnRQb3J0OiA4MTgxCitlc1BvcnQ6IDkyMDAKKworCityZXNvdXJjZUNvbmZpZ0RpcjogPCU9IEB0ZXN0c19wYXRoX2NpICU+Citjb21wb25lbnRzQ29uZmlnRGlyOiA8JT0gQGNvbXBvbmVudHNfcGF0aCAlPgoraW1wb3J0UmVzb3VyY2VDb25maWdEaXI6IDwlPSBAaW1wb3J0UmVzb3VyY2VDb25maWdEaXIgJT4KK2ltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXI6IDwlPSBAaW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0RpciAlPgorZXJyb3JDb25maWd1cmF0aW9uRmlsZTogPCU9IEBlcnJvckNvbmZpZ3VyYXRpb25GaWxlICU+Citjb25maWd1cmF0aW9uRmlsZTogPCU9IEBDb25maWd1cmF0aW9uRmlsZSAlPgoraW1wb3J0VHlwZXNDb25maWdEaXI6IDwlPSBAaW1wb3J0VHlwZXNEaXIgJT4KK3RpdGFuUHJvcGVydGllc0ZpbGU6IDwlPSBAdGl0YW5fZmlsZSAlPgorCitjYXNzYW5kcmFIb3N0OiA8JT0gQENBU1NBTkRSQV9JUCAlPgorY2Fzc2FuZHJhQXV0aGVudGljYXRlOiB0cnVlCitjYXNzYW5kcmFVc2VybmFtZTogPCU9IEBDQVNTQU5EUkFfVVNSICU+CitjYXNzYW5kcmFQYXNzd29yZDogPCU9IEBDQVNTQU5EUkFfUFdEICU+CitjYXNzYW5kcmFTc2w6IGZhbHNlCitjYXNzYW5kcmFUcnVzdHN0b3JlUGF0aCA6IC90bXAvLnRydXN0c3RvcmUKK2Nhc3NhbmRyYVRydXN0c3RvcmVQYXNzd29yZCA6IEFhMTIzNDU2CitjYXNzYW5kcmFBdWRpdEtleVNwYWNlOiBzZGNBdWRpdAorY2Fzc2FuZHJhQXJ0aWZhY3RLZXlTcGFjZTogc2RjQXJ0aWZhY3QKKworc3RvcE9uQ2xhc3NGYWlsdXJlOiBmYWxzZQorCisjTGlzdCBvZiBub24tYWJzdHJhY3QgcmVzb3VyY2VzIHRvIGtlZXAgZHVyaW5nIHRpdGFuIGNsZWFudXAgYmV0d2VlbiB0ZXN0cworI09ubHkgMS4wIHZlcnNpb24gd2lsbCBiZSBrZXB0CityZXNvdXJjZXNOb3RUb0RlbGV0ZToKKyAgICAgLSBDb21wdXRlCisgICAgIC0gRGF0YWJhc2UKKyAgICAgLSBPYmplY3RTdG9yYWdlCisgICAgIC0gQmxvY2tTdG9yYWdlCisgICAgIC0gTG9hZEJhbGFuY2VyCisgICAgIC0gUG9ydAorICAgICAtIE5ldHdvcmsKKyAgICAgLSBSb290CisgICAgIC0gQ29udGFpbmVyQXBwbGljYXRpb24KKyAgICAgLSBDb250YWluZXJSdW50aW1lCisgICAgIC0gREJNUworICAgICAtIFNvZnR3YXJlQ29tcG9uZW50CisgICAgIC0gV2ViQXBwbGljYXRpb24KKyAgICAgLSBXZWJTZXJ2ZXIKKyAgICAgLSBDaW5kZXJWb2x1bWUKKyAgICAgLSBDb250cmFpbFZpcnR1YWxOZXR3b3JrCisgICAgIC0gTmV1dHJvbk5ldAorICAgICAtIE5ldXRyb25Qb3J0CisgICAgIC0gTm92YVNlcnZlcgorICAgICAtIEFic3RyYWN0U3Vic3RpdHV0ZQorICAgICAtIENvbnRyYWlsQWJzdHJhY3RTdWJzdGl0dXRlCisgICAgIC0gQ29udHJhaWxDb21wdXRlCisgICAgIC0gQ29udHJhaWxOZXR3b3JrUnVsZXMKKyAgICAgLSBDb250cmFpbFBvcnQKKyAgICAgLSBDb250cmFpbFYyTmV0d29ya1J1bGVzCisgICAgIC0gQ29udHJhaWxWMlZpcnR1YWxNYWNoaW5lSW50ZXJmYWNlCisgICAgIC0gQ29udHJhaWxWMlZpcnR1YWxOZXR3b3JrCisgICAgIC0gQ29udHJhaWxWaXJ0dWFsTmV0d29yaworICAgICAtIFZMIEVMSU5FCisgICAgIC0gU2VjdXJpdHlSdWxlcworICAgICAtIFZMCisjUmVzb3VyY2UgY2F0ZWdvcmllcyB0byBrZWVwIChpbmNsdWRpbmcgYWxsIHRoZWlyIHN1YmNhdGVnb3JpZXMpCityZXNvdXJjZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZToKKyAgICAgLSBHZW5lcmljCisgICAgIC0gTmV0d29yayBMMi0zCisgICAgIC0gTmV0d29yayBMNCsKKyAgICAgLSBBcHBsaWNhdGlvbiBMNCsKKyAgICAgLSBOZXR3b3JrIENvbm5lY3Rpdml0eQorICAgICAtIERjYWVDb21wb25lbnQKKworI1NlcnZpY2UgY2F0ZWdvcmllcyB0byBrZWVwCitzZXJ2aWNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlOgorICAgICAtIE1vYmlsaXR5CisgICAgIC0gTmV0d29yayBMMS0zCisgICAgIC0gTmV0d29yayBMNCsKKyAgICAgLSBWb0lQIENhbGwgQ29udHJvbApkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vTElDRU5TRSBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1zb2xvL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNjllZAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1zb2xvL0xJQ0VOU0UKQEAgLTAsMCArMSwyMDEgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKK1RFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisxLiBEZWZpbml0aW9ucy4KKworICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKzIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCiszLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCis2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCis3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCis5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKK0VORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCitBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKK0NvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjBmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9SRUFETUUubWQKQEAgLTAsMCArMSwzNyBAQAorRGVwcmVjYXRlZAorPT09PT09PT09PQorCitVc2Ugb2YgdGhpcyByZXBvc2l0b3J5IGlzIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgYGNoZWYgZ2VuZXJhdGUgcmVwb2AgY29tbWFuZCB0aGF0IGNvbWVzIHdpdGggW0NoZWZES10oaHR0cDovL2Rvd25sb2Fkcy5jaGVmLmlvL2NoZWYtZGsvKS4KKworT3ZlcnZpZXcKKz09PT09PT09CisKK0V2ZXJ5IENoZWYgaW5zdGFsbGF0aW9uIG5lZWRzIGEgQ2hlZiBSZXBvc2l0b3J5LiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSBjb29rYm9va3MsIHJvbGVzLCBjb25maWcgZmlsZXMgYW5kIG90aGVyIGFydGlmYWN0cyBmb3IgbWFuYWdpbmcgc3lzdGVtcyB3aXRoIENoZWYgd2lsbCBsaXZlLiBXZSBzdHJvbmdseSByZWNvbW1lbmQgc3RvcmluZyB0aGlzIHJlcG9zaXRvcnkgaW4gYSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIHN1Y2ggYXMgR2l0IGFuZCB0cmVhdCBpdCBsaWtlIHNvdXJjZSBjb2RlLgorCitXaGlsZSB3ZSBwcmVmZXIgR2l0LCBhbmQgbWFrZSB0aGlzIHJlcG9zaXRvcnkgYXZhaWxhYmxlIHZpYSBHaXRIdWIsIHlvdSBhcmUgd2VsY29tZSB0byBkb3dubG9hZCBhIHRhciBvciB6aXAgYXJjaGl2ZSBhbmQgdXNlIHlvdXIgZmF2b3JpdGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSB0byBtYW5hZ2UgdGhlIGNvZGUuCisKK1JlcG9zaXRvcnkgRGlyZWN0b3JpZXMKKz09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyByZXBvc2l0b3J5IGNvbnRhaW5zIHNldmVyYWwgZGlyZWN0b3JpZXMsIGFuZCBlYWNoIGRpcmVjdG9yeSBjb250YWlucyBhIFJFQURNRSBmaWxlIHRoYXQgZGVzY3JpYmVzIHdoYXQgaXQgaXMgZm9yIGluIGdyZWF0ZXIgZGV0YWlsLCBhbmQgaG93IHRvIHVzZSBpdCBmb3IgbWFuYWdpbmcgeW91ciBzeXN0ZW1zIHdpdGggQ2hlZi4KKworKiBgY29va2Jvb2tzL2AgLSBDb29rYm9va3MgeW91IGRvd25sb2FkIG9yIGNyZWF0ZS4KKyogYGRhdGFfYmFncy9gIC0gU3RvcmUgZGF0YSBiYWdzIGFuZCBpdGVtcyBpbiAuanNvbiBpbiB0aGUgcmVwb3NpdG9yeS4KKyogYHJvbGVzL2AgLSBTdG9yZSByb2xlcyBpbiAucmIgb3IgLmpzb24gaW4gdGhlIHJlcG9zaXRvcnkuCisqIGBlbnZpcm9ubWVudHMvYCAtIFN0b3JlIGVudmlyb25tZW50cyBpbiAucmIgb3IgLmpzb24gaW4gdGhlIHJlcG9zaXRvcnkuCisKK0NvbmZpZ3VyYXRpb24KKz09PT09PT09PT09PT0KKworVGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBrbmlmZSBjb25maWd1cmF0aW9uIGZpbGUuCisKKyogLmNoZWYva25pZmUucmIKKworVGhlIGtuaWZlIGNvbmZpZ3VyYXRpb24gZmlsZSBgLmNoZWYva25pZmUucmJgIGlzIGEgcmVwb3NpdG9yeSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGtuaWZlLiBJZiB5b3UncmUgdXNpbmcgSG9zdGVkIENoZWYsIHlvdSBjYW4gZG93bmxvYWQgb25lIGZvciB5b3VyIG9yZ2FuaXphdGlvbiBmcm9tIHRoZSBtYW5hZ2VtZW50IGNvbnNvbGUuIElmIHlvdSdyZSB1c2luZyB0aGUgT3BlbiBTb3VyY2UgQ2hlZiBTZXJ2ZXIsIHlvdSBjYW4gZ2VuZXJhdGUgYSBuZXcgb25lIHdpdGggYGtuaWZlIGNvbmZpZ3VyZWAuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmZpZ3VyaW5nIEtuaWZlLCBzZWUgdGhlIEtuaWZlIGRvY3VtZW50YXRpb24uCisKK2h0dHBzOi8vZG9jcy5jaGVmLmlvL2tuaWZlLmh0bWwKKworTmV4dCBTdGVwcworPT09PT09PT09PQorCitSZWFkIHRoZSBSRUFETUUgZmlsZSBpbiBlYWNoIG9mIHRoZSBzdWJkaXJlY3RvcmllcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGdvZXMgaW4gdGhvc2UgZGlyZWN0b3JpZXMuCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9jaGVmaWdub3JlIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vY2hlZmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTMwYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vY2hlZmlnbm9yZQpAQCAtMCwwICsxLDExIEBACisjIFB1dCBmaWxlcy9kaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoaXMgZmlsZS4KKyMgTGluZXMgdGhhdCBzdGFydCB3aXRoICcjICcgYXJlIGNvbW1lbnRzLgorCisjIGVtYWNzCisqfgorCisjIHZpbQorKi5zd1thLXpdCisKKyMgc3VidmVyc2lvbgorKi8uc3ZuLyoKZGlmZiAtLWdpdCBhL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1zb2xvL2Nvb2tib29rcy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9jb29rYm9va3MvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWE0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9jb29rYm9va3MvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTQgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBjb29rYm9va3MgdXNlZCB0byBjb25maWd1cmUgc3lzdGVtcyBpbiB5b3VyIGluZnJhc3RydWN0dXJlIHdpdGggQ2hlZi4KKworS25pZmUgbmVlZHMgdG8gYmUgY29uZmlndXJlZCB0byBrbm93IHdoZXJlIHRoZSBjb29rYm9va3MgYXJlIGxvY2F0ZWQgd2l0aCB0aGUgYGNvb2tib29rX3BhdGhgIHNldHRpbmcuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiBzZXZlcmFsIGNvb2tib29rIG9wZXJhdGlvbnMgd2lsbCBmYWlsIHRvIHdvcmsgcHJvcGVybHkuCisKKyAgICBjb29rYm9va19wYXRoIFsiLi9jb29rYm9va3MiXQorCitUaGlzIHNldHRpbmcgdGVsbHMga25pZmUgdG8gbG9vayBmb3IgdGhlIGNvb2tib29rcyBkaXJlY3RvcnkgaW4gdGhlIHByZXNlbnQgd29ya2luZyBkaXJlY3RvcnkuIFRoaXMgbWVhbnMgdGhlIGtuaWZlIGNvb2tib29rIHN1YmNvbW1hbmRzIG5lZWQgdG8gYmUgcnVuIGluIHRoZSBgY2hlZi1yZXBvYCBkaXJlY3RvcnkgaXRzZWxmLiBUbyBtYWtlIHN1cmUgdGhhdCB0aGUgY29va2Jvb2tzIGNhbiBiZSBmb3VuZCBlbHNld2hlcmUgaW5zaWRlIHRoZSByZXBvc2l0b3J5LCB1c2UgYW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBpcyBhIFJ1YnkgZmlsZSwgc28gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBjYW4gYmUgdXNlZDoKKworICAgIGN1cnJlbnRfZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKQorICAgIGNvb2tib29rX3BhdGggWyIje2N1cnJlbnRfZGlyfS8uLi9jb29rYm9va3MiXQorCitXaGljaCB3aWxsIHNldCBgY3VycmVudF9kaXJgIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUga25pZmUucmIgZmlsZSBpdHNlbGYgKGUuZy4gYH4vY2hlZi1yZXBvLy5jaGVmL2tuaWZlLnJiYCkuCisKK0NvbmZpZ3VyZSBrbmlmZSB0byB1c2UgeW91ciBwcmVmZXJyZWQgY29weXJpZ2h0IGhvbGRlciwgZW1haWwgY29udGFjdCBhbmQgbGljZW5zZS4gQWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gYC5jaGVmL2tuaWZlLnJiYC4KKworICAgIGNvb2tib29rX2NvcHlyaWdodCAiRXhhbXBsZSwgQ29tLiIKKyAgICBjb29rYm9va19lbWFpbCAgICAgImNvb2tib29rc0BleGFtcGxlLmNvbSIKKyAgICBjb29rYm9va19saWNlbnNlICAgImFwYWNoZXYyIgorCitTdXBwb3J0ZWQgdmFsdWVzIGZvciBgY29va2Jvb2tfbGljZW5zZWAgYXJlICJhcGFjaGV2MiIsICJtaXQiLCJncGx2MiIsImdwbHYzIiwgIG9yICJub25lIi4gVGhlc2Ugc2V0dGluZ3MgYXJlIHVzZWQgdG8gcHJlZmlsbCBjb21tZW50cyBpbiB0aGUgZGVmYXVsdCByZWNpcGUsIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhlIG1ldGFkYXRhLnJiLiBZb3UgYXJlIGZyZWUgdG8gY2hhbmdlIHRoZSB0aGUgY29tbWVudHMgaW4gdGhvc2UgZmlsZXMuCisKK0NyZWF0ZSBuZXcgY29va2Jvb2tzIGluIHRoaXMgZGlyZWN0b3J5IHdpdGggS25pZmUuCisKKyAgICBrbmlmZSBjb29rYm9vayBjcmVhdGUgQ09PS0JPT0sKKworVGhpcyB3aWxsIGNyZWF0ZSBhbGwgdGhlIGNvb2tib29rIGRpcmVjdG9yeSBjb21wb25lbnRzLiBZb3UgZG9uJ3QgbmVlZCB0byB1c2UgdGhlbSBhbGwsIGFuZCBjYW4gZGVsZXRlIHRoZSBvbmVzIHlvdSBkb24ndCBuZWVkLiBJdCBhbHNvIGNyZWF0ZXMgYSBSRUFETUUgZmlsZSwgbWV0YWRhdGEucmIgYW5kIGRlZmF1bHQgcmVjaXBlLgorCitZb3UgY2FuIGFsc28gZG93bmxvYWQgY29va2Jvb2tzIGRpcmVjdGx5IGZyb20gdGhlIE9wc2NvZGUgQ29va2Jvb2sgU2l0ZS4gVGhlcmUgYXJlIHR3byBzdWJjb21tYW5kcyB0byBoZWxwIHdpdGggdGhpcyBkZXBlbmRpbmcgb24gd2hhdCB5b3VyIHByZWZlcmVuY2UgaXMuCisKK1RoZSBmaXJzdCBhbmQgcmVjb21tZW5kZWQgbWV0aG9kIGlzIHRvIHVzZSBhIHZlbmRvciBicmFuY2ggaWYgeW91J3JlIHVzaW5nIEdpdC4gVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgd2l0aCBLbmlmZS4KKworICAgIGtuaWZlIGNvb2tib29rIHNpdGUgaW5zdGFsbCBDT09LQk9PSworCitUaGlzIHdpbGw6CisKKyogRG93bmxvYWQgdGhlIGNvb2tib29rIHRhcmJhbGwgZnJvbSBjb29rYm9va3Mub3BzY29kZS5jb20uCisqIEVuc3VyZSBpdHMgb24gdGhlIGdpdCBtYXN0ZXIgYnJhbmNoLgorKiBDaGVja3MgZm9yIGFuIGV4aXN0aW5nIHZlbmRvciBicmFuY2gsIGFuZCBjcmVhdGVzIGlmIGl0IGRvZXNuJ3QuCisqIENoZWNrcyBvdXQgdGhlIHZlbmRvciBicmFuY2ggKGNoZWYtdmVuZG9yLUNPT0tCT09LKS4KKyogUmVtb3ZlcyB0aGUgZXhpc3RpbmcgKG9sZCkgdmVyc2lvbi4KKyogVW50YXJzIHRoZSBjb29rYm9vayB0YXJiYWxsIGl0IGRvd25sb2FkZWQgaW4gdGhlIGZpcnN0IHN0ZXAuCisqIEFkZHMgdGhlIGNvb2tib29rIGZpbGVzIHRvIHRoZSBnaXQgaW5kZXggYW5kIGNvbW1pdHMuCisqIENyZWF0ZXMgYSB0YWcgZm9yIHRoZSB2ZXJzaW9uIGRvd25sb2FkZWQuCisqIENoZWNrcyBvdXQgdGhlIG1hc3RlciBicmFuY2ggYWdhaW4uCisqIE1lcmdlcyB0aGUgY29va2Jvb2sgaW50byBtYXN0ZXIuCisqIFJlcGVhdHMgdGhlIGFib3ZlIGZvciBhbGwgdGhlIGNvb2tib29rcyBkZXBlbmRlbmNpZXMsIGRvd25sb2FkaW5nIHRoZW0gZnJvbSB0aGUgY29tbXVuaXR5IHNpdGUKKworVGhlIGxhc3Qgc3RlcCB3aWxsIGVuc3VyZSB0aGF0IGFueSBsb2NhbCBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgeW91IGhhdmUgbWFkZSB0byB0aGUgY29va2Jvb2sgYXJlIHByZXNlcnZlZCwgc28geW91IGNhbiBrZWVwIHlvdXIgY2hhbmdlcyB0aHJvdWdoIHVwc3RyZWFtIHVwZGF0ZXMuCisKK0lmIHlvdSdyZSBub3QgdXNpbmcgR2l0LCB1c2UgdGhlIHNpdGUgZG93bmxvYWQgc3ViY29tbWFuZCB0byBkb3dubG9hZCB0aGUgdGFyYmFsbC4KKworICAgIGtuaWZlIGNvb2tib29rIHNpdGUgZG93bmxvYWQgQ09PS0JPT0sKKworVGhpcyBjcmVhdGVzIHRoZSBDT09LQk9PSy50YXIuZ3ogZnJvbSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGUuZy4sIGB+L2NoZWYtcmVwb2ApLiBXZSByZWNvbW1lbmQgZm9sbG93aW5nIGEgd29ya2Zsb3cgc2ltaWxhciB0byB0aGUgYWJvdmUgZm9yIHlvdXIgdmVyc2lvbiBjb250cm9sIHRvb2wuCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9kYXRhX2JhZ3MvUkVBRE1FLm1kIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vZGF0YV9iYWdzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzE1YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vZGF0YV9iYWdzL1JFQURNRS5tZApAQCAtMCwwICsxLDYzIEBACitEYXRhIEJhZ3MKKy0tLS0tLS0tLQorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBkaXJlY3RvcmllcyBvZiB0aGUgdmFyaW91cyBkYXRhIGJhZ3MgeW91IGNyZWF0ZSBmb3IgeW91ciBpbmZyYXN0cnVjdHVyZS4gRWFjaCBzdWJkaXJlY3RvcnkgY29ycmVzcG9uZHMgdG8gYSBkYXRhIGJhZyBvbiB0aGUgQ2hlZiBTZXJ2ZXIsIGFuZCBjb250YWlucyBKU09OIGZpbGVzIG9mIHRoZSBpdGVtcyB0aGF0IGdvIGluIHRoZSBiYWcuCisKK0ZpcnN0LCBjcmVhdGUgYSBkaXJlY3RvcnkgZm9yIHRoZSBkYXRhIGJhZy4KKworICAgIG1rZGlyIGRhdGFfYmFncy9CQUcKKworVGhlbiBjcmVhdGUgdGhlIEpTT04gZmlsZXMgZm9yIGl0ZW1zIHRoYXQgd2lsbCBnbyBpbnRvIHRoYXQgYmFnLgorCisgICAgJEVESVRPUiBkYXRhX2JhZ3MvQkFHL0lURU0uanNvbgorCitUaGUgSlNPTiBmb3IgdGhlIElURU0gbXVzdCBjb250YWluIGEga2V5IG5hbWVkICJpZCIgd2l0aCBhIHZhbHVlIGVxdWFsIHRvICJJVEVNIi4gRm9yIGV4YW1wbGUsCisKKyAgICB7CisgICAgICAiaWQiOiAiZm9vIgorICAgIH0KKworTmV4dCwgY3JlYXRlIHRoZSBkYXRhIGJhZyBvbiB0aGUgQ2hlZiBTZXJ2ZXIuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBjcmVhdGUgQkFHCisKK1RoZW4gdXBsb2FkIHRoZSBpdGVtcyBpbiB0aGUgZGF0YSBiYWcncyBkaXJlY3RvcnkgdG8gdGhlIENoZWYgU2VydmVyLgorCisgICAga25pZmUgZGF0YSBiYWcgZnJvbSBmaWxlIEJBRyBJVEVNLmpzb24KKworCitFbmNyeXB0ZWQgRGF0YSBCYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FkZGVkIGluIENoZWYgMC4xMCwgZW5jcnlwdGVkIGRhdGEgYmFncyBhbGxvdyB5b3UgdG8gZW5jcnlwdCB0aGUgY29udGVudHMgb2YgeW91ciBkYXRhIGJhZ3MuIFRoZSBjb250ZW50IG9mIGF0dHJpYnV0ZXMgd2lsbCBubyBsb25nZXIgYmUgc2VhcmNoYWJsZS4gVG8gdXNlIGVuY3J5cHRlZCBkYXRhIGJhZ3MsIGZpcnN0IHlvdSBtdXN0IGhhdmUgb3IgY3JlYXRlIGEgc2VjcmV0IGtleS4KKworICAgIG9wZW5zc2wgcmFuZCAtYmFzZTY0IDUxMiA+IHNlY3JldF9rZXkKKworWW91IG1heSB1c2UgdGhpcyBzZWNyZXRfa2V5IHRvIGFkZCBpdGVtcyB0byBhIGRhdGEgYmFnIGR1cmluZyBhIGNyZWF0ZS4KKworICAgIGtuaWZlIGRhdGEgYmFnIGNyZWF0ZSAtLXNlY3JldC1maWxlIHNlY3JldF9rZXkgcGFzc3dvcmRzIG15c3FsCisKK1lvdSBtYXkgYWxzbyB1c2UgaXQgd2hlbiBhZGRpbmcgSVRFTXMgZnJvbSBmaWxlcywKKworICAgIGtuaWZlIGRhdGEgYmFnIGNyZWF0ZSBwYXNzd29yZHMKKyAgICBrbmlmZSBkYXRhIGJhZyBmcm9tIGZpbGUgcGFzc3dvcmRzIGRhdGFfYmFncy9wYXNzd29yZHMvbXlzcWwuanNvbiAtLXNlY3JldC1maWxlIHNlY3JldF9rZXkKKworVGhlIEpTT04gZm9yIHRoZSBJVEVNIG11c3QgY29udGFpbiBhIGtleSBuYW1lZCAiaWQiIHdpdGggYSB2YWx1ZSBlcXVhbCB0byAiSVRFTSIgYW5kIHRoZSBjb250ZW50cyB3aWxsIGJlIGVuY3J5cHRlZCB3aGVuIHVwbG9hZGVkLiBGb3IgZXhhbXBsZSwKKworICAgIHsKKyAgICAgICJpZCI6ICJteXNxbCIsCisgICAgICAicGFzc3dvcmQiOiAiYWJjMTIzIgorICAgIH0KKworV2l0aG91dCB0aGUgc2VjcmV0X2tleSwgdGhlIGNvbnRlbnRzIGFyZSBlbmNyeXB0ZWQuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBzaG93IHBhc3N3b3JkcyBteXNxbAorICAgIGlkOiAgICAgICAgbXlzcWwKKyAgICBwYXNzd29yZDogIDJJMFhVVXZlMVRYRW9qRXllR3NqaHc9PQorCitVc2UgdGhlIHNlY3JldF9rZXkgdG8gdmlldyB0aGUgY29udGVudHMuCisKKyAgICBrbmlmZSBkYXRhIGJhZyBzaG93IHBhc3N3b3JkcyBteXNxbCAtLXNlY3JldC1maWxlIHNlY3JldF9rZXkKKyAgICBpZDogICAgICAgIG15c3FsCisgICAgcGFzc3dvcmQ6ICBhYmMxMjMKKwpkaWZmIC0tZ2l0IGEvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vZW52aXJvbm1lbnRzL1JFQURNRS5tZCBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1zb2xvL2Vudmlyb25tZW50cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhYzQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1zb2xvL2Vudmlyb25tZW50cy9SRUFETUUubWQKQEAgLTAsMCArMSw1IEBACitSZXF1aXJlcyBDaGVmIDAuMTAuMCsuCisKK1RoaXMgZGlyZWN0b3J5IGlzIGZvciBSdWJ5IERTTCBhbmQgSlNPTiBmaWxlcyBmb3IgZW52aXJvbm1lbnRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIENoZWYgd2lraSBwYWdlOgorCitodHRwOi8vZG9jcy5jaGVmLmlvL2Vudmlyb25tZW50cy5odG1sCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQgYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9yb2xlcy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlZTBiNAotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1zb2xvL3JvbGVzL1JFQURNRS5tZApAQCAtMCwwICsxLDE2IEBACitDcmVhdGUgcm9sZXMgaGVyZSwgaW4gZWl0aGVyIHRoZSBSb2xlIFJ1YnkgRFNMICgucmIpIG9yIEpTT04gKC5qc29uKSBmaWxlcy4gVG8gaW5zdGFsbCByb2xlcyBvbiB0aGUgc2VydmVyLCB1c2Uga25pZmUuCisKK0ZvciBleGFtcGxlLCBjcmVhdGUgYHJvbGVzL2Jhc2VfZXhhbXBsZS5yYmA6CisKKyAgICBuYW1lICJiYXNlX2V4YW1wbGUiCisgICAgZGVzY3JpcHRpb24gIkV4YW1wbGUgYmFzZSByb2xlIGFwcGxpZWQgdG8gYWxsIG5vZGVzLiIKKyAgICAjIExpc3Qgb2YgcmVjaXBlcyBhbmQgcm9sZXMgdG8gYXBwbHkuIFJlcXVpcmVzIENoZWYgMC44LCBlYXJsaWVyIHZlcnNpb25zIHVzZSAncmVjaXBlcygpJy4KKyAgICAjcnVuX2xpc3QoKQorICAgICMgQXR0cmlidXRlcyBhcHBsaWVkIGlmIHRoZSBub2RlIGRvZXNuJ3QgaGF2ZSBpdCBzZXQgYWxyZWFkeS4KKyAgICAjZGVmYXVsdF9hdHRyaWJ1dGVzKCkKKyAgICAjIEF0dHJpYnV0ZXMgYXBwbGllZCBubyBtYXR0ZXIgd2hhdCB0aGUgbm9kZSBoYXMgc2V0IGFscmVhZHkuCisgICAgI292ZXJyaWRlX2F0dHJpYnV0ZXMoKQorCitUaGVuIHVwbG9hZCBpdCB0byB0aGUgQ2hlZiBTZXJ2ZXI6CisgICAgCisgICAga25pZmUgcm9sZSBmcm9tIGZpbGUgcm9sZXMvYmFzZV9leGFtcGxlLnJiCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9zb2xvLmpzb24gYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9zb2xvLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkMjI4MQotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvY2hlZi1zb2xvL3NvbG8uanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgICAicnVuX2xpc3QiOiBbICJyZWNpcGVbc2RjLXNhbml0eTo6c2V0dXBfc2FuaXR5XSIgXQorfQorCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L2NoZWYtc29sby9zb2xvLnJiIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vc29sby5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmMxYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2RjLW9zLWNoZWYvc2RjLXNhbml0eS9jaGVmLXNvbG8vc29sby5yYgpAQCAtMCwwICsxLDE2IEBACityb290ID0gRmlsZS5hYnNvbHV0ZV9wYXRoKEZpbGUuZGlybmFtZShfX0ZJTEVfXykpCitmaWxlX2NhY2hlX3BhdGggcm9vdAorY29va2Jvb2tfcGF0aCByb290ICsgJy9jb29rYm9va3MnCitqc29uX2F0dHJpYnMgcm9vdCArICcvc29sby5qc29uJworY2hlY2tzdW1fcGF0aCByb290ICsgJy9jaGVja3N1bXMnCitkYXRhX2JhZ19wYXRoIHJvb3QgKyAnL2RhdGFfYmFncycKK2Vudmlyb25tZW50X3BhdGggcm9vdCArICcvZW52aXJvbm1lbnRzJworZmlsZV9iYWNrdXBfcGF0aCByb290ICsgJy9iYWNrdXAnCitmaWxlX2NhY2hlX3BhdGggcm9vdCArICcvY2FjaGUnCitsb2dfbGV2ZWwgOmluZm8KK2xvZ19sb2NhdGlvbiBTVERPVVQKK3Jlc3RfdGltZW91dCAzMDAKK3JvbGVfcGF0aCByb290ICsgJy9yb2xlcycKK3N5bnRheF9jaGVja19jYWNoZV9wYXRoCit1bWFzayAwMDIyCit2ZXJib3NlX2xvZ2dpbmcgbmlsCmRpZmYgLS1naXQgYS9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L3N0YXJ0dXAuc2ggYi9zZGMtb3MtY2hlZi9zZGMtc2FuaXR5L3N0YXJ0dXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmYWFlNgotLS0gL2Rldi9udWxsCisrKyBiL3NkYy1vcy1jaGVmL3NkYy1zYW5pdHkvc3RhcnR1cC5zaApAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworZXhwb3J0IENIRUZOQU1FPSR7RU5WTkFNRX0KK2NkIC9yb290L2NoZWYtc29sbworY2hlZi1zb2xvIC1jIHNvbG8ucmIgLUUgJHtDSEVGTkFNRX0KKworcmM9JD8KKworaWYgW1sgJHJjICE9IDAgXV07IHRoZW4KKyAgIGVjaG8gIlNhbml0eSBmYWlsZWQgISEhIgorICAgZXhpdCAkcmMKK2Vsc2UKKyAgIGVjaG8gImNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgOi0pIgorICAgZXhpdCAwCitmaQorCisjL2RvY2tlci1lbnRyeXBvaW50LnNoIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHktdXRpbHMvLmdpdGlnbm9yZSBiL3NlY3VyaXR5LXV0aWxzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzYzE3MgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5LXV0aWxzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorL2Jpbi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5LXV0aWxzL3BvbS54bWwgYi9zZWN1cml0eS11dGlscy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmVlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS11dGlscy9wb20ueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJPGFydGlmYWN0SWQ+c2VjdXJpdHktdXRpbHM8L2FydGlmYWN0SWQ+CisKKwk8cGFyZW50PgorCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+c2RjLW1haW48L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgorCTwvcGFyZW50PgorCisJCisJPGRlcGVuZGVuY2llcz4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5LXV0aWxzL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvc2VjdXJpdHkvUGFzc3dvcmRzLmphdmEgYi9zZWN1cml0eS11dGlscy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3NlY3VyaXR5L1Bhc3N3b3Jkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDI0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS11dGlscy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3NlY3VyaXR5L1Bhc3N3b3Jkcy5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuc2VjdXJpdHk7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitwdWJsaWMgY2xhc3MgUGFzc3dvcmRzIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET00gPSBuZXcgU2VjdXJlUmFuZG9tKCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNBTFQgPSAwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIID0gMTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTSF9BTEdPUklUSE0gPSAiU0hBLTI1NiI7CisKKwkvKioKKwkgKiBzdGF0aWMgdXRpbGl0eSBjbGFzcworCSAqLworCXByaXZhdGUgUGFzc3dvcmRzKCkgeworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY2FsY3VsYXRlcyBhIGhhc2ggd2l0aCBhIGdlbmVyYXRlZCBzYWx0IGZvciB0aGUgZ2l2ZW4gcGFzc3dvcmQKKwkgKiAKKwkgKiBAcGFyYW0gcGFzc3dvcmQKKwkgKiBAcmV0dXJuIGEgInNhbHQ6aGFzaCIgdmFsdWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBoYXNoUGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7CisJCWJ5dGVbXSBzYWx0ID0gZ2V0TmV4dFNhbHQoKTsKKwkJYnl0ZSBieXRlRGF0YVtdID0gaGFzaChzYWx0LCBwYXNzd29yZC5nZXRCeXRlcygpKTsKKwkJaWYgKGJ5dGVEYXRhICE9IG51bGwpIHsKKwkJCXJldHVybiB0b0hleChzYWx0KSArICI6IiArIHRvSGV4KGJ5dGVEYXRhKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCS8qKgorCSAqIHRoZSBtZXRob2QgY2hlY2tzIGlmIHRoZSBnaXZlbiBwYXNzd29yZCBtYXRjaGVzIHRoZSBjYWxjdWxhdGVkIGhhc2gKKwkgKiAKKwkgKiBAcGFyYW0gcGFzc3dvcmQKKwkgKiBAcGFyYW0gZXhwZWN0ZWRIYXNoCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4cGVjdGVkUGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgZXhwZWN0ZWRIYXNoKSB7CisJCVN0cmluZ1tdIHBhcmFtcyA9IGV4cGVjdGVkSGFzaC5zcGxpdCgiOiIpOworCQlyZXR1cm4gaXNFeHBlY3RlZFBhc3N3b3JkKHBhc3N3b3JkLCBwYXJhbXNbU0FMVF0sIHBhcmFtc1tIQVNIXSk7CisJfQorCisJLyoqCisJICogdGhlIG1ldGhvZCBjaGVja3MgaWYgdGhlIGdpdmVuIHBhc3N3b3JkIG1hdGNoZXMgdGhlIGNhbGN1bGF0ZWQgaGFzaAorCSAqIAorCSAqIEBwYXJhbSBwYXNzd29yZAorCSAqIEBwYXJhbSBzYWx0CisJICogQHBhcmFtIGhhc2gKKwkgKiAgICAgICAgICAgIHRoZSBoYXNoIGdlbmVyYXRlZCB1c2luZyB0aGUgc2FsdAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgbWF0Y2hlZCB0aGUgaGFzaAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4cGVjdGVkUGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgc2FsdCwgU3RyaW5nIGhhc2gpIHsKKwkJYnl0ZVtdIHNhbHRCeXRlcyA9IGZyb21IZXgoc2FsdCk7CisJCWJ5dGVbXSBoYXNoQnl0ZXMgPSBmcm9tSGV4KGhhc2gpOworCisJCWJ5dGUgYnl0ZURhdGFbXSA9IGhhc2goc2FsdEJ5dGVzLCBwYXNzd29yZC5nZXRCeXRlcygpKTsKKwkJaWYgKGJ5dGVEYXRhICE9IG51bGwpIHsKKwkJCXJldHVybiBBcnJheXMuZXF1YWxzKGJ5dGVEYXRhLCBoYXNoQnl0ZXMpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCWlmIChhcmdzLmxlbmd0aCA+IDEgfHwgYXJncy5sZW5ndGggPiAwKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgaGFzaFBhc3N3b3JkKGFyZ3NbMF0pICsgIl0iKTsKKwkJfSBlbHNlIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gcGFzc3dhcmQgcGFzc2VkLiIpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgcmFuZG9tIHNhbHQgdG8gYmUgdXNlZCB0byBoYXNoIGEgcGFzc3dvcmQuCisJICogCisJICogQHJldHVybiBhIDE2IGJ5dGVzIHJhbmRvbSBzYWx0CisJICovCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldE5leHRTYWx0KCkgeworCQlieXRlW10gc2FsdCA9IG5ldyBieXRlWzE2XTsKKwkJUkFORE9NLm5leHRCeXRlcyhzYWx0KTsKKwkJcmV0dXJuIHNhbHQ7CisJfQorCisJLyoqCisJICogaGFzZSdzIHRoZSBzYWx0IGFuZCB2YWx1ZSB1c2luZyB0aGUgY2hvc2VuIGFsZ29yaXRobQorCSAqIAorCSAqIEBwYXJhbSBzYWx0CisJICogQHBhcmFtIHBhc3N3b3JkCisJICogQHJldHVybiBhbiBhcnJheSBvZiBieXRlcyByZXN1bHRpbmcgZnJvbSB0aGUgaGFzaAorCSAqLworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBoYXNoKGJ5dGVbXSBzYWx0LCBieXRlW10gcGFzc3dvcmQpIHsKKwkJTWVzc2FnZURpZ2VzdCBtZDsKKwkJYnl0ZVtdIGJ5dGVEYXRhID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShIQVNIX0FMR09SSVRITSk7CisJCQltZC51cGRhdGUoc2FsdCk7CisJCQltZC51cGRhdGUocGFzc3dvcmQpOworCQkJYnl0ZURhdGEgPSBtZC5kaWdlc3QoKTsKKwkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW52YWxpZCBhbGdvcml0aG0gbmFtZSIpOworCQl9CisJCXJldHVybiBieXRlRGF0YTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIGludG8gYSBieXRlIGFycmF5LgorCSAqCisJICogQHBhcmFtIGhleAorCSAqICAgICAgICAgICAgdGhlIGhleCBzdHJpbmcKKwkgKiBAcmV0dXJuIHRoZSBoZXggc3RyaW5nIGRlY29kZWQgaW50byBhIGJ5dGUgYXJyYXkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBieXRlW10gZnJvbUhleChTdHJpbmcgaGV4KSB7CisJCWJ5dGVbXSBiaW5hcnkgPSBuZXcgYnl0ZVtoZXgubGVuZ3RoKCkgLyAyXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyBpKyspIHsKKwkJCWJpbmFyeVtpXSA9IChieXRlKSBJbnRlZ2VyLnBhcnNlSW50KGhleC5zdWJzdHJpbmcoMiAqIGksIDIgKiBpICsgMiksIDE2KTsKKwkJfQorCQlyZXR1cm4gYmluYXJ5OworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEgYnl0ZSBhcnJheSBpbnRvIGEgaGV4YWRlY2ltYWwgc3RyaW5nLgorCSAqCisJICogQHBhcmFtIGFycmF5CisJICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB0byBjb252ZXJ0CisJICogQHJldHVybiBhIGxlbmd0aCoyIGNoYXJhY3RlciBzdHJpbmcgZW5jb2RpbmcgdGhlIGJ5dGUgYXJyYXkKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9IZXgoYnl0ZVtdIGFycmF5KSB7CisJCUJpZ0ludGVnZXIgYmkgPSBuZXcgQmlnSW50ZWdlcigxLCBhcnJheSk7CisJCVN0cmluZyBoZXggPSBiaS50b1N0cmluZygxNik7CisJCWludCBwYWRkaW5nTGVuZ3RoID0gKGFycmF5Lmxlbmd0aCAqIDIpIC0gaGV4Lmxlbmd0aCgpOworCQlpZiAocGFkZGluZ0xlbmd0aCA+IDApCisJCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTAiICsgcGFkZGluZ0xlbmd0aCArICJkIiwgMCkgKyBoZXg7CisJCWVsc2UKKwkJCXJldHVybiBoZXg7CisJfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHktdXRpbHMvc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmVjb21wL3NkYy9zZWN1cml0eS9QYXNzd29yZFRlc3QuamF2YSBiL3NlY3VyaXR5LXV0aWxzL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvc2VjdXJpdHkvUGFzc3dvcmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyZjZhYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5LXV0aWxzL3NyYy90ZXN0L2phdmEvb3JnL29wZW5lY29tcC9zZGMvc2VjdXJpdHkvUGFzc3dvcmRUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnNlY3VyaXR5OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnNlY3VyaXR5LlBhc3N3b3JkczsKKworcHVibGljIGNsYXNzIFBhc3N3b3JkVGVzdCB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGhhc2h0ZXN0KCkgeworCQlTdHJpbmcgcGFzc3dvcmQgPSAiMTIzNDU2IjsKKwkJU3RyaW5nIGhhc2ggPSBQYXNzd29yZHMuaGFzaFBhc3N3b3JkKHBhc3N3b3JkKTsKKwkJYXNzZXJ0VHJ1ZShQYXNzd29yZHMuaXNFeHBlY3RlZFBhc3N3b3JkKHBhc3N3b3JkLCBoYXNoKSk7CisJCXBhc3N3b3JkID0gIjFzZGZnc2dkMjM0NTYiOworCQloYXNoID0gUGFzc3dvcmRzLmhhc2hQYXNzd29yZChwYXNzd29yZCk7CisJCWFzc2VydFRydWUoUGFzc3dvcmRzLmlzRXhwZWN0ZWRQYXNzd29yZChwYXNzd29yZCwgaGFzaCkpOworCQlwYXNzd29yZCA9ICIxc2RmZ3NnZDIzNDUoKComJSQlNiI7CisJCWhhc2ggPSBQYXNzd29yZHMuaGFzaFBhc3N3b3JkKHBhc3N3b3JkKTsKKwkJYXNzZXJ0VHJ1ZShQYXNzd29yZHMuaXNFeHBlY3RlZFBhc3N3b3JkKHBhc3N3b3JkLCBoYXNoKSk7CisJCXBhc3N3b3JkID0gIiI7CisJCWhhc2ggPSBQYXNzd29yZHMuaGFzaFBhc3N3b3JkKHBhc3N3b3JkKTsKKwkJYXNzZXJ0VHJ1ZShQYXNzd29yZHMuaXNFeHBlY3RlZFBhc3N3b3JkKHBhc3N3b3JkLCBoYXNoKSk7CisJCXBhc3N3b3JkID0gIiAiOworCQloYXNoID0gUGFzc3dvcmRzLmhhc2hQYXNzd29yZChwYXNzd29yZCk7CisJCWFzc2VydFRydWUoUGFzc3dvcmRzLmlzRXhwZWN0ZWRQYXNzd29yZChwYXNzd29yZCwgaGFzaCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2Ly5naXRpZ25vcmUgYi91aS1jaS1kZXYvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA1ZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisvYmluLwordGVzdC1vdXRwdXQvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3BvbS54bWwgYi91aS1jaS1kZXYvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQzMjJjCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3BvbS54bWwKQEAgLTAsMCArMSwyNTUgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5zZGMtbWFpbjwvYXJ0aWZhY3RJZD4KKwkJPCEtLSA8dmVyc2lvbj4ke2FzZGMudmVyc2lvbn08L3ZlcnNpb24+IC0tPgorCQk8dmVyc2lvbj4xNjEwLjIuMTwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCTxhcnRpZmFjdElkPnVpLWNpLWRldjwvYXJ0aWZhY3RJZD4KKwk8ZGVzY3JpcHRpb24+U2VsZW5pdW0gdGVzdHMgZm9yIHRoZSBTRG5DIEFwcGxpY2F0aW9uPC9kZXNjcmlwdGlvbj4KKwkKKwkKKwkKKwk8ZGVwZW5kZW5jaWVzPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zZWxlbml1bWhxLnNlbGVuaXVtPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c2VsZW5pdW0tamF2YTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zZWxlbml1bWhxLnNlbGVuaXVtPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c2VsZW5pdW0tc2VydmVyPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi40OC4yPC92ZXJzaW9uPgorCQkJPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+YXNkYy10ZXN0czwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7YXNkYy10ZXN0cy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPCEtLSA8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y2F0YWxvZy1iZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7YXNkYy10ZXN0cy52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PiAtLT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy55YW1sPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c25ha2V5YW1sPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4xNDwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIGh0dHAgY2xpZW50IC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+aHR0cG1pbWU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4zLjI8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gaHR0cCBjb3JlIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTwhLS0gVElUQU4gLS0+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLnRoaW5rYXVyZWxpdXMudGl0YW48L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD50aXRhbi1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHt0aXRhbi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLnRoaW5rYXVyZWxpdXMudGl0YW48L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD50aXRhbi1jYXNzYW5kcmE8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke3RpdGFuLnZlcnNpb259PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmphY2tzb24tbWFwcGVyLWFzbDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuOS4yPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMy4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c2RjLWRpc3RyaWJ1dGlvbi1jbGllbnQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcudGVzdG5nPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGVzdG5nPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Ni45LjEwPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS40LjAxPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJCQorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5nb29nbGVjb2RlLmpzb24tc2ltcGxlPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anNvbi1zaW1wbGU8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjE8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS5yZWxldmFudGNvZGVzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+ZXh0ZW50cmVwb3J0czwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuNDEuMTwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1qY2ktY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJPGRlcGVuZGVuY3k+CisJCTxncm91cElkPm9yZy5zaWt1bGk8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNpa3VsaS1hcGk8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorCTwvZGVwZW5kZW5jeT4KKworCTxkZXBlbmRlbmN5PgorCQk8Z3JvdXBJZD5vcmcuc2lrdWxpPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5zaWt1bGktY29yZTwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+CisJPC9kZXBlbmRlbmN5PgorCQorCQkKKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+CisJCisJCisJCisJPGJ1aWxkPgorCQk8cGx1Z2lucz4KKwkJCQorCQkJCisJCQkKKwkJCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJPCEtLSBDcmVhdGUgdGhlIEpBUiBmaWxlIHdpdGggaXRzIGRlcGVuZGVuY2llcyAtLT4KKwkJCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuNS41PC92ZXJzaW9uPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPGlkPmNyZWF0ZS5qYXIud2l0aC5kZXBlbmRlbmNpZXM8L2lkPgorCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPnNpbmdsZTwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8YXJjaGl2ZT4KKwkJCQkJCQkJPG1hbmlmZXN0PgorCQkJCQkJCQkJPG1haW5DbGFzcz5vcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0PC9tYWluQ2xhc3M+CisJCQkJCQkJCTwvbWFuaWZlc3Q+CisJCQkJCQkJPC9hcmNoaXZlPgorCQkJCQkJCTxkZXNjcmlwdG9yUmVmcz4KKwkJCQkJCQkJPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgorCQkJCQkJCTwvZGVzY3JpcHRvclJlZnM+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCTwvZXhlY3V0aW9uPgorCQkJCQkKKwkJCQkJCisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+dGFyYmFsbDwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCTxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7ZnVsbC5yZWxlYXNlLnZlcnNpb259JHtidWlsZC50eXBlfTwvZmluYWxOYW1lPgorCQkJCQkJCTxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgorCQkJCQkJCTxkZXNjcmlwdG9yPiR7cHJvamVjdC5iYXNlZGlyfS90YXJiYWxsLnhtbDwvZGVzY3JpcHRvcj4KKwkJCQkJCQk8YXR0YWNoPmZhbHNlPC9hdHRhY2g+CisJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCTwvZXhlY3V0aW9uPgorCQkJCTwvZXhlY3V0aW9ucz4KKwkJCTwvcGx1Z2luPgorCisKKwkJCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJPCEtLSBIUCBGb3J0aWZheSBzY2FubmVyICAgICAgICAgLS0+CisJCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+Y29tLmZvcnRpZnkucHMubWF2ZW4ucGx1Z2luPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPnNjYS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+NC4zMDwvdmVyc2lvbj4KKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPHNjYW5FbmFibGVkPmZhbHNlPC9zY2FuRW5hYmxlZD4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3NjcmlwdHMvQ3JlYXRlVmZzRnJvbU9uYm9hcmRpbmcuamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvc2NyaXB0cy9DcmVhdGVWZnNGcm9tT25ib2FyZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMWY4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3NjcmlwdHMvQ3JlYXRlVmZzRnJvbU9uYm9hcmRpbmcuamF2YQpAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kuc2NyaXB0czsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5DbGVhblR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5iYXNlLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLk9uYm9hcmRVdGlsaXR5OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5GdW5jdGlvbmFsSW50ZXJmYWNlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CisKKy8qKgorICogVGhpcyBDbGFzcyBmdW5jdGlvbnMgdG8gbG9hZCBtYXNzIHppcCBmaWxlcyB0byB2ZnMgdGhyb3VnaCBvbmJvYXJkaW5nLjxicj4KKyAqIEl0IHVzZXMgYm90aCBCRSAmIFVJIEFQSXMKKyAqIAorICogQGF1dGhvciBtc2hpdHJpdAorICoKKyAqLworcHVibGljIGNsYXNzIENyZWF0ZVZmc0Zyb21PbmJvYXJkaW5nIGV4dGVuZHMgU2V0dXBDRFRlc3QgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJQ3JlYXRlVmZzRnJvbU9uYm9hcmRpbmcgbWFuYWdlciA9IG5ldyBDcmVhdGVWZnNGcm9tT25ib2FyZGluZygpOworCisJCUZ1bmN0aW9uYWxJbnRlcmZhY2VzLnN3YWxsb3dFeGNlcHRpb24oKCkgLT4gbWFuYWdlci5zZXRFbnZQYXJhbWV0ZXJzKENsZWFuVHlwZUVudW0uTk9ORS5uYW1lKCkpKTsKKwkJLy8gU3RyaW5nIGZvbGRlclBhdGggPSBhcmdzWzBdOworCQlTdHJpbmcgZm9sZGVyUGF0aCA9ICJDOlxcb25ib2FyZGluZ1Rlc3RcXG9uQm9hcmRpbmdaaXBzIjsKKwkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShmb2xkZXJQYXRoKTsKKwkJRmlsZVtdIGxpc3RPZkZpbGVzID0gZm9sZGVyLmxpc3RGaWxlcygpOworCQlMaXN0PFN0cmluZz4gemlwRmlsZU5hbWVzID0gQXJyYXlzLmFzTGlzdChsaXN0T2ZGaWxlcykuc3RyZWFtKCkubWFwKGZpbGUgLT4gZmlsZS5nZXROYW1lKCkpCisJCQkJLmZpbHRlcihmaWxlTmFtZSAtPiBmaWxlTmFtZS5lbmRzV2l0aCgiLnppcCIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVzU3VjY2Vzc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChTdHJpbmcgZmlsZU5hbWUgOiB6aXBGaWxlTmFtZXMpIHsKKwkJCXRyeSB7CisJCQkJLy8gQmVmb3JlCisJCQkJbWFuYWdlci5iZWZvcmVTdGF0ZShudWxsKTsKKwkJCQltYW5hZ2VyLnNldEJyb3dzZXJCZWZvcmVUZXN0KCk7CisJCQkJY3JlYXRlU2luZ2xlVmZGcm9tT25ib2FyZGluZyhmb2xkZXJQYXRoLCBmaWxlTmFtZSk7CisJCQkJZmlsZXNTdWNjZXNzTWFwLnB1dChmaWxlTmFtZSwgIlNVQ0NFU1MiKTsKKworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlmaWxlc1N1Y2Nlc3NNYXAucHV0KGZpbGVOYW1lLCAiRkFJTCIpOworCQkJfSBmaW5hbGx5IHsKKwkJCQlGdW5jdGlvbmFsSW50ZXJmYWNlcy5zd2FsbG93RXhjZXB0aW9uKCgpIC0+IG1hbmFnZXIuYWZ0ZXJTdGF0ZShudWxsKSk7CisJCQkJbWFuYWdlci5xdWl0QWZ0ZXJUZXN0KCk7CisJCQl9CisJCX0KKwkJUGF0aCBmaWxlID0gUGF0aHMuZ2V0KCJSdW5SZXN1bHRzLnR4dCIpOworCQlTdHJpbmcgc3RyaW5nRGF0YU1vZGVsID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKS50b0pzb24oZmlsZXNTdWNjZXNzTWFwKTsKKwkJRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbigoKSAtPiBGaWxlcy53cml0ZShmaWxlLCBzdHJpbmdEYXRhTW9kZWwuZ2V0Qnl0ZXMoKSkpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlU2luZ2xlVmZGcm9tT25ib2FyZGluZyhTdHJpbmcgZmlsZVBhdGgsIFN0cmluZyB6aXBGaWxlTmFtZSkgeworCQlTdHJpbmcgdXNlcklkID0gVXNlclJvbGVFbnVtLkRFU0lHTkVSLmdldFVzZXJJZCgpOworCQlPbmJvYXJkVXRpbGl0eS5jcmVhdGVWZkZyb21PbmJvYXJkaW5nKHVzZXJJZCwgemlwRmlsZU5hbWUsIGZpbGVQYXRoKTsKKwkJR2VuZXJhbFVJVXRpbHMuc3VibWl0Rm9yVGVzdGluZ0VsZW1lbnQoIlZmIEZyb20gT25ib2FyZGluZyIpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvQ2FudmFzRWxlbWVudC5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvQ2FudmFzRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyM2QwNWEKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9DYW52YXNFbGVtZW50LmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworCitwdWJsaWMgZmluYWwgY2xhc3MgQ2FudmFzRWxlbWVudCB7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdW5pcXVlSWQ7CisJcHJpdmF0ZSBJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGxvY2F0aW9uOworCXByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lOworCisJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIGVsZW1lbnROYW1lOworCX0KKworCXB1YmxpYyBDYW52YXNFbGVtZW50KFN0cmluZyB1bmlxdWVJZCwgU3RyaW5nIGVsZW1lbnROYW1lLCBJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGxvY2F0aW9uKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKwkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKwkJcmV0dXJuIHVuaXF1ZUlkOworCX0KKworCXB1YmxpYyBJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGdldExvY2F0aW9uKCkgeworCQlyZXR1cm4gbG9jYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBsb2NhdGlvbikgeworCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9DYW52YXNNYW5hZ2VyLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9DYW52YXNNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmOGM3YQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZGF0YXR5cGVzL0NhbnZhc01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5MZWZ0UGFuZWxDYW52YXNJdGVtczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5pbnRlcmFjdGlvbnMuQWN0aW9uczsKKworcHVibGljIGZpbmFsIGNsYXNzIENhbnZhc01hbmFnZXIgeworCXByaXZhdGUgTWFwPFN0cmluZywgQ2FudmFzRWxlbWVudD4gY2FudmFzRWxlbWVudHM7CisJcHJpdmF0ZSBBY3Rpb25zIGFjdGlvbnM7CisJcHJpdmF0ZSBXZWJFbGVtZW50IGNhbnZhczsKKwlwcml2YXRlIGludCByZWR1Y2VDYW52YXNXaWR0aEZhY3RvcjsKKwkvLyBPZmZzZXRzIEFyZSB1c2VkIHRvIGZpbmQgdXBwZXIgcmlnaHQgY29ybmVyIG9mIGNhbnZhcyBlbGVtZW50IGluIG9yZGVyIHRvCisJLy8gY29ubmVjdCBsaW5rcworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5WQVNfRUxFTUVOVF9ZX09GRlNFVCA9IDQwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5WQVNfRUxFTUVOVF9YX09GRlNFVCA9IDIxOyAvLyAxNCAtIDI3CisKKwlwcml2YXRlIENhbnZhc01hbmFnZXIoKSB7CisJCWNhbnZhc0VsZW1lbnRzID0gbmV3IEhhc2hNYXA8PigpOworCQlhY3Rpb25zID0gbmV3IEFjdGlvbnMoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkpOworCQljYW52YXMgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uR2VuZXJhbENhbnZhc0l0ZW1zLkNBTlZBUy5nZXRWYWx1ZSgpKTsKKwkJdHJ5IHsKKwkJCVdlYkVsZW1lbnQgd2ViRWxlbWVudCA9IEdlbmVyYWxVSVV0aWxzCisJCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uR2VuZXJhbENhbnZhc0l0ZW1zLkNBTlZBU19SSUdIVF9QQU5FTC5nZXRWYWx1ZSgpKTsKKwkJCXJlZHVjZUNhbnZhc1dpZHRoRmFjdG9yID0gd2ViRWxlbWVudC5nZXRTaXplKCkud2lkdGg7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZWR1Y2VDYW52YXNXaWR0aEZhY3RvciA9IDA7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIENhbnZhc01hbmFnZXIgZ2V0Q2FudmFzTWFuYWdlcigpIHsKKwkJcmV0dXJuIG5ldyBDYW52YXNNYW5hZ2VyKCk7CisJfQorCisJcHVibGljIExpc3Q8Q2FudmFzRWxlbWVudD4gZ2V0Q2FudmFzRWxlbWVudHMoKSB7CisJCXJldHVybiBjYW52YXNFbGVtZW50cy52YWx1ZXMoKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRDYW52YXNFbGVtZW50KENhbnZhc0VsZW1lbnQgZWxlbWVudCkgeworCQljYW52YXNFbGVtZW50cy5wdXQoZWxlbWVudC5nZXRVbmlxdWVJZCgpLCBlbGVtZW50KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgbW92ZUVsZW1lbnRPbkNhbnZhcyhDYW52YXNFbGVtZW50IGNhbnZhc0VsZW1lbnQsIEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gbmV3TG9jYXRpb24pIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5zbGVlcCg1MDApOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkubGVmdCwgY2FudmFzRWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0KTsKKwkJYWN0aW9ucy5jbGlja0FuZEhvbGQoKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGNhbnZhcywgbmV3TG9jYXRpb24ubGVmdCwgbmV3TG9jYXRpb24ucmlnaHQpOworCQlhY3Rpb25zLnJlbGVhc2UoKTsKKwkJYWN0aW9ucy5wZXJmb3JtKCk7CisJCWNhbnZhc0VsZW1lbnQuc2V0TG9jYXRpb24obmV3TG9jYXRpb24pOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlRWxlbWVudE9uQ2FudmFzKENhbnZhc0VsZW1lbnQgY2FudmFzRWxlbWVudCkgeworCQltb3ZlRWxlbWVudE9uQ2FudmFzKGNhbnZhc0VsZW1lbnQsIGdldEZyZWVQb3NpdGlvbigpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWxldGVFbGVtZW50RnJvbUNhbnZhcyhDYW52YXNFbGVtZW50IGNhbnZhc0VsZW1lbnQpIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkubGVmdCwgY2FudmFzRWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0KTsKKwkJYWN0aW9ucy5jbGljaygpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkdlbmVyYWxDYW52YXNJdGVtcy5ERUxFVEVfSU5TVEFOQ0VfQlVUVE9OLmdldFZhbHVlKCkpCisJCQkJLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCWNhbnZhc0VsZW1lbnRzLnJlbW92ZShjYW52YXNFbGVtZW50LmdldFVuaXF1ZUlkKCkpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCisJcHVibGljIHZvaWQgc2VsZWN0RWxlbWVudEZyb21DYW52YXMoQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50KSB7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGNhbnZhcywgY2FudmFzRWxlbWVudC5nZXRMb2NhdGlvbigpLmxlZnQsIGNhbnZhc0VsZW1lbnQuZ2V0TG9jYXRpb24oKS5yaWdodCk7CisJCWFjdGlvbnMuY2xpY2soKTsKKwkJYWN0aW9ucy5wZXJmb3JtKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgQ2FudmFzRWxlbWVudCBjcmVhdGVFbGVtZW50T25DYW52YXMoTGVmdFBhbmVsQ2FudmFzSXRlbXMgY2FudmFzSXRlbSkgeworCQlyZXR1cm4gY3JlYXRlRWxlbWVudE9uQ2FudmFzKGNhbnZhc0l0ZW0uZ2V0VmFsdWUoKSwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgRWxlbWVudCBvbiB0aGUgQ2FudmFzIC0gdXNlIHRoZSBlbGVtZW50IG5hbWUuCisJICogCisJICogQHBhcmFtIGVsZW1lbnROYW1lCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBDYW52YXNFbGVtZW50IGNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhlbGVtZW50TmFtZSwgdHJ1ZSk7CisJfQorCisJcHJpdmF0ZSBDYW52YXNFbGVtZW50IGNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gYWRkUHJlZml4KSB7CisJCWlmIChhZGRQcmVmaXgpIHsKKwkJCWVsZW1lbnROYW1lID0gRGF0YVRlc3RJZEVudW0uTEVGVF9QQU5FTF9QUkVGSVggKyBlbGVtZW50TmFtZTsKKwkJfQorCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCVdlYkVsZW1lbnQgZWxlbWVudCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbGVtZW50TmFtZSk7CisJCUltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gZnJlZVBvc2l0aW9uID0gZ2V0RnJlZVBvc2l0aW9uKCk7CisJCWFjdGlvbnMubW92ZVRvRWxlbWVudChlbGVtZW50LCAwLCAwKTsKKwkJYWN0aW9ucy5jbGlja0FuZEhvbGQoKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGNhbnZhcywgZnJlZVBvc2l0aW9uLmxlZnQsIGZyZWVQb3NpdGlvbi5yaWdodCk7CisJCWFjdGlvbnMucmVsZWFzZSgpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKworCQlTdHJpbmcgdW5pcXVlSWQgPSBlbGVtZW50TmFtZSArICJfIiArIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisJCUNhbnZhc0VsZW1lbnQgY2FudmFzRWxlbWVudCA9IG5ldyBDYW52YXNFbGVtZW50KHVuaXF1ZUlkLCBlbGVtZW50TmFtZSwgZnJlZVBvc2l0aW9uKTsKKwkJYWRkQ2FudmFzRWxlbWVudChjYW52YXNFbGVtZW50KTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlyZXR1cm4gY2FudmFzRWxlbWVudDsKKwl9CisKKwlwdWJsaWMgQ2FudmFzRWxlbWVudCBjcmVhdGVVbmlxdWVWRk9uQ2FudmFzKExlZnRQYW5lbENhbnZhc0l0ZW1zIGNhbnZhc0l0ZW0pIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlXZWJFbGVtZW50IGVsZW1lbnQgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoY2FudmFzSXRlbS5nZXRWYWx1ZSgpKTsKKwkJSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBmcmVlUG9zaXRpb24gPSBnZXRGcmVlUG9zaXRpb24oKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGVsZW1lbnQsIDAsIDApOworCQlhY3Rpb25zLmNsaWNrQW5kSG9sZCgpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBmcmVlUG9zaXRpb24ubGVmdCwgZnJlZVBvc2l0aW9uLnJpZ2h0KTsKKwkJYWN0aW9ucy5yZWxlYXNlKCk7CisJCWFjdGlvbnMucGVyZm9ybSgpOworCisJCVN0cmluZyB1bmlxdWVJZCA9IGNhbnZhc0l0ZW0ubmFtZSgpICsgIl8iICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50ID0gbmV3IENhbnZhc0VsZW1lbnQodW5pcXVlSWQsIGNhbnZhc0l0ZW0uZ2V0VmFsdWUoKSwgZnJlZVBvc2l0aW9uKTsKKwkJYWRkQ2FudmFzRWxlbWVudChjYW52YXNFbGVtZW50KTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlyZXR1cm4gY2FudmFzRWxlbWVudDsKKwl9CisKKwlwcml2YXRlIEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gZ2V0RnJlZVBvc2l0aW9uKCkgeworCQkvLyBUT0RPIHVpLWNpIHVzZSBiZXR0ZXIgbWV0aG9kCisJCUltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gcmFuZG9tUG9zaXRpb24gPSBudWxsOworCQlib29sZWFuIGZyZWVQb3NpdGlvbiA9IGZhbHNlOworCQlpbnQgbWluU3BhY2UgPSAxNTA7CisJCXdoaWxlICghZnJlZVBvc2l0aW9uKSB7CisJCQlJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IHRlbXBSYW5kb21Qb3NpdGlvbiA9IGdldFJhbmRvbVBvc2l0aW9uKCk7CisJCQlmcmVlUG9zaXRpb24gPSAhY2FudmFzRWxlbWVudHMudmFsdWVzKCkuc3RyZWFtKCkubWFwKGUgLT4gZS5nZXRMb2NhdGlvbigpKQorCQkJCQkuZmlsdGVyKGUgLT4gTWF0aC5hYnMoZS5sZWZ0IC0gdGVtcFJhbmRvbVBvc2l0aW9uLmxlZnQpIDwgbWluU3BhY2UKKwkJCQkJCQkmJiBNYXRoLmFicyhlLnJpZ2h0IC0gdGVtcFJhbmRvbVBvc2l0aW9uLnJpZ2h0KSA8IG1pblNwYWNlKQorCQkJCQkuZmluZEFueSgpLmlzUHJlc2VudCgpOworCQkJcmFuZG9tUG9zaXRpb24gPSB0ZW1wUmFuZG9tUG9zaXRpb247CisJCX0KKwkJcmV0dXJuIHJhbmRvbVBvc2l0aW9uOworCX0KKworCXByaXZhdGUgSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRSYW5kb21Qb3NpdGlvbigpIHsKKwkJaW50IGVkZ2VCdWZmZXIgPSA1MDsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJaW50IHhFbGVtZW50ID0gcmFuZG9tLm5leHRJbnQoY2FudmFzLmdldFNpemUoKS53aWR0aCAtIDIgKiBlZGdlQnVmZmVyIC0gcmVkdWNlQ2FudmFzV2lkdGhGYWN0b3IpICsgZWRnZUJ1ZmZlcjsKKwkJaW50IHlFbGVtZW50ID0gcmFuZG9tLm5leHRJbnQoY2FudmFzLmdldFNpemUoKS5oZWlnaHQgLSAyICogZWRnZUJ1ZmZlcikgKyBlZGdlQnVmZmVyOworCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4oeEVsZW1lbnQsIHlFbGVtZW50KTsKKwl9CisKKwkvKioKKwkgKiBMaW5rcyB0d28gZWxlbWVudHMgb24gY2FudmFzLjxicj4KKwkgKiBDdXJyZW50bHkgU3VwcG9ydHMgT25seSBlbGVtZW50cyBpbiB0aGUgZGVmYXVsdCBzaXplLjxicj4KKwkgKiBXaWxsIG5vdCB3b3JrIGZvciBjb250YWluZXIgdHlwZSBvciBzbWFsbGVyIGVsZW1lbnRzIChjcCwgdmwgZXRjLi4uKTxicj4KKwkgKiAKKwkgKiBAcGFyYW0gZmlyc3RFbGVtZW50CisJICogQHBhcmFtIHNlY29uZEVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBsaW5rRWxlbWVudHMoQ2FudmFzRWxlbWVudCBmaXJzdEVsZW1lbnQsIENhbnZhc0VsZW1lbnQgc2Vjb25kRWxlbWVudCkgeworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCWRyYXdTaW1wbGVMaW5rKGZpcnN0RWxlbWVudCwgc2Vjb25kRWxlbWVudCk7CisJCXNlbGVjdFJlcUFuZENhcEFuZENvbm5lY3QoKTsKKworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VsZWN0UmVxQW5kQ2FwQW5kQ29ubmVjdCgpIHsKKwkJLy8gU2VsZWN0IEZpcnN0IENhcAorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50c0xpc3RXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5MaW5rTWVudUl0ZW1zLkxJTktfSVRFTV9DQVAuZ2V0VmFsdWUoKSkuZ2V0KDApCisJCQkJLmNsaWNrKCk7CisJCS8vIFNlbGVjdCBGaXJzdCBSZXEKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudHNMaXN0V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTGlua01lbnVJdGVtcy5MSU5LX0lURU1fUkVRLmdldFZhbHVlKCkpLmdldCgwKQorCQkJCS5jbGljaygpOworCQkvLyBDb25uZWN0CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5MaW5rTWVudUl0ZW1zLkNPTk5FQ1RfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgZHJhd1NpbXBsZUxpbmsoQ2FudmFzRWxlbWVudCBmaXJzdEVsZW1lbnQsIENhbnZhc0VsZW1lbnQgc2Vjb25kRWxlbWVudCkgeworCisJCWludCB5T2Zmc2V0ID0gQ0FOVkFTX0VMRU1FTlRfWV9PRkZTRVQ7CisJCWludCB4T2Zmc2V0ID0gQ0FOVkFTX0VMRU1FTlRfWF9PRkZTRVQ7CisJCWFjdGlvbnMubW92ZVRvRWxlbWVudChjYW52YXMsIGZpcnN0RWxlbWVudC5nZXRMb2NhdGlvbigpLmxlZnQgKyB4T2Zmc2V0LAorCQkJCWZpcnN0RWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0IC0geU9mZnNldCk7CisKKwkJYWN0aW9ucy5jbGlja0FuZEhvbGQoKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGNhbnZhcywgc2Vjb25kRWxlbWVudC5nZXRMb2NhdGlvbigpLmxlZnQgKyB4T2Zmc2V0LAorCQkJCXNlY29uZEVsZW1lbnQuZ2V0TG9jYXRpb24oKS5yaWdodCAtIHlPZmZzZXQpOworCQlhY3Rpb25zLnJlbGVhc2UoKTsKKwkJYWN0aW9ucy5wZXJmb3JtKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9DbGVhblR5cGVFbnVtLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9DbGVhblR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2OTFiOAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZGF0YXR5cGVzL0NsZWFuVHlwZUVudW0uamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogZW51bSB0aGF0IHJlcHJlc2VudHMgcG9zc2libGUgbWV0aG9kcyB0byBjbGVhbiBEQiBiZWZvcmUgYW5kIGFmdGVyIHRlc3RzLgorICogCisgKiBAYXV0aG9yIG1zaGl0cml0CisgKgorICovCitwdWJsaWMgZW51bSBDbGVhblR5cGVFbnVtIHsKKwlGVUxMLAorCS8qKiBVbnJlbGlhYmxlIHNob3VsZCBiZSBvbmx5IHVzZWQgaW4gZGV2ICoqLworCVBBUlRJQUwsIE5PTkU7CisKKwkvKioKKwkgKiBSZXR1cm5zIENsZWFuVHlwZSBlbnVtIGJ5IGl0IG5hbWUKKwkgKiAKKwkgKiBAcGFyYW0gY2xlYW5UeXBlCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ2xlYW5UeXBlRW51bSBmaW5kQnlOYW1lKFN0cmluZyBjbGVhblR5cGUpIHsKKwkJZmluYWwgT3B0aW9uYWw8Q2xlYW5UeXBlRW51bT4gZmluZEFueSA9IEFycmF5cy5hc0xpc3QoQ2xlYW5UeXBlRW51bS52YWx1ZXMoKSkuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKGUgLT4gZS5uYW1lKCkuZXF1YWxzKGNsZWFuVHlwZSkpLmZpbmRBbnkoKTsKKwkJcmV0dXJuIGZpbmRBbnkuZ2V0KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0uamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZGF0YXR5cGVzL0NyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyNTg0YQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZGF0YXR5cGVzL0NyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgZW51bSBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bSB7CisKKwlJTVBPUlRfVkYsIElNUE9SVF9WRkMsIElNUE9SVF9DUCwgSU1QT1JUX1ZMLCBDUkVBVEVfVkYsIENSRUFURV9TRVJWSUNFLCBDUkVBVEVfUFJPRFVDVDsKKworfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9DcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDAyODFkCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGVudW0gQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtIHsKKwlHRU5FUkFMKCJHZW5lcmFsc3RlcCIpLCAKKwlJQ09OKCJJY29uc3RlcCIpLCAKKwlERVBMT1lNRU5UX0FSVElGQUNUKCJEZXBsb3ltZW50IEFydGlmYWN0c3RlcCIpLCAKKwlJTkZPUk1BVElPTl9BUlRJRkFDVCgiSW5mb3JtYXRpb24gQXJ0aWZhY3RzdGVwIiksIAorCVBST1BFUlRJRVMoIlByb3BlcnRpZXNzdGVwIiksIAorCUFUVFJJQlVURVMoIkF0dHJpYnV0ZXNzdGVwIiksIAorCUNPTVBPU0lUSU9OKCJDb21wb3NpdGlvbnN0ZXAiKSwgCisJREVQTE9ZTUVOVCgiRGVwbG95bWVudHN0ZXAiKSwgCisJUkVRVUlSRU1FTlRTX0FORF9DQVBBQklMSVRJRVMoIlJlcS4gJiBDYXBhYmlsaXRpZXNzdGVwIiksCisJSU5QVVRTKCJJbnB1dHNzdGVwIik7CisKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcml2YXRlIENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvRGF0YVRlc3RJZEVudW0uamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZGF0YXR5cGVzL0RhdGFUZXN0SWRFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkYjEyYQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZGF0YXR5cGVzL0RhdGFUZXN0SWRFbnVtLmphdmEKQEAgLTAsMCArMSw0MjggQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhVGVzdElkRW51bSB7CisJcHJpdmF0ZSBEYXRhVGVzdElkRW51bSgpIHsKKwl9OworCisJcHVibGljIGVudW0gRGFzaGJvYXJkIHsKKwkJSU1QT1JUX0FSRUEoImltcG9ydEJ1dHRvbnNBcmVhIiksIAorCQlCVVRUT05fQUREX1ZGKCJjcmVhdGVSZXNvdXJjZUJ1dHRvbiIpLCAKKwkJQlVUVE9OX0FERF9TRVJWSUNFKCJjcmVhdGVTZXJ2aWNlQnV0dG9uIiksIAorCQlJTVBPUlRfVkZDKCJpbXBvcnRWRkNidXR0b24iKSwgCisJCUlNUE9SVF9WRigiaW1wb3J0VkZidXR0b24iKSwgCisJCUlNUE9SVF9WRkNfRklMRSgiZmlsZS1pbXBvcnRWRkNidXR0b24iKSwgCisJCUlNUE9SVF9WRl9GSUxFKCJmaWxlLWltcG9ydFZGYnV0dG9uIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgRGFzaGJvYXJkKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gTGlmZUN5bGVDaGFuZ2VCdXR0b25zIHsKKwkJQ1JFQVRFKCJjcmVhdGUvc2F2ZSIpLCAKKwkJQ0hFQ0tfSU4oImNoZWNrX2luIiksIAorCQlTVUJNSVRfRk9SX1RFU1RJTkcoInN1Ym1pdF9mb3JfdGVzdGluZyIpLCAKKwkJU1RBUlRfVEVTVElORygic3RhcnRfdGVzdGluZyIpLCAKKwkJQUNDRVBUKCJhY2NlcHQiKSwgCisJCUFQUFJPVkUoImFwcHJvdmUiKSwgCisJCURJU1RSSUJVVEUoImRpc3RyaWJ1dGUiKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBMaWZlQ3lsZUNoYW5nZUJ1dHRvbnMoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBcnRpZmFjdHMgUmVsYXRlZCBFbGVtZW50cworCSAqIAorCSAqIEBhdXRob3IgbXNoaXRyaXQKKwkgKgorCSAqLworCXB1YmxpYyBlbnVtIEFydGlmYXRjcyB7CisJCUFERF9ERVBMT1lNRU5UX0FSVElGQUNUKCJhZGQtZGVwbG95bWVudC1hcnRpZmFjdC1idXR0b24iKSwgCisJCVNFTEVDVF9BUlRJRkFDVF9EUk9QRE9XTigic2VsZWN0QXJ0aWZhY3QiKSwgCisJCUFSVElGQUNUX1RZUEVfRFJPUERPV04oImFydGlmYWN0dHlwZSIpLCAKKwkJQVJUSUZBQ1RfREVTQ1JJUFRJT04oImRlc2NyaXB0aW9uIiksIAorCQlBUlRJRkFDVF9MQUJFTCgiYXJ0aWZhY3RMYWJlbCIpLCAKKwkJQlJPV1NFX0JVVFRPTigiYnJvd3NlQnV0dG9uIiksIAorCQlBRERfQlVUVE9OKCJBZGQiKTsKKwkJCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIEFydGlmYXRjcyhTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCisJfQorCisJcHVibGljIGVudW0gSW5mb3JtYXRpb25hbEFydGlmYXRjcyB7CisJCUNMT1VEX1FVRVNUSU9OTkFJUkUoIkNsb3VkIFF1ZXN0aW9ubmFpcmUgKGNvbXBsZXRlZCkiKSwgCisJCUZFQVRVUkVTKCJGZWF0dXJlcyIpLCAKKwkJVkVORE9SX1RFU1RfUkVTVUxUKCJWZW5kb3IgVGVzdCBSZXN1bHQiKSwgCisJCVRFU1RfU0NSSVBUUygiVGVzdCBTY3JpcHRzIiksIAorCQlIRUFUX1RFTVBMQVRFX0ZST01fVkVORE9SKCJIRUFUIFRlbXBsYXRlIGZyb20gVmVuZG9yIiksIAorCQlDQVBBQ0lUWSgiQ2FwYWNpdHkiKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBJbmZvcm1hdGlvbmFsQXJ0aWZhdGNzKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwl9CisKKwlwdWJsaWMgZW51bSBBcnRpZmFjdE1vZGFsIHsKKwkJTEFCRUwoImFydGlmYWN0LWxhYmVsIiksIFRZUEUoImFydGlmYWN0dHlwZSIpLDsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBBcnRpZmFjdE1vZGFsKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gTW9kYWxJdGVtcyB7CisJCUJST1dTRV9CVVRUT04oImJyb3dzZUJ1dHRvbiIpLCAKKwkJQUREKCJBZGQiKSwgCisJCURFU0NSSVBUSU9OKCJkZXNjcmlwdGlvbiIpLCAKKwkJU1VNQklUX0ZPUl9URVNUSU5HX01FU1NBR0UoImNoYW5nZUxpZmVDeWNsZU1lc3NhZ2UiKSwgCisJCU9LKCJPSyIpLCAKKwkJQ0FOQ0VMKCJDYW5jZWwiKSwgCisJCUFDQ0VQX1RFU1RJTkdfTUVTU0FHRSgiY2hlY2tpbmRpYWxvZyIpLCAKKwkJTUVTU0FHRV9URVhUKCJtZXNzYWdlIiksIAorCQlET05FKCJEb25lIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgTW9kYWxJdGVtcyhTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFORUxfUFJFRklYID0gImxlZnRiYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tIjsKKworCXB1YmxpYyBlbnVtIExlZnRQYW5lbENhbnZhc0l0ZW1zIHsKKwkJQkxPQ0tfU1RPUkFHRShMRUZUX1BBTkVMX1BSRUZJWCArICJCbG9ja1N0b3JhZ2UiKSwgCisJCUNJTkRFUl9WT0xVTUUoTEVGVF9QQU5FTF9QUkVGSVggKyAiQ2luZGVyVm9sdW1lIiksIAorCQlDT01QVVRFKExFRlRfUEFORUxfUFJFRklYICsgIkNvbXB1dGUiKSwgCisJCUxPQURfQkFMQU5DRVIoTEVGVF9QQU5FTF9QUkVGSVggKyAiTG9hZEJhbGFuY2VyIiksIAorCQlOT1ZBX1NFUlZFUihMRUZUX1BBTkVMX1BSRUZJWCArICJOb3ZhU2VydmVyIiksIAorCQlPQkpFQ1RfU1RPUkFHRShMRUZUX1BBTkVMX1BSRUZJWCArICJPYmplY3RTdG9yYWdlIiksCisJCS8vIE5FVVRST05fUE9SVChMRUZUX1BBTkVMX1BSRUZJWCArICItTmV1dHJvblBvcnQiKSwKKwkJLy8gUE9SVChMRUZUX1BBTkVMX1BSRUZJWCArICItUG9ydCIpLAorCQlEQVRBQkFTRShMRUZUX1BBTkVMX1BSRUZJWCArICItRGF0YWJhc2UiKSwgCisJCVZNTUMoTEVGVF9QQU5FTF9QUkVGSVggKyAidm1tY193b3JrIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgTGVmdFBhbmVsQ2FudmFzSXRlbXMoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwlwdWJsaWMgZW51bSBSaWdodEJhciB7CisJCVBST1BFUlRJRVNfQU5EX0FUVFJJQlVURVMoInByb3BlcnRpZXMtYW5kLWF0dHJpYnV0ZXMtdGFiIiksIAorCQlERVBMT1lNRU5UX0FSVElGQUNUUygiZGVwbG95bWVudC1hcnRpZmFjdC10YWIiKSwgCisJCUFSVElGQUNUX05BTUUoImFydGlmYWN0TmFtZSIpLCAKKwkJQUREX0FSVElGQUNUX0JVVFRPTigiYWRkX0FydGlmYWN0X0J1dHRvbiIpLCAKKwkJREVMRVRFX0FSVElGQUNUX0JVVFRPTigiZGVsZXRlIiksIAorCQlNWUFUVFJfQVRUUl9GUk9NX0xJU1QoIm15X2F0dHItYXR0ciIpLCAKKwkJTVlBVFRSX0FUVFJfVkFMVUVfRlJPTV9MSVNUKCJ2YWx1ZS1vZi1teV9hdHRyIiksOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIFJpZ2h0QmFyKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCQorCS8vIGZvciBub3cgd2UgdXNlIGluZGV4IHRvIHdvcmsgd2l0aCB0aGUgYnJlYWRjcnVtYnMKKwkvLyBhbnkgY2hhbmdlIGluIHRoZSBicmVhZGNydW1icyBwb3NpdGlvbiB3aWxsIHJlcXVpcmUgYW4gdXBkYXRlIGhlcmUgYWxzbworCXB1YmxpYyBlbnVtIEJyZWFkY3J1bWJzQnV0dG9uc0VudW0geworCQlIT01FKCJicmVhZGNydW1icy1idXR0b24tMCIpLAorCQlDT01QT05FTlQoImJyZWFkY3J1bWJzLWJ1dHRvbi0xIik7CisJCQorCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKwkJCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwkJCisJCXByaXZhdGUgQnJlYWRjcnVtYnNCdXR0b25zRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgZW51bSBJbnB1dHNFbnVtIHsKKwkJVkZfSU5TVEFOQ0UoImlucHV0cy12Zi1pbnN0YW5jZS0wIiksCisJCUZJUlNUX0lOUFVUX0NIRUNLQk9YKCJpbnB1dHMtY2hlY2tib3gtMCIpLAorCQlTRUNPTkRfSU5QVVRfQ0hFQ0tCT1goImlucHV0cy1jaGVja2JveC0xIiksCisJCUFERF9JTlBVVFNfQlVUVE9OKCJhZGQtaW5wdXRzLXRvLXNlcnZpY2UtYnV0dG9uIiksCisJCVNFUlZJQ0VfSU5QVVQoInNlcnZpY2UtaW5wdXQtMCIpLAorCQlERUxFVEVfSU5QVVQoImRlbGV0ZS1pbnB1dC0wIik7CisJCQorCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKwkJCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwkJCisJCXByaXZhdGUgSW5wdXRzRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCQkKKwl9CisKKwlwdWJsaWMgZW51bSBUYWJzQmFyIHsKKwkJSElFUkFSQ0hZX1RBQigiaGllcmFyY2h5LXRhYiIpLCAKKwkJU0VMRUNURURfVEFCKCJzZWxlY3RlZC10YWIiKSwgCisJCVRBQl9IRUFERVIoInRhYi1oZWFkZXIiKSwgCisJCVRBQl9TVUJfSEVBREVSKCJ0YWItc3ViLWhlYWRlciIpLCAKKwkJSElFUkFSQ0hZX01PRFVMRSgiaGllcmFyY2h5LW1vZHVsZS0wIiksIAorCQlISUVSQVJDSFlfTU9EVUxFX1RJVExFKCJoaWVyYXJjaHktbW9kdWxlLTAtdGl0bGUiKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfREFUQSgic2VsZWN0ZWQtbW9kdWxlLWRhdGEiKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfTkFNRSgic2VsZWN0ZWQtbW9kdWxlLW5hbWUiKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfVVVJRCgic2VsZWN0ZWQtbW9kdWxlLWdyb3VwLXV1aWQiKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfVkVSU0lPTigic2VsZWN0ZWQtbW9kdWxlLXZlcnNpb24iKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfSVNfQkFTRSgic2VsZWN0ZWQtbW9kdWxlLWlzLWJhc2UiKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfQVJUSUZBQ1RfTkFNRSgic2VsZWN0ZWQtbW9kdWxlLWFydGlmYWN0LW5hbWUiKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfQVJUSUZBQ1RfVVVJRCgic2VsZWN0ZWQtbW9kdWxlLWFydGlmYWN0LXV1aWQiKSwgCisJCUhJRVJBUkNIWV9TRUxFQ1RFRF9NT0RVTEVfQVJUSUZBQ1RfVkVSU0lPTigic2VsZWN0ZWQtbW9kdWxlLWFydGlmYWN0LXZlcnNpb24iKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBUYWJzQmFyKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gVXBkYXRlTmFtZVBvcG92ZXIgeworCQlPUEVOX1BPUE9WRVJfSUNPTigiZWRpdC1uYW1lLXBvcG92ZXItaWNvbiIpLCAKKwkJUE9QT1ZFUl9GT1JNKCJwb3BvdmVyLWZvcm0iKSwgCisJCVBPUE9WRVJfU0FWRV9CVVRUT04oInBvcG92ZXItc2F2ZS1idXR0b24iKSwgCisJCVBPUE9WRVJfSU5TVEFOQ0VfTkFNRSgicG9wb3Zlci12Zmluc3RhbmNlLW5hbWUiKSwgCisJCVBPUE9WRVJfSEVBVF9OQU1FKCJwb3BvdmVyLWhlYXQtbmFtZSIpLCAKKwkJUE9QT1ZFUl9NT0RVTEVfTkFNRSgicG9wb3Zlci1tb2R1bGUtbmFtZSIpLCAKKwkJUE9QT1ZFUl9DTE9TRV9CVVRUT04oInBvcG92ZXItY2xvc2UtYnV0dG9uIiksIAorCQlQT1BPVkVSX1hfQlVUVE9OKCJwb3BvdmVyLXgtYnV0dG9uIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgVXBkYXRlTmFtZVBvcG92ZXIoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwlwdWJsaWMgZW51bSBMaW5rTWVudUl0ZW1zIHsKKwkJQ0FOQ0VMX0JVVFRPTigibGluay1tZW51LWJ1dHRvbi1jYW5jZWwiKSwgCisJCUNPTk5FQ1RfQlVUVE9OKCJsaW5rLW1lbnUtYnV0dG9uLWNvbm5lY3QiKSwgCisJCUxJTktfSVRFTV9DQVAoImxpbmstaXRlbS1jYXBhYmlsaXRpZXMiKSwgCisJCUxJTktfSVRFTV9SRVEoImxpbmstaXRlbS1yZXF1aXJlbWVudHMiKSwgCisJCUxJTktfTUVOVSgibGluay1tZW51LW9wZW4iKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBMaW5rTWVudUl0ZW1zKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gR2VuZXJhbENhbnZhc0l0ZW1zIHsKKwkJQ0FOVkFTKCJjYW52YXMiKSwgCisJCUNBTlZBU19SSUdIVF9QQU5FTCgidy1zZGMtZGVzaWduZXItc2lkZWJhci1oZWFkIiksIAorCQlERUxFVEVfSU5TVEFOQ0VfQlVUVE9OKCJlLXNkYy1zbWFsbC1pY29uLWRlbGV0ZSIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIEdlbmVyYWxDYW52YXNJdGVtcyhTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBlbnVtIEF0dHJpYnV0ZXNTZWN0aW9uIHsKKwkJVEFCTEVfUk9XUygiYXR0cmlidXRlcy10YWJsZS1yb3ciKSwgCisJCUVESVRfQlVUVE9OX0ZPUl9ORVRXT1JLX0FUVFIoImVkaXRfbmV0d29ya3MiKSwgCisJCURFTEVURV9CVVRUT05fRk9SX05FVFdPUktfQVRUUigiZGVsZXRlX25ldHdvcmtzIiksIAorCQlBRERfQlVUVE9OKCJhZGQtYXR0cmlidXRlLWJ1dHRvbiIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIEF0dHJpYnV0ZXNTZWN0aW9uKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gQXR0cmlidXRlRm9ybSB7CisJCU5BTUVfRklFTEQoImF0dHJpYnV0ZU5hbWUiKSwgCisJCURFU0NSSVBUSU9OX0ZJRUxEKCJkZXNjcmlwdGlvbiIpLCAKKwkJVFlQRV9GSUVMRCgidHlwZS1maWVsZCIpLCAKKwkJREVGQVVMVF9WQUxfRklFTEQoImRlZmF1bHR2YWx1ZSIpLAorCQlCT09MX0RFRkFVTFRfVkFMX0ZJRUxEKCJib29sZWFudHlwZSIpLCAKKwkJU0NIRU1BX0ZJRUxEKCJzY2hlbWEiKSwgCisJCUJPT0xfVkFMVUVfRklFTEQoImJvb2xlYW4tdHlwZS12YWx1ZSIpLCAKKwkJSElEREVOX0ZJRUxEKCJoaWRkZW4iKSwgCisJCVVQREFURV9CVVRUT04oIlVwZGF0ZSIpLCAKKwkJRE9ORV9CVVRUT04oIkRvbmUiKSwgCisJCUFERF9CVVRUT04oIkFkZCIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIEF0dHJpYnV0ZUZvcm0oU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwlwdWJsaWMgZW51bSBQcm9wZXJ0aWVzU2VjdGlvbiB7CisJCUFERF9CVVRUT04oImFkZEdyZXkiKSw7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgUHJvcGVydGllc1NlY3Rpb24oU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwlwdWJsaWMgZW51bSBQcm9wZXJ0eUZvcm0geworCQlGT1JNX0NPTlRBSU5FUigic2RjLWVkaXQtcHJvcGVydHktY29udGFpbmVyIiksIAorCQlOQU1FX0ZJRUxEKCJwcm9wZXJ0eU5hbWUiKSwgCisJCURFU0NSSVBUSU9OX0ZJRUxEKCJkZXNjcmlwdGlvbiIpLCAKKwkJVFlQRV9GSUVMRCgicHJvcGVydHlUeXBlIiksIAorCQlTQ0hFTUFfRklFTEQoInNjaGVtYS10eXBlIiksIAorCQlTSU1QTEVfVFlQRV9ERUZBVUxUX1ZBTF9GSUVMRCgiZGVmYXVsdHZhbHVlIiksIAorCQlTSU1QTEVfVFlQRV9CT09MX0RFRkFVTFRfVkFMX0ZJRUxEKCJib29sZWFudHlwZSIpLCAKKwkJTElTVF9UWVBFX0RFRkFVTFRfVkFMX0ZJRUxEKCJsaXN0TmV3SXRlbS0xIiksIAorCQlNQVBfVFlQRV9ERUZBVUxUX1ZBTF9LRVlfRklFTERfRk9SX0ZJUlNUX0lURU0oIm1hcEtleS0xMCIpLCAKKwkJTUFQX1RZUEVfREVGQVVMVF9WQUxfVkFMVUVfRklFTERfRk9SX0ZJUlNUX0lURU0oIm1hcFZhbHVlLTEwIiksIAorCQlNQVBfVFlQRV9ERUZBVUxUX1ZBTF9LRVlfRklFTERfRk9SX1NFQ09ORF9JVEVNKCJtYXBLZXktMTEiKSwgCisJCU1BUF9UWVBFX0RFRkFVTFRfVkFMX1ZBTFVFX0ZJRUxEX0ZPUl9TRUNPTkRfSVRFTSgibWFwVmFsdWUtMTEiKSwgCisJCUFERF9JVEVNX1RPX0xJU1RfQlVUVE9OKCJhZGQtbGlzdC1pdGVtLTEiKSwKKwkJQUREX0lURU1fVE9fTUFQX0JVVFRPTigiYWRkLW1hcC1pdGVtIiksCisJCURFTEVURV9GSVJTVF9JVEVNX0ZST01fTUFQX0JVVFRPTigiZGVsZXRlLW1hcC1pdGVtLTEwIiksIAorCQlTVEFSVF9QT1JUX0ZJRUxEX0ZPUl9QT1JUX1BBSVJTX0RUKCItMXN0YXJ0X3BvcnQiKSwgCisJCVNBVkVfQlVUVE9OKCJTYXZlIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgUHJvcGVydHlGb3JtKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gR2VuZXJhbFNlY3Rpb24geworCQlCUk9XU0VfQlVUVE9OKCJicm93c2VCdXR0b24iKSwgRklMRV9OQU1FKCJmaWxlbmFtZSIpLCBOQU1FKCJuYW1lIiksIExPQURFUigidGx2LWxvYWRlciIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIEdlbmVyYWxTZWN0aW9uKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gUmVxQW5kQ2FwYWJpbGl0aWVzU2VjdGlvbiB7CisJCVNFQVJDSF9CT1goInNlYXJjaC1ib3giKSwgQ0FQX1RBQigiY2FwLXRhYiIpLCBSRVFfVEFCKCJyZXEtdGFiIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgUmVxQW5kQ2FwYWJpbGl0aWVzU2VjdGlvbihTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBlbnVtIE9uQm9hcmRpbmdUYWJsZSB7CisJCU9QRU5fTU9EQUxfQlVUVE9OKCJyZXBvc2l0b3J5LWljb24iKSwgCisJCVZFTkRPUl9IRUFERVJfQ09MKCJWZW5kb3IiKSwgCisJCU5BTUVfSEVBREVSX0NPTCgiTmFtZSIpLCAKKwkJQ0FURUdPUllfSEVBREVSX0NPTCgiQ2F0ZWdvcnkiKSwgCisJCVZFUlNJT05fSEVBREVSX0NPTCgiVmVyc2lvbiIpLCAKKwkJSU1QT1JUX0lDT04oImltcG9ydC1jc2FyIiksIAorCQlVUERBVEVfSUNPTigidXBkYXRlLWNzYXIiKSwgCisJCUNTQVJfUk9XKCJjc2FyLXJvdyIpLCAKKwkJT05CT0FSRElOR19TRUFSQ0goIm9uYm9hcmRpbmctc2VhcmNoIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgT25Cb2FyZGluZ1RhYmxlKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvTWVudU9wdGlvbnNFbnVtLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9NZW51T3B0aW9uc0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzQ1ODU4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvTWVudU9wdGlvbnNFbnVtLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGVudW0gTWVudU9wdGlvbnNFbnVtIHsKKworCUVESVQoIkVkaXQiKSwgQ0hFQ0tfSU4oIkNoZWNrIGluIiksIENIRUNLX09VVCgiQ2hlY2sgb3V0IiksIFZJRVcoIlZpZXciKSwgU1VCTUlUX0ZPUl9URVNUKCJTdWJtaXQgRm9yIFRlc3QiKSwgQUNDRVBUKCJBY2NlcHQiKSwgUkVKRUNUKCJSZWplY3QiKSwgU1RBUlRfVEVTVCgiU3RhcnQgdGVzdCIpLCBESVNUUkVCVVRFKCJEaXN0cmlidXRlIik7CisKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcml2YXRlIE1lbnVPcHRpb25zRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvVXNlckNyZWRlbnRpYWxzLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2RhdGF0eXBlcy9Vc2VyQ3JlZGVudGlhbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDk0NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9kYXRhdHlwZXMvVXNlckNyZWRlbnRpYWxzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CisKK3B1YmxpYyBjbGFzcyBVc2VyQ3JlZGVudGlhbHMgZXh0ZW5kcyBVc2VyIHsKKworCXByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOworCisJcHVibGljIFVzZXJDcmVkZW50aWFscyhTdHJpbmcgdXNlcklkLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyBmaXJzdG5hbWUsIFN0cmluZyBsYXN0bmFtZSkgeworCQlzdXBlcigpOworCQlzZXRVc2VySWQodXNlcklkKTsKKwkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworCQlzZXRGaXJzdE5hbWUoZmlyc3RuYW1lKTsKKwkJc2V0TGFzdE5hbWUobGFzdG5hbWUpOworCX0KKworCXB1YmxpYyBVc2VyQ3JlZGVudGlhbHMoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKwkJcmV0dXJuIHBhc3N3b3JkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvYmFzZS9TZXR1cENEVGVzdC5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9leGVjdXRlL2Jhc2UvU2V0dXBDRFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU5ZjEzCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9leGVjdXRlL2Jhc2UvU2V0dXBDRFRlc3QuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUuYmFzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRpbmtlcnBvcC5ncmVtbGluLnN0cnVjdHVyZS5FZGdlOworaW1wb3J0IG9yZy5hcGFjaGUudGlua2VycG9wLmdyZW1saW4uc3RydWN0dXJlLlZlcnRleDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuQ2xlYW5UeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5Vc2VyQ3JlZGVudGlhbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuRmlsZUhhbmRsaW5nOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uQnk7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJEcml2ZXI7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5hcGkuQ29tcG9uZW50QmFzZVRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnJ1bi5TdGFydFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20udGhpbmthdXJlbGl1cy50aXRhbi5jb3JlLlRpdGFuR3JhcGg7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXR1cENEVGVzdCBleHRlbmRzIENvbXBvbmVudEJhc2VUZXN0IHsKKworCXByaXZhdGUgVGl0YW5TbmFwc2hvdCBzbmFwc2hvdDsKKwlwcml2YXRlIHN0YXRpYyBDbGVhblR5cGVFbnVtIGNsZWFuVHlwZTsKKworCXB1YmxpYyBTZXR1cENEVGVzdCgpIHsKKwkJc3VwZXIobmV3IFRlc3ROYW1lKCksIFNldHVwQ0RUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIFNldHVwQ0RUZXN0KFRlc3ROYW1lIG5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJc3VwZXIobmFtZSwgY2xhc3NOYW1lKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNldHVwQ0RUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKwkvKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgKioqKioqKioqKioqKioqKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFREVOVElBTFNfRklMRSA9ICJzcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9jcmVkZW50aWFscy55YW1sIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFTklVTV9OT0RFX1VSTCA9ICJodHRwOi8vJXM6JXMvd2QvaHViIjsKKworCS8qKioqKioqKioqKioqKioqIFBSSVZBVEVTICoqKioqKioqKioqKioqKiovCisJcHVibGljIHN0YXRpYyBDb25maWcgY29uZmlnOworCXByaXZhdGUgTWFwPD8sID8+IGNyZWRlbnRpYWxzWWFtbEZpbGVNYXA7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGV2VXJsLCBjZFVybDsKKworCS8qKioqKioqKioqKioqKioqCisJICogQkVGT1JFCisJICogCisJICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwkgKioqKioqKioqKioqKioqKi8KKworCUBCZWZvcmVTdWl0ZShhbHdheXNSdW4gPSB0cnVlKQorCUBQYXJhbWV0ZXJzKHsgImNsZWFuLXR5cGUiIH0pCisJcHVibGljIHZvaWQgc2V0RW52UGFyYW1ldGVycyhAT3B0aW9uYWwoIlBBUlRJQUwiKSBTdHJpbmcgY2xlYW5UeXBlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJdGhpcy5jbGVhblR5cGUgPSBDbGVhblR5cGVFbnVtLmZpbmRCeU5hbWUoY2xlYW5UeXBlKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJzZXR1cCBiZWZvcmUgY2xhc3MiKTsKKwkJY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCWxvYWRDcmVkZW50aWFsc0ZpbGUoKTsKKwkJc2V0VXJsKCk7CisJfQorCisJQEJlZm9yZU1ldGhvZChhbHdheXNSdW4gPSB0cnVlKQorCXB1YmxpYyB2b2lkIHNldEJyb3dzZXJCZWZvcmVUZXN0KCkgeworCQlzZXRCcm93c2VyQmVmb3JlVGVzdChnZXRSb2xlKCkpOworCX0KKworCS8qKioqKioqKioqKioqKioqIEFGVEVSICoqKioqKioqKioqKioqKiovCisJQEFmdGVyTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCisJcHVibGljIHZvaWQgcXVpdEFmdGVyVGVzdCgpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJjbG9zaW5nIGJyb3dzZXIiKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkucXVpdCgpOworCX0KKworCUBCZWZvcmVNZXRob2QoYWx3YXlzUnVuID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBiZWZvcmVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlDbGVhblR5cGVFbnVtIGNsZWFuVHlwZSA9IGdldENsZWFuTW9kZSgpOworCQlzd2l0Y2ggKGNsZWFuVHlwZSkgeworCQljYXNlIEZVTEw6IHsKKwkJCXN1cGVyLmJlZm9yZVN0YXRlKG51bGwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQQVJUSUFMOiB7CisJCQl0YWtlVGl0YW5TbmFwc2hvdCgpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBOT05FOiB7CisJCQkvLyBObyBDbGVhbiBVcAorCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogeworCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJFbnVtIFZhbHVlOiIgKyBjbGVhblR5cGUubmFtZSgpICsgIiBJcyBub3QgaGFuZGxlZCIpOworCQl9CisJCX0KKworCX0KKworCUBBZnRlck1ldGhvZChhbHdheXNSdW4gPSB0cnVlKQorCXB1YmxpYyB2b2lkIGFmdGVyU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2xlYW5UeXBlRW51bSBjbGVhblR5cGUgPSBnZXRDbGVhbk1vZGUoKTsKKwkJc3dpdGNoIChjbGVhblR5cGUpIHsKKwkJY2FzZSBGVUxMOiB7CisJCQlzdXBlci5hZnRlclN0YXRlKG51bGwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQQVJUSUFMOiB7CisJCQlyZXNldFRvT3JpZ2luYWxTbmFwc2hvdCgpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBOT05FOiB7CisJCQkvLyBObyBDbGVhbiBVcAorCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogeworCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJFbnVtIFZhbHVlOiIgKyBjbGVhblR5cGUubmFtZSgpICsgIiBJcyBub3QgaGFuZGxlZCIpOworCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCB0YWtlVGl0YW5TbmFwc2hvdCgpIHsKKwkJTGlzdDxFZGdlPiBlZGdlTGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdChnZXRUaXRhbkdyYXBoKCkuZWRnZXMobnVsbCkpOworCQlMaXN0PFZlcnRleD4gdmVyTGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdChnZXRUaXRhbkdyYXBoKCkudmVydGljZXMobnVsbCkpOworCQlzZXRTbmFwc2hvdChuZXcgVGl0YW5TbmFwc2hvdChlZGdlTGlzdCwgdmVyTGlzdCkpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGl0YW5TbmFwc2hvdCB7CisJCUxpc3Q8RWRnZT4gZWRnZXM7CisJCUxpc3Q8VmVydGV4PiB2ZXJ0aWNlczsKKworCQlwdWJsaWMgTGlzdDxFZGdlPiBnZXRFZGdlcygpIHsKKwkJCXJldHVybiBlZGdlczsKKwkJfQorCisJCXB1YmxpYyBMaXN0PFZlcnRleD4gZ2V0VmVydGljZXMoKSB7CisJCQlyZXR1cm4gdmVydGljZXM7CisJCX0KKworCQlwcml2YXRlIFRpdGFuU25hcHNob3QoTGlzdDxFZGdlPiBlZGdlcywgTGlzdDxWZXJ0ZXg+IHZlcnRpY2VzKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5lZGdlcyA9IGVkZ2VzOworCQkJdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlc2V0VG9PcmlnaW5hbFNuYXBzaG90KCkgeworCisJCUxpc3Q8RWRnZT4gam9pbmVkRWRnZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxWZXJ0ZXg+IGpvaW5lZFZlcnRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRpdGFuU25hcHNob3Qgb3JpZ2luYWwgPSBnZXRTbmFwc2hvdCgpOworCQl0YWtlVGl0YW5TbmFwc2hvdCgpOworCQlUaXRhblNuYXBzaG90IGN1cnJlbnQgPSBnZXRTbmFwc2hvdCgpOworCisJCW9yaWdpbmFsLmdldEVkZ2VzKCkuc3RyZWFtKCkuZm9yRWFjaChlIC0+IGFkZElmSWRJbkxpc3QoZSwgY3VycmVudC5nZXRFZGdlcygpLCBqb2luZWRFZGdlcywgZTIgLT4gZTIuaWQoKSkpOworCQlvcmlnaW5hbC5nZXRWZXJ0aWNlcygpLnN0cmVhbSgpCisJCQkJLmZvckVhY2goZSAtPiBhZGRJZklkSW5MaXN0KGUsIGN1cnJlbnQuZ2V0VmVydGljZXMoKSwgam9pbmVkVmVydGljZXMsIGUyIC0+IGUyLmlkKCkpKTsKKworCQlMaXN0PEVkZ2U+IGVkZ2VzVG9SZW1vdmUgPSByZW1vdmVGcm9tTGlzdChjdXJyZW50LmdldEVkZ2VzKCksIGpvaW5lZEVkZ2VzLCBlMiAtPiBlMi5pZCgpKTsKKwkJTGlzdDxWZXJ0ZXg+IHZlcnRpY2VzVG9SZW1vdmUgPSByZW1vdmVGcm9tTGlzdChjdXJyZW50LmdldFZlcnRpY2VzKCksIGpvaW5lZFZlcnRpY2VzLCBlMiAtPiBlMi5pZCgpKTsKKworCQlMaXN0PEVkZ2U+IGVkZ2VzVG9BZGQgPSByZW1vdmVGcm9tTGlzdChvcmlnaW5hbC5nZXRFZGdlcygpLCBqb2luZWRFZGdlcywgZTIgLT4gZTIuaWQoKSk7CisJCUxpc3Q8VmVydGV4PiB2ZXJ0aWNlc1RvQWRkID0gcmVtb3ZlRnJvbUxpc3Qob3JpZ2luYWwuZ2V0VmVydGljZXMoKSwgam9pbmVkVmVydGljZXMsIGUyIC0+IGUyLmlkKCkpOworCisJCWlmIChlZGdlc1RvQWRkLmlzRW1wdHkoKSAmJiB2ZXJ0aWNlc1RvQWRkLmlzRW1wdHkoKSkgeworCQkJZWRnZXNUb1JlbW92ZS5zdHJlYW0oKS5mb3JFYWNoKGUgLT4gZS5yZW1vdmUoKSk7CisJCQl2ZXJ0aWNlc1RvUmVtb3ZlLnN0cmVhbSgpLmZvckVhY2godiAtPiB2LnJlbW92ZSgpKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSA8RWxlbWVudCwgSUQ+IExpc3Q8RWxlbWVudD4gcmVtb3ZlRnJvbUxpc3QoTGlzdDxFbGVtZW50PiBsaXN0VG9SZW1vdmVGcm9tLCBMaXN0PEVsZW1lbnQ+IGVsZW1lbnRzVG9SZW1vdmUsCisJCQlGdW5jdGlvbjxFbGVtZW50LCBJRD4gaWRHZXR0ZXIpIHsKKwkJU2V0PElEPiBpZFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJLy8gRmlsbCBUaGUgU2V0CisJCWVsZW1lbnRzVG9SZW1vdmUuc3RyZWFtKCkubWFwKGUgLT4gaWRHZXR0ZXIuYXBwbHkoZSkpLmZvckVhY2goZTIgLT4gaWRTZXQuYWRkKGUyKSk7CisJCXJldHVybiBsaXN0VG9SZW1vdmVGcm9tLnN0cmVhbSgpLmZpbHRlcihwIC0+ICFpZFNldC5jb250YWlucyhpZEdldHRlci5hcHBseShwKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwl9CisKKwlwcml2YXRlIDxFbGVtZW50LCBJRD4gdm9pZCBhZGRJZklkSW5MaXN0KEVsZW1lbnQgZSwgTGlzdDxFbGVtZW50PiBsaXN0VG9DaGVjaywgTGlzdDxFbGVtZW50PiBsaXN0VG9BZGRUbywKKwkJCUZ1bmN0aW9uPEVsZW1lbnQsIElEPiBpZEdldHRlcikgeworCQlTdHJlYW08RWxlbWVudD4gbWF0Y2hpbmdFbGVtZW50cyA9IGxpc3RUb0NoZWNrLnN0cmVhbSgpCisJCQkJLmZpbHRlcihwIC0+IGlkR2V0dGVyLmFwcGx5KGUpLmVxdWFscyhpZEdldHRlci5hcHBseShwKSkpOworCQlsaXN0VG9BZGRUby5hZGRBbGwobWF0Y2hpbmdFbGVtZW50cy5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKwl9CisKKwkvKioqKioqKioqKioqKioqKiBNQUlOICoqKioqKioqKioqKioqKiovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oInJ1bm5pbmcgdGVzdCBmcm9tIENMSSIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQlhcmdzID0gbmV3IFN0cmluZ1tdIHsgInVpLWNpLnhtbCIgfTsKKwkJU3RhcnRUZXN0Lm1haW4oYXJncyk7CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJcHJvdGVjdGVkIHZvaWQgc2V0QnJvd3NlckJlZm9yZVRlc3QoVXNlclJvbGVFbnVtIHJvbGUpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJzZXR1cCBiZWZvcmUgdGVzdCIpOworCQlHZW5lcmFsVUlVdGlscy5pbml0RHJpdmVyKCk7CisJCXNldERldlVybChyb2xlKTsKKwkJbG9naW5XaXRoVXNlcihyb2xlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcmwoKSB7CisJCWNkVXJsID0gY29uZmlnLmdldFVybCgpOworCQlzZXREZXZVcmwoZ2V0Um9sZSgpKTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9hZENyZWRlbnRpYWxzRmlsZSgpIHsKKwkJZmluYWwgU3RyaW5nIGNyZWRpbnRpYWxzRmlsZSA9IChTeXN0ZW0uZ2V0UHJvcGVydHkoImNyZWRlbnRpYWxzLmZpbGUiKSAhPSBudWxsKQorCQkJCT8gU3lzdGVtLmdldFByb3BlcnR5KCJjcmVkZW50aWFscy5maWxlIikgOiBDUkVERU5USUFMU19GSUxFOworCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWRlbnRpYWxzIGZpbGUgaXMgOiAiICsgY3JlZGludGlhbHNGaWxlKTsKKwkJRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbigKKwkJCQkoKSAtPiBjcmVkZW50aWFsc1lhbWxGaWxlTWFwID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIEZpbGVIYW5kbGluZy5wYXJzZVlhbWxGaWxlKGNyZWRpbnRpYWxzRmlsZSkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oY3JlZGVudGlhbHNZYW1sRmlsZU1hcC50b1N0cmluZygpKTsKKwkJcmV0dXJuIChNYXA8U3RyaW5nLCBTdHJpbmc+KSBjcmVkZW50aWFsc1lhbWxGaWxlTWFwOworCX0KKworCXByb3RlY3RlZCBVc2VyQ3JlZGVudGlhbHMgZ2V0VXNlckNyZWRlbnRpYWxzRnJvbUZpbGUoU3RyaW5nIHVzZXJSb2xlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjcmVkZW50aWFsc01hcCA9IChNYXA8U3RyaW5nLCBTdHJpbmc+KSBjcmVkZW50aWFsc1lhbWxGaWxlTWFwLmdldCh1c2VyUm9sZSk7CisJCVN0cmluZyB1c2VyID0gKFN0cmluZykgY3JlZGVudGlhbHNNYXAuZ2V0KCJ1c2VybmFtZSIpOworCQlTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKSBjcmVkZW50aWFsc01hcC5nZXQoInBhc3N3b3JkIik7CisJCVN0cmluZyBmaXJzdG5hbWUgPSAoU3RyaW5nKSBjcmVkZW50aWFsc01hcC5nZXQoImZpcnN0bmFtZSIpOworCQlTdHJpbmcgbGFzdG5hbWUgPSAoU3RyaW5nKSBjcmVkZW50aWFsc01hcC5nZXQoImxhc3RuYW1lIik7CisKKwkJcmV0dXJuIG5ldyBVc2VyQ3JlZGVudGlhbHModXNlciwgcGFzc3dvcmQsIGZpcnN0bmFtZSwgbGFzdG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIG5hdmlnYXRlVG9VcmwoU3RyaW5nIHVybCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJV2ViRHJpdmVyIGRyaXZlciA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5hdmlnYXRpbmcgdG8gVVJMIDoiICsgdXJsKTsKKwkJZHJpdmVyLm5hdmlnYXRlKCkudG8odXJsKTsKKwkJZHJpdmVyLm1hbmFnZSgpLndpbmRvdygpLm1heGltaXplKCk7CisJCWRyaXZlci5tYW5hZ2UoKS5kZWxldGVBbGxDb29raWVzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbG9naW5Ub1N5c3RlbShVc2VyQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpIHRocm93cyBFeGNlcHRpb24geworCisJCXNlbmRVc2VyQW5kUGFzc3dvcmRLZXlzKGNyZWRlbnRpYWxzKTsKKwkJV2ViRWxlbWVudCBzdWJtaXRCdXR0b24gPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5uYW1lKCJidG5TdWJtaXQiKSk7CisJCXN1Ym1pdEJ1dHRvbi5jbGljaygpOworCQlXZWJFbGVtZW50IGJ1dHRvbk9LID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkubmFtZSgic3VjY2Vzc09LIikpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRUcnVlKGJ1dHRvbk9LLmlzRGlzcGxheWVkKCkpOworCQlidXR0b25PSy5jbGljaygpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyaW5nIHRvIGRlc2lnbiBzdHVkaW8iKTsKKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCQlXZWJFbGVtZW50IGVudGVyVG9Vc2VyV29ya3NwYWNlQnV0dG9uID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnQoQnkueHBhdGgoIi8vYnV0dG9uW0BkYXRhLXRlc3RzLWlkPSdEZXNpZ24gU3R1ZGlvJ10iKSk7CisJCWVudGVyVG9Vc2VyV29ya3NwYWNlQnV0dG9uLmNsaWNrKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNlbmRVc2VyQW5kUGFzc3dvcmRLZXlzKFVzZXJDcmVkZW50aWFscyB1c2VySWQpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJMb2dpbiB0byBzeXN0ZW0gd2l0aCB1c2VyIDogIiArIHVzZXJJZC5nZXRVc2VySWQoKSk7CisJCVdlYkVsZW1lbnQgdXNlck5hbWVUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkubmFtZSgidXNlcmlkIikpOworCQl1c2VyTmFtZVRleHRib3guc2VuZEtleXModXNlcklkLmdldFVzZXJJZCgpKTsKKwkJV2ViRWxlbWVudCBwYXNzd29yZFRleHRib3ggPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5uYW1lKCJwYXNzd29yZCIpKTsKKwkJcGFzc3dvcmRUZXh0Ym94LnNlbmRLZXlzKHVzZXJJZC5nZXRQYXNzd29yZCgpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKwkJU3RyaW5nIHVybDsKKwkJZmluYWwgQ2xlYW5UeXBlRW51bSB3b3JrTW9kZSA9IGdldENsZWFuTW9kZSgpOworCQlzd2l0Y2ggKHdvcmtNb2RlKSB7CisJCWNhc2UgRlVMTDogeworCQkJdXJsID0gZGV2VXJsOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQQVJUSUFMOiB7CisJCQl1cmwgPSBkZXZVcmw7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE5PTkU6IHsKKwkJCXVybCA9IGNkVXJsOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogeworCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKHdvcmtNb2RlLm5hbWUoKSk7CisJCX0KKworCQl9CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldERldlVybChVc2VyUm9sZUVudW0gcm9sZSkgeworCQlTdHJpbmcgdXJsID0gU2V0dXBDRFRlc3QuZGV2VXJsOworCQlzd2l0Y2ggKHJvbGUpIHsKKwkJY2FzZSBBRE1JTjogeworCQkJdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODE4MS9zZGMxL3Byb3h5LWFkbWluMSMvZGFzaGJvYXJkIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgREVTSUdORVI6IHsKKwkJCXVybCA9ICJodHRwOi8vbG9jYWxob3N0OjgxODEvc2RjMS9wcm94eS1kZXNpZ25lcjEjL2Rhc2hib2FyZCI7CisJCQkvLyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdDo5MDAwLyMvZGFzaGJvYXJkIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgR09WRVJOT1I6IHsKKwkJCXVybCA9ICJodHRwOi8vbG9jYWxob3N0OjgxODEvc2RjMS9wcm94eS1nb3Zlcm5vcjEjL2Rhc2hib2FyZCI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QUzogeworCQkJdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODE4MS9zZGMxL3Byb3h5LW9wczEjL2Rhc2hib2FyZCI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFRFU1RFUjogeworCQkJdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODE4MS9zZGMxL3Byb3h5LXRlc3RlcjEjL2Rhc2hib2FyZCI7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQlicmVhazsKKwkJfQorCQl9CisJCVNldHVwQ0RUZXN0LmRldlVybCA9IHVybDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbmZpZyBnZXRDb25maWcoKSB7CisJCXJldHVybiBjb25maWc7CisJfQorCisJcHJpdmF0ZSBVc2VyIHVzZXI7CisKKwlwdWJsaWMgdm9pZCBsb2dpbldpdGhVc2VyKFVzZXJSb2xlRW51bSByb2xlKSB7CisKKwkJc2V0VXNlcihyb2xlKTsKKwkJU3RyaW5nIHVybCA9IGdldFVybCgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVSTCBpcyA6ICIgKyB1cmwpOworCQl0cnkgeworCQkJbmF2aWdhdGVUb1VybCh1cmwpOworCQkJaWYgKHVybC5jb250YWlucygiaHR0cHM6Ly93d3cuZS1hY2Nlc3MiKSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZ29pbmcgdG8gdXBkYXRlIGRlc2lnbmVyIHVzZXIgdG8gbWVjaElEcyBmb3JtLi4uIik7CisJCQkJVXNlckNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzID0gZ2V0VXNlckNyZWRlbnRpYWxzRnJvbUZpbGUocm9sZS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQkJbG9naW5Ub1N5c3RlbShjcmVkZW50aWFscyk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZXRVc2VyKFVzZXJSb2xlRW51bSByb2xlKSB7CisJCXVzZXIgPSBuZXcgVXNlcigpOworCQl1c2VyLnNldFVzZXJJZChyb2xlLmdldFVzZXJJZCgpKTsKKwkJdXNlci5zZXRGaXJzdE5hbWUocm9sZS5nZXRGaXJzdE5hbWUoKSk7CisJCXVzZXIuc2V0Um9sZShyb2xlLm5hbWUoKSk7CisJfQorCisJLyoqCisJICogQ3VycmVudCBVc2VyIFJvbGUKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFVzZXJSb2xlRW51bSBnZXRSb2xlKCkgeworCQlyZXR1cm4gVXNlclJvbGVFbnVtLkRFU0lHTkVSOworCX0KKworCS8qKgorCSAqIFRvIGNoYW5nZSBjbGVhbiB0eXBlIHVwZGF0ZSBjb25maWd1cmF0aW9uLjxicj4KKwkgKiBEbyBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisJICogCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDbGVhblR5cGVFbnVtIGdldENsZWFuTW9kZSgpIHsKKwkJcmV0dXJuIGNsZWFuVHlwZTsKKwl9CisKKwlwdWJsaWMgVXNlciBnZXRVc2VyKCkgeworCQlyZXR1cm4gdXNlcjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBxdWl0QW5kUmVMb2dpbihVc2VyUm9sZUVudW0gcm9sZSkgeworCQlxdWl0QWZ0ZXJUZXN0KCk7CisJCXNldEJyb3dzZXJCZWZvcmVUZXN0KHJvbGUpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKDMwKTsKKwl9CisKKwlwdWJsaWMgVGl0YW5TbmFwc2hvdCBnZXRTbmFwc2hvdCgpIHsKKwkJcmV0dXJuIHNuYXBzaG90OworCX0KKworCXB1YmxpYyB2b2lkIHNldFNuYXBzaG90KFRpdGFuU25hcHNob3Qgc25hcHNob3QpIHsKKwkJdGhpcy5zbmFwc2hvdCA9IHNuYXBzaG90OworCX0KKworCXB1YmxpYyBzdGF0aWMgVGl0YW5HcmFwaCBnZXRUaXRhbkdyYXBoKCkgeworCQlyZXR1cm4gdGl0YW5HcmFwaDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL1NlcnZpY2VCYXNpY1Rlc3RzLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9TZXJ2aWNlQmFzaWNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmRlODYKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9TZXJ2aWNlQmFzaWNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5DYW52YXNFbGVtZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkNhbnZhc01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLkxlZnRQYW5lbENhbnZhc0l0ZW1zOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5iYXNlLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLkFydGlmYWN0VUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5GaWxlSGFuZGxpbmc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuUmVzb3VyY2VVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLlJlc3RDRFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLlNlcnZpY2VVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudmVyaWZpY2F0b3IuU2VydmljZVZlcmlmaWNhdG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudmVyaWZpY2F0b3IuVmZWZXJpZmljYXRvcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0VHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlQmFzaWNUZXN0cyBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVNlcnZpY2UoKSB7CisJCVNlcnZpY2VSZXFEZXRhaWxzIGNyZWF0ZVNlcnZpY2VJblVJID0gU2VydmljZVVJVXRpbHMuY3JlYXRlU2VydmljZUluVUkoZ2V0VXNlcigpKTsKKwkJU2VydmljZVZlcmlmaWNhdG9yLnZlcmlmeVNlcnZpY2VDcmVhdGVkKGNyZWF0ZVNlcnZpY2VJblVJLCBnZXRVc2VyKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExpbmtUd29SSSgpIHsKKworCQkvLyBjcmVhdGUgMXN0IFZGCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZU9uZSA9IFJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZUluVUkoZ2V0VXNlcigpKTsKKwkJYXNzZXJ0VHJ1ZShSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZU9uZSkuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisJCS8vIGFkZCBMb2FkQmFsYW5jZXIgdG8gcmVzb3VyY2UKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQ09NUE9TSVRJT04pOworCQlDYW52YXNNYW5hZ2VyIGNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKwkJY2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXMoTGVmdFBhbmVsQ2FudmFzSXRlbXMuT0JKRUNUX1NUT1JBR0UpOworCQlHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisKKwkJLy8gY3JlYXRlIDJuZCBWRgorCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VUd28gPSBSZXNvdXJjZVVJVXRpbHMuY3JlYXRlUmVzb3VyY2VJblVJKGdldFVzZXIoKSk7CisJCWFzc2VydFRydWUoUmVzdENEVXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2VUd28pLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCQkvLyBhZGQgT2JqZWN0U3RvcmFnZSB0byByZXNvdXJjZQorCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bS5DT01QT1NJVElPTik7CisJCWNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKwkJY2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXMoTGVmdFBhbmVsQ2FudmFzSXRlbXMuTE9BRF9CQUxBTkNFUik7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNrSW4oKTsKKworCQkvLyBjcmVhdGUgc2VydmljZQorCQlTZXJ2aWNlUmVxRGV0YWlscyBjcmVhdGVTZXJ2aWNlSW5VSSA9IFNlcnZpY2VVSVV0aWxzLmNyZWF0ZVNlcnZpY2VJblVJKGdldFVzZXIoKSk7CisJCS8vIFZlcmlmeSBTZXJ2aWNlIGlzIENyZWF0ZWQKKwkJU2VydmljZVZlcmlmaWNhdG9yLnZlcmlmeVNlcnZpY2VDcmVhdGVkKGNyZWF0ZVNlcnZpY2VJblVJLCBnZXRVc2VyKCkpOworCisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLkNPTVBPU0lUSU9OKTsKKwkJY2FudmFzTWFuYWdlciA9IENhbnZhc01hbmFnZXIuZ2V0Q2FudmFzTWFuYWdlcigpOworCisJCS8vIGFkZGluZyB0d28gcmVzb3VyY2UgaW5zdGFuY2VzCisJCUNhbnZhc0VsZW1lbnQgdmZPbmUgPSBjYW52YXNNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhyZXNvdXJjZU9uZS5nZXROYW1lKCkpOworCisJCUNhbnZhc0VsZW1lbnQgdmZUd28gPSBjYW52YXNNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhyZXNvdXJjZVR3by5nZXROYW1lKCkpOworCQkvLyBsaW5rIGVsZW1lbnRzCisJCWNhbnZhc01hbmFnZXIubGlua0VsZW1lbnRzKHZmT25lLCB2ZlR3byk7CisKKwkJLy8gY2hlY2sgcmVzdWx0cworCQlTZXJ2aWNlVmVyaWZpY2F0b3IudmVyaWZ5U2VydmljZUNyZWF0ZWQoY3JlYXRlU2VydmljZUluVUksIGdldFVzZXIoKSk7CisJCVNlcnZpY2VWZXJpZmljYXRvci52ZXJpZnlMaW5rQ3JlYXRlZChjcmVhdGVTZXJ2aWNlSW5VSSwgZ2V0VXNlcigpKTsKKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHRlc3RzIHRoZSBmb2xsb3dpbmc6IDxicj4KKwkgKiAxLiBJbXBvcnQgb2YgVkYgPGJyPgorCSAqIDIuIENlcnRpZmljYXRpb24gT2YgVmYgPGJyPgorCSAqIDMuIEFkZGluZyBkZXBsb3ltZW50IGFydGlmYWN0IHRvIFZGIDxicj4KKwkgKiA0LiBDcmVhdGlvbiBvZiBTZXJ2aWNlIDxicj4KKwkgKiA1LiBBZGRpbmcgVmYgaW5zdGFuY2UgdG8gU2VydmljZSA8YnI+CisJICogNi4gU2VydmljZSBDZXJ0aWZpY2F0aW9uIDxicj4KKwkgKiA3LiBBcHByb3ZpbmcgU2VydmljZSB0byBkaXN0cmlidXRpb24gYnkgR292ZXJub3IgPGJyPgorCSAqIDguIE1ha2luZyBzdXJlIHNlcnZpY2UgaXMgcmVhZHkgdG8gZGlzdHJpYnV0ZSBieSBvcHMgPGJyPgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJ1aWxkU2VydmljZUZvckRpc3RyaWJ1dGlvbigpIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydGVkVmYgPSBSZXNvdXJjZVVJVXRpbHMuaW1wb3J0VmZJblVJKGdldFVzZXIoKSwgRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpLAorCQkJCSJ2YWxpZF92Zi5jc2FyIik7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoMjApOworCQkvLyBWZXJpZnkgSW1wb3J0CisJCVZmVmVyaWZpY2F0b3IudmVyaWZ5UmVzb3VyY2VJc0NyZWF0ZWQoaW1wb3J0ZWRWZik7CisKKwkJLy8gQ3JlYXRlIERlcGxveW1lbnQgQXJ0aWZhY3QKKwkJQXJ0aWZhY3RVSVV0aWxzLmNyZWF0ZURlcGxveW1lbnRBcnRpZmFjdE9uVmYoRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpICsgIm15WWFuZy54bWwiLAorCQkJCUFydGlmYWN0VHlwZUVudW0uWUFOR19YTUwpOworCQlWZlZlcmlmaWNhdG9yLnZlcmlmeVJlc291cmNlQ29udGFpbnNEZXBsb3ltZW50QXJ0aWZhY3RzKGltcG9ydGVkVmYsCisJCQkJQXJyYXlzLmFzTGlzdChuZXcgQXJ0aWZhY3RUeXBlRW51bVtdIHsgQXJ0aWZhY3RUeXBlRW51bS5ZQU5HX1hNTCB9KSk7CisKKwkJLy8gU3VibWl0IEZvciBUZXN0aW5nIFByb2Nlc3MgVkYKKwkJR2VuZXJhbFVJVXRpbHMuc3VibWl0Rm9yVGVzdGluZ0VsZW1lbnQoaW1wb3J0ZWRWZi5nZXROYW1lKCkpOworCisJCS8vIENlcnRpZnkgVGhlIFZGCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlSZXNvdXJjZVVJVXRpbHMudGVzdEFuZEFjY2VwdEVsZW1lbnQoaW1wb3J0ZWRWZik7CisKKwkJLy8gVmVyaWZ5IENlcnRpZmljYXRpb24KKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlWZlZlcmlmaWNhdG9yLnZlcmlmeVJlc291cmNlSXNDZXJ0aWZpZWQoaW1wb3J0ZWRWZik7CisKKwkJLy8gQ3JlYXRlIFNlcnZpY2UKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKwkJU2VydmljZVJlcURldGFpbHMgY3JlYXRlU2VydmljZUluVUkgPSBTZXJ2aWNlVUlVdGlscy5jcmVhdGVTZXJ2aWNlSW5VSShnZXRVc2VyKCkpOworCQlTZXJ2aWNlVmVyaWZpY2F0b3IudmVyaWZ5U2VydmljZUNyZWF0ZWQoY3JlYXRlU2VydmljZUluVUksIGdldFVzZXIoKSk7CisKKwkJLy8gRHJhZyB0aGUgVkYgVG8gdGhlIFNlcnZpY2UKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQ09NUE9TSVRJT04pOworCQlDYW52YXNNYW5hZ2VyIGNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKwkJY2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXMoaW1wb3J0ZWRWZi5nZXROYW1lKCkpOworCisJCS8vIFN1Ym1pdCBGb3IgVGVzdGluZyBQcm9jZXNzIFNlcnZpY2UKKwkJR2VuZXJhbFVJVXRpbHMuc3VibWl0Rm9yVGVzdGluZ0VsZW1lbnQobnVsbCk7CisKKwkJLy8gQ2VydGlmeSBUaGUgU2VydmljZQorCQlxdWl0QW5kUmVMb2dpbihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJUmVzb3VyY2VVSVV0aWxzLnRlc3RBbmRBY2NlcHRFbGVtZW50KGNyZWF0ZVNlcnZpY2VJblVJKTsKKwkJU2VydmljZVZlcmlmaWNhdG9yLnZlcmlmeVNlcnZpY2VDZXJ0aWZpZWQoY3JlYXRlU2VydmljZUluVUksIGdldFVzZXIoKSk7CisKKwkJLy8gQXBwcm92ZSB3aXRoIGdvdmVybm9yCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5HT1ZFUk5PUik7CisJCVNlcnZpY2VVSVV0aWxzLmFwcHJvdmVTZXJ2aWNlRm9yRGlzdHJpYnV0aW9uKGNyZWF0ZVNlcnZpY2VJblVJKTsKKworCQkvLyBMb2cgaW4gd2l0aCBPcHMgYW5kIHZlcmlmeSB0aGF0IGNhbiBkaXN0cmlidXRlCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5PUFMpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoY3JlYXRlU2VydmljZUluVUkuZ2V0TmFtZSgpKS5jbGljaygpOworCQlXZWJFbGVtZW50IGRpc3RyaWJ1dGVXZWJFbGVtZW50ID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkxpZmVDeWxlQ2hhbmdlQnV0dG9ucy5ESVNUUklCVVRFLmdldFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKGRpc3RyaWJ1dGVXZWJFbGVtZW50ICE9IG51bGwpOworCisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9TZXJ2aWNlSW5wdXRzVGVzdHMuamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZXhlY3V0ZS9zZXJ2aWNlL1NlcnZpY2VJbnB1dHNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZThlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvc2VydmljZS9TZXJ2aWNlSW5wdXRzVGVzdHMuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUuc2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RmFsc2U7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5DYW52YXNFbGVtZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkNhbnZhc01hbmFnZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLkJyZWFkY3J1bWJzQnV0dG9uc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uSW5wdXRzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5iYXNlLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLkZpbGVIYW5kbGluZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuU2VydmljZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy52ZXJpZmljYXRvci5TZXJ2aWNlVmVyaWZpY2F0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2VydmljZUlucHV0c1Rlc3RzIGV4dGVuZHMgU2V0dXBDRFRlc3QgeworCQorCXB1YmxpYyBTdHJpbmcgc2VydmljZU5hbWUgPSAiIjsKKworCUBUZXN0CisJcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RpbmdJbnB1dEFuZEFkZGluZ0l0VG9UaGVTZXJ2aWNlKCkgeworCQlTZXJ2aWNlSW5wdXRzVGVzdHNTZXRVcCgpOwkKKwkJCisJCWFzc2VydFRydWUoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKElucHV0c0VudW0uRklSU1RfSU5QVVRfQ0hFQ0tCT1guZ2V0VmFsdWUoKSkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJkaXNhYmxlZCIpKTsKKwkJYXNzZXJ0VHJ1ZShHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KElucHV0c0VudW0uU0VSVklDRV9JTlBVVC5nZXRWYWx1ZSgpKSk7CisJfQorCQorCUBUZXN0CisJcHJpdmF0ZSB2b2lkIHRlc3REZWxldGluZ0FuSW5wdXRGcm9tVGhlU2VydmljZSgpIHsKKwkJU2VydmljZUlucHV0c1Rlc3RzU2V0VXAoKTsKKwkJCisJCS8vIGNsaWNraW5nIG9uIHRoZSBkZWxldGUgaW5wdXQgYnV0dG9uIGFuZCBhY2NlcHRpbmcgdGhlIGRlbGV0ZQorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShJbnB1dHNFbnVtLkRFTEVURV9JTlBVVC5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShNb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpLmNsaWNrKCk7CQorCQkKKwkJYXNzZXJ0RmFsc2UoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKElucHV0c0VudW0uRklSU1RfSU5QVVRfQ0hFQ0tCT1guZ2V0VmFsdWUoKSkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJkaXNhYmxlZCIpKTsKKwkJYXNzZXJ0RmFsc2UoR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudChJbnB1dHNFbnVtLlNFUlZJQ0VfSU5QVVQuZ2V0VmFsdWUoKSkpOwkJCisJfQorCQorCUBUZXN0CisJcHJpdmF0ZSB2b2lkIHRlc3RDaGVja2luZ0luVGhlU2VydmljZUFuZEJ1dHRvbnNBcmVEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTZXJ2aWNlSW5wdXRzVGVzdHNTZXRVcCgpOworCQkKKwkJLy8gQ2hlY2tpbmcgaW4gdGhlIHNlcnZpY2UgYW5kIGFjY2Vzc2luZyBpdCBhZ2FpbiBpbiB0aGUgaG9tZQorCQlHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsb3NlTm90aWZpY2F0aW4oKTsKKwkJR2VuZXJhbFVJVXRpbHMuZmluZENvbXBvbmVudEFuZENsaWNrKHNlcnZpY2VOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uSU5QVVRTKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoSW5wdXRzRW51bS5WRl9JTlNUQU5DRS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkKKwkJYXNzZXJ0VHJ1ZShHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoSW5wdXRzRW51bS5GSVJTVF9JTlBVVF9DSEVDS0JPWC5nZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUoImNsYXNzIikuY29udGFpbnMoImRpc2FibGVkIikpOworCQlhc3NlcnRUcnVlKEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShJbnB1dHNFbnVtLlNFQ09ORF9JTlBVVF9DSEVDS0JPWC5nZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUoImNsYXNzIikuY29udGFpbnMoImRpc2FibGVkIikpOworCQlhc3NlcnRUcnVlKEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShJbnB1dHNFbnVtLkRFTEVURV9JTlBVVC5nZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUoImNsYXNzIikuY29udGFpbnMoImRpc2FibGVkIikpOworCX0KKwkKKwlAVGVzdAorCXByaXZhdGUgdm9pZCB0ZXN0SW5wdXRzU2FuaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNlcnZpY2VJbnB1dHNUZXN0c1NldFVwKCk7CQkKKwkJCisJCWFzc2VydFRydWUoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKElucHV0c0VudW0uRklSU1RfSU5QVVRfQ0hFQ0tCT1guZ2V0VmFsdWUoKSkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJkaXNhYmxlZCIpKTsKKwkJYXNzZXJ0VHJ1ZShHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KElucHV0c0VudW0uU0VSVklDRV9JTlBVVC5nZXRWYWx1ZSgpKSk7CisJCQorCQkvLyBjbGlja2luZyBvbiB0aGUgZGVsZXRlIGlucHV0IGJ1dHRvbiBhbmQgYWNjZXB0aW5nIHRoZSBkZWxldGUKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoSW5wdXRzRW51bS5ERUxFVEVfSU5QVVQuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoTW9kYWxJdGVtcy5PSy5nZXRWYWx1ZSgpKS5jbGljaygpOwkKKwkJCisJCWFzc2VydEZhbHNlKEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShJbnB1dHNFbnVtLkZJUlNUX0lOUFVUX0NIRUNLQk9YLmdldFZhbHVlKCkpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb250YWlucygiZGlzYWJsZWQiKSk7CisJCWFzc2VydEZhbHNlKEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoSW5wdXRzRW51bS5TRVJWSUNFX0lOUFVULmdldFZhbHVlKCkpKTsKKwkJCisJCS8vIGFkZGluZyB0aGUgaW5wdXQgdG8gdGhlIHNlcnZpY2UgYWdhaW4KKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoSW5wdXRzRW51bS5GSVJTVF9JTlBVVF9DSEVDS0JPWC5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShJbnB1dHNFbnVtLkFERF9JTlBVVFNfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQorCQkvLyBDaGVja2luZyBpbiB0aGUgc2VydmljZSBhbmQgYWNjZXNzaW5nIGl0IGFnYWluIGluIHRoZSBob21lCisJCUdlbmVyYWxVSVV0aWxzLmNoZWNrSW4oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xvc2VOb3RpZmljYXRpbigpOworCQlHZW5lcmFsVUlVdGlscy5maW5kQ29tcG9uZW50QW5kQ2xpY2soc2VydmljZU5hbWUpOworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bS5JTlBVVFMpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShJbnB1dHNFbnVtLlZGX0lOU1RBTkNFLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQorCQlhc3NlcnRUcnVlKEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShJbnB1dHNFbnVtLkZJUlNUX0lOUFVUX0NIRUNLQk9YLmdldFZhbHVlKCkpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb250YWlucygiZGlzYWJsZWQiKSk7CisJCWFzc2VydFRydWUoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKElucHV0c0VudW0uU0VDT05EX0lOUFVUX0NIRUNLQk9YLmdldFZhbHVlKCkpLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb250YWlucygiZGlzYWJsZWQiKSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBTZXJ2aWNlSW5wdXRzVGVzdHNTZXRVcCgpIHsKKwkJLy8gY3JlYXRlIHZmCisJCVN0cmluZyBmaWxlUGF0aCA9IEZpbGVIYW5kbGluZy5nZXRSZXNvdXJjZXNGaWxlc1BhdGgoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gInNlcnZpY2Vfd2l0aF9pbnB1dHMuY3NhciI7CisJCVJlc291cmNlUmVxRGV0YWlscyBpbXBvcnRWZlJFc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5pbXBvcnRWZkluVUlXaXRob3V0Q2hlY2tpbihnZXRVc2VyKCksIGZpbGVQYXRoLCBmaWxlTmFtZSk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xvc2VOb3RpZmljYXRpbigpOworCQlHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsb3NlTm90aWZpY2F0aW4oKTsKKwkJCisJCS8vIGNyZWF0ZSBzZXJ2aWNlCisJCVNlcnZpY2VSZXFEZXRhaWxzIGNyZWF0ZVNlcnZpY2VJblVJID0gU2VydmljZVVJVXRpbHMuY3JlYXRlU2VydmljZUluVUkoZ2V0VXNlcigpKTsKKwkJU2VydmljZVZlcmlmaWNhdG9yLnZlcmlmeVNlcnZpY2VDcmVhdGVkKGNyZWF0ZVNlcnZpY2VJblVJLCBnZXRVc2VyKCkpOworCQlzZXJ2aWNlTmFtZSA9IGNyZWF0ZVNlcnZpY2VJblVJLmdldE5hbWUoKTsKKwkJCisJCS8vIGdvIHRvIGNvbXBvc2l0aW9uCisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLkNPTVBPU0lUSU9OKTsKKwkJCisJCS8vIGRyYWcgdmYgaW50byBjYW52YXMKKwkJQ2FudmFzTWFuYWdlciBjYW52YXNNYW5hZ2VyID0gQ2FudmFzTWFuYWdlci5nZXRDYW52YXNNYW5hZ2VyKCk7CisJCUNhbnZhc0VsZW1lbnQgY2FudmFzRWxlbWVudCA9IGNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKGltcG9ydFZmUkVzb3VyY2VJblVJLmdldE5hbWUoKSk7CisJCWNhbnZhc01hbmFnZXIuc2VsZWN0RWxlbWVudEZyb21DYW52YXMoY2FudmFzRWxlbWVudCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJCisJCS8vIG1vdmluZyB0byBpbnB1dHMgdmlldworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShCcmVhZGNydW1ic0J1dHRvbnNFbnVtLkNPTVBPTkVOVC5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bS5JTlBVVFMpOworCQkKKwkJLy8gYWRkaW5nIHRoZSBpbnB1dCB0byB0aGUgc2VydmljZQorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShJbnB1dHNFbnVtLlZGX0lOU1RBTkNFLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yQ2xpY2thYmxlKElucHV0c0VudW0uRklSU1RfSU5QVVRfQ0hFQ0tCT1guZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoSW5wdXRzRW51bS5BRERfSU5QVVRTX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCX0JCit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvdmYvVmZCYXNpY1Rlc3RzLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvdmYvVmZCYXNpY1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4YWM5MwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZXhlY3V0ZS92Zi9WZkJhc2ljVGVzdHMuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUudmY7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPbkV4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkNhbnZhc0VsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuQ2FudmFzTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5DcmVhdGVBbmRVcGRhdGVTdGVwc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uTGVmdFBhbmVsQ2FudmFzSXRlbXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLmJhc2UuU2V0dXBDRFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuQXJ0aWZhY3RVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLkZpbGVIYW5kbGluZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuUmVzdENEVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy52ZXJpZmljYXRvci5WZlZlcmlmaWNhdG9yOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXNwSmF2YU9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkNvbnZlcnRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBWZkJhc2ljVGVzdHMgZXh0ZW5kcyBTZXR1cENEVGVzdCB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRWZlRhYmxlQ29sdW1ucygpIHsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk9uQm9hcmRpbmdUYWJsZS5PUEVOX01PREFMX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCisJCWFzc2VydFRydWUoR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk9uQm9hcmRpbmdUYWJsZS5WRU5ET1JfSEVBREVSX0NPTC5nZXRWYWx1ZSgpKSAhPSBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uT25Cb2FyZGluZ1RhYmxlLk5BTUVfSEVBREVSX0NPTC5nZXRWYWx1ZSgpKSAhPSBudWxsKTsKKwkJYXNzZXJ0VHJ1ZShHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uT25Cb2FyZGluZ1RhYmxlLkNBVEVHT1JZX0hFQURFUl9DT0wuZ2V0VmFsdWUoKSkgIT0gbnVsbCk7CisKKwkJYXNzZXJ0VHJ1ZShHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uT25Cb2FyZGluZ1RhYmxlLlZFUlNJT05fSEVBREVSX0NPTC5nZXRWYWx1ZSgpKSAhPSBudWxsKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWZkNyZWF0ZWRGcm9tQ3NhcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjcmVhdGUgdmYKKwkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAiU2FtcGxlX0NTQVIuY3NhciI7CisJCVJlc291cmNlUmVxRGV0YWlscyBpbXBvcnRWZlJlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5pbXBvcnRWZkluVUlXaXRob3V0Q2hlY2tpbihnZXRVc2VyKCksIGZpbGVQYXRoLAorCQkJCWZpbGVOYW1lKTsKKwkJLy8gdXBkYXRlIGNzYXIKKwkJZmlsZU5hbWUgPSAiU2FtcGxlX0NTQVIyLmNzYXIiOworCQlSZXNvdXJjZVVJVXRpbHMudXBkYXRlVmZDc2FyKGZpbGVQYXRoLCBmaWxlTmFtZSk7CisJCVZmVmVyaWZpY2F0b3IudmVyaWZ5TnVtT2ZDb21wb25lbnRJbnN0YW5jZXMoaW1wb3J0VmZSZXNvdXJjZUluVUksIDQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEltcG9ydFZmKCkgeworCQlTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJTYW1wbGVfQ1NBUi5jc2FyIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydFZmUmVzb3VyY2VJblVJID0gUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmSW5VSShnZXRVc2VyKCksIGZpbGVQYXRoLCBmaWxlTmFtZSk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJYXNzZXJ0VHJ1ZShSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShpbXBvcnRWZlJlc291cmNlSW5VSSkuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmYoKSB7CisJCVJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUkgPSBSZXNvdXJjZVVJVXRpbHMuY3JlYXRlUmVzb3VyY2VJblVJKGdldFVzZXIoKSk7CisJCWFzc2VydFRydWUoUmVzdENEVXRpbHMuZ2V0UmVzb3VyY2UoY3JlYXRlUmVzb3VyY2VJblVJKS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWxldGVJbnN0YW5jZUZyb21DYW52YXMoKSB7CisJCVJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUkgPSBSZXNvdXJjZVVJVXRpbHMuY3JlYXRlUmVzb3VyY2VJblVJKGdldFVzZXIoKSk7CisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLkNPTVBPU0lUSU9OKTsKKworCQlDYW52YXNNYW5hZ2VyIGNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKworCQljYW52YXNNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhMZWZ0UGFuZWxDYW52YXNJdGVtcy5CTE9DS19TVE9SQUdFKTsKKwkJQ2FudmFzRWxlbWVudCBjb21wdXRlRWxlbWVudCA9IGNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKExlZnRQYW5lbENhbnZhc0l0ZW1zLkNPTVBVVEUpOworCQlWZlZlcmlmaWNhdG9yLnZlcmlmeU51bU9mQ29tcG9uZW50SW5zdGFuY2VzKGNyZWF0ZVJlc291cmNlSW5VSSwgMik7CisJCWNhbnZhc01hbmFnZXIuZGVsZXRlRWxlbWVudEZyb21DYW52YXMoY29tcHV0ZUVsZW1lbnQpOworCQlWZlZlcmlmaWNhdG9yLnZlcmlmeU51bU9mQ29tcG9uZW50SW5zdGFuY2VzKGNyZWF0ZVJlc291cmNlSW5VSSwgMSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbnN0YW5jZUF0dHJpYnV0ZVZhbHVlKCkgeworCQkvLyBjcmVhcmUgdmZjIHdpdGggYXR0cnMKKwkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAiVkZDV2l0aEF0dHJpYnV0ZXMueW1sIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydFZmY1Jlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5pbXBvcnRWZmNJblVJKGdldFVzZXIoKSwgZmlsZVBhdGgsIGZpbGVOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQkvLyBjcmVhdGUgdmYKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZUluVUkoZ2V0VXNlcigpKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQ09NUE9TSVRJT04pOworCQkvLyBhZGQgdmZjIHRvIGNhbnZhcworCQlDYW52YXNNYW5hZ2VyIGNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKwkJQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50ID0gY2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXMoaW1wb3J0VmZjUmVzb3VyY2VJblVJLmdldE5hbWUoKSk7CisJCWNhbnZhc01hbmFnZXIuc2VsZWN0RWxlbWVudEZyb21DYW52YXMoY2FudmFzRWxlbWVudCk7CisJCS8vIGVkaXQgdmFsdWUgb2YgdmZjIGF0dHIKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlJpZ2h0QmFyLlBST1BFUlRJRVNfQU5EX0FUVFJJQlVURVMuZ2V0VmFsdWUoKSkKKwkJCQkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlJpZ2h0QmFyLk1ZQVRUUl9BVFRSX0ZST01fTElTVC5nZXRWYWx1ZSgpKS5jbGljaygpOworCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVGb3JtLkRFRkFVTFRfVkFMX0ZJRUxELmdldFZhbHVlKCkpCisJCQkJLnNlbmRLZXlzKCIyIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVGb3JtLkRPTkVfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCVN0cmluZyBuZXdWYWx1ZSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5SaWdodEJhci5NWUFUVFJfQVRUUl9WQUxVRV9GUk9NX0xJU1QuZ2V0VmFsdWUoKSkuZ2V0VGV4dCgpOworCQlhc3NlcnRFcXVhbHMoIjIiLCBuZXdWYWx1ZSk7CisJfQorCisJQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorCXB1YmxpYyB2b2lkIHRlc3RBZGRJbmZvbXJhdGluYWxBcnRpZmFjdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVJlcURldGFpbHMgY3JlYXRlUmVzb3VyY2VJblVJID0gUmVzb3VyY2VVSVV0aWxzLmNyZWF0ZVJlc291cmNlSW5VSShnZXRVc2VyKCkpOworCisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLklORk9STUFUSU9OX0FSVElGQUNUKTsKKworCQlBcnRpZmFjdFJlcURldGFpbHMgaW5mb3JtYXRpb25hbEFydGlmYWN0ID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFydGlmYWN0KCk7CisJCWZpbmFsIFN0cmluZyBGSUxFX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyAiXFxzcmNcXG1haW5cXHJlc291cmNlc1xcRmlsZXNcXCI7CisJCWZpbmFsIFN0cmluZyBGSUxFX05BTUUgPSAiVmFsaWRfdG9zY2FfTXljb21wdXRlLnltbCI7CisKKwkJQXJ0aWZhY3RVSVV0aWxzLmFkZEluZm9ybWF0aW9uQXJ0aWZhY3QoaW5mb3JtYXRpb25hbEFydGlmYWN0LCBGSUxFX1BBVEggKyBGSUxFX05BTUUsCisJCQkJRGF0YVRlc3RJZEVudW0uSW5mb3JtYXRpb25hbEFydGlmYXRjcy5GRUFUVVJFUyk7CisJCUFydGlmYWN0VUlVdGlscy5hZGRJbmZvcm1hdGlvbkFydGlmYWN0KGluZm9ybWF0aW9uYWxBcnRpZmFjdCwgRklMRV9QQVRIICsgRklMRV9OQU1FLAorCQkJCURhdGFUZXN0SWRFbnVtLkluZm9ybWF0aW9uYWxBcnRpZmF0Y3MuQ0FQQUNJVFkpOworCisJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gUmVzdENEVXRpbHMuZ2V0UmVzb3VyY2UoY3JlYXRlUmVzb3VyY2VJblVJKTsKKwkJYXNzZXJ0RXF1YWxzKCJEaWQgbm90IHN1Y2NlZWQgdG8gZ2V0IHJlc291cmNlIGFmdGVyIGNyZWF0ZSIsIEh0dHBTdGF0dXMuU0NfT0ssCisJCQkJZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBhcnRpZmFjdHNMaXN0RnJvbVJlc3BvbnNlID0gQXJ0aWZhY3RVSVV0aWxzCisJCQkJLmdldEFydGlmYWN0c0xpc3RGcm9tUmVzcG9uc2UoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAiYXJ0aWZhY3RzIik7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gYXJ0aWZhY3RzTGlzdEZyb21SZXNwb25zZS5nZXQoIkZlYXR1cmVzIik7CisKKwkJYXNzZXJ0VHJ1ZShhcnRpZmFjdHNMaXN0RnJvbVJlc3BvbnNlLnNpemUoKSA+PSAyKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZmQ2VydGlmaWNhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBWRgorCQlSZXNvdXJjZVJlcURldGFpbHMgY3JlYXRlUmVzb3VyY2VJblVJID0gUmVzb3VyY2VVSVV0aWxzLmNyZWF0ZVJlc291cmNlSW5VSShnZXRVc2VyKCkpOworCQlhc3NlcnRUcnVlKFJlc3RDRFV0aWxzLmdldFJlc291cmNlKGNyZWF0ZVJlc291cmNlSW5VSSkuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisKKwkJLy8gU3VibWl0IEZvciBUZXN0aW5nIFByb2Nlc3MKKwkJR2VuZXJhbFVJVXRpbHMuc3VibWl0Rm9yVGVzdGluZ0VsZW1lbnQoY3JlYXRlUmVzb3VyY2VJblVJLmdldE5hbWUoKSk7CisKKwkJLy8gVGVzdGVyCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlSZXNvdXJjZVVJVXRpbHMudGVzdEFuZEFjY2VwdEVsZW1lbnQoY3JlYXRlUmVzb3VyY2VJblVJKTsKKworCQkvLyBWZXJpZmljYXRpb24KKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlWZlZlcmlmaWNhdG9yLnZlcmlmeVJlc291cmNlSXNDZXJ0aWZpZWQoY3JlYXRlUmVzb3VyY2VJblVJKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlcGxveW1lbnRBcnRpZmFjdEZvclZGaSgpIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcigpOworCQkvLyBjcmVhdGUgdmYKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZUluVUkodXNlcik7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNrSW4oKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQkvLyBjcmVhdGUgc2VydmljZQorCQlHZW5lcmFsVUlVdGlscy5jbGlja09uQ3JlYXRlRW50aXR5RnJvbURhc2hib2FyZChEYXRhVGVzdElkRW51bS5EYXNoYm9hcmQuQlVUVE9OX0FERF9TRVJWSUNFLmdldFZhbHVlKCkpOworCQlSZXNvdXJjZVVJVXRpbHMuZGVmaW5lUmVzb3VyY2VOYW1lKCJzZXJ2Iik7CisJCUdlbmVyYWxVSVV0aWxzLmRlZmluZURlc2NyaXB0aW9uKCJkZXNjcmlwdGlvbiIpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCVJlc291cmNlVUlVdGlscy5kZWZpbmVSZXNvdXJjZUNhdGVnb3J5KCJNb2JpbGl0eSIsICJzZWxlY3RHZW5lcmFsQ2F0ZWdvcnkiKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmRlZmluZVByb2plY3RDb2RlKCIwMTIzNDUiKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTYXZlQnV0dG9uKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQ09NUE9TSVRJT04pOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCS8vIGFkZCB2ZiB0byBjYW52YXMKKwkJQ2FudmFzTWFuYWdlciBjYW52YXNNYW5hZ2VyID0gQ2FudmFzTWFuYWdlci5nZXRDYW52YXNNYW5hZ2VyKCk7CisJCUNhbnZhc0VsZW1lbnQgY2FudmFzRWxlbWVudCA9IGNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKGNyZWF0ZVJlc291cmNlSW5VSS5nZXROYW1lKCkpOworCQljYW52YXNNYW5hZ2VyLnNlbGVjdEVsZW1lbnRGcm9tQ2FudmFzKGNhbnZhc0VsZW1lbnQpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCS8vIGFkZCBhcnRpZmFjdAorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShEYXRhVGVzdElkRW51bS5SaWdodEJhci5ERVBMT1lNRU5UX0FSVElGQUNUUy5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShEYXRhVGVzdElkRW51bS5SaWdodEJhci5BRERfQVJUSUZBQ1RfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCVN0cmluZyBuZXdBcnRpZmFjdExhYmVsID0gIm5ld0FydGlmYWN0IjsKKwkJQXJ0aWZhY3RSZXFEZXRhaWxzIGRldGFpbHMgPSBuZXcgQXJ0aWZhY3RSZXFEZXRhaWxzKCJuZXdfYXRpZmFjdCIsICJEQ0FFX0lOVkVOVE9SWV9FVkVOVCIsICJkZXNjIiwgIiIsCisJCQkJbmV3QXJ0aWZhY3RMYWJlbCk7CisJCVJlc291cmNlVUlVdGlscy5maWxsaW5EZXBsb3ltZW50QXJ0aWZhY3RGb3JtQW5kQ2xpY2tEb25lKGRldGFpbHMsCisJCQkJRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpICsgInlhbWxTYW1wbGUueW1sIik7CisJCWFzc2VydFRydWUoR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudCgiYXJ0aWZhY3RfRGlzcGxheV9OYW1lLSIgKyBuZXdBcnRpZmFjdExhYmVsKSk7CisJCS8vIGVkaXQgYXJ0aWZhY3QKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoImFydGlmYWN0X0Rpc3BsYXlfTmFtZS0iICsgbmV3QXJ0aWZhY3RMYWJlbCkuY2xpY2soKTsKKwkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gInlhbWxTYW1wbGUyLnltbCI7CisJCXJldHJ5TWV0aG9kT25FeGNlcHRpb24oCisJCQkJKCkgLT4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChEYXRhVGVzdElkRW51bS5HZW5lcmFsU2VjdGlvbi5CUk9XU0VfQlVUVE9OLmdldFZhbHVlKCkpCisJCQkJCQkuc2VuZEtleXMoRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpICsgbmV3RmlsZU5hbWUpKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuRE9ORS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCWFzc2VydEVxdWFscyhuZXdGaWxlTmFtZSwKKwkJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUmlnaHRCYXIuQVJUSUZBQ1RfTkFNRS5nZXRWYWx1ZSgpKS5nZXRUZXh0KCkpOworCQkvLyBkZWxldGUgYXJ0aWZhY3QKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQoImFydGlmYWN0X0Rpc3BsYXlfTmFtZS0iICsgbmV3QXJ0aWZhY3RMYWJlbCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yQ2xpY2thYmxlKERhdGFUZXN0SWRFbnVtLlJpZ2h0QmFyLkRFTEVURV9BUlRJRkFDVF9CVVRUT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5PSy5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCWFzc2VydFRydWUoIUdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoImFydGlmYWN0X0Rpc3BsYXlfTmFtZS0iICsgbmV3QXJ0aWZhY3RMYWJlbCkpOworCX0KKworCXByb3RlY3RlZCBBcnRpZmFjdFJlcURldGFpbHMgZGVmaW5lSW5mb3JtYXRpb25hbEFydGlmYWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXR1cm4gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdEFydGlmYWN0KCk7CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlUmVzcEphdmFPYmplY3QgYnVpbGRSZXNvdXJjZUphdmFPYmplY3QoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlLCBSZXN0UmVzcG9uc2UgcmVzdFJlc3BvbnNlLAorCQkJVXNlciB1c2VyKSB7CisJCVJlc291cmNlUmVzcEphdmFPYmplY3QgcmVzb3VyY2VPYmplY3QgPSBuZXcgUmVzb3VyY2VSZXNwSmF2YU9iamVjdCgpOworCQlyZXNvdXJjZU9iamVjdCA9IENvbnZlcnRvci5jb25zdHJ1Y3RGaWVsZHNGb3JSZXNwVmFsaWRhdGlvbihyZXNvdXJjZSwgcmVzb3VyY2UuZ2V0VmVyc2lvbigpLCB1c2VyKTsKKwkJcmVzb3VyY2VPYmplY3Quc2V0TGlmZWN5Y2xlU3RhdGUoKExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKS50b1N0cmluZygpKTsKKwkJcmVzb3VyY2VPYmplY3Quc2V0QWJzdHJhY3R0KCJmYWxzZSIpOworCQlyZXNvdXJjZU9iamVjdC5zZXRJY29uKHJlc291cmNlLmdldEljb24oKS5yZXBsYWNlKCIgIiwgIiIpKTsKKwkJcmVzb3VyY2VPYmplY3Quc2V0VW5pcXVlSWQoUmVzcG9uc2VQYXJzZXIuZ2V0VW5pcXVlSWRGcm9tUmVzcG9uc2UocmVzdFJlc3BvbnNlKSk7CisJCXJldHVybiByZXNvdXJjZU9iamVjdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZXhlY3V0ZS92Zi9WZkNhbnZhc1Rlc3RzLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvdmYvVmZDYW52YXNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjA5NjYKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvdmYvVmZDYW52YXNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnZmOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuQ2FudmFzRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5DYW52YXNNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkNyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5MZWZ0UGFuZWxDYW52YXNJdGVtczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUuYmFzZS5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy52ZXJpZmljYXRvci5WZlZlcmlmaWNhdG9yOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CisKK3B1YmxpYyBjbGFzcyBWZkNhbnZhc1Rlc3RzIGV4dGVuZHMgU2V0dXBDRFRlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FudmFzRHJhZygpIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZUluVUkoZ2V0VXNlcigpKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQ09NUE9TSVRJT04pOworCisJCUNhbnZhc01hbmFnZXIgY2FudmFzTWFuYWdlciA9IENhbnZhc01hbmFnZXIuZ2V0Q2FudmFzTWFuYWdlcigpOworCQlDYW52YXNFbGVtZW50IGNyZWF0ZUVsZW1lbnRPbkNhbnZhcyA9IGNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKExlZnRQYW5lbENhbnZhc0l0ZW1zLkJMT0NLX1NUT1JBR0UpOworCisJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+IHByZU1vdmVQb3MgPSBSZXNvdXJjZVVJVXRpbHMuZ2V0UklQb3NpdGlvbihjcmVhdGVSZXNvdXJjZUluVUksIGdldFVzZXIoKSk7CisKKwkJY2FudmFzTWFuYWdlci5tb3ZlRWxlbWVudE9uQ2FudmFzKGNyZWF0ZUVsZW1lbnRPbkNhbnZhcyk7CisKKwkJVmZWZXJpZmljYXRvci52ZXJpZnlSSUxvY2F0aW9uQ2hhbmdlZChjcmVhdGVSZXNvdXJjZUluVUksIHByZU1vdmVQb3MsIGdldFVzZXIoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDYW52YXNDb25uZWN0Q29tcG9uZW50cygpIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZUluVUkoZ2V0VXNlcigpKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQ09NUE9TSVRJT04pOworCisJCUNhbnZhc01hbmFnZXIgY2FudmFzTWFuYWdlciA9IENhbnZhc01hbmFnZXIuZ2V0Q2FudmFzTWFuYWdlcigpOworCQlDYW52YXNFbGVtZW50IGJzRWxlbWVudCA9IGNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKExlZnRQYW5lbENhbnZhc0l0ZW1zLkJMT0NLX1NUT1JBR0UpOworCQlDYW52YXNFbGVtZW50IGNvbXB1dGVFbGVtZW50ID0gY2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXMoTGVmdFBhbmVsQ2FudmFzSXRlbXMuQ09NUFVURSk7CisKKwkJY2FudmFzTWFuYWdlci5saW5rRWxlbWVudHMoYnNFbGVtZW50LCBjb21wdXRlRWxlbWVudCk7CisKKwkJVmZWZXJpZmljYXRvci52ZXJpZnlMaW5rQ3JlYXRlZChjcmVhdGVSZXNvdXJjZUluVUkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FudmFzVkZTYW5pdHkoKSB7CisJCVJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUkgPSBSZXNvdXJjZVVJVXRpbHMuY3JlYXRlUmVzb3VyY2VJblVJKGdldFVzZXIoKSk7CisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLkNPTVBPU0lUSU9OKTsKKwkJQ2FudmFzTWFuYWdlciBjYW52YXNNYW5hZ2VyID0gQ2FudmFzTWFuYWdlci5nZXRDYW52YXNNYW5hZ2VyKCk7CisKKwkJQ2FudmFzRWxlbWVudCBic0VsZW1lbnQgPSBjYW52YXNNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhMZWZ0UGFuZWxDYW52YXNJdGVtcy5CTE9DS19TVE9SQUdFKTsKKwkJQ2FudmFzRWxlbWVudCBjb21wRWxlbWVudCA9IGNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKExlZnRQYW5lbENhbnZhc0l0ZW1zLkNPTVBVVEUpOworCisJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+IHByZU1vdmVQb3MgPSBSZXNvdXJjZVVJVXRpbHMuZ2V0UklQb3NpdGlvbihjcmVhdGVSZXNvdXJjZUluVUksIGdldFVzZXIoKSk7CisJCWNhbnZhc01hbmFnZXIubW92ZUVsZW1lbnRPbkNhbnZhcyhic0VsZW1lbnQpOworCQljYW52YXNNYW5hZ2VyLm1vdmVFbGVtZW50T25DYW52YXMoY29tcEVsZW1lbnQpOworCisJCVZmVmVyaWZpY2F0b3IudmVyaWZ5UklMb2NhdGlvbkNoYW5nZWQoY3JlYXRlUmVzb3VyY2VJblVJLCBwcmVNb3ZlUG9zLCBnZXRVc2VyKCkpOworCisJCUNhbnZhc0VsZW1lbnQgYnNFbGVtZW50MiA9IGNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKExlZnRQYW5lbENhbnZhc0l0ZW1zLkJMT0NLX1NUT1JBR0UpOworCisJCWNhbnZhc01hbmFnZXIubGlua0VsZW1lbnRzKGJzRWxlbWVudDIsIGNvbXBFbGVtZW50KTsKKworCQlWZlZlcmlmaWNhdG9yLnZlcmlmeUxpbmtDcmVhdGVkKGNyZWF0ZVJlc291cmNlSW5VSSk7CisKKwkJVmZWZXJpZmljYXRvci52ZXJpZnlOdW1PZkNvbXBvbmVudEluc3RhbmNlcyhjcmVhdGVSZXNvdXJjZUluVUksIDMpOworCisJCWNhbnZhc01hbmFnZXIubW92ZUVsZW1lbnRPbkNhbnZhcyhjb21wRWxlbWVudCk7CisKKwkJY2FudmFzTWFuYWdlci5kZWxldGVFbGVtZW50RnJvbUNhbnZhcyhic0VsZW1lbnQpOworCisJCVZmVmVyaWZpY2F0b3IudmVyaWZ5TnVtT2ZDb21wb25lbnRJbnN0YW5jZXMoY3JlYXRlUmVzb3VyY2VJblVJLCAyKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9leGVjdXRlL3ZmL1ZmRGVwbG95bWVudFRlc3RzLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvdmYvVmZEZXBsb3ltZW50VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzM0NGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9leGVjdXRlL3ZmL1ZmRGVwbG95bWVudFRlc3RzLmphdmEKQEAgLTAsMCArMSwzNDAgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnZmOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5iYXNlLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLkZpbGVIYW5kbGluZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuUmVzdENEVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CisKK3B1YmxpYyBjbGFzcyBWZkRlcGxveW1lbnRUZXN0cyBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKworCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqRWRpdE5hbWVQb3BvdmVyVGVzdHMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBDbGlja2luZ09uRWRpdE5hbWVQb3BvdmVySWNvblNob3VsZE9wZW5UaGVFZGl0TmFtZVBvcG92ZXJGb3JtKCkgeworCQlFZGl0TmFtZVBvcG92ZXJUZXN0c1NldFVwKCk7CisKKwkJYXNzZXJ0VHJ1ZShHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfRk9STS5nZXRWYWx1ZSgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBNb2R1bGVEYXRhU2hvdWxkQmVEaXNwbGF5ZWRJblRoZUVkaXROYW1lRm9ybSgpIHsKKwkJRWRpdE5hbWVQb3BvdmVyVGVzdHNTZXRVcCgpOworCisJCVdlYkVsZW1lbnQgaW5zdGFuY2VOYW1lID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfSU5TVEFOQ0VfTkFNRS5nZXRWYWx1ZSgpKTsKKwkJV2ViRWxlbWVudCBoZWF0TmFtZSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5QT1BPVkVSX0hFQVRfTkFNRS5nZXRWYWx1ZSgpKTsKKwkJV2ViRWxlbWVudCBtb2R1bGVOYW1lID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfTU9EVUxFX05BTUUuZ2V0VmFsdWUoKSk7CisKKwkJU3RyaW5nIG1vZHVsZU5hbWVUb0RpdmlkZSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLkhJRVJBUkNIWV9NT0RVTEUuZ2V0VmFsdWUoKSkuZ2V0VGV4dCgpOworCisJCVN0cmluZ1tdIGRpdmlkZWRNb2R1bGVOYW1lID0gbW9kdWxlTmFtZVRvRGl2aWRlLnNwbGl0KFBhdHRlcm4ucXVvdGUoIi4uIikpOworCisJCWFzc2VydEVxdWFscyhkaXZpZGVkTW9kdWxlTmFtZVswXSwgaW5zdGFuY2VOYW1lLmdldFRleHQoKSk7CisJCWFzc2VydEVxdWFscyhkaXZpZGVkTW9kdWxlTmFtZVsxXSwgaGVhdE5hbWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKGRpdmlkZWRNb2R1bGVOYW1lWzJdLCBtb2R1bGVOYW1lLmdldFRleHQoKSk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIENsb3NlQnV0dG9uU2hvdWxkQ2xvc2VUaGVQb3BvdmVyKCkgeworCQlFZGl0TmFtZVBvcG92ZXJUZXN0c1NldFVwKCk7CisKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfQ0xPU0VfQlVUVE9OLmdldFZhbHVlKCkpCisJCQkJLmNsaWNrKCk7CisKKwkJYXNzZXJ0RmFsc2UoR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudChEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5QT1BPVkVSX0ZPUk0uZ2V0VmFsdWUoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgWEJ1dHRvblNob3VsZENsb3NlVGhlUG9wb3ZlcigpIHsKKwkJRWRpdE5hbWVQb3BvdmVyVGVzdHNTZXRVcCgpOworCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5QT1BPVkVSX1hfQlVUVE9OLmdldFZhbHVlKCkpCisJCQkJLmNsaWNrKCk7CisKKwkJYXNzZXJ0RmFsc2UoR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudChEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5QT1BPVkVSX0ZPUk0uZ2V0VmFsdWUoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgU2F2ZUJ1dHRvblNob3VsZEJlRGlzYWJsZWRXaGlsZVRoZU5hbWVIYXNOb3RCZWVuQ2hhbmdlZCgpIHsKKwkJRWRpdE5hbWVQb3BvdmVyVGVzdHNTZXRVcCgpOworCisJCVdlYkVsZW1lbnQgcG9wb3ZlclNhdmVCdXR0b24gPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVXBkYXRlTmFtZVBvcG92ZXIuUE9QT1ZFUl9TQVZFX0JVVFRPTi5nZXRWYWx1ZSgpKTsKKworCQlhc3NlcnRUcnVlKHBvcG92ZXJTYXZlQnV0dG9uLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb250YWlucygiZGlzYWJsZWQiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBDbGlja2luZ09uVGhlU2F2ZUJ1dHRvblNob3VsZFVwZGF0ZVRoZU1vZHVsZU5hbWUoKSB7CisJCUVkaXROYW1lUG9wb3ZlclRlc3RzU2V0VXAoKTsKKworCQlTdHJpbmcgbmV3TmFtZSA9ICJ0ZXN0TmFtZSI7CisKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfSEVBVF9OQU1FLmdldFZhbHVlKCkpCisJCQkJLmNsZWFyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5QT1BPVkVSX0hFQVRfTkFNRS5nZXRWYWx1ZSgpKQorCQkJCS5zZW5kS2V5cyhuZXdOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfU0FWRV9CVVRUT04uZ2V0VmFsdWUoKSkKKwkJCQkuY2xpY2soKTsKKworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisKKwkJU3RyaW5nIG1vZHVsZU5hbWUgPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfTU9EVUxFLmdldFZhbHVlKCkpLmdldFRleHQoKTsKKworCQlTdHJpbmdbXSBkaXZpZGVkTW9kdWxlTmFtZSA9IG1vZHVsZU5hbWUuc3BsaXQoUGF0dGVybi5xdW90ZSgiLi4iKSk7CisKKwkJYXNzZXJ0RXF1YWxzKGRpdmlkZWRNb2R1bGVOYW1lWzFdLCBuZXdOYW1lKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNb2R1bGVOYW1lU2FuaXR5KCkgeworCQlFZGl0TmFtZVBvcG92ZXJUZXN0c1NldFVwKCk7CisKKwkJU3RyaW5nIG5ld05hbWUgPSAidGVzdE5hbWUiOworCisJCVdlYkVsZW1lbnQgaW5zdGFuY2VOYW1lID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfSU5TVEFOQ0VfTkFNRS5nZXRWYWx1ZSgpKTsKKwkJV2ViRWxlbWVudCBoZWF0TmFtZSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5QT1BPVkVSX0hFQVRfTkFNRS5nZXRWYWx1ZSgpKTsKKwkJV2ViRWxlbWVudCBtb2R1bGVOYW1lID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlVwZGF0ZU5hbWVQb3BvdmVyLlBPUE9WRVJfTU9EVUxFX05BTUUuZ2V0VmFsdWUoKSk7CisKKwkJU3RyaW5nIG1vZHVsZU5hbWVUb0RpdmlkZSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLkhJRVJBUkNIWV9NT0RVTEUuZ2V0VmFsdWUoKSkuZ2V0VGV4dCgpOworCisJCVN0cmluZ1tdIGRpdmlkZWRNb2R1bGVOYW1lID0gbW9kdWxlTmFtZVRvRGl2aWRlLnNwbGl0KFBhdHRlcm4ucXVvdGUoIi4uIikpOworCisJCWFzc2VydEVxdWFscyhkaXZpZGVkTW9kdWxlTmFtZVswXSwgaW5zdGFuY2VOYW1lLmdldFRleHQoKSk7CisJCWFzc2VydEVxdWFscyhkaXZpZGVkTW9kdWxlTmFtZVsxXSwgaGVhdE5hbWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKGRpdmlkZWRNb2R1bGVOYW1lWzJdLCBtb2R1bGVOYW1lLmdldFRleHQoKSk7CisKKwkJV2ViRWxlbWVudCBwb3BvdmVyU2F2ZUJ1dHRvbiA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5QT1BPVkVSX1NBVkVfQlVUVE9OLmdldFZhbHVlKCkpOworCisJCWFzc2VydFRydWUocG9wb3ZlclNhdmVCdXR0b24uZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJkaXNhYmxlZCIpKTsKKworCQloZWF0TmFtZS5jbGVhcigpOworCQloZWF0TmFtZS5zZW5kS2V5cyhuZXdOYW1lKTsKKworCQlwb3BvdmVyU2F2ZUJ1dHRvbi5jbGljaygpOworCisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKworCQltb2R1bGVOYW1lVG9EaXZpZGUgPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfTU9EVUxFLmdldFZhbHVlKCkpLmdldFRleHQoKTsKKwkJZGl2aWRlZE1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lVG9EaXZpZGUuc3BsaXQoUGF0dGVybi5xdW90ZSgiLi4iKSk7CisKKwkJYXNzZXJ0RXF1YWxzKGRpdmlkZWRNb2R1bGVOYW1lWzFdLCBuZXdOYW1lKTsKKwl9CisKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkRlcGxveW1lbnRUYWJzVGVzdHMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vCisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUYWJJc0JlaW5nRGlzcGxheWVkQXREZXBsb3ltZW50VmlldygpIHsKKwkJRGVwbG95bWVudFRlc3RzU2V0VXAoKTsKKworCQlhc3NlcnRUcnVlKEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfVEFCLmdldFZhbHVlKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGlja2luZ09uVGFiU2V0c0l0QXNTZWxlY3RlZCgpIHsKKwkJRGVwbG95bWVudFRlc3RzU2V0VXAoKTsKKworCQlXZWJFbGVtZW50IGhpZXJhcmNoeVRhYiA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLkhJRVJBUkNIWV9UQUIuZ2V0VmFsdWUoKSk7CisJCWhpZXJhcmNoeVRhYi5jbGljaygpOworCisJCWFzc2VydFRydWUoaGllcmFyY2h5VGFiLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb250YWlucygic2VsZWN0ZWQiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VGFiTmFtZUlzQmVpbmdEaXNwbGF5ZWRJblRoZVNlbGVjdGVkVGFiSGVhZGVyKCkgeworCQlEZXBsb3ltZW50VGVzdHNTZXRVcCgpOworCisJCS8vIHNlbGVjdCB0aGUgaGllcmFyY2h5IHRhYiBhbmQgY2hlY2sgdGhlIGhlYWRlcgorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfVEFCLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCVdlYkVsZW1lbnQgdGFiSGVhZGVyID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuVEFCX0hFQURFUi5nZXRWYWx1ZSgpKTsKKworCQlhc3NlcnRFcXVhbHModGFiSGVhZGVyLmdldFRleHQoKSwgIkhJRVJBUkNIWSIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFNlbGVjdGluZ01vZHVsZU5hbWVJblRoZUhpZXJhcmNoeVRhYlNob3VsZFNlbGVjdEl0KCkgeworCQlEZXBsb3ltZW50VGVzdHNTZXRVcCgpOworCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLkhJRVJBUkNIWV9UQUIuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJV2ViRWxlbWVudCBoaWVyYXJjaHlNb2R1bGUgPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfTU9EVUxFX1RJVExFLmdldFZhbHVlKCkpOworCisJCWhpZXJhcmNoeU1vZHVsZS5jbGljaygpOworCisJCWFzc2VydFRydWUoaGllcmFyY2h5TW9kdWxlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5jb250YWlucygic2VsZWN0ZWQiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW5nTW9kdWxlTmFtZUluVGhlSGllcmFyY2h5VGFiU2hvdWxkRXhwYW5kSXQoKSB7CisJCURlcGxveW1lbnRUZXN0c1NldFVwKCk7CisKKwkJLy8gc2VsZWN0IGhpZXJhcmNoeSB0YWIKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuSElFUkFSQ0hZX1RBQi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlXZWJFbGVtZW50IGhpZXJhcmNoeU1vZHVsZSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLkhJRVJBUkNIWV9NT0RVTEUuZ2V0VmFsdWUoKSk7CisKKwkJaGllcmFyY2h5TW9kdWxlLmNsaWNrKCk7CisKKwkJYXNzZXJ0VHJ1ZShoaWVyYXJjaHlNb2R1bGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJleHBhbmRlZCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3RpbmdNb2R1bGVOYW1lSW5UaGVIaWVyYXJjaHlUYWJTaG91bGREaXNwbGF5SXRzRGF0YSgpIHsKKwkJRGVwbG95bWVudFRlc3RzU2V0VXAoKTsKKworCQkvLyBzZWxlY3QgaGllcmFyY2h5IHRhYgorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfVEFCLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLkhJRVJBUkNIWV9NT0RVTEUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKworCQlhc3NlcnRUcnVlKEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfU0VMRUNURURfTU9EVUxFX0RBVEEuZ2V0VmFsdWUoKSkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VOYW1lSXNCZWluZ0Rpc3BsYXllZEluVGhlU2VsZWN0ZWRUYWJTdWJIZWFkZXIoKSB7CisJCURlcGxveW1lbnRUZXN0c1NldFVwKCk7CisKKwkJLy8gc2VsZWN0IHRoZSBoaWVyYXJjaHkgdGFiIGFuZCBjaGVjayB0aGUgaGVhZGVyCisJCS8vIFdlYkVsZW1lbnQgdGFiU3ViSGVhZGVyID0KKwkJLy8gZ2V0V2ViRWxlbWVudChEYXRhVGVzdElkRW51bS5UYWJzQmFyLlRBQl9TVUJfSEVBREVSLmdldFZhbHVlKCkpOworCisJCS8vIGFzc2VydEVxdWFscyh0YWJTdWJIZWFkZXIuZ2V0VGV4dCgpLCB2bW1jQ3Nhci5nZXROYW1lKCkpOworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW5nTW9kdWxlTmFtZUluVGhlSGllcmFyY2h5VGFiU2hvdWxkRGlzcGxheUl0c0luZm9ybWF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRGVwbG95bWVudFRlc3RzU2V0VXAoKTsKKworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfVEFCLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCVdlYkVsZW1lbnQgaGllcmFyY2h5TW9kdWxlID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuSElFUkFSQ0hZX01PRFVMRS5nZXRWYWx1ZSgpKTsKKworCQkvLyBnZXQgdGhlIG1vZHVsZQorCQkvLyBTdHJpbmcgY29tcG9uZW50ID0gUmVzdENEVXRpbHMuZ2V0UmVzb3VyY2Uodm1tY0NzYXIpLmdldFJlc3BvbnNlKCk7CisJCS8vIFRPRE8gaWRhbmEgZml4IHRlc3QKKwkJLyoKKwkJICogR3JvdXBEZWZpbml0aW9uSW5mbyBtb2R1bGUgPSBnZXRNb2R1bGVCeUlkKGNvbXBvbmVudCwKKwkJICogaGllcmFyY2h5TW9kdWxlLmdldFRleHQoKSk7CisJCSAqIAorCQkgKiBoaWVyYXJjaHlNb2R1bGUuY2xpY2soKTsKKwkJICogCisJCSAqIGFzc2VydE1vZHVsZURldGFpbHMobW9kdWxlLCBoaWVyYXJjaHlNb2R1bGUpOworCQkgKi8KKworCX0KKworCUBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKwlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW5nTW9kdWxlTmFtZUluVGhlSGllcmFyY2h5VGFiU2hvdWxkRGlzcGxheUl0c0FydGlmYWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCURlcGxveW1lbnRUZXN0c1NldFVwKCk7CisKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfVEFCLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCVdlYkVsZW1lbnQgaGllcmFyY2h5TW9kdWxlID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuSElFUkFSQ0hZX01PRFVMRS5nZXRWYWx1ZSgpKTsKKworCQkvLyBUT0RPIGlkYW5hIGZpeCB0ZXN0CisJCS8vIEdldCB0aGUgYXJ0aWZhY3QgZnJvbSB0aGUgbW9kdWxlCisJCS8qCisJCSAqIFN0cmluZyBjb21wb25lbnQgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZSh2bW1jQ3NhciwKKwkJICogZ2V0VXNlcigpKS5nZXRSZXNwb25zZSgpOyBHcm91cERlZmluaXRpb25JbmZvIG1vZHVsZSA9CisJCSAqIGdldE1vZHVsZUJ5SWQoY29tcG9uZW50LCBoaWVyYXJjaHlNb2R1bGUuZ2V0VGV4dCgpKTsKKwkJICogQXJ0aWZhY3REZWZpbml0aW9uSW5mbyBhcnRpZmFjdCA9IG1vZHVsZS5nZXRBcnRpZmFjdHMoKS5nZXQoMCk7CisJCSAqIAorCQkgKiBoaWVyYXJjaHlNb2R1bGUuY2xpY2soKTsKKwkJICogCisJCSAqIGFzc2VydE1vZHVsZUFydGlmYWN0RGV0YWlscyhhcnRpZmFjdCk7CisJCSAqLworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRhYnNWaWV3U2FuaXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRGVwbG95bWVudFRlc3RzU2V0VXAoKTsKKworCQlXZWJFbGVtZW50IGhpZXJhcmNoeVRhYiA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLkhJRVJBUkNIWV9UQUIuZ2V0VmFsdWUoKSk7CisKKwkJYXNzZXJ0VHJ1ZShoaWVyYXJjaHlUYWIgIT0gbnVsbCk7CisKKwkJaGllcmFyY2h5VGFiLmNsaWNrKCk7CisKKwkJYXNzZXJ0VHJ1ZShoaWVyYXJjaHlUYWIuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJzZWxlY3RlZCIpKTsKKworCQlXZWJFbGVtZW50IHRhYkhlYWRlciA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5UYWJzQmFyLlRBQl9IRUFERVIuZ2V0VmFsdWUoKSk7CisJCVdlYkVsZW1lbnQgdGFiU3ViSGVhZGVyID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuVEFCX1NVQl9IRUFERVIuZ2V0VmFsdWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKHRhYkhlYWRlci5nZXRUZXh0KCksICJISUVSQVJDSFkiKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKHRhYlN1YkhlYWRlci5nZXRUZXh0KCksIHZtbWNDc2FyLmdldE5hbWUoKSk7CisKKwkJV2ViRWxlbWVudCBoaWVyYXJjaHlNb2R1bGUgPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfTU9EVUxFLmdldFZhbHVlKCkpOworCQlXZWJFbGVtZW50IGhpZXJhcmNoeU1vZHVsZVRpdGxlID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuSElFUkFSQ0hZX01PRFVMRV9USVRMRS5nZXRWYWx1ZSgpKTsKKwkJaGllcmFyY2h5TW9kdWxlLmNsaWNrKCk7CisJCVdlYkVsZW1lbnQgc2VsZWN0ZWRNb2R1bGVEYXRhID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuSElFUkFSQ0hZX1NFTEVDVEVEX01PRFVMRV9EQVRBLmdldFZhbHVlKCkpOworCisJCWFzc2VydFRydWUoaGllcmFyY2h5TW9kdWxlVGl0bGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJzZWxlY3RlZCIpKTsKKwkJYXNzZXJ0VHJ1ZShoaWVyYXJjaHlNb2R1bGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLmNvbnRhaW5zKCJleHBhbmRlZCIpKTsKKwkJYXNzZXJ0VHJ1ZShzZWxlY3RlZE1vZHVsZURhdGEuZ2V0QXR0cmlidXRlKCJuZy1pZiIpICE9IG51bGwpOworCQkvLyBUT0RPIGlkYW5hIGZpeCB0ZXN0CisJCS8qCisJCSAqIFN0cmluZyBjb21wb25lbnQgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZSh2bW1jQ3NhciwKKwkJICogZ2V0VXNlcigpKS5nZXRSZXNwb25zZSgpOyBHcm91cERlZmluaXRpb25JbmZvIG1vZHVsZSA9CisJCSAqIGdldE1vZHVsZUJ5SWQoY29tcG9uZW50LCBoaWVyYXJjaHlNb2R1bGUuZ2V0VGV4dCgpKTsKKwkJICogQXJ0aWZhY3REZWZpbml0aW9uSW5mbyBhcnRpZmFjdCA9IG1vZHVsZS5nZXRBcnRpZmFjdHMoKS5nZXQoMCk7CisJCSAqIAorCQkgKiBhc3NlcnRNb2R1bGVEZXRhaWxzKG1vZHVsZSwgaGllcmFyY2h5TW9kdWxlKTsKKwkJICogCisJCSAqIGFzc2VydE1vZHVsZUFydGlmYWN0RGV0YWlscyhhcnRpZmFjdCk7CisJCSAqLworCisJfQorCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqRGVwbG95bWVudFRlc3RzU2V0VXBGdW5jdGlvbioqKioqKioqKioqKioqKioqKioqKioqKi8vCisKKwlwcml2YXRlIHZvaWQgRWRpdE5hbWVQb3BvdmVyVGVzdHNTZXRVcCgpIHsKKwkJRGVwbG95bWVudFRlc3RzU2V0VXAoKTsKKworCQkvLyBjbGlja2luZyBvbiBhIG1vZHVsZSBhbmQgb3BlbmluZyB0aGUgZWRpdCBuYW1lIHBvcG92ZXIKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlRhYnNCYXIuSElFUkFSQ0hZX1RBQi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uVGFic0Jhci5ISUVSQVJDSFlfTU9EVUxFLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5VcGRhdGVOYW1lUG9wb3Zlci5PUEVOX1BPUE9WRVJfSUNPTi5nZXRWYWx1ZSgpKQorCQkJCS5jbGljaygpOworCX0KKworCXByaXZhdGUgdm9pZCBEZXBsb3ltZW50VGVzdHNTZXRVcCgpIHsKKwkJLy8gaW1wb3J0IGNzYXIKKwkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAidmZfd2l0aF9ncm91cHMuY3NhciI7CisJCVJlc291cmNlVUlVdGlscy5pbXBvcnRWZkluVUkoZ2V0VXNlcigpLCBmaWxlUGF0aCwgZmlsZU5hbWUpOworCisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoMjApOworCisJCS8vIG1vdmluZyB0byBkZXBsb3ltZW50IHZpZXcKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uREVQTE9ZTUVOVCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9leGVjdXRlL3ZmL1ZmT25ib2FyZGluZ1Rlc3RzLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL2V4ZWN1dGUvdmYvVmZPbmJvYXJkaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODFkODU0Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9leGVjdXRlL3ZmL1ZmT25ib2FyZGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUudmY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUuYmFzZS5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5PbmJvYXJkVXRpbGl0eTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKKworcHVibGljIGNsYXNzIFZmT25ib2FyZGluZ1Rlc3RzIGV4dGVuZHMgU2V0dXBDRFRlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmZDcmVhdGVkT25Cb2FyZGluZygpIHsKKwkJLy8gY3JlYXRlIHZmCisJCVJlc291cmNlUmVxRGV0YWlscyBpbXBvcnRWZlJlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5pbXBvcnRWZkZyb21PbkJvYXJkaW5nTW9kYWxXaXRob3V0Q2hlY2tpbihnZXRVc2VyKCksCisJCQkJIm1vY2tfdmYiKTsKKwkJLy8gdXBkYXRlIHZmCisJCVJlc291cmNlVUlVdGlscy51cGRhdGVWZkNzYXJGcm9tT25Cb2FyZGluZygpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRlVmZzRnJvbU9uYm9hcmRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZm9sZGVyUGF0aCA9ICJDOlxcb25ib2FyZGluZ1Rlc3RcXG9uQm9hcmRpbmdaaXBzIjsKKwkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShmb2xkZXJQYXRoKTsKKwkJRmlsZVtdIGxpc3RPZkZpbGVzID0gZm9sZGVyLmxpc3RGaWxlcygpOworCQlMaXN0PFN0cmluZz4gemlwRmlsZU5hbWVzID0gQXJyYXlzLmFzTGlzdChsaXN0T2ZGaWxlcykuc3RyZWFtKCkubWFwKGZpbGUgLT4gZmlsZS5nZXROYW1lKCkpCisJCQkJLmZpbHRlcihmaWxlTmFtZSAtPiBmaWxlTmFtZS5lbmRzV2l0aCgiLnppcCIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbGVzU3VjY2Vzc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChTdHJpbmcgZmlsZU5hbWUgOiB6aXBGaWxlTmFtZXMpIHsKKwkJCXRyeSB7CisJCQkJY3JlYXRlU2luZ2xlVmZGcm9tT25ib2FyZGluZyhmb2xkZXJQYXRoLCBmaWxlTmFtZSk7CisJCQkJZmlsZXNTdWNjZXNzTWFwLnB1dChmaWxlTmFtZSwgIlNVQ0NFU1MiKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJZmlsZXNTdWNjZXNzTWFwLnB1dChmaWxlTmFtZSwgIkZBSUwiKTsKKwkJCX0KKwkJfQorCQlQYXRoIGZpbGUgPSBQYXRocy5nZXQoIlJ1blJlc3VsdHMudHh0Iik7CisJCVN0cmluZyBzdHJpbmdEYXRhTW9kZWwgPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpLnRvSnNvbihmaWxlc1N1Y2Nlc3NNYXApOworCQlGaWxlcy53cml0ZShmaWxlLCBzdHJpbmdEYXRhTW9kZWwuZ2V0Qnl0ZXMoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVTaW5nbGVWZkZyb21PbmJvYXJkaW5nKFN0cmluZyBmaWxlUGF0aCwgU3RyaW5nIHppcEZpbGVOYW1lKSB7CisJCVN0cmluZyB1c2VySWQgPSBVc2VyUm9sZUVudW0uREVTSUdORVIuZ2V0VXNlcklkKCk7CisJCU9uYm9hcmRVdGlsaXR5LmNyZWF0ZVZmRnJvbU9uYm9hcmRpbmcodXNlcklkLCB6aXBGaWxlTmFtZSwgZmlsZVBhdGgpOworCQlHZW5lcmFsVUlVdGlscy5zdWJtaXRGb3JUZXN0aW5nRWxlbWVudCgiVmYgRnJvbSBPbmJvYXJkaW5nIik7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZXhlY3V0ZS92ZmMvVmZjQmFzaWNUZXN0cy5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9leGVjdXRlL3ZmYy9WZmNCYXNpY1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyMWU0MAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvZXhlY3V0ZS92ZmMvVmZjQmFzaWNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS52ZmM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5Db2xsZWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5iYXNlLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLkZpbGVIYW5kbGluZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuUmVzdENEVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy52ZXJpZmljYXRvci5WZlZlcmlmaWNhdG9yOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuU2VsZWN0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXM7CisKK3B1YmxpYyBjbGFzcyBWZmNCYXNpY1Rlc3RzIGV4dGVuZHMgU2V0dXBDRFRlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZW1lbnRzQW5kQ2FwYWJpbGl0aWVzU2VjdGlvbk9mVmZjKCkgeworCQlTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJteWNvbXB1dGUueW1sIjsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmY0luVUkoZ2V0VXNlcigpLCBmaWxlUGF0aCwgZmlsZU5hbWUpOworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bS5SRVFVSVJFTUVOVFNfQU5EX0NBUEFCSUxJVElFUyk7CisJCS8vIGFsbCBleHBlY3RlZCByZXF1aXJlbWVudHMKKwkJYXNzZXJ0VHJ1ZSgiTm90IGFsbCBleHBlY3RlZCByZXF1aXJlbWVudHMgYXJlIGRpc3BsYXllZC4iLCBHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KCJkZXBlbmRlbmN5IikgJiYgR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudCgibG9jYWxfc3RvcmFnZSIpKTsKKwkJLy8gZmlsdGVyIHJlcXVpcmVtZW50cworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUmVxQW5kQ2FwYWJpbGl0aWVzU2VjdGlvbi5TRUFSQ0hfQk9YLmdldFZhbHVlKCkpLnNlbmRLZXlzKCJyb290Iik7CisJCVN1cHBsaWVyPEJvb2xlYW4+IHN1cHBsaWVyID0gKCkgLT4gIUdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoImxvY2FsX3N0b3JhZ2UiKTsKKwkJRnVuY3Rpb248Qm9vbGVhbiwgQm9vbGVhbj4gcmVzdWx0VmVyaWZpZXIgPSBpc05vdFByZXNlbnQgLT4gaXNOb3RQcmVzZW50OworCQlCb29sZWFuIGlzRmlsdGVyZWRSb3dOb3RQcmVzZW50ID0gRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPblJlc3VsdChzdXBwbGllciwgcmVzdWx0VmVyaWZpZXIpOworCQlhc3NlcnRUcnVlKCJUaGUgbmV3IHByb3BlcnR5IHdhcyBub3QgaW5zZXJ0ZWQgdG8gdGhlIHByb3BlcnRpZXMgdGFibGUuIiwgaXNGaWx0ZXJlZFJvd05vdFByZXNlbnQpOworCQlhc3NlcnRUcnVlKCJGaWx0ZXIgcHJvYmxlbS4iLCBHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KCJkZXBlbmRlbmN5IikgJiYgaXNGaWx0ZXJlZFJvd05vdFByZXNlbnQpOworCQkvLyBtb3ZlIHRvIGNhcCB0YWIKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlJlcUFuZENhcGFiaWxpdGllc1NlY3Rpb24uQ0FQX1RBQi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImVuZHBvaW50IikuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJpbml0aWF0b3IiKS5jbGljaygpOworCQlzdXBwbGllciA9ICgpIC0+IEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLkZPUk1fQ09OVEFJTkVSLmdldFZhbHVlKCkpOworCQlyZXN1bHRWZXJpZmllciA9IGlzUHJlc2VudCAtPiBpc1ByZXNlbnQ7CisJCUJvb2xlYW4gaXNQb3B1cE9wZW4gPSBGdW5jdGlvbmFsSW50ZXJmYWNlcy5yZXRyeU1ldGhvZE9uUmVzdWx0KHN1cHBsaWVyLCByZXN1bHRWZXJpZmllcik7CisJCWFzc2VydFRydWUoIlRoZSB1cGRhdGUgcHJvcGVydHkgcG9wdXAgd2FzIG5vdCBvcGVuZWQuIiwgaXNQb3B1cE9wZW4pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnR5VHlwZUxpc3RGb3JWZmMoKSB7CisJCVN0cmluZyBmaWxlUGF0aCA9IEZpbGVIYW5kbGluZy5nZXRSZXNvdXJjZXNGaWxlc1BhdGgoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gIlZGQ1dpdGhBdHRyaWJ1dGVzLnltbCI7CisJCVJlc291cmNlVUlVdGlscy5pbXBvcnRWZmNJblVJKGdldFVzZXIoKSwgZmlsZVBhdGgsIGZpbGVOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uUFJPUEVSVElFUyk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzU2VjdGlvbi5BRERfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCS8vIGZpbGwgaW4gZmllbGRzCisJCVN0cmluZyBuZXdQcm9wTmFtZSA9ICJsaXN0UHJvcGVydHkiOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLk5BTUVfRklFTEQuZ2V0VmFsdWUoKSkuc2VuZEtleXMobmV3UHJvcE5hbWUpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLkRFU0NSSVBUSU9OX0ZJRUxELmdldFZhbHVlKCkpLnNlbmRLZXlzKCJkZXNjIik7CisJCVNlbGVjdCB0eXBlRmllbGQgPSBuZXcgU2VsZWN0KEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uVFlQRV9GSUVMRC5nZXRWYWx1ZSgpKSk7CisJCXR5cGVGaWVsZC5zZWxlY3RCeVZpc2libGVUZXh0KCJsaXN0Iik7CisJCVNlbGVjdCBzY2hlbWFUeXBlRmllbGQgPSBuZXcgU2VsZWN0KEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uU0NIRU1BX0ZJRUxELmdldFZhbHVlKCkpKTsKKwkJc2NoZW1hVHlwZUZpZWxkLnNlbGVjdEJ5VmlzaWJsZVRleHQoInN0cmluZyIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLkxJU1RfVFlQRV9ERUZBVUxUX1ZBTF9GSUVMRC5nZXRWYWx1ZSgpKS5zZW5kS2V5cygiZmlyc3QiKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5BRERfSVRFTV9UT19MSVNUX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLkxJU1RfVFlQRV9ERUZBVUxUX1ZBTF9GSUVMRC5nZXRWYWx1ZSgpKS5zZW5kS2V5cygic2Vjb25kIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uQUREX0lURU1fVE9fTElTVF9CVVRUT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJLy8gc2F2ZQorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLlNBVkVfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCVN1cHBsaWVyPEJvb2xlYW4+IHN1cHBsaWVyID0gKCkgLT4gR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudChuZXdQcm9wTmFtZSk7CisJCUZ1bmN0aW9uPEJvb2xlYW4sIEJvb2xlYW4+IHJlc3VsdFZlcmlmaWVyID0gaXNQcmVzZW50IC0+IGlzUHJlc2VudDsKKwkJQm9vbGVhbiBpc1ByZXNlbnQgPSBGdW5jdGlvbmFsSW50ZXJmYWNlcy5yZXRyeU1ldGhvZE9uUmVzdWx0KHN1cHBsaWVyLCByZXN1bHRWZXJpZmllcik7CisJCWFzc2VydFRydWUoIlRoZSBuZXcgcHJvcGVydHkgd2FzIG5vdCBpbnNlcnRlZCB0byB0aGUgcHJvcGVydGllcyB0YWJsZS4iLCBpc1ByZXNlbnQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnR5VHlwZU1hcEZvclZmYygpIHsKKwkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAiVkZDV2l0aEF0dHJpYnV0ZXMueW1sIjsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmY0luVUkoZ2V0VXNlcigpLCBmaWxlUGF0aCwgZmlsZU5hbWUpOworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bS5QUk9QRVJUSUVTKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnRpZXNTZWN0aW9uLkFERF9CVVRUT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJLy8gZmlsbCBpbiBmaWVsZHMKKwkJU3RyaW5nIG5ld1Byb3BOYW1lID0gIm1hcFByb3BlcnR5IjsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5OQU1FX0ZJRUxELmdldFZhbHVlKCkpLnNlbmRLZXlzKG5ld1Byb3BOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5ERVNDUklQVElPTl9GSUVMRC5nZXRWYWx1ZSgpKS5zZW5kS2V5cygiZGVzYyIpOworCQlTZWxlY3QgdHlwZUZpZWxkID0gbmV3IFNlbGVjdChHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLlRZUEVfRklFTEQuZ2V0VmFsdWUoKSkpOworCQl0eXBlRmllbGQuc2VsZWN0QnlWaXNpYmxlVGV4dCgibWFwIik7CisJCVNlbGVjdCBzY2hlbWFUeXBlRmllbGQgPSBuZXcgU2VsZWN0KEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uU0NIRU1BX0ZJRUxELmdldFZhbHVlKCkpKTsKKwkJc2NoZW1hVHlwZUZpZWxkLnNlbGVjdEJ5VmlzaWJsZVRleHQoInN0cmluZyIpOworCQkvLyBpbnNlcnQgaXRlbSB0byBtYXAKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5NQVBfVFlQRV9ERUZBVUxUX1ZBTF9LRVlfRklFTERfRk9SX0ZJUlNUX0lURU0uZ2V0VmFsdWUoKSkuc2VuZEtleXMoImtleTEiKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5NQVBfVFlQRV9ERUZBVUxUX1ZBTF9WQUxVRV9GSUVMRF9GT1JfRklSU1RfSVRFTS5nZXRWYWx1ZSgpKS5zZW5kS2V5cygidmFsMSIpOworCQkvLyBpbnNlcnQgaXRlbSB0byBtYXAKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5BRERfSVRFTV9UT19NQVBfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uTUFQX1RZUEVfREVGQVVMVF9WQUxfS0VZX0ZJRUxEX0ZPUl9TRUNPTkRfSVRFTS5nZXRWYWx1ZSgpKS5zZW5kS2V5cygia2V5MiIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLk1BUF9UWVBFX0RFRkFVTFRfVkFMX1ZBTFVFX0ZJRUxEX0ZPUl9TRUNPTkRfSVRFTS5nZXRWYWx1ZSgpKS5zZW5kS2V5cygidmFsMiIpOworCQkvLyBkZWxldGUgaXRlbSBmcm9tIG1hcAorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLkRFTEVURV9GSVJTVF9JVEVNX0ZST01fTUFQX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkvLyBzYXZlCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uU0FWRV9CVVRUT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJU3VwcGxpZXI8Qm9vbGVhbj4gc3VwcGxpZXIgPSAoKSAtPiBHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KG5ld1Byb3BOYW1lKTsKKwkJRnVuY3Rpb248Qm9vbGVhbiwgQm9vbGVhbj4gcmVzdWx0VmVyaWZpZXIgPSBpc1ByZXNlbnQgLT4gaXNQcmVzZW50OworCQlCb29sZWFuIGlzUHJlc2VudCA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzLnJldHJ5TWV0aG9kT25SZXN1bHQoc3VwcGxpZXIsIHJlc3VsdFZlcmlmaWVyKTsKKwkJYXNzZXJ0VHJ1ZSgiVGhlIG5ldyBwcm9wZXJ0eSB3YXMgbm90IGluc2VydGVkIHRvIHRoZSBwcm9wZXJ0aWVzIHRhYmxlLiIsIGlzUHJlc2VudCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvcGVydHlUeXBlRFRGb3JWZmMoKSB7CisJCVN0cmluZyBmaWxlUGF0aCA9IEZpbGVIYW5kbGluZy5nZXRSZXNvdXJjZXNGaWxlc1BhdGgoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gIlZGQ1dpdGhBdHRyaWJ1dGVzLnltbCI7CisJCVJlc291cmNlVUlVdGlscy5pbXBvcnRWZmNJblVJKGdldFVzZXIoKSwgZmlsZVBhdGgsIGZpbGVOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uUFJPUEVSVElFUyk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzU2VjdGlvbi5BRERfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCS8vIGZpbGwgaW4gZmllbGRzCisJCVN0cmluZyBuZXdQcm9wTmFtZSA9ICJkdCI7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uTkFNRV9GSUVMRC5nZXRWYWx1ZSgpKS5zZW5kS2V5cyhuZXdQcm9wTmFtZSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0eUZvcm0uREVTQ1JJUFRJT05fRklFTEQuZ2V0VmFsdWUoKSkuc2VuZEtleXMoImRlc2MiKTsKKwkJU2VsZWN0IHR5cGVGaWVsZCA9IG5ldyBTZWxlY3QoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5UWVBFX0ZJRUxELmdldFZhbHVlKCkpKTsKKwkJdHlwZUZpZWxkLnNlbGVjdEJ5VmFsdWUoIm9yZy5vcGVuZWNvbXAuZGF0YXR5cGVzLmhlYXQuY29udHJhaWwubmV0d29yay5ydWxlLlBvcnRQYWlycyIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uUHJvcGVydHlGb3JtLlNUQVJUX1BPUlRfRklFTERfRk9SX1BPUlRfUEFJUlNfRFQuZ2V0VmFsdWUoKSkuc2VuZEtleXMoImZpcnN0Iik7CisJCS8vIHNhdmUKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnR5Rm9ybS5TQVZFX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlTdXBwbGllcjxCb29sZWFuPiBzdXBwbGllciA9ICgpIC0+IEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQobmV3UHJvcE5hbWUpOworCQlGdW5jdGlvbjxCb29sZWFuLCBCb29sZWFuPiByZXN1bHRWZXJpZmllciA9IGlzUHJlc2VudCAtPiBpc1ByZXNlbnQ7CisJCUJvb2xlYW4gaXNQcmVzZW50ID0gRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPblJlc3VsdChzdXBwbGllciwgcmVzdWx0VmVyaWZpZXIpOworCQlhc3NlcnRUcnVlKCJUaGUgbmV3IHByb3BlcnR5IHdhcyBub3QgaW5zZXJ0ZWQgdG8gdGhlIHByb3BlcnRpZXMgdGFibGUuIiwgaXNQcmVzZW50KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWaWV3QXR0cmlidXRlc1RhYkZvclZmYygpIHsKKwkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAiVkZDV2l0aEF0dHJpYnV0ZXMueW1sIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydFZmY1Jlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5pbXBvcnRWZmNJblVJKGdldFVzZXIoKSwgZmlsZVBhdGgsIGZpbGVOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQVRUUklCVVRFUyk7CisKKwkJTGlzdDxXZWJFbGVtZW50PiBhdHRyaWJ1dGVzUm93cyA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRzTGlzdFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkF0dHJpYnV0ZXNTZWN0aW9uLlRBQkxFX1JPV1MuZ2V0VmFsdWUoKSk7CisJCWFzc2VydFRydWUoIlRoZXJlIGlzIG5vdCBhbnkgcm93IGluIHRoZSB0YWJsZS4iLCAhQ29sbGVjdGlvblV0aWxzLmlzRW1wdHkoYXR0cmlidXRlc1Jvd3MpKTsKKwkJLy8gZGlzcGxheSBlZGl0YWJsZSBidXR0b25zCisJCWFzc2VydFRydWUoIlRoZSBBZGQgYnV0dG9uIGlzIG5vdCBkaXNwYWx5LiIsIEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoRGF0YVRlc3RJZEVudW0uQXR0cmlidXRlc1NlY3Rpb24uQUREX0JVVFRPTi5nZXRWYWx1ZSgpKSk7CisJCWFzc2VydFRydWUoIlRoZSBFZGl0IGJ1dHRvbiBpcyBub3QgZGlzcGFseSBmb3IgJ25ldHdvcmsnIGF0dHJpYnV0ZS4iLCBHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KERhdGFUZXN0SWRFbnVtLkF0dHJpYnV0ZXNTZWN0aW9uLkVESVRfQlVUVE9OX0ZPUl9ORVRXT1JLX0FUVFIuZ2V0VmFsdWUoKSkpOworCQlhc3NlcnRUcnVlKCJUaGUgUmVtb3ZlIGJ1dHRvbiBpcyBub3QgZGlzcGFseSBmb3IgJ25ldHdvcmsnIGF0dHJpYnV0ZS4iLCBHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KERhdGFUZXN0SWRFbnVtLkF0dHJpYnV0ZXNTZWN0aW9uLkRFTEVURV9CVVRUT05fRk9SX05FVFdPUktfQVRUUi5nZXRWYWx1ZSgpKSk7CisJCS8vIGNsaWNrIGNoZWNraW4KKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQkvLyBlbnRlciBhZ2FpbgorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoaW1wb3J0VmZjUmVzb3VyY2VJblVJLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQVRUUklCVVRFUyk7CisJCS8vIHRoZSBlZGl0YWJsZSBidXR0b25zIGRpc2FwcGVhcgorCQlhc3NlcnRUcnVlKCJUaGUgQWRkIGJ1dHRvbiBpcyBub3QgZGlzcGFseS4iLCAhR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudChEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVzU2VjdGlvbi5BRERfQlVUVE9OLmdldFZhbHVlKCkpKTsKKwkJYXNzZXJ0VHJ1ZSgiVGhlIEVkaXQgYnV0dG9uIGlzIG5vdCBkaXNwYWx5IGZvciAnbmV0d29yaycgYXR0cmlidXRlLiIsICFHZW5lcmFsVUlVdGlscy5pc0VsZW1lbnRQcmVzZW50KERhdGFUZXN0SWRFbnVtLkF0dHJpYnV0ZXNTZWN0aW9uLkVESVRfQlVUVE9OX0ZPUl9ORVRXT1JLX0FUVFIuZ2V0VmFsdWUoKSkpOworCQlhc3NlcnRUcnVlKCJUaGUgUmVtb3ZlIGJ1dHRvbiBpcyBub3QgZGlzcGFseSBmb3IgJ25ldHdvcmsnIGF0dHJpYnV0ZS4iLCAhR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudChEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVzU2VjdGlvbi5ERUxFVEVfQlVUVE9OX0ZPUl9ORVRXT1JLX0FUVFIuZ2V0VmFsdWUoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENyZWF0ZUF0dHJpYnV0ZUZvclZmYygpIHsKKwkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAiVkZDV2l0aEF0dHJpYnV0ZXMueW1sIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydFZmY1Jlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5pbXBvcnRWZmNJblVJKGdldFVzZXIoKSwgZmlsZVBhdGgsIGZpbGVOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQVRUUklCVVRFUyk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVzU2VjdGlvbi5BRERfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCS8vIGZpbGwgaW4gZmllbGRzCisJCVN0cmluZyBuZXdBdHRyTmFtZSA9ICJhdHRyIjsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkF0dHJpYnV0ZUZvcm0uTkFNRV9GSUVMRC5nZXRWYWx1ZSgpKS5zZW5kS2V5cyhuZXdBdHRyTmFtZSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVGb3JtLkRFU0NSSVBUSU9OX0ZJRUxELmdldFZhbHVlKCkpLnNlbmRLZXlzKCJkZXNjIik7CisJCVNlbGVjdCB0eXBlRmllbGQgPSBuZXcgU2VsZWN0KEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVGb3JtLlRZUEVfRklFTEQuZ2V0VmFsdWUoKSkpOworCQl0eXBlRmllbGQuc2VsZWN0QnlWaXNpYmxlVGV4dCgiaW50ZWdlciIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uQXR0cmlidXRlRm9ybS5ERUZBVUxUX1ZBTF9GSUVMRC5nZXRWYWx1ZSgpKS5zZW5kS2V5cygiMiIpOworCQkvLyBjbGljayBvaworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uQXR0cmlidXRlRm9ybS5ET05FX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlTdXBwbGllcjxCb29sZWFuPiBzdXBwbGllciA9ICgpIC0+IEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQobmV3QXR0ck5hbWUpOworCQlGdW5jdGlvbjxCb29sZWFuLCBCb29sZWFuPiByZXN1bHRWZXJpZmllciA9IGlzUHJlc2VudCAtPiBpc1ByZXNlbnQ7CisJCUJvb2xlYW4gaXNQcmVzZW50ID0gRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPblJlc3VsdChzdXBwbGllciwgcmVzdWx0VmVyaWZpZXIpOworCQlhc3NlcnRUcnVlKCJUaGUgbmV3IGF0dHJpYnV0ZSB3YXMgbm90IGluc2VydGVkIHRvIHRoZSBhdHRyaWJ1dGVzIHRhYmxlLiIsIGlzUHJlc2VudCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUZvckF0dHJpYnV0ZU9mVmZjKCkgeworCQlTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJWRkNXaXRoQXR0cmlidXRlcy55bWwiOworCQlSZXNvdXJjZVJlcURldGFpbHMgaW1wb3J0VmZjUmVzb3VyY2VJblVJID0gUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmY0luVUkoZ2V0VXNlcigpLCBmaWxlUGF0aCwgZmlsZU5hbWUpOworCQlWZlZlcmlmaWNhdG9yLnZlcmlmeVJlc291cmNlSXNDcmVhdGVkKGltcG9ydFZmY1Jlc291cmNlSW5VSSk7CisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoQ3JlYXRlQW5kVXBkYXRlU3RlcHNFbnVtLkFUVFJJQlVURVMpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uQXR0cmlidXRlc1NlY3Rpb24uRURJVF9CVVRUT05fRk9SX05FVFdPUktfQVRUUi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkvLyBmaWxsIGluIGZpZWxkcworCQlTZWxlY3QgdHlwZUZpZWxkID0gbmV3IFNlbGVjdChHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uQXR0cmlidXRlRm9ybS5UWVBFX0ZJRUxELmdldFZhbHVlKCkpKTsKKwkJdHlwZUZpZWxkLnNlbGVjdEJ5VmlzaWJsZVRleHQoImZsb2F0Iik7CisJCS8vIGNsaWNrIG9rCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVGb3JtLkRPTkVfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCVN1cHBsaWVyPEJvb2xlYW4+IHN1cHBsaWVyID0gKCkgLT4gR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudCgiZmxvYXQiKTsKKwkJRnVuY3Rpb248Qm9vbGVhbiwgQm9vbGVhbj4gcmVzdWx0VmVyaWZpZXIgPSBpc1ByZXNlbnQgLT4gaXNQcmVzZW50OworCQlCb29sZWFuIGlzUHJlc2VudCA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzLnJldHJ5TWV0aG9kT25SZXN1bHQoc3VwcGxpZXIsIHJlc3VsdFZlcmlmaWVyKTsKKwkJYXNzZXJ0VHJ1ZSgiVGhlIGF0dHJpYnV0ZSB0eXBlIHdhcyBub3QgdXBkYXRlZC4iLCBpc1ByZXNlbnQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlbGV0ZUF0dHJpYnV0ZUZvclZmYygpIHsKKwkJU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAiVkZDV2l0aEF0dHJpYnV0ZXMueW1sIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydFZmY1Jlc291cmNlSW5VSSA9IFJlc291cmNlVUlVdGlscy5pbXBvcnRWZmNJblVJKGdldFVzZXIoKSwgZmlsZVBhdGgsIGZpbGVOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uQVRUUklCVVRFUyk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BdHRyaWJ1dGVzU2VjdGlvbi5ERUxFVEVfQlVUVE9OX0ZPUl9ORVRXT1JLX0FUVFIuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuT0suZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlCb29sZWFuIHJldHJ5UmVzdWx0ID0gRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPblJlc3VsdCgoKSAtPiAhR2VuZXJhbFVJVXRpbHMuaXNFbGVtZW50UHJlc2VudCgibmV0d29ya3MiKSwgYm9vbFJlc3VsdCAtPiBib29sUmVzdWx0KTsKKwkJYXNzZXJ0VHJ1ZSgiVGhlIGF0dHJpYnV0ZSBpcyBzaG93biBpbiB0aGUgYXR0cmlidXRlcyB0YWJsZS4iLCByZXRyeVJlc3VsdCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VmZjKCkgeworCQlTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJDUC55bWwiOworCQlSZXNvdXJjZVJlcURldGFpbHMgaW1wb3J0VmZjUmVzb3VyY2VJblVJID0gUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmY0luVUkoZ2V0VXNlcigpLCBmaWxlUGF0aCwgZmlsZU5hbWUpOworCQlhc3NlcnRUcnVlKFJlc3RDRFV0aWxzLmdldFJlc291cmNlKGltcG9ydFZmY1Jlc291cmNlSW5VSSkuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9ydW4vU3RhcnRUZXN0LmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3J1bi9TdGFydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjMyNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy9ydW4vU3RhcnRUZXN0LmphdmEKQEAgLTAsMCArMSwzOTQgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5ydW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBTdGFydFRlc3QgeworCisJcHVibGljIHN0YXRpYyBsb25nIHRpbWVPZlRlc3QgPSAwOworCisJcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKwlwdWJsaWMgc3RhdGljIEF0b21pY0Jvb2xlYW4gbG9nZ2VySW5pdGlhbGl6ZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKwlwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBudWxsOworCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBUT0RPIHVpLWNpIGFkZCBqYXIgYnVpbGRpbmcKKwkJU3RyaW5nIGRlYnVnRW5hYmxlZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZGVidWciKTsKKwkJaWYgKGRlYnVnRW5hYmxlZCAhPSBudWxsICYmIGRlYnVnRW5hYmxlZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKwkJCWRlYnVnID0gdHJ1ZTsKKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlYnVnIG1vZGUgaXMgIiArIChkZWJ1ZyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKKworCQllbmFibGVMb2dnZXIoKTsKKworCQlDb25maWcgY29uZmlnID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisJCWlmIChjb25maWcgPT0gbnVsbCkgeworCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY29uZmlndXJhdGlvbiBmaWxlIG9mIGNpIHRlc3RzLiIpOworCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQlUZXN0TkcgdGVzdG5nID0gbmV3IFRlc3RORygpOworCisJCUxpc3Q8U3RyaW5nPiBzdWl0ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJc3VpdGVzLmFkZCgidGVzdFN1aXRlcy8iICsgYXJnc1swXSk7CisJCXRlc3RuZy5zZXRUZXN0U3VpdGVzKHN1aXRlcyk7CisJCS8vIHRlc3RuZy5zZXRVc2VEZWZhdWx0TGlzdGVuZXJzKHRydWUpOworCQl0ZXN0bmcuc2V0T3V0cHV0RGlyZWN0b3J5KCJ0YXJnZXQvIik7CisKKwkJdGVzdG5nLnJ1bigpOworCisJfQorCisJcHVibGljIFN0YXJ0VGVzdCgpIHsKKwkJbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihTdGFydFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlTG9nZ2VyKCkgeworCisJCWlmIChmYWxzZSA9PSBsb2dnZXJJbml0aWFsaXplZC5nZXQoKSkgeworCisJCQlsb2dnZXJJbml0aWFsaXplZC5zZXQodHJ1ZSk7CisKKwkJCVN0cmluZyBsb2c0alByb3BzRmlsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibG9nNGouY29uZmlndXJhdGlvbiIpOworCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmNvbnRhaW5zKCJXaW5kb3dzIikpIHsKKwkJCQlTdHJpbmcgbG9nUHJvcHMgPSAic3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvbG9nNGoucHJvcGVydGllcyI7CisJCQkJaWYgKGxvZzRqUHJvcHNGaWxlID09IG51bGwpIHsKKwkJCQkJU3lzdGVtLnNldFByb3BlcnR5KCJ0YXJnZXRsb2ciLCAidGFyZ2V0LyIpOworCQkJCQlsb2c0alByb3BzRmlsZSA9IGxvZ1Byb3BzOworCQkJCX0KKworCQkJfQorCQkJUHJvcGVydHlDb25maWd1cmF0b3IuY29uZmlndXJlQW5kV2F0Y2gobG9nNGpQcm9wc0ZpbGUpOworCisJCX0KKwl9CisKKwkvLyBwdWJsaWMgdm9pZCBzdGFydChMaXN0PFN0cmluZz4gcGFja2FnZXMsIGJvb2xlYW4gZXhpdE9uRmFpbHVyZSkgeworCS8vCisJLy8gYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKKwkvLyBTdHJpbmdCdWlsZGVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCS8vLy8gUmVzdWx0IHJlc3VsdDsKKwkvLworCS8vIGlmIChwYWNrYWdlcyA9PSBudWxsKSB7CisJLy8gcmV0dXJuOworCS8vIH0KKwkvLworCS8vLy8gZm9yIChTdHJpbmcgcGFja2FnZU5hbWUgOiBwYWNrYWdlcykgeworCS8vLy8gLy9MaXN0PENsYXNzPiBjbGFzc2VzRm9yUGFja2FnZSA9CisJLy8gZ2V0Q2xhc3Nlc0ZvclBhY2thZ2UoIm9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUiKTsKKwkvLy8vIExpc3Q8Q2xhc3M+IGNsYXNzZXNGb3JQYWNrYWdlID0gZ2V0Q2xhc3Nlc0ZvclBhY2thZ2UocGFja2FnZU5hbWUpOworCS8vLy8gaWYgKGNsYXNzZXNGb3JQYWNrYWdlICE9IG51bGwgJiYgZmFsc2UgPT0gY2xhc3Nlc0ZvclBhY2thZ2UuaXNFbXB0eSgpKQorCS8vIHsKKwkvLy8vIGZvciAoQ2xhc3MgdGVzdFVuaXQgOiBjbGFzc2VzRm9yUGFja2FnZSkgeworCS8vLy8gdGVzdENsYXNzZXMuYWRkKHRlc3RVbml0KTsKKwkvLy8vIH0KKwkvLy8vIH0KKwkvLy8vIH0KKwkvLy8vCisJLy8vLyBTeXN0ZW0ub3V0LnByaW50bG4odGVzdENsYXNzZXMpOworCS8vCisJLy8gLy8gdHNldENsYXNzZXMuYWRkKExvZ1ZhbGlkYXRvclRlc3QuY2xhc3MpOworCS8vIC8vIHRzZXRDbGFzc2VzLmFkZChBdHROb3J0aGJvdW5kVGVzdC5jbGFzcyk7CisJLy8KKwkvLy8vIHJlc3VsdHMuYXBwZW5kKCI8SHRtbD48aGVhZD48c3R5bGU+dGh7YmFja2dyb3VuZC1jb2xvcjogZ3JheTtjb2xvcjoKKwkvLyB3aGl0ZTtoZWlnaHQ6IDMwcHg7fXRkIHtjb2xvcjogYmxhY2s7aGVpZ2h0OiAzMHB4O30uZmFpbAorCS8vIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkY1NTU1O3dpZHRoOiAxMDBweDt0ZXh0LWFsaWduOiBjZW50ZXI7fS5zdWNjZXNzCisJLy8ge2JhY2tncm91bmQtY29sb3I6ICMwMEZGMDA7d2lkdGg6IDEwMHB4O3RleHQtYWxpZ246IGNlbnRlcjt9Lm5hbWUge3dpZHRoOgorCS8vIDIwMHB4O2JhY2tncm91bmQtY29sb3I6ICNGMEYwRjA7fS5tZXNzYWdlIHt3aWR0aDogMzAwcHg7YmFja2dyb3VuZC1jb2xvcjoKKwkvLyAjRjBGMEYwO308L3N0eWxlPjwvaGVhZD48Ym9keT4iKTsKKwkvLworCS8vIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkvLyB0aW1lT2ZUZXN0ID0gY2FsZW5kYXIuZ2V0VGltZUluTWlsbGlzKCk7CisJLy8gU2ltcGxlRGF0ZUZvcm1hdCBkYXRlX2Zvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAorCS8vICJNTU0gZGQgeXl5eSBISDptbTpzcyIpOworCS8vIHJlc3VsdHMuYXBwZW5kKCI8YnIvPjxoMj4gVGhpcyByZXBvcnQgZ2VuZXJhdGVkIG9uICIKKwkvLyArIGRhdGVfZm9ybWF0LmZvcm1hdChjYWxlbmRhci5nZXRUaW1lKCkpICsgIjwvaDI+PGJyLz4iKTsKKwkvLworCS8vIHJlc3VsdHMuYXBwZW5kKCI8dGFibGU+Iik7CisJLy8gYWRkVGFibGVIZWFkKHJlc3VsdHMpOworCS8vCisJLy8vLyBpbnQgc2l6ZSA9IHRlc3RDbGFzc2VzLnNpemUoKTsKKwkvLyBpbnQgaW5kZXggPSAwOworCS8vCisJLy8gaW50IHRvdGFsUnVuVGVzdHMgPSAwOworCS8vIGludCB0b3RhbEZhaWx1cmVUZXN0cyA9IDA7CisJLy8gaW50IHRvdGFsSWdub3JlVGVzdHMgPSAwOworCS8vIGludCBudW1PZkZhaWx1cmVDbGFzc2VzID0gMDsKKwkvLyBmb3IgKENsYXNzPD8gZXh0ZW5kcyBBdHRTZGNUZXN0PiB0ZXN0Q2xhc3MgOiB0ZXN0Q2xhc3NlcykgeworCS8vCisJLy8gaW5kZXggKys7CisJLy8KKwkvLyBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCS8vIFN0cmluZyBzdHIgPQorCS8vICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOworCS8vIGJ1aWxkZXIuYXBwZW5kKHN0ciArICJcbiIpOworCS8vIFN0cmluZyBjdXJyZW50ID0gImNsYXNzICIgKyBpbmRleCArICIvIiArIHNpemUgKyAiIGZhaWx1cmUoIgorCS8vICsgbnVtT2ZGYWlsdXJlQ2xhc3NlcyArICIpICsgUlVOUygiICsgdG90YWxSdW5UZXN0cyArICIpIgorCS8vICsgIiBGQUlMVVJFUygiICsgdG90YWxGYWlsdXJlVGVzdHMgKyAiKSBJR05PUkVEKCIKKwkvLyArIHRvdGFsSWdub3JlVGVzdHMgKyAiKSI7CisJLy8gaW50IGludGVydmFsID0gKChzdHIubGVuZ3RoKCkgLSBjdXJyZW50Lmxlbmd0aCgpIC0gMikvIDIpOworCS8vIFN0cmluZyBzdWJzdHJpbmcgPSBzdHIuc3Vic3RyaW5nKDAsIGludGVydmFsKTsKKwkvLyBidWlsZGVyLmFwcGVuZChzdWJzdHJpbmcgKyAiICIgKyBjdXJyZW50ICsgIiAiICsgc3Vic3RyaW5nICsgIlxuIik7CisJLy8gYnVpbGRlci5hcHBlbmQoc3RyICsgIlxuIik7CisJLy8KKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oYnVpbGRlci50b1N0cmluZygpKTsKKwkvLworCS8vIGxvZ2dlci5kZWJ1ZyhidWlsZGVyLnRvU3RyaW5nKCkpOworCS8vIGxvZ2dlci5kZWJ1ZygiR29pbmcgdG8gcnVuIHRlc3QgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCkpOworCS8vCisJLy8gcmVzdWx0ID0gSlVuaXRDb3JlLnJ1bkNsYXNzZXModGVzdENsYXNzKTsKKwkvLyBpZiAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSA9PSBmYWxzZSkgeworCS8vIG51bU9mRmFpbHVyZUNsYXNzZXMrKzsKKwkvLyB9CisJLy8gbG9nZ2VyLmRlYnVnKCJUZXN0IGNsYXNzICIgKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCAiICsKKwkvLyAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSA/ICJPSy4iIDogIiBXSVRIIEVSUk9SLiIpKTsKKwkvLyBMaXN0PEZhaWx1cmU+IGZhaWx1cmVzID0gcmVzdWx0LmdldEZhaWx1cmVzKCk7CisJLy8gaWYgKGZhaWx1cmVzICE9IG51bGwpIHsKKwkvLyBmb3IgKEZhaWx1cmUgZmFpbHVyZSA6IGZhaWx1cmVzKSB7CisJLy8gbG9nZ2VyLmVycm9yKCJUZXN0IGNsYXNzICIgKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpICsgIiBmYWlsdXJlIHRlc3QgIiArCisJLy8gZmFpbHVyZS5nZXRUZXN0SGVhZGVyKCkgKyAiLSIgKyBmYWlsdXJlLmdldFRyYWNlKCkpOworCS8vIH0KKwkvLyB9CisJLy8gaW50IHJ1bnNQZXJDbGFzcyA9IHJlc3VsdC5nZXRSdW5Db3VudCgpOworCS8vIGludCBmYWlsdXJlc1BlckNsYXNzID0gcmVzdWx0LmdldEZhaWx1cmVDb3VudCgpOworCS8vIGludCBpZ25vcmVkUGVyQ2xhc3MgPSByZXN1bHQuZ2V0SWdub3JlQ291bnQoKTsKKwkvLworCS8vIHRvdGFsUnVuVGVzdHMgKz0gcnVuc1BlckNsYXNzOworCS8vIHRvdGFsRmFpbHVyZVRlc3RzICs9IGZhaWx1cmVzUGVyQ2xhc3M7CisJLy8gdG90YWxJZ25vcmVUZXN0cyArPSBpZ25vcmVkUGVyQ2xhc3M7CisJLy8KKwkvLyBsb2dnZXIuZGVidWcoImNsYXNzICIgKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpICsgIiBGYWlsZWQgdGVzdHMgIiArCisJLy8gKGZhaWx1cmVzUGVyQ2xhc3MgKiAxLjApIC8gcnVuc1BlckNsYXNzICogMTAwICsgIiAlIik7CisJLy8gbG9nZ2VyLmRlYnVnKCJjbGFzcyAiICsgdGVzdENsYXNzLmdldE5hbWUoKSArICIgSWdub3JlZCB0ZXN0cyAiICsKKwkvLyAoaWdub3JlZFBlckNsYXNzICogMS4wKSAvIHJ1bnNQZXJDbGFzcyAqIDEwMCArICIgJSIpOworCS8vCisJLy8KKwkvLy8vIExpc3Q8RmFpbHVyZT4gZmFpbHVyZXMgPSByZXN1bHQuZ2V0RmFpbHVyZXMoKTsKKwkvLy8vIGlmIChmYWlsdXJlcyAhPSBudWxsKSB7CisJLy8vLyBmb3IgKEZhaWx1cmUgZmFpbHVyZSA6IGZhaWx1cmVzKSB7CisJLy8vLyBTeXN0ZW0uZXJyLnByaW50bG4oIjk5OTk5OTk5OTkiICsgZmFpbHVyZS5nZXRUZXN0SGVhZGVyKCkpOworCS8vLy8gfQorCS8vLy8gfQorCS8vCisJLy8gYWRkVW5pdFRlc3RSZXN1bHQocmVzdWx0cywgdGVzdENsYXNzLCByZXN1bHQpOworCS8vIHN1Y2Nlc3MgJj0gcmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKTsKKwkvLworCS8vIGlmIChudW1PZkZhaWx1cmVDbGFzc2VzID4gMCkgeworCS8vIC8vaWYgKGV4aXRPbkZhaWx1cmUpIHsKKwkvLyBpZiAoZXhpdE9uRmFpbHVyZSkgeworCS8vIGJyZWFrOworCS8vIH0KKwkvLyB9CisJLy8gfQorCS8vCisJLy8gcmVzdWx0cy5hcHBlbmQoIjwvdGFibGU+Iik7CisJLy8gcmVzdWx0cy5hcHBlbmQoIjxici8+PGgyPiBUZXN0cyBTdW1tYXJ5OiA8L2gyPjxici8+Iik7CisJLy8gcmVzdWx0cy5hcHBlbmQoIlRvdGFsIFJ1bnMgOiAiICsgdG90YWxSdW5UZXN0cyArICI8YnIvPiIpOworCS8vIHJlc3VsdHMuYXBwZW5kKCJUb3RhbCBGYWlsdXJlIDogIiArIHRvdGFsRmFpbHVyZVRlc3RzICsgIjxici8+Iik7CisJLy8gcmVzdWx0cy5hcHBlbmQoIlRvdGFsOiAiICsgdG90YWxGYWlsdXJlVGVzdHMgKyAiLyIgKyB0b3RhbFJ1blRlc3RzICsKKwkvLyAiPGJyLz4iKTsKKwkvLyByZXN1bHRzLmFwcGVuZCgiPC9odG1sPiIpOworCS8vCisJLy8gRmlsZVV0aWxzLndyaXRlVG9GaWxlKENvbmZpZy5pbnN0YW5jZSgpLmdldE91dHB1dEZvbGRlcigpCisJLy8gKyBGaWxlLnNlcGFyYXRvciArIENvbmZpZy5pbnN0YW5jZSgpLmdldFJlcG9ydE5hbWUoKSwKKwkvLyByZXN1bHRzLnRvU3RyaW5nKCkpOworCS8vCisJLy8gaWYgKCFzdWNjZXNzKSB7CisJLy8gU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFIik7CisJLy8gbG9nZ2VyLmVycm9yKCJGYWlsdXJlIHRlc3RzIDogIiArICgodG90YWxGYWlsdXJlVGVzdHMgKyB0b3RhbElnbm9yZVRlc3RzKQorCS8vICogMS4wKS8gKHRvdGFsUnVuVGVzdHMgKyB0b3RhbElnbm9yZVRlc3RzKSArICIgJSIpOworCS8vIGxvZ2dlci5lcnJvcigiSWdub3JlZCB0ZXN0cyA6ICIgKyAodG90YWxJZ25vcmVUZXN0cyAqIDEuMCkvCisJLy8gKHRvdGFsUnVuVGVzdHMgKyB0b3RhbElnbm9yZVRlc3RzKSArICIgJSIpOworCS8vIFN5c3RlbS5leGl0KDEpOworCS8vIH0KKwkvLworCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU1VDQ0VTUyIpOworCS8vIH0KKworCXByaXZhdGUgTGlzdDxDbGFzcz4gZ2V0Q2xhc3Nlc0ZvclBhY2thZ2UoU3RyaW5nIHBrZ25hbWUpIHsKKworCQlMaXN0PENsYXNzPiBjbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKKworCQkvLyBHZXQgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHBhY2thZ2UKKwkJRmlsZSBkaXJlY3RvcnkgPSBudWxsOworCQlTdHJpbmcgZnVsbFBhdGg7CisJCVN0cmluZyByZWxQYXRoID0gcGtnbmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKKworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBQYWNrYWdlOiAiICsgcGtnbmFtZSArCisJCS8vICIgYmVjb21lcyBQYXRoOiIgKyByZWxQYXRoKTsKKworCQlVUkwgcmVzb3VyY2UgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLmdldFJlc291cmNlKHJlbFBhdGgpOworCisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEaXNjb3Zlcnk6IFJlc291cmNlID0gIiArIHJlc291cmNlKTsKKwkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyByZXNvdXJjZSBmb3IgIiArIHJlbFBhdGgpOworCQl9CisJCWZ1bGxQYXRoID0gcmVzb3VyY2UuZ2V0RmlsZSgpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBGdWxsUGF0aCA9ICIgKyByZXNvdXJjZSk7CisKKwkJaWYgKGRlYnVnKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZ1bGxQYXRoIGlzICIgKyBmdWxsUGF0aCk7CisJCX0KKworCQl0cnkgeworCQkJZGlyZWN0b3J5ID0gbmV3IEZpbGUocmVzb3VyY2UudG9VUkkoKSk7CisJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKwkJCQkJcGtnbmFtZSArICIgKCIgKyByZXNvdXJjZQorCQkJCQkJCSsgIikgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgVVJMIC8gVVJJLiAgU3RyYW5nZSwgc2luY2Ugd2UgZ290IGl0IGZyb20gdGhlIHN5c3RlbS4uLiIsCisJCQkJCWUpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJZGlyZWN0b3J5ID0gbnVsbDsKKwkJfQorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBEaXJlY3RvcnkgPSAiICsgZGlyZWN0b3J5KTsKKworCQlpZiAoZGlyZWN0b3J5ICE9IG51bGwgJiYgZGlyZWN0b3J5LmV4aXN0cygpKSB7CisKKwkJCS8vIEdldCB0aGUgbGlzdCBvZiB0aGUgZmlsZXMgY29udGFpbmVkIGluIHRoZSBwYWNrYWdlCisJCQlTdHJpbmdbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisKKwkJCQkvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIC5jbGFzcyBmaWxlcworCQkJCWlmIChmaWxlc1tpXS5lbmRzV2l0aCgiLmNsYXNzIikgJiYgZmFsc2UgPT0gZmlsZXNbaV0uY29udGFpbnMoIiQiKSkgeworCisJCQkJCS8vIHJlbW92ZXMgdGhlIC5jbGFzcyBleHRlbnNpb24KKwkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHBrZ25hbWUgKyAnLicgKyBmaWxlc1tpXS5zdWJzdHJpbmcoMCwgZmlsZXNbaV0ubGVuZ3RoKCkgLSA2KTsKKworCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBjbGFzc05hbWUgPSAiICsKKwkJCQkJLy8gY2xhc3NOYW1lKTsKKworCQkJCQlpZiAoZGVidWcpIHsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEaXNjb3Zlcnk6IGNsYXNzTmFtZSA9ICIgKyBjbGFzc05hbWUpOworCQkJCQl9CisKKwkJCQkJdHJ5IHsKKwkJCQkJCUNsYXNzIGNsYXMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisJCQkJCQlib29sZWFuIGlzQWRkVG9SdW4gPSBmYWxzZTsKKwkJCQkJCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGFzLmdldE1ldGhvZHMoKTsKKwkJCQkJCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKwkJCQkJCQlBbm5vdGF0aW9uW10gYW5ucyA9IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpOworCQkJCQkJCWZvciAoQW5ub3RhdGlvbiBhbiA6IGFubnMpIHsKKwkJCQkJCQkJaWYgKGFuLmFubm90YXRpb25UeXBlKCkuZ2V0U2ltcGxlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIlRlc3QiKSkgeworCQkJCQkJCQkJaXNBZGRUb1J1biA9IHRydWU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmIChpc0FkZFRvUnVuKQorCQkJCQkJCWNsYXNzZXMuYWRkKGNsYXMpOworCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGxvYWRpbmcgIiArIGNsYXNzTmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCVN0cmluZyBqYXJQYXRoID0gZnVsbFBhdGgucmVwbGFjZUZpcnN0KCJbLl1qYXJbIV0uKiIsICIuamFyIikucmVwbGFjZUZpcnN0KCJmaWxlOiIsICIiKTsKKworCQkJCWlmIChkZWJ1ZykgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImphclBhdGggaXMgIiArIGphclBhdGgpOworCQkJCX0KKworCQkJCUphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGphclBhdGgpOworCQkJCUVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7CisJCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQkJSmFyRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisJCQkJCVN0cmluZyBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisJCQkJCWlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aChyZWxQYXRoKSAmJiBlbnRyeU5hbWUubGVuZ3RoKCkgPiAocmVsUGF0aC5sZW5ndGgoKSArICIvIi5sZW5ndGgoKSkpIHsKKworCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogSmFyRW50cnk6ICIgKworCQkJCQkJLy8gZW50cnlOYW1lKTsKKwkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbnRyeU5hbWUucmVwbGFjZSgnLycsICcuJykucmVwbGFjZSgnXFwnLCAnLicpLnJlcGxhY2UoIi5jbGFzcyIsICIiKTsKKworCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0Rpc2NvdmVyeTogY2xhc3NOYW1lID0gIiArCisJCQkJCQkvLyBjbGFzc05hbWUpOworCisJCQkJCQlpZiAoZmFsc2UgPT0gY2xhc3NOYW1lLmNvbnRhaW5zKCIkIikpIHsKKworCQkJCQkJCWlmIChkZWJ1ZykgeworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGlzY292ZXJ5OiBjbGFzc05hbWUgPSAiICsgY2xhc3NOYW1lKTsKKwkJCQkJCQl9CisKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlDbGFzcyBjbGFzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCQkJCQkJCQlib29sZWFuIGlzQWRkVG9SdW4gPSBmYWxzZTsKKwkJCQkJCQkJTWV0aG9kW10gbWV0aG9kcyA9IGNsYXMuZ2V0TWV0aG9kcygpOworCQkJCQkJCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisJCQkJCQkJCQlBbm5vdGF0aW9uW10gYW5ucyA9IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpOworCQkJCQkJCQkJZm9yIChBbm5vdGF0aW9uIGFuIDogYW5ucykgeworCQkJCQkJCQkJCWlmIChhbi5hbm5vdGF0aW9uVHlwZSgpLmdldFNpbXBsZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJUZXN0IikpIHsKKwkJCQkJCQkJCQkJaXNBZGRUb1J1biA9IHRydWU7CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoaXNBZGRUb1J1bikKKwkJCQkJCQkJCWNsYXNzZXMuYWRkKGNsYXMpOworCQkJCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBsb2FkaW5nICIgKyBjbGFzc05hbWUpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlqYXJGaWxlLmNsb3NlKCk7CisKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihwa2duYW1lICsgIiAoIiArIGRpcmVjdG9yeSArICIpIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIHBhY2thZ2UiLCBlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY2xhc3NlczsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkVGFibGVIZWFkKFN0cmluZ0J1aWxkZXIgcmVzdWx0cykgeworCQlyZXN1bHRzLmFwcGVuZCgiPHRyPiIpOworCQlyZXN1bHRzLmFwcGVuZCgiPHRoPiIpLmFwcGVuZCgiVW5pdCBUZXN0IikuYXBwZW5kKCI8L3RoPiIpOworCQlyZXN1bHRzLmFwcGVuZCgiPHRoPiIpLmFwcGVuZCgiUmVzdWx0IikuYXBwZW5kKCI8L3RoPiIpOworCQlyZXN1bHRzLmFwcGVuZCgiPC90cj4iKTsKKwl9CisKKwkvLyBwcml2YXRlIHZvaWQgYWRkVW5pdFRlc3RSZXN1bHQoU3RyaW5nQnVpbGRlciByZXN1bHRzLAorCS8vIENsYXNzPD8gZXh0ZW5kcyBBdHRTZGNUZXN0PiB0ZXN0Q2xhc3MsIFJlc3VsdCB1bml0VGVzdFJlc3VsdCkgeworCS8vCisJLy8gYm9vbGVhbiBpc1N1Y2Nlc3MgPSB1bml0VGVzdFJlc3VsdC53YXNTdWNjZXNzZnVsKCk7CisJLy8KKwkvLyBTdHJpbmcgcmVzdWx0ID0gKGlzU3VjY2VzcykgPyAic3VjY2VzcyIgOiAiZmFpbCI7CisJLy8gU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWxzLmdldEZpbGVOYW1lKHRlc3RDbGFzcy5nZXROYW1lKCkpOworCS8vIHJlc3VsdHMuYXBwZW5kKCI8dHI+Iik7CisJLy8gLy8KKwkvLyByZXN1bHRzLmFwcGVuZCgiPHRkPiIpLmFwcGVuZChGaWxlVXRpbHMuZ2V0RmlsZU5hbWUodGVzdENsYXNzLmdldE5hbWUoKSkpLmFwcGVuZCgiPC90ZD4iKTsKKwkvLyByZXN1bHRzLmFwcGVuZCgiPHRkIGNsYXNzPVwibmFtZVwiPiIpCisJLy8gLmFwcGVuZCgiPGEgaHJlZj1cIiIgKyBmaWxlTmFtZSArIHRpbWVPZlRlc3QgKyAiLmh0bWxcIj4iCisJLy8gKyBmaWxlTmFtZSArICI8L2E+IikuYXBwZW5kKCI8L3RkPiIpOworCS8vIHJlc3VsdHMuYXBwZW5kKCI8dGQgY2xhc3M9XCIiICsgcmVzdWx0ICsgIlwiPiIpLmFwcGVuZChyZXN1bHQpCisJLy8gLmFwcGVuZCgiPC90ZD4iKTsKKwkvLyByZXN1bHRzLmFwcGVuZCgiPC90cj4iKTsKKwkvLyB9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL0FydGlmYWN0VUlVdGlscy5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvQXJ0aWZhY3RVSVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjOWMwNwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL0FydGlmYWN0VUlVdGlscy5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkNyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5BcnRpZmF0Y3M7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uSW5mb3JtYXRpb25hbEFydGlmYXRjczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5GdW5jdGlvbmFsSW50ZXJmYWNlczsKKworcHVibGljIGZpbmFsIGNsYXNzIEFydGlmYWN0VUlVdGlscyB7CisKKwlwcml2YXRlIEFydGlmYWN0VUlVdGlscygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZEluZm9ybWF0aW9uQXJ0aWZhY3QoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0LCBTdHJpbmcgZmlsZVBhdGgsCisJCQlmaW5hbCBJbmZvcm1hdGlvbmFsQXJ0aWZhdGNzIGRhdGFUZXN0RW51bSkgeworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLnNsZWVwKDIwMDApOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZGF0YVRlc3RFbnVtLmdldFZhbHVlKCkpLmNsaWNrKCk7CisKKwkJZmluYWwgV2ViRWxlbWVudCBicm93c2VXZWJFbGVtZW50ID0gRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPbkV4Y2VwdGlvbigKKwkJCQkoKSAtPiBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5CUk9XU0VfQlVUVE9OLmdldFZhbHVlKCkpKTsKKwkJYnJvd3NlV2ViRWxlbWVudC5zZW5kS2V5cyhmaWxlUGF0aCk7CisKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuREVTQ1JJUFRJT04uZ2V0VmFsdWUoKSkKKwkJCQkuc2VuZEtleXMoYXJ0aWZhY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLkRPTkUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0QXJ0aWZhY3RzTGlzdEZyb21SZXNwb25zZShTdHJpbmcganNvblJlc3BvbnNlLAorCQkJU3RyaW5nIGZpZWxkT2ZBcnRpZmFjdExpc3QpIHsKKwkJSlNPTk9iamVjdCBvYmplY3QgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKGpzb25SZXNwb25zZSk7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcCA9IChNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+Pikgb2JqZWN0LmdldChmaWVsZE9mQXJ0aWZhY3RMaXN0KTsKKwkJcmV0dXJuIG1hcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBhcnRpZmFjdCBvbiB0aGUgdmYuIDxicj4KKwkgKiBNb3ZlcyBhdXRvbWF0aWNhbGx5IHRvIERlcGxveW1lbnRBcnRpZmFjdCBTZWN0aW9uCisJICogCisJICogQHBhcmFtIGFydGlmYWN0UGF5bG9hZFBhdGgKKwkgKiBAcGFyYW0gYXJ0aWZhY3RUeXBlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnRBcnRpZmFjdE9uVmYoZmluYWwgU3RyaW5nIGFydGlmYWN0UGF5bG9hZFBhdGgsCisJCQlmaW5hbCBBcnRpZmFjdFR5cGVFbnVtIGFydGlmYWN0VHlwZSkgeworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bS5ERVBMT1lNRU5UX0FSVElGQUNUKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoQXJ0aWZhdGNzLkFERF9ERVBMT1lNRU5UX0FSVElGQUNULmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoIkNyZWF0ZSBOZXcgQXJ0aWZhY3QiLCBBcnRpZmF0Y3MuU0VMRUNUX0FSVElGQUNUX0RST1BET1dOLmdldFZhbHVlKCkpOworCQlHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KGFydGlmYWN0VHlwZS5nZXRUeXBlKCksIEFydGlmYXRjcy5BUlRJRkFDVF9UWVBFX0RST1BET1dOLmdldFZhbHVlKCkpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoQXJ0aWZhdGNzLkFSVElGQUNUX0RFU0NSSVBUSU9OLmdldFZhbHVlKCkpCisJCQkJLnNlbmRLZXlzKCJBcnRpZmFjdCBEZXNjcmlwdGlvbiIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoQXJ0aWZhdGNzLkFSVElGQUNUX0xBQkVMLmdldFZhbHVlKCkpLnNlbmRLZXlzKCJNeUFydGlmYWN0TGFiZWwiKTsKKwkJcmV0cnlNZXRob2RPbkV4Y2VwdGlvbigoKSAtPiBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50QnlEYXRhVGVzdElkKEFydGlmYXRjcy5CUk9XU0VfQlVUVE9OLmdldFZhbHVlKCkpCisJCQkJLnNlbmRLZXlzKGFydGlmYWN0UGF5bG9hZFBhdGgpKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKEFydGlmYXRjcy5BRERfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL0ZpbGVIYW5kbGluZy5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvRmlsZUhhbmRsaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NDk3NAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL0ZpbGVIYW5kbGluZy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CisKK3B1YmxpYyBjbGFzcyBGaWxlSGFuZGxpbmcgeworCisJcHVibGljIHN0YXRpYyBNYXA8PywgPz4gcGFyc2VZYW1sRmlsZShTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlZYW1sIHlhbWwgPSBuZXcgWWFtbCgpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7CisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJTWFwPD8sID8+IG1hcCA9IChNYXA8PywgPz4pIHlhbWwubG9hZChpbnB1dFN0cmVhbSk7CisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7CisJCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCkgeworCQlyZXR1cm4gZ2V0QmFzZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIgKyBGaWxlLnNlcGFyYXRvciArICJtYWluIiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIKKwkJCQkrIEZpbGUuc2VwYXJhdG9yICsgIkZpbGVzIiArIEZpbGUuc2VwYXJhdG9yOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvR2VuZXJhbFVJVXRpbHMuamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL0dlbmVyYWxVSVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxNDQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL0dlbmVyYWxVSVV0aWxzLmphdmEKQEAgLTAsMCArMSwzNDYgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPbkV4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPblJlc3VsdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZGF0YXR5cGVzLkNyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5EYXNoYm9hcmQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLmJhc2UuU2V0dXBDRFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLlBsYXRmb3JtOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRHJpdmVyOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLmZpcmVmb3guRmlyZWZveERyaXZlcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLmludGVyYWN0aW9ucy5BY3Rpb25zOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0ucmVtb3RlLkRlc2lyZWRDYXBhYmlsaXRpZXM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5yZW1vdGUuUmVtb3RlV2ViRHJpdmVyOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5FeHBlY3RlZENvbmRpdGlvbjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuRXhwZWN0ZWRDb25kaXRpb25zOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5TZWxlY3Q7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLldlYkRyaXZlcldhaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5GdW5jdGlvbmFsSW50ZXJmYWNlczsKKworcHVibGljIGZpbmFsIGNsYXNzIEdlbmVyYWxVSVV0aWxzIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBSVRfVElNRV9JTl9TRUNPTkRTID0gMTA7CisJLyoqKioqKioqKioqKioqKiogRFJJVkVSUyAqKioqKioqKioqKioqKioqLworCXByaXZhdGUgc3RhdGljIFdlYkRyaXZlciBkcml2ZXI7CisKKwlwcml2YXRlIEdlbmVyYWxVSVV0aWxzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogRmluZGluZyBhIGNvbXBvbmVudCBpbiB0aGUgaG9tZSBzY3JlZW4gYnkgbmFtZSBhbmQgY2xpY2tzIG9uIGl0CisJICogVXNlcyB0aGUgc2VhcmNoIAorCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgZmluZENvbXBvbmVudEFuZENsaWNrKFN0cmluZyBjb21wb25lbnROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJtYWluLW1lbnUtaW5wdXQtc2VhcmNoIikuc2VuZEtleXMoY29tcG9uZW50TmFtZSk7CisJCXRyeSB7CisJCQlnZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShjb21wb25lbnROYW1lKS5jbGljaygpOworCQkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJmb3JtbGlmZWN5Y2xlc3RhdGUiKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJESUQgTk9UIEZJTkQgQSBDT01QT05FTlQgTkFNRUQgJXMiLCBjb21wb25lbnROYW1lKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworCQkJQXNzZXJ0LmZhaWwobXNnKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJcmV0dXJuIGdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShkYXRhVGVzdElkLCBERUZBVUxUX1dBSVRfVElNRV9JTl9TRUNPTkRTKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKFN0cmluZyBkYXRhVGVzdElkLCBpbnQgdGltZSkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChnZXREcml2ZXIoKSwgdGltZSk7CisJCUV4cGVjdGVkQ29uZGl0aW9uPFdlYkVsZW1lbnQ+IHZpc2liaWxpdHlPZkVsZW1lbnRMb2NhdGVkID0gRXhwZWN0ZWRDb25kaXRpb25zCisJCQkJLnZpc2liaWxpdHlPZkVsZW1lbnRMb2NhdGVkKGJ1aWxEYXRhVGVzdElkTG9jYXRvcihkYXRhVGVzdElkKSk7CisJCVdlYkVsZW1lbnQgd2ViRWxlbWVudCA9IHdhaXQudW50aWwodmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQpOworCQlyZXR1cm4gd2ViRWxlbWVudDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZ2V0RHJpdmVyKCksIERFRkFVTFRfV0FJVF9USU1FX0lOX1NFQ09ORFMpOworCQlFeHBlY3RlZENvbmRpdGlvbjxXZWJFbGVtZW50PiBjb25kaXRpb24gPSBFeHBlY3RlZENvbmRpdGlvbnMKKwkJCQkuZWxlbWVudFRvQmVDbGlja2FibGUoYnVpbERhdGFUZXN0SWRMb2NhdG9yKGRhdGFUZXN0SWQpKTsKKwkJV2ViRWxlbWVudCB3ZWJFbGVtZW50ID0gd2FpdC51bnRpbChjb25kaXRpb24pOworCQlyZXR1cm4gd2ViRWxlbWVudDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBCeSBidWlsRGF0YVRlc3RJZExvY2F0b3IoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJcmV0dXJuIEJ5LnhwYXRoKCIvLypbQGRhdGEtdGVzdHMtaWQ9JyIgKyBkYXRhVGVzdElkICsgIiddIik7CisKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIEEgbGlzdCBvZiBXZWIgRWxlbWVudHMgV2hlbiB0aGV5IGFyZSBhbGwgdmlzaWJsZQorCSAqIAorCSAqIEBwYXJhbSBkYXRhVGVzdElkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXRXZWJFbGVtZW50c0xpc3RXYWl0Rm9yVmlzaWJsZShTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChnZXREcml2ZXIoKSwgREVGQVVMVF9XQUlUX1RJTUVfSU5fU0VDT05EUyk7CisJCUV4cGVjdGVkQ29uZGl0aW9uPExpc3Q8V2ViRWxlbWVudD4+IHZpc2liaWxpdHlPZkFsbEVsZW1lbnRzTG9jYXRlZEJ5ID0gRXhwZWN0ZWRDb25kaXRpb25zCisJCQkJLnZpc2liaWxpdHlPZkFsbEVsZW1lbnRzTG9jYXRlZEJ5KGJ1aWxEYXRhVGVzdElkTG9jYXRvcihkYXRhVGVzdElkKSk7CisJCXJldHVybiB3YWl0LnVudGlsKHZpc2liaWxpdHlPZkFsbEVsZW1lbnRzTG9jYXRlZEJ5KTsKKwl9CisKKwkvKioKKwkgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiB1c2Uge0BsaW5rICNnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoU3RyaW5nKX0KKwkgKiBAcGFyYW0gZGF0YVRlc3RJZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlyZXR1cm4gZHJpdmVyLmZpbmRFbGVtZW50KGJ1aWxEYXRhVGVzdElkTG9jYXRvcihkYXRhVGVzdElkKSk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIGlmIGVsZW1lbnQgaXMgcHJlc2VudCB3aXRoIGdpdmVuIGRhdGFUZXN0c0lkCisJICogCisJICogQHBhcmFtIGRhdGFUZXN0SWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWxlbWVudFByZXNlbnQoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJZmluYWwgYm9vbGVhbiBpc1ByZXNlbnQgPSAhZHJpdmVyLmZpbmRFbGVtZW50cyhidWlsRGF0YVRlc3RJZExvY2F0b3IoZGF0YVRlc3RJZCkpLmlzRW1wdHkoKTsKKwkJcmV0dXJuIGlzUHJlc2VudDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tPbkNyZWF0ZUVudGl0eUZyb21EYXNoYm9hcmQoU3RyaW5nIGJ1dHRvbklkKSB7CisJCVN1cHBsaWVyPFdlYkVsZW1lbnQ+IGFkZFZmQnV0dG9uU2lwcGxpZXIgPSAoKSAtPiB7CisJCQkvLyBUT0RPIHVpLWNpIHJlcGxhY2Ugd2l0aCBkYXRhLXRlc3QtaWQKKwkJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb0hUTUxFbGVtZW50QnlDbGFzc05hbWUoInctc2RjLWRhc2hib2FyZC1jYXJkLW5ldyIpOworCQkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeURhdGFUZXN0SWQoYnV0dG9uSWQpOworCQl9OworCQlXZWJFbGVtZW50IGFkZFZmQnV0dG9uID0gRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPbkV4Y2VwdGlvbihhZGRWZkJ1dHRvblNpcHBsaWVyKTsKKwkJYWRkVmZCdXR0b24uY2xpY2soKTsKKwl9CisKKwkvLyB0aGlzIGZ1bmN0aW9uIGxvY2F0ZWQgc2VsZWN0IGxpc3QgYnkgdGhlIGRhdGEtdGVzdC1pZCB2YWx1ZSBhbmQgdGhlIGl0ZW0KKwkvLyB0byBiZSBzZWxlY3RlZC4uCisJcHVibGljIHN0YXRpYyBTZWxlY3QgZ2V0U2VsZWN0TGlzdChTdHJpbmcgaXRlbSwgU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJU2VsZWN0IHNlbGVjdGxpc3QgPSBuZXcgU2VsZWN0KGRyaXZlci5maW5kRWxlbWVudChidWlsRGF0YVRlc3RJZExvY2F0b3IoZGF0YVRlc3RJZCkpKTsKKwkJaWYgKGl0ZW0gIT0gbnVsbCkgeworCQkJc2VsZWN0bGlzdC5zZWxlY3RCeVZpc2libGVUZXh0KGl0ZW0pOworCQl9CisJCXJldHVybiBzZWxlY3RsaXN0OworCX0KKworCS8vIERlZmluZSBkZXNjcmlwdGlvbiBhcmVhIC4KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZpbmVEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb25UZXh0KSB7CisKKwkJV2ViRWxlbWVudCByZXNvdXJjZURlc2NyaXB0aW9uVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZGVzY3JpcHRpb24iKTsKKwkJcmVzb3VyY2VEZXNjcmlwdGlvblRleHRib3guY2xlYXIoKTsKKwkJcmVzb3VyY2VEZXNjcmlwdGlvblRleHRib3guc2VuZEtleXMoZGVzY3JpcHRpb25UZXh0KTsKKworCQlyZXR1cm4gZGVzY3JpcHRpb25UZXh0OworCX0KKworCS8qKgorCSAqIENsaWNrcyBvbiB0aGUgY3JlYXRlIGJ1dHRvbiB3YWl0cyBmb3IgdGhlIGNyZWF0ZSB0byBmaW5pc2ggYW5kIHRoZSBjaGVjaworCSAqIGluIGJ1dHRvbiB0byBhcHBlYXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tDcmVhdGVCdXR0b24oKSB7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoRGF0YVRlc3RJZEVudW0uTGlmZUN5bGVDaGFuZ2VCdXR0b25zLkNSRUFURS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCVdlYkVsZW1lbnQgc3VjY2Vzc05vdGlmaWNhdGlvbiA9IGRyaXZlci5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoInVpLW5vdGlmaWNhdGlvbiIpKTsKKwkJaWYgKHN1Y2Nlc3NOb3RpZmljYXRpb24gIT0gbnVsbCkgeworCQkJc3VjY2Vzc05vdGlmaWNhdGlvbi5jbGljaygpOworCQl9CisJCWdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5MaWZlQ3lsZUNoYW5nZUJ1dHRvbnMuQ0hFQ0tfSU4uZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrU2F2ZUJ1dHRvbigpIHsKKwkJV2ViRWxlbWVudCBjcmVhdGVCdXR0b24gPSBnZXRXZWJFbGVtZW50V2FpdEZvckNsaWNrYWJsZShEYXRhVGVzdElkRW51bS5MaWZlQ3lsZUNoYW5nZUJ1dHRvbnMuQ1JFQVRFLmdldFZhbHVlKCkpOworCQljcmVhdGVCdXR0b24uY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VOb3RpZmljYXRpbigpIHsKKwkJV2ViRWxlbWVudCBub3RpZmljYXRpb24gPSBkcml2ZXIuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJ1aS1ub3RpZmljYXRpb24iKSk7CisJCWlmIChub3RpZmljYXRpb24gIT0gbnVsbCkgeworCQkJbm90aWZpY2F0aW9uLmNsaWNrKCk7CisJCX0KKwl9CisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrSW4oKSB7CisJCXdhaXRGb3JMb2FkZXIoKTsKKwkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkxpZmVDeWxlQ2hhbmdlQnV0dG9ucy5DSEVDS19JTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5BQ0NFUF9URVNUSU5HX01FU1NBR0UuZ2V0VmFsdWUoKSkuc2VuZEtleXMoIkNoZWNrIGluICEiKTsKKwkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuT0suZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJd2FpdEZvckxvYWRlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtb3ZlVG9TdGVwKENyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bSBTdGVwbmFtZSkgeworCQl3YWl0Rm9yTG9hZGVyKCk7CisJCWdldFdlYkVsZW1lbnRXYWl0Rm9yQ2xpY2thYmxlKFN0ZXBuYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCXdhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAoaW50IGR1cmF0aW9uKSB7CisJCXN3YWxsb3dFeGNlcHRpb24oKCkgLT4gVGhyZWFkLnNsZWVwKGR1cmF0aW9uKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJEcml2ZXIgZ2V0RHJpdmVyKCkgeworCQlyZXR1cm4gZHJpdmVyOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0RHJpdmVyKCkgeworCQl0cnkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJvcGVuaW5nIGJyb3dzZXIiKTsKKwkJCVdlYkRyaXZlciB3ZWJEcml2ZXI7CisJCQlib29sZWFuIHJlbW90ZVRlc3RpbmcgPSBTZXR1cENEVGVzdC5jb25maWcuaXNSZW1vdGVUZXN0aW5nKCk7CisJCQlpZiAoIXJlbW90ZVRlc3RpbmcpIHsKKwkJCQl3ZWJEcml2ZXIgPSBuZXcgRmlyZWZveERyaXZlcigpOworCQkJfSBlbHNlIHsKKwkJCQlTdHJpbmcgcmVtb3RlRW52SVAgPSBTZXR1cENEVGVzdC5jb25maWcuZ2V0UmVtb3RlVGVzdGluZ01hY2hpbmVJUCgpOworCQkJCVN0cmluZyByZW1vdGVFbnZQb3J0ID0gU2V0dXBDRFRlc3QuY29uZmlnLmdldFJlbW90ZVRlc3RpbmdNYWNoaW5lUG9ydCgpOworCQkJCURlc2lyZWRDYXBhYmlsaXRpZXMgY2FwID0gbmV3IERlc2lyZWRDYXBhYmlsaXRpZXMoKTsKKwkJCQljYXAgPSBEZXNpcmVkQ2FwYWJpbGl0aWVzLmZpcmVmb3goKTsKKwkJCQljYXAuc2V0UGxhdGZvcm0oUGxhdGZvcm0uV0lORE9XUyk7CisJCQkJY2FwLnNldEJyb3dzZXJOYW1lKCJmaXJlZm94Iik7CisKKwkJCQlTdHJpbmcgcmVtb3RlTm9kZVVybCA9IFN0cmluZy5mb3JtYXQoU2V0dXBDRFRlc3QuU0VMRU5JVU1fTk9ERV9VUkwsIHJlbW90ZUVudklQLCByZW1vdGVFbnZQb3J0KTsKKwkJCQl3ZWJEcml2ZXIgPSBuZXcgUmVtb3RlV2ViRHJpdmVyKG5ldyBVUkwocmVtb3RlTm9kZVVybCksIGNhcCk7CisKKwkJCX0KKwkJCWRyaXZlciA9IHdlYkRyaXZlcjsKKworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisJCX0KKworCX0KKworCS8qKgorCSAqIHdhaXRzIHVudGlsIGVpdGhlciBsb2FkZXIgZmluaXNoZXMgb3IgMTAgc2Vjb25kcyBoYXMgcGFzc2VkLjxicj4KKwkgKiBJZiAxMCBzZWNvbmRzIGhhcyBwYXNzZWQgYW5kIGxvYWRlciBkaWRuJ3QgZmluaXNoIHRocm93cworCSAqIExvYWRlclN0dWNrRXhjZXB0aW9uLjxicj4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckxvYWRlcigpIHsKKwkJd2FpdEZvckxvYWRlcigxMCk7CisJfQorCisJLyoqCisJICogd2FpdHMgdW50aWwgZWl0aGVyIGxvYWRlciBmaW5pc2hlcyBvciBtYXhXYWl0VGltZUluU2Vjb25kcyBoYXMKKwkgKiBwYXNzZWQuPGJyPgorCSAqIElmIG1heFdhaXRUaW1lSW5TZWNvbmRzIGhhcyBwYXNzZWQgYW5kIGxvYWRlciBkaWRuJ3QgZmluaXNoIHRocm93cworCSAqIExvYWRlclN0dWNrRXhjZXB0aW9uLjxicj4KKwkgKiAKKwkgKiBAcGFyYW0gbWF4V2FpdFRpbWVJblNlY29uZHMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckxvYWRlcihpbnQgbWF4V2FpdFRpbWVJblNlY29uZHMpIHsKKwkJbG9uZyBtYXhXYWl0VGltZU1TID0gbWF4V2FpdFRpbWVJblNlY29uZHMgKiAxMDAwTDsKKwkJQm9vbGVhbiBsb2FkZXJJc1J1bm5pbmcgPSByZXRyeU1ldGhvZE9uUmVzdWx0KAorCQkJCSgpIC0+IGlzRWxlbWVudFByZXNlbnQoRGF0YVRlc3RJZEVudW0uR2VuZXJhbFNlY3Rpb24uTE9BREVSLmdldFZhbHVlKCkpLAorCQkJCWlzTG9hZGVyUHJlc2VudCAtPiAhaXNMb2FkZXJQcmVzZW50LCBtYXhXYWl0VGltZU1TLCA1MCk7CisJCWlmIChsb2FkZXJJc1J1bm5pbmcpIHsKKwkJCXRocm93IG5ldyBMb2FkZXJTdHVja0V4Y2VwdGlvbigKKwkJCQkJIlVJIExvYWRlciBpcyBzdHVjaywgbWF4IHdhaXQgdGltZSBvZiAiICsgbWF4V2FpdFRpbWVJblNlY29uZHMgKyAiIHNlY29uZHMgaGFzIHBhc3NlZC4iKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9hZGVyU3R1Y2tFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJcHJpdmF0ZSBMb2FkZXJTdHVja0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQkJc3VwZXIobWVzc2FnZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBNb3ZlIHRvIEhUTUwgZWxlbWVudCBieSBjbGFzcyBuYW1lLiBXaGVuIG1vdmluZyB0byB0aGUgSFRNTCBlbGVtZW50LCBpdAorCSAqIHdpbGwgcmFpc2UgaG92ZXIgZXZlbnQuCisJICogCisJICogQHBhcmFtIGNsYXNzTmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtb3ZlVG9IVE1MRWxlbWVudEJ5Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJQWN0aW9ucyBhY3Rpb25zID0gbmV3IEFjdGlvbnMoZ2V0RHJpdmVyKCkpOworCQlmaW5hbCBXZWJFbGVtZW50IGNyZWF0ZUJ1dHRvbnNBcmVhID0gZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKGNsYXNzTmFtZSkpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY3JlYXRlQnV0dG9uc0FyZWEpLnBlcmZvcm0oKTsKKwl9CisKKwkvKioKKwkgKiBNb3ZlIHRvIEhUTUwgZWxlbWVudCBieSBlbGVtZW50IGlkLiBXaGVuIG1vdmluZyB0byB0aGUgSFRNTCBlbGVtZW50LCBpdAorCSAqIHdpbGwgcmFpc2UgaG92ZXIgZXZlbnQuCisJICogCisJICogQHBhcmFtIGNsYXNzTmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtb3ZlVG9IVE1MRWxlbWVudEJ5RGF0YVRlc3RJZChTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlBY3Rpb25zIGFjdGlvbnMgPSBuZXcgQWN0aW9ucyhnZXREcml2ZXIoKSk7CisJCWZpbmFsIFdlYkVsZW1lbnQgY3JlYXRlQnV0dG9uc0FyZWEgPSBnZXRXZWJFbGVtZW50QnlEYXRhVGVzdElkKGRhdGFUZXN0SWQpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY3JlYXRlQnV0dG9uc0FyZWEpLnBlcmZvcm0oKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lVmVuZG9yTmFtZShTdHJpbmcgcmVzb3VyY2VWZW5kb3JOYW1lKSB7CisJCS8vIFRPRE8gdWktY2kgcmVwbGFjZSB3aXRoIEVudW0KKwkJV2ViRWxlbWVudCByZXNvdXJjZVZlbmRvck5hbWVUZXh0Ym94ID0gZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJ2ZW5kb3JOYW1lIik7CisJCXJlc291cmNlVmVuZG9yTmFtZVRleHRib3guY2xlYXIoKTsKKwkJcmVzb3VyY2VWZW5kb3JOYW1lVGV4dGJveC5zZW5kS2V5cyhyZXNvdXJjZVZlbmRvck5hbWUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmluZVVzZXJJZChTdHJpbmcgdXNlcklkKSB7CisJCS8vIFRPRE8gdWktY2kgcmVwbGFjZSB3aXRoIEVudW0KKwkJV2ViRWxlbWVudCByZXNvdXJjZVRhZ3NUZXh0Ym94ID0gZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJ1c2VySWQiKTsKKwkJcmVzb3VyY2VUYWdzVGV4dGJveC5jbGVhcigpOworCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKHVzZXJJZCk7CisJCXJldHVybiB1c2VySWQ7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrQWRkQ29tcG9uZW50KERhc2hib2FyZCBjb21wb25lbnRUeXBlKSB7CisJCVJ1bm5hYmxlIGNsaWNrQWRkVGFzayA9ICgpIC0+IHsKKwkJCS8vIFRPRE8gdWktY2kgcmVwbGFjZSB3aXRoIGRhdGEtdGVzdC1pZAorCQkJbW92ZVRvSFRNTEVsZW1lbnRCeUNsYXNzTmFtZSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtbmV3Iik7CisJCQlXZWJFbGVtZW50IGFkZFZmQnV0dG9uID0gZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChjb21wb25lbnRUeXBlLmdldFZhbHVlKCkpOworCQkJYWRkVmZCdXR0b24uY2xpY2soKTsKKwkJfTsKKwkJcmV0cnlNZXRob2RPbkV4Y2VwdGlvbihjbGlja0FkZFRhc2spOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHBlcmZvcm0gc3VibWl0IGZvciB0ZXN0aW5nIHByb2Nlc3MgZm9yIGV4aXN0aW5nIHNlcnZpY2Ugb3IKKwkgKiByZXNvdXJjZS48YnI+CisJICogSXQgYXNzdW1lcyBpdCBpcyBhY3RpdmF0ZWQgd2hlbiBpbiB0aGUgcmVzb3VyY2Ugc2NyZWVuIGFuZCB0aGUgU3VibWl0IEZvcgorCSAqIFRlc3RpbmcgYnV0dG9uIGlzIGF2YWlsYWJsZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50TmFtZUZvck1lc3NhZ2UKKwkgKiAgICAgICAgICAgIFRPRE8KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc3VibWl0Rm9yVGVzdGluZ0VsZW1lbnQoU3RyaW5nIGNvbXBvbmVudE5hbWVGb3JNZXNzYWdlKSB7CisJCXdhaXRGb3JMb2FkZXIoKTsKKwkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkxpZmVDeWxlQ2hhbmdlQnV0dG9ucy5TVUJNSVRfRk9SX1RFU1RJTkcuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJd2FpdEZvckxvYWRlcigpOworCQlnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5TVU1CSVRfRk9SX1RFU1RJTkdfTUVTU0FHRS5nZXRWYWx1ZSgpKQorCQkJCS5zZW5kS2V5cygiU3VibWl0IGZvciB0ZXN0aW5nIGZvciAiICsgY29tcG9uZW50TmFtZUZvck1lc3NhZ2UpOworCQl3YWl0Rm9yTG9hZGVyKCk7CisJCWdldFdlYkVsZW1lbnRXYWl0Rm9yQ2xpY2thYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuT0suZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJd2FpdEZvckxvYWRlcigpOworCQl3YWl0Rm9yRWxlbWVudFRvRGlzYXBwZWFyKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuT0suZ2V0VmFsdWUoKSk7CisKKwl9CisKKwkvKioKKwkgKiBXYWl0cyBVbnRpbCBlbGVtZW50cyBkaXNhcHBlYXJzIG9yIHVudGlsIDEwIHNlY29uZHMgcGFzcworCSAqIAorCSAqIEBwYXJhbSBkYXRhVGVzdElkCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JFbGVtZW50VG9EaXNhcHBlYXIoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJU3VwcGxpZXI8Qm9vbGVhbj4gZWxlbWVudFByZXNlbnNlQ2hlY2tlciA9ICgpIC0+IEdlbmVyYWxVSVV0aWxzLmlzRWxlbWVudFByZXNlbnQoZGF0YVRlc3RJZCk7CisJCUZ1bmN0aW9uPEJvb2xlYW4sIEJvb2xlYW4+IHZlcmlmaWVyID0gaXNFbGVtZW50UHJlc2VudCAtPiAhaXNFbGVtZW50UHJlc2VudDsKKwkJRnVuY3Rpb25hbEludGVyZmFjZXMucmV0cnlNZXRob2RPblJlc3VsdChlbGVtZW50UHJlc2Vuc2VDaGVja2VyLCB2ZXJpZmllcik7CisKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3V0aWxpdGllcy9NZXRob2RNYW5pcHVsYXRpb25VdGlscy5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvTWV0aG9kTWFuaXB1bGF0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGIzOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvTWV0aG9kTWFuaXB1bGF0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzOworCisvKioKKyAqIENsYXNzIEZvciBtYW5pcHVsYXRpb25zIG9uIG1ldGhvZAorICogCisgKiBAYXV0aG9yIG1zaGl0cml0CisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kTWFuaXB1bGF0aW9uVXRpbHMgeworCisJcHJpdmF0ZSBNZXRob2RNYW5pcHVsYXRpb25VdGlscygpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBY2Nlc3NFcnJvcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvT25ib2FyZFV0aWxpdHkuamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL09uYm9hcmRVdGlsaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyMTUzOQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL09uYm9hcmRVdGlsaXR5LmphdmEKQEAgLTAsMCArMSw0NzcgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkNsb3NlYWJsZUh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLk11bHRpcGFydEVudGl0eUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5taW1lLmNvbnRlbnQuRmlsZUJvZHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkNsb3NlYWJsZUh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50Lkh0dHBDbGllbnRzOworaW1wb3J0IG9yZy5qc29uLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBIZWFkZXJFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkZ1bmN0aW9uYWxJbnRlcmZhY2VzOworCisvKioKKyAqIFV0aWxpdHkgQ2xhc3MgRm9yIE9uYm9hcmRpbmcKKyAqIAorICogQGF1dGhvciBtc2hpdHJpdAorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9uYm9hcmRVdGlsaXR5IHsKKworCXByaXZhdGUgT25ib2FyZFV0aWxpdHkoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfU09GVFdBUkVfUFJPRFVDVFMgPSAidmVuZG9yLXNvZnR3YXJlLXByb2R1Y3RzIjsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9MSUNFTlNFX01PREVMUyA9ICJ2ZW5kb3ItbGljZW5zZS1tb2RlbHMiOworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWU1BfSUQgPSAidnNwSWQiOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOworCisJCWVudW0gQWN0aW9ucyB7CisJCQlDSEVDS19JTigiQ2hlY2tpbiIpLCBTVUJNSVQoIlN1Ym1pdCIpLCBDUkVBVEVfUEFDS0FHRSgiQ3JlYXRlX1BhY2thZ2UiKTsKKworCQkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJCXByaXZhdGUgQWN0aW9ucyhTdHJpbmcgdmFsdWUpIHsKKwkJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCQl9CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBoZWF0RmlsZU5hbWUKKwkgKiBAcGFyYW0gZmlsZXBhdGgKKwkgKiBAcGFyYW0gdXNlcklkCisJICogQHBhcmFtIHZsZAorCSAqIEByZXR1cm4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVWZW5kb3JTb2Z0d2FyZVByb2R1Y3QoU3RyaW5nIGhlYXRGaWxlTmFtZSwgU3RyaW5nIGZpbGVwYXRoLCBTdHJpbmcgdXNlcklkLAorCQkJVmVuZG9yTGljZW5zZURldGFpbHMgdmxkKSB7CisJCVJlc3RSZXNwb25zZSBjcmVhdGVOZXdWZW5kb3JTb2Z0d2FyZVByb2R1Y3QgPSBGdW5jdGlvbmFsSW50ZXJmYWNlcworCQkJCS5zd2FsbG93RXhjZXB0aW9uKCgpIC0+IGNyZWF0ZU5ld1ZlbmRvclNvZnR3YXJlUHJvZHVjdCh2bGQsIHVzZXJJZCkpOworCQlhc3NlcnRUcnVlKGNyZWF0ZU5ld1ZlbmRvclNvZnR3YXJlUHJvZHVjdC5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwkJU3RyaW5nIHZzcGlkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKGNyZWF0ZU5ld1ZlbmRvclNvZnR3YXJlUHJvZHVjdC5nZXRSZXNwb25zZSgpLAorCQkJCUNvbnN0YW50cy5WU1BfSUQpOworCisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzCisJCQkJLnN3YWxsb3dFeGNlcHRpb24oKCkgLT4gdXBsb2FkSGVhdFBhY2thZ2UoZmlsZXBhdGgsIGhlYXRGaWxlTmFtZSwgdnNwaWQsIHVzZXJJZCkpOworCQlhc3NlcnRUcnVlKHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCisJCXJlc3BvbnNlID0gYWN0aW9uT25Db21wb25lbnQodnNwaWQsIENvbnN0YW50cy5BY3Rpb25zLkNIRUNLX0lOLmdldFZhbHVlKCksIENvbnN0YW50cy5WRU5ET1JfU09GVFdBUkVfUFJPRFVDVFMsCisJCQkJdXNlcklkKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKworCQlyZXNwb25zZSA9IGFjdGlvbk9uQ29tcG9uZW50KHZzcGlkLCBDb25zdGFudHMuQWN0aW9ucy5TVUJNSVQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlZFTkRPUl9TT0ZUV0FSRV9QUk9EVUNUUywKKwkJCQl1c2VySWQpOworCQlhc3NlcnRUcnVlKHJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCisJCXJlc3BvbnNlID0gYWN0aW9uT25Db21wb25lbnQodnNwaWQsIENvbnN0YW50cy5BY3Rpb25zLkNSRUFURV9QQUNLQUdFLmdldFZhbHVlKCksCisJCQkJQ29uc3RhbnRzLlZFTkRPUl9TT0ZUV0FSRV9QUk9EVUNUUywgdXNlcklkKTsKKwkJYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKworCX0KKworCS8qKgorCSAqIENvbnRhaW5zIERldGFpbHMgUmVsZXZhbnQgdG8gVmVuZG9yIExpY2Vuc2UKKwkgKiAKKwkgKiBAYXV0aG9yIG1zaGl0cml0CisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZlbmRvckxpY2Vuc2VEZXRhaWxzIHsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVuZG9ySWQ7CisJCXByaXZhdGUgZmluYWwgU3RyaW5nIHZlbmRvckxpY2Vuc2VOYW1lOworCQlwcml2YXRlIGZpbmFsIFN0cmluZyB2ZW5kb3JMaWNlbnNlQWdyZWVtZW50SWQ7CisJCXByaXZhdGUgZmluYWwgU3RyaW5nIGZlYXR1cmVHcm91cElkOworCQlwcml2YXRlIGZpbmFsIFN0cmluZyB2ZW5kb3JTb2Z0d2FyZVByb2R1Y3Q7CisKKwkJcHJpdmF0ZSBWZW5kb3JMaWNlbnNlRGV0YWlscyhTdHJpbmcgdmVuZG9ySWQsIFN0cmluZyB2ZW5kb3JMaWNlbnNlTmFtZSwgU3RyaW5nIHZlbmRvckxpY2Vuc2VBZ3JlZW1lbnRJZCwKKwkJCQlTdHJpbmcgZmVhdHVyZUdyb3VwSWQpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLnZlbmRvcklkID0gdmVuZG9ySWQ7CisJCQl0aGlzLnZlbmRvckxpY2Vuc2VOYW1lID0gdmVuZG9yTGljZW5zZU5hbWU7CisJCQl0aGlzLnZlbmRvckxpY2Vuc2VBZ3JlZW1lbnRJZCA9IHZlbmRvckxpY2Vuc2VBZ3JlZW1lbnRJZDsKKwkJCXRoaXMuZmVhdHVyZUdyb3VwSWQgPSBmZWF0dXJlR3JvdXBJZDsKKwkJCXZlbmRvclNvZnR3YXJlUHJvZHVjdCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkuc3BsaXQoIi0iKVswXTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9ySWQoKSB7CisJCQlyZXR1cm4gdmVuZG9ySWQ7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvckxpY2Vuc2VOYW1lKCkgeworCQkJcmV0dXJuIHZlbmRvckxpY2Vuc2VOYW1lOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRWZW5kb3JMaWNlbnNlQWdyZWVtZW50SWQoKSB7CisJCQlyZXR1cm4gdmVuZG9yTGljZW5zZUFncmVlbWVudElkOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlR3JvdXBJZCgpIHsKKwkJCXJldHVybiBmZWF0dXJlR3JvdXBJZDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yU29mdHdhcmVQcm9kdWN0KCkgeworCQkJcmV0dXJuIHZlbmRvclNvZnR3YXJlUHJvZHVjdDsKKwkJfQorCisJfQorCisJLyoqCisJICogQ3JlYXRlcyBWZW5kb3IgTGljZW5zZQorCSAqIAorCSAqIEBwYXJhbSB1c2VySWQKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFZlbmRvckxpY2Vuc2VEZXRhaWxzIGNyZWF0ZVZlbmRvckxpY2Vuc2UoU3RyaW5nIHVzZXJJZCkgeworCQlmaW5hbCBTdHJpbmcgZmllbGROYW1lVmFsdWUgPSBDb25zdGFudHMuVkFMVUU7CisJCVN0cmluZyB2ZW5kb3JMaWNlbnNlTmFtZSA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkuc3BsaXQoIi0iKVswXTsKKwkJUmVzdFJlc3BvbnNlIHZlbmRvckxpY2Vuc2VSZXNwb25zZSA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzCisJCQkJLnN3YWxsb3dFeGNlcHRpb24oKCkgLT4gY3JlYXRlVmVuZG9yTGljZW5zZU1vZGVscyh2ZW5kb3JMaWNlbnNlTmFtZSwgdXNlcklkKSk7CisJCWFzc2VydFRydWUodmVuZG9yTGljZW5zZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCisJCVN0cmluZyB2ZW5kb3JJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh2ZW5kb3JMaWNlbnNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgZmllbGROYW1lVmFsdWUpOworCisJCVJlc3RSZXNwb25zZSB2ZW5kb3JLZXlHcm91cHNSZXNwb25zZSA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzCisJCQkJLnN3YWxsb3dFeGNlcHRpb24oKCkgLT4gY3JlYXRlVmVuZG9yS2V5R3JvdXBzKHZlbmRvcklkLCB1c2VySWQpKTsKKwkJYXNzZXJ0VHJ1ZSh2ZW5kb3JLZXlHcm91cHNSZXNwb25zZS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwkJU3RyaW5nIGtleUdyb3VwSWQgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodmVuZG9yS2V5R3JvdXBzUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwKKwkJCQlmaWVsZE5hbWVWYWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIHZlbmRvckVudGl0bGVtZW50UG9vbCA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzCisJCQkJLnN3YWxsb3dFeGNlcHRpb24oKCkgLT4gY3JlYXRlVmVuZG9yRW50aXRsZW1lbnRQb29sKHZlbmRvcklkLCB1c2VySWQpKTsKKwkJYXNzZXJ0VHJ1ZSh2ZW5kb3JFbnRpdGxlbWVudFBvb2wuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisJCVN0cmluZyBlbnRpdGxlbWVudFBvb2xJZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZSh2ZW5kb3JFbnRpdGxlbWVudFBvb2wuZ2V0UmVzcG9uc2UoKSwKKwkJCQlmaWVsZE5hbWVWYWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIHZlbmRvckxpY2Vuc2VGZWF0dXJlR3JvdXBzID0gRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbigKKwkJCQkoKSAtPiBjcmVhdGVWZW5kb3JMaWNlbnNlRmVhdHVyZUdyb3Vwcyh2ZW5kb3JJZCwga2V5R3JvdXBJZCwgZW50aXRsZW1lbnRQb29sSWQsIHVzZXJJZCkpOworCQlhc3NlcnRUcnVlKHZlbmRvckxpY2Vuc2VGZWF0dXJlR3JvdXBzLmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCQlTdHJpbmcgZmVhdHVyZUdyb3VwSWQgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodmVuZG9yTGljZW5zZUZlYXR1cmVHcm91cHMuZ2V0UmVzcG9uc2UoKSwKKwkJCQlmaWVsZE5hbWVWYWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIHZlbmRvckxpY2Vuc2VBZ3JlZW1lbnQgPSBGdW5jdGlvbmFsSW50ZXJmYWNlcworCQkJCS5zd2FsbG93RXhjZXB0aW9uKCgpIC0+IGNyZWF0ZVZlbmRvckxpY2Vuc2VBZ3JlZW1lbnQodmVuZG9ySWQsIGZlYXR1cmVHcm91cElkLCB1c2VySWQpKTsKKwkJYXNzZXJ0VHJ1ZSh2ZW5kb3JMaWNlbnNlQWdyZWVtZW50LmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCQlTdHJpbmcgdmVuZG9yTGljZW5zZUFncmVlbWVudElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHZlbmRvckxpY2Vuc2VBZ3JlZW1lbnQuZ2V0UmVzcG9uc2UoKSwKKwkJCQlmaWVsZE5hbWVWYWx1ZSk7CisKKwkJUmVzdFJlc3BvbnNlIGFjdGlvbk9uQ29tcG9uZW50ID0gYWN0aW9uT25Db21wb25lbnQodmVuZG9ySWQsIENvbnN0YW50cy5BY3Rpb25zLkNIRUNLX0lOLmdldFZhbHVlKCksCisJCQkJQ29uc3RhbnRzLlZFTkRPUl9MSUNFTlNFX01PREVMUywgdXNlcklkKTsKKwkJYXNzZXJ0VHJ1ZShhY3Rpb25PbkNvbXBvbmVudC5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKworCQlhY3Rpb25PbkNvbXBvbmVudCA9IGFjdGlvbk9uQ29tcG9uZW50KHZlbmRvcklkLCBDb25zdGFudHMuQWN0aW9ucy5TVUJNSVQuZ2V0VmFsdWUoKSwKKwkJCQlDb25zdGFudHMuVkVORE9SX0xJQ0VOU0VfTU9ERUxTLCB1c2VySWQpOworCQlhc3NlcnRUcnVlKGFjdGlvbk9uQ29tcG9uZW50LmdldEVycm9yQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spOworCisJCXJldHVybiBuZXcgVmVuZG9yTGljZW5zZURldGFpbHModmVuZG9ySWQsIHZlbmRvckxpY2Vuc2VOYW1lLCB2ZW5kb3JMaWNlbnNlQWdyZWVtZW50SWQsIGZlYXR1cmVHcm91cElkKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgYWN0aW9uT25Db21wb25lbnQoU3RyaW5nIHZzcGlkLCBTdHJpbmcgYWN0aW9uLCBTdHJpbmcgb25ib2FyZENvbXBvbmVudCwgU3RyaW5nIHVzZXJJZCkgeworCQlDb25maWcgY29uZmlnID0gRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbigoKSAtPiBVdGlscy5nZXRDb25maWcoKSk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KCJodHRwOi8vJXM6JXMvb25ib2FyZGluZy1hcGkvdjEuMC8lcy8lcy9hY3Rpb25zIiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCBvbmJvYXJkQ29tcG9uZW50LCB2c3BpZCk7CisKKwkJSlNPTk9iamVjdCBqT2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKwkJRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbigoKSAtPiBqT2JqZWN0LnB1dCgiYWN0aW9uIiwgYWN0aW9uKSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzCisJCQkJLnN3YWxsb3dFeGNlcHRpb24oKCkgLT4gaHR0cC5odHRwU2VuZFB1dCh1cmwsIGpPYmplY3QudG9TdHJpbmcoKSwgaGVhZGVyc01hcCkpOworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZVZlbmRvckxpY2Vuc2VNb2RlbHMoU3RyaW5nIG5hbWUsIFN0cmluZyB1c2VySWQpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KCJodHRwOi8vJXM6JXMvb25ib2FyZGluZy1hcGkvdjEuMC92ZW5kb3ItbGljZW5zZS1tb2RlbHMiLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCisJCUpTT05PYmplY3Qgak9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWpPYmplY3QucHV0KCJ2ZW5kb3JOYW1lIiwgbmFtZSk7CisJCWpPYmplY3QucHV0KCJkZXNjcmlwdGlvbiIsICJuZXcgdmVuZG9yIGxpY2Vuc2UgbW9kZWwiKTsKKwkJak9iamVjdC5wdXQoImljb25SZWYiLCAiaWNvbiIpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGpPYmplY3QudG9TdHJpbmcoKSwgaGVhZGVyc01hcCk7CisJCXJldHVybiByZXNwb25zZTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVWZW5kb3JMaWNlbnNlQWdyZWVtZW50KFN0cmluZyB2c3BpZCwgU3RyaW5nIGZlYXR1cmVHcm91cElkLCBTdHJpbmcgdXNlcklkKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoImh0dHA6Ly8lczolcy9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1saWNlbnNlLW1vZGVscy8lcy9saWNlbnNlLWFncmVlbWVudHMiLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHZzcGlkKTsKKworCQlKU09OT2JqZWN0IGxpY2Vuc2VUZXJtcE9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWxpY2Vuc2VUZXJtcE9iamVjdC5wdXQoImNob2ljZSIsICJGaXhlZF9UZXJtIik7CisJCWxpY2Vuc2VUZXJtcE9iamVjdC5wdXQoIm90aGVyIiwgIiIpOworCisJCUpTT05PYmplY3Qgak9iamVjdEJvZHkgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0Qm9keS5wdXQoIm5hbWUiLCAiYWJjIik7CisJCWpPYmplY3RCb2R5LnB1dCgiZGVzY3JpcHRpb24iLCAibmV3IHZlbmRvciBsaWNlbnNlIGFncmVlbWVudCIpOworCQlqT2JqZWN0Qm9keS5wdXQoInJlcXVpcmVtZW50c0FuZENvbnN0cmFpbnMiLCAiYWJjIik7CisJCWpPYmplY3RCb2R5LnB1dCgibGljZW5zZVRlcm0iLCBsaWNlbnNlVGVybXBPYmplY3QpOworCQlqT2JqZWN0Qm9keS5wdXQoImFkZGVkRmVhdHVyZUdyb3Vwc0lkcyIsIEFycmF5cy5hc0xpc3QoZmVhdHVyZUdyb3VwSWQpLnRvQXJyYXkoKSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRQb3N0KHVybCwgak9iamVjdEJvZHkudG9TdHJpbmcoKSwgaGVhZGVyc01hcCk7CisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlVmVuZG9yTGljZW5zZUZlYXR1cmVHcm91cHMoU3RyaW5nIHZzcGlkLCBTdHJpbmcgbGljZW5zZUtleUdyb3VwSWQsCisJCQlTdHJpbmcgZW50aXRsZW1lbnRQb29sSWQsIFN0cmluZyB1c2VySWQpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KCJodHRwOi8vJXM6JXMvb25ib2FyZGluZy1hcGkvdjEuMC92ZW5kb3ItbGljZW5zZS1tb2RlbHMvJXMvZmVhdHVyZS1ncm91cHMiLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHZzcGlkKTsKKworCQlKU09OT2JqZWN0IGpPYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0LnB1dCgibmFtZSIsICJ4eXoiKTsKKwkJak9iamVjdC5wdXQoImRlc2NyaXB0aW9uIiwgIm5ldyB2ZW5kb3IgbGljZW5zZSBmZWF0dXJlIGdyb3VwcyIpOworCQlqT2JqZWN0LnB1dCgicGFydE51bWJlciIsICIxMjNhYmM0NTYiKTsKKwkJak9iamVjdC5wdXQoImFkZGVkTGljZW5zZUtleUdyb3Vwc0lkcyIsIEFycmF5cy5hc0xpc3QobGljZW5zZUtleUdyb3VwSWQpLnRvQXJyYXkoKSk7CisJCWpPYmplY3QucHV0KCJhZGRlZEVudGl0bGVtZW50UG9vbHNJZHMiLCBBcnJheXMuYXNMaXN0KGVudGl0bGVtZW50UG9vbElkKS50b0FycmF5KCkpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGpPYmplY3QudG9TdHJpbmcoKSwgaGVhZGVyc01hcCk7CisJCXJldHVybiByZXNwb25zZTsKKworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVWZW5kb3JFbnRpdGxlbWVudFBvb2woU3RyaW5nIHZzcGlkLCBTdHJpbmcgdXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdCgiaHR0cDovLyVzOiVzL29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLWxpY2Vuc2UtbW9kZWxzLyVzL2VudGl0bGVtZW50LXBvb2xzIiwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCB2c3BpZCk7CisKKwkJSlNPTk9iamVjdCBqRW50aXRsZW1lbnRNZXRyaWNPYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqRW50aXRsZW1lbnRNZXRyaWNPYmplY3QucHV0KCJjaG9pY2UiLCAiQ1BVIik7CisJCWpFbnRpdGxlbWVudE1ldHJpY09iamVjdC5wdXQoIm90aGVyIiwgIiIpOworCisJCUpTT05PYmplY3QgakFnZ3JlZ2F0aW9uRnVuY3Rpb25PYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqQWdncmVnYXRpb25GdW5jdGlvbk9iamVjdC5wdXQoImNob2ljZSIsICJQZWFrIik7CisJCWpBZ2dyZWdhdGlvbkZ1bmN0aW9uT2JqZWN0LnB1dCgib3RoZXIiLCAiIik7CisKKwkJSlNPTk9iamVjdCBqT3BlcmF0aW9uYWxTY29wZSA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWpPcGVyYXRpb25hbFNjb3BlLnB1dCgiY2hvaWNlcyIsIEFycmF5cy5hc0xpc3QoIkF2YWlsYWJpbGl0eV9ab25lIikudG9BcnJheSgpKTsKKwkJak9wZXJhdGlvbmFsU2NvcGUucHV0KCJvdGhlciIsICIiKTsKKworCQlKU09OT2JqZWN0IGpUaW1lT2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKwkJalRpbWVPYmplY3QucHV0KCJjaG9pY2UiLCAiSG91ciIpOworCQlqVGltZU9iamVjdC5wdXQoIm90aGVyIiwgIiIpOworCisJCUpTT05PYmplY3Qgak9iamVjdEJvZHkgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0Qm9keS5wdXQoIm5hbWUiLCAiZGVmIik7CisJCWpPYmplY3RCb2R5LnB1dCgiZGVzY3JpcHRpb24iLCAibmV3IHZlbmRvciBsaWNlbnNlIGVudGl0bGVtZW50IHBvb2wiKTsKKwkJak9iamVjdEJvZHkucHV0KCJ0aHJlc2hvbGRWYWx1ZSIsICIyMyIpOworCQlqT2JqZWN0Qm9keS5wdXQoInRocmVzaG9sZFVuaXRzIiwgIkFic29sdXRlIik7CisJCWpPYmplY3RCb2R5LnB1dCgiZW50aXRsZW1lbnRNZXRyaWMiLCBqRW50aXRsZW1lbnRNZXRyaWNPYmplY3QpOworCQlqT2JqZWN0Qm9keS5wdXQoImluY3JlbWVudHMiLCAiYWJjZCIpOworCQlqT2JqZWN0Qm9keS5wdXQoImFnZ3JlZ2F0aW9uRnVuY3Rpb24iLCBqQWdncmVnYXRpb25GdW5jdGlvbk9iamVjdCk7CisJCWpPYmplY3RCb2R5LnB1dCgib3BlcmF0aW9uYWxTY29wZSIsIGpPcGVyYXRpb25hbFNjb3BlKTsKKwkJak9iamVjdEJvZHkucHV0KCJ0aW1lIiwgalRpbWVPYmplY3QpOworCQlqT2JqZWN0Qm9keS5wdXQoIm1hbnVmYWN0dXJlclJlZmVyZW5jZU51bWJlciIsICIxMjNhYWEiKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCBqT2JqZWN0Qm9keS50b1N0cmluZygpLCBoZWFkZXJzTWFwKTsKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVWZW5kb3JLZXlHcm91cHMoU3RyaW5nIHZzcGlkLCBTdHJpbmcgdXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdCgiaHR0cDovLyVzOiVzL29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLWxpY2Vuc2UtbW9kZWxzLyVzL2xpY2Vuc2Uta2V5LWdyb3VwcyIsCisJCQkJY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgdnNwaWQpOworCisJCUpTT05PYmplY3Qgak9wZXJhdGlvbmFsU2NvcGUgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT3BlcmF0aW9uYWxTY29wZS5wdXQoImNob2ljZXMiLCBBcnJheXMuYXNMaXN0KCJUZW5hbnQiKS50b0FycmF5KCkpOworCQlqT3BlcmF0aW9uYWxTY29wZS5wdXQoIm90aGVyIiwgIiIpOworCisJCUpTT05PYmplY3Qgak9iamVjdEJvZHkgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0Qm9keS5wdXQoIm5hbWUiLCAia2V5R3JvdXAiKTsKKwkJak9iamVjdEJvZHkucHV0KCJkZXNjcmlwdGlvbiIsICJuZXcgdmVuZG9yIGxpY2Vuc2Uga2V5IGdyb3VwIik7CisJCWpPYmplY3RCb2R5LnB1dCgib3BlcmF0aW9uYWxTY29wZSIsIGpPcGVyYXRpb25hbFNjb3BlKTsKKwkJak9iamVjdEJvZHkucHV0KCJ0eXBlIiwgIlVuaXZlcnNhbCIpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGpPYmplY3RCb2R5LnRvU3RyaW5nKCksIGhlYWRlcnNNYXApOworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZU5ld1ZlbmRvclNvZnR3YXJlUHJvZHVjdChWZW5kb3JMaWNlbnNlRGV0YWlscyB2bGQsIFN0cmluZyB1c2VySWQpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdCgiaHR0cDovLyVzOiVzL29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLXNvZnR3YXJlLXByb2R1Y3RzIiwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpKTsKKworCQlKU09OT2JqZWN0IGpsaWNlbnNpbmdEYXRhT2JqID0gbmV3IEpTT05PYmplY3QoKTsKKwkJamxpY2Vuc2luZ0RhdGFPYmoucHV0KCJsaWNlbnNlQWdyZWVtZW50IiwgdmxkLmdldFZlbmRvckxpY2Vuc2VBZ3JlZW1lbnRJZCgpKTsKKwkJamxpY2Vuc2luZ0RhdGFPYmoucHV0KCJmZWF0dXJlR3JvdXBzIiwgQXJyYXlzLmFzTGlzdCh2bGQuZ2V0RmVhdHVyZUdyb3VwSWQoKSkudG9BcnJheSgpKTsKKworCQlKU09OT2JqZWN0IGpPYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0LnB1dCgibmFtZSIsIHZsZC5nZXRWZW5kb3JTb2Z0d2FyZVByb2R1Y3QoKSk7CisJCWpPYmplY3QucHV0KCJkZXNjcmlwdGlvbiIsICJuZXcgVlNQIGRlc2NyaXB0aW9uIik7CisJCWpPYmplY3QucHV0KCJjYXRlZ29yeSIsICJyZXNvdXJjZU5ld0NhdGVnb3J5LmdlbmVyaWMiKTsKKwkJak9iamVjdC5wdXQoInN1YkNhdGVnb3J5IiwgInJlc291cmNlTmV3Q2F0ZWdvcnkuZ2VuZXJpYy5kYXRhYmFzZSIpOworCQlqT2JqZWN0LnB1dCgibGljZW5zaW5nVmVyc2lvbiIsICIxLjAiKTsKKwkJak9iamVjdC5wdXQoInZlbmRvck5hbWUiLCB2bGQuZ2V0VmVuZG9yTGljZW5zZU5hbWUoKSk7CisJCWpPYmplY3QucHV0KCJ2ZW5kb3JJZCIsIHZsZC5nZXRWZW5kb3JJZCgpKTsKKwkJak9iamVjdC5wdXQoImljb24iLCAiaWNvbiIpOworCQlqT2JqZWN0LnB1dCgibGljZW5zaW5nRGF0YSIsIGpsaWNlbnNpbmdEYXRhT2JqKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCBqT2JqZWN0LnRvU3RyaW5nKCksIGhlYWRlcnNNYXApOworCisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgdXBsb2FkSGVhdFBhY2thZ2UoU3RyaW5nIGZpbGVwYXRoLCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB2c3BpZCwgU3RyaW5nIHVzZXJJZCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCUNsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKwkJTXVsdGlwYXJ0RW50aXR5QnVpbGRlciBtcEJ1aWxkZXIgPSBNdWx0aXBhcnRFbnRpdHlCdWlsZGVyLmNyZWF0ZSgpOworCQltcEJ1aWxkZXIuYWRkUGFydCgicmVzb3VyY2VaaXAiLCBuZXcgRmlsZUJvZHkoZ2V0VGVzdFppcEZpbGUoZmlsZXBhdGgsIGZpbGVuYW1lKSkpOworCisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KCJodHRwOi8vJXM6JXMvb25ib2FyZGluZy1hcGkvdjEuMC92ZW5kb3Itc29mdHdhcmUtcHJvZHVjdHMvJXMvdXBsb2FkIiwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCB2c3BpZCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksICJtdWx0aXBhcnQvZm9ybS1kYXRhIik7CisKKwkJQ2xvc2VhYmxlSHR0cENsaWVudCBjbGllbnQgPSBIdHRwQ2xpZW50cy5jcmVhdGVEZWZhdWx0KCk7CisJCXRyeSB7CisJCQlIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdCh1cmwpOworCQkJUmVzdFJlc3BvbnNlIHJlc3RSZXNwb25zZSA9IG5ldyBSZXN0UmVzcG9uc2UoKTsKKworCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IGhlYWRlcnNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlTdHJpbmcga2V5ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCVN0cmluZyB2YWx1ZSA9IGhlYWRlcnNNYXAuZ2V0KGtleSk7CisJCQkJaHR0cFBvc3QuYWRkSGVhZGVyKGtleSwgdmFsdWUpOworCQkJfQorCQkJaHR0cFBvc3Quc2V0RW50aXR5KG1wQnVpbGRlci5idWlsZCgpKTsKKwkJCXJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoaHR0cFBvc3QpOworCQkJSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKwkJCVN0cmluZyByZXNwb25zZUJvZHkgPSBudWxsOworCQkJaWYgKGVudGl0eSAhPSBudWxsKSB7CisJCQkJSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworCQkJCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCQkJSU9VdGlscy5jb3B5KGluc3RyZWFtLCB3cml0ZXIpOworCQkJCXJlc3BvbnNlQm9keSA9IHdyaXRlci50b1N0cmluZygpOworCQkJCXRyeSB7CisKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlpbnN0cmVhbS5jbG9zZSgpOworCQkJCX0KKwkJCX0KKworCQkJcmVzdFJlc3BvbnNlLnNldEVycm9yQ29kZShyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKwkJCXJlc3RSZXNwb25zZS5zZXRSZXNwb25zZShyZXNwb25zZUJvZHkpOworCisJCQlyZXR1cm4gcmVzdFJlc3BvbnNlOworCisJCX0gZmluYWxseSB7CisJCQljbG9zZVJlc3BvbnNlKHJlc3BvbnNlKTsKKwkJCWNsb3NlSHR0cENsaWVudChjbGllbnQpOworCisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlUmVzcG9uc2UoQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB7CisJCXRyeSB7CisJCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgeworCQkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJmYWlsZWQgdG8gY2xvc2UgY2xpZW50IG9yIHJlc3BvbnNlOiAlcyIsIGUuZ2V0TWVzc2FnZSgpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlSHR0cENsaWVudChDbG9zZWFibGVIdHRwQ2xpZW50IGNsaWVudCkgeworCQl0cnkgeworCQkJaWYgKGNsaWVudCAhPSBudWxsKSB7CisJCQkJY2xpZW50LmNsb3NlKCk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJmYWlsZWQgdG8gY2xvc2UgY2xpZW50IG9yIHJlc3BvbnNlOiAlcyIsIGUuZ2V0TWVzc2FnZSgpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBGaWxlIGdldFRlc3RaaXBGaWxlKFN0cmluZyBmaWxlcGF0aCwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBzb3VyY2VEaXIgPSBjb25maWcuZ2V0SW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0RpcigpOworCQlqYXZhLm5pby5maWxlLlBhdGggZmlsZVBhdGggPSBGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkuZ2V0UGF0aChmaWxlcGF0aCArIEZpbGUuc2VwYXJhdG9yICsgZmlsZW5hbWUpOworCQlyZXR1cm4gZmlsZVBhdGgudG9GaWxlKCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByZXBhcmVIZWFkZXJzTWFwKFN0cmluZyB1c2VySWQpIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5BQ0NFUFQuZ2V0VmFsdWUoKSwgImFwcGxpY2F0aW9uL2pzb24iKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uVVNFUl9JRC5nZXRWYWx1ZSgpLCB1c2VySWQpOworCQlyZXR1cm4gaGVhZGVyc01hcDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVmZGcm9tT25ib2FyZGluZyhTdHJpbmcgdXNlcklELCBTdHJpbmcgemlwRmlsZSwgU3RyaW5nIGZpbGVwYXRoKSB7CisJCVZlbmRvckxpY2Vuc2VEZXRhaWxzIHZsZCA9IGNyZWF0ZVZlbmRvckxpY2Vuc2UodXNlcklEKTsKKwkJY3JlYXRlVmVuZG9yU29mdHdhcmVQcm9kdWN0KHppcEZpbGUsIGZpbGVwYXRoLCB1c2VySUQsIHZsZCk7CisKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk9uQm9hcmRpbmdUYWJsZS5PUEVOX01PREFMX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uT25Cb2FyZGluZ1RhYmxlLk9OQk9BUkRJTkdfU0VBUkNILmdldFZhbHVlKCkpCisJCQkJLnNlbmRLZXlzKHZsZC5nZXRWZW5kb3JTb2Z0d2FyZVByb2R1Y3QoKSk7CisKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5zbGVlcCgxMDAwKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUodmxkLmdldFZlbmRvclNvZnR3YXJlUHJvZHVjdCgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5PbkJvYXJkaW5nVGFibGUuSU1QT1JUX0lDT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JDbGlja2FibGUoRGF0YVRlc3RJZEVudW0uTGlmZUN5bGVDaGFuZ2VCdXR0b25zLkNSRUFURS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKDMwMCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3V0aWxpdGllcy9SZXNvdXJjZVVJVXRpbHMuamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL1Jlc291cmNlVUlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3N2NjMGMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3V0aWxpdGllcy9SZXNvdXJjZVVJVXRpbHMuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5GdW5jdGlvbmFsSW50ZXJmYWNlcy5yZXRyeU1ldGhvZE9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uRGFzaGJvYXJkOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uQnk7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5LZXlzOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuRXhwZWN0ZWRDb25kaXRpb25zOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5XZWJEcml2ZXJXYWl0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNvbXBvbmVudFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuTm9ybWF0aXZlVHlwZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVVJVXRpbHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX05BTUVfUFJFRklYID0gIlJlc291cmNlQ0RUZXN0LSI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0JFRk9SRV9URVNUID0gdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX1ZFUlNJT04gPSAiMC4xIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JFU09VUkNFX05BTUUgPSAiY2FsbF9jb250cm9sbCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFRF9SRVNPVVJDRV9JQ09OX05BTUUgPSAib2JqZWN0U3RvcmFnZSI7CisKKwlwcml2YXRlIFJlc291cmNlVUlVdGlscygpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lUmVzb3VyY2VOYW1lKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKworCQlXZWJFbGVtZW50IHJlc291cmNlTmFtZVRleHRib3ggPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5uYW1lKCJjb21wb25lbnROYW1lIikpOworCQlyZXNvdXJjZU5hbWVUZXh0Ym94LmNsZWFyKCk7CisJCXJlc291cmNlTmFtZVRleHRib3guc2VuZEtleXMocmVzb3VyY2VOYW1lKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lUmVzb3VyY2VDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBkYXRhdGVzdHNpZCkgeworCisJCUdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoY2F0ZWdvcnksIGRhdGF0ZXN0c2lkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0RmlsZVdpdGhTZW5kS2V5QnJvd3NlKFN0cmluZyBGaWxlUGF0aCwgU3RyaW5nIEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJV2ViRWxlbWVudCBicm93c2VidXR0b24gPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImJyb3dzZUJ1dHRvbiIpOworCQlicm93c2VidXR0b24uc2VuZEtleXMoRmlsZVBhdGggKyBGaWxlTmFtZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVRhZ3NMaXN0KFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgU3RyaW5nW10gcmVzb3VyY2VUYWdzKSB7CisJCUxpc3Q8U3RyaW5nPiB0YWdsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCTsKKwkJV2ViRWxlbWVudCByZXNvdXJjZVRhZ3NUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJpLXNkYy10YWctaW5wdXQiKTsKKwkJZm9yIChTdHJpbmcgdGFnIDogcmVzb3VyY2VUYWdzKSB7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LmNsZWFyKCk7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKHRhZyk7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKEtleXMuRU5URVIpOworCQkJdGFnbGlzdC5hZGQodGFnKTsKKwkJfQorCQlyZXNvdXJjZS5zZXRUYWdzKHRhZ2xpc3QpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVWZW5kb3JSZWxlYXNlKFN0cmluZyByZXNvdXJjZVZlbmRvclJlbGVhc2UpIHsKKworCQlXZWJFbGVtZW50IHJlc291cmNlVmVuZG9yUmVsZWFzZVRleHRib3ggPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInZlbmRvclJlbGVhc2UiKTsKKwkJcmVzb3VyY2VWZW5kb3JSZWxlYXNlVGV4dGJveC5jbGVhcigpOworCQlyZXNvdXJjZVZlbmRvclJlbGVhc2VUZXh0Ym94LnNlbmRLZXlzKHJlc291cmNlVmVuZG9yUmVsZWFzZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVByb2plY3RDb2RlKFN0cmluZyBwcm9qZWN0Q29kZSkgeworCisJCVdlYkVsZW1lbnQgcmVzb3VyY2VOYW1lVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5Lm5hbWUoInByb2plY3RDb2RlIikpOworCQlyZXNvdXJjZU5hbWVUZXh0Ym94LmNsZWFyKCk7CisJCXJlc291cmNlTmFtZVRleHRib3guc2VuZEtleXMocHJvamVjdENvZGUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0J1dHRvbihTdHJpbmcgc2VsZWN0QnV0dG9uKSB7CisKKwkJV2ViRWxlbWVudCBjbGlja0J1dHRvbiA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvLypbQGRhdGEtdGVzdHMtaWQ9JyIgKyBzZWxlY3RCdXR0b24gKyAiJ10iKSk7CisJCWNsaWNrQnV0dG9uLmNsaWNrKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IFdhaXRmdW5jdGlvbmZvcmJ1dHRvbnMoU3RyaW5nIGVsZW1lbnQsIGludCB0aW1lb3V0KSB7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLCB0aW1lb3V0KTsKKwkJcmV0dXJuIHdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLmVsZW1lbnRUb0JlQ2xpY2thYmxlKEJ5LnhwYXRoKGVsZW1lbnQpKSk7CisJfQorCisJLy8gY29kZWQgYnkgdGVkZHkKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbEdlbmVyYWxJbmZvcm1hdGlvblBhZ2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlLCBVc2VyIHVzZXIpIHsKKwkJdHJ5IHsKKwkJCXJlc291cmNlLnNldENvbnRhY3RJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJCXJlc291cmNlLnNldENyZWF0b3JVc2VySWQodXNlci5nZXRVc2VySWQoKSk7CisJCQlyZXNvdXJjZS5zZXRDcmVhdG9yRnVsbE5hbWUodXNlci5nZXRGdWxsTmFtZSgpKTsKKwkJCWRlZmluZVJlc291cmNlTmFtZShyZXNvdXJjZS5nZXROYW1lKCkpOworCQkJZGVmaW5lUmVzb3VyY2VDYXRlZ29yeShyZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpLAorCQkJCQkic2VsZWN0R2VuZXJhbENhdGVnb3J5Iik7CisJCQlHZW5lcmFsVUlVdGlscy5kZWZpbmVEZXNjcmlwdGlvbihyZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmRlZmluZVZlbmRvck5hbWUocmVzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpKTsKKwkJCWRlZmluZVZlbmRvclJlbGVhc2UocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJCWRlZmluZVRhZ3NMaXN0KHJlc291cmNlLCBuZXcgU3RyaW5nW10geyByZXNvdXJjZS5nZXROYW1lKCkgfSk7CisJCQlHZW5lcmFsVUlVdGlscy5kZWZpbmVVc2VySWQocmVzb3VyY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgY3JlYXRlUmVzb3VyY2VJblVJKFVzZXIgdXNlcikgeworCQlSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lUmVzb3VyY2VEZXRhaWxzKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQWRkQ29tcG9uZW50KERhdGFUZXN0SWRFbnVtLkRhc2hib2FyZC5CVVRUT05fQUREX1ZGKTsKKworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCWZpbGxHZW5lcmFsSW5mb3JtYXRpb25QYWdlKGRlZmluZVJlc291cmNlRGV0YWlscywgdXNlcik7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQ3JlYXRlQnV0dG9uKCk7CisJCXJldHVybiBkZWZpbmVSZXNvdXJjZURldGFpbHM7CisKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCXByaXZhdGUgc3RhdGljIHZvaWQgb3BlbkltcG9ydFdpdGhGaWxlKFN0cmluZyBmaWxlUGF0aCwgU3RyaW5nIGZpbGVOYW1lLCBEYXNoYm9hcmQgZWxlbWVudFR5cGUpIHsKKwkJUnVubmFibGUgb3BlbkltcG9ydFRhc2sgPSAoKSAtPiB7CisJCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9IVE1MRWxlbWVudEJ5RGF0YVRlc3RJZChEYXNoYm9hcmQuSU1QT1JUX0FSRUEuZ2V0VmFsdWUoKSk7CisJCQlXZWJFbGVtZW50IGltb3BydFZGQnV0dG9uID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChlbGVtZW50VHlwZS5nZXRWYWx1ZSgpKTsKKwkJCWltb3BydFZGQnV0dG9uLnNlbmRLZXlzKGZpbGVQYXRoICsgZmlsZU5hbWUpOworCQl9OworCQlyZXRyeU1ldGhvZE9uRXhjZXB0aW9uKG9wZW5JbXBvcnRUYXNrKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydFZmY0luVUkoVXNlciB1c2VyLCBTdHJpbmcgZmlsZVBhdGgsIFN0cmluZyBmaWxlTmFtZSkgeworCQlSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lUmVzb3VyY2VEZXRhaWxzID0gZGVmaW5lUmVzb3VyY2VEZXRhaWxzKCk7CisJCW9wZW5JbXBvcnRXaXRoRmlsZShmaWxlUGF0aCwgZmlsZU5hbWUsIERhdGFUZXN0SWRFbnVtLkRhc2hib2FyZC5JTVBPUlRfVkZDX0ZJTEUpOworCQkvLyBGaWxsIHRoZSBnZW5lcmFsIHBhZ2UgZmllbGRzLgorCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCWZpbGxHZW5lcmFsSW5mb3JtYXRpb25QYWdlKGRlZmluZVJlc291cmNlRGV0YWlscywgdXNlcik7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQ3JlYXRlQnV0dG9uKCk7CisJCXJldHVybiBkZWZpbmVSZXNvdXJjZURldGFpbHM7CisJfQorCisJLyoqCisJICogSW1wb3J0IFZGCisJICogCisJICogQHBhcmFtIHVzZXIKKwkgKiBAcGFyYW0gZmlsZVBhdGgKKwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgaW1wb3J0VmZJblVJKFVzZXIgdXNlciwgU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgZmlsZU5hbWUpIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGRlZmluZVJlc291cmNlRGV0YWlscyA9IGRlZmluZVJlc291cmNlRGV0YWlscygpOworCQlvcGVuSW1wb3J0V2l0aEZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lLCBEYXRhVGVzdElkRW51bS5EYXNoYm9hcmQuSU1QT1JUX1ZGX0ZJTEUpOworCQkvLyBGaWxsIHRoZSBnZW5lcmFsIHBhZ2UgZmllbGRzLgorCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCWZpbGxHZW5lcmFsSW5mb3JtYXRpb25QYWdlKGRlZmluZVJlc291cmNlRGV0YWlscywgdXNlcik7CisKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTYXZlQnV0dG9uKCk7CisKKwkJcmV0dXJuIGRlZmluZVJlc291cmNlRGV0YWlsczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVxRGV0YWlscyBpbXBvcnRWZkluVUlXaXRob3V0Q2hlY2tpbihVc2VyIHVzZXIsIFN0cmluZyBmaWxlUGF0aCwgU3RyaW5nIGZpbGVOYW1lKSB7CisJCVJlc291cmNlUmVxRGV0YWlscyBkZWZpbmVSZXNvdXJjZURldGFpbHMgPSBkZWZpbmVSZXNvdXJjZURldGFpbHMoKTsKKwkJb3BlbkltcG9ydFdpdGhGaWxlKGZpbGVQYXRoLCBmaWxlTmFtZSwgRGF0YVRlc3RJZEVudW0uRGFzaGJvYXJkLklNUE9SVF9WRl9GSUxFKTsKKwkJLy8gRmlsbCB0aGUgZ2VuZXJhbCBwYWdlIGZpZWxkcy4KKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlmaWxsR2VuZXJhbEluZm9ybWF0aW9uUGFnZShkZWZpbmVSZXNvdXJjZURldGFpbHMsIHVzZXIpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja1NhdmVCdXR0b24oKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQkvLyBTdHJpbmcgb2tCdXR0b25JZD1EYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCk7CisJCS8vIFJlc291cmNlVUlVdGlscy5jbGlja0J1dHRvbihva0J1dHRvbklkKTsKKwkJLy8gUmVzb3VyY2VVSVV0aWxzLldhaXRmdW5jdGlvbmZvcmJ1dHRvbnMoIi8vKltAZGF0YS10ZXN0cy1pZD0nIitva0J1dHRvbklkKyInXSIsMTApOworCQkvLyBSZXNvdXJjZVVJVXRpbHMuY2xpY2tCdXR0b24ob2tCdXR0b25JZCk7CisJCXJldHVybiBkZWZpbmVSZXNvdXJjZURldGFpbHM7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgaW1wb3J0VmZGcm9tT25Cb2FyZGluZ01vZGFsV2l0aG91dENoZWNraW4oVXNlciB1c2VyLCBTdHJpbmcgZmlsZU5hbWUpIHsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGRlZmluZVJlc291cmNlRGV0YWlscyA9IGRlZmluZVJlc291cmNlRGV0YWlscygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uT25Cb2FyZGluZ1RhYmxlLk9QRU5fTU9EQUxfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShmaWxlTmFtZSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk9uQm9hcmRpbmdUYWJsZS5JTVBPUlRfSUNPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCisJCS8vIEZpbGwgdGhlIGdlbmVyYWwgcGFnZSBmaWVsZHMuCisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTYXZlQnV0dG9uKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJcmV0dXJuIGRlZmluZVJlc291cmNlRGV0YWlsczsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVWZkNzYXIoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgZmlsZU5hbWUpIHsKKwkJcmV0cnlNZXRob2RPbkV4Y2VwdGlvbigKKwkJCQkoKSAtPiBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50QnlEYXRhVGVzdElkKERhdGFUZXN0SWRFbnVtLkdlbmVyYWxTZWN0aW9uLkJST1dTRV9CVVRUT04uZ2V0VmFsdWUoKSkKKwkJCQkJCS5zZW5kS2V5cyhmaWxlUGF0aCArIGZpbGVOYW1lKSk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU2F2ZUJ1dHRvbigpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVZmQ3NhckZyb21PbkJvYXJkaW5nKCkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uR2VuZXJhbFNlY3Rpb24uQlJPV1NFX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50c0xpc3RXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5PbkJvYXJkaW5nVGFibGUuQ1NBUl9ST1cuZ2V0VmFsdWUoKSkuZ2V0KDApCisJCQkJLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5PbkJvYXJkaW5nVGFibGUuVVBEQVRFX0lDT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTYXZlQnV0dG9uKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlUmVxRGV0YWlscyBkZWZpbmVSZXNvdXJjZURldGFpbHMoKSB7CisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZVJlcURldGFpbHMoKTsKKwkJcmVzb3VyY2UgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsCisJCQkJUmVzb3VyY2VDYXRlZ29yeUVudW0uR0VORVJJQ19ORVRXT1JLX0VMRU1FTlRTKTsKKwkJcmVzb3VyY2Uuc2V0VmVyc2lvbihJTklUSUFMX1ZFUlNJT04pOworCQlyZXNvdXJjZS5zZXRJY29uKElDT05fUkVTT1VSQ0VfTkFNRSk7CisJCXJlc291cmNlLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCQlyZXNvdXJjZS5zZXROYW1lKGdldFJhbmRvbUNvbXBvbmVudE5hbWUoUkVTT1VSQ0VfTkFNRV9QUkVGSVgpKTsKKworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UmFuZG9tQ29tcG9uZW50TmFtZShTdHJpbmcgcHJlZml4KSB7CisJCXJldHVybiBwcmVmaXggKyBuZXcgUmFuZG9tKCkubmV4dEludCgxMDAwMCk7CisJfQorCisJcHVibGljIHN0YXRpYyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBnZXRSSVBvc2l0aW9uKFJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUksIFVzZXIgdXNlcikgeworCQlHZW5lcmFsVUlVdGlscy5zbGVlcCgxMDAwKTsKKwkJU3RyaW5nIHJlc3BvbnNlQWZ0ZXJEcmFnID0gUmVzdENEVXRpbHMuZ2V0UmVzb3VyY2UoY3JlYXRlUmVzb3VyY2VJblVJKS5nZXRSZXNwb25zZSgpOworCQlKU09OT2JqZWN0IGpzb25SZXNvdXJjZSA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UocmVzcG9uc2VBZnRlckRyYWcpOworCQlTdHJpbmcgeFBvc1Bvc3REcmFnID0gKFN0cmluZykgKChKU09OT2JqZWN0KSAoKEpTT05BcnJheSkganNvblJlc291cmNlLmdldCgiY29tcG9uZW50SW5zdGFuY2VzIikpLmdldCgwKSkKKwkJCQkuZ2V0KCJwb3NYIik7CisJCVN0cmluZyB5UG9zUG9zdERyYWcgPSAoU3RyaW5nKSAoKEpTT05PYmplY3QpICgoSlNPTkFycmF5KSBqc29uUmVzb3VyY2UuZ2V0KCJjb21wb25lbnRJbnN0YW5jZXMiKSkuZ2V0KDApKQorCQkJCS5nZXQoInBvc1kiKTsKKwkJcmV0dXJuIG5ldyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPih4UG9zUG9zdERyYWcsIHlQb3NQb3N0RHJhZyk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbGluRGVwbG95bWVudEFydGlmYWN0Rm9ybUFuZENsaWNrRG9uZSgKKwkJCW9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHMgZGV0YWlscywgU3RyaW5nIGZpbGVQYXRoKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5BcnRpZmFjdE1vZGFsLkxBQkVMLmdldFZhbHVlKCkpCisJCQkJLnNlbmRLZXlzKGRldGFpbHMuZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuREVTQ1JJUFRJT04uZ2V0VmFsdWUoKSkKKwkJCQkuc2VuZEtleXMoZGV0YWlscy5nZXREZXNjcmlwdGlvbigpKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdChkZXRhaWxzLmdldEFydGlmYWN0VHlwZSgpLCBEYXRhVGVzdElkRW51bS5BcnRpZmFjdE1vZGFsLlRZUEUuZ2V0VmFsdWUoKSk7CisJCXJldHJ5TWV0aG9kT25FeGNlcHRpb24oKCkgLT4gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChEYXRhVGVzdElkRW51bS5HZW5lcmFsU2VjdGlvbi5CUk9XU0VfQlVUVE9OLmdldFZhbHVlKCkpLnNlbmRLZXlzKGZpbGVQYXRoKSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLkRPTkUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCX0KKworCS8qKgorCSAqIFRlc3RzIGFuZCBBY2NlcHQgcmVzb3VyY2Ugb3Igc2VydmljZQorCSAqIAorCSAqIEBwYXJhbSBjcmVhdGVSZXNvdXJjZUluVUkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEFuZEFjY2VwdEVsZW1lbnQoQ29tcG9uZW50UmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUkpIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoY3JlYXRlUmVzb3VyY2VJblVJLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTGlmZUN5bGVDaGFuZ2VCdXR0b25zLlNUQVJUX1RFU1RJTkcuZ2V0VmFsdWUoKSkKKwkJCQkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTGlmZUN5bGVDaGFuZ2VCdXR0b25zLkFDQ0VQVC5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLkFDQ0VQX1RFU1RJTkdfTUVTU0FHRS5nZXRWYWx1ZSgpKQorCQkJCS5zZW5kS2V5cygicmVzb3VyY2UgIiArIGNyZWF0ZVJlc291cmNlSW5VSS5nZXROYW1lKCkgKyAiIHRlc3RlZCBzdWNjZXNzZnVseSIpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRUb0Rpc2FwcGVhcihEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpOworCX0KKworCS8qKgorCSAqIFdhaXRzIFVudGlsIHJlc291cmNlIGNoYW5nZWQgdG8gcmVxdWVzdGVkIGxpZmVDeWNsZSBTdGF0ZQorCSAqIAorCSAqIEBwYXJhbSBjcmVhdGVSZXNvdXJjZUluVUkKKwkgKiBAcGFyYW0gcmVxdWVzdGVkTGlmZUN5Y2xlU3RhdGUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZSB3YWl0Rm9yU3RhdGUoUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlSW5VSSwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSByZXF1ZXN0ZWRMaWZlQ3ljbGVTdGF0ZSkgeworCQlTdXBwbGllcjxSZXNvdXJjZT4gcmVzb3VyY2VHZXR0ZXIgPSAoKSAtPiB7CisJCQlTdHJpbmcgcmVzb3VyY2VTdHJpbmcgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShjcmVhdGVSZXNvdXJjZUluVUkpLmdldFJlc3BvbnNlKCk7CisJCQlyZXR1cm4gUmVzcG9uc2VQYXJzZXIuY29udmVydFJlc291cmNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VTdHJpbmcpOworCQl9OworCQlGdW5jdGlvbjxSZXNvdXJjZSwgQm9vbGVhbj4gdmVyaWZpZXIgPSByZXMgLT4gcmVzLmdldExpZmVjeWNsZVN0YXRlKCkgPT0gcmVxdWVzdGVkTGlmZUN5Y2xlU3RhdGU7CisJCXJldHVybiBGdW5jdGlvbmFsSW50ZXJmYWNlcy5yZXRyeU1ldGhvZE9uUmVzdWx0KHJlc291cmNlR2V0dGVyLCB2ZXJpZmllcik7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdXRpbGl0aWVzL1Jlc3RDRFV0aWxzLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3V0aWxpdGllcy9SZXN0Q0RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNjAyZTMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3V0aWxpdGllcy9SZXN0Q0RVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzOworCitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkZ1bmN0aW9uYWxJbnRlcmZhY2VzLnJldHJ5TWV0aG9kT25SZXN1bHQ7CitpbXBvcnQgc3RhdGljIG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkZ1bmN0aW9uYWxJbnRlcmZhY2VzLnN3YWxsb3dFeGNlcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUHJvZHVjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CisKK3B1YmxpYyBjbGFzcyBSZXN0Q0RVdGlscyB7CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFJlc291cmNlVW5pcXVlSWRBbmRVVUlEKENvbXBvbmVudFJlcURldGFpbHMgZWxlbWVudCwgUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UpIHsKKwkJZWxlbWVudC5zZXRVbmlxdWVJZChSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShnZXRSZXNvdXJjZVJlc3BvbnNlKSk7CisJCWVsZW1lbnQuc2V0VVVJRChSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGdldFJlc291cmNlUmVzcG9uc2UpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb25SZXRyeU9uRmFpbChTdHJpbmcgdXNlcklkLCBTdHJpbmcgcmVzb3VyY2VOYW1lLAorCQkJU3RyaW5nIHJlc291cmNlVmVyc2lvbikgeworCQlTdXBwbGllcjxSZXN0UmVzcG9uc2U+IHJlc291cmNlR2V0dGVyID0gKCkgLT4gc3dhbGxvd0V4Y2VwdGlvbigKKwkJCQkoKSAtPiBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZUJ5TmFtZUFuZFZlcnNpb24odXNlcklkLCByZXNvdXJjZU5hbWUsIHJlc291cmNlVmVyc2lvbikpOworCQlGdW5jdGlvbjxSZXN0UmVzcG9uc2UsIEJvb2xlYW4+IHZhbGlkYXRvciA9IHJlc3RSZXMgLT4gcmVzdFJlcy5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LOworCQlyZXR1cm4gcmV0cnlNZXRob2RPblJlc3VsdChyZXNvdXJjZUdldHRlciwgdmFsaWRhdG9yKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UpIHsKKwkJdHJ5IHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigidHJ5aW5nIHRvIGdldCByZXNvdXJjZSIpOworCQkJUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UgPSBudWxsOworCQkJU3RyaW5nIHJlb3VyY2VVbmlxdWVJZCA9IHJlc291cmNlLmdldFVuaXF1ZUlkKCk7CisKKwkJCWlmIChyZW91cmNlVW5pcXVlSWQgIT0gbnVsbCkgeworCQkJCUdlbmVyYWxVSVV0aWxzLnNsZWVwKDEwMDApOworCQkJCWdldFJlc291cmNlUmVzcG9uc2UgPSBSZXNvdXJjZVJlc3RVdGlscy5nZXRSZXNvdXJjZShyZW91cmNlVW5pcXVlSWQpOworCQkJCWlmIChnZXRSZXNvdXJjZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInN1Y2NlZWRlZCB0byBnZXQgcmVzb3VyY2UiKTsKKwkJCQl9CisJCQkJcmV0dXJuIGdldFJlc291cmNlUmVzcG9uc2U7CisJCQl9CisJCQlKU09OT2JqZWN0IGdldFJlc291cmNlSlNPTk9iamVjdCA9IG51bGw7CisJCQlnZXRSZXNvdXJjZVJlc3BvbnNlID0gZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uUmV0cnlPbkZhaWwoVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJJZCgpLAorCQkJCQlyZXNvdXJjZS5nZXROYW1lKCksIHJlc291cmNlLmdldFZlcnNpb24oKSk7CisJCQlpZiAoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpID09IEh0dHBTdGF0dXMuU0NfT0spIHsKKwkJCQlKU09OQXJyYXkgakFycmF5ID0gbmV3IEpTT05BcnJheShnZXRSZXNvdXJjZVJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgakFycmF5Lmxlbmd0aCgpOyBpKyspIHsKKwkJCQkJZ2V0UmVzb3VyY2VKU09OT2JqZWN0ID0gakFycmF5LmdldEpTT05PYmplY3QoaSk7CisJCQkJCVN0cmluZyByZXNvdXJjZVR5cGUgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UoZ2V0UmVzb3VyY2VKU09OT2JqZWN0LnRvU3RyaW5nKCksCisJCQkJCQkJInJlc291cmNlVHlwZSIpOworCQkJCQlpZiAocmVzb3VyY2VUeXBlLmVxdWFscyhyZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSkpIHsKKwkJCQkJCWdldFJlc291cmNlUmVzcG9uc2Uuc2V0UmVzcG9uc2UoZ2V0UmVzb3VyY2VKU09OT2JqZWN0LnRvU3RyaW5nKCkpOworCQkJCQkJc2V0UmVzb3VyY2VVbmlxdWVJZEFuZFVVSUQocmVzb3VyY2UsIGdldFJlc291cmNlUmVzcG9uc2UpOworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdWNjZWVkZWQgdG8gZ2V0IHJlc291cmNlIik7CisJCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZXNwb25zZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGdldFJlc291cmNlUmVzcG9uc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldFNlcnZpY2UoU2VydmljZVJlcURldGFpbHMgc2VydmljZSwgVXNlciB1c2VyKSB7CisJCVN1cHBsaWVyPFJlc3RSZXNwb25zZT4gc2VydmljZUZldGNoZXIgPSAoKSAtPiBzd2FsbG93RXhjZXB0aW9uKAorCQkJCSgpIC0+IFNlcnZpY2VSZXN0VXRpbHMuZ2V0U2VydmljZUJ5TmFtZUFuZFZlcnNpb24odXNlciwgc2VydmljZS5nZXROYW1lKCksIHNlcnZpY2UuZ2V0VmVyc2lvbigpKSk7CisJCUZ1bmN0aW9uPFJlc3RSZXNwb25zZSwgQm9vbGVhbj4gdmVyaWZpZXIgPSByZXN0UmVzcG9uc2UgLT4gcmVzdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpCisJCQkJLmludFZhbHVlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSzsKKwkJUmVzdFJlc3BvbnNlIGdldFNlcnZpY2VSZXNwb25zZSA9IHJldHJ5TWV0aG9kT25SZXN1bHQoc2VydmljZUZldGNoZXIsIHZlcmlmaWVyKTsKKworCQlpZiAoZ2V0U2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgeworCQkJc2V0UmVzb3VyY2VVbmlxdWVJZEFuZFVVSUQoc2VydmljZSwgZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJfQorCQlyZXR1cm4gZ2V0U2VydmljZVJlc3BvbnNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGdldFByb2R1Y3QoUHJvZHVjdFJlcURldGFpbHMgcHJvZHVjdCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVGhyZWFkLnNsZWVwKDM1MDApOworCQlSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdFJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5nZXRQcm9kdWN0QnlOYW1lQW5kVmVyc2lvbihwcm9kdWN0LmdldE5hbWUoKSwKKwkJCQlwcm9kdWN0LmdldFZlcnNpb24oKSwgdXNlci5nZXRVc2VySWQoKSk7CisJCWlmIChnZXRQcm9kdWN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSA9PSAyMDApIHsKKwkJCXNldFJlc291cmNlVW5pcXVlSWRBbmRVVUlEKHByb2R1Y3QsIGdldFByb2R1Y3RSZXNwb25zZSk7CisJCX0KKwkJcmV0dXJuIGdldFByb2R1Y3RSZXNwb25zZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QWxsRWxlbWVudFZlcnNpb25zRnJvbVJlc3BvbnNlKFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gdmVyc2lvbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJdHJ5IHsKKwkJCU9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisKKwkJCUpTT05PYmplY3Qgb2JqZWN0ID0gbmV3IEpTT05PYmplY3QoZ2V0UmVzb3VyY2UuZ2V0UmVzcG9uc2UoKSk7CisJCQl2ZXJzaW9uc01hcCA9IG1hcHBlci5yZWFkVmFsdWUob2JqZWN0LmdldCgiYWxsVmVyc2lvbnMiKS50b1N0cmluZygpLCBNYXAuY2xhc3MpOworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIHZlcnNpb25zTWFwOworCisJCX0KKworCQlyZXR1cm4gdmVyc2lvbnNNYXA7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUVsZW1lbnRWZXJzaW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IGVsZW1lbnRWZXJzaW9ucywgYm9vbGVhbiBpc0JlZm9yZVRlc3QsIE9iamVjdCBjbGF6eiwKKwkJCVVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBlbGVtZW50VmVyc2lvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJU3RyaW5nIHNpbmdsZVZlcnNpb24gPSBpdGVyYXRvci5uZXh0KCk7CisJCQlTdHJpbmcgdW5pcXVlSWQgPSBlbGVtZW50VmVyc2lvbnMuZ2V0KHNpbmdsZVZlcnNpb24pOworCQkJUmVzdFJlc3BvbnNlIGRlbGV0ZVJlc3BvbnNlID0gbnVsbDsKKwkJCWlmIChjbGF6eiBpbnN0YW5jZW9mIFNlcnZpY2VSZXFEZXRhaWxzKSB7CisJCQkJZGVsZXRlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmRlbGV0ZVNlcnZpY2VCeUlkKHVuaXF1ZUlkLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCX0gZWxzZSBpZiAoY2xhenogaW5zdGFuY2VvZiBSZXNvdXJjZVJlcURldGFpbHMpIHsKKwkJCQlkZWxldGVSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmRlbGV0ZVJlc291cmNlKHVuaXF1ZUlkLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCX0gZWxzZSBpZiAoY2xhenogaW5zdGFuY2VvZiBQcm9kdWN0UmVxRGV0YWlscykgeworCQkJCWRlbGV0ZVJlc3BvbnNlID0gUHJvZHVjdFJlc3RVdGlscy5kZWxldGVQcm9kdWN0KHVuaXF1ZUlkLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCX0KKworCQkJaWYgKGlzQmVmb3JlVGVzdCkgeworCQkJCWFzc2VydFRydWUoZGVsZXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSA9PSAyMDQKKwkJCQkJCXx8IGRlbGV0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gNDA0KTsKKwkJCX0gZWxzZSB7CisJCQkJYXNzZXJ0VHJ1ZShkZWxldGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpID09IDIwNCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsUmVzb3VyY2VWZXJzaW9uc0FmdGVyVGVzdChDb21wb25lbnRSZXFEZXRhaWxzIGNvbXBvbmVudERldGFpbHMsCisJCQlSZXN0UmVzcG9uc2UgZ2V0T2JqZWN0UmVzcG9uc2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRlbGV0ZUFsbENvbXBvbmVudFZlcnNpb24oZmFsc2UsIGNvbXBvbmVudERldGFpbHMsIGdldE9iamVjdFJlc3BvbnNlLCB1c2VyKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsUmVzb3VyY2VWZXJzaW9uc0JlZm9yZVRlc3QoQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnREZXRhaWxzLAorCQkJUmVzdFJlc3BvbnNlIGdldE9iamVjdFJlc3BvbnNlLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlkZWxldGVBbGxDb21wb25lbnRWZXJzaW9uKHRydWUsIGNvbXBvbmVudERldGFpbHMsIGdldE9iamVjdFJlc3BvbnNlLCB1c2VyKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsQ29tcG9uZW50VmVyc2lvbihib29sZWFuIGlzQmVmb3JlVGVzdCwgQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnREZXRhaWxzLAorCQkJUmVzdFJlc3BvbnNlIGdldE9iamVjdFJlc3BvbnNlLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAoZ2V0T2JqZWN0UmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSA9PSA0MDQpCisJCQlyZXR1cm47CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gY29tcG9uZW50VmVyc2lvbnNNYXAgPSBnZXRBbGxFbGVtZW50VmVyc2lvbnNGcm9tUmVzcG9uc2UoZ2V0T2JqZWN0UmVzcG9uc2UpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0aW5nLi4uIik7CisJCWRlbGV0ZUVsZW1lbnRWZXJzaW9ucyhjb21wb25lbnRWZXJzaW9uc01hcCwgaXNCZWZvcmVUZXN0LCBjb21wb25lbnREZXRhaWxzLCB1c2VyKTsKKwkJY29tcG9uZW50RGV0YWlscy5zZXRVbmlxdWVJZChudWxsKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3V0aWxpdGllcy9TZXJ2aWNlVUlVdGlscy5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvU2VydmljZVVJVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmNjM2IzCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy91dGlsaXRpZXMvU2VydmljZVVJVXRpbHMuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uR2VuZXJhbFNlY3Rpb247CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5LZXlzOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuU2VsZWN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlNlcnZpY2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlNlcnZpY2VDYXRlZ29yaWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzcG9uc2VQYXJzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY29tbW9uLmRhdGFzdHJ1Y3R1cmUuRnVuY3Rpb25hbEludGVyZmFjZXM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlVUlVdGlscyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUVfUFJFRklYID0gIlNlcnZpY2VDRFRlc3QtIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX1ZFUlNJT04gPSAiMC4xIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NFUlZJQ0VfTkFNRSA9ICJtb2JpbGl0eSI7CisKKwlwcml2YXRlIFNlcnZpY2VVSVV0aWxzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZpbmVTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKKwkJV2ViRWxlbWVudCBzZXJ2aWNlTmFtZUVsZW1lbnQgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoR2VuZXJhbFNlY3Rpb24uTkFNRS5nZXRWYWx1ZSgpKTsKKwkJc2VydmljZU5hbWVFbGVtZW50LmNsZWFyKCk7CisJCXNlcnZpY2VOYW1lRWxlbWVudC5zZW5kS2V5cyhzZXJ2aWNlTmFtZSk7CisJCXJldHVybiBzZXJ2aWNlTmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lVGFnc0xpc3QoU2VydmljZVJlcURldGFpbHMgc2VydmljZSwgU3RyaW5nW10gc2VydmljZVRhZ3MpIHsKKwkJTGlzdDxTdHJpbmc+IHRhZ2xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJOworCQlXZWJFbGVtZW50IHNlcnZpY2VUYWdzVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiaS1zZGMtdGFnLWlucHV0Iik7CisJCWZvciAoU3RyaW5nIHRhZyA6IHNlcnZpY2VUYWdzKSB7CisJCQlzZXJ2aWNlVGFnc1RleHRib3guY2xlYXIoKTsKKwkJCXNlcnZpY2VUYWdzVGV4dGJveC5zZW5kS2V5cyh0YWcpOworCQkJc2VydmljZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKEtleXMuRU5URVIpOworCQkJdGFnbGlzdC5hZGQodGFnKTsKKwkJfQorCQl0YWdsaXN0LmFkZCgwLCBzZXJ2aWNlLmdldE5hbWUoKSk7CisJCXNlcnZpY2Uuc2V0VGFncyh0YWdsaXN0KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlbGVjdCBkZWZpbmVTZXJ2aWNlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7CisKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoY2F0ZWdvcnksICJzZWxlY3RHZW5lcmFsQ2F0ZWdvcnkiKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlZmluZVNlcnZpY2VQcm9qZWN0Q29kZShTdHJpbmcgcHJvamVjdENvZGUpIHsKKwkJV2ViRWxlbWVudCBwcm9qZWN0Q29kZVRleHRib3ggPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInByb2plY3RDb2RlIik7CisJCXByb2plY3RDb2RlVGV4dGJveC5jbGVhcigpOworCQlwcm9qZWN0Q29kZVRleHRib3guc2VuZEtleXMocHJvamVjdENvZGUpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbFNlcnZpY2VHZW5lcmFsUGFnZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlLCBVc2VyIHVzZXIpIHsKKwkJc2VydmljZS5zZXRDb250YWN0SWQodXNlci5nZXRVc2VySWQoKSk7CisJCXNlcnZpY2Uuc2V0Q3JlYXRvclVzZXJJZCh1c2VyLmdldFVzZXJJZCgpKTsKKwkJc2VydmljZS5zZXRDcmVhdG9yRnVsbE5hbWUodXNlci5nZXRGdWxsTmFtZSgpKTsKKwkJZGVmaW5lU2VydmljZU5hbWUoc2VydmljZS5nZXROYW1lKCkpOworCQlkZWZpbmVTZXJ2aWNlQ2F0ZWdvcnkoc2VydmljZS5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCUdlbmVyYWxVSVV0aWxzLmRlZmluZURlc2NyaXB0aW9uKHNlcnZpY2UuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWRlZmluZVRhZ3NMaXN0KHNlcnZpY2UsCisJCQkJbmV3IFN0cmluZ1tdIHsgc2VydmljZS5nZXROYW1lKCksICJUaGlzLWlzLXRhZyIsICJhbm90aGVyLXRhZyIsICJUZXN0LWF1dG9tYXRpb24tdGFnIiB9KTsKKwkJR2VuZXJhbFVJVXRpbHMuZGVmaW5lVXNlcklkKHNlcnZpY2UuZ2V0Q3JlYXRvclVzZXJJZCgpKTsKKwkJZGVmaW5lU2VydmljZVByb2plY3RDb2RlKHNlcnZpY2UuZ2V0UHJvamVjdENvZGUoKSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlcnZpY2VSZXFEZXRhaWxzIGNyZWF0ZVNlcnZpY2VJblVJKFVzZXIgdXNlcikgeworCisJCVNlcnZpY2VSZXFEZXRhaWxzIGRlZmluZVNlcnZpY2VldGFpbHMgPSBkZWZpbmVTZXJ2aWNlRGV0YWlscyh1c2VyKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tBZGRDb21wb25lbnQoRGF0YVRlc3RJZEVudW0uRGFzaGJvYXJkLkJVVFRPTl9BRERfU0VSVklDRSk7CisKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlmaWxsU2VydmljZUdlbmVyYWxQYWdlKGRlZmluZVNlcnZpY2VldGFpbHMsIHVzZXIpOworCisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQ3JlYXRlQnV0dG9uKCk7CisKKwkJcmV0dXJuIGRlZmluZVNlcnZpY2VldGFpbHM7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlcnZpY2VSZXFEZXRhaWxzIGRlZmluZVNlcnZpY2VEZXRhaWxzKFVzZXIgdXNlcikgeworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlID0gbmV3IFNlcnZpY2VSZXFEZXRhaWxzKCk7CisJCXNlcnZpY2UgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZShTZXJ2aWNlQ2F0ZWdvcmllc0VudW0uTU9CSUxJVFksIHVzZXIpOworCQlzZXJ2aWNlLnNldFZlcnNpb24oSU5JVElBTF9WRVJTSU9OKTsKKwkJc2VydmljZS5zZXRJY29uKElDT05fU0VSVklDRV9OQU1FKTsKKwkJc2VydmljZS5zZXROYW1lKGdldFJhbmRvbUNvbXBvbmVudE5hbWUoU0VSVklDRV9OQU1FX1BSRUZJWCkpOworCisJCXJldHVybiBzZXJ2aWNlOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFJhbmRvbUNvbXBvbmVudE5hbWUoU3RyaW5nIHByZWZpeCkgeworCQlyZXR1cm4gcHJlZml4ICsgbmV3IFJhbmRvbSgpLm5leHRJbnQoMTAwMDApOworCX0KKworCS8qKgorCSAqIFdhaXRzIFVudGlsIHNlcnZpY2UgY2hhbmdlZCB0byByZXF1ZXN0ZWQgbGlmZUN5Y2xlIFN0YXRlCisJICogCisJICogQHBhcmFtIGNyZWF0ZVNlcnZpY2VJblVJCisJICogQHBhcmFtIHJlcXVlc3RlZExpZmVDeWNsZVN0YXRlCisJICogQHBhcmFtIHVzZXIKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBTZXJ2aWNlIHdhaXRGb3JTdGF0ZShTZXJ2aWNlUmVxRGV0YWlscyBjcmVhdGVTZXJ2aWNlSW5VSSwgTGlmZWN5Y2xlU3RhdGVFbnVtIHJlcXVlc3RlZExpZmVDeWNsZVN0YXRlLAorCQkJVXNlciB1c2VyKSB7CisJCVN1cHBsaWVyPFNlcnZpY2U+IHNlcnZpY2VHZXR0ZXIgPSAoKSAtPiB7CisJCQlTdHJpbmcgcmVzb3VyY2VTdHJpbmcgPSBSZXN0Q0RVdGlscy5nZXRTZXJ2aWNlKGNyZWF0ZVNlcnZpY2VJblVJLCB1c2VyKS5nZXRSZXNwb25zZSgpOworCQkJcmV0dXJuIFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRTZXJ2aWNlUmVzcG9uc2VUb0phdmFPYmplY3QocmVzb3VyY2VTdHJpbmcpOworCQl9OworCQlGdW5jdGlvbjxTZXJ2aWNlLCBCb29sZWFuPiB2ZXJpZmllciA9IHJlcyAtPiByZXMuZ2V0TGlmZWN5Y2xlU3RhdGUoKSA9PSByZXF1ZXN0ZWRMaWZlQ3ljbGVTdGF0ZTsKKwkJcmV0dXJuIEZ1bmN0aW9uYWxJbnRlcmZhY2VzLnJldHJ5TWV0aG9kT25SZXN1bHQoc2VydmljZUdldHRlciwgdmVyaWZpZXIpOworCisJfQorCisJLyoqCisJICogVGhpcyBNZXRob2QgQXBwcm92ZXMgc2VydmljZSBmb3IgZGlzdHJpYnV0aW9uPGJyPgorCSAqIEl0IGFzc3VtZXMgZ292ZXJub3Igcm9sZSBpcyBhbHJlYWR5IGxvZ2dlZCBpbgorCSAqIAorCSAqIEBwYXJhbSBjcmVhdGVTZXJ2aWNlSW5VSQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHByb3ZlU2VydmljZUZvckRpc3RyaWJ1dGlvbihTZXJ2aWNlUmVxRGV0YWlscyBjcmVhdGVTZXJ2aWNlSW5VSSkgeworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShjcmVhdGVTZXJ2aWNlSW5VSS5nZXROYW1lKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkxpZmVDeWxlQ2hhbmdlQnV0dG9ucy5BUFBST1ZFLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuQUNDRVBfVEVTVElOR19NRVNTQUdFLmdldFZhbHVlKCkpCisJCQkJLnNlbmRLZXlzKCJTZXJ2aWNlICIgKyBjcmVhdGVTZXJ2aWNlSW5VSS5nZXROYW1lKCkgKyAiIEFwcHJvdmVkIEZvciBEaXN0cmlidXRpb24iKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5PSy5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50VG9EaXNhcHBlYXIoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5PSy5nZXRWYWx1ZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdmVyaWZpY2F0b3IvU2VydmljZVZlcmlmaWNhdG9yLmphdmEgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3ZlcmlmaWNhdG9yL1NlcnZpY2VWZXJpZmljYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDZkZjAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3ZlcmlmaWNhdG9yL1NlcnZpY2VWZXJpZmljYXRvci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy52ZXJpZmljYXRvcjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLlJlc3RDRFV0aWxzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuU2VydmljZVJlc3RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5GdW5jdGlvbmFsSW50ZXJmYWNlczsKKworcHVibGljIGNsYXNzIFNlcnZpY2VWZXJpZmljYXRvciB7CisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU51bU9mQ29tcG9uZW50SW5zdGFuY2VzKFNlcnZpY2VSZXFEZXRhaWxzIGNyZWF0ZVNlcnZpY2VJblVJLCBpbnQgbnVtT2ZWRkMsIFVzZXIgdXNlcikgeworCQlTdHJpbmcgcmVzcG9uc2VBZnRlckRyYWcgPSBSZXN0Q0RVdGlscy5nZXRTZXJ2aWNlKGNyZWF0ZVNlcnZpY2VJblVJLCB1c2VyKS5nZXRSZXNwb25zZSgpOworCQlKU09OT2JqZWN0IGpzb25SZXNvdXJjZSA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UocmVzcG9uc2VBZnRlckRyYWcpOworCQlpbnQgc2l6ZSA9ICgoSlNPTkFycmF5KSBqc29uUmVzb3VyY2UuZ2V0KCJjb21wb25lbnRJbnN0YW5jZXMiKSkuc2l6ZSgpOworCQlhc3NlcnRUcnVlKHNpemUgPT0gbnVtT2ZWRkMpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlMaW5rQ3JlYXRlZChTZXJ2aWNlUmVxRGV0YWlscyBjcmVhdGVTZXJ2aWNlSW5VSSwgVXNlciB1c2VyKSB7CisJCVN0cmluZyByZXNwb25zZUFmdGVyRHJhZyA9IFJlc3RDRFV0aWxzLmdldFNlcnZpY2UoY3JlYXRlU2VydmljZUluVUksIHVzZXIpLmdldFJlc3BvbnNlKCk7CisJCUpTT05PYmplY3QganNvblNlcnZpY2UgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKHJlc3BvbnNlQWZ0ZXJEcmFnKTsKKwkJYXNzZXJ0VHJ1ZSgoKEpTT05BcnJheSkganNvblNlcnZpY2UuZ2V0KCJjb21wb25lbnRJbnN0YW5jZXNSZWxhdGlvbnMiKSkuc2l6ZSgpID09IDEpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVNlcnZpY2VDcmVhdGVkKFNlcnZpY2VSZXFEZXRhaWxzIGNyZWF0ZVNlcnZpY2VJblVJLCBVc2VyIHVzZXIpIHsKKwkJYXNzZXJ0VHJ1ZShSZXN0Q0RVdGlscy5nZXRTZXJ2aWNlKGNyZWF0ZVNlcnZpY2VJblVJLCB1c2VyKS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKworCX0KKworCS8qKgorCSAqIFZlcmlmaWVzIHNlcnZpY2UgaXMgY2VydGlmaWVkIHdpdGggdmVyc2lvbiAxLjAKKwkgKiAKKwkgKiBAcGFyYW0gY3JlYXRlU2VydmljZUluVUkKKwkgKiBAcGFyYW0gdXNlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlTZXJ2aWNlQ2VydGlmaWVkKFNlcnZpY2VSZXFEZXRhaWxzIGNyZWF0ZVNlcnZpY2VJblVJLCBVc2VyIHVzZXIpIHsKKwkJU3VwcGxpZXI8UmVzdFJlc3BvbnNlPiBzZXJ2aWNlR2V0dGVyID0gKCkgLT4gRnVuY3Rpb25hbEludGVyZmFjZXMuc3dhbGxvd0V4Y2VwdGlvbigKKwkJCQkoKSAtPiBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKHVzZXIsIGNyZWF0ZVNlcnZpY2VJblVJLmdldE5hbWUoKSwgIjEuMCIpKTsKKwkJRnVuY3Rpb248UmVzdFJlc3BvbnNlLCBCb29sZWFuPiBzZXJ2aWNlVmVyaWZpY2F0b3IgPSByZXN0UmVzcCAtPiByZXN0UmVzcC5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LOworCQlSZXN0UmVzcG9uc2UgY2VydGlmaWVkUmVzb3VyY2VSZXNvcG5zZSA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VzLnJldHJ5TWV0aG9kT25SZXN1bHQoc2VydmljZUdldHRlciwKKwkJCQlzZXJ2aWNlVmVyaWZpY2F0b3IpOworCQlhc3NlcnRUcnVlKGNlcnRpZmllZFJlc291cmNlUmVzb3Buc2UuZ2V0RXJyb3JDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSyk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3ZlcmlmaWNhdG9yL1ZlcmlmaWNhdG9yVXRpbC5qYXZhIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy92ZXJpZmljYXRvci9WZXJpZmljYXRvclV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk4M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvdWljaS90ZXN0cy92ZXJpZmljYXRvci9WZXJpZmljYXRvclV0aWwuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudmVyaWZpY2F0b3I7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5kYXRhc3RydWN0dXJlLkZ1bmN0aW9uYWxJbnRlcmZhY2VzOworCisvKioKKyAqIFV0aWwgQ2xhc3MgRm9yIFZlcmlmaWNhdG9ycworICogCisgKiBAYXV0aG9yIG1zaGl0cml0CisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmVyaWZpY2F0b3JVdGlsIHsKKworCXByaXZhdGUgVmVyaWZpY2F0b3JVdGlsKCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0Vycm9yKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVdpdGhSZXRyeShTdXBwbGllcjxCb29sZWFuPiB2ZXJpZmljYXRvcikgeworCQlGdW5jdGlvbjxCb29sZWFuLCBCb29sZWFuPiByZXRyeVZlcmlmaWNhdGlvbkxvZ2ljID0gaXNWZXJpZmllZCAtPiBpc1ZlcmlmaWVkOworCQlCb29sZWFuIGlzVmVyaWZpZWRBZnRlclJldHJpZXMgPSBGdW5jdGlvbmFsSW50ZXJmYWNlcy5yZXRyeU1ldGhvZE9uUmVzdWx0KHZlcmlmaWNhdG9yLCByZXRyeVZlcmlmaWNhdGlvbkxvZ2ljKTsKKwkJYXNzZXJ0VHJ1ZShpc1ZlcmlmaWVkQWZ0ZXJSZXRyaWVzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3ZlcmlmaWNhdG9yL1ZmVmVyaWZpY2F0b3IuamF2YSBiL3VpLWNpLWRldi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3VpY2kvdGVzdHMvdmVyaWZpY2F0b3IvVmZWZXJpZmljYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzdjYTAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy91aWNpL3Rlc3RzL3ZlcmlmaWNhdG9yL1ZmVmVyaWZpY2F0b3IuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLnZlcmlmaWNhdG9yOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy51dGlsaXRpZXMuUmVzb3VyY2VVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMudXRpbGl0aWVzLlJlc3RDRFV0aWxzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuTGlmZWN5Y2xlU3RhdGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uZGF0YXN0cnVjdHVyZS5GdW5jdGlvbmFsSW50ZXJmYWNlczsKKworLyoqCisgKiBDbGFzcyB0byBob2xkIFRlc3QgVmVyaWZpY2F0aW9ucyByZWxldmFudCBmb3IgVkYKKyAqIAorICogQGF1dGhvciBtc2hpdHJpdAorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZmVmVyaWZpY2F0b3IgeworCXByaXZhdGUgVmZWZXJpZmljYXRvcigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLyoqCisJICogVmVyaWZpZXMgdGhhdCB0aGUgcmVzb3VyY2UgY29udGFpbnMgYSBjZXJ0YWluIG51bWJlciBvZiBjb21wb25lbnQKKwkgKiBpbnN0YW5jZXMKKwkgKiAKKwkgKiBAcGFyYW0gY3JlYXRlUmVzb3VyY2VJblVJCisJICogQHBhcmFtIG51bU9mVkZDCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU51bU9mQ29tcG9uZW50SW5zdGFuY2VzKFJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUksIGludCBudW1PZlZGQykgeworCQlTdXBwbGllcjxCb29sZWFuPiB2ZXJpZmljYXRvciA9ICgpIC0+IHsKKwkJCVN0cmluZyByZXNwb25zZUFmdGVyRHJhZyA9IFJlc3RDRFV0aWxzLmdldFJlc291cmNlKGNyZWF0ZVJlc291cmNlSW5VSSkuZ2V0UmVzcG9uc2UoKTsKKwkJCUpTT05PYmplY3QganNvblJlc291cmNlID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShyZXNwb25zZUFmdGVyRHJhZyk7CisJCQlpbnQgc2l6ZSA9ICgoSlNPTkFycmF5KSBqc29uUmVzb3VyY2UuZ2V0KCJjb21wb25lbnRJbnN0YW5jZXMiKSkuc2l6ZSgpOworCQkJcmV0dXJuIHNpemUgPT0gbnVtT2ZWRkM7CisJCX07CisJCVZlcmlmaWNhdG9yVXRpbC52ZXJpZnlXaXRoUmV0cnkodmVyaWZpY2F0b3IpOworCX0KKworCS8qKgorCSAqIFZlcmlmaWVzIFRoYXQgdGhlIGNyZWF0ZVJlc291cmNlSW5VSSBpcyBkaWZmZXJlbnQgdGhhdCBwcmV2UklQb3MuCisJICogCisJICogQHBhcmFtIGNyZWF0ZVJlc291cmNlSW5VSQorCSAqIEBwYXJhbSBwcmV2UklQb3MKKwkgKiBAcGFyYW0gdXNlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlSSUxvY2F0aW9uQ2hhbmdlZChSZXNvdXJjZVJlcURldGFpbHMgY3JlYXRlUmVzb3VyY2VJblVJLAorCQkJSW1tdXRhYmxlUGFpcjxTdHJpbmcsIFN0cmluZz4gcHJldlJJUG9zLCBVc2VyIHVzZXIpIHsKKwkJU3VwcGxpZXI8Qm9vbGVhbj4gdmVyaWZpY2F0b3IgPSAoKSAtPiB7CisJCQlJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBjdXJyUklQb3MgPSBSZXNvdXJjZVVJVXRpbHMuZ2V0UklQb3NpdGlvbihjcmVhdGVSZXNvdXJjZUluVUksIHVzZXIpOworCQkJZmluYWwgYm9vbGVhbiBpc1hMb2NhdGlvbkNoYW5nZWQgPSAhcHJldlJJUG9zLmxlZnQuZXF1YWxzKGN1cnJSSVBvcy5sZWZ0KTsKKwkJCWZpbmFsIGJvb2xlYW4gaXNZTG9jYXRpb25DaGFuZ2UgPSAhcHJldlJJUG9zLnJpZ2h0LmVxdWFscyhjdXJyUklQb3MucmlnaHQpOworCQkJcmV0dXJuIGlzWExvY2F0aW9uQ2hhbmdlZCB8fCBpc1lMb2NhdGlvbkNoYW5nZTsKKwkJfTsKKwkJVmVyaWZpY2F0b3JVdGlsLnZlcmlmeVdpdGhSZXRyeSh2ZXJpZmljYXRvcik7CisJfQorCisJLyoqCisJICogVmVyaWZpZXMgVGhhdCByZXNvdXJjZSBjb250YWlucyB0d28gY29ubmVjdGVkIGluc3RhbmNlcworCSAqIAorCSAqIEBwYXJhbSBjcmVhdGVSZXNvdXJjZUluVUkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5TGlua0NyZWF0ZWQoUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlSW5VSSkgeworCQlTdXBwbGllcjxCb29sZWFuPiB2ZXJpZmljYXRvciA9ICgpIC0+IHsKKwkJCVN0cmluZyByZXNwb25zZUFmdGVyRHJhZyA9IFJlc3RDRFV0aWxzLmdldFJlc291cmNlKGNyZWF0ZVJlc291cmNlSW5VSSkuZ2V0UmVzcG9uc2UoKTsKKwkJCUpTT05PYmplY3QganNvblJlc291cmNlID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShyZXNwb25zZUFmdGVyRHJhZyk7CisJCQlyZXR1cm4gKChKU09OQXJyYXkpIGpzb25SZXNvdXJjZS5nZXQoImNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyIpKS5zaXplKCkgPT0gMTsKKwkJfTsKKwkJVmVyaWZpY2F0b3JVdGlsLnZlcmlmeVdpdGhSZXRyeSh2ZXJpZmljYXRvcik7CisKKwl9CisKKwkvKioKKwkgKiBWZXJpZmllcyBUaGF0IHRoZSBWRiBpcyBjZXJ0aWZpZWQgdG8gdmVyc2lvbiAxLjAKKwkgKiAKKwkgKiBAcGFyYW0gdmZUb1ZlcmlmeQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlSZXNvdXJjZUlzQ2VydGlmaWVkKFJlc291cmNlUmVxRGV0YWlscyB2ZlRvVmVyaWZ5KSB7CisJCVJlc3RSZXNwb25zZSBjZXJ0aWZpZWRSZXNvdXJjZVJlc29wbnNlID0gUmVzdENEVXRpbHMKKwkJCQkuZ2V0UmVzb3VyY2VCeU5hbWVBbmRWZXJzaW9uUmV0cnlPbkZhaWwoVXNlclJvbGVFbnVtLkFETUlOLmdldFVzZXJJZCgpLCB2ZlRvVmVyaWZ5LmdldE5hbWUoKSwgIjEuMCIpOworCQlhc3NlcnRUcnVlKGNlcnRpZmllZFJlc291cmNlUmVzb3Buc2UuZ2V0RXJyb3JDb2RlKCkuZXF1YWxzKEh0dHBTdGF0dXMuU0NfT0spKTsKKworCX0KKworCS8qKgorCSAqIFZlcmlmaWVzIFRoYXQgdGhlIFZGIGV4aXN0CisJICogCisJICogQHBhcmFtIHZmVG9WZXJpZnkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5UmVzb3VyY2VJc0NyZWF0ZWQoUmVzb3VyY2VSZXFEZXRhaWxzIHZmVG9WZXJpZnkpIHsKKwkJYXNzZXJ0VHJ1ZShSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZSh2ZlRvVmVyaWZ5KS5nZXRFcnJvckNvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKTsKKwl9CisKKwkvKioKKwkgKiBWZXJpZnkgdGhlIHJlc291cmNlIGNvbnRhaW5zIHRoZSBkZXBsb3ltZW50IGFydGlmYWN0cyBpbiB0aGUgbGlzdAorCSAqIAorCSAqIEBwYXJhbSB2ZlRvVmVyaWZ5CisJICogQHBhcmFtIGFydGlmYWN0VHlwZUVudW1zCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVJlc291cmNlQ29udGFpbnNEZXBsb3ltZW50QXJ0aWZhY3RzKFJlc291cmNlUmVxRGV0YWlscyB2ZlRvVmVyaWZ5LAorCQkJTGlzdDxBcnRpZmFjdFR5cGVFbnVtPiBhcnRpZmFjdFR5cGVFbnVtcykgeworCQlTdHJpbmcgcmVzb3VyY2VTdHJpbmcgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZSh2ZlRvVmVyaWZ5KS5nZXRSZXNwb25zZSgpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc3BvbnNlUGFyc2VyLmNvbnZlcnRSZXNvdXJjZVJlc3BvbnNlVG9KYXZhT2JqZWN0KHJlc291cmNlU3RyaW5nKTsKKwkJTGlzdDxTdHJpbmc+IGZvdW5kQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChyZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkgIT0gbnVsbCkgeworCQkJZm91bmRBcnRpZmFjdHMgPSByZXNvdXJjZS5nZXREZXBsb3ltZW50QXJ0aWZhY3RzKCkudmFsdWVzKCkuc3RyZWFtKCkKKwkJCQkJLm1hcChhcnRpZmFjdCAtPiBhcnRpZmFjdC5nZXRBcnRpZmFjdFR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJfQorCQlMaXN0PFN0cmluZz4gZXhjcGVjdGVkQXJ0aWZhY3RzID0gYXJ0aWZhY3RUeXBlRW51bXMuc3RyZWFtKCkubWFwKGUgLT4gZS5nZXRUeXBlKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCWFzc2VydFRydWUoZm91bmRBcnRpZmFjdHMuY29udGFpbnNBbGwoZXhjcGVjdGVkQXJ0aWZhY3RzKSk7CisKKwl9CisKKwkvKioKKwkgKiBWZXJpZmllcyBUaGUgbGlmZSBjeWNsZSBTdGF0ZSBvZiB0aGUgcmVzb3VyY2UKKwkgKiAKKwkgKiBAcGFyYW0gY3JlYXRlUmVzb3VyY2VJblVJCisJICogQHBhcmFtIHJlcXVlc3RlZExpZmVDeWNsZVN0YXRlCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVN0YXRlKFJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUksIExpZmVjeWNsZVN0YXRlRW51bSByZXF1ZXN0ZWRMaWZlQ3ljbGVTdGF0ZSkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVUlVdGlscy53YWl0Rm9yU3RhdGUoY3JlYXRlUmVzb3VyY2VJblVJLCByZXF1ZXN0ZWRMaWZlQ3ljbGVTdGF0ZSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuZ2V0TGlmZWN5Y2xlU3RhdGUoKSA9PSByZXF1ZXN0ZWRMaWZlQ3ljbGVTdGF0ZSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvQ1AueW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiNTkyMgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvQ1AueW1sCkBAIC0wLDAgKzEsNjUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuQ1A6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBhdHQtdWNwZS1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nICAgICAgICAgICAgICAgIAorICAgICAgdmVuZG9yLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZyAgICAgICAgICAgICAgICAKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nICAgICAgICAgICAgICAgIAorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgdG90YWwtdmNwdToKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgICAgICAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBudW1iZXIgb2YgdkNQVXMKKyAgICAgIHRvdGFsLW1lbW9yeToKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgICAgICAgIAorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIHRvdGFsLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgICAgICAgICAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgYmFzZS1zeXN0ZW0taW1hZ2UtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBsaW51eC1ob3N0LXZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBsaW51eC1ob3N0LW9zLXZlcnNpb246CisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgIGJhc2Utc3lzdGVtLXNvZnR3YXJlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGpkbS12Y3B1OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBqZG0tbWVtb3J5OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamRtLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBqZG0tdmVyc2lvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBqY3AtdmNwdToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgamNwLW1lbW9yeToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIGpjcC1kaXNrOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamNwLXZlcnNpb246CisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICBjYXBhYmlsaXRpZXM6IAorICAgICAgdm5mX2hvc3Rpbmc6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIGRlc2NyaXB0aW9uOiBQcm92aWRlcyBob3N0aW5nIGNhcGFiaWxpdHkgZm9yIFZORnMgICAKKyAgICAgIFdBTl9jb25uZWN0aXZpdHk6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAuY3AuV2FuXQorICAgICAgICBkZXNjcmlwdGlvbjogZXh0ZXJuYWwgV0FOMSBuL3cgaW50ZXJmYWNlCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSwyXQorICAgICAgTEFOX2Nvbm5lY3Rpdml0eToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5jcC5MYW5dCisgICAgICAgIGRlc2NyaXB0aW9uOiBleHRlcm5hbCBMQU4gbi93IGludGVyZmFjZQorICAgICAgICBvY2N1cnJlbmNlczogWzEsOF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQX0xBTiAtIENvcHkueW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9MQU4gLSBDb3B5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRkNjFmMmMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQX0xBTiAtIENvcHkueW1sCkBAIC0wLDAgKzEsMTMgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmZjLnVDUEU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHR5cGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIHZpcnR1YWxMaW5rOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuTGlua3NUbwpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9MQU4ueW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9MQU4ueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjA4NGIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQX0xBTi55bWwKQEAgLTAsMCArMSwxOSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5MQU46CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLkNQCisgICAgcHJvcGVydGllczoKKyAgICAgIHR5cGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIHZpcnR1YWxMaW5rX2luOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuTGlua3NUbworICAgICAgLSB2aXJ0dWFsTGlua19vdXQ6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5MaW5rc1RvCisgICAgICAtIHZpcnR1YWxiaW5kaW5nOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuQmluZHNUbyAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQX1dBTi55bWwgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQX1dBTi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjZTQ1NwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvQ1BfV0FOLnltbApAQCAtMCwwICsxLDE5IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLldBTjoKKyAgICBkZXJpdmVkX2Zyb206IG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuQ1AKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdHlwZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gdmlydHVhbExpbmtfaW46CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5MaW5rc1RvCisgICAgICAtIHZpcnR1YWxMaW5rX291dDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkxpbmtzVG8KKyAgICAgIC0gdmlydHVhbGJpbmRpbmc6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5CaW5kc1RvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUgMS55YW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUgMS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzIwNzgKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0hlYXQtRmlsZSAxLnlhbWwKQEAgLTAsMCArMSw3OTEgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMjoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMzoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlNDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKworICB2bmZfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIG5hbWUgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aGVfU0NQX25hbWUKKyAgdm5mX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgSUQgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aHNfU0NQX2lkCisKKyAgZmxhdm9yX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGltYWdlX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9iZQorICBpbWFnZV9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZmUgICAgCisgIGltYWdlX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9zbXAKKyAgaW1hZ2VfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZGIKKworICBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMiBGRSBDbHVzdGVyL0tBCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMiBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMyBDbHVzdGVyCisgIGludF92c2NwX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMyBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFONCBEQgorICBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazQgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQQorICBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9CCisgIENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgQ1JJQ0tFVF9PQ1MKKyAgT0FNX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgT0FNCisgIGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTJfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTNfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTRfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGRiMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBkYjEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHZtX3NjcF9iZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNICAgIAorICB2bV9zY3BfYmUyX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTIKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUzX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTMKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmU0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTQKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorICBiZTBfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMjoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUyIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUyX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTJfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTJfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUyX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTM6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMyB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlM19wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlM19wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmU0OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTQgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTRfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTRfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8wIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMF9wb3J0XzA6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8xIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMV9wb3J0XzE6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUxX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMV9PQU1fZGlyZWN0X2lwc319XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSGVhdC1GaWxlIDIueWFtbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSGVhdC1GaWxlIDIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzMyMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUgMi55YW1sCkBAIC0wLDAgKzEsNzkxIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTI6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTM6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTQ6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisKKyAgdm5mX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhlX1NDUF9uYW1lCisgIHZuZl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIElEIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhzX1NDUF9pZAorCisgIGZsYXZvcl9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBpbWFnZV9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfYmUKKyAgaW1hZ2Vfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2ZlICAgIAorICBpbWFnZV9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2Vfc21wCisgIGltYWdlX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2RiCisKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjIgRkUgQ2x1c3Rlci9LQQorICBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazIgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjMgQ2x1c3RlcgorICBpbnRfdnNjcF9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazMgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjQgREIKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcms0IEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0EKKyAgU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQgorICBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIENSSUNLRVRfT0NTCisgIE9BTV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIE9BTQorICBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBkYjAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZGIxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICB2bV9zY3BfYmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTSAgICAKKyAgdm1fc2NwX2JlMl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUyCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlM19uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUzCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlNF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkU0CisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKyAgYmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTFfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTI6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMiB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMl9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMl9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUzOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTMgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTNfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTNfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlNDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmU0IH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmU0X3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTRfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTRfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmU0X3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTBfcG9ydF8wOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwc319XQorCisgIGZlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTFfcG9ydF8xOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwc319XQorCisgIGZlMV9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjFfT0FNX2RpcmVjdF9pcHN9fV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0hlYXQtRmlsZS55YW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzMyMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUueWFtbApAQCAtMCwwICsxLDc5MSBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3RoZV9TQ1BfbmFtZQorICB2bmZfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBJRCBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3Roc19TQ1BfaWQKKworICBmbGF2b3Jfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3JfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgaW1hZ2Vfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2JlCisgIGltYWdlX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9mZSAgICAKKyAgaW1hZ2Vfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX3NtcAorICBpbWFnZV9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9kYgorCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4yIEZFIENsdXN0ZXIvS0EKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmsyIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4zIENsdXN0ZXIKKyAgaW50X3ZzY3BfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmszIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU40IERCCisgIGludF92c2NwX2RiX25ldHdvcmtfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrNCBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9BCisgIFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0IKKyAgQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBDUklDS0VUX09DUworICBPQU1fZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBPQU0KKyAgYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlM19PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZGIwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGRiMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgdm1fc2NwX2JlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0gICAgCisgIHZtX3NjcF9iZTJfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMgorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTNfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMworICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFNAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKworcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisgIGJlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTBfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUyOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTIgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTJfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTJfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMzoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUzIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUzX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTNfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTNfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUzX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTQ6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlNCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlNF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlNF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzAgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUwX3BvcnRfMDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHN9fV0KKworICBmZTBfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzEgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUxX3BvcnRfMToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHN9fV0KKworICBmZTFfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIxX09BTV9kaXJlY3RfaXBzfX1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9JblZhbGlkX3Rvc2NhX0ZpbGUgLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSW5WYWxpZF90b3NjYV9GaWxlIC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYTBhMQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSW5WYWxpZF90b3NjYV9GaWxlIC55bWwKQEAgLTAsMCArMSwzNCBAQAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSkRNX3ZmLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSkRNX3ZmLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTdlZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9KRE1fdmYueW1sCkBAIC0wLDAgKzEsNTcgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmYuSkRNOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIGF0dC1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbC1kZXNjcmlwdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2Y3B1LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyICAgICAgICAKKyAgICAgIHZtZW1vcnktdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2bWVtb3J5LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdmRpc2stbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZuZi10eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBzb2Z0d2FyZS1maWxlLW5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZuZi1mZWF0dXJlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gaG9zdDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0pETV92ZmMueW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9KRE1fdmZjLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWM5Y2EwCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9KRE1fdmZjLnltbApAQCAtMCwwICsxLDU3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy5KRE06IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6IAorICAgICAgYXR0LXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWw6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsLWRlc2NyaXB0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZjcHUtZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgIAorICAgICAgdm1lbW9yeS11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZtZW1vcnktbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2ZGlzay1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm5mLXR5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNvZnR3YXJlLXZlcnNpb246IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNvZnR3YXJlLXZlcnNpb24tc3RhdGU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHNvZnR3YXJlLWZpbGUtbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdm5mLWZlYXR1cmU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBob3N0OgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvU2FtcGxlX0NTQVIuY3NhciBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvU2FtcGxlX0NTQVIuY3NhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk1ZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9TYW1wbGVfQ1NBUi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvU2FtcGxlX0NTQVIyLmNzYXIgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1NhbXBsZV9DU0FSMi5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDFmZTgKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1NhbXBsZV9DU0FSMi5jc2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVUNQRV9WRkMueW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9VQ1BFX1ZGQy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzOTY2YgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVUNQRV9WRkMueW1sCkBAIC0wLDAgKzEsNjUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmZjLnVDUEU6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBhdHQtdWNwZS1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nICAgICAgICAgICAgICAgIAorICAgICAgdmVuZG9yLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZyAgICAgICAgICAgICAgICAKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nICAgICAgICAgICAgICAgIAorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgdG90YWwtdmNwdToKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgICAgICAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBudW1iZXIgb2YgdkNQVXMKKyAgICAgIHRvdGFsLW1lbW9yeToKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgICAgICAgIAorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIHRvdGFsLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgICAgICAgICAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgYmFzZS1zeXN0ZW0taW1hZ2UtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBsaW51eC1ob3N0LXZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBsaW51eC1ob3N0LW9zLXZlcnNpb246CisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgIGJhc2Utc3lzdGVtLXNvZnR3YXJlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGpkbS12Y3B1OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBqZG0tbWVtb3J5OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamRtLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBqZG0tdmVyc2lvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBqY3AtdmNwdToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgamNwLW1lbW9yeToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIGpjcC1kaXNrOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamNwLXZlcnNpb246CisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICBjYXBhYmlsaXRpZXM6IAorICAgICAgdm5mX2hvc3Rpbmc6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIGRlc2NyaXB0aW9uOiBQcm92aWRlcyBob3N0aW5nIGNhcGFiaWxpdHkgZm9yIFZORnMgICAKKyAgICAgIFdBTl9jb25uZWN0aXZpdHk6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAuY3AuV2FuXQorICAgICAgICBkZXNjcmlwdGlvbjogZXh0ZXJuYWwgV0FOMSBuL3cgaW50ZXJmYWNlCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSwyXQorICAgICAgTEFOX2Nvbm5lY3Rpdml0eToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5jcC5MYW5dCisgICAgICAgIGRlc2NyaXB0aW9uOiBleHRlcm5hbCBMQU4gbi93IGludGVyZmFjZQorICAgICAgICBvY2N1cnJlbmNlczogWzEsOF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVkYueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDg5OTAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGLnltbApAQCAtMCwwICsxLDE3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmLlZGRjoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgdmVuZG9yOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgICB2bF9uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgIHZpcnR1YWxfbGlua2FibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisJCQorCQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGQy55bWwgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGQy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzZWQzNQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVkZDLnltbApAQCAtMCwwICsxLDc3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy52Um91dGVyOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIGF0dC1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbC1kZXNjcmlwdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2Y3B1LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyICAgICAgICAKKyAgICAgIHZtZW1vcnktdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2bWVtb3J5LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdmRpc2stbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZuZi10eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBzb2Z0d2FyZS1maWxlLW5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZuZi1mZWF0dXJlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBtYW5hZ2VtZW50LXY2LWFkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm0tbGFuLXY2LWFkZHJlc3M6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5tLWxhbi12Ni1wcmVmaXgtbGVuZ3RoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG1hbmFnZW1lbnQtdjQtYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBubS1sYW4tdjQtYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBubS1sYW4tdjQtcHJlZml4LWxlbmd0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICByb3V0aW5nLWluc3RhbmNlLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcm91dGluZy1pbnN0YW5jZXM6ICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0eXBlOiBtYXAKKyAgICAgIGVudHJ5X3NjaGVtYTogICAgICAgICAgICAgICAgICAgCisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHJlcXVpcmVtZW50czogCisgICAgICAtIGhvc3Q6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSxVTkJPVU5ERURdCisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGQ1dpdGhBdHRyaWJ1dGVzLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVkZDV2l0aEF0dHJpYnV0ZXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzM2ZkMDIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGQ1dpdGhBdHRyaWJ1dGVzLnltbApAQCAtMCwwICsxLDQzIEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy5WRkM6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBqY3AtbWVtb3J5OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamNwLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBqY3AtdmVyc2lvbjoKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgIGF0dHJpYnV0ZXM6CisgICAgICBteV9hdHRyOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgY2FwYWJpbGl0aWVzOiAKKyAgICAgIHZuZl9ob3N0aW5nOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICBkZXNjcmlwdGlvbjogUHJvdmlkZXMgaG9zdGluZyBjYXBhYmlsaXR5IGZvciBWTkZzICAgCisgICAgICBXQU5fY29ubmVjdGl2aXR5OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLmNwLldhbl0KKyAgICAgICAgZGVzY3JpcHRpb246IGV4dGVybmFsIFdBTjEgbi93IGludGVyZmFjZQorICAgICAgICBvY2N1cnJlbmNlczogWzEsMl0KKyAgICAgIExBTl9jb25uZWN0aXZpdHk6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAuY3AuTGFuXQorICAgICAgICBkZXNjcmlwdGlvbjogZXh0ZXJuYWwgTEFOIG4vdyBpbnRlcmZhY2UKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLDhdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WTC55bWwgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZMLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGEyNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WTC55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5WTDF3ZTIzOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6CisgICAgICB2ZW5kb3I6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICAgIHZsX25hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICAgdmlydHVhbF9saW5rYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKKwkJCisJCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWQgeG1sLnhtbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWQgeG1sLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDY3ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WYWxpZCB4bWwueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8ZGlycz4KKzxlbnRyeSBsb2M9IkM6XFByb2dyYW0gRmlsZXNcSmF2YVxqZGsxLjcuMF83OSIgc3RhbXA9IjE0NDkwNzY2MTg1MTgiLz4KKzwvZGlycz4KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWRfdG9zY2FfTXljb21wdXRlLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWRfdG9zY2FfTXljb21wdXRlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmFjNWUxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WYWxpZF90b3NjYV9NeWNvbXB1dGUueW1sCkBAIC0wLDAgKzEsMzUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi5EYXRhYmFzZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZhbGlkX3Rvc2NhX1JlcGxhY2VUZXN0LnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWRfdG9zY2FfUmVwbGFjZVRlc3QueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZTc3MWQKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZhbGlkX3Rvc2NhX1JlcGxhY2VUZXN0LnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuVkYuTXlDb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIGF0dHJpYnV0ZXM6CisgICAgICBwcml2YXRlX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcHVibGljX2FkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbmV0d29ya3M6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuTmV0d29ya0luZm8KKyAgICAgIHBvcnRzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLlBvcnRJbmZvCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSBsb2NhbF9zdG9yYWdlOiAKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQXR0YWNobWVudAorICAgICAgICAgIG5vZGU6IHRvc2NhLm5vZGVzLkJsb2NrU3RvcmFnZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5BdHRhY2hlc1RvCisgICAgICAgICAgb2NjdXJyZW5jZXM6IFswLCBVTkJPVU5ERURdICAKKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBob3N0OiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFt0b3NjYS5ub2Rlcy5Tb2Z0d2FyZUNvbXBvbmVudF0gCisgICAgICBlbmRwb2ludCA6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5FbmRwb2ludC5BZG1pbiAKKyAgICAgIG9zOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLk9wZXJhdGluZ1N5c3RlbQorICAgICAgc2NhbGFibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5TY2FsYWJsZQorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvaG90LW5pbWJ1cy1vYW0tdm9sdW1lc192MC4zLmVudiBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvaG90LW5pbWJ1cy1vYW0tdm9sdW1lc192MC4zLmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDk0ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLW9hbS12b2x1bWVzX3YwLjMuZW52CkBAIC0wLDAgKzEsNiBAQAorcGFyYW1ldGVyczoKKyAgcGNyZl9vYW1fdm9sX3NpemU6IDUwMAorICBwY3JmX29hbV92b2x1bWVfc2lsdmVyLTE6IFNpbHZlcgorICBwY3JmX29hbV92b2x1bWVfc2lsdmVyLTI6IFNpbHZlcgorICBwY3JmX29hbV92b2xfbmFtZV8xOiBzZGUxLXBjcmZ4MDEtb2FtMDAxLXZvbC0xCisgIHBjcmZfb2FtX3ZvbF9uYW1lXzI6IHNkZTEtcGNyZngwMS1vYW0wMDEtdm9sLTIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtb2FtX3YwLjYuZW52IGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLW9hbV92MC42LmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLW9hbV92MC42LmVudgpAQCAtMCwwICsxLDE4IEBACitwYXJhbWV0ZXJzOgorICBwY3JmX29hbV9zZXJ2ZXJfbmFtZXM6IFpSRE0xUENSRjAxT0FNMDAxLFpSRE0xUENSRjAxT0FNMDAyCisgIHBjcmZfb2FtX2ltYWdlX25hbWU6IFBDUkZfOC45OTUtQVRUTTEuMC4zLnFjb3cyCisgIHBjcmZfb2FtX2ZsYXZvcl9uYW1lOiBsYy40eGxhcmdlNAorICBhdmFpbGFiaWxpdHl6b25lX25hbWU6IG5vdmEKKyAgcGNyZl9jcHNfbmV0X25hbWU6IGludF9wY3JmX25ldF8wCisgIHBjcmZfY3BzX25ldF9pcHM6IDE3Mi4yNi4xNi4xMTEsMTcyLjI2LjE2LjExMgorICBwY3JmX2FyYml0ZXJfdmlwOiAxNzIuMjYuMTYuMTE1CisgIHBjcmZfY3BzX25ldF9tYXNrOiAyNTUuMjU1LjI1NS4wCisgIHBjcmZfb2FtX25ldF9uYW1lOiBvYW1fcHJvdGVjdGVkX25ldF8wCisgIHBjcmZfb2FtX25ldF9pcHM6IDEwNy4yMzkuNjQuMTE3LDEwNy4yMzkuNjQuMTE4CisgIHBjcmZfb2FtX25ldF9ndzogMTA3LjIzOS42NC4xCisgIHBjcmZfb2FtX25ldF9tYXNrOiAyNTUuMjU1LjI0OC4wCisgIHBjcmZfb2FtX3ZvbHVtZV9pZF8xOiBhNGFhMDVmYi1mY2RjLTQ1N2ItODA3Ny02ODQ1ZmRmYzMyNTcKKyAgcGNyZl9vYW1fdm9sdW1lX2lkXzI6IDkzZDhmYzFmLWYxYzMtNDkzMy04NmIyLTAzOTg4MWVlOTEwZgorICBwY3JmX3NlY3VyaXR5X2dyb3VwX25hbWU6IG5pbWJ1c19zZWN1cml0eV9ncm91cAorICBwY3JmX3ZuZl9pZDogNzMwNzk3MjM0YjRhNDBhYTk5MzM1MTU3YjAyODcxY2QKKwpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLW9hbV92MC42LnlhbWwgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtb2FtX3YwLjYueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjM2ZWJhCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLW9hbV92MC42LnlhbWwKQEAgLTAsMCArMSwxMDggQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworCitkZXNjcmlwdGlvbjogaGVhdCB0ZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgbXVsdGlwbGUgUENSRiBPQU0gbm9kZXMgc3RhY2sKKworcGFyYW1ldGVyczoKKyAgcGNyZl9vYW1fc2VydmVyX25hbWVzOgorICAgIHR5cGU6IGNvbW1hX2RlbGltaXRlZF9saXN0CisgICAgbGFiZWw6IFBDUkYgT0FNIHNlcnZlciBuYW1lcworICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIHRoZSBQQ1JGIE9BTSBpbnN0YW5jZQorICBwY3JmX29hbV9pbWFnZV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBQQ1JGIE9BTSBpbWFnZSBuYW1lCisgICAgZGVzY3JpcHRpb246IFBDUkYgT0FNIGltYWdlIG5hbWUKKyAgcGNyZl9vYW1fZmxhdm9yX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IFBDUkYgT0FNIGZsYXZvciBuYW1lCisgICAgZGVzY3JpcHRpb246IGZsYXZvciBuYW1lIG9mIFBDUkYgT0FNIGluc3RhbmNlCisgIGF2YWlsYWJpbGl0eXpvbmVfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYXZhaWxhYmlsaXR5em9uZSBuYW1lCisgICAgZGVzY3JpcHRpb246IGF2YWlsYWJpbGl0eXpvbmUgbmFtZQorICBwY3JmX2Nwc19uZXRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogQ1BTIG5ldHdvcmsgbmFtZQorICAgIGRlc2NyaXB0aW9uOiBDUFMgbmV0d29yayBuYW1lCisgIHBjcmZfY3BzX25ldF9pcHM6CisgICAgdHlwZTogY29tbWFfZGVsaW1pdGVkX2xpc3QKKyAgICBsYWJlbDogQ1BTIG5ldHdvcmsgaXBzCisgICAgZGVzY3JpcHRpb246IENQUyBuZXR3b3JrIGlwcworICBwY3JmX2Nwc19uZXRfbWFzazoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogQ1BTIG5ldHdvcmsgbWFzaworICAgIGRlc2NyaXB0aW9uOiBDUFMgbmV0d29yayBtYXNrCisgIHBjcmZfYXJiaXRlcl92aXA6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IE9BTSBBcmJpdGVyIExCIFZJUAorICAgIGRlc2NyaXB0aW9uOiBPQU0gQXJiaXRlciBMQiBWSVAKKyAgcGNyZl9vYW1fbmV0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IE9BTSBuZXR3b3JrIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogT0FNIG5ldHdvcmsgbmFtZQorICBwY3JmX29hbV9uZXRfaXBzOgorICAgIHR5cGU6IGNvbW1hX2RlbGltaXRlZF9saXN0CisgICAgbGFiZWw6IE9BTSBuZXR3b3JrIGlwcworICAgIGRlc2NyaXB0aW9uOiBPQU0gbmV0d29yayBpcHMKKyAgcGNyZl9vYW1fbmV0X2d3OgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgbmV0d29yayBnYXRld2F5CisgICAgZGVzY3JpcHRpb246IENQUyBuZXR3b3JrIGdhdGV3YXkKKyAgcGNyZl9vYW1fbmV0X21hc2s6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IENQUyBuZXR3b3JrIG1hc2sKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgbWFzaworICBwY3JmX29hbV92b2x1bWVfaWRfMToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogQ1BTIE9BTSAwMDEgQ2luZGVyIFZvbHVtZQorICAgIGRlc2NyaXB0aW9uOiBDUFMgT0FNIDAwMSBDaW5kZXIgVm9sdW1lcworICBwY3JmX29hbV92b2x1bWVfaWRfMjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogQ1BTIE9BTSAwMDIgQ2luZGVyIFZvbHVtZQorICAgIGRlc2NyaXB0aW9uOiBDUFMgT0FNIDAwMiBDaW5kZXIgVm9sdW1lcworICBwY3JmX3NlY3VyaXR5X2dyb3VwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNlY3VyaXR5IGdyb3VwIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogdGhlIG5hbWUgb2Ygc2VjdXJpdHkgZ3JvdXAKKyAgcGNyZl92bmZfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IFBDUkYgVk5GIElkCisgICAgZGVzY3JpcHRpb246IFBDUkYgVk5GIElkCisKK3Jlc291cmNlczoKKyAgc2VydmVyX3BjcmZfb2FtXzAwMToKKyAgICB0eXBlOiBuZXN0ZWQtb2FtX3YwLjIueWFtbAorICAgIHByb3BlcnRpZXM6CisgICAgICBwY3JmX29hbV9zZXJ2ZXJfbmFtZTogeyBnZXRfcGFyYW06IFtwY3JmX29hbV9zZXJ2ZXJfbmFtZXMsIDBdIH0KKyAgICAgIHBjcmZfb2FtX2ltYWdlX25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9pbWFnZV9uYW1lIH0KKyAgICAgIHBjcmZfb2FtX2ZsYXZvcl9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9vYW1fZmxhdm9yX25hbWUgfQorICAgICAgYXZhaWxhYmlsaXR5em9uZV9uYW1lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5em9uZV9uYW1lIH0KKyAgICAgIHBjcmZfc2VjdXJpdHlfZ3JvdXBfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfc2VjdXJpdHlfZ3JvdXBfbmFtZSB9CisgICAgICBwY3JmX29hbV92b2x1bWVfaWQ6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV92b2x1bWVfaWRfMSB9CisgICAgICBwY3JmX2Nwc19uZXRfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfY3BzX25ldF9uYW1lIH0KKyAgICAgIHBjcmZfY3BzX25ldF9pcDogeyBnZXRfcGFyYW06IFtwY3JmX2Nwc19uZXRfaXBzLCAwXSB9CisgICAgICBwY3JmX2Nwc19uZXRfbWFzazogeyBnZXRfcGFyYW06IHBjcmZfY3BzX25ldF9tYXNrIH0KKyAgICAgIHBjcmZfb2FtX25ldF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9vYW1fbmV0X25hbWUgfQorICAgICAgcGNyZl9vYW1fbmV0X2lwOiB7IGdldF9wYXJhbTogW3BjcmZfb2FtX25ldF9pcHMsIDBdIH0KKyAgICAgIHBjcmZfb2FtX25ldF9tYXNrOiB7IGdldF9wYXJhbTogcGNyZl9vYW1fbmV0X21hc2sgfQorICAgICAgcGNyZl9vYW1fbmV0X2d3OiB7IGdldF9wYXJhbTogcGNyZl9vYW1fbmV0X2d3IH0KKyAgICAgIHBjcmZfYXJiaXRlcl92aXA6IHsgZ2V0X3BhcmFtOiBwY3JmX2FyYml0ZXJfdmlwIH0KKyAgICAgIHBjcmZfdm5mX2lkOiB7Z2V0X3BhcmFtOiBwY3JmX3ZuZl9pZH0KKworICBzZXJ2ZXJfcGNyZl9vYW1fMDAyOgorICAgIHR5cGU6IG5lc3RlZC1vYW1fdjAuMi55YW1sCisgICAgcHJvcGVydGllczoKKyAgICAgIHBjcmZfb2FtX3NlcnZlcl9uYW1lOiB7IGdldF9wYXJhbTogW3BjcmZfb2FtX3NlcnZlcl9uYW1lcywgMV0gfQorICAgICAgcGNyZl9vYW1faW1hZ2VfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfb2FtX2ltYWdlX25hbWUgfQorICAgICAgcGNyZl9vYW1fZmxhdm9yX25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9mbGF2b3JfbmFtZSB9CisgICAgICBhdmFpbGFiaWxpdHl6b25lX25hbWU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHl6b25lX25hbWUgfQorICAgICAgcGNyZl9zZWN1cml0eV9ncm91cF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9zZWN1cml0eV9ncm91cF9uYW1lIH0KKyAgICAgIHBjcmZfb2FtX3ZvbHVtZV9pZDogeyBnZXRfcGFyYW06IHBjcmZfb2FtX3ZvbHVtZV9pZF8yIH0KKyAgICAgIHBjcmZfY3BzX25ldF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9jcHNfbmV0X25hbWUgfQorICAgICAgcGNyZl9jcHNfbmV0X2lwOiB7IGdldF9wYXJhbTogW3BjcmZfY3BzX25ldF9pcHMsIDFdIH0KKyAgICAgIHBjcmZfY3BzX25ldF9tYXNrOiB7IGdldF9wYXJhbTogcGNyZl9jcHNfbmV0X21hc2sgfQorICAgICAgcGNyZl9vYW1fbmV0X25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfbmFtZSB9CisgICAgICBwY3JmX29hbV9uZXRfaXA6IHsgZ2V0X3BhcmFtOiBbcGNyZl9vYW1fbmV0X2lwcywgMV0gfQorICAgICAgcGNyZl9vYW1fbmV0X21hc2s6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfbWFzayB9CisgICAgICBwY3JmX29hbV9uZXRfZ3c6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfZ3cgfQorICAgICAgcGNyZl9hcmJpdGVyX3ZpcDogeyBnZXRfcGFyYW06IHBjcmZfYXJiaXRlcl92aXAgfQorICAgICAgcGNyZl92bmZfaWQ6IHtnZXRfcGFyYW06IHBjcmZfdm5mX2lkfQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLXBjbV92MC42LnlhbWwgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtcGNtX3YwLjYueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQxMDQxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLXBjbV92MC42LnlhbWwKQEAgLTAsMCArMSw4MCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisKK2Rlc2NyaXB0aW9uOiBoZWF0IHRlbXBsYXRlIHRoYXQgY3JlYXRlcyBQQ1JGIENsdW1hbiBzdGFjaworCitwYXJhbWV0ZXJzOgorICBwY3JmX3BjbV9zZXJ2ZXJfbmFtZXM6CisgICAgdHlwZTogY29tbWFfZGVsaW1pdGVkX2xpc3QKKyAgICBsYWJlbDogUENSRiBDTSBzZXJ2ZXIgbmFtZXMKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiB0aGUgUENSRiBDTSBpbnN0YW5jZQorICBwY3JmX3BjbV9pbWFnZV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBQQ1JGIENNIGltYWdlIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogUENSRiBDTSBpbWFnZSBuYW1lCisgIHBjcmZfcGNtX2ZsYXZvcl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBQQ1JGIENNIGZsYXZvciBuYW1lCisgICAgZGVzY3JpcHRpb246IGZsYXZvciBuYW1lIG9mIFBDUkYgQ00gaW5zdGFuY2UKKyAgYXZhaWxhYmlsaXR5em9uZV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBhdmFpbGFiaWxpdHl6b25lIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogYXZhaWxhYmlsaXR5em9uZSBuYW1lCisgIHBjcmZfY3BzX25ldF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgbmV0d29yayBuYW1lCisgICAgZGVzY3JpcHRpb246IENQUyBuZXR3b3JrIG5hbWUKKyAgcGNyZl9jcHNfbmV0X2lwczoKKyAgICB0eXBlOiBjb21tYV9kZWxpbWl0ZWRfbGlzdAorICAgIGxhYmVsOiBDUFMgbmV0d29yayBpcHMKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgaXBzCisgIHBjcmZfY3BzX25ldF9tYXNrOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgbmV0d29yayBtYXNrCisgICAgZGVzY3JpcHRpb246IENQUyBuZXR3b3JrIG1hc2sKKyAgcGNyZl9vYW1fbmV0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IE9BTSBuZXR3b3JrIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogT0FNIG5ldHdvcmsgbmFtZQorICBwY3JmX29hbV9uZXRfaXBzOgorICAgIHR5cGU6IGNvbW1hX2RlbGltaXRlZF9saXN0CisgICAgbGFiZWw6IE9BTSBuZXR3b3JrIGlwcworICAgIGRlc2NyaXB0aW9uOiBPQU0gbmV0d29yayBpcHMKKyAgcGNyZl9vYW1fbmV0X2d3OgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgbmV0d29yayBnYXRld2F5CisgICAgZGVzY3JpcHRpb246IENQUyBuZXR3b3JrIGdhdGV3YXkKKyAgcGNyZl9vYW1fbmV0X21hc2s6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IENQUyBuZXR3b3JrIG1hc2sKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgbWFzaworICBwY3JmX3BjbV92b2x1bWVfaWRfMToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogQ1BTIENsdW1hbiBDaW5kZXIgVm9sdW1lCisgICAgZGVzY3JpcHRpb246IENQUyBDbHVtYW4gQ2luZGVyIFZvbHVtZQorICBwY3JmX3NlY3VyaXR5X2dyb3VwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNlY3VyaXR5IGdyb3VwIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogdGhlIG5hbWUgb2Ygc2VjdXJpdHkgZ3JvdXAKKyAgcGNyZl92bmZfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IFBDUkYgVk5GIElkCisgICAgZGVzY3JpcHRpb246IFBDUkYgVk5GIElkCisKK3Jlc291cmNlczoKKyAgc2VydmVyX3BjcmZfcGNtXzAwMToKKyAgICB0eXBlOiBuZXN0ZWQtcGNtX3YwLjIueWFtbAorICAgIHByb3BlcnRpZXM6CisgICAgICBwY3JmX3BjbV9zZXJ2ZXJfbmFtZTogeyBnZXRfcGFyYW06IFtwY3JmX3BjbV9zZXJ2ZXJfbmFtZXMsIDBdIH0KKyAgICAgIHBjcmZfcGNtX2ltYWdlX25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX3BjbV9pbWFnZV9uYW1lIH0KKyAgICAgIHBjcmZfcGNtX2ZsYXZvcl9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9wY21fZmxhdm9yX25hbWUgfQorICAgICAgYXZhaWxhYmlsaXR5em9uZV9uYW1lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5em9uZV9uYW1lIH0KKyAgICAgIHBjcmZfc2VjdXJpdHlfZ3JvdXBfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfc2VjdXJpdHlfZ3JvdXBfbmFtZSB9CisgICAgICBwY3JmX3BjbV92b2x1bWVfaWQ6IHsgZ2V0X3BhcmFtOiBwY3JmX3BjbV92b2x1bWVfaWRfMSB9CisgICAgICBwY3JmX2Nwc19uZXRfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfY3BzX25ldF9uYW1lIH0KKyAgICAgIHBjcmZfY3BzX25ldF9pcDogeyBnZXRfcGFyYW06IFtwY3JmX2Nwc19uZXRfaXBzLCAwXSB9CisgICAgICBwY3JmX2Nwc19uZXRfbWFzazogeyBnZXRfcGFyYW06IHBjcmZfY3BzX25ldF9tYXNrIH0KKyAgICAgIHBjcmZfb2FtX25ldF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9vYW1fbmV0X25hbWUgfQorICAgICAgcGNyZl9vYW1fbmV0X2lwOiB7IGdldF9wYXJhbTogW3BjcmZfb2FtX25ldF9pcHMsIDBdIH0KKyAgICAgIHBjcmZfb2FtX25ldF9tYXNrOiB7IGdldF9wYXJhbTogcGNyZl9vYW1fbmV0X21hc2sgfQorICAgICAgcGNyZl9vYW1fbmV0X2d3OiB7IGdldF9wYXJhbTogcGNyZl9vYW1fbmV0X2d3IH0KKyAgICAgIHBjcmZfdm5mX2lkOiB7Z2V0X3BhcmFtOiBwY3JmX3ZuZl9pZH0KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvbXlZYW5nLnhtbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvbXlZYW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg2ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9teVlhbmcueG1sCkBAIC0wLDAgKzEsOCBAQAorPGJlYW5zIHhtbG5zPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zCisJaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucy9zcHJpbmctYmVhbnMtMi41LnhzZCI+CisKKwk8YmVhbiBpZD0ibXVyYW5vTG9naWMiIGNsYXNzPSJvcmcub3BlbmVjb21wLnNkYy5pbXBsLk11cmFub0xvZ2ljIj4gPC9iZWFuPgorCis8L2JlYW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvbXljb21wdXRlLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvbXljb21wdXRlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGEwYzAzCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9teWNvbXB1dGUueW1sCkBAIC0wLDAgKzEsMTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCitub2RlX3R5cGVzOiAKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMubXljb21wdXRlOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuQ29tcHV0ZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUgCisgICAgICAgIHByb3BlcnRpZXM6CisgICAgICAgICAgcHJvcGVydHlGb3JUZXN0OgorICAgICAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGVzdAorICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgICAgICAgIGRlZmF1bHQ6IHN1Y2Nlc3MKKyAgICAgICAgICAjIG1pbl9pbnN0YW5jZXMgcHJvcGVydHkgc2hvdWxkIG92ZXJyaWRlIHByb3BlcnR5IGZyb20gdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlIAorICAgICAgICAgIG1pbl9pbnN0YW5jZXM6IAorICAgICAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICAgICAgZGVmYXVsdDogMworCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3NlcnZpY2Vfd2l0aF9pbnB1dHMuY3NhciBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvc2VydmljZV93aXRoX2lucHV0cy5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDQ4ODEKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3NlcnZpY2Vfd2l0aF9pbnB1dHMuY3NhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZBRFRSQU4uemlwIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92QURUUkFOLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWNkZTJjCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92QURUUkFOLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZDRE4uemlwIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92Q0ROLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWU2NTRhCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92Q0ROLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZGV19WRi55bWwgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZGV19WRi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwODgzZQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdkZXX1ZGLnltbApAQCAtMCwwICsxLDU4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmYudkZXOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIGF0dC1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbC1kZXNjcmlwdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2Y3B1LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyICAgICAgICAKKyAgICAgIHZtZW1vcnktdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2bWVtb3J5LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdmRpc2stbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZuZi10eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uOiAKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgc29mdHdhcmUtdmVyc2lvbi1zdGF0ZToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgc29mdHdhcmUtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bmYtZmVhdHVyZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHJlcXVpcmVtZW50czogCisgICAgICAtIGhvc3Q6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92RldfVkZDLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdkZXX1ZGQy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4MTRjNAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdkZXX1ZGQy55bWwKQEAgLTAsMCArMSw1OCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKworICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy52Rlc6IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6IAorICAgICAgYXR0LXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWw6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsLWRlc2NyaXB0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZjcHUtZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgIAorICAgICAgdm1lbW9yeS11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZtZW1vcnktbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2ZGlzay1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm5mLXR5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNvZnR3YXJlLXZlcnNpb246IAorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBzb2Z0d2FyZS1maWxlLW5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZuZi1mZWF0dXJlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gaG9zdDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZSb3V0ZXJfdmZjLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdlJvdXRlcl92ZmMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmZlOTUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZSb3V0ZXJfdmZjLnltbApAQCAtMCwwICsxLDc4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmZjLnZSb3V0ZXI6IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6IAorICAgICAgYXR0LXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWw6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsLWRlc2NyaXB0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZjcHUtZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgIAorICAgICAgdm1lbW9yeS11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZtZW1vcnktbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2ZGlzay1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm5mLXR5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNvZnR3YXJlLXZlcnNpb246IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNvZnR3YXJlLXZlcnNpb24tc3RhdGU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHNvZnR3YXJlLWZpbGUtbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdm5mLWZlYXR1cmU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG1hbmFnZW1lbnQtdjYtYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBubS1sYW4tdjYtYWRkcmVzczogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm0tbGFuLXY2LXByZWZpeC1sZW5ndGg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbWFuYWdlbWVudC12NC1hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5tLWxhbi12NC1hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5tLWxhbi12NC1wcmVmaXgtbGVuZ3RoOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJvdXRpbmctaW5zdGFuY2UtbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICByb3V0aW5nLWluc3RhbmNlczogICAgICAgICAgICAgICAgICAgCisgICAgICAgIHR5cGU6IG1hcAorICAgICAgZW50cnlfc2NoZW1hOiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gaG9zdDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLFVOQk9VTkRFRF0KKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdmFsaWQgSEVBVF9FTlYgZmlsZXMuZW52IGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92YWxpZCBIRUFUX0VOViBmaWxlcy5lbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3NmMwZgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdmFsaWQgSEVBVF9FTlYgZmlsZXMuZW52CkBAIC0wLDAgKzEsNTQgQEAKK3BhcmFtZXRlcnM6CisgIGZsYXZvcl9zY3BfYmVfaWQ6IG0xLnNtYWxsCisgIGZsYXZvcl9zY3BfZmVfaWQ6IG0xLnNtYWxsCisgIGZsYXZvcl9zbXBfaWQ6IG0xLnNtYWxsCisgIGZsYXZvcl9kYl9pZDogbTEuc21hbGwKKyAgaW1hZ2Vfc2NwX2JlX2lkOiBDQ0xJTlVYCisgIGltYWdlX3NjcF9mZV9pZDogQ0NMSU5VWAorICBpbWFnZV9zbXBfaWQ6IENDTElOVVgKKyAgaW1hZ2VfZGJfaWQ6IENDTElOVVgKKworICBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZDogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXQKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyOiAxNzIuMjYuMi4wLzI0CisgIGludF92c2NwX2NsdXN0ZXJfbmV0X2lkOiBpbnRfdnNjcF9jbHVzdGVyX25ldAorICBpbnRfdnNjcF9jbHVzdGVyX2NpZHI6IDE3Mi4yNi4zLjAvMjQKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQ6IGludF92c2NwX2RiX25ldHdvcmtfbmV0CisgIGludF92c2NwX2RiX25ldHdvcmtfY2lkcjogMTcyLjI2LjEuMC8yNAorICAKKyAgU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXQKKyAgU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXQKKyAgQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZDogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldAorIyAgT0FNX2RpcmVjdF9uZXRfaWQ6IE9BTV9uZXQKKyMgIE9BTV9kaXJlY3RfbmV0X2lkOiBvYW0tZGlyZWN0LW5ldAorICBPQU1fZGlyZWN0X25ldF9pZDogTWFya3NfT0FNX2RpcmVjdF9uZXQKKyAgCisgIGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOiAxMDcuMjM5LjE1LjE3CisgIGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOiAxMDcuMjM5LjE1LjE4CisgIGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOiAxMDcuMjM5LjE1LjE5CisgIGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOiAxMDcuMjM5LjE1LjIwCisgIGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOiAxMDcuMjM5LjE1LjIxCisgIGJlMF9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjMzCisgIGJlMV9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjM0CisgIGJlMl9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjM1CisgIGJlM19PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjM2CisgIGJlNF9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjM3CisgIGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHM6IDE3Mi4yNi40LjEKKyAgZmUwX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuMzgKKyAgZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwczogMTcyLjI2LjQuNQorICBmZTFfT0FNX2RpcmVjdF9pcHM6IDEwLjI1MC4xMC4zOQorICBzbXAwX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuNDAKKyAgc21wMV9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjQxCisgIGRiMF9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjQyCisgIGRiMV9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjQzCisKKyAgdm1fc2NwX2JlMF9uYW1lOiB2U0NQX0JFMAorICB2bV9zY3BfYmUxX25hbWU6IHZTQ1BfQkUxCisgIHZtX3NjcF9iZTJfbmFtZTogdlNDUF9CRTIKKyAgdm1fc2NwX2JlM19uYW1lOiB2U0NQX0JFMworICB2bV9zY3BfYmU0X25hbWU6IHZTQ1BfQkU0CisgIHZtX3NjcF9mZTBfbmFtZTogdlNDUF9GRTAKKyAgdm1fc2NwX2ZlMV9uYW1lOiB2U0NQX0ZFMQorICB2bV9zbXAwX25hbWU6IHZTTVAwCisgIHZtX3NtcDFfbmFtZTogdlNNUDEKKyAgdm1fZGIwX25hbWU6IHZEQjAKKyAgdm1fZGIxX25hbWU6IHZEQjEKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdmFsaWRIRUFUZmlsZXMueWFtbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdmFsaWRIRUFUZmlsZXMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM1NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92YWxpZEhFQVRmaWxlcy55YW1sCkBAIC0wLDAgKzEsNzg3IEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTI6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTM6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTQ6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisKKyAgdm5mX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhlX1NDUF9uYW1lCisgIHZuZl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIElEIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhzX1NDUF9pZAorCisgIGZsYXZvcl9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBpbWFnZV9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfYmUKKyAgaW1hZ2Vfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2ZlICAgIAorICBpbWFnZV9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2Vfc21wCisgIGltYWdlX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2RiCisKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjIgRkUgQ2x1c3Rlci9LQQorICBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazIgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjMgQ2x1c3RlcgorICBpbnRfdnNjcF9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazMgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjQgREIKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcms0IEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0EKKyAgU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQgorICBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIENSSUNLRVRfT0NTCisgIE9BTV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIE9BTQorICBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBkYjAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZGIxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICB2bV9zY3BfYmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTSAgICAKKyAgdm1fc2NwX2JlMl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUyCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlM19uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUzCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlNF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkU0CisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTFfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTI6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMiB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMl9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMl9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUzOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTMgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTNfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTNfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlNDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmU0IH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmU0X3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTRfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTRfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmU0X3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTBfcG9ydF8wOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwc319XQorCisgIGZlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTFfcG9ydF8xOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwc319XQorCisgIGZlMV9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjFfT0FNX2RpcmVjdF9pcHN9fV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZhbGlkX3ZmLmNzYXIgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZhbGlkX3ZmLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiZjE1OQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdmFsaWRfdmYuY3NhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZmX3dpdGhfZ3JvdXBzLmNzYXIgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZmX3dpdGhfZ3JvdXBzLmNzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlYThjZQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdmZfd2l0aF9ncm91cHMuY3NhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3lhbWxTYW1wbGUueW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy95YW1sU2FtcGxlLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGNjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy95YW1sU2FtcGxlLnltbApAQCAtMCwwICsxLDUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuQ1A6CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLnJvb3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3lhbWxTYW1wbGUyLnltbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMveWFtbFNhbXBsZTIueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwY2NmNzEKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3lhbWxTYW1wbGUyLnltbApAQCAtMCwwICsxLDUgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuQ1A6CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLnJvb3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvY3JlZGVudGlhbHMueWFtbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9jcmVkZW50aWFscy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTQyODAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvY3JlZGVudGlhbHMueWFtbApAQCAtMCwwICsxLDQ4IEBACisgICAgZGVzaWduZXI6IHsKKyAgICAgICAgdXNlcm5hbWU6IG05OTEyMSwKKyAgICAgICAgcGFzc3dvcmQ6IDY2LVBlcmNlbnQsCisgICAgICAgIGZpcnN0bmFtZTogQVNEQywKKyAgICAgICAgbGFzdG5hbWU6IEtBU1BJTgorICAgIH0KKyAgICBhZG1pbjogeworICAgICAgICB1c2VybmFtZTogbTk5MTIyLAorICAgICAgICBwYXNzd29yZDogOTgtRGVncmVlcywKKyAgICAgICAgZmlyc3RuYW1lOiBBU0RDLAorICAgICAgICBsYXN0bmFtZTogS0FTUElOCisgICAgfQorICAgIG9wczogeworICAgICAgICB1c2VybmFtZTogbTk5MTIzLAorICAgICAgICBwYXNzd29yZDogMTctRGlhbWV0ZXIsCisgICAgICAgIGZpcnN0bmFtZTogQVNEQywKKyAgICAgICAgbGFzdG5hbWU6IEtBU1BJTgorICAgIH0KKyAgICB0ZXN0ZXI6IHsKKyAgICAgICAgdXNlcm5hbWU6IG05OTEyNCwKKyAgICAgICAgcGFzc3dvcmQ6IDgwMi1Ob3RhR3JvdXAsCisgICAgICAgIGZpcnN0bmFtZTogQVNEQywKKyAgICAgICAgbGFzdG5hbWU6IEtBU1BJTgorICAgIH0KKyAgICBnb3Zlcm5vcjogeworICAgICAgICB1c2VybmFtZTogbTk5MTI1LAorICAgICAgICBwYXNzd29yZDogMTQyLU9mZmljaWFudCwKKyAgICAgICAgZmlyc3RuYW1lOiBBU0RDLAorICAgICAgICBsYXN0bmFtZTogS0FTUElOCisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ2lzdDogeworICAgICAgICB1c2VybmFtZTogbTk5MTI2LAorICAgICAgICBwYXNzd29yZDogMTkxMC1GcnVpdEd1bSwKKyAgICAgICAgZmlyc3RuYW1lOiBBU0RDLAorICAgICAgICBsYXN0bmFtZTogS0FTUElOCisgICAgfQorICAgIHByb2R1Y3RfbWFuYWdlcjogeworICAgICAgICB1c2VybmFtZTogbTk5MTI3LAorICAgICAgICBwYXNzd29yZDogNzQ3LUFpcnBsYW5lLAorICAgICAgICBmaXJzdG5hbWU6IEFTREMsCisgICAgICAgIGxhc3RuYW1lOiBLQVNQSU4KKyAgICB9CisgICAgcHJvZHVjdF9sb2NhbDogeworICAgICAgICB1c2VybmFtZTogcG0wMDAxLAorICAgICAgICBwYXNzd29yZDogMTIzMTIzYSwKKyAgICAgICAgZmlyc3RuYW1lOiBBU0RDLAorICAgICAgICBsYXN0bmFtZTogS0FTUElOCisgICAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9sb2c0ai5wcm9wZXJ0aWVzIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxNTllYwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzQgQEAKKyMgRGVmaW5lIHRoZSByb290IGxvZ2dlciB3aXRoIGFwcGVuZGVyIGZpbGUKK2xvZzRqLnJvb3RMb2dnZXIgPSBERUJVRywgRklMRSwgc3Rkb3V0CisKKyMgRGVmaW5lIHRoZSBmaWxlIGFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5GSUxFPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuRklMRS5GaWxlPSR7dGFyZ2V0bG9nfWxvZ3MvY2ktbG9nLm91dAorCisjIERlZmluZSB0aGUgbGF5b3V0IGZvciBmaWxlIGFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5GSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLkZJTEUubGF5b3V0LmNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICU1cCBbJTEwY10gOiAlbSVuCisKKyMgU2V0IHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBiZWZvcmUgcm9sbG92ZXIKK2xvZzRqLmFwcGVuZGVyLkZJTEUubWF4RmlsZVNpemU9NU1CCisKKyMgU2V0IHRoZSB0aGUgYmFja3VwIGluZGV4Citsb2c0ai5hcHBlbmRlci5GSUxFLm1heEJhY2t1cEluZGV4PTEwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERpcmVjdCBsb2cgbWVzc2FnZXMgdG8gc3Rkb3V0Citsb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5UYXJnZXQ9U3lzdGVtLm91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKKyNsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICUtNXAgJWN7MX06JUwgLSAlbSVuCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICU1cCAlMTBjOiVMIC0gJW0lbgorCitsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHk9REVCVUcKK2xvZzRqLmxvZ2dlci5jb20udGhpbmthdXJlbGl1cy50aXRhbi5kaXNrc3RvcmFnZS5jYXNzYW5kcmEuQ2Fzc2FuZHJhVHJhbnNhY3Rpb249SU5GTywgRklMRSwgc3Rkb3V0CisKK2xvZzRqLmxvZ2dlci5vcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscz1UUkFDRSwgRklMRSwgc3Rkb3V0Citsb2c0ai5hZGRpdGl2aXR5Lm9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzPWZhbHNlCisKKwpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjc4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLXBhY2thZ2VzLnlhbWwKQEAgLTAsMCArMSwyIEBACitwYWNrYWdlczoKKyAtIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2V1aQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9zZGMueWFtbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9zZGMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGNhMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy55YW1sCkBAIC0wLDAgKzEsODAgQEAKK291dHB1dEZvbGRlcjogdGFyZ2V0CityZXBvcnROYW1lOiBpbmRleC5odG1sCitjYXRhbG9nQmVIb3N0OiBiZWhvc3QKK2NhdGFsb2dGZUhvc3Q6IGZlaG9zdAorZXNIb3N0OiBlc2hvc3QKK2Rpc3JpYnV0aW9uQ2xpZW50SG9zdDogZGlzQ2xpZW50CitjYXRhbG9nRmVQb3J0OiA4MTgxCitjYXRhbG9nQmVQb3J0OiA4MDgwCitkaXNyaWJ1dGlvbkNsaWVudFBvcnQ6IDgxODEKK2VzUG9ydDogOTIwMAorbmVvSG9zdDogbmVvSG9zdAorbmVvUG9ydDogNzQ3NAorbmVvREJ1c2VybmFtZTogbmVvNGoJCituZW9EQnBhc3N3b3JkOiAxMjM0NTYKKyN1cmw6IGh0dHA6Ly9sb2NhbGhvc3Q6OTAwMC8jL2Rhc2hib2FyZAordXJsOiBodHRwOi8vbG9jYWxob3N0OjgxODEvc2RjMS9wcm94eS1kZXNpZ25lcjEjL2Rhc2hib2FyZAorCit3ZWJTZWFsU2ltdWxhdG9yVXJsOiBodHRwOi8vbG9jYWxob3N0OjgyODUvc2RjMQorcmVtb3RlVGVzdGluZ01hY2hpbmVJUDogMS4yLjMuNAorcmVtb3RlVGVzdGluZ01hY2hpbmVQb3J0OiA1NTU1CityZW1vdGVUZXN0aW5nOiBmYWxzZQorCityZXNvdXJjZUNvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzCitjb21wb25lbnRzQ29uZmlnRGlyOiBzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cworaW1wb3J0UmVzb3VyY2VDb25maWdEaXI6IC4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2ltcG9ydC90b3NjYS9jYXBhYmlsaXR5LXR5cGVzCitpbXBvcnRSZXNvdXJjZVRlc3RzQ29uZmlnRGlyOiBzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0UmVzb3VyY2VUZXN0cworZXJyb3JDb25maWd1cmF0aW9uRmlsZTogLi4vY2F0YWxvZy1iZS9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlnL2Vycm9yLWNvbmZpZ3VyYXRpb24ueWFtbAorY29uZmlndXJhdGlvbkZpbGU6IC4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9jb25maWd1cmF0aW9uLnlhbWwKK2ltcG9ydFR5cGVzQ29uZmlnRGlyOiBzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvaW1wb3J0VHlwZXNUZXN0CisKKwordGl0YW5Qcm9wZXJ0aWVzRmlsZTogc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvdGl0YW4ucHJvcGVydGllcworY2Fzc2FuZHJhSG9zdDogMTI3LjAuMC4xCitjYXNzYW5kcmFBdXRoZW50aWNhdGU6IGZhbHNlCitjYXNzYW5kcmFVc2VybmFtZToga29rbworY2Fzc2FuZHJhUGFzc3dvcmQ6IGJvYm8KK2Nhc3NhbmRyYVNzbDogZmFsc2UKK2Nhc3NhbmRyYVRydXN0c3RvcmVQYXRoIDogL3BhdGgvcGF0aAorY2Fzc2FuZHJhVHJ1c3RzdG9yZVBhc3N3b3JkIDogMTIzMTIzCitjYXNzYW5kcmFBdWRpdEtleVNwYWNlOiBzZGNBdWRpdAorY2Fzc2FuZHJhQXJ0aWZhY3RLZXlTcGFjZTogc2RjQXJ0aWZhY3QKKworc3RvcE9uQ2xhc3NGYWlsdXJlOiBmYWxzZQorCisjTGlzdCBvZiBub24tYWJzdHJhY3QgcmVzb3VyY2VzIHRvIGtlZXAgZHVyaW5nIHRpdGFuIGNsZWFudXAgYmV0d2VlbiB0ZXN0cworI09ubHkgMS4wIHZlcnNpb24gd2lsbCBiZSBrZXB0CityZXNvdXJjZXNOb3RUb0RlbGV0ZToKKyAgICAgLSBDb21wdXRlCisgICAgIC0gRGF0YWJhc2UKKyAgICAgLSBPYmplY3RTdG9yYWdlCisgICAgIC0gQmxvY2tTdG9yYWdlCisgICAgIC0gTG9hZEJhbGFuY2VyCisgICAgIC0gUG9ydAorICAgICAtIE5ldHdvcmsKKyAgICAgLSBSb290CisgICAgIC0gQ29udGFpbmVyQXBwbGljYXRpb24KKyAgICAgLSBDb250YWluZXJSdW50aW1lCisgICAgIC0gREJNUworICAgICAtIFNvZnR3YXJlQ29tcG9uZW50CisgICAgIC0gV2ViQXBwbGljYXRpb24KKyAgICAgLSBXZWJTZXJ2ZXIKKyAgICAgLSBDaW5kZXJWb2x1bWUKKyAgICAgLSBDb250cmFpbFZpcnR1YWxOZXR3b3JrCisgICAgIC0gTmV1dHJvbk5ldAorICAgICAtIE5ldXRyb25Qb3J0CisgICAgIC0gTm92YVNlcnZlcgorI1Jlc291cmNlIGNhdGVnb3JpZXMgdG8ga2VlcCAoaW5jbHVkaW5nIGFsbCB0aGVpciBzdWJjYXRlZ29yaWVzKQorcmVzb3VyY2VDYXRlZ29yaWVzTm90VG9EZWxldGU6CisgICAgIC0gR2VuZXJpYworICAgICAtIE5ldHdvcmsgTDItMworICAgICAtIE5ldHdvcmsgTDQrCisgICAgIC0gQXBwbGljYXRpb24gTDQrCisgICAgIC0gTmV0d29yayBDb25uZWN0aXZpdHkKKworI1NlcnZpY2UgY2F0ZWdvcmllcyB0byBrZWVwCitzZXJ2aWNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlOgorICAgICAtIE1vYmlsaXR5CisgICAgIC0gTmV0d29yayBMMS0zCisgICAgIC0gTmV0d29yayBMNAorICAgICAtIFZvSVAgQ2FsbCBDb250cm9sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RpdGFuLnByb3BlcnRpZXMgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvdGl0YW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQxMmNmCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RpdGFuLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3IEBACitzdG9yYWdlLmJhY2tlbmQ9Y2Fzc2FuZHJhCitzdG9yYWdlLmhvc3RuYW1lPWNhc3NhbmRyYWhvc3QKK3N0b3JhZ2UucG9ydD05MTYwCisKK2NhY2hlLmRiLWNhY2hlLWNsZWFuLXdhaXQgPSAyMAorY2FjaGUuZGItY2FjaGUtdGltZSA9IDE4MDAwMAorY2FjaGUuZGItY2FjaGUtc2l6ZSA9IDAuNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvc2NyaXB0cy9zdGFydFRlc3Quc2ggYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL3NjcmlwdHMvc3RhcnRUZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTMzNjkKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL3NjcmlwdHMvc3RhcnRUZXN0LnNoCkBAIC0wLDAgKzEsMTIzIEBACisjIS9iaW4vYmFzaAorCitUT01DQVRfRElSPS9ob21lL2FwYWNoZS10b21jYXQtNy4wLjQxL3dlYmFwcHMvc2RjLWNpCisKK2Z1bmN0aW9uIHVzYWdlIHsKKwllY2hvICJVc2FnZTogJDAgPGphciBmaWxlPiIKK30KKworZnVuY3Rpb24gZXhpdE9uRXJyb3IoKSB7CisgICAgICAgIGlmIFsgJDEgLW5lIDAgXQorICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiRmFpbGVkIHJ1bm5pbmcgdGFzayAkMiIKKyAgICAgICAgICAgICAgICBleGl0IDIKKyAgICAgICAgZmkKK30KKworaWYgWyAkIyAtbHQgMSBdCit0aGVuCisJdXNhZ2UKKwlleGl0IDIKK2ZpCisKK0NVUlJFTlRfRElSPWBwd2RgCitCQVNFRElSPSQoZGlybmFtZSAkMCkKKworaWYgWyAke0JBU0VESVI6MDoxfSA9ICIvIiBdCit0aGVuCisgICAgICAgIEZVTExfUEFUSD0kQkFTRURJUgorZWxzZQorICAgICAgICBGVUxMX1BBVEg9JENVUlJFTlRfRElSLyRCQVNFRElSCitmaQorCitMT0dTX1BST1BfRklMRT1maWxlOiR7RlVMTF9QQVRIfS8uLi9jb25mL2xvZzRqLnByb3BlcnRpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworVEFSR0VUX0RJUj0ke0ZVTExfUEFUSH0vLi4vdGFyZ2V0CitUQVJHRVRfTE9HX0RJUj0iJHtUQVJHRVRfRElSfS8iCitDT05GX0ZJTEU9JHtGVUxMX1BBVEh9Ly4uL2NvbmYvc2RjLnlhbWwKK0RFQlVHPXRydWUKK01haW5DbGFzcz1vcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW4uU3RhcnRUZXN0CisKK0pBUl9GSUxFPSQxCisKKyNUQVJHRVRfRElSPWBlY2hvICR7VEFSR0VUX0RJUn0gfCBzZWQgJ3MvXC8vXC8vZydgCisjZWNobyAkVEFSR0VUX0RJUgorCitURVNUU19ESVI9L29wdC9hcHAvc2RjL2NpL3Jlc291cmNlcy90ZXN0cworQ09NUE9ORU5UU19ESVI9L29wdC9hcHAvc2RjL2NpL3Jlc291cmNlcy9jb21wb25lbnRzCisKKworc2VkIC1pICdzI1wob3V0cHV0Rm9sZGVyOlwpLiojXDEgJyR7VEFSR0VUX0RJUn0nI2cnICRDT05GX0ZJTEUKK3NlZCAtaSAncyNcKHJlc291cmNlQ29uZmlnRGlyOlwpLiojXDEgJyR7VEVTVFNfRElSfScjZycgJENPTkZfRklMRQorc2VkIC1pICdzI1woY29tcG9uZW50c0NvbmZpZ0RpcjpcKS4qI1wxICcke0NPTVBPTkVOVFNfRElSfScjZycgJENPTkZfRklMRQorCisKKworbWtkaXIgLXAgJHtUQVJHRVRfRElSfQoraWYgWyAtZCAke1RBUkdFVF9ESVJ9IF0KK3RoZW4KKyAgICBybSAtcmYgJHtUQVJHRVRfRElSfS8qCisJZXhpdE9uRXJyb3IgJD8gIkZhaWxlZF90b19kZWxldGVfdGFyZ2V0X2RpciIKK2ZpCisKKworZGVidWdfcG9ydD04ODAwCisjSkFWQV9PUFRJT049Ii1qYXZhYWdlbnQ6L3Zhci90bXAvamFjb2NvL2xpYi9qYWNvY29hZ2VudC5qYXI9ZGVzdGZpbGU9amFjb2NvLWl0LmV4ZWMiCitKQVZBX09QVElPTj0iIgorY2FzZSAiJDIiIGluCisJLWRlYnVnKSBlY2hvICJEZWJ1ZyBtb2RlLCBMaXN0ZW4gb24gcG9ydCAkZGVidWdfcG9ydCI7IEpBVkFfT1BUSU9OPSItWGRlYnVnIC1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPSR7ZGVidWdfcG9ydH0iIDs7CisJIiIpIGVjaG8gIlN0YW5kYXJkIG1vZGUiOzsKKwkqKSBlY2hvICJVU0FHRTogc3RhcnRUZXN0LnNoIFstZGVidWddIjs7Citlc2FjCisKKyNjbWQ9ImphdmEgJEpBVkFfT1BUSU9OIC1EY29uZmlnLnJlc291cmNlPWF0dG9kbGl0LmNvbmYgLURsb2c0ai5jb25maWd1cmF0aW9uPWZpbGU6Li9jb25mL2xvZzRqLnByb3BlcnRpZXMgLWNwICNhdHQtb2RsLWl0XzAuMC4xLVNOQVBTSE9ULWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIgb3JnLm9wZW5lY29tcC5kMi5pdC5TdGFydFRlc3QiCisKKyNjbWQ9ImphdmEgJEpBVkFfT1BUSU9OIC1EY29uZmlnLnJlc291cmNlPWF0dHNkYy5jb25mIC1EZGVidWc9dHJ1ZSAtRGxvZzRqLmNvbmZpZ3VyYXRpb249ZmlsZTouL2NvbmYvbG9nNGoucHJvcGVydGllcyAtY3AgdWJlci1jaS0xLjAuMC1TTkFQU0hPVC5qYXIgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucnVuLlN0YXJ0VGVzdCIKKworCitjbWQ9ImphdmEgJEpBVkFfT1BUSU9OIC1EZGlzcGxheUV4Y2VwdGlvbj10cnVlIC1EdGFyZ2V0bG9nPSR7VEFSR0VUX0xPR19ESVJ9IC1EY29uZmlnLnJlc291cmNlPSR7Q09ORl9GSUxFfSAtRGRlYnVnPSR7REVCVUd9IC1EbG9nNGouY29uZmlndXJhdGlvbj0ke0xPR1NfUFJPUF9GSUxFfSAtY3AgJEpBUl9GSUxFICR7TWFpbkNsYXNzfSIgCisKKyNlY2hvICRjbWQKKyNjb25zb2xlPWAkY21kYAorCisKKworaWYgWyAkREVCVUcgPT0gInRydWUiIF0KK3RoZW4KKwkkY21kCitlbHNlCisJJGNtZCA+PiAvZGV2L251bGwKK2ZpIAorc3RhdHVzPWBlY2hvICQ/YAorCisjZWNobyAiY29uc29sZT0kY29uc29sZSIKKyNlY2hvICJzdGF0dXM9JHN0YXR1cyIKKyN0b21jYXQ9YHBzIC1lZiB8IGdyZXAgdG9tY2F0IHwgZ3JlcCBqYXZhIHwgd2MgLWxgCisKKyNpZiBbICR0b21jYXQgPT0gMCBdOyB0aGVuCisjCWVjaG8gIkJyaW5nIHRvbWNhdCB1cCIKKyMJYXBhY2hlLXRvbWNhdC03LjAuNDEvYmluL3N0YXJ0dXAuc2gKKyNmaQorCisjYHJtIC1yZiAuL2h0bWwvKi5odG1sYAorI2BtdiAqLmh0bWwgLi9odG1sL2AKKworCitpZiBbIC1kICR7VE9NQ0FUX0RJUn0gXQordGhlbgorCisJY3AgJHtUQVJHRVRfRElSfS8qLmh0bWwgJHtUT01DQVRfRElSfQorCW12ICR7VE9NQ0FUX0RJUn0vU0RDLXRlc3RSZXBvcnQuaHRtbCAke1RPTUNBVF9ESVJ9L2luZGV4Lmh0bWwKK2ZpCisKKyNlY2hvICJ0b21jYXQ9JHRvbWNhdCIKKyNpcD1gaWZjb25maWcgfCBzZWQgLUVuICdzLzEyNy4wLjAuMS8vO3MvLippbmV0IChhZGRyOik/KChbMC05XSpcLil7M31bMC05XSopLiovXDIvcCcgfCBncmVwIDE3Mi4yMGAKKworI2VjaG8gIlJlcG9ydCB1cmw6IGh0dHA6Ly8kaXA6ODA5MC9hdHQtb2RsLWl0LyIKKworZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCitlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyBzdGF0dXMgaXMgJHN0YXR1cyAiIAorZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisKK2V4aXQgJHN0YXR1cyAKKwpkaWZmIC0tZ2l0IGEvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2Z1bGxUZXN0cy54bWwgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvZnVsbFRlc3RzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkxMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzL2Z1bGxUZXN0cy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIj4KKzxzdWl0ZSBuYW1lPSJ1aUZ1bGxUZXN0cyIgY29uZmlnZmFpbHVyZXBvbGljeT0iY29udGludWUiIHZlcmJvc2U9IjIiPgorCTxwYXJhbWV0ZXIgbmFtZT0iY2xlYW4tdHlwZSIgdmFsdWU9IkZVTEwiIC8+IDwhLS1WYWxpZCBWYWx1ZXMgYXJlOiAgUEFSVElBTCwgRlVMTCwgTk9ORSAtLT4KKyAJPHRlc3QgbmFtZT0iVmZjIFRlc3RzIj4KKwkJPGNsYXNzZXM+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnZmYy5WZmNCYXNpY1Rlc3RzIj48L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCQorCTx0ZXN0IG5hbWU9IlZGIFRlc3RzIj4KKwkJPGNsYXNzZXM+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnZmLlZmQmFzaWNUZXN0cyIgLz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUudmYuVmZDYW52YXNUZXN0cyIgLz4KKwkJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy51aWNpLnRlc3RzLmV4ZWN1dGUudmYuVmZPbmJvYXJkaW5nVGVzdHMiIC8+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnZmLlZmRGVwbG95bWVudFRlc3RzIi8+CQkJCisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+CisJCisJPHRlc3QgbmFtZT0iU2VydmljZSBUZXN0cyI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlLlNlcnZpY2VCYXNpY1Rlc3RzIj48L2NsYXNzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS5zZXJ2aWNlLlNlcnZpY2VJbnB1dHNUZXN0cyI+PC9jbGFzcz4KKwkJPC9jbGFzc2VzPgorCTwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvc2FuaXR5LnhtbCBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy9zYW5pdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTg3NjUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvc2FuaXR5LnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9InVpU2FuaXR5IiBjb25maWdmYWlsdXJlcG9saWN5PSJjb250aW51ZSIgdmVyYm9zZT0iMiI+CisJPHBhcmFtZXRlciBuYW1lPSJjbGVhbi10eXBlIiB2YWx1ZT0iRlVMTCIgLz4gPCEtLVZhbGlkIFZhbHVlcyBhcmU6ICBQQVJUSUFMLCBGVUxMLCBOT05FIC0tPgorCTx0ZXN0IG5hbWU9IlZmYyBUZXN0cyI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS52ZmMuVmZjQmFzaWNUZXN0cyI+CisJCQkJPG1ldGhvZHM+CisJCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RJbXBvcnRWZmMiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RVcGRhdGVUeXBlRm9yQXR0cmlidXRlT2ZWZmMiIC8+CisJCQkJPC9tZXRob2RzPgorCQkJPC9jbGFzcz4KKwkJPC9jbGFzc2VzPgorCTwvdGVzdD4gCisKKwk8dGVzdCBuYW1lPSJWRiBUZXN0cyI+CisJCTxjbGFzc2VzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS52Zi5WZkJhc2ljVGVzdHMiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ0ZXN0SW1wb3J0VmYiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RVcGRhdGVJbnN0YW5jZUF0dHJpYnV0ZVZhbHVlIiAvPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ0ZXN0VmZDZXJ0aWZpY2F0aW9uIiAvPiAKKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQkJPGNsYXNzIG5hbWU9Im9yZy5vcGVuZWNvbXAuc2RjLnVpY2kudGVzdHMuZXhlY3V0ZS52Zi5WZkNhbnZhc1Rlc3RzIj4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idGVzdENhbnZhc1ZGU2FuaXR5IiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnZmLlZmRGVwbG95bWVudFRlc3RzIj4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idGVzdFVwZGF0ZU1vZHVsZU5hbWVTYW5pdHkiIC8+CisJCQkJCTxpbmNsdWRlIG5hbWU9InRlc3RUYWJzVmlld1Nhbml0eSIvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CisJCTwvY2xhc3Nlcz4KKwk8L3Rlc3Q+CisKKwk8dGVzdCBuYW1lPSJTZXJ2aWNlIFRlc3RzIj4KKwkJPGNsYXNzZXM+CisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuU2VydmljZUJhc2ljVGVzdHMiPgorCQkJCTxtZXRob2RzPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ0ZXN0TGlua1R3b1JJIiAvPgorCQkJCQk8aW5jbHVkZSBuYW1lPSJ0ZXN0QnVpbGRTZXJ2aWNlRm9yRGlzdHJpYnV0aW9uIiAvPgorCQkJCTwvbWV0aG9kcz4KKwkJCTwvY2xhc3M+CQkJCisJCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMudWljaS50ZXN0cy5leGVjdXRlLnNlcnZpY2UuU2VydmljZUlucHV0c1Rlc3RzIj4KKwkJCQk8bWV0aG9kcz4KKwkJCQkJPGluY2x1ZGUgbmFtZT0idGVzdElucHV0c1Nhbml0eSIgLz4KKwkJCQk8L21ldGhvZHM+CisJCQk8L2NsYXNzPgorCQk8L2NsYXNzZXM+CisJPC90ZXN0PgorCis8L3N1aXRlPiAKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2dpem1vcmFtYm8uanBnIGIvdWktY2ktZGV2L3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZ2l6bW9yYW1iby5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhOGZlOAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpLWRldi9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2dpem1vcmFtYm8uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpLWRldi9zcmMvdGVzdC9Db21wbGV0ZXRoZWZvcm0uanMgYi91aS1jaS1kZXYvc3JjL3Rlc3QvQ29tcGxldGV0aGVmb3JtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOGI3NTcKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS1kZXYvc3JjL3Rlc3QvQ29tcGxldGV0aGVmb3JtLmpzCkBAIC0wLDAgKzEsMyBAQAorLyoqCisgKiBOZXcgbm9kZSBmaWxlCisgKi8KZGlmZiAtLWdpdCBhL3VpLWNpLWRldi90YXJiYWxsLnhtbCBiL3VpLWNpLWRldi90YXJiYWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjYyZTZmCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2ktZGV2L3RhcmJhbGwueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzxhc3NlbWJseQorCXhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+CisJPGlkPmJpbjwvaWQ+CisJPGZvcm1hdHM+CisJCTxmb3JtYXQ+dGFyPC9mb3JtYXQ+CisJPC9mb3JtYXRzPgorCTxmaWxlcz4KKwkJPGZpbGU+CisJCQk8c291cmNlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn0tamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphcjwvc291cmNlPgorCQkJPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGRlc3ROYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn0tamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphcjwvZGVzdE5hbWU+CisJCTwvZmlsZT4KKyAJCTxmaWxlPgorCQkJPHNvdXJjZT4uLi9hc2RjLXRlc3RzL3NyYy9tYWluL3Jlc291cmNlcy9jaS9zY3JpcHRzL3N0YXJ0VGVzdC5zaDwvc291cmNlPgorCQkJPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGRlc3ROYW1lPnN0YXJ0VGVzdC5zaDwvZGVzdE5hbWU+CisJCTwvZmlsZT4KKwkJPCEtLWZpbGU+IDxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2NpL3NjcmlwdHMvcG9zdGluc3RhbGw8L3NvdXJjZT4gPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PiAKKwkJCTxkZXN0TmFtZT5wb3N0aW5zdGFsbDwvZGVzdE5hbWU+IDwvZmlsZSAtLT4KKwkJPGZpbGU+CisJCQk8c291cmNlPi4uL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLnlhbWw8L3NvdXJjZT4KKwkJCTxvdXRwdXREaXJlY3Rvcnk+Y29uZjwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGRlc3ROYW1lPnNkYy55YW1sPC9kZXN0TmFtZT4KKwkJPC9maWxlPgorCQk8ZmlsZT4KKwkJCTxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLXBhY2thZ2VzLnlhbWw8L3NvdXJjZT4KKwkJCTxvdXRwdXREaXJlY3Rvcnk+Y29uZjwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGRlc3ROYW1lPnNkYy1wYWNrYWdlcy55YW1sPC9kZXN0TmFtZT4KKwkJPC9maWxlPgorCQk8ZmlsZT4KKwkJCTxzb3VyY2U+Li4vYXNkYy10ZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9sb2c0ai5wcm9wZXJ0aWVzPC9zb3VyY2U+CisJCQk8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKwkJCTxkZXN0TmFtZT5sb2c0ai5wcm9wZXJ0aWVzPC9kZXN0TmFtZT4KKwkJPC9maWxlPgorPCEtLSAJCTxmaWxlPgorCQkJPHNvdXJjZT5zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90aXRhbi5wcm9wZXJ0aWVzPC9zb3VyY2U+CisJCQk8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKwkJCTxkZXN0TmFtZT50aXRhbi5wcm9wZXJ0aWVzPC9kZXN0TmFtZT4KKwkJPC9maWxlPiAtLT4KKzwhLS0gCQk8ZmlsZT4KKwkJCTxzb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWw8L3NvdXJjZT4KKwkJCTxvdXRwdXREaXJlY3Rvcnk+Y29uZjwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGRlc3ROYW1lPmVycm9yLWNvbmZpZ3VyYXRpb24ueWFtbDwvZGVzdE5hbWU+CisJCTwvZmlsZT4gLS0+CisJCTxmaWxlPgorCQkJPHNvdXJjZT5zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9jcmVkZW50aWFscy55YW1sPC9zb3VyY2U+CisJCQk8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKwkJCTxkZXN0TmFtZT5jcmVkZW50aWFscy55YW1sPC9kZXN0TmFtZT4KKwkJPC9maWxlPgorCisJPC9maWxlcz4KKworCTxmaWxlU2V0cz4KKwkJPGZpbGVTZXQ+CisJCQk8ZGlyZWN0b3J5PnNyYy90ZXN0L3Jlc291cmNlczwvZGlyZWN0b3J5PgorCQkJPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorCQk8L2ZpbGVTZXQ+CisJCTxmaWxlU2V0PgorCQkJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlczwvZGlyZWN0b3J5PgorCSAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uL3Rlc3RTdWl0ZXM8L291dHB1dERpcmVjdG9yeT4KKwkJPC9maWxlU2V0PgorCTwvZmlsZVNldHM+CisKKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS91aS1jaS8uZ2l0aWdub3JlIGIvdWktY2kvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2IyMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKy9iaW4vCit0ZXN0LW91dHB1dC8KKy90YXJnZXQvCmRpZmYgLS1naXQgYS91aS1jaS9wb20ueG1sIGIvdWktY2kvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTIzNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvcG9tLnhtbApAQCAtMCwwICsxLDI2MCBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworCTxhcnRpZmFjdElkPnVpLWNpPC9hcnRpZmFjdElkPgorCTxkZXNjcmlwdGlvbj5TZWxlbml1bSB0ZXN0cyBmb3IgdGhlIFNEbkMgQXBwbGljYXRpb248L2Rlc2NyaXB0aW9uPgorCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnNkYy1tYWluPC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJCisJPC9wYXJlbnQ+CisKKwk8ZGVwZW5kZW5jaWVzPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5zZWxlbml1bWhxLnNlbGVuaXVtPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c2VsZW5pdW0tamF2YTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuNDguMDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuc2VsZW5pdW1ocS5zZWxlbml1bTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNlbGVuaXVtLXNlcnZlcjwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuNTMuMTwvdmVyc2lvbj4KKwkJCTxzY29wZT5ydW50aW1lPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKzwhLS0gCQk8ZGVwZW5kZW5jeT4KKyAgICAJCTxncm91cElkPm9yZy5zZWxlbml1bWhxLnNlbGVuaXVtPC9ncm91cElkPgorICAgCQkgCTxhcnRpZmFjdElkPnNlbGVuaXVtLWZpcmVmb3gtZHJpdmVyPC9hcnRpZmFjdElkPgorICAgIAkJPHZlcnNpb24+My4wLjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4gLS0+CisJCQorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmFzZGMtdGVzdHM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4ke2FzZGMtdGVzdHMudmVyc2lvbn08L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy55YW1sPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+c25ha2V5YW1sPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4xNDwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIGh0dHAgY2xpZW50IC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+aHR0cG1pbWU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+Mi41PC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIGh0dHAgY29yZSAtLT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+aHR0cGNvcmU8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8IS0tIFRJVEFOIC0tPgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS50aGlua2F1cmVsaXVzLnRpdGFuPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGl0YW4tY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPiR7dGl0YW4udmVyc2lvbn08L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmNvbS50aGlua2F1cmVsaXVzLnRpdGFuPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+dGl0YW4tY2Fzc2FuZHJhPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+JHt0aXRhbi52ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmphY2tzb248L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5qYWNrc29uLW1hcHBlci1hc2w8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4xLjkuMjwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4yLjMuMTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmphY2tzb24tY29yZTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjIuMy4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcub3BlbmVjb21wLnNkYzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnNkYy1kaXN0cmlidXRpb24tY2xpZW50PC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4wLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKworCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPmp1bml0PC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisJCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLnRlc3RuZzwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPnRlc3RuZzwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjYuOS4xMDwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+eG1sLWFwaXM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjEuNC4wMTwvdmVyc2lvbj4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5qc29uLXNpbXBsZTwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPmpzb24tc2ltcGxlPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MS4xPC92ZXJzaW9uPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5jb21tb25zLWpjaS1jb3JlPC9hcnRpZmFjdElkPgorCQkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCQk8L2RlcGVuZGVuY3k+CisKKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKwkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwkJPC9kZXBlbmRlbmN5PgorCQkKKwkJPGRlcGVuZGVuY3k+CisJCSAgICA8Z3JvdXBJZD5jb20ucmVsZXZhbnRjb2RlczwvZ3JvdXBJZD4KKwkJICAgIDxhcnRpZmFjdElkPmV4dGVudHJlcG9ydHM8L2FydGlmYWN0SWQ+CisJCSAgICA8dmVyc2lvbj4yLjQxLjE8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJCisJCQorCTwvZGVwZW5kZW5jaWVzPgorCQorCQorCQorCTxidWlsZD4KKwkJPHBsdWdpbnM+CisKKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c2tpcD50cnVlPC9za2lwPgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorCisJCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCTwhLS0gQ3JlYXRlIHRoZSBKQVIgZmlsZSB3aXRoIGl0cyBkZXBlbmRlbmNpZXMgLS0+CisJCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj4yLjUuNTwvdmVyc2lvbj4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5jcmVhdGUuamFyLndpdGguZGVwZW5kZW5jaWVzPC9pZD4KKwkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5zaW5nbGU8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJPGFyY2hpdmU+CisJCQkJCQkJCTxtYW5pZmVzdD4KKwkJCQkJCQkJCTxtYWluQ2xhc3M+b3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cC5TZXR1cENEVGVzdDwvbWFpbkNsYXNzPgorCQkJCQkJCQk8L21hbmlmZXN0PgorCQkJCQkJCTwvYXJjaGl2ZT4KKwkJCQkJCQk8ZGVzY3JpcHRvclJlZnM+CisJCQkJCQkJCTxkZXNjcmlwdG9yUmVmPmphci13aXRoLWRlcGVuZGVuY2llczwvZGVzY3JpcHRvclJlZj4KKwkJCQkJCQk8L2Rlc2NyaXB0b3JSZWZzPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+CisKKworCisJPHByb2ZpbGVzPgorCQk8cHJvZmlsZT4KKwkJCTxpZD5DSTwvaWQ+CisJCQk8YWN0aXZhdGlvbj4KKwkJCQk8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisJCQk8L2FjdGl2YXRpb24+CisKKwkJCTxidWlsZD4KKwkJCQk8cGx1Z2lucz4KKwkJCQkJPHBsdWdpbj4KKwkJCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQkJCTx2ZXJzaW9uPjIuNS41PC92ZXJzaW9uPgorCQkJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCQkJPGlkPnRhcmJhbGw8L2lkPgorCQkJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQkJCTxnb2Fscz4KKwkJCQkJCQkJCTxnb2FsPnNpbmdsZTwvZ29hbD4KKwkJCQkJCQkJPC9nb2Fscz4KKwkJCQkJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCQkJCQk8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke2Z1bGwucmVsZWFzZS52ZXJzaW9ufSR7YnVpbGQudHlwZX08L2ZpbmFsTmFtZT4KKwkJCQkJCQkJCTxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgorCQkJCQkJCQkJPGRlc2NyaXB0b3I+JHtwcm9qZWN0LmJhc2VkaXJ9L3RhcmJhbGwueG1sPC9kZXNjcmlwdG9yPgorCQkJCQkJCQkJPGF0dGFjaD5mYWxzZTwvYXR0YWNoPgorCQkJCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJCQkJPC9leGVjdXRpb24+CisJCQkJCQk8L2V4ZWN1dGlvbnM+CisJCQkJCTwvcGx1Z2luPgorCQkJCTwvcGx1Z2lucz4KKwkJCTwvYnVpbGQ+CisJCTwvcHJvZmlsZT4KKwk8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQXJ0aWZhY3RJbmZvLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9BcnRpZmFjdEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGU5YWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQXJ0aWZhY3RJbmZvLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGNsYXNzIEFydGlmYWN0SW5mbyB7CisKKwlwcml2YXRlIFN0cmluZyBmaWxlcGF0aDsKKwlwcml2YXRlIFN0cmluZyBmaWxlbmFtZTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKwlwcml2YXRlIFN0cmluZyBhcnRpZmFjdFR5cGU7CisJcHJpdmF0ZSBTdHJpbmcgYXJ0aWZhY3RMYWJlbDsKKworCXB1YmxpYyBBcnRpZmFjdEluZm8oU3RyaW5nIGZpbGVwYXRoLCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGFydGlmYWN0TGFiZWwsCisJCQlTdHJpbmcgYXJ0aWZhY3RUeXBlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZmlsZXBhdGggPSBmaWxlcGF0aDsKKwkJdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCXRoaXMuYXJ0aWZhY3RUeXBlID0gYXJ0aWZhY3RUeXBlOworCQl0aGlzLmFydGlmYWN0TGFiZWwgPSBhcnRpZmFjdExhYmVsOworCX0KKworCXB1YmxpYyBBcnRpZmFjdEluZm8oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaWxlcGF0aCgpIHsKKwkJcmV0dXJuIGZpbGVwYXRoOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZpbGVwYXRoKFN0cmluZyBmaWxlcGF0aCkgeworCQl0aGlzLmZpbGVwYXRoID0gZmlsZXBhdGg7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKKwkJcmV0dXJuIGZpbGVuYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkgeworCQl0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdFR5cGUoKSB7CisJCXJldHVybiBhcnRpZmFjdFR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RUeXBlKFN0cmluZyBhcnRpZmFjdFR5cGUpIHsKKwkJdGhpcy5hcnRpZmFjdFR5cGUgPSBhcnRpZmFjdFR5cGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdExhYmVsKCkgeworCQlyZXR1cm4gYXJ0aWZhY3RMYWJlbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdExhYmVsKFN0cmluZyBhcnRpZmFjdExhYmVsKSB7CisJCXRoaXMuYXJ0aWZhY3RMYWJlbCA9IGFydGlmYWN0TGFiZWw7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9CcmVhZENydW1ic0J1dHRvbnNFbnVtLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9CcmVhZENydW1ic0J1dHRvbnNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNWYyNQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0JyZWFkQ3J1bWJzQnV0dG9uc0VudW0uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgZW51bSBCcmVhZENydW1ic0J1dHRvbnNFbnVtIHsKKworCUhPTUUoIm1haW4tbWVudS1idXR0b24taG9tZSIpLCBDQVRBTE9HKCJtYWluLW1lbnUtYnV0dG9uLWNhdGFsb2ciKSwgT05fQk9BUkRJTkcoIm1haW4tbWVudS1idXR0b24tb25ib2FyZCIpOworCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWUyOworCisJcHVibGljIFN0cmluZyBnZXRCdXR0b24oKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcml2YXRlIEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0oU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0NhbnZhc0VsZW1lbnQuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0NhbnZhc0VsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MThiNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ2FudmFzRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uTGVmdFBhbmVsQ2FudmFzSXRlbXM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDYW52YXNFbGVtZW50IHsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB1bmlxdWVJZDsKKwlwcml2YXRlIEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gbG9jYXRpb247CisJcHJpdmF0ZSBMZWZ0UGFuZWxDYW52YXNJdGVtcyBub3JtYXRpdmVFbGVtZW50VHlwZTsKKwlwcml2YXRlIFN0cmluZyBlbGVtZW50VHlwZTsKKworCUNhbnZhc0VsZW1lbnQoU3RyaW5nIG5hbWUsIEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gbG9jYXRpb24sIExlZnRQYW5lbENhbnZhc0l0ZW1zIGNhbnZhc0l0ZW0pIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy51bmlxdWVJZCA9IG5hbWU7CisJCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKwkJbm9ybWF0aXZlRWxlbWVudFR5cGUgPSBjYW52YXNJdGVtOworCX0KKworCUNhbnZhc0VsZW1lbnQoU3RyaW5nIG5hbWUsIEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gbG9jYXRpb24sIFN0cmluZyBjYW52YXNJdGVtKSB7CisJCXN1cGVyKCk7CisJCXRoaXMudW5pcXVlSWQgPSBuYW1lOworCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisJCWVsZW1lbnRUeXBlID0gY2FudmFzSXRlbTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworCQlyZXR1cm4gdW5pcXVlSWQ7CisJfQorCisJcHVibGljIEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gZ2V0TG9jYXRpb24oKSB7CisJCXJldHVybiBsb2NhdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGxvY2F0aW9uKSB7CisJCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKwl9CisKKwlwdWJsaWMgTGVmdFBhbmVsQ2FudmFzSXRlbXMgZ2V0Tm9ybWF0aXZlRWxlbWVudFR5cGUoKSB7CisJCXJldHVybiBub3JtYXRpdmVFbGVtZW50VHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlKCkgeworCQlyZXR1cm4gZWxlbWVudFR5cGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ2FudmFzTWFuYWdlci5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ2FudmFzTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Yzc2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9DYW52YXNNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyNTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uTGVmdFBhbmVsQ2FudmFzSXRlbXM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cC5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudmVyaWZpY2F0b3IuVmZWZXJpZmljYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0VHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLlN0YWxlRWxlbWVudFJlZmVyZW5jZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5pbnRlcmFjdGlvbnMuQWN0aW9uczsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKKworaW1wb3J0IGNvbS5yZWxldmFudGNvZGVzLmV4dGVudHJlcG9ydHMuTG9nU3RhdHVzOworCitwdWJsaWMgZmluYWwgY2xhc3MgQ2FudmFzTWFuYWdlciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFORUxfRUxFTUVOVF9OQU1FX1BSRUZJWCA9ICJsZWZ0YmFyLXNlY3Rpb24tY29udGVudC1pdGVtLSI7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDYW52YXNFbGVtZW50PiBjYW52YXNFbGVtZW50czsKKwlwcml2YXRlIEFjdGlvbnMgYWN0aW9uczsKKwlwcml2YXRlIFdlYkVsZW1lbnQgY2FudmFzOworCXByaXZhdGUgaW50IHJlZHVjZUNhbnZhc1dpZHRoRmFjdG9yOworCS8vIE9mZnNldHMgQXJlIHVzZWQgdG8gZmluZCB1cHBlciByaWdodCBjb3JuZXIgb2YgY2FudmFzIGVsZW1lbnQgaW4gb3JkZXIgdG8KKwkvLyBjb25uZWN0IGxpbmtzCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTlZBU19FTEVNRU5UX1lfT0ZGU0VUID0gNDA7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTlZBU19FTEVNRU5UX1hfT0ZGU0VUID0gMjE7IC8vIDE0IC0gMjcKKworCXByaXZhdGUgQ2FudmFzTWFuYWdlcigpIHsKKwkJY2FudmFzRWxlbWVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWFjdGlvbnMgPSBuZXcgQWN0aW9ucyhHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSk7CisvLwkJY2FudmFzID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkdlbmVyYWxDYW52YXNJdGVtcy5DQU5WQVMuZ2V0VmFsdWUoKSk7CisJCWNhbnZhcyA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JDbGFzc05hbWVWaXNpYmlsaXR5KCJ3LXNkYy1kZXNpZ25lci1jYW52YXMiKTsKKwkJdHJ5IHsKKwkJCVdlYkVsZW1lbnQgd2ViRWxlbWVudCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5HZW5lcmFsQ2FudmFzSXRlbXMuQ0FOVkFTX1JJR0hUX1BBTkVMLmdldFZhbHVlKCkpOworCQkJcmVkdWNlQ2FudmFzV2lkdGhGYWN0b3IgPSB3ZWJFbGVtZW50LmdldFNpemUoKS53aWR0aDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJlZHVjZUNhbnZhc1dpZHRoRmFjdG9yID0gMDsKKwkJfQorCX0KKwkKKworCXB1YmxpYyBzdGF0aWMgQ2FudmFzTWFuYWdlciBnZXRDYW52YXNNYW5hZ2VyKCkgeworCQlyZXR1cm4gbmV3IENhbnZhc01hbmFnZXIoKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxDYW52YXNFbGVtZW50PiBnZXRDYW52YXNFbGVtZW50cygpIHsKKwkJcmV0dXJuIGNhbnZhc0VsZW1lbnRzLnZhbHVlcygpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZENhbnZhc0VsZW1lbnQoQ2FudmFzRWxlbWVudCBlbGVtZW50KSB7CisJCWNhbnZhc0VsZW1lbnRzLnB1dChlbGVtZW50LmdldFVuaXF1ZUlkKCksIGVsZW1lbnQpOworCX0KKworCXByaXZhdGUgdm9pZCBtb3ZlRWxlbWVudE9uQ2FudmFzKENhbnZhc0VsZW1lbnQgY2FudmFzRWxlbWVudCwgSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBuZXdMb2NhdGlvbikKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLnNsZWVwKDUwMCk7CisJCWFjdGlvbnMubW92ZVRvRWxlbWVudChjYW52YXMsIGNhbnZhc0VsZW1lbnQuZ2V0TG9jYXRpb24oKS5sZWZ0LCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkucmlnaHQpOworCQlhY3Rpb25zLmNsaWNrQW5kSG9sZCgpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBuZXdMb2NhdGlvbi5sZWZ0LCBuZXdMb2NhdGlvbi5yaWdodCk7CisJCWFjdGlvbnMucmVsZWFzZSgpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJY2FudmFzRWxlbWVudC5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVUb0ZyZWVMb2NhdGlvbihTdHJpbmcgY29udGFpbmVyTmFtZSkgeworCQlpbnQgbWF4V2FpdCA9IDUwMDA7CisJCWludCBzdW1PZldhaXRpbmcgPSAwOworCQlpbnQgbmFwUGVyaW9kID0gMjAwOworCQlib29sZWFuIGlzS2VlcFdhaXRpbmcgPSBmYWxzZTsKKwkJd2hpbGUgKCFpc0tlZXBXYWl0aW5nKSB7CisJCQlJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGZyZWVQb3NpdGlvbiA9IGdldEZyZWVQb3NpdGlvbigpOworCQkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGNhbnZhcywgZnJlZVBvc2l0aW9uLmxlZnQsIGZyZWVQb3NpdGlvbi5yaWdodCk7CisJCQlhY3Rpb25zLmNsaWNrQW5kSG9sZCgpOworCQkJYWN0aW9ucy5yZWxlYXNlKCk7CisJCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJCUdlbmVyYWxVSVV0aWxzLnNsZWVwKG5hcFBlcmlvZCk7CisJCQlpc0tlZXBXYWl0aW5nID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJzZWxlY3RlZENvbXBUaXRsZSIpLmdldFRleHQoKQorCQkJCQkuZXF1YWxzKGNvbnRhaW5lck5hbWUpOworCQkJc3VtT2ZXYWl0aW5nICs9IG5hcFBlcmlvZDsKKwkJCWlmIChzdW1PZldhaXRpbmcgPiBtYXhXYWl0KSB7CisJCQkJQXNzZXJ0LmZhaWwoIkNhbid0IGNsaWNrIG9uIFZGIik7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBjbGlja09uQ2FudmFFbGVtZW50KENhbnZhc0VsZW1lbnQgY2FudmFzRWxlbWVudCkgeworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkubGVmdCwgY2FudmFzRWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0KTsKKwkJYWN0aW9ucy5jbGlja0FuZEhvbGQoKTsKKwkJYWN0aW9ucy5yZWxlYXNlKCk7CisJCWFjdGlvbnMucGVyZm9ybSgpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVFbGVtZW50T25DYW52YXMoQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJbW92ZUVsZW1lbnRPbkNhbnZhcyhjYW52YXNFbGVtZW50LCBnZXRGcmVlUG9zaXRpb24oKSk7CisJfQorCisJcHVibGljIHZvaWQgZGVsZXRlRWxlbWVudEZyb21DYW52YXMoQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkubGVmdCwgY2FudmFzRWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0KTsKKwkJYWN0aW9ucy5jbGljaygpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkdlbmVyYWxDYW52YXNJdGVtcy5ERUxFVEVfSU5TVEFOQ0VfQlVUVE9OLmdldFZhbHVlKCkpCisJCQkJLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCWNhbnZhc0VsZW1lbnRzLnJlbW92ZShjYW52YXNFbGVtZW50LmdldFVuaXF1ZUlkKCkpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCisJcHJpdmF0ZSBXZWJFbGVtZW50IGZpbmRDbGlja0VsZW1lbnQoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJaW50IGF0dGVtcHRzID0gMDsKKwkJd2hpbGUgKGF0dGVtcHRzIDwgMikgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGRhdGFUZXN0SWQpOworCQkJfSBjYXRjaCAoU3RhbGVFbGVtZW50UmVmZXJlbmNlRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJCWF0dGVtcHRzKys7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIENhbnZhc0VsZW1lbnQgY3JlYXRlRWxlbWVudE9uQ2FudmFzKFN0cmluZyBlbGVtZW50TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZpbmFsIFN0cmluZyBlbGVtZW50RGF0YVRlc3RJZCA9IExFRlRfUEFORUxfRUxFTUVOVF9OQU1FX1BSRUZJWCArIGVsZW1lbnROYW1lOworCQl0cnkgeworCQkJV2ViRWxlbWVudCBlbGVtZW50ID0gZmluZENsaWNrRWxlbWVudChlbGVtZW50RGF0YVRlc3RJZCk7CisJCQlJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGZyZWVQb3NpdGlvbiA9IGdldEZyZWVQb3NpdGlvbigpOworCQkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGVsZW1lbnQsIDAsIDApOworCQkJYWN0aW9ucy5jbGlja0FuZEhvbGQoKTsKKwkJCWFjdGlvbnMubW92ZVRvRWxlbWVudChjYW52YXMsIGZyZWVQb3NpdGlvbi5sZWZ0LCBmcmVlUG9zaXRpb24ucmlnaHQpOworCQkJYWN0aW9ucy5yZWxlYXNlKCk7CisJCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJCVN0cmluZyB1bmlxdWVJZCA9IGVsZW1lbnREYXRhVGVzdElkICsgIl8iICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKwkJCUNhbnZhc0VsZW1lbnQgY2FudmFzRWxlbWVudCA9IG5ldyBDYW52YXNFbGVtZW50KHVuaXF1ZUlkLCBmcmVlUG9zaXRpb24sIGVsZW1lbnREYXRhVGVzdElkKTsKKwkJCWFkZENhbnZhc0VsZW1lbnQoY2FudmFzRWxlbWVudCk7CisJCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5QQVNTLAorCQkJCQlTdHJpbmcuZm9ybWF0KCJlbGVtZW50ICVzIGlzIGluIGNhbnZhcyBub3cuLiIsIGVsZW1lbnROYW1lKSk7CisJCQlyZXR1cm4gY2FudmFzRWxlbWVudDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgY3JlYXRlIGVsZW1lbnQgb24gY2FudmFzIik7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBDYW52YXNFbGVtZW50IGNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhMZWZ0UGFuZWxDYW52YXNJdGVtcyBjYW52YXNJdGVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhjYW52YXNJdGVtLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRGcmVlUG9zaXRpb24oKSB7CisJCUltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gcmFuZG9tUG9zaXRpb24gPSBudWxsOworCQlib29sZWFuIGZyZWVQb3NpdGlvbiA9IGZhbHNlOworCQlpbnQgbWluU3BhY2UgPSAxNTA7CisJCXdoaWxlICghZnJlZVBvc2l0aW9uKSB7CisJCQlJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IHRlbXBSYW5kb21Qb3NpdGlvbiA9IGdldFJhbmRvbVBvc2l0aW9uKCk7CisJCQlmcmVlUG9zaXRpb24gPSAhY2FudmFzRWxlbWVudHMudmFsdWVzKCkuc3RyZWFtKCkubWFwKGUgLT4gZS5nZXRMb2NhdGlvbigpKQorCQkJCQkuZmlsdGVyKGUgLT4gTWF0aC5hYnMoZS5sZWZ0IC0gdGVtcFJhbmRvbVBvc2l0aW9uLmxlZnQpIDwgbWluU3BhY2UKKwkJCQkJCQkmJiBNYXRoLmFicyhlLnJpZ2h0IC0gdGVtcFJhbmRvbVBvc2l0aW9uLnJpZ2h0KSA8IG1pblNwYWNlKQorCQkJCQkuZmluZEFueSgpLmlzUHJlc2VudCgpOworCQkJcmFuZG9tUG9zaXRpb24gPSB0ZW1wUmFuZG9tUG9zaXRpb247CisJCX0KKwkJcmV0dXJuIHJhbmRvbVBvc2l0aW9uOworCX0KKworCXByaXZhdGUgSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRSYW5kb21Qb3NpdGlvbigpIHsKKwkJaW50IGVkZ2VCdWZmZXIgPSA1MDsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJaW50IHhFbGVtZW50ID0gcmFuZG9tLm5leHRJbnQoY2FudmFzLmdldFNpemUoKS53aWR0aCAtIDIgKiBlZGdlQnVmZmVyIC0gcmVkdWNlQ2FudmFzV2lkdGhGYWN0b3IpICsgZWRnZUJ1ZmZlcjsKKwkJaW50IHlFbGVtZW50ID0gcmFuZG9tLm5leHRJbnQoY2FudmFzLmdldFNpemUoKS5oZWlnaHQgLSAyICogZWRnZUJ1ZmZlcikgKyBlZGdlQnVmZmVyOworCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4oeEVsZW1lbnQsIHlFbGVtZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsaW5rRWxlbWVudHMoQ2FudmFzRWxlbWVudCBmaXJzdEVsZW1lbnQsIENhbnZhc0VsZW1lbnQgc2Vjb25kRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRyYXdTaW1wbGVMaW5rKGZpcnN0RWxlbWVudCwgc2Vjb25kRWxlbWVudCk7CisJCXNlbGVjdFJlcUFuZENhcEFuZENvbm5lY3QoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VsZWN0UmVxQW5kQ2FwQW5kQ29ubmVjdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTZWxlY3QgRmlyc3QgQ2FwCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRzTGlzdEJ5RGF0YVRlc3RJZChEYXRhVGVzdElkRW51bS5MaW5rTWVudUl0ZW1zLkxJTktfSVRFTV9DQVAuZ2V0VmFsdWUoKSkuZ2V0KDApCisJCQkJLmNsaWNrKCk7CisJCS8vIFNlbGVjdCBGaXJzdCBSZXEKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudHNMaXN0QnlEYXRhVGVzdElkKERhdGFUZXN0SWRFbnVtLkxpbmtNZW51SXRlbXMuTElOS19JVEVNX1JFUS5nZXRWYWx1ZSgpKS5nZXQoMCkKKwkJCQkuY2xpY2soKTsKKwkJLy8gQ29ubmVjdAorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTGlua01lbnVJdGVtcy5DT05ORUNUX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZHJhd1NpbXBsZUxpbmsoQ2FudmFzRWxlbWVudCBmaXJzdEVsZW1lbnQsIENhbnZhc0VsZW1lbnQgc2Vjb25kRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludCB5T2Zmc2V0ID0gQ0FOVkFTX0VMRU1FTlRfWV9PRkZTRVQ7CisJCWludCB4T2Zmc2V0ID0gQ0FOVkFTX0VMRU1FTlRfWF9PRkZTRVQ7CisKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGNhbnZhcywgZmlyc3RFbGVtZW50LmdldExvY2F0aW9uKCkubGVmdCArIHhPZmZzZXQsIGZpcnN0RWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0IC0geU9mZnNldCk7CisJCWFjdGlvbnMuY2xpY2tBbmRIb2xkKCk7CisJCWFjdGlvbnMubW92ZVRvRWxlbWVudChjYW52YXMsIHNlY29uZEVsZW1lbnQuZ2V0TG9jYXRpb24oKS5sZWZ0ICsgeE9mZnNldCwgc2Vjb25kRWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0IC0geU9mZnNldCk7CisJCWFjdGlvbnMucmVsZWFzZSgpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJR2VuZXJhbFVJVXRpbHMudWx0aW1hdGVXYWl0KCk7CisJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sIFN0cmluZy5mb3JtYXQoIkVsZW1lbnRzICVzIGFuZCAlcyBub3cgY29ubmVjdGVkIiwgZmlyc3RFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkuc3BsaXQoIi0iKVs0XSwgc2Vjb25kRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLnNwbGl0KCItIilbNF0pKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHVwZGF0ZUVsZW1lbnROYW1lSW5DYW52YXMoQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50LCBTdHJpbmcgbmV3SW5zdGFuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkubGVmdCwgY2FudmFzRWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0KTsKKwkJYWN0aW9ucy5jbGljaygpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJV2ViRWxlbWVudCB1cGRhdGVJbnN0YW5jZU5hbWUgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5pZCgiZWRpdFBlbmNpbCIpKTsKKwkJdXBkYXRlSW5zdGFuY2VOYW1lLmNsaWNrKCk7CisJCVdlYkVsZW1lbnQgaW5zdGFuY2VOYW1lRmllbGQgPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uR2VuZXJhbENhbnZhc0l0ZW1zLklOU1RBTkNFX05BTUVfRklFTEQuZ2V0VmFsdWUoKSk7CisJCVN0cmluZyBvbGRJbnN0YW5jZU5hbWUgPSBpbnN0YW5jZU5hbWVGaWVsZC5nZXRUZXh0KCk7CisJCWluc3RhbmNlTmFtZUZpZWxkLmNsZWFyKCk7CisJCWluc3RhbmNlTmFtZUZpZWxkLnNlbmRLZXlzKG5ld0luc3RhbmNlTmFtZSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJcmV0dXJuIG9sZEluc3RhbmNlTmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9DYXRhbG9nRmlsdGVyVGl0bGVzRW51bS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ2F0YWxvZ0ZpbHRlclRpdGxlc0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM1YjUxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ2F0YWxvZ0ZpbHRlclRpdGxlc0VudW0uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgZW51bSBDYXRhbG9nRmlsdGVyVGl0bGVzRW51bSB7CisKKwlUWVBFKCJ0eXBlRmlsdGVyVGl0bGUiKSwgQ0FURUdPUklFUygiY2F0ZWdvcmllc0ZpbHRlclRpdGxlIiksIFNUQVRVUygic3RhdHVzRmlsdGVyVGl0bGUiKTsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXByaXZhdGUgQ2F0YWxvZ0ZpbHRlclRpdGxlc0VudW0oU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0NoZWNrQm94U3RhdHVzRW51bS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvQ2hlY2tCb3hTdGF0dXNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhMTdlZQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0NoZWNrQm94U3RhdHVzRW51bS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK3B1YmxpYyBlbnVtIENoZWNrQm94U3RhdHVzRW51bSB7CisJQ0hFQ0tPVVQoIiIsICJjaGVja2JveC1jaGVja291dCIpLCAKKwlDSEVDS0lOKCIiLCAiY2hlY2tib3gtY2hlY2tpbiIpLCAKKwlSRUFEWV9GT1JfVEVTVElORygiY2hlY2tib3gtcmVhZHlmb3J0ZXN0aW5nIiwiY2hlY2tib3gtMSIpLCAKKwlJTl9URVNUSU5HKCJjaGVja2JveC1pbnRlc3RpbmciLCAiY2hlY2tib3gtMiIpLCAKKwlXQUlUSU5HX0ZPUl9ESVNUUklCVVRJT04oIiIsICJjaGVja2JveC13YWl0aW5nZm9yYXBwcm92YWwiKSwgCisJRElTVFJJQlVUSU9OX1JFSkVDVEVEKCIiLCAiY2hlY2tib3gtZGlzdHJpYnV0aW9ucmVqZWN0ZWQiKSwgCisJRElTVFJJQlVUSU9OX0FQUFJPVkVEKCIiLCAiY2hlY2tib3gtZGlzdHJpYnV0aW9uYXBwcm92ZWQiKSwgCisJQ0VSVElGSUVEKCJjaGVja2JveC1jZXJ0aWZpZWQiLCAiY2hlY2tib3gtMyIpLCAKKwlESVNUUklCVVRFRCgiIiwgImNoZWNrYm94LTQiKSwgCisJSU5fREVTSUdOKCIiLCAiY2hlY2tib3gtMCIpOworCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWUyOworCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ1ZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWUyOworCX0KKworCXByaXZhdGUgQ2hlY2tCb3hTdGF0dXNFbnVtKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHZhbHVlMikgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWUyID0gdmFsdWUyOworCX0KK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0NyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9DcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWM1MDIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9DcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK3B1YmxpYyBlbnVtIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtIHsKKworCUlNUE9SVF9WRiwgSU1QT1JUX1ZGQywgSU1QT1JUX0NQLCBJTVBPUlRfVkwsIENSRUFURV9WRiwgQ1JFQVRFX1NFUlZJQ0UsIENSRUFURV9QUk9EVUNUOworCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9DcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0NyZWF0ZUFuZFVwZGF0ZVN0ZXBzRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTc0MDAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9DcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCisvLyBwdWJsaWMgZW51bSBDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0geworLy8gR0VORVJBTCgiR2VuZXJhbHN0ZXAiKSwKKy8vIElDT04oIkljb25zdGVwIiksCisvLyBERVBMT1lNRU5UX0FSVElGQUNUKCJEZXBsb3ltZW50IEFydGlmYWN0c3RlcCIpLAorLy8gSU5GT1JNQVRJT05fQVJUSUZBQ1QoIkluZm9ybWF0aW9uIEFydGlmYWN0c3RlcCIpLAorLy8gUFJPUEVSVElFUygiUHJvcGVydGllc3N0ZXAiKSwKKy8vIENPTVBPU0lUSU9OKCJDb21wb3NpdGlvbnN0ZXAiKSwKKy8vIEFDVElWSVRZX0xPRygiQWN0aXZpdHkgTG9nc3RlcCIpLAorLy8gREVQTE9ZTUVOVF9WSUVXKCJEZXBsb3ltZW50c3RlcCIpOworLy8KKy8vCisvLyBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKy8vCisvLyBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCl7CisvLyByZXR1cm4gdmFsdWU7CisvLyB9CisvLworLy8gcHJpdmF0ZSBDcmVhdGVBbmRVcGRhdGVTdGVwc0VudW0oU3RyaW5nIHZhbHVlKSB7CisvLyB0aGlzLnZhbHVlID0gdmFsdWU7CisvLyB9CisvLworLy8KKy8vIH0KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0RhdGFUZXN0SWRFbnVtLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9EYXRhVGVzdElkRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTkzZmMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9EYXRhVGVzdElkRW51bS5qYXZhCkBAIC0wLDAgKzEsMzgwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgZmluYWwgY2xhc3MgRGF0YVRlc3RJZEVudW0geworCXByaXZhdGUgRGF0YVRlc3RJZEVudW0oKSB7CisJfTsKKworCXB1YmxpYyBlbnVtIERhc2hib2FyZCB7CisJCUlNUE9SVF9BUkVBKCJpbXBvcnRCdXR0b25zQXJlYSIpLCAKKwkJQlVUVE9OX0FERF9WRigiY3JlYXRlUmVzb3VyY2VCdXR0b24iKSwgCisJCUJVVFRPTl9BRERfU0VSVklDRSgiY3JlYXRlU2VydmljZUJ1dHRvbiIpLCAKKwkJSU1QT1JUX1ZGQygiaW1wb3J0VkZDYnV0dG9uIiksIAorCQlJTVBPUlRfVkYoImltcG9ydFZGYnV0dG9uIiksIAorCQlJTVBPUlRfVkZDX0ZJTEUoImZpbGUtaW1wb3J0VkZDYnV0dG9uIiksIAorCQlJTVBPUlRfVkZfRklMRSgiZmlsZS1pbXBvcnRWRmJ1dHRvbiIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIERhc2hib2FyZChTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBlbnVtIExpZmVDeWxlQ2hhbmdlQnV0dG9ucyB7CisJCUNSRUFURSgiY3JlYXRlL3NhdmUiKSwgQ0hFQ0tfSU4oImNoZWNrX2luIiksIAorCQlTVUJNSVRfRk9SX1RFU1RJTkcoInN1Ym1pdF9mb3JfdGVzdGluZyIpLCAKKwkJU1RBUlRfVEVTVElORygic3RhcnRfdGVzdGluZyIpLCAKKwkJQUNDRVBUKCJhY2NlcHQiKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBMaWZlQ3lsZUNoYW5nZUJ1dHRvbnMoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwlwdWJsaWMgZW51bSBEaXN0cmlidXRpb25DaGFuZ2VCdXR0b25zIHsKKwkJQVBQUk9WRSgiYXBwcm92ZSIpLCBSRUpFQ1QoInJlamVjdCIpLCAKKwkJRElTVFJJQlVURSgiZGlzdHJpYnV0ZSIpLCAKKwkJTU9OSVRPUigibW9uaXRvciIpLCAKKwkJQVBQUk9WRV9NRVNTQUdFKCJjaGVja2luZGlhbG9nIiksIAorCQlSRV9ESVNUUklCVVRFKCJyZWRpc3RyaWJ1dGUiKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBEaXN0cmlidXRpb25DaGFuZ2VCdXR0b25zKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gSW5mb3JtYXRpb25hbEFydGlmYWN0cyB7CisJCUNMT1VEX1FVRVNUSU9OTkFJUkUoIkNsb3VkIFF1ZXN0aW9ubmFpcmUgKGNvbXBsZXRlZCkiKSwgCisJCUZFQVRVUkVTKCJGZWF0dXJlcyIpLCAKKwkJVkVORE9SX1RFU1RfUkVTVUxUKCJWZW5kb3IgVGVzdCBSZXN1bHQiKSwgCisJCVRFU1RfU0NSSVBUUygiVGVzdCBTY3JpcHRzIiksIAorCQlSRVNPVVJDRV9TRUNVUklUWV9URU1QTEFURSgiUmVzb3VyY2UgU2VjdXJpdHkgVGVtcGxhdGUiKSwgCisJCUhFQVRfVEVNUExBVEVfRlJPTV9WRU5ET1IoIkhFQVQgVGVtcGxhdGUgZnJvbSBWZW5kb3IiKSwKKwkJQ0FQQUNJVFkoIkNhcGFjaXR5Iik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgSW5mb3JtYXRpb25hbEFydGlmYWN0cyhTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCisJfQorCisJcHVibGljIGVudW0gTW9kYWxJdGVtcyB7CisJCUJST1dTRV9CVVRUT04oImJyb3dzZUJ1dHRvbiIpLCAKKwkJQUREKCJBZGQiKSwgCisJCURFU0NSSVBUSU9OKCJkZXNjcmlwdGlvbiIpLCAKKwkJU1VNQklUX0ZPUl9URVNUSU5HX01FU1NBR0UoImNoYW5nZUxpZmVDeWNsZU1lc3NhZ2UiKSwgCisJCU9LKCJPSyIpLCAKKwkJQ0FOQ0VMKCJDYW5jZWwiKSwgCisJCUFDQ0VQX1RFU1RJTkdfTUVTU0FHRSgiY2hlY2tpbmRpYWxvZyIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIE1vZGFsSXRlbXMoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwlwdWJsaWMgZW51bSBMZWZ0UGFuZWxDYW52YXNJdGVtcyB7CisJCUJMT0NLX1NUT1JBR0UoIkJsb2NrU3RvcmFnZSIpLCAKKwkJQ0lOREVSX1ZPTFVNRSgiQ2luZGVyVm9sdW1lIiksIAorCQlDT01QVVRFKCJDb21wdXRlIiksIAorCQlMT0FEX0JBTEFOQ0VSKCJMb2FkQmFsYW5jZXIiKSwgCisJCU5PVkFfU0VSVkVSKCJOb3ZhU2VydmVyIiksIAorCQlPQkpFQ1RfU1RPUkFHRSgiT2JqZWN0U3RvcmFnZSIpLCAKKwkJTkVVVFJPTl9QT1JUKCJOZXV0cm9uUG9ydCIpLCAKKwkJUE9SVCgiUG9ydCIpLCAKKwkJREFUQUJBU0UoIkRhdGFiYXNlIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgTGVmdFBhbmVsQ2FudmFzSXRlbXMoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKwl9CisKKwlwdWJsaWMgZW51bSBMaW5rTWVudUl0ZW1zIHsKKwkJQ0FOQ0VMX0JVVFRPTigibGluay1tZW51LWJ1dHRvbi1jYW5jZWwiKSwgCisJCUNPTk5FQ1RfQlVUVE9OKCJsaW5rLW1lbnUtYnV0dG9uLWNvbm5lY3QiKSwgCisJCUxJTktfSVRFTV9DQVAoImxpbmstaXRlbS1jYXBhYmlsaXRpZXMiKSwgCisJCUxJTktfSVRFTV9SRVEoImxpbmstaXRlbS1yZXF1aXJlbWVudHMiKSwgCisJCUxJTktfTUVOVSgibGluay1tZW51LW9wZW4iKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBMaW5rTWVudUl0ZW1zKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisJfQorCisJcHVibGljIGVudW0gR2VuZXJhbENhbnZhc0l0ZW1zIHsKKwkJQ0FOVkFTKCJjYW52YXMiKSwgCisJCUNBTlZBU19SSUdIVF9QQU5FTCgidy1zZGMtZGVzaWduZXItc2lkZWJhci1oZWFkIiksIAorCQlERUxFVEVfSU5TVEFOQ0VfQlVUVE9OKCJlLXNkYy1zbWFsbC1pY29uLWRlbGV0ZSIpLCAKKwkJVVBEQVRFX0lOU1RBTkNFX05BTUUoImUtc2RjLXNtYWxsLWljb24tdXBkYXRlIiksIAorCQlJTlNUQU5DRV9OQU1FX0ZJRUxEKCJpbnN0YW5jZU5hbWUiKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBHZW5lcmFsQ2FudmFzSXRlbXMoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKworCX0KKworCXB1YmxpYyBlbnVtIFJlc291cmNlTWV0YWRhdGFFbnVtIHsKKwkJUkVTT1VSQ0VfTkFNRSgibmFtZSIpLCAKKwkJREVTQ1JJUFRJT04oImRlc2NyaXB0aW9uIiksIAorCQlDQVRFR09SWSgic2VsZWN0R2VuZXJhbENhdGVnb3J5IiksIAorCQlWRU5ET1JfTkFNRSgidmVuZG9yTmFtZSIpLAorCQlWRU5ET1JfUkVMRUFTRSgidmVuZG9yUmVsZWFzZSIpLCAKKwkJVEFHUygiaS1zZGMtdGFnLWlucHV0IiksIAorCQlDT05UQUNUX0lEKCJjb250YWN0SWQiKSwgCisJCUlDT04oIiBpY29uQm94Iik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgUmVzb3VyY2VNZXRhZGF0YUVudW0oU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKworCX0KKworCXB1YmxpYyBlbnVtIEdlbmVyYWxFbGVtZW50c0VudW0geworCQlDUkVBVEVfQlVUVE9OKCJjcmVhdGUvc2F2ZSIpLCAKKwkJQ0hFQ0tJTl9CVVRUT04oImNoZWNrX2luIiksIAorCQlTVUJNSVRfRk9SX1RFU1RJTkdfQlVUVE9OKCJzdWJtaXRfZm9yX3Rlc3RpbmciKSwgCisJCURFTEVURV9WRVJTSU9OX0JVVFRPTigiZGVsZXRlX3ZlcnNpb24iKSwgCisJCVJFVkVSVF9CVVRUT04oInJldmVydCIpLCAKKwkJTElGRUNZQ0xFX1NUQVRFKCJsaWZlY3ljbGVzdGF0ZSIpLCAKKwkJVkVSU0lPTl9IRUFERVIoInZlcnNpb25IZWFkZXIiKTsKKworCQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJcmV0dXJuIHZhbHVlOworCQl9CisKKwkJcHJpdmF0ZSBHZW5lcmFsRWxlbWVudHNFbnVtKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwl9CisKKwlwdWJsaWMgZW51bSBBcnRpZmFjdFBhZ2VFbnVtIHsKKworCQlBRERfSU5GT1JNQVRJT05BTF9BUlRJRkFDVCgiYWRkLWluZm9ybWF0aW9uLWFydGlmYWN0LWJ1dHRvbiIpLCAKKwkJQUREX0RFUExPWU1FTlRfQVJUSUZBQ1QoImFkZC1kZXBsb3ltZW50LWFydGlmYWN0LWJ1dHRvbiIpLCAKKwkJQUREX0FOT1RIRVJfQVJUSUZBQ1QoImFkZC1hbm90aGVyLWFydGlmYWN0LWJ1dHRvbiIpLCAKKwkJRURJVF9BUlRJRkFDVCgiZWRpdF8iKSwgCisJCURFTEVURV9BUlRJRkFDVCgiZGVsZXRlXyIpLCAKKwkJRE9XTkxPQURfQVJUSUZBQ1QoImRvd25sb2FkXyIpLCAKKwkJR0VUX0RFUExPWU1FTlRfQVJUSUZBQ1RfREVTQ1JJUFRJT04oImRlc2NyaXB0aW9uIiksIAorCQlHRVRfSU5GT1JNQVRJT05BTF9BUlRJRkFDVF9ERVNDUklQVElPTigiRGVzY3JpcHRpb24iKQorCisJCTsKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgQXJ0aWZhY3RQYWdlRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBlbnVtIFByb3BlcnRpZXNQYWdlRW51bSB7CisKKwkJQUREX05FV19QUk9QRVJUWSgiYWRkR3JleSIpLCAKKwkJRURJVF9QUk9QRVJUWSgiZWRpdF8iKSwgCisJCURFTEVURV9QUk9QRVJUWSgiZGVsZXRlXyIpLCAKKwkJUFJPUEVSVFlfTkFNRSgicHJvcGVydHlOYW1lIiksIAorCQlQUk9QRVJUWV9WQUxVRSgiZGVmYXVsdHZhbHVlIiksIAorCQlQUk9QRVJUWV9ERVNDUklQVElPTigiZGVzY3JpcHRpb24iKSwKKwkJUFJPUEVSVFlfVFlQRSgicHJvcGVydHlUeXBlIiksIAorCQlBREQoIkFkZCIpLCAKKwkJQ0FOQ0VMKCJDYW5jZWwiKSwgCisJCURPTkUoIkRvbmUiKSwgCisJCVBST1BFUlRZX1JPVygicHJvcGVydHlSb3ciKSwgCisJCVNBVkUoIlNhdmUiKTsKKwkJCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIFByb3BlcnRpZXNQYWdlRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBlbnVtIE1haW5NZW51QnV0dG9ucyB7CisJCUhPTUVfQlVUVE9OKCJtYWluLW1lbnUtYnV0dG9uLWhvbWUiKSwgCisJCUNBVEFMT0dfQlVUVE9OKCJtYWluLW1lbnUtYnV0dG9uLWNhdGFsb2ciKSwgCisJCU9OQk9BUkRfQlVUVE9OKCJtYWluLW1lbnUtYnV0dG9uLW9uYm9hcmQiKTsKKwkJCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIE1haW5NZW51QnV0dG9ucyhTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCisJfQorCisJcHVibGljIGVudW0gTWVudU9wdGlvbnNFbnVtIHsKKwkJRURJVCgiRWRpdCIpLCAKKwkJQ0hFQ0tfSU4oIkNoZWNrIGluIiksIAorCQlDSEVDS19PVVQoIkNoZWNrIG91dCIpLCAKKwkJVklFVygiVmlldyIpLCAKKwkJU1VCTUlUX0ZPUl9URVNUKCJTdWJtaXQgRm9yIFRlc3QiKSwgCisJCUFDQ0VQVCgiQWNjZXB0IiksIAorCQlSRUpFQ1QoIlJlamVjdCIpLCAKKwkJU1RBUlRfVEVTVCgiU3RhcnQgdGVzdCIpLCAKKwkJRElTVFJFQlVURSgiRGlzdHJpYnV0ZSIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIE1lbnVPcHRpb25zRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCX0KKworCXB1YmxpYyBlbnVtIFN0ZXBzRW51bSB7CisJCUdFTkVSQUwoIkdlbmVyYWxzdGVwIiksIAorCQlJQ09OKCJJY29uc3RlcCIpLCAKKwkJREVQTE9ZTUVOVF9BUlRJRkFDVCgiRGVwbG95bWVudCBBcnRpZmFjdHN0ZXAiKSwgCisJCUlORk9STUFUSU9OX0FSVElGQUNUKCJJbmZvcm1hdGlvbiBBcnRpZmFjdHN0ZXAiKSwgCisJCVBST1BFUlRJRVMoIlByb3BlcnRpZXNzdGVwIiksIAorCQlDT01QT1NJVElPTigiQ29tcG9zaXRpb25zdGVwIiksIAorCQlBQ1RJVklUWV9MT0coIkFjdGl2aXR5IExvZ3N0ZXAiKSwgCisJCURFUExPWU1FTlRfVklFVygiRGVwbG95bWVudHN0ZXAiKSwgCisJCVRPU0NBX0FSVElGQUNUUygiVE9TQ0EgQXJ0aWZhY3Rzc3RlcCIpLCAKKwkJTU9OSVRPUigiTW9uaXRvciBzdGVwIik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgU3RlcHNFbnVtKFN0cmluZyB2YWx1ZSkgeworCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9CisKKwl9CisKKwlwdWJsaWMgZW51bSBBcnRpZmFjdFBvcHVwIHsKKworCQlCUk9XU0UoImJyb3dzZUJ1dHRvbiIpLCAKKwkJQVJUSUZBQ1RfREVTQ1JJUFRJT04oImRlc2NyaXB0aW9uIiksIAorCQlBUlRJRkFDVF9MQUJFTCgic2VsZWN0QXJ0aWZhY3QiKSwgCisJCUFSVElGQUNUX1RZUEUoImFydGlmYWN0dHlwZSIpLCAKKwkJQUREX0JVVFRPTigiQWRkIiksIAorCQlDQU5DRUxfQlVUVE9OKCJDYW5jZWwiKSwgCisJCVVQREFURV9CVVRUT04oIlVwZGF0ZSIpOworCisJCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKworCQlwcml2YXRlIEFydGlmYWN0UG9wdXAoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0KKworCX0KKworCXB1YmxpYyBlbnVtIFNlcnZpY2VNZXRhZGF0YUVudW0geworCQlTRVJWSUNFX05BTUUoIm5hbWUiKSwgCisJCURFU0NSSVBUSU9OKCJkZXNjcmlwdGlvbiIpLCAKKwkJQ0FURUdPUlkoInNlbGVjdEdlbmVyYWxDYXRlZ29yeSIpLCAKKwkJUFJPSkVDVF9DT0RFKCJwcm9qZWN0Q29kZSIpLCAKKwkJVEFHUygiaS1zZGMtdGFnLWlucHV0IiksIAorCQlDT05UQUNUX0lEKCJjb250YWN0SWQiKSwgCisJCUlDT04oIiBpY29uQm94Iik7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCisJCXByaXZhdGUgU2VydmljZU1ldGFkYXRhRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9HZW5lcmFsQ2FudmFzSXRlbXNFbnVtLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9HZW5lcmFsQ2FudmFzSXRlbXNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4ZjljYgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL0dlbmVyYWxDYW52YXNJdGVtc0VudW0uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgZW51bSBHZW5lcmFsQ2FudmFzSXRlbXNFbnVtIHsKKwlDQU5WQVMoImNhbnZhcyIpLCBDQU5WQVNfUklHSFRfUEFORUwoInctc2RjLWRlc2lnbmVyLXNpZGViYXItaGVhZCIpLCBERUxFVEVfSU5TVEFOQ0VfQlVUVE9OKAorCQkJImUtc2RjLXNtYWxsLWljb24tZGVsZXRlIikKKworCTsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXByaXZhdGUgR2VuZXJhbENhbnZhc0l0ZW1zRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvTGlmZUN5Y2xlU3RhdGVFbnVtLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9MaWZlQ3ljbGVTdGF0ZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI3NDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvTGlmZUN5Y2xlU3RhdGVFbnVtLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGVudW0gTGlmZUN5Y2xlU3RhdGVFbnVtIHsKKworCUNIRUNLT1VUKCJJTiBERVNJR04gQ0hFQ0sgT1VUIiksIAorCUNIRUNLSU4oIklOIERFU0lHTiBDSEVDSyBJTiIpLCAKKwlSRUFEWV9GT1JfVEVTVElORygiUkVBRFkgRk9SIFRFU1RJTkciKSwgCisJSU5fVEVTVElORygiSU4gVEVTVElORyIpLCAKKwlXQUlUSU5HX0ZPUl9ESVNUUklCVVRJT04oIldBSVRJTkcgRk9SIERJU1RSSUJVVElPTiIpLCAKKwlESVNUUklCVVRJT05fUkVKRUNURUQoIkRJU1RSSUJVVElPTiBSRUpFQ1RFRCIpLCAKKwlESVNUUklCVVRJT05fQVBQUk9WRUQoIkRJU1RSSUJVVElPTiBBUFBST1ZFRCIpLCAKKwlDRVJUSUZJRUQoIkNFUlRJRklFRCIpLCAKKwlESVNUUklCVVRFRCgiRElTVFJJQlVURUQiKTsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCXByaXZhdGUgU3RyaW5nIHZhbHVlMjsKKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcml2YXRlIExpZmVDeWNsZVN0YXRlRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvTWVudU9wdGlvbnNFbnVtLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9NZW51T3B0aW9uc0VudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjNhYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvTWVudU9wdGlvbnNFbnVtLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGVudW0gTWVudU9wdGlvbnNFbnVtIHsKKworCUVESVQoIkVkaXQiKSwgCisJQ0hFQ0tfSU4oIkNoZWNrIGluIiksIAorCUNIRUNLX09VVCgiQ2hlY2sgb3V0IiksIAorCVZJRVcoIlZpZXciKSwgCisJU1VCTUlUX0ZPUl9URVNUKCJTdWJtaXQgRm9yIFRlc3QiKSwKKyAgICBBQ0NFUFQoIkFjY2VwdCIpLCAKKyAgICBSRUpFQ1QoIlJlamVjdCIpLCAKKyAgICBTVEFSVF9URVNUKCJTdGFydCB0ZXN0IiksIAorICAgIERJU1RSRUJVVEUoIkRpc3RyaWJ1dGUiKTsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXByaXZhdGUgTWVudU9wdGlvbnNFbnVtKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Qcm9wZXJ0eUluZm8uamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Byb3BlcnR5SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTA5M2UKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Qcm9wZXJ0eUluZm8uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlByb3BlcnR5VHlwZUVudW07CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUluZm8geworCisJcHVibGljIFByb3BlcnR5SW5mbygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHlJbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBkZXNjLCBQcm9wZXJ0eVR5cGVFbnVtIHR5cGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzYzsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCXByaXZhdGUgUHJvcGVydHlUeXBlRW51bSB0eXBlOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIFByb3BlcnR5VHlwZUVudW0gZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShQcm9wZXJ0eVR5cGVFbnVtIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1Jlc291cmNlQ2F0ZWdvcmllc05hbWVFbnVtLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZUNhdGVnb3JpZXNOYW1lRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTQ5M2YKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9SZXNvdXJjZUNhdGVnb3JpZXNOYW1lRW51bS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK3B1YmxpYyBlbnVtIFJlc291cmNlQ2F0ZWdvcmllc05hbWVFbnVtIHsKKwkKKwlHRU5FUklDKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmdlbmVyaWMiKSwKKwlORVRXT1JLX0NPTk5FQ1RJVklUWSgiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5uZXR3b3JrY29ubmVjdGl2aXR5IiksCisJTkVUV09SS19FTEVNRU5UUygiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5nZW5lcmljLm5ldHdvcmtlbGVtZW50cyIpLAorCUFCU1RSQUNUKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmdlbmVyaWMuYWJzdHJhY3QiKSwKKwlEQVRBQkFTRV9HRU5FUklDKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmdlbmVyaWMuZGF0YWJhc2UiKSwKKwlJTkZSQVNUUlVDVFVSRSgiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5nZW5lcmljLmluZnJhc3RydWN0dXJlIiksCisJVklSVFVBTF9MSU5LUygiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5uZXR3b3JrY29ubmVjdGl2aXR5LnZpcnR1YWxsaW5rcyIpLAorCUNPTk5FQ1RJT05fUE9JTlRTKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5Lm5ldHdvcmtjb25uZWN0aXZpdHkuY29ubmVjdGlvbnBvaW50cyIpLAorCU5FVFdPUktMNCgiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5uZXR3b3JrbDQrIiksCisJQ09NTU9OX05FVFdPUktfUkVTT1VSQ0VTKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5Lm5ldHdvcmtsNCsuY29tbW9ubmV0d29ya3Jlc291cmNlcyIpLAorCUFQUExJQ0FUSU9OTDQoImNoZWNrYm94LXJlc291cmNlbmV3Y2F0ZWdvcnkuYXBwbGljYXRpb25sNCsiKSwKKwlXRUJfU0VSVkVSKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmFwcGxpY2F0aW9ubDQrLndlYnNlcnZlciIpLAorCUFQUExJQ0FUSU9OX1NFUlZFUigiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5hcHBsaWNhdGlvbmw0Ky5hcHBsaWNhdGlvbnNlcnZlciIpLAorCUNBTExfQ09OVFJPTCgiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5hcHBsaWNhdGlvbmw0Ky5jYWxsY29udHJvbCIpLAorCUJPUkRFUl9FTEVNRU5UKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmFwcGxpY2F0aW9ubDQrLmJvcmRlcmVsZW1lbnQiKSwKKwlNRURJQV9TRVJWRVJTKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmFwcGxpY2F0aW9ubDQrLm1lZGlhc2VydmVycyIpLAorCURBVEFCQVNFKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmFwcGxpY2F0aW9ubDQrLmRhdGFiYXNlIiksCisJRklSRVdBTEwoImNoZWNrYm94LXJlc291cmNlbmV3Y2F0ZWdvcnkuYXBwbGljYXRpb25sNCsuZmlyZXdhbGwiKSwKKwlMT0FEX0JBTEFOQ0VSKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5LmFwcGxpY2F0aW9ubDQrLmxvYWRiYWxhbmNlciIpLAorCU5FVFdPUktfTDIzKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5Lm5ldHdvcmtsMi0zIiksCisJUm91dGVyKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5Lm5ldHdvcmtsMi0zLnJvdXRlciIpLAorCVdBTl9Db25uZWN0b3JzKCJjaGVja2JveC1yZXNvdXJjZW5ld2NhdGVnb3J5Lm5ldHdvcmtsMi0zLndhbmNvbm5lY3RvcnMiKSwKKwlMQU5fQ09OTkVDVE9SUygiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5uZXR3b3JrbDItMy5sYW5jb25uZWN0b3JzIiksCisJR0FURVdBWSgiY2hlY2tib3gtcmVzb3VyY2VuZXdjYXRlZ29yeS5uZXR3b3JrbDItMy5nYXRld2F5IiksCisJSU5GUkFTVFJVQ1RVUkVMMjMoImNoZWNrYm94LXJlc291cmNlbmV3Y2F0ZWdvcnkubmV0d29ya2wyLTMuaW5mcmFzdHJ1Y3R1cmUiKTsKKwkKKwkKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKwkKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCl7CisJCXJldHVybiB2YWx1ZTsKKwl9CisJCisJcHJpdmF0ZSBSZXNvdXJjZUNhdGVnb3JpZXNOYW1lRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKwkKKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZUNhdGVnb3JpZXNOYW1lRW51bS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvU2VydmljZUNhdGVnb3JpZXNOYW1lRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOWJiYTUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9TZXJ2aWNlQ2F0ZWdvcmllc05hbWVFbnVtLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlczsKKworcHVibGljIGVudW0gU2VydmljZUNhdGVnb3JpZXNOYW1lRW51bSB7CisKKwlORVRXT1JLX0wxMygiY2hlY2tib3gtc2VydmljZW5ld2NhdGVnb3J5Lm5ldHdvcmtsMS0zIiksIAorCVZPSVBDQUxMX0NPTlRST0woImNoZWNrYm94LXNlcnZpY2VuZXdjYXRlZ29yeS52b2lwY2FsbGNvbnRyb2wiKSwgCisJTkVUV09SS0w0KCJjaGVja2JveC1zZXJ2aWNlbmV3Y2F0ZWdvcnkubmV0d29ya2w0KyIpLAorCU1PQklMSVRZKCJjaGVja2JveC1zZXJ2aWNlbmV3Y2F0ZWdvcnkubW9iaWxpdHkiKTsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXByaXZhdGUgU2VydmljZUNhdGVnb3JpZXNOYW1lRW51bShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1R5cGVzRW51bS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvVHlwZXNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZjRkNQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1R5cGVzRW51bS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK3B1YmxpYyBlbnVtIFR5cGVzRW51bSB7CisKKwlSRVNPVVJDRSgiY2hlY2tib3gtcmVzb3VyY2UiKSwgCisJVkYoImNoZWNrYm94LXZmIiksIAorCVZGQygiY2hlY2tib3gtdmZjIiksIAorCUNQKCJjaGVja2JveC1jcCIpLCAKKwlWTCgiY2hlY2tib3gtdmwiKSwgCisJU0VSVklDRSgiY2hlY2tib3gtc2VydmljZSIpLCAKKwlQUk9EVUNUKCJjaGVja2JveC1wcm9kdWN0Iik7CisJCisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHJpdmF0ZSBUeXBlc0VudW0oU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1VzZXJDcmVkZW50aWFscy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvVXNlckNyZWRlbnRpYWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwZDI4NwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL1VzZXJDcmVkZW50aWFscy5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworCitwdWJsaWMgY2xhc3MgVXNlckNyZWRlbnRpYWxzIGV4dGVuZHMgVXNlciB7CisKKwkvLyBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKKwlwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKworCXB1YmxpYyBVc2VyQ3JlZGVudGlhbHMoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgZmlyc3RuYW1lLCBTdHJpbmcgbGFzdG5hbWUpIHsKKwkJc3VwZXIoKTsKKwkJc2V0VXNlcklkKHVzZXJJZCk7CisJCS8vIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKKwkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworCQlzZXRGaXJzdE5hbWUoZmlyc3RuYW1lKTsKKwkJc2V0TGFzdE5hbWUobGFzdG5hbWUpOworCX0KKworCXB1YmxpYyBVc2VyQ3JlZGVudGlhbHMoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLy8gcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKKwkvLyByZXR1cm4gdXNlck5hbWU7CisJLy8gfQorCS8vIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lKFN0cmluZyB1c2VyTmFtZSkgeworCS8vIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKKwkvLyB9CisJcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKwkJcmV0dXJuIHBhc3N3b3JkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9Xb3JrTW9kZS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvV29ya01vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTlmYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9kYXRhdHlwZXMvV29ya01vZGUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzOworCitwdWJsaWMgZW51bSBXb3JrTW9kZSB7CisJREVWLCBDRDsKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZGF0YXR5cGVzL2Vudmlyb25tZW50TG9jYWwgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnZpcm9ubWVudExvY2FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTNkZGYKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2RhdGF0eXBlcy9lbnZpcm9ubWVudExvY2FsCkBAIC0wLDAgKzEsMTAgQEAKKy8vVVJMIGRlc2lnbmVyCit1cmxEZXNpZ25lcj1odHRwOi8vMTcyLjIwLjQzLjEzNjo4MDgwL3NkYzEvcHJveHktZGVzaWduZXIxIy9kYXNoYm9hcmQKKy8vVVJMIHRlc3RlcgordXJsVGVzdGVyPWh0dHA6Ly8xNzIuMjAuNDMuMTM2OjgwODAvc2RjMS9wcm94eS10ZXN0ZXIxCisvL1VSTCBWYWdyYW50Cit1cmxEZXNpZ25lclZhZ3JhbnQ9aHR0cDovL2xvY2FsaG9zdDo4MTgxL3NkYzEvcHJveHktZGVzaWduZXIxIy9kYXNoYm9hcmQKKy8vVXJsU3RhZ2luZyAKK1VybFN0YWdpbmc9aHR0cHM6Ly93d3cuZS1hY2Nlc3MuYXR0LmNvbS9zZGNwc3RhZ2Uvc2RjMS9wb3J0YWwjL2Rhc2hib2FyZAorLy9VcmxBZG1pbgorVXJsQWRtaW49aHR0cDovLzE3Mi4yMC40My4xMzY6ODA4MC9zZGMxL3Byb3h5LWFkbWluMSMvYWRtaW5EYXNoYm9hcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYWRtaW53b3Jrc3BhY2UvQWRtaW5Vc2VyTWFuYWdtZW50LmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvYWRtaW53b3Jrc3BhY2UvQWRtaW5Vc2VyTWFuYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhMGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9hZG1pbndvcmtzcGFjZS9BZG1pblVzZXJNYW5hZ21lbnQuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuYWRtaW53b3Jrc3BhY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5BZG1pbldvcmtzcGFjZVVJVXRpbGllczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLlJlc291cmNlVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkRyaXZlcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PcmRlcmluZzsKKworcHVibGljIGNsYXNzIEFkbWluVXNlck1hbmFnbWVudCBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKwkvLworCS8vIHB1YmxpYyBBZG1pblVzZXJNYW5hZ21lbnQoKSB7CisJLy8gc3VwZXIobmV3IFRlc3ROYW1lKCksIEFkbWluVXNlck1hbmFnbWVudC5jbGFzcy5nZXROYW1lKCkpOworCS8vIH0KKworCXByaXZhdGUgV2ViRHJpdmVyIGRyaXZlciA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpOworCisJLy8gQ3JlYXRlIG5ldyBVU0VSX0lEIHVzZXIKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0VXNlcklkTmV3VXNlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVzZXJJZCA9IEFkbWluV29ya3NwYWNlVUlVdGlsaWVzLmRlZmluZU5ld1VzZXJJZCgidGgwNjk1Iik7CisJCVN0cmluZyByb2xlID0gQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuc2VsZWN0VXNlclJvbGUoImRlc2lnbmVyIik7CisJCUFkbWluV29ya3NwYWNlVUlVdGlsaWVzLmRlbGV0ZXVzZXIodXNlcklkKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJjcmVhdGVncmVlbiIpLmNsaWNrKCk7CisJCUFkbWluV29ya3NwYWNlVUlVdGlsaWVzLnR5cGVUb1NlYXJjaEJveCh1c2VySWQpOworCQlTdHJpbmcgY3JlYXRlZFVzZXJVc2VySWQgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInRkVVNFUl9JRCIpLmdldFRleHQoKTsKKwkJdXNlcklkLmVxdWFscyhjcmVhdGVkVXNlclVzZXJJZCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidGRMYXN0IEFjdGl2ZSIpLmdldFRleHQoKS5lcXVhbHMoIldhaXRpbmciKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJ0ZFJvbGUiKS5nZXRUZXh0KCkuZXF1YWxzKHJvbGUpOworCQlBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5kZWxldGV1c2VyKHVzZXJJZCk7CisKKwl9CisKKwkvLyBDcmVhdGUgbmV3IE1hY0lkIHVzZXIKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0TWFjSWROZXdVc2VyVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyBtYWNJZCA9IEFkbWluV29ya3NwYWNlVUlVdGlsaWVzLmRlZmluZU5ld1VzZXJJZCgibTEyMzQ1Iik7CisJCVN0cmluZyByb2xlID0gQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuc2VsZWN0VXNlclJvbGUoImRlc2lnbmVyIik7CisJCUFkbWluV29ya3NwYWNlVUlVdGlsaWVzLmRlbGV0ZXVzZXIobWFjSWQpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oImNyZWF0ZWdyZWVuIikuY2xpY2soKTsKKwkJQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMudHlwZVRvU2VhcmNoQm94KG1hY0lkKTsKKwkJU3RyaW5nIGNyZWF0ZWRVc2VyVXNlcklkID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJ0ZFVTRVJfSUQiKS5nZXRUZXh0KCk7CisJCW1hY0lkLmVxdWFscyhjcmVhdGVkVXNlclVzZXJJZCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidGRMYXN0IEFjdGl2ZSIpLmdldFRleHQoKS5lcXVhbHMoIldhaXRpbmciKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJ0ZFJvbGUiKS5nZXRUZXh0KCkuZXF1YWxzKHJvbGUpOworCQlBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5kZWxldGV1c2VyKG1hY0lkKTsKKwl9CisKKwkvLyBDcmVhdGUgZXhpc3QgdXNlciBhbmQgZ2V0IGVycm9yIGFscmVhZHkgZXhpc3QgLgorCUBUZXN0CisJcHVibGljIHZvaWQgY3JlYXRleGlzdFVzZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB1c2VySWQgPSBBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5kZWZpbmVOZXdVc2VySWQoInRoMDY5NSIpOworCQlTdHJpbmcgcm9sZSA9IEFkbWluV29ya3NwYWNlVUlVdGlsaWVzLnNlbGVjdFVzZXJSb2xlKCJkZXNpZ25lciIpOworCQlBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5kZWxldGV1c2VyKHVzZXJJZCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigiY3JlYXRlZ3JlZW4iKS5jbGljaygpOworCQlBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5kZWZpbmVOZXdVc2VySWQodXNlcklkKTsKKwkJQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuc2VsZWN0VXNlclJvbGUoImFkbWluIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigiY3JlYXRlZ3JlZW4iKS5jbGljaygpOworCQlSZXNvdXJjZVVJVXRpbHMuZ2V0RXJyb3JNZXNzYWdlVGV4dCgidy1zZGMtbW9kYWwtYm9keS1jb250ZW50IikKKwkJCQkuZXF1YWxzKCJVc2VyIHdpdGggJyIgKyB1c2VySWQgKyAiJyBJRCBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tPa0J1dHRvbigpOworCQlBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5kZWxldGV1c2VyKHVzZXJJZCk7CisKKwl9CisKKwkvLyBlbnRlciBTcGVjaWFsIGNoYXJzIGFuZCB0aGUgY3JlYXRlIGJ1dHRvbiBkaXNhYmxlZC4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGluc2VydFNwYWNpYWxjaGFyc1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuZGVmaW5lTmV3VXNlcklkKCIhQERFUiUiKTsKKwkJQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuc2VsZWN0VXNlclJvbGUoImRlc2lnbmVyIik7CisJCVdlYkVsZW1lbnQgY3JlYXRlYnV0dG9uID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjcmVhdGVncmVlbiIpOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoY3JlYXRlYnV0dG9uLmlzRW5hYmxlZCgpKTsKKwl9CisKKwkvLyBlbnRlciBpbnZhbGlkIG1hY2lkIGFuZCBjcmVhdGUgYnV0dG9uIHNoYWxsIGJlIGRpc2FibGVkLgorCUBUZXN0CisJcHVibGljIHZvaWQgaW5zZXJ0SW52YWxpZFVzZXJNYWNpZFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuZGVmaW5lTmV3VXNlcklkKCJrMTIzNDUiKTsKKwkJQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuc2VsZWN0VXNlclJvbGUoImRlc2lnbmVyIik7CisJCVdlYkVsZW1lbnQgY3JlYXRlYnV0dG9uID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjcmVhdGVncmVlbiIpOworCQlBc3NlcnQuYXNzZXJ0RmFsc2UoY3JlYXRlYnV0dG9uLmlzRW5hYmxlZCgpKTsKKwl9CisKKwkvLyBlbnRlciBpbnZhbGlkIHVzZXJJZCBhbmQgY3JlYXRlIGJ1dHRvbiBzaGFsbCBiZSBkaXNhYmxlZC4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGluc2VydEludmFsaWRVc2VyVXNlcklkVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5kZWZpbmVOZXdVc2VySWQoImFjMWMyMyIpOworCQlBZG1pbldvcmtzcGFjZVVJVXRpbGllcy5zZWxlY3RVc2VyUm9sZSgiZGVzaWduZXIiKTsKKwkJV2ViRWxlbWVudCBjcmVhdGVidXR0b24gPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImNyZWF0ZWdyZWVuIik7CisJCUFzc2VydC5hc3NlcnRGYWxzZShjcmVhdGVidXR0b24uaXNFbmFibGVkKCkpOworCX0KKworCS8vIGRpc3BsYXkgdXNlcnMgbGlzdCBhbmQgc29ydCBieSBjb2x1bW4gbmFtZS4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGRpc3BsYXl1c2Vyc2xpc3RhbmRzb3J0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidGhGaXJzdCBOYW1lIikuY2xpY2soKTsKKwkJQ29sbGVjdGlvbjxXZWJFbGVtZW50PiB1c2Vyc0ZuYW1lID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudHMoInRkRmlyc3QgTmFtZSIpOworCQlmb3IgKFdlYkVsZW1lbnQgd2ViRWxlbWVudCA6IHVzZXJzRm5hbWUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbih3ZWJFbGVtZW50LmdldFRleHQoKSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVXNlclJvbGVFbnVtIGdldFJvbGUoKSB7CisJCXJldHVybiBVc2VyUm9sZUVudW0uQURNSU47CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9DYXRhbG9nTGVmdEZpbHRlclBhbmVsQ2hlY2tCb3hUZXN0LmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9DYXRhbG9nTGVmdEZpbHRlclBhbmVsQ2hlY2tCb3hUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3NTVhOQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL0NhdGFsb2dMZWZ0RmlsdGVyUGFuZWxDaGVja0JveFRlc3QuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2V1aTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkJyZWFkQ3J1bWJzQnV0dG9uc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNhdGFsb2dGaWx0ZXJUaXRsZXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5DaGVja0JveFN0YXR1c0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2V0dXAuU2V0dXBDRFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkNhdGFsb2dVSVV0aWxpdGlzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuUmVzb3VyY2VVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5SZXN0Q0RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uQnk7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENhdGFsb2dMZWZ0RmlsdGVyUGFuZWxDaGVja0JveFRlc3QgZXh0ZW5kcyBTZXR1cENEVGVzdCB7CisKKwlwdWJsaWMgQ2F0YWxvZ0xlZnRGaWx0ZXJQYW5lbENoZWNrQm94VGVzdCgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJcHJpdmF0ZSBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCUZpbGVXcml0ZXIgZmlsd3JpdGVyID0gR2VuZXJhbFVJVXRpbHMuSW5pdGlhbGl6ZXByaW50VG9UeHQoIkNhdGFsb2dMZWZ0RmlsdGVyUGFuZWxDaGVja0JveFRlc3QiKTsKKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBiZWZvclRlc3QoKSB7CisJCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCX0KKworCS8vIGZpbHRlciBieSBUeXBlIFJlc291cmNlIGluIGNhdGFsb2cKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZpbHRlckJ5QXNzZXRUeXBlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxXZWJFbGVtZW50PiBlbGVtZW50cyA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiB2YWxpZFZhbHVlcyA9IEFycmF5cy5hc0xpc3QoIlZGIiwgIlZMIiwgIkNQIiwgIlZGQyIpOworCQlHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQnJlYWRDcnVtYnMoQnJlYWRDcnVtYnNCdXR0b25zRW51bS5DQVRBTE9HKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2F0YWxvZ0ZpbHRlclR5cGVDaGVjQm94KFR5cGVzRW51bS5SRVNPVVJDRSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdvcmtzcGFjZUVsZW1lbnRzKCk7CisJCWVsZW1lbnRzID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRzTGlzdFZpc2liaWxpdHlUZXN0TWV0aG9kKCJhc3NldC10eXBlIik7CisJCWZvciAoV2ViRWxlbWVudCB3ZWJFbGVtZW50IDogZWxlbWVudHMpIHsKKwkJCWFzc2VydFRydWUodmFsaWRWYWx1ZXMuY29udGFpbnMod2ViRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmlsdGVyQnlSZXNvdXJjZVR5cGVWRigpIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0PFdlYkVsZW1lbnQ+IGVsZW1lbnRzID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IHZhbGlkVmFsdWVzID0gQXJyYXlzLmFzTGlzdCgiVkYiKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dGaWx0ZXJUeXBlQ2hlY0JveChUeXBlc0VudW0uVkYpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXb3Jrc3BhY2VFbGVtZW50cygpOworCQllbGVtZW50cyA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5VGVzdE1ldGhvZCgiYXNzZXQtdHlwZSIpOworCQlmb3IgKFdlYkVsZW1lbnQgd2ViRWxlbWVudCA6IGVsZW1lbnRzKSB7CisJCQlhc3NlcnRUcnVlKHZhbGlkVmFsdWVzLmNvbnRhaW5zKHdlYkVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGZpbHRlckJ5UmVzb3VyY2VUeXBlVkZDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8V2ViRWxlbWVudD4gZWxlbWVudHMgPSBudWxsOworCQlMaXN0PFN0cmluZz4gdmFsaWRWYWx1ZXMgPSBBcnJheXMuYXNMaXN0KCJWRkMiKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dGaWx0ZXJUeXBlQ2hlY0JveChUeXBlc0VudW0uVkZDKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V29ya3NwYWNlRWxlbWVudHMoKTsKKwkJZWxlbWVudHMgPSBHZW5lcmFsVUlVdGlscy53YWl0Rm9yRWxlbWVudHNMaXN0VmlzaWJpbGl0eVRlc3RNZXRob2QoImFzc2V0LXR5cGUiKTsKKwkJZm9yIChXZWJFbGVtZW50IHdlYkVsZW1lbnQgOiBlbGVtZW50cykgeworCQkJYXNzZXJ0VHJ1ZSh2YWxpZFZhbHVlcy5jb250YWlucyh3ZWJFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBmaWx0ZXJCeVJlc291cmNlVHlwZUNQKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8V2ViRWxlbWVudD4gZWxlbWVudHMgPSBudWxsOworCQlMaXN0PFN0cmluZz4gdmFsaWRWYWx1ZXMgPSBBcnJheXMuYXNMaXN0KCJDUCIpOworCQlHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQnJlYWRDcnVtYnMoQnJlYWRDcnVtYnNCdXR0b25zRW51bS5DQVRBTE9HKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2F0YWxvZ0ZpbHRlclR5cGVDaGVjQm94KFR5cGVzRW51bS5DUCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdvcmtzcGFjZUVsZW1lbnRzKCk7CisJCWVsZW1lbnRzID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRzTGlzdFZpc2liaWxpdHlUZXN0TWV0aG9kKCJhc3NldC10eXBlIik7CisJCWZvciAoV2ViRWxlbWVudCB3ZWJFbGVtZW50IDogZWxlbWVudHMpIHsKKwkJCWFzc2VydFRydWUodmFsaWRWYWx1ZXMuY29udGFpbnMod2ViRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmlsdGVyQnlSZXNvdXJjZVR5cGVWTCgpIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0PFdlYkVsZW1lbnQ+IGVsZW1lbnRzID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IHZhbGlkVmFsdWVzID0gQXJyYXlzLmFzTGlzdCgiVkwiKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dGaWx0ZXJUeXBlQ2hlY0JveChUeXBlc0VudW0uVkwpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXb3Jrc3BhY2VFbGVtZW50cygpOworCQllbGVtZW50cyA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5VGVzdE1ldGhvZCgiYXNzZXQtdHlwZSIpOworCQlmb3IgKFdlYkVsZW1lbnQgd2ViRWxlbWVudCA6IGVsZW1lbnRzKSB7CisJCQlhc3NlcnRUcnVlKHZhbGlkVmFsdWVzLmNvbnRhaW5zKHdlYkVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSk7CisJCX0KKwl9CisKKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIGZpbHRlckJ5UHJvZHVjVFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9ueworCS8vIExpc3Q8V2ViRWxlbWVudD4gZWxlbWVudHMgPSBudWxsOworCS8vIExpc3Q8U3RyaW5nPiB2YWxpZFZhbHVlcyA9IEFycmF5cy5hc0xpc3QoIlBST0RVQ1QiKTsKKwkvLyBHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJLy8gR2VuZXJhbFVJVXRpbHMuY2xpY2tCcmVhZENydW1icyhCcmVhZENydW1ic0J1dHRvbnNFbnVtLkNBVEFMT0cpOworCS8vIEdlbmVyYWxVSVV0aWxzLmNhdGFsb2dGaWx0ZXJUeXBlQ2hlY0JveChUeXBlc0VudW0uUFJPRFVDVCk7CisJLy8gR2VuZXJhbFVJVXRpbHMuZ2V0V29ya3NwYWNlRWxlbWVudHMoKTsKKwkvLyB0cnkgeworCS8vIGVsZW1lbnRzID0KKwkvLyBHZW5lcmFsVUlVdGlscy5nZXRFZWxlbWVudHNCeUNsYXNzTmFtZTEoInctc2RjLWRhc2hib2FyZC1jYXJkLWF2YXRhciIpOworCS8vIGZvciAoV2ViRWxlbWVudCB3ZWJFbGVtZW50IDogZWxlbWVudHMpIHsKKwkvLyBhc3NlcnRUcnVlKHZhbGlkVmFsdWVzLmNvbnRhaW5zKHdlYkVsZW1lbnQuZmluZEVsZW1lbnQoQnkueHBhdGgoIi4vLyoiKSkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSk7CisJLy8gfQorCS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyBFbGVtZW50cyBmb3VuZHMhIik7CisJLy8gfQorCS8vIH0KKworCUBUZXN0CisJcHVibGljIHZvaWQgZmlsdGVyQnlSZXNvdXJjZUNhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxXZWJFbGVtZW50PiBlbGVtZW50cyA9IG51bGw7CisJCUxpc3Q8U3RyaW5nPiB2YWxpZFZhbHVlcyA9IG51bGw7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNrSW4oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tCcmVhZENydW1icyhCcmVhZENydW1ic0J1dHRvbnNFbnVtLkNBVEFMT0cpOworCQlUaHJlYWQuc2xlZXAoMjAwMCk7CisJCUdlbmVyYWxVSVV0aWxzLm1pbmltaXplQ2F0YWxvZ0ZpbHRlckJ5VGl0bGUoQ2F0YWxvZ0ZpbHRlclRpdGxlc0VudW0uVFlQRSk7CisJCUxpc3Q8U3RyaW5nPiBjYXRlZ29yaWVzID0gQ2F0YWxvZ1VJVXRpbGl0aXMuYWJjZCgpOworCQlmb3IgKFN0cmluZyBjYXRlZ29yeSA6IGNhdGVnb3JpZXMpIHsKKwkJCXZhbGlkVmFsdWVzID0gQ2F0YWxvZ1VJVXRpbGl0aXMuZ2V0QWxsU3ViY2F0ZWdvcmllc0J5VW5pcXVlSWQoY2F0ZWdvcnkpOworCQkJYm9vbGVhbiBib29sID0gZmFsc2U7CisJCQl0cnkgeworCQkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShjYXRlZ29yeSkuY2xpY2soKTsKKwkJCQlib29sID0gdHJ1ZTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJd2hpbGUgKCFib29sKSB7CisJCQkJCUdlbmVyYWxVSVV0aWxzLnNjcm9sbERvd24oKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShjYXRlZ29yeSkuY2xpY2soKTsKKwkJCQkJCWJvb2wgPSB0cnVlOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJU3RyaW5nIGNoZWNrQm94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGNhdGVnb3J5KS5maW5kRWxlbWVudChCeS54cGF0aCgiLi8vaW5wdXQiKSkKKwkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsKKwkJCWlmIChjaGVja0JveC5jb250YWlucygibmctbm90LWVtcHR5IikgJiYgdmFsaWRWYWx1ZXMgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCUdlbmVyYWxVSVV0aWxzLmdldFdvcmtzcGFjZUVsZW1lbnRzKCk7CisJCQkJCWVsZW1lbnRzID0gR2VuZXJhbFVJVXRpbHMuZ2V0RWVsZW1lbnRzQnljb250YWluc0NsYXNzTmFtZSgic3ByaXRlLXJlc291cmNlLWljb25zIik7CisJCQkJCWZvciAoV2ViRWxlbWVudCB3ZWJFbGVtZW50IDogZWxlbWVudHMpIHsKKwkJCQkJCVN0cmluZyBlbGVtZW50VW5pcXVlSWQgPSB3ZWJFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10ZXN0cy1pZCIpOworCQkJCQkJaWYgKCF2YWxpZFZhbHVlcy5jb250YWlucyhlbGVtZW50VW5pcXVlSWQpKSB7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhc3NlcnQgZXJyb3IhIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGNhdGVnb3J5KS5jbGljaygpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShjYXRlZ29yeSkuY2xpY2soKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBFbGVtZW50cyBmb3VuZHMhIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoIm51bGwiKQorCUBUZXN0CisJcHVibGljIHZvaWQgZmlsdGVyQnlTdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlMaXN0PFdlYkVsZW1lbnQ+IGVsZW1lbnRzID0gbnVsbDsKKwkJTGlzdDxTdHJpbmc+IHZhbGlkVmFsdWVzID0gbnVsbDsKKwkJTGlzdDxSZXNvdXJjZVJlcURldGFpbHM+IGNyZWF0ZWRDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVJlcURldGFpbHM+KCk7CisJCUxpc3Q8U3RyaW5nPiBjYXRhbG9nU3RhdHVzZXMgPSBBcnJheXMuYXNMaXN0KCJJTl9ERVNJR04iLCAiUkVBRFlfRk9SX1RFU1RJTkciLCAiSU5fVEVTVElORyIsICJDRVJUSUZJRUQiLAorCQkJCSJESVNUUklCVVRFRCIpOworCQlHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJCWZvciAoaW50IGkgPSAxOyBpIDwgY2F0YWxvZ1N0YXR1c2VzLnNpemUoKSAtIDE7IGkrKykgeworCQkJR2VuZXJhbFVJVXRpbHMuc2xlZXAoMzAwMCk7CisJCQlHZW5lcmFsVUlVdGlscy5jcmVhdGVBbmRJbXBvcnRCdXR0b25zKENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLkNSRUFURV9WRiwgR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkpOworCQkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUoZ2V0UmFuZG9tQ29tcG9uZW50TmFtZSgiUmVzb3VyY2VDRFRlc3QtIikpOworCQkJUmVzb3VyY2VVSVV0aWxzLmNyZWF0ZVJlc291cmNlSW5VSShyZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSk7CisJCQlHZW5lcmFsVUlVdGlscy5jbGlja1N1Ym1pdEZvclRlc3QoKTsKKwkJCWlmIChjYXRhbG9nU3RhdHVzZXMuZ2V0KGkpID09ICJJTl9URVNUSU5HIikgeworCQkJCUdlbmVyYWxVSVV0aWxzLnRlc3RlclVzZXIodHJ1ZSwgZmFsc2UsIHJlc291cmNlRGV0YWlscyk7CisJCQkJR2VuZXJhbFVJVXRpbHMuc2xlZXAoMzAwMCk7CisJCQkJbmF2aWdhdGVUb1VybChnZXRVcmwoKSk7CisKKwkJCX0KKwkJCWlmIChjYXRhbG9nU3RhdHVzZXMuZ2V0KGkpID09ICJDRVJUSUZJRUQiKSB7CisJCQkJR2VuZXJhbFVJVXRpbHMudGVzdGVyVXNlcih0cnVlLCB0cnVlLCByZXNvdXJjZURldGFpbHMpOworCQkJCUdlbmVyYWxVSVV0aWxzLnNsZWVwKDMwMDApOworCQkJCW5hdmlnYXRlVG9VcmwoZ2V0VXJsKCkpOworCQkJfQorCQkJaWYgKGNhdGFsb2dTdGF0dXNlcy5nZXQoaSkgPT0gIkRJU1RSSUJVVEVEIikgeworCQkJCUdlbmVyYWxVSVV0aWxzLnRlc3RlclVzZXIodHJ1ZSwgdHJ1ZSwgcmVzb3VyY2VEZXRhaWxzKTsKKwkJCQlHZW5lcmFsVUlVdGlscy5nb3Zlcm5vclVzZXIoZmFsc2UsIHRydWUsIHJlc291cmNlRGV0YWlscyk7CisJCQkJR2VuZXJhbFVJVXRpbHMub3BzVXNlcih0cnVlLCBmYWxzZSwgcmVzb3VyY2VEZXRhaWxzKTsKKwkJCQlHZW5lcmFsVUlVdGlscy5zbGVlcCgzMDAwKTsKKwkJCQluYXZpZ2F0ZVRvVXJsKGdldFVybCgpKTsKKworCQkJfQorCQkJY3JlYXRlZENvbXBvbmVudHMuYWRkKHJlc291cmNlRGV0YWlscyk7CisJCX0KKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tCcmVhZENydW1icyhCcmVhZENydW1ic0J1dHRvbnNFbnVtLkNBVEFMT0cpOworCQkvLyBnZXQgZmlsdGVycyB0aXRsZSBjbG9zZS4KKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCQlHZW5lcmFsVUlVdGlscy5taW5pbWl6ZUNhdGFsb2dGaWx0ZXJCeVRpdGxlKENhdGFsb2dGaWx0ZXJUaXRsZXNFbnVtLlRZUEUpOworCQlHZW5lcmFsVUlVdGlscy5taW5pbWl6ZUNhdGFsb2dGaWx0ZXJCeVRpdGxlKENhdGFsb2dGaWx0ZXJUaXRsZXNFbnVtLkNBVEVHT1JJRVMpOworCQlmb3IgKENoZWNrQm94U3RhdHVzRW51bSBzdGF0dXNFbnVtIDogQ2hlY2tCb3hTdGF0dXNFbnVtLnZhbHVlcygpKSB7CisJCQlpZiAoY2F0YWxvZ1N0YXR1c2VzLmNvbnRhaW5zKHN0YXR1c0VudW0ubmFtZSgpLnRvU3RyaW5nKCkpKSB7CisJCQkJdmFsaWRWYWx1ZXMgPSBHZW5lcmFsVUlVdGlscy5jYXRhbG9nRmlsdGVyU3RhdHVzQ2hlY0JveChzdGF0dXNFbnVtKTsKKwkJCQlpZiAoR2VuZXJhbFVJVXRpbHMuZ2V0V29ya3NwYWNlRWxlbWVudHMoKS5zaXplKCkgPiAwKSB7CisJCQkJCVN0cmluZyBjaGVja0JveCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeU5hbWUoc3RhdHVzRW51bS5nZXRDYXRhbG9nVmFsdWUoKSkKKwkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOworCQkJCQlpZiAoY2hlY2tCb3guY29udGFpbnMoIm5nLW5vdC1lbXB0eSIpICYmIHZhbGlkVmFsdWVzICE9IG51bGwpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJZWxlbWVudHMgPSBHZW5lcmFsVUlVdGlscy5nZXRFZWxlbWVudHNCeWNvbnRhaW5zQ2xhc3NOYW1lKCJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1lZGl0Iik7CisJCQkJCQkJZm9yIChXZWJFbGVtZW50IHdlYkVsZW1lbnQgOiBlbGVtZW50cykgeworCQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gd2ViRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CisJCQkJCQkJCVN0cmluZyB0ZXh0Q2F0ZWdvcnkgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5pbmRleE9mKCIgIikpOworCQkJCQkJCQlhc3NlcnRUcnVlKHZhbGlkVmFsdWVzLmNvbnRhaW5zKHRleHRDYXRlZ29yeS5yZXBsYWNlKCIgIiwgIiIpKSk7CisJCQkJCQkJfQorCQkJCQkJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dGaWx0ZXJTdGF0dXNDaGVjQm94KHN0YXR1c0VudW0pOworCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlHZW5lcmFsVUlVdGlscy5jYXRhbG9nRmlsdGVyU3RhdHVzQ2hlY0JveChzdGF0dXNFbnVtKTsKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIEVsZW1lbnRzIGZvdW5kcyEiKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBVc2VyUm9sZUVudW0gZ2V0Um9sZSgpIHsKKwkJcmV0dXJuIFVzZXJSb2xlRW51bS5ERVNJR05FUjsKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9DYXRhbG9nU2VhcmNoQm94VGVzdC5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNldWkvQ2F0YWxvZ1NlYXJjaEJveFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRiOTUzCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNldWkvQ2F0YWxvZ1NlYXJjaEJveFRlc3QuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2V1aTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQnJlYWRDcnVtYnNCdXR0b25zRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5TdGVwc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDYXRhbG9nU2VhcmNoQm94VGVzdCBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKworCXByaXZhdGUgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlsczsKKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBiZWZvclRlc3QoKSB7CisJCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCX0KKworCS8vIHNlYXJjaCBieSBSZXNvdXJjZU5hbWUKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlYXJjaFJlc291cmNlSW5DYXRhbG9nTWVudVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dTZWFyY2hCb3gocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCVRocmVhZC5zbGVlcCg1MDApOworCQlhc3NlcnRUcnVlKEdlbmVyYWxVSVV0aWxzLmdldFdvcmtzcGFjZUVsZW1lbnRzKCkuc2l6ZSgpID09IDEpOworCX0KKworCS8vIHNlYXJjaCBieSBEZXNjcmlwdGlvbgorCUBUZXN0CisJcHVibGljIHZvaWQgc2VhcmNoUmVzb3VyY2VJbkNhdGFsb2dNZW51QnlEZXNjcmlwdGlvblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dTZWFyY2hCb3gocmVzb3VyY2VEZXRhaWxzLmdldERlc2NyaXB0aW9uKCkpOworCQlUaHJlYWQuc2xlZXAoMjAwMCk7CisJCUxpc3Q8V2ViRWxlbWVudD4gYXNzZXRzID0gR2VuZXJhbFVJVXRpbHMuZ2V0V29ya3NwYWNlRWxlbWVudHMoKTsKKworCQlpbnQgY291bnQgPSAwOworCQlmb3IgKFdlYkVsZW1lbnQgd2ViRWxlbWVudCA6IGFzc2V0cykgeworCQkJaWYgKGNvdW50ICE9IDApIHsKKwkJCQlHZW5lcmFsVUlVdGlscy5jYXRhbG9nU2VhcmNoQm94KHJlc291cmNlRGV0YWlscy5nZXREZXNjcmlwdGlvbigpKTsKKwkJCX0KKwkJCWlmIChjb3VudCA9PSAwKSB7CisJCQkJd2ViRWxlbWVudC5jbGljaygpOworCQkJfSBlbHNlIHsKKwkJCQlMaXN0PFdlYkVsZW1lbnQ+IGFzc2V0czEgPSBHZW5lcmFsVUlVdGlscy5nZXRXb3Jrc3BhY2VFbGVtZW50cygpOworCQkJCWFzc2V0czEuZ2V0KGNvdW50KS5jbGljaygpOworCQkJfQorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJkZXNjcmlwdGlvbiIpLmdldFRleHQoKQorCQkJCQkuZXF1YWxzKHJlc291cmNlRGV0YWlscy5nZXREZXNjcmlwdGlvbigpKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmNsaWNrRXhpdFNpZ24oKTsKKwkJCVRocmVhZC5zbGVlcCg1MDApOworCQkJY291bnQrKzsKKwkJfQorCX0KKworCS8vIHNlYXJjaCBieSB0YWdzCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZWFyY2hSZXNvdXJjZUluQ2F0YWxvZ01lbnVCeXRhZ3NUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNrSW4oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tCcmVhZENydW1icyhCcmVhZENydW1ic0J1dHRvbnNFbnVtLkNBVEFMT0cpOworCQlHZW5lcmFsVUlVdGlscy5jYXRhbG9nU2VhcmNoQm94KHJlc291cmNlRGV0YWlscy5nZXRUYWdzKCkuZ2V0KDApKTsKKwkJVGhyZWFkLnNsZWVwKDUwMCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdvcmtzcGFjZUVsZW1lbnRzKCkuZ2V0KDApLmNsaWNrKCk7CisJCUxpc3Q8V2ViRWxlbWVudD4gZXhwZWN0ZWRUYWdzTGlzdCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRzKCJpLXNkYy10YWctdGV4dCIpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVGFnc0xpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCWV4cGVjdGVkVGFnc0xpc3QuZ2V0KGkpLmVxdWFscyhyZXNvdXJjZURldGFpbHMuZ2V0VGFncygpLmdldChpKSk7CisJCX0KKworCX0KKworCS8vIHNlYXJjaCBieSBWZXJzaW9uCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZWFyY2hSZXNvdXJjZUluQ2F0YWxvZ01lbnVCeVZlcnNpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNrSW4oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tCcmVhZENydW1icyhCcmVhZENydW1ic0J1dHRvbnNFbnVtLkNBVEFMT0cpOworCQlHZW5lcmFsVUlVdGlscy5jYXRhbG9nU2VhcmNoQm94KHJlc291cmNlRGV0YWlscy5nZXRWZXJzaW9uKCkucmVwbGFjZSgiViIsICIiKSk7CisJCVRocmVhZC5zbGVlcCg1MDApOworCQlHZW5lcmFsVUlVdGlscy5nZXRXb3Jrc3BhY2VFbGVtZW50cygpLmdldCgwKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KG51bGwsICJ2ZXJzaW9uSGVhZGVyIikuZ2V0Rmlyc3RTZWxlY3RlZE9wdGlvbigpLmdldFRleHQoKQorCQkJCS5lcXVhbHMocmVzb3VyY2VEZXRhaWxzLmdldFZlcnNpb24oKSk7CisJfQorCisJLy8gc2VhcmNoIGJ5IFNwZWNpYWxDaGFyYWN0ZXJzCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZWFyY2hSZXNvdXJjZUluQ2F0YWxvZ01lbnVCeVNwZWNpYWxDaGFyYWN0ZXJzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKFN0ZXBzRW51bS5HRU5FUkFMKTsKKwkJR2VuZXJhbFVJVXRpbHMuZGVmaW5lRGVzY3JpcHRpb24ocmVzb3VyY2VEZXRhaWxzLmdldERlc2NyaXB0aW9uKCkgKyAiIUAjJCVeJioiKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dTZWFyY2hCb3goIiFAIyQlXiYqIik7CisJCVRocmVhZC5zbGVlcCg1MDApOworCQlHZW5lcmFsVUlVdGlscy5nZXRXb3Jrc3BhY2VFbGVtZW50cygpLmdldCgwKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImRlc2NyaXB0aW9uIikuZ2V0VGV4dCgpLmVxdWFscyhyZXNvdXJjZURldGFpbHMuZ2V0RGVzY3JpcHRpb24oKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFVzZXJSb2xlRW51bSBnZXRSb2xlKCkgeworCQlyZXR1cm4gVXNlclJvbGVFbnVtLkRFU0lHTkVSOworCX0KK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL0NoYW5nZUxpZmVDeWNsZVN0YXRGcm9tQ2F0YWxvZ1Rlc3QuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL0NoYW5nZUxpZmVDeWNsZVN0YXRGcm9tQ2F0YWxvZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzUyNDBkCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNldWkvQ2hhbmdlTGlmZUN5Y2xlU3RhdEZyb21DYXRhbG9nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZXVpOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkJyZWFkQ3J1bWJzQnV0dG9uc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkxpZmVDeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cC5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLlJlc291cmNlVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDaGFuZ2VMaWZlQ3ljbGVTdGF0RnJvbUNhdGFsb2dUZXN0IGV4dGVuZHMgU2V0dXBDRFRlc3QgeworCisJcHVibGljIENoYW5nZUxpZmVDeWNsZVN0YXRGcm9tQ2F0YWxvZ1Rlc3QoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKworCS8vIFRoaXMgdGVzdCBjaGVjayB0aGUgc3RhdHVzIGZpbHRlciAuCisKKwlwcml2YXRlIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisKKwlAQmVmb3JlTWV0aG9kCisJcHVibGljIHZvaWQgYmVmb3JUZXN0KCkgeworCQlyZXNvdXJjZURldGFpbHMgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrSW5Gcm9tQ2F0YWxvZygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU2F2ZUljb24oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tBU0RDTG9nbygpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCUdlbmVyYWxVSVV0aWxzLmNhdGFsb2dTZWFyY2hCb3gocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCUxpc3Q8V2ViRWxlbWVudD4gYXNzZXRzID0gR2VuZXJhbFVJVXRpbHMuZ2V0V29ya3NwYWNlRWxlbWVudHMoKTsKKwkJaWYgKGFzc2V0cy5pc0VtcHR5KCkpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXJyb3IgZWxlbWVudHMgbm90IGZvdW5kLiIpOworCQl9IGVsc2UgeworCQkJZm9yIChXZWJFbGVtZW50IHdlYkVsZW1lbnQgOiBhc3NldHMpIHsKKwkJCQl3ZWJFbGVtZW50LmNsaWNrKCk7CisJCQkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKS5jbGljaygpOworCQkJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VVSVV0aWxzLmxpZmVDeWNsZVN0YXRlVUkoKSk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKExpZmVDeWNsZVN0YXRlRW51bS5DSEVDS0lOLmdldFZhbHVlKCkpOworCQkJCWFzc2VydFRydWUoUmVzb3VyY2VVSVV0aWxzLmxpZmVDeWNsZVN0YXRlVUkoKS5jb250ZW50RXF1YWxzKExpZmVDeWNsZVN0YXRlRW51bS5DSEVDS0lOLmdldFZhbHVlKCkpKTsKKworCQkJfQorCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrT3V0RnJvbUNhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTYXZlSWNvbigpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0FTRENMb2dvKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQnJlYWRDcnVtYnMoQnJlYWRDcnVtYnNCdXR0b25zRW51bS5DQVRBTE9HKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2F0YWxvZ1NlYXJjaEJveChyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJTGlzdDxXZWJFbGVtZW50PiBhc3NldHMgPSBHZW5lcmFsVUlVdGlscy5nZXRXb3Jrc3BhY2VFbGVtZW50cygpOworCQlpZiAoYXNzZXRzLmlzRW1wdHkoKSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciBlbGVtZW50cyBub3QgZm91bmQuIik7CisJCX0gZWxzZSB7CisJCQlmb3IgKFdlYkVsZW1lbnQgd2ViRWxlbWVudCA6IGFzc2V0cykgeworCQkJCXdlYkVsZW1lbnQuY2xpY2soKTsKKwkJCQlHZW5lcmFsVUlVdGlscy5jaGVja2luQ2hlY2tvdXQocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCQkJYXNzZXJ0VHJ1ZShSZXNvdXJjZVVJVXRpbHMubGlmZUN5Y2xlU3RhdGVVSSgpLmNvbnRlbnRFcXVhbHMoTGlmZUN5Y2xlU3RhdGVFbnVtLkNIRUNLT1VULmdldFZhbHVlKCkpKTsKKworCQkJfQorCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVXNlclJvbGVFbnVtIGdldFJvbGUoKSB7CisJCXJldHVybiBVc2VyUm9sZUVudW0uREVTSUdORVI7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9JbXBvcnRBc3NldEluVUlUZXN0LmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9JbXBvcnRBc3NldEluVUlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5ZGY0MAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL0ltcG9ydEFzc2V0SW5VSVRlc3QuamF2YQpAQCAtMCwwICsxLDQ4MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUucmVzb3VyY2V1aTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkxpZmVDeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5TdGVwc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5BcnRpZmFjdFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5JbXBvcnRBc3NldFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLlByb3BlcnRpZXNVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLlJlc3RDRFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEltcG9ydEFzc2V0SW5VSVRlc3QgZXh0ZW5kcyBTZXR1cENEVGVzdCB7CisKKwlwcml2YXRlIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHM7CisKKwlAQmVmb3JlTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCisJcHVibGljIHZvaWQgaW5pYWxpemVCZWZvcmVJbXBvcnRUZXN0KCkgeworCQlHZW5lcmFsVUlVdGlscy5maWxlTmFtZSA9ICJKRE1fdmZjLnltbCI7CisJCXJlc291cmNlRGV0YWlscyA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZSgpOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0QXNzZXRGaWxsR2VuZXJhbEluZm9BbmRTZWxlY3RJY29uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXNvdXJjZVVJVXRpbHMuaW1wb3J0RmlsZVdpdGhTZW5kS2V5KEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0uSU1QT1JUX0NQKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmZpbGxHZW5lcmFsSW5mb1ZhbHVlc0FuZEljb24ocmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCkpOworCQlHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKS5jbGljaygpOworCQlSZXNvdXJjZVVJVXRpbHMuZ2V0VkZDR2VuZXJhbEluZm9BbmRWYWxpZGF0ZShyZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGFuZ2VJbXBvcnRlZEFzc2V0RmlsZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW1wb3J0QXNzZXRVSVV0aWxzLmltcG9ydEFzc3NldEFuZEZpbGxHZW5lcmFsSW5mbyhHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIEdlbmVyYWxVSVV0aWxzLmZpbGVOYW1lLAorCQkJCXJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlTdHJpbmcgZmlyc3RGaWxlTmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZmlsZW5hbWUiKS5nZXRUZXh0KCk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoZmlyc3RGaWxlTmFtZS5lcXVhbHMoR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUpKTsKKwkJU3RyaW5nIHNlY29uZEZpbGVOYW1lID0gIlZhbGlkX3Rvc2NhX1JlcGxhY2VUZXN0LnltbCI7CisJCVJlc291cmNlVUlVdGlscy5pbXBvcnRGaWxlV2l0aFNlbmRLZXlCcm93c2UoR2VuZXJhbFVJVXRpbHMuRklMRV9QQVRILCBzZWNvbmRGaWxlTmFtZSk7CisJCVN0cmluZyBzZWNvbmRGaWxlTmFtZUZyb21GaWVsZCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZmlsZW5hbWUiKS5nZXRUZXh0KCk7CisJCS8vIGFzc2VydFRoYXQoZmlsZU5hbWUsIG5vdChzZWNvbmRGaWxlTmFtZUZyb21GaWVsZCkpOworCQlhc3NlcnROb3RFcXVhbHMoR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsIHNlY29uZEZpbGVOYW1lRnJvbUZpZWxkKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGR1cGxpY2F0ZUZpbGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlVUlVdGlscy5pbXBvcnRGaWxlV2l0aFNlbmRLZXkoR2VuZXJhbFVJVXRpbHMuRklMRV9QQVRILCBHZW5lcmFsVUlVdGlscy5maWxlTmFtZSwKKwkJCQlDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlSZXNvdXJjZVVJVXRpbHMuZmlsbEdlbmVyYWxJbmZvVmFsdWVzQW5kSWNvbihyZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSk7CisJCVN0cmluZyBuYW1lb2ZyZXNvdXJjZSA9IHJlc291cmNlRGV0YWlscy5nZXROYW1lKCk7CisJCXJlc291cmNlRGV0YWlscy5zZXROYW1lKGdldFJhbmRvbUNvbXBvbmVudE5hbWUoIlNlY29uZEltcG9ydENEVGVzdCIpKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0QW5kRmlsbEdlbmVyYWxJbmZvKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCksIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU2F2ZUljb24oKTsKKwkJZXF1YWxzKFJlc291cmNlVUlVdGlscy5nZXRFcnJvck1lc3NhZ2VUZXh0KCJ3LXNkYy1tb2RhbC1ib2R5LWNvbnRlbnQiKSA9PSBHZW5lcmFsVUlVdGlscy5hbGxSZWFkeUV4aXN0RXJybyk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrT2tCdXR0b24oKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldE5hbWUobmFtZW9mcmVzb3VyY2UpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRJbnZhbGlkRmlsZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUgPSAiSW5WYWxpZF90b3NjYV9GaWxlIC55bWwiOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0QW5kRmlsbEdlbmVyYWxJbmZvKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCksIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU2F2ZUljb24oKTsKKwkJZXF1YWxzKFJlc291cmNlVUlVdGlscy5nZXRFcnJvck1lc3NhZ2VUZXh0KCJ3LXNkYy1tb2RhbC1ib2R5LWNvbnRlbnQiKSA9PSBHZW5lcmFsVUlVdGlscy50b3NjYUVycm9yTWVzc2FnZSk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrT2tCdXR0b24oKTsKKwl9CisJCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkZWxldGVJbXBvcnRBc3NldEZpbGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUltcG9ydEFzc2V0VUlVdGlscy5pbXBvcnRBc3NzZXRBbmRGaWxsR2VuZXJhbEluZm8oR2VuZXJhbFVJVXRpbHMuRklMRV9QQVRILCBHZW5lcmFsVUlVdGlscy5maWxlTmFtZSwKKwkJCQlyZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSwgQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0uSU1QT1JUX0NQKTsKKwkJV2ViRWxlbWVudCBkZWxldGVGaWxlQnV0dG9uID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJpLXNkYy1mb3JtLWZpbGUtdXBsb2FkLXgtYnRuIikpOworCQlkZWxldGVGaWxlQnV0dG9uLmNsaWNrKCk7CisJCVdlYkVsZW1lbnQgZmlsZWZpZWxkID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJmaWxlbmFtZSIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIiIsIGZpbGVmaWVsZC5nZXRUZXh0KCkpOworCX0KKworCS8vIEFkZCBhcnRpZmFjdCBieSBDbGlja2luZyB0aGUgUGxhY2UgaG9sZGVycyBidXR0b24uCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRBc3NldEFkZEluZm9ybWF0aW9uQXJ0aWZhY3RQbGFjZUhvbGRlcnNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGZpbGVOYW1lID0gIkNQX1dBTi55bWwiOworCQlTdHJpbmcgYXJ0aWZhY3RCeW5hbWUgPSAicGxhY2VIb2xkZXIiOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0RmlsbEdlbmVyYWxJbmZvQW5kU2VsZWN0SWNvbihHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIEdlbmVyYWxVSVV0aWxzLmZpbGVOYW1lLAorCQkJCXJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKFN0ZXBzRW51bS5JTkZPUk1BVElPTl9BUlRJRkFDVCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiRmVhdHVyZXMiKTsKKwkJTGlzdDxXZWJFbGVtZW50PiBQbGFjaG9sZGVycyA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jbGFzc05hbWUoImFkZC1idXR0b24iKSk7CisJCWZvciAoV2ViRWxlbWVudCBlbGVtZW50IDogUGxhY2hvbGRlcnMpIHsKKwkJCVRocmVhZC5zbGVlcCg1MDApOworCQkJZWxlbWVudC5jbGljaygpOworCQkJLy8gUGxhY2hvbGRlcnMuZ2V0KDQpLmNsaWNrKCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZWxlbWVudC5nZXRUZXh0KCkpOworCQkJaWYgKGVsZW1lbnQuZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UoIkFkZCBPdGhlciBBcnRpZmFjdCIpKSB7CisJCQkJQXJ0aWZhY3RVSVV0aWxzLnZhbGlkZUFydGlmYWN0KEFydGlmYWN0VUlVdGlscy5hZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3QoIkNyZWF0ZSBOZXcgQXJ0aWZhY3QiKSwgZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlBcnRpZmFjdFVJVXRpbHMudmFsaWRlQXJ0aWZhY3QoQXJ0aWZhY3RVSVV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdChudWxsKSwgZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJLy8gQWRkIGluZm9ybWF0aW9uIGFydGlmYWN0IGJ5IENsaWNraW5nIHRoZSBBZGQgYnV0dG9uLgorCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0QXNzZXRBZGRJbmZvcm1hdGlvbkFydGlmYWN0QWRkQnV0dG9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdHlwZSA9ICJDcmVhdGUgTmV3IEFydGlmYWN0IjsKKwkJLy8gZmlsZU5hbWUgPSAiQ1BfV0FOLnltbCI7CisJCUltcG9ydEFzc2V0VUlVdGlscy5pbXBvcnRBc3NzZXRGaWxsR2VuZXJhbEluZm9BbmRTZWxlY3RJY29uKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCksIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoU3RlcHNFbnVtLklORk9STUFUSU9OX0FSVElGQUNUKTsKKwkJR2VuZXJhbFVJVXRpbHMuYWN0aW9uQnVpbGQoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJhZGQtaW5mb3JtYXRpb24tYXJ0aWZhY3QtYnV0dG9uIikpLmNsaWNrKCk7CisJCTsKKwkJOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkID0gQXJ0aWZhY3RVSVV0aWxzLmFkZEluZm9ybWF0aW9uYWxBcnRpZmFjdCh0eXBlKTsKKwkJVGhyZWFkLnNsZWVwKDEwMDApOworCQlSZXNvdXJjZVVJVXRpbHMuc2Nyb2xsRG93blBhZ2UoKTsKKwkJQXJ0aWZhY3RVSVV0aWxzLnZhbGlkZUFydGlmYWN0KGV4cGVjdGVkLCBmYWxzZSk7CisJfQorCisJLy8gQWRkIE5ldyBwcm9wZXJ0eSBTdHJpbmcgVHlwZS4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEFzc2V0QWRkU3RyaW5nUHJvcGVydHlUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVdlYkVsZW1lbnQgcHJvcCA9IG51bGw7CisJCS8vIGZpbGVOYW1lID0gIkNQX1dBTi55bWwiOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0RmlsbEdlbmVyYWxJbmZvQW5kU2VsZWN0SWNvbihHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIEdlbmVyYWxVSVV0aWxzLmZpbGVOYW1lLAorCQkJCXJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlUaHJlYWQuc2xlZXAoNTAwKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uUFJPUEVSVElFUyk7CisJCUdlbmVyYWxVSVV0aWxzLmdldEVlbGVtZW50Qnljb250YWluc0NsYXNzTmFtZSgiZGF0YS1yb3ciKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJhZGRHcmV5IikuY2xpY2soKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eVZhbHVlcyA9IFByb3BlcnRpZXNVSVV0aWxzLmFkZFByb3BlcnRpZXMoIlN0cmluZy1Qcm9wZXJ0eSIsICJzdHJpbmciLAorCQkJCSIhVGhpcyBpcyBzdHJpZzEyMzQ1NkAjJCUkIiwgIlRoaXMgaXMgZGVzY3JpcHRpb24uIiwgbnVsbCk7CisJCVdlYkVsZW1lbnQgZWxlbWVudFRvaG92ZXIgPSBHZW5lcmFsVUlVdGlscy5nZXRFZWxlbWVudEJ5Y29udGFpbnNDbGFzc05hbWUoInRhYmxlLWFycm93Iik7CisJCUdlbmVyYWxVSVV0aWxzLmFjdGlvbkJ1aWxkKGVsZW1lbnRUb2hvdmVyKS5jbGljaygpOworCQlpbnQgY291bnRlciA9IDA7CisJCXRyeSB7CisJCQlwcm9wID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHByb3BlcnR5VmFsdWVzLmdldCgibmFtZSIpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVJlc291cmNlVUlVdGlscy5zY3JvbGxEb3duUGFnZSgpOworCQkJcHJvcCA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJCS5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgcHJvcGVydHlWYWx1ZXMuZ2V0KCJuYW1lIikgKyAiJ10iKSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAocHJvcC5pc0Rpc3BsYXllZCgpKSB7CisJCQkJY291bnRlcisrOworCQkJfQorCQl9CisJCVByb3BlcnRpZXNVSVV0aWxzLnZsaWRhdGVQcm9wZXJ0aWVzKHByb3BlcnR5VmFsdWVzKTsKKwl9CisKKwkvLyBBZGQgTmV3IHByb3BlcnR5IEludGVnZXIgVHlwZS4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEFzc2V0QWRkSW50ZWdlclByb3BlcnR5VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlXZWJFbGVtZW50IHByb3A7CisJCS8vIGZpbGVOYW1lID0gIkNQX1dBTi55bWwiOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0RmlsbEdlbmVyYWxJbmZvQW5kU2VsZWN0SWNvbihHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIEdlbmVyYWxVSVV0aWxzLmZpbGVOYW1lLAorCQkJCXJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlUaHJlYWQuc2xlZXAoNTAwKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uUFJPUEVSVElFUyk7CisJCUdlbmVyYWxVSVV0aWxzLmdldEVlbGVtZW50Qnljb250YWluc0NsYXNzTmFtZSgiZGF0YS1yb3ciKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJhZGRHcmV5IikuY2xpY2soKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eVZhbHVlcyA9IFByb3BlcnRpZXNVSVV0aWxzLmFkZFByb3BlcnRpZXMoIkludGVnZXItUHJvcGVydHkiLCAiaW50ZWdlciIsICIxMjM0NTYiLAorCQkJCSJUaGlzIGlzIGRlc2NyaXB0aW9uLiIsIG51bGwpOworCQlXZWJFbGVtZW50IGVsZW1lbnRUb2hvdmVyID0gR2VuZXJhbFVJVXRpbHMuZ2V0RWVsZW1lbnRCeWNvbnRhaW5zQ2xhc3NOYW1lKCJ0YWJsZS1hcnJvdyIpOworCQlHZW5lcmFsVUlVdGlscy5hY3Rpb25CdWlsZChlbGVtZW50VG9ob3Zlcik7CisJCWludCBjb3VudGVyID0gMDsKKwkJcHJvcCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShwcm9wZXJ0eVZhbHVlcy5nZXQoIm5hbWUiKSk7CisJCWlmIChwcm9wLmlzRGlzcGxheWVkKCkpIHsKKwkJCWNvdW50ZXIrKzsKKwkJfQorCQlpZiAoY291bnRlciA9PSAwKSB7CisJCQlSZXNvdXJjZVVJVXRpbHMuc2Nyb2xsRG93blBhZ2UoKTsKKwkJCXByb3AgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCQkuZmluZEVsZW1lbnQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIHByb3BlcnR5VmFsdWVzLmdldCgibmFtZSIpICsgIiddIikpOworCQkJY291bnRlcisrOworCQl9CisJCVByb3BlcnRpZXNVSVV0aWxzLnZsaWRhdGVQcm9wZXJ0aWVzKHByb3BlcnR5VmFsdWVzKTsKKwl9CisKKwkvLyBBZGQgTmV3IHByb3BlcnR5IGJvb2xlYW4gVHlwZS4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEFzc2V0QWRkQm9vbGVhblByb3BlcnR5VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBmaWxlTmFtZSA9ICJDUF9XQU4ueW1sIjsKKwkJV2ViRWxlbWVudCBwcm9wOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0RmlsbEdlbmVyYWxJbmZvQW5kU2VsZWN0SWNvbihHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIEdlbmVyYWxVSVV0aWxzLmZpbGVOYW1lLAorCQkJCXJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKFN0ZXBzRW51bS5QUk9QRVJUSUVTKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0RWVsZW1lbnRCeWNvbnRhaW5zQ2xhc3NOYW1lKCJkYXRhLXJvdyIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oImFkZEdyZXkiKS5jbGljaygpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5VmFsdWVzID0gUHJvcGVydGllc1VJVXRpbHMuYWRkUHJvcGVydGllcygiQm9vbGVhbi1Qcm9wZXJ0eSIsICJib29sZWFuIiwgInRydWUiLAorCQkJCSJUaGlzIGlzIGJvb2xlYW4gZGVzY3JpcHRpb24uIiwgbnVsbCk7CisJCWludCBjb3VudGVyID0gMDsKKwkJV2ViRWxlbWVudCBlbGVtZW50VG9ob3ZlciA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidGFibGUtYXJyb3ciKSk7CisJCUdlbmVyYWxVSVV0aWxzLmFjdGlvbkJ1aWxkKGVsZW1lbnRUb2hvdmVyKTsKKwkJcHJvcCA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvLypbQGRhdGEtdGVzdHMtaWQ9JyIgKyBwcm9wZXJ0eVZhbHVlcy5nZXQoIm5hbWUiKSArICInXSIpKTsKKwkJaWYgKHByb3AuaXNEaXNwbGF5ZWQoKSkgeworCQkJY291bnRlcisrOworCQl9CisJCWlmIChjb3VudGVyID09IDApIHsKKwkJCVJlc291cmNlVUlVdGlscy5zY3JvbGxEb3duUGFnZSgpOworCQkJcHJvcCA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJCS5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgcHJvcGVydHlWYWx1ZXMuZ2V0KCJuYW1lIikgKyAiJ10iKSk7CisJCQljb3VudGVyKys7CisJCX0KKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKDEsIGNvdW50ZXIpOworCX0KKworCS8vIEFkZCBOZXcgcHJvcGVydHkgZmxvYXQgVHlwZS4KKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEFzc2V0QWRkRmxvYXRQcm9wZXJ0eVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJV2ViRWxlbWVudCBwcm9wOworCQkvLyBmaWxlTmFtZSA9ICJDUF9XQU4ueW1sIjsKKwkJSW1wb3J0QXNzZXRVSVV0aWxzLmltcG9ydEFzc3NldEZpbGxHZW5lcmFsSW5mb0FuZFNlbGVjdEljb24oR2VuZXJhbFVJVXRpbHMuRklMRV9QQVRILCBHZW5lcmFsVUlVdGlscy5maWxlTmFtZSwKKwkJCQlyZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSwgQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0uSU1QT1JUX0NQKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uUFJPUEVSVElFUyk7CisJCUdlbmVyYWxVSVV0aWxzLmdldEVlbGVtZW50Qnljb250YWluc0NsYXNzTmFtZSgiZGF0YS1yb3ciKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJhZGRHcmV5IikuY2xpY2soKTsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eVZhbHVlcyA9IFByb3BlcnRpZXNVSVV0aWxzLmFkZFByb3BlcnRpZXMoImZsb2F0UHJvcGVydHkiLCAiZmxvYXQiLCAiMjIuNSIsCisJCQkJIlRoaXMgaXMgZGVzY3JpcHRpb24uIiwgbnVsbCk7CisJCWludCBjb3VudGVyID0gMDsKKwkJV2ViRWxlbWVudCBlbGVtZW50VG9ob3ZlciA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidGFibGUtYXJyb3ciKSk7CisJCUdlbmVyYWxVSVV0aWxzLmFjdGlvbkJ1aWxkKGVsZW1lbnRUb2hvdmVyKTsKKwkJcHJvcCA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvLypbQGRhdGEtdGVzdHMtaWQ9JyIgKyBwcm9wZXJ0eVZhbHVlcy5nZXQoIm5hbWUiKSArICInXSIpKTsKKwkJaWYgKHByb3AuaXNEaXNwbGF5ZWQoKSkgeworCQkJY291bnRlcisrOworCQl9CisJCWlmIChjb3VudGVyID09IDApIHsKKwkJCVJlc291cmNlVUlVdGlscy5zY3JvbGxEb3duUGFnZSgpOworCQkJcHJvcCA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJCS5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgcHJvcGVydHlWYWx1ZXMuZ2V0KCJuYW1lIikgKyAiJ10iKSk7CisJCQljb3VudGVyKys7CisJCX0KKwkJUHJvcGVydGllc1VJVXRpbHMudmxpZGF0ZVByb3BlcnRpZXMocHJvcGVydHlWYWx1ZXMpOworCX0KKworCS8vIEVkaXQgcHJvcGVydHkuCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRBc3NldEVkaXRQcm9wZXJ0aWVzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBmaWxlTmFtZSA9ICJDUF9XQU4ueW1sIjsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZCA9IG51bGw7CisJCUltcG9ydEFzc2V0VUlVdGlscy5pbXBvcnRBc3NzZXRGaWxsR2VuZXJhbEluZm9BbmRTZWxlY3RJY29uKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCksIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoU3RlcHNFbnVtLlBST1BFUlRJRVMpOworCQlHZW5lcmFsVUlVdGlscy5nZXRFZWxlbWVudEJ5Y29udGFpbnNDbGFzc05hbWUoInRhYmxlLWNvbC1nZW5lcmFsIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigiYWRkR3JleSIpLmNsaWNrKCk7CisJCWV4cGVjdGVkID0gUHJvcGVydGllc1VJVXRpbHMuYWRkUHJvcGVydGllcygiQm9vbGVhblByb3BlcnR5IiwgImJvb2xlYW4iLCAidHJ1ZSIsICJUaGlzIGlzIGJvb2xlYW4gZGVzY3JpcHRpb24uIiwKKwkJCQludWxsKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudChHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSwgInRhYmxlLWVkaXQtYnRuIikuY2xpY2soKTsKKwkJOworCQlMaXN0PFdlYkVsZW1lbnQ+IHByb3BlcnRpZXMgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkueHBhdGgoIi8vKltAKj0ndGFibGUtZWRpdC1idG4nXSIpKTsKKwkJOworCQlmb3IgKFdlYkVsZW1lbnQgd2ViRWxlbWVudCA6IHByb3BlcnRpZXMpIHsKKwkJCXdlYkVsZW1lbnQuY2xpY2soKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmRlZmluZURlc2NyaXB0aW9uKCJUaGlzIGlzIFByb3BlcnR5IHVwZGF0ZSIpOworCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJVcGRhdGUiKS5jbGljaygpOworCQkJYnJlYWs7CisJCX0KKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCQlHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSdCb29sZWFuUHJvcGVydHknXSIpKS5jbGljaygpOworCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisJCVN0cmluZyBhY3R1YWwgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCS5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BjbGFzcz0naXRlbS1vcGVuZWQgbmctYmluZGluZyBuZy1zY29wZSddIikpLmdldFRleHQoKTsKKwkJYXNzZXJ0Tm90RXF1YWxzKGV4cGVjdGVkLmdldCgibmFtZSIpLCBhY3R1YWwpOworCQkvLyBhc3NlcnRUaGF0KGV4cGVjdGVkLmdldCgibmFtZSIpLG5vdChhY3R1YWwpKTsKKwl9CisKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCS8vIGNoYW5nZSBWRkMgdmVyc2lvbgorCisJLy8gdGhpcyB0ZXN0IHJldHVybiBlcnJvciA1MDA7CisJQFRlc3QoYWx3YXlzUnVuID0gZmFsc2UpCisJcHVibGljIHZvaWQgaW1wb3J0QXNzZXRDaGFuZ2VWZXJzaW9uT2ZWRkNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGZpbGVOYW1lID0gIlZGQy55bWwiOworCQkvLyByZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLnRvU3RyaW5nKCkpOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0RmlsbEdlbmVyYWxJbmZvQW5kU2VsZWN0SWNvbihHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIEdlbmVyYWxVSVV0aWxzLmZpbGVOYW1lLAorCQkJCXJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlHZW5lcmFsVUlVdGlscy5jbGlja1NhdmVJY29uKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNraW5DaGVja291dChyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24oIjAuMiIpOworCQlTdHJpbmcgdmVyc2lvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidmVyc2lvbkhlYWRlciIpLmdldFRleHQoKTsKKwkJdmVyc2lvbi5lcXVhbHMoIjAuMiIpOworCX0KKworCS8vIGNoYW5nZSBWTCB2ZXJzaW9uCisJLy8gdGhpcyB0ZXN0IHJldHVybiBlcnJvciA1MDA7CisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRBc3NldENoYW5nZVZlcnNpb25PZlZMVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5maWxlTmFtZSA9ICJWTC55bWwiOworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKFJlc291cmNlVHlwZUVudW0uVkwuZ2V0VmFsdWUoKSk7CisJCUltcG9ydEFzc2V0VUlVdGlscy5pbXBvcnRBc3NzZXRGaWxsR2VuZXJhbEluZm9BbmRTZWxlY3RJY29uKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCksIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNraW5DaGVja291dChyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFZlcnNpb24oIjAuMiIpOworCQlTdHJpbmcgdmVyc2lvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidmVyc2lvbkhlYWRlciIpLmdldFRleHQoKTsKKwkJdmVyc2lvbi5lcXVhbHMoIjAuMiIpOworCX0KKwkvLyBjaGFuZ2UgQ1AgdmVyc2lvbgorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRBc3NldENoYW5nZVZlcnNpb25PZkNQVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5maWxlTmFtZSA9ICJDUF9MQU4ueW1sIjsKKwkJcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLkNQLnRvU3RyaW5nKCkpOworCQlJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0RmlsbEdlbmVyYWxJbmZvQW5kU2VsZWN0SWNvbihHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIEdlbmVyYWxVSVV0aWxzLmZpbGVOYW1lLAorCQkJCXJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bS5JTVBPUlRfQ1ApOworCQlHZW5lcmFsVUlVdGlscy5jaGVja2luQ2hlY2tvdXQocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCXJlc291cmNlRGV0YWlscy5zZXRWZXJzaW9uKCIwLjIiKTsKKwkJU3RyaW5nIHZlcnNpb24gPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInZlcnNpb25IZWFkZXIiKS5nZXRUZXh0KCk7CisJCXZlcnNpb24uZXF1YWxzKCIwLjIiKTsKKwl9CisKKwkvLyBAVGVzdAorCS8vIHB1YmxpYyB2b2lkIHZpZXdQYWdlQWN0aXZpdHlMb2dUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gcmVzb3VyY2VEZXRhaWxzLnNldFJlc291cmNlVHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLnRvU3RyaW5nKCkpOworCS8vIEltcG9ydEFzc2V0VUlVdGlscy5pbXBvcnRBc3NzZXRGaWxsR2VuZXJhbEluZm9BbmRTZWxlY3RJY29uKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwKKwkvLyBHZW5lcmFsVUlVdGlscy5maWxlTmFtZSAsIHJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpLAorCS8vIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLndhaXRUb0ZpbmlzaEJ1dHRvbkVuYWJsZWQoKS5jbGljaygpOworCS8vIFJlc3RDRFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlRGV0YWlscywgZ2V0VXNlcigpKTsKKwkvLyBHZW5lcmFsVUlVdGlscy5jaGVja0luKCk7CisJLy8gR2VuZXJhbFVJVXRpbHMub3Blbk9iamVjdE1lbnVBbmRTZWxlY3RPcHRpb24ocmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCksCisJLy8gTWVudU9wdGlvbnNFbnVtLlZJRVcpOworCS8vIFJlc291cmNlVUlVdGlscy5saWZlQ3ljbGVTdGF0ZSgpOworCS8vIFRocmVhZC5zbGVlcCgxMDAwKTsKKwkvLyBWaWV3UGFnZVVJVXRpbHMudmFsaWRhdGVBY3Rpdml0eUxvZygiQWN0aW9uOiBDaGVja2luIFBlcmZvcm1lZCBieTogQ2FybG9zCisJLy8gU2FudGFuYShjczAwMDgpIFN0YXR1czogMjAwIik7CisJLy8gfQorCisJLy8gQFRlc3QKKwkvLyBwdWJsaWMgdm9pZCBkb3dubG9hZEFydGlmYWN0Vmlld1BhYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gaW1wb3J0QXNzZXRBZGRJbmZvcm1hdGlvbkFydGlmYWN0QWRkQnV0dG9uKCk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLndhaXRUb0ZpbmlzaEJ1dHRvbkVuYWJsZWQoKS5jbGljaygpOworCS8vIFZpZXdQYWdlVUlVdGlscy5vcGVuRHJvcERvd25MaXN0T2ZPYmplY3QocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwKKwkvLyBJbXBvcnRBc3NldFVJVXRpbHMuZ2V0QWxsT2JqZWN0c09uV29ya3NwYWNlKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKSwKKwkvLyAiVmlldyIsCisJLy8gSW1wb3J0QXNzZXRVSVV0aWxzLnNjcm9sbEVsZW1lbnQoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkpKTsKKwkvLyBWYWxpZGF0ZVZpZXdQYWdlUGFyYW1ldGVycy5WaWV3UGFnZWRvd25sb2FkQXJ0aWZhY3QoKTsKKwkvLyBTdHJpbmcgbXloZWF0ZmlsZT0iSGVhdC1GaWxlLnlhbWwiOworCS8vIC8vQXNzZXJ0LmFzc2VydFRydWUoKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgIm1haWxtZXJnZS54bHMiKSwgIkZhaWxlZAorCS8vIHRvIGRvd25sb2FkCisJLy8gRXhwZWN0ZWQgZG9jdW1lbnQiKTsKKwkvLyBTdHJpbmcgZG93bG9hZGVkZmlsZT0KKwkvLyAiQzpcXEdpdF93b3JrXFxBU0RDXFxkMi1zZG5jXFx1aS1jaVxcc3JjXFxtYWluXFxyZXNvdXJjZXNcXERvd25sb2Fkc1xcIitmaWxlTmFtZSsiIjsKKwkvLyBpbnQgaW5kZXg9ZG93bG9hZGVkZmlsZS5sYXN0SW5kZXhPZigiXFwiKTsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZG93bG9hZGVkZmlsZS5zdWJzdHJpbmcoaW5kZXgrMSkpOworCS8vIEZpbGUgZ2V0TGF0ZXN0RmlsZSA9IGdldExhdGVzdEZpbGVmcm9tRGlyKCk7CisJLy8gU3RyaW5nIGZpbGVOYW1lID0gZ2V0TGF0ZXN0RmlsZS5nZXROYW1lKCk7CisJLy8gQXNzZXJ0LmFzc2VydFRydWUoZmlsZU5hbWUuZXF1YWxzKCJtYWlsbWVyZ2UueGxzIiksICJEb3dubG9hZGVkIGZpbGUgbmFtZQorCS8vIGlzIG5vdCBtYXRjaGluZyB3aXRoIGV4cGVjdGVkIGZpbGUgbmFtZSIpOworCS8vCisJLy8gfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRBc3NldGNoZWNrSW5WRkNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUltcG9ydEFzc2V0VUlVdGlscy5pbXBvcnRBc3NzZXRGaWxsR2VuZXJhbEluZm9BbmRTZWxlY3RJY29uKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCksIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU2F2ZUljb24oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2hlY2tJbigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJYXNzZXJ0VHJ1ZShSZXNvdXJjZVVJVXRpbHMubGlmZUN5Y2xlU3RhdGVVSSgpLmNvbnRlbnRFcXVhbHMoTGlmZUN5Y2xlU3RhdGVFbnVtLkNIRUNLSU4uZ2V0VmFsdWUoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0QXNzZXRjaGVja091dFZGQ1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW1wb3J0QXNzZXRVSVV0aWxzLmltcG9ydEFzc3NldEZpbGxHZW5lcmFsSW5mb0FuZFNlbGVjdEljb24oR2VuZXJhbFVJVXRpbHMuRklMRV9QQVRILCBHZW5lcmFsVUlVdGlscy5maWxlTmFtZSwKKwkJCQlyZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSwgQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0uSU1QT1JUX0NQKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTYXZlSWNvbigpOworCQlHZW5lcmFsVUlVdGlscy5jaGVja2luQ2hlY2tvdXQocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQVNEQ0xvZ28oKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpLmNsaWNrKCk7CisJCWFzc2VydFRydWUoUmVzb3VyY2VVSVV0aWxzLmxpZmVDeWNsZVN0YXRlVUkoKS5jb250ZW50RXF1YWxzKExpZmVDeWNsZVN0YXRlRW51bS5DSEVDS09VVC5nZXRWYWx1ZSgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBpbXBvcnRBc3NldERlbGV0ZVZGQ1ZlcnNpb25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUltcG9ydEFzc2V0VUlVdGlscy5pbXBvcnRBc3NzZXRGaWxsR2VuZXJhbEluZm9BbmRTZWxlY3RJY29uKEdlbmVyYWxVSVV0aWxzLkZJTEVfUEFUSCwgR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUsCisJCQkJcmVzb3VyY2VEZXRhaWxzLCBnZXRVc2VyKCksIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtLklNUE9SVF9DUCk7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNraW5DaGVja291dChyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKTsKKwkJR2VuZXJhbFVJVXRpbHMuZGVsZXRlVmVyc2lvbkluVUkoKTsKKwkJVGhyZWFkLnNsZWVwKDEwMDApOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJU3RyaW5nIHZlcnNpb24gPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInZlcnNpb25IZWFkZXIiKS5nZXRUZXh0KCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiMC4xIiwgdmVyc2lvbi5yZXBsYWNlKCJWIiwgIiIpKTsKKwl9CisKKwkvLyBAVGVzdChlbmFibGVkID0gZmFsc2UpCisJLy8gcHVibGljIHZvaWQgaW1wb3J0QXNzZXRWRkNQcmludFNjcmVlblRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkvLyBJbXBvcnRBc3NldFVJVXRpbHMuaW1wb3J0QXNzc2V0RmlsbEdlbmVyYWxJbmZvQW5kU2VsZWN0SWNvbihHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsCisJLy8gR2VuZXJhbFVJVXRpbHMuZmlsZU5hbWUgLCByZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLndhaXRUb0ZpbmlzaEJ1dHRvbkVuYWJsZWQoKS5jbGljaygpOworCS8vIFJlc291cmNlVUlVdGlscy5vcGVuRHJvcERvd25MaXN0T2ZPYmplY3QocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSwKKwkvLyBSZXNvdXJjZVVJVXRpbHMuZ2V0QWxsT2JqZWN0c09uV29ya3NwYWNlKGRyaXZlcixyZXNvdXJjZURldGFpbHMpLCAiRWRpdCIsCisJLy8gUmVzb3VyY2VVSVV0aWxzLnNjcm9sbEVsZW1lbnQoZHJpdmVyKSk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLndhaXRmdW5jdGlvbmZvcmVsZW1lbnRzKCJzcHJpdGUtcmVzb3VyY2UtaWNvbnMiLCA3KTsKKwkvLyBUaHJlYWQuc2xlZXAoMjAwMCk7CisJLy8gV2ViRWxlbWVudCBlbGVtZW50ID0KKwkvLyBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoIm5ldHdvcmsiKSk7CisJLy8gV2ViRWxlbWVudCB0YXJnZXQgPQorCS8vIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgiZHJvcHpvbmUiKSk7CisJLy8gKG5ldyBBY3Rpb25zKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKSkuZHJhZ0FuZERyb3AoZWxlbWVudCwKKwkvLyB0YXJnZXQpLnBlcmZvcm0oKTsKKwkvLyBXZWJFbGVtZW50IGVsZW1lbnQxID0KKwkvLyBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoIm5ldHdvcmsiKSk7CisJLy8gKG5ldyBBY3Rpb25zKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKSkuZHJhZ0FuZERyb3AoZWxlbWVudDEsCisJLy8gdGFyZ2V0KS5wZXJmb3JtKCk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLmNsaWNrUHJpbnRTY3JlZW4oKTsKKwkvLworCS8vIC8vIHRoZSBmaXJlZm94IG5vdCBzdXBwb3J0IHByaW50IHNjcmVlbi4KKwkvLyB9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGltcG9ydEFzc2V0VkZDU3VibWl0Rm9yVGVzdGluZ1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW1wb3J0QXNzZXRVSVV0aWxzLmltcG9ydEFzc3NldEZpbGxHZW5lcmFsSW5mb0FuZFNlbGVjdEljb24oR2VuZXJhbFVJVXRpbHMuRklMRV9QQVRILCBHZW5lcmFsVUlVdGlscy5maWxlTmFtZSwKKwkJCQlyZXNvdXJjZURldGFpbHMsIGdldFVzZXIoKSwgQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0uSU1QT1JUX0NQKTsKKwkJU3RyaW5nIG5hbWUgPSAiIjsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTdWJtaXRGb3JUZXN0KCk7CisJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjgxODEvc2RjMS9wcm94eS10ZXN0ZXIxIy9kYXNoYm9hcmQiOworCQluYXZpZ2F0ZVRvVXJsKHVybCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mbyIpOworCQlpbnQgY291bnRlciA9IDA7CisJCWZvciAoV2ViRWxlbWVudCBvYmplY3QgOiBSZXNvdXJjZVVJVXRpbHMuZ2V0QWxsT2JqZWN0c09uV29ya3NwYWNlKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLAorCQkJCXJlc291cmNlRGV0YWlscykpIHsKKwkJCWlmIChvYmplY3QuZ2V0VGV4dCgpLmVxdWFscyhyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKSkgeworCQkJCW5hbWUgPSBvYmplY3QuZ2V0VGV4dCgpOworCQkJCWNvdW50ZXIrKzsKKwkJCX0KKwkJfQorCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoMSwgY291bnRlcik7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVXNlclJvbGVFbnVtIGdldFJvbGUoKSB7CisJCXJldHVybiBVc2VyUm9sZUVudW0uREVTSUdORVI7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9WRkNhbnZhc1Rlc3QuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL1ZGQ2FudmFzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDU0MTcKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9WRkNhbnZhc1Rlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZXVpOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLlN0ZXBzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2V0dXAuU2V0dXBDRFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLmludGVyYWN0aW9ucy5BY3Rpb247CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5pbnRlcmFjdGlvbnMuQWN0aW9uczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBWRkNhbnZhc1Rlc3QgZXh0ZW5kcyBTZXR1cENEVGVzdCB7CisKKwlwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRwb3NpdGlvbihXZWJFbGVtZW50IGNhbnZhcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisKKwkJd2lkdGggPSBjYW52YXMuZ2V0U2l6ZSgpLmdldFdpZHRoKCk7CisJCWhlaWdodCA9IGNhbnZhcy5nZXRTaXplKCkuZ2V0SGVpZ2h0KCk7CisJCVJhbmRvbSByID0gbmV3IFJhbmRvbSgpOworCQlpbnQgUmVzdWx0eCA9IHIubmV4dEludCh3aWR0aCk7CisJCWludCBSZXN1bHR5ID0gci5uZXh0SW50KGhlaWdodCk7CisJCUxpc3Q8SW50ZWdlcj4gcG9zaXRpb24gPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisJCXBvc2l0aW9uLmFkZChSZXN1bHR4KTsKKwkJcG9zaXRpb24uYWRkKFJlc3VsdHkpOworCQlyZXR1cm4gcG9zaXRpb247CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBWRkNhbnZhc1Rlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEdlbmVyYWxVSVV0aWxzLndhaXRGb3JDb250YWluc2RhdGFUZXN0SWRWaXNpYmlsaXR5KCJsZWZ0LXNlY3Rpb2luLWVsZW1lbnQtUUEiKTsKKworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKFN0ZXBzRW51bS5DT01QT1NJVElPTik7CisJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJTGlzdDxJbnRlZ2VyPiBwb3NpdGlvbiA9IG51bGw7CisJCVdlYkVsZW1lbnQgY2FudmFzID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjYW52YXMiKTsKKwkJaW50IHhQb3MgPSAwOworCQlpbnQgeVBvcyA9IDA7CisJCXBvc2l0aW9uID0gZ2V0cG9zaXRpb24oY2FudmFzLCB4UG9zLCB5UG9zKTsKKwkJV2ViRWxlbWVudCBvdGhlckVsZW1lbnQgPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImxlZnQtc2VjdGlvaW4tZWxlbWVudC1RQSBsZWZ0LXNlY3Rpb24tTmV1dHJvblBvcnQiKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCUFjdGlvbnMgYnVpbGRlciA9IG5ldyBBY3Rpb25zKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKTsKKwkJCUFjdGlvbiBkcmFnQW5kRHJvcCA9IGJ1aWxkZXIuY2xpY2tBbmRIb2xkKG90aGVyRWxlbWVudCkKKwkJCQkJLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBwb3NpdGlvbi5nZXQoMCksIHBvc2l0aW9uLmdldCgxKSkucmVsZWFzZSgpLmJ1aWxkKCk7CisJCQlkcmFnQW5kRHJvcC5wZXJmb3JtKCk7CisJCQlUaHJlYWQuc2xlZXAoMjAwMCk7CisJCX0KKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCQlBY3Rpb25zIGJ1aWxkZXIgPSBuZXcgQWN0aW9ucyhHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSk7CisJCWJ1aWxkZXIubW92ZVRvRWxlbWVudChjYW52YXMsIHBvc2l0aW9uLmdldCgwKSwgcG9zaXRpb24uZ2V0KDEpKTsKKwkJYnVpbGRlci5jbGlja0FuZEhvbGQoKTsKKwkJcG9zaXRpb24gPSBnZXRwb3NpdGlvbihjYW52YXMsIHhQb3MsIHlQb3MpOworCQlidWlsZGVyLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBwb3NpdGlvbi5nZXQoMCksIHBvc2l0aW9uLmdldCgxKSk7CisJCWJ1aWxkZXIucmVsZWFzZSgpOworCQlidWlsZGVyLmJ1aWxkKCk7CisJCWJ1aWxkZXIucGVyZm9ybSgpOworCQlidWlsZGVyLm1vdmVUb0VsZW1lbnQoY2FudmFzLCAyMDAsIDMwMCk7CisJCWJ1aWxkZXIucmVsZWFzZSgpOworCQlidWlsZGVyLnBlcmZvcm0oKTsKKworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBVc2VyUm9sZUVudW0gZ2V0Um9sZSgpIHsKKwkJcmV0dXJuIFVzZXJSb2xlRW51bS5ERVNJR05FUjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL1ZGVUlUZXN0LmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9WRlVJVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzA0YmMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9WRlVJVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnJlc291cmNldWk7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2V0dXAuU2V0dXBDRFRlc3Q7CisKK3B1YmxpYyBjbGFzcyBWRlVJVGVzdCBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKworCXB1YmxpYyBWRlVJVGVzdCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVXNlclJvbGVFbnVtIGdldFJvbGUoKSB7CisJCXJldHVybiBVc2VyUm9sZUVudW0uREVTSUdORVI7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9WZlRlc3RzLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvcmVzb3VyY2V1aS9WZlRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MDI4NwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL1ZmVGVzdHMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZXVpOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworCitwdWJsaWMgY2xhc3MgVmZUZXN0cyBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBVc2VyUm9sZUVudW0gZ2V0Um9sZSgpIHsKKwkJcmV0dXJuIFVzZXJSb2xlRW51bS5ERVNJR05FUjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL1dvcmtzcGFjZUNoZWNrQm94RmlsdGVyVGVzdC5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Jlc291cmNldWkvV29ya3NwYWNlQ2hlY2tCb3hGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyZDY4NwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9yZXNvdXJjZXVpL1dvcmtzcGFjZUNoZWNrQm94RmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZXVpOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2V0dXAuU2V0dXBDRFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuRWxlbWVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBXb3Jrc3BhY2VDaGVja0JveEZpbHRlclRlc3QgZXh0ZW5kcyBTZXR1cENEVGVzdCB7CisKKwkvLyBUaGlzIHRlc3QgY2hlY2sgdGhlIHN0YXR1cyBmaWx0ZXIgLgorCisJcHJpdmF0ZSBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VEZXRhaWxzOworCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGJlZm9yVGVzdCgpIHsKKwkJcmVzb3VyY2VEZXRhaWxzID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZWxlY3RDaGVja091dE1lbnVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU2F2ZUljb24oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tBU0RDTG9nbygpOworCQlTdHJpbmcgU3RhdHVzID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuY2hlY2tCb3hMaWZlQ3ljbGVzdGF0ZShvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ2hlY2tCb3hTdGF0dXNFbnVtLkNIRUNLT1VUKTsKKwkJVGhyZWFkLnNsZWVwKDUwMCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKS5jbGljaygpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoU3RhdHVzLCBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImxpZmVjeWNsZXN0YXRlIikuZ2V0VGV4dCgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlbGVjdENoZWNrSW5NZW51VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5jbGlja1NhdmVJY29uKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNoZWNrSW4oKTsKKwkJU3RyaW5nIFN0YXR1cyA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmNoZWNrQm94TGlmZUN5Y2xlc3RhdGUob3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNoZWNrQm94U3RhdHVzRW51bS5DSEVDS0lOKTsKKwkJVGhyZWFkLnNsZWVwKDUwMCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShyZXNvdXJjZURldGFpbHMuZ2V0TmFtZSgpKS5jbGljaygpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoU3RhdHVzLCBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImxpZmVjeWNsZXN0YXRlIikuZ2V0VGV4dCgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHNlbGVjdFJlYWR5Rm9yVGVzdGluZ01lbnVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU2F2ZUljb24oKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTdWJtaXRGb3JUZXN0KCk7CisJCVN0cmluZyBTdGF0dXMgPSBHZW5lcmFsVUlVdGlscworCQkJCS5jaGVja0JveExpZmVDeWNsZXN0YXRlKG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5DaGVja0JveFN0YXR1c0VudW0uUkVBRFlfRk9SX1RFU1RJTkcpOworCQlUaHJlYWQuc2xlZXAoNTAwKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpLmNsaWNrKCk7CisKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKFN0YXR1cywgR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJsaWZlY3ljbGVzdGF0ZSIpLmdldFRleHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZWxlY3RJblRlc3RJbmdNZW51VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5jbGlja1NhdmVJY29uKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU3VibWl0Rm9yVGVzdCgpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yQ2xhc3NOYW1lVmlzaWJpbGl0eSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtZm9vdGVyIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLm5hdmlnYXRlKCkudG8oU2V0dXBDRFRlc3QuZ2V0VXJsKCkucmVwbGFjZSgiZGVzaWduZXIiLCAidGVzdGVyIikpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTdGFydFRlc3RpbmcoKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tBU0RDTG9nbygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yQ2xhc3NOYW1lVmlzaWJpbGl0eSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtZm9vdGVyIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLm5hdmlnYXRlKCkudG8oU2V0dXBDRFRlc3QuZ2V0VXJsKCkucmVwbGFjZSgidGVzdGVyIiwgImRlc2lnbmVyIikpOworCQlTdHJpbmcgU3RhdHVzID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuY2hlY2tCb3hMaWZlQ3ljbGVzdGF0ZShvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ2hlY2tCb3hTdGF0dXNFbnVtLklOX1RFU1RJTkcpOworCQlUaHJlYWQuc2xlZXAoNTAwKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpLmNsaWNrKCk7CisKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKFN0YXR1cywgR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJsaWZlY3ljbGVzdGF0ZSIpLmdldFRleHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzZWxlY3RDZXJ0aWZpZWRNZW51VGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5jbGlja1NhdmVJY29uKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrU3VibWl0Rm9yVGVzdCgpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yQ2xhc3NOYW1lVmlzaWJpbGl0eSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtZm9vdGVyIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLm5hdmlnYXRlKCkudG8oU2V0dXBDRFRlc3QuZ2V0VXJsKCkucmVwbGFjZSgiZGVzaWduZXIiLCAidGVzdGVyIikpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUocmVzb3VyY2VEZXRhaWxzLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tTdGFydFRlc3RpbmcoKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tBY2NlcHQoKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckNsYXNzTmFtZVZpc2liaWxpdHkoInctc2RjLWRhc2hib2FyZC1jYXJkLWZvb3RlciIpOworCQlHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5uYXZpZ2F0ZSgpLnRvKFNldHVwQ0RUZXN0LmdldFVybCgpLnJlcGxhY2UoInRlc3RlciIsICJkZXNpZ25lciIpKTsKKwkJU3RyaW5nIFN0YXR1cyA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmNoZWNrQm94TGlmZUN5Y2xlc3RhdGUob3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNoZWNrQm94U3RhdHVzRW51bS5DRVJUSUZJRUQpOworCQlUaHJlYWQuc2xlZXAoNTAwKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHJlc291cmNlRGV0YWlscy5nZXROYW1lKCkpLmNsaWNrKCk7CisKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKFN0YXR1cywgR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJsaWZlY3ljbGVzdGF0ZSIpLmdldFRleHQoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFVzZXJSb2xlRW51bSBnZXRSb2xlKCkgeworCQlyZXR1cm4gVXNlclJvbGVFbnVtLkRFU0lHTkVSOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Nhbml0eS9JbXBvcnQuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zYW5pdHkvSW1wb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwMTdhNAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zYW5pdHkvSW1wb3J0LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNhbml0eTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0SW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQnJlYWRDcnVtYnNCdXR0b25zRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5JbmZvcm1hdGlvbmFsQXJ0aWZhY3RzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Ob3JtYXRpdmVUeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlQ2F0ZWdvcnlFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5Vc2VyUm9sZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cC5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5HZW5lcmFsUGFnZUVsZW1lbnRzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLkluZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuUmVzb3VyY2VHZW5lcmFsUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5UZXN0ZXJPcGVyYXRpb25QYWdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLlRvc2NhQXJ0aWZhY3RzUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuQXJ0aWZhY3RVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5GaWxlSGFuZGxpbmc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5SZXNvdXJjZVVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMuZ2VuZXJhbC5FbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLkVsZW1lbnROb3RWaXNpYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuU2VsZWN0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEltcG9ydCBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgaW1wb3J0UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJDUFdpdGhBdHRyaWJ1dGVzLnltbCI7CisKKwkJLy8gaW1wb3J0IFJlc291cmNlCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZU1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkZDLCBnZXRVc2VyKCkpOworCQlSZXNvdXJjZVVJVXRpbHMuaW1wb3J0VmZjKHJlc291cmNlTWV0YURhdGEsIGZpbGVQYXRoLCBmaWxlTmFtZSwgZ2V0VXNlcigpKTsKKworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2VydGlmeVZGQygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJDUFdpdGhBdHRyaWJ1dGVzLnltbCI7CisJCVJlc291cmNlUmVxRGV0YWlscyBhdG9taWNSZXNvdXJjZU1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoCisJCQkJUmVzb3VyY2VUeXBlRW51bS5WRkMsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywgZ2V0VXNlcigpKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmYyhhdG9taWNSZXNvdXJjZU1ldGFEYXRhLCBmaWxlUGF0aCwgZmlsZU5hbWUsIGdldFVzZXIoKSk7CisJCVJlc291cmNlR2VuZXJhbFBhZ2UuY2xpY2tDaGVja2luQnV0dG9uKGF0b21pY1Jlc291cmNlTWV0YURhdGEuZ2V0TmFtZSgpKTsKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5jbGlja1N1Ym1pdEZvclRlc3RpbmdCdXR0b24oYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCQlxdWl0QW5kUmVMb2dpbihVc2VyUm9sZUVudW0uVEVTVEVSKTsKKwkJR2VuZXJhbFVJVXRpbHMuZmluZENvbXBvbmVudEFuZENsaWNrKGF0b21pY1Jlc291cmNlTWV0YURhdGEuZ2V0TmFtZSgpKTsKKwkJVGVzdGVyT3BlcmF0aW9uUGFnZS5jZXJ0aWZ5Q29tcG9uZW50KGF0b21pY1Jlc291cmNlTWV0YURhdGEuZ2V0TmFtZSgpKTsKKworCQlxdWl0QW5kUmVMb2dpbihVc2VyUm9sZUVudW0uREVTSUdORVIpOworCQkvLyBHZW5lcmFsVUlVdGlscy5jbGlja0JyZWFkQ3J1bWJzKEJyZWFkQ3J1bWJzQnV0dG9uc0VudW0uQ0FUQUxPRyk7CisJCVN0cmluZyBjcFZlcnNpb24gPSBHZW5lcmFsVUlVdGlscy5nZXRDb21wb25lbnRWZXJzaW9uKGF0b21pY1Jlc291cmNlTWV0YURhdGEuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgiViAxLjAiLmVxdWFscyhjcFZlcnNpb24pKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHVwbG9hZEFsbEluZm9ybWF0aW9uYWxBcnRpZmFjdFBsYWNlaG9sZGVyc0luVkZDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlUGF0aCA9IEZpbGVIYW5kbGluZy5nZXRSZXNvdXJjZXNGaWxlc1BhdGgoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gIkNQV2l0aEF0dHJpYnV0ZXMueW1sIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGF0b21pY1Jlc291cmNlTWV0YURhdGEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeSgKKwkJCQlSZXNvdXJjZVR5cGVFbnVtLlZGQywgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfTDJfM19ST1VURVJTLCBnZXRVc2VyKCkpOworCQlSZXNvdXJjZVVJVXRpbHMuaW1wb3J0VmZjKGF0b21pY1Jlc291cmNlTWV0YURhdGEsIGZpbGVQYXRoLCBmaWxlTmFtZSwgZ2V0VXNlcigpKTsKKworCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmdldExlZnRNZW51KCkubW92ZVRvSW5mb3JtYXRpb25hbEFydGlmYWN0U2NyZWVuKCk7CisKKwkJZm9yIChJbmZvcm1hdGlvbmFsQXJ0aWZhY3RzIGluZm9BcnRpZmFjdCA6IEluZm9ybWF0aW9uYWxBcnRpZmFjdHMudmFsdWVzKCkpIHsKKwkJCUFydGlmYWN0VUlVdGlscy5maWxsUGxhY2VIb2xkZXJJbmZvcm1hdGlvbmFsQXJ0aWZhY3QoaW5mb0FydGlmYWN0LCBmaWxlUGF0aCwgIkhlYXQtRmlsZSAxLnlhbWwiLAorCQkJCQlpbmZvQXJ0aWZhY3QubmFtZSgpKTsKKwkJfQorCisJCWFzc2VydFRydWUoSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5jaGVja0VsZW1lbnRzQ291bnRJblRhYmxlKEluZm9ybWF0aW9uYWxBcnRpZmFjdHMudmFsdWVzKCkubGVuZ3RoLAorCQkJCSgpIC0+IEluZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2UuZ2V0RWxlbWVuZXRzRnJvbVRhYmxlKCkpKTsKKworCQlJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmNsaWNrQWRkTmV3QXJ0aWZhY3QoKTsKKwkJU2VsZWN0IGFydGlmYWN0TGFiZWxMaXN0ID0gSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkuZGVmaW5lQXJ0aWZhY3RMYWJlbCgiIik7CisJCWFzc2VydEVxdWFscygxLCBhcnRpZmFjdExhYmVsTGlzdC5nZXRBbGxTZWxlY3RlZE9wdGlvbnMoKS5zaXplKCkpOworCisJfQorCisJQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gRWxlbWVudE5vdFZpc2libGVFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdXBsb2FkSW5mb3JtYXRpb25hQXJ0aWZhY3RNZXRkYXRhVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJDUFdpdGhBdHRyaWJ1dGVzLnltbCI7CisJCVJlc291cmNlUmVxRGV0YWlscyBhdG9taWNSZXNvdXJjZU1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoCisJCQkJUmVzb3VyY2VUeXBlRW51bS5WRkMsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywgZ2V0VXNlcigpKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmYyhhdG9taWNSZXNvdXJjZU1ldGFEYXRhLCBmaWxlUGF0aCwgZmlsZU5hbWUsIGdldFVzZXIoKSk7CisKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXRMZWZ0TWVudSgpLm1vdmVUb0luZm9ybWF0aW9uYWxBcnRpZmFjdFNjcmVlbigpOworCQlhc3NlcnRUcnVlKEluZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2UuY2hlY2tFbGVtZW50c0NvdW50SW5UYWJsZSgwLAorCQkJCSgpIC0+IEluZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2UuZ2V0RWxlbWVuZXRzRnJvbVRhYmxlKCkpKTsKKworCQlBcnRpZmFjdEluZm8gYXJ0aWZhY3RJbmZvID0gbmV3IEFydGlmYWN0SW5mbyhmaWxlUGF0aCwgIkhlYXQtRmlsZSAxLnlhbWwiLCAibmV3IGFydGlmYWN0IiwgImFydGlmYWN0MSIsCisJCQkJIk9USEVSIik7CisJCUluZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2UuY2xpY2tBZGROZXdBcnRpZmFjdCgpOworCQlBcnRpZmFjdFVJVXRpbHMuZmlsbEFuZEFkZE5ld0FydGlmYWN0UGFyYW1ldGVycyhhcnRpZmFjdEluZm8pOworCisJCWFzc2VydFRydWUoSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5jaGVja0VsZW1lbnRzQ291bnRJblRhYmxlKDEsCisJCQkJKCkgLT4gSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5nZXRFbGVtZW5ldHNGcm9tVGFibGUoKSkpOworCisJCVN0cmluZyBhY3R1bGFBcnRpZmFjdERlc2NyaXB0aW9uID0gSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZQorCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdExhYmVsKCkpOworCQlhc3NlcnRUcnVlKGFydGlmYWN0SW5mby5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhhY3R1bGFBcnRpZmFjdERlc2NyaXB0aW9uKSk7CisKKwkJSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5jbGlja0VkaXRBcnRpZmFjdChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkuZGVmaW5lQXJ0aWZhY3RMYWJlbCgiYXJ0aWZhY3QyIik7CisJfQorCisJLy8gQFRlc3QoKQorCS8vIHB1YmxpYyB2b2lkIHVwZGF0ZUluZm9ybWF0aW9uYWxBcnRpZmFjdCgpeworCS8vIEFydGlmYWN0SW5mbyBhcnRpZmFjdEluZm8gPSBuZXcgQXJ0aWZhY3RJbmZvKCIiLCAiIiwgIm5ldyBhcnRpZmFjdCIsCisJLy8gImFydGlmYWN0MSIsICIiKTsKKwkvLyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmNsaWNrRWRpdEFydGlmYWN0KCJhcnRpZmFjdDEiKTsKKwkvLyBTdHJpbmcgbmV3RGVzYyA9ICJuZXdEZXNjIjsKKwkvLyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmFydGlmYWN0UG9wdXAoKS5pbnNlcnREZXNjcmlwdGlvbihuZXdEZXNjKTsKKwkvLyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmFydGlmYWN0UG9wdXAoKS5jbGlja1VwZGF0ZUJ1dHRvbigpOworCS8vIFN0cmluZyBhY3R1bGFBcnRpZmFjdERlc2NyaXB0aW9uID0KKwkvLyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmdldEFydGlmYWN0RGVzY3JpcHRpb24oYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0TGFiZWwoKSk7CisJLy8gYXNzZXJ0VHJ1ZShuZXdEZXNjLmVxdWFscyhhY3R1bGFBcnRpZmFjdERlc2NyaXB0aW9uKSk7CisJLy8gSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5jbGlja0VkaXRBcnRpZmFjdChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkvLyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmFydGlmYWN0UG9wdXAoKS5kZWZpbmVBcnRpZmFjdExhYmVsKCJhcnRpZmFjdDIiKTsKKwkvLyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmFydGlmYWN0UG9wdXAoKS5zZWxlY3RBcnRpZmFjdFR5cGUoYXJ0aWZhY3RJbmZvLmdldEFydGlmYWN0VHlwZSgpKTsKKwkvLyB9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHZlcmlmeVR3b1Rvc2NhQXJ0aWZhY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBmaWxlUGF0aCA9IEZpbGVIYW5kbGluZy5nZXRSZXNvdXJjZXNGaWxlc1BhdGgoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gIkNQV2l0aEF0dHJpYnV0ZXMueW1sIjsKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGF0b21pY1Jlc291cmNlTWV0YURhdGEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeSgKKwkJCQlSZXNvdXJjZVR5cGVFbnVtLlZGQywgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfTDJfM19ST1VURVJTLCBnZXRVc2VyKCkpOworCQlSZXNvdXJjZVVJVXRpbHMuaW1wb3J0VmZjKGF0b21pY1Jlc291cmNlTWV0YURhdGEsIGZpbGVQYXRoLCBmaWxlTmFtZSwgZ2V0VXNlcigpKTsKKworCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmdldExlZnRNZW51KCkubW92ZVRvVG9zY2FBcnRpZmFjdHNTY3JlZW4oKTsKKworCQkvLyBMaXN0PFdlYkVsZW1lbnQ+IGVsZW1lbmV0c0Zyb21UYWJsZSA9CisJCS8vIEdlbmVyYWxQYWdlRWxlbWVudHMuZ2V0RWxlbWVuZXRzRnJvbVRhYmxlKCk7CisJCS8vIFN1cHBsaWVyPExpc3Q8V2ViRWxlbWVudD4+IHN1cHBsaWVyID0gKCkgLT4gZWxlbWVuZXRzRnJvbVRhYmxlOworCQkvLyBhc3NlcnRUcnVlKFRvc2NhQXJ0aWZhY3RzUGFnZS5jaGVja0VsZW1lbnRzQ291bnRJblRhYmxlKDIsCisJCS8vIHN1cHBsaWVyKSk7CisJCWFzc2VydFRydWUoVG9zY2FBcnRpZmFjdHNQYWdlLmNoZWNrRWxlbWVudHNDb3VudEluVGFibGUoMikpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBVc2VyUm9sZUVudW0gZ2V0Um9sZSgpIHsKKwkJcmV0dXJuIFVzZXJSb2xlRW51bS5ERVNJR05FUjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zYW5pdHkvT25ib2FyZC5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Nhbml0eS9PbmJvYXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYmM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zYW5pdHkvT25ib2FyZC5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zYW5pdHk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgamF2YS5hd3QuQVdURXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5DYW52YXNFbGVtZW50OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5DYW52YXNNYW5hZ2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlNlcnZpY2VDYXRlZ29yaWVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuVXNlclJvbGVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2V0dXAuU2V0dXBDRFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuQ29tcG9zaXRpb25QYWdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLkdlbmVyYWxQYWdlRWxlbWVudHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuR292ZXJub3JPcGVyYXRpb25QYWdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLk9wc09wZXJhdGlvblBhZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuUmVzb3VyY2VHZW5lcmFsUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5TZXJ2aWNlR2VuZXJhbFBhZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuVGVzdGVyT3BlcmF0aW9uUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuRmlsZUhhbmRsaW5nOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuT25ib2FyZGluZ1V0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5TZXJ2aWNlVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnZlcmlmaWNhdG9yLlNlcnZpY2VWZXJpZmljYXRvcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLkJ5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuRXhwZWN0ZWRDb25kaXRpb25zOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5XZWJEcml2ZXJXYWl0OworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgY29tLnJlbGV2YW50Y29kZXMuZXh0ZW50cmVwb3J0cy5Mb2dTdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBPbmJvYXJkIGV4dGVuZHMgU2V0dXBDRFRlc3QgeworCQorCisJcHVibGljIHN0YXRpYyBPYmplY3RbXVtdIHByb3ZpZGVEYXRhKE9iamVjdFtdIGZpbGVOYW1lc0Zyb21Gb2xkZXIsIFN0cmluZyBmaWxlcGF0aCkgeworCQlPYmplY3RbXVtdIGFyT2JqZWN0ID0gbmV3IE9iamVjdFtmaWxlTmFtZXNGcm9tRm9sZGVyLmxlbmd0aF1bXTsKKworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKE9iamVjdCBvYmogOiBmaWxlTmFtZXNGcm9tRm9sZGVyKSB7CisJCQlhck9iamVjdFtpbmRleCsrXSA9IG5ldyBPYmplY3RbXSB7IGZpbGVwYXRoLCBvYmogfTsKKwkJfQorCQlyZXR1cm4gYXJPYmplY3Q7CisJfQorCisJQERhdGFQcm92aWRlcihuYW1lID0gIlZORl9MaXN0IikKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIFZuZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVwYXRoID0gZ2V0RmlsZVBhdGgoKTsKKwkJT2JqZWN0W10gZmlsZU5hbWVzRnJvbUZvbGRlciA9IE9uYm9hcmRpbmdVdGlscy5nZXRaaXBGaWxlTmFtZXNGcm9tRm9sZGVyKGZpbGVwYXRoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIlRoZXJlIGFyZSAlcyB6aXAgZmlsZShzKSB0byB0ZXN0IiwgZmlsZU5hbWVzRnJvbUZvbGRlci5sZW5ndGgpKTsKKwkJcmV0dXJuIHByb3ZpZGVEYXRhKGZpbGVOYW1lc0Zyb21Gb2xkZXIsIGZpbGVwYXRoKTsKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiVk5GX0xpc3QiKQorCXB1YmxpYyB2b2lkIG9uYm9hcmRWTkZUZXN0KFN0cmluZyBmaWxlcGF0aCwgU3RyaW5nIHZuZkZpbGUpIHRocm93cyBFeGNlcHRpb24sIFRocm93YWJsZSB7CisJCVNldHVwQ0RUZXN0LnNldFNjcmVlbnNob3RGaWxlKHZuZkZpbGUpOworCQlleHRlbmRUZXN0LnNldERlc2NyaXB0aW9uKHZuZkZpbGUpOworCisJCVN0cmluZyB2c3BOYW1lID0gb25ib2FyZFZORihmaWxlcGF0aCwgdm5mRmlsZSk7CisKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5jbGlja1N1Ym1pdEZvclRlc3RpbmdCdXR0b24odnNwTmFtZSk7CisKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayh2c3BOYW1lKTsKKwkJVGVzdGVyT3BlcmF0aW9uUGFnZS5jZXJ0aWZ5Q29tcG9uZW50KHZzcE5hbWUpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCS8vIGNyZWF0ZSBzZXJ2aWNlCisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VNZXRhZGF0YSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCVNlcnZpY2VVSVV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZU1ldGFkYXRhLCBnZXRVc2VyKCkpOworCisJCVNlcnZpY2VHZW5lcmFsUGFnZS5nZXRMZWZ0TWVudSgpLm1vdmVUb0NvbXBvc2l0aW9uU2NyZWVuKCk7CisJCUNvbXBvc2l0aW9uUGFnZS5zZWFyY2hGb3JFbGVtZW50KHZzcE5hbWUpOworCQlDYW52YXNNYW5hZ2VyIHNlcnZpY2VDYW52YXNNYW5hZ2VyID0gQ2FudmFzTWFuYWdlci5nZXRDYW52YXNNYW5hZ2VyKCk7CisJCUNhbnZhc0VsZW1lbnQgdmZFbGVtZW50ID0gc2VydmljZUNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKHZzcE5hbWUpOworCQlhc3NlcnROb3ROdWxsKHZmRWxlbWVudCk7CisJCVNlcnZpY2VWZXJpZmljYXRvci52ZXJpZnlOdW1PZkNvbXBvbmVudEluc3RhbmNlcyhzZXJ2aWNlTWV0YWRhdGEsICIwLjEiLCAxLCBnZXRVc2VyKCkpOworCisJCVNlcnZpY2VHZW5lcmFsUGFnZS5jbGlja1N1Ym1pdEZvclRlc3RpbmdCdXR0b24oc2VydmljZU1ldGFkYXRhLmdldE5hbWUoKSk7CisKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayhzZXJ2aWNlTWV0YWRhdGEuZ2V0TmFtZSgpKTsKKwkJVGVzdGVyT3BlcmF0aW9uUGFnZS5jZXJ0aWZ5Q29tcG9uZW50KHNlcnZpY2VNZXRhZGF0YS5nZXROYW1lKCkpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5HT1ZFUk5PUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayhzZXJ2aWNlTWV0YWRhdGEuZ2V0TmFtZSgpKTsKKwkJR292ZXJub3JPcGVyYXRpb25QYWdlLmFwcHJvdmVTZXJpdmNlKHNlcnZpY2VNZXRhZGF0YS5nZXROYW1lKCkpOworCisvLwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLk9QUyk7CisvLwkJR2VuZXJhbFVJVXRpbHMuZmluZENvbXBvbmVudEFuZENsaWNrKHNlcnZpY2VNZXRhZGF0YS5nZXROYW1lKCkpOworLy8JCU9wc09wZXJhdGlvblBhZ2UuZGlzdHJpYnV0ZVNlcnZpY2UoKTsKKy8vCQlPcHNPcGVyYXRpb25QYWdlLmRpc3BsYXlNb25pdG9yKCk7CisvLworLy8JCUxpc3Q8V2ViRWxlbWVudD4gcm93c0Zyb21Nb25pdG9yVGFibGUgPSBPcHNPcGVyYXRpb25QYWdlLmdldFJvd3NGcm9tTW9uaXRvclRhYmxlKCk7CisvLwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKDEsIHJvd3NGcm9tTW9uaXRvclRhYmxlLnNpemUoKSk7CisvLworLy8JCU9wc09wZXJhdGlvblBhZ2Uud2FpdFVudGlsQXJ0aWZhY3RzRGlzdHJpYnV0ZWQoMCk7CisvLworLy8JCWV4dGVuZFRlc3QubG9nKExvZ1N0YXR1cy5QQVNTLCBTdHJpbmcuZm9ybWF0KCJvbmJvYXJkaW5nICVzIHRlc3QgaXMgcGFzc2VkICEgIiwgdm5mRmlsZSkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIG9uYm9hcmRWTkYoU3RyaW5nIGZpbGVwYXRoLCBTdHJpbmcgdm5mRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiwgVGhyb3dhYmxlIHsKKwkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLklORk8sIFN0cmluZy5mb3JtYXQoImdvaW5nIHRvIG9uYm9hcmQgdGhlIFZORiAlcy4uLi4uLiIsIHZuZkZpbGUpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoImdvaW5nIHRvIG9uYm9hcmQgdGhlIFZORiAlcy4uLi4uLiIsIHZuZkZpbGUpKTsKKworCQlPbmJvYXJkaW5nVXRpbHMuY3JlYXRlVmVuZG9yTGljZW5zZShnZXRVc2VyKCkpOworCQlTdHJpbmcgdnNwTmFtZSA9IE9uYm9hcmRpbmdVdGlscy5jcmVhdGVWZW5kb3JTb2Z0d2FyZVByb2R1Y3Qodm5mRmlsZSwgZmlsZXBhdGgsIGdldFVzZXIoKSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigicmVwb3NpdG9yeS1pY29uIikuY2xpY2soKTsKKwkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLklORk8sIFN0cmluZy5mb3JtYXQoInNlYXJjaGluZyBmb3Igb25ib2FyZGVkICVzIiwgdm5mRmlsZSkpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoIm9uYm9hcmRpbmctc2VhcmNoIikuc2VuZEtleXModnNwTmFtZSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoR2VuZXJhbFBhZ2VFbGVtZW50cy5jaGVja0VsZW1lbnRzQ291bnRJblRhYmxlKDIpKTsKKworCQlMaXN0PFdlYkVsZW1lbnQ+IGVsZW1lbmV0c0Zyb21UYWJsZSA9IEdlbmVyYWxQYWdlRWxlbWVudHMuZ2V0RWxlbWVuZXRzRnJvbVRhYmxlKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCksIDMwKTsKKwkJV2ViRWxlbWVudCBmaW5kRWxlbWVudCA9IHdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLnZpc2liaWxpdHlPZihlbGVtZW5ldHNGcm9tVGFibGUuZ2V0KDEpKSk7CisJCWZpbmRFbGVtZW50LmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLklORk8sCisJCQkJU3RyaW5nLmZvcm1hdCgiZ29pbmcgdG8gaW1wb3J0ICVzLi4uLi4uIiwgdm5mRmlsZS5zdWJzdHJpbmcoMCwgdm5mRmlsZS5pbmRleE9mKCIuIikpKSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiaW1wb3J0LWNzYXIiKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oImNyZWF0ZS9zYXZlIikuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlck9uYm9hcmRpbmcoKTsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0MiA9IG5ldyBXZWJEcml2ZXJXYWl0KEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLCAyICogNjApOworCQl3YWl0Mi51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoCisJCQkJQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIERhdGFUZXN0SWRFbnVtLkxpZmVDeWxlQ2hhbmdlQnV0dG9ucy5DSEVDS19JTi5nZXRWYWx1ZSgpICsgIiddIikpKTsKKwkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLlBBU1MsCisJCQkJU3RyaW5nLmZvcm1hdCgic3VjY2VlZGVkIHRvIGltcG9ydCAlcy4uLi4uLiIsIHZuZkZpbGUuc3Vic3RyaW5nKDAsIHZuZkZpbGUuaW5kZXhPZigiLiIpKSkpOworCQlyZXR1cm4gdnNwTmFtZTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7CisJCVN0cmluZyBmaWxlcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZXBhdGgiKTsKKwkJaWYgKGZpbGVwYXRoID09IG51bGwgJiYgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuY29udGFpbnMoIldpbmRvd3MiKSkgeworCQkJZmlsZXBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCX0KKwkJCisJCWVsc2UgaWYoZmlsZXBhdGguaXNFbXB0eSgpICYmICFTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5jb250YWlucygiV2luZG93cyIpKXsKKwkJCQlmaWxlcGF0aCA9IEZpbGVIYW5kbGluZy5nZXRCYXNlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyAiRmlsZXMiOworCQl9CisJCXJldHVybiBmaWxlcGF0aDsKKwl9CisJCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0d29PbmJvYXJkZWRWTkZzSW5TZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiwgVGhyb3dhYmxleworCQkKKwkJU3RyaW5nIGZpbGVwYXRoID0gZ2V0RmlsZVBhdGgoKTsKKwkJCisJCWZpbmFsIFN0cmluZyBkbnNTY2FsaW5nID0gIkROU3NjYWxpbmcxMi44LjE2LnppcCI7CisJCWZpbmFsIFN0cmluZyAgdkxCID0gInZMQjEyLjguMTYuemlwIjsKKwkJCisJCVN0cmluZ1tdIG9uYm9hcmRMaXN0ID0ge2Ruc1NjYWxpbmcsIHZMQn07CisJCQorCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHZzcE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisJCQorCQlmb3IgKFN0cmluZyB2bmYgOiBvbmJvYXJkTGlzdCl7CisJCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yRWxlbWVudHNMaXN0SW52aXNpYmlsaXR5KEJ5LmNsYXNzTmFtZSgidWktbm90aWZpY2F0aW9uIikpOworCQkJU3RyaW5nIHZzcE5hbWUgPSBvbmJvYXJkVk5GKGZpbGVwYXRoLCB2bmYpOworCQkJdnNwTWFwLnB1dCh2bmYsIHZzcE5hbWUpOworCQkJUmVzb3VyY2VHZW5lcmFsUGFnZS5jbGlja1N1Ym1pdEZvclRlc3RpbmdCdXR0b24odnNwTmFtZSk7CisJCX0KKwkJCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlmb3IgKFN0cmluZyB2c3BOYW1lIDogdnNwTWFwLnZhbHVlcygpKXsKKwkJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50c0xpc3RJbnZpc2liaWxpdHkoQnkuY2xhc3NOYW1lKCJ1aS1ub3RpZmljYXRpb24iKSk7CisJCQlHZW5lcmFsVUlVdGlscy5maW5kQ29tcG9uZW50QW5kQ2xpY2sodnNwTmFtZSk7CisJCQlUZXN0ZXJPcGVyYXRpb25QYWdlLmNlcnRpZnlDb21wb25lbnQodnNwTmFtZSk7CisJCX0KKwkJCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCVNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2VNZXRhZGF0YSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRTZXJ2aWNlKCk7CisJCVNlcnZpY2VVSVV0aWxzLmNyZWF0ZVNlcnZpY2Uoc2VydmljZU1ldGFkYXRhLCBnZXRVc2VyKCkpOworCQlTZXJ2aWNlR2VuZXJhbFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9Db21wb3NpdGlvblNjcmVlbigpOworCQlDYW52YXNNYW5hZ2VyIHNlcnZpY2VDYW52YXNNYW5hZ2VyID0gQ2FudmFzTWFuYWdlci5nZXRDYW52YXNNYW5hZ2VyKCk7CisJCQorCQlNYXA8U3RyaW5nLCBDYW52YXNFbGVtZW50PiBjYW52YXNFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxDYW52YXNFbGVtZW50PigpOworCQlmb3IgKFN0cmluZyB2c3BOYW1lIDogdnNwTWFwLnZhbHVlcygpKXsKKwkJCUNvbXBvc2l0aW9uUGFnZS5zZWFyY2hGb3JFbGVtZW50KHZzcE5hbWUpOworCQkJQ2FudmFzRWxlbWVudCB2ZkVsZW1lbnQgPSBzZXJ2aWNlQ2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXModnNwTmFtZSk7CisJCQlhc3NlcnROb3ROdWxsKHZmRWxlbWVudCk7CisJCQljYW52YXNFbGVtZW50cy5wdXQodnNwTmFtZSwgdmZFbGVtZW50KTsKKwkJfQorCQlTZXJ2aWNlVmVyaWZpY2F0b3IudmVyaWZ5TnVtT2ZDb21wb25lbnRJbnN0YW5jZXMoc2VydmljZU1ldGFkYXRhLCAiMC4xIiwgMiwgZ2V0VXNlcigpKTsKKwkJCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBVc2VyUm9sZUVudW0gZ2V0Um9sZSgpIHsKKwkJcmV0dXJuIFVzZXJSb2xlRW51bS5ERVNJR05FUjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zYW5pdHkvVmYuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zYW5pdHkvVmYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmEyMmVmCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3Nhbml0eS9WZi5qYXZhCkBAIC0wLDAgKzEsMzc3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zYW5pdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUuZGF0YXR5cGVzLmVudW1zLlJlc291cmNlVHlwZUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkFydGlmYWN0SW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ2FudmFzRWxlbWVudDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ2FudmFzTWFuYWdlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLkluZm9ybWF0aW9uYWxBcnRpZmFjdHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLkxlZnRQYW5lbENhbnZhc0l0ZW1zOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9wZXJ0eUluZm87CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuU2VydmljZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLk5vcm1hdGl2ZVR5cGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUHJvcGVydHlUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VDYXRlZ29yeUVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLkNvbXBvc2l0aW9uUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5EZXBsb3ltZW50QXJ0aWZhY3RQYWdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLkdvdmVybm9yT3BlcmF0aW9uUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5JbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLk9wc09wZXJhdGlvblBhZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuUHJvcGVydGllc1BhZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuUmVzb3VyY2VHZW5lcmFsUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5TZXJ2aWNlR2VuZXJhbFBhZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuVGVzdGVyT3BlcmF0aW9uUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuQXJ0aWZhY3RVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5GaWxlSGFuZGxpbmc7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5Qcm9wZXJ0aWVzVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuUmVzb3VyY2VVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5TZXJ2aWNlVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5nZW5lcmFsLkVsZW1lbnRGYWN0b3J5OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnZlcmlmaWNhdG9yLlNlcnZpY2VWZXJpZmljYXRvcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy52ZXJpZmljYXRvci5WZlZlcmlmaWNhdG9yOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uQnk7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5TZWxlY3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBWZiBleHRlbmRzIFNldHVwQ0RUZXN0IHsKKworCXByaXZhdGUgU3RyaW5nIGZpbGVQYXRoOworCisJQEJlZm9yZU1ldGhvZAorCXB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisJCWZpbGVQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlcGF0aCIpOworCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgeworCQkJZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNyZWF0ZVZGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gY3JlYXRlIFJlc291cmNlCisJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZU1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIGdldFVzZXIoKSk7CisJCVJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZU1ldGFEYXRhLCBnZXRVc2VyKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB1cGRhdGVWRigpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNyZWF0ZSBSZXNvdXJjZQorCQlSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2VNZXRhRGF0YSA9IEVsZW1lbnRGYWN0b3J5LmdldERlZmF1bHRSZXNvdXJjZUJ5VHlwZShSZXNvdXJjZVR5cGVFbnVtLlZGLCBnZXRVc2VyKCkpOworCQlSZXNvdXJjZVVJVXRpbHMuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VNZXRhRGF0YSwgZ2V0VXNlcigpKTsKKworCQkvLyB1cGRhdGUgUmVzb3VyY2UKKwkJU3RyaW5nIGV4cGVjdGVkRGVzYyA9ICJrdWt1IjsKKwkJcmVzb3VyY2VNZXRhRGF0YS5zZXREZXNjcmlwdGlvbihleHBlY3RlZERlc2MpOworCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmRlZmluZURlc2NyaXB0aW9uKGV4cGVjdGVkRGVzYyk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrVXBkYXRlQnV0dG9uKCk7CisKKwkJVmZWZXJpZmljYXRvci52ZXJpZnlWRlVwZGF0ZWRJblVJKHJlc291cmNlTWV0YURhdGEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdmZjTGlua2VkVG9Db21wdXRlSW5WZldpdGhBcnRpZmFjdHNGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFN0cmluZyBmaWxlUGF0aCA9IEZpbGVIYW5kbGluZy5nZXRSZXNvdXJjZXNGaWxlc1BhdGgoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gInZGV19WRkMueW1sIjsKKworCQkvLyBpbXBvcnQgUmVzb3VyY2UKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIGF0b21pY1Jlc291cmNlTWV0YURhdGEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGVOb3JtVHlwZUFuZENhdHJlZ29yeSgKKwkJCQlSZXNvdXJjZVR5cGVFbnVtLlZGQywgTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsIFJlc291cmNlQ2F0ZWdvcnlFbnVtLk5FVFdPUktfTDJfM19ST1VURVJTLCBnZXRVc2VyKCkpOworCQlSZXNvdXJjZVVJVXRpbHMuaW1wb3J0VmZjKGF0b21pY1Jlc291cmNlTWV0YURhdGEsIGZpbGVQYXRoLCBmaWxlTmFtZSwgZ2V0VXNlcigpKTsKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXRMZWZ0TWVudSgpLm1vdmVUb0luZm9ybWF0aW9uYWxBcnRpZmFjdFNjcmVlbigpOworCQlBcnRpZmFjdFVJVXRpbHMuZmlsbFBsYWNlSG9sZGVySW5mb3JtYXRpb25hbEFydGlmYWN0KEluZm9ybWF0aW9uYWxBcnRpZmFjdHMuQ0FQQUNJVFksIGZpbGVQYXRoLAorCQkJCSJhc2NfaGVhdCAwIDIueWFtbCIsICJjYXBhY2l0eSIpOworCQlBcnRpZmFjdFVJVXRpbHMuZmlsbFBsYWNlSG9sZGVySW5mb3JtYXRpb25hbEFydGlmYWN0KEluZm9ybWF0aW9uYWxBcnRpZmFjdHMuRkVBVFVSRVMsIGZpbGVQYXRoLAorCQkJCSJhc2NfaGVhdCAwIDIueWFtbCIsICJmZWF0dXJlcyIpOworCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmNsaWNrU3VibWl0Rm9yVGVzdGluZ0J1dHRvbihhdG9taWNSZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayhhdG9taWNSZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisJCVRlc3Rlck9wZXJhdGlvblBhZ2UuY2VydGlmeUNvbXBvbmVudChhdG9taWNSZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQkvLyBjcmVhdGUgUmVzb3VyY2UKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHZmTWV0YURhdGEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgZ2V0VXNlcigpKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmNyZWF0ZVJlc291cmNlKHZmTWV0YURhdGEsIGdldFVzZXIoKSk7CisKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXRMZWZ0TWVudSgpLm1vdmVUb0RlcGxveW1lbnRBcnRpZmFjdFNjcmVlbigpOworCisJCUFydGlmYWN0SW5mbyBhcnRpZmFjdDEgPSBuZXcgQXJ0aWZhY3RJbmZvKGZpbGVQYXRoLCAiYXNjX2hlYXQgMCAyLnlhbWwiLCAia3VrdSIsICJhcnRpZmFjdDEiLCAiT1RIRVIiKTsKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5jbGlja0FkZE5ld0FydGlmYWN0KCk7CisJCUFydGlmYWN0VUlVdGlscy5maWxsQW5kQWRkTmV3QXJ0aWZhY3RQYXJhbWV0ZXJzKGFydGlmYWN0MSk7CisJCUFydGlmYWN0SW5mbyBhcnRpZmFjdDIgPSBuZXcgQXJ0aWZhY3RJbmZvKGZpbGVQYXRoLCAic2FtcGxlLXhtbC1hbGxkYXRhLTEtMS54bWwiLCAia3VrdSIsICJhcnRpZmFjdDIiLAorCQkJCSJZQU5HX1hNTCIpOworCQlEZXBsb3ltZW50QXJ0aWZhY3RQYWdlLmNsaWNrQWRkTmV3QXJ0aWZhY3QoKTsKKwkJQXJ0aWZhY3RVSVV0aWxzLmZpbGxBbmRBZGROZXdBcnRpZmFjdFBhcmFtZXRlcnMoYXJ0aWZhY3QyKTsKKworCQlEZXBsb3ltZW50QXJ0aWZhY3RQYWdlLmdldExlZnRNZW51KCkubW92ZVRvQ29tcG9zaXRpb25TY3JlZW4oKTsKKwkJQ2FudmFzTWFuYWdlciBjYW52YXNNYW5hZ2VyID0gQ2FudmFzTWFuYWdlci5nZXRDYW52YXNNYW5hZ2VyKCk7CisJCUNhbnZhc0VsZW1lbnQgY29tcHV0ZUVsZW1lbnQgPSBjYW52YXNNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhMZWZ0UGFuZWxDYW52YXNJdGVtcy5DT01QVVRFKTsKKworCQlDb21wb3NpdGlvblBhZ2Uuc2VhcmNoRm9yRWxlbWVudChhdG9taWNSZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisJCUNhbnZhc0VsZW1lbnQgY3BFbGVtZW50ID0gY2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXMoYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsKGNwRWxlbWVudCk7CisJCVNlcnZpY2VWZXJpZmljYXRvci52ZXJpZnlOdW1PZkNvbXBvbmVudEluc3RhbmNlcyh2Zk1ldGFEYXRhLCAiMC4xIiwgMiwgZ2V0VXNlcigpKTsKKwkJY2FudmFzTWFuYWdlci5saW5rRWxlbWVudHMoY3BFbGVtZW50LCBjb21wdXRlRWxlbWVudCk7CisKKwkJdmZNZXRhRGF0YS5zZXRWZXJzaW9uKCIwLjEiKTsKKwkJVmZWZXJpZmljYXRvci52ZXJpZnlMaW5rQ3JlYXRlZCh2Zk1ldGFEYXRhLCBnZXRVc2VyKCksIDEpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBhZGRpbmdEZXBsb3ltZW50QXJ0aWZhY3RUb1ZGSW5zdGFuY2VJblNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gU3RyaW5nIGZpbGVQYXRoID0gRmlsZUhhbmRsaW5nLmdldFJlc291cmNlc0ZpbGVzUGF0aCgpOworCQkvLyBjcmVhdGUgUmVzb3VyY2UKKwkJUmVzb3VyY2VSZXFEZXRhaWxzIHZmTWV0YURhdGEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2VCeVR5cGUoUmVzb3VyY2VUeXBlRW51bS5WRiwgZ2V0VXNlcigpKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmNyZWF0ZVJlc291cmNlKHZmTWV0YURhdGEsIGdldFVzZXIoKSk7CisKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXRMZWZ0TWVudSgpLm1vdmVUb0RlcGxveW1lbnRBcnRpZmFjdFNjcmVlbigpOworCisJCUxpc3Q8QXJ0aWZhY3RJbmZvPiBkZXBsb3ltZW50QXJ0aWZhY3RMaXN0ID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdEluZm8+KCk7CisJCWRlcGxveW1lbnRBcnRpZmFjdExpc3QuYWRkKG5ldyBBcnRpZmFjdEluZm8oZmlsZVBhdGgsICJhc2NfaGVhdCAwIDIueWFtbCIsICJrdWt1IiwgImFydGlmYWN0MSIsICJPVEhFUiIpKTsKKwkJZGVwbG95bWVudEFydGlmYWN0TGlzdAorCQkJCS5hZGQobmV3IEFydGlmYWN0SW5mbyhmaWxlUGF0aCwgInNhbXBsZS14bWwtYWxsZGF0YS0xLTEueG1sIiwgImN1a3UiLCAiYXJ0aWZhY3QyIiwgIllBTkdfWE1MIikpOworCQlmb3IgKEFydGlmYWN0SW5mbyBkZXBsb3ltZW50QXJ0aWZhY3QgOiBkZXBsb3ltZW50QXJ0aWZhY3RMaXN0KSB7CisJCQlEZXBsb3ltZW50QXJ0aWZhY3RQYWdlLmNsaWNrQWRkTmV3QXJ0aWZhY3QoKTsKKwkJCUFydGlmYWN0VUlVdGlscy5maWxsQW5kQWRkTmV3QXJ0aWZhY3RQYXJhbWV0ZXJzKGRlcGxveW1lbnRBcnRpZmFjdCk7CisJCX0KKworCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmNsaWNrU3VibWl0Rm9yVGVzdGluZ0J1dHRvbih2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQVNEQ0xvZ28oKTsKKworCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlTWV0YWRhdGEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlTZXJ2aWNlVUlVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VNZXRhZGF0YSwgZ2V0VXNlcigpKTsKKworCQlTZXJ2aWNlR2VuZXJhbFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9Db21wb3NpdGlvblNjcmVlbigpOworCQlDb21wb3NpdGlvblBhZ2Uuc2VhcmNoRm9yRWxlbWVudCh2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisJCUNhbnZhc01hbmFnZXIgc2VydmljZUNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKwkJQ2FudmFzRWxlbWVudCB2ZkVsZW1lbnQgPSBzZXJ2aWNlQ2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXModmZNZXRhRGF0YS5nZXROYW1lKCkpOworCisJCXNlcnZpY2VDYW52YXNNYW5hZ2VyLmNsaWNrT25DYW52YUVsZW1lbnQodmZFbGVtZW50KTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvcmRhdGFUZXN0SWRWaXNpYmlsaXR5KCJkZXBsb3ltZW50LWFydGlmYWN0LXRhYiIpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JkYXRhVGVzdElkVmlzaWJpbGl0eSgiYWRkX0FydGlmYWN0X0J1dHRvbiIpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJQXJ0aWZhY3RJbmZvIGFydGlmYWN0MyA9IG5ldyBBcnRpZmFjdEluZm8oZmlsZVBhdGgsICJIZWF0LUZpbGUueWFtbCIsICJrdWt1IiwgImFydGlmYWN0MyIsCisJCQkJIkRDQUVfSU5WRU5UT1JZX1RPU0NBIik7CisJCWRlcGxveW1lbnRBcnRpZmFjdExpc3QuYWRkKGFydGlmYWN0Myk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiYXJ0aWZhY3QtbGFiZWwiKS5zZW5kS2V5cyhhcnRpZmFjdDMuZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkuc2VsZWN0QXJ0aWZhY3RUeXBlKGFydGlmYWN0My5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCURlcGxveW1lbnRBcnRpZmFjdFBhZ2UuYXJ0aWZhY3RQb3B1cCgpLmluc2VydERlc2NyaXB0aW9uKGFydGlmYWN0My5nZXREZXNjcmlwdGlvbigpKTsKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkubG9hZEZpbGUoYXJ0aWZhY3QzLmdldEZpbGVwYXRoKCksIGFydGlmYWN0My5nZXRGaWxlbmFtZSgpKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJEb25lIikuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCisJCUxpc3Q8V2ViRWxlbWVudD4gYWN0dWFsQXJ0aWZhY3RMaXN0ID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkud2FpdEZvckVsZW1lbnRzTGlzdFZpc2liaWxpdHkoQnkuY2xhc3NOYW1lKCJpLXNkYy1kZXNpZ25lci1zaWRlYmFyLXNlY3Rpb24tY29udGVudC1pdGVtLWFydGlmYWN0IikpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoZGVwbG95bWVudEFydGlmYWN0TGlzdC5zaXplKCksIGFjdHVhbEFydGlmYWN0TGlzdC5zaXplKCkpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBkaXN0aWJ1dGVWRkNJblZGSW5TZXJ2aWNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJ2RldfVkZDLnltbCI7CisKKwkJLy8gaW1wb3J0IFJlc291cmNlCisJCVJlc291cmNlUmVxRGV0YWlscyBhdG9taWNSZXNvdXJjZU1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoCisJCQkJUmVzb3VyY2VUeXBlRW51bS5WRkMsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywgZ2V0VXNlcigpKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmYyhhdG9taWNSZXNvdXJjZU1ldGFEYXRhLCBmaWxlUGF0aCwgZmlsZU5hbWUsIGdldFVzZXIoKSk7CisJCVJlc291cmNlR2VuZXJhbFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9JbmZvcm1hdGlvbmFsQXJ0aWZhY3RTY3JlZW4oKTsKKwkJQXJ0aWZhY3RVSVV0aWxzLmZpbGxQbGFjZUhvbGRlckluZm9ybWF0aW9uYWxBcnRpZmFjdChJbmZvcm1hdGlvbmFsQXJ0aWZhY3RzLkNBUEFDSVRZLCBmaWxlUGF0aCwKKwkJCQkiYXNjX2hlYXQgMCAyLnlhbWwiLCAiY2FwYWNpdHkiKTsKKwkJQXJ0aWZhY3RVSVV0aWxzLmZpbGxQbGFjZUhvbGRlckluZm9ybWF0aW9uYWxBcnRpZmFjdChJbmZvcm1hdGlvbmFsQXJ0aWZhY3RzLkZFQVRVUkVTLCBmaWxlUGF0aCwKKwkJCQkiYXNjX2hlYXQgMCAyLnlhbWwiLCAiZmVhdHVyZXMiKTsKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5jbGlja1N1Ym1pdEZvclRlc3RpbmdCdXR0b24oYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlHZW5lcmFsVUlVdGlscy5maW5kQ29tcG9uZW50QW5kQ2xpY2soYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCQlUZXN0ZXJPcGVyYXRpb25QYWdlLmNlcnRpZnlDb21wb25lbnQoYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisKKwkJLy8gY3JlYXRlIFJlc291cmNlCisJCVJlc291cmNlUmVxRGV0YWlscyB2Zk1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIGdldFVzZXIoKSk7CisJCVJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZSh2Zk1ldGFEYXRhLCBnZXRVc2VyKCkpOworCisJCVJlc291cmNlR2VuZXJhbFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9EZXBsb3ltZW50QXJ0aWZhY3RTY3JlZW4oKTsKKworCQlMaXN0PEFydGlmYWN0SW5mbz4gZGVwbG95bWVudEFydGlmYWN0TGlzdCA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3RJbmZvPigpOworCQlkZXBsb3ltZW50QXJ0aWZhY3RMaXN0LmFkZChuZXcgQXJ0aWZhY3RJbmZvKGZpbGVQYXRoLCAiYXNjX2hlYXQgMCAyLnlhbWwiLCAia3VrdSIsICJhcnRpZmFjdDEiLCAiT1RIRVIiKSk7CisJCWRlcGxveW1lbnRBcnRpZmFjdExpc3QKKwkJCQkuYWRkKG5ldyBBcnRpZmFjdEluZm8oZmlsZVBhdGgsICJzYW1wbGUteG1sLWFsbGRhdGEtMS0xLnhtbCIsICJrdWt1IiwgImFydGlmYWN0MiIsICJZQU5HX1hNTCIpKTsKKwkJZm9yIChBcnRpZmFjdEluZm8gZGVwbG95bWVudEFydGlmYWN0IDogZGVwbG95bWVudEFydGlmYWN0TGlzdCkgeworCQkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5jbGlja0FkZE5ld0FydGlmYWN0KCk7CisJCQlBcnRpZmFjdFVJVXRpbHMuZmlsbEFuZEFkZE5ld0FydGlmYWN0UGFyYW1ldGVycyhkZXBsb3ltZW50QXJ0aWZhY3QpOworCQl9CisKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5nZXRMZWZ0TWVudSgpLm1vdmVUb0NvbXBvc2l0aW9uU2NyZWVuKCk7CisJCUNhbnZhc01hbmFnZXIgdmZDYW52YXNNYW5hZ2VyID0gQ2FudmFzTWFuYWdlci5nZXRDYW52YXNNYW5hZ2VyKCk7CisJCUNhbnZhc0VsZW1lbnQgY29tcHV0ZUVsZW1lbnQgPSB2ZkNhbnZhc01hbmFnZXIuY3JlYXRlRWxlbWVudE9uQ2FudmFzKExlZnRQYW5lbENhbnZhc0l0ZW1zLkNPTVBVVEUpOworCQlDb21wb3NpdGlvblBhZ2Uuc2VhcmNoRm9yRWxlbWVudChhdG9taWNSZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisJCUNhbnZhc0VsZW1lbnQgY3BFbGVtZW50ID0gdmZDYW52YXNNYW5hZ2VyLmNyZWF0ZUVsZW1lbnRPbkNhbnZhcyhhdG9taWNSZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisKKwkJdmZDYW52YXNNYW5hZ2VyLmxpbmtFbGVtZW50cyhjcEVsZW1lbnQsIGNvbXB1dGVFbGVtZW50KTsKKworCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmNsaWNrU3VibWl0Rm9yVGVzdGluZ0J1dHRvbih2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayh2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisJCVRlc3Rlck9wZXJhdGlvblBhZ2UuY2VydGlmeUNvbXBvbmVudCh2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLkRFU0lHTkVSKTsKKworCQkvLyBjcmVhdGUgc2VydmljZQorCQlTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlTWV0YWRhdGEgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0U2VydmljZSgpOworCQlTZXJ2aWNlVUlVdGlscy5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VNZXRhZGF0YSwgZ2V0VXNlcigpKTsKKworCQlTZXJ2aWNlR2VuZXJhbFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9Db21wb3NpdGlvblNjcmVlbigpOworCQlDb21wb3NpdGlvblBhZ2Uuc2VhcmNoRm9yRWxlbWVudCh2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisJCUNhbnZhc01hbmFnZXIgc2VydmljZUNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKwkJQ2FudmFzRWxlbWVudCB2ZkVsZW1lbnQgPSBzZXJ2aWNlQ2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXModmZNZXRhRGF0YS5nZXROYW1lKCkpOworCisJCVNlcnZpY2VHZW5lcmFsUGFnZS5jbGlja1N1Ym1pdEZvclRlc3RpbmdCdXR0b24oc2VydmljZU1ldGFkYXRhLmdldE5hbWUoKSk7CisKKwkJcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtLlRFU1RFUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayhzZXJ2aWNlTWV0YWRhdGEuZ2V0TmFtZSgpKTsKKwkJVGVzdGVyT3BlcmF0aW9uUGFnZS5jZXJ0aWZ5Q29tcG9uZW50KHNlcnZpY2VNZXRhZGF0YS5nZXROYW1lKCkpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5HT1ZFUk5PUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayhzZXJ2aWNlTWV0YWRhdGEuZ2V0TmFtZSgpKTsKKwkJR292ZXJub3JPcGVyYXRpb25QYWdlLmFwcHJvdmVTZXJpdmNlKHNlcnZpY2VNZXRhZGF0YS5nZXROYW1lKCkpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5PUFMpOworCQlHZW5lcmFsVUlVdGlscy5maW5kQ29tcG9uZW50QW5kQ2xpY2soc2VydmljZU1ldGFkYXRhLmdldE5hbWUoKSk7CisJCU9wc09wZXJhdGlvblBhZ2UuZGlzdHJpYnV0ZVNlcnZpY2UoKTsKKwkJT3BzT3BlcmF0aW9uUGFnZS5kaXNwbGF5TW9uaXRvcigpOworCisJCUxpc3Q8V2ViRWxlbWVudD4gcm93c0Zyb21Nb25pdG9yVGFibGUgPSBPcHNPcGVyYXRpb25QYWdlLmdldFJvd3NGcm9tTW9uaXRvclRhYmxlKCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygxLCByb3dzRnJvbU1vbml0b3JUYWJsZS5zaXplKCkpOworCisJCVN0cmluZyBkZXBsb3ltZW50QXJ0aWZhY3RzU2l6ZSA9IFN0cmluZy52YWx1ZU9mKGRlcGxveW1lbnRBcnRpZmFjdExpc3Quc2l6ZSgpICsgMSk7CisKKwkJT3BzT3BlcmF0aW9uUGFnZS53YWl0VW50aWxBcnRpZmFjdHNEaXN0cmlidXRlZChkZXBsb3ltZW50QXJ0aWZhY3RzU2l6ZSwgMCk7CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZXNJblZGQ0luc3RhbmNlSW5WRigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBTdHJpbmcgZmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJ2RldfVkZDLnltbCI7CisKKwkJLy8gaW1wb3J0IFJlc291cmNlCisJCVJlc291cmNlUmVxRGV0YWlscyBhdG9taWNSZXNvdXJjZU1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlTm9ybVR5cGVBbmRDYXRyZWdvcnkoCisJCQkJUmVzb3VyY2VUeXBlRW51bS5WRkMsIE5vcm1hdGl2ZVR5cGVzRW51bS5ST09ULCBSZXNvdXJjZUNhdGVnb3J5RW51bS5ORVRXT1JLX0wyXzNfUk9VVEVSUywgZ2V0VXNlcigpKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydFZmYyhhdG9taWNSZXNvdXJjZU1ldGFEYXRhLCBmaWxlUGF0aCwgZmlsZU5hbWUsIGdldFVzZXIoKSk7CisJCVJlc291cmNlR2VuZXJhbFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9JbmZvcm1hdGlvbmFsQXJ0aWZhY3RTY3JlZW4oKTsKKwkJQXJ0aWZhY3RVSVV0aWxzLmZpbGxQbGFjZUhvbGRlckluZm9ybWF0aW9uYWxBcnRpZmFjdChJbmZvcm1hdGlvbmFsQXJ0aWZhY3RzLkNBUEFDSVRZLCBmaWxlUGF0aCwKKwkJCQkiYXNjX2hlYXQgMCAyLnlhbWwiLCAiY2FwYWNpdHkiKTsKKworCQlJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmdldExlZnRNZW51KCkubW92ZVRvUHJvcGVydGllc1NjcmVlbigpOworCQlpbnQgcHJvcGVydGllc0NvdW50ID0gUHJvcGVydGllc1BhZ2UuZ2V0RWxlbWVuZXRzRnJvbVRhYmxlKCkuc2l6ZSgpOworCisJCVByb3BlcnR5SW5mbyBwcm9wMSA9IG5ldyBQcm9wZXJ0eUluZm8oInAxIiwgInYxIiwgInByb3AxIiwgUHJvcGVydHlUeXBlRW51bS5TVFJJTkcpOworCisJCVByb3BlcnRpZXNQYWdlLmNsaWNrQWRkUHJvcGVydHlBcnRpZmFjdCgpOworCQlQcm9wZXJ0aWVzVUlVdGlscy5hZGROZXdQcm9wZXJ0eShwcm9wMSk7CisJCUFzc2VydEpVbml0LmFzc2VydFRydWUoUHJvcGVydGllc1BhZ2UuY2hlY2tFbGVtZW50c0NvdW50SW5UYWJsZShwcm9wZXJ0aWVzQ291bnQgKyAxLAorCQkJCSgpIC0+IFByb3BlcnRpZXNQYWdlLmdldEVsZW1lbmV0c0Zyb21UYWJsZSgpKSk7CisKKwkJUmVzb3VyY2VHZW5lcmFsUGFnZS5jbGlja1N1Ym1pdEZvclRlc3RpbmdCdXR0b24oYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCisJCVJlc291cmNlUmVxRGV0YWlscyB2Zk1ldGFEYXRhID0gRWxlbWVudEZhY3RvcnkuZ2V0RGVmYXVsdFJlc291cmNlQnlUeXBlKFJlc291cmNlVHlwZUVudW0uVkYsIGdldFVzZXIoKSk7CisJCVJlc291cmNlVUlVdGlscy5jcmVhdGVSZXNvdXJjZSh2Zk1ldGFEYXRhLCBnZXRVc2VyKCkpOworCisJCURlcGxveW1lbnRBcnRpZmFjdFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9Db21wb3NpdGlvblNjcmVlbigpOworCQlDYW52YXNNYW5hZ2VyIHZmQ2FudmFzTWFuYWdlciA9IENhbnZhc01hbmFnZXIuZ2V0Q2FudmFzTWFuYWdlcigpOworCQlDb21wb3NpdGlvblBhZ2Uuc2VhcmNoRm9yRWxlbWVudChhdG9taWNSZXNvdXJjZU1ldGFEYXRhLmdldE5hbWUoKSk7CisJCUNhbnZhc0VsZW1lbnQgdmZjRWxlbWVudCA9IHZmQ2FudmFzTWFuYWdlci5jcmVhdGVFbGVtZW50T25DYW52YXMoYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCisJCXZmQ2FudmFzTWFuYWdlci5jbGlja09uQ2FudmFFbGVtZW50KHZmY0VsZW1lbnQpOworCQlDb21wb3NpdGlvblBhZ2Uuc2hvd1Byb3BlcnRpZXNBbmRBdHRyaWJ1dGVzVGFiKCk7CisJCUxpc3Q8V2ViRWxlbWVudD4gcHJvcGVydGllcyA9IENvbXBvc2l0aW9uUGFnZS5nZXRQcm9wZXJ0aWVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQkvLyBXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJLy8gLCAzMCk7CisJCQkvLyBXZWJFbGVtZW50IGZpbmRFbGVtZW50ID0KKwkJCS8vIHdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLnZpc2liaWxpdHlPZihwcm9wZXJ0aWVzLmdldChpKS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoImktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcHJvcGVydHktYW5kLWF0dHJpYnV0ZS1sYWJlbCIpKSkpOworCQkJV2ViRWxlbWVudCBmaW5kRWxlbWVudCA9IHByb3BlcnRpZXMuZ2V0KGkpLmZpbmRFbGVtZW50KAorCQkJCQlCeS5jbGFzc05hbWUoImktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tcHJvcGVydHktYW5kLWF0dHJpYnV0ZS1sYWJlbCIpKTsKKwkJCWZpbmRFbGVtZW50LmNsaWNrKCk7CisJCQlQcm9wZXJ0aWVzUGFnZS5nZXRQcm9wZXJ0eVBvcHVwKCkuaW5zZXJ0UHJvcGVydHlEZWZhdWx0VmFsdWUoImFiYzEyMyIpOworCQkJUHJvcGVydGllc1BhZ2UuZ2V0UHJvcGVydHlQb3B1cCgpLmNsaWNrU2F2ZSgpOworCQkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckludmlzaWJpbGVFbGVtZW50KERhdGFUZXN0SWRFbnVtLlByb3BlcnRpZXNQYWdlRW51bS5TQVZFLmdldFZhbHVlKCkpOworCQl9CisJCXZmQ2FudmFzTWFuYWdlci5tb3ZlVG9GcmVlTG9jYXRpb24odmZNZXRhRGF0YS5nZXROYW1lKCkpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoImRlcGxveW1lbnQtYXJ0aWZhY3QtdGFiIikuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvcmRhdGFUZXN0SWRWaXNpYmlsaXR5KCJhZGRfQXJ0aWZhY3RfQnV0dG9uIikuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlBcnRpZmFjdEluZm8gYXJ0aWZhY3QzID0gbmV3IEFydGlmYWN0SW5mbyhmaWxlUGF0aCwgIkhlYXQtRmlsZS55YW1sIiwgImt1a3UiLCAiYXJ0aWZhY3QzIiwgIk9USEVSIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiYXJ0aWZhY3QtbGFiZWwiKS5zZW5kS2V5cyhhcnRpZmFjdDMuZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkuc2VsZWN0QXJ0aWZhY3RUeXBlKGFydGlmYWN0My5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCURlcGxveW1lbnRBcnRpZmFjdFBhZ2UuYXJ0aWZhY3RQb3B1cCgpLmluc2VydERlc2NyaXB0aW9uKGFydGlmYWN0My5nZXREZXNjcmlwdGlvbigpKTsKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkubG9hZEZpbGUoYXJ0aWZhY3QzLmdldEZpbGVwYXRoKCksIGFydGlmYWN0My5nZXRGaWxlbmFtZSgpKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJEb25lIikuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5URVNURVIpOworCQlHZW5lcmFsVUlVdGlscy5maW5kQ29tcG9uZW50QW5kQ2xpY2soYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCQlUZXN0ZXJPcGVyYXRpb25QYWdlLmNlcnRpZnlDb21wb25lbnQoYXRvbWljUmVzb3VyY2VNZXRhRGF0YS5nZXROYW1lKCkpOworCisJCXF1aXRBbmRSZUxvZ2luKFVzZXJSb2xlRW51bS5ERVNJR05FUik7CisJCUdlbmVyYWxVSVV0aWxzLmZpbmRDb21wb25lbnRBbmRDbGljayh2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisJCVJlc291cmNlR2VuZXJhbFBhZ2UuZ2V0TGVmdE1lbnUoKS5tb3ZlVG9Db21wb3NpdGlvblNjcmVlbigpOworCQl2ZkNhbnZhc01hbmFnZXIgPSBDYW52YXNNYW5hZ2VyLmdldENhbnZhc01hbmFnZXIoKTsKKwkJdmZDYW52YXNNYW5hZ2VyLmNsaWNrT25DYW52YUVsZW1lbnQodmZjRWxlbWVudCk7CisJCS8vIGNoYW5nZSB2ZXJzaW9uCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeU5hbWUoImNoYW5nZVZlcnNpb24iKTsKKwkJU2VsZWN0IHNlbGVjdGxpc3QgPSBuZXcgU2VsZWN0KEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeU5hbWUoImNoYW5nZVZlcnNpb24iKSk7CisJCXNlbGVjdGxpc3Quc2VsZWN0QnlWaXNpYmxlVGV4dCgiMS4wIik7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKworCQkvLyBHZW5lcmFsVUlVdGlscy53YWl0VW50aWxDbGlja2FibGVCdXR0b24oRGF0YVRlc3RJZEVudW0uTGlmZUN5bGVDaGFuZ2VCdXR0b25zLlNVQk1JVF9GT1JfVEVTVElORy5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkvLyBSZXNvdXJjZUdlbmVyYWxQYWdlLmNsaWNrU3VibWl0Rm9yVGVzdGluZ0J1dHRvbih2Zk1ldGFEYXRhLmdldE5hbWUoKSk7CisJCS8vCisJCS8vIHZmTWV0YURhdGEuc2V0VmVyc2lvbigiMC4xIik7CisJCS8vIFZmVmVyaWZpY2F0b3IudmVyaWZ5VkZMaWZlY3ljbGUodmZNZXRhRGF0YSwgZ2V0VXNlcigpLAorCQkvLyBMaWZlY3ljbGVTdGF0ZUVudW0uUkVBRFlfRk9SX0NFUlRJRklDQVRJT04pOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBVc2VyUm9sZUVudW0gZ2V0Um9sZSgpIHsKKwkJcmV0dXJuIFVzZXJSb2xlRW51bS5ERVNJR05FUjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXR1cC9PbmJvYXJkQ1NWUmVwb3J0LmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2V0dXAvT25ib2FyZENTVlJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzliMDIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2V0dXAvT25ib2FyZENTVlJlcG9ydC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBPbmJvYXJkQ1NWUmVwb3J0IHsKKworCXByaXZhdGUgU3RyaW5nQnVpbGRlciBzYjsKKwlwcml2YXRlIFByaW50V3JpdGVyIHB3OworCisJcHVibGljIE9uYm9hcmRDU1ZSZXBvcnQoU3RyaW5nIGZpbGVwYXRoLCBTdHJpbmcgZmlsZW5hbWUpIHsKKwkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQl0cnkgeworCQkJRmlsZSBjc3ZGaWxlID0gbmV3IEZpbGUoZmlsZXBhdGggKyBmaWxlbmFtZSk7CisJCQlwdyA9IG5ldyBQcmludFdyaXRlcihjc3ZGaWxlKTsKKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCX0KKworCXB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZFN0cmluZ1RvRmlsZShTdHJpbmcgY29udGVudCkgeworCQlyZXR1cm4gc2IuYXBwZW5kKGNvbnRlbnQgKyAiLCIpOworCX0KKworCXB1YmxpYyB2b2lkIG9wZW5OZXdSb3coKSB7CisJCXNiLmFwcGVuZCgiXG4iKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB3cml0ZVJvdyhTdHJpbmcuLi4gY29udGVudCkgeworCQlmb3IgKFN0cmluZyBzdHIgOiBjb250ZW50KSB7CisJCQlhcHBlbmRTdHJpbmdUb0ZpbGUoc3RyKTsKKwkJfQorCQlvcGVuTmV3Um93KCk7CisJfQorCisJcHVibGljIHZvaWQgY2xvc2VGaWxlKCkgeworCQlwdy53cml0ZShzYi50b1N0cmluZygpKTsKKwkJcHcuY2xvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXR1cC9SZW1vdGVXZWJEcml2ZXJUZXN0LmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2V0dXAvUmVtb3RlV2ViRHJpdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZmNhZmIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL2V4ZWN1dGUvc2V0dXAvUmVtb3RlV2ViRHJpdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLlBsYXRmb3JtOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uZmlyZWZveC5GaXJlZm94RHJpdmVyOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0ucmVtb3RlLkRlc2lyZWRDYXBhYmlsaXRpZXM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5yZW1vdGUuUmVtb3RlV2ViRHJpdmVyOworCitwdWJsaWMgY2xhc3MgUmVtb3RlV2ViRHJpdmVyVGVzdCB7CisKKwkvLyBAVGVzdAorCXB1YmxpYyB2b2lkIHJlbW90ZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGVzaXJlZENhcGFiaWxpdGllcyBjYXAgPSBuZXcgRGVzaXJlZENhcGFiaWxpdGllcygpLmZpcmVmb3goKTsKKwkJY2FwLnNldFBsYXRmb3JtKFBsYXRmb3JtLldJTkRPV1MpOworCQljYXAuc2V0QnJvd3Nlck5hbWUoImZpcmVmb3giKTsKKworCQlSZW1vdGVXZWJEcml2ZXIgcmVtb3RlRHJpdmVyID0gbmV3IFJlbW90ZVdlYkRyaXZlcihuZXcgVVJMKCJodHRwOi8vMS4yLjMuNDo1NTU1L3dkL2h1YiIpLCBjYXApOworCQlyZW1vdGVEcml2ZXIubmF2aWdhdGUoKS50bygiaHR0cDovL3d3dy5nb29nbGUuY28uaWwiKTsKKwkJcmVtb3RlRHJpdmVyLmZpbmRFbGVtZW50QnlOYW1lKCJxIikuc2VuZEtleXMoImV4ZWN1dGUgYXV0b21hdGlvbiIpOworCQlyZW1vdGVEcml2ZXIuZmluZEVsZW1lbnRCeU5hbWUoImJ0bksiKS5jbGljaygpOworCX0KK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXR1cC9TZXR1cENEVGVzdC5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9leGVjdXRlL3NldHVwL1NldHVwQ0RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyMTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvZXhlY3V0ZS9zZXR1cC9TZXR1cENEVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTM4IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Db21wb25lbnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Vc2VyQ3JlZGVudGlhbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLlVzZXJSb2xlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucnVuLlN0YXJ0VGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuRmlsZUhhbmRsaW5nOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LkNhdGFsb2dSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkRyaXZlcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLkV4cGVjdGVkQ29uZGl0aW9uczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuV2ViRHJpdmVyV2FpdDsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKKworaW1wb3J0IGNvbS5yZWxldmFudGNvZGVzLmV4dGVudHJlcG9ydHMuRXh0ZW50UmVwb3J0czsKK2ltcG9ydCBjb20ucmVsZXZhbnRjb2Rlcy5leHRlbnRyZXBvcnRzLkV4dGVudFRlc3Q7CitpbXBvcnQgY29tLnJlbGV2YW50Y29kZXMuZXh0ZW50cmVwb3J0cy5Mb2dTdGF0dXM7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXR1cENEVGVzdCB7CisKKwlwdWJsaWMgU2V0dXBDRFRlc3QoKSB7CisJCS8vIExvZ2dlckNvbnRleHQgbGMgPSAoTG9nZ2VyQ29udGV4dCkgTG9nZ2VyRmFjdG9yeS5nZXRJTG9nZ2VyRmFjdG9yeSgpOworCQkvLyBsYy5nZXRMb2dnZXIoIm9yZy5hcGFjaGUiKS5zZXRMZXZlbChMZXZlbC5JTkZPKTsKKwkJLy8vLyBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyIsCisJCS8vICJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLlNpbXBsZUxvZyIpOworCQkvLy8vIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc2ltcGxlbG9nLmxvZy5odHRwY2xpZW50LndpcmUiLAorCQkvLyAiT0ZGIik7CisJCS8vLy8gU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zaW1wbGVsb2cubG9nLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50IiwKKwkJLy8gIk9GRiIpOworCisJfQorCisJcHVibGljIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihTZXR1cENEVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisJLyoqKioqKioqKioqKioqKiogQ09OU1RBTlRTICoqKioqKioqKioqKioqKiovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRURFTlRJQUxTX0ZJTEUgPSAiY3JlZGVudGlhbHMueWFtbCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9GSUxFX05BTUUgPSAiQVNEQ19VSV9FeHRlbnRfUmVwb3J0Lmh0bWwiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9GT0xERVIgPSAiLi9FeHRlbnRSZXBvcnQvIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFTklVTV9OT0RFX1VSTCA9ICJodHRwOi8vJXM6JXMvd2QvaHViIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSRUVOU0hPVF9GT0xERVIgPSBSRVBPUlRfRk9MREVSICsgInNjcmVlbnNob3RzLyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX0NTVl9SRVBPUlRfRklMRV9OQU1FID0gIlNob3J0UmVwb3J0LmNzdiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9PRl9BVFRFTVBUU19UT19SRUZUUkVTSCA9IDI7CisKKwkvKioqKioqKioqKioqKioqKiBVU0VSUyAqKioqKioqKioqKioqKioqLworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBkZXNpZ25lclVzZXI7CisJcHJvdGVjdGVkIHN0YXRpYyBVc2VyIGFkbWluVXNlcjsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgdGVzdGVyVXNlcjsKKwlwcm90ZWN0ZWQgc3RhdGljIFVzZXIgZ292ZXJub3JVc2VyOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBvcHNVc2VyOworCXByb3RlY3RlZCBzdGF0aWMgVXNlciBwcm9kdWN0TWFuYWdlclVzZXI7CisKKwlwdWJsaWMgc3RhdGljIENvbmZpZyBjb25maWc7CisKKwkvKioqKioqKioqKioqKioqKiBQUklWQVRFUyAqKioqKioqKioqKioqKioqLworCXByaXZhdGUgTWFwPD8sID8+IGNyZWRlbnRpYWxzWWFtbEZpbGVNYXA7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVybDsKKwlwcml2YXRlIFVzZXIgdXNlcjsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsRW52ID0gdHJ1ZTsKKwlwcml2YXRlIGludCByZWZyZXNoQXR0ZW1wdHMgPSAwOworCisJcHJvdGVjdGVkIGFic3RyYWN0IFVzZXJSb2xlRW51bSBnZXRSb2xlKCk7CisKKwlwcm90ZWN0ZWQgRXh0ZW50UmVwb3J0cyBleHRlbnRSZXBvcnQ7CisJcHJvdGVjdGVkIHN0YXRpYyBFeHRlbnRUZXN0IGV4dGVuZFRlc3Q7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNjcmVlbnNob3RGaWxlOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2NyZWVuc2hvdEZpbGUoKSB7CisJCXJldHVybiBzY3JlZW5zaG90RmlsZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2NyZWVuc2hvdEZpbGUoU3RyaW5nIHNjcmVlbnNob3RGaWxlKSB7CisJCVNldHVwQ0RUZXN0LnNjcmVlbnNob3RGaWxlID0gc2NyZWVuc2hvdEZpbGU7CisJfQorCisJcHVibGljIHN0YXRpYyBFeHRlbnRUZXN0IGdldEV4dGVuZFRlc3QoKSB7CisJCXJldHVybiBleHRlbmRUZXN0OworCX0KKworCXByaXZhdGUgT25ib2FyZENTVlJlcG9ydCBjc3ZSZXBvcnQ7CisKKwlwdWJsaWMgT25ib2FyZENTVlJlcG9ydCBnZXRDc3ZSZXBvcnQoKSB7CisJCXJldHVybiBjc3ZSZXBvcnQ7CisJfQorCisJLyoqKioqKioqKioqKioqKiogQkVGT1JFICoqKioqKioqKioqKioqKiovCisKKwlAQmVmb3JlU3VpdGUoYWx3YXlzUnVuID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBzZXRFbnZQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJRmlsZSBkaXIgPSBuZXcgRmlsZShSRVBPUlRfRk9MREVSKTsKKwkJdHJ5IHsKKwkJCUZpbGVVdGlscy5kZWxldGVEaXJlY3RvcnkoZGlyKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQl9CisJCWV4dGVudFJlcG9ydCA9IG5ldyBFeHRlbnRSZXBvcnRzKFJFUE9SVF9GT0xERVIgKyBSRVBPUlRfRklMRV9OQU1FKTsKKwkJY3N2UmVwb3J0ID0gbmV3IE9uYm9hcmRDU1ZSZXBvcnQoUkVQT1JUX0ZPTERFUiwgU0hPUlRfQ1NWX1JFUE9SVF9GSUxFX05BTUUpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigiU2V0dXAuLi4uIik7CisJCWNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlzZXRVcmwoKTsKKwl9CisKKwlAQmVmb3JlTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCisJcHVibGljIHZvaWQgc2V0QnJvd3NlckJlZm9yZVRlc3QoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWV4dGVuZFRlc3QgPSBleHRlbnRSZXBvcnQuc3RhcnRUZXN0KG1ldGhvZC5nZXROYW1lKCkpOworCQlleHRlbmRUZXN0LmxvZyhMb2dTdGF0dXMuSU5GTywgIlRlc3Qgc3RhcnRlZCIpOworCQlzZXRCcm93c2VyQmVmb3JlVGVzdChnZXRSb2xlKCkpOworCX0KKworCS8qKioqKioqKioqKioqKioqIEFGVEVSICoqKioqKioqKioqKioqKiovCisJQEFmdGVyTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCisJcHVibGljIHZvaWQgcXVpdEFmdGVyVGVzdChJVGVzdFJlc3VsdCByZXN1bHQpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlpZiAocmVzdWx0LmdldFBhcmFtZXRlcnMoKS5sZW5ndGggIT0gMCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuZ2V0UGFyYW1ldGVycygpLmxlbmd0aCAtIDE7IGkrKykgeworCQkJCXNiLmFwcGVuZChyZXN1bHQuZ2V0UGFyYW1ldGVycygpW2ldLnRvU3RyaW5nKCkgKyAiLCIpOworCQkJfQorCQkJc2IuYXBwZW5kKHJlc3VsdC5nZXRQYXJhbWV0ZXJzKClbcmVzdWx0LmdldFBhcmFtZXRlcnMoKS5sZW5ndGggLSAxXS50b1N0cmluZygpKTsKKwkJfQorCisJCUZpbGUgaW1hZ2VGaWxlUGF0aCA9IEdlbmVyYWxVSVV0aWxzLnRha2VTY3JlZW5zaG90KHNjcmVlbnNob3RGaWxlLCBTQ1JFRU5TSE9UX0ZPTERFUiwgcmVzdWx0LmdldE5hbWUoKSk7CisJCWZpbmFsIFN0cmluZyBhYnNvbHV0ZVBhdGggPSBuZXcgRmlsZShSRVBPUlRfRk9MREVSKS50b1VSSSgpLnJlbGF0aXZpemUoaW1hZ2VGaWxlUGF0aC50b1VSSSgpKS5nZXRQYXRoKCk7CisJCWlmIChyZXN1bHQuZ2V0U3RhdHVzKCkgPT0gSVRlc3RSZXN1bHQuU1VDQ0VTUykgeworCQkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLlBBU1MsICJUZXN0IFJlc3VsdCA6IDxzcGFuIGNsYXNzPSdsYWJlbCBzdWNjZXNzJz5TdWNjZXNzPC9zcGFuPiIpOworCQkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLlBBU1MsCisJCQkJCSJGaW5pc2hlZCB0aGUgdGVzdCB3aXRoIHRoZSBmb2xsb3dpbmcgc2NyZWVuc2hvdCA6ICIgKyBleHRlbmRUZXN0LmFkZFNjcmVlbkNhcHR1cmUoYWJzb2x1dGVQYXRoKSk7CisJCQljc3ZSZXBvcnQud3JpdGVSb3cocmVzdWx0LmdldE5hbWUoKSwgc2IudG9TdHJpbmcoKSwgIlBBU1MiKTsKKwkJfSBlbHNlIGlmIChyZXN1bHQuZ2V0U3RhdHVzKCkgPT0gSVRlc3RSZXN1bHQuRkFJTFVSRSB8fCByZXN1bHQuZ2V0U3RhdHVzKCkgPT0gSVRlc3RSZXN1bHQuU0tJUCkgeworCQkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLkVSUk9SLCAiRVJST1IgLSBUaGUgZm9sbG93aW5nIGV4ZXBjdGlvbiBvY2N1cmVkIik7CisJCQlleHRlbmRUZXN0LmxvZyhMb2dTdGF0dXMuRVJST1IsIHJlc3VsdC5nZXRUaHJvd2FibGUoKSk7CisJCQlleHRlbmRUZXN0LmxvZyhMb2dTdGF0dXMuRVJST1IsCisJCQkJCSJGYWlsdXJlIGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNjcmVlbnNob3QgOiAiICsgZXh0ZW5kVGVzdC5hZGRTY3JlZW5DYXB0dXJlKGFic29sdXRlUGF0aCkpOworCQkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLkZBSUwsICI8c3BhbiBjbGFzcz0nbGFiZWwgZmFpbHVyZSc+RmFpbHVyZTwvc3Bhbj4iKTsKKwkJCWNzdlJlcG9ydC53cml0ZVJvdyhyZXN1bHQuZ2V0TmFtZSgpLCBzYi50b1N0cmluZygpLCAiRkFJTCIpOworCQl9CisKKwkJZXh0ZW50UmVwb3J0LmVuZFRlc3QoZXh0ZW5kVGVzdCk7CisJCWV4dGVudFJlcG9ydC5mbHVzaCgpOworCisJCXF1aXRCcm93c2VyKCk7CisvLwkJZGVsZXRlQ3JlYXRlZENvbXBvbmVudHMyKGdldENhdGFsb2dBc01hcCgpKTsKKwl9CisKKwlAQWZ0ZXJDbGFzcyhhbHdheXNSdW4gPSB0cnVlKQorCXB1YmxpYyB2b2lkIGFmdGVyU3VpdGUoKSB7CisJCWNzdlJlcG9ydC5jbG9zZUZpbGUoKTsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCXByaXZhdGUgTWFwPFN0cmluZywgQXJyYXlMaXN0PENvbXBvbmVudD4+IGdldENhdGFsb2dBc01hcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVJlc3RSZXNwb25zZSBjYXRhbG9nID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRDYXRhbG9nKGdldFVzZXIoKS5nZXRVc2VySWQoKSk7CisJCU1hcDxTdHJpbmcsIEFycmF5TGlzdDxDb21wb25lbnQ+PiBjb252ZXJ0Q2F0YWxvZ1Jlc3BvbnNlVG9KYXZhT2JqZWN0ID0gUmVzcG9uc2VQYXJzZXIKKwkJCQkuY29udmVydENhdGFsb2dSZXNwb25zZVRvSmF2YU9iamVjdChjYXRhbG9nLmdldFJlc3BvbnNlKCkpOworCQlyZXR1cm4gY29udmVydENhdGFsb2dSZXNwb25zZVRvSmF2YU9iamVjdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlQ3JlYXRlZENvbXBvbmVudHMyKE1hcDxTdHJpbmcsIEFycmF5TGlzdDxDb21wb25lbnQ+PiBjb252ZXJ0Q2F0YWxvZ1Jlc3BvbnNlVG9KYXZhT2JqZWN0KQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZmluYWwgU3RyaW5nIHVzZXJJZCA9IGdldFVzZXIoKS5nZXRVc2VySWQoKTsKKwkJQXJyYXlMaXN0PENvbXBvbmVudD4gcmVzb3VyY2VzQXJyYXlMaXN0ID0gY29udmVydENhdGFsb2dSZXNwb25zZVRvSmF2YU9iamVjdC5nZXQoInJlc291cmNlcyIpOworCisJCUxpc3Q8U3RyaW5nPiBjb2xsZWN0ID0gcmVzb3VyY2VzQXJyYXlMaXN0LnN0cmVhbSgpLmZpbHRlcihzIC0+IHMuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImNpIikpCisJCQkJLm1hcChlIC0+IGUuZ2V0VW5pcXVlSWQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJZm9yIChTdHJpbmcgdUlkIDogY29sbGVjdCkgeworCQkJUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2UodUlkLCB1c2VySWQpOworCQl9CisKKwkJcmVzb3VyY2VzQXJyYXlMaXN0ID0gY29udmVydENhdGFsb2dSZXNwb25zZVRvSmF2YU9iamVjdC5nZXQoInNlcnZpY2VzIik7CisJCWNvbGxlY3QgPSByZXNvdXJjZXNBcnJheUxpc3Quc3RyZWFtKCkuZmlsdGVyKHMgLT4gcy5nZXROYW1lKCkuc3RhcnRzV2l0aCgiY2kiKSkubWFwKGUgLT4gZS5nZXRVbmlxdWVJZCgpKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQlmb3IgKFN0cmluZyB1SWQgOiBjb2xsZWN0KSB7CisJCQlTZXJ2aWNlUmVzdFV0aWxzLmRlbGV0ZVNlcnZpY2VCeUlkKHVJZCwgdXNlcklkKTsKKwkJfQorCisJCXJlc291cmNlc0FycmF5TGlzdCA9IGNvbnZlcnRDYXRhbG9nUmVzcG9uc2VUb0phdmFPYmplY3QuZ2V0KCJwcm9kdWN0cyIpOworCQljb2xsZWN0ID0gcmVzb3VyY2VzQXJyYXlMaXN0LnN0cmVhbSgpLmZpbHRlcihzIC0+IHMuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImNpIikpLm1hcChlIC0+IGUuZ2V0VW5pcXVlSWQoKSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJZm9yIChTdHJpbmcgdUlkIDogY29sbGVjdCkgeworCQkJUHJvZHVjdFJlc3RVdGlscy5kZWxldGVQcm9kdWN0KHVJZCwgdXNlcklkKTsKKwkJfQorCisJfQorCisJLyoqKioqKioqKioqKioqKiogTUFJTiAqKioqKioqKioqKioqKioqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJydW5uaW5nIHRlc3QgZnJvbSBDTEkiKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworCQlTdHJpbmcgYXR0c2RjRmlsZVBhdGggPSBGaWxlSGFuZGxpbmcuZ2V0QmFzZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgImNvbmYiICsgRmlsZS5zZXBhcmF0b3IgKyAic2RjLnlhbWwiOworCQlTeXN0ZW0uc2V0UHJvcGVydHkoImNvbmZpZy5yZXNvdXJjZSIsIGF0dHNkY0ZpbGVQYXRoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJzZGMueWFtbCBmaWxlIHBhdGggaXMgOiAiICsgYXR0c2RjRmlsZVBhdGgpOworCisJCU9iamVjdFtdIHRlc3RTdWl0c0xpc3QgPSBGaWxlSGFuZGxpbmcKKwkJCQkuZ2V0RmlsZU5hbWVzRnJvbUZvbGRlcihGaWxlSGFuZGxpbmcuZ2V0QmFzZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgInRlc3RTdWl0ZXMiLCAiLnhtbCIpOworCQlpZiAodGVzdFN1aXRzTGlzdCAhPSBudWxsKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiRm91bmQgJXMgdGVzdFN1aXRlKHMpIiwgdGVzdFN1aXRzTGlzdC5sZW5ndGgpKTsKKwkJCWFyZ3MgPSBBcnJheXMuY29weU9mKHRlc3RTdWl0c0xpc3QsIHRlc3RTdWl0c0xpc3QubGVuZ3RoLCBTdHJpbmdbXS5jbGFzcyk7CisJCQlTdGFydFRlc3QubWFpbihhcmdzKTsKKwkJfQorCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHNldFVybCgpIHsKKwkJdXJsID0gY29uZmlnLmdldFVybCgpOworCQlpZiAodXJsID09IG51bGwpIHsKKwkJCVN0cmluZyBtZXNzYWdlID0gIm5vIFVSTCBmb3VuZCI7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CisJCQlBc3NlcnQuZmFpbChtZXNzYWdlKTsKKwkJfSBlbHNlIGlmICghdXJsLmNvbnRhaW5zKCJsb2NhbGhvc3QiKSAmJiAhdXJsLmNvbnRhaW5zKCIxMjcuMC4wLjEiKSkgeworCQkJbG9jYWxFbnYgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdXJsOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBsb2FkQ3JlZGVudGlhbHNGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZpbGUgY3JlZGVudGlhbHNGaWxlID0gbmV3IEZpbGUoCisJCQkJRmlsZUhhbmRsaW5nLmdldEJhc2VQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICJjb25mIiArIEZpbGUuc2VwYXJhdG9yICsgQ1JFREVOVElBTFNfRklMRSk7CisJCWlmICghY3JlZGVudGlhbHNGaWxlLmV4aXN0cygpKSB7CisJCQljcmVkZW50aWFsc0ZpbGUgPSBuZXcgRmlsZShGaWxlSGFuZGxpbmcuZ2V0Q29uZkZpbGVzUGF0aCgpICsgQ1JFREVOVElBTFNfRklMRSk7CisJCX0KKwkJY3JlZGVudGlhbHNZYW1sRmlsZU1hcCA9IChNYXA8U3RyaW5nLCBTdHJpbmc+KSBGaWxlSGFuZGxpbmcucGFyc2VZYW1sRmlsZShjcmVkZW50aWFsc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQlyZXR1cm4gKE1hcDxTdHJpbmcsIFN0cmluZz4pIGNyZWRlbnRpYWxzWWFtbEZpbGVNYXA7CisJfQorCisJcHJvdGVjdGVkIFVzZXJDcmVkZW50aWFscyBnZXRVc2VyQ3JlZGVudGlhbHNGcm9tRmlsZShTdHJpbmcgdXNlclJvbGUpIHRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWRlbnRpYWxzTWFwID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIGNyZWRlbnRpYWxzWWFtbEZpbGVNYXAuZ2V0KHVzZXJSb2xlKTsKKwkJU3RyaW5nIHVzZXIgPSAoU3RyaW5nKSBjcmVkZW50aWFsc01hcC5nZXQoInVzZXJuYW1lIik7CisJCVN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpIGNyZWRlbnRpYWxzTWFwLmdldCgicGFzc3dvcmQiKTsKKwkJU3RyaW5nIGZpcnN0bmFtZSA9IChTdHJpbmcpIGNyZWRlbnRpYWxzTWFwLmdldCgiZmlyc3RuYW1lIik7CisJCVN0cmluZyBsYXN0bmFtZSA9IChTdHJpbmcpIGNyZWRlbnRpYWxzTWFwLmdldCgibGFzdG5hbWUiKTsKKworCQlyZXR1cm4gbmV3IFVzZXJDcmVkZW50aWFscyh1c2VyLCBwYXNzd29yZCwgZmlyc3RuYW1lLCBsYXN0bmFtZSk7CisJfQorCisJcHVibGljIFVzZXJDcmVkZW50aWFscyB1cGRhdGVVc2VyVXNlcklkKFN0cmluZyByb2xlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJ1cGRhdGluZy4uLiIpOworCQlVc2VyQ3JlZGVudGlhbHMgZGVzaWduZXJDcmVkZW50aWFsc0Zyb21GaWxlID0gbnVsbDsKKwkJVXNlckNyZWRlbnRpYWxzIHRlc3RlckNyZWRlbnRpYWxzRnJvbUZpbGUgPSBudWxsOworCQlVc2VyQ3JlZGVudGlhbHMgYWRtaW5DcmVkZW50aWFsc0Zyb21GaWxlID0gbnVsbDsKKwkJVXNlckNyZWRlbnRpYWxzIG9wc0NyZWRlbnRpYWxzRnJvbUZpbGUgPSBudWxsOworCQlVc2VyQ3JlZGVudGlhbHMgZ292ZXJub3JDcmVkZW50aWFsc0Zyb21GaWxlID0gbnVsbDsKKwkJVXNlckNyZWRlbnRpYWxzIHByb2R1Y3RDcmVkZW50aWFsc0Zyb21GaWxlID0gbnVsbDsKKwkJVXNlckNyZWRlbnRpYWxzIHByb2R1Y3RNYW5hZ2VyQ3JlZGVudGlhbHNGcm9tRmlsZSA9IG51bGw7CisKKwkJU3RyaW5nIGxvd2VyQ2FzZVJvbGUgPSByb2xlLnRvTG93ZXJDYXNlKCk7CisJCXRyeSB7CisJCQlpZiAobG93ZXJDYXNlUm9sZS5lcXVhbHMoImRlc2lnbmVyIikpIHsKKwkJCQlkZXNpZ25lckNyZWRlbnRpYWxzRnJvbUZpbGUgPSBnZXRVc2VyQ3JlZGVudGlhbHNGcm9tRmlsZSgiZGVzaWduZXIiKTsKKwkJCQlkZXNpZ25lclVzZXIuc2V0VXNlcklkKGRlc2lnbmVyQ3JlZGVudGlhbHNGcm9tRmlsZS5nZXRVc2VySWQoKSk7CisJCQkJZGVzaWduZXJVc2VyLnNldEZpcnN0TmFtZShkZXNpZ25lckNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0Rmlyc3ROYW1lKCkpOworCQkJCWRlc2lnbmVyVXNlci5zZXRMYXN0TmFtZShkZXNpZ25lckNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0TGFzdE5hbWUoKSk7CisJCQkJcmV0dXJuIGRlc2lnbmVyQ3JlZGVudGlhbHNGcm9tRmlsZTsKKwkJCX0gZWxzZSBpZiAobG93ZXJDYXNlUm9sZS5lcXVhbHMoInRlc3RlciIpKSB7CisJCQkJdGVzdGVyQ3JlZGVudGlhbHNGcm9tRmlsZSA9IGdldFVzZXJDcmVkZW50aWFsc0Zyb21GaWxlKCJ0ZXN0ZXIiKTsKKwkJCQl0ZXN0ZXJVc2VyLnNldFVzZXJJZCh0ZXN0ZXJDcmVkZW50aWFsc0Zyb21GaWxlLmdldFVzZXJJZCgpKTsKKwkJCQl0ZXN0ZXJVc2VyLnNldEZpcnN0TmFtZSh0ZXN0ZXJDcmVkZW50aWFsc0Zyb21GaWxlLmdldEZpcnN0TmFtZSgpKTsKKwkJCQl0ZXN0ZXJVc2VyLnNldExhc3ROYW1lKHRlc3RlckNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0TGFzdE5hbWUoKSk7CisJCQkJcmV0dXJuIHRlc3RlckNyZWRlbnRpYWxzRnJvbUZpbGU7CisJCQl9IGVsc2UgaWYgKGxvd2VyQ2FzZVJvbGUuZXF1YWxzKCJhZG1pbiIpKSB7CisJCQkJYWRtaW5DcmVkZW50aWFsc0Zyb21GaWxlID0gZ2V0VXNlckNyZWRlbnRpYWxzRnJvbUZpbGUoImFkbWluIik7CisJCQkJYWRtaW5Vc2VyLnNldFVzZXJJZChhZG1pbkNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0VXNlcklkKCkpOworCQkJCWFkbWluVXNlci5zZXRGaXJzdE5hbWUoYWRtaW5DcmVkZW50aWFsc0Zyb21GaWxlLmdldEZpcnN0TmFtZSgpKTsKKwkJCQlhZG1pblVzZXIuc2V0TGFzdE5hbWUoYWRtaW5DcmVkZW50aWFsc0Zyb21GaWxlLmdldExhc3ROYW1lKCkpOworCQkJCXJldHVybiBhZG1pbkNyZWRlbnRpYWxzRnJvbUZpbGU7CisJCQl9IGVsc2UgaWYgKGxvd2VyQ2FzZVJvbGUuZXF1YWxzKCJvcHMiKSkgeworCQkJCW9wc0NyZWRlbnRpYWxzRnJvbUZpbGUgPSBnZXRVc2VyQ3JlZGVudGlhbHNGcm9tRmlsZSgib3BzIik7CisJCQkJb3BzVXNlci5zZXRVc2VySWQob3BzQ3JlZGVudGlhbHNGcm9tRmlsZS5nZXRVc2VySWQoKSk7CisJCQkJb3BzVXNlci5zZXRGaXJzdE5hbWUob3BzQ3JlZGVudGlhbHNGcm9tRmlsZS5nZXRGaXJzdE5hbWUoKSk7CisJCQkJb3BzVXNlci5zZXRMYXN0TmFtZShvcHNDcmVkZW50aWFsc0Zyb21GaWxlLmdldExhc3ROYW1lKCkpOworCQkJCXJldHVybiBvcHNDcmVkZW50aWFsc0Zyb21GaWxlOworCQkJfSBlbHNlIGlmIChsb3dlckNhc2VSb2xlID09ICJnb3Zlcm5vciIpIHsKKwkJCQlnb3Zlcm5vckNyZWRlbnRpYWxzRnJvbUZpbGUgPSBnZXRVc2VyQ3JlZGVudGlhbHNGcm9tRmlsZSgiZ292ZXJub3IiKTsKKwkJCQlnb3Zlcm5vclVzZXIuc2V0VXNlcklkKGdvdmVybm9yQ3JlZGVudGlhbHNGcm9tRmlsZS5nZXRVc2VySWQoKSk7CisJCQkJZ292ZXJub3JVc2VyLnNldEZpcnN0TmFtZShnb3Zlcm5vckNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0Rmlyc3ROYW1lKCkpOworCQkJCWdvdmVybm9yVXNlci5zZXRMYXN0TmFtZShnb3Zlcm5vckNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0TGFzdE5hbWUoKSk7CisJCQkJcmV0dXJuIGdvdmVybm9yQ3JlZGVudGlhbHNGcm9tRmlsZTsKKwkJCX0gZWxzZSBpZiAobG93ZXJDYXNlUm9sZSA9PSAicHJvZHVjdF9sb2NhbCIpIHsKKwkJCQlwcm9kdWN0Q3JlZGVudGlhbHNGcm9tRmlsZSA9IGdldFVzZXJDcmVkZW50aWFsc0Zyb21GaWxlKCJwcm9kdWN0X2xvY2FsIik7CisJCQkJcHJvZHVjdE1hbmFnZXJVc2VyLnNldFVzZXJJZChwcm9kdWN0Q3JlZGVudGlhbHNGcm9tRmlsZS5nZXRVc2VySWQoKSk7CisJCQkJcHJvZHVjdE1hbmFnZXJVc2VyLnNldEZpcnN0TmFtZShwcm9kdWN0Q3JlZGVudGlhbHNGcm9tRmlsZS5nZXRGaXJzdE5hbWUoKSk7CisJCQkJcHJvZHVjdE1hbmFnZXJVc2VyLnNldExhc3ROYW1lKHByb2R1Y3RDcmVkZW50aWFsc0Zyb21GaWxlLmdldExhc3ROYW1lKCkpOworCQkJCXJldHVybiBwcm9kdWN0Q3JlZGVudGlhbHNGcm9tRmlsZTsKKwkJCX0gZWxzZSBpZiAobG93ZXJDYXNlUm9sZSA9PSAicHJvZHVjdF9tYW5hZ2VyIikgeworCQkJCXByb2R1Y3RNYW5hZ2VyQ3JlZGVudGlhbHNGcm9tRmlsZSA9IGdldFVzZXJDcmVkZW50aWFsc0Zyb21GaWxlKCJwcm9kdWN0X21hbmFnZXIiKTsKKwkJCQlwcm9kdWN0TWFuYWdlclVzZXIuc2V0VXNlcklkKHByb2R1Y3RNYW5hZ2VyQ3JlZGVudGlhbHNGcm9tRmlsZS5nZXRVc2VySWQoKSk7CisJCQkJcHJvZHVjdE1hbmFnZXJVc2VyLnNldEZpcnN0TmFtZShwcm9kdWN0TWFuYWdlckNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0Rmlyc3ROYW1lKCkpOworCQkJCXByb2R1Y3RNYW5hZ2VyVXNlci5zZXRMYXN0TmFtZShwcm9kdWN0TWFuYWdlckNyZWRlbnRpYWxzRnJvbUZpbGUuZ2V0TGFzdE5hbWUoKSk7CisJCQkJcmV0dXJuIHByb2R1Y3RNYW5hZ2VyQ3JlZGVudGlhbHNGcm9tRmlsZTsKKwkJCX0KKwkJfQorCisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludCgiQW4gZXhjZXB0aW9uIG9jY3VyZWQuLi4iKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT5leGNlcHRpb24gbWVzc2FnZSBpcyA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbmF2aWdhdGVUb1VybChTdHJpbmcgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJV2ViRHJpdmVyIGRyaXZlciA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJuYXZpZ2F0aW5nIHRvIFVSTCA6IiArIHVybCk7CisJCQlkcml2ZXIubWFuYWdlKCkud2luZG93KCkubWF4aW1pemUoKTsKKwkJCWRyaXZlci5tYW5hZ2UoKS5kZWxldGVBbGxDb29raWVzKCk7CisJCQlkcml2ZXIubmF2aWdhdGUoKS50byh1cmwpOworCQkJR2VuZXJhbFVJVXRpbHMud2luZG93Wm9vbU91dCgpOworCQkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJicm93c2VyIGlzIHVucmVhY2hhYmxlIik7CisJCQlleHRlbmRUZXN0LmxvZyhMb2dTdGF0dXMuRVJST1IsICJicm93c2VyIGlzIHVucmVhY2hhYmxlIik7CisJCQlBc3NlcnQuZmFpbCgiYnJvd3NlciBpcyB1bnJlYWNoYWJsZSIpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbG9naW5Ub1N5c3RlbShVc2VyQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMsIFVzZXJSb2xlRW51bSByb2xlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlzZW5kVXNlckFuZFBhc3N3b3JkS2V5cyhjcmVkZW50aWFscyk7CisJCXJlZnJlc2hBdHRlbXB0cyA9IChyZWZyZXNoQXR0ZW1wdHMgPT0gMCkgPyBOVU1fT0ZfQVRURU1QVFNfVE9fUkVGVFJFU0ggOiByZWZyZXNoQXR0ZW1wdHM7CisJCWlmICghZ2V0Um9sZSgpLmVxdWFscyhVc2VyUm9sZUVudW0uQURNSU4pKSB7CisJCQl0cnkgeworCQkJCWlmKCFsb2NhbEVudil7CisvLwkJCQkJR2VuZXJhbFVJVXRpbHMudWx0aW1hdGVXYWl0KCk7CisJCQkJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLCAzICogNjApOworCQkJCQlXZWJFbGVtZW50IHNkY0FwcCA9IHdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLmVsZW1lbnRUb0JlQ2xpY2thYmxlKEJ5LmlkKCJhcHAtaW1hZ2UtU0RDIikpKTsKKwkJCQkJc2RjQXBwLmNsaWNrKCk7CisJCQkJCUdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLnN3aXRjaFRvKCkuZnJhbWUoMSk7CisJCQkJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JkYXRhVGVzdElkVmlzaWJpbGl0eSgibWFpbi1tZW51LWlucHV0LXNlYXJjaCIpOworCQkJCX0KKwkJCQllbHNleworCQkJCQllbnRlclRvVXNlcldvcmtzcGFjZSgpOworCQkJCX0KKwkJCQkKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJcmVmcmVzaEF0dGVtcHRzLS07CisJCQkJaWYgKHJlZnJlc2hBdHRlbXB0cyA8PSAwKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRVJSIDogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggYnJvd3NlciEiKTsKKwkJCQkJQXNzZXJ0LmZhaWwoIkVSUiA6IFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGJyb3dzZXIhIik7CisJCQkJfQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHJ5aW5nIGFnYWluLi4uIik7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzIGF0dGVtcHQocykgbGVmdCIsIHJlZnJlc2hBdHRlbXB0cykpOworCQkJCWV4dGVuZFRlc3QubG9nKExvZ1N0YXR1cy5JTkZPLCAidHJ5aW5nIGFnYWluLi4uIik7CisJCQkJZXh0ZW5kVGVzdC5sb2coTG9nU3RhdHVzLklORk8sIFN0cmluZy5mb3JtYXQoIiVzIGF0dGVtcHQocykgbGVmdCIsIHJlZnJlc2hBdHRlbXB0cykpOworCisJCQkJcXVpdEFuZFJlTG9naW4ocm9sZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2VuZFVzZXJBbmRQYXNzd29yZEtleXMoVXNlckNyZWRlbnRpYWxzIHVzZXJJZCkgeworCQkKKwkJaWYgKGxvY2FsRW52KXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9naW4gd2l0aCB1c2VyIDogIiArIHVzZXJJZC5nZXRVc2VySWQoKSk7CisJCQlXZWJFbGVtZW50IHVzZXJOYW1lVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50VmlzaWJpbGl0eShCeS5uYW1lKCJ1c2VyaWQiKSk7CisJCQl1c2VyTmFtZVRleHRib3guc2VuZEtleXModXNlcklkLmdldFVzZXJJZCgpKTsKKwkJCVdlYkVsZW1lbnQgcGFzc3dvcmRUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRWaXNpYmlsaXR5KEJ5Lm5hbWUoInBhc3N3b3JkIikpOworCQkJcGFzc3dvcmRUZXh0Ym94LnNlbmRLZXlzKHVzZXJJZC5nZXRQYXNzd29yZCgpKTsKKwkJCQorCQkJV2ViRWxlbWVudCBzdWJtaXRCdXR0b24gPSBHZW5lcmFsVUlVdGlscy53YWl0Rm9yRWxlbWVudFZpc2liaWxpdHkoQnkubmFtZSgiYnRuU3VibWl0IikpOworCQkJc3VibWl0QnV0dG9uLmNsaWNrKCk7CisJCQlXZWJFbGVtZW50IGJ1dHRvbk9LID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRWaXNpYmlsaXR5KEJ5Lm5hbWUoInN1Y2Nlc3NPSyIpKTsKKwkJCUFzc2VydEpVbml0LmFzc2VydFRydWUoYnV0dG9uT0suaXNEaXNwbGF5ZWQoKSk7CisJCQlidXR0b25PSy5jbGljaygpOworCQl9CisJCWVsc2UKKwkJeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2dpbiB3aXRoIHVzZXIgOiAiICsgdXNlcklkLmdldFVzZXJJZCgpKTsKKwkJCVdlYkVsZW1lbnQgdXNlck5hbWVUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY3NzU2VsZWN0b3IoImlucHV0W3R5cGU9J3RleHQnXSIpKTsKKwkJCXVzZXJOYW1lVGV4dGJveC5zZW5kS2V5cyh1c2VySWQuZ2V0VXNlcklkKCkpOworCQkJV2ViRWxlbWVudCBwYXNzd29yZFRleHRib3ggPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5jc3NTZWxlY3RvcigiaW5wdXRbdHlwZT0ncGFzc3dvcmQnXSIpKTsKKwkJCXBhc3N3b3JkVGV4dGJveC5zZW5kS2V5cyh1c2VySWQuZ2V0UGFzc3dvcmQoKSk7CisJCQkKKwkJCUdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmlkKCJsb2dpbkJ0biIpKS5jbGljaygpOworCQl9CisJCQorCQkKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisJCVNldHVwQ0RUZXN0LnVybCA9IHVybDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbmZpZyBnZXRDb25maWcoKSB7CisJCXJldHVybiBjb25maWc7CisJfQorCQorCXB1YmxpYyB2b2lkIGxvZ2luVG9TeXN0ZW0oVXNlclJvbGVFbnVtIHJvbGUpeworCQlXZWJEcml2ZXIgZHJpdmVyID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCk7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KGRyaXZlciwgMzApOworCQkKKwkJd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mKGRyaXZlci5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BtZXRob2Q9JyIgKyAicG9zdCIgKyAiJ10iKSkpKTsKKwkJCisJCVdlYkVsZW1lbnQgdXNlcklkVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50VmlzaWJpbGl0eShCeS5uYW1lKCJ1c2VySWQiKSk7CisJCXVzZXJJZFRleHRib3guc2VuZEtleXMocm9sZS5nZXRVc2VySWQoKSk7CisJCVdlYkVsZW1lbnQgcGFzc3dvcmRUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRWaXNpYmlsaXR5KEJ5Lm5hbWUoInBhc3N3b3JkIikpOworCQlwYXNzd29yZFRleHRib3guc2VuZEtleXMoIjEyMzEyM2EiKTsKKwkJCisJCXdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLmVsZW1lbnRUb0JlQ2xpY2thYmxlKGRyaXZlci5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0B2YWx1ZT0nIiArICJTdWJtaXQiICsgIiddIikpKSkuY2xpY2soKTsKKwkJCisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dpbldpdGhVc2VyKFVzZXJSb2xlRW51bSByb2xlKSB7CisJCXNldFVzZXIocm9sZSk7CisJCXRyeSB7CisJCQluYXZpZ2F0ZVRvVXJsKHVybCk7CisJCQlleHRlbmRUZXN0LmxvZyhMb2dTdGF0dXMuSU5GTywgU3RyaW5nLmZvcm1hdCgibG9naW4gd2l0aCB1c2VyICVzIiwgcm9sZS5uYW1lKCkudG9VcHBlckNhc2UoKSkpOworCQkJaWYgKGxvY2FsRW52KSB7CisJCQkJbG9naW5Ub1N5c3RlbShyb2xlKTsKKwkJCQllbnRlclRvVXNlcldvcmtzcGFjZSgpOworCQkJfQorCQkJZWxzZXsKKwkJCQlsb2FkQ3JlZGVudGlhbHNGaWxlKCk7CisJCQkJVXNlckNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzID0gZ2V0VXNlckNyZWRlbnRpYWxzRnJvbUZpbGUocm9sZS5uYW1lKCkudG9Mb3dlckNhc2UoKSk7CisJCQkJbG9naW5Ub1N5c3RlbShjcmVkZW50aWFscywgcm9sZSk7CisJCQkJdXNlciA9IGNyZWRlbnRpYWxzOworCQkJfQorCQkJCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBlbnRlclRvVXNlcldvcmtzcGFjZSgpIHsKKwkJV2ViRWxlbWVudCBlbnRlclRvVXNlcldvcmtzcGFjZUJ1dHRvbiA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50VmlzaWJpbGl0eShCeS5jbGFzc05hbWUoImFzZGMtd2VsY29tZS1tYWluLWJhY2stYnRuIiksIDMgKiA2MCk7CisJCWVudGVyVG9Vc2VyV29ya3NwYWNlQnV0dG9uLmNsaWNrKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJpbmcgdG8gc3lzdGVtLi4uIik7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VXNlcihVc2VyUm9sZUVudW0gcm9sZSkgeworCQl1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlci5zZXRVc2VySWQocm9sZS5nZXRVc2VySWQoKSk7CisJCXVzZXIuc2V0Rmlyc3ROYW1lKHJvbGUuZ2V0Rmlyc3ROYW1lKCkpOworCQl1c2VyLnNldFJvbGUocm9sZS5uYW1lKCkpOworCQl1c2VyLnNldExhc3ROYW1lKHJvbGUuZ2V0TGFzdE5hbWUoKSk7CisJfQorCisJcHVibGljIFVzZXIgZ2V0VXNlcigpIHsKKwkJcmV0dXJuIHVzZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0QnJvd3NlckJlZm9yZVRlc3QoVXNlclJvbGVFbnVtIHJvbGUpIHsKKwkJcmVmcmVzaEF0dGVtcHRzID0gMDsKKwkJU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIlNldHVwIGJlZm9yZSB0ZXN0IGFzICVzIiwgcm9sZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkpKTsKKwkJR2VuZXJhbFVJVXRpbHMuaW5pdERyaXZlcigpOworCQlsb2dpbldpdGhVc2VyKHJvbGUpOworCX0KKworCXB1YmxpYyBVc2VyIGdldFVzZXIoVXNlclJvbGVFbnVtIHJvbGUpIHsKKwkJVXNlciB1c2VyID0gbmV3IFVzZXIoKTsKKwkJdXNlciA9IG5ldyBVc2VyKCk7CisJCXVzZXIuc2V0VXNlcklkKHJvbGUuZ2V0VXNlcklkKCkpOworCQl1c2VyLnNldEZpcnN0TmFtZShyb2xlLmdldEZpcnN0TmFtZSgpKTsKKwkJdXNlci5zZXRSb2xlKHJvbGUubmFtZSgpKTsKKwkJcmV0dXJuIHVzZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcXVpdEFuZFJlTG9naW4oVXNlclJvbGVFbnVtIHJvbGUpIHRocm93cyBFeGNlcHRpb24geworCQlxdWl0QnJvd3NlcigpOworCQlpZiAobG9jYWxFbnYpIHsKKwkJCWxvZ2luVG9TeXN0ZW0ocm9sZSk7CisJCX0KKwkJc2V0QnJvd3NlckJlZm9yZVRlc3Qocm9sZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHF1aXRCcm93c2VyKCkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsb3NpbmcgYnJvd3Nlci4uLiIpOworCQlHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5xdWl0KCk7CisJfQorCisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJhbmRvbUNvbXBvbmVudE5hbWUoU3RyaW5nIHByZWZpeCkgeworCQlyZXR1cm4gcHJlZml4ICsgcmFuZG9tTnVtYmVyKCk7CisJfQorCisJcHJvdGVjdGVkIGludCByYW5kb21OdW1iZXIoKSB7CisJCVJhbmRvbSByID0gbmV3IFJhbmRvbSgpOworCQlyZXR1cm4gci5uZXh0SW50KDEwMDAwKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvQ29tcG9uZW50TGVmdE1lbnUuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvQ29tcG9uZW50TGVmdE1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzk1NTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9Db21wb25lbnRMZWZ0TWVudS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlczsKKworcHVibGljIGludGVyZmFjZSBDb21wb25lbnRMZWZ0TWVudSB7CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvQ29tcG9zaXRpb25QYWdlLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL0NvbXBvc2l0aW9uUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTVjZTkKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL0NvbXBvc2l0aW9uUGFnZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBDb21wb3NpdGlvblBhZ2UgZXh0ZW5kcyBHZW5lcmFsUGFnZUVsZW1lbnRzIHsKKworCXB1YmxpYyBDb21wb3NpdGlvblBhZ2UoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNlYXJjaEZvckVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCVdlYkVsZW1lbnQgc2VhcmNoRmllbGQgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInNlYXJjaEFzc2V0Iik7CisJCXNlYXJjaEZpZWxkLmNsZWFyKCk7CisJCXNlYXJjaEZpZWxkLnNlbmRLZXlzKGVsZW1lbnROYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5zbGVlcCg1MDApOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RGVwbG95bWVudEFydGlmYWN0VGFiKCkgeworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoImRlcGxveW1lbnQtYXJ0aWZhY3QtdGFiIikuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93UHJvcGVydGllc0FuZEF0dHJpYnV0ZXNUYWIoKSB7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JkYXRhVGVzdElkVmlzaWJpbGl0eSgicHJvcGVydGllcy1hbmQtYXR0cmlidXRlcy10YWIiKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFdlYkVsZW1lbnQ+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBQcm9wZXJ0aWVzUGFnZS5nZXRFbGVtZW5ldHNGcm9tVGFibGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL0RlcGxveW1lbnRBcnRpZmFjdFBhZ2UuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvRGVwbG95bWVudEFydGlmYWN0UGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGVkZDgKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL0RlcGxveW1lbnRBcnRpZmFjdFBhZ2UuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNvbW1vbi5hcGkuQXJ0aWZhY3RHcm91cFR5cGVFbnVtOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKKworcHVibGljIGNsYXNzIERlcGxveW1lbnRBcnRpZmFjdFBhZ2UgZXh0ZW5kcyBHZW5lcmFsUGFnZUVsZW1lbnRzIHsKKworCXB1YmxpYyBEZXBsb3ltZW50QXJ0aWZhY3RQYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VMZWZ0TWVudSBnZXRMZWZ0UGFuZWwoKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VMZWZ0TWVudSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgVXBsb2FkQXJ0aWZhY3RQb3B1cCBhcnRpZmFjdFBvcHVwKCkgeworCQlyZXR1cm4gbmV3IFVwbG9hZEFydGlmYWN0UG9wdXAoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkTmV3QXJ0aWZhY3QoQXJ0aWZhY3RHcm91cFR5cGVFbnVtIGFydGlmYWN0R3JvdXBUeXBlKSB7CisJCXN3aXRjaCAoYXJ0aWZhY3RHcm91cFR5cGUpIHsKKwkJY2FzZSBERVBMT1lNRU5UOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKERhdGFUZXN0SWRFbnVtLkFydGlmYWN0UGFnZUVudW0uQUREX0RFUExPWU1FTlRfQVJUSUZBQ1QuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWJyZWFrOworCQljYXNlIElORk9STUFUSU9OQUw6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQYWdlRW51bS5BRERfSU5GT1JNQVRJT05BTF9BUlRJRkFDVC5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0FkZE5ld0FydGlmYWN0KCkgeworCQlhZGROZXdBcnRpZmFjdChBcnRpZmFjdEdyb3VwVHlwZUVudW0uREVQTE9ZTUVOVCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrQWRkQW5vdGhlckFydGlmYWN0KCkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQYWdlRW51bS5BRERfQU5PVEhFUl9BUlRJRkFDVC5nZXRWYWx1ZSgpKS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0VkaXRBcnRpZmFjdChTdHJpbmcgYXJ0aWZhY3RMYWJlbCkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQYWdlRW51bS5FRElUX0FSVElGQUNULmdldFZhbHVlKCkgKyBhcnRpZmFjdExhYmVsKS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0RlbGV0ZUFydGlmYWN0KFN0cmluZyBhcnRpZmFjdExhYmVsKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5BcnRpZmFjdFBhZ2VFbnVtLkRFTEVURV9BUlRJRkFDVC5nZXRWYWx1ZSgpICsgYXJ0aWZhY3RMYWJlbCkuY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tEb3dubG9hZEFydGlmYWN0KFN0cmluZyBhcnRpZmFjdExhYmVsKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5BcnRpZmFjdFBhZ2VFbnVtLkRPV05MT0FEX0FSVElGQUNULmdldFZhbHVlKCkgKyBhcnRpZmFjdExhYmVsKQorCQkJCS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFydGlmYWN0RGVzY3JpcHRpb24oU3RyaW5nIGFydGlmYWN0TGFiZWwpIHRocm93cyBFeGNlcHRpb24geworCQljbGlja09uQXJ0aWZhY3QoYXJ0aWZhY3RMYWJlbCk7IC8vIG9wZW4gYXJ0aWZhY3QKKwkJV2ViRWxlbWVudCBhcnRpZmFjdERlc2NyaXB0aW9uRWxlbWVudCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgKKwkJCQlEYXRhVGVzdElkRW51bS5BcnRpZmFjdFBhZ2VFbnVtLkdFVF9ERVBMT1lNRU5UX0FSVElGQUNUX0RFU0NSSVBUSU9OLmdldFZhbHVlKCkpOworCQlTdHJpbmcgYXJ0aWZhY3REZXNjID0gYXJ0aWZhY3REZXNjcmlwdGlvbkVsZW1lbnQuZ2V0VGV4dCgpOworCQljbGlja09uQXJ0aWZhY3QoYXJ0aWZhY3RMYWJlbCk7IC8vIGNsb3NlIGFydGlmYWN0CisKKwkJcmV0dXJuIGFydGlmYWN0RGVzYzsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tPbkFydGlmYWN0KFN0cmluZyBhcnRpZmFjdExhYmVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKGFydGlmYWN0TGFiZWwpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvR2VuZXJhbFBhZ2VFbGVtZW50cy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9HZW5lcmFsUGFnZUVsZW1lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhMzg0MwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvR2VuZXJhbFBhZ2VFbGVtZW50cy5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkxpZmVDeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLkJ5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKKworaW1wb3J0IGNvbS5yZWxldmFudGNvZGVzLmV4dGVudHJlcG9ydHMuTG9nU3RhdHVzOworCitwdWJsaWMgY2xhc3MgR2VuZXJhbFBhZ2VFbGVtZW50cyB7CisKKwlwdWJsaWMgR2VuZXJhbFBhZ2VFbGVtZW50cygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlTGVmdE1lbnUgZ2V0TGVmdE1lbnUoKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VMZWZ0TWVudSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0NyZWF0ZUJ1dHRvbigpIHsKKwkJU2V0dXBDRFRlc3QuZ2V0RXh0ZW5kVGVzdCgpLmxvZyhMb2dTdGF0dXMuSU5GTywgImNyZWF0aW5nLi4uIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5HZW5lcmFsRWxlbWVudHNFbnVtLkNSRUFURV9CVVRUT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0NoZWNraW5CdXR0b24oU3RyaW5nIGNvbXBvbmVudE5hbWUpIHRocm93cyBFeGNlcHRpb24geworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCAiY2xpY2tpbmcgb24gY2hlY2tpbiIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uR2VuZXJhbEVsZW1lbnRzRW51bS5DSEVDS0lOX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5BQ0NFUF9URVNUSU5HX01FU1NBR0UuZ2V0VmFsdWUoKSkKKwkJCQkuc2VuZEtleXMoIkNoZWNraW4gIiArIGNvbXBvbmVudE5hbWUpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5PSy5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCWFzc2VydFRydWUoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJmb3JtbGlmZWN5Y2xlc3RhdGUiKS5nZXRUZXh0KCkKKwkJCQkuZXF1YWxzKExpZmVDeWNsZVN0YXRlRW51bS5DSEVDS0lOLmdldFZhbHVlKCkpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tTdWJtaXRGb3JUZXN0aW5nQnV0dG9uKFN0cmluZyBjb21wb25lbnROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sICJzdWJtaXRpbmcgZm9yIHRlc3RpbmciKTsKKwkJCUdlbmVyYWxVSVV0aWxzCisJCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTGlmZUN5bGVDaGFuZ2VCdXR0b25zLlNVQk1JVF9GT1JfVEVTVElORy5nZXRWYWx1ZSgpKQorCQkJCQkuY2xpY2soKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLlNVTUJJVF9GT1JfVEVTVElOR19NRVNTQUdFLmdldFZhbHVlKCkpCisJCQkJCS5zZW5kS2V5cygiU3VibWl0IGZvciB0ZXN0aW5nIGZvciAiICsgY29tcG9uZW50TmFtZSk7CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5PSy5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQkJR2VuZXJhbFVJVXRpbHMuc2xlZXAoMjAwMCk7CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoIm1haW4tbWVudS1pbnB1dC1zZWFyY2giKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IGU7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tEZWxldGVWZXJzaW9uQnV0dG9uKCkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uR2VuZXJhbEVsZW1lbnRzRW51bS5ERUxFVEVfVkVSU0lPTl9CVVRUT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tSZXZlcnRCdXR0b24oKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5HZW5lcmFsRWxlbWVudHNFbnVtLlJFVkVSVF9CVVRUT04uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaWZlQ3ljbGVTdGF0ZSgpIHsKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5HZW5lcmFsRWxlbWVudHNFbnVtLkxJRkVDWUNMRV9TVEFURS5nZXRWYWx1ZSgpKS5nZXRUZXh0KCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdCh2ZXJzaW9uLCBEYXRhVGVzdElkRW51bS5HZW5lcmFsRWxlbWVudHNFbnVtLlZFUlNJT05fSEVBREVSLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXRFbGVtZW5ldHNGcm9tVGFibGUoKSB7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldEVsZW1lbmV0c0Zyb21UYWJsZShCeS5jbGFzc05hbWUoImZsZXgtY29udGFpbmVyIikpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0VsZW1lbnRzQ291bnRJblRhYmxlKGludCBleHBlY3RlZEVsZW1lbnRzQ291bnQpIHsKKwkJLy8gaW50IG1heFdhaXRpbmdQZXJpb2RNUyA9IDEwMDA7CisJCS8vIGludCBuYXBQZXJpb2RNUyA9IDEwMDsKKwkJLy8gaW50IHN1bU9mV2FpdGluZyA9IDA7CisJCS8vIExpc3Q8V2ViRWxlbWVudD4gZWxlbWVtdHMgPSBudWxsOworCQkvLyBib29sZWFuIGlzS2VlcFdhaXRpbmcgPSBmYWxzZTsKKwkJLy8gd2hpbGUgKCFpc0tlZXBXYWl0aW5nKXsKKwkJLy8gR2VuZXJhbFVJVXRpbHMuc2xlZXAobmFwUGVyaW9kTVMpOworCQkvLyBzdW1PZldhaXRpbmcgKz0gbmFwUGVyaW9kTVM7CisJCS8vIGVsZW1lbXRzID0gZ2V0RWxlbWVuZXRzRnJvbVRhYmxlKCk7CisJCS8vIGlzS2VlcFdhaXRpbmcgPSAoIGV4cGVjdGVkRWxlbWVudHNDb3VudCA9PSBlbGVtZW10cy5zaXplKCkgKTsKKwkJLy8gaWYgKHN1bU9mV2FpdGluZyA+IG1heFdhaXRpbmdQZXJpb2RNUykKKwkJLy8gcmV0dXJuIGZhbHNlOworCQkvLyB9CisJCS8vCisJCS8vIHJldHVybiB0cnVlOworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCAiY2hlY2tpbmcgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRhYmxlIik7CisJCXJldHVybiBjaGVja0VsZW1lbnRzQ291bnRJblRhYmxlKGV4cGVjdGVkRWxlbWVudHNDb3VudCwgKCkgLT4gZ2V0RWxlbWVuZXRzRnJvbVRhYmxlKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0VsZW1lbnRzQ291bnRJblRhYmxlKGludCBleHBlY3RlZEVsZW1lbnRzQ291bnQsIFN1cHBsaWVyPExpc3Q8V2ViRWxlbWVudD4+IGZ1bmMpIHsKKwkJaW50IG1heFdhaXRpbmdQZXJpb2RNUyA9IDEwMDAwOworCQlpbnQgbmFwUGVyaW9kTVMgPSAxMDA7CisJCWludCBzdW1PZldhaXRpbmcgPSAwOworCQlMaXN0PFdlYkVsZW1lbnQ+IGVsZW1lbnRzID0gbnVsbDsKKwkJYm9vbGVhbiBpc0tlZXBXYWl0aW5nID0gZmFsc2U7CisJCXdoaWxlICghaXNLZWVwV2FpdGluZykgeworCQkJR2VuZXJhbFVJVXRpbHMuc2xlZXAobmFwUGVyaW9kTVMpOworCQkJc3VtT2ZXYWl0aW5nICs9IG5hcFBlcmlvZE1TOworCQkJZWxlbWVudHMgPSBmdW5jLmdldCgpOworCQkJaXNLZWVwV2FpdGluZyA9IChleHBlY3RlZEVsZW1lbnRzQ291bnQgPT0gZWxlbWVudHMuc2l6ZSgpKTsKKwkJCWlmIChzdW1PZldhaXRpbmcgPiBtYXhXYWl0aW5nUGVyaW9kTVMpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9Hb3Zlcm5vck9wZXJhdGlvblBhZ2UuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvR292ZXJub3JPcGVyYXRpb25QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU3ZWFmMQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvR292ZXJub3JPcGVyYXRpb25QYWdlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmV4ZWN1dGUuc2V0dXAuU2V0dXBDRFRlc3Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworCitpbXBvcnQgY29tLnJlbGV2YW50Y29kZXMuZXh0ZW50cmVwb3J0cy5Mb2dTdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBHb3Zlcm5vck9wZXJhdGlvblBhZ2UgeworCisJcHVibGljIEdvdmVybm9yT3BlcmF0aW9uUGFnZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYXBwcm92ZVNlcml2Y2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sICJhcHByb3ZpbmcgZGlzdHJidXRpb24gdGhlIHNlcnZpY2UgIiArIHNlcnZpY2VOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkRpc3RyaWJ1dGlvbkNoYW5nZUJ1dHRvbnMuQVBQUk9WRS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5EaXN0cmlidXRpb25DaGFuZ2VCdXR0b25zLkFQUFJPVkVfTUVTU0FHRS5nZXRWYWx1ZSgpKQorCQkJCS5zZW5kS2V5cygic2VydmljZSAiICsgc2VydmljZU5hbWUgKyAiIHRlc3RlZCBzdWNjZXNzZnVseSIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5PSy5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgibWFpbi1tZW51LWlucHV0LXNlYXJjaCIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9JY29uUGFnZS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9JY29uUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDI3MmEKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL0ljb25QYWdlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5lbnVtcy5SZXNvdXJjZUNhdGVnb3J5RW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBJY29uUGFnZSBleHRlbmRzIEdlbmVyYWxQYWdlRWxlbWVudHMgeworCisJcHVibGljIEljb25QYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja09uSWNvbihSZXNvdXJjZUNhdGVnb3J5RW51bSBpY29uTmFtZSkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oaWNvblN0cmluZ0J1aWxkZXIoaWNvbk5hbWUpICsgRGF0YVRlc3RJZEVudW0uU2VydmljZU1ldGFkYXRhRW51bS5JQ09OLmdldFZhbHVlKCkpCisJCQkJLmNsaWNrKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGljb25TdHJpbmdCdWlsZGVyKFJlc291cmNlQ2F0ZWdvcnlFbnVtIGljb24pIHsKKwkJU3RyaW5nIGljb25OYW1lID0gaWNvbi5nZXRTdWJDYXRlZ29yeSgpOworCQlTdHJpbmdbXSBzcGxpdGVkSWNvbk5hbWUgPSBpY29uTmFtZS5zcGxpdCgiICIpOworCQlzcGxpdGVkSWNvbk5hbWVbMF0gPSBzcGxpdGVkSWNvbk5hbWVbMF0udG9Mb3dlckNhc2UoKTsKKworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZm9yIChTdHJpbmcgd29yZCA6IHNwbGl0ZWRJY29uTmFtZSkgeworCQkJc2IuYXBwZW5kKHdvcmQpOworCQl9CisKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL0luZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2UuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmY0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL0luZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudXRpbC5FbGVtZW50czsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jb21tb24uYXBpLkFydGlmYWN0R3JvdXBUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLkJ5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKKworcHVibGljIGNsYXNzIEluZm9ybWF0aW9uYWxBcnRpZmFjdFBhZ2UgZXh0ZW5kcyBEZXBsb3ltZW50QXJ0aWZhY3RQYWdlIHsKKworCXB1YmxpYyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0FkZE5ld0FydGlmYWN0KCkgeworCQlhZGROZXdBcnRpZmFjdChBcnRpZmFjdEdyb3VwVHlwZUVudW0uSU5GT1JNQVRJT05BTCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbihTdHJpbmcgYXJ0aWZhY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY2xpY2tPbkFydGlmYWN0KGFydGlmYWN0TmFtZSk7CisJCVN0cmluZyBhcnRpZmFjdERlc2MgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoCisJCQkJYXJ0aWZhY3ROYW1lICsgRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQYWdlRW51bS5HRVRfSU5GT1JNQVRJT05BTF9BUlRJRkFDVF9ERVNDUklQVElPTi5nZXRWYWx1ZSgpKQorCQkJCS5nZXRUZXh0KCk7CisJCWNsaWNrT25BcnRpZmFjdChhcnRpZmFjdE5hbWUpOyAvLyBjbG9zZSBhcnRpZmFjdAorCQlyZXR1cm4gYXJ0aWZhY3REZXNjOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXRFbGVtZW5ldHNGcm9tVGFibGUoKSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50c0xpc3RCeURhdGFUZXN0SWQoIkluZm9ybWF0aW9uYWxBcnRpZmFjdFJvdyIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9PcHNPcGVyYXRpb25QYWdlLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL09wc09wZXJhdGlvblBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzE1MTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9PcHNPcGVyYXRpb25QYWdlLmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlczsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5TdGVwc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cC5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLkV4cGVjdGVkQ29uZGl0aW9uczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuV2ViRHJpdmVyV2FpdDsKKworaW1wb3J0IGNvbS5yZWxldmFudGNvZGVzLmV4dGVudHJlcG9ydHMuTG9nU3RhdHVzOworCitwdWJsaWMgY2xhc3MgT3BzT3BlcmF0aW9uUGFnZSB7CisKKwlwdWJsaWMgT3BzT3BlcmF0aW9uUGFnZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGlzdHJpYnV0ZVNlcnZpY2UoKSB7CisJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sICJkaXN0cmlidXRpbmcuLi4iKTsKKwkJY2xpY2tPbkJ1dHRvbihEYXRhVGVzdElkRW51bS5EaXN0cmlidXRpb25DaGFuZ2VCdXR0b25zLkRJU1RSSUJVVEUpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uRGlzdHJpYnV0aW9uQ2hhbmdlQnV0dG9ucy5NT05JVE9SLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwbGF5TW9uaXRvcigpIHsKKwkJU2V0dXBDRFRlc3QuZ2V0RXh0ZW5kVGVzdCgpLmxvZyhMb2dTdGF0dXMuSU5GTywgImNsaWNraW5nIG9uIG1vbml0b3IgYnV0dG9uIik7CisJCS8vIGNsaWNrT25CdXR0b24oRGF0YVRlc3RJZEVudW0uRGlzdHJpYnV0aW9uQ2hhbmdlQnV0dG9ucy5NT05JVE9SKTsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uTU9OSVRPUik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJlX2Rpc3RyaWJ1dGVTZXJ2aWNlKCkgeworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCAicmVkaXN0cmlidXRpbmcuLi4iKTsKKwkJY2xpY2tPbkJ1dHRvbihEYXRhVGVzdElkRW51bS5EaXN0cmlidXRpb25DaGFuZ2VCdXR0b25zLlJFX0RJU1RSSUJVVEUpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uRGlzdHJpYnV0aW9uQ2hhbmdlQnV0dG9ucy5NT05JVE9SLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY2xpY2tPbkJ1dHRvbihEYXRhVGVzdElkRW51bS5EaXN0cmlidXRpb25DaGFuZ2VCdXR0b25zIGJ1dHRvbikgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoYnV0dG9uLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8V2ViRWxlbWVudD4gZ2V0Um93c0Zyb21Nb25pdG9yVGFibGUoKSB7CisJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sICJnZXR0aW5nIG51bWJlciBvZiByb3dzIGZyb20gZGlzdHJpYnV0aW9uIHRhYmxlIik7CisJCUdlbmVyYWxQYWdlRWxlbWVudHMuY2hlY2tFbGVtZW50c0NvdW50SW5UYWJsZSgxLCAoKSAtPiBHZW5lcmFsVUlVdGlscy53YWl0Rm9yRWxlbWVudHNMaXN0VmlzaWJpbGl0eSgiZGl0cmlidXRpb25UYWJsZSIpKTsKKwkJTGlzdDxXZWJFbGVtZW50PiBkaXN0cmlidXRpb25SZWNvcmRzID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRzTGlzdFZpc2liaWxpdHkoImRpdHJpYnV0aW9uVGFibGUiKTsKKwkJTGlzdDxXZWJFbGVtZW50PiBmaW5kRWxlbWVudHMgPSBkaXN0cmlidXRpb25SZWNvcmRzLmdldCgwKS5maW5kRWxlbWVudHMoQnkuY2xhc3NOYW1lKCJ3LXNkYy1kaXN0cmlidXRlLXBhcmVudC1ibG9jayIpKTsKKwkJcmV0dXJuIGZpbmRFbGVtZW50czsKKwkJCisJCQorCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaXN0cmlidXRpb25TdGF0dXMoaW50IHJvd0luZGV4KSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiU2hvd1JlY29yZEJ1dHRvbl8iICsgU3RyaW5nLnZhbHVlT2Yocm93SW5kZXgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG90YWxBcnRpZmFjdHNTdW0oaW50IHJvd0luZGV4KSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoInRvdGFsQXJ0aWZhY3RzXyIgKyBTdHJpbmcudmFsdWVPZihyb3dJbmRleCkpLmdldFRleHQoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb3RpZmllZEFydGlmYWN0c1N1bShpbnQgcm93SW5kZXgpIHsKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLndhaXRGb3JkYXRhVGVzdElkVmlzaWJpbGl0eSgibm90aWZpZWRfIiArIFN0cmluZy52YWx1ZU9mKHJvd0luZGV4KSkuZ2V0VGV4dCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERvd25sb2FkZWRBcnRpZmFjdHNTdW0oaW50IHJvd0luZGV4KSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoImRvd25sb2FkZWRfIiArIFN0cmluZy52YWx1ZU9mKHJvd0luZGV4KSkuZ2V0VGV4dCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlcGxveWVkQXJ0aWZhY3RzU3VtKGludCByb3dJbmRleCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMud2FpdEZvcmRhdGFUZXN0SWRWaXNpYmlsaXR5KCJkZXBsb3llZF8iICsgU3RyaW5nLnZhbHVlT2Yocm93SW5kZXgpKS5nZXRUZXh0KCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm90Tm90aWZpZWRBcnRpZmFjdHNTdW0oaW50IHJvd0luZGV4KSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoIk5vdE5vdGlmaWVkXyIgKyBTdHJpbmcudmFsdWVPZihyb3dJbmRleCkpLmdldFRleHQoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFcnJvcnNTdW0oaW50IHJvd0luZGV4KSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoImVycm9yc18iICsgU3RyaW5nLnZhbHVlT2Yocm93SW5kZXgpKS5nZXRUZXh0KCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrUmVmcmVzaFRhYmxlQnV0dG9uKGludCByb3dJbmRleCkgeworCQkvLyBTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCAicmVmcmVzaGluZworCQkvLyBkaXN0cmlidXRpb24gdGFibGUiKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJyZWZyZXNoQnV0dG9uIikuY2xpY2soKTsKKworCQkvLyB3YWl0IHVudGlsIHRvdGFsIGFydGlmYWN0cyBmaWVsZCBkaXNhcHBlYXIKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCksIDMwKTsKKwkJd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMuaW52aXNpYmlsaXR5T2ZFbGVtZW50TG9jYXRlZCgKKwkJCQlCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgInRvdGFsQXJ0aWZhY3RzXyIgKyBTdHJpbmcudmFsdWVPZihyb3dJbmRleCkgKyAiJ10iKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0VW50aWxBcnRpZmFjdHNEaXN0cmlidXRlZChpbnQgcm93SW5kZXgpIHRocm93cyBFeGNlcHRpb24geworCQl3YWl0VW50aWxBcnRpZmFjdHNEaXN0cmlidXRlZCgiMCIsIDApOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0VW50aWxBcnRpZmFjdHNEaXN0cmlidXRlZChTdHJpbmcgZXhwZWN0ZWRBcnRpZmFjdHNTdW0sIGludCByb3dJbmRleCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sICJ3YWl0aW5nIHVudGlsIGFsbCBhcnRpZmFjdHMgZGlzdHJpYnV0ZWQiKTsKKwkJYm9vbGVhbiBpc0tlZXBXYWl0aW5nID0gdHJ1ZTsKKwkJaW50IG1heFdhaXRpbmdQZXJpb2RNUyA9IDUgKiA2MCAqIDEwMDA7CisJCWludCBzdW1XYWl0aW5nVGltZSA9IDA7CisJCWludCBuYXBQZXJpb2QgPSAxMDAwOworCQl3aGlsZSAoaXNLZWVwV2FpdGluZykgeworCQkJc2hvd0Rpc3RyaWJ1dGlvblN0YXR1cyhyb3dJbmRleCk7CisJCQlTdHJpbmcgYWN0dWFsVG90YWxBcnRpZmFjdHNTaXplID0gZ2V0VG90YWxBcnRpZmFjdHNTdW0ocm93SW5kZXgpOworCQkJU3RyaW5nIGFjdHVhbE5vdGlmaWVkQXJ0aWZhY3RzU2l6ZSA9IGdldE5vdGlmaWVkQXJ0aWZhY3RzU3VtKHJvd0luZGV4KTsKKwkJCVN0cmluZyBhY3R1YWxEb3dubG9hZGVkQXJ0aWZhY3RzU2l6ZSA9IGdldERvd25sb2FkZWRBcnRpZmFjdHNTdW0ocm93SW5kZXgpOworCQkJU3RyaW5nIGFjdHVhbERlcGxveWVkQXJ0aWZhY3RzU2l6ZSA9IGdldERlcGxveWVkQXJ0aWZhY3RzU3VtKHJvd0luZGV4KTsKKwkJCVN0cmluZyBhY3R1YWxOb3ROb3RpZmVkQXJ0aWZhY3RzU2l6ZSA9IGdldE5vdE5vdGlmaWVkQXJ0aWZhY3RzU3VtKHJvd0luZGV4KTsKKwkJCWlzS2VlcFdhaXRpbmcgPSAhYWN0dWFsVG90YWxBcnRpZmFjdHNTaXplLmVxdWFscyhhY3R1YWxEb3dubG9hZGVkQXJ0aWZhY3RzU2l6ZSkKKwkJCQkJfHwgIWFjdHVhbFRvdGFsQXJ0aWZhY3RzU2l6ZS5lcXVhbHMoYWN0dWFsTm90aWZpZWRBcnRpZmFjdHNTaXplKQorCQkJCQl8fCAhYWN0dWFsVG90YWxBcnRpZmFjdHNTaXplLmVxdWFscyhhY3R1YWxEZXBsb3llZEFydGlmYWN0c1NpemUpCisJCQkJCXx8IGFjdHVhbFRvdGFsQXJ0aWZhY3RzU2l6ZS5lcXVhbHMoIjAiKSB8fCBhY3R1YWxEb3dubG9hZGVkQXJ0aWZhY3RzU2l6ZS5lcXVhbHMoIjAiKQorCQkJCQl8fCBhY3R1YWxOb3RpZmllZEFydGlmYWN0c1NpemUuZXF1YWxzKCIwIikgfHwgYWN0dWFsRGVwbG95ZWRBcnRpZmFjdHNTaXplLmVxdWFscygiMCIpOworCQkJLy8gaXNLZWVwV2FpdGluZyA9CisJCQkvLyAhZXhwZWN0ZWRBcnRpZmFjdHNTdW0uZXF1YWxzKGFjdHVhbFRvdGFsQXJ0aWZhY3RzU2l6ZSkgJiYKKwkJCS8vICFleHBlY3RlZEFydGlmYWN0c1N1bS5lcXVhbHMoYWN0dWFsTm90aWZpZWRBcnRpZmFjdHNTaXplKSAmJgorCQkJLy8gIWV4cGVjdGVkQXJ0aWZhY3RzU3VtLmVxdWFscyhhY3R1YWxEb3dubG9hZGVkQXJ0aWZhY3RzU2l6ZSkgJiYKKwkJCS8vICFleHBlY3RlZEFydGlmYWN0c1N1bS5lcXVhbHMoYWN0dWFsRGVwbG95ZWRBcnRpZmFjdHNTaXplKSAmJgorCQkJLy8gYWN0dWFsTm90Tm90aWZlZEFydGlmYWN0c1NpemUuZXF1YWxzKCIwIik7CisJCQkvLyBpZiAoSW50ZWdlci52YWx1ZU9mKGFjdHVhbFRvdGFsQXJ0aWZhY3RzU2l6ZSkgPgorCQkJLy8gSW50ZWdlci52YWx1ZU9mKGV4cGVjdGVkQXJ0aWZhY3RzU3VtKSl7CisJCQkvLyBpc0tlZXBXYWl0aW5nID0gZmFsc2U7CisJCQkvLyB0aHJvdyBuZXcgRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk1PUkUgQVJUSUZBQ1RTIFRIRU4gRVhQRUNURUQgLQorCQkJLy8gYWN0dWFsOiAlcywgZXhwZWN0ZWQ6ICVzIiwgYWN0dWFsVG90YWxBcnRpZmFjdHNTaXplLAorCQkJLy8gZXhwZWN0ZWRBcnRpZmFjdHNTdW0pKTsKKwkJCS8vLy8gQXNzZXJ0LmZhaWwoU3RyaW5nLmZvcm1hdCgiTU9SRSBBUlRJRkFDVFMgVEhFTiBFWFBFQ1RFRCAtCisJCQkvLyBhY3R1YWw6ICVzLCBleHBlY3RlZDogJXMiLCBhY3R1YWxUb3RhbEFydGlmYWN0c1NpemUsCisJCQkvLyBleHBlY3RlZEFydGlmYWN0c1N1bSkpOworCQkJLy8gfQorCQkJaWYgKGlzS2VlcFdhaXRpbmcpIHsKKworCQkJCWlmIChJbnRlZ2VyLnBhcnNlSW50KGFjdHVhbE5vdE5vdGlmZWRBcnRpZmFjdHNTaXplKSA+IDEpIHsKKwkJCQkJU2V0dXBDRFRlc3QuZ2V0RXh0ZW5kVGVzdCgpLmxvZyhMb2dTdGF0dXMuSU5GTywgIlNvbWUgYXJ0aWZhY3RzIGFyZSBub3Qgbm90aWZpZWQuLi4iKTsKKwkJCQkJaXNLZWVwV2FpdGluZyA9IGZhbHNlOworCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJTb21lIGFydGlmYWN0cyBhcmUgbm90IG5vdGlmaWVkLi4uIGNoZWNrIGRpc3RyaWJ1dGlvbiBjbGllbnQiKTsKKwkJCQl9CisKKwkJCQlHZW5lcmFsVUlVdGlscy5zbGVlcChuYXBQZXJpb2QpOworCQkJCXN1bVdhaXRpbmdUaW1lICs9IG5hcFBlcmlvZDsKKworCQkJCWlmIChzdW1XYWl0aW5nVGltZSA+IG1heFdhaXRpbmdQZXJpb2RNUykgeworCQkJCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5GQUlMLCAibm90IGFsbCBhcnRpZmFjdHMgYXJlIGRpc3BsYXllZCIpOworCQkJCQlpc0tlZXBXYWl0aW5nID0gZmFsc2U7CisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTk9UIEFMTCBBUlRJRkFDVFMgQVJFIERJU1BMQVlFRCBXSVRISU4gJXMgU0VDT05EUyIsCisJCQkJCQkJU3RyaW5nLnZhbHVlT2YobWF4V2FpdGluZ1BlcmlvZE1TIC8gMTAwMCkpKTsKKwkJCQl9CisKKwkJCQljbGlja1JlZnJlc2hUYWJsZUJ1dHRvbihyb3dJbmRleCk7CisJCQl9CisJCX0KKworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5QQVNTLCAiYWxsIGFydGlmYWN0cyBhcmUgZGlzdHJpYnV0ZWQgc3VjY2Vzc2Z1bGx5Iik7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL1Byb3BlcnRpZXNQYWdlLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL1Byb3BlcnRpZXNQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0ZmEwYQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvUHJvcGVydGllc1BhZ2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzUGFnZSBleHRlbmRzIEdlbmVyYWxQYWdlRWxlbWVudHMgeworCisJcHVibGljIFByb3BlcnRpZXNQYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXRFbGVtZW5ldHNGcm9tVGFibGUoKSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50c0xpc3RCeURhdGFUZXN0SWQoRGF0YVRlc3RJZEVudW0uUHJvcGVydGllc1BhZ2VFbnVtLlBST1BFUlRZX1JPVy5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tBZGRQcm9wZXJ0eUFydGlmYWN0KCkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uUHJvcGVydGllc1BhZ2VFbnVtLkFERF9ORVdfUFJPUEVSVFkuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tFZGl0UHJvcGVydHlBcnRpZmFjdChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzUGFnZUVudW0uRURJVF9QUk9QRVJUWS5nZXRWYWx1ZSgpICsgcHJvcGVydHlOYW1lKS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0RlbGV0ZVByb3BlcnR5QXJ0aWZhY3QoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uUHJvcGVydGllc1BhZ2VFbnVtLkRFTEVURV9QUk9QRVJUWS5nZXRWYWx1ZSgpICsgcHJvcGVydHlOYW1lKQorCQkJCS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja09uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24ocHJvcGVydHlOYW1lKS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlQb3B1cCBnZXRQcm9wZXJ0eVBvcHVwKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5UG9wdXAoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvUHJvcGVydHlQb3B1cC5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9Qcm9wZXJ0eVBvcHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYmVhMwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvUHJvcGVydHlQb3B1cC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlQb3B1cCB7CisKKwlwdWJsaWMgUHJvcGVydHlQb3B1cCgpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbnNlcnRQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJV2ViRWxlbWVudCBwcm9wZXJ0eU5hbWVGaWVsZCA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzUGFnZUVudW0uUFJPUEVSVFlfTkFNRS5nZXRWYWx1ZSgpKTsKKwkJcHJvcGVydHlOYW1lRmllbGQuY2xlYXIoKTsKKwkJcHJvcGVydHlOYW1lRmllbGQuc2VuZEtleXMobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgaW5zZXJ0UHJvcGVydHlEZWZhdWx0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCVdlYkVsZW1lbnQgcHJvcGVydHlWYWx1ZSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzUGFnZUVudW0uUFJPUEVSVFlfVkFMVUUuZ2V0VmFsdWUoKSk7CisJCXByb3BlcnR5VmFsdWUuY2xlYXIoKTsKKwkJcHJvcGVydHlWYWx1ZS5zZW5kS2V5cyh2YWx1ZSk7CisJfQorCisJcHVibGljIHZvaWQgaW5zZXJ0UHJvcGVydHlEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJV2ViRWxlbWVudCBwcm9wZXJ0eURlc2NyaXB0aW9uID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlByb3BlcnRpZXNQYWdlRW51bS5QUk9QRVJUWV9ERVNDUklQVElPTi5nZXRWYWx1ZSgpKTsKKwkJcHJvcGVydHlEZXNjcmlwdGlvbi5jbGVhcigpOworCQlwcm9wZXJ0eURlc2NyaXB0aW9uLnNlbmRLZXlzKGRlc2NyaXB0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZWxlY3RQcm9wZXJ0eVR5cGUoU3RyaW5nIHByb3BlcnR5VHlwZSkgeworCQlHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KHByb3BlcnR5VHlwZSwgRGF0YVRlc3RJZEVudW0uUHJvcGVydGllc1BhZ2VFbnVtLlBST1BFUlRZX1RZUEUuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgY2xpY2tBZGQoKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzUGFnZUVudW0uQURELmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGlja1NhdmUoKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzUGFnZUVudW0uU0FWRS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCisJcHVibGljIHZvaWQgY2xpY2tDYW5jZWwoKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzUGFnZUVudW0uQ0FOQ0VMLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGlja0RvbmUoKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihEYXRhVGVzdElkRW51bS5Qcm9wZXJ0aWVzUGFnZUVudW0uRE9ORS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL1Jlc291cmNlR2VuZXJhbFBhZ2UuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvUmVzb3VyY2VHZW5lcmFsUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTQyODIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL1Jlc291cmNlR2VuZXJhbFBhZ2UuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLmRhdGF0eXBlcy5lbnVtcy5Db21wb25lbnRUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ29tcG9uZW50UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlJlc291cmNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuZW51bXMuQ29tcG9uZW50VHlwZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLlJlc291cmNlVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLktleXM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uaW50ZXJhY3Rpb25zLkFjdGlvbnM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLlNlbGVjdDsKKworcHVibGljIGNsYXNzIFJlc291cmNlR2VuZXJhbFBhZ2UgZXh0ZW5kcyBHZW5lcmFsUGFnZUVsZW1lbnRzIHsKKworCXB1YmxpYyBSZXNvdXJjZUdlbmVyYWxQYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgc3RhdGljIFdlYkVsZW1lbnQgZ2V0TmFtZUZpZWxkKCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlJlc291cmNlTWV0YWRhdGFFbnVtLlJFU09VUkNFX05BTUUuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgV2ViRWxlbWVudCBnZXREZXNjcmlwdGlvbkZpZWxkKCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlNlcnZpY2VNZXRhZGF0YUVudW0uREVTQ1JJUFRJT04uZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhdGVnb3J5RmllbGQoKSB7CisJCXJldHVybiBEYXRhVGVzdElkRW51bS5SZXNvdXJjZU1ldGFkYXRhRW51bS5DQVRFR09SWS5nZXRWYWx1ZSgpOworCX0KKworCXByaXZhdGUgc3RhdGljIFdlYkVsZW1lbnQgZ2V0VmVuZG9yTmFtZUZpZWxkKCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlJlc291cmNlTWV0YWRhdGFFbnVtLlZFTkRPUl9OQU1FLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFdlYkVsZW1lbnQgZ2V0VmVuZG9yUmVsZWFzZUZpZWxkKCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlJlc291cmNlTWV0YWRhdGFFbnVtLlZFTkRPUl9SRUxFQVNFLmdldFZhbHVlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFdlYkVsZW1lbnQgZ2V0VGFnc0ZpZWxkKCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLlJlc291cmNlTWV0YWRhdGFFbnVtLlRBR1MuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgV2ViRWxlbWVudCBnZXRVc2VySWRGaWVsZCgpIHsKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5SZXNvdXJjZU1ldGFkYXRhRW51bS5DT05UQUNUX0lELmdldFZhbHVlKCkpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lVGV4dCgpIHsKKwkJcmV0dXJuIGdldE5hbWVGaWVsZCgpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisJCVdlYkVsZW1lbnQgcmVzb3VyY2VOYW1lVGV4dGJveCA9IGdldE5hbWVGaWVsZCgpOworCQlyZXNvdXJjZU5hbWVUZXh0Ym94LmNsZWFyKCk7CisJCXJlc291cmNlTmFtZVRleHRib3guc2VuZEtleXMocmVzb3VyY2VOYW1lKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvblRleHQoKSB7CisJCXJldHVybiBnZXREZXNjcmlwdGlvbkZpZWxkKCkuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKwkJV2ViRWxlbWVudCBkZXNjcmlwdGlvblRleHRib3ggPSBnZXREZXNjcmlwdGlvbkZpZWxkKCk7CisJCWRlc2NyaXB0aW9uVGV4dGJveC5jbGVhcigpOworCQlkZXNjcmlwdGlvblRleHRib3guc2VuZEtleXMoZGVzY3JpcHRpb24pOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZlbmRvck5hbWVUZXh0KCkgeworCQlyZXR1cm4gZ2V0VmVuZG9yTmFtZUZpZWxkKCkuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVWZW5kb3JOYW1lKFN0cmluZyB2ZW5kb3JOYW1lKSB7CisJCVdlYkVsZW1lbnQgdmVuZG9yTmFtZVRleHRib3ggPSBnZXRWZW5kb3JOYW1lRmllbGQoKTsKKwkJdmVuZG9yTmFtZVRleHRib3guY2xlYXIoKTsKKwkJdmVuZG9yTmFtZVRleHRib3guc2VuZEtleXModmVuZG9yTmFtZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVuZG9yUmVsZWFzZVRleHQoKSB7CisJCXJldHVybiBnZXRWZW5kb3JSZWxlYXNlRmllbGQoKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVZlbmRvclJlbGVhc2UoU3RyaW5nIHZlbmRvclJlbGVhc2UpIHsKKwkJV2ViRWxlbWVudCB2ZW5kb3JSZWxlYXNlVGV4dGJveCA9IGdldFZlbmRvclJlbGVhc2VGaWVsZCgpOworCQl2ZW5kb3JSZWxlYXNlVGV4dGJveC5jbGVhcigpOworCQl2ZW5kb3JSZWxlYXNlVGV4dGJveC5zZW5kS2V5cyh2ZW5kb3JSZWxlYXNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lVGFnKFN0cmluZyByZXNvdXJjZVRhZ3MpIHsKKwkJV2ViRWxlbWVudCB0YWdUZXh0Ym94ID0gZ2V0VGFnc0ZpZWxkKCk7CisJCXRhZ1RleHRib3guY2xlYXIoKTsKKwkJdGFnVGV4dGJveC5zZW5kS2V5cyhyZXNvdXJjZVRhZ3MpOworCQl0YWdUZXh0Ym94LnNlbmRLZXlzKEtleXMuRU5URVIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVUYWdzTGlzdChDb21wb25lbnRSZXFEZXRhaWxzIHJlc291cmNlLCBTdHJpbmdbXSByZXNvdXJjZVRhZ3MpIHsKKwkJTGlzdDxTdHJpbmc+IHRhZ2xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJOworCQlXZWJFbGVtZW50IHJlc291cmNlVGFnc1RleHRib3ggPSBnZXRUYWdzRmllbGQoKTsKKwkJZm9yIChTdHJpbmcgdGFnIDogcmVzb3VyY2VUYWdzKSB7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LmNsZWFyKCk7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKHRhZyk7CisJCQlHZW5lcmFsVUlVdGlscy5zbGVlcCgxMDAwKTsKKwkJCXJlc291cmNlVGFnc1RleHRib3guc2VuZEtleXMoS2V5cy5FTlRFUik7CisJCQl0YWdsaXN0LmFkZCh0YWcpOworCQl9CisJCXJlc291cmNlLnNldFRhZ3ModGFnbGlzdCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgeworLy8JCUdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoY2F0ZWdvcnksIGdldENhdGVnb3J5RmllbGQoKSk7CisJCQorCQlBY3Rpb25zIGFjdGlvbiA9IG5ldyBBY3Rpb25zKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKTsKKwkJYWN0aW9uLmNsaWNrKEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeURhdGFUZXN0SWQoZ2V0Q2F0ZWdvcnlGaWVsZCgpKSk7CisJCWFjdGlvbi5zZW5kS2V5cyhjYXRlZ29yeSkucGVyZm9ybSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVzZXJJZENvbnRhY3RUZXh0KCkgeworCQlyZXR1cm4gZ2V0VXNlcklkRmllbGQoKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVVzZXJJZENvbnRhY3QoU3RyaW5nIHVzZXJJZCkgeworCQlXZWJFbGVtZW50IGNvbnRhY3RJZFRleHRib3ggPSBnZXRVc2VySWRGaWVsZCgpOworCQljb250YWN0SWRUZXh0Ym94LmNsZWFyKCk7CisJCWNvbnRhY3RJZFRleHRib3guc2VuZEtleXModXNlcklkKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvUmVzb3VyY2VMZWZ0TWVudS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9SZXNvdXJjZUxlZnRNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5M2YxOAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvUmVzb3VyY2VMZWZ0TWVudS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5TdGVwc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VMZWZ0TWVudSBpbXBsZW1lbnRzIENvbXBvbmVudExlZnRNZW51IHsKKworCXB1YmxpYyB2b2lkIG1vdmVUb0dlbmVyYWxTY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uR0VORVJBTCk7CisJfQorCisJcHVibGljIHZvaWQgbW92ZVRvSWNvblNjcmVlbigpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKFN0ZXBzRW51bS5JQ09OKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlVG9EZXBsb3ltZW50QXJ0aWZhY3RTY3JlZW4oKSB7CisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoU3RlcHNFbnVtLkRFUExPWU1FTlRfQVJUSUZBQ1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVUb0luZm9ybWF0aW9uYWxBcnRpZmFjdFNjcmVlbigpIHsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uSU5GT1JNQVRJT05fQVJUSUZBQ1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVUb1Byb3BlcnRpZXNTY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uUFJPUEVSVElFUyk7CisJfQorCisJcHVibGljIHZvaWQgbW92ZVRvQ29tcG9zaXRpb25TY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uQ09NUE9TSVRJT04pOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVUb0FjdGl2aXR5TG9nU2NyZWVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLm1vdmVUb1N0ZXAoU3RlcHNFbnVtLkFDVElWSVRZX0xPRyk7CisJfQorCisJcHVibGljIHZvaWQgbW92ZVRvRGVwbG95bWVudFZpZXdTY3JlZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uREVQTE9ZTUVOVF9WSUVXKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlVG9Ub3NjYUFydGlmYWN0c1NjcmVlbigpIHsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uVE9TQ0FfQVJUSUZBQ1RTKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3BhZ2VzL1NlcnZpY2VHZW5lcmFsUGFnZS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9TZXJ2aWNlR2VuZXJhbFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThjNGIyCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9TZXJ2aWNlR2VuZXJhbFBhZ2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXM7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKKworcHVibGljIGNsYXNzIFNlcnZpY2VHZW5lcmFsUGFnZSBleHRlbmRzIFJlc291cmNlR2VuZXJhbFBhZ2UgeworCisJcHVibGljIFNlcnZpY2VHZW5lcmFsUGFnZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKKwkJV2ViRWxlbWVudCBzZXJ2aWNlTmFtZVRleHRib3ggPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uU2VydmljZU1ldGFkYXRhRW51bS5TRVJWSUNFX05BTUUuZ2V0VmFsdWUoKSk7CisJCXNlcnZpY2VOYW1lVGV4dGJveC5jbGVhcigpOworCQlzZXJ2aWNlTmFtZVRleHRib3guc2VuZEtleXMoc2VydmljZU5hbWUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVQcm9qZWN0Q29kZShTdHJpbmcgcG1hdCkgeworCQlXZWJFbGVtZW50IHByb2plY3RDb2RlVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5TZXJ2aWNlTWV0YWRhdGFFbnVtLlBST0pFQ1RfQ09ERS5nZXRWYWx1ZSgpKTsKKwkJcHJvamVjdENvZGVUZXh0Ym94LmNsZWFyKCk7CisJCXByb2plY3RDb2RlVGV4dGJveC5zZW5kS2V5cyhwbWF0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvVGVzdGVyT3BlcmF0aW9uUGFnZS5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9UZXN0ZXJPcGVyYXRpb25QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxODU2MQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvVGVzdGVyT3BlcmF0aW9uUGFnZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5HZW5lcmFsVUlVdGlsczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLktleXM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5pbnRlcmFjdGlvbnMuQWN0aW9uczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBjb20ucmVsZXZhbnRjb2Rlcy5leHRlbnRyZXBvcnRzLkxvZ1N0YXR1czsKKworcHVibGljIGNsYXNzIFRlc3Rlck9wZXJhdGlvblBhZ2UgeworCisJcHVibGljIFRlc3Rlck9wZXJhdGlvblBhZ2UoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNlcnRpZnlDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHRocm93cyBFeGNlcHRpb24geworCQljbGlja1N0YXJ0VGVzdGluZ0J1dHRvbigpOworCQljbGlja0FjY3BldENlcnRpZmljYXRpb25CdXR0b24oY29tcG9uZW50TmFtZSk7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tBY2NwZXRDZXJ0aWZpY2F0aW9uQnV0dG9uKFN0cmluZyBjb21wb25lbnROYW1lKSB7CisJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sICJjbGlja2luZyBvbiBhY2NlcHQgY2VydGlmaWNhdGlvbiBidXR0b24iKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkxpZmVDeWxlQ2hhbmdlQnV0dG9ucy5BQ0NFUFQuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5BQ0NFUF9URVNUSU5HX01FU1NBR0UuZ2V0VmFsdWUoKSkKKwkJCQkuc2VuZEtleXMoY29tcG9uZW50TmFtZSArICIgdGVzdGVkIHN1Y2Nlc3NmdWx5Iik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMuc2xlZXAoMjAwMCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgibWFpbi1tZW51LWlucHV0LXNlYXJjaCIpOworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCBjb21wb25lbnROYW1lICsgIiBpcyBjZXJ0aWZlZCAiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tTdGFydFRlc3RpbmdCdXR0b24oKSB7CisJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLklORk8sICJzdGFydCB0ZXN0aW5nIik7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5MaWZlQ3lsZUNoYW5nZUJ1dHRvbnMuU1RBUlRfVEVTVElORy5nZXRWYWx1ZSgpKQorCQkJCS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5MaWZlQ3lsZUNoYW5nZUJ1dHRvbnMuQUNDRVBULmdldFZhbHVlKCkpOworCQlHZW5lcmFsVUlVdGlscy5zbGVlcCgxMDAwKTsKKworCQkvLyBidWcKKwkJLy8gQWN0aW9ucyBhY3Rpb25PYmplY3QgPSBuZXcgQWN0aW9ucyhHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSk7CisJCS8vIGFjdGlvbk9iamVjdC5rZXlEb3duKEtleXMuQ09OVFJPTCkuc2VuZEtleXMoS2V5cy5GNSkucGVyZm9ybSgpOworCQkvLworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9Ub3NjYUFydGlmYWN0c1BhZ2UuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvVG9zY2FBcnRpZmFjdHNQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjNWYwNgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvVG9zY2FBcnRpZmFjdHNQYWdlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBUb3NjYUFydGlmYWN0c1BhZ2UgZXh0ZW5kcyBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlIHsKKworCXB1YmxpYyBUb3NjYUFydGlmYWN0c1BhZ2UoKSB7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvVXBsb2FkQXJ0aWZhY3RQb3B1cC5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy9wYWdlcy9VcGxvYWRBcnRpZmFjdFBvcHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyNzgwOQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvcGFnZXMvVXBsb2FkQXJ0aWZhY3RQb3B1cC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLlNlbGVjdDsKKworcHVibGljIGNsYXNzIFVwbG9hZEFydGlmYWN0UG9wdXAgeworCisJcHVibGljIFVwbG9hZEFydGlmYWN0UG9wdXAoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHZvaWQgbG9hZEZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBmaWxlbmFtZSkgeworCQlmaW5hbCBXZWJFbGVtZW50IGJyb3dzZVdlYkVsZW1lbnQgPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50QnlEYXRhVGVzdElkKERhdGFUZXN0SWRFbnVtLkFydGlmYWN0UG9wdXAuQlJPV1NFLmdldFZhbHVlKCkpOworCQlicm93c2VXZWJFbGVtZW50LnNlbmRLZXlzKHBhdGggKyAiXFwiICsgZmlsZW5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIGluc2VydERlc2NyaXB0aW9uKFN0cmluZyBhcnRpZmFjdERlc2NyaXB0b2luKSB7CisJCVdlYkVsZW1lbnQgYXJ0aWZhY3REZXNjcmlwdGlvblRleHRib3ggPSBHZW5lcmFsVUlVdGlscworCQkJCS5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQb3B1cC5BUlRJRkFDVF9ERVNDUklQVElPTi5nZXRWYWx1ZSgpKTsKKwkJYXJ0aWZhY3REZXNjcmlwdGlvblRleHRib3guY2xlYXIoKTsKKwkJYXJ0aWZhY3REZXNjcmlwdGlvblRleHRib3guc2VuZEtleXMoYXJ0aWZhY3REZXNjcmlwdG9pbik7CisJfQorCisJcHVibGljIFNlbGVjdCBkZWZpbmVBcnRpZmFjdExhYmVsKFN0cmluZyByZXF1aXJlZEFydGlmYWN0TGFiZWwpIHsKKwkJU2VsZWN0IHNlbGVjdExpc3QgPSBHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KCJDcmVhdGUgTmV3IEFydGlmYWN0IiwKKwkJCQlEYXRhVGVzdElkRW51bS5BcnRpZmFjdFBvcHVwLkFSVElGQUNUX0xBQkVMLmdldFZhbHVlKCkpOworCQlXZWJFbGVtZW50IGFydGlmYWN0TGFiZWxXZWJFbGVtZW50ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkubmFtZSgiYXJ0aWZhY3RMYWJlbCIpKTsKKwkJYXJ0aWZhY3RMYWJlbFdlYkVsZW1lbnQuY2xlYXIoKTsKKwkJYXJ0aWZhY3RMYWJlbFdlYkVsZW1lbnQuc2VuZEtleXMocmVxdWlyZWRBcnRpZmFjdExhYmVsKTsKKwkJcmV0dXJuIHNlbGVjdExpc3Q7CisJfQorCisJcHVibGljIFNlbGVjdCBzZWxlY3RBcnRpZmFjdFR5cGUoU3RyaW5nIGFydGlmYWN0VHlwZSkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdChhcnRpZmFjdFR5cGUsIERhdGFUZXN0SWRFbnVtLkFydGlmYWN0UG9wdXAuQVJUSUZBQ1RfVFlQRS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGlja0FkZEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQb3B1cC5BRERfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGlja0NhbmNlbEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQb3B1cC5DQU5DRUxfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGlja1VwZGF0ZUJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oRGF0YVRlc3RJZEVudW0uQXJ0aWZhY3RQb3B1cC5VUERBVEVfQlVUVE9OLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0FkZGl0aW9uYWxDb25kaXRpb25zLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9BZGRpdGlvbmFsQ29uZGl0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiN2Y0YzMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9BZGRpdGlvbmFsQ29uZGl0aW9ucy5qYXZhCkBAIC0wLDAgKzEsODQgQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzOworCitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5KYXZhc2NyaXB0RXhlY3V0b3I7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJEcml2ZXI7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLkV4cGVjdGVkQ29uZGl0aW9uOworCitwdWJsaWMgY2xhc3MgQWRkaXRpb25hbENvbmRpdGlvbnMgeworCQkKKwlwdWJsaWMgc3RhdGljIEV4cGVjdGVkQ29uZGl0aW9uPEJvb2xlYW4+IGpRdWVyeUFKQVhDYWxsc0hhdmVDb21wbGV0ZWQoKSB7CisJICAgIHJldHVybiBuZXcgRXhwZWN0ZWRDb25kaXRpb248Qm9vbGVhbj4oKSB7CisJICAgICAgICBAT3ZlcnJpZGUKKwkJCXB1YmxpYyBCb29sZWFuIGFwcGx5KFdlYkRyaXZlciBkcml2ZXIpIHsKKwkgICAgICAgIAlyZXR1cm4gKEJvb2xlYW4pICgoSmF2YXNjcmlwdEV4ZWN1dG9yKWRyaXZlcikuCisJICAgICAgICAJCQlleGVjdXRlU2NyaXB0KCJyZXR1cm4gKHdpbmRvdy5qUXVlcnkhPSBudWxsKSAmJiAoalF1ZXJ5LmFjdGl2ZSA9PT0gMCk7Iik7CisJCQl9CisJCX07CisJfQorCQorCXB1YmxpYyBzdGF0aWMgRXhwZWN0ZWRDb25kaXRpb24gPEJvb2xlYW4+IGFuZ3VsYXJIYXNGaW5pc2hlZFByb2Nlc3NpbmcoKSB7CisJICAgcmV0dXJuIG5ldyBFeHBlY3RlZENvbmRpdGlvbjxCb29sZWFuPigpIHsKKwkJICAgCUBPdmVycmlkZQorCQkgICAJcHVibGljIEJvb2xlYW4gYXBwbHkoV2ViRHJpdmVyIGRyaXZlcikgeworCQkgICAJCVN0cmluZyBzY3JpcHRKUyA9ICJyZXR1cm4gKHdpbmRvdy5hbmd1bGFyICE9PXVuZGVmaW5lZCkgJiYiCisJCSAgIAkJCQkrICIgKGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkuaW5qZWN0b3IoKSAhPT11bmRlZmluZWQpICYmIgorCQkgICAJCQkJKyAiIChhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLmluamVjdG9yKCkuZ2V0KCckaHR0cCcpLnBlbmRpbmdSZXF1ZXN0cy5sZW5ndGggPT09IDApIjsKKwkJICAgCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCggKEphdmFzY3JpcHRFeGVjdXRvcikgZHJpdmVyKS5leGVjdXRlU2NyaXB0KHNjcmlwdEpTKS50b1N0cmluZygpKTsKKwkJICAgCX0KKwkgICB9OworCX0KKwkKKyAgICBwdWJsaWMgc3RhdGljIEV4cGVjdGVkQ29uZGl0aW9uIDxCb29sZWFuPiBwYWdlTG9hZFdhaXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgRXhwZWN0ZWRDb25kaXRpb248Qm9vbGVhbj4oKSB7CisgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gYXBwbHkoV2ViRHJpdmVyIGRyaXZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NyaXB0SlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnkge1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2NvbXBsZXRlJykge1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJldHVybiBmYWxzZTsgLy8gUGFnZSBub3QgbG9hZGVkIHlldFxyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGlmICh3aW5kb3cualF1ZXJ5KSB7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWYgKHdpbmRvdy5qUXVlcnkuYWN0aXZlKSB7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gZmFsc2U7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgfSBlbHNlIGlmICh3aW5kb3cualF1ZXJ5LmFqYXggJiYgd2luZG93LmpRdWVyeS5hamF4LmFjdGl2ZSkge1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgcmV0dXJuIGZhbHNlO1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpZiAod2luZG93LmFuZ3VsYXIpIHtcclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoIXdpbmRvdy5xYSkge1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgLy8gVXNlZCB0byB0cmFjayB0aGUgcmVuZGVyIGN5Y2xlIGZpbmlzaCBhZnRlciBsb2FkaW5nIGlzIGNvbXBsZXRlXHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB3aW5kb3cucWEgPSB7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIGRvbmVSZW5kZXJpbmc6IGZhbHNlXHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB9O1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAvLyBHZXQgdGhlIGFuZ3VsYXIgaW5qZWN0b3IgZm9yIHRoaXMgYXBwIChjaGFuZ2UgZWxlbWVudCBpZiBuZWNlc3NhcnkpXHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdmFyIGluamVjdG9yID0gd2luZG93LmFuZ3VsYXIuZWxlbWVudCgnYm9keScpLmluamVjdG9yKCk7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgLy8gU3RvcmUgcHJvdmlkZXJzIHRvIHVzZSBmb3IgdGhlc2UgY2hlY2tzXHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdmFyICRyb290U2NvcGUgPSBpbmplY3Rvci5nZXQoJyRyb290U2NvcGUnKTtcclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB2YXIgJGh0dHAgPSBpbmplY3Rvci5nZXQoJyRodHRwJyk7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdmFyICR0aW1lb3V0ID0gaW5qZWN0b3IuZ2V0KCckdGltZW91dCcpO1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIC8vIENoZWNrIGlmIGRpZ2VzdFxyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlmICgkcm9vdFNjb3BlLiQkcGhhc2UgPT09ICckYXBwbHknIHx8ICRyb290U2NvcGUuJCRwaGFzZSA9PT0gJyRkaWdlc3QnIHx8ICRodHRwLnBlbmRpbmdSZXF1ZXN0cy5sZW5ndGggIT09IDApIHtcclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIHdpbmRvdy5xYS5kb25lUmVuZGVyaW5nID0gZmFsc2U7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gZmFsc2U7IC8vIEFuZ3VsYXIgZGlnZXN0aW5nIG9yIGxvYWRpbmcgZGF0YVxyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIH1cclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoIXdpbmRvdy5xYS5kb25lUmVuZGVyaW5nKSB7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAvLyBTZXQgdGltZW91dCB0byBtYXJrIGFuZ3VsYXIgcmVuZGVyaW5nIGFzIGZpbmlzaGVkXHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAkdGltZW91dChmdW5jdGlvbigpIHtcclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgd2luZG93LnFhLmRvbmVSZW5kZXJpbmcgPSB0cnVlO1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgfSwgMCk7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICByZXR1cm4gZmFsc2U7XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgfVxyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XHJcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJldHVybiB0cnVlO1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSBjYXRjaCAoZXgpIHtcclxuIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIGZhbHNlO1xyXG4iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKCAoSmF2YXNjcmlwdEV4ZWN1dG9yKSBkcml2ZXIpLmV4ZWN1dGVTY3JpcHQoc2NyaXB0SlMpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgfQorCisJCisJCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9BZG1pbldvcmtzcGFjZVVJVXRpbGllcy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzJiNjlmCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlc3ROYW1lOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRHJpdmVyOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5TZWxlY3Q7CisKK3B1YmxpYyBjbGFzcyBBZG1pbldvcmtzcGFjZVVJVXRpbGllcyB7CisKKwlwdWJsaWMgQWRtaW5Xb3Jrc3BhY2VVSVV0aWxpZXMoVGVzdE5hbWUgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQlzdXBlcigpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFdlYkRyaXZlciBkcml2ZXI7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRldXNlcihTdHJpbmcgdXNlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHlwZVRvU2VhcmNoQm94KHVzZXJJZCk7CisJCWlmIChHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50cygidGRSb3ciKSAhPSBudWxsKSB7CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImRlbGV0ZSIgKyB1c2VySWQgKyAiIikuY2xpY2soKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmNsaWNrT2tCdXR0b24oKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmluZU5ld1VzZXJJZChTdHJpbmcgdXNlcklkKSB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgibmV3VXNlcklkIikuY2xlYXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJuZXdVc2VySWQiKS5zZW5kS2V5cyh1c2VySWQpOworCQk7CisJCXJldHVybiB1c2VySWQ7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmaW5lTmV3TWFjVWlkKFN0cmluZyBNYWNVaWQpIHsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJuZXdVc2VySWQiKS5jbGVhcigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoIm5ld1VzZXJJZCIpLnNlbmRLZXlzKE1hY1VpZCk7CisJCTsKKwkJcmV0dXJuIE1hY1VpZDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RVc2VyUm9sZShTdHJpbmcgUm9sZSkgeworCQlTZWxlY3Qgc2VsZWN0cm9sZSA9IG5ldyBTZWxlY3QoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJzZWxlY3Ryb2xlIikpOworCQlzZWxlY3Ryb2xlLmRlc2VsZWN0QnlWaXNpYmxlVGV4dChSb2xlKTsKKwkJc2VsZWN0cm9sZS5zZWxlY3RCeVZpc2libGVUZXh0KFJvbGUpOworCQlyZXR1cm4gUm9sZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdHlwZVRvU2VhcmNoQm94KFN0cmluZyBUZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJzZWFyY2hib3giKS5jbGVhcigpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInNlYXJjaGJveCIpLnNlbmRLZXlzKFRleHQpOworCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9BcnRpZmFjdFVJVXRpbHMuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0FydGlmYWN0VUlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmQ1MmQKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9BcnRpZmFjdFVJVXRpbHMuamF2YQpAQCAtMCwwICsxLDMwMiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEuYXd0LkFXVEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKK2ltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OworaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5TdHJpbmdTZWxlY3Rpb247CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQXJ0aWZhY3RJbmZvOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5BcnRpZmFjdFJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLkluZm9ybWF0aW9uYWxBcnRpZmFjdHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmh0dHAuUmVzdFJlc3BvbnNlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLkRlcGxveW1lbnRBcnRpZmFjdFBhZ2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLkJ5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKKworaW1wb3J0IGNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmRpc2tzdG9yYWdlLnV0aWwuU3RhdGljQXJyYXlCdWZmZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcnRpZmFjdFVJVXRpbHMgeworCisJcHJpdmF0ZSBBcnRpZmFjdFVJVXRpbHMoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGZpbGxBbmRBZGROZXdBcnRpZmFjdFBhcmFtZXRlcnMoQXJ0aWZhY3RJbmZvIGFydGlmYWN0SW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCURlcGxveW1lbnRBcnRpZmFjdFBhZ2UuYXJ0aWZhY3RQb3B1cCgpLmxvYWRGaWxlKGFydGlmYWN0SW5mby5nZXRGaWxlcGF0aCgpLCBhcnRpZmFjdEluZm8uZ2V0RmlsZW5hbWUoKSk7CisJCURlcGxveW1lbnRBcnRpZmFjdFBhZ2UuYXJ0aWZhY3RQb3B1cCgpLmluc2VydERlc2NyaXB0aW9uKGFydGlmYWN0SW5mby5nZXREZXNjcmlwdGlvbigpKTsKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkuZGVmaW5lQXJ0aWZhY3RMYWJlbChhcnRpZmFjdEluZm8uZ2V0QXJ0aWZhY3RMYWJlbCgpKTsKKwkJRGVwbG95bWVudEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkuc2VsZWN0QXJ0aWZhY3RUeXBlKGFydGlmYWN0SW5mby5nZXRBcnRpZmFjdFR5cGUoKSk7CisJCURlcGxveW1lbnRBcnRpZmFjdFBhZ2UuYXJ0aWZhY3RQb3B1cCgpLmNsaWNrQWRkQnV0dG9uKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGZpbGxQbGFjZUhvbGRlckluZm9ybWF0aW9uYWxBcnRpZmFjdChEYXRhVGVzdElkRW51bS5JbmZvcm1hdGlvbmFsQXJ0aWZhY3RzIGFydGlmYWN0TGFiZWwsCisJCQlTdHJpbmcgZmlsZXBhdGgsIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKGFydGlmYWN0TGFiZWwuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkubG9hZEZpbGUoZmlsZXBhdGgsIGZpbGVuYW1lKTsKKwkJSW5mb3JtYXRpb25hbEFydGlmYWN0UGFnZS5hcnRpZmFjdFBvcHVwKCkuaW5zZXJ0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQlJbmZvcm1hdGlvbmFsQXJ0aWZhY3RQYWdlLmFydGlmYWN0UG9wdXAoKS5jbGlja0FkZEJ1dHRvbigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIGRlcGxveW1lbnRBcnRpZmFjdFJlc291cmNlSW5VSShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlciwKKwkJCUFydGlmYWN0UmVxRGV0YWlscyBhcnRpZmFjdCwgU3RyaW5nIGZpbGUpIHRocm93cyBFeGNlcHRpb24geworCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisKKwkJTGlzdDxXZWJFbGVtZW50PiBsaXN0Rm9ybUlucHV0ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnRzKEJ5LmNsYXNzTmFtZSgiaS1zZGMtZGVzaWduZXItc2lkZWJhci10YWIiKSk7CisJCVdlYkVsZW1lbnQgYWRkQXJ0aWZhY3RFbGVtZW50ID0gbGlzdEZvcm1JbnB1dC5nZXQoMik7CisJCWFkZEFydGlmYWN0RWxlbWVudC5jbGljaygpOworCisJCVdlYkVsZW1lbnQgYWRkQXJ0aWZhY3QgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoImktc2RjLWRlc2lnbmVyLXNpZGViYXItc2VjdGlvbi1jb250ZW50LWl0ZW0tYXJ0aWZhY3QtZGV0YWlscy1uYW1lIikpOworCQlhZGRBcnRpZmFjdC5jbGljaygpOworCisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJV2ViRWxlbWVudCBkZXNjcmlwdGlvblByb3BlcnR5ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJpLXNkYy1mb3JtLXRleHRhcmVhIikpOworCQlkZXNjcmlwdGlvblByb3BlcnR5LmNsZWFyKCk7CisJCWRlc2NyaXB0aW9uUHJvcGVydHkuc2VuZEtleXMoYXJ0aWZhY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisKKwkJV2ViRWxlbWVudCB1cGxvYWRGaWxlID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJpLXNkYy1mb3JtLWxhYmVsLXVwbG9hZCIpKTsKKwkJdXBsb2FkRmlsZS5jbGljaygpOworCisJCVN0cmluZ1NlbGVjdGlvbiBzZWwgPSBuZXcgU3RyaW5nU2VsZWN0aW9uKGZpbGUpOworCQlUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U3lzdGVtQ2xpcGJvYXJkKCkuc2V0Q29udGVudHMoc2VsLCBudWxsKTsKKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24iICsgc2VsKTsKKwkJVGhyZWFkLnNsZWVwKDEwMDApOworCisJCVJvYm90IHJvYm90ID0gbmV3IFJvYm90KCk7CisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKworCQlUaHJlYWQuc2xlZXAoMjAwMCk7CisKKwkJcm9ib3Qua2V5UHJlc3MoS2V5RXZlbnQuVktfRU5URVIpOworCisJCS8vIFJlbGVhc2UgRW50ZXIKKwkJcm9ib3Qua2V5UmVsZWFzZShLZXlFdmVudC5WS19FTlRFUik7CisKKwkJLy8gUHJlc3MgQ1RSTCtWCisJCXJvYm90LmtleVByZXNzKEtleUV2ZW50LlZLX0NPTlRST0wpOworCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19WKTsKKworCQkvLyBSZWxlYXNlIENUUkwrVgorCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX0NPTlRST0wpOworCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX1YpOworCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisKKwkJLy8gUHJlc3MgRW50ZXIKKwkJcm9ib3Qua2V5UHJlc3MoS2V5RXZlbnQuVktfRU5URVIpOworCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX0VOVEVSKTsKKwkJVGhyZWFkLnNsZWVwKDMwMDApOworCisJCVdlYkVsZW1lbnQgY2xpY2tEb25lID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJ3LXNkYy1mb3JtLWFjdGlvbiIpKTsKKwkJY2xpY2tEb25lLmNsaWNrKCk7CisKKwkJVGhyZWFkLnNsZWVwKDM1MDApOworCisJCUdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNzc1NlbGVjdG9yKCJidXR0b25bZGF0YS1uZy1jbGlja149c2F2ZV0iKSkuY2xpY2soKTsKKworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisJCWFzc2VydEVxdWFscygiRGlkIG5vdCBzdWNjZWVkIHRvIGdldCByZXNvdXJjZSBhZnRlciBjcmVhdGUiLCAyMDAsIGdldFJlc291cmNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCQlyZXR1cm4gZ2V0UmVzb3VyY2U7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZEluZm9ybWF0aW9uQXJ0aWZhY3QoQXJ0aWZhY3RSZXFEZXRhaWxzIGFydGlmYWN0LCBTdHJpbmcgZmlsZVBhdGgsCisJCQlmaW5hbCBJbmZvcm1hdGlvbmFsQXJ0aWZhY3RzIGRhdGFUZXN0RW51bSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMuc2xlZXAoMjAwMCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShkYXRhVGVzdEVudW0uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKworCQlmaW5hbCBXZWJFbGVtZW50IGJyb3dzZVdlYkVsZW1lbnQgPSBHZW5lcmFsVUlVdGlscy5yZXRyeU1ldGhvZE9uRXhjZXB0aW9uKAorCQkJCSgpIC0+IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeURhdGFUZXN0SWQoRGF0YVRlc3RJZEVudW0uTW9kYWxJdGVtcy5CUk9XU0VfQlVUVE9OLmdldFZhbHVlKCkpKTsKKwkJYnJvd3NlV2ViRWxlbWVudC5zZW5kS2V5cyhmaWxlUGF0aCk7CisKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLk1vZGFsSXRlbXMuREVTQ1JJUFRJT04uZ2V0VmFsdWUoKSkKKwkJCQkuc2VuZEtleXMoYXJ0aWZhY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLkFERC5nZXRWYWx1ZSgpKS5jbGljaygpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGaWxlVG9XaW5kb3dCcm93c2UoU3RyaW5nIGZpbGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgQVdURXhjZXB0aW9uIHsKKwkJU3RyaW5nU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJpbmdTZWxlY3Rpb24oZmlsZSk7CisJCVRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTeXN0ZW1DbGlwYm9hcmQoKS5zZXRDb250ZW50cyhzZWwsIG51bGwpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiIgKyBzZWwpOworCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisKKwkJUm9ib3Qgcm9ib3QgPSBuZXcgUm9ib3QoKTsKKworCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19FTlRFUik7CisKKwkJLy8gUmVsZWFzZSBFbnRlcgorCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX0VOVEVSKTsKKworCQkvLyBQcmVzcyBDVFJMK1YKKwkJcm9ib3Qua2V5UHJlc3MoS2V5RXZlbnQuVktfQ09OVFJPTCk7CisJCXJvYm90LmtleVByZXNzKEtleUV2ZW50LlZLX1YpOworCisJCS8vIFJlbGVhc2UgQ1RSTCtWCisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfQ09OVFJPTCk7CisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfVik7CisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKworCQkvLyBQcmVzcyBFbnRlcgorCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19FTlRFUik7CisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfRU5URVIpOworCQlUaHJlYWQuc2xlZXAoMzAwMCk7CisJfQorCisJc3RhdGljIFdlYkVsZW1lbnQgQXJ0aWZhY3RMYWJlbDsKKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRJbmZvcm1hdGlvbmFsQXJ0aWZhY3QoU3RyaW5nIGFydGlmYWN0TGFiZWwpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdHlwZSA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QobnVsbCwgImFydGlmYWN0dHlwZSIpLmdldEZpcnN0U2VsZWN0ZWRPcHRpb24oKS5nZXRUZXh0KCk7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXJ0aWZhY3RWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJU3RyaW5nIGxhYmVsTmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoYXJ0aWZhY3RMYWJlbCwgInNlbGVjdEFydGlmYWN0IikuZ2V0Rmlyc3RTZWxlY3RlZE9wdGlvbigpCisJCQkJLmdldFRleHQoKTsKKwkJQXJ0aWZhY3RMYWJlbCA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5Lm5hbWUoImFydGlmYWN0TGFiZWwiKSk7CisJCWlmIChBcnRpZmFjdExhYmVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKS5lcXVhbHMoIiIpKSB7CisJCQlsYWJlbE5hbWUgPSAiTmV3LVRlc3QtQXJ0aWZhY3QiOworCQkJQXJ0aWZhY3RMYWJlbC5zZW5kS2V5cyhsYWJlbE5hbWUpOworCQkJdHlwZSA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoIkhFQVQiLCAiYXJ0aWZhY3R0eXBlIikuZ2V0Rmlyc3RTZWxlY3RlZE9wdGlvbigpLmdldFRleHQoKTsKKwkJfQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiVGhpcyBpcyBEZXNjcmlwdGlvbiI7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJIZWF0LUZpbGUueWFtbCI7CisJCUdlbmVyYWxVSVV0aWxzLmRlZmluZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydEZpbGVXaXRoU2VuZEtleUJyb3dzZShHZW5lcmFsVUlVdGlscy5GSUxFX1BBVEgsIGZpbGVOYW1lKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJBZGQiKS5jbGljaygpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkobGFiZWxOYW1lKTsKKworCQlhcnRpZmFjdFZhbHVlcy5wdXQoInR5cGUiLCB0eXBlKTsKKwkJYXJ0aWZhY3RWYWx1ZXMucHV0KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJYXJ0aWZhY3RWYWx1ZXMucHV0KCJuYW1lIiwgbGFiZWxOYW1lKTsKKwkJYXJ0aWZhY3RWYWx1ZXMucHV0KCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsKKwkJcmV0dXJuIGFydGlmYWN0VmFsdWVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhZGREZXBsb3ltZW50QXJ0aWZhY3QoU3RyaW5nIGFydGlmYWN0TGFiZWwsIFN0cmluZyBhcnRpZmFjdFR5cGUsIFN0cmluZyBmaWxlTmFtZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdHlwZSA9IG51bGw7CisJCVN0cmluZyBsYWJlbE5hbWU7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gYXJ0aWZhY3RWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJdHJ5IHsKKwkJCWxhYmVsTmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoYXJ0aWZhY3RMYWJlbCwgInNlbGVjdEFydGlmYWN0IikuZ2V0T3B0aW9ucygpLmdldCgxKS5nZXRUZXh0KCk7CisJCQlHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KGFydGlmYWN0TGFiZWwsICJzZWxlY3RBcnRpZmFjdCIpLnNlbGVjdEJ5VmlzaWJsZVRleHQobGFiZWxOYW1lKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxhYmVsTmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeU5hbWUoYXJ0aWZhY3RMYWJlbCkuZ2V0VGV4dCgpOworCQl9CisJCUFydGlmYWN0TGFiZWwgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKS5maW5kRWxlbWVudChCeS5uYW1lKCJhcnRpZmFjdExhYmVsIikpOworCQlpZiAoQXJ0aWZhY3RMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKCIiKSkgeworCQkJbGFiZWxOYW1lID0gIk5ldy1UZXN0LUFydGlmYWN0IjsKKwkJCUFydGlmYWN0TGFiZWwuc2VuZEtleXMobGFiZWxOYW1lKTsKKwkJCXR5cGUgPSBHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KGFydGlmYWN0VHlwZSwgImFydGlmYWN0dHlwZSIpLmdldEZpcnN0U2VsZWN0ZWRPcHRpb24oKS5nZXRUZXh0KCk7CisJCX0KKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIlRoaXMgaXMgRGVzY3JpcHRpb24iOworCQlHZW5lcmFsVUlVdGlscy5kZWZpbmVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCVJlc291cmNlVUlVdGlscy5pbXBvcnRGaWxlV2l0aFNlbmRLZXlCcm93c2UoR2VuZXJhbFVJVXRpbHMuRklMRV9QQVRILCBmaWxlTmFtZSk7CisJCXRyeSB7CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oIkFkZCIpLmNsaWNrKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlHZW5lcmFsVUlVdGlscy5nZXRCdXR0b25CeUNsYXNzTmFtZSgidy1zZGMtZm9ybS1hY3Rpb24gYWRkLXByb3BlcnR5IikuY2xpY2soKTsKKwkJfQorCisJCWFydGlmYWN0VmFsdWVzLnB1dCgidHlwZSIsIGFydGlmYWN0VHlwZSk7CisJCWFydGlmYWN0VmFsdWVzLnB1dCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisJCWFydGlmYWN0VmFsdWVzLnB1dCgibmFtZSIsIGxhYmVsTmFtZSk7CisJCWFydGlmYWN0VmFsdWVzLnB1dCgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7CisJCXJldHVybiBhcnRpZmFjdFZhbHVlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkRGVwbG95bWVudEFydGlmYWN0RnJvbUNhbnZhcyhTdHJpbmcgYXJ0aWZhY3RMYWJlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0eXBlID0gbnVsbDsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBhcnRpZmFjdFZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQlTdHJpbmcgbGFiZWxOYW1lID0gR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdChhcnRpZmFjdExhYmVsLCAic2VsZWN0QXJ0aWZhY3QiKS5nZXRGaXJzdFNlbGVjdGVkT3B0aW9uKCkKKwkJCQkuZ2V0VGV4dCgpOworCQlBcnRpZmFjdExhYmVsID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkubmFtZSgiYXJ0aWZhY3RMYWJlbCIpKTsKKwkJaWYgKEFydGlmYWN0TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygiIikpIHsKKwkJCWxhYmVsTmFtZSA9ICJOZXctVGVzdC1BcnRpZmFjdCI7CisJCQlBcnRpZmFjdExhYmVsLnNlbmRLZXlzKGxhYmVsTmFtZSk7CisJCQl0eXBlID0gR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdCgiT1RIRVIiLCAiYXJ0aWZhY3R0eXBlIikuZ2V0Rmlyc3RTZWxlY3RlZE9wdGlvbigpLmdldFRleHQoKTsKKwkJfQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiVGhpcyBpcyBEZXNjcmlwdGlvbiI7CisJCVN0cmluZyBmaWxlUGF0aCA9ICJDOlxcR2l0X3dvcmtcXEFTRENcXGQyLXNkbmNcXHVpLWNpXFxzcmNcXG1haW5cXHJlc291cmNlc1xcRmlsZXNcXCI7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJIZWF0LUZpbGUueWFtbCI7CisJCUdlbmVyYWxVSVV0aWxzLmRlZmluZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmltcG9ydEZpbGVXaXRoU2VuZEtleUJyb3dzZShmaWxlUGF0aCwgZmlsZU5hbWUpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oIkFkZCIpLmNsaWNrKCk7CisJCWFydGlmYWN0VmFsdWVzLnB1dCgidHlwZSIsIHR5cGUpOworCQlhcnRpZmFjdFZhbHVlcy5wdXQoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworCQlhcnRpZmFjdFZhbHVlcy5wdXQoIm5hbWUiLCBsYWJlbE5hbWUpOworCQlhcnRpZmFjdFZhbHVlcy5wdXQoImZpbGVOYW1lIiwgZmlsZU5hbWUpOworCQlyZXR1cm4gYXJ0aWZhY3RWYWx1ZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkZUFydGlmYWN0KE1hcDxTdHJpbmcsIFN0cmluZz4gYXJ0aWZhY3RWYWx1ZXMsIEJvb2xlYW4gY29uZGl0aW9uKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChjb25kaXRpb24pIHsKKwkJCUdlbmVyYWxVSVV0aWxzLmdldEVlbGVtZW50Qnljb250YWluc0NsYXNzTmFtZSgidGFibGUtZWRpdC1idG4iKS5jbGljaygpOworCQl9IGVsc2UgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGFydGlmYWN0VmFsdWVzLmdldCgibmFtZSIpKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZWRpdF8iICsgYXJ0aWZhY3RWYWx1ZXMuZ2V0KCJuYW1lIikpLmNsaWNrKCk7CisJCX0KKwkJVGhyZWFkLnNsZWVwKDEwMDApOworCQlTdHJpbmcgbGFiZWxuYW1lID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudEJ5TmFtZSgiYXJ0aWZhY3RMYWJlbCIpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKKwkJU3RyaW5nIGZpbGVuYW1lID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJmaWxlbmFtZSIpLmdldFRleHQoKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJkZXNjcmlwdGlvbiIpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKKwkJU3RyaW5nIHR5cGUgPSBHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KG51bGwsICJhcnRpZmFjdHR5cGUiKS5nZXRGaXJzdFNlbGVjdGVkT3B0aW9uKCkuZ2V0VGV4dCgpOworCQlsYWJlbG5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShhcnRpZmFjdFZhbHVlcy5nZXQoIm5hbWUiKS5yZXBsYWNlQWxsKCItIiwgIiIpKTsKKwkJYXNzZXJ0RXF1YWxzKGZpbGVuYW1lLCBhcnRpZmFjdFZhbHVlcy5nZXQoImZpbGVOYW1lIikucmVwbGFjZUFsbCgiICIsICItIikpOworCQlhc3NlcnRFcXVhbHModHlwZSwgYXJ0aWZhY3RWYWx1ZXMuZ2V0KCJ0eXBlIikpOworCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb24sIGFydGlmYWN0VmFsdWVzLmdldCgiZGVzY3JpcHRpb24iKSk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigiVXBkYXRlIikuY2xpY2soKTsKKwkJcmV0dXJuIGFydGlmYWN0VmFsdWVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGVBcnRpZmFjdEZyb21DYW52YXMoTWFwPFN0cmluZywgU3RyaW5nPiBhcnRpZmFjdFZhbHVlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiYXJ0aWZhY3REaXNwbGF5TmFtZS0iICsgYXJ0aWZhY3RWYWx1ZXMuZ2V0KCJuYW1lIikpLmNsaWNrKCk7CisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJU3RyaW5nIGxhYmVsbmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRCeU5hbWUoImFydGlmYWN0TGFiZWwiKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN0cmluZyBmaWxlbmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZmlsZW5hbWUiKS5nZXRUZXh0KCk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZGVzY3JpcHRpb24iKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN0cmluZyB0eXBlID0gR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdChudWxsLCAiYXJ0aWZhY3R0eXBlIikuZ2V0Rmlyc3RTZWxlY3RlZE9wdGlvbigpLmdldFRleHQoKTsKKwkJbGFiZWxuYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoYXJ0aWZhY3RWYWx1ZXMuZ2V0KCJuYW1lIikucmVwbGFjZUFsbCgiLSIsICIiKSk7CisJCWFzc2VydEVxdWFscyhmaWxlbmFtZSwgYXJ0aWZhY3RWYWx1ZXMuZ2V0KCJmaWxlTmFtZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKHR5cGUsIGFydGlmYWN0VmFsdWVzLmdldCgidHlwZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uLCBhcnRpZmFjdFZhbHVlcy5nZXQoImRlc2NyaXB0aW9uIikpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0QXJ0aWZhY3RzTGlzdEZyb21SZXNwb25zZShTdHJpbmcganNvblJlc3BvbnNlLAorCQkJU3RyaW5nIGZpZWxkT2ZBcnRpZmFjdExpc3QpIHsKKwkJSlNPTk9iamVjdCBvYmplY3QgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKGpzb25SZXNwb25zZSk7CisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcCA9IChNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+Pikgb2JqZWN0LmdldChmaWVsZE9mQXJ0aWZhY3RMaXN0KTsKKwkJcmV0dXJuIG1hcDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0F1ZGl0Q0RVdGlscy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQXVkaXRDRFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzZmVmNQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0F1ZGl0Q0RVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5leHBlY3RlZC5FeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLmdlbmVyYWwuQ29udmVydG9yOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnZhbGlkYXRpb24uQXVkaXRWYWxpZGF0aW9uVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBBdWRpdENEVXRpbHMgeworCisJcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmVzb3VyY2VTdWNjZXNzQXVkaXQoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlLCBVc2VyIHVzZXIsIFN0cmluZyBhY3Rpb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSlNPTk9iamVjdCBhdWRpdEJvZHkgPSBBdWRpdFZhbGlkYXRpb25VdGlscy5maWx0ZXJBdWRpdEJ5VXVpZChhY3Rpb24sIHJlc291cmNlLmdldFVVSUQoKSk7CisJCUV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCA9IENvbnZlcnRvcgorCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24ocmVzb3VyY2UsIHJlc291cmNlLmdldFZlcnNpb24oKSwgdXNlcik7CisJCVN0cmluZyBhdWRpdEFjdGlvbiA9ICJDcmVhdGUiOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldEFjdGlvbihhdWRpdEFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlZlcnNpb24oIiIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldFByZXZTdGF0ZSgiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0U3RhdHVzKCIyMDEiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXREZXNjKCJPSyIpOworCQlBdWRpdFZhbGlkYXRpb25VdGlscy52YWxpZGF0ZUF1ZGl0KGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QsIGF1ZGl0QWN0aW9uLCBhdWRpdEJvZHkudG9TdHJpbmcoKSwgZmFsc2UpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVNlcnZpY2VTdWNjZXNzQXVkaXQoU2VydmljZVJlcURldGFpbHMgc2VydmljZSwgVXNlciB1c2VyLCBTdHJpbmcgYWN0aW9uKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXZhbGlkYXRlU2VydmljZVN1Y2Nlc3NBdWRpdChzZXJ2aWNlLCB1c2VyLCBhY3Rpb24sIExpZmVjeWNsZVN0YXRlRW51bS5OT1RfQ0VSVElGSUVEX0NIRUNLT1VUKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVTZXJ2aWNlU3VjY2Vzc0F1ZGl0KFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsIFVzZXIgdXNlciwgU3RyaW5nIGFjdGlvbiwKKwkJCUxpZmVjeWNsZVN0YXRlRW51bSBsaWZlY3ljbGVTdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworCQlFeHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0IGV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3QgPSBBdWRpdFZhbGlkYXRpb25VdGlscworCQkJCS5jb25zdHJ1Y3RGaWVsZHNGb3JBdWRpdFZhbGlkYXRpb24oc2VydmljZSwgc2VydmljZS5nZXRWZXJzaW9uKCksIHVzZXIpOworCQlTdHJpbmcgYm9keSA9IEF1ZGl0VmFsaWRhdGlvblV0aWxzLmZpbHRlckF1ZGl0QnlVdWlkKGFjdGlvbiwgc2VydmljZS5nZXRVVUlEKCkpLnRvU3RyaW5nKCk7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0QWN0aW9uKGFjdGlvbik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0UHJldlN0YXRlKCIiKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRQcmV2VmVyc2lvbigiIik7CisJCWV4cGVjdGVkUmVzb3VyY2VBdWRpdEphdmFPYmplY3Quc2V0Q3VyclN0YXRlKGxpZmVjeWNsZVN0YXR1cy50b1N0cmluZygpKTsKKwkJZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdC5zZXRTdGF0dXMoIjIwMSIpOworCQlleHBlY3RlZFJlc291cmNlQXVkaXRKYXZhT2JqZWN0LnNldERlc2MoIk9LIik7CisJCUF1ZGl0VmFsaWRhdGlvblV0aWxzLnZhbGlkYXRlQXVkaXQoZXhwZWN0ZWRSZXNvdXJjZUF1ZGl0SmF2YU9iamVjdCwgYWN0aW9uLCBib2R5LCBmYWxzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9DYW52YXNFbGVtZW50LmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9DYW52YXNFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlOGMwNAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0NhbnZhc0VsZW1lbnQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLkxlZnRQYW5lbENhbnZhc0l0ZW1zOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uV2ViRWxlbWVudDsKKworcHVibGljIGZpbmFsIGNsYXNzIENhbnZhc0VsZW1lbnQgeworCXByaXZhdGUgZmluYWwgU3RyaW5nIHVuaXF1ZUlkOworCXByaXZhdGUgSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBsb2NhdGlvbjsKKwlwcml2YXRlIFdlYkVsZW1lbnQgZWxlbWVudFR5cGU7CisKKwlDYW52YXNFbGVtZW50KFN0cmluZyBuYW1lLCBJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGxvY2F0aW9uLCBXZWJFbGVtZW50IGNhbnZhc0l0ZW0pIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy51bmlxdWVJZCA9IG5hbWU7CisJCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKwkJZWxlbWVudFR5cGUgPSBjYW52YXNJdGVtOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisJCXJldHVybiB1bmlxdWVJZDsKKwl9CisKKwlwdWJsaWMgSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRMb2NhdGlvbigpIHsKKwkJcmV0dXJuIGxvY2F0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gbG9jYXRpb24pIHsKKwkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworCX0KKworCXB1YmxpYyBXZWJFbGVtZW50IGdldEVsZW1lbnRUeXBlKCkgeworCQlyZXR1cm4gZWxlbWVudFR5cGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQ2FudmFzTWFuYWdlci5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQ2FudmFzTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjM2N2EKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9DYW52YXNNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bS5MZWZ0UGFuZWxDYW52YXNJdGVtczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuR2VuZXJhbFVJVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uaW50ZXJhY3Rpb25zLkFjdGlvbnM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDYW52YXNNYW5hZ2VyIHsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIENhbnZhc0VsZW1lbnQ+IGNhbnZhc0VsZW1lbnRzOworCXByaXZhdGUgQWN0aW9ucyBhY3Rpb25zOworCXByaXZhdGUgV2ViRWxlbWVudCBjYW52YXM7CisJcHJpdmF0ZSBpbnQgcmVkdWNlQ2FudmFzV2lkdGhGYWN0b3I7CisJLy8gT2Zmc2V0cyBBcmUgdXNlZCB0byBmaW5kIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiBjYW52YXMgZWxlbWVudCBpbiBvcmRlciB0bworCS8vIGNvbm5lY3QgbGlua3MKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOVkFTX0VMRU1FTlRfWV9PRkZTRVQgPSA0MDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOVkFTX0VMRU1FTlRfWF9PRkZTRVQgPSAyMTsgLy8gMTQgLSAyNworCisJcHJpdmF0ZSBDYW52YXNNYW5hZ2VyKCkgeworCQljYW52YXNFbGVtZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJYWN0aW9ucyA9IG5ldyBBY3Rpb25zKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKTsKKwkJY2FudmFzID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkdlbmVyYWxDYW52YXNJdGVtcy5DQU5WQVMuZ2V0VmFsdWUoKSk7CisJCXRyeSB7CisJCQlXZWJFbGVtZW50IHdlYkVsZW1lbnQgPSBHZW5lcmFsVUlVdGlscworCQkJCQkuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkdlbmVyYWxDYW52YXNJdGVtcy5DQU5WQVNfUklHSFRfUEFORUwuZ2V0VmFsdWUoKSk7CisJCQlyZWR1Y2VDYW52YXNXaWR0aEZhY3RvciA9IHdlYkVsZW1lbnQuZ2V0U2l6ZSgpLndpZHRoOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmVkdWNlQ2FudmFzV2lkdGhGYWN0b3IgPSAwOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBDYW52YXNNYW5hZ2VyIGdldENhbnZhc01hbmFnZXIoKSB7CisJCXJldHVybiBuZXcgQ2FudmFzTWFuYWdlcigpOworCX0KKworCXB1YmxpYyBMaXN0PENhbnZhc0VsZW1lbnQ+IGdldENhbnZhc0VsZW1lbnRzKCkgeworCQlyZXR1cm4gY2FudmFzRWxlbWVudHMudmFsdWVzKCkuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkQ2FudmFzRWxlbWVudChDYW52YXNFbGVtZW50IGVsZW1lbnQpIHsKKwkJY2FudmFzRWxlbWVudHMucHV0KGVsZW1lbnQuZ2V0VW5pcXVlSWQoKSwgZWxlbWVudCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIG1vdmVFbGVtZW50T25DYW52YXMoQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50LCBJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IG5ld0xvY2F0aW9uKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJVGhyZWFkLnNsZWVwKDUwMCk7CisJCWFjdGlvbnMubW92ZVRvRWxlbWVudChjYW52YXMsIGNhbnZhc0VsZW1lbnQuZ2V0TG9jYXRpb24oKS5sZWZ0LCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkucmlnaHQpOworCQlhY3Rpb25zLmNsaWNrQW5kSG9sZCgpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBuZXdMb2NhdGlvbi5sZWZ0LCBuZXdMb2NhdGlvbi5yaWdodCk7CisJCWFjdGlvbnMucmVsZWFzZSgpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJY2FudmFzRWxlbWVudC5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVFbGVtZW50T25DYW52YXMoQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJbW92ZUVsZW1lbnRPbkNhbnZhcyhjYW52YXNFbGVtZW50LCBnZXRGcmVlUG9zaXRpb24oKSk7CisJfQorCisJcHVibGljIHZvaWQgZGVsZXRlRWxlbWVudEZyb21DYW52YXMoQ2FudmFzRWxlbWVudCBjYW52YXNFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBjYW52YXNFbGVtZW50LmdldExvY2F0aW9uKCkubGVmdCwgY2FudmFzRWxlbWVudC5nZXRMb2NhdGlvbigpLnJpZ2h0KTsKKwkJYWN0aW9ucy5jbGljaygpOworCQlhY3Rpb25zLnBlcmZvcm0oKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkdlbmVyYWxDYW52YXNJdGVtcy5ERUxFVEVfSU5TVEFOQ0VfQlVUVE9OLmdldFZhbHVlKCkpCisJCQkJLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShEYXRhVGVzdElkRW51bS5Nb2RhbEl0ZW1zLk9LLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCWNhbnZhc0VsZW1lbnRzLnJlbW92ZShjYW52YXNFbGVtZW50LmdldFVuaXF1ZUlkKCkpOworCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0SXRlbU5hbWUoV2ViRWxlbWVudCBjYW52YXNJdGVtKSB7CisJCVN0cmluZyBjYW52YXNJdGVtTmFtZSA9IGNhbnZhc0l0ZW0uZ2V0QXR0cmlidXRlKCJkYXRhLXRlc3RzLWlkIik7CisKKwkJcmV0dXJuIGNhbnZhc0l0ZW1OYW1lLnN1YnN0cmluZyhjYW52YXNJdGVtTmFtZS5sYXN0SW5kZXhPZigiLSIpKTsKKwl9CisKKwlwdWJsaWMgQ2FudmFzRWxlbWVudCBjcmVhdGVFbGVtZW50T25DYW52YXMoV2ViRWxlbWVudCBjYW52YXNJdGVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IGZyZWVQb3NpdGlvbiA9IGdldEZyZWVQb3NpdGlvbigpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzSXRlbSwgMCwgMCk7CisJCWFjdGlvbnMuY2xpY2tBbmRIb2xkKCk7CisJCWFjdGlvbnMubW92ZVRvRWxlbWVudChjYW52YXMsIGZyZWVQb3NpdGlvbi5sZWZ0LCBmcmVlUG9zaXRpb24ucmlnaHQpOworCQlhY3Rpb25zLnJlbGVhc2UoKTsKKwkJYWN0aW9ucy5wZXJmb3JtKCk7CisKKwkJU3RyaW5nIHVuaXF1ZUlkID0gZ2V0SXRlbU5hbWUoY2FudmFzSXRlbSkgKyAiXyIgKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworCQlDYW52YXNFbGVtZW50IGNhbnZhc0VsZW1lbnQgPSBuZXcgQ2FudmFzRWxlbWVudCh1bmlxdWVJZCwgZnJlZVBvc2l0aW9uLCBjYW52YXNJdGVtKTsKKwkJYWRkQ2FudmFzRWxlbWVudChjYW52YXNFbGVtZW50KTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlyZXR1cm4gY2FudmFzRWxlbWVudDsKKwl9CisKKwlwcml2YXRlIEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gZ2V0RnJlZVBvc2l0aW9uKCkgeworCQkvLyBUT0RPIG1zaGl0cml0IHVzZSBiZXR0ZXIgbWV0aG9kCisJCUltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4gcmFuZG9tUG9zaXRpb24gPSBudWxsOworCQlib29sZWFuIGZyZWVQb3NpdGlvbiA9IGZhbHNlOworCQlpbnQgbWluU3BhY2UgPSAxNTA7CisJCXdoaWxlICghZnJlZVBvc2l0aW9uKSB7CisJCQlJbW11dGFibGVQYWlyPEludGVnZXIsIEludGVnZXI+IHRlbXBSYW5kb21Qb3NpdGlvbiA9IGdldFJhbmRvbVBvc2l0aW9uKCk7CisJCQlmcmVlUG9zaXRpb24gPSAhY2FudmFzRWxlbWVudHMudmFsdWVzKCkuc3RyZWFtKCkubWFwKGUgLT4gZS5nZXRMb2NhdGlvbigpKQorCQkJCQkuZmlsdGVyKGUgLT4gTWF0aC5hYnMoZS5sZWZ0IC0gdGVtcFJhbmRvbVBvc2l0aW9uLmxlZnQpIDwgbWluU3BhY2UKKwkJCQkJCQkmJiBNYXRoLmFicyhlLnJpZ2h0IC0gdGVtcFJhbmRvbVBvc2l0aW9uLnJpZ2h0KSA8IG1pblNwYWNlKQorCQkJCQkuZmluZEFueSgpLmlzUHJlc2VudCgpOworCQkJcmFuZG9tUG9zaXRpb24gPSB0ZW1wUmFuZG9tUG9zaXRpb247CisJCX0KKwkJcmV0dXJuIHJhbmRvbVBvc2l0aW9uOworCX0KKworCXByaXZhdGUgSW1tdXRhYmxlUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBnZXRSYW5kb21Qb3NpdGlvbigpIHsKKwkJaW50IGVkZ2VCdWZmZXIgPSA1MDsKKwkJUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKwkJaW50IHhFbGVtZW50ID0gcmFuZG9tLm5leHRJbnQoY2FudmFzLmdldFNpemUoKS53aWR0aCAtIDIgKiBlZGdlQnVmZmVyIC0gcmVkdWNlQ2FudmFzV2lkdGhGYWN0b3IpICsgZWRnZUJ1ZmZlcjsKKwkJaW50IHlFbGVtZW50ID0gcmFuZG9tLm5leHRJbnQoY2FudmFzLmdldFNpemUoKS5oZWlnaHQgLSAyICogZWRnZUJ1ZmZlcikgKyBlZGdlQnVmZmVyOworCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8SW50ZWdlciwgSW50ZWdlcj4oeEVsZW1lbnQsIHlFbGVtZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsaW5rRWxlbWVudHMoQ2FudmFzRWxlbWVudCBmaXJzdEVsZW1lbnQsIENhbnZhc0VsZW1lbnQgc2Vjb25kRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJZHJhd1NpbXBsZUxpbmsoZmlyc3RFbGVtZW50LCBzZWNvbmRFbGVtZW50KTsKKworCQlzZWxlY3RSZXFBbmRDYXBBbmRDb25uZWN0KCk7CisKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIHNlbGVjdFJlcUFuZENhcEFuZENvbm5lY3QoKSB7CisJCS8vIFNlbGVjdCBGaXJzdCBDYXAKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudHMoRGF0YVRlc3RJZEVudW0uTGlua01lbnVJdGVtcy5MSU5LX0lURU1fQ0FQLmdldFZhbHVlKCkpLmdldCgwKS5jbGljaygpOworCQkvLyBTZWxlY3QgRmlyc3QgUmVxCisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRzKERhdGFUZXN0SWRFbnVtLkxpbmtNZW51SXRlbXMuTElOS19JVEVNX1JFUS5nZXRWYWx1ZSgpKS5nZXQoMCkuY2xpY2soKTsKKwkJLy8gQ29ubmVjdAorCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoRGF0YVRlc3RJZEVudW0uTGlua01lbnVJdGVtcy5DT05ORUNUX0JVVFRPTi5nZXRWYWx1ZSgpKS5jbGljaygpOworCX0KKworCXByaXZhdGUgdm9pZCBkcmF3U2ltcGxlTGluayhDYW52YXNFbGVtZW50IGZpcnN0RWxlbWVudCwgQ2FudmFzRWxlbWVudCBzZWNvbmRFbGVtZW50KSB7CisKKwkJaW50IHlPZmZzZXQgPSBDQU5WQVNfRUxFTUVOVF9ZX09GRlNFVDsKKwkJaW50IHhPZmZzZXQgPSBDQU5WQVNfRUxFTUVOVF9YX09GRlNFVDsKKworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoY2FudmFzLCBmaXJzdEVsZW1lbnQuZ2V0TG9jYXRpb24oKS5sZWZ0ICsgeE9mZnNldCwKKwkJCQlmaXJzdEVsZW1lbnQuZ2V0TG9jYXRpb24oKS5yaWdodCAtIHlPZmZzZXQpOworCisJCWFjdGlvbnMuY2xpY2tBbmRIb2xkKCk7CisJCWFjdGlvbnMubW92ZVRvRWxlbWVudChjYW52YXMsIHNlY29uZEVsZW1lbnQuZ2V0TG9jYXRpb24oKS5sZWZ0ICsgeE9mZnNldCwKKwkJCQlzZWNvbmRFbGVtZW50LmdldExvY2F0aW9uKCkucmlnaHQgLSB5T2Zmc2V0KTsKKwkJYWN0aW9ucy5yZWxlYXNlKCk7CisJCWFjdGlvbnMucGVyZm9ybSgpOworCX0KK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0NhcHR1cmVGYWlsZWRUZXN0cy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQ2FwdHVyZUZhaWxlZFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiMmY4OAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0NhcHR1cmVGYWlsZWRUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5PdXRwdXRUeXBlOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uVGFrZXNTY3JlZW5zaG90OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CisKK3B1YmxpYyBjbGFzcyBDYXB0dXJlRmFpbGVkVGVzdHMgZXh0ZW5kcyBUZXN0TGlzdGVuZXJBZGFwdGVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoSVRlc3RSZXN1bHQgdHIpIHsKKworCQlTdHJpbmcgdGVzdE5hbWUgPSB0ci5nZXROYW1lKCk7CisJCVN0cmluZyBwYXJhbWV0ZXIgPSB0ci5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoID09IDEgPyB0ci5nZXRQYXJhbWV0ZXJzKClbMF0udG9TdHJpbmcoKSA6ICIiOworCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKFN0cmluZy5mb3JtYXQoInRlc3Qtb3V0cHV0XFxmYWlsdXJlX3NjcmVlbnNob3RzXFwlc18lcy5wbmciLCB0ZXN0TmFtZSwgcGFyYW1ldGVyKSk7CisKKwkJRmlsZSBzY3JGaWxlID0gKChUYWtlc1NjcmVlbnNob3QpIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKS5nZXRTY3JlZW5zaG90QXMoT3V0cHV0VHlwZS5GSUxFKTsKKworCQl0cnkgeworCQkJRmlsZVV0aWxzLmNvcHlGaWxlKHNjckZpbGUsIGZvbGRlcik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJUmVwb3J0ZXIuc2V0RXNjYXBlSHRtbChmYWxzZSk7CisJCVN0cmluZyBzY3JlZW5QYXRoID0gU3RyaW5nLmZvcm1hdCgiPGltZyBzcmM9JXMgLz4iLCBmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQlSZXBvcnRlci5sb2coc2NyZWVuUGF0aCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9DYXRhbG9nVUlVdGlsaXRpcy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQ2F0YWxvZ1VJVXRpbGl0aXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjA0NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvQ2F0YWxvZ1VJVXRpbGl0aXMuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5qc29uLkpzb247CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5DYXRhbG9nUmVzdFV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENhdGFsb2dVSVV0aWxpdGlzIHsKKworCS8vIEdldCBhbGwgQ2F0ZWdvcmllcyAsIFN1YmNhdGVnb3JpZXMgYW5kIEljb25zLgorCXB1YmxpYyB2b2lkIGdldEFsbENhdGVnb3JpZXNBbmRTdWJjYXRlZ29yaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGFsbGNhdGVnb3JpZXNKc29uID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzVG93YXJkc0NhdGFsb2dCZSgpOworCQlKU09OQXJyYXkgY2F0ZWdvcmllcyA9IG5ldyBKU09OQXJyYXkoYWxsY2F0ZWdvcmllc0pzb24uZ2V0UmVzcG9uc2UoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGgoKTsgaSsrKSB7CisJCQlTdHJpbmcgY2F0ZWdvcnluYW1lID0gKFN0cmluZykgY2F0ZWdvcmllcy5nZXRKU09OT2JqZWN0KGkpLmdldCgibmFtZSIpOworCQkJSlNPTkFycmF5IHN1YmNhdGVnb3JpZXMgPSAoSlNPTkFycmF5KSBjYXRlZ29yaWVzLmdldEpTT05PYmplY3QoaSkuZ2V0KCJzdWJjYXRlZ29yaWVzIik7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHN1YmNhdGVnb3JpZXMubGVuZ3RoKCk7IGorKykgeworCQkJCVN0cmluZyBzdWJjYXRlZ29yeW5hbWUgPSAoU3RyaW5nKSBzdWJjYXRlZ29yaWVzLmdldEpTT05PYmplY3QoaikuZ2V0KCJuYW1lIik7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKHN1YmNhdGVnb3J5bmFtZSk7CisJCQl9CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHN1YmNhdGVnb3JpZXMubGVuZ3RoKCk7IGorKykgeworCQkJCUpTT05BcnJheSBpY29ucyA9IChKU09OQXJyYXkpIHN1YmNhdGVnb3JpZXMuZ2V0SlNPTk9iamVjdChqKS5nZXQoImljb25zIik7CisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpY29ucy5sZW5ndGgoKTsgaysrKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpY29ucy5nZXQoaykpOworCQkJCX0KKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQl9CisJfQorCisJQFRlc3QKKwkvLyBGT3IgdGVzdGluZy0tLWRlbGV0ZS4KKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBhYmNkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uIHsKKwkJUmVzdFJlc3BvbnNlIGFsbGNhdGVnb3JpZXNKc29uID0gQ2F0YWxvZ1Jlc3RVdGlscy5nZXRBbGxDYXRlZ29yaWVzVG93YXJkc0NhdGFsb2dCZSgpOworCQlKU09OQXJyYXkgY2F0ZWdvcmllcyA9IG5ldyBKU09OQXJyYXkoYWxsY2F0ZWdvcmllc0pzb24uZ2V0UmVzcG9uc2UoKSk7CisJCUxpc3Q8U3RyaW5nPiBhbGxjYXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJU3RyaW5nIHVuaXF1ZUlkID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aCgpOyBpKyspIHsKKwkJCVN0cmluZyBjYXRlZ29yeW5hbWUgPSAoU3RyaW5nKSBjYXRlZ29yaWVzLmdldEpTT05PYmplY3QoaSkuZ2V0KCJuYW1lIik7CisJCQl1bmlxdWVJZCA9IChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0SlNPTk9iamVjdChpKS5nZXQoInVuaXF1ZUlkIik7CisJCQlhbGxjYXQuYWRkKHVuaXF1ZUlkKTsKKwkJCUpTT05BcnJheSBzdWJjYXRlZ29yaWVzID0gKEpTT05BcnJheSkgY2F0ZWdvcmllcy5nZXRKU09OT2JqZWN0KGkpLmdldCgic3ViY2F0ZWdvcmllcyIpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWJjYXRlZ29yaWVzLmxlbmd0aCgpOyBqKyspIHsKKwkJCQlTdHJpbmcgc3ViY2F0ZWdvcnluYW1lID0gKFN0cmluZykgc3ViY2F0ZWdvcmllcy5nZXRKU09OT2JqZWN0KGopLmdldCgibmFtZSIpOworCQkJCXVuaXF1ZUlkID0gKFN0cmluZykgc3ViY2F0ZWdvcmllcy5nZXRKU09OT2JqZWN0KGopLmdldCgidW5pcXVlSWQiKTsKKwkJCQlhbGxjYXQuYWRkKHVuaXF1ZUlkKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWxsY2F0OworCisJfQorCisJLy8gR2V0IGFsbCBDYXRlZ29yaWVzIHVuaXF1ZUlEIC4vL1RoZSBwYXJlbnQgY2F0ZWdvcmllcy4KKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRDYXRlZ29yaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IGFsbENhdGVnb3JpZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVJlc3RSZXNwb25zZSBhbGxjYXRlZ29yaWVzSnNvbiA9IENhdGFsb2dSZXN0VXRpbHMuZ2V0QWxsQ2F0ZWdvcmllc1Rvd2FyZHNDYXRhbG9nQmUoKTsKKwkJSlNPTkFycmF5IGNhdGVnb3JpZXMgPSBuZXcgSlNPTkFycmF5KGFsbGNhdGVnb3JpZXNKc29uLmdldFJlc3BvbnNlKCkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoKCk7IGkrKykgeworCQkJU3RyaW5nIGNhdGVnb3J5bmFtZSA9IChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0SlNPTk9iamVjdChpKS5nZXQoIm5hbWUiKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihjYXRlZ29yeW5hbWUpOworCQkJYWxsQ2F0ZWdvcmllc0xpc3QuYWRkKGNhdGVnb3J5bmFtZSk7CisJCX0KKwkJcmV0dXJuIGFsbENhdGVnb3JpZXNMaXN0OworCX0KKworCUBUZXN0CisJLy8gR2V0IFN1YmNhdGVnb3JpZXMgYnkgQ2F0ZWdvcnkgbmFtZQorCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEFsbFN1YmNhdGVnb3JpZXNCeVVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uIHsKKworCQlSZXN0UmVzcG9uc2UgYWxsY2F0ZWdvcmllc0pzb24gPSBDYXRhbG9nUmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXNUb3dhcmRzQ2F0YWxvZ0JlKCk7CisJCUpTT05BcnJheSBjYXRlZ29yaWVzID0gbmV3IEpTT05BcnJheShhbGxjYXRlZ29yaWVzSnNvbi5nZXRSZXNwb25zZSgpKTsKKwkJTGlzdDxTdHJpbmc+IHN1YkNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsvLyBzdWJDYXRlZ29yaWVzIHRvCisJCQkJCQkJCQkJCQkJCS8vIHJldHVybi4KKwkJSlNPTkFycmF5IHN1YmNhdGVnb3JpZXMgPSBudWxsOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGgoKTsgaSsrKSB7CisKKwkJCVN0cmluZyBjYXRlZ29yeXVuaXF1ZUlkID0gKFN0cmluZykgY2F0ZWdvcmllcy5nZXRKU09OT2JqZWN0KGkpLmdldCgidW5pcXVlSWQiKTsKKworCQkJaWYgKGNhdGVnb3J5dW5pcXVlSWQuY29udGVudEVxdWFscyh1bmlxdWVJZCkpIHsKKwkJCQlzdWJjYXRlZ29yaWVzID0gKEpTT05BcnJheSkgY2F0ZWdvcmllcy5nZXRKU09OT2JqZWN0KGkpLmdldCgic3ViY2F0ZWdvcmllcyIpOworCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWJjYXRlZ29yaWVzLmxlbmd0aCgpOyBqKyspIHsKKworCQkJCQlzdWJDYXRlZ29yaWVzLmFkZCgoU3RyaW5nKSBzdWJjYXRlZ29yaWVzLmdldEpTT05PYmplY3QoaikuZ2V0KCJ1bmlxdWVJZCIpKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoc3ViY2F0ZWdvcmllcyA9PSBudWxsKSB7CisJCQlzdWJDYXRlZ29yaWVzLmFkZCh1bmlxdWVJZCk7CisJCX0KKwkJcmV0dXJuIHN1YkNhdGVnb3JpZXM7CisJfQorCisJQFRlc3QKKwkvLyBHZXQgaWNvbnMgYnkgY2F0ZWdvcnkgbmFtZQorCXB1YmxpYyB2b2lkIGdldFN1YkNhdGVnb3J5SWNvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTT05FeGNlcHRpb24geworCQlSZXN0UmVzcG9uc2UgYWxsY2F0ZWdvcmllc0pzb24gPSBDYXRhbG9nUmVzdFV0aWxzLmdldEFsbENhdGVnb3JpZXNUb3dhcmRzQ2F0YWxvZ0JlKCk7CisKKwkJSlNPTkFycmF5IGNhdGVnb3JpZXMgPSBuZXcgSlNPTkFycmF5KGFsbGNhdGVnb3JpZXNKc29uLmdldFJlc3BvbnNlKCkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoKCk7IGkrKykgeworCQkJU3RyaW5nIHN1YmNhdGVnb3J5bmFtZSA9IChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0SlNPTk9iamVjdChpKS5nZXQoIm5hbWUiKTsKKwkJCWlmIChzdWJjYXRlZ29yeW5hbWUuY29udGVudEVxdWFscygiR2VuZXJpYyIpKSB7CisJCQkJSlNPTkFycmF5IHN1YmNhdGVnb3JpZXMgPSAoSlNPTkFycmF5KSBjYXRlZ29yaWVzLmdldEpTT05PYmplY3QoaSkuZ2V0KCJzdWJjYXRlZ29yaWVzIik7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWJjYXRlZ29yaWVzLmxlbmd0aCgpOyBqKyspIHsKKwkJCQkJSlNPTkFycmF5IGljb25zID0gKEpTT05BcnJheSkgc3ViY2F0ZWdvcmllcy5nZXRKU09OT2JqZWN0KGopLmdldCgiaWNvbnMiKTsKKwkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpY29ucy5sZW5ndGgoKTsgaysrKSB7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaWNvbnMuZ2V0KGspKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvRmlsZUhhbmRsaW5nLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9GaWxlSGFuZGxpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTMzYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvRmlsZUhhbmRsaW5nLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLllhbWw7CisKK3B1YmxpYyBjbGFzcyBGaWxlSGFuZGxpbmcgeworCisJcHVibGljIHN0YXRpYyBNYXA8PywgPz4gcGFyc2VZYW1sRmlsZShTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBFeGNlcHRpb24geworCQlZYW1sIHlhbWwgPSBuZXcgWWFtbCgpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7CisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJTWFwPD8sID8+IG1hcCA9IChNYXA8PywgPz4pIHlhbWwubG9hZChpbnB1dFN0cmVhbSk7CisJCXJldHVybiBtYXA7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7CisJCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VzRmlsZXNQYXRoKCkgeworCQlyZXR1cm4gZ2V0QmFzZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIgKyBGaWxlLnNlcGFyYXRvciArICJtYWluIiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIKKwkJCQkrIEZpbGUuc2VwYXJhdG9yICsgIkZpbGVzIiArIEZpbGUuc2VwYXJhdG9yOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENpRmlsZXNQYXRoKCkgeworCQlyZXR1cm4gZ2V0QmFzZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIgKyBGaWxlLnNlcGFyYXRvciArICJtYWluIiArIEZpbGUuc2VwYXJhdG9yICsgInJlc291cmNlcyIKKwkJCQkrIEZpbGUuc2VwYXJhdG9yICsgImNpIjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25mRmlsZXNQYXRoKCkgeworCQlyZXR1cm4gZ2V0Q2lGaWxlc1BhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgImNvbmYiICsgRmlsZS5zZXBhcmF0b3I7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdFN1aXRlc0ZpbGVzUGF0aCgpIHsKKwkJcmV0dXJuIGdldENpRmlsZXNQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0U3VpdGVzIiArIEZpbGUuc2VwYXJhdG9yOworCX0KKworCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0RmlsZU5hbWVzRnJvbUZvbGRlcihTdHJpbmcgZmlsZXBhdGgsIFN0cmluZyBleHRlbnNpb24pIHsKKwkJdHJ5IHsKKwkJCUZpbGUgZGlyID0gbmV3IEZpbGUoZmlsZXBhdGgpOworCQkJTGlzdDxTdHJpbmc+IGZpbGVuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7CisJCQkJZm9yIChGaWxlIGZpbGUgOiBkaXIubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKwkJCQkJCXJldHVybiBuYW1lLmVuZHNXaXRoKGV4dGVuc2lvbik7CisJCQkJCX0KKwkJCQl9KSkgeworCisJCQkJCWZpbGVuYW1lcy5hZGQoZmlsZS5nZXROYW1lKCkpOworCQkJCX0KKwkJCQlyZXR1cm4gZmlsZW5hbWVzLnRvQXJyYXkoKTsKKwkJCX0KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL0dlbmVyYWxVSVV0aWxzLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9HZW5lcmFsVUlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDM2OTUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9HZW5lcmFsVUlVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTA4MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEuYXd0LkFXVEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKK2ltcG9ydCBqYXZhLmF3dC5Ub29sa2l0OworaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5TdHJpbmdTZWxlY3Rpb247CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50aW1lLlN0b3BXYXRjaDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5kYXRhdHlwZXMuZW51bXMuUmVzb3VyY2VUeXBlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5CcmVhZENydW1ic0J1dHRvbnNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5DYXRhbG9nRmlsdGVyVGl0bGVzRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ2hlY2tCb3hTdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5DcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLk1lbnVPcHRpb25zRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5UeXBlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cC5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLkJ5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uS2V5czsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLk91dHB1dFR5cGU7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLlRha2VzU2NyZWVuc2hvdDsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkRyaXZlcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5maXJlZm94LkZpcmVmb3hEcml2ZXI7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5pbnRlcmFjdGlvbnMuQWN0aW9uczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnJlbW90ZS5EZXNpcmVkQ2FwYWJpbGl0aWVzOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0ucmVtb3RlLlJlbW90ZVdlYkRyaXZlcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuRXhwZWN0ZWRDb25kaXRpb25zOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5TZWxlY3Q7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLldlYkRyaXZlcldhaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKKworaW1wb3J0IGNvbS5yZWxldmFudGNvZGVzLmV4dGVudHJlcG9ydHMuTG9nU3RhdHVzOworCitwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJhbFVJVXRpbHMgeworCQorCXByaXZhdGUgc3RhdGljIGludCB0aW1lT3V0PTYwKjM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUUgPSAiVmFsaWRfdG9zY2FfTXljb21wdXRlLnltbCI7CisKKwkvKioqKioqKioqKioqKioqKiBEUklWRVJTICoqKioqKioqKioqKioqKiovCisJcHJpdmF0ZSBzdGF0aWMgV2ViRHJpdmVyIGRyaXZlcjsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBmaW5kQ29tcG9uZW50QW5kQ2xpY2soU3RyaW5nIGNvbXBvbmVudE5hbWUpIHRocm93cyBFeGNlcHRpb24geworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCAiZmluZGluZyBjb21wb25lbnQgIiArIGNvbXBvbmVudE5hbWUpOworCQl3YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoIm1haW4tbWVudS1pbnB1dC1zZWFyY2giKS5zZW5kS2V5cyhjb21wb25lbnROYW1lKTsKKwkJV2ViRWxlbWVudCBmb3VuZENvbXAgPSBudWxsOworCQl0cnkgeworCQkJZm91bmRDb21wID0gd2FpdEZvcmRhdGFUZXN0SWRWaXNpYmlsaXR5KGNvbXBvbmVudE5hbWUpOworCQkJZm91bmRDb21wLmNsaWNrKCk7CisJCQlHZW5lcmFsVUlVdGlscy53YWl0Rm9yTG9hZGVyKCk7CisJCQl3YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoImZvcm1saWZlY3ljbGVzdGF0ZSIpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkRJRCBOT1QgRklORCBBIENPTVBPTkVOVCBOQU1FRCAlcyIsIGNvbXBvbmVudE5hbWUpOworCQkJU2V0dXBDRFRlc3QuZ2V0RXh0ZW5kVGVzdCgpLmxvZyhMb2dTdGF0dXMuRkFJTCwgbXNnKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworCQkJQXNzZXJ0LmZhaWwobXNnKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXRFbGVtZW5ldHNGcm9tVGFibGUoQnkgYnkpIHsKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhieSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXROZXdCdXR0b25zTGlzdCgpIHsKKwkJV2ViRWxlbWVudCBjcmVhdGVCdXR0b25zQXJlYSA9IGRyaXZlci5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoInctc2RjLWRhc2hib2FyZC1jYXJkLW5ldyIpKTsKKwkJY3JlYXRlQnV0dG9uc0FyZWEuY2xpY2soKTsKKwkJTGlzdDxXZWJFbGVtZW50PiBidXR0b25zTGlzdCA9IGRyaXZlci5maW5kRWxlbWVudHMoQnkuY2xhc3NOYW1lKCJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1uZXctYnV0dG9uIikpOworCQlyZXR1cm4gYnV0dG9uc0xpc3Q7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgIlxcc3JjXFxtYWluXFxyZXNvdXJjZXNcXEZpbGVzXFwiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVOYW1lID0gIkpETV92ZmMueW1sIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b3NjYUVycm9yTWVzc2FnZSA9ICJJbnZhbGlkIFRPU0NBIHRlbXBsYXRlLiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgeWFtbEVycm9yID0gIkludmFsaWQgWUFNTCBmaWxlLiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWxsUmVhZHlFeGlzdEVycm8gPSAiSW1wb3J0ZWQgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgaW4gQVNEQyBDYXRhbG9nLiI7CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgaG92ZXJPbkFyZWEoU3RyaW5nIGFyZWFJZCkgeworCQlBY3Rpb25zIGFjdGlvbnMgPSBuZXcgQWN0aW9ucyhkcml2ZXIpOworCQlXZWJFbGVtZW50IGFyZWEgPSBnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoYXJlYUlkKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGFyZWEpLnBlcmZvcm0oKTsKKwkJcmV0dXJuIGFyZWE7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IGFjdGlvbkJ1aWxkKFdlYkVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJLy8gbWFrZSBhbiBhY3Rpb24gb24gcGFnZS8vaG92ZXIgb24gZWxlbWVudAorCQlBY3Rpb25zIGJ1aWxkID0gbmV3IEFjdGlvbnMoZHJpdmVyKTsgLy8gaGVyZSB5b3Ugc3RhdGUgQWN0aW9uQnVpZGVyCisJCWJ1aWxkLm1vdmVUb0VsZW1lbnQoZWxlbWVudCkuYnVpbGQoKS5wZXJmb3JtKCk7Ly8gaG92ZXIgdGhlIGVsZW1lbnQuCisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJcHVibGljIHN0YXRpYyBGaWxlIHRha2VTY3JlZW5zaG90KFN0cmluZyB6aXBGaWxlLCBTdHJpbmcgZGlyLCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmICh6aXBGaWxlID09IG51bGwpIHsKKwkJCXppcEZpbGUgPSB0ZXN0TmFtZTsKKwkJfQorCQl0cnkgeworCQkJRmlsZSBzY3JGaWxlID0gKChUYWtlc1NjcmVlbnNob3QpIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKS5nZXRTY3JlZW5zaG90QXMoT3V0cHV0VHlwZS5GSUxFKTsKKwkJCUZpbGUgZmlsZVBhdGggPSBuZXcgRmlsZShTdHJpbmcuZm9ybWF0KCIlcy8lcy5wbmciLCBkaXIsIHppcEZpbGUpKTsKKwkJCW5ldyBGaWxlKGRpcikubWtkaXJzKCk7CisJCQlGaWxlVXRpbHMuY29weUZpbGUoc2NyRmlsZSwgZmlsZVBhdGgpOworCQkJcmV0dXJuIGZpbGVQYXRoOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeworCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGVycm9yTWVzc2FnZVBvcHVwSGFuZGxlKEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpIFN1cHBsaWVyIGZ1bmMpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJV2ViRWxlbWVudCBlcnJvck1lc3NhZ2VQb3B1cEhlYWRlciA9IGdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidy1zZGMtbW9kYWwtaGVhZC10ZXh0IikpOworCQkJaWYgKGVycm9yTWVzc2FnZVBvcHVwSGVhZGVyLmdldFRleHQoKS5lcXVhbHMoIkVycm9yIikpIHsKKwkJCQlXZWJFbGVtZW50IG9rQnV0dG9uID0gZ2V0V2ViQnV0dG9uKCJPSyIpOworCQkJCWlmIChva0J1dHRvbi5pc0Rpc3BsYXllZCgpKSB7CisJCQkJCW9rQnV0dG9uLmNsaWNrKCk7CisJCQkJCWZ1bmMuZ2V0KCk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigic29tZXRoaW5nIHdlbnQgd3JvbmcsIGNhbid0IGRvIGFueXRoaW5nIik7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckxvYWRlcigpIHsKKwkJd2FpdEZvckVsZW1lbnRzKEJ5LmNsYXNzTmFtZSgidGx2LWxvYWRlciIpLCAyMDAsIDMgKiA2MCAqIDEwMDApOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yTG9hZGVyT25ib2FyZGluZygpIHsKKwkJd2FpdEZvckVsZW1lbnRzKEJ5LmNsYXNzTmFtZSgidGx2LWxvYWRlciIpLCAyMDAsIDEzICogNjAgKiAxMDAwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8V2ViRWxlbWVudD4gd2FpdEZvckVsZW1lbnRzKEJ5IGJ5LCBpbnQgbmFwUGVyaW9kLCBpbnQgbWF4V2FpdE1TKSB7CisJCWJvb2xlYW4gaXNLZWVwV2FpdGluZyA9IHRydWU7CisJCWludCBjdXJyZW50V2FpdFRpbWVNUyA9IDA7CisJCUxpc3Q8V2ViRWxlbWVudD4gZWxlbWVudHMgPSBudWxsOworCQl3aGlsZSAoaXNLZWVwV2FpdGluZykgeworCQkJZWxlbWVudHMgPSBnZXREcml2ZXIoKS5maW5kRWxlbWVudHMoYnkpOworCQkJaXNLZWVwV2FpdGluZyA9IGVsZW1lbnRzLnNpemUoKSA+IDA7CisJCQlpZiAoaXNLZWVwV2FpdGluZykgeworCQkJCXNsZWVwKG5hcFBlcmlvZCk7CisJCQkJY3VycmVudFdhaXRUaW1lTVMgKz0gbmFwUGVyaW9kOworCQkJCWlmIChjdXJyZW50V2FpdFRpbWVNUyA+IG1heFdhaXRNUykgeworCQkJCQlpc0tlZXBXYWl0aW5nID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGVsZW1lbnRzOworCisJfQorCisJcHVibGljIHN0YXRpYyBXZWJEcml2ZXIgZ2V0RHJpdmVyKCkgeworCQlyZXR1cm4gZHJpdmVyOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCByaWh0UGFuZWxBUEkoKSB7CisJCXJldHVybiBnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInRhYi1hcGkiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2Nyb2xsRG93bigpIHRocm93cyBBV1RFeGNlcHRpb24geworCQlSb2JvdCByb2JvdCA9IG5ldyBSb2JvdCgpOworCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19ET1dOKTsKKwkJcm9ib3Qua2V5UmVsZWFzZShLZXlFdmVudC5WS19ET1dOKTsKKwl9CisKKwkvLyBzb2x1dGlvbiBmb3IgImVsZW1lbnQgbm90IGF0dGFjaGVkIHRvIHRoZSBET00gYW55bW9yZSIKKwlwdWJsaWMgc3RhdGljIExpc3Q8V2ViRWxlbWVudD4gZ2V0V29ya3NwYWNlRWxlbWVudHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisJCUxpc3Q8V2ViRWxlbWVudD4gYXNzZXRzID0gR2VuZXJhbFVJVXRpbHMuZ2V0RWVsZW1lbnRzQnlDbGFzc05hbWUoInctc2RjLWRhc2hib2FyZC1jYXJkLWJvZHkiKTsKKwkJcmV0dXJuIGFzc2V0czsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRob2ROYW1lKE1ldGhvZCBtZXRob2QpIHsKKwkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBGaWxlV3JpdGVyIEluaXRpYWxpemVwcmludFRvVHh0KFN0cmluZyB0ZXN0TmFtZSkgeworCQlTdHJpbmcgaWRGb3JUeHRGaWxlID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkLk1NLnl5eXlfSEgubW0uc3MiKS5mb3JtYXQobmV3IERhdGUoKSk7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRlc3ROYW1lICsgaWRGb3JUeHRGaWxlKTsKKwkJRmlsZVdyaXRlciBmdyA9IG51bGw7CisJCXRyeSB7CisJCQlmdyA9IG5ldyBGaWxlV3JpdGVyKGZpbGUsIHRydWUpOworCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQl9CisJCXJldHVybiBmdzsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VGaWxlV3JpdGVyKEZpbGVXcml0ZXIgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZmlsZS5mbHVzaCgpOworCQlmaWxlLmNsb3NlKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IGNyZWF0ZUFuZEltcG9ydEJ1dHRvbnMoQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0gdHlwZSwgV2ViRHJpdmVyIGRyaXZlcikKKwkJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIElNUE9SVF9DUDoKKwkJY2FzZSBJTVBPUlRfVkZDOgorCQljYXNlIElNUE9SVF9WTDoKKwkJCWhvdmVyT25BcmVhKCJpbXBvcnRCdXR0b25zQXJlYSIpOworCQkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiaW1wb3J0VkZDYnV0dG9uIik7CisKKwkJY2FzZSBJTVBPUlRfVkY6CisJCQlob3Zlck9uQXJlYSgiaW1wb3J0QnV0dG9uc0FyZWEiKTsKKwkJCXJldHVybiBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50KGRyaXZlciwgImltcG9ydFZGYnV0dG9uIik7CisJCWNhc2UgQ1JFQVRFX1NFUlZJQ0U6CisJCQlob3Zlck9uQXJlYSgiQWRkQnV0dG9uc0FyZWEiLCBkcml2ZXIpOworCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjcmVhdGVTZXJ2aWNlQnV0dG9uIikuY2xpY2soKTsKKwkJCTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1JFQVRFX1BST0RVQ1Q6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50KGRyaXZlciwgImNyZWF0ZVNlcnZpY2VCdXR0b24iKS5jbGljaygpOworCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjcmVhdGVTZXJ2aWNlQnV0dG9uIikuY2xpY2soKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlob3Zlck9uQXJlYSgiQWRkQnV0dG9uc0FyZWEiKTsKKwkJCWRyaXZlci5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSdjcmVhdGVSZXNvdXJjZUJ1dHRvbiddIikpLmNsaWNrKCk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQm94TGlmZUN5Y2xlc3RhdGUoQ2hlY2tCb3hTdGF0dXNFbnVtIGxpZmVDeWNsZSkgeworCQlTdHJpbmcgU3RhdHVzID0gIklOIERFU0lHTiBDSEVDSyBPVVQiOworCQlzd2l0Y2ggKGxpZmVDeWNsZSkgeworCQljYXNlIENIRUNLSU46CisJCQlTdGF0dXMgPSAiSU4gREVTSUdOIENIRUNLIElOIjsKKwkJCWlmIChHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUobGlmZUN5Y2xlLmdldFZhbHVlKCkpLmlzRGlzcGxheWVkKCkpIHsKKwkJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUobGlmZUN5Y2xlLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDSEVDS09VVDoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShsaWZlQ3ljbGUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCVN0YXR1cyA9ICJJTiBERVNJR04gQ0hFQ0sgT1VUIjsKKwkJCWJyZWFrOworCQljYXNlIElOX1RFU1RJTkc6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUobGlmZUN5Y2xlLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQlTdGF0dXMgPSAiSU4gVEVTVElORyI7CisJCQlicmVhazsKKwkJY2FzZSBSRUFEWV9GT1JfVEVTVElORzoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShsaWZlQ3ljbGUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCVN0YXR1cyA9ICJSRUFEWSBGT1IgVEVTVElORyI7CisJCQlicmVhazsKKwkJY2FzZSBDRVJUSUZJRUQ6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUobGlmZUN5Y2xlLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQlTdGF0dXMgPSAiQ0VSVElGSUVEIjsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBTdGF0dXM7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0RmlsZVR5cGVBbmRHZXRVbmlxSWQoUmVzb3VyY2VUeXBlRW51bSBmaWxlVHlwZSwgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywKKwkJCVVzZXIgdXNlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQlyZXNvdXJjZURldGFpbHMuc2V0UmVzb3VyY2VUeXBlKGZpbGVUeXBlLnRvU3RyaW5nKCkpOworCQlSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZURldGFpbHMsIHVzZXIpOworCQlyZXR1cm4gcmVzb3VyY2VEZXRhaWxzLmdldFVuaXF1ZUlkKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1pbmltaXplQ2F0YWxvZ0ZpbHRlckJ5VGl0bGUoQ2F0YWxvZ0ZpbHRlclRpdGxlc0VudW0gdGl0bGVzRW51bSkgeworCisJCXN3aXRjaCAodGl0bGVzRW51bSkgeworCQljYXNlIENBVEVHT1JJRVM6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUodGl0bGVzRW51bS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVFVTOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHRpdGxlc0VudW0uZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWJyZWFrOworCQljYXNlIFRZUEU6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUodGl0bGVzRW51bS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQkvLyB3ZWJFbGVtZW50V2FpdEZvclZpc2libGUuZ2V0KDApLmNsaWNrKCk7CisJCS8vIH0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKFN0cmluZyBkYXRhVGVzdElkKSB7CisJCS8vIHRyeXsKKwkJcmV0dXJuIHdhaXRGb3JkYXRhVGVzdElkVmlzaWJpbGl0eShkYXRhVGVzdElkKTsKKwkJLy8gfQorCQkvLyBjYXRjaChFeGNlcHRpb24gZSl7CisJCS8vIHRyeXsKKwkJLy8gV2ViRWxlbWVudCBlcnJvck1lc3NhZ2VQb3B1cEhlYWRlciA9CisJCS8vIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidy1zZGMtbW9kYWwtaGVhZC10ZXh0IikpOworCQkvLyBpZiAoZXJyb3JNZXNzYWdlUG9wdXBIZWFkZXIuZ2V0VGV4dCgpLmVxdWFscygiRXJyb3IiKSl7CisJCS8vIFdlYkVsZW1lbnQgb2tCdXR0b24gPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oIk9LIik7CisJCS8vIGlmIChva0J1dHRvbi5pc0Rpc3BsYXllZCgpKXsKKwkJLy8vLyB0YWtlU2NyZWVuc2hvdChMb2NhbERhdGVUaW1lLm5vdygpLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgiOiIsICIiKSwKKwkJLy8gU2V0dXBDRFRlc3QuU0NSRUVOU0hPVF9MT0dfRElSKTsKKwkJLy8gb2tCdXR0b24uY2xpY2soKTsKKwkJLy8gcmV0dXJuIGdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShkYXRhVGVzdElkKTsKKwkJLy8gfQorCQkvLyB9CisJCS8vIH0KKwkJLy8gY2F0Y2goRXhjZXB0aW9uIGV4Y2VwdGlvbil7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJkaWRuJ3QgZmluZCBlbGVtZW50IHdpdGgKKwkJLy8gZGF0YS10ZXN0cy1pZCBvZiAlcyIsIGRhdGFUZXN0SWQpKTsKKwkJLy8gfQorCQkvLyB9CisJCS8vIHJldHVybiBudWxsOworCisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IGdldFdlYkVsZW1lbnRCeUlkKFN0cmluZyBpZCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDUpOworCQlyZXR1cm4gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltAaWQ9JyIgKyBpZCArICInXSIpKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IGdldFdlYkVsZW1lbnRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGRyaXZlci5maW5kRWxlbWVudChCeS5uYW1lKG5hbWUpKTsKKwl9CisKKwkvLyBOZXcgdGVkeSAsIHRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIHdlYiBlbGVtZW50cyBieSBUaGUgbmV3IGF0dHJpYnV0ZQorCS8vIHZhbHVlKGRhdGEtdGVzdHMtaWQpCisJcHVibGljIHN0YXRpYyBMaXN0PFdlYkVsZW1lbnQ+IGdldFdlYkVsZW1lbnRzKFN0cmluZyBkYXRhVGVzdElkKSB7CisJCXJldHVybiB3YWl0Rm9yRWxlbWVudHNMaXN0VmlzaWJpbGl0eShkYXRhVGVzdElkKTsKKwl9CisKKwkvLyBOZXcgdGVkeSAsIHRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIHdlYiBlbGVtZW50IEJ1dHRvbiBieSBUaGUgbmV3CisJLy8gYXR0cmlidXRlIHZhbHVlKGRhdGEtdGVzdHMtaWQpCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IGdldFdlYkJ1dHRvbihTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDMgKiA2MCk7CisJCXJldHVybiB3YWl0CisJCQkJLnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy5lbGVtZW50VG9CZUNsaWNrYWJsZShCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgZGF0YVRlc3RJZCArICInXSIpKSk7CisJfQorCisJLy8gTmV3IHRlZHkgLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCB0aWxsIHRoZSB3ZWIgZWxlbWVudCBiZQorCS8vIHZpc2libGUoZGF0YS10ZXN0cy1pZCkKKwlwdWJsaWMgc3RhdGljIEJvb2xlYW4gd2FpdEZvckludmlzaWJpbGVFbGVtZW50KFN0cmluZyBkYXRhVGVzdElkKSB7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KGRyaXZlciwgMyAqIDYwKTsKKwkJcmV0dXJuIHdhaXQudW50aWwoCisJCQkJRXhwZWN0ZWRDb25kaXRpb25zLmludmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGRhdGFUZXN0SWQgKyAiJ10iKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZHJpdmVyLCAzICogNjApOworCQlyZXR1cm4gd2FpdC51bnRpbCgKKwkJCQlFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGRhdGFUZXN0SWQgKyAiJ10iKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGlja2NoZWNrYm94KFN0cmluZyBjYXRlZ29yeSkgeworCQl0cnkgeworCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHdhaXRGb3JDb250YWluc2RhdGFUZXN0SWRWaXNpYmlsaXR5MihTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDUpOworCQlyZXR1cm4gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMKKwkJCQkudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltjb250YWlucyAoQGRhdGEtdGVzdHMtaWQsICciICsgZGF0YVRlc3RJZCArICInXSkiKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiB3YWl0Rm9yQ29udGFpbnNkYXRhVGVzdElkVmlzaWJpbGl0eShTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDUpOworCQlyZXR1cm4gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMKKwkJCQkudmlzaWJpbGl0eU9mQWxsRWxlbWVudHNMb2NhdGVkQnkoQnkueHBhdGgoIi8vKltjb250YWlucyAoQGRhdGEtdGVzdHMtaWQsICciICsgZGF0YVRlc3RJZCArICInXSkiKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0Rm9yQ2xhc3NOYW1lVmlzaWJpbGl0eShTdHJpbmcgY2xhc3NOYW1lKSB7CisJCXJldHVybiB3YWl0Rm9yRWxlbWVudFZpc2liaWxpdHkoQnkuY2xhc3NOYW1lKGNsYXNzTmFtZSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0Rm9yRWxlbWVudFZpc2liaWxpdHkoQnkgYnkpIHsKKwkJcmV0dXJuIHdhaXRGb3JFbGVtZW50VmlzaWJpbGl0eShieSwgMyAqIDYwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgd2FpdEZvckVsZW1lbnRWaXNpYmlsaXR5KEJ5IGJ5LCBpbnQgZHVyYXRpb24pIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZHJpdmVyLCBkdXJhdGlvbik7CisJCXJldHVybiB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy52aXNpYmlsaXR5T2YoZHJpdmVyLmZpbmRFbGVtZW50KGJ5KSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiB3YWl0Rm9yRWxlbWVudHNMaXN0VmlzaWJpbGl0eShCeSBieSkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDMgKiA2MCk7CisJCXJldHVybiB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy52aXNpYmlsaXR5T2ZBbGxFbGVtZW50cyhkcml2ZXIuZmluZEVsZW1lbnRzKGJ5KSkpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2FpdEZvckVsZW1lbnRzTGlzdEludmlzaWJpbGl0eShCeSBieSkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDMgKiA2MCk7CisJCXJldHVybiB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy5pbnZpc2liaWxpdHlPZkVsZW1lbnRMb2NhdGVkKGJ5KSk7CisJfQorCisJLy8gTmV3IHRlZHkgLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCB0aWxsIHRoZSB3ZWIgZWxlbWVudHMgYmUKKwkvLyB2aXNpYmxlKGRhdGEtdGVzdHMtaWQpCisJcHVibGljIHN0YXRpYyBMaXN0PFdlYkVsZW1lbnQ+IHdhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5KFN0cmluZyBkYXRhVGVzdElkKSB7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KGRyaXZlciwgMyAqIDYwKTsKKwkJTGlzdDxXZWJFbGVtZW50PiBmaW5kRWxlbWVudHMgPSB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucworCQkJCS52aXNpYmlsaXR5T2ZBbGxFbGVtZW50c0xvY2F0ZWRCeShCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgZGF0YVRlc3RJZCArICInXSIpKSk7CisJCWlmIChmaW5kRWxlbWVudHMuc2l6ZSgpID4gMCkgeworCQkJcmV0dXJuIGZpbmRFbGVtZW50czsKKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVsZW1lbnRzIG5vdCBFeGlzdCEiKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFdlYkVsZW1lbnQ+IHdhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5VGVzdE1ldGhvZChTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlyZXR1cm4gZHJpdmVyLmZpbmRFbGVtZW50cyhCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgZGF0YVRlc3RJZCArICInXSIpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgd2FpdEZvckJyb3dzZUJ1dHRvbihTdHJpbmcgZGF0YVRlc3RJZCkgeworCisJCXJldHVybiBkcml2ZXIuZmluZEVsZW1lbnQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGRhdGFUZXN0SWQgKyAiJ10iKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFdlYkVsZW1lbnQ+IGdldFdlYkVsZW1lbnRzTGlzdEJ5RGF0YVRlc3RJZChTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlyZXR1cm4gZHJpdmVyLmZpbmRFbGVtZW50cyhCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgZGF0YVRlc3RJZCArICInXSIpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBnZXRXZWJFbGVtZW50QnlEYXRhVGVzdElkKFN0cmluZyBkYXRhVGVzdElkKSB7CisJCXJldHVybiBkcml2ZXIuZmluZEVsZW1lbnQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGRhdGFUZXN0SWQgKyAiJ10iKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHdhaXRVbnRpbENsaWNrYWJsZUJ1dHRvbihTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDMgKiA2MCk7CisJCXJldHVybiB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucworCQkJCS5lbGVtZW50VG9CZUNsaWNrYWJsZShkcml2ZXIuZmluZEVsZW1lbnQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGRhdGFUZXN0SWQgKyAiJ10iKSkpKTsKKwl9CisKKwkvLyBpbnRlcmZhY2UgVGhyb3dzIHsKKwkvLyA8VCxSLCBFIGV4dGVuZHMgRXhjZXB0aW9uPiBSIGFwcGx5KFQgdCkgdGhyb3dzIEU7CisJLy8gfQorCS8vIHB1YmxpYyBzdGF0aWMgPFI+IFIgc3dhbGxvd0V4Y2VwdGlvbihUaHJvd3M8VCxSLEU+IHN1cHBsaWVyKXsKKwkvLyBSIHJldHVyblZhbHVlOworCS8vIHRyeXsKKwkvLyByZXR1cm5WYWx1ZSA9IHN1cHBsaWVyLmdldCgpOworCS8vIH0KKwkvLyBjYXRjaChFeGNlcHRpb24gZSl7CisJLy8gcmV0dXJuVmFsdWUgPSBudWxsOworCS8vIH0KKwkvLyByZXR1cm4gcmV0dXJuVmFsdWU7CisJLy8gfQorCS8vIFVzZSB0aGlzIG1ldGhvZCBvbmx5IGZvciBzcGVjaWFsIGNhc2VzLCBvdGhlcndpc2UgdXNlCisJLy8gb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzLkdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShXZWJEcml2ZXIsCisJLy8gU3RyaW5nKQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWxlbWVudFByZXNlbnQoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJdHJ5IHsKKwkJCWRyaXZlci5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgZGF0YVRlc3RJZCArICInXSIpKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChvcmcub3BlbnFhLnNlbGVuaXVtLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyA8Uj4gUiByZXRyeU1ldGhvZE9uRXhjZXB0aW9uKFN1cHBsaWVyPFI+IHN1cHBsaWVyKSB7CisJCWJvb2xlYW4gc3RvcFNlYXJjaCA9IGZhbHNlOworCQlSIHJldCA9IG51bGw7CisJCUV4Y2VwdGlvbiB0aHJvd01lID0gbnVsbDsKKwkJaW50IHRpbWVFbGFwc2VkID0gMDsKKwkJd2hpbGUgKCFzdG9wU2VhcmNoKSB7CisJCQl0cnkgeworCQkJCXJldCA9IHN1cHBsaWVyLmdldCgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvd01lID0gZTsKKwkJCQlHZW5lcmFsVUlVdGlscy5zbGVlcCgyNTApOworCQkJCXRpbWVFbGFwc2VkICs9IDI1MDsKKwkJCQlpZiAodGltZUVsYXBzZWQgPiA1MDAwKSB7CisJCQkJCXN0b3BTZWFyY2ggPSB0cnVlOworCQkJCX0KKworCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAocmV0ICE9IG51bGwpIHsKKwkJCQkJc3RvcFNlYXJjaCA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChyZXQgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhyb3dNZSk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwl9CisKKwkvLyB0aGlzIG1ldGhvZCB3aWxsIGxvZ2luIGFzIHRlc3RlciBhbmQgc3RhcnQgdGVzdCBvciBhY2NlcHQgQXNzZXRzLgorCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0ZXJVc2VyKEJvb2xlYW4gc3RhcnRUZXN0LCBCb29sZWFuIGFjY2VwdCwgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudChSZXNvdXJjZVVJVXRpbHMuZ2V0TmFtZSgpKS5jbGljaygpOworCQlTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODE4MS9zZGMxL3Byb3h5LXRlc3RlcjEjL2Rhc2hib2FyZCI7CisJCXNsZWVwKDIwMDApOworCQlTZXR1cENEVGVzdC5uYXZpZ2F0ZVRvVXJsKHVybCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShyZXNvdXJjZS5nZXROYW1lKCkpLmNsaWNrKCk7CisKKwkJaWYgKHN0YXJ0VGVzdCkgeworCQkJY2xpY2tTdGFydFRlc3RpbmcoKTsKKwkJfQorCisJCWlmIChhY2NlcHQpIHsKKwkJCWNsaWNrQWNjZXB0KCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ292ZXJub3JVc2VyKEJvb2xlYW4gcmVqZWN0LCBCb29sZWFuIGFwcHJvdmUsIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnQoUmVzb3VyY2VVSVV0aWxzLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjgxODEvc2RjMS9wcm94eS1nb3Zlcm5vcjEjL2Rhc2hib2FyZCI7CisJCXNsZWVwKDIwMDApOworCQlTZXR1cENEVGVzdC5uYXZpZ2F0ZVRvVXJsKHVybCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mbyIpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUocmVzb3VyY2UuZ2V0TmFtZSgpKS5jbGljaygpOworCQlpZiAocmVqZWN0KSB7CisJCQljbGlja1JlamVjdCgpOworCQl9CisJCWlmIChhcHByb3ZlKSB7CisJCQljbGlja0FwcHJvdmUoKTsKKwkJfQorCQlzbGVlcCgxMDAwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgb3BzVXNlcihCb29sZWFuIGRpc3JpYnV0ZSwgQm9vbGVhbiByZURpc3JpYnV0ZSwgUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudChSZXNvdXJjZVVJVXRpbHMuZ2V0TmFtZSgpKS5jbGljaygpOworCQlTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODE4MS9zZGMxL3Byb3h5LW9wczEjL2Rhc2hib2FyZCI7CisJCXNsZWVwKDIwMDApOworCQlTZXR1cENEVGVzdC5uYXZpZ2F0ZVRvVXJsKHVybCk7CisJCXNsZWVwKDIwMDApOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInctc2RjLWRhc2hib2FyZC1jYXJkLWluZm8iKTsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHJlc291cmNlLmdldE5hbWUoKSkuY2xpY2soKTsKKwkJaWYgKHJlRGlzcmlidXRlKSB7CisJCQljbGlja1JlRGlzdHJpYnV0ZSgpOworCQl9CisJCWlmIChkaXNyaWJ1dGUpIHsKKwkJCWNsaWNrRGlzdHJpYnV0ZSgpOworCQl9CisJCXNsZWVwKDEwMDApOworCX0KKworCS8vIHRoaXMgZnVuY3Rpb24gbG9jYXRlZCBzZWxlY3QgbGlzdCBieSB0aGUgZGF0YS10ZXN0LWlkIHZhbHVlIGFuZCB0aGUgaXRlbQorCS8vIHRvIGJlIHNlbGVjdGVkLi4KKwlwdWJsaWMgc3RhdGljIFNlbGVjdCBnZXRTZWxlY3RMaXN0KFN0cmluZyBpdGVtLCBTdHJpbmcgZGF0YXRlc3RzaWQpIHsKKwkJU2VsZWN0IHNlbGVjdGxpc3QgPSBuZXcgU2VsZWN0KHdhaXRGb3JkYXRhVGVzdElkVmlzaWJpbGl0eShkYXRhdGVzdHNpZCkpOworCQlpZiAoaXRlbSAhPSBudWxsKSB7CisJCQlzZWxlY3RsaXN0LnNlbGVjdEJ5VmlzaWJsZVRleHQoaXRlbSk7CisJCX0KKwkJcmV0dXJuIHNlbGVjdGxpc3Q7CisJfQorCisJLy8gRGVmaW5lIGRlc2NyaXB0aW9uIGFyZWEgLgorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmluZURlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvblRleHQpIHsKKworCQlXZWJFbGVtZW50IHJlc291cmNlRGVzY3JpcHRpb25UZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJkZXNjcmlwdGlvbiIpOworCQlyZXNvdXJjZURlc2NyaXB0aW9uVGV4dGJveC5jbGVhcigpOworCQlyZXNvdXJjZURlc2NyaXB0aW9uVGV4dGJveC5zZW5kS2V5cyhkZXNjcmlwdGlvblRleHQpOworCQlyZXR1cm4gZGVzY3JpcHRpb25UZXh0OworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBjYXRhbG9nU2VhcmNoQm94KFN0cmluZyBzZWFyY2hUZXh0KSB7CisJCVdlYkVsZW1lbnQgc2VhcmNoQm94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJtYWluLW1lbnUtaW5wdXQtc2VhcmNoIik7CisJCXNlYXJjaEJveC5jbGVhcigpOworCQlzZWFyY2hCb3guc2VuZEtleXMoc2VhcmNoVGV4dCk7CisJCXJldHVybiBzZWFyY2hCb3g7CisJfQorCisJLy8gZW51bQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RNZW51T3B0aW9uYnluYW1lKExpc3Q8V2ViRWxlbWVudD4gb3B0aW9ucywgTWVudU9wdGlvbnNFbnVtIG9wdGlvbk5hbWUpCisJCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisJCWZvciAoV2ViRWxlbWVudCB3ZWJFbGVtZW50IDogb3B0aW9ucykgeworCQkJaWYgKHdlYkVsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyhvcHRpb25OYW1lLmdldFZhbHVlKCkpKSB7CisJCQkJYWN0aW9uQnVpbGQod2ViRWxlbWVudCkuY2xpY2soKTsKKwkJCX0gZWxzZSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBzdWNoIGVsZW1lbnQhIik7CisJCQl9CisJCX0KKworCX0KKworCS8vIGJhY2sgdG8gd29ya3NwYWNlIGJ5IENsaWNraW5nIHRoZSBBU0RDIExvZ28uIQorCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0FTRENMb2dvKCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDE1KTsKKwkJd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkubGlua1RleHQoIkFTREMiKSkpOworCQlXZWJFbGVtZW50IENsaWNrQVNEQ0xvZ28gPSBkcml2ZXIuZmluZEVsZW1lbnQoQnkubGlua1RleHQoIkFTREMiKSk7CisJCUNsaWNrQVNEQ0xvZ28uY2xpY2soKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0V4aXRTaWduKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJV2ViRWxlbWVudCBleGl0U2lnbiA9IGRyaXZlci5maW5kRWxlbWVudChCeS54cGF0aCgiLy8qW2NvbnRhaW5zKEBjbGFzcywgJ3gtYnRuJyldIikpOworCQlhY3Rpb25CdWlsZChleGl0U2lnbik7CisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJZHJpdmVyLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvLypbY29udGFpbnMoQGNsYXNzLCAneC1idG4nKV0iKSkuY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tDcmVhdGVCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZ2V0V2ViQnV0dG9uKCJjcmVhdGUvc2F2ZSIpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKERhdGFUZXN0SWRFbnVtLkxpZmVDeWxlQ2hhbmdlQnV0dG9ucy5DSEVDS19JTi5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tVcGRhdGVCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMuc2xlZXAoNTAwKTsKKwkJY2xpY2tDcmVhdGVCdXR0b24oKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tPdXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEFXVEV4Y2VwdGlvbiB7CisJCWFjdGlvbkJ1aWxkKGdldFdlYkJ1dHRvbigiY2hlY2tfb3V0IikpOworCQlnZXRXZWJCdXR0b24oImNoZWNrX291dCIpLmNsaWNrKCk7CisJCXdhaXRGb3JJbnZpc2liaWxlRWxlbWVudCgiY2hlY2tfb3V0Iik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrU3RhcnRUZXN0aW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJYWN0aW9uQnVpbGQoZ2V0V2ViQnV0dG9uKCJzdGFydF90ZXN0aW5nIikpOworCQlnZXRXZWJCdXR0b24oInN0YXJ0X3Rlc3RpbmciKS5jbGljaygpOworCQl3YWl0Rm9ySW52aXNpYmlsZUVsZW1lbnQoInN0YXJ0X3Rlc3RpbmciKTsKKwkJZ2V0V2ViQnV0dG9uKCJjcmVhdGUvc2F2ZSIpLmNsaWNrKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrQWNjZXB0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJYWN0aW9uQnVpbGQoZ2V0V2ViQnV0dG9uKCJhY2NlcHQiKSk7CisJCWdldFdlYkJ1dHRvbigiYWNjZXB0IikuY2xpY2soKTsKKwkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjaGVja2luZGlhbG9nIikuc2VuZEtleXMoIkFjY2VwdCEiKTsKKwkJY2xpY2tPa0J1dHRvbigpOworCQlzbGVlcCgxMDAwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tSZWplY3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlhY3Rpb25CdWlsZChnZXRXZWJCdXR0b24oInJlamVjdCIpKTsKKwkJZ2V0V2ViQnV0dG9uKCJyZWplY3QiKS5jbGljaygpOworCQl3YWl0Rm9ySW52aXNpYmlsZUVsZW1lbnQoInJlamVjdCIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0FwcHJvdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlhY3Rpb25CdWlsZChnZXRXZWJCdXR0b24oImFwcHJvdmUiKSk7CisJCWdldFdlYkJ1dHRvbigiYXBwcm92ZSIpLmNsaWNrKCk7CisJCXdhaXRGb3JJbnZpc2liaWxlRWxlbWVudCgiYXBwcm92ZSIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0Rpc3RyaWJ1dGUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlhY3Rpb25CdWlsZChnZXRXZWJCdXR0b24oImRpc3RyaWJ1dGUiKSk7CisJCWdldFdlYkJ1dHRvbigiZGlzdHJpYnV0ZSIpLmNsaWNrKCk7CisJCXdhaXRGb3JJbnZpc2liaWxlRWxlbWVudCgicmVkaXN0cmlidXRlIik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrUmVEaXN0cmlidXRlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJYWN0aW9uQnVpbGQoZ2V0V2ViQnV0dG9uKCJyZWRpc3RyaWJ1dGUiKSk7CisJCWdldFdlYkJ1dHRvbigicmVkaXN0cmlidXRlIikuY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tDYW5jZWwoKSB7CisJCWdldFdlYkJ1dHRvbigiY2FuY2VsIikuY2xpY2soKTsKKwkJd2FpdEZvckludmlzaWJpbGVFbGVtZW50KCJjYW5jZWwiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tJbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCWFjdGlvbkJ1aWxkKGdldFdlYkJ1dHRvbigiY2hlY2tfaW4iKSk7CisJCWdldFdlYkJ1dHRvbigiY2hlY2tfaW4iKS5jbGljaygpOworCQlnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoImNoZWNraW5kaWFsb2ciKS5zZW5kS2V5cygiQ2hlY2sgaW4hIik7CisJCWNsaWNrT2tCdXR0b24oKTsKKwkJd2FpdEZvckludmlzaWJpbGVFbGVtZW50KCJjaGVja2luZGlhbG9nIik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrU2F2ZUljb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlhY3Rpb25CdWlsZChHZW5lcmFsVUlVdGlscy53YWl0Rm9yZGF0YVRlc3RJZFZpc2liaWxpdHkoImNyZWF0ZS9zYXZlIikpOworCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oLyogImRlbGV0ZV92ZXJzaW9uIiAqLyJjcmVhdGUvc2F2ZSIpLmNsaWNrKCk7CisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKworCX0KKworCS8vIE9wZW4gbWVudSBvZiBDcmVhdGVkIE9iamVjdCBhbmQgc2VsZWN0IG9wdGlvbi4KKwlwdWJsaWMgc3RhdGljIHZvaWQgb3Blbk9iamVjdE1lbnVBbmRTZWxlY3RPcHRpb24oU3RyaW5nIHVuaXFpZCwgTWVudU9wdGlvbnNFbnVtIG9wdGlvbk5hbWUpCisJCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEFXVEV4Y2VwdGlvbiB7CisJCVdlYkVsZW1lbnQgaG92ZXJPbk1lbnUgPSBhY3Rpb25CdWlsZChnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUodW5pcWlkKSk7CisJCUxpc3Q8V2ViRWxlbWVudD4gbWVudU9wdGlvbnMgPSBob3Zlck9uTWVudS5maW5kRWxlbWVudChCeS54cGF0aCgiLi9mb2xsb3dpbmctc2libGluZzo6KlsxXSIpKQorCQkJCS5maW5kRWxlbWVudHMoQnkueHBhdGgoIi4vLyoiKSk7CisJCXNlbGVjdE1lbnVPcHRpb25ieW5hbWUobWVudU9wdGlvbnMsIG9wdGlvbk5hbWUpOworCX0KKworCS8vIEdldCBlbGVtZW50cyBieSBjbGFzc05hbWUuCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IGdldEVlbGVtZW50QnlDbGFzc05hbWUoU3RyaW5nIGVsZW1lbnQpIHsKKwkJdHJ5IHsKKwkJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KGRyaXZlciwgMyAqIDYwKTsKKwkJCXJldHVybiB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy52aXNpYmlsaXR5T2ZFbGVtZW50TG9jYXRlZChCeS54cGF0aCgiLy8qW0BjbGFzcz0nIiArIGVsZW1lbnQgKyAiJ10iKSkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8V2ViRWxlbWVudD4gZ2V0RWVsZW1lbnRzQnlDbGFzc05hbWUoU3RyaW5nIGVsZW1lbnQpIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZHJpdmVyLCAzICogNjApOworCQlyZXR1cm4gd2FpdAorCQkJCS51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mQWxsRWxlbWVudHNMb2NhdGVkQnkoQnkueHBhdGgoIi8vKltAY2xhc3M9JyIgKyBlbGVtZW50ICsgIiddIikpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgZ2V0RWVsZW1lbnRCeUNvbnRhaW5zZGF0YXRlc3RzaWQoU3RyaW5nIGRhdGF0ZXN0SWQpIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZHJpdmVyLCAzICogNjApOworCQlyZXR1cm4gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMKKwkJCQkudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltjb250YWlucyhAZGF0YS10ZXN0cy1pZCwgJyIgKyBkYXRhdGVzdElkICsgIicpXSIpKSk7CisJfQorCisJLy8gbGlzdAorCXB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXRFZWxlbWVudHNCeUNvbnRhaW5zRGF0YVRlc3RzSWQoU3RyaW5nIGRhdGF0ZXN0SWQpIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZHJpdmVyLCAzICogNjApOworCQlyZXR1cm4gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMKKwkJCQkudmlzaWJpbGl0eU9mQWxsRWxlbWVudHNMb2NhdGVkQnkoQnkueHBhdGgoIi8vKltjb250YWlucyhAZGF0YS10ZXN0cy1pZCwgJyIgKyBkYXRhdGVzdElkICsgIicpXSIpKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IGdldEVlbGVtZW50Qnljb250YWluc0NsYXNzTmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KGRyaXZlciwgMyAqIDYwKTsKKwkJcmV0dXJuIHdhaXQudW50aWwoCisJCQkJRXhwZWN0ZWRDb25kaXRpb25zLnZpc2liaWxpdHlPZkVsZW1lbnRMb2NhdGVkKEJ5LnhwYXRoKCIvLypbY29udGFpbnMoQGNsYXNzLCAnIiArIGNsYXNzbmFtZSArICInKV0iKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBnZXRFZWxlbWVudEJ5TGlua1RleHQoU3RyaW5nIGxpbmtUZXh0KSB7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KGRyaXZlciwgMyAqIDYwKTsKKwkJcmV0dXJuIHdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLnZpc2liaWxpdHlPZkVsZW1lbnRMb2NhdGVkKEJ5LnhwYXRoKCIvLypbQHRleHQ9JyIgKyBsaW5rVGV4dCArICInXSIpKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFdlYkVsZW1lbnQ+IGdldEVlbGVtZW50c0J5Y29udGFpbnNDbGFzc05hbWUoU3RyaW5nIGNsYXNzbmFtZSkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDMgKiA2MCk7CisJCXJldHVybiB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucworCQkJCS52aXNpYmlsaXR5T2ZBbGxFbGVtZW50c0xvY2F0ZWRCeShCeS54cGF0aCgiLy8qW2NvbnRhaW5zKEBjbGFzcywgJyIgKyBjbGFzc25hbWUgKyAiJyldIikpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgZ2V0QnV0dG9uQnlDbGFzc05hbWUoU3RyaW5nIGVsZW1lbnQpIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZHJpdmVyLCAzICogNjApOworCQlyZXR1cm4gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMuZWxlbWVudFRvQmVDbGlja2FibGUoQnkueHBhdGgoIi8vYnV0dG9uW0BjbGFzcz0nIiArIGVsZW1lbnQgKyAiJ10iKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja2luQ2hlY2tvdXQoU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgRXhjZXB0aW9uLCBFeGNlcHRpb24geworCQljaGVja0luKCk7CisJCWdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbGVtZW50TmFtZSkuY2xpY2soKTsKKwkJOworCQljaGVja091dCgpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1vdmVUb1N0ZXAoRGF0YVRlc3RJZEVudW0uU3RlcHNFbnVtIFN0ZXBuYW1lKSB7CisJCW1vdmVUb1N0ZXAoU3RlcG5hbWUuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1vdmVUb1N0ZXAoU3RyaW5nIGRhdGFUZXN0SWQpIHsKKwkJZ2V0V2ViQnV0dG9uKGRhdGFUZXN0SWQpLmNsaWNrKCk7CisJCXdhaXRGb3JMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZWRpdEZpbGUoU3RyaW5nIG5hbWUpIHsKKwkJV2ViRWxlbWVudCBlZGl0ZmlsZWJ1dHRvbiA9IGRyaXZlci5maW5kRWxlbWVudChCeS5pZCgiZWRpdCIgKyBuYW1lICsgIiIpKTsKKwkJZWRpdGZpbGVidXR0b24uY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRmlsZShTdHJpbmcgbmFtZSkgeworCQlXZWJFbGVtZW50IGRlbGV0ZWJ1dHRvbiA9IGRyaXZlci5maW5kRWxlbWVudChCeS5pZCgiZGVsZXRlIiArIG5hbWUgKyAiIikpOworCQlkZWxldGVidXR0b24uY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZG93bmxvYWRGaWxlKFN0cmluZyBuYW1lKSB7CisJCVdlYkVsZW1lbnQgZG93bmxvYWRidXR0b24gPSBkcml2ZXIuZmluZEVsZW1lbnQoQnkuaWQoImRvd25sb2FkIiArIG5hbWUgKyAiIikpOworCQlkb3dubG9hZGJ1dHRvbi5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcChpbnQgZHVyYXRpb24pIHsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcChkdXJhdGlvbik7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGhhc0RyaXZlcigpIHsKKwkJdHJ5IHsKKwkJCWRyaXZlci5nZXRDdXJyZW50VXJsKCk7CisJCQlkcml2ZXIucXVpdCgpOworCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdERyaXZlcigpIHsKKwkJdHJ5IHsKKwkJCWJvb2xlYW4gcmVtb3RlVGVzdGluZyA9IFNldHVwQ0RUZXN0LmNvbmZpZy5pc1JlbW90ZVRlc3RpbmcoKTsKKwkJCWlmICghcmVtb3RlVGVzdGluZykgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigib3BlbmluZyBMT0NBTCBicm93c2VyIik7CisJCQkJZHJpdmVyID0gbmV3IEZpcmVmb3hEcml2ZXIoKTsKKworCQkJfSBlbHNlIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm9wZW5pbmcgUkVNT1RFIGJyb3dzZXIiKTsKKwkJCQlTdHJpbmcgcmVtb3RlRW52SVAgPSBTZXR1cENEVGVzdC5jb25maWcuZ2V0UmVtb3RlVGVzdGluZ01hY2hpbmVJUCgpOworCQkJCVN0cmluZyByZW1vdGVFbnZQb3J0ID0gU2V0dXBDRFRlc3QuY29uZmlnLmdldFJlbW90ZVRlc3RpbmdNYWNoaW5lUG9ydCgpOworCQkJCURlc2lyZWRDYXBhYmlsaXRpZXMgY2FwID0gbmV3IERlc2lyZWRDYXBhYmlsaXRpZXMoKTsKKwkJCQljYXAgPSBEZXNpcmVkQ2FwYWJpbGl0aWVzLmZpcmVmb3goKTsKKwkJCQljYXAuc2V0UGxhdGZvcm0oUGxhdGZvcm0uV0lORE9XUyk7CisJCQkJY2FwLnNldEJyb3dzZXJOYW1lKCJmaXJlZm94Iik7CisKKwkJCQlTdHJpbmcgcmVtb3RlTm9kZVVybCA9IFN0cmluZy5mb3JtYXQoU2V0dXBDRFRlc3QuU0VMRU5JVU1fTk9ERV9VUkwsIHJlbW90ZUVudklQLCByZW1vdGVFbnZQb3J0KTsKKwkJCQlkcml2ZXIgPSBuZXcgUmVtb3RlV2ViRHJpdmVyKG5ldyBVUkwocmVtb3RlTm9kZVVybCksIGNhcCk7CisJCQl9CisKKworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisJCX0KKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB3aW5kb3dab29tT3V0KCkgeworCQlmaW5hbCBpbnQgem9vbU91dEZhY3RvciA9IDI7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgem9vbU91dEZhY3RvcjsgaSsrKSB7CisJCQlkcml2ZXIuZmluZEVsZW1lbnQoQnkudGFnTmFtZSgiaHRtbCIpKS5zZW5kS2V5cyhLZXlzLmNob3JkKEtleXMuQ09OVFJPTCwgS2V5cy5TVUJUUkFDVCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVRhZ3NMaXN0KFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgU3RyaW5nW10gcmVzb3VyY2VUYWdzKSB7CisJCUxpc3Q8U3RyaW5nPiB0YWdsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCTsKKwkJV2ViRWxlbWVudCByZXNvdXJjZVRhZ3NUZXh0Ym94ID0gZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJpLXNkYy10YWctaW5wdXQiKTsKKwkJZm9yIChTdHJpbmcgdGFnIDogcmVzb3VyY2VUYWdzKSB7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LmNsZWFyKCk7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKHRhZyk7CisJCQlyZXNvdXJjZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKEtleXMuRU5URVIpOworCQkJdGFnbGlzdC5hZGQodGFnKTsKKwkJCS8vIHdhaXRGb3JFbGVtZW50cyhCeS5jbGFzc05hbWUoInNkYy1sb2FkZXIiKSwgMjUwLCAxNTAwMCk7CisJCX0KKwl9CisKKwkvLyBwdWJsaWMgc3RhdGljIExpc3Q8V2ViRWxlbWVudD4gd2FpdEZvckVsZW1lbnRzKEJ5IGJ5LCBpbnQgbmFwUGVyaW9kLCBpbnQKKwkvLyBtYXhXYWl0TVMpeworCS8vIExpc3Q8V2ViRWxlbWVudD4gZWxlbWVudHMgPSBudWxsOworCS8vCisJLy8gZWxlbWVudHMgPSBnZXREcml2ZXIoKS5maW5kRWxlbWVudHMoYnkpOworCS8vIGlmKCBjdXJyZW50V2FpdFRpbWVNUyA+IG1heFdhaXRNUyl7CisJLy8gfQorCS8vIHJlc291cmNlLnNldFRhZ3ModGFnbGlzdCk7CisJLy8gcmV0dXJuIGVsZW1lbnRzOworCS8vIH0KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0VGFiSW5SaWdodFBhbGxldGUoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVdlYkVsZW1lbnQgdGFiID0gZ2V0RWVsZW1lbnRCeWNvbnRhaW5zQ2xhc3NOYW1lKGNsYXNzTmFtZSk7CisJCXRhYi5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBnZXRXZWJFbGVtZW50KFdlYkRyaXZlciBkcml2ZXIsIFN0cmluZyBkYXRhVGVzdElkKSB7CisJCXJldHVybiB3YWl0Rm9yRWxlbWVudFZpc2liaWxpdHkoZGF0YVRlc3RJZCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrT2tCdXR0b24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQkvLyBhY3Rpb25CdWlsZChnZXRXZWJCdXR0b24oIk9LIikpOworCQkvLyBzbGVlcCgyMDAwKTsKKwkJZ2V0V2ViQnV0dG9uKCJPSyIpLmNsaWNrKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHdhaXRGb3JFbGVtZW50VmlzaWJpbGl0eShTdHJpbmcgZGF0YVRlc3RJZCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSwgMzApOworCQlyZXR1cm4gd2FpdC51bnRpbCgKKwkJCQlFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGRhdGFUZXN0SWQgKyAiJ10iKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBkZWxldGVWZXJzaW9uKCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMud2FpdEZvcmRhdGFUZXN0SWRWaXNpYmlsaXR5KCJkZWxldGVfdmVyc2lvbiIpOworCX0KKworCS8vIHB1YmxpYyBzdGF0aWMgTGlzdDxXZWJFbGVtZW50PiBnZXRGaWx0ZXJUaXRsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkvLworCS8vIHJldHVybgorCS8vIEdlbmVyYWxVSVV0aWxzLmdldEVlbGVtZW50c0J5Q2xhc3NOYW1lKCJpLXNkYy1kZXNpZ25lci1sZWZ0YmFyLXNlY3Rpb24tdGl0bGUtdGV4dCIpOworCS8vCisJLy8gfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVZlcnNpb25JblVJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJYWN0aW9uQnVpbGQoZGVsZXRlVmVyc2lvbigpKTsKKwkJZGVsZXRlVmVyc2lvbigpLmNsaWNrKCk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrT2tCdXR0b24oKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdXBsb2FkRmlsZVdpdGhKYXZhUm9ib3QoU3RyaW5nIEZpbGVQYXRoLCBTdHJpbmcgRmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdTZWxlY3Rpb24gc2VsID0gbmV3IFN0cmluZ1NlbGVjdGlvbihGaWxlUGF0aCArIEZpbGVOYW1lKTsKKwkJVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFN5c3RlbUNsaXBib2FyZCgpLnNldENvbnRlbnRzKHNlbCwgbnVsbCk7CisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKwkJUm9ib3Qgcm9ib3QgPSBuZXcgUm9ib3QoKTsKKwkJcm9ib3QuZGVsYXkoMTAwMCk7CisKKwkJLy8gUmVsZWFzZSBFbnRlcgorCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX0VOVEVSKTsKKworCQkvLyBQcmVzcyBDVFJMK1YKKwkJcm9ib3Qua2V5UHJlc3MoS2V5RXZlbnQuVktfQ09OVFJPTCk7CisJCXJvYm90LmtleVByZXNzKEtleUV2ZW50LlZLX1YpOworCisJCS8vIFJlbGVhc2UgQ1RSTCtWCisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfQ09OVFJPTCk7CisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfVik7CisJCVRocmVhZC5zbGVlcCgxMDAwKTsKKworCQkvLyBQcmVzcyBFbnRlcgorCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19FTlRFUik7CisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfRU5URVIpOworCQlUaHJlYWQuc2xlZXAoMzAwMCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0YWxvZ0ZpbHRlclR5cGVDaGVjQm94KFR5cGVzRW51bSBlbnVtdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBUeXBlID0gZW51bXR5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOworCQlnZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bXR5cGUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJcmV0dXJuIFR5cGU7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY2F0YWxvZ0ZpbHRlclN0YXR1c0NoZWNCb3goQ2hlY2tCb3hTdGF0dXNFbnVtIHN0YXR1c0VudW0pIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0PFN0cmluZz4gc3RhdHVzID0gbnVsbDsKKwkJc3dpdGNoIChzdGF0dXNFbnVtKSB7CisJCWNhc2UgSU5fREVTSUdOOgorCQkJc3RhdHVzID0gQXJyYXlzLmFzTGlzdCgiTk9UX0NFUlRJRklFRF9DSEVDS0lOIiwgIk5PVF9DRVJUSUZJRURfQ0hFQ0tPVVQiKTsKKwkJCWdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShzdGF0dXNFbnVtLmdldENhdGFsb2dWYWx1ZSgpKS5jbGljaygpOworCQkJYnJlYWs7CisJCWNhc2UgUkVBRFlfRk9SX1RFU1RJTkc6CisJCQlzdGF0dXMgPSBBcnJheXMuYXNMaXN0KCJSRUFEWV9GT1JfQ0VSVElGSUNBVElPTiIpOworCQkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHN0YXR1c0VudW0uZ2V0Q2F0YWxvZ1ZhbHVlKCkpLmNsaWNrKCk7CisJCQlicmVhazsKKwkJY2FzZSBJTl9URVNUSU5HOgorCQkJc3RhdHVzID0gQXJyYXlzLmFzTGlzdCgiQ0VSVElGSUNBVElPTl9JTl9QUk9HUkVTUyIpOworCQkJZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHN0YXR1c0VudW0uZ2V0Q2F0YWxvZ1ZhbHVlKCkpLmNsaWNrKCk7CisJCQlicmVhazsKKwkJY2FzZSBDRVJUSUZJRUQ6CisJCQlzdGF0dXMgPSBBcnJheXMuYXNMaXN0KCJDRVJUSUZJRUQiKTsKKwkJCWdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShzdGF0dXNFbnVtLmdldENhdGFsb2dWYWx1ZSgpKS5jbGljaygpOworCQkJYnJlYWs7CisJCWNhc2UgRElTVFJJQlVURUQ6CisJCQlzdGF0dXMgPSBBcnJheXMuYXNMaXN0KCJDRVJUSUZJRUQiKTsKKwkJCWdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShzdGF0dXNFbnVtLmdldENhdGFsb2dWYWx1ZSgpKS5jbGljaygpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tCcmVhZENydW1icyhCcmVhZENydW1ic0J1dHRvbnNFbnVtIGJ1dHRvbikgeworCQlzd2l0Y2ggKGJ1dHRvbikgeworCQljYXNlIENBVEFMT0c6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oYnV0dG9uLmdldEJ1dHRvbigpKS5jbGljaygpOworCQkJYnJlYWs7CisJCWNhc2UgSE9NRToKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihidXR0b24uZ2V0QnV0dG9uKCkpLmNsaWNrKCk7CisJCQlicmVhazsKKwkJY2FzZSBPTl9CT0FSRElORzoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbihidXR0b24uZ2V0QnV0dG9uKCkpLmNsaWNrKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrUHJpbnRTY3JlZW4oKSB7CisJCWdldEVlbGVtZW50QnlDbGFzc05hbWUoImUtc2RjLXNtYWxsLXByaW50LXNjcmVlbiIpLmNsaWNrKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNsaWNrU3VibWl0Rm9yVGVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCWdldFdlYkJ1dHRvbigic3VibWl0X2Zvcl90ZXN0aW5nIikuY2xpY2soKTsKKwkJV2ViRWxlbWVudCBjb21tZW50VGV4dCA9IGdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidy1zZGMtbW9kYWwtYm9keS1lbWFpbCIpKTsKKwkJY29tbWVudFRleHQuc2VuZEtleXMoIlN1Ym1pdCBGb3IgVGVzdCIpOworCQlzbGVlcCgzMDAwKTsKKwkJY2xpY2tPa0J1dHRvbigpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBob3Zlck9uQXJlYShTdHJpbmcgYXJlYUlkLCBXZWJEcml2ZXIgZHJpdmVyKSB7CisJCUFjdGlvbnMgYWN0aW9ucyA9IG5ldyBBY3Rpb25zKGRyaXZlcik7CisJCVdlYkVsZW1lbnQgYXJlYSA9IGdldFdlYkVsZW1lbnQoZHJpdmVyLCBhcmVhSWQpOworCQlhY3Rpb25zLm1vdmVUb0VsZW1lbnQoYXJlYSkucGVyZm9ybSgpOworCQlyZXR1cm4gYXJlYTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgbW92ZVRvTmV4dFN0ZXAoRGF0YVRlc3RJZEVudW0uU3RlcHNFbnVtIFN0ZXBuYW1lKSB7CisJCXJldHVybiBnZXRXZWJCdXR0b24oU3RlcG5hbWUuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VmVyc2lvbihTdHJpbmcgY29tcG9uZW50TmFtZSkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGNvbXBvbmVudE5hbWUgKyAiVmVyc2lvbiIpLmdldFRleHQoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tPbkhUTUxFbGVtZW50QnlEYXRhVGVzdElkKFN0cmluZyBkYXRhVGVzdElkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCksIDIwKTsKKwkJU3RvcFdhdGNoIHBlcmZvcm1hbmNlTWVzdXJpbmcgPSBuZXcgU3RvcFdhdGNoKCk7CisJCXBlcmZvcm1hbmNlTWVzdXJpbmcuc3RhcnQoKTsKKwkJV2ViRWxlbWVudCBlbGVtZW50ID0gd2FpdAorCQkJCS51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMuZWxlbWVudFRvQmVDbGlja2FibGUoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGRhdGFUZXN0SWQgKyAiJ10iKSkpOworCQlwZXJmb3JtYW5jZU1lc3VyaW5nLnN0b3AoKTsKKwkJZWxlbWVudC5jbGljaygpOworCQlwZXJmb3JtYW5jZU1lc3VyaW5nKGRhdGFUZXN0SWQsIHBlcmZvcm1hbmNlTWVzdXJpbmcpOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtYW5jZU1lc3VyaW5nKFN0cmluZyBkYXRhVGVzdElkLCBTdG9wV2F0Y2ggcGVyZm9ybWFuY2VNZXN1cmluZykgeworCQlSZXBvcnRlci5sb2coImNsaWNrIG9uOiAiICsgZGF0YVRlc3RJZCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xpY2sgb246ICIgKyBkYXRhVGVzdElkKTsKKwkJUmVwb3J0ZXIubG9nKCJUb3RhbCBMb2FkIFRpbWUgVW50aWwgY2xpY2sgb24gYnV0dG9uIDogIiArIGRhdGFUZXN0SWQgKyAiICIKKwkJCQkrICgoKGRvdWJsZSkgcGVyZm9ybWFuY2VNZXN1cmluZy5nZXRUaW1lKCkpIC8gMTAwMCkgKyAiIHNlY29uZHMiKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBMb2FkIFRpbWUgVW50aWwgY2xpY2sgb24gYnV0dG9uIDogIiArIGRhdGFUZXN0SWQgKyAiICIKKwkJCQkrICgoKGRvdWJsZSkgcGVyZm9ybWFuY2VNZXN1cmluZy5nZXRUaW1lKCkpIC8gMTAwMCkgKyAiIHNlY29uZHMiKTsKKwkJcGVyZm9ybWFuY2VNZXN1cmluZy5yZXNldCgpOworCQlwZXJmb3JtYW5jZU1lc3VyaW5nLnN0YXJ0KCk7CisJCUJvb2xlYW4gd2FpdEZvckVsZW1lbnRJblZpc2liaWxpdHlCeUNsYXNzTmFtZSA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50SW5WaXNpYmlsaXR5QnlDbGFzc05hbWUoZHJpdmVyLAorCQkJCSJ0bHYtbG9hZGVyIik7CisJCXBlcmZvcm1hbmNlTWVzdXJpbmcuc3RvcCgpOworCQlSZXBvcnRlci5sb2coIlRvdGFsIHRpbWUgYmVmb3JlIGxvYWRlciBkaXNhcHBlYXI6ICIgKyAoKChkb3VibGUpIHBlcmZvcm1hbmNlTWVzdXJpbmcuZ2V0VGltZSgpKSAvIDEwMDApCisJCQkJKyAiIHNlY29uZHMiKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCB0aW1lIGJlZm9yZSBsb2FkZXIgZGlzYXBwZWFyOiAiICsgKCgoZG91YmxlKSBwZXJmb3JtYW5jZU1lc3VyaW5nLmdldFRpbWUoKSkgLyAxMDAwKQorCQkJCSsgIiBzZWNvbmRzIik7CisJfQorCisJcHVibGljIHN0YXRpYyBCb29sZWFuIHdhaXRGb3JFbGVtZW50SW5WaXNpYmlsaXR5QnlDbGFzc05hbWUoV2ViRHJpdmVyIGRyaXZlciwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChkcml2ZXIsIDMwKTsKKwkJcmV0dXJuIHdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLmludmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkuY2xhc3NOYW1lKGNsYXNzTmFtZSkpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmluZENvbXBvbmVudEFuZENsaWNrKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJV2ViRWxlbWVudCBzZWFyY2hUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJtYWluLW1lbnUtaW5wdXQtc2VhcmNoIik7CisJCXNlYXJjaFRleHRib3guY2xlYXIoKTsKKwkJc2VhcmNoVGV4dGJveC5zZW5kS2V5cyhyZXNvdXJjZS5nZXROYW1lKCkpOworCQljbGlja09uSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tPbkhUTUxFbGVtZW50QnlsaW5rVGV4dChTdHJpbmcgbGlua1RleHQpIHRocm93cyBFeGNlcHRpb24geworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSwgMjApOworCQlTdG9wV2F0Y2ggcGVyZm9ybWFuY2VNZXN1cmluZyA9IG5ldyBTdG9wV2F0Y2goKTsKKwkJcGVyZm9ybWFuY2VNZXN1cmluZy5zdGFydCgpOworCQlXZWJFbGVtZW50IGVsZW1lbnQgPSB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy5lbGVtZW50VG9CZUNsaWNrYWJsZShCeS5saW5rVGV4dChsaW5rVGV4dCkpKTsKKwkJcGVyZm9ybWFuY2VNZXN1cmluZy5zdG9wKCk7CisJCWVsZW1lbnQuY2xpY2soKTsKKwkJcGVyZm9ybWFuY2VNZXN1cmluZyhsaW5rVGV4dCwgcGVyZm9ybWFuY2VNZXN1cmluZyk7CisJfQorCQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bHRpbWF0ZVdhaXQoKXsKKyAgICAJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsgICAgICAgICAgICAgICAgICAgIAorCisgICAgCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckFuZ3VsYXIoKTsKKwkJCisJCWxvbmcgZXN0aW1hdGVUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCWxvbmcgZHVyYXRpb24gPSBUaW1lVW5pdC5OQU5PU0VDT05EUy50b1NlY29uZHMoZXN0aW1hdGVUaW1lIC0gc3RhcnRUaW1lKTsKKwkJaWYoZHVyYXRpb24gPiB0aW1lT3V0KXsKKwkJCVNldHVwQ0RUZXN0LmdldEV4dGVuZFRlc3QoKS5sb2coTG9nU3RhdHVzLldBUk5JTkcsIFN0cmluZy5mb3JtYXQoIkRlbGF5cyBvbiBwYWdlLCAlZCBzZWNvbmRzIiwgZHVyYXRpb24pKTsKKwkJfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckFuZ3VsYXIoKXsKKyAgICAJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZ2V0RHJpdmVyKCksIDkwLCAxMDApOworICAgIAl3YWl0LnVudGlsKEFkZGl0aW9uYWxDb25kaXRpb25zLnBhZ2VMb2FkV2FpdCgpKTsKKyAgICAJd2FpdC51bnRpbChBZGRpdGlvbmFsQ29uZGl0aW9ucy5hbmd1bGFySGFzRmluaXNoZWRQcm9jZXNzaW5nKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvSW1wb3J0QXNzZXRVSVV0aWxzLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9JbXBvcnRBc3NldFVJVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE3YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvSW1wb3J0QXNzZXRVSVV0aWxzLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkNyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5CeTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkRyaXZlcjsKKworcHVibGljIGNsYXNzIEltcG9ydEFzc2V0VUlVdGlscyB7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0QXNzc2V0QW5kRmlsbEdlbmVyYWxJbmZvKFN0cmluZyBGSUxFX1BBVEgsIFN0cmluZyBmaWxlTmFtZSwKKwkJCVJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZURldGFpbHMsIFVzZXIgdXNlciwgQ3JlYXRlQW5kSW1wb3J0QnV0dG9uc0VudW0gdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlc291cmNlVUlVdGlscy5pbXBvcnRGaWxlV2l0aFNlbmRLZXkoRklMRV9QQVRILCBmaWxlTmFtZSwgdHlwZSk7CisJCVJlc291cmNlVUlVdGlscy5maWxsUmVzb3VyY2VHZW5lcmFsSW5mb3JtYXRpb25QYWdlKHJlc291cmNlRGV0YWlscywgdXNlcik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGltcG9ydEFzc3NldEZpbGxHZW5lcmFsSW5mb0FuZFNlbGVjdEljb24oU3RyaW5nIEZJTEVfUEFUSCwgU3RyaW5nIGZpbGVOYW1lLAorCQkJUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlRGV0YWlscywgVXNlciB1c2VyLCBDcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bSB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW1wb3J0QXNzc2V0QW5kRmlsbEdlbmVyYWxJbmZvKEZJTEVfUEFUSCwgZmlsZU5hbWUsIHJlc291cmNlRGV0YWlscywgdXNlciwgdHlwZSk7CisJCUdlbmVyYWxVSVV0aWxzLmNsaWNrQ3JlYXRlQnV0dG9uKCk7CisJCVJlc291cmNlVUlVdGlscy5zZWxlY3RSYW5kb21SZXNvdXJjZUljb24oKTsKKwl9CisKKwkvLyBjaGVja2luZyBvciB1bmNoZWNraW5nIHRoZSBjaGVja2JveCBvbiByaWdodCBwYWxldHRlIGF0IGRlc2lnbmVyCisJLy8gd29ya3NwYWNlCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrYm94KFN0cmluZyBjaGVja0JveG5hbWUsIFdlYkRyaXZlciBkcml2ZXIpIHsKKwkJZHJpdmVyLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvL2xhYmVsW0Bmb3I9JyIgKyBjaGVja0JveG5hbWUgKyAiJ10iKSkuY2xpY2soKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL09uYm9hcmRpbmdVdGlscy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvT25ib2FyZGluZ1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2YmFkYQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL09uYm9hcmRpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsNDU3IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkubWltZS5NdWx0aXBhcnRFbnRpdHlCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkubWltZS5jb250ZW50LkZpbGVCb2R5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50czsKK2ltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwSGVhZGVyRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zZXR1cC5TZXR1cENEVGVzdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworCitpbXBvcnQgY29tLnJlbGV2YW50Y29kZXMuZXh0ZW50cmVwb3J0cy5Mb2dTdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBPbmJvYXJkaW5nVXRpbHMgeworCisJcHVibGljIE9uYm9hcmRpbmdVdGlscygpIHsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdmVuZG9ySWQ7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHZlbmRvckxpY2Vuc2VOYW1lOworCXByaXZhdGUgc3RhdGljIFN0cmluZyB2ZW5kb3JMaWNlbnNlQWdyZWVtZW50SWQ7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZlYXR1cmVHcm91cElkOworCisJcHVibGljIGludCBjb3VudEZpbGVzSW5aaXBEaXJlY3RvcnkoU3RyaW5nIGZpbGVwYXRoLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24sIFRocm93YWJsZSB7CisJCVppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGVwYXRoICsgZmlsZW5hbWUpOworCQlyZXR1cm4gemlwRmlsZS5zaXplKCkgLSAxOworCX0KKworCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0WmlwRmlsZU5hbWVzRnJvbUZvbGRlcihTdHJpbmcgZmlsZXBhdGgpIHsKKwkJcmV0dXJuIEZpbGVIYW5kbGluZy5nZXRGaWxlTmFtZXNGcm9tRm9sZGVyKGZpbGVwYXRoLCAiLnppcCIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVZlbmRvclNvZnR3YXJlUHJvZHVjdChTdHJpbmcgSGVhdEZpbGVOYW1lLCBTdHJpbmcgZmlsZXBhdGgsIFVzZXIgdXNlcikKKwkJCXRocm93cyBFeGNlcHRpb24sIFRocm93YWJsZSB7CisJCVN0cmluZyB2c3BOYW1lID0gaGFuZGxlRmlsZW5hbWUoSGVhdEZpbGVOYW1lKTsKKwkJU2V0dXBDRFRlc3QuZ2V0RXh0ZW5kVGVzdCgpLmxvZyhMb2dTdGF0dXMuSU5GTywgIlN0YXJ0aW5nIHRvIGNyZWF0ZSB2ZW5kb3Igc29mdHdhcmUgcHJvZHVjdCIpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVOZXdWZW5kb3JTb2Z0d2FyZVByb2R1Y3QgPSBjcmVhdGVOZXdWZW5kb3JTb2Z0d2FyZVByb2R1Y3QodnNwTmFtZSwgdmVuZG9yTGljZW5zZU5hbWUsCisJCQkJdmVuZG9ySWQsIHZlbmRvckxpY2Vuc2VBZ3JlZW1lbnRJZCwgZmVhdHVyZUdyb3VwSWQsIHVzZXIpOworCQlhc3NlcnRFcXVhbHMoImRpZCBub3Qgc3VjY2VlZCB0byBjcmVhdGUgbmV3IFZTUCIsIDIwMCwKKwkJCQljcmVhdGVOZXdWZW5kb3JTb2Z0d2FyZVByb2R1Y3QuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCVN0cmluZyB2c3BpZCA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShjcmVhdGVOZXdWZW5kb3JTb2Z0d2FyZVByb2R1Y3QuZ2V0UmVzcG9uc2UoKSwgInZzcElkIik7CisKKwkJUmVzdFJlc3BvbnNlIHVwbG9hZEhlYXRQYWNrYWdlID0gdXBsb2FkSGVhdFBhY2thZ2UoZmlsZXBhdGgsIEhlYXRGaWxlTmFtZSwgdnNwaWQsIHVzZXIpOworCQlhc3NlcnRFcXVhbHMoImRpZCBub3Qgc3VjY2VlZCB0byB1cGxvYWQgSEVBVCBwYWNrYWdlIiwgMjAwLCB1cGxvYWRIZWF0UGFja2FnZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlSZXN0UmVzcG9uc2UgY2hlY2tpbiA9IGNoZWNraW5WZW5kb3JTb2Z0d2FyZVByb2R1Y3QodnNwaWQsIHVzZXIpOworCQlhc3NlcnRFcXVhbHMoImRpZCBub3Qgc3VjY2VlZCB0byBjaGVja2luZyBuZXcgVlNQIiwgMjAwLCBjaGVja2luLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBzdWJtaXQgPSBzdWJtaXRWZW5kb3JTb2Z0d2FyZVByb2R1Y3QodnNwaWQsIHVzZXIpOworCQlhc3NlcnRFcXVhbHMoImRpZCBub3Qgc3VjY2VlZCB0byBzdWJtaXQgbmV3IFZTUCIsIDIwMCwgc3VibWl0LmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBjcmVhdGVQYWNrYWdlID0gY3JlYXRlUGFja2FnZU9mVmVuZG9yU29mdHdhcmVQcm9kdWN0KHZzcGlkLCB1c2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJkaWQgbm90IHN1Y2NlZWQgdG8gY3JlYXRlIHBhY2thZ2Ugb2YgbmV3IFZTUCAiLCAyMDAsIGNyZWF0ZVBhY2thZ2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJU2V0dXBDRFRlc3QuZ2V0RXh0ZW5kVGVzdCgpLmxvZyhMb2dTdGF0dXMuSU5GTywgIlN1Y2NlZWRlZCB0byBjcmVhdGUgdmVuZG9yIHNvZnR3YXJlIHByb2R1Y3QiKTsKKworCQlyZXR1cm4gdnNwTmFtZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGFuZGxlRmlsZW5hbWUoU3RyaW5nIGhlYXRGaWxlTmFtZSkgeworCQlmaW5hbCBTdHJpbmcgbmFtZVByZWZpeCA9ICJjaVZGT25ib2FyZGVkLSI7CisJCWZpbmFsIFN0cmluZyBuYW1lU3VmZml4ID0gIi0iICsgZ2V0U2hvcnRVVUlEKCk7CisKKwkJU3RyaW5nIHN1YkhlYXRGaWxlTmFtZSA9IGhlYXRGaWxlTmFtZS5zdWJzdHJpbmcoMCwgaGVhdEZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIikpOworCisJCWlmICgobmFtZVByZWZpeCArIHN1YkhlYXRGaWxlTmFtZSArIG5hbWVTdWZmaXgpLmxlbmd0aCgpID49IDUwKSB7CisJCQlzdWJIZWF0RmlsZU5hbWUgPSBzdWJIZWF0RmlsZU5hbWUuc3Vic3RyaW5nKDAsIDUwIC0gbmFtZVByZWZpeC5sZW5ndGgoKSAtIG5hbWVTdWZmaXgubGVuZ3RoKCkpOworCQl9CisKKwkJaWYgKHN1YkhlYXRGaWxlTmFtZS5jb250YWlucygiKCIpIHx8IHN1YkhlYXRGaWxlTmFtZS5jb250YWlucygiKSIpKSB7CisJCQlzdWJIZWF0RmlsZU5hbWUgPSBzdWJIZWF0RmlsZU5hbWUucmVwbGFjZSgiKCIsICItIik7CisJCQlzdWJIZWF0RmlsZU5hbWUgPSBzdWJIZWF0RmlsZU5hbWUucmVwbGFjZSgiKSIsICItIik7CisJCX0KKworCQlTdHJpbmcgdm5mTmFtZSA9IG5hbWVQcmVmaXggKyBzdWJIZWF0RmlsZU5hbWUgKyBuYW1lU3VmZml4OworCQlyZXR1cm4gdm5mTmFtZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVmVuZG9yTGljZW5zZShVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCAiU3RhcnRpbmcgdG8gY3JlYXRlIHZlbmRvciBsaWNlbnNlIik7CisJCXZlbmRvckxpY2Vuc2VOYW1lID0gImNpTGljZW5zZSIgKyBnZXRTaG9ydFVVSUQoKTsKKwkJUmVzdFJlc3BvbnNlIHZlbmRvckxpY2Vuc2VSZXNwb25zZSA9IGNyZWF0ZVZlbmRvckxpY2Vuc2VNb2RlbHNfMSh2ZW5kb3JMaWNlbnNlTmFtZSwgdXNlcik7CisJCWFzc2VydEVxdWFscygiZGlkIG5vdCBzdWNjZWVkIHRvIGNyZWF0ZSB2ZW5kb3IgbGljZW5zZSBtb2RlbCIsIDIwMCwKKwkJCQl2ZW5kb3JMaWNlbnNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXZlbmRvcklkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHZlbmRvckxpY2Vuc2VSZXNwb25zZS5nZXRSZXNwb25zZSgpLCAidmFsdWUiKTsKKworCQlSZXN0UmVzcG9uc2UgdmVuZG9yS2V5R3JvdXBzUmVzcG9uc2UgPSBjcmVhdGVWZW5kb3JLZXlHcm91cHNfMih2ZW5kb3JJZCwgdXNlcik7CisJCWFzc2VydEVxdWFscygiZGlkIG5vdCBzdWNjZWVkIHRvIGNyZWF0ZSB2ZW5kb3Iga2V5IGdyb3VwcyIsIDIwMCwKKwkJCQl2ZW5kb3JLZXlHcm91cHNSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nIGtleUdyb3VwSWQgPSBSZXNwb25zZVBhcnNlci5nZXRWYWx1ZUZyb21Kc29uUmVzcG9uc2UodmVuZG9yS2V5R3JvdXBzUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSwgInZhbHVlIik7CisKKwkJUmVzdFJlc3BvbnNlIHZlbmRvckVudGl0bGVtZW50UG9vbCA9IGNyZWF0ZVZlbmRvckVudGl0bGVtZW50UG9vbF8zKHZlbmRvcklkLCB1c2VyKTsKKwkJYXNzZXJ0RXF1YWxzKCJkaWQgbm90IHN1Y2NlZWQgdG8gY3JlYXRlIHZlbmRvciBlbnRpdGxlbWVudCBwb29sIiwgMjAwLAorCQkJCXZlbmRvckVudGl0bGVtZW50UG9vbC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJU3RyaW5nIGVudGl0bGVtZW50UG9vbElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHZlbmRvckVudGl0bGVtZW50UG9vbC5nZXRSZXNwb25zZSgpLAorCQkJCSJ2YWx1ZSIpOworCisJCVJlc3RSZXNwb25zZSB2ZW5kb3JMaWNlbnNlRmVhdHVyZUdyb3VwcyA9IGNyZWF0ZVZlbmRvckxpY2Vuc2VGZWF0dXJlR3JvdXBzXzQodmVuZG9ySWQsIGtleUdyb3VwSWQsCisJCQkJZW50aXRsZW1lbnRQb29sSWQsIHVzZXIpOworCQlhc3NlcnRFcXVhbHMoImRpZCBub3Qgc3VjY2VlZCB0byBjcmVhdGUgdmVuZG9yIGxpY2Vuc2UgZmVhdHVyZSBncm91cHMiLCAyMDAsCisJCQkJdmVuZG9yTGljZW5zZUZlYXR1cmVHcm91cHMuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCWZlYXR1cmVHcm91cElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHZlbmRvckxpY2Vuc2VGZWF0dXJlR3JvdXBzLmdldFJlc3BvbnNlKCksICJ2YWx1ZSIpOworCisJCVJlc3RSZXNwb25zZSB2ZW5kb3JMaWNlbnNlQWdyZWVtZW50ID0gY3JlYXRlVmVuZG9yTGljZW5zZUFncmVlbWVudF81KHZlbmRvcklkLCBmZWF0dXJlR3JvdXBJZCwgdXNlcik7CisJCWFzc2VydEVxdWFscygiZGlkIG5vdCBzdWNjZWVkIHRvIGNyZWF0ZSB2ZW5kb3IgbGljZW5zZSBhZ3JlZW1lbnQiLCAyMDAsCisJCQkJdmVuZG9yTGljZW5zZUFncmVlbWVudC5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKwkJdmVuZG9yTGljZW5zZUFncmVlbWVudElkID0gUmVzcG9uc2VQYXJzZXIuZ2V0VmFsdWVGcm9tSnNvblJlc3BvbnNlKHZlbmRvckxpY2Vuc2VBZ3JlZW1lbnQuZ2V0UmVzcG9uc2UoKSwKKwkJCQkidmFsdWUiKTsKKworCQlSZXN0UmVzcG9uc2UgY2hlY2tpblZlbmRvckxpY2Vuc2UgPSBjaGVja2luVmVuZG9yTGljZW5zZSh2ZW5kb3JJZCwgdXNlcik7CisJCWFzc2VydEVxdWFscygiZGlkIG5vdCBzdWNjZWVkIHRvIGNoZWNraW4gdmVuZG9yIGxpY2Vuc2UiLCAyMDAsIGNoZWNraW5WZW5kb3JMaWNlbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkpOworCisJCVJlc3RSZXNwb25zZSBzdWJtaXRWZW5kb3JMaWNlbnNlID0gc3VibWl0VmVuZG9yTGljZW5zZSh2ZW5kb3JJZCwgdXNlcik7CisJCWFzc2VydEVxdWFscygiZGlkIG5vdCBzdWNjZWVkIHRvIHN1Ym1pdCB2ZW5kb3IgbGljZW5zZSIsIDIwMCwgc3VibWl0VmVuZG9yTGljZW5zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpKTsKKworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCAiU3VjY2VlZGVkIHRvIGNyZWF0ZSB2ZW5kb3IgbGljZW5zZSIpOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaG9ydFVVSUQoKSB7CisJCXJldHVybiBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpLnNwbGl0KCItIilbMF07CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGFjdGlvbk9uQ29tcG9uZW50KFN0cmluZyB2c3BpZCwgU3RyaW5nIGFjdGlvbiwgU3RyaW5nIG9uYm9hcmRDb21wb25lbnQsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoImh0dHA6Ly8lczolcy9vbmJvYXJkaW5nLWFwaS92MS4wLyIgKyBvbmJvYXJkQ29tcG9uZW50ICsgIi8lcy9hY3Rpb25zIiwgY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgdnNwaWQpOworCQlTdHJpbmcgdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKworCQlKU09OT2JqZWN0IGpPYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0LnB1dCgiYWN0aW9uIiwgYWN0aW9uKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFB1dCh1cmwsIGpPYmplY3QudG9TdHJpbmcoKSwgaGVhZGVyc01hcCk7CisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgY2hlY2tpblZlbmRvckxpY2Vuc2UoU3RyaW5nIHZzcGlkLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gYWN0aW9uT25Db21wb25lbnQodnNwaWQsICJDaGVja2luIiwgInZlbmRvci1saWNlbnNlLW1vZGVscyIsIHVzZXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBzdWJtaXRWZW5kb3JMaWNlbnNlKFN0cmluZyB2c3BpZCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGFjdGlvbk9uQ29tcG9uZW50KHZzcGlkLCAiU3VibWl0IiwgInZlbmRvci1saWNlbnNlLW1vZGVscyIsIHVzZXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVWZW5kb3JMaWNlbnNlTW9kZWxzXzEoU3RyaW5nIG5hbWUsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoImh0dHA6Ly8lczolcy9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1saWNlbnNlLW1vZGVscyIsIGNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCkpOworCQlTdHJpbmcgdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKwkJSlNPTk9iamVjdCBqT2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKwkJak9iamVjdC5wdXQoInZlbmRvck5hbWUiLCBuYW1lKTsKKwkJak9iamVjdC5wdXQoImRlc2NyaXB0aW9uIiwgIm5ldyB2ZW5kb3IgbGljZW5zZSBtb2RlbCIpOworCQlqT2JqZWN0LnB1dCgiaWNvblJlZiIsICJpY29uIik7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRQb3N0KHVybCwgak9iamVjdC50b1N0cmluZygpLCBoZWFkZXJzTWFwKTsKKwkJcmV0dXJuIHJlc3BvbnNlOworCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZVZlbmRvckxpY2Vuc2VBZ3JlZW1lbnRfNShTdHJpbmcgdnNwaWQsIFN0cmluZyBmZWF0dXJlR3JvdXBJZCwgVXNlciB1c2VyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoImh0dHA6Ly8lczolcy9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1saWNlbnNlLW1vZGVscy8lcy9saWNlbnNlLWFncmVlbWVudHMiLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHZzcGlkKTsKKworCQlTdHJpbmcgdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKworCQlKU09OT2JqZWN0IGxpY2Vuc2VUZXJtcE9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWxpY2Vuc2VUZXJtcE9iamVjdC5wdXQoImNob2ljZSIsICJGaXhlZF9UZXJtIik7CisJCWxpY2Vuc2VUZXJtcE9iamVjdC5wdXQoIm90aGVyIiwgIiIpOworCisJCUpTT05PYmplY3Qgak9iamVjdEJvZHkgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0Qm9keS5wdXQoIm5hbWUiLCAiYWJjIik7CisJCWpPYmplY3RCb2R5LnB1dCgiZGVzY3JpcHRpb24iLCAibmV3IHZlbmRvciBsaWNlbnNlIGFncmVlbWVudCIpOworCQlqT2JqZWN0Qm9keS5wdXQoInJlcXVpcmVtZW50c0FuZENvbnN0cmFpbnMiLCAiYWJjIik7CisJCWpPYmplY3RCb2R5LnB1dCgibGljZW5zZVRlcm0iLCBsaWNlbnNlVGVybXBPYmplY3QpOworCQlqT2JqZWN0Qm9keS5wdXQoImFkZGVkRmVhdHVyZUdyb3Vwc0lkcyIsIEFycmF5cy5hc0xpc3QoZmVhdHVyZUdyb3VwSWQpLnRvQXJyYXkoKSk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlcklkKTsKKworCQlIdHRwUmVxdWVzdCBodHRwID0gbmV3IEh0dHBSZXF1ZXN0KCk7CisJCVJlc3RSZXNwb25zZSByZXNwb25zZSA9IGh0dHAuaHR0cFNlbmRQb3N0KHVybCwgak9iamVjdEJvZHkudG9TdHJpbmcoKSwgaGVhZGVyc01hcCk7CisJCXJldHVybiByZXNwb25zZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlVmVuZG9yTGljZW5zZUZlYXR1cmVHcm91cHNfNChTdHJpbmcgdnNwaWQsIFN0cmluZyBsaWNlbnNlS2V5R3JvdXBJZCwKKwkJCVN0cmluZyBlbnRpdGxlbWVudFBvb2xJZCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdCgiaHR0cDovLyVzOiVzL29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLWxpY2Vuc2UtbW9kZWxzLyVzL2ZlYXR1cmUtZ3JvdXBzIiwKKwkJCQljb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCB2c3BpZCk7CisKKwkJU3RyaW5nIHVzZXJJZCA9IHVzZXIuZ2V0VXNlcklkKCk7CisKKwkJSlNPTk9iamVjdCBqT2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKwkJak9iamVjdC5wdXQoIm5hbWUiLCAieHl6Iik7CisJCWpPYmplY3QucHV0KCJkZXNjcmlwdGlvbiIsICJuZXcgdmVuZG9yIGxpY2Vuc2UgZmVhdHVyZSBncm91cHMiKTsKKwkJak9iamVjdC5wdXQoInBhcnROdW1iZXIiLCAiMTIzYWJjNDU2Iik7CisJCWpPYmplY3QucHV0KCJhZGRlZExpY2Vuc2VLZXlHcm91cHNJZHMiLCBBcnJheXMuYXNMaXN0KGxpY2Vuc2VLZXlHcm91cElkKS50b0FycmF5KCkpOworCQlqT2JqZWN0LnB1dCgiYWRkZWRFbnRpdGxlbWVudFBvb2xzSWRzIiwgQXJyYXlzLmFzTGlzdChlbnRpdGxlbWVudFBvb2xJZCkudG9BcnJheSgpKTsKKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBwcmVwYXJlSGVhZGVyc01hcCh1c2VySWQpOworCisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKwkJUmVzdFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cC5odHRwU2VuZFBvc3QodXJsLCBqT2JqZWN0LnRvU3RyaW5nKCksIGhlYWRlcnNNYXApOworCQlyZXR1cm4gcmVzcG9uc2U7CisKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlVmVuZG9yRW50aXRsZW1lbnRQb29sXzMoU3RyaW5nIHZzcGlkLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlDb25maWcgY29uZmlnID0gVXRpbHMuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB1cmwgPSBTdHJpbmcuZm9ybWF0KCJodHRwOi8vJXM6JXMvb25ib2FyZGluZy1hcGkvdjEuMC92ZW5kb3ItbGljZW5zZS1tb2RlbHMvJXMvZW50aXRsZW1lbnQtcG9vbHMiLAorCQkJCWNvbmZpZy5nZXRDYXRhbG9nQmVIb3N0KCksIGNvbmZpZy5nZXRDYXRhbG9nQmVQb3J0KCksIHZzcGlkKTsKKworCQlTdHJpbmcgdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKKworCQlKU09OT2JqZWN0IGpFbnRpdGxlbWVudE1ldHJpY09iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWpFbnRpdGxlbWVudE1ldHJpY09iamVjdC5wdXQoImNob2ljZSIsICJDUFUiKTsKKwkJakVudGl0bGVtZW50TWV0cmljT2JqZWN0LnB1dCgib3RoZXIiLCAiIik7CisKKwkJSlNPTk9iamVjdCBqQWdncmVnYXRpb25GdW5jdGlvbk9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWpBZ2dyZWdhdGlvbkZ1bmN0aW9uT2JqZWN0LnB1dCgiY2hvaWNlIiwgIlBlYWsiKTsKKwkJakFnZ3JlZ2F0aW9uRnVuY3Rpb25PYmplY3QucHV0KCJvdGhlciIsICIiKTsKKworCQlKU09OT2JqZWN0IGpPcGVyYXRpb25hbFNjb3BlID0gbmV3IEpTT05PYmplY3QoKTsKKwkJak9wZXJhdGlvbmFsU2NvcGUucHV0KCJjaG9pY2VzIiwgQXJyYXlzLmFzTGlzdCgiQXZhaWxhYmlsaXR5X1pvbmUiKS50b0FycmF5KCkpOworCQlqT3BlcmF0aW9uYWxTY29wZS5wdXQoIm90aGVyIiwgIiIpOworCisJCUpTT05PYmplY3QgalRpbWVPYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqVGltZU9iamVjdC5wdXQoImNob2ljZSIsICJIb3VyIik7CisJCWpUaW1lT2JqZWN0LnB1dCgib3RoZXIiLCAiIik7CisKKwkJSlNPTk9iamVjdCBqT2JqZWN0Qm9keSA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWpPYmplY3RCb2R5LnB1dCgibmFtZSIsICJkZWYiKTsKKwkJak9iamVjdEJvZHkucHV0KCJkZXNjcmlwdGlvbiIsICJuZXcgdmVuZG9yIGxpY2Vuc2UgZW50aXRsZW1lbnQgcG9vbCIpOworCQlqT2JqZWN0Qm9keS5wdXQoInRocmVzaG9sZFZhbHVlIiwgIjIzIik7CisJCWpPYmplY3RCb2R5LnB1dCgidGhyZXNob2xkVW5pdHMiLCAiQWJzb2x1dGUiKTsKKwkJak9iamVjdEJvZHkucHV0KCJlbnRpdGxlbWVudE1ldHJpYyIsIGpFbnRpdGxlbWVudE1ldHJpY09iamVjdCk7CisJCWpPYmplY3RCb2R5LnB1dCgiaW5jcmVtZW50cyIsICJhYmNkIik7CisJCWpPYmplY3RCb2R5LnB1dCgiYWdncmVnYXRpb25GdW5jdGlvbiIsIGpBZ2dyZWdhdGlvbkZ1bmN0aW9uT2JqZWN0KTsKKwkJak9iamVjdEJvZHkucHV0KCJvcGVyYXRpb25hbFNjb3BlIiwgak9wZXJhdGlvbmFsU2NvcGUpOworCQlqT2JqZWN0Qm9keS5wdXQoInRpbWUiLCBqVGltZU9iamVjdCk7CisJCWpPYmplY3RCb2R5LnB1dCgibWFudWZhY3R1cmVyUmVmZXJlbmNlTnVtYmVyIiwgIjEyM2FhYSIpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGpPYmplY3RCb2R5LnRvU3RyaW5nKCksIGhlYWRlcnNNYXApOworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZVZlbmRvcktleUdyb3Vwc18yKFN0cmluZyB2c3BpZCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgdXJsID0gU3RyaW5nLmZvcm1hdCgiaHR0cDovLyVzOiVzL29uYm9hcmRpbmctYXBpL3YxLjAvdmVuZG9yLWxpY2Vuc2UtbW9kZWxzLyVzL2xpY2Vuc2Uta2V5LWdyb3VwcyIsCisJCQkJY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSwgdnNwaWQpOworCisJCVN0cmluZyB1c2VySWQgPSB1c2VyLmdldFVzZXJJZCgpOworCisJCUpTT05PYmplY3Qgak9wZXJhdGlvbmFsU2NvcGUgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT3BlcmF0aW9uYWxTY29wZS5wdXQoImNob2ljZXMiLCBBcnJheXMuYXNMaXN0KCJUZW5hbnQiKS50b0FycmF5KCkpOworCQlqT3BlcmF0aW9uYWxTY29wZS5wdXQoIm90aGVyIiwgIiIpOworCisJCUpTT05PYmplY3Qgak9iamVjdEJvZHkgPSBuZXcgSlNPTk9iamVjdCgpOworCQlqT2JqZWN0Qm9keS5wdXQoIm5hbWUiLCAia2V5R3JvdXAiKTsKKwkJak9iamVjdEJvZHkucHV0KCJkZXNjcmlwdGlvbiIsICJuZXcgdmVuZG9yIGxpY2Vuc2Uga2V5IGdyb3VwIik7CisJCWpPYmplY3RCb2R5LnB1dCgib3BlcmF0aW9uYWxTY29wZSIsIGpPcGVyYXRpb25hbFNjb3BlKTsKKwkJak9iamVjdEJvZHkucHV0KCJ0eXBlIiwgIlVuaXZlcnNhbCIpOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisKKwkJSHR0cFJlcXVlc3QgaHR0cCA9IG5ldyBIdHRwUmVxdWVzdCgpOworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGpPYmplY3RCb2R5LnRvU3RyaW5nKCksIGhlYWRlcnNNYXApOworCQlyZXR1cm4gcmVzcG9uc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUmVzdFJlc3BvbnNlIGNyZWF0ZU5ld1ZlbmRvclNvZnR3YXJlUHJvZHVjdChTdHJpbmcgbmFtZSwgU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZW5kb3JJZCwKKwkJCVN0cmluZyBsaWNlbnNlQWdyZWVtZW50SWQsIFN0cmluZyBmZWF0dXJlR3JvdXBzSWQsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBVdGlscy5nZXRDb25maWcoKTsKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoImh0dHA6Ly8lczolcy9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cyIsCisJCQkJY29uZmlnLmdldENhdGFsb2dCZUhvc3QoKSwgY29uZmlnLmdldENhdGFsb2dCZVBvcnQoKSk7CisKKwkJU3RyaW5nIHVzZXJJZCA9IHVzZXIuZ2V0VXNlcklkKCk7CisKKwkJSlNPTk9iamVjdCBqbGljZW5zaW5nRGF0YU9iaiA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWpsaWNlbnNpbmdEYXRhT2JqLnB1dCgibGljZW5zZUFncmVlbWVudCIsIGxpY2Vuc2VBZ3JlZW1lbnRJZCk7CisJCWpsaWNlbnNpbmdEYXRhT2JqLnB1dCgiZmVhdHVyZUdyb3VwcyIsIEFycmF5cy5hc0xpc3QoZmVhdHVyZUdyb3Vwc0lkKS50b0FycmF5KCkpOworCisJCUpTT05PYmplY3Qgak9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisJCWpPYmplY3QucHV0KCJuYW1lIiwgbmFtZSk7CisJCWpPYmplY3QucHV0KCJkZXNjcmlwdGlvbiIsICJuZXcgVlNQIGRlc2NyaXB0aW9uIik7CisJCWpPYmplY3QucHV0KCJjYXRlZ29yeSIsICJyZXNvdXJjZU5ld0NhdGVnb3J5LmdlbmVyaWMiKTsKKwkJak9iamVjdC5wdXQoInN1YkNhdGVnb3J5IiwgInJlc291cmNlTmV3Q2F0ZWdvcnkuZ2VuZXJpYy5kYXRhYmFzZSIpOworCQlqT2JqZWN0LnB1dCgibGljZW5zaW5nVmVyc2lvbiIsICIxLjAiKTsKKwkJak9iamVjdC5wdXQoInZlbmRvck5hbWUiLCB2ZW5kb3JOYW1lKTsKKwkJak9iamVjdC5wdXQoInZlbmRvcklkIiwgdmVuZG9ySWQpOworCQlqT2JqZWN0LnB1dCgiaWNvbiIsICJpY29uIik7CisJCWpPYmplY3QucHV0KCJsaWNlbnNpbmdEYXRhIiwgamxpY2Vuc2luZ0RhdGFPYmopOworCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc01hcCA9IHByZXBhcmVIZWFkZXJzTWFwKHVzZXJJZCk7CisJCUh0dHBSZXF1ZXN0IGh0dHAgPSBuZXcgSHR0cFJlcXVlc3QoKTsKKworCQlSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwLmh0dHBTZW5kUG9zdCh1cmwsIGpPYmplY3QudG9TdHJpbmcoKSwgaGVhZGVyc01hcCk7CisKKwkJcmV0dXJuIHJlc3BvbnNlOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSB1cGxvYWRIZWF0UGFja2FnZShTdHJpbmcgZmlsZXBhdGgsIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHZzcGlkLCBVc2VyIHVzZXIpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlDbG9zZWFibGVIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisJCU11bHRpcGFydEVudGl0eUJ1aWxkZXIgbXBCdWlsZGVyID0gTXVsdGlwYXJ0RW50aXR5QnVpbGRlci5jcmVhdGUoKTsKKwkJbXBCdWlsZGVyLmFkZFBhcnQoInVwbG9hZCIsIG5ldyBGaWxlQm9keShnZXRUZXN0WmlwRmlsZShmaWxlcGF0aCwgZmlsZW5hbWUpKSk7CisKKwkJU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoImh0dHA6Ly8lczolcy9vbmJvYXJkaW5nLWFwaS92MS4wL3ZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cy8lcy91cGxvYWQiLCBjb25maWcuZ2V0Q2F0YWxvZ0JlSG9zdCgpLCBjb25maWcuZ2V0Q2F0YWxvZ0JlUG9ydCgpLCB2c3BpZCk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzTWFwID0gcHJlcGFyZUhlYWRlcnNNYXAodXNlci5nZXRVc2VySWQoKSk7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkNPTlRFTlRfVFlQRS5nZXRWYWx1ZSgpLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpOworCisJCUNsb3NlYWJsZUh0dHBDbGllbnQgY2xpZW50ID0gSHR0cENsaWVudHMuY3JlYXRlRGVmYXVsdCgpOworCQl0cnkgeworCQkJSHR0cFBvc3QgaHR0cFBvc3QgPSBuZXcgSHR0cFBvc3QodXJsKTsKKwkJCVJlc3RSZXNwb25zZSByZXN0UmVzcG9uc2UgPSBuZXcgUmVzdFJlc3BvbnNlKCk7CisKKwkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBoZWFkZXJzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJU3RyaW5nIGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBoZWFkZXJzTWFwLmdldChrZXkpOworCQkJCWh0dHBQb3N0LmFkZEhlYWRlcihrZXksIHZhbHVlKTsKKwkJCX0KKwkJCWh0dHBQb3N0LnNldEVudGl0eShtcEJ1aWxkZXIuYnVpbGQoKSk7CisJCQlyZXNwb25zZSA9IGNsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKwkJCUh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisJCQlTdHJpbmcgcmVzcG9uc2VCb2R5ID0gbnVsbDsKKwkJCWlmIChlbnRpdHkgIT0gbnVsbCkgeworCQkJCUlucHV0U3RyZWFtIGluc3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKKwkJCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJCUlPVXRpbHMuY29weShpbnN0cmVhbSwgd3JpdGVyKTsKKwkJCQlyZXNwb25zZUJvZHkgPSB3cml0ZXIudG9TdHJpbmcoKTsKKwkJCQl0cnkgeworCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaW5zdHJlYW0uY2xvc2UoKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlc3RSZXNwb25zZS5zZXRFcnJvckNvZGUocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSk7CisJCQlyZXN0UmVzcG9uc2Uuc2V0UmVzcG9uc2UocmVzcG9uc2VCb2R5KTsKKworCQkJcmV0dXJuIHJlc3RSZXNwb25zZTsKKworCQl9IGZpbmFsbHkgeworCQkJY2xvc2VSZXNwb25zZShyZXNwb25zZSk7CisJCQljbG9zZUh0dHBDbGllbnQoY2xpZW50KTsKKworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZVJlc3BvbnNlKENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZSkgeworCQl0cnkgeworCQkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQlyZXNwb25zZS5jbG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiZmFpbGVkIHRvIGNsb3NlIGNsaWVudCBvciByZXNwb25zZTogJXMiLCBlLmdldE1lc3NhZ2UoKSkpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZUh0dHBDbGllbnQoQ2xvc2VhYmxlSHR0cENsaWVudCBjbGllbnQpIHsKKwkJdHJ5IHsKKwkJCWlmIChjbGllbnQgIT0gbnVsbCkgeworCQkJCWNsaWVudC5jbG9zZSgpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiZmFpbGVkIHRvIGNsb3NlIGNsaWVudCBvciByZXNwb25zZTogJXMiLCBlLmdldE1lc3NhZ2UoKSkpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRUZXN0WmlwRmlsZShTdHJpbmcgZmlsZXBhdGgsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IFV0aWxzLmdldENvbmZpZygpOworCQlTdHJpbmcgc291cmNlRGlyID0gY29uZmlnLmdldEltcG9ydFJlc291cmNlVGVzdHNDb25maWdEaXIoKTsKKwkJamF2YS5uaW8uZmlsZS5QYXRoIGZpbGVQYXRoID0gRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLmdldFBhdGgoZmlsZXBhdGggKyBGaWxlLnNlcGFyYXRvciArIGZpbGVuYW1lKTsKKwkJcmV0dXJuIGZpbGVQYXRoLnRvRmlsZSgpOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjaGVja2luVmVuZG9yU29mdHdhcmVQcm9kdWN0KFN0cmluZyB2c3BpZCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGFjdGlvbk9uQ29tcG9uZW50KHZzcGlkLCAiQ2hlY2tpbiIsICJ2ZW5kb3Itc29mdHdhcmUtcHJvZHVjdHMiLCB1c2VyKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBSZXN0UmVzcG9uc2Ugc3VibWl0VmVuZG9yU29mdHdhcmVQcm9kdWN0KFN0cmluZyB2c3BpZCwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGFjdGlvbk9uQ29tcG9uZW50KHZzcGlkLCAiU3VibWl0IiwgInZlbmRvci1zb2Z0d2FyZS1wcm9kdWN0cyIsIHVzZXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVQYWNrYWdlT2ZWZW5kb3JTb2Z0d2FyZVByb2R1Y3QoU3RyaW5nIHZzcGlkLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gYWN0aW9uT25Db21wb25lbnQodnNwaWQsICJDcmVhdGVfUGFja2FnZSIsICJ2ZW5kb3Itc29mdHdhcmUtcHJvZHVjdHMiLCB1c2VyKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJlcGFyZUhlYWRlcnNNYXAoU3RyaW5nIHVzZXJJZCkgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJaGVhZGVyc01hcC5wdXQoSHR0cEhlYWRlckVudW0uQ09OVEVOVF9UWVBFLmdldFZhbHVlKCksICJhcHBsaWNhdGlvbi9qc29uIik7CisJCWhlYWRlcnNNYXAucHV0KEh0dHBIZWFkZXJFbnVtLkFDQ0VQVC5nZXRWYWx1ZSgpLCAiYXBwbGljYXRpb24vanNvbiIpOworCQloZWFkZXJzTWFwLnB1dChIdHRwSGVhZGVyRW51bS5VU0VSX0lELmdldFZhbHVlKCksIHVzZXJJZCk7CisJCQorCQlyZXR1cm4gaGVhZGVyc01hcDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL1Byb3BlcnRpZXNVSVV0aWxzLmphdmEgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9Qcm9wZXJ0aWVzVUlVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjU2MzAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9Qcm9wZXJ0aWVzVUlVdGlscy5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qLQorICogPT09PT09PT09PT09TElDRU5TRV9TVEFSVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNEQworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBVCZUIEludGVsbGVjdHVhbCBQcm9wZXJ0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PUxJQ0VOU0VfRU5EPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlByb3BlcnR5SW5mbzsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5Qcm9wZXJ0aWVzUGFnZTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVUlVdGlscyB7CisKKwkvLyBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUHJvcGVydEJ5VHlwZShTdHJpbmcgdHlwZSxTdHJpbmcgbmFtZSxTdHJpbmcKKwkvLyBkZWZhdWx0VmFsdWUsU3RyaW5nIGRlc2NyaXB0aW9uKSB0aHJvd3MgRXhjZXB0aW9ueworCS8vCisJLy8gUmVzb3VyY2VVSVV0aWxzLmRlZmluZU5ld1NlbGVjdExpc3QodHlwZSk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLmRlZmluZVByb3BlcnR5TmFtZShuYW1lKTsKKwkvLyBSZXNvdXJjZVVJVXRpbHMuZGVmaW5lRGVmYXVsdFZhbHVlQnlUeXBlKGRlZmF1bHRWYWx1ZSk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLmRlZmluZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkvLyBUaHJlYWQuc2xlZXAoMjAwMCk7CisJLy8gUmVzb3VyY2VVSVV0aWxzLmNsaWNrQnV0dG9uKCJBZGQiKTsKKwkvLyB9CisJcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZFByb3BlcnRpZXMoU3RyaW5nIG5hbWUsIFN0cmluZyBpdGVtVHlwZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHNjaGVtYVR5cGUpIHRocm93cyBFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5dmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJCUdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoaXRlbVR5cGUsICJwcm9wZXJ0eVR5cGUiKTsKKwkJUmVzb3VyY2VVSVV0aWxzLmRlZmluZVByb3BlcnR5TmFtZShuYW1lKTsKKwkJaWYgKGl0ZW1UeXBlID09ICJib29sZWFuIikgeworCQkJUmVzb3VyY2VVSVV0aWxzLmRlZmluZUJvb2xlbkRlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOworCQkJR2VuZXJhbFVJVXRpbHMuZGVmaW5lRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQkJVGhyZWFkLnNsZWVwKDIwMDApOworCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJBZGQiKS5jbGljaygpOworCQkJOworCQl9IGVsc2UgaWYgKGl0ZW1UeXBlID09ICJsaXN0IiB8fCBpdGVtVHlwZSA9PSAibWFwIikgeworCQkJR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdChzY2hlbWFUeXBlLCAic2NoZW1hVHlwZSIpOworCQl9CisJCWlmICghKGl0ZW1UeXBlID09ICJib29sZWFuIikpIHsKKwkJCVJlc291cmNlVUlVdGlscy5kZWZpbmVEZWZhdWx0VmFsdWVCeVR5cGUoZGVmYXVsdFZhbHVlKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmRlZmluZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigiQWRkIikuY2xpY2soKTsKKwkJCTsKKwkJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJfQorCQlwcm9wZXJ0eXZhbHVlcy5wdXQoInR5cGUiLCBpdGVtVHlwZSk7CisJCXByb3BlcnR5dmFsdWVzLnB1dCgiZGVmYXVsdFZhbHVlIiwgZGVmYXVsdFZhbHVlKTsKKwkJcHJvcGVydHl2YWx1ZXMucHV0KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJcHJvcGVydHl2YWx1ZXMucHV0KCJuYW1lIiwgbmFtZSk7CisKKwkJcmV0dXJuIHByb3BlcnR5dmFsdWVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2bGlkYXRlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5VmFsdWVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlXZWJFbGVtZW50IG5hbWUgPSBHZW5lcmFsVUlVdGlscworCQkJCS5hY3Rpb25CdWlsZChHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUocHJvcGVydHlWYWx1ZXMuZ2V0KCJuYW1lIikpKTsKKwkJbmFtZS5nZXRUZXh0KCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eVZhbHVlcy5nZXQoIm5hbWUiKSk7CisJCVdlYkVsZW1lbnQgZGVmYXVsdFZhbHVlID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuYWN0aW9uQnVpbGQoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHByb3BlcnR5VmFsdWVzLmdldCgibmFtZSIpKSk7CisJCWRlZmF1bHRWYWx1ZS5nZXRUZXh0KCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eVZhbHVlcy5nZXQoImRlZmF1bHRWYWx1ZSIpKTsKKwkJV2ViRWxlbWVudCB0eXBlID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuYWN0aW9uQnVpbGQoR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKHByb3BlcnR5VmFsdWVzLmdldCgidHlwZSIpKSk7CisJCXR5cGUuZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlWYWx1ZXMuZ2V0KCJ0eXBlIikpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROZXdQcm9wZXJ0eShQcm9wZXJ0eUluZm8gcHJvcGVydHkpIHsKKwkJUHJvcGVydGllc1BhZ2UuZ2V0UHJvcGVydHlQb3B1cCgpLmluc2VydFByb3BlcnR5TmFtZShwcm9wZXJ0eS5nZXROYW1lKCkpOworCQlQcm9wZXJ0aWVzUGFnZS5nZXRQcm9wZXJ0eVBvcHVwKCkuc2VsZWN0UHJvcGVydHlUeXBlKHByb3BlcnR5LmdldFR5cGUoKS5nZXRUeXBlKCkpOworCQlQcm9wZXJ0aWVzUGFnZS5nZXRQcm9wZXJ0eVBvcHVwKCkuaW5zZXJ0UHJvcGVydHlEZXNjcmlwdGlvbihwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpKTsKKwkJUHJvcGVydGllc1BhZ2UuZ2V0UHJvcGVydHlQb3B1cCgpLmluc2VydFByb3BlcnR5RGVmYXVsdFZhbHVlKHByb3BlcnR5LmdldFZhbHVlKCkpOworCisJCVByb3BlcnRpZXNQYWdlLmdldFByb3BlcnR5UG9wdXAoKS5jbGlja1NhdmUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL1Jlc291cmNlVUlVdGlscy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvUmVzb3VyY2VVSVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNzRjMQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdXRpbGl0aWVzL1Jlc291cmNlVUlVdGlscy5qYXZhCkBAIC0wLDAgKzEsODY0IEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbGl0aWVzOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuYXd0LkFXVEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuYmUubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuQ2hlY2tCb3hTdGF0dXNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5DcmVhdGVBbmRJbXBvcnRCdXR0b25zRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLkRhdGFUZXN0SWRFbnVtLkRhc2hib2FyZDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uU3RlcHNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZUNhdGVnb3JpZXNOYW1lRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5odHRwLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5wYWdlcy5SZXNvdXJjZUdlbmVyYWxQYWdlOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uQnk7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJEcml2ZXI7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5XZWJFbGVtZW50OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uaW50ZXJhY3Rpb25zLkFjdGlvbnM7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLkV4cGVjdGVkQ29uZGl0aW9uczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuU2VsZWN0OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5XZWJEcml2ZXJXYWl0OworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVVJVXRpbHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX05BTUVfUFJFRklYID0gIlJlc291cmNlQ0RUZXN0LSI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0JFRk9SRV9URVNUID0gdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX1ZFUlNJT04gPSAiMC4xIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JFU09VUkNFX05BTUUgPSAiY2FsbF9jb250cm9sbCI7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFRF9SRVNPVVJDRV9JQ09OX05BTUUgPSAib2JqZWN0U3RvcmFnZSI7CisKKwlwcml2YXRlIFJlc291cmNlVUlVdGlscygpIHsKKwl9CisKKwlzdGF0aWMgV2ViRHJpdmVyIGRyaXZlciA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpOworCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVJlc291cmNlTmFtZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKwkJV2ViRWxlbWVudCByZXNvdXJjZU5hbWVUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkubmFtZSgiY29tcG9uZW50TmFtZSIpKTsKKwkJcmVzb3VyY2VOYW1lVGV4dGJveC5jbGVhcigpOworCQlyZXNvdXJjZU5hbWVUZXh0Ym94LnNlbmRLZXlzKHJlc291cmNlTmFtZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVJlc291cmNlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgZGF0YXRlc3RzaWQpIHsKKworCQlHZW5lcmFsVUlVdGlscy5nZXRTZWxlY3RMaXN0KGNhdGVnb3J5LCBkYXRhdGVzdHNpZCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBpbXBvcnRGaWxlV2l0aFNlbmRLZXkoU3RyaW5nIEZpbGVQYXRoLCBTdHJpbmcgRmlsZU5hbWUsIENyZWF0ZUFuZEltcG9ydEJ1dHRvbnNFbnVtIHR5cGUpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJV2ViRWxlbWVudCBpbXBvcnRCdXR0b24gPSBHZW5lcmFsVUlVdGlscy5jcmVhdGVBbmRJbXBvcnRCdXR0b25zKHR5cGUsIGRyaXZlcikuZmluZEVsZW1lbnQoQnkudGFnTmFtZSgiaW5wdXQiKSk7CisJCWltcG9ydEJ1dHRvbi5zZW5kS2V5cyhGaWxlUGF0aCArIEZpbGVOYW1lKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0RmlsZVdpdGhTZW5kS2V5QnJvd3NlKFN0cmluZyBGaWxlUGF0aCwgU3RyaW5nIEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJV2ViRWxlbWVudCBicm93c2VidXR0b24gPSBHZW5lcmFsVUlVdGlscy53YWl0Rm9yQnJvd3NlQnV0dG9uKCJicm93c2VCdXR0b24iKTsKKwkJYnJvd3NlYnV0dG9uLnNlbmRLZXlzKEZpbGVQYXRoICsgRmlsZU5hbWUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmluZVVzZXJJZChTdHJpbmcgdXNlcklkKSB7CisJCVdlYkVsZW1lbnQgcmVzb3VyY2VVc2VySWRUZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjb250YWN0SWQiKTsKKwkJcmVzb3VyY2VVc2VySWRUZXh0Ym94LmNsZWFyKCk7CisJCXJlc291cmNlVXNlcklkVGV4dGJveC5zZW5kS2V5cyh1c2VySWQpOworCQlyZXR1cm4gdXNlcklkOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVWZW5kb3JSZWxlYXNlKFN0cmluZyByZXNvdXJjZVZlbmRvclJlbGVhc2UpIHsKKworCQlXZWJFbGVtZW50IHJlc291cmNlVmVuZG9yUmVsZWFzZVRleHRib3ggPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInZlbmRvclJlbGVhc2UiKTsKKwkJcmVzb3VyY2VWZW5kb3JSZWxlYXNlVGV4dGJveC5jbGVhcigpOworCQlyZXNvdXJjZVZlbmRvclJlbGVhc2VUZXh0Ym94LnNlbmRLZXlzKHJlc291cmNlVmVuZG9yUmVsZWFzZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdFJlc291cmNlSWNvbihTdHJpbmcgcmVzb3VyY2VJY29uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCksIDEwKTsKKwkJd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMuZWxlbWVudFRvQmVDbGlja2FibGUoQnkueHBhdGgoIi8vZGl2W0BkYXRhLXRlc3RzLWlkPSciICsgcmVzb3VyY2VJY29uICsgIiddIikpKQorCQkJCS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmluZVByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgeworCisJCVdlYkVsZW1lbnQgbmFtZVByb3BlcnR5ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkubmFtZSgicHJvcGVydHlOYW1lIikpOworCQluYW1lUHJvcGVydHkuc2VuZEtleXMobmFtZSk7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RSYW5kb21SZXNvdXJjZUljb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR2VuZXJhbFVJVXRpbHMubW92ZVRvU3RlcChTdGVwc0VudW0uSUNPTik7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLCA0KTsKKwkJd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltjb250YWlucyhAZGF0YS10ZXN0cy1pZCwgJ2ljb25Cb3gnKV0iKSkpOworCQlMaXN0PFdlYkVsZW1lbnQ+IGljb25FbGVtZW50ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnRzKEJ5LnhwYXRoKCIvLypbY29udGFpbnMoQGRhdGEtdGVzdHMtaWQsICdpY29uQm94JyldIikpOworCQlpY29uRWxlbWVudC5nZXQoMCkuY2xpY2soKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8V2ViRWxlbWVudD4gZ2V0QWxsT2JqZWN0c09uV29ya3NwYWNlKFdlYkRyaXZlciBkcml2ZXIsIFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLCAxMCk7CisJCXdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLnZpc2liaWxpdHlPZkVsZW1lbnRMb2NhdGVkKEJ5LnhwYXRoKCIvLypbQCo9JyIgKyByZXNvdXJjZS5nZXROYW1lKCkgKyAiJ10iKSkpOworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnRzKEJ5LnhwYXRoKCIvL2RpdltAY2xhc3M9JyIgKyAidy1zZGMtZGFzaGJvYXJkLWNhcmQtaW5mby1uYW1lIiArICInXSIpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZVRleHQoU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24geworCisJCXJldHVybiBHZW5lcmFsVUlVdGlscy5nZXRFZWxlbWVudEJ5Y29udGFpbnNDbGFzc05hbWUodGV4dCkuZ2V0VGV4dCgpOworCisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHNjcm9sbEVsZW1lbnQoV2ViRHJpdmVyIGRyaXZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgicHMtc2Nyb2xsYmFyLXkiKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNjcm9sbERvd25QYWdlKCkgdGhyb3dzIEFXVEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlSb2JvdCByb2JvdCA9IG5ldyBSb2JvdCgpOworCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19QQUdFX0RPV04pOworCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX1BBR0VfRE9XTik7CisJCXJvYm90LmtleVByZXNzKEtleUV2ZW50LlZLX1BBR0VfRE9XTik7CisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfUEFHRV9ET1dOKTsKKwkJcm9ib3Qua2V5UHJlc3MoS2V5RXZlbnQuVktfUEFHRV9ET1dOKTsKKwkJcm9ib3Qua2V5UmVsZWFzZShLZXlFdmVudC5WS19QQUdFX0RPV04pOworCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19QQUdFX0RPV04pOworCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX1BBR0VfRE9XTik7CisJCXJvYm90LmtleVByZXNzKEtleUV2ZW50LlZLX1BBR0VfRE9XTik7CisJCXJvYm90LmtleVJlbGVhc2UoS2V5RXZlbnQuVktfUEFHRV9ET1dOKTsKKwkJcm9ib3Qua2V5UHJlc3MoS2V5RXZlbnQuVktfUEFHRV9ET1dOKTsKKwkJcm9ib3Qua2V5UmVsZWFzZShLZXlFdmVudC5WS19QQUdFX0RPV04pOworCQlyb2JvdC5rZXlQcmVzcyhLZXlFdmVudC5WS19QQUdFX0RPV04pOworCQlyb2JvdC5rZXlSZWxlYXNlKEtleUV2ZW50LlZLX1BBR0VfRE9XTik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZU5ld1NlbGVjdExpc3QoU3RyaW5nIFRleHQpIHsKKwkJV2ViRWxlbWVudCBteVNlbGVjdEVsbSA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgiaS1zZGMtZm9ybS1zZWxlY3QiKSk7CisJCVNlbGVjdCBteVNlbGVjdFN0cmluZyA9IG5ldyBTZWxlY3QobXlTZWxlY3RFbG0pOworCQlteVNlbGVjdFN0cmluZy5zZWxlY3RCeVZpc2libGVUZXh0KFRleHQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVEZWZhdWx0VmFsdWVCeVR5cGUoU3RyaW5nIFZhbHVlKSB7CisKKwkJV2ViRWxlbWVudCB2YWx1ZVN0cmluZyA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5Lm5hbWUoInZhbHVlIikpOworCQl2YWx1ZVN0cmluZy5jbGVhcigpOworCQl2YWx1ZVN0cmluZy5zZW5kS2V5cyhWYWx1ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZUJvb2xlbkRlZmF1bHRWYWx1ZShTdHJpbmcgVmFsdWUpIHsKKworCQlXZWJFbGVtZW50IGVsZW1lbnRCb29sZWFuID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkubmFtZSgidmFsdWUiKSk7CisJCVNlbGVjdCBzZSA9IG5ldyBTZWxlY3QoZWxlbWVudEJvb2xlYW4pOworCQlzZS5zZWxlY3RCeVZhbHVlKFZhbHVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xpY2tCdXR0b25CbHVlKCkgeworCQlXZWJFbGVtZW50IGNsaWNrQnV0dG9uQmx1ZSA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidy1zZGMtYnRuLWJsdWUiKSk7CisJCWNsaWNrQnV0dG9uQmx1ZS5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja0J1dHRvbihTdHJpbmcgc2VsZWN0QnV0dG9uKSB7CisKKwkJV2ViRWxlbWVudCBjbGlja0J1dHRvbiA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvLypbQGRhdGEtdGVzdHMtaWQ9JyIgKyBzZWxlY3RCdXR0b24gKyAiJ10iKSk7CisJCWNsaWNrQnV0dG9uLmNsaWNrKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IFdhaXRmdW5jdGlvbmZvcmJ1dHRvbnMoU3RyaW5nIGVsZW1lbnQsIGludCB0aW1lb3V0KSB7CisJCVdlYkRyaXZlcldhaXQgd2FpdCA9IG5ldyBXZWJEcml2ZXJXYWl0KEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLCB0aW1lb3V0KTsKKwkJcmV0dXJuIHdhaXQudW50aWwoRXhwZWN0ZWRDb25kaXRpb25zLmVsZW1lbnRUb0JlQ2xpY2thYmxlKEJ5LnhwYXRoKGVsZW1lbnQpKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHdhaXRUb0J1dHRvblN1Ym1pdEZvclRlc3RpbmcoKSB7CisJCXJldHVybiBXYWl0ZnVuY3Rpb25mb3JidXR0b25zKCIvLypbQGRhdGEtdGVzdHMtaWQ9J3N1Ym1pdEZvclRlc3RpbmcnXSIsIDEwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgd2FpdFRvRmluaXNoQnV0dG9uRW5hYmxlZCgpIHsKKwkJcmV0dXJuIFdhaXRmdW5jdGlvbmZvcmJ1dHRvbnMoIi8vYnV0dG9uW0BkYXRhLXRlc3RzLWlkPSdGaW5pc2gnXSIsIDEwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgd2FpdFRvTmV4dEJ1dHRvbkVuYWJsZWQoKSB7CisJCXJldHVybiBXYWl0ZnVuY3Rpb25mb3JidXR0b25zKCIvL2J1dHRvbltAZGF0YS10ZXN0cy1pZD0nTmV4dCddIiwgMTApOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0VG9Ib21lTWVudSgpIHsKKwkJcmV0dXJuIFdhaXRmdW5jdGlvbmZvcmJ1dHRvbnMoIi8vKltAZGF0YS10ZXN0cy1pZD0nbWFpbi1tZW51LWJ1dHRvbi1ob21lJ10iLCAxMCk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHdhaXRUb0NhdGFsb2dNZW51KCkgeworCQlyZXR1cm4gV2FpdGZ1bmN0aW9uZm9yYnV0dG9ucygiLy8qW0BkYXRhLXRlc3RzLWlkPSdtYWluLW1lbnUtYnV0dG9uLWNhdGFsb2cnXSIsIDEwKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgd2FpdFNlYXJjaCgpIHsKKwkJcmV0dXJuIFdhaXRmdW5jdGlvbmZvcmJ1dHRvbnMoIi8vKltAZGF0YS10ZXN0cy1pZD0nbWFpbi1tZW51LWlucHV0LXNlYXJjaCddIiwgMTApOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0U3VibWl0Zm9yVGVzdGluZ0NhcmQoKSB7CisJCXJldHVybiBXYWl0ZnVuY3Rpb25mb3JidXR0b25zKCIvLypbQGRhdGEtdGVzdHMtaWQ9J2ktc2RjLWRhc2hib2FyZC1jYXJkLW1lbnUtaXRlbS1TdWJtaXRmb3JUZXN0aW5nJ10iLCAxMCk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHdhaXRWaWV3Q2FyZCgpIHsKKwkJcmV0dXJuIFdhaXRmdW5jdGlvbmZvcmJ1dHRvbnMoIi8vKltAZGF0YS10ZXN0cy1pZD0naS1zZGMtZGFzaGJvYXJkLWNhcmQtbWVudS1pdGVtLVZpZXcnXSIsIDUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0T3BlbkNhcmQoU3RyaW5nIHJlcXVpcmVkRWxlbWVudFVuaXF1ZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJV2ViRWxlbWVudCBtZW51ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIHJlcXVpcmVkRWxlbWVudFVuaXF1ZUlkICsgIiddIikpOworCQlHZW5lcmFsVUlVdGlscy5hY3Rpb25CdWlsZChtZW51KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbFJlc291cmNlR2VuZXJhbEluZm9ybWF0aW9uUGFnZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikgeworCQl0cnkgeworCisJCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmRlZmluZU5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCVJlc291cmNlR2VuZXJhbFBhZ2UuZGVmaW5lRGVzY3JpcHRpb24ocmVzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmRlZmluZUNhdGVnb3J5KHJlc291cmNlLmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0U3ViY2F0ZWdvcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQkJUmVzb3VyY2VHZW5lcmFsUGFnZS5kZWZpbmVWZW5kb3JOYW1lKHJlc291cmNlLmdldFZlbmRvck5hbWUoKSk7CisJCQlSZXNvdXJjZUdlbmVyYWxQYWdlLmRlZmluZVZlbmRvclJlbGVhc2UocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJCVJlc291cmNlR2VuZXJhbFBhZ2UuZGVmaW5lVGFnc0xpc3QocmVzb3VyY2UsIG5ldyBTdHJpbmdbXSB7ICJUaGlzLWlzLXRhZyIsICJhbm90aGVyLXRhZyIsICJUZXN0LWF1dG9tYXRpb24tdGFnIiB9KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGZpbGxOZXdSZXNvdXJjZVZhbHVlcyhSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZpbGxSZXNvdXJjZUdlbmVyYWxJbmZvcm1hdGlvblBhZ2UocmVzb3VyY2UsIHVzZXIpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0NyZWF0ZUJ1dHRvbigpOworCX0KKworCS8vIGNvZGVkIGJ5IHRlZGR5LgorCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0ZnVuY3Rpb25mb3JhbGxlbGVtZW50cyhTdHJpbmcgZWxlbWVudCkgeworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSwgNSk7CisJCXJldHVybiB3YWl0LnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy52aXNpYmlsaXR5T2ZFbGVtZW50TG9jYXRlZChCeS54cGF0aCgiLy8qW0AqPSciICsgZWxlbWVudCArICInXSIpKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHdhaXRGdW5jdGlvbkZvcmFHZXRFbGVtZW50cyhTdHJpbmcgZWxlbWVudCwgaW50IHRpbWVvdXQpIHsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCksIHRpbWVvdXQpOworCQlyZXR1cm4gd2FpdC51bnRpbCgKKwkJCQlFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltAZGF0YS10ZXN0cy1pZD0nIiArIGVsZW1lbnQgKyAiJ10iKSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRWRkNHZW5lcmFsSW5mbyhSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCQlTdHJpbmcgdmVyc2lvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRzKCJ2ZXJzaW9udmFsdWUiKS5nZXQoMCkuZ2V0VGV4dCgpLnN1YnN0cmluZygxKTsKKwkJU3RyaW5nIG5hbWUgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoIm5hbWUiKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZGVzY3JpcHRpb24iKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QobnVsbCwgInNlbGVjdEdlbmVyYWxDYXRlZ29yeSIpLmdldEZpcnN0U2VsZWN0ZWRPcHRpb24oKQorCQkJCS5nZXRUZXh0KCk7CisJCVN0cmluZyB2ZW5kb3JOYW1lID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJ2ZW5kb3JOYW1lIikuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworCQlTdHJpbmcgdmVuZG9yUmVsZWFzZSA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgidmVuZG9yUmVsZWFzZSIpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKKwkJTGlzdDxXZWJFbGVtZW50PiB0YWdzID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRzTGlzdFZpc2liaWxpdHkoImktc2RjLXRhZy10ZXh0Iik7CisJCVN0cmluZyB0eXBlID0gR2VuZXJhbFVJVXRpbHMud2FpdEZvckVsZW1lbnRzTGlzdFZpc2liaWxpdHkoInR5cGUiKS5nZXQoMSkuZ2V0VGV4dCgpOworCQlpbnQgaW5kZXggPSB0eXBlLmxhc3RJbmRleE9mKCI6Iik7CisJCVN5c3RlbS5vdXQucHJpbnRsbih0eXBlLnN1YnN0cmluZygwLCBpbmRleCkpOworCQlTdHJpbmcgQ29udGFjdElkID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJjb250YWN0SWQiKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRWZXJzaW9uKCkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldFZlcnNpb24oKS5lcXVhbHModmVyc2lvbikpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKGRlc2NyaXB0aW9uKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRWZW5kb3JOYW1lKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpLmVxdWFscyhjYXRlZ29yeSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldFZlbmRvck5hbWUoKS5lcXVhbHModmVuZG9yTmFtZSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldFZlbmRvclJlbGVhc2UoKS5lcXVhbHModmVuZG9yUmVsZWFzZSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKS5lcXVhbHMoQ29udGFjdElkKSk7CisJCWFzc2VydEVxdWFscyh0eXBlLnN1YnN0cmluZygwLCBpbmRleCksIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRUYWdzKCkuZ2V0KGkpLCB0YWdzLmdldChpKS5nZXRUZXh0KCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGdldEdlbmVyYWxJbmZvKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgVXNlciB1c2VyKSB7CisJCUxpc3Q8V2ViRWxlbWVudD4gdGFncyA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5KCJ0YWciKTsKKworCQlmb3IgKFdlYkVsZW1lbnQgdGFnIDogdGFncykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlLmdldFRhZ3MoKS5nZXQoMCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGdldEdlbmVyYWxJbmZvRm9yVGFncyhSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikgeworCisJCWNsaWNrTW9yZSgpOworCQlTdHJpbmcgY29tcG9uZW50VHlwZSA9IHdhaXRGdW5jdGlvbkZvcmFHZXRFbGVtZW50cygiY29tcG9uZW50VHlwZSIsIDMpLmdldFRleHQoKTsKKwkJU3RyaW5nIHZlcnNpb24gPSB3YWl0RnVuY3Rpb25Gb3JhR2V0RWxlbWVudHMoInZlcnNpb24iLCAzKS5nZXRUZXh0KCk7CisJCVN0cmluZyBjYXRlZ29yeSA9IHdhaXRGdW5jdGlvbkZvcmFHZXRFbGVtZW50cygiY2F0ZWdvcnkiLCAzKS5nZXRUZXh0KCk7Ly8gZ2V0CisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJpZ2h0CisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHBhbmVsCisJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIENhdGVnb3J5LgorCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gd2FpdEZ1bmN0aW9uRm9yYUdldEVsZW1lbnRzKCJyZXNvdXJjZVR5cGUiLCAzKS5nZXRUZXh0KCk7Ly8gZ2V0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmlnaHQKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBwYW5lbAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFN1YkNhdGVnb3J5LgorCQlTdHJpbmcgZGF0ZSA9IEdlbmVyYWxVSVV0aWxzLmdldEVlbGVtZW50QnlDbGFzc05hbWUoImNyZWF0aW9uRGF0ZSIpLmdldFRleHQoKTsKKwkJU3RyaW5nIGFvdXRob3IgPSB3YWl0ZnVuY3Rpb25mb3JhbGxlbGVtZW50cygiYXV0aG9yJyIpLmdldFRleHQoKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSB3YWl0RnVuY3Rpb25Gb3JhR2V0RWxlbWVudHMoInZlbmRvck5hbWUiLCAzKS5nZXRUZXh0KCk7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gd2FpdEZ1bmN0aW9uRm9yYUdldEVsZW1lbnRzKCJ2ZW5kb3JSZWxlYXNlIiwgMykuZ2V0VGV4dCgpOworCQlTdHJpbmcgY29udGFjdElkID0gd2FpdEZ1bmN0aW9uRm9yYUdldEVsZW1lbnRzKCJjb250YWN0SWQiLCAzKS5nZXRUZXh0KCk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IHdhaXRGdW5jdGlvbkZvcmFHZXRFbGVtZW50cygiZGVzY3JpcHRpb24iLCAzKS5nZXRUZXh0KCk7CisJCUxpc3Q8V2ViRWxlbWVudD4gdGFncyA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5KCJ0YWciKTsKKwkJYXNzZXJ0VHJ1ZShjb21wb25lbnRUeXBlLmVxdWFscygiUkVTT1VSQ0UiKSk7CisJCWFzc2VydFRydWUodmVyc2lvbi5lcXVhbHMocmVzb3VyY2UuZ2V0VmVyc2lvbigpKSk7CisJCWFzc2VydFRydWUoY2F0ZWdvcnkuZXF1YWxzKHJlc291cmNlLmdldENhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydEVxdWFscyhyZXNvdXJjZVR5cGUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKERhdGUscmVzb3VyY2UuZ2V0Q3JlYXRpb25EYXRlKCkpOworCQkvLyBhc3NlcnRFcXVhbHMoQW91dGhvcixyZXNvdXJjZS5nZXRDcmVhdG9yRnVsbE5hbWUoKSk7CisJCWFzc2VydFRydWUodmVuZG9yTmFtZS5lcXVhbHMocmVzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpKSk7CisJCWFzc2VydFRydWUodmVuZG9yUmVsZWFzZS5lcXVhbHMocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKSk7CisJCWFzc2VydFRydWUoY29udGFjdElkLmVxdWFscyhyZXNvdXJjZS5nZXRDb250YWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGRlc2NyaXB0aW9uLmVxdWFscyhyZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpICsgIlxuTGVzcyIpKTsKKwkJYXNzZXJ0VHJ1ZSh0YWdzLmVxdWFscygiVGFnLTE1MCIpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgc2VhcmNoVkZOYW1lSW5Xb3Jrc3BhY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCisJCUxpc3Q8V2ViRWxlbWVudD4gZmluZEVsZW1lbnRzID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnRzKEJ5LnhwYXRoKCIvL2RpdltAZGF0YS10ZXN0cy1pZD0nIiArIHJlc291cmNlLmdldFVuaXF1ZUlkKCkgKyAiJ10iKSk7CisJCWFzc2VydE5vdE51bGwoImRpZCBub3QgZmluZCBhbnkgZWxlbWVudHMiLCBmaW5kRWxlbWVudHMpOworCQlmb3IgKFdlYkVsZW1lbnQgd2ViRWxlbWVudCA6IGZpbmRFbGVtZW50cykgeworCQkJaWYgKHdlYkVsZW1lbnQuZ2V0VGV4dCgpLmNvbnRhaW5zKHJlc291cmNlLmdldFVuaXF1ZUlkKCkpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJIGZpbmQgaXQiKTsKKwkJCQlyZXR1cm4gd2ViRWxlbWVudDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEJvb2xlYW4gc2VhcmNoQ2hlY2tPdXRXb3Jrc3BhY2UoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlLCBVc2VyIHVzZXIsCisJCQlDaGVja0JveFN0YXR1c0VudW0gY2hlY2tCb3hTdGF0dXNFbnVtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlMaXN0PFdlYkVsZW1lbnQ+IGZpbmRFbGVtZW50cyA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpCisJCQkJLmZpbmRFbGVtZW50cyhCeS54cGF0aCgiLy9kaXZbQGRhdGEtdGVzdHMtaWQ9J2NvbXBvbmVudC5saWZlY3ljbGVTdGF0ZSddIikpOworCQlhc3NlcnROb3ROdWxsKCJkaWQgbm90IGZpbmQgYW55IGVsZW1lbnRzIiwgZmluZEVsZW1lbnRzKTsKKwkJZm9yIChXZWJFbGVtZW50IHdlYkVsZW1lbnQgOiBmaW5kRWxlbWVudHMpIHsKKwkJCWlmICghd2ViRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIikuY29udGFpbnMoY2hlY2tCb3hTdGF0dXNFbnVtLm5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLy8gY29kZWQgYnkgdGVkeS4KKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVXaXRoUmlnaHRQYWxldHQoUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlLCBVc2VyIHVzZXIpIHsKKwkJLy8gU3RyaW5nCisJCS8vIFR5cGU9V2FpdGZ1bmN0aW9uZm9yYWxsZWxlbWVudHMoInNoYXJpbmdTZXJ2aWNlLnNlbGVjdGVkRW50aXR5LmdldFR5cGVGb3JWaWV3KCkiLDMpLmdldFRleHQoKTsKKwkJU3RyaW5nIFJlc291cmNlVHlwZSA9IHdhaXRmdW5jdGlvbmZvcmFsbGVsZW1lbnRzKCJzZWxlY3RlZENvbXBvbmVudC5yZXNvdXJjZVR5cGUiKS5nZXRUZXh0KCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZVR5cGUpOworCQlTdHJpbmcgVmVyc2lvbiA9IHdhaXRmdW5jdGlvbmZvcmFsbGVsZW1lbnRzKCJzZWxlY3RlZENvbXBvbmVudC52ZXJzaW9uIikuZ2V0VGV4dCgpOworCQlTdHJpbmcgQ2F0ZWdvcnkgPSB3YWl0ZnVuY3Rpb25mb3JhbGxlbGVtZW50cygic2VsZWN0ZWRDb21wb25lbnQuY2F0ZWdvcmllc1swXS5uYW1lIikuZ2V0VGV4dCgpOy8vIGdldAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByaWdodAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBwYW5lbAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBDYXRlZ29yeS4KKwkJU3RyaW5nIENhbnZhc1N1YkNhdGVnb3J5ID0gd2FpdGZ1bmN0aW9uZm9yYWxsZWxlbWVudHMoInNlbGVjdGVkQ29tcG9uZW50LmNhdGVnb3JpZXNbMF0uc3ViY2F0ZWdvcmllc1swXS5uYW1lIikKKwkJCQkuZ2V0VGV4dCgpOy8vIGdldCByaWdodCBwYW5lbCBTdWJDYXRlZ29yeS4KKwkJLy8gU3RyaW5nIERhdGU9V2FpdGZ1bmN0aW9uZm9yZWxlbWVudHMoInNlbGVjdGVkQ29tcG9uZW50LmNyZWF0aW9uRGF0ZSB8CisJCS8vIGRhdGU6ICdNTS9kZC95eXl5JyIpLmdldFRleHQoKTsKKwkJLy8gU3RyaW5nCisJCS8vIEFvdXRob3I9d2FpdGZ1bmN0aW9uZm9yYWxsZWxlbWVudHMoInNlbGVjdGVkQ29tcG9uZW50LmNyZWF0b3JGdWxsTmFtZSciKS5nZXRUZXh0KCk7CisJCVN0cmluZyBWZW5kb3JOYW1lID0gd2FpdGZ1bmN0aW9uZm9yYWxsZWxlbWVudHMoInNlbGVjdGVkQ29tcG9uZW50LnZlbmRvck5hbWUiKS5nZXRUZXh0KCk7CisJCVN0cmluZyBWZW5kb3JSZWxlYXNlID0gd2FpdGZ1bmN0aW9uZm9yYWxsZWxlbWVudHMoInNlbGVjdGVkQ29tcG9uZW50LnZlbmRvclJlbGVhc2UiKS5nZXRUZXh0KCk7CisJCVN0cmluZyBjb250YWN0SWQgPSB3YWl0ZnVuY3Rpb25mb3JhbGxlbGVtZW50cygic2VsZWN0ZWRDb21wb25lbnQuY29udGFjdElkIikuZ2V0VGV4dCgpOworCQlTdHJpbmcgRGVzY3JpcHRpb24gPSB3YWl0ZnVuY3Rpb25mb3JhbGxlbGVtZW50cygic2VsZWN0ZWRDb21wb25lbnQuZGVzY3JpcHRpb24iKS5nZXRUZXh0KCk7CisJCVN0cmluZyBUYWdWRiA9IHdhaXRmdW5jdGlvbmZvcmFsbGVsZW1lbnRzKCJ0YWciKS5nZXRUZXh0KCk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhSZXNvdXJjZVR5cGUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKFZlcnNpb24sIHJlc291cmNlLmdldFZlcnNpb24oKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhDYXRlZ29yeSwgcmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoQ2FudmFzU3ViQ2F0ZWdvcnksCisJCQkJcmVzb3VyY2UuZ2V0Q2F0ZWdvcmllcygpLmdldCgwKS5nZXRTdWJjYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCS8vIGFzc2VydEVxdWFscyhEYXRlLHJlc291cmNlLmdldENyZWF0aW9uRGF0ZSgpKTsKKwkJLy8gYXNzZXJ0RXF1YWxzKEFvdXRob3IscmVzb3VyY2UuZ2V0Q3JlYXRvckZ1bGxOYW1lKCkpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoVmVuZG9yTmFtZSwgcmVzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKFZlbmRvclJlbGVhc2UsIHJlc291cmNlLmdldFZlbmRvclJlbGVhc2UoKSk7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscyhjb250YWN0SWQsIHJlc291cmNlLmdldENvbnRhY3RJZCgpKTsKKwkJQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKERlc2NyaXB0aW9uLCByZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpICsgIlxuTGVzcyIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoVGFnVkYsICJxYTEyMyIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja01vcmUoKSB7CisJCVdlYkVsZW1lbnQgY2xpY2tCdXR0b25TdWJtaXQgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoImVsbGlwc2lzLWRpcmVjdGl2ZS1tb3JlLWxlc3MiKSk7CisJCWNsaWNrQnV0dG9uU3VibWl0LmNsaWNrKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VJblVJKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgVXNlciB1c2VyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiwgQVdURXhjZXB0aW9uIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGluZyByZXNvdXJjZS4uLiIpOworCQlmaWxsTmV3UmVzb3VyY2VWYWx1ZXMocmVzb3VyY2UsIHVzZXIpOworCQlSZXN0UmVzcG9uc2UgZ2V0Q3JlYXRlZFJlc291cmNlID0gUmVzdENEVXRpbHMuZ2V0UmVzb3VyY2UocmVzb3VyY2UsIHVzZXIpOworCQlBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoIkRpZCBub3Qgc3VjY2VlZCB0byBnZXQgYW55IHJlc291cmNlIiwgSHR0cFN0YXR1cy5TQ19PSywKKwkJCQlnZXRDcmVhdGVkUmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisKKwkJcmV0dXJuIGdldENyZWF0ZWRSZXNvdXJjZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiwgQVdURXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVVJVXRpbHMubW92ZVRvSFRNTEVsZW1lbnRCeUNsYXNzTmFtZSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtbmV3Iik7CisJCVJlc291cmNlVUlVdGlscy5jbGlja09uSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQoRGF0YVRlc3RJZEVudW0uRGFzaGJvYXJkLkJVVFRPTl9BRERfVkYuZ2V0VmFsdWUoKSk7CisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJLy8gR2VuZXJhbFVJVXRpbHMuc2xlZXAoMTAwMCk7CisJCWZpbGxSZXNvdXJjZUdlbmVyYWxJbmZvcm1hdGlvblBhZ2UocmVzb3VyY2UsIHVzZXIpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0NyZWF0ZUJ1dHRvbigpOworCQlyZXR1cm4gbnVsbDsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzdFJlc3BvbnNlIHVwZGF0ZVJlc291cmNlSW5mb3JtYXRpb25QYWdlKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgVXNlciB1c2VyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiwgQVdURXhjZXB0aW9uIHsKKworCQlmaWxsUmVzb3VyY2VHZW5lcmFsSW5mb3JtYXRpb25QYWdlKHJlc291cmNlLCB1c2VyKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tDcmVhdGVCdXR0b24oKTsKKwkJcmV0dXJuIG51bGw7CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBjaGVja0luUmVzb3VyY2VJblVJKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZSwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlXZWJFbGVtZW50IEFTRENMaW5rID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJ3LXNkYy1oZWFkZXItbG9nby1saW5rIikpOworCQlBU0RDTGluay5jbGljaygpOworCQlUaHJlYWQuc2xlZXAoMjAwMCk7CisKKwkJTGlzdDxXZWJFbGVtZW50PiBsaXN0Rm9ybUlucHV0ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnRzKEJ5LmNsYXNzTmFtZSgiaS1zZGMtbGVmdC1zaWRlYmFyLW5hdi1pdGVtIikpOworCQlXZWJFbGVtZW50IGFkZFByb3BlcnR5RWxlbWVudCA9IGxpc3RGb3JtSW5wdXQuZ2V0KDApOworCQlhZGRQcm9wZXJ0eUVsZW1lbnQuY2xpY2soKTsKKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCisJCVdlYkVsZW1lbnQgc2VhcmNoUmVzb3VyY2UgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoInctc2RjLWhlYWRlci1jYXRhbG9nLXNlYXJjaC1pbnB1dCIpKTsKKwkJc2VhcmNoUmVzb3VyY2Uuc2VuZEtleXMoIm5ld3Jlc291cmNlNHRlc3QiKTsKKworCQlUaHJlYWQuc2xlZXAoMTAwMCk7CisKKwkJV2ViRWxlbWVudCBidXR0b25DbGlja01lbnUgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoInctc2RjLWRhc2hib2FyZC1jYXJkLW1lbnUtYnV0dG9uIikpOworCQlidXR0b25DbGlja01lbnUuY2xpY2soKTsKKworCQlXZWJFbGVtZW50IGNsaWNrTWVudSA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtbWVudSIpKTsKKwkJY2xpY2tNZW51LmNsaWNrKCk7CisKKwkJTGlzdDxXZWJFbGVtZW50PiBjbGlja0NoZWNrSW4gPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCS5maW5kRWxlbWVudHMoQnkuY2xhc3NOYW1lKCJpLXNkYy1kYXNoYm9hcmQtY2FyZC1tZW51LWl0ZW0iKSk7CisJCVdlYkVsZW1lbnQgY2xpY2tDaGVja0luTWVudSA9IGNsaWNrQ2hlY2tJbi5nZXQoMSk7CisJCWNsaWNrQ2hlY2tJbk1lbnUuY2xpY2soKTsKKworCQlXZWJFbGVtZW50IGRlc2NyaXB0aW9uRm9yU3VibWl0ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJ3LXNkYy1tb2RhbC1ib2R5LWNvbW1lbnQiKSk7CisJCWRlc2NyaXB0aW9uRm9yU3VibWl0LnNlbmRLZXlzKCJjaGVja2luIHJlc291cmNlIik7CisJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJV2ViRWxlbWVudCBjbGlja0J1dHRvblN1Ym1pdFR3byA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LmNsYXNzTmFtZSgidy1zZGMtYnRuLWJsdWUiKSk7CisJCWNsaWNrQnV0dG9uU3VibWl0VHdvLmNsaWNrKCk7CisJCVRocmVhZC5zbGVlcCgyMDAwKTsKKworCQlXZWJFbGVtZW50IGJ1dHRvbkNsaWNrTWVudTEgPSBHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKQorCQkJCS5maW5kRWxlbWVudChCeS5jbGFzc05hbWUoInctc2RjLWRhc2hib2FyZC1jYXJkLW1lbnUtYnV0dG9uIikpOworCQlidXR0b25DbGlja01lbnUxLmNsaWNrKCk7CisKKwkJV2ViRWxlbWVudCBjbGlja01lbnUxID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJ3LXNkYy1kYXNoYm9hcmQtY2FyZC1tZW51IikpOworCQljbGlja01lbnUxLmNsaWNrKCk7CisKKwkJTGlzdDxXZWJFbGVtZW50PiBjbGlja0NoZWNrT3V0ID0gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkKKwkJCQkuZmluZEVsZW1lbnRzKEJ5LmNsYXNzTmFtZSgiaS1zZGMtZGFzaGJvYXJkLWNhcmQtbWVudS1pdGVtIikpOworCQlXZWJFbGVtZW50IGNsaWNrQ2hlY2tPdXRNZW51ID0gY2xpY2tDaGVja091dC5nZXQoMCk7CisJCWNsaWNrQ2hlY2tPdXRNZW51LmNsaWNrKCk7CisKKwkJVGhyZWFkLnNsZWVwKDMwMDApOworCQlSZXN0UmVzcG9uc2UgZ2V0UmVzb3VyY2UgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZSwgdXNlcik7CisJCUFzc2VydEpVbml0LmFzc2VydEVxdWFscygiRGlkIG5vdCBzdWNjZWVkIHRvIGdldCByZXNvdXJjZSBhZnRlciBjcmVhdGUiLCAyMDAsCisJCQkJZ2V0UmVzb3VyY2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSk7CisJCXJldHVybiBnZXRSZXNvdXJjZTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpZmVDeWNsZVN0YXRlVUkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJmb3JtbGlmZWN5Y2xlc3RhdGUiKS5nZXRUZXh0KCk7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY2F0YWxvZ0ZpbHRlclJlc291cmNlQ2F0ZWdvcmllc0NoZWNCb3goUmVzb3VyY2VDYXRlZ29yaWVzTmFtZUVudW0gZW51bU5hbWUpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IGNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCk7CisJCXN3aXRjaCAoZW51bU5hbWUpIHsKKwkJY2FzZSBBUFBMSUNBVElPTkw0OgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgiYXBwbGljYXRpb25TZXJ2ZXIiLCAiZGVmYXVsdGljb24iLCAidmwiLCAiY3AiLCAiY2FsbF9jb250cm9sbCIsICJib3JkZXJFbGVtZW50IiwKKwkJCQkJIm5ldHdvcmsiLCAiZmlyZXdhbGwiLCAiZGF0YWJhc2UiLCAibG9hZEJhbGFuY2VyIik7CisJCQlicmVhazsKKwkJY2FzZSBBUFBMSUNBVElPTl9TRVJWRVI6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJhcHBsaWNhdGlvblNlcnZlciIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQk9SREVSX0VMRU1FTlQ6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJib3JkZXJFbGVtZW50IiwgInZsIiwgImNwIiwgImRlZmF1bHRpY29uIik7CisJCQlicmVhazsKKwkJY2FzZSBDQUxMX0NPTlRST0w6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJjYWxsX2NvbnRyb2xsIiwgInZsIiwgImNwIiwgImRlZmF1bHRpY29uIik7CisJCQlicmVhazsKKwkJY2FzZSBDT01NT05fTkVUV09SS19SRVNPVVJDRVM6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRFZWxlbWVudEJ5TGlua1RleHQoIkNvbW1vbiBOZXR3b3JrIFJlc291cmNlcyIpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgibmV0d29yayIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTkVDVElPTl9QT0lOVFM6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFUQUJBU0U6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJkYXRhYmFzZSIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFUQUJBU0VfR0VORVJJQzoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtTmFtZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoImRhdGFiYXNlIiwgInZsIiwgImNwIiwgImRlZmF1bHRpY29uIik7CisJCQlicmVhazsKKwkJY2FzZSBGSVJFV0FMTDoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtTmFtZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoImZpcmV3YWxsIiwgInZsIiwgImNwIiwgImRlZmF1bHRpY29uIik7CisJCQlicmVhazsKKwkJY2FzZSBHQVRFV0FZOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgiZ2F0ZXdheSIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSU5GUkFTVFJVQ1RVUkU6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJjb25uZWN0b3IiLCAidmwiLCAiY3AiLCAiZGVmYXVsdGljb24iKTsKKwkJCWJyZWFrOworCQljYXNlIElORlJBU1RSVUNUVVJFTDIzOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgidWNwZSIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgTEFOX0NPTk5FQ1RPUlM6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJuZXR3b3JrIiwgInBvcnQiLCAiY29ubmVjdG9yIiwgInZsIiwgImNwIiwgImRlZmF1bHRpY29uIik7CisJCQlicmVhazsKKwkJY2FzZSBMT0FEX0JBTEFOQ0VSOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgibG9hZEJhbGFuY2VyIiwgInZsIiwgImNwIiwgImRlZmF1bHRpY29uIik7CisJCQlicmVhazsKKwkJY2FzZSBNRURJQV9TRVJWRVJTOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgibmV0d29yayIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUV09SS0w0OgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgibmV0d29yayIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUV09SS19FTEVNRU5UUzoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtTmFtZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoInBvcnQiLCAiZGVmYXVsdGljb24iLCAibmV0d29yayIsICJjb25uZWN0b3IiLCAidmwiLCAiY3AiKTsKKwkJCWJyZWFrOworCQljYXNlIE5FVFdPUktfTDIzOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgibmV0d29yayIsICJ2bCIsICJkZWZhdWx0aWNvbiIsICJjcCIsICJyb3V0ZXIiLCAicG9ydCIsICJjb25uZWN0b3IiLCAiZ2F0ZXdheSIsCisJCQkJCSJ1Y3BlIik7CisJCQlicmVhazsKKwkJY2FzZSBORVRXT1JLX0NPTk5FQ1RJVklUWToKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtTmFtZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoIm5ldHdvcmsiLCAidmwiLCAiY3AiLCAiZGVmYXVsdGljb24iKTsKKwkJCWJyZWFrOworCQljYXNlIEdFTkVSSUM6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJkYXRhYmFzZSIsICJwb3J0IiwgImxvYWRCYWxhbmNlciIsICJ2bCIsICJjcCIsICJvYmplY3RTdG9yYWdlIiwgImNvbXB1dGUiLAorCQkJCQkiZGVmYXVsdGljb24iLCAidWNwZSIsICJuZXR3b3JrIiwgImNvbm5lY3RvciIpOworCQkJYnJlYWs7CisJCWNhc2UgQUJTVFJBQ1Q6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJvYmplY3RTdG9yYWdlIiwgImNvbXB1dGUiLCAiZGVmYXVsdGljb24iLCAiY3AiLCAidmwiKTsKKwkJCWJyZWFrOworCQljYXNlIFJvdXRlcjoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtTmFtZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoInJvdXRlciIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVklSVFVBTF9MSU5LUzoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtTmFtZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoInZsIiwgImRlZmF1bHRpY29uIik7CisJCQlicmVhazsKKwkJY2FzZSBXQU5fQ29ubmVjdG9yczoKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtTmFtZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoIm5ldHdvcmsiLCAicG9ydCIsICJjb25uZWN0b3IiLCAidmwiLCAiY3AiLCAiZGVmYXVsdGljb24iKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9TRVJWRVI6CisJCQlHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoZW51bU5hbWUuZ2V0VmFsdWUoKSkuY2xpY2soKTsKKwkJCWNhdGVnb3JpZXMgPSBBcnJheXMuYXNMaXN0KCJhcHBsaWNhdGlvblNlcnZlciIsICJ2bCIsICJjcCIsICJkZWZhdWx0aWNvbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIGNhdGVnb3JpZXM7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVZlcnNpb25JblVJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJd2FpdFRvRGVsZXRlVmVyc2lvbigpLmNsaWNrKCk7CisJCVJlc291cmNlVUlVdGlscy5jbGlja0J1dHRvbkJsdWUoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0VGFiSW5SaWdodFBhbGxldGUoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVdlYkVsZW1lbnQgdGFiID0gR2VuZXJhbFVJVXRpbHMuZ2V0RWVsZW1lbnRCeWNvbnRhaW5zQ2xhc3NOYW1lKGNsYXNzTmFtZSk7CisJCXRhYi5jbGljaygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0VG9EZWxldGVWZXJzaW9uKCkgeworCQlyZXR1cm4gV2FpdGZ1bmN0aW9uZm9yYnV0dG9ucygiLy8qW0BkYXRhLXRlc3RzLWlkPSdkZWxldGVWZXJzaW9uJ10iLCAxMCk7CisJfQorCisJcHVibGljIHN0YXRpYyBXZWJFbGVtZW50IHJpaHRQYW5lbEFQSSgpIHsKKwkJcmV0dXJuIHdhaXRGdW5jdGlvbkZvcmFHZXRFbGVtZW50cygidGFiLWFwaSIsIDEwKTsKKwl9CisKKwkvKioKKwkgKiBDbGljayBvbiBIVE1MIGVsZW1lbnQuCisJICogCisJICogQHBhcmFtIGRhdGFUZXN0SWQKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGlja09uSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQoU3RyaW5nIGRhdGFUZXN0SWQpIHRocm93cyBFeGNlcHRpb24geworCQlXZWJEcml2ZXJXYWl0IHdhaXQgPSBuZXcgV2ViRHJpdmVyV2FpdChHZW5lcmFsVUlVdGlscy5nZXREcml2ZXIoKSwgMjApOworCQlXZWJFbGVtZW50IGVsZW1lbnQgPSB3YWl0CisJCQkJLnVudGlsKEV4cGVjdGVkQ29uZGl0aW9ucy5lbGVtZW50VG9CZUNsaWNrYWJsZShCeS54cGF0aCgiLy8qW0BkYXRhLXRlc3RzLWlkPSciICsgZGF0YVRlc3RJZCArICInXSIpKSk7CisJCWVsZW1lbnQuY2xpY2soKTsKKwkJLy8gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMuZWxlbWV0dG8pCisJCS8vIFdlYkVsZW1lbnQgc2VydmljZUJ1dHRvbiA9CisJCS8vIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvLypbQGRhdGEtdGVzdHMtaWQ9JyIKKwkJLy8gKyBkYXRhVGVzdElkICsgIiddIikpOworCQkvLyBzZXJ2aWNlQnV0dG9uLgorCQkvLyBzZXJ2aWNlQnV0dG9uLmNsaWNrKCk7CisJfQorCisJLyoqCisJICogTW92ZSB0byBIVE1MIGVsZW1lbnQgYnkgY2xhc3MgbmFtZS4gV2hlbiBtb3ZpbmcgdG8gdGhlIEhUTUwgZWxlbWVudCwgaXQKKwkgKiB3aWxsIHJhaXNlIGhvdmVyIGV2ZW50LgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc05hbWUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbW92ZVRvSFRNTEVsZW1lbnRCeUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisJCUFjdGlvbnMgYWN0aW9ucyA9IG5ldyBBY3Rpb25zKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKTsKKwkJZmluYWwgV2ViRWxlbWVudCBjcmVhdGVCdXR0b25zQXJlYSA9IEdlbmVyYWxVSVV0aWxzCisJCQkJLnJldHJ5TWV0aG9kT25FeGNlcHRpb24oKCkgLT4gR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKGNsYXNzTmFtZSkpKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGNyZWF0ZUJ1dHRvbnNBcmVhKS5wZXJmb3JtKCk7CisJfQorCisJLyoqCisJICogTW92ZSB0byBIVE1MIGVsZW1lbnQgYnkgZWxlbWVudCBpZC4gV2hlbiBtb3ZpbmcgdG8gdGhlIEhUTUwgZWxlbWVudCwgaXQKKwkgKiB3aWxsIHJhaXNlIGhvdmVyIGV2ZW50LgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc05hbWUKKwkgKi8KKwlzdGF0aWMgdm9pZCBtb3ZlVG9IVE1MRWxlbWVudEJ5RGF0YVRlc3RJZChTdHJpbmcgZGF0YVRlc3RJZCkgeworCQkvLyBXZWJFbGVtZW50IGhvdmVyQXJlYSA9CisJCS8vIEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpLmZpbmRFbGVtZW50KEJ5LnhwYXRoKCIvLypbQGRhdGEtdGVzdHMtaWQ9JyIKKwkJLy8gKyBkYXRhVGVzdElkICsgIiddIikpOworCQlXZWJFbGVtZW50IGhvdmVyQXJlYSA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50VmlzaWJpbGl0eShkYXRhVGVzdElkKTsKKwkJLy8gV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoR2VuZXJhbFVJVXRpbHMuZ2V0RHJpdmVyKCksCisJCS8vIDMwKTsKKwkJLy8gd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mKGhvdmVyQXJlYSkpOworCisJCUFjdGlvbnMgYWN0aW9ucyA9IG5ldyBBY3Rpb25zKEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpKTsKKwkJYWN0aW9ucy5tb3ZlVG9FbGVtZW50KGhvdmVyQXJlYSkucGVyZm9ybSgpOworCX0KKworCS8vIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGNyZWF0ZVJlc291cmNlSW5VSShVc2VyIHVzZXIpeworCS8vIHRyeXsKKwkvLyBSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lUmVzb3VyY2VEZXRhaWxzID0KKwkvLyBkZWZpbmVSZXNvdXJjZURldGFpbHMoUmVzb3VyY2VUeXBlRW51bS5WRik7CisJLy8gUmVzb3VyY2VVSVV0aWxzLm1vdmVUb0hUTUxFbGVtZW50QnlDbGFzc05hbWUoInctc2RjLWRhc2hib2FyZC1jYXJkLW5ldyIpOworCS8vIFJlc291cmNlVUlVdGlscy5jbGlja09uSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQoRGF0YVRlc3RJZEVudW0uRGFzaGJvYXJkLkJVVFRPTl9BRERfVkYuZ2V0VmFsdWUoKSk7CisJLy8gR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCS8vLy8gR2VuZXJhbFVJVXRpbHMuc2xlZXAoMTAwMCk7CisJLy8gZmlsbFJlc291cmNlR2VuZXJhbEluZm9ybWF0aW9uUGFnZShkZWZpbmVSZXNvdXJjZURldGFpbHMsIHVzZXIpOworCS8vIEdlbmVyYWxVSVV0aWxzLmNsaWNrQ3JlYXRlQnV0dG9uKCk7CisJLy8gcmV0dXJuIGRlZmluZVJlc291cmNlRGV0YWlsczsKKwkvLyB9CisJLy8gY2F0Y2goIEV4Y2VwdGlvbiBlKXsKKwkvLyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkvLyB9CisJLy8gfQorCisJLyoqCisJICogSW1wb3J0IFZGQworCSAqIAorCSAqIEBwYXJhbSB1c2VyCisJICogQHBhcmFtIGZpbGVQYXRoCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0VmZjKFJlc291cmNlUmVxRGV0YWlscyByZXNvdXJjZU1ldGFEYXRhLCBTdHJpbmcgZmlsZVBhdGgsIFN0cmluZyBmaWxlTmFtZSwgVXNlciB1c2VyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdlbmVyYWxVSVV0aWxzLmhvdmVyT25BcmVhKERhc2hib2FyZC5JTVBPUlRfQVJFQS5nZXRWYWx1ZSgpKTsKKwkJLy8gSW5zZXJ0IGZpbGUgdG8gdGhlIGJyb3dzZSBkaWFsb2cKKwkJZmluYWwgV2ViRWxlbWVudCBicm93c2VXZWJFbGVtZW50ID0gR2VuZXJhbFVJVXRpbHMKKwkJCQkuZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChEYXRhVGVzdElkRW51bS5EYXNoYm9hcmQuSU1QT1JUX1ZGQ19GSUxFLmdldFZhbHVlKCkpOworCQlicm93c2VXZWJFbGVtZW50LnNlbmRLZXlzKGZpbGVQYXRoICsgZmlsZU5hbWUpOworCisJCS8vIEZpbGwgdGhlIGdlbmVyYWwgcGFnZSBmaWVsZHMuCisJCUdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkJZmlsbFJlc291cmNlR2VuZXJhbEluZm9ybWF0aW9uUGFnZShyZXNvdXJjZU1ldGFEYXRhLCB1c2VyKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tDcmVhdGVCdXR0b24oKTsKKworCX0KKworCS8vIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VSZXFEZXRhaWxzIGltcG9ydFZmY0luVUkoVXNlciB1c2VyLCBTdHJpbmcKKwkvLyBmaWxlUGF0aCwgU3RyaW5nIGZpbGVOYW1lLCBSZXNvdXJjZVR5cGVFbnVtIHJlc291cmNlVHlwZSkgeworCS8vIFJlc291cmNlUmVxRGV0YWlscyBkZWZpbmVSZXNvdXJjZURldGFpbHMgPQorCS8vIGRlZmluZVJlc291cmNlRGV0YWlscyhyZXNvdXJjZVR5cGUpOworCS8vIFJlc291cmNlVUlVdGlscy5tb3ZlVG9IVE1MRWxlbWVudEJ5RGF0YVRlc3RJZChEYXNoYm9hcmQuSU1QT1JUX0FSRUEuZ2V0VmFsdWUoKSk7CisJLy8KKwkvLyAvLyBJbnNlcnQgZmlsZSB0byB0aGUgYnJvd3NlIGRpYWxvZworCS8vIGZpbmFsIFdlYkVsZW1lbnQgYnJvd3NlV2ViRWxlbWVudCA9CisJLy8gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChEYXRhVGVzdElkRW51bS5EYXNoYm9hcmQuSU1QT1JUX1ZGQ19GSUxFLmdldFZhbHVlKCkpOworCS8vIGJyb3dzZVdlYkVsZW1lbnQuc2VuZEtleXMoZmlsZVBhdGggKyBmaWxlTmFtZSk7CisJLy8KKwkvLyAvLyBGaWxsIHRoZSBnZW5lcmFsIHBhZ2UgZmllbGRzLgorCS8vIEdlbmVyYWxVSVV0aWxzLndhaXRGb3JMb2FkZXIoKTsKKwkvLyBmaWxsUmVzb3VyY2VHZW5lcmFsSW5mb3JtYXRpb25QYWdlKGRlZmluZVJlc291cmNlRGV0YWlscywgdXNlcik7CisJLy8gR2VuZXJhbFVJVXRpbHMuY2xpY2tDcmVhdGVCdXR0b24oKTsKKwkvLyByZXR1cm4gZGVmaW5lUmVzb3VyY2VEZXRhaWxzOworCS8vIH0KKworCS8qKgorCSAqIEltcG9ydCBWRgorCSAqIAorCSAqIEBwYXJhbSB1c2VyCisJICogQHBhcmFtIGZpbGVQYXRoCisJICogQHBhcmFtIGZpbGVOYW1lCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJLy8gcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgaW1wb3J0VmZJblVJKFVzZXIgdXNlciwgU3RyaW5nIGZpbGVQYXRoLAorCS8vIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJLy8gUmVzb3VyY2VSZXFEZXRhaWxzIGRlZmluZVJlc291cmNlRGV0YWlscyA9CisJLy8gZGVmaW5lUmVzb3VyY2VEZXRhaWxzKFJlc291cmNlVHlwZUVudW0uVkYpOworCS8vIFJlc291cmNlVUlVdGlscy5tb3ZlVG9IVE1MRWxlbWVudEJ5RGF0YVRlc3RJZChEYXNoYm9hcmQuSU1QT1JUX0FSRUEuZ2V0VmFsdWUoKSk7CisJLy8KKwkvLyAvLyBJbnNlcnQgZmlsZSB0byB0aGUgYnJvd3NlIGRpYWxvZworCS8vIGZpbmFsIFdlYkVsZW1lbnQgYnJvd3NlV2ViRWxlbWVudCA9CisJLy8gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudEJ5RGF0YVRlc3RJZChEYXRhVGVzdElkRW51bS5EYXNoYm9hcmQuSU1QT1JUX1ZGX0ZJTEUuZ2V0VmFsdWUoKSk7CisJLy8gYnJvd3NlV2ViRWxlbWVudC5zZW5kS2V5cyhmaWxlUGF0aCArIGZpbGVOYW1lKTsKKwkvLworCS8vIC8vIEZpbGwgdGhlIGdlbmVyYWwgcGFnZSBmaWVsZHMuCisJLy8gR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCS8vIGZpbGxSZXNvdXJjZUdlbmVyYWxJbmZvcm1hdGlvblBhZ2UoZGVmaW5lUmVzb3VyY2VEZXRhaWxzLCB1c2VyKTsKKwkvLyBHZW5lcmFsVUlVdGlscy5jbGlja0NyZWF0ZUJ1dHRvbigpOworCS8vIHJldHVybiBkZWZpbmVSZXNvdXJjZURldGFpbHM7CisJLy8gfQorCisJLy8gcHVibGljIHN0YXRpYyBSZXNvdXJjZVJlcURldGFpbHMgZGVmaW5lUmVzb3VyY2VEZXRhaWxzKFJlc291cmNlVHlwZUVudW0KKwkvLyByZXNvdXJjZVR5cGUpIHsKKwkvLyBSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2VSZXFEZXRhaWxzKCk7CisJLy8gcmVzb3VyY2UgPSBFbGVtZW50RmFjdG9yeS5nZXREZWZhdWx0UmVzb3VyY2UoTm9ybWF0aXZlVHlwZXNFbnVtLlJPT1QsCisJLy8gUmVzb3VyY2VDYXRlZ29yeUVudW0uQVBQTElDQVRJT05fTDRfQ0FMTF9DT05UUk9MKTsKKwkvLyByZXNvdXJjZS5zZXRWZXJzaW9uKElOSVRJQUxfVkVSU0lPTik7CisJLy8gcmVzb3VyY2Uuc2V0SWNvbihJQ09OX1JFU09VUkNFX05BTUUpOworCS8vIHJlc291cmNlLnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUudG9TdHJpbmcoKSk7CisJLy8gcmVzb3VyY2Uuc2V0TmFtZShnZXRSYW5kb21Db21wb25lbnROYW1lKFJFU09VUkNFX05BTUVfUFJFRklYKSk7CisJLy8KKwkvLyBTZXR1cENEVGVzdC5zZXRDcmVhdGVkQ29tcG9uZW50cyhBcnJheXMuYXNMaXN0KHJlc291cmNlKSk7CisJLy8KKwkvLyByZXR1cm4gcmVzb3VyY2U7CisJLy8gfQorCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UmFuZG9tQ29tcG9uZW50TmFtZShTdHJpbmcgcHJlZml4KSB7CisJCXJldHVybiBwcmVmaXggKyBuZXcgUmFuZG9tKCkubmV4dEludCgxMDAwMCk7CisJfQorCisJcHVibGljIHN0YXRpYyBJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBnZXRGaXJzdFJJUG9zKFJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUksIFVzZXIgdXNlcikgeworCQlTdHJpbmcgcmVzcG9uc2VBZnRlckRyYWcgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShjcmVhdGVSZXNvdXJjZUluVUksIHVzZXIpLmdldFJlc3BvbnNlKCk7CisJCUpTT05PYmplY3QganNvblJlc291cmNlID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShyZXNwb25zZUFmdGVyRHJhZyk7CisJCVN0cmluZyB4UG9zUG9zdERyYWcgPSAoU3RyaW5nKSAoKEpTT05PYmplY3QpICgoSlNPTkFycmF5KSBqc29uUmVzb3VyY2UuZ2V0KCJjb21wb25lbnRJbnN0YW5jZXMiKSkuZ2V0KDApKQorCQkJCS5nZXQoInBvc1giKTsKKwkJU3RyaW5nIHlQb3NQb3N0RHJhZyA9IChTdHJpbmcpICgoSlNPTk9iamVjdCkgKChKU09OQXJyYXkpIGpzb25SZXNvdXJjZS5nZXQoImNvbXBvbmVudEluc3RhbmNlcyIpKS5nZXQoMCkpCisJCQkJLmdldCgicG9zWSIpOworCQlyZXR1cm4gbmV3IEltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+KHhQb3NQb3N0RHJhZywgeVBvc1Bvc3REcmFnKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBnZXRFcnJvck1lc3NhZ2VUZXh0KFdlYkRyaXZlciBkcml2ZXIsIFN0cmluZyB0ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0RWVsZW1lbnRCeWNvbnRhaW5zQ2xhc3NOYW1lKHRleHQpOworCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGZpbGxHZW5lcmFsSW5mb1ZhbHVlc0FuZEljb24oUmVzb3VyY2VSZXFEZXRhaWxzIHJlc291cmNlLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlmaWxsUmVzb3VyY2VHZW5lcmFsSW5mb3JtYXRpb25QYWdlKHJlc291cmNlLCB1c2VyKTsKKwkJR2VuZXJhbFVJVXRpbHMuY2xpY2tDcmVhdGVCdXR0b24oKTsKKworCQlzZWxlY3RSYW5kb21SZXNvdXJjZUljb24oKTsKKwl9CisKKwkvLyBjb2RlZCBieSB0ZWRkeS4KKwlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VkZDR2VuZXJhbEluZm9BbmRWYWxpZGF0ZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikKKwkJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCVRocmVhZC5zbGVlcCgyMDAwKTsKKwkJV2ViRHJpdmVyIGRyaXZlciA9IEdlbmVyYWxVSVV0aWxzLmdldERyaXZlcigpOworCQlTdHJpbmcgdmVyc2lvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QobnVsbCwgInZlcnNpb25IZWFkZXIiKS5nZXRGaXJzdFNlbGVjdGVkT3B0aW9uKCkuZ2V0VGV4dCgpOworCQlTdHJpbmcgbmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnQoZHJpdmVyLCAibmFtZSIpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudChkcml2ZXIsICJkZXNjcmlwdGlvbiIpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKKwkJU3RyaW5nIGNhdGVnb3J5ID0gR2VuZXJhbFVJVXRpbHMuZ2V0U2VsZWN0TGlzdChudWxsLCAic2VsZWN0R2VuZXJhbENhdGVnb3J5IikuZ2V0Rmlyc3RTZWxlY3RlZE9wdGlvbigpCisJCQkJLmdldFRleHQoKTsKKwkJU3RyaW5nIHZlbmRvck5hbWUgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50KGRyaXZlciwgInZlbmRvck5hbWUiKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN0cmluZyB2ZW5kb3JSZWxlYXNlID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudChkcml2ZXIsICJ2ZW5kb3JSZWxlYXNlIikuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworCQlMaXN0PFdlYkVsZW1lbnQ+IHRhZ3MgPSBHZW5lcmFsVUlVdGlscy53YWl0Rm9yRWxlbWVudHNMaXN0VmlzaWJpbGl0eSgiaS1zZGMtdGFnLXRleHQiKTsKKwkJU3RyaW5nIHR5cGUgPSBHZW5lcmFsVUlVdGlscy53YWl0Rm9yRWxlbWVudHNMaXN0VmlzaWJpbGl0eSgidHlwZSIpLmdldCgxKS5nZXRUZXh0KCk7CisJCWludCBpbmRleCA9IHR5cGUubGFzdEluZGV4T2YoIjoiKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KSk7CisJCVN0cmluZyBjb250YWN0SWQgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50KGRyaXZlciwgImNvbnRhY3RJZCIpLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlLmdldFZlcnNpb24oKSk7CisJCWFzc2VydFRydWUocmVzb3VyY2UuZ2V0VmVyc2lvbigpLmVxdWFscyh2ZXJzaW9uLnN1YnN0cmluZygxKSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKGRlc2NyaXB0aW9uKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRWZW5kb3JOYW1lKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKTsKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldFN1YmNhdGVnb3JpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpLmVxdWFscyhjYXRlZ29yeSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldFZlbmRvck5hbWUoKS5lcXVhbHModmVuZG9yTmFtZSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldFZlbmRvclJlbGVhc2UoKS5lcXVhbHModmVuZG9yUmVsZWFzZSkpOworCQlhc3NlcnRUcnVlKHJlc291cmNlLmdldENyZWF0b3JVc2VySWQoKS5lcXVhbHMoY29udGFjdElkKSk7CisJCWFzc2VydEVxdWFscyh0eXBlLnN1YnN0cmluZygwLCBpbmRleCksIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRUYWdzKCkuZ2V0KGkpLCB0YWdzLmdldChpKS5nZXRUZXh0KCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgY3JlYXRlUmVzb3VyY2VORyhSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiwgQVdURXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVVJVXRpbHMubW92ZVRvSFRNTEVsZW1lbnRCeUNsYXNzTmFtZSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtbmV3Iik7CisJCVJlc291cmNlVUlVdGlscy5jbGlja09uSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQoRGF0YVRlc3RJZEVudW0uRGFzaGJvYXJkLkJVVFRPTl9BRERfVkYuZ2V0VmFsdWUoKSk7CisJCWZpbGxSZXNvdXJjZUdlbmVyYWxJbmZvcm1hdGlvblBhZ2UocmVzb3VyY2UsIHVzZXIpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja09uSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQoRGF0YVRlc3RJZEVudW0uTGlmZUN5bGVDaGFuZ2VCdXR0b25zLkNSRUFURS5nZXRWYWx1ZSgpKTsKKwkJcmV0dXJuIG51bGw7CisKKwl9Cit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9SZXN0Q0RVdGlscy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvUmVzdENEVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDUzNWUwCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvUmVzdENEVXRpbHMuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Qcm9kdWN0UmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuUmVzb3VyY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuaHR0cC5SZXN0UmVzcG9uc2U7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5Qcm9kdWN0UmVzdFV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzLnJlc3QuUmVzb3VyY2VSZXN0VXRpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHMucmVzdC5SZXNwb25zZVBhcnNlcjsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlNlcnZpY2VSZXN0VXRpbHM7CisKK3B1YmxpYyBjbGFzcyBSZXN0Q0RVdGlscyB7CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFJlc291cmNlVW5pcXVlSWRBbmRVVUlEKENvbXBvbmVudFJlcURldGFpbHMgZWxlbWVudCwgUmVzdFJlc3BvbnNlIGdldFJlc291cmNlUmVzcG9uc2UpIHsKKwkJZWxlbWVudC5zZXRVbmlxdWVJZChSZXNwb25zZVBhcnNlci5nZXRVbmlxdWVJZEZyb21SZXNwb25zZShnZXRSZXNvdXJjZVJlc3BvbnNlKSk7CisJCWVsZW1lbnQuc2V0VVVJRChSZXNwb25zZVBhcnNlci5nZXRVdWlkRnJvbVJlc3BvbnNlKGdldFJlc291cmNlUmVzcG9uc2UpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZShSZXNvdXJjZVJlcURldGFpbHMgcmVzb3VyY2UsIFVzZXIgdXNlcikgeworCQl0cnkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cnlpbmcgdG8gZ2V0IHJlc291cmNlIik7CisJCQlHZW5lcmFsVUlVdGlscy5zbGVlcCgxMDAwKTsKKwkJCVJlc3RSZXNwb25zZSBnZXRSZXNvdXJjZVJlc3BvbnNlID0gbnVsbDsKKwkJCVN0cmluZyByZW91cmNlVW5pcXVlSWQgPSByZXNvdXJjZS5nZXRVbmlxdWVJZCgpOworCQkJaWYgKHJlb3VyY2VVbmlxdWVJZCAhPSBudWxsKSB7CisJCQkJZ2V0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlKHJlb3VyY2VVbmlxdWVJZCk7CisJCQkJaWYgKGdldFJlc291cmNlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSA9PSAyMDApIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdWNjZWVkZWQgdG8gZ2V0IHJlc291cmNlIik7CisJCQkJfQorCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlc3BvbnNlOworCQkJfQorCQkJSlNPTk9iamVjdCBnZXRSZXNvdXJjZUpTT05PYmplY3QgPSBudWxsOworCQkJZ2V0UmVzb3VyY2VSZXNwb25zZSA9IFJlc291cmNlUmVzdFV0aWxzLmdldFJlc291cmNlQnlOYW1lQW5kVmVyc2lvbih1c2VyLmdldFVzZXJJZCgpLCByZXNvdXJjZS5nZXROYW1lKCksCisJCQkJCXJlc291cmNlLmdldFZlcnNpb24oKSk7CisJCQlpZiAoZ2V0UmVzb3VyY2VSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpID09IDIwMCkgeworCQkJCUpTT05BcnJheSBqQXJyYXkgPSBuZXcgSlNPTkFycmF5KGdldFJlc291cmNlUmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqQXJyYXkubGVuZ3RoKCk7IGkrKykgeworCQkJCQlnZXRSZXNvdXJjZUpTT05PYmplY3QgPSBqQXJyYXkuZ2V0SlNPTk9iamVjdChpKTsKKwkJCQkJU3RyaW5nIHJlc291cmNlVHlwZSA9IFJlc3BvbnNlUGFyc2VyLmdldFZhbHVlRnJvbUpzb25SZXNwb25zZShnZXRSZXNvdXJjZUpTT05PYmplY3QudG9TdHJpbmcoKSwKKwkJCQkJCQkicmVzb3VyY2VUeXBlIik7CisJCQkJCWlmIChyZXNvdXJjZVR5cGUuZXF1YWxzKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKSkgeworCQkJCQkJZ2V0UmVzb3VyY2VSZXNwb25zZS5zZXRSZXNwb25zZShnZXRSZXNvdXJjZUpTT05PYmplY3QudG9TdHJpbmcoKSk7CisJCQkJCQlzZXRSZXNvdXJjZVVuaXF1ZUlkQW5kVVVJRChyZXNvdXJjZSwgZ2V0UmVzb3VyY2VSZXNwb25zZSk7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInN1Y2NlZWRlZCB0byBnZXQgcmVzb3VyY2UiKTsKKwkJCQkJCXJldHVybiBnZXRSZXNvdXJjZVJlc3BvbnNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZXNwb25zZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0U2VydmljZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlLCBVc2VyIHVzZXIpIHsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcCgzNTAwKTsKKwkJCVJlc3RSZXNwb25zZSBnZXRTZXJ2aWNlUmVzcG9uc2UgPSBTZXJ2aWNlUmVzdFV0aWxzLmdldFNlcnZpY2VCeU5hbWVBbmRWZXJzaW9uKHVzZXIsIHNlcnZpY2UuZ2V0TmFtZSgpLAorCQkJCQlzZXJ2aWNlLmdldFZlcnNpb24oKSk7CisJCQlpZiAoZ2V0U2VydmljZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gMjAwKSB7CisJCQkJc2V0UmVzb3VyY2VVbmlxdWVJZEFuZFVVSUQoc2VydmljZSwgZ2V0U2VydmljZVJlc3BvbnNlKTsKKwkJCX0KKwkJCXJldHVybiBnZXRTZXJ2aWNlUmVzcG9uc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyBSZXN0UmVzcG9uc2UgZ2V0UHJvZHVjdChQcm9kdWN0UmVxRGV0YWlscyBwcm9kdWN0LCBVc2VyIHVzZXIpIHsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcCgzNTAwKTsKKwkJCVJlc3RSZXNwb25zZSBnZXRQcm9kdWN0UmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmdldFByb2R1Y3RCeU5hbWVBbmRWZXJzaW9uKHByb2R1Y3QuZ2V0TmFtZSgpLAorCQkJCQlwcm9kdWN0LmdldFZlcnNpb24oKSwgdXNlci5nZXRVc2VySWQoKSk7CisJCQlpZiAoZ2V0UHJvZHVjdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gMjAwKSB7CisJCQkJc2V0UmVzb3VyY2VVbmlxdWVJZEFuZFVVSUQocHJvZHVjdCwgZ2V0UHJvZHVjdFJlc3BvbnNlKTsKKwkJCX0KKwkJCXJldHVybiBnZXRQcm9kdWN0UmVzcG9uc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBbGxFbGVtZW50VmVyc2lvbnNGcm9tUmVzcG9uc2UoUmVzdFJlc3BvbnNlIGdldFJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9uc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQl0cnkgeworCQkJT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKworCQkJSlNPTk9iamVjdCBvYmplY3QgPSBuZXcgSlNPTk9iamVjdChnZXRSZXNvdXJjZS5nZXRSZXNwb25zZSgpKTsKKwkJCXZlcnNpb25zTWFwID0gbWFwcGVyLnJlYWRWYWx1ZShvYmplY3QuZ2V0KCJhbGxWZXJzaW9ucyIpLnRvU3RyaW5nKCksIE1hcC5jbGFzcyk7CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gdmVyc2lvbnNNYXA7CisKKwkJfQorCisJCXJldHVybiB2ZXJzaW9uc01hcDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRWxlbWVudFZlcnNpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gZWxlbWVudFZlcnNpb25zLCBib29sZWFuIGlzQmVmb3JlVGVzdCwgT2JqZWN0IGNsYXp6LAorCQkJVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IGVsZW1lbnRWZXJzaW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgc2luZ2xlVmVyc2lvbiA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCVN0cmluZyB1bmlxdWVJZCA9IGVsZW1lbnRWZXJzaW9ucy5nZXQoc2luZ2xlVmVyc2lvbik7CisJCQlSZXN0UmVzcG9uc2UgZGVsZXRlUmVzcG9uc2UgPSBudWxsOworCQkJaWYgKGNsYXp6IGluc3RhbmNlb2YgU2VydmljZVJlcURldGFpbHMpIHsKKwkJCQlkZWxldGVSZXNwb25zZSA9IFNlcnZpY2VSZXN0VXRpbHMuZGVsZXRlU2VydmljZUJ5SWQodW5pcXVlSWQsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJfSBlbHNlIGlmIChjbGF6eiBpbnN0YW5jZW9mIFJlc291cmNlUmVxRGV0YWlscykgeworCQkJCWRlbGV0ZVJlc3BvbnNlID0gUmVzb3VyY2VSZXN0VXRpbHMuZGVsZXRlUmVzb3VyY2UodW5pcXVlSWQsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJfSBlbHNlIGlmIChjbGF6eiBpbnN0YW5jZW9mIFByb2R1Y3RSZXFEZXRhaWxzKSB7CisJCQkJZGVsZXRlUmVzcG9uc2UgPSBQcm9kdWN0UmVzdFV0aWxzLmRlbGV0ZVByb2R1Y3QodW5pcXVlSWQsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJfQorCisJCQlpZiAoaXNCZWZvcmVUZXN0KSB7CisJCQkJYXNzZXJ0VHJ1ZShkZWxldGVSZXNwb25zZS5nZXRFcnJvckNvZGUoKS5pbnRWYWx1ZSgpID09IDIwNAorCQkJCQkJfHwgZGVsZXRlUmVzcG9uc2UuZ2V0RXJyb3JDb2RlKCkuaW50VmFsdWUoKSA9PSA0MDQpOworCQkJfSBlbHNlIHsKKwkJCQlhc3NlcnRUcnVlKGRlbGV0ZVJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gMjA0KTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxSZXNvdXJjZVZlcnNpb25zQWZ0ZXJUZXN0KENvbXBvbmVudFJlcURldGFpbHMgY29tcG9uZW50RGV0YWlscywKKwkJCVJlc3RSZXNwb25zZSBnZXRPYmplY3RSZXNwb25zZSwgVXNlciB1c2VyKSB7CisJCXRyeSB7CisJCQlkZWxldGVBbGxDb21wb25lbnRWZXJzaW9uKGZhbHNlLCBjb21wb25lbnREZXRhaWxzLCBnZXRPYmplY3RSZXNwb25zZSwgdXNlcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUFsbFJlc291cmNlVmVyc2lvbnNCZWZvcmVUZXN0KENvbXBvbmVudFJlcURldGFpbHMgY29tcG9uZW50RGV0YWlscywKKwkJCVJlc3RSZXNwb25zZSBnZXRPYmplY3RSZXNwb25zZSwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZGVsZXRlQWxsQ29tcG9uZW50VmVyc2lvbih0cnVlLCBjb21wb25lbnREZXRhaWxzLCBnZXRPYmplY3RSZXNwb25zZSwgdXNlcik7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUFsbENvbXBvbmVudFZlcnNpb24oYm9vbGVhbiBpc0JlZm9yZVRlc3QsIENvbXBvbmVudFJlcURldGFpbHMgY29tcG9uZW50RGV0YWlscywKKwkJCVJlc3RSZXNwb25zZSBnZXRPYmplY3RSZXNwb25zZSwgVXNlciB1c2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKGdldE9iamVjdFJlc3BvbnNlLmdldEVycm9yQ29kZSgpLmludFZhbHVlKCkgPT0gNDA0KQorCQkJcmV0dXJuOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXBvbmVudFZlcnNpb25zTWFwID0gZ2V0QWxsRWxlbWVudFZlcnNpb25zRnJvbVJlc3BvbnNlKGdldE9iamVjdFJlc3BvbnNlKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZy4uLiIpOworCQlkZWxldGVFbGVtZW50VmVyc2lvbnMoY29tcG9uZW50VmVyc2lvbnNNYXAsIGlzQmVmb3JlVGVzdCwgY29tcG9uZW50RGV0YWlscywgdXNlcik7CisJCWNvbXBvbmVudERldGFpbHMuc2V0VW5pcXVlSWQobnVsbCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3V0aWxpdGllcy9TZXJ2aWNlVUlVdGlscy5qYXZhIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvU2VydmljZVVJVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzI2MDhiCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy91dGlsaXRpZXMvU2VydmljZVVJVXRpbHMuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5hd3QuQVdURXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5EYXRhVGVzdElkRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5kYXRhdHlwZXMuRGF0YVRlc3RJZEVudW0uU3RlcHNFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlQ2F0ZWdvcmllc05hbWVFbnVtOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5TZXJ2aWNlUmVxRGV0YWlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNldHVwLlNldHVwQ0RUZXN0OworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnBhZ2VzLlNlcnZpY2VHZW5lcmFsUGFnZTsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLkJ5OworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uS2V5czsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkRyaXZlcjsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLldlYkVsZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5pbnRlcmFjdGlvbnMuQWN0aW9uczsKK2ltcG9ydCBvcmcub3BlbnFhLnNlbGVuaXVtLnN1cHBvcnQudWkuRXhwZWN0ZWRDb25kaXRpb25zOworaW1wb3J0IG9yZy5vcGVucWEuc2VsZW5pdW0uc3VwcG9ydC51aS5TZWxlY3Q7CitpbXBvcnQgb3JnLm9wZW5xYS5zZWxlbml1bS5zdXBwb3J0LnVpLldlYkRyaXZlcldhaXQ7CisKK2ltcG9ydCBjb20ucmVsZXZhbnRjb2Rlcy5leHRlbnRyZXBvcnRzLkxvZ1N0YXR1czsKKworcHVibGljIGNsYXNzIFNlcnZpY2VVSVV0aWxzIHsKKworCXByb3RlY3RlZCBzdGF0aWMgV2ViRHJpdmVyIGRyaXZlcjsKKworCXB1YmxpYyBTZXJ2aWNlVUlVdGlscyhUZXN0TmFtZSBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmaW5lU2VydmljZU5hbWUoU3RyaW5nIE5hbWUpIHsKKwkJV2ViRWxlbWVudCBzZXJ2aWNlTmFtZSA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgibmFtZSIpOworCQlzZXJ2aWNlTmFtZS5jbGVhcigpOworCQlzZXJ2aWNlTmFtZS5zZW5kS2V5cyhOYW1lKTsKKwkJcmV0dXJuIE5hbWU7CisJfQorCisJcHVibGljIHZvaWQgbW92ZVJlc291cmNlSW5zdGFuY2VUb0NhbnZhc1VJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8V2ViRWxlbWVudD4gbW92ZVJlc291cmNlID0gZHJpdmVyLmZpbmRFbGVtZW50cyhCeS5jbGFzc05hbWUoInNwcml0ZS1yZXNvdXJjZS1pY29ucyIpKTsKKwkJV2ViRWxlbWVudCBtb3ZlUmVzb3VyY2VUb0NhbnZhc1Jlc291cmNlT25lID0gbW92ZVJlc291cmNlLmdldCgwKTsKKwkJLy8gV2ViRWxlbWVudCBtb3ZlUmVzb3VyY2UgPQorCQkvLyBkcml2ZXIuZmluZEVsZW1lbnQoQnkuY2xhc3NOYW1lKCJzcHJpdGUtcmVzb3VyY2UtaWNvbnMiKSk7CisJCUFjdGlvbnMgYWN0aW9uID0gbmV3IEFjdGlvbnMoZHJpdmVyKTsKKwkJYWN0aW9uLm1vdmVUb0VsZW1lbnQobW92ZVJlc291cmNlVG9DYW52YXNSZXNvdXJjZU9uZSk7CisJCWFjdGlvbi5jbGlja0FuZEhvbGQobW92ZVJlc291cmNlVG9DYW52YXNSZXNvdXJjZU9uZSk7CisJCWFjdGlvbi5tb3ZlQnlPZmZzZXQoNjM1LCAzNzUpOworCQlhY3Rpb24ucmVsZWFzZSgpOworCQlhY3Rpb24ucGVyZm9ybSgpOworCQlXZWJFbGVtZW50IG1vdmVSZXNvdXJjZVRvQ2FudmFzUmVzb3VyY2VUd28gPSBtb3ZlUmVzb3VyY2UuZ2V0KDEpOworCQlhY3Rpb24ubW92ZVRvRWxlbWVudChtb3ZlUmVzb3VyY2VUb0NhbnZhc1Jlc291cmNlVHdvKTsKKwkJYWN0aW9uLmNsaWNrQW5kSG9sZChtb3ZlUmVzb3VyY2VUb0NhbnZhc1Jlc291cmNlVHdvKTsKKwkJYWN0aW9uLm1vdmVCeU9mZnNldCg1MzUsIDM3NSk7CisJCWFjdGlvbi5yZWxlYXNlKCk7CisJCWFjdGlvbi5wZXJmb3JtKCk7CisJCVdlYkVsZW1lbnQgbW92ZVJlc291cmNlVG9DYW52YXNSZXNvdXJjZVRyZWUgPSBtb3ZlUmVzb3VyY2UuZ2V0KDIpOworCQlhY3Rpb24ubW92ZVRvRWxlbWVudChtb3ZlUmVzb3VyY2VUb0NhbnZhc1Jlc291cmNlVHJlZSk7CisJCWFjdGlvbi5jbGlja0FuZEhvbGQobW92ZVJlc291cmNlVG9DYW52YXNSZXNvdXJjZVRyZWUpOworCQlhY3Rpb24ubW92ZUJ5T2Zmc2V0KDQzNSwgMzc1KTsKKwkJYWN0aW9uLnJlbGVhc2UoKTsKKwkJYWN0aW9uLnBlcmZvcm0oKTsKKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGFsb2dGaWx0ZXJTZXJ2aWNlQ2F0ZWdvcmllc0NoZWNCb3goU2VydmljZUNhdGVnb3JpZXNOYW1lRW51bSBlbnVtTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBUeXBlID0gbnVsbDsKKwkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW1OYW1lLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCXJldHVybiBUeXBlOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGNhdGFsb2dTZXJ2aWNlVHlwZUNoZWNCb3goU2VydmljZUNhdGVnb3JpZXNOYW1lRW51bSBlbnVtdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiBjYXRlZ29yaWVzID0gbnVsbDsKKwkJc3dpdGNoIChlbnVtdHlwZSkgeworCQljYXNlIE5FVFdPUktfTDEzOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW10eXBlLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgibmV0d29ya19sXzEtMyIpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUV09SS0w0OgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW10eXBlLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgibmV0d29ya19sXzQgIik7CisJCQlicmVhazsKKwkJY2FzZSBNT0JJTElUWToKKwkJCUdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZShlbnVtdHlwZS5nZXRWYWx1ZSgpKS5jbGljaygpOworCQkJY2F0ZWdvcmllcyA9IEFycmF5cy5hc0xpc3QoIm1vYmlsaXR5Iik7CisJCQlicmVhazsKKwkJY2FzZSBWT0lQQ0FMTF9DT05UUk9MOgorCQkJR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKGVudW10eXBlLmdldFZhbHVlKCkpLmNsaWNrKCk7CisJCQljYXRlZ29yaWVzID0gQXJyYXlzLmFzTGlzdCgiY2FsbF9jb250cm9sbCAiKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBjYXRlZ29yaWVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0VG9OZXh0QnV0dG9uRW5hYmxlZCgpIHsKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigiTmV4dCIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCB3YWl0VG9GaW5pc2hCdXR0b25FbmFibGVkKCkgeworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJGaW5pc2giKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgZGVsZXRlU2VydmljZUluVUkoKSB7CisKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFdlYkJ1dHRvbigiZGVsZXRlVmVyc2lvbiIpOworCX0KKworCS8vIGdldCB0aGUgc2VydmljZSB2aWV3IGRhdGEgZm9yIHZhbGlkYXRlLgorCS8vIGNyZWF0ZWQgYnkgdGVkeS4KKwlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U2VydmljZUdlbmVyYWxJbmZvKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsIFVzZXIgdXNlcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJVGhyZWFkLnNsZWVwKDIwMDApOworCQlTdHJpbmcgdmVyc2lvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QobnVsbCwgInZlcnNpb25IZWFkZXIiKS5nZXRGaXJzdFNlbGVjdGVkT3B0aW9uKCkuZ2V0VGV4dCgpCisJCQkJLnN1YnN0cmluZygxKTsKKwkJU3RyaW5nIG5hbWUgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoIm5hbWUiKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiZGVzY3JpcHRpb24iKS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7CisJCVN0cmluZyBjYXRlZ29yeSA9IEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QobnVsbCwgInNlbGVjdEdlbmVyYWxDYXRlZ29yeSIpLmdldEZpcnN0U2VsZWN0ZWRPcHRpb24oKQorCQkJCS5nZXRUZXh0KCk7CisJCUxpc3Q8V2ViRWxlbWVudD4gdGFncyA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5KCJpLXNkYy10YWctdGV4dCIpOworCQlTdHJpbmcgdHlwZSA9IEdlbmVyYWxVSVV0aWxzLndhaXRGb3JFbGVtZW50c0xpc3RWaXNpYmlsaXR5KCJ0eXBlIikuZ2V0KDEpLmdldFRleHQoKTsKKwkJaW50IGluZGV4ID0gdHlwZS5sYXN0SW5kZXhPZigiOiIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4odHlwZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKKwkJU3RyaW5nIGNvbnRhY3RJZCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiY29udGFjdElkIikuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworCQlTdHJpbmcgcHJvamVjdENvZGUgPSBHZW5lcmFsVUlVdGlscy5nZXRXZWJFbGVtZW50V2FpdEZvclZpc2libGUoInByb2plY3RDb2RlIikuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5nZXRWZXJzaW9uKCkpOworCQlhc3NlcnRUcnVlKHNlcnZpY2UuZ2V0VmVyc2lvbigpLmVxdWFscyh2ZXJzaW9uKSk7CisJCWFzc2VydFRydWUoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKTsKKwkJYXNzZXJ0VHJ1ZShzZXJ2aWNlLmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKGRlc2NyaXB0aW9uKSk7CisJCWFzc2VydFRydWUoc2VydmljZS5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKS5lcXVhbHMoY2F0ZWdvcnkpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuZ2V0Q29udGFjdElkKCkpOworCQlhc3NlcnRUcnVlKHNlcnZpY2UuZ2V0Q29udGFjdElkKCkuZXF1YWxzKGNvbnRhY3RJZCkpOworCQlhc3NlcnRUcnVlKHNlcnZpY2UuZ2V0UHJvamVjdENvZGUoKS5lcXVhbHMocHJvamVjdENvZGUpKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLnNpemUoKTsgaSsrKSB7CisJCQlhc3NlcnRFcXVhbHMoc2VydmljZS5nZXRUYWdzKCkuZ2V0KGkpLCB0YWdzLmdldChpKS5nZXRUZXh0KCkpOworCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lVGFnc0xpc3QoU2VydmljZVJlcURldGFpbHMgc2VydmljZSwgU3RyaW5nW10gc2VydmljZVRhZ3MpIHsKKwkJTGlzdDxTdHJpbmc+IHRhZ2xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJOworCQlXZWJFbGVtZW50IHNlcnZpY2VUYWdzVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiaS1zZGMtdGFnLWlucHV0Iik7CisJCWZvciAoU3RyaW5nIHRhZyA6IHNlcnZpY2VUYWdzKSB7CisJCQlzZXJ2aWNlVGFnc1RleHRib3guY2xlYXIoKTsKKwkJCXNlcnZpY2VUYWdzVGV4dGJveC5zZW5kS2V5cyh0YWcpOworCQkJc2VydmljZVRhZ3NUZXh0Ym94LnNlbmRLZXlzKEtleXMuRU5URVIpOworCQkJdGFnbGlzdC5hZGQodGFnKTsKKwkJfQorCQl0YWdsaXN0LmFkZCgwLCBzZXJ2aWNlLmdldE5hbWUoKSk7CisJCXNlcnZpY2Uuc2V0VGFncyh0YWdsaXN0KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlbGVjdCBkZWZpbmVTZXJ2aWNlQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7CisKKwkJcmV0dXJuIEdlbmVyYWxVSVV0aWxzLmdldFNlbGVjdExpc3QoY2F0ZWdvcnksICJzZWxlY3RHZW5lcmFsQ2F0ZWdvcnkiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2VydmljZVByb2plY3RDb2RlKFN0cmluZyBwcm9qZWN0Q29kZSkgeworCQlXZWJFbGVtZW50IHByb2plY3RDb2RlVGV4dGJveCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgicHJvamVjdENvZGUiKTsKKwkJcHJvamVjdENvZGVUZXh0Ym94LmNsZWFyKCk7CisJCXByb2plY3RDb2RlVGV4dGJveC5zZW5kS2V5cyhwcm9qZWN0Q29kZSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdFJhbmRvbVJlc291cmNlSWNvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHZW5lcmFsVUlVdGlscy5tb3ZlVG9TdGVwKFN0ZXBzRW51bS5JQ09OKTsKKwkJV2ViRHJpdmVyV2FpdCB3YWl0ID0gbmV3IFdlYkRyaXZlcldhaXQoZHJpdmVyLCA2KTsKKwkJd2FpdC51bnRpbChFeHBlY3RlZENvbmRpdGlvbnMudmlzaWJpbGl0eU9mRWxlbWVudExvY2F0ZWQoQnkueHBhdGgoIi8vKltjb250YWlucyhAZGF0YS10ZXN0cy1pZCwgJ2ljb25Cb3gnKV0iKSkpOworCQlMaXN0PFdlYkVsZW1lbnQ+IGljb25FbGVtZW50ID0gZHJpdmVyLmZpbmRFbGVtZW50cyhCeS54cGF0aCgiLy8qW2NvbnRhaW5zKEBkYXRhLXRlc3RzLWlkLCAnaWNvbkJveCcpXSIpKTsKKwkJaWNvbkVsZW1lbnQuZ2V0KDApLmNsaWNrKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmaW5lRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCVdlYkVsZW1lbnQgZGVzY3JpcHRpb25UZXh0Ym94ID0gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViRWxlbWVudFdhaXRGb3JWaXNpYmxlKCJkZXNjcmlwdGlvbiIpOworCQlkZXNjcmlwdGlvblRleHRib3guY2xlYXIoKTsKKwkJZGVzY3JpcHRpb25UZXh0Ym94LnNlbmRLZXlzKGRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVDb250YWN0SWQoU3RyaW5nIHVzZXJJZCkgeworCQlXZWJFbGVtZW50IGNvbnRhY3RJZCA9IEdlbmVyYWxVSVV0aWxzLmdldFdlYkVsZW1lbnRXYWl0Rm9yVmlzaWJsZSgiY29udGFjdElkIik7CisJCWNvbnRhY3RJZC5jbGVhcigpOworCQljb250YWN0SWQuc2VuZEtleXModXNlcklkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFdlYkVsZW1lbnQgY2xpY2tBZGRBcnRpZmFjdCgpIHsKKworCQlyZXR1cm4gR2VuZXJhbFVJVXRpbHMuZ2V0V2ViQnV0dG9uKCJhZGRBcnRpZmFjdEJ1dHRvbiIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBnZXRBcnRpZmFjdE5hbWUoKSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oImFydGlmYWN0TmFtZSIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgV2ViRWxlbWVudCBnZXRBcnRpZmFjdERldGFpbHMoKSB7CisJCXJldHVybiBHZW5lcmFsVUlVdGlscy5nZXRXZWJCdXR0b24oImFydGlmYWN0RGlzcGxheU5hbWUiKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbFNlcnZpY2VHZW5lcmFsUGFnZShTZXJ2aWNlUmVxRGV0YWlscyBzZXJ2aWNlLCBVc2VyIHVzZXIpIHRocm93cyBFeGNlcHRpb24geworCQlTZXJ2aWNlR2VuZXJhbFBhZ2UuZGVmaW5lTmFtZShzZXJ2aWNlLmdldE5hbWUoKSk7CisJCVNlcnZpY2VHZW5lcmFsUGFnZS5kZWZpbmVEZXNjcmlwdGlvbihzZXJ2aWNlLmdldERlc2NyaXB0aW9uKCkpOworCQlTZXJ2aWNlR2VuZXJhbFBhZ2UuZGVmaW5lQ2F0ZWdvcnkoc2VydmljZS5nZXRDYXRlZ29yaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCVNlcnZpY2VHZW5lcmFsUGFnZS5kZWZpbmVQcm9qZWN0Q29kZShzZXJ2aWNlLmdldFByb2plY3RDb2RlKCkpOworCQlTZXJ2aWNlR2VuZXJhbFBhZ2UuZGVmaW5lVGFnc0xpc3Qoc2VydmljZSwgbmV3IFN0cmluZ1tdIHsgIlRoaXMtaXMtdGFnIiwgImFub3RoZXItdGFnIiB9KTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTZXJ2aWNlKFNlcnZpY2VSZXFEZXRhaWxzIHNlcnZpY2UsIFVzZXIgdXNlcikgdGhyb3dzIEV4Y2VwdGlvbiwgQVdURXhjZXB0aW9uIHsKKworCQlSZXNvdXJjZVVJVXRpbHMubW92ZVRvSFRNTEVsZW1lbnRCeUNsYXNzTmFtZSgidy1zZGMtZGFzaGJvYXJkLWNhcmQtbmV3Iik7CisJCVJlc291cmNlVUlVdGlscy5jbGlja09uSFRNTEVsZW1lbnRCeURhdGFUZXN0SWQoRGF0YVRlc3RJZEVudW0uRGFzaGJvYXJkLkJVVFRPTl9BRERfU0VSVklDRS5nZXRWYWx1ZSgpKTsKKwkJR2VuZXJhbFVJVXRpbHMud2FpdEZvckxvYWRlcigpOworCQlmaWxsU2VydmljZUdlbmVyYWxQYWdlKHNlcnZpY2UsIHVzZXIpOworCQlHZW5lcmFsVUlVdGlscy5jbGlja0NyZWF0ZUJ1dHRvbigpOworCQlTZXR1cENEVGVzdC5nZXRFeHRlbmRUZXN0KCkubG9nKExvZ1N0YXR1cy5JTkZPLCBTdHJpbmcuZm9ybWF0KCJTZXJ2aWNlICVzIGNyZWF0ZWQiLCBzZXJ2aWNlLmdldE5hbWUoKSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy9jaS90ZXN0cy92ZXJpZmljYXRvci9TZXJ2aWNlVmVyaWZpY2F0b3IuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdmVyaWZpY2F0b3IvU2VydmljZVZlcmlmaWNhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhZDgwZAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdmVyaWZpY2F0b3IvU2VydmljZVZlcmlmaWNhdG9yLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnZlcmlmaWNhdG9yOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5Db21wb25lbnRSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLlNlcnZpY2VSZXFEZXRhaWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5SZXN0Q0RVdGlsczsKKworcHVibGljIGNsYXNzIFNlcnZpY2VWZXJpZmljYXRvciB7CisKKwlwcml2YXRlIFNlcnZpY2VWZXJpZmljYXRvcigpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5TnVtT2ZDb21wb25lbnRJbnN0YW5jZXMoQ29tcG9uZW50UmVxRGV0YWlscyBjb21wb25lbnQsIFN0cmluZyB2ZXJzaW9uLCBpbnQgbnVtT2ZWRkMsCisJCQlVc2VyIHVzZXIpIHsKKwkJU3RyaW5nIHJlc3BvbnNlQWZ0ZXJEcmFnID0gbnVsbDsKKwkJY29tcG9uZW50LnNldFZlcnNpb24odmVyc2lvbik7CisJCWlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlUmVxRGV0YWlscykgeworCQkJcmVzcG9uc2VBZnRlckRyYWcgPSBSZXN0Q0RVdGlscy5nZXRTZXJ2aWNlKChTZXJ2aWNlUmVxRGV0YWlscykgY29tcG9uZW50LCB1c2VyKS5nZXRSZXNwb25zZSgpOworCQl9IGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFJlc291cmNlUmVxRGV0YWlscykgeworCQkJcmVzcG9uc2VBZnRlckRyYWcgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZSgoUmVzb3VyY2VSZXFEZXRhaWxzKSBjb21wb25lbnQsIHVzZXIpLmdldFJlc3BvbnNlKCk7CisJCX0KKwkJSlNPTk9iamVjdCBqc29uUmVzb3VyY2UgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKHJlc3BvbnNlQWZ0ZXJEcmFnKTsKKwkJaW50IHNpemUgPSAoKEpTT05BcnJheSkganNvblJlc291cmNlLmdldCgiY29tcG9uZW50SW5zdGFuY2VzIikpLnNpemUoKTsKKwkJYXNzZXJ0VHJ1ZShzaXplID09IG51bU9mVkZDKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUxpbmtDcmVhdGVkKFNlcnZpY2VSZXFEZXRhaWxzIGNyZWF0ZVNlcnZpY2VJblVJLCBVc2VyIHVzZXIsIGludCBleHBlY3RlZFJlbGF0aW9uc1NpemUpIHsKKwkJU3RyaW5nIHJlc3BvbnNlQWZ0ZXJEcmFnID0gUmVzdENEVXRpbHMuZ2V0U2VydmljZShjcmVhdGVTZXJ2aWNlSW5VSSwgdXNlcikuZ2V0UmVzcG9uc2UoKTsKKwkJSlNPTk9iamVjdCBqc29uUmVzb3VyY2UgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKHJlc3BvbnNlQWZ0ZXJEcmFnKTsKKwkJYXNzZXJ0VHJ1ZSgoKEpTT05BcnJheSkganNvblJlc291cmNlLmdldCgiY29tcG9uZW50SW5zdGFuY2VzUmVsYXRpb25zIikpLnNpemUoKSA9PSBleHBlY3RlZFJlbGF0aW9uc1NpemUpOworCisJfQorCit9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3ZlcmlmaWNhdG9yL1ZmVmVyaWZpY2F0b3IuamF2YSBiL3VpLWNpL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvY2kvdGVzdHMvdmVyaWZpY2F0b3IvVmZWZXJpZmljYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZmRlNzUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL2NpL3Rlc3RzL3ZlcmlmaWNhdG9yL1ZmVmVyaWZpY2F0b3IuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKi0KKyAqID09PT09PT09PT09PUxJQ0VOU0VfU1RBUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTREMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQVQmVCBJbnRlbGxlY3R1YWwgUHJvcGVydHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT1MSUNFTlNFX0VORD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudmVyaWZpY2F0b3I7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVBhaXI7CitpbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmJlLm1vZGVsLkxpZmVjeWNsZVN0YXRlRW51bTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5iZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLmRhdGF0eXBlcy5SZXNvdXJjZVJlcURldGFpbHM7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZGF0YXR5cGVzLmVudW1zLkxpZmVDeWNsZVN0YXRlc0VudW07CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMucGFnZXMuUmVzb3VyY2VHZW5lcmFsUGFnZTsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlsaXRpZXMuUmVzb3VyY2VVSVV0aWxzOworaW1wb3J0IG9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxpdGllcy5SZXN0Q0RVdGlsczsKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy51dGlscy5yZXN0LlJlc3BvbnNlUGFyc2VyOworCitwdWJsaWMgZmluYWwgY2xhc3MgVmZWZXJpZmljYXRvciB7CisJcHJpdmF0ZSBWZlZlcmlmaWNhdG9yKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOdW1PZkNvbXBvbmVudEluc3RhbmNlcyhSZXNvdXJjZVJlcURldGFpbHMgY3JlYXRlUmVzb3VyY2VJblVJLCBpbnQgbnVtT2ZWRkMsIFVzZXIgdXNlcikgeworCQlTdHJpbmcgcmVzcG9uc2VBZnRlckRyYWcgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShjcmVhdGVSZXNvdXJjZUluVUksIHVzZXIpLmdldFJlc3BvbnNlKCk7CisJCUpTT05PYmplY3QganNvblJlc291cmNlID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShyZXNwb25zZUFmdGVyRHJhZyk7CisJCWludCBzaXplID0gKChKU09OQXJyYXkpIGpzb25SZXNvdXJjZS5nZXQoImNvbXBvbmVudEluc3RhbmNlcyIpKS5zaXplKCk7CisJCWFzc2VydFRydWUoc2l6ZSA9PSBudW1PZlZGQyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVJJTG9jYXRpb25DaGFuZ2VkKFJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUksCisJCQlJbW11dGFibGVQYWlyPFN0cmluZywgU3RyaW5nPiBwcmV2UklQb3MsIFVzZXIgdXNlcikgeworCisJCUltbXV0YWJsZVBhaXI8U3RyaW5nLCBTdHJpbmc+IGN1cnJSSVBvcyA9IFJlc291cmNlVUlVdGlscy5nZXRGaXJzdFJJUG9zKGNyZWF0ZVJlc291cmNlSW5VSSwgdXNlcik7CisJCWFzc2VydFRydWUoIXByZXZSSVBvcy5sZWZ0LmVxdWFscyhjdXJyUklQb3MubGVmdCkgfHwgIXByZXZSSVBvcy5yaWdodC5lcXVhbHMoY3VyclJJUG9zLnJpZ2h0KSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUxpbmtDcmVhdGVkKFJlc291cmNlUmVxRGV0YWlscyBjcmVhdGVSZXNvdXJjZUluVUksIFVzZXIgdXNlciwgaW50IGV4cGVjdGVkUmVsYXRpb25zU2l6ZSkgeworCQlTdHJpbmcgcmVzcG9uc2VBZnRlckRyYWcgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZShjcmVhdGVSZXNvdXJjZUluVUksIHVzZXIpLmdldFJlc3BvbnNlKCk7CisJCUpTT05PYmplY3QganNvblJlc291cmNlID0gKEpTT05PYmplY3QpIEpTT05WYWx1ZS5wYXJzZShyZXNwb25zZUFmdGVyRHJhZyk7CisJCWFzc2VydFRydWUoKChKU09OQXJyYXkpIGpzb25SZXNvdXJjZS5nZXQoImNvbXBvbmVudEluc3RhbmNlc1JlbGF0aW9ucyIpKS5zaXplKCkgPT0gZXhwZWN0ZWRSZWxhdGlvbnNTaXplKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlWRlVwZGF0ZWRJblVJKFJlc291cmNlUmVxRGV0YWlscyB2ZikgeworCQlhc3NlcnRUcnVlKHZmLmdldE5hbWUoKS5lcXVhbHMoUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXROYW1lVGV4dCgpKSk7CisJCWFzc2VydFRydWUodmYuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXREZXNjcmlwdGlvblRleHQoKSkpOworCQlhc3NlcnRUcnVlKHZmLmdldFZlbmRvck5hbWUoKS5lcXVhbHMoUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXRWZW5kb3JOYW1lVGV4dCgpKSk7CisJCWFzc2VydFRydWUodmYuZ2V0VmVuZG9yUmVsZWFzZSgpLmVxdWFscyhSZXNvdXJjZUdlbmVyYWxQYWdlLmdldFZlbmRvclJlbGVhc2VUZXh0KCkpKTsKKwkJYXNzZXJ0VHJ1ZSh2Zi5nZXRDb250YWN0SWQoKS5lcXVhbHMoUmVzb3VyY2VHZW5lcmFsUGFnZS5nZXRVc2VySWRDb250YWN0VGV4dCgpKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVZGVXBkYXRlZChSZXNvdXJjZVJlcURldGFpbHMgdmYsIFVzZXIgdXNlcikgeworCQlTdHJpbmcgcmVzcG9uc2UgPSBSZXN0Q0RVdGlscy5nZXRSZXNvdXJjZSh2ZiwgdXNlcikuZ2V0UmVzcG9uc2UoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNwb25zZVBhcnNlci5jb252ZXJ0UmVzb3VyY2VSZXNwb25zZVRvSmF2YU9iamVjdChyZXNwb25zZSk7CisJCWFzc2VydFRydWUodmYuZ2V0TmFtZSgpLmVxdWFscyhyZXNvdXJjZS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZSh2Zi5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhyZXNvdXJjZS5nZXREZXNjcmlwdGlvbigpKSk7CisJCWFzc2VydFRydWUodmYuZ2V0Q2F0ZWdvcmllcygpLmVxdWFscyhyZXNvdXJjZS5nZXRDYXRlZ29yaWVzKCkpKTsKKwkJYXNzZXJ0VHJ1ZSh2Zi5nZXRWZW5kb3JOYW1lKCkuZXF1YWxzKHJlc291cmNlLmdldFZlbmRvck5hbWUoKSkpOworCQlhc3NlcnRUcnVlKHZmLmdldFZlbmRvclJlbGVhc2UoKS5lcXVhbHMocmVzb3VyY2UuZ2V0VmVuZG9yUmVsZWFzZSgpKSk7CisJCWFzc2VydFRydWUodmYuZ2V0VGFncygpLmVxdWFscyhyZXNvdXJjZS5nZXRUYWdzKCkpKTsKKwkJYXNzZXJ0VHJ1ZSh2Zi5nZXRDb250YWN0SWQoKS5lcXVhbHMocmVzb3VyY2UuZ2V0Q29udGFjdElkKCkpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5VkZMaWZlY3ljbGUoUmVzb3VyY2VSZXFEZXRhaWxzIHZmLCBVc2VyIHVzZXIsIExpZmVjeWNsZVN0YXRlRW51bSBleHBlY3RlZExpZmVjeWNsZVN0YXRlKSB7CisJCVN0cmluZyByZXNwb25zZUFmdGVyRHJhZyA9IFJlc3RDRFV0aWxzLmdldFJlc291cmNlKHZmLCB1c2VyKS5nZXRSZXNwb25zZSgpOworCQlKU09OT2JqZWN0IGpzb25SZXNvdXJjZSA9IChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UocmVzcG9uc2VBZnRlckRyYWcpOworCQlTdHJpbmcgYWN0dWFsTGlmZWN5Y2xlU3RhdGUgPSBqc29uUmVzb3VyY2UuZ2V0KCJsaWZlY3ljbGVTdGF0ZSIpLnRvU3RyaW5nKCk7CisJCWFzc2VydFRydWUoImFjdHVhbDogIiArIGFjdHVhbExpZmVjeWNsZVN0YXRlICsgIi0tZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZExpZmVjeWNsZVN0YXRlLAorCQkJCWV4cGVjdGVkTGlmZWN5Y2xlU3RhdGUubmFtZSgpLmVxdWFscyhhY3R1YWxMaWZlY3ljbGVTdGF0ZSkpOworCX0KK30KZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9Eb3dubG9hZHMvQ1BfV0FOLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9Eb3dubG9hZHMvQ1BfV0FOLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWFiYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0Rvd25sb2Fkcy9DUF9XQU4ueW1sCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9Eb3dubG9hZHMvRm9ydGlnYXRlMDJfdkZXX1ZGQy55bWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRG93bmxvYWRzL0ZvcnRpZ2F0ZTAyX3ZGV19WRkMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGQwMDQKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRG93bmxvYWRzL0ZvcnRpZ2F0ZTAyX3ZGV19WRkMueW1sCkBAIC0wLDAgKzEsNjMgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMudkZXLkZvcnRpZ2F0ZTAyVGVkeTogCisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy52RldUZWR5CisgICAgIAorICAgIHByb3BlcnRpZXM6IAorICAgICAgYXR0LXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkFUVC1Gb3J0aUdhdGUtVk0wMiIKKyAgICAgIHZlbmRvci1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDog4oCcRk9SVElORVTigJ0KKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJWTTAyIgorICAgICAgdmVuZG9yLW1vZGVsLWRlc2NyaXB0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZjcHUtZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZWZhdWx0OiAyCisgICAgICB2Y3B1LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZWZhdWx0OiAxCisgICAgICB2Y3B1LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZWZhdWx0OiAyCisgICAgICB2bWVtb3J5LWRlZmF1bHQ6CisgICAgICAgIGRlZmF1bHQ6IDQKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgCisgICAgICB2bWVtb3J5LXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdm1lbW9yeS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMQorICAgICAgdm1lbW9yeS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogNAorICAgICAgdmRpc2stZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZWZhdWx0OiAyMAorICAgICAgdmRpc2stdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2ZGlzay1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVmYXVsdDogMgorICAgICAgdmRpc2stbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlZmF1bHQ6IDIwCisgICAgICB2bmYtdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiDigJxBZHZhbmNlZCBGV+KAnQorICAgICAgc29mdHdhcmUtdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiDigJw1LjIuNOKAnQorICAgICAgc29mdHdhcmUtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bmYtZmVhdHVyZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiDigJxJUFMsIEFudGlWaXJ1cywgVVJMIEZpbHRlciwgQVBQSUTigJ0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiNTkyMgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUC55bWwKQEAgLTAsMCArMSw2NSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5DUDoKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIGF0dC11Y3BlLXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcgICAgICAgICAgICAgICAgCisgICAgICB2ZW5kb3ItbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nICAgICAgICAgICAgICAgIAorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgdmVuZG9yLW1vZGVsOgorICAgICAgICB0eXBlOiBzdHJpbmcgICAgICAgICAgICAgICAgCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICB0b3RhbC12Y3B1OgorICAgICAgICB0eXBlOiBpbnRlZ2VyICAgICAgICAgICAgICAKKyAgICAgICAgZGVzY3JpcHRpb246IG51bWJlciBvZiB2Q1BVcworICAgICAgdG90YWwtbWVtb3J5OgorICAgICAgICB0eXBlOiBpbnRlZ2VyICAgICAgICAgICAgICAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgdG90YWwtZGlzazoKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBiYXNlLXN5c3RlbS1pbWFnZS1maWxlLW5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGxpbnV4LWhvc3QtdmVuZG9yOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGxpbnV4LWhvc3Qtb3MtdmVyc2lvbjoKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgICAgYmFzZS1zeXN0ZW0tc29mdHdhcmU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgamRtLXZjcHU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIGpkbS1tZW1vcnk6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBqZG0tZGlzazoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIGpkbS12ZXJzaW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGpjcC12Y3B1OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBqY3AtbWVtb3J5OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamNwLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBqY3AtdmVyc2lvbjoKKyAgICAgICAgdHlwZTogdmVyc2lvbgorICAgIGNhcGFiaWxpdGllczogCisgICAgICB2bmZfaG9zdGluZzogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgZGVzY3JpcHRpb246IFByb3ZpZGVzIGhvc3RpbmcgY2FwYWJpbGl0eSBmb3IgVk5GcyAgIAorICAgICAgV0FOX2Nvbm5lY3Rpdml0eToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5jcC5XYW5dCisgICAgICAgIGRlc2NyaXB0aW9uOiBleHRlcm5hbCBXQU4xIG4vdyBpbnRlcmZhY2UKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLDJdCisgICAgICBMQU5fY29ubmVjdGl2aXR5OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLmNwLkxhbl0KKyAgICAgICAgZGVzY3JpcHRpb246IGV4dGVybmFsIExBTiBuL3cgaW50ZXJmYWNlCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSw4XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUFdpdGhBdHRyaWJ1dGVzLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUFdpdGhBdHRyaWJ1dGVzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDcxODFiCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQV2l0aEF0dHJpYnV0ZXMueW1sCkBAIC0wLDAgKzEsNzggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuQ1A6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBhdHQtdWNwZS1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nICAgICAgICAgICAgICAgIAorICAgICAgdmVuZG9yLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZyAgICAgICAgICAgICAgICAKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nICAgICAgICAgICAgICAgIAorICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgdG90YWwtdmNwdToKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgICAgICAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBudW1iZXIgb2YgdkNQVXMKKyAgICAgIHRvdGFsLW1lbW9yeToKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgICAgICAgIAorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIHRvdGFsLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgICAgICAgICAgCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgYmFzZS1zeXN0ZW0taW1hZ2UtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBsaW51eC1ob3N0LXZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBsaW51eC1ob3N0LW9zLXZlcnNpb246CisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgIGJhc2Utc3lzdGVtLXNvZnR3YXJlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGpkbS12Y3B1OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBqZG0tbWVtb3J5OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamRtLWRpc2s6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBqZG0tdmVyc2lvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBqY3AtdmNwdToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgamNwLW1lbW9yeToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIGpjcC1kaXNrOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamNwLXZlcnNpb246CisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIGNhcGFiaWxpdGllczogCisgICAgICB2bmZfaG9zdGluZzogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgZGVzY3JpcHRpb246IFByb3ZpZGVzIGhvc3RpbmcgY2FwYWJpbGl0eSBmb3IgVk5GcyAgIAorICAgICAgV0FOX2Nvbm5lY3Rpdml0eToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbb3JnLm9wZW5lY29tcC5jcC5XYW5dCisgICAgICAgIGRlc2NyaXB0aW9uOiBleHRlcm5hbCBXQU4xIG4vdyBpbnRlcmZhY2UKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLDJdCisgICAgICBMQU5fY29ubmVjdGl2aXR5OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLmNwLkxhbl0KKyAgICAgICAgZGVzY3JpcHRpb246IGV4dGVybmFsIExBTiBuL3cgaW50ZXJmYWNlCisgICAgICAgIG9jY3VycmVuY2VzOiBbMSw4XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9MQU4gLSBDb3B5LnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9MQU4gLSBDb3B5LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYzMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQX0xBTiAtIENvcHkueW1sCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9MQU4ueW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0NQX0xBTi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyMGEzYwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9MQU4ueW1sCkBAIC0wLDAgKzEsMTkgQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UuY3AuTEFOOgorICAgIGRlcml2ZWRfZnJvbTogb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5DUAorICAgIHByb3BlcnRpZXM6CisgICAgICB0eXBlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgcmVxdWlyZWQ6IGZhbHNlCisgICAgcmVxdWlyZW1lbnRzOgorICAgICAgLSB2aXJ0dWFsTGlua19pbjoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkxpbmtzVG8KKyAgICAgIC0gdmlydHVhbExpbmtfb3V0OgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuTGlua3NUbworICAgICAgLSB2aXJ0dWFsYmluZGluZzoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5uZXR3b3JrLkJpbmRzVG8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvQ1BfV0FOLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9DUF9XQU4ueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjFiOTAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvQ1BfV0FOLnltbApAQCAtMCwwICsxLDE5IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwMS5XQU46CisgICAgZGVyaXZlZF9mcm9tOiBvcmcub3BlbmVjb21wLnJlc291cmNlLmNwLkNQCisgICAgcHJvcGVydGllczoKKyAgICAgIHR5cGU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICByZXF1aXJlZDogZmFsc2UKKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIHZpcnR1YWxMaW5rX2luOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuTGlua3NUbworICAgICAgLSB2aXJ0dWFsTGlua19vdXQ6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuTGlua2FibGUKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMubmV0d29yay5MaW5rc1RvCisgICAgICAtIHZpcnR1YWxiaW5kaW5nOgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLm5ldHdvcmsuQmluZHNUbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ETlNzY2FsaW5nMTIuOC4xNi56aXAgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvRE5Tc2NhbGluZzEyLjguMTYuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGI2MTMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvRE5Tc2NhbGluZzEyLjguMTYuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUgMS55YW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0hlYXQtRmlsZSAxLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzMjA3OAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUgMS55YW1sCkBAIC0wLDAgKzEsNzkxIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ2hhbmdlcyBpbiB2MC4yOgorIyAgLSBVbmlxdWUgYXZhaWxhYmlsaXR5IHpvbmUgZm9yIGVhY2ggVk0KKyMgIC0gTEFOOCBhbmQgU0xBTiBuZXR3b3JrcyByZW1vdmVkIGFjY29yZGluZyB0byBsYXRlc3QgUHJvZC9UeXBlIEkgZGlhZ3JhbQorIyAgLSAyIERCIFZNcyBhZGRlZAorIyAgLSBJbWFnZXMgY29ycmVjdGVkCisjICAtIFZNIHN0YXJ0LXVwIG9yZGVyOiBTTVAtPkRCLT5CRS0+RkUgKG5vIGVycm9yIGhhbmRsaW5nIHlldCkKKyMgIC0gUHJvdmlzaW9uaW5nIHNjcmlwdHMgcGxhY2Vob2xkZXJzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVzY3JpcHRpb246IEFTQyBUZW1wbGF0ZQorCitwYXJhbWV0ZXJzOgorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9mZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9kYjE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTE6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTI6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTM6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9iZTQ6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisKKyAgdm5mX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBuYW1lIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhlX1NDUF9uYW1lCisgIHZuZl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIElEIGZvciB0aGlzIFZORiBpbnN0YW5jZQorICAgIGRlZmF1bHQ6IFRoaXNfaXNfdGhzX1NDUF9pZAorCisgIGZsYXZvcl9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBpbWFnZV9zY3BfYmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfYmUKKyAgaW1hZ2Vfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2ZlICAgIAorICBpbWFnZV9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2Vfc21wCisgIGltYWdlX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2RiCisKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjIgRkUgQ2x1c3Rlci9LQQorICBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazIgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjMgQ2x1c3RlcgorICBpbnRfdnNjcF9jbHVzdGVyX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazMgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IExBTjQgREIKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcms0IEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0EKKyAgU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQgorICBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIENSSUNLRVRfT0NTCisgIE9BTV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIE9BTQorICBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUyX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgMCBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgMSBTSUdUUkFOIGlwIGFkZHJlc3MKKyAgZmUxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgc21wMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBkYjAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc21wMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZGIxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICB2bV9zY3BfYmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTSAgICAKKyAgdm1fc2NwX2JlMl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUyCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlM19uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUzCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlNF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkU0CisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2ZlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfRkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc21wMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTTVAxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorCityZXNvdXJjZXM6CisjICBzY3BfYmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2JlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogNQorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2JlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc2NwX2ZlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9mZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9mZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNtcF93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzbXBfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzbXBfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBkYl93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBkYl93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIGRiX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorCisgIEZFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0gCisgIEJFX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgU01QX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgREJfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICAgICAgCisgIEZFX0NsdXN0ZXJpbmdfS0E6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9uZXRfaWQgfQorCisgIEZFX0NsdXN0ZXJpbmdfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkciB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfbmV0X2lkIH0KKworICBDbHVzdGVyaW5nX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9jaWRyIH0KKworICBEQl9OZXR3b3JrOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkIH0KKworICBEQl9OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHIgfQorCisgIHNlcnZlcl9zY3BfYmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKyAgYmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTFfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTI6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMiB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMl9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUyX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMl9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUzOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTMgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTNfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlM19wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTNfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlNDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmU0IH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmU0X3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTRfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTRfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmU0X3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTBfcG9ydF8wOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwc319XQorCisgIGZlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9mZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBzY3BfYmVfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9mZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9mZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9mZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBGRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8yIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9mZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBmZTFfcG9ydF8xOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX1NJR05FVF92cmZfQjFfZGlyZWN0X2lwc319XQorCisgIGZlMV9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IEZFX0NsdXN0ZXJpbmdfS0EgfQorCisgIGZlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgZmUxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZmUxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NtcDE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc21wMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc21wX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX3NtcDEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NtcF9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBTTVBfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IHNtcDFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NtcDFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc21wX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIHNtcDFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBzbXAxX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjAgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjFfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjFfT0FNX2RpcmVjdF9pcHN9fV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSGVhdC1GaWxlIDIueWFtbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9IZWF0LUZpbGUgMi55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzIwNzgKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSGVhdC1GaWxlIDIueWFtbApAQCAtMCwwICsxLDc5MSBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3RoZV9TQ1BfbmFtZQorICB2bmZfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBJRCBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3Roc19TQ1BfaWQKKworICBmbGF2b3Jfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3JfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgaW1hZ2Vfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2JlCisgIGltYWdlX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9mZSAgICAKKyAgaW1hZ2Vfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX3NtcAorICBpbWFnZV9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9kYgorCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4yIEZFIENsdXN0ZXIvS0EKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmsyIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4zIENsdXN0ZXIKKyAgaW50X3ZzY3BfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmszIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU40IERCCisgIGludF92c2NwX2RiX25ldHdvcmtfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrNCBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9BCisgIFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0IKKyAgQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBDUklDS0VUX09DUworICBPQU1fZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBPQU0KKyAgYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlM19PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZGIwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGRiMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgdm1fc2NwX2JlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0gICAgCisgIHZtX3NjcF9iZTJfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMgorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTNfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMworICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFNAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKworcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisgIGJlMF9wb3J0XzI6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTBfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUyOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTIgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTJfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTJfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMzoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUzIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUzX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTNfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTNfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUzX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTQ6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlNCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlNF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlNF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzAgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUwX3BvcnRfMDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHN9fV0KKworICBmZTBfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzEgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUxX3BvcnRfMToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHN9fV0KKworICBmZTFfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIxX09BTV9kaXJlY3RfaXBzfX1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0hlYXQtRmlsZS55YW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0hlYXQtRmlsZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzIwNzgKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSGVhdC1GaWxlLnlhbWwKQEAgLTAsMCArMSw3OTEgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMjoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMzoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlNDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKworICB2bmZfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIG5hbWUgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aGVfU0NQX25hbWUKKyAgdm5mX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgSUQgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aHNfU0NQX2lkCisKKyAgZmxhdm9yX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGltYWdlX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9iZQorICBpbWFnZV9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZmUgICAgCisgIGltYWdlX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9zbXAKKyAgaW1hZ2VfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZGIKKworICBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMiBGRSBDbHVzdGVyL0tBCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMiBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMyBDbHVzdGVyCisgIGludF92c2NwX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMyBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFONCBEQgorICBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazQgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQQorICBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9CCisgIENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgQ1JJQ0tFVF9PQ1MKKyAgT0FNX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgT0FNCisgIGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTJfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTNfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTRfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGRiMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBkYjEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHZtX3NjcF9iZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNICAgIAorICB2bV9zY3BfYmUyX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTIKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUzX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTMKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmU0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTQKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorICBiZTBfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMjoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUyIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUyX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTJfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTJfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUyX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTM6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMyB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlM19wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlM19wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmU0OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTQgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTRfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTRfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8wIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMF9wb3J0XzA6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8xIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMV9wb3J0XzE6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUxX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMV9PQU1fZGlyZWN0X2lwc319XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9JblZhbGlkX3Rvc2NhX0ZpbGUgLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9JblZhbGlkX3Rvc2NhX0ZpbGUgLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWVhMGExCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0luVmFsaWRfdG9zY2FfRmlsZSAueW1sCkBAIC0wLDAgKzEsMzQgQEAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSkRNX3ZmLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9KRE1fdmYueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2VkZDQKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSkRNX3ZmLnltbApAQCAtMCwwICsxLDU3IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmLkpETTogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBhdHQtcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWwtZGVzY3JpcHRpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmNwdS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgCisgICAgICB2bWVtb3J5LXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdm1lbW9yeS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZkaXNrLW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bmYtdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc29mdHdhcmUtdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc29mdHdhcmUtdmVyc2lvbi1zdGF0ZToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgc29mdHdhcmUtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bmYtZmVhdHVyZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHJlcXVpcmVtZW50czogCisgICAgICAtIGhvc3Q6CisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICAgIHJlbGF0aW9uc2hpcDogdG9zY2EucmVsYXRpb25zaGlwcy5Ib3N0ZWRPbgorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0pETV92ZmMueW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL0pETV92ZmMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzljYTAKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvSkRNX3ZmYy55bWwKQEAgLTAsMCArMSw1NyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMuSkRNOiAKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBwcm9wZXJ0aWVzOiAKKyAgICAgIGF0dC1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbC1kZXNjcmlwdGlvbjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2Y3B1LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyICAgICAgICAKKyAgICAgIHZtZW1vcnktdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2bWVtb3J5LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm1lbW9yeS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdmRpc2stbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZuZi10eXBlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBzb2Z0d2FyZS1maWxlLW5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZuZi1mZWF0dXJlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gaG9zdDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvU2FtcGxlX0NTQVIuY3NhciBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9TYW1wbGVfQ1NBUi5jc2FyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDFmZTgKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvU2FtcGxlX0NTQVIuY3NhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVUNQRV9WRkMueW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1VDUEVfVkZDLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM5NjZiCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1VDUEVfVkZDLnltbApAQCAtMCwwICsxLDY1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorICBvcmcub3BlbmVjb21wLnJlc291cmNlLnZmYy51Q1BFOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6IAorICAgICAgYXR0LXVjcGUtcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZyAgICAgICAgICAgICAgICAKKyAgICAgIHZlbmRvci1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcgICAgICAgICAgICAgICAgCisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICB2ZW5kb3ItbW9kZWw6CisgICAgICAgIHR5cGU6IHN0cmluZyAgICAgICAgICAgICAgICAKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKyAgICAgIHRvdGFsLXZjcHU6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgICAgICAgIAorICAgICAgICBkZXNjcmlwdGlvbjogbnVtYmVyIG9mIHZDUFVzCisgICAgICB0b3RhbC1tZW1vcnk6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgICAgICAgICAKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICB0b3RhbC1kaXNrOgorICAgICAgICB0eXBlOiBpbnRlZ2VyICAgICAgICAgICAgICAgIAorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIGJhc2Utc3lzdGVtLWltYWdlLWZpbGUtbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbGludXgtaG9zdC12ZW5kb3I6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbGludXgtaG9zdC1vcy12ZXJzaW9uOgorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICBiYXNlLXN5c3RlbS1zb2Z0d2FyZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBqZG0tdmNwdToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgamRtLW1lbW9yeToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIGpkbS1kaXNrOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICAgIGRlc2NyaXB0aW9uOiBHQgorICAgICAgamRtLXZlcnNpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgamNwLXZjcHU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIGpjcC1tZW1vcnk6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgICAgZGVzY3JpcHRpb246IEdCCisgICAgICBqY3AtZGlzazoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgICBkZXNjcmlwdGlvbjogR0IKKyAgICAgIGpjcC12ZXJzaW9uOgorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgY2FwYWJpbGl0aWVzOiAKKyAgICAgIHZuZl9ob3N0aW5nOiAKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkNvbnRhaW5lcgorICAgICAgICBkZXNjcmlwdGlvbjogUHJvdmlkZXMgaG9zdGluZyBjYXBhYmlsaXR5IGZvciBWTkZzICAgCisgICAgICBXQU5fY29ubmVjdGl2aXR5OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICB2YWxpZF9zb3VyY2VfdHlwZXM6IFtvcmcub3BlbmVjb21wLmNwLldhbl0KKyAgICAgICAgZGVzY3JpcHRpb246IGV4dGVybmFsIFdBTjEgbi93IGludGVyZmFjZQorICAgICAgICBvY2N1cnJlbmNlczogWzEsMl0KKyAgICAgIExBTl9jb25uZWN0aXZpdHk6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW29yZy5vcGVuZWNvbXAuY3AuTGFuXQorICAgICAgICBkZXNjcmlwdGlvbjogZXh0ZXJuYWwgTEFOIG4vdyBpbnRlcmZhY2UKKyAgICAgICAgb2NjdXJyZW5jZXM6IFsxLDhdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WRi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwODk5MAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WRi55bWwKQEAgLTAsMCArMSwxNyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi5WRkY6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczoKKyAgICAgIHZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgdmxfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgIGNhcGFiaWxpdGllczoKKyAgICAgICB2aXJ0dWFsX2xpbmthYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5MaW5rYWJsZQorCQkKKwkJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGQy55bWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVkZDLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNlZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZGQy55bWwKQEAgLTAsMCArMSw3NyBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMudlJvdXRlcjogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBhdHQtcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWwtZGVzY3JpcHRpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmNwdS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgCisgICAgICB2bWVtb3J5LXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdm1lbW9yeS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZkaXNrLW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bmYtdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc29mdHdhcmUtdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc29mdHdhcmUtdmVyc2lvbi1zdGF0ZToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgc29mdHdhcmUtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bmYtZmVhdHVyZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbWFuYWdlbWVudC12Ni1hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5tLWxhbi12Ni1hZGRyZXNzOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBubS1sYW4tdjYtcHJlZml4LWxlbmd0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBtYW5hZ2VtZW50LXY0LWFkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm0tbGFuLXY0LWFkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm0tbGFuLXY0LXByZWZpeC1sZW5ndGg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcm91dGluZy1pbnN0YW5jZS1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJvdXRpbmctaW5zdGFuY2VzOiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdHlwZTogbWFwCisgICAgICBlbnRyeV9zY2hlbWE6ICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBob3N0OgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICBvY2N1cnJlbmNlczogWzEsVU5CT1VOREVEXQorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZMLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WTC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlNmQyYgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WTC55bWwKQEAgLTAsMCArMSwxOCBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5WTDAwOgorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMubmV0d29yay5OZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIHZlbmRvcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorICAgICAgdmxfbmFtZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIHJlcXVpcmVkOiBmYWxzZQorCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgIHZpcnR1YWxfbGlua2FibGU6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkxpbmthYmxlCisgICAgICAgZW5kX3BvaW50OgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWQgeG1sLnhtbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WYWxpZCB4bWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjdlNDgKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWQgeG1sLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGRpcnM+Cis8ZW50cnkgbG9jPSJDOlxQcm9ncmFtIEZpbGVzXEphdmFcamRrMS43LjBfNzkiIHN0YW1wPSIxNDQ5MDc2NjE4NTE4Ii8+Cis8L2RpcnM+CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWRfdG9zY2FfTXljb21wdXRlLnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WYWxpZF90b3NjYV9NeWNvbXB1dGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWM1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvVmFsaWRfdG9zY2FfTXljb21wdXRlLnltbApAQCAtMCwwICsxLDM1IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorbm9kZV90eXBlczogCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmYuRGF0YWJhc2U6CisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgYXR0cmlidXRlczoKKyAgICAgIHByaXZhdGVfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBwdWJsaWNfYWRkcmVzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBuZXR3b3JrczoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5OZXR3b3JrSW5mbworICAgICAgcG9ydHM6CisgICAgICAgIHR5cGU6IG1hcAorICAgICAgICBlbnRyeV9zY2hlbWE6CisgICAgICAgICAgdHlwZTogdG9zY2EuZGF0YXR5cGVzLm5ldHdvcmsuUG9ydEluZm8KKyAgICByZXF1aXJlbWVudHM6CisgICAgICAtIGxvY2FsX3N0b3JhZ2U6IAorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5BdHRhY2htZW50CisgICAgICAgICAgbm9kZTogdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkF0dGFjaGVzVG8KKyAgICAgICAgICBvY2N1cnJlbmNlczogWzAsIFVOQk9VTkRFRF0gIAorICAgIGNhcGFiaWxpdGllczoKKyAgICAgIGhvc3Q6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgIHZhbGlkX3NvdXJjZV90eXBlczogW3Rvc2NhLm5vZGVzLlNvZnR3YXJlQ29tcG9uZW50XSAKKyAgICAgIGVuZHBvaW50IDoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLkVuZHBvaW50LkFkbWluIAorICAgICAgb3M6IAorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuT3BlcmF0aW5nU3lzdGVtCisgICAgICBzY2FsYWJsZToKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLlNjYWxhYmxlCisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL1ZhbGlkX3Rvc2NhX1JlcGxhY2VUZXN0LnltbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WYWxpZF90b3NjYV9SZXBsYWNlVGVzdC55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlNzcxZAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9WYWxpZF90b3NjYV9SZXBsYWNlVGVzdC55bWwKQEAgLTAsMCArMSwzNSBAQAordG9zY2FfZGVmaW5pdGlvbnNfdmVyc2lvbjogdG9zY2Ffc2ltcGxlX3lhbWxfMV8wXzAKK25vZGVfdHlwZXM6IAorICBvcmcub3BlbmVjb21wLnJlc291cmNlLlZGLk15Q29tcHV0ZToKKyAgICBkZXJpdmVkX2Zyb206IHRvc2NhLm5vZGVzLlJvb3QKKyAgICBhdHRyaWJ1dGVzOgorICAgICAgcHJpdmF0ZV9hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHB1YmxpY19hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5ldHdvcmtzOgorICAgICAgICB0eXBlOiBtYXAKKyAgICAgICAgZW50cnlfc2NoZW1hOgorICAgICAgICAgIHR5cGU6IHRvc2NhLmRhdGF0eXBlcy5uZXR3b3JrLk5ldHdvcmtJbmZvCisgICAgICBwb3J0czoKKyAgICAgICAgdHlwZTogbWFwCisgICAgICAgIGVudHJ5X3NjaGVtYToKKyAgICAgICAgICB0eXBlOiB0b3NjYS5kYXRhdHlwZXMubmV0d29yay5Qb3J0SW5mbworICAgIHJlcXVpcmVtZW50czoKKyAgICAgIC0gbG9jYWxfc3RvcmFnZTogCisgICAgICAgICAgY2FwYWJpbGl0eTogdG9zY2EuY2FwYWJpbGl0aWVzLkF0dGFjaG1lbnQKKyAgICAgICAgICBub2RlOiB0b3NjYS5ub2Rlcy5CbG9ja1N0b3JhZ2UKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuQXR0YWNoZXNUbworICAgICAgICAgIG9jY3VycmVuY2VzOiBbMCwgVU5CT1VOREVEXSAgCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgaG9zdDogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgdmFsaWRfc291cmNlX3R5cGVzOiBbdG9zY2Eubm9kZXMuU29mdHdhcmVDb21wb25lbnRdIAorICAgICAgZW5kcG9pbnQgOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuRW5kcG9pbnQuQWRtaW4gCisgICAgICBvczogCisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5PcGVyYXRpbmdTeXN0ZW0KKyAgICAgIHNjYWxhYmxlOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMuU2NhbGFibGUKKyAgICAgIGJpbmRpbmc6CisgICAgICAgIHR5cGU6IHRvc2NhLmNhcGFiaWxpdGllcy5uZXR3b3JrLkJpbmRhYmxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvYXNjX2hlYXQgMCAyLnlhbWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvYXNjX2hlYXQgMCAyLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzNTQ4NQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9hc2NfaGVhdCAwIDIueWFtbApAQCAtMCwwICsxLDc4NyBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENoYW5nZXMgaW4gdjAuMjoKKyMgIC0gVW5pcXVlIGF2YWlsYWJpbGl0eSB6b25lIGZvciBlYWNoIFZNCisjICAtIExBTjggYW5kIFNMQU4gbmV0d29ya3MgcmVtb3ZlZCBhY2NvcmRpbmcgdG8gbGF0ZXN0IFByb2QvVHlwZSBJIGRpYWdyYW0KKyMgIC0gMiBEQiBWTXMgYWRkZWQKKyMgIC0gSW1hZ2VzIGNvcnJlY3RlZAorIyAgLSBWTSBzdGFydC11cCBvcmRlcjogU01QLT5EQi0+QkUtPkZFIChubyBlcnJvciBoYW5kbGluZyB5ZXQpCisjICAtIFByb3Zpc2lvbmluZyBzY3JpcHRzIHBsYWNlaG9sZGVycworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Rlc2NyaXB0aW9uOiBBU0MgVGVtcGxhdGUKKworcGFyYW1ldGVyczoKKyMgIGF2YWlsYWJpbGl0eV96b25lX3NtcDA6CisjICAgIHR5cGU6IHN0cmluZworIyAgICBkZWZhdWx0OiBub3ZhCisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfZGIxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUxOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUyOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmUzOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfYmU0OgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorCisgIHZuZl9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3RoZV9TQ1BfbmFtZQorICB2bmZfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFVuaXF1ZSBJRCBmb3IgdGhpcyBWTkYgaW5zdGFuY2UKKyAgICBkZWZhdWx0OiBUaGlzX2lzX3Roc19TQ1BfaWQKKworICBmbGF2b3Jfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3JfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgaW1hZ2Vfc2NwX2JlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX2JlCisgIGltYWdlX3NjcF9mZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9mZSAgICAKKyAgaW1hZ2Vfc21wX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBJbWFnZSB1c2UgdG8gYm9vdCBhIHNlcnZlcgorICAgIGRlZmF1bHQ6IGFzY19iYXNlX2ltYWdlX3NtcAorICBpbWFnZV9kYl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9kYgorCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4yIEZFIENsdXN0ZXIvS0EKKyAgaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmsyIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2NsdXN0ZXJfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU4zIENsdXN0ZXIKKyAgaW50X3ZzY3BfY2x1c3Rlcl9jaWRyOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBQcml2YXRlIE5ldHdvcmszIEFkZHJlc3MgKENJRFIgbm90YXRpb24pCisgIGludF92c2NwX2RiX25ldHdvcmtfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBMQU40IERCCisgIGludF92c2NwX2RiX25ldHdvcmtfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrNCBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9BCisgIFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBTSUdUUkFOX0IKKyAgQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBDUklDS0VUX09DUworICBPQU1fZGlyZWN0X25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTmV0d29yayBuYW1lIGZvciBPQU0KKyAgYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMiBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlMl9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlM19PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTMgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGJlNF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTQgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMCBwb3J0IDAgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGZlMSBwb3J0IDEgU0lHVFJBTiBpcCBhZGRyZXNzCisgIGZlMV9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDAgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHNtcDFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIGRiMF9PQU1fZGlyZWN0X2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogZGIwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IHNtcDEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGRiMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgdm1fc2NwX2JlMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fc2NwX2JlMV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZTQ1BfQkUxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0gICAgCisgIHZtX3NjcF9iZTJfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMgorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTNfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMworICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFNAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9mZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0ZFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NtcDFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U01QMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX2RiMF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlZmF1bHQ6IHZEQjAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIxCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKworcmVzb3VyY2VzOgorIyAgc2NwX2JlX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNjcF9iZV93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDUKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNjcF9iZV93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIHNjcF9mZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfZmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfZmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzbXBfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc21wX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc21wX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgZGJfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogZGJfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiAyCisjICAgICAgdGltZW91dDogMzAwCisjICBkYl93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKworICBGRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdIAorICBCRV9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIFNNUF9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgIERCX0FmZmluaXR5OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXJHcm91cAorICAgIHByb3BlcnRpZXM6CisgICAgICBwb2xpY2llczogWyJhbnRpLWFmZmluaXR5Il0KKyAgICAgIAorICBGRV9DbHVzdGVyaW5nX0tBOgorICAgIHR5cGU6IE9TOjpDb250cmFpbDo6VmlydHVhbE5ldHdvcmsKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkIH0KKworICBGRV9DbHVzdGVyaW5nX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHIgfQorCisgIENsdXN0ZXJpbmdfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZCB9CisKKyAgQ2x1c3RlcmluZ19OZXR3b3JrX3N1Ym5ldDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6U3VibmV0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2NsdXN0ZXJfY2lkciB9CisKKyAgREJfTmV0d29yazoKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZCB9CisKKyAgREJfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyIH0KKworICBzZXJ2ZXJfc2NwX2JlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTBfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTE6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMV9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUxX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUyOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTJfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTIgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTJfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMl9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTJfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTJfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMzoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUzX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUzIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUzX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTNfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTNfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUzX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUzX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTQ6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlNF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlNCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlNF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmU0X3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlNF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlNF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzAgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUwX3BvcnRfMDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9TSUdORVRfdnJmX0ExX2RpcmVjdF9pcHN9fV0KKworICBmZTBfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTBfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfZmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogc2NwX2JlX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfZmUxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfZmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZmUxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfZmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogRkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzEgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMiB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfZmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZmUxX3BvcnRfMToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogU0lHTkVUX3ZyZl9CMV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9TSUdORVRfdnJmX0IxX2RpcmVjdF9pcHN9fV0KKworICBmZTFfcG9ydF8yOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBGRV9DbHVzdGVyaW5nX0tBIH0KKworICBmZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGZlMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGZlMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAwX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zbXAxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NtcDFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NtcF9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9zbXAxIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zbXBfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogU01QX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBzbXAxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zbXAxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NtcF93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBzbXAxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogc21wMV9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9kYjA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzX29uOiBzbXBfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX2RiMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2VfZGJfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfZGIwIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9kYl9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBEQl9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX2RiMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydkYl93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBkYjBfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBkYjBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBkYjBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIxX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIxX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIxX09BTV9kaXJlY3RfaXBzfX1dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtb2FtLXZvbHVtZXNfdjAuMy5lbnYgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvaG90LW5pbWJ1cy1vYW0tdm9sdW1lc192MC4zLmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDk0ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtb2FtLXZvbHVtZXNfdjAuMy5lbnYKQEAgLTAsMCArMSw2IEBACitwYXJhbWV0ZXJzOgorICBwY3JmX29hbV92b2xfc2l6ZTogNTAwCisgIHBjcmZfb2FtX3ZvbHVtZV9zaWx2ZXItMTogU2lsdmVyCisgIHBjcmZfb2FtX3ZvbHVtZV9zaWx2ZXItMjogU2lsdmVyCisgIHBjcmZfb2FtX3ZvbF9uYW1lXzE6IHNkZTEtcGNyZngwMS1vYW0wMDEtdm9sLTEKKyAgcGNyZl9vYW1fdm9sX25hbWVfMjogc2RlMS1wY3JmeDAxLW9hbTAwMS12b2wtMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLW9hbV92MC42LmVudiBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy9ob3QtbmltYnVzLW9hbV92MC42LmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtb2FtX3YwLjYuZW52CkBAIC0wLDAgKzEsMTggQEAKK3BhcmFtZXRlcnM6CisgIHBjcmZfb2FtX3NlcnZlcl9uYW1lczogWlJETTFQQ1JGMDFPQU0wMDEsWlJETTFQQ1JGMDFPQU0wMDIKKyAgcGNyZl9vYW1faW1hZ2VfbmFtZTogUENSRl84Ljk5NS1BVFRNMS4wLjMucWNvdzIKKyAgcGNyZl9vYW1fZmxhdm9yX25hbWU6IGxjLjR4bGFyZ2U0CisgIGF2YWlsYWJpbGl0eXpvbmVfbmFtZTogbm92YQorICBwY3JmX2Nwc19uZXRfbmFtZTogaW50X3BjcmZfbmV0XzAKKyAgcGNyZl9jcHNfbmV0X2lwczogMTcyLjI2LjE2LjExMSwxNzIuMjYuMTYuMTEyCisgIHBjcmZfYXJiaXRlcl92aXA6IDE3Mi4yNi4xNi4xMTUKKyAgcGNyZl9jcHNfbmV0X21hc2s6IDI1NS4yNTUuMjU1LjAKKyAgcGNyZl9vYW1fbmV0X25hbWU6IG9hbV9wcm90ZWN0ZWRfbmV0XzAKKyAgcGNyZl9vYW1fbmV0X2lwczogMTA3LjIzOS42NC4xMTcsMTA3LjIzOS42NC4xMTgKKyAgcGNyZl9vYW1fbmV0X2d3OiAxMDcuMjM5LjY0LjEKKyAgcGNyZl9vYW1fbmV0X21hc2s6IDI1NS4yNTUuMjQ4LjAKKyAgcGNyZl9vYW1fdm9sdW1lX2lkXzE6IGE0YWEwNWZiLWZjZGMtNDU3Yi04MDc3LTY4NDVmZGZjMzI1NworICBwY3JmX29hbV92b2x1bWVfaWRfMjogOTNkOGZjMWYtZjFjMy00OTMzLTg2YjItMDM5ODgxZWU5MTBmCisgIHBjcmZfc2VjdXJpdHlfZ3JvdXBfbmFtZTogbmltYnVzX3NlY3VyaXR5X2dyb3VwCisgIHBjcmZfdm5mX2lkOiA3MzA3OTcyMzRiNGE0MGFhOTkzMzUxNTdiMDI4NzFjZAorCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvaG90LW5pbWJ1cy1vYW1fdjAuNi55YW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtb2FtX3YwLjYueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjM2ZWJhCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtb2FtX3YwLjYueWFtbApAQCAtMCwwICsxLDEwOCBAQAoraGVhdF90ZW1wbGF0ZV92ZXJzaW9uOiAyMDEzLTA1LTIzCisKK2Rlc2NyaXB0aW9uOiBoZWF0IHRlbXBsYXRlIHRoYXQgY3JlYXRlcyBtdWx0aXBsZSBQQ1JGIE9BTSBub2RlcyBzdGFjaworCitwYXJhbWV0ZXJzOgorICBwY3JmX29hbV9zZXJ2ZXJfbmFtZXM6CisgICAgdHlwZTogY29tbWFfZGVsaW1pdGVkX2xpc3QKKyAgICBsYWJlbDogUENSRiBPQU0gc2VydmVyIG5hbWVzCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgdGhlIFBDUkYgT0FNIGluc3RhbmNlCisgIHBjcmZfb2FtX2ltYWdlX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IFBDUkYgT0FNIGltYWdlIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogUENSRiBPQU0gaW1hZ2UgbmFtZQorICBwY3JmX29hbV9mbGF2b3JfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogUENSRiBPQU0gZmxhdm9yIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIG5hbWUgb2YgUENSRiBPQU0gaW5zdGFuY2UKKyAgYXZhaWxhYmlsaXR5em9uZV9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBhdmFpbGFiaWxpdHl6b25lIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogYXZhaWxhYmlsaXR5em9uZSBuYW1lCisgIHBjcmZfY3BzX25ldF9uYW1lOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgbmV0d29yayBuYW1lCisgICAgZGVzY3JpcHRpb246IENQUyBuZXR3b3JrIG5hbWUKKyAgcGNyZl9jcHNfbmV0X2lwczoKKyAgICB0eXBlOiBjb21tYV9kZWxpbWl0ZWRfbGlzdAorICAgIGxhYmVsOiBDUFMgbmV0d29yayBpcHMKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgaXBzCisgIHBjcmZfY3BzX25ldF9tYXNrOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgbmV0d29yayBtYXNrCisgICAgZGVzY3JpcHRpb246IENQUyBuZXR3b3JrIG1hc2sKKyAgcGNyZl9hcmJpdGVyX3ZpcDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogT0FNIEFyYml0ZXIgTEIgVklQCisgICAgZGVzY3JpcHRpb246IE9BTSBBcmJpdGVyIExCIFZJUAorICBwY3JmX29hbV9uZXRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogT0FNIG5ldHdvcmsgbmFtZQorICAgIGRlc2NyaXB0aW9uOiBPQU0gbmV0d29yayBuYW1lCisgIHBjcmZfb2FtX25ldF9pcHM6CisgICAgdHlwZTogY29tbWFfZGVsaW1pdGVkX2xpc3QKKyAgICBsYWJlbDogT0FNIG5ldHdvcmsgaXBzCisgICAgZGVzY3JpcHRpb246IE9BTSBuZXR3b3JrIGlwcworICBwY3JmX29hbV9uZXRfZ3c6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IENQUyBuZXR3b3JrIGdhdGV3YXkKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgZ2F0ZXdheQorICBwY3JmX29hbV9uZXRfbWFzazoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogQ1BTIG5ldHdvcmsgbWFzaworICAgIGRlc2NyaXB0aW9uOiBDUFMgbmV0d29yayBtYXNrCisgIHBjcmZfb2FtX3ZvbHVtZV9pZF8xOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgT0FNIDAwMSBDaW5kZXIgVm9sdW1lCisgICAgZGVzY3JpcHRpb246IENQUyBPQU0gMDAxIENpbmRlciBWb2x1bWVzCisgIHBjcmZfb2FtX3ZvbHVtZV9pZF8yOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgT0FNIDAwMiBDaW5kZXIgVm9sdW1lCisgICAgZGVzY3JpcHRpb246IENQUyBPQU0gMDAyIENpbmRlciBWb2x1bWVzCisgIHBjcmZfc2VjdXJpdHlfZ3JvdXBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc2VjdXJpdHkgZ3JvdXAgbmFtZQorICAgIGRlc2NyaXB0aW9uOiB0aGUgbmFtZSBvZiBzZWN1cml0eSBncm91cAorICBwY3JmX3ZuZl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogUENSRiBWTkYgSWQKKyAgICBkZXNjcmlwdGlvbjogUENSRiBWTkYgSWQKKworcmVzb3VyY2VzOgorICBzZXJ2ZXJfcGNyZl9vYW1fMDAxOgorICAgIHR5cGU6IG5lc3RlZC1vYW1fdjAuMi55YW1sCisgICAgcHJvcGVydGllczoKKyAgICAgIHBjcmZfb2FtX3NlcnZlcl9uYW1lOiB7IGdldF9wYXJhbTogW3BjcmZfb2FtX3NlcnZlcl9uYW1lcywgMF0gfQorICAgICAgcGNyZl9vYW1faW1hZ2VfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfb2FtX2ltYWdlX25hbWUgfQorICAgICAgcGNyZl9vYW1fZmxhdm9yX25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9mbGF2b3JfbmFtZSB9CisgICAgICBhdmFpbGFiaWxpdHl6b25lX25hbWU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHl6b25lX25hbWUgfQorICAgICAgcGNyZl9zZWN1cml0eV9ncm91cF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9zZWN1cml0eV9ncm91cF9uYW1lIH0KKyAgICAgIHBjcmZfb2FtX3ZvbHVtZV9pZDogeyBnZXRfcGFyYW06IHBjcmZfb2FtX3ZvbHVtZV9pZF8xIH0KKyAgICAgIHBjcmZfY3BzX25ldF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9jcHNfbmV0X25hbWUgfQorICAgICAgcGNyZl9jcHNfbmV0X2lwOiB7IGdldF9wYXJhbTogW3BjcmZfY3BzX25ldF9pcHMsIDBdIH0KKyAgICAgIHBjcmZfY3BzX25ldF9tYXNrOiB7IGdldF9wYXJhbTogcGNyZl9jcHNfbmV0X21hc2sgfQorICAgICAgcGNyZl9vYW1fbmV0X25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfbmFtZSB9CisgICAgICBwY3JmX29hbV9uZXRfaXA6IHsgZ2V0X3BhcmFtOiBbcGNyZl9vYW1fbmV0X2lwcywgMF0gfQorICAgICAgcGNyZl9vYW1fbmV0X21hc2s6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfbWFzayB9CisgICAgICBwY3JmX29hbV9uZXRfZ3c6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfZ3cgfQorICAgICAgcGNyZl9hcmJpdGVyX3ZpcDogeyBnZXRfcGFyYW06IHBjcmZfYXJiaXRlcl92aXAgfQorICAgICAgcGNyZl92bmZfaWQ6IHtnZXRfcGFyYW06IHBjcmZfdm5mX2lkfQorCisgIHNlcnZlcl9wY3JmX29hbV8wMDI6CisgICAgdHlwZTogbmVzdGVkLW9hbV92MC4yLnlhbWwKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcGNyZl9vYW1fc2VydmVyX25hbWU6IHsgZ2V0X3BhcmFtOiBbcGNyZl9vYW1fc2VydmVyX25hbWVzLCAxXSB9CisgICAgICBwY3JmX29hbV9pbWFnZV9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9vYW1faW1hZ2VfbmFtZSB9CisgICAgICBwY3JmX29hbV9mbGF2b3JfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfb2FtX2ZsYXZvcl9uYW1lIH0KKyAgICAgIGF2YWlsYWJpbGl0eXpvbmVfbmFtZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eXpvbmVfbmFtZSB9CisgICAgICBwY3JmX3NlY3VyaXR5X2dyb3VwX25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX3NlY3VyaXR5X2dyb3VwX25hbWUgfQorICAgICAgcGNyZl9vYW1fdm9sdW1lX2lkOiB7IGdldF9wYXJhbTogcGNyZl9vYW1fdm9sdW1lX2lkXzIgfQorICAgICAgcGNyZl9jcHNfbmV0X25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX2Nwc19uZXRfbmFtZSB9CisgICAgICBwY3JmX2Nwc19uZXRfaXA6IHsgZ2V0X3BhcmFtOiBbcGNyZl9jcHNfbmV0X2lwcywgMV0gfQorICAgICAgcGNyZl9jcHNfbmV0X21hc2s6IHsgZ2V0X3BhcmFtOiBwY3JmX2Nwc19uZXRfbWFzayB9CisgICAgICBwY3JmX29hbV9uZXRfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfb2FtX25ldF9uYW1lIH0KKyAgICAgIHBjcmZfb2FtX25ldF9pcDogeyBnZXRfcGFyYW06IFtwY3JmX29hbV9uZXRfaXBzLCAxXSB9CisgICAgICBwY3JmX29hbV9uZXRfbWFzazogeyBnZXRfcGFyYW06IHBjcmZfb2FtX25ldF9tYXNrIH0KKyAgICAgIHBjcmZfb2FtX25ldF9ndzogeyBnZXRfcGFyYW06IHBjcmZfb2FtX25ldF9ndyB9CisgICAgICBwY3JmX2FyYml0ZXJfdmlwOiB7IGdldF9wYXJhbTogcGNyZl9hcmJpdGVyX3ZpcCB9CisgICAgICBwY3JmX3ZuZl9pZDoge2dldF9wYXJhbTogcGNyZl92bmZfaWR9CmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvaG90LW5pbWJ1cy1wY21fdjAuNi55YW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtcGNtX3YwLjYueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQxMDQxCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL2hvdC1uaW1idXMtcGNtX3YwLjYueWFtbApAQCAtMCwwICsxLDgwIEBACitoZWF0X3RlbXBsYXRlX3ZlcnNpb246IDIwMTMtMDUtMjMKKworZGVzY3JpcHRpb246IGhlYXQgdGVtcGxhdGUgdGhhdCBjcmVhdGVzIFBDUkYgQ2x1bWFuIHN0YWNrCisKK3BhcmFtZXRlcnM6CisgIHBjcmZfcGNtX3NlcnZlcl9uYW1lczoKKyAgICB0eXBlOiBjb21tYV9kZWxpbWl0ZWRfbGlzdAorICAgIGxhYmVsOiBQQ1JGIENNIHNlcnZlciBuYW1lcworICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIHRoZSBQQ1JGIENNIGluc3RhbmNlCisgIHBjcmZfcGNtX2ltYWdlX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IFBDUkYgQ00gaW1hZ2UgbmFtZQorICAgIGRlc2NyaXB0aW9uOiBQQ1JGIENNIGltYWdlIG5hbWUKKyAgcGNyZl9wY21fZmxhdm9yX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IFBDUkYgQ00gZmxhdm9yIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIG5hbWUgb2YgUENSRiBDTSBpbnN0YW5jZQorICBhdmFpbGFiaWxpdHl6b25lX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGF2YWlsYWJpbGl0eXpvbmUgbmFtZQorICAgIGRlc2NyaXB0aW9uOiBhdmFpbGFiaWxpdHl6b25lIG5hbWUKKyAgcGNyZl9jcHNfbmV0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IENQUyBuZXR3b3JrIG5hbWUKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgbmFtZQorICBwY3JmX2Nwc19uZXRfaXBzOgorICAgIHR5cGU6IGNvbW1hX2RlbGltaXRlZF9saXN0CisgICAgbGFiZWw6IENQUyBuZXR3b3JrIGlwcworICAgIGRlc2NyaXB0aW9uOiBDUFMgbmV0d29yayBpcHMKKyAgcGNyZl9jcHNfbmV0X21hc2s6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IENQUyBuZXR3b3JrIG1hc2sKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgbWFzaworICBwY3JmX29hbV9uZXRfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogT0FNIG5ldHdvcmsgbmFtZQorICAgIGRlc2NyaXB0aW9uOiBPQU0gbmV0d29yayBuYW1lCisgIHBjcmZfb2FtX25ldF9pcHM6CisgICAgdHlwZTogY29tbWFfZGVsaW1pdGVkX2xpc3QKKyAgICBsYWJlbDogT0FNIG5ldHdvcmsgaXBzCisgICAgZGVzY3JpcHRpb246IE9BTSBuZXR3b3JrIGlwcworICBwY3JmX29hbV9uZXRfZ3c6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IENQUyBuZXR3b3JrIGdhdGV3YXkKKyAgICBkZXNjcmlwdGlvbjogQ1BTIG5ldHdvcmsgZ2F0ZXdheQorICBwY3JmX29hbV9uZXRfbWFzazoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogQ1BTIG5ldHdvcmsgbWFzaworICAgIGRlc2NyaXB0aW9uOiBDUFMgbmV0d29yayBtYXNrCisgIHBjcmZfcGNtX3ZvbHVtZV9pZF8xOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBDUFMgQ2x1bWFuIENpbmRlciBWb2x1bWUKKyAgICBkZXNjcmlwdGlvbjogQ1BTIENsdW1hbiBDaW5kZXIgVm9sdW1lCisgIHBjcmZfc2VjdXJpdHlfZ3JvdXBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogc2VjdXJpdHkgZ3JvdXAgbmFtZQorICAgIGRlc2NyaXB0aW9uOiB0aGUgbmFtZSBvZiBzZWN1cml0eSBncm91cAorICBwY3JmX3ZuZl9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogUENSRiBWTkYgSWQKKyAgICBkZXNjcmlwdGlvbjogUENSRiBWTkYgSWQKKworcmVzb3VyY2VzOgorICBzZXJ2ZXJfcGNyZl9wY21fMDAxOgorICAgIHR5cGU6IG5lc3RlZC1wY21fdjAuMi55YW1sCisgICAgcHJvcGVydGllczoKKyAgICAgIHBjcmZfcGNtX3NlcnZlcl9uYW1lOiB7IGdldF9wYXJhbTogW3BjcmZfcGNtX3NlcnZlcl9uYW1lcywgMF0gfQorICAgICAgcGNyZl9wY21faW1hZ2VfbmFtZTogeyBnZXRfcGFyYW06IHBjcmZfcGNtX2ltYWdlX25hbWUgfQorICAgICAgcGNyZl9wY21fZmxhdm9yX25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX3BjbV9mbGF2b3JfbmFtZSB9CisgICAgICBhdmFpbGFiaWxpdHl6b25lX25hbWU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHl6b25lX25hbWUgfQorICAgICAgcGNyZl9zZWN1cml0eV9ncm91cF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9zZWN1cml0eV9ncm91cF9uYW1lIH0KKyAgICAgIHBjcmZfcGNtX3ZvbHVtZV9pZDogeyBnZXRfcGFyYW06IHBjcmZfcGNtX3ZvbHVtZV9pZF8xIH0KKyAgICAgIHBjcmZfY3BzX25ldF9uYW1lOiB7IGdldF9wYXJhbTogcGNyZl9jcHNfbmV0X25hbWUgfQorICAgICAgcGNyZl9jcHNfbmV0X2lwOiB7IGdldF9wYXJhbTogW3BjcmZfY3BzX25ldF9pcHMsIDBdIH0KKyAgICAgIHBjcmZfY3BzX25ldF9tYXNrOiB7IGdldF9wYXJhbTogcGNyZl9jcHNfbmV0X21hc2sgfQorICAgICAgcGNyZl9vYW1fbmV0X25hbWU6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfbmFtZSB9CisgICAgICBwY3JmX29hbV9uZXRfaXA6IHsgZ2V0X3BhcmFtOiBbcGNyZl9vYW1fbmV0X2lwcywgMF0gfQorICAgICAgcGNyZl9vYW1fbmV0X21hc2s6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfbWFzayB9CisgICAgICBwY3JmX29hbV9uZXRfZ3c6IHsgZ2V0X3BhcmFtOiBwY3JmX29hbV9uZXRfZ3cgfQorICAgICAgcGNyZl92bmZfaWQ6IHtnZXRfcGFyYW06IHBjcmZfdm5mX2lkfQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3NhbXBsZS14bWwtYWxsZGF0YS0xLTEueG1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3NhbXBsZS14bWwtYWxsZGF0YS0xLTEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MjNmNmIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvc2FtcGxlLXhtbC1hbGxkYXRhLTEtMS54bWwKQEAgLTAsMCArMSwyOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzxuczI6dm5mLWNhdGFsb2cgeG1sbnM6bnMyPSJodHRwOi8vY29tL2F0dC9jby9kYi1kZWZpbml0aW9uIj4KKwk8bnMyOnBhcnQtbnVtYmVyLWxpc3Q+CisJCTxuczI6cGFydC1udW1iZXI+RkctVk0wMCo8L25zMjpwYXJ0LW51bWJlcj4KKwkJPG5zMjp2bmYtdHlwZT5GVzwvbnMyOnZuZi10eXBlPgorCQk8bnMyOnZlbmRvci1pbmZvPgorCQkJPG5zMjp2ZW5kb3ItbmFtZT5GT1JUSU5FVDwvbnMyOnZlbmRvci1uYW1lPgorCQkJPG5zMjp2ZW5kb3ItcGFydC1udW1iZXI+RkctVk0wMCo8L25zMjp2ZW5kb3ItcGFydC1udW1iZXI+CisJCQk8bnMyOnZlbmRvci1tb2RlbD5WTTAwPC9uczI6dmVuZG9yLW1vZGVsPgorCQk8L25zMjp2ZW5kb3ItaW5mbz4KKwkJPG5zMjp2Y3B1PgorCQkJPG5zMjp2Y3B1LWRlZmF1bHQ+MTwvbnMyOnZjcHUtZGVmYXVsdD4KKwkJCTxuczI6dmNwdS1taW4+MTwvbnMyOnZjcHUtbWluPgorCQkJPG5zMjp2Y3B1LW1heD4xPC9uczI6dmNwdS1tYXg+CisJCTwvbnMyOnZjcHU+CisJCTxuczI6dm1lbW9yeT4KKwkJCTxuczI6dm1lbW9yeS1kZWZhdWx0PjE8L25zMjp2bWVtb3J5LWRlZmF1bHQ+CisJCQk8bnMyOnZtZW1vcnktdW5pdHM+R0I8L25zMjp2bWVtb3J5LXVuaXRzPgorCQkJPG5zMjp2bWVtb3J5LW1pbj4xPC9uczI6dm1lbW9yeS1taW4+CisJCQk8bnMyOnZtZW1vcnktbWF4PjE8L25zMjp2bWVtb3J5LW1heD4KKwkJPC9uczI6dm1lbW9yeT4KKwkJPG5zMjp2ZGlzaz4KKwkJCTxuczI6dmRpc2stZGVmYXVsdD4yMDwvbnMyOnZkaXNrLWRlZmF1bHQ+CisJCQk8bnMyOnZkaXNrLXVuaXRzPkdCPC9uczI6dmRpc2stdW5pdHM+CisJCQk8bnMyOnZkaXNrLW1pbj4yMDwvbnMyOnZkaXNrLW1pbj4KKwkJCTxuczI6dmRpc2stbWF4PjIwPC9uczI6dmRpc2stbWF4PgorCQk8L25zMjp2ZGlzaz4KKwkJPHNvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uPjUuMi40PC9zb2Z0d2FyZS12ZXJzaW9uPgorCQkJPHNvZnR3YXJlLXZlcnNpb24tc3RhdGU+MDwvc29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4KKwkJCTxzb2Z0d2FyZS1maWxlbmFtZT5mZy01LjIuNC5xY293PC9zb2Z0d2FyZS1maWxlbmFtZSA+CisJCTwvc29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQk8c29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQkJPHNvZnR3YXJlLXZlcnNpb24+NS4yLjM8L3NvZnR3YXJlLXZlcnNpb24+CisJCQk8c29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4xPC9zb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPgorCQkJPHNvZnR3YXJlLWZpbGVuYW1lPmZnLTUuMi4zLnFjb3c8L3NvZnR3YXJlLWZpbGVuYW1lID4KKwkJPC9zb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCTxzb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCQk8c29mdHdhcmUtdmVyc2lvbj41LjIuMjwvc29mdHdhcmUtdmVyc2lvbj4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPjI8L3NvZnR3YXJlLXZlcnNpb24tc3RhdGU+CisJCQk8c29mdHdhcmUtZmlsZW5hbWU+ZmctNS4yLjIucWNvdzwvc29mdHdhcmUtZmlsZW5hbWUgPgorCQk8L3NvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJPHZuZi1mZWF0dXJlcy1saXN0PgorCQkJPHZuZi1mZWF0dXJlPklQUy1JRFM8L3ZuZi1mZWF0dXJlPgorCQk8L3ZuZi1mZWF0dXJlcy1saXN0PgorCQk8dm5mLWZlYXR1cmVzLWxpc3Q+CisJCQk8dm5mLWZlYXR1cmU+VVJMRjwvdm5mLWZlYXR1cmU+CisJCTwvdm5mLWZlYXR1cmVzLWxpc3Q+CisJCTx2bmYtZmVhdHVyZXMtbGlzdD4KKwkJCTx2bmYtZmVhdHVyZT5BbnRpLVZpcnVzPC92bmYtZmVhdHVyZT4KKwkJPC92bmYtZmVhdHVyZXMtbGlzdD4KKwkJPHN1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQkJPHVjcGUtbW9kZWw+VTQwMTwvdWNwZS1tb2RlbCA+CisJCTwvc3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCTxzdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJCTx1Y3BlLW1vZGVsPlU0MTA8L3VjcGUtbW9kZWwgPgorCQk8L3N1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQk8c3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCQk8dWNwZS1tb2RlbD5VNDEyPC91Y3BlLW1vZGVsID4KKwkJPC9zdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwk8L25zMjpwYXJ0LW51bWJlci1saXN0PgorCTxuczI6cGFydC1udW1iZXItbGlzdD4KKwkJPG5zMjpwYXJ0LW51bWJlcj5GRy1WTTAxKjwvbnMyOnBhcnQtbnVtYmVyPgorCQk8bnMyOnZuZi10eXBlPkZXPC9uczI6dm5mLXR5cGU+CisJCTxuczI6dmVuZG9yLWluZm8+CisJCQk8bnMyOnZlbmRvci1uYW1lPiAgIEZPUlRJTkVUPC9uczI6dmVuZG9yLW5hbWU+CisJCQk8bnMyOnZlbmRvci1wYXJ0LW51bWJlcj5GRy1WTTAxKjwvbnMyOnZlbmRvci1wYXJ0LW51bWJlcj4KKwkJCTxuczI6dmVuZG9yLW1vZGVsPlZNMDE8L25zMjp2ZW5kb3ItbW9kZWw+CisJCTwvbnMyOnZlbmRvci1pbmZvPgorCQk8bnMyOnZjcHU+CisJCQk8bnMyOnZjcHUtZGVmYXVsdD4xPC9uczI6dmNwdS1kZWZhdWx0PgorCQkJPG5zMjp2Y3B1LW1pbj4xPC9uczI6dmNwdS1taW4+CisJCQk8bnMyOnZjcHUtbWF4PjE8L25zMjp2Y3B1LW1heD4KKwkJPC9uczI6dmNwdT4KKwkJPG5zMjp2bWVtb3J5PgorCQkJPG5zMjp2bWVtb3J5LWRlZmF1bHQ+MjwvbnMyOnZtZW1vcnktZGVmYXVsdD4KKwkJCTxuczI6dm1lbW9yeS11bml0cz5HQjwvbnMyOnZtZW1vcnktdW5pdHM+CisJCQk8bnMyOnZtZW1vcnktbWluPjE8L25zMjp2bWVtb3J5LW1pbj4KKwkJCTxuczI6dm1lbW9yeS1tYXg+MjwvbnMyOnZtZW1vcnktbWF4PgorCQk8L25zMjp2bWVtb3J5PgorCQk8bnMyOnZkaXNrPgorCQkJPG5zMjp2ZGlzay1kZWZhdWx0PjIwPC9uczI6dmRpc2stZGVmYXVsdD4KKwkJCTxuczI6dmRpc2stdW5pdHM+R0I8L25zMjp2ZGlzay11bml0cz4KKwkJCTxuczI6dmRpc2stbWluPjIwPC9uczI6dmRpc2stbWluPgorCQkJPG5zMjp2ZGlzay1tYXg+MjA8L25zMjp2ZGlzay1tYXg+CisJCTwvbnMyOnZkaXNrPgorCQk8c29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQkJPHNvZnR3YXJlLXZlcnNpb24+NS4yLjQ8L3NvZnR3YXJlLXZlcnNpb24+CisJCQk8c29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4wPC9zb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPgorCQkJPHNvZnR3YXJlLWZpbGVuYW1lPmZnLTUuMi40LnFjb3c8L3NvZnR3YXJlLWZpbGVuYW1lID4KKwkJPC9zb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCTxzb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCQk8c29mdHdhcmUtdmVyc2lvbj41LjIuMzwvc29mdHdhcmUtdmVyc2lvbj4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPjE8L3NvZnR3YXJlLXZlcnNpb24tc3RhdGU+CisJCQk8c29mdHdhcmUtZmlsZW5hbWU+ZmctNS4yLjMucWNvdzwvc29mdHdhcmUtZmlsZW5hbWUgPgorCQk8L3NvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJPHNvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uPjUuMi4yPC9zb2Z0d2FyZS12ZXJzaW9uPgorCQkJPHNvZnR3YXJlLXZlcnNpb24tc3RhdGU+Mjwvc29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4KKwkJCTxzb2Z0d2FyZS1maWxlbmFtZT5mZy01LjIuMi5xY293PC9zb2Z0d2FyZS1maWxlbmFtZSA+CisJCTwvc29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQk8dm5mLWZlYXR1cmVzLWxpc3Q+CisJCQk8dm5mLWZlYXR1cmU+SVBTLUlEUzwvdm5mLWZlYXR1cmU+CisJCTwvdm5mLWZlYXR1cmVzLWxpc3Q+CisJCTx2bmYtZmVhdHVyZXMtbGlzdD4KKwkJCTx2bmYtZmVhdHVyZT5VUkxGPC92bmYtZmVhdHVyZT4KKwkJPC92bmYtZmVhdHVyZXMtbGlzdD4KKwkJPHZuZi1mZWF0dXJlcy1saXN0PgorCQkJPHZuZi1mZWF0dXJlPkFudGktVmlydXM8L3ZuZi1mZWF0dXJlPgorCQk8L3ZuZi1mZWF0dXJlcy1saXN0PgorCQk8c3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCQk8dWNwZS1tb2RlbD5VNDAxPC91Y3BlLW1vZGVsID4KKwkJPC9zdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJPHN1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQkJPHVjcGUtbW9kZWw+VTQxMDwvdWNwZS1tb2RlbCA+CisJCTwvc3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCTxzdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJCTx1Y3BlLW1vZGVsPlU0MTI8L3VjcGUtbW9kZWwgPgorCQk8L3N1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCTwvbnMyOnBhcnQtbnVtYmVyLWxpc3Q+CisJPG5zMjpwYXJ0LW51bWJlci1saXN0PgorCQk8bnMyOnBhcnQtbnVtYmVyPkZHLVZNMDIqPC9uczI6cGFydC1udW1iZXI+CisJCTxuczI6dm5mLXR5cGU+Rlc8L25zMjp2bmYtdHlwZT4KKwkJPG5zMjp2ZW5kb3ItaW5mbz4KKwkJCTxuczI6dmVuZG9yLW5hbWU+ICAgRk9SVElORVQ8L25zMjp2ZW5kb3ItbmFtZT4KKwkJCTxuczI6dmVuZG9yLXBhcnQtbnVtYmVyPkZHLVZNMDIqPC9uczI6dmVuZG9yLXBhcnQtbnVtYmVyPgorCQkJPG5zMjp2ZW5kb3ItbW9kZWw+Vk0wMjwvbnMyOnZlbmRvci1tb2RlbD4KKwkJPC9uczI6dmVuZG9yLWluZm8+CisJCTxuczI6dmNwdT4KKwkJCTxuczI6dmNwdS1kZWZhdWx0PjI8L25zMjp2Y3B1LWRlZmF1bHQ+CisJCQk8bnMyOnZjcHUtbWluPjE8L25zMjp2Y3B1LW1pbj4KKwkJCTxuczI6dmNwdS1tYXg+MjwvbnMyOnZjcHUtbWF4PgorCQk8L25zMjp2Y3B1PgorCQk8bnMyOnZtZW1vcnk+CisJCQk8bnMyOnZtZW1vcnktZGVmYXVsdD40PC9uczI6dm1lbW9yeS1kZWZhdWx0PgorCQkJPG5zMjp2bWVtb3J5LXVuaXRzPkdCPC9uczI6dm1lbW9yeS11bml0cz4KKwkJCTxuczI6dm1lbW9yeS1taW4+MTwvbnMyOnZtZW1vcnktbWluPgorCQkJPG5zMjp2bWVtb3J5LW1heD40PC9uczI6dm1lbW9yeS1tYXg+CisJCTwvbnMyOnZtZW1vcnk+CisJCTxuczI6dmRpc2s+CisJCQk8bnMyOnZkaXNrLWRlZmF1bHQ+MjA8L25zMjp2ZGlzay1kZWZhdWx0PgorCQkJPG5zMjp2ZGlzay11bml0cz5HQjwvbnMyOnZkaXNrLXVuaXRzPgorCQkJPG5zMjp2ZGlzay1taW4+MjA8L25zMjp2ZGlzay1taW4+CisJCQk8bnMyOnZkaXNrLW1heD4yMDwvbnMyOnZkaXNrLW1heD4KKwkJPC9uczI6dmRpc2s+CisJCTxzb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCQk8c29mdHdhcmUtdmVyc2lvbj41LjIuNDwvc29mdHdhcmUtdmVyc2lvbj4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPjA8L3NvZnR3YXJlLXZlcnNpb24tc3RhdGU+CisJCQk8c29mdHdhcmUtZmlsZW5hbWU+ZmctNS4yLjQucWNvdzwvc29mdHdhcmUtZmlsZW5hbWUgPgorCQk8L3NvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJPHNvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uPjUuMi4zPC9zb2Z0d2FyZS12ZXJzaW9uPgorCQkJPHNvZnR3YXJlLXZlcnNpb24tc3RhdGU+MTwvc29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4KKwkJCTxzb2Z0d2FyZS1maWxlbmFtZT5mZy01LjIuMy5xY293PC9zb2Z0d2FyZS1maWxlbmFtZSA+CisJCTwvc29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQk8c29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQkJPHNvZnR3YXJlLXZlcnNpb24+NS4yLjI8L3NvZnR3YXJlLXZlcnNpb24+CisJCQk8c29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4yPC9zb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPgorCQkJPHNvZnR3YXJlLWZpbGVuYW1lPmZnLTUuMi4yLnFjb3c8L3NvZnR3YXJlLWZpbGVuYW1lID4KKwkJPC9zb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCTx2bmYtZmVhdHVyZXMtbGlzdD4KKwkJCTx2bmYtZmVhdHVyZT5JUFMtSURTPC92bmYtZmVhdHVyZT4KKwkJPC92bmYtZmVhdHVyZXMtbGlzdD4KKwkJPHZuZi1mZWF0dXJlcy1saXN0PgorCQkJPHZuZi1mZWF0dXJlPlVSTEY8L3ZuZi1mZWF0dXJlPgorCQk8L3ZuZi1mZWF0dXJlcy1saXN0PgorCQk8dm5mLWZlYXR1cmVzLWxpc3Q+CisJCQk8dm5mLWZlYXR1cmU+QW50aS1WaXJ1czwvdm5mLWZlYXR1cmU+CisJCTwvdm5mLWZlYXR1cmVzLWxpc3Q+CisJCTxzdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJCTx1Y3BlLW1vZGVsPlU0MDE8L3VjcGUtbW9kZWwgPgorCQk8L3N1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQk8c3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCQk8dWNwZS1tb2RlbD5VNDEwPC91Y3BlLW1vZGVsID4KKwkJPC9zdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJPHN1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQkJPHVjcGUtbW9kZWw+VTQxMjwvdWNwZS1tb2RlbCA+CisJCTwvc3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJPC9uczI6cGFydC1udW1iZXItbGlzdD4KKwk8bnMyOnBhcnQtbnVtYmVyLWxpc3Q+CisJCTxuczI6cGFydC1udW1iZXI+RkctVk0wNCo8L25zMjpwYXJ0LW51bWJlcj4KKwkJPG5zMjp2bmYtdHlwZT5GVzwvbnMyOnZuZi10eXBlPgorCQk8bnMyOnZlbmRvci1pbmZvPgorCQkJPG5zMjp2ZW5kb3ItbmFtZT5GT1JUSU5FVDwvbnMyOnZlbmRvci1uYW1lPgorCQkJPG5zMjp2ZW5kb3ItcGFydC1udW1iZXI+RkctVk0wNCo8L25zMjp2ZW5kb3ItcGFydC1udW1iZXI+CisJCQk8bnMyOnZlbmRvci1tb2RlbD5WTTA0PC9uczI6dmVuZG9yLW1vZGVsPgorCQk8L25zMjp2ZW5kb3ItaW5mbz4KKwkJPG5zMjp2Y3B1PgorCQkJPG5zMjp2Y3B1LWRlZmF1bHQ+NDwvbnMyOnZjcHUtZGVmYXVsdD4KKwkJCTxuczI6dmNwdS1taW4+MTwvbnMyOnZjcHUtbWluPgorCQkJPG5zMjp2Y3B1LW1heD40PC9uczI6dmNwdS1tYXg+CisJCTwvbnMyOnZjcHU+CisJCTxuczI6dm1lbW9yeT4KKwkJCTxuczI6dm1lbW9yeS1kZWZhdWx0PjY8L25zMjp2bWVtb3J5LWRlZmF1bHQ+CisJCQk8bnMyOnZtZW1vcnktdW5pdHM+R0I8L25zMjp2bWVtb3J5LXVuaXRzPgorCQkJPG5zMjp2bWVtb3J5LW1pbj4xPC9uczI6dm1lbW9yeS1taW4+CisJCQk8bnMyOnZtZW1vcnktbWF4PjY8L25zMjp2bWVtb3J5LW1heD4KKwkJPC9uczI6dm1lbW9yeT4KKwkJPG5zMjp2ZGlzaz4KKwkJCTxuczI6dmRpc2stZGVmYXVsdD4yMDwvbnMyOnZkaXNrLWRlZmF1bHQ+CisJCQk8bnMyOnZkaXNrLXVuaXRzPkdCPC9uczI6dmRpc2stdW5pdHM+CisJCQk8bnMyOnZkaXNrLW1pbj4yMDwvbnMyOnZkaXNrLW1pbj4KKwkJCTxuczI6dmRpc2stbWF4PjIwPC9uczI6dmRpc2stbWF4PgorCQk8L25zMjp2ZGlzaz4KKwkJPHNvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uPjUuMi40PC9zb2Z0d2FyZS12ZXJzaW9uPgorCQkJPHNvZnR3YXJlLXZlcnNpb24tc3RhdGU+MDwvc29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4KKwkJCTxzb2Z0d2FyZS1maWxlbmFtZT5mZy01LjIuNC5xY293PC9zb2Z0d2FyZS1maWxlbmFtZSA+CisJCTwvc29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQk8c29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQkJPHNvZnR3YXJlLXZlcnNpb24+NS4yLjM8L3NvZnR3YXJlLXZlcnNpb24+CisJCQk8c29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4xPC9zb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPgorCQkJPHNvZnR3YXJlLWZpbGVuYW1lPmZnLTUuMi4zLnFjb3c8L3NvZnR3YXJlLWZpbGVuYW1lID4KKwkJPC9zb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCTxzb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCQk8c29mdHdhcmUtdmVyc2lvbj41LjIuMjwvc29mdHdhcmUtdmVyc2lvbj4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPjI8L3NvZnR3YXJlLXZlcnNpb24tc3RhdGU+CisJCQk8c29mdHdhcmUtZmlsZW5hbWU+ZmctNS4yLjIucWNvdzwvc29mdHdhcmUtZmlsZW5hbWUgPgorCQk8L3NvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJPHZuZi1mZWF0dXJlcy1saXN0PgorCQkJPHZuZi1mZWF0dXJlPklQUy1JRFM8L3ZuZi1mZWF0dXJlPgorCQk8L3ZuZi1mZWF0dXJlcy1saXN0PgorCQk8dm5mLWZlYXR1cmVzLWxpc3Q+CisJCQk8dm5mLWZlYXR1cmU+VVJMRjwvdm5mLWZlYXR1cmU+CisJCTwvdm5mLWZlYXR1cmVzLWxpc3Q+CisJCTx2bmYtZmVhdHVyZXMtbGlzdD4KKwkJCTx2bmYtZmVhdHVyZT5BbnRpLVZpcnVzPC92bmYtZmVhdHVyZT4KKwkJPC92bmYtZmVhdHVyZXMtbGlzdD4KKwkJPHN1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQkJPHVjcGUtbW9kZWw+VTQwMTwvdWNwZS1tb2RlbCA+CisJCTwvc3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCTxzdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJCTx1Y3BlLW1vZGVsPlU0MTA8L3VjcGUtbW9kZWwgPgorCQk8L3N1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQk8c3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCQk8dWNwZS1tb2RlbD5VNDEyPC91Y3BlLW1vZGVsID4KKwkJPC9zdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwk8L25zMjpwYXJ0LW51bWJlci1saXN0PgorCTxuczI6cGFydC1udW1iZXItbGlzdD4KKwkJPG5zMjpwYXJ0LW51bWJlcj5GRy1WTTA4KjwvbnMyOnBhcnQtbnVtYmVyPgorCQk8bnMyOnZuZi10eXBlPkZXPC9uczI6dm5mLXR5cGU+CisJCTxuczI6dmVuZG9yLWluZm8+CisJCQk8bnMyOnZlbmRvci1uYW1lPkZPUlRJTkVUPC9uczI6dmVuZG9yLW5hbWU+CisJCQk8bnMyOnZlbmRvci1wYXJ0LW51bWJlcj5GRy1WTTA4KjwvbnMyOnZlbmRvci1wYXJ0LW51bWJlcj4KKwkJCTxuczI6dmVuZG9yLW1vZGVsPlZNMDg8L25zMjp2ZW5kb3ItbW9kZWw+CisJCTwvbnMyOnZlbmRvci1pbmZvPgorCQk8bnMyOnZjcHU+CisJCQk8bnMyOnZjcHUtZGVmYXVsdD44PC9uczI6dmNwdS1kZWZhdWx0PgorCQkJPG5zMjp2Y3B1LW1pbj4xPC9uczI6dmNwdS1taW4+CisJCQk8bnMyOnZjcHUtbWF4Pjg8L25zMjp2Y3B1LW1heD4KKwkJPC9uczI6dmNwdT4KKwkJPG5zMjp2bWVtb3J5PgorCQkJPG5zMjp2bWVtb3J5LWRlZmF1bHQ+MTI8L25zMjp2bWVtb3J5LWRlZmF1bHQ+CisJCQk8bnMyOnZtZW1vcnktdW5pdHM+R0I8L25zMjp2bWVtb3J5LXVuaXRzPgorCQkJPG5zMjp2bWVtb3J5LW1pbj4xPC9uczI6dm1lbW9yeS1taW4+CisJCQk8bnMyOnZtZW1vcnktbWF4PjEyPC9uczI6dm1lbW9yeS1tYXg+CisJCTwvbnMyOnZtZW1vcnk+CisJCTxuczI6dmRpc2s+CisJCQk8bnMyOnZkaXNrLWRlZmF1bHQ+MjA8L25zMjp2ZGlzay1kZWZhdWx0PgorCQkJPG5zMjp2ZGlzay11bml0cz5HQjwvbnMyOnZkaXNrLXVuaXRzPgorCQkJPG5zMjp2ZGlzay1taW4+MjA8L25zMjp2ZGlzay1taW4+CisJCQk8bnMyOnZkaXNrLW1heD4yMDwvbnMyOnZkaXNrLW1heD4KKwkJPC9uczI6dmRpc2s+CisJCTxzb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCQk8c29mdHdhcmUtdmVyc2lvbj41LjIuNDwvc29mdHdhcmUtdmVyc2lvbj4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPjA8L3NvZnR3YXJlLXZlcnNpb24tc3RhdGU+CisJCQk8c29mdHdhcmUtZmlsZW5hbWU+ZmctNS4yLjQucWNvdzwvc29mdHdhcmUtZmlsZW5hbWUgPgorCQk8L3NvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJPHNvZnR3YXJlLXZlcnNpb24tbGlzdD4KKwkJCTxzb2Z0d2FyZS12ZXJzaW9uPjUuMi4zPC9zb2Z0d2FyZS12ZXJzaW9uPgorCQkJPHNvZnR3YXJlLXZlcnNpb24tc3RhdGU+MTwvc29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4KKwkJCTxzb2Z0d2FyZS1maWxlbmFtZT5mZy01LjIuMy5xY293PC9zb2Z0d2FyZS1maWxlbmFtZSA+CisJCTwvc29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQk8c29mdHdhcmUtdmVyc2lvbi1saXN0PgorCQkJPHNvZnR3YXJlLXZlcnNpb24+NS4yLjI8L3NvZnR3YXJlLXZlcnNpb24+CisJCQk8c29mdHdhcmUtdmVyc2lvbi1zdGF0ZT4yPC9zb2Z0d2FyZS12ZXJzaW9uLXN0YXRlPgorCQkJPHNvZnR3YXJlLWZpbGVuYW1lPmZnLTUuMi4yLnFjb3c8L3NvZnR3YXJlLWZpbGVuYW1lID4KKwkJPC9zb2Z0d2FyZS12ZXJzaW9uLWxpc3Q+CisJCTx2bmYtZmVhdHVyZXMtbGlzdD4KKwkJCTx2bmYtZmVhdHVyZT5JUFMtSURTPC92bmYtZmVhdHVyZT4KKwkJPC92bmYtZmVhdHVyZXMtbGlzdD4KKwkJPHZuZi1mZWF0dXJlcy1saXN0PgorCQkJPHZuZi1mZWF0dXJlPlVSTEY8L3ZuZi1mZWF0dXJlPgorCQk8L3ZuZi1mZWF0dXJlcy1saXN0PgorCQk8dm5mLWZlYXR1cmVzLWxpc3Q+CisJCQk8dm5mLWZlYXR1cmU+QW50aS1WaXJ1czwvdm5mLWZlYXR1cmU+CisJCTwvdm5mLWZlYXR1cmVzLWxpc3Q+CisJCTxzdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJCTx1Y3BlLW1vZGVsPlU0MDE8L3VjcGUtbW9kZWwgPgorCQk8L3N1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQk8c3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJCQk8dWNwZS1tb2RlbD5VNDEwPC91Y3BlLW1vZGVsID4KKwkJPC9zdXBwb3J0ZWQtaGFyZHdhcmUtbGlzdD4KKwkJPHN1cHBvcnRlZC1oYXJkd2FyZS1saXN0PgorCQkJPHVjcGUtbW9kZWw+VTQxMjwvdWNwZS1tb2RlbCA+CisJCTwvc3VwcG9ydGVkLWhhcmR3YXJlLWxpc3Q+CisJPC9uczI6cGFydC1udW1iZXItbGlzdD4KKzwvbnMyOnZuZi1jYXRhbG9nPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92RldfOC4xMi4xNi56aXAgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdkZXXzguMTIuMTYuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmM1NmMKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdkZXXzguMTIuMTYuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92RldfVkYueW1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZGV19WRi55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwODgzZQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92RldfVkYueW1sCkBAIC0wLDAgKzEsNTggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKK25vZGVfdHlwZXM6CisKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52Zi52Rlc6IAorICAgIGRlcml2ZWRfZnJvbTogdG9zY2Eubm9kZXMuUm9vdAorICAgIHByb3BlcnRpZXM6IAorICAgICAgYXR0LXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1wYXJ0LW51bWJlcjoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWw6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW1vZGVsLWRlc2NyaXB0aW9uOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZjcHUtZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZjcHUtbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LWRlZmF1bHQ6CisgICAgICAgIHR5cGU6IGludGVnZXIgICAgICAgIAorICAgICAgdm1lbW9yeS11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZtZW1vcnktbWluOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bWVtb3J5LW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stdW5pdHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiR0IiCisgICAgICB2ZGlzay1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZkaXNrLW1heDoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdm5mLXR5cGU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHNvZnR3YXJlLXZlcnNpb246IAorICAgICAgICB0eXBlOiB2ZXJzaW9uCisgICAgICBzb2Z0d2FyZS12ZXJzaW9uLXN0YXRlOgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICBzb2Z0d2FyZS1maWxlLW5hbWU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZuZi1mZWF0dXJlOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgcmVxdWlyZW1lbnRzOiAKKyAgICAgIC0gaG9zdDoKKyAgICAgICAgICBjYXBhYmlsaXR5OiB0b3NjYS5jYXBhYmlsaXRpZXMuQ29udGFpbmVyCisgICAgICAgICAgcmVsYXRpb25zaGlwOiB0b3NjYS5yZWxhdGlvbnNoaXBzLkhvc3RlZE9uCisgICAgY2FwYWJpbGl0aWVzOgorICAgICAgYmluZGluZzoKKyAgICAgICAgdHlwZTogdG9zY2EuY2FwYWJpbGl0aWVzLm5ldHdvcmsuQmluZGFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdkZXX1ZGQy55bWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdkZXX1ZGQy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4MTRjNAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92RldfVkZDLnltbApAQCAtMCwwICsxLDU4IEBACit0b3NjYV9kZWZpbml0aW9uc192ZXJzaW9uOiB0b3NjYV9zaW1wbGVfeWFtbF8xXzBfMAorCitub2RlX3R5cGVzOgorCisgIG9yZy5vcGVuZWNvbXAucmVzb3VyY2UudmZjLnZGVzogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBhdHQtcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWwtZGVzY3JpcHRpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmNwdS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgCisgICAgICB2bWVtb3J5LXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdm1lbW9yeS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZkaXNrLW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bmYtdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc29mdHdhcmUtdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHZlcnNpb24KKyAgICAgIHNvZnR3YXJlLXZlcnNpb24tc3RhdGU6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHNvZnR3YXJlLWZpbGUtbmFtZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdm5mLWZlYXR1cmU6IAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBob3N0OgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92TEIxMi44LjE2LnppcCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92TEIxMi44LjE2LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjYxZTVhCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZMQjEyLjguMTYuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92Um91dGVyX3ZmYy55bWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdlJvdXRlcl92ZmMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmZlOTUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdlJvdXRlcl92ZmMueW1sCkBAIC0wLDAgKzEsNzggQEAKK3Rvc2NhX2RlZmluaXRpb25zX3ZlcnNpb246IHRvc2NhX3NpbXBsZV95YW1sXzFfMF8wCisKKworbm9kZV90eXBlczoKKyAgb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52ZmMudlJvdXRlcjogCisgICAgZGVyaXZlZF9mcm9tOiB0b3NjYS5ub2Rlcy5Sb290CisgICAgcHJvcGVydGllczogCisgICAgICBhdHQtcGFydC1udW1iZXI6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLW5hbWU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmVuZG9yLXBhcnQtbnVtYmVyOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZlbmRvci1tb2RlbDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2ZW5kb3ItbW9kZWwtZGVzY3JpcHRpb246CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdmNwdS1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2Y3B1LW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmNwdS1tYXg6CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktZGVmYXVsdDoKKyAgICAgICAgdHlwZTogaW50ZWdlciAgICAgICAgCisgICAgICB2bWVtb3J5LXVuaXRzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIkdCIgorICAgICAgdm1lbW9yeS1taW46CisgICAgICAgIHR5cGU6IGludGVnZXIKKyAgICAgIHZtZW1vcnktbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay1kZWZhdWx0OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2ZGlzay11bml0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICJHQiIKKyAgICAgIHZkaXNrLW1pbjoKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgdmRpc2stbWF4OgorICAgICAgICB0eXBlOiBpbnRlZ2VyCisgICAgICB2bmYtdHlwZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc29mdHdhcmUtdmVyc2lvbjogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc29mdHdhcmUtdmVyc2lvbi1zdGF0ZToKKyAgICAgICAgdHlwZTogaW50ZWdlcgorICAgICAgc29mdHdhcmUtZmlsZS1uYW1lOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bmYtZmVhdHVyZTogCisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbWFuYWdlbWVudC12Ni1hZGRyZXNzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIG5tLWxhbi12Ni1hZGRyZXNzOiAKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBubS1sYW4tdjYtcHJlZml4LWxlbmd0aDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBtYW5hZ2VtZW50LXY0LWFkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm0tbGFuLXY0LWFkZHJlc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm0tbGFuLXY0LXByZWZpeC1sZW5ndGg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcm91dGluZy1pbnN0YW5jZS1uYW1lOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHJvdXRpbmctaW5zdGFuY2VzOiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdHlwZTogbWFwCisgICAgICBlbnRyeV9zY2hlbWE6ICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICByZXF1aXJlbWVudHM6IAorICAgICAgLSBob3N0OgorICAgICAgICAgIGNhcGFiaWxpdHk6IHRvc2NhLmNhcGFiaWxpdGllcy5Db250YWluZXIKKyAgICAgICAgICByZWxhdGlvbnNoaXA6IHRvc2NhLnJlbGF0aW9uc2hpcHMuSG9zdGVkT24KKyAgICBjYXBhYmlsaXRpZXM6CisgICAgICBiaW5kaW5nOgorICAgICAgICB0eXBlOiB0b3NjYS5jYXBhYmlsaXRpZXMubmV0d29yay5CaW5kYWJsZQorICAgICAgICBvY2N1cnJlbmNlczogWzEsVU5CT1VOREVEXQorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZhbGlkIEhFQVRfRU5WIGZpbGVzLmVudiBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92YWxpZCBIRUFUX0VOViBmaWxlcy5lbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3NmMwZgotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9GaWxlcy92YWxpZCBIRUFUX0VOViBmaWxlcy5lbnYKQEAgLTAsMCArMSw1NCBAQAorcGFyYW1ldGVyczoKKyAgZmxhdm9yX3NjcF9iZV9pZDogbTEuc21hbGwKKyAgZmxhdm9yX3NjcF9mZV9pZDogbTEuc21hbGwKKyAgZmxhdm9yX3NtcF9pZDogbTEuc21hbGwKKyAgZmxhdm9yX2RiX2lkOiBtMS5zbWFsbAorICBpbWFnZV9zY3BfYmVfaWQ6IENDTElOVVgKKyAgaW1hZ2Vfc2NwX2ZlX2lkOiBDQ0xJTlVYCisgIGltYWdlX3NtcF9pZDogQ0NMSU5VWAorICBpbWFnZV9kYl9pZDogQ0NMSU5VWAorCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfbmV0X2lkOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldAorICBpbnRfdnNjcF9mZV9jbHVzdGVyX2NpZHI6IDE3Mi4yNi4yLjAvMjQKKyAgaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQ6IGludF92c2NwX2NsdXN0ZXJfbmV0CisgIGludF92c2NwX2NsdXN0ZXJfY2lkcjogMTcyLjI2LjMuMC8yNAorICBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZDogaW50X3ZzY3BfZGJfbmV0d29ya19uZXQKKyAgaW50X3ZzY3BfZGJfbmV0d29ya19jaWRyOiAxNzIuMjYuMS4wLzI0CisgIAorICBTSUdORVRfdnJmX0ExX2RpcmVjdF9uZXRfaWQ6IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldAorICBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQ6IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldAorICBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0CisjICBPQU1fZGlyZWN0X25ldF9pZDogT0FNX25ldAorIyAgT0FNX2RpcmVjdF9uZXRfaWQ6IG9hbS1kaXJlY3QtbmV0CisgIE9BTV9kaXJlY3RfbmV0X2lkOiBNYXJrc19PQU1fZGlyZWN0X25ldAorICAKKyAgYmUwX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6IDEwNy4yMzkuMTUuMTcKKyAgYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6IDEwNy4yMzkuMTUuMTgKKyAgYmUyX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6IDEwNy4yMzkuMTUuMTkKKyAgYmUzX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6IDEwNy4yMzkuMTUuMjAKKyAgYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6IDEwNy4yMzkuMTUuMjEKKyAgYmUwX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuMzMKKyAgYmUxX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuMzQKKyAgYmUyX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuMzUKKyAgYmUzX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuMzYKKyAgYmU0X09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuMzcKKyAgZmUwX1NJR05FVF92cmZfQTFfZGlyZWN0X2lwczogMTcyLjI2LjQuMQorICBmZTBfT0FNX2RpcmVjdF9pcHM6IDEwLjI1MC4xMC4zOAorICBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzOiAxNzIuMjYuNC41CisgIGZlMV9PQU1fZGlyZWN0X2lwczogMTAuMjUwLjEwLjM5CisgIHNtcDBfT0FNX2RpcmVjdF9pcHM6IDEwLjI1MC4xMC40MAorICBzbXAxX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuNDEKKyAgZGIwX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuNDIKKyAgZGIxX09BTV9kaXJlY3RfaXBzOiAxMC4yNTAuMTAuNDMKKworICB2bV9zY3BfYmUwX25hbWU6IHZTQ1BfQkUwCisgIHZtX3NjcF9iZTFfbmFtZTogdlNDUF9CRTEKKyAgdm1fc2NwX2JlMl9uYW1lOiB2U0NQX0JFMgorICB2bV9zY3BfYmUzX25hbWU6IHZTQ1BfQkUzCisgIHZtX3NjcF9iZTRfbmFtZTogdlNDUF9CRTQKKyAgdm1fc2NwX2ZlMF9uYW1lOiB2U0NQX0ZFMAorICB2bV9zY3BfZmUxX25hbWU6IHZTQ1BfRkUxCisgIHZtX3NtcDBfbmFtZTogdlNNUDAKKyAgdm1fc21wMV9uYW1lOiB2U01QMQorICB2bV9kYjBfbmFtZTogdkRCMAorICB2bV9kYjFfbmFtZTogdkRCMQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZhbGlkSEVBVGZpbGVzLnlhbWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXMvdmFsaWRIRUFUZmlsZXMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM1NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL0ZpbGVzL3ZhbGlkSEVBVGZpbGVzLnlhbWwKQEAgLTAsMCArMSw3ODcgQEAKK2hlYXRfdGVtcGxhdGVfdmVyc2lvbjogMjAxMy0wNS0yMworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDaGFuZ2VzIGluIHYwLjI6CisjICAtIFVuaXF1ZSBhdmFpbGFiaWxpdHkgem9uZSBmb3IgZWFjaCBWTQorIyAgLSBMQU44IGFuZCBTTEFOIG5ldHdvcmtzIHJlbW92ZWQgYWNjb3JkaW5nIHRvIGxhdGVzdCBQcm9kL1R5cGUgSSBkaWFncmFtCisjICAtIDIgREIgVk1zIGFkZGVkCisjICAtIEltYWdlcyBjb3JyZWN0ZWQKKyMgIC0gVk0gc3RhcnQtdXAgb3JkZXI6IFNNUC0+REItPkJFLT5GRSAobm8gZXJyb3IgaGFuZGxpbmcgeWV0KQorIyAgLSBQcm92aXNpb25pbmcgc2NyaXB0cyBwbGFjZWhvbGRlcnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZXNjcmlwdGlvbjogQVNDIFRlbXBsYXRlCisKK3BhcmFtZXRlcnM6CisjICBhdmFpbGFiaWxpdHlfem9uZV9zbXAwOgorIyAgICB0eXBlOiBzdHJpbmcKKyMgICAgZGVmYXVsdDogbm92YQorIyAgYXZhaWxhYmlsaXR5X3pvbmVfc21wMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2ZlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2RiMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMToKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMjoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlMzoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKyMgIGF2YWlsYWJpbGl0eV96b25lX2JlNDoKKyMgICAgdHlwZTogc3RyaW5nCisjICAgIGRlZmF1bHQ6IG5vdmEKKworICB2bmZfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogVW5pcXVlIG5hbWUgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aGVfU0NQX25hbWUKKyAgdm5mX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBVbmlxdWUgSUQgZm9yIHRoaXMgVk5GIGluc3RhbmNlCisgICAgZGVmYXVsdDogVGhpc19pc190aHNfU0NQX2lkCisKKyAgZmxhdm9yX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogZmxhdm9yIHR5cGUKKyAgICBkZWZhdWx0OiBhMS5TbWFsbAorICBmbGF2b3Jfc2NwX2ZlX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGZsYXZvcl9zbXBfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IGZsYXZvciB0eXBlCisgICAgZGVmYXVsdDogYTEuU21hbGwKKyAgZmxhdm9yX2RiX2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBmbGF2b3IgdHlwZQorICAgIGRlZmF1bHQ6IGExLlNtYWxsCisgIGltYWdlX3NjcF9iZV9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9iZQorICBpbWFnZV9zY3BfZmVfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZmUgICAgCisgIGltYWdlX3NtcF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogSW1hZ2UgdXNlIHRvIGJvb3QgYSBzZXJ2ZXIKKyAgICBkZWZhdWx0OiBhc2NfYmFzZV9pbWFnZV9zbXAKKyAgaW1hZ2VfZGJfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IEltYWdlIHVzZSB0byBib290IGEgc2VydmVyCisgICAgZGVmYXVsdDogYXNjX2Jhc2VfaW1hZ2VfZGIKKworICBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMiBGRSBDbHVzdGVyL0tBCisgIGludF92c2NwX2ZlX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMiBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9jbHVzdGVyX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFOMyBDbHVzdGVyCisgIGludF92c2NwX2NsdXN0ZXJfY2lkcjoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogUHJpdmF0ZSBOZXR3b3JrMyBBZGRyZXNzIChDSURSIG5vdGF0aW9uKQorICBpbnRfdnNjcF9kYl9uZXR3b3JrX25ldF9pZDoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZXNjcmlwdGlvbjogTEFONCBEQgorICBpbnRfdnNjcF9kYl9uZXR3b3JrX2NpZHI6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IFByaXZhdGUgTmV0d29yazQgQWRkcmVzcyAoQ0lEUiBub3RhdGlvbikKKyAgU0lHTkVUX3ZyZl9BMV9kaXJlY3RfbmV0X2lkOgorICAgIHR5cGU6IHN0cmluZworICAgIGRlc2NyaXB0aW9uOiBOZXR3b3JrIG5hbWUgZm9yIFNJR1RSQU5fQQorICBTSUdORVRfdnJmX0IxX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgU0lHVFJBTl9CCisgIENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgQ1JJQ0tFVF9PQ1MKKyAgT0FNX2RpcmVjdF9uZXRfaWQ6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVzY3JpcHRpb246IE5ldHdvcmsgbmFtZSBmb3IgT0FNCisgIGJlMF9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTAgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTJfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwczoKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBsYWJlbDogYmUyIHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBiZTIgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgIGJlM19Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBiZTMgcG9ydCA1IE9BTSBpcCBhZGRyZXNzCisgICAgZGVzY3JpcHRpb246IGJlMyBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDUgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNSBPQU0gaXAgYWRkcmVzcworICBiZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTJfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMiBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUyIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTNfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlMyBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmUzIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBiZTRfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGJlNCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogYmU0IHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTAgcG9ydCAwIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBmZTEgcG9ydCAxIFNJR1RSQU4gaXAgYWRkcmVzcworICBmZTFfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGZlMSBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogZmUxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAwX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAwIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBzbXAxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICBkYjBfT0FNX2RpcmVjdF9pcHM6CisgICAgdHlwZTogc3RyaW5nCisgICAgbGFiZWw6IGRiMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgICBkZXNjcmlwdGlvbjogc21wMCBwb3J0IDcgT0FNIGlwIGFkZHJlc3MKKyAgZGIxX09BTV9kaXJlY3RfaXBzOgorICAgIHR5cGU6IHN0cmluZworICAgIGxhYmVsOiBzbXAxIHBvcnQgNyBPQU0gaXAgYWRkcmVzcworICAgIGRlc2NyaXB0aW9uOiBkYjEgcG9ydCA3IE9BTSBpcCBhZGRyZXNzCisgIHZtX3NjcF9iZTBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMAorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisgIHZtX3NjcF9iZTFfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2U0NQX0JFMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNICAgIAorICB2bV9zY3BfYmUyX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTIKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmUzX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTMKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfYmU0X25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9CRTQKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zY3BfZmUxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNDUF9GRTEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAwX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDAKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9zbXAxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdlNNUDEKKyAgICBkZXNjcmlwdGlvbjogbmFtZSBvZiBWTQorICB2bV9kYjBfbmFtZToKKyAgICB0eXBlOiBzdHJpbmcKKyAgICBkZWZhdWx0OiB2REIwCisgICAgZGVzY3JpcHRpb246IG5hbWUgb2YgVk0KKyAgdm1fZGIxX25hbWU6CisgICAgdHlwZTogc3RyaW5nCisgICAgZGVmYXVsdDogdkRCMQorICAgIGRlc2NyaXB0aW9uOiBuYW1lIG9mIFZNCisKK3Jlc291cmNlczoKKyMgIHNjcF9iZV93YWl0X2NvbmRpdGlvbjoKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb24KKyMgICAgcHJvcGVydGllczoKKyMgICAgICBoYW5kbGU6IHsgZ2V0X3Jlc291cmNlOiBzY3BfYmVfd2FpdF9oYW5kbGUgfQorIyAgICAgIGNvdW50OiA1CisjICAgICAgdGltZW91dDogMzAwCisjICBzY3BfYmVfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisjCisjICBzY3BfZmVfd2FpdF9jb25kaXRpb246CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uCisjICAgIHByb3BlcnRpZXM6CisjICAgICAgaGFuZGxlOiB7IGdldF9yZXNvdXJjZTogc2NwX2ZlX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgc2NwX2ZlX3dhaXRfaGFuZGxlOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbkhhbmRsZQorIworIyAgc21wX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IHNtcF93YWl0X2hhbmRsZSB9CisjICAgICAgY291bnQ6IDIKKyMgICAgICB0aW1lb3V0OiAzMDAKKyMgIHNtcF93YWl0X2hhbmRsZToKKyMgICAgdHlwZTogT1M6OkhlYXQ6OldhaXRDb25kaXRpb25IYW5kbGUKKyMKKyMgIGRiX3dhaXRfY29uZGl0aW9uOgorIyAgICB0eXBlOiBPUzo6SGVhdDo6V2FpdENvbmRpdGlvbgorIyAgICBwcm9wZXJ0aWVzOgorIyAgICAgIGhhbmRsZTogeyBnZXRfcmVzb3VyY2U6IGRiX3dhaXRfaGFuZGxlIH0KKyMgICAgICBjb3VudDogMgorIyAgICAgIHRpbWVvdXQ6IDMwMAorIyAgZGJfd2FpdF9oYW5kbGU6CisjICAgIHR5cGU6IE9TOjpIZWF0OjpXYWl0Q29uZGl0aW9uSGFuZGxlCisKKyAgRkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXSAKKyAgQkVfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBTTVBfQWZmaW5pdHk6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlckdyb3VwCisgICAgcHJvcGVydGllczoKKyAgICAgIHBvbGljaWVzOiBbImFudGktYWZmaW5pdHkiXQorICBEQl9BZmZpbml0eToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyR3JvdXAKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgcG9saWNpZXM6IFsiYW50aS1hZmZpbml0eSJdCisgICAgICAKKyAgRkVfQ2x1c3RlcmluZ19LQToKKyAgICB0eXBlOiBPUzo6Q29udHJhaWw6OlZpcnR1YWxOZXR3b3JrCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9mZV9jbHVzdGVyX25ldF9pZCB9CisKKyAgRkVfQ2x1c3RlcmluZ19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisgICAgICBjaWRyOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZmVfY2x1c3Rlcl9jaWRyIH0KKworICBDbHVzdGVyaW5nX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfY2x1c3Rlcl9uZXRfaWQgfQorCisgIENsdXN0ZXJpbmdfTmV0d29ya19zdWJuZXQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlN1Ym5ldAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKyAgICAgIGNpZHI6IHsgZ2V0X3BhcmFtOiBpbnRfdnNjcF9jbHVzdGVyX2NpZHIgfQorCisgIERCX05ldHdvcms6CisgICAgdHlwZTogT1M6OkNvbnRyYWlsOjpWaXJ0dWFsTmV0d29yaworICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogaW50X3ZzY3BfZGJfbmV0d29ya19uZXRfaWQgfQorCisgIERCX05ldHdvcmtfc3VibmV0OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpTdWJuZXQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorICAgICAgY2lkcjogeyBnZXRfcGFyYW06IGludF92c2NwX2RiX25ldHdvcmtfY2lkciB9CisKKyAgc2VydmVyX3NjcF9iZTA6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUwX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlMF9wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUwX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTBfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMF9PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmUxOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTFfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMV9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUxX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmUxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTFfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlMV9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUxX0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2JlMjoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IGRiX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zY3BfYmUyX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zY3BfYmVfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfYmUyIH0KKyAgICAgIGZsYXZvcjogeyBnZXRfcGFyYW06IGZsYXZvcl9zY3BfYmVfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogQkVfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzMgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUyX3BvcnRfNCB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTJfcG9ydF81IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlMl9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc2NwX2JlMl9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzY3BfYmVfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgYmUyX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBiZTJfcG9ydF80OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBEQl9OZXR3b3JrIH0KKworICBiZTJfcG9ydF81OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBDcmlja2V0X09DU19wcm90ZWN0ZWRfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlMl9Dcmlja2V0X09DU19wcm90ZWN0ZWRfaXBzfX1dCisKKyAgYmUyX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmUyX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX3NjcF9iZTM6CisgICAgdHlwZTogT1M6Ok5vdmE6OlNlcnZlcgorIyAgICBkZXBlbmRzIG9uOiBkYl93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2JlM19uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2JlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2JlMyB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2JlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEJFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF8zIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlM19wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmUzX3BvcnRfNSB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTNfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9iZTNfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2JlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGJlM19wb3J0XzM6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IENsdXN0ZXJpbmdfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgYmUzX3BvcnRfNToKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTNfQ3JpY2tldF9PQ1NfcHJvdGVjdGVkX2lwc319XQorCisgIGJlM19wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGJlM19PQU1fZGlyZWN0X2lwc319XQorCisgIHNlcnZlcl9zY3BfYmU0OgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kcyBvbjogZGJfd2FpdF9jb25kaXRpb24KKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmFtZTogeyBnZXRfcGFyYW06IHZtX3NjcF9iZTRfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX3NjcF9iZV9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9iZTQgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX3NjcF9iZV9pZCB9CisgICAgICBzY2hlZHVsZXJfaGludHM6IHsgZ3JvdXA6IHsgZ2V0X3Jlc291cmNlOiBCRV9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBiZTRfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGJlNF9wb3J0XzUgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogYmU0X3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9zY3BfYmU0X25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ3NjcF9iZV93YWl0X2hhbmRsZScsICdjdXJsX2NsaSddIH0KKworICBiZTRfcG9ydF8zOgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcmtfaWQ6IHsgZ2V0X3Jlc291cmNlOiBDbHVzdGVyaW5nX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGJlNF9wb3J0XzU6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IENyaWNrZXRfT0NTX3Byb3RlY3RlZF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogYmU0X0NyaWNrZXRfT0NTX3Byb3RlY3RlZF9pcHN9fV0KKworICBiZTRfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBiZTRfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMF9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF8wIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMF9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUwX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTBfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMF9wb3J0XzA6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQTFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfU0lHTkVUX3ZyZl9BMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUwX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUwX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTBfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc2NwX2ZlMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHMgb246IHNjcF9iZV93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fc2NwX2ZlMV9uYW1lIH0KKyAgICAgIGltYWdlOiB7IGdldF9wYXJhbTogaW1hZ2Vfc2NwX2ZlX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2ZlMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc2NwX2ZlX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IEZFX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF8xIH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGZlMV9wb3J0XzIgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZmUxX3BvcnRfMyB9CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBmZTFfcG9ydF83IH0KKyAgICAgIG1ldGFkYXRhOgorICAgICAgICB2bmZfaWQ6IHsgZ2V0X3BhcmFtOiB2bmZfaWQgfQorICAgICAgdXNlcl9kYXRhOgorICAgICAgICBzdHJfcmVwbGFjZToKKyAgICAgICAgICB0ZW1wbGF0ZTogfAorICAgICAgICAgICAgIyEvYmluL2Jhc2gKKyAgICAgICAgICAgICN0b2RvOiBwcm92aXNpb24gJHZtX25hbWUKKyAgICAgICAgICAgIHdjX25vdGlmeSAtLWRhdGEtYmluYXJ5ICd7InN0YXR1cyI6ICJTVUNDRVNTIn0nCisgICAgICAgICAgcGFyYW1zOgorICAgICAgICAgICAgJHZtX25hbWU6IHtnZXRfcGFyYW06IHZtX3NjcF9mZTFfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnc2NwX2ZlX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGZlMV9wb3J0XzE6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IFNJR05FVF92cmZfQjFfZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfU0lHTkVUX3ZyZl9CMV9kaXJlY3RfaXBzfX1dCisKKyAgZmUxX3BvcnRfMjoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogRkVfQ2x1c3RlcmluZ19LQSB9CisKKyAgZmUxX3BvcnRfMzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogQ2x1c3RlcmluZ19OZXR3b3JrIH0KKworICBmZTFfcG9ydF83OgorICAgIHR5cGU6IE9TOjpOZXV0cm9uOjpQb3J0CisgICAgcHJvcGVydGllczoKKyAgICAgIG5ldHdvcms6IHsgZ2V0X3BhcmFtOiBPQU1fZGlyZWN0X25ldF9pZCB9CisgICAgICBmaXhlZF9pcHM6IFt7ImlwX2FkZHJlc3MiOiB7Z2V0X3BhcmFtOiBmZTFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMDoKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAwX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMF9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMF9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMF9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDBfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfc21wMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9zbXAxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9zbXBfaWQgfQorIyAgICAgIGF2YWlsYWJpbGl0eV96b25lOiB7IGdldF9wYXJhbTogYXZhaWxhYmlsaXR5X3pvbmVfc21wMSB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3Jfc21wX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IFNNUF9BZmZpbml0eSB9IH0KKyAgICAgIG5ldHdvcmtzOgorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogc21wMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fc21wMV9uYW1lfQorIyAgICAgICAgICAgIHdjX25vdGlmeTogeyBnZXRfYXR0cjogWydzbXBfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgc21wMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IHNtcDFfT0FNX2RpcmVjdF9pcHN9fV0KKworICBzZXJ2ZXJfZGIwOgorICAgIHR5cGU6IE9TOjpOb3ZhOjpTZXJ2ZXIKKyMgICAgZGVwZW5kc19vbjogc21wX3dhaXRfY29uZGl0aW9uCisgICAgcHJvcGVydGllczoKKyAgICAgIG5hbWU6IHsgZ2V0X3BhcmFtOiB2bV9kYjBfbmFtZSB9CisgICAgICBpbWFnZTogeyBnZXRfcGFyYW06IGltYWdlX2RiX2lkIH0KKyMgICAgICBhdmFpbGFiaWxpdHlfem9uZTogeyBnZXRfcGFyYW06IGF2YWlsYWJpbGl0eV96b25lX2RiMCB9CisgICAgICBmbGF2b3I6IHsgZ2V0X3BhcmFtOiBmbGF2b3JfZGJfaWQgfQorICAgICAgc2NoZWR1bGVyX2hpbnRzOiB7IGdyb3VwOiB7IGdldF9yZXNvdXJjZTogREJfQWZmaW5pdHkgfSB9CisgICAgICBuZXR3b3JrczoKKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMF9wb3J0XzQgfQorICAgICAgLSBwb3J0OiB7IGdldF9yZXNvdXJjZTogZGIwX3BvcnRfNyB9CisgICAgICBtZXRhZGF0YToKKyAgICAgICAgdm5mX2lkOiB7IGdldF9wYXJhbTogdm5mX2lkIH0KKyAgICAgIHVzZXJfZGF0YToKKyAgICAgICAgc3RyX3JlcGxhY2U6CisgICAgICAgICAgdGVtcGxhdGU6IHwKKyAgICAgICAgICAgICMhL2Jpbi9iYXNoCisgICAgICAgICAgICAjdG9kbzogcHJvdmlzaW9uICR2bV9uYW1lCisgICAgICAgICAgICB3Y19ub3RpZnkgLS1kYXRhLWJpbmFyeSAneyJzdGF0dXMiOiAiU1VDQ0VTUyJ9JworICAgICAgICAgIHBhcmFtczoKKyAgICAgICAgICAgICR2bV9uYW1lOiB7Z2V0X3BhcmFtOiB2bV9kYjBfbmFtZX0KKyMgICAgICAgICAgICB3Y19ub3RpZnk6IHsgZ2V0X2F0dHI6IFsnZGJfd2FpdF9oYW5kbGUnLCAnY3VybF9jbGknXSB9CisKKyAgZGIwX3BvcnRfNDoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrX2lkOiB7IGdldF9yZXNvdXJjZTogREJfTmV0d29yayB9CisKKyAgZGIwX3BvcnRfNzoKKyAgICB0eXBlOiBPUzo6TmV1dHJvbjo6UG9ydAorICAgIHByb3BlcnRpZXM6CisgICAgICBuZXR3b3JrOiB7IGdldF9wYXJhbTogT0FNX2RpcmVjdF9uZXRfaWQgfQorICAgICAgZml4ZWRfaXBzOiBbeyJpcF9hZGRyZXNzIjoge2dldF9wYXJhbTogZGIwX09BTV9kaXJlY3RfaXBzfX1dCisKKyAgc2VydmVyX2RiMToKKyAgICB0eXBlOiBPUzo6Tm92YTo6U2VydmVyCisjICAgIGRlcGVuZHNfb246IHNtcF93YWl0X2NvbmRpdGlvbgorICAgIHByb3BlcnRpZXM6CisgICAgICBuYW1lOiB7IGdldF9wYXJhbTogdm1fZGIxX25hbWUgfQorICAgICAgaW1hZ2U6IHsgZ2V0X3BhcmFtOiBpbWFnZV9kYl9pZCB9CisjICAgICAgYXZhaWxhYmlsaXR5X3pvbmU6IHsgZ2V0X3BhcmFtOiBhdmFpbGFiaWxpdHlfem9uZV9kYjEgfQorICAgICAgZmxhdm9yOiB7IGdldF9wYXJhbTogZmxhdm9yX2RiX2lkIH0KKyAgICAgIHNjaGVkdWxlcl9oaW50czogeyBncm91cDogeyBnZXRfcmVzb3VyY2U6IERCX0FmZmluaXR5IH0gfQorICAgICAgbmV0d29ya3M6CisgICAgICAtIHBvcnQ6IHsgZ2V0X3Jlc291cmNlOiBkYjFfcG9ydF80IH0KKyAgICAgIC0gcG9ydDogeyBnZXRfcmVzb3VyY2U6IGRiMV9wb3J0XzcgfQorICAgICAgbWV0YWRhdGE6CisgICAgICAgIHZuZl9pZDogeyBnZXRfcGFyYW06IHZuZl9pZCB9CisgICAgICB1c2VyX2RhdGE6CisgICAgICAgIHN0cl9yZXBsYWNlOgorICAgICAgICAgIHRlbXBsYXRlOiB8CisgICAgICAgICAgICAjIS9iaW4vYmFzaAorICAgICAgICAgICAgI3RvZG86IHByb3Zpc2lvbiAkdm1fbmFtZQorICAgICAgICAgICAgd2Nfbm90aWZ5IC0tZGF0YS1iaW5hcnkgJ3sic3RhdHVzIjogIlNVQ0NFU1MifScKKyAgICAgICAgICBwYXJhbXM6CisgICAgICAgICAgICAkdm1fbmFtZToge2dldF9wYXJhbTogdm1fZGIxX25hbWV9CisjICAgICAgICAgICAgd2Nfbm90aWZ5OiB7IGdldF9hdHRyOiBbJ2RiX3dhaXRfaGFuZGxlJywgJ2N1cmxfY2xpJ10gfQorCisgIGRiMV9wb3J0XzQ6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29ya19pZDogeyBnZXRfcmVzb3VyY2U6IERCX05ldHdvcmsgfQorCisgIGRiMV9wb3J0Xzc6CisgICAgdHlwZTogT1M6Ok5ldXRyb246OlBvcnQKKyAgICBwcm9wZXJ0aWVzOgorICAgICAgbmV0d29yazogeyBnZXRfcGFyYW06IE9BTV9kaXJlY3RfbmV0X2lkIH0KKyAgICAgIGZpeGVkX2lwczogW3siaXBfYWRkcmVzcyI6IHtnZXRfcGFyYW06IGRiMV9PQU1fZGlyZWN0X2lwc319XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2NyZWRlbnRpYWxzLnlhbWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9jcmVkZW50aWFscy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMGQ4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9jcmVkZW50aWFscy55YW1sCkBAIC0wLDAgKzEsNDggQEAKKyAgICBkZXNpZ25lcjogeworICAgICAgICB1c2VybmFtZTogY3MwMDA4LAorICAgICAgICBwYXNzd29yZDogZGVtbywKKyAgICAgICAgZmlyc3RuYW1lOiBBU0RDLAorICAgICAgICBsYXN0bmFtZTogS0FTUElOCisgICAgfQorICAgIGFkbWluOiB7CisgICAgICAgIHVzZXJuYW1lOiBqaDAwMDMsCisgICAgICAgIHBhc3N3b3JkOiBkZW1vLAorICAgICAgICBmaXJzdG5hbWU6IEFTREMsCisgICAgICAgIGxhc3RuYW1lOiBLQVNQSU4KKyAgICB9CisgICAgb3BzOiB7CisgICAgICAgIHVzZXJuYW1lOiBvcDAwMDEsCisgICAgICAgIHBhc3N3b3JkOiBkZW1vLAorICAgICAgICBmaXJzdG5hbWU6IEFTREMsCisgICAgICAgIGxhc3RuYW1lOiBLQVNQSU4KKyAgICB9CisgICAgdGVzdGVyOiB7CisgICAgICAgIHVzZXJuYW1lOiBqbTAwMDcsCisgICAgICAgIHBhc3N3b3JkOiBkZW1vLAorICAgICAgICBmaXJzdG5hbWU6IEFTREMsCisgICAgICAgIGxhc3RuYW1lOiBLQVNQSU4KKyAgICB9CisgICAgZ292ZXJub3I6IHsKKyAgICAgICAgdXNlcm5hbWU6IGd2MDAwMSwKKyAgICAgICAgcGFzc3dvcmQ6IGRlbW8sCisgICAgICAgIGZpcnN0bmFtZTogQVNEQywKKyAgICAgICAgbGFzdG5hbWU6IEtBU1BJTgorICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWdpc3Q6IHsKKyAgICAgICAgdXNlcm5hbWU6IHBzMDAwMSwKKyAgICAgICAgcGFzc3dvcmQ6IGRlbW8sCisgICAgICAgIGZpcnN0bmFtZTogQVNEQywKKyAgICAgICAgbGFzdG5hbWU6IEtBU1BJTgorICAgIH0KKyAgICBwcm9kdWN0X21hbmFnZXI6IHsKKyAgICAgICAgdXNlcm5hbWU6IHBtMDAwMSwKKyAgICAgICAgcGFzc3dvcmQ6IGRlbW8sCisgICAgICAgIGZpcnN0bmFtZTogQVNEQywKKyAgICAgICAgbGFzdG5hbWU6IEtBU1BJTgorICAgIH0KKyAgICBwcm9kdWN0X2xvY2FsOiB7CisgICAgICAgIHVzZXJuYW1lOiBwbTAwMDEsCisgICAgICAgIHBhc3N3b3JkOiAxMjMxMjNhLAorICAgICAgICBmaXJzdG5hbWU6IEFTREMsCisgICAgICAgIGxhc3RuYW1lOiBLQVNQSU4KKyAgICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvbG9nNGoucHJvcGVydGllcyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxNTllYwotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2xvZzRqLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzNCBAQAorIyBEZWZpbmUgdGhlIHJvb3QgbG9nZ2VyIHdpdGggYXBwZW5kZXIgZmlsZQorbG9nNGoucm9vdExvZ2dlciA9IERFQlVHLCBGSUxFLCBzdGRvdXQKKworIyBEZWZpbmUgdGhlIGZpbGUgYXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLkZJTEU9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5GSUxFLkZpbGU9JHt0YXJnZXRsb2d9bG9ncy9jaS1sb2cub3V0CisKKyMgRGVmaW5lIHRoZSBsYXlvdXQgZm9yIGZpbGUgYXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLkZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuRklMRS5sYXlvdXQuY29udmVyc2lvblBhdHRlcm49JWR7eXl5eS1NTS1kZCBISDptbTpzc30gJTVwIFslMTBjXSA6ICVtJW4KKworIyBTZXQgdGhlIG1heGltdW0gZmlsZSBzaXplIGJlZm9yZSByb2xsb3ZlcgorbG9nNGouYXBwZW5kZXIuRklMRS5tYXhGaWxlU2l6ZT01TUIKKworIyBTZXQgdGhlIHRoZSBiYWNrdXAgaW5kZXgKK2xvZzRqLmFwcGVuZGVyLkZJTEUubWF4QmFja3VwSW5kZXg9MTAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRGlyZWN0IGxvZyBtZXNzYWdlcyB0byBzdGRvdXQKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LlRhcmdldD1TeXN0ZW0ub3V0Citsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorI2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7eXl5eS1NTS1kZCBISDptbTpzc30gJS01cCAlY3sxfTolTCAtICVtJW4KK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7eXl5eS1NTS1kZCBISDptbTpzc30gJTVwICUxMGM6JUwgLSAlbSVuCisKK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eT1ERUJVRworbG9nNGoubG9nZ2VyLmNvbS50aGlua2F1cmVsaXVzLnRpdGFuLmRpc2tzdG9yYWdlLmNhc3NhbmRyYS5DYXNzYW5kcmFUcmFuc2FjdGlvbj1JTkZPLCBGSUxFLCBzdGRvdXQKKworbG9nNGoubG9nZ2VyLm9yZy5vcGVuZWNvbXAuc2RjLmNpLnRlc3RzLnV0aWxzPVRSQUNFLCBGSUxFLCBzdGRvdXQKK2xvZzRqLmFkZGl0aXZpdHkub3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMudXRpbHM9ZmFsc2UKKworCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9zZGMtcGFja2FnZXMueWFtbCBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjc4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9zZGMtcGFja2FnZXMueWFtbApAQCAtMCwwICsxLDIgQEAKK3BhY2thZ2VzOgorIC0gb3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5yZXNvdXJjZXVpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLnlhbWwgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi9zZGMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg0ZmVjCi0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvc2RjLnlhbWwKQEAgLTAsMCArMSw1NyBAQAorb3V0cHV0Rm9sZGVyOiB0YXJnZXQKK3JlcG9ydE5hbWU6IGluZGV4Lmh0bWwKK2NhdGFsb2dCZUhvc3Q6IGxvY2FsaG9zdAorY2F0YWxvZ0ZlSG9zdDogbG9jYWxob3N0Citlc0hvc3Q6IGVzaG9zdAorZGlzcmlidXRpb25DbGllbnRIb3N0OiBkaXNDbGllbnQKK2NhdGFsb2dGZVBvcnQ6IDgxODEKK2NhdGFsb2dCZVBvcnQ6IDgwODAKK2Rpc3JpYnV0aW9uQ2xpZW50UG9ydDogODE4MQorZXNQb3J0OiA5MjAwCituZW9Ib3N0OiBuZW9Ib3N0CituZW9Qb3J0OiA3NDc0CituZW9EQnVzZXJuYW1lOiBuZW80agkKK25lb0RCcGFzc3dvcmQ6IDEyMzQ1NgordXJsOiBodHRwOi8vbG9jYWxob3N0OjgyODUvc2RjMQorcmVtb3RlVGVzdGluZ01hY2hpbmVJUDogMS4yLjMuNAorcmVtb3RlVGVzdGluZ01hY2hpbmVQb3J0OiA1NTU1CityZW1vdGVUZXN0aW5nOiBmYWxzZQorCityZXNvdXJjZUNvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL3Rlc3RzCitjb21wb25lbnRzQ29uZmlnRGlyOiBzcmMvdGVzdC9yZXNvdXJjZXMvQ0kvY29tcG9uZW50cworaW1wb3J0UmVzb3VyY2VDb25maWdEaXI6IHNyYy90ZXN0L3Jlc291cmNlcy9DSS9pbXBvcnRSZXNvdXJjZQoraW1wb3J0UmVzb3VyY2VUZXN0c0NvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFJlc291cmNlVGVzdHMKK2Vycm9yQ29uZmlndXJhdGlvbkZpbGU6IC4uL2NhdGFsb2ctYmUvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZy9lcnJvci1jb25maWd1cmF0aW9uLnlhbWwKK2NvbmZpZ3VyYXRpb25GaWxlOiAuLi9jYXRhbG9nLWJlL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWcvY29uZmlndXJhdGlvbi55YW1sCitpbXBvcnRUeXBlc0NvbmZpZ0Rpcjogc3JjL3Rlc3QvcmVzb3VyY2VzL0NJL2ltcG9ydFR5cGVzVGVzdAorCisKK3RpdGFuUHJvcGVydGllc0ZpbGU6IHNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RpdGFuLnByb3BlcnRpZXMKKworc3RvcE9uQ2xhc3NGYWlsdXJlOiBmYWxzZQorCisjTGlzdCBvZiBub24tYWJzdHJhY3QgcmVzb3VyY2VzIHRvIGtlZXAgZHVyaW5nIHRpdGFuIGNsZWFudXAgYmV0d2VlbiB0ZXN0cworI09ubHkgMS4wIHZlcnNpb24gd2lsbCBiZSBrZXB0CityZXNvdXJjZXNOb3RUb0RlbGV0ZToKKyAgICAgLSB0b3NjYS5ub2Rlcy5Db21wdXRlCisgICAgIC0gdG9zY2Eubm9kZXMuRGF0YWJhc2UKKyAgICAgLSB0b3NjYS5ub2Rlcy5PYmplY3RTdG9yYWdlCisgICAgIC0gdG9zY2Eubm9kZXMuQmxvY2tTdG9yYWdlCisgICAgIC0gdG9zY2Eubm9kZXMuTG9hZEJhbGFuY2VyCisgICAgIC0gb3JnLm9wZW5lY29tcC5yZXNvdXJjZS5jcC5Qb3J0CisgICAgIC0gb3JnLm9wZW5lY29tcC5yZXNvdXJjZS52bC5OZXR3b3JrCisKKyNSZXNvdXJjZSBjYXRlZ29yaWVzIHRvIGtlZXAgKGluY2x1ZGluZyBhbGwgdGhlaXIgc3ViY2F0ZWdvcmllcykKK3Jlc291cmNlQ2F0ZWdvcmllc05vdFRvRGVsZXRlOgorICAgICAtIEdlbmVyaWMKKyAgICAgLSBOZXR3b3JrIEwyLTMKKyAgICAgLSBOZXR3b3JrIEw0KworICAgICAtIEFwcGxpY2F0aW9uIEw0KworICAgICAtIE5ldHdvcmsgQ29ubmVjdGl2aXR5CisKKyNTZXJ2aWNlIGNhdGVnb3JpZXMgdG8ga2VlcAorc2VydmljZUNhdGVnb3JpZXNOb3RUb0RlbGV0ZToKKyAgICAgLSBNb2JpbGl0eQorICAgICAtIE5ldHdvcmsgTDEtMworICAgICAtIE5ldHdvcmsgTDQKKyAgICAgLSBWb0lQIENhbGwgQ29udHJvbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3RpdGFuLnByb3BlcnRpZXMgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90aXRhbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDEyY2YKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvY29uZi90aXRhbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNyBAQAorc3RvcmFnZS5iYWNrZW5kPWNhc3NhbmRyYQorc3RvcmFnZS5ob3N0bmFtZT1jYXNzYW5kcmFob3N0CitzdG9yYWdlLnBvcnQ9OTE2MAorCitjYWNoZS5kYi1jYWNoZS1jbGVhbi13YWl0ID0gMjAKK2NhY2hlLmRiLWNhY2hlLXRpbWUgPSAxODAwMDAKK2NhY2hlLmRiLWNhY2hlLXNpemUgPSAwLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvc2NyaXB0cy9zdGFydFRlc3Quc2ggYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvc2NyaXB0cy9zdGFydFRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiMmNiMQotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9jaS9zY3JpcHRzL3N0YXJ0VGVzdC5zaApAQCAtMCwwICsxLDk2IEBACisjIS9iaW4vYmFzaAorCitmdW5jdGlvbiB1c2FnZSB7CisJZWNobyAiVXNhZ2U6ICQwIDxqYXIgZmlsZT4iCit9CisKK2Z1bmN0aW9uIGV4aXRPbkVycm9yKCkgeworICAgICAgICBpZiBbICQxIC1uZSAwIF0KKyAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIkZhaWxlZCBydW5uaW5nIHRhc2sgJDIiCisgICAgICAgICAgICAgICAgZXhpdCAyCisgICAgICAgIGZpCit9CisKK2lmIFsgJCMgLWx0IDEgXQordGhlbgorCXVzYWdlCisJZXhpdCAyCitmaQorCitDVVJSRU5UX0RJUj1gcHdkYAorQkFTRURJUj0kKGRpcm5hbWUgJDApCisKK2lmIFsgJHtCQVNFRElSOjA6MX0gPSAiLyIgXQordGhlbgorICAgICAgICBGVUxMX1BBVEg9JEJBU0VESVIKK2Vsc2UKKyAgICAgICAgRlVMTF9QQVRIPSRDVVJSRU5UX0RJUi8kQkFTRURJUgorZmkKKworTE9HU19QUk9QX0ZJTEU9ZmlsZToke0ZVTExfUEFUSH0vY29uZi9sb2c0ai5wcm9wZXJ0aWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1RBUkdFVF9ESVI9JHtGVUxMX1BBVEh9L3RhcmdldAorQ09ORl9GSUxFPSR7RlVMTF9QQVRIfS9jb25mL3NkYy55YW1sCisKK0RFQlVHPXRydWUKK01haW5DbGFzcz1vcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5ydW4uU3RhcnRUZXN0CisKK0pBUl9GSUxFPSQxCitTVUlURV9GSUxFPSQyCitGSUxFU19URVNUPSQzCisKK2lmIFsgLXogIiQzIiBdCit0aGVuCisJCUZJTEVTX1RFU1Q9JHtGVUxMX1BBVEh9L0ZpbGVzCisJCWVjaG8gIiQzIgorZmkKKworI1RBUkdFVF9ESVI9YGVjaG8gJHtUQVJHRVRfRElSfSB8IHNlZCAncy9cLy9cLy9nJ2AKKyNlY2hvICRUQVJHRVRfRElSCisKK1RFU1RTX0RJUj0vb3B0L2FwcC9zZGMvY2kvcmVzb3VyY2VzL3Rlc3RzCitDT01QT05FTlRTX0RJUj0vb3B0L2FwcC9zZGMvY2kvcmVzb3VyY2VzL2NvbXBvbmVudHMKKworI3NlZCAtaSAncyNcKG91dHB1dEZvbGRlcjpcKS4qI1wxICcke1RBUkdFVF9ESVJ9JyNnJyAkQ09ORl9GSUxFCisjc2VkIC1pICdzI1wocmVzb3VyY2VDb25maWdEaXI6XCkuKiNcMSAnJHtURVNUU19ESVJ9JyNnJyAkQ09ORl9GSUxFCisjc2VkIC1pICdzI1woY29tcG9uZW50c0NvbmZpZ0RpcjpcKS4qI1wxICcke0NPTVBPTkVOVFNfRElSfScjZycgJENPTkZfRklMRQorVEFSR0VUX0xPR19ESVI9IiR7VEFSR0VUX0RJUn0vIgorCisjIG1rZGlyIC1wICR7VEFSR0VUX0RJUn0KKyNpZiBbIC1kICR7VEFSR0VUX0RJUn0gXQorI3RoZW4KKyMgICAgIHJtIC1yZiAke1RBUkdFVF9ESVJ9LyoKKyNleGl0T25FcnJvciAkPyAiRmFpbGVkX3RvX2RlbGV0ZV90YXJnZXRfZGlyIgorI2ZpCisKK2RlYnVnX3BvcnQ9ODgwMAorI0pBVkFfT1BUSU9OPSItamF2YWFnZW50Oi92YXIvdG1wL2phY29jby9saWIvamFjb2NvYWdlbnQuamFyPWRlc3RmaWxlPWphY29jby1pdC5leGVjIgorSkFWQV9PUFRJT049IiIKK2Nhc2UgIiQyIiBpbgorCS1kZWJ1ZykgZWNobyAiRGVidWcgbW9kZSwgTGlzdGVuIG9uIHBvcnQgJGRlYnVnX3BvcnQiOyBKQVZBX09QVElPTj0iLVhkZWJ1ZyAtWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz0ke2RlYnVnX3BvcnR9IiA7OworCSIiKSBlY2hvICJTdGFuZGFyZCBtb2RlIjs7CisJKikgZWNobyAiVVNBR0U6IHN0YXJ0VGVzdC5zaCBbLWRlYnVnXSI7OworZXNhYworCitjbWQ9Im5vaHVwIGphdmEgJEpBVkFfT1BUSU9OIC1EZGlzcGxheUV4Y2VwdGlvbj10cnVlIC1EdGFyZ2V0bG9nPSR7VEFSR0VUX0xPR19ESVJ9IC1EZmlsZXBhdGg9JHtGSUxFU19URVNUfSAtRGNvbmZpZy5yZXNvdXJjZT0ke0NPTkZfRklMRX0gLURkZWJ1Zz0ke0RFQlVHfSAtRGxvZzRqLmNvbmZpZ3VyYXRpb249JHtMT0dTX1BST1BfRklMRX0gLWNwICRKQVJfRklMRSAke01haW5DbGFzc30gJFNVSVRFX0ZJTEUgJiIgCisKKyNlY2hvICRjbWQKKyNjb25zb2xlPWAkY21kYAorCitpZiBbICRERUJVRyA9PSAidHJ1ZSIgXQordGhlbgorCSRjbWQKK2Vsc2UKKwkkY21kID4+IC9kZXYvbnVsbAorZmkgCitzdGF0dXM9YGVjaG8gJD9gCisKKworCitlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKK2VjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIHN0YXR1cyBpcyAke3N0YXR1c30gIyMjIyMjIyMjIyMjIyMjIyMiIAorZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisKK2V4aXQgJHN0YXR1cyAKKwpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvdWktY2kueG1sIGIvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL2NpL3Rlc3RTdWl0ZXMvdWktY2kueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzI1ODQKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvbWFpbi9yZXNvdXJjZXMvY2kvdGVzdFN1aXRlcy91aS1jaS54bWwKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIj4KKzxzdWl0ZSBuYW1lPSJ1aXRlc3RzIiBjb25maWdmYWlsdXJlcG9saWN5PSJjb250aW51ZSI+CisgIDx0ZXN0IG5hbWU9InVpdGVzdHMiPgorICAgIDxjbGFzc2VzPgorICAgIAk8IS0tb25ib2FyZC0tPgorICAgCQk8Y2xhc3MgbmFtZT0ib3JnLm9wZW5lY29tcC5zZGMuY2kudGVzdHMuZXhlY3V0ZS5zYW5pdHkuT25ib2FyZCI+CisgICAJCQkgIDxtZXRob2RzPgorCQkJCTxpbmNsdWRlIG5hbWU9Im9uYm9hcmRWTkZUZXN0Ii8+CisJCQkgIDwvbWV0aG9kcz4KKwkJPC9jbGFzcz4KKwkJPCEtLXZmLS0+CisJCTxjbGFzcyBuYW1lPSJvcmcub3BlbmVjb21wLnNkYy5jaS50ZXN0cy5leGVjdXRlLnNhbml0eS5WZiIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PiA8IS0tIHVpdGVzdHMgLS0+Cis8L3N1aXRlPiA8IS0tIHVpc3VpdGUgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9naXptb3JhbWJvLmpwZyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZ2l6bW9yYW1iby5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhOGZlOAotLS0gL2Rldi9udWxsCisrKyBiL3VpLWNpL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZ2l6bW9yYW1iby5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdWktY2kvc3JjL3Rlc3QvQ29tcGxldGV0aGVmb3JtLmpzIGIvdWktY2kvc3JjL3Rlc3QvQ29tcGxldGV0aGVmb3JtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzc5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi91aS1jaS9zcmMvdGVzdC9Db21wbGV0ZXRoZWZvcm0uanMKQEAgLTAsMCArMSwyMyBAQAorLyotCisgKiA9PT09PT09PT09PT1MSUNFTlNFX1NUQVJUPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU0RDCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFUJlQgSW50ZWxsZWN0dWFsIFByb3BlcnR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09TElDRU5TRV9FTkQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKioKKyAqIE5ldyBub2RlIGZpbGUKKyAqLwpkaWZmIC0tZ2l0IGEvdWktY2kvdGFyYmFsbC54bWwgYi91aS1jaS90YXJiYWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDEzMDM4Ci0tLSAvZGV2L251bGwKKysrIGIvdWktY2kvdGFyYmFsbC54bWwKQEAgLTAsMCArMSw2MCBAQAorPGFzc2VtYmx5CisJeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KKwk8aWQ+YmluPC9pZD4KKwk8Zm9ybWF0cz4KKwkJPGZvcm1hdD50YXI8L2Zvcm1hdD4KKwk8L2Zvcm1hdHM+CisJPGZpbGVzPgorCQk8ZmlsZT4KKwkJCTxzb3VyY2U+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyPC9zb3VyY2U+CisJCQk8b3V0cHV0RGlyZWN0b3J5Pi4vPC9vdXRwdXREaXJlY3Rvcnk+CisJCQk8ZGVzdE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyPC9kZXN0TmFtZT4KKwkJPC9maWxlPgorIAkJPGZpbGU+CisJCQk8c291cmNlPnNyYy9tYWluL3Jlc291cmNlcy9jaS9zY3JpcHRzL3N0YXJ0VGVzdC5zaDwvc291cmNlPgorCQkJPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGRlc3ROYW1lPnN0YXJ0VGVzdC5zaDwvZGVzdE5hbWU+CisJCTwvZmlsZT4KKwkJPCEtLWZpbGU+IDxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2NpL3NjcmlwdHMvcG9zdGluc3RhbGw8L3NvdXJjZT4gPG91dHB1dERpcmVjdG9yeT4uLzwvb3V0cHV0RGlyZWN0b3J5PiAKKwkJCTxkZXN0TmFtZT5wb3N0aW5zdGFsbDwvZGVzdE5hbWU+IDwvZmlsZSAtLT4KKwkJPGZpbGU+CisJCQk8c291cmNlPnNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy55YW1sPC9zb3VyY2U+CisJCQk8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKwkJCTxkZXN0TmFtZT5zZGMueWFtbDwvZGVzdE5hbWU+CisJCTwvZmlsZT4KKwkJPGZpbGU+CisJCQk8c291cmNlPnNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL3NkYy1wYWNrYWdlcy55YW1sPC9zb3VyY2U+CisJCQk8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KKwkJCTxkZXN0TmFtZT5zZGMtcGFja2FnZXMueWFtbDwvZGVzdE5hbWU+CisJCTwvZmlsZT4KKwkJPGZpbGU+CisJCQk8c291cmNlPi4uL2FzZGMtdGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2NpL2NvbmYvbG9nNGoucHJvcGVydGllczwvc291cmNlPgorCQkJPG91dHB1dERpcmVjdG9yeT5jb25mPC9vdXRwdXREaXJlY3Rvcnk+CisJCQk8ZGVzdE5hbWU+bG9nNGoucHJvcGVydGllczwvZGVzdE5hbWU+CisJCTwvZmlsZT4KKwkJPGZpbGU+CisJCQk8c291cmNlPnNyYy9tYWluL3Jlc291cmNlcy9jaS9jb25mL2NyZWRlbnRpYWxzLnlhbWw8L3NvdXJjZT4KKwkJCTxvdXRwdXREaXJlY3Rvcnk+Y29uZjwvb3V0cHV0RGlyZWN0b3J5PgorCQkJPGRlc3ROYW1lPmNyZWRlbnRpYWxzLnlhbWw8L2Rlc3ROYW1lPgorCQk8L2ZpbGU+CisKKwk8L2ZpbGVzPgorCisJPGZpbGVTZXRzPgorCQk8ZmlsZVNldD4KKwkJCTxkaXJlY3Rvcnk+c3JjL3Rlc3QvcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisJCQk8b3V0cHV0RGlyZWN0b3J5Pi4vPC9vdXRwdXREaXJlY3Rvcnk+CisJCTwvZmlsZVNldD4KKwkJPGZpbGVTZXQ+CisJCQk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlcy9jaS90ZXN0U3VpdGVzPC9kaXJlY3Rvcnk+CisJICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4vdGVzdFN1aXRlczwvb3V0cHV0RGlyZWN0b3J5PgorCQk8L2ZpbGVTZXQ+CisJCTxmaWxlU2V0PgorCQkJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvRmlsZXM8L2RpcmVjdG9yeT4KKwkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Li9GaWxlczwvb3V0cHV0RGlyZWN0b3J5PgorCQk8L2ZpbGVTZXQ+CisJPC9maWxlU2V0cz4KKworPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3dlYnNlYWwtc2ltdWxhdG9yL1JFQURNRS50eHQgYi93ZWJzZWFsLXNpbXVsYXRvci9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZmQ2MjIKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJzZWFsLXNpbXVsYXRvci9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCAgICAgICAgICAgICAgICAgICAgICB8Cit8ICB3ZWJzZWFsIHNpbXVsYXRvciAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dvcmtpbmcgd2l0aCB3ZWJzZWFsIHNpbXVsYXRvcjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gQnVpbGQgdGhlIHByb2plY3QgdXNpbmc6IG12biBjbGVhbiBpbnN0YWxsCisyLiBGdHAgd2FyIGZpbGU6IHdlYnNlYWwtc2ltdWxhdG9yXHRhcmdldFxXU1NpbXVsYXRvci53YXIgdG8geW91ciBsb2NhbGhvc3QgdmFncmFudCBtYWNoaW5lOiAvaG9tZS92YWdyYW50L3dlYnNlYWwtc2ltdWxhdG9yL3dlYmFwcHMgZm9sZGVyCiszLiBGdHAgY29uZmlndXJhdGlvbiBmaWxlOiB3ZWJzZWFsLXNpbXVsYXRvclxzcmNcbWFpblxyZXNvdXJjZXNcd2Vic2VhbC5jb25mIHRvIHlvdXIgbG9jYWxob3N0IHZhZ3JhbnQgbWFjaGluZTogL2hvbWUvdmFncmFudC93ZWJzZWFsLXNpbXVsYXRvci9jb25maWcKKzQuIFRvIHJ1biB0aGUgc2ltdWxhdG9yLCBlbnRlciB0byB5b3VyIGxvY2FsIHZhZ3JhbnQgYW5kIHJ1bjogc3RhcnRXZWJzZWFsU2ltdWxhdG9yLnNoCis1LiBPcGVuIGJyb3dzZXIgYW5kIG5hdmlnYXRlIHRvOiBodHRwOi8vbG9jYWxob3N0OjgyODUvc2RjMS5sb2dpbgorCitOb3RlOiB0aGUgdXNlciBpbiB3ZWJzZWFsIGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIGFwcGVhciBpbiB0aGUgbG9naW4gc2NyZWVuLiALUHJlc3Npbmcgb24gdXNlciBsaW5rIHdpbGwgcGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgcmVkaXJlY3QgdG8gU0RDLgorVGhlIHVzZXJzIHNob3VsZCBiZSBwcmVkZWZpbmVkIGluIFNEQworCmRpZmYgLS1naXQgYS93ZWJzZWFsLXNpbXVsYXRvci9wb20ueG1sIGIvd2Vic2VhbC1zaW11bGF0b3IvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE4MzMwCi0tLSAvZGV2L251bGwKKysrIGIvd2Vic2VhbC1zaW11bGF0b3IvcG9tLnhtbApAQCAtMCwwICsxLDEyNiBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGdyb3VwSWQ+b3JnLm9wZW5lY29tcC5zZGM8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPndlYnNlYWwtc2ltdWxhdG9yPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICA8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKworPHBhcmVudD4KKzxncm91cElkPm9yZy5vcGVuZWNvbXAuc2RjPC9ncm91cElkPgorPGFydGlmYWN0SWQ+c2RjLW1haW48L2FydGlmYWN0SWQ+Cis8dmVyc2lvbj4xNjEwLjIuNDwvdmVyc2lvbj4KKzwvcGFyZW50PgorCisgIAorICAJPHByb3BlcnRpZXM+CisJCTxqZXR0eS12ZXJzaW9uPjkuMi4xMC52MjAxNTAzMTA8L2pldHR5LXZlcnNpb24+CQorCTwvcHJvcGVydGllcz4KKyAgCisgIAorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuMTI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJPC9kZXBlbmRlbmN5PgorCQorCTxkZXBlbmRlbmN5PgorCSAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPgorCSAgPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgorCSAgPHZlcnNpb24+My4xPC92ZXJzaW9uPgorCTwvZGVwZW5kZW5jeT4KKwkKKwk8ZGVwZW5kZW5jeT4KKyAgICAJPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmctYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KKwk8L2RlcGVuZGVuY3k+CisKKwk8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisJPC9kZXBlbmRlbmN5PgkKKworCQorCQorCTwhLS0gSmV0dHkgUHJveHkgLS0+CisJCisJPGRlcGVuZGVuY3k+CisJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5qZXR0eS13ZWJhcHA8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjkuMi4xMC52MjAxNTAzMTA8L3ZlcnNpb24+CisJCTxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisJPC9kZXBlbmRlbmN5PgorCQorCQorCTxkZXBlbmRlbmN5PgorCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+amV0dHktcHJveHk8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjkuMi4xMC52MjAxNTAzMTA8L3ZlcnNpb24+CQkKKwkJPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorCTwvZGVwZW5kZW5jeT4KKworCTxkZXBlbmRlbmN5PgorCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+amV0dHktc2VydmxldHM8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjkuMi4xMC52MjAxNTAzMTA8L3ZlcnNpb24+CisJCTxzY29wZT5jb21waWxlPC9zY29wZT4KKwk8L2RlcGVuZGVuY3k+CisKKwk8IS0tIFByb3h5IHNlcnZsZXQgLS0+CisJCisJCisJPGRlcGVuZGVuY3k+CisJICA8Z3JvdXBJZD5jb20udHlwZXNhZmU8L2dyb3VwSWQ+CisJICA8YXJ0aWZhY3RJZD5jb25maWc8L2FydGlmYWN0SWQ+CisJICA8dmVyc2lvbj4xLjAuMjwvdmVyc2lvbj4KKwkgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKwk8L2RlcGVuZGVuY3k+CisJCisgIDwvZGVwZW5kZW5jaWVzPgorICA8YnVpbGQ+CisgICAgPGZpbmFsTmFtZT5XU1NpbXVsYXRvcjwvZmluYWxOYW1lPgorICAgIDxwbHVnaW5zPgorICAgIAkJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJCTwhLS0gU2V0IHRoZSBKREsgY29tcGlsZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgLS0+CisJCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgorCQkJCTxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8c291cmNlPjEuODwvc291cmNlPgorCQkJCQk8dGFyZ2V0PjEuODwvdGFyZ2V0PgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorICAgIAorICAgIAorICAgIAk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKwkJCQk8dmVyc2lvbj45LjIuMTAudjIwMTUwMzEwPC92ZXJzaW9uPgkJCQkJCSAKKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorCQkJCQk8d2ViQXBwPgorCQkJCQkJPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorCQkJCQkJPHdlYkluZkluY2x1ZGVKYXJQYXR0ZXJuPi4qLy4qamVyc2V5LVteL11cLmphciQ8L3dlYkluZkluY2x1ZGVKYXJQYXR0ZXJuPgorCQkJCQk8L3dlYkFwcD4KKwkJCQkJPHdhcj5XU1NpbXVsYXRvci53YXI8L3dhcj4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKworICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3dlYnNlYWwtc2ltdWxhdG9yL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvd2Vic2VhbC9zaW11bGF0b3IvTG9naW4uamF2YSBiL3dlYnNlYWwtc2ltdWxhdG9yL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvd2Vic2VhbC9zaW11bGF0b3IvTG9naW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQ1ODI0Ci0tLSAvZGV2L251bGwKKysrIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9Mb2dpbi5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLndlYnNlYWwuc2ltdWxhdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMud2Vic2VhbC5zaW11bGF0b3IuY29uZi5Db25mOworCitwdWJsaWMgY2xhc3MgTG9naW4gZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwkJc3VwZXIuaW5pdChjb25maWcpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvR2V0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworCQlpZiAobnVsbCAhPSByZXF1ZXN0LmdldFBhcmFtZXRlcigidXNlcklkIikpIHsKKwkJCWRvUG9zdChyZXF1ZXN0LCByZXNwb25zZSk7CisJCQlyZXR1cm47CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJhYm91dCB0byBidWlsZCBsb2dpbiBwYWdlIik7CisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKwkJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisJCVN0cmluZyBtZXNzYWdlID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKTsKKwkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworCQkJbWVzc2FnZSA9ICIiOworCQl9CisKKwkJQ29sbGVjdGlvbjxVc2VyPiBhbGxVc2VycyA9IENvbmYuZ2V0SW5zdGFuY2UoKS5nZXRVc2VycygpLnZhbHVlcygpOworCQl3cml0ZXIucHJpbnRsbigiPGh0bWw+Iik7CisJCQorCQl3cml0ZXIucHJpbnRsbigiPGhlYWQ+Iik7CisJCXdyaXRlci5wcmludGxuKCI8c3R5bGU+Iik7CisJCXdyaXRlci5wcmludGxuKCJib2R5IHtwYWRkaW5nOiA0MHB4OyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogMTRweDt9Iik7CisJCXdyaXRlci5wcmludGxuKCJoMSB7YmFja2dyb3VuZC1jb2xvcjogI0RERERERDsgcGFkZGluZzogNHB4IDEwcHg7fSIpOworCQl3cml0ZXIucHJpbnRsbigiaDIge21hcmdpbi10b3A6IDIwcHg7fSIpOworCQl3cml0ZXIucHJpbnRsbigiLmxhYmVsIHt3aWR0aDogMTAwcHg7IGZsb2F0OmxlZnQ7fSIpOworCQl3cml0ZXIucHJpbnRsbigiLmJyZWFrIHtkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogMTBweDt9Iik7CisJCXdyaXRlci5wcmludGxuKCJsaSB7bWFyZ2luLWJvdHRvbTogMTBweDt9Iik7CisJCXdyaXRlci5wcmludGxuKCI8L3N0eWxlPiIpOworCQl3cml0ZXIucHJpbnRsbigiPC9oZWFkPiIpOworCQkKKwkJd3JpdGVyLnByaW50bG4oIjxib2R5PiIpOworCQkKKwkJd3JpdGVyLnByaW50bG4oIjxoMT5XZWJzZWFsIHNpbXVsYXRvcjwvaDE+Iik7CisJCXdyaXRlci5wcmludGxuKCI8aDI+TG9naW46PC9oMj4iKTsKKwkJCisJCXdyaXRlci5wcmludGxuKCI8Zm9ybSBhY3Rpb249XCJcIiBtZXRob2Q9XCJwb3N0XCI+Iik7CisJCXdyaXRlci5wcmludGxuKCIgIDxkaXYgY2xhc3M9J2xhYmVsJz5Vc2VyIGlkOjwvZGl2PiIpOworCQl3cml0ZXIucHJpbnRsbigiICA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndXNlcklkJz4iKTsKKwkJd3JpdGVyLnByaW50bG4oIiAgPGRpdiBjbGFzcz0nYnJlYWsnPjwvZGl2PiIpOworCQkKKwkJd3JpdGVyLnByaW50bG4oIiAgPGRpdiBjbGFzcz0nbGFiZWwnPlBhc3N3b3JkOjwvZGl2PiIpOworCQl3cml0ZXIucHJpbnRsbigiICA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIG5hbWU9J3Bhc3N3b3JkJz4iKTsKKwkJd3JpdGVyLnByaW50bG4oIiAgPGRpdiBjbGFzcz0nYnJlYWsnPjwvZGl2PiIpOworCQkKKwkJd3JpdGVyLnByaW50bG4oIiAgPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0xvZ2luJz4iKTsKKwkJd3JpdGVyLnByaW50bG4oIiAgPGxhYmVsIG5hbWU9J21lc3NhZ2UnPjwvbGFiZWw+Iik7CisJCXdyaXRlci5wcmludGxuKCI8L2Zvcm0+Iik7CisJCQorCQl3cml0ZXIucHJpbnRsbigiPGhyLz4iKTsKKwkJd3JpdGVyLnByaW50bG4oIjxoMj5RdWljayBsaW5rczo8L2gyPiIpOworCQl3cml0ZXIucHJpbnRsbigiPHVsPiIpOworCQlhbGxVc2Vycy5mb3JFYWNoKHUgLT4gd3JpdGVyLnByaW50bG4oIjxsaT4iICsgdS5nZXRVc2VyUmVmKCkgKyAiICgiICsgdS5nZXRVc2VySWQoKSArICIpIiArICI8L2xpPiIpKTsKKwkJd3JpdGVyLnByaW50bG4oIjwvdWw+Iik7CQorCisJCXdyaXRlci5wcmludGxuKCI8L2JvZHk+Iik7CisJCXdyaXRlci5wcmludGxuKCI8L2h0bWw+Iik7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ1c2VySWQiKTsKKwkJU3RyaW5nIHBhc3N3b3JkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhc3N3b3JkIik7CisJCXJlcXVlc3Quc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgIk9LIik7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJMb2dpbiAtPiBkb1BPc3QgdXNlcklkPSIgKyB1c2VySWQpOworCQlVc2VyIHVzZXIgPSBnZXRVc2VyKHVzZXJJZCwgcGFzc3dvcmQpOworCQlpZiAodXNlciA9PSBudWxsKSB7CisJCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsICJFUlJPUjogYXR0dWlkIG9yIHBhc3N3b3JkIGluY29yZWN0Iik7CisJCQlkb0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisJCX0gZWxzZSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2luIC0+IGRvUE9zdCByZWRpcmV4dCB0byAvc2RjMSAodG8gcHJveHkpIik7CisJCQlDb29raWUgY29va2llVXNlciA9IG5ldyBDb29raWUoIkhUVFBfSVZfVVNFUiIsIHVzZXIuZ2V0VXNlcklkKCkpOworCQkJQ29va2llIGNvb2tpZUF0dHVpZCA9IG5ldyBDb29raWUoIlVTRVJfSUQiLCB1c2VyLmdldFVzZXJJZCgpKTsKKwkJCUNvb2tpZSBjb29raWVGaXJzdE5hbWUgPSBuZXcgQ29va2llKCJIVFRQX0NTUF9GSVJTVE5BTUUiLCB1c2VyLmdldEZpcnN0TmFtZSgpKTsKKwkJCUNvb2tpZSBjb29raWVFbWFpbCA9IG5ldyBDb29raWUoIkhUVFBfQ1NQX0VNQUlMIiwgdXNlci5nZXRFbWFpbCgpKTsKKwkJCUNvb2tpZSBjb29raWVMYXN0TmFtZSA9IG5ldyBDb29raWUoIkhUVFBfQ1NQX0xBU1ROQU1FIiwgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJCUNvb2tpZSBjb29raWVSZW1vdGVBZGRyZXNzID0gbmV3IENvb2tpZSgiSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIsICIwLjAuMC4wIik7CisJCQlDb29raWUgY29va2llV3NUeXBlID0gbmV3IENvb2tpZSgiSFRUUF9DU1BfV1NUWVBFIiwgIkludHJhbmV0Iik7CisJCQlyZXNwb25zZS5hZGRDb29raWUoY29va2llVXNlcik7CisJCQlyZXNwb25zZS5hZGRDb29raWUoY29va2llQXR0dWlkKTsKKwkJCXJlc3BvbnNlLmFkZENvb2tpZShjb29raWVGaXJzdE5hbWUpOworCQkJcmVzcG9uc2UuYWRkQ29va2llKGNvb2tpZUVtYWlsKTsKKwkJCXJlc3BvbnNlLmFkZENvb2tpZShjb29raWVMYXN0TmFtZSk7CisJCQlyZXNwb25zZS5hZGRDb29raWUoY29va2llUmVtb3RlQWRkcmVzcyk7CisJCQlyZXNwb25zZS5hZGRDb29raWUoY29va2llV3NUeXBlKTsKKwkJCXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiL3NkYzEiKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBVc2VyIGdldFVzZXIoU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHBhc3N3b3JkKSB7CisJCVVzZXIgdXNlciA9IENvbmYuZ2V0SW5zdGFuY2UoKS5nZXRVc2VycygpLmdldCh1c2VySWQpOworCQlpZiAodXNlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIXBhc3N3b3JkLmVxdWFscyh1c2VyLmdldFBhc3N3b3JkKCkpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdXNlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRJbmZvKCkgeworCQlyZXR1cm4gIkh0dHAgUHJveHkgU2VydmxldCI7CisJfQorfQpkaWZmIC0tZ2l0IGEvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9NZXRob2RFbnVtLmphdmEgYi93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3dlYnNlYWwvc2ltdWxhdG9yL01ldGhvZEVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjliMDFkCi0tLSAvZGV2L251bGwKKysrIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9NZXRob2RFbnVtLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy53ZWJzZWFsLnNpbXVsYXRvcjsKKworcHVibGljIGVudW0gTWV0aG9kRW51bSB7CisJCisJR0VULAorCVBPU1QsCisJUFVULAorCURFTEVURQorCit9CmRpZmYgLS1naXQgYS93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3dlYnNlYWwvc2ltdWxhdG9yL011dGFibGVIdHRwU2VydmxldFJlcXVlc3QuamF2YSBiL3dlYnNlYWwtc2ltdWxhdG9yL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvd2Vic2VhbC9zaW11bGF0b3IvTXV0YWJsZUh0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YzhhMTUKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3dlYnNlYWwvc2ltdWxhdG9yL011dGFibGVIdHRwU2VydmxldFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIG9yZy5vcGVuZWNvbXAuc2RjLndlYnNlYWwuc2ltdWxhdG9yOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNdXRhYmxlSHR0cFNlcnZsZXRSZXF1ZXN0IGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7CisJLy8gaG9sZHMgY3VzdG9tIGhlYWRlciBhbmQgdmFsdWUgbWFwcGluZworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjdXN0b21IZWFkZXJzOworCisJcHVibGljIE11dGFibGVIdHRwU2VydmxldFJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpeworCQlzdXBlcihyZXF1ZXN0KTsKKwkJdGhpcy5jdXN0b21IZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHB1dEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKXsKKwkJdGhpcy5jdXN0b21IZWFkZXJzLnB1dChuYW1lLCB2YWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKwkJLy8gY2hlY2sgdGhlIGN1c3RvbSBoZWFkZXJzIGZpcnN0CisJCVN0cmluZyBoZWFkZXJWYWx1ZSA9IGN1c3RvbUhlYWRlcnMuZ2V0KG5hbWUpOworCQkKKwkJaWYgKGhlYWRlclZhbHVlICE9IG51bGwpeworCQkJcmV0dXJuIGhlYWRlclZhbHVlOworCQl9CisJCS8vIGVsc2UgcmV0dXJuIGZyb20gaW50byB0aGUgb3JpZ2luYWwgd3JhcHBlZCBvYmplY3QKKwkJcmV0dXJuICgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldEhlYWRlcihuYW1lKTsKKwl9CisKKwlwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRIZWFkZXJOYW1lcygpIHsKKwkJLy8gY3JlYXRlIGEgc2V0IG9mIHRoZSBjdXN0b20gaGVhZGVyIG5hbWVzCisJCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oY3VzdG9tSGVhZGVycy5rZXlTZXQoKSk7CisJCQorCQkvLyBub3cgYWRkIHRoZSBoZWFkZXJzIGZyb20gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUVudW1lcmF0aW9uPFN0cmluZz4gZSA9ICgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldEhlYWRlck5hbWVzKCk7CisJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkvLyBhZGQgdGhlIG5hbWVzIG9mIHRoZSByZXF1ZXN0IGhlYWRlcnMgaW50byB0aGUgbGlzdAorCQkJU3RyaW5nIG4gPSBlLm5leHRFbGVtZW50KCk7CisJCQlzZXQuYWRkKG4pOworCQl9CisKKwkJLy8gY3JlYXRlIGFuIGVudW1lcmF0aW9uIGZyb20gdGhlIHNldCBhbmQgcmV0dXJuCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihzZXQpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9TZGNQcm94eS5qYXZhIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9TZGNQcm94eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NGYzOWYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3dlYnNlYWwvc2ltdWxhdG9yL1NkY1Byb3h5LmphdmEKQEAgLTAsMCArMSwzMTggQEAKK3BhY2thZ2Ugb3JnLm9wZW5lY29tcC5zZGMud2Vic2VhbC5zaW11bGF0b3I7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkRlbGV0ZU1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkdldE1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLklucHV0U3RyZWFtUmVxdWVzdEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlBvc3RNZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5QdXRNZXRob2Q7CitpbXBvcnQgb3JnLm9wZW5lY29tcC5zZGMud2Vic2VhbC5zaW11bGF0b3IuY29uZi5Db25mOworCitwdWJsaWMgY2xhc3MgU2RjUHJveHkgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwlwcml2YXRlIFVSTCB1cmw7CisJcHJpdmF0ZSBIdHRwQ2xpZW50IHByb3h5OworCXByaXZhdGUgQ29uZiBjb25mOworCQorCXByaXZhdGUgZmluYWwgU3RyaW5nIFNEQzEgPSAiL3NkYzEiOworCXByaXZhdGUgZmluYWwgU3RyaW5nIE9OQk9BUkRJTkcgPSAiL29uYm9hcmRpbmcvIjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBTQ1JJUFRTID0gIi9zY3JpcHRzIjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBTVFlMRVMgPSAiL3N0eWxlcyI7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTEFOR1VBR0VTID0gIi9sYW5ndWFnZXMiOworCQorCisJcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCQlzdXBlci5pbml0KGNvbmZpZyk7CisJCWNvbmYgPSBDb25mLmdldEluc3RhbmNlKCk7CisJCXRyeSB7CisJCQlTdHJpbmcgZmVIb3N0ID0gY29uZi5nZXRGZUhvc3QoKTsKKwkJCXRoaXMudXJsID0gbmV3IFVSTChmZUhvc3QpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKKwkJCXRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJQcm94eSBVUkwgaXMgaW52YWxpZCIsIG1lKTsKKwkJfQorCQl0aGlzLnByb3h5ID0gbmV3IEh0dHBDbGllbnQoKTsKKwkJdGhpcy5wcm94eS5nZXRIb3N0Q29uZmlndXJhdGlvbigpLnNldEhvc3QodGhpcy51cmwuZ2V0SG9zdCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJcHJveHkocmVxdWVzdCwgcmVzcG9uc2UsIE1ldGhvZEVudW0uR0VUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHVzZXJJZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ1c2VySWQiKTsKKwkJU3RyaW5nIHBhc3N3b3JkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhc3N3b3JkIik7CisKKwkJLy8gQWxyZWFkeSBzaWduLWluCisJCWlmICh1c2VySWQgPT0gbnVsbCl7CisJCQl1c2VySWQgPSByZXF1ZXN0LmdldEhlYWRlcigiVVNFUl9JRCIpOworCQl9CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCJTZGNQcm94eSAtPiBkb1Bvc3QgdXNlcklkPSIgKyB1c2VySWQpOworCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsICJPSyIpOworCQlpZiAocGFzc3dvcmQgIT0gbnVsbCAmJiBnZXRVc2VyKHVzZXJJZCwgcGFzc3dvcmQpID09IG51bGwpIHsKKwkJCU11dGFibGVIdHRwU2VydmxldFJlcXVlc3QgbXV0YWJsZVJlcXVlc3QgPSBuZXcgTXV0YWJsZUh0dHBTZXJ2bGV0UmVxdWVzdChyZXF1ZXN0KTsKKwkJCVJlcXVlc3REaXNwYXRjaGVyIHZpZXcgPSByZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKCJsb2dpbiIpOworCQkJcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCAiRVJST1I6IHVzZXJpZCBvciBwYXNzd29yZCBpbmNvcmVjdCIpOworCQkJdmlldy5mb3J3YXJkKG11dGFibGVSZXF1ZXN0LCByZXNwb25zZSk7CisJCX0gZWxzZSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNkY1Byb3h5IC0+IGRvUG9zdCBnb2luZyB0byBkb0dldCIpOworCQkJcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIkhUVFBfSVZfVVNFUiIsIHVzZXJJZCk7CisJCQlwcm94eShyZXF1ZXN0LCByZXNwb25zZSwgTWV0aG9kRW51bS5QT1NUKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGRvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlwcm94eShyZXF1ZXN0LCByZXNwb25zZSwgTWV0aG9kRW51bS5QVVQpOworCX0KKworCXB1YmxpYyB2b2lkIGRvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlwcm94eShyZXF1ZXN0LCByZXNwb25zZSwgTWV0aG9kRW51bS5ERUxFVEUpOworCX0KKworCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcHJveHkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIE1ldGhvZEVudW0gbWV0aG9kRW51bSkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBIdHRwRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nW10+IHJlcXVlc3RQYXJhbWV0ZXJzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJNYXAoKTsKKwkJU3lzdGVtLm91dC5wcmludChyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSArICIgLT4gIik7CisKKwkJU3RyaW5nIHVzZXJJZEhlYWRlciA9IGdldFVzZXJpZEZyb21SZXF1ZXN0KHJlcXVlc3QpOworCQkvL1N5c3RlbS5vdXQucHJpbnQoIiAodXNlcklkSGVhZGVyPSIgKyB1c2VySWRIZWFkZXIgKyAiKSAiKTsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcih1c2VySWRIZWFkZXIpOworCisJCS8vIG5ldyByZXF1ZXN0IC0gZm9yd2FyZCB0byBsb2dpbiBwYWdlCisJCWlmICh1c2VySWRIZWFkZXIgPT0gbnVsbCkgeworCQkJU3lzdGVtLm91dC5wcmludCgiR29pbmcgdG8gbG9naW4iKTsKKwkJCXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiL2xvZ2luIik7CisJCQlyZXR1cm47CisJCX0KKworCQlTdHJpbmcgdXJpID0gZ2V0VXJpKHJlcXVlc3QsIHJlcXVlc3RQYXJhbWV0ZXJzKTsKKwkJSHR0cE1ldGhvZEJhc2UgcHJveHlNZXRob2QgPSBnZXRNZXRob2QocmVxdWVzdCwgbWV0aG9kRW51bSwgdXJpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHVyaSk7CisJCWFkZEhlYWRlcnModXNlciwgcHJveHlNZXRob2QpOworCQlhZGRIZWFkZXJzKHJlcXVlc3QsIHByb3h5TWV0aG9kKTsKKwkJdGhpcy5wcm94eS5leGVjdXRlTWV0aG9kKHByb3h5TWV0aG9kKTsKKwkJcmVzcG9uc2Uuc2V0U3RhdHVzKHByb3h5TWV0aG9kLmdldFN0YXR1c0NvZGUoKSk7CisJCQorCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuaW5kZXhPZigiLnN2ZyIpID4gLTEpIHsKKwkJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJpbWFnZS9zdmcreG1sIik7CisJCX0KKwkJCisJCUlucHV0U3RyZWFtIHJlc3BvbnNlQm9keVN0cmVhbSA9IHByb3h5TWV0aG9kLmdldFJlc3BvbnNlQm9keUFzU3RyZWFtKCk7CisJCUhlYWRlciBjb250ZW50RW5jb2RpbmdIZWFkZXIgPSBwcm94eU1ldGhvZC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpOworCQlpZiAoY29udGVudEVuY29kaW5nSGVhZGVyICE9IG51bGwgJiYgY29udGVudEVuY29kaW5nSGVhZGVyLmdldFZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZSgiZ3ppcCIpKSB7CisJCQlyZXNwb25zZUJvZHlTdHJlYW0gPSBuZXcgR1pJUElucHV0U3RyZWFtKHJlc3BvbnNlQm9keVN0cmVhbSk7CisJCX0KKwkJd3JpdGUocmVzcG9uc2VCb2R5U3RyZWFtLCByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEhlYWRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBNZXRob2RCYXNlIHByb3h5TWV0aG9kKSB7CisJCUVudW1lcmF0aW9uPFN0cmluZz4gaGVhZGVyTmFtZXMgPSByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7CisJCXdoaWxlIChoZWFkZXJOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJU3RyaW5nIGhlYWRlck5hbWUgPSBoZWFkZXJOYW1lcy5uZXh0RWxlbWVudCgpOworCQkJRW51bWVyYXRpb248U3RyaW5nPiBoZWFkZXJzID0gcmVxdWVzdC5nZXRIZWFkZXJzKGhlYWRlck5hbWUpOworCQkJd2hpbGUgKGhlYWRlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQlTdHJpbmcgaGVhZGVyVmFsdWUgPSBoZWFkZXJzLm5leHRFbGVtZW50KCk7CisJCQkJcHJveHlNZXRob2QuYWRkUmVxdWVzdEhlYWRlcihoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIFVzZXIgZ2V0VXNlcihTdHJpbmcgdXNlcklkLCBTdHJpbmcgcGFzc3dvcmQpIHsKKwkJVXNlciB1c2VyID0gZ2V0VXNlcih1c2VySWQpOworCQlpZiAodXNlci5nZXRQYXNzd29yZCgpLmVxdWFscyhwYXNzd29yZCkpIHsKKwkJCXJldHVybiB1c2VyOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgVXNlciBnZXRVc2VyKFN0cmluZyB1c2VySWQpIHsKKwkJcmV0dXJuIGNvbmYuZ2V0VXNlcnMoKS5nZXQodXNlcklkKTsKKworCX0KKwkKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRDb250ZXh0UGF0aHMoKXsKKwkJIExpc3Q8U3RyaW5nPiBjb250ZXh0UGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJIGNvbnRleHRQYXRocy5hZGQoU0RDMSk7CisJCSBjb250ZXh0UGF0aHMuYWRkKE9OQk9BUkRJTkcpOworCQkgY29udGV4dFBhdGhzLmFkZChTVFlMRVMpOworCQkgY29udGV4dFBhdGhzLmFkZChTQ1JJUFRTKTsKKwkJIGNvbnRleHRQYXRocy5hZGQoTEFOR1VBR0VTKTsKKwkJIHJldHVybiBjb250ZXh0UGF0aHM7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VXJpKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcmVxdWVzdFBhcmFtZXRlcnMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHN1ZmZpeCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCQlpZiAoZ2V0Q29udGV4dFBhdGhzKCkuc3RyZWFtKCkuYW55TWF0Y2gocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk6OmNvbnRhaW5zKSkJeworCQkJc3VmZml4ID0gYWxpZ25VcmxQcm94eShzdWZmaXgpOworCQl9CisJCVN0cmluZ0J1aWxkZXIgcXVlcnkgPSBhbGlnblVybFBhcmFtZXRlcnMocmVxdWVzdFBhcmFtZXRlcnMpOworCQlTdHJpbmcgdXJpID0gU3RyaW5nLmZvcm1hdCgiJXMlcyIsIG5ldyBPYmplY3RbXSB7dGhpcy51cmwudG9TdHJpbmcoKSArIHN1ZmZpeCwgcXVlcnkudG9TdHJpbmcoKSB9KTsKKwkJcmV0dXJuIHVyaTsKKwl9CisKKwlwcml2YXRlIEh0dHBNZXRob2RCYXNlIGdldE1ldGhvZChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgTWV0aG9kRW51bSBtZXRob2RFbnVtLCBTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlIdHRwTWV0aG9kQmFzZSBwcm94eU1ldGhvZCA9IG51bGw7CisJCXN3aXRjaCAobWV0aG9kRW51bSkgeworCQljYXNlIEdFVDoKKwkJCXByb3h5TWV0aG9kID0gbmV3IEdldE1ldGhvZCh1cmkpOworCQkJYnJlYWs7CisJCWNhc2UgUE9TVDoKKwkJCXByb3h5TWV0aG9kID0gbmV3IFBvc3RNZXRob2QodXJpKTsKKwkJCSgoUG9zdE1ldGhvZCkgcHJveHlNZXRob2QpLnNldFJlcXVlc3RFbnRpdHkobmV3IElucHV0U3RyZWFtUmVxdWVzdEVudGl0eShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpKTsKKwkJCWJyZWFrOworCQljYXNlIFBVVDoKKwkJCXByb3h5TWV0aG9kID0gbmV3IFB1dE1ldGhvZCh1cmkpOworCQkJKChQdXRNZXRob2QpIHByb3h5TWV0aG9kKS5zZXRSZXF1ZXN0Qm9keShnZXRCb2R5KHJlcXVlc3QpKTsKKwkJCWJyZWFrOworCQljYXNlIERFTEVURToKKwkJCXByb3h5TWV0aG9kID0gbmV3IERlbGV0ZU1ldGhvZCh1cmkpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHByb3h5TWV0aG9kOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFVzZXJpZEZyb21SZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKwkJU3RyaW5nIHVzZXJJZEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJVU0VSX0lEIik7CisJCWlmICh1c2VySWRIZWFkZXIgIT0gbnVsbCl7CisJCQlyZXR1cm4gdXNlcklkSGVhZGVyOworCQl9CisJCU9iamVjdCBvID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkhUVFBfSVZfVVNFUiIpOworCQlpZiAobyAhPSBudWxsKSB7CisJCQlyZXR1cm4gby50b1N0cmluZygpOworCQl9CisJCUNvb2tpZVtdIGNvb2tpZXMgPSByZXF1ZXN0LmdldENvb2tpZXMoKTsKKworCQlpZiAoY29va2llcyAhPSBudWxsKXsKKwkJCWZvciAoaW50IGk9MDsgaTxjb29raWVzLmxlbmd0aDsgKytpKXsKKwkJCQlpZiAoY29va2llc1tpXS5nZXROYW1lKCkuZXF1YWxzKCJVU0VSX0lEIikpeworCQkJCQl1c2VySWRIZWFkZXIgPSBjb29raWVzW2ldLmdldFZhbHVlKCk7IAorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdXNlcklkSGVhZGVyOworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkSGVhZGVycyhVc2VyIHVzZXIsIEh0dHBNZXRob2RCYXNlIHByb3h5TWV0aG9kKSB7CisJCXByb3h5TWV0aG9kLmFkZFJlcXVlc3RIZWFkZXIoIkhUVFBfSVZfVVNFUiIsIHVzZXIuZ2V0VXNlcklkKCkpOworCQlwcm94eU1ldGhvZC5hZGRSZXF1ZXN0SGVhZGVyKCJVU0VSX0lEIiwgdXNlci5nZXRVc2VySWQoKSk7CisJCXByb3h5TWV0aG9kLmFkZFJlcXVlc3RIZWFkZXIoIkhUVFBfQ1NQX0ZJUlNUTkFNRSIsIHVzZXIuZ2V0Rmlyc3ROYW1lKCkpOworCQlwcm94eU1ldGhvZC5hZGRSZXF1ZXN0SGVhZGVyKCJIVFRQX0NTUF9FTUFJTCIsIHVzZXIuZ2V0RW1haWwoKSk7CisJCXByb3h5TWV0aG9kLmFkZFJlcXVlc3RIZWFkZXIoIkhUVFBfQ1NQX0xBU1ROQU1FIiwgdXNlci5nZXRMYXN0TmFtZSgpKTsKKwkJcHJveHlNZXRob2QuYWRkUmVxdWVzdEhlYWRlcigiSFRUUF9JVl9SRU1PVEVfQUREUkVTUyIsICIwLjAuMC4wIik7CisJCXByb3h5TWV0aG9kLmFkZFJlcXVlc3RIZWFkZXIoIkhUVFBfQ1NQX1dTVFlQRSIsICJJbnRyYW5ldCIpOworCQlwcm94eU1ldGhvZC5hZGRSZXF1ZXN0SGVhZGVyKCJIVFRQX0NTUF9FTUFJTCIsICJtZUBtYWlsLmNvbSIpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGFsaWduVXJsUHJveHkoU3RyaW5nIHJlcXVlc3RVUkkpIHsKKwkJCisJCWludCBpID0gcmVxdWVzdFVSSS5pbmRleE9mKE9OQk9BUkRJTkcpOworCQlpZiAoLTEgIT0gaSl7CisJCQlyZXR1cm4gcmVxdWVzdFVSSS5zdWJzdHJpbmcoaSk7CisJCX0KKwkJCisJCWkgPSByZXF1ZXN0VVJJLmluZGV4T2YoU0RDMStTREMxKTsKKwkJaWYgKC0xICE9IGkpeworCQkJcmV0dXJuIHJlcXVlc3RVUkkuc3Vic3RyaW5nKFNEQzEubGVuZ3RoKCkpOworCQl9CisJCQorCQlpID0gcmVxdWVzdFVSSS5pbmRleE9mKFNEQzEpOworCQlpZiAoLTEgIT0gaSl7CisJCQlyZXR1cm4gcmVxdWVzdFVSSTsKKwkJfQorCQkKKwkJcmV0dXJuIFNEQzErcmVxdWVzdFVSSTsKKwl9CisKKwlwcml2YXRlIFN0cmluZ0J1aWxkZXIgYWxpZ25VcmxQYXJhbWV0ZXJzKE1hcDxTdHJpbmcsIFN0cmluZ1tdPiByZXF1ZXN0UGFyYW1ldGVycykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCQlTdHJpbmdCdWlsZGVyIHF1ZXJ5ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IHJlcXVlc3RQYXJhbWV0ZXJzLmtleVNldCgpKSB7CisJCQlmb3IgKFN0cmluZyB2YWx1ZSA6IChTdHJpbmdbXSkgcmVxdWVzdFBhcmFtZXRlcnMuZ2V0KG5hbWUpKSB7CisJCQkJaWYgKHF1ZXJ5Lmxlbmd0aCgpID09IDApIHsKKwkJCQkJcXVlcnkuYXBwZW5kKCI/Iik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcXVlcnkuYXBwZW5kKCImIik7CisJCQkJfQorCQkJCW5hbWUgPSBVUkxFbmNvZGVyLmVuY29kZShuYW1lLCAiVVRGLTgiKTsKKwkJCQl2YWx1ZSA9IFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlLCAiVVRGLTgiKTsKKworCQkJCXF1ZXJ5LmFwcGVuZChTdHJpbmcuZm9ybWF0KCImJXM9JXMiLCBuZXcgT2JqZWN0W10geyBuYW1lLCB2YWx1ZSB9KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHF1ZXJ5OworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IGI7CisJCXdoaWxlIChpbnB1dFN0cmVhbSAhPSBudWxsICYmIChiID0gaW5wdXRTdHJlYW0ucmVhZCgpKSAhPSAtMSkgeworCQkJb3V0cHV0U3RyZWFtLndyaXRlKGIpOworCQl9CisJCW91dHB1dFN0cmVhbS5mbHVzaCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKSB7CisJCXJldHVybiAiSHR0cCBQcm94eSBTZXJ2bGV0IjsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRCb2R5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCVN0cmluZyBib2R5ID0gbnVsbDsKKwkJU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBudWxsOworCisJCXRyeSB7CisJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisJCQkJYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7CisJCQkJY2hhcltdIGNoYXJCdWZmZXIgPSBuZXcgY2hhclsxMjhdOworCQkJCWludCBieXRlc1JlYWQgPSAtMTsKKwkJCQl3aGlsZSAoKGJ5dGVzUmVhZCA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWQoY2hhckJ1ZmZlcikpID4gMCkgeworCQkJCQlzdHJpbmdCdWlsZGVyLmFwcGVuZChjaGFyQnVmZmVyLCAwLCBieXRlc1JlYWQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3RyaW5nQnVpbGRlci5hcHBlbmQoIiIpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgZXg7CisJCX0gZmluYWxseSB7CisJCQlpZiAoYnVmZmVyZWRSZWFkZXIgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWJ1ZmZlcmVkUmVhZGVyLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCQkJdGhyb3cgZXg7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYm9keSA9IHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGJvZHk7CisJfQorfQpkaWZmIC0tZ2l0IGEvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9Vc2VyLmphdmEgYi93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZWNvbXAvc2RjL3dlYnNlYWwvc2ltdWxhdG9yL1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMxZDkzCi0tLSAvZGV2L251bGwKKysrIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9Vc2VyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy53ZWJzZWFsLnNpbXVsYXRvcjsKKworcHVibGljIGNsYXNzIFVzZXIgeworCisJcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOworCXByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOworCXByaXZhdGUgU3RyaW5nIGVtYWlsOworCXByaXZhdGUgU3RyaW5nIHVzZXJJZDsKKwkKKwlwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKwkKKwlwdWJsaWMgVXNlcigpewkJCisJfQorCQorCXB1YmxpYyBVc2VyKFN0cmluZyB1c2VySWQpeworCQlzZXRVc2VySWQodXNlcklkKTsKKwl9CisJCisJcHVibGljIFVzZXIoU3RyaW5nIGZpcnN0TmFtZSxTdHJpbmcgbGFzdE5hbWUsU3RyaW5nIGVtYWlsLFN0cmluZyB1c2VySWQsU3RyaW5nIHBhc3N3b3JkKXsKKwkJc2V0VXNlcklkKHVzZXJJZCk7CisJCXNldEZpcnN0TmFtZShmaXJzdE5hbWUpOworCQlzZXRMYXN0TmFtZShsYXN0TmFtZSk7CisJCXNldEVtYWlsKGVtYWlsKTsKKwkJc2V0UGFzc3dvcmQocGFzc3dvcmQpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpIHsKKwkJcmV0dXJuIGZpcnN0TmFtZTsKKwl9CisJcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHsKKwkJdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisJfQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7CisJCXJldHVybiBsYXN0TmFtZTsKKwl9CisJcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKSB7CisJCXRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKKwl9CisJcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKwkJcmV0dXJuIGVtYWlsOworCX0KKwlwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpIHsKKwkJdGhpcy5lbWFpbCA9IGVtYWlsOworCX0KKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJJZCgpIHsKKwkJcmV0dXJuIHVzZXJJZDsKKwl9CisJcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyB1c2VySWQpIHsKKwkJdGhpcy51c2VySWQgPSB1c2VySWQ7CisJfQorCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisJCXJldHVybiBwYXNzd29yZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKwkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJSZWYoKSB7CisJCXJldHVybiAiPGEgaHJlZj0nP3VzZXJJZD0iK2dldFVzZXJJZCgpKyImcGFzc3dvcmQ9IitnZXRQYXNzd29yZCgpKyInPiIrZ2V0Rmlyc3ROYW1lKCkrIiAiK2dldExhc3ROYW1lKCkrIjwvYT4iOworCX0KKworCQorfQpkaWZmIC0tZ2l0IGEvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vamF2YS9vcmcvb3BlbmVjb21wL3NkYy93ZWJzZWFsL3NpbXVsYXRvci9jb25mL0NvbmYuamF2YSBiL3dlYnNlYWwtc2ltdWxhdG9yL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvd2Vic2VhbC9zaW11bGF0b3IvY29uZi9Db25mLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlNzdjNgotLS0gL2Rldi9udWxsCisrKyBiL3dlYnNlYWwtc2ltdWxhdG9yL3NyYy9tYWluL2phdmEvb3JnL29wZW5lY29tcC9zZGMvd2Vic2VhbC9zaW11bGF0b3IvY29uZi9Db25mLmphdmEKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSBvcmcub3BlbmVjb21wLnNkYy53ZWJzZWFsLnNpbXVsYXRvci5jb25mOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcub3BlbmVjb21wLnNkYy53ZWJzZWFsLnNpbXVsYXRvci5Vc2VyOworaW1wb3J0IGNvbS50eXBlc2FmZS5jb25maWcuQ29uZmlnOworaW1wb3J0IGNvbS50eXBlc2FmZS5jb25maWcuQ29uZmlnRmFjdG9yeTsKKworcHVibGljIGNsYXNzIENvbmYgeworCisJcHJpdmF0ZSBzdGF0aWMgQ29uZiBjb25mPSBudWxsOwkJCisJcHJpdmF0ZSBTdHJpbmcgZmVIb3N0OworCU1hcDxTdHJpbmcsVXNlcj4gdXNlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsVXNlcj4oKTsKKwkKKwlwcml2YXRlIENvbmYoKXsJCisJCWluaXRDb25mKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0Q29uZigpIHsKKwkJdHJ5eworCQkJU3RyaW5nIGNvbmZQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJjb25maWcucmVzb3VyY2UiKTsJCQkKKwkJCWlmIChjb25mUGF0aCA9PSBudWxsKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZy5yZXNvdXJjZSBpcyBlbXB0eSAtIGdvaW50IHRvIGdldCBpdCBmcm9tIGNvbmZpZy5ob21lIik7CisJCQkJY29uZlBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbmZpZy5ob21lIikgKyAiL3dlYnNlYWwuY29uZiI7CisJCQl9CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbmZQYXRoPSIgKyBjb25mUGF0aCApOworCQkJQ29uZmlnIGNvbmZGaWxlID0gQ29uZmlnRmFjdG9yeS5wYXJzZUZpbGVBbnlTeW50YXgobmV3IEZpbGUoY29uZlBhdGgpKTsKKwkJCUNvbmZpZyByZXNvbHZlID0gY29uZkZpbGUucmVzb2x2ZSgpOwkJCisJCQlzZXRGZUhvc3QocmVzb2x2ZS5nZXRTdHJpbmcoIndlYnNlYWwuZmUiKSk7CisJCQlMaXN0PD8gZXh0ZW5kcyBDb25maWc+IGxpc3QgPSByZXNvbHZlLmdldENvbmZpZ0xpc3QoIndlYnNlYWwudXNlcnMiKTsJCQkKKwkJCWZvciAoQ29uZmlnIGNvbmYgOiBsaXN0ICApeworCQkJCVN0cmluZyB1c2VySWQgPSBjb25mLmdldFN0cmluZygidXNlcklkIik7CisJCQkJU3RyaW5nIHBhc3N3b3JkID0gY29uZi5nZXRTdHJpbmcoInBhc3N3b3JkIik7CisJCQkJU3RyaW5nIGZpcnN0TmFtZSA9IGNvbmYuZ2V0U3RyaW5nKCJmaXJzdE5hbWUiKTsKKwkJCQlTdHJpbmcgbGFzdE5hbWUgPSBjb25mLmdldFN0cmluZygibGFzdE5hbWUiKTsKKwkJCQlTdHJpbmcgZW1haWwgPSBjb25mLmdldFN0cmluZygiZW1haWwiKTsKKwkJCQl1c2Vycy5wdXQodXNlcklkLG5ldyBVc2VyKGZpcnN0TmFtZSxsYXN0TmFtZSxlbWFpbCx1c2VySWQscGFzc3dvcmQpKTsJCQkJCisJCQl9CisJCQkJCQorCQl9Y2F0Y2goRXhjZXB0aW9uIGUpeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgQ29uZiBnZXRJbnN0YW5jZSgpeworCQlpZiAoY29uZiA9PSBudWxsKXsKKwkJCWNvbmYgPSBuZXcgQ29uZigpOworCQl9CisJCXJldHVybiBjb25mOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RmVIb3N0KCkgeworCQlyZXR1cm4gZmVIb3N0OworCX0KKworCXB1YmxpYyB2b2lkIHNldEZlSG9zdChTdHJpbmcgZmVIb3N0KSB7CisJCXRoaXMuZmVIb3N0ID0gZmVIb3N0OworCX0KKwkKKwlwdWJsaWMgTWFwPFN0cmluZyxVc2VyPiBnZXRVc2VycygpIHsKKwkJcmV0dXJuIHVzZXJzOworCX0JCisJCit9CmRpZmYgLS1naXQgYS93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvd2Vic2VhbC5jb25mIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3dlYnNlYWwuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjY0NTUyCi0tLSAvZGV2L251bGwKKysrIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3dlYnNlYWwuY29uZgpAQCAtMCwwICsxLDY0IEBACit7CisJd2Vic2VhbCB7CisJCWZlPSJodHRwOi8vbG9jYWxob3N0OjgxODEiCisJCXVzZXJzID0gWworCQkJeworCQkJCXVzZXJJZD0iY3MwMDA4IgorCQkJCXBhc3N3b3JkPSIxMjMxMjNhIgorCQkJCWZpcnN0TmFtZT0iQ2FybG9zIgorCQkJCWxhc3ROYW1lPSJTYW50YW5hIgorCQkJCWVtYWlsPSJjc2FudGFuYUBhdHQuY29tIgkJCQorCQkJfSwKKwkJCXsKKwkJCQl1c2VySWQ9ImFmMDAwNiIKKwkJCQlwYXNzd29yZD0iMTIzMTIzYSIKKwkJCQlmaXJzdE5hbWU9IkFyZXRoYSIKKwkJCQlsYXN0TmFtZT0iRnJhbmtsaW4iCisJCQkJZW1haWw9ImFmcmFua2xpbkBhdHQuY29tIgkJCQorCQkJfSwKKwkJCXsKKwkJCQl1c2VySWQ9ImpoMDAwMyIKKwkJCQlwYXNzd29yZD0iMTIzMTIzYSIKKwkJCQlmaXJzdE5hbWU9IkppbW15IgorCQkJCWxhc3ROYW1lPSJIZW5kcml4IgorCQkJCWVtYWlsPSJhZG1pbkBzZGMuY29tIgorCQkJfSwKKwkJCXsKKwkJCQl1c2VySWQ9ImtiMDAwNCIKKwkJCQlwYXNzd29yZD0iMTIzMTIzYSIKKwkJCQlmaXJzdE5hbWU9IkthdGUiCisJCQkJbGFzdE5hbWU9IkJ1c2giCisJCQkJZW1haWw9InRlc3RlckBzZGMuY29tIgorCQkJfSwKKwkJCXsKKwkJCQl1c2VySWQ9Im9wMDAwMSIKKwkJCQlwYXNzd29yZD0iMTIzMTIzYSIKKwkJCQlmaXJzdE5hbWU9IlN0ZXZlIgorCQkJCWxhc3ROYW1lPSJSZWdldiIKKwkJCQllbWFpbD0ib3BzQHNkYy5jb20iCisJCQl9LAorCQkJeworCQkJCXVzZXJJZD0iZ3YwMDAxIgorCQkJCXBhc3N3b3JkPSIxMjMxMjNhIgorCQkJCWZpcnN0TmFtZT0iRGF2aWQiCisJCQkJbGFzdE5hbWU9IlNoYWRtaSIKKwkJCQllbWFpbD0iZ292ZXJub3JAc2RjLmNvbSIKKwkJCX0sCisJCQl7CisJCQkJdXNlcklkPSJwbTAwMDEiCisJCQkJcGFzc3dvcmQ9IjEyMzEyM2EiCisJCQkJZmlyc3ROYW1lPSJUZWRkeSIKKwkJCQlsYXN0TmFtZT0iSXNhc2hhciIKKwkJCQllbWFpbD0icG0xQHNkYy5jb20iCisJCQl9LAorCQkJeworCQkJCXVzZXJJZD0icHMwMDAxIgorCQkJCXBhc3N3b3JkPSIxMjMxMjNhIgorCQkJCWZpcnN0TmFtZT0iRWRlbiIKKwkJCQlsYXN0TmFtZT0iUm96aW4iCisJCQkJZW1haWw9InBzMUBzZGMuY29tIgorCQkJfQorCQldCisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3dlYnNlYWwtc2ltdWxhdG9yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwgYi93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS13ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjg3YmMKLS0tIC9kZXYvbnVsbAorKysgYi93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS13ZWIueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiAgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgQ29uZmlndXJlIFBVQkxJQyAKKyAgICAiLS8vTW9ydCBCYXkgQ29uc3VsdGluZy8vRFREIENvbmZpZ3VyZS8vRU4iIAorICAgICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pldHR5L2NvbmZpZ3VyZV85XzAuZHRkIj4KKyAKKzxDb25maWd1cmUgY2xhc3M9Im9yZy5lY2xpcHNlLmpldHR5LndlYmFwcC5XZWJBcHBDb250ZXh0Ij4KKyAgICAgPFNldCBuYW1lPSJjb250ZXh0UGF0aCI+LzwvU2V0PgorPC9Db25maWd1cmU+CmRpZmYgLS1naXQgYS93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODczMzVlCi0tLSAvZGV2L251bGwKKysrIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMKKyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgorICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiID4KKworPHdlYi1hcHA+CisKKwk8ZGlzcGxheS1uYW1lPkFyY2hldHlwZSBDcmVhdGVkIFdlYiBBcHBsaWNhdGlvbjwvZGlzcGxheS1uYW1lPgorCisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHk8L3NlcnZsZXQtbmFtZT4KKwkJPHNlcnZsZXQtY2xhc3M+b3JnLm9wZW5lY29tcC5zZGMud2Vic2VhbC5zaW11bGF0b3IuU2RjUHJveHk8L3NlcnZsZXQtY2xhc3M+CisJPC9zZXJ2bGV0PgorCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+UHJveHk8L3NlcnZsZXQtbmFtZT4KKwkJPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKwk8L3NlcnZsZXQtbWFwcGluZz4KKworCTxzZXJ2bGV0PgorCQk8c2VydmxldC1uYW1lPkxvZ2luPC9zZXJ2bGV0LW5hbWU+CisJCTxzZXJ2bGV0LWNsYXNzPm9yZy5vcGVuZWNvbXAuc2RjLndlYnNlYWwuc2ltdWxhdG9yLkxvZ2luPC9zZXJ2bGV0LWNsYXNzPgorCTwvc2VydmxldD4KKwk8c2VydmxldC1tYXBwaW5nPgorCQk8c2VydmxldC1uYW1lPkxvZ2luPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vbG9naW48L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorCQorCTx3ZWxjb21lLWZpbGUtbGlzdD4KKwkJPHdlbGNvbWUtZmlsZT5sb2dpbjwvd2VsY29tZS1maWxlPgorCTwvd2VsY29tZS1maWxlLWxpc3Q+CisKKzwvd2ViLWFwcD4KKwpkaWZmIC0tZ2l0IGEvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vd2ViYXBwL2xvZ2luLmh0bWwgYi93ZWJzZWFsLXNpbXVsYXRvci9zcmMvbWFpbi93ZWJhcHAvbG9naW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzYwZmNmCi0tLSAvZGV2L251bGwKKysrIGIvd2Vic2VhbC1zaW11bGF0b3Ivc3JjL21haW4vd2ViYXBwL2xvZ2luLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+Cis8Ym9keT4KK0xvZ2luCisKKworPGZvcm0gYWN0aW9uPSJhY2Nlc3MiIG1ldGhvZD0icG9zdCI+CisgIEFUVFVJRDo8YnI+CisgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhdHR1aWQiID4KKyAgPGJyPgorICBQQVNTV09SRDo8YnI+CisgIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiID4KKyAgPGJyPjxicj4KKyAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+CisgIAorICA8bGFiZWwgbmFtZT0ibWVzc2FnZSIvPgorPC9mb3JtPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK